[
  {
    "path": ".gitattributes",
    "content": "*.pal text eol=crlf\n\n*.s text eol=lf\n*.txt text eol=lf\nMakefile text eol=lf\n*.mk text eol=lf\n*.c text eol=lf\n*.h text eol=lf\n*.pl text eol=lf\n*.inc text eol=lf\n*.sha1 text eol=lf\n*.sed text eol=lf\n*.sh text eol=lf\n*.json text eol=lf\n.gitignore text eol=lf\n.gitattributes text eol=lf\n*.yml text eol=lf\n*.py text eol=lf\n\n*.png binary\n*.bin binary\n*.pcm binary\n\n*.h linguist-language=C\n*.inc linguist-language=Assembly\n"
  },
  {
    "path": ".github/calcrom/calcrom.pl",
    "content": "#!/usr/bin/perl\n\n# Usage:\n#   calcrom.pl <mapfile> [--verbose][--data]\n#\n#   mapfile: path to .map file output by LD\n#   verbose: set to get more detailed output\n#   data: set to output % breakdown of data\n\nuse IPC::Cmd qw[ run ];\nuse Getopt::Long;\n\nmy $usage = \"Usage: calcrom.pl file.map [--verbose][--data]\\n\";\nmy $verbose = \"\";\nmy $showData;\n\nGetOptions(\"verbose\" => \\$verbose, \"data\" => \\$showData) or die $usage;\n(@ARGV == 1)\n    or die $usage;\nopen(my $file, $ARGV[0])\n    or die \"ERROR: could not open file '$ARGV[0]'.\\n\";\n\nmy $src = 0;\nmy $asm = 0;\nmy $srcdata = 0;\nmy $data = 0;\nmy @pairs = ();\nwhile (my $line = <$file>)\n{\n    if ($line =~ /^ \\.(\\w+)\\s+0x[0-9a-f]+\\s+(0x[0-9a-f]+) (\\w+)\\/(.+)\\.o/)\n    {\n        my $section = $1;\n        my $size = hex($2);\n        my $dir = $3;\n        my $basename = $4;\n        if ($size & 3)\n        {\n            $size += 4 - ($size % 3);\n        }\n\n        if ($section =~ /text/)\n        {\n            if ($dir eq 'src')\n            {\n                $src += $size;\n            }\n            elsif ($dir eq 'asm')\n            {\n                if (!($basename =~ /(crt0|libagbsyscall|libgcnmultiboot|m4a_1)/))\n                {\n                    push @pairs, [$basename, $size];\n                }\n                $asm += $size;\n            }\n        }\n        elsif ($section =~ /rodata/)\n        {\n            if ($dir eq 'src')\n            {\n                $srcdata += $size;\n            }\n            elsif ($dir eq 'data')\n            {\n                $data += $size;\n            }\n        }\n    }\n}\n\nmy @sorted = sort { $a->[1] <=> $b->[1] } @pairs;\n(my $elffname = $ARGV[0]) =~ s/\\.map/.elf/;\n\n# Note that the grep filters out all branch labels. It also requires a minimum\n# line length of 5, to filter out a ton of generated symbols (like AcCn). No\n# settings to nm seem to remove these symbols. Finally, nm prints out a separate\n# entry for whenever a name appears in a file, not just where it's defined. uniq\n# removes all the duplicate entries.\n#\n#\n# You'd expect this to take a while, because of uniq. It runs in under a second,\n# though. Uniq is pretty fast!\nmy $base_cmd = \"nm $elffname | awk '{print \\$3}' | grep '^[^_].\\\\{4\\\\}' | uniq\";\n\n# This looks for Unknown_, Unknown_, or sub_, followed by an address. Note that\n# it matches even if stuff precedes the unknown, like sUnknown/gUnknown.\nmy $undoc_regex = \"'[Uu]nknown_[0-9a-fA-F]\\\\{5,7\\\\}\\\\|sub_[0-9a-fA-F]\\\\{5,7\\\\}'\";\n\n# This looks for every symbol with an address at the end of it. Some things are\n# given a name based on their type / location, but still have an unknown purpose.\n# For example, FooMap_EventScript_FFFFFFF.\n# The above may be double counted here, and will need to be filtered out.\nmy $partial_doc_regex = \"'_[0-28][0-9a-fA-F]\\\\{5,7\\\\}'\";\n\nmy $count_cmd = \"wc -l\";\n\n# It sucks that we have to run this three times, but I can't figure out how to get\n# stdin working for subcommands in perl while still having a timeout. It's decently\n# fast anyway.\nmy $total_syms_as_string;\n(run (\n    command => \"$base_cmd | $count_cmd\",\n    buffer => \\$total_syms_as_string,\n    timeout => 60\n))\n    or die \"ERROR: Error while getting all symbols: $?\";\n\nmy $undocumented_as_string;\n(run (\n    command => \"$base_cmd | grep $undoc_regex | $count_cmd\",\n    buffer => \\$undocumented_as_string,\n    timeout => 60\n))\n    or die \"ERROR: Error while filtering for undocumented symbols: $?\";\n\nmy $partial_documented_as_string;\n(run (\n    command => \"$base_cmd | grep $partial_doc_regex | grep -v $undoc_regex | $count_cmd\",\n    buffer => \\$partial_documented_as_string,\n    timeout => 60\n))\n    or die \"ERROR: Error while filtering for partial symbols: $?\";\n\n# Performing addition on a string converts it to a number. Any string that fails\n# to convert to a number becomes 0. So if our converted number is 0, but our string\n# is nonzero, then the conversion was an error.\n$undocumented_as_string =~ s/^\\s+|\\s+$//g;\nmy $undocumented = $undocumented_as_string + 0;\n(($undocumented != 0) or (($undocumented == 0) and ($undocumented_as_string eq \"0\")))\n    or die \"ERROR: Cannot convert string to num: '$undocumented_as_string'\";\n\n$partial_documented_as_string =~ s/^\\s+|\\s+$//g;\nmy $partial_documented = $partial_documented_as_string + 0;\n(($partial_documented != 0) or (($partial_documented == 0) and ($partial_documented_as_string eq \"0\")))\n    or die \"ERROR: Cannot convert string to num: '$partial_documented_as_string'\";\n\n$total_syms_as_string =~ s/^\\s+|\\s+$//g;\nmy $total_syms = $total_syms_as_string + 0;\n(($total_syms != 0) or (($total_syms == 0) and ($total_syms_as_string eq \"0\")))\n    or die \"ERROR: Cannot convert string to num: '$total_syms_as_string'\";\n\n($total_syms != 0)\n    or die \"ERROR: No symbols found.\";\n\nmy $total = $src + $asm;\nmy $srcPct = sprintf(\"%.4f\", 100 * $src / $total);\nmy $asmPct = sprintf(\"%.4f\", 100 * $asm / $total);\n\nmy $documented = $total_syms - ($undocumented + $partial_documented);\nmy $docPct = sprintf(\"%.4f\", 100 * $documented / $total_syms);\nmy $partialPct = sprintf(\"%.4f\", 100 * $partial_documented / $total_syms);\nmy $undocPct = sprintf(\"%.4f\", 100 * $undocumented / $total_syms);\n\nif ($asm == 0)\n{\n    print \"Code decompilation is 100% complete\\n\"\n}\nelse\n{\n    print \"$total total bytes of code\\n\";\n    print \"$src bytes of code in src ($srcPct%)\\n\";\n    print \"$asm bytes of code in asm ($asmPct%)\\n\";\n}\nprint \"\\n\";\n\nif ($verbose != 0)\n{\n    print \"BREAKDOWN\\n\";\n    foreach my $item (@sorted)\n    {\n        print \"    $item->[1] bytes in asm/$item->[0].s\\n\"\n    }\n    print \"\\n\";\n}\n\nif ($partial_documented == 0 && $undocumented == 0)\n{\n    print \"Documentation is 100% complete\\n\"\n}\nelse\n{\n    print \"$total_syms total symbols\\n\";\n    print \"$documented symbols documented ($docPct%)\\n\";\n    print \"$partial_documented symbols partially documented ($partialPct%)\\n\";\n    print \"$undocumented symbols undocumented ($undocPct%)\\n\";\n}\n\nif ($showData)\n{\n    print \"\\n\";\n\n    my $dataTotal = $srcdata + $data;\n    my $srcDataPct = sprintf(\"%.4f\", 100 * $srcdata / $dataTotal);\n    my $dataPct = sprintf(\"%.4f\", 100 * $data / $dataTotal);\n    print \"$dataTotal total bytes of data\\n\";\n    print \"$srcdata bytes of data in src ($srcDataPct%)\\n\";\n    print \"$data bytes of data in data ($dataPct%)\\n\";\n}\n"
  },
  {
    "path": ".github/calcrom/webhook.sh",
    "content": "#!/bin/bash -ex\n\nbuild_name=$1\nmap_file=$build_name.map\nif [ ! -f $map_file ]; then\n  echo \"$map_file does not exist!\"\n  exit 1\nfi\n\noutput=$(perl $(dirname \"$0\")/calcrom.pl $build_name.map | sed -E ':a;N;$!ba;s/\\r{0,1}\\n/\\\\n/g')\ncurl -d \"{\\\"username\\\": \\\"$CALCROM_DISCORD_WEBHOOK_USERNAME\\\", \\\"avatar_url\\\": \\\"$CALCROM_DISCORD_WEBHOOK_AVATAR_URL\\\", \\\"content\\\":\\\"\\`\\`\\`\\\\n$build_name progress:\\\\n$output\\\\n\\`\\`\\`\\\"}\" -H \"Content-Type: application/json\" -X POST \"$CALCROM_DISCORD_WEBHOOK_URL\"\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: CI\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    env:\n      GAME_VERSION: FIRERED\n      GAME_LANGUAGE: ENGLISH\n      GAME_REVISION: 0\n      MODERN: 0\n      COMPARE: 1\n    steps:\n      - name: Checkout\n        uses: actions/checkout@master\n\n      - name: Checkout agbcc\n        uses: actions/checkout@master\n        with:\n          path: 'agbcc'\n          repository: 'pret/agbcc'\n\n      - name: Checkout symbols\n        if: ${{ github.event_name == 'push' }}\n        uses: actions/checkout@master\n        with:\n          path: 'symbols'\n          ref: 'symbols'\n\n      - name: Install binutils\n        run: sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi\n        # build-essential, git, and libpng-dev are already installed\n        # gcc-arm-none-eabi is only needed for the modern build\n        # as an alternative to dkP\n\n      - name: Install agbcc\n        run: |\n          ./build.sh\n          ./install.sh ../\n        working-directory: ./agbcc\n\n      - name: Compare FireRed\n        run: |\n          make -j${nproc} all syms\n\n      - name: Compare FireRed rev1\n        env:\n          GAME_REVISION: 1\n        run: |\n          make -j${nproc} all syms\n\n      - name: Compare LeafGreen\n        env:\n          GAME_VERSION: LEAFGREEN\n        run: |\n          make -j${nproc} all syms\n\n      - name: Compare LeafGreen rev1\n        env:\n          GAME_VERSION: LEAFGREEN\n          GAME_REVISION: 1\n        run: |\n          make -j${nproc} all syms\n\n      - name: Build Modern\n        env:\n          MODERN: 1\n          COMPARE: 0\n        run: |\n          make -j${nproc} all\n\n      - name: Move symfiles\n        if: ${{ github.event_name == 'push' }}\n        run: |\n          cp *.sym symbols/\n          echo \"SYMBOLS_COMMIT_MSG=$( git log --format=%s ${GITHUB_SHA} )\" >> $GITHUB_ENV\n\n      - name: Update symfiles\n        if: ${{ github.event_name == 'push' }}\n        uses: EndBug/add-and-commit@v7\n        with:\n          branch: symbols\n          cwd: \"./symbols\"\n          add: \"*.sym\"\n          message: ${{ env.SYMBOLS_COMMIT_MSG }}\n"
  },
  {
    "path": ".gitignore",
    "content": "*.1bpp\n*.4bpp\n*.8bpp\n*.DS_Store\n*.bak\n*.bat\n*.diff\n*.dump\n*.elf\n*.exe\n*.fwjpnfont\n*.gba\n!data/*.gba\n*.sgm\n*.sa1\n*.sg1\n*.gbapal\n*.hwjpnfont\n*.i\n*.idb\n*.id0\n*.id1\n*.id2\n*.latfont\n*.lz\n*.map\n*.nam\n*.o\n*.pcm\n*.pl\n*.rl\n*.s.old\n*.s.old2\n*.sa*\n*.swo\n*.swp\n*.til\n.fuse*\n.idea/\nThumbs.db\nbuild/\ncmake-build-*\nld_script_ruby.txt\nld_script_sapphire.txt\nsound/**/*.bin\nsound/songs/midi/*.s\nsrc/data/items.h\nsrc/data/region_map/region_map_entries.h\nsrc/data/region_map/region_map_entry_strings.h\nsrc/data/region_map/porymap_config.json\ntags\ntools/agbcc\ntools/binutils\ntypes_*.taghl\n!.github/calcrom/calcrom.pl\n!sound/programmable_wave_samples/*.pcm\n_Deparsed_XSubs.pm\nporymap.*.cfg\nprefabs.json\n.vscode/*.*\n*.ss1\n*.ss2\nmy_script.js\n*.js\n*.sym\n"
  },
  {
    "path": "FAQ.md",
    "content": " # **Frequently Asked Questions**\n\n### How can I support development?\n[I have a Ko-fi link](https://ko-fi.com/deokishisu), tips are appreciated!\n\n# Table of Contents:\n* Mechanics:\n  * [Will later-generation battle mechanics be implemented? What about the physical/special split?](#will-later-generation-battle-mechanics-be-implemented-what-about-the-physicalspecial-split)\n  * [Will new moves be implemented? New held items?](#will-new-moves-be-implemented-new-held-items)\n  * [Will the Generation VI+ Experience Share be implemented?](#will-the-generation-vi-experience-share-be-implemented)\n  * [Will you improve breeding mechanics?](#will-you-improve-breeding-mechanics)\n  * [What are the shiny chances? Will they be improved?](#what-are-the-shiny-chances-will-they-be-improved)\n  * [Will you add something to change my Pokémon's IVs/Hidden Power/Nature/etc.?](#will-you-add-something-to-change-my-pokémons-ivshidden-powernatureetc)\n* Pokémon Availability:\n  * [Will you add later-generation Pokémon?](#will-you-add-later-generation-pokémon)\n  * [How many Pokémon are available? Will *all* Pokémon be catchable?](#how-many-pokémon-are-available-will-all-pokémon-be-catchable)\n  * [Can you change wild Pokémon availability/levels? Can you put *x* Pokémon in *y* map? Will you add more Pokémon in the future?](#can-you-change-wild-pokémon-availabilitylevels-can-you-put-x-pokémon-in-y-map-will-you-add-more-pokémon-in-the-future)\n  * [Is there a list of wild encounter tables?](#is-there-a-list-of-wild-encounter-tables)\n  * [Can I obtain the other Kanto starters? Can I obtain the unchosen fossil?](#can-i-obtain-the-other-kanto-starters-can-i-obtain-the-unchosen-fossil)\n  * [Can I evolve my Kanto Pokémon into their Johto evolutions without the National Dex?](#can-i-evolve-my-kanto-pokémon-into-their-johto-evolutions-without-the-national-dex)\n  * [How do I evolve Eevee into Espeon and Umbreon?](#how-do-i-evolve-eevee-into-espeon-and-umbreon)\n  * [Can I evolve trade evolutions without trading?](#can-i-evolve-trade-evolutions-without-trading)\n  * [Are trade evolution items available before the postgame?](#are-trade-evolution-items-available-before-the-postgame)\n  * [How do I get the other legendary beasts?](#how-do-i-get-the-other-legendary-beasts)\n  * [Where do I get the event tickets so I can obtain Mew, Lugia and Ho-oh, Deoxys, and Latias and Latias?](#where-do-i-get-the-event-tickets-so-i-can-obtain-mew-lugia-and-ho-oh-deoxys-and-latias-and-latias)\n  * [How do I get Sudowoodo to battle me?](#how-do-i-get-sudowoodo-to-battle-me)\n  * [How do I get the other Fighting Dojo Pokémon? How do I get the missing Hitmonchan/Hitmonlee?](#how-do-i-get-the-other-fighting-dojo-pokémon-how-do-i-get-the-missing-hitmonchanhitmonlee)\n* Gameplay:\n  * [I just started the game, where is the Key System Menu? I can't change my difficulty after a new game!](#i-just-started-the-game-where-is-the-key-system-menu-i-cant-change-my-difficulty-after-a-new-game)\n  * [Where do I unlock Gym Leader rematches?](#where-do-i-unlock-gym-leader-rematches)\n  * [How does inviting a Gym Leader work? A Gym Leader I invited is gone! When is the rematch lady's Spearow coming back?](#how-does-inviting-a-gym-leader-work-a-gym-leader-i-invited-is-gone-when-is-the-rematch-ladys-spearow-coming-back)\n  * [Can I rematch Giovanni? I can only invite seven Gym Leaders.](#can-i-rematch-giovanni-i-can-only-invite-seven-gym-leaders)\n  * [What are the Challenge Mode boss trainer levels? I want to level cap my Nuzlocke run.](#what-are-the-challenge-mode-boss-trainer-levels-i-want-to-level-cap-my-nuzlocke-run)\n  * [Where are the new Move Tutors and what moves do they teach?](#where-are-the-new-move-tutors-and-what-moves-do-they-teach)\n  * [Is there a location list for all the Master Trainers?](#is-there-a-location-list-for-all-the-master-trainers)\n* Troubleshooting Savefiles, Emulators, and Flashcarts:\n  * [Is my vanilla FireRed or LeafGreen save compatible with FRLG+?](#is-my-vanilla-firered-or-leafgreen-save-compatible-with-frlg)\n  * [My emulator/flashcart doesn't work with FRLG+! The game won't save!](#my-emulatorflashcart-doesnt-work-with-frlg-the-game-wont-save)\n* Modifying FRLG+:\n  * [Can I use FRLG+ as a ROM Base?](#can-i-use-frlg-as-a-rom-base)\n  * [How did you implement *x* feature? Can I use *y* feature for my hack?](#how-did-you-implement-x-feature-can-i-use-y-feature-for-my-hack)\n* Miscellaneous:\n  * [Where do I get TM10 for Hidden Power? Pickup doesn't give me TM10 for Hidden Power!](#where-do-i-get-tm10-for-hidden-power-pickup-doesnt-give-me-tm10-for-hidden-power)\n  * [Will text be decapitalized?](#will-text-be-decapitalized)\n  * [How do I link to other games? When is the earliest I can link?](#how-do-i-link-to-other-games-when-is-the-earliest-i-can-link)\n\n## Mechanics:\n\n### Will later-generation battle mechanics be implemented? What about the physical/special split?\nNo. This hack aims to preserve the original battle mechanics and maintain link compatibility with the vanilla games. Changing the battle mechanics runs contrary to those goals.\n\n### Will new moves be implemented? New held items?\nNo. This hack aims to preserve the original battle mechanics and maintain link compatibility with the vanilla games. Adding new moves or held items runs contrary to those goals.\n\n### Will the Generation VI+ Experience Share be implemented?\nNo.\n\n### Will you improve breeding mechanics?\nBreeding mechanics have been ported from Emerald, save for Volt Tackle Pichu breeding, but no further improvements will be made. This hack is not meant to supplant the vanilla games when it comes to obtaining good Pokémon.\n\nBecause Volt Tackle Pichu are illegal in Generation III if they weren't generated in Emerald, the Volt Tackle breeding mechanic will not be ported.\n\n### What are the shiny chances? Will they be improved?\nThe shiny chance is 1/8192, as it was in Generation III. The odds of encountering a shiny Pokémon will not be increased.\n\n### Will you add something to change my Pokémon's IVs/Hidden Power/Nature/etc.?\nNo. This hack is not meant to supplant the vanilla games when it comes to obtaining good Pokémon. For IVs specifically, players can make the game behave as if all Pokémon IVs are perfect by toggling an option in the Key System Menu. This option does not affect a Pokémon's actual IVs or Hidden Power.\n\n## Pokémon Availability:\n\n### Will you add later-generation Pokémon?\nNo. This hack aims to maintain link compatibility with the vanilla games and keep all obtainable Pokémon legal in Generation III.\n\n### How many Pokémon are available? Will *all* Pokémon be catchable?\nThere are 246 Pokémon available in the hack without trading. This hack does not add any new Pokémon that were not available in Generation III. To complete the National Dex, trade with the vanilla games. This is not a 386 hack, and not all Pokémon will be obtainable without trading.\n\n### Can you change wild Pokémon availability/levels? Can you put *x* Pokémon in *y* map? Will you add more Pokémon in the future?\nOne of the goals of this hack is to make every Pokémon available to the player legal in Generation III. This means that modifying existing Pokémon encounters or adding new Pokémon to existing encounter tables would make illegal Pokémon obtainable. There are new Pokémon available that were not in FireRed and LeafGreen originally, but they have been painstakingly implemented in such a way as to maintain their Generation III legality.\n\nAdding more Pokémon in the future would require finding ways to make them legal in Generation III, and for the remaining roster of Pokémon there aren't ways to do that while still having it make sense. If you want more Pokémon, trade with vanilla.\n\n### Is there a list of wild encounter tables?\nYes, however it is not well-organized. [The link is here](https://github.com/Deokishisu/FRLG-Plus/blob/master/src/data/wild_encounters.h).\n\n### Can I obtain the other Kanto starters? Can I obtain the unchosen fossil?\nYes, both in the postgame.\n<details>\n  <summary>The other Kanto starters:</summary>\n  The Rival's starter can be obtained as an Egg on Four Island from the Day Care Man.\n  The unchosen starter can be obtained from Daisy after fixing the Network Machine on One Island.\n</details>\n<details>\n  <summary>The unchosen fossil:</summary>\n  The unchosen fossil can be obtained in Three Isle Path from the prospector in the cave after becoming Champion.\n</details>\n\n### Can I evolve my Kanto Pokémon into their Johto evolutions without the National Dex?\nYes. The game will no longer prevent Pokémon from evolving into a Pokémon that is not in the Kanto Pokédex.\n\n### How do I evolve Eevee into Espeon and Umbreon?\nEevee evolves into Espeon when leveled up outdoors with high friendship. Eevee evolves into Umbreon when leveled up indoors with high friendship.\n\n### Can I evolve trade evolutions without trading?\nYes. A new key item, the Link Bracelet, is available. It is an unmissable key item that is obtained during the story and can be used like an evolution stone. To evolve Pokémon that need to hold an item while trading to evolve, have them hold the item before using the Link Bracelet on them.\n\n<details>\n  <summary>Exact location of the Link Bracelet:</summary>\n  It is received from the Rival after defeating him in Silph Co.\n</details>\n\n### Are trade evolution items available before the postgame?\nYes. Most are available as wild held items. Items like the Up-grade have been moved to be available before becoming the Champion.\n<details>\n  <summary>Pokemon that hold trade evolution items:</summary>\n  \n  • Metal Coats can be found rarely on wild Magnemite and Magneton.\n  \n  • Dragon Scales can be found rarely on wild Dratini and Dragonair.\n  \n  • King's Rocks can be found rarely on wild Poliwhirl and Slowbro.\n  \n  • Deep Sea Scales can be found rarely on wild Chinchou underwater.\n  \n  • Deep Sea Teeth can be found rarely on wild Gyarados underwater.\n</details>\n\n### How do I get the other legendary beasts?\nEvery time you enter the Hall of Fame, an uncaught legendary beast will begin to roam Kanto if there are no legendary beasts currently roaming.\n\n### Where do I get the event tickets so I can obtain Mew, Lugia and Ho-oh, Deoxys, and Latias and Latias?\n<details>\n  <summary>The Old Sea Map for Mew on Faraway Island:</summary>\n  Become the Champion, then talk to Mr. Fuji in his home in Lavender Town.\n</details>\n\n<details>\n  <summary>The MysticTicket for Lugia and Ho-oh on Navel Rock:</summary>\n  Obtain the Extended Dex, then get the diploma for completing the Kanto Pokédex in Celadon Mansion.\n</details>\n\n<details>\n  <summary>The AuroraTicket for Deoxys on Birth Island:</summary>\n  Get a 28-win streak at the Battle Tower.\n</details>\n\n<details>\n  <summary>The Eon Ticket for Latias and Latios on Southern Island:</summary>\n  Get a 56-win streak at the Battle Tower. These Pokémon are version exclusive, so switch versions in the Key System Menu to obtain both of them.\n</details>\n\n### How do I get Sudowoodo to battle me?\n<details>\n  <summary>To get Sudowoodo to battle,</summary>\n  have a Fresh Water in your bag and talk to it.\n</details>\n\n### How do I get the other Fighting Dojo Pokémon? How do I get the missing Hitmonchan/Hitmonlee?\nBreed your Hitmonchan/Hitmonlee for a Tyrogue and then evolve that Tyrogue into the Fighting Dojo Pokémon that you didn't pick.\n\n## Gameplay:\n\n### I just started the game, where is the Key System Menu? I can't change my difficulty after a new game!\nOnce you have started a new game, you need to save and reset. The Key System Menu is on the Main Menu alongside the Continue and New Game options. \n\n### Where do I unlock Gym Leader rematches?\nThere is an old woman in a house on Seven Island who will start the sidequest for you.\n\n### How does inviting a Gym Leader work? A Gym Leader I invited is gone! When is the rematch lady's Spearow coming back?\nWhen you show the old woman in the Battle House a full Fame Checker entry for a Gym Leader, her Spearow will leave to bring them an invitation. Once Spearow returns, the invited Gym Leader will periodically visit the Battle House basement where they can be rematched. Once beaten, a Gym Leader will return to their Gym, but will come back to the house automatically to train after some time.\n\nBoth Spearow returning and Gym Leaders visiting are based on steps taken while outside of the Seven Island town area. There is randomness involved in how many steps it takes to trigger a Gym Leader visit, but there is bad luck protection that will begin forcing visits to prevent long waits between visits.\n\nThe sign outside the Battle House will report which Gym Leaders are currently visiting.\n\n### Can I rematch Giovanni? I can only invite seven Gym Leaders.\nGiovanni is canonically on the run after he flees his Gym and is not seen again in FRLG+. Only the first seven Gym Leaders can be rematched.\n\n### What are the Challenge Mode boss trainer levels? I want to level cap my Nuzlocke run.\n<details>\n<summary>Their levels are as follows:</summary>\nBrock: 15<br>\nMisty: 22<br>\nLt. Surge: 26<br>\nRocket Hideout Giovanni: 31<br>\nErika: 31<br>\nKoga: 46<br>\nSilph Co. Giovanni: 44<br>\nSabrina: 46<br>\nBlaine: 51<br>\nLeader Giovanni: 54<br>\nLorelei: 58<br>\nBruno: 60<br>\nAgatha: 62<br>\nLance: 64<br>\nChampion: 67<br>\n\nRematch Lorelei: 71<br>\nRematch Bruno: 73<br>\nRematch Agatha: 75<br>\nRematch Lance: 77<br>\nRematch Champion: 80<br>\n</details>\n\n### Where are the new Move Tutors and what moves do they teach?\n<details>\n    <summary>New move tutor locations:</summary>\n    \n• Fury Cutter - Vermilion City\n\n• Rollout - Route 24\n\n• Swagger - Route 10\n\n• Dynamic Punch - Saffron City\n\n• Sleep Talk - Silph Co.\n\n• Nightmare - Silph Co.\n\n• Self-Destruct - Cinnabar Island\n\n• Sky Attack - Mt. Ember\n\nThe tutors in Saffron City and Silph Co. will not appear until Team Rocket has been driven from the city.\n</details>\n\n### Is there a location list for all the Master Trainers?\nThe Master Trainers are all in the same locations as they were in LGPE, with the exception of Master Trainers who would have been on Cycling Road. Those that would have been on Cycling Road have been moved to Routes 16 and 18. Keeping that in mind, [refer to this list from Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Master_Trainer#Trainer_list) for the Master Trainer locations.\n\n## Troubleshooting Savefiles, Emulators, and Flashcarts:\n\n### Is my vanilla FireRed or LeafGreen save compatible with FRLG+?\nNo. The save needed to be edited to add certain features, and therefore vanilla saves are incompatible with FRLG+. Similarly, FRLG+ saves cannot be used in vanilla.\n\n### My emulator/flashcart doesn't work with FRLG+! The game won't save!\nThe recommended emulator for desktop is [mGBA](https://mgba.io/downloads.html).\n\nIf your emulator or flashcart isn't working properly with FRLG+, follow instructions for that particular emulator or flashcart for playing vanilla FireRed or LeafGreen and apply them to getting FRLG+ to work. If a patch is required to get vanilla FireRed or LeafGreen to save properly, then FRLG+ is incompatible with that emulator or flashcart.\n\n## Modifying FRLG+:\n\n### Can I use FRLG+ as a ROM Base?\nMy official stance is that all mods of FRLG+ are unauthorized and unsupported, but derivative works of FRLG+ must be free and open source. If you choose to use FRLG+ as a ROM Base, I will not offer any support nor answer questions regarding developing a mod of this hack. Use of FRLG+ as a base is contingent on your resulting work being free and open source, as FRLG+ is.\n\n### How did you implement *x* feature? Can I use *y* feature for my hack?\nMy commits are descriptively labeled. If you want to grab something from FRLG+, go back through my commits and find where I implemented it. I don't offer support or answer questions for lifting things from FRLG+, but since the project is open source anyone can take from it.\n\n## Miscellaneous:\n\n### Where do I get TM10 for Hidden Power? Pickup doesn't give me TM10 for Hidden Power!\n\nThe TM for Hidden Power has been removed from the pickup table and is now sold in the Celadon Dept. Store.\n\nThe Pickup table has been changed to the following:<br>\n&nbsp;&nbsp;&nbsp;&nbsp;15% - Oran Berry<br>\n&nbsp;&nbsp;&nbsp;&nbsp;10% - Cheri Berry, Chesto Berry, Pecha Berry, Rawst Berry, Aspear Berry, Persim Berry<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5% - PP Up, Rare Candy, Nugget, Pomeg Berry<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1% - Kelpsy Berry, Qualot Berry, Hondew Berry, Grepa Berry, Tamato Berry<br>\n\n### Will text be decapitalized?\nNo.\n\n### How do I link to other games? When is the earliest I can link?\nFRLG+ is fully compatible with everything that the vanilla international FireRed and LeafGreen games were compatible with. If your emulator supports linking, refer to its documentation for how to initiate a link.\n\nThe player may link with all Generation III GBA and GCN games the moment they receive the Pokédex. Finishing the Net Center on One Island is no longer a prerequisite for trading with the Hoenn games, trading with the Orre games, using Pokémon Box: Ruby and Sapphire, or receiving Eggs or Pokémon that are not in the Kanto Pokédex.\n&nbsp;\n&nbsp;\n&nbsp;\n&nbsp;\n&nbsp;\n&nbsp;\n"
  },
  {
    "path": "FEATURES.md",
    "content": "## Features\n\n#### Mechanical Additions:\n- A Key System has been implemented, similar to Black 2 and White 2. Press the L Button while on the Key System Menu to access the Help System, which has detailed information on each key. Use the keys to change various settings about your game. Those settings are:\n\t*  __Version__: Switch between FireRed and LeafGreen to catch version-exclusive Pokémon.\n\t* __Difficulty__: Like in Black 2 and White 2, there is a Challenge and an Easy Mode difficulty. These difficulties scale trainer levels up or down, and in Challenge Mode important trainers will have an extra Pokémon and badge boosts are disabled.\n\t* __Nuzlocke Toggle__: Can toggle on a Nuzlocke mode. Press the L Button on the Key System menu to read the special ruleset for this mode.\n\t* __IV Calculation__: Can make the game treat your Pokémon's IVs as all perfect (31), all zero, or use their actual IVs as is standard for the purposes of stat calculation. This does not affect your Pokémon's actual IVs or Hidden Power, just how their stats are calculated. If set to all perfect, enemy Pokémon will also be treated as if they have all perfect IVs.\n\t* __EV Calculation__: Can make the game treat your Pokémon's EVs as all zero, or use their actual EVs as is standard for the purposes of stat calculation. This does not affect your Pokémon's actual EVs, (they will still gain/lose EVs as normal), just how their stats are calculated.\n\t* __No Free Heals__: Can disable free party heals, most notably the Pokémon Center heals and the Lavender Tower purified zone, but also many others. This also prevents PC Boxes from healing Pokémon deposited into them.\n\t* __Exp. Modifier__: Can alter experience gains using a multiplier. The possible options are 0×, 1/2×, 1×, and 2×. Pokémon still gain EVs normally when this is set to 0×.\n\n##### Nuzlocke Info:\n<details>\n<summary>This is a special implementation of the Nuzlocke ruleset. While the Nuzlocke toggle is on (click for details):</summary>\n<ul>\n<li>Fainted Pokémon cannot be healed by any means (including depositing them in a PC Box).</li>\n<li>The player is not asked whether or not they want to give a nickname to obtained Pokémon while Nuzlocke Mode is on.</li>\n<li>Pokémon can be obtained at any time, but only the first Pokémon obtained in an area is usable barring duplicates (dupe clause).</li>\n    <ul>\n    <li>There is a UI element drawn to the enemy's healthbar to indicate if it counts as the first encounter in an area.</li>\n   <li>Unusable Pokémon will be automatically fainted if received, and will not count as an encounter for the purposes of the built-in dupe clause.</li>\n   <li>In-game trades will be fainted if the Pokémon traded for them was fainted but will be usable if not, and otherwise do not count as a first encounter.</li>\n   <li>Eggs, when hatched, will set the encounter flag of the place the egg was first obtained. If that place already had a first encounter, then the egg will hatch fainted.</li>\n   </ul>\n<li>The Dupe Clause is in effect. Pokémon that are already owned, or evolutionary relatives of already owned Pokémon, will not count if they are the first encounter in an area and not caught.</li>\n    <ul>\n    <li>In-game trades do invoke the dupe clause for additional Pokémon of that species.</li>\n    </ul>\n<li>If a white out occurs, the player will be prompted to grab a usable Pokémon from their PC Box.</li>\n    <ul>\n    <li>If there are no usable Pokémon left, they will be given a choice of soft-resetting or turning off the Nuzlocke toggle and healing their party normally.</li>\n    </ul>\n<li>None of these rules come into effect until after the player obtains Poké Balls.</li>\n<li>Encounters are not tracked:</li>\n    <ul>\n    <li>While the Nuzlocke toggle is off,</li>\n    <li>retroactively (starting a Nuzlocke midway through a regular playthrough will allow new \"first\" encounters) and,</li>\n    <li>before the player obtains the Pokédex, to prevent losing the opportunity to catch Route 1 Pokémon before catching Pokémon is possible.</li>\n    </ul>\n<li>Each outdoor Safari Zone map counts as a separate area for the purposes of catching Pokémon.</li>\n<ul>\n</details>\n\n#### Story Changes:\n- The player may progress to the Sevii Islands postgame content immediately after becoming the Champion; the National Dex is no longer required to do so.\n\t- After the player becomes the Champion, Oak will upgrade their Pokédex with a new Extended Mode which lists all Pokémon available without trading.\n\t- The National Pokédex is now obtained by trading in a Pokémon that is not in the Extended Dex.\n- A legendary beast will begin roaming when the player first enters the Hall of Fame, instead of upon delivering the Sapphire.\n- Event tickets are given away through gameplay milestones, allowing the player access to Birth Island and Navel Rock to catch Deoxys and Ho-oh/Lugia, respectively.\n\t* Faraway Island has been ported from Emerald, allowing players to catch Mew. The Old Sea Map is given away similarly to the other event tickets.\n\t* Southern Island has been ported from Emerald, allowing players to catch Latias and Latios. The Eon Ticket is given away similarly to the other event tickets.\n- Expanded postgame, focusing on organically fleshing out the available content.\n\t* HM08 Dive is now available and usable in the field. New underwater areas found on Route 20 and Bond Bridge.\n\t* A Safari Zone expansion adds two more areas, making more Pokémon obtainable.\n\t* The Hoenn Battle Tower has been ported from RS. The player will be invited to challenge the Battle Tower upon delivering the Ruby to Celio.\n\t\t* The Level 100 mode has been replaced with the Open Level mode like in Emerald.\n\t\t* Artisan Cave can be accessed from the Battle Tower's dock.\n\t* A new area in Berry Forest makes the pinch berries available.\n\t* A new area west of Cape Brink has rematchable trainers for the purposes of EV training.\n\t* Gym Leader rematches can be unlocked on Seven Island.\n\t* Master Trainers appear around Kanto after becoming the Champion, filling a similar role to their appearance in the Let's Go games with some differences.\n\t\t* Master Trainers can be rematched immediately.\n\t\t* Master Trainer Pokémon will scale to the level of the Pokémon used to challenge them, making them more accessible.\n\t\t* Master Trainer Pokémon hold items and have better movesets than in the Let's Go games, making them significantly more challenging.\n\t\t* The Master Trainers for Ditto, Articuno, Zapdos, Moltres, Mewtwo, and Mew want to see Pokémon with 100 total Effort Values.\n\t\t* Master Trainers that would have been on Cycling Road have been moved to Routes 16 and 18.\n\t\t\t* Additionally, some Master Trainers have been repositioned on their maps to account for FRLG area design.\n\t\t* Clearing a Master Trainer confers a title that can be used in link battles with other FRLG+ players.\n\t\t* Clearing all 151 Master Trainers unlocks a secret superboss Trainer.\n\n#### Quality of Life Changes:\n\n##### Travel-related:\n- Running indoors.\n- Toggle auto running with the R button.\n- Cut trees stay cut permanently.\n- Hold B while surfing to go faster. If autorun is enabled, hold B to go slower, as the faster speed becomes default.\n- The bike now has two gears, one for the default speed, and one for Mach Bike speed. Press B while biking to switch between them.\n- The Victory Road boulder puzzles no longer reset.\n- The two boulders that block access to Mt. Ember's exterior will no longer block the way once the player moves past them.\n- Steps taken aren't counted while inside Safari Zone Rest Houses.\n- The player travels at running speed while diving.\n- The map fades in significantly faster after most warps, which makes entering and exiting doors faster.\n\n##### Inventory and Item-related:\n- Expanded item pockets. The player can hold one stack of every legally-obtainable item at once.\n- Two new pockets, the Medicine and Held Items pockets, have been introduced to ease bag navigation.\n- Press Start in the bag to sort items by several criteria.\n- The bag pockets wrap around when switching between them.\n- Left and Right in the TM Case and Berry Pouch scrolls faster.\n- Infinite TM usage. TM prices have been modified to reflect this. TMs do not restore PP when learned, like in BW/B2W2.\n\t* The missable TM44 Rest from the S.S. Anne has been added to the Celadon Dept. Store inventory.\n\t* TM10 is no longer available through Pickup and is instead available in the Celadon Dept. Store.\n- EV-reducing berries ported from Emerald (the Pomeg glitch was fixed during the port). Otherwise worthless berries obtainable as hidden items or through Pickup have been changed to these.\n- When a repel expires, the player will be asked whether they want to use another immediately, like in Black 2 and White 2.\n- The Generation III Poké Ball varieties can be purchased in Silph Co. after it has been liberated from Team Rocket.\n- The Light Ball is held rarely by Pikachu outside of Viridian Forest, making it obtainable without trading.\n- LGPE-style bonus Premier Balls in shops. Buying multiples of ten of any Poké Ball type will give bonus Premier Balls.\n- Trade evolution items are now available before the postgame.\n\t* Up-grade can be found in Silph Co.\n\t* Metal Coats can be found rarely on wild Magnemite and Magneton.\n\t* Dragon Scales can be found rarely on wild Dratini and Dragonair.\n\t* King's Rocks can be found rarely on wild Poliwhirl and Slowbro.\n\t* Deep Sea Scales can be found rarely on wild Chinchou underwater.\n\t* Deep Sea Teeth can be found rarely on wild Gyarados underwater.\n\n##### Battle-related:\n- New options available in the options menu to speed up battles:\n\t* Battle Transitions setting turns off the transition animation between the field and a battle.\n\t* Battle Intro Animation setting turns off the sliding animation that occurs at the start of every battle.\n\t* Battle Scene has been renamed to Move Animations and now also skips in-battle text delays when it is off.\n\t* HP Bar Animation Speed gives four options for how fast the HP bar animates, including instant.\n\t* Exp. Bar Animation Speed gives the player the choice to make experience bars animate instantly.\n- New battle style option, switch, which is like shift but doesn't tell what the opponent is switching in. Shift has been renamed to predict.\n- Press B on the \"What will Pokémon do?\" menu during wild battles to move the cursor to run.\n- A message is now printed at the end of a battle if a Pokémon has gained an item through the Pickup ability.\n\n##### Move Tutor-related:\n- There are eight new Move Tutors scattered throughout the world that teach Fury Cutter, Rollout, Dynamic Punch, Sleep Talk, Nightmare, Self-Destruct, Sky Attack, and Swagger respectively.\n- Move Tutors will charge after the first time they teach a move, allowing infinite tutor uses at a cost. Frenzy Plant, Blast Burn, and Hydro Cannon can be tutored infinitely for free, and no longer have a friendship requirement to learn.\n- The Move Reminder can overwrite HM moves with relearned moves.\n- The Move Reminder can teach moves from a Pokémon's pre-evolutions, with some caveats.\n\t* If the Pokémon has a baby form, it can only relearn moves exclusive to that form if it was hatched itself. Wobbuffet from Mirage Island are the sole exception, as they were caught as Wynaut and therefore can also relearn Wynaut's exclusive moves.\n\t* If a Pokémon is not at a high enough level to learn a move from its own learnset, then it cannot relearn that move regardless of its presence in a pre-evolution's learnset.\n\n##### User Interface-related:\n- Indicators have been added for which stats are affected by natures on summary screen.\n- Press the select button in the party menu to switch Pokémon without having to use the menu option.\n- Press the select button on the initial Pokédex screen to open the last viewed entry.\n- Hidden Power's true type and power are shown on the summary screen, and its type is shown in battle.\n- Return and Frustration's true power is shown on the summary screen.\n- Weather Ball's type and power are updated with the weather in both the summary screen and in battle.\n- Nature Power now displays the type, power, and accuracy of the move it will call in both the summary screen and in battle.\n- The summary screen now wraps around when cycling through the party Pokémon instead of stopping at the first and last.\n- Game Corner coins can be bought in increments of 1000 in addition to the other two options.\n\n##### Pokémon-related:\n- All Deoxys formes are included, and are implemented in the way that the GBA games did it for link compatibility purposes. Switch Deoxys' forme by examining the meteorite exhibit in the Pewter Museum of Science.\n- No evolution restrictions; Pokémon will evolve regardless of whether or not their evolution is in the Kanto Dex.\n\t* Eevee evolves into Espeon by happiness outdoors and Umbreon by happiness indoors.\n- The EV cap for an individual stat is 252, like in later generations.\n- Pokémon that evolve by trade can evolve by using an unmissable Key Item on them that is obtained during the story. Pokémon like Scyther also need to be holding their evolution items to evolve in this way.\n- Uncaptured legendary Pokémon, roaming Pokémon, and Snorlax will be regenerated upon entering the Hall of Fame, keeping them from being missable.\n- If upon entering the Hall of Fame a legendary beast is not currently roaming, an uncaught one will begin to roam. This allows the player to capture all three legendary beasts in one playthrough.\n- A woman in the Move Reminder's House on Two Island can check if a Pokémon is fully EV trained. If it is, she'll give it the Effort Ribbon.\n\n##### Day Care-related:\n- The Day-Care Man will raise his hand immediately if a Pokémon Egg is ready without having to transition to another map. He no longer steps forward to indicate an Egg is available.\n- The Day Care will send a retrieved Pokémon to a box as long as it's not holding mail if the player's party is full.\n- Eggs have a 50% chance of inheriting the nature of their mother or Ditto parent if that parent holds an Everstone, ported from Emerald.\n- The Route 5 Day-Care Man tells the player what level a Pokémon was when it was first deposited.\n\n##### Miscellaneous Quality of Life Additions:\n- Instant text option.\n- No link restrictions\n\t* Trade with Ruby, Sapphire, Emerald, Colosseum, and XD the moment that the player catches a second Pokémon.\n\t\t* Unmodified Emerald may need the National Dex before it allows trading.\n- The Old Man tutorial battle is skipped if you have more than one Pokémon with you.\n- The Trainer Card star gained from doing Wireless minigames on Two Island can also be earned by achieving a 50-win streak at the Battle Tower.\n- The Pokémon Center nurses abbreviate their dialogue after getting two Trainer Card stars, similar to Generation IV and up.\n- Softlock prevention mechanisms are present. The player can no longer trap themselves on Cinnabar Island and the Indigo Plateau, and free Poké Balls are available in potential softlock situations.\n- There is now a PC in the S.S. Anne in the room where the player can rest.\n\n#### Vanilla Bug Fixes:\n- All Revision 1 fixes are included here. This includes the missing \"Presents\" graphic in the intro, and several Pokédex errors and oversights.\n- The Nugget Bridge Rocket can no longer give the player infinite Nuggets.\n- Assist, Block, Camouflage, Charge, Conversion 2, Follow Me, Grudge, Helping Hand, Imprison, Ingrain, Magic Coat, Mean Look, Memento, Mimic, Mud Sport, Nightmare, Pain Split, Recycle, Refresh, Role Play, Skill Swap, Slack Off, Snatch, Softboiled, Spider Web, Tail Glow, Vital Throw, Water Sport, Wish and Yawn display as --- accuracy instead of 100 accuracy.\n- The misspelling of \"Pokcet\" in the Teachy TV program has been fixed.\n- Raikou and Entei will not disappear if they Roar the player out of their battles.\n\t* The roaming IV glitch will __not__ be fixed, as it affects the legality of the legendary beasts.\n- Fixed Karate King Koichi and Charine localization oversights. These characters are now named Kiyo and Janine as they are in GSC/HGSS.\n- Fixed bug where the AI would decide to use Foresight based on the user's type and stats instead of the target's.\n- Fixed bug where the AI would incorrectly decide to try to stall with semi-invulnerable moves while a weather effect is damaging them.\n- Fixed bug where the AI would decide to use Facade based on the target's status instead of its own.\n- Fixed an oversight where Icefall Cave's cracked ice tiles could spawn wild encounters. If a wild encounter is generated on one, it does not crack, allowing the player to cheat the puzzle.\n- Fixed the [evolution move-learning glitch](https://glitchcity.wiki/wiki/Evolution_move-learning_glitch).\n- Many vanilla tile errors have been fixed. Too many.\n\n#### Miscellaneous Changes:\n- All Kanto Pokémon, along with 90% of Johto Pokémon, will be available in one playthrough. All Hoenn Pokémon (except for Azurill, Wynaut, Latias, Latios, and Deoxys) will still need to be traded for.\n- Abilities have effects in the overworld ported from Emerald.\n\t* As Lightningrod's Emerald overworld effect is inapplicable, it has been changed. Lightningrod now charges the Vs. Seeker twice as fast.\n- The Pokémon Summary Screen can accurately show the met location of any Pokémon obtained in Gen 3, including Pokémon from Orre.\n- Silph Co. is populated by workers once it is liberated from Team Rocket.\n- Some aesthetic and music changes which are mostly confined to the Sevii Islands to make each island more distinct.\n- Cycling Road forces the bike theme, like in RGBY.\n- Emerald's player character designs show in the link rooms if linking with Emerald.\n- The original RGBY textbox is available as frame type 11 in the options menu.\n- The Gambler trainer class has been decensored.\n"
  },
  {
    "path": "INSTALL.md",
    "content": "# Instructions\n\nThese instructions explain how to set up the tools required to build **pokefirered**, which assembles the source files into a ROM.\n\nThese instructions come with notes which can be expanded by clicking the \"<i>Note...</i>\" text.\nIn general, you should not need to open these unless if you get an error or if you need additional clarification.\n\nIf you run into trouble, ask for help on Discord or IRC (see [README.md](README.md)).\n\n## Windows\nWindows has instructions for building with three possible terminals, providing 3 different options in case the user stumbles upon unexpected errors.\n- [Windows 10/11 (WSL1)](#windows-1011-wsl1) (**Fastest, highly recommended**, Windows 10 and 11 only)\n- [Windows (msys2)](#windows-msys2) (Second fastest)\n- [Windows (Cygwin)](#windows-cygwin) (Slowest)\n\nUnscientific benchmarks suggest **msys2 is 2x slower** than WSL1, and **Cygwin is 5-6x slower** than WSL1.\n<details>\n    <summary><i>Note for advanced users: <b>WSL2</b>...</i></summary>\n\n>   <b>WSL2</b> is an option and is even faster than <b>WSL1</b> if files are stored on the WSL2 file system, but some tools may have trouble interacting\n>   with the WSL2 file system over the network drive. For example, tools which use Qt versions before 5.15.2 such as <a href=\"https://github.com/huderlem/porymap\">porymap</a>\n>   may <a href=\"https://bugreports.qt.io/browse/QTBUG-86277\">have problems with parsing the <code>\\\\wsl$</code> network drive path</a>.\n</details>\n\nAll of the Windows instructions assume that the default drive is C:\\\\. If this differs to your actual drive letter, then replace C with the correct drive letter when reading the instructions.\n\n**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.\n\n## Windows 10/11 (WSL1)\nWSL1 is the preferred terminal to build **pokefirered**. The following instructions will explain how to install WSL1 (referred to interchangeably as WSL).\n- If WSL (Debian or Ubuntu) is **not installed**, then go to [Installing WSL1](#Installing-WSL1).\n- 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).\n- Otherwise, **open WSL** and go to [Choosing where to store pokefirered (WSL1)](#Choosing-where-to-store-pokefirered-WSL1).\n\n### Installing WSL1\n1. Open [Windows Powershell **as Administrator**](https://i.imgur.com/QKmVbP9.png), and run the following command (Right Click or Shift+Insert is paste in the Powershell).\n\n    ```powershell\n    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart\n    ```\n\n2. Once the process finishes, restart your machine.\n\n3. The next step is to choose and install a Linux distribution from the Microsoft Store. The following instructions will assume Ubuntu as the Linux distribution of choice.\n    <details>\n        <summary><i>Note for advanced users...</i></summary>\n\n   >   You can pick a preferred Linux distribution, but setup instructions may differ. Debian should work with the given instructions, but has not been tested.\n    </details>\n\n4. Open the [Microsoft Store Linux Selection](https://aka.ms/wslstore), click Ubuntu, then click Get, which will install the Ubuntu distribution.\n    <details>\n        <summary><i>Notes...</i></summary>\n\n   >   Note 1: If a dialog pops up asking for you to sign into a Microsoft Account, then just close the dialog.  \n   >   Note 2: If the link does not work, then open the Microsoft Store manually, and search for the Ubuntu app (choose the one with no version number).\n    </details>\n\n### Setting up WSL1\nSome tips before proceeding:\n- In WSL, Copy and Paste is either done via\n    - **right-click** (selection + right click to Copy, right click with no selection to Paste)\n    - **Ctrl+Shift+C/Ctrl+Shift+V** (enabled by right-clicking the title bar, going to Properties, then checking the checkbox next to \"Use Ctrl+Shift+C/V as Copy/Paste\").\n- Some of the commands that you'll run will ask for your WSL password and/or confirmation to perform the stated action. This is to be expected, just enter your WSL password and/or the yes action when necessary.\n\n1. Open **Ubuntu** (e.g. using Search).\n2. WSL/Ubuntu will set up its own installation when it runs for the first time. Once WSL/Ubuntu finishes installing, it will ask for a username and password (to be input in).\n    <details>\n        <summary><i>Note...</i></summary>\n\n   >   When typing in the password, there will be no visible response, but the terminal will still read in input.\n    </details>\n\n3. Update WSL/Ubuntu before continuing. Do this by running the following command. These commands will likely take a long time to finish:\n\n    ```bash\n    sudo apt update && sudo apt upgrade\n    ```\n\n> Note: If the repository you plan to build has an **[older revision of the INSTALL.md](https://github.com/pret/pokefirered/blob/b7a6240/INSTALL.md)**, then follow the [legacy WSL1 instructions](docs/legacy_WSL1_INSTALL.md) from here.\n\n4. Certain packages are required to build pokefirered. Install these packages by running the following command:\n\n    ```bash\n    sudo apt install build-essential binutils-arm-none-eabi git libpng-dev\n    ```\n    <details>\n        <summary><i>Note...</i></summary>\n\n   >   If the above command does not work, try the above command but replacing `apt` with `apt-get`.\n    </details>\n\n### Choosing where to store pokefirered (WSL1)\nWSL has its own file system that's not natively accessible from Windows, but Windows files *are* accessible from WSL. So you're going to want to store pokefirered within Windows.\n\nFor example, say you want to store pokefirered (and agbcc) in **C:\\Users\\\\_\\<user>_\\Desktop\\decomps**. First, ensure that the folder already exists. Then, enter this command to **change directory** to said folder, where *\\<user>* is your **Windows** username:\n\n```bash\ncd /mnt/c/Users/<user>/Desktop/decomps\n```\n\n<details>\n    <summary><i>Notes...</i></summary>\n\n>   Note 1: The Windows C:\\ drive is called /mnt/c/ in WSL.  \n>   Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd \"/mnt/c/users/<user>/Desktop/decomp folder\"`.  \n>   Note 3: Windows path names are case-insensitive so adhering to capitalization isn't needed\n</details>\n\nIf this works, then proceed to [Installation](#installation).\n\nOtherwise, ask for help on Discord or IRC (see [README.md](README.md)), or continue reading below for [Windows instructions using msys2](#windows-msys2).\n\n## Windows (msys2)\n\n- If devkitARM is **not installed**, then go to [Installing devkitARM](#installing-devkitarm).\n- If devkitARM is installed, but msys2 **hasn't previously been set up for another decompilation project**, then go to [Setting up msys2](#setting-up-msys2).\n- Otherwise, **open msys2** and go to [Choosing where to store pokefirered (msys2)](#choosing-where-to-store-pokefirered-msys2).\n\n### Installing devkitARM\n1. Download the devkitPro installer [here](https://github.com/devkitPro/installer/releases).\n2. Run the devkitPro installer. In the \"Choose Components\" screen, uncheck everything except GBA Development unless if you plan to install other devkitPro components for other purposes. Keep the install location as C:\\devkitPro and leave the Start Menu option unchanged.\n\n### Setting up msys2\n\nNote that in msys2, Copy is Ctrl+Insert and Paste is Shift+Insert.\n\n1. Open msys2 at C:\\devkitPro\\msys2\\msys2_shell.bat.\n\n2. Certain packages are required to build pokefirered. Install these by running the following command:\n\n    ```bash\n    pacman -S make gcc zlib-devel git\n    ```\n    <details>\n        <summary><i>Note...</i></summary>\n\n   >   This command will ask for confirmation, just enter the yes action when prompted.\n    </details>\n\n3. Download [libpng](https://sourceforge.net/projects/libpng/files/libpng16/1.6.37/libpng-1.6.37.tar.xz/download).\n\n4. Change directory to where libpng was downloaded. By default, msys2 will start in the current user's profile folder, located at **C:\\Users\\\\&#8288;_\\<user>_**, where *\\<user>* is your Windows username. In most cases, libpng should be saved within a subfolder of the profile folder. For example, if libpng was saved to **C:\\Users\\\\_\\<user>_\\Downloads** (the Downloads location for most users), enter this command:\n\n    ```bash\n    cd Downloads\n    ```\n\n    <details>\n        <summary><i>Notes...</i></summary>\n\n    >   Note 1: While not shown, msys uses forward slashes `/` instead of backwards slashes `\\` as the directory separator.  \n    >   Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd \"Downloads/My Downloads\"`.  \n    >   Note 3: Windows path names are case-insensitive so adhering to capitalization isn’t needed.   \n    >   Note 4: If libpng was saved elsewhere, you will need to specify the full path to where libpng was downloaded, e.g. `cd c:/devkitpro/msys2` if it was saved there.\n    </details>\n\n5. Run the following commands to uncompress and install libpng.\n\n    ```bash\n    tar xf libpng-1.6.37.tar.xz\n    cd libpng-1.6.37\n    ./configure --prefix=/usr\n    make check\n    make install\n    ```\n\n6. Then finally, run the following command to change back to the user profile folder.\n\n    ```bash\n    cd\n    ```\n\n### Choosing where to store pokefirered (msys2)\nAt this point, you can choose a folder to store pokefirered into. If you're okay with storing pokefirered in the user profile folder, then proceed to [Installation](#installation). Otherwise, you'll need to account for where pokefirered is stored when changing directory to the pokefirered folder.\n\nFor example, if you want to store pokefirered (and agbcc) in **C:\\Users\\\\_\\<user>_\\Desktop\\decomps** (where *\\<user>* is your **Windows** username), enter this command:\n\n```bash\ncd Desktop/decomps\n```\n\nIf this works, then proceed to [Installation](#installation).\n\nOtherwise, ask for help on Discord or IRC (see [README.md](README.md)), or continue reading below for [Windows instructions using Cygwin](#windows-cygwin).\n\n## Windows (Cygwin)\n1. If devkitARM is **not installed**, then follow the instructions used to [install devkitARM](#installing-devkitarm) for the msys2 setup before continuing. *Remember to not continue following the msys2 instructions by mistake!*\n\n2.\n    - If Cygwin is **not installed**, or does not have all of the required packages installed, then go to [Installing Cygwin](#installing-cygwin).\n    - If Cygwin is installed, but **is not configured to work with devkitARM**, then go to [Configuring devkitARM for Cygwin](#configuring-devkitarm-for-cygwin).\n    - Otherwise, **open Cygwin** and go to [Choosing where to store pokefirered (Cygwin)](#choosing-where-to-store-pokefirered-cygwin)\n\n### Installing Cygwin\n1. Download [Cygwin](https://cygwin.com/install.html): setup-x86_64.exe for 64-bit Windows, setup-x86.exe for 32-bit.\n\n2. Run the Cygwin setup. Within the Cygwin setup, leave the default settings until the \"Choose A Download Site\" screen.\n\n3. At \"Choose a Download Site\", select any mirror within the Available Download Sites.\n\n4. At \"Select Packages\", set the view to \"Full\" (top left) and search for the following packages:\n    - `make`\n    - `git`\n    - `gcc-core`\n    - `gcc-g++`\n    - `libpng-devel`\n\n   To quickly find these, use the search bar and type the name of each package. Ensure that the selected package name is the **exact** same as the one you're trying to download, e.g. `cmake` is **NOT** the same as `make`.\n\n5. For each package, double click on the text that says \"**Skip**\" next to each package to select the most recent version to install. If the text says anything other than \"**Skip**\", (e.g. Keep or a version number), then the package is or will be installed and you don't need to do anything.\n\n6. Once all required packages have been selected, finish the installation.\n\n### Configuring devkitARM for Cygwin\n\nNote that in Cygwin, Copy is Ctrl+Insert and Paste is Shift+Insert.\n\n1. Open **Cygwin**.\n\n2. Run the following commands to configure devkitPro to work with Cygwin.\n\n    ```bash\n    export DEVKITPRO=/cygdrive/c/devkitpro\n    echo export DEVKITPRO=$DEVKITPRO >> ~/.bashrc\n    export DEVKITARM=$DEVKITPRO/devkitARM\n    echo export DEVKITARM=$DEVKITARM >> ~/.bashrc\n    ```\n\n    <details>\n        <summary><i>Note...</i></summary>\n\n   >   Replace the drive letter c with the actual drive letter if it is not c.\n    </details>\n\n### Choosing where to store pokefirered (Cygwin)\n\nCygwin has its own file system that's within Windows, at **C:\\cygwin64\\home\\\\_\\<user>_**. If you don't want to store pokefirered there, you'll need to account for where pokefirered is stored when **changing directory** to the pokefirered folder.\n\nFor example, if you want to store pokefirered (and agbcc) in **C:\\Users\\\\_\\<user>_\\Desktop\\decomps**, enter this command, where *\\<user>* is your **Windows** username:\n```bash\ncd c:/Users/<user>/Desktop/decomps\n```\nNote that the directory **must exist** in Windows. If you want to store pokefirered in a dedicated folder that doesn't exist (e.g. the example provided above), then create the folder (e.g. using Windows Explorer) before executing the `cd` command.\n\n<details>\n    <summary><i>Notes...</i></summary>\n\n>   Note 1: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd \"c:/users/<user>/Desktop/decomp folder\"`.  \n>   Note 2: Windows path names are case-insensitive so adhering to capitalization isn't needed\n</details>\n\nIf this works, then proceed to [Installation](#installation). Otherwise, ask for help on Discord or IRC (see [README.md](README.md)).\n\n## macOS\n1. If the Xcode Command Line Tools are not installed, download the tools [here](https://developer.apple.com/xcode/resources/), open your Terminal, and run the following command:\n\n    ```bash\n    xcode-select --install\n    ```\n\n2.  - If libpng is **not installed**, then go to [Installing libpng (macOS)](#installing-libpng-macos).\n- If devkitARM is **not installed**, then go to [Installing devkitARM (macOS)](#installing-devkitarm-macos).\n- Otherwise, **open the Terminal** and go to [Choosing where to store pokefirered (macOS)](#choosing-where-to-store-pokefirered-macos)\n\n### Installing libpng (macOS)\n<details>\n    <summary><i>Note for advanced users...</i></summary>\n\n>   This guide installs libpng via Homebrew as it is the easiest method, however advanced users can install libpng through other means if they so desire.\n</details>\n<details>\n    <summary><i><strong>Note for Apple Silicon (M1) Mac users...</strong></i></summary>\n\n>   Currently, Homebrew and libng must be installed via Rosetta on Apple Silicon Macs. Before continuing, create a [Terminal shell profile with Rosetta](https://www.astroworldcreations.com/blog/apple-silicon-and-legacy-command-line-software). Be sure to run the commands corresponding to Apple Silicon (M1).\n</details>\n\n1. Open the Terminal.\n2. If Homebrew is not installed, then install [Homebrew](https://brew.sh/) by following the instructions on the website.\n3. Run the following command to install libpng.\n\n    ```bash\n    brew install libpng # Intel Macs\n    /usr/local/bin/brew install libpng # Apple Silicon (M1) Macs\n    ```\n   libpng is now installed.\n\n   Continue to [Installing devkitARM (macOS)](#installing-devkitarm-macos) if **devkitARM is not installed**, otherwise, go to [Choosing where to store pokefirered (macOS)](#choosing-where-to-store-pokefirered-macos).\n\n### Installing devkitARM (macOS)\n1. Download the `devkitpro-pacman-installer.pkg` package from [here](https://github.com/devkitPro/pacman/releases).\n2. Open the package to install devkitPro pacman.\n3. In the Terminal, run the following commands to install devkitARM:\n\n    ```bash\n    sudo dkp-pacman -Sy\n    sudo dkp-pacman -S gba-dev\n    sudo dkp-pacman -S devkitarm-rules\n    ```\n\n   The command with gba-dev will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation.\n\n4. After the tools are installed, devkitARM must now be made accessible from anywhere by the system. To do so, run the following commands:\n\n    ```bash\n    export DEVKITPRO=/opt/devkitpro\n    echo \"export DEVKITPRO=$DEVKITPRO\" >> ~/.bashrc # Intel Macs\n    echo \"export DEVKITPRO=$DEVKITPRO\" >> ~/.zshrc # Apple Silicon (M1) Macs\n    export DEVKITARM=$DEVKITPRO/devkitARM\n    echo \"export DEVKITARM=$DEVKITARM\" >> ~/.bashrc # Intel Macs\n    echo \"export DEVKITARM=$DEVKITARM\" >> ~/.zshrc # Apple Silicon (M1) Macs\n\n    echo \"if [ -f ~/.bashrc ]; then . ~/.bashrc; fi\" >> ~/.bash_profile # Intel Macs\n    echo \"if [ -f ~/.zshrc ]; then . ~/.zshrc; fi\" >> ~/.zprofile # Apple Silicon (M1) Macs\n    ```\n\n### Choosing where to store pokefirered (macOS)\nAt this point, you can choose a folder to store pokefirered into. If you're okay with storing pokefirered in the user folder, then proceed to [Installation](#installation). Otherwise, you'll need to account for where pokefirered is stored when changing directory to the pokefirered folder.\n\nFor example, if you want to store pokefirered (and agbcc) in **~/Desktop/decomps**, enter this command to **change directory** to the desired folder:\n```bash\ncd Desktop/decomps\n```\nNote that the directory **must exist** in the folder system. If you want to store pokefirered in a dedicated folder that doesn't exist (e.g. the example provided above), then create the folder (e.g. using Finder) before executing the `cd` command.\n\n<details>\n    <summary><i>Note..</i>.</summary>\n\n>   Note: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd \"Desktop/decomp folder\"`\n</details>\n\nIf this works, then proceed to [Installation](#installation). Otherwise, ask for help on Discord or IRC (see [README.md](README.md)).\n\n## Linux\nOpen Terminal and enter the following commands, depending on which distro you're using.\n\n### Debian/Ubuntu-based distributions\nRun the following command to install the necessary packages:\n```bash\nsudo apt install build-essential binutils-arm-none-eabi git libpng-dev\n```\nThen proceed to [Choosing where to store pokefirered (Linux)](#choosing-where-to-store-pokefirered-linux).\n<details>\n    <summary><i>Note for legacy repos...</i></summary>\n\n>   If the repository you plan to build has an **[older revision of the INSTALL.md](https://github.com/pret/pokefirered/blob/571c598/INSTALL.md)**,\n>   then you will have to install devkitARM. Install all the above packages except binutils-arm-none-eabi, and follow the instructions to\n>   [install devkitARM on Debian/Ubuntu-based distributions](#installing-devkitarm-on-debianubuntu-based-distributions).\n</details>\n\n### Other distributions\n_(Specific instructions for other distributions would be greatly appreciated!)_\n\n1. Try to find the required software in its repositories:\n    - `gcc`\n    - `g++`\n    - `make`\n    - `git`\n    - `libpng-dev`\n\n2. Follow the instructions [here](https://devkitpro.org/wiki/devkitPro_pacman) to install devkitPro pacman. As a reminder, the goal is to configure an existing pacman installation to recognize devkitPro's repositories.\n3. Once devkitPro pacman is configured, run the following commands:\n\n    ```bash\n    sudo pacman -Sy\n    sudo pacman -S gba-dev\n    ```\n\n   The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation.\n\n### Choosing where to store pokefirered (Linux)\nAt this point, you can choose a folder to store pokefirered (and agbcc) into. If so, you'll have to account for the modified folder path when changing directory to the pokefirered folder.\n\nIf this works, then proceed to [Installation](#installation). Otherwise, ask for help on Discord or IRC (see [README.md](README.md)).\n\n## Installation\n\n<details>\n    <summary><i>Note for Windows users...</i></summary>\n\n>   Consider adding an exception for the `pokefirered` and/or `decomps` folder in Windows Security using\n>   [these instructions](https://support.microsoft.com/help/4028485). This prevents Microsoft Defender from\n>   scanning them which might improve performance while building.\n</details>\n\n1. If pokefirered is not already downloaded (some users may prefer to download pokefirered via a git client like GitHub Desktop), run:\n\n    ```bash\n    git clone https://github.com/pret/pokefirered\n    ```\n\n    <details>\n        <summary><i>Note for WSL1...</i></summary>\n\n   >   If you get an error stating `fatal: could not set 'core.filemode' to 'false'`, then run the following commands:\n   >   ```bash\n    >   cd\n    >   sudo umount /mnt/c\n    >   sudo mount -t drvfs C: /mnt/c -o metadata,noatime\n    >   cd <folder where pokefirered is to be stored>\n    >   ```\n   >   Where *\\<folder where pokefirered is to be stored>* is the path of the folder [where you chose to store pokefirered](#Choosing-where-to-store-pokefirered-WSL1). Then run the `git clone` command again.\n    </details>\n\n2. Install agbcc into pokefirered. The commands to run depend on certain conditions. **You should only follow one of the listed instructions**:\n- If agbcc has **not been built before** in the folder where you chose to store pokefirered, run the following commands to build and install it into pokefirered:\n\n    ```bash\n    git clone https://github.com/pret/agbcc\n    cd agbcc\n    ./build.sh\n    ./install.sh ../pokefirered\n    ```\n\n- **Otherwise**, if agbcc has been built before (e.g. if the git clone above fails), but was **last built on a different terminal** than the one currently used (only relevant to Windows, e.g. switching from msys2 to WSL1), then run the following commands to build and install it into pokefirered:\n\n    ```bash\n    cd agbcc\n    git clean -fX\n    ./build.sh\n    ./install.sh ../pokefirered\n    ```\n\n- **Otherwise**, if agbcc has been built before on the same terminal, run the following commands to install agbcc into pokefirered:\n\n    ```bash\n    cd agbcc\n    ./install.sh ../pokefirered\n    ```\n\n    <details>\n        <summary><i>Note...</i></summary>\n\n        > If building agbcc or pokefirered results in an error, try deleting the agbcc folder and re-installing agbcc as if it has not been built before.\n    </details>\n\n3. Once agbcc is installed, change directory back to the base directory where pokefirered and agbcc are stored:\n\n    ```bash\n    cd ..\n    ```\n\nNow you're ready to [build **pokefirered**](#build-pokefirered)\n## Build pokefirered\nIf you aren't in the pokefirered directory already, then **change directory** to the pokefirered folder:\n```bash\ncd pokefirered\n```\nTo build **pokefirered.gba** (Note: to speed up builds, see [Parallel builds](#parallel-builds)):\n```bash\nmake\n```\nIf it has built successfully you will have the output file **pokefirered.gba** in your project folder.\n<details>\n<summary>Note for Windows...</summary>\n> 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.\n</details>\n\n## Build pokeleafgreen and REV1\nPokemon FireRed and LeafGreen were both released together. As such, this project is capable of building both ROMs. To do so, simply run\n```bash\nmake leafgreen\n```\n\nThis project can also build the version 1.1 ROMs of both FireRed and LeafGreen. To build each, run\n```bash\nmake firered_rev1  # for FireRed 1.1\nmake leafgreen_rev1  # for LeafGreen 1.1\n```\n\n# Building guidance\n\n## Parallel builds\n\nSee [the GNU docs](https://www.gnu.org/software/make/manual/html_node/Parallel.html) and [this Stack Exchange thread](https://unix.stackexchange.com/questions/208568) for more information.\n\nTo speed up building, first get the value of `nproc` by running the following command:\n```bash\nnproc\n```\nBuilds can then be sped up by running the following command:\n```bash\nmake -j<output of nproc>\n```\nReplace `<output of nproc>` with the number that the `nproc` command returned.\n\n`nproc` is not available on macOS. The alternative is `sysctl -n hw.ncpu` ([relevant Stack Overflow thread](https://stackoverflow.com/questions/1715580)).\n\n## Compare ROM to the original\n\nFor contributing, or if you'd simply like to verify that your ROM is identical to the original game, run:\n```bash\nmake compare  # or compare_leafgreen, compare_firered_rev1, compare_leafgreen_rev1\n```\nIf it matches, you will see the following at the end of the output:\n```bash\npokefirered.gba: OK\n```\nIf there are any changes from the original game, you will instead see:\n```bash\npokefirered.gba: FAILED\nshasum: WARNING: 1 computed checksum did NOT match\n```\n\n## devkitARM's C compiler\n\nThis project supports the `arm-none-eabi-gcc` compiler included with devkitARM. If devkitARM (a.k.a. gba-dev) has already been installed as part of the platform-specific instructions, simply run:\n```bash\nmake modern  # or leafgreen_modern, firered_rev1_modern, leafgreen_rev1_modern\n```\nOtherwise, follow the instructions below to install devkitARM.\n### Installing devkitARM on WSL1\n\n1. `gdebi-core` must be installed beforehand in order to install devkitPro pacman (which facilitates the installation of devkitARM). Install this with the following command:\n\n    ```bash\n    sudo apt install gdebi-core\n    ```\n    <details>\n        <summary><i>Note...</i></summary>\n\n   >   If the above command does not work, try the above command but replacing `apt` with `apt-get`.\n    </details>\n\n2. Once `gdebi-core` is done installing, download the devkitPro pacman package [here](https://github.com/devkitPro/pacman/releases). The file to download is `devkitpro-pacman.amd64.deb`.\n3. Change directory to where the package was downloaded. For example, if the package file was saved to **C:\\Users\\\\_\\<user>_\\Downloads** (the Downloads location for most users), enter this command, where *\\<user> is your **Windows** username:\n\n    ```bash\n    cd /mnt/c/Users/<user>/Downloads\n    ```\n\n4. Once the directory has been changed to the folder containing the devkitPro pacman package, run the following commands to install devkitARM.\n\n    ```bash\n    sudo gdebi devkitpro-pacman.amd64.deb\n    sudo dkp-pacman -Sy\n    sudo dkp-pacman -S gba-dev\n    ```\n   The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation.\n\n    <details>\n        <summary><i>Note...</i></summary>\n\n   > Note: `devkitpro-pacman.amd64.deb` is the expected filename of the devkitPro package downloaded (for the first command). If the downloaded package filename differs, then use that filename instead.\n    </details>\n\n5. Run the following command to set devkitPro related environment variables (alternatively, close and re-open WSL):\n\n    ```bash\n    source /etc/profile.d/devkit-env.sh\n    ```\n\ndevkitARM is now installed.\n\n### Installing devkitARM on Debian/Ubuntu-based distributions\n1. If `gdebi-core` is not installed, run the following command:\n\n    ```bash\n    sudo apt install gdebi-core\n    ```\n2. Download the devkitPro pacman package [here](https://github.com/devkitPro/pacman/releases). The file to download is `devkitpro-pacman.amd64.deb`.\n3. Change directory to where the package was downloaded. Then, run the following commands to install devkitARM:\n\n    ```bash\n    sudo gdebi devkitpro-pacman.amd64.deb\n    sudo dkp-pacman -Sy\n    sudo dkp-pacman -S gba-dev\n    ```\n   The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation.\n\n   > Note: `devkitpro-pacman.amd64.deb` is the expected filename of the devkitPro package downloaded (for the first command). If the downloaded package filename differs, then use that filename instead.\n\n4. Run the following command to set devkitPro related environment variables (alternatively, close and re-open the Terminal):\n\n    ```bash\n    source /etc/profile.d/devkit-env.sh\n    ```\n\ndevkitARM is now installed.\n\n## Other toolchains\n\nTo build using a toolchain other than devkitARM, override the `TOOLCHAIN` environment variable with the path to your toolchain, which must contain the subdirectory `bin`.\n```bash\nmake TOOLCHAIN=\"/path/to/toolchain/here\"\n```\nThe following is an example:\n```bash\nmake TOOLCHAIN=\"/usr/local/arm-none-eabi\"\n```\nTo compile the `modern` target with this toolchain, the subdirectories `lib`, `include`, and `arm-none-eabi` must also be present.\n\n# Useful additional tools\n\n* [porymap](https://github.com/huderlem/porymap) for viewing and editing maps\n* [poryscript](https://github.com/huderlem/poryscript) for scripting ([VS Code extension](https://marketplace.visualstudio.com/items?itemName=karathan.poryscript))\n* [Tilemap Studio](https://github.com/Rangi42/tilemap-studio) for viewing and editing tilemaps\n"
  },
  {
    "path": "Makefile",
    "content": "TOOLCHAIN := $(DEVKITARM)\nCOMPARE ?= 0\n\n# don't use dkP's base_tools anymore\n# because the redefinition of $(CC) conflicts\n# with when we want to use $(CC) to preprocess files\n# thus, manually create the variables for the bin\n# files, or use arm-none-eabi binaries on the system\n# if dkP is not installed on this system\n\nifneq (,$(TOOLCHAIN))\nifneq ($(wildcard $(TOOLCHAIN)/bin),)\nexport PATH := $(TOOLCHAIN)/bin:$(PATH)\nendif\nendif\n\nPREFIX := arm-none-eabi-\nOBJCOPY := $(PREFIX)objcopy\nOBJDUMP := $(PREFIX)objdump\nAS := $(PREFIX)as\nLD := $(PREFIX)ld\n\n# note: the makefile must be set up so MODERNCC is never called\n# if MODERN=0\nMODERNCC := $(PREFIX)gcc\n\nifeq ($(OS),Windows_NT)\nEXE := .exe\nelse\nEXE :=\nendif\n\n# use arm-none-eabi-cpp for macOS\n# as macOS's default compiler is clang\n# and clang's preprocessor will warn on \\u\n# when preprocessing asm files, expecting a unicode literal\n# we can't unconditionally use arm-none-eabi-cpp\n# as installations which install binutils-arm-none-eabi\n# don't come with it\nifneq ($(MODERN),1)\n  ifeq ($(shell uname -s),Darwin)\n    CPP := $(PREFIX)cpp\n  else\n    CPP := $(CC) -E\n  endif\nelse\n  CPP := $(PREFIX)cpp\nendif\n\ninclude config.mk\n\nGCC_VER = $(shell $(CC) -dumpversion)\n\nifeq ($(MODERN),0)\nCC1             := tools/agbcc/bin/agbcc$(EXE)\noverride CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm\nLIBPATH := -L ../../tools/agbcc/lib\nelse\nCC1             := $(shell $(MODERNCC) --print-prog-name=cc1) -quiet\noverride CFLAGS += -mthumb -mthumb-interwork -O2 -mcpu=arm7tdmi -mabi=apcs-gnu -fno-toplevel-reorder -fno-aggressive-loop-optimizations -Wno-pointer-to-int-cast\nLIBPATH := -L $(shell dirname $(shell $(MODERNCC) --print-file-name=libgcc.a)) -L $(shell dirname $(shell $(MODERNCC) --print-file-name=libc.a))\nendif\n\nCPPFLAGS := -iquote include -D$(GAME_VERSION) -DREVISION=$(GAME_REVISION) -D$(GAME_LANGUAGE) -DMODERN=$(MODERN)\nifeq ($(MODERN),0)\nCPPFLAGS += -I tools/agbcc -I tools/agbcc/include -nostdinc -undef\nendif\n\nSHELL := /bin/bash -o pipefail\n\nROM := poke$(BUILD_NAME).gba\nOBJ_DIR := build/$(BUILD_NAME)\n\nELF = $(ROM:.gba=.elf)\nMAP = $(ROM:.gba=.map)\nSYM = $(ROM:.gba=.sym)\n\nC_SUBDIR = src\nDATA_C_SUBDIR = src/data\nASM_SUBDIR = asm\nDATA_ASM_SUBDIR = data\nSONG_SUBDIR = sound/songs\nMID_SUBDIR = sound/songs/midi\nSAMPLE_SUBDIR = sound/direct_sound_samples\nCRY_SUBDIR = sound/direct_sound_samples/cries\n\nC_BUILDDIR = $(OBJ_DIR)/$(C_SUBDIR)\nASM_BUILDDIR = $(OBJ_DIR)/$(ASM_SUBDIR)\nDATA_ASM_BUILDDIR = $(OBJ_DIR)/$(DATA_ASM_SUBDIR)\nSONG_BUILDDIR = $(OBJ_DIR)/$(SONG_SUBDIR)\nMID_BUILDDIR = $(OBJ_DIR)/$(MID_SUBDIR)\n\nASFLAGS := -mcpu=arm7tdmi --defsym $(GAME_VERSION)=1 --defsym REVISION=$(GAME_REVISION) --defsym $(GAME_LANGUAGE)=1 --defsym MODERN=$(MODERN)\n\nLDFLAGS = -Map ../../$(MAP)\n\nLIB := $(LIBPATH) -lc -lgcc\nifneq ($(MODERN),0)\nifneq ($(DEVKITARM),)\nifeq ($(TOOLCHAIN),$(DEVKITARM))\nLIB += -lsysbase -lc\nendif\nendif\nLIB += -lnosys\nendif\n\nSHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c\nGFX := tools/gbagfx/gbagfx\nAIF := tools/aif2pcm/aif2pcm\nMID := tools/mid2agb/mid2agb\nSCANINC := tools/scaninc/scaninc\nPREPROC := tools/preproc/preproc\nRAMSCRGEN := tools/ramscrgen/ramscrgen\nFIX := tools/gbafix/gbafix\nMAPJSON := tools/mapjson/mapjson\nJSONPROC := tools/jsonproc/jsonproc\n\nPERL := perl\n\n# Clear the default suffixes\n.SUFFIXES:\n# Don't delete intermediate files\n.SECONDARY:\n# Delete files that weren't built properly\n.DELETE_ON_ERROR:\n\n# Secondary expansion is required for dependency variables in object rules.\n.SECONDEXPANSION:\n\n$(shell mkdir -p $(C_BUILDDIR) $(ASM_BUILDDIR) $(DATA_ASM_BUILDDIR) $(SONG_BUILDDIR) $(MID_BUILDDIR))\n\ninfoshell = $(foreach line, $(shell $1 | sed \"s/ /__SPACE__/g\"), $(info $(subst __SPACE__, ,$(line))))\n\n# Build tools when building the rom\n# Disable dependency scanning for clean/tidy/tools\nifeq (,$(filter-out all compare syms modern,$(MAKECMDGOALS)))\n$(call infoshell, $(MAKE) tools)\nelse\nNODEP := 1\nendif\n\nC_SRCS := $(wildcard $(C_SUBDIR)/*.c)\nC_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))\n\nC_ASM_SRCS += $(wildcard $(C_SUBDIR)/*.s $(C_SUBDIR)/*/*.s $(C_SUBDIR)/*/*/*.s)\nC_ASM_OBJS := $(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o,$(C_ASM_SRCS))\n\nASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s)\nASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS))\n\n# get all the data/*.s files EXCEPT the ones with specific rules\nREGULAR_DATA_ASM_SRCS := $(filter-out $(DATA_ASM_SUBDIR)/maps.s $(DATA_ASM_SUBDIR)/map_events.s, $(wildcard $(DATA_ASM_SUBDIR)/*.s))\n\nDATA_ASM_SRCS := $(wildcard $(DATA_ASM_SUBDIR)/*.s)\nDATA_ASM_OBJS := $(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o,$(DATA_ASM_SRCS))\n\nSONG_SRCS := $(wildcard $(SONG_SUBDIR)/*.s)\nSONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS))\n\nMID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid)\nMID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS))\n\nOBJS := $(C_OBJS) $(C_ASM_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS)\nOBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS))\n\nTOOLDIRS := $(filter-out tools/agbcc tools/binutils tools/analyze_source,$(wildcard tools/*))\nTOOLBASE = $(TOOLDIRS:tools/%=%)\nTOOLS = $(foreach tool,$(TOOLBASE),tools/$(tool)/$(tool)$(EXE))\n\nALL_BUILDS := firered firered_rev1 leafgreen leafgreen_rev1\nALL_BUILDS += $(ALL_BUILDS:%=%_modern)\n\n.PHONY: all rom tools clean-tools mostlyclean clean compare tidy syms $(TOOLDIRS) $(ALL_BUILDS) $(ALL_BUILDS:%=compare_%) modern\n\nMAKEFLAGS += --no-print-directory\n\nAUTO_GEN_TARGETS :=\n\nall: tools rom\n\nsyms: $(SYM)\n\nrom: $(ROM)\nifeq ($(COMPARE),1)\n\t@$(SHA1) $(BUILD_NAME).sha1\nendif\n\ntools: $(TOOLDIRS)\n\n$(TOOLDIRS):\n\t@$(MAKE) -C $@\n\n# For contributors to make sure a change didn't affect the contents of the ROM.\ncompare:\n\t@$(MAKE) COMPARE=1\n\nmostlyclean: tidy\n\trm -f $(SAMPLE_SUBDIR)/*.bin\n\trm -f $(CRY_SUBDIR)/*.bin\n\t$(RM) $(SONG_OBJS) $(MID_SUBDIR)/*.s\n\tfind . \\( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \\) -exec rm {} +\n\t$(RM) $(DATA_ASM_SUBDIR)/layouts/layouts.inc $(DATA_ASM_SUBDIR)/layouts/layouts_table.inc\n\t$(RM) $(DATA_ASM_SUBDIR)/maps/connections.inc $(DATA_ASM_SUBDIR)/maps/events.inc $(DATA_ASM_SUBDIR)/maps/groups.inc $(DATA_ASM_SUBDIR)/maps/headers.inc\n\tfind $(DATA_ASM_SUBDIR)/maps \\( -iname 'connections.inc' -o -iname 'events.inc' -o -iname 'header.inc' \\) -exec rm {} +\n\t$(RM) $(AUTO_GEN_TARGETS)\n\nclean-tools:\n\t@$(foreach tooldir,$(TOOLDIRS),$(MAKE) clean -C $(tooldir);)\n\nclean: mostlyclean clean-tools\n\ntidy:\n\t$(RM) $(ALL_BUILDS:%=poke%{.gba,.elf,.map})\n\t$(RM) -r build\n\ninclude graphics_file_rules.mk\ninclude tileset_rules.mk\ninclude map_data_rules.mk\ninclude spritesheet_rules.mk\ninclude json_data_rules.mk\ninclude songs.mk\n\n%.s: ;\n%.png: ;\n%.pal: ;\n%.aif: ;\n\n%.1bpp: %.png  ; $(GFX) $< $@\n%.4bpp: %.png  ; $(GFX) $< $@\n%.8bpp: %.png  ; $(GFX) $< $@\n%.gbapal: %.pal ; $(GFX) $< $@\n%.gbapal: %.png ; $(GFX) $< $@\n%.lz: % ; $(GFX) $< $@\n%.rl: % ; $(GFX) $< $@\n$(CRY_SUBDIR)/%.bin: $(CRY_SUBDIR)/%.aif ; $(AIF) $< $@ --compress\nsound/%.bin: sound/%.aif ; $(AIF) $< $@\nsound/songs/%.s: sound/songs/%.mid\n\t$(MID) $< $@\n\nifeq ($(MODERN),0)\n$(C_BUILDDIR)/agb_flash.o: CFLAGS := -O -mthumb-interwork\n$(C_BUILDDIR)/agb_flash_1m.o: CFLAGS := -O -mthumb-interwork\n$(C_BUILDDIR)/agb_flash_mx.o: CFLAGS := -O -mthumb-interwork\n\n$(C_BUILDDIR)/m4a.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)\n\n$(C_BUILDDIR)/isagbprn.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)\n$(C_BUILDDIR)/isagbprn.o: CFLAGS := -mthumb-interwork\n\n$(C_BUILDDIR)/trainer_tower.o: CFLAGS += -ffreestanding\n$(C_BUILDDIR)/battle_anim_flying.o: CFLAGS += -ffreestanding\n\n$(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm$(EXE)\n$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet\nelse\n$(C_BUILDDIR)/berry_crush_2.o: CFLAGS += -Wno-address-of-packed-member\n$(C_BUILDDIR)/berry_crush_3.o: CFLAGS += -Wno-address-of-packed-member\n$(C_BUILDDIR)/braille_text.o: CFLAGS += -Wno-address-of-packed-member\n$(C_BUILDDIR)/text.o: CFLAGS += -Wno-address-of-packed-member\n$(C_BUILDDIR)/battle_tower.o: CFLAGS += -Wno-div-by-zero\n$(C_BUILDDIR)/librfu_intr.o: override CFLAGS += -marm -mthumb-interwork -O2 -mtune=arm7tdmi -march=armv4t -mabi=apcs-gnu -fno-toplevel-reorder -fno-aggressive-loop-optimizations -Wno-pointer-to-int-cast\nendif\n\nifeq ($(NODEP),1)\n$(C_BUILDDIR)/%.o: c_dep :=\nelse\n$(C_BUILDDIR)/%.o: c_dep = $(shell [[ -f $(C_SUBDIR)/$*.c ]] && $(SCANINC) -I include -I tools/agbcc/include $(C_SUBDIR)/$*.c)\nendif\n\nifeq ($(DINFO),1)\noverride CFLAGS += -g\nendif\n\n$(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep)\n\t@$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i\n\t@$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(C_BUILDDIR)/$*.s\n\t@echo -e \".text\\n\\t.align\\t2, 0 @ Don't pad with nop\\n\" >> $(C_BUILDDIR)/$*.s\n\t$(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s\n\nifeq ($(NODEP),1)\n$(C_BUILDDIR)/%.o: c_asm_dep :=\nelse\n$(C_BUILDDIR)/%.o: c_asm_dep = $(shell [[ -f $(C_SUBDIR)/$*.s ]] && $(SCANINC) -I \"\" $(C_SUBDIR)/$*.s)\nendif\n\n$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s $$(c_asm_dep)\n\t$(AS) $(ASFLAGS) -o $@ $<\n\nifeq ($(NODEP),1)\n$(DATA_ASM_BUILDDIR)/%.o: data_dep :=\nelse\n$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) -I . $(DATA_ASM_SUBDIR)/$*.s)\nendif\n\nifeq ($(NODEP),1)\n$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s\n\t$(AS) $(ASFLAGS) -o $@ $<\nelse\ndefine ASM_DEP\n$1: $2 $$(shell $(SCANINC) -I include -I \"\" $2)\n\t$$(AS) $$(ASFLAGS) -o $$@ $$<\nendef\n$(foreach src, $(ASM_SRCS), $(eval $(call ASM_DEP,$(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o, $(src)),$(src))))\nendif\n\nifeq ($(NODEP),1)\n$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s\n\t$(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@\nelse\ndefine DATA_ASM_DEP\n$1: $2 $$(shell $(SCANINC) -I include -I \"\" $2)\n\t$$(PREPROC) $$< charmap.txt | $$(CPP) -I include - | $$(AS) $$(ASFLAGS) -o $$@\nendef\n$(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call DATA_ASM_DEP,$(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o, $(src)),$(src))))\nendif\n\n$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s\n\t$(AS) $(ASFLAGS) -I sound -o $@ $<\n\n$(OBJ_DIR)/sym_bss.ld: sym_bss.txt\n\t$(RAMSCRGEN) .bss $< ENGLISH > $@\n\n$(OBJ_DIR)/sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt)\n\t$(RAMSCRGEN) COMMON $< ENGLISH -c $(C_BUILDDIR),common_syms > $@\n\n$(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt\n\t$(RAMSCRGEN) ewram_data $< ENGLISH > $@\n\nifeq ($(MODERN),0)\nLD_SCRIPT := ld_script.ld\nLD_SCRIPT_DEPS := $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld\nelse\nLD_SCRIPT := ld_script_modern.ld\nLD_SCRIPT_DEPS :=\nendif\n\n$(ELF): $(LD_SCRIPT) $(LD_SCRIPT_DEPS) $(OBJS)\n\t@cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< -o ../../$@ $(OBJS_REL) $(LIB)\n\t$(FIX) $@ -t\"$(TITLE)\" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(GAME_REVISION) --silent\n\n$(ROM): $(ELF)\n\t$(OBJCOPY) -O binary --gap-fill 0xFF --pad-to 0x9000000 $< $@\n\n# \"friendly\" target names for convenience sake\nfirered:                ; @$(MAKE) GAME_VERSION=FIRERED\nfirered_rev1:           ; @$(MAKE) GAME_VERSION=FIRERED GAME_REVISION=1\nleafgreen:              ; @$(MAKE) GAME_VERSION=LEAFGREEN\nleafgreen_rev1:         ; @$(MAKE) GAME_VERSION=LEAFGREEN GAME_REVISION=1\n\ncompare_firered:        ; @$(MAKE) GAME_VERSION=FIRERED COMPARE=1\ncompare_firered_rev1:   ; @$(MAKE) GAME_VERSION=FIRERED GAME_REVISION=1 COMPARE=1\ncompare_leafgreen:      ; @$(MAKE) GAME_VERSION=LEAFGREEN COMPARE=1\ncompare_leafgreen_rev1: ; @$(MAKE) GAME_VERSION=LEAFGREEN GAME_REVISION=1 COMPARE=1\n\nfirered_modern:        ; @$(MAKE) GAME_VERSION=FIRERED MODERN=1\nfirered_rev1_modern:   ; @$(MAKE) GAME_VERSION=FIRERED GAME_REVISION=1 MODERN=1\nleafgreen_modern:      ; @$(MAKE) GAME_VERSION=LEAFGREEN MODERN=1\nleafgreen_rev1_modern: ; @$(MAKE) GAME_VERSION=LEAFGREEN GAME_REVISION=1 MODERN=1\n\nmodern: ; @$(MAKE) MODERN=1\n\n###################\n### Symbol file ###\n###################\n\n$(SYM): $(ELF)\n\t$(OBJDUMP) -t $< | sort -u | grep -E \"^0[2389]\" | $(PERL) -p -e 's/^(\\w{8}) (\\w).{6} \\S+\\t(\\w{8}) (\\S+)$$/\\1 \\2 \\3 \\4/g' > $@\n"
  },
  {
    "path": "README.md",
    "content": "# Pokémon FireRed and LeafGreen+\n\nThis is the repository for the Pokémon FireRed and LeafGreen+ hack, based on [pret's decompilation of Pokémon FireRed and LeafGreen](https://github.com/pret/pokefirered).\n* [**View the FAQ**](https://github.com/Deokishisu/FRLG-Plus/blob/master/FAQ.md)\n* [**View the full features list**](https://github.com/Deokishisu/FRLG-Plus/blob/master/FEATURES.md)\n* [**Download the patch**](https://github.com/Deokishisu/FRLG-Plus/releases/latest)\n* Please direct questions and comments to [**the PokéCommunity thread**](https://www.pokecommunity.com/showthread.php?t=454382).\n\n* Support Development\n  * [I have a Ko-fi link](https://ko-fi.com/deokishisu), tips are appreciated!\n\n## See also\n\nFor other pret projects, see [pret.github.io](https://pret.github.io/).\n\n## Discord server for pret\n\nYou can find pret on [Discord](https://discord.gg/d5dubZ3). This is not the Discord server for this hack.\n"
  },
  {
    "path": "asm/macros/asm.inc",
    "content": "\t.ifndef GUARD_ASM_MACROS_ASM_INC\n\t.set GUARD_ASM_MACROS_ASM_INC, 1\n\n\t.macro inc x\n\t.set \\x, \\x + 1\n\t.endm\n\n\t.macro enum_start x=0\n\t.set __enum__, \\x\n\t.endm\n\n\t.macro enum constant\n\t.equiv \\constant, __enum__\n\tinc __enum__\n\t.endm\n\n\t.endif @ GUARD_ASM_MACROS_ASM_INC\n"
  },
  {
    "path": "asm/macros/battle_ai_script.inc",
    "content": "\t.macro if_random_less_than percent:req, ptr:req\n\t.byte 0x00\n\t.byte \\percent\n\t.4byte \\ptr\n\t.endm\n\n\t@ unused\n\t.macro if_random_greater_than percent:req, ptr:req\n\t.byte 0x01\n\t.byte \\percent\n\t.4byte \\ptr\n\t.endm\n\n\t@ unused\n\t.macro if_random_equal ptr:req\n\t.byte 0x02\n\t.4byte \\ptr\n\t.endm\n\n\t@ unused\n\t.macro if_random_not_equal ptr:req\n\t.byte 0x03\n\t.4byte \\ptr\n\t.endm\n\n\t.macro score score:req\n\t.byte 0x04\n\t.byte \\score\n\t.endm\n\n\t.macro if_hp_less_than battler:req, percent:req, ptr:req\n\t.byte 0x05\n\t.byte \\battler\n\t.byte \\percent\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_hp_more_than battler:req, percent:req, ptr:req\n\t.byte 0x06\n\t.byte \\battler\n\t.byte \\percent\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_hp_equal battler:req, percent:req, ptr:req\n\t.byte 0x07\n\t.byte \\battler\n\t.byte \\percent\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_hp_not_equal battler:req, percent:req, ptr:req\n\t.byte 0x08\n\t.byte \\battler\n\t.byte \\percent\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_status battler:req, status:req, ptr:req\n\t.byte 0x09\n\t.byte \\battler\n\t.4byte \\status\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_not_status battler:req, status:req, ptr:req\n\t.byte 0x0a\n\t.byte \\battler\n\t.4byte \\status\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_status2 battler:req, status:req, ptr:req\n\t.byte 0x0b\n\t.byte \\battler\n\t.4byte \\status\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_not_status2 battler:req, status:req, ptr:req\n\t.byte 0x0c\n\t.byte \\battler\n\t.4byte \\status\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_status3 battler:req, status:req, ptr:req\n\t.byte 0x0d\n\t.byte \\battler\n\t.4byte \\status\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_not_status3 battler:req, status:req, ptr:req\n\t.byte 0x0e\n\t.byte \\battler\n\t.4byte \\status\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_side_affecting battler:req, status:req, ptr:req\n\t.byte 0x0f\n\t.byte \\battler\n\t.4byte \\status\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_not_side_affecting battler:req, status:req, ptr:req\n\t.byte 0x10\n\t.byte \\battler\n\t.4byte \\status\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_less_than value:req, ptr:req\n\t.byte 0x11\n\t.byte \\value\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_more_than value:req, ptr:req\n\t.byte 0x12\n\t.byte \\value\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_equal value:req, ptr:req\n\t.byte 0x13\n\t.byte \\value\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_not_equal value:req, ptr:req\n\t.byte 0x14\n\t.byte \\value\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_less_than_ptr value:req, ptr:req\n\t.byte 0x15\n\t.4byte \\value\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_more_than_ptr value:req, ptr:req\n\t.byte 0x16\n\t.4byte \\value\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_equal_ptr value:req, ptr:req\n\t.byte 0x17\n\t.4byte \\value\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_not_equal_ptr value:req, ptr:req\n\t.byte 0x18\n\t.4byte \\value\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_move move:req, ptr:req\n\t.byte 0x19\n\t.2byte \\move\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_not_move move:req, ptr:req\n\t.byte 0x1a\n\t.2byte \\move\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_in_bytes list:req, ptr:req\n\t.byte 0x1b\n\t.4byte \\list\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_not_in_bytes list:req, ptr:req\n\t.byte 0x1c\n\t.4byte \\list\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_in_hwords list:req, ptr:req\n\t.byte 0x1d\n\t.4byte \\list\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_not_in_hwords list:req, ptr:req\n\t.byte 0x1e\n\t.4byte \\list\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_user_has_attacking_move ptr:req\n\t.byte 0x1f\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_user_has_no_attacking_moves ptr:req\n\t.byte 0x20\n\t.4byte \\ptr\n\t.endm\n\n\t.macro get_turn_count\n\t.byte 0x21\n\t.endm\n\n\t.macro get_type byte:req\n\t.byte 0x22\n\t.byte \\byte\n\t.endm\n\n\t@ unused\n\t.macro get_considered_move_power\n\t.byte 0x23\n\t.endm\n\n\t.macro get_how_powerful_move_is\n\t.byte 0x24\n\t.endm\n\n\t.macro get_last_used_move battler:req\n\t.byte 0x25\n\t.byte \\battler\n\t.endm\n\n\t.macro if_equal_ type:req, ptr:req\n\t.byte 0x26\n\t.byte \\type\n\t.4byte \\ptr\n\t.endm\n\n\t@ unused\n\t.macro if_not_equal_ type:req, ptr:req\n\t.byte 0x27\n\t.byte \\type\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_would_go_first battler:req, ptr:req\n\t.byte 0x28\n\t.byte \\battler\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_would_not_go_first battler:req, ptr:req\n\t.byte 0x29\n\t.byte \\battler\n\t.4byte \\ptr\n\t.endm\n\n\t@ nullsub\n\t.macro ai_2a\n\t.byte 0x2a\n\t.endm\n\n\t@ nullsub\n\t.macro ai_2b\n\t.byte 0x2b\n\t.endm\n\n\t.macro count_alive_pokemon battler:req\n\t.byte 0x2c\n\t.byte \\battler\n\t.endm\n\n\t@ unused\n\t.macro get_considered_move\n\t.byte 0x2d\n\t.endm\n\n\t.macro get_considered_move_effect\n\t.byte 0x2e\n\t.endm\n\n\t.macro get_ability battler:req\n\t.byte 0x2f\n\t.byte \\battler\n\t.endm\n\n\t@ unused\n\t.macro get_highest_type_effectiveness\n\t.byte 0x30\n\t.endm\n\n\t.macro if_type_effectiveness effectiveness:req, ptr:req\n\t.byte 0x31\n\t.byte \\effectiveness\n\t.4byte \\ptr\n\t.endm\n\n\t@ nullsub\n\t.macro ai_32\n\t.byte 0x32\n\t.endm\n\n\t@ nullsub\n\t.macro ai_33\n\t.byte 0x33\n\t.endm\n\n\t.macro if_status_in_party battler:req, status:req, ptr:req\n\t.byte 0x34\n\t.byte \\battler\n\t.4byte \\status\n\t.4byte \\ptr\n\t.endm\n\n\t@ bugged\n\t.macro if_status_not_in_party battler:req, status:req, ptr:req\n\t.byte 0x35\n\t.byte \\battler\n\t.4byte \\status\n\t.4byte \\ptr\n\t.endm\n\n\t.macro get_weather\n\t.byte 0x36\n\t.endm\n\n\t.macro if_effect byte:req, ptr:req\n\t.byte 0x37\n\t.byte \\byte\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_not_effect byte:req, ptr:req\n\t.byte 0x38\n\t.byte \\byte\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_stat_level_less_than battler:req, stat:req, level:req, ptr:req\n\t.byte 0x39\n\t.byte \\battler\n\t.byte \\stat\n\t.byte \\level\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_stat_level_more_than battler:req, stat:req, level:req, ptr:req\n\t.byte 0x3a\n\t.byte \\battler\n\t.byte \\stat\n\t.byte \\level\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_stat_level_equal battler:req, stat:req, level:req, ptr:req\n\t.byte 0x3b\n\t.byte \\battler\n\t.byte \\stat\n\t.byte \\level\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_stat_level_not_equal battler:req, stat:req, level:req, ptr:req\n\t.byte 0x3c\n\t.byte \\battler\n\t.byte \\stat\n\t.byte \\level\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_can_faint ptr:req\n\t.byte 0x3d\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_cant_faint ptr:req\n\t.byte 0x3e\n\t.4byte \\ptr\n\t.endm\n\n\t@ unused\n\t.macro if_has_move battler:req, move:req, ptr:req\n\t.byte 0x3f\n\t.byte \\battler\n\t.2byte \\move\n\t.4byte \\ptr\n\t.endm\n\n\t@ unused\n\t.macro if_doesnt_have_move battler:req, move:req, ptr:req\n\t.byte 0x40\n\t.byte \\battler\n\t.2byte \\move\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_has_move_with_effect battler:req, effect:req, ptr:req\n\t.byte 0x41\n\t.byte \\battler\n\t.byte \\effect\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_doesnt_have_move_with_effect battler:req, effect:req, ptr:req\n\t.byte 0x42\n\t.byte \\battler\n\t.byte \\effect\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_any_move_disabled_or_encored battler:req, byte:req, ptr:req\n\t.byte 0x43\n\t.byte \\battler\n\t.byte \\byte\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_curr_move_disabled_or_encored battler:req, ptr:req\n\t.byte 0x44\n\t.byte \\battler\n\t.4byte \\ptr\n\t.endm\n\n\t.macro flee\n\t.byte 0x45\n\t.endm\n\n\t.macro if_random_safari_flee ptr:req\n\t.byte 0x46\n\t.4byte \\ptr\n\t.endm\n\n\t.macro watch\n\t.byte 0x47\n\t.endm\n\n\t.macro get_hold_effect battler:req\n\t.byte 0x48\n\t.byte \\battler\n\t.endm\n\n\t.macro get_gender battler:req\n\t.byte 0x49\n\t.byte \\battler\n\t.endm\n\n\t.macro is_first_turn_for battler:req\n\t.byte 0x4a\n\t.byte \\battler\n\t.endm\n\n\t.macro get_stockpile_count battler:req\n\t.byte 0x4b\n\t.byte \\battler\n\t.endm\n\n\t.macro is_double_battle\n\t.byte 0x4c\n\t.endm\n\n\t.macro get_used_held_item battler:req\n\t.byte 0x4d\n\t.byte \\battler\n\t.endm\n\n\t.macro get_move_type_from_result\n\t.byte 0x4e\n\t.endm\n\n\t.macro get_move_power_from_result\n\t.byte 0x4f\n\t.endm\n\n\t.macro get_move_effect_from_result\n\t.byte 0x50\n\t.endm\n\n\t.macro get_protect_count battler:req\n\t.byte 0x51\n\t.byte \\battler\n\t.endm\n\n\t@ nullsub\n\t.macro ai_52\n\t.byte 0x52\n\t.endm\n\n\t@ nullsub\n\t.macro ai_53\n\t.byte 0x53\n\t.endm\n\n\t@ nullsub\n\t.macro ai_54\n\t.byte 0x54\n\t.endm\n\n\t@ nullsub\n\t.macro ai_55\n\t.byte 0x55\n\t.endm\n\n\t@ nullsub\n\t.macro ai_56\n\t.byte 0x56\n\t.endm\n\n\t@ nullsub\n\t.macro ai_57\n\t.byte 0x57\n\t.endm\n\n\t@ unused\n\t.macro call ptr:req\n\t.byte 0x58\n\t.4byte \\ptr\n\t.endm\n\n\t.macro goto ptr:req\n\t.byte 0x59\n\t.4byte \\ptr\n\t.endm\n\n\t.macro end\n\t.byte 0x5a\n\t.endm\n\n\t.macro if_level_cond cond:req, ptr:req\n\t.byte 0x5b\n\t.byte \\cond\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_user_higher_level ptr:req\n\tif_level_cond 0, \\ptr\n\t.endm\n\n\t.macro if_target_higher_level ptr:req\n\tif_level_cond 1, \\ptr\n\t.endm\n\n\t.macro if_equal_levels ptr:req\n\tif_level_cond 2, \\ptr\n\t.endm\n\n\t@ unused\n\t.macro if_target_taunted ptr:req\n\t.byte 0x5c\n\t.4byte \\ptr\n\t.endm\n\n\t.macro if_target_not_taunted ptr:req\n\t.byte 0x5d\n\t.4byte \\ptr\n\t.endm\n\n@ useful script macros\n\t.macro get_curr_move_type\n\tget_type AI_TYPE_MOVE\n\t.endm\n\t\n\t.macro get_user_type1\n\tget_type AI_TYPE1_USER\n\t.endm\n\t\n\t.macro get_user_type2\n\tget_type AI_TYPE2_USER\n\t.endm\n\t\n\t.macro get_target_type1\n\tget_type AI_TYPE1_TARGET\n\t.endm\n\t\n\t.macro get_target_type2\n\tget_type AI_TYPE2_TARGET\n\t.endm\n\n\t.macro if_target_faster ptr:req\n\tif_would_go_first 1, \\ptr\n\t.endm\n\t\n\t.macro if_user_faster ptr:req\n\tif_would_go_first 0, \\ptr\n\t.endm\n\n\t.macro if_double_battle ptr:req\n\tis_double_battle\n\tif_equal 1, \\ptr\n\t.endm\n\t\n\t.macro if_not_double_battle ptr:req\n\tis_double_battle\n\tif_equal 0, \\ptr\n\t.endm\n\n\t.macro if_any_move_disabled battler:req, ptr:req\n\tif_any_move_disabled_or_encored \\battler, 0, \\ptr\n\t.endm\n\t\n\t.macro if_any_move_encored battler:req, ptr:req\n\tif_any_move_disabled_or_encored \\battler, 1, \\ptr\n\t.endm\n"
  },
  {
    "path": "asm/macros/battle_anim.inc",
    "content": "\t.macro loadsprite id\n\t.byte 0x00\n\t.2byte \\id\n\t.endm\n\n\t.macro unloadsprite id\n\t.byte 0x01\n\t.2byte \\id\n\t.endm\n\n\t.macro sprite template, priority, argv:vararg\n\t.byte 0x02\n\t.4byte \\template\n\t.byte \\priority\n\t.byte (.Lsprite_\\@_2 - .Lsprite_\\@_1) / 2\n.Lsprite_\\@_1:\n\t.2byte \\argv\n.Lsprite_\\@_2:\n\t.endm\n\n\t.macro createtask addr, priority, argv:vararg\n\t.byte 0x03\n\t.4byte \\addr\n\t.byte \\priority\n\t.byte (.Lcreatetask_\\@_2 - .Lcreatetask_\\@_1) / 2\n.Lcreatetask_\\@_1:\n\t.2byte \\argv\n.Lcreatetask_\\@_2:\n\t.endm\n\n\t.macro pause delay\n\t.byte 0x04\n\t.byte \\delay\n\t.endm\n\n\t.macro wait\n\t.byte 0x05\n\t.endm\n\n\t.macro hang1\n\t.byte 0x06\n\t.endm\n\n\t.macro hang2\n\t.byte 0x07\n\t.endm\n\n\t.macro end\n\t.byte 0x08\n\t.endm\n\n\t.macro playse id\n\t.byte 0x09\n\t.2byte \\id\n\t.endm\n\n\t.macro monbg which\n\t.byte 0x0A\n\t.byte \\which\n\t.endm\n\n\t.macro clearmonbg which\n\t.byte 0x0B\n\t.byte \\which\n\t.endm\n\n\t.macro setalpha eva, evb\n\t.byte 0x0C\n\t.2byte ((\\evb) << 8) | (\\eva)\n\t.endm\n\n\t.macro blendoff\n\t.byte 0x0D\n\t.endm\n\n\t.macro call addr\n\t.byte 0x0E\n\t.4byte \\addr\n\t.endm\n\n\t.macro ret\n\t.byte 0x0F\n\t.endm\n\n\t.macro setvar var_num, value\n\t.byte 0x10\n\t.byte \\var_num\n\t.2byte \\value\n\t.endm\n\n\t.macro ifelse addr1, addr2\n\t.byte 0x11\n\t.4byte \\addr1\n\t.4byte \\addr2\n\t.endm\n\n\t.macro jumpif cond, addr\n\t.byte 0x12\n\t.byte \\cond\n\t.4byte \\addr\n\t.endm\n\n\t.macro jump addr\n\t.byte 0x13\n\t.4byte \\addr\n\t.endm\n\n\t.macro fadetobg id\n\t.byte 0x14\n\t.byte \\id\n\t.endm\n\n\t.macro restorebg\n\t.byte 0x15\n\t.endm\n\n\t.macro waitbgfadeout\n\t.byte 0x16\n\t.endm\n\n\t.macro waitbgfadein\n\t.byte 0x17\n\t.endm\n\n\t.macro changebg id\n\t.byte 0x18\n\t.byte \\id\n\t.endm\n\n\t.macro panse_19 id, pan\n\t.byte 0x19\n\t.2byte \\id\n\t.byte \\pan\n\t.endm\n\n\t.macro setpan pan\n\t.byte 0x1A\n\t.byte \\pan\n\t.endm\n\n\t.macro panse_1B id, pan_start, pan_end, step, delay\n\t.byte 0x1B\n\t.2byte \\id\n\t.byte \\pan_start\n\t.byte \\pan_end\n\t.byte \\step\n\t.byte \\delay\n\t.endm\n\n\t.macro panse_1C id, pan, delay, count\n\t.byte 0x1C\n\t.2byte \\id\n\t.byte \\pan\n\t.byte \\delay\n\t.byte \\count\n\t.endm\n\n\t.macro panse_1D id, pan, count\n\t.byte 0x1D\n\t.2byte \\id\n\t.byte \\pan\n\t.byte \\count\n\t.endm\n\n\t.macro setbldcnt bldcnt\n\t.byte 0x1E\n\t.2byte \\bldcnt\n\t.endm\n\n\t.macro createtask_1F addr, argv:vararg\n\t.byte 0x1F\n\t.4byte \\addr\n\t.byte (.Lcreatetask_1F_\\@_2 - .Lcreatetask_1F_\\@_1) / 2\n.Lcreatetask_1F_\\@_1:\n\t.2byte \\argv\n.Lcreatetask_1F_\\@_2:\n\t.endm\n\n\t.macro waitsound\n\t.byte 0x20\n\t.endm\n\n\t.macro jumpvareq var_num, value, addr\n\t.byte 0x21\n\t.byte \\var_num\n\t.2byte \\value\n\t.4byte \\addr\n\t.endm\n\n\t.macro monbg_22 unk\n\t.byte 0x22\n\t.byte \\unk\n\t.endm\n\n\t.macro clearmonbg_23 unk\n\t.byte 0x23\n\t.byte \\unk\n\t.endm\n\n\t.macro jumpunkcond addr\n\t.byte 0x24\n\t.4byte \\addr\n\t.endm\n\n\t.macro fadetobg_25 a, b, c\n\t.byte 0x25\n\t.byte \\a\n\t.byte \\b\n\t.byte \\c\n\t.endm\n\n\t.macro panse_26 id, pan_start, pan_end, step, delay\n\t.byte 0x26\n\t.2byte \\id\n\t.byte \\pan_start\n\t.byte \\pan_end\n\t.byte \\step\n\t.byte \\delay\n\t.endm\n\n\t.macro panse_27 id, pan_start, pan_end, step, delay\n\t.byte 0x27\n\t.2byte \\id\n\t.byte \\pan_start\n\t.byte \\pan_end\n\t.byte \\step\n\t.byte \\delay\n\t.endm\n\n\t.macro monbgprio_28 unk\n\t.byte 0x28\n\t.byte \\unk\n\t.endm\n\n\t.macro monbgprio_29\n\t.byte 0x29\n\t.endm\n\n\t.macro monbgprio_2A unk\n\t.byte 0x2A\n\t.byte \\unk\n\t.endm\n\n\t.macro invisible side\n\t.byte 0x2B\n\t.byte \\side\n\t.endm\n\n\t.macro visible side\n\t.byte 0x2C\n\t.byte \\side\n\t.endm\n\n\t.macro doublebattle_2D unk\n\t.byte 0x2D\n\t.byte \\unk\n\t.endm\n\n\t.macro doublebattle_2E unk\n\t.byte 0x2E\n\t.byte \\unk\n\t.endm\n\n\t.macro stopsound\n\t.byte 0x2F\n\t.endm\n"
  },
  {
    "path": "asm/macros/battle_anim_script.inc",
    "content": "@ commands\n\n\t.macro loadspritegfx tag:req\n\t.byte 0x0\n\t.2byte \\tag\n\t.endm\n\n\t.macro unloadspritegfx tag:req\n\t.byte 0x1\n\t.2byte \\tag\n\t.endm\n\n.macro createsprite template:req, anim_battler:req, subpriority_offset:req, argv:vararg\n\t.byte 0x02\n\t.4byte \\template\n\t.if \\anim_battler == ANIM_TARGET\n\t.byte ANIMSPRITE_IS_TARGET | (\\subpriority_offset & 0x7F)\n\t.else\n\t.byte (\\subpriority_offset & 0x7F)\n\t.endif\n\t.byte (.Lsprite_\\@_2 - .Lsprite_\\@_1) / 2\n.Lsprite_\\@_1:\n\t.2byte \\argv\n.Lsprite_\\@_2:\n\t.endm\n\n\t.macro createvisualtask addr:req, priority:req, argv:vararg\n\t.byte 0x03\n\t.4byte \\addr\n\t.byte \\priority\n\t.byte (.Lcreatetask_\\@_2 - .Lcreatetask_\\@_1) / 2\n.Lcreatetask_\\@_1:\n\t.2byte \\argv\n.Lcreatetask_\\@_2:\n\t.endm\n\n\t.macro delay frames:req\n\t.byte 0x4\n\t.byte \\frames\n\t.endm\n\n\t.macro waitforvisualfinish\n\t.byte 0x5\n\t.endm\n\n\t.macro nop\n\t.byte 0x6\n\t.endm\n\n\t.macro nop2\n\t.byte 0x7\n\t.endm\n\n\t.macro end\n\t.byte 0x8\n\t.endm\n\n\t.macro playse se:req\n\t.byte 0x9\n\t.2byte \\se\n\t.endm\n\n\t.macro monbg battler:req\n\t.byte 0xa\n\t.byte \\battler\n\t.endm\n\n\t.macro clearmonbg battler:req\n\t.byte 0xb\n\t.byte \\battler\n\t.endm\n\n\t.macro setalpha eva:req, evb:req\n\t.byte 0x0C\n\t.2byte ((\\evb) << 8) | (\\eva)\n\t.endm\n\n\t.macro blendoff\n\t.byte 0xd\n\t.endm\n\n\t.macro call ptr:req\n\t.byte 0xe\n\t.4byte \\ptr\n\t.endm\n\n\t.macro return\n\t.byte 0xf\n\t.endm\n\n\t.macro setarg argId:req, value:req\n\t.byte 0x10\n\t.byte \\argId\n\t.2byte \\value\n\t.endm\n\n\t.macro choosetwoturnanim ptr1:req, ptr2:req\n\t.byte 0x11\n\t.4byte \\ptr1\n\t.4byte \\ptr2\n\t.endm\n\n\t.macro jumpifmoveturn value:req, ptr:req\n\t.byte 0x12\n\t.byte \\value\n\t.4byte \\ptr\n\t.endm\n\n\t.macro goto ptr:req\n\t.byte 0x13\n\t.4byte \\ptr\n\t.endm\n\n\t.macro fadetobg bg:req\n\t.byte 0x14\n\t.byte \\bg\n\t.endm\n\n\t.macro restorebg\n\t.byte 0x15\n\t.endm\n\n\t.macro waitbgfadeout\n\t.byte 0x16\n\t.endm\n\n\t.macro waitbgfadein\n\t.byte 0x17\n\t.endm\n\n\t.macro changebg bg:req\n\t.byte 0x18\n\t.byte \\bg\n\t.endm\n\n\t.macro playsewithpan se:req, pan:req\n\t.byte 0x19\n\t.2byte \\se\n\t.byte \\pan\n\t.endm\n\n\t.macro setpan pan:req\n\t.byte 0x1a\n\t.byte \\pan\n\t.endm\n\n\t.macro panse se:req, currentPan:req, targetPan:req, incrementPan:req, delay:req\n\t.byte 0x1b\n\t.2byte \\se\n\t.byte \\currentPan\n\t.byte \\targetPan\n\t.byte \\incrementPan\n\t.byte \\delay\n\t.endm\n\n\t.macro loopsewithpan se:req, pan:req, wait:req, times:req\n\t.byte 0x1c\n\t.2byte \\se\n\t.byte \\pan\n\t.byte \\wait\n\t.byte \\times\n\t.endm\n\n\t.macro waitplaysewithpan se:req, pan:req, wait:req\n\t.byte 0x1d\n\t.2byte \\se\n\t.byte \\pan\n\t.byte \\wait\n\t.endm\n\n\t.macro setbldcnt bldcnt:req\n\t.byte 0x1e\n\t.2byte \\bldcnt\n\t.endm\n\n\t.macro createsoundtask addr:req, argv:vararg\n\t.byte 0x1F\n\t.4byte \\addr\n\t.byte (.Lcreatetask_1F_\\@_2 - .Lcreatetask_1F_\\@_1) / 2\n.Lcreatetask_1F_\\@_1:\n\t.2byte \\argv\n.Lcreatetask_1F_\\@_2:\n\t.endm\n\n\t.macro waitsound\n\t.byte 0x20\n\t.endm\n\n\t.macro jumpargeq argId:req, value:req, ptr:req\n\t.byte 0x21\n\t.byte \\argId\n\t.2byte \\value\n\t.4byte \\ptr\n\t.endm\n\n\t.macro monbg_static battler:req\n\t.byte 0x22\n\t.byte \\battler\n\t.endm\n\n\t.macro clearmonbg_static battler:req\n\t.byte 0x23\n\t.byte \\battler\n\t.endm\n\n\t.macro jumpifcontest ptr:req\n\t.byte 0x24\n\t.4byte \\ptr\n\t.endm\n\n\t.macro fadetobgfromset bgOpponent:req, bgPlayer:req, bgContest:req\n\t.byte 0x25\n\t.byte \\bgOpponent\n\t.byte \\bgPlayer\n\t.byte \\bgContest\n\t.endm\n\n\t.macro panse_adjustnone se:req, currentPan:req, targetPan:req, incrementPan:req, delay:req\n\t.byte 0x26\n\t.2byte \\se\n\t.byte \\currentPan\n\t.byte \\targetPan\n\t.byte \\incrementPan\n\t.byte \\delay\n\t.endm\n\n\t.macro panse_adjustall se:req, currentPan:req, targetPan:req, incrementPan:req, delay:req\n\t.byte 0x27\n\t.2byte \\se\n\t.byte \\currentPan\n\t.byte \\targetPan\n\t.byte \\incrementPan\n\t.byte \\delay\n\t.endm\n\n\t.macro splitbgprio battler:req\n\t.byte 0x28\n\t.byte \\battler\n\t.endm\n\n\t.macro splitbgprio_all\n\t.byte 0x29\n\t.endm\n\n\t.macro splitbgprio_foes battler:req\n\t.byte 0x2a\n\t.byte \\battler\n\t.endm\n\n\t.macro invisible battler:req\n\t.byte 0x2b\n\t.byte \\battler\n\t.endm\n\n\t.macro visible battler:req\n\t.byte 0x2c\n\t.byte \\battler\n\t.endm\n\n\t.macro teamattack_moveback battler:req\n\t.byte 0x2d\n\t.byte \\battler\n\t.endm\n\n\t.macro teamattack_movefwd battler:req\n\t.byte 0x2e\n\t.byte \\battler\n\t.endm\n\n\t.macro stopsound\n\t.byte 0x2f\n\t.endm\n\t\n@ useful macros\n\t.macro jumpreteq value:req, ptr:req\n\tjumpargeq ARG_RET_ID, \\value, \\ptr\n\t.endm\n\t\n\t.macro jumprettrue ptr:req\n\tjumpreteq TRUE, \\ptr\n\t.endm\n\t\n\t.macro jumpretfalse ptr:req\n\tjumpreteq FALSE, \\ptr\n\t.endm\n"
  },
  {
    "path": "asm/macros/battle_script.inc",
    "content": "@ commands\n\t.macro attackcanceler\n\t.byte 0x0\n\t.endm\n\n\t.macro accuracycheck param0:req, param1:req\n\t.byte 0x1\n\t.4byte \\param0\n\t.2byte \\param1\n\t.endm\n\n\t.macro attackstring\n\t.byte 0x2\n\t.endm\n\n\t.macro ppreduce\n\t.byte 0x3\n\t.endm\n\n\t.macro critcalc\n\t.byte 0x4\n\t.endm\n\n\t.macro damagecalc\n\t.byte 0x5\n\t.endm\n\n\t.macro typecalc\n\t.byte 0x6\n\t.endm\n\n\t.macro adjustnormaldamage\n\t.byte 0x7\n\t.endm\n\n\t.macro adjustnormaldamage2\n\t.byte 0x8\n\t.endm\n\n\t.macro attackanimation\n\t.byte 0x9\n\t.endm\n\n\t.macro waitanimation\n\t.byte 0xa\n\t.endm\n\n\t.macro healthbarupdate battler:req\n\t.byte 0xb\n\t.byte \\battler\n\t.endm\n\n\t.macro datahpupdate battler:req\n\t.byte 0xc\n\t.byte \\battler\n\t.endm\n\n\t.macro critmessage\n\t.byte 0xd\n\t.endm\n\n\t.macro effectivenesssound\n\t.byte 0xe\n\t.endm\n\n\t.macro resultmessage\n\t.byte 0xf\n\t.endm\n\n\t.macro printstring id:req\n\t.byte 0x10\n\t.2byte \\id\n\t.endm\n\n\t.macro printselectionstring id:req\n\t.byte 0x11\n\t.2byte \\id\n\t.endm\n\n\t.macro waitmessage param0:req\n\t.byte 0x12\n\t.2byte \\param0\n\t.endm\n\n\t.macro printfromtable ptr:req\n\t.byte 0x13\n\t.4byte \\ptr\n\t.endm\n\n\t.macro printselectionstringfromtable ptr:req\n\t.byte 0x14\n\t.4byte \\ptr\n\t.endm\n\n\t.macro seteffectwithchance\n\t.byte 0x15\n\t.endm\n\n\t.macro seteffectprimary\n\t.byte 0x16\n\t.endm\n\n\t.macro seteffectsecondary\n\t.byte 0x17\n\t.endm\n\n\t.macro clearstatusfromeffect battler:req\n\t.byte 0x18\n\t.byte \\battler\n\t.endm\n\n\t.macro tryfaintmon battler:req\n\t.byte 0x19\n\t.byte \\battler\n\t.byte FALSE\n\t.4byte NULL\n\t.endm\n\n\t.macro tryfaintmon_spikes battler:req, ptr:req\n\t.byte 0x19\n\t.byte \\battler\n\t.byte TRUE\n\t.4byte \\ptr\n\t.endm\n\n\t.macro dofaintanimation battler:req\n\t.byte 0x1a\n\t.byte \\battler\n\t.endm\n\n\t.macro cleareffectsonfaint battler:req\n\t.byte 0x1b\n\t.byte \\battler\n\t.endm\n\n\t.macro jumpifstatus battler:req, status1:req, ptr:req\n\t.byte 0x1c\n\t.byte \\battler\n\t.4byte \\status1\n\t.4byte \\ptr\n\t.endm\n\n\t.macro jumpifstatus2 battler:req, status2:req, ptr:req\n\t.byte 0x1d\n\t.byte \\battler\n\t.4byte \\status2\n\t.4byte \\ptr\n\t.endm\n\n\t.macro jumpifability param0:req, ability:req, ptr:req\n\t.byte 0x1e\n\t.byte \\param0\n\t.byte \\ability\n\t.4byte \\ptr\n\t.endm\n\n\t.macro jumpifsideaffecting battler:req, sidestatus:req, ptr:req\n\t.byte 0x1f\n\t.byte \\battler\n\t.2byte \\sidestatus\n\t.4byte \\ptr\n\t.endm\n\n\t.macro jumpifstat battler:req, ifflag:req, stat:req, value:req, ptr\n\t.byte 0x20\n\t.byte \\battler\n\t.byte \\ifflag\n\t.byte \\stat\n\t.byte \\value\n\t.4byte \\ptr\n\t.endm\n\n\t.macro jumpifstatus3condition battler:req, status3:req, param2:req, ptr:req\n\t.byte 0x21\n\t.byte \\battler\n\t.4byte \\status3\n\t.byte \\param2\n\t.4byte \\ptr\n\t.endm\n\n\t.macro jumpiftype battler:req, type:req, ptr:req\n\t.byte 0x22\n\t.byte \\battler\n\t.byte \\type\n\t.4byte \\ptr\n\t.endm\n\n\t.macro getexp battler:req\n\t.byte 0x23\n\t.byte \\battler\n\t.endm\n\n\t.macro checkteamslost ptr:req\n\t.byte 0x24\n\t.4byte \\ptr\n\t.endm\n\n\t.macro movevaluescleanup\n\t.byte 0x25\n\t.endm\n\n\t.macro setmultihit value:req\n\t.byte 0x26\n\t.byte \\value\n\t.endm\n\n\t.macro decrementmultihit value:req\n\t.byte 0x27\n\t.4byte \\value\n\t.endm\n\n\t.macro goto ptr:req\n\t.byte 0x28\n\t.4byte \\ptr\n\t.endm\n\n\t.macro jumpifbyte ifflag:req, param1:req, param2:req, param3:req\n\t.byte 0x29\n\t.byte \\ifflag\n\t.4byte \\param1\n\t.byte \\param2\n\t.4byte \\param3\n\t.endm\n\n\t.macro jumpifhalfword ifflag:req, param1:req, param2:req, param3:req\n\t.byte 0x2a\n\t.byte \\ifflag\n\t.4byte \\param1\n\t.2byte \\param2\n\t.4byte \\param3\n\t.endm\n\n\t.macro jumpifword ifflag:req, param1:req, param2:req, param3:req\n\t.byte 0x2b\n\t.byte \\ifflag\n\t.4byte \\param1\n\t.4byte \\param2\n\t.4byte \\param3\n\t.endm\n\n\t.macro jumpifarrayequal param0:req, param1:req, param2:req, param3:req\n\t.byte 0x2c\n\t.4byte \\param0\n\t.4byte \\param1\n\t.byte \\param2\n\t.4byte \\param3\n\t.endm\n\n\t.macro jumpifarraynotequal param0:req, param1:req, param2:req, param3:req\n\t.byte 0x2d\n\t.4byte \\param0\n\t.4byte \\param1\n\t.byte \\param2\n\t.4byte \\param3\n\t.endm\n\n\t.macro setbyte ptr:req, param1:req\n\t.byte 0x2e\n\t.4byte \\ptr\n\t.byte \\param1\n\t.endm\n\n\t.macro addbyte ptr:req, param1:req\n\t.byte 0x2f\n\t.4byte \\ptr\n\t.byte \\param1\n\t.endm\n\n\t.macro subbyte ptr:req, param1:req\n\t.byte 0x30\n\t.4byte \\ptr\n\t.byte \\param1\n\t.endm\n\n\t.macro copyarray param0:req, param1:req, param2:req\n\t.byte 0x31\n\t.4byte \\param0\n\t.4byte \\param1\n\t.byte \\param2\n\t.endm\n\n\t.macro copyarraywithindex param0:req, param1:req, param2:req, param3:req\n\t.byte 0x32\n\t.4byte \\param0\n\t.4byte \\param1\n\t.4byte \\param2\n\t.byte \\param3\n\t.endm\n\n\t.macro orbyte ptr:req, param1:req\n\t.byte 0x33\n\t.4byte \\ptr\n\t.byte \\param1\n\t.endm\n\n\t.macro orhalfword ptr:req, param1:req\n\t.byte 0x34\n\t.4byte \\ptr\n\t.2byte \\param1\n\t.endm\n\n\t.macro orword ptr:req, param1:req\n\t.byte 0x35\n\t.4byte \\ptr\n\t.4byte \\param1\n\t.endm\n\n\t.macro bicbyte ptr:req, param1:req\n\t.byte 0x36\n\t.4byte \\ptr\n\t.byte \\param1\n\t.endm\n\n\t.macro bichalfword ptr:req, param1:req\n\t.byte 0x37\n\t.4byte \\ptr\n\t.2byte \\param1\n\t.endm\n\n\t.macro bicword ptr:req, param1:req\n\t.byte 0x38\n\t.4byte \\ptr\n\t.4byte \\param1\n\t.endm\n\n\t.macro pause param0:req\n\t.byte 0x39\n\t.2byte \\param0\n\t.endm\n\n\t.macro waitstate\n\t.byte 0x3a\n\t.endm\n\n\t.macro healthbar_update battler:req\n\t.byte 0x3b\n\t.byte \\battler\n\t.endm\n\n\t.macro return\n\t.byte 0x3c\n\t.endm\n\n\t.macro end\n\t.byte 0x3d\n\t.endm\n\n\t.macro end2\n\t.byte 0x3e\n\t.endm\n\n\t.macro end3\n\t.byte 0x3f\n\t.endm\n\n\t.macro jumpifaffectedbyprotect ptr:req\n\t.byte 0x40\n\t.4byte \\ptr\n\t.endm\n\n\t.macro call ptr:req\n\t.byte 0x41\n\t.4byte \\ptr\n\t.endm\n\n\t.macro jumpiftype2 battler:req, type:req, ptr:req\n\t.byte 0x42\n\t.byte \\battler\n\t.byte \\type\n\t.4byte \\ptr\n\t.endm\n\n\t.macro jumpifabilitypresent ability:req, ptr:req\n\t.byte 0x43\n\t.byte \\ability\n\t.4byte \\ptr\n\t.endm\n\n\t.macro endselectionscript\n\t.byte 0x44\n\t.endm\n\n\t.macro playanimation battler:req, animType:req, arg=NULL\n\t.byte 0x45\n\t.byte \\battler\n\t.byte \\animType\n\t.4byte \\arg\n\t.endm\n\n\t.macro playanimation_var battler:req, animType:req, arg=NULL\n\t.byte 0x46\n\t.byte \\battler\n\t.4byte \\animType\n\t.4byte \\arg\n\t.endm\n\n\t.macro setgraphicalstatchangevalues\n\t.byte 0x47\n\t.endm\n\n\t.macro playstatchangeanimation battler:req, param1:req, param2:req\n\t.byte 0x48\n\t.byte \\battler\n\t.byte \\param1\n\t.byte \\param2\n\t.endm\n\n\t.macro moveend param0:req, param1:req\n\t.byte 0x49\n\t.byte \\param0\n\t.byte \\param1\n\t.endm\n\n\t@ Help macros for 5 uses of moveend command\n\n\t@ All cases\n\t.macro moveendall\n\tsetbyte sMOVEEND_STATE, 0\n\tmoveend 0, 0\n\t.endm\n\n\t@ Chosen case\n\t.macro moveendcase case:req\n\tsetbyte sMOVEEND_STATE, \\case\n\tmoveend 1, 0\n\t.endm\n\n\t@ All cases from (inclusive)\n\t.macro moveendfrom from:req\n\tsetbyte sMOVEEND_STATE, \\from\n\tmoveend 0, 0\n\t.endm\n\n\t@ All cases from 0 to (not inclusive)\n\t.macro moveendto to:req\n\tsetbyte sMOVEEND_STATE, 0\n\tmoveend 2, \\to\n\t.endm\n\n\t@ Cases from (inclusive) to (not inclusive)\n\t.macro moveendfromto from:req, to:req\n\tsetbyte sMOVEEND_STATE, \\from\n\tmoveend 2, \\to\n\t.endm\n\n\t.macro typecalc2\n\t.byte 0x4a\n\t.endm\n\n\t.macro returnatktoball\n\t.byte 0x4b\n\t.endm\n\n\t.macro getswitchedmondata battler:req\n\t.byte 0x4c\n\t.byte \\battler\n\t.endm\n\n\t.macro switchindataupdate battler:req\n\t.byte 0x4d\n\t.byte \\battler\n\t.endm\n\n\t.macro switchinanim battler:req, dontclearsubstitutebit:req\n\t.byte 0x4e\n\t.byte \\battler\n\t.byte \\dontclearsubstitutebit\n\t.endm\n\n\t.macro jumpifcantswitch battler:req, ptr:req\n\t.byte 0x4f\n\t.byte \\battler\n\t.4byte \\ptr\n\t.endm\n\n\t.macro openpartyscreen param0:req, param1:req\n\t.byte 0x50\n\t.byte \\param0\n\t.4byte \\param1\n\t.endm\n\n\t.macro switchhandleorder battler:req, param1:req\n\t.byte 0x51\n\t.byte \\battler\n\t.byte \\param1\n\t.endm\n\n\t.macro switchineffects battler:req\n\t.byte 0x52\n\t.byte \\battler\n\t.endm\n\n\t.macro trainerslidein battler:req\n\t.byte 0x53\n\t.byte \\battler\n\t.endm\n\n\t.macro playse song:req\n\t.byte 0x54\n\t.2byte \\song\n\t.endm\n\n\t.macro fanfare song:req\n\t.byte 0x55\n\t.2byte \\song\n\t.endm\n\n\t.macro playfaintcry battler:req\n\t.byte 0x56\n\t.byte \\battler\n\t.endm\n\n\t.macro endlinkbattle\n\t.byte 0x57\n\t.endm\n\n\t.macro returntoball battler:req\n\t.byte 0x58\n\t.byte \\battler\n\t.endm\n\n\t.macro handlelearnnewmove param0:req, param1:req, param2:req\n\t.byte 0x59\n\t.4byte \\param0\n\t.4byte \\param1\n\t.byte \\param2\n\t.endm\n\n\t.macro yesnoboxlearnmove param0:req\n\t.byte 0x5a\n\t.4byte \\param0\n\t.endm\n\n\t.macro yesnoboxstoplearningmove param0:req\n\t.byte 0x5b\n\t.4byte \\param0\n\t.endm\n\n\t.macro hitanimation battler:req\n\t.byte 0x5c\n\t.byte \\battler\n\t.endm\n\n\t.macro getmoneyreward addr\n\t.byte 0x5d\n\t.4byte \\addr\n\t.endm\n\n\t.macro updatebattlermoves battler:req\n\t.byte 0x5e\n\t.byte \\battler\n\t.endm\n\n\t.macro swapattackerwithtarget\n\t.byte 0x5f\n\t.endm\n\n\t.macro incrementgamestat param0:req\n\t.byte 0x60\n\t.byte \\param0\n\t.endm\n\n\t.macro drawpartystatussummary battler:req\n\t.byte 0x61\n\t.byte \\battler\n\t.endm\n\n\t.macro hidepartystatussummary battler:req\n\t.byte 0x62\n\t.byte \\battler\n\t.endm\n\n\t.macro jumptocalledmove param0:req\n\t.byte 0x63\n\t.byte \\param0\n\t.endm\n\n\t.macro statusanimation battler:req\n\t.byte 0x64\n\t.byte \\battler\n\t.endm\n\n\t.macro status2animation battler:req, status2:req\n\t.byte 0x65\n\t.byte \\battler\n\t.4byte \\status2\n\t.endm\n\n\t.macro chosenstatusanimation battler:req, param1:req, param2:req\n\t.byte 0x66\n\t.byte \\battler\n\t.byte \\param1\n\t.4byte \\param2\n\t.endm\n\n\t.macro yesnobox\n\t.byte 0x67\n\t.endm\n\n\t.macro cancelallactions\n\t.byte 0x68\n\t.endm\n\n\t.macro adjustsetdamage\n\t.byte 0x69\n\t.endm\n\n\t.macro removeitem battler:req\n\t.byte 0x6a\n\t.byte \\battler\n\t.endm\n\n\t.macro atknameinbuff1\n\t.byte 0x6b\n\t.endm\n\n\t.macro drawlvlupbox\n\t.byte 0x6c\n\t.endm\n\n\t.macro resetsentmonsvalue\n\t.byte 0x6d\n\t.endm\n\n\t.macro setatktoplayer0\n\t.byte 0x6e\n\t.endm\n\n\t.macro makevisible battler:req\n\t.byte 0x6f\n\t.byte \\battler\n\t.endm\n\n\t.macro recordlastability battler:req\n\t.byte 0x70\n\t.byte \\battler\n\t.endm\n\n\t.macro buffermovetolearn\n\t.byte 0x71\n\t.endm\n\n\t.macro jumpifplayerran ptr:req\n\t.byte 0x72\n\t.4byte \\ptr\n\t.endm\n\n\t.macro hpthresholds battler:req\n\t.byte 0x73\n\t.byte \\battler\n\t.endm\n\n\t.macro hpthresholds2 battler:req\n\t.byte 0x74\n\t.byte \\battler\n\t.endm\n\n\t.macro useitemonopponent\n\t.byte 0x75\n\t.endm\n\n\t.macro various battler:req, param1:req\n\t.byte 0x76\n\t.byte \\battler\n\t.byte \\param1\n\t.endm\n\n\t.macro setprotectlike\n\t.byte 0x77\n\t.endm\n\n\t.macro tryexplosion\n\t.byte 0x78\n\t.endm\n\n\t.macro setatkhptozero\n\t.byte 0x79\n\t.endm\n\n\t.macro jumpifnexttargetvalid ptr:req\n\t.byte 0x7a\n\t.4byte \\ptr\n\t.endm\n\n\t.macro tryhealhalfhealth param0:req, battler:req\n\t.byte 0x7b\n\t.4byte \\param0\n\t.byte \\battler\n\t.endm\n\n\t.macro trymirrormove\n\t.byte 0x7c\n\t.endm\n\n\t.macro setrain\n\t.byte 0x7d\n\t.endm\n\n\t.macro setreflect\n\t.byte 0x7e\n\t.endm\n\n\t.macro setseeded\n\t.byte 0x7f\n\t.endm\n\n\t.macro manipulatedamage param0:req\n\t.byte 0x80\n\t.byte \\param0\n\t.endm\n\n\t.macro trysetrest param0:req\n\t.byte 0x81\n\t.4byte \\param0\n\t.endm\n\n\t.macro jumpifnotfirstturn ptr:req\n\t.byte 0x82\n\t.4byte \\ptr\n\t.endm\n\n\t.macro nop\n\t.byte 0x83\n\t.endm\n\n\t.macro jumpifcantmakeasleep param0:req\n\t.byte 0x84\n\t.4byte \\param0\n\t.endm\n\n\t.macro stockpile\n\t.byte 0x85\n\t.endm\n\n\t.macro stockpiletobasedamage param0:req\n\t.byte 0x86\n\t.4byte \\param0\n\t.endm\n\n\t.macro stockpiletohpheal param0:req\n\t.byte 0x87\n\t.4byte \\param0\n\t.endm\n\n\t.macro negativedamage\n\t.byte 0x88\n\t.endm\n\n\t.macro statbuffchange param0:req, param1:req\n\t.byte 0x89\n\t.byte \\param0\n\t.4byte \\param1\n\t.endm\n\n\t.macro normalisebuffs\n\t.byte 0x8a\n\t.endm\n\n\t.macro setbide\n\t.byte 0x8b\n\t.endm\n\n\t.macro confuseifrepeatingattackends\n\t.byte 0x8c\n\t.endm\n\n\t.macro setmultihitcounter param0:req\n\t.byte 0x8d\n\t.byte \\param0\n\t.endm\n\n\t.macro initmultihitstring\n\t.byte 0x8e\n\t.endm\n\n\t.macro forcerandomswitch param0:req\n\t.byte 0x8f\n\t.4byte \\param0\n\t.endm\n\n\t.macro tryconversiontypechange param0:req\n\t.byte 0x90\n\t.4byte \\param0\n\t.endm\n\n\t.macro givepaydaymoney\n\t.byte 0x91\n\t.endm\n\n\t.macro setlightscreen\n\t.byte 0x92\n\t.endm\n\n\t.macro tryKO param0:req\n\t.byte 0x93\n\t.4byte \\param0\n\t.endm\n\n\t.macro damagetohalftargethp\n\t.byte 0x94\n\t.endm\n\n\t.macro setsandstorm\n\t.byte 0x95\n\t.endm\n\n\t.macro weatherdamage\n\t.byte 0x96\n\t.endm\n\n\t.macro tryinfatuating param0:req\n\t.byte 0x97\n\t.4byte \\param0\n\t.endm\n\n\t.macro updatestatusicon battler:req\n\t.byte 0x98\n\t.byte \\battler\n\t.endm\n\n\t.macro setmist\n\t.byte 0x99\n\t.endm\n\n\t.macro setfocusenergy\n\t.byte 0x9a\n\t.endm\n\n\t.macro transformdataexecution\n\t.byte 0x9b\n\t.endm\n\n\t.macro setsubstitute\n\t.byte 0x9c\n\t.endm\n\n\t.macro mimicattackcopy param0:req\n\t.byte 0x9d\n\t.4byte \\param0\n\t.endm\n\n\t.macro metronome\n\t.byte 0x9e\n\t.endm\n\n\t.macro dmgtolevel\n\t.byte 0x9f\n\t.endm\n\n\t.macro psywavedamageeffect\n\t.byte 0xa0\n\t.endm\n\n\t.macro counterdamagecalculator param0:req\n\t.byte 0xa1\n\t.4byte \\param0\n\t.endm\n\n\t.macro mirrorcoatdamagecalculator param0:req\n\t.byte 0xa2\n\t.4byte \\param0\n\t.endm\n\n\t.macro disablelastusedattack param0:req\n\t.byte 0xa3\n\t.4byte \\param0\n\t.endm\n\n\t.macro trysetencore param0:req\n\t.byte 0xa4\n\t.4byte \\param0\n\t.endm\n\n\t.macro painsplitdmgcalc param0:req\n\t.byte 0xa5\n\t.4byte \\param0\n\t.endm\n\n\t.macro settypetorandomresistance param0:req\n\t.byte 0xa6\n\t.4byte \\param0\n\t.endm\n\n\t.macro setalwayshitflag\n\t.byte 0xa7\n\t.endm\n\n\t.macro copymovepermanently param0:req\n\t.byte 0xa8\n\t.4byte \\param0\n\t.endm\n\n\t.macro trychoosesleeptalkmove param0:req\n\t.byte 0xa9\n\t.4byte \\param0\n\t.endm\n\n\t.macro setdestinybond\n\t.byte 0xaa\n\t.endm\n\n\t.macro trysetdestinybondtohappen\n\t.byte 0xab\n\t.endm\n\n\t.macro remaininghptopower\n\t.byte 0xac\n\t.endm\n\n\t.macro tryspiteppreduce param0:req\n\t.byte 0xad\n\t.4byte \\param0\n\t.endm\n\n\t.macro healpartystatus\n\t.byte 0xae\n\t.endm\n\n\t.macro cursetarget param0:req\n\t.byte 0xaf\n\t.4byte \\param0\n\t.endm\n\n\t.macro trysetspikes param0:req\n\t.byte 0xb0\n\t.4byte \\param0\n\t.endm\n\n\t.macro setforesight\n\t.byte 0xb1\n\t.endm\n\n\t.macro trysetperishsong param0:req\n\t.byte 0xb2\n\t.4byte \\param0\n\t.endm\n\n\t.macro rolloutdamagecalculation\n\t.byte 0xb3\n\t.endm\n\n\t.macro jumpifconfusedandstatmaxed stat:req, ptr:req\n\t.byte 0xb4\n\t.byte \\stat\n\t.4byte \\ptr\n\t.endm\n\n\t.macro furycuttercalc\n\t.byte 0xb5\n\t.endm\n\n\t.macro friendshiptodamagecalculation\n\t.byte 0xb6\n\t.endm\n\n\t.macro presentdamagecalculation\n\t.byte 0xb7\n\t.endm\n\n\t.macro setsafeguard\n\t.byte 0xb8\n\t.endm\n\n\t.macro magnitudedamagecalculation\n\t.byte 0xb9\n\t.endm\n\n\t.macro jumpifnopursuitswitchdmg param0:req\n\t.byte 0xba\n\t.4byte \\param0\n\t.endm\n\n\t.macro setsunny\n\t.byte 0xbb\n\t.endm\n\n\t.macro maxattackhalvehp param0:req\n\t.byte 0xbc\n\t.4byte \\param0\n\t.endm\n\n\t.macro copyfoestats param0:req\n\t.byte 0xbd\n\t.4byte \\param0\n\t.endm\n\n\t.macro rapidspinfree\n\t.byte 0xbe\n\t.endm\n\n\t.macro setdefensecurlbit\n\t.byte 0xbf\n\t.endm\n\n\t.macro recoverbasedonsunlight param0:req\n\t.byte 0xc0\n\t.4byte \\param0\n\t.endm\n\n\t.macro hiddenpowercalc\n\t.byte 0xc1\n\t.endm\n\n\t.macro selectfirstvalidtarget\n\t.byte 0xc2\n\t.endm\n\n\t.macro trysetfutureattack param0:req\n\t.byte 0xc3\n\t.4byte \\param0\n\t.endm\n\n\t.macro trydobeatup param0:req, param1:req\n\t.byte 0xc4\n\t.4byte \\param0\n\t.4byte \\param1\n\t.endm\n\n\t.macro setsemiinvulnerablebit\n\t.byte 0xc5\n\t.endm\n\n\t.macro clearsemiinvulnerablebit\n\t.byte 0xc6\n\t.endm\n\n\t.macro setminimize\n\t.byte 0xc7\n\t.endm\n\n\t.macro sethail\n\t.byte 0xc8\n\t.endm\n\n\t.macro trymemento ptr:req\n\t.byte 0xc9\n\t.4byte \\ptr\n\t.endm\n\n\t.macro setforcedtarget\n\t.byte 0xca\n\t.endm\n\n\t.macro setcharge\n\t.byte 0xcb\n\t.endm\n\n\t.macro callterrainattack\n\t.byte 0xcc\n\t.endm\n\n\t.macro cureifburnedparalysedorpoisoned param0:req\n\t.byte 0xcd\n\t.4byte \\param0\n\t.endm\n\n\t.macro settorment param0:req\n\t.byte 0xce\n\t.4byte \\param0\n\t.endm\n\n\t.macro jumpifnodamage param0:req\n\t.byte 0xcf\n\t.4byte \\param0\n\t.endm\n\n\t.macro settaunt param0:req\n\t.byte 0xd0\n\t.4byte \\param0\n\t.endm\n\n\t.macro trysethelpinghand param0:req\n\t.byte 0xd1\n\t.4byte \\param0\n\t.endm\n\n\t.macro tryswapitems param0:req\n\t.byte 0xd2\n\t.4byte \\param0\n\t.endm\n\n\t.macro trycopyability param0:req\n\t.byte 0xd3\n\t.4byte \\param0\n\t.endm\n\n\t.macro trywish param0:req, param1:req\n\t.byte 0xd4\n\t.byte \\param0\n\t.4byte \\param1\n\t.endm\n\n\t.macro trysetroots param0:req\n\t.byte 0xd5\n\t.4byte \\param0\n\t.endm\n\n\t.macro doubledamagedealtifdamaged\n\t.byte 0xd6\n\t.endm\n\n\t.macro setyawn param0:req\n\t.byte 0xd7\n\t.4byte \\param0\n\t.endm\n\n\t.macro setdamagetohealthdifference param0:req\n\t.byte 0xd8\n\t.4byte \\param0\n\t.endm\n\n\t.macro scaledamagebyhealthratio\n\t.byte 0xd9\n\t.endm\n\n\t.macro tryswapabilities param0:req\n\t.byte 0xda\n\t.4byte \\param0\n\t.endm\n\n\t.macro tryimprison param0:req\n\t.byte 0xdb\n\t.4byte \\param0\n\t.endm\n\n\t.macro trysetgrudge param0:req\n\t.byte 0xdc\n\t.4byte \\param0\n\t.endm\n\n\t.macro weightdamagecalculation\n\t.byte 0xdd\n\t.endm\n\n\t.macro assistattackselect param0:req\n\t.byte 0xde\n\t.4byte \\param0\n\t.endm\n\n\t.macro trysetmagiccoat param0:req\n\t.byte 0xdf\n\t.4byte \\param0\n\t.endm\n\n\t.macro trysetsnatch param0:req\n\t.byte 0xe0\n\t.4byte \\param0\n\t.endm\n\n\t.macro trygetintimidatetarget param0:req\n\t.byte 0xe1\n\t.4byte \\param0\n\t.endm\n\n\t.macro switchoutabilities battler:req\n\t.byte 0xe2\n\t.byte \\battler\n\t.endm\n\n\t.macro jumpifhasnohp battler:req, param1:req\n\t.byte 0xe3\n\t.byte \\battler\n\t.4byte \\param1\n\t.endm\n\n\t.macro getsecretpowereffect\n\t.byte 0xe4\n\t.endm\n\n\t.macro pickup\n\t.byte 0xe5\n\t.endm\n\n\t.macro docastformchangeanimation\n\t.byte 0xe6\n\t.endm\n\n\t.macro trycastformdatachange\n\t.byte 0xe7\n\t.endm\n\n\t.macro settypebasedhalvers param0:req\n\t.byte 0xe8\n\t.4byte \\param0\n\t.endm\n\n\t.macro setweatherballtype\n\t.byte 0xe9\n\t.endm\n\n\t.macro tryrecycleitem param0:req\n\t.byte 0xea\n\t.4byte \\param0\n\t.endm\n\n\t.macro settypetoterrain param0:req\n\t.byte 0xeb\n\t.4byte \\param0\n\t.endm\n\n\t.macro pursuitrelated param0:req\n\t.byte 0xec\n\t.4byte \\param0\n\t.endm\n\n\t.macro snatchsetbattlers\n\t.byte 0xed\n\t.endm\n\n\t.macro removelightscreenreflect\n\t.byte 0xee\n\t.endm\n\n\t.macro handleballthrow\n\t.byte 0xef\n\t.endm\n\n\t.macro givecaughtmon\n\t.byte 0xf0\n\t.endm\n\n\t.macro trysetcaughtmondexflags param0:req\n\t.byte 0xf1\n\t.4byte \\param0\n\t.endm\n\n\t.macro displaydexinfo\n\t.byte 0xf2\n\t.endm\n\n\t.macro trygivecaughtmonnick param0:req\n\t.byte 0xf3\n\t.4byte \\param0\n\t.endm\n\n\t.macro subattackerhpbydmg\n\t.byte 0xf4\n\t.endm\n\n\t.macro removeattackerstatus1\n\t.byte 0xf5\n\t.endm\n\n\t.macro finishaction\n\t.byte 0xf6\n\t.endm\n\n\t.macro finishturn\n\t.byte 0xf7\n\t.endm\n\n@ various command changed to more readable macros\n\t.macro cancelmultiturnmoves battler:req\n\tvarious \\battler, VARIOUS_CANCEL_MULTI_TURN_MOVES\n\t.endm\n\n\t.macro setmagiccoattarget battler:req\n\tvarious \\battler, VARIOUS_SET_MAGIC_COAT_TARGET\n\t.endm\n\n\t.macro getifcantrunfrombattle battler:req\n\tvarious \\battler, VARIOUS_IS_RUNNING_IMPOSSIBLE\n\t.endm\n\n\t.macro getmovetarget battler:req\n\tvarious \\battler, VARIOUS_GET_MOVE_TARGET\n\t.endm\n\n\t.macro getbattlerfainted battler:req\n\tvarious \\battler, VARIOUS_GET_BATTLER_FAINTED\n\t.endm\n\n\t.macro resetintimidatetracebits battler:req\n\tvarious \\battler, VARIOUS_RESET_INTIMIDATE_TRACE_BITS\n\t.endm\n\n\t.macro updatechoicemoveonlvlup battler:req\n\tvarious \\battler, VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP\n\t.endm\n\n\t.macro resetplayerfainted\n\tvarious BS_ATTACKER, VARIOUS_RESET_PLAYER_FAINTED\n\t.endm\n\n\t.macro getbattlersforrecall\n\tvarious BS_ATTACKER, VARIOUS_GET_BATTLERS_FOR_RECALL\n\t.endm\n\n\t.macro returnopponentmon1toball\n\tvarious BS_ATTACKER, VARIOUS_RETURN_OPPONENT_MON1\n\t.endm\n\n\t.macro returnopponentmon2toball\n\tvarious BS_ATTACKER, VARIOUS_RETURN_OPPONENT_MON2\n\t.endm\n\n\t.macro checkpokeflute battler:req\n\tvarious \\battler, VARIOUS_CHECK_POKEFLUTE\n\t.endm\n\n\t.macro waitfanfare battler:req\n\tvarious \\battler, VARIOUS_WAIT_FANFARE\n\t.endm\n\n@ helpful macros\n\t.macro setstatchanger stat:req, stages:req, down:req\n\tsetbyte sSTATCHANGER \\stat | \\stages << 4 | \\down << 7\n\t.endm\n\n\t.macro setmoveeffect effect:req\n\tsetbyte cEFFECT_CHOOSER, \\effect\n\t.endm\n\n\t.macro chosenstatus1animation battler:req, status:req\n\tchosenstatusanimation \\battler, 0x0, \\status\n\t.endm\n\n\t.macro chosenstatus2animation battler:req, status:req\n\tchosenstatusanimation \\battler, 0x1, \\status\n\t.endm\n\n\t.macro sethword dst:req, value:req\n\tsetbyte \\dst, (\\value) & 0xFF\n\tsetbyte \\dst + 1, ((\\value) >> 8) & 0xFF\n\t.endm\n\n\t.macro setword dst:req, value:req\n\tsetbyte \\dst, (\\value) & 0xFF\n\tsetbyte \\dst + 1, ((\\value) >> 8) & 0xFF\n\tsetbyte \\dst + 2, ((\\value) >> 16) & 0xFF\n\tsetbyte \\dst + 3, ((\\value) >> 24) & 0xFF\n\t.endm\n\n\t.macro copybyte dst:req, src:req\n\tcopyarray \\dst, \\src, 0x1\n\t.endm\n\n\t.macro copyhword dst:req, src:req\n\tcopyarray \\dst, \\src, 0x2\n\t.endm\n\n\t.macro copyword dst:req, src:req\n\tcopyarray \\dst, \\src, 0x4\n\t.endm\n\n\t.macro jumpifbytenotequal byte1:req, byte2:req, jumpptr:req\n\tjumpifarraynotequal \\byte1, \\byte2, 0x1, \\jumpptr\n\t.endm\n\n\t.macro jumpifbyteequal byte1:req, byte2:req, jumpptr:req\n\tjumpifarrayequal \\byte1, \\byte2, 0x1, \\jumpptr\n\t.endm\n\n\t.macro jumpifmove move:req, jumpptr:req\n\tjumpifhalfword CMP_EQUAL, gCurrentMove, \\move, \\jumpptr\n\t.endm\n\n\t.macro jumpifnotmove move:req, jumpptr:req\n\tjumpifhalfword CMP_NOT_EQUAL, gCurrentMove, \\move, \\jumpptr\n\t.endm\n\n\t.macro jumpifstatus3 battler:req, status:req, jumpptr:req\n\tjumpifstatus3condition \\battler, \\status, 0x0, \\jumpptr\n\t.endm\n\n\t.macro jumpifnostatus3 battler:req, status:req, jumpptr:req\n\tjumpifstatus3condition \\battler, \\status, 0x1, \\jumpptr\n\t.endm\n\n\t.macro jumpifmovehadnoeffect jumpptr:req\n\tjumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_NO_EFFECT, \\jumpptr\n\t.endm\n\n\t.macro jumpifbattletype flags:req, jumpptr:req\n\tjumpifword CMP_COMMON_BITS, gBattleTypeFlags, \\flags, \\jumpptr\n\t.endm\n\n\t.macro jumpifnotbattletype flags:req, jumpptr:req\n\tjumpifword CMP_NO_COMMON_BITS, gBattleTypeFlags, \\flags, \\jumpptr\n\t.endm\n"
  },
  {
    "path": "asm/macros/contest_ai_script.inc",
    "content": "@ Add a positive/negative value to the score of the move being evaluated.\n\n\t.macro score score\n\t.byte 0x00\n\t.byte \\score\n\t.endm\n\n@ turn (AKA \"Appeal No.\")\n\n\t.macro get_turn\n\t.byte 0x01\n\t.endm\n\n\t.macro if_turn_less_than param, addr\n\t.byte 0x02\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_turn_more_than param, addr\n\t.byte 0x03\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_turn_eq param, addr\n\t.byte 0x04\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_turn_not_eq param, addr\n\t.byte 0x05\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n@ audience excitement\n\n\t.macro get_excitement\n\t.byte 0x06\n\t.endm\n\n\t.macro if_excitement_less_than param, addr\n\t.byte 0x07\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_excitement_more_than param, addr\n\t.byte 0x08\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_excitement_eq param, addr\n\t.byte 0x09\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_excitement_not_eq param, addr\n\t.byte 0x0A\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n@ the order that the user goes in the current turn\n\n\t.macro get_user_order\n\t.byte 0x0B\n\t.endm\n\n\t.macro if_user_order_less_than param addr\n\t.byte 0x0C\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_user_order_more_than param addr\n\t.byte 0x0D\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_user_order_eq param addr\n\t.byte 0x0E\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_user_order_not_eq param addr\n\t.byte 0x0F\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n@ user condition\n\n\t.macro get_user_condition\n\t.byte 0x10\n\t.endm\n\n\t.macro if_user_condition_less_than param, addr\n\t.byte 0x11\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_user_condition_more_than param, addr\n\t.byte 0x12\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_user_condition_eq param, addr\n\t.byte 0x13\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_user_condition_not_eq param, addr\n\t.byte 0x14\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n@ 15\n@ 16\n@ 17\n@ 18\n@ 19\n@ 1A\n@ 1B\n@ 1C\n@ 1D\n@ 1E\n\n@ contest type\n\n\t.macro get_contest_type\n\t.byte 0x1F\n\t.endm\n\n\t.macro if_contest_type_eq param, addr\n\t.byte 0x20\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_contest_type_not_eq param, addr\n\t.byte 0x21\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n@ move excitement (change in excitement due to move)\n\n\t.macro get_move_excitement\n\t.byte 0x22\n\t.endm\n\n\t.macro if_move_excitement_less_than param, addr\n\t.byte 0x23\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_move_excitement_more_than param, addr\n\t.byte 0x24\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_move_excitement_eq param, addr\n\t.byte 0x25\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_move_excitement_not_eq param, addr\n\t.byte 0x26\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n@ move effect\n\n\t.macro get_effect\n\t.byte 0x27\n\t.endm\n\n\t.macro if_effect_eq param, addr\n\t.byte 0x28\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_effect_not_eq param, addr\n\t.byte 0x29\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n@ move effect type\n\n\t.macro get_effect_type\n\t.byte 0x2A\n\t.endm\n\n\t.macro if_effect_type_eq param, addr\n\t.byte 0x2B\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_effect_type_not_eq param, addr\n\t.byte 0x2C\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n@ whether the current move is the most appealing in the user's moveset\n\n\t.macro check_most_appealing_move\n\t.byte 0x2D\n\t.endm\n\n\t.macro if_most_appealing_move addr\n\t.byte 0x2E\n\t.4byte \\addr\n\t.endm\n\n@ 2F\n@ 30\n@ 31\n@ 32\n@ 33\n@ 34\n@ 35\n@ 36\n@ 37\n@ 38\n@ 39\n@ 3A\n\n@ number of times current move has been used\n\n\t.macro get_move_used_count\n\t.byte 0x3B\n\t.endm\n\n\t.macro if_move_used_count_less_than param, addr\n\t.byte 0x3C\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_move_used_count_more_than param, addr\n\t.byte 0x3D\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_move_used_count_eq param, addr\n\t.byte 0x3E\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_move_used_count_not_eq param, addr\n\t.byte 0x3F\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n@ whether the current move is a combo starter (with another move in the moveset)\n\n\t.macro check_combo_starter\n\t.byte 0x40\n\t.endm\n\n\t.macro if_combo_starter addr\n\t.byte 0x41\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_not_combo_starter addr\n\t.byte 0x42\n\t.4byte \\addr\n\t.endm\n\n@ whether the current move is a combo finisher (with another move in the moveset)\n\n\t.macro check_combo_finisher\n\t.byte 0x43\n\t.endm\n\n\t.macro if_combo_finisher addr\n\t.byte 0x44\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_not_combo_finisher addr\n\t.byte 0x45\n\t.4byte \\addr\n\t.endm\n\n@ whether the current move would finish a combo\n\n\t.macro check_would_finish_combo\n\t.byte 0x46\n\t.endm\n\n\t.macro if_would_finish_combo addr\n\t.byte 0x47\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_would_not_finish_combo addr\n\t.byte 0x48\n\t.4byte \\addr\n\t.endm\n\n@ condition of mon (indexed by order)\n\n\t.macro get_condition mon\n\t.byte 0x49\n\t.byte \\mon\n\t.endm\n\n\t.macro if_condition_less_than mon, value, addr\n\t.byte 0x4A\n\t.byte \\mon\n\t.byte \\value\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_condition_more_than mon, value, addr\n\t.byte 0x4B\n\t.byte \\mon\n\t.byte \\value\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_condition_eq mon, value, addr\n\t.byte 0x4C\n\t.byte \\mon\n\t.byte \\value\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_condition_not_eq mon, value, addr\n\t.byte 0x4D\n\t.byte \\mon\n\t.byte \\value\n\t.4byte \\addr\n\t.endm\n\n@ whether the mon used a combo starter move\n@ Even though this value is always 1 or 0 (i.e. TRUE/FALSE),\n@ there are less-than and greater-than comparison operations for some reason.\n\n\t.macro get_used_combo_starter mon\n\t.byte 0x4E\n\t.byte \\mon\n\t.endm\n\n\t.macro if_used_combo_starter_less_than mon, value, addr\n\t.byte 0x4F\n\t.byte \\mon\n\t.byte \\value\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_used_combo_starter_more_than mon, value, addr\n\t.byte 0x50\n\t.byte \\mon\n\t.byte \\value\n\t.4byte \\addr\n\t.endm\n\n\n\t.macro if_used_combo_starter_eq mon, value, addr\n\t.byte 0x51\n\t.byte \\mon\n\t.byte \\value\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_used_combo_starter_not_eq mon, value, addr\n\t.byte 0x52\n\t.byte \\mon\n\t.byte \\value\n\t.4byte \\addr\n\t.endm\n\n@ whether the mon can make an appeal\n\n\t.macro check_can_participate mon\n\t.byte 0x53\n\t.byte \\mon\n\t.endm\n\n\t.macro if_can_participate mon, addr\n\t.byte 0x54\n\t.byte \\mon\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_cannot_participate mon, addr\n\t.byte 0x55\n\t.byte \\mon\n\t.4byte \\addr\n\t.endm\n\n@ 56\n@ 57\n\n\t.macro contest_58 param addr\n\t.byte 0x58\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n@ 59\n@ 5A\n@ 5B\n@ 5C\n@ 5D\n@ 5E\n@ 5F\n@ 60\n@ 61\n@ 62\n@ 63\n@ 64\n@ 65\n@ 66\n@ 67\n@ 68\n@ 69\n@ 6A\n@ 6B\n@ 6C\n@ 6D\n@ 6E\n@ 6F\n@ 70\n@ 71\n@ 72\n@ 73\n@ 74\n@ 75\n@ 76\n@ 77\n@ 78\n@ 79\n@ 7A\n@ 7B\n@ 7C\n\n\t.macro if_random param addr\n\t.byte 0x7D\n\t.byte \\param\n\t.4byte \\addr\n\t.endm\n\n@ 7E\n\n\t.macro jump addr\n\t.byte 0x7F\n\t.4byte \\addr\n\t.endm\n\n\t.macro call addr\n\t.byte 0x80\n\t.4byte \\addr\n\t.endm\n\n\t.macro end\n\t.byte 0x81\n\t.endm\n\n\t.macro check_user_has_exciting_move\n\t.byte 0x82\n\t.endm\n\n\t.macro if_user_has_exciting_move addr\n\t.byte 0x83\n\t.4byte \\addr\n\t.endm\n\n\t.macro if_user_doesnt_have_exciting_move addr\n\t.byte 0x84\n\t.4byte \\addr\n\t.endm\n\n@ 85\n@ 86\n\n\t.macro if_effect_in_user_moveset param addr\n\t.byte 0x87\n\t.2byte \\param\n\t.4byte \\addr\n\t.endm\n"
  },
  {
    "path": "asm/macros/ec.inc",
    "content": "\n\t.macro ec_duplicates count\n\t.2byte 0xff00 + \\count\n\t.endm\n\n\t.macro ec_words_by_letter label\n\t.2byte (gEasyChatWordsByLetter_\\label - gEasyChatWordsAlphabetized) / 2\n\t.endm\n"
  },
  {
    "path": "asm/macros/event.inc",
    "content": "\t@ Does nothing.\n\t.macro nop\n\t.byte 0x00\n\t.endm\n\n\t@ Does nothing.\n\t.macro nop1\n\t.byte 0x01\n\t.endm\n\n\t@ Terminates script execution.\n\t.macro end\n\t.byte 0x02\n\t.endm\n\n\t@ Jumps back to after the last-executed call statement, and continues script execution from there.\n\t.macro return\n\t.byte 0x03\n\t.endm\n\n\t@ Jumps to destination and continues script execution from there. The location of the calling script is remembered and can be returned to later.\n\t.macro call destination:req\n\t.byte 0x04\n\t.4byte \\destination\n\t.endm\n\n\t@ Jumps to destination and continues script execution from there.\n\t.macro goto destination:req\n\t.byte 0x05\n\t.4byte \\destination\n\t.endm\n\n\t@ If the result of the last comparison matches condition (see Comparison operators), jumps to destination and continues script execution from there.\n\t.macro goto_if condition:req, destination:req\n\t.byte 0x06\n\t.byte \\condition\n\t.4byte \\destination\n\t.endm\n\n\t@ If the result of the last comparison matches condition (see Comparison operators), calls destination.\n\t.macro call_if condition:req, destination:req\n\t.byte 0x07\n\t.byte \\condition\n\t.4byte \\destination\n\t.endm\n\n\t@ Jumps to the script in gStdScripts at index function.\n\t.macro gotostd function:req\n\t.byte 0x08\n\t.byte \\function\n\t.endm\n\n\t@ Callstd ids\n\tSTD_OBTAIN_ITEM = 0\n\tSTD_FIND_ITEM = 1\n\n\tMSGBOX_NPC = 2\n\tMSGBOX_SIGN = 3\n\tMSGBOX_DEFAULT = 4\n\tMSGBOX_YESNO = 5\n\tMSGBOX_AUTOCLOSE = 6\n\n\tSTD_OBTAIN_DECORATION = 7\n\tSTD_PUT_ITEM_AWAY = 8\n\tSTD_RECEIVED_ITEM = 9\n\n\t@ Calls the script in gStdScripts at index function.\n\t.macro callstd function:req\n\t.byte 0x09\n\t.byte \\function\n\t.endm\n\n\t@ If the result of the last comparison matches condition (see Comparison operators), jumps to the script in gStdScripts at index function.\n\t.macro gotostd_if condition:req, function:req\n\t.byte 0x0a\n\t.byte \\condition\n\t.byte \\function\n\t.endm\n\n\t@ If the result of the last comparison matches condition (see Comparison operators), calls the script in gStdScripts at index function.\n\t.macro callstd_if condition:req, function:req\n\t.byte 0x0b\n\t.byte \\condition\n\t.byte \\function\n\t.endm\n\n\t@ Equivalent to the 'return' command for a RAM script.\n\t.macro returnram\n\t.byte 0x0c\n\t.endm\n\n\t@ Equivalent to the 'end' command for a RAM script.\n\t.macro endram\n\t.byte 0x0d\n\t.endm\n\n\t@ Sets the Mystery Event script status (MEVENT_STATUS_*).\n\t.macro setmysteryeventstatus value:req\n\t.byte 0x0e\n\t.byte \\value\n\t.endm\n\n\t@ Sets the value at the specified script data index to a fixed 4-byte value.\n\t.macro loadword destIndex:req, value:req\n\t.byte 0x0f\n\t.byte \\destIndex\n\t.4byte \\value\n\t.endm\n\n\t@ Sets the value at the specified script data index to a fixed byte value.\n\t.macro loadbyte destIndex:req, value:req\n\t.byte 0x10\n\t.byte \\destIndex\n\t.byte \\value\n\t.endm\n\n\t@ Sets the value at the specified pointer.\n\t.macro setptr value:req, ptr:req\n\t.byte 0x11\n\t.byte \\value\n\t.4byte \\ptr\n\t.endm\n\n\t@ Sets the value at the specified script data index to the value at pointer 'source'.\n\t.macro loadbytefromptr destIndex:req, source:req\n\t.byte 0x12\n\t.byte \\destIndex\n\t.4byte \\source\n\t.endm\n\n\t@ Sets the value at pointer 'destination' to the contents of the script data at 'srcIndex'.\n\t.macro setptrbyte srcIndex:req, destination:req\n\t.byte 0x13\n\t.byte \\srcIndex\n\t.4byte \\destination\n\t.endm\n\n\t@ Copies the contents of the script data from one index to another.\n\t.macro copylocal destIndex:req, srcIndex:req\n\t.byte 0x14\n\t.byte \\destIndex\n\t.byte \\srcIndex\n\t.endm\n\n\t@ Copies the byte at source to destination, replacing whatever byte was previously there.\n\t.macro copybyte destination:req, source:req\n\t.byte 0x15\n\t.4byte \\destination\n\t.4byte \\source\n\t.endm\n\n\t@ Changes the value of destination to value.\n\t.macro setvar destination:req, value:req\n\t.byte 0x16\n\t.2byte \\destination\n\t.2byte \\value\n\t.endm\n\n\t@ Changes the value of destination by adding value to it. Overflow is not prevented (0xFFFF + 1 = 0x0000).\n\t.macro addvar destination:req, value:req\n\t.byte 0x17\n\t.2byte \\destination\n\t.2byte \\value\n\t.endm\n\n\t@ Changes the value of destination by subtracting value to it. Overflow is not prevented (0x0000 - 1 = 0xFFFF).\n\t.macro subvar destination:req, value:req\n\t.byte 0x18\n\t.2byte \\destination\n\t.2byte \\value\n\t.endm\n\n\t@ Copies the value of source into destination.\n\t.macro copyvar destination:req, source:req\n\t.byte 0x19\n\t.2byte \\destination\n\t.2byte \\source\n\t.endm\n\n\t@ If source is not a variable, then this function acts like setvar. Otherwise, it acts like copyvar.\n\t.macro setorcopyvar destination:req, source:req\n\t.byte 0x1a\n\t.2byte \\destination\n\t.2byte \\source\n\t.endm\n\n\t@ Compares the values of the script data at indexes 'local1' and 'local2'.\n\t@ The result is stored in comparisonResult to be acted on by goto_if / call_if\n\t.macro compare_local_to_local local1:req, local2:req\n\t.byte 0x1b\n\t.byte \\local1\n\t.byte \\local2\n\t.endm\n\n\t@ Compares the value of the script data at index 'local' to a fixed value.\n\t@ The result is stored in comparisonResult to be acted on by goto_if / call_if\n\t.macro compare_local_to_value local:req, value:req\n\t.byte 0x1c\n\t.byte \\local\n\t.byte \\value\n\t.endm\n\n\t@ Compares the value of the script data at index 'local' to the value at 'ptr'\n\t@ The result is stored in comparisonResult to be acted on by goto_if / call_if\n\t.macro compare_local_to_ptr local:req, ptr:req\n\t.byte 0x1d\n\t.byte \\local\n\t.4byte \\ptr\n\t.endm\n\n\t@ Compares the value at 'ptr' to the value of the script data at index 'local'.\n\t@ The result is stored in comparisonResult to be acted on by goto_if / call_if\n\t.macro compare_ptr_to_local ptr:req, local:req\n\t.byte 0x1e\n\t.4byte \\ptr\n\t.byte \\local\n\t.endm\n\n\t@ Compares the value at 'ptr' to a fixed value.\n\t@ The result is stored in comparisonResult to be acted on by goto_if / call_if\n\t.macro compare_ptr_to_value ptr:req, value:req\n\t.byte 0x1f\n\t.4byte \\ptr\n\t.byte \\value\n\t.endm\n\n\t@ Compares the value at 'ptr1' to the value at 'ptr2'.\n\t@ The result is stored in comparisonResult to be acted on by goto_if / call_if\n\t.macro compare_ptr_to_ptr ptr1:req, ptr2:req\n\t.byte 0x20\n\t.4byte \\ptr1\n\t.4byte \\ptr2\n\t.endm\n\n\t@ Compares the value of 'var' to a fixed value.\n\t@ The result is stored in comparisonResult to be acted on by goto_if / call_if\n\t.macro compare_var_to_value var:req, value:req\n\t.byte 0x21\n\t.2byte \\var\n\t.2byte \\value\n\t.endm\n\n\t@ Compares the value of 'var1' to the value of 'var2'.\n\t@ The result is stored in comparisonResult to be acted on by goto_if / call_if\n\t.macro compare_var_to_var var1:req, var2:req\n\t.byte 0x22\n\t.2byte \\var1\n\t.2byte \\var2\n\t.endm\n\n\t@ Generic compare macro which attempts to deduce argument types based on their values\n\t@ Any values between VARS_START to VARS_END and SPECIAL_VARS_START to SPECIAL_VARS_END are considered event variable identifiers\n\t.macro compare var:req, arg:req\n\t\t.if ((\\arg >= VARS_START && \\arg <= VARS_END) || (\\arg >= SPECIAL_VARS_START && \\arg <= SPECIAL_VARS_END))\n\t\t\tcompare_var_to_var \\var, \\arg\n\t\t.else\n\t\t\tcompare_var_to_value \\var, \\arg\n\t\t.endif\n\t.endm\n\n\t@ Calls the native C function stored at func.\n\t.macro callnative func:req\n\t.byte 0x23\n\t.4byte \\func\n\t.endm\n\n\t@ Replaces the script with the function stored at func. Execution returns to the bytecode script when func returns TRUE.\n\t.macro gotonative func:req\n\t.byte 0x24\n\t.4byte \\func\n\t.endm\n\n\t@ Calls a function listed in the table in data/specials.inc.\n\t.macro special function:req\n\t.byte 0x25\n\t.2byte SPECIAL_\\function\n\t.endm\n\n\t@ Calls a function listed in the table in data/specials.inc.\n\t@ That function's output (if any) will be written to the variable specified by 'output'.\n\t.macro specialvar output:req, function:req\n\t.byte 0x26\n\t.2byte \\output\n\t.2byte SPECIAL_\\function\n\t.endm\n\n\t@ Blocks script execution until a command or C code manually unblocks it. Generally used with specific \n\t@ commands and specials. Calling ScriptContext_Enable for instance will allow execution to continue.\n\t.macro waitstate\n\t.byte 0x27\n\t.endm\n\n\t@ Blocks script execution for frames. (Pokemon Emerald runs at just shy of 60 frames per second.)\n\t.macro delay frames:req\n\t.byte 0x28\n\t.2byte \\frames\n\t.endm\n\n\t@ Sets flag to TRUE.\n\t.macro setflag flag:req\n\t.byte 0x29\n\t.2byte \\flag\n\t.endm\n\n\t@ Sets flag to FALSE.\n\t.macro clearflag flag:req\n\t.byte 0x2a\n\t.2byte \\flag\n\t.endm\n\n\t@ Compares flag to TRUE and stores the result in comparisonResult to be used by goto_if, etc\n\t@ See additional _if_unset and _if_set macros\n\t.macro checkflag flag:req\n\t.byte 0x2b\n\t.2byte \\flag\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, initializes the RTC's local time offset to the given hour and minute.\n\t.macro initclock hour:req, minute:req\n\t.byte 0x2c\n\t.2byte \\hour\n\t.2byte \\minute\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, updates local time using the RTC and runs time based events.\n\t.macro dotimebasedevents\n\t.byte 0x2d\n\t.endm\n\n\t@ Sets the values of variables VAR_0x8000, VAR_0x8001, and VAR_0x8002 to 0. In RSE, they'd get the current hour, minute, and second respectively.\n\t.macro gettime\n\t.byte 0x2e\n\t.endm\n\n\t@ Plays the specified sound. Only one sound may play at a time, with newer ones interrupting older ones.\n\t.macro playse song:req\n\t.byte 0x2f\n\t.2byte \\song\n\t.endm\n\n\t@ Blocks script execution until the currently-playing sound (triggered by playse) finishes playing.\n\t.macro waitse\n\t.byte 0x30\n\t.endm\n\n\t@ Plays the fanfare specified by the song number. If the specified song is not a fanfare it will instead play the first song in sFanfares.\n\t.macro playfanfare song:req\n\t.byte 0x31\n\t.2byte \\song\n\t.endm\n\n\t@ Blocks script execution until all currently-playing fanfares finish.\n\t.macro waitfanfare\n\t.byte 0x32\n\t.endm\n\n\t@ Plays the specified song. If save_song is TRUE, the\n\t@ specified song will be saved as if savebgm was called with it.\n\t.macro playbgm song:req, save_song:req\n\t.byte 0x33\n\t.2byte \\song\n\t.byte \\save_song\n\t.endm\n\n\t@ Saves the specified song to be played later. Saved music may be played when Overworld_PlaySpecialMapMusic is called. This occurs on\n\t@ exiting most warps.\n\t.macro savebgm song:req\n\t.byte 0x34\n\t.2byte \\song\n\t.endm\n\n\t@ Crossfades the currently-playing song into the map's default song.\n\t.macro fadedefaultbgm\n\t.byte 0x35\n\t.endm\n\n\t@ Crossfades the currently-playing song into the specified song.\n\t.macro fadenewbgm song:req\n\t.byte 0x36\n\t.2byte \\song\n\t.endm\n\n\t@ Fades out the currently-playing song.\n\t.macro fadeoutbgm speed:req\n\t.byte 0x37\n\t.byte \\speed\n\t.endm\n\n\t@ Fades the previously-playing song back in.\n\t.macro fadeinbgm speed:req\n\t.byte 0x38\n\t.byte \\speed\n\t.endm\n\n\t@ Helper macro for warp commands that formats their arguments.\n\t@ It allows warp macros to either provide 1. a valid id for which warp location to use,\n\t@ or 2. a pair of x/y coordinates to use. Both may be provided but at least one will be\n\t@ ignored by SetPlayerCoordsFromWarp. If none are provided it will use dummy arguments,\n\t@ and the warp will send the player to the center of the map.\n\t@ Examples of valid inputs for a warp command:\n\t@ - warp MAP, x, y\n\t@ - warp MAP, warpId\n\t@ - warp MAP\n\t@ - warp MAP, warpId, x, y\n\t.macro formatwarp map:req, a, b, c\n\tmap \\map\n\t.ifb \\a @ No arguments provided, use dummy warpId and coords.\n\t\t.byte WARP_ID_NONE\n\t\t.2byte -1 @ x\n\t\t.2byte -1 @ y\n\t.else\n\t.ifb \\b @ Only one argument provided, treat it as a warpId and use dummy coords.\n\t\t.byte \\a   @ warpId\n\t\t.2byte -1  @ x\n\t\t.2byte -1  @ y\n\t.else\n\t.ifb \\c @ Only two arguments provided, treat them as a coord pair and use dummy warpId.\n\t\t.byte WARP_ID_NONE\n\t\t.2byte \\a  @ x\n\t\t.2byte \\b  @ y\n\t.else @ All three arguments provided. Output them and let the warp sort out which to use.\n\t\t.byte \\a  @ warpId\n\t\t.2byte \\b @ x\n\t\t.2byte \\c @ y\n\t.endif\n\t.endif\n\t.endif\n\t.endm\n\n\t@ Warps the player to the specified map.\n\t@ Warp commands can be given either the id of which warp location to go to on the destination map\n\t@ or a pair of x/y coordinates to go to directly on the destination map.\n\t.macro warp map:req, a, b, c\n\t.byte 0x39\n\tformatwarp \\map, \\a, \\b, \\c\n\t.endm\n\n\t@ Warps the player to the specified map without playing a sound effect.\n\t@ Warp commands can be given either the id of which warp location to go to on the destination map\n\t@ or a pair of x/y coordinates to go to directly on the destination map.\n\t.macro warpsilent map:req, a, b, c\n\t.byte 0x3a\n\tformatwarp \\map, \\a, \\b, \\c\n\t.endm\n\n\t@ Warps the player to the specified map and plays a door opening animation before stepping upwards into it.\n\t@ Warp commands can be given either the id of which warp location to go to on the destination map\n\t@ or a pair of x/y coordinates to go to directly on the destination map.\n\t.macro warpdoor map:req, a, b, c\n\t.byte 0x3b\n\tformatwarp \\map, \\a, \\b, \\c\n\t.endm\n\n\t@ Warps the player to another map using a hole animation. If the specified map is MAP_UNDEFINED it will instead\n\t@ use the map set by setholewarp. In either case the target coordinates on the destination map will be the\n\t@ player's current position.\n\t.macro warphole map:req\n\t.byte 0x3c\n\tmap \\map\n\t.endm\n\n\t@ Warps the player to the specified map using a teleport effect. Effect is similar to warpspinenter but\n\t@ this warp has a fade out first and doesn't maintain the original facing direction.\n\t@ Warp commands can be given either the id of which warp location to go to on the destination map\n\t@ or a pair of x/y coordinates to go to directly on the destination map.\n\t.macro warpteleport map:req, a, b, c\n\t.byte 0x3d\n\tformatwarp \\map, \\a, \\b, \\c\n\t.endm\n\n\t@ Sets the warp destination to be used later.\n\t@ Warp commands can be given either the id of which warp location to go to on the destination map\n\t@ or a pair of x/y coordinates to go to directly on the destination map.\n\t.macro setwarp map:req, a, b, c\n\t.byte 0x3e\n\tformatwarp \\map, \\a, \\b, \\c\n\t.endm\n\n\t@ Sets the dynamic warp destination. Warps with a destination map of MAP_DYNAMIC will target this destination.\n\t@ Warp commands can be given either the id of which warp location to go to on the destination map\n\t@ or a pair of x/y coordinates to go to directly on the destination map.\n\t.macro setdynamicwarp map:req, a, b, c\n\t.byte 0x3f\n\tformatwarp \\map, \\a, \\b, \\c\n\t.endm\n\n\t@ Sets the destination that diving or emerging from a dive will take the player to. Note that this only\n\t@ applies if the current map does not have a dive/emerge connection. If it does have a corresponding\n\t@ map connection then that map and the player's current coordinates will be used as the destination instead.\n\t@ Warp commands can be given either the id of which warp location to go to on the destination map\n\t@ or a pair of x/y coordinates to go to directly on the destination map.\n\t.macro setdivewarp map:req, a, b, c\n\t.byte 0x40\n\tformatwarp \\map, \\a, \\b, \\c\n\t.endm\n\n\t@ Sets the destination that falling into a hole will take the player to.\n\t@ While it does accept and set the x/y coordinates and warpId, they are ultimately ignored.\n\t@ This is only used to set the map the player should fall to. The exact location on the\n\t@ map to fall to is determined by warphole.\n\t@ Warp commands can be given either the id of which warp location to go to on the destination map\n\t@ or a pair of x/y coordinates to go to directly on the destination map.\n\t.macro setholewarp map:req, a=0, b=0, c\n\t.byte 0x41\n\tformatwarp \\map, \\a, \\b, \\c\n\t.endm\n\n\t@ Retrieves the player's zero-indexed x- and y-coordinates in the map, and stores them in the specified variables.\n\t.macro getplayerxy x:req, y:req\n\t.byte 0x42\n\t.2byte \\x\n\t.2byte \\y\n\t.endm\n\n\t@ Retrieves the number of Pokemon in the player's party, and stores that number in VAR_RESULT.\n\t.macro getpartysize\n\t.byte 0x43\n\t.endm\n\n\t@ Attempts to add quantity of the specified item to the player's Bag. If the player has enough room, the item will\n\t@ be added and VAR_RESULT will be set to TRUE; otherwise, VAR_RESULT is set to FALSE.\n\t.macro additem itemId:req, quantity=1\n\t.byte 0x44\n\t.2byte \\itemId\n\t.2byte \\quantity\n\t.endm\n\n\t@ Removes quantity of the specified item from the player's Bag. If the player has fewer than 'quantity' in their bag\n\t@ then none will be removed and VAR_RESULT will be set to FALSE. Otherwise it will be set to TRUE.\n\t.macro removeitem itemId:req, quantity=1\n\t.byte 0x45\n\t.2byte \\itemId\n\t.2byte \\quantity\n\t.endm\n\n\t@ Checks if the player has enough space in their Bag to hold quantity more of the specified item. Sets VAR_RESULT to\n\t@ TRUE if there is room, or FALSE is there is no room.\n\t.macro checkitemspace itemId:req, quantity=1\n\t.byte 0x46\n\t.2byte \\itemId\n\t.2byte \\quantity\n\t.endm\n\n\t@ Checks if the player has quantity or more of the specified item in their Bag. Sets VAR_RESULT to TRUE if the player has\n\t@ enough of the item, or FALSE if they have fewer than quantity of the item.\n\t.macro checkitem itemId:req, quantity=1\n\t.byte 0x47\n\t.2byte \\itemId\n\t.2byte \\quantity\n\t.endm\n\n\t@ Checks which Bag pocket the specified item belongs in, and writes the pocket value (POCKET_*) to VAR_RESULT.\n\t@ This is used to show the name of the proper Bag pocket when the player receives an item via callstd.\n\t.macro checkitemtype itemId:req\n\t.byte 0x48\n\t.2byte \\itemId\n\t.endm\n\n\t@ Adds quantity of the specified item to the player's PC.\n\t.macro addpcitem itemId:req, quantity=1\n\t.byte 0x49\n\t.2byte \\itemId\n\t.2byte \\quantity\n\t.endm\n\n\t@ Checks for quantity of the specified item in the player's PC.\n\t.macro checkpcitem itemId:req, quantity=1\n\t.byte 0x4a\n\t.2byte \\itemId\n\t.2byte \\quantity\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, adds a decoration to the player's PC.\n\t.macro adddecoration decoration:req\n\t.byte 0x4b\n\t.2byte \\decoration\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, removes a decoration from the player's PC.\n\t.macro removedecoration decoration:req\n\t.byte 0x4c\n\t.2byte \\decoration\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, checks for decoration in the player's PC.\n\t.macro checkdecor decoration:req\n\t.byte 0x4d\n\t.2byte \\decoration\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, checks if the player has enough space in their PC to hold the decoration.\n\t.macro checkdecorspace decoration:req\n\t.byte 0x4e\n\t.2byte \\decoration\n\t.endm\n\n\t@ Applies the movement data at movements to the specified (localId) object. If no map is specified, then the current map is used.\n\t.macro applymovement localId:req, movements:req, map\n\t\t.ifb \\map\n\t\t\t.byte 0x4f\n\t\t\t.2byte \\localId\n\t\t\t.4byte \\movements\n\t\t.else\n\t\t\t@ Really only useful if the object has followed from one map to another (e.g. Wally during the catching event).\n\t\t\t.byte 0x50\n\t\t\t.2byte \\localId\n\t\t\t.4byte \\movements\n\t\t\tmap \\map\n\t\t.endif\n\t.endm\n\n\t@ Blocks script execution until the movements being applied to the specified (localId) object finish.\n\t@ If localId is 0, then the id of the last-moved object will be used instead. If the specified object\n\t@ is not currently being manipulated with applymovement, then this command does nothing.\n\t@ If no map is specified, then the current map is used.\n\t.macro waitmovement localId:req, map\n\t\t.ifb \\map\n\t\t\t.byte 0x51\n\t\t\t.2byte \\localId\n\t\t.else\n\t\t\t.byte 0x52\n\t\t\t.2byte \\localId\n\t\t\tmap \\map\n\t\t.endif\n\t.endm\n\n\t@ Attempts to despawn the specified (localId) object on the specified map.\n\t@ It also sets the object's visibility flag if it has one.\n\t@ If no map is specified, then the current map is used.\n\t.macro removeobject localId:req, map\n\t\t.ifb \\map\n\t\t\t.byte 0x53\n\t\t\t.2byte \\localId\n\t\t.else\n\t\t\t.byte 0x54\n\t\t\t.2byte \\localId\n\t\t\tmap \\map\n\t\t.endif\n\t.endm\n\n\t@ Attempts to spawn the specified (localId) object the specified map.\n\t@ Note that unlike removeobject this does not modify the object's flag.\n\t@ If no map is specified, then the current map is used.\n\t.macro addobject localId:req, map\n\t\t.ifb \\map\n\t\t\t.byte 0x55\n\t\t\t.2byte \\localId\n\t\t.else\n\t\t\t.byte 0x56\n\t\t\t.2byte \\localId\n\t\t\tmap \\map\n\t\t.endif\n\t.endm\n\n\t@ Sets the specified (localId) object's position on the current map.\n\t.macro setobjectxy localId:req, x:req, y:req\n\t.byte 0x57\n\t.2byte \\localId\n\t.2byte \\x\n\t.2byte \\y\n\t.endm\n\n\t@ Sets the specified object's invisibility to FALSE.\n\t.macro showobjectat localId:req, map:req\n\t.byte 0x58\n\t.2byte \\localId\n\tmap \\map\n\t.endm\n\n\t@ Sets the specified object's invisibility to TRUE.\n\t.macro hideobjectat localId:req, map:req\n\t.byte 0x59\n\t.2byte \\localId\n\tmap \\map\n\t.endm\n\n\t@ Turns the currently selected object (if there is one) to face the player.\n\t.macro faceplayer\n\t.byte 0x5a\n\t.endm\n\n\t@ Turns the specified object in the specified direction.\n\t.macro turnobject localId:req, direction:req\n\t.byte 0x5b\n\t.2byte \\localId\n\t.byte \\direction\n\t.endm\n\n\t@ Configures the arguments for a trainer battle, then jumps to the appropriate script in scripts/trainer_battle.inc\n\t.macro trainerbattle type:req, trainer:req, local_id:req, pointer1:req, pointer2, pointer3, pointer4\n\t\t.byte 0x5c\n\t\t.byte \\type\n\t\t.2byte \\trainer\n\t\t.2byte \\local_id\n\t\t.if \\type == TRAINER_BATTLE_SINGLE\n\t\t\t.4byte \\pointer1 @ text\n\t\t\t.4byte \\pointer2 @ text\n\t\t.elseif \\type == TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC\n\t\t\t.4byte \\pointer1 @ text\n\t\t\t.4byte \\pointer2 @ text\n\t\t\t.4byte \\pointer3 @ event script\n\t\t.elseif \\type == TRAINER_BATTLE_CONTINUE_SCRIPT\n\t\t\t.4byte \\pointer1 @ text\n\t\t\t.4byte \\pointer2 @ text\n\t\t\t.4byte \\pointer3 @ event script\n\t\t.elseif \\type == TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT\n\t\t\t.4byte \\pointer1 @ text\n\t\t.elseif \\type == TRAINER_BATTLE_DOUBLE\n\t\t\t.4byte \\pointer1 @ text\n\t\t\t.4byte \\pointer2 @ text\n\t\t\t.4byte \\pointer3 @ text\n\t\t.elseif \\type == TRAINER_BATTLE_REMATCH\n\t\t\t.4byte \\pointer1 @ text\n\t\t\t.4byte \\pointer2 @ text\n\t\t.elseif \\type == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE\n\t\t\t.4byte \\pointer1 @ text\n\t\t\t.4byte \\pointer2 @ text\n\t\t\t.4byte \\pointer3 @ text\n\t\t\t.4byte \\pointer4 @ event script\n\t\t.elseif \\type == TRAINER_BATTLE_REMATCH_DOUBLE\n\t\t\t.4byte \\pointer1 @ text\n\t\t\t.4byte \\pointer2 @ text\n\t\t\t.4byte \\pointer3 @ text\n\t\t.elseif \\type == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC\n\t\t\t.4byte \\pointer1 @ text\n\t\t\t.4byte \\pointer2 @ text\n\t\t\t.4byte \\pointer3 @ text\n\t\t\t.4byte \\pointer4 @ event script\n\t\t.elseif \\type == TRAINER_BATTLE_EARLY_RIVAL\n\t\t\t.4byte \\pointer1 @ text\n\t\t\t.4byte \\pointer2 @ text\n\t\t.endif\n\t.endm\n\n\tNO_MUSIC = FALSE\n\n\t@ Starts a single trainer battle. Takes a trainer, intro text, loss text, and an optional event script.\n\t@ When used with an event script, you can also pass in an optional flag to disable music\n\t.macro trainerbattle_single trainer:req, intro_text:req, lose_text:req, event_script=FALSE, music=TRUE\n\t.if \\event_script == FALSE\n\ttrainerbattle TRAINER_BATTLE_SINGLE, \\trainer, 0, \\intro_text, \\lose_text\n\t.elseif \\music == TRUE\n\ttrainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, \\trainer, 0, \\intro_text, \\lose_text, \\event_script\n\t.else\n\ttrainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC, \\trainer, 0, \\intro_text, \\lose_text, \\event_script\n\t.endif\n\t.endm\n\n\t@ Starts a double trainer battle. Takes a trainer, intro text, loss text, text for when you have too few pokemon\n\t@ and an optional event script. When used with an event script you can pass in an optional flag to disable music\n\t.macro trainerbattle_double trainer:req, intro_text:req, lose_text:req, not_enough_pkmn_text:req, event_script=FALSE, music=TRUE\n\t.if \\event_script == FALSE\n\ttrainerbattle TRAINER_BATTLE_DOUBLE, \\trainer, 0, \\intro_text, \\lose_text, \\not_enough_pkmn_text\n\t.elseif \\music == TRUE\n\ttrainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE, \\trainer, 0, \\intro_text, \\lose_text, \\not_enough_pkmn_text, \\event_script\n\t.else\n\ttrainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC, \\trainer, 0, \\intro_text, \\lose_text, \\not_enough_pkmn_text, \\event_script\n\t.endif\n\t.endm\n\n\t@ Starts a rematch battle, takes a trainer, intro text and loss text\n\t.macro trainerbattle_rematch trainer:req, intro_text:req, lose_text:req\n\ttrainerbattle TRAINER_BATTLE_REMATCH, \\trainer, 0, \\intro_text, \\lose_text\n\t.endm\n\n\t@ Starts a rematch double battle. Takes a trainer, intro text, loss text, and text for when you have too few pokemon\n\t.macro trainerbattle_rematch_double trainer:req, intro_text:req, lose_text:req, not_enough_pkmn_text:req\n\ttrainerbattle TRAINER_BATTLE_REMATCH_DOUBLE, \\trainer, 0, \\intro_text, \\lose_text, \\not_enough_pkmn_text\n\t.endm\n\n\t@ Starts a trainer battle, skipping intro text. Takes a trainer and loss text\n\t.macro trainerbattle_no_intro trainer:req, lose_text:req\n\ttrainerbattle TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT, \\trainer, 0, \\lose_text\n\t.endm\n\n\t@ Starts a trainer battle with victory text if the player loses. If flags is nonzero, the player will be healed after battle (and its assumed to be the tutorial battle)\n\t.macro trainerbattle_earlyrival trainer:req, flags:req, defeat_text:req, victory_text:req\n\ttrainerbattle TRAINER_BATTLE_EARLY_RIVAL, \\trainer, \\flags, \\defeat_text, \\victory_text\n\t.endm\n\n\t@ Starts a trainer battle using the battle information stored in RAM (usually by the scripts in trainer_battle.inc, which\n\t@ are run by trainerbattle), and blocks script execution until the battle finishes.\n\t.macro dotrainerbattle\n\t.byte 0x5d\n\t.endm\n\n\t@ Goes to address after the trainerbattle command (called by the battle functions, see battle_setup.c)\n\t.macro gotopostbattlescript\n\t.byte 0x5e\n\t.endm\n\n\t@ Goes to address specified in the trainerbattle command (called by the battle functions, see battle_setup.c)\n\t.macro gotobeatenscript\n\t.byte 0x5f\n\t.endm\n\n\t@ Checks if the trainer has been defeated by the player (by comparing the flag 'trainer + TRAINER_FLAGS_START' to TRUE).\n\t.macro checktrainerflag trainer:req\n\t.byte 0x60\n\t.2byte \\trainer\n\t.endm\n\n\t@ Sets the trainer flag (trainer + TRAINER_FLAGS_START) to TRUE (defeated).\n\t.macro settrainerflag trainer:req\n\t.byte 0x61\n\t.2byte \\trainer\n\t.endm\n\n\t@ Sets the trainer flag (trainer + TRAINER_FLAGS_START) to FALSE (not defeated).\n\t.macro cleartrainerflag trainer:req\n\t.byte 0x62\n\t.2byte \\trainer\n\t.endm\n\n\t@ Sets the coordinates of an object's template, so that if the sprite goes off screen\n\t@ it'll still be there when it comes back on screen.\n\t.macro setobjectxyperm localId:req, x:req, y:req\n\t.byte 0x63\n\t.2byte \\localId\n\t.2byte \\x\n\t.2byte \\y\n\t.endm\n\n\t@ Copies a live object event's xy position to its template, so that if the sprite goes off screen\n\t@ it'll still be there when it comes back on screen.\n\t.macro copyobjectxytoperm localId:req\n\t.byte 0x64\n\t.2byte \\localId\n\t.endm\n\n\t@ Sets the movement type (MOVEMENT_TYPE_*) for an object's template.\n\t.macro setobjectmovementtype localId:req, movementType:req\n\t.byte 0x65\n\t.2byte \\localId\n\t.byte \\movementType\n\t.endm\n\n\t@ If a standard message box (or its text) is being drawn on-screen, this command blocks script execution until the\n\t@ box and its text have been fully drawn.\n\t.macro waitmessage\n\t.byte 0x66\n\t.endm\n\n\t@ Starts displaying a standard message box containing the specified text. If text is a pointer, then the string at\n\t@ that offset will be loaded and used. If text is NULL, then the value of script data 0 will be treated as\n\t@ a pointer to the text. The 'loadword 0' in msgbox sets this value, for instance.\n\t.macro message text:req\n\t.byte 0x67\n\t.4byte \\text\n\t.endm\n\n\t@ Closes the current message box.\n\t.macro closemessage\n\t.byte 0x68\n\t.endm\n\n\t@ Freezes all objects immediately except the player. The player is frozen once their movement is finished.\n\t.macro lockall\n\t.byte 0x69\n\t.endm\n\n\t@ Freezes all objects immediately except the player and the selected object. The player and selected object are frozen once their movement is finished.\n\t.macro lock\n\t.byte 0x6a\n\t.endm\n\n\t@ Resumes normal movement for all objects on-screen, and closes any standard message boxes that are still open.\n\t.macro releaseall\n\t.byte 0x6b\n\t.endm\n\n\t@ Resumes normal movement for the selected object (if there is one) and the player. Also closes any standard message boxes that are still open.\n\t.macro release\n\t.byte 0x6c\n\t.endm\n\n\t@ Blocks script execution until the player presses the A or B button.\n\t.macro waitbuttonpress\n\t.byte 0x6d\n\t.endm\n\n\t@ Displays a YES/NO multichoice box at the specified coordinates, and blocks script execution until the user makes a selection.\n\t@ Their selection is stored in VAR_RESULT as NO (0) or YES (1). Pressing B is equivalent to answering NO\n\t.macro yesnobox x:req, y:req\n\t.byte 0x6e\n\t.byte \\x\n\t.byte \\y\n\t.endm\n\n\t@ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made.\n\t@ Lists of options are predefined (sMultichoiceLists) and the one to be used is specified with multichoiceId.\n\t@ If ignoreBPress is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button.\n\t.macro multichoice x:req, y:req, multichoiceId:req, ignoreBPress:req\n\t.byte 0x6f\n\t.byte \\x\n\t.byte \\y\n\t.byte \\multichoiceId\n\t.byte \\ignoreBPress\n\t.endm\n\n\t@ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made.\n\t@ Lists of options are predefined (sMultichoiceLists) and the one to be used is specified with multichoiceId.\n\t@ The default argument determines the initial position of the cursor when the box is first opened; it is zero-indexed, and if it is too large, it is treated as 0.\n\t@ If ignoreBPress is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button.\n\t.macro multichoicedefault x:req, y:req, multichoiceId:req, default:req, ignoreBPress:req\n\t.byte 0x70\n\t.byte \\x\n\t.byte \\y\n\t.byte \\multichoiceId\n\t.byte \\default\n\t.byte \\ignoreBPress\n\t.endm\n\n\t@ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made.\n\t@ Lists of options are predefined (sMultichoiceLists) and the one to be used is specified with multichoiceId.\n\t@ The per_row argument determines how many list items will be shown on a single row of the box.\n\t@ If ignoreBPress is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button.\n\t.macro multichoicegrid x:req, y:req, multichoiceId:req, per_row:req, ignoreBPress:req\n\t.byte 0x71\n\t.byte \\x\n\t.byte \\y\n\t.byte \\multichoiceId\n\t.byte \\per_row\n\t.byte \\ignoreBPress\n\t.endm\n\n\t@ In FRLG, this command is a nop.\n\t.macro drawbox\n\t.byte 0x72\n\t.endm\n\n\t@ In FRLG, this command is a nop. Still consumes parameters.\n\t.macro erasebox left:req, top:req, right:req, bottom:req\n\t.byte 0x73\n\t.byte \\left\n\t.byte \\top\n\t.byte \\right\n\t.byte \\bottom\n\t.endm\n\n\t@ In FRLG, this command is a nop. Still consumes parameters.\n\t.macro drawboxtext left:req, top:req, multichoiceId:req, ignoreBPress:req\n\t.byte 0x74\n\t.byte \\left\n\t.byte \\top\n\t.byte \\multichoiceId\n\t.byte \\ignoreBPress\n\t.endm\n\n\t@ Displays a box containing the front sprite for the specified Pokemon species and plays its cry.\n\t.macro showmonpic species:req, x:req, y:req\n\t.byte 0x75\n\t.2byte \\species\n\t.byte \\x\n\t.byte \\y\n\t.endm\n\n\t@ Hides the box displayed by showmonpic.\n\t.macro hidemonpic\n\t.byte 0x76\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, draws an image of the winner of the contest. winnerId is any CONTEST_WINNER_* constant.\n\t.macro showcontestpainting winnerId:req\n\t.byte 0x77\n\t.byte \\winnerId\n\t.endm\n\n\t@ Displays the given string as braille text in a standard message box. The string should use the .braille directive\n\t@ to convert text to braille, and be preceded by brailleformat. The brailleformat data is skipped over (in RS, these\n\t@ bytes determined the box's size and position, but in Emerald these are calculated automatically).\n\t.macro braillemessage text:req\n\t.byte 0x78\n\t.4byte \\text\n\t.endm\n\n\t@ Formatting for the braille window, to be put at the start of a pointer used by braillemessage.\n\t.macro brailleformat winLeft:req, winTop:req, winRight:req, winBottom:req, textLeft:req, textTop:req\n\t.byte \\winLeft\n\t.byte \\winTop\n\t.byte \\winRight\n\t.byte \\winBottom\n\t.byte \\textLeft\n\t.byte \\textTop\n\t.endm\n\n\t@ Gives the player a Pokémon of the specified species and level, holding the specified item. The trailing 0s are unused parameters.\n\t@ VAR_RESULT will be set to MON_GIVEN_TO_PARTY, MON_GIVEN_TO_PC, or MON_CANT_GIVE depending on the outcome. \n\t.macro givemon species:req, level:req, item=ITEM_NONE\n\t.byte 0x79\n\t.2byte \\species\n\t.byte \\level\n\t.2byte \\item\n\t.4byte 0\n\t.4byte 0\n\t.byte 0\n\t.endm\n\n\t@ Gives the player an Egg of the specified species.\n\t@ VAR_RESULT will be set to MON_GIVEN_TO_PARTY, MON_GIVEN_TO_PC, or MON_CANT_GIVE depending on the outcome. \n\t.macro giveegg species:req\n\t.byte 0x7a\n\t.2byte \\species\n\t.endm\n\n\t@ Replaces the move at 'slot' of the Pokémon in the player's party at 'partyIndex' with the specified move.\n\t@ If a value greater than PARTY_SIZE is given for partyIndex it will use the last Pokémon in the party instead.\n\t@ Note that this means in vanilla a value equal to PARTY_SIZE for partyIndex will go out of bounds.\n\t.macro setmonmove partyIndex:req, slot:req, move:req\n\t.byte 0x7b\n\t.byte \\partyIndex\n\t.byte \\slot\n\t.2byte \\move\n\t.endm\n\n\t@ Checks if at least one Pokemon in the player's party knows the specified move. If so, VAR_RESULT is set to the\n\t@ (zero-indexed) slot number of the first Pokemon that knows the move. If not, VAR_RESULT is set to PARTY_SIZE.\n\t@ VAR_0x8004 is also set to this Pokemon's species.\n\t.macro checkpartymove move:req\n\t.byte 0x7c\n\t.2byte \\move\n\t.endm\n\n\t@ Converts STR_VAR_1, STR_VAR_2, or STR_VAR_3 to its corresponding index into sScriptStringVars (0, 1, or 2).\n\t@ If given anything else it will output it directly.\n\t@ Note: Because the STR_VAR_# arguments given to this macro are not part of a processed string they are not\n\t@       replaced with their charmap values, they are just passed as the literal characters \"STR_VAR_#\".\n\t.macro stringvar id:req\n\t.if \\id == STR_VAR_1\n\t\t.byte 0\n\t.elseif \\id == STR_VAR_2\n\t\t.byte 1\n\t.elseif \\id == STR_VAR_3\n\t\t.byte 2\n\t.else\n\t\t.byte \\id\n\t.endif\n\t.endm\n\n\t@ Writes the name of the given Pokemon species to the specified buffer.\n\t.macro bufferspeciesname stringVarId:req, species:req\n\t.byte 0x7d\n\tstringvar \\stringVarId\n\t.2byte \\species\n\t.endm\n\n\t@ Writes the name of the species of the first Pokemon in the player's party to the specified buffer.\n\t.macro bufferleadmonspeciesname stringVarId:req\n\t.byte 0x7e\n\tstringvar \\stringVarId\n\t.endm\n\n\t@ Writes the nickname of the Pokemon in 'slot' (zero-indexed) of the player's party to the specified buffer.\n\t@ If an empty or invalid slot is specified, ten spaces (\"\") are written to the buffer.\n\t.macro bufferpartymonnick stringVarId:req, slot:req\n\t.byte 0x7f\n\tstringvar \\stringVarId\n\t.2byte \\slot\n\t.endm\n\n\t@ Writes the name of the specified item to the specified buffer. If itemId is >= ITEMS_COUNT,\n\t@ then the name of ITEM_NONE (\"????????\") is buffered instead.\n\t.macro bufferitemname stringVarId:req, item:req\n\t.byte 0x80\n\tstringvar \\stringVarId\n\t.2byte \\item\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, writes the name of the specified decoration to the specified buffer.\n\t.macro bufferdecorationname stringVarId:req, decoration:req\n\t.byte 0x81\n\tstringvar \\stringVarId\n\t.2byte \\decoration\n\t.endm\n\n\t@ Writes the name of the specified move to the specified buffer.\n\t.macro buffermovename stringVarId:req, move:req\n\t.byte 0x82\n\tstringvar \\stringVarId\n\t.2byte \\move\n\t.endm\n\n\t@ Converts the value of input to a decimal string, and writes that string to the specified buffer.\n\t.macro buffernumberstring stringVarId:req, input:req\n\t.byte 0x83\n\tstringvar \\stringVarId\n\t.2byte \\input\n\t.endm\n\n\t@ Writes the given standard string (STDSTRING_*) to the specified buffer. Invalid std string ids are not handled.\n\t.macro bufferstdstring stringVarId:req, index:req\n\t.byte 0x84\n\tstringvar \\stringVarId\n\t.2byte \\index\n\t.endm\n\n\t@ Copies the string at the given pointer to the specified buffer.\n\t.macro bufferstring stringVarId:req, text:req\n\t.byte 0x85\n\tstringvar \\stringVarId\n\t.4byte \\text\n\t.endm\n\n\t@ Opens the Pokemart system, offering the specified products for sale.\n\t@ Products should be a list of .2byte item values preceded by an .align 2\n\t.macro pokemart products:req\n\t.byte 0x86\n\t.4byte \\products\n\t.endm\n\n\t@ Opens the Pokemart system and treats the list of items as decorations.\n\t@ Products should be a list of .2byte decoration values preceded by an .align 2\n\t.macro pokemartdecoration products:req\n\t.byte 0x87\n\t.4byte \\products\n\t.endm\n\n\t@ Identical to pokemartdecoration, but with slight changes to the clerk dialogue. See uses of MART_TYPE_DECOR2.\n\t.macro pokemartdecoration2 products:req\n\t.byte 0x88\n\t.4byte \\products\n\t.endm\n\n\t@ Starts up the slot machine minigame. id is a SLOT_MACHINE_* value that influences probabilities of certain reel outcomes.\n\t.macro playslotmachine id:req\n\t.byte 0x89\n\t.2byte \\id\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, sets a berry tree's berry and growth stage.\n\t.macro setberrytree treeId:req, berry:req, growthStage:req\n\t.byte 0x8a\n\t.byte \\treeId\n\t.byte \\berry\n\t.byte \\growthStage\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, opens the party menu to select a Pokemon for a contest.\n\t.macro choosecontestmon\n\t.byte 0x8b\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, starts the appeals round of a contest.\n\t.macro startcontest\n\t.byte 0x8c\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, shows the results screen of a contest.\n\t.macro showcontestresults\n\t.byte 0x8d\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, starts communication to initialize a link contest.\n\t.macro contestlinktransfer\n\t.byte 0x8e\n\t.endm\n\n\t@ Stores a random integer between 0 and limit (exclusive of limit) in VAR_RESULT.\n\t.macro random limit:req\n\t.byte 0x8f\n\t.2byte \\limit\n\t.endm\n\n\t@ Adds value to the player's money. If adding 'value' money would exceed MAX_MONEY, the player's money is set to MAX_MONEY.\n\t@ If 'disable' is set to anything but 0 then this command does nothing.\n\t.macro addmoney value:req, disable=0\n\t.byte 0x90\n\t.4byte \\value\n\t.byte \\disable\n\t.endm\n\n\t@ Subtracts value from the player's money. If the player has less than 'value' money, their money is set to 0.\n\t@ If 'disable' is set to anything but 0 then this command does nothing.\n\t.macro removemoney value:req, disable=0\n\t.byte 0x91\n\t.4byte \\value\n\t.byte \\disable\n\t.endm\n\n\t@ Checks if the player has money >= value. VAR_RESULT is set to TRUE if the player has enough money, or FALSE if they do not.\n\t@ If 'disable' is set to anything but 0 then this command does nothing.\n\t.macro checkmoney value:req, disable=0\n\t.byte 0x92\n\t.4byte \\value\n\t.byte \\disable\n\t.endm\n\n\t@ Creates a window showing how much money the player has.\n\t@ If 'disable' is set to anything but 0 then this command does nothing.\n\t.macro showmoneybox x:req, y:req, disable=0\n\t.byte 0x93\n\t.byte \\x\n\t.byte \\y\n\t.byte \\disable\n\t.endm\n\n\t@ Destroys the window created by showmoneybox. Consumption of the x and y arguments was dummied out.\n\t.macro hidemoneybox\n\t.byte 0x94\n\t.byte 0  @ \\x\n\t.byte 0  @ \\y\n\t.endm\n\n\t@ Updates the window created by showmoneybox. Consumption of the x and y arguments was dummied out.\n\t@ If 'disable' is set to anything but 0 then this command does nothing.\n\t.macro updatemoneybox disable=0\n\t.byte 0x95\n\t.byte 0  @ \\x\n\t.byte 0  @ \\y\n\t.byte \\disable\n\t.endm\n\n\t@ In FRLG, this command is a nop. In RSE, gets whether the effects of the specified PokeNews program are active.\n\t.macro getpokenewsactive newsKind:req\n\t.byte 0x96\n\t.2byte \\newsKind\n\t.endm\n\n\t@ Fades the screen to and from black and white. Modes are FADE_(TO/FROM)_(WHITE/BLACK)\n\t.macro fadescreen mode:req\n\t.byte 0x97\n\t.byte \\mode\n\t.endm\n\n\t@ Fades the screen to and from black and white. Modes are FADE_(TO/FROM)_(WHITE/BLACK)\n\t.macro fadescreenspeed mode:req, speed:req\n\t.byte 0x98\n\t.byte \\mode\n\t.byte \\speed\n\t.endm\n\n\t@ Sets the flash level. A level of 0 is fully bright, a level of 1 is the largest flash radius, a level\n\t@ of 7 is the smallest flash radius, a level of 8 is fully black.\n\t.macro setflashlevel level:req\n\t.byte 0x99\n\t.2byte \\level\n\t.endm\n\n\t@ Animates the flash radius from its current size to the size it would be at the specified level.\n\t@ Note that this does not actually change the current flash level. It's typically used just before a setflashlevel.\n\t.macro animateflash level:req\n\t.byte 0x9a\n\t.byte \\level\n\t.endm\n\n\t@ Automatically scrolls through the message without player input and at a fixed speed.\n\t.macro messageautoscroll text:req\n\t.byte 0x9b\n\t.4byte \\text\n\t.endm\n\n\t@ Executes the specified field effect animation (FLDEFF_*).\n\t.macro dofieldeffect animation:req\n\t.byte 0x9c\n\t.2byte \\animation\n\t.endm\n\n\t@ Sets the field effect argument at index 'argNum' to 'value.'\n\t.macro setfieldeffectargument argNum:req, value:req\n\t.byte 0x9d\n\t.byte \\argNum\n\t.2byte \\value\n\t.endm\n\n\t@ Blocks script execution until all playing field effect animations complete.\n\t.macro waitfieldeffect animation:req\n\t.byte 0x9e\n\t.2byte \\animation\n\t.endm\n\n\t@ Sets which healing place the player will return to if all of the Pokemon in their party faint.\n\t.macro setrespawn heallocation:req\n\t.byte 0x9f\n\t.2byte \\heallocation\n\t.endm\n\n\t@ Checks the player's gender. Stores the result (MALE (0) or FEMALE (1)) in VAR_RESULT.\n\t.macro checkplayergender\n\t.byte 0xa0\n\t.endm\n\n\t@ Plays the cry of the given species. Mode is any CRY_MODE_* constant.\n\t@ You can use waitmoncry to block script execution until the cry finishes.\n\t.macro playmoncry species:req, mode:req\n\t.byte 0xa1\n\t.2byte \\species\n\t.2byte \\mode\n\t.endm\n\n\t@ Set the metatile at (x, y) on the current map to the given metatile and impassability.\n\t.macro setmetatile x:req, y:req, metatileId:req, impassable:req\n\t.byte 0xa2\n\t.2byte \\x\n\t.2byte \\y\n\t.2byte \\metatileId\n\t.2byte \\impassable\n\t.endm\n\n\t@ Queues a weather change to the default weather for the map.\n\t.macro resetweather\n\t.byte 0xa3\n\t.endm\n\n\t@ Queues a weather change to type weather.\n\t.macro setweather type:req\n\t.byte 0xa4\n\t.2byte \\type\n\t.endm\n\n\t@ Executes the weather change queued with resetweather or setweather. The current weather will smoothly fade into the queued weather.\n\t.macro doweather\n\t.byte 0xa5\n\t.endm\n\n\t@ Enables the overworld task specified by stepCbId (STEP_CB_*). Only 1 can be active at a time. See src/field_tasks.c for more.\n\t.macro setstepcallback stepCbId:req\n\t.byte 0xa6\n\t.byte \\stepCbId\n\t.endm\n\n\t@ Sets the current map layout to the one specified by index (LAYOUT_*).\n\t@ This should be done before the layout is loaded, typically in the ON_TRANSITION map script.\n\t.macro setmaplayoutindex index:req\n\t.byte 0xa7\n\t.2byte \\index\n\t.endm\n\n\t@ Sets the specified object's sprite's subpriority, and sets fixedPriority to TRUE.\n\t@ Only used to hide the player and Briney behind the boat.\n\t.macro setobjectsubpriority localId:req, map:req, subpriority:req\n\t.byte 0xa8\n\t.2byte \\localId\n\tmap \\map\n\t.byte \\subpriority\n\t.endm\n\n\t@ Sets the specified object's fixedPriority to FALSE. Does not change the subpriority field.\n\t.macro resetobjectsubpriority localId:req, map:req\n\t.byte 0xa9\n\t.2byte \\localId\n\tmap \\map\n\t.endm\n\n\t@ Creates a sprite with object graphics. Used when creating large groups of static NPCs that exceed the object event limit.\n\t@ The specified id can be used to refer to the sprite again later with turnvobject.\n\t.macro createvobject graphicsId:req, id:req, x:req, y:req, elevation=3, direction=DIR_SOUTH\n\t.byte 0xaa\n\t.byte \\graphicsId\n\t.byte \\id\n\t.2byte \\x\n\t.2byte \\y\n\t.byte \\elevation\n\t.byte \\direction\n\t.endm\n\n\t@ Turns a sprite created with createvobject.\n\t.macro turnvobject id:req, direction:req\n\t.byte 0xab\n\t.byte \\id\n\t.byte \\direction\n\t.endm\n\n\t@ Opens the door metatile at (x, y) with an animation.\n\t.macro opendoor x:req, y:req\n\t.byte 0xac\n\t.2byte \\x\n\t.2byte \\y\n\t.endm\n\n\t@ Closes the door metatile at (x, y) with an animation.\n\t.macro closedoor x:req, y:req\n\t.byte 0xad\n\t.2byte \\x\n\t.2byte \\y\n\t.endm\n\n\t@ Waits for the door animation started with opendoor or closedoor to finish.\n\t.macro waitdooranim\n\t.byte 0xae\n\t.endm\n\n\t@ Sets the door metatile at (x, y) to be open without an animation.\n\t.macro setdooropen x:req, y:req\n\t.byte 0xaf\n\t.2byte \\x\n\t.2byte \\y\n\t.endm\n\n\t@ Sets the door metatile at (x, y) to be closed without an animation.\n\t.macro setdoorclosed x:req, y:req\n\t.byte 0xb0\n\t.2byte \\x\n\t.2byte \\y\n\t.endm\n\n\t@ In FRLG, this command is a nop. It is implemented but unused in Ruby/Sapphire.\n\t.macro addelevmenuitem a:req, b:req, c:req, d:req\n\t.byte 0xb1\n\t.byte \\a\n\t.2byte \\b\n\t.2byte \\c\n\t.2byte \\d\n\t.endm\n\n\t@ In FRLG, this command is a nop. It is implemented but unused in Ruby/Sapphire.\n\t.macro showelevmenu\n\t.byte 0xb2\n\t.endm\n\n\t@ Gets the number of coins the player has and stores it in the variable 'out'.\n\t.macro checkcoins out:req\n\t.byte 0xb3\n\t.2byte \\out\n\t.endm\n\n\t@ Gives 'count' coins to the player, up to a total of MAX_COINS. \n\t@ If the player already has MAX_COINS then VAR_RESULT is set to TRUE, otherwise it is set to FALSE.\n\t.macro addcoins count:req\n\t.byte 0xb4\n\t.2byte \\count\n\t.endm\n\n\t@ Takes 'count' coins from the player.\n\t@ If the player has fewer than 'count' coins then no coins are taken and VAR_RESULT is set to TRUE.\n\t@ Otherwise VAR_RESULT is set to FALSE.\n\t.macro removecoins count:req\n\t.byte 0xb5\n\t.2byte \\count\n\t.endm\n\n\t@ Prepares to start a wild battle against a 'species' at 'level' holding 'item'. Running this command will not affect\n\t@ normal wild battles. You start the prepared battle with dowildbattle.\n\t.macro setwildbattle species:req, level:req, item=ITEM_NONE\n\t.byte 0xb6\n\t.2byte \\species\n\t.byte \\level\n\t.2byte \\item\n\t.endm\n\n\t@ Starts a wild battle against the Pokemon generated by setwildbattle. Blocks script execution until the battle finishes.\n\t.macro dowildbattle\n\t.byte 0xb7\n\t.endm\n\n\t@ Sets a relative address to be used by the other vcommands as part of a Mystery Gift script.\n\t.macro setvaddress pointer:req\n\t.byte 0xb8\n\t.4byte \\pointer\n\t.endm\n\n\t@ Equivalent to goto using the relative address set by setvaddress.\n\t.macro vgoto destination:req\n\t.byte 0xb9\n\t.4byte \\destination\n\t.endm\n\n\t@ Equivalent to call using the relative address set by setvaddress.\n\t.macro vcall destination:req\n\t.byte 0xba\n\t.4byte \\destination\n\t.endm\n\n\t@ Equivalent to goto_if using the relative address set by setvaddress.\n\t.macro vgoto_if condition:req, destination:req\n\t.byte 0xbb\n\t.byte \\condition\n\t.4byte \\destination\n\t.endm\n\n\t@ Equivalent to call_if using the relative address set by setvaddress.\n\t.macro vcall_if condition:req, destination:req\n\t.byte 0xbc\n\t.byte \\condition\n\t.4byte \\destination\n\t.endm\n\n\t@ Equivalent to message using the relative address set by setvaddress.\n\t.macro vmessage text:req\n\t.byte 0xbd\n\t.4byte \\text\n\t.endm\n\n\t@ Expands the given text at the pointer (- the relative address set by setvaddress) into gStringVar4\n\t.macro vbuffermessage text:req\n\t.byte 0xbe\n\t.4byte \\text\n\t.endm\n\n\t@ Equivalent to bufferstring using the relative address set by setvaddress.\n\t.macro vbufferstring stringVarIndex:req, text:req\n\t.byte 0xbf\n\tstringvar \\stringVarIndex\n\t.4byte \\text\n\t.endm\n\n\t@ Create a window showing how many Coins the player has.\n\t.macro showcoinsbox x:req, y:req\n\t.byte 0xc0\n\t.byte \\x\n\t.byte \\y\n\t.endm\n\n\t@ Destroys the window created by showcoins. It consumes its arguments but doesn't use them.\n\t.macro hidecoinsbox x:req, y:req\n\t.byte 0xc1\n\t.byte \\x\n\t.byte \\y\n\t.endm\n\n\t@ Updates the window created by showcoins. It consumes its arguments but doesn't use them.\n\t.macro updatecoinsbox x:req, y:req\n\t.byte 0xc2\n\t.byte \\x\n\t.byte \\y\n\t.endm\n\n\t@ Increases the value of the specified game stat by 1. The maximum value of a stat is 0xFFFFFF. See include/constants/game_stat.h\n\t.macro incrementgamestat stat:req\n\t.byte 0xc3\n\t.byte \\stat\n\t.endm\n\n\t@ Sets the destination that using an Escape Rope or Dig will take the player to.\n\t@ Warp commands can be given either the id of which warp location to go to on the destination map\n\t@ or a pair of x/y coordinates to go to directly on the destination map.\n\t.macro setescapewarp map:req, a, b, c\n\t.byte 0xc4\n\tformatwarp \\map, \\a, \\b, \\c\n\t.endm\n\n\t@ Blocks script execution until cry finishes.\n\t.macro waitmoncry\n\t.byte 0xc5\n\t.endm\n\n\t@ Writes the name of the specified PC box to the specified buffer.\n\t.macro bufferboxname stringVarId:req, box:req\n\t.byte 0xc6\n\tstringvar \\stringVarId\n\t.2byte \\box\n\t.endm\n\n\t@ Sets the color of the text in standard message boxes. color is any NPC_TEXT_COLOR_* constant.\n\t@ The color will be reset to NPC_TEXT_COLOR_DEFAULT whenever ProcessPlayerFieldInput is called.\n\t.macro textcolor color:req\n\t.byte 0xc7\n\t.byte \\color\n\t.endm\n\n\t@ Displays the help menu with the given text.\n\t.macro loadhelp msg:req\n\t.byte 0xc8\n\t.4byte \\msg\n\t.endm\n\n\t@ Erases the help menu\n\t.macro unloadhelp\n\t.byte 0xc9\n\t.endm\n\n\t@ After using this command, all standard message boxes will use the signpost frame.\n\t.macro signmsg\n\t.byte 0xca\n\t.endm\n\n\t@ Ends the effects of signmsg, returning message box frames to normal.\n\t.macro normalmsg\n\t.byte 0xcb\n\t.endm\n\n\t@ Reads the value of the specified game stat and compares it to the specified value.\n\t@ Sets the script comparisonResult to 0 if stat < value, 1 if stat == value, and 2 if stat > value.\n\t.macro comparestat statId:req, value:req\n\t.byte 0xcc\n\t.byte \\statId\n\t.4byte \\value\n\t.endm\n\n\t@ Sets the modernFatefulEncounter bit for the Pokemon in the specified slot of the player's party.\n\t.macro setmonmodernfatefulencounter slot:req\n\t.byte 0xcd\n\t.2byte \\slot\n\t.endm\n\n\t@ Checks if the modernFatefulEncounter bit is set for the Pokemon in the specified slot of the player's party. If it isn't set,\n\t@ VAR_RESULT is TRUE. If the bit is set (or if the specified slot is empty or invalid), VAR_RESULT is FALSE.\n\t.macro checkmonmodernfatefulencounter slot:req\n\t.byte 0xce\n\t.2byte \\slot\n\t.endm\n\n\t@ Jumps to the ram script saved from a Wonder Card. If there is no valid saved Wonder Card or if the\n\t@ ram script is invalid then this does nothing.\n\t.macro trywondercardscript\n\t.byte 0xcf\n\t.endm\n\n\t@ Sets worldmapflag to 1. This allows the player to Fly to the corresponding map, if that map has a flightspot.\n\t.macro setworldmapflag worldmapflag:req\n\t.byte 0xd0\n\t.2byte \\worldmapflag\n\t.endm\n\n\t@ Warps the player to the specified map using a teleport effect. Effect is similar to warpteleport, but\n\t@ this warp has no fade out and maintains the original facing direction.\n\t@ Warp commands can be given either the id of which warp location to go to on the destination map\n\t@ or a pair of x/y coordinates to go to directly on the destination map.\n\t.macro warpspinenter map:req, a, b, c\n\t.byte 0xd1\n\tformatwarp \\map, \\a, \\b, \\c\n\t.endm\n\n\t@ Changes the location where the player caught the Pokemon in the specified slot of their party.\n\t.macro setmonmetlocation slot:req, location:req\n\t.byte 0xd2\n\t.2byte \\slot\n\t.byte \\location\n\t.endm\n\n\t@ Gets the width of the specified message in the Braille font and sets the result to VAR_0x8004.\n\t.macro getbraillestringwidth msg:req\n\t.byte 0xd3\n\t.4byte \\msg\n\t.endm\n\n\t@ Writes the name of the specified item to the specified buffer. If 'item' is a Berry or ITEM_POKE_BALL\n\t@ and if the quantity is 2 or more, the buffered string will be pluralized (\"IES\" or \"S\" appended).\n\t@ If the specified item is >= ITEMS_COUNT then the name of ITEM_NONE (\"????????\") is buffered instead.\n\t.macro bufferitemnameplural stringVarId:req, item:req, quantity:req\n\t.byte 0xd4\n\tstringvar \\stringVarId\n\t.2byte \\item\n\t.2byte \\quantity\n\t.endm\n\n\t.macro fadescreenswapbuffers mode:req\n\t.byte 0xd5\n\t.byte \\mode\n\t.endm\n\n\t.macro setobjectmovementtypeinstant localId:req, movementType:req\n\t.byte 0xd6\n\t.2byte \\localId\n\t.byte \\movementType\n\t.endm\n\n\t.macro resetobjectmovementtype localId:req\n\t.byte 0xd7\n\t.2byte \\localId\n\t.endm\n\n@ Supplementary\n\n\t.macro goto_if_unset flag:req, dest:req\n\tcheckflag \\flag\n\tgoto_if FALSE, \\dest\n\t.endm\n\n\t.macro goto_if_set flag:req, dest:req\n\tcheckflag \\flag\n\tgoto_if TRUE, \\dest\n\t.endm\n\n\t@ Allows 'compare' followed by a conditional goto/call to be combined into a single statement.\n\t@ The following are examples of the two acceptable formats this facilitates:\n\t@ compare VAR_RESULT, TRUE\n\t@ goto_if_eq MyScript\n\t@ - or -\n\t@ goto_if_eq VAR_RESULT, TRUE, MyScript\n\t@\n\t@ The first two arguments to this macro are the base command, e.g. 'goto_if 1' for goto_if_eq.\n\t@ The remaining arguments 'a, b, c' depend on the format:\n\t@ For a single statement, 'a' and 'b' are the values to compare and 'c' is the destination pointer.\n\t@ For a statement preceded by a compare, 'a' is the destination pointer and 'b/c' are not provided.\n\t.macro trycompare jump:req, condition:req, a:req, b, c\n\t.ifnb \\c\n\t\tcompare \\a, \\b\n\t\t\\jump \\condition, \\c\n\t.else\n\t\t\\jump \\condition, \\a\n\t.endif\n\t.endm\n\n\t.macro goto_if_lt a:req, b, c @ LESS THAN\n\ttrycompare goto_if, 0, \\a, \\b, \\c\n\t.endm\n\n\t.macro goto_if_eq a:req, b, c @ EQUAL\n\ttrycompare goto_if, 1, \\a, \\b, \\c\n\t.endm\n\n\t.macro goto_if_gt a:req, b, c @ GREATER THAN\n\ttrycompare goto_if, 2, \\a, \\b, \\c\n\t.endm\n\n\t.macro goto_if_le a:req, b, c @ LESS THAN OR EQUAL\n\ttrycompare goto_if, 3, \\a, \\b, \\c\n\t.endm\n\n\t.macro goto_if_ge a:req, b, c @ GREATER THAN OR EQUAL\n\ttrycompare goto_if, 4, \\a, \\b, \\c\n\t.endm\n\n\t.macro goto_if_ne a:req, b, c @ NOT EQUAL\n\ttrycompare goto_if, 5, \\a, \\b, \\c\n\t.endm\n\n\t.macro call_if_unset flag:req, dest:req\n\tcheckflag \\flag\n\tcall_if FALSE, \\dest\n\t.endm\n\n\t.macro call_if_set flag:req, dest:req\n\tcheckflag \\flag\n\tcall_if TRUE, \\dest\n\t.endm\n\n\t.macro call_if_lt a:req, b, c @ LESS THAN\n\ttrycompare call_if, 0, \\a, \\b, \\c\n\t.endm\n\n\t.macro call_if_eq a:req, b, c @ EQUAL\n\ttrycompare call_if, 1, \\a, \\b, \\c\n\t.endm\n\n\t.macro call_if_gt a:req, b, c @ GREATER THAN\n\ttrycompare call_if, 2, \\a, \\b, \\c\n\t.endm\n\n\t.macro call_if_le a:req, b, c @ LESS THAN OR EQUAL\n\ttrycompare call_if, 3, \\a, \\b, \\c\n\t.endm\n\n\t.macro call_if_ge a:req, b, c @ GREATER THAN OR EQUAL\n\ttrycompare call_if, 4, \\a, \\b, \\c\n\t.endm\n\n\t.macro call_if_ne a:req, b, c @ NOT EQUAL\n\ttrycompare call_if, 5, \\a, \\b, \\c\n\t.endm\n\n\t.macro vgoto_if_eq a:req, b, c\n\ttrycompare vgoto_if, TRUE, \\a, \\b, \\c\n\t.endm\n\n\t.macro vgoto_if_ne a:req, b, c\n\ttrycompare vgoto_if, FALSE, \\a, \\b, \\c\n\t.endm\n\n\t.macro vgoto_if_set flag:req, dest:req\n\tcheckflag \\flag\n\tvgoto_if TRUE, \\dest\n\t.endm\n\n\t.macro vgoto_if_unset flag:req, dest:req\n\tcheckflag \\flag\n\tvgoto_if FALSE, \\dest\n\t.endm\n\n\t.macro goto_if_defeated trainer:req, dest:req\n\tchecktrainerflag \\trainer\n\tgoto_if TRUE, \\dest\n\t.endm\n\n\t.macro goto_if_not_defeated trainer:req, dest:req\n\tchecktrainerflag \\trainer\n\tgoto_if FALSE, \\dest\n\t.endm\n\n\t.macro call_if_defeated trainer:req, dest:req\n\tchecktrainerflag \\trainer\n\tcall_if TRUE, \\dest\n\t.endm\n\n\t.macro call_if_not_defeated trainer:req, dest:req\n\tchecktrainerflag \\trainer\n\tcall_if FALSE, \\dest\n\t.endm\n\n\t.macro switch var:req\n\tcopyvar VAR_0x8000, \\var\n\t.endm\n\n\t.macro case condition:req, dest:req\n\tcompare VAR_0x8000, \\condition\n\tgoto_if_eq \\dest\n\t.endm\n\n\tYES = 1\n\tNO  = 0\n\n\t@ Buffers the given text and calls the relevant standard message script (see gStdScripts).\n\t.macro msgbox text:req, type=MSGBOX_DEFAULT\n\tloadword 0, \\text\n\tcallstd \\type\n\t.endm\n\n\t@ Gives 'amount' of the specified 'item' to the player and prints a message with fanfare.\n\t@ If the player doesn't have space for all the items then as many are added as possible, the\n\t@ message indicates there is no room, and VAR_RESULT is set to FALSE. \n\t@ Otherwise VAR_RESULT is set to TRUE, and the message indicates they have received the item(s).\n\t.macro giveitem item:req, amount=1\n\tsetorcopyvar VAR_0x8000, \\item\n\tsetorcopyvar VAR_0x8001, \\amount\n\tcallstd STD_OBTAIN_ITEM\n\t.endm\n\n\t@ For picking up items in the overworld. Similar to giveitem, but with different language and\n\t@ sets the flag of the last-talked to object (the item the player picked up).\n\t.macro finditem item:req, amount=1\n\tsetorcopyvar VAR_0x8000, \\item\n\tsetorcopyvar VAR_0x8001, \\amount\n\tcallstd STD_FIND_ITEM\n\t.endm\n\n\t@ Prints the message \"{PLAYER} put the {ITEM} in the {POCKET}.\" The item name is pluralized, if applicable.\n\t.macro putitemaway item:req, amount=1\n\tsetorcopyvar VAR_0x8000, \\item\n\tsetorcopyvar VAR_0x8001, \\amount\n\tcallstd STD_PUT_ITEM_AWAY\n\t.endm\n\n\t@ Prints the provided message after playing the fanfare music (can only be MUS_LEVEL_UP or MUS_OBTAIN_KEY_ITEM).\n\t@ It then prints the message shown by using putitemaway.\n\t.macro msgreceiveditem msg:req, item:req, amount=1, fanfare=MUS_LEVEL_UP\n\tloadword 0, \\msg\n\tsetorcopyvar VAR_0x8000, \\item\n\tsetorcopyvar VAR_0x8001, \\amount\n\tsetorcopyvar VAR_0x8002, \\fanfare\n\tcallstd STD_RECEIVED_ITEM\n\t.endm\n\n\t@ Adds the specified item to the bag, then prints a message with fanfare. See description of msgreceiveditem.\n\t.macro giveitem_msg msg:req, item:req, amount=1, fanfare=MUS_LEVEL_UP\n\tadditem \\item, \\amount\n\tmsgreceiveditem \\msg, \\item, \\amount, \\fanfare\n\t.endm\n\n\t@ Depends on the provided function. With the default argument, unlocks the specified entry in the Fame Checker.\n\t.macro famechecker person:req, index:req, function=SetFlavorTextFlagFromSpecialVars\n\tsetvar VAR_0x8004, \\person\n\tsetvar VAR_0x8005, \\index\n\tspecial \\function\n\t.endm\n\n\t@ Sets the 'defeated' flag for all trainers in the specified gym.\n\t.macro set_gym_trainers gym:req\n\tsetvar VAR_0x8008, \\gym\n\tcall EventScript_SetGymTrainers\n\t.endm\n\n\t@ Jumps to dest if the Quest Log is currently showing playback scenes (dest is usually a release/end)\n\t.macro goto_if_questlog dest:req\n\tspecial GetQuestLogState\n\tcompare VAR_RESULT, 2\n\tgoto_if_eq \\dest\n\t.endm\n\n\t@ Prints a braille message, then waits for users input.\n\t.macro braillemessage_wait text:req\n\tsetvar VAR_0x8006, 0\n\tbraillemessage \\text\n\tgetbraillestringwidth \\text\n\tcall EventScript_BrailleCursorWaitButton\n\t.endm\n\n\t@ Creates a Pokémon with the modernFatefulEncounter bit set for an encounter\n\t.macro seteventmon species:req, level:req, item=ITEM_NONE\n\tsetvar VAR_0x8004, \\species\n\tsetvar VAR_0x8005, \\level\n\tsetvar VAR_0x8006, \\item\n\tspecial CreateEnemyEventMon\n\t.endm\n"
  },
  {
    "path": "asm/macros/field_effect_script.inc",
    "content": "\t.macro loadtiles address\n\t.byte 0\n\t.4byte \\address\n\t.endm\n\n\t.macro loadfadedpal address\n\t.byte 1\n\t.4byte \\address\n\t.endm\n\n\t.macro loadpal address\n\t.byte 2\n\t.4byte \\address\n\t.endm\n\n\t.macro callnative address\n\t.byte 3\n\t.4byte \\address\n\t.endm\n\n\t.macro end\n\t.byte 4\n\t.endm\n\n\t.macro loadgfx_callnative tiles_address, palette_address, function_address\n\t.byte 5\n\t.4byte \\tiles_address\n\t.4byte \\palette_address\n\t.4byte \\function_address\n\t.endm\n\n\t.macro loadtiles_callnative tiles_address, function_address\n\t.byte 6\n\t.4byte \\tiles_address\n\t.4byte \\function_address\n\t.endm\n\n\t.macro loadfadedpal_callnative palette_address, function_address\n\t.byte 7\n\t.4byte \\palette_address\n\t.4byte \\function_address\n\t.endm\n"
  },
  {
    "path": "asm/macros/function.inc",
    "content": "\t.macro arm_func_start name\n\t.align 2, 0\n\t.global \\name\n\t.arm\n\t.type \\name, function\n\t.endm\n\n\t.macro arm_func_end name\n\t.size \\name, .-\\name\n\t.endm\n\n\t.macro thumb_func_start name\n\t.align 2, 0\n\t.global \\name\n\t.thumb\n\t.thumb_func\n\t.type \\name, function\n\t.endm\n\n\t.macro non_word_aligned_thumb_func_start name\n\t.global \\name\n\t.thumb\n\t.thumb_func\n\t.type \\name, function\n\t.endm\n\n\t.macro thumb_func_end name\n\t.size \\name, .-\\name\n\t.endm\n"
  },
  {
    "path": "asm/macros/m4a.inc",
    "content": "\t.macro song label, music_player, unknown\n\t.4byte \\label\n\t.2byte \\music_player\n\t.2byte \\unknown\n\t.endm\n\n\t.macro music_player info_struct, track_struct, unknown_1, unknown_2\n\t.4byte \\info_struct\n\t.4byte \\track_struct\n\t.byte \\unknown_1\n\t.space 1\n\t.2byte \\unknown_2\n\t.endm\n"
  },
  {
    "path": "asm/macros/map.inc",
    "content": "@ Most of the macros in this file are for arranging map event data, and are output by mapjson using data from each map's JSON file.\n\n\t@ Takes a MAP constant and outputs the map group and map number as separate bytes\n\t.macro map map_id:req\n\t.byte \\map_id >> 8    @ map group\n\t.byte \\map_id & 0xFF  @ map num\n\t.endm\n\n\t@ Defines a map script. 'type' is any MAP_SCRIPT_* constant (see include/constants/map_scripts.h)\n\t.macro map_script type:req, script:req\n\t.byte \\type\n\t.4byte \\script\n\t.endm\n\n\t@ Defines an entry in a map script table (for either ON_WARP_INTO_MAP_TABLE or ON_FRAME_TABLE)\n\t.macro map_script_2 var:req, compare:req, script:req\n\t.2byte \\var\n\t.2byte \\compare\n\t.4byte \\script\n\t.endm\n\n\t@ Defines an object event template for map data, to be used by a normal object. Mirrors the struct layout of ObjectEventTemplate in include/global.fieldmap.h\n\t.macro object_event index:req, gfx:req, x:req, y:req, elevation:req, movement_type:req, x_radius:req, y_radius:req, trainer_type:req, sight_radius_tree_etc:req, script:req, event_flag:req\n\t.byte \\index\n\t.byte \\gfx\n\t.byte OBJ_KIND_NORMAL\n\t.space 1  @ Padding\n\t.2byte \\x, \\y\n\t.byte \\elevation\n\t.byte \\movement_type\n\t.byte ((\\y_radius << 4) | \\x_radius)\n\t.space 1  @ Padding\n\t.2byte \\trainer_type\n\t.2byte \\sight_radius_tree_etc\n\t.4byte \\script\n\t.2byte \\event_flag\n\t.space 2  @ Padding\n\tinc _num_npcs\n\t.endm\n\n\t@ Defines an object event template for map data, to be used by a clone object. Mirrors the struct layout of ObjectEventTemplate in include/global.fieldmap.h\n\t.macro clone_event index:req, gfx:req, x:req, y:req, target_local_id:req, target_map_id:req\n\t.byte \\index\n\t.byte \\gfx\n\t.byte OBJ_KIND_CLONE\n\t.space 1  @ Padding\n\t.2byte \\x, \\y\n\t.byte \\target_local_id\n\t.space 3  @ Padding\n\t.2byte \\target_map_id & 0xFF  @ map num\n\t.2byte \\target_map_id >> 8    @ map group\n\t.space 8  @ Padding\n\tinc _num_npcs\n\t.endm\n\n\t@ Defines a warp event for map data. Mirrors the struct layout of WarpEvent in include/global.fieldmap.h\n\t.macro warp_def x:req, y:req, elevation:req, warpId:req, map_id:req\n\t.2byte \\x, \\y\n\t.byte \\elevation\n\t.byte \\warpId\n\t.byte \\map_id & 0xFF  @ map num\n\t.byte \\map_id >> 8    @ map group\n\tinc _num_warps\n\t.endm\n\n\t@ Defines a coord event for map data. Mirrors the struct layout of CoordEvent in include/global.fieldmap.h\n\t.macro coord_event x:req, y:req, elevation:req, var:req, varValue:req, script:req\n\t.2byte \\x, \\y\n\t.byte \\elevation\n\t.space 1  @ Padding\n\t.2byte \\var\n\t.2byte \\varValue\n\t.space 2  @ Padding\n\t.4byte \\script\n\tinc _num_traps\n\t.endm\n\n\t@ Defines a weather coord event for map data. Any coord event is treated as a weather coord event if its script is NULL.\n\t@ NOTE: In FRLG, the weather handling functions are dummied out. See src/coord_event_weather.c\n\t.macro coord_weather_event x:req, y:req, elevation:req, weather:req\n\tcoord_event \\x, \\y, \\elevation, \\weather, 0, NULL\n\t.endm\n\n\t@ Defines a generic background event for map data. Mirrors the struct layout of BgEvent in include/global.fieldmap.h\n\t@ 'kind' is any BG_EVENT_* constant (see include/constants/event_bg.h).\n\t@ 'arg6' is used differently depending on the bg event type. 'arg7' and 'arg8' are only used by bg_hidden_item_event.\n\t@ See macros below.\n\t.macro bg_event x:req, y, elevation:req, kind:req, arg6:req, arg7, arg8\n\t.2byte \\x, \\y\n\t.byte \\elevation\n\t.byte \\kind\n\t.space 2  @ Padding\n\t.if \\kind != BG_EVENT_HIDDEN_ITEM\n\t\t.4byte \\arg6\n\t.else\n\t\t.2byte \\arg6\n\t\t.byte \\arg7\n\t\t.byte \\arg8\n\t.endif\n\tinc _num_signs\n\t.endm\n\n\t@ Defines a background sign event for map data. 'facing_dir' is any of the BG_EVENT_PLAYER_FACING_* constants (see include/constants/event_bg.h)\n\t.macro bg_sign_event x:req, y:req, elevation:req, facing_dir:req, script:req\n\tbg_event \\x, \\y, \\elevation, \\facing_dir, \\script\n\t.endm\n\n\t@ Defines a background hidden item event for map data\n\t.macro bg_hidden_item_event x:req, y:req, elevation:req, item:req, flag:req, quantity:req, underfoot:req\n\tbg_event \\x, \\y, \\elevation, BG_EVENT_HIDDEN_ITEM, \\item, ((\\flag) - FLAG_HIDDEN_ITEMS_START), \\quantity | (\\underfoot << 7)\n\t.endm\n\n\t@ Defines a background secret base event for map data.\n\t@ Unused by FRLG\n\t.macro bg_secret_base_event x:req, y:req, elevation:req, secret_base_id:req\n\tbg_event \\x, \\y, \\elevation, BG_EVENT_SECRET_BASE, \\secret_base_id\n\t.endm\n\n\t@ Defines the table of event data for a map. Mirrors the struct layout of MapEvents in include/global.fieldmap.h\n\t.macro map_events npcs:req, warps:req, traps:req, signs:req\n\t.byte _num_npcs, _num_warps, _num_traps, _num_signs\n\t.4byte \\npcs, \\warps, \\traps, \\signs\n\treset_map_events\n\t.endm\n\n\t@ Resets the event counters used to track how many events a map has. Run when the events table is created by map_events\n\t.macro reset_map_events\n\t.set _num_npcs, 0\n\t.set _num_warps, 0\n\t.set _num_traps, 0\n\t.set _num_signs, 0\n\t.endm\n\n\t@ Initialize the event counters for the first map\n\treset_map_events\n\n\t@ Directions for connecting maps\n\t@ The map.json files will only have e.g. \"down\" as direction data, and this will be appended to \"connection_\" by the connection macro\n\t.equiv connection_down, CONNECTION_SOUTH\n\t.equiv connection_up, CONNECTION_NORTH\n\t.equiv connection_left, CONNECTION_WEST\n\t.equiv connection_right, CONNECTION_EAST\n\t.equiv connection_dive, CONNECTION_DIVE\n\t.equiv connection_emerge, CONNECTION_EMERGE\n\n\t@ Defines a map connection. Mirrors the struct layout of MapConnection in include/global.fieldmap.h\n\t.macro connection direction:req, offset:req, map:req\n\t.byte connection_\\direction\n\t.space 3  @ Padding\n\t.4byte \\offset\n\tmap \\map\n\t.space 2  @ Padding\n\t.endm\n\n\t@ Defines the flags for a map header. Mirrors the layout of the bitfield in struct MapHeader in include/global.fieldmap.h\n\t.macro map_header_flags allow_cycling:req, allow_escaping:req, allow_running:req, show_map_name:req\n\t.byte \\allow_cycling\n\t.byte ((\\show_map_name & 1) << 2) | ((\\allow_running & 1) << 1) | ((\\allow_escaping & 1) << 0)\n\t.endm\n"
  },
  {
    "path": "asm/macros/movement.inc",
    "content": "\t.macro create_movement_action name:req, value:req\n\t.macro \\name\n\t.byte \\value\n\t.endm\n\t.endm\n\n\tcreate_movement_action face_down, MOVEMENT_ACTION_FACE_DOWN\n\tcreate_movement_action face_up, MOVEMENT_ACTION_FACE_UP\n\tcreate_movement_action face_left, MOVEMENT_ACTION_FACE_LEFT\n\tcreate_movement_action face_right, MOVEMENT_ACTION_FACE_RIGHT\n\tcreate_movement_action face_down_fast, MOVEMENT_ACTION_FACE_DOWN_FAST\n\tcreate_movement_action face_up_fast, MOVEMENT_ACTION_FACE_UP_FAST\n\tcreate_movement_action face_left_fast, MOVEMENT_ACTION_FACE_LEFT_FAST\n\tcreate_movement_action face_right_fast, MOVEMENT_ACTION_FACE_RIGHT_FAST\n\tcreate_movement_action walk_slower_down, MOVEMENT_ACTION_WALK_SLOWER_DOWN\n\tcreate_movement_action walk_slower_up, MOVEMENT_ACTION_WALK_SLOWER_UP\n\tcreate_movement_action walk_slower_left, MOVEMENT_ACTION_WALK_SLOWER_LEFT\n\tcreate_movement_action walk_slower_right, MOVEMENT_ACTION_WALK_SLOWER_RIGHT\n\tcreate_movement_action walk_slow_down, MOVEMENT_ACTION_WALK_SLOW_DOWN\n\tcreate_movement_action walk_slow_up, MOVEMENT_ACTION_WALK_SLOW_UP\n\tcreate_movement_action walk_slow_left, MOVEMENT_ACTION_WALK_SLOW_LEFT\n\tcreate_movement_action walk_slow_right, MOVEMENT_ACTION_WALK_SLOW_RIGHT\n\tcreate_movement_action walk_down, MOVEMENT_ACTION_WALK_NORMAL_DOWN\n\tcreate_movement_action walk_up, MOVEMENT_ACTION_WALK_NORMAL_UP\n\tcreate_movement_action walk_left, MOVEMENT_ACTION_WALK_NORMAL_LEFT\n\tcreate_movement_action walk_right, MOVEMENT_ACTION_WALK_NORMAL_RIGHT\n\tcreate_movement_action jump_2_down, MOVEMENT_ACTION_JUMP_2_DOWN\n\tcreate_movement_action jump_2_up, MOVEMENT_ACTION_JUMP_2_UP\n\tcreate_movement_action jump_2_left, MOVEMENT_ACTION_JUMP_2_LEFT\n\tcreate_movement_action jump_2_right, MOVEMENT_ACTION_JUMP_2_RIGHT\n\tcreate_movement_action delay_1, MOVEMENT_ACTION_DELAY_1\n\tcreate_movement_action delay_2, MOVEMENT_ACTION_DELAY_2\n\tcreate_movement_action delay_4, MOVEMENT_ACTION_DELAY_4\n\tcreate_movement_action delay_8, MOVEMENT_ACTION_DELAY_8\n\tcreate_movement_action delay_16, MOVEMENT_ACTION_DELAY_16\n\tcreate_movement_action walk_fast_down, MOVEMENT_ACTION_WALK_FAST_DOWN\n\tcreate_movement_action walk_fast_up, MOVEMENT_ACTION_WALK_FAST_UP\n\tcreate_movement_action walk_fast_left, MOVEMENT_ACTION_WALK_FAST_LEFT\n\tcreate_movement_action walk_fast_right, MOVEMENT_ACTION_WALK_FAST_RIGHT\n\tcreate_movement_action walk_in_place_slow_down, MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN\n\tcreate_movement_action walk_in_place_slow_up, MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP\n\tcreate_movement_action walk_in_place_slow_left, MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT\n\tcreate_movement_action walk_in_place_slow_right, MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT\n\tcreate_movement_action walk_in_place_down, MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN\n\tcreate_movement_action walk_in_place_up, MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP\n\tcreate_movement_action walk_in_place_left, MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT\n\tcreate_movement_action walk_in_place_right, MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT\n\tcreate_movement_action walk_in_place_fast_down, MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN\n\tcreate_movement_action walk_in_place_fast_up, MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP\n\tcreate_movement_action walk_in_place_fast_left, MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT\n\tcreate_movement_action walk_in_place_fast_right, MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT\n\tcreate_movement_action walk_in_place_faster_down, MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN\n\tcreate_movement_action walk_in_place_faster_up, MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_UP\n\tcreate_movement_action walk_in_place_faster_left, MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT\n\tcreate_movement_action walk_in_place_faster_right, MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT\n\tcreate_movement_action ride_water_current_down, MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN\n\tcreate_movement_action ride_water_current_up, MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP\n\tcreate_movement_action ride_water_current_lefft, MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT\n\tcreate_movement_action ride_water_current_right, MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT\n\tcreate_movement_action walk_faster_down, MOVEMENT_ACTION_WALK_FASTER_DOWN\n\tcreate_movement_action walk_faster_up, MOVEMENT_ACTION_WALK_FASTER_UP\n\tcreate_movement_action walk_faster_left, MOVEMENT_ACTION_WALK_FASTER_LEFT\n\tcreate_movement_action walk_faster_right, MOVEMENT_ACTION_WALK_FASTER_RIGHT\n\tcreate_movement_action slide_down, MOVEMENT_ACTION_SLIDE_DOWN\n\tcreate_movement_action slide_up, MOVEMENT_ACTION_SLIDE_UP\n\tcreate_movement_action slide_left, MOVEMENT_ACTION_SLIDE_LEFT\n\tcreate_movement_action slide_right, MOVEMENT_ACTION_SLIDE_RIGHT\n\tcreate_movement_action player_run_down, MOVEMENT_ACTION_PLAYER_RUN_DOWN\n\tcreate_movement_action player_run_up, MOVEMENT_ACTION_PLAYER_RUN_UP\n\tcreate_movement_action player_run_left, MOVEMENT_ACTION_PLAYER_RUN_LEFT\n\tcreate_movement_action player_run_right, MOVEMENT_ACTION_PLAYER_RUN_RIGHT\n\tcreate_movement_action player_run_down_slow, MOVEMENT_ACTION_PLAYER_RUN_DOWN_SLOW\n\tcreate_movement_action player_run_up_slow, MOVEMENT_ACTION_PLAYER_RUN_UP_SLOW\n\tcreate_movement_action player_run_left_slow, MOVEMENT_ACTION_PLAYER_RUN_LEFT_SLOW\n\tcreate_movement_action player_run_right_slow, MOVEMENT_ACTION_PLAYER_RUN_RIGHT_SLOW\n\tcreate_movement_action start_anim_in_direction, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION\n\tcreate_movement_action jump_special_down, MOVEMENT_ACTION_JUMP_SPECIAL_DOWN\n\tcreate_movement_action jump_special_up, MOVEMENT_ACTION_JUMP_SPECIAL_UP\n\tcreate_movement_action jump_special_left, MOVEMENT_ACTION_JUMP_SPECIAL_LEFT\n\tcreate_movement_action jump_special_right, MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT\n\tcreate_movement_action face_player, MOVEMENT_ACTION_FACE_PLAYER\n\tcreate_movement_action face_away_player, MOVEMENT_ACTION_FACE_AWAY_PLAYER\n\tcreate_movement_action lock_facing_direction, MOVEMENT_ACTION_LOCK_FACING_DIRECTION\n\tcreate_movement_action unlock_facing_direction, MOVEMENT_ACTION_UNLOCK_FACING_DIRECTION\n\tcreate_movement_action jump_down, MOVEMENT_ACTION_JUMP_DOWN\n\tcreate_movement_action jump_up, MOVEMENT_ACTION_JUMP_UP\n\tcreate_movement_action jump_left, MOVEMENT_ACTION_JUMP_LEFT\n\tcreate_movement_action jump_right, MOVEMENT_ACTION_JUMP_RIGHT\n\tcreate_movement_action jump_in_place_down, MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN\n\tcreate_movement_action jump_in_place_up, MOVEMENT_ACTION_JUMP_IN_PLACE_UP\n\tcreate_movement_action jump_in_place_left, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT\n\tcreate_movement_action jump_in_place_right, MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT\n\tcreate_movement_action jump_in_place_down_up, MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP\n\tcreate_movement_action jump_in_place_up_down, MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN\n\tcreate_movement_action jump_in_place_left_right, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT\n\tcreate_movement_action jump_in_place_right_left, MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT\n\tcreate_movement_action face_original_direction, MOVEMENT_ACTION_FACE_ORIGINAL_DIRECTION\n\tcreate_movement_action nurse_joy_bow, MOVEMENT_ACTION_NURSE_JOY_BOW_DOWN\n\tcreate_movement_action enable_jump_landing_ground_effect, MOVEMENT_ACTION_ENABLE_JUMP_LANDING_GROUND_EFFECT\n\tcreate_movement_action disable_jump_landing_ground_effect, MOVEMENT_ACTION_DISABLE_JUMP_LANDING_GROUND_EFFECT\n\tcreate_movement_action disable_anim, MOVEMENT_ACTION_DISABLE_ANIMATION\n\tcreate_movement_action restore_anim, MOVEMENT_ACTION_RESTORE_ANIMATION\n\tcreate_movement_action set_invisible, MOVEMENT_ACTION_SET_INVISIBLE\n\tcreate_movement_action set_visible, MOVEMENT_ACTION_SET_VISIBLE\n\tcreate_movement_action emote_exclamation_mark, MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK\n\tcreate_movement_action emote_question_mark, MOVEMENT_ACTION_EMOTE_QUESTION_MARK\n\tcreate_movement_action emote_x, MOVEMENT_ACTION_EMOTE_X\n\tcreate_movement_action emote_double_exclamation_mark, MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK\n\tcreate_movement_action emote_smile, MOVEMENT_ACTION_EMOTE_SMILE\n\tcreate_movement_action reveal_trainer, MOVEMENT_ACTION_REVEAL_TRAINER\n\tcreate_movement_action rock_smash_break, MOVEMENT_ACTION_ROCK_SMASH_BREAK\n\tcreate_movement_action cut_tree, MOVEMENT_ACTION_CUT_TREE\n\tcreate_movement_action set_fixed_priority, MOVEMENT_ACTION_SET_FIXED_PRIORITY\n\tcreate_movement_action clear_fixed_priority, MOVEMENT_ACTION_CLEAR_FIXED_PRIORITY\n\tcreate_movement_action init_affine_anim, MOVEMENT_ACTION_INIT_AFFINE_ANIM\n\tcreate_movement_action clear_affine_anim, MOVEMENT_ACTION_CLEAR_AFFINE_ANIM\n\tcreate_movement_action walk_down_start_affine, MOVEMENT_ACTION_WALK_DOWN_START_AFFINE\n\tcreate_movement_action walk_down_affine, MOVEMENT_ACTION_WALK_DOWN_AFFINE\n\tcreate_movement_action acro_wheelie_face_down, MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN\n\tcreate_movement_action acro_wheelie_face_up, MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP\n\tcreate_movement_action acro_wheelie_face_left, MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT\n\tcreate_movement_action acro_wheelie_face_right, MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT\n\tcreate_movement_action acro_pop_wheelie_down, MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN\n\tcreate_movement_action acro_pop_wheelie_up, MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP\n\tcreate_movement_action acro_pop_wheelie_left, MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT\n\tcreate_movement_action acro_pop_wheelie_right, MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT\n\tcreate_movement_action acro_end_wheelie_face_down, MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN\n\tcreate_movement_action acro_end_wheelie_face_up, MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP\n\tcreate_movement_action acro_end_wheelie_face_left, MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT\n\tcreate_movement_action acro_end_wheelie_face_right, MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT\n\tcreate_movement_action acro_wheelie_hop_face_down, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN\n\tcreate_movement_action acro_wheelie_hop_face_up, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP\n\tcreate_movement_action acro_wheelie_hop_face_left, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT\n\tcreate_movement_action acro_wheelie_hop_face_right, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT\n\tcreate_movement_action acro_wheelie_hop_down, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN\n\tcreate_movement_action acro_wheelie_hop_up, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP\n\tcreate_movement_action acro_wheelie_hop_left, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT\n\tcreate_movement_action acro_wheelie_hop_right, MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT\n\tcreate_movement_action acro_wheelie_jump_down, MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN\n\tcreate_movement_action acro_wheelie_jump_up, MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP\n\tcreate_movement_action acro_wheelie_jump_left, MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT\n\tcreate_movement_action acro_wheelie_jump_right, MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT\n\tcreate_movement_action acro_wheelie_in_place_down, MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN\n\tcreate_movement_action acro_wheelie_in_place_up, MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP\n\tcreate_movement_action acro_wheelie_in_place_left, MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT\n\tcreate_movement_action acro_wheelie_in_place_right, MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT\n\tcreate_movement_action acro_pop_wheelie_move_down, MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN\n\tcreate_movement_action acro_pop_wheelie_move_up, MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP\n\tcreate_movement_action acro_pop_wheelie_move_left, MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT\n\tcreate_movement_action acro_pop_wheelie_move_right, MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT\n\tcreate_movement_action acro_wheelie_move_down, MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN\n\tcreate_movement_action acro_wheelie_move_up, MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP\n\tcreate_movement_action acro_wheelie_move_left, MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT\n\tcreate_movement_action acro_wheelie_move_right, MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT\n\tcreate_movement_action spin_down, MOVEMENT_ACTION_SPIN_DOWN\n\tcreate_movement_action spin_up, MOVEMENT_ACTION_SPIN_UP\n\tcreate_movement_action spin_left, MOVEMENT_ACTION_SPIN_LEFT\n\tcreate_movement_action spin_right, MOVEMENT_ACTION_SPIN_RIGHT\n\tcreate_movement_action raise_hand_and_stop, MOVEMENT_ACTION_RAISE_HAND_AND_STOP\n\tcreate_movement_action raise_hand_and_jump, MOVEMENT_ACTION_RAISE_HAND_AND_JUMP\n\tcreate_movement_action raise_hand_and_swim, MOVEMENT_ACTION_RAISE_HAND_AND_SWIM\n\tcreate_movement_action walk_slowest_down, MOVEMENT_ACTION_WALK_SLOWEST_DOWN\n\tcreate_movement_action walk_slowest_up, MOVEMENT_ACTION_WALK_SLOWEST_UP\n\tcreate_movement_action walk_slowest_left, MOVEMENT_ACTION_WALK_SLOWEST_LEFT\n\tcreate_movement_action walk_slowest_right, MOVEMENT_ACTION_WALK_SLOWEST_RIGHT\n\tcreate_movement_action shake_head_or_walk_in_place, MOVEMENT_ACTION_SHAKE_HEAD_OR_WALK_IN_PLACE\n\tcreate_movement_action glide_down, MOVEMENT_ACTION_GLIDE_DOWN\n\tcreate_movement_action glide_up, MOVEMENT_ACTION_GLIDE_UP\n\tcreate_movement_action glide_left, MOVEMENT_ACTION_GLIDE_LEFT\n\tcreate_movement_action glide_right, MOVEMENT_ACTION_GLIDE_RIGHT\n\tcreate_movement_action fly_up, MOVEMENT_ACTION_FLY_UP\n\tcreate_movement_action fly_down, MOVEMENT_ACTION_FLY_DOWN\n\tcreate_movement_action jump_special_with_effect_down, MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_DOWN\n\tcreate_movement_action jump_special_with_effect_up, MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_UP\n\tcreate_movement_action jump_special_with_effect_left, MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_LEFT\n\tcreate_movement_action jump_special_with_effect_right, MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_RIGHT\n\tcreate_movement_action step_end, MOVEMENT_ACTION_STEP_END\n"
  },
  {
    "path": "asm/macros/music_voice.inc",
    "content": "\t.macro voice_directsound base_midi_key:req, pan:req, sample_data_pointer:req, attack:req, decay:req, sustain:req, release:req\n\t.byte 0\n\t_voice_directsound \\base_midi_key, \\pan, \\sample_data_pointer, \\attack, \\decay, \\sustain, \\release\n\t.endm\n\n\t.macro voice_directsound_no_resample base_midi_key:req, pan:req, sample_data_pointer:req, attack:req, decay:req, sustain:req, release:req\n\t.byte 8\n\t_voice_directsound \\base_midi_key, \\pan, \\sample_data_pointer, \\attack, \\decay, \\sustain, \\release\n\t.endm\n\n\t.macro voice_directsound_alt base_midi_key:req, pan:req, sample_data_pointer:req, attack:req, decay:req, sustain:req, release:req\n\t.byte 16\n\t_voice_directsound \\base_midi_key, \\pan, \\sample_data_pointer, \\attack, \\decay, \\sustain, \\release\n\t.endm\n\n\t.macro _voice_directsound base_midi_key:req, pan:req, sample_data_pointer:req, attack:req, decay:req, sustain:req, release:req\n\t.byte \\base_midi_key\n\t.byte 0\n\t.if \\pan != 0\n\t.byte (0x80 | \\pan)\n\t.else\n\t.byte 0\n\t.endif\n\t.4byte \\sample_data_pointer\n\t.byte \\attack\n\t.byte \\decay\n\t.byte \\sustain\n\t.byte \\release\n\t.endm\n\n\t.macro voice_square_1 base_midi_key:req, pan:req, sweep:req, duty_cycle:req, attack:req, decay:req, sustain:req, release:req\n\t_voice_square_1 1, \\base_midi_key, \\pan, \\sweep, \\duty_cycle, \\attack, \\decay, \\sustain, \\release\n\t.endm\n\n\t.macro voice_square_1_alt base_midi_key:req, pan:req, sweep:req, duty_cycle:req, attack:req, decay:req, sustain:req, release:req\n\t_voice_square_1 9, \\base_midi_key, \\pan, \\sweep, \\duty_cycle, \\attack, \\decay, \\sustain, \\release\n\t.endm\n\n\t.macro _voice_square_1 type:req, base_midi_key:req, pan:req, sweep:req, duty_cycle:req, attack:req, decay:req, sustain:req, release:req\n\t.byte \\type\n\t.byte \\base_midi_key\n\t.if \\pan != 0\n\t.byte (0x80 | \\pan)\n\t.else\n\t.byte 0\n\t.endif\n\t.byte \\sweep\n\t.byte (\\duty_cycle & 0x3)\n\t.byte 0, 0, 0\n\t.byte (\\attack  & 0x7)\n\t.byte (\\decay   & 0x7)\n\t.byte (\\sustain & 0xF)\n\t.byte (\\release & 0x7)\n\t.endm\n\n\t.macro voice_square_2 base_midi_key:req, pan:req, duty_cycle:req, attack:req, decay:req, sustain:req, release:req\n\t_voice_square_2 2, \\base_midi_key, \\pan, \\duty_cycle, \\attack, \\decay, \\sustain, \\release\n\t.endm\n\n\t.macro voice_square_2_alt base_midi_key:req, pan:req, duty_cycle:req, attack:req, decay:req, sustain:req, release:req\n\t_voice_square_2 10, \\base_midi_key, \\pan, \\duty_cycle, \\attack, \\decay, \\sustain, \\release\n\t.endm\n\n\t.macro _voice_square_2 type:req, base_midi_key:req, pan:req, duty_cycle:req, attack:req, decay:req, sustain:req, release:req\n\t.byte \\type\n\t.byte \\base_midi_key\n\t.if \\pan != 0\n\t.byte (0x80 | \\pan)\n\t.else\n\t.byte 0\n\t.endif\n\t.byte 0\n\t.byte (\\duty_cycle & 0x3)\n\t.byte 0, 0, 0\n\t.byte (\\attack  & 0x7)\n\t.byte (\\decay   & 0x7)\n\t.byte (\\sustain & 0xF)\n\t.byte (\\release & 0x7)\n\t.endm\n\n\t.macro voice_programmable_wave base_midi_key:req, pan:req, wave_samples_pointer:req, attack:req, decay:req, sustain:req, release:req\n\t_voice_programmable_wave 3, \\base_midi_key, \\pan, \\wave_samples_pointer, \\attack, \\decay, \\sustain, \\release\n\t.endm\n\n\t.macro voice_programmable_wave_alt base_midi_key:req, pan:req, wave_samples_pointer:req, attack:req, decay:req, sustain:req, release:req\n\t_voice_programmable_wave 11, \\base_midi_key, \\pan, \\wave_samples_pointer, \\attack, \\decay, \\sustain, \\release\n\t.endm\n\n\t.macro _voice_programmable_wave type:req, base_midi_key:req, pan:req, wave_samples_pointer:req, attack:req, decay:req, sustain:req, release:req\n\t.byte \\type\n\t.byte \\base_midi_key\n\t.if \\pan != 0\n\t.byte (0x80 | \\pan)\n\t.else\n\t.byte 0\n\t.endif\n\t.byte 0\n\t.4byte \\wave_samples_pointer\n\t.byte (\\attack  & 0x7)\n\t.byte (\\decay   & 0x7)\n\t.byte (\\sustain & 0xF)\n\t.byte (\\release & 0x7)\n\t.endm\n\n\t.macro voice_noise base_midi_key:req, pan:req, period:req, attack:req, decay:req, sustain:req, release:req\n\t_voice_noise 4, \\base_midi_key, \\pan, \\period, \\attack, \\decay, \\sustain, \\release\n\t.endm\n\n\t.macro voice_noise_alt base_midi_key:req, pan:req, period:req, attack:req, decay:req, sustain:req, release:req\n\t_voice_noise 12, \\base_midi_key, \\pan, \\period, \\attack, \\decay, \\sustain, \\release\n\t.endm\n\n\t.macro _voice_noise type:req, base_midi_key:req, pan:req, period:req, attack:req, decay:req, sustain:req, release:req\n\t.byte \\type\n\t.byte \\base_midi_key\n\t.if \\pan != 0\n\t.byte (0x80 | \\pan)\n\t.else\n\t.byte 0\n\t.endif\n\t.byte 0\n\t.byte (\\period & 0x1)\n\t.byte 0, 0, 0\n\t.byte (\\attack  & 0x7)\n\t.byte (\\decay   & 0x7)\n\t.byte (\\sustain & 0xF)\n\t.byte (\\release & 0x7)\n\t.endm\n\n\t.macro voice_keysplit voice_group_pointer:req, keysplit_table_pointer:req\n\t.byte 0x40, 0, 0, 0\n\t.4byte \\voice_group_pointer\n\t.4byte \\keysplit_table_pointer\n\t.endm\n\n\t.macro voice_keysplit_all voice_group_pointer:req\n\t.byte 0x80, 0, 0, 0\n\t.4byte \\voice_group_pointer\n\t.4byte 0\n\t.endm\n\n\t.macro cry sample:req\n\t.byte 0x20, 60, 0, 0\n\t.4byte \\sample\n\t.byte 0xff, 0, 0xff, 0\n\t.endm\n\n\t.macro cry_reverse sample:req\n\t.byte 0x30, 60, 0, 0\n\t.4byte \\sample\n\t.byte 0xff, 0, 0xff, 0\n\t.endm\n"
  },
  {
    "path": "asm/macros/trainer_tower.inc",
    "content": "\t@ Sets NPC gfx and the floor layout depending on current challenge and floor\n\t.macro ttower_initfloor\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_INIT_FLOOR\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Buffers the opponents battle speech to gStringVar4. speech is any TRAINER_TOWER_TEXT_*.\n\t.macro ttower_getspeech speech:req, trainer=0xFF\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_SPEECH\n\tsetvar VAR_0x8005, \\speech\n\t.if \\trainer >= VARS_START && \\trainer != 0xFF\n\tcopyvar VAR_0x8006, \\trainer\n\t.elseif \\trainer != 0xFF\n\tsetvar VAR_0x8006, \\trainer\n\t.endif\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Starts a trainer tower battle. VAR_0x8005 is unused\n\t.macro ttower_dobattle\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_DO_BATTLE\n\tsetvar VAR_0x8005, 0\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Returns the current challenge type (CHALLENGE_TYPE_*). Mixed challenges use different types for each floor. If VAR_0x8005 is != FALSE, does nothing\n\t.macro ttower_getchallengetype\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_CHALLENGE_TYPE\n\tsetvar VAR_0x8005, FALSE\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Adds 1 to the number of floors cleared (all trainers on floor defeated)\n\t.macro ttower_clearedfloor\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_CLEARED_FLOOR\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ TRUE if the trainers on this floor were already beaten, FALSE otherwise\n\t.macro ttower_isfloorcleared\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_FLOOR_CLEARED\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Initializes the Trainer Tower challenge and starts the timer\n\t.macro ttower_startchallenge\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_START_CHALLENGE\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ 0 if not spoken to yet, 1 if spoken to but not received prize, 2 if received prize\n\t.macro ttower_getownerstate\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_OWNER_STATE\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Tries to give prize. 0 if given successfully, 1 if no room for prize, 2 if giving prize should be skipped\n\t.macro ttower_giveprize\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_GIVE_PRIZE\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Checks the final challenge time. 0 if new record, 1 if not, 2 if time has already been checked\n\t.macro ttower_checkfinaltime\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_CHECK_FINAL_TIME\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Resumes the challenge timer (or starts, if the timer is 0)\n\t.macro ttower_resumetimer\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_RESUME_TIMER\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Sets that the player lost the challenge\n\t.macro ttower_setlost\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_SET_LOST\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Returns the status of the current Trainer Tower challenge (CHALLENGE_STATUS_*)\n\t.macro ttower_getchallengestatus\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_CHALLENGE_STATUS\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Buffers the current challenge time (min in gStringVar1, sec in gStringVar2, fraction sec in gStringVar3)\n\t.macro ttower_gettime\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_TIME\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Unused. Displays Trainer Tower results. Handled by ShowBattleRecords instead\n\t.macro ttower_showresults\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_SHOW_RESULTS\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Unused. See above\n\t.macro ttower_closeresults\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_CLOSE_RESULTS\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Returns the eligibility of the players party for a double battle (using GetMonsStateToDoubles)\n\t.macro ttower_checkdoubles\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_CHECK_DOUBLES\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ For the unused E-Reader challenges, gets the number of floors used. Otherwise returns FALSE (all floors used)\n\t.macro ttower_getnumfloors\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_NUM_FLOORS\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Dummied, always returns FALSE\n\t.macro ttower_shouldexit\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_SHOULD_WARP_TO_COUNTER\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ Plays the encounter music for the trainer number in VAR_TEMP_1\n\t.macro ttower_encountermusic\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_ENCOUNTER_MUSIC\n\tspecial CallTrainerTowerFunc\n\t.endm\n\n\t@ TRUE if the player reached the Battle Tower owner, FALSE otherwise\n\t.macro ttower_getbeatchallenge\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_BEAT_CHALLENGE\n\tspecial CallTrainerTowerFunc\n\t.endm\n"
  },
  {
    "path": "asm/macros.inc",
    "content": "\t.include \"asm/macros/asm.inc\"\n\t.include \"asm/macros/function.inc\"\n\t.include \"asm/macros/movement.inc\"\n\t.include \"asm/macros/ec.inc\"\n\t.include \"asm/macros/map.inc\"\n\t.include \"asm/macros/m4a.inc\"\n\t.include \"asm/macros/trainer_tower.inc\"\n\n\t.macro region_map_location x, y, width, height, name\n\t.byte \\x\n\t.byte \\y\n\t.byte \\width\n\t.byte \\height\n\t.4byte gMapName_\\name\n\t.endm\n\n\t.macro obj_tiles address, uncompressed_size, tag\n\t.4byte \\address\n\t.2byte \\uncompressed_size\n\t.2byte \\tag\n\t.endm\n\n\t.macro null_obj_tiles\n\tobj_tiles 0, 0, 0\n\t.endm\n\n\t.macro obj_pal address, tag\n\t.4byte \\address\n\t.2byte \\tag\n\t.2byte 0 @ padding\n\t.endm\n\n\t.macro null_obj_pal\n\tobj_pal 0, 0\n\t.endm\n\n\t.macro paired_pals tag, address\n\t.2byte \\tag\n\t.2byte 0 @ padding\n\t.4byte \\address\n\t.endm\n\n@ For object animation frames.\n\t.macro obj_frame_tiles address, uncompressed_size\n\t.4byte \\address\n\t.2byte \\uncompressed_size\n\t.2byte 0 @ padding\n\t.endm\n\n\t.macro spr_template tile_tag, pal_tag, oam, anims, images, affine_anims, callback\n\t.2byte \\tile_tag\n\t.2byte \\pal_tag\n\t.4byte \\oam\n\t.4byte \\anims\n\t.4byte \\images\n\t.4byte \\affine_anims\n\t.4byte \\callback\n\t.endm\n\n@ Berry trees have a table defining the palette slot used for each of their 5\n@ stages. However, the first 2 stages always use the same slots regardless of\n@ the type of tree and the slots of the last 3 stages always equal each other.\n\t.macro berry_tree_palette_slot_table slot\n\t.byte 3, 4, \\slot, \\slot, \\slot\n\t.endm\n\n\t.macro subsprite x, y, priority, tile_num_offset, size\n\t.byte \\x\n\t.byte \\y\n\t.2byte ((\\priority) << 14) | ((\\tile_num_offset) << 4) | SPRITE_SIZE_\\size\n\t.endm\n\n\t.macro obj_image_anim_frame pic_id, duration, flags = 0\n\t.2byte \\pic_id\n\t.byte (\\flags) | (\\duration)\n\t.byte 0 @ padding\n\t.endm\n\n\t.macro obj_image_anim_loop count\n\t.2byte 0xfffd\n\t.byte \\count\n\t.byte 0 @ padding\n\t.endm\n\n\t.macro obj_image_anim_jump target_index\n\t.2byte 0xfffe\n\t.byte \\target_index\n\t.byte 0 @ padding\n\t.endm\n\n\t.macro obj_image_anim_end\n\t.2byte 0xffff\n\t.2byte 0 @ padding\n\t.endm\n\n\t.macro obj_rot_scal_anim_frame delta_x_scale, delta_y_scale, delta_angle, duration\n\t.2byte \\delta_x_scale\n\t.2byte \\delta_y_scale\n\t.byte \\delta_angle\n\t.byte \\duration\n\t.2byte 0 @ padding\n\t.endm\n\n\t.macro obj_rot_scal_anim_loop count\n\t.2byte 0x7ffd\n\t.2byte \\count\n\t.4byte 0 @ padding\n\t.endm\n\n\t.macro obj_rot_scal_anim_jump target_index\n\t.2byte 0x7ffe\n\t.2byte \\target_index\n\t.4byte 0 @ padding\n\t.endm\n\n\t.macro obj_rot_scal_anim_end unknown=0\n\t.2byte 0x7fff\n\t.2byte \\unknown\n\t.fill 4 @ padding\n\t.endm\n\n\t.macro overworld_frame ptr:req, width:req, height:req, frame:req\n\t.4byte (\\ptr + (\\width * \\height * \\frame * 64) / 2)\n\t.2byte (\\width * \\height * 64) / 2\n\t.2byte 0 @ padding\n\t.endm\n\n\t.macro credits_entry number, text\n\t.4byte \\number\n\t.4byte \\text\n\t.endm\n\n\t.macro door_anim_frame unknown, offset\n\t.byte \\unknown\n\t.byte 0 @ padding\n\t.2byte \\offset\n\t.endm\n\n\t.macro door_anim_gfx metatile_num, unknown, tile_addr, palette_addr\n\t.2byte \\metatile_num\n\t.2byte \\unknown\n\t.4byte \\tile_addr\n\t.4byte \\palette_addr\n\t.endm\n\n\t.macro trainer_eye_trainer opp_1, opp_2, opp_3, opp_4, opp_5, map_name\n\t.2byte OPPONENT_\\opp_1\n\t.2byte OPPONENT_\\opp_2\n\t.2byte OPPONENT_\\opp_3\n\t.2byte OPPONENT_\\opp_4\n\t.2byte OPPONENT_\\opp_5\n\t.2byte GROUP_\\map_name\n\t.2byte MAP_\\map_name\n\t.space 2\n\t.endm\n\n\t.macro window_template bg, top, left, height, width, palno, baseBlock\n\t.byte \\bg, \\top, \\left, \\height, \\width, \\palno\n\t.2byte \\baseBlock\n\t.endm\n\n\t.macro abspath relative\n\t.if REVISION == 0\n\t.ascii \"C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/\"\n\t.else\n\t.ascii \"C:/WORK/POKeFRLG/Src/pm_lgfr_ose/source/\"\n\t.endif\n\t.asciz \"\\relative\"\n\t.endm\n"
  },
  {
    "path": "asmdiff.sh",
    "content": "#!/bin/bash\n\nif [ \"$1\" == \"firered\" ] || [ \"$1\" == \"leafgreen\" ] || [ \"$1\" == \"firered_rev1\" ] || [ \"$1\" == \"leafgreen_rev1\" ]; then\n  buildname=\"$1\"\n  shift\nelse\n  buildname=firered\nfi\n\nif [ \"$buildname\" == \"firered\" ]; then\n  baserom=baserom\nelif [ \"$buildname\" == \"leafgreen\" ]; then\n  baserom=baserom_lg\nelif [ \"$buildname\" == \"firered_rev1\" ]; then\n  baserom=baserom_fr_rev1\nelif [ \"$buildname\" == \"leafgreen_rev1\" ]; then\n  baserom=baserom_lg_rev1\nelse\n  echo unknown buildname $buildname\n  exit 1\nfi\n\nOBJDUMP=\"$DEVKITARM/bin/arm-none-eabi-objdump -D -bbinary -marmv4t -Mforce-thumb\"\nOPTIONS=\"--start-address=$(($1)) --stop-address=$(($1 + $2))\"\n$OBJDUMP $OPTIONS ${baserom}.gba > ${baserom}.dump || exit 1\n$OBJDUMP $OPTIONS poke${buildname}.gba > poke${buildname}.dump\ndiff -u ${baserom}.dump poke${buildname}.dump\n"
  },
  {
    "path": "build_tools.sh",
    "content": "#!/bin/sh\nmake -C tools/aif2pcm CXX=${1:-g++}\nmake -C tools/bin2c CXX=${1:-g++}\nmake -C tools/gbafix CXX=${1:-g++}\nmake -C tools/gbagfx CXX=${1:-g++}\nmake -C tools/preproc CXX=${1:-g++}\nmake -C tools/ramscrgen CXX=${1:-g++}\nmake -C tools/rsfont CXX=${1:-g++}\nmake -C tools/scaninc CXX=${1:-g++}\nmake -C tools/mapjson CXX=${1:-g++}\nmake -C tools/jsonproc CXX=${1:-g++}\n"
  },
  {
    "path": "charmap.txt",
    "content": "' '         = 00\n'À'         = 01\n'Á'         = 02\n'Â'         = 03\n'Ç'         = 04\n'È'         = 05\n'É'         = 06\n'Ê'         = 07\n'Ë'         = 08\n'Ì'         = 09\n'Î'         = 0B\n'Ï'         = 0C\n'Ò'         = 0D\n'Ó'         = 0E\n'Ô'         = 0F\n'Œ'         = 10\n'Ù'         = 11\n'Ú'         = 12\n'Û'         = 13\n'Ñ'         = 14\n'ß'         = 15\n'à'         = 16\n'á'         = 17\n'ç'         = 19\n'è'         = 1A\n'é'         = 1B\n'ê'         = 1C\n'ë'         = 1D\n'ì'         = 1E\n'î'         = 20\n'ï'         = 21\n'ò'         = 22\n'ó'         = 23\n'ô'         = 24\n'œ'         = 25\n'ù'         = 26\n'ú'         = 27\n'û'         = 28\n'ñ'         = 29\n'º'         = 2A\n'ª'         = 2B\nSUPER_ER    = 2C\n'&'         = 2D\n'+'         = 2E\nLV          = 34\n'='         = 35\n';'         = 36\n'¿'         = 51\n'¡'         = 52\nPK          = 53\nPKMN        = 53 54\nPOKEBLOCK   = 55 56 57 58 59\n'Í'         = 5A\n'%'         = 5B\n'('         = 5C\n')'         = 5D\n'â'         = 68\n'í'         = 6F\nARROW_SPACER = 78\nUP_ARROW    = 79\nDOWN_ARROW  = 7A\nLEFT_ARROW  = 7B\nRIGHT_ARROW = 7C\nFONT_A_BUTTON = 7D\nSUPER_E     = 84\n'<'         = 85\n'>'         = 86\nSUPER_RE    = A0\n'0'         = A1\n'1'         = A2\n'2'         = A3\n'3'         = A4\n'4'         = A5\n'5'         = A6\n'6'         = A7\n'7'         = A8\n'8'         = A9\n'9'         = AA\n'!'         = AB\n'?'         = AC\n'.'         = AD\n'-'         = AE\n'·'         = AF\n'…'         = B0\n'“'         = B1\n'”'         = B2\n'‘'         = B3\n'’'         = B4\n'\\''        = B4\n'♂'         = B5\n'♀'         = B6\n'¥'         = B7\n','         = B8\n'×'         = B9\n'/'         = BA\n'A'         = BB\n'B'         = BC\n'C'         = BD\n'D'         = BE\n'E'         = BF\n'F'         = C0\n'G'         = C1\n'H'         = C2\n'I'         = C3\n'J'         = C4\n'K'         = C5\n'L'         = C6\n'M'         = C7\n'N'         = C8\n'O'         = C9\n'P'         = CA\n'Q'         = CB\n'R'         = CC\n'S'         = CD\n'T'         = CE\n'U'         = CF\n'V'         = D0\n'W'         = D1\n'X'         = D2\n'Y'         = D3\n'Z'         = D4\n'a'         = D5\n'b'         = D6\n'c'         = D7\n'd'         = D8\n'e'         = D9\n'f'         = DA\n'g'         = DB\n'h'         = DC\n'i'         = DD\n'j'         = DE\n'k'         = DF\n'l'         = E0\n'm'         = E1\n'n'         = E2\n'o'         = E3\n'p'         = E4\n'q'         = E5\n'r'         = E6\n's'         = E7\n't'         = E8\n'u'         = E9\n'v'         = EA\n'w'         = EB\n'x'         = EC\n'y'         = ED\n'z'         = EE\n'▶'         = EF\n':'         = F0\n'Ä'         = F1\n'Ö'         = F2\n'Ü'         = F3\n'ä'         = F4\n'ö'         = F5\n'ü'         = F6\n@ Arrows at F7-FA are duplicates of 79-7C. Unused?\nTALL_PLUS   = FC 0C FB\n'$'         = FF\n\n@ Hiragana\n'あ' = 01\n'い' = 02\n'う' = 03\n'え' = 04\n'お' = 05\n'か' = 06\n'き' = 07\n'く' = 08\n'け' = 09\n'こ' = 0A\n'さ' = 0B\n'し' = 0C\n'す' = 0D\n'せ' = 0E\n'そ' = 0F\n'た' = 10\n'ち' = 11\n'つ' = 12\n'て' = 13\n'と' = 14\n'な' = 15\n'に' = 16\n'ぬ' = 17\n'ね' = 18\n'の' = 19\n'は' = 1A\n'ひ' = 1B\n'ふ' = 1C\n'へ' = 1D\n'ほ' = 1E\n'ま' = 1F\n'み' = 20\n'む' = 21\n'め' = 22\n'も' = 23\n'や' = 24\n'ゆ' = 25\n'よ' = 26\n'ら' = 27\n'り' = 28\n'る' = 29\n'れ' = 2A\n'ろ' = 2B\n'わ' = 2C\n'を' = 2D\n'ん' = 2E\n'ぁ' = 2F\n'ぃ' = 30\n'ぅ' = 31\n'ぇ' = 32\n'ぉ' = 33\n'ゃ' = 34\n'ゅ' = 35\n'ょ' = 36\n'が' = 37\n'ぎ' = 38\n'ぐ' = 39\n'げ' = 3A\n'ご' = 3B\n'ざ' = 3C\n'じ' = 3D\n'ず' = 3E\n'ぜ' = 3F\n'ぞ' = 40\n'だ' = 41\n'ぢ' = 42\n'づ' = 43\n'で' = 44\n'ど' = 45\n'ば' = 46\n'び' = 47\n'ぶ' = 48\n'べ' = 49\n'ぼ' = 4A\n'ぱ' = 4B\n'ぴ' = 4C\n'ぷ' = 4D\n'ぺ' = 4E\n'ぽ' = 4F\n'っ' = 50\n\n@ Katakana\n'ア' = 51\n'イ' = 52\n'ウ' = 53\n'エ' = 54\n'オ' = 55\n'カ' = 56\n'キ' = 57\n'ク' = 58\n'ケ' = 59\n'コ' = 5A\n'サ' = 5B\n'シ' = 5C\n'ス' = 5D\n'セ' = 5E\n'ソ' = 5F\n'タ' = 60\n'チ' = 61\n'ツ' = 62\n'テ' = 63\n'ト' = 64\n'ナ' = 65\n'ニ' = 66\n'ヌ' = 67\n'ネ' = 68\n'ノ' = 69\n'ハ' = 6A\n'ヒ' = 6B\n'フ' = 6C\n'ヘ' = 6D\n'ホ' = 6E\n'マ' = 6F\n'ミ' = 70\n'ム' = 71\n'メ' = 72\n'モ' = 73\n'ヤ' = 74\n'ユ' = 75\n'ヨ' = 76\n'ラ' = 77\n'リ' = 78\n'ル' = 79\n'レ' = 7A\n'ロ' = 7B\n'ワ' = 7C\n'ヲ' = 7D\n'ン' = 7E\n'ァ' = 7F\n'ィ' = 80\n'ゥ' = 81\n'ェ' = 82\n'ォ' = 83\n'ャ' = 84\n'ュ' = 85\n'ョ' = 86\n'ガ' = 87\n'ギ' = 88\n'グ' = 89\n'ゲ' = 8A\n'ゴ' = 8B\n'ザ' = 8C\n'ジ' = 8D\n'ズ' = 8E\n'ゼ' = 8F\n'ゾ' = 90\n'ダ' = 91\n'ヂ' = 92\n'ヅ' = 93\n'デ' = 94\n'ド' = 95\n'バ' = 96\n'ビ' = 97\n'ブ' = 98\n'ベ' = 99\n'ボ' = 9A\n'パ' = 9B\n'ピ' = 9C\n'プ' = 9D\n'ペ' = 9E\n'ポ' = 9F\n'ッ' = A0\n\n@ Japanese punctuation\n'　' = 00\n'！' = AB\n'？' = AC\n'。' = AD\n'ー' = AE\n'‥' = B0\n\nSTRING = FD\n\n@ string placeholders\nPLAYER         = FD 01\nSTR_VAR_1      = FD 02\nSTR_VAR_2      = FD 03\nSTR_VAR_3      = FD 04\nKUN            = FD 05\nRIVAL          = FD 06\n@ version-dependent strings\nVERSION        = FD 07 @ \"RUBY\"    / \"SAPPHIRE\"\nEVIL_TEAM      = FD 08 @ \"MAGMA\"   / \"AQUA\"\nGOOD_TEAM      = FD 09 @ \"AQUA\"    / \"MAGMA\"\nEVIL_LEADER    = FD 0A @ \"MAXIE\"   / \"ARCHIE\"\nGOOD_LEADER    = FD 0B @ \"ARCHIE\"  / \"MAXIE\"\nEVIL_LEGENDARY = FD 0C @ \"GROUDON\" / \"KYOGRE\"\nGOOD_LEGENDARY = FD 0D @ \"KYOGRE\"  / \"GROUDON\"\n\n@ battle macros\n\nUNKNOWN_STR = FD 00\n\nATTACKING_TRAINER = FD 08\nDEFENDING_TRAINER = FD 09\n\nATTACKING_MON = FD 0C\nDEFENDING_MON = FD 0D\n\n@ battle string placeholders\n\nB_BUFF1 = FD 00\nB_BUFF2 = FD 01\nB_COPY_VAR_1 = FD 02\nB_COPY_VAR_2 = FD 03\nB_COPY_VAR_3 = FD 04\nB_PLAYER_MON1_NAME = FD 05\nB_OPPONENT_MON1_NAME = FD 06\nB_PLAYER_MON2_NAME = FD 07\nB_OPPONENT_MON2_NAME = FD 08\nB_LINK_PLAYER_MON1_NAME = FD 09\nB_LINK_OPPONENT_MON1_NAME = FD 0A\nB_LINK_PLAYER_MON2_NAME = FD 0B\nB_LINK_OPPONENT_MON2_NAME = FD 0C\nB_ATK_NAME_WITH_PREFIX_MON1 = FD 0D\nB_ATK_PARTNER_NAME = FD 0E\nB_ATK_NAME_WITH_PREFIX = FD 0F\nB_DEF_NAME_WITH_PREFIX = FD 10\nB_EFF_NAME_WITH_PREFIX = FD 11 @ EFF = short for gEffectBattler\nB_ACTIVE_NAME_WITH_PREFIX = FD 12\nB_SCR_ACTIVE_NAME_WITH_PREFIX = FD 13\nB_CURRENT_MOVE = FD 14\nB_LAST_MOVE = FD 15\nB_LAST_ITEM = FD 16\nB_LAST_ABILITY = FD 17\nB_ATK_ABILITY = FD 18\nB_DEF_ABILITY = FD 19\nB_SCR_ACTIVE_ABILITY = FD 1A\nB_EFF_ABILITY = FD 1B\nB_TRAINER1_CLASS = FD 1C\nB_TRAINER1_NAME = FD 1D\nB_LINK_PLAYER_NAME = FD 1E\nB_LINK_PARTNER_NAME = FD 1F\nB_LINK_OPPONENT1_NAME = FD 20\nB_LINK_OPPONENT2_NAME = FD 21\nB_LINK_SCR_TRAINER_NAME = FD 22\nB_PLAYER_NAME = FD 23\nB_TRAINER1_LOSE_TEXT = FD 24\nB_TRAINER1_WIN_TEXT = FD 25\nB_26 = FD 26\nB_PC_CREATOR_NAME = FD 27\nB_ATK_PREFIX1 = FD 28\nB_DEF_PREFIX1 = FD 29\nB_ATK_PREFIX2 = FD 2A\nB_DEF_PREFIX2 = FD 2B\nB_ATK_PREFIX3 = FD 2C\nB_DEF_PREFIX3 = FD 2D\nB_TRAINER2_LOSE_TEXT = FD 2E\nB_TRAINER2_WIN_TEXT = FD 2F\nB_BUFF3 = FD 30\n\n@ indicates the end of a town/city name (before \" TOWN\" or \" CITY\")\nNAME_END = FC 00\n\n@ special 0xF7 character\nDYNAMIC  =   F7\n\n@ more text functions\n\nCOLOR = FC 01 @ use a color listed below right after\nHIGHLIGHT = FC 02 @ same as fc 01\nSHADOW = FC 03 @ same as fc 01\nCOLOR_HIGHLIGHT_SHADOW = FC 04 @ takes 3 bytes\nPALETTE = FC 05 @ used in credits\nFONT = FC 06 @ Given a font id, or use font constants below instead\nRESET_FONT = FC 07\nPAUSE = FC 08 @ manually print the wait byte after this, havent mapped them\nPAUSE_UNTIL_PRESS = FC 09\nWAIT_SE = FC 0A\nPLAY_BGM = FC 0B\nESCAPE = FC 0C\nSHIFT_RIGHT = FC 0D\nSHIFT_DOWN = FC 0E\nFILL_WINDOW = FC 0F\nPLAY_SE = FC 10\nCLEAR = FC 11\nSKIP = FC 12\nCLEAR_TO = FC 13\nMIN_LETTER_SPACING = FC 14\nJPN = FC 15\nENG = FC 16\nPAUSE_MUSIC = FC 17\nRESUME_MUSIC = FC 18\n\n@ fonts\n\nFONT_SMALL = FC 06 00\nFONT_NORMAL_COPY_1 = FC 06 01\nFONT_NORMAL = FC 06 02\nFONT_NORMAL_COPY_2 = FC 06 03\nFONT_MALE = FC 06 04\nFONT_FEMALE = FC 06 05\n\n@ colors\n\nTRANSPARENT = 00\nWHITE = 01\nDARK_GRAY = 02\nLIGHT_GRAY = 03\nRED = 04\nLIGHT_RED = 05\nGREEN = 06\nLIGHT_GREEN = 07\nBLUE = 08\nLIGHT_BLUE = 09\n@ these next colors can be set to anything arbitrary at runtime\n@ usually though they'll have the textbox border colors as described below\nDYNAMIC_COLOR1 = 0A @ white\nDYNAMIC_COLOR2 = 0B @ white with a tinge of green\nDYNAMIC_COLOR3 = 0C @ white 2\nDYNAMIC_COLOR4 = 0D @ aquamarine\nDYNAMIC_COLOR5 = 0E @ blue-green\nDYNAMIC_COLOR6 = 0F @ cerulean\n\n@ sound and music\n\nMUS_DUMMY = 00 00\nSE_USE_ITEM = 01 00\nSE_PC_LOGIN = 02 00\nSE_PC_OFF = 03 00\nSE_PC_ON = 04 00\nSE_SELECT = 05 00\nSE_WIN_OPEN = 06 00\nSE_WALL_HIT = 07 00\nSE_RS_DOOR = 08 00\nSE_EXIT = 09 00\nSE_LEDGE = 0A 00\nSE_BIKE_BELL = 0B 00\nSE_NOT_EFFECTIVE = 0C 00\nSE_EFFECTIVE = 0D 00\nSE_SUPER_EFFECTIVE = 0E 00\nSE_BALL_OPEN = 0F 00\nSE_FAINT = 10 00\nSE_FLEE = 11 00\nSE_SLIDING_DOOR = 12 00\nSE_SHIP = 13 00\nSE_BANG = 14 00\nSE_PIN = 15 00\nSE_BOO = 16 00\nSE_BALL = 17 00\nSE_CONTEST_PLACE = 18 00\nSE_A = 19 00\nSE_I = 1A 00\nSE_U = 1B 00\nSE_E = 1C 00\nSE_O = 1D 00\nSE_N = 1E 00\nSE_SUCCESS = 1F 00\nSE_FAILURE = 20 00\nSE_EXP = 21 00\nSE_BIKE_HOP = 22 00\nSE_SWITCH = 23 00\nSE_CLICK = 24 00\nSE_FU_ZAKU = 25 00\nSE_CONTEST_CONDITION_LOSE = 26 00\nSE_LAVARIDGE_FALL_WARP = 27 00\nSE_ICE_STAIRS = 28 00\nSE_ICE_BREAK = 29 00\nSE_ICE_CRACK = 2A 00\nSE_FALL = 2B 00\nSE_UNLOCK = 2C 00\nSE_WARP_IN = 2D 00\nSE_WARP_OUT = 2E 00\nSE_REPEL = 2F 00\nSE_ROTATING_GATE = 30 00\nSE_TRUCK_MOVE = 31 00\nSE_TRUCK_STOP = 32 00\nSE_TRUCK_UNLOAD = 33 00\nSE_TRUCK_DOOR = 34 00\nSE_BERRY_BLENDER = 35 00\nSE_CARD = 36 00\nSE_SAVE = 37 00\nSE_BALL_BOUNCE_1 = 38 00\nSE_BALL_BOUNCE_2 = 39 00\nSE_BALL_BOUNCE_3 = 3A 00\nSE_BALL_BOUNCE_4 = 3B 00\nSE_BALL_TRADE = 3C 00\nSE_BALL_THROW = 3D 00\nSE_NOTE_C = 3E 00\nSE_NOTE_D = 3F 00\nSE_NOTE_E = 40 00\nSE_NOTE_F = 41 00\nSE_NOTE_G = 42 00\nSE_NOTE_A = 43 00\nSE_NOTE_B = 44 00\nSE_NOTE_C_HIGH = 45 00\nSE_PUDDLE = 46 00\nSE_BRIDGE_WALK = 47 00\nSE_ITEMFINDER = 48 00\nSE_DING_DONG = 49 00\nSE_BALLOON_RED = 4A 00\nSE_BALLOON_BLUE = 4B 00\nSE_BALLOON_YELLOW = 4C 00\nSE_BREAKABLE_DOOR = 4D 00\nSE_MUD_BALL = 4E 00\nSE_FIELD_POISON = 4F 00\nSE_ESCALATOR = 50 00\nSE_THUNDERSTORM = 51 00\nSE_THUNDERSTORM_STOP = 52 00\nSE_DOWNPOUR = 53 00\nSE_DOWNPOUR_STOP = 54 00\nSE_RAIN = 55 00\nSE_RAIN_STOP = 56 00\nSE_THUNDER = 57 00\nSE_THUNDER2 = 58 00\nSE_ELEVATOR = 59 00\nSE_LOW_HEALTH = 5A 00\nSE_EXP_MAX = 5B 00\nSE_ROULETTE_BALL = 5C 00\nSE_ROULETTE_BALL2 = 5D 00\nSE_TAILLOW_WING_FLAP = 5E 00\nSE_RS_SHOP = 5F 00\nSE_CONTEST_HEART = 60 00\nSE_CONTEST_CURTAIN_RISE = 61 00\nSE_CONTEST_CURTAIN_FALL = 62 00\nSE_CONTEST_ICON_CHANGE = 63 00\nSE_CONTEST_ICON_CLEAR = 64 00\nSE_CONTEST_MONS_TURN = 65 00\nSE_SHINY = 66 00\nSE_INTRO_BLAST = 67 00\nSE_MUGSHOT = 68 00\nSE_APPLAUSE = 69 00\nSE_VEND = 6A 00\nSE_ORB = 6B 00\nSE_DEX_SCROLL = 6C 00\nSE_DEX_PAGE = 6D 00\nSE_POKENAV_ON = 6E 00\nSE_POKENAV_OFF = 6F 00\nSE_DEX_SEARCH = 70 00\nSE_EGG_HATCH = 71 00\nSE_BALL_TRAY_ENTER = 72 00\nSE_BALL_TRAY_BALL = 73 00\nSE_BALL_TRAY_EXIT = 74 00\nSE_GLASS_FLUTE = 75 00\nSE_M_THUNDERBOLT = 76 00\nSE_M_THUNDERBOLT2 = 77 00\nSE_M_HARDEN = 78 00\nSE_M_NIGHTMARE = 79 00\nSE_M_VITAL_THROW = 7A 00\nSE_M_VITAL_THROW2 = 7B 00\nSE_M_BUBBLE = 7C 00\nSE_M_BUBBLE2 = 7D 00\nSE_M_BUBBLE3 = 7E 00\nSE_M_RAIN_DANCE = 7F 00\nSE_M_CUT = 80 00\nSE_M_STRING_SHOT = 81 00\nSE_M_STRING_SHOT2 = 82 00\nSE_M_ROCK_THROW = 83 00\nSE_M_GUST = 84 00\nSE_M_GUST2 = 85 00\nSE_M_DOUBLE_SLAP = 86 00\nSE_M_DOUBLE_TEAM = 87 00\nSE_M_RAZOR_WIND = 88 00\nSE_M_ICY_WIND = 89 00\nSE_M_THUNDER_WAVE = 8A 00\nSE_M_COMET_PUNCH = 8B 00\nSE_M_MEGA_KICK = 8C 00\nSE_M_MEGA_KICK2 = 8D 00\nSE_M_CRABHAMMER = 8E 00\nSE_M_JUMP_KICK = 8F 00\nSE_M_FLAME_WHEEL = 90 00\nSE_M_FLAME_WHEEL2 = 91 00\nSE_M_FLAMETHROWER = 92 00\nSE_M_FIRE_PUNCH = 93 00\nSE_M_TOXIC = 94 00\nSE_M_SACRED_FIRE = 95 00\nSE_M_SACRED_FIRE2 = 96 00\nSE_M_EMBER = 97 00\nSE_M_TAKE_DOWN = 98 00\nSE_M_BLIZZARD = 99 00\nSE_M_BLIZZARD2 = 9A 00\nSE_M_SCRATCH = 9B 00\nSE_M_VICEGRIP = 9C 00\nSE_M_WING_ATTACK = 9D 00\nSE_M_FLY = 9E 00\nSE_M_SAND_ATTACK = 9F 00\nSE_M_RAZOR_WIND2 = A0 00\nSE_M_BITE = A1 00\nSE_M_HEADBUTT = A2 00\nSE_M_SURF = A3 00\nSE_M_HYDRO_PUMP = A4 00\nSE_M_WHIRLPOOL = A5 00\nSE_M_HORN_ATTACK = A6 00\nSE_M_TAIL_WHIP = A7 00\nSE_M_MIST = A8 00\nSE_M_POISON_POWDER = A9 00\nSE_M_BIND = AA 00\nSE_M_DRAGON_RAGE = AB 00\nSE_M_SING = AC 00\nSE_M_PERISH_SONG = AD 00\nSE_M_PAY_DAY = AE 00\nSE_M_DIG = AF 00\nSE_M_DIZZY_PUNCH = B0 00\nSE_M_SELF_DESTRUCT = B1 00\nSE_M_EXPLOSION = B2 00\nSE_M_ABSORB_2 = B3 00\nSE_M_ABSORB = B4 00\nSE_M_SCREECH = B5 00\nSE_M_BUBBLE_BEAM = B6 00\nSE_M_BUBBLE_BEAM2 = B7 00\nSE_M_SUPERSONIC = B8 00\nSE_M_BELLY_DRUM = B9 00\nSE_M_METRONOME = BA 00\nSE_M_BONEMERANG = BB 00\nSE_M_LICK = BC 00\nSE_M_PSYBEAM = BD 00\nSE_M_FAINT_ATTACK = BE 00\nSE_M_SWORDS_DANCE = BF 00\nSE_M_LEER = C0 00\nSE_M_SWAGGER = C1 00\nSE_M_SWAGGER2 = C2 00\nSE_M_HEAL_BELL = C3 00\nSE_M_CONFUSE_RAY = C4 00\nSE_M_SNORE = C5 00\nSE_M_BRICK_BREAK = C6 00\nSE_M_GIGA_DRAIN = C7 00\nSE_M_PSYBEAM2 = C8 00\nSE_M_SOLAR_BEAM = C9 00\nSE_M_PETAL_DANCE = CA 00\nSE_M_TELEPORT = CB 00\nSE_M_MINIMIZE = CC 00\nSE_M_SKETCH = CD 00\nSE_M_SWIFT = CE 00\nSE_M_REFLECT = CF 00\nSE_M_BARRIER = D0 00\nSE_M_DETECT = D1 00\nSE_M_LOCK_ON = D2 00\nSE_M_MOONLIGHT = D3 00\nSE_M_CHARM = D4 00\nSE_M_CHARGE = D5 00\nSE_M_STRENGTH = D6 00\nSE_M_HYPER_BEAM = D7 00\nSE_M_WATERFALL = D8 00\nSE_M_REVERSAL = D9 00\nSE_M_ACID_ARMOR = DA 00\nSE_M_SANDSTORM = DB 00\nSE_M_TRI_ATTACK = DC 00\nSE_M_TRI_ATTACK2 = DD 00\nSE_M_ENCORE = DE 00\nSE_M_ENCORE2 = DF 00\nSE_M_BATON_PASS = E0 00\nSE_M_MILK_DRINK = E1 00\nSE_M_ATTRACT = E2 00\nSE_M_ATTRACT2 = E3 00\nSE_M_MORNING_SUN = E4 00\nSE_M_FLATTER = E5 00\nSE_M_SAND_TOMB = E6 00\nSE_M_GRASSWHISTLE = E7 00\nSE_M_SPIT_UP = E8 00\nSE_M_DIVE = E9 00\nSE_M_EARTHQUAKE = EA 00\nSE_M_TWISTER = EB 00\nSE_M_SWEET_SCENT = EC 00\nSE_M_YAWN = ED 00\nSE_M_SKY_UPPERCUT = EE 00\nSE_M_STAT_INCREASE = EF 00\nSE_M_HEAT_WAVE = F0 00\nSE_M_UPROAR = F1 00\nSE_M_HAIL = F2 00\nSE_M_COSMIC_POWER = F3 00\nSE_M_TEETER_DANCE = F4 00\nSE_M_STAT_DECREASE = F5 00\nSE_M_HAZE = F6 00\nSE_M_HYPER_BEAM2 = F7 00\nSE_DOOR = F8 00\nSE_CARD_FLIP = F9 00\nSE_CARD_FLIPPING = FA 00\nSE_CARD_OPEN = FB 00\nSE_BAG_CURSOR = FC 00\nSE_BAG_POCKET = FD 00\nSE_BALL_CLICK = FE 00\nSE_SHOP = FF 00\nSE_SS_ANNE_HORN = 00 01\nSE_HELP_OPEN = 01 01\nSE_HELP_CLOSE = 02 01\nSE_HELP_ERROR = 03 01\nSE_DEOXYS_MOVE = 04 01\nSE_POKE_JUMP_SUCCESS = 05 01\nSE_POKE_JUMP_FAILURE = 06 01\nSE_POKENAV_CALL = 07 01\nSE_POKENAV_HANG_UP = 08 01\nSE_ARENA_TIMEUP1 = 09 01\nSE_ARENA_TIMEUP2 = 0A 01\nSE_PIKE_CURTAIN_CLOSE = 0B 01\nSE_PIKE_CURTAIN_OPEN = 0C 01\nSE_SUDOWOODO_SHAKE = 0D 01\nMUS_LITTLEROOT_TEST = 5E 01\nMUS_GSC_ROUTE38 = 5F 01\nMUS_RS_CAUGHT = 60 01\nMUS_RS_VICTORY_WILD = 61 01\nMUS_RS_VICTORY_GYM_LEADER = 62 01\nMUS_VICTORY_LEAGUE = 63 01\nMUS_C_COMM_CENTER = 64 01\nMUS_GSC_PEWTER = 65 01\nMUS_C_VS_LEGEND_BEAST = 66 01\nMUS_ROUTE101 = 67 01\nMUS_ROUTE110 = 68 01\nMUS_ROUTE120 = 69 01\nMUS_PETALBURG = 6A 01\nMUS_OLDALE = 6B 01\nMUS_RS_GYM = 6C 01\nMUS_RS_SURF = 6D 01\nMUS_PETALBURG_WOODS = 6E 01\nMUS_LEVEL_UP = 6F 01\nMUS_RS_HEAL = 70 01\nMUS_OBTAIN_BADGE = 71 01\nMUS_OBTAIN_ITEM = 72 01\nMUS_EVOLVED = 73 01\nMUS_OBTAIN_TMHM = 74 01\nMUS_LILYCOVE_MUSEUM = 75 01\nMUS_ROUTE122 = 76 01\nMUS_OCEANIC_MUSEUM = 77 01\nMUS_EVOLUTION_INTRO = 78 01\nMUS_EVOLUTION = 79 01\nMUS_MOVE_DELETED = 7A 01\nMUS_RS_ENCOUNTER_GIRL = 7B 01\nMUS_ENCOUNTER_MALE = 7C 01\nMUS_ABANDONED_SHIP = 7D 01\nMUS_FORTREE = 7E 01\nMUS_BIRCH_LAB = 7F 01\nMUS_B_TOWER_RS = 80 01\nMUS_ENCOUNTER_SWIMMER = 81 01\nMUS_CAVE_OF_ORIGIN = 82 01\nMUS_OBTAIN_BERRY = 83 01\nMUS_AWAKEN_LEGEND = 84 01\nMUS_SLOTS_JACKPOT = 85 01\nMUS_SLOTS_WIN = 86 01\nMUS_TOO_BAD = 87 01\nMUS_ROULETTE = 88 01\nMUS_LINK_CONTEST_P1 = 89 01\nMUS_LINK_CONTEST_P2 = 8A 01\nMUS_LINK_CONTEST_P3 = 8B 01\nMUS_LINK_CONTEST_P4 = 8C 01\nMUS_ENCOUNTER_RICH = 8D 01\nMUS_VERDANTURF = 8E 01\nMUS_RUSTBORO = 8F 01\nMUS_RS_POKE_CENTER = 90 01\nMUS_ROUTE104 = 91 01\nMUS_ROUTE119 = 92 01\nMUS_RS_CYCLING = 93 01\nMUS_POKE_MART = 94 01\nMUS_LITTLEROOT = 95 01\nMUS_MT_CHIMNEY = 96 01\nMUS_ENCOUNTER_FEMALE = 97 01\nMUS_LILYCOVE = 98 01\nMUS_ROUTE111 = 99 01\nMUS_HELP = 9A 01\nMUS_UNDERWATER = 9B 01\nMUS_RS_VICTORY_TRAINER = 9C 01\nMUS_RS_TITLE = 9D 01\nMUS_INTRO = 9E 01\nMUS_ENCOUNTER_MAY = 9F 01\nMUS_ENCOUNTER_INTENSE = A0 01\nMUS_ENCOUNTER_COOL = A1 01\nMUS_ROUTE113 = A2 01\nMUS_ENCOUNTER_AQUA = A3 01\nMUS_RS_FOLLOW_ME = A4 01\nMUS_ENCOUNTER_BRENDAN = A5 01\nMUS_EVER_GRANDE = A6 01\nMUS_ENCOUNTER_SUSPICIOUS = A7 01\nMUS_VICTORY_AQUA_MAGMA = A8 01\nMUS_CABLE_CAR = A9 01\nMUS_RS_GAME_CORNER = AA 01\nMUS_DEWFORD = AB 01\nMUS_SAFARI_ZONE = AC 01\nMUS_RS_VICTORY_ROAD = AD 01\nMUS_AQUA_MAGMA_HIDEOUT = AE 01\nMUS_SAILING = AF 01\nMUS_MT_PYRE = B0 01\nMUS_SLATEPORT = B1 01\nMUS_MT_PYRE_EXTERIOR = B2 01\nMUS_SCHOOL = B3 01\nMUS_RS_HALL_OF_FAME = B4 01\nMUS_FALLARBOR = B5 01\nMUS_SEALED_CHAMBER = B6 01\nMUS_CONTEST_WINNER = B7 01\nMUS_CONTEST = B8 01\nMUS_ENCOUNTER_MAGMA = B9 01\nMUS_INTRO_BATTLE = BA 01\nMUS_ABNORMAL_WEATHER = BB 01\nMUS_WEATHER_GROUDON = BC 01\nMUS_SOOTOPOLIS = BD 01\nMUS_CONTEST_RESULTS = BE 01\nMUS_HALL_OF_FAME_ROOM = BF 01\nMUS_TRICK_HOUSE = C0 01\nMUS_ENCOUNTER_TWINS = C1 01\nMUS_ENCOUNTER_ELITE_FOUR = C2 01\nMUS_ENCOUNTER_HIKER = C3 01\nMUS_CONTEST_LOBBY = C4 01\nMUS_ENCOUNTER_INTERVIEWER = C5 01\nMUS_ENCOUNTER_CHAMPION = C6 01\nMUS_RS_CREDITS = C7 01\nMUS_END = C8 01\nMUS_B_FRONTIER = C9 01\nMUS_B_ARENA = CA 01\nMUS_OBTAIN_B_POINTS = CB 01\nMUS_REGISTER_MATCH_CALL = CC 01\nMUS_B_PYRAMID = CD 01\nMUS_B_PYRAMID_TOP = CE 01\nMUS_B_PALACE = CF 01\nMUS_RAYQUAZA_APPEARS = D0 01\nMUS_B_TOWER = D1 01\nMUS_OBTAIN_SYMBOL = D2 01\nMUS_B_DOME = D3 01\nMUS_B_PIKE = D4 01\nMUS_B_FACTORY = D5 01\nMUS_VS_RAYQUAZA = D6 01\nMUS_VS_FRONTIER_BRAIN = D7 01\nMUS_VS_MEW = D8 01\nMUS_B_DOME_LOBBY = D9 01\nMUS_RS_VS_WILD = DA 01\nMUS_VS_AQUA_MAGMA = DB 01\nMUS_RS_VS_TRAINER = DC 01\nMUS_RS_VS_GYM_LEADER = DD 01\nMUS_RS_VS_CHAMPION = DE 01\nMUS_VS_REGI = DF 01\nMUS_VS_KYOGRE_GROUDON = E0 01\nMUS_VS_RIVAL = E1 01\nMUS_VS_ELITE_FOUR = E2 01\nMUS_VS_AQUA_MAGMA_LEADER = E3 01\nMUS_FOLLOW_ME = E4 01\nMUS_GAME_CORNER = E5 01\nMUS_ROCKET_HIDEOUT = E6 01\nMUS_GYM = E7 01\nMUS_JIGGLYPUFF = E8 01\nMUS_INTRO_FIGHT = E9 01\nMUS_TITLE = EA 01\nMUS_CINNABAR = EB 01\nMUS_LAVENDER = EC 01\nMUS_HEAL = ED 01\nMUS_CYCLING = EE 01\nMUS_ENCOUNTER_ROCKET = EF 01\nMUS_ENCOUNTER_GIRL = F0 01\nMUS_ENCOUNTER_BOY = F1 01\nMUS_HALL_OF_FAME = F2 01\nMUS_VIRIDIAN_FOREST = F3 01\nMUS_MT_MOON = F4 01\nMUS_POKE_MANSION = F5 01\nMUS_CREDITS = F6 01\nMUS_ROUTE1 = F7 01\nMUS_ROUTE24 = F8 01\nMUS_ROUTE3 = F9 01\nMUS_ROUTE11 = FA 01\nMUS_VICTORY_ROAD = FB 01\nMUS_VS_GYM_LEADER = FC 01\nMUS_VS_TRAINER = FD 01\nMUS_VS_WILD = FE 01\nMUS_VS_CHAMPION = FF 01\nMUS_PALLET = 00 02\nMUS_OAK_LAB = 01 02\nMUS_OAK = 02 02\nMUS_POKE_CENTER = 03 02\nMUS_SS_ANNE = 04 02\nMUS_SURF = 05 02\nMUS_POKE_TOWER = 06 02\nMUS_SILPH = 07 02\nMUS_FUCHSIA = 08 02\nMUS_CELADON = 09 02\nMUS_VICTORY_TRAINER = 0A 02\nMUS_VICTORY_WILD = 0B 02\nMUS_VICTORY_GYM_LEADER = 0C 02\nMUS_VERMILLION = 0D 02\nMUS_PEWTER = 0E 02\nMUS_ENCOUNTER_RIVAL = 0F 02\nMUS_RIVAL_EXIT = 10 02\nMUS_DEX_RATING = 11 02\nMUS_OBTAIN_KEY_ITEM = 12 02\nMUS_CAUGHT_INTRO = 13 02\nMUS_PHOTO = 14 02\nMUS_GAME_FREAK = 15 02\nMUS_CAUGHT = 16 02\nMUS_NEW_GAME_INSTRUCT = 17 02\nMUS_NEW_GAME_INTRO = 18 02\nMUS_NEW_GAME_EXIT = 19 02\nMUS_POKE_JUMP = 1A 02\nMUS_UNION_ROOM = 1B 02\nMUS_NET_CENTER = 1C 02\nMUS_MYSTERY_GIFT = 1D 02\nMUS_BERRY_PICK = 1E 02\nMUS_SEVII_CAVE = 1F 02\nMUS_TEACHY_TV_SHOW = 20 02\nMUS_SEVII_ROUTE = 21 02\nMUS_SEVII_DUNGEON = 22 02\nMUS_SEVII_123 = 23 02\nMUS_SEVII_45 = 24 02\nMUS_SEVII_67 = 25 02\nMUS_POKE_FLUTE = 26 02\nMUS_VS_DEOXYS = 27 02\nMUS_VS_MEWTWO = 28 02\nMUS_VS_LEGEND = 29 02\nMUS_ENCOUNTER_GYM_LEADER = 2A 02\nMUS_ENCOUNTER_DEOXYS = 2B 02\nMUS_TRAINER_TOWER = 2C 02\nMUS_SLOW_PALLET = 2D 02\nMUS_TEACHY_TV_MENU = 2E 02\nPH_TRAP_BLEND = 2F 02\nPH_TRAP_HELD = 30 02\nPH_TRAP_SOLO = 31 02\nPH_FACE_BLEND = 32 02\nPH_FACE_HELD = 33 02\nPH_FACE_SOLO = 34 02\nPH_CLOTH_BLEND = 35 02\nPH_CLOTH_HELD = 36 02\nPH_CLOTH_SOLO = 37 02\nPH_DRESS_BLEND = 38 02\nPH_DRESS_HELD = 39 02\nPH_DRESS_SOLO = 3A 02\nPH_FLEECE_BLEND = 3B 02\nPH_FLEECE_HELD = 3C 02\nPH_FLEECE_SOLO = 3D 02\nPH_KIT_BLEND = 3E 02\nPH_KIT_HELD = 3F 02\nPH_KIT_SOLO = 40 02\nPH_PRICE_BLEND = 41 02\nPH_PRICE_HELD = 42 02\nPH_PRICE_SOLO = 43 02\nPH_LOT_BLEND = 44 02\nPH_LOT_HELD = 45 02\nPH_LOT_SOLO = 46 02\nPH_GOAT_BLEND = 47 02\nPH_GOAT_HELD = 48 02\nPH_GOAT_SOLO = 49 02\nPH_THOUGHT_BLEND = 4A 02\nPH_THOUGHT_HELD = 4B 02\nPH_THOUGHT_SOLO = 4C 02\nPH_CHOICE_BLEND = 4D 02\nPH_CHOICE_HELD = 4E 02\nPH_CHOICE_SOLO = 4F 02\nPH_MOUTH_BLEND = 50 02\nPH_MOUTH_HELD = 51 02\nPH_MOUTH_SOLO = 52 02\nPH_FOOT_BLEND = 53 02\nPH_FOOT_HELD = 54 02\nPH_FOOT_SOLO = 55 02\nPH_GOOSE_BLEND = 56 02\nPH_GOOSE_HELD = 57 02\nPH_GOOSE_SOLO = 58 02\nPH_STRUT_BLEND = 59 02\nPH_STRUT_HELD = 5A 02\nPH_STRUT_SOLO = 5B 02\nPH_CURE_BLEND = 5C 02\nPH_CURE_HELD = 5D 02\nPH_CURE_SOLO = 5E 02\nPH_NURSE_BLEND = 5F 02\nPH_NURSE_HELD = 60 02\nPH_NURSE_SOLO = 61 02\n\nA_BUTTON        = F8 00\nB_BUTTON        = F8 01\nL_BUTTON        = F8 02\nR_BUTTON        = F8 03\nSTART_BUTTON    = F8 04\nSELECT_BUTTON   = F8 05\nDPAD_UP         = F8 06\nDPAD_DOWN       = F8 07\nDPAD_LEFT       = F8 08\nDPAD_RIGHT      = F8 09\nDPAD_UPDOWN    = F8 0A\nDPAD_LEFTRIGHT = F8 0B\nDPAD_ANY        = F8 0C\n\nUP_ARROW_2    = F9 00\nDOWN_ARROW_2  = F9 01\nLEFT_ARROW_2  = F9 02\nRIGHT_ARROW_2 = F9 03\nPLUS          = F9 04\nLV_2          = F9 05\nPP            = F9 06\nID            = F9 07\nNO            = F9 08\nUNDERSCORE    = F9 09\nCIRCLE_1      = F9 0A\nCIRCLE_2      = F9 0B\nCIRCLE_3      = F9 0C\nCIRCLE_4      = F9 0D\nCIRCLE_5      = F9 0E\nCIRCLE_6      = F9 0F\nCIRCLE_7      = F9 10\nCIRCLE_8      = F9 11\nCIRCLE_9      = F9 12\nLEFT_PAREN    = F9 13\nRIGHT_PAREN   = F9 14\nCIRCLE_DOT    = F9 15\nTRIANGLE      = F9 16\nBIG_MULT_X    = F9 17\n\nEMOJI_UNDERSCORE = F9 D0\nEMOJI_PIPE = F9 D1\nEMOJI_HIGHBAR = F9 D2\nEMOJI_TILDE = F9 D3\nEMOJI_LEFT_PAREN = F9 D4\nEMOJI_RIGHT_PAREN = F9 D5\nEMOJI_UNION = F9 D6 @ ⊂\nEMOJI_GREATER_THAN = F9 D7\nEMOJI_LEFT_EYE = F9 D8\nEMOJI_RIGHT_EYE = F9 D9\nEMOJI_AT = F9 DA\nEMOJI_SEMICOLON = F9 DB\nEMOJI_PLUS = F9 DC\nEMOJI_MINUS = F9 DD\nEMOJI_EQUALS = F9 DE\nEMOJI_SPIRAL = F9 DF\nEMOJI_TONGUE = F9 E0\nEMOJI_TRIANGLE_OUTLINE = F9 E1\nEMOJI_ACUTE = F9 E2\nEMOJI_GRAVE = F9 E3\nEMOJI_CIRCLE = F9 E4\nEMOJI_TRIANGLE = F9 E5\nEMOJI_SQUARE = F9 E6\nEMOJI_HEART = F9 E7\nEMOJI_MOON = F9 E8\nEMOJI_NOTE = F9 E9\nEMOJI_BALL = F9 EA\nEMOJI_BOLT = F9 EB\nEMOJI_LEAF = F9 EC\nEMOJI_FIRE = F9 ED\nEMOJI_WATER = F9 EE\nEMOJI_LEFT_FIST = F9 EF\nEMOJI_RIGHT_FIST = F9 F0\nEMOJI_BIGWHEEL = F9 F1\nEMOJI_SMALLWHEEL = F9 F2\nEMOJI_SPHERE = F9 F3\nEMOJI_IRRITATED = F9 F4\nEMOJI_MISCHIEVOUS = F9 F5\nEMOJI_HAPPY = F9 F6\nEMOJI_ANGRY = F9 F7\nEMOJI_SURPRISED = F9 F8\nEMOJI_BIGSMILE = F9 F9\nEMOJI_EVIL = F9 FA\nEMOJI_TIRED = F9 FB\nEMOJI_NEUTRAL = F9 FC\nEMOJI_SHOCKED = F9 FD\nEMOJI_BIGANGER = F9 FE\n\n'\\l' = FA @ scroll up window text\n'\\p' = FB @ new paragraph\n'\\n' = FE @ new line\n"
  },
  {
    "path": "common_syms/AgbRfu_LinkManager.txt",
    "content": "lman\n"
  },
  {
    "path": "common_syms/agb_flash.txt",
    "content": "gFlashTimeoutFlag\nPollFlashStatus\nWaitForFlashWrite\nProgramFlashSector\ngFlash\nProgramFlashByte\ngFlashNumRemainingBytes\nEraseFlashChip\nEraseFlashSector\ngFlashMaxTime\n"
  },
  {
    "path": "common_syms/battle_anim_special.txt",
    "content": "gMonShrinkDuration\ngMonShrinkDelta\ngMonShrinkDistance\n"
  },
  {
    "path": "common_syms/battle_controller_pokedude.txt",
    "content": "gPokedudeBattlerStates\n"
  },
  {
    "path": "common_syms/battle_main.txt",
    "content": "gPreBattleCallback1\ngBattleMainFunc\ngBattleResults\ngLeveledUpInBattle\ngBattlerControllerFuncs\ngHealthboxSpriteIds\ngMultiUsePlayerCursor\ngNumberOfMovesToChoose\ngBattleControllerData\n"
  },
  {
    "path": "common_syms/berry_fix_program.txt",
    "content": "gMultibootStart\ngMultibootStatus\ngMultibootSize\ngMultibootParam\n"
  },
  {
    "path": "common_syms/bg.txt",
    "content": "gWindowTileAutoAllocEnabled\n"
  },
  {
    "path": "common_syms/cable_club.txt",
    "content": "UnusedVarNeededToMatch\n"
  },
  {
    "path": "common_syms/ereader_screen.txt",
    "content": "gEReaderData\n"
  },
  {
    "path": "common_syms/event_data.txt",
    "content": "gLastQuestLogStoredFlagOrVarIdx\n"
  },
  {
    "path": "common_syms/evolution_scene.txt",
    "content": "gCB2_AfterEvolution\n"
  },
  {
    "path": "common_syms/fame_checker.txt",
    "content": "gFameChecker_ListMenuTemplate\ngIconDescriptionBoxIsOpen\n"
  },
  {
    "path": "common_syms/field_camera.txt",
    "content": "gFieldCamera\ngTotalCameraPixelOffsetY\ngTotalCameraPixelOffsetX\n"
  },
  {
    "path": "common_syms/field_control_avatar.txt",
    "content": "gFieldInputRecord\n"
  },
  {
    "path": "common_syms/field_specials.txt",
    "content": "sFieldSpecialsListMenuTemplate\nsFieldSpecialsListMenuScrollBuffer\n"
  },
  {
    "path": "common_syms/fieldmap.txt",
    "content": "VMap\n"
  },
  {
    "path": "common_syms/help_system.txt",
    "content": "gHelpSystemState\ngHelpContextIdBackup\n"
  },
  {
    "path": "common_syms/help_system_util.txt",
    "content": "gHelpSystemEnabled\n"
  },
  {
    "path": "common_syms/image_processing_effects.txt",
    "content": "gCanvasColumnStart\ngCanvasPixels\ngCanvasRowEnd\ngCanvasHeight\ngCanvasColumnEnd\ngCanvasRowStart\ngCanvasMonPersonality\ngCanvasWidth\ngCanvasPalette\ngCanvasPaletteStart\n"
  },
  {
    "path": "common_syms/librfu_rfu.txt",
    "content": "gRfuSlotStatusUNI\ngRfuSlotStatusNI\ngRfuLinkStatus\ngRfuStatic\ngRfuFixed\n"
  },
  {
    "path": "common_syms/librfu_sio32id.txt",
    "content": "gRfuSIO32Id\n"
  },
  {
    "path": "common_syms/librfu_stwi.txt",
    "content": "gSTWIStatus\n"
  },
  {
    "path": "common_syms/link.txt",
    "content": "gLinkPartnersHeldKeys\ngLinkDebugSeed\ngLocalLinkPlayerBlock\ngLinkErrorOccurred\ngLinkDebugFlags\ngLinkFiller1\ngRemoteLinkPlayersNotReceived\ngBlockReceivedStatus\ngLinkFiller2\ngLinkHeldKeys\ngRecvCmds\ngLinkStatus\ngLinkDummy1\ngLinkDummy2\ngReadyToExitStandby\ngReadyToCloseLink\ngReadyCloseLinkType\ngSuppressLinkErrorMessage\ngWirelessCommType\ngSavedLinkPlayerCount\ngSendCmd\ngSavedMultiplayerId\ngReceivedRemoteLinkPlayers\ngLinkTestBGInfo\ngLinkCallback\ngShouldAdvanceLinkState\ngLinkTestBlockChecksums\ngBlockRequestType\ngLinkFiller3\ngLinkFiller4\ngLinkFiller5\ngLastSendQueueCount\ngLink\ngLastRecvQueueCount\ngLinkSavedIme\n"
  },
  {
    "path": "common_syms/link_rfu_2.txt",
    "content": "gHostRfuGameData\ngRfu\ngHostRfuUsername\n"
  },
  {
    "path": "common_syms/list_menu.txt",
    "content": "gListMenuOverride\ngMultiuseListMenuTemplate\n"
  },
  {
    "path": "common_syms/load_save.txt",
    "content": "gFlashMemoryPresent\ngSaveBlock1Ptr\ngSaveBlock2Ptr\ngPokemonStoragePtr\n"
  },
  {
    "path": "common_syms/m4a.txt",
    "content": "gSoundInfo\ngPokemonCrySongs\ngPokemonCryMusicPlayers\ngMPlayJumpTable\ngCgbChans\ngPokemonCryTracks\ngPokemonCrySong\ngMPlayInfo_BGM\ngMPlayInfo_SE1\ngMPlayInfo_SE2\ngMPlayMemAccArea\ngMPlayInfo_SE3\n"
  },
  {
    "path": "common_syms/main.txt",
    "content": "gKeyRepeatStartDelay\ngLinkTransferringData\ngMain\ngKeyRepeatContinueDelay\ngSoftResetDisabled\ngIntrTable\nsVcountAfterSound\ngLinkVSyncDisabled\nIntrMain_Buffer\nsVcountAtIntr\nsVcountBeforeSound\ngPcmDmaCounter\n"
  },
  {
    "path": "common_syms/overworld.txt",
    "content": "gBGTilemapBuffers1\ngBGTilemapBuffers2\ngBGTilemapBuffers3\ngFieldCallback\ngFieldCallback2\ngHeldKeyCodeToSend\ngLocalLinkPlayerId\ngFieldLinkPlayerCount\n"
  },
  {
    "path": "common_syms/party_menu.txt",
    "content": "gItemUseCB\n"
  },
  {
    "path": "common_syms/quest_log.txt",
    "content": "gQuestLogPlaybackState\nsMaxActionsInScene\ngQuestLogFieldInput\nsCurSceneActions\n"
  },
  {
    "path": "common_syms/random.txt",
    "content": "gRngValue\ngRng2Value"
  },
  {
    "path": "common_syms/save.txt",
    "content": "gLastWrittenSector\ngLastSaveCounter\ngLastKnownGoodSector\ngDamagedSaveSectors\ngSaveCounter\ngSaveDataBufferPtr\ngIncrementalSectorId\ngSaveUnusedVar\ngSaveFileStatus\ngGameContinueCallback\ngRamSaveSectorLocations\ngSaveAttemptStatus\n"
  },
  {
    "path": "common_syms/save_failed_screen.txt",
    "content": "sIsInSaveFailedScreen\n"
  },
  {
    "path": "common_syms/scrcmd.txt",
    "content": "sQuestLogScriptContextPtr\ngSelectedObjectEvent\n"
  },
  {
    "path": "common_syms/sound.txt",
    "content": "gDisableMusic\n"
  },
  {
    "path": "common_syms/sprite.txt",
    "content": "gOamMatrixAllocBitmap\ngReservedSpritePaletteCount\n"
  },
  {
    "path": "common_syms/task.txt",
    "content": "gTasks\n"
  },
  {
    "path": "common_syms/text.txt",
    "content": "gTextFlags\n"
  },
  {
    "path": "common_syms/text_printer.txt",
    "content": "gFonts\ngGlyphInfo\n"
  },
  {
    "path": "common_syms/window.txt",
    "content": "gWindowClearTile\ngWindowBgTilemapBuffers\n"
  },
  {
    "path": "compare.sh",
    "content": "#!/bin/bash\n# Compares baserom.gba and pokefirered.gba\n\n# create baserom_compare.dump if necessary\nif [ ! -f baserom_compare.dump ]; then\n\thexdump -C baserom.gba > baserom_compare.dump # can create an empty baserom_compare.dump if no baserom.gba\nfi\n\nhexdump -C pokefirered.gba > pokefirered_compare.dump\n\ndiff -u baserom_compare.dump pokefirered_compare.dump | less\n"
  },
  {
    "path": "config.mk",
    "content": "# Default variables\n\nGAME_VERSION  ?= FIRERED\nGAME_REVISION ?= 0\nGAME_LANGUAGE ?= ENGLISH\nMODERN        ?= 0\nCOMPARE       ?= 0\n\n# For gbafix\nMAKER_CODE  := 01\n\n# Version\nifeq ($(GAME_VERSION),FIRERED)\nTITLE       := POKEMON FIRE\nGAME_CODE   := BPR\nBUILD_NAME  := firered\nelse\nifeq ($(GAME_VERSION),LEAFGREEN)\nTITLE       := POKEMON LEAF\nGAME_CODE   := BPG\nBUILD_NAME  := leafgreen\nelse\n$(error unknown version $(GAME_VERSION))\nendif\nendif\n\n# Revision\nifeq ($(GAME_REVISION),0)\nBUILD_NAME  := $(BUILD_NAME)\nelse\nifeq ($(GAME_REVISION),1)\nBUILD_NAME  := $(BUILD_NAME)_rev1\nelse\n$(error unknown revision $(GAME_REVISION))\nendif\nendif\n\n# Language\nifeq ($(GAME_LANGUAGE),ENGLISH)\nBUILD_NAME  := $(BUILD_NAME)\nGAME_CODE   := $(GAME_CODE)E\nelse\n$(error unknown language $(GAME_LANGUAGE))\nendif\n\n# Modern GCC\nifeq ($(MODERN), 0)\n  BUILD_NAME := $(BUILD_NAME)\nelse\n  BUILD_NAME := $(BUILD_NAME)_modern\nendif\n"
  },
  {
    "path": "constants/constants.inc",
    "content": "\t.include \"constants/gba_constants.inc\"\n\t.include \"constants/misc_constants.inc\"\n"
  },
  {
    "path": "constants/gba_constants.inc",
    "content": "\t.set PSR_USR_MODE,  0x00000010\n\t.set PSR_FIQ_MODE,  0x00000011\n\t.set PSR_IRQ_MODE,  0x00000012\n\t.set PSR_SVC_MODE,  0x00000013\n\t.set PSR_ABT_MODE,  0x00000017\n\t.set PSR_UND_MODE,  0x0000001b\n\t.set PSR_SYS_MODE,  0x0000001f\n\t.set PSR_MODE_MASK, 0x0000001f\n\t.set PSR_T_BIT,     0x00000020\n\t.set PSR_F_BIT,     0x00000040\n\t.set PSR_I_BIT,     0x00000080\n\n\t.set EWRAM_START, 0x02000000\n\t.set EWRAM_END,   EWRAM_START + 0x40000\n\t.set IWRAM_START, 0x03000000\n\t.set IWRAM_END,   IWRAM_START + 0x8000\n\n\t.set PLTT,     0x5000000\n\t.set BG_PLTT,  PLTT\n\t.set OBJ_PLTT, PLTT + 0x200\n\n\t.set VRAM,      0x6000000\n\t.set BG_VRAM,   VRAM\n\t.set OBJ_VRAM0, VRAM + 0x10000 @ text-mode BG\n\t.set OBJ_VRAM1, VRAM + 0x14000 @ bitmap-mode BG\n\n\t.set OAM, 0x7000000\n\n\t.set SOUND_INFO_PTR, 0x3007FF0\n\t.set INTR_CHECK,     0x3007FF8\n\t.set INTR_VECTOR,    0x3007FFC\n\n\t.set INTR_FLAG_VBLANK,  1 << 0\n\t.set INTR_FLAG_HBLANK,  1 << 1\n\t.set INTR_FLAG_VCOUNT,  1 << 2\n\t.set INTR_FLAG_TIMER0,  1 << 3\n\t.set INTR_FLAG_TIMER1,  1 << 4\n\t.set INTR_FLAG_TIMER2,  1 << 5\n\t.set INTR_FLAG_TIMER3,  1 << 6\n\t.set INTR_FLAG_SERIAL,  1 << 7\n\t.set INTR_FLAG_DMA0,    1 << 8\n\t.set INTR_FLAG_DMA1,    1 << 9\n\t.set INTR_FLAG_DMA2,    1 << 10\n\t.set INTR_FLAG_DMA3,    1 << 11\n\t.set INTR_FLAG_KEYPAD,  1 << 12\n\t.set INTR_FLAG_GAMEPAK, 1 << 13\n\n\t.set VCOUNT_VBLANK, 160\n\t.set TOTAL_SCANLINES, 228\n\n\t.set REG_BASE, 0x4000000 @ I/O register base address\n\n@ I/O register offsets\n\t.set OFFSET_REG_DISPCNT,     0x0\n\t.set OFFSET_REG_DISPSTAT,    0x4\n\t.set OFFSET_REG_VCOUNT,      0x6\n\t.set OFFSET_REG_BG0CNT,      0x8\n\t.set OFFSET_REG_BG1CNT,      0xa\n\t.set OFFSET_REG_BG2CNT,      0xc\n\t.set OFFSET_REG_BG3CNT,      0xe\n\t.set OFFSET_REG_BG0HOFS,     0x10\n\t.set OFFSET_REG_BG0VOFS,     0x12\n\t.set OFFSET_REG_BG1HOFS,     0x14\n\t.set OFFSET_REG_BG1VOFS,     0x16\n\t.set OFFSET_REG_BG2HOFS,     0x18\n\t.set OFFSET_REG_BG2VOFS,     0x1a\n\t.set OFFSET_REG_BG3HOFS,     0x1c\n\t.set OFFSET_REG_BG3VOFS,     0x1e\n\t.set OFFSET_REG_BG2PA,       0x20\n\t.set OFFSET_REG_BG2PB,       0x22\n\t.set OFFSET_REG_BG2PC,       0x24\n\t.set OFFSET_REG_BG2PD,       0x26\n\t.set OFFSET_REG_BG2X_L,      0x28\n\t.set OFFSET_REG_BG2X_H,      0x2a\n\t.set OFFSET_REG_BG2Y_L,      0x2c\n\t.set OFFSET_REG_BG2Y_H,      0x2e\n\t.set OFFSET_REG_BG3PA,       0x30\n\t.set OFFSET_REG_BG3PB,       0x32\n\t.set OFFSET_REG_BG3PC,       0x34\n\t.set OFFSET_REG_BG3PD,       0x36\n\t.set OFFSET_REG_BG3X_L,      0x38\n\t.set OFFSET_REG_BG3X_H,      0x3a\n\t.set OFFSET_REG_BG3Y_L,      0x3c\n\t.set OFFSET_REG_BG3Y_H,      0x3e\n\t.set OFFSET_REG_WIN0H,       0x40\n\t.set OFFSET_REG_WIN1H,       0x42\n\t.set OFFSET_REG_WIN0V,       0x44\n\t.set OFFSET_REG_WIN1V,       0x46\n\t.set OFFSET_REG_WININ,       0x48\n\t.set OFFSET_REG_WINOUT,      0x4a\n\t.set OFFSET_REG_MOSAIC,      0x4c\n\t.set OFFSET_REG_BLDCNT,      0x50\n\t.set OFFSET_REG_BLDALPHA,    0x52\n\t.set OFFSET_REG_BLDY,        0x54\n\n\t.set OFFSET_REG_SOUND1CNT,   0x60\n\t.set OFFSET_REG_SOUND1CNT_L, 0x60\n\t.set OFFSET_REG_NR10,        0x60\n\t.set OFFSET_REG_SOUND1CNT_H, 0x62\n\t.set OFFSET_REG_NR11,        0x62\n\t.set OFFSET_REG_NR12,        0x63\n\t.set OFFSET_REG_SOUND1CNT_X, 0x64\n\t.set OFFSET_REG_NR13,        0x64\n\t.set OFFSET_REG_NR14,        0x65\n\t.set OFFSET_REG_SOUND2CNT,   0x68\n\t.set OFFSET_REG_SOUND2CNT_L, 0x68\n\t.set OFFSET_REG_NR21,        0x68\n\t.set OFFSET_REG_NR22,        0x69\n\t.set OFFSET_REG_SOUND2CNT_H, 0x6c\n\t.set OFFSET_REG_NR23,        0x6c\n\t.set OFFSET_REG_NR24,        0x6d\n\t.set OFFSET_REG_SOUND3CNT,   0x70\n\t.set OFFSET_REG_SOUND3CNT_L, 0x70\n\t.set OFFSET_REG_NR30,        0x70\n\t.set OFFSET_REG_SOUND3CNT_H, 0x72\n\t.set OFFSET_REG_NR31,        0x72\n\t.set OFFSET_REG_NR32,        0x73\n\t.set OFFSET_REG_SOUND3CNT_X, 0x74\n\t.set OFFSET_REG_NR33,        0x74\n\t.set OFFSET_REG_NR34,        0x75\n\t.set OFFSET_REG_SOUND4CNT,   0x78\n\t.set OFFSET_REG_SOUND4CNT_L, 0x78\n\t.set OFFSET_REG_NR41,        0x78\n\t.set OFFSET_REG_NR42,        0x79\n\t.set OFFSET_REG_SOUND4CNT_H, 0x7c\n\t.set OFFSET_REG_NR43,        0x7c\n\t.set OFFSET_REG_NR44,        0x7d\n\t.set OFFSET_REG_SOUNDCNT,    0x80\n\t.set OFFSET_REG_SOUNDCNT_L,  0x80\n\t.set OFFSET_REG_NR50,        0x80\n\t.set OFFSET_REG_NR51,        0x81\n\t.set OFFSET_REG_SOUNDCNT_H,  0x82\n\t.set OFFSET_REG_SOUNDCNT_X,  0x84\n\t.set OFFSET_REG_NR52,        0x84\n\t.set OFFSET_REG_SOUNDBIAS,   0x88\n\t.set OFFSET_REG_WAVE_RAM,    0x90\n\t.set OFFSET_REG_WAVE_RAM0,   0x90\n\t.set OFFSET_REG_WAVE_RAM0_L, 0x90\n\t.set OFFSET_REG_WAVE_RAM0_H, 0x92\n\t.set OFFSET_REG_WAVE_RAM1,   0x94\n\t.set OFFSET_REG_WAVE_RAM1_L, 0x94\n\t.set OFFSET_REG_WAVE_RAM1_H, 0x96\n\t.set OFFSET_REG_WAVE_RAM2,   0x98\n\t.set OFFSET_REG_WAVE_RAM2_L, 0x98\n\t.set OFFSET_REG_WAVE_RAM2_H, 0x9a\n\t.set OFFSET_REG_WAVE_RAM3,   0x9c\n\t.set OFFSET_REG_WAVE_RAM3_L, 0x9c\n\t.set OFFSET_REG_WAVE_RAM3_H, 0x9e\n\t.set OFFSET_REG_FIFO,        0xa0\n\t.set OFFSET_REG_FIFO_A,      0xa0\n\t.set OFFSET_REG_FIFO_A_L,    0xa0\n\t.set OFFSET_REG_FIFO_A_H,    0xa2\n\t.set OFFSET_REG_FIFO_B,      0xa4\n\t.set OFFSET_REG_FIFO_B_L,    0xa4\n\t.set OFFSET_REG_FIFO_B_H,    0xa6\n\n\t.set OFFSET_REG_DMA0,        0xb0\n\t.set OFFSET_REG_DMA0SAD,     0xb0\n\t.set OFFSET_REG_DMA0SAD_L,   0xb0\n\t.set OFFSET_REG_DMA0SAD_H,   0xb2\n\t.set OFFSET_REG_DMA0DAD,     0xb4\n\t.set OFFSET_REG_DMA0DAD_L,   0xb4\n\t.set OFFSET_REG_DMA0DAD_H,   0xb6\n\t.set OFFSET_REG_DMA0CNT,     0xb8\n\t.set OFFSET_REG_DMA0CNT_L,   0xb8\n\t.set OFFSET_REG_DMA0CNT_H,   0xba\n\t.set OFFSET_REG_DMA1,        0xbc\n\t.set OFFSET_REG_DMA1SAD,     0xbc\n\t.set OFFSET_REG_DMA1SAD_L,   0xbc\n\t.set OFFSET_REG_DMA1SAD_H,   0xbe\n\t.set OFFSET_REG_DMA1DAD,     0xc0\n\t.set OFFSET_REG_DMA1DAD_L,   0xc0\n\t.set OFFSET_REG_DMA1DAD_H,   0xc2\n\t.set OFFSET_REG_DMA1CNT,     0xc4\n\t.set OFFSET_REG_DMA1CNT_L,   0xc4\n\t.set OFFSET_REG_DMA1CNT_H,   0xc6\n\t.set OFFSET_REG_DMA2,        0xc8\n\t.set OFFSET_REG_DMA2SAD,     0xc8\n\t.set OFFSET_REG_DMA2SAD_L,   0xc8\n\t.set OFFSET_REG_DMA2SAD_H,   0xca\n\t.set OFFSET_REG_DMA2DAD,     0xcc\n\t.set OFFSET_REG_DMA2DAD_L,   0xcc\n\t.set OFFSET_REG_DMA2DAD_H,   0xce\n\t.set OFFSET_REG_DMA2CNT,     0xd0\n\t.set OFFSET_REG_DMA2CNT_L,   0xd0\n\t.set OFFSET_REG_DMA2CNT_H,   0xd2\n\t.set OFFSET_REG_DMA3,        0xd4\n\t.set OFFSET_REG_DMA3SAD,     0xd4\n\t.set OFFSET_REG_DMA3SAD_L,   0xd4\n\t.set OFFSET_REG_DMA3SAD_H,   0xd6\n\t.set OFFSET_REG_DMA3DAD,     0xd8\n\t.set OFFSET_REG_DMA3DAD_L,   0xd8\n\t.set OFFSET_REG_DMA3DAD_H,   0xda\n\t.set OFFSET_REG_DMA3CNT,     0xdc\n\t.set OFFSET_REG_DMA3CNT_L,   0xdc\n\t.set OFFSET_REG_DMA3CNT_H,   0xde\n\n\t.set OFFSET_REG_TM0CNT,      0x100\n\t.set OFFSET_REG_TM0CNT_L,    0x100\n\t.set OFFSET_REG_TM0CNT_H,    0x102\n\t.set OFFSET_REG_TM1CNT,      0x104\n\t.set OFFSET_REG_TM1CNT_L,    0x104\n\t.set OFFSET_REG_TM1CNT_H,    0x106\n\t.set OFFSET_REG_TM2CNT,      0x108\n\t.set OFFSET_REG_TM2CNT_L,    0x108\n\t.set OFFSET_REG_TM2CNT_H,    0x10a\n\t.set OFFSET_REG_TM3CNT,      0x10c\n\t.set OFFSET_REG_TM3CNT_L,    0x10c\n\t.set OFFSET_REG_TM3CNT_H,    0x10e\n\n\t.set OFFSET_REG_SIOCNT,      0x128\n\t.set OFFSET_REG_SIODATA8,    0x12a\n\t.set OFFSET_REG_SIODATA32,   0x120\n\t.set OFFSET_REG_SIOMLT_SEND, 0x12a\n\t.set OFFSET_REG_SIOMLT_RECV, 0x120\n\t.set OFFSET_REG_SIOMULTI0,   0x120\n\t.set OFFSET_REG_SIOMULTI1,   0x122\n\t.set OFFSET_REG_SIOMULTI2,   0x124\n\t.set OFFSET_REG_SIOMULTI3,   0x126\n\n\t.set OFFSET_REG_KEYINPUT,    0x130\n\t.set OFFSET_REG_KEYCNT,      0x132\n\n\t.set OFFSET_REG_RCNT,        0x134\n\n\t.set OFFSET_REG_JOYCNT,      0x140\n\t.set OFFSET_REG_JOYSTAT,     0x158\n\t.set OFFSET_REG_JOY_RECV,    0x150\n\t.set OFFSET_REG_JOY_RECV_L,  0x150\n\t.set OFFSET_REG_JOY_RECV_H,  0x152\n\t.set OFFSET_REG_JOY_TRANS,   0x154\n\t.set OFFSET_REG_JOY_TRANS_L, 0x154\n\t.set OFFSET_REG_JOY_TRANS_H, 0x156\n\n\t.set OFFSET_REG_IME,         0x208\n\t.set OFFSET_REG_IE,          0x200\n\t.set OFFSET_REG_IF,          0x202\n\n\t.set OFFSET_REG_WAITCNT,     0x204\n\n@ I/O register addresses\n\t.set REG_DISPCNT,     REG_BASE + OFFSET_REG_DISPCNT\n\t.set REG_DISPSTAT,    REG_BASE + OFFSET_REG_DISPSTAT\n\t.set REG_VCOUNT,      REG_BASE + OFFSET_REG_VCOUNT\n\t.set REG_BG0CNT,      REG_BASE + OFFSET_REG_BG0CNT\n\t.set REG_BG1CNT,      REG_BASE + OFFSET_REG_BG1CNT\n\t.set REG_BG2CNT,      REG_BASE + OFFSET_REG_BG2CNT\n\t.set REG_BG3CNT,      REG_BASE + OFFSET_REG_BG3CNT\n\t.set REG_BG0HOFS,     REG_BASE + OFFSET_REG_BG0HOFS\n\t.set REG_BG0VOFS,     REG_BASE + OFFSET_REG_BG0VOFS\n\t.set REG_BG1HOFS,     REG_BASE + OFFSET_REG_BG1HOFS\n\t.set REG_BG1VOFS,     REG_BASE + OFFSET_REG_BG1VOFS\n\t.set REG_BG2HOFS,     REG_BASE + OFFSET_REG_BG2HOFS\n\t.set REG_BG2VOFS,     REG_BASE + OFFSET_REG_BG2VOFS\n\t.set REG_BG3HOFS,     REG_BASE + OFFSET_REG_BG3HOFS\n\t.set REG_BG3VOFS,     REG_BASE + OFFSET_REG_BG3VOFS\n\t.set REG_BG2PA,       REG_BASE + OFFSET_REG_BG2PA\n\t.set REG_BG2PB,       REG_BASE + OFFSET_REG_BG2PB\n\t.set REG_BG2PC,       REG_BASE + OFFSET_REG_BG2PC\n\t.set REG_BG2PD,       REG_BASE + OFFSET_REG_BG2PD\n\t.set REG_BG2X_L,      REG_BASE + OFFSET_REG_BG2X_L\n\t.set REG_BG2X_H,      REG_BASE + OFFSET_REG_BG2X_H\n\t.set REG_BG2Y_L,      REG_BASE + OFFSET_REG_BG2Y_L\n\t.set REG_BG2Y_H,      REG_BASE + OFFSET_REG_BG2Y_H\n\t.set REG_BG3PA,       REG_BASE + OFFSET_REG_BG3PA\n\t.set REG_BG3PB,       REG_BASE + OFFSET_REG_BG3PB\n\t.set REG_BG3PC,       REG_BASE + OFFSET_REG_BG3PC\n\t.set REG_BG3PD,       REG_BASE + OFFSET_REG_BG3PD\n\t.set REG_BG3X_L,      REG_BASE + OFFSET_REG_BG3X_L\n\t.set REG_BG3X_H,      REG_BASE + OFFSET_REG_BG3X_H\n\t.set REG_BG3Y_L,      REG_BASE + OFFSET_REG_BG3Y_L\n\t.set REG_BG3Y_H,      REG_BASE + OFFSET_REG_BG3Y_H\n\t.set REG_WIN0H,       REG_BASE + OFFSET_REG_WIN0H\n\t.set REG_WIN1H,       REG_BASE + OFFSET_REG_WIN1H\n\t.set REG_WIN0V,       REG_BASE + OFFSET_REG_WIN0V\n\t.set REG_WIN1V,       REG_BASE + OFFSET_REG_WIN1V\n\t.set REG_WININ,       REG_BASE + OFFSET_REG_WININ\n\t.set REG_WINOUT,      REG_BASE + OFFSET_REG_WINOUT\n\t.set REG_MOSAIC,      REG_BASE + OFFSET_REG_MOSAIC\n\t.set REG_BLDCNT,      REG_BASE + OFFSET_REG_BLDCNT\n\t.set REG_BLDALPHA,    REG_BASE + OFFSET_REG_BLDALPHA\n\t.set REG_BLDY,        REG_BASE + OFFSET_REG_BLDY\n\n\t.set REG_SOUND1CNT,   REG_BASE + OFFSET_REG_SOUND1CNT\n\t.set REG_SOUND1CNT_L, REG_BASE + OFFSET_REG_SOUND1CNT_L\n\t.set REG_NR10,        REG_BASE + OFFSET_REG_NR10\n\t.set REG_SOUND1CNT_H, REG_BASE + OFFSET_REG_SOUND1CNT_H\n\t.set REG_NR11,        REG_BASE + OFFSET_REG_NR11\n\t.set REG_NR12,        REG_BASE + OFFSET_REG_NR12\n\t.set REG_SOUND1CNT_X, REG_BASE + OFFSET_REG_SOUND1CNT_X\n\t.set REG_NR13,        REG_BASE + OFFSET_REG_NR13\n\t.set REG_NR14,        REG_BASE + OFFSET_REG_NR14\n\t.set REG_SOUND2CNT,   REG_BASE + OFFSET_REG_SOUND2CNT\n\t.set REG_SOUND2CNT_L, REG_BASE + OFFSET_REG_SOUND2CNT_L\n\t.set REG_NR21,        REG_BASE + OFFSET_REG_NR21\n\t.set REG_NR22,        REG_BASE + OFFSET_REG_NR22\n\t.set REG_SOUND2CNT_H, REG_BASE + OFFSET_REG_SOUND2CNT_H\n\t.set REG_NR23,        REG_BASE + OFFSET_REG_NR23\n\t.set REG_NR24,        REG_BASE + OFFSET_REG_NR24\n\t.set REG_SOUND3CNT,   REG_BASE + OFFSET_REG_SOUND3CNT\n\t.set REG_SOUND3CNT_L, REG_BASE + OFFSET_REG_SOUND3CNT_L\n\t.set REG_NR30,        REG_BASE + OFFSET_REG_NR30\n\t.set REG_SOUND3CNT_H, REG_BASE + OFFSET_REG_SOUND3CNT_H\n\t.set REG_NR31,        REG_BASE + OFFSET_REG_NR31\n\t.set REG_NR32,        REG_BASE + OFFSET_REG_NR32\n\t.set REG_SOUND3CNT_X, REG_BASE + OFFSET_REG_SOUND3CNT_X\n\t.set REG_NR33,        REG_BASE + OFFSET_REG_NR33\n\t.set REG_NR34,        REG_BASE + OFFSET_REG_NR34\n\t.set REG_SOUND4CNT,   REG_BASE + OFFSET_REG_SOUND4CNT\n\t.set REG_SOUND4CNT_L, REG_BASE + OFFSET_REG_SOUND4CNT_L\n\t.set REG_NR41,        REG_BASE + OFFSET_REG_NR41\n\t.set REG_NR42,        REG_BASE + OFFSET_REG_NR42\n\t.set REG_SOUND4CNT_H, REG_BASE + OFFSET_REG_SOUND4CNT_H\n\t.set REG_NR43,        REG_BASE + OFFSET_REG_NR43\n\t.set REG_NR44,        REG_BASE + OFFSET_REG_NR44\n\t.set REG_SOUNDCNT,    REG_BASE + OFFSET_REG_SOUNDCNT\n\t.set REG_SOUNDCNT_L,  REG_BASE + OFFSET_REG_SOUNDCNT_L\n\t.set REG_NR50,        REG_BASE + OFFSET_REG_NR50\n\t.set REG_NR51,        REG_BASE + OFFSET_REG_NR51\n\t.set REG_SOUNDCNT_H,  REG_BASE + OFFSET_REG_SOUNDCNT_H\n\t.set REG_SOUNDCNT_X,  REG_BASE + OFFSET_REG_SOUNDCNT_X\n\t.set REG_NR52,        REG_BASE + OFFSET_REG_NR52\n\t.set REG_SOUNDBIAS,   REG_BASE + OFFSET_REG_SOUNDBIAS\n\t.set REG_WAVE_RAM,    REG_BASE + OFFSET_REG_WAVE_RAM\n\t.set REG_WAVE_RAM0,   REG_BASE + OFFSET_REG_WAVE_RAM0\n\t.set REG_WAVE_RAM0_L, REG_BASE + OFFSET_REG_WAVE_RAM0_L\n\t.set REG_WAVE_RAM0_H, REG_BASE + OFFSET_REG_WAVE_RAM0_H\n\t.set REG_WAVE_RAM1,   REG_BASE + OFFSET_REG_WAVE_RAM1\n\t.set REG_WAVE_RAM1_L, REG_BASE + OFFSET_REG_WAVE_RAM1_L\n\t.set REG_WAVE_RAM1_H, REG_BASE + OFFSET_REG_WAVE_RAM1_H\n\t.set REG_WAVE_RAM2,   REG_BASE + OFFSET_REG_WAVE_RAM2\n\t.set REG_WAVE_RAM2_L, REG_BASE + OFFSET_REG_WAVE_RAM2_L\n\t.set REG_WAVE_RAM2_H, REG_BASE + OFFSET_REG_WAVE_RAM2_H\n\t.set REG_WAVE_RAM3,   REG_BASE + OFFSET_REG_WAVE_RAM3\n\t.set REG_WAVE_RAM3_L, REG_BASE + OFFSET_REG_WAVE_RAM3_L\n\t.set REG_WAVE_RAM3_H, REG_BASE + OFFSET_REG_WAVE_RAM3_H\n\t.set REG_FIFO,        REG_BASE + OFFSET_REG_FIFO\n\t.set REG_FIFO_A,      REG_BASE + OFFSET_REG_FIFO_A\n\t.set REG_FIFO_A_L,    REG_BASE + OFFSET_REG_FIFO_A_L\n\t.set REG_FIFO_A_H,    REG_BASE + OFFSET_REG_FIFO_A_H\n\t.set REG_FIFO_B,      REG_BASE + OFFSET_REG_FIFO_B\n\t.set REG_FIFO_B_L,    REG_BASE + OFFSET_REG_FIFO_B_L\n\t.set REG_FIFO_B_H,    REG_BASE + OFFSET_REG_FIFO_B_H\n\n\t.set REG_DMA0,        REG_BASE + OFFSET_REG_DMA0\n\t.set REG_DMA0SAD,     REG_BASE + OFFSET_REG_DMA0SAD\n\t.set REG_DMA0SAD_L,   REG_BASE + OFFSET_REG_DMA0SAD_L\n\t.set REG_DMA0SAD_H,   REG_BASE + OFFSET_REG_DMA0SAD_H\n\t.set REG_DMA0DAD,     REG_BASE + OFFSET_REG_DMA0DAD\n\t.set REG_DMA0DAD_L,   REG_BASE + OFFSET_REG_DMA0DAD_L\n\t.set REG_DMA0DAD_H,   REG_BASE + OFFSET_REG_DMA0DAD_H\n\t.set REG_DMA0CNT,     REG_BASE + OFFSET_REG_DMA0CNT\n\t.set REG_DMA0CNT_L,   REG_BASE + OFFSET_REG_DMA0CNT_L\n\t.set REG_DMA0CNT_H,   REG_BASE + OFFSET_REG_DMA0CNT_H\n\t.set REG_DMA1,        REG_BASE + OFFSET_REG_DMA1\n\t.set REG_DMA1SAD,     REG_BASE + OFFSET_REG_DMA1SAD\n\t.set REG_DMA1SAD_L,   REG_BASE + OFFSET_REG_DMA1SAD_L\n\t.set REG_DMA1SAD_H,   REG_BASE + OFFSET_REG_DMA1SAD_H\n\t.set REG_DMA1DAD,     REG_BASE + OFFSET_REG_DMA1DAD\n\t.set REG_DMA1DAD_L,   REG_BASE + OFFSET_REG_DMA1DAD_L\n\t.set REG_DMA1DAD_H,   REG_BASE + OFFSET_REG_DMA1DAD_H\n\t.set REG_DMA1CNT,     REG_BASE + OFFSET_REG_DMA1CNT\n\t.set REG_DMA1CNT_L,   REG_BASE + OFFSET_REG_DMA1CNT_L\n\t.set REG_DMA1CNT_H,   REG_BASE + OFFSET_REG_DMA1CNT_H\n\t.set REG_DMA2,        REG_BASE + OFFSET_REG_DMA2\n\t.set REG_DMA2SAD,     REG_BASE + OFFSET_REG_DMA2SAD\n\t.set REG_DMA2SAD_L,   REG_BASE + OFFSET_REG_DMA2SAD_L\n\t.set REG_DMA2SAD_H,   REG_BASE + OFFSET_REG_DMA2SAD_H\n\t.set REG_DMA2DAD,     REG_BASE + OFFSET_REG_DMA2DAD\n\t.set REG_DMA2DAD_L,   REG_BASE + OFFSET_REG_DMA2DAD_L\n\t.set REG_DMA2DAD_H,   REG_BASE + OFFSET_REG_DMA2DAD_H\n\t.set REG_DMA2CNT,     REG_BASE + OFFSET_REG_DMA2CNT\n\t.set REG_DMA2CNT_L,   REG_BASE + OFFSET_REG_DMA2CNT_L\n\t.set REG_DMA2CNT_H,   REG_BASE + OFFSET_REG_DMA2CNT_H\n\t.set REG_DMA3,        REG_BASE + OFFSET_REG_DMA3\n\t.set REG_DMA3SAD,     REG_BASE + OFFSET_REG_DMA3SAD\n\t.set REG_DMA3SAD_L,   REG_BASE + OFFSET_REG_DMA3SAD_L\n\t.set REG_DMA3SAD_H,   REG_BASE + OFFSET_REG_DMA3SAD_H\n\t.set REG_DMA3DAD,     REG_BASE + OFFSET_REG_DMA3DAD\n\t.set REG_DMA3DAD_L,   REG_BASE + OFFSET_REG_DMA3DAD_L\n\t.set REG_DMA3DAD_H,   REG_BASE + OFFSET_REG_DMA3DAD_H\n\t.set REG_DMA3CNT,     REG_BASE + OFFSET_REG_DMA3CNT\n\t.set REG_DMA3CNT_L,   REG_BASE + OFFSET_REG_DMA3CNT_L\n\t.set REG_DMA3CNT_H,   REG_BASE + OFFSET_REG_DMA3CNT_H\n\n\t.set REG_TM0CNT,      REG_BASE + OFFSET_REG_TM0CNT\n\t.set REG_TM0CNT_L,    REG_BASE + OFFSET_REG_TM0CNT_L\n\t.set REG_TM0CNT_H,    REG_BASE + OFFSET_REG_TM0CNT_H\n\t.set REG_TM1CNT,      REG_BASE + OFFSET_REG_TM1CNT\n\t.set REG_TM1CNT_L,    REG_BASE + OFFSET_REG_TM1CNT_L\n\t.set REG_TM1CNT_H,    REG_BASE + OFFSET_REG_TM1CNT_H\n\t.set REG_TM2CNT,      REG_BASE + OFFSET_REG_TM2CNT\n\t.set REG_TM2CNT_L,    REG_BASE + OFFSET_REG_TM2CNT_L\n\t.set REG_TM2CNT_H,    REG_BASE + OFFSET_REG_TM2CNT_H\n\t.set REG_TM3CNT,      REG_BASE + OFFSET_REG_TM3CNT\n\t.set REG_TM3CNT_L,    REG_BASE + OFFSET_REG_TM3CNT_L\n\t.set REG_TM3CNT_H,    REG_BASE + OFFSET_REG_TM3CNT_H\n\n\t.set REG_SIOCNT,      REG_BASE + OFFSET_REG_SIOCNT\n\t.set REG_SIODATA8,    REG_BASE + OFFSET_REG_SIODATA8\n\t.set REG_SIODATA32,   REG_BASE + OFFSET_REG_SIODATA32\n\t.set REG_SIOMLT_SEND, REG_BASE + OFFSET_REG_SIOMLT_SEND\n\t.set REG_SIOMLT_RECV, REG_BASE + OFFSET_REG_SIOMLT_RECV\n\t.set REG_SIOMULTI0,   REG_BASE + OFFSET_REG_SIOMULTI0\n\t.set REG_SIOMULTI1,   REG_BASE + OFFSET_REG_SIOMULTI1\n\t.set REG_SIOMULTI2,   REG_BASE + OFFSET_REG_SIOMULTI2\n\t.set REG_SIOMULTI3,   REG_BASE + OFFSET_REG_SIOMULTI3\n\n\t.set REG_KEYINPUT,    REG_BASE + OFFSET_REG_KEYINPUT\n\t.set REG_KEYCNT,      REG_BASE + OFFSET_REG_KEYCNT\n\n\t.set REG_RCNT,        REG_BASE + OFFSET_REG_RCNT\n\n\t.set REG_JOYCNT,      REG_BASE + OFFSET_REG_JOYCNT\n\t.set REG_JOYSTAT,     REG_BASE + OFFSET_REG_JOYSTAT\n\t.set REG_JOY_RECV,    REG_BASE + OFFSET_REG_JOY_RECV\n\t.set REG_JOY_RECV_L,  REG_BASE + OFFSET_REG_JOY_RECV_L\n\t.set REG_JOY_RECV_H,  REG_BASE + OFFSET_REG_JOY_RECV_H\n\t.set REG_JOY_TRANS,   REG_BASE + OFFSET_REG_JOY_TRANS\n\t.set REG_JOY_TRANS_L, REG_BASE + OFFSET_REG_JOY_TRANS_L\n\t.set REG_JOY_TRANS_H, REG_BASE + OFFSET_REG_JOY_TRANS_H\n\n\t.set REG_IME,         REG_BASE + OFFSET_REG_IME\n\t.set REG_IE,          REG_BASE + OFFSET_REG_IE\n\t.set REG_IF,          REG_BASE + OFFSET_REG_IF\n\n\t.set REG_WAITCNT,     REG_BASE + OFFSET_REG_WAITCNT\n\n@ DMA register constants\n\n\t.set DMA_DEST_INC,      0x0000\n\t.set DMA_DEST_DEC,      0x0020\n\t.set DMA_DEST_FIXED,    0x0040\n\t.set DMA_DEST_RELOAD,   0x0060\n\t.set DMA_SRC_INC,       0x0000\n\t.set DMA_SRC_DEC,       0x0080\n\t.set DMA_SRC_FIXED,     0x0100\n\t.set DMA_REPEAT,        0x0200\n\t.set DMA_16BIT,         0x0000\n\t.set DMA_32BIT,         0x0400\n\t.set DMA_DREQ_ON,       0x0800\n\t.set DMA_START_NOW,     0x0000\n\t.set DMA_START_VBLANK,  0x1000\n\t.set DMA_START_HBLANK,  0x2000\n\t.set DMA_START_SPECIAL, 0x3000\n\t.set DMA_INTR_ENABLE,   0x4000\n\t.set DMA_ENABLE,        0x8000\n\n@ OAM attribute constants\n\n\t.set OAM_OBJ_NORMAL,         0x00000000\n\t.set OAM_OBJ_BLEND,          0x00000400\n\t.set OAM_OBJ_WINDOW,         0x00000800\n\n\t.set OAM_AFFINE_NONE,        0x00000000\n\t.set OAM_AFFINE_NORMAL_SIZE, 0x00000100\n\t.set OAM_OBJ_DISABLED,       0x00000200\n\t.set OAM_AFFINE_DOUBLE_SIZE, 0x00000300\n\n\t.set OAM_MOSAIC_OFF,         0x00000000\n\t.set OAM_MOSAIC_ON,          0x00001000\n\n\t.set OAM_4BPP,               0x00000000\n\t.set OAM_8BPP,               0x00002000\n\n\t.set OAM_H_FLIP,             0x10000000\n\t.set OAM_V_FLIP,             0x20000000\n\n\t.set OAM_SQUARE,             0x00000000\n\t.set OAM_H_RECTANGLE,        0x00004000\n\t.set OAM_V_RECTANGLE,        0x00008000\n\t.set OAM_SIZE_0,             0x00000000\n\t.set OAM_SIZE_1,             0x40000000\n\t.set OAM_SIZE_2,             0x80000000\n\t.set OAM_SIZE_3,             0xc0000000\n\n\t.set OAM_SIZE_8x8,           OAM_SIZE_0 | OAM_SQUARE\n\t.set OAM_SIZE_16x16,         OAM_SIZE_1 | OAM_SQUARE\n\t.set OAM_SIZE_32x32,         OAM_SIZE_2 | OAM_SQUARE\n\t.set OAM_SIZE_64x64,         OAM_SIZE_3 | OAM_SQUARE\n\n\t.set OAM_SIZE_16x8,          OAM_SIZE_0 | OAM_H_RECTANGLE\n\t.set OAM_SIZE_32x8,          OAM_SIZE_1 | OAM_H_RECTANGLE\n\t.set OAM_SIZE_32x16,         OAM_SIZE_2 | OAM_H_RECTANGLE\n\t.set OAM_SIZE_64x32,         OAM_SIZE_3 | OAM_H_RECTANGLE\n\n\t.set OAM_SIZE_8x16,          OAM_SIZE_0 | OAM_V_RECTANGLE\n\t.set OAM_SIZE_8x32,          OAM_SIZE_1 | OAM_V_RECTANGLE\n\t.set OAM_SIZE_16x32,         OAM_SIZE_2 | OAM_V_RECTANGLE\n\t.set OAM_SIZE_32x64,         OAM_SIZE_3 | OAM_V_RECTANGLE\n\n@ BLDCNT\n\n\t.set BLDCNT_TGT1_BG0,       1 << 0\n\t.set BLDCNT_TGT1_BG1,       1 << 1\n\t.set BLDCNT_TGT1_BG2,       1 << 2\n\t.set BLDCNT_TGT1_BG3,       1 << 3\n\t.set BLDCNT_TGT1_OBJ,       1 << 4\n\t.set BLDCNT_TGT1_BD,        1 << 5\n\t.set BLDCNT_TGT1_ALL,       BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD\n\n\t.set BLDCNT_EFFECT_NONE,    0 << 6\n\t.set BLDCNT_EFFECT_BLEND,   1 << 6\n\t.set BLDCNT_EFFECT_LIGHTEN, 2 << 6\n\t.set BLDCNT_EFFECT_DARKEN,  3 << 6\n\n\t.set BLDCNT_TGT2_BG0,       1 << 8\n\t.set BLDCNT_TGT2_BG1,       1 << 9\n\t.set BLDCNT_TGT2_BG2,       1 << 10\n\t.set BLDCNT_TGT2_BG3,       1 << 11\n\t.set BLDCNT_TGT2_OBJ,       1 << 12\n\t.set BLDCNT_TGT2_BD,        1 << 13\n\t.set BLDCNT_TGT2_ALL,       BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD\n"
  },
  {
    "path": "constants/m4a_constants.inc",
    "content": "\t.equiv ID_NUMBER, 0x68736d53\n\n\t.equiv PCM_DMA_BUF_SIZE, 1584\n\t.equiv MAX_DIRECTSOUND_CHANNELS, 12\n\n\t.equiv C_V, 0x40\n\n\t.equiv TONEDATA_TYPE_CGB, 0x07\n\t.equiv TONEDATA_TYPE_FIX, 0x08\n\t.equiv TONEDATA_TYPE_REV, 0x10\n\t.equiv TONEDATA_TYPE_CMP, 0x20\n\t.equiv TONEDATA_TYPE_SPL, 0x40 @ key split\n\t.equiv TONEDATA_TYPE_RHY, 0x80 @ rhythm\n\n\t.equiv TONEDATA_P_S_PAN,  0xc0\n\n\t.equiv SOUND_CHANNEL_SF_START,       0x80\n\t.equiv SOUND_CHANNEL_SF_STOP,        0x40\n\t.equiv SOUND_CHANNEL_SF_SPECIAL,     0x20\n\t.equiv SOUND_CHANNEL_SF_LOOP,        0x10\n\t.equiv SOUND_CHANNEL_SF_IEC,         0x04\n\t.equiv SOUND_CHANNEL_SF_ENV,         0x03\n\t.equiv SOUND_CHANNEL_SF_ENV_ATTACK,  0x03\n\t.equiv SOUND_CHANNEL_SF_ENV_DECAY,   0x02\n\t.equiv SOUND_CHANNEL_SF_ENV_SUSTAIN, 0x01\n\t.equiv SOUND_CHANNEL_SF_ENV_RELEASE, 0x00\n\t.equiv SOUND_CHANNEL_SF_ON, (SOUND_CHANNEL_SF_START | SOUND_CHANNEL_SF_STOP | SOUND_CHANNEL_SF_IEC | SOUND_CHANNEL_SF_ENV)\n\n\t.equiv CGB_CHANNEL_MO_PIT, 0x02\n\t.equiv CGB_CHANNEL_MO_VOL, 0x01\n\n\t.equiv WAVE_DATA_FLAG_LOOP, 0xC0\n\n\t.equiv MPT_FLG_VOLSET, 0x01\n\t.equiv MPT_FLG_VOLCHG, 0x03\n\t.equiv MPT_FLG_PITSET, 0x04\n\t.equiv MPT_FLG_PITCHG, 0x0C\n\t.equiv MPT_FLG_START,  0x40\n\t.equiv MPT_FLG_EXIST,  0x80\n\n\t.macro struct_begin\n\t.struct 0\n\t.endm\n\n\t.macro struct_field name, size\n\\name:\n\t.struct \\name + \\size\n\t.endm\n\n\tstruct_begin\n\tstruct_field o_WaveData_type, 2\n\tstruct_field o_WaveData_d1, 1\n\tstruct_field o_WaveData_flags, 1\n\tstruct_field o_WaveData_freq, 4\n\tstruct_field o_WaveData_loopStart, 4\n\tstruct_field o_WaveData_size, 4\n\tstruct_field o_WaveData_data, 0\n\tstruct_field WaveData_size, 0\n\n\tstruct_begin\n\tstruct_field o_ToneData_type, 1\n\tstruct_field o_ToneData_key, 1\n\tstruct_field o_ToneData_length, 1\n\tstruct_field o_ToneData_pan_sweep, 1\n\tstruct_field o_ToneData_wav, 4\n\tstruct_field o_ToneData_attack, 1\n\tstruct_field o_ToneData_decay, 1\n\tstruct_field o_ToneData_sustain, 1\n\tstruct_field o_ToneData_release, 1\n\tstruct_field ToneData_size, 0\n\n\tstruct_begin\n\tstruct_field o_SoundInfo_ident, 4\n\tstruct_field o_SoundInfo_pcmDmaCounter, 1\n\tstruct_field o_SoundInfo_reverb, 1\n\tstruct_field o_SoundInfo_maxChans, 1\n\tstruct_field o_SoundInfo_masterVolume, 1\n\tstruct_field o_SoundInfo_freq, 1\n\tstruct_field o_SoundInfo_mode, 1\n\tstruct_field o_SoundInfo_c15, 1\n\tstruct_field o_SoundInfo_pcmDmaPeriod, 1\n\tstruct_field o_SoundInfo_maxLines, 1\n\tstruct_field o_SoundInfo_gap, 3\n\tstruct_field o_SoundInfo_pcmSamplesPerVBlank, 4\n\tstruct_field o_SoundInfo_pcmFreq, 4\n\tstruct_field o_SoundInfo_divFreq, 4\n\tstruct_field o_SoundInfo_cgbChans, 4\n\tstruct_field o_SoundInfo_MPlayMainHead, 4\n\tstruct_field o_SoundInfo_musicPlayerHead, 4\n\tstruct_field o_SoundInfo_CgbSound, 4\n\tstruct_field o_SoundInfo_CgbOscOff, 4\n\tstruct_field o_SoundInfo_MidiKeyToCgbFreq, 4\n\tstruct_field o_SoundInfo_MPlayJumpTable, 4\n\tstruct_field o_SoundInfo_plynote, 4\n\tstruct_field o_SoundInfo_ExtVolPit, 4\n\tstruct_field o_SoundInfo_gap2, 16\n\tstruct_field o_SoundInfo_chans, MAX_DIRECTSOUND_CHANNELS * 64\n\tstruct_field o_SoundInfo_pcmBuffer, PCM_DMA_BUF_SIZE * 2\n\tstruct_field SoundInfo_size, 0\n\n\tstruct_begin\n\tstruct_field o_SoundChannel_statusFlags, 1\n\tstruct_field o_SoundChannel_type, 1\n\tstruct_field o_SoundChannel_rightVolume, 1\n\tstruct_field o_SoundChannel_leftVolume, 1\n\tstruct_field o_SoundChannel_attack, 1\n\tstruct_field o_SoundChannel_decay, 1\n\tstruct_field o_SoundChannel_sustain, 1\n\tstruct_field o_SoundChannel_release, 1\n\tstruct_field o_SoundChannel_key, 1\n\tstruct_field o_SoundChannel_envelopeVolume, 1\n\tstruct_field o_SoundChannel_envelopeVolumeRight, 1\n\tstruct_field o_SoundChannel_envelopeVolumeLeft, 1\n\tstruct_field o_SoundChannel_pseudoEchoVolume, 1\n\tstruct_field o_SoundChannel_pseudoEchoLength, 1\n\tstruct_field o_SoundChannel_dummy1, 1\n\tstruct_field o_SoundChannel_dummy2, 1\n\tstruct_field o_SoundChannel_gateTime, 1\n\tstruct_field o_SoundChannel_midiKey, 1\n\tstruct_field o_SoundChannel_velocity, 1\n\tstruct_field o_SoundChannel_priority, 1\n\tstruct_field o_SoundChannel_rhythmPan, 1\n\tstruct_field o_SoundChannel_dummy3, 3\n\tstruct_field o_SoundChannel_count, 4\n\tstruct_field o_SoundChannel_fw, 4\n\tstruct_field o_SoundChannel_frequency, 4\n\tstruct_field o_SoundChannel_wav, 4\n\tstruct_field o_SoundChannel_currentPointer, 4\n\tstruct_field o_SoundChannel_track, 4\n\tstruct_field o_SoundChannel_prevChannelPointer, 4\n\tstruct_field o_SoundChannel_nextChannelPointer, 4\n\tstruct_field o_SoundChannel_dummy4, 4\n\tstruct_field o_SoundChannel_xpi, 2\n\tstruct_field o_SoundChannel_xpc, 2\n\tstruct_field SoundChannel_size, 0\n\n\tstruct_begin\n\tstruct_field o_MusicPlayerTrack_flags, 1\n\tstruct_field o_MusicPlayerTrack_wait, 1\n\tstruct_field o_MusicPlayerTrack_patternLevel, 1\n\tstruct_field o_MusicPlayerTrack_repN, 1\n\tstruct_field o_MusicPlayerTrack_gateTime, 1\n\tstruct_field o_MusicPlayerTrack_key, 1\n\tstruct_field o_MusicPlayerTrack_velocity, 1\n\tstruct_field o_MusicPlayerTrack_runningStatus, 1\n\tstruct_field o_MusicPlayerTrack_keyM, 1\n\tstruct_field o_MusicPlayerTrack_pitM, 1\n\tstruct_field o_MusicPlayerTrack_keyShift, 1\n\tstruct_field o_MusicPlayerTrack_keyShiftX, 1\n\tstruct_field o_MusicPlayerTrack_tune, 1\n\tstruct_field o_MusicPlayerTrack_pitX, 1\n\tstruct_field o_MusicPlayerTrack_bend, 1\n\tstruct_field o_MusicPlayerTrack_bendRange, 1\n\tstruct_field o_MusicPlayerTrack_volMR, 1\n\tstruct_field o_MusicPlayerTrack_volML, 1\n\tstruct_field o_MusicPlayerTrack_vol, 1\n\tstruct_field o_MusicPlayerTrack_volX, 1\n\tstruct_field o_MusicPlayerTrack_pan, 1\n\tstruct_field o_MusicPlayerTrack_panX, 1\n\tstruct_field o_MusicPlayerTrack_modM, 1\n\tstruct_field o_MusicPlayerTrack_mod, 1\n\tstruct_field o_MusicPlayerTrack_modT, 1\n\tstruct_field o_MusicPlayerTrack_lfoSpeed, 1\n\tstruct_field o_MusicPlayerTrack_lfoSpeedC, 1\n\tstruct_field o_MusicPlayerTrack_lfoDelay, 1\n\tstruct_field o_MusicPlayerTrack_lfoDelayC, 1\n\tstruct_field o_MusicPlayerTrack_priority, 1\n\tstruct_field o_MusicPlayerTrack_pseudoEchoVolume, 1\n\tstruct_field o_MusicPlayerTrack_pseudoEchoLength, 1\n\tstruct_field o_MusicPlayerTrack_chan, 4\n\tstruct_field o_MusicPlayerTrack_ToneData_type, 1\n\tstruct_field o_MusicPlayerTrack_ToneData_key, 1\n\tstruct_field o_MusicPlayerTrack_ToneData_length, 1\n\tstruct_field o_MusicPlayerTrack_ToneData_pan_sweep, 1\n\tstruct_field o_MusicPlayerTrack_ToneData_wav, 4\n\tstruct_field o_MusicPlayerTrack_ToneData_attack, 1\n\tstruct_field o_MusicPlayerTrack_ToneData_decay, 1\n\tstruct_field o_MusicPlayerTrack_ToneData_sustain, 1\n\tstruct_field o_MusicPlayerTrack_ToneData_release, 1\n\tstruct_field o_MusicPlayerTrack_gap, 10\n\tstruct_field o_MusicPlayerTrack_unk_3A, 2\n\tstruct_field o_MusicPlayerTrack_unk_3C, 4\n\tstruct_field o_MusicPlayerTrack_cmdPtr, 4\n\tstruct_field o_MusicPlayerTrack_patternStack, 12\n\tstruct_field MusicPlayerTrack_size, 0\n\n\t.equiv o_MusicPlayerTrack_ToneData_keySplitTable, o_MusicPlayerTrack_ToneData_attack\n\n\tstruct_begin\n\tstruct_field o_MusicPlayerInfo_songHeader, 4\n\tstruct_field o_MusicPlayerInfo_status, 4\n\tstruct_field o_MusicPlayerInfo_trackCount, 1\n\tstruct_field o_MusicPlayerInfo_priority, 1\n\tstruct_field o_MusicPlayerInfo_cmd, 1\n\tstruct_field o_MusicPlayerInfo_unk_B, 1\n\tstruct_field o_MusicPlayerInfo_clock, 4\n\tstruct_field o_MusicPlayerInfo_gap, 8\n\tstruct_field o_MusicPlayerInfo_memAccArea, 4\n\tstruct_field o_MusicPlayerInfo_tempoD, 2\n\tstruct_field o_MusicPlayerInfo_tempoU, 2\n\tstruct_field o_MusicPlayerInfo_tempoI, 2\n\tstruct_field o_MusicPlayerInfo_tempoC, 2\n\tstruct_field o_MusicPlayerInfo_fadeOI, 2\n\tstruct_field o_MusicPlayerInfo_fadeOC, 2\n\tstruct_field o_MusicPlayerInfo_fadeOV, 2\n\tstruct_field o_MusicPlayerInfo_padding, 2\n\tstruct_field o_MusicPlayerInfo_tracks, 4\n\tstruct_field o_MusicPlayerInfo_tone, 4\n\tstruct_field o_MusicPlayerInfo_ident, 4\n\tstruct_field o_MusicPlayerInfo_func, 4\n\tstruct_field o_MusicPlayerInfo_intp, 4\n\tstruct_field MusicPlayerInfo_size, 0\n\n\tstruct_begin\n\tstruct_field o_CgbChannel_statusFlags, 1\n\tstruct_field o_CgbChannel_type, 1\n\tstruct_field o_CgbChannel_rightVolume, 1\n\tstruct_field o_CgbChannel_leftVolume, 1\n\tstruct_field o_CgbChannel_attack, 1\n\tstruct_field o_CgbChannel_decay, 1\n\tstruct_field o_CgbChannel_sustain, 1\n\tstruct_field o_CgbChannel_release, 1\n\tstruct_field o_CgbChannel_key, 1\n\tstruct_field o_CgbChannel_envelopeVolume, 1\n\tstruct_field o_CgbChannel_envelopeGoal, 1\n\tstruct_field o_CgbChannel_envelopeCounter, 1\n\tstruct_field o_CgbChannel_pseudoEchoVolume, 1\n\tstruct_field o_CgbChannel_pseudoEchoLength, 1\n\tstruct_field o_CgbChannel_dummy1, 1\n\tstruct_field o_CgbChannel_dummy2, 1\n\tstruct_field o_CgbChannel_gateTime, 1\n\tstruct_field o_CgbChannel_midiKey, 1\n\tstruct_field o_CgbChannel_velocity, 1\n\tstruct_field o_CgbChannel_priority, 1\n\tstruct_field o_CgbChannel_rhythmPan, 1\n\tstruct_field o_CgbChannel_dummy3, 3\n\tstruct_field o_CgbChannel_dummy5, 1\n\tstruct_field o_CgbChannel_sustainGoal, 1\n\tstruct_field o_CgbChannel_n4, 1\n\tstruct_field o_CgbChannel_pan, 1\n\tstruct_field o_CgbChannel_panMask, 1\n\tstruct_field o_CgbChannel_modify, 1\n\tstruct_field o_CgbChannel_length, 1\n\tstruct_field o_CgbChannel_sweep, 1\n\tstruct_field o_CgbChannel_frequency, 4\n\tstruct_field o_CgbChannel_wavePointer, 4\n\tstruct_field o_CgbChannel_currentPointer, 4\n\tstruct_field o_CgbChannel_track, 4\n\tstruct_field o_CgbChannel_prevChannelPointer, 4\n\tstruct_field o_CgbChannel_nextChannelPointer, 4\n\tstruct_field o_CgbChannel_dummy4, 8\n\tstruct_field CgbChannel_size, 0\n"
  },
  {
    "path": "constants/misc_constants.inc",
    "content": "\t.set TRUE, 1\n\t.set FALSE, 0\n\n\t.set NULL, 0\n\n\t.set SPRITE_SIZE_8x8,   (OAM_SIZE_0 >> 28) | (OAM_SQUARE >> 14)\n\t.set SPRITE_SIZE_16x16, (OAM_SIZE_1 >> 28) | (OAM_SQUARE >> 14)\n\t.set SPRITE_SIZE_32x32, (OAM_SIZE_2 >> 28) | (OAM_SQUARE >> 14)\n\t.set SPRITE_SIZE_64x64, (OAM_SIZE_3 >> 28) | (OAM_SQUARE >> 14)\n\n\t.set SPRITE_SIZE_16x8,  (OAM_SIZE_0 >> 28) | (OAM_H_RECTANGLE >> 14)\n\t.set SPRITE_SIZE_32x8,  (OAM_SIZE_1 >> 28) | (OAM_H_RECTANGLE >> 14)\n\t.set SPRITE_SIZE_32x16, (OAM_SIZE_2 >> 28) | (OAM_H_RECTANGLE >> 14)\n\t.set SPRITE_SIZE_64x32, (OAM_SIZE_3 >> 28) | (OAM_H_RECTANGLE >> 14)\n\n\t.set SPRITE_SIZE_8x16,  (OAM_SIZE_0 >> 28) | (OAM_V_RECTANGLE >> 14)\n\t.set SPRITE_SIZE_8x32,  (OAM_SIZE_1 >> 28) | (OAM_V_RECTANGLE >> 14)\n\t.set SPRITE_SIZE_16x32, (OAM_SIZE_2 >> 28) | (OAM_V_RECTANGLE >> 14)\n\t.set SPRITE_SIZE_32x64, (OAM_SIZE_3 >> 28) | (OAM_V_RECTANGLE >> 14)\n\n\t.set OBJ_IMAGE_ANIM_H_FLIP, 1 << 6\n\t.set OBJ_IMAGE_ANIM_V_FLIP, 1 << 7\n"
  },
  {
    "path": "data/battle_ai_scripts.s",
    "content": "#include \"constants/battle.h\"\n#include \"constants/battle_ai.h\"\n#include \"constants/abilities.h\"\n#include \"constants/items.h\"\n#include \"constants/moves.h\"\n#include \"constants/battle_move_effects.h\"\n#include \"constants/hold_effects.h\"\n#include \"constants/pokemon.h\"\n\t.include \"asm/macros/battle_ai_script.inc\"\n\n\t.section script_data, \"aw\", %progbits\n\n@ The FRLG scripts are improved subtly by Emerald in a few places\n@ To make adding these improvements easier they are commented and tagged with \"Improvement in Emerald\"\n@ Emerald also adds a few entirely new AI commands (mostly to expand Double Battle AI), which are not included\n\n\t.align 2\ngBattleAI_ScriptsTable::\n\t.4byte AI_CheckBadMove\n\t.4byte AI_CheckViability\n\t.4byte AI_TryToFaint\n\t.4byte AI_SetupFirstTurn\n\t.4byte AI_Risky\n\t.4byte AI_PreferStrongestMove\n\t.4byte AI_PreferBatonPass\n\t.4byte AI_DoubleBattle\n\t.4byte AI_HPAware\n\t.4byte AI_Unknown\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Ret\n\t.4byte AI_Roaming\n\t.4byte AI_Safari\n\t.4byte AI_FirstBattle\n\nAI_CheckBadMove::\n\tif_move MOVE_FISSURE, AI_CBM_CheckIfNegatesType\n\tif_move MOVE_HORN_DRILL, AI_CBM_CheckIfNegatesType\n\tget_how_powerful_move_is\n\tif_equal MOVE_POWER_DISCOURAGED, AI_CheckBadMove_CheckSoundproof\n\nAI_CBM_CheckIfNegatesType::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10\n\tget_ability AI_TARGET\n\tif_equal ABILITY_VOLT_ABSORB, CheckIfVoltAbsorbCancelsElectric\n\tif_equal ABILITY_WATER_ABSORB, CheckIfWaterAbsorbCancelsWater\n\tif_equal ABILITY_FLASH_FIRE, CheckIfFlashFireCancelsFire\n\tif_equal ABILITY_WONDER_GUARD, CheckIfWonderGuardCancelsMove\n\tif_equal ABILITY_LEVITATE, CheckIfLevitateCancelsGroundMove\n\tgoto AI_CheckBadMove_CheckSoundproof\n\nCheckIfVoltAbsorbCancelsElectric::\n\tget_curr_move_type\n\tif_equal_ TYPE_ELECTRIC, Score_Minus12\n\tgoto AI_CheckBadMove_CheckSoundproof\n\nCheckIfWaterAbsorbCancelsWater::\n\tget_curr_move_type\n\tif_equal_ TYPE_WATER, Score_Minus12\n\tgoto AI_CheckBadMove_CheckSoundproof\n\nCheckIfFlashFireCancelsFire::\n\tget_curr_move_type\n\tif_equal_ TYPE_FIRE, Score_Minus12\n\tgoto AI_CheckBadMove_CheckSoundproof\n\nCheckIfWonderGuardCancelsMove::\n\tif_type_effectiveness AI_EFFECTIVENESS_x2, AI_CheckBadMove_CheckSoundproof\n\tgoto Score_Minus10\n\nCheckIfLevitateCancelsGroundMove::\n\tget_curr_move_type\n\tif_equal_ TYPE_GROUND, Score_Minus10\n\nAI_CheckBadMove_CheckSoundproof::\n\tget_ability AI_TARGET\n\tif_not_equal ABILITY_SOUNDPROOF, AI_CheckBadMove_CheckEffect\n\tif_move MOVE_GROWL, Score_Minus10\n\tif_move MOVE_ROAR, Score_Minus10\n\tif_move MOVE_SING, Score_Minus10\n\tif_move MOVE_SUPERSONIC, Score_Minus10\n\tif_move MOVE_SCREECH, Score_Minus10\n\tif_move MOVE_SNORE, Score_Minus10\n\tif_move MOVE_UPROAR, Score_Minus10\n\tif_move MOVE_METAL_SOUND, Score_Minus10\n\tif_move MOVE_GRASS_WHISTLE, Score_Minus10\n\nAI_CheckBadMove_CheckEffect::\n\tif_effect EFFECT_SLEEP, AI_CBM_Sleep\n\tif_effect EFFECT_EXPLOSION, AI_CBM_Explosion\n\tif_effect EFFECT_DREAM_EATER, AI_CBM_DreamEater\n\tif_effect EFFECT_ATTACK_UP, AI_CBM_AttackUp\n\tif_effect EFFECT_DEFENSE_UP, AI_CBM_DefenseUp\n\tif_effect EFFECT_SPEED_UP, AI_CBM_SpeedUp\n\tif_effect EFFECT_SPECIAL_ATTACK_UP, AI_CBM_SpAtkUp\n\tif_effect EFFECT_SPECIAL_DEFENSE_UP, AI_CBM_SpDefUp\n\tif_effect EFFECT_ACCURACY_UP, AI_CBM_AccUp\n\tif_effect EFFECT_EVASION_UP, AI_CBM_EvasionUp\n\tif_effect EFFECT_ATTACK_DOWN, AI_CBM_AttackDown\n\tif_effect EFFECT_DEFENSE_DOWN, AI_CBM_DefenseDown\n\tif_effect EFFECT_SPEED_DOWN, AI_CBM_SpeedDown\n\tif_effect EFFECT_SPECIAL_ATTACK_DOWN, AI_CBM_SpAtkDown\n\tif_effect EFFECT_SPECIAL_DEFENSE_DOWN, AI_CBM_SpDefDown\n\tif_effect EFFECT_ACCURACY_DOWN, AI_CBM_AccDown\n\tif_effect EFFECT_EVASION_DOWN, AI_CBM_EvasionDown\n\tif_effect EFFECT_HAZE, AI_CBM_Haze\n\tif_effect EFFECT_BIDE, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_ROAR, AI_CBM_Roar\n\tif_effect EFFECT_TOXIC, AI_CBM_Poison\n\tif_effect EFFECT_LIGHT_SCREEN, AI_CBM_LightScreen\n\tif_effect EFFECT_OHKO, AI_CBM_OneHitKO\n\tif_effect EFFECT_RAZOR_WIND, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_SUPER_FANG, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_MIST, AI_CBM_Mist\n\tif_effect EFFECT_FOCUS_ENERGY, AI_CBM_FocusEnergy\n\tif_effect EFFECT_CONFUSE, AI_CBM_Confuse\n\tif_effect EFFECT_ATTACK_UP_2, AI_CBM_AttackUp\n\tif_effect EFFECT_DEFENSE_UP_2, AI_CBM_DefenseUp\n\tif_effect EFFECT_SPEED_UP_2, AI_CBM_SpeedUp\n\tif_effect EFFECT_SPECIAL_ATTACK_UP_2, AI_CBM_SpAtkUp\n\tif_effect EFFECT_SPECIAL_DEFENSE_UP_2, AI_CBM_SpDefUp\n\tif_effect EFFECT_ACCURACY_UP_2, AI_CBM_AccUp\n\tif_effect EFFECT_EVASION_UP_2, AI_CBM_EvasionUp\n\tif_effect EFFECT_ATTACK_DOWN_2, AI_CBM_AttackDown\n\tif_effect EFFECT_DEFENSE_DOWN_2, AI_CBM_DefenseDown\n\tif_effect EFFECT_SPEED_DOWN_2, AI_CBM_SpeedDown\n\tif_effect EFFECT_SPECIAL_ATTACK_DOWN_2, AI_CBM_SpAtkDown\n\tif_effect EFFECT_SPECIAL_DEFENSE_DOWN_2, AI_CBM_SpDefDown\n\tif_effect EFFECT_ACCURACY_DOWN_2, AI_CBM_AccDown\n\tif_effect EFFECT_EVASION_DOWN_2, AI_CBM_EvasionDown\n\tif_effect EFFECT_REFLECT, AI_CBM_Reflect\n\tif_effect EFFECT_POISON, AI_CBM_Poison\n\tif_effect EFFECT_PARALYZE, AI_CBM_Paralyze\n\tif_effect EFFECT_SUBSTITUTE, AI_CBM_Substitute\n\tif_effect EFFECT_RECHARGE, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_LEECH_SEED, AI_CBM_LeechSeed\n\tif_effect EFFECT_DISABLE, AI_CBM_Disable\n\tif_effect EFFECT_LEVEL_DAMAGE, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_PSYWAVE, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_COUNTER, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_ENCORE, AI_CBM_Encore\n\tif_effect EFFECT_SNORE, AI_CBM_DamageDuringSleep\n\tif_effect EFFECT_SLEEP_TALK, AI_CBM_DamageDuringSleep\n\tif_effect EFFECT_FLAIL, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_MEAN_LOOK, AI_CBM_CantEscape\n\tif_effect EFFECT_NIGHTMARE, AI_CBM_Nightmare\n\tif_effect EFFECT_MINIMIZE, AI_CBM_EvasionUp\n\tif_effect EFFECT_CURSE, AI_CBM_Curse\n\tif_effect EFFECT_SPIKES, AI_CBM_Spikes\n\tif_effect EFFECT_FORESIGHT, AI_CBM_Foresight\n\tif_effect EFFECT_PERISH_SONG, AI_CBM_PerishSong\n\tif_effect EFFECT_SANDSTORM, AI_CBM_Sandstorm\n\tif_effect EFFECT_SWAGGER, AI_CBM_Confuse\n\tif_effect EFFECT_ATTRACT, AI_CBM_Attract\n\tif_effect EFFECT_RETURN, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_PRESENT, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_FRUSTRATION, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_SAFEGUARD, AI_CBM_Safeguard\n\tif_effect EFFECT_MAGNITUDE, AI_CBM_Magnitude\n\tif_effect EFFECT_BATON_PASS, AI_CBM_BatonPass\n\tif_effect EFFECT_SONICBOOM, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_RAIN_DANCE, AI_CBM_RainDance\n\tif_effect EFFECT_SUNNY_DAY, AI_CBM_SunnyDay\n\tif_effect EFFECT_BELLY_DRUM, AI_CBM_BellyDrum\n\tif_effect EFFECT_PSYCH_UP, AI_CBM_Haze\n\tif_effect EFFECT_MIRROR_COAT, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_SKULL_BASH, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_FUTURE_SIGHT, AI_CBM_FutureSight\n\tif_effect EFFECT_TELEPORT, Score_Minus10\n\tif_effect EFFECT_DEFENSE_CURL, AI_CBM_DefenseUp\n\tif_effect EFFECT_FAKE_OUT, AI_CBM_FakeOut\n\tif_effect EFFECT_STOCKPILE, AI_CBM_Stockpile\n\tif_effect EFFECT_SPIT_UP, AI_CBM_SpitUpAndSwallow\n\tif_effect EFFECT_SWALLOW, AI_CBM_SpitUpAndSwallow\n\tif_effect EFFECT_HAIL, AI_CBM_Hail\n\tif_effect EFFECT_TORMENT, AI_CBM_Torment\n\tif_effect EFFECT_FLATTER, AI_CBM_Confuse\n\tif_effect EFFECT_WILL_O_WISP, AI_CBM_WillOWisp\n\tif_effect EFFECT_MEMENTO, AI_CBM_Memento\n\tif_effect EFFECT_FOCUS_PUNCH, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_HELPING_HAND, AI_CBM_HelpingHand\n\tif_effect EFFECT_TRICK, AI_CBM_TrickAndKnockOff\n\tif_effect EFFECT_INGRAIN, AI_CBM_Ingrain\n\tif_effect EFFECT_SUPERPOWER, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_RECYCLE, AI_CBM_Recycle\n\tif_effect EFFECT_KNOCK_OFF, AI_CBM_TrickAndKnockOff\n\tif_effect EFFECT_ENDEAVOR, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_IMPRISON, AI_CBM_Imprison\n\tif_effect EFFECT_REFRESH, AI_CBM_Refresh\n\tif_effect EFFECT_LOW_KICK, AI_CBM_HighRiskForDamage\n\tif_effect EFFECT_MUD_SPORT, AI_CBM_MudSport\n\tif_effect EFFECT_TICKLE, AI_CBM_Tickle\n\tif_effect EFFECT_COSMIC_POWER, AI_CBM_CosmicPower\n\tif_effect EFFECT_BULK_UP, AI_CBM_BulkUp\n\tif_effect EFFECT_WATER_SPORT, AI_CBM_WaterSport\n\tif_effect EFFECT_CALM_MIND, AI_CBM_CalmMind\n\tif_effect EFFECT_DRAGON_DANCE, AI_CBM_DragonDance\n\tend\n\nAI_CBM_Sleep::\n\tget_ability AI_TARGET\n\tif_equal ABILITY_INSOMNIA, Score_Minus10\n\tif_equal ABILITY_VITAL_SPIRIT, Score_Minus10\n\tif_status AI_TARGET, STATUS1_ANY, Score_Minus10\n\tif_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10\n\tend\n\nAI_CBM_Explosion::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10\n\tget_ability AI_TARGET\n\tif_equal ABILITY_DAMP, Score_Minus10\n\tcount_alive_pokemon AI_USER\n\tif_not_equal 0, AI_CBM_Explosion_End\n\tcount_alive_pokemon AI_TARGET\n\tif_not_equal 0, Score_Minus10\n\tgoto Score_Minus1\n\nAI_CBM_Explosion_End::\n\tend\n\nAI_CBM_Nightmare::\n\tif_status2 AI_TARGET, STATUS2_NIGHTMARE, Score_Minus10\n\tif_not_status AI_TARGET, STATUS1_SLEEP, Score_Minus8\n\tend\n\nAI_CBM_DreamEater::\n\tif_not_status AI_TARGET, STATUS1_SLEEP, Score_Minus8\n\tif_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10\n\tend\n\nAI_CBM_BellyDrum::\n\tif_hp_less_than AI_USER, 51, Score_Minus10\n\nAI_CBM_AttackUp::\n\tif_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10\n\tend\n\nAI_CBM_DefenseUp::\n\tif_stat_level_equal AI_USER, STAT_DEF, 12, Score_Minus10\n\tend\n\nAI_CBM_SpeedUp::\n\tif_stat_level_equal AI_USER, STAT_SPEED, 12, Score_Minus10\n\tend\n\nAI_CBM_SpAtkUp::\n\tif_stat_level_equal AI_USER, STAT_SPATK, 12, Score_Minus10\n\tend\n\nAI_CBM_SpDefUp::\n\tif_stat_level_equal AI_USER, STAT_SPDEF, 12, Score_Minus10\n\tend\n\nAI_CBM_AccUp::\n\tif_stat_level_equal AI_USER, STAT_ACC, 12, Score_Minus10\n\tend\n\nAI_CBM_EvasionUp::\n\tif_stat_level_equal AI_USER, STAT_EVASION, 12, Score_Minus10\n\tend\n\nAI_CBM_AttackDown::\n\tif_stat_level_equal AI_TARGET, STAT_ATK, 0, Score_Minus10\n\tget_ability AI_TARGET\n\tif_equal ABILITY_HYPER_CUTTER, Score_Minus10\n\tgoto CheckIfAbilityBlocksStatChange\n\nAI_CBM_DefenseDown::\n\tif_stat_level_equal AI_TARGET, STAT_DEF, 0, Score_Minus10\n\tgoto CheckIfAbilityBlocksStatChange\n\nAI_CBM_SpeedDown::\n\tif_stat_level_equal AI_TARGET, STAT_SPEED, 0, Score_Minus10\n\tget_ability AI_TARGET\n\tif_equal ABILITY_SPEED_BOOST, Score_Minus10\n\tgoto CheckIfAbilityBlocksStatChange\n\nAI_CBM_SpAtkDown::\n\tif_stat_level_equal AI_TARGET, STAT_SPATK, 0, Score_Minus10\n\tgoto CheckIfAbilityBlocksStatChange\n\nAI_CBM_SpDefDown::\n\tif_stat_level_equal AI_TARGET, STAT_SPDEF, 0, Score_Minus10\n\tgoto CheckIfAbilityBlocksStatChange\n\nAI_CBM_AccDown::\n\tif_stat_level_equal AI_TARGET, STAT_ACC, 0, Score_Minus10\n\tget_ability AI_TARGET\n\tif_equal ABILITY_KEEN_EYE, Score_Minus10\n\tgoto CheckIfAbilityBlocksStatChange\n\nAI_CBM_EvasionDown::\n\tif_stat_level_equal AI_TARGET, STAT_EVASION, 0, Score_Minus10\n\nCheckIfAbilityBlocksStatChange::\n\tget_ability AI_TARGET\n\tif_equal ABILITY_CLEAR_BODY, Score_Minus10\n\tif_equal ABILITY_WHITE_SMOKE, Score_Minus10\n\tend\n\nAI_CBM_Haze::\n\tif_stat_level_less_than AI_USER, STAT_ATK, 6, AI_CBM_Haze_End\n\tif_stat_level_less_than AI_USER, STAT_DEF, 6, AI_CBM_Haze_End\n\tif_stat_level_less_than AI_USER, STAT_SPEED, 6, AI_CBM_Haze_End\n\tif_stat_level_less_than AI_USER, STAT_SPATK, 6, AI_CBM_Haze_End\n\tif_stat_level_less_than AI_USER, STAT_SPDEF, 6, AI_CBM_Haze_End\n\tif_stat_level_less_than AI_USER, STAT_ACC, 6, AI_CBM_Haze_End\n\tif_stat_level_less_than AI_USER, STAT_EVASION, 6, AI_CBM_Haze_End\n\tif_stat_level_more_than AI_TARGET, STAT_ATK, 6, AI_CBM_Haze_End\n\tif_stat_level_more_than AI_TARGET, STAT_DEF, 6, AI_CBM_Haze_End\n\tif_stat_level_more_than AI_TARGET, STAT_SPEED, 6, AI_CBM_Haze_End\n\tif_stat_level_more_than AI_TARGET, STAT_SPATK, 6, AI_CBM_Haze_End\n\tif_stat_level_more_than AI_TARGET, STAT_SPDEF, 6, AI_CBM_Haze_End\n\tif_stat_level_more_than AI_TARGET, STAT_ACC, 6, AI_CBM_Haze_End\n\tif_stat_level_more_than AI_TARGET, STAT_EVASION, 6, AI_CBM_Haze_End\n\tgoto Score_Minus10\n\nAI_CBM_Haze_End::\n\tend\n\nAI_CBM_Roar::\n\tcount_alive_pokemon AI_TARGET\n\tif_equal 0, Score_Minus10\n\tget_ability AI_TARGET\n\tif_equal ABILITY_SUCTION_CUPS, Score_Minus10\n\tend\n\nAI_CBM_Poison::\n\tget_target_type1\n\tif_equal TYPE_STEEL, Score_Minus10\n\tif_equal TYPE_POISON, Score_Minus10\n\tget_target_type2\n\tif_equal TYPE_STEEL, Score_Minus10\n\tif_equal TYPE_POISON, Score_Minus10\n\tget_ability AI_TARGET\n\tif_equal ABILITY_IMMUNITY, Score_Minus10\n\tif_status AI_TARGET, STATUS1_ANY, Score_Minus10\n\tif_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10\n\tend\n\nAI_CBM_LightScreen::\n\tif_side_affecting AI_USER, SIDE_STATUS_LIGHTSCREEN, Score_Minus8\n\tend\n\nAI_CBM_OneHitKO::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10\n\tget_ability AI_TARGET\n\tif_equal ABILITY_STURDY, Score_Minus10\n\tif_level_cond 1, Score_Minus10\n\tend\n\nAI_CBM_Magnitude::\n\tget_ability AI_TARGET\n\tif_equal ABILITY_LEVITATE, Score_Minus10\n\nAI_CBM_HighRiskForDamage::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10\n\tget_ability AI_TARGET\n\tif_not_equal ABILITY_WONDER_GUARD, AI_CBM_HighRiskForDamage_End\n\tif_type_effectiveness AI_EFFECTIVENESS_x2, AI_CBM_HighRiskForDamage_End\n\tgoto Score_Minus10\n\nAI_CBM_HighRiskForDamage_End::\n\tend\n\nAI_CBM_Mist::\n\tif_side_affecting AI_USER, SIDE_STATUS_MIST, Score_Minus8\n\tend\n\nAI_CBM_FocusEnergy::\n\tif_status2 AI_USER, STATUS2_FOCUS_ENERGY, Score_Minus10\n\tend\n\nAI_CBM_Confuse::\n\tif_status2 AI_TARGET, STATUS2_CONFUSION, Score_Minus5\n\tget_ability AI_TARGET\n\tif_equal ABILITY_OWN_TEMPO, Score_Minus10\n\tif_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10\n\tend\n\nAI_CBM_Reflect::\n\tif_side_affecting AI_USER, SIDE_STATUS_REFLECT, Score_Minus8\n\tend\n\nAI_CBM_Paralyze::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10\n\tget_ability AI_TARGET\n\tif_equal ABILITY_LIMBER, Score_Minus10\n\tif_status AI_TARGET, STATUS1_ANY, Score_Minus10\n\tif_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10\n\tend\n\nAI_CBM_Substitute::\n\tif_status2 AI_USER, STATUS2_SUBSTITUTE, Score_Minus8\n\tif_hp_less_than AI_USER, 26, Score_Minus10\n\tend\n\nAI_CBM_LeechSeed::\n\tif_status3 AI_TARGET, STATUS3_LEECHSEED, Score_Minus10\n\tget_target_type1\n\tif_equal TYPE_GRASS, Score_Minus10\n\tget_target_type2\n\tif_equal TYPE_GRASS, Score_Minus10\n\tend\n\nAI_CBM_Disable::\n\tif_any_move_disabled AI_TARGET, Score_Minus8\n\tend\n\nAI_CBM_Encore::\n\tif_any_move_encored AI_TARGET, Score_Minus8\n\tend\n\nAI_CBM_DamageDuringSleep::\n\tif_not_status AI_USER, STATUS1_SLEEP, Score_Minus8\n\tend\n\nAI_CBM_CantEscape::\n\tif_status2 AI_TARGET, STATUS2_ESCAPE_PREVENTION, Score_Minus10\n\tend\n\nAI_CBM_Curse::\n\tif_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10\n\tif_stat_level_equal AI_USER, STAT_DEF, 12, Score_Minus8\n\tend\n\nAI_CBM_Spikes::\n\tif_side_affecting AI_TARGET, SIDE_STATUS_SPIKES, Score_Minus10\n\tend\n\nAI_CBM_Foresight::\n\tif_status2 AI_TARGET, STATUS2_FORESIGHT, Score_Minus10\n\tend\n\nAI_CBM_PerishSong::\n\tif_status3 AI_TARGET, STATUS3_PERISH_SONG, Score_Minus10\n\tend\n\nAI_CBM_Sandstorm::\n\tget_weather\n\tif_equal AI_WEATHER_SANDSTORM, Score_Minus8\n\tend\n\nAI_CBM_Attract::\n\tif_status2 AI_TARGET, STATUS2_INFATUATION, Score_Minus10\n\tget_ability AI_TARGET\n\tif_equal ABILITY_OBLIVIOUS, Score_Minus10\n\tget_gender AI_USER\n\tif_equal MON_MALE, AI_CBM_Attract_CheckIfTargetIsFemale\n\tif_equal MON_FEMALE, AI_CBM_Attract_CheckIfTargetIsMale\n\tgoto Score_Minus10\n\nAI_CBM_Attract_CheckIfTargetIsFemale::\n\tget_gender AI_TARGET\n\tif_equal MON_FEMALE, AI_CBM_Attract_End\n\tgoto Score_Minus10\n\nAI_CBM_Attract_CheckIfTargetIsMale::\n\tget_gender AI_TARGET\n\tif_equal MON_MALE, AI_CBM_Attract_End\n\tgoto Score_Minus10\n\nAI_CBM_Attract_End::\n\tend\n\nAI_CBM_Safeguard::\n\tif_side_affecting AI_USER, SIDE_STATUS_SAFEGUARD, Score_Minus8\n\tend\n\nAI_CBM_Memento::\n\tif_stat_level_equal AI_TARGET, STAT_ATK, 0, Score_Minus10\n\tif_stat_level_equal AI_TARGET, STAT_SPATK, 0, Score_Minus8\n\nAI_CBM_BatonPass::\n\tcount_alive_pokemon AI_USER\n\tif_equal 0, Score_Minus10\n\tend\n\nAI_CBM_RainDance::\n\tget_weather\n\tif_equal AI_WEATHER_RAIN, Score_Minus8\n\tend\n\nAI_CBM_SunnyDay::\n\tget_weather\n\tif_equal AI_WEATHER_SUN, Score_Minus8\n\tend\n\nAI_CBM_FutureSight::\n\tif_side_affecting AI_TARGET, SIDE_STATUS_FUTUREATTACK, Score_Minus10\n\tif_side_affecting AI_USER, SIDE_STATUS_FUTUREATTACK, Score_Minus12\n\tend\n\nAI_CBM_FakeOut::\n\tis_first_turn_for AI_USER\n\tif_equal 0, Score_Minus10\n\tend\n\nAI_CBM_Stockpile::\n\tget_stockpile_count AI_USER\n\tif_equal 3, Score_Minus10\n\tend\n\nAI_CBM_SpitUpAndSwallow::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10\n\tget_stockpile_count AI_USER\n\tif_equal 0, Score_Minus10\n\tend\n\nAI_CBM_Hail::\n\tget_weather\n\tif_equal AI_WEATHER_HAIL, Score_Minus8\n\tend\n\nAI_CBM_Torment::\n\tif_status2 AI_TARGET, STATUS2_TORMENT, Score_Minus10\n\tend\n\nAI_CBM_WillOWisp::\n\tget_ability AI_TARGET\n\tif_equal ABILITY_WATER_VEIL, Score_Minus10\n\tif_status AI_TARGET, STATUS1_ANY, Score_Minus10\n\tif_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_5, Score_Minus10\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_25, Score_Minus10\n\tif_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10\n\tend\n\nAI_CBM_HelpingHand::\n\tif_not_double_battle Score_Minus10\n\tend\n\nAI_CBM_TrickAndKnockOff::\n\tget_ability AI_TARGET\n\tif_equal ABILITY_STICKY_HOLD, Score_Minus10\n\tend\n\nAI_CBM_Ingrain::\n\tif_status3 AI_USER, STATUS3_ROOTED, Score_Minus10\n\tend\n\nAI_CBM_Recycle::\n\tget_used_held_item AI_USER\n\tif_equal ITEM_NONE, Score_Minus10\n\tend\n\nAI_CBM_Imprison::\n\tif_status3 AI_USER, STATUS3_IMPRISONED_OTHERS, Score_Minus10\n\tend\n\nAI_CBM_Refresh::\n\tif_not_status AI_USER, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, Score_Minus10\n\tend\n\nAI_CBM_MudSport::\n\tif_status3 AI_USER, STATUS3_MUDSPORT, Score_Minus10\n\tend\n\nAI_CBM_Tickle::\n\tif_stat_level_equal AI_TARGET, STAT_ATK, 0, Score_Minus10\n\tif_stat_level_equal AI_TARGET, STAT_DEF, 0, Score_Minus8\n\tend\n\nAI_CBM_CosmicPower::\n\tif_stat_level_equal AI_USER, STAT_DEF, 12, Score_Minus10\n\tif_stat_level_equal AI_USER, STAT_SPDEF, 12, Score_Minus8\n\tend\n\nAI_CBM_BulkUp::\n\tif_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10\n\tif_stat_level_equal AI_USER, STAT_DEF, 12, Score_Minus8\n\tend\n\nAI_CBM_WaterSport::\n\tif_status3 AI_USER, STATUS3_WATERSPORT, Score_Minus10\n\tend\n\nAI_CBM_CalmMind::\n\tif_stat_level_equal AI_USER, STAT_SPATK, 12, Score_Minus10\n\tif_stat_level_equal AI_USER, STAT_SPDEF, 12, Score_Minus8\n\tend\n\nAI_CBM_DragonDance::\n\tif_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10\n\tif_stat_level_equal AI_USER, STAT_SPEED, 12, Score_Minus8\n\tend\n\nScore_Minus1::\n\tscore -1\n\tend\n\nScore_Minus2::\n\tscore -2\n\tend\n\nScore_Minus3::\n\tscore -3\n\tend\n\nScore_Minus5::\n\tscore -5\n\tend\n\nScore_Minus8::\n\tscore -8\n\tend\n\nScore_Minus10::\n\tscore -10\n\tend\n\nScore_Minus12::\n\tscore -12\n\tend\n\nScore_Plus1::\n\tscore +1\n\tend\n\nScore_Plus2::\n\tscore +2\n\tend\n\nScore_Plus3::\n\tscore +3\n\tend\n\nScore_Plus5::\n\tscore +5\n\tend\n\nScore_Plus10::\n\tscore +10\n\tend\n\nAI_CheckViability::\n\tif_effect EFFECT_SLEEP, AI_CV_Sleep\n\tif_effect EFFECT_ABSORB, AI_CV_Absorb\n\tif_effect EFFECT_EXPLOSION, AI_CV_SelfKO\n\tif_effect EFFECT_DREAM_EATER, AI_CV_DreamEater\n\tif_effect EFFECT_MIRROR_MOVE, AI_CV_MirrorMove\n\tif_effect EFFECT_ATTACK_UP, AI_CV_AttackUp\n\tif_effect EFFECT_DEFENSE_UP, AI_CV_DefenseUp\n\tif_effect EFFECT_SPEED_UP, AI_CV_SpeedUp\n\tif_effect EFFECT_SPECIAL_ATTACK_UP, AI_CV_SpAtkUp\n\tif_effect EFFECT_SPECIAL_DEFENSE_UP, AI_CV_SpDefUp\n\tif_effect EFFECT_ACCURACY_UP, AI_CV_AccuracyUp\n\tif_effect EFFECT_EVASION_UP, AI_CV_EvasionUp\n\tif_effect EFFECT_ALWAYS_HIT, AI_CV_AlwaysHit\n\tif_effect EFFECT_ATTACK_DOWN, AI_CV_AttackDown\n\tif_effect EFFECT_DEFENSE_DOWN, AI_CV_DefenseDown\n\tif_effect EFFECT_SPEED_DOWN, AI_CV_SpeedDown\n\tif_effect EFFECT_SPECIAL_ATTACK_DOWN, AI_CV_SpAtkDown\n\tif_effect EFFECT_SPECIAL_DEFENSE_DOWN, AI_CV_SpDefDown\n\tif_effect EFFECT_ACCURACY_DOWN, AI_CV_AccuracyDown\n\tif_effect EFFECT_EVASION_DOWN, AI_CV_EvasionDown\n\tif_effect EFFECT_HAZE, AI_CV_Haze\n\tif_effect EFFECT_BIDE, AI_CV_Bide\n\tif_effect EFFECT_ROAR, AI_CV_Roar\n\tif_effect EFFECT_CONVERSION, AI_CV_Conversion\n\tif_effect EFFECT_RESTORE_HP, AI_CV_Heal\n\tif_effect EFFECT_TOXIC, AI_CV_Toxic\n\tif_effect EFFECT_LIGHT_SCREEN, AI_CV_LightScreen\n\tif_effect EFFECT_REST, AI_CV_Rest\n\tif_effect EFFECT_OHKO, AI_CV_OneHitKO\n\tif_effect EFFECT_RAZOR_WIND, AI_CV_ChargeUpMove\n\tif_effect EFFECT_SUPER_FANG, AI_CV_SuperFang\n\tif_effect EFFECT_TRAP, AI_CV_Trap\n\tif_effect EFFECT_HIGH_CRITICAL, AI_CV_HighCrit\n\tif_effect EFFECT_CONFUSE, AI_CV_Confuse\n\tif_effect EFFECT_ATTACK_UP_2, AI_CV_AttackUp\n\tif_effect EFFECT_DEFENSE_UP_2, AI_CV_DefenseUp\n\tif_effect EFFECT_SPEED_UP_2, AI_CV_SpeedUp\n\tif_effect EFFECT_SPECIAL_ATTACK_UP_2, AI_CV_SpAtkUp\n\tif_effect EFFECT_SPECIAL_DEFENSE_UP_2, AI_CV_SpDefUp\n\tif_effect EFFECT_ACCURACY_UP_2, AI_CV_AccuracyUp\n\tif_effect EFFECT_EVASION_UP_2, AI_CV_EvasionUp\n\tif_effect EFFECT_ATTACK_DOWN_2, AI_CV_AttackDown\n\tif_effect EFFECT_DEFENSE_DOWN_2, AI_CV_DefenseDown\n\tif_effect EFFECT_SPEED_DOWN_2, AI_CV_SpeedDown\n\tif_effect EFFECT_SPECIAL_ATTACK_DOWN_2, AI_CV_SpAtkDown\n\tif_effect EFFECT_SPECIAL_DEFENSE_DOWN_2, AI_CV_SpDefDown\n\tif_effect EFFECT_ACCURACY_DOWN_2, AI_CV_AccuracyDown\n\tif_effect EFFECT_EVASION_DOWN_2, AI_CV_EvasionDown\n\tif_effect EFFECT_REFLECT, AI_CV_Reflect\n\tif_effect EFFECT_POISON, AI_CV_Poison\n\tif_effect EFFECT_PARALYZE, AI_CV_Paralyze\n\tif_effect EFFECT_SWAGGER, AI_CV_Swagger\n\tif_effect EFFECT_SPEED_DOWN_HIT, AI_CV_SpeedDownFromChance\n\tif_effect EFFECT_SKY_ATTACK, AI_CV_ChargeUpMove\n\tif_effect EFFECT_VITAL_THROW, AI_CV_VitalThrow\n\tif_effect EFFECT_SUBSTITUTE, AI_CV_Substitute\n\tif_effect EFFECT_RECHARGE, AI_CV_Recharge\n\tif_effect EFFECT_LEECH_SEED, AI_CV_Toxic\n\tif_effect EFFECT_DISABLE, AI_CV_Disable\n\tif_effect EFFECT_COUNTER, AI_CV_Counter\n\tif_effect EFFECT_ENCORE, AI_CV_Encore\n\tif_effect EFFECT_PAIN_SPLIT, AI_CV_PainSplit\n\tif_effect EFFECT_SNORE, AI_CV_Snore\n\tif_effect EFFECT_LOCK_ON, AI_CV_LockOn\n\tif_effect EFFECT_SLEEP_TALK, AI_CV_SleepTalk\n\tif_effect EFFECT_DESTINY_BOND, AI_CV_DestinyBond\n\tif_effect EFFECT_FLAIL, AI_CV_Flail\n\tif_effect EFFECT_HEAL_BELL, AI_CV_HealBell\n\tif_effect EFFECT_THIEF, AI_CV_Thief\n\tif_effect EFFECT_MEAN_LOOK, AI_CV_Trap\n\tif_effect EFFECT_MINIMIZE, AI_CV_EvasionUp\n\tif_effect EFFECT_CURSE, AI_CV_Curse\n\tif_effect EFFECT_PROTECT, AI_CV_Protect\n\tif_effect EFFECT_FORESIGHT, AI_CV_Foresight\n\tif_effect EFFECT_ENDURE, AI_CV_Endure\n\tif_effect EFFECT_BATON_PASS, AI_CV_BatonPass\n\tif_effect EFFECT_PURSUIT, AI_CV_Pursuit\n\tif_effect EFFECT_MORNING_SUN, AI_CV_HealWeather\n\tif_effect EFFECT_SYNTHESIS, AI_CV_HealWeather\n\tif_effect EFFECT_MOONLIGHT, AI_CV_HealWeather\n\tif_effect EFFECT_RAIN_DANCE, AI_CV_RainDance\n\tif_effect EFFECT_SUNNY_DAY, AI_CV_SunnyDay\n\tif_effect EFFECT_BELLY_DRUM, AI_CV_BellyDrum\n\tif_effect EFFECT_PSYCH_UP, AI_CV_PsychUp\n\tif_effect EFFECT_MIRROR_COAT, AI_CV_MirrorCoat\n\tif_effect EFFECT_SKULL_BASH, AI_CV_ChargeUpMove\n\tif_effect EFFECT_SOLAR_BEAM, AI_CV_ChargeUpMove\n\tif_effect EFFECT_SEMI_INVULNERABLE, AI_CV_SemiInvulnerable\n\tif_effect EFFECT_SOFTBOILED, AI_CV_Heal\n\tif_effect EFFECT_FAKE_OUT, AI_CV_FakeOut\n\tif_effect EFFECT_SPIT_UP, AI_CV_SpitUp\n\tif_effect EFFECT_SWALLOW, AI_CV_Heal\n\tif_effect EFFECT_HAIL, AI_CV_Hail\n\tif_effect EFFECT_FLATTER, AI_CV_Flatter\n\tif_effect EFFECT_MEMENTO, AI_CV_SelfKO\n\tif_effect EFFECT_FACADE, AI_CV_Facade\n\tif_effect EFFECT_FOCUS_PUNCH, AI_CV_FocusPunch\n\tif_effect EFFECT_SMELLINGSALT, AI_CV_SmellingSalt\n\tif_effect EFFECT_TRICK, AI_CV_Trick\n\tif_effect EFFECT_ROLE_PLAY, AI_CV_ChangeSelfAbility\n\tif_effect EFFECT_SUPERPOWER, AI_CV_Superpower\n\tif_effect EFFECT_MAGIC_COAT, AI_CV_MagicCoat\n\tif_effect EFFECT_RECYCLE, AI_CV_Recycle\n\tif_effect EFFECT_REVENGE, AI_CV_Revenge\n\tif_effect EFFECT_BRICK_BREAK, AI_CV_BrickBreak\n\tif_effect EFFECT_KNOCK_OFF, AI_CV_KnockOff\n\tif_effect EFFECT_ENDEAVOR, AI_CV_Endeavor\n\tif_effect EFFECT_ERUPTION, AI_CV_Eruption\n\tif_effect EFFECT_SKILL_SWAP, AI_CV_ChangeSelfAbility\n\tif_effect EFFECT_IMPRISON, AI_CV_Imprison\n\tif_effect EFFECT_REFRESH, AI_CV_Refresh\n\tif_effect EFFECT_SNATCH, AI_CV_Snatch\n\tif_effect EFFECT_BLAZE_KICK, AI_CV_HighCrit\n\tif_effect EFFECT_MUD_SPORT, AI_CV_MudSport\n\tif_effect EFFECT_OVERHEAT, AI_CV_Overheat\n\tif_effect EFFECT_TICKLE, AI_CV_DefenseDown\n\tif_effect EFFECT_COSMIC_POWER, AI_CV_SpDefUp\n\tif_effect EFFECT_BULK_UP, AI_CV_DefenseUp\n\tif_effect EFFECT_POISON_TAIL, AI_CV_HighCrit\n\tif_effect EFFECT_WATER_SPORT, AI_CV_WaterSport\n\tif_effect EFFECT_CALM_MIND, AI_CV_SpDefUp\n\tif_effect EFFECT_DRAGON_DANCE, AI_CV_DragonDance\n\tend\n\nAI_CV_Sleep::\n\tif_has_move_with_effect AI_TARGET, EFFECT_DREAM_EATER, AI_CV_SleepEncourageSlpDamage\n\tif_has_move_with_effect AI_TARGET, EFFECT_NIGHTMARE, AI_CV_SleepEncourageSlpDamage\n\tgoto AI_CV_Sleep_End\n\nAI_CV_SleepEncourageSlpDamage::\n\tif_random_less_than 128, AI_CV_Sleep_End\n\tscore +1\n\nAI_CV_Sleep_End::\n\tend\n\nAI_CV_Absorb::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_AbsorbEncourageMaybe\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_AbsorbEncourageMaybe\n\tgoto AI_CV_Absorb_End\n\nAI_CV_AbsorbEncourageMaybe::\n\tif_random_less_than 50, AI_CV_Absorb_End\n\tscore -3\n\nAI_CV_Absorb_End::\n\tend\n\nAI_CV_SelfKO::\n\tif_stat_level_less_than AI_TARGET, STAT_EVASION, 7, AI_CV_SelfKO_Encourage1\n\tscore -1\n\tif_stat_level_less_than AI_TARGET, STAT_EVASION, 10, AI_CV_SelfKO_Encourage1\n\tif_random_less_than 128, AI_CV_SelfKO_Encourage1\n\tscore -1\n\nAI_CV_SelfKO_Encourage1::\n\tif_hp_less_than AI_USER, 80, AI_CV_SelfKO_Encourage2\n\tif_target_faster AI_CV_SelfKO_Encourage2\n\tif_random_less_than 50, AI_CV_SelfKO_End\n\tgoto Score_Minus3\n\nAI_CV_SelfKO_Encourage2::\n\tif_hp_more_than AI_USER, 50, AI_CV_SelfKO_Encourage4\n\tif_random_less_than 128, AI_CV_SelfKO_Encourage3\n\tscore +1\n\nAI_CV_SelfKO_Encourage3::\n\tif_hp_more_than AI_USER, 30, AI_CV_SelfKO_End\n\tif_random_less_than 50, AI_CV_SelfKO_End\n\tscore +1\n\tgoto AI_CV_SelfKO_End\n\nAI_CV_SelfKO_Encourage4::\n\tif_random_less_than 50, AI_CV_SelfKO_End\n\tscore -1\n\nAI_CV_SelfKO_End::\n\tend\n\nAI_CV_DreamEater::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_DreamEater_ScoreDown1\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_DreamEater_ScoreDown1\n\tgoto AI_CV_DreamEater_End\n\nAI_CV_DreamEater_ScoreDown1::\n\tscore -1\n\nAI_CV_DreamEater_End::\n\tend\n\nAI_CV_MirrorMove::\n\tif_target_faster AI_CV_MirrorMove2\n\tget_last_used_move AI_TARGET\n\tif_not_in_hwords AI_CV_MirrorMove_EncouragedMovesToMirror, AI_CV_MirrorMove2\n\tif_random_less_than 128, AI_CV_MirrorMove_End\n\tscore +2\n\tgoto AI_CV_MirrorMove_End\n\nAI_CV_MirrorMove2::\n\tget_last_used_move AI_TARGET\n\tif_in_hwords AI_CV_MirrorMove_EncouragedMovesToMirror, AI_CV_MirrorMove_End\n\tif_random_less_than 80, AI_CV_MirrorMove_End\n\tscore -1\n\nAI_CV_MirrorMove_End::\n\tend\n\n\t.space 2\nAI_CV_MirrorMove_EncouragedMovesToMirror::\n\t.align 1\n\t.2byte MOVE_SLEEP_POWDER\n\t.2byte MOVE_LOVELY_KISS\n\t.2byte MOVE_SPORE\n\t.2byte MOVE_HYPNOSIS\n\t.2byte MOVE_SING\n\t.2byte MOVE_GRASS_WHISTLE\n\t.2byte MOVE_SHADOW_PUNCH\n\t.2byte MOVE_SAND_ATTACK\n\t.2byte MOVE_SMOKESCREEN\n\t.2byte MOVE_TOXIC\n\t.2byte MOVE_GUILLOTINE\n\t.2byte MOVE_HORN_DRILL\n\t.2byte MOVE_FISSURE\n\t.2byte MOVE_SHEER_COLD\n\t.2byte MOVE_CROSS_CHOP\n\t.2byte MOVE_AEROBLAST\n\t.2byte MOVE_CONFUSE_RAY\n\t.2byte MOVE_SWEET_KISS\n\t.2byte MOVE_SCREECH\n\t.2byte MOVE_COTTON_SPORE\n\t.2byte MOVE_SCARY_FACE\n\t.2byte MOVE_FAKE_TEARS\n\t.2byte MOVE_METAL_SOUND\n\t.2byte MOVE_THUNDER_WAVE\n\t.2byte MOVE_GLARE\n\t.2byte MOVE_POISON_POWDER\n\t.2byte MOVE_SHADOW_BALL\n\t.2byte MOVE_DYNAMIC_PUNCH\n\t.2byte MOVE_HYPER_BEAM\n\t.2byte MOVE_EXTREME_SPEED\n\t.2byte MOVE_THIEF\n\t.2byte MOVE_COVET\n\t.2byte MOVE_ATTRACT\n\t.2byte MOVE_SWAGGER\n\t.2byte MOVE_TORMENT\n\t.2byte MOVE_FLATTER\n\t.2byte MOVE_TRICK\n\t.2byte MOVE_SUPERPOWER\n\t.2byte MOVE_SKILL_SWAP\n\t.2byte -1\n\nAI_CV_AttackUp::\n\tif_stat_level_less_than AI_USER, STAT_ATK, 9, AI_CV_AttackUp2\n\tif_random_less_than 100, AI_CV_AttackUp3\n\tscore -1\n\tgoto AI_CV_AttackUp3\n\nAI_CV_AttackUp2::\n\tif_hp_not_equal AI_USER, 100, AI_CV_AttackUp3\n\tif_random_less_than 128, AI_CV_AttackUp3\n\tscore +2\n\nAI_CV_AttackUp3::\n\tif_hp_more_than AI_USER, 70, AI_CV_AttackUp_End\n\tif_hp_less_than AI_USER, 40, AI_CV_AttackUp_ScoreDown2\n\tif_random_less_than 40, AI_CV_AttackUp_End\n\nAI_CV_AttackUp_ScoreDown2::\n\tscore -2\n\nAI_CV_AttackUp_End::\n\tend\n\nAI_CV_DefenseUp::\n\tif_stat_level_less_than AI_USER, STAT_DEF, 9, AI_CV_DefenseUp2\n\tif_random_less_than 100, AI_CV_DefenseUp3\n\tscore -1\n\tgoto AI_CV_DefenseUp3\n\nAI_CV_DefenseUp2::\n\tif_hp_not_equal AI_USER, 100, AI_CV_DefenseUp3\n\tif_random_less_than 128, AI_CV_DefenseUp3\n\tscore +2\n\nAI_CV_DefenseUp3::\n\tif_hp_less_than AI_USER, 70, AI_CV_DefenseUp4\n\tif_random_less_than 200, AI_CV_DefenseUp_End\n\nAI_CV_DefenseUp4::\n\tif_hp_less_than AI_USER, 40, AI_CV_DefenseUp_ScoreDown2\n\tget_last_used_move AI_TARGET\n\tget_move_power_from_result\n\tif_equal 0, AI_CV_DefenseUp5\n\tget_last_used_move AI_TARGET\n\tget_move_type_from_result\n\tif_not_in_bytes AI_CV_DefenseUp_PhysicalTypes, AI_CV_DefenseUp_ScoreDown2\n\tif_random_less_than 60, AI_CV_DefenseUp_End\n\nAI_CV_DefenseUp5::\n\tif_random_less_than 60, AI_CV_DefenseUp_End\n\nAI_CV_DefenseUp_ScoreDown2::\n\tscore -2\n\nAI_CV_DefenseUp_End::\n\tend\n\nAI_CV_DefenseUp_PhysicalTypes::\n\t.byte TYPE_NORMAL\n\t.byte TYPE_FIGHTING\n\t.byte TYPE_POISON\n\t.byte TYPE_GROUND\n\t.byte TYPE_FLYING\n\t.byte TYPE_ROCK\n\t.byte TYPE_BUG\n\t.byte TYPE_GHOST\n\t.byte TYPE_STEEL\n\t.byte -1\n\nAI_CV_SpeedUp::\n\tif_target_faster AI_CV_SpeedUp2\n\tscore -3\n\tgoto AI_CV_SpeedUp_End\n\nAI_CV_SpeedUp2::\n\tif_random_less_than 70, AI_CV_SpeedUp_End\n\tscore +3\n\nAI_CV_SpeedUp_End::\n\tend\n\nAI_CV_SpAtkUp::\n\tif_stat_level_less_than AI_USER, STAT_SPATK, 9, AI_CV_SpAtkUp2\n\tif_random_less_than 100, AI_CV_SpAtkUp3\n\tscore -1\n\tgoto AI_CV_SpAtkUp3\n\nAI_CV_SpAtkUp2::\n\tif_hp_not_equal AI_USER, 100, AI_CV_SpAtkUp3\n\tif_random_less_than 128, AI_CV_SpAtkUp3\n\tscore +2\n\nAI_CV_SpAtkUp3::\n\tif_hp_more_than AI_USER, 70, AI_CV_SpAtkUp_End\n\tif_hp_less_than AI_USER, 40, AI_CV_SpAtkUp_ScoreDown2\n\tif_random_less_than 70, AI_CV_SpAtkUp_End\n\nAI_CV_SpAtkUp_ScoreDown2::\n\tscore -2\n\nAI_CV_SpAtkUp_End::\n\tend\n\nAI_CV_SpDefUp::\n\tif_stat_level_less_than AI_USER, STAT_SPDEF, 9, AI_CV_SpDefUp2\n\tif_random_less_than 100, AI_CV_SpDefUp3\n\tscore -1\n\tgoto AI_CV_SpDefUp3\n\nAI_CV_SpDefUp2::\n\tif_hp_not_equal AI_USER, 100, AI_CV_SpDefUp3\n\tif_random_less_than 128, AI_CV_SpDefUp3\n\tscore +2\n\nAI_CV_SpDefUp3::\n\tif_hp_less_than AI_USER, 70, AI_CV_SpDefUp4\n\tif_random_less_than 200, AI_CV_SpDefUp_End\n\nAI_CV_SpDefUp4::\n\tif_hp_less_than AI_USER, 40, AI_CV_SpDefUp_ScoreDown2\n\tget_last_used_move AI_TARGET\n\tget_move_power_from_result\n\tif_equal 0, AI_CV_SpDefUp5\n\tget_last_used_move AI_TARGET\n\tget_move_type_from_result\n\tif_in_bytes AI_CV_SpDefUp_PhysicalTypes, AI_CV_SpDefUp_ScoreDown2\n\tif_random_less_than 60, AI_CV_SpDefUp_End\n\nAI_CV_SpDefUp5::\n\tif_random_less_than 60, AI_CV_SpDefUp_End\n\nAI_CV_SpDefUp_ScoreDown2::\n\tscore -2\n\nAI_CV_SpDefUp_End::\n\tend\n\nAI_CV_SpDefUp_PhysicalTypes::\n\t.byte TYPE_NORMAL\n\t.byte TYPE_FIGHTING\n\t.byte TYPE_POISON\n\t.byte TYPE_GROUND\n\t.byte TYPE_FLYING\n\t.byte TYPE_ROCK\n\t.byte TYPE_BUG\n\t.byte TYPE_GHOST\n\t.byte TYPE_STEEL\n\t.byte -1\n\nAI_CV_AccuracyUp::\n\tif_stat_level_less_than AI_USER, STAT_ACC, 9, AI_CV_AccuracyUp2\n\tif_random_less_than 50, AI_CV_AccuracyUp2\n\tscore -2\n\nAI_CV_AccuracyUp2::\n\tif_hp_more_than AI_USER, 70, AI_CV_AccuracyUp_End\n\tscore -2\n\nAI_CV_AccuracyUp_End::\n\tend\n\nAI_CV_EvasionUp::\n\tif_hp_less_than AI_USER, 90, AI_CV_EvasionUp2\n\tif_random_less_than 100, AI_CV_EvasionUp2\n\tscore +3\n\nAI_CV_EvasionUp2::\n\tif_stat_level_less_than AI_USER, STAT_EVASION, 9, AI_CV_EvasionUp3\n\tif_random_less_than 128, AI_CV_EvasionUp3\n\tscore -1\n\nAI_CV_EvasionUp3::\n\tif_not_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_EvasionUp5\n\tif_hp_more_than AI_USER, 50, AI_CV_EvasionUp4\n\tif_random_less_than 80, AI_CV_EvasionUp5\n\nAI_CV_EvasionUp4::\n\tif_random_less_than 50, AI_CV_EvasionUp5\n\tscore +3\n\nAI_CV_EvasionUp5::\n\tif_not_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_EvasionUp6\n\tif_random_less_than 70, AI_CV_EvasionUp6\n\tscore +3\n\nAI_CV_EvasionUp6::\n\tif_not_status3 AI_USER, STATUS3_ROOTED, AI_CV_EvasionUp7\n\tif_random_less_than 128, AI_CV_EvasionUp7\n\tscore +2\n\nAI_CV_EvasionUp7::\n\tif_not_status2 AI_TARGET, STATUS2_CURSED, AI_CV_EvasionUp8\n\tif_random_less_than 70, AI_CV_EvasionUp8\n\tscore +3\n\nAI_CV_EvasionUp8::\n\tif_hp_more_than AI_USER, 70, AI_CV_EvasionUp_End\n\tif_stat_level_equal AI_USER, STAT_EVASION, 6, AI_CV_EvasionUp_End\n\tif_hp_less_than AI_USER, 40, AI_CV_EvasionUp_ScoreDown2\n\tif_hp_less_than AI_TARGET, 40, AI_CV_EvasionUp_ScoreDown2\n\tif_random_less_than 70, AI_CV_EvasionUp_End\n\nAI_CV_EvasionUp_ScoreDown2::\n\tscore -2\n\nAI_CV_EvasionUp_End::\n\tend\n\nAI_CV_AlwaysHit::\n\tif_stat_level_more_than AI_TARGET, STAT_EVASION, 10, AI_CV_AlwaysHit_ScoreUp1\n\tif_stat_level_less_than AI_USER, STAT_ACC, 2, AI_CV_AlwaysHit_ScoreUp1\n\tif_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_AlwaysHit2\n\tif_stat_level_less_than AI_USER, STAT_ACC, 4, AI_CV_AlwaysHit2\n\tgoto AI_CV_AlwaysHit_End\n\nAI_CV_AlwaysHit_ScoreUp1::\n\tscore +1\n\nAI_CV_AlwaysHit2::\n\tif_random_less_than 100, AI_CV_AlwaysHit_End\n\tscore +1\n\nAI_CV_AlwaysHit_End::\n\tend\n\nAI_CV_AttackDown::\n\tif_stat_level_equal AI_TARGET, STAT_ATK, 6, AI_CV_AttackDown3\n\tscore -1\n\tif_hp_more_than AI_USER, 90, AI_CV_AttackDown2\n\tscore -1\n\nAI_CV_AttackDown2::\n\tif_stat_level_more_than AI_TARGET, STAT_ATK, 3, AI_CV_AttackDown3\n\tif_random_less_than 50, AI_CV_AttackDown3\n\tscore -2\n\nAI_CV_AttackDown3::\n\tif_hp_more_than AI_TARGET, 70, AI_CV_AttackDown4\n\tscore -2\n\nAI_CV_AttackDown4::\n\tget_target_type1\n\tif_in_bytes AI_CV_AttackDown_PhysicalTypeList, AI_CV_AttackDown_End\n\tget_target_type2\n\tif_in_bytes AI_CV_AttackDown_PhysicalTypeList, AI_CV_AttackDown_End\n\tif_random_less_than 50, AI_CV_AttackDown_End\n\tscore -2\n\nAI_CV_AttackDown_End::\n\tend\n\n@ Missing Poison, Flying, and Ghost for unknown reason\nAI_CV_AttackDown_PhysicalTypeList::\n\t.byte TYPE_NORMAL\n\t.byte TYPE_FIGHTING\n\t.byte TYPE_GROUND\n\t.byte TYPE_ROCK\n\t.byte TYPE_BUG\n\t.byte TYPE_STEEL\n\t.byte -1\n\nAI_CV_DefenseDown::\n\tif_hp_less_than AI_USER, 70, AI_CV_DefenseDown2\n\tif_stat_level_more_than AI_TARGET, STAT_DEF, 3, AI_CV_DefenseDown3\n\nAI_CV_DefenseDown2::\n\tif_random_less_than 50, AI_CV_DefenseDown3\n\tscore -2\n\nAI_CV_DefenseDown3::\n\tif_hp_more_than AI_TARGET, 70, AI_CV_DefenseDown_End\n\tscore -2\n\nAI_CV_DefenseDown_End::\n\tend\n\nAI_CV_SpeedDownFromChance::\n\tif_move MOVE_ICY_WIND, AI_CV_SpeedDown\n\tif_move MOVE_ROCK_TOMB, AI_CV_SpeedDown\n\tif_move MOVE_MUD_SHOT, AI_CV_SpeedDown\n\tend\n\nAI_CV_SpeedDown::\n\tif_target_faster AI_CV_SpeedDown2\n\tscore -3\n\tgoto AI_CV_SpeedDown_End\n\nAI_CV_SpeedDown2::\n\tif_random_less_than 70, AI_CV_SpeedDown_End\n\tscore +2\n\nAI_CV_SpeedDown_End::\n\tend\n\nAI_CV_SpAtkDown::\n\tif_stat_level_equal AI_TARGET, STAT_ATK, 6, AI_CV_SpAtkDown3\n\tscore -1\n\tif_hp_more_than AI_USER, 90, AI_CV_SpAtkDown2\n\tscore -1\n\nAI_CV_SpAtkDown2::\n\tif_stat_level_more_than AI_TARGET, STAT_SPATK, 3, AI_CV_SpAtkDown3\n\tif_random_less_than 50, AI_CV_SpAtkDown3\n\tscore -2\n\nAI_CV_SpAtkDown3::\n\tif_hp_more_than AI_TARGET, 70, AI_CV_SpAtkDown4\n\tscore -2\n\nAI_CV_SpAtkDown4::\n\tget_target_type1\n\tif_in_bytes AI_CV_SpAtkDown_SpecialTypeList, AI_CV_SpAtkDown_End\n\tget_target_type2\n\tif_in_bytes AI_CV_SpAtkDown_SpecialTypeList, AI_CV_SpAtkDown_End\n\tif_random_less_than 50, AI_CV_SpAtkDown_End\n\tscore -2\n\nAI_CV_SpAtkDown_End::\n\tend\n\nAI_CV_SpAtkDown_SpecialTypeList::\n\t.byte TYPE_FIRE\n\t.byte TYPE_WATER\n\t.byte TYPE_GRASS\n\t.byte TYPE_ELECTRIC\n\t.byte TYPE_PSYCHIC\n\t.byte TYPE_ICE\n\t.byte TYPE_DRAGON\n\t.byte TYPE_DARK\n\t.byte -1\n\nAI_CV_SpDefDown::\n\tif_hp_less_than AI_USER, 70, AI_CV_SpDefDown2\n\tif_stat_level_more_than AI_TARGET, STAT_SPDEF, 3, AI_CV_SpDefDown3\n\nAI_CV_SpDefDown2::\n\tif_random_less_than 50, AI_CV_SpDefDown3\n\tscore -2\n\nAI_CV_SpDefDown3::\n\tif_hp_more_than AI_TARGET, 70, AI_CV_SpDefDown_End\n\tscore -2\n\nAI_CV_SpDefDown_End::\n\tend\n\nAI_CV_AccuracyDown::\n\tif_hp_less_than AI_USER, 70, AI_CV_AccuracyDown2\n\tif_hp_more_than AI_TARGET, 70, AI_CV_AccuracyDown3\n\nAI_CV_AccuracyDown2::\n\tif_random_less_than 100, AI_CV_AccuracyDown3\n\tscore -1\n\nAI_CV_AccuracyDown3::\n\tif_stat_level_more_than AI_USER, STAT_ACC, 4, AI_CV_AccuracyDown4\n\tif_random_less_than 80, AI_CV_AccuracyDown4\n\tscore -2\n\nAI_CV_AccuracyDown4::\n\tif_not_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_AccuracyDown5\n\tif_random_less_than 70, AI_CV_AccuracyDown5\n\tscore +2\n\nAI_CV_AccuracyDown5::\n\tif_not_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_AccuracyDown6\n\tif_random_less_than 70, AI_CV_AccuracyDown6\n\tscore +2\n\nAI_CV_AccuracyDown6::\n\tif_not_status3 AI_USER, STATUS3_ROOTED, AI_CV_AccuracyDown7\n\tif_random_less_than 128, AI_CV_AccuracyDown7\n\tscore +1\n\nAI_CV_AccuracyDown7::\n\tif_not_status2 AI_TARGET, STATUS2_CURSED, AI_CV_AccuracyDown8\n\tif_random_less_than 70, AI_CV_AccuracyDown8\n\tscore +2\n\nAI_CV_AccuracyDown8::\n\tif_hp_more_than AI_USER, 70, AI_CV_AccuracyDown_End\n\tif_stat_level_equal AI_TARGET, STAT_ACC, 6, AI_CV_AccuracyDown_End\n\tif_hp_less_than AI_USER, 40, AI_CV_AccuracyDown_ScoreDown2\n\tif_hp_less_than AI_TARGET, 40, AI_CV_AccuracyDown_ScoreDown2\n\tif_random_less_than 70, AI_CV_AccuracyDown_End\n\nAI_CV_AccuracyDown_ScoreDown2::\n\tscore -2\n\nAI_CV_AccuracyDown_End::\n\tend\n\nAI_CV_EvasionDown::\n\tif_hp_less_than AI_USER, 70, AI_CV_EvasionDown2\n\tif_stat_level_more_than AI_TARGET, STAT_EVASION, 3, AI_CV_EvasionDown3\n\nAI_CV_EvasionDown2::\n\tif_random_less_than 50, AI_CV_EvasionDown3\n\tscore -2\n\nAI_CV_EvasionDown3::\n\tif_hp_more_than AI_TARGET, 70, AI_CV_EvasionDown_End\n\tscore -2\n\nAI_CV_EvasionDown_End::\n\tend\n\nAI_CV_Haze::\n\tif_stat_level_more_than AI_USER, STAT_ATK, 8, AI_CV_Haze2\n\tif_stat_level_more_than AI_USER, STAT_DEF, 8, AI_CV_Haze2\n\tif_stat_level_more_than AI_USER, STAT_SPATK, 8, AI_CV_Haze2\n\tif_stat_level_more_than AI_USER, STAT_SPDEF, 8, AI_CV_Haze2\n\tif_stat_level_more_than AI_USER, STAT_EVASION, 8, AI_CV_Haze2\n\tif_stat_level_less_than AI_TARGET, STAT_ATK, 4, AI_CV_Haze2\n\tif_stat_level_less_than AI_TARGET, STAT_DEF, 4, AI_CV_Haze2\n\tif_stat_level_less_than AI_TARGET, STAT_SPATK, 4, AI_CV_Haze2\n\tif_stat_level_less_than AI_TARGET, STAT_SPDEF, 4, AI_CV_Haze2\n\tif_stat_level_less_than AI_TARGET, STAT_ACC, 4, AI_CV_Haze2\n\tgoto AI_CV_Haze3\n\nAI_CV_Haze2::\n\tif_random_less_than 50, AI_CV_Haze3\n\tscore -3\n\nAI_CV_Haze3::\n\tif_stat_level_more_than AI_TARGET, STAT_ATK, 8, AI_CV_Haze4\n\tif_stat_level_more_than AI_TARGET, STAT_DEF, 8, AI_CV_Haze4\n\tif_stat_level_more_than AI_TARGET, STAT_SPATK, 8, AI_CV_Haze4\n\tif_stat_level_more_than AI_TARGET, STAT_SPDEF, 8, AI_CV_Haze4\n\tif_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_Haze4\n\tif_stat_level_less_than AI_USER, STAT_ATK, 4, AI_CV_Haze4\n\tif_stat_level_less_than AI_USER, STAT_DEF, 4, AI_CV_Haze4\n\tif_stat_level_less_than AI_USER, STAT_SPATK, 4, AI_CV_Haze4\n\tif_stat_level_less_than AI_USER, STAT_SPDEF, 4, AI_CV_Haze4\n\tif_stat_level_less_than AI_USER, STAT_ACC, 4, AI_CV_Haze4\n\tif_random_less_than 50, AI_CV_Haze_End\n\tscore -1\n\tgoto AI_CV_Haze_End\n\nAI_CV_Haze4::\n\tif_random_less_than 50, AI_CV_Haze_End\n\tscore +3\n\nAI_CV_Haze_End::\n\tend\n\nAI_CV_Bide::\n\tif_hp_more_than AI_USER, 90, AI_CV_Bide_End\n\tscore -2\n\nAI_CV_Bide_End::\n\tend\n\nAI_CV_Roar::\n\tif_stat_level_more_than AI_TARGET, STAT_ATK, 8, AI_CV_Roar2\n\tif_stat_level_more_than AI_TARGET, STAT_DEF, 8, AI_CV_Roar2\n\tif_stat_level_more_than AI_TARGET, STAT_SPATK, 8, AI_CV_Roar2\n\tif_stat_level_more_than AI_TARGET, STAT_SPDEF, 8, AI_CV_Roar2\n\tif_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_Roar2\n\tscore -3\n\tgoto AI_CV_Roar_End\n\nAI_CV_Roar2::\n\tif_random_less_than 128, AI_CV_Roar_End\n\tscore +2\n\nAI_CV_Roar_End::\n\tend\n\nAI_CV_Conversion::\n\tif_hp_more_than AI_USER, 90, AI_CV_Conversion2\n\tscore -2\n\nAI_CV_Conversion2::\n\tget_turn_count\n\tif_equal 0, AI_CV_Conversion_End\n\tif_random_less_than 200, Score_Minus2\n\nAI_CV_Conversion_End::\n\tend\n\nAI_CV_HealWeather::\n\tget_weather\n\tif_equal AI_WEATHER_HAIL, AI_CV_HealWeather_ScoreDown2\n\tif_equal AI_WEATHER_RAIN, AI_CV_HealWeather_ScoreDown2\n\tif_equal AI_WEATHER_SANDSTORM, AI_CV_HealWeather_ScoreDown2\n\tgoto AI_CV_Heal\n\nAI_CV_HealWeather_ScoreDown2::\n\tscore -2\n\nAI_CV_Heal::\n\tif_hp_equal AI_USER, 100, AI_CV_Heal3\n\tif_target_faster AI_CV_Heal4\n\tscore -8\n\tgoto AI_CV_Heal_End\n\n@ Never reached\nAI_CV_Heal2:\n\tif_hp_less_than AI_USER, 50, AI_CV_Heal5\n\tif_hp_more_than AI_USER, 80, AI_CV_Heal3\n\tif_random_less_than 70, AI_CV_Heal5\n\nAI_CV_Heal3::\n\tscore -3\n\tgoto AI_CV_Heal_End\n\nAI_CV_Heal4::\n\tif_hp_less_than AI_USER, 70, AI_CV_Heal5\n\tif_random_less_than 30, AI_CV_Heal5\n\tscore -3\n\tgoto AI_CV_Heal_End\n\nAI_CV_Heal5::\n\tif_doesnt_have_move_with_effect AI_TARGET, EFFECT_SNATCH, AI_CV_Heal6\n\tif_random_less_than 100, AI_CV_Heal_End\n\nAI_CV_Heal6::\n\tif_random_less_than 20, AI_CV_Heal_End\n\tscore +2\n\nAI_CV_Heal_End::\n\tend\n\nAI_CV_Toxic::\n\tif_user_has_no_attacking_moves AI_CV_Toxic3\n\tif_hp_more_than AI_USER, 50, AI_CV_Toxic2\n\tif_random_less_than 50, AI_CV_Toxic2\n\tscore -3\n\nAI_CV_Toxic2::\n\tif_hp_more_than AI_TARGET, 50, AI_CV_Toxic3\n\tif_random_less_than 50, AI_CV_Toxic3\n\tscore -3\n\nAI_CV_Toxic3::\n\tif_has_move_with_effect AI_USER, EFFECT_SPECIAL_DEFENSE_UP, AI_CV_Toxic4\n\tif_has_move_with_effect AI_USER, EFFECT_PROTECT, AI_CV_Toxic4\n\tgoto AI_CV_Toxic_End\n\nAI_CV_Toxic4::\n\tif_random_less_than 60, AI_CV_Toxic_End\n\tscore +2\n\nAI_CV_Toxic_End::\n\tend\n\nAI_CV_LightScreen::\n\tif_hp_less_than AI_USER, 50, AI_CV_LightScreen_ScoreDown2\n\tget_target_type1\n\tif_in_bytes AI_CV_LightScreen_SpecialTypeList, AI_CV_LightScreen_End\n\tget_target_type2\n\tif_in_bytes AI_CV_LightScreen_SpecialTypeList, AI_CV_LightScreen_End\n\tif_random_less_than 50, AI_CV_LightScreen_End\n\nAI_CV_LightScreen_ScoreDown2::\n\tscore -2\n\nAI_CV_LightScreen_End::\n\tend\n\nAI_CV_LightScreen_SpecialTypeList::\n\t.byte TYPE_FIRE\n\t.byte TYPE_WATER\n\t.byte TYPE_GRASS\n\t.byte TYPE_ELECTRIC\n\t.byte TYPE_PSYCHIC\n\t.byte TYPE_ICE\n\t.byte TYPE_DRAGON\n\t.byte TYPE_DARK\n\t.byte -1\n\nAI_CV_Rest::\n\tif_target_faster AI_CV_Rest4\n\tif_hp_not_equal AI_USER, 100, AI_CV_Rest2\n\tscore -8\n\tgoto AI_CV_Rest_End\n\nAI_CV_Rest2::\n\tif_hp_less_than AI_USER, 40, AI_CV_Rest6\n\tif_hp_more_than AI_USER, 50, AI_CV_Rest3\n\tif_random_less_than 70, AI_CV_Rest6\n\nAI_CV_Rest3::\n\tscore -3\n\tgoto AI_CV_Rest_End\n\nAI_CV_Rest4::\n\tif_hp_less_than AI_USER, 60, AI_CV_Rest6\n\tif_hp_more_than AI_USER, 70, AI_CV_Rest5\n\tif_random_less_than 50, AI_CV_Rest6\n\nAI_CV_Rest5::\n\tscore -3\n\tgoto AI_CV_Rest_End\n\nAI_CV_Rest6::\n\tif_doesnt_have_move_with_effect AI_TARGET, EFFECT_SNATCH, AI_CV_Rest7\n\tif_random_less_than 50, AI_CV_Rest_End\n\nAI_CV_Rest7::\n\tif_random_less_than 10, AI_CV_Rest_End\n\tscore +3\n\nAI_CV_Rest_End::\n\tend\n\nAI_CV_OneHitKO::\n\tend\n\nAI_CV_SuperFang::\n\tif_hp_more_than AI_TARGET, 50, AI_CV_SuperFang_End\n\tscore -1\n\nAI_CV_SuperFang_End::\n\tend\n\nAI_CV_Trap::\n\tif_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_Trap2\n\tif_status2 AI_TARGET, STATUS2_CURSED, AI_CV_Trap2\n\tif_status3 AI_TARGET, STATUS3_PERISH_SONG, AI_CV_Trap2\n\tif_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Trap2\n\tgoto AI_CV_Trap_End\n\nAI_CV_Trap2::\n\tif_random_less_than 128, AI_CV_Trap_End\n\tscore +1\n\nAI_CV_Trap_End::\n\tend\n\nAI_CV_HighCrit::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_HighCrit_End\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_HighCrit_End\n\tif_type_effectiveness AI_EFFECTIVENESS_x2, AI_CV_HighCrit2\n\tif_type_effectiveness AI_EFFECTIVENESS_x4, AI_CV_HighCrit2\n\tif_random_less_than 128, AI_CV_HighCrit_End\n\nAI_CV_HighCrit2::\n\tif_random_less_than 128, AI_CV_HighCrit_End\n\tscore +1\n\nAI_CV_HighCrit_End::\n\tend\n\nAI_CV_Swagger:\n\tif_has_move AI_USER, MOVE_PSYCH_UP, AI_CV_SwaggerHasPsychUp\n\nAI_CV_Flatter::\n\tif_random_less_than 128, AI_CV_Confuse\n\tscore +1\n\nAI_CV_Confuse::\n\tif_hp_more_than AI_TARGET, 70, AI_CV_Confuse_End\n\tif_random_less_than 128, AI_CV_Confuse2\n\tscore -1\n\nAI_CV_Confuse2::\n\tif_hp_more_than AI_TARGET, 50, AI_CV_Confuse_End\n\tscore -1\n\tif_hp_more_than AI_TARGET, 30, AI_CV_Confuse_End\n\tscore -1\n\nAI_CV_Confuse_End::\n\tend\n\n\nAI_CV_SwaggerHasPsychUp:\n\tif_stat_level_more_than AI_TARGET, STAT_ATK, 3, AI_CV_SwaggerHasPsychUp_Minus5\n\tscore +3\n\tget_turn_count\n\tif_not_equal 0, AI_CV_SwaggerHasPsychUp_End\n\tscore +2\n\tgoto AI_CV_SwaggerHasPsychUp_End\n\nAI_CV_SwaggerHasPsychUp_Minus5:\n\tscore -5\n\nAI_CV_SwaggerHasPsychUp_End:\n\tend\n\nAI_CV_Reflect::\n\tif_hp_less_than AI_USER, 50, AI_CV_Reflect_ScoreDown2\n\tget_target_type1\n\tif_in_bytes AI_CV_Reflect_PhysicalTypeList, AI_CV_Reflect_End\n\tget_target_type2\n\tif_in_bytes AI_CV_Reflect_PhysicalTypeList, AI_CV_Reflect_End\n\tif_random_less_than 50, AI_CV_Reflect_End\n\nAI_CV_Reflect_ScoreDown2::\n\tscore -2\n\nAI_CV_Reflect_End::\n\tend\n\nAI_CV_Reflect_PhysicalTypeList::\n\t.byte TYPE_NORMAL\n\t.byte TYPE_FIGHTING\n\t.byte TYPE_FLYING\n\t.byte TYPE_POISON\n\t.byte TYPE_GROUND\n\t.byte TYPE_ROCK\n\t.byte TYPE_BUG\n\t.byte TYPE_GHOST\n\t.byte TYPE_STEEL\n\t.byte -1\n\nAI_CV_Poison::\n\tif_hp_less_than AI_USER, 50, AI_CV_Poison_ScoreDown1\n\tif_hp_more_than AI_TARGET, 50, AI_CV_Poison_End\n\nAI_CV_Poison_ScoreDown1::\n\tscore -1\n\nAI_CV_Poison_End::\n\tend\n\nAI_CV_Paralyze::\n\tif_target_faster AI_CV_Paralyze2\n\tif_hp_more_than AI_USER, 70, AI_CV_Paralyze_End\n\tscore -1\n\tgoto AI_CV_Paralyze_End\n\nAI_CV_Paralyze2::\n\tif_random_less_than 20, AI_CV_Paralyze_End\n\tscore +3\n\nAI_CV_Paralyze_End::\n\tend\n\nAI_CV_VitalThrow::\n\tif_target_faster AI_CV_VitalThrow_End\n\tif_hp_more_than AI_USER, 60, AI_CV_VitalThrow_End\n\tif_hp_less_than AI_USER, 40, AI_CV_VitalThrow2\n\tif_random_less_than 180, AI_CV_VitalThrow_End\n\nAI_CV_VitalThrow2::\n\tif_random_less_than 50, AI_CV_VitalThrow_End\n\tscore -1\n\nAI_CV_VitalThrow_End::\n\tend\n\nAI_CV_Substitute::\n\tif_hp_more_than AI_USER, 90, AI_CV_Substitute4\n\tif_hp_more_than AI_USER, 70, AI_CV_Substitute3\n\tif_hp_more_than AI_USER, 50, AI_CV_Substitute2\n\tif_random_less_than 100, AI_CV_Substitute2\n\tscore -1\n\nAI_CV_Substitute2::\n\tif_random_less_than 100, AI_CV_Substitute3\n\tscore -1\n\nAI_CV_Substitute3::\n\tif_random_less_than 100, AI_CV_Substitute4\n\tscore -1\n\nAI_CV_Substitute4::\n\tif_target_faster AI_CV_Substitute_End\n\tget_last_used_move AI_TARGET\n\tget_move_effect_from_result\n\tif_equal EFFECT_SLEEP, AI_CV_Substitute5\n\tif_equal EFFECT_TOXIC, AI_CV_Substitute5\n\tif_equal EFFECT_POISON, AI_CV_Substitute5\n\tif_equal EFFECT_PARALYZE, AI_CV_Substitute5\n\tif_equal EFFECT_WILL_O_WISP, AI_CV_Substitute5\n\tif_equal EFFECT_CONFUSE, AI_CV_Substitute6\n\tif_equal EFFECT_LEECH_SEED, AI_CV_Substitute7\n\tgoto AI_CV_Substitute_End\n\nAI_CV_Substitute5::\n\tif_not_status AI_TARGET, STATUS1_ANY, AI_CV_Substitute8\n\tgoto AI_CV_Substitute_End\n\nAI_CV_Substitute6::\n\tif_not_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_Substitute8\n\tgoto AI_CV_Substitute_End\n\nAI_CV_Substitute7::\n\tif_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_Substitute_End\n\nAI_CV_Substitute8::\n\tif_random_less_than 100, AI_CV_Substitute_End\n\tscore +1\n\nAI_CV_Substitute_End::\n\tend\n\nAI_CV_Recharge::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_Recharge_ScoreDown1\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_Recharge_ScoreDown1\n\tif_target_faster AI_CV_Recharge2\n\tif_hp_more_than AI_USER, 40, AI_CV_Recharge_ScoreDown1\n\tgoto AI_CV_Recharge_End\n\nAI_CV_Recharge2::\n\tif_hp_less_than AI_USER, 60, AI_CV_Recharge_End\n\nAI_CV_Recharge_ScoreDown1::\n\tscore -1\n\nAI_CV_Recharge_End::\n\tend\n\nAI_CV_Disable::\n\tif_target_faster AI_CV_Disable_End\n\tget_last_used_move AI_TARGET\n\tget_move_power_from_result\n\tif_equal 0, AI_CV_Disable2\n\tscore +1\n\tgoto AI_CV_Disable_End\n\nAI_CV_Disable2::\n\tif_random_less_than 100, AI_CV_Disable_End\n\tscore -1\n\nAI_CV_Disable_End::\n\tend\n\nAI_CV_Counter::\n\tif_status AI_TARGET, STATUS1_SLEEP, AI_CV_Counter_ScoreDown1\n\tif_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Counter_ScoreDown1\n\tif_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_Counter_ScoreDown1\n\tif_hp_more_than AI_USER, 30, AI_CV_Counter2\n\tif_random_less_than 10, AI_CV_Counter2\n\tscore -1\n\nAI_CV_Counter2::\n\tif_hp_more_than AI_USER, 50, AI_CV_Counter3\n\tif_random_less_than 100, AI_CV_Counter3\n\tscore -1\n\nAI_CV_Counter3::\n\tif_has_move AI_USER, MOVE_MIRROR_COAT, AI_CV_Counter7\n\tget_last_used_move AI_TARGET\n\tget_move_power_from_result\n\tif_equal 0, AI_CV_Counter5\n\tif_target_not_taunted AI_CV_Counter4\n\tif_random_less_than 100, AI_CV_Counter4\n\tscore +1\n\nAI_CV_Counter4::\n\tget_last_used_move AI_TARGET\n\tget_move_type_from_result\n\tif_not_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_ScoreDown1\n\tif_random_less_than 100, AI_CV_Counter_End\n\tscore +1\n\tgoto AI_CV_Counter_End\n\nAI_CV_Counter5::\n\tif_target_not_taunted AI_CV_Counter6\n\tif_random_less_than 100, AI_CV_Counter6\n\tscore +1\n\nAI_CV_Counter6::\n\tget_target_type1\n\tif_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_End\n\tget_target_type2\n\tif_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_End\n\tif_random_less_than 50, AI_CV_Counter_End\n\nAI_CV_Counter7:\n\tif_random_less_than 100, AI_CV_Counter8\n\tscore +4\n\nAI_CV_Counter8:\n\tend\n\nAI_CV_Counter_ScoreDown1::\n\tscore -1\n\nAI_CV_Counter_End::\n\tend\n\nAI_CV_Counter_PhysicalTypeList::\n\t.byte TYPE_NORMAL\n\t.byte TYPE_FIGHTING\n\t.byte TYPE_FLYING\n\t.byte TYPE_POISON\n\t.byte TYPE_GROUND\n\t.byte TYPE_ROCK\n\t.byte TYPE_BUG\n\t.byte TYPE_GHOST\n\t.byte TYPE_STEEL\n\t.byte -1\n\nAI_CV_Encore::\n\tif_any_move_disabled AI_TARGET, AI_CV_Encore2\n\tif_target_faster AI_CV_Encore_ScoreDown2\n\tget_last_used_move AI_TARGET\n\tget_move_effect_from_result\n\tif_not_in_bytes AI_CV_Encore_EncouragedMovesToEncore, AI_CV_Encore_ScoreDown2\n\nAI_CV_Encore2::\n\tif_random_less_than 30, AI_CV_Encore_End\n\tscore +3\n\tgoto AI_CV_Encore_End\n\nAI_CV_Encore_ScoreDown2::\n\tscore -2\n\nAI_CV_Encore_End::\n\tend\n\nAI_CV_Encore_EncouragedMovesToEncore::\n\t.byte EFFECT_DREAM_EATER\n\t.byte EFFECT_ATTACK_UP\n\t.byte EFFECT_DEFENSE_UP\n\t.byte EFFECT_SPEED_UP\n\t.byte EFFECT_SPECIAL_ATTACK_UP\n\t.byte EFFECT_HAZE\n\t.byte EFFECT_ROAR\n\t.byte EFFECT_CONVERSION\n\t.byte EFFECT_TOXIC\n\t.byte EFFECT_LIGHT_SCREEN\n\t.byte EFFECT_REST\n\t.byte EFFECT_SUPER_FANG\n\t.byte EFFECT_SPECIAL_DEFENSE_UP_2\n\t.byte EFFECT_CONFUSE\n\t.byte EFFECT_POISON\n\t.byte EFFECT_PARALYZE\n\t.byte EFFECT_LEECH_SEED\n\t.byte EFFECT_SPLASH\n\t.byte EFFECT_ATTACK_UP_2\n\t.byte EFFECT_ENCORE\n\t.byte EFFECT_CONVERSION_2\n\t.byte EFFECT_LOCK_ON\n\t.byte EFFECT_HEAL_BELL\n\t.byte EFFECT_MEAN_LOOK\n\t.byte EFFECT_NIGHTMARE\n\t.byte EFFECT_PROTECT\n\t.byte EFFECT_SKILL_SWAP\n\t.byte EFFECT_FORESIGHT\n\t.byte EFFECT_PERISH_SONG\n\t.byte EFFECT_SANDSTORM\n\t.byte EFFECT_ENDURE\n\t.byte EFFECT_SWAGGER\n\t.byte EFFECT_ATTRACT\n\t.byte EFFECT_SAFEGUARD\n\t.byte EFFECT_RAIN_DANCE\n\t.byte EFFECT_SUNNY_DAY\n\t.byte EFFECT_BELLY_DRUM\n\t.byte EFFECT_PSYCH_UP\n\t.byte EFFECT_FUTURE_SIGHT\n\t.byte EFFECT_FAKE_OUT\n\t.byte EFFECT_STOCKPILE\n\t.byte EFFECT_SPIT_UP\n\t.byte EFFECT_SWALLOW\n\t.byte EFFECT_HAIL\n\t.byte EFFECT_TORMENT\n\t.byte EFFECT_WILL_O_WISP\n\t.byte EFFECT_FOLLOW_ME\n\t.byte EFFECT_CHARGE\n\t.byte EFFECT_TRICK\n\t.byte EFFECT_ROLE_PLAY\n\t.byte EFFECT_INGRAIN\n\t.byte EFFECT_RECYCLE\n\t.byte EFFECT_KNOCK_OFF\n\t.byte EFFECT_SKILL_SWAP\n\t.byte EFFECT_IMPRISON\n\t.byte EFFECT_REFRESH\n\t.byte EFFECT_GRUDGE\n\t.byte EFFECT_TEETER_DANCE\n\t.byte EFFECT_MUD_SPORT\n\t.byte EFFECT_WATER_SPORT\n\t.byte EFFECT_DRAGON_DANCE\n\t.byte EFFECT_CAMOUFLAGE\n\t.byte -1\n\nAI_CV_PainSplit::\n\tif_hp_less_than AI_TARGET, 80, AI_CV_PainSplit_ScoreDown1\n\tif_target_faster AI_CV_PainSplit2\n\tif_hp_more_than AI_USER, 40, AI_CV_PainSplit_ScoreDown1\n\tscore +1\n\tgoto AI_CV_PainSplit_End\n\nAI_CV_PainSplit2::\n\tif_hp_more_than AI_USER, 60, AI_CV_PainSplit_ScoreDown1\n\tscore +1\n\tgoto AI_CV_PainSplit_End\n\nAI_CV_PainSplit_ScoreDown1::\n\tscore -1\n\nAI_CV_PainSplit_End::\n\tend\n\nAI_CV_Snore::\n\tscore +2\n\tend\n\nAI_CV_LockOn::\n\tif_random_less_than 128, AI_CV_LockOn_End\n\tscore +2\n\nAI_CV_LockOn_End::\n\tend\n\nAI_CV_SleepTalk::\n\tif_status AI_USER, STATUS1_SLEEP, Score_Plus10\n\tscore -5\n\tend\n\nAI_CV_DestinyBond::\n\tscore -1\n\tif_target_faster AI_CV_DestinyBond_End\n\tif_hp_more_than AI_USER, 70, AI_CV_DestinyBond_End\n\tif_random_less_than 128, AI_CV_DestinyBond2\n\tscore +1\n\nAI_CV_DestinyBond2::\n\tif_hp_more_than AI_USER, 50, AI_CV_DestinyBond_End\n\tif_random_less_than 128, AI_CV_DestinyBond3\n\tscore +1\n\nAI_CV_DestinyBond3::\n\tif_hp_more_than AI_USER, 30, AI_CV_DestinyBond_End\n\tif_random_less_than 100, AI_CV_DestinyBond_End\n\tscore +2\n\nAI_CV_DestinyBond_End::\n\tend\n\nAI_CV_Flail::\n\tif_target_faster AI_CV_Flail2\n\tif_hp_more_than AI_USER, 33, AI_CV_Flail_ScoreDown1\n\tif_hp_more_than AI_USER, 20, AI_CV_Flail_End\n\tif_hp_less_than AI_USER, 8, AI_CV_Flail_ScoreUp1\n\tgoto AI_CV_Flail3\n\nAI_CV_Flail2::\n\tif_hp_more_than AI_USER, 60, AI_CV_Flail_ScoreDown1\n\tif_hp_more_than AI_USER, 40, AI_CV_Flail_End\n\tgoto AI_CV_Flail3\n\nAI_CV_Flail_ScoreUp1::\n\tscore +1\n\nAI_CV_Flail3::\n\tif_random_less_than 100, AI_CV_Flail_End\n\tscore +1\n\tgoto AI_CV_Flail_End\n\nAI_CV_Flail_ScoreDown1::\n\tscore -1\n\nAI_CV_Flail_End::\n\tend\n\nAI_CV_HealBell::\n\tif_status AI_TARGET, STATUS1_ANY, AI_CV_HealBell_End\n\tif_status_in_party AI_TARGET, STATUS1_ANY, AI_CV_HealBell_End\n\tscore -5\n\nAI_CV_HealBell_End::\n\tend\n\nAI_CV_Thief::\n\tget_hold_effect AI_TARGET\n\tif_not_in_bytes AI_CV_Thief_EncourageItemsToSteal, AI_CV_Thief_ScoreDown2\n\tif_random_less_than 50, AI_CV_Thief_End\n\tscore +1\n\tgoto AI_CV_Thief_End\n\nAI_CV_Thief_ScoreDown2::\n\tscore -2\n\nAI_CV_Thief_End::\n\tend\n\nAI_CV_Thief_EncourageItemsToSteal::\n\t.byte HOLD_EFFECT_CURE_SLP\n\t.byte HOLD_EFFECT_CURE_STATUS\n\t.byte HOLD_EFFECT_RESTORE_HP\n\t.byte HOLD_EFFECT_EVASION_UP\n\t.byte HOLD_EFFECT_LEFTOVERS\n\t.byte HOLD_EFFECT_LIGHT_BALL\n\t.byte HOLD_EFFECT_THICK_CLUB\n\t.byte -1\n\nAI_CV_Curse::\n\tget_user_type1\n\tif_equal TYPE_GHOST, AI_CV_Curse4\n\tget_user_type2\n\tif_equal TYPE_GHOST, AI_CV_Curse4\n\tif_stat_level_more_than AI_USER, STAT_DEF, 9, AI_CV_Curse_End\n\tif_random_less_than 128, AI_CV_Curse2\n\tscore +1\n\nAI_CV_Curse2::\n\tif_stat_level_more_than AI_USER, STAT_DEF, 7, AI_CV_Curse_End\n\tif_random_less_than 128, AI_CV_Curse3\n\tscore +1\n\nAI_CV_Curse3::\n\tif_stat_level_more_than AI_USER, STAT_DEF, 6, AI_CV_Curse_End\n\tif_random_less_than 128, AI_CV_Curse_End\n\tscore +1\n\tgoto AI_CV_Curse_End\n\nAI_CV_Curse4::\n\tif_hp_more_than AI_USER, 80, AI_CV_Curse_End\n\tscore -1\n\nAI_CV_Curse_End::\n\tend\n\nAI_CV_Protect::\n\tget_protect_count AI_USER\n\tif_more_than 1, AI_CV_Protect_ScoreDown2\n\tif_status AI_USER, STATUS1_TOXIC_POISON, AI_CV_Protect3\n\tif_status2 AI_USER, STATUS2_CURSED, AI_CV_Protect3\n\tif_status3 AI_USER, STATUS3_PERISH_SONG, AI_CV_Protect3\n\tif_status2 AI_USER, STATUS2_INFATUATION, AI_CV_Protect3\n\tif_status3 AI_USER, STATUS3_LEECHSEED, AI_CV_Protect3\n\tif_status3 AI_USER, STATUS3_YAWN, AI_CV_Protect3\n\tif_has_move_with_effect AI_TARGET, EFFECT_RESTORE_HP, AI_CV_Protect3\n\tif_has_move_with_effect AI_TARGET, EFFECT_DEFENSE_CURL, AI_CV_Protect3\n\tif_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_Protect_ScoreUp2\n\tif_status2 AI_TARGET, STATUS2_CURSED, AI_CV_Protect_ScoreUp2\n\tif_status3 AI_TARGET, STATUS3_PERISH_SONG, AI_CV_Protect_ScoreUp2\n\tif_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Protect_ScoreUp2\n\tif_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_Protect_ScoreUp2\n\tif_status3 AI_TARGET, STATUS3_YAWN, AI_CV_Protect_ScoreUp2\n\tget_last_used_move AI_TARGET\n\tget_move_effect_from_result\n\tif_not_equal EFFECT_LOCK_ON, AI_CV_Protect_ScoreUp2\n\tgoto AI_CV_Protect2\n\nAI_CV_Protect_ScoreUp2::\n\tscore +2\n\nAI_CV_Protect2::\n\tif_random_less_than 128, AI_CV_Protect4\n\tscore -1\n\nAI_CV_Protect4::\n\tget_protect_count AI_USER\n\tif_equal 0, AI_CV_Protect_End\n\tscore -1\n\tif_random_less_than 128, AI_CV_Protect_End\n\tscore -1\n\tgoto AI_CV_Protect_End\n\nAI_CV_Protect3::\n\tget_last_used_move AI_TARGET\n\tget_move_effect_from_result\n\tif_not_equal EFFECT_LOCK_ON, AI_CV_Protect_End\n\nAI_CV_Protect_ScoreDown2::\n\tscore -2\n\nAI_CV_Protect_End::\n\tend\n\nAI_CV_Foresight::\n\tget_target_type1\n\tif_equal TYPE_GHOST, AI_CV_Foresight2\n\tget_target_type2\n\tif_equal TYPE_GHOST, AI_CV_Foresight2\n\tif_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_Foresight3\n\tscore -2\n\tgoto AI_CV_Foresight_End\n\nAI_CV_Foresight2::\n\tif_random_less_than 80, AI_CV_Foresight_End\n\nAI_CV_Foresight3::\n\tif_random_less_than 80, AI_CV_Foresight_End\n\tscore +2\n\nAI_CV_Foresight_End::\n\tend\n\nAI_CV_Endure::\n\tif_hp_less_than AI_USER, 4, AI_CV_Endure2\n\tif_hp_less_than AI_USER, 35, AI_CV_Endure3\n\nAI_CV_Endure2::\n\tscore -1\n\tgoto AI_CV_Endure_End\n\nAI_CV_Endure3::\n\tif_random_less_than 70, AI_CV_Endure_End\n\tscore +1\n\nAI_CV_Endure_End::\n\tend\n\nAI_CV_BatonPass::\n\tif_stat_level_more_than AI_USER, STAT_ATK, 8, AI_CV_BatonPass2\n\tif_stat_level_more_than AI_USER, STAT_DEF, 8, AI_CV_BatonPass2\n\tif_stat_level_more_than AI_USER, STAT_SPATK, 8, AI_CV_BatonPass2\n\tif_stat_level_more_than AI_USER, STAT_SPDEF, 8, AI_CV_BatonPass2\n\tif_stat_level_more_than AI_USER, STAT_EVASION, 8, AI_CV_BatonPass2\n\tgoto AI_CV_BatonPass5\n\nAI_CV_BatonPass2::\n\tif_target_faster AI_CV_BatonPass3\n\tif_hp_more_than AI_USER, 60, AI_CV_BatonPass_End\n\tgoto AI_CV_BatonPass4\n\nAI_CV_BatonPass3::\n\tif_hp_more_than AI_USER, 70, AI_CV_BatonPass_End\n\nAI_CV_BatonPass4::\n\tif_random_less_than 80, AI_CV_BatonPass_End\n\tscore +2\n\tgoto AI_CV_BatonPass_End\n\nAI_CV_BatonPass5::\n\tif_stat_level_more_than AI_USER, STAT_ATK, 7, AI_CV_BatonPass7\n\tif_stat_level_more_than AI_USER, STAT_DEF, 7, AI_CV_BatonPass7\n\tif_stat_level_more_than AI_USER, STAT_SPATK, 7, AI_CV_BatonPass7\n\tif_stat_level_more_than AI_USER, STAT_SPDEF, 7, AI_CV_BatonPass7\n\tif_stat_level_more_than AI_USER, STAT_EVASION, 7, AI_CV_BatonPass7\n\tgoto AI_CV_BatonPass_ScoreDown2\n\nAI_CV_BatonPass7::\n\tif_target_faster AI_CV_BatonPass8\n\tif_hp_more_than AI_USER, 60, AI_CV_BatonPass_ScoreDown2\n\tgoto AI_CV_BatonPass_End\n\nAI_CV_BatonPass8::\n\tif_hp_less_than AI_USER, 70, AI_CV_BatonPass_End\n\nAI_CV_BatonPass_ScoreDown2::\n\tscore -2\n\nAI_CV_BatonPass_End::\n\tend\n\nAI_CV_Pursuit::\n\tis_first_turn_for AI_USER\n\tif_not_equal 0, AI_CV_Pursuit_End\n\tget_target_type1\n\tif_equal TYPE_GHOST, AI_CV_Pursuit2\n\tget_target_type1\n\tif_equal TYPE_PSYCHIC, AI_CV_Pursuit2\n\tget_target_type2\n\tif_equal TYPE_GHOST, AI_CV_Pursuit2\n\tget_target_type2\n\tif_equal TYPE_PSYCHIC, AI_CV_Pursuit2\n\tgoto AI_CV_Pursuit_End\n\nAI_CV_Pursuit2::\n\tif_random_less_than 128, AI_CV_Pursuit_End\n\tscore +1\n\nAI_CV_Pursuit_End::\n\tend\n\nAI_CV_RainDance::\n\tif_user_faster AI_CV_RainDance2\n\tget_ability AI_USER\n\tif_equal ABILITY_SWIFT_SWIM, AI_CV_RainDance3\n\nAI_CV_RainDance2::\n\tif_hp_less_than AI_USER, 40, AI_CV_RainDance_ScoreDown1\n\tget_weather\n\tif_equal AI_WEATHER_HAIL, AI_CV_RainDance3\n\tif_equal AI_WEATHER_SUN, AI_CV_RainDance3\n\tif_equal AI_WEATHER_SANDSTORM, AI_CV_RainDance3\n\tget_ability AI_USER\n\tif_equal ABILITY_RAIN_DISH, AI_CV_RainDance3\n\tgoto AI_CV_RainDance_End\n\nAI_CV_RainDance3::\n\tscore +1\n\tgoto AI_CV_RainDance_End\n\nAI_CV_RainDance_ScoreDown1::\n\tscore -1\n\nAI_CV_RainDance_End::\n\tend\n\nAI_CV_SunnyDay::\n\tif_hp_less_than AI_USER, 40, AI_CV_SunnyDay_ScoreDown1\n\tget_weather\n\tif_equal AI_WEATHER_HAIL, AI_CV_SunnyDay2\n\tif_equal AI_WEATHER_RAIN, AI_CV_SunnyDay2\n\tif_equal AI_WEATHER_SANDSTORM, AI_CV_SunnyDay2\n\tgoto AI_CV_SunnyDay_End\n\nAI_CV_SunnyDay2::\n\tscore +1\n\tgoto AI_CV_SunnyDay_End\n\nAI_CV_SunnyDay_ScoreDown1::\n\tscore -1\n\nAI_CV_SunnyDay_End::\n\tend\n\nAI_CV_BellyDrum::\n\tif_hp_less_than AI_USER, 90, AI_CV_BellyDrum_ScoreDown2\n\tgoto AI_CV_BellyDrum_End\n\nAI_CV_BellyDrum_ScoreDown2::\n\tscore -2\n\nAI_CV_BellyDrum_End::\n\tend\n\nAI_CV_PsychUp::\n\tif_stat_level_more_than AI_TARGET, STAT_ATK, 8, AI_CV_PsychUp2\n\tif_stat_level_more_than AI_TARGET, STAT_DEF, 8, AI_CV_PsychUp2\n\tif_stat_level_more_than AI_TARGET, STAT_SPATK, 8, AI_CV_PsychUp2\n\tif_stat_level_more_than AI_TARGET, STAT_SPDEF, 8, AI_CV_PsychUp2\n\tif_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_PsychUp2\n\tgoto AI_CV_PsychUp_ScoreDown2\n\nAI_CV_PsychUp2::\n\tif_stat_level_less_than AI_USER, STAT_ATK, 7, AI_CV_PsychUp3\n\tif_stat_level_less_than AI_USER, STAT_DEF, 7, AI_CV_PsychUp3\n\tif_stat_level_less_than AI_USER, STAT_SPATK, 7, AI_CV_PsychUp3\n\tif_stat_level_less_than AI_USER, STAT_SPDEF, 7, AI_CV_PsychUp3\n\tif_stat_level_less_than AI_USER, STAT_EVASION, 7, AI_CV_PsychUp_ScoreUp1\n\tif_random_less_than 50, AI_CV_PsychUp_End\n\tgoto AI_CV_PsychUp_ScoreDown2\n\nAI_CV_PsychUp_ScoreUp1::\n\tscore +1\n\nAI_CV_PsychUp3::\n\tif_random_less_than 128, AI_CV_PsychUp_End  @ Remove this line\n\tscore +1\n\tend\n\nAI_CV_PsychUp_ScoreDown2::\n\tscore -2\n\nAI_CV_PsychUp_End::\n\tend\n\nAI_CV_MirrorCoat::\n\tif_status AI_TARGET, STATUS1_SLEEP, AI_CV_MirrorCoat_ScoreDown1\n\tif_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_MirrorCoat_ScoreDown1\n\tif_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_MirrorCoat_ScoreDown1\n\tif_hp_more_than AI_USER, 30, AI_CV_MirrorCoat2\n\tif_random_less_than 10, AI_CV_MirrorCoat2\n\tscore -1\n\nAI_CV_MirrorCoat2::\n\tif_hp_more_than AI_USER, 50, AI_CV_MirrorCoat3\n\tif_random_less_than 100, AI_CV_MirrorCoat3\n\tscore -1\n\nAI_CV_MirrorCoat3::\n\tif_has_move AI_USER, MOVE_COUNTER, AI_CV_MirrorCoat_ScoreUp4\n\tget_last_used_move AI_TARGET\n\tget_move_power_from_result\n\tif_equal 0, AI_CV_MirrorCoat5\n\tif_target_not_taunted AI_CV_MirrorCoat4\n\tif_random_less_than 100, AI_CV_MirrorCoat4\n\tscore +1\n\nAI_CV_MirrorCoat4::\n\tget_last_used_move AI_TARGET\n\tget_move_type_from_result\n\tif_not_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_ScoreDown1\n\tif_random_less_than 100, AI_CV_MirrorCoat_End\n\tscore +1\n\tgoto AI_CV_MirrorCoat_End\n\nAI_CV_MirrorCoat5::\n\tif_target_not_taunted AI_CV_MirrorCoat6\n\tif_random_less_than 100, AI_CV_MirrorCoat6\n\tscore +1\n\nAI_CV_MirrorCoat6::\n\tget_target_type1\n\tif_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_End\n\tget_target_type2\n\tif_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_End\n\tif_random_less_than 50, AI_CV_MirrorCoat_End\n\nAI_CV_MirrorCoat_ScoreUp4:\n\tif_random_less_than 100, AI_CV_MirrorCoat_ScoreUp4_End\n\tscore +4\n\nAI_CV_MirrorCoat_ScoreUp4_End:\n\tend\n\nAI_CV_MirrorCoat_ScoreDown1::\n\tscore -1\n\nAI_CV_MirrorCoat_End::\n\tend\n\nAI_CV_MirrorCoat_SpecialTypeList::\n\t.byte TYPE_FIRE\n\t.byte TYPE_WATER\n\t.byte TYPE_GRASS\n\t.byte TYPE_ELECTRIC\n\t.byte TYPE_PSYCHIC\n\t.byte TYPE_ICE\n\t.byte TYPE_DRAGON\n\t.byte TYPE_DARK\n\t.byte -1\n\nAI_CV_ChargeUpMove::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_ChargeUpMove_ScoreDown2\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_ChargeUpMove_ScoreDown2\n\tif_has_move_with_effect AI_TARGET, EFFECT_PROTECT, AI_CV_ChargeUpMove_ScoreDown2\n\tif_hp_more_than AI_USER, 38, AI_CV_ChargeUpMove_End\n\tscore -1\n\tgoto AI_CV_ChargeUpMove_End\n\nAI_CV_ChargeUpMove_ScoreDown2::\n\tscore -2\n\nAI_CV_ChargeUpMove_End::\n\tend\n\nAI_CV_SemiInvulnerable::\n\tif_doesnt_have_move_with_effect AI_TARGET, EFFECT_PROTECT, AI_CV_SemiInvulnerable2\n\tscore -1\n\tgoto AI_CV_SemiInvulnerable_End\n\nAI_CV_SemiInvulnerable2::\n\tif_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_SemiInvulnerable_TryEncourage\n\tif_status2 AI_TARGET, STATUS2_CURSED, AI_CV_SemiInvulnerable_TryEncourage\n\tif_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_SemiInvulnerable_TryEncourage\n\tget_weather\n\tif_equal AI_WEATHER_HAIL, AI_CV_SemiInvulnerable_CheckIceType\n\tif_equal AI_WEATHER_SANDSTORM, AI_CV_SemiInvulnerable_CheckSandstormTypes\n\tgoto AI_CV_SemiInvulnerable5\n\nAI_CV_SemiInvulnerable_CheckSandstormTypes::\n\tget_user_type1\n\tif_in_bytes AI_CV_SandstormResistantTypes, AI_CV_SemiInvulnerable_TryEncourage\n\tget_user_type2\n\tif_in_bytes AI_CV_SandstormResistantTypes, AI_CV_SemiInvulnerable_TryEncourage\n\tgoto AI_CV_SemiInvulnerable5\n\nAI_CV_SemiInvulnerable_CheckIceType::\n\tget_user_type1\n\tif_equal TYPE_ICE, AI_CV_SemiInvulnerable_TryEncourage\n\tget_user_type2\n\tif_equal TYPE_ICE, AI_CV_SemiInvulnerable_TryEncourage\n\nAI_CV_SemiInvulnerable5::\n\tif_target_faster AI_CV_SemiInvulnerable_End\n\tget_last_used_move AI_TARGET\n\tget_move_effect_from_result\n\tif_not_equal EFFECT_LOCK_ON, AI_CV_SemiInvulnerable_TryEncourage\n\tgoto AI_CV_SemiInvulnerable_End\n\nAI_CV_SemiInvulnerable_TryEncourage::\n\tif_random_less_than 80, AI_CV_SemiInvulnerable_End\n\tscore +1\n\nAI_CV_SemiInvulnerable_End::\n\tend\n\nAI_CV_SandstormResistantTypes::\n\t.byte TYPE_GROUND\n\t.byte TYPE_ROCK\n\t.byte TYPE_STEEL\n\t.byte -1\n\nAI_CV_FakeOut::\n\tscore +2\n\tend\n\nAI_CV_SpitUp::\n\tget_stockpile_count AI_USER\n\tif_less_than 2, AI_CV_SpitUp_End\n\tif_random_less_than 80, AI_CV_SpitUp_End\n\tscore +2\n\nAI_CV_SpitUp_End::\n\tend\n\nAI_CV_Hail::\n\tif_hp_less_than AI_USER, 40, AI_CV_Hail_ScoreDown1\n\tget_weather\n\tif_equal AI_WEATHER_SUN, AI_CV_Hail2\n\tif_equal AI_WEATHER_RAIN, AI_CV_Hail2\n\tif_equal AI_WEATHER_SANDSTORM, AI_CV_Hail2\n\tgoto AI_CV_Hail_End\n\nAI_CV_Hail2::\n\tscore +1\n\tgoto AI_CV_Hail_End\n\nAI_CV_Hail_ScoreDown1::\n\tscore -1\n\nAI_CV_Hail_End::\n\tend\n\nAI_CV_Facade::\n\tif_not_status AI_USER, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, AI_CV_Facade_End\n\tscore +1\n\nAI_CV_Facade_End::\n\tend\n\nAI_CV_FocusPunch::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_FocusPunch2\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_FocusPunch2\n\tif_status AI_TARGET, STATUS1_SLEEP, AI_CV_FocusPunch_ScoreUp1\n\tif_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_FocusPunch3\n\tif_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_FocusPunch3\n\tis_first_turn_for AI_USER\n\tif_not_equal 0, AI_CV_FocusPunch_End\n\tif_random_less_than 100, AI_CV_FocusPunch_End\n\tscore +1\n\tgoto AI_CV_FocusPunch_End\n\nAI_CV_FocusPunch2::\n\tscore -1\n\tgoto AI_CV_FocusPunch_End\n\nAI_CV_FocusPunch3::\n\tif_random_less_than 100, AI_CV_FocusPunch_End\n\nAI_CV_FocusPunch_ScoreUp1::\n\tscore +1\n\nAI_CV_FocusPunch_End::\n\tend\n\nAI_CV_SmellingSalt::\n\tif_status AI_TARGET, STATUS1_PARALYSIS, AI_CV_SmellingSalt_ScoreUp1\n\tgoto AI_CV_SmellingSalt_End\n\nAI_CV_SmellingSalt_ScoreUp1::\n\tscore +1\n\nAI_CV_SmellingSalt_End::\n\tend\n\nAI_CV_Trick::\n\tget_hold_effect AI_USER\n\tif_in_bytes AI_CV_Trick_ChoiceEffects, AI_CV_Trick3\n\tif_in_bytes AI_CV_Trick_EffectsToEncourage, AI_CV_Trick4\n\nAI_CV_Trick2::\n\tscore -3\n\tgoto AI_CV_Trick_End\n\nAI_CV_Trick3::\n\tget_hold_effect AI_TARGET\n\tif_in_bytes AI_CV_Trick_ChoiceEffects, AI_CV_Trick2\n\tscore +5\n\tgoto AI_CV_Trick_End\n\nAI_CV_Trick4::\n\tget_hold_effect AI_TARGET\n\tif_in_bytes AI_CV_Trick_EffectsToEncourage, AI_CV_Trick2\n\tif_random_less_than 50, AI_CV_Trick_End\n\tscore +2\n\nAI_CV_Trick_End::\n\tend\n\nAI_CV_Trick_EffectsToEncourage::\n\t.byte HOLD_EFFECT_CONFUSE_SPICY\n\t.byte HOLD_EFFECT_CONFUSE_DRY\n\t.byte HOLD_EFFECT_CONFUSE_SWEET\n\t.byte HOLD_EFFECT_CONFUSE_BITTER\n\t.byte HOLD_EFFECT_CONFUSE_SOUR\n\t.byte HOLD_EFFECT_MACHO_BRACE\n\t.byte HOLD_EFFECT_CHOICE_BAND\n\t.byte -1\n\nAI_CV_Trick_ChoiceEffects::\n\t.byte HOLD_EFFECT_CHOICE_BAND\n\t.byte -1\n\nAI_CV_ChangeSelfAbility::\n\tget_ability AI_USER\n\tif_in_bytes AI_CV_ChangeSelfAbility_AbilitiesToEncourage, AI_CV_ChangeSelfAbility2\n\tget_ability AI_TARGET\n\tif_in_bytes AI_CV_ChangeSelfAbility_AbilitiesToEncourage, AI_CV_ChangeSelfAbility3\n\nAI_CV_ChangeSelfAbility2::\n\tscore -1\n\tgoto AI_CV_ChangeSelfAbility_End\n\nAI_CV_ChangeSelfAbility3::\n\tif_random_less_than 50, AI_CV_ChangeSelfAbility_End\n\tscore +2\n\nAI_CV_ChangeSelfAbility_End::\n\tend\n\nAI_CV_ChangeSelfAbility_AbilitiesToEncourage::\n\t.byte ABILITY_SPEED_BOOST\n\t.byte ABILITY_BATTLE_ARMOR\n\t.byte ABILITY_SAND_VEIL\n\t.byte ABILITY_STATIC\n\t.byte ABILITY_FLASH_FIRE\n\t.byte ABILITY_WONDER_GUARD\n\t.byte ABILITY_EFFECT_SPORE\n\t.byte ABILITY_SWIFT_SWIM\n\t.byte ABILITY_HUGE_POWER\n\t.byte ABILITY_RAIN_DISH\n\t.byte ABILITY_CUTE_CHARM\n\t.byte ABILITY_SHED_SKIN\n\t.byte ABILITY_MARVEL_SCALE\n\t.byte ABILITY_PURE_POWER\n\t.byte ABILITY_CHLOROPHYLL\n\t.byte ABILITY_SHIELD_DUST\n\t.byte -1\n\nAI_CV_Superpower::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_Superpower_ScoreDown1\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_Superpower_ScoreDown1\n\tif_stat_level_less_than AI_USER, STAT_ATK, 6, AI_CV_Superpower_ScoreDown1\n\tif_target_faster AI_CV_Superpower2\n\tif_hp_more_than AI_USER, 40, AI_CV_Superpower_ScoreDown1\n\tgoto AI_CV_Superpower_End\n\nAI_CV_Superpower2::\n\tif_hp_less_than AI_USER, 60, AI_CV_Superpower_End\n\nAI_CV_Superpower_ScoreDown1::\n\tscore -1\n\nAI_CV_Superpower_End::\n\tend\n\nAI_CV_MagicCoat::\n\tif_hp_more_than AI_TARGET, 30, AI_CV_MagicCoat2\n\tif_random_less_than 100, AI_CV_MagicCoat2\n\tscore -1\n\nAI_CV_MagicCoat2::\n\tis_first_turn_for AI_USER\n\tif_equal 0, AI_CV_MagicCoat4\n\tif_random_less_than 150, AI_CV_MagicCoat_End\n\tscore +1\n\tgoto AI_CV_MagicCoat_End\n\tif_random_less_than 50, AI_CV_MagicCoat_End\n\nAI_CV_MagicCoat3::\n\tif_random_less_than 50, AI_CV_MagicCoat_End\n\nAI_CV_MagicCoat4::\n\tif_random_less_than 30, AI_CV_MagicCoat_End\n\tscore -1\n\nAI_CV_MagicCoat_End::\n\tend\n\nAI_CV_Recycle::\n\tget_used_held_item AI_USER\n\tif_not_in_bytes AI_CV_Recycle_ItemsToEncourage, AI_CV_Recycle_ScoreDown2\n\tif_random_less_than 50, AI_CV_Recycle_End\n\tscore +1\n\tgoto AI_CV_Recycle_End\n\nAI_CV_Recycle_ScoreDown2::\n\tscore -2\n\nAI_CV_Recycle_End::\n\tend\n\nAI_CV_Recycle_ItemsToEncourage::\n\t.byte ITEM_CHESTO_BERRY\n\t.byte ITEM_LUM_BERRY\n\t.byte ITEM_STARF_BERRY\n\t.byte -1\n\nAI_CV_Revenge::\n\tif_status AI_TARGET, STATUS1_SLEEP, AI_CV_Revenge_ScoreDown2\n\tif_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Revenge_ScoreDown2\n\tif_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_Revenge_ScoreDown2\n\tif_random_less_than 180, AI_CV_Revenge_ScoreDown2\n\tscore +2\n\tgoto AI_CV_Revenge_End\n\nAI_CV_Revenge_ScoreDown2::\n\tscore -2\n\nAI_CV_Revenge_End::\n\tend\n\nAI_CV_BrickBreak::\n\tif_side_affecting AI_TARGET, SIDE_STATUS_REFLECT, AI_CV_BrickBreak_ScoreUp1\n\tgoto AI_CV_BrickBreak_End\n\nAI_CV_BrickBreak_ScoreUp1::\n\tscore +1\n\nAI_CV_BrickBreak_End::\n\tend\n\nAI_CV_KnockOff::\n\tif_hp_less_than AI_TARGET, 30, AI_CV_KnockOff_End\n\tis_first_turn_for AI_USER\n\tif_more_than 0, AI_CV_KnockOff_End\n\tif_random_less_than 180, AI_CV_KnockOff_End\n\tscore +1\n\nAI_CV_KnockOff_End::\n\tend\n\nAI_CV_Endeavor::\n\tif_hp_less_than AI_TARGET, 70, AI_CV_Endeavor_ScoreDown1\n\tif_target_faster AI_CV_Endeavor2\n\tif_hp_more_than AI_USER, 40, AI_CV_Endeavor_ScoreDown1\n\tscore +1\n\tgoto AI_CV_Endeavor_End\n\nAI_CV_Endeavor2::\n\tif_hp_more_than AI_USER, 50, AI_CV_Endeavor_ScoreDown1\n\tscore +1\n\tgoto AI_CV_Endeavor_End\n\nAI_CV_Endeavor_ScoreDown1::\n\tscore -1\n\nAI_CV_Endeavor_End::\n\tend\n\nAI_CV_Eruption::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_Eruption_ScoreDown1\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_Eruption_ScoreDown1\n\tif_target_faster AI_CV_Eruption2\n\tif_hp_more_than AI_TARGET, 50, AI_CV_Eruption_End\n\tgoto AI_CV_Eruption_ScoreDown1\n\nAI_CV_Eruption2::\n\tif_hp_more_than AI_TARGET, 70, AI_CV_Eruption_End\n\nAI_CV_Eruption_ScoreDown1::\n\tscore -1\n\nAI_CV_Eruption_End::\n\tend\n\nAI_CV_Imprison::\n\tis_first_turn_for AI_USER\n\tif_more_than 0, AI_CV_Imprison_End\n\tif_random_less_than 100, AI_CV_Imprison_End\n\tscore +2\n\nAI_CV_Imprison_End::\n\tend\n\nAI_CV_Refresh::\n\tif_hp_less_than AI_TARGET, 50, AI_CV_Refresh_ScoreDown1\n\tgoto AI_CV_Refresh_End\n\nAI_CV_Refresh_ScoreDown1::\n\tscore -1\n\nAI_CV_Refresh_End::\n\tend\n\nAI_CV_Snatch::\n\tis_first_turn_for AI_USER\n\tif_equal 1, AI_CV_Snatch3\n\tif_random_less_than 30, AI_CV_Snatch_End\n\tif_target_faster AI_CV_Snatch2\n\tif_hp_not_equal AI_USER, 100, AI_CV_Snatch5\n\tif_hp_less_than AI_TARGET, 70, AI_CV_Snatch5\n\tif_random_less_than 60, AI_CV_Snatch_End\n\tgoto AI_CV_Snatch5\n\nAI_CV_Snatch2::\n\tif_hp_more_than AI_TARGET, 25, AI_CV_Snatch5\n\tif_has_move_with_effect AI_TARGET, EFFECT_RESTORE_HP, AI_CV_Snatch3\n\tif_has_move_with_effect AI_TARGET, EFFECT_DEFENSE_CURL, AI_CV_Snatch3\n\tgoto AI_CV_Snatch4\n\nAI_CV_Snatch3::\n\tif_random_less_than 150, AI_CV_Snatch_End\n\tscore +2\n\tgoto AI_CV_Snatch_End\n\nAI_CV_Snatch4::\n\tif_random_less_than 230, AI_CV_Snatch5\n\tscore +1\n\tgoto AI_CV_Snatch_End\n\nAI_CV_Snatch5::\n\tif_random_less_than 30, AI_CV_Snatch_End\n\tscore -2\n\nAI_CV_Snatch_End::\n\tend\n\nAI_CV_MudSport::\n\tif_hp_less_than AI_USER, 50, AI_CV_MudSport_ScoreDown1\n\tget_target_type1\n\tif_equal TYPE_ELECTRIC, AI_CV_MudSport2\n\tget_target_type2\n\tif_equal TYPE_ELECTRIC, AI_CV_MudSport2\n\tgoto AI_CV_MudSport_ScoreDown1\n\nAI_CV_MudSport2::\n\tscore +1\n\tgoto AI_CV_MudSport_End\n\nAI_CV_MudSport_ScoreDown1::\n\tscore -1\n\nAI_CV_MudSport_End::\n\tend\n\nAI_CV_Overheat::\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_Overheat_ScoreDown1\n\tif_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_Overheat_ScoreDown1\n\tif_target_faster AI_CV_Overheat2\n\tif_hp_more_than AI_USER, 60, AI_CV_Overheat_End\n\tgoto AI_CV_Overheat_ScoreDown1\n\nAI_CV_Overheat2::\n\tif_hp_more_than AI_USER, 80, AI_CV_Overheat_End\n\nAI_CV_Overheat_ScoreDown1::\n\tscore -1\n\nAI_CV_Overheat_End::\n\tend\n\nAI_CV_WaterSport::\n\tif_hp_less_than AI_USER, 50, AI_CV_WaterSport_ScoreDown1\n\tget_target_type1\n\tif_equal TYPE_FIRE, AI_CV_WaterSport2\n\tget_target_type2\n\tif_equal TYPE_FIRE, AI_CV_WaterSport2\n\tgoto AI_CV_WaterSport_ScoreDown1\n\nAI_CV_WaterSport2::\n\tscore +1\n\tgoto AI_CV_WaterSport_End\n\nAI_CV_WaterSport_ScoreDown1::\n\tscore -1\n\nAI_CV_WaterSport_End::\n\tend\n\nAI_CV_DragonDance::\n\tif_target_faster AI_CV_DragonDance2\n\tif_hp_more_than AI_USER, 50, AI_CV_DragonDance_End\n\tif_random_less_than 70, AI_CV_DragonDance_End\n\tscore -1\n\tgoto AI_CV_DragonDance_End\n\nAI_CV_DragonDance2::\n\tif_random_less_than 128, AI_CV_DragonDance_End\n\tscore +1\n\nAI_CV_DragonDance_End::\n\tend\n\nAI_TryToFaint::\n\tif_can_faint AI_TryToFaint_TryToEncourageQuickAttack\n\tget_how_powerful_move_is\n\tif_equal MOVE_NOT_MOST_POWERFUL, Score_Minus1\n\tif_type_effectiveness AI_EFFECTIVENESS_x4, AI_TryToFaint_DoubleSuperEffective\n\tend\n\n\nAI_TryToFaint_DoubleSuperEffective:\n\tif_random_less_than 80, AI_TryToFaint_End\n\tscore +2\n\tend\n\nAI_TryToFaint_TryToEncourageQuickAttack::\n\tif_effect EFFECT_EXPLOSION, AI_TryToFaint_End\n\tif_not_effect EFFECT_QUICK_ATTACK, AI_TryToFaint_ScoreUp4\n\tscore +2\n\nAI_TryToFaint_ScoreUp4::\n\tscore +4\n\nAI_TryToFaint_End::\n\tend\n\nAI_SetupFirstTurn::\n\tget_turn_count\n\tif_not_equal 0, AI_SetupFirstTurn_End\n\tget_considered_move_effect\n\tif_not_in_bytes AI_SetupFirstTurn_SetupEffectsToEncourage, AI_SetupFirstTurn_End\n\tif_random_less_than 80, AI_SetupFirstTurn_End\n\tscore +2\n\nAI_SetupFirstTurn_End::\n\tend\n\nAI_SetupFirstTurn_SetupEffectsToEncourage::\n\t.byte EFFECT_ATTACK_UP\n\t.byte EFFECT_DEFENSE_UP\n\t.byte EFFECT_SPEED_UP\n\t.byte EFFECT_SPECIAL_ATTACK_UP\n\t.byte EFFECT_SPECIAL_DEFENSE_UP\n\t.byte EFFECT_ACCURACY_UP\n\t.byte EFFECT_EVASION_UP\n\t.byte EFFECT_ATTACK_DOWN\n\t.byte EFFECT_DEFENSE_DOWN\n\t.byte EFFECT_SPEED_DOWN\n\t.byte EFFECT_SPECIAL_ATTACK_DOWN\n\t.byte EFFECT_SPECIAL_DEFENSE_DOWN\n\t.byte EFFECT_ACCURACY_DOWN\n\t.byte EFFECT_EVASION_DOWN\n\t.byte EFFECT_CONVERSION\n\t.byte EFFECT_LIGHT_SCREEN\n\t.byte EFFECT_SPECIAL_DEFENSE_UP_2\n\t.byte EFFECT_FOCUS_ENERGY\n\t.byte EFFECT_CONFUSE\n\t.byte EFFECT_ATTACK_UP_2\n\t.byte EFFECT_DEFENSE_UP_2\n\t.byte EFFECT_SPEED_UP_2\n\t.byte EFFECT_SPECIAL_ATTACK_UP_2\n\t.byte EFFECT_SPECIAL_DEFENSE_UP_2\n\t.byte EFFECT_ACCURACY_UP_2\n\t.byte EFFECT_EVASION_UP_2\n\t.byte EFFECT_ATTACK_DOWN_2\n\t.byte EFFECT_DEFENSE_DOWN_2\n\t.byte EFFECT_SPEED_DOWN_2\n\t.byte EFFECT_SPECIAL_ATTACK_DOWN_2\n\t.byte EFFECT_SPECIAL_DEFENSE_DOWN_2\n\t.byte EFFECT_ACCURACY_DOWN_2\n\t.byte EFFECT_EVASION_DOWN_2\n\t.byte EFFECT_REFLECT\n\t.byte EFFECT_POISON\n\t.byte EFFECT_PARALYZE\n\t.byte EFFECT_SUBSTITUTE\n\t.byte EFFECT_LEECH_SEED\n\t.byte EFFECT_MINIMIZE\n\t.byte EFFECT_CURSE\n\t.byte EFFECT_SWAGGER\n\t.byte EFFECT_CAMOUFLAGE\n\t.byte EFFECT_YAWN\n\t.byte EFFECT_DEFENSE_CURL\n\t.byte EFFECT_TORMENT\n\t.byte EFFECT_FLATTER\n\t.byte EFFECT_WILL_O_WISP\n\t.byte EFFECT_INGRAIN\n\t.byte EFFECT_IMPRISON\n\t.byte EFFECT_TEETER_DANCE\n\t.byte EFFECT_TICKLE\n\t.byte EFFECT_COSMIC_POWER\n\t.byte EFFECT_BULK_UP\n\t.byte EFFECT_CALM_MIND\n\t.byte EFFECT_CAMOUFLAGE\n\t.byte -1\n\nAI_PreferStrongestMove::\n\tget_how_powerful_move_is\n\tif_not_equal MOVE_POWER_DISCOURAGED, AI_PreferStrongestMove_End\n\tif_random_less_than 100, AI_PreferStrongestMove_End\n\tscore +2\n\nAI_PreferStrongestMove_End::\n\tend\n\nAI_Risky::\n\tget_considered_move_effect\n\tif_not_in_bytes AI_Risky_EffectsToEncourage, AI_Risky_End\n\tif_random_less_than 128, AI_Risky_End\n\tscore +2\n\nAI_Risky_End::\n\tend\n\nAI_Risky_EffectsToEncourage::\n\t.byte EFFECT_SLEEP\n\t.byte EFFECT_EXPLOSION\n\t.byte EFFECT_MIRROR_MOVE\n\t.byte EFFECT_OHKO\n\t.byte EFFECT_HIGH_CRITICAL\n\t.byte EFFECT_CONFUSE\n\t.byte EFFECT_METRONOME\n\t.byte EFFECT_PSYWAVE\n\t.byte EFFECT_COUNTER\n\t.byte EFFECT_DESTINY_BOND\n\t.byte EFFECT_SWAGGER\n\t.byte EFFECT_ATTRACT\n\t.byte EFFECT_PRESENT\n\t.byte EFFECT_ALL_STATS_UP_HIT\n\t.byte EFFECT_BELLY_DRUM\n\t.byte EFFECT_MIRROR_COAT\n\t.byte EFFECT_FOCUS_PUNCH\n\t.byte EFFECT_REVENGE\n\t.byte EFFECT_TEETER_DANCE\n\t.byte -1\n\nAI_PreferBatonPass::\n\tcount_alive_pokemon AI_USER\n\tif_equal 0, AI_PreferBatonPass_End\n\tget_how_powerful_move_is\n\tif_not_equal MOVE_POWER_DISCOURAGED, AI_PreferBatonPass_End\n\tif_has_move_with_effect AI_USER, EFFECT_BATON_PASS, AI_PreferBatonPass_GoForBatonPass\n\tif_random_less_than 80, AI_Risky_End\n\nAI_PreferBatonPass_GoForBatonPass::\n\tif_move MOVE_SWORDS_DANCE, AI_PreferBatonPass2\n\tif_move MOVE_DRAGON_DANCE, AI_PreferBatonPass2\n\tif_move MOVE_CALM_MIND, AI_PreferBatonPass2\n\tif_effect EFFECT_PROTECT, AI_PreferBatonPass3\n\tif_move MOVE_BATON_PASS, AI_PreferBatonPass_EncourageIfHighStats\n\tif_random_less_than 20, AI_Risky_End\n\tscore +3\n\nAI_PreferBatonPass2:\n\tget_turn_count\n\tif_equal 0, Score_Plus5\n\tif_hp_less_than AI_USER, 60, Score_Minus10\n\tgoto Score_Plus1\n\nAI_PreferBatonPass3::\n\tget_last_used_move AI_USER\n\tif_in_hwords AI_PreferBatonPass_ProtectMoves, Score_Minus2\n\tscore +2\n\tend\n\nAI_PreferBatonPass_ProtectMoves:\n   .2byte MOVE_PROTECT\n   .2byte MOVE_DETECT\n   .2byte -1\n\nAI_PreferBatonPass_EncourageIfHighStats:\n\tget_turn_count\n\tif_equal 0, Score_Minus2\n\tif_stat_level_more_than AI_USER, STAT_ATK, 8, Score_Plus3\n\tif_stat_level_more_than AI_USER, STAT_ATK, 7, Score_Plus2\n\tif_stat_level_more_than AI_USER, STAT_ATK, 6, Score_Plus1\n\tif_stat_level_more_than AI_USER, STAT_SPATK, 8, Score_Plus3\n\tif_stat_level_more_than AI_USER, STAT_SPATK, 7, Score_Plus2\n\tif_stat_level_more_than AI_USER, STAT_SPATK, 6, Score_Plus1\n\tend\n\nAI_PreferBatonPass_End::\n\tend\n\n@ Empty. Expanded in Emerald\nAI_DoubleBattle::\n\tend\n\nAI_HPAware::\n\tif_hp_more_than AI_USER, 70, AI_HPAware_UserHasHighHP\n\tif_hp_more_than AI_USER, 30, AI_HPAware_UserHasMediumHP\n\tget_considered_move_effect\n\tif_in_bytes AI_HPAware_DiscouragedEffectsWhenLowHP, AI_HPAware_TryToDiscourage\n\tgoto AI_HPAware_ConsiderTarget\n\nAI_HPAware_UserHasHighHP::\n\tget_considered_move_effect\n\tif_in_bytes AI_HPAware_DiscouragedEffectsWhenHighHP, AI_HPAware_TryToDiscourage\n\tgoto AI_HPAware_ConsiderTarget\n\nAI_HPAware_UserHasMediumHP::\n\tget_considered_move_effect\n\tif_in_bytes AI_HPAware_DiscouragedEffectsWhenMediumHP, AI_HPAware_TryToDiscourage\n\tgoto AI_HPAware_ConsiderTarget\n\nAI_HPAware_TryToDiscourage::\n\tif_random_less_than 50, AI_HPAware_ConsiderTarget\n\tscore -2\n\nAI_HPAware_ConsiderTarget::\n\tif_hp_more_than AI_TARGET, 70, AI_HPAware_TargetHasHighHP\n\tif_hp_more_than AI_TARGET, 30, AI_HPAware_TargetHasMediumHP\n\tget_considered_move_effect\n\tif_in_bytes AI_HPAware_DiscouragedEffectsWhenTargetLowHP, AI_HPAware_TargetTryToDiscourage\n\tgoto AI_HPAware_End\n\nAI_HPAware_TargetHasHighHP::\n\tget_considered_move_effect\n\tif_in_bytes AI_HPAware_DiscouragedEffectsWhenTargetHighHP, AI_HPAware_TargetTryToDiscourage\n\tgoto AI_HPAware_End\n\nAI_HPAware_TargetHasMediumHP::\n\tget_considered_move_effect\n\tif_in_bytes AI_HPAware_DiscouragedEffectsWhenTargetMediumHP, AI_HPAware_TargetTryToDiscourage\n\tgoto AI_HPAware_End\n\nAI_HPAware_TargetTryToDiscourage::\n\tif_random_less_than 50, AI_HPAware_End\n\tscore -2\n\nAI_HPAware_End::\n\tend\n\nAI_HPAware_DiscouragedEffectsWhenHighHP::\n\t.byte EFFECT_EXPLOSION\n\t.byte EFFECT_RESTORE_HP\n\t.byte EFFECT_REST\n\t.byte EFFECT_DESTINY_BOND\n\t.byte EFFECT_FLAIL\n\t.byte EFFECT_ENDURE\n\t.byte EFFECT_MORNING_SUN\n\t.byte EFFECT_SYNTHESIS\n\t.byte EFFECT_MOONLIGHT\n\t.byte EFFECT_SOFTBOILED\n\t.byte EFFECT_MEMENTO\n\t.byte EFFECT_GRUDGE\n\t.byte EFFECT_OVERHEAT\n\t.byte -1\n\nAI_HPAware_DiscouragedEffectsWhenMediumHP::\n\t.byte EFFECT_EXPLOSION\n\t.byte EFFECT_ATTACK_UP\n\t.byte EFFECT_DEFENSE_UP\n\t.byte EFFECT_SPEED_UP\n\t.byte EFFECT_SPECIAL_ATTACK_UP\n\t.byte EFFECT_SPECIAL_DEFENSE_UP\n\t.byte EFFECT_ACCURACY_UP\n\t.byte EFFECT_EVASION_UP\n\t.byte EFFECT_ATTACK_DOWN\n\t.byte EFFECT_DEFENSE_DOWN\n\t.byte EFFECT_SPEED_DOWN\n\t.byte EFFECT_SPECIAL_ATTACK_DOWN\n\t.byte EFFECT_SPECIAL_DEFENSE_DOWN\n\t.byte EFFECT_ACCURACY_DOWN\n\t.byte EFFECT_EVASION_DOWN\n\t.byte EFFECT_BIDE\n\t.byte EFFECT_CONVERSION\n\t.byte EFFECT_LIGHT_SCREEN\n\t.byte EFFECT_MIST\n\t.byte EFFECT_FOCUS_ENERGY\n\t.byte EFFECT_ATTACK_UP_2\n\t.byte EFFECT_DEFENSE_UP_2\n\t.byte EFFECT_SPEED_UP_2\n\t.byte EFFECT_SPECIAL_ATTACK_UP_2\n\t.byte EFFECT_SPECIAL_DEFENSE_UP_2\n\t.byte EFFECT_ACCURACY_UP_2\n\t.byte EFFECT_EVASION_UP_2\n\t.byte EFFECT_ATTACK_DOWN_2\n\t.byte EFFECT_DEFENSE_DOWN_2\n\t.byte EFFECT_SPEED_DOWN_2\n\t.byte EFFECT_SPECIAL_ATTACK_DOWN_2\n\t.byte EFFECT_SPECIAL_DEFENSE_DOWN_2\n\t.byte EFFECT_ACCURACY_DOWN_2\n\t.byte EFFECT_EVASION_DOWN_2\n\t.byte EFFECT_CONVERSION_2\n\t.byte EFFECT_SAFEGUARD\n\t.byte EFFECT_BELLY_DRUM\n\t.byte EFFECT_TICKLE\n\t.byte EFFECT_COSMIC_POWER\n\t.byte EFFECT_BULK_UP\n\t.byte EFFECT_CALM_MIND\n\t.byte EFFECT_DRAGON_DANCE\n\t.byte -1\n\nAI_HPAware_DiscouragedEffectsWhenLowHP::\n\t.byte EFFECT_ATTACK_UP\n\t.byte EFFECT_DEFENSE_UP\n\t.byte EFFECT_SPEED_UP\n\t.byte EFFECT_SPECIAL_ATTACK_UP\n\t.byte EFFECT_SPECIAL_DEFENSE_UP\n\t.byte EFFECT_ACCURACY_UP\n\t.byte EFFECT_EVASION_UP\n\t.byte EFFECT_ATTACK_DOWN\n\t.byte EFFECT_DEFENSE_DOWN\n\t.byte EFFECT_SPEED_DOWN\n\t.byte EFFECT_SPECIAL_ATTACK_DOWN\n\t.byte EFFECT_SPECIAL_DEFENSE_DOWN\n\t.byte EFFECT_ACCURACY_DOWN\n\t.byte EFFECT_EVASION_DOWN\n\t.byte EFFECT_BIDE\n\t.byte EFFECT_CONVERSION\n\t.byte EFFECT_LIGHT_SCREEN\n\t.byte EFFECT_MIST\n\t.byte EFFECT_FOCUS_ENERGY\n\t.byte EFFECT_ATTACK_UP_2\n\t.byte EFFECT_DEFENSE_UP_2\n\t.byte EFFECT_SPEED_UP_2\n\t.byte EFFECT_SPECIAL_ATTACK_UP_2\n\t.byte EFFECT_SPECIAL_DEFENSE_UP_2\n\t.byte EFFECT_ACCURACY_UP_2\n\t.byte EFFECT_EVASION_UP_2\n\t.byte EFFECT_ATTACK_DOWN_2\n\t.byte EFFECT_DEFENSE_DOWN_2\n\t.byte EFFECT_SPEED_DOWN_2\n\t.byte EFFECT_SPECIAL_ATTACK_DOWN_2\n\t.byte EFFECT_SPECIAL_DEFENSE_DOWN_2\n\t.byte EFFECT_ACCURACY_DOWN_2\n\t.byte EFFECT_EVASION_DOWN_2\n\t.byte EFFECT_RAGE\n\t.byte EFFECT_CONVERSION_2\n\t.byte EFFECT_LOCK_ON\n\t.byte EFFECT_SAFEGUARD\n\t.byte EFFECT_BELLY_DRUM\n\t.byte EFFECT_PSYCH_UP\n\t.byte EFFECT_MIRROR_COAT\n\t.byte EFFECT_SOLAR_BEAM\n\t.byte EFFECT_ERUPTION\n\t.byte EFFECT_TICKLE\n\t.byte EFFECT_COSMIC_POWER\n\t.byte EFFECT_BULK_UP\n\t.byte EFFECT_CALM_MIND\n\t.byte EFFECT_DRAGON_DANCE\n\t.byte -1\n\nAI_HPAware_DiscouragedEffectsWhenTargetHighHP::\n\t.byte -1\n\nAI_HPAware_DiscouragedEffectsWhenTargetMediumHP::\n\t.byte EFFECT_ATTACK_UP\n\t.byte EFFECT_DEFENSE_UP\n\t.byte EFFECT_SPEED_UP\n\t.byte EFFECT_SPECIAL_ATTACK_UP\n\t.byte EFFECT_SPECIAL_DEFENSE_UP\n\t.byte EFFECT_ACCURACY_UP\n\t.byte EFFECT_EVASION_UP\n\t.byte EFFECT_ATTACK_DOWN\n\t.byte EFFECT_DEFENSE_DOWN\n\t.byte EFFECT_SPEED_DOWN\n\t.byte EFFECT_SPECIAL_ATTACK_DOWN\n\t.byte EFFECT_SPECIAL_DEFENSE_DOWN\n\t.byte EFFECT_ACCURACY_DOWN\n\t.byte EFFECT_EVASION_DOWN\n\t.byte EFFECT_MIST\n\t.byte EFFECT_FOCUS_ENERGY\n\t.byte EFFECT_ATTACK_UP_2\n\t.byte EFFECT_DEFENSE_UP_2\n\t.byte EFFECT_SPEED_UP_2\n\t.byte EFFECT_SPECIAL_ATTACK_UP_2\n\t.byte EFFECT_SPECIAL_DEFENSE_UP_2\n\t.byte EFFECT_ACCURACY_UP_2\n\t.byte EFFECT_EVASION_UP_2\n\t.byte EFFECT_ATTACK_DOWN_2\n\t.byte EFFECT_DEFENSE_DOWN_2\n\t.byte EFFECT_SPEED_DOWN_2\n\t.byte EFFECT_SPECIAL_ATTACK_DOWN_2\n\t.byte EFFECT_SPECIAL_DEFENSE_DOWN_2\n\t.byte EFFECT_ACCURACY_DOWN_2\n\t.byte EFFECT_EVASION_DOWN_2\n\t.byte EFFECT_POISON\n\t.byte EFFECT_PAIN_SPLIT\n\t.byte EFFECT_PERISH_SONG\n\t.byte EFFECT_SAFEGUARD\n\t.byte EFFECT_TICKLE\n\t.byte EFFECT_COSMIC_POWER\n\t.byte EFFECT_BULK_UP\n\t.byte EFFECT_CALM_MIND\n\t.byte EFFECT_DRAGON_DANCE\n\t.byte -1\n\nAI_HPAware_DiscouragedEffectsWhenTargetLowHP::\n\t.byte EFFECT_SLEEP\n\t.byte EFFECT_EXPLOSION\n\t.byte EFFECT_ATTACK_UP\n\t.byte EFFECT_DEFENSE_UP\n\t.byte EFFECT_SPEED_UP\n\t.byte EFFECT_SPECIAL_ATTACK_UP\n\t.byte EFFECT_SPECIAL_DEFENSE_UP\n\t.byte EFFECT_ACCURACY_UP\n\t.byte EFFECT_EVASION_UP\n\t.byte EFFECT_ATTACK_DOWN\n\t.byte EFFECT_DEFENSE_DOWN\n\t.byte EFFECT_SPEED_DOWN\n\t.byte EFFECT_SPECIAL_ATTACK_DOWN\n\t.byte EFFECT_SPECIAL_DEFENSE_DOWN\n\t.byte EFFECT_ACCURACY_DOWN\n\t.byte EFFECT_EVASION_DOWN\n\t.byte EFFECT_BIDE\n\t.byte EFFECT_CONVERSION\n\t.byte EFFECT_TOXIC\n\t.byte EFFECT_LIGHT_SCREEN\n\t.byte EFFECT_OHKO\n\t.byte EFFECT_SUPER_FANG  @ Maybe supposed to be EFFECT_RAZOR_WIND\n\t.byte EFFECT_SUPER_FANG\n\t.byte EFFECT_MIST\n\t.byte EFFECT_FOCUS_ENERGY\n\t.byte EFFECT_CONFUSE\n\t.byte EFFECT_ATTACK_UP_2\n\t.byte EFFECT_DEFENSE_UP_2\n\t.byte EFFECT_SPEED_UP_2\n\t.byte EFFECT_SPECIAL_ATTACK_UP_2\n\t.byte EFFECT_SPECIAL_DEFENSE_UP_2\n\t.byte EFFECT_ACCURACY_UP_2\n\t.byte EFFECT_EVASION_UP_2\n\t.byte EFFECT_ATTACK_DOWN_2\n\t.byte EFFECT_DEFENSE_DOWN_2\n\t.byte EFFECT_SPEED_DOWN_2\n\t.byte EFFECT_SPECIAL_ATTACK_DOWN_2\n\t.byte EFFECT_SPECIAL_DEFENSE_DOWN_2\n\t.byte EFFECT_ACCURACY_DOWN_2\n\t.byte EFFECT_EVASION_DOWN_2\n\t.byte EFFECT_POISON\n\t.byte EFFECT_PARALYZE\n\t.byte EFFECT_PAIN_SPLIT\n\t.byte EFFECT_CONVERSION_2\n\t.byte EFFECT_LOCK_ON\n\t.byte EFFECT_SPITE\n\t.byte EFFECT_PERISH_SONG\n\t.byte EFFECT_SWAGGER\n\t.byte EFFECT_FURY_CUTTER\n\t.byte EFFECT_ATTRACT\n\t.byte EFFECT_SAFEGUARD\n\t.byte EFFECT_PSYCH_UP\n\t.byte EFFECT_MIRROR_COAT\n\t.byte EFFECT_WILL_O_WISP\n\t.byte EFFECT_TICKLE\n\t.byte EFFECT_COSMIC_POWER\n\t.byte EFFECT_BULK_UP\n\t.byte EFFECT_CALM_MIND\n\t.byte EFFECT_DRAGON_DANCE\n\t.byte -1\n\nAI_Unknown::\n\tif_not_effect EFFECT_SUNNY_DAY, AI_Unknown_End\n\tif_equal 0, AI_Unknown_End\n\tis_first_turn_for AI_USER\n\tif_equal 0, AI_Unknown_End\n\tscore +5\n\nAI_Unknown_End::\n\tend\n\nAI_Roaming::\n\tif_status2 AI_USER, STATUS2_WRAPPED, AI_Roaming_End\n\tif_status2 AI_USER, STATUS2_ESCAPE_PREVENTION, AI_Roaming_End\n\tget_ability AI_TARGET\n\tif_equal ABILITY_SHADOW_TAG, AI_Roaming_End\n\tget_ability AI_USER\n\tif_equal ABILITY_LEVITATE, AI_Roaming_Flee\n\tget_ability AI_TARGET\n\tif_equal ABILITY_ARENA_TRAP, AI_Roaming_End\n\nAI_Roaming_Flee::\n\tflee\n\nAI_Roaming_End::\n\tend\n\nAI_Safari::\n\tif_random_safari_flee AI_Safari_Flee\n\twatch\n\nAI_Safari_Flee::\n\tflee\n\n@ From Hoenns Poochyena fight (Zigzagoon in Emerald)\nAI_FirstBattle::\n\tif_hp_equal AI_TARGET, 20, AI_FirstBattle_Flee\n\tif_hp_less_than AI_TARGET, 20, AI_FirstBattle_Flee\n\tend\n\nAI_FirstBattle_Flee::\n\tflee\n\nAI_Ret::\n\tend\n"
  },
  {
    "path": "data/battle_anim_scripts.s",
    "content": "#include \"constants/battle.h\"\n#include \"constants/battle_anim.h\"\n#include \"constants/battle_string_ids.h\"\n#include \"constants/rgb.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n#include \"constants/moves.h\"\n\t.include \"asm/macros.inc\"\n\t.include \"asm/macros/battle_anim_script.inc\"\n\t.include \"constants/constants.inc\"\n\n\t.section script_data, \"aw\", %progbits\n\n\t.align 2\ngMovesWithQuietBGM::\n\t.2byte MOVE_SING\n\t.2byte MOVE_PERISH_SONG\n\t.2byte MOVE_GRASS_WHISTLE\n\t.2byte 0xFFFF\n\n\t.align 2\ngBattleAnims_Moves::\n\t.4byte Move_NONE\n\t.4byte Move_POUND\n\t.4byte Move_KARATE_CHOP\n\t.4byte Move_DOUBLE_SLAP\n\t.4byte Move_COMET_PUNCH\n\t.4byte Move_MEGA_PUNCH\n\t.4byte Move_PAY_DAY\n\t.4byte Move_FIRE_PUNCH\n\t.4byte Move_ICE_PUNCH\n\t.4byte Move_THUNDER_PUNCH\n\t.4byte Move_SCRATCH\n\t.4byte Move_VICE_GRIP\n\t.4byte Move_GUILLOTINE\n\t.4byte Move_RAZOR_WIND\n\t.4byte Move_SWORDS_DANCE\n\t.4byte Move_CUT\n\t.4byte Move_GUST\n\t.4byte Move_WING_ATTACK\n\t.4byte Move_WHIRLWIND\n\t.4byte Move_FLY\n\t.4byte Move_BIND\n\t.4byte Move_SLAM\n\t.4byte Move_VINE_WHIP\n\t.4byte Move_STOMP\n\t.4byte Move_DOUBLE_KICK\n\t.4byte Move_MEGA_KICK\n\t.4byte Move_JUMP_KICK\n\t.4byte Move_ROLLING_KICK\n\t.4byte Move_SAND_ATTACK\n\t.4byte Move_HEADBUTT\n\t.4byte Move_HORN_ATTACK\n\t.4byte Move_FURY_ATTACK\n\t.4byte Move_HORN_DRILL\n\t.4byte Move_TACKLE\n\t.4byte Move_BODY_SLAM\n\t.4byte Move_WRAP\n\t.4byte Move_TAKE_DOWN\n\t.4byte Move_THRASH\n\t.4byte Move_DOUBLE_EDGE\n\t.4byte Move_TAIL_WHIP\n\t.4byte Move_POISON_STING\n\t.4byte Move_TWINEEDLE\n\t.4byte Move_PIN_MISSILE\n\t.4byte Move_LEER\n\t.4byte Move_BITE\n\t.4byte Move_GROWL\n\t.4byte Move_ROAR\n\t.4byte Move_SING\n\t.4byte Move_SUPERSONIC\n\t.4byte Move_SONIC_BOOM\n\t.4byte Move_DISABLE\n\t.4byte Move_ACID\n\t.4byte Move_EMBER\n\t.4byte Move_FLAMETHROWER\n\t.4byte Move_MIST\n\t.4byte Move_WATER_GUN\n\t.4byte Move_HYDRO_PUMP\n\t.4byte Move_SURF\n\t.4byte Move_ICE_BEAM\n\t.4byte Move_BLIZZARD\n\t.4byte Move_PSYBEAM\n\t.4byte Move_BUBBLE_BEAM\n\t.4byte Move_AURORA_BEAM\n\t.4byte Move_HYPER_BEAM\n\t.4byte Move_PECK\n\t.4byte Move_DRILL_PECK\n\t.4byte Move_SUBMISSION\n\t.4byte Move_LOW_KICK\n\t.4byte Move_COUNTER\n\t.4byte Move_SEISMIC_TOSS\n\t.4byte Move_STRENGTH\n\t.4byte Move_ABSORB\n\t.4byte Move_MEGA_DRAIN\n\t.4byte Move_LEECH_SEED\n\t.4byte Move_GROWTH\n\t.4byte Move_RAZOR_LEAF\n\t.4byte Move_SOLAR_BEAM\n\t.4byte Move_POISON_POWDER\n\t.4byte Move_STUN_SPORE\n\t.4byte Move_SLEEP_POWDER\n\t.4byte Move_PETAL_DANCE\n\t.4byte Move_STRING_SHOT\n\t.4byte Move_DRAGON_RAGE\n\t.4byte Move_FIRE_SPIN\n\t.4byte Move_THUNDER_SHOCK\n\t.4byte Move_THUNDERBOLT\n\t.4byte Move_THUNDER_WAVE\n\t.4byte Move_THUNDER\n\t.4byte Move_ROCK_THROW\n\t.4byte Move_EARTHQUAKE\n\t.4byte Move_FISSURE\n\t.4byte Move_DIG\n\t.4byte Move_TOXIC\n\t.4byte Move_CONFUSION\n\t.4byte Move_PSYCHIC\n\t.4byte Move_HYPNOSIS\n\t.4byte Move_MEDITATE\n\t.4byte Move_AGILITY\n\t.4byte Move_QUICK_ATTACK\n\t.4byte Move_RAGE\n\t.4byte Move_TELEPORT\n\t.4byte Move_NIGHT_SHADE\n\t.4byte Move_MIMIC\n\t.4byte Move_SCREECH\n\t.4byte Move_DOUBLE_TEAM\n\t.4byte Move_RECOVER\n\t.4byte Move_HARDEN\n\t.4byte Move_MINIMIZE\n\t.4byte Move_SMOKESCREEN\n\t.4byte Move_CONFUSE_RAY\n\t.4byte Move_WITHDRAW\n\t.4byte Move_DEFENSE_CURL\n\t.4byte Move_BARRIER\n\t.4byte Move_LIGHT_SCREEN\n\t.4byte Move_HAZE\n\t.4byte Move_REFLECT\n\t.4byte Move_FOCUS_ENERGY\n\t.4byte Move_BIDE\n\t.4byte Move_METRONOME\n\t.4byte Move_MIRROR_MOVE\n\t.4byte Move_SELF_DESTRUCT\n\t.4byte Move_EGG_BOMB\n\t.4byte Move_LICK\n\t.4byte Move_SMOG\n\t.4byte Move_SLUDGE\n\t.4byte Move_BONE_CLUB\n\t.4byte Move_FIRE_BLAST\n\t.4byte Move_WATERFALL\n\t.4byte Move_CLAMP\n\t.4byte Move_SWIFT\n\t.4byte Move_SKULL_BASH\n\t.4byte Move_SPIKE_CANNON\n\t.4byte Move_CONSTRICT\n\t.4byte Move_AMNESIA\n\t.4byte Move_KINESIS\n\t.4byte Move_SOFT_BOILED\n\t.4byte Move_HI_JUMP_KICK\n\t.4byte Move_GLARE\n\t.4byte Move_DREAM_EATER\n\t.4byte Move_POISON_GAS\n\t.4byte Move_BARRAGE\n\t.4byte Move_LEECH_LIFE\n\t.4byte Move_LOVELY_KISS\n\t.4byte Move_SKY_ATTACK\n\t.4byte Move_TRANSFORM\n\t.4byte Move_BUBBLE\n\t.4byte Move_DIZZY_PUNCH\n\t.4byte Move_SPORE\n\t.4byte Move_FLASH\n\t.4byte Move_PSYWAVE\n\t.4byte Move_SPLASH\n\t.4byte Move_ACID_ARMOR\n\t.4byte Move_CRABHAMMER\n\t.4byte Move_EXPLOSION\n\t.4byte Move_FURY_SWIPES\n\t.4byte Move_BONEMERANG\n\t.4byte Move_REST\n\t.4byte Move_ROCK_SLIDE\n\t.4byte Move_HYPER_FANG\n\t.4byte Move_SHARPEN\n\t.4byte Move_CONVERSION\n\t.4byte Move_TRI_ATTACK\n\t.4byte Move_SUPER_FANG\n\t.4byte Move_SLASH\n\t.4byte Move_SUBSTITUTE\n\t.4byte Move_STRUGGLE\n\t.4byte Move_SKETCH\n\t.4byte Move_TRIPLE_KICK\n\t.4byte Move_THIEF\n\t.4byte Move_SPIDER_WEB\n\t.4byte Move_MIND_READER\n\t.4byte Move_NIGHTMARE\n\t.4byte Move_FLAME_WHEEL\n\t.4byte Move_SNORE\n\t.4byte Move_CURSE\n\t.4byte Move_FLAIL\n\t.4byte Move_CONVERSION_2\n\t.4byte Move_AEROBLAST\n\t.4byte Move_COTTON_SPORE\n\t.4byte Move_REVERSAL\n\t.4byte Move_SPITE\n\t.4byte Move_POWDER_SNOW\n\t.4byte Move_PROTECT\n\t.4byte Move_MACH_PUNCH\n\t.4byte Move_SCARY_FACE\n\t.4byte Move_FAINT_ATTACK\n\t.4byte Move_SWEET_KISS\n\t.4byte Move_BELLY_DRUM\n\t.4byte Move_SLUDGE_BOMB\n\t.4byte Move_MUD_SLAP\n\t.4byte Move_OCTAZOOKA\n\t.4byte Move_SPIKES\n\t.4byte Move_ZAP_CANNON\n\t.4byte Move_FORESIGHT\n\t.4byte Move_DESTINY_BOND\n\t.4byte Move_PERISH_SONG\n\t.4byte Move_ICY_WIND\n\t.4byte Move_DETECT\n\t.4byte Move_BONE_RUSH\n\t.4byte Move_LOCK_ON\n\t.4byte Move_OUTRAGE\n\t.4byte Move_SANDSTORM\n\t.4byte Move_GIGA_DRAIN\n\t.4byte Move_ENDURE\n\t.4byte Move_CHARM\n\t.4byte Move_ROLLOUT\n\t.4byte Move_FALSE_SWIPE\n\t.4byte Move_SWAGGER\n\t.4byte Move_MILK_DRINK\n\t.4byte Move_SPARK\n\t.4byte Move_FURY_CUTTER\n\t.4byte Move_STEEL_WING\n\t.4byte Move_MEAN_LOOK\n\t.4byte Move_ATTRACT\n\t.4byte Move_SLEEP_TALK\n\t.4byte Move_HEAL_BELL\n\t.4byte Move_RETURN\n\t.4byte Move_PRESENT\n\t.4byte Move_FRUSTRATION\n\t.4byte Move_SAFEGUARD\n\t.4byte Move_PAIN_SPLIT\n\t.4byte Move_SACRED_FIRE\n\t.4byte Move_MAGNITUDE\n\t.4byte Move_DYNAMIC_PUNCH\n\t.4byte Move_MEGAHORN\n\t.4byte Move_DRAGON_BREATH\n\t.4byte Move_BATON_PASS\n\t.4byte Move_ENCORE\n\t.4byte Move_PURSUIT\n\t.4byte Move_RAPID_SPIN\n\t.4byte Move_SWEET_SCENT\n\t.4byte Move_IRON_TAIL\n\t.4byte Move_METAL_CLAW\n\t.4byte Move_VITAL_THROW\n\t.4byte Move_MORNING_SUN\n\t.4byte Move_SYNTHESIS\n\t.4byte Move_MOONLIGHT\n\t.4byte Move_HIDDEN_POWER\n\t.4byte Move_CROSS_CHOP\n\t.4byte Move_TWISTER\n\t.4byte Move_RAIN_DANCE\n\t.4byte Move_SUNNY_DAY\n\t.4byte Move_CRUNCH\n\t.4byte Move_MIRROR_COAT\n\t.4byte Move_PSYCH_UP\n\t.4byte Move_EXTREME_SPEED\n\t.4byte Move_ANCIENT_POWER\n\t.4byte Move_SHADOW_BALL\n\t.4byte Move_FUTURE_SIGHT\n\t.4byte Move_ROCK_SMASH\n\t.4byte Move_WHIRLPOOL\n\t.4byte Move_BEAT_UP\n\t.4byte Move_FAKE_OUT\n\t.4byte Move_UPROAR\n\t.4byte Move_STOCKPILE\n\t.4byte Move_SPIT_UP\n\t.4byte Move_SWALLOW\n\t.4byte Move_HEAT_WAVE\n\t.4byte Move_HAIL\n\t.4byte Move_TORMENT\n\t.4byte Move_FLATTER\n\t.4byte Move_WILL_O_WISP\n\t.4byte Move_MEMENTO\n\t.4byte Move_FACADE\n\t.4byte Move_FOCUS_PUNCH\n\t.4byte Move_SMELLING_SALT\n\t.4byte Move_FOLLOW_ME\n\t.4byte Move_NATURE_POWER\n\t.4byte Move_CHARGE\n\t.4byte Move_TAUNT\n\t.4byte Move_HELPING_HAND\n\t.4byte Move_TRICK\n\t.4byte Move_ROLE_PLAY\n\t.4byte Move_WISH\n\t.4byte Move_ASSIST\n\t.4byte Move_INGRAIN\n\t.4byte Move_SUPERPOWER\n\t.4byte Move_MAGIC_COAT\n\t.4byte Move_RECYCLE\n\t.4byte Move_REVENGE\n\t.4byte Move_BRICK_BREAK\n\t.4byte Move_YAWN\n\t.4byte Move_KNOCK_OFF\n\t.4byte Move_ENDEAVOR\n\t.4byte Move_ERUPTION\n\t.4byte Move_SKILL_SWAP\n\t.4byte Move_IMPRISON\n\t.4byte Move_REFRESH\n\t.4byte Move_GRUDGE\n\t.4byte Move_SNATCH\n\t.4byte Move_SECRET_POWER\n\t.4byte Move_DIVE\n\t.4byte Move_ARM_THRUST\n\t.4byte Move_CAMOUFLAGE\n\t.4byte Move_TAIL_GLOW\n\t.4byte Move_LUSTER_PURGE\n\t.4byte Move_MIST_BALL\n\t.4byte Move_FEATHER_DANCE\n\t.4byte Move_TEETER_DANCE\n\t.4byte Move_BLAZE_KICK\n\t.4byte Move_MUD_SPORT\n\t.4byte Move_ICE_BALL\n\t.4byte Move_NEEDLE_ARM\n\t.4byte Move_SLACK_OFF\n\t.4byte Move_HYPER_VOICE\n\t.4byte Move_POISON_FANG\n\t.4byte Move_CRUSH_CLAW\n\t.4byte Move_BLAST_BURN\n\t.4byte Move_HYDRO_CANNON\n\t.4byte Move_METEOR_MASH\n\t.4byte Move_ASTONISH\n\t.4byte Move_WEATHER_BALL\n\t.4byte Move_AROMATHERAPY\n\t.4byte Move_FAKE_TEARS\n\t.4byte Move_AIR_CUTTER\n\t.4byte Move_OVERHEAT\n\t.4byte Move_ODOR_SLEUTH\n\t.4byte Move_ROCK_TOMB\n\t.4byte Move_SILVER_WIND\n\t.4byte Move_METAL_SOUND\n\t.4byte Move_GRASS_WHISTLE\n\t.4byte Move_TICKLE\n\t.4byte Move_COSMIC_POWER\n\t.4byte Move_WATER_SPOUT\n\t.4byte Move_SIGNAL_BEAM\n\t.4byte Move_SHADOW_PUNCH\n\t.4byte Move_EXTRASENSORY\n\t.4byte Move_SKY_UPPERCUT\n\t.4byte Move_SAND_TOMB\n\t.4byte Move_SHEER_COLD\n\t.4byte Move_MUDDY_WATER\n\t.4byte Move_BULLET_SEED\n\t.4byte Move_AERIAL_ACE\n\t.4byte Move_ICICLE_SPEAR\n\t.4byte Move_IRON_DEFENSE\n\t.4byte Move_BLOCK\n\t.4byte Move_HOWL\n\t.4byte Move_DRAGON_CLAW\n\t.4byte Move_FRENZY_PLANT\n\t.4byte Move_BULK_UP\n\t.4byte Move_BOUNCE\n\t.4byte Move_MUD_SHOT\n\t.4byte Move_POISON_TAIL\n\t.4byte Move_COVET\n\t.4byte Move_VOLT_TACKLE\n\t.4byte Move_MAGICAL_LEAF\n\t.4byte Move_WATER_SPORT\n\t.4byte Move_CALM_MIND\n\t.4byte Move_LEAF_BLADE\n\t.4byte Move_DRAGON_DANCE\n\t.4byte Move_ROCK_BLAST\n\t.4byte Move_SHOCK_WAVE\n\t.4byte Move_WATER_PULSE\n\t.4byte Move_DOOM_DESIRE\n\t.4byte Move_PSYCHO_BOOST\n\t.4byte Move_COUNT @ cannot be reached, because last move is Psycho Boost\n\n\t.align 2\ngBattleAnims_StatusConditions::\n\t.4byte Status_Poison                    @ B_ANIM_STATUS_PSN\n\t.4byte Status_Confusion                 @ B_ANIM_STATUS_CONFUSION\n\t.4byte Status_Burn                      @ B_ANIM_STATUS_BRN\n\t.4byte Status_Infatuation               @ B_ANIM_STATUS_INFATUATION\n\t.4byte Status_Sleep                     @ B_ANIM_STATUS_SLP\n\t.4byte Status_Paralysis                 @ B_ANIM_STATUS_PRZ\n\t.4byte Status_Freeze                    @ B_ANIM_STATUS_FRZ\n\t.4byte Status_Curse                     @ B_ANIM_STATUS_CURSED\n\t.4byte Status_Nightmare                 @ B_ANIM_STATUS_NIGHTMARE\n\n\t.align 2\ngBattleAnims_General::\n\t.4byte General_CastformChange           @ B_ANIM_CASTFORM_CHANGE\n\t.4byte General_StatsChange              @ B_ANIM_STATS_CHANGE\n\t.4byte General_SubstituteFade           @ B_ANIM_SUBSTITUTE_FADE\n\t.4byte General_SubstituteAppear         @ B_ANIM_SUBSTITUTE_APPEAR\n\t.4byte General_BaitThrow                @ B_ANIM_BAIT_THROW\n\t.4byte General_ItemKnockoff             @ B_ANIM_ITEM_KNOCKOFF\n\t.4byte General_TurnTrap                 @ B_ANIM_TURN_TRAP\n\t.4byte General_HeldItemEffect           @ B_ANIM_HELD_ITEM_EFFECT\n\t.4byte General_SmokeballEscape          @ B_ANIM_SMOKEBALL_ESCAPE\n\t.4byte General_FocusBand                @ B_ANIM_FOCUS_BAND\n\t.4byte General_Rain                     @ B_ANIM_RAIN_CONTINUES\n\t.4byte General_Sun                      @ B_ANIM_SUN_CONTINUES\n\t.4byte General_Sandstorm                @ B_ANIM_SANDSTORM_CONTINUES\n\t.4byte General_Hail                     @ B_ANIM_HAIL_CONTINUES\n\t.4byte General_LeechSeedDrain           @ B_ANIM_LEECH_SEED_DRAIN\n\t.4byte General_MonHit                   @ B_ANIM_MON_HIT\n\t.4byte General_ItemSteal                @ B_ANIM_ITEM_STEAL\n\t.4byte General_SnatchMove               @ B_ANIM_SNATCH_MOVE\n\t.4byte General_FutureSightHit           @ B_ANIM_FUTURE_SIGHT_HIT\n\t.4byte General_DoomDesireHit            @ B_ANIM_DOOM_DESIRE_HIT\n\t.4byte General_FocusPunchSetUp          @ B_ANIM_FOCUS_PUNCH_SETUP\n\t.4byte General_IngrainHeal              @ B_ANIM_INGRAIN_HEAL\n\t.4byte General_WishHeal                 @ B_ANIM_WISH_HEAL\n\t.4byte General_MonScared                @ B_ANIM_MON_SCARED\n\t.4byte General_GhostGetOut              @ B_ANIM_GHOST_GET_OUT\n\t.4byte General_SilphScoped              @ B_ANIM_SILPH_SCOPED\n\t.4byte General_SafariRockThrow          @ B_ANIM_ROCK_THROW\n\t.4byte General_SafariReaction           @ B_ANIM_SAFARI_REACTION\n\n\t.align 2\ngBattleAnims_Special::\n\t.4byte Special_LevelUp                  @ B_ANIM_LVL_UP\n\t.4byte Special_SwitchOutPlayerMon       @ B_ANIM_SWITCH_OUT_PLAYER_MON\n\t.4byte Special_SwitchOutOpponentMon     @ B_ANIM_SWITCH_OUT_OPPONENT_MON\n\t.4byte Special_BallThrow                @ B_ANIM_BALL_THROW\n\t.4byte Special_BallThrowWithTrainer     @ B_ANIM_BALL_THROW_WITH_TRAINER\n\t.4byte Special_SubstituteToMon          @ B_ANIM_SUBSTITUTE_TO_MON\n\t.4byte Special_MonToSubstitute          @ B_ANIM_MON_TO_SUBSTITUTE\n\nMove_NONE:\nMove_MIRROR_MOVE:\nMove_POUND:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_DOUBLE_SLAP:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tchoosetwoturnanim DoubleSlapLeft, DoubleSlapRight\n\nDoubleSlapContinue:\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nDoubleSlapLeft:\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 2\n\tgoto DoubleSlapContinue\n\nDoubleSlapRight:\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 2\n\tgoto DoubleSlapContinue\n\nMove_POISON_POWDER:\n\tloadspritegfx ANIM_TAG_POISON_POWDER\n\tloadspritegfx ANIM_TAG_POISON_BUBBLE\n\tloopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 10, 6\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -30, -22, 117, 80, 5, 1\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 10, -22, 117, 80, -5, 1\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -25, -22, 117, 112, 5, 3\n\tdelay 15\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 80, -5, 1\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 96, 5, 1\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 69, -5, 1\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2\n\tdelay 30\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 15, -22, 117, 80, -5, 1\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 96, 7, 2\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 90, -8, 0\n\tdelay 20\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 80, -5, 1\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 89, 5, 2\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 20, -22, 117, 112, -8, 2\n\tcreatesprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 80, 5, 1\n\twaitforvisualfinish\n\tend\n\nMove_STUN_SPORE:\n\tloadspritegfx ANIM_TAG_STUN_SPORE\n\tloopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 10, 6\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -30, -22, 117, 80, 5, 1\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 10, -22, 117, 80, -5, 1\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -25, -22, 117, 112, 5, 3\n\tdelay 15\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 80, -5, 1\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 96, 5, 1\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 69, -5, 1\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2\n\tdelay 30\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 15, -22, 117, 80, -5, 1\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 96, 7, 2\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 90, -8, 0\n\tdelay 20\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 80, -5, 1\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 89, 5, 2\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 20, -22, 117, 112, -8, 2\n\tcreatesprite gStunSporeParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 80, 5, 1\n\twaitforvisualfinish\n\tend\n\nMove_SLEEP_POWDER:\n\tloadspritegfx ANIM_TAG_SLEEP_POWDER\n\tloopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 10, 6\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -30, -22, 117, 80, 5, 1\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 10, -22, 117, 80, -5, 1\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -25, -22, 117, 112, 5, 3\n\tdelay 15\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 80, -5, 1\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 96, 5, 1\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 69, -5, 1\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2\n\tdelay 30\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -15, -22, 117, 112, 5, 2\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 15, -22, 117, 80, -5, 1\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 96, 7, 2\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -5, -22, 117, 90, -8, 0\n\tdelay 20\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, -10, -22, 117, 80, -5, 1\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0, -22, 117, 89, 5, 2\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 20, -22, 117, 112, -8, 2\n\tcreatesprite gSleepPowderParticleSpriteTemplate, ANIM_TARGET, 2, 5, -22, 117, 80, 5, 1\n\twaitforvisualfinish\n\tend\n\nMove_SWIFT:\n\tloadspritegfx ANIM_TAG_YELLOW_STAR\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER\n\tcreatesprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, 20, 1\n\tdelay 5\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER\n\tcreatesprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 5, 22, -18, 1\n\tdelay 5\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER\n\tcreatesprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, -10, 22, 15, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 18, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 18, 1\n\tdelay 5\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER\n\tcreatesprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, -20, 1\n\tdelay 5\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER\n\tcreatesprite gSwiftStarSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, 12, 1\n\tdelay 5\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_STRENGTH:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ShakeAndSinkMon, 5, ANIM_ATTACKER, 2, 0, 96, 30\n\twaitforvisualfinish\n\tdelay 10\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 4\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_TARGET, 18, 6, 2, 4\n\tdelay 4\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 16, 12, ANIM_TARGET, 1\n\tdelay 4\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, -12, ANIM_TARGET, 1\n\tdelay 4\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 3, 4, ANIM_TARGET, 1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_TACKLE:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4\n\tdelay 6\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_BODY_SLAM:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER\n\twaitforvisualfinish\n\tdelay 11\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5\n\tdelay 6\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0\n\tloopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 10, 2\n\tdelay 1\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1\n\twaitforvisualfinish\n\tdelay 10\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 6\n\tdelay 5\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_SUPERSONIC:\n\tloadspritegfx ANIM_TAG_GOLD_RING\n\tmonbg ANIM_ATK_PARTNER\n\tsplitbgprio_foes ANIM_ATTACKER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 2, 0, 8, 1\n\tcall SupersonicRing\n\tcall SupersonicRing\n\tcall SupersonicRing\n\tcall SupersonicRing\n\tcall SupersonicRing\n\tcall SupersonicRing\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tend\n\nSupersonicRing:\n\tplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER\n\tcreatesprite gSupersonicRingSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 30, 0\n\tdelay 2\n\treturn\n\nMove_SCREECH:\n\tloadspritegfx ANIM_TAG_PURPLE_RING\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 3, 0, 2, 1\n\tcall ScreechRing\n\tcall ScreechRing\n\tdelay 16\n\tcreatevisualtask AnimTask_SwayMon, 5, 0, 6, 2048, 2, ANIM_TARGET\n\twaitforvisualfinish\n\tend\n\nScreechRing:\n\tplaysewithpan SE_M_SCREECH, SOUND_PAN_ATTACKER\n\tcreatesprite gScreechRingSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 30, 0\n\tdelay 2\n\treturn\n\nMove_FLAME_WHEEL:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_foes ANIM_TARGET\n\tcreatesprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 6\n\tdelay 4\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 8, 1\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1\n\tplaysewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET\n\tcall FireSpreadEffect\n\tdelay 7\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 9\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nFlameWheel1: @ Unused\n\tcreatesprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 50\n\tdelay 4\n\treturn\n\nMove_PIN_MISSILE:\n\tloadspritegfx ANIM_TAG_NEEDLE\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER\n\tcreatesprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, -8, -8, 20, -32\n\tdelay 15\n\tcreatesprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 8, 8, 20, -40\n\tdelay 4\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -8, -8, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1\n\tdelay 9\n\tcreatesprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 0, 0, 20, -32\n\tdelay 4\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 8, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1\n\tdelay 14\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_ICICLE_SPEAR:\n\tloadspritegfx ANIM_TAG_ICICLE_SPEAR\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER\n\tcreatesprite gIcicleSpearSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, -8, -8, 20, -32\n\tdelay 15\n\tcreatesprite gIcicleSpearSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 8, 8, 20, -40\n\tdelay 4\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -8, -8, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1\n\tdelay 9\n\tcreatesprite gIcicleSpearSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 0, 0, 20, -32\n\tdelay 4\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 8, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1\n\tdelay 14\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_TAKE_DOWN:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10\n\tdelay 35\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 10, RGB_BLACK, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tdelay 1\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, 0, 0, 4\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1\n\twaitforvisualfinish\n\tdelay 2\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5\n\tdelay 3\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_DOUBLE_EDGE:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0\n\twaitforvisualfinish\n\tdelay 10\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4\n\tdelay 3\n\twaitforvisualfinish\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0\n\tcreatevisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1\n\tcreatevisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5\n\tdelay 3\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7\n\twaitforvisualfinish\n\tend\n\nMove_POISON_STING:\n\tloadspritegfx ANIM_TAG_NEEDLE\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_POISON_BUBBLE\n\tmonbg ANIM_TARGET\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER\n\tcreatesprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 20, 0, -8, 0, 20\n\twaitforvisualfinish\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 5, 1\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcall PoisonBubblesEffect\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_TWINEEDLE:\n\tloadspritegfx ANIM_TAG_NEEDLE\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tloopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 6, 2\n\tcreatesprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 10, -4, 0, -4, 20\n\tcreatesprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 20, 12, 10, 12, 20\n\tdelay 20\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 5, 1\n\tcreatesprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -4, 1, 3\n\tloopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 5, 2\n\tdelay 1\n\tcreatesprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 10, 12, 1, 3\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_FIRE_BLAST:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tcreatesoundtask SoundTask_FireBlast, SE_M_FLAME_WHEEL, SE_M_FLAME_WHEEL2\n\tcall FireBlastRing\n\tcall FireBlastRing\n\tcall FireBlastRing\n\tdelay 24\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 0, 8, RGB_BLACK\n\twaitforvisualfinish\n\tdelay 19\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 20, 1\n\tcall FireBlastCross\n\tdelay 3\n\tcall FireBlastCross\n\tdelay 3\n\tcall FireBlastCross\n\tdelay 3\n\tcall FireBlastCross\n\tdelay 3\n\tcall FireBlastCross\n\tdelay 3\n\tcall FireBlastCross\n\tdelay 3\n\tcall FireBlastCross\n\tdelay 3\n\tcall FireBlastCross\n\tdelay 3\n\tcall FireBlastCross\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 2, 8, 0, RGB_BLACK\n\twaitforvisualfinish\n\tend\n\nFireBlastRing:\n\tcreatesprite gFireBlastRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0\n\tcreatesprite gFireBlastRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 51\n\tcreatesprite gFireBlastRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 102\n\tcreatesprite gFireBlastRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 153\n\tcreatesprite gFireBlastRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 204\n\tdelay 5\n\treturn\n\nFireBlastCross:\n\tcreatesprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0, 0, 10, 0, -2\n\tcreatesprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0, 0, 13, -2, 0\n\tcreatesprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0, 0, 13, 2, 0\n\tcreatesprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0, 0, 15, -2, 2\n\tcreatesprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0, 0, 15, 2, 2\n\treturn\n\nMove_LEECH_SEED:\n\tloadspritegfx ANIM_TAG_SEED\n\tplaysewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER\n\tcreatesprite gLeechSeedSpriteTemplate, ANIM_TARGET, 2, 15, 0, 0, 24, 35, -32\n\tdelay 8\n\tplaysewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER\n\tcreatesprite gLeechSeedSpriteTemplate, ANIM_TARGET, 2, 15, 0, -16, 24, 35, -40\n\tdelay 8\n\tplaysewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER\n\tcreatesprite gLeechSeedSpriteTemplate, ANIM_TARGET, 2, 15, 0, 16, 24, 35, -37\n\tdelay 12\n\tloopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_TARGET, 10, 8\n\twaitforvisualfinish\n\tend\n\nMove_EMBER:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tloopsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER, 5, 2\n\tcreatesprite gEmberSpriteTemplate, ANIM_TARGET, 2, 20, 0, -16, 24, 20, 1\n\tdelay 4\n\tcreatesprite gEmberSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 24, 20, 1\n\tdelay 4\n\tcreatesprite gEmberSpriteTemplate, ANIM_TARGET, 2, 20, 0, 16, 24, 20, 1\n\tdelay 16\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET\n\tcall EmberFireHit\n\tcall EmberFireHit\n\tcall EmberFireHit\n\tend\n\nEmberFireHit:\n\tcreatesprite gEmberFlareSpriteTemplate, ANIM_TARGET, 2, -24, 24, 24, 24, 20, ANIM_TARGET, 1\n\tdelay 4\n\treturn\n\nMove_MEGA_PUNCH:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tmonbg ANIM_TARGET\n\tdelay 2\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 0, 16, RGB_BLACK\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET\n\tcreatesprite gMegaPunchKickSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 50\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_WHITE\n\tdelay 50\n\tcall SetImpactBackground\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_WHITE\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tdelay 2\n\trestorebg\n\twaitbgfadein\n\tend\n\nSetImpactBackground:\n\tdelay 2\n\tcreatevisualtask AnimTask_IsContest, 2\n\tjumprettrue SetImpactContestsBG\n\tcreatevisualtask AnimTask_IsTargetPlayerSide, 2\n\tjumpretfalse SetImpactOpponentBG\n\tjumprettrue SetImpactPlayerBG\nSetImpactBackgroundRet:\n\treturn\n\nSetImpactOpponentBG:\n\tchangebg BG_IMPACT_OPPONENT\n\tgoto SetImpactBackgroundRet\n\nSetImpactPlayerBG:\n\tchangebg BG_IMPACT_PLAYER\n\tgoto SetImpactBackgroundRet\n\nSetImpactContestsBG:\n\tchangebg BG_IMPACT_CONTESTS\n\tgoto SetImpactBackgroundRet\n\nMove_MEGA_KICK:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tmonbg ANIM_TARGET\n\tdelay 2\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 0, 16, RGB_BLACK\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET\n\tcreatesprite gMegaPunchKickSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 50\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_WHITE\n\tdelay 50\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tcall SetImpactBackground\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_WHITE\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tdelay 2\n\trestorebg\n\twaitbgfadein\n\tend\n\nMove_COMET_PUNCH:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tchoosetwoturnanim CometPunchLeft, CometPunchRight\n\nCometPunchContinue:\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nCometPunchLeft:\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, -8, ANIM_TARGET, 2\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -8, 0, 8, 1, 0\n\tgoto CometPunchContinue\n\nCometPunchRight:\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, -8, ANIM_TARGET, 2\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 8, 0, 8, 1, 0\n\tgoto CometPunchContinue\n\nMove_SONIC_BOOM:\n\tloadspritegfx ANIM_TAG_AIR_WAVE\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tcall SonicBoomProjectile\n\tcall SonicBoomProjectile\n\tcall SonicBoomProjectile\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 10, 1\n\tcall SonicBoomHit\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nSonicBoomProjectile:\n\tplaysewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER\n\tcreatesprite gSonicBoomSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 15\n\tdelay 4\n\treturn\n\nSonicBoomHit:\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 2\n\tdelay 4\n\treturn\n\nMove_THUNDER_SHOCK:\n\tloadspritegfx ANIM_TAG_SPARK\n\tloadspritegfx ANIM_TAG_SPARK_2\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 6, RGB_BLACK\n\twaitforvisualfinish\n\tdelay 10\n\tcreatevisualtask AnimTask_ElectricBolt, 5, 0, -44, 0\n\tplaysewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET\n\tdelay 9\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 0, 13, RGB_BLACK\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 13, 0, RGB_BLACK\n\twaitforvisualfinish\n\tdelay 20\n\tcall ElectricityEffect\n\twaitforvisualfinish\n\tdelay 20\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 0, RGB_BLACK\n\twaitforvisualfinish\n\tend\n\nMove_THUNDERBOLT:\n\tloadspritegfx ANIM_TAG_SPARK\n\tloadspritegfx ANIM_TAG_SHOCK_3\n\tloadspritegfx ANIM_TAG_SPARK_2\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 6, RGB_BLACK\n\twaitforvisualfinish\n\tdelay 10\n\tcreatevisualtask AnimTask_ElectricBolt, 5, 24, -52, 0\n\tplaysewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET\n\tdelay 7\n\tcreatevisualtask AnimTask_ElectricBolt, 5, -24, -52, 0\n\tplaysewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET\n\tdelay 7\n\tcreatevisualtask AnimTask_ElectricBolt, 5, 0, -60, 1\n\tplaysewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET\n\tdelay 9\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 0, 13, RGB_BLACK\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 13, 0, RGB_BLACK\n\twaitforvisualfinish\n\tdelay 20\n\tcreatesprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 44, 0, 0, 3\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 0, 40, 0, -32765\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 64, 40, 1, -32765\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 128, 40, 0, -32765\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 192, 40, 2, -32765\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 32, 40, 0, -32765\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 96, 40, 1, -32765\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 160, 40, 0, -32765\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 224, 40, 2, -32765\n\tplaysewithpan SE_M_HYPER_BEAM, SOUND_PAN_TARGET\n\tdelay 0\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK\n\tdelay 6\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK\n\tdelay 6\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK\n\tdelay 6\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK\n\twaitforvisualfinish\n\tdelay 20\n\twaitplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 19\n\tcall ElectricityEffect\n\twaitforvisualfinish\n\tdelay 20\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 0, RGB_BLACK\n\twaitforvisualfinish\n\tend\n\nMove_THUNDER_WAVE:\n\tloadspritegfx ANIM_TAG_SPARK\n\tloadspritegfx ANIM_TAG_SPARK_2\n\tloadspritegfx ANIM_TAG_SPARK_H\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 6, RGB_BLACK\n\twaitforvisualfinish\n\tdelay 10\n\tcreatevisualtask AnimTask_ElectricBolt, 5, 0, -48, 0\n\tplaysewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET\n\tdelay 20\n\tloopsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 10, 4\n\tcreatesprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, -16\n\tdelay 4\n\tcreatesprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, 0\n\tdelay 4\n\tcreatesprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, 16\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 0, RGB_BLACK\n\twaitforvisualfinish\n\tend\n\nMove_BEAT_UP:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tchoosetwoturnanim BeatUpLeft, BeatUpRight\n\nBeatUpContinue:\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nBeatUpLeft:\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -20, -20, ANIM_TARGET, 2\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 3, -20, -12, 8, 1, 0\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 8, 0, ANIM_TARGET, 2\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 8, 8, 8, 1, 0\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tgoto BeatUpContinue\n\nBeatUpRight:\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 12, -20, ANIM_TARGET, 2\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 12, -12, 8, 1, 0\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -12, 0, ANIM_TARGET, 2\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 3, -12, 8, 8, 1, 0\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tgoto BeatUpContinue\n\nMove_STOMP:\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET\n\tcreatesprite gStompFootSpriteTemplate, ANIM_ATTACKER, 3, 0, -32, 15\n\tdelay 19\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, -8, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 9, 1\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_TAIL_WHIP:\n\tloopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 24, 3\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 2, 3\n\twaitforvisualfinish\n\tend\n\nMove_CUT:\n\tloadspritegfx ANIM_TAG_CUT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_CUT, SOUND_PAN_TARGET\n\tcreatesprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0\n\tdelay 5\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\twaitforvisualfinish\n\tend\n\nMove_HIDDEN_POWER:\n\tloadspritegfx ANIM_TAG_RED_ORB\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0\n\twaitforvisualfinish\n\tdelay 30\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(31, 31, 19), 12, 5, 1\n\tdelay 4\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0\n\tplaysewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER\n\tcreatesprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 0\n\tcreatesprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 42\n\tcreatesprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 84\n\tcreatesprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 126\n\tcreatesprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 168\n\tcreatesprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 210\n\tdelay 52\n\tsetarg 7, 0xFFFF\n\tplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0\n\tcreatesprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 0\n\tcreatesprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 32\n\tcreatesprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 64\n\tcreatesprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 96\n\tcreatesprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 128\n\tcreatesprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 160\n\tcreatesprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 192\n\tcreatesprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 224\n\tend\n\nMove_REVERSAL:\n\tloadspritegfx ANIM_TAG_BLUE_ORB\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_IMPACT\n\tplaysewithpan SE_M_DETECT, SOUND_PAN_ATTACKER\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 3, RGB_WHITE, 8, RGB_BLACK, 0\n\twaitforvisualfinish\n\tdelay 30\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 2, 0, 10, RGB_WHITE\n\tdelay 10\n\tplaysewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER\n\tcreatesprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 0\n\tcreatesprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 42\n\tcreatesprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 84\n\tcreatesprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 126\n\tcreatesprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 168\n\tcreatesprite gReversalOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 210\n\twaitforvisualfinish\n\tdelay 20\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4\n\tdelay 8\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_WHITE, 8, RGB_BLACK, 0\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 10, 1, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 8, 1, 0\n\tend\n\nMove_PURSUIT:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tfadetobg BG_DARK\n\twaitbgfadein\n\tdelay 0\n\tsetalpha 12, 8\n\tchoosetwoturnanim PursuitNormal, PursuitOnSwitchout\n\nPursuitContinue:\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tdelay 0\n\trestorebg\n\twaitbgfadein\n\tend\n\nPursuitNormal:\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 6, 1, 0\n\tgoto PursuitContinue\n\nPursuitOnSwitchout:\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 6, 1, 0\n\tgoto PursuitContinue\n\nMove_SPIKE_CANNON:\n\tloadspritegfx ANIM_TAG_NEEDLE\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -4, 0, 4, 6, 8, 4\n\twaitforvisualfinish\n\tloopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 5, 3\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5\n\tcreatesprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 10, -8, -8, -8, 20\n\tcreatesprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 0, 0, 20\n\tcreatesprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 8, 8, 20\n\twaitforvisualfinish\n\tcreatesprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -8, -8, 1, 2\n\tcreatesprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 2\n\tcreatesprite gHandleInvertHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 8, 1, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 7, 1\n\tloopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 5, 3\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_SWORDS_DANCE:\n\tloadspritegfx ANIM_TAG_SWORD\n\tmonbg ANIM_ATTACKER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 16, 6, 1, 4\n\tcreatesprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0\n\tdelay 22\n\tcreatevisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tblendoff\n\tdelay 1\n\tend\n\nMove_PSYCH_UP:\n\tloadspritegfx ANIM_TAG_SPIRAL\n\tmonbg ANIM_ATK_PARTNER\n\tcreatevisualtask AnimTask_BlendColorCycleExclude, 2, 1, 2, 6, 1, 11, RGB_BLACK\n\tsetalpha 12, 8\n\tloopsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 5, 10\n\tcreatesprite gPsychUpSpiralSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, 0\n\tcreatevisualtask AnimTask_SwayMon, 5, 0, 5, 2560, 8, ANIM_ATTACKER\n\tdelay 127\n\tdelay 4\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 10, ANIM_ATTACKER, 1\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 9, F_PAL_ATTACKER, 2, 10, 0, RGB_YELLOW\n\tdelay 30\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\twaitforvisualfinish\n\tend\n\nMove_DIZZY_PUNCH:\n\tloadspritegfx ANIM_TAG_DUCK\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcall DizzyPunchLunge\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 5, 16, 8, 20, 1, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 16, 0, ANIM_TARGET, 1\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, 160, -32\n\tcreatesprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, -256, -40\n\tcreatesprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, 128, -16\n\tcreatesprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, 416, -38\n\tcreatesprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, -128, -22\n\tcreatesprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, -384, -31\n\tdelay 10\n\tcall DizzyPunchLunge\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 5, -16, -8, 20, 1, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -16, -16, ANIM_TARGET, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, 160, -32\n\tcreatesprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, -256, -40\n\tcreatesprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, 128, -16\n\tcreatesprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, 416, -38\n\tcreatesprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, -128, -22\n\tcreatesprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, -384, -31\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nDizzyPunchLunge:\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4\n\tdelay 6\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 7, 1\n\treturn\n\nMove_FIRE_SPIN:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tplaysewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 47, 1\n\tcall FireSpinEffect\n\tcall FireSpinEffect\n\tcall FireSpinEffect\n\twaitforvisualfinish\n\tend\n\nFireSpinEffect:\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 28, 528, 30, 13, 50, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 32, 480, 20, 16, -46, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 33, 576, 20, 8, 42, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 31, 400, 25, 11, -42, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 28, 512, 25, 16, 46, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 33, 464, 30, 15, -50, ANIM_TARGET\n\tdelay 2\n\treturn\n\nMove_FURY_CUTTER:\n\tloadspritegfx ANIM_TAG_CUT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_IsFuryCutterHitRight, 2\n\tjumpretfalse FuryCutterLeft\n\tgoto FuryCutterRight\n\nFuryCutterContinue:\n\tcreatevisualtask AnimTask_GetFuryCutterHitCount, 2\n\tjumpreteq 1, FuryCutterContinue2\n\tjumpreteq 2, FuryCutterMedium\n\tjumpreteq 3, FuryCutterStrong\n\tgoto FuryCutterStrongest\n\nFuryCutterContinue2:\n\tdelay 5\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\twaitforvisualfinish\n\tend\n\nFuryCutterLeft:\n\tcreatesprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0\n\tgoto FuryCutterContinue\n\nFuryCutterRight:\n\tcreatesprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 1\n\tgoto FuryCutterContinue\n\nFuryCutterMedium:\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB(9, 8, 10), 4, RGB_BLACK, 0\n\tgoto FuryCutterContinue2\n\nFuryCutterStrong:\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 3, RGB(9, 8, 10), 4, RGB_BLACK, 0\n\tgoto FuryCutterContinue2\n\nFuryCutterStrongest:\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 3, RGB(9, 8, 10), 4, RGB_BLACK, 0\n\tgoto FuryCutterContinue2\n\nMove_SELF_DESTRUCT:\n\tloadspritegfx ANIM_TAG_EXPLOSION\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 9, RGB_RED\n\tcreatevisualtask AnimTask_ShakeMon2, 5, 4, 6, 0, 38, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 5, 5, 6, 0, 38, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 5, 6, 6, 0, 38, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 5, 7, 6, 0, 38, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 5, 8, 6, 0, 38, 1\n\tcall SelfDestructExplode\n\tcall SelfDestructExplode\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 9, 0, RGB_RED\n\tend\n\nSelfDestructExplode:\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_ATTACKER\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_ATTACKER\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 0, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_ATTACKER\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 0, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_ATTACKER\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 0, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_ATTACKER\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 0, 1\n\tdelay 6\n\treturn\n\nMove_SLAM:\n\tloadspritegfx ANIM_TAG_SLAM_HIT\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 3, 0, 4\n\tdelay 1\n\tcreatesprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0, 0\n\tdelay 3\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -12, 10, 0, 3\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5\n\tdelay 3\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1\n\twaitforvisualfinish\n\tdelay 5\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_VINE_WHIP:\n\tloadspritegfx ANIM_TAG_WHIP_HIT\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6\n\tdelay 6\n\tplaysewithpan SE_M_SCRATCH, SOUND_PAN_TARGET\n\tcreatesprite gVineWhipSpriteTemplate, ANIM_TARGET, 2, 0, 0\n\tdelay 6\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 6, 1\n\tend\n\nMove_DRILL_PECK:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_WHIRLWIND_LINES\n\tcreatesprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0\n\tplaysewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tdelay 2\n\tcreatesprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1\n\tdelay 2\n\tloopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 4, 8\n\tcreatevisualtask AnimTask_DrillPeckHitSplats, 5\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1\n\twaitforvisualfinish\n\tcreatesprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 6\n\twaitforvisualfinish\n\tend\n\nMove_WATERFALL:\n\tloadspritegfx ANIM_TAG_WATER_IMPACT\n\tloadspritegfx ANIM_TAG_SMALL_BUBBLES\n\tloadspritegfx ANIM_TAG_ICE_CRYSTALS\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 23, 1\n\tdelay 5\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 25, ANIM_ATTACKER\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, -15, 0, 25, ANIM_ATTACKER\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 20, 10, 25, ANIM_ATTACKER\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0, -10, 25, ANIM_ATTACKER\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, -10, 15, 25, ANIM_ATTACKER\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 25, 20, 25, ANIM_ATTACKER\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, -20, 20, 25, ANIM_ATTACKER\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 12, 0, 25, ANIM_ATTACKER\n\twaitforvisualfinish\n\tdelay 10\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 5\n\tdelay 6\n\tcall RisingWaterHitEffect\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nRisingWaterHitEffect:\n\tplaysewithpan SE_M_WATERFALL, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 17, 1\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 20, ANIM_TARGET, 1\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 20\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 20\n\tdelay 2\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 15, ANIM_TARGET, 1\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 15\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 15\n\tdelay 2\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 10, ANIM_TARGET, 1\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 10\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 10\n\tdelay 2\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, ANIM_TARGET, 1\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 5\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 5\n\tdelay 2\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 0\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 0\n\tdelay 2\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -5, ANIM_TARGET, 1\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -5\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -5\n\tdelay 2\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -10, ANIM_TARGET, 1\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -10\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -10\n\tdelay 2\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, ANIM_TARGET, 1\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -15\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -15\n\tdelay 2\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -20, ANIM_TARGET, 1\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -20\n\tcreatesprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, -20\n\treturn\n\nMove_EXPLOSION:\n\tloadspritegfx ANIM_TAG_EXPLOSION\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 8, 9, RGB(26, 8, 8), 8, RGB_BLACK, 8\n\tcreatevisualtask AnimTask_ShakeMon2, 5, 4, 8, 0, 40, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 5, 5, 8, 0, 40, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 5, 6, 8, 0, 40, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 5, 7, 8, 0, 40, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 5, 8, 8, 0, 40, 1\n\tcall Explosion1\n\tcall Explosion1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 16, RGB_WHITE\n\tdelay 50\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 16, 0, RGB_WHITE\n\tend\n\nExplosion1:\n\tplaysewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 1\n\tdelay 6\n\tplaysewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 0, 1\n\tdelay 6\n\tplaysewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 0, 1\n\tdelay 6\n\tplaysewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 0, 1\n\tdelay 6\n\tplaysewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 0, 1\n\tdelay 6\n\treturn\n\nMove_DEFENSE_CURL:\n\tloadspritegfx ANIM_TAG_ECLIPSING_ORB\n\tloopsewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER, 18, 3\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, 0\n\tcreatevisualtask AnimTask_DefenseCurlDeformMon, 5\n\twaitforvisualfinish\n\tcreatesprite gEclipsingOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 6, 0, 1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, 1\n\twaitforvisualfinish\n\tend\n\nMove_PROTECT:\n\tloadspritegfx ANIM_TAG_PROTECT\n\tmonbg ANIM_ATK_PARTNER\n\tsplitbgprio ANIM_ATTACKER\n\twaitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 16\n\tcreatesprite gProtectSpriteTemplate, ANIM_ATTACKER, 2, 24, 0, 90\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tend\n\nMove_DETECT:\n\tloadspritegfx ANIM_TAG_SPARKLE_4\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 9, RGB_BLACK\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 9, RGB_WHITE\n\tdelay 18\n\tplaysewithpan SE_M_DETECT, SOUND_PAN_ATTACKER\n\tcreatesprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 13, 20, -20\n\twaitforvisualfinish\n\tdelay 10\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 9, 0, RGB_BLACK\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_WHITE\n\twaitforvisualfinish\n\tend\n\nMove_FRUSTRATION:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_ANGER\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_GetFrustrationPowerLevel, 1\n\tjumpreteq 0, Frustration_Strongest\n\tjumpreteq 1, Frustration_Strong\n\tjumpreteq 2, Frustration_Medium\n\tgoto Frustration_Weak\n\nFrustration_Continue:\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nFrustration_Strongest:\n\tplaysewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_ATTACKER, 1, 0, 15, 1\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 0, 9, RGB_RED\n\twaitforvisualfinish\n\tdelay 20\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, -28\n\twaitforvisualfinish\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, -28\n\twaitforvisualfinish\n\tdelay 10\n\tcreatevisualtask AnimTask_SwayMon, 5, 0, 16, 6144, 8, ANIM_ATTACKER\n\tdelay 5\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 30, 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tdelay 5\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, ANIM_TARGET, 0\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tdelay 5\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, ANIM_TARGET, 0\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tdelay 5\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, ANIM_TARGET, 0\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tdelay 5\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, ANIM_TARGET, 0\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tdelay 5\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, ANIM_TARGET, 0\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 9, 0, RGB_RED\n\tgoto Frustration_Continue\n\nFrustration_Strong:\n\tplaysewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_ATTACKER, 1, 0, 15, 1\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 0, 9, RGB_RED\n\twaitforvisualfinish\n\tdelay 20\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, -28\n\twaitforvisualfinish\n\tdelay 5\n\tcreatevisualtask AnimTask_StrongFrustrationGrowAndShrink, 5\n\tdelay 7\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 8, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 6, 1\n\tdelay 14\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 12, -6, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 6, 1\n\tdelay 14\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -12, -6, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 6, 1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 9, 0, RGB_RED\n\tgoto Frustration_Continue\n\nFrustration_Medium:\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, -28\n\twaitforvisualfinish\n\tdelay 5\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4\n\tdelay 6\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 4, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1\n\twaitforvisualfinish\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4\n\tdelay 6\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -4, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1\n\tgoto Frustration_Continue\n\nFrustration_Weak:\n\tcreatesprite gWeakFrustrationAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 20, -28\n\twaitforvisualfinish\n\tdelay 10\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 10, 2\n\tdelay 12\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1\n\tgoto Frustration_Continue\n\nMove_SAFEGUARD:\n\tloadspritegfx ANIM_TAG_GUARD_RING\n\tmonbg ANIM_ATK_PARTNER\n\tsetalpha 8, 8\n\tplaysewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER\n\tcreatesprite gGuardRingSpriteTemplate, ANIM_ATTACKER, 2\n\tdelay 4\n\tcreatesprite gGuardRingSpriteTemplate, ANIM_ATTACKER, 2\n\tdelay 4\n\tcreatesprite gGuardRingSpriteTemplate, ANIM_ATTACKER, 2\n\twaitforvisualfinish\n\tplaysewithpan SE_SHINY, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATK_SIDE, 0, 2, 0, 10, RGB_WHITE\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tend\n\nMove_PAIN_SPLIT:\n\tloadspritegfx ANIM_TAG_PAIN_SPLIT\n\tcreatesprite gPainSplitProjectileSpriteTemplate, ANIM_ATTACKER, 2, -8, -42, ANIM_ATTACKER\n\tcreatesprite gPainSplitProjectileSpriteTemplate, ANIM_TARGET, 2, -8, -42, ANIM_TARGET\n\tdelay 10\n\tplaysewithpan SE_M_SWAGGER2, 0\n\tcreatevisualtask AnimTask_PainSplitMovement, 2, ANIM_ATTACKER, 0\n\tcreatevisualtask AnimTask_PainSplitMovement, 2, ANIM_TARGET, 0\n\twaitforvisualfinish\n\tcreatesprite gPainSplitProjectileSpriteTemplate, ANIM_ATTACKER, 2, -24, -42, ANIM_ATTACKER\n\tcreatesprite gPainSplitProjectileSpriteTemplate, ANIM_TARGET, 2, -24, -42, ANIM_TARGET\n\tdelay 10\n\tplaysewithpan SE_M_SWAGGER2, 0\n\tcreatevisualtask AnimTask_PainSplitMovement, 2, ANIM_ATTACKER, 1\n\tcreatevisualtask AnimTask_PainSplitMovement, 2, ANIM_TARGET, 1\n\twaitforvisualfinish\n\tcreatesprite gPainSplitProjectileSpriteTemplate, ANIM_ATTACKER, 2, 8, -42, ANIM_ATTACKER\n\tcreatesprite gPainSplitProjectileSpriteTemplate, ANIM_TARGET, 2, 8, -42, ANIM_TARGET\n\tdelay 10\n\tplaysewithpan SE_M_SWAGGER2, 0\n\tcreatevisualtask AnimTask_PainSplitMovement, 2, ANIM_ATTACKER, 2\n\tcreatevisualtask AnimTask_PainSplitMovement, 2, ANIM_TARGET, 2\n\tend\n\nMove_VICE_GRIP:\n\tloadspritegfx ANIM_TAG_CUT\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET\n\tcreatesprite gViceGripSpriteTemplate, ANIM_ATTACKER, 2, 0\n\tcreatesprite gViceGripSpriteTemplate, ANIM_ATTACKER, 2, 1\n\tdelay 9\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 5, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_GUILLOTINE:\n\tloadspritegfx ANIM_TAG_CUT\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tfadetobgfromset BG_GUILLOTINE_OPPONENT, BG_GUILLOTINE_PLAYER, BG_GUILLOTINE_CONTESTS\n\twaitbgfadein\n\tplaysewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET\n\tcreatesprite gGuillotineSpriteTemplate, ANIM_ATTACKER, 2, 0\n\tcreatesprite gGuillotineSpriteTemplate, ANIM_ATTACKER, 2, 1\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB_BLACK\n\tdelay 9\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 23, 1\n\tdelay 46\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 8, 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\trestorebg\n\twaitbgfadein\n\tend\n\nMove_PAY_DAY:\n\tloadspritegfx ANIM_TAG_COIN\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER\n\tcreatesprite gCoinThrowSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 1152\n\twaitforvisualfinish\n\tplaysewithpan SE_M_PAY_DAY, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, ANIM_TARGET, 2\n\tcreatesprite gFallingCoinSpriteTemplate, ANIM_ATTACKER, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_OUTRAGE:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tloopsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER, 8, 3\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 2, 5, 3, 8, RGB(14, 13, 0)\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 5, 4\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 0, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, 0, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 0, 1280, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 0, -1280, 3\n\tdelay 0\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 40, 1\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 768, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, 768, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, -768, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, -768, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 0, 3\n\tcall OutrageFlames\n\tcall OutrageFlames\n\twaitforvisualfinish\n\tend\n\nOutrageFlames:\n\tdelay 3\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, 0, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 0, 1280, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 0, -1280, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, 768, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, 768, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 1280, -768, 3\n\tdelay 0\n\tcreatesprite gOutrageFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, -1280, -768, 3\n\treturn\n\nMove_SPARK:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_SPARK_2\n\tdelay 0\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 5, 5, RGB(31, 31, 22)\n\tplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER\n\tcreatesprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, ANIM_ATTACKER, 1, 0\n\tdelay 0\n\tcreatesprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, ANIM_ATTACKER, 1, 0\n\tcreatesprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, ANIM_ATTACKER, 1, 1\n\tdelay 0\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 0, 0, RGB(31, 31, 22)\n\tdelay 10\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 5, 5, RGB(31, 31, 22)\n\tplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER\n\tcreatesprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 24, 60, 10, ANIM_ATTACKER, 1, 0\n\tcreatesprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 24, 42, 11, ANIM_ATTACKER, 1, 1\n\tdelay 0\n\tcreatesprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 24, 165, 10, ANIM_ATTACKER, 1, 1\n\tdelay 0\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 0, 0, RGB(31, 31, 22)\n\tdelay 20\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 7, 7, RGB(31, 31, 22)\n\tplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 0, 20, 0, 0\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 64, 20, 1, 0\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 128, 20, 0, 0\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 192, 20, 2, 0\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 32, 20, 0, 0\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 96, 20, 1, 0\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 160, 20, 0, 0\n\tcreatesprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 224, 20, 2, 0\n\tdelay 4\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_ATTACKER, -31, 1, 0, 0, RGB(31, 31, 22)\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4\n\tdelay 4\n\tplaysewithpan SE_M_HYPER_BEAM, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, -31, 2, 0, 6, RGB(31, 31, 22)\n\tcall ElectricityEffect\n\twaitforvisualfinish\n\tend\n\nMove_ATTRACT:\n\tloadspritegfx ANIM_TAG_RED_HEART\n\tloopsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER, 12, 3\n\tcreatevisualtask AnimTask_SwayMon, 5, 0, 12, 4096, 4, ANIM_ATTACKER\n\tdelay 15\n\tcreatesprite gRedHeartProjectileSpriteTemplate, ANIM_TARGET, 3, 20, -8\n\twaitforvisualfinish\n\tplaysewithpan SE_M_ATTRACT, SOUND_PAN_TARGET\n\tcreatesprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 160, -32\n\tcreatesprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -256, -40\n\tcreatesprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 128, -16\n\tcreatesprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 416, -38\n\tcreatesprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -128, -22\n\tcreatesprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -384, -31\n\twaitforvisualfinish\n\twaitplaysewithpan SE_M_ATTRACT2, 0, 15\n\tcreatevisualtask AnimTask_HeartsBackground, 5\n\tcreatesprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 16, 256, 0\n\tcreatesprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 224, 240, 15\n\tcreatesprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 126, 272, 30\n\tcreatesprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 80, 224, 45\n\tcreatesprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 170, 272, 60\n\tcreatesprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 40, 256, 75\n\tcreatesprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 112, 256, 90\n\tcreatesprite gRedHeartRisingSpriteTemplate, ANIM_ATTACKER, 40, 200, 272, 90\n\tdelay 75\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 10, RGB(31, 25, 27)\n\tend\n\nMove_GROWTH:\n\tcall GrowthEffect\n\twaitforvisualfinish\n\tcall GrowthEffect\n\twaitforvisualfinish\n\tend\n\nGrowthEffect:\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB_WHITE\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -3, -3, 16, ANIM_ATTACKER, 0\n\treturn\n\nMove_WHIRLWIND:\n\tloadspritegfx ANIM_TAG_WHIRLWIND_LINES\n\tcreatesprite gWhirlwindLineSpriteTemplate, ANIM_ATTACKER, 2, 0, -8, ANIM_TARGET, 60, 0\n\tcreatesprite gWhirlwindLineSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 60, 1\n\tcreatesprite gWhirlwindLineSpriteTemplate, ANIM_ATTACKER, 2, 0, 8, ANIM_TARGET, 60, 2\n\tcreatesprite gWhirlwindLineSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, ANIM_TARGET, 60, 3\n\tcreatesprite gWhirlwindLineSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, ANIM_TARGET, 60, 4\n\tcreatesprite gWhirlwindLineSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, ANIM_TARGET, 60, 0\n\tdelay 5\n\tloopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET, 10, 4\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 15, 1\n\tdelay 29\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_TARGET, 12, 6, 1, 5\n\tdelay 7\n\tplaysewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_SlideOffScreen, 5, ANIM_TARGET, 8\n\twaitforvisualfinish\n\tend\n\nMove_CONFUSE_RAY:\n\tloadspritegfx ANIM_TAG_YELLOW_BALL\n\tmonbg ANIM_DEF_PARTNER\n\tfadetobg BG_GHOST\n\twaitbgfadein\n\tcreatevisualtask SoundTask_AdjustPanningVar, 2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0\n\tcreatevisualtask AnimTask_BlendColorCycleByTag, 2, ANIM_TAG_YELLOW_BALL, 0, 6, 0, 14, RGB(31, 10, 0)\n\tcreatesprite gConfuseRayBallBounceSpriteTemplate, ANIM_TARGET, 2, 28, 0, 288\n\twaitforvisualfinish\n\tsetalpha 8, 8\n\tplaysewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET\n\tcreatesprite gConfuseRayBallSpiralSpriteTemplate, ANIM_TARGET, 2, 0, -16\n\twaitforvisualfinish\n\tdelay 0\n\tblendoff\n\tclearmonbg ANIM_DEF_PARTNER\n\trestorebg\n\twaitbgfadein\n\tend\n\nMove_LOCK_ON:\n\tloadspritegfx ANIM_TAG_LOCK_ON\n\tcreatesprite gLockOnTargetSpriteTemplate, ANIM_ATTACKER, 40\n\tcreatesprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 1\n\tcreatesprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 2\n\tcreatesprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 3\n\tcreatesprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 4  @ Also transitions to red target\n\tdelay 120\n\tsetarg 7, 0xFFFF  @ Signal target to flash/disappear\n\twaitforvisualfinish\n\tend\n\nMove_MEAN_LOOK:\n\tloadspritegfx ANIM_TAG_EYE\n\tmonbg ANIM_DEF_PARTNER\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 16, RGB_BLACK\n\tloopsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET, 15, 4\n\twaitplaysewithpan SE_M_LEER, SOUND_PAN_TARGET, 85\n\tcreatesprite gMeanLookEyeSpriteTemplate, ANIM_ATTACKER, 2\n\tdelay 120\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK\n\tdelay 30\n\tclearmonbg ANIM_DEF_PARTNER\n\twaitforvisualfinish\n\tend\n\nMove_ROCK_THROW:\n\tloadspritegfx ANIM_TAG_ROCKS\n\tcreatesprite gShakeMonOrTerrainSpriteTemplate, ANIM_TARGET, 2, 6, 1, 15, 1\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 0, 1, 0, 0\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 19, 1, 10, 0\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -23, 2, -10, 0\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 20, 1\n\tdelay 6\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -15, 1, -10, 0\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 23, 2, 10, 0\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tend\n\nMove_ROCK_SLIDE:\n\tloadspritegfx ANIM_TAG_ROCKS\n\tmonbg ANIM_DEF_PARTNER\n\tcreatesprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, 7, 1, 11, 1\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -5, 1, -5, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 5, 0, 6, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 19, 1, 10, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -23, 2, -10, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 50, 1\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 5, 50, 1\n\tdelay 2\n\tcall RockSlideRocks\n\tcall RockSlideRocks\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nRockSlideRocks:\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -20, 0, -10, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 28, 1, 10, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -10, 1, -5, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 10, 0, 6, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 24, 1, 10, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -32, 2, -10, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, -20, 0, -10, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFallingRockSpriteTemplate, ANIM_TARGET, 2, 30, 2, 10, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 2\n\treturn\n\nMove_THIEF:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tdelay 1\n\tfadetobg BG_DARK\n\twaitbgfadein\n\tsetalpha 12, 8\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4\n\tdelay 6\n\tplaysewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 8, 1\n\twaitforvisualfinish\n\tdelay 20\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\trestorebg\n\twaitbgfadein\n\tend\n\nMove_BUBBLE_BEAM:\n\tloadspritegfx ANIM_TAG_BUBBLE\n\tloadspritegfx ANIM_TAG_SMALL_BUBBLES\n\tmonbg ANIM_TARGET\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tdelay 1\n\tcall BulbblebeamCreateBubbles\n\tcreatevisualtask AnimTask_SwayMon, 5, 0, 3, 3072, 8, ANIM_TARGET\n\tcall BulbblebeamCreateBubbles\n\tcall BulbblebeamCreateBubbles\n\twaitforvisualfinish\n\tcall WaterBubblesEffectShort\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nBulbblebeamCreateBubbles:\n\tcreatesprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 35, 70, 0, 256, 50\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\tdelay 3\n\tcreatesprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 20, 40, -10, 256, 50\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\tdelay 3\n\tcreatesprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 10, -60, 0, 256, 50\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\tdelay 3\n\tcreatesprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 15, -15, 10, 256, 50\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\tdelay 3\n\tcreatesprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 30, 10, -10, 256, 50\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\tdelay 3\n\tcreatesprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 25, -30, 10, 256, 50\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\tdelay 3\n\treturn\n\nMove_ICY_WIND:\n\tloadspritegfx ANIM_TAG_ICE_CRYSTALS\n\tloadspritegfx ANIM_TAG_ICE_SPIKES\n\tmonbg ANIM_DEF_PARTNER\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_ATK_SIDE, 4, 0, 4, RGB_BLACK\n\tfadetobg BG_ICE\n\twaitbgfadeout\n\tplaysewithpan SE_M_ICY_WIND, 0\n\twaitbgfadein\n\twaitforvisualfinish\n\tpanse SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tcall IcyWindSwirlingSnowballs\n\tdelay 5\n\tcall IcyWindSwirlingSnowballs\n\tplaysewithpan SE_M_GUST2, SOUND_PAN_TARGET\n\tdelay 55\n\tcall IceSpikesEffectLong\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\trestorebg\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_ATK_SIDE, 4, 4, 0, RGB_BLACK\n\twaitbgfadein\n\tend\n\nIcyWindSwirlingSnowballs:\n\tcreatesprite gSwirlingSnowballSpriteTemplate, ANIM_TARGET, 40, 0, 0, 0, 0, 72, 1\n\tdelay 5\n\tcreatesprite gSwirlingSnowballSpriteTemplate, ANIM_TARGET, 40, 0, 10, 0, 10, 72, 1\n\tdelay 5\n\tcreatesprite gSwirlingSnowballSpriteTemplate, ANIM_TARGET, 40, 0, -10, 0, -10, 72, 1\n\tdelay 5\n\tcreatesprite gSwirlingSnowballSpriteTemplate, ANIM_TARGET, 40, 0, 15, 0, 15, 72, 1\n\tdelay 5\n\tcreatesprite gSwirlingSnowballSpriteTemplate, ANIM_TARGET, 40, 0, -5, 0, -5, 72, 1\n\treturn\n\nMove_SMOKESCREEN:\n\tloadspritegfx ANIM_TAG_BLACK_SMOKE\n\tloadspritegfx ANIM_TAG_BLACK_BALL\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tcreatesprite gBlackBallSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_SmokescreenImpact, 2\n\tdelay 2\n\tplaysewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET\n\tcreatesprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, -12, 104, 0, 75\n\tcreatesprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, -12, 72, 1, 75\n\tcreatesprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, -6, 56, 1, 75\n\tcreatesprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, -6, 88, 0, 75\n\tcreatesprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 0, 56, 0, 75\n\tcreatesprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 0, 88, 1, 75\n\tcreatesprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 6, 72, 0, 75\n\tcreatesprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 6, 104, 1, 75\n\tcreatesprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 12, 72, 0, 75\n\tcreatesprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 12, 56, 1, 75\n\tcreatesprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 18, 80, 0, 75\n\tcreatesprite gBlackSmokeSpriteTemplate, ANIM_TARGET, 4, 0, 18, 72, 1, 75\n\twaitforvisualfinish\n\tend\n\nMove_CONVERSION:\n\tloadspritegfx ANIM_TAG_CONVERSION\n\tmonbg ANIM_ATK_PARTNER\n\tsplitbgprio ANIM_ATTACKER\n\tsetalpha 16, 0\n\tdelay 0\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -24, -24\n\tdelay 3\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -8, -24\n\tdelay 3\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 8, -24\n\tdelay 3\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 24, -24\n\tdelay 3\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -24, -8\n\tdelay 3\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -8, -8\n\tdelay 3\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 8, -8\n\tdelay 3\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 24, -8\n\tdelay 3\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -24, 8\n\tdelay 3\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -8, 8\n\tdelay 3\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 8, 8\n\tdelay 3\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 24, 8\n\tdelay 3\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -24, 24\n\tdelay 3\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, -8, 24\n\tdelay 3\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 8, 24\n\tdelay 3\n\tcreatesprite gConversionSpriteTemplate, ANIM_ATTACKER, 2, 24, 24\n\tdelay 20\n\tplaysewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_CONVERSION, 1, 1, RGB(31, 31, 13), 12, 0, 0\n\tdelay 6\n\tcreatevisualtask AnimTask_ConversionAlphaBlend, 5\n\twaitforvisualfinish\n\tdelay 1\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tend\n\nMove_CONVERSION_2:\n\tloadspritegfx ANIM_TAG_CONVERSION\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_foes ANIM_TARGET\n\tsetalpha 0, 16\n\tdelay 0\n\tplaysewithpan SE_M_BARRIER, SOUND_PAN_TARGET\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -24, -24, 60\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -8, -24, 65\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 8, -24, 70\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 24, -24, 75\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -24, -8, 80\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -8, -8, 85\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 8, -8, 90\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 24, -8, 95\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -24, 8, 100\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -8, 8, 105\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 8, 8, 110\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 24, 8, 115\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -24, 24, 120\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, -8, 24, 125\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 8, 24, 130\n\tcreatesprite gConversion2SpriteTemplate, ANIM_ATTACKER, 2, 24, 24, 135\n\tcreatevisualtask AnimTask_Conversion2AlphaBlend, 5\n\tdelay 60\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_TARGET\n\tdelay 10\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_TARGET\n\tdelay 10\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_TARGET\n\tdelay 10\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_TARGET\n\tdelay 10\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_TARGET\n\tdelay 10\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_TARGET\n\tdelay 10\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_TARGET\n\tdelay 10\n\tplaysewithpan SE_M_SWIFT, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_ROLLING_KICK:\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 4\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 6\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4\n\tcreatesprite gSlidingKickSpriteTemplate, ANIM_ATTACKER, 2, -24, 0, 48, 10, 160, 0\n\tdelay 5\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 8\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_HEADBUTT:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tcreatesprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0\n\tplaysewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tdelay 2\n\tcreatesprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 4, 1\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1\n\tcreatesprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tend\n\nMove_HORN_ATTACK:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HORN_HIT\n\tcreatesprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0\n\tplaysewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tdelay 2\n\tcreatesprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1\n\tcreatesprite gHornHitSpriteTemplate, ANIM_TARGET, 4, 0, 0, 10\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 4, 1\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1\n\tcreatesprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tend\n\nMove_FURY_ATTACK:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HORN_HIT\n\tcreatevisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 256, ANIM_ATTACKER, 2\n\tchoosetwoturnanim FuryAttackRight, FuryAttackLeft\n\nFuryAttackContinue:\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1\n\twaitforvisualfinish\n\tend\n\nFuryAttackRight:\n\tcreatesprite gHornHitSpriteTemplate, ANIM_TARGET, 4, 8, 8, 10\n\twaitforvisualfinish\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tgoto FuryAttackContinue\n\nFuryAttackLeft:\n\tcreatesprite gHornHitSpriteTemplate, ANIM_TARGET, 4, -8, -8, 10\n\twaitforvisualfinish\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tgoto FuryAttackContinue\n\nMove_HORN_DRILL:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HORN_HIT\n\tjumpifcontest HornDrillInContest\n\tfadetobg BG_DRILL\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 5, -2304, 768, 1, -1\nHornDrillContinue:\n\twaitbgfadein\n\tsetalpha 12, 8\n\tcreatesprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0\n\tplaysewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tdelay 2\n\tcreatesprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1\n\tcreatesprite gHornHitSpriteTemplate, ANIM_TARGET, 4, 0, 0, 12\n\twaitforvisualfinish\n\tplayse SE_BANG\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 40, 1\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 40, 1\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 3\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 2, ANIM_TARGET, 3\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -4, 3, ANIM_TARGET, 3\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -8, -5, ANIM_TARGET, 3\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 4, -12, ANIM_TARGET, 3\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 16, 0, ANIM_TARGET, 3\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 5, 18, ANIM_TARGET, 3\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -17, 12, ANIM_TARGET, 2\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -21, -15, ANIM_TARGET, 2\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, -27, ANIM_TARGET, 2\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 0, ANIM_TARGET, 2\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2\n\twaitforvisualfinish\n\trestorebg\n\twaitbgfadeout\n\tsetarg 7, 0xFFFF\n\twaitbgfadein\n\tend\n\nHornDrillInContest:\n\tfadetobg BG_DRILL_CONTESTS\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 5, 2304, 768, 0, -1\n\tgoto HornDrillContinue\n\nMove_THRASH:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tcreatevisualtask AnimTask_ThrashMoveMonHorizontal, 2\n\tcreatevisualtask AnimTask_ThrashMoveMonVertical, 2\n\tcreatesprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tdelay 28\n\tcreatesprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 1\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tdelay 28\n\tcreatesprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 3\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 8, 0, 16, 1\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tend\n\nMove_SING:\n\tloadspritegfx ANIM_TAG_MUSIC_NOTES\n\tmonbg ANIM_DEF_PARTNER\n\tcreatevisualtask AnimTask_MusicNotesRainbowBlend, 2\n\twaitforvisualfinish\n\tpanse SE_M_SING, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 7, 0, 12\n\tdelay 5\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 6, 1, 12\n\tdelay 5\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 1, 2, 12\n\tdelay 5\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 3, 12\n\tdelay 5\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 3, 0, 12\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 1, 12\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 5, 2, 12\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 6, 3, 12\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 0, 12\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 1, 12\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 1, 2, 12\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 5, 3, 12\n\tdelay 4\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tcreatevisualtask AnimTask_MusicNotesClearRainbowBlend, 2\n\twaitforvisualfinish\n\tend\n\nMove_LOW_KICK:\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_IMPACT\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4\n\tcreatesprite gSlidingKickSpriteTemplate, ANIM_TARGET, 2, -24, 28, 40, 8, 160, 0\n\tdelay 4\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 8, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_RotateMonSpriteToSide, 2, 6, 384, ANIM_TARGET, 2\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 4\n\tend\n\nMove_EARTHQUAKE:\n\tcreatevisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 10, 50\n\tcreatevisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 10, 50\n\tplaysewithpan SE_M_EARTHQUAKE, 0\n\tdelay 10\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14\n\tdelay 16\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14\n\tend\n\nMove_FISSURE:\n\tloadspritegfx ANIM_TAG_MUD_SAND\n\tcreatevisualtask AnimTask_HorizontalShake, 3, (MAX_BATTLERS_COUNT + 1), 10, 50\n\tcreatevisualtask AnimTask_HorizontalShake, 3, ANIM_TARGET, 10, 50\n\tplaysewithpan SE_M_EARTHQUAKE, SOUND_PAN_TARGET\n\tdelay 8\n\tcall FissureDirtPlumeFar\n\tdelay 15\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14\n\tdelay 15\n\tcall FissureDirtPlumeClose\n\tdelay 15\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14\n\tdelay 15\n\tcall FissureDirtPlumeFar\n\tdelay 50\n\tfadetobg BG_FISSURE\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_PositionFissureBgOnBattler, 5, ANIM_TARGET, 5, -1\n\twaitbgfadein\n\tdelay 40\n\trestorebg\n\twaitbgfadeout\n\tsetarg 7, -1\n\twaitbgfadein\n\tend\n\nFissureDirtPlumeFar:\n\tcreatesprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 12, -48, -16, 24\n\tcreatesprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 16, -16, -10, 24\n\tcreatesprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 14, -52, -18, 24\n\tcreatesprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 12, -32, -16, 24\n\tplaysewithpan SE_M_DIG, SOUND_PAN_TARGET\n\treturn\n\nFissureDirtPlumeClose:\n\tcreatesprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 12, -24, -16, 24\n\tcreatesprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 16, -38, -10, 24\n\tcreatesprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 14, -20, -18, 24\n\tcreatesprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 12, -36, -16, 24\n\tplaysewithpan SE_M_DIG, SOUND_PAN_TARGET\n\treturn\n\nMove_DIG:\n\tchoosetwoturnanim DigSetUp, DigUnleash\nDigEnd:\n\tend\n\nDigSetUp:\n\tloadspritegfx ANIM_TAG_MUD_SAND\n\tloadspritegfx ANIM_TAG_DIRT_MOUND\n\tcreatesprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, 180\n\tcreatesprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0, 1, 180\n\tmonbg_static ANIM_ATTACKER\n\tdelay 1\n\tcreatevisualtask AnimTask_DigDownMovement, 2, FALSE\n\tdelay 6\n\tcall DigThrowDirt\n\tcall DigThrowDirt\n\tcall DigThrowDirt\n\tcall DigThrowDirt\n\tcall DigThrowDirt\n\twaitforvisualfinish\n\tclearmonbg_static ANIM_ATTACKER\n\tdelay 1\n\tcreatevisualtask AnimTask_DigDownMovement, 2, TRUE\n\tgoto DigEnd\n\nDigUnleash:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_DIRT_MOUND\n\tcreatevisualtask AnimTask_DigUpMovement, 2, FALSE\n\twaitforvisualfinish\n\tmonbg ANIM_ATTACKER\n\tcreatesprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, 48\n\tcreatesprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0, 1, 48\n\tdelay 1\n\tcreatevisualtask AnimTask_DigUpMovement, 2, TRUE\n\tdelay 16\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_ATTACKER\n\tclearmonbg ANIM_ATTACKER\n\tgoto DigEnd\n\nDigThrowDirt:\n\tcreatesprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 12, 4, -16, 18\n\tcreatesprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 16, 4, -10, 18\n\tcreatesprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 14, 4, -18, 18\n\tcreatesprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 12, 4, -16, 18\n\tplaysewithpan SE_M_DIG, SOUND_PAN_ATTACKER\n\tdelay 32\n\treturn\n\nMove_MEDITATE:\n\tcall SetPsychicBackground\n\tcreatevisualtask AnimTask_MeditateStretchAttacker, 2\n\tplaysewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER\n\tdelay 16\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcall UnsetPsychicBackground\n\tend\n\nMove_AGILITY:\n\tmonbg ANIM_ATK_PARTNER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 4, 4\n\tcreatevisualtask AnimTask_TraceMonBlended, 2, 0, 4, 7, 10\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 12\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 12\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 12\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 12\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 12\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tdelay 1\n\tend\n\nMove_QUICK_ATTACK:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_ATK_PARTNER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5\n\tcreatevisualtask AnimTask_TraceMonBlended, 2, 0, 4, 7, 3\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER\n\tdelay 4\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\twaitforvisualfinish\n\tend\n\nMove_RAGE:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_ANGER\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 3, ANIM_ATTACKER, RGB_RED, 10, 0, 2\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, -20, -28\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER\n\tdelay 20\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, -28\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6\n\tdelay 4\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, TRUE, 1, 10, 1, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tend\n\nMove_TELEPORT:\n\tcall SetPsychicBackground\n\tcreatevisualtask AnimTask_Teleport, 2\n\tplaysewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER\n\tdelay 15\n\tcall UnsetPsychicBackground\n\twaitforvisualfinish\n\tend\n\nMove_DOUBLE_TEAM:\n\tmonbg ANIM_ATK_PARTNER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_DoubleTeam, 2\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 32\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 24\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 16\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 8\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 8\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 8\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 8\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tdelay 8\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tdelay 1\n\tend\n\nMove_MINIMIZE:\n\tsetalpha 10, 8\n\tcreatevisualtask AnimTask_Minimize, 2\n\tloopsewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER, 34, 3\n\twaitforvisualfinish\n\tblendoff\n\tend\n\nMove_METRONOME:\n\tloadspritegfx ANIM_TAG_FINGER\n\tloadspritegfx ANIM_TAG_THOUGHT_BUBBLE\n\tcreatesprite gThoughtBubbleSpriteTemplate, ANIM_ATTACKER, 11, 0, 100\n\tplaysewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER\n\tdelay 6\n\tcreatesprite gMetronomeFingerSpriteTemplate, ANIM_ATTACKER, 12, 0\n\tdelay 24\n\tloopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 22, 3\n\twaitforvisualfinish\n\tend\n\nMove_SKULL_BASH:\n\tchoosetwoturnanim SkullBashSetUp, SkullBashAttack\nSkullBashEnd:\n\tend\n\nSkullBashSetUp:\n\tcall SkullBashSetUpHeadDown\n\tcall SkullBashSetUpHeadDown\n\twaitforvisualfinish\n\tgoto SkullBashEnd\n\nSkullBashSetUpHeadDown:\n\tcreatesprite gSlideMonToOffsetAndBackSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -24, 0, 0, 10, 0\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_RotateMonSpriteToSide, 2, 16, 96, ANIM_ATTACKER, 2\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOffsetAndBackSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 10, 1\n\twaitforvisualfinish\n\treturn\n\nSkullBashAttack:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tcreatevisualtask AnimTask_SkullBashPosition, 2, 0\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tplayse SE_BANG\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 40, 1\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 40, 1\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 0\n\tloopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 8, 3\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_SkullBashPosition, 2, 1\n\tgoto SkullBashEnd\n\nMove_AMNESIA:\n\tloadspritegfx ANIM_TAG_AMNESIA\n\tcall SetPsychicBackground\n\tdelay 8\n\tcreatesprite gQuestionMarkSpriteTemplate, ANIM_ATTACKER, 20\n\tplaysewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER\n\tdelay 54\n\tloopsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER, 16, 3\n\twaitforvisualfinish\n\tcall UnsetPsychicBackground\n\tend\n\nMove_KINESIS:\n\tloadspritegfx ANIM_TAG_ALERT\n\tloadspritegfx ANIM_TAG_BENT_SPOON\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\tcall SetPsychicBackground\n\tcreatesprite gBentSpoonSpriteTemplate, ANIM_ATTACKER, 20\n\tcreatesprite gKinesisZapEnergySpriteTemplate, ANIM_ATTACKER, 19, 32, -8, 0\n\tcreatesprite gKinesisZapEnergySpriteTemplate, ANIM_ATTACKER, 19, 32, 16, 1\n\tloopsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_ATTACKER, 21, 2\n\tdelay 60\n\tplaysewithpan SE_M_DIZZY_PUNCH, SOUND_PAN_ATTACKER\n\tdelay 30\n\tloopsewithpan SE_M_DIZZY_PUNCH, SOUND_PAN_ATTACKER, 20, 2\n\tdelay 70\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcall UnsetPsychicBackground\n\tend\n\nMove_GLARE:\n\tloadspritegfx ANIM_TAG_SMALL_RED_EYE\n\tloadspritegfx ANIM_TAG_EYE_SPARKLE\n\tcreatevisualtask AnimTask_GlareEyeDots, 5, 0\n\tplaysewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_BG, 0, 0, 16, RGB_BLACK\n\twaitforvisualfinish\n\tcreatesprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, -16, -8\n\tcreatesprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, 16, -8\n\tcreatevisualtask AnimTask_ScaryFace, 5\n\tplaysewithpan SE_M_LEER, SOUND_PAN_ATTACKER\n\tdelay 2\n\tcreatevisualtask AnimTask_ShakeTargetInPattern, 3, 20, 1, FALSE\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_BG, 0, 16, 0, RGB_BLACK\n\tend\n\nMove_BARRAGE:\n\tloadspritegfx ANIM_TAG_RED_BALL\n\tcreatevisualtask AnimTask_BarrageBall, 3\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER\n\tdelay 24\n\tcreatesprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, 8, 1, 40, 1\n\tcreatevisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 0, 4, 20, 1\n\tcreatevisualtask AnimTask_ShakeMon, 3, ANIM_DEF_PARTNER, 0, 4, 20, 1\n\tloopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 8, 2\n\tend\n\nMove_SKY_ATTACK:\n\tchoosetwoturnanim SkyAttackSetUp, SkyAttackUnleash\nSkyAttackEnd:\n\tend\n\nSkyAttackSetUp:\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 11\n\tcreatevisualtask AnimTask_GetTargetIsAttackerPartner, 5, ARG_RET_ID\n\tjumpretfalse SkyAttackSetUpAgainstOpponent\n\tgoto SkyAttackSetUpAgainstPartner\n\nSkyAttackSetUpAgainstOpponent:\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_DEF_PARTNER, 1, 0, 12, RGB_BLACK\n\twaitforvisualfinish\n\tdelay 12\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 8, 0, RGB_BLACK\n\tcreatevisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16\n\tloopsewithpan SE_M_STAT_INCREASE, SOUND_PAN_ATTACKER, 4, 8\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 15, RGB_WHITE\n\tdelay 20\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 15, 0, RGB_WHITE\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_ATK_PARTNER | F_PAL_DEF_PARTNER, 1, 8, 0, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tgoto SkyAttackEnd\n\nSkyAttackSetUpAgainstPartner:\n\tcreatevisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 1, 0, 12, RGB_BLACK\n\twaitforvisualfinish\n\tdelay 12\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 8, 0, RGB_BLACK\n\tcreatevisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16\n\tplaysewithpan SE_M_STAT_INCREASE, SOUND_PAN_ATTACKER\n\tdelay 8\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 15, RGB_WHITE\n\tdelay 20\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 15, 0, RGB_WHITE\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPalExclude, 10, 4, 1, 8, 0, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tgoto SkyAttackEnd\n\nSkyAttackUnleash:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_BIRD\n\tcall SetSkyBg\n\tmonbg ANIM_ATTACKER\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 16, RGB_WHITE\n\tdelay 4\n\tcreatevisualtask AnimTask_AttackerFadeToInvisible, 5, 0\n\twaitforvisualfinish\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_SKY_UPPERCUT, SOUND_PAN_ATTACKER\n\tcreatesprite gSkyAttackBirdSpriteTemplate, ANIM_TARGET, 2\n\tdelay 14\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tdelay 20\n\tcreatevisualtask AnimTask_AttackerFadeFromInvisible, 5, 1\n\tdelay 2\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 15, 0, RGB_WHITE\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tcall UnsetSkyBg\n\tgoto SkyAttackEnd\n\nMove_FLASH:\n\tplaysewithpan SE_M_LEER, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_Flash, 2\n\twaitforvisualfinish\n\tend\n\nMove_SPLASH:\n\tcreatevisualtask AnimTask_Splash, 2, 0, 3\n\tdelay 8\n\tloopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 38, 3\n\twaitforvisualfinish\n\tend\n\nMove_ACID_ARMOR:\n\tmonbg ANIM_ATTACKER\n\tsetalpha 15, 0\n\tcreatevisualtask AnimTask_AcidArmor, 2, ANIM_ATTACKER\n\tplaysewithpan SE_M_ACID_ARMOR, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tblendoff\n\tclearmonbg ANIM_ATTACKER\n\tdelay 1\n\tend\n\nMove_SHARPEN:\n\tloadspritegfx ANIM_TAG_SPHERE_TO_CUBE\n\tcreatesprite gSharpenSphereSpriteTemplate, ANIM_ATTACKER, 2\n\twaitforvisualfinish\n\tend\n\nMove_SUPER_FANG:\n\tloadspritegfx ANIM_TAG_FANG_ATTACK\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 1, 0, 20, 1\n\tplaysewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 48, 1\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 2, ANIM_ATTACKER, RGB(31, 6, 1), 12, 4, 1\n\twaitforvisualfinish\n\tdelay 20\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4\n\tdelay 4\n\tcreatesprite gSuperFangSpriteTemplate, ANIM_TARGET, 2\n\tplaysewithpan SE_M_BITE, SOUND_PAN_TARGET\n\tdelay 8\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB(31, 2, 2), 14, RGB_WHITE, 14\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 7, 12, 1\n\twaitforvisualfinish\n\tblendoff\n\tend\n\nMove_SLASH:\n\tloadspritegfx ANIM_TAG_SLASH\n\tcreatesprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 1, -8, 0\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 1, 8, 0\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tend\n\nMove_STRUGGLE:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_MOVEMENT_WAVES\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4\n\tcreatesprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2\n\tcreatesprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 2\n\tloopsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER, 12, 4\n\twaitforvisualfinish\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 6, 1\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_SKETCH:\n\tloadspritegfx ANIM_TAG_PENCIL\n\tmonbg ANIM_TARGET\n\tcreatevisualtask AnimTask_SketchDrawMon, 2\n\tcreatesprite gPencilSpriteTemplate, ANIM_TARGET, 2\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tcreatevisualtask AnimTask_Splash, 2, 0, 2\n\tloopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 38, 2\n\tend\n\nMove_NIGHTMARE:\n\tfadetobg BG_GHOST\n\twaitbgfadein\n\tjumpifcontest NightmareInContest\n\tmonbg ANIM_DEF_PARTNER\n\tcreatevisualtask AnimTask_NightmareClone, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 40, 1\n\tplaysewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\trestorebg\n\twaitbgfadein\n\tend\n\nNightmareInContest:\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 2, ANIM_ATTACKER, RGB_WHITE, 10, 2, 1\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 3, 0, 32, 1\n\tplaysewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\trestorebg\n\twaitbgfadein\n\tend\n\nMove_FLAIL:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_FlailMovement, 2, ANIM_ATTACKER\n\tloopsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER, 8, 2\n\twaitforvisualfinish\n\tcreatesprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 30, 1, 0\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_SPITE:\n\tfadetobg BG_GHOST\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\twaitbgfadein\n\tmonbg ANIM_DEF_PARTNER\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 6, 0, 8, RGB_WHITE\n\tcreatevisualtask AnimTask_SpiteTargetShadow, 2\n\tloopsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET, 20, 3\n\twaitforvisualfinish\n\trestorebg\n\twaitbgfadein\n\tclearmonbg ANIM_TARGET\n\tend\n\nMove_MACH_PUNCH:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tmonbg ANIM_ATK_PARTNER\n\tcreatevisualtask AnimTask_GetAttackerSide, 2\n\tjumprettrue MachPunchAgainstPlayer\n\tfadetobg BG_HIGHSPEED_OPPONENT\nMachPunchContinue:\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 5, -2304, 0, 1, -1\n\twaitbgfadein\n\tdelay 0\n\tsetalpha 9, 8\n\tcreatevisualtask AnimTask_AttackerPunchWithTrace, 2, RGB(8, 9, 28), 10\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER\n\tdelay 6\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\trestorebg\n\twaitbgfadeout\n\tsetarg 7, 0xFFFF\n\twaitbgfadein\n\tend\n\nMachPunchAgainstPlayer:\n\tfadetobg BG_HIGHSPEED_PLAYER\n\tgoto MachPunchContinue\n\nMove_FORESIGHT:\n\tloadspritegfx ANIM_TAG_MAGNIFYING_GLASS\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 16, 0\n\tcreatesprite gForesightMagnifyingGlassSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET\n\tdelay 17\n\tloopsewithpan SE_M_SKETCH, SOUND_PAN_TARGET, 16, 4\n\tdelay 48\n\tdelay 24\n\tplaysewithpan SE_M_SKETCH, SOUND_PAN_TARGET\n\tdelay 10\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 5, ANIM_TARGET, RGB_WHITE, 12, 2, 1\n\tplaysewithpan SE_M_DETECT, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tblendoff\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nMove_DESTINY_BOND:\n\tloadspritegfx ANIM_TAG_WHITE_SHADOW\n\tfadetobg BG_GHOST\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\twaitbgfadein\n\tcreatevisualtask AnimTask_DestinyBondWhiteShadow, 5, 0, 48\n\tplaysewithpan SE_M_CONFUSE_RAY, SOUND_PAN_ATTACKER\n\tdelay 48\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 24, 1\n\tcreatevisualtask AnimTask_BlendBattleAnimPalExclude, 2, 6, 1, 0, 12, RGB(29, 29, 29)\n\tdelay 24\n\tcreatevisualtask AnimTask_BlendBattleAnimPalExclude, 2, 6, 1, 12, 0, RGB(29, 29, 29)\n\tplaysewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\trestorebg\n\twaitbgfadein\n\tblendoff\n\tclearmonbg 5\n\tend\n\nMove_ENDURE:\n\tloadspritegfx ANIM_TAG_FOCUS_ENERGY\n\tplaysewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER\n\tcall EndureEffect\n\tdelay 8\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1\n\tcall EndureEffect\n\tdelay 8\n\tcall EndureEffect\n\twaitforvisualfinish\n\tend\n\nEndureEffect:\n\tcreatesprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 26, 2\n\tdelay 4\n\tcreatesprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 14, 28, 1\n\tdelay 4\n\tcreatesprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -5, 10, 2\n\tdelay 4\n\tcreatesprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 26, 3\n\tdelay 4\n\tcreatesprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -12, 0, 1\n\treturn\n\nMove_CHARM:\n\tloadspritegfx ANIM_TAG_MAGENTA_HEART\n\tcreatevisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0\n\tcreatesprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0, 20\n\tplaysewithpan SE_M_CHARM, SOUND_PAN_ATTACKER\n\tdelay 15\n\tcreatesprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, -20, 20\n\tplaysewithpan SE_M_CHARM, SOUND_PAN_ATTACKER\n\tdelay 15\n\tcreatesprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 20, 20\n\tplaysewithpan SE_M_CHARM, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tend\n\nMove_ROLLOUT:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_MUD_SAND\n\tloadspritegfx ANIM_TAG_ROCKS\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_Rollout, 2\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 30, 1, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 2\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_FALSE_SWIPE:\n\tloadspritegfx ANIM_TAG_SLASH_2\n\tloadspritegfx ANIM_TAG_IMPACT\n\tcreatesprite gFalseSwipeSliceSpriteTemplate, ANIM_TARGET, 2\n\tplaysewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET\n\tdelay 16\n\tcreatesprite gFalseSwipePositionedSliceSpriteTemplate, ANIM_TARGET, 2, 0\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFalseSwipePositionedSliceSpriteTemplate, ANIM_TARGET, 2, 16\n\tdelay 2\n\tcreatesprite gFalseSwipePositionedSliceSpriteTemplate, ANIM_TARGET, 2, 32\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFalseSwipePositionedSliceSpriteTemplate, ANIM_TARGET, 2, 48\n\tdelay 2\n\tcreatesprite gFalseSwipePositionedSliceSpriteTemplate, ANIM_TARGET, 2, 64\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gFalseSwipePositionedSliceSpriteTemplate, ANIM_TARGET, 2, 80\n\tdelay 2\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 3\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tend\n\nMove_SWAGGER:\n\tloadspritegfx ANIM_TAG_BREATH\n\tloadspritegfx ANIM_TAG_ANGER\n\tcreatevisualtask AnimTask_GrowAndShrink, 2\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gBreathPuffSpriteTemplate, ANIM_ATTACKER, 2\n\tloopsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 4, 2\n\twaitforvisualfinish\n\tdelay 24\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, -20, -28\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET\n\tdelay 12\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, 20, -28\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tend\n\nMove_MILK_DRINK:\n\tloadspritegfx ANIM_TAG_MILK_BOTTLE\n\tloadspritegfx ANIM_TAG_THIN_RING\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tmonbg ANIM_TARGET\n\tcreatesprite gMilkBottleSpriteTemplate, ANIM_ATTACKER, 2\n\tdelay 40\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER\n\tdelay 12\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER\n\tdelay 20\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0\n\tplaysewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tcall HealingEffect2\n\twaitforvisualfinish\n\tend\n\nMove_MAGNITUDE:\n\tcreatevisualtask AnimTask_IsPowerOver99, 2\n\twaitforvisualfinish\n\tjumpargeq 15, FALSE, MagnitudeRegular\n\tjumpargeq 15, TRUE, MagnitudeIntense\nMagnitudeEnd:\n\tend\n\nMagnitudeRegular:\n\tcreatevisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 0, 50\n\tcreatevisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 0, 50\n\tloopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 8, 10\n\tgoto MagnitudeEnd\n\nMagnitudeIntense:\n\tcreatevisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 0, 50\n\tcreatevisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 0, 50\n\tloopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 8, 10\n\tdelay 10\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14\n\tdelay 16\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14\n\tgoto MagnitudeEnd\n\nMove_RAPID_SPIN:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_RAPID_SPIN\n\tmonbg ANIM_ATTACKER\n\tcreatesprite gRapidSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 32, -32, 40, -2\n\tcreatevisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 0\n\tloopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4\n\twaitforvisualfinish\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 10, 1, 0\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tdelay 8\n\tcreatevisualtask AnimTask_RapinSpinMonElevation, 2, 0, 2, 1\n\tloopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 4\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tend\n\nMove_MOONLIGHT:\n\tloadspritegfx ANIM_TAG_MOON\n\tloadspritegfx ANIM_TAG_GREEN_SPARKLE\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tsetalpha 0, 16\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 16, RGB_BLACK\n\twaitforvisualfinish\n\tcreatesprite gMoonSpriteTemplate, ANIM_ATTACKER, 2, 120, 56\n\tcreatevisualtask AnimTask_AlphaFadeIn, 3, 0, 16, 16, 0, 1\n\tplaysewithpan SE_M_MOONLIGHT, 0\n\tdelay 30\n\tcreatesprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, -12, 0\n\tdelay 30\n\tcreatesprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, -24, 0\n\tdelay 30\n\tcreatesprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, 21, 0\n\tdelay 30\n\tcreatesprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, 0, 0\n\tdelay 30\n\tcreatesprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, 10, 0\n\tdelay 20\n\tcreatevisualtask AnimTask_MoonlightEndFade, 2\n\twaitforvisualfinish\n\tcall HealingEffect\n\twaitforvisualfinish\n\tend\n\nMove_EXTREME_SPEED:\n\tloadspritegfx ANIM_TAG_SPEED_DUST\n\tloadspritegfx ANIM_TAG_IMPACT\n\tcreatevisualtask AnimTask_GetAttackerSide, 2\n\tjumprettrue ExtremeSpeedAgainstPlayer\n\tfadetobg BG_HIGHSPEED_OPPONENT\nExtremeSpeedContinue:\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 5, -2304, 0, 1, -1\n\twaitbgfadein\n\tcreatevisualtask AnimTask_AttackerStretchAndDisappear, 2\n\tloopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 3\n\twaitforvisualfinish\n\tdelay 1\n\tcreatevisualtask AnimTask_SetAttackerInvisibleWaitForSignal, 2\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tdelay 18\n\tcreatevisualtask AnimTask_ExtremeSpeedImpact, 2\n\tdelay 2\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gMonEdgeHitSplatSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, -12, 3\n\tdelay 10\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gMonEdgeHitSplatSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, 3\n\tdelay 10\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gMonEdgeHitSplatSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 0, 3\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_SpeedDust, 2\n\tdelay 10\n\tcreatevisualtask AnimTask_ExtremeSpeedMonReappear, 2\n\tloopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 8, 4\n\twaitforvisualfinish\n\trestorebg\n\twaitbgfadeout\n\tsetarg 7, 0xFFFF\n\twaitbgfadein\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tdelay 1\n\tsetarg 7, 0x1000\n\tdelay 1\n\tend\n\nExtremeSpeedAgainstPlayer:\n\tfadetobg BG_HIGHSPEED_PLAYER\n\tgoto ExtremeSpeedContinue\n\nMove_UPROAR:\n\tloadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE\n\tloadspritegfx ANIM_TAG_THIN_RING\n\tmonbg ANIM_DEF_PARTNER\n\tcreatevisualtask AnimTask_UproarDistortion, 2, 0\n\tcreatesprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8\n\tplaysewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER\n\tcreatesprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 29, -12, 0\n\tcreatesprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, -29, 1\n\tdelay 16\n\tcreatevisualtask AnimTask_UproarDistortion, 2, 0\n\tcreatesprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8\n\tplaysewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER\n\tcreatesprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, -29, 1\n\tcreatesprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -29, -12, 0\n\tdelay 16\n\tcreatevisualtask AnimTask_UproarDistortion, 2, 0\n\tcreatesprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8\n\tplaysewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER\n\tcreatesprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, -24, 1\n\tcreatesprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, -24, 0\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nMove_HEAT_WAVE:\n\tloadspritegfx ANIM_TAG_FLYING_DIRT\n\tcreatevisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FLYING_DIRT, 0, 6, 6, RGB_RED\n\tcreatevisualtask AnimTask_LoadSandstormBackground, 5, TRUE\n\tcreatevisualtask AnimTask_BlendBackground, 6, 6, RGB_RED\n\tpanse SE_M_HEAT_WAVE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tdelay 4\n\tcreatevisualtask AnimTask_MoveHeatWaveTargets, 5\n\tdelay 12\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 10, 2304, 96, 1\n\tdelay 10\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 90, 2048, 96, 1\n\tdelay 10\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 50, 2560, 96, 1\n\tdelay 10\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 20, 2304, 96, 1\n\tdelay 10\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 70, 1984, 96, 1\n\tdelay 10\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0, 2816, 96, 1\n\tdelay 10\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 60, 2560, 96, 1\n\tend\n\n@ Also used by Hail weather\nMove_HAIL:\n\tloadspritegfx ANIM_TAG_HAIL\n\tloadspritegfx ANIM_TAG_ICE_CRYSTALS\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 0, 6, RGB_BLACK\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_Hail, 5\n\tloopsewithpan SE_M_HAIL, 0, 8, 10\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 6, 0, RGB_BLACK\n\tend\n\nMove_TORMENT:\n\tloadspritegfx ANIM_TAG_ANGER\n\tloadspritegfx ANIM_TAG_THOUGHT_BUBBLE\n\tcreatevisualtask AnimTask_TormentAttacker, 2\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 2, ANIM_TARGET, RGB_RED, 10, 1, 1\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, -20, -28\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET\n\tdelay 20\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, 20, -28\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET\n\tend\n\nMove_MEMENTO:\n\tsetalpha 0, 16\n\tdelay 1\n\tcreatevisualtask AnimTask_InitMementoShadow, 2\n\tdelay 1\n\tcreatevisualtask AnimTask_MoveAttackerMementoShadow, 5\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\tdelay 48\n\tplaysewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_MementoHandleBg, 2\n\tdelay 12\n\tsetalpha 0, 16\n\tdelay 1\n\tmonbg_static ANIM_TARGET\n\tcreatevisualtask AnimTask_MoveTargetMementoShadow, 5\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg_static ANIM_TARGET\n\tdelay 1\n\tblendoff\n\tdelay 1\n\tend\n\nMove_FACADE:\n\tloadspritegfx ANIM_TAG_SWEAT_DROP\n\tcreatevisualtask AnimTask_SquishAndSweatDroplets, 2, ANIM_ATTACKER, 3\n\tcreatevisualtask AnimTask_FacadeColorBlend, 2, ANIM_ATTACKER, 72\n\tloopsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 24, 3\n\tend\n\nMove_SMELLING_SALT:\n\tloadspritegfx ANIM_TAG_TAG_HAND\n\tloadspritegfx ANIM_TAG_SMELLINGSALT_EFFECT\n\tcreatesprite gSmellingSaltsHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 2\n\tcreatesprite gSmellingSaltsHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 2\n\tdelay 32\n\tcreatevisualtask AnimTask_SmellingSaltsSquish, 3, ANIM_TARGET, 2\n\tloopsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET, 12, 2\n\twaitforvisualfinish\n\tdelay 4\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 6, 2\n\tcreatesprite gSmellingSaltExclamationSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 8, 3\n\tloopsewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET, 16, 3\n\tend\n\nMove_FOLLOW_ME:\n\tloadspritegfx ANIM_TAG_FINGER\n\tcreatesprite gFollowMeFingerSpriteTemplate, ANIM_ATTACKER, 2, 0\n\tplaysewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\tdelay 18\n\tplaysewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER\n\tdelay 71\n\tloopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 22, 3\n\tend\n\nMove_CHARGE:\n\tloadspritegfx ANIM_TAG_ELECTRIC_ORBS\n\tloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT\n\tloadspritegfx ANIM_TAG_ELECTRICITY\n\tmonbg ANIM_ATTACKER\n\tsetalpha 12, 8\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB_BLACK\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12\n\tplaysewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER\n\tdelay 30\n\tplaysewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER\n\tdelay 30\n\tplaysewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER\n\tcreatesprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, 0\n\tdelay 25\n\tplaysewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER\n\tdelay 20\n\tplaysewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER\n\tdelay 15\n\tplaysewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER\n\tdelay 10\n\tdelay 6\n\tloopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 6, 5\n\twaitforvisualfinish\n\tcreatesprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 16\n\tdelay 2\n\tcreatesprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, -16, -16\n\tplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 4, 0, RGB_BLACK\n\tclearmonbg ANIM_ATTACKER\n\tblendoff\n\tend\n\nMove_TAUNT:\n\tloadspritegfx ANIM_TAG_FINGER_2\n\tloadspritegfx ANIM_TAG_THOUGHT_BUBBLE\n\tloadspritegfx ANIM_TAG_ANGER\n\tcreatesprite gThoughtBubbleSpriteTemplate, ANIM_ATTACKER, 11, 0, 45\n\tplaysewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER\n\tdelay 6\n\tcreatesprite gTauntFingerSpriteTemplate, ANIM_ATTACKER, 12, 0\n\tdelay 4\n\tloopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 16, 2\n\twaitforvisualfinish\n\tdelay 8\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, -20, -28\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tdelay 12\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, 20, -28\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET\n\tend\n\nMove_HELPING_HAND:\n\tloadspritegfx ANIM_TAG_TAG_HAND\n\tcreatevisualtask AnimTask_HelpingHandAttackerMovement, 5\n\tcreatesprite gHelpingHandClapSpriteTemplate, ANIM_ATTACKER, 40, 0\n\tcreatesprite gHelpingHandClapSpriteTemplate, ANIM_ATTACKER, 40, 1\n\tdelay 19\n\tplaysewithpan SE_M_ENCORE, 0\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 5, 1\n\tdelay 14\n\tplaysewithpan SE_M_ENCORE, 0\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 5, 1\n\tdelay 20\n\tplaysewithpan SE_M_ENCORE, 0\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 3, 0, 10, 1\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 2, ANIM_ATK_PARTNER, RGB_YELLOW, 12, 1, 1\n\tend\n\nMove_ASSIST:\n\tloadspritegfx ANIM_TAG_PAW_PRINT\n\tcreatesprite gAssistPawprintSpriteTemplate, ANIM_ATTACKER, 50, 112, -16, 140, 128, 36\n\tdelay 2\n\tcreatesprite gAssistPawprintSpriteTemplate, ANIM_ATTACKER, 50, 208, 128, -16, 48, 36\n\tplaysewithpan SE_M_SCRATCH, 0\n\tdelay 2\n\tcreatesprite gAssistPawprintSpriteTemplate, ANIM_ATTACKER, 50, -16, 112, 256, -16, 36\n\tplaysewithpan SE_M_SCRATCH, 0\n\tdelay 2\n\tcreatesprite gAssistPawprintSpriteTemplate, ANIM_ATTACKER, 50, 108, 128, 84, -16, 36\n\tplaysewithpan SE_M_SCRATCH, 0\n\tdelay 2\n\tcreatesprite gAssistPawprintSpriteTemplate, ANIM_ATTACKER, 50, -16, 56, 256, 56, 36\n\tplaysewithpan SE_M_SCRATCH, 0\n\tend\n\nMove_SUPERPOWER:\n\tloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT\n\tloadspritegfx ANIM_TAG_METEOR\n\tloadspritegfx ANIM_TAG_FLAT_ROCK\n\tmonbg ANIM_ATK_PARTNER\n\tsplitbgprio ANIM_ATTACKER\n\tsetalpha 12, 8\n\tcreatesprite gSuperpowerOrbSpriteTemplate, ANIM_TARGET, 2, ANIM_ATTACKER\n\tplaysewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER\n\tdelay 20\n\tcreatesprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, 180, 1\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_EARTHQUAKE, 0\n\tdelay 40\n\tcreatesprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 200, 96, 1, 120\n\tdelay 8\n\tcreatesprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 20, 248, 4, 112\n\tdelay 8\n\tcreatesprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 130, 160, 2, 104\n\tdelay 8\n\tcreatesprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 160, 192, 0, 96\n\tdelay 8\n\tcreatesprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 60, 288, 3, 88\n\tdelay 74\n\tcreatesprite gSuperpowerFireballSpriteTemplate, ANIM_TARGET, 3, ANIM_ATTACKER\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER\n\tdelay 16\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tdelay 1\n\tend\n\nMove_RECYCLE:\n\tloadspritegfx ANIM_TAG_RECYCLE\n\tmonbg ANIM_ATTACKER\n\tsetalpha 0, 16\n\tdelay 1\n\tcreatesprite gRecycleSpriteTemplate, ANIM_ATTACKER, 2\n\tloopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER, 24, 3\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB_WHITE, 12, 2, 1\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tblendoff\n\tclearmonbg ANIM_ATTACKER\n\tdelay 1\n\tend\n\nMove_BRICK_BREAK:\n\tloadspritegfx ANIM_TAG_BLUE_LIGHT_WALL\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_TORN_METAL\n\tchoosetwoturnanim BrickBreakNormal, BrickBreakShatteredWall\n\nBrickBreakNormal:\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 8\n\tdelay 4\n\tdelay 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -18, -18, ANIM_TARGET, 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, -18, -18, 10, 1, 0\n\tplaysewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET\n\tdelay 20\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 8\n\tdelay 5\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, 18, ANIM_TARGET, 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, 18, 18, 10, 1, 0\n\tplaysewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET\n\tdelay 20\n\tcreatevisualtask AnimTask_WindUpLunge, 2, ANIM_ATTACKER, -24, 0, 24, 10, 24, 3\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 6, RGB_BLACK\n\tdelay 37\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 10, 1, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 6, 0, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tend\n\nBrickBreakShatteredWall:\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 8\n\tdelay 4\n\tcreatesprite gBrickBreakWallSpriteTemplate, ANIM_ATTACKER, 3, ANIM_TARGET, 0, 0, 90, 10\n\tdelay 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -18, -18, ANIM_TARGET, 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, -18, -18, 10, 1, 0\n\tplaysewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET\n\tdelay 20\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 8\n\tdelay 5\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, 18, ANIM_TARGET, 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, 18, 18, 10, 1, 0\n\tplaysewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET\n\tdelay 20\n\tcreatevisualtask AnimTask_WindUpLunge, 2, ANIM_ATTACKER, -24, 0, 24, 10, 24, 3\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 6, RGB_BLACK\n\tdelay 37\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 10, 1, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatesprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, -8, -12\n\tcreatesprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 8, -12\n\tcreatesprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 2, -8, 12\n\tcreatesprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 3, 8, 12\n\tplaysewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 6, 0, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tend\n\nMove_YAWN:\n\tloadspritegfx ANIM_TAG_PINK_CLOUD\n\tcreatevisualtask AnimTask_DeepInhale, 2, ANIM_ATTACKER\n\tplaysewithpan SE_M_YAWN, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gYawnCloudSpriteTemplate, ANIM_TARGET, 5, 2\n\tplaysewithpan SE_M_SPIT_UP, SOUND_PAN_ATTACKER\n\tdelay 4\n\tcreatesprite gYawnCloudSpriteTemplate, ANIM_TARGET, 5, 1\n\tdelay 4\n\tcreatesprite gYawnCloudSpriteTemplate, ANIM_TARGET, 5, 0\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_DeepInhale, 2, ANIM_TARGET\n\tplaysewithpan SE_M_YAWN, SOUND_PAN_TARGET\n\tend\n\nMove_ENDEAVOR:\n\tloadspritegfx ANIM_TAG_SWEAT_DROP\n\tloadspritegfx ANIM_TAG_IMPACT\n\tcreatevisualtask AnimTask_SquishAndSweatDroplets, 2, ANIM_ATTACKER, 2\n\tloopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 24, 2\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(31, 21, 0), 12, 1, 2\n\tdelay 6\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 8, 1, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 12, -12, ANIM_TARGET, 2\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tdelay 24\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 8, 1, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -12, 12, ANIM_TARGET, 2\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tend\n\nMove_ERUPTION:\n\tloadspritegfx ANIM_TAG_WARM_ROCK\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 2, 0, 4, RGB_RED\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_EruptionLaunchRocks, 2\n\twaitplaysewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER, 60\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_EruptionLaunchRocks, 2\n\twaitplaysewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER, 60\n\twaitforvisualfinish\n\tdelay 30\n\tcreatesprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 200, -32, 0, 100, 0\n\tcreatesprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 30, -32, 16, 90, 1\n\tcreatesprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 150, -32, 32, 60, 2\n\tcreatesprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 90, -32, 48, 80, 3\n\tcreatesprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 110, -32, 64, 50, 0\n\tcreatesprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 60, -32, 80, 70, 1\n\tdelay 22\n\tcreatevisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 8, 60\n\tcreatevisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 8, 60\n\tloopsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET, 16, 12\n\tdelay 80\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 40, F_PAL_BG | F_PAL_BATTLERS, 4, 4, 0, RGB_RED\n\tend\n\nMove_SKILL_SWAP:\n\tloadspritegfx ANIM_TAG_BLUEGREEN_ORB\n\tcall SetPsychicBackground\n\tcreatevisualtask AnimTask_SkillSwap, 3, ANIM_TARGET\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 5, ANIM_TARGET, RGB_WHITE, 12, 3, 1\n\tloopsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER, 24, 3\n\tdelay 16\n\tcreatevisualtask AnimTask_SkillSwap, 3, ANIM_ATTACKER\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB_WHITE, 12, 3, 1\n\twaitforvisualfinish\n\tcall UnsetPsychicBackground\n\tend\n\nMove_IMPRISON:\n\tloadspritegfx ANIM_TAG_HOLLOW_ORB\n\tloadspritegfx ANIM_TAG_X_SIGN\n\tcall SetPsychicBackground\n\tmonbg ANIM_DEF_PARTNER\n\tcreatevisualtask AnimTask_ImprisonOrbs, 5\n\tdelay 8\n\tloopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_ATTACKER, 8, 5\n\twaitforvisualfinish\n\tdelay 4\n\tcreatesprite gRedXSpriteTemplate, ANIM_ATTACKER, 5, ANIM_ATTACKER, 40\n\tcreatevisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 1, 10\n\tplaysewithpan SE_M_HYPER_BEAM, SOUND_PAN_ATTACKER\n\tclearmonbg ANIM_DEF_PARTNER\n\tcall UnsetPsychicBackground\n\tend\n\nMove_GRUDGE:\n\tloadspritegfx ANIM_TAG_PURPLE_FLAME\n\tmonbg ANIM_ATTACKER\n\tsplitbgprio_all\n\tfadetobg BG_GHOST\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\twaitbgfadein\n\tcreatevisualtask AnimTask_GrudgeFlames, 3\n\tloopsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER, 16, 4\n\tdelay 10\n\tdelay 80\n\tplaysewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\trestorebg\n\twaitbgfadein\n\tclearmonbg ANIM_ATTACKER\n\tend\n\nMove_CAMOUFLAGE:\n\tmonbg ANIM_ATK_PARTNER\n\tsplitbgprio ANIM_ATTACKER\n\tsetalpha 16, 0\n\tcreatevisualtask AnimTask_SetCamouflageBlend, 5, F_PAL_ATTACKER, 3, 0, 14\n\tdelay 16\n\tcreatevisualtask AnimTask_AttackerFadeToInvisible, 2, 4\n\tplaysewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tdelay 8\n\tcreatevisualtask AnimTask_SetCamouflageBlend, 5, F_PAL_ATTACKER, 0, 0, 0\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_AttackerFadeFromInvisible, 2, 1\n\twaitforvisualfinish\n\tblendoff\n\tclearmonbg ANIM_ATK_PARTNER\n\tend\n\nMove_TAIL_GLOW:\n\tloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT\n\tmonbg ANIM_ATTACKER\n\tsetalpha 12, 8\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB_BLACK\n\twaitforvisualfinish\n\tcreatesprite gTailGlowOrbSpriteTemplate, ANIM_ATTACKER, 66, ANIM_ATTACKER\n\tdelay 18\n\tloopsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER, 16, 6\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 4, 0, RGB_BLACK\n\tclearmonbg ANIM_ATTACKER\n\tblendoff\n\tdelay 1\n\tend\n\nMove_LUSTER_PURGE:\n\tloadspritegfx ANIM_TAG_WHITE_CIRCLE_OF_LIGHT\n\tloadspritegfx ANIM_TAG_IMPACT\n\tfadetobg BG_PSYCHIC\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_FadeScreenToWhite, 5\n\twaitbgfadein\n\tmonbg ANIM_ATTACKER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER\n\tcreatesprite gLusterPurgeCircleSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0\n\tdelay 20\n\tcreatevisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA\n\tcreatevisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT, 2, 0, 16, RGB_WHITEALPHA\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(0, 0, 23)\n\twaitforvisualfinish\n\tcreatesprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET\n\tdelay 3\n\tcreatesprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET\n\tdelay 3\n\tcreatesprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET\n\tdelay 3\n\tcreatesprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET\n\tdelay 3\n\tcreatesprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET\n\tdelay 3\n\tcreatesprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA\n\tcreatevisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tblendoff\n\tcall UnsetPsychicBackground\n\tend\n\nMove_MIST_BALL:\n\tloadspritegfx ANIM_TAG_SMALL_BUBBLES\n\tloadspritegfx ANIM_TAG_WHITE_FEATHER\n\tdelay 0\n\tplaysewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER\n\tcreatesprite gMistBallSpriteTemplate, ANIM_TARGET, 0, 0, 0, 0, 0, 30, 0\n\twaitforvisualfinish\n\tplaysewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 10, 0\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 1, 1, RGB(23, 16, 31), 16, RGB_WHITE, 16\n\tdelay 0\n\tplaysewithpan SE_M_HAZE, 0\n\tcreatevisualtask AnimTask_MistBallFog, 5\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 3, 0, 16, RGB_WHITE\n\tdelay 8\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 70, 0\n\tdelay 70\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 16, 0, RGB_WHITE\n\tend\n\nMove_FEATHER_DANCE:\n\tloadspritegfx ANIM_TAG_WHITE_FEATHER\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_all\n\tplaysewithpan SE_M_PETAL_DANCE, SOUND_PAN_TARGET\n\tdelay 0\n\tcreatesprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 64, 2, 104, 11304, 32, 1\n\tdelay 6\n\tcreatesprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 32, 2, 104, 11304, 32, 1\n\tcreatesprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 0, 2, 104, 11304, 32, 1\n\tdelay 6\n\tcreatesprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 224, 2, 104, 11304, 32, 1\n\tcreatesprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 128, 2, 104, 11304, 32, 1\n\tdelay 6\n\tcreatesprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 192, 2, 104, 11304, 32, 1\n\tcreatesprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 160, 2, 104, 11304, 32, 1\n\tdelay 6\n\tcreatesprite gFallingFeatherSpriteTemplate, ANIM_TARGET, 0, 0, -16, 96, 2, 104, 11304, 32, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nMove_TEETER_DANCE:\n\tloadspritegfx ANIM_TAG_MUSIC_NOTES\n\tloadspritegfx ANIM_TAG_DUCK\n\tcreatevisualtask AnimTask_TeeterDanceMovement, 5\n\tcreatesprite gFastFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, -2\n\tplaysewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER\n\tdelay 24\n\tcreatesprite gFastFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -2\n\tplaysewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER\n\tdelay 24\n\tcreatesprite gFastFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0, -16, -2\n\tplaysewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER\n\tdelay 24\n\tcreatesprite gFastFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 1, -8, -2\n\tplaysewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER\n\tdelay 24\n\tcreatesprite gFastFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 2, 8, -2\n\tplaysewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER\n\tend\n\nMove_MUD_SPORT:\n\tloadspritegfx ANIM_TAG_MUD_SAND\n\tcreatevisualtask AnimTask_Splash, 2, 0, 6\n\tdelay 24\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, -4, -16\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, 4, -12\n\tplaysewithpan SE_M_DIG, SOUND_PAN_ATTACKER\n\tdelay 32\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, -3, -12\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, 5, -14\n\tplaysewithpan SE_M_DIG, SOUND_PAN_ATTACKER\n\tdelay 32\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, -5, -18\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 0, 3, -14\n\tplaysewithpan SE_M_DIG, SOUND_PAN_ATTACKER\n\tdelay 16\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 220, 60\n\twaitplaysewithpan SE_M_BUBBLE2, 0, 15\n\tdelay 2\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 60, 100\n\twaitplaysewithpan SE_M_BUBBLE2, 0, 25\n\tdelay 2\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 140, 55\n\twaitplaysewithpan SE_M_BUBBLE2, 0, 14\n\tdelay 2\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 180, 50\n\twaitplaysewithpan SE_M_BUBBLE2, 0, 10\n\tdelay 2\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 20, 90\n\twaitplaysewithpan SE_M_BUBBLE2, 0, 22\n\tdelay 2\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 90, 90\n\twaitplaysewithpan SE_M_BUBBLE2, 0, 22\n\tdelay 2\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 160, 60\n\twaitplaysewithpan SE_M_BUBBLE2, 0, 15\n\tdelay 2\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 30, 90\n\twaitplaysewithpan SE_M_BUBBLE2, 0, 22\n\tdelay 2\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 120, 60\n\twaitplaysewithpan SE_M_BUBBLE2, 0, 15\n\tdelay 2\n\tcreatesprite gMudsportMudSpriteTemplate, ANIM_TARGET, 2, 1, 200, 40\n\twaitplaysewithpan SE_M_BUBBLE2, 0, 10\n\tend\n\nMove_NEEDLE_ARM:\n\tloadspritegfx ANIM_TAG_GREEN_SPIKE\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 2, 16\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 0, -32, 16\n\tdelay 2\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 22, -22, 16\n\tdelay 2\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 30, 0, 16\n\tdelay 2\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 20, 20, 16\n\tdelay 2\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 0, 28, 16\n\tdelay 2\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, -19, 19, 16\n\tdelay 2\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, -27, 0, 16\n\tdelay 2\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, -18, -18, 16\n\tdelay 2\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 0, -25, 16\n\tdelay 2\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 17, -17, 16\n\tdelay 2\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 23, 0, 16\n\tdelay 2\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 16, 16, 16\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 0, -24, 10\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 17, -17, 10\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 24, 0, 10\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 17, 17, 10\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 0, 24, 10\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, -17, 17, 10\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, -24, 0, 10\n\tcreatesprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, -17, -17, 10\n\tend\n\nMove_SLACK_OFF:\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tcreatevisualtask AnimTask_SlackOffSquish, 2, ANIM_ATTACKER\n\tplaysewithpan SE_M_YAWN, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcall HealingEffect\n\twaitforvisualfinish\n\tend\n\nMove_CRUSH_CLAW:\n\tloadspritegfx ANIM_TAG_BLUE_LIGHT_WALL\n\tloadspritegfx ANIM_TAG_CLAW_SLASH\n\tloadspritegfx ANIM_TAG_TORN_METAL\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4\n\tdelay 4\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 18, 1\n\tcreatesprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0\n\tcreatesprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\tdelay 12\n\tcreatesprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, -10, 1\n\tcreatesprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, 10, 1\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\twaitforvisualfinish  @ Redundant\n\tblendoff\n\tclearmonbg ANIM_TARGET\n\tend\n\nMove_AROMATHERAPY:\n\tplaysewithpan SE_M_PETAL_DANCE, 0\n\tloadspritegfx ANIM_TAG_FLOWER\n\tloadspritegfx ANIM_TAG_THIN_RING\n\tloadspritegfx ANIM_TAG_SPARKLE_2\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 0, 0, 7, RGB(13, 31, 12)\n\tdelay 1\n\tmonbg ANIM_ATTACKER\n\tdelay 1\n\tcreatesprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 24, 16, 0, 2, 2, 0, 0\n\tcreatesprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 66, 64, 24, 0, 3, 1, 1, 0\n\tcreatesprite gAromatherapyBigFlowerSpriteTemplate, ANIM_ATTACKER, 0, 16, 24, 0, 2, 1, 0, 0\n\tdelay 20\n\tcreatesprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 66, 48, 12, 0, 4, 3, 1, 0\n\tcreatesprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 100, 16, 0, 3, 2, 0, 0\n\tcreatesprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 74, 24, 180, 3, 2, 0, 0\n\tdelay 10\n\tcreatesprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 66, 80, 30, 0, 4, 1, 1, 0\n\tcreatesprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 128, 12, 0, 3, 3, 0, 0\n\tcreatesprite gAromatherapyBigFlowerSpriteTemplate, ANIM_ATTACKER, 0, 90, 16, 0, 2, 1, 0, 0\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tdelay 1\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 0, 7, 0, RGB(13, 31, 12)\n\tdelay 1\n\tplaysewithpan SE_M_STAT_INCREASE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_StatusClearedEffect, 2, 1\n\twaitforvisualfinish\n\tplaysewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER\n\tcreatesprite gSparklingStarsSpriteTemplate, ANIM_ATTACKER, 16, -15, 0, 0, 0, 32, 60, 1\n\tdelay 8\n\tcreatesprite gSparklingStarsSpriteTemplate, ANIM_ATTACKER, 16, 12, -5, 0, 0, 32, 60, 1\n\twaitforvisualfinish\n\tplaysewithpan SE_SHINY, SOUND_PAN_ATTACKER\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_ANIM_1, 3, 10, 0, RGB(13, 31, 12)\n\tcreatesprite gBlendThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 16, 0, 0, 0, 1\n\twaitforvisualfinish\n\tend\n\nMove_FAKE_TEARS:\n\tloadspritegfx ANIM_TAG_SMALL_BUBBLES\n\tloadspritegfx ANIM_TAG_THOUGHT_BUBBLE\n\tloadspritegfx ANIM_TAG_MUSIC_NOTES\n\tcreatevisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SMALL_BUBBLES, 0, 4, 4, RGB(12, 11, 31)\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 1\n\tloopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 12, 4\n\tdelay 8\n\tcreatesprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 0\n\tcreatesprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 1\n\tdelay 8\n\tcreatesprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 2\n\tcreatesprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 3\n\tdelay 8\n\tcreatesprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 0\n\tcreatesprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 1\n\tdelay 8\n\tcreatesprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 2\n\tcreatesprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0, 3\n\twaitforvisualfinish\n\tend\n\nMove_AIR_CUTTER:\n\tloadspritegfx ANIM_TAG_AIR_WAVE\n\tloadspritegfx ANIM_TAG_CUT\n\tloadspritegfx ANIM_TAG_IMPACT\n\tdelay 0\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tdelay 0\n\tcreatevisualtask AnimTask_AirCutterProjectile, 2, 32, -24, 6 * 256, 2, 128  @ 6 * 256 == Q_8_8(6)\n\twaitforvisualfinish\n\tplaysewithpan SE_M_CUT, SOUND_PAN_TARGET\n\tcreatesprite gAirCutterSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0, 2\n\tdelay 5\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 8, 1\n\twaitforvisualfinish\n\tblendoff\n\tclearmonbg ANIM_DEF_PARTNER\n\tdelay 0\n\tend\n\nMove_ODOR_SLEUTH:\n\tmonbg ANIM_TARGET\n\tcreatevisualtask AnimTask_OdorSleuthMovement, 5\n\tdelay 24\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 4\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER\n\tdelay 6\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 3, 4\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tdelay 1\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 1, RGB_WHITEALPHA, 16, RGB_WHITEALPHA, 0\n\tplaysewithpan SE_M_LEER, SOUND_PAN_ATTACKER\n\tend\n\nMove_GRASS_WHISTLE:\n\tloadspritegfx ANIM_TAG_MUSIC_NOTES\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB(18, 31, 12)\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_MusicNotesRainbowBlend, 2\n\twaitforvisualfinish\n\tpanse SE_M_GRASSWHISTLE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 7, 1, 0\n\tdelay 5\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 6, 1, 0\n\tdelay 5\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 1, 1, 0\n\tdelay 5\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 1, 0\n\tdelay 5\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 3, 1, 0\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 1, 0\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 5, 1, 0\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 6, 1, 0\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 1, 0\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 1, 0\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 1, 1, 0\n\tdelay 4\n\tcreatesprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 5, 1, 0\n\tdelay 4\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_MusicNotesClearRainbowBlend, 2\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 4, 0, RGB(18, 31, 12)\n\twaitforvisualfinish\n\tend\n\nMove_TICKLE:\n\tloadspritegfx ANIM_TAG_EYE_SPARKLE\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 0, 16, RGB_BLACK\n\twaitforvisualfinish\n\tcreatesprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, -16, -8\n\tcreatesprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, 16, -8\n\tplaysewithpan SE_M_DETECT, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 16, 0, RGB_BLACK\n\twaitforvisualfinish\n\tdelay 20\n\tcreatevisualtask AnimTask_SwayMon, 3, 0, 6, 1280, 3, ANIM_ATTACKER\n\tdelay 12\n\tcreatevisualtask AnimTask_RockMonBackAndForth, 3, ANIM_TARGET, 6, 2\n\tloopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_TARGET, 8, 8\n\twaitforvisualfinish\n\tend\n\nMove_WATER_SPOUT:\n\tloadspritegfx ANIM_TAG_GLOWY_BLUE_ORB\n\tloadspritegfx ANIM_TAG_WATER_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_WaterSpoutLaunch, 5\n\tplaysewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER\n\tdelay 44\n\tplaysewithpan SE_M_DIVE, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tdelay 16\n\tcreatevisualtask AnimTask_WaterSpoutRain, 5\n\tplaysewithpan SE_M_SURF, SOUND_PAN_TARGET\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_SHADOW_PUNCH:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tfadetobg BG_GHOST\n\twaitbgfadein\n\tmonbg ANIM_ATK_PARTNER\n\tsetalpha 9, 8\n\tcreatevisualtask AnimTask_AttackerPunchWithTrace, 2, RGB_BLACK, 13\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER\n\tdelay 6\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\trestorebg\n\twaitbgfadein\n\tend\n\nMove_EXTRASENSORY:\n\tcall SetPsychicBackground\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1\n\tcreatevisualtask AnimTask_ExtrasensoryDistortion, 5, 0\n\tplaysewithpan SE_M_BIND, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1\n\tcreatevisualtask AnimTask_ExtrasensoryDistortion, 5, 1\n\tplaysewithpan SE_M_BIND, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_TransparentCloneGrowAndShrink, 5, ANIM_ATTACKER\n\tcreatevisualtask AnimTask_ExtrasensoryDistortion, 5, 2\n\tplaysewithpan SE_M_LEER, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tblendoff\n\tclearmonbg ANIM_DEF_PARTNER\n\tcall UnsetPsychicBackground\n\tend\n\nMove_AERIAL_ACE:\n\tloadspritegfx ANIM_TAG_CUT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5\n\tcreatevisualtask AnimTask_TraceMonBlended, 2, 0, 4, 7, 3\n\tcreatesprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0\n\tplaysewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER\n\tdelay 5\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 10, RGB_BLACK, 0\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_IRON_DEFENSE:\n\tloopsewithpan SE_SHINY, SOUND_PAN_ATTACKER, 28, 2\n\tcreatevisualtask AnimTask_MetallicShine, 5, 0, 0, 0\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 8, 2, RGB_WHITEALPHA, 14, RGB_WHITEALPHA, 0\n\twaitforvisualfinish\n\tend\n\nMove_BLOCK:\n\tloadspritegfx ANIM_TAG_X_SIGN\n\tcreatesprite gBlockXSpriteTemplate, ANIM_TARGET, 66\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tend\n\nMove_HOWL:\n\tloadspritegfx ANIM_TAG_NOISE_LINE\n\tcreatevisualtask AnimTask_DeepInhale, 2, 0\n\tdelay 12\n\tcall RoarEffect\n\tcreatevisualtask SoundTask_PlayCryHighPitch, 2, ANIM_ATTACKER, 3\n\twaitforvisualfinish\n\tdelay 30\n\tend\n\nMove_BULK_UP:\n\tloadspritegfx ANIM_TAG_BREATH\n\tcreatevisualtask AnimTask_GrowAndShrink, 2\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gBreathPuffSpriteTemplate, ANIM_ATTACKER, 2\n\tloopsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 4, 2\n\twaitforvisualfinish\n\tend\n\nMove_COVET:\n\tloadspritegfx ANIM_TAG_MAGENTA_HEART\n\tloadspritegfx ANIM_TAG_ITEM_BAG\n\tcreatevisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0\n\tcreatesprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0, 20\n\tplaysewithpan SE_M_CHARM, SOUND_PAN_ATTACKER\n\tdelay 15\n\tcreatesprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, -20, 20\n\tplaysewithpan SE_M_CHARM, SOUND_PAN_ATTACKER\n\tdelay 15\n\tcreatesprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 20, 20\n\tplaysewithpan SE_M_CHARM, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1\n\tloopsewithpan SE_M_DIZZY_PUNCH, SOUND_PAN_TARGET, 4, 3\n\tend\n\nMove_VOLT_TACKLE:\n\tloadspritegfx ANIM_TAG_SPARK\n\tloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT\n\tloadspritegfx ANIM_TAG_ELECTRICITY\n\tmonbg ANIM_ATTACKER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 8, RGB_BLACK\n\twaitforvisualfinish\n\tcreatesprite gVoltTackleOrbSlideSpriteTemplate, ANIM_ATTACKER, 1\n\tplaysewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tblendoff\n\tdelay 8\n\tcreatevisualtask AnimTask_VoltTackleBolt, 5, 0\n\tplaysewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_VoltTackleBolt, 5, 1\n\tplaysewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_VoltTackleBolt, 5, 2\n\tplaysewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_VoltTackleBolt, 5, 3\n\tplaysewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_VoltTackleBolt, 5, 4\n\tplaysewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER\n\tdelay 8\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 1, 16, 16\n\tdelay 2\n\tcreatesprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, -16\n\tdelay 8\n\tcreatevisualtask AnimTask_VoltTackleAttackerReappear, 5\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 3, 0, 9, 1\n\tplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER\n\tcreatesprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 16\n\tdelay 2\n\tcreatesprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, -16, -16\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 8, 0, RGB_BLACK\n\twaitforvisualfinish\n\tend\n\nMove_WATER_SPORT:\n\tloadspritegfx ANIM_TAG_GLOWY_BLUE_ORB\n\tcreatevisualtask AnimTask_WaterSport, 5\n\tdelay 8\n\tplaysewithpan SE_M_SURF, SOUND_PAN_ATTACKER\n\tdelay 44\n\tplaysewithpan SE_M_SURF, SOUND_PAN_ATTACKER\n\tdelay 44\n\tplaysewithpan SE_M_SURF, SOUND_PAN_ATTACKER\n\tdelay 44\n\tpanse SE_M_SURF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tend\n\nMove_CALM_MIND:\n\tloadspritegfx ANIM_TAG_THIN_RING\n\tmonbg ANIM_ATK_PARTNER\n\tcreatevisualtask AnimTask_BlendBattleAnimPalExclude, 5, ANIM_ATTACKER, 0, 0, 16, RGB_BLACK\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_SetAllNonAttackersInvisiblity, 5, TRUE\n\twaitforvisualfinish\n\tcreatesprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0\n\tplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER\n\tdelay 14\n\tcreatesprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0\n\tplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER\n\tdelay 14\n\tcreatesprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0\n\tplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_SetAllNonAttackersInvisiblity, 5, FALSE\n\tvisible ANIM_ATTACKER  @ Redundant\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPalExclude, 5, ANIM_ATTACKER, 0, 16, 0, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tend\n\nMove_LEAF_BLADE:\n\tloadspritegfx ANIM_TAG_LEAF\n\tloadspritegfx ANIM_TAG_CROSS_IMPACT\n\tcreatevisualtask AnimTask_LeafBlade, 5\n\tdelay 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1\n\tplaysewithpan SE_M_CUT, SOUND_PAN_TARGET\n\tdelay 50\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1\n\tplaysewithpan SE_M_CUT, SOUND_PAN_TARGET\n\tdelay 50\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1\n\tplaysewithpan SE_M_CUT, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tdelay 12\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 18, 1\n\tcreatesprite gCrossImpactSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 36\n\tplaysewithpan SE_M_LEER, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_DRAGON_DANCE:\n\tloadspritegfx ANIM_TAG_HOLLOW_ORB\n\tmonbg ANIM_ATTACKER\n\tsplitbgprio ANIM_ATTACKER\n\tdelay 1\n\tcreatevisualtask AnimTask_DragonDanceWaver, 5\n\tplaysewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER\n\tdelay 8\n\tcreatevisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, RGB(0, 0, 19), 14, 0, 3\n\tcreatesprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0\n\tcreatesprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 43\n\tcreatesprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 85\n\tcreatesprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 128\n\tcreatesprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 170\n\tcreatesprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 213\n\tdelay 30\n\tplaysewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER\n\tdelay 30\n\tplaysewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tdelay 1\n\tend\n\nMove_SHOCK_WAVE:\n\tloadspritegfx ANIM_TAG_ELECTRIC_ORBS\n\tloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT\n\tloadspritegfx ANIM_TAG_SPARK\n\tloadspritegfx ANIM_TAG_LIGHTNING\n\tmonbg ANIM_ATTACKER\n\tsetalpha 12, 8\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB_BLACK\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 20, 0, 2\n\tplaysewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER\n\tdelay 12\n\tcreatesprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2\n\tdelay 30\n\tcreatevisualtask AnimTask_ShockWaveProgressingBolt, 5\n\tdelay 12\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShockWaveLightning, 5\n\tplaysewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 18, 1\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_BG, 3, 16, 0, RGB_WHITE\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 16, 16, RGB_BLACK\n\tdelay 4\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 0, 0, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tblendoff\n\tend\n\nMove_HARDEN:\n\tloopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2\n\tcreatevisualtask AnimTask_MetallicShine, 5, 0, 0, 0\n\twaitforvisualfinish\n\tend\n\nMove_BELLY_DRUM:\n\tloadspritegfx ANIM_TAG_MUSIC_NOTES\n\tloadspritegfx ANIM_TAG_PURPLE_HAND_OUTLINE\n\tcreatevisualtask AnimTask_MusicNotesRainbowBlend, 2\n\twaitforvisualfinish\n\tcall BellyDrumRight\n\tcreatesprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, 0\n\tplaysewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER\n\tdelay 15\n\tcall BellyDrumLeft\n\tcreatesprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 1, 0\n\tplaysewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER\n\tdelay 15\n\tcall BellyDrumRight\n\tcreatesprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0, 3, 3, 128\n\tplaysewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER\n\tdelay 7\n\tcall BellyDrumLeft\n\tcreatesprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 1, 2, 0, 128\n\tplaysewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER\n\tdelay 7\n\tcall BellyDrumRight\n\tcreatesprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 1, 0\n\tplaysewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER\n\tdelay 7\n\tcall BellyDrumLeft\n\tcreatesprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 3, 0\n\tplaysewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_MusicNotesClearRainbowBlend, 2\n\twaitforvisualfinish\n\tend\n\nBellyDrumLeft:\n\tcreatesprite gBellyDrumHandSpriteTemplate, ANIM_ATTACKER, 3, 0\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 8, 2, 1\n\treturn\n\nBellyDrumRight:\n\tcreatesprite gBellyDrumHandSpriteTemplate, ANIM_ATTACKER, 3, 1\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 8, 2, 1\n\treturn\n\nMove_MIND_READER:\n\tloadspritegfx ANIM_TAG_TEAL_ALERT\n\tloadspritegfx ANIM_TAG_OPENING_EYE\n\tloadspritegfx ANIM_TAG_ROUND_WHITE_HALO\n\tmonbg 4\n\tplaysewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET\n\tcreatesprite gOpeningEyeSpriteTemplate, ANIM_ATTACKER, 5, 0, 0, 1, 0\n\tcreatesprite gWhiteHaloSpriteTemplate, ANIM_ATTACKER, 5\n\tdelay 40\n\tplaysewithpan SE_M_LEER, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG, 1, 2, 0, 10, RGB_BLACK\n\tcall MindReaderEyeSpikeEffect\n\twaitforvisualfinish\n\tclearmonbg 4\n\tend\n\nMindReaderEyeSpikeEffect:\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 70, 0, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 40, 40, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 10, -60, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -50, -40, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -40, 40, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 50, -50, 6\n\tdelay 2\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 50, -30, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 60, 10, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0, 60, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0, -40, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -60, 20, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -60, -30, 6\n\tdelay 2\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -50, 50, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -60, 20, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, -40, -40, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 20, -60, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 50, -50, 6\n\tcreatesprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 35, 40, 6\n\tdelay 2\n\treturn\n\nMove_ICE_PUNCH:\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tloadspritegfx ANIM_TAG_ICE_CRYSTALS\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(12, 26, 31)\n\tdelay 20\n\tplaysewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET\n\tcreatesprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 0\n\tcreatesprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 64\n\tcreatesprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 128\n\tcreatesprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 192\n\tdelay 5\n\tcreatesprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 32\n\tcreatesprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 96\n\tcreatesprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 160\n\tcreatesprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 224\n\tdelay 17\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 4, 0, -10, 8, 1, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -10, ANIM_TARGET, 1\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 3, 1\n\twaitforvisualfinish\n\tdelay 15\n\tcall IceCrystalEffectShort\n\tdelay 5\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(12, 26, 31)\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 7, 0, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_REST:\n\tplaysewithpan SE_M_SNORE, SOUND_PAN_ATTACKER\n\tloadspritegfx ANIM_TAG_LETTER_Z\n\tcreatesprite gSleepLetterZSpriteTemplate, ANIM_ATTACKER, 2, 4, -10, 16, 0, 0\n\tdelay 20\n\tcreatesprite gSleepLetterZSpriteTemplate, ANIM_ATTACKER, 2, 4, -10, 16, 0, 0\n\tdelay 20\n\tcreatesprite gSleepLetterZSpriteTemplate, ANIM_ATTACKER, 2, 4, -10, 16, 0, 0\n\twaitforvisualfinish\n\tend\n\nMove_CONFUSION:\n\tmonbg ANIM_DEF_PARTNER\n\tcall SetPsychicBackground\n\tsetalpha 8, 8\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB_WHITE\n\twaitforvisualfinish\n\tplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tdelay 1\n\tcall UnsetPsychicBackground\n\tend\n\nMove_PSYCHIC:\n\tmonbg ANIM_DEF_PARTNER\n\tcall SetPsychicBackground\n\tsetalpha 8, 8\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB(31, 23, 0)\n\twaitforvisualfinish\n\tloopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 10, 3\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 15, 1\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -6, -6, 15, ANIM_TARGET, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tdelay 1\n\tcall UnsetPsychicBackground\n\tend\n\nMove_FUTURE_SIGHT:\n\tgoto FutureSight\n\nFutureSightContinue:\n\twaitforvisualfinish\n\tdelay 1\n\tcall UnsetPsychicBackground\n\tend\n\nFutureSight:\n\tmonbg ANIM_ATK_PARTNER\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\tcall SetPsychicBackground\n\tsetalpha 8, 8\n\tplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB_WHITE\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_ATTACKER, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tgoto FutureSightContinue\n\nUnusedFutureSightHit:\n\tmonbg ANIM_DEF_PARTNER\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\tcall SetPsychicBackground\n\tsetalpha 8, 8\n\tplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET\n\twaitplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 8\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 15, 1\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 15, ANIM_TARGET, 1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 24, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tgoto FutureSightContinue\n\nMove_THUNDER:\n\tloadspritegfx ANIM_TAG_LIGHTNING\n\tfadetobg BG_THUNDER\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 5, -256, 0, 1, -1\n\twaitbgfadein\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 16, RGB_BLACK\n\tdelay 16\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tplaysewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, -36\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, -20\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, 12\n\tdelay 20\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 6, -16, -32\n\tplaysewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 6, -16, -16\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 6, -16, 16\n\tplaysewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET\n\tdelay 5\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 24, -32\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 24, -16\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 24, 16\n\tdelay 30\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 5\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -32\n\tplaysewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16\n\tdelay 10\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 1\n\tcreatevisualtask AnimTask_ShakeTargetInPattern, 2, 30, 3, TRUE, 0\n\tdelay 2\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 1\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_TARGET, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK\n\twaitforvisualfinish\n\trestorebg\n\twaitbgfadeout\n\tsetarg 7, 0xFFFF\n\twaitbgfadein\n\tend\n\nMove_THUNDER_PUNCH:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_LIGHTNING\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 16, RGB_BLACK\n\twaitforvisualfinish\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1\n\tdelay 1\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, -16\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, 16\n\tdelay 1\n\tplaysewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2\n\tdelay 1\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK\n\tdelay 20\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_SACRED_FIRE:\n\tloadspritegfx ANIM_TAG_FIRE\n\tloadspritegfx ANIM_TAG_FIRE_PLUME\n\tloopsewithpan SE_M_SACRED_FIRE, SOUND_PAN_ATTACKER, 7, 5\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 50, 5, -2, 0\n\tdelay 1\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, -20, -10, 50, 5, -1, -1\n\tdelay 1\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 0, -16, 50, 5, 0, -1\n\tdelay 1\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 20, -10, 50, 5, 1, -1\n\tdelay 1\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 50, 5, 2, 0\n\tdelay 1\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 20, 10, 50, 5, 1, 1\n\tdelay 1\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 1\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 50, 5, 0, 1\n\tdelay 1\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -20, 10, 50, 5, -1, 1\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 1\n\twaitforvisualfinish\n\tplaysewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET\n\tcreatesprite gLargeFlameSpriteTemplate, ANIM_TARGET, 2, -16, 0, 70, 16, 0, 1\n\tdelay 10\n\tplaysewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET\n\tcreatesprite gLargeFlameSpriteTemplate, ANIM_TARGET, 2, 0, 0, 70, 16, 0, 1\n\tdelay 10\n\tplaysewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET\n\tcreatesprite gLargeFlameSpriteTemplate, ANIM_TARGET, 2, 16, 0, 80, 16, 0, 1\n\tdelay 1\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 1\n\tplaysewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 0\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 0, 1\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, -1\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 2, 1\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 1, -1\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 1\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 1, -2\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 3, 1\n\twaitforvisualfinish\n\tend\n\nMove_SCRATCH:\n\tloadspritegfx ANIM_TAG_SCRATCH\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_SCRATCH, SOUND_PAN_TARGET\n\tcreatesprite gScratchSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 0\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\twaitforvisualfinish\n\tend\n\nMove_DRAGON_BREATH:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tloopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 7, 7\n\tcreatesprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20\n\tdelay 2\n\tcreatesprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20\n\tdelay 2\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 9, RGB_RED\n\tcreatesprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20\n\tdelay 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 21, 1\n\tcreatesprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20\n\tdelay 2\n\tcreatesprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20\n\tdelay 2\n\tcreatesprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20\n\tdelay 2\n\tcreatesprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20\n\tdelay 2\n\tcreatesprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20\n\tdelay 2\n\tcreatesprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20\n\tdelay 2\n\tcreatesprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20\n\tdelay 2\n\tcreatesprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 9, 0, RGB_RED\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nMove_ROAR:\n\tloadspritegfx ANIM_TAG_NOISE_LINE\n\tmonbg ANIM_ATTACKER\n\tsplitbgprio ANIM_ATTACKER\n\tsetalpha 8, 8\n\tcreatevisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_ROAR\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 10, ANIM_ATTACKER, 1\n\tcall RoarEffect\n\tdelay 20\n\tcreatevisualtask AnimTask_SlideOffScreen, 5, ANIM_TARGET, 2\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tblendoff\n\twaitforvisualfinish\n\tcreatevisualtask SoundTask_WaitForCry, 5\n\twaitforvisualfinish\n\tend\n\nRoarEffect:\n\tcreatesprite gRoarNoiseLineSpriteTemplate, ANIM_ATTACKER, 2, 24, -8, 0\n\tcreatesprite gRoarNoiseLineSpriteTemplate, ANIM_ATTACKER, 2, 24, 0, 2\n\tcreatesprite gRoarNoiseLineSpriteTemplate, ANIM_ATTACKER, 2, 24, 8, 1\n\tdelay 15\n\tcreatesprite gRoarNoiseLineSpriteTemplate, ANIM_ATTACKER, 2, 24, -8, 0\n\tcreatesprite gRoarNoiseLineSpriteTemplate, ANIM_ATTACKER, 2, 24, 0, 2\n\tcreatesprite gRoarNoiseLineSpriteTemplate, ANIM_ATTACKER, 2, 24, 8, 1\n\treturn\n\nMove_GROWL:\n\tloadspritegfx ANIM_TAG_NOISE_LINE\n\tcreatevisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL\n\tcall RoarEffect\n\tdelay 10\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 9, 1\n\twaitforvisualfinish\n\tcreatevisualtask SoundTask_WaitForCry, 5\n\twaitforvisualfinish\n\tend\n\nMove_SNORE:\n\tloadspritegfx ANIM_TAG_SNORE_Z\n\tmonbg ANIM_ATK_PARTNER\n\tsetalpha 8, 8\n\tcall SnoreEffect\n\tdelay 30\n\tcall SnoreEffect\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tend\n\nSnoreEffect:\n\tplaysewithpan SE_M_SNORE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 7, ANIM_ATTACKER, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 7, 1\n\tcreatesprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, 14, 0, 0\n\tcreatesprite gSnoreZSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -42, -38, 24, 0, 0\n\tcreatesprite gSnoreZSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, -42, 24, 0, 0\n\tcreatesprite gSnoreZSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 42, -38, 24, 0, 0\n\treturn\n\nMove_LIGHT_SCREEN:\n\tloadspritegfx ANIM_TAG_SPARKLE_3\n\tloadspritegfx ANIM_TAG_GREEN_LIGHT_WALL\n\tsetalpha 0, 16\n\twaitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 15\n\tcreatesprite gLightScreenWallSpriteTemplate, ANIM_ATTACKER, 1, 40, 0, ANIM_TAG_GREEN_LIGHT_WALL\n\tdelay 10\n\tcall SpecialScreenSparkle\n\twaitforvisualfinish\n\tdelay 1\n\tblendoff\n\tend\n\nSpecialScreenSparkle:\n\tcreatesprite gSpecialScreenSparkleSpriteTemplate, ANIM_ATTACKER, 2, 23, 0, ANIM_ATTACKER, TRUE\n\tdelay 6\n\tcreatesprite gSpecialScreenSparkleSpriteTemplate, ANIM_ATTACKER, 2, 31, -8, ANIM_ATTACKER, TRUE\n\tdelay 5\n\tcreatesprite gSpecialScreenSparkleSpriteTemplate, ANIM_ATTACKER, 2, 30, 20, ANIM_ATTACKER, TRUE\n\tdelay 7\n\tcreatesprite gSpecialScreenSparkleSpriteTemplate, ANIM_ATTACKER, 2, 10, -15, ANIM_ATTACKER, TRUE\n\tdelay 6\n\tcreatesprite gSpecialScreenSparkleSpriteTemplate, ANIM_ATTACKER, 2, 20, 10, ANIM_ATTACKER, TRUE\n\tdelay 6\n\tcreatesprite gSpecialScreenSparkleSpriteTemplate, ANIM_ATTACKER, 2, 10, 18, ANIM_ATTACKER, TRUE\n\treturn\n\nMove_MIRROR_COAT:\n\tloadspritegfx ANIM_TAG_SPARKLE_3\n\tloadspritegfx ANIM_TAG_RED_LIGHT_WALL\n\tsetalpha 0, 16\n\tcreatesprite gMirrorCoatWallSpriteTemplate, ANIM_ATTACKER, 1, 40, 0, ANIM_TAG_RED_LIGHT_WALL\n\tdelay 10\n\tplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER\n\tcall SpecialScreenSparkle\n\twaitforvisualfinish\n\tdelay 1\n\tblendoff\n\tend\n\nMove_REFLECT:\n\tloadspritegfx ANIM_TAG_SPARKLE_4\n\tloadspritegfx ANIM_TAG_BLUE_LIGHT_WALL\n\tsetalpha 0, 16\n\twaitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 15\n\tcreatesprite gReflectWallSpriteTemplate, ANIM_ATTACKER, 1, 40, 0, ANIM_TAG_BLUE_LIGHT_WALL\n\tdelay 20\n\tcreatesprite gReflectSparkleSpriteTemplate, ANIM_ATTACKER, 2, 30, 0, ANIM_ATTACKER, TRUE\n\tdelay 7\n\tcreatesprite gReflectSparkleSpriteTemplate, ANIM_ATTACKER, 2, 19, -12, ANIM_ATTACKER, TRUE\n\tdelay 7\n\tcreatesprite gReflectSparkleSpriteTemplate, ANIM_ATTACKER, 2, 10, 20, ANIM_ATTACKER, TRUE\n\twaitforvisualfinish\n\tdelay 1\n\tblendoff\n\tend\n\nMove_BARRIER:\n\tloadspritegfx ANIM_TAG_GRAY_LIGHT_WALL\n\tsetalpha 0, 16\n\twaitplaysewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER, 15\n\tcreatesprite gBarrierWallSpriteTemplate, ANIM_ATTACKER, 3, 40, 0, ANIM_TAG_GRAY_LIGHT_WALL\n\twaitforvisualfinish\n\tdelay 1\n\tblendoff\n\tend\n\nMove_BUBBLE:\n\tloadspritegfx ANIM_TAG_BUBBLE\n\tloadspritegfx ANIM_TAG_SMALL_BUBBLES\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tdelay 1\n\tcreatesprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 15, -15, 10, 128, 100\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET, 100\n\tdelay 6\n\tcreatesprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 35, 37, 40, 128, 100\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET, 100\n\tdelay 6\n\tcreatesprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 10, -37, 30, 128, 100\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET, 100\n\tdelay 6\n\tcreatesprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 30, 10, 15, 128, 100\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET, 100\n\tdelay 6\n\tcreatesprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 20, 33, 20, 128, 100\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET, 100\n\tdelay 6\n\tcreatesprite gWaterBubbleProjectileSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 25, -30, 10, 128, 100\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET, 100\n\twaitforvisualfinish\n\tcall WaterBubblesEffectLong\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_SMOG:\n\tloadspritegfx ANIM_TAG_PURPLE_GAS_CLOUD\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_all\n\tsetalpha 12, 8\n\tloopsewithpan SE_M_MIST, SOUND_PAN_TARGET, 17, 10\n\tcall SmogCloud\n\tcall SmogCloud\n\tcall SmogCloud\n\tcall SmogCloud\n\tcall SmogCloud\n\tcall SmogCloud\n\tcall SmogCloud\n\tdelay 120\n\tloopsewithpan SE_M_TOXIC, SOUND_PAN_TARGET, 18, 2\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(26, 0, 26)\n\tdelay 10\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 15, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nSmogCloud:\n\tcreatesprite gSmogCloudSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 48, 240, 1, 0\n\tdelay 7\n\treturn\n\nMove_FAINT_ATTACK:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_ATTACKER\n\tfadetobg BG_DARK\n\twaitbgfadein\n\tdelay 0\n\tplaysewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 3\n\tcreatevisualtask AnimTask_AttackerFadeToInvisible, 2, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tinvisible ANIM_ATTACKER\n\tdelay 1\n\tcreatevisualtask AnimTask_SetAttackerInvisibleWaitForSignal, 2\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tdelay 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 9, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tdelay 1\n\tsetarg 7, 0x1000\n\tdelay 32\n\tcreatevisualtask AnimTask_InitAttackerFadeFromInvisible, 2\n\tmonbg ANIM_ATTACKER\n\tcreatevisualtask AnimTask_AttackerFadeFromInvisible, 2, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tdelay 1\n\trestorebg\n\twaitbgfadein\n\tend\n\nMove_SAND_ATTACK:\n\tloadspritegfx ANIM_TAG_MUD_SAND\n\tmonbg ANIM_ATK_PARTNER\n\tsplitbgprio ANIM_ATTACKER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, -10, 0, 0, 3\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2\n\tcall SandAttackDirt\n\tcall SandAttackDirt\n\tcall SandAttackDirt\n\tcall SandAttackDirt\n\tcall SandAttackDirt\n\tcall SandAttackDirt\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tend\n\nSandAttackDirt:\n\tcreatesprite gSandAttackDirtSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, 0, 0\n\tcreatesprite gSandAttackDirtSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, 10, 10\n\tcreatesprite gSandAttackDirtSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, -10, -10\n\tcreatesprite gSandAttackDirtSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, 20, 5\n\tcreatesprite gSandAttackDirtSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, -20, -5\n\tdelay 2\n\treturn\n\nMove_MUD_SLAP:\n\tloadspritegfx ANIM_TAG_MUD_SAND\n\tplaysewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, -10, 0, 0, 3\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2\n\tcall MudSlapMud\n\tcall MudSlapMud\n\tcall MudSlapMud\n\tcall MudSlapMud\n\tcall MudSlapMud\n\tcall MudSlapMud\n\twaitforvisualfinish\n\tend\n\nMudSlapMud:\n\tcreatesprite gMudSlapMudSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, 0, 0\n\tcreatesprite gMudSlapMudSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, 10, 5\n\tcreatesprite gMudSlapMudSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, -10, -5\n\tcreatesprite gMudSlapMudSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, 20, 10\n\tcreatesprite gMudSlapMudSpriteTemplate, ANIM_TARGET, 2, 15, 15, 20, -20, -10\n\tdelay 2\n\treturn\n\nMove_DRAGON_RAGE:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tloadspritegfx ANIM_TAG_FIRE_PLUME\n\tplaysewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 40, 1\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, 0, 15, 0, 0, 4\n\twaitforvisualfinish\n\tcreatesprite gDragonRageFireSpitSpriteTemplate, ANIM_TARGET, 2, 30, 15, 0, 10, 10\n\twaitforvisualfinish\n\tloopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET, 11, 3\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 25, 1\n\tcreatesprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 5, 0\n\tdelay 1\n\tcreatesprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -10, -15\n\tdelay 1\n\tcreatesprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 25\n\tdelay 1\n\tcreatesprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 15, 5\n\tdelay 1\n\tcreatesprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -25, 0\n\tdelay 1\n\tcreatesprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 30, 30\n\tdelay 1\n\tcreatesprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, -27, 25\n\tdelay 1\n\tcreatesprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 0, 8\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 66, 0, 0, 4\n\twaitforvisualfinish\n\tend\n\nMove_RAIN_DANCE:\n\tloadspritegfx ANIM_TAG_RAIN_DROPS\n\tplaysewithpan SE_M_RAIN_DANCE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 2, 0, 4, RGB_BLACK\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_CreateRaindrops, 2, 0, 3, 120\n\tcreatevisualtask AnimTask_CreateRaindrops, 2, 0, 3, 120\n\tdelay 120\n\tdelay 30\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 2, 4, 0, RGB_BLACK\n\twaitforvisualfinish\n\tend\n\nMove_BITE:\n\tloadspritegfx ANIM_TAG_SHARP_TEETH\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_BITE, SOUND_PAN_TARGET\n\tcreatesprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10\n\tcreatesprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10\n\tdelay 10\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 7, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tdelay 1\n\tend\n\nMove_CRUNCH:\n\tloadspritegfx ANIM_TAG_SHARP_TEETH\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tfadetobg BG_DARK\n\twaitbgfadein\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_BITE, SOUND_PAN_TARGET\n\tcreatesprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, -32, -32, 1, 819, 819, 10\n\tcreatesprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 32, 32, 5, -819, -819, 10\n\tdelay 10\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2\n\twaitforvisualfinish\n\tplaysewithpan SE_M_BITE, SOUND_PAN_TARGET\n\tcreatesprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 32, -32, 7, -819, 819, 10\n\tcreatesprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, -32, 32, 3, 819, -819, 10\n\tdelay 10\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tdelay 1\n\trestorebg\n\twaitbgfadein\n\tend\n\nMove_CLAMP:\n\tloadspritegfx ANIM_TAG_CLAMP\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET\n\tcreatesprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 2, 819, 0, 10\n\tcreatesprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 6, -819, 0, 10\n\tdelay 10\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\twaitforvisualfinish\n\tend\n\nMove_ICE_BEAM:\n\tmonbg ANIM_TARGET\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tloadspritegfx ANIM_TAG_ICE_CRYSTALS\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK\n\twaitforvisualfinish\n\tcreatesoundtask SoundTask_LoopSEAdjustPanning, SE_M_BUBBLE_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 4, 4, 0, 10\n\tcreatesprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, 12, 0, 12, 20\n\tcreatesprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, -12, 0, -12, 20\n\tdelay 1\n\tcall IceBeamCreateCrystals\n\tcall IceBeamCreateCrystals\n\tcall IceBeamCreateCrystals\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, -31, 0, 7, RGB(0, 20, 31)\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 25, 1\n\tcall IceBeamCreateCrystals\n\tcall IceBeamCreateCrystals\n\tcall IceBeamCreateCrystals\n\tcall IceBeamCreateCrystals\n\tcall IceBeamCreateCrystals\n\tcall IceBeamCreateCrystals\n\tcall IceBeamCreateCrystals\n\tcall IceBeamCreateCrystals\n\tcreatesprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 11\n\tdelay 1\n\tcreatesprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 11\n\twaitforvisualfinish\n\tdelay 20\n\tcall IceCrystalEffectShort\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, 5, 7, 0, RGB(0, 20, 31)\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 7, 0, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nIceBeamCreateCrystals:\n\tcreatesprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, 12, 0, 12, 20\n\tcreatesprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, -12, 0, -12, 20\n\tcreatesprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 11\n\tdelay 1\n\treturn\n\nMove_WITHDRAW:\n\tplaysewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_Withdraw, 5\n\twaitforvisualfinish\n\tend\n\nMove_AURORA_BEAM:\n\tloadspritegfx ANIM_TAG_RAINBOW_RINGS\n\tfadetobg BG_AURORA\n\twaitbgfadein\n\tplaysewithpan SE_M_BUBBLE_BEAM, SOUND_PAN_ATTACKER\n\tsetarg 7, 0\n\tcreatevisualtask AnimTask_RotateAuroraRingColors, 10, 130\n\tcall AuroraBeamCreateRings\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 1, 0, 17, 1\n\tcall AuroraBeamCreateRings\n\tcall AuroraBeamCreateRings\n\tcall AuroraBeamCreateRings\n\tsetarg 7, 0xFFFF\n\tcreatesoundtask SoundTask_LoopSEAdjustPanning, SE_M_BUBBLE_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 3, 6, 0, 10\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 40, 1\n\tcall AuroraBeamCreateRings\n\tcall AuroraBeamCreateRings\n\tcall AuroraBeamCreateRings\n\tcall AuroraBeamCreateRings\n\tcall AuroraBeamCreateRings\n\tcall AuroraBeamCreateRings\n\twaitforvisualfinish\n\trestorebg\n\twaitbgfadein\n\tend\n\nAuroraBeamCreateRings:\n\tcreatesprite gAuroraBeamRingSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 17\n\tdelay 1\n\tcreatesprite gAuroraBeamRingSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 17\n\tdelay 1\n\tcreatesprite gAuroraBeamRingSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 17\n\tdelay 1\n\tcreatesprite gAuroraBeamRingSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 17\n\tdelay 1\n\treturn\n\nMove_SOLAR_BEAM:\n\tloadspritegfx ANIM_TAG_ORBS\n\tchoosetwoturnanim SolarBeamSetUp, SolarBeamUnleash\n\nSolarBeamEnd:\n\twaitforvisualfinish\n\tend\n\nSolarBeamSetUp:\n\tmonbg ANIM_ATK_PARTNER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 1, 4, 0, 11, RGB(31, 31, 11)\n\tplaysewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER\n\tcall SolarBeamAbsorbEffect\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tgoto SolarBeamEnd\n\nSolarBeamAbsorbEffect:\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, 40, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, -40, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 40, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, -40, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, -20, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, 20, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, -20, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, 20, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -20, 30, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 20, -30, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -20, -30, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 20, 30, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, 0, 16\n\tdelay 2\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, 0, 16\n\tdelay 2\n\treturn\n\nSolarBeamUnleash:\n\tcall SetSolarBeamBg\n\tpanse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tcreatevisualtask AnimTask_CreateSmallSolarBeamOrbs, 5\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0\n\tdelay 4\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1\n\tdelay 4\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 10, RGB(25, 31, 0)\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2\n\tdelay 4\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 65, 1\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 3\n\tdelay 4\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 4\n\tdelay 4\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 5\n\tdelay 4\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 6\n\tdelay 4\n\tcall SolarBeamUnleash1\n\tcall SolarBeamUnleash1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 10, 0, RGB(25, 31, 0)\n\tcall UnsetSolarBeamBg\n\tgoto SolarBeamEnd\n\nSolarBeamUnleash1:\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0\n\tdelay 4\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1\n\tdelay 4\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2\n\tdelay 4\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 3\n\tdelay 4\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 4\n\tdelay 4\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 5\n\tdelay 4\n\tcreatesprite gSolarBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 6\n\tdelay 4\n\treturn\n\nMove_BLIZZARD:\n\tloadspritegfx ANIM_TAG_ICE_CRYSTALS\n\tmonbg ANIM_DEF_PARTNER\n\tcreatevisualtask AnimTask_GetAttackerSide, 2\n\tjumprettrue BlizzardAgainstPlayer\n\tfadetobg BG_HIGHSPEED_OPPONENT\nBlizzardContinue:\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 5, -2304, 0, 1, -1\n\twaitbgfadein\n\twaitforvisualfinish\n\tpanse SE_M_BLIZZARD, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tcall BlizzardIceCrystals\n\tcall BlizzardIceCrystals\n\tplaysewithpan SE_M_BLIZZARD2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcall IceCrystalEffectLong\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tdelay 20\n\trestorebg\n\twaitbgfadeout\n\tsetarg 7, 0xFFFF\n\twaitbgfadein\n\tend\n\nBlizzardIceCrystals:\n\tcreatesprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -10, 0, -10, 72, 1\n\tcreatesprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0, 80, 0, 0, 1\n\tdelay 3\n\tcreatesprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -15, 0, -15, 72, 1\n\tcreatesprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, -10, 0, -10, 80, 0, 0, 1\n\tdelay 3\n\tcreatesprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -5, 0, -5, 72, 1\n\tcreatesprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, 10, 0, 10, 80, 0, 0, 1\n\tdelay 3\n\tcreatesprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -10, 0, -10, 72, 1\n\tcreatesprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, -20, 0, -20, 80, 0, 0, 1\n\tdelay 3\n\tcreatesprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -20, 0, -20, 72, 1\n\tcreatesprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, 15, 0, 15, 80, 0, 0, 1\n\tdelay 3\n\tcreatesprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -15, 0, -15, 72, 1\n\tcreatesprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, -20, 0, -20, 80, 0, 0, 1\n\tdelay 3\n\tcreatesprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -25, 0, -25, 72, 1\n\tcreatesprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, 20, 0, 20, 80, 0, 0, 1\n\tdelay 3\n\treturn\n\nBlizzardAgainstPlayer:\n\tfadetobg BG_HIGHSPEED_PLAYER\n\tgoto BlizzardContinue\n\nMove_POWDER_SNOW:\n\tloadspritegfx ANIM_TAG_ICE_CRYSTALS\n\tmonbg ANIM_DEF_PARTNER\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 1, 0, 3, RGB_BLACK\n\twaitforvisualfinish\n\tpanse SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tcall PowderSnowSnowballs\n\tcall PowderSnowSnowballs\n\tplaysewithpan SE_M_GUST2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\twaitsound\n\tcall IceCrystalEffectLong\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tdelay 20\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 1, 3, 0, RGB_BLACK\n\tend\n\nPowderSnowSnowballs:\n\tcreatesprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0, 56, 4, 4, 1\n\tdelay 3\n\tcreatesprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -10, 0, -10, 56, 4, 4, 1\n\tdelay 3\n\tcreatesprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, 10, 0, 10, 56, -4, 3, 1\n\tdelay 3\n\tcreatesprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -20, 0, -20, 56, -4, 5, 1\n\tdelay 3\n\tcreatesprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, 15, 0, 15, 56, 4, 4, 1\n\tdelay 3\n\tcreatesprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, -20, 0, -20, 56, 4, 4, 1\n\tdelay 3\n\tcreatesprite gPowderSnowSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0, 20, 0, 20, 56, 4, 4, 1\n\tdelay 3\n\treturn\n\nMove_HYDRO_PUMP:\n\tloadspritegfx ANIM_TAG_WATER_ORB\n\tloadspritegfx ANIM_TAG_WATER_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 40, 1\n\tdelay 6\n\tpanse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tcreatevisualtask AnimTask_StartSinAnimTimer, 5, 100\n\tcall HydroPumpBeams\n\tcall HydroPumpBeams\n\tcall HydroPumpBeams\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 37, 1\n\tcall HydroPumpHitSplats\n\tcall HydroPumpBeams\n\tcall HydroPumpBeams\n\tcall HydroPumpHitSplats\n\tcall HydroPumpBeams\n\tcall HydroPumpBeams\n\tcall HydroPumpHitSplats\n\tcall HydroPumpBeams\n\tcall HydroPumpBeams\n\tcall HydroPumpHitSplats\n\tcall HydroPumpBeams\n\tcall HydroPumpBeams\n\tcall HydroPumpHitSplats\n\tdelay 1\n\tdelay 1\n\tcall HydroPumpHitSplats\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nHydroPumpBeams:\n\tcreatesprite gHydroPumpOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 16\n\tcreatesprite gHydroPumpOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, -16\n\tdelay 1\n\tcreatesprite gHydroPumpOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 16\n\tcreatesprite gHydroPumpOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, -16\n\tdelay 1\n\treturn\n\nHydroPumpHitSplats\t:\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 15, ANIM_TARGET, 1\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, -15, ANIM_TARGET, 1\n\treturn\n\nMove_SIGNAL_BEAM:\n\tloadspritegfx ANIM_TAG_GLOWY_RED_ORB\n\tloadspritegfx ANIM_TAG_GLOWY_GREEN_ORB\n\tloadspritegfx ANIM_TAG_DUCK\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 25, 1\n\tdelay 6\n\tpanse SE_M_BUBBLE_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0\n\tcreatevisualtask AnimTask_StartSinAnimTimer, 5, 100\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 25, 1\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, 8, 5, RGB_RED, 8, RGB(1, 30, 0), 8\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\tcall SignalBeamOrbs\n\twaitforvisualfinish\n\tend\n\nSignalBeamOrbs:\n\tcreatesprite gSignalBeamRedOrbSpriteTemplate, ANIM_TARGET, 3, 10, 10, 0, 16\n\tcreatesprite gSignalBeamGreenOrbSpriteTemplate, ANIM_TARGET, 3, 10, 10, 0, -16\n\tdelay 1\n\treturn\n\nMove_ABSORB:\n\tloadspritegfx ANIM_TAG_ORBS\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_foes ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 4, RGB(13, 31, 12)\n\twaitforvisualfinish\n\tplaysewithpan SE_M_ABSORB, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tdelay 2\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1\n\twaitforvisualfinish\n\tdelay 3\n\tcall AbsorbEffect\n\twaitforvisualfinish\n\tdelay 15\n\tcall HealingEffect\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 4, 0, RGB(13, 31, 12)\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nAbsorbEffect:\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39\n\tdelay 4\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35\n\tdelay 4\n\treturn\n\nMove_MEGA_DRAIN:\n\tloadspritegfx ANIM_TAG_ORBS\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_foes ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 8, RGB(13, 31, 12)\n\twaitforvisualfinish\n\tplaysewithpan SE_M_ABSORB, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1\n\tdelay 2\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1\n\twaitforvisualfinish\n\tdelay 3\n\tcall MegaDrainAbsorbEffect\n\twaitforvisualfinish\n\tdelay 15\n\tcall HealingEffect\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 8, 0, RGB(13, 31, 12)\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMegaDrainAbsorbEffect:\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35\n\tdelay 4\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39\n\tdelay 4\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tdelay 4\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tdelay 4\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36\n\tdelay 4\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33\n\tdelay 4\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tdelay 4\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35\n\tdelay 4\n\treturn\n\nMove_GIGA_DRAIN:\n\tloadspritegfx ANIM_TAG_ORBS\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_foes ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 12, RGB(13, 31, 12)\n\twaitforvisualfinish\n\tplaysewithpan SE_M_ABSORB, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0\n\tdelay 2\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1\n\twaitforvisualfinish\n\tdelay 3\n\tcall GigaDrainAbsorbEffect\n\twaitforvisualfinish\n\tdelay 15\n\tcall HealingEffect\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 12, 0, RGB(13, 31, 12)\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nGigaDrainAbsorbEffect:\n\tplaysewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -40, 35\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39\n\tdelay 4\n\tplaysewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 28, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 40, 39\n\tdelay 4\n\tplaysewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -32, 26\n\tdelay 4\n\tplaysewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tdelay 4\n\tplaysewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tdelay 4\n\tplaysewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -40, 26\n\tdelay 4\n\tplaysewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 36, 33\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39\n\tdelay 4\n\tplaysewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35\n\tdelay 4\n\treturn\n\nMove_LEECH_LIFE:\n\tloadspritegfx ANIM_TAG_NEEDLE\n\tloadspritegfx ANIM_TAG_ORBS\n\tdelay 1\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_foes ANIM_TARGET\n\tsetalpha 12, 8\n\tdelay 1\n\tcreatesprite gLeechLifeNeedleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 12\n\twaitforvisualfinish\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tplaysewithpan SE_M_ABSORB, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK\n\twaitforvisualfinish\n\tcall AbsorbEffect\n\twaitforvisualfinish\n\tdelay 15\n\tcall HealingEffect\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 7, 0, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_SYNTHESIS:\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tloadspritegfx ANIM_TAG_SPARKLE_2\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 16, RGB(27, 31, 18)\n\tplaysewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER\n\tcall GrantingStarsEffect\n\twaitforvisualfinish\n\tcall HealingEffect\n\twaitforvisualfinish\n\tend\n\nMove_TOXIC:\n\tloadspritegfx ANIM_TAG_TOXIC_BUBBLE\n\tloadspritegfx ANIM_TAG_POISON_BUBBLE\n\tcall ToxicBubbles\n\tcall ToxicBubbles\n\twaitforvisualfinish\n\tdelay 15\n\tcall PoisonBubblesEffect\n\twaitforvisualfinish\n\tend\n\nToxicBubbles:\n\tcreatesprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, -24, 16, 1, 1\n\tplaysewithpan SE_M_TOXIC, SOUND_PAN_TARGET\n\tdelay 15\n\tcreatesprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, 8, 16, 1, 1\n\tplaysewithpan SE_M_TOXIC, SOUND_PAN_TARGET\n\tdelay 15\n\tcreatesprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, -8, 16, 1, 1\n\tplaysewithpan SE_M_TOXIC, SOUND_PAN_TARGET\n\tdelay 15\n\tcreatesprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, 24, 16, 1, 1\n\tplaysewithpan SE_M_TOXIC, SOUND_PAN_TARGET\n\tdelay 15\n\treturn\n\nMove_SLUDGE:\n\tloadspritegfx ANIM_TAG_POISON_BUBBLE\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER\n\tcreatesprite gSludgeProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 0\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 2, 0, 12, RGB(30, 0, 31)\n\tcall PoisonBubblesEffect\n\twaitforvisualfinish\n\tend\n\nMove_SLUDGE_BOMB:\n\tloadspritegfx ANIM_TAG_POISON_BUBBLE\n\tcall SludgeBombProjectile\n\tcall SludgeBombProjectile\n\tcall SludgeBombProjectile\n\tcall SludgeBombProjectile\n\tcall SludgeBombProjectile\n\tcall SludgeBombProjectile\n\tcall SludgeBombProjectile\n\tcall SludgeBombProjectile\n\tcall SludgeBombProjectile\n\tcall SludgeBombProjectile\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 3, 0, 15, 1\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 2, 0, 12, RGB(30, 0, 31)\n\tcreatesprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 27, 20\n\tcreatesprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -27, 44, 20\n\tcreatesprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 39, -28, 20\n\tcreatesprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -42, -42, 20\n\tplaysewithpan SE_M_DIG, SOUND_PAN_TARGET\n\tdelay 5\n\tcreatesprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 0, 40, 20\n\tcreatesprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -8, -44, 20\n\tcreatesprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -46, -28, 20\n\tcreatesprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 46, 9, 20\n\tplaysewithpan SE_M_DIG, SOUND_PAN_TARGET\n\tdelay 5\n\tcreatesprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 0, 20\n\tcreatesprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -43, -12, 20\n\tcreatesprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 16, -46, 20\n\tcreatesprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -16, 44, 20\n\tplaysewithpan SE_M_DIG, SOUND_PAN_TARGET\n\tdelay 0\n\twaitsound\n\twaitforvisualfinish\n\tcall PoisonBubblesEffect\n\twaitforvisualfinish\n\tend\n\nSludgeBombProjectile:\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER\n\tcreatesprite gSludgeProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 0\n\tdelay 3\n\treturn\n\nMove_ACID:\n\tloadspritegfx ANIM_TAG_POISON_BUBBLE\n\tmonbg ANIM_DEF_PARTNER\n\tcreatesprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, 0, 0\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER\n\tdelay 5\n\tcreatesprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, 24, 0\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER\n\tdelay 5\n\tcreatesprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, -24, 0\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER\n\tdelay 15\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_DEF_PARTNER, 2, 0, 10, 1\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_DEF_SIDE, 2, 2, 0, 12, RGB(30, 0, 31)\n\tcreatesprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -22, 0, 15, 55\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_TARGET\n\tdelay 10\n\tcreatesprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, -26, -24, 0, 15, 55\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_TARGET\n\tdelay 10\n\tcreatesprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 15, -27, 0, 15, 50\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_TARGET\n\tdelay 10\n\tcreatesprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, -15, -17, 0, 10, 45\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_TARGET\n\tdelay 10\n\tcreatesprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 27, -22, 0, 15, 50\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nMove_BONEMERANG:\n\tloadspritegfx ANIM_TAG_BONE\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_BONEMERANG, SOUND_PAN_ATTACKER\n\tcreatesprite gBonemerangSpriteTemplate, ANIM_ATTACKER, 2\n\tdelay 20\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 5, 1\n\tdelay 17\n\tplaysewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, -4\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_BONE_CLUB:\n\tloadspritegfx ANIM_TAG_BONE\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_BONEMERANG, SOUND_PAN_TARGET\n\tcreatesprite gSpinningBoneSpriteTemplate, ANIM_ATTACKER, 2, -42, -25, 0, 0, 15\n\tdelay 12\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 5, 1, RGB_BLACK, 10, RGB_BLACK, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_BONE_RUSH:\n\tloadspritegfx ANIM_TAG_BONE\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_BONEMERANG, SOUND_PAN_TARGET\n\tcreatesprite gSpinningBoneSpriteTemplate, ANIM_ATTACKER, 2, -42, -25, 0, 0, 15\n\tdelay 12\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 5, 1\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_SPIKES:\n\tloadspritegfx ANIM_TAG_SPIKES\n\tmonbg ANIM_DEF_PARTNER\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 28\n\tcreatesprite gSpikesSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 24, 30\n\tdelay 10\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 28\n\tcreatesprite gSpikesSpriteTemplate, ANIM_TARGET, 2, 20, 0, -24, 24, 30\n\tdelay 10\n\twaitplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 28\n\tcreatesprite gSpikesSpriteTemplate, ANIM_TARGET, 2, 20, 0, 24, 24, 30\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nMove_MEGAHORN:\n\tloadspritegfx ANIM_TAG_HORN_HIT_2\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tplaysewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER\n\tjumpifcontest MegahornInContest\n\tfadetobg BG_DRILL\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 5, -2304, 768, 1, -1\nMegahornContinue:\n\twaitbgfadein\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 2, 0, 15, 1\n\twaitforvisualfinish\n\tdelay 10\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 6\n\tdelay 3\n\tcreatesprite gMegahornHornSpriteTemplate, ANIM_ATTACKER, 3, -42, 25, 0, 0, 6\n\tdelay 4\n\tplaysewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, 4, 1, 4\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, -4, 1, 12, 1\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0\n\tdelay 10\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 11\n\tdelay 3\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7\n\twaitforvisualfinish\n\twaitforvisualfinish  @ Redundant\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\trestorebg\n\twaitbgfadeout\n\tsetarg 7, 0xFFFF\n\twaitbgfadein\n\tend\n\nMegahornInContest:\n\tfadetobg BG_DRILL_CONTESTS\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 5, 2304, 768, 0, -1\n\tgoto MegahornContinue\n\nMove_GUST:\n\tloadspritegfx ANIM_TAG_GUST\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_GUST, SOUND_PAN_TARGET\n\tcreatesprite gEllipticalGustSpriteTemplate, ANIM_ATTACKER, 2, 0, -16\n\tcreatevisualtask AnimTask_AnimateGustTornadoPalette, 5, 1, 70\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 1, 0, 7, 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tplaysewithpan SE_M_GUST2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_WING_ATTACK:\n\tloadspritegfx ANIM_TAG_GUST\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tloopsewithpan SE_M_WING_ATTACK, SOUND_PAN_ATTACKER, 20, 2\n\tcreatevisualtask AnimTask_TranslateMonElliptical, 2, 0, 12, 4, 1, 4\n\tcreatevisualtask AnimTask_AnimateGustTornadoPalette, 5, 1, 70\n\tcreatesprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, -25, 0, 0, 0, 20\n\tcreatesprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, 25, 0, 0, 0, 20\n\tdelay 24\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 9\n\tdelay 17\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 16, 0, ANIM_TARGET, 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, ANIM_TARGET, 1\n\tloopsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET, 5, 2\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 11\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_PECK:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_RotateMonToSideAndRestore, 2, 3, -768, ANIM_TARGET, 2\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -12, 0, ANIM_TARGET, 3\n\twaitforvisualfinish\n\tend\n\nMove_AEROBLAST:\n\tloadspritegfx ANIM_TAG_AIR_WAVE_2\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tcall SetSkyBg\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tcall AeroblastBeam\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 50, 1\n\tcall AeroblastBeam\n\tcall AeroblastBeam\n\tcall AeroblastBeam\n\tcall AeroblastBeam\n\twaitforvisualfinish\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tdelay 0\n\tcall UnsetSkyBg\n\tend\n\nAeroblastBeam:\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER\n\tcreatesprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, -12, 0, -12, 15, 0, 0\n\tcreatesprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 12, 8, 15, 0, 0\n\tdelay 3\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER\n\tcreatesprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, -12, 0, -12, 15, 1, 0\n\tcreatesprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 12, 8, 15, 1, 0\n\tdelay 3\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER\n\tcreatesprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, -12, 0, -12, 15, 2, 0\n\tcreatesprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 12, 8, 15, 2, 0\n\tdelay 3\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER\n\tcreatesprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, -12, 0, -12, 15, 3, 0\n\tcreatesprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 12, 8, 15, 3, 0\n\tdelay 3\n\treturn\n\nMove_WATER_GUN:\n\tloadspritegfx ANIM_TAG_SMALL_BUBBLES\n\tloadspritegfx ANIM_TAG_WATER_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatesprite gWaterGunProjectileSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 40, -25\n\tplaysewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 1, 0, 8, 1\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 2\n\tcreatesprite gWaterGunDropletSpriteTemplate, ANIM_ATTACKER, 2, 0, -15, 0, 15, 55\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\tdelay 10\n\tcreatesprite gWaterGunDropletSpriteTemplate, ANIM_ATTACKER, 2, 15, -20, 0, 15, 50\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\tdelay 10\n\tcreatesprite gWaterGunDropletSpriteTemplate, ANIM_ATTACKER, 2, -15, -10, 0, 10, 45\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_CRABHAMMER:\n\tloadspritegfx ANIM_TAG_ICE_CRYSTALS\n\tloadspritegfx ANIM_TAG_WATER_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tdelay 1\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB(13, 21, 31), 10, RGB_BLACK, 0\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -24, 0, 0, 4\n\twaitforvisualfinish\n\tdelay 8\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 4\n\twaitforvisualfinish\n\tloopsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET, 20, 3\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 8, 1\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 20, ANIM_TARGET\n\tdelay 4\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 20, -20, 20, ANIM_TARGET\n\tdelay 4\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, -15, 15, 20, ANIM_TARGET\n\tdelay 4\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 20, ANIM_TARGET\n\tdelay 4\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, -10, -20, 20, ANIM_TARGET\n\tdelay 4\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 16, -8, 20, ANIM_TARGET\n\tdelay 4\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 5, 8, 20, ANIM_TARGET\n\tdelay 4\n\tcreatesprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, 20, ANIM_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_SURF:\n\tcreatevisualtask AnimTask_CreateSurfWave, 2, FALSE\n\tdelay 24\n\tpanse SE_M_SURF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\twaitforvisualfinish\n\tend\n\nMove_FLAMETHROWER:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1\n\tdelay 6\n\tcreatevisualtask AnimTask_StartSinAnimTimer, 5, 100\n\tpanse SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tcall FlamethrowerCreateFlames\n\tcall FlamethrowerCreateFlames\n\tcall FlamethrowerCreateFlames\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 43, 1\n\tcall FlamethrowerCreateFlames\n\tcall FlamethrowerCreateFlames\n\tcall FlamethrowerCreateFlames\n\tcall FlamethrowerCreateFlames\n\tcall FlamethrowerCreateFlames\n\tcall FlamethrowerCreateFlames\n\tcall FlamethrowerCreateFlames\n\tcall FlamethrowerCreateFlames\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nFlamethrowerCreateFlames:\n\tcreatesprite gFlamethrowerFlameSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 16\n\tdelay 2\n\tcreatesprite gFlamethrowerFlameSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 16\n\tdelay 2\n\treturn\n\n@ Also used by Sandstorm weather\nMove_SANDSTORM:\n\tloadspritegfx ANIM_TAG_FLYING_DIRT\n\tplaysewithpan SE_M_SANDSTORM, 0\n\tcreatevisualtask AnimTask_LoadSandstormBackground, 5, FALSE\n\tdelay 16\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 10, 2304, 96, 0\n\tdelay 10\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 90, 2048, 96, 0\n\tdelay 10\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 50, 2560, 96, 0\n\tdelay 10\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 20, 2304, 96, 0\n\tdelay 10\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 70, 1984, 96, 0\n\tdelay 10\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0, 2816, 96, 0\n\tdelay 10\n\tcreatesprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 60, 2560, 96, 0\n\tend\n\nMove_WHIRLPOOL:\n\tloadspritegfx ANIM_TAG_WATER_ORB\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tdelay 0\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 7, RGB(0, 13, 23)\n\tplaysewithpan SE_M_WHIRLPOOL, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 50, 1\n\tcall WhirlpoolEffect\n\tcall WhirlpoolEffect\n\tcall WhirlpoolEffect\n\tdelay 12\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 7, 0, RGB(0, 13, 23)\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nWhirlpoolEffect:\n\tcreatesprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0, 28, 384, 50, 8, 50, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0, 32, 240, 40, 11, -46, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0, 33, 416, 40, 4, 42, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0, 31, 288, 45, 6, -42, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0, 28, 448, 45, 11, 46, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0, 33, 464, 50, 10, -50, ANIM_TARGET\n\tdelay 2\n\treturn\n\nMove_FLY:\n\tloadspritegfx ANIM_TAG_ROUND_SHADOW\n\tloadspritegfx ANIM_TAG_IMPACT\n\tchoosetwoturnanim FlySetUp, FlyUnleash\n\nFlyEnd:\n\twaitforvisualfinish\n\tend\n\nFlySetUp:\n\tplaysewithpan SE_M_FLY, SOUND_PAN_ATTACKER\n\tcreatesprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336\n\tgoto FlyEnd\n\nFlyUnleash:\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tcreatesprite gFlyBallAttackSpriteTemplate, ANIM_ATTACKER, 2, 20\n\tdelay 20\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tgoto FlyEnd\n\nMove_BOUNCE:\n\tloadspritegfx ANIM_TAG_ROUND_SHADOW\n\tloadspritegfx ANIM_TAG_IMPACT\n\tchoosetwoturnanim BounceSetUp, BounceUnleash\nBounceEnd:\n\tend\n\nBounceSetUp:\n\tplaysewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER\n\tcreatesprite gBounceBallShrinkSpriteTemplate, ANIM_ATTACKER, 2, 0, 0\n\tgoto BounceEnd\n\nBounceUnleash:\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tcreatesprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3\n\tdelay 7\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tgoto BounceEnd\n\nMove_KARATE_CHOP:\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET\n\tcreatesprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, 0, 0, 10, 1, 3, 0\n\twaitforvisualfinish\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_CROSS_CHOP:\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_CROSS_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET\n\tcreatesprite gCrossChopHandSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0\n\tcreatesprite gCrossChopHandSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1\n\tdelay 40\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_WHITE, 10, RGB_BLACK, 10\n\tcreatesprite gCrossImpactSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 20\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 9, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_JUMP_KICK:\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4\n\tdelay 3\n\tcreatesprite gJumpKickSpriteTemplate, ANIM_ATTACKER, 2, -16, 8, 0, 0, 10, ANIM_TARGET, 1, 1\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 0, 0, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 7, 1\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_HI_JUMP_KICK:\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 0, 0, 8\n\twaitforvisualfinish\n\tdelay 10\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 3\n\tdelay 2\n\tcreatesprite gJumpKickSpriteTemplate, ANIM_ATTACKER, 2, -16, 8, 0, 0, 10, ANIM_TARGET, 1, 1\n\tplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3\n\tdelay 3\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 11, 1\n\twaitforvisualfinish\n\tdelay 5\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_DOUBLE_KICK:\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatesprite gFistFootRandomPosSpriteTemplate, ANIM_ATTACKER, 3, 1, 20, 1\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\twaitforvisualfinish  @ Redundant\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_TRIPLE_KICK:\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tjumpifmoveturn 0, TripleKickLeft\n\tjumpifmoveturn 1, TripleKickRight\n\tgoto TripleKickCenter\n\nTripleKickContinue:\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nTripleKickLeft:\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 4, -16, -8, 20, 1, 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -16, -16, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1\n\tgoto TripleKickContinue\n\nTripleKickRight:\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 8, 8, 20, 1, 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1\n\tgoto TripleKickContinue\n\nTripleKickCenter:\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 20, 1, 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, -8, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1\n\tgoto TripleKickContinue\n\nMove_DYNAMIC_PUNCH:\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_EXPLOSION\n\tloadspritegfx ANIM_TAG_EXPLOSION_6\n\tdelay 1\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 20, 1, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 7, 1\n\tdelay 1\n\twaitsound\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 5, 0, 28, 1\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 1, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_COUNTER:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 4\n\tplaysewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4\n\tdelay 4\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -15, 18, ANIM_TARGET, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tdelay 1\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 25, 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -15, 18, 8, 1, 0\n\tdelay 3\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, -4, ANIM_TARGET, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tdelay 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 0, -4, 8, 1, 0\n\tdelay 3\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 15, 9, ANIM_TARGET, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tdelay 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 15, 9, 8, 1, 0\n\tdelay 5\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_VITAL_THROW:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 1, 2\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4\n\tdelay 2\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tdelay 1\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -24, 0, 0, 4\n\twaitforvisualfinish\n\tdelay 3\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7\n\tdelay 11\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 10\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_ROCK_SMASH:\n\tloadspritegfx ANIM_TAG_ROCKS\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tdelay 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1\n\tcreatesprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 8, 1, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1\n\twaitforvisualfinish\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tcreatesprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 20, 24, 14, 2\n\tcreatesprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 5, 0, -20, 24, 14, 1\n\tcreatesprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 5, 20, -24, 14, 2\n\tcreatesprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, -5, 0, -20, -24, 14, 2\n\tcreatesprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, -5, 30, 18, 8, 2\n\tcreatesprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 30, -18, 8, 2\n\tcreatesprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -30, 18, 8, 2\n\tcreatesprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -30, -18, 8, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 7, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_SUBMISSION:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 10\n\twaitplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 20\n\twaitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 30\n\twaitplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 40\n\twaitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 50\n\twaitplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 60\n\twaitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 70\n\twaitplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 80\n\twaitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 90\n\tcreatevisualtask AnimTask_TranslateMonElliptical, 2, 0, -18, 6, 6, 4\n\tcreatevisualtask AnimTask_TranslateMonElliptical, 2, 1, 18, 6, 6, 4\n\tcall SubmissionHit\n\tcall SubmissionHit\n\tcall SubmissionHit\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nSubmissionHit:\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, -12, ANIM_TARGET, 1\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -12, 8, ANIM_TARGET, 1\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 12, 0, ANIM_TARGET, 1\n\tdelay 8\n\treturn\n\n@ Also used by Sunny weather\nMove_SUNNY_DAY:\n\tloadspritegfx ANIM_TAG_SUNLIGHT\n\tmonbg ANIM_ATK_PARTNER\n\tsetalpha 13, 3\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 1, 0, 6, RGB_WHITE\n\twaitforvisualfinish\n\tpanse_adjustnone SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0\n\tcall SunnyDayLightRay\n\tcall SunnyDayLightRay\n\tcall SunnyDayLightRay\n\tcall SunnyDayLightRay\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 1, 6, 0, RGB_WHITE\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tend\n\nSunnyDayLightRay:\n\tcreatesprite gSunlightRaySpriteTemplate, ANIM_ATTACKER, 40\n\tdelay 6\n\treturn\n\nMove_COTTON_SPORE:\n\tloadspritegfx ANIM_TAG_SPORE\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tloopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 18, 10\n\tcall CreateCottonSpores\n\tcall CreateCottonSpores\n\tcall CreateCottonSpores\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nCreateCottonSpores:\n\tcreatesprite gSporeParticleSpriteTemplate, ANIM_ATTACKER, 2, 0, -20, 85, 80, 0\n\tdelay 12\n\tcreatesprite gSporeParticleSpriteTemplate, ANIM_ATTACKER, 2, 0, -10, 170, 80, 0\n\tdelay 12\n\tcreatesprite gSporeParticleSpriteTemplate, ANIM_ATTACKER, 2, 0, -15, 0, 80, 0\n\tdelay 12\n\treturn\n\nMove_SPORE:\n\tloadspritegfx ANIM_TAG_SPORE\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_SporeDoubleBattle, 2\n\tloopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 16, 11\n\tcall CreateSpore\n\tcall CreateSpore\n\tcall CreateSpore\n\twaitforvisualfinish\n\tdelay 1\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nCreateSpore:\n\tcreatesprite gSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -20, 85, 80, 1\n\tdelay 12\n\tcreatesprite gSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -10, 170, 80, 1\n\tdelay 12\n\tcreatesprite gSporeParticleSpriteTemplate, ANIM_TARGET, 2, 0, -15, 0, 80, 1\n\tdelay 12\n\treturn\n\nMove_PETAL_DANCE:\n\tloadspritegfx ANIM_TAG_FLOWER\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 6, 3\n\tcreatesprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 8, 140\n\tcreatesprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 16, -24, 8, 100\n\tcreatesprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -16, -24, 8, 100\n\tdelay 15\n\tcreatesprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 8, 140\n\tcreatesprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 32, -24, 8, 100\n\tcreatesprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -32, -24, 8, 100\n\tdelay 15\n\tcreatesprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 8, 140\n\tcreatesprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 24, -24, 8, 100\n\tcreatesprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -24, -24, 8, 100\n\tdelay 30\n\tcreatesprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 16, -24, 0, 100\n\tcreatesprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -16, -24, 0, 100\n\tdelay 30\n\tcreatesprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 20, -16, 14, 80\n\tcreatesprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, -20, -14, 16, 80\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 5\n\tdelay 3\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 6, 0, 8, 1\n\twaitforvisualfinish\n\tdelay 8\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_RAZOR_LEAF:\n\tloadspritegfx ANIM_TAG_LEAF\n\tloadspritegfx ANIM_TAG_RAZOR_LEAF\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tdelay 1\n\tloopsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER, 10, 5\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -2, 10\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -1, -1, 15\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -4, -4, 7\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 3, -3, 11\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -1, -6, 8\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 2, -1, 12\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -4, 13\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 4, -5, 7\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 2, -6, 11\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -5, 8\n\tdelay 60\n\tplaysewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER\n\tcreatesprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, 20, 1\n\tcreatesprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 22, -20, 1\n\tdelay 20\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 8, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_NATURE_POWER:\n\t@ No actual animation, uses the animation of a move from gNaturePowerMoves instead\n\nMove_ANCIENT_POWER:\n\tloadspritegfx ANIM_TAG_ROCKS\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatesprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, 10, 1\n\tcreatesprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 20, 32, -48, 50, 2\n\tcreatesprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, -38, 25, 5\n\tcreatesprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 32, 32, -28, 40, 3\n\tcreatesprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, -20, 32, -48, 50, 2\n\tcreatesprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 20, 32, -28, 60, 1\n\tcreatesprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, -28, 30, 4\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 30, 1\n\tplaysewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER\n\tdelay 10\n\tcreatesprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 15, 32, -48, 25, 5\n\tcreatesprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, -10, 32, -42, 30, 4\n\tdelay 10\n\tcreatesprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, -42, 25, 5\n\tcreatesprite gAncientPowerRockSpriteTemplate, ANIM_ATTACKER, 2, -25, 32, -48, 30, 4\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 0, 0, 4\n\tdelay 3\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_OCTAZOOKA:\n\tloadspritegfx ANIM_TAG_GRAY_SMOKE\n\tloadspritegfx ANIM_TAG_BLACK_BALL\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_ATTACKER\n\tcreatesprite gOctazookaBallSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 20, 0\n\twaitforvisualfinish\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, 8, 8, 1, 0\n\tdelay 2\n\tcreatesprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, -8, -8, 1, 0\n\tdelay 2\n\tcreatesprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, 8, -8, 1, 0\n\tdelay 2\n\tcreatesprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, -8, 8, 1, 0\n\twaitforvisualfinish\n\tend\n\nMove_MIST:\n\tloadspritegfx ANIM_TAG_MIST_CLOUD\n\tmonbg ANIM_ATK_PARTNER\n\tsetalpha 12, 8\n\tloopsewithpan SE_M_MIST, SOUND_PAN_ATTACKER, 20, 15\n\tcall MistCloud\n\tcall MistCloud\n\tcall MistCloud\n\tcall MistCloud\n\tcall MistCloud\n\tcall MistCloud\n\tcall MistCloud\n\tdelay 32\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATK_SIDE, 8, 2, 0, 14, RGB_WHITE\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tend\n\nMistCloud:\n\tcreatesprite gMistCloudSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 48, 240, 0, 1\n\tdelay 7\n\treturn\n\nMove_HAZE:\n\twaitforvisualfinish\n\tplaysewithpan SE_M_HAZE, 0\n\tcreatevisualtask AnimTask_HazeScrollingFog, 5\n\tdelay 30\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 2, 0, 16, RGB_BLACK\n\tdelay 90\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 1, 16, 0, RGB_BLACK\n\tend\n\nMove_FIRE_PUNCH:\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB_RED\n\tcreatesprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 0\n\tcreatesprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 64\n\tcreatesprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 128\n\tcreatesprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 196\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatesprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 8, 1, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1\n\tcall FireSpreadEffect\n\tdelay 4\n\tplaysewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 9, 0, RGB_RED\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nFireSpreadEffect:\n\tcreatesprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 192, 176, 40\n\tcreatesprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -192, 240, 40\n\tcreatesprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 192, -160, 40\n\tcreatesprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -192, -112, 40\n\tcreatesprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 160, 48, 40\n\tcreatesprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -224, -32, 40\n\tcreatesprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 112, -128, 40\n\treturn\n\nMove_LEER:\n\tloadspritegfx ANIM_TAG_LEER\n\tmonbg ANIM_ATTACKER\n\tsplitbgprio ANIM_ATTACKER\n\tsetalpha 8, 8\n\tplaysewithpan SE_M_LEER, SOUND_PAN_ATTACKER\n\tcreatesprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 24, -12\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 10, ANIM_ATTACKER, 1\n\twaitforvisualfinish\n\tdelay 10\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 9, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tblendoff\n\tdelay 1\n\twaitforvisualfinish\n\tend\n\nMove_DREAM_EATER:\n\tloadspritegfx ANIM_TAG_ORBS\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_foes ANIM_TARGET\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\tcall SetPsychicBackground\n\tsetalpha 8, 8\n\tplaysewithpan SE_M_MINIMIZE, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 15, 1\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -6, -6, 15, ANIM_TARGET, 1\n\twaitforvisualfinish\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 2, 25, 1\n\tcall DreamEaterAbsorb\n\twaitforvisualfinish\n\tdelay 15\n\tcall HealingEffect\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tdelay 1\n\tcall UnsetPsychicBackground\n\tend\n\nDreamEaterAbsorb:\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -40, 35\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39\n\tdelay 4\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 28, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 40, 39\n\tdelay 4\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -32, 26\n\tdelay 4\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tdelay 4\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, -15, -16, 36\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tdelay 4\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 16, 33\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -40, 26\n\tdelay 4\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -5, 15, 36, 33\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, -5, -8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, -10, 20, 20, 39\n\tdelay 4\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 5, 8, 26\n\tcreatesprite gAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 3, 5, -18, -20, 35\n\tdelay 4\n\treturn\n\nMove_POISON_GAS:\n\tloadspritegfx ANIM_TAG_PURPLE_GAS_CLOUD\n\tloadspritegfx ANIM_TAG_POISON_BUBBLE\n\tdelay 0\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_all\n\tsetalpha 12, 8\n\tdelay 0\n\tplaysewithpan SE_M_MIST, SOUND_PAN_ATTACKER\n\tcreatesprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0\n\tdelay 4\n\tplaysewithpan SE_M_MIST, SOUND_PAN_ATTACKER\n\tcreatesprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0\n\tdelay 4\n\tplaysewithpan SE_M_MIST, SOUND_PAN_ATTACKER\n\tcreatesprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0\n\tdelay 4\n\tplaysewithpan SE_M_MIST, SOUND_PAN_ATTACKER\n\tcreatesprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0\n\tdelay 4\n\tplaysewithpan SE_M_MIST, SOUND_PAN_ATTACKER\n\tcreatesprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0\n\tdelay 4\n\tplaysewithpan SE_M_MIST, SOUND_PAN_ATTACKER\n\tcreatesprite gPoisonGasCloudSpriteTemplate, ANIM_TARGET, 0, 64, 0, 0, -32, -6, 4192, 1072, 0\n\tdelay 40\n\tloopsewithpan SE_M_MIST, SOUND_PAN_TARGET, 28, 6\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 6, 2, 0, 12, RGB(26, 0, 26)\n\twaitforvisualfinish\n\tblendoff\n\tclearmonbg ANIM_DEF_PARTNER\n\tdelay 0\n\tend\n\nMove_BIND:\n\tcreatevisualtask AnimTask_SwayMon, 5, 0, 6, 3328, 4, ANIM_ATTACKER\n\tgoto BindWrap\n\nBindWrap:\n\tplaysewithpan SE_M_BIND, SOUND_PAN_TARGET\n\tcall BindWrapSqueezeTarget\n\tcall BindWrapSqueezeTarget\n\twaitforvisualfinish\n\tend\n\nBindWrapSqueezeTarget:\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, 10, -5, 5, ANIM_TARGET, 0\n\tdelay 16\n\treturn\n\nMove_WRAP:\n\tcreatevisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 6, 4, 2, 4\n\tgoto BindWrap\n\nMove_PSYBEAM:\n\tloadspritegfx ANIM_TAG_GOLD_RING\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\tcall SetPsychicBackground\n\tcreatesoundtask SoundTask_LoopSEAdjustPanning, SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 3, 4, 0, 15\n\tcall PsybeamRings\n\tcall PsybeamRings\n\tcreatevisualtask AnimTask_SwayMon, 5, 0, 6, 2048, 4, ANIM_TARGET\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(31, 18, 31)\n\tcall PsybeamRings\n\tcall PsybeamRings\n\tcall PsybeamRings\n\tcall PsybeamRings\n\tcall PsybeamRings\n\tcall PsybeamRings\n\tcall PsybeamRings\n\tcall PsybeamRings\n\tcall PsybeamRings\n\twaitforvisualfinish\n\tdelay 1\n\tcall UnsetPsychicBackground\n\tend\n\nPsybeamRings:\n\tcreatesprite gGoldRingSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 13, 0\n\tdelay 4\n\treturn\n\nMove_HYPNOSIS:\n\tloadspritegfx ANIM_TAG_GOLD_RING\n\tcall SetPsychicBackground\n\tcall HypnosisRings\n\tcall HypnosisRings\n\tcall HypnosisRings\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(31, 18, 31)\n\twaitforvisualfinish\n\tdelay 1\n\tcall UnsetPsychicBackground\n\tend\n\nHypnosisRings:\n\tplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER\n\tcreatesprite gGoldRingSpriteTemplate, ANIM_TARGET, 2, 0, 8, 0, 8, 27, 0\n\tcreatesprite gGoldRingSpriteTemplate, ANIM_TARGET, 2, 16, -8, 0, -8, 27, 0\n\tdelay 6\n\treturn\n\nMove_PSYWAVE:\n\tloadspritegfx ANIM_TAG_BLUE_RING\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\tcall SetPsychicBackground\n\tcreatevisualtask AnimTask_StartSinAnimTimer, 5, 100\n\tcreatesoundtask SoundTask_LoopSEAdjustPanning, SE_M_TELEPORT, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 9, 0, 10\n\tcall PsywaveRings\n\tcall PsywaveRings\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 4, 0, 12, RGB(31, 18, 31)\n\tcall PsywaveRings\n\tcall PsywaveRings\n\tcall PsywaveRings\n\tcall PsywaveRings\n\twaitforvisualfinish\n\tdelay 1\n\tcall UnsetPsychicBackground\n\tend\n\nPsywaveRings:\n\tcreatesprite gPsywaveRingSpriteTemplate, ANIM_TARGET, 3, 10, 10, 0, 16\n\tdelay 4\n\tcreatesprite gPsywaveRingSpriteTemplate, ANIM_TARGET, 3, 10, 10, 0, 16\n\tdelay 4\n\treturn\n\nMove_ZAP_CANNON:\n\tloadspritegfx ANIM_TAG_BLACK_BALL_2\n\tloadspritegfx ANIM_TAG_SPARK_2\n\tplaysewithpan SE_M_THUNDER_WAVE, SOUND_PAN_ATTACKER\n\tcreatesprite gZapCannonBallSpriteTemplate, ANIM_TARGET, 3, 10, 0, 0, 0, 30, 0\n\tcreatesprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 0, 40, 0\n\tcreatesprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 64, 40, 1\n\tcreatesprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 128, 40, 0\n\tcreatesprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 192, 40, 2\n\tcreatesprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 8, 30, 32, 40, 0\n\tcreatesprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 8, 30, 96, 40, 1\n\tcreatesprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 8, 30, 160, 40, 0\n\tcreatesprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 8, 30, 224, 40, 2\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1\n\tdelay 15\n\twaitplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 19\n\tcall ElectricityEffect\n\twaitforvisualfinish\n\tend\n\nMove_STEEL_WING:\n\tloadspritegfx ANIM_TAG_GUST\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2\n\tcreatevisualtask AnimTask_MetallicShine, 5, 0, 0, 0\n\twaitforvisualfinish\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tloopsewithpan SE_M_WING_ATTACK, SOUND_PAN_ATTACKER, 20, 2\n\tcreatevisualtask AnimTask_TranslateMonElliptical, 2, 0, 12, 4, 1, 4\n\tcreatevisualtask AnimTask_AnimateGustTornadoPalette, 5, 1, 70\n\tcreatesprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, -25, 0, 0, 0, 20\n\tcreatesprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, 25, 0, 0, 0, 20\n\tdelay 24\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 9\n\tdelay 17\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 16, 0, ANIM_TARGET, 1\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, ANIM_TARGET, 1\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 11\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_IRON_TAIL:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2\n\tcreatevisualtask AnimTask_MetallicShine, 5, 1, 0, 0\n\twaitforvisualfinish\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4\n\tdelay 6\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, 1\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\twaitforvisualfinish\n\tend\n\nMove_POISON_TAIL:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_POISON_BUBBLE\n\tloopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2\n\tcreatevisualtask AnimTask_MetallicShine, 5, 1, 1, RGB(24, 6, 23)\n\twaitforvisualfinish\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4\n\tdelay 6\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, 1\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tcall PoisonBubblesEffect\n\twaitforvisualfinish\n\tend\n\nMove_METAL_CLAW:\n\tloadspritegfx ANIM_TAG_CLAW_SLASH\n\tloopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2\n\tcreatevisualtask AnimTask_MetallicShine, 5, 0, 0, 0\n\twaitforvisualfinish\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4\n\tdelay 2\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\tcreatesprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0\n\tcreatesprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0\n\tcreatesprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, -4, 1, 10, 3, 1\n\tdelay 8\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4\n\tdelay 2\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\tcreatesprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, -10, 1\n\tcreatesprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, 10, 1\n\tcreatesprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, -4, 1, 10, 3, 1\n\twaitforvisualfinish\n\tend\n\nMove_NIGHT_SHADE:\n\tmonbg ANIM_ATTACKER\n\tsplitbgprio ANIM_ATTACKER\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\tfadetobg BG_GHOST\n\twaitbgfadein\n\tdelay 10\n\tplaysewithpan SE_M_LEER, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_NightShadeClone, 5, 85\n\tdelay 70\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 0, 2, 0, 13, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tdelay 1\n\trestorebg\n\twaitbgfadein\n\tend\n\nMove_EGG_BOMB:\n\tloadspritegfx ANIM_TAG_EXPLOSION\n\tloadspritegfx ANIM_TAG_LARGE_FRESH_EGG\n\tplaysewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\tcreatesprite gEggThrowSpriteTemplate, ANIM_TARGET, 2, 10, 0, 0, 0, 25, -32\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 16, 1\n\tcreatesprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 1, 0\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tdelay 3\n\tcreatesprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -16, -15, 1, 0\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tdelay 3\n\tcreatesprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 16, -5, 1, 0\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tdelay 3\n\tcreatesprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -12, 18, 1, 0\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tdelay 3\n\tcreatesprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 1, 0\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tdelay 3\n\twaitforvisualfinish\n\tend\n\nMove_SHADOW_BALL:\n\tloadspritegfx ANIM_TAG_SHADOW_BALL\n\tfadetobg BG_GHOST\n\twaitbgfadein\n\tdelay 15\n\tcreatesoundtask SoundTask_LoopSEAdjustPanning, SE_M_MIST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 5, 5, 0, 5\n\tcreatesprite gShadowBallSpriteTemplate, ANIM_TARGET, 2, 16, 16, 8\n\twaitforvisualfinish\n\tplaysewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 8, 1\n\twaitforvisualfinish\n\trestorebg\n\twaitbgfadein\n\tend\n\nMove_LICK:\n\tloadspritegfx ANIM_TAG_LICK\n\tdelay 15\n\tplaysewithpan SE_M_LICK, SOUND_PAN_TARGET\n\tcreatesprite gLickSpriteTemplate, ANIM_TARGET, 2, 0, 0\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 16, 1\n\twaitforvisualfinish\n\tend\n\nMove_FOCUS_ENERGY:\n\tloadspritegfx ANIM_TAG_FOCUS_ENERGY\n\tplaysewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER\n\tcall EndureEffect\n\tdelay 8\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_WHITE\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1\n\tcall EndureEffect\n\tdelay 8\n\tcall EndureEffect\n\twaitforvisualfinish\n\tend\n\nMove_BIDE:\n\tchoosetwoturnanim BideSetUp, BideUnleash\n\tend\n\nBideSetUp:\n\tloopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER, 9, 2\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1\n\twaitforvisualfinish\n\tend\n\nBideUnleash:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tloopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER, 9, 2\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 11, RGB_RED\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1\n\twaitforvisualfinish\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 4\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 12, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 16, 1\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, 18, -8, ANIM_TARGET, 1\n\tdelay 5\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, -18, 8, ANIM_TARGET, 1\n\tdelay 5\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 1, -8, -5, ANIM_TARGET, 1\n\twaitforvisualfinish\n\tdelay 5\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 11, 0, RGB_RED\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_STRING_SHOT:\n\tloadspritegfx ANIM_TAG_STRING\n\tloadspritegfx ANIM_TAG_WEB_THREAD\n\tmonbg ANIM_DEF_PARTNER\n\tdelay 0\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 0, 9, RGB_BLACK\n\twaitforvisualfinish\n\tloopsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER, 9, 6\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\tcall StringShotThread\n\twaitforvisualfinish\n\tplaysewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET\n\tcreatesprite gStringWrapSpriteTemplate, ANIM_TARGET, 2, 0, 10\n\tdelay 4\n\tcreatesprite gStringWrapSpriteTemplate, ANIM_TARGET, 2, 0, -2\n\tdelay 4\n\tcreatesprite gStringWrapSpriteTemplate, ANIM_TARGET, 2, 0, 22\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tdelay 1\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 9, 0, RGB_BLACK\n\tend\n\nStringShotThread:\n\tcreatesprite gWebThreadSpriteTemplate, ANIM_TARGET, 2, 20, 0, 512, 20, 1\n\tdelay 1\n\treturn\n\nMove_SPIDER_WEB:\n\tloadspritegfx ANIM_TAG_SPIDER_WEB\n\tloadspritegfx ANIM_TAG_WEB_THREAD\n\tmonbg ANIM_DEF_PARTNER\n\tdelay 0\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 0, 9, RGB_BLACK\n\twaitforvisualfinish\n\tsplitbgprio ANIM_TARGET\n\tloopsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER, 9, 6\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\tcall SpiderWebThread\n\twaitforvisualfinish\n\tplaysewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET\n\tcreatesprite gSpiderWebSpriteTemplate, ANIM_ATTACKER, 2\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tdelay 1\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 9, 0, RGB_BLACK\n\tend\n\nSpiderWebThread:\n\tcreatesprite gWebThreadSpriteTemplate, ANIM_TARGET, 2, 20, 0, 512, 20, 0\n\tdelay 1\n\treturn\n\nMove_RAZOR_WIND:\n\tchoosetwoturnanim RazorWindSetUp, RazorWindUnleash\n\nRazorWindEnd:\n\twaitforvisualfinish\n\tend\n\nRazorWindSetUp:\n\tloadspritegfx ANIM_TAG_GUST\n\tplaysewithpan SE_M_GUST, SOUND_PAN_ATTACKER\n\tcreatesprite gRazorWindTornadoSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 16, 16, 0, 7, 40\n\tcreatesprite gRazorWindTornadoSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 16, 16, 85, 7, 40\n\tcreatesprite gRazorWindTornadoSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 16, 16, 170, 7, 40\n\twaitforvisualfinish\n\tplaysewithpan SE_M_GUST2, SOUND_PAN_ATTACKER\n\tgoto RazorWindEnd\n\nRazorWindUnleash:\n\tloadspritegfx ANIM_TAG_AIR_WAVE_2\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER\n\tcreatesprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, 8, 0, 0, 22, 2, 1\n\tdelay 2\n\tplaysewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER\n\tcreatesprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, -8, 16, 14, 22, 1, 1\n\tdelay 2\n\tplaysewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER\n\tcreatesprite gAirWaveCrescentSpriteTemplate, ANIM_ATTACKER, 2, 14, 12, -16, -14, 22, 0, 1\n\tdelay 17\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 10, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 10, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tgoto RazorWindEnd\n\nMove_DISABLE:\n\tloadspritegfx ANIM_TAG_SPARKLE_4\n\tmonbg ANIM_TARGET\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 8, 8\n\tplaysewithpan SE_M_DETECT, SOUND_PAN_ATTACKER\n\tcreatesprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 13, 24, -16\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_GrowAndGrayscale, 5\n\tloopsewithpan SE_M_BIND, SOUND_PAN_TARGET, 15, 4\n\twaitforvisualfinish\n\tdelay 1\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_RECOVER:\n\tloadspritegfx ANIM_TAG_ORBS\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tmonbg ANIM_ATK_PARTNER\n\tsetalpha 12, 8\n\tloopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 13, 3\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 6, 0, 11, RGB(31, 31, 11)\n\tcall RecoverAbsorbEffect\n\tcall RecoverAbsorbEffect\n\tcall RecoverAbsorbEffect\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tdelay 1\n\tcall HealingEffect\n\twaitforvisualfinish\n\tend\n\nRecoverAbsorbEffect:\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 40, -10, 13\n\tdelay 3\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -35, -10, 13\n\tdelay 3\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 15, -40, 13\n\tdelay 3\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -10, -32, 13\n\tdelay 3\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 25, -20, 13\n\tdelay 3\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -40, -20, 13\n\tdelay 3\n\tcreatesprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 5, -40, 13\n\tdelay 3\n\treturn\n\nMove_MIMIC:\n\tloadspritegfx ANIM_TAG_ORBS\n\tmonbg_static ANIM_DEF_PARTNER\n\tsetalpha 11, 5\n\tpanse SE_M_MINIMIZE, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, -3, 0\n\tcreatevisualtask AnimTask_ShrinkTargetCopy, 5, 128, 24\n\tdelay 15\n\tcreatesprite gMimicOrbSpriteTemplate, ANIM_TARGET, 2, -12, 24\n\tdelay 10\n\tsetarg 7, 0xFFFF\n\twaitforvisualfinish\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 11, RGB_WHITE\n\twaitforvisualfinish\n\tclearmonbg_static ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_CONSTRICT:\n\tloadspritegfx ANIM_TAG_TENDRILS\n\tloopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 6, 4\n\tcreatesprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 4, 0, 16, 0, 2\n\tdelay 7\n\tcreatesprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0, 0, 0, 2\n\tcreatesprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 2, 0, 8, 1, 2\n\tdelay 7\n\tcreatesprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0, -8, 1, 2\n\tdelay 8\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1\n\tdelay 20\n\tplaysewithpan SE_M_BIND, SOUND_PAN_TARGET\n\tsetarg 7, 0xFFFF\n\twaitforvisualfinish\n\tend\n\nMove_CURSE:\n\tchoosetwoturnanim CurseGhost, CurseStats\n\nCurseGhost:\n\tloadspritegfx ANIM_TAG_NAIL\n\tloadspritegfx ANIM_TAG_GHOSTLY_SPIRIT\n\tmonbg ANIM_ATK_PARTNER\n\tcreatevisualtask AnimTask_CurseStretchingBlackBg, 5\n\twaitforvisualfinish\n\tdelay 20\n\tcreatesprite gCurseNailSpriteTemplate, ANIM_ATTACKER, 2\n\tdelay 60\n\tcall CurseGhostShakeFromNail\n\tdelay 41\n\tcall CurseGhostShakeFromNail\n\tdelay 41\n\tcall CurseGhostShakeFromNail\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tdelay 1\n\tmonbg ANIM_DEF_PARTNER\n\tplaysewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET\n\tcreatesprite gCurseGhostSpriteTemplate, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 14, 1\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 16, 0, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nCurseGhostShakeFromNail:\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 4, 0, 10, 0\n\tplaysewithpan SE_M_BIND, SOUND_PAN_ATTACKER\n\treturn\n\nCurseStats:\n\tcreatevisualtask AnimTask_SwayMon, 5, 0, 10, 1536, 3, ANIM_ATTACKER\n\twaitforvisualfinish\n\tdelay 10\n\tcall CurseStats1\n\twaitforvisualfinish\n\tend\n\nCurseStats1:\n\tplaysewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_DrawFallingWhiteLinesOnAttacker, 5\n\tcreatevisualtask AnimTask_BlendColorCycle, 5, F_PAL_ATTACKER, 4, 2, 0, 10, RGB_RED\n\treturn\n\nMove_SOFT_BOILED:\n\tloadspritegfx ANIM_TAG_BREAKING_EGG\n\tloadspritegfx ANIM_TAG_THIN_RING\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tmonbg ANIM_ATK_PARTNER\n\tplaysewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 2, 6, 1\n\tcreatesprite gSoftBoiledEggSpriteTemplate, ANIM_ATTACKER, 4, 0, 16, 0\n\tcreatesprite gSoftBoiledEggSpriteTemplate, ANIM_ATTACKER, 4, 0, 16, 1\n\tdelay 120\n\tdelay 7\n\tplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_ATTACKER\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 10, 0, RGB(12, 24, 30)\n\tcreatesprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 31, 16, 0, 1\n\tdelay 8\n\tcreatesprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 31, 16, 0, 1\n\tdelay 60\n\tsetarg 7, 0xFFFF\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tcall HealingEffect2\n\tend\n\nMove_HEAL_BELL:\n\tloadspritegfx ANIM_TAG_BELL\n\tloadspritegfx ANIM_TAG_MUSIC_NOTES_2\n\tloadspritegfx ANIM_TAG_THIN_RING\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATK_SIDE, 0, 0, 10, RGB_WHITE\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_LoadMusicNotesPals, 5\n\tcreatesprite gBellSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 0, 1\n\tdelay 12\n\tcreatesprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 48, -18, 35, 0, 0\n\tcreatesprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, -48, 20, 30, 1, 1\n\tcreatesprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, -38, -29, 30, 2, 2\n\tcreatesprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 36, 18, 30, 3, 3\n\tcall HealBellRing\n\tdelay 33\n\tcreatesprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 19, 26, 35, 4, 4\n\tcreatesprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, -34, -12, 30, 5, 5\n\tcreatesprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 41, -20, 34, 6, 2\n\tcreatesprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, -15, 26, 32, 7, 0\n\tcall HealBellRing\n\tdelay 33\n\tcreatesprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, -48, 18, 31, 0, 2\n\tcreatesprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 48, -20, 30, 2, 5\n\tcreatesprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 38, 29, 33, 4, 3\n\tcreatesprite gHealBellMusicNoteSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, -36, -18, 30, 6, 1\n\tcall HealBellRing\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_FreeMusicNotesPals, 5\n\twaitforvisualfinish\n\tunloadspritegfx ANIM_TAG_BELL\n\tunloadspritegfx ANIM_TAG_MUSIC_NOTES_2\n\tunloadspritegfx ANIM_TAG_THIN_RING\n\tloadspritegfx ANIM_TAG_SPARKLE_2\n\tplaysewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER\n\tcreatesprite gSparklingStarsSpriteTemplate, ANIM_ATTACKER, 16, -15, 0, 0, 0, 32, 60, 1\n\tdelay 8\n\tcreatesprite gSparklingStarsSpriteTemplate, ANIM_ATTACKER, 16, 12, -5, 0, 0, 32, 60, 1\n\twaitforvisualfinish\n\tunloadspritegfx ANIM_TAG_SPARKLE_2\n\tloadspritegfx ANIM_TAG_THIN_RING\n\tplaysewithpan SE_SHINY, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_BlendBattleAnimPalExclude, 10, 4, 3, 10, 0, RGB(12, 24, 30)\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATK_SIDE, 3, 10, 0, RGB_WHITE\n\tcreatesprite gBlendThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 16, 0, 0, 0, 1\n\tend\n\nHealBellRing:\n\tcreatevisualtask AnimTask_BlendBattleAnimPalExclude, 10, 4, 3, 8, 0, RGB(12, 24, 30)\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATK_SIDE, 3, 2, 10, RGB_WHITE\n\tcreatesprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 40, 0, -24, 0, 1\n\tplaysewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER\n\treturn\n\nMove_FAKE_OUT:\n\tplaysewithpan SE_M_FLATTER, 0\n\tcreatevisualtask AnimTask_FakeOut, 5\n\twaitforvisualfinish\n\tplaysewithpan SE_M_SKETCH, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1\n\tcreatevisualtask AnimTask_StretchTargetUp, 3\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 16, 0, RGB_WHITE\n\tend\n\nMove_SCARY_FACE:\n\tloadspritegfx ANIM_TAG_EYE_SPARKLE\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_DEF_PARTNER, 3, 0, 16, RGB_BLACK\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tdelay 10\n\tplaysewithpan SE_M_LEER, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ScaryFace, 5\n\tdelay 13\n\tcreatesprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, -16, -8\n\tcreatesprite gEyeSparkleSpriteTemplate, ANIM_ATTACKER, 0, 16, -8\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeTargetInPattern, 3, 20, 1, FALSE\n\tplaysewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_DEF_PARTNER, 3, 16, 0, RGB_BLACK\n\twaitforvisualfinish\n\tend\n\nMove_SWEET_KISS:\n\tloadspritegfx ANIM_TAG_RED_HEART\n\tloadspritegfx ANIM_TAG_ANGEL\n\tcreatesprite gAngelSpriteTemplate, ANIM_TARGET, 2, 16, -48\n\tplaysewithpan SE_M_HEAL_BELL, SOUND_PAN_TARGET\n\tdelay 23\n\tplaysewithpan SE_M_HEAL_BELL, SOUND_PAN_TARGET\n\tdelay 23\n\tplaysewithpan SE_M_HEAL_BELL, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatesprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 160, -30\n\tplaysewithpan SE_M_ATTRACT, SOUND_PAN_TARGET\n\tcreatesprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -256, -42\n\tcreatesprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 128, -14\n\tcreatesprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 416, -38\n\tcreatesprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -128, -22\n\tcreatesprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -384, -31\n\tend\n\nMove_LOVELY_KISS:\n\tloadspritegfx ANIM_TAG_PINK_HEART\n\tloadspritegfx ANIM_TAG_DEVIL\n\tcreatesprite gDevilSpriteTemplate, ANIM_TARGET, 2, 0, -24\n\tplaysewithpan SE_M_PSYBEAM2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tplaysewithpan SE_M_ATTRACT, SOUND_PAN_TARGET\n\tcreatesprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, -256, -42\n\tcreatesprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 128, -14\n\tcreatesprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 416, -38\n\tcreatesprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, -128, -22\n\tend\n\nMove_FURY_SWIPES:\n\tloadspritegfx ANIM_TAG_SWIPE\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 5, 5\n\tdelay 4\n\tplaysewithpan SE_M_SCRATCH, SOUND_PAN_TARGET\n\tcreatesprite gFurySwipesSpriteTemplate, ANIM_TARGET, 2, 16, 0, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 5, 1\n\tdelay 10\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_TARGET, 2, 5, 5\n\tdelay 4\n\tplaysewithpan SE_M_SCRATCH, SOUND_PAN_TARGET\n\tcreatesprite gFurySwipesSpriteTemplate, ANIM_TARGET, 2, -16, 0, 0\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 7, 1\n\tend\n\nMove_INGRAIN:\n\tloadspritegfx ANIM_TAG_ROOTS\n\tloadspritegfx ANIM_TAG_ORBS\n\tcreatesprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 16, 26, -1, 2, 150\n\tplaysewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER\n\tdelay 10\n\tcreatesprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, -32, 20, 1, 1, 140\n\tplaysewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER\n\tdelay 10\n\tcreatesprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 32, 22, 1, 0, 130\n\tplaysewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER\n\tdelay 10\n\tcreatesprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, -16, 25, -1, 3, 120\n\tplaysewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER\n\tdelay 40\n\tcreatesprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, 32, 26, -1, 3, 30\n\tdelay 5\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER\n\tdelay 5\n\tcreatesprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, -48, 20, 1, 2, 30\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER\n\tdelay 5\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER\n\tdelay 5\n\tcreatesprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, 48, 26, -2, 3, 18\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER\n\tdelay 10\n\twaitforvisualfinish\n\tend\n\nMove_PRESENT:\n\tloadspritegfx ANIM_TAG_ITEM_BAG\n\tcreatevisualtask AnimTask_IsHealingMove, 2\n\tcreatesprite gPresentSpriteTemplate, ANIM_TARGET, 2, 0, -5, 10, 2, -1\n\tplaysewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\tdelay 14\n\tplaysewithpan SE_M_BUBBLE2, SOUND_PAN_ATTACKER\n\tdelay 14\n\tplaysewithpan SE_M_BUBBLE2, 0\n\tdelay 20\n\tplaysewithpan SE_M_BUBBLE2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tjumpretfalse PresentDamage\n\tjumprettrue PresentHeal\n\tend\n\nPresentDamage:\n\tloadspritegfx ANIM_TAG_EXPLOSION\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 24, -24, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -16, 16, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -24, -12, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 16, 16, 1, 1\n\tend\n\nPresentHeal:\n\tloadspritegfx ANIM_TAG_GREEN_SPARKLE\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tplaysewithpan SE_M_MORNING_SUN, SOUND_PAN_TARGET\n\tcreatesprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -16, 32, -3, 1\n\tdelay 3\n\tcreatesprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 16, 32, -3, -1\n\tdelay 3\n\tcreatesprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 32, 32, -3, 1\n\tdelay 3\n\tcreatesprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -32, 32, -3, 1\n\tdelay 3\n\tcreatesprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 0, 32, -3, 1\n\tdelay 3\n\tcreatesprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -8, 32, -3, 1\n\tdelay 3\n\tcreatesprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -8, 32, -3, 1\n\tdelay 3\n\tcreatesprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 24, 32, -3, 1\n\tdelay 3\n\tcreatesprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -24, 32, -3, 1\n\twaitforvisualfinish\n\twaitsound\n\tcall HealingEffect2\n\tend\n\nMove_BATON_PASS:\n\tloadspritegfx ANIM_TAG_POKEBALL\n\tplaysewithpan SE_M_BATON_PASS, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG | F_PAL_BATTLERS, 1, 2, 0, 11, RGB(31, 22, 30)\n\tcreatesprite gBatonPassPokeballSpriteTemplate, ANIM_ATTACKER, 2\n\tend\n\nMove_PERISH_SONG:\n\tloadspritegfx ANIM_TAG_MUSIC_NOTES_2\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 0\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 1, 1, 16\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 2, 1, 32\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 3, 2, 48\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 4, 2, 64\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 5, 0, 80\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 6, 0, 96\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 7, 1, 112\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 8, 2, 128\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 9, 0, 144\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 10, 2, 160\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 11, 0, 176\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 12, 1, 192\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 13, 3, 208\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 14, 3, 224\n\tcreatesprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 15, 0, 240\n\tcreatesprite gPerishSongMusicNote2SpriteTemplate, ANIM_ATTACKER, 4, 15, 0, 0\n\tdelay 20\n\tpanse SE_M_PERISH_SONG, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tdelay 80\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 16, RGB_BLACK\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 4, 0\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 5, 0\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 6, 0\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 7, 0\n\tdelay 100\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 16, 0, RGB_BLACK\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 4, 1\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 5, 1\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 6, 1\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 7, 1\n\twaitforvisualfinish\n\tend\n\nMove_SLEEP_TALK:\n\tloadspritegfx ANIM_TAG_LETTER_Z\n\tcreatevisualtask AnimTask_SwayMon, 5, 0, 4, 4096, 2, ANIM_ATTACKER\n\tdelay 20\n\tcreatesprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -1\n\tplaysewithpan SE_M_SNORE, SOUND_PAN_ATTACKER\n\tdelay 6\n\tcreatesprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -1\n\tdelay 6\n\tcreatesprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -1\n\tdelay 20\n\tcreatesprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -5\n\tplaysewithpan SE_M_SNORE, SOUND_PAN_ATTACKER\n\tdelay 6\n\tcreatesprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -5\n\tdelay 6\n\tcreatesprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -5\n\tdelay 20\n\tcreatesprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -3\n\tplaysewithpan SE_M_SNORE, SOUND_PAN_ATTACKER\n\tdelay 6\n\tcreatesprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -3\n\tdelay 6\n\tcreatesprite gLetterZSpriteTemplate, ANIM_TARGET, 2, 0, 20, 5, -3\n\twaitforvisualfinish\n\tend\n\nMove_HYPER_FANG:\n\tloadspritegfx ANIM_TAG_FANG_ATTACK\n\tplaysewithpan SE_M_BITE, SOUND_PAN_TARGET\n\tdelay 1\n\tdelay 2\n\tcreatevisualtask AnimTask_IsContest, 2\n\tjumprettrue HyperFangInContest\n\tcreatevisualtask AnimTask_IsTargetPlayerSide, 2\n\tjumpretfalse HyperFangOnOpponent\n\tgoto HyperFangOnPlayer\n\nHyperFangContinue:\n\twaitbgfadeout\n\tcreatesprite gFangSpriteTemplate, ANIM_TARGET, 2\n\twaitbgfadein\n\tcreatevisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 0, 10, 10, 1\n\tplaysewithpan SE_M_LEER, SOUND_PAN_TARGET\n\tdelay 20\n\trestorebg\n\twaitbgfadein\n\twaitforvisualfinish\n\tend\n\nHyperFangOnOpponent:\n\tfadetobg BG_IMPACT_OPPONENT\n\tgoto HyperFangContinue\n\nHyperFangOnPlayer:\n\tfadetobg BG_IMPACT_PLAYER\n\tgoto HyperFangContinue\n\nHyperFangInContest:\n\tfadetobg BG_IMPACT_CONTESTS\n\tgoto HyperFangContinue\n\nMove_TRI_ATTACK:\n\tloadspritegfx ANIM_TAG_TRI_ATTACK_TRIANGLE\n\tcreatesprite gTriAttackTriangleSpriteTemplate, ANIM_TARGET, 2, 16, 0\n\tplaysewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER\n\tdelay 20\n\tplaysewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER\n\tdelay 20\n\tcreatesoundtask SoundTask_LoopSEAdjustPanning, SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 5, 6, 0, 7\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 16, RGB_BLACK\n\tdelay 16\n\tloadspritegfx ANIM_TAG_FIRE\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 0\n\tplaysewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 0, 1\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, -1\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 2, 1\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 1, -1\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 1\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 1, -2\n\tdelay 1\n\tcreatesprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, 3, 1\n\tdelay 2\n\tcreatevisualtask AnimTask_ShakeTargetInPattern, 2, 20, 3, TRUE, 1\n\twaitforvisualfinish\n\tloadspritegfx ANIM_TAG_LIGHTNING\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tplaysewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16\n\tdelay 1\n\tcreatesprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16\n\tdelay 20\n\tcreatevisualtask AnimTask_ShakeTargetInPattern, 2, 20, 3, TRUE, 0\n\tdelay 2\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\twaitforvisualfinish\n\tloadspritegfx ANIM_TAG_ICE_CRYSTALS\n\tcall IceCrystalEffectShort\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK\n\twaitforvisualfinish\n\tend\n\nMove_WILL_O_WISP:\n\tloadspritegfx ANIM_TAG_WISP_FIRE\n\tloadspritegfx ANIM_TAG_WISP_ORB\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_foes ANIM_TARGET\n\tplaysewithpan SE_M_EMBER, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_EMBER, SOUND_PAN_ATTACKER, 10\n\tcreatevisualtask SoundTask_AdjustPanningVar, 2, SOUND_PAN_ATTACKER, SOUND_PAN_ATTACKER, 1, 0\n\tcreatesprite gWillOWispOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0\n\tdelay 3\n\tcreatesprite gWillOWispOrbSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1\n\tdelay 3\n\tcreatesprite gWillOWispOrbSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 2\n\tdelay 3\n\tcreatesprite gWillOWispOrbSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 3\n\tdelay 40\n\tcreatevisualtask SoundTask_AdjustPanningVar, 2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0\n\twaitforvisualfinish\n\tsplitbgprio_all\n\tplaysewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 13, 1\n\tcreatesprite gWillOWispFireSpriteTemplate, ANIM_ATTACKER, 2, 0\n\tcreatesprite gWillOWispFireSpriteTemplate, ANIM_ATTACKER, 2, 42\n\tcreatesprite gWillOWispFireSpriteTemplate, ANIM_ATTACKER, 2, 84\n\tcreatesprite gWillOWispFireSpriteTemplate, ANIM_ATTACKER, 2, 126\n\tcreatesprite gWillOWispFireSpriteTemplate, ANIM_ATTACKER, 2, 168\n\tcreatesprite gWillOWispFireSpriteTemplate, ANIM_ATTACKER, 2, 210\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nMove_ENCORE:\n\tloadspritegfx ANIM_TAG_SPOTLIGHT\n\tloadspritegfx ANIM_TAG_TAG_HAND\n\tcreatevisualtask AnimTask_CreateSpotlight, 2\n\tcreatevisualtask AnimTask_HardwarePaletteFade, 2, 248, 3, 0, 10, 0\n\twaitforvisualfinish\n\tcreatesprite gSpotlightSpriteTemplate, ANIM_TARGET, 2, 0, -8\n\tcreatesprite gClappingHandSpriteTemplate, ANIM_ATTACKER, 2, -2, 0, 0, 0, 9\n\tcreatesprite gClappingHandSpriteTemplate, ANIM_ATTACKER, 2, 2, 0, 1, 0, 9\n\tcreatesprite gClappingHand2SpriteTemplate, ANIM_ATTACKER, 3, -2, 0, 0, 0, 9\n\tcreatesprite gClappingHand2SpriteTemplate, ANIM_ATTACKER, 3, 2, 0, 1, 0, 9\n\tdelay 16\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_ENCORE2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_SwayMon, 5, 1, 8, 1536, 5, ANIM_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_HardwarePaletteFade, 2, 248, 3, 10, 0, 1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_RemoveSpotlight, 2\n\tend\n\nMove_TRICK:\n\tloadspritegfx ANIM_TAG_ITEM_BAG\n\tloadspritegfx ANIM_TAG_SPEED_DUST\n\tcreatesprite gTrickBagSpriteTemplate, ANIM_ATTACKER, 2, -40, 80\n\tcreatesprite gTrickBagSpriteTemplate, ANIM_ATTACKER, 2, -40, 208\n\tdelay 16\n\tplaysewithpan SE_M_SKETCH, 0\n\tcreatevisualtask AnimTask_StretchTargetUp, 3\n\tcreatevisualtask AnimTask_StretchAttackerUp, 3\n\tdelay 30\n\tplaysewithpan SE_M_DOUBLE_TEAM, 0\n\tdelay 24\n\tplaysewithpan SE_M_DOUBLE_TEAM, 0\n\tdelay 16\n\tplaysewithpan SE_M_DOUBLE_TEAM, 0\n\tdelay 16\n\tplaysewithpan SE_M_DOUBLE_TEAM, 0\n\tdelay 16\n\tplaysewithpan SE_M_DOUBLE_TEAM, 0\n\tdelay 16\n\tplaysewithpan SE_M_DOUBLE_TEAM, 0\n\tdelay 16\n\tplaysewithpan SE_M_ATTRACT, 0\n\tcreatevisualtask AnimTask_ShakeMon, 3, ANIM_ATTACKER, 5, 0, 7, 2\n\tcreatevisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 5, 0, 7, 2\n\twaitforvisualfinish\n\tend\n\nMove_WISH:\n\tloadspritegfx ANIM_TAG_GOLD_STARS\n\tloadspritegfx ANIM_TAG_SPARKLE_2\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 10, RGB_BLACK\n\twaitforvisualfinish\n\tpanse_adjustall SE_M_REFLECT, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, -3, 0\n\tcreatesprite gWishStarSpriteTemplate, ANIM_ATTACKER, 40\n\twaitforvisualfinish\n\tdelay 60\n\tloopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 16, 3\n\tcall GrantingStarsEffect\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 10, 0, RGB_BLACK\n\twaitforvisualfinish\n\tend\n\nMove_STOCKPILE:\n\tloadspritegfx ANIM_TAG_GRAY_ORB\n\tplaysewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 8, 1, 0, 12, RGB_WHITE\n\tcreatevisualtask AnimTask_StockpileDeformMon, 5\n\tcall StockpileAbsorb\n\tcall StockpileAbsorb\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 12, 0, RGB_WHITE\n\tend\n\nStockpileAbsorb:\n\tcreatesprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 55, 55, 13\n\tdelay 1\n\tcreatesprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -55, -55, 13\n\tdelay 1\n\tcreatesprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 55, 13\n\tdelay 1\n\tcreatesprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, -55, 13\n\tdelay 1\n\tcreatesprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 55, -34, 13\n\tdelay 1\n\tcreatesprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 55, 34, 13\n\tdelay 1\n\tcreatesprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -55, -34, 13\n\tdelay 1\n\tcreatesprite gStockpileAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, -55, 34, 13\n\tdelay 1\n\treturn\n\nMove_SPIT_UP:\n\tloadspritegfx ANIM_TAG_RED_ORB_2\n\tloadspritegfx ANIM_TAG_IMPACT\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_SpitUpDeformMon, 5\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 8, 2\n\tdelay 45\n\tplaysewithpan SE_M_SPIT_UP, SOUND_PAN_ATTACKER\n\tdelay 3\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 12\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 32, 12\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 64, 12\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 96, 12\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 128, 12\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 160, 12\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 192, 12\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 224, 12\n\tdelay 5\n\tjumpifmoveturn 2, SpitUpStrong\n\tjumpifmoveturn 3, SpitUpStrongest\nSpitUpContinue:\n\tdelay 5\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 8, 1, 0\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -12, 10, ANIM_TARGET, 1\n\tdelay 5\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tcreatesprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 12, -10, ANIM_TARGET, 1\n\twaitforvisualfinish\n\tend\n\nSpitUpStrong:\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 16\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 80\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 144\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 208\n\tgoto SpitUpContinue\n\nSpitUpStrongest:\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 16\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 48\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 80\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 112\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 144\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 176\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 208\n\tcreatesprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 240\n\tgoto SpitUpContinue\n\nMove_SWALLOW:\n\tloadspritegfx ANIM_TAG_BLUE_ORB\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_SwallowDeformMon, 5\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 8, 2\n\tdelay 38\n\tplaysewithpan SE_M_SPIT_UP, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 2, 0, 12, 1\n\tcall SwallowEffect\n\tjumpifmoveturn 2, SwallowGood\n\tjumpifmoveturn 3, SwallowBest\nSwallowContinue:\n\twaitforvisualfinish\n\tcall HealingEffect\n\tend\n\nSwallowEffect:\n\tcreatesprite gSwallowBlueOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, -8\n\tdelay 1\n\tcreatesprite gSwallowBlueOrbSpriteTemplate, ANIM_ATTACKER, 2, -24, -8\n\tdelay 1\n\tcreatesprite gSwallowBlueOrbSpriteTemplate, ANIM_ATTACKER, 2, 16, -8\n\tdelay 1\n\tcreatesprite gSwallowBlueOrbSpriteTemplate, ANIM_ATTACKER, 2, -16, -8\n\tdelay 1\n\tcreatesprite gSwallowBlueOrbSpriteTemplate, ANIM_ATTACKER, 2, 24, -8\n\tdelay 1\n\treturn\n\nSwallowGood:\n\tcall SwallowEffect\n\tgoto SwallowContinue\n\nSwallowBest:\n\tcall SwallowEffect\n\tcall SwallowEffect\n\tgoto SwallowContinue\n\nMove_TRANSFORM:\n\tmonbg ANIM_ATTACKER\n\tplaysewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER, 48\n\tcreatevisualtask AnimTask_TransformMon, 2, 0\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tend\n\nMove_MORNING_SUN:\n\tloadspritegfx ANIM_TAG_GREEN_STAR\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tcreatevisualtask AnimTask_MorningSunLightBeam, 5\n\tdelay 8\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 8, 0, 12, RGB_WHITE\n\tdelay 14\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcall MorningSunStar\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 3, 12, 0, RGB_WHITE\n\twaitforvisualfinish\n\twaitsound\n\tcall HealingEffect\n\tend\n\nMorningSunStar:\n\tcreatesprite gGreenStarSpriteTemplate, ANIM_ATTACKER, 2, 30, 640\n\tdelay 5\n\treturn\n\nMove_SWEET_SCENT:\n\tloadspritegfx ANIM_TAG_PINK_PETAL\n\tplaysewithpan SE_M_SWEET_SCENT, SOUND_PAN_ATTACKER\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 100, 0, 100\n\tdelay 25\n\tsetpan 0\n\tcall SweetScentEffect\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 55, 0\n\tsetpan SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_DEF_SIDE, 1, 5, 5, 13, RGB(31, 21, 21)\n\tcall SweetScentEffect\n\twaitforvisualfinish\n\tend\n\nSweetScentEffect:\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 70, 1, 64\n\tdelay 2\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 60, 0, 64\n\tdelay 5\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 80, 1, 64\n\tdelay 2\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 58, 0, 120\n\tdelay 2\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 100, 0, 120\n\tdelay 2\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 90, 0, 64\n\tdelay 2\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 48, 0, 64\n\tdelay 2\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 95, 1, 80\n\tdelay 2\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 100, 0, 120\n\tdelay 2\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 75, 1, 64\n\tdelay 2\n\tcreatesprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 85, 0, 120\n\tdelay 2\n\treturn\n\nMove_HYPER_BEAM:\n\tloadspritegfx ANIM_TAG_ORBS\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 0, 16, RGB_BLACK\n\twaitforvisualfinish\n\tdelay 10\n\tplaysewithpan SE_M_HYPER_BEAM, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 4, 1\n\twaitforvisualfinish\n\tdelay 30\n\tcreatesoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 15, 0, 5\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1\n\tcreatevisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB(31, 0, 0), 16, 0, 0\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 11, RGB(25, 25, 25)\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcall HyperBeamOrbs\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(25, 25, 25)\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 16, 0, RGB_BLACK\n\tend\n\nHyperBeamOrbs:\n\tcreatesprite gHyperBeamOrbSpriteTemplate, ANIM_TARGET, 2\n\tcreatesprite gHyperBeamOrbSpriteTemplate, ANIM_TARGET, 2\n\tdelay 1\n\treturn\n\nMove_FLATTER:\n\tloadspritegfx ANIM_TAG_SPOTLIGHT\n\tloadspritegfx ANIM_TAG_CONFETTI\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_ENCORE2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_CreateSpotlight, 2\n\tcreatevisualtask AnimTask_HardwarePaletteFade, 2, 248, 3, 0, 10, 0\n\twaitforvisualfinish\n\tcreatesprite gFlatterSpotlightSpriteTemplate, ANIM_TARGET, 2, 0, -8, 80\n\tdelay 0\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 5, 2, ANIM_TARGET\n\tdelay 10\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 5, 2, ANIM_TARGET\n\tdelay 0\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_FLATTER, SOUND_PAN_ATTACKER\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tcall CreateFlatterConfetti\n\tdelay 5\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_FLATTER, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_HardwarePaletteFade, 2, 248, 3, 10, 0, 1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_RemoveSpotlight, 2\n\tend\n\nCreateFlatterConfetti:\n\tcreatesprite gFlatterConfettiSpriteTemplate, ANIM_ATTACKER, 40, ANIM_ATTACKER\n\tcreatesprite gFlatterConfettiSpriteTemplate, ANIM_ATTACKER, 40, ANIM_TARGET\n\treturn\n\nMove_ROLE_PLAY:\n\tmonbg ANIM_ATK_PARTNER\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB_WHITE\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 10, RGB_BLACK\n\twaitforvisualfinish\n\tplaysewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_DETECT, SOUND_PAN_ATTACKER, 30\n\tcreatevisualtask AnimTask_RolePlaySilhouette, 2\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 16, 0, RGB_WHITE\n\tdelay 8\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 10, 0, RGB_BLACK\n\tend\n\nMove_REFRESH:\n\tloadspritegfx ANIM_TAG_THIN_RING\n\tloadspritegfx ANIM_TAG_SPARKLE_2\n\tplaysewithpan SE_M_STAT_INCREASE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_StatusClearedEffect, 2, 0\n\twaitforvisualfinish\n\tplaysewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER\n\tcall GrantingStarsEffect\n\twaitforvisualfinish\n\tplaysewithpan SE_SHINY, SOUND_PAN_ATTACKER\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 10, 0, RGB(12, 24, 30)\n\tcreatesprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0\n\tend\n\nMove_BLAZE_KICK:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET\n\tcreatesprite gSpinningHandOrFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 30\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_WHITE\n\tdelay 30\n\tplaysewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 14, 1\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_WHITE\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0\n\tcall FireSpreadEffect\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_HYPER_VOICE:\n\tloadspritegfx ANIM_TAG_THIN_RING\n\tcall HyperVoiceEffect\n\twaitforvisualfinish\n\tdelay 8\n\tcall HyperVoiceEffect\n\twaitforvisualfinish\n\tend\n\nHyperVoiceEffect:\n\tcreatevisualtask SoundTask_PlayCryWithEcho, 5\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 8, 0, RGB_YELLOW\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 5, ANIM_ATTACKER, 0\n\tcreatesprite gHyperVoiceRingSpriteTemplate, ANIM_ATTACKER, 0, 45, 0, 0, 0, 0, 0, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 6, 1\n\tcreatevisualtask AnimTask_ShakeBattleTerrain, 2, 1, 0, 6, 1\n\tcreatevisualtask SoundTask_WaitForCry, 5\n\treturn\n\nMove_SAND_TOMB:\n\tloadspritegfx ANIM_TAG_MUD_SAND\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 7, RGB(19, 17, 0)\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 43, 1\n\tplaysewithpan SE_M_SAND_TOMB, SOUND_PAN_TARGET\n\tcall SandTombSwirlingDirt\n\tcall SandTombSwirlingDirt\n\tcall SandTombSwirlingDirt\n\tdelay 22\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 7, 0, RGB(19, 17, 0)\n\twaitforvisualfinish\n\tend\n\nSandTombSwirlingDirt:\n\tcreatesprite gSwirlingDirtSpriteTemplate, ANIM_TARGET, 2, 0, 32, 528, 30, 10, 50, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gSwirlingDirtSpriteTemplate, ANIM_TARGET, 2, 0, 36, 480, 20, 13, -46, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gSwirlingDirtSpriteTemplate, ANIM_TARGET, 2, 0, 37, 576, 20, 5, 42, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gSwirlingDirtSpriteTemplate, ANIM_TARGET, 2, 0, 35, 400, 25, 8, -42, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gSwirlingDirtSpriteTemplate, ANIM_TARGET, 2, 0, 32, 512, 25, 13, 46, ANIM_TARGET\n\tdelay 2\n\tcreatesprite gSwirlingDirtSpriteTemplate, ANIM_TARGET, 2, 0, 37, 464, 30, 12, -50, ANIM_TARGET\n\tdelay 2\n\treturn\n\nMove_SHEER_COLD:\n\tfadetobg BG_ICE\n\twaitbgfadeout\n\tplaysewithpan SE_M_ICY_WIND, 0\n\twaitbgfadein\n\tloadspritegfx ANIM_TAG_ICE_CUBE\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_FrozenIceCube, 2\n\twaitplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET, 17\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\trestorebg\n\twaitbgfadein\n\tend\n\nMove_ARM_THRUST:\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tloadspritegfx ANIM_TAG_IMPACT\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_RotateMonSpriteToSide, 5, 8, 5, ANIM_ATTACKER, 0\n\tdelay 6\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 3\n\tdelay 4\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tcreatesprite gArmThrustHandSpriteTemplate, ANIM_TARGET, 2, 10, -8, 14, 3\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_RotateMonSpriteToSide, 5, 8, 5, ANIM_ATTACKER, 1\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tchoosetwoturnanim ArmThrustRight, ArmThrustLeft\n\nArmThrustContinue:\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1\n\twaitforvisualfinish\n\tblendoff\n\tend\n\nArmThrustRight:\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 8, 0, ANIM_TARGET, 2\n\tgoto ArmThrustContinue\n\nArmThrustLeft:\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 0, ANIM_TARGET, 2\n\tgoto ArmThrustContinue\n\nMove_MUDDY_WATER:\n\tpanse SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tcreatevisualtask AnimTask_CreateSurfWave, 2, TRUE\n\twaitforvisualfinish\n\tend\n\nMove_BULLET_SEED:\n\tloadspritegfx ANIM_TAG_SEED\n\tcreatesprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0\n\tdelay 5\n\tcreatesprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0\n\tdelay 5\n\tcreatesprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0\n\tdelay 5\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 30, 1\n\tcreatesprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0\n\tdelay 5\n\tcreatesprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0\n\tdelay 5\n\tcreatesprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0\n\tdelay 5\n\tcreatesprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0\n\tdelay 5\n\tcreatesprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0\n\tdelay 5\n\tcreatesprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0\n\tdelay 5\n\tcreatesprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0\n\twaitforvisualfinish\n\tend\n\nMove_DRAGON_CLAW:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tloadspritegfx ANIM_TAG_CLAW_SLASH\n\tplaysewithpan SE_M_SACRED_FIRE2, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 4, 0, 8, RGB(31, 19, 0)\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 15, 1\n\tcall DragonClawFireSpiral\n\tcall DragonClawFireSpiral\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 528, 30, 13, 50, ANIM_ATTACKER\n\tdelay 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\tcreatesprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0\n\tcreatesprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0\n\tcreatesprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, -4, 1, 10, 3, 1\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 480, 20, 16, -46, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 576, 20, 8, 42, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 31, 400, 25, 11, -42, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 512, 25, 16, 46, ANIM_ATTACKER\n\tdelay 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\tcreatesprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, -10, 1\n\tcreatesprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, 10, 1\n\tcreatesprite gShakeMonOrTerrainSpriteTemplate, ANIM_ATTACKER, 2, -4, 1, 10, 3, 1\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 464, 30, 15, -50, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 528, 30, 13, 50, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 480, 20, 16, -46, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 576, 20, 8, 42, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 31, 400, 25, 11, -42, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 512, 25, 16, 46, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 464, 30, 15, -50, ANIM_ATTACKER\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 4, 8, 0, RGB(31, 19, 0)\n\twaitforvisualfinish\n\tend\n\nDragonClawFireSpiral:\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 528, 30, 13, 50, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 480, 20, 16, -46, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 576, 20, 8, 42, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 31, 400, 25, 11, -42, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 512, 25, 16, 46, ANIM_ATTACKER\n\tdelay 2\n\tcreatesprite gFireSpinSpriteTemplate, ANIM_ATTACKER, 2, 0, 33, 464, 30, 15, -50, ANIM_ATTACKER\n\tdelay 2\n\treturn\n\n\tend\n\nMove_MUD_SHOT:\n\tloadspritegfx ANIM_TAG_BROWN_ORB\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1\n\tdelay 6\n\tcreatevisualtask AnimTask_StartSinAnimTimer, 5, 100\n\tpanse SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0\n\tcall MudShotOrbs\n\tcall MudShotOrbs\n\tcall MudShotOrbs\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 43, 1\n\tcall MudShotOrbs\n\tcall MudShotOrbs\n\tcall MudShotOrbs\n\tcall MudShotOrbs\n\tcall MudShotOrbs\n\tcall MudShotOrbs\n\tcall MudShotOrbs\n\tcall MudShotOrbs\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMudShotOrbs:\n\tcreatesprite gMudShotOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 16\n\tdelay 2\n\tcreatesprite gMudShotOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 16\n\tdelay 2\n\treturn\n\nMove_METEOR_MASH:\n\tloadspritegfx ANIM_TAG_GOLD_STARS\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tpanse SE_M_BARRIER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +3, 0\n\tfadetobg BG_COSMIC\n\twaitbgfadein\n\twaitforvisualfinish\n\tcreatesprite gMeteorMashStarSpriteTemplate, ANIM_TARGET, 3, -48, -64, 72, 32, 30\n\tdelay 10\n\tcreatesprite gMeteorMashStarSpriteTemplate, ANIM_TARGET, 3, -112, -64, 8, 32, 30\n\tdelay 40\n\tcreatesprite gSpinningHandOrFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 0, 30\n\tcreatesprite gMeteorMashStarSpriteTemplate, ANIM_TARGET, 3, -80, -64, 40, 32, 30\n\tdelay 20\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 5, 0, 20, 1\n\twaitforvisualfinish\n\tdelay 10\n\trestorebg\n\twaitbgfadein\n\twaitforvisualfinish\n\tend\n\nMove_REVENGE:\n\tloadspritegfx ANIM_TAG_PURPLE_SCRATCH\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatesprite gRevengeSmallScratchSpriteTemplate, ANIM_ATTACKER, 2, 10, -10\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 4, 2, 8, RGB_RED\n\twaitforvisualfinish\n\tunloadspritegfx ANIM_TAG_PURPLE_SCRATCH\n\tloadspritegfx ANIM_TAG_PURPLE_SWIPE\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4\n\tdelay 4\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tcreatesprite gRevengeBigScratchSpriteTemplate, ANIM_TARGET, 2, 10, -10\n\twaitforvisualfinish\n\tunloadspritegfx ANIM_TAG_PURPLE_SWIPE\n\tloadspritegfx ANIM_TAG_IMPACT\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 10, 1\n\tcreatesprite gPersistHitSplatSpriteTemplate, ANIM_TARGET, 3, -10, -8, ANIM_TARGET, 1, 8\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tdelay 8\n\tcreatesprite gPersistHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, 8, ANIM_TARGET, 1, 8\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_POISON_FANG:\n\tloadspritegfx ANIM_TAG_FANG_ATTACK\n\tloadspritegfx ANIM_TAG_POISON_BUBBLE\n\tplaysewithpan SE_M_BITE, SOUND_PAN_TARGET\n\tcreatesprite gFangSpriteTemplate, ANIM_TARGET, 2\n\tdelay 10\n\tcreatevisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 3, 0, 10, 1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 0, 4, 0, 12, RGB(26, 0, 26)\n\tcall PoisonBubblesEffect\n\twaitforvisualfinish\n\tend\n\nMove_SUBSTITUTE:\n\tplaysewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_MonToSubstitute, 2\n\tend\n\nMove_FRENZY_PLANT:\n\tloadspritegfx ANIM_TAG_ROOTS\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 2, 0, 5, RGB_BLACK\n\twaitforvisualfinish\n\tcreatesprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 10, 8, 2, 0, 0, 100\n\tplaysewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER\n\tdelay 5\n\tcreatesprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, -2, 0, 1, 95\n\tplaysewithpan SE_M_SCRATCH, -43\n\tdelay 5\n\tcreatesprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 30, 8, -4, 0, 0, 90\n\tplaysewithpan SE_M_SCRATCH, -22\n\tdelay 5\n\tcreatesprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 40, -8, 4, 0, 1, 85\n\tplaysewithpan SE_M_SCRATCH, 0\n\tdelay 5\n\tcreatesprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 50, 8, 0, 0, 0, 85\n\tplaysewithpan SE_M_SCRATCH, +21\n\tdelay 5\n\tcreatesprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 60, -8, -2, 0, 1, 85\n\tplaysewithpan SE_M_SCRATCH, +42\n\tdelay 5\n\tcreatesprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 75, 8, 0, 0, 0, 85\n\tplaysewithpan SE_M_SCRATCH, SOUND_PAN_TARGET\n\tdelay 5\n\tcreatesprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 85, 16, 6, 0, 3, 80\n\tplaysewithpan SE_M_SCRATCH, SOUND_PAN_TARGET\n\tdelay 5\n\tcreatesprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 85, -16, -6, 0, 2, 75\n\tplaysewithpan SE_M_SCRATCH, SOUND_PAN_TARGET\n\tdelay 5\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -10, ANIM_TARGET, 3\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 8, 0, 20, 1\n\tdelay 3\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 8, ANIM_TARGET, 3\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tdelay 3\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, -3, ANIM_TARGET, 2\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tdelay 3\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -3, 1, ANIM_TARGET, 2\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 1, ANIM_TARGET, 1\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tdelay 2\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 10, ANIM_TARGET, 1\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 2, 5, 0, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nMove_METAL_SOUND:\n\tloadspritegfx ANIM_TAG_METAL_SOUND_WAVES\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_foes ANIM_TARGET\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 2, 0, 8, 1\n\tcall MetalSoundRings\n\tcall MetalSoundRings\n\tcall MetalSoundRings\n\tcall MetalSoundRings\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tdelay 0\n\twaitforvisualfinish\n\tend\n\nMetalSoundRings:\n\tpanse SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tcreatesprite gMetalSoundSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 30, 0\n\tdelay 2\n\treturn\n\nMove_FOCUS_PUNCH:\n\tgoto FocusPunch\n\nFocusPunchEnd:\n\twaitforvisualfinish\n\tend\n\nFocusPunch:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_HANDS_AND_FEET\n\tdelay 1\n\tcreatevisualtask AnimTask_IsContest, 2\n\tjumprettrue FocusPunchInContest\n\tcreatevisualtask AnimTask_IsTargetPlayerSide, 2\n\tjumpretfalse FocusPunchOnOpponent\n\tjumprettrue FocusPunchOnPlayer\nFocusPunchContinue:\n\twaitbgfadein\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_TARGET\n\tcreatesprite gFocusPunchFistSpriteTemplate, ANIM_TARGET, 2\n\tdelay 10\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 0\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 8, 0, 24, 1\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 2, ANIM_TARGET, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, -6, ANIM_TARGET, 0\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 8, ANIM_TARGET, 0\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\trestorebg\n\twaitbgfadein\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tgoto FocusPunchEnd\n\nFocusPunchOnOpponent:\n\tfadetobg BG_IMPACT_OPPONENT\n\tgoto FocusPunchContinue\n\nFocusPunchOnPlayer:\n\tfadetobg BG_IMPACT_PLAYER\n\tgoto FocusPunchContinue\n\nFocusPunchInContest:\n\tfadetobg BG_IMPACT_CONTESTS\n\tgoto FocusPunchContinue\n\nMove_RETURN:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatevisualtask AnimTask_GetReturnPowerLevel, 2\n\tdelay 2\n\tjumpreteq 0, ReturnWeak\n\tjumpreteq 1, ReturnMedium\n\tjumpreteq 2, ReturnStrong\n\tjumpreteq 3, ReturnStrongest\nReturnContinue:\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nReturnWeak:\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 16, 1, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 16, 1, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\tdelay 5\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tgoto ReturnContinue\n\nReturnMedium:\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tdelay 11\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 5, 4\n\tdelay 6\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tgoto ReturnContinue\n\nReturnStrong:\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\twaitforvisualfinish\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, ANIM_TARGET, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 3, -5, ANIM_TARGET, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -5, 3, ANIM_TARGET, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1\n\tgoto ReturnContinue\n\nReturnStrongest:\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 0, 6, RGB_BLACK\n\twaitforvisualfinish\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 16, 1, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 3, -5, ANIM_TARGET, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 12, 1, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\tdelay 5\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1\n\twaitforvisualfinish\n\tdelay 4\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 8, 1, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\tdelay 5\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1\n\twaitforvisualfinish\n\tdelay 2\n\tcreatevisualtask AnimTask_TraceMonBlended, 2, 0, 4, 5, 1\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1\n\tcreatevisualtask AnimTask_TraceMonBlended, 2, 0, 4, 5, 1\n\twaitforvisualfinish\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 4, 2, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\tdelay 5\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1\n\tcreatevisualtask AnimTask_TraceMonBlended, 2, 0, 4, 5, 1\n\twaitforvisualfinish\n\tcall ReturnStrongestHit\n\tcall ReturnStrongestHit\n\tcall ReturnStrongestHit\n\tcall ReturnStrongestHit\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -8, ANIM_TARGET, 0\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 8, 0, 24, 1\n\tdelay 6\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, ANIM_TARGET, 0\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 3, -5, ANIM_TARGET, 0\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -5, 3, ANIM_TARGET, 0\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 6, 0, RGB_BLACK\n\tgoto ReturnContinue\n\nReturnStrongestHit:\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 4, 3, ANIM_ATTACKER\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1\n\tcreatevisualtask AnimTask_TraceMonBlended, 2, 0, 4, 5, 1\n\twaitforvisualfinish\n\treturn\n\nMove_COSMIC_POWER:\n\tloadspritegfx ANIM_TAG_SPARKLE_2\n\tcreatevisualtask SoundTask_PlaySE2WithPanning, 5, SE_M_COSMIC_POWER, 0\n\tplaysewithpan SE_M_COSMIC_POWER, 0\n\tcreatevisualtask AnimTask_BlendNonAttackerPalettes, 2, 0, 0, 15, RGB_BLACK\n\twaitforvisualfinish\n\tfadetobg BG_COSMIC\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 2, 0, 128, 0, -1\n\twaitbgfadein\n\tdelay 70\n\tcreatevisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_MORNING_SUN, SOUND_PAN_ATTACKER\n\tcreatesprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, -15, 0, 0, 0, 32, 60\n\tdelay 8\n\tcreatesprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 12, -5, 0, 0, 32, 60\n\tdelay 40\n\tcreatevisualtask AnimTask_BlendNonAttackerPalettes, 2, 0, 15, 0, RGB_BLACK\n\twaitforvisualfinish\n\trestorebg\n\twaitbgfadeout\n\tsetarg 7, 0xFFFF\n\twaitbgfadein\n\twaitforvisualfinish\n\tend\n\nMove_BLAST_BURN:\n\tloadspritegfx ANIM_TAG_FIRE_PLUME\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_SACRED_FIRE, SOUND_PAN_ATTACKER\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -20, -10, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 0, -16, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 20, -10, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 32, 0, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 20, 10, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -20, 10, 24, 0, 0, 0\n\tdelay 25\n\tplaysewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -64, 0, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 6, -40, -20, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 70, 0, -32, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 70, 40, -20, 24, 0, 0, 0\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 64, 0, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 40, 20, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -40, 20, 24, 0, 0, 0\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 25\n\tplaysewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -96, 0, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 6, -60, -30, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 70, 0, -48, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 70, 60, -30, 24, 0, 0, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -4, 3, ANIM_TARGET, 0\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 12, 0, 20, 1\n\tcreatevisualtask AnimTask_ShakeBattleTerrain, 2, 2, 0, 10, 1\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 96, 0, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 60, 30, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 48, 24, 0, 0, 0\n\tcreatesprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -60, 30, 24, 0, 0, 0\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_ROCK_TOMB:\n\tloadspritegfx ANIM_TAG_X_SIGN\n\tloadspritegfx ANIM_TAG_ROCKS\n\tcreatevisualtask AnimTask_ShakeBattleTerrain, 2, 2, 0, 10, 1\n\twaitforvisualfinish\n\tcreatesprite gRockTombRockSpriteTemplate, ANIM_TARGET, 2, 20, 12, 64, 114, 0\n\tdelay 8\n\tcreatevisualtask AnimTask_ShakeBattleTerrain, 2, 0, 2, 3, 1\n\tplaysewithpan SE_M_STRENGTH, SOUND_PAN_TARGET\n\tdelay 8\n\tcreatesprite gRockTombRockSpriteTemplate, ANIM_TARGET, 2, -20, 12, 64, 98, 0\n\tdelay 8\n\tcreatevisualtask AnimTask_ShakeBattleTerrain, 2, 0, 2, 3, 1\n\tplaysewithpan SE_M_STRENGTH, SOUND_PAN_TARGET\n\tdelay 8\n\tcreatesprite gRockTombRockSpriteTemplate, ANIM_TARGET, 66, 3, 6, 64, 82, 0\n\tdelay 8\n\tcreatevisualtask AnimTask_ShakeBattleTerrain, 2, 0, 2, 3, 1\n\tplaysewithpan SE_M_STRENGTH, SOUND_PAN_TARGET\n\tdelay 8\n\tcreatesprite gRockTombRockSpriteTemplate, ANIM_TARGET, 2, -3, 13, 64, 66, 0\n\tdelay 8\n\tcreatevisualtask AnimTask_ShakeBattleTerrain, 2, 0, 2, 3, 1\n\tplaysewithpan SE_M_STRENGTH, SOUND_PAN_TARGET\n\tdelay 24\n\tplaysewithpan SE_M_HYPER_BEAM, SOUND_PAN_TARGET\n\tcreatesprite gRedXSpriteTemplate, ANIM_TARGET, 5, ANIM_TARGET, 50\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 20, 1\n\tcreatevisualtask AnimTask_ShakeBattleTerrain, 2, 2, 0, 10, 1\n\twaitforvisualfinish\n\tend\n\nMove_SILVER_WIND:\n\tloadspritegfx ANIM_TAG_SPARKLE_6\n\tpanse SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tplaysewithpan SE_M_MORNING_SUN, 0\n\tdelay 0\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio_all\n\tdelay 0\n\tcreatevisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 0, 4, RGB_BLACK\n\tcreatevisualtask AnimTask_GetTargetSide, 2\n\tjumprettrue SilverWindOnPlayer\n\tfadetobg BG_BUG_OPPONENT\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 5, 1536, 0, 0, -1\nSilverWindContinue:\n\tdelay 0\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 4, 4, RGB_BLACK\n\twaitbgfadein\n\tcreatesprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1\n\tcreatesprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1\n\tcreatesprite gSilverWindBigSparkSpriteTemplate, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1\n\tcreatesprite gSilverWindBigSparkSpriteTemplate, ANIM_ATTACKER, 120, -40, 14, 128, 4, 1, 2, 1\n\tdelay 0\n\tcreatesprite gSilverWindMediumSparkSpriteTemplate, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1\n\tcreatesprite gSilverWindMediumSparkSpriteTemplate, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1\n\tcreatesprite gSilverWindMediumSparkSpriteTemplate, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1\n\tcreatesprite gSilverWindMediumSparkSpriteTemplate, ANIM_ATTACKER, 120, -40, 14, 128, 4, 1, 2, 1\n\tdelay 0\n\tcreatesprite gSilverWindSmallSparkSpriteTemplate, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1\n\tcreatesprite gSilverWindSmallSparkSpriteTemplate, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1\n\tcreatesprite gSilverWindSmallSparkSpriteTemplate, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1\n\tcreatesprite gSilverWindSmallSparkSpriteTemplate, ANIM_ATTACKER, 120, -40, 14, 128, 4, 1, 2, 1\n\tdelay 6\n\tcreatesprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -4, 16, 0, 6, 1, 2, 1\n\tcreatesprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -16, 12, 192, 5, 2, 3, 1\n\tdelay 0\n\tcreatesprite gSilverWindMediumSparkSpriteTemplate, ANIM_TARGET, 66, -4, 16, 0, 6, 1, 2, 1\n\tcreatesprite gSilverWindMediumSparkSpriteTemplate, ANIM_TARGET, 66, -16, 12, 192, 5, 2, 3, 1\n\tdelay 0\n\tcreatesprite gSilverWindSmallSparkSpriteTemplate, ANIM_TARGET, 66, -4, 16, 0, 6, 1, 2, 1\n\tcreatesprite gSilverWindSmallSparkSpriteTemplate, ANIM_TARGET, 66, -16, 12, 192, 5, 2, 3, 1\n\twaitforvisualfinish\n\tplaysewithpan SE_M_GUST2, SOUND_PAN_TARGET\n\tclearmonbg ANIM_DEF_PARTNER\n\tdelay 0\n\trestorebg\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 4, 0, RGB_BLACK\n\tsetarg 7, 0xFFFF\n\twaitbgfadein\n\tend\n\nSilverWindOnPlayer:\n\tfadetobg BG_BUG_PLAYER\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 5, -1536, 0, 0, -1\n\tgoto SilverWindContinue\n\nMove_SNATCH:\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -12, 4, 10, 10, 12, 6\n\tend\n\nMove_DIVE:\n\tloadspritegfx ANIM_TAG_SPLASH\n\tloadspritegfx ANIM_TAG_SWEAT_BEAD\n\tchoosetwoturnanim DiveSetUp, DiveAttack\n\nDiveSetUp:\n\tloadspritegfx ANIM_TAG_ROUND_SHADOW\n\tplaysewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER\n\tcreatesprite gDiveBallSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336\n\twaitforvisualfinish\n\tplaysewithpan SE_M_DIVE, SOUND_PAN_ATTACKER\n\tcreatesprite gDiveWaterSplashSpriteTemplate, ANIM_ATTACKER, 3, 0\n\tcall DiveSetUpWaterDroplets\n\tcall DiveSetUpWaterDroplets\n\tcall DiveSetUpWaterDroplets\n\tcall DiveSetUpWaterDroplets\n\tcall DiveSetUpWaterDroplets\n\tend\n\nDiveSetUpWaterDroplets:\n\tcreatesprite gSprayWaterDropletSpriteTemplate, ANIM_ATTACKER, 5, 0, 0\n\tcreatesprite gSprayWaterDropletSpriteTemplate, ANIM_ATTACKER, 5, 1, 0\n\treturn\n\nDiveAttack:\n\tloadspritegfx ANIM_TAG_WATER_IMPACT\n\tloadspritegfx ANIM_TAG_SMALL_BUBBLES\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET\n\tcreatesprite gDiveWaterSplashSpriteTemplate, ANIM_TARGET, 3, 1\n\tcall DiveAttackWaterDroplets\n\tcall DiveAttackWaterDroplets\n\tcall DiveAttackWaterDroplets\n\tcall DiveAttackWaterDroplets\n\tcall DiveAttackWaterDroplets\n\tdelay 12\n\tcall RisingWaterHitEffect\n\twaitforvisualfinish\n\tvisible ANIM_ATTACKER\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nDiveAttackWaterDroplets:\n\tcreatesprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 0, 1\n\tcreatesprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 1, 1\n\treturn\n\nMove_ROCK_BLAST:\n\tloadspritegfx ANIM_TAG_ROCKS\n\tloadspritegfx ANIM_TAG_IMPACT\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6\n\tdelay 3\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER\n\tcreatesprite gRockBlastRockSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 25, 257\n\twaitforvisualfinish\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tcreatesprite gRockFragmentSpriteTemplate, ANIM_TARGET, 2, 0, 0, 20, 24, 14, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1\n\tcreatesprite gRockFragmentSpriteTemplate, ANIM_TARGET, 2, 5, 0, -20, 24, 14, 1\n\tcreatesprite gRockFragmentSpriteTemplate, ANIM_TARGET, 2, 0, 5, 20, -24, 14, 2\n\tcreatesprite gRockFragmentSpriteTemplate, ANIM_TARGET, 2, -5, 0, -20, -24, 14, 2\n\twaitforvisualfinish\n\tend\n\nMove_OVERHEAT:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 18\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 5, RGB(28, 0, 0)\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_AllocBackupPalBuffer, 5\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_CopyPalUnfadedToBackup, 5, 0, 1\n\tdelay 1\n\tcreatevisualtask AnimTask_CopyPalFadedToUnfaded, 5, 0\n\tdelay 1\n\tplaysewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_CopyPalUnfadedToBackup, 5, 1, 0\n\tdelay 1\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 1, 0, 13, RGB(28, 0, 0)\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 2, 0, 15, 1\n\twaitforvisualfinish\n\tplaysewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 30, 25, -20\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 32, 30, 25, -20\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 64, 30, 25, -20\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 96, 30, 25, -20\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 128, 30, 25, -20\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 160, 30, 25, -20\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 192, 30, 25, -20\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 224, 30, 25, -20\n\tdelay 5\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 30, 25, 0\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 32, 30, 25, 0\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 64, 30, 25, 0\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 96, 30, 25, 0\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 128, 30, 25, 0\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 160, 30, 25, 0\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 192, 30, 25, 0\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 224, 30, 25, 0\n\tdelay 5\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 30, 25, 10\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 32, 30, 25, 10\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 64, 30, 25, 10\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 96, 30, 25, 10\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 2, 1, 128, 30, 25, 10\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 160, 30, 25, 10\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 192, 30, 25, 10\n\tcreatesprite gOverheatFlameSpriteTemplate, ANIM_ATTACKER, 66, 1, 224, 30, 25, 10\n\tdelay 5\n\twaitforvisualfinish\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -5, 3, ANIM_TARGET, 0\n\tplaysewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 10, 0, 25, 1\n\tdelay 6\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, -5, ANIM_TARGET, 0\n\tplaysewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, 10, ANIM_TARGET, 0\n\tplaysewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET\n\tdelay 8\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 0\n\tplaysewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_CopyPalFadedToUnfaded, 5, 1\n\tdelay 1\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, -1, 0, 13, RGB(18, 18, 18)\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 3, 0, 15, 1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_CopyPalUnfadedFromBackup, 5, 0, 1\n\tdelay 1\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 5, 0, RGB(28, 0, 0)\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\twaitforvisualfinish\n\tdelay 15\n\tcreatevisualtask AnimTask_CopyPalUnfadedFromBackup, 5, 1, 0\n\tdelay 1\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 13, 0, RGB(18, 18, 18)\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_FreeBackupPalBuffer, 5\n\twaitforvisualfinish\n\tend\n\nMove_HYDRO_CANNON:\n\tloadspritegfx ANIM_TAG_WATER_ORB\n\tloadspritegfx ANIM_TAG_WATER_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_SURF, SOUND_PAN_ATTACKER\n\tcreatesprite gHydroCannonChargeSpriteTemplate, ANIM_TARGET, 2\n\tdelay 10\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\tdelay 30\n\tpanse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0\n\tcall HydroCannonBeam\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 10, 0, 40, 1\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0\n\tcall HydroCannonBeam\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0\n\tcall HydroCannonBeam\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0\n\tcall HydroCannonBeam\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0\n\tcall HydroCannonBeam\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0\n\tcall HydroCannonBeam\n\tcreatesprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nHydroCannonBeam:\n\tcreatesprite gHydroCannonBeamSpriteTemplate, ANIM_TARGET, 2, 10, -10, 0, 0, 15, 257\n\tdelay 1\n\tcreatesprite gHydroCannonBeamSpriteTemplate, ANIM_TARGET, 2, 10, -10, 0, 0, 15, 257\n\tdelay 1\n\tcreatesprite gHydroCannonBeamSpriteTemplate, ANIM_TARGET, 2, 10, -10, 0, 0, 15, 257\n\tdelay 1\n\tcreatesprite gHydroCannonBeamSpriteTemplate, ANIM_TARGET, 2, 10, -10, 0, 0, 15, 257\n\tdelay 1\n\tcreatesprite gHydroCannonBeamSpriteTemplate, ANIM_TARGET, 2, 10, -10, 0, 0, 15, 257\n\treturn\n\nMove_ASTONISH:\n\tloadspritegfx ANIM_TAG_SWEAT_BEAD\n\tplaysewithpan SE_M_ENCORE, SOUND_PAN_ATTACKER\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6\n\tdelay 25\n\tcreatesprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 0, 1\n\tplaysewithpan SE_M_SKETCH, SOUND_PAN_TARGET\n\tcreatesprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 1, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1\n\tcreatevisualtask AnimTask_StretchTargetUp, 3\n\twaitforvisualfinish\n\tend\n\nMove_SEISMIC_TOSS:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_ROCKS\n\tsetarg 7, 0\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_GetSeismicTossDamageLevel, 3\n\tdelay 1\n\tfadetobg BG_IN_AIR\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_MoveSeismicTossBg, 3\n\tplaysewithpan SE_M_SKY_UPPERCUT, 0\n\twaitbgfadein\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_SeismicTossBgAccelerateDownAtEnd, 3\n\tjumpreteq 0, SeismicTossWeak\n\tjumpreteq 1, SeismicTossMedium\n\tjumpreteq 2, SeismicTossStrong\nSeismicTossContinue:\n\trestorebg\n\twaitbgfadeout\n\tsetarg 7, 0xFFF\n\twaitbgfadein\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nSeismicTossWeak:\n\tcall SeismicTossRockScatter1\n\tdelay 16\n\tcall SeismicTossRockScatter2\n\tgoto SeismicTossContinue\n\nSeismicTossMedium:\n\tcall SeismicTossRockScatter1\n\tdelay 14\n\tcall SeismicTossRockScatter2\n\tdelay 14\n\tcall SeismicTossRockScatter1\n\tgoto SeismicTossContinue\n\nSeismicTossStrong:\n\tcall SeismicTossRockScatter2\n\tdelay 10\n\tcall SeismicTossRockScatter1\n\tdelay 10\n\tcall SeismicTossRockScatter2\n\tdelay 10\n\tcall SeismicTossRockScatter1\n\tgoto SeismicTossContinue\n\nSeismicTossRockScatter1:\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -10, -8, ANIM_TARGET, 1\n\tplaysewithpan SE_M_STRENGTH, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1\n\tcreatesprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 27, 2, 3\n\tcreatesprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 8, 28, 3, 4\n\tcreatesprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -4, 30, 2, 3\n\tcreatesprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 12, 25, 4, 4\n\treturn\n\nSeismicTossRockScatter2:\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, -8, ANIM_TARGET, 1\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1\n\tcreatesprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 32, 3, 4\n\tcreatesprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 8, 31, 2, 2\n\tcreatesprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -4, 28, 2, 3\n\tcreatesprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 12, 30, 4, 3\n\treturn\n\nMove_MAGIC_COAT:\n\tloadspritegfx ANIM_TAG_ORANGE_LIGHT_WALL\n\tsetalpha 0, 16\n\twaitplaysewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER, 15\n\tcreatesprite gMagicCoatWallSpriteTemplate, ANIM_ATTACKER, 3, 40, 0, ANIM_TAG_ORANGE_LIGHT_WALL\n\twaitforvisualfinish\n\tdelay 1\n\tblendoff\n\tend\n\nMove_WATER_PULSE:\n\tloadspritegfx ANIM_TAG_SMALL_BUBBLES\n\tloadspritegfx ANIM_TAG_BLUE_RING_2\n\tmonbg ANIM_TARGET\n\tsplitbgprio ANIM_TARGET\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 0, 7, RGB(0, 25, 28)\n\tdelay 10\n\tcreatesprite gWaterPulseBubbleSpriteTemplate, ANIM_ATTACKER, 66, 100, 100, 8, 1, 20, 40, 0\n\tcreatesprite gWaterPulseBubbleSpriteTemplate, ANIM_ATTACKER, 66, 20, 100, 16, 2, 10, 35, 1\n\tcreatesprite gWaterPulseBubbleSpriteTemplate, ANIM_ATTACKER, 66, 200, 80, 8, 1, 40, 20, 0\n\tcreatesprite gWaterPulseBubbleSpriteTemplate, ANIM_ATTACKER, 66, 80, 60, 10, 3, 20, 50, 0\n\tcreatesprite gWaterPulseBubbleSpriteTemplate, ANIM_ATTACKER, 66, 140, 100, 16, 1, 20, 30, 1\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tplaysewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER\n\tcreatesprite gWaterPulseRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 40, 15\n\tdelay 5\n\tplaysewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER\n\tcreatesprite gWaterPulseRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 40, 15\n\tdelay 5\n\tplaysewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER\n\tcreatesprite gWaterPulseRingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 40, 15\n\tdelay 13\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 8, 18, 1\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 7, 0, RGB(0, 25, 28)\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nMove_PSYCHO_BOOST:\n\tloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT\n\tmonbg ANIM_ATK_PARTNER\n\tfadetobg BG_PSYCHIC\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_FadeScreenToWhite, 5\n\twaitbgfadein\n\tdelay 6\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_BG, 2, 8, 0, 10, RGB_BLACK\n\tdelay 0\n\tsplitbgprio ANIM_ATTACKER\n\tsetalpha 8, 8\n\tdelay 10\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 3, 0, 240, 0\n\tloopsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 14, 10\n\tcreatesprite gPsychoBoostOrbSpriteTemplate, ANIM_ATTACKER, 2\n\tdelay 110\n\tloopsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 7, 10\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, -8, 1, 24, 1\n\tplaysewithpan SE_M_LEER, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tcall UnsetPsychicBackground\n\tend\n\nMove_KNOCK_OFF:\n\tloadspritegfx ANIM_TAG_SLAM_HIT_2\n\tloadspritegfx ANIM_TAG_IMPACT\n\tcreatesprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6\n\tdelay 4\n\tplaysewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET\n\tcreatesprite gKnockOffStrikeSpriteTemplate, ANIM_TARGET, 2, -16, -16\n\tdelay 8\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 2\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -12, 10, 0, 3\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5\n\tdelay 3\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1\n\tdelay 5\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6\n\tdelay 10\n\twaitforvisualfinish\n\tend\n\nMove_DOOM_DESIRE:\n\tcreatevisualtask GetIsDoomDesireHitTurn, 2\n\tdelay 1\n\tmonbg ANIM_ATK_PARTNER\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_TARGET, FALSE\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 4, RGB_BLACK\n\twaitforvisualfinish\n\tsetalpha 8, 8\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_ATTACKER, 1\n\twaitforvisualfinish\n\tdelay 20\n\tcreatevisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_TARGET, TRUE\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 4, 0, RGB_BLACK\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATK_PARTNER\n\tblendoff\n\tend\n\nUnusedDoomDesireHit:\n\tloadspritegfx ANIM_TAG_EXPLOSION\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 16, RGB_WHITE\n\twaitforvisualfinish\n\tdelay 10\n\tcreatevisualtask AnimTask_DoomDesireLightBeam, 5\n\tdelay 5\n\tplaysewithpan SE_M_CONFUSE_RAY, SOUND_PAN_ATTACKER\n\tdelay 10\n\tplaysewithpan SE_M_CONFUSE_RAY, 0\n\tdelay 10\n\tplaysewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET\n\tdelay 23\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 20, 1\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 1, 1\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 16, 0, RGB_WHITE\n\twaitforvisualfinish\n\tend\n\nMove_SKY_UPPERCUT:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tfadetobg BG_IN_AIR\n\twaitbgfadeout\n\tplaysewithpan SE_M_SKY_UPPERCUT, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_MoveSkyUppercutBg, 5, 55\n\twaitbgfadein\n\tsetalpha 12, 8\n\tdelay 38\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 0, 0, 5\n\tdelay 4\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 6, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -28, 28, ANIM_TARGET, 1\n\tdelay 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -15, 8, ANIM_TARGET, 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tdelay 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -5, -12, ANIM_TARGET, 1\n\tdelay 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, -32, ANIM_TARGET, 1\n\tdelay 1\n\tplaysewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 5, -52, ANIM_TARGET, 1\n\tcreatesprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -26, 16, 1, 4\n\tdelay 4\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1\n\tdelay 30\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 6\n\tdelay 4\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\trestorebg\n\twaitbgfadeout\n\tsetarg 7, 0xFFFF\n\twaitbgfadein\n\tend\n\nMove_SECRET_POWER:\n\tcreatevisualtask AnimTask_GetBattleTerrain, 5\n\tjumpargeq 0, BATTLE_TERRAIN_GRASS,      Move_NEEDLE_ARM\n\tjumpargeq 0, BATTLE_TERRAIN_LONG_GRASS, Move_MAGICAL_LEAF\n\tjumpargeq 0, BATTLE_TERRAIN_SAND,       Move_MUD_SHOT\n\tjumpargeq 0, BATTLE_TERRAIN_UNDERWATER, Move_WATERFALL\n\tjumpargeq 0, BATTLE_TERRAIN_WATER,      Move_SURF\n\tjumpargeq 0, BATTLE_TERRAIN_POND,       Move_BUBBLE_BEAM\n\tjumpargeq 0, BATTLE_TERRAIN_MOUNTAIN,   Move_ROCK_THROW\n\tjumpargeq 0, BATTLE_TERRAIN_CAVE,       Move_BITE\n\tjumpargeq 0, BATTLE_TERRAIN_BUILDING,   Move_STRENGTH\n\tgoto Move_SLAM\n\nMove_TWISTER:\n\tloadspritegfx ANIM_TAG_LEAF\n\tloadspritegfx ANIM_TAG_IMPACT\n\tloadspritegfx ANIM_TAG_ROCKS\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tplaysewithpan SE_M_TWISTER, SOUND_PAN_TARGET\n\tcreatesprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 120, 70, 5, 70, 30\n\tdelay 1\n\tcreatesprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 55, 6, 60, 25\n\tdelay 1\n\tcreatesprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 60, 7, 60, 30\n\tcreatesprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 55, 10, 60, 30\n\tdelay 3\n\tcreatesprite gTwisterRockSpriteTemplate, ANIM_TARGET, 2, 100, 50, 4, 50, 26\n\tdelay 1\n\tcreatesprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 105, 25, 8, 60, 20\n\tdelay 1\n\tcreatesprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 40, 10, 48, 30\n\tdelay 3\n\tcreatesprite gTwisterRockSpriteTemplate, ANIM_TARGET, 2, 120, 30, 6, 45, 25\n\tcreatesprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 115, 35, 10, 60, 30\n\tdelay 3\n\tcreatesprite gTwisterRockSpriteTemplate, ANIM_TARGET, 2, 105, 20, 8, 40, 0\n\tdelay 3\n\tcreatesprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 20, 255, 15, 32, 0\n\tcreatesprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 110, 10, 8, 32, 20\n\twaitforvisualfinish\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -32, -16, ANIM_TARGET, 3\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1\n\tdelay 4\n\tcreatesprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3\n\tplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_MAGICAL_LEAF:\n\tloadspritegfx ANIM_TAG_LEAF\n\tloadspritegfx ANIM_TAG_RAZOR_LEAF\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tdelay 1\n\tloopsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER, 10, 5\n\tcreatevisualtask AnimTask_CycleMagicalLeafPal, 5\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -2, 10\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -1, -1, 15\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -4, -4, 7\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 3, -3, 11\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -1, -6, 8\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 2, -1, 12\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -4, 13\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 4, -5, 7\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, 2, -6, 11\n\tdelay 2\n\tcreatesprite gRazorLeafParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -5, 8\n\tdelay 60\n\tplaysewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER\n\tcreatesprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 32, 20, 0\n\tcreatesprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 32, -20, 0\n\tdelay 30\n\tplaysewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, -4, ANIM_TARGET, 2\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 10, 4, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1\n\tdelay 20\n\tsetarg 7, 0xFFFF\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nMove_ICE_BALL:\n\tloadspritegfx ANIM_TAG_ICE_CHUNK\n\tloadspritegfx ANIM_TAG_ICE_CRYSTALS\n\tcreatevisualtask AnimTask_GetRolloutCounter, 5, 0\n\tjumpargeq 0, 4, IceBallSetIceBg\nIceBallContinue:\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER\n\tcreatesprite gIceBallChunkSpriteTemplate, ANIM_TARGET, 2, 15, 0, -12, -16, 30, -40\n\tdelay 28\n\tplaysewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_GetRolloutCounter, 5, 0\n\tjumpargeq 0, 0, IceBallWeakest\n\tjumpargeq 0, 1, IceBallWeak\n\tjumpargeq 0, 2, IceBallMediun\n\tjumpargeq 0, 3, IceBallStrong\n\tjumpargeq 0, 4, IceBallStrongest\nIceBallContinue2:\n\tcreatevisualtask AnimTask_GetRolloutCounter, 5, 0\n\tjumpargeq 0, 4, IceBallUnsetIceBg\nIceBallEnd:\n\tend\n\nIceBallSetIceBg:\n\tfadetobg BG_ICE\n\tgoto IceBallContinue\n\nIceBallUnsetIceBg:\n\twaitbgfadein\n\tdelay 45\n\trestorebg\n\twaitbgfadein\n\tgoto IceBallEnd\n\nIceBallWeakest:\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 8, 1, 0\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tgoto IceBallContinue2\n\nIceBallWeak:\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 10, 1, 0\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tgoto IceBallContinue2\n\nIceBallMediun:\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 14, 1, 0\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tgoto IceBallContinue2\n\nIceBallStrong:\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 18, 1, 0\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tgoto IceBallContinue2\n\nIceBallStrongest:\n\tcreatevisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 30, 1, 0\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tcall IceBallImpactShard\n\tgoto IceBallContinue2\n\nIceBallImpactShard:\n\tcreatesprite gIceBallImpactShardSpriteTemplate, ANIM_TARGET, 4, -12, -16\n\treturn\n\nMove_WEATHER_BALL:\n\tloadspritegfx ANIM_TAG_WEATHER_BALL\n\tcreatesprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 8, 1, ANIM_ATTACKER\n\tdelay 8\n\tplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER\n\tcreatesprite gWeatherBallUpSpriteTemplate, ANIM_ATTACKER, 2\n\twaitforvisualfinish\n\tdelay 15\n\tplaysewithpan SE_M_DETECT, 0\n\tcreatesprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_GetWeather, 2\n\tdelay 1\n\tjumpreteq ANIM_WEATHER_NONE, WeatherBallNormal\n\tjumpreteq ANIM_WEATHER_SUN, WeatherBallFire\n\tjumpreteq ANIM_WEATHER_RAIN, WeatherBallWater\n\tjumpreteq ANIM_WEATHER_SANDSTORM, WeatherBallSandstorm\n\tjumpreteq ANIM_WEATHER_HAIL, WeatherBallIce\nWeatherBallNormal:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tcreatesprite gWeatherBallNormalDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 0, 0\n\twaitforvisualfinish\n\tplaysewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 8, 1\n\twaitforvisualfinish\n\tend\n\nWeatherBallFire:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tcreatesprite gWeatherBallFireDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 40, 10\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET\n\tdelay 10\n\tcreatesprite gWeatherBallFireDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, -40, 20\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET\n\tdelay 10\n\tcreatesprite gWeatherBallFireDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 0, 0\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tplaysewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 8, 1\n\twaitforvisualfinish\n\tend\n\nWeatherBallWater:\n\tloadspritegfx ANIM_TAG_SMALL_BUBBLES\n\tcreatesprite gWeatherBallWaterDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 50, 10\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\tdelay 8\n\tcreatesprite gWeatherBallWaterDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, -20, 20\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\tdelay 13\n\tcreatesprite gWeatherBallWaterDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 0, 0\n\tplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 8, 1\n\tplaysewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tend\n\nWeatherBallSandstorm:\n\tloadspritegfx ANIM_TAG_ROCKS\n\tcreatesprite gWeatherBallRockDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 30, 0\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 5\n\tcreatesprite gWeatherBallRockDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, -40, 20\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\tdelay 14\n\tcreatesprite gWeatherBallRockDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 1, 0, 0\n\tplaysewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tplaysewithpan SE_M_STRENGTH, SOUND_PAN_TARGET\n\tcreatesprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 27, 2, 3\n\tcreatesprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 8, 28, 3, 4\n\tcreatesprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -4, 30, 2, 3\n\tcreatesprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 12, 25, 4, 4\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1\n\twaitforvisualfinish\n\tend\n\nWeatherBallIce:\n\tloadspritegfx ANIM_TAG_HAIL\n\tloadspritegfx ANIM_TAG_ICE_CRYSTALS\n\tcreatesprite gWeatherBallIceDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 25, -40, 20\n\tplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET\n\tdelay 10\n\tcreatesprite gWeatherBallIceDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 25, 40, 0\n\tplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET\n\tdelay 10\n\tcreatesprite gWeatherBallIceDownSpriteTemplate, ANIM_TARGET, 2, -30, -100, 25, 25, 0, 0\n\tplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tcall IceCrystalEffectShort\n\twaitforvisualfinish\n\tend\n\nMove_COUNT:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nIceCrystalEffectShort:\n\tcreatesprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 10, 20, 0\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, -5, 10, 0\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 17, -12, 0\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, -15, 15, 0\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 20, 2, 0\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\treturn\n\nIceCrystalEffectLong:\n\tcreatesprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, -10, -10, 1\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 10, 20, 1\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, -29, 0, 1\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 29, -20, 1\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, -5, 10, 1\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 17, -12, 1\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, -20, 0, 1\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, -15, 15, 1\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 26, -5, 1\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\tdelay 4\n\tcreatesprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 20, 2, 1\n\tplaysewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET\n\treturn\n\nIceSpikesEffectShort: @ Unused\n\tloopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 6, 4\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 0, 24, 0\n\tdelay 4\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 8, 24, 0\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -8, 24, 0\n\tdelay 4\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 16, 24, 0\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -16, 24, 0\n\tdelay 4\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 24, 24, 0\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -24, 24, 0\n\tdelay 4\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 32, 24, 0\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -32, 24, 0\n\treturn\n\nIceSpikesEffectLong:\n\tloopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 6, 4\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 0, 24, 1\n\tdelay 4\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 8, 24, 1\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -8, 24, 1\n\tdelay 4\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 16, 24, 1\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -16, 24, 1\n\tdelay 4\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 24, 24, 1\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -24, 24, 1\n\tdelay 4\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 32, 24, 1\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -32, 24, 1\n\tdelay 4\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 40, 24, 1\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -40, 24, 1\n\tdelay 4\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, 48, 24, 1\n\tcreatesprite gIceGroundSpikeSpriteTemplate, ANIM_TARGET, 2, -48, 24, 1\n\treturn\n\nGrantingStarsEffect:\n\tcreatesprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, -15, 0, 0, 0, 32, 60\n\tdelay 8\n\tcreatesprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 12, -5, 0, 0, 32, 60\n\tdelay 8\n\treturn\n\nHealingEffect:\n\tplaysewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER\n\tcreatesprite gHealingBlueStarSpriteTemplate, ANIM_ATTACKER, 2, 0, -5, 0, 0\n\tdelay 7\n\tcreatesprite gHealingBlueStarSpriteTemplate, ANIM_ATTACKER, 2, -15, 10, 0, 0\n\tdelay 7\n\tcreatesprite gHealingBlueStarSpriteTemplate, ANIM_ATTACKER, 2, -15, -15, 0, 0\n\tdelay 7\n\tcreatesprite gHealingBlueStarSpriteTemplate, ANIM_ATTACKER, 2, 10, -5, 0, 0\n\tdelay 7\n\treturn\n\nHealingEffect2:\n\tplaysewithpan SE_M_ABSORB_2, SOUND_PAN_TARGET\n\tcreatesprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, 0, -5, 1, 0\n\tdelay 7\n\tcreatesprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, -15, 10, 1, 0\n\tdelay 7\n\tcreatesprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, -15, -15, 1, 0\n\tdelay 7\n\tcreatesprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, 10, -5, 1, 0\n\tdelay 7\n\treturn\n\nPoisonBubblesEffect:\n\tcreatesprite gPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 10, 10, 0\n\tplaysewithpan SE_M_TOXIC, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, -20, 0\n\tplaysewithpan SE_M_TOXIC, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, -20, 15, 0\n\tplaysewithpan SE_M_TOXIC, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0\n\tplaysewithpan SE_M_TOXIC, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, -20, -20, 0\n\tplaysewithpan SE_M_TOXIC, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 16, -8, 0\n\tplaysewithpan SE_M_TOXIC, SOUND_PAN_TARGET\n\treturn\n\nWaterBubblesEffectShort:\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 0\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 20, -20, 0\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 0\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, -20, 0\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 16, -8, 0\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\treturn\n\nWaterBubblesEffectLong:\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 1\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -28, -10, 1\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 20, -20, 1\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 1\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 27, 8, 1\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, -20, 1\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\tdelay 6\n\tcreatesprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 16, -8, 1\n\tplaysewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET\n\treturn\n\nElectricityEffect:\n\tplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET\n\tcreatesprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 5, 0, 5, 0\n\tdelay 2\n\tcreatesprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -5, 10, 5, 1\n\tdelay 2\n\tcreatesprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 15, 20, 5, 2\n\tdelay 2\n\tcreatesprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -15, -10, 5, 0\n\tdelay 2\n\tcreatesprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 25, 0, 5, 1\n\tdelay 2\n\tcreatesprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -8, 8, 5, 2\n\tdelay 2\n\tcreatesprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 2, -8, 5, 0\n\tdelay 2\n\tcreatesprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -20, 15, 5, 1\n\treturn\n\nConfusionEffect:\n\tloopsewithpan SE_M_DIZZY_PUNCH, SOUND_PAN_TARGET, 13, 6\n\tcreatesprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 0, 3, 90\n\tcreatesprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 51, 3, 90\n\tcreatesprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 102, 3, 90\n\tcreatesprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 153, 3, 90\n\tcreatesprite gConfusionDuckSpriteTemplate, ANIM_TARGET, 2, 0, -15, 204, 3, 90\n\treturn\n\nSetPsychicBackground:\n\tfadetobg BG_PSYCHIC\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_SetPsychicBackground, 5\n\twaitbgfadein\n\treturn\n\nUnsetPsychicBackground:\n\trestorebg\n\twaitbgfadeout\n\tsetarg 7, 0xFFFF\n\twaitbgfadein\n\treturn\n\nSetSkyBg:\n\tjumpifcontest SetSkyBgContest\n\tfadetobg BG_SKY\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 5, -2304, 768, 1, -1\nSetSkyBgContinue:\n\twaitbgfadein\n\treturn\n\nSetSkyBgContest:\n\tfadetobg BG_SKY_CONTESTS\n\twaitbgfadeout\n\tcreatevisualtask AnimTask_StartSlidingBg, 5, 2304, 768, 0, -1\n\tgoto SetSkyBgContinue\n\nUnsetSkyBg:\n\trestorebg\n\twaitbgfadeout\n\tsetarg 7, 0xFFFF\n\twaitbgfadein\n\treturn\n\nSetSolarBeamBg:\n\tcreatevisualtask AnimTask_IsContest, 2\n\tjumprettrue SetSolarBeamBgContest\n\tcreatevisualtask AnimTask_IsTargetPlayerSide, 2\n\tjumpretfalse SetSolarBeamBgOpponent\n\tgoto SetSolarBeamBgPlayer\n\nSetSolarBeamBgContinue:\n\twaitbgfadein\n\treturn\n\nSetSolarBeamBgContest:\n\tfadetobg BG_SOLAR_BEAM_CONTESTS\n\tgoto SetSolarBeamBgContinue\n\nSetSolarBeamBgPlayer:\n\tfadetobg BG_SOLAR_BEAM_PLAYER\n\tgoto SetSolarBeamBgContinue\n\nSetSolarBeamBgOpponent:\n\tfadetobg BG_SOLAR_BEAM_OPPONENT\n\tgoto SetSolarBeamBgContinue\n\nUnsetSolarBeamBg:\n\trestorebg\n\twaitbgfadein\n\treturn\n\nStatus_Poison:\n\tloopsewithpan SE_M_TOXIC, SOUND_PAN_TARGET, 13, 6\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 18, 2\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 12, RGB(30, 0, 31)\n\tend\n\nStatus_Confusion:\n\tloadspritegfx ANIM_TAG_DUCK\n\tcall ConfusionEffect\n\tend\n\nStatus_Burn:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tplaysewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET\n\tcall BurnFlame\n\tcall BurnFlame\n\tcall BurnFlame\n\twaitforvisualfinish\n\tend\n\nBurnFlame:\n\tcreatesprite gBurnFlameSpriteTemplate, ANIM_TARGET, 2, -24, 24, 24, 24, 20, 1, 1\n\tdelay 4\n\treturn\n\nStatus_Infatuation:\n\tloadspritegfx ANIM_TAG_MAGENTA_HEART\n\tplaysewithpan SE_M_CHARM, SOUND_PAN_ATTACKER\n\tcreatesprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0, 20\n\tdelay 15\n\tplaysewithpan SE_M_CHARM, SOUND_PAN_ATTACKER\n\tcreatesprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, -20, 20\n\tdelay 15\n\tplaysewithpan SE_M_CHARM, SOUND_PAN_ATTACKER\n\tcreatesprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 20, 20\n\tend\n\nStatus_Sleep:\n\tloadspritegfx ANIM_TAG_LETTER_Z\n\tplaysewithpan SE_M_SNORE, SOUND_PAN_ATTACKER\n\tcreatesprite gSleepLetterZSpriteTemplate, ANIM_ATTACKER, 2, 4, -10, 16, 0, 0\n\tdelay 30\n\tcreatesprite gSleepLetterZSpriteTemplate, ANIM_ATTACKER, 2, 4, -10, 16, 0, 0\n\tend\n\nStatus_Paralysis:\n\tloadspritegfx ANIM_TAG_SPARK_2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1\n\tcall ElectricityEffect\n\tend\n\nStatus_Freeze:\n\tplaysewithpan SE_M_ICY_WIND, 0\n\tloadspritegfx ANIM_TAG_ICE_CUBE\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\twaitplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET, 17\n\tcreatevisualtask AnimTask_FrozenIceCube, 2\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nStatus_Curse:\n\tloadspritegfx ANIM_TAG_GHOSTLY_SPIRIT\n\tmonbg ANIM_DEF_PARTNER\n\tplaysewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET\n\tcreatesprite gCurseGhostSpriteTemplate, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 14, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nStatus_Nightmare:\n\tloadspritegfx ANIM_TAG_DEVIL\n\tmonbg ANIM_DEF_PARTNER\n\tplaysewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET\n\tcreatesprite gNightmareDevilSpriteTemplate, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 14, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nGeneral_CastformChange:\n\tcreatevisualtask AnimTask_IsMonInvisible, 2\n\tjumpreteq TRUE, CastformChangeSkipAnim\n\tgoto CastformChangeContinue\n\nCastformChangeContinue:\n\tmonbg ANIM_ATTACKER\n\tplaysewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER, 48\n\tcreatevisualtask AnimTask_TransformMon, 2, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tend\n\nCastformChangeSkipAnim:\n\tcreatevisualtask AnimTask_CastformGfxChange, 2, 1\n\tend\n\nGeneral_StatsChange:\n\tcreatevisualtask AnimTask_StatsChange, 5\n\twaitforvisualfinish\n\tend\n\nGeneral_SubstituteFade:\n\tmonbg ANIM_ATTACKER\n\tcreatevisualtask AnimTask_SubstituteFadeToInvisible, 5\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 16, RGB_WHITE\n\twaitforvisualfinish\n\tdelay 1\n\tclearmonbg ANIM_ATTACKER\n\tdelay 2\n\tblendoff\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 0, RGB_WHITE\n\tcreatevisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, TRUE\n\tend\n\nGeneral_SubstituteAppear:\n\tcreatevisualtask AnimTask_MonToSubstitute, 2\n\tend\n\nGeneral_BaitThrow:\n\tcreatevisualtask AnimTask_SafariOrGhost_DecideAnimSides, 2, 0\n\tcreatevisualtask AnimTask_LoadBaitGfx, 2\n\tdelay 0\n\twaitplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER, 22\n\tcreatesprite gSafariBaitSpriteTemplate, ANIM_TARGET, 3, -18, 12, 0, 32\n\tdelay 50\n\tloopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_TARGET, 19, 2\n\tcreatevisualtask AnimTask_SwayMon, 5, 1, 8, 1536, 2, ANIM_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_FreeBaitGfx, 2\n\tend\n\nGeneral_ItemKnockoff:\n\tloadspritegfx ANIM_TAG_ITEM_BAG\n\tcreatesprite gKnockOffItemSpriteTemplate, ANIM_TARGET, 2\n\tend\n\nGeneral_TurnTrap:\n\tcreatevisualtask AnimTask_GetTrappedMoveAnimId, 5\n\tjumpargeq 0, TRAP_ANIM_FIRE_SPIN, Status_FireSpin\n\tjumpargeq 0, TRAP_ANIM_WHIRLPOOL, Status_Whirlpool\n\tjumpargeq 0, TRAP_ANIM_CLAMP,     Status_Clamp\n\tjumpargeq 0, TRAP_ANIM_SAND_TOMB, Status_SandTomb\n\tgoto Status_BindWrap\n\nStatus_BindWrap:\n\tloadspritegfx ANIM_TAG_TENDRILS\n\tloopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 6, 2\n\tcreatesprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 4, 0, 16, 0, 1\n\tdelay 7\n\tcreatesprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 2, 0, 8, 1, 1\n\tdelay 3\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1\n\tdelay 20\n\tsetarg 7, 0xFFFF\n\tplaysewithpan SE_M_BIND, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tend\n\nStatus_FireSpin:\n\tloadspritegfx ANIM_TAG_SMALL_EMBER\n\tplaysewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 30, 1\n\tcall FireSpinEffect\n\tcall FireSpinEffect\n\twaitforvisualfinish\n\tstopsound\n\tend\n\nStatus_Whirlpool:\n\tloadspritegfx ANIM_TAG_WATER_ORB\n\tmonbg ANIM_DEF_PARTNER\n\tsplitbgprio ANIM_TARGET\n\tsetalpha 12, 8\n\tdelay 0\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 7, RGB(0, 13, 23)\n\tplaysewithpan SE_M_WHIRLPOOL, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 30, 1\n\tcall WhirlpoolEffect\n\tcall WhirlpoolEffect\n\tdelay 12\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 7, 0, RGB(0, 13, 23)\n\twaitforvisualfinish\n\tstopsound\n\tclearmonbg ANIM_DEF_PARTNER\n\tend\n\nStatus_Clamp:\n\tloadspritegfx ANIM_TAG_CLAMP\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET\n\tcreatesprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 2, 819, 0, 10\n\tcreatesprite gClampJawSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 6, -819, 0, 10\n\tdelay 10\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\twaitforvisualfinish\n\tend\n\nStatus_SandTomb:\n\tloadspritegfx ANIM_TAG_MUD_SAND\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 7, RGB(19, 17, 0)\n\tcreatevisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 30, 1\n\tplaysewithpan SE_M_SAND_TOMB, SOUND_PAN_TARGET\n\tcall SandTombSwirlingDirt\n\tcall SandTombSwirlingDirt\n\tdelay 22\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 7, 0, RGB(19, 17, 0)\n\twaitforvisualfinish\n\tstopsound\n\tend\n\nGeneral_HeldItemEffect:\n\tloadspritegfx ANIM_TAG_THIN_RING\n\tloadspritegfx ANIM_TAG_SPARKLE_2\n\tdelay 0\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_RotateMonToSideAndRestore, 2, 16, 128, ANIM_ATTACKER, 2\n\twaitforvisualfinish\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_RotateMonToSideAndRestore, 2, 16, 128, ANIM_ATTACKER, 2\n\twaitforvisualfinish\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_RotateMonToSideAndRestore, 2, 16, 128, ANIM_ATTACKER, 2\n\twaitforvisualfinish\n\tplaysewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER\n\tcall GrantingStarsEffect\n\twaitforvisualfinish\n\tplaysewithpan SE_SHINY, SOUND_PAN_ATTACKER\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 3, 7, 0, RGB(17, 31, 25)\n\tcreatesprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0\n\twaitforvisualfinish\n\tend\n\nGeneral_SmokeballEscape:\n\tloadspritegfx ANIM_TAG_PINK_CLOUD\n\tmonbg ANIM_ATTACKER\n\tsetalpha 12, 4\n\tdelay 0\n\tplaysewithpan SE_BALL_OPEN, SOUND_PAN_TARGET\n\tcreatesprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_TARGET, 0, 0, 32, 28, 30\n\tdelay 4\n\tplaysewithpan SE_BALL_OPEN, SOUND_PAN_TARGET\n\tcreatesprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 127, 2, 12, 20, 30\n\tdelay 12\n\tplaysewithpan SE_BALL_OPEN, SOUND_PAN_TARGET\n\tcreatesprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 126, 2, -28, 4, 30\n\tdelay 12\n\tplaysewithpan SE_BALL_OPEN, SOUND_PAN_TARGET\n\tcreatesprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 124, 2, 14, -20, 30\n\tdelay 4\n\tplaysewithpan SE_BALL_OPEN, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_AttackerFadeToInvisible, 2, 2\n\tcreatesprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 123, 3, 4, 4, 30\n\tdelay 14\n\tplaysewithpan SE_BALL_OPEN, SOUND_PAN_TARGET\n\tcreatesprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 122, 3, -14, 18, 46\n\tdelay 0\n\tcreatesprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 121, 3, 14, -14, 46\n\tdelay 0\n\tcreatesprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 120, 3, -12, -10, 46\n\tdelay 0\n\tcreatesprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 119, 3, 14, 14, 46\n\tdelay 0\n\tcreatesprite gSmokeBallEscapeCloudSpriteTemplate, ANIM_ATTACKER, 118, 3, 0, 0, 46\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tinvisible ANIM_ATTACKER\n\tdelay 0\n\tblendoff\n\tend\n\nGeneral_FocusBand:\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_ATTACKER, 7, 0, 9, RGB_RED\n\tplaysewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_SlideMonForFocusBand, 5, 30, 128, 0, 1, 2, 0, 1\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_ATTACKER, 4, 9, 0, RGB_RED\n\twaitforvisualfinish\n\tdelay 6\n\tcreatesprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 0, 0, 0, 15\n\tend\n\nGeneral_Rain:\n\tloadspritegfx ANIM_TAG_RAIN_DROPS\n\tplaysewithpan SE_M_RAIN_DANCE, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 2, 0, 4, RGB_BLACK\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_CreateRaindrops, 2, 0, 3, 60\n\tcreatevisualtask AnimTask_CreateRaindrops, 2, 0, 3, 60\n\tdelay 50\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG | F_PAL_BATTLERS_2, 2, 4, 0, RGB_BLACK\n\twaitforvisualfinish\n\tend\n\nGeneral_Sun:\n\tgoto Move_SUNNY_DAY\n\nGeneral_Sandstorm:\n\tgoto Move_SANDSTORM\n\nGeneral_Hail:\n\tgoto Move_HAIL\n\nGeneral_LeechSeedDrain:\n\tcreatevisualtask AnimTask_GetBattlersFromArg, 5\n\tdelay 0\n\tgoto Move_ABSORB\n\nGeneral_MonHit:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tmonbg ANIM_TARGET\n\tsetalpha 12, 8\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_TARGET\n\tblendoff\n\tend\n\nGeneral_ItemSteal:\n\tloadspritegfx ANIM_TAG_ITEM_BAG\n\tcreatevisualtask AnimTask_SetAnimAttackerAndTargetForEffectAtk, 2\n\tcreatevisualtask AnimTask_SetTargetToEffectBattler, 2  @ Redundant with above\n\tdelay 1\n\tcreatesprite gItemStealSpriteTemplate, ANIM_ATTACKER, 2, 0, -5, 10, 2, -1\n\tend\n\nGeneral_SnatchMove:\n\tloadspritegfx ANIM_TAG_ITEM_BAG\n\tcreatevisualtask AnimTask_SetAnimAttackerAndTargetForEffectTgt, 2\n\tcall SnatchMoveTrySwapFromSubstitute\n\tdelay 1\n\tcreatevisualtask AnimTask_SwayMon, 2, 0, 5, 5120, 4, ANIM_TARGET\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_IsTargetSameSide, 2\n\tjumpretfalse SnatchOpposingMonMove\n\tgoto SnatchPartnerMonMove\n\nSnatchMoveContinue:\n\twaitforvisualfinish\n\tcall SnatchMoveTrySwapToSubstitute\n\tend\n\nSnatchOpposingMonMove:\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_SnatchOpposingMonMove, 2\n\tgoto SnatchMoveContinue\n\nSnatchPartnerMonMove:\n\tplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER\n\tcreatevisualtask AnimTask_SnatchPartnerMove, 2\n\tgoto SnatchMoveContinue\n\nGeneral_FutureSightHit:\n\tcreatevisualtask AnimTask_SetAnimTargetToBattlerTarget, 2\n\tmonbg ANIM_DEF_PARTNER\n\tplaysewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER\n\tcall SetPsychicBackground\n\tsetalpha 8, 8\n\tplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET\n\twaitplaysewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 8\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 15, 1\n\tcreatevisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 15, ANIM_TARGET, 1\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 24, 1\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\twaitforvisualfinish\n\tdelay 1\n\tcall UnsetPsychicBackground\n\tend\n\nGeneral_DoomDesireHit:\n\tcreatevisualtask AnimTask_SetAnimTargetToBattlerTarget, 2\n\tloadspritegfx ANIM_TAG_EXPLOSION\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 16, RGB_WHITE\n\twaitforvisualfinish\n\tdelay 10\n\tcreatevisualtask AnimTask_DoomDesireLightBeam, 5\n\tdelay 9\n\tplaysewithpan SE_M_CONFUSE_RAY, SOUND_PAN_ATTACKER\n\tdelay 9\n\tplaysewithpan SE_M_CONFUSE_RAY, 0\n\tdelay 9\n\tplaysewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET\n\tdelay 25\n\tcreatevisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 20, 1\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 1, 1\n\tdelay 6\n\tplaysewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET\n\tcreatesprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 1, 1\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 16, 0, RGB_WHITE\n\twaitforvisualfinish\n\tend\n\nGeneral_FocusPunchSetUp:\n\tloadspritegfx ANIM_TAG_FOCUS_ENERGY\n\tplaysewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER\n\tcall EndureEffect\n\tdelay 8\n\tcreatevisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1\n\tcall EndureEffect\n\tdelay 8\n\tcall EndureEffect\n\twaitforvisualfinish\n\tend\n\nGeneral_IngrainHeal:\n\tloadspritegfx ANIM_TAG_ORBS\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 4, RGB(13, 31, 12)\n\twaitforvisualfinish\n\tdelay 3\n\tcall AbsorbEffect\n\twaitforvisualfinish\n\tdelay 15\n\tcall HealingEffect\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 4, 0, RGB(13, 31, 12)\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tend\n\nGeneral_WishHeal:\n\tloadspritegfx ANIM_TAG_BLUE_STAR\n\tloadspritegfx ANIM_TAG_SPARKLE_2\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 10, RGB_BLACK\n\twaitforvisualfinish\n\tplaysewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER\n\tcall GrantingStarsEffect\n\twaitforvisualfinish\n\tcall HealingEffect\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 10, 0, RGB_BLACK\n\tend\n\nGeneral_MonScared:\n\tcreatevisualtask AnimTask_SafariOrGhost_DecideAnimSides, 2, 1\n\twaitforvisualfinish\n\tloadspritegfx ANIM_TAG_SWEAT_BEAD\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 0, 10, RGB(0, 23, 25)\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 10, 1\n\tdelay 20\n\tcreatesprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 0, 1\n\tplaysewithpan SE_M_SKETCH, SOUND_PAN_TARGET\n\tcreatesprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 1, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1\n\tcreatevisualtask AnimTask_StretchTargetUp, 3\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, 2, 10, 0, RGB(0, 23, 25)\n\twaitforvisualfinish\n\tend\n\nGeneral_GhostGetOut:\n\tcreatevisualtask AnimTask_SafariOrGhost_DecideAnimSides, 2, 1\n\twaitforvisualfinish\n\tfadetobg BG_GHOST\n\twaitbgfadeout\n\tmonbg_static ANIM_ATTACKER\n\tcreatevisualtask AnimTask_GhostGetOut, 2\n\twaitbgfadein\n\tloopsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET, 20, 3\n\twaitforvisualfinish\n\tclearmonbg_static ANIM_ATTACKER\n\tdelay 1\n\tloadspritegfx ANIM_TAG_SWEAT_BEAD\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, -1, 0, 6, RGB(21, 22, 26)\n\tcreatesprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 0, 1\n\tcreatesprite gSprayWaterDropletSpriteTemplate, ANIM_TARGET, 5, 1, 1\n\tcreatevisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1\n\tcreatevisualtask AnimTask_StretchTargetUp, 3\n\twaitforvisualfinish\n\tcreatesprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_TARGET, -1, 6, 0, RGB(21, 22, 26)\n\twaitforvisualfinish\n\trestorebg\n\twaitbgfadein\n\tend\n\nGeneral_SilphScoped:\n\tmonbg ANIM_ATTACKER\n\tplaysewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER\n\twaitplaysewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER, 48\n\tcreatevisualtask AnimTask_TransformMon, 2, 255\n\twaitsound\n\twaitforvisualfinish\n\tclearmonbg ANIM_ATTACKER\n\tend\n\nGeneral_SafariRockThrow:\n\tcreatevisualtask AnimTask_SafariOrGhost_DecideAnimSides, 2, 0\n\twaitforvisualfinish\n\tloadspritegfx ANIM_TAG_ROCKS\n\tloadspritegfx ANIM_TAG_IMPACT\n\tdelay 0\n\twaitplaysewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER, 22\n\tcreatesprite gSafariRockTemplate, ANIM_TARGET, 3, -17, 14, 8, 0\n\tdelay 50\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tdelay 0\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -4, -20, 1, 2\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\twaitforvisualfinish\n\tend\n\nGeneral_SafariReaction:\n\tcreatevisualtask AnimTask_SafariGetReaction, 2\n\twaitforvisualfinish\n\tjumpreteq B_MSG_MON_WATCHING, SafariReaction_WatchingCarefully\n\tjumpreteq B_MSG_MON_ANGRY, SafariReaction_Angry\n\tjumpreteq B_MSG_MON_EATING, SafariReaction_Eating\n\tend\n\nSafariReaction_WatchingCarefully:\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_RotateMonToSideAndRestore, 2, 16, 96, 0, 2\n\twaitforvisualfinish\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_RotateMonToSideAndRestore, 2, 16, -96, 0, 2\n\tend\n\nSafariReaction_Angry:\n\tloadspritegfx ANIM_TAG_ANGER\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, 20, -20\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET\n\twaitforvisualfinish\n\tdelay 12\n\tcreatesprite gAngerMarkSpriteTemplate, ANIM_TARGET, 2, 1, -20, -20\n\tplaysewithpan SE_M_SWAGGER2, SOUND_PAN_TARGET\n\tend\n\nSafariReaction_Eating:\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_RotateMonToSideAndRestore, 2, 8, 136, 0, 2\n\twaitforvisualfinish\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_TARGET\n\tcreatevisualtask AnimTask_RotateMonToSideAndRestore, 2, 8, 136, 0, 2\n\tend\n\nSnatchMoveTrySwapFromSubstitute:\n\tcreatevisualtask AnimTask_IsAttackerBehindSubstitute, 2\n\tjumprettrue SnatchMoveSwapSubstituteForMon\nSnatchMoveTrySwapFromSubstituteEnd:\n\twaitforvisualfinish\n\treturn\n\nSnatchMoveSwapSubstituteForMon:\n\tcreatevisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, TRUE\n\twaitforvisualfinish\n\tgoto SnatchMoveTrySwapFromSubstituteEnd\n\nSnatchMoveTrySwapToSubstitute:\n\tcreatevisualtask AnimTask_IsAttackerBehindSubstitute, 2\n\tjumprettrue SnatchMoveSwapMonForSubstitute\nSnatchMoveTrySwapToSubstituteEnd:\n\twaitforvisualfinish\n\treturn\n\nSnatchMoveSwapMonForSubstitute:\n\tcreatevisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, FALSE\n\twaitforvisualfinish\n\tgoto SnatchMoveTrySwapToSubstituteEnd\n\n@ Healthbox blue flash effect on level up\nSpecial_LevelUp:\n\tplaysewithpan SE_EXP_MAX, 0\n\tcreatevisualtask AnimTask_LoadHealthboxPalsForLevelUp, 2\n\tdelay 0\n\tcreatevisualtask AnimTask_FlashHealthboxOnLevelUp, 5, 0, 0\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_FreeHealthboxPalsForLevelUp, 2\n\tend\n\nSpecial_SwitchOutPlayerMon:\n\tcreatevisualtask AnimTask_SwitchOutBallEffect, 2\n\tdelay 10\n\tcreatevisualtask AnimTask_SwitchOutShrinkMon, 2\n\tend\n\nSpecial_SwitchOutOpponentMon:\n\tcreatevisualtask AnimTask_SwitchOutBallEffect, 2\n\tdelay 10\n\tcreatevisualtask AnimTask_SwitchOutShrinkMon, 2\n\tend\n\nSpecial_BallThrow:\n\tcreatevisualtask AnimTask_LoadBallGfx, 2\n\tdelay 0\n\tplaysewithpan SE_BALL_THROW, 0\n\tcreatevisualtask AnimTask_ThrowBall, 2\n\tcreatevisualtask AnimTask_IsBallBlockedByTrainerOrDodged, 2\n\tjumpreteq -1, BallThrowTrainerBlock\n\tjumpreteq -2, BallThrowGhostDodged\nBallThrowEnd:\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_FreeBallGfx, 2\n\tend\n\nBallThrowTrainerBlock:\n\tloadspritegfx ANIM_TAG_IMPACT\n\tdelay 25\n\tmonbg ANIM_DEF_PARTNER\n\tsetalpha 12, 8\n\tdelay 0\n\tplaysewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET\n\tcreatesprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -4, -20, ANIM_TARGET, 2\n\twaitforvisualfinish\n\tclearmonbg ANIM_DEF_PARTNER\n\tblendoff\n\tgoto BallThrowEnd\n\nBallThrowGhostDodged:\n\tdelay 16\n\tcreatevisualtask AnimTask_WindUpLunge, 2, ANIM_TARGET, 48, 6, 16, 48, -48, 16\n\tplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_TARGET\n\twaitplaysewithpan SE_M_TAKE_DOWN, SOUND_PAN_TARGET, 48\n\twaitforvisualfinish\n\tgoto BallThrowEnd\n\nSpecial_BallThrowWithTrainer:\n\tcreatevisualtask AnimTask_LoadBallGfx, 2\n\tdelay 0\n\tcreatevisualtask AnimTask_ThrowBallSpecial, 2\n\twaitforvisualfinish\n\tcreatevisualtask AnimTask_FreeBallGfx, 2\n\tend\n\nSpecial_SubstituteToMon:\n\tcreatevisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, TRUE\n\tend\n\nSpecial_MonToSubstitute:\n\tcreatevisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, FALSE\n\tend\n"
  },
  {
    "path": "data/battle_scripts_1.s",
    "content": "#include \"constants/global.h\"\n#include \"constants/moves.h\"\n#include \"constants/battle.h\"\n#include \"constants/battle_move_effects.h\"\n#include \"constants/battle_script_commands.h\"\n#include \"constants/battle_anim.h\"\n#include \"constants/items.h\"\n#include \"constants/abilities.h\"\n#include \"constants/species.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/songs.h\"\n#include \"constants/trainers.h\"\n#include \"constants/game_stat.h\"\n#include \"constants/battle_string_ids.h\"\n\t.include \"asm/macros/battle_script.inc\"\n@ Define these here since misc_constants.inc conflicts with the C headers\n\t.set NULL, 0\n\t.set FALSE, 0\n\t.set TRUE, 1\n\t.section script_data, \"aw\", %progbits\n\t.align 2\n\ngBattleScriptsForMoveEffects::\n\t.4byte BattleScript_EffectHit                    @ EFFECT_HIT\n\t.4byte BattleScript_EffectSleep                  @ EFFECT_SLEEP\n\t.4byte BattleScript_EffectPoisonHit              @ EFFECT_POISON_HIT\n\t.4byte BattleScript_EffectAbsorb                 @ EFFECT_ABSORB\n\t.4byte BattleScript_EffectBurnHit                @ EFFECT_BURN_HIT\n\t.4byte BattleScript_EffectFreezeHit              @ EFFECT_FREEZE_HIT\n\t.4byte BattleScript_EffectParalyzeHit            @ EFFECT_PARALYZE_HIT\n\t.4byte BattleScript_EffectExplosion              @ EFFECT_EXPLOSION\n\t.4byte BattleScript_EffectDreamEater             @ EFFECT_DREAM_EATER\n\t.4byte BattleScript_EffectMirrorMove             @ EFFECT_MIRROR_MOVE\n\t.4byte BattleScript_EffectAttackUp               @ EFFECT_ATTACK_UP\n\t.4byte BattleScript_EffectDefenseUp              @ EFFECT_DEFENSE_UP\n\t.4byte BattleScript_EffectHit                    @ EFFECT_SPEED_UP\n\t.4byte BattleScript_EffectSpecialAttackUp        @ EFFECT_SPECIAL_ATTACK_UP\n\t.4byte BattleScript_EffectHit                    @ EFFECT_SPECIAL_DEFENSE_UP\n\t.4byte BattleScript_EffectHit                    @ EFFECT_ACCURACY_UP\n\t.4byte BattleScript_EffectEvasionUp              @ EFFECT_EVASION_UP\n\t.4byte BattleScript_EffectHit                    @ EFFECT_ALWAYS_HIT\n\t.4byte BattleScript_EffectAttackDown             @ EFFECT_ATTACK_DOWN\n\t.4byte BattleScript_EffectDefenseDown            @ EFFECT_DEFENSE_DOWN\n\t.4byte BattleScript_EffectSpeedDown              @ EFFECT_SPEED_DOWN\n\t.4byte BattleScript_EffectHit                    @ EFFECT_SPECIAL_ATTACK_DOWN\n\t.4byte BattleScript_EffectHit                    @ EFFECT_SPECIAL_DEFENSE_DOWN\n\t.4byte BattleScript_EffectAccuracyDown           @ EFFECT_ACCURACY_DOWN\n\t.4byte BattleScript_EffectEvasionDown            @ EFFECT_EVASION_DOWN\n\t.4byte BattleScript_EffectHaze                   @ EFFECT_HAZE\n\t.4byte BattleScript_EffectBide                   @ EFFECT_BIDE\n\t.4byte BattleScript_EffectRampage                @ EFFECT_RAMPAGE\n\t.4byte BattleScript_EffectRoar                   @ EFFECT_ROAR\n\t.4byte BattleScript_EffectMultiHit               @ EFFECT_MULTI_HIT\n\t.4byte BattleScript_EffectConversion             @ EFFECT_CONVERSION\n\t.4byte BattleScript_EffectFlinchHit              @ EFFECT_FLINCH_HIT\n\t.4byte BattleScript_EffectRestoreHp              @ EFFECT_RESTORE_HP\n\t.4byte BattleScript_EffectToxic                  @ EFFECT_TOXIC\n\t.4byte BattleScript_EffectPayDay                 @ EFFECT_PAY_DAY\n\t.4byte BattleScript_EffectLightScreen            @ EFFECT_LIGHT_SCREEN\n\t.4byte BattleScript_EffectTriAttack              @ EFFECT_TRI_ATTACK\n\t.4byte BattleScript_EffectRest                   @ EFFECT_REST\n\t.4byte BattleScript_EffectOHKO                   @ EFFECT_OHKO\n\t.4byte BattleScript_EffectRazorWind              @ EFFECT_RAZOR_WIND\n\t.4byte BattleScript_EffectSuperFang              @ EFFECT_SUPER_FANG\n\t.4byte BattleScript_EffectDragonRage             @ EFFECT_DRAGON_RAGE\n\t.4byte BattleScript_EffectTrap                   @ EFFECT_TRAP\n\t.4byte BattleScript_EffectHit                    @ EFFECT_HIGH_CRITICAL\n\t.4byte BattleScript_EffectDoubleHit              @ EFFECT_DOUBLE_HIT\n\t.4byte BattleScript_EffectRecoilIfMiss           @ EFFECT_RECOIL_IF_MISS\n\t.4byte BattleScript_EffectMist                   @ EFFECT_MIST\n\t.4byte BattleScript_EffectFocusEnergy            @ EFFECT_FOCUS_ENERGY\n\t.4byte BattleScript_EffectRecoil                 @ EFFECT_RECOIL\n\t.4byte BattleScript_EffectConfuse                @ EFFECT_CONFUSE\n\t.4byte BattleScript_EffectAttackUp2              @ EFFECT_ATTACK_UP_2\n\t.4byte BattleScript_EffectDefenseUp2             @ EFFECT_DEFENSE_UP_2\n\t.4byte BattleScript_EffectSpeedUp2               @ EFFECT_SPEED_UP_2\n\t.4byte BattleScript_EffectSpecialAttackUp2       @ EFFECT_SPECIAL_ATTACK_UP_2\n\t.4byte BattleScript_EffectSpecialDefenseUp2      @ EFFECT_SPECIAL_DEFENSE_UP_2\n\t.4byte BattleScript_EffectHit                    @ EFFECT_ACCURACY_UP_2\n\t.4byte BattleScript_EffectHit                    @ EFFECT_EVASION_UP_2\n\t.4byte BattleScript_EffectTransform              @ EFFECT_TRANSFORM\n\t.4byte BattleScript_EffectAttackDown2            @ EFFECT_ATTACK_DOWN_2\n\t.4byte BattleScript_EffectDefenseDown2           @ EFFECT_DEFENSE_DOWN_2\n\t.4byte BattleScript_EffectSpeedDown2             @ EFFECT_SPEED_DOWN_2\n\t.4byte BattleScript_EffectHit                    @ EFFECT_SPECIAL_ATTACK_DOWN_2\n\t.4byte BattleScript_EffectSpecialDefenseDown2    @ EFFECT_SPECIAL_DEFENSE_DOWN_2\n\t.4byte BattleScript_EffectHit                    @ EFFECT_ACCURACY_DOWN_2\n\t.4byte BattleScript_EffectHit                    @ EFFECT_EVASION_DOWN_2\n\t.4byte BattleScript_EffectReflect                @ EFFECT_REFLECT\n\t.4byte BattleScript_EffectPoison                 @ EFFECT_POISON\n\t.4byte BattleScript_EffectParalyze               @ EFFECT_PARALYZE\n\t.4byte BattleScript_EffectAttackDownHit          @ EFFECT_ATTACK_DOWN_HIT\n\t.4byte BattleScript_EffectDefenseDownHit         @ EFFECT_DEFENSE_DOWN_HIT\n\t.4byte BattleScript_EffectSpeedDownHit           @ EFFECT_SPEED_DOWN_HIT\n\t.4byte BattleScript_EffectSpecialAttackDownHit   @ EFFECT_SPECIAL_ATTACK_DOWN_HIT\n\t.4byte BattleScript_EffectSpecialDefenseDownHit  @ EFFECT_SPECIAL_DEFENSE_DOWN_HIT\n\t.4byte BattleScript_EffectAccuracyDownHit        @ EFFECT_ACCURACY_DOWN_HIT\n\t.4byte BattleScript_EffectHit                    @ EFFECT_EVASION_DOWN_HIT\n\t.4byte BattleScript_EffectSkyAttack              @ EFFECT_SKY_ATTACK\n\t.4byte BattleScript_EffectConfuseHit             @ EFFECT_CONFUSE_HIT\n\t.4byte BattleScript_EffectTwineedle              @ EFFECT_TWINEEDLE\n\t.4byte BattleScript_EffectHit                    @ EFFECT_VITAL_THROW\n\t.4byte BattleScript_EffectSubstitute             @ EFFECT_SUBSTITUTE\n\t.4byte BattleScript_EffectRecharge               @ EFFECT_RECHARGE\n\t.4byte BattleScript_EffectRage                   @ EFFECT_RAGE\n\t.4byte BattleScript_EffectMimic                  @ EFFECT_MIMIC\n\t.4byte BattleScript_EffectMetronome              @ EFFECT_METRONOME\n\t.4byte BattleScript_EffectLeechSeed              @ EFFECT_LEECH_SEED\n\t.4byte BattleScript_EffectSplash                 @ EFFECT_SPLASH\n\t.4byte BattleScript_EffectDisable                @ EFFECT_DISABLE\n\t.4byte BattleScript_EffectLevelDamage            @ EFFECT_LEVEL_DAMAGE\n\t.4byte BattleScript_EffectPsywave                @ EFFECT_PSYWAVE\n\t.4byte BattleScript_EffectCounter                @ EFFECT_COUNTER\n\t.4byte BattleScript_EffectEncore                 @ EFFECT_ENCORE\n\t.4byte BattleScript_EffectPainSplit              @ EFFECT_PAIN_SPLIT\n\t.4byte BattleScript_EffectSnore                  @ EFFECT_SNORE\n\t.4byte BattleScript_EffectConversion2            @ EFFECT_CONVERSION_2\n\t.4byte BattleScript_EffectLockOn                 @ EFFECT_LOCK_ON\n\t.4byte BattleScript_EffectSketch                 @ EFFECT_SKETCH\n\t.4byte BattleScript_EffectHit                    @ EFFECT_UNUSED_60\n\t.4byte BattleScript_EffectSleepTalk              @ EFFECT_SLEEP_TALK\n\t.4byte BattleScript_EffectDestinyBond            @ EFFECT_DESTINY_BOND\n\t.4byte BattleScript_EffectFlail                  @ EFFECT_FLAIL\n\t.4byte BattleScript_EffectSpite                  @ EFFECT_SPITE\n\t.4byte BattleScript_EffectHit                    @ EFFECT_FALSE_SWIPE\n\t.4byte BattleScript_EffectHealBell               @ EFFECT_HEAL_BELL\n\t.4byte BattleScript_EffectHit                    @ EFFECT_QUICK_ATTACK\n\t.4byte BattleScript_EffectTripleKick             @ EFFECT_TRIPLE_KICK\n\t.4byte BattleScript_EffectThief                  @ EFFECT_THIEF\n\t.4byte BattleScript_EffectMeanLook               @ EFFECT_MEAN_LOOK\n\t.4byte BattleScript_EffectNightmare              @ EFFECT_NIGHTMARE\n\t.4byte BattleScript_EffectMinimize               @ EFFECT_MINIMIZE\n\t.4byte BattleScript_EffectCurse                  @ EFFECT_CURSE\n\t.4byte BattleScript_EffectHit                    @ EFFECT_UNUSED_6E\n\t.4byte BattleScript_EffectProtect                @ EFFECT_PROTECT\n\t.4byte BattleScript_EffectSpikes                 @ EFFECT_SPIKES\n\t.4byte BattleScript_EffectForesight              @ EFFECT_FORESIGHT\n\t.4byte BattleScript_EffectPerishSong             @ EFFECT_PERISH_SONG\n\t.4byte BattleScript_EffectSandstorm              @ EFFECT_SANDSTORM\n\t.4byte BattleScript_EffectEndure                 @ EFFECT_ENDURE\n\t.4byte BattleScript_EffectRollout                @ EFFECT_ROLLOUT\n\t.4byte BattleScript_EffectSwagger                @ EFFECT_SWAGGER\n\t.4byte BattleScript_EffectFuryCutter             @ EFFECT_FURY_CUTTER\n\t.4byte BattleScript_EffectAttract                @ EFFECT_ATTRACT\n\t.4byte BattleScript_EffectReturn                 @ EFFECT_RETURN\n\t.4byte BattleScript_EffectPresent                @ EFFECT_PRESENT\n\t.4byte BattleScript_EffectFrustration            @ EFFECT_FRUSTRATION\n\t.4byte BattleScript_EffectSafeguard              @ EFFECT_SAFEGUARD\n\t.4byte BattleScript_EffectThawHit                @ EFFECT_THAW_HIT\n\t.4byte BattleScript_EffectMagnitude              @ EFFECT_MAGNITUDE\n\t.4byte BattleScript_EffectBatonPass              @ EFFECT_BATON_PASS\n\t.4byte BattleScript_EffectHit                    @ EFFECT_PURSUIT\n\t.4byte BattleScript_EffectRapidSpin              @ EFFECT_RAPID_SPIN\n\t.4byte BattleScript_EffectSonicboom              @ EFFECT_SONICBOOM\n\t.4byte BattleScript_EffectHit                    @ EFFECT_UNUSED_83\n\t.4byte BattleScript_EffectMorningSun             @ EFFECT_MORNING_SUN\n\t.4byte BattleScript_EffectSynthesis              @ EFFECT_SYNTHESIS\n\t.4byte BattleScript_EffectMoonlight              @ EFFECT_MOONLIGHT\n\t.4byte BattleScript_EffectHiddenPower            @ EFFECT_HIDDEN_POWER\n\t.4byte BattleScript_EffectRainDance              @ EFFECT_RAIN_DANCE\n\t.4byte BattleScript_EffectSunnyDay               @ EFFECT_SUNNY_DAY\n\t.4byte BattleScript_EffectDefenseUpHit           @ EFFECT_DEFENSE_UP_HIT\n\t.4byte BattleScript_EffectAttackUpHit            @ EFFECT_ATTACK_UP_HIT\n\t.4byte BattleScript_EffectAllStatsUpHit          @ EFFECT_ALL_STATS_UP_HIT\n\t.4byte BattleScript_EffectHit                    @ EFFECT_UNUSED_8D\n\t.4byte BattleScript_EffectBellyDrum              @ EFFECT_BELLY_DRUM\n\t.4byte BattleScript_EffectPsychUp                @ EFFECT_PSYCH_UP\n\t.4byte BattleScript_EffectMirrorCoat             @ EFFECT_MIRROR_COAT\n\t.4byte BattleScript_EffectSkullBash              @ EFFECT_SKULL_BASH\n\t.4byte BattleScript_EffectTwister                @ EFFECT_TWISTER\n\t.4byte BattleScript_EffectEarthquake             @ EFFECT_EARTHQUAKE\n\t.4byte BattleScript_EffectFutureSight            @ EFFECT_FUTURE_SIGHT\n\t.4byte BattleScript_EffectGust                   @ EFFECT_GUST\n\t.4byte BattleScript_EffectStomp                  @ EFFECT_FLINCH_MINIMIZE_HIT\n\t.4byte BattleScript_EffectSolarBeam              @ EFFECT_SOLAR_BEAM\n\t.4byte BattleScript_EffectThunder                @ EFFECT_THUNDER\n\t.4byte BattleScript_EffectTeleport               @ EFFECT_TELEPORT\n\t.4byte BattleScript_EffectBeatUp                 @ EFFECT_BEAT_UP\n\t.4byte BattleScript_EffectSemiInvulnerable       @ EFFECT_SEMI_INVULNERABLE\n\t.4byte BattleScript_EffectDefenseCurl            @ EFFECT_DEFENSE_CURL\n\t.4byte BattleScript_EffectSoftboiled             @ EFFECT_SOFTBOILED\n\t.4byte BattleScript_EffectFakeOut                @ EFFECT_FAKE_OUT\n\t.4byte BattleScript_EffectUproar                 @ EFFECT_UPROAR\n\t.4byte BattleScript_EffectStockpile              @ EFFECT_STOCKPILE\n\t.4byte BattleScript_EffectSpitUp                 @ EFFECT_SPIT_UP\n\t.4byte BattleScript_EffectSwallow                @ EFFECT_SWALLOW\n\t.4byte BattleScript_EffectHit                    @ EFFECT_UNUSED_A3\n\t.4byte BattleScript_EffectHail                   @ EFFECT_HAIL\n\t.4byte BattleScript_EffectTorment                @ EFFECT_TORMENT\n\t.4byte BattleScript_EffectFlatter                @ EFFECT_FLATTER\n\t.4byte BattleScript_EffectWillOWisp              @ EFFECT_WILL_O_WISP\n\t.4byte BattleScript_EffectMemento                @ EFFECT_MEMENTO\n\t.4byte BattleScript_EffectFacade                 @ EFFECT_FACADE\n\t.4byte BattleScript_EffectFocusPunch             @ EFFECT_FOCUS_PUNCH\n\t.4byte BattleScript_EffectSmellingsalt           @ EFFECT_SMELLINGSALT\n\t.4byte BattleScript_EffectFollowMe               @ EFFECT_FOLLOW_ME\n\t.4byte BattleScript_EffectNaturePower            @ EFFECT_NATURE_POWER\n\t.4byte BattleScript_EffectCharge                 @ EFFECT_CHARGE\n\t.4byte BattleScript_EffectTaunt                  @ EFFECT_TAUNT\n\t.4byte BattleScript_EffectHelpingHand            @ EFFECT_HELPING_HAND\n\t.4byte BattleScript_EffectTrick                  @ EFFECT_TRICK\n\t.4byte BattleScript_EffectRolePlay               @ EFFECT_ROLE_PLAY\n\t.4byte BattleScript_EffectWish                   @ EFFECT_WISH\n\t.4byte BattleScript_EffectAssist                 @ EFFECT_ASSIST\n\t.4byte BattleScript_EffectIngrain                @ EFFECT_INGRAIN\n\t.4byte BattleScript_EffectSuperpower             @ EFFECT_SUPERPOWER\n\t.4byte BattleScript_EffectMagicCoat              @ EFFECT_MAGIC_COAT\n\t.4byte BattleScript_EffectRecycle                @ EFFECT_RECYCLE\n\t.4byte BattleScript_EffectRevenge                @ EFFECT_REVENGE\n\t.4byte BattleScript_EffectBrickBreak             @ EFFECT_BRICK_BREAK\n\t.4byte BattleScript_EffectYawn                   @ EFFECT_YAWN\n\t.4byte BattleScript_EffectKnockOff               @ EFFECT_KNOCK_OFF\n\t.4byte BattleScript_EffectEndeavor               @ EFFECT_ENDEAVOR\n\t.4byte BattleScript_EffectEruption               @ EFFECT_ERUPTION\n\t.4byte BattleScript_EffectSkillSwap              @ EFFECT_SKILL_SWAP\n\t.4byte BattleScript_EffectImprison               @ EFFECT_IMPRISON\n\t.4byte BattleScript_EffectRefresh                @ EFFECT_REFRESH\n\t.4byte BattleScript_EffectGrudge                 @ EFFECT_GRUDGE\n\t.4byte BattleScript_EffectSnatch                 @ EFFECT_SNATCH\n\t.4byte BattleScript_EffectLowKick                @ EFFECT_LOW_KICK\n\t.4byte BattleScript_EffectSecretPower            @ EFFECT_SECRET_POWER\n\t.4byte BattleScript_EffectDoubleEdge             @ EFFECT_DOUBLE_EDGE\n\t.4byte BattleScript_EffectTeeterDance            @ EFFECT_TEETER_DANCE\n\t.4byte BattleScript_EffectBurnHit                @ EFFECT_BLAZE_KICK\n\t.4byte BattleScript_EffectMudSport               @ EFFECT_MUD_SPORT\n\t.4byte BattleScript_EffectPoisonFang             @ EFFECT_POISON_FANG\n\t.4byte BattleScript_EffectWeatherBall            @ EFFECT_WEATHER_BALL\n\t.4byte BattleScript_EffectOverheat               @ EFFECT_OVERHEAT\n\t.4byte BattleScript_EffectTickle                 @ EFFECT_TICKLE\n\t.4byte BattleScript_EffectCosmicPower            @ EFFECT_COSMIC_POWER\n\t.4byte BattleScript_EffectSkyUppercut            @ EFFECT_SKY_UPPERCUT\n\t.4byte BattleScript_EffectBulkUp                 @ EFFECT_BULK_UP\n\t.4byte BattleScript_EffectPoisonHit              @ EFFECT_POISON_TAIL\n\t.4byte BattleScript_EffectWaterSport             @ EFFECT_WATER_SPORT\n\t.4byte BattleScript_EffectCalmMind               @ EFFECT_CALM_MIND\n\t.4byte BattleScript_EffectDragonDance            @ EFFECT_DRAGON_DANCE\n\t.4byte BattleScript_EffectCamouflage             @ EFFECT_CAMOUFLAGE\n\nBattleScript_EffectHit::\n\tjumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler\n\tjumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler\n\torword gHitMarker, HITMARKER_IGNORE_UNDERWATER\n\tsetbyte sDMG_MULTIPLIER, 2\nBattleScript_HitFromAtkCanceler::\n\tattackcanceler\nBattleScript_HitFromAccCheck::\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\nBattleScript_HitFromAtkString::\n\tattackstring\n\tppreduce\nBattleScript_HitFromCritCalc::\n\tcritcalc\n\tdamagecalc\n\ttypecalc\n\tadjustnormaldamage\nBattleScript_HitFromAtkAnimation::\n\tattackanimation\n\twaitanimation\n\teffectivenesssound\n\thitanimation BS_TARGET\n\twaitstate\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tcritmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tseteffectwithchance\n\ttryfaintmon BS_TARGET\nBattleScript_MoveEnd::\n\tmoveendall\n\tend\n\nBattleScript_MakeMoveMissed::\n\torbyte gMoveResultFlags, MOVE_RESULT_MISSED\nBattleScript_PrintMoveMissed::\n\tattackstring\n\tppreduce\nBattleScript_MoveMissedPause::\n\tpause B_WAIT_TIME_SHORT\nBattleScript_MoveMissed::\n\teffectivenesssound\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSleep::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\tjumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_AlreadyAsleep\n\tjumpifcantmakeasleep BattleScript_CantMakeAsleep\n\tjumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\tjumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected\n\tattackanimation\n\twaitanimation\n\tsetmoveeffect MOVE_EFFECT_SLEEP\n\tseteffectprimary\n\tgoto BattleScript_MoveEnd\n\nBattleScript_AlreadyAsleep::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNALREADYASLEEP\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_WasntAffected::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNWASNTAFFECTED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_CantMakeAsleep::\n\tpause B_WAIT_TIME_SHORT\n\tprintfromtable gUproarAwakeStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectPoisonHit::\n\tsetmoveeffect MOVE_EFFECT_POISON\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectAbsorb::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\tcritcalc\n\tdamagecalc\n\ttypecalc\n\tadjustnormaldamage\n\tattackanimation\n\twaitanimation\n\teffectivenesssound\n\thitanimation BS_TARGET\n\twaitstate\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tcritmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tnegativedamage\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\tjumpifability BS_TARGET, ABILITY_LIQUID_OOZE, BattleScript_AbsorbLiquidOoze\n\tsetbyte cMULTISTRING_CHOOSER, B_MSG_ABSORB\n\tgoto BattleScript_AbsorbUpdateHp\nBattleScript_AbsorbLiquidOoze::\n\tmanipulatedamage DMG_CHANGE_SIGN\n\tsetbyte cMULTISTRING_CHOOSER, B_MSG_ABSORB_OOZE\nBattleScript_AbsorbUpdateHp::\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tjumpifmovehadnoeffect BattleScript_AbsorbTryFainting\n\tprintfromtable gAbsorbDrainStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_AbsorbTryFainting::\n\ttryfaintmon BS_ATTACKER\n\ttryfaintmon BS_TARGET\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectBurnHit::\n\tsetmoveeffect MOVE_EFFECT_BURN\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectFreezeHit::\n\tsetmoveeffect MOVE_EFFECT_FREEZE\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectParalyzeHit::\n\tsetmoveeffect MOVE_EFFECT_PARALYSIS\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectExplosion::\n\tattackcanceler\n\tattackstring\n\tppreduce\n@ Below jumps to BattleScript_DampStopsExplosion if it fails (only way it can)\n\ttryexplosion\n\tsetatkhptozero\n\twaitstate\n\tjumpifbyte CMP_NO_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_MISSED, BattleScript_ExplosionDoAnimStartLoop\n\tcall BattleScript_PreserveMissedBitDoMoveAnim\n\tgoto BattleScript_ExplosionLoop\nBattleScript_ExplosionDoAnimStartLoop:\n\tattackanimation\n\twaitanimation\nBattleScript_ExplosionLoop:\n\tmovevaluescleanup\n\tcritcalc\n\tdamagecalc\n\ttypecalc\n\tadjustnormaldamage\n\taccuracycheck BattleScript_ExplosionMissed, ACC_CURR_MOVE\n\teffectivenesssound\n\thitanimation BS_TARGET\n\twaitstate\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tcritmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\ttryfaintmon BS_TARGET\n\tmoveendto MOVEEND_NEXT_TARGET\n\tjumpifnexttargetvalid BattleScript_ExplosionLoop\n\ttryfaintmon BS_ATTACKER\n\tend\nBattleScript_ExplosionMissed:\n\teffectivenesssound\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tmoveendto MOVEEND_NEXT_TARGET\n\tjumpifnexttargetvalid BattleScript_ExplosionLoop\n\ttryfaintmon BS_ATTACKER\n\tend\n\nBattleScript_PreserveMissedBitDoMoveAnim:\n\tbicbyte gMoveResultFlags, MOVE_RESULT_MISSED\n\tattackanimation\n\twaitanimation\n\torbyte gMoveResultFlags, MOVE_RESULT_MISSED\n\treturn\n\nBattleScript_EffectDreamEater::\n\tattackcanceler\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_DreamEaterNoEffect\n\tjumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_DreamEaterWorked\nBattleScript_DreamEaterNoEffect:\n\tattackstring\n\tppreduce\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_WasntAffected\nBattleScript_DreamEaterWorked:\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\tcritcalc\n\tdamagecalc\n\ttypecalc\n\tadjustnormaldamage\n\tattackanimation\n\twaitanimation\n\teffectivenesssound\n\thitanimation BS_TARGET\n\twaitstate\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tcritmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tnegativedamage\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tjumpifmovehadnoeffect BattleScript_DreamEaterTryFaintEnd\n\tprintstring STRINGID_PKMNDREAMEATEN\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_DreamEaterTryFaintEnd:\n\ttryfaintmon BS_TARGET\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectMirrorMove::\n\tattackcanceler\n\tattackstring\n\tpause B_WAIT_TIME_LONG\n\ttrymirrormove\n\tppreduce\n\torbyte gMoveResultFlags, MOVE_RESULT_FAILED\n\tprintstring STRINGID_MIRRORMOVEFAILED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectAttackUp::\n\tsetstatchanger STAT_ATK, 1, FALSE\n\tgoto BattleScript_EffectStatUp\n\nBattleScript_EffectDefenseUp::\n\tsetstatchanger STAT_DEF, 1, FALSE\n\tgoto BattleScript_EffectStatUp\n\nBattleScript_EffectSpecialAttackUp::\n\tsetstatchanger STAT_SPATK, 1, FALSE\n\tgoto BattleScript_EffectStatUp\n\nBattleScript_EffectEvasionUp::\n\tsetstatchanger STAT_EVASION, 1, FALSE\nBattleScript_EffectStatUp::\n\tattackcanceler\nBattleScript_EffectStatUpAfterAtkCanceler::\n\tattackstring\n\tppreduce\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpEnd\n\tjumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpAttackAnim\n\tpause B_WAIT_TIME_SHORT\n\tgoto BattleScript_StatUpPrintString\nBattleScript_StatUpAttackAnim::\n\tattackanimation\n\twaitanimation\nBattleScript_StatUpDoAnim::\n\tsetgraphicalstatchangevalues\n\tplayanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1\nBattleScript_StatUpPrintString::\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_StatUpEnd::\n\tgoto BattleScript_MoveEnd\n\nBattleScript_StatUp::\n\tplayanimation BS_EFFECT_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_EffectAttackDown::\n\tsetstatchanger STAT_ATK, 1, TRUE\n\tgoto BattleScript_EffectStatDown\n\nBattleScript_EffectDefenseDown::\n\tsetstatchanger STAT_DEF, 1, TRUE\n\tgoto BattleScript_EffectStatDown\n\nBattleScript_EffectSpeedDown::\n\tsetstatchanger STAT_SPEED, 1, TRUE\n\tgoto BattleScript_EffectStatDown\n\nBattleScript_EffectAccuracyDown::\n\tsetstatchanger STAT_ACC, 1, TRUE\n\tgoto BattleScript_EffectStatDown\n\nBattleScript_EffectEvasionDown::\n\tsetstatchanger STAT_EVASION, 1, TRUE\nBattleScript_EffectStatDown::\n\tattackcanceler\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\tstatbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StatDownEnd\n\tjumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_StatDownDoAnim\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StatDownEnd\n\tpause B_WAIT_TIME_SHORT\n\tgoto BattleScript_StatDownPrintString\nBattleScript_StatDownDoAnim::\n\tattackanimation\n\twaitanimation\n\tsetgraphicalstatchangevalues\n\tplayanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1\nBattleScript_StatDownPrintString::\n\tprintfromtable gStatDownStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_StatDownEnd::\n\tgoto BattleScript_MoveEnd\n\nBattleScript_StatDown::\n\tplayanimation BS_EFFECT_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1\n\tprintfromtable gStatDownStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_EffectHaze::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tattackanimation\n\twaitanimation\n\tnormalisebuffs\n\tprintstring STRINGID_STATCHANGESGONE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectBide::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tattackanimation\n\twaitanimation\n\torword gHitMarker, HITMARKER_CHARGING\n\tsetbide\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectRampage::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tjumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_EffectRampage2\n\tppreduce\nBattleScript_EffectRampage2:\n\tconfuseifrepeatingattackends\n\tgoto BattleScript_HitFromCritCalc\n\nBattleScript_EffectRoar::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut\n\tjumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted\n\taccuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON\n\taccuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE\n\tforcerandomswitch BattleScript_ButItFailed\n\nBattleScript_EffectMultiHit::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\tsetmultihitcounter 0\n\tinitmultihitstring\n\tsetbyte sMULTIHIT_EFFECT, 0\nBattleScript_MultiHitLoop::\n\tjumpifhasnohp BS_ATTACKER, BattleScript_MultiHitEnd\n\tjumpifhasnohp BS_TARGET, BattleScript_MultiHitPrintStrings\n\tjumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoMultiHit\n\tjumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_MultiHitPrintStrings\nBattleScript_DoMultiHit::\n\tmovevaluescleanup\n\tcopybyte cEFFECT_CHOOSER, sMULTIHIT_EFFECT\n\tcritcalc\n\tdamagecalc\n\ttypecalc\n\tjumpifmovehadnoeffect BattleScript_MultiHitNoMoreHits\n\tadjustnormaldamage\n\tattackanimation\n\twaitanimation\n\teffectivenesssound\n\thitanimation BS_TARGET\n\twaitstate\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tcritmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tprintstring STRINGID_EMPTYSTRING3\n\twaitmessage 1\n\taddbyte sMULTIHIT_STRING + 4, 1\n\tmoveendto MOVEEND_NEXT_TARGET\n\tjumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_FOE_ENDURED, BattleScript_MultiHitPrintStrings\n\tdecrementmultihit BattleScript_MultiHitLoop\n\tgoto BattleScript_MultiHitPrintStrings\nBattleScript_MultiHitNoMoreHits::\n\tpause B_WAIT_TIME_SHORT\nBattleScript_MultiHitPrintStrings::\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tjumpifmovehadnoeffect BattleScript_MultiHitEnd\n\tcopyarray gBattleTextBuff1, sMULTIHIT_STRING, 6\n\tprintstring STRINGID_HITXTIMES\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_MultiHitEnd::\n\tseteffectwithchance\n\ttryfaintmon BS_TARGET\n\tmoveendcase MOVEEND_SYNCHRONIZE_TARGET\n\tmoveendfrom MOVEEND_IMMUNITY_ABILITIES\n\tend\n\nBattleScript_EffectConversion::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\ttryconversiontypechange BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNCHANGEDTYPE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectFlinchHit::\n\tsetmoveeffect MOVE_EFFECT_FLINCH\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectRestoreHp::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\ttryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_ATTACKER\n\tattackanimation\n\twaitanimation\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tprintstring STRINGID_PKMNREGAINEDHEALTH\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectToxic::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\tjumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned\n\tjumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned\n\tjumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed\n\tjumpiftype BS_TARGET, TYPE_POISON, BattleScript_NotAffected\n\tjumpiftype BS_TARGET, TYPE_STEEL, BattleScript_NotAffected\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\tjumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected\n\tattackanimation\n\twaitanimation\n\tsetmoveeffect MOVE_EFFECT_TOXIC\n\tseteffectprimary\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_AlreadyPoisoned::\n\tpause B_WAIT_TIME_LONG\n\tprintstring STRINGID_PKMNALREADYPOISONED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_ImmunityProtected::\n\tcopybyte gEffectBattler, gBattlerTarget\n\tsetbyte cMULTISTRING_CHOOSER, B_MSG_ABILITY_PREVENTS_MOVE_STATUS\n\tcall BattleScript_PSNPrevention\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectPayDay::\n\tsetmoveeffect MOVE_EFFECT_PAYDAY\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectLightScreen::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetlightscreen\n\tgoto BattleScript_PrintReflectLightScreenSafeguardString\n\nBattleScript_EffectTriAttack::\n\tsetmoveeffect MOVE_EFFECT_TRI_ATTACK\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectRest::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_RestIsAlreadyAsleep\n\tjumpifcantmakeasleep BattleScript_RestCantSleep\n\ttrysetrest BattleScript_AlreadyAtFullHp\n\tpause B_WAIT_TIME_SHORT\n\tprintfromtable gRestUsedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_ATTACKER\n\twaitstate\n\tgoto BattleScript_PresentHealTarget\n\nBattleScript_RestCantSleep::\n\tpause B_WAIT_TIME_LONG\n\tprintfromtable gUproarAwakeStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_RestIsAlreadyAsleep::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNALREADYASLEEP2\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectOHKO::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON\n\ttypecalc\n\tjumpifmovehadnoeffect BattleScript_HitFromAtkAnimation\n\ttryKO BattleScript_KOFail\n\ttrysetdestinybondtohappen\n\tgoto BattleScript_HitFromAtkAnimation\nBattleScript_KOFail::\n\tpause B_WAIT_TIME_LONG\n\tprintfromtable gKOFailedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectRazorWind::\n\tjumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn\n\tjumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn\n\tsetbyte sTWOTURN_STRINGID, B_MSG_TURN1_RAZOR_WIND\n\tcall BattleScriptFirstChargingTurn\n\tgoto BattleScript_MoveEnd\n\nBattleScript_TwoTurnMovesSecondTurn::\n\tattackcanceler\n\tsetmoveeffect MOVE_EFFECT_CHARGING\n\tsetbyte sB_ANIM_TURN, 1\n\tclearstatusfromeffect BS_ATTACKER\n\torword gHitMarker, HITMARKER_NO_PPDEDUCT\n\tjumpifnotmove MOVE_SKY_ATTACK, BattleScript_HitFromAccCheck\n\tsetmoveeffect MOVE_EFFECT_FLINCH\n\tgoto BattleScript_HitFromAccCheck\n\nBattleScriptFirstChargingTurn::\n\tattackcanceler\n\tprintstring STRINGID_EMPTYSTRING3\n\tppreduce\n\tattackanimation\n\twaitanimation\n\torword gHitMarker, HITMARKER_CHARGING\n\tsetmoveeffect MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER\n\tseteffectprimary\n\tcopybyte cMULTISTRING_CHOOSER, sTWOTURN_STRINGID\n\tprintfromtable gFirstTurnOfTwoStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_EffectSuperFang::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\ttypecalc\n\tbicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE\n\tdamagetohalftargethp\n\tgoto BattleScript_HitFromAtkAnimation\n\nBattleScript_EffectDragonRage::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\ttypecalc\n\tbicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE\n\tsetword gBattleMoveDamage, 40\n\tadjustsetdamage\n\tgoto BattleScript_HitFromAtkAnimation\n\nBattleScript_EffectTrap::\n\tjumpifnotmove MOVE_WHIRLPOOL, BattleScript_DoWrapEffect\n\tjumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_DoWrapEffect\n\torword gHitMarker, HITMARKER_IGNORE_UNDERWATER\n\tsetbyte sDMG_MULTIPLIER, 2\nBattleScript_DoWrapEffect::\n\tsetmoveeffect MOVE_EFFECT_WRAP\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectDoubleHit::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\tsetmultihitcounter 2\n\tinitmultihitstring\n\tsetbyte sMULTIHIT_EFFECT, 0\n\tgoto BattleScript_MultiHitLoop\n\nBattleScript_EffectRecoilIfMiss::\n\tattackcanceler\n\taccuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE\n\tgoto BattleScript_HitFromAtkString\nBattleScript_MoveMissedDoDamage::\n\tattackstring\n\tppreduce\n\tpause B_WAIT_TIME_LONG\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tjumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd\n\tprintstring STRINGID_PKMNCRASHED\n\twaitmessage B_WAIT_TIME_LONG\n\tdamagecalc\n\ttypecalc\n\tadjustnormaldamage\n\tmanipulatedamage DMG_RECOIL_FROM_MISS\n\tbicbyte gMoveResultFlags, MOVE_RESULT_MISSED\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\ttryfaintmon BS_ATTACKER\n\torbyte gMoveResultFlags, MOVE_RESULT_MISSED\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectMist::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetmist\n\tattackanimation\n\twaitanimation\n\tprintfromtable gMistUsedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectFocusEnergy::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstatus2 BS_ATTACKER, STATUS2_FOCUS_ENERGY, BattleScript_ButItFailed\n\tsetfocusenergy\n\tattackanimation\n\twaitanimation\n\tprintfromtable gFocusEnergyUsedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectRecoil::\n\tsetmoveeffect MOVE_EFFECT_RECOIL_25 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN\n\tjumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit\n\tincrementgamestat GAME_STAT_USED_STRUGGLE\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectConfuse::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\tjumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_AlreadyConfused\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\tjumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected\n\tattackanimation\n\twaitanimation\n\tsetmoveeffect MOVE_EFFECT_CONFUSION\n\tseteffectprimary\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_AlreadyConfused::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNALREADYCONFUSED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectAttackUp2::\n\tsetstatchanger STAT_ATK, 2, FALSE\n\tgoto BattleScript_EffectStatUp\n\nBattleScript_EffectDefenseUp2::\n\tsetstatchanger STAT_DEF, 2, FALSE\n\tgoto BattleScript_EffectStatUp\n\nBattleScript_EffectSpeedUp2::\n\tsetstatchanger STAT_SPEED, 2, FALSE\n\tgoto BattleScript_EffectStatUp\n\nBattleScript_EffectSpecialAttackUp2::\n\tsetstatchanger STAT_SPATK, 2, FALSE\n\tgoto BattleScript_EffectStatUp\n\nBattleScript_EffectSpecialDefenseUp2::\n\tsetstatchanger STAT_SPDEF, 2, FALSE\n\tgoto BattleScript_EffectStatUp\n\nBattleScript_EffectTransform::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\ttransformdataexecution\n\tattackanimation\n\twaitanimation\n\tprintfromtable gTransformUsedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectAttackDown2::\n\tsetstatchanger STAT_ATK, 2, TRUE\n\tgoto BattleScript_EffectStatDown\n\nBattleScript_EffectDefenseDown2::\n\tsetstatchanger STAT_DEF, 2, TRUE\n\tgoto BattleScript_EffectStatDown\n\nBattleScript_EffectSpeedDown2::\n\tsetstatchanger STAT_SPEED, 2, TRUE\n\tgoto BattleScript_EffectStatDown\n\nBattleScript_EffectSpecialDefenseDown2::\n\tsetstatchanger STAT_SPDEF, 2, TRUE\n\tgoto BattleScript_EffectStatDown\n\nBattleScript_EffectReflect::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetreflect\nBattleScript_PrintReflectLightScreenSafeguardString::\n\tattackanimation\n\twaitanimation\n\tprintfromtable gReflectLightScreenSafeguardStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectPoison::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\tjumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned\n\tjumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned\n\tjumpiftype BS_TARGET, TYPE_POISON, BattleScript_NotAffected\n\tjumpiftype BS_TARGET, TYPE_STEEL, BattleScript_NotAffected\n\tjumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\tjumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected\n\tattackanimation\n\twaitanimation\n\tsetmoveeffect MOVE_EFFECT_POISON\n\tseteffectprimary\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectParalyze::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\ttypecalc\n\tjumpifmovehadnoeffect BattleScript_ButItFailed\n\tjumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed\n\tjumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\tjumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected\n\tattackanimation\n\twaitanimation\n\tsetmoveeffect MOVE_EFFECT_PARALYSIS\n\tseteffectprimary\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_AlreadyParalyzed::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNISALREADYPARALYZED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_LimberProtected::\n\tcopybyte gEffectBattler, gBattlerTarget\n\tsetbyte cMULTISTRING_CHOOSER, B_MSG_ABILITY_PREVENTS_MOVE_STATUS\n\tcall BattleScript_PRLZPrevention\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectAttackDownHit::\n\tsetmoveeffect MOVE_EFFECT_ATK_MINUS_1\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectDefenseDownHit::\n\tsetmoveeffect MOVE_EFFECT_DEF_MINUS_1\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectSpeedDownHit::\n\tsetmoveeffect MOVE_EFFECT_SPD_MINUS_1\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectSpecialAttackDownHit::\n\tsetmoveeffect MOVE_EFFECT_SP_ATK_MINUS_1\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectSpecialDefenseDownHit::\n\tsetmoveeffect MOVE_EFFECT_SP_DEF_MINUS_1\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectAccuracyDownHit::\n\tsetmoveeffect MOVE_EFFECT_ACC_MINUS_1\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectSkyAttack::\n\tjumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn\n\tjumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn\n\tsetbyte sTWOTURN_STRINGID, B_MSG_TURN1_SKY_ATTACK\n\tcall BattleScriptFirstChargingTurn\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectConfuseHit::\n\tsetmoveeffect MOVE_EFFECT_CONFUSION\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectTwineedle::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tsetbyte sMULTIHIT_EFFECT, MOVE_EFFECT_POISON\n\tattackstring\n\tppreduce\n\tsetmultihitcounter 2\n\tinitmultihitstring\n\tgoto BattleScript_MultiHitLoop\n\nBattleScript_EffectSubstitute::\n\tattackcanceler\n\tppreduce\n\tattackstring\n\twaitstate\n\tjumpifstatus2 BS_ATTACKER, STATUS2_SUBSTITUTE, BattleScript_AlreadyHasSubstitute\n\tsetsubstitute\n\tjumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SUBSTITUTE_FAILED, BattleScript_SubstituteAnim\n\tpause B_WAIT_TIME_SHORT\n\tgoto BattleScript_SubstituteString\nBattleScript_SubstituteAnim::\n\tattackanimation\n\twaitanimation\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\nBattleScript_SubstituteString::\n\tprintfromtable gSubstituteUsedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\nBattleScript_AlreadyHasSubstitute::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNHASSUBSTITUTE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectRecharge::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tsetmoveeffect MOVE_EFFECT_RECHARGE | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN\n\tgoto BattleScript_HitFromAtkString\n\nBattleScript_MoveUsedMustRecharge::\n\tprintstring STRINGID_PKMNMUSTRECHARGE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectRage::\n\tattackcanceler\n\taccuracycheck BattleScript_RageMiss, ACC_CURR_MOVE\n\tsetmoveeffect MOVE_EFFECT_RAGE\n\tseteffectprimary\n\tsetmoveeffect 0\n\tgoto BattleScript_HitFromAtkString\nBattleScript_RageMiss::\n\tsetmoveeffect MOVE_EFFECT_RAGE\n\tclearstatusfromeffect BS_ATTACKER\n\tgoto BattleScript_PrintMoveMissed\n\nBattleScript_EffectMimic::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\taccuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON\n\tmimicattackcopy BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNLEARNEDMOVE2\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectMetronome::\n\tattackcanceler\n\tattackstring\n\tpause B_WAIT_TIME_SHORT\n\tattackanimation\n\twaitanimation\n\tsetbyte sB_ANIM_TURN, 0\n\tsetbyte sB_ANIM_TARGETS_HIT, 0\n\tmetronome\n\nBattleScript_EffectLeechSeed::\n\tattackcanceler\n\tattackstring\n\tpause B_WAIT_TIME_SHORT\n\tppreduce\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\taccuracycheck BattleScript_DoLeechSeed, ACC_CURR_MOVE\nBattleScript_DoLeechSeed::\n\tsetseeded\n\tattackanimation\n\twaitanimation\n\tprintfromtable gLeechSeedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSplash::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tattackanimation\n\twaitanimation\n\tincrementgamestat GAME_STAT_USED_SPLASH\n\tprintstring STRINGID_BUTNOTHINGHAPPENED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectDisable::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\tdisablelastusedattack BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNMOVEWASDISABLED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectLevelDamage::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\ttypecalc\n\tbicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE\n\tdmgtolevel\n\tadjustsetdamage\n\tgoto BattleScript_HitFromAtkAnimation\n\nBattleScript_EffectPsywave::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\ttypecalc\n\tbicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE\n\tpsywavedamageeffect\n\tadjustsetdamage\n\tgoto BattleScript_HitFromAtkAnimation\n\nBattleScript_EffectCounter::\n\tattackcanceler\n\tcounterdamagecalculator BattleScript_ButItFailedAtkStringPpReduce\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\ttypecalc2\n\tadjustsetdamage\n\tgoto BattleScript_HitFromAtkAnimation\n\nBattleScript_EffectEncore::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\ttrysetencore BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNGOTENCORE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectPainSplit::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON\n\tpainsplitdmgcalc BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tcopyword gBattleMoveDamage, sPAINSPLIT_HP\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tprintstring STRINGID_SHAREDPAIN\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSnore::\n\tattackcanceler\n\tjumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SnoreIsAsleep\n\tattackstring\n\tppreduce\n\tgoto BattleScript_ButItFailed\nBattleScript_SnoreIsAsleep::\n\tjumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoSnore\n\tprintstring STRINGID_PKMNFASTASLEEP\n\twaitmessage B_WAIT_TIME_LONG\n\tstatusanimation BS_ATTACKER\nBattleScript_DoSnore::\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE\n\tsetmoveeffect MOVE_EFFECT_FLINCH\n\tgoto BattleScript_HitFromCritCalc\n\nBattleScript_EffectConversion2::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsettypetorandomresistance BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNCHANGEDTYPE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectLockOn::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\tsetalwayshitflag\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNTOOKAIM\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSketch::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\tcopymovepermanently BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNSKETCHEDMOVE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSleepTalk::\n\tattackcanceler\n\tjumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SleepTalkIsAsleep\n\tattackstring\n\tppreduce\n\tgoto BattleScript_ButItFailed\nBattleScript_SleepTalkIsAsleep::\n\tprintstring STRINGID_PKMNFASTASLEEP\n\twaitmessage B_WAIT_TIME_LONG\n\tstatusanimation BS_ATTACKER\n\tattackstring\n\tppreduce\n\torword gHitMarker, HITMARKER_NO_PPDEDUCT\n\ttrychoosesleeptalkmove BattleScript_SleepTalkUsingMove\n\tpause B_WAIT_TIME_LONG\n\tgoto BattleScript_ButItFailed\nBattleScript_SleepTalkUsingMove::\n\tattackanimation\n\twaitanimation\n\tsetbyte sB_ANIM_TURN, 0\n\tsetbyte sB_ANIM_TARGETS_HIT, 0\n\tjumptocalledmove TRUE\n\nBattleScript_EffectDestinyBond::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetdestinybond\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNTRYINGTOTAKEFOE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectFlail::\n\tremaininghptopower\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectSpite::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\ttryspiteppreduce BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNREDUCEDPP\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectHealBell::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\thealpartystatus\n\twaitstate\n\tattackanimation\n\twaitanimation\n\tprintfromtable gPartyStatusHealStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tjumpifnotmove MOVE_HEAL_BELL, BattleScript_PartyHealEnd\n\tjumpifbyte CMP_NO_COMMON_BITS, cMULTISTRING_CHOOSER, B_MSG_BELL_SOUNDPROOF_ATTACKER, BattleScript_CheckHealBellMon2Unaffected\n\tprintstring STRINGID_PKMNSXBLOCKSY\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_CheckHealBellMon2Unaffected::\n\tjumpifbyte CMP_NO_COMMON_BITS, cMULTISTRING_CHOOSER, B_MSG_BELL_SOUNDPROOF_PARTNER, BattleScript_PartyHealEnd\n\tprintstring STRINGID_PKMNSXBLOCKSY2\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_PartyHealEnd::\n\tupdatestatusicon BS_ATTACKER_WITH_PARTNER\n\twaitstate\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectTripleKick::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsethword sTRIPLE_KICK_POWER, 0\n\tinitmultihitstring\n\tsetmultihit 3\nBattleScript_TripleKickLoop::\n\tjumpifhasnohp BS_ATTACKER, BattleScript_TripleKickEnd\n\tjumpifhasnohp BS_TARGET, BattleScript_TripleKickNoMoreHits\n\tjumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoTripleKickAttack\n\tjumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_TripleKickNoMoreHits\nBattleScript_DoTripleKickAttack::\n\taccuracycheck BattleScript_TripleKickNoMoreHits, ACC_CURR_MOVE\n\tmovevaluescleanup\n\taddbyte sTRIPLE_KICK_POWER, 10\n\taddbyte sMULTIHIT_STRING + 4, 1\n\tcopyhword gDynamicBasePower, sTRIPLE_KICK_POWER\n\tcritcalc\n\tdamagecalc\n\ttypecalc\n\tadjustnormaldamage\n\tjumpifmovehadnoeffect BattleScript_TripleKickNoMoreHits\n\tattackanimation\n\twaitanimation\n\teffectivenesssound\n\thitanimation BS_TARGET\n\twaitstate\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tcritmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tprintstring STRINGID_EMPTYSTRING3\n\twaitmessage 1\n\tmoveendto MOVEEND_NEXT_TARGET\n\tjumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_FOE_ENDURED, BattleScript_TripleKickPrintStrings\n\tdecrementmultihit BattleScript_TripleKickLoop\n\tgoto BattleScript_TripleKickPrintStrings\nBattleScript_TripleKickNoMoreHits::\n\tpause B_WAIT_TIME_SHORT\n\tjumpifbyte CMP_EQUAL, sMULTIHIT_STRING + 4, 0, BattleScript_TripleKickPrintStrings\n\tbicbyte gMoveResultFlags, MOVE_RESULT_MISSED\nBattleScript_TripleKickPrintStrings::\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tjumpifbyte CMP_EQUAL, sMULTIHIT_STRING + 4, 0, BattleScript_TripleKickEnd\n\tjumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TripleKickEnd\n\tcopyarray gBattleTextBuff1, sMULTIHIT_STRING, 6\n\tprintstring STRINGID_HITXTIMES\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_TripleKickEnd::\n\tseteffectwithchance\n\ttryfaintmon BS_TARGET\n\tmoveendfrom MOVEEND_UPDATE_LAST_MOVES\n\tend\n\nBattleScript_EffectThief::\n\tsetmoveeffect MOVE_EFFECT_STEAL_ITEM\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectMeanLook::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_ButItFailed, NO_ACC_CALC\n\tjumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_ButItFailed\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tsetmoveeffect MOVE_EFFECT_PREVENT_ESCAPE\n\tseteffectprimary\n\tprintstring STRINGID_TARGETCANTESCAPENOW\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectNightmare::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\tjumpifstatus2 BS_TARGET, STATUS2_NIGHTMARE, BattleScript_ButItFailed\n\tjumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_NightmareWorked\n\tgoto BattleScript_ButItFailed\nBattleScript_NightmareWorked::\n\tattackanimation\n\twaitanimation\n\tsetmoveeffect MOVE_EFFECT_NIGHTMARE\n\tseteffectprimary\n\tprintstring STRINGID_PKMNFELLINTONIGHTMARE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectMinimize::\n\tattackcanceler\n\tsetminimize\n\tsetstatchanger STAT_EVASION, 1, FALSE\n\tgoto BattleScript_EffectStatUpAfterAtkCanceler\n\nBattleScript_EffectCurse::\n\tjumpiftype2 BS_ATTACKER, TYPE_GHOST, BattleScript_GhostCurse\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPEED, MIN_STAT_STAGE, BattleScript_CurseTrySpeed\n\tjumpifstat BS_ATTACKER, CMP_NOT_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_CurseTrySpeed\n\tjumpifstat BS_ATTACKER, CMP_EQUAL, STAT_DEF, MAX_STAT_STAGE, BattleScript_ButItFailed\nBattleScript_CurseTrySpeed::\n\tcopybyte gBattlerTarget, gBattlerAttacker\n\tsetbyte sB_ANIM_TURN, 1\n\tattackanimation\n\twaitanimation\n\tsetstatchanger STAT_SPEED, 1, TRUE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryAttack\n\tprintfromtable gStatDownStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_CurseTryAttack::\n\tsetstatchanger STAT_ATK, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryDefense\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_CurseTryDefense::\n\tsetstatchanger STAT_DEF, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseEnd\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_CurseEnd::\n\tgoto BattleScript_MoveEnd\nBattleScript_GhostCurse::\n\tjumpifbytenotequal gBattlerAttacker, gBattlerTarget, BattleScript_DoGhostCurse\n\tgetmovetarget BS_ATTACKER\nBattleScript_DoGhostCurse::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\taccuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON\n\tcursetarget BattleScript_ButItFailed\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\tsetbyte sB_ANIM_TURN, 0\n\tattackanimation\n\twaitanimation\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tprintstring STRINGID_PKMNLAIDCURSE\n\twaitmessage B_WAIT_TIME_LONG\n\ttryfaintmon BS_ATTACKER\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectProtect::\nBattleScript_EffectEndure::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetprotectlike\n\tattackanimation\n\twaitanimation\n\tprintfromtable gProtectLikeUsedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSpikes::\n\tattackcanceler\n\ttrysetspikes BattleScript_ButItFailedAtkStringPpReduce\n\tattackstring\n\tppreduce\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_SPIKESSCATTERED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectForesight::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\tsetforesight\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNIDENTIFIED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectPerishSong::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\ttrysetperishsong BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_FAINTINTHREE\n\twaitmessage B_WAIT_TIME_LONG\n\tsetbyte sBATTLER, 0\nBattleScript_PerishSongLoop::\n\tjumpifability BS_SCRIPTING, ABILITY_SOUNDPROOF, BattleScript_PerishSongNotAffected\nBattleScript_PerishSongLoopIncrement::\n\taddbyte sBATTLER, 1\n\tjumpifbytenotequal sBATTLER, gBattlersCount, BattleScript_PerishSongLoop\n\tgoto BattleScript_MoveEnd\n\nBattleScript_PerishSongNotAffected::\n\tprintstring STRINGID_PKMNSXBLOCKSY2\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_PerishSongLoopIncrement\n\nBattleScript_EffectSandstorm::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetsandstorm\n\tgoto BattleScript_MoveWeatherChange\n\nBattleScript_EffectRollout::\n\tattackcanceler\n\tattackstring\n\tjumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_RolloutCheckAccuracy\n\tppreduce\nBattleScript_RolloutCheckAccuracy::\n\taccuracycheck BattleScript_RolloutHit, ACC_CURR_MOVE\nBattleScript_RolloutHit::\n\ttypecalc2\n\trolloutdamagecalculation\n\tgoto BattleScript_HitFromCritCalc\n\nBattleScript_EffectSwagger::\n\tattackcanceler\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_MakeMoveMissed\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\tjumpifconfusedandstatmaxed STAT_ATK, BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tsetstatchanger STAT_ATK, 2, FALSE\n\tstatbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_SwaggerTryConfuse\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_SwaggerTryConfuse\n\tsetgraphicalstatchangevalues\n\tplayanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_SwaggerTryConfuse::\n\tjumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents\n\tjumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected\n\tsetmoveeffect MOVE_EFFECT_CONFUSION\n\tseteffectprimary\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectFuryCutter::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_FuryCutterHit, ACC_CURR_MOVE\nBattleScript_FuryCutterHit::\n\tfurycuttercalc\n\tcritcalc\n\tdamagecalc\n\ttypecalc\n\tjumpifmovehadnoeffect BattleScript_FuryCutterHit\n\tadjustnormaldamage\n\tgoto BattleScript_HitFromAtkAnimation\n\nBattleScript_EffectAttract::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\ttryinfatuating BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNFELLINLOVE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectReturn::\nBattleScript_EffectFrustration::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tfriendshiptodamagecalculation\n\tgoto BattleScript_HitFromAtkString\n\nBattleScript_EffectPresent::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\ttypecalc\n\tpresentdamagecalculation\n\nBattleScript_EffectSafeguard::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetsafeguard\n\tgoto BattleScript_PrintReflectLightScreenSafeguardString\n\nBattleScript_EffectThawHit::\n\tsetmoveeffect MOVE_EFFECT_BURN\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectMagnitude::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tselectfirstvalidtarget\n\tmagnitudedamagecalculation\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_MAGNITUDESTRENGTH\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_HitsAllWithUndergroundBonusLoop\n\nBattleScript_EffectBatonPass::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\topenpartyscreen BS_ATTACKER, BattleScript_ButItFailed\n\tswitchoutabilities BS_ATTACKER\n\twaitstate\n\tswitchhandleorder BS_ATTACKER, 2\n\treturntoball BS_ATTACKER\n\tgetswitchedmondata BS_ATTACKER\n\tswitchindataupdate BS_ATTACKER\n\thpthresholds BS_ATTACKER\n\tprintstring STRINGID_SWITCHINMON\n\tswitchinanim BS_ATTACKER, TRUE\n\twaitstate\n\tswitchineffects BS_ATTACKER\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectRapidSpin::\n\tsetmoveeffect MOVE_EFFECT_RAPIDSPIN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectSonicboom::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\ttypecalc\n\tbicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE\n\tsetword gBattleMoveDamage, 20\n\tadjustsetdamage\n\tgoto BattleScript_HitFromAtkAnimation\n\nBattleScript_EffectMorningSun::\nBattleScript_EffectSynthesis::\nBattleScript_EffectMoonlight::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\trecoverbasedonsunlight BattleScript_AlreadyAtFullHp\n\tgoto BattleScript_PresentHealTarget\n\nBattleScript_EffectHiddenPower::\n\tattackcanceler\n\thiddenpowercalc\n\tgoto BattleScript_HitFromAccCheck\n\nBattleScript_EffectRainDance::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetrain\nBattleScript_MoveWeatherChange::\n\tattackanimation\n\twaitanimation\n\tprintfromtable gMoveWeatherChangeStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tcall BattleScript_WeatherFormChanges\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSunnyDay::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetsunny\n\tgoto BattleScript_MoveWeatherChange\n\nBattleScript_EffectDefenseUpHit::\n\tsetmoveeffect MOVE_EFFECT_DEF_PLUS_1 | MOVE_EFFECT_AFFECTS_USER\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectAttackUpHit::\n\tsetmoveeffect MOVE_EFFECT_ATK_PLUS_1 | MOVE_EFFECT_AFFECTS_USER\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectAllStatsUpHit::\n\tsetmoveeffect MOVE_EFFECT_ALL_STATS_UP | MOVE_EFFECT_AFFECTS_USER\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectBellyDrum::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tmaxattackhalvehp BattleScript_ButItFailed\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\tattackanimation\n\twaitanimation\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tprintstring STRINGID_PKMNCUTHPMAXEDATTACK\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectPsychUp::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tcopyfoestats BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNCOPIEDSTATCHANGES\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectMirrorCoat::\n\tattackcanceler\n\tmirrorcoatdamagecalculator BattleScript_ButItFailedAtkStringPpReduce\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\ttypecalc2\n\tadjustsetdamage\n\tgoto BattleScript_HitFromAtkAnimation\n\nBattleScript_EffectSkullBash::\n\tjumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn\n\tjumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn\n\tsetbyte sTWOTURN_STRINGID, B_MSG_TURN1_SKULL_BASH\n\tcall BattleScriptFirstChargingTurn\n\tsetstatchanger STAT_DEF, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_SkullBashEnd\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_SkullBashEnd\n\tsetgraphicalstatchangevalues\n\tplayanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_SkullBashEnd::\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectTwister::\n\tjumpifnostatus3 BS_TARGET, STATUS3_ON_AIR, BattleScript_FlinchEffect\n\torword gHitMarker, HITMARKER_IGNORE_ON_AIR\n\tsetbyte sDMG_MULTIPLIER, 2\nBattleScript_FlinchEffect::\n\tsetmoveeffect MOVE_EFFECT_FLINCH\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectEarthquake::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tselectfirstvalidtarget\nBattleScript_HitsAllWithUndergroundBonusLoop::\n\tmovevaluescleanup\n\tjumpifnostatus3 BS_TARGET, STATUS3_UNDERGROUND, BattleScript_HitsAllNoUndergroundBonus\n\torword gHitMarker, HITMARKER_IGNORE_UNDERGROUND\n\tsetbyte sDMG_MULTIPLIER, 2\n\tgoto BattleScript_DoHitAllWithUndergroundBonus\nBattleScript_HitsAllNoUndergroundBonus::\n\tbicword gHitMarker, HITMARKER_IGNORE_UNDERGROUND\n\tsetbyte sDMG_MULTIPLIER, 1\nBattleScript_DoHitAllWithUndergroundBonus::\n\taccuracycheck BattleScript_HitAllWithUndergroundBonusMissed, ACC_CURR_MOVE\n\tcritcalc\n\tdamagecalc\n\ttypecalc\n\tadjustnormaldamage\n\tattackanimation\n\twaitanimation\n\teffectivenesssound\n\thitanimation BS_TARGET\n\twaitstate\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tcritmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tprintstring STRINGID_EMPTYSTRING3\n\twaitmessage 1\n\ttryfaintmon BS_TARGET\n\tmoveendto MOVEEND_NEXT_TARGET\n\tjumpifnexttargetvalid BattleScript_HitsAllWithUndergroundBonusLoop\n\tend\nBattleScript_HitAllWithUndergroundBonusMissed::\n\tpause B_WAIT_TIME_SHORT\n\ttypecalc\n\teffectivenesssound\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tmoveendto MOVEEND_NEXT_TARGET\n\tjumpifnexttargetvalid BattleScript_HitsAllWithUndergroundBonusLoop\n\tend\n\nBattleScript_EffectFutureSight::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\ttrysetfutureattack BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintfromtable gFutureMoveUsedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectGust::\n\tjumpifnostatus3 BS_TARGET, STATUS3_ON_AIR, BattleScript_EffectHit\n\torword gHitMarker, HITMARKER_IGNORE_ON_AIR\n\tsetbyte sDMG_MULTIPLIER, 2\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectStomp::\n\tjumpifnostatus3 BS_TARGET, STATUS3_MINIMIZED, BattleScript_FlinchEffect\n\tsetbyte sDMG_MULTIPLIER, 2\n\tgoto BattleScript_FlinchEffect\n\nBattleScript_EffectSolarBeam::\n\tjumpifabilitypresent ABILITY_CLOUD_NINE, BattleScript_SolarBeamDecideTurn\n\tjumpifabilitypresent ABILITY_AIR_LOCK, BattleScript_SolarBeamDecideTurn\n\tjumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN, BattleScript_SolarBeamOnFirstTurn\nBattleScript_SolarBeamDecideTurn::\n\tjumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn\n\tjumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn\n\tsetbyte sTWOTURN_STRINGID, B_MSG_TURN1_SOLAR_BEAM\n\tcall BattleScriptFirstChargingTurn\n\tgoto BattleScript_MoveEnd\nBattleScript_SolarBeamOnFirstTurn::\n\torword gHitMarker, HITMARKER_CHARGING\n\tsetmoveeffect MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER\n\tseteffectprimary\n\tppreduce\n\tgoto BattleScript_TwoTurnMovesSecondTurn\n\nBattleScript_EffectThunder::\n\tsetmoveeffect MOVE_EFFECT_PARALYSIS\n\torword gHitMarker, HITMARKER_IGNORE_ON_AIR\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectTeleport::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_ButItFailed\n\tgetifcantrunfrombattle BS_ATTACKER\n\tjumpifbyte CMP_EQUAL, gBattleCommunication, 1, BattleScript_ButItFailed\n\tjumpifbyte CMP_EQUAL, gBattleCommunication, 2, BattleScript_PrintAbilityMadeIneffective\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNFLEDFROMBATTLE\n\twaitmessage B_WAIT_TIME_LONG\n\tsetbyte gBattleOutcome, B_OUTCOME_PLAYER_TELEPORTED\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectBeatUp::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tpause B_WAIT_TIME_SHORT\n\tppreduce\n\tsetbyte gBattleCommunication, 0\nBattleScript_BeatUpLoop::\n\tmovevaluescleanup\n\ttrydobeatup BattleScript_BeatUpEnd, BattleScript_ButItFailed\n\tprintstring STRINGID_PKMNATTACK\n\tcritcalc\n\tjumpifbyte CMP_NOT_EQUAL, gCritMultiplier, 2, BattleScript_BeatUpAttack\n\tmanipulatedamage DMG_DOUBLED\nBattleScript_BeatUpAttack::\n\tadjustnormaldamage\n\tattackanimation\n\twaitanimation\n\teffectivenesssound\n\thitanimation BS_TARGET\n\twaitstate\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tcritmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\ttryfaintmon BS_TARGET\n\tmoveendto MOVEEND_NEXT_TARGET\n\tgoto BattleScript_BeatUpLoop\nBattleScript_BeatUpEnd::\n\tend\n\nBattleScript_EffectSemiInvulnerable::\n\tjumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_SecondTurnSemiInvulnerable\n\tjumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_SecondTurnSemiInvulnerable\n\tjumpifmove MOVE_FLY, BattleScript_FirstTurnFly\n\tjumpifmove MOVE_DIVE, BattleScript_FirstTurnDive\n\tjumpifmove MOVE_BOUNCE, BattleScript_FirstTurnBounce\n\tsetbyte sTWOTURN_STRINGID, B_MSG_TURN1_DIG\n\tgoto BattleScript_FirstTurnSemiInvulnerable\n\nBattleScript_FirstTurnBounce::\n\tsetbyte sTWOTURN_STRINGID, B_MSG_TURN1_BOUNCE\n\tgoto BattleScript_FirstTurnSemiInvulnerable\n\nBattleScript_FirstTurnDive::\n\tsetbyte sTWOTURN_STRINGID, B_MSG_TURN1_DIVE\n\tgoto BattleScript_FirstTurnSemiInvulnerable\n\nBattleScript_FirstTurnFly::\n\tsetbyte sTWOTURN_STRINGID, B_MSG_TURN1_FLY\nBattleScript_FirstTurnSemiInvulnerable::\n\tcall BattleScriptFirstChargingTurn\n\tsetsemiinvulnerablebit\n\tgoto BattleScript_MoveEnd\n\nBattleScript_SecondTurnSemiInvulnerable::\n\tattackcanceler\n\tsetmoveeffect MOVE_EFFECT_CHARGING\n\tsetbyte sB_ANIM_TURN, 1\n\tclearstatusfromeffect BS_ATTACKER\n\torword gHitMarker, HITMARKER_NO_PPDEDUCT\n\tjumpifnotmove MOVE_BOUNCE, BattleScript_SemiInvulnerableTryHit\n\tsetmoveeffect MOVE_EFFECT_PARALYSIS\nBattleScript_SemiInvulnerableTryHit::\n\taccuracycheck BattleScript_SemiInvulnerableMiss, ACC_CURR_MOVE\n\tclearsemiinvulnerablebit\n\tgoto BattleScript_HitFromAtkString\n\nBattleScript_SemiInvulnerableMiss::\n\tclearsemiinvulnerablebit\n\tgoto BattleScript_PrintMoveMissed\n\nBattleScript_EffectDefenseCurl::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetdefensecurlbit\n\tsetstatchanger STAT_DEF, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DefenseCurlDoStatUpAnim\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpPrintString\n\tattackanimation\n\twaitanimation\nBattleScript_DefenseCurlDoStatUpAnim::\n\tgoto BattleScript_StatUpDoAnim\n\nBattleScript_EffectSoftboiled::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\ttryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET\nBattleScript_PresentHealTarget::\n\tattackanimation\n\twaitanimation\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tprintstring STRINGID_PKMNREGAINEDHEALTH\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_AlreadyAtFullHp::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNHPFULL\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectFakeOut::\n\tattackcanceler\n\tjumpifnotfirstturn BattleScript_ButItFailedAtkStringPpReduce\n\tsetmoveeffect MOVE_EFFECT_FLINCH | MOVE_EFFECT_CERTAIN\n\tgoto BattleScript_EffectHit\n\nBattleScript_ButItFailedAtkStringPpReduce::\n\tattackstring\nBattleScript_ButItFailedPpReduce::\n\tppreduce\nBattleScript_ButItFailed::\n\tpause B_WAIT_TIME_SHORT\n\torbyte gMoveResultFlags, MOVE_RESULT_FAILED\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_NotAffected::\n\tpause B_WAIT_TIME_SHORT\n\torbyte gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectUproar::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tsetmoveeffect MOVE_EFFECT_UPROAR | MOVE_EFFECT_AFFECTS_USER\n\tattackstring\n\tjumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_UproarHit\n\tppreduce\nBattleScript_UproarHit::\n\tnop\n\tgoto BattleScript_HitFromCritCalc\n\nBattleScript_EffectStockpile::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tstockpile\n\tattackanimation\n\twaitanimation\n\tprintfromtable gStockpileUsedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSpitUp::\n\tattackcanceler\n\tjumpifbyte CMP_EQUAL, cMISS_TYPE, B_MSG_PROTECTED, BattleScript_SpitUpFailProtect\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tstockpiletobasedamage BattleScript_SpitUpFail\n\ttypecalc\n\tadjustsetdamage\n\tgoto BattleScript_HitFromAtkAnimation\nBattleScript_SpitUpFail::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_FAILEDTOSPITUP\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_SpitUpFailProtect::\n\tattackstring\n\tppreduce\n\tpause B_WAIT_TIME_LONG\n\tstockpiletobasedamage BattleScript_SpitUpFail\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSwallow::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tstockpiletohpheal BattleScript_SwallowFail\n\tgoto BattleScript_PresentHealTarget\n\nBattleScript_SwallowFail::\n\tpause B_WAIT_TIME_SHORT\n\tprintfromtable gSwallowFailStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectHail::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsethail\n\tgoto BattleScript_MoveWeatherChange\n\nBattleScript_EffectTorment::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\tsettorment BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNSUBJECTEDTOTORMENT\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectFlatter::\n\tattackcanceler\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_MakeMoveMissed\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\tjumpifconfusedandstatmaxed STAT_SPATK, BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tsetstatchanger STAT_SPATK, 1, FALSE\n\tstatbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_FlatterTryConfuse\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_FlatterTryConfuse\n\tsetgraphicalstatchangevalues\n\tplayanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_FlatterTryConfuse::\n\tjumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents\n\tjumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected\n\tsetmoveeffect MOVE_EFFECT_CONFUSION\n\tseteffectprimary\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectWillOWisp::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\tjumpifstatus BS_TARGET, STATUS1_BURN, BattleScript_AlreadyBurned\n\tjumpiftype BS_TARGET, TYPE_FIRE, BattleScript_NotAffected\n\tjumpifability BS_TARGET, ABILITY_WATER_VEIL, BattleScript_WaterVeilPrevents\n\tjumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\tjumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected\n\tattackanimation\n\twaitanimation\n\tsetmoveeffect MOVE_EFFECT_BURN\n\tseteffectprimary\n\tgoto BattleScript_MoveEnd\n\nBattleScript_WaterVeilPrevents::\n\tcopybyte gEffectBattler, gBattlerTarget\n\tsetbyte cMULTISTRING_CHOOSER, B_MSG_ABILITY_PREVENTS_MOVE_STATUS\n\tcall BattleScript_BRNPrevention\n\tgoto BattleScript_MoveEnd\n\nBattleScript_AlreadyBurned::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNALREADYHASBURN\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectMemento::\n\tattackcanceler\n\tjumpifbyte CMP_EQUAL, cMISS_TYPE, B_MSG_PROTECTED, BattleScript_MementoTargetProtect\n\tattackstring\n\tppreduce\n\ttrymemento BattleScript_ButItFailed\n\tsetatkhptozero\n\tattackanimation\n\twaitanimation\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_EffectMementoPrintNoEffect\n\tsetbyte sSTAT_ANIM_PLAYED, FALSE\n\tplaystatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS\n\tplaystatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO\n\tsetstatchanger STAT_ATK, 2, TRUE\n\tstatbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTrySpAtk\n@ Greater than B_MSG_DEFENDER_STAT_FELL is checking if the stat cannot decrease\n\tjumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_EffectMementoTrySpAtk\n\tprintfromtable gStatDownStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_EffectMementoTrySpAtk:\n\tplaystatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO\n\tsetstatchanger STAT_SPATK, 2, TRUE\n\tstatbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTryFaint\n@ Greater than B_MSG_DEFENDER_STAT_FELL is checking if the stat cannot decrease\n\tjumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_EffectMementoTryFaint\n\tprintfromtable gStatDownStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_EffectMementoTryFaint:\n\ttryfaintmon BS_ATTACKER\n\tgoto BattleScript_MoveEnd\nBattleScript_EffectMementoPrintNoEffect:\n\tprintstring STRINGID_BUTNOEFFECT\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_EffectMementoTryFaint\n@ If the target is protected there's no need to check the target's stats or animate, the user will just faint\nBattleScript_MementoTargetProtect:\n\tattackstring\n\tppreduce\n\ttrymemento BattleScript_MementoTargetProtectEnd\nBattleScript_MementoTargetProtectEnd:\n\tsetatkhptozero\n\tpause B_WAIT_TIME_LONG\n\teffectivenesssound\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\ttryfaintmon BS_ATTACKER\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectFacade::\n\tjumpifstatus BS_ATTACKER, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, BattleScript_FacadeDoubleDmg\n\tgoto BattleScript_EffectHit\n\nBattleScript_FacadeDoubleDmg::\n\tsetbyte sDMG_MULTIPLIER, 2\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectFocusPunch::\n\tattackcanceler\n\tjumpifnodamage BattleScript_HitFromAccCheck\n\tppreduce\n\tprintstring STRINGID_PKMNLOSTFOCUS\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSmellingsalt::\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_EffectHit\n\tsetmoveeffect MOVE_EFFECT_REMOVE_PARALYSIS | MOVE_EFFECT_CERTAIN\n\tjumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_SmellingsaltDoubleDmg\n\tgoto BattleScript_EffectHit\nBattleScript_SmellingsaltDoubleDmg::\n\tsetbyte sDMG_MULTIPLIER, 2\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectFollowMe::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetforcedtarget\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNCENTERATTENTION\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectNaturePower::\n\tattackcanceler\n\tattackstring\n\tpause B_WAIT_TIME_SHORT\n\tcallterrainattack\n\tprintstring STRINGID_NATUREPOWERTURNEDINTO\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_EffectCharge::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetcharge\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNCHARGINGPOWER\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectTaunt::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\tsettaunt BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNFELLFORTAUNT\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectHelpingHand::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\ttrysethelpinghand BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNREADYTOHELP\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectTrick::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\ttryswapitems BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNSWITCHEDITEMS\n\twaitmessage B_WAIT_TIME_LONG\n\tprintfromtable gItemSwapStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectRolePlay::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON\n\ttrycopyability BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNCOPIEDFOE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectWish::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\ttrywish 0, BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectAssist::\n\tattackcanceler\n\tattackstring\n\tassistattackselect BattleScript_ButItFailedPpReduce\n\tattackanimation\n\twaitanimation\n\tsetbyte sB_ANIM_TURN, 0\n\tsetbyte sB_ANIM_TARGETS_HIT, 0\n\tjumptocalledmove TRUE\n\nBattleScript_EffectIngrain::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\ttrysetroots BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNPLANTEDROOTS\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSuperpower::\n\tsetmoveeffect MOVE_EFFECT_ATK_DEF_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectMagicCoat::\n\tattackcanceler\n\ttrysetmagiccoat BattleScript_ButItFailedAtkStringPpReduce\n\tattackstring\n\tppreduce\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNSHROUDEDITSELF\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectRecycle::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\ttryrecycleitem BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_XFOUNDONEY\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectRevenge::\n\tdoubledamagedealtifdamaged\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectBrickBreak::\n\tattackcanceler\n\taccuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE\n\tattackstring\n\tppreduce\n\tremovelightscreenreflect\n\tcritcalc\n\tdamagecalc\n\ttypecalc\n\tadjustnormaldamage\n\tjumpifbyte CMP_EQUAL, sB_ANIM_TURN, 0, BattleScript_BrickBreakAnim\n\tbicbyte gMoveResultFlags, MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE\nBattleScript_BrickBreakAnim::\n\tattackanimation\n\twaitanimation\n\tjumpifbyte CMP_LESS_THAN, sB_ANIM_TURN, 2, BattleScript_BrickBreakDoHit\n\tprintstring STRINGID_THEWALLSHATTERED\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_BrickBreakDoHit::\n\ttypecalc2\n\teffectivenesssound\n\thitanimation BS_TARGET\n\twaitstate\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tcritmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tseteffectwithchance\n\ttryfaintmon BS_TARGET\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectYawn::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifability BS_TARGET, ABILITY_VITAL_SPIRIT, BattleScript_PrintBankAbilityMadeIneffective\n\tjumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_PrintBankAbilityMadeIneffective\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed\n\tjumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected\n\taccuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON\n\tjumpifcantmakeasleep BattleScript_ButItFailed\n\tsetyawn BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNWASMADEDROWSY\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\nBattleScript_PrintBankAbilityMadeIneffective::\n\tcopybyte sBATTLER, sBATTLER_WITH_ABILITY\nBattleScript_PrintAbilityMadeIneffective::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNSXMADEITINEFFECTIVE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectKnockOff::\n\tsetmoveeffect MOVE_EFFECT_KNOCK_OFF\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectEndeavor::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetdamagetohealthdifference BattleScript_ButItFailed\n\tcopyword gHpDealt, gBattleMoveDamage\n\taccuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE\n\ttypecalc\n\tjumpifmovehadnoeffect BattleScript_HitFromAtkAnimation\n\tbicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE\n\tcopyword gBattleMoveDamage, gHpDealt\n\tadjustsetdamage\n\tgoto BattleScript_HitFromAtkAnimation\n\nBattleScript_EffectEruption::\n\tscaledamagebyhealthratio\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectSkillSwap::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\taccuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON\n\ttryswapabilities BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNSWAPPEDABILITIES\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectImprison::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\ttryimprison BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNSEALEDOPPONENTMOVE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectRefresh::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tcureifburnedparalysedorpoisoned BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNSTATUSNORMAL\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_ATTACKER\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectGrudge::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\ttrysetgrudge BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNWANTSGRUDGE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSnatch::\n\tattackcanceler\n\ttrysetsnatch BattleScript_ButItFailedAtkStringPpReduce\n\tattackstring\n\tppreduce\n\tattackanimation\n\twaitanimation\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNWAITSFORTARGET\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectLowKick::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tweightdamagecalculation\n\taccuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE\n\tgoto BattleScript_HitFromCritCalc\n\nBattleScript_EffectSecretPower::\n\tgetsecretpowereffect\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectDoubleEdge::\n\tsetmoveeffect MOVE_EFFECT_RECOIL_33 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectTeeterDance::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsetbyte gBattlerTarget, 0\nBattleScript_TeeterDanceLoop::\n\tmovevaluescleanup\n\tsetmoveeffect MOVE_EFFECT_CONFUSION\n\tjumpifbyteequal gBattlerAttacker, gBattlerTarget, BattleScript_TeeterDanceLoopIncrement\n\tjumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_TeeterDanceOwnTempoPrevents\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_TeeterDanceSubstitutePrevents\n\tjumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_TeeterDanceAlreadyConfused\n\taccuracycheck BattleScript_TeeterDanceMissed, ACC_CURR_MOVE\n\tjumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_TeeterDanceSafeguardProtected\n\tattackanimation\n\twaitanimation\n\tseteffectprimary\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_TeeterDanceLoopIncrement::\n\tmoveendto MOVEEND_NEXT_TARGET\n\taddbyte gBattlerTarget, 1\n\tjumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_TeeterDanceLoop\n\tend\n\nBattleScript_TeeterDanceOwnTempoPrevents::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNPREVENTSCONFUSIONWITH\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_TeeterDanceLoopIncrement\n\nBattleScript_TeeterDanceSafeguardProtected::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNUSEDSAFEGUARD\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_TeeterDanceLoopIncrement\n\nBattleScript_TeeterDanceSubstitutePrevents::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_BUTITFAILED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_TeeterDanceLoopIncrement\n\nBattleScript_TeeterDanceAlreadyConfused::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNALREADYCONFUSED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_TeeterDanceLoopIncrement\n\nBattleScript_TeeterDanceMissed::\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_TeeterDanceLoopIncrement\n\nBattleScript_EffectMudSport::\nBattleScript_EffectWaterSport::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsettypebasedhalvers BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintfromtable gSportsUsedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectPoisonFang::\n\tsetmoveeffect MOVE_EFFECT_TOXIC\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectWeatherBall::\n\tsetweatherballtype\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectOverheat::\n\tsetmoveeffect MOVE_EFFECT_SP_ATK_TWO_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectTickle::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_TickleDoMoveAnim\n\tjumpifstat BS_TARGET, CMP_EQUAL, STAT_DEF, MIN_STAT_STAGE, BattleScript_CantLowerMultipleStats\nBattleScript_TickleDoMoveAnim::\n\taccuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE\n\tattackanimation\n\twaitanimation\n\tsetbyte sSTAT_ANIM_PLAYED, FALSE\n\tplaystatchangeanimation BS_TARGET, BIT_ATK | BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS\n\tplaystatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE\n\tsetstatchanger STAT_ATK, 1, TRUE\n\tstatbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TickleTryLowerDef\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_TickleTryLowerDef\n\tprintfromtable gStatDownStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_TickleTryLowerDef::\n\tplaystatchangeanimation BS_TARGET, BIT_DEF, STAT_CHANGE_NEGATIVE\n\tsetstatchanger STAT_DEF, 1, TRUE\n\tstatbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TickleEnd\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_TickleEnd\n\tprintfromtable gStatDownStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_TickleEnd::\n\tgoto BattleScript_MoveEnd\n\nBattleScript_CantLowerMultipleStats::\n\tpause B_WAIT_TIME_SHORT\n\torbyte gMoveResultFlags, MOVE_RESULT_FAILED\n\tprintstring STRINGID_STATSWONTDECREASE2\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectCosmicPower::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_CosmicPowerDoMoveAnim\n\tjumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats\nBattleScript_CosmicPowerDoMoveAnim::\n\tattackanimation\n\twaitanimation\n\tsetbyte sSTAT_ANIM_PLAYED, FALSE\n\tplaystatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, 0\n\tsetstatchanger STAT_DEF, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerTrySpDef\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerTrySpDef\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_CosmicPowerTrySpDef::\n\tsetstatchanger STAT_SPDEF, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerEnd\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerEnd\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_CosmicPowerEnd::\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectSkyUppercut::\n\torword gHitMarker, HITMARKER_IGNORE_ON_AIR\n\tgoto BattleScript_EffectHit\n\nBattleScript_EffectBulkUp::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_BulkUpDoMoveAnim\n\tjumpifstat BS_ATTACKER, CMP_EQUAL, STAT_DEF, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats\nBattleScript_BulkUpDoMoveAnim::\n\tattackanimation\n\twaitanimation\n\tsetbyte sSTAT_ANIM_PLAYED, FALSE\n\tplaystatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF, 0\n\tsetstatchanger STAT_ATK, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpTryDef\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpTryDef\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_BulkUpTryDef::\n\tsetstatchanger STAT_DEF, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpEnd\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpEnd\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_BulkUpEnd::\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectCalmMind::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_CalmMindDoMoveAnim\n\tjumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats\nBattleScript_CalmMindDoMoveAnim::\n\tattackanimation\n\twaitanimation\n\tsetbyte sSTAT_ANIM_PLAYED, FALSE\n\tplaystatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF, 0\n\tsetstatchanger STAT_SPATK, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindTrySpDef\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindTrySpDef\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_CalmMindTrySpDef::\n\tsetstatchanger STAT_SPDEF, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindEnd\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindEnd\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_CalmMindEnd::\n\tgoto BattleScript_MoveEnd\n\nBattleScript_CantRaiseMultipleStats::\n\tpause B_WAIT_TIME_SHORT\n\torbyte gMoveResultFlags, MOVE_RESULT_FAILED\n\tprintstring STRINGID_STATSWONTINCREASE2\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectDragonDance::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tjumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_DragonDanceDoMoveAnim\n\tjumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats\nBattleScript_DragonDanceDoMoveAnim::\n\tattackanimation\n\twaitanimation\n\tsetbyte sSTAT_ANIM_PLAYED, FALSE\n\tplaystatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPEED, 0\n\tsetstatchanger STAT_ATK, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceTrySpeed\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceTrySpeed\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_DragonDanceTrySpeed::\n\tsetstatchanger STAT_SPEED, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceEnd\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceEnd\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_DragonDanceEnd::\n\tgoto BattleScript_MoveEnd\n\nBattleScript_EffectCamouflage::\n\tattackcanceler\n\tattackstring\n\tppreduce\n\tsettypetoterrain BattleScript_ButItFailed\n\tattackanimation\n\twaitanimation\n\tprintstring STRINGID_PKMNCHANGEDTYPE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_FaintAttacker::\n\tplayfaintcry BS_ATTACKER\n\tpause B_WAIT_TIME_LONG\n\tdofaintanimation BS_ATTACKER\n\tcleareffectsonfaint BS_ATTACKER\n\tprintstring STRINGID_ATTACKERFAINTED\n\tprintstring STRINGID_EMPTYSTRING3\n\treturn\n\nBattleScript_FaintTarget::\n\tplayfaintcry BS_TARGET\n\tpause B_WAIT_TIME_LONG\n\tdofaintanimation BS_TARGET\n\tcleareffectsonfaint BS_TARGET\n\tprintstring STRINGID_TARGETFAINTED\n\tprintstring STRINGID_EMPTYSTRING3\n\treturn\n\nBattleScript_GiveExp::\n\tsetbyte sGIVEEXP_STATE, 0\n\tgetexp BS_TARGET\n\tend2\n\nBattleScript_HandleFaintedMon::\n\tcheckteamslost BattleScript_LinkHandleFaintedMonMultiple\n\tjumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_FaintedMonEnd\n\tjumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_FaintedMonTryChoose\n\tjumpifword CMP_NO_COMMON_BITS, gHitMarker, HITMARKER_PLAYER_FAINTED, BattleScript_FaintedMonTryChoose\n\tprintstring STRINGID_USENEXTPKMN\n\tsetbyte gBattleCommunication, 0\n\tyesnobox\n\tjumpifbyte CMP_EQUAL, gBattleCommunication + 1, 0, BattleScript_FaintedMonTryChoose\n\tjumpifplayerran BattleScript_FaintedMonEnd\n\tprintstring STRINGID_CANTESCAPE2\nBattleScript_FaintedMonTryChoose::\n\topenpartyscreen BS_FAINTED, BattleScript_FaintedMonEnd\n\tswitchhandleorder BS_FAINTED, 2\n\tjumpifnotbattletype BATTLE_TYPE_TRAINER, BattleScript_FaintedMonSendOutNew\n\tjumpifbattletype BATTLE_TYPE_LINK, BattleScript_FaintedMonSendOutNew\n\tjumpifbattletype BATTLE_TYPE_BATTLE_TOWER, BattleScript_FaintedMonSendOutNew\n\tjumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_FaintedMonSendOutNew\n\tjumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_PLAYER_FAINTED, BattleScript_FaintedMonSendOutNew\n\tjumpifbyte CMP_EQUAL, sBATTLE_STYLE, OPTIONS_BATTLE_STYLE_SET, BattleScript_FaintedMonSendOutNew\n\tjumpifcantswitch BS_PLAYER1, BattleScript_FaintedMonSendOutNew\n\tjumpifbyte CMP_EQUAL, sBATTLE_STYLE, OPTIONS_BATTLE_STYLE_SHIFT, BattleScript_SwitchBattleStylePrintString\n\t@ Yes/No for sending out a new Pokémon when the opponent is switching\n\tprintstring STRINGID_ENEMYABOUTTOSWITCHPKMN\nBattleScript_HandleSwitchAfterFaintingEnemyInput::\n\tsetbyte gBattleCommunication, 0\n\tyesnobox\n\tjumpifbyte CMP_EQUAL, gBattleCommunication + 1, 1, BattleScript_FaintedMonSendOutNew\n@ Player said yes, go to party screen (note optional flag, player may exit the menu instead)\n\tsetatktoplayer0\n\topenpartyscreen BS_ATTACKER | PARTY_SCREEN_OPTIONAL, BattleScript_FaintedMonSendOutNew\n\tswitchhandleorder BS_ATTACKER, 2\n\tjumpifbyte CMP_EQUAL, gBattleCommunication, PARTY_SIZE, BattleScript_FaintedMonSendOutNew\n@ Switch Pokémon before opponent\n\tatknameinbuff1\n\tresetintimidatetracebits BS_ATTACKER\n\thpthresholds2 BS_ATTACKER\n\tprintstring STRINGID_RETURNMON\n\tswitchoutabilities BS_ATTACKER\n\twaitstate\n\treturnatktoball\n\twaitstate\n\tdrawpartystatussummary BS_ATTACKER\n\tgetswitchedmondata BS_ATTACKER\n\tswitchindataupdate BS_ATTACKER\n\thpthresholds BS_ATTACKER\n\tprintstring STRINGID_SWITCHINMON\n\thidepartystatussummary BS_ATTACKER\n\tswitchinanim BS_ATTACKER, 0\n\twaitstate\n\tswitchineffects BS_ATTACKER\n\tresetsentmonsvalue\nBattleScript_FaintedMonSendOutNew::\n\tdrawpartystatussummary BS_FAINTED\n\tgetswitchedmondata BS_FAINTED\n\tswitchindataupdate BS_FAINTED\n\thpthresholds BS_FAINTED\n\tprintstring STRINGID_SWITCHINMON\n\thidepartystatussummary BS_FAINTED\n\tswitchinanim BS_FAINTED, FALSE\n\twaitstate\n\tresetplayerfainted\n\tswitchineffects BS_FAINTED\n\tjumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_FaintedMonEnd\n\tcancelallactions\nBattleScript_FaintedMonEnd::\n\tend2\n\nBattleScript_SwitchBattleStylePrintString::\n\tprintstring STRINGID_ENEMYABOUTTOSWITCHPKMNNOPREDICT\n\tjumpifbyte CMP_EQUAL, sBATTLE_STYLE, 1, BattleScript_HandleSwitchAfterFaintingEnemyInput\n\nBattleScript_LinkHandleFaintedMonMultiple::\n\topenpartyscreen BS_FAINTED_LINK_MULTIPLE_1, BattleScript_LinkHandleFaintedMonMultipleStart\nBattleScript_LinkHandleFaintedMonMultipleStart::\n\tswitchhandleorder BS_FAINTED, 0\n\topenpartyscreen BS_FAINTED_LINK_MULTIPLE_2, BattleScript_LinkHandleFaintedMonMultipleEnd\n\tswitchhandleorder BS_FAINTED, 0\nBattleScript_LinkHandleFaintedMonLoop::\n\tswitchhandleorder BS_FAINTED, 2\n\tdrawpartystatussummary BS_FAINTED\n\tgetswitchedmondata BS_FAINTED\n\tswitchindataupdate BS_FAINTED\n\thpthresholds BS_FAINTED\n\tprintstring STRINGID_SWITCHINMON\n\thidepartystatussummary BS_FAINTED\n\tswitchinanim BS_FAINTED, FALSE\n\twaitstate\n\tswitchineffects BS_FAINTED_LINK_MULTIPLE_1\n\tjumpifbytenotequal gBattlerFainted, gBattlersCount, BattleScript_LinkHandleFaintedMonLoop\nBattleScript_LinkHandleFaintedMonMultipleEnd::\n\tend2\n\nBattleScript_LocalTrainerBattleWon::\n\tprintstring STRINGID_PLAYERDEFEATEDTRAINER1\n\ttrainerslidein BS_ATTACKER\n\twaitstate\n\tprintstring STRINGID_TRAINER1LOSETEXT\n\tgetmoneyreward BattleScript_LocalTrainerBattleWonGotMoney\nBattleScript_LocalTrainerBattleWonGotMoney::\n\tprintstring STRINGID_PLAYERGOTMONEY\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_PayDayMoneyAndPickUpItems::\n\tgivepaydaymoney\n\tpickup\n\tend2\n\nBattleScript_PickedUpItem::\n\tprintstring STRINGID_PICKUP\n\twaitmessage 0x40\n\treturn\n\nBattleScript_PickedUpItemSolo::\n\tprintstring STRINGID_PICKUPSOLO\n\twaitmessage 0x40\n\treturn\n\nBattleScript_LocalBattleLost::\n\tjumpifbattletype BATTLE_TYPE_BATTLE_TOWER, BattleScript_EReaderOrSecretBaseTrainerEnd\n\tjumpifbattletype BATTLE_TYPE_TRAINER_TOWER, BattleScript_BattleTowerLost\n\tjumpifbattletype BATTLE_TYPE_EREADER_TRAINER, BattleScript_EReaderOrSecretBaseTrainerEnd\n\tjumpifhalfword CMP_EQUAL, gTrainerBattleOpponent_A, TRAINER_SECRET_BASE, BattleScript_EReaderOrSecretBaseTrainerEnd\n\tjumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, 0, BattleScript_RivalBattleLost\nBattleScript_LocalBattleLostPrintWhiteOut::\n\tjumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_LocalBattleLostEnd\n\tprintstring STRINGID_PLAYERWHITEOUT\n\twaitmessage B_WAIT_TIME_LONG\n\tgetmoneyreward BattleScript_LocalBattleLostPrintTrainersWinText\n\tprintstring STRINGID_PLAYERWHITEOUT2\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_EReaderOrSecretBaseTrainerEnd\n\nBattleScript_LocalBattleLostEnd::\n\tprintstring STRINGID_PLAYERLOSTAGAINSTENEMYTRAINER\n\twaitmessage B_WAIT_TIME_LONG\n\tgetmoneyreward BattleScript_LocalBattleLostPrintTrainersWinText\n\tprintstring STRINGID_PLAYERPAIDPRIZEMONEY\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_EReaderOrSecretBaseTrainerEnd::\n\tend2\n\nBattleScript_LocalBattleLostPrintTrainersWinText::\n\tprintstring STRINGID_PLAYERWHITEDOUT\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_RivalBattleLost::\n\tjumpifhasnohp BS_ATTACKER, BattleScript_RivalBattleLostSkipMonRecall\n\tprintstring STRINGID_TRAINER1MON1COMEBACK\n\twaitmessage B_WAIT_TIME_LONG\n\treturnatktoball\n\twaitstate\nBattleScript_RivalBattleLostSkipMonRecall::\n\ttrainerslidein BS_ATTACKER\n\twaitstate\n\tprintstring STRINGID_TRAINER1WINTEXT\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 2, BattleScript_LocalBattleLostPrintWhiteOut\n\tend2\n\nBattleScript_BattleTowerLost::\n\tgetbattlersforrecall\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0, BattleScript_BattleTowerLostLostSkipMonRecall\n\tprintfromtable gDoubleBattleRecallStrings\n\twaitmessage B_WAIT_TIME_LONG\n\treturnopponentmon1toball\n\twaitstate\n\treturnopponentmon2toball\n\twaitstate\nBattleScript_BattleTowerLostLostSkipMonRecall::\n\ttrainerslidein BS_ATTACKER\n\twaitstate\n\tprintstring STRINGID_TRAINER1WINTEXT\n\tjumpifnotbattletype BATTLE_TYPE_DOUBLE, BattleScript_BattleTowerLostLostSkipDouble\n\tprintstring STRINGID_TRAINER2WINTEXT\nBattleScript_BattleTowerLostLostSkipDouble::\n\tend2\n\nBattleScript_LinkBattleWonOrLost::\n\tprintstring STRINGID_BATTLEEND\n\twaitmessage B_WAIT_TIME_LONG\n\tendlinkbattle\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_BattleTowerTrainerBattleWon::\n\tprintstring STRINGID_PLAYERDEFEATEDTRAINER1\n\ttrainerslidein BS_ATTACKER\n\twaitstate\n\tjumpifnotbattletype BATTLE_TYPE_TRAINER_TOWER, BattleScript_BattleTowerEtcTrainerBattleWonSkipText\n\tprintstring STRINGID_TRAINER1LOSETEXT\n\tjumpifnotbattletype BATTLE_TYPE_DOUBLE, BattleScript_BattleTowerEtcTrainerBattleWonSkipText\n\tprintstring STRINGID_TRAINER2LOSETEXT\nBattleScript_BattleTowerEtcTrainerBattleWonSkipText::\n\t//pickup\n\tend2\n\nBattleScript_MasterTrainerBattleWon::\n\tprintstring STRINGID_PLAYERDEFEATEDTRAINER1\n\ttrainerslidein BS_ATTACKER\n\twaitstate\n\tprintstring STRINGID_TRAINER1LOSETEXT\n\twaitmessage 0x40\n\t//pickup\n\tend2\n\nBattleScript_SmokeBallEscape::\n\tplayanimation BS_ATTACKER, B_ANIM_SMOKEBALL_ESCAPE\n\tprintstring STRINGID_PKMNFLEDUSINGITS\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_RanAwayUsingMonAbility::\n\tprintstring STRINGID_PKMNFLEDUSING\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_GotAwaySafely::\n\tprintstring STRINGID_GOTAWAYSAFELY\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_WildMonFled::\n\tprintstring STRINGID_WILDPKMNFLED\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_PrintCantRunFromTrainer::\n\tjumpifbattletype BATTLE_TYPE_FIRST_BATTLE, BattleScript_LeftoverBirchString\n\tprintstring STRINGID_NORUNNINGFROMTRAINERS\n\tend2\n\nBattleScript_LeftoverBirchString::\n\tprintstring STRINGID_DONTLEAVEBIRCH\n\tend2\n\nBattleScript_PrintFailedToRunString::\n\tprintfromtable gNoEscapeStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_PrintCantEscapeFromBattle::\n\tprintselectionstringfromtable gNoEscapeStringIds\n\tendselectionscript\n\nBattleScript_PrintFullBox::\n\tprintselectionstring STRINGID_BOXISFULL\n\tendselectionscript\n\nBattleScript_ActionSwitch::\n\thpthresholds2 BS_ATTACKER\n\tprintstring STRINGID_RETURNMON\n\tsetbyte sDMG_MULTIPLIER, 2\n\tjumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_PursuitSwitchDmgSetMultihit\n\tsetmultihit 1\n\tgoto BattleScript_PursuitSwitchDmgLoop\nBattleScript_PursuitSwitchDmgSetMultihit::\n\tsetmultihit 2\nBattleScript_PursuitSwitchDmgLoop::\n\tjumpifnopursuitswitchdmg BattleScript_DoSwitchOut\n\tswapattackerwithtarget\n\ttrysetdestinybondtohappen\n\tcall BattleScript_PursuitDmgOnSwitchOut\n\tswapattackerwithtarget\nBattleScript_DoSwitchOut::\n\tdecrementmultihit BattleScript_PursuitSwitchDmgLoop\n\tswitchoutabilities BS_ATTACKER\n\twaitstate\n\treturnatktoball\n\twaitstate\n\tdrawpartystatussummary BS_ATTACKER\n\tswitchhandleorder BS_ATTACKER, 1\n\tgetswitchedmondata BS_ATTACKER\n\tswitchindataupdate BS_ATTACKER\n\thpthresholds BS_ATTACKER\n\tprintstring STRINGID_SWITCHINMON\n\thidepartystatussummary BS_ATTACKER\n\tswitchinanim BS_ATTACKER, FALSE\n\twaitstate\n\tswitchineffects BS_ATTACKER\n\tmoveendcase MOVEEND_IMMUNITY_ABILITIES\n\tmoveendcase MOVEEND_MIRROR_MOVE\n\tend2\n\nBattleScript_PursuitDmgOnSwitchOut::\n\tpause B_WAIT_TIME_SHORT\n\tattackstring\n\tppreduce\n\tcritcalc\n\tdamagecalc\n\ttypecalc\n\tadjustnormaldamage\n\tattackanimation\n\twaitanimation\n\teffectivenesssound\n\thitanimation BS_TARGET\n\twaitstate\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tcritmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\ttryfaintmon BS_TARGET\n\tmoveendfromto MOVEEND_ON_DAMAGE_ABILITIES, MOVEEND_CHOICE_MOVE\n\tgetbattlerfainted BS_TARGET\n\tjumpifbyte CMP_EQUAL, gBattleCommunication, FALSE, BattleScript_PursuitDmgOnSwitchOutRet\n\tsetbyte sGIVEEXP_STATE, 0\n\tgetexp BS_TARGET\nBattleScript_PursuitDmgOnSwitchOutRet:\n\treturn\n\nBattleScript_Pausex20::\n\tpause B_WAIT_TIME_SHORT\n\treturn\n\nBattleScript_LevelUp::\n\tfanfare MUS_LEVEL_UP\n\tprintstring STRINGID_PKMNGREWTOLV\n\tsetbyte sLVLBOX_STATE, 0\n\tdrawlvlupbox\n\thandlelearnnewmove BattleScript_LearnedNewMove, BattleScript_LearnMoveReturn, TRUE\n\tgoto BattleScript_AskToLearnMove\nBattleScript_TryLearnMoveLoop::\n\thandlelearnnewmove BattleScript_LearnedNewMove, BattleScript_LearnMoveReturn, FALSE\nBattleScript_AskToLearnMove::\n\tbuffermovetolearn\n\tprintstring STRINGID_TRYTOLEARNMOVE1\n\tprintstring STRINGID_TRYTOLEARNMOVE2\n\tprintstring STRINGID_TRYTOLEARNMOVE3\n\twaitstate\n\tsetbyte sLEARNMOVE_STATE, 0\n\tyesnoboxlearnmove BattleScript_ForgotAndLearnedNewMove\n\tprintstring STRINGID_STOPLEARNINGMOVE\n\twaitstate\n\tsetbyte sLEARNMOVE_STATE, 0\n\tyesnoboxstoplearningmove BattleScript_AskToLearnMove\n\tprintstring STRINGID_DIDNOTLEARNMOVE\n\tgoto BattleScript_TryLearnMoveLoop\nBattleScript_ForgotAndLearnedNewMove::\n\tprintstring STRINGID_123POOF\n\tprintstring STRINGID_PKMNFORGOTMOVE\n\tprintstring STRINGID_ANDELLIPSIS\nBattleScript_LearnedNewMove::\n\tbuffermovetolearn\n\tfanfare MUS_LEVEL_UP\n\tprintstring STRINGID_PKMNLEARNEDMOVE\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatechoicemoveonlvlup BS_ATTACKER\n\tgoto BattleScript_TryLearnMoveLoop\nBattleScript_LearnMoveReturn::\n\treturn\n\nBattleScript_RainContinuesOrEnds::\n\tprintfromtable gRainContinuesStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_RAIN_STOPPED, BattleScript_RainContinuesOrEndsEnd\n\tplayanimation BS_ATTACKER, B_ANIM_RAIN_CONTINUES\nBattleScript_RainContinuesOrEndsEnd::\n\tend2\n\nBattleScript_DamagingWeatherContinues::\n\tprintfromtable gSandstormHailContinuesStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tplayanimation_var BS_ATTACKER, sB_ANIM_ARG1\n\tsetbyte gBattleCommunication, 0\nBattleScript_DamagingWeatherLoop::\n\tcopyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattleCommunication, 1\n\tweatherdamage\n\tjumpifword CMP_EQUAL, gBattleMoveDamage, NULL, BattleScript_DamagingWeatherContinuesEnd\n\tprintfromtable gSandstormHailDmgStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\torword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE\n\teffectivenesssound\n\thitanimation BS_ATTACKER\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\ttryfaintmon BS_ATTACKER\n\tcheckteamslost BattleScript_DamagingWeatherContinuesEnd\nBattleScript_DamagingWeatherContinuesEnd::\n\tjumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_WeatherDamageEndedBattle\n\taddbyte gBattleCommunication, 1\n\tjumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_DamagingWeatherLoop\nBattleScript_WeatherDamageEndedBattle::\n\tbicword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE\n\tend2\n\nBattleScript_SandStormHailEnds::\n\tprintfromtable gSandstormHailEndStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_SunlightContinues::\n\tprintstring STRINGID_SUNLIGHTSTRONG\n\twaitmessage B_WAIT_TIME_LONG\n\tplayanimation BS_ATTACKER, B_ANIM_SUN_CONTINUES\n\tend2\n\nBattleScript_SunlightFaded::\n\tprintstring STRINGID_SUNLIGHTFADED\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_OverworldWeatherStarts::\n\tprintfromtable gWeatherStartsStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tplayanimation_var BS_ATTACKER, sB_ANIM_ARG1\n\tend3\n\nBattleScript_SideStatusWoreOff::\n\tprintstring STRINGID_PKMNSXWOREOFF\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_SafeguardProtected::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNUSEDSAFEGUARD\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_SafeguardEnds::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNSAFEGUARDEXPIRED\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_LeechSeedTurnDrain::\n\tplayanimation BS_ATTACKER, B_ANIM_LEECH_SEED_DRAIN, sB_ANIM_ARG1\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tcopyword gBattleMoveDamage, gHpDealt\n\tjumpifability BS_ATTACKER, ABILITY_LIQUID_OOZE, BattleScript_LeechSeedLiquidOoze\n\tmanipulatedamage 0\n\tsetbyte cMULTISTRING_CHOOSER, 3\n\tgoto BattleScript_LeechSeedTurnPrintAndUpdateHp\n\nBattleScript_LeechSeedLiquidOoze::\n\tsetbyte cMULTISTRING_CHOOSER, 4\nBattleScript_LeechSeedTurnPrintAndUpdateHp::\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tprintfromtable gLeechSeedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\ttryfaintmon BS_ATTACKER\n\ttryfaintmon BS_TARGET\n\tend2\n\nBattleScript_BideStoringEnergy::\n\tprintstring STRINGID_PKMNSTORINGENERGY\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_BideAttack::\n\tattackcanceler\n\tsetmoveeffect MOVE_EFFECT_CHARGING\n\tclearstatusfromeffect BS_ATTACKER\n\tprintstring STRINGID_PKMNUNLEASHEDENERGY\n\twaitmessage B_WAIT_TIME_LONG\n\taccuracycheck BattleScript_MoveMissed, ACC_CURR_MOVE\n\ttypecalc\n\tbicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE\n\tcopyword gBattleMoveDamage, sBIDE_DMG\n\tadjustsetdamage\n\tsetbyte sB_ANIM_TURN, 1\n\tattackanimation\n\twaitanimation\n\teffectivenesssound\n\thitanimation BS_TARGET\n\twaitstate\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\ttryfaintmon BS_TARGET\n\tgoto BattleScript_MoveEnd\n\nBattleScript_BideNoEnergyToAttack::\n\tattackcanceler\n\tsetmoveeffect MOVE_EFFECT_CHARGING\n\tclearstatusfromeffect BS_ATTACKER\n\tprintstring STRINGID_PKMNUNLEASHEDENERGY\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_ButItFailed\n\nBattleScript_SuccessForceOut::\n\tattackanimation\n\twaitanimation\n\tswitchoutabilities BS_TARGET\n\treturntoball BS_TARGET\n\twaitstate\n\tjumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_TrainerBattleForceOut\n\tsetbyte gBattleOutcome, B_OUTCOME_PLAYER_TELEPORTED\n\tfinishaction\n\nBattleScript_TrainerBattleForceOut::\n\tgetswitchedmondata BS_TARGET\n\tswitchindataupdate BS_TARGET\n\tswitchinanim BS_TARGET, FALSE\n\twaitstate\n\tprintstring STRINGID_PKMNWASDRAGGEDOUT\n\tswitchineffects BS_TARGET\n\tgoto BattleScript_MoveEnd\n\nBattleScript_MistProtected::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNPROTECTEDBYMIST\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_RageIsBuilding::\n\tprintstring STRINGID_PKMNRAGEBUILDING\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_MoveUsedIsDisabled::\n\tprintstring STRINGID_PKMNMOVEISDISABLED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_SelectingDisabledMove::\n\tprintselectionstring STRINGID_PKMNMOVEISDISABLED\n\tendselectionscript\n\nBattleScript_DisabledNoMore::\n\tprintstring STRINGID_PKMNMOVEDISABLEDNOMORE\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_EncoredNoMore::\n\tprintstring STRINGID_PKMNENCOREENDED\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_DestinyBondTakesLife::\n\tprintstring STRINGID_PKMNTOOKFOE\n\twaitmessage B_WAIT_TIME_LONG\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\ttryfaintmon BS_ATTACKER\n\treturn\n\nBattleScript_SpikesOnAttacker::\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tcall BattleScript_PrintHurtBySpikes\n\ttryfaintmon BS_ATTACKER\n\ttryfaintmon_spikes BS_ATTACKER, BattleScript_SpikesOnAttackerFainted\n\treturn\n\nBattleScript_SpikesOnAttackerFainted::\n\tsetbyte sGIVEEXP_STATE, 0\n\tgetexp BS_ATTACKER\n\tmoveendall\n\tgoto BattleScript_HandleFaintedMon\n\nBattleScript_SpikesOnTarget::\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tcall BattleScript_PrintHurtBySpikes\n\ttryfaintmon BS_TARGET\n\ttryfaintmon_spikes BS_TARGET, BattleScript_SpikesOnTargetFainted\n\treturn\n\nBattleScript_SpikesOnTargetFainted::\n\tsetbyte sGIVEEXP_STATE, 0\n\tgetexp BS_TARGET\n\tmoveendall\n\tgoto BattleScript_HandleFaintedMon\n\nBattleScript_SpikesOnFaintedBattler::\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE\n\thealthbarupdate BS_FAINTED\n\tdatahpupdate BS_FAINTED\n\tcall BattleScript_PrintHurtBySpikes\n\ttryfaintmon BS_FAINTED\n\ttryfaintmon_spikes BS_FAINTED, BattleScript_SpikesOnFaintedBattlerFainted\n\treturn\n\nBattleScript_SpikesOnFaintedBattlerFainted::\n\tsetbyte sGIVEEXP_STATE, 0\n\tgetexp BS_FAINTED\n\tmoveendall\n\tgoto BattleScript_HandleFaintedMon\n\nBattleScript_PrintHurtBySpikes::\n\tprintstring STRINGID_PKMNHURTBYSPIKES\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_PerishSongTakesLife::\n\tprintstring STRINGID_PKMNPERISHCOUNTFELL\n\twaitmessage B_WAIT_TIME_LONG\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\ttryfaintmon BS_ATTACKER\n\tend2\n\nBattleScript_PerishSongCountGoesDown::\n\tprintstring STRINGID_PKMNPERISHCOUNTFELL\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_AllStatsUp::\n\tjumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_AllStatsUpAtk\n\tjumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_AllStatsUpAtk\n\tjumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_AllStatsUpAtk\n\tjumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_AllStatsUpAtk\n\tjumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_AllStatsUpRet\nBattleScript_AllStatsUpAtk::\n\tsetbyte sSTAT_ANIM_PLAYED, FALSE\n\tplaystatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, 0\n\tsetstatchanger STAT_ATK, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpDef\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_AllStatsUpDef::\n\tsetstatchanger STAT_DEF, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpeed\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_AllStatsUpSpeed::\n\tsetstatchanger STAT_SPEED, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpAtk\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_AllStatsUpSpAtk::\n\tsetstatchanger STAT_SPATK, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpDef\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_AllStatsUpSpDef::\n\tsetstatchanger STAT_SPDEF, 1, FALSE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpRet\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_AllStatsUpRet::\n\treturn\n\nBattleScript_RapidSpinAway::\n\trapidspinfree\n\treturn\n\nBattleScript_WrapFree::\n\tprintstring STRINGID_PKMNGOTFREE\n\twaitmessage B_WAIT_TIME_LONG\n\tcopybyte gBattlerTarget, sBATTLER\n\treturn\n\nBattleScript_LeechSeedFree::\n\tprintstring STRINGID_PKMNSHEDLEECHSEED\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_SpikesFree::\n\tprintstring STRINGID_PKMNBLEWAWAYSPIKES\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_MonTookFutureAttack::\n\tprintstring STRINGID_PKMNTOOKATTACK\n\twaitmessage B_WAIT_TIME_LONG\n\tjumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_FUTURE_SIGHT, BattleScript_CheckDoomDesireMiss\n\taccuracycheck BattleScript_FutureAttackMiss, MOVE_FUTURE_SIGHT\n\tgoto BattleScript_FutureAttackAnimate\nBattleScript_CheckDoomDesireMiss::\n\taccuracycheck BattleScript_FutureAttackMiss, MOVE_DOOM_DESIRE\nBattleScript_FutureAttackAnimate::\n\tadjustnormaldamage2\n\tjumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_FUTURE_SIGHT, BattleScript_FutureHitAnimDoomDesire\n\tplayanimation BS_ATTACKER, B_ANIM_FUTURE_SIGHT_HIT\n\tgoto BattleScript_DoFutureAttackHit\nBattleScript_FutureHitAnimDoomDesire::\n\tplayanimation BS_ATTACKER, B_ANIM_DOOM_DESIRE_HIT\nBattleScript_DoFutureAttackHit::\n\teffectivenesssound\n\thitanimation BS_TARGET\n\twaitstate\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\ttryfaintmon BS_TARGET\n\tcheckteamslost BattleScript_FutureAttackEnd\nBattleScript_FutureAttackEnd::\n\tmoveendcase MOVEEND_RAGE\n\tmoveendfromto MOVEEND_ITEM_EFFECTS_ALL, MOVEEND_UPDATE_LAST_MOVES\n\tsetbyte gMoveResultFlags, 0\n\tend2\n\nBattleScript_FutureAttackMiss::\n\tpause B_WAIT_TIME_SHORT\n\tsetbyte gMoveResultFlags, 0\n\torbyte gMoveResultFlags, MOVE_RESULT_FAILED\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\tsetbyte gMoveResultFlags, 0\n\tend2\n\nBattleScript_NoMovesLeft::\n\tprintselectionstring STRINGID_PKMNHASNOMOVESLEFT\n\tendselectionscript\n\nBattleScript_SelectingMoveWithNoPP::\n\tprintselectionstring STRINGID_NOPPLEFT\n\tendselectionscript\n\nBattleScript_NoPPForMove::\n\tattackstring\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_BUTNOPPLEFT\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_SelectingTormentedMove::\n\tprintselectionstring STRINGID_PKMNCANTUSEMOVETORMENT\n\tendselectionscript\n\n\tprintstring STRINGID_PKMNCANTUSEMOVETORMENT\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_SelectingNotAllowedMoveTaunt::\n\tprintselectionstring STRINGID_PKMNCANTUSEMOVETAUNT\n\tendselectionscript\n\nBattleScript_MoveUsedIsTaunted::\n\tprintstring STRINGID_PKMNCANTUSEMOVETAUNT\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_WishComesTrue::\n\ttrywish 1, BattleScript_WishButFullHp\n\tplayanimation BS_TARGET, B_ANIM_WISH_HEAL\n\tprintstring STRINGID_PKMNWISHCAMETRUE\n\twaitmessage B_WAIT_TIME_LONG\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tprintstring STRINGID_PKMNREGAINEDHEALTH\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_WishButFullHp::\n\tprintstring STRINGID_PKMNWISHCAMETRUE\n\twaitmessage B_WAIT_TIME_LONG\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNHPFULL\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_IngrainTurnHeal::\n\tplayanimation BS_ATTACKER, B_ANIM_INGRAIN_HEAL\n\tprintstring STRINGID_PKMNABSORBEDNUTRIENTS\n\twaitmessage B_WAIT_TIME_LONG\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tend2\n\nBattleScript_PrintMonIsRooted::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNANCHOREDITSELF\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_AtkDefDown::\n\tsetbyte sSTAT_ANIM_PLAYED, FALSE\n\tplaystatchangeanimation BS_ATTACKER, BIT_DEF | BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS\n\tplaystatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE\n\tsetstatchanger STAT_ATK, 1, TRUE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownAtkFail\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 2, BattleScript_AtkDefDownAtkFail\n\tprintfromtable gStatDownStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_AtkDefDownAtkFail::\n\tplaystatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT\n\tsetstatchanger STAT_DEF, 1, TRUE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_AtkDefDownDefFail\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 2, BattleScript_AtkDefDownDefFail\n\tprintfromtable gStatDownStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_AtkDefDownDefFail::\n\treturn\n\nBattleScript_KnockedOff::\n\tplayanimation BS_TARGET, B_ANIM_ITEM_KNOCKOFF\n\tprintstring STRINGID_PKMNKNOCKEDOFF\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_MoveUsedIsImprisoned::\n\tprintstring STRINGID_PKMNCANTUSEMOVESEALED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_SelectingImprisonedMove::\n\tprintselectionstring STRINGID_PKMNCANTUSEMOVESEALED\n\tendselectionscript\n\nBattleScript_GrudgeTakesPp::\n\tprintstring STRINGID_PKMNLOSTPPGRUDGE\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_MagicCoatBounce::\n\tattackstring\n\tppreduce\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNMOVEBOUNCED\n\twaitmessage B_WAIT_TIME_LONG\n\torword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_ALLOW_NO_PP\n\tsetmagiccoattarget BS_ATTACKER\n\treturn\n\nBattleScript_SnatchedMove::\n\tattackstring\n\tppreduce\n\tsnatchsetbattlers\n\tplayanimation BS_TARGET, B_ANIM_SNATCH_MOVE\n\tprintstring STRINGID_PKMNSNATCHEDMOVE\n\twaitmessage B_WAIT_TIME_LONG\n\torword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_ALLOW_NO_PP\n\tswapattackerwithtarget\n\treturn\n\nBattleScript_EnduredMsg::\n\tprintstring STRINGID_PKMNENDUREDHIT\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_OneHitKOMsg::\n\tprintstring STRINGID_ONEHITKO\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_SAtkDown2::\n\tsetbyte sSTAT_ANIM_PLAYED, 0\n\tplaystatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO | STAT_CHANGE_CANT_PREVENT\n\tsetstatchanger STAT_SPATK, 2, TRUE\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_SAtkDown2End\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 2, BattleScript_SAtkDown2End\n\tprintfromtable gStatDownStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_SAtkDown2End::\n\treturn\n\nBattleScript_FocusPunchSetUp::\n\tprintstring STRINGID_EMPTYSTRING3\n\twaitmessage 1\n\tplayanimation BS_ATTACKER, B_ANIM_FOCUS_PUNCH_SETUP\n\tprintstring STRINGID_PKMNTIGHTENINGFOCUS\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_MoveUsedIsAsleep::\n\tprintstring STRINGID_PKMNFASTASLEEP\n\twaitmessage B_WAIT_TIME_LONG\n\tstatusanimation BS_ATTACKER\n\tgoto BattleScript_MoveEnd\n\nBattleScript_MoveUsedWokeUp::\n\tbicword gHitMarker, HITMARKER_WAKE_UP_CLEAR\n\tprintfromtable gWokeUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_ATTACKER\n\treturn\n\nBattleScript_MonWokeUpInUproar::\n\tprintstring STRINGID_PKMNWOKEUPINUPROAR\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_ATTACKER\n\tend2\n\nBattleScript_PoisonTurnDmg::\n\tprintstring STRINGID_PKMNHURTBYPOISON\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_DoStatusTurnDmg::\n\tstatusanimation BS_ATTACKER\nBattleScript_DoTurnDmg::\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\ttryfaintmon BS_ATTACKER\n\tcheckteamslost BattleScript_DoTurnDmgEnd\nBattleScript_DoTurnDmgEnd::\n\tend2\n\nBattleScript_BurnTurnDmg::\n\tprintstring STRINGID_PKMNHURTBYBURN\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_DoStatusTurnDmg\n\nBattleScript_MoveUsedIsFrozen::\n\tprintstring STRINGID_PKMNISFROZEN\n\twaitmessage B_WAIT_TIME_LONG\n\tstatusanimation BS_ATTACKER\n\tgoto BattleScript_MoveEnd\n\nBattleScript_MoveUsedUnfroze::\n\tprintfromtable gGotDefrostedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_ATTACKER\n\treturn\n\nBattleScript_DefrostedViaFireMove::\n\tprintstring STRINGID_PKMNWASDEFROSTED\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_TARGET\n\treturn\n\nBattleScript_MoveUsedIsParalyzed::\n\tprintstring STRINGID_PKMNISPARALYZED\n\twaitmessage B_WAIT_TIME_LONG\n\tstatusanimation BS_ATTACKER\n\tcancelmultiturnmoves BS_ATTACKER\n\tgoto BattleScript_MoveEnd\n\nBattleScript_MoveUsedFlinched::\n\tprintstring STRINGID_PKMNFLINCHED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_PrintUproarOverTurns::\n\tprintfromtable gUproarOverTurnStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_ThrashConfuses::\n\tchosenstatus2animation BS_ATTACKER, STATUS2_CONFUSION\n\tprintstring STRINGID_PKMNFATIGUECONFUSION\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_MoveUsedIsConfused::\n\tprintstring STRINGID_PKMNISCONFUSED\n\twaitmessage B_WAIT_TIME_LONG\n\tstatus2animation BS_ATTACKER, STATUS2_CONFUSION\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, FALSE, BattleScript_MoveUsedIsConfusedRet\nBattleScript_DoSelfConfusionDmg::\n\tcancelmultiturnmoves BS_ATTACKER\n\tadjustnormaldamage2\n\tprintstring STRINGID_ITHURTCONFUSION\n\twaitmessage B_WAIT_TIME_LONG\n\teffectivenesssound\n\thitanimation BS_ATTACKER\n\twaitstate\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tresultmessage\n\twaitmessage B_WAIT_TIME_LONG\n\ttryfaintmon BS_ATTACKER\n\tgoto BattleScript_MoveEnd\nBattleScript_MoveUsedIsConfusedRet::\n\treturn\n\nBattleScript_MoveUsedIsConfusedNoMore::\n\tprintstring STRINGID_PKMNHEALEDCONFUSION\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_PrintPayDayMoneyString::\n\tprintstring STRINGID_PLAYERPICKEDUPMONEY\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_WrapTurnDmg::\n\tplayanimation BS_ATTACKER, B_ANIM_TURN_TRAP, sB_ANIM_ARG1\n\tprintstring STRINGID_PKMNHURTBY\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_DoTurnDmg\n\nBattleScript_WrapEnds::\n\tprintstring STRINGID_PKMNFREEDFROM\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_MoveUsedIsInLove::\n\tprintstring STRINGID_PKMNINLOVE\n\twaitmessage B_WAIT_TIME_LONG\n\tstatus2animation BS_ATTACKER, STATUS2_INFATUATION\n\treturn\n\nBattleScript_MoveUsedIsInLoveCantAttack::\n\tprintstring STRINGID_PKMNIMMOBILIZEDBYLOVE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_NightmareTurnDmg::\n\tprintstring STRINGID_PKMNLOCKEDINNIGHTMARE\n\twaitmessage B_WAIT_TIME_LONG\n\tstatus2animation BS_ATTACKER, STATUS2_NIGHTMARE\n\tgoto BattleScript_DoTurnDmg\n\nBattleScript_CurseTurnDmg::\n\tprintstring STRINGID_PKMNAFFLICTEDBYCURSE\n\twaitmessage B_WAIT_TIME_LONG\n\tstatus2animation BS_ATTACKER, STATUS2_CURSED\n\tgoto BattleScript_DoTurnDmg\n\nBattleScript_TargetPRLZHeal::\n\tprintstring STRINGID_PKMNHEALEDPARALYSIS\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_TARGET\n\treturn\n\nBattleScript_TooScaredToMove::\n\tprintstring STRINGID_MONTOOSCAREDTOMOVE\n\twaitmessage B_WAIT_TIME_LONG\n\tplayanimation BS_ATTACKER, B_ANIM_MON_SCARED\n\tgoto BattleScript_MoveEnd\n\nBattleScript_GhostGetOutGetOut::\n\tprintstring STRINGID_GHOSTGETOUTGETOUT\n\tplayanimation BS_ATTACKER, B_ANIM_GHOST_GET_OUT\n\tgoto BattleScript_MoveEnd\n\nBattleScript_SilphScopeUnveiled::\n\tpause B_WAIT_TIME_SHORT_UNSKIPPABLE\n\tprintstring STRINGID_SILPHSCOPEUNVEILED\n\twaitstate\n\tplayanimation BS_OPPONENT1, B_ANIM_SILPH_SCOPED\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_GHOSTWASMAROWAK\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n\nBattleScript_MoveEffectSleep::\n\tstatusanimation BS_EFFECT_BATTLER\n\tprintfromtable gFellAsleepStringIds\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_UpdateEffectStatusIconRet::\n\tupdatestatusicon BS_EFFECT_BATTLER\n\twaitstate\n\treturn\n\nBattleScript_YawnMakesAsleep::\n\tstatusanimation BS_EFFECT_BATTLER\n\tprintstring STRINGID_PKMNFELLASLEEP\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_EFFECT_BATTLER\n\twaitstate\n\tmakevisible BS_EFFECT_BATTLER\n\tend2\n\nBattleScript_MoveEffectPoison::\n\tstatusanimation BS_EFFECT_BATTLER\n\tprintfromtable gGotPoisonedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_UpdateEffectStatusIconRet\n\nBattleScript_MoveEffectBurn::\n\tstatusanimation BS_EFFECT_BATTLER\n\tprintfromtable gGotBurnedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_UpdateEffectStatusIconRet\n\nBattleScript_MoveEffectFreeze::\n\tstatusanimation BS_EFFECT_BATTLER\n\tprintfromtable gGotFrozenStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_UpdateEffectStatusIconRet\n\nBattleScript_MoveEffectParalysis::\n\tstatusanimation BS_EFFECT_BATTLER\n\tprintfromtable gGotParalyzedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_UpdateEffectStatusIconRet\n\nBattleScript_MoveEffectUproar::\n\tprintstring STRINGID_PKMNCAUSEDUPROAR\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_MoveEffectToxic::\n\tstatusanimation BS_EFFECT_BATTLER\n\tprintstring STRINGID_PKMNBADLYPOISONED\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_UpdateEffectStatusIconRet\n\nBattleScript_MoveEffectPayDay::\n\tprintstring STRINGID_COINSSCATTERED\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_MoveEffectWrap::\n\tprintfromtable gWrappedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_MoveEffectConfusion::\n\tchosenstatus2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION\n\tprintstring STRINGID_PKMNWASCONFUSED\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_MoveEffectRecoil::\n\tjumpifmove MOVE_STRUGGLE, BattleScript_DoRecoil\n\tjumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd\nBattleScript_DoRecoil::\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tprintstring STRINGID_PKMNHITWITHRECOIL\n\twaitmessage B_WAIT_TIME_LONG\n\ttryfaintmon BS_ATTACKER\nBattleScript_RecoilEnd::\n\treturn\n\nBattleScript_ItemSteal::\n\tplayanimation BS_TARGET, B_ANIM_ITEM_STEAL\n\tprintstring STRINGID_PKMNSTOLEITEM\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_DrizzleActivates::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNMADEITRAIN\n\twaitstate\n\tplayanimation BS_BATTLER_0, B_ANIM_RAIN_CONTINUES\n\tcall BattleScript_WeatherFormChanges\n\tend3\n\nBattleScript_SpeedBoostActivates::\n\tplayanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1\n\tprintstring STRINGID_PKMNRAISEDSPEED\n\twaitmessage B_WAIT_TIME_LONG\n\tend3\n\nBattleScript_TraceActivates::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNTRACED\n\twaitmessage B_WAIT_TIME_LONG\n\tend3\n\nBattleScript_RainDishActivates::\n\tprintstring STRINGID_PKMNSXRESTOREDHPALITTLE2\n\twaitmessage B_WAIT_TIME_LONG\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tend3\n\nBattleScript_SandstreamActivates::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNSXWHIPPEDUPSANDSTORM\n\twaitstate\n\tplayanimation BS_BATTLER_0, B_ANIM_SANDSTORM_CONTINUES\n\tcall BattleScript_WeatherFormChanges\n\tend3\n\nBattleScript_ShedSkinActivates::\n\tprintstring STRINGID_PKMNSXCUREDYPROBLEM\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_ATTACKER\n\tend3\n\nBattleScript_WeatherFormChanges::\n\tsetbyte sBATTLER, 0\nBattleScript_WeatherFormChangesLoop::\n\ttrycastformdatachange\n\taddbyte sBATTLER, 1\n\tjumpifbytenotequal sBATTLER, gBattlersCount, BattleScript_WeatherFormChangesLoop\n\treturn\n\nBattleScript_CastformChange::\n\tcall BattleScript_DoCastformChangeAnim\n\tend3\n\nBattleScript_DoCastformChangeAnim::\n\tdocastformchangeanimation\n\twaitstate\n\tprintstring STRINGID_PKMNTRANSFORMED\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_IntimidateActivatesEnd3::\n\tcall BattleScript_DoIntimidateActivationAnim\n\tend3\n\nBattleScript_DoIntimidateActivationAnim::\n\tpause B_WAIT_TIME_SHORT\nBattleScript_IntimidateActivates::\n\tsetbyte gBattlerTarget, 0\n\tsetstatchanger STAT_ATK, 1, TRUE\nBattleScript_IntimidateActivationAnimLoop::\n\ttrygetintimidatetarget BattleScript_IntimidateEnd\n\tjumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_IntimidateFail\n\tjumpifability BS_TARGET, ABILITY_CLEAR_BODY, BattleScript_IntimidateAbilityFail\n\tjumpifability BS_TARGET, ABILITY_HYPER_CUTTER, BattleScript_IntimidateAbilityFail\n\tjumpifability BS_TARGET, ABILITY_WHITE_SMOKE, BattleScript_IntimidateAbilityFail\n\tstatbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_IntimidateFail\n\tjumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, 1, BattleScript_IntimidateFail\n\tsetgraphicalstatchangevalues\n\tplayanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1\n\tprintstring STRINGID_PKMNCUTSATTACKWITH\n\twaitmessage B_WAIT_TIME_LONG\nBattleScript_IntimidateFail::\n\taddbyte gBattlerTarget, 1\n\tgoto BattleScript_IntimidateActivationAnimLoop\n\nBattleScript_IntimidateEnd::\n\treturn\n\nBattleScript_IntimidateAbilityFail::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PREVENTEDFROMWORKING\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_IntimidateFail\n\nBattleScript_DroughtActivates::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNSXINTENSIFIEDSUN\n\twaitstate\n\tplayanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES\n\tcall BattleScript_WeatherFormChanges\n\tend3\n\nBattleScript_TookAttack::\n\tattackstring\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNSXTOOKATTACK\n\twaitmessage B_WAIT_TIME_LONG\n\torword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED\n\treturn\n\nBattleScript_SturdyPreventsOHKO::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNPROTECTEDBY\n\tpause B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_DampStopsExplosion::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNPREVENTSUSAGE\n\tpause B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_MoveHPDrain_PPLoss::\n\tppreduce\nBattleScript_MoveHPDrain::\n\tattackstring\n\tpause B_WAIT_TIME_SHORT\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_TARGET\n\tdatahpupdate BS_TARGET\n\tprintstring STRINGID_PKMNRESTOREDHPUSING\n\twaitmessage B_WAIT_TIME_LONG\n\torbyte gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE\n\tgoto BattleScript_MoveEnd\n\nBattleScript_MonMadeMoveUseless_PPLoss::\n\tppreduce\nBattleScript_MonMadeMoveUseless::\n\tattackstring\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNSXMADEYUSELESS\n\twaitmessage B_WAIT_TIME_LONG\n\torbyte gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE\n\tgoto BattleScript_MoveEnd\n\nBattleScript_FlashFireBoost_PPLoss::\n\tppreduce\nBattleScript_FlashFireBoost::\n\tattackstring\n\tpause B_WAIT_TIME_SHORT\n\tprintfromtable gFlashFireStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_AbilityPreventsPhasingOut::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNANCHORSITSELFWITH\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_AbilityNoStatLoss::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNPREVENTSSTATLOSSWITH\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_BRNPrevention::\n\tpause B_WAIT_TIME_SHORT\n\tprintfromtable gBRNPreventionStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_PRLZPrevention::\n\tpause B_WAIT_TIME_SHORT\n\tprintfromtable gPRLZPreventionStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_PSNPrevention::\n\tpause B_WAIT_TIME_SHORT\n\tprintfromtable gPSNPreventionStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_ObliviousPreventsAttraction::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNPREVENTSROMANCEWITH\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_FlinchPrevention::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNSXPREVENTSFLINCHING\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_OwnTempoPrevents::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNPREVENTSCONFUSIONWITH\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_SoundproofProtected::\n\tattackstring\n\tppreduce\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNSXBLOCKSY\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_AbilityNoSpecificStatLoss::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNSXPREVENTSYLOSS\n\twaitmessage B_WAIT_TIME_LONG\n\tsetbyte cMULTISTRING_CHOOSER, 3\n\treturn\n\nBattleScript_StickyHoldActivates::\n\tpause B_WAIT_TIME_SHORT\n\tprintstring STRINGID_PKMNSXMADEYINEFFECTIVE\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_MoveEnd\n\nBattleScript_ColorChangeActivates::\n\tprintstring STRINGID_PKMNCHANGEDTYPEWITH\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_RoughSkinActivates::\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tprintstring STRINGID_PKMNHURTSWITH\n\twaitmessage B_WAIT_TIME_LONG\n\ttryfaintmon BS_ATTACKER\n\treturn\n\nBattleScript_CuteCharmActivates::\n\tstatus2animation BS_ATTACKER, STATUS2_INFATUATION\n\tprintstring STRINGID_PKMNSXINFATUATEDY\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_ApplySecondaryEffect::\n\twaitstate\n\tseteffectsecondary\n\treturn\n\nBattleScript_SynchronizeActivates::\n\twaitstate\n\tseteffectprimary\n\treturn\n\nBattleScript_AbilityCuredStatus::\n\tprintstring STRINGID_PKMNSXCUREDITSYPROBLEM\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_SCRIPTING\n\treturn\n\nBattleScript_IgnoresWhileAsleep::\n\tprintstring STRINGID_PKMNIGNORESASLEEP\n\twaitmessage B_WAIT_TIME_LONG\n\tmoveendto MOVEEND_NEXT_TARGET\n\tend\n\nBattleScript_IgnoresAndUsesRandomMove::\n\tprintstring STRINGID_PKMNIGNOREDORDERS\n\twaitmessage B_WAIT_TIME_LONG\n\tjumptocalledmove 0\nBattleScript_MoveUsedLoafingAround::\n\tprintfromtable gInobedientStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tmoveendto MOVEEND_NEXT_TARGET\n\tend\n\nBattleScript_IgnoresAndFallsAsleep::\n\tprintstring STRINGID_PKMNBEGANTONAP\n\twaitmessage B_WAIT_TIME_LONG\n\tsetmoveeffect MOVE_EFFECT_SLEEP | MOVE_EFFECT_AFFECTS_USER\n\tseteffectprimary\n\tmoveendto MOVEEND_NEXT_TARGET\n\tend\n\nBattleScript_IgnoresAndHitsItself::\n\tprintstring STRINGID_PKMNWONTOBEY\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_DoSelfConfusionDmg\n\nBattleScript_SubstituteFade::\n\tplayanimation BS_TARGET, B_ANIM_SUBSTITUTE_FADE\n\tprintstring STRINGID_PKMNSUBSTITUTEFADED\n\treturn\n\nBattleScript_BerryCurePrlzEnd2::\n\tcall BattleScript_BerryCureParRet\n\tend2\n\nBattleScript_BerryCureParRet::\n\tplayanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT\n\tprintstring STRINGID_PKMNSITEMCUREDPARALYSIS\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_SCRIPTING\n\tremoveitem BS_SCRIPTING\n\treturn\n\nBattleScript_BerryCurePsnEnd2::\n\tcall BattleScript_BerryCurePsnRet\n\tend2\n\nBattleScript_BerryCurePsnRet::\n\tplayanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT\n\tprintstring STRINGID_PKMNSITEMCUREDPOISON\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_SCRIPTING\n\tremoveitem BS_SCRIPTING\n\treturn\n\nBattleScript_BerryCureBrnEnd2::\n\tcall BattleScript_BerryCureBrnRet\n\tend2\n\nBattleScript_BerryCureBrnRet::\n\tplayanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT\n\tprintstring STRINGID_PKMNSITEMHEALEDBURN\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_SCRIPTING\n\tremoveitem BS_SCRIPTING\n\treturn\n\nBattleScript_BerryCureFrzEnd2::\n\tcall BattleScript_BerryCureFrzRet\n\tend2\n\nBattleScript_BerryCureFrzRet::\n\tplayanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT\n\tprintstring STRINGID_PKMNSITEMDEFROSTEDIT\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_SCRIPTING\n\tremoveitem BS_SCRIPTING\n\treturn\n\nBattleScript_BerryCureSlpEnd2::\n\tcall BattleScript_BerryCureSlpRet\n\tend2\n\nBattleScript_BerryCureSlpRet::\n\tplayanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT\n\tprintstring STRINGID_PKMNSITEMWOKEIT\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_SCRIPTING\n\tremoveitem BS_SCRIPTING\n\treturn\n\nBattleScript_BerryCureConfusionEnd2::\n\tcall BattleScript_BerryCureConfusionRet\n\tend2\n\nBattleScript_BerryCureConfusionRet::\n\tplayanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT\n\tprintstring STRINGID_PKMNSITEMSNAPPEDOUT\n\twaitmessage B_WAIT_TIME_LONG\n\tremoveitem BS_SCRIPTING\n\treturn\n\nBattleScript_BerryCureChosenStatusEnd2::\n\tcall BattleScript_BerryCureChosenStatusRet\n\tend2\n\nBattleScript_BerryCureChosenStatusRet::\n\tplayanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT\n\tprintfromtable gBerryEffectStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_SCRIPTING\n\tremoveitem BS_SCRIPTING\n\treturn\n\nBattleScript_WhiteHerbEnd2::\n\tcall BattleScript_WhiteHerbRet\n\tend2\n\nBattleScript_WhiteHerbRet::\n\tplayanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT\n\tprintstring STRINGID_PKMNSITEMRESTOREDSTATUS\n\twaitmessage B_WAIT_TIME_LONG\n\tremoveitem BS_SCRIPTING\n\treturn\n\nBattleScript_ItemHealHP_RemoveItem::\n\tplayanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT\n\tprintstring STRINGID_PKMNSITEMRESTOREDHEALTH\n\twaitmessage B_WAIT_TIME_LONG\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tremoveitem BS_ATTACKER\n\tend2\n\nBattleScript_BerryPPHealEnd2::\n\tplayanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT\n\tprintstring STRINGID_PKMNSITEMRESTOREDPP\n\twaitmessage B_WAIT_TIME_LONG\n\tremoveitem BS_ATTACKER\n\tend2\n\nBattleScript_ItemHealHP_End2::\n\tcall BattleScript_ItemHealHP_Ret\n\tend2\n\nBattleScript_ItemHealHP_Ret::\n\tplayanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT\n\tprintstring STRINGID_PKMNSITEMRESTOREDHPALITTLE\n\twaitmessage B_WAIT_TIME_LONG\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\treturn\n\nBattleScript_SelectingNotAllowedMoveChoiceItem::\n\tprintselectionstring STRINGID_ITEMALLOWSONLYYMOVE\n\tendselectionscript\n\nBattleScript_FocusBandActivates::\n\tplayanimation BS_TARGET, B_ANIM_FOCUS_BAND\n\tprintstring STRINGID_PKMNHUNGONWITHX\n\twaitmessage B_WAIT_TIME_LONG\n\treturn\n\nBattleScript_BerryConfuseHealEnd2::\n\tplayanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT\n\tprintstring STRINGID_PKMNSITEMRESTOREDHEALTH\n\twaitmessage B_WAIT_TIME_LONG\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tprintstring STRINGID_FORXCOMMAYZ\n\twaitmessage B_WAIT_TIME_LONG\n\tsetmoveeffect MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER\n\tseteffectprimary\n\tremoveitem BS_ATTACKER\n\tend2\n\nBattleScript_BerryStatRaiseEnd2::\n\tplayanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT\n\tstatbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BerryStatRaiseDoStatUp\nBattleScript_BerryStatRaiseDoStatUp::\n\tsetbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM\n\tcall BattleScript_StatUp\n\tremoveitem BS_ATTACKER\n\tend2\n\nBattleScript_BerryFocusEnergyEnd2::\n\tplayanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT\n\tprintstring STRINGID_PKMNUSEDXTOGETPUMPED\n\twaitmessage B_WAIT_TIME_LONG\n\tremoveitem BS_ATTACKER\n\tend2\n\nBattleScript_ActionSelectionItemsCantBeUsed::\n\tprintselectionstring STRINGID_ITEMSCANTBEUSEDNOW\n\tendselectionscript\n\nBattleScript_FlushMessageBox::\n\tprintstring STRINGID_EMPTYSTRING3\n\treturn\n"
  },
  {
    "path": "data/battle_scripts_2.s",
    "content": "#include \"constants/moves.h\"\n#include \"constants/battle.h\"\n#include \"constants/battle_move_effects.h\"\n#include \"constants/battle_script_commands.h\"\n#include \"constants/battle_anim.h\"\n#include \"constants/items.h\"\n#include \"constants/abilities.h\"\n#include \"constants/species.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/songs.h\"\n#include \"constants/game_stat.h\"\n#include \"constants/battle_string_ids.h\"\n\t.include \"asm/macros/battle_script.inc\"\n@ Define these here since misc_constants.inc conflicts with the C headers\n\t.set NULL, 0\n\t.set FALSE, 0\n\t.set TRUE, 1\n\t.section script_data, \"aw\", %progbits\n\t.align 2\n\ngBattlescriptsForBallThrow::\n\t.4byte BattleScript_ThrowBall\n\t.4byte BattleScript_ThrowBall\n\t.4byte BattleScript_ThrowBall\n\t.4byte BattleScript_ThrowBall\n\t.4byte BattleScript_ThrowBall\n\t.4byte BattleScript_ThrowSafariBall\n\t.4byte BattleScript_ThrowBall\n\t.4byte BattleScript_ThrowBall\n\t.4byte BattleScript_ThrowBall\n\t.4byte BattleScript_ThrowBall\n\t.4byte BattleScript_ThrowBall\n\t.4byte BattleScript_ThrowBall\n\t.4byte BattleScript_ThrowBall\n\ngBattlescriptsForUsingItem::\n\t.4byte BattleScript_PlayerUseItem\n\t.4byte BattleScript_AIUseFullRestoreOrHpHeal\n\t.4byte BattleScript_AIUseFullRestoreOrHpHeal\n\t.4byte BattleScript_AIUseStatRestore\n\t.4byte BattleScript_AIUseXstat\n\t.4byte BattleScript_AIUseGuardSpec\n\ngBattlescriptsForRunningByItem::\n\t.4byte BattleScript_UseFluffyTail\n\t.4byte BattleScript_UsePokeFlute\n\ngBattlescriptsForSafariActions::\n\t.4byte BattleScript_WatchesCarefully\n\t.4byte BattleScript_ThrowRock\n\t.4byte BattleScript_ThrowBait\n\t.4byte BattleScript_LeftoverWallyPrepToThrow\n\nBattleScript_ThrowBall::\n\tjumpifbattletype BATTLE_TYPE_OLD_MAN_TUTORIAL, BattleScript_OldManThrowBall\n\tjumpifbattletype BATTLE_TYPE_POKEDUDE, BattleScript_PokedudeThrowBall\n\tprintstring STRINGID_PLAYERUSEDITEM\n\thandleballthrow\n\nBattleScript_OldManThrowBall::\n\tprintstring STRINGID_OLDMANUSEDITEM\n\thandleballthrow\n\nBattleScript_PokedudeThrowBall::\n\tprintstring STRINGID_POKEDUDEUSED\n\thandleballthrow\n\nBattleScript_ThrowSafariBall::\n\tprintstring STRINGID_PLAYERUSEDITEM\n\tupdatestatusicon BS_ATTACKER\n\thandleballthrow\n\nBattleScript_SuccessBallThrow::\n\tjumpifhalfword CMP_EQUAL, gLastUsedItem, ITEM_SAFARI_BALL, BattleScript_SafariNoIncGameStat\n\tincrementgamestat GAME_STAT_POKEMON_CAPTURES\nBattleScript_SafariNoIncGameStat::\n\tprintstring STRINGID_GOTCHAPKMNCAUGHT\n\ttrysetcaughtmondexflags BattleScript_CaughtPokemonSkipNewDex\n\tprintstring STRINGID_PKMNDATAADDEDTODEX\n\twaitstate\n\tsetbyte gBattleCommunication, 0\n\tdisplaydexinfo\nBattleScript_CaughtPokemonSkipNewDex::\n\tprintstring STRINGID_GIVENICKNAMECAPTURED\n\twaitstate\n\tsetbyte gBattleCommunication, 0\n\ttrygivecaughtmonnick BattleScript_CaughtPokemonSkipNickname\n\tgivecaughtmon\n\tprintfromtable gCaughtMonStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_CaughtPokemonDone\n\nBattleScript_SuccessBallThrowForceNick::\n\tjumpifhalfword CMP_EQUAL, gLastUsedItem, ITEM_SAFARI_BALL, BattleScript_SafariNoIncGameStat2\n\tincrementgamestat GAME_STAT_POKEMON_CAPTURES\nBattleScript_SafariNoIncGameStat2::\n\tprintstring STRINGID_GOTCHAPKMNCAUGHT\n\ttrysetcaughtmondexflags BattleScript_CaughtPokemonSkipNewDex2\n\tprintstring STRINGID_PKMNDATAADDEDTODEX\n\twaitstate\n\tsetbyte gBattleCommunication, 0\n\tdisplaydexinfo\nBattleScript_CaughtPokemonSkipNewDex2::\n\twaitstate\n\tsetbyte gBattleCommunication, 2\n\ttrygivecaughtmonnick BattleScript_CaughtPokemonSkipNickname\n\tgivecaughtmon\n\tprintfromtable gCaughtMonStringIds\n\twaitmessage 64\n\tgoto BattleScript_CaughtPokemonDone\n\nBattleScript_CaughtPokemonSkipNickname::\n\tgivecaughtmon\nBattleScript_CaughtPokemonDone::\n\tsetbyte gBattleOutcome, B_OUTCOME_CAUGHT\n\tfinishturn\n\nBattleScript_OldMan_Pokedude_CaughtMessage::\n\tprintstring STRINGID_GOTCHAPKMNCAUGHT2\n\tsetbyte gBattleOutcome, B_OUTCOME_CAUGHT\n\tendlinkbattle\n\tfinishturn\n\nBattleScript_ShakeBallThrow::\n\tprintfromtable gBallEscapeStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tjumpifnotbattletype BATTLE_TYPE_SAFARI, BattleScript_CatchFailEnd\n\tjumpifbyte CMP_NOT_EQUAL, gNumSafariBalls, 0, BattleScript_CatchFailEnd\n\tprintstring STRINGID_OUTOFSAFARIBALLS\n\twaitmessage B_WAIT_TIME_LONG\n\tsetbyte gBattleOutcome, B_OUTCOME_NO_SAFARI_BALLS\nBattleScript_CatchFailEnd::\n\tfinishaction\n\nBattleScript_TrainerBallBlock::\n\twaitmessage B_WAIT_TIME_LONG\n\tprintstring STRINGID_TRAINERBLOCKEDBALL\n\twaitmessage B_WAIT_TIME_LONG\n\tprintstring STRINGID_DONTBEATHIEF\n\twaitmessage B_WAIT_TIME_LONG\n\tfinishaction\n\nBattleScript_GhostBallDodge::\n\twaitmessage B_WAIT_TIME_LONG\n\tprintstring STRINGID_ITDODGEDBALL\n\twaitmessage B_WAIT_TIME_LONG\n\tfinishaction\n\nBattleScript_PlayerUseItem::\n\tmoveendcase 15\n\tend\n\nBattleScript_AIUseFullRestoreOrHpHeal::\n\tprintstring STRINGID_EMPTYSTRING3\n\tpause B_WAIT_TIME_MED\n\tplayse SE_USE_ITEM\n\tprintstring STRINGID_TRAINER1USEDITEM\n\twaitmessage B_WAIT_TIME_LONG\n\tuseitemonopponent\n\torword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE\n\thealthbarupdate BS_ATTACKER\n\tdatahpupdate BS_ATTACKER\n\tprintstring STRINGID_PKMNSITEMRESTOREDHEALTH\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_ATTACKER\n\tmoveendcase 15\n\tfinishaction\n\nBattleScript_AIUseStatRestore::\n\tprintstring STRINGID_EMPTYSTRING3\n\tpause B_WAIT_TIME_MED\n\tplayse SE_USE_ITEM\n\tprintstring STRINGID_TRAINER1USEDITEM\n\twaitmessage B_WAIT_TIME_LONG\n\tuseitemonopponent\n\tprintfromtable gTrainerItemCuredStatusStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_ATTACKER\n\tmoveendcase 15\n\tfinishaction\n\nBattleScript_AIUseXstat::\n\tprintstring STRINGID_EMPTYSTRING3\n\tpause B_WAIT_TIME_MED\n\tplayse SE_USE_ITEM\n\tprintstring STRINGID_TRAINER1USEDITEM\n\twaitmessage B_WAIT_TIME_LONG\n\tuseitemonopponent\n\tprintfromtable gStatUpStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tmoveendcase 15\n\tfinishaction\n\nBattleScript_AIUseGuardSpec::\n\tprintstring STRINGID_EMPTYSTRING3\n\tpause B_WAIT_TIME_MED\n\tplayse SE_USE_ITEM\n\tprintstring STRINGID_TRAINER1USEDITEM\n\twaitmessage B_WAIT_TIME_LONG\n\tuseitemonopponent\n\tprintfromtable gMistUsedStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tmoveendcase 15\n\tfinishaction\n\nBattleScript_UseFluffyTail::\n\tplayse SE_FLEE\n\tsetbyte gBattleOutcome, B_OUTCOME_RAN\n\tfinishturn\n\nBattleScript_UsePokeFlute::\n\tcheckpokeflute BS_ATTACKER\n\tjumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 1, BattleScript_PokeFluteWakeUp\n\tprintstring STRINGID_POKEFLUTECATCHY\n\twaitmessage B_WAIT_TIME_LONG\n\tgoto BattleScript_PokeFluteEnd\n\nBattleScript_PokeFluteWakeUp::\n\tprintstring STRINGID_POKEFLUTE\n\twaitmessage B_WAIT_TIME_LONG\n\tfanfare MUS_POKE_FLUTE\n\twaitfanfare BS_ATTACKER\n\tprintstring STRINGID_MONHEARINGFLUTEAWOKE\n\twaitmessage B_WAIT_TIME_LONG\n\tupdatestatusicon BS_PLAYER2\n\twaitstate\nBattleScript_PokeFluteEnd::\n\tfinishaction\n\nBattleScript_WatchesCarefully::\n\tprintfromtable gSafariReactionStringIds\n\twaitmessage B_WAIT_TIME_LONG\n\tplayanimation BS_OPPONENT1, B_ANIM_SAFARI_REACTION\n\tend2\n\nBattleScript_ThrowRock::\n\tprintstring STRINGID_THREWROCK\n\twaitmessage B_WAIT_TIME_LONG\n\tplayanimation BS_ATTACKER, B_ANIM_ROCK_THROW\n\tend2\n\nBattleScript_ThrowBait::\n\tprintstring STRINGID_THREWBAIT\n\twaitmessage B_WAIT_TIME_LONG\n\tplayanimation BS_ATTACKER, B_ANIM_BAIT_THROW\n\tend2\n\nBattleScript_LeftoverWallyPrepToThrow::\n\tprintstring STRINGID_RETURNMON\n\twaitmessage B_WAIT_TIME_LONG\n\treturnatktoball\n\twaitstate\n\ttrainerslidein BS_TARGET\n\twaitstate\n\tprintstring STRINGID_YOUTHROWABALLNOWRIGHT\n\twaitmessage B_WAIT_TIME_LONG\n\tend2\n"
  },
  {
    "path": "data/event_scripts.s",
    "content": "#include \"constants/global.h\"\n#include \"constants/flags.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/event_object_movement.h\"\n#include \"constants/decorations.h\"\n#include \"constants/items.h\"\n#include \"constants/layouts.h\"\n#include \"constants/maps.h\"\n#include \"constants/metatile_labels.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/moves.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n#include \"constants/species.h\"\n#include \"constants/vars.h\"\n#include \"constants/battle.h\"\n#include \"constants/heal_locations.h\"\n#include \"constants/field_effects.h\"\n#include \"constants/trainers.h\"\n#include \"constants/trainer_tower.h\"\n#include \"constants/fame_checker.h\"\n#include \"constants/seagallop.h\"\n#include \"constants/game_stat.h\"\n#include \"constants/coins.h\"\n#include \"constants/menu.h\"\n#include \"constants/battle_setup.h\"\n#include \"constants/map_scripts.h\"\n#include \"constants/cable_club.h\"\n#include \"constants/field_tasks.h\"\n#include \"constants/field_weather.h\"\n#include \"constants/weather.h\"\n#include \"constants/union_room.h\"\n#include \"constants/trade.h\"\n#include \"constants/quest_log.h\"\n#include \"constants/daycare.h\"\n#include \"constants/easy_chat.h\"\n#include \"constants/trainer_card.h\"\n#include \"constants/help_system.h\"\n#include \"constants/trainer_fan_club.h\"\n#include \"constants/mystery_gift.h\"\n\t.include \"asm/macros.inc\"\n\t.include \"asm/macros/event.inc\"\n\t.set FALSE, 0\n\t.set TRUE,  1\n\n\t.section script_data, \"aw\", %progbits\n\n\t.include \"data/script_cmd_table.inc\"\n\n\t.align 2\ngSpecialVars::\n\t.4byte gSpecialVar_0x8000\n\t.4byte gSpecialVar_0x8001\n\t.4byte gSpecialVar_0x8002\n\t.4byte gSpecialVar_0x8003\n\t.4byte gSpecialVar_0x8004\n\t.4byte gSpecialVar_0x8005\n\t.4byte gSpecialVar_0x8006\n\t.4byte gSpecialVar_0x8007\n\t.4byte gSpecialVar_0x8008\n\t.4byte gSpecialVar_0x8009\n\t.4byte gSpecialVar_0x800A\n\t.4byte gSpecialVar_0x800B\n\t.4byte gSpecialVar_Facing\n\t.4byte gSpecialVar_Result\n\t.4byte gSpecialVar_ItemId\n\t.4byte gSpecialVar_LastTalked\n\t.4byte gSpecialVar_MonBoxId\n\t.4byte gSpecialVar_MonBoxPos\n\t.4byte gSpecialVar_TextColor\n\t.4byte gSpecialVar_PrevTextColor\n\t.4byte gSpecialVar_0x8014\n\n\t.include \"data/specials.inc\"\n\n\t.align 2\ngStdScripts::\n\t.4byte Std_ObtainItem           @ STD_OBTAIN_ITEM\n\t.4byte Std_FindItem             @ STD_FIND_ITEM\n\t.4byte Std_MsgboxNPC            @ MSGBOX_NPC\n\t.4byte Std_MsgboxSign           @ MSGBOX_SIGN\n\t.4byte Std_MsgboxDefault        @ MSGBOX_DEFAULT\n\t.4byte Std_MsgboxYesNo          @ MSGBOX_YESNO\n\t.4byte Std_MsgboxAutoclose      @ MSGBOX_AUTOCLOSE\n\t.4byte Std_ObtainDecoration     @ STD_OBTAIN_DECORATION\n\t.4byte Std_PutItemAway          @ STD_PUT_ITEM_AWAY\n\t.4byte Std_ReceivedItem         @ STD_RECEIVED_ITEM\ngStdScriptsEnd::\n\n\t.include \"data/maps/BattleColosseum_2P/scripts.inc\"\n\t.include \"data/maps/TradeCenter/scripts.inc\"\n\t.include \"data/maps/RecordCorner/scripts.inc\"\n\t.include \"data/maps/BattleColosseum_4P/scripts.inc\"\n\t.include \"data/maps/UnionRoom/scripts.inc\"\n\t.include \"data/maps/ViridianForest/scripts.inc\"\n\t.include \"data/maps/MtMoon_1F/scripts.inc\"\n\t.include \"data/maps/MtMoon_B1F/scripts.inc\"\n\t.include \"data/maps/MtMoon_B2F/scripts.inc\"\n\t.include \"data/maps/SSAnne_Exterior/scripts.inc\"\n\t.include \"data/maps/SSAnne_1F_Corridor/scripts.inc\"\n\t.include \"data/maps/SSAnne_2F_Corridor/scripts.inc\"\n\t.include \"data/maps/SSAnne_3F_Corridor/scripts.inc\"\n\t.include \"data/maps/SSAnne_B1F_Corridor/scripts.inc\"\n\t.include \"data/maps/SSAnne_Deck/scripts.inc\"\n\t.include \"data/maps/SSAnne_Kitchen/scripts.inc\"\n\t.include \"data/maps/SSAnne_CaptainsOffice/scripts.inc\"\n\t.include \"data/maps/SSAnne_1F_Room1/scripts.inc\"\n\t.include \"data/maps/SSAnne_1F_Room2/scripts.inc\"\n\t.include \"data/maps/SSAnne_1F_Room3/scripts.inc\"\n\t.include \"data/maps/SSAnne_1F_Room4/scripts.inc\"\n\t.include \"data/maps/SSAnne_1F_Room5/scripts.inc\"\n\t.include \"data/maps/SSAnne_1F_Room7/scripts.inc\"\n\t.include \"data/maps/SSAnne_2F_Room1/scripts.inc\"\n\t.include \"data/maps/SSAnne_2F_Room2/scripts.inc\"\n\t.include \"data/maps/SSAnne_2F_Room3/scripts.inc\"\n\t.include \"data/maps/SSAnne_2F_Room4/scripts.inc\"\n\t.include \"data/maps/SSAnne_2F_Room5/scripts.inc\"\n\t.include \"data/maps/SSAnne_2F_Room6/scripts.inc\"\n\t.include \"data/maps/SSAnne_B1F_Room1/scripts.inc\"\n\t.include \"data/maps/SSAnne_B1F_Room2/scripts.inc\"\n\t.include \"data/maps/SSAnne_B1F_Room3/scripts.inc\"\n\t.include \"data/maps/SSAnne_B1F_Room4/scripts.inc\"\n\t.include \"data/maps/SSAnne_B1F_Room5/scripts.inc\"\n\t.include \"data/maps/SSAnne_1F_Room6/scripts.inc\"\n\t.include \"data/maps/UndergroundPath_NorthEntrance/scripts.inc\"\n\t.include \"data/maps/UndergroundPath_NorthSouthTunnel/scripts.inc\"\n\t.include \"data/maps/UndergroundPath_SouthEntrance/scripts.inc\"\n\t.include \"data/maps/UndergroundPath_WestEntrance/scripts.inc\"\n\t.include \"data/maps/UndergroundPath_EastWestTunnel/scripts.inc\"\n\t.include \"data/maps/UndergroundPath_EastEntrance/scripts.inc\"\n\t.include \"data/maps/DiglettsCave_NorthEntrance/scripts.inc\"\n\t.include \"data/maps/DiglettsCave_B1F/scripts.inc\"\n\t.include \"data/maps/DiglettsCave_SouthEntrance/scripts.inc\"\n\t.include \"data/maps/VictoryRoad_1F/scripts.inc\"\n\t.include \"data/maps/VictoryRoad_2F/scripts.inc\"\n\t.include \"data/maps/VictoryRoad_3F/scripts.inc\"\n\t.include \"data/maps/RocketHideout_B1F/scripts.inc\"\n\t.include \"data/maps/RocketHideout_B2F/scripts.inc\"\n\t.include \"data/maps/RocketHideout_B3F/scripts.inc\"\n\t.include \"data/maps/RocketHideout_B4F/scripts.inc\"\n\t.include \"data/maps/RocketHideout_Elevator/scripts.inc\"\n\t.include \"data/maps/SilphCo_1F/scripts.inc\"\n\t.include \"data/maps/SilphCo_2F/scripts.inc\"\n\t.include \"data/maps/SilphCo_3F/scripts.inc\"\n\t.include \"data/maps/SilphCo_4F/scripts.inc\"\n\t.include \"data/maps/SilphCo_5F/scripts.inc\"\n\t.include \"data/maps/SilphCo_6F/scripts.inc\"\n\t.include \"data/maps/SilphCo_7F/scripts.inc\"\n\t.include \"data/maps/SilphCo_8F/scripts.inc\"\n\t.include \"data/maps/SilphCo_9F/scripts.inc\"\n\t.include \"data/maps/SilphCo_10F/scripts.inc\"\n\t.include \"data/maps/SilphCo_11F/scripts.inc\"\n\t.include \"data/maps/SilphCo_Elevator/scripts.inc\"\n\t.include \"data/maps/PokemonMansion_1F/scripts.inc\"\n\t.include \"data/maps/PokemonMansion_2F/scripts.inc\"\n\t.include \"data/maps/PokemonMansion_3F/scripts.inc\"\n\t.include \"data/maps/PokemonMansion_B1F/scripts.inc\"\n\t.include \"data/maps/SafariZone_Center/scripts.inc\"\n\t.include \"data/maps/SafariZone_East/scripts.inc\"\n\t.include \"data/maps/SafariZone_North/scripts.inc\"\n\t.include \"data/maps/SafariZone_West/scripts.inc\"\n\t.include \"data/maps/SafariZone_Center_RestHouse/scripts.inc\"\n\t.include \"data/maps/SafariZone_East_RestHouse/scripts.inc\"\n\t.include \"data/maps/SafariZone_North_RestHouse/scripts.inc\"\n\t.include \"data/maps/SafariZone_West_RestHouse/scripts.inc\"\n\t.include \"data/maps/SafariZone_SecretHouse/scripts.inc\"\n\t.include \"data/maps/CeruleanCave_1F/scripts.inc\"\n\t.include \"data/maps/CeruleanCave_2F/scripts.inc\"\n\t.include \"data/maps/CeruleanCave_B1F/scripts.inc\"\n\t.include \"data/maps/PokemonLeague_LoreleisRoom/scripts.inc\"\n\t.include \"data/maps/PokemonLeague_BrunosRoom/scripts.inc\"\n\t.include \"data/maps/PokemonLeague_AgathasRoom/scripts.inc\"\n\t.include \"data/maps/PokemonLeague_LancesRoom/scripts.inc\"\n\t.include \"data/maps/PokemonLeague_ChampionsRoom/scripts.inc\"\n\t.include \"data/maps/PokemonLeague_HallOfFame/scripts.inc\"\n\t.include \"data/maps/RockTunnel_1F/scripts.inc\"\n\t.include \"data/maps/RockTunnel_B1F/scripts.inc\"\n\t.include \"data/maps/SeafoamIslands_1F/scripts.inc\"\n\t.include \"data/maps/SeafoamIslands_B1F/scripts.inc\"\n\t.include \"data/maps/SeafoamIslands_B2F/scripts.inc\"\n\t.include \"data/maps/SeafoamIslands_B3F/scripts.inc\"\n\t.include \"data/maps/SeafoamIslands_B4F/scripts.inc\"\n\t.include \"data/maps/PokemonTower_1F/scripts.inc\"\n\t.include \"data/maps/PokemonTower_2F/scripts.inc\"\n\t.include \"data/maps/PokemonTower_3F/scripts.inc\"\n\t.include \"data/maps/PokemonTower_4F/scripts.inc\"\n\t.include \"data/maps/PokemonTower_5F/scripts.inc\"\n\t.include \"data/maps/PokemonTower_6F/scripts.inc\"\n\t.include \"data/maps/PokemonTower_7F/scripts.inc\"\n\t.include \"data/maps/PowerPlant/scripts.inc\"\n\t.include \"data/maps/MtEmber_RubyPath_B4F/scripts.inc\"\n\t.include \"data/maps/MtEmber_Exterior/scripts.inc\"\n\t.include \"data/maps/MtEmber_SummitPath_1F/scripts.inc\"\n\t.include \"data/maps/MtEmber_SummitPath_2F/scripts.inc\"\n\t.include \"data/maps/MtEmber_SummitPath_3F/scripts.inc\"\n\t.include \"data/maps/MtEmber_Summit/scripts.inc\"\n\t.include \"data/maps/MtEmber_RubyPath_B5F/scripts.inc\"\n\t.include \"data/maps/MtEmber_RubyPath_1F/scripts.inc\"\n\t.include \"data/maps/MtEmber_RubyPath_B1F/scripts.inc\"\n\t.include \"data/maps/MtEmber_RubyPath_B2F/scripts.inc\"\n\t.include \"data/maps/MtEmber_RubyPath_B3F/scripts.inc\"\n\t.include \"data/maps/MtEmber_RubyPath_B1F_Stairs/scripts.inc\"\n\t.include \"data/maps/MtEmber_RubyPath_B2F_Stairs/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_BerryForest/scripts.inc\"\n\t.include \"data/maps/FourIsland_IcefallCave_Entrance/scripts.inc\"\n\t.include \"data/maps/FourIsland_IcefallCave_1F/scripts.inc\"\n\t.include \"data/maps/FourIsland_IcefallCave_B1F/scripts.inc\"\n\t.include \"data/maps/FourIsland_IcefallCave_Back/scripts.inc\"\n\t.include \"data/maps/FiveIsland_RocketWarehouse/scripts.inc\"\n\t.include \"data/maps/SixIsland_DottedHole_1F/scripts.inc\"\n\t.include \"data/maps/SixIsland_DottedHole_B1F/scripts.inc\"\n\t.include \"data/maps/SixIsland_DottedHole_B2F/scripts.inc\"\n\t.include \"data/maps/SixIsland_DottedHole_B3F/scripts.inc\"\n\t.include \"data/maps/SixIsland_DottedHole_B4F/scripts.inc\"\n\t.include \"data/maps/SixIsland_DottedHole_SapphireRoom/scripts.inc\"\n\t.include \"data/maps/SixIsland_PatternBush/scripts.inc\"\n\t.include \"data/maps/SixIsland_AlteringCave/scripts.inc\"\n\t.include \"data/maps/NavelRock_Exterior/scripts.inc\"\n\t.include \"data/maps/TrainerTower_1F/scripts.inc\"\n\t.include \"data/maps/TrainerTower_2F/scripts.inc\"\n\t.include \"data/maps/TrainerTower_3F/scripts.inc\"\n\t.include \"data/maps/TrainerTower_4F/scripts.inc\"\n\t.include \"data/maps/TrainerTower_5F/scripts.inc\"\n\t.include \"data/maps/TrainerTower_6F/scripts.inc\"\n\t.include \"data/maps/TrainerTower_7F/scripts.inc\"\n\t.include \"data/maps/TrainerTower_8F/scripts.inc\"\n\t.include \"data/maps/TrainerTower_Roof/scripts.inc\"\n\t.include \"data/maps/TrainerTower_Lobby/scripts.inc\"\n\t.include \"data/maps/TrainerTower_Elevator/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Entrance/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room1/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room2/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room3/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room4/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room5/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room6/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room7/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room8/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room9/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room10/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room11/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room12/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room13/scripts.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room14/scripts.inc\"\n\t.include \"data/maps/SevenIsland_TanobyRuins_MoneanChamber/scripts.inc\"\n\t.include \"data/maps/SevenIsland_TanobyRuins_LiptooChamber/scripts.inc\"\n\t.include \"data/maps/SevenIsland_TanobyRuins_WeepthChamber/scripts.inc\"\n\t.include \"data/maps/SevenIsland_TanobyRuins_DilfordChamber/scripts.inc\"\n\t.include \"data/maps/SevenIsland_TanobyRuins_ScufibChamber/scripts.inc\"\n\t.include \"data/maps/SevenIsland_TanobyRuins_RixyChamber/scripts.inc\"\n\t.include \"data/maps/SevenIsland_TanobyRuins_ViapoisChamber/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_DunsparceTunnel/scripts.inc\"\n\t.include \"data/maps/SevenIsland_SevaultCanyon_TanobyKey/scripts.inc\"\n\t.include \"data/maps/NavelRock_1F/scripts.inc\"\n\t.include \"data/maps/NavelRock_Summit/scripts.inc\"\n\t.include \"data/maps/NavelRock_Base/scripts.inc\"\n\t.include \"data/maps/NavelRock_SummitPath_2F/scripts.inc\"\n\t.include \"data/maps/NavelRock_SummitPath_3F/scripts.inc\"\n\t.include \"data/maps/NavelRock_SummitPath_4F/scripts.inc\"\n\t.include \"data/maps/NavelRock_SummitPath_5F/scripts.inc\"\n\t.include \"data/maps/NavelRock_BasePath_B1F/scripts.inc\"\n\t.include \"data/maps/NavelRock_BasePath_B2F/scripts.inc\"\n\t.include \"data/maps/NavelRock_BasePath_B3F/scripts.inc\"\n\t.include \"data/maps/NavelRock_BasePath_B4F/scripts.inc\"\n\t.include \"data/maps/NavelRock_BasePath_B5F/scripts.inc\"\n\t.include \"data/maps/NavelRock_BasePath_B6F/scripts.inc\"\n\t.include \"data/maps/NavelRock_BasePath_B7F/scripts.inc\"\n\t.include \"data/maps/NavelRock_BasePath_B8F/scripts.inc\"\n\t.include \"data/maps/NavelRock_BasePath_B9F/scripts.inc\"\n\t.include \"data/maps/NavelRock_BasePath_B10F/scripts.inc\"\n\t.include \"data/maps/NavelRock_BasePath_B11F/scripts.inc\"\n\t.include \"data/maps/NavelRock_B1F/scripts.inc\"\n\t.include \"data/maps/NavelRock_Fork/scripts.inc\"\n\t.include \"data/maps/BirthIsland_Exterior/scripts.inc\"\n\t.include \"data/maps/OneIsland_KindleRoad_EmberSpa/scripts.inc\"\n\t.include \"data/maps/BirthIsland_Harbor/scripts.inc\"\n\t.include \"data/maps/NavelRock_Harbor/scripts.inc\"\n\t.include \"data/maps/PalletTown/scripts.inc\"\n\t.include \"data/maps/ViridianCity/scripts.inc\"\n\t.include \"data/maps/PewterCity/scripts.inc\"\n\t.include \"data/maps/CeruleanCity/scripts.inc\"\n\t.include \"data/maps/LavenderTown/scripts.inc\"\n\t.include \"data/maps/VermilionCity/scripts.inc\"\n\t.include \"data/maps/CeladonCity/scripts.inc\"\n\t.include \"data/maps/FuchsiaCity/scripts.inc\"\n\t.include \"data/maps/CinnabarIsland/scripts.inc\"\n\t.include \"data/maps/IndigoPlateau_Exterior/scripts.inc\"\n\t.include \"data/maps/SaffronCity/scripts.inc\"\n\t.include \"data/maps/SaffronCity_Connection/scripts.inc\"\n\t.include \"data/maps/OneIsland/scripts.inc\"\n\t.include \"data/maps/TwoIsland/scripts.inc\"\n\t.include \"data/maps/ThreeIsland/scripts.inc\"\n\t.include \"data/maps/FourIsland/scripts.inc\"\n\t.include \"data/maps/FiveIsland/scripts.inc\"\n\t.include \"data/maps/SevenIsland/scripts.inc\"\n\t.include \"data/maps/SixIsland/scripts.inc\"\n\t.include \"data/maps/Route1/scripts.inc\"\n\t.include \"data/maps/Route2/scripts.inc\"\n\t.include \"data/maps/Route3/scripts.inc\"\n\t.include \"data/maps/Route4/scripts.inc\"\n\t.include \"data/maps/Route5/scripts.inc\"\n\t.include \"data/maps/Route6/scripts.inc\"\n\t.include \"data/maps/Route7/scripts.inc\"\n\t.include \"data/maps/Route8/scripts.inc\"\n\t.include \"data/maps/Route9/scripts.inc\"\n\t.include \"data/maps/Route10/scripts.inc\"\n\t.include \"data/maps/Route11/scripts.inc\"\n\t.include \"data/maps/Route12/scripts.inc\"\n\t.include \"data/maps/Route13/scripts.inc\"\n\t.include \"data/maps/Route14/scripts.inc\"\n\t.include \"data/maps/Route15/scripts.inc\"\n\t.include \"data/maps/Route16/scripts.inc\"\n\t.include \"data/maps/Route17/scripts.inc\"\n\t.include \"data/maps/Route18/scripts.inc\"\n\t.include \"data/maps/Route19/scripts.inc\"\n\t.include \"data/maps/Route20/scripts.inc\"\n\t.include \"data/maps/Route21_North/scripts.inc\"\n\t.include \"data/maps/Route21_South/scripts.inc\"\n\t.include \"data/maps/Route22/scripts.inc\"\n\t.include \"data/maps/Route23/scripts.inc\"\n\t.include \"data/maps/Route24/scripts.inc\"\n\t.include \"data/maps/Route25/scripts.inc\"\n\t.include \"data/maps/OneIsland_KindleRoad/scripts.inc\"\n\t.include \"data/maps/OneIsland_TreasureBeach/scripts.inc\"\n\t.include \"data/maps/TwoIsland_CapeBrink/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_BondBridge/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_Port/scripts.inc\"\n\t.include \"data/maps/Prototype_SeviiIsle_6/scripts.inc\"\n\t.include \"data/maps/Prototype_SeviiIsle_7/scripts.inc\"\n\t.include \"data/maps/Prototype_SeviiIsle_8/scripts.inc\"\n\t.include \"data/maps/Prototype_SeviiIsle_9/scripts.inc\"\n\t.include \"data/maps/FiveIsland_ResortGorgeous/scripts.inc\"\n\t.include \"data/maps/FiveIsland_WaterLabyrinth/scripts.inc\"\n\t.include \"data/maps/FiveIsland_Meadow/scripts.inc\"\n\t.include \"data/maps/FiveIsland_MemorialPillar/scripts.inc\"\n\t.include \"data/maps/SixIsland_OutcastIsland/scripts.inc\"\n\t.include \"data/maps/SixIsland_GreenPath/scripts.inc\"\n\t.include \"data/maps/SixIsland_WaterPath/scripts.inc\"\n\t.include \"data/maps/SixIsland_RuinValley/scripts.inc\"\n\t.include \"data/maps/SevenIsland_TrainerTower/scripts.inc\"\n\t.include \"data/maps/SevenIsland_SevaultCanyon_Entrance/scripts.inc\"\n\t.include \"data/maps/SevenIsland_SevaultCanyon/scripts.inc\"\n\t.include \"data/maps/SevenIsland_TanobyRuins/scripts.inc\"\n\t.include \"data/maps/PalletTown_PlayersHouse_1F/scripts.inc\"\n\t.include \"data/maps/PalletTown_PlayersHouse_2F/scripts.inc\"\n\t.include \"data/maps/PalletTown_RivalsHouse/scripts.inc\"\n\t.include \"data/maps/PalletTown_ProfessorOaksLab/scripts.inc\"\n\t.include \"data/maps/ViridianCity_House/scripts.inc\"\n\t.include \"data/maps/ViridianCity_Gym/scripts.inc\"\n\t.include \"data/maps/ViridianCity_School/scripts.inc\"\n\t.include \"data/maps/ViridianCity_Mart/scripts.inc\"\n\t.include \"data/maps/ViridianCity_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/ViridianCity_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/PewterCity_Museum_1F/scripts.inc\"\n\t.include \"data/maps/PewterCity_Museum_2F/scripts.inc\"\n\t.include \"data/maps/PewterCity_Gym/scripts.inc\"\n\t.include \"data/maps/PewterCity_Mart/scripts.inc\"\n\t.include \"data/maps/PewterCity_House1/scripts.inc\"\n\t.include \"data/maps/PewterCity_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/PewterCity_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/PewterCity_House2/scripts.inc\"\n\t.include \"data/maps/CeruleanCity_House1/scripts.inc\"\n\t.include \"data/maps/CeruleanCity_House2/scripts.inc\"\n\t.include \"data/maps/CeruleanCity_House3/scripts.inc\"\n\t.include \"data/maps/CeruleanCity_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/CeruleanCity_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/CeruleanCity_Gym/scripts.inc\"\n\t.include \"data/maps/CeruleanCity_BikeShop/scripts.inc\"\n\t.include \"data/maps/CeruleanCity_Mart/scripts.inc\"\n\t.include \"data/maps/CeruleanCity_House4/scripts.inc\"\n\t.include \"data/maps/CeruleanCity_House5/scripts.inc\"\n\t.include \"data/maps/LavenderTown_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/LavenderTown_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/LavenderTown_VolunteerPokemonHouse/scripts.inc\"\n\t.include \"data/maps/LavenderTown_House1/scripts.inc\"\n\t.include \"data/maps/LavenderTown_House2/scripts.inc\"\n\t.include \"data/maps/LavenderTown_Mart/scripts.inc\"\n\t.include \"data/maps/VermilionCity_House1/scripts.inc\"\n\t.include \"data/maps/VermilionCity_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/VermilionCity_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/VermilionCity_PokemonFanClub/scripts.inc\"\n\t.include \"data/maps/VermilionCity_House2/scripts.inc\"\n\t.include \"data/maps/VermilionCity_Mart/scripts.inc\"\n\t.include \"data/maps/VermilionCity_Gym/scripts.inc\"\n\t.include \"data/maps/VermilionCity_House3/scripts.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_1F/scripts.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_2F/scripts.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_3F/scripts.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_4F/scripts.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_5F/scripts.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_Roof/scripts.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_Elevator/scripts.inc\"\n\t.include \"data/maps/CeladonCity_Condominiums_1F/scripts.inc\"\n\t.include \"data/maps/CeladonCity_Condominiums_2F/scripts.inc\"\n\t.include \"data/maps/CeladonCity_Condominiums_3F/scripts.inc\"\n\t.include \"data/maps/CeladonCity_Condominiums_Roof/scripts.inc\"\n\t.include \"data/maps/CeladonCity_Condominiums_RoofRoom/scripts.inc\"\n\t.include \"data/maps/CeladonCity_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/CeladonCity_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/CeladonCity_GameCorner/scripts.inc\"\n\t.include \"data/maps/CeladonCity_GameCorner_PrizeRoom/scripts.inc\"\n\t.include \"data/maps/CeladonCity_Gym/scripts.inc\"\n\t.include \"data/maps/CeladonCity_Restaurant/scripts.inc\"\n\t.include \"data/maps/CeladonCity_House1/scripts.inc\"\n\t.include \"data/maps/CeladonCity_Hotel/scripts.inc\"\n\t.include \"data/maps/FuchsiaCity_SafariZone_Entrance/scripts.inc\"\n\t.include \"data/maps/FuchsiaCity_Mart/scripts.inc\"\n\t.include \"data/maps/FuchsiaCity_SafariZone_Office/scripts.inc\"\n\t.include \"data/maps/FuchsiaCity_Gym/scripts.inc\"\n\t.include \"data/maps/FuchsiaCity_House1/scripts.inc\"\n\t.include \"data/maps/FuchsiaCity_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/FuchsiaCity_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/FuchsiaCity_WardensHouse/scripts.inc\"\n\t.include \"data/maps/FuchsiaCity_House2/scripts.inc\"\n\t.include \"data/maps/FuchsiaCity_House3/scripts.inc\"\n\t.include \"data/maps/CinnabarIsland_Gym/scripts.inc\"\n\t.include \"data/maps/CinnabarIsland_PokemonLab_Entrance/scripts.inc\"\n\t.include \"data/maps/CinnabarIsland_PokemonLab_Lounge/scripts.inc\"\n\t.include \"data/maps/CinnabarIsland_PokemonLab_ResearchRoom/scripts.inc\"\n\t.include \"data/maps/CinnabarIsland_PokemonLab_ExperimentRoom/scripts.inc\"\n\t.include \"data/maps/CinnabarIsland_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/CinnabarIsland_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/CinnabarIsland_Mart/scripts.inc\"\n\t.include \"data/maps/IndigoPlateau_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/IndigoPlateau_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/SaffronCity_CopycatsHouse_1F/scripts.inc\"\n\t.include \"data/maps/SaffronCity_CopycatsHouse_2F/scripts.inc\"\n\t.include \"data/maps/SaffronCity_Dojo/scripts.inc\"\n\t.include \"data/maps/SaffronCity_Gym/scripts.inc\"\n\t.include \"data/maps/SaffronCity_House/scripts.inc\"\n\t.include \"data/maps/SaffronCity_Mart/scripts.inc\"\n\t.include \"data/maps/SaffronCity_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/SaffronCity_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/SaffronCity_MrPsychicsHouse/scripts.inc\"\n\t.include \"data/maps/SaffronCity_PokemonTrainerFanClub/scripts.inc\"\n\t.include \"data/maps/Route2_ViridianForest_SouthEntrance/scripts.inc\"\n\t.include \"data/maps/Route2_House/scripts.inc\"\n\t.include \"data/maps/Route2_EastBuilding/scripts.inc\"\n\t.include \"data/maps/Route2_ViridianForest_NorthEntrance/scripts.inc\"\n\t.include \"data/maps/Route4_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/Route4_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/Route5_PokemonDayCare/scripts.inc\"\n\t.include \"data/maps/Route5_SouthEntrance/scripts.inc\"\n\t.include \"data/maps/Route6_NorthEntrance/scripts.inc\"\n\t.include \"data/maps/Route6_UnusedHouse/scripts.inc\"\n\t.include \"data/maps/Route7_EastEntrance/scripts.inc\"\n\t.include \"data/maps/Route8_WestEntrance/scripts.inc\"\n\t.include \"data/maps/Route10_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/Route10_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/Route11_EastEntrance_1F/scripts.inc\"\n\t.include \"data/maps/Route11_EastEntrance_2F/scripts.inc\"\n\t.include \"data/maps/Route12_NorthEntrance_1F/scripts.inc\"\n\t.include \"data/maps/Route12_NorthEntrance_2F/scripts.inc\"\n\t.include \"data/maps/Route12_FishingHouse/scripts.inc\"\n\t.include \"data/maps/Route15_WestEntrance_1F/scripts.inc\"\n\t.include \"data/maps/Route15_WestEntrance_2F/scripts.inc\"\n\t.include \"data/maps/Route16_House/scripts.inc\"\n\t.include \"data/maps/Route16_NorthEntrance_1F/scripts.inc\"\n\t.include \"data/maps/Route16_NorthEntrance_2F/scripts.inc\"\n\t.include \"data/maps/Route18_EastEntrance_1F/scripts.inc\"\n\t.include \"data/maps/Route18_EastEntrance_2F/scripts.inc\"\n\t.include \"data/maps/Route19_UnusedHouse/scripts.inc\"\n\t.include \"data/maps/Route22_NorthEntrance/scripts.inc\"\n\t.include \"data/maps/Route23_UnusedHouse/scripts.inc\"\n\t.include \"data/maps/Route25_SeaCottage/scripts.inc\"\n\t.include \"data/maps/SevenIsland_House_Room1/scripts.inc\"\n\t.include \"data/maps/SevenIsland_House_Room2/scripts.inc\"\n\t.include \"data/maps/SevenIsland_Mart/scripts.inc\"\n\t.include \"data/maps/SevenIsland_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/SevenIsland_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/SevenIsland_UnusedHouse/scripts.inc\"\n\t.include \"data/maps/SevenIsland_Harbor/scripts.inc\"\n\t.include \"data/maps/OneIsland_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/OneIsland_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/OneIsland_House1/scripts.inc\"\n\t.include \"data/maps/OneIsland_House2/scripts.inc\"\n\t.include \"data/maps/OneIsland_Harbor/scripts.inc\"\n\t.include \"data/maps/TwoIsland_JoyfulGameCorner/scripts.inc\"\n\t.include \"data/maps/TwoIsland_House/scripts.inc\"\n\t.include \"data/maps/TwoIsland_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/TwoIsland_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/TwoIsland_Harbor/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_House1/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_Mart/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_House2/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_House3/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_House4/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_House5/scripts.inc\"\n\t.include \"data/maps/FourIsland_PokemonDayCare/scripts.inc\"\n\t.include \"data/maps/FourIsland_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/FourIsland_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/FourIsland_House1/scripts.inc\"\n\t.include \"data/maps/FourIsland_LoreleisHouse/scripts.inc\"\n\t.include \"data/maps/FourIsland_Harbor/scripts.inc\"\n\t.include \"data/maps/FourIsland_House2/scripts.inc\"\n\t.include \"data/maps/FourIsland_Mart/scripts.inc\"\n\t.include \"data/maps/FiveIsland_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/FiveIsland_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/FiveIsland_Harbor/scripts.inc\"\n\t.include \"data/maps/FiveIsland_House1/scripts.inc\"\n\t.include \"data/maps/FiveIsland_House2/scripts.inc\"\n\t.include \"data/maps/SixIsland_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/SixIsland_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/SixIsland_Harbor/scripts.inc\"\n\t.include \"data/maps/SixIsland_House/scripts.inc\"\n\t.include \"data/maps/SixIsland_Mart/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_Harbor/scripts.inc\"\n\t.include \"data/maps/FiveIsland_ResortGorgeous_House/scripts.inc\"\n\t.include \"data/maps/TwoIsland_CapeBrink_House/scripts.inc\"\n\t.include \"data/maps/SixIsland_WaterPath_House1/scripts.inc\"\n\t.include \"data/maps/SixIsland_WaterPath_House2/scripts.inc\"\n\t.include \"data/maps/SevenIsland_SevaultCanyon_House/scripts.inc\"\n\n\t.include \"data/maps/ViridianForest/text.inc\"\n\t.include \"data/maps/MtMoon_1F/text.inc\"\n\t.include \"data/maps/MtMoon_B2F/text.inc\"\n\t.include \"data/maps/SSAnne_1F_Corridor/text.inc\"\n\t.include \"data/maps/SSAnne_2F_Corridor/text.inc\"\n\t.include \"data/maps/SSAnne_3F_Corridor/text.inc\"\n\t.include \"data/maps/SSAnne_Deck/text.inc\"\n\t.include \"data/maps/SSAnne_Kitchen/text.inc\"\n\t.include \"data/maps/SSAnne_CaptainsOffice/text.inc\"\n\t.include \"data/maps/SSAnne_1F_Room1/text.inc\"\n\t.include \"data/maps/SSAnne_1F_Room2/text.inc\"\n\t.include \"data/maps/SSAnne_1F_Room3/text.inc\"\n\t.include \"data/maps/SSAnne_1F_Room4/text.inc\"\n\t.include \"data/maps/SSAnne_1F_Room5/text.inc\"\n\t.include \"data/maps/SSAnne_1F_Room7/text.inc\"\n\t.include \"data/maps/SSAnne_2F_Room1/text.inc\"\n\t.include \"data/maps/SSAnne_2F_Room2/text.inc\"\n\t.include \"data/maps/SSAnne_2F_Room3/text.inc\"\n\t.include \"data/maps/SSAnne_2F_Room4/text.inc\"\n\t.include \"data/maps/SSAnne_2F_Room5/text.inc\"\n\t.include \"data/maps/SSAnne_2F_Room6/text.inc\"\n\t.include \"data/maps/SSAnne_B1F_Room1/text.inc\"\n\t.include \"data/maps/SSAnne_B1F_Room2/text.inc\"\n\t.include \"data/maps/SSAnne_B1F_Room3/text.inc\"\n\t.include \"data/maps/SSAnne_B1F_Room4/text.inc\"\n\t.include \"data/maps/SSAnne_B1F_Room5/text.inc\"\n\t.include \"data/maps/SSAnne_1F_Room6/text.inc\"\n\t.include \"data/maps/UndergroundPath_SouthEntrance/text.inc\"\n\t.include \"data/maps/UndergroundPath_WestEntrance/text.inc\"\n\t.include \"data/maps/UndergroundPath_EastEntrance/text.inc\"\n\t.include \"data/maps/DiglettsCave_NorthEntrance/text.inc\"\n\t.include \"data/maps/DiglettsCave_SouthEntrance/text.inc\"\n\t.include \"data/maps/VictoryRoad_1F/text.inc\"\n\t.include \"data/maps/VictoryRoad_2F/text.inc\"\n\t.include \"data/maps/VictoryRoad_3F/text.inc\"\n\t.include \"data/maps/RocketHideout_B1F/text.inc\"\n\t.include \"data/maps/RocketHideout_B2F/text.inc\"\n\t.include \"data/maps/RocketHideout_B3F/text.inc\"\n\t.include \"data/maps/RocketHideout_B4F/text.inc\"\n\t.include \"data/maps/RocketHideout_Elevator/text.inc\"\n\t.include \"data/maps/SilphCo_1F/text.inc\"\n\t.include \"data/maps/SilphCo_2F/text.inc\"\n\t.include \"data/maps/SilphCo_3F/text.inc\"\n\t.include \"data/maps/SilphCo_4F/text.inc\"\n\t.include \"data/maps/SilphCo_5F/text.inc\"\n\t.include \"data/maps/SilphCo_6F/text.inc\"\n\t.include \"data/maps/SilphCo_7F/text.inc\"\n\t.include \"data/maps/SilphCo_8F/text.inc\"\n\t.include \"data/maps/SilphCo_9F/text.inc\"\n\t.include \"data/maps/SilphCo_10F/text.inc\"\n\t.include \"data/maps/SilphCo_11F/text.inc\"\n\t.include \"data/maps/PokemonMansion_1F/text.inc\"\n\t.include \"data/maps/PokemonMansion_2F/text.inc\"\n\t.include \"data/maps/PokemonMansion_3F/text.inc\"\n\t.include \"data/maps/PokemonMansion_B1F/text.inc\"\n\t.include \"data/maps/SafariZone_Center/text.inc\"\n\t.include \"data/maps/SafariZone_East/text.inc\"\n\t.include \"data/maps/SafariZone_North/text.inc\"\n\t.include \"data/maps/SafariZone_West/text.inc\"\n\t.include \"data/maps/SafariZone_Center_RestHouse/text.inc\"\n\t.include \"data/maps/SafariZone_East_RestHouse/text.inc\"\n\t.include \"data/maps/SafariZone_North_RestHouse/text.inc\"\n\t.include \"data/maps/SafariZone_West_RestHouse/text.inc\"\n\t.include \"data/maps/SafariZone_SecretHouse/text.inc\"\n\t.include \"data/maps/CeruleanCave_B1F/text.inc\"\n\t.include \"data/maps/PokemonLeague_LoreleisRoom/text.inc\"\n\t.include \"data/maps/PokemonLeague_BrunosRoom/text.inc\"\n\t.include \"data/maps/PokemonLeague_AgathasRoom/text.inc\"\n\t.include \"data/maps/PokemonLeague_LancesRoom/text.inc\"\n\t.include \"data/maps/PokemonLeague_ChampionsRoom/text.inc\"\n\t.include \"data/maps/PokemonLeague_HallOfFame/text.inc\"\n\t.include \"data/maps/RockTunnel_1F/text.inc\"\n\t.include \"data/maps/RockTunnel_B1F/text.inc\"\n\t.include \"data/maps/SeafoamIslands_B4F/text.inc\"\n\t.include \"data/maps/PokemonTower_1F/text.inc\"\n\t.include \"data/maps/PokemonTower_2F/text.inc\"\n\t.include \"data/maps/PokemonTower_3F/text.inc\"\n\t.include \"data/maps/PokemonTower_4F/text.inc\"\n\t.include \"data/maps/PokemonTower_5F/text.inc\"\n\t.include \"data/maps/PokemonTower_6F/text.inc\"\n\t.include \"data/maps/PokemonTower_7F/text.inc\"\n\t.include \"data/maps/MtEmber_Exterior/text.inc\"\n\t.include \"data/maps/MtEmber_RubyPath_B3F/text.inc\"\n\t.include \"data/maps/ThreeIsland_BerryForest/text.inc\"\n\t.include \"data/maps/FourIsland_IcefallCave_Back/text.inc\"\n\t.include \"data/maps/FiveIsland_RocketWarehouse/text.inc\"\n\t.include \"data/maps/SixIsland_DottedHole_SapphireRoom/text.inc\"\n\t.include \"data/maps/SixIsland_PatternBush/text.inc\"\n\t.include \"data/maps/TrainerTower_Lobby/text.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room1/text.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room4/text.inc\"\n\t.include \"data/maps/FiveIsland_LostCave_Room10/text.inc\"\n\t.include \"data/maps/ThreeIsland_DunsparceTunnel/text.inc\"\n\t.include \"data/maps/SevenIsland_SevaultCanyon_TanobyKey/text.inc\"\n\t.include \"data/maps/OneIsland_KindleRoad_EmberSpa/text.inc\"\n\t.include \"data/maps/PalletTown/text.inc\"\n\t.include \"data/maps/ViridianCity/text.inc\"\n\t.include \"data/maps/PewterCity/text.inc\"\n\t.include \"data/maps/CeruleanCity/text.inc\"\n\t.include \"data/maps/LavenderTown/text.inc\"\n\t.include \"data/maps/VermilionCity/text.inc\"\n\t.include \"data/maps/CeladonCity/text.inc\"\n\t.include \"data/maps/FuchsiaCity/text.inc\"\n\t.include \"data/maps/CinnabarIsland/text.inc\"\n\t.include \"data/maps/SaffronCity/text.inc\"\n\t.include \"data/maps/OneIsland/text.inc\"\n\t.include \"data/maps/TwoIsland/text.inc\"\n\t.include \"data/maps/ThreeIsland/text.inc\"\n\t.include \"data/maps/FourIsland/text.inc\"\n\t.include \"data/maps/FiveIsland/text.inc\"\n\t.include \"data/maps/SevenIsland/text.inc\"\n\t.include \"data/maps/SixIsland/text.inc\"\n\t.include \"data/maps/Route1/text.inc\"\n\t.include \"data/maps/Route2/text.inc\"\n\t.include \"data/maps/Route3/text.inc\"\n\t.include \"data/maps/Route4/text.inc\"\n\t.include \"data/maps/Route5/text.inc\"\n\t.include \"data/maps/Route6/text.inc\"\n\t.include \"data/maps/Route7/text.inc\"\n\t.include \"data/maps/Route8/text.inc\"\n\t.include \"data/maps/Route9/text.inc\"\n\t.include \"data/maps/Route10/text.inc\"\n\t.include \"data/maps/Route11/text.inc\"\n\t.include \"data/maps/Route12/text.inc\"\n\t.include \"data/maps/Route13/text.inc\"\n\t.include \"data/maps/Route14/text.inc\"\n\t.include \"data/maps/Route15/text.inc\"\n\t.include \"data/maps/Route16/text.inc\"\n\t.include \"data/maps/Route17/text.inc\"\n\t.include \"data/maps/Route18/text.inc\"\n\t.include \"data/maps/Route19/text.inc\"\n\t.include \"data/maps/Route20/text.inc\"\n\t.include \"data/maps/Route21_North/text.inc\"\n\t.include \"data/maps/Route21_South/text.inc\"\n\t.include \"data/maps/Route22/text.inc\"\n\t.include \"data/maps/Route23/text.inc\"\n\t.include \"data/maps/Route24/text.inc\"\n\t.include \"data/maps/Route25/text.inc\"\n\t.include \"data/maps/OneIsland_KindleRoad/text.inc\"\n\t.include \"data/maps/OneIsland_TreasureBeach/text.inc\"\n\t.include \"data/maps/ThreeIsland_BondBridge/text.inc\"\n\t.include \"data/maps/ThreeIsland_Port/text.inc\"\n\t.include \"data/maps/FiveIsland_ResortGorgeous/text.inc\"\n\t.include \"data/maps/FiveIsland_WaterLabyrinth/text.inc\"\n\t.include \"data/maps/FiveIsland_Meadow/text.inc\"\n\t.include \"data/maps/FiveIsland_MemorialPillar/text.inc\"\n\t.include \"data/maps/SixIsland_OutcastIsland/text.inc\"\n\t.include \"data/maps/SixIsland_GreenPath/text.inc\"\n\t.include \"data/maps/SixIsland_WaterPath/text.inc\"\n\t.include \"data/maps/SixIsland_RuinValley/text.inc\"\n\t.include \"data/maps/SevenIsland_TrainerTower/text.inc\"\n\t.include \"data/maps/SevenIsland_SevaultCanyon_Entrance/text.inc\"\n\t.include \"data/maps/SevenIsland_SevaultCanyon/text.inc\"\n\t.include \"data/maps/SevenIsland_TanobyRuins/text.inc\"\n\t.include \"data/maps/PalletTown_PlayersHouse_1F/text.inc\"\n\t.include \"data/maps/PalletTown_PlayersHouse_2F/text.inc\"\n\t.include \"data/maps/PalletTown_RivalsHouse/text.inc\"\n\t.include \"data/maps/PalletTown_ProfessorOaksLab/text.inc\"\n\t.include \"data/maps/ViridianCity_House/text.inc\"\n\t.include \"data/maps/ViridianCity_Gym/text.inc\"\n\t.include \"data/maps/ViridianCity_School/text.inc\"\n\t.include \"data/maps/ViridianCity_Mart/text.inc\"\n\t.include \"data/maps/ViridianCity_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/PewterCity_Museum_1F/text.inc\"\n\t.include \"data/maps/PewterCity_Museum_2F/text.inc\"\n\t.include \"data/maps/PewterCity_Gym/text.inc\"\n\t.include \"data/maps/PewterCity_Mart/text.inc\"\n\t.include \"data/maps/PewterCity_House1/text.inc\"\n\t.include \"data/maps/PewterCity_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/PewterCity_House2/text.inc\"\n\t.include \"data/maps/CeruleanCity_House1/text.inc\"\n\t.include \"data/maps/CeruleanCity_House2/text.inc\"\n\t.include \"data/maps/CeruleanCity_House3/text.inc\"\n\t.include \"data/maps/CeruleanCity_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/CeruleanCity_Gym/text.inc\"\n\t.include \"data/maps/CeruleanCity_BikeShop/text.inc\"\n\t.include \"data/maps/CeruleanCity_Mart/text.inc\"\n\t.include \"data/maps/CeruleanCity_House4/text.inc\"\n\t.include \"data/maps/CeruleanCity_House5/text.inc\"\n\t.include \"data/maps/LavenderTown_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/LavenderTown_VolunteerPokemonHouse/text.inc\"\n\t.include \"data/maps/LavenderTown_House1/text.inc\"\n\t.include \"data/maps/LavenderTown_House2/text.inc\"\n\t.include \"data/maps/LavenderTown_Mart/text.inc\"\n\t.include \"data/maps/VermilionCity_House1/text.inc\"\n\t.include \"data/maps/VermilionCity_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/VermilionCity_PokemonFanClub/text.inc\"\n\t.include \"data/maps/VermilionCity_House2/text.inc\"\n\t.include \"data/maps/VermilionCity_Mart/text.inc\"\n\t.include \"data/maps/VermilionCity_Gym/text.inc\"\n\t.include \"data/maps/VermilionCity_House3/text.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_1F/text.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_2F/text.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_3F/text.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_4F/text.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_5F/text.inc\"\n\t.include \"data/maps/CeladonCity_DepartmentStore_Roof/text.inc\"\n\t.include \"data/maps/CeladonCity_Condominiums_1F/text.inc\"\n\t.include \"data/maps/CeladonCity_Condominiums_2F/text.inc\"\n\t.include \"data/maps/CeladonCity_Condominiums_3F/text.inc\"\n\t.include \"data/maps/CeladonCity_Condominiums_Roof/text.inc\"\n\t.include \"data/maps/CeladonCity_Condominiums_RoofRoom/text.inc\"\n\t.include \"data/maps/CeladonCity_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/CeladonCity_GameCorner/text.inc\"\n\t.include \"data/maps/CeladonCity_GameCorner_PrizeRoom/text.inc\"\n\t.include \"data/maps/CeladonCity_Gym/text.inc\"\n\t.include \"data/maps/CeladonCity_Restaurant/text.inc\"\n\t.include \"data/maps/CeladonCity_House1/text.inc\"\n\t.include \"data/maps/CeladonCity_Hotel/text.inc\"\n\t.include \"data/maps/FuchsiaCity_SafariZone_Entrance/text.inc\"\n\t.include \"data/maps/FuchsiaCity_Mart/text.inc\"\n\t.include \"data/maps/FuchsiaCity_SafariZone_Office/text.inc\"\n\t.include \"data/maps/FuchsiaCity_Gym/text.inc\"\n\t.include \"data/maps/FuchsiaCity_House1/text.inc\"\n\t.include \"data/maps/FuchsiaCity_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/FuchsiaCity_WardensHouse/text.inc\"\n\t.include \"data/maps/FuchsiaCity_House2/text.inc\"\n\t.include \"data/maps/FuchsiaCity_House3/text.inc\"\n\t.include \"data/maps/CinnabarIsland_Gym/text.inc\"\n\t.include \"data/maps/CinnabarIsland_PokemonLab_Entrance/text.inc\"\n\t.include \"data/maps/CinnabarIsland_PokemonLab_Lounge/text.inc\"\n\t.include \"data/maps/CinnabarIsland_PokemonLab_ResearchRoom/text.inc\"\n\t.include \"data/maps/CinnabarIsland_PokemonLab_ExperimentRoom/text.inc\"\n\t.include \"data/maps/CinnabarIsland_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/CinnabarIsland_Mart/text.inc\"\n\t.include \"data/maps/IndigoPlateau_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/SaffronCity_CopycatsHouse_1F/text.inc\"\n\t.include \"data/maps/SaffronCity_CopycatsHouse_2F/text.inc\"\n\t.include \"data/maps/SaffronCity_Dojo/text.inc\"\n\t.include \"data/maps/SaffronCity_Gym/text.inc\"\n\t.include \"data/maps/SaffronCity_House/text.inc\"\n\t.include \"data/maps/SaffronCity_Mart/text.inc\"\n\t.include \"data/maps/SaffronCity_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/SaffronCity_MrPsychicsHouse/text.inc\"\n\t.include \"data/maps/SaffronCity_PokemonTrainerFanClub/text.inc\"\n\t.include \"data/maps/Route2_ViridianForest_SouthEntrance/text.inc\"\n\t.include \"data/maps/Route2_House/text.inc\"\n\t.include \"data/maps/Route2_EastBuilding/text.inc\"\n\t.include \"data/maps/Route2_ViridianForest_NorthEntrance/text.inc\"\n\t.include \"data/maps/Route4_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/Route5_PokemonDayCare/text.inc\"\n\t.include \"data/maps/Route5_SouthEntrance/text.inc\"\n\t.include \"data/maps/Route6_NorthEntrance/text.inc\"\n\t.include \"data/maps/Route7_EastEntrance/text.inc\"\n\t.include \"data/maps/Route8_WestEntrance/text.inc\"\n\t.include \"data/maps/Route10_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/Route11_EastEntrance_1F/text.inc\"\n\t.include \"data/maps/Route11_EastEntrance_2F/text.inc\"\n\t.include \"data/maps/Route12_NorthEntrance_1F/text.inc\"\n\t.include \"data/maps/Route12_NorthEntrance_2F/text.inc\"\n\t.include \"data/maps/Route12_FishingHouse/text.inc\"\n\t.include \"data/maps/Route15_WestEntrance_1F/text.inc\"\n\t.include \"data/maps/Route15_WestEntrance_2F/text.inc\"\n\t.include \"data/maps/Route16_House/text.inc\"\n\t.include \"data/maps/Route16_NorthEntrance_1F/text.inc\"\n\t.include \"data/maps/Route16_NorthEntrance_2F/text.inc\"\n\t.include \"data/maps/Route18_EastEntrance_1F/text.inc\"\n\t.include \"data/maps/Route18_EastEntrance_2F/text.inc\"\n\t.include \"data/maps/Route25_SeaCottage/text.inc\"\n\t.include \"data/maps/SevenIsland_House_Room1/text.inc\"\n\t.include \"data/maps/SevenIsland_Mart/text.inc\"\n\t.include \"data/maps/SevenIsland_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/OneIsland_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/OneIsland_House1/text.inc\"\n\t.include \"data/maps/OneIsland_House2/text.inc\"\n\t.include \"data/maps/TwoIsland_JoyfulGameCorner/text.inc\"\n\t.include \"data/maps/TwoIsland_House/text.inc\"\n\t.include \"data/maps/TwoIsland_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/ThreeIsland_House1/text.inc\"\n\t.include \"data/maps/ThreeIsland_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/ThreeIsland_Mart/text.inc\"\n\t.include \"data/maps/ThreeIsland_House2/text.inc\"\n\t.include \"data/maps/ThreeIsland_House3/text.inc\"\n\t.include \"data/maps/ThreeIsland_House4/text.inc\"\n\t.include \"data/maps/ThreeIsland_House5/text.inc\"\n\t.include \"data/maps/FourIsland_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/FourIsland_House1/text.inc\"\n\t.include \"data/maps/FourIsland_LoreleisHouse/text.inc\"\n\t.include \"data/maps/FourIsland_Mart/text.inc\"\n\t.include \"data/maps/FiveIsland_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/FiveIsland_House1/text.inc\"\n\t.include \"data/maps/FiveIsland_House2/text.inc\"\n\t.include \"data/maps/SixIsland_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/SixIsland_House/text.inc\"\n\t.include \"data/maps/SixIsland_Mart/text.inc\"\n\t.include \"data/maps/FiveIsland_ResortGorgeous_House/text.inc\"\n\t.include \"data/maps/TwoIsland_CapeBrink_House/text.inc\"\n\t.include \"data/maps/SixIsland_WaterPath_House1/text.inc\"\n\t.include \"data/maps/SixIsland_WaterPath_House2/text.inc\"\n\t.include \"data/maps/SevenIsland_SevaultCanyon_House/text.inc\"\n\n\t.include \"data/scripts/std_msgbox.inc\"\n\t.include \"data/scripts/trainer_battle.inc\"\n\t.include \"data/text/pc.inc\"\n\nText_PleaseComeAgain::\n\t.string \"Please come again!$\"\n\n\t.include \"data/text/obtain_item.inc\"\n\nText_WantWhichFloor::\n\t.string \"Which floor do you want?$\"\n\nText_BagItemCanBeRegistered::\n\t.string \"An item in the BAG can be\\n\"\n\t.string \"registered to SELECT for easy use.$\"\n\nText_PlayerBootedUpPC::\n\t.string \"{PLAYER} booted up the PC.$\"\n\ngText_PkmnFainted3::\n\t.string \"{STR_VAR_1} fainted…\\p\"\n\t.string \"$\"\n\nText_WelcomeWantToHealPkmn::\n\t.string \"Welcome to our POKéMON CENTER!\\p\"\n\t.string \"Would you like me to heal your\\n\"\n\t.string \"POKéMON back to perfect health?$\"\n\nText_TakeYourPkmnForFewSeconds::\n\t.string \"Okay, I'll take your POKéMON for a\\n\"\n\t.string \"few seconds.$\"\n\nText_WeHopeToSeeYouAgain::\n\t.string \"We hope to see you again!$\"\n\nText_RestoredPkmnToFullHealth::\n\t.string \"Thank you for waiting.\\n\"\n\t.string \"We've restored your POKéMON to\\l\"\n\t.string \"full health.$\"\n\n\t.include \"data/text/surf.inc\"\n\nText_WirelessClubUndergoingAdjustments::\n\t.string \"I'm terribly sorry.\\n\"\n\t.string \"The POKéMON WIRELESS CLUB is\\l\"\n\t.string \"undergoing adjustments now.$\"\n\nText_AppearsToBeUndergoingAdjustments::\n\t.string \"It appears to be undergoing\\n\"\n\t.string \"adjustments…$\"\n\nText_HandedOverItem::\n\t.string \"{PLAYER} handed over the\\n\"\n\t.string \"{STR_VAR_1}.$\"\n\nText_GiveNicknameToThisMon::\n\t.string \"Do you want to give a nickname to\\n\"\n\t.string \"this {STR_VAR_1}?$\"\n\n\t.include \"data/text/itemfinder.inc\"\n\t.include \"data/text/route23.inc\"\n\t.include \"data/text/aide.inc\"\n\t.include \"data/text/ingame_trade.inc\"\n\nText_CardKeyOpenedDoor::\n\t.string \"Bingo!\\n\"\n\t.string \"The CARD KEY opened the door!$\"\n\nText_ItNeedsCardKey::\n\t.string \"No!\\n\"\n\t.string \"It needs a CARD KEY!$\"\n\nText_AccessedProfOaksPC::\n\t.string \"Accessed PROF. OAK's PC…\\p\"\n\t.string \"Accessed the POKéDEX Rating\\n\"\n\t.string \"System…$\"\n\nText_HavePokedexRated::\n\t.string \"Would you like to have your\\n\"\n\t.string \"POKéDEX rated?$\"\n\nText_ClosedLinkToProfOaksPC::\n\t.string \"Closed link to PROF. OAK's PC.$\"\n\nText_VoiceRangOutDontRunAway::\n\t.string \"Someone's voice rang out,\\n\"\n\t.string \"“Don't run away!”$\"\n\nText_TheDoorIsOpen::\n\t.string \"The door is open…$\"\n\n\t.include \"data/text/pc_transfer.inc\"\n\t.include \"data/text/white_out.inc\"\n\t.include \"data/text/poke_mart.inc\"\n\nText_MonFlewAway::\n\t.string \"The {STR_VAR_1} flew away!$\"\n\nText_FoundTMHMContainsMove::\n\t.string \"{PLAYER} found a {STR_VAR_2}!\\n\"\n\t.string \"It contains {STR_VAR_1}.$\"\n\n\t.include \"data/text/seagallop.inc\"\n\n@ Call for legendary bird trio\nText_Gyaoo::\n\t.string \"Gyaoo!$\"\n\nText_MoveCanOnlyBeLearnedOnce::\n\t.string \"This move can only be learned\\n\"\n\t.string \"once for free. Is that okay?$\"\n\nEventScript_ResetAllMapFlags::\n\tsetflag FLAG_HIDE_OAK_IN_HIS_LAB\n\tsetflag FLAG_HIDE_OAK_IN_PALLET_TOWN\n\tsetflag FLAG_HIDE_BILL_HUMAN_SEA_COTTAGE\n\tsetflag FLAG_HIDE_PEWTER_CITY_RUNNING_SHOES_GUY\n\tsetflag FLAG_HIDE_POKEHOUSE_FUJI\n\tsetflag FLAG_HIDE_LIFT_KEY\n\tsetflag FLAG_HIDE_SILPH_SCOPE\n\tsetflag FLAG_HIDE_CERULEAN_RIVAL\n\tsetflag FLAG_HIDE_SS_ANNE_RIVAL\n\tsetflag FLAG_HIDE_VERMILION_CITY_OAKS_AIDE\n\tsetflag FLAG_HIDE_SAFFRON_CIVILIANS\n\tsetflag FLAG_HIDE_ROUTE_22_RIVAL\n\tsetflag FLAG_HIDE_OAK_IN_CHAMP_ROOM\n\tsetflag FLAG_HIDE_CREDITS_RIVAL\n\tsetflag FLAG_HIDE_CREDITS_OAK\n\tsetflag FLAG_HIDE_CINNABAR_BILL\n\tsetflag FLAG_HIDE_CINNABAR_SEAGALLOP\n\tsetflag FLAG_HIDE_CINNABAR_POKECENTER_BILL\n\tsetflag FLAG_HIDE_LORELEI_IN_HER_HOUSE\n\tsetflag FLAG_HIDE_SAFFRON_FAN_CLUB_BLACKBELT\n\tsetflag FLAG_HIDE_SAFFRON_FAN_CLUB_ROCKER\n\tsetflag FLAG_HIDE_SAFFRON_FAN_CLUB_WOMAN\n\tsetflag FLAG_HIDE_SAFFRON_FAN_CLUB_BEAUTY\n\tsetflag FLAG_HIDE_TWO_ISLAND_GAME_CORNER_LOSTELLE\n\tsetflag FLAG_HIDE_TWO_ISLAND_GAME_CORNER_BIKER\n\tsetflag FLAG_HIDE_TWO_ISLAND_WOMAN\n\tsetflag FLAG_HIDE_TWO_ISLAND_BEAUTY\n\tsetflag FLAG_HIDE_TWO_ISLAND_SUPER_NERD\n\tsetflag FLAG_HIDE_LOSTELLE_IN_HER_HOME\n\tsetflag FLAG_HIDE_THREE_ISLAND_LONE_BIKER\n\tsetflag FLAG_HIDE_FOUR_ISLAND_RIVAL\n\tsetflag FLAG_HIDE_DOTTED_HOLE_SCIENTIST\n\tsetflag FLAG_HIDE_RESORT_GORGEOUS_SELPHY\n\tsetflag FLAG_HIDE_RESORT_GORGEOUS_INSIDE_SELPHY\n\tsetflag FLAG_HIDE_SELPHYS_BUTLER\n\tsetflag FLAG_HIDE_DEOXYS\n\tsetflag FLAG_HIDE_LORELEI_HOUSE_MEOWTH_DOLL\n\tsetflag FLAG_HIDE_LORELEI_HOUSE_CHANSEY_DOLL\n\tsetflag FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_F_DOLL\n\tsetflag FLAG_HIDE_LORELEI_HOUSE_JIGGLYPUFF_DOLL\n\tsetflag FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_M_DOLL\n\tsetflag FLAG_HIDE_LORELEIS_HOUSE_FEAROW_DOLL\n\tsetflag FLAG_HIDE_LORELEIS_HOUSE_PIDGEOT_DOLL\n\tsetflag FLAG_HIDE_LORELEIS_HOUSE_LAPRAS_DOLL\n\tsetflag FLAG_HIDE_POSTGAME_GOSSIPERS\n\tsetflag FLAG_HIDE_FAME_CHECKER_ERIKA_JOURNALS\n\tsetflag FLAG_HIDE_FAME_CHECKER_KOGA_JOURNAL\n\tsetflag FLAG_HIDE_FAME_CHECKER_LT_SURGE_JOURNAL\n\tsetflag FLAG_HIDE_SAFFRON_CITY_POKECENTER_SABRINA_JOURNALS\n\tsetflag FLAG_HIDE_LAVENDER_OUTSIDE_FUJI\n\tsetflag FLAG_HIDE_BATTLE_TOWER_OPPONENT\n\tsetflag FLAG_HIDE_VICTORY_ROAD_2F_BOULDER\n\tsetflag FLAG_HIDE_SCOTT\n\tsetflag FLAG_HIDE_LATI\n\tsetflag FLAG_HIDE_AWARD_SCOTT_BATTLE_TOWER\n\tsetflag FLAG_HIDE_NATIONAL_DEX_AIDE\n\tsetflag FLAG_HIDE_MASTER_TRAINERS\n\tsetvar VAR_MASSAGE_COOLDOWN_STEP_COUNTER, 500\n\tend\n\n\t.include \"data/scripts/hall_of_fame.inc\"\n\t.include \"data/scripts/pkmn_center_nurse.inc\"\n\t.include \"data/scripts/obtain_item.inc\"\n\t.include \"data/scripts/pc.inc\"\n\nCommon_ShowEasyChatScreen::\n\tfadescreen FADE_TO_BLACK\n\tspecial ShowEasyChatScreen\n\tfadescreen FADE_FROM_BLACK\n\treturn\n\n\t.include \"data/scripts/surf.inc\"\n\t.include \"data/scripts/set_gym_trainers.inc\"\n\t.include \"data/scripts/bag_full.inc\"\n\nEventScript_OutOfCenterPartyHeal::\n\tfadescreen FADE_TO_BLACK\n\tplayfanfare MUS_RS_HEAL\n\twaitfanfare\n\tspecial HealPlayerParty\n\tfadescreen FADE_FROM_BLACK\n\treturn\n\nEventScript_WallTownMap::\n\tlockall\n\tmsgbox Text_ATownMap\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tfadescreen FADE_TO_BLACK\n\tspecial ShowTownMap\n\twaitstate\n\treleaseall\n\tend\n\n\t.include \"data/text/pokedex_rating.inc\"\n\t.include \"data/scripts/pokedex_rating.inc\"\n\t.include \"data/scripts/cave_of_origin.inc\"\n\nEventScript_ChangePokemonNickname::\n\tfadescreen FADE_TO_BLACK\n\tspecial ChangePokemonNickname\n\twaitstate\n\treturn\n\n\t.include \"data/scripts/pokemon_league.inc\"\n\t.include \"data/scripts/movement.inc\"\t\n\t.include \"data/scripts/flavor_text.inc\"\n\t.include \"data/scripts/questionnaire.inc\"\n\nEventScript_BagItemCanBeRegistered::\n\tmsgbox Text_BagItemCanBeRegistered, MSGBOX_SIGN\n\tend\n\nEventScript_Return::\n\treturn\n\nEventScript_SetResultTrue::\n\tsetvar VAR_RESULT, TRUE\n\treturn\n\nEventScript_SetResultFalse::\n\tsetvar VAR_RESULT, FALSE\n\treturn\n\nEventScript_SetExitingCyclingRoad::\n\tlockall\n\tclearflag FLAG_SYS_ON_CYCLING_ROAD\n\tsetvar VAR_MAP_SCENE_ROUTE16, 0\n\treleaseall\n\tend\n\nEventScript_SetEnteringCyclingRoad::\n\tlockall\n\tsetvar VAR_MAP_SCENE_ROUTE16, 1\n\treleaseall\n\tend\n\n\t.include \"data/scripts/route23.inc\"\n\nEventScript_GetElevatorFloor::\n\tspecial GetElevatorFloor\n\treturn\n\n\t.include \"data/scripts/aide.inc\"\n\nEventScript_CancelMessageBox::\n\tspecial DoPicboxCancel\n\trelease\n\tend\n\nEventScript_ReleaseEnd::\n\trelease\n\tend\n\n\t.include \"data/scripts/pokemon_mansion.inc\"\n\t.include \"data/scripts/silphco_doors.inc\"\n\t.include \"data/scripts/pc_transfer.inc\"\n\nEventScript_GetInGameTradeSpeciesInfo::\n\tcopyvar VAR_0x8004, VAR_0x8008\n\tspecialvar VAR_RESULT, GetInGameTradeSpeciesInfo\n\tcopyvar VAR_0x8009, VAR_RESULT\n\treturn\n\nEventScript_ChooseMonForInGameTrade::\n\tspecial ChoosePartyMon\n\twaitstate\n\tlock\n\tfaceplayer\n\tcopyvar VAR_0x800A, VAR_0x8004\n\treturn\n\nEventScript_GetInGameTradeSpecies::\n\tcopyvar VAR_0x8005, VAR_0x800A\n\tspecialvar VAR_RESULT, GetTradeSpecies\n\tcopyvar VAR_0x800B, VAR_RESULT\n\treturn\n\nEventScript_DoInGameTrade::\n\tcopyvar VAR_0x8004, VAR_0x8008\n\tcopyvar VAR_0x8005, VAR_0x800A\n\tspecial CreateInGameTradePokemon\n\tspecial DoInGameTradeScene\n\twaitstate\n\tlock\n\tfaceplayer\n\treturn\n\nEventScript_VsSeekerChargingDone::\n\tspecial VsSeekerFreezeObjectsAfterChargeComplete\n\twaitstate\n\tspecial VsSeekerResetObjectMovementAfterChargeComplete\n\treleaseall\n\tend\n\nCommon_EventScript_UnionRoomAttendant::\n\tcall CableClub_EventScript_UnionRoomAttendant\n\tend\n\nCommon_EventScript_WirelessClubAttendant::\n\tcall CableClub_EventScript_WirelessClubAttendant\n\tend\n\nCommon_EventScript_DirectCornerAttendant::\n\tcall CableClub_EventScript_DirectCornerAttendant\n\tend\n\nVermilionCity_PokemonCenter_1F_EventScript_VSSeekerWoman::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_VS_SEEKER, VermilionCity_PokemonCenter_1F_EventScript_ExplainVSSeeker\n\tmsgbox VermilionCity_PokemonCenter_1F_Text_UrgeToBattleSomeoneAgain\n\tsetflag FLAG_GOT_VS_SEEKER\n\tgiveitem ITEM_VS_SEEKER\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_BagIsFull\n\tmsgbox VermilionCity_PokemonCenter_1F_Text_UseDeviceForRematches\n\trelease\n\tend\n\nVermilionCity_PokemonCenter_1F_EventScript_ExplainVSSeeker::\n\tmsgbox VermilionCity_PokemonCenter_1F_Text_ExplainVSSeeker\n\trelease\n\tend\n\n\t.include \"data/scripts/itemfinder.inc\"\n\t.include \"data/scripts/white_out.inc\"\n\nStd_PutItemAway::\n\tbufferitemnameplural STR_VAR_2, VAR_0x8000, VAR_0x8001\n\tcheckitemtype VAR_0x8000\n\tcall EventScript_BufferPutAwayPocketName\n\tmsgbox Text_PutItemAway\n\treturn\n\nEventScript_BufferPutAwayPocketName::\n\tswitch VAR_RESULT\n\tcase POCKET_ITEMS,       EventScript_BufferPutAwayPocketItems\n\tcase POCKET_KEY_ITEMS,   EventScript_BufferPutAwayPocketKeyItems\n\tcase POCKET_POKE_BALLS,  EventScript_BufferPutAwayPocketPokeBalls\n\tcase POCKET_TM_CASE,     EventScript_BufferPutAwayPocketTMCase\n\tcase POCKET_BERRY_POUCH, EventScript_BufferPutAwayPocketBerryPouch\n\tcase POCKET_MEDICINE,\t EventScript_BufferPutAwayPocketMedicine\n\tcase POCKET_HELD_ITEMS,  EventScript_BufferPutAwayPocketHeldItems\n\tend\n\nEventScript_BufferPutAwayPocketItems::\n\tbufferstdstring STR_VAR_3, STDSTRING_ITEMS_POCKET\n\treturn\n\nEventScript_BufferPutAwayPocketMedicine::\n\tbufferstdstring STR_VAR_3, STDSTRING_MEDICINE_POCKET\n\treturn\n\nEventScript_BufferPutAwayPocketKeyItems::\n\tbufferstdstring STR_VAR_3, STDSTRING_KEY_ITEMS_POCKET\n\treturn\n\nEventScript_BufferPutAwayPocketHeldItems::\n\tbufferstdstring STR_VAR_3, STDSTRING_HELD_ITEMS_POCKET\n\treturn\n\nEventScript_BufferPutAwayPocketPokeBalls::\n\tbufferstdstring STR_VAR_3, STDSTRING_POKEBALLS_POCKET\n\treturn\n\nEventScript_BufferPutAwayPocketTMCase::\n\tbufferstdstring STR_VAR_3, STDSTRING_TM_CASE\n\treturn\n\nEventScript_BufferPutAwayPocketBerryPouch::\n\tbufferstdstring STR_VAR_3, STDSTRING_BERRY_POUCH\n\treturn\n\n\t.include \"data/scripts/seagallop.inc\"\n\t.include \"data/scripts/static_pokemon.inc\"\n\nEventScript_TryDarkenRuins::\n\tgoto_if_set FLAG_SYS_UNLOCKED_TANOBY_RUINS, EventScript_Return\n\tsetweather WEATHER_SHADE\n\tdoweather\n\treturn\n\nEventScript_BrailleCursorWaitButton::\n\tspecial BrailleCursorToggle\n\twaitbuttonpress\n\tplayse SE_SELECT\n\tsetvar VAR_0x8006, 1\n\tspecial BrailleCursorToggle\n\treturn\n\nEventScript_NoMoreRoomForPokemon::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox Text_NoMoreRoomForPokemon\n\trelease\n\tend\n\n\t.include \"data/text/braille.inc\"\n\t.include \"data/scripts/trainers.inc\"\n\t.include \"data/scripts/master_trainers.inc\"\n\t.include \"data/scripts/fame_checker.inc\"\n\t.include \"data/text/fame_checker.inc\"\n\t.include \"data/text/sign_lady.inc\"\n\t.include \"data/text/trainer_card.inc\"\n\t.include \"data/scripts/trainer_card.inc\"\n\t.include \"data/text/help_system.inc\"\n\t.include \"data/scripts/cable_club.inc\"\n\t.include \"data/scripts/field_moves.inc\"\n\t.include \"data/scripts/item_ball_scripts.inc\"\n\t.include \"data/scripts/mystery_event_club.inc\"\n\t.include \"data/scripts/day_care.inc\"\n\t.include \"data/text/day_care.inc\"\n\t.include \"data/scripts/flash.inc\"\n\t.include \"data/scripts/repel.inc\"\n\t.include \"data/scripts/safari_zone.inc\"\n\t.include \"data/text/safari_zone.inc\"\n\t.include \"data/text/flavor_text.inc\"\n\t.include \"data/scripts/hole.inc\"\n\t.include \"data/text/trainers.inc\"\n\t.include \"data/scripts/move_tutors.inc\"\n\t.include \"data/scripts/trainer_tower.inc\"\n\t.include \"data/text/save.inc\"\n\t.include \"data/text/new_game_intro.inc\"\n\t.include \"data/text/pokedude.inc\"\n\n\t.include \"data/maps/FarawayIsland_Exterior/scripts.inc\"\n\t.include \"data/maps/FarawayIsland_Exterior/text.inc\"\n\t.include \"data/maps/FarawayIsland_Interior/scripts.inc\"\n\t.include \"data/maps/FarawayIsland_Interior/text.inc\"\n\t.include \"data/scripts/fuji_event.inc\"\n\t.include \"data/scripts/national_dex_aide.inc\"\n\t.include \"data/maps/OneIsland_KindleRoad_GlassWorkshop/scripts.inc\"\n\t.include \"data/maps/Route20_Underwater/scripts.inc\"\n\t.include \"data/maps/Route20_Underwater/text.inc\"\n\t.include \"data/maps/BattleFrontier_OutsideWest/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_OutsideWest/text.inc\"\n\t.include \"data/maps/BattleFrontier_OutsideEast/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_OutsideEast/text.inc\"\n\t.include \"data/maps/RS_BattleTower/scripts.inc\"\n\t.include \"data/maps/RS_BattleTower/text.inc\"\n\t.include \"data/maps/RS_BattleTower_Lobby/scripts.inc\"\n\t.include \"data/maps/RS_BattleTower_Lobby/text.inc\"\n\t.include \"data/maps/RS_BattleTower_Elevator/scripts.inc\"\n\t.include \"data/maps/RS_BattleTower_Elevator/text.inc\"\n\t.include \"data/maps/RS_BattleTower_Corridor/scripts.inc\"\n\t.include \"data/maps/RS_BattleTower_Corridor/text.inc\"\n\t.include \"data/maps/RS_BattleTower_BattleRoom/scripts.inc\"\n\t.include \"data/maps/RS_BattleTower_BattleRoom/text.inc\"\n\t.include \"data/maps/SafariZone_NorthWest/scripts.inc\"\n\t.include \"data/maps/SafariZone_NorthWest/text.inc\"\n\t.include \"data/maps/SafariZone_NorthEast/scripts.inc\"\n\t.include \"data/maps/SafariZone_NorthEast/text.inc\"\n\t.include \"data/maps/SafariZone_NorthWest_RestHouse/scripts.inc\"\n\t.include \"data/maps/SafariZone_NorthWest_RestHouse/text.inc\"\n\t.include \"data/maps/ThreeIsland_BondBridge_Underwater/scripts.inc\"\n\t.include \"data/maps/ThreeIsland_BondBridge_Underwater/text.inc\"\n\t.include \"data/maps/ArtisanCave_B1F/scripts.inc\"\n\t.include \"data/maps/ArtisanCave_B1F/text.inc\"\n\t.include \"data/maps/ArtisanCave_1F/scripts.inc\"\n\t.include \"data/maps/ArtisanCave_1F/text.inc\"\n\t.include \"data/maps/SouthernIsland_Exterior/scripts.inc\"\n\t.include \"data/maps/SouthernIsland_Exterior/text.inc\"\n\t.include \"data/maps/SouthernIsland_Interior/scripts.inc\"\n\t.include \"data/maps/SouthernIsland_Interior/text.inc\"\n\t.include \"data/maps/CeruleanCave_1F_Blue/scripts.inc\"\n\t.include \"data/maps/CeruleanCave_1F_Blue/text.inc\"\n\t.include \"data/maps/CeruleanCave_2F_Blue/scripts.inc\"\n\t.include \"data/maps/CeruleanCave_2F_Blue/text.inc\"\n\t.include \"data/maps/CeruleanCave_B1F_Blue/scripts.inc\"\n\t.include \"data/maps/CeruleanCave_B1F_Blue/text.inc\"\n\t.include \"data/maps/CeruleanCave_1F_Yellow/scripts.inc\"\n\t.include \"data/maps/CeruleanCave_1F_Yellow/text.inc\"\n\t.include \"data/maps/CeruleanCave_2F_Yellow/scripts.inc\"\n\t.include \"data/maps/CeruleanCave_2F_Yellow/text.inc\"\n\t.include \"data/maps/CeruleanCave_B1F_Yellow/scripts.inc\"\n\t.include \"data/maps/CeruleanCave_B1F_Yellow/text.inc\"\n\t.include \"data/maps/FourIsland_Base/scripts.inc\"\n\t.include \"data/maps/FourIsland_Base/text.inc\"\n\t.include \"data/maps/FourIsland_Base_CableCarStation/scripts.inc\"\n\t.include \"data/maps/FourIsland_Base_CableCarStation/text.inc\"\n\t.include \"data/maps/FourIsland_CableCarStation/scripts.inc\"\n\t.include \"data/maps/FourIsland_CableCarStation/text.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge2/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge2/text.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge1/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge1/text.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge3/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge3/text.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge4/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge4/text.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge5/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge5/text.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge6/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge6/text.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge7/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge7/text.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge8/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_Lounge8/text.inc\"\n\t.include \"data/maps/BattleFrontier_ReceptionGate/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_ReceptionGate/text.inc\"\n\t.include \"data/maps/BattleFrontier_ExchangeServiceCorner/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_ExchangeServiceCorner/text.inc\"\n\t.include \"data/maps/BattleFrontier_ScottsHouse/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_ScottsHouse/text.inc\"\n\t.include \"data/maps/BattleFrontier_PokemonCenter_1F/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_PokemonCenter_1F/text.inc\"\n\t.include \"data/maps/BattleFrontier_PokemonCenter_2F/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_PokemonCenter_2F/text.inc\"\n\t.include \"data/maps/BattleFrontier_Mart/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_Mart/text.inc\"\n\n\t.include \"data/maps/BattleFrontier_RankingHall/scripts.inc\"\n\t.include \"data/maps/BattleFrontier_RankingHall/text.inc\"\n"
  },
  {
    "path": "data/field_effect_scripts.s",
    "content": "\t.include \"asm/macros/field_effect_script.inc\"\n\t.section script_data, \"aw\", %progbits\n\t.align 2\ngFieldEffectScriptPointers::\n\t.4byte gFldEffScript_ExclamationMarkIcon     @ FLDEFF_EXCLAMATION_MARK_ICON\n\t.4byte gFldEffScript_UseCutOnGrass           @ FLDEFF_USE_CUT_ON_GRASS\n\t.4byte gFldEffScript_UseCutOnTree            @ FLDEFF_USE_CUT_ON_TREE\n\t.4byte gFldEffScript_Shadow                  @ FLDEFF_SHADOW\n\t.4byte gFldEffScript_TallGrass               @ FLDEFF_TALL_GRASS\n\t.4byte gFldEffScript_Ripple                  @ FLDEFF_RIPPLE\n\t.4byte gFldEffScript_FieldMoveShowMon        @ FLDEFF_FIELD_MOVE_SHOW_MON\n\t.4byte gFldEffScript_Ash                     @ FLDEFF_ASH\n\t.4byte gFldEffScript_SurfBlob                @ FLDEFF_SURF_BLOB\n\t.4byte gFldEffScript_UseSurf                 @ FLDEFF_USE_SURF\n\t.4byte gFldEffScript_Dust                    @ FLDEFF_DUST\n\t.4byte gFldEffScript_UseSecretPowerCave      @ FLDEFF_USE_SECRET_POWER_CAVE\n\t.4byte gFldEffScript_JumpTallGrass           @ FLDEFF_JUMP_TALL_GRASS\n\t.4byte gFldEffScript_SandFootprints          @ FLDEFF_SAND_FOOTPRINTS\n\t.4byte gFldEffScript_JumpBigSplash           @ FLDEFF_JUMP_BIG_SPLASH\n\t.4byte gFldEffScript_Splash                  @ FLDEFF_SPLASH\n\t.4byte gFldEffScript_JumpSmallSplash         @ FLDEFF_JUMP_SMALL_SPLASH\n\t.4byte gFldEffScript_LongGrass               @ FLDEFF_LONG_GRASS\n\t.4byte gFldEffScript_JumpLongGrass           @ FLDEFF_JUMP_LONG_GRASS\n\t.4byte gFldEffScript_UnusedGrass             @ FLDEFF_UNUSED_GRASS\n\t.4byte gFldEffScript_UnusedGrass2            @ FLDEFF_UNUSED_GRASS_2\n\t.4byte gFldEffScript_UnusedSand              @ FLDEFF_UNUSED_SAND\n\t.4byte gFldEffScript_UnusedWaterSurfacing    @ FLDEFF_UNUSED_WATER_SURFACING\n\t.4byte gFldEffScript_BerryTreeGrowthSparkle  @ FLDEFF_BERRY_TREE_GROWTH_SPARKLE\n\t.4byte gFldEffScript_DeepSandFootprints      @ FLDEFF_DEEP_SAND_FOOTPRINTS\n\t.4byte gFldEffScript_PokecenterHeal          @ FLDEFF_POKECENTER_HEAL\n\t.4byte gFldEffScript_UseSecretPowerTree      @ FLDEFF_USE_SECRET_POWER_TREE\n\t.4byte gFldEffScript_UseSecretPowerShrub     @ FLDEFF_USE_SECRET_POWER_SHRUB\n\t.4byte gFldEffScript_TreeDisguise            @ FLDEFF_TREE_DISGUISE\n\t.4byte gFldEffScript_MountainDisguise        @ FLDEFF_MOUNTAIN_DISGUISE\n\t.4byte gFldEffScript_NpcflyOut               @ FLDEFF_NPCFLY_OUT\n\t.4byte gFldEffScript_FlyOut                  @ FLDEFF_FLY_OUT\n\t.4byte gFldEffScript_FlyIn                   @ FLDEFF_FLY_IN\n\t.4byte gFldEffScript_QuestionMarkIcon        @ FLDEFF_QUESTION_MARK_ICON\n\t.4byte gFldEffScript_FeetInFlowingWater      @ FLDEFF_FEET_IN_FLOWING_WATER\n\t.4byte gFldEffScript_BikeTireTracks          @ FLDEFF_BIKE_TIRE_TRACKS\n\t.4byte gFldEffScript_SandDisguise            @ FLDEFF_SAND_DISGUISE\n\t.4byte gFldEffScript_UseRockSmash            @ FLDEFF_USE_ROCK_SMASH\n\t.4byte gFldEffScript_UseDig                  @ FLDEFF_USE_DIG\n\t.4byte gFldEffScript_SandPile                @ FLDEFF_SAND_PILE\n\t.4byte gFldEffScript_UseStrength             @ FLDEFF_USE_STRENGTH\n\t.4byte gFldEffScript_ShortGrass              @ FLDEFF_SHORT_GRASS\n\t.4byte gFldEffScript_HotSpringsWater         @ FLDEFF_HOT_SPRINGS_WATER\n\t.4byte gFldEffScript_UseWaterfall            @ FLDEFF_USE_WATERFALL\n\t.4byte gFldEffScript_UseDive                 @ FLDEFF_USE_DIVE\n\t.4byte gFldEffScript_Pokeball                @ FLDEFF_POKEBALL\n\t.4byte gFldEffScript_XIcon                   @ FLDEFF_X_ICON\n\t.4byte gFldEffScript_Nop47                   @ FLDEFF_NOP_47\n\t.4byte gFldEffScript_Nop48                   @ FLDEFF_NOP_48\n\t.4byte gFldEffScript_PopOutOfAsh             @ FLDEFF_POP_OUT_OF_ASH\n\t.4byte gFldEffScript_LavaridgeGymWarp        @ FLDEFF_LAVARIDGE_GYM_WARP\n\t.4byte gFldEffScript_SweetScent              @ FLDEFF_SWEET_SCENT\n\t.4byte gFldEffScript_SandPillar              @ FLDEFF_SAND_PILLAR\n\t.4byte gFldEffScript_Bubbles                 @ FLDEFF_BUBBLES\n\t.4byte gFldEffScript_Sparkle                 @ FLDEFF_SPARKLE\n\t.4byte gFldEffScript_SecretPowerCave         @ FLDEFF_SECRET_POWER_CAVE\n\t.4byte gFldEffScript_SecretPowerTree         @ FLDEFF_SECRET_POWER_TREE\n\t.4byte gFldEffScript_SecretPowerShrub        @ FLDEFF_SECRET_POWER_SHRUB\n\t.4byte gFldEffScript_CutGrass                @ FLDEFF_CUT_GRASS\n\t.4byte gFldEffScript_FieldMoveShowMonInit    @ FLDEFF_FIELD_MOVE_SHOW_MON_INIT\n\t.4byte gFldEffScript_UseFlyAncientTomb       @ FLDEFF_USE_FLY_ANCIENT_TOMB\n\t.4byte gFldEffScript_PcturnOn                @ FLDEFF_PCTURN_ON\n\t.4byte gFldEffScript_HallOfFameRecord        @ FLDEFF_HALL_OF_FAME_RECORD\n\t.4byte gFldEffScript_UseTeleport             @ FLDEFF_USE_TELEPORT\n\t.4byte gFldEffScript_SmileyFaceIcon          @ FLDEFF_SMILEY_FACE_ICON\n\t.4byte gFldEffScript_UseVsSeeker             @ FLDEFF_USE_VS_SEEKER\n\t.4byte gFldEffScript_DoubleExclMarkIcon      @ FLDEFF_DOUBLE_EXCL_MARK_ICON\n\t.4byte gFldEffScript_MoveDeoxysRock          @ FLDEFF_MOVE_DEOXYS_ROCK\n\t.4byte gFldEffScript_DestroyDeoxysRock       @ FLDEFF_DESTROY_DEOXYS_ROCK\n\t.4byte gFldEffScript_PhotoFlash              @ FLDEFF_PHOTO_FLASH\n\ngFldEffScript_ExclamationMarkIcon::\n\tcallnative FldEff_ExclamationMarkIcon1\n\tend \n\ngFldEffScript_UseCutOnGrass::\n\tcallnative FldEff_UseCutOnGrass\n\tend \n\ngFldEffScript_UseCutOnTree::\n\tcallnative FldEff_UseCutOnTree\n\tend \n\ngFldEffScript_Shadow::\n\tcallnative FldEff_Shadow\n\tend \n\ngFldEffScript_TallGrass::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_TallGrass\n\tend \n\ngFldEffScript_Ripple::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_Ripple\n\tend \n\ngFldEffScript_FieldMoveShowMon::\n\tcallnative FldEff_FieldMoveShowMon\n\tend \n\ngFldEffScript_Ash::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_Ash\n\tend \n\ngFldEffScript_SurfBlob::\n\tcallnative FldEff_SurfBlob\n\tend \n\ngFldEffScript_UseSurf::\n\tcallnative FldEff_UseSurf\n\tend \n\ngFldEffScript_Dust::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_Dust\n\tend \n\ngFldEffScript_UseSecretPowerCave::\n\tend \n\ngFldEffScript_JumpTallGrass::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_JumpTallGrass\n\tend \n\ngFldEffScript_SandFootprints::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_SandFootprints\n\tend \n\ngFldEffScript_JumpBigSplash::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_JumpBigSplash\n\tend \n\ngFldEffScript_Splash::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_Splash\n\tend \n\ngFldEffScript_JumpSmallSplash::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_JumpSmallSplash\n\tend \n\ngFldEffScript_LongGrass::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_LongGrass\n\tend \n\ngFldEffScript_JumpLongGrass::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_JumpLongGrass\n\tend \n\ngFldEffScript_UnusedGrass::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_UnusedGrass\n\tend \n\ngFldEffScript_UnusedGrass2::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_UnusedGrass2\n\tend \n\ngFldEffScript_UnusedSand::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_UnusedSand\n\tend \n\ngFldEffScript_UnusedWaterSurfacing::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_UnusedWaterSurfacing\n\tend \n\ngFldEffScript_BerryTreeGrowthSparkle::\n\tcallnative FldEff_BerryTreeGrowthSparkle\n\tend \n\ngFldEffScript_DeepSandFootprints::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_DeepSandFootprints\n\tend \n\ngFldEffScript_PokecenterHeal::\n\tloadfadedpal gSpritePalette_PokeballGlow \n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_PokecenterHeal\n\tend \n\ngFldEffScript_UseSecretPowerTree::\n\tend \n\ngFldEffScript_UseSecretPowerShrub::\n\tend \n\ngFldEffScript_TreeDisguise::\n\tcallnative ShowTreeDisguiseFieldEffect\n\tend \n\ngFldEffScript_MountainDisguise::\n\tcallnative ShowMountainDisguiseFieldEffect\n\tend \n\ngFldEffScript_NpcflyOut::\n\tcallnative FldEff_NpcFlyOut\n\tend \n\ngFldEffScript_FlyOut::\n\tcallnative FldEff_FlyOut \n\tend \n\ngFldEffScript_FlyIn::\n\tcallnative FldEff_FlyIn\n\tend \n\ngFldEffScript_QuestionMarkIcon::\n\tcallnative FldEff_QuestionMarkIcon\n\tend \n\ngFldEffScript_FeetInFlowingWater::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_FeetInFlowingWater\n\tend \n\ngFldEffScript_BikeTireTracks::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_BikeTireTracks\n\tend \n\ngFldEffScript_SandDisguise::\n\tcallnative ShowSandDisguiseFieldEffect\n\tend \n\ngFldEffScript_UseRockSmash::\n\tcallnative FldEff_UseRockSmash\n\tend \n\ngFldEffScript_UseStrength::\n\tcallnative FldEff_UseStrength\n\tend \n\ngFldEffScript_UseDig::\n\tcallnative FldEff_UseDig\n\tend \n\ngFldEffScript_SandPile::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_SandPile\n\tend \n\ngFldEffScript_ShortGrass::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_ShortGrass\n\tend \n\ngFldEffScript_HotSpringsWater::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_HotSpringsWater\n\tend \n\ngFldEffScript_UseWaterfall::\n\tcallnative FldEff_UseWaterfall\n\tend \n\ngFldEffScript_UseDive::\n\tcallnative FldEff_UseDive\n\tend \n\ngFldEffScript_Pokeball::\n\tloadpal gSpritePalette_Pokeball\n\tcallnative FldEff_PokeballTrail\n\tend \n\ngFldEffScript_XIcon::\n\tcallnative FldEff_XIcon\n\tend \n\ngFldEffScript_Nop47::\n\tend \n\ngFldEffScript_Nop48::\n\tend \n\ngFldEffScript_PopOutOfAsh::\n\tloadfadedpal_callnative gSpritePalette_Ash, FldEff_PopOutOfAsh\n\tend \n\ngFldEffScript_LavaridgeGymWarp::\n\tloadfadedpal_callnative gSpritePalette_Ash, FldEff_LavaridgeGymWarp\n\tend \n\ngFldEffScript_SweetScent::\n\tcallnative FldEff_SweetScent\n\tend \n\ngFldEffScript_SandPillar::\n\tend \n\ngFldEffScript_Bubbles::\n\tloadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_Bubbles\n\tend \n\ngFldEffScript_Sparkle::\n\tloadfadedpal_callnative gSpritePalette_SmallSparkle, FldEff_Sparkle\n\tend \n\ngFldEffScript_SecretPowerCave::\n\tend \n\ngFldEffScript_SecretPowerTree::\n\tend \n\ngFldEffScript_SecretPowerShrub::\n\tend \n\ngFldEffScript_CutGrass::\n\tloadfadedpal_callnative gFldEffPalette_CutGrass, FldEff_CutGrass\n\tend \n\ngFldEffScript_FieldMoveShowMonInit::\n\tcallnative FldEff_FieldMoveShowMonInit\n\tend \n\ngFldEffScript_UseFlyAncientTomb::\n\tend \n\ngFldEffScript_PcturnOn::\n\tend \n\ngFldEffScript_HallOfFameRecord::\n\tloadfadedpal gSpritePalette_PokeballGlow \n\tloadfadedpal_callnative gSpritePalette_HofMonitor, FldEff_HallOfFameRecord\n\tend \n\ngFldEffScript_UseTeleport::\n\tcallnative FldEff_UseTeleport\n\tend \n\ngFldEffScript_SmileyFaceIcon::\n\tcallnative FldEff_SmileyFaceIcon\n\tend \n\ngFldEffScript_UseVsSeeker::\n\tcallnative FldEff_UseVsSeeker\n\tend \n\ngFldEffScript_DoubleExclMarkIcon::\n\tcallnative FldEff_DoubleExclMarkIcon\n\tend \n\ngFldEffScript_MoveDeoxysRock::\n\tcallnative FldEff_MoveDeoxysRock\n\tend \n\ngFldEffScript_DestroyDeoxysRock::\n\tcallnative FldEff_DestroyDeoxysRock\n\tend \n\ngFldEffScript_PhotoFlash::\n\tcallnative FldEff_PhotoFlash\n\tend \n"
  },
  {
    "path": "data/layouts/.gitignore",
    "content": "layouts.inc\nlayouts_table.inc\n"
  },
  {
    "path": "data/layouts/layouts.json",
    "content": "{\n  \"layouts_table_label\": \"gMapLayouts\",\n  \"layouts\": [\n    {\n      \"id\": \"LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_1F\",\n      \"name\": \"PalletTown_PlayersHouse_1F_Layout\",\n      \"width\": 13,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding1\",\n      \"border_filepath\": \"data/layouts/PalletTown_PlayersHouse_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PalletTown_PlayersHouse_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_2F\",\n      \"name\": \"PalletTown_PlayersHouse_2F_Layout\",\n      \"width\": 12,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding1\",\n      \"border_filepath\": \"data/layouts/PalletTown_PlayersHouse_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PalletTown_PlayersHouse_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PALLET_TOWN_RIVALS_HOUSE\",\n      \"name\": \"PalletTown_RivalsHouse_Layout\",\n      \"width\": 13,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/PalletTown_RivalsHouse/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PalletTown_RivalsHouse/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_LITTLEROOT_TOWN_MAYS_HOUSE_2F\",\n      \"name\": \"LittlerootTown_MaysHouse_2F_Layout\",\n      \"width\": 9,\n      \"height\": 8,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding1\",\n      \"border_filepath\": \"data/layouts/LittlerootTown_MaysHouse_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/LittlerootTown_MaysHouse_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PALLET_TOWN_PROFESSOR_OAKS_LAB\",\n      \"name\": \"PalletTown_ProfessorOaksLab_Layout\",\n      \"width\": 13,\n      \"height\": 14,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Lab\",\n      \"border_filepath\": \"data/layouts/PalletTown_ProfessorOaksLab/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PalletTown_ProfessorOaksLab/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_HOUSE1\",\n      \"name\": \"House1_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding1\",\n      \"border_filepath\": \"data/layouts/House1/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/House1/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_HOUSE2\",\n      \"name\": \"House2_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/House2/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/House2/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_CENTER_1F\",\n      \"name\": \"PokemonCenter_1F_Layout\",\n      \"width\": 15,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonCenter\",\n      \"border_filepath\": \"data/layouts/PokemonCenter_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonCenter_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_CENTER_2F\",\n      \"name\": \"PokemonCenter_2F_Layout\",\n      \"width\": 15,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonCenter\",\n      \"border_filepath\": \"data/layouts/PokemonCenter_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonCenter_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MART\",\n      \"name\": \"Mart_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Mart\",\n      \"border_filepath\": \"data/layouts/Mart/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Mart/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_HOUSE3\",\n      \"name\": \"House3_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/House3/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/House3/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CITY_GYM\",\n      \"name\": \"CeruleanCity_Gym_Layout\",\n      \"width\": 17,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_CeruleanGym\",\n      \"border_filepath\": \"data/layouts/CeruleanCity_Gym/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCity_Gym/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_HOUSE4\",\n      \"name\": \"House4_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/House4/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/House4/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_LAVARIDGE_TOWN_HERB_SHOP\",\n      \"name\": \"LavaridgeTown_HerbShop_Layout\",\n      \"width\": 11,\n      \"height\": 8,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Mart\",\n      \"border_filepath\": \"data/layouts/LavaridgeTown_HerbShop/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/LavaridgeTown_HerbShop/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_GYM\",\n      \"name\": \"CeladonCity_Gym_Layout\",\n      \"width\": 13,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_CeladonGym\",\n      \"border_filepath\": \"data/layouts/CeladonCity_Gym/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_Gym/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RS_POKEMON_CENTER_1F\",\n      \"name\": \"RS_PokemonCenter_1F_Layout\",\n      \"width\": 14,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonCenter\",\n      \"border_filepath\": \"data/layouts/RS_PokemonCenter_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RS_PokemonCenter_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_RESORT_GORGEOUS_HOUSE\",\n      \"name\": \"FiveIsland_ResortGorgeous_House_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Museum\",\n      \"border_filepath\": \"data/layouts/FiveIsland_ResortGorgeous_House/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_ResortGorgeous_House/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PACIFIDLOG_TOWN_HOUSE1\",\n      \"name\": \"PacifidlogTown_House1_Layout\",\n      \"width\": 10,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/PacifidlogTown_House1/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PacifidlogTown_House1/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PACIFIDLOG_TOWN_HOUSE2\",\n      \"name\": \"PacifidlogTown_House2_Layout\",\n      \"width\": 10,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/PacifidlogTown_House2/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PacifidlogTown_House2/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FUCHSIA_CITY_GYM\",\n      \"name\": \"FuchsiaCity_Gym_Layout\",\n      \"width\": 15,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_FuchsiaGym\",\n      \"border_filepath\": \"data/layouts/FuchsiaCity_Gym/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FuchsiaCity_Gym/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_HOUSE5\",\n      \"name\": \"House5_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding1\",\n      \"border_filepath\": \"data/layouts/House5/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/House5/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_UNUSED1\",\n      \"name\": \"Unused1_Layout\",\n      \"width\": 12,\n      \"height\": 12,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"NULL\",\n      \"secondary_tileset\": \"gTileset_Dummy1\",\n      \"border_filepath\": \"data/layouts/Unused1/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Unused1/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_VERMILION_CITY_GYM\",\n      \"name\": \"VermilionCity_Gym_Layout\",\n      \"width\": 11,\n      \"height\": 21,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_VermilionGym\",\n      \"border_filepath\": \"data/layouts/VermilionCity_Gym/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/VermilionCity_Gym/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CITY_BIKE_SHOP\",\n      \"name\": \"CeruleanCity_BikeShop_Layout\",\n      \"width\": 11,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_BikeShop\",\n      \"border_filepath\": \"data/layouts/CeruleanCity_BikeShop/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCity_BikeShop/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_GAME_CORNER\",\n      \"name\": \"CeladonCity_GameCorner_Layout\",\n      \"width\": 18,\n      \"height\": 15,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GameCorner\",\n      \"border_filepath\": \"data/layouts/CeladonCity_GameCorner/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_GameCorner/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PEWTER_CITY_GYM\",\n      \"name\": \"PewterCity_Gym_Layout\",\n      \"width\": 13,\n      \"height\": 16,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PewterGym\",\n      \"border_filepath\": \"data/layouts/PewterCity_Gym/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PewterCity_Gym/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FOUR_ISLAND_LORELEIS_HOUSE\",\n      \"name\": \"FourIsland_LoreleisHouse_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SafariZoneBuilding\",\n      \"border_filepath\": \"data/layouts/FourIsland_LoreleisHouse/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FourIsland_LoreleisHouse/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_THREE_ISLAND_HOUSE1\",\n      \"name\": \"ThreeIsland_House1_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Lab\",\n      \"border_filepath\": \"data/layouts/ThreeIsland_House1/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ThreeIsland_House1/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RUSTBORO_CITY_CUTTERS_HOUSE\",\n      \"name\": \"RustboroCity_CuttersHouse_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/RustboroCity_CuttersHouse/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RustboroCity_CuttersHouse/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FORTREE_CITY_HOUSE1\",\n      \"name\": \"FortreeCity_House1_Layout\",\n      \"width\": 8,\n      \"height\": 6,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/FortreeCity_House1/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FortreeCity_House1/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFFRON_CITY_GYM\",\n      \"name\": \"SaffronCity_Gym_Layout\",\n      \"width\": 29,\n      \"height\": 25,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SaffronGym\",\n      \"border_filepath\": \"data/layouts/SaffronCity_Gym/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SaffronCity_Gym/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FORTREE_CITY_HOUSE2\",\n      \"name\": \"FortreeCity_House2_Layout\",\n      \"width\": 8,\n      \"height\": 6,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/FortreeCity_House2/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FortreeCity_House2/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CINNABAR_ISLAND_GYM\",\n      \"name\": \"CinnabarIsland_Gym_Layout\",\n      \"width\": 30,\n      \"height\": 25,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_CinnabarGym\",\n      \"border_filepath\": \"data/layouts/CinnabarIsland_Gym/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CinnabarIsland_Gym/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_VIRIDIAN_CITY_GYM\",\n      \"name\": \"ViridianCity_Gym_Layout\",\n      \"width\": 20,\n      \"height\": 24,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_ViridianGym\",\n      \"border_filepath\": \"data/layouts/ViridianCity_Gym/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ViridianCity_Gym/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RS_SAFARI_ZONE_ENTRANCE\",\n      \"name\": \"RS_SafariZone_Entrance_Layout\",\n      \"width\": 18,\n      \"height\": 14,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Mart\",\n      \"border_filepath\": \"data/layouts/RS_SafariZone_Entrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RS_SafariZone_Entrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_BATTLE_COLOSSEUM_2P\",\n      \"name\": \"BattleColosseum_2P_Layout\",\n      \"width\": 14,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_CableClub\",\n      \"border_filepath\": \"data/layouts/BattleColosseum_2P/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/BattleColosseum_2P/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRADE_CENTER\",\n      \"name\": \"TradeCenter_Layout\",\n      \"width\": 12,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_CableClub\",\n      \"border_filepath\": \"data/layouts/TradeCenter/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TradeCenter/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RECORD_CORNER\",\n      \"name\": \"RecordCorner_Layout\",\n      \"width\": 20,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_CableClub\",\n      \"border_filepath\": \"data/layouts/RecordCorner/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RecordCorner/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_BATTLE_COLOSSEUM_4P\",\n      \"name\": \"BattleColosseum_4P_Layout\",\n      \"width\": 14,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_CableClub\",\n      \"border_filepath\": \"data/layouts/BattleColosseum_4P/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/BattleColosseum_4P/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE\",\n      \"name\": \"FuchsiaCity_SafariZone_Entrance_Layout\",\n      \"width\": 9,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SafariZoneBuilding\",\n      \"border_filepath\": \"data/layouts/FuchsiaCity_SafariZone_Entrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FuchsiaCity_SafariZone_Entrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RS_SAFARI_ZONE_NORTHEAST\",\n      \"name\": \"RS_SafariZone_Northeast_Layout\",\n      \"width\": 40,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CinnabarIsland\",\n      \"border_filepath\": \"data/layouts/RS_SafariZone_Northeast/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RS_SafariZone_Northeast/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RS_SAFARI_ZONE_SOUTHWEST\",\n      \"name\": \"RS_SafariZone_Southwest_Layout\",\n      \"width\": 40,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CinnabarIsland\",\n      \"border_filepath\": \"data/layouts/RS_SafariZone_Southwest/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RS_SafariZone_Southwest/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RS_SAFARI_ZONE_SOUTHEAST\",\n      \"name\": \"RS_SafariZone_Southeast_Layout\",\n      \"width\": 40,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CinnabarIsland\",\n      \"border_filepath\": \"data/layouts/RS_SafariZone_Southeast/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RS_SafariZone_Southeast/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FORTREE_CITY_DECORATION_SHOP\",\n      \"name\": \"FortreeCity_DecorationShop_Layout\",\n      \"width\": 8,\n      \"height\": 6,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/FortreeCity_DecorationShop/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FortreeCity_DecorationShop/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RS_BATTLE_TOWER\",\n      \"name\": \"RS_BattleTower_Layout\",\n      \"width\": 29,\n      \"height\": 30,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_BattleFrontierOutsideEast\",\n      \"border_filepath\": \"data/layouts/RS_BattleTower/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RS_BattleTower/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SS_TIDAL_CORRIDOR\",\n      \"name\": \"SSTidal_Corridor_Layout\",\n      \"width\": 18,\n      \"height\": 13,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SSAnne\",\n      \"border_filepath\": \"data/layouts/SSTidal_Corridor/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSTidal_Corridor/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SS_TIDAL_LOWER_DECK\",\n      \"name\": \"SSTidal_LowerDeck_Layout\",\n      \"width\": 17,\n      \"height\": 13,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SSAnne\",\n      \"border_filepath\": \"data/layouts/SSTidal_LowerDeck/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSTidal_LowerDeck/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SS_TIDAL_ROOMS\",\n      \"name\": \"SSTidal_Rooms_Layout\",\n      \"width\": 36,\n      \"height\": 18,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SSAnne\",\n      \"border_filepath\": \"data/layouts/SSTidal_Rooms/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSTidal_Rooms/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RUSTBORO_CITY_FLAT2_1F\",\n      \"name\": \"RustboroCity_Flat2_1F_Layout\",\n      \"width\": 14,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/RustboroCity_Flat2_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RustboroCity_Flat2_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RUSTBORO_CITY_FLAT2_2F\",\n      \"name\": \"RustboroCity_Flat2_2F_Layout\",\n      \"width\": 14,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/RustboroCity_Flat2_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RustboroCity_Flat2_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RUSTBORO_CITY_FLAT2_3F\",\n      \"name\": \"RustboroCity_Flat2_3F_Layout\",\n      \"width\": 14,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/RustboroCity_Flat2_3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RustboroCity_Flat2_3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_EVER_GRANDE_CITY_HALL_OF_FAME\",\n      \"name\": \"EverGrandeCity_HallOfFame_Layout\",\n      \"width\": 15,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_CableClub\",\n      \"border_filepath\": \"data/layouts/EverGrandeCity_HallOfFame/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/EverGrandeCity_HallOfFame/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MOSSDEEP_CITY_EREADER_TRAINER_HOUSE_1F\",\n      \"name\": \"MossdeepCity_EReaderTrainerHouse_1F_Layout\",\n      \"width\": 11,\n      \"height\": 8,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/MossdeepCity_EReaderTrainerHouse_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MossdeepCity_EReaderTrainerHouse_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MOSSDEEP_CITY_EREADER_TRAINER_HOUSE_2F\",\n      \"name\": \"MossdeepCity_EReaderTrainerHouse_2F_Layout\",\n      \"width\": 12,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/MossdeepCity_EReaderTrainerHouse_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MossdeepCity_EReaderTrainerHouse_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SOOTOPOLIS_CITY_HOUSE1\",\n      \"name\": \"SootopolisCity_House1_Layout\",\n      \"width\": 8,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/SootopolisCity_House1/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SootopolisCity_House1/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SOOTOPOLIS_CITY_HOUSE2\",\n      \"name\": \"SootopolisCity_House2_Layout\",\n      \"width\": 8,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/SootopolisCity_House2/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SootopolisCity_House2/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SOOTOPOLIS_CITY_HOUSE3\",\n      \"name\": \"SootopolisCity_House3_Layout\",\n      \"width\": 8,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/SootopolisCity_House3/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SootopolisCity_House3/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RUSTBORO_CITY_FLAT1_1F\",\n      \"name\": \"RustboroCity_Flat1_1F_Layout\",\n      \"width\": 14,\n      \"height\": 8,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/RustboroCity_Flat1_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RustboroCity_Flat1_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RUSTBORO_CITY_FLAT1_2F\",\n      \"name\": \"RustboroCity_Flat1_2F_Layout\",\n      \"width\": 14,\n      \"height\": 8,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/RustboroCity_Flat1_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RustboroCity_Flat1_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RS_SAFARI_ZONE_REST_HOUSE\",\n      \"name\": \"RS_SafariZone_RestHouse_Layout\",\n      \"width\": 10,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/RS_SafariZone_RestHouse/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RS_SafariZone_RestHouse/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PALLET_TOWN\",\n      \"name\": \"PalletTown_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_PalletTown\",\n      \"border_filepath\": \"data/layouts/PalletTown/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PalletTown/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_VIRIDIAN_CITY\",\n      \"name\": \"ViridianCity_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_ViridianCity\",\n      \"border_filepath\": \"data/layouts/ViridianCity/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ViridianCity/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PEWTER_CITY\",\n      \"name\": \"PewterCity_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_PewterCity\",\n      \"border_filepath\": \"data/layouts/PewterCity/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PewterCity/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CITY\",\n      \"name\": \"CeruleanCity_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCity\",\n      \"border_filepath\": \"data/layouts/CeruleanCity/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCity/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_LAVENDER_TOWN\",\n      \"name\": \"LavenderTown_Layout\",\n      \"width\": 24,\n      \"height\": 21,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_LavenderTown\",\n      \"border_filepath\": \"data/layouts/LavenderTown/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/LavenderTown/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_VERMILION_CITY\",\n      \"name\": \"VermilionCity_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_VermilionCity\",\n      \"border_filepath\": \"data/layouts/VermilionCity/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/VermilionCity/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY\",\n      \"name\": \"CeladonCity_Layout\",\n      \"width\": 60,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeladonCity\",\n      \"border_filepath\": \"data/layouts/CeladonCity/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FUCHSIA_CITY\",\n      \"name\": \"FuchsiaCity_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_FuchsiaCity\",\n      \"border_filepath\": \"data/layouts/FuchsiaCity/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FuchsiaCity/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CINNABAR_ISLAND\",\n      \"name\": \"CinnabarIsland_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CinnabarIsland\",\n      \"border_filepath\": \"data/layouts/CinnabarIsland/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CinnabarIsland/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_INDIGO_PLATEAU_EXTERIOR\",\n      \"name\": \"IndigoPlateau_Exterior_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_IndigoPlateau\",\n      \"border_filepath\": \"data/layouts/IndigoPlateau_Exterior/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/IndigoPlateau_Exterior/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFFRON_CITY_CONNECTION\",\n      \"name\": \"SaffronCity_Connection_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SaffronCity\",\n      \"border_filepath\": \"data/layouts/SaffronCity_Connection/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SaffronCity_Connection/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE1\",\n      \"name\": \"Route1_Layout\",\n      \"width\": 24,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_PalletTown\",\n      \"border_filepath\": \"data/layouts/Route1/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route1/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE2\",\n      \"name\": \"Route2_Layout\",\n      \"width\": 24,\n      \"height\": 80,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_ViridianCity\",\n      \"border_filepath\": \"data/layouts/Route2/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route2/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE3\",\n      \"name\": \"Route3_Layout\",\n      \"width\": 84,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_PewterCity\",\n      \"border_filepath\": \"data/layouts/Route3/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route3/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE4\",\n      \"name\": \"Route4_Layout\",\n      \"width\": 108,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCity\",\n      \"border_filepath\": \"data/layouts/Route4/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route4/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE5\",\n      \"name\": \"Route5_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCity\",\n      \"border_filepath\": \"data/layouts/Route5/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route5/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE6\",\n      \"name\": \"Route6_Layout\",\n      \"width\": 24,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_VermilionCity\",\n      \"border_filepath\": \"data/layouts/Route6/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route6/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE7\",\n      \"name\": \"Route7_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeladonCity\",\n      \"border_filepath\": \"data/layouts/Route7/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route7/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE8\",\n      \"name\": \"Route8_Layout\",\n      \"width\": 72,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_LavenderTown\",\n      \"border_filepath\": \"data/layouts/Route8/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route8/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE9\",\n      \"name\": \"Route9_Layout\",\n      \"width\": 72,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCity\",\n      \"border_filepath\": \"data/layouts/Route9/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route9/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE10\",\n      \"name\": \"Route10_Layout\",\n      \"width\": 24,\n      \"height\": 80,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_LavenderTown\",\n      \"border_filepath\": \"data/layouts/Route10/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route10/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE11\",\n      \"name\": \"Route11_Layout\",\n      \"width\": 72,\n      \"height\": 22,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_VermilionCity\",\n      \"border_filepath\": \"data/layouts/Route11/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route11/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE12\",\n      \"name\": \"Route12_Layout\",\n      \"width\": 24,\n      \"height\": 119,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_LavenderTown\",\n      \"border_filepath\": \"data/layouts/Route12/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route12/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE13\",\n      \"name\": \"Route13_Layout\",\n      \"width\": 72,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_LavenderTown\",\n      \"border_filepath\": \"data/layouts/Route13/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route13/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE14\",\n      \"name\": \"Route14_Layout\",\n      \"width\": 24,\n      \"height\": 60,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_LavenderTown\",\n      \"border_filepath\": \"data/layouts/Route14/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route14/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE15\",\n      \"name\": \"Route15_Layout\",\n      \"width\": 72,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_FuchsiaCity\",\n      \"border_filepath\": \"data/layouts/Route15/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route15/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE16\",\n      \"name\": \"Route16_Layout\",\n      \"width\": 48,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeladonCity\",\n      \"border_filepath\": \"data/layouts/Route16/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route16/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE17\",\n      \"name\": \"Route17_Layout\",\n      \"width\": 24,\n      \"height\": 160,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeladonCity\",\n      \"border_filepath\": \"data/layouts/Route17/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route17/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE18\",\n      \"name\": \"Route18_Layout\",\n      \"width\": 60,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeladonCity\",\n      \"border_filepath\": \"data/layouts/Route18/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route18/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE19\",\n      \"name\": \"Route19_Layout\",\n      \"width\": 24,\n      \"height\": 60,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_FuchsiaCity\",\n      \"border_filepath\": \"data/layouts/Route19/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route19/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE20\",\n      \"name\": \"Route20_Layout\",\n      \"width\": 120,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CinnabarIsland\",\n      \"border_filepath\": \"data/layouts/Route20/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route20/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE21_NORTH\",\n      \"name\": \"Route21_North_Layout\",\n      \"width\": 24,\n      \"height\": 50,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_PalletTown\",\n      \"border_filepath\": \"data/layouts/Route21_North/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route21_North/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE22\",\n      \"name\": \"Route22_Layout\",\n      \"width\": 48,\n      \"height\": 24,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_ViridianCity\",\n      \"border_filepath\": \"data/layouts/Route22/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route22/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE23\",\n      \"name\": \"Route23_Layout\",\n      \"width\": 24,\n      \"height\": 160,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_IndigoPlateau\",\n      \"border_filepath\": \"data/layouts/Route23/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route23/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE24\",\n      \"name\": \"Route24_Layout\",\n      \"width\": 24,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCity\",\n      \"border_filepath\": \"data/layouts/Route24/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route24/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE25\",\n      \"name\": \"Route25_Layout\",\n      \"width\": 72,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCity\",\n      \"border_filepath\": \"data/layouts/Route25/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route25/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_MOON_1F\",\n      \"name\": \"MtMoon_1F_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/MtMoon_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtMoon_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_MOON_B1F\",\n      \"name\": \"MtMoon_B1F_Layout\",\n      \"width\": 49,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/MtMoon_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtMoon_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_MOON_B2F\",\n      \"name\": \"MtMoon_B2F_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/MtMoon_B2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtMoon_B2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_VIRIDIAN_FOREST\",\n      \"name\": \"ViridianForest_Layout\",\n      \"width\": 54,\n      \"height\": 69,\n      \"border_width\": 3,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_ViridianForest\",\n      \"border_filepath\": \"data/layouts/ViridianForest/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ViridianForest/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SSANNE_EXTERIOR\",\n      \"name\": \"SSAnne_Exterior_Layout\",\n      \"width\": 70,\n      \"height\": 32,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_VermilionCity\",\n      \"border_filepath\": \"data/layouts/SSAnne_Exterior/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSAnne_Exterior/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SSANNE_1F_CORRIDOR\",\n      \"name\": \"SSAnne_1F_Corridor_Layout\",\n      \"width\": 31,\n      \"height\": 21,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SSAnne\",\n      \"border_filepath\": \"data/layouts/SSAnne_1F_Corridor/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSAnne_1F_Corridor/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SSANNE_2F_CORRIDOR\",\n      \"name\": \"SSAnne_2F_Corridor_Layout\",\n      \"width\": 34,\n      \"height\": 16,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SSAnne\",\n      \"border_filepath\": \"data/layouts/SSAnne_2F_Corridor/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSAnne_2F_Corridor/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SSANNE_3F_CORRIDOR\",\n      \"name\": \"SSAnne_3F_Corridor_Layout\",\n      \"width\": 22,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SSAnne\",\n      \"border_filepath\": \"data/layouts/SSAnne_3F_Corridor/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSAnne_3F_Corridor/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SSANNE_B1F_CORRIDOR\",\n      \"name\": \"SSAnne_B1F_Corridor_Layout\",\n      \"width\": 23,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SSAnne\",\n      \"border_filepath\": \"data/layouts/SSAnne_B1F_Corridor/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSAnne_B1F_Corridor/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SSANNE_DECK\",\n      \"name\": \"SSAnne_Deck_Layout\",\n      \"width\": 24,\n      \"height\": 19,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SSAnne\",\n      \"border_filepath\": \"data/layouts/SSAnne_Deck/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSAnne_Deck/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_DIGLETTS_CAVE_B1F\",\n      \"name\": \"DiglettsCave_B1F_Layout\",\n      \"width\": 85,\n      \"height\": 80,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_DiglettsCave\",\n      \"border_filepath\": \"data/layouts/DiglettsCave_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/DiglettsCave_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_VICTORY_ROAD_1F\",\n      \"name\": \"VictoryRoad_1F_Layout\",\n      \"width\": 26,\n      \"height\": 22,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/VictoryRoad_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/VictoryRoad_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_VICTORY_ROAD_2F\",\n      \"name\": \"VictoryRoad_2F_Layout\",\n      \"width\": 51,\n      \"height\": 22,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/VictoryRoad_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/VictoryRoad_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_VICTORY_ROAD_3F\",\n      \"name\": \"VictoryRoad_3F_Layout\",\n      \"width\": 45,\n      \"height\": 22,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/VictoryRoad_3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/VictoryRoad_3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROCKET_HIDEOUT_B1F\",\n      \"name\": \"RocketHideout_B1F_Layout\",\n      \"width\": 28,\n      \"height\": 34,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/RocketHideout_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RocketHideout_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROCKET_HIDEOUT_B2F\",\n      \"name\": \"RocketHideout_B2F_Layout\",\n      \"width\": 32,\n      \"height\": 22,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/RocketHideout_B2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RocketHideout_B2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROCKET_HIDEOUT_B3F\",\n      \"name\": \"RocketHideout_B3F_Layout\",\n      \"width\": 22,\n      \"height\": 27,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/RocketHideout_B3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RocketHideout_B3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROCKET_HIDEOUT_B4F\",\n      \"name\": \"RocketHideout_B4F_Layout\",\n      \"width\": 24,\n      \"height\": 26,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/RocketHideout_B4F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RocketHideout_B4F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SILPH_CO_1F\",\n      \"name\": \"SilphCo_1F_Layout\",\n      \"width\": 36,\n      \"height\": 22,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/SilphCo_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SilphCo_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SILPH_CO_2F\",\n      \"name\": \"SilphCo_2F_Layout\",\n      \"width\": 36,\n      \"height\": 22,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/SilphCo_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SilphCo_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SILPH_CO_3F\",\n      \"name\": \"SilphCo_3F_Layout\",\n      \"width\": 36,\n      \"height\": 22,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/SilphCo_3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SilphCo_3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SILPH_CO_4F\",\n      \"name\": \"SilphCo_4F_Layout\",\n      \"width\": 36,\n      \"height\": 22,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/SilphCo_4F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SilphCo_4F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SILPH_CO_5F\",\n      \"name\": \"SilphCo_5F_Layout\",\n      \"width\": 36,\n      \"height\": 22,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/SilphCo_5F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SilphCo_5F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SILPH_CO_6F\",\n      \"name\": \"SilphCo_6F_Layout\",\n      \"width\": 31,\n      \"height\": 19,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/SilphCo_6F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SilphCo_6F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SILPH_CO_7F\",\n      \"name\": \"SilphCo_7F_Layout\",\n      \"width\": 31,\n      \"height\": 19,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/SilphCo_7F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SilphCo_7F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SILPH_CO_8F\",\n      \"name\": \"SilphCo_8F_Layout\",\n      \"width\": 31,\n      \"height\": 19,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/SilphCo_8F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SilphCo_8F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SILPH_CO_9F\",\n      \"name\": \"SilphCo_9F_Layout\",\n      \"width\": 31,\n      \"height\": 19,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/SilphCo_9F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SilphCo_9F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SILPH_CO_10F\",\n      \"name\": \"SilphCo_10F_Layout\",\n      \"width\": 17,\n      \"height\": 19,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/SilphCo_10F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SilphCo_10F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SILPH_CO_11F\",\n      \"name\": \"SilphCo_11F_Layout\",\n      \"width\": 17,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/SilphCo_11F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SilphCo_11F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_MANSION_1F\",\n      \"name\": \"PokemonMansion_1F_Layout\",\n      \"width\": 38,\n      \"height\": 35,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonMansion\",\n      \"border_filepath\": \"data/layouts/PokemonMansion_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonMansion_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_MANSION_2F\",\n      \"name\": \"PokemonMansion_2F_Layout\",\n      \"width\": 38,\n      \"height\": 38,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonMansion\",\n      \"border_filepath\": \"data/layouts/PokemonMansion_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonMansion_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_MANSION_3F\",\n      \"name\": \"PokemonMansion_3F_Layout\",\n      \"width\": 38,\n      \"height\": 35,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonMansion\",\n      \"border_filepath\": \"data/layouts/PokemonMansion_3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonMansion_3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_MANSION_B1F\",\n      \"name\": \"PokemonMansion_B1F_Layout\",\n      \"width\": 38,\n      \"height\": 35,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonMansion\",\n      \"border_filepath\": \"data/layouts/PokemonMansion_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonMansion_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFARI_ZONE_CENTER\",\n      \"name\": \"SafariZone_Center_Layout\",\n      \"width\": 51,\n      \"height\": 36,\n      \"border_width\": 3,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_FuchsiaCity\",\n      \"border_filepath\": \"data/layouts/SafariZone_Center/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SafariZone_Center/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFARI_ZONE_EAST\",\n      \"name\": \"SafariZone_East_Layout\",\n      \"width\": 54,\n      \"height\": 35,\n      \"border_width\": 3,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_FuchsiaCity\",\n      \"border_filepath\": \"data/layouts/SafariZone_East/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SafariZone_East/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFARI_ZONE_NORTH\",\n      \"name\": \"SafariZone_North_Layout\",\n      \"width\": 57,\n      \"height\": 42,\n      \"border_width\": 3,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_FuchsiaCity\",\n      \"border_filepath\": \"data/layouts/SafariZone_North/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SafariZone_North/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFARI_ZONE_WEST\",\n      \"name\": \"SafariZone_West_Layout\",\n      \"width\": 48,\n      \"height\": 36,\n      \"border_width\": 3,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_FuchsiaCity\",\n      \"border_filepath\": \"data/layouts/SafariZone_West/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SafariZone_West/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CAVE_1F\",\n      \"name\": \"CeruleanCave_1F_Layout\",\n      \"width\": 40,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCave\",\n      \"border_filepath\": \"data/layouts/CeruleanCave_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCave_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CAVE_2F\",\n      \"name\": \"CeruleanCave_2F_Layout\",\n      \"width\": 40,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCave\",\n      \"border_filepath\": \"data/layouts/CeruleanCave_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCave_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CAVE_B1F\",\n      \"name\": \"CeruleanCave_B1F_Layout\",\n      \"width\": 40,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCave\",\n      \"border_filepath\": \"data/layouts/CeruleanCave_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCave_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROCK_TUNNEL_1F\",\n      \"name\": \"RockTunnel_1F_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_RockTunnel\",\n      \"border_filepath\": \"data/layouts/RockTunnel_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RockTunnel_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROCK_TUNNEL_B1F\",\n      \"name\": \"RockTunnel_B1F_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_RockTunnel\",\n      \"border_filepath\": \"data/layouts/RockTunnel_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RockTunnel_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEAFOAM_ISLANDS_1F\",\n      \"name\": \"SeafoamIslands_1F_Layout\",\n      \"width\": 38,\n      \"height\": 24,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeafoamIslands\",\n      \"border_filepath\": \"data/layouts/SeafoamIslands_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SeafoamIslands_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEAFOAM_ISLANDS_B1F\",\n      \"name\": \"SeafoamIslands_B1F_Layout\",\n      \"width\": 38,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeafoamIslands\",\n      \"border_filepath\": \"data/layouts/SeafoamIslands_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SeafoamIslands_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEAFOAM_ISLANDS_B2F\",\n      \"name\": \"SeafoamIslands_B2F_Layout\",\n      \"width\": 38,\n      \"height\": 24,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeafoamIslands\",\n      \"border_filepath\": \"data/layouts/SeafoamIslands_B2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SeafoamIslands_B2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEAFOAM_ISLANDS_B3F\",\n      \"name\": \"SeafoamIslands_B3F_Layout\",\n      \"width\": 38,\n      \"height\": 24,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeafoamIslands\",\n      \"border_filepath\": \"data/layouts/SeafoamIslands_B3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SeafoamIslands_B3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEAFOAM_ISLANDS_B4F\",\n      \"name\": \"SeafoamIslands_B4F_Layout\",\n      \"width\": 38,\n      \"height\": 24,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeafoamIslands\",\n      \"border_filepath\": \"data/layouts/SeafoamIslands_B4F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SeafoamIslands_B4F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_TOWER_1F\",\n      \"name\": \"PokemonTower_1F_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonTower\",\n      \"border_filepath\": \"data/layouts/PokemonTower_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonTower_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_TOWER_2F\",\n      \"name\": \"PokemonTower_2F_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonTower\",\n      \"border_filepath\": \"data/layouts/PokemonTower_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonTower_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_TOWER_3F\",\n      \"name\": \"PokemonTower_3F_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonTower\",\n      \"border_filepath\": \"data/layouts/PokemonTower_3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonTower_3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_TOWER_4F\",\n      \"name\": \"PokemonTower_4F_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonTower\",\n      \"border_filepath\": \"data/layouts/PokemonTower_4F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonTower_4F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_TOWER_5F\",\n      \"name\": \"PokemonTower_5F_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonTower\",\n      \"border_filepath\": \"data/layouts/PokemonTower_5F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonTower_5F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_TOWER_6F\",\n      \"name\": \"PokemonTower_6F_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonTower\",\n      \"border_filepath\": \"data/layouts/PokemonTower_6F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonTower_6F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_TOWER_7F\",\n      \"name\": \"PokemonTower_7F_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonTower\",\n      \"border_filepath\": \"data/layouts/PokemonTower_7F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonTower_7F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POWER_PLANT\",\n      \"name\": \"PowerPlant_Layout\",\n      \"width\": 49,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PowerPlant\",\n      \"border_filepath\": \"data/layouts/PowerPlant/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PowerPlant/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE25_SEA_COTTAGE\",\n      \"name\": \"Route25_SeaCottage_Layout\",\n      \"width\": 15,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SeaCottage\",\n      \"border_filepath\": \"data/layouts/Route25_SeaCottage/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route25_SeaCottage/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SSANNE_KITCHEN\",\n      \"name\": \"SSAnne_Kitchen_Layout\",\n      \"width\": 16,\n      \"height\": 14,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SSAnne\",\n      \"border_filepath\": \"data/layouts/SSAnne_Kitchen/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSAnne_Kitchen/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SSANNE_CAPTAINS_OFFICE\",\n      \"name\": \"SSAnne_CaptainsOffice_Layout\",\n      \"width\": 9,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SSAnne\",\n      \"border_filepath\": \"data/layouts/SSAnne_CaptainsOffice/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSAnne_CaptainsOffice/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_UNDERGROUND_PATH_ENTRANCE\",\n      \"name\": \"UndergroundPath_Entrance_Layout\",\n      \"width\": 13,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/UndergroundPath_Entrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/UndergroundPath_Entrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_UNDERGROUND_PATH_EAST_WEST_TUNNEL\",\n      \"name\": \"UndergroundPath_EastWestTunnel_Layout\",\n      \"width\": 80,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_UndergroundPath\",\n      \"border_filepath\": \"data/layouts/UndergroundPath_EastWestTunnel/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/UndergroundPath_EastWestTunnel/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL\",\n      \"name\": \"UndergroundPath_NorthSouthTunnel_Layout\",\n      \"width\": 8,\n      \"height\": 63,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_UndergroundPath\",\n      \"border_filepath\": \"data/layouts/UndergroundPath_NorthSouthTunnel/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/UndergroundPath_NorthSouthTunnel/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE12_NORTH_ENTRANCE_1F\",\n      \"name\": \"Route12_NorthEntrance_1F_Layout\",\n      \"width\": 11,\n      \"height\": 13,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/Route12_NorthEntrance_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route12_NorthEntrance_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SSANNE_ROOM1\",\n      \"name\": \"SSAnne_Room1_Layout\",\n      \"width\": 6,\n      \"height\": 8,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SSAnne\",\n      \"border_filepath\": \"data/layouts/SSAnne_Room1/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSAnne_Room1/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SSANNE_ROOM2\",\n      \"name\": \"SSAnne_Room2_Layout\",\n      \"width\": 6,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SSAnne\",\n      \"border_filepath\": \"data/layouts/SSAnne_Room2/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SSAnne_Room2/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR\",\n      \"name\": \"CeladonCity_DepartmentStore_Elevator_Layout\",\n      \"width\": 5,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/CeladonCity_DepartmentStore_Elevator/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_DepartmentStore_Elevator/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PEWTER_CITY_MUSEUM_1F\",\n      \"name\": \"PewterCity_Museum_1F_Layout\",\n      \"width\": 28,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Museum\",\n      \"border_filepath\": \"data/layouts/PewterCity_Museum_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PewterCity_Museum_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PEWTER_CITY_MUSEUM_2F\",\n      \"name\": \"PewterCity_Museum_2F_Layout\",\n      \"width\": 19,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Museum\",\n      \"border_filepath\": \"data/layouts/PewterCity_Museum_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PewterCity_Museum_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CITY_HOUSE2\",\n      \"name\": \"CeruleanCity_House2_Layout\",\n      \"width\": 10,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_BurgledHouse\",\n      \"border_filepath\": \"data/layouts/CeruleanCity_House2/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCity_House2/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CITY_HOUSE1\",\n      \"name\": \"CeruleanCity_House1_Layout\",\n      \"width\": 10,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/CeruleanCity_House1/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCity_House1/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_CONDOMINIUMS_1F\",\n      \"name\": \"CeladonCity_Condominiums_1F_Layout\",\n      \"width\": 15,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Condominiums\",\n      \"border_filepath\": \"data/layouts/CeladonCity_Condominiums_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_Condominiums_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_CONDOMINIUMS_2F\",\n      \"name\": \"CeladonCity_Condominiums_2F_Layout\",\n      \"width\": 15,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Condominiums\",\n      \"border_filepath\": \"data/layouts/CeladonCity_Condominiums_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_Condominiums_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_CONDOMINIUMS_3F\",\n      \"name\": \"CeladonCity_Condominiums_3F_Layout\",\n      \"width\": 15,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Condominiums\",\n      \"border_filepath\": \"data/layouts/CeladonCity_Condominiums_3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_Condominiums_3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_CONDOMINIUMS_ROOF\",\n      \"name\": \"CeladonCity_Condominiums_Roof_Layout\",\n      \"width\": 14,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Condominiums\",\n      \"border_filepath\": \"data/layouts/CeladonCity_Condominiums_Roof/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_Condominiums_Roof/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_CONDOMINIUMS_ROOF_ROOM\",\n      \"name\": \"CeladonCity_Condominiums_RoofRoom_Layout\",\n      \"width\": 10,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_School\",\n      \"border_filepath\": \"data/layouts/CeladonCity_Condominiums_RoofRoom/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_Condominiums_RoofRoom/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_GAME_CORNER_PRIZE_ROOM\",\n      \"name\": \"CeladonCity_GameCorner_PrizeRoom_Layout\",\n      \"width\": 9,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GameCorner\",\n      \"border_filepath\": \"data/layouts/CeladonCity_GameCorner_PrizeRoom/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_GameCorner_PrizeRoom/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_RESTAURANT\",\n      \"name\": \"CeladonCity_Restaurant_Layout\",\n      \"width\": 15,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_RestaurantHotel\",\n      \"border_filepath\": \"data/layouts/CeladonCity_Restaurant/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_Restaurant/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_HOTEL\",\n      \"name\": \"CeladonCity_Hotel_Layout\",\n      \"width\": 17,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_RestaurantHotel\",\n      \"border_filepath\": \"data/layouts/CeladonCity_Hotel/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_Hotel/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_1F\",\n      \"name\": \"CeladonCity_DepartmentStore_1F_Layout\",\n      \"width\": 13,\n      \"height\": 16,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_DepartmentStore\",\n      \"border_filepath\": \"data/layouts/CeladonCity_DepartmentStore_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_DepartmentStore_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_2F\",\n      \"name\": \"CeladonCity_DepartmentStore_2F_Layout\",\n      \"width\": 13,\n      \"height\": 15,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_DepartmentStore\",\n      \"border_filepath\": \"data/layouts/CeladonCity_DepartmentStore_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_DepartmentStore_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_3F\",\n      \"name\": \"CeladonCity_DepartmentStore_3F_Layout\",\n      \"width\": 13,\n      \"height\": 15,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_DepartmentStore\",\n      \"border_filepath\": \"data/layouts/CeladonCity_DepartmentStore_3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_DepartmentStore_3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_4F\",\n      \"name\": \"CeladonCity_DepartmentStore_4F_Layout\",\n      \"width\": 13,\n      \"height\": 15,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_DepartmentStore\",\n      \"border_filepath\": \"data/layouts/CeladonCity_DepartmentStore_4F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_DepartmentStore_4F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_5F\",\n      \"name\": \"CeladonCity_DepartmentStore_5F_Layout\",\n      \"width\": 13,\n      \"height\": 15,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_DepartmentStore\",\n      \"border_filepath\": \"data/layouts/CeladonCity_DepartmentStore_5F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_DepartmentStore_5F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_ROOF\",\n      \"name\": \"CeladonCity_DepartmentStore_Roof_Layout\",\n      \"width\": 19,\n      \"height\": 14,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_DepartmentStore\",\n      \"border_filepath\": \"data/layouts/CeladonCity_DepartmentStore_Roof/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_DepartmentStore_Roof/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFARI_ZONE_REST_HOUSE\",\n      \"name\": \"SafariZone_RestHouse_Layout\",\n      \"width\": 13,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SafariZoneBuilding\",\n      \"border_filepath\": \"data/layouts/SafariZone_RestHouse/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SafariZone_RestHouse/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFARI_ZONE_SECRET_HOUSE\",\n      \"name\": \"SafariZone_SecretHouse_Layout\",\n      \"width\": 13,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SafariZoneBuilding\",\n      \"border_filepath\": \"data/layouts/SafariZone_SecretHouse/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SafariZone_SecretHouse/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FUCHSIA_CITY_SAFARI_ZONE_OFFICE\",\n      \"name\": \"FuchsiaCity_SafariZone_Office_Layout\",\n      \"width\": 20,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SafariZoneBuilding\",\n      \"border_filepath\": \"data/layouts/FuchsiaCity_SafariZone_Office/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FuchsiaCity_SafariZone_Office/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FUCHSIA_CITY_WARDENS_HOUSE\",\n      \"name\": \"FuchsiaCity_WardensHouse_Layout\",\n      \"width\": 13,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Museum\",\n      \"border_filepath\": \"data/layouts/FuchsiaCity_WardensHouse/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FuchsiaCity_WardensHouse/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FUCHSIA_CITY_HOUSE2\",\n      \"name\": \"FuchsiaCity_House2_Layout\",\n      \"width\": 10,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Museum\",\n      \"border_filepath\": \"data/layouts/FuchsiaCity_House2/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FuchsiaCity_House2/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE\",\n      \"name\": \"CinnabarIsland_PokemonLab_Entrance_Layout\",\n      \"width\": 28,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Lab\",\n      \"border_filepath\": \"data/layouts/CinnabarIsland_PokemonLab_Entrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CinnabarIsland_PokemonLab_Entrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_LOUNGE\",\n      \"name\": \"CinnabarIsland_PokemonLab_Lounge_Layout\",\n      \"width\": 15,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Lab\",\n      \"border_filepath\": \"data/layouts/CinnabarIsland_PokemonLab_Lounge/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CinnabarIsland_PokemonLab_Lounge/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_RESEARCH_ROOM\",\n      \"name\": \"CinnabarIsland_PokemonLab_ResearchRoom_Layout\",\n      \"width\": 15,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Lab\",\n      \"border_filepath\": \"data/layouts/CinnabarIsland_PokemonLab_ResearchRoom/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CinnabarIsland_PokemonLab_ResearchRoom/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM\",\n      \"name\": \"CinnabarIsland_PokemonLab_ExperimentRoom_Layout\",\n      \"width\": 15,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_Lab\",\n      \"border_filepath\": \"data/layouts/CinnabarIsland_PokemonLab_ExperimentRoom/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CinnabarIsland_PokemonLab_ExperimentRoom/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFFRON_CITY\",\n      \"name\": \"SaffronCity_Layout\",\n      \"width\": 66,\n      \"height\": 55,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SaffronCity\",\n      \"border_filepath\": \"data/layouts/SaffronCity/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SaffronCity/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFFRON_CITY_NORTH_SOUTH_ENTRANCE\",\n      \"name\": \"SaffronCity_NorthSouthEntrance_Layout\",\n      \"width\": 9,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/SaffronCity_NorthSouthEntrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SaffronCity_NorthSouthEntrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFFRON_CITY_EAST_WEST_ENTRANCE\",\n      \"name\": \"SaffronCity_EastWestEntrance_Layout\",\n      \"width\": 13,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/SaffronCity_EastWestEntrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SaffronCity_EastWestEntrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_DIGLETTS_CAVE_NORTH_ENTRANCE\",\n      \"name\": \"DiglettsCave_NorthEntrance_Layout\",\n      \"width\": 10,\n      \"height\": 8,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_DiglettsCave\",\n      \"border_filepath\": \"data/layouts/DiglettsCave_NorthEntrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/DiglettsCave_NorthEntrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_DIGLETTS_CAVE_SOUTH_ENTRANCE\",\n      \"name\": \"DiglettsCave_SouthEntrance_Layout\",\n      \"width\": 10,\n      \"height\": 8,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_DiglettsCave\",\n      \"border_filepath\": \"data/layouts/DiglettsCave_SouthEntrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/DiglettsCave_SouthEntrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_INDIGO_PLATEAU_POKEMON_CENTER_1F\",\n      \"name\": \"IndigoPlateau_PokemonCenter_1F_Layout\",\n      \"width\": 25,\n      \"height\": 18,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonCenter\",\n      \"border_filepath\": \"data/layouts/IndigoPlateau_PokemonCenter_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/IndigoPlateau_PokemonCenter_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_LEAGUE_LORELEIS_ROOM\",\n      \"name\": \"PokemonLeague_LoreleisRoom_Layout\",\n      \"width\": 13,\n      \"height\": 13,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonLeague\",\n      \"border_filepath\": \"data/layouts/PokemonLeague_LoreleisRoom/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonLeague_LoreleisRoom/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_LEAGUE_BRUNOS_ROOM\",\n      \"name\": \"PokemonLeague_BrunosRoom_Layout\",\n      \"width\": 13,\n      \"height\": 13,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonLeague\",\n      \"border_filepath\": \"data/layouts/PokemonLeague_BrunosRoom/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonLeague_BrunosRoom/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_LEAGUE_AGATHAS_ROOM\",\n      \"name\": \"PokemonLeague_AgathasRoom_Layout\",\n      \"width\": 13,\n      \"height\": 13,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonLeague\",\n      \"border_filepath\": \"data/layouts/PokemonLeague_AgathasRoom/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonLeague_AgathasRoom/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_LEAGUE_LANCES_ROOM\",\n      \"name\": \"PokemonLeague_LancesRoom_Layout\",\n      \"width\": 28,\n      \"height\": 24,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonLeague\",\n      \"border_filepath\": \"data/layouts/PokemonLeague_LancesRoom/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonLeague_LancesRoom/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_LEAGUE_CHAMPIONS_ROOM\",\n      \"name\": \"PokemonLeague_ChampionsRoom_Layout\",\n      \"width\": 13,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonLeague\",\n      \"border_filepath\": \"data/layouts/PokemonLeague_ChampionsRoom/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonLeague_ChampionsRoom/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_POKEMON_LEAGUE_HALL_OF_FAME\",\n      \"name\": \"PokemonLeague_HallOfFame_Layout\",\n      \"width\": 11,\n      \"height\": 13,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HallOfFame\",\n      \"border_filepath\": \"data/layouts/PokemonLeague_HallOfFame/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/PokemonLeague_HallOfFame/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE21_SOUTH\",\n      \"name\": \"Route21_South_Layout\",\n      \"width\": 24,\n      \"height\": 50,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CinnabarIsland\",\n      \"border_filepath\": \"data/layouts/Route21_South/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route21_South/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ENTRANCE_2F\",\n      \"name\": \"Entrance_2F_Layout\",\n      \"width\": 13,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/Entrance_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Entrance_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE2_ENTRANCE\",\n      \"name\": \"Route2_Entrance_Layout\",\n      \"width\": 15,\n      \"height\": 12,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/Route2_Entrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route2_Entrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE22_NORTH_ENTRANCE\",\n      \"name\": \"Route22_NorthEntrance_Layout\",\n      \"width\": 15,\n      \"height\": 12,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/Route22_NorthEntrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route22_NorthEntrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE16_NORTH_ENTRANCE_1F\",\n      \"name\": \"Route16_NorthEntrance_1F_Layout\",\n      \"width\": 13,\n      \"height\": 18,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/Route16_NorthEntrance_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route16_NorthEntrance_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ENTRANCE_1F\",\n      \"name\": \"Entrance_1F_Layout\",\n      \"width\": 13,\n      \"height\": 12,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/Entrance_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Entrance_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROCKET_HIDEOUT_ELEVATOR\",\n      \"name\": \"RocketHideout_Elevator_Layout\",\n      \"width\": 5,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/RocketHideout_Elevator/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RocketHideout_Elevator/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFFRON_CITY_COPYCATS_HOUSE_1F\",\n      \"name\": \"SaffronCity_CopycatsHouse_1F_Layout\",\n      \"width\": 13,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding1\",\n      \"border_filepath\": \"data/layouts/SaffronCity_CopycatsHouse_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SaffronCity_CopycatsHouse_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFFRON_CITY_COPYCATS_HOUSE_2F\",\n      \"name\": \"SaffronCity_CopycatsHouse_2F_Layout\",\n      \"width\": 12,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding1\",\n      \"border_filepath\": \"data/layouts/SaffronCity_CopycatsHouse_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SaffronCity_CopycatsHouse_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFFRON_CITY_DOJO\",\n      \"name\": \"SaffronCity_Dojo_Layout\",\n      \"width\": 13,\n      \"height\": 16,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PewterGym\",\n      \"border_filepath\": \"data/layouts/SaffronCity_Dojo/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SaffronCity_Dojo/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SILPH_CO_ELEVATOR\",\n      \"name\": \"SilphCo_Elevator_Layout\",\n      \"width\": 5,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/SilphCo_Elevator/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SilphCo_Elevator/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ONE_ISLAND\",\n      \"name\": \"OneIsland_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands123\",\n      \"border_filepath\": \"data/layouts/OneIsland/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/OneIsland/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TWO_ISLAND\",\n      \"name\": \"TwoIsland_Layout\",\n      \"width\": 48,\n      \"height\": 19,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands123\",\n      \"border_filepath\": \"data/layouts/TwoIsland/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TwoIsland/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_THREE_ISLAND\",\n      \"name\": \"ThreeIsland_Layout\",\n      \"width\": 24,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_BerryForest\",\n      \"border_filepath\": \"data/layouts/ThreeIsland/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ThreeIsland/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FOUR_ISLAND\",\n      \"name\": \"FourIsland_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands45\",\n      \"border_filepath\": \"data/layouts/FourIsland/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FourIsland/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND\",\n      \"name\": \"FiveIsland_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands5\",\n      \"border_filepath\": \"data/layouts/FiveIsland/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND\",\n      \"name\": \"SevenIsland_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands67\",\n      \"border_filepath\": \"data/layouts/SevenIsland/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND\",\n      \"name\": \"SixIsland_Layout\",\n      \"width\": 25,\n      \"height\": 31,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands6\",\n      \"border_filepath\": \"data/layouts/SixIsland/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ONE_ISLAND_KINDLE_ROAD\",\n      \"name\": \"OneIsland_KindleRoad_Layout\",\n      \"width\": 24,\n      \"height\": 140,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands123\",\n      \"border_filepath\": \"data/layouts/OneIsland_KindleRoad/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/OneIsland_KindleRoad/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ONE_ISLAND_TREASURE_BEACH\",\n      \"name\": \"OneIsland_TreasureBeach_Layout\",\n      \"width\": 24,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands123\",\n      \"border_filepath\": \"data/layouts/OneIsland_TreasureBeach/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/OneIsland_TreasureBeach/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TWO_ISLAND_CAPE_BRINK\",\n      \"name\": \"TwoIsland_CapeBrink_Layout\",\n      \"width\": 51,\n      \"height\": 31,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands123\",\n      \"border_filepath\": \"data/layouts/TwoIsland_CapeBrink/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TwoIsland_CapeBrink/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_THREE_ISLAND_BOND_BRIDGE\",\n      \"name\": \"ThreeIsland_BondBridge_Layout\",\n      \"width\": 96,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_BerryForest\",\n      \"border_filepath\": \"data/layouts/ThreeIsland_BondBridge/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ThreeIsland_BondBridge/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_THREE_ISLAND_PORT\",\n      \"name\": \"ThreeIsland_Port_Layout\",\n      \"width\": 48,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_BerryForest\",\n      \"border_filepath\": \"data/layouts/ThreeIsland_Port/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ThreeIsland_Port/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PROTOTYPE_SEVII_ISLE_6\",\n      \"name\": \"Prototype_SeviiIsle_6_Layout\",\n      \"width\": 1,\n      \"height\": 1,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeladonCity\",\n      \"border_filepath\": \"data/layouts/Prototype_SeviiIsle_6/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Prototype_SeviiIsle_6/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PROTOTYPE_SEVII_ISLE_7\",\n      \"name\": \"Prototype_SeviiIsle_7_Layout\",\n      \"width\": 1,\n      \"height\": 1,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeladonCity\",\n      \"border_filepath\": \"data/layouts/Prototype_SeviiIsle_7/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Prototype_SeviiIsle_7/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PROTOTYPE_SEVII_ISLE_8\",\n      \"name\": \"Prototype_SeviiIsle_8_Layout\",\n      \"width\": 84,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeladonCity\",\n      \"border_filepath\": \"data/layouts/Prototype_SeviiIsle_8/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Prototype_SeviiIsle_8/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PROTOTYPE_SEVII_ISLE_9\",\n      \"name\": \"Prototype_SeviiIsle_9_Layout\",\n      \"width\": 24,\n      \"height\": 60,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeladonCity\",\n      \"border_filepath\": \"data/layouts/Prototype_SeviiIsle_9/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Prototype_SeviiIsle_9/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_RESORT_GORGEOUS\",\n      \"name\": \"FiveIsland_ResortGorgeous_Layout\",\n      \"width\": 72,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands5\",\n      \"border_filepath\": \"data/layouts/FiveIsland_ResortGorgeous/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_ResortGorgeous/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_WATER_LABYRINTH\",\n      \"name\": \"FiveIsland_WaterLabyrinth_Layout\",\n      \"width\": 72,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands5\",\n      \"border_filepath\": \"data/layouts/FiveIsland_WaterLabyrinth/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_WaterLabyrinth/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_MEADOW\",\n      \"name\": \"FiveIsland_Meadow_Layout\",\n      \"width\": 24,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands5\",\n      \"border_filepath\": \"data/layouts/FiveIsland_Meadow/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_Meadow/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_MEMORIAL_PILLAR\",\n      \"name\": \"FiveIsland_MemorialPillar_Layout\",\n      \"width\": 24,\n      \"height\": 60,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands5\",\n      \"border_filepath\": \"data/layouts/FiveIsland_MemorialPillar/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_MemorialPillar/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND_OUTCAST_ISLAND\",\n      \"name\": \"SixIsland_OutcastIsland_Layout\",\n      \"width\": 24,\n      \"height\": 80,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands6\",\n      \"border_filepath\": \"data/layouts/SixIsland_OutcastIsland/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland_OutcastIsland/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND_GREEN_PATH\",\n      \"name\": \"SixIsland_GreenPath_Layout\",\n      \"width\": 78,\n      \"height\": 21,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands6\",\n      \"border_filepath\": \"data/layouts/SixIsland_GreenPath/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland_GreenPath/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND_WATER_PATH\",\n      \"name\": \"SixIsland_WaterPath_Layout\",\n      \"width\": 24,\n      \"height\": 100,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands6\",\n      \"border_filepath\": \"data/layouts/SixIsland_WaterPath/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland_WaterPath/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND_RUIN_VALLEY\",\n      \"name\": \"SixIsland_RuinValley_Layout\",\n      \"width\": 48,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands6\",\n      \"border_filepath\": \"data/layouts/SixIsland_RuinValley/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland_RuinValley/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_TRAINER_TOWER\",\n      \"name\": \"SevenIsland_TrainerTower_Layout\",\n      \"width\": 42,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands67\",\n      \"border_filepath\": \"data/layouts/SevenIsland_TrainerTower/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_TrainerTower/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE\",\n      \"name\": \"SevenIsland_SevaultCanyon_Entrance_Layout\",\n      \"width\": 24,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands67\",\n      \"border_filepath\": \"data/layouts/SevenIsland_SevaultCanyon_Entrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_SevaultCanyon_Entrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON\",\n      \"name\": \"SevenIsland_SevaultCanyon_Layout\",\n      \"width\": 24,\n      \"height\": 81,\n      \"border_width\": 6,\n      \"border_height\": 28,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands67\",\n      \"border_filepath\": \"data/layouts/SevenIsland_SevaultCanyon/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_SevaultCanyon/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS\",\n      \"name\": \"SevenIsland_TanobyRuins_Layout\",\n      \"width\": 144,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands67\",\n      \"border_filepath\": \"data/layouts/SevenIsland_TanobyRuins/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_TanobyRuins/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PROTOTYPE_SEVII_ISLE_22\",\n      \"name\": \"Prototype_SeviiIsle_22_Layout\",\n      \"width\": 24,\n      \"height\": 60,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_PalletTown\",\n      \"border_filepath\": \"data/layouts/Prototype_SeviiIsle_22/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Prototype_SeviiIsle_22/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PROTOTYPE_SEVII_ISLE_23_EAST\",\n      \"name\": \"Prototype_SeviiIsle_23_East_Layout\",\n      \"width\": 144,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_PalletTown\",\n      \"border_filepath\": \"data/layouts/Prototype_SeviiIsle_23_East/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Prototype_SeviiIsle_23_East/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PROTOTYPE_SEVII_ISLE_23_WEST\",\n      \"name\": \"Prototype_SeviiIsle_23_West_Layout\",\n      \"width\": 24,\n      \"height\": 60,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_PalletTown\",\n      \"border_filepath\": \"data/layouts/Prototype_SeviiIsle_23_West/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Prototype_SeviiIsle_23_West/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_PROTOTYPE_SEVII_ISLE_24\",\n      \"name\": \"Prototype_SeviiIsle_24_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_PalletTown\",\n      \"border_filepath\": \"data/layouts/Prototype_SeviiIsle_24/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Prototype_SeviiIsle_24/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_UNION_ROOM\",\n      \"name\": \"UnionRoom_Layout\",\n      \"width\": 15,\n      \"height\": 12,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HallOfFame\",\n      \"border_filepath\": \"data/layouts/UnionRoom/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/UnionRoom/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB\",\n      \"name\": \"SaffronCity_PokemonTrainerFanClub_Layout\",\n      \"width\": 11,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_FanClubDaycare\",\n      \"border_filepath\": \"data/layouts/SaffronCity_PokemonTrainerFanClub/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SaffronCity_PokemonTrainerFanClub/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_HOUSE_ROOM1_DOOR_OPEN\",\n      \"name\": \"SevenIsland_House_Room1_DoorOpen_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/SevenIsland_House_Room1_DoorOpen/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_House_Room1_DoorOpen/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_HOUSE_ROOM2\",\n      \"name\": \"SevenIsland_House_Room2_Layout\",\n      \"width\": 12,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonCenter\",\n      \"border_filepath\": \"data/layouts/SevenIsland_House_Room2/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_House_Room2/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_VIRIDIAN_CITY_SCHOOL\",\n      \"name\": \"ViridianCity_School_Layout\",\n      \"width\": 10,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_School\",\n      \"border_filepath\": \"data/layouts/ViridianCity_School/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ViridianCity_School/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_RESTAURANT_DUPLICATE\",\n      \"name\": \"CeladonCity_Restaurant_Duplicate_Layout\",\n      \"width\": 15,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_RestaurantHotel\",\n      \"border_filepath\": \"data/layouts/CeladonCity_Restaurant_Duplicate/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_Restaurant_Duplicate/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CELADON_CITY_HOTEL_DUPLICATE\",\n      \"name\": \"CeladonCity_Hotel_Duplicate_Layout\",\n      \"width\": 17,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_RestaurantHotel\",\n      \"border_filepath\": \"data/layouts/CeladonCity_Hotel_Duplicate/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeladonCity_Hotel_Duplicate/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_RUBY_PATH_B4F\",\n      \"name\": \"MtEmber_RubyPath_B4F_Layout\",\n      \"width\": 18,\n      \"height\": 16,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_MtEmber\",\n      \"border_filepath\": \"data/layouts/MtEmber_RubyPath_B4F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_RubyPath_B4F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_THREE_ISLAND_BERRY_FOREST\",\n      \"name\": \"ThreeIsland_BerryForest_Layout\",\n      \"width\": 85,\n      \"height\": 47,\n      \"border_width\": 3,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_BerryForest\",\n      \"border_filepath\": \"data/layouts/ThreeIsland_BerryForest/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ThreeIsland_BerryForest/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ONE_ISLAND_POKEMON_CENTER_1F\",\n      \"name\": \"OneIsland_PokemonCenter_1F_Layout\",\n      \"width\": 19,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonCenter\",\n      \"border_filepath\": \"data/layouts/OneIsland_PokemonCenter_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/OneIsland_PokemonCenter_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TWO_ISLAND_JOYFUL_GAME_CORNER\",\n      \"name\": \"TwoIsland_JoyfulGameCorner_Layout\",\n      \"width\": 12,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GameCorner\",\n      \"border_filepath\": \"data/layouts/TwoIsland_JoyfulGameCorner/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TwoIsland_JoyfulGameCorner/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_VERMILION_CITY_POKEMON_FAN_CLUB\",\n      \"name\": \"VermilionCity_PokemonFanClub_Layout\",\n      \"width\": 12,\n      \"height\": 12,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_FanClubDaycare\",\n      \"border_filepath\": \"data/layouts/VermilionCity_PokemonFanClub/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/VermilionCity_PokemonFanClub/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE\",\n      \"name\": \"LavenderTown_VolunteerPokemonHouse_Layout\",\n      \"width\": 12,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_FanClubDaycare\",\n      \"border_filepath\": \"data/layouts/LavenderTown_VolunteerPokemonHouse/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/LavenderTown_VolunteerPokemonHouse/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE5_POKEMON_DAY_CARE\",\n      \"name\": \"Route5_PokemonDayCare_Layout\",\n      \"width\": 12,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_FanClubDaycare\",\n      \"border_filepath\": \"data/layouts/Route5_PokemonDayCare/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route5_PokemonDayCare/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_VIRIDIAN_CITY_HOUSE\",\n      \"name\": \"ViridianCity_House_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/ViridianCity_House/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ViridianCity_House/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FOUR_ISLAND_POKEMON_DAY_CARE\",\n      \"name\": \"FourIsland_PokemonDayCare_Layout\",\n      \"width\": 12,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_FanClubDaycare\",\n      \"border_filepath\": \"data/layouts/FourIsland_PokemonDayCare/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FourIsland_PokemonDayCare/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEAFOAM_ISLANDS_B3F_CURRENT_STOPPED\",\n      \"name\": \"SeafoamIslands_B3F_CurrentStopped_Layout\",\n      \"width\": 38,\n      \"height\": 24,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeafoamIslands\",\n      \"border_filepath\": \"data/layouts/SeafoamIslands_B3F_CurrentStopped/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SeafoamIslands_B3F_CurrentStopped/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEAFOAM_ISLANDS_B4F_CURRENT_STOPPED\",\n      \"name\": \"SeafoamIslands_B4F_CurrentStopped_Layout\",\n      \"width\": 38,\n      \"height\": 24,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeafoamIslands\",\n      \"border_filepath\": \"data/layouts/SeafoamIslands_B4F_CurrentStopped/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SeafoamIslands_B4F_CurrentStopped/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_EXTERIOR\",\n      \"name\": \"MtEmber_Exterior_Layout\",\n      \"width\": 57,\n      \"height\": 54,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands123\",\n      \"border_filepath\": \"data/layouts/MtEmber_Exterior/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_Exterior/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_SUMMIT\",\n      \"name\": \"MtEmber_Summit_Layout\",\n      \"width\": 19,\n      \"height\": 22,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands123\",\n      \"border_filepath\": \"data/layouts/MtEmber_Summit/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_Summit/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_SUMMIT_PATH_1F\",\n      \"name\": \"MtEmber_SummitPath_1F_Layout\",\n      \"width\": 15,\n      \"height\": 18,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_MtEmber\",\n      \"border_filepath\": \"data/layouts/MtEmber_SummitPath_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_SummitPath_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_SUMMIT_PATH_2F\",\n      \"name\": \"MtEmber_SummitPath_2F_Layout\",\n      \"width\": 48,\n      \"height\": 46,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_MtEmber\",\n      \"border_filepath\": \"data/layouts/MtEmber_SummitPath_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_SummitPath_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_SUMMIT_PATH_3F\",\n      \"name\": \"MtEmber_SummitPath_3F_Layout\",\n      \"width\": 15,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_MtEmber\",\n      \"border_filepath\": \"data/layouts/MtEmber_SummitPath_3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_SummitPath_3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_RUBY_PATH_1F\",\n      \"name\": \"MtEmber_RubyPath_1F_Layout\",\n      \"width\": 27,\n      \"height\": 19,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_MtEmber\",\n      \"border_filepath\": \"data/layouts/MtEmber_RubyPath_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_RubyPath_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_RUBY_PATH_B1F\",\n      \"name\": \"MtEmber_RubyPath_B1F_Layout\",\n      \"width\": 11,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_MtEmber\",\n      \"border_filepath\": \"data/layouts/MtEmber_RubyPath_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_RubyPath_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_RUBY_PATH_B2F\",\n      \"name\": \"MtEmber_RubyPath_B2F_Layout\",\n      \"width\": 16,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_MtEmber\",\n      \"border_filepath\": \"data/layouts/MtEmber_RubyPath_B2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_RubyPath_B2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_RUBY_PATH_B3F\",\n      \"name\": \"MtEmber_RubyPath_B3F_Layout\",\n      \"width\": 31,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_MtEmber\",\n      \"border_filepath\": \"data/layouts/MtEmber_RubyPath_B3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_RubyPath_B3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_RUBY_PATH_B1F_STAIRS\",\n      \"name\": \"MtEmber_RubyPath_B1F_Stairs_Layout\",\n      \"width\": 6,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_MtEmber\",\n      \"border_filepath\": \"data/layouts/MtEmber_RubyPath_B1F_Stairs/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_RubyPath_B1F_Stairs/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_RUBY_PATH_B2F_STAIRS\",\n      \"name\": \"MtEmber_RubyPath_B2F_Stairs_Layout\",\n      \"width\": 8,\n      \"height\": 6,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_MtEmber\",\n      \"border_filepath\": \"data/layouts/MtEmber_RubyPath_B2F_Stairs/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_RubyPath_B2F_Stairs/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_MT_EMBER_RUBY_PATH_B5F\",\n      \"name\": \"MtEmber_RubyPath_B5F_Layout\",\n      \"width\": 16,\n      \"height\": 15,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_MtEmber\",\n      \"border_filepath\": \"data/layouts/MtEmber_RubyPath_B5F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/MtEmber_RubyPath_B5F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_ROCKET_WAREHOUSE\",\n      \"name\": \"FiveIsland_RocketWarehouse_Layout\",\n      \"width\": 29,\n      \"height\": 27,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/FiveIsland_RocketWarehouse/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_RocketWarehouse/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE\",\n      \"name\": \"FourIsland_IcefallCave_Entrance_Layout\",\n      \"width\": 30,\n      \"height\": 36,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeafoamIslands\",\n      \"border_filepath\": \"data/layouts/FourIsland_IcefallCave_Entrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FourIsland_IcefallCave_Entrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_1F\",\n      \"name\": \"FourIsland_IcefallCave_1F_Layout\",\n      \"width\": 20,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeafoamIslands\",\n      \"border_filepath\": \"data/layouts/FourIsland_IcefallCave_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FourIsland_IcefallCave_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_B1F\",\n      \"name\": \"FourIsland_IcefallCave_B1F_Layout\",\n      \"width\": 24,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeafoamIslands\",\n      \"border_filepath\": \"data/layouts/FourIsland_IcefallCave_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FourIsland_IcefallCave_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_BACK\",\n      \"name\": \"FourIsland_IcefallCave_Back_Layout\",\n      \"width\": 25,\n      \"height\": 26,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeafoamIslands\",\n      \"border_filepath\": \"data/layouts/FourIsland_IcefallCave_Back/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FourIsland_IcefallCave_Back/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_LOBBY\",\n      \"name\": \"TrainerTower_Lobby_Layout\",\n      \"width\": 19,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_Lobby/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_Lobby/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_1F\",\n      \"name\": \"TrainerTower_1F_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_2F\",\n      \"name\": \"TrainerTower_2F_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_3F\",\n      \"name\": \"TrainerTower_3F_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_4F\",\n      \"name\": \"TrainerTower_4F_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_4F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_4F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_5F\",\n      \"name\": \"TrainerTower_5F_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_5F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_5F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_6F\",\n      \"name\": \"TrainerTower_6F_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_6F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_6F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_7F\",\n      \"name\": \"TrainerTower_7F_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_7F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_7F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_8F\",\n      \"name\": \"TrainerTower_8F_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_8F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_8F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_ROOF\",\n      \"name\": \"TrainerTower_Roof_Layout\",\n      \"width\": 18,\n      \"height\": 16,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_Roof/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_Roof/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_ELEVATOR\",\n      \"name\": \"TrainerTower_Elevator_Layout\",\n      \"width\": 5,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/TrainerTower_Elevator/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_Elevator/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CITY_HOUSE5\",\n      \"name\": \"CeruleanCity_House5_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_GenericBuilding2\",\n      \"border_filepath\": \"data/layouts/CeruleanCity_House5/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCity_House5/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"name\": \"SixIsland_DottedHole_1F_Layout\",\n      \"width\": 16,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/SixIsland_DottedHole_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland_DottedHole_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND_DOTTED_HOLE_B1F\",\n      \"name\": \"SixIsland_DottedHole_B1F_Layout\",\n      \"width\": 13,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/SixIsland_DottedHole_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland_DottedHole_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND_DOTTED_HOLE_B2F\",\n      \"name\": \"SixIsland_DottedHole_B2F_Layout\",\n      \"width\": 13,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/SixIsland_DottedHole_B2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland_DottedHole_B2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND_DOTTED_HOLE_B3F\",\n      \"name\": \"SixIsland_DottedHole_B3F_Layout\",\n      \"width\": 13,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/SixIsland_DottedHole_B3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland_DottedHole_B3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND_DOTTED_HOLE_B4F\",\n      \"name\": \"SixIsland_DottedHole_B4F_Layout\",\n      \"width\": 13,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/SixIsland_DottedHole_B4F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland_DottedHole_B4F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM\",\n      \"name\": \"SixIsland_DottedHole_SapphireRoom_Layout\",\n      \"width\": 16,\n      \"height\": 15,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/SixIsland_DottedHole_SapphireRoom/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland_DottedHole_SapphireRoom/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ISLAND_HARBOR\",\n      \"name\": \"Island_Harbor_Layout\",\n      \"width\": 17,\n      \"height\": 13,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_IslandHarbor\",\n      \"border_filepath\": \"data/layouts/Island_Harbor/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Island_Harbor/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ONE_ISLAND_POKEMON_CENTER_2F\",\n      \"name\": \"OneIsland_PokemonCenter_2F_Layout\",\n      \"width\": 15,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_PokemonCenter\",\n      \"border_filepath\": \"data/layouts/OneIsland_PokemonCenter_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/OneIsland_PokemonCenter_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND_PATTERN_BUSH\",\n      \"name\": \"SixIsland_PatternBush_Layout\",\n      \"width\": 60,\n      \"height\": 32,\n      \"border_width\": 3,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands6\",\n      \"border_filepath\": \"data/layouts/SixIsland_PatternBush/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland_PatternBush/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_THREE_ISLAND_DUNSPARCE_TUNNEL\",\n      \"name\": \"ThreeIsland_DunsparceTunnel_Layout\",\n      \"width\": 30,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/ThreeIsland_DunsparceTunnel/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ThreeIsland_DunsparceTunnel/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_THREE_ISLAND_DUNSPARCE_TUNNEL_DUG_OUT\",\n      \"name\": \"ThreeIsland_DunsparceTunnel_DugOut_Layout\",\n      \"width\": 30,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/ThreeIsland_DunsparceTunnel_DugOut/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ThreeIsland_DunsparceTunnel_DugOut/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ENTRANCE\",\n      \"name\": \"FiveIsland_LostCave_Entrance_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Entrance/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Entrance/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"name\": \"FiveIsland_LostCave_Room1_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room1/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room1/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM2\",\n      \"name\": \"FiveIsland_LostCave_Room2_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room2/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room2/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM3\",\n      \"name\": \"FiveIsland_LostCave_Room3_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room3/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room3/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM4\",\n      \"name\": \"FiveIsland_LostCave_Room4_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room4/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room4/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM5\",\n      \"name\": \"FiveIsland_LostCave_Room5_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room5/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room5/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM6\",\n      \"name\": \"FiveIsland_LostCave_Room6_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room6/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room6/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM7\",\n      \"name\": \"FiveIsland_LostCave_Room7_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room7/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room7/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM8\",\n      \"name\": \"FiveIsland_LostCave_Room8_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room8/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room8/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM9\",\n      \"name\": \"FiveIsland_LostCave_Room9_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room9/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room9/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM10\",\n      \"name\": \"FiveIsland_LostCave_Room10_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room10/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room10/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM11\",\n      \"name\": \"FiveIsland_LostCave_Room11_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room11/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room11/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM12\",\n      \"name\": \"FiveIsland_LostCave_Room12_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room12/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room12/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM13\",\n      \"name\": \"FiveIsland_LostCave_Room13_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room13/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room13/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM14\",\n      \"name\": \"FiveIsland_LostCave_Room14_Layout\",\n      \"width\": 11,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/FiveIsland_LostCave_Room14/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FiveIsland_LostCave_Room14/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER\",\n      \"name\": \"SevenIsland_TanobyRuins_MoneanChamber_Layout\",\n      \"width\": 23,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TanobyRuins\",\n      \"border_filepath\": \"data/layouts/SevenIsland_TanobyRuins_MoneanChamber/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_TanobyRuins_MoneanChamber/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER\",\n      \"name\": \"SevenIsland_TanobyRuins_LiptooChamber_Layout\",\n      \"width\": 23,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TanobyRuins\",\n      \"border_filepath\": \"data/layouts/SevenIsland_TanobyRuins_LiptooChamber/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_TanobyRuins_LiptooChamber/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER\",\n      \"name\": \"SevenIsland_TanobyRuins_WeepthChamber_Layout\",\n      \"width\": 23,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TanobyRuins\",\n      \"border_filepath\": \"data/layouts/SevenIsland_TanobyRuins_WeepthChamber/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_TanobyRuins_WeepthChamber/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER\",\n      \"name\": \"SevenIsland_TanobyRuins_DilfordChamber_Layout\",\n      \"width\": 23,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TanobyRuins\",\n      \"border_filepath\": \"data/layouts/SevenIsland_TanobyRuins_DilfordChamber/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_TanobyRuins_DilfordChamber/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER\",\n      \"name\": \"SevenIsland_TanobyRuins_ScufibChamber_Layout\",\n      \"width\": 23,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TanobyRuins\",\n      \"border_filepath\": \"data/layouts/SevenIsland_TanobyRuins_ScufibChamber/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_TanobyRuins_ScufibChamber/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SIX_ISLAND_ALTERING_CAVE\",\n      \"name\": \"SixIsland_AlteringCave_Layout\",\n      \"width\": 32,\n      \"height\": 24,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_RockTunnel\",\n      \"border_filepath\": \"data/layouts/SixIsland_AlteringCave/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SixIsland_AlteringCave/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY\",\n      \"name\": \"SevenIsland_SevaultCanyon_TanobyKey_Layout\",\n      \"width\": 15,\n      \"height\": 16,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_DiglettsCave\",\n      \"border_filepath\": \"data/layouts/SevenIsland_SevaultCanyon_TanobyKey/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_SevaultCanyon_TanobyKey/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_BIRTH_ISLAND_EXTERIOR\",\n      \"name\": \"BirthIsland_Exterior_Layout\",\n      \"width\": 30,\n      \"height\": 30,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands6\",\n      \"border_filepath\": \"data/layouts/BirthIsland_Exterior/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/BirthIsland_Exterior/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_EXTERIOR\",\n      \"name\": \"NavelRock_Exterior_Layout\",\n      \"width\": 20,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands6\",\n      \"border_filepath\": \"data/layouts/NavelRock_Exterior/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_Exterior/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_1F\",\n      \"name\": \"NavelRock_1F_Layout\",\n      \"width\": 17,\n      \"height\": 26,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_SUMMIT\",\n      \"name\": \"NavelRock_Summit_Layout\",\n      \"width\": 19,\n      \"height\": 25,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_Summit/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_Summit/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_BASE\",\n      \"name\": \"NavelRock_Base_Layout\",\n      \"width\": 21,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_Base/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_Base/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_SUMMIT_PATH_2F\",\n      \"name\": \"NavelRock_SummitPath_2F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_SummitPath_2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_SummitPath_2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_SUMMIT_PATH_3F\",\n      \"name\": \"NavelRock_SummitPath_3F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_SummitPath_3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_SummitPath_3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_SUMMIT_PATH_4F\",\n      \"name\": \"NavelRock_SummitPath_4F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_SummitPath_4F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_SummitPath_4F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_SUMMIT_PATH_5F\",\n      \"name\": \"NavelRock_SummitPath_5F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_SummitPath_5F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_SummitPath_5F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B1F\",\n      \"name\": \"NavelRock_BasePath_B1F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_BasePath_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_BasePath_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B2F\",\n      \"name\": \"NavelRock_BasePath_B2F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_BasePath_B2F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_BasePath_B2F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B3F\",\n      \"name\": \"NavelRock_BasePath_B3F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_BasePath_B3F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_BasePath_B3F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B4F\",\n      \"name\": \"NavelRock_BasePath_B4F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_BasePath_B4F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_BasePath_B4F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B5F\",\n      \"name\": \"NavelRock_BasePath_B5F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_BasePath_B5F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_BasePath_B5F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B6F\",\n      \"name\": \"NavelRock_BasePath_B6F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_BasePath_B6F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_BasePath_B6F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B7F\",\n      \"name\": \"NavelRock_BasePath_B7F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_BasePath_B7F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_BasePath_B7F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B8F\",\n      \"name\": \"NavelRock_BasePath_B8F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_BasePath_B8F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_BasePath_B8F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B9F\",\n      \"name\": \"NavelRock_BasePath_B9F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_BasePath_B9F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_BasePath_B9F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B10F\",\n      \"name\": \"NavelRock_BasePath_B10F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_BasePath_B10F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_BasePath_B10F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B11F\",\n      \"name\": \"NavelRock_BasePath_B11F_Layout\",\n      \"width\": 7,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_BasePath_B11F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_BasePath_B11F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER\",\n      \"name\": \"SevenIsland_TanobyRuins_RixyChamber_Layout\",\n      \"width\": 23,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TanobyRuins\",\n      \"border_filepath\": \"data/layouts/SevenIsland_TanobyRuins_RixyChamber/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_TanobyRuins_RixyChamber/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER\",\n      \"name\": \"SevenIsland_TanobyRuins_ViapoisChamber_Layout\",\n      \"width\": 23,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TanobyRuins\",\n      \"border_filepath\": \"data/layouts/SevenIsland_TanobyRuins_ViapoisChamber/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_TanobyRuins_ViapoisChamber/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_B1F\",\n      \"name\": \"NavelRock_B1F_Layout\",\n      \"width\": 17,\n      \"height\": 7,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_NAVEL_ROCK_FORK\",\n      \"name\": \"NavelRock_Fork_Layout\",\n      \"width\": 30,\n      \"height\": 100,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_NavelRock\",\n      \"border_filepath\": \"data/layouts/NavelRock_Fork/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/NavelRock_Fork/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_1F_DOUBLES\",\n      \"name\": \"TrainerTower_1F_Doubles_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_1F_Doubles/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_1F_Doubles/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_2F_DOUBLES\",\n      \"name\": \"TrainerTower_2F_Doubles_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_2F_Doubles/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_2F_Doubles/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_3F_DOUBLES\",\n      \"name\": \"TrainerTower_3F_Doubles_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_3F_Doubles/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_3F_Doubles/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_4F_DOUBLES\",\n      \"name\": \"TrainerTower_4F_Doubles_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_4F_Doubles/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_4F_Doubles/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_5F_DOUBLES\",\n      \"name\": \"TrainerTower_5F_Doubles_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_5F_Doubles/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_5F_Doubles/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_6F_DOUBLES\",\n      \"name\": \"TrainerTower_6F_Doubles_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_6F_Doubles/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_6F_Doubles/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_7F_DOUBLES\",\n      \"name\": \"TrainerTower_7F_Doubles_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_7F_Doubles/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_7F_Doubles/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_8F_DOUBLES\",\n      \"name\": \"TrainerTower_8F_Doubles_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_8F_Doubles/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_8F_Doubles/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_1F_KNOCKOUT\",\n      \"name\": \"TrainerTower_1F_Knockout_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_1F_Knockout/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_1F_Knockout/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_2F_KNOCKOUT\",\n      \"name\": \"TrainerTower_2F_Knockout_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_2F_Knockout/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_2F_Knockout/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_3F_KNOCKOUT\",\n      \"name\": \"TrainerTower_3F_Knockout_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_3F_Knockout/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_3F_Knockout/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_4F_KNOCKOUT\",\n      \"name\": \"TrainerTower_4F_Knockout_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_4F_Knockout/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_4F_Knockout/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_5F_KNOCKOUT\",\n      \"name\": \"TrainerTower_5F_Knockout_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_5F_Knockout/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_5F_Knockout/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_6F_KNOCKOUT\",\n      \"name\": \"TrainerTower_6F_Knockout_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_6F_Knockout/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_6F_Knockout/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_7F_KNOCKOUT\",\n      \"name\": \"TrainerTower_7F_Knockout_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_7F_Knockout/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_7F_Knockout/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_TRAINER_TOWER_8F_KNOCKOUT\",\n      \"name\": \"TrainerTower_8F_Knockout_Layout\",\n      \"width\": 18,\n      \"height\": 17,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_TrainerTower\",\n      \"border_filepath\": \"data/layouts/TrainerTower_8F_Knockout/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/TrainerTower_8F_Knockout/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SEVEN_ISLAND_HOUSE_ROOM1\",\n      \"name\": \"SevenIsland_House_Room1_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SeafoamIslands\",\n      \"border_filepath\": \"data/layouts/SevenIsland_House_Room1/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SevenIsland_House_Room1/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ONE_ISLAND_KINDLE_ROAD_EMBER_SPA\",\n      \"name\": \"OneIsland_KindleRoad_EmberSpa_Layout\",\n      \"width\": 27,\n      \"height\": 39,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_MtEmber\",\n      \"border_filepath\": \"data/layouts/OneIsland_KindleRoad_EmberSpa/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/OneIsland_KindleRoad_EmberSpa/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FARAWAY_ISLAND_EXTERIOR\",\n      \"name\": \"FarawayIsland_Exterior_Layout\",\n      \"width\": 34,\n      \"height\": 46,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands67\",\n      \"border_filepath\": \"data/layouts/FarawayIsland_Exterior/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FarawayIsland_Exterior/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FARAWAY_ISLAND_INTERIOR\",\n      \"name\": \"FarawayIsland_Interior_Layout\",\n      \"width\": 29,\n      \"height\": 26,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands67\",\n      \"border_filepath\": \"data/layouts/FarawayIsland_Interior/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FarawayIsland_Interior/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ONE_ISLAND_KINDLE_ROAD_GLASS_WORKSHOP\",\n      \"name\": \"OneIsland_KindleRoad_GlassWorkshop_Layout\",\n      \"width\": 11,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_HoennBuilding\",\n      \"border_filepath\": \"data/layouts/OneIsland_KindleRoad_GlassWorkshop/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/OneIsland_KindleRoad_GlassWorkshop/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ROUTE20_UNDERWATER\",\n      \"name\": \"Route20_Underwater_Layout\",\n      \"width\": 120,\n      \"height\": 20,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Underwater\",\n      \"border_filepath\": \"data/layouts/Route20_Underwater/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/Route20_Underwater/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_BATTLE_FRONTIER_OUTSIDE_WEST\",\n      \"name\": \"BattleFrontier_OutsideWest_Layout\",\n      \"width\": 56,\n      \"height\": 72,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_BattleFrontierOutsideWest\",\n      \"border_filepath\": \"data/layouts/BattleFrontier_OutsideWest/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/BattleFrontier_OutsideWest/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"name\": \"BattleFrontier_OutsideEast_Layout\",\n      \"width\": 72,\n      \"height\": 72,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_BattleFrontierOutsideEast\",\n      \"border_filepath\": \"data/layouts/BattleFrontier_OutsideEast/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/BattleFrontier_OutsideEast/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RS_BATTLE_TOWER_LOBBY\",\n      \"name\": \"RS_BattleTower_Lobby_Layout\",\n      \"width\": 14,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_BattleFrontier\",\n      \"border_filepath\": \"data/layouts/RS_BattleTower_Lobby/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RS_BattleTower_Lobby/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RS_BATTLE_TOWER_ELEVATOR\",\n      \"name\": \"RS_BattleTower_Elevator_Layout\",\n      \"width\": 5,\n      \"height\": 8,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_SilphCo\",\n      \"border_filepath\": \"data/layouts/RS_BattleTower_Elevator/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RS_BattleTower_Elevator/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RS_BATTLE_TOWER_CORRIDOR\",\n      \"name\": \"RS_BattleTower_Corridor_Layout\",\n      \"width\": 17,\n      \"height\": 5,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_BattleFrontier\",\n      \"border_filepath\": \"data/layouts/RS_BattleTower_Corridor/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RS_BattleTower_Corridor/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_RS_BATTLE_TOWER_BATTLE_ROOM\",\n      \"name\": \"RS_BattleTower_BattleRoom_Layout\",\n      \"width\": 10,\n      \"height\": 10,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_BattleFrontier\",\n      \"border_filepath\": \"data/layouts/RS_BattleTower_BattleRoom/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/RS_BattleTower_BattleRoom/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFARI_ZONE_NORTH_WEST\",\n      \"name\": \"SafariZone_NorthWest_Layout\",\n      \"width\": 52,\n      \"height\": 36,\n      \"border_width\": 3,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_FuchsiaCity\",\n      \"border_filepath\": \"data/layouts/SafariZone_NorthWest/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SafariZone_NorthWest/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SAFARI_ZONE_NORTH_EAST\",\n      \"name\": \"SafariZone_NorthEast_Layout\",\n      \"width\": 52,\n      \"height\": 36,\n      \"border_width\": 3,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_FuchsiaCity\",\n      \"border_filepath\": \"data/layouts/SafariZone_NorthEast/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SafariZone_NorthEast/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_THREE_ISLAND_BOND_BRIDGE_UNDERWATER\",\n      \"name\": \"ThreeIsland_BondBridge_Underwater_Layout\",\n      \"width\": 96,\n      \"height\": 40,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Underwater\",\n      \"border_filepath\": \"data/layouts/ThreeIsland_BondBridge_Underwater/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ThreeIsland_BondBridge_Underwater/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ARTISAN_CAVE_B1F\",\n      \"name\": \"ArtisanCave_B1F_Layout\",\n      \"width\": 46,\n      \"height\": 54,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/ArtisanCave_B1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ArtisanCave_B1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_ARTISAN_CAVE_1F\",\n      \"name\": \"ArtisanCave_1F_Layout\",\n      \"width\": 21,\n      \"height\": 22,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_Cave\",\n      \"border_filepath\": \"data/layouts/ArtisanCave_1F/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/ArtisanCave_1F/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SOUTHERN_ISLAND_EXTERIOR\",\n      \"name\": \"SouthernIsland_Exterior_Layout\",\n      \"width\": 33,\n      \"height\": 30,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands67\",\n      \"border_filepath\": \"data/layouts/SouthernIsland_Exterior/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SouthernIsland_Exterior/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_SOUTHERN_ISLAND_INTERIOR\",\n      \"name\": \"SouthernIsland_Interior_Layout\",\n      \"width\": 27,\n      \"height\": 24,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands67\",\n      \"border_filepath\": \"data/layouts/SouthernIsland_Interior/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/SouthernIsland_Interior/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CAVE_1F_BLUE\",\n      \"name\": \"CeruleanCave_1F_Blue_Layout\",\n      \"width\": 40,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCave\",\n      \"border_filepath\": \"data/layouts/CeruleanCave_1F_Blue/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCave_1F_Blue/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CAVE_2F_BLUE\",\n      \"name\": \"CeruleanCave_2F_Blue_Layout\",\n      \"width\": 40,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCave\",\n      \"border_filepath\": \"data/layouts/CeruleanCave_2F_Blue/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCave_2F_Blue/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CAVE_B1F_BLUE\",\n      \"name\": \"CeruleanCave_B1F_Blue_Layout\",\n      \"width\": 40,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCave\",\n      \"border_filepath\": \"data/layouts/CeruleanCave_B1F_Blue/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCave_B1F_Blue/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CAVE_1F_YELLOW\",\n      \"name\": \"CeruleanCave_1F_Yellow_Layout\",\n      \"width\": 40,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCave\",\n      \"border_filepath\": \"data/layouts/CeruleanCave_1F_Yellow/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCave_1F_Yellow/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CAVE_2F_YELLOW\",\n      \"name\": \"CeruleanCave_2F_Yellow_Layout\",\n      \"width\": 40,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCave\",\n      \"border_filepath\": \"data/layouts/CeruleanCave_2F_Yellow/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCave_2F_Yellow/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_CERULEAN_CAVE_B1F_YELLOW\",\n      \"name\": \"CeruleanCave_B1F_Yellow_Layout\",\n      \"width\": 40,\n      \"height\": 23,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_CeruleanCave\",\n      \"border_filepath\": \"data/layouts/CeruleanCave_B1F_Yellow/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/CeruleanCave_B1F_Yellow/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FOUR_ISLAND_BASE\",\n      \"name\": \"FourIsland_Base_Layout\",\n      \"width\": 33,\n      \"height\": 39,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_General\",\n      \"secondary_tileset\": \"gTileset_SeviiIslands45\",\n      \"border_filepath\": \"data/layouts/FourIsland_Base/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FourIsland_Base/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FOUR_ISLAND_BASE_CABLE_CAR_STATION\",\n      \"name\": \"FourIsland_Base_CableCarStation_Layout\",\n      \"width\": 13,\n      \"height\": 13,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_IslandHarbor\",\n      \"border_filepath\": \"data/layouts/FourIsland_Base_CableCarStation/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FourIsland_Base_CableCarStation/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_FOUR_ISLAND_CABLE_CAR_STATION\",\n      \"name\": \"FourIsland_CableCarStation_Layout\",\n      \"width\": 13,\n      \"height\": 13,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_IslandHarbor\",\n      \"border_filepath\": \"data/layouts/FourIsland_CableCarStation/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/FourIsland_CableCarStation/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_BATTLE_FRONTIER_LOUNGE2\",\n      \"name\": \"BattleFrontier_Lounge2_Layout\",\n      \"width\": 13,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_BattleFrontier\",\n      \"border_filepath\": \"data/layouts/BattleFrontier_Lounge2/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/BattleFrontier_Lounge2/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_BATTLE_FRONTIER_LOUNGE1\",\n      \"name\": \"BattleFrontier_Lounge1_Layout\",\n      \"width\": 9,\n      \"height\": 11,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_BattleFrontier\",\n      \"border_filepath\": \"data/layouts/BattleFrontier_Lounge1/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/BattleFrontier_Lounge1/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_BATTLE_FRONTIER_RECEPTION_GATE\",\n      \"name\": \"BattleFrontier_ReceptionGate_Layout\",\n      \"width\": 9,\n      \"height\": 14,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_BattleFrontier\",\n      \"border_filepath\": \"data/layouts/BattleFrontier_ReceptionGate/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/BattleFrontier_ReceptionGate/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER\",\n      \"name\": \"BattleFrontier_ExchangeServiceCorner_Layout\",\n      \"width\": 15,\n      \"height\": 12,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_BattleFrontier\",\n      \"border_filepath\": \"data/layouts/BattleFrontier_ExchangeServiceCorner/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/BattleFrontier_ExchangeServiceCorner/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_BATTLE_FRONTIER_SCOTTS_HOUSE\",\n      \"name\": \"BattleFrontier_ScottsHouse_Layout\",\n      \"width\": 7,\n      \"height\": 9,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_BattleFrontier\",\n      \"border_filepath\": \"data/layouts/BattleFrontier_ScottsHouse/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/BattleFrontier_ScottsHouse/map.bin\"\n    },\n    {\n      \"id\": \"LAYOUT_BATTLE_FRONTIER_RANKING_HALL\",\n      \"name\": \"BattleFrontier_RankingHall_Layout\",\n      \"width\": 47,\n      \"height\": 16,\n      \"border_width\": 2,\n      \"border_height\": 2,\n      \"primary_tileset\": \"gTileset_Building\",\n      \"secondary_tileset\": \"gTileset_BattleFrontierRankingHall\",\n      \"border_filepath\": \"data/layouts/BattleFrontier_RankingHall/border.bin\",\n      \"blockdata_filepath\": \"data/layouts/BattleFrontier_RankingHall/map.bin\"\n    }\n  ]\n}\n"
  },
  {
    "path": "data/map_events.s",
    "content": "#include \"constants/event_bg.h\"\n#include \"constants/event_object_movement.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/flags.h\"\n#include \"constants/items.h\"\n#include \"constants/map_scripts.h\"\n#include \"constants/layouts.h\"\n#include \"constants/maps.h\"\n#include \"constants/trainer_types.h\"\n#include \"constants/vars.h\"\n#include \"constants/weather.h\"\n    .include \"asm/macros.inc\"\n    .include \"constants/constants.inc\"\n\n    .section .rodata\n\n    .include \"data/maps/events.inc\"\n"
  },
  {
    "path": "data/maps/.gitignore",
    "content": "connections.inc\nevents.inc\ngroups.inc\nheaders.inc\n**/connections.inc\n**/events.inc\n**/header.inc\n"
  },
  {
    "path": "data/maps/ArtisanCave_1F/map.json",
    "content": "{\n  \"id\": \"MAP_ARTISAN_CAVE_1F\",\n  \"name\": \"ArtisanCave_1F\",\n  \"layout\": \"LAYOUT_ARTISAN_CAVE_1F\",\n  \"music\": \"MUS_PETALBURG_WOODS\",\n  \"region_map_section\": \"MAPSEC_ARTISAN_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ArtisanCave_1F_EventScript_ItemCarbos\",\n      \"flag\": \"FLAG_HIDE_ARTISAN_CAVE_B1F_CARBOS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 13\n    },\n    {\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ARTISAN_CAVE_B1F\",\n      \"dest_warp_id\": 1\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ArtisanCave_1F/scripts.inc",
    "content": "ArtisanCave_1F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/ArtisanCave_1F/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/ArtisanCave_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_ARTISAN_CAVE_B1F\",\n  \"name\": \"ArtisanCave_B1F\",\n  \"layout\": \"LAYOUT_ARTISAN_CAVE_B1F\",\n  \"music\": \"MUS_PETALBURG_WOODS\",\n  \"region_map_section\": \"MAPSEC_ARTISAN_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 38,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ArtisanCave_B1F_EventScript_ItemHPUp\",\n      \"flag\": \"FLAG_HIDE_ARTISAN_CAVE_B1F_HP_UP\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 48,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_RS_BATTLE_TOWER\",\n      \"dest_warp_id\": 1\n    },\n    {\n      \"x\": 38,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ARTISAN_CAVE_1F\",\n      \"dest_warp_id\": 1\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 32,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ZINC\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_ZINC\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 27,\n      \"y\": 8,\n      \"elevation\": 4,\n      \"item\": \"ITEM_CALCIUM\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_CALCIUM\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PROTEIN\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_PROTEIN\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 19,\n      \"y\": 43,\n      \"elevation\": 3,\n      \"item\": \"ITEM_IRON\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_IRON\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ArtisanCave_B1F/scripts.inc",
    "content": "ArtisanCave_B1F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/ArtisanCave_B1F/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleColosseum_2P/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_COLOSSEUM_2P\",\n  \"name\": \"BattleColosseum_2P\",\n  \"layout\": \"LAYOUT_BATTLE_COLOSSEUM_2P\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SPECIAL_AREA\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_LINK\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST\",\n      \"x\": 9,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BattleColosseum_2P_EventScript_Attendant\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"BattleColosseum_2P_EventScript_PlayerSpot0\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"BattleColosseum_2P_EventScript_PlayerSpot1\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleColosseum_2P/scripts.inc",
    "content": "BattleColosseum_2P_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleColosseum_4P/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_COLOSSEUM_4P\",\n  \"name\": \"BattleColosseum_4P\",\n  \"layout\": \"LAYOUT_BATTLE_COLOSSEUM_4P\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SPECIAL_AREA\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_LINK\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"BattleColosseum_4P_EventScript_PlayerSpot0\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 3,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"BattleColosseum_4P_EventScript_PlayerSpot2\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"BattleColosseum_4P_EventScript_PlayerSpot1\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"BattleColosseum_4P_EventScript_PlayerSpot3\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleColosseum_4P/scripts.inc",
    "content": "BattleColosseum_4P_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_ExchangeServiceCorner/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER\",\n  \"name\": \"BattleFrontier_ExchangeServiceCorner\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_3\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKER\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 6\n    },\n    {\n      \"x\": 6,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 6\n    },\n    {\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 6\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_ExchangeServiceCorner/scripts.inc",
    "content": "BattleFrontier_ExchangeServiceCorner_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_ExchangeServiceCorner/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge1/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_LOUNGE1\",\n  \"name\": \"BattleFrontier_Lounge1\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_LOUNGE1\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 5\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge1/scripts.inc",
    "content": "BattleFrontier_Lounge1_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge1/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge2/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_LOUNGE2\",\n  \"name\": \"BattleFrontier_Lounge2\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_LOUNGE2\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BATTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_WEST\",\n      \"dest_warp_id\": 3\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge2/scripts.inc",
    "content": "BattleFrontier_Lounge2_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge2/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge3/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_LOUNGE3\",\n  \"name\": \"BattleFrontier_Lounge3\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_LOUNGE1\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_3\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 9\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge3/scripts.inc",
    "content": "BattleFrontier_Lounge3_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge3/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge4/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_LOUNGE4\",\n  \"name\": \"BattleFrontier_Lounge4\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_LOUNGE1\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BATTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHEF\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_WEST\",\n      \"dest_warp_id\": 6\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge4/scripts.inc",
    "content": "BattleFrontier_Lounge4_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge4/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge5/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_LOUNGE5\",\n  \"name\": \"BattleFrontier_Lounge5\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_LOUNGE2\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 7\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge5/scripts.inc",
    "content": "BattleFrontier_Lounge5_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge5/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge6/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_LOUNGE6\",\n  \"name\": \"BattleFrontier_Lounge6\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_LOUNGE1\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 8\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge6/scripts.inc",
    "content": "BattleFrontier_Lounge6_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge6/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge7/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_LOUNGE7\",\n  \"name\": \"BattleFrontier_Lounge7\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_LOUNGE1\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_WEST\",\n      \"dest_warp_id\": 7\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge7/scripts.inc",
    "content": "BattleFrontier_Lounge7_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge7/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge8/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_LOUNGE8\",\n  \"name\": \"BattleFrontier_Lounge8\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_LOUNGE1\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 10\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge8/scripts.inc",
    "content": "BattleFrontier_Lounge8_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_Lounge8/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_MART\",\n  \"name\": \"BattleFrontier_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_MART\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_WEST\",\n      \"dest_warp_id\": 4\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_Mart/scripts.inc",
    "content": "BattleFrontier_Mart_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_Mart/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_OutsideEast/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n  \"name\": \"BattleFrontier_OutsideEast\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_OUTSIDE_EAST\",\n  \"music\": \"MUS_B_FRONTIER\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": 0,\n      \"map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_WEST\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 42,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 53,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 54,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 37,\n      \"y\": 32,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHEF\",\n      \"in_connection\": false,\n      \"x\": 41,\n      \"y\": 56,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 46,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKER\",\n      \"in_connection\": false,\n      \"x\": 34,\n      \"y\": 41,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 45,\n      \"y\": 47,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 59,\n      \"y\": 35,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 6,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 40,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 40,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MEOWTH\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 56,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUDOWOODO\",\n      \"in_connection\": false,\n      \"x\": 54,\n      \"y\": 62,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 42,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BATTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 51,\n      \"y\": 53,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_PSYCHIC_M\",\n      \"in_connection\": false,\n      \"x\": 62,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 6,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 30,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 54,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 54,\n      \"y\": 32,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 58,\n      \"y\": 55,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 48,\n      \"y\": 41,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 16,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 39,\n      \"y\": 29,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 1\n    },\n    {\n      \"x\": 45,\n      \"y\": 56,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 2\n    },\n    {\n      \"x\": 58,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 3\n    },\n    {\n      \"x\": 35,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_RANKING_HALL\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 4,\n      \"y\": 44,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_LOUNGE1\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 10,\n      \"y\": 28,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 22,\n      \"y\": 51,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_LOUNGE5\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_LOUNGE6\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 65,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_LOUNGE3\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 14,\n      \"y\": 51,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_LOUNGE8\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 21,\n      \"y\": 45,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 11\n    },\n    {\n      \"x\": 4,\n      \"y\": 51,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 28,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ARTISAN_CAVE_1F\",\n      \"dest_warp_id\": 0\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 43,\n      \"y\": 56,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 36,\n      \"y\": 34,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 62,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 29,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 32,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"NULL\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_OutsideEast/scripts.inc",
    "content": "BattleFrontier_OutsideEast_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_OutsideEast/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_OutsideWest/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_OUTSIDE_WEST\",\n  \"name\": \"BattleFrontier_OutsideWest\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_OUTSIDE_WEST\",\n  \"music\": \"MUS_B_FRONTIER\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"right\",\n      \"offset\": 0,\n      \"map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 38,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 70,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 68,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NavelRock_Harbor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 8,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 43,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 44,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 44,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKER\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 47,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_AND_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"in_connection\": false,\n      \"x\": 45,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 47,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 66,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 42,\n      \"y\": 48,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_3\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_ROTATE_CLOCKWISE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 42,\n      \"y\": 27,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_WEST\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 19,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_WEST\",\n      \"dest_warp_id\": 1\n    },\n    {\n      \"x\": 11,\n      \"y\": 38,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_WEST\",\n      \"dest_warp_id\": 2\n    },\n    {\n      \"x\": 45,\n      \"y\": 44,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_LOUNGE2\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 52,\n      \"y\": 51,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_MART\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 44,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 53,\n      \"y\": 44,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_LOUNGE4\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 5,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_LOUNGE7\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 26,\n      \"y\": 65,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_RECEPTION_GATE\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 26,\n      \"y\": 61,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_RECEPTION_GATE\",\n      \"dest_warp_id\": 1\n    },\n    {\n      \"x\": 39,\n      \"y\": 55,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ARTISAN_CAVE_B1F\",\n      \"dest_warp_id\": 0\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 45,\n      \"y\": 30,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 43,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"NULL\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_OutsideWest/scripts.inc",
    "content": "BattleFrontier_OutsideWest_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_OutsideWest/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F\",\n  \"name\": \"BattleFrontier_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_RS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BattleFrontier_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MEOWTH\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 12\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": 0\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_PokemonCenter_1F/scripts.inc",
    "content": "BattleFrontier_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nBattleFrontier_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_BATTLE_FRONTIER\n\tend\n\nBattleFrontier_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend"
  },
  {
    "path": "data/maps/BattleFrontier_PokemonCenter_1F/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F\",\n  \"name\": \"BattleFrontier_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_RS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": 1\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": 0\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_PokemonCenter_2F/scripts.inc",
    "content": "BattleFrontier_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0"
  },
  {
    "path": "data/maps/BattleFrontier_PokemonCenter_2F/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_RankingHall/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_RANKING_HALL\",\n  \"name\": \"BattleFrontier_RankingHall\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_RANKING_HALL\",\n  \"music\": \"MUS_LILYCOVE_MUSEUM\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 41,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 23,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_EAST\",\n      \"dest_warp_id\": 4\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 23,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 20,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 23,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 26,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 39,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 43,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 41,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"NULL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 33,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"NULL\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_RankingHall/scripts.inc",
    "content": "BattleFrontier_RankingHall_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_RankingHall/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_ReceptionGate/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_RECEPTION_GATE\",\n  \"name\": \"BattleFrontier_ReceptionGate\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_RECEPTION_GATE\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCOTT\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_WEST\",\n      \"dest_warp_id\": 8\n    },\n    {\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_WEST\",\n      \"dest_warp_id\": 9\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_ReceptionGate/scripts.inc",
    "content": "BattleFrontier_ReceptionGate_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_ReceptionGate/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BattleFrontier_ScottsHouse/map.json",
    "content": "{\n  \"id\": \"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE\",\n  \"name\": \"BattleFrontier_ScottsHouse\",\n  \"layout\": \"LAYOUT_BATTLE_FRONTIER_SCOTTS_HOUSE\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCOTT\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_BATTLE_FRONTIER_OUTSIDE_WEST\",\n      \"dest_warp_id\": 5\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BattleFrontier_ScottsHouse/scripts.inc",
    "content": "BattleFrontier_ScottsHouse_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/BattleFrontier_ScottsHouse/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/BirthIsland_Exterior/map.json",
    "content": "{\n  \"id\": \"MAP_BIRTH_ISLAND_EXTERIOR\",\n  \"name\": \"BirthIsland_Exterior\",\n  \"layout\": \"LAYOUT_BIRTH_ISLAND_EXTERIOR\",\n  \"music\": \"0xFFFF\",\n  \"region_map_section\": \"MAPSEC_BIRTH_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_METEORITE\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BirthIsland_Exterior_EventScript_Triangle\",\n      \"flag\": \"FLAG_HIDE_BIRTH_ISLAND_METEORITE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_DEOXYS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 15,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_BIRTH_ISLAND_HARBOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BirthIsland_Exterior/scripts.inc",
    "content": ".set LOCALID_DEOXYS_ROCK, 1\n.set LOCALID_DEOXYS,      2\n\nBirthIsland_Exterior_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, BirthIsland_Exterior_OnTransition\n\tmap_script MAP_SCRIPT_ON_RESUME, BirthIsland_Exterior_OnResume\n\tmap_script MAP_SCRIPT_ON_RETURN_TO_FIELD, BirthIsland_Exterior_OnReturnToField\n\t.byte 0\n\nBirthIsland_Exterior_OnReturnToField::\n\tspecial SetDeoxysTrianglePalette\n\tend\n\nBirthIsland_Exterior_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIOR\n\tsetvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_DEOXYS_N\n\tsetvar VAR_DEOXYS_INTERACTION_STEP_COUNTER, 0\n\tsetvar VAR_DEOXYS_INTERACTION_NUM, 0\n\tcall_if_set FLAG_FOUGHT_DEOXYS, BirthIsland_Exterior_EventScript_HideDeoxysAndPuzzle\n\tcall_if_unset FLAG_FOUGHT_DEOXYS, BirthIsland_Exterior_EventScript_TryShowDeoxysPuzzle\n\tend\n\nBirthIsland_Exterior_EventScript_HideDeoxysAndPuzzle::\n\tsetflag FLAG_HIDE_DEOXYS\n\tsetflag FLAG_HIDE_BIRTH_ISLAND_METEORITE\n\treturn\n\nBirthIsland_Exterior_EventScript_TryShowDeoxysPuzzle::\n\tgoto_if_set FLAG_DEOXYS_FLEW_AWAY, EventScript_Return\n\tclearflag FLAG_HIDE_BIRTH_ISLAND_METEORITE\n\tclearflag FLAG_SYS_DEOXYS_AWAKENED\n\treturn\n\nBirthIsland_Exterior_OnResume::\n\tcall_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, BirthIsland_Exterior_EventScript_TryRemoveDeoxys\n\tend\n\nBirthIsland_Exterior_EventScript_TryRemoveDeoxys::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return\n\tremoveobject LOCALID_DEOXYS\n\treturn\n\nBirthIsland_Exterior_EventScript_Triangle::\n\tlock\n\tfaceplayer\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tspecial DoDeoxysTriangleInteraction\n\twaitstate\n\tswitch VAR_RESULT\n\tcase 0, BirthIsland_Exterior_EventScript_NotSolved1\n\tcase 1, BirthIsland_Exterior_EventScript_NotSolved2\n\tcase 2, BirthIsland_Exterior_EventScript_Deoxys\n\tcase 3, BirthIsland_Exterior_EventScript_NotSolved3\n\tend\n\nBirthIsland_Exterior_EventScript_NotSolved1::\n\trelease\n\tend\n\nBirthIsland_Exterior_EventScript_NotSolved2::\n\trelease\n\tend\n\nBirthIsland_Exterior_EventScript_NotSolved3::\n\trelease\n\tend\n\nBirthIsland_Exterior_EventScript_Deoxys::\n\taddobject LOCALID_DEOXYS\n\twaitse\n\tsetfieldeffectargument 0, LOCALID_DEOXYS_ROCK\n\tsetfieldeffectargument 1, MAP_NUM(BIRTH_ISLAND_EXTERIOR)\n\tsetfieldeffectargument 2, MAP_GROUP(BIRTH_ISLAND_EXTERIOR)\n\tdofieldeffect FLDEFF_DESTROY_DEOXYS_ROCK\n\tplaybgm MUS_ENCOUNTER_DEOXYS, 0\n\twaitfieldeffect FLDEFF_DESTROY_DEOXYS_ROCK\n\tapplymovement LOCALID_DEOXYS, Movement_DeoxysApproach\n\twaitmovement 0\n\twaitse\n\tplaymoncry SPECIES_DEOXYS, CRY_MODE_ENCOUNTER\n\tdelay 40\n\twaitmoncry\n\tsetvar VAR_LAST_TALKED, LOCALID_DEOXYS\n\tseteventmon SPECIES_DEOXYS, 30\n\tsetflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecial StartLegendaryBattle\n\twaitstate\n\tclearflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_WON, BirthIsland_Exterior_EventScript_DefeatedDeoxys\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_RAN, BirthIsland_Exterior_EventScript_RanFromDeoxys\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, BirthIsland_Exterior_EventScript_RanFromDeoxys\n\tsetflag FLAG_FOUGHT_DEOXYS\n\trelease\n\tend\n\nBirthIsland_Exterior_EventScript_DefeatedDeoxys::\n\tsetflag FLAG_DEOXYS_FLEW_AWAY\n\tsetvar VAR_0x8004, SPECIES_DEOXYS\n\tgoto EventScript_MonFlewAway\n\tend\n\nBirthIsland_Exterior_EventScript_RanFromDeoxys::\n\tsetvar VAR_0x8004, SPECIES_DEOXYS\n\tgoto EventScript_MonFlewAway\n\tend\n\nMovement_DeoxysApproach:\n\twalk_slower_down\n\twalk_slower_down\n\twalk_slower_down\n\twalk_slower_down\n\twalk_slower_down\n\twalk_slower_down\n\twalk_slower_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/BirthIsland_Harbor/map.json",
    "content": "{\n  \"id\": \"MAP_BIRTH_ISLAND_HARBOR\",\n  \"name\": \"BirthIsland_Harbor\",\n  \"layout\": \"LAYOUT_ISLAND_HARBOR\",\n  \"music\": \"0xFFFF\",\n  \"region_map_section\": \"MAPSEC_BIRTH_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BirthIsland_Harbor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_BIRTH_ISLAND_EXTERIOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/BirthIsland_Harbor/scripts.inc",
    "content": "BirthIsland_Harbor_MapScripts::\n\t.byte 0\n\nBirthIsland_Harbor_EventScript_Sailor::\n\tlock\n\tfaceplayer\n\tmessage Text_WhereDoYouWantToSail\n\twaitmessage\n\tsetvar VAR_0x8004, SEAGALLOP_BIRTH_ISLAND\n\tmultichoice 20, 8, MULTICHOICE_SEAGALLOP_VERMILION, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToVermilionCity\n\tcase 1, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY\",\n  \"name\": \"CeladonCity\",\n  \"layout\": \"LAYOUT_CELADON_CITY\",\n  \"music\": \"MUS_CELADON\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE16\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE7\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 48,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_RocketGrunt1\",\n      \"flag\": \"FLAG_HIDE_CELADON_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_FatMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLIWRATH\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_Poliwrath\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_LittleGirl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 5,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_OldMan2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_SoftboiledTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 5,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_RocketGrunt2\",\n      \"flag\": \"FLAG_HIDE_CELADON_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_OldMan1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 52,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_CELADON_CITY_NORTH_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 35,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_CELADON_CITY_SOUTH_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_Boy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"clone\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"x\": -7,\n      \"y\": 21,\n      \"target_local_id\": 7,\n      \"target_map\": \"MAP_ROUTE16\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_ItemEther\",\n      \"flag\": \"FLAG_HIDE_CELADON_CITY_ETHER\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 47,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_SilphCoScientist\",\n      \"flag\": \"FLAG_HIDE_CELADON_ROCKETS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Grimer\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Victreebel\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 44,\n      \"y\": 36,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_EventScript_ItemSunStone\",\n      \"flag\": \"FLAG_HIDE_CELADON_CITY_SUN_STONE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 34,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_GAME_CORNER\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_1F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 30,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 48,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 39,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_GAME_CORNER_PRIZE_ROOM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 30,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_GYM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 37,\n      \"y\": 29,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_RESTAURANT\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 41,\n      \"y\": 29,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_HOUSE1\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 49,\n      \"y\": 29,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_HOTEL\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_1F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 30,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_1F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_1F\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 45,\n      \"y\": 23,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_EventScript_TrainerTips2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 38,\n      \"y\": 23,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_EventScript_PrizeExchangeSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 33,\n      \"y\": 23,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_EventScript_GameCornerSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 22,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_EventScript_CitySign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 26,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_EventScript_MansionSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 33,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_EventScript_TrainerTips1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 18,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_EventScript_DeptStoreSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_EventScript_GymSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 55,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PP_UP\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_PP_UP\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity/scripts.inc",
    "content": ".set LOCALID_FAT_MAN,   2\n.set LOCALID_POLIWRATH, 3\n.set LOCALID_GRIMER_MASTER, 16\n.set LOCALID_VICTREEBEL_MASTER, 17\n.set TRAINER, VAR_0x8009\n\nCeladonCity_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_OnTransition\n\t.byte 0\n\nCeladonCity_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_CELADON_CITY\n\tgoto CeladonCity_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nCeladonCity_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_GRIMER\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeladonCity_MapScript_GrimerMasterMovementType\n\tsetvar TRAINER, MASTER_VICTREEBEL\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeladonCity_MapScript_VictreebelMasterMovementType\n\tend\n\nCeladonCity_MapScript_GrimerMasterMovementType::\n\tsetobjectmovementtype LOCALID_GRIMER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeladonCity_MapScript_VictreebelMasterMovementType::\n\tsetobjectmovementtype LOCALID_VICTREEBEL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeladonCity_EventScript_LittleGirl::\n\tmsgbox CeladonCity_Text_GotMyKoffingInCinnabar, MSGBOX_NPC\n\tend\n\nCeladonCity_EventScript_OldMan1::\n\tlock\n\tmsgbox CeladonCity_Text_GymIsGreatFullOfWomen\n\trelease\n\tend\n\nCeladonCity_EventScript_Woman::\n\tmsgbox CeladonCity_Text_GameCornerIsBadForCitysImage, MSGBOX_NPC\n\tend\n\nCeladonCity_EventScript_OldMan2::\n\tmsgbox CeladonCity_Text_BlewItAllAtSlots, MSGBOX_NPC\n\tend\n\nCeladonCity_EventScript_SoftboiledTutor::\n\tgoto EventScript_SoftboiledTutor\n\tend\n\nCeladonCity_EventScript_FatMan::\n\tlock\n\tfaceplayer\n\tmsgbox CeladonCity_Text_MyTrustedPalPoliwrath\n\tclosemessage\n\tapplymovement LOCALID_FAT_MAN, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nCeladonCity_EventScript_Poliwrath::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_POLIWRATH, CRY_MODE_NORMAL\n\tmsgbox CeladonCity_Text_Poliwrath\n\tclosemessage\n\twaitmoncry\n\tapplymovement LOCALID_POLIWRATH, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nCeladonCity_EventScript_RocketGrunt1::\n\tmsgbox CeladonCity_Text_KeepOutOfTeamRocketsWay, MSGBOX_NPC\n\tend\n\nCeladonCity_EventScript_RocketGrunt2::\n\tmsgbox CeladonCity_Text_GetLostOrIllPunchYou, MSGBOX_NPC\n\tend\n\nCeladonCity_EventScript_Boy::\n\tmsgbox CeladonCity_Text_ScaldedTongueOnTea, MSGBOX_NPC\n\tend\n\nCeladonCity_EventScript_SilphCoScientist::\n\tmsgbox CeladonCity_Text_SomeoneStoleSilphScope, MSGBOX_NPC\n\tend\n\nCeladonCity_EventScript_TrainerTips1::\n\tmsgbox CeladonCity_Text_ExplainXAccuracyDireHit, MSGBOX_SIGN\n\tend\n\nCeladonCity_EventScript_CitySign::\n\tmsgbox CeladonCity_Text_CitySign, MSGBOX_SIGN\n\tend\n\nCeladonCity_EventScript_GymSign::\n\tlockall\n\tfamechecker FAMECHECKER_ERIKA, 0\n\tmsgbox CeladonCity_Text_GymSign\n\treleaseall\n\tend\n\nCeladonCity_EventScript_MansionSign::\n\tmsgbox CeladonCity_Text_MansionSign, MSGBOX_SIGN\n\tend\n\nCeladonCity_EventScript_DeptStoreSign::\n\tmsgbox CeladonCity_Text_DeptStoreSign, MSGBOX_SIGN\n\tend\n\nCeladonCity_EventScript_TrainerTips2::\n\tmsgbox CeladonCity_Text_GuardSpecProtectsFromStatus, MSGBOX_SIGN\n\tend\n\nCeladonCity_EventScript_PrizeExchangeSign::\n\tmsgbox CeladonCity_Text_PrizeExchangeSign, MSGBOX_SIGN\n\tend\n\nCeladonCity_EventScript_GameCornerSign::\n\tmsgbox CeladonCity_Text_GameCornerSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity/text.inc",
    "content": "CeladonCity_Text_GotMyKoffingInCinnabar::\n    .string \"I got my KOFFING in CINNABAR.\\p\"\n    .string \"It's usually nice, but it breathes\\n\"\n    .string \"poison when it's angry.$\"\n\nCeladonCity_Text_GymIsGreatFullOfWomen::\n    .string \"Heheh! This GYM is great!\\n\"\n    .string \"It's full of women!$\"\n\nCeladonCity_Text_GameCornerIsBadForCitysImage::\n    .string \"CELADON takes pride in its efforts\\n\"\n    .string \"to keep the city beautiful.\\p\"\n    .string \"That's why the new GAME CORNER is\\n\"\n    .string \"bad for our city's image.$\"\n\nCeladonCity_Text_BlewItAllAtSlots::\n    .string \"Moan…\\n\"\n    .string \"I blew it all at the slots!\\p\"\n    .string \"I knew I should have cashed in my\\n\"\n    .string \"COINS for prizes!$\"\n\nCeladonCity_Text_MyTrustedPalPoliwrath::\n    .string \"This is my trusted pal, POLIWRATH.\\p\"\n    .string \"It evolved from a POLIWHIRL when\\n\"\n    .string \"I used a WATER STONE.$\"\n\nCeladonCity_Text_Poliwrath::\n    .string \"POLIWRATH: Ribi ribit!$\"\n\nCeladonCity_Text_GetLostOrIllPunchYou::\n    .string \"What are you staring at?\\n\"\n    .string \"Get lost, or I'll punch you.$\"\n\nCeladonCity_Text_KeepOutOfTeamRocketsWay::\n    .string \"Keep out of TEAM ROCKET's way!$\"\n\nCeladonCity_Text_ExplainXAccuracyDireHit::\n    .string \"TRAINER TIPS\\p\"\n    .string \"X ACCURACY boosts the accuracy of\\n\"\n    .string \"techniques.\\p\"\n    .string \"DIRE HIT jacks up the likelihood\\n\"\n    .string \"of critical hits.\\p\"\n    .string \"Get your items at the CELADON\\n\"\n    .string \"DEPT. STORE!$\"\n\nCeladonCity_Text_CitySign::\n    .string \"CELADON CITY\\n\"\n    .string \"The City of Rainbow Dreams$\"\n\nCeladonCity_Text_GymSign::\n    .string \"CELADON CITY POKéMON GYM\\n\"\n    .string \"LEADER: ERIKA\\l\"\n    .string \"The Nature-Loving Princess!$\"\n\nCeladonCity_Text_MansionSign::\n    .string \"CELADON MANSION$\"\n\nCeladonCity_Text_DeptStoreSign::\n    .string \"Find what you need at the\\n\"\n    .string \"CELADON DEPT. STORE!$\"\n\nCeladonCity_Text_GuardSpecProtectsFromStatus::\n    .string \"TRAINER TIPS\\p\"\n    .string \"GUARD SPEC. protects POKéMON\\n\"\n    .string \"from status-reduction moves during\\l\"\n    .string \"battle.\\p\"\n    .string \"Get your items at the\\n\"\n    .string \"CELADON DEPT. STORE!$\"\n\nCeladonCity_Text_PrizeExchangeSign::\n    .string \"COINS exchanged for prizes!\\n\"\n    .string \"PRIZE EXCHANGE$\"\n\nCeladonCity_Text_GameCornerSign::\n    .string \"ROCKET GAME CORNER\\n\"\n    .string \"The playground for grown-ups!$\"\n\nCeladonCity_Text_ScaldedTongueOnTea::\n    .string \"Aaaagh, ow…\\n\"\n    .string \"I scalded my tongue!\\p\"\n    .string \"This nice old lady in the MANSION\\n\"\n    .string \"gave me some TEA.\\p\"\n    .string \"But it was boiling hot!\\n\"\n    .string \"Gotta cool it to drink it.$\"\n\nText_SoftboiledTeach::\n    .string \"Hello, there!\\p\"\n    .string \"I've seen you about, but I never\\n\"\n    .string \"had a chance to chat.\\p\"\n    .string \"It must be good luck that brought\\n\"\n    .string \"us together finally.\\p\"\n    .string \"I'd like to celebrate by teaching\\n\"\n    .string \"you the move SOFTBOILED.$\"\n\nText_SoftboiledDeclined::\n    .string \"I'll always be keeping an eye out\\n\"\n    .string \"for you.\\p\"\n    .string \"I hope we can chat again.$\"\n\nText_SoftboiledWhichMon::\n    .string \"So, who's the POKéMON that gets\\n\"\n    .string \"the chance to learn SOFTBOILED?$\"\n\nText_SoftboiledTaught::\n    .string \"I wish you the best of luck!$\"\n\nText_SoftboiledReteach::\n    .string \"Hello again!\\p\"\n    .string \"Did you stop by to chat, or would\\n\"\n    .string \"you like me to teach SOFTBOILED\\l\"\n    .string \"to your POKéMON?\\p\"\n    .string \"I can teach it again for\\n\"\n    .string \"only ¥5000!$\"\n\nText_SoftboiledReteach2::\n    .string \"Would you like me to teach\\n\"\n    .string \"your POKéMON SOFTBOILED?$\"\n\nText_SoftboiledNotEnoughMoney::\n    .string \"You don't have ¥5000!\\n\"\n    .string \"Come back again when you do.$\"\n\nCeladonCity_Text_SomeoneStoleSilphScope::\n    .string \"Oh, what am I to do…\\p\"\n    .string \"Someone stole our SILPH SCOPE.\\p\"\n    .string \"The thief came running this way,\\n\"\n    .string \"I'm sure of it.\\p\"\n    .string \"But I lost sight of him!\\n\"\n    .string \"Where'd he go?$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_1F/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_CONDOMINIUMS_1F\",\n  \"name\": \"CeladonCity_Condominiums_1F\",\n  \"layout\": \"LAYOUT_CELADON_CITY_CONDOMINIUMS_1F\",\n  \"music\": \"MUS_CELADON\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MEOWTH\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_1F_EventScript_Meowth\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLEFAIRY\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_1F_EventScript_Clefairy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NIDORAN_F\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_1F_EventScript_Nidoran\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_1F_EventScript_TeaWoman\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_2F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"11\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Condominiums_1F_EventScript_SuiteSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Condominiums_1F_EventScript_SuiteSign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_1F/scripts.inc",
    "content": "CeladonCity_Condominiums_1F_MapScripts::\n\t.byte 0\n\nCeladonCity_Condominiums_1F_EventScript_TeaWoman::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TALKED_TO_TEA_LADY_AFTER_HOF, CeladonCity_Condominiums_1F_EventScript_TeaWomanAfterTea\n\tgoto_if_set FLAG_SYS_GAME_CLEAR, CeladonCity_Condominiums_1F_EventScript_TeaWomanMentionDaisy\n\tgoto_if_set FLAG_GOT_TEA, CeladonCity_Condominiums_1F_EventScript_TeaWomanAfterTea\n\tmsgbox CeladonCity_Condominiums_1F_Text_TryThisDrinkInstead\n\tsetflag FLAG_GOT_TEA\n\tgiveitem ITEM_TEA\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_BagIsFull\n\tmsgbox CeladonCity_Condominiums_1F_Text_NothingBeatsThirstLikeTea\n\trelease\n\tend\n\nCeladonCity_Condominiums_1F_EventScript_TeaWomanAfterTea::\n\tmsgbox CeladonCity_Condominiums_1F_Text_MyDearMonsKeepMeCompany\n\trelease\n\tend\n\nCeladonCity_Condominiums_1F_EventScript_TeaWomanMentionDaisy::\n\tfamechecker FAMECHECKER_DAISY, 4\n\tsetflag FLAG_TALKED_TO_TEA_LADY_AFTER_HOF\n\tmsgbox CeladonCity_Condominiums_1F_Text_DaisyComesToBuyTea\n\trelease\n\tend\n\nCeladonCity_Condominiums_1F_EventScript_Meowth::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_MEOWTH, CRY_MODE_NORMAL\n\tmsgbox CeladonCity_Condominiums_1F_Text_Meowth\n\twaitmoncry\n\trelease\n\tend\n\nCeladonCity_Condominiums_1F_EventScript_Clefairy::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_CLEFAIRY, CRY_MODE_NORMAL\n\tmsgbox CeladonCity_Condominiums_1F_Text_Clefairy\n\twaitmoncry\n\trelease\n\tend\n\nCeladonCity_Condominiums_1F_EventScript_Nidoran::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_NIDORAN_F, CRY_MODE_NORMAL\n\tmsgbox CeladonCity_Condominiums_1F_Text_Nidoran\n\twaitmoncry\n\trelease\n\tend\n\nCeladonCity_Condominiums_1F_EventScript_SuiteSign::\n\tmsgbox CeladonCity_Condominiums_1F_Text_ManagersSuite, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_1F/text.inc",
    "content": "CeladonCity_Condominiums_1F_Text_Meowth::\n    .string \"MEOWTH: Meow!$\"\n\nCeladonCity_Condominiums_1F_Text_TryThisDrinkInstead::\n    .string \"You shouldn't spend all your money\\n\"\n    .string \"on drinks.\\p\"\n    .string \"Try this instead.$\"\n\nCeladonCity_Condominiums_1F_Text_NothingBeatsThirstLikeTea::\n    .string \"Nothing beats thirst like some hot\\n\"\n    .string \"TEA.\\p\"\n    .string \"It really is the best.$\"\n\nCeladonCity_Condominiums_1F_Text_MyDearMonsKeepMeCompany::\n    .string \"My dear POKéMON keep me company.\\n\"\n    .string \"MEOWTH even brings money home!$\"\n\nCeladonCity_Condominiums_1F_Text_DaisyComesToBuyTea::\n    .string \"Oh, hello, dearie.\\n\"\n    .string \"Did you enjoy my TEA?\\p\"\n    .string \"By the way, dear. Are you, by any\\n\"\n    .string \"chance, from PALLET TOWN?\\p\"\n    .string \"A girl from PALLET TOWN, DAISY,\\n\"\n    .string \"she enjoys TEA every day.\\p\"\n    .string \"She visits the CELADON DEPT. STORE\\n\"\n    .string \"to buy some TEA.$\"\n\nCeladonCity_Condominiums_1F_Text_Clefairy::\n    .string \"CLEFAIRY: Pi pippippi!$\"\n\nCeladonCity_Condominiums_1F_Text_Nidoran::\n    .string \"NIDORAN♀: Kya kyaoo!$\"\n\nCeladonCity_Condominiums_1F_Text_ManagersSuite::\n    .string \"CELADON MANSION\\n\"\n    .string \"Manager's Suite$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_2F/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_CONDOMINIUMS_2F\",\n  \"name\": \"CeladonCity_Condominiums_2F\",\n  \"layout\": \"LAYOUT_CELADON_CITY_CONDOMINIUMS_2F\",\n  \"music\": \"MUS_CELADON\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_2F_EventScript_PokemonJournalErika\",\n      \"flag\": \"FLAG_HIDE_FAME_CHECKER_ERIKA_JOURNALS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_2F_EventScript_PokemonJournalErika\",\n      \"flag\": \"FLAG_HIDE_FAME_CHECKER_ERIKA_JOURNALS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_PSYCHIC_M\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_MrMime\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_3F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_3F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_1F\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Condominiums_2F_EventScript_MeetingRoomSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Condominiums_2F_EventScript_MeetingRoomSign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_2F/scripts.inc",
    "content": ".set LOCALID_MR_MIME_MASTER, 3\n.set TRAINER, VAR_0x8009\n\nCeladonCity_Condominiums_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_Condominiums_2F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nCeladonCity_Condominiums_2F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_MR_MIME\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeladonCity_Condominiums_2F_MapScript_MrMimeMasterMovementType\n\tend\n\nCeladonCity_Condominiums_2F_MapScript_MrMimeMasterMovementType::\n\tsetobjectmovementtype LOCALID_MR_MIME_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeladonCity_Condominiums_2F_EventScript_MeetingRoomSign::\n\tmsgbox CeladonCity_Condominiums_2F_Text_GameFreakMeetingRoom, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_2F/text.inc",
    "content": "CeladonCity_Condominiums_2F_Text_GameFreakMeetingRoom::\n    .string \"GAME FREAK Meeting Room$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_3F/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_CONDOMINIUMS_3F\",\n  \"name\": \"CeladonCity_Condominiums_3F\",\n  \"layout\": \"LAYOUT_CELADON_CITY_CONDOMINIUMS_3F\",\n  \"music\": \"MUS_CELADON\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKER\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_Programmer\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_Designer\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_GraphicArtist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_Writer\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_TitleGiver\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_ROOF\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_ROOF\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_2F\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_DevelopmentRoomSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_Computer1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_Computer2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_Computer3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_DevelopmentRoomSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 0,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_Computer3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 0,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_Computer1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CeladonCity_Condominiums_3F_EventScript_Computer2\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_3F/scripts.inc",
    "content": "CeladonCity_Condominiums_3F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CeladonCity_Condominiums_3F_OnFrame\n\t.byte 0\n\nCeladonCity_Condominiums_3F_OnFrame::\n\tmap_script_2 VAR_TEMP_0, 2, CeladonCity_Condominiums_3F_EventScript_CheckMysticTicket\n\t.2byte 0\n\nCeladonCity_Condominiums_3F_EventScript_Programmer::\n\tmsgbox CeladonCity_Condominiums_3F_Text_ImTheProgrammer, MSGBOX_NPC\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_GraphicArtist::\n\tmsgbox CeladonCity_Condominiums_3F_Text_ImTheGraphicArtist, MSGBOX_NPC\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_Writer::\n\tmsgbox CeladonCity_Condominiums_3F_Text_IWroteTheStory, MSGBOX_NPC\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_Designer::\n\tlock\n\tfaceplayer\n\tspecialvar VAR_RESULT, HasAllKantoMons\n\tgoto_if_eq VAR_RESULT, TRUE, CeladonCity_Condominiums_3F_EventScript_CompletedPokedex\n\tmsgbox CeladonCity_Condominiums_3F_Text_ImGameDesignerShowMeFinishedPokedex\n\trelease\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_CompletedPokedex::\n\tgoto CeladonCity_Condominiums_3F_EventScript_ShowDiploma\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_ShowDiploma::\n\tmessage CeladonCity_Condominiums_3F_Text_CompletedPokedexCongratulations\n\twaitmessage\n\tdelay 60\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tsetvar VAR_TEMP_0, 2\n\tspecial ShowDiploma\n\twaitstate\nCeladonCity_Condominiums_3F_EventScript_CheckMysticTicket::\n\tsetvar VAR_TEMP_0, 0\n\tcheckitem ITEM_MYSTIC_TICKET, 1\n\tcompare VAR_RESULT, FALSE\n\tgoto_if_eq CeladonCity_Condominiums_3F_EventScript_GiveMysticTicket\n\trelease\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_GiveMysticTicket::\n\tgoto_if_unset FLAG_SYS_RECEIVED_EXTENDED_DEX, CeladonCity_Condominiums_3F_EventScript_CantGiveMysticTicket\n\ttextcolor 0\n\tmsgbox CeladonCity_Condominiums_3F_Text_GiveMysticTicket\n\ttextcolor 3\n\tgiveitem ITEM_MYSTIC_TICKET, 1\n\tsetflag FLAG_RECEIVED_MYSTIC_TICKET\n\tsetflag FLAG_ENABLE_SHIP_NAVEL_ROCK\n\ttextcolor 0\n\tmsgbox CeladonCity_Condominiums_3F_Text_ExplainMysticTicket\n\trelease\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_CantGiveMysticTicket::\n\ttextcolor 0\n\tmsgbox CeladonCity_Condominiums_3F_Text_CantGiveMysticTicket\n\trelease\n\tend\n\nCeladonCity_Condominiums_3F_Text_CantGiveMysticTicket:\n\t.string \"I have a gift for filling up your\\n\"\n\t.string \"POKéDEX, but it's probably best to\\l\"\n\t.string \"wait until it's been upgraded first.\\p\"\n\t.string \"Come see me when your POKéDEX\\n\"\n\t.string \"can handle registering more POKéMON.$\"\n\nCeladonCity_Condominiums_3F_Text_GiveMysticTicket:\n\t.string \"Here's a little gift for filling up\\n\"\n\t.string \"your POKéDEX.$\"\n\nCeladonCity_Condominiums_3F_Text_ExplainMysticTicket:\n\t.string \"Bring that ticket to the docks in\\n\"\n\t.string \"VERMILION CITY.\\p\"\n\t.string \"With it, you can go to NAVEL ROCK\\n\"\n\t.string \"between FOUR and FIVE ISLAND.\\p\"\n\t.string \"Since you like catching POKéMON,\\n\"\n\t.string \"you'll want to see what's there.\\p\"\n\t.string \"Good luck!$\"\n\nCeladonCity_Condominiums_3F_EventScript_DevelopmentRoomSign::\n\tmsgbox CeladonCity_Condominiums_3F_Text_GameFreakDevelopmentRoom, MSGBOX_SIGN\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_Computer1::\n\tmsgbox CeladonCity_Condominiums_3F_Text_ItsTheGameProgram, MSGBOX_SIGN\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_Computer2::\n\tmsgbox CeladonCity_Condominiums_3F_Text_SomeonesPlayingGame, MSGBOX_SIGN\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_Computer3::\n\tmsgbox CeladonCity_Condominiums_3F_Text_ItsScriptBetterNotLookAtEnding, MSGBOX_SIGN\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_TitleGiver::\n\tlock\n\tfaceplayer\n\tcallnative CheckHasAnyMasterTitle\n\tcompare VAR_RESULT, FALSE\n\tgoto_if_eq CeladonCity_Condominiums_3F_EventScript_TitleGiver_NoTitles\n\tcallnative CheckCurrentMasterTitle\n\tcompare VAR_RESULT, 0\n\tcall_if_eq CeladonCity_Condominiums_3F_EventScript_TitleGiver_NoTitleSelected\n\tcompare VAR_RESULT, 0\n\tcall_if_ne CeladonCity_Condominiums_3F_EventScript_TitleGiver_TitleSelected\n\tsetvar VAR_0x8004, LISTMENU_MASTER_TRAINER_TITLES\n\tspecial ListMenu\n\twaitstate\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_Condominiums_3F_EventScript_TitleGiver_ChoseNoTitle\n\tcase 152, CeladonCity_Condominiums_3F_EventScript_TitleGiver_ChoseGrandMaster\n\tcase 153, CeladonCity_Condominiums_3F_EventScript_TitleGiver_PressedB\n\t// chose an actual mon\n\tcallnative SetCurrentMasterTitle\n\tbufferspeciesname STR_VAR_2, VAR_RESULT\n\tmsgbox CeladonCity_Condominiums_3F_Text_TitleGiver_ChoseMonMaster, MSGBOX_NPC\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_TitleGiver_NoTitles:\n\tmsgbox CeladonCity_Condominiums_3F_Text_TitleGiver_NoTitles, MSGBOX_NPC\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_TitleGiver_NoTitleSelected:\n\tmsgbox CeladonCity_Condominiums_3F_Text_TitleGiver_WelcomeNoTitle\n\treturn\n\nCeladonCity_Condominiums_3F_EventScript_TitleGiver_TitleSelected:\n\tcompare VAR_RESULT, 152\n\tcall_if_eq CeladonCity_Condominiums_3F_EventScript_TitleGiver_BufferGrand\n\tcompare VAR_RESULT, 152\n\tcall_if_ne CeladonCity_Condominiums_3F_EventScript_TitleGiver_BufferSpecies\n\tmsgbox CeladonCity_Condominiums_3F_Text_TitleGiver_WelcomeTitle\n\treturn\n\nCeladonCity_Condominiums_3F_EventScript_TitleGiver_BufferGrand:\n\tbufferstring 1, CeladonCity_Condominiums_3F_EventScript_TitleGiver_Grand\n\treturn\n\nCeladonCity_Condominiums_3F_EventScript_TitleGiver_BufferSpecies:\n\tbufferspeciesname STR_VAR_2, VAR_RESULT\n\treturn\n\nCeladonCity_Condominiums_3F_EventScript_TitleGiver_ChoseNoTitle:\n\tcallnative SetCurrentMasterTitle\n\tmsgbox CeladonCity_Condominiums_3F_Text_TitleGiver_ChoseNoTitles, MSGBOX_NPC\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_TitleGiver_ChoseGrandMaster:\n\tcallnative SetCurrentMasterTitle\n\tmsgbox CeladonCity_Condominiums_3F_Text_TitleGiver_ChoseGrandMaster, MSGBOX_NPC\n\tend\n\nCeladonCity_Condominiums_3F_EventScript_TitleGiver_PressedB:\n\tmsgbox CeladonCity_Condominiums_3F_Text_TitleGiver_PressedB, MSGBOX_NPC\n\tend\n\nCeladonCity_Condominiums_3F_Text_TitleGiver_NoTitles:\n\t.string \"Welcome!\\p\"\n\t.string \"You probably don't know what I'm\\n\"\n\t.string \"talking about, but come back once\\l\"\n\t.string \"you have earned a title!$\"\n\nCeladonCity_Condominiums_3F_Text_TitleGiver_WelcomeNoTitle:\n\t.string \"Welcome!\\p\"\n\t.string \"Or would you like me to call you\\n\"\n\t.string \"by a title?$\"\n\nCeladonCity_Condominiums_3F_Text_TitleGiver_WelcomeTitle:\n\t.string \"Welcome, {STR_VAR_2} MASTER!\\p\"\n\t.string \"Or would you like me to call you\\n\"\n\t.string \"by a different title?$\"\n\nCeladonCity_Condominiums_3F_Text_TitleGiver_ChoseNoTitles:\n\t.string \"Oh, you don't want to have a title?\\n\"\n\t.string \"I guess you really don't need one!$\"\n\nCeladonCity_Condominiums_3F_Text_TitleGiver_ChoseGrandMaster:\n\t.string \"Yo, GRAND MASTER!\\n\"\n\t.string \"A fitting title for you indeed.$\"\n\nCeladonCity_Condominiums_3F_Text_TitleGiver_PressedB:\n\t.string \"Oh, you're not going to change\\n\"\n\t.string \"your title?\\p\"\n\t.string \"I guess you really like the one\\n\"\n\t.string \"you have now!$\"\n\nCeladonCity_Condominiums_3F_Text_TitleGiver_ChoseMonMaster:\n\t.string \"Yo, {STR_VAR_2} MASTER!\\n\"\n\t.string \"A fitting title for you indeed.$\"\n\nCeladonCity_Condominiums_3F_EventScript_TitleGiver_Grand:\n\t.string \"GRAND$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_3F/text.inc",
    "content": "CeladonCity_Condominiums_3F_Text_ImTheProgrammer::\n    .string \"Me?\\n\"\n    .string \"I'm the programmer!$\"\n\nCeladonCity_Condominiums_3F_Text_ImTheGraphicArtist::\n    .string \"I'm the graphic artist!\\n\"\n    .string \"I drew you!$\"\n\nCeladonCity_Condominiums_3F_Text_IWroteTheStory::\n    .string \"I wrote the story!\\n\"\n    .string \"Isn't ERIKA cute?\\p\"\n    .string \"I like MISTY a lot, too!\\n\"\n    .string \"Oh, and SABRINA, I like her!$\"\n\nCeladonCity_Condominiums_3F_Text_ImGameDesignerShowMeFinishedPokedex::\n    .string \"Is that right?\\p\"\n    .string \"I'm the game designer!\\p\"\n    .string \"Filling up your POKéDEX is tough,\\n\"\n    .string \"but don't quit!\\p\"\n    .string \"When you finish, come tell me!$\"\n\nCeladonCity_Condominiums_3F_Text_CompletedPokedexCongratulations::\n    .string \"Wow! Excellent!\\n\"\n    .string \"You completed your POKéDEX!\\l\"\n    .string \"Congratulations!\\l\"\n    .string \"…$\"\n\nCeladonCity_Condominiums_3F_Text_ItsTheGameProgram::\n    .string \"It's the game program! Messing with\\n\"\n    .string \"it could bug out the game!$\"\n\nCeladonCity_Condominiums_3F_Text_SomeonesPlayingGame::\n    .string \"Someone's playing a game instead of\\n\"\n    .string \"working!$\"\n\nCeladonCity_Condominiums_3F_Text_ItsScriptBetterNotLookAtEnding::\n    .string \"It's the script!\\n\"\n    .string \"Better not look at the ending!$\"\n\nCeladonCity_Condominiums_3F_Text_GameFreakDevelopmentRoom::\n    .string \"GAME FREAK Development Room$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_Roof/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_CONDOMINIUMS_ROOF\",\n  \"name\": \"CeladonCity_Condominiums_Roof\",\n  \"layout\": \"LAYOUT_CELADON_CITY_CONDOMINIUMS_ROOF\",\n  \"music\": \"MUS_CELADON\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_3F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_3F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_ROOF_ROOM\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Condominiums_Roof_EventScript_Sign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Condominiums_Roof_EventScript_Sign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_Roof/scripts.inc",
    "content": "CeladonCity_Condominiums_Roof_MapScripts::\n\t.byte 0\n\nCeladonCity_Condominiums_Roof_EventScript_Sign::\n\tmsgbox CeladonCity_Condominiums_Roof_Text_IKnowEverything, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_Roof/text.inc",
    "content": "CeladonCity_Condominiums_Roof_Text_IKnowEverything::\n    .string \"I KNOW EVERYTHING!$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_RoofRoom/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_CONDOMINIUMS_ROOF_ROOM\",\n  \"name\": \"CeladonCity_Condominiums_RoofRoom\",\n  \"layout\": \"LAYOUT_CELADON_CITY_CONDOMINIUMS_ROOF_ROOM\",\n  \"music\": \"MUS_CELADON\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_RoofRoom_EventScript_BlackBelt\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Condominiums_RoofRoom_EventScript_EeveeBall\",\n      \"flag\": \"FLAG_HIDE_EEVEE_BALL\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Charmander\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_ROOF\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_ROOF\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_CONDOMINIUMS_ROOF\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Condominiums_RoofRoom_EventScript_Blackboard\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Condominiums_RoofRoom_EventScript_Blackboard\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Condominiums_RoofRoom_EventScript_TMsPamphlet\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_RoofRoom/scripts.inc",
    "content": ".set LOCALID_EEVEE_POKEBALL, 2\n.set LOCALID_CHARMANDER_MASTER, 3\n.set TRAINER, VAR_0x8009\n\nCeladonCity_Condominiums_RoofRoom_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_Condominiums_RoofRoom_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nCeladonCity_Condominiums_RoofRoom_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_CHARMANDER\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeladonCity_Condominiums_RoofRoom_MapScript_CharmanderMasterMovementType\n\tend\n\nCeladonCity_Condominiums_RoofRoom_MapScript_CharmanderMasterMovementType::\n\tsetobjectmovementtype LOCALID_CHARMANDER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeladonCity_Condominiums_RoofRoom_EventScript_BlackBelt::\n\tmsgbox CeladonCity_Condominiums_RoofRoom_Text_TheresNothingIDontKnow, MSGBOX_NPC\n\tend\n\nCeladonCity_Condominiums_RoofRoom_EventScript_EeveeBall::\n\tlock\n\tfaceplayer\n\tsetvar VAR_TEMP_1, SPECIES_EEVEE\n\tgivemon SPECIES_EEVEE, 25\n\tgoto_if_eq VAR_RESULT, 0, CeladonCity_Condominiums_RoofRoom_EventScript_GetEeveeParty\n\tgoto_if_eq VAR_RESULT, 1, CeladonCity_Condominiums_RoofRoom_EventScript_GetEeveePC\n\tgoto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon\n\trelease\n\tend\n\nCeladonCity_Condominiums_RoofRoom_EventScript_GetEeveeParty::\n\tremoveobject LOCALID_EEVEE_POKEBALL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage CeladonCity_Condominiums_RoofRoom_Text_ObtainedAnEevee\n\twaitmessage\n\twaitfanfare\n\tbufferspeciesname STR_VAR_1, SPECIES_EEVEE\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, CeladonCity_Condominiums_RoofRoom_EventScript_NicknameEeveeParty\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeladonCity_Condominiums_RoofRoom_EventScript_SetGotEevee\nCeladonCity_Condominiums_RoofRoom_EventScript_NicknameEeveeParty::\n\tcall EventScript_GetGiftMonPartySlot\n\tcall EventScript_ChangePokemonNickname\n\tgoto CeladonCity_Condominiums_RoofRoom_EventScript_SetGotEevee\n\tend\n\nCeladonCity_Condominiums_RoofRoom_EventScript_GetEeveePC::\n\tremoveobject LOCALID_EEVEE_POKEBALL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage CeladonCity_Condominiums_RoofRoom_Text_ObtainedAnEevee\n\twaitmessage\n\twaitfanfare\n\tbufferspeciesname STR_VAR_1, SPECIES_EEVEE\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, CeladonCity_Condominiums_RoofRoom_EventScript_NicknameEeveePC\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeladonCity_Condominiums_RoofRoom_EventScript_TransferEeveeToPC\nCeladonCity_Condominiums_RoofRoom_EventScript_NicknameEeveePC::\n\tcall EventScript_NameReceivedBoxMon\n\tgoto CeladonCity_Condominiums_RoofRoom_EventScript_TransferEeveeToPC\n\tend\n\nCeladonCity_Condominiums_RoofRoom_EventScript_TransferEeveeToPC::\n\tcall EventScript_TransferredToPC\n\tgoto CeladonCity_Condominiums_RoofRoom_EventScript_SetGotEevee\n\tend\n\nCeladonCity_Condominiums_RoofRoom_EventScript_SetGotEevee::\n\tsetflag FLAG_GOT_EEVEE\n\trelease\n\tend\n\nCeladonCity_Condominiums_RoofRoom_EventScript_TMsPamphlet::\n\tmsgbox CeladonCity_Condominiums_RoofRoom_Text_PamphletOnTMs, MSGBOX_SIGN\n\tend\n\nCeladonCity_Condominiums_RoofRoom_EventScript_Blackboard::\n\tlockall\n\tmsgbox CeladonCity_Condominiums_RoofRoom_Text_WirelessAdapterLecture\n\tmessage CeladonCity_Condominiums_RoofRoom_Text_ReadWhichHeading\n\twaitmessage\n\tsetvar VAR_0x8004, 4\n\tmultichoice 0, 0, MULTICHOICE_LINKED_DIRECT_UNION, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_Condominiums_RoofRoom_EventScript_WirelessClub\n\tcase 1, CeladonCity_Condominiums_RoofRoom_EventScript_DirectCorner\n\tcase 2, CeladonCity_Condominiums_RoofRoom_EventScript_UnionRoom\n\tcase 3, CeladonCity_Condominiums_RoofRoom_EventScript_ExitBlackboard\n\tcase 127, CeladonCity_Condominiums_RoofRoom_EventScript_ExitBlackboard\n\tend\n\nCeladonCity_Condominiums_RoofRoom_EventScript_ReadAnotherHeading::\n\tmessage CeladonCity_Condominiums_RoofRoom_Text_ReadWhichHeading\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_LINKED_DIRECT_UNION, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_Condominiums_RoofRoom_EventScript_WirelessClub\n\tcase 1, CeladonCity_Condominiums_RoofRoom_EventScript_DirectCorner\n\tcase 2, CeladonCity_Condominiums_RoofRoom_EventScript_UnionRoom\n\tcase 3, CeladonCity_Condominiums_RoofRoom_EventScript_ExitBlackboard\n\tcase 127, CeladonCity_Condominiums_RoofRoom_EventScript_ExitBlackboard\n\tend\n\nCeladonCity_Condominiums_RoofRoom_EventScript_WirelessClub::\n\tmsgbox CeladonCity_Condominiums_RoofRoom_Text_ExplainWirelessClub\n\tgoto CeladonCity_Condominiums_RoofRoom_EventScript_ReadAnotherHeading\n\tend\n\nCeladonCity_Condominiums_RoofRoom_EventScript_DirectCorner::\n\tmsgbox CeladonCity_Condominiums_RoofRoom_Text_ExplainDirectCorner\n\tgoto CeladonCity_Condominiums_RoofRoom_EventScript_ReadAnotherHeading\n\tend\n\nCeladonCity_Condominiums_RoofRoom_EventScript_UnionRoom::\n\tmsgbox CeladonCity_Condominiums_RoofRoom_Text_ExplainUnionRoom\n\tgoto CeladonCity_Condominiums_RoofRoom_EventScript_ReadAnotherHeading\n\tend\n\nCeladonCity_Condominiums_RoofRoom_EventScript_ExitBlackboard::\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_Condominiums_RoofRoom/text.inc",
    "content": "CeladonCity_Condominiums_RoofRoom_Text_TheresNothingIDontKnow::\n    .string \"There is nothing that I don't know,\\n\"\n    .string \"like I wrote on the blackboard.\\p\"\n    .string \"I know about the world of POKéMON\\n\"\n    .string \"in your GAME BOY ADVANCE!\\p\"\n    .string \"Get together with your friends and\\n\"\n    .string \"enjoy trading POKéMON!$\"\n\nCeladonCity_Condominiums_RoofRoom_Text_ObtainedAnEevee::\n    .string \"{PLAYER} obtained an EEVEE!$\"\n\nCeladonCity_Condominiums_RoofRoom_Text_WirelessAdapterLecture::\n    .string \"POKéMON Lecture\\p\"\n    .string \"Playing with the Wireless Adapter$\"\n\nCeladonCity_Condominiums_RoofRoom_Text_ReadWhichHeading::\n    .string \"Which heading do you want to read?$\"\n\nCeladonCity_Condominiums_RoofRoom_Text_ExplainWirelessClub::\n    .string \"The POKéMON WIRELESS CLUB is\\n\"\n    .string \"upstairs at any POKéMON CENTER.\\p\"\n    .string \"Visit one to link up with friend(s)\\n\"\n    .string \"using your Wireless Adapter.$\"\n\nCeladonCity_Condominiums_RoofRoom_Text_ExplainDirectCorner::\n    .string \"To link only with a friend, go to\\n\"\n    .string \"the DIRECT CORNER.\\p\"\n    .string \"It is the right counter at the\\n\"\n    .string \"POKéMON WIRELESS CLUB.\\p\"\n    .string \"Go into the TRADE CORNER or the\\n\"\n    .string \"COLOSSEUM with your friend.$\"\n\nCeladonCity_Condominiums_RoofRoom_Text_ExplainUnionRoom::\n    .string \"To link and communicate with\\n\"\n    .string \"anyone, go to the UNION ROOM.\\p\"\n    .string \"It is the left counter at the\\n\"\n    .string \"POKéMON WIRELESS CLUB.\\p\"\n    .string \"Go to the UNION ROOM and enjoy\\n\"\n    .string \"meeting other TRAINERS.$\"\n\nCeladonCity_Condominiums_RoofRoom_Text_PamphletOnTMs::\n    .string \"It's a pamphlet on TMs.\\p\"\n    .string \"… …\\p\"\n    .string \"There are fifty TMs in all.\\p\"\n    .string \"There are also seven HMs that\\n\"\n    .string \"can be used repeatedly.\\p\"\n    .string \"SILPH CO.$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_1F/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_1F\",\n  \"name\": \"CeladonCity_DepartmentStore_1F\",\n  \"layout\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_1F\",\n  \"music\": \"MUS_POKE_MART\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 1,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_1F_EventScript_Receptionist\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_2F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_1F_EventScript_LayoutSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_1F_EventScript_FloorSign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_1F/scripts.inc",
    "content": "CeladonCity_DepartmentStore_1F_MapScripts::\n\t.byte 0\n\nCeladonCity_DepartmentStore_1F_EventScript_Receptionist::\n\tmsgbox CeladonCity_DepartmentStore_1F_Text_WelcomeToDeptStore, MSGBOX_NPC\n\tend\n\nCeladonCity_DepartmentStore_1F_EventScript_LayoutSign::\n\tmsgbox CeladonCity_DepartmentStore_1F_Text_FloorDescriptions, MSGBOX_SIGN\n\tend\n\nCeladonCity_DepartmentStore_1F_EventScript_FloorSign::\n\tmsgbox CeladonCity_DepartmentStore_1F_Text_ServiceCounter, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_1F/text.inc",
    "content": "CeladonCity_DepartmentStore_1F_Text_WelcomeToDeptStore::\n    .string \"Hello!\\n\"\n    .string \"Welcome to CELADON DEPT. STORE.\\p\"\n    .string \"The board on the right describes\\n\"\n    .string \"the store layout.$\"\n\nCeladonCity_DepartmentStore_1F_Text_FloorDescriptions::\n    .string \"1F: SERVICE COUNTER\\p\"\n    .string \"2F: TRAINER'S MARKET\\p\"\n    .string \"3F: TV GAME SHOP\\p\"\n    .string \"4F: WISE MAN GIFTS\\p\"\n    .string \"5F: DRUGSTORE\\p\"\n    .string \"ROOFTOP SQUARE: VENDING MACHINES$\"\n\nCeladonCity_DepartmentStore_1F_Text_ServiceCounter::\n    .string \"1F: SERVICE COUNTER$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_2F/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_2F\",\n  \"name\": \"CeladonCity_DepartmentStore_2F\",\n  \"layout\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_2F\",\n  \"music\": \"MUS_POKE_MART\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 2,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_2F_EventScript_Lass\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_2F_EventScript_ClerkItems\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_2F_EventScript_ClerkTMs\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_2F_EventScript_Woman\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Vaporeon\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_1F\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_3F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_2F_EventScript_FloorSign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_2F/scripts.inc",
    "content": ".set LOCALID_VAPOREON_MASTER, 5\n.set TRAINER, VAR_0x8009\n\nCeladonCity_DepartmentStore_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_DepartmentStore_2F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nCeladonCity_DepartmentStore_2F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_VAPOREON\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeladonCity_DepartmentStore_2F_MapScript_VaporeonMasterMovementType\n\tend\n\nCeladonCity_DepartmentStore_2F_MapScript_VaporeonMasterMovementType::\n\tsetobjectmovementtype LOCALID_VAPOREON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeladonCity_DepartmentStore_2F_EventScript_UnusedNPC::\n\tmsgbox CeladonCity_DepartmentStore_2F_Text_SuperRepelMorePowerfulRepel, MSGBOX_NPC\n\tend\n\nCeladonCity_DepartmentStore_2F_EventScript_Lass::\n\tmsgbox CeladonCity_DepartmentStore_2F_Text_BuyReviveForLongOutings, MSGBOX_NPC\n\tend\n\nCeladonCity_DepartmentStore_2F_EventScript_FloorSign::\n\tmsgbox CeladonCity_DepartmentStore_2F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nCeladonCity_DepartmentStore_2F_EventScript_ClerkItems::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart CeladonCity_DepartmentStore_2F_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nCeladonCity_DepartmentStore_2F_Items::\n\t.2byte ITEM_GREAT_BALL\n\t.2byte ITEM_SUPER_POTION\n\t.2byte ITEM_REVIVE\n\t.2byte ITEM_ANTIDOTE\n\t.2byte ITEM_PARALYZE_HEAL\n\t.2byte ITEM_AWAKENING\n\t.2byte ITEM_BURN_HEAL\n\t.2byte ITEM_ICE_HEAL\n\t.2byte ITEM_SUPER_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nCeladonCity_DepartmentStore_2F_EventScript_ClerkTMs::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart CeladonCity_DepartmentStore_2F_TMs\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nCeladonCity_DepartmentStore_2F_TMs::\n\t.2byte ITEM_TM05\n\t.2byte ITEM_TM10\n\t.2byte ITEM_TM15\n\t.2byte ITEM_TM28\n\t.2byte ITEM_TM31\n\t.2byte ITEM_TM43\n\t.2byte ITEM_TM44\n\t.2byte ITEM_TM45\n\t.2byte ITEM_NONE\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_2F/text.inc",
    "content": "CeladonCity_DepartmentStore_2F_Text_SuperRepelMorePowerfulRepel::\n    .string \"SUPER REPEL keeps weak POKéMON at\\n\"\n    .string \"bay…\\p\"\n    .string \"Hmm, it's a more powerful REPEL.$\"\n\nCeladonCity_DepartmentStore_2F_Text_BuyReviveForLongOutings::\n    .string \"For long outings, you should buy\\n\"\n    .string \"REVIVE.$\"\n\nCeladonCity_DepartmentStore_2F_Text_FloorSign::\n    .string \"Top-Grade Items for TRAINERS!\\p\"\n    .string \"2F: TRAINER'S MARKET$\"\n\nCeladonCity_DepartmentStore_2F_Text_LanceComesToBuyCapes::\n    .string \"We have a customer, LANCE, who\\n\"\n    .string \"occasionally comes.\\p\"\n    .string \"He always buys capes.\\p\"\n    .string \"I wonder… Does he have many\\n\"\n    .string \"identical capes at home?$\"\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_3F/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_3F\",\n  \"name\": \"CeladonCity_DepartmentStore_3F\",\n  \"layout\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_3F\",\n  \"music\": \"MUS_POKE_MART\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 3,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_CounterTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GBA_KID\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_GBAKid1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GBA_KID\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_GBAKid3\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GBA_KID\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_GBAKid2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_LittleGirl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Jolteon\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_2F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_4F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_FloorSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_TV1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_TV2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_TV3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_TV4\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_SuperNES\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_SuperNES\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_SuperNES\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_SuperNES\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_Poster\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 0,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CeladonCity_DepartmentStore_3F_EventScript_Poster\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_3F/scripts.inc",
    "content": ".set LOCALID_JOLTEON_MASTER, 6\n.set TRAINER, VAR_0x8009\n\nCeladonCity_DepartmentStore_3F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_DepartmentStore_3F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nCeladonCity_DepartmentStore_3F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_JOLTEON\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeladonCity_DepartmentStore_3F_MapScript_JolteonMasterMovementType\n\tend\n\nCeladonCity_DepartmentStore_3F_MapScript_JolteonMasterMovementType::\n\tsetobjectmovementtype LOCALID_JOLTEON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeladonCity_DepartmentStore_3F_EventScript_CounterTutor::\n\tgoto EventScript_CounterTutor\n\tend\n\nCeladonCity_DepartmentStore_3F_EventScript_GBAKid1::\n\tmsgbox CeladonCity_DepartmentStore_3F_Text_OTStandsForOriginalTrainer, MSGBOX_NPC\n\tend\n\nCeladonCity_DepartmentStore_3F_EventScript_GBAKid2::\n\tmsgbox CeladonCity_DepartmentStore_3F_Text_BuddyTradingKangaskhanForHaunter, MSGBOX_NPC\n\tend\n\nCeladonCity_DepartmentStore_3F_EventScript_GBAKid3::\n\tmsgbox CeladonCity_DepartmentStore_3F_Text_HaunterEvolvedOnTrade, MSGBOX_NPC\n\tend\n\nCeladonCity_DepartmentStore_3F_EventScript_LittleGirl::\n\tmsgbox CeladonCity_DepartmentStore_3F_Text_CanIdentifyTradeMonsByID, MSGBOX_NPC\n\tend\n\nCeladonCity_DepartmentStore_3F_EventScript_SuperNES::\n\tmsgbox CeladonCity_DepartmentStore_3F_Text_ItsSuperNES, MSGBOX_SIGN\n\tend\n\nCeladonCity_DepartmentStore_3F_EventScript_TV1::\n\tmsgbox CeladonCity_DepartmentStore_3F_Text_AnRPG, MSGBOX_SIGN\n\tend\n\nCeladonCity_DepartmentStore_3F_EventScript_TV2::\n\tmsgbox CeladonCity_DepartmentStore_3F_Text_SportsGame, MSGBOX_SIGN\n\tend\n\nCeladonCity_DepartmentStore_3F_EventScript_TV3::\n\tmsgbox CeladonCity_DepartmentStore_3F_Text_PuzzleGame, MSGBOX_SIGN\n\tend\n\nCeladonCity_DepartmentStore_3F_EventScript_TV4::\n\tmsgbox CeladonCity_DepartmentStore_3F_Text_FightingGame, MSGBOX_SIGN\n\tend\n\nCeladonCity_DepartmentStore_3F_EventScript_FloorSign::\n\tmsgbox CeladonCity_DepartmentStore_3F_Text_TVGameShop, MSGBOX_SIGN\n\tend\n\nCeladonCity_DepartmentStore_3F_EventScript_Poster::\n\tmsgbox CeladonCity_DepartmentStore_3F_Text_RedGreenBothArePokemon, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_3F/text.inc",
    "content": "CeladonCity_DepartmentStore_3F_Text_OTStandsForOriginalTrainer::\n    .string \"Captured POKéMON are registered\\n\"\n    .string \"with an ID No. and the OT.\\p\"\n    .string \"OT stands for “Original TRAINER” -\\n\"\n    .string \"the TRAINER that caught it first.$\"\n\nCeladonCity_DepartmentStore_3F_Text_BuddyTradingKangaskhanForHaunter::\n    .string \"All right!\\p\"\n    .string \"My buddy's going to trade me his\\n\"\n    .string \"KANGASKHAN for my HAUNTER!$\"\n\nCeladonCity_DepartmentStore_3F_Text_HaunterEvolvedOnTrade::\n    .string \"Come on, HAUNTER!\\p\"\n    .string \"I love HAUNTER!\\n\"\n    .string \"I collect them!\\p\"\n    .string \"Huh?\\p\"\n    .string \"HAUNTER turned into a different\\n\"\n    .string \"POKéMON while being traded!$\"\n\nCeladonCity_DepartmentStore_3F_Text_CanIdentifyTradeMonsByID::\n    .string \"You can identify POKéMON you get\\n\"\n    .string \"in trades by their ID Numbers.$\"\n\nCeladonCity_DepartmentStore_3F_Text_ItsSuperNES::\n    .string \"It's a Super NES.$\"\n\nCeladonCity_DepartmentStore_3F_Text_AnRPG::\n    .string \"An RPG!\\n\"\n    .string \"There's no time for that!$\"\n\nCeladonCity_DepartmentStore_3F_Text_SportsGame::\n    .string \"A sports game!\\n\"\n    .string \"Dad'll like that!$\"\n\nCeladonCity_DepartmentStore_3F_Text_PuzzleGame::\n    .string \"A puzzle game!\\n\"\n    .string \"Looks addictive!$\"\n\nCeladonCity_DepartmentStore_3F_Text_FightingGame::\n    .string \"A fighting game!\\n\"\n    .string \"Looks tough!$\"\n\nCeladonCity_DepartmentStore_3F_Text_TVGameShop::\n    .string \"3F: TV GAME SHOP$\"\n\nCeladonCity_DepartmentStore_3F_Text_RedGreenBothArePokemon::\n    .string \"Red and Green!\\n\"\n    .string \"Both are POKéMON!$\"\n\nText_CounterTeach::\n    .string \"Oh, hi!\\n\"\n    .string \"I finally finished POKéMON.\\p\"\n    .string \"Not done yet? How about I teach\\n\"\n    .string \"you a good move?\\p\"\n    .string \"The move I have in mind is\\n\"\n    .string \"COUNTER.\\p\"\n    .string \"Not like the one I'm leaning on,\\n\"\n    .string \"mind you!$\"\n\nText_CounterDeclined::\n    .string \"You're not interested? Come see\\n\"\n    .string \"me if you change your mind.$\"\n\nText_CounterWhichMon::\n    .string \"Which POKéMON should I teach\\n\"\n    .string \"COUNTER to?$\"\n\nText_CounterTaught::\n    .string \"Are you using that COUNTER move\\n\"\n    .string \"I taught your POKéMON?$\"\n\nText_CounterReteach::\n    .string \"Still working away at POKéMON?\\n\"\n    .string \"I've moved onto the next big thing.\\p\"\n    .string \"If you want, I can teach you\\n\"\n    .string \"COUNTER again for ¥5000.$\"\n\nText_CounterReteach2::\n    .string \"Should I teach COUNTER to your\\n\"\n    .string \"POKéMON?$\"\n\nText_CounterNotEnoughMoney::\n    .string \"Kid, I need money for the next\\n\"\n    .string \"big game that's coming out soon!\\p\"\n    .string \"I can't help you out with COUNTER\\n\"\n    .string \"if you can't help me out by paying.$\"\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_4F/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_4F\",\n  \"name\": \"CeladonCity_DepartmentStore_4F\",\n  \"layout\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_4F\",\n  \"music\": \"MUS_POKE_MART\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 4,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_4F_EventScript_Man\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_4F_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_4F_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Flareon\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_3F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_5F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_4F_EventScript_FloorSign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_4F/scripts.inc",
    "content": ".set LOCALID_FLAREON_MASTER, 4\n.set TRAINER, VAR_0x8009\n\nCeladonCity_DepartmentStore_4F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_DepartmentStore_4F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nCeladonCity_DepartmentStore_4F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_FLAREON\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeladonCity_DepartmentStore_4F_MapScript_FlareonMasterMovementType\n\tend\n\nCeladonCity_DepartmentStore_4F_MapScript_FlareonMasterMovementType::\n\tsetobjectmovementtype LOCALID_FLAREON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeladonCity_DepartmentStore_4F_EventScript_Man::\n\tmsgbox CeladonCity_DepartmentStore_4F_Text_GettingPokeDollAsPresent, MSGBOX_NPC\n\tend\n\nCeladonCity_DepartmentStore_4F_EventScript_Youngster::\n\tmsgbox CeladonCity_DepartmentStore_4F_Text_CanRunAwayWithPokeDoll, MSGBOX_NPC\n\tend\n\nCeladonCity_DepartmentStore_4F_EventScript_FloorSign::\n\tmsgbox CeladonCity_DepartmentStore_4F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nCeladonCity_DepartmentStore_4F_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart CeladonCity_DepartmentStore_4F_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nCeladonCity_DepartmentStore_4F_Items::\n\t.2byte ITEM_POKE_DOLL\n\t.2byte ITEM_RETRO_MAIL\n\t.2byte ITEM_FIRE_STONE\n\t.2byte ITEM_THUNDER_STONE\n\t.2byte ITEM_WATER_STONE\n\t.2byte ITEM_LEAF_STONE\n\t.2byte ITEM_NONE\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_4F/text.inc",
    "content": "CeladonCity_DepartmentStore_4F_Text_GettingPokeDollAsPresent::\n    .string \"I'm getting a present for my\\n\"\n    .string \"girlfriend.\\p\"\n    .string \"I guess a POKé DOLL will be it.\\n\"\n    .string \"It's the popular thing.$\"\n\nCeladonCity_DepartmentStore_4F_Text_CanRunAwayWithPokeDoll::\n    .string \"I heard something useful.\\p\"\n    .string \"If a wild POKéMON appears, you can\\n\"\n    .string \"distract it with a POKé DOLL.\\p\"\n    .string \"You can run away while the wild\\n\"\n    .string \"POKéMON is distracted.$\"\n\nCeladonCity_DepartmentStore_4F_Text_FloorSign::\n    .string \"Express yourself with gifts!\\n\"\n    .string \"4F: WISE MAN GIFTS\\p\"\n    .string \"Evolution Special!\\n\"\n    .string \"Element STONES on sale now!$\"\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_5F/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_5F\",\n  \"name\": \"CeladonCity_DepartmentStore_5F\",\n  \"layout\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_5F\",\n  \"music\": \"MUS_POKE_MART\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 5,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_5F_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_5F_EventScript_Sailor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_5F_EventScript_ClerkXItems\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_5F_EventScript_ClerkVitamins\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_4F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_ROOF\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_5F_EventScript_FloorSign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_5F/scripts.inc",
    "content": "CeladonCity_DepartmentStore_5F_MapScripts::\n\t.byte 0\n\nCeladonCity_DepartmentStore_5F_EventScript_Gentleman::\n\tmsgbox CeladonCity_DepartmentStore_5F_Text_ExplainStatEnhancers, MSGBOX_NPC\n\tend\n\nCeladonCity_DepartmentStore_5F_EventScript_Sailor::\n\tmsgbox CeladonCity_DepartmentStore_5F_Text_HereForStatEnhancers, MSGBOX_NPC\n\tend\n\nCeladonCity_DepartmentStore_5F_EventScript_FloorSign::\n\tmsgbox CeladonCity_DepartmentStore_5F_Text_Drugstore, MSGBOX_SIGN\n\tend\n\nCeladonCity_DepartmentStore_5F_EventScript_ClerkXItems::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart CeladonCity_DepartmentStore_5F_XItems\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nCeladonCity_DepartmentStore_5F_XItems::\n\t.2byte ITEM_X_ATTACK\n\t.2byte ITEM_X_DEFEND\n\t.2byte ITEM_X_SPEED\n\t.2byte ITEM_X_SPECIAL\n\t.2byte ITEM_X_ACCURACY\n\t.2byte ITEM_GUARD_SPEC\n\t.2byte ITEM_DIRE_HIT\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nCeladonCity_DepartmentStore_5F_EventScript_ClerkVitamins::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart CeladonCity_DepartmentStore_5F_Vitamins\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nCeladonCity_DepartmentStore_5F_Vitamins::\n\t.2byte ITEM_HP_UP\n\t.2byte ITEM_PROTEIN\n\t.2byte ITEM_IRON\n\t.2byte ITEM_CALCIUM\n\t.2byte ITEM_ZINC\n\t.2byte ITEM_CARBOS\n\t.2byte ITEM_NONE\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_5F/text.inc",
    "content": "CeladonCity_DepartmentStore_5F_Text_ExplainStatEnhancers::\n    .string \"POKéMON stat enhancers can be\\n\"\n    .string \"bought only here.\\p\"\n    .string \"HP UP increases the base HP of a\\n\"\n    .string \"POKéMON.\\p\"\n    .string \"CALCIUM raises the base SP. ATK\\n\"\n    .string \"stat of one POKéMON.\\p\"\n    .string \"ZINC boosts the base SP. DEF stat\\n\"\n    .string \"of one POKéMON.\\p\"\n    .string \"CARBOS enhances the base SPEED\\n\"\n    .string \"stat.$\"\n\nCeladonCity_DepartmentStore_5F_Text_HereForStatEnhancers::\n    .string \"I'm here for POKéMON stat\\n\"\n    .string \"enhancers.\\p\"\n    .string \"PROTEIN increases the base ATTACK\\n\"\n    .string \"power.\\p\"\n    .string \"IRON increases the base DEFENSE\\n\"\n    .string \"stat.$\"\n\nCeladonCity_DepartmentStore_5F_Text_Drugstore::\n    .string \"5F: DRUGSTORE$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_Elevator/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR\",\n  \"name\": \"CeladonCity_DepartmentStore_Elevator\",\n  \"layout\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR\",\n  \"music\": \"MUS_POKE_MART\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 0,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelect\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelect\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_Elevator/scripts.inc",
    "content": "CeladonCity_DepartmentStore_Elevator_MapScripts::\n\t.byte 0\n\nCeladonCity_DepartmentStore_Elevator_EventScript_FloorSelect::\n\tlockall\n\tsetvar VAR_0x8004, 3\n\tcall_if_unset FLAG_TEMP_2, EventScript_GetElevatorFloor\n\tcopyvar VAR_0x8005, VAR_ELEVATOR_FLOOR\n\tspecial DrawElevatorCurrentFloorWindow\n\tmessage Text_WantWhichFloor\n\twaitmessage\n\tsetvar VAR_0x8004, 3\n\tspecialvar VAR_RESULT, InitElevatorFloorSelectMenuPos\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom5F\n\tcase 1, CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom4F\n\tcase 2, CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom3F\n\tcase 3, CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom2F\n\tcase 4, CeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom1F\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom5F::\n\tmultichoicedefault 0, 0, MULTICHOICE_DEPT_STORE_ELEVATOR, 0, FALSE\n\tgoto CeladonCity_DepartmentStore_Elevator_EventScript_ChooseFloor\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom4F::\n\tmultichoicedefault 0, 0, MULTICHOICE_DEPT_STORE_ELEVATOR, 1, FALSE\n\tgoto CeladonCity_DepartmentStore_Elevator_EventScript_ChooseFloor\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom3F::\n\tmultichoicedefault 0, 0, MULTICHOICE_DEPT_STORE_ELEVATOR, 2, FALSE\n\tgoto CeladonCity_DepartmentStore_Elevator_EventScript_ChooseFloor\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom2F::\n\tmultichoicedefault 0, 0, MULTICHOICE_DEPT_STORE_ELEVATOR, 3, FALSE\n\tgoto CeladonCity_DepartmentStore_Elevator_EventScript_ChooseFloor\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_FloorSelectFrom1F::\n\tmultichoicedefault 0, 0, MULTICHOICE_DEPT_STORE_ELEVATOR, 4, FALSE\n\tgoto CeladonCity_DepartmentStore_Elevator_EventScript_ChooseFloor\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_ChooseFloor::\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_DepartmentStore_Elevator_EventScript_To5F\n\tcase 1, CeladonCity_DepartmentStore_Elevator_EventScript_To4F\n\tcase 2, CeladonCity_DepartmentStore_Elevator_EventScript_To3F\n\tcase 3, CeladonCity_DepartmentStore_Elevator_EventScript_To2F\n\tcase 4, CeladonCity_DepartmentStore_Elevator_EventScript_To1F\n\tcase 5, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect\n\tcase 127, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_To1F::\n\tsetvar VAR_0x8006, 4\n\tsetdynamicwarp MAP_CELADON_CITY_DEPARTMENT_STORE_1F, 255, 6, 1\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 4, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect\n\tcall CeladonCity_DepartmentStore_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 4\n\tgoto CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_To2F::\n\tsetvar VAR_0x8006, 5\n\tsetdynamicwarp MAP_CELADON_CITY_DEPARTMENT_STORE_2F, 255, 6, 1\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 5, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect\n\tcall CeladonCity_DepartmentStore_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 5\n\tgoto CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_To3F::\n\tsetvar VAR_0x8006, 6\n\tsetdynamicwarp MAP_CELADON_CITY_DEPARTMENT_STORE_3F, 255, 6, 1\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 6, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect\n\tcall CeladonCity_DepartmentStore_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 6\n\tgoto CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_To4F::\n\tsetvar VAR_0x8006, 7\n\tsetdynamicwarp MAP_CELADON_CITY_DEPARTMENT_STORE_4F, 255, 6, 1\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 7, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect\n\tcall CeladonCity_DepartmentStore_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 7\n\tgoto CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_To5F::\n\tsetvar VAR_0x8006, 8\n\tsetdynamicwarp MAP_CELADON_CITY_DEPARTMENT_STORE_5F, 255, 6, 1\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 8, CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect\n\tcall CeladonCity_DepartmentStore_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 8\n\tgoto CeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_ExitFloorSelect::\n\tspecial CloseElevatorCurrentFloorWindow\n\treleaseall\n\tend\n\nCeladonCity_DepartmentStore_Elevator_EventScript_MoveElevator::\n\tspecial CloseElevatorCurrentFloorWindow\n\tclosemessage\n\twaitse\n\tspecial AnimateElevator\n\twaitstate\n\tsetflag FLAG_TEMP_2\n\treturn\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_Roof/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_ROOF\",\n  \"name\": \"CeladonCity_DepartmentStore_Roof\",\n  \"layout\": \"LAYOUT_CELADON_CITY_DEPARTMENT_STORE_ROOF\",\n  \"music\": \"MUS_POKE_MART\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 127,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_Roof_EventScript_CooltrainerM\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_DepartmentStore_Roof_EventScript_ThirstyGirl\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_DEPARTMENT_STORE_5F\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_Roof_EventScript_FloorSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_Roof_EventScript_VendingMachine\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_Roof_EventScript_VendingMachine\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_DepartmentStore_Roof_EventScript_VendingMachine\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_Roof/scripts.inc",
    "content": "CeladonCity_DepartmentStore_Roof_MapScripts::\n\t.byte 0\n\nCeladonCity_DepartmentStore_Roof_EventScript_ThirstyGirl::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tcall CeladonCity_DepartmentStore_Roof_EventScript_CheckPlayerHasDrinks\n\tgoto_if_eq VAR_TEMP_1, 0, CeladonCity_DepartmentStore_Roof_EventScript_IWantDrink\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_AskGiveDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_CheckPlayerHasDrinks::\n\tsetvar VAR_TEMP_1, 0\n\tcheckitem ITEM_FRESH_WATER\n\tcall_if_eq VAR_RESULT, TRUE, CeladonCity_DepartmentStore_Roof_EventScript_SetHasFreshWater\n\tcheckitem ITEM_SODA_POP\n\tcall_if_eq VAR_RESULT, TRUE, CeladonCity_DepartmentStore_Roof_EventScript_SetHasSodaPop\n\tcheckitem ITEM_LEMONADE\n\tcall_if_eq VAR_RESULT, TRUE, CeladonCity_DepartmentStore_Roof_EventScript_SetHasLemonade\n\treturn\n\nCeladonCity_DepartmentStore_Roof_EventScript_SetHasFreshWater::\n\taddvar VAR_TEMP_1, 1\n\treturn\n\nCeladonCity_DepartmentStore_Roof_EventScript_SetHasSodaPop::\n\taddvar VAR_TEMP_1, 2\n\treturn\n\nCeladonCity_DepartmentStore_Roof_EventScript_SetHasLemonade::\n\taddvar VAR_TEMP_1, 4\n\treturn\n\nCeladonCity_DepartmentStore_Roof_EventScript_AskGiveDrink::\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_ImThirstyGiveHerDrink, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmessage CeladonCity_DepartmentStore_Roof_Text_GiveWhichDrink\n\twaitmessage\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tswitch VAR_TEMP_1\n\tcase 1, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveFreshWater\n\tcase 2, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveSodaPop\n\tcase 3, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveFreshWaterSodaPop\n\tcase 4, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveLemonade\n\tcase 5, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveFreshWaterLemonade\n\tcase 6, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveSodaPopLemonade\n\tcase 7, CeladonCity_DepartmentStore_Roof_EventScript_AskGiveAllDrinks\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_AskGiveFreshWater::\n\tmultichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_FRESH_WATER, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveFreshWater\n\tcase 1, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tcase 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_AskGiveSodaPop::\n\tmultichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_SODA_POP, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveSodaPop\n\tcase 1, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tcase 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_AskGiveFreshWaterSodaPop::\n\tmultichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_SODA_POP, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveFreshWater\n\tcase 1, CeladonCity_DepartmentStore_Roof_EventScript_GiveSodaPop\n\tcase 2, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tcase 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_AskGiveLemonade::\n\tmultichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_LEMONADE, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveLemonade\n\tcase 1, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tcase 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_AskGiveFreshWaterLemonade::\n\tmultichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_LEMONADE, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveFreshWater\n\tcase 1, CeladonCity_DepartmentStore_Roof_EventScript_GiveLemonade\n\tcase 2, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tcase 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_AskGiveSodaPopLemonade::\n\tmultichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_SODA_POP_LEMONADE, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveSodaPop\n\tcase 1, CeladonCity_DepartmentStore_Roof_EventScript_GiveLemonade\n\tcase 2, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tcase 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_AskGiveAllDrinks::\n\tmultichoice 0, 0, MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_SODA_POP_LEMONADE, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_DepartmentStore_Roof_EventScript_GiveFreshWater\n\tcase 1, CeladonCity_DepartmentStore_Roof_EventScript_GiveSodaPop\n\tcase 2, CeladonCity_DepartmentStore_Roof_EventScript_GiveLemonade\n\tcase 3, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tcase 127, CeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_GiveFreshWater::\n\tsetvar VAR_0x8008, ITEM_FRESH_WATER\n\tsetvar VAR_0x8009, ITEM_TM16\n\tgoto_if_set FLAG_GOT_TM16_FROM_THIRSTY_GIRL, CeladonCity_DepartmentStore_Roof_EventScript_NotThirstyAfterAll\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_YayFreshWaterHaveThis\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_GiveDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_GiveSodaPop::\n\tsetvar VAR_0x8008, ITEM_SODA_POP\n\tsetvar VAR_0x8009, ITEM_TM20\n\tgoto_if_set FLAG_GOT_TM20_FROM_THIRSTY_GIRL, CeladonCity_DepartmentStore_Roof_EventScript_NotThirstyAfterAll\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_YaySodaPopHaveThis\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_GiveDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_GiveLemonade::\n\tsetvar VAR_0x8008, ITEM_LEMONADE\n\tsetvar VAR_0x8009, ITEM_TM33\n\tgoto_if_set FLAG_GOT_TM33_FROM_THIRSTY_GIRL, CeladonCity_DepartmentStore_Roof_EventScript_NotThirstyAfterAll\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_YayLemonadeHaveThis\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_GiveDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_GiveDrink::\n\tbufferitemname STR_VAR_1, VAR_0x8008\n\tbufferitemname STR_VAR_2, VAR_0x8009\n\tremoveitem VAR_0x8008\n\tcheckitemspace VAR_0x8009\n\tgoto_if_eq VAR_RESULT, FALSE, CeladonCity_DepartmentStore_Roof_EventScript_NoRoomForReward\n\tadditem VAR_0x8009\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage Text_ReceivedItemFromLittleGirl\n\twaitmessage\n\twaitfanfare\n\tputitemaway VAR_0x8009\n\tcall EventScript_RestorePrevTextColor\n\tcall_if_eq VAR_0x8008, ITEM_FRESH_WATER, CeladonCity_DepartmentStore_Roof_EventScript_ExplainTM16\n\tcall_if_eq VAR_0x8008, ITEM_SODA_POP, CeladonCity_DepartmentStore_Roof_EventScript_ExplainTM20\n\tcall_if_eq VAR_0x8008, ITEM_LEMONADE, CeladonCity_DepartmentStore_Roof_EventScript_ExplainTM33\n\trelease\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_ExplainTM16::\n\tsetflag FLAG_GOT_TM16_FROM_THIRSTY_GIRL\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_ExplainTM16\n\treturn\n\nCeladonCity_DepartmentStore_Roof_EventScript_ExplainTM20::\n\tsetflag FLAG_GOT_TM20_FROM_THIRSTY_GIRL\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_ExplainTM20\n\treturn\n\nCeladonCity_DepartmentStore_Roof_EventScript_ExplainTM33::\n\tsetflag FLAG_GOT_TM33_FROM_THIRSTY_GIRL\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_ExplainTM33\n\treturn\n\nCeladonCity_DepartmentStore_Roof_EventScript_NoRoomForReward::\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_DontHaveSpaceForThis\n\trelease\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_DontGiveDrink::\n\trelease\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_IWantDrink::\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_ImThirstyIWantDrink\n\trelease\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_NotThirstyAfterAll::\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_ImNotThirstyAfterAll\n\trelease\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_CooltrainerM::\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_MySisterIsImmature, MSGBOX_NPC\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_FloorSign::\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_VendingMachine::\n\tlockall\n\tmessage CeladonCity_DepartmentStore_Roof_Text_VendingMachineWhatDoesItHave\n\twaitmessage\n\tshowmoneybox 0, 0\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_ChooseDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_ChooseDrink::\n\tmultichoice 12, 0, MULTICHOICE_CELADON_VENDING_MACHINE, FALSE\n\tcopyvar VAR_TEMP_1, VAR_RESULT\n\tswitch VAR_TEMP_1\n\tcase 0, CeladonCity_DepartmentStore_Roof_EventScript_BuyFreshWater\n\tcase 1, CeladonCity_DepartmentStore_Roof_EventScript_BuySodaPop\n\tcase 2, CeladonCity_DepartmentStore_Roof_EventScript_BuyLemonade\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_NotThirsty\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_ExitVendingMachine\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_BuyFreshWater::\n\tsetvar VAR_TEMP_0, ITEM_FRESH_WATER\n\tcheckmoney 200\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_TryBuyDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_BuySodaPop::\n\tsetvar VAR_TEMP_0, ITEM_SODA_POP\n\tcheckmoney 300\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_TryBuyDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_BuyLemonade::\n\tsetvar VAR_TEMP_0, ITEM_LEMONADE\n\tcheckmoney 350\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_TryBuyDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_RemoveMoneyFreshWater::\n\tremovemoney 200\n\treturn\n\nCeladonCity_DepartmentStore_Roof_EventScript_RemoveMoneySodaPop::\n\tremovemoney 300\n\treturn\n\nCeladonCity_DepartmentStore_Roof_EventScript_RemoveMoneyLemonade::\n\tremovemoney 350\n\treturn\n\nCeladonCity_DepartmentStore_Roof_EventScript_TryBuyDrink::\n\tgoto_if_eq VAR_RESULT, FALSE, CeladonCity_DepartmentStore_Roof_EventScript_NotEnoughMoney\n\tcheckitemspace VAR_TEMP_0\n\tgoto_if_eq VAR_RESULT, FALSE, CeladonCity_DepartmentStore_Roof_EventScript_NoRoomForDrink\n\tcall_if_eq VAR_TEMP_1, 0, CeladonCity_DepartmentStore_Roof_EventScript_RemoveMoneyFreshWater\n\tcall_if_eq VAR_TEMP_1, 1, CeladonCity_DepartmentStore_Roof_EventScript_RemoveMoneySodaPop\n\tcall_if_eq VAR_TEMP_1, 2, CeladonCity_DepartmentStore_Roof_EventScript_RemoveMoneyLemonade\n\tupdatemoneybox\n\tbufferitemname STR_VAR_1, VAR_TEMP_0\n\tplayse SE_VEND\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_DrinkCanPoppedOut\n\tadditem VAR_TEMP_0\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_ChooseNewDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_ChooseNewDrink::\n\tmessage CeladonCity_DepartmentStore_Roof_Text_VendingMachineWhatDoesItHave\n\twaitmessage\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_ChooseDrink\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_NotEnoughMoney::\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_NotEnoughMoney\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_ExitVendingMachine\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_NoRoomForDrink::\n\tmsgbox CeladonCity_DepartmentStore_Roof_Text_NoMoreRoomForStuff\n\tgoto CeladonCity_DepartmentStore_Roof_EventScript_ExitVendingMachine\n\tend\n\nCeladonCity_DepartmentStore_Roof_EventScript_ExitVendingMachine::\n\thidemoneybox\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_DepartmentStore_Roof/text.inc",
    "content": "CeladonCity_DepartmentStore_Roof_Text_ImThirstyGiveHerDrink::\n    .string \"I'm thirsty!\\n\"\n    .string \"I want something to drink!\\p\"\n    .string \"{FONT_NORMAL}Give her a drink?$\"\n\nCeladonCity_DepartmentStore_Roof_Text_GiveWhichDrink::\n    .string \"Give her which drink?$\"\n\nCeladonCity_DepartmentStore_Roof_Text_YayFreshWaterHaveThis::\n    .string \"Yay!\\p\"\n    .string \"FRESH WATER!\\p\"\n    .string \"Thank you!\\n\"\n    .string \"You can have this from me!$\"\n\nText_ReceivedItemFromLittleGirl::\n    .string \"{PLAYER} received a {STR_VAR_2}\\n\"\n    .string \"from the little girl.$\"\n\nCeladonCity_DepartmentStore_Roof_Text_ExplainTM16::\n    .string \"TM16 contains LIGHT SCREEN.\\p\"\n    .string \"It's a move that weakens the power\\n\"\n    .string \"of special attacks by your foe.$\"\n\nCeladonCity_DepartmentStore_Roof_Text_YaySodaPopHaveThis::\n    .string \"Yay!\\p\"\n    .string \"SODA POP!\\p\"\n    .string \"Thank you!\\n\"\n    .string \"You can have this from me!$\"\n\nCeladonCity_DepartmentStore_Roof_Text_ExplainTM20::\n    .string \"TM20 contains SAFEGUARD.\\p\"\n    .string \"It's a move that prevents status\\n\"\n    .string \"problems among your POKéMON.$\"\n\nCeladonCity_DepartmentStore_Roof_Text_YayLemonadeHaveThis::\n    .string \"Yay!\\p\"\n    .string \"LEMONADE!\\p\"\n    .string \"Thank you!\\n\"\n    .string \"You can have this from me!$\"\n\nCeladonCity_DepartmentStore_Roof_Text_ExplainTM33::\n    .string \"TM33 contains REFLECT.\\p\"\n    .string \"It's a move that weakens the power\\n\"\n    .string \"of physical attacks by your foe.$\"\n\nCeladonCity_DepartmentStore_Roof_Text_DontHaveSpaceForThis::\n    .string \"You don't have space for this!$\"\n\nCeladonCity_DepartmentStore_Roof_Text_ImNotThirstyAfterAll::\n    .string \"No, thank you!\\n\"\n    .string \"I'm not thirsty after all!$\"\n\nCeladonCity_DepartmentStore_Roof_Text_MySisterIsImmature::\n    .string \"My sister is a TRAINER, believe it\\n\"\n    .string \"or not.\\p\"\n    .string \"But, she's so immature, she drives\\n\"\n    .string \"me nuts!$\"\n\nCeladonCity_DepartmentStore_Roof_Text_ImThirstyIWantDrink::\n    .string \"I'm thirsty!\\n\"\n    .string \"I want something to drink!$\"\n\nCeladonCity_DepartmentStore_Roof_Text_FloorSign::\n    .string \"ROOFTOP SQUARE:\\n\"\n    .string \"VENDING MACHINES$\"\n\nCeladonCity_DepartmentStore_Roof_Text_VendingMachineWhatDoesItHave::\n    .string \"A vending machine!\\n\"\n    .string \"What does it have?$\"\n\nCeladonCity_DepartmentStore_Roof_Text_NotEnoughMoney::\n    .string \"Oops, not enough money!$\"\n\nCeladonCity_DepartmentStore_Roof_Text_DrinkCanPoppedOut::\n    .string \"A can of {STR_VAR_1} popped out!$\"\n\nCeladonCity_DepartmentStore_Roof_Text_NoMoreRoomForStuff::\n    .string \"There's no more room for stuff!$\"\n\nCeladonCity_DepartmentStore_Roof_Text_NotThirsty::\n    .string \"Not thirsty!$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_GameCorner/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_GAME_CORNER\",\n  \"name\": \"CeladonCity_GameCorner\",\n  \"layout\": \"LAYOUT_CELADON_CITY_GAME_CORNER\",\n  \"music\": \"MUS_GAME_CORNER\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_InfoClerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_CoinsClerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_Woman1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_Fisher\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GYM_GUY\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_GymGuy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_Woman2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_Scientist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_RocketGrunt\",\n      \"flag\": \"FLAG_HIDE_GAME_CORNER_ROCKET\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Porygon\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_B1F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS\",\n      \"quantity\": 10,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 3,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_2\",\n      \"quantity\": 10,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 2,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_3\",\n      \"quantity\": 20,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 6,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_4\",\n      \"quantity\": 10,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_5\",\n      \"quantity\": 10,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_6\",\n      \"quantity\": 20,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_7\",\n      \"quantity\": 10,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 13,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_8\",\n      \"quantity\": 10,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 15,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_9\",\n      \"quantity\": 10,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 17,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_10\",\n      \"quantity\": 40,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 15,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_11\",\n      \"quantity\": 100,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 12,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_12\",\n      \"quantity\": 10,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 0,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_WEST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine0\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 0,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_WEST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 0,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_WEST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_UnusableSlotMachine1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine5\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine6\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_WEST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine7\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_WEST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine8\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_WEST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine9\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine10\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine11\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine12\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine13\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_WEST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine14\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_WEST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_UnusableSlotMachine2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_WEST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine16\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_WEST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine17\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_UnusableSlotMachine3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine19\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine20\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_SlotMachine21\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_Poster\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"CeladonCity_GameCorner_EventScript_PhotoPrinter\"\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_GameCorner/scripts.inc",
    "content": ".set LOCALID_GRUNT, 11\n.set LOCALID_PORYGON_MASTER, 12\n.set TRAINER, VAR_0x8009\n\nCeladonCity_GameCorner_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, CeladonCity_GameCorner_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_GameCorner_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nCeladonCity_GameCorner_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_PORYGON\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE CeladonCity_GameCorner_MapScript_PorygonMasterMovementType\n\tend\n\nCeladonCity_GameCorner_MapScript_PorygonMasterMovementType::\n\tsetobjectmovementtype LOCALID_PORYGON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeladonCity_GameCorner_OnLoad::\n\tcall_if_unset FLAG_OPENED_ROCKET_HIDEOUT, CeladonCity_GameCorner_EventScript_HideRocketHideout\n\tend\n\nCeladonCity_GameCorner_EventScript_HideRocketHideout::\n\tsetmetatile 15, 2, METATILE_GameCorner_Floor_ShadeFull, 0\n\tsetmetatile 16, 2, METATILE_GameCorner_Floor_ShadeFull, 0\n\tsetmetatile 17, 2, METATILE_GameCorner_Floor_ShadeFull, 0\n\tsetmetatile 16, 3, METATILE_GameCorner_PurpleWall_Floor, 1\n\tsetmetatile 17, 3, METATILE_GameCorner_PurpleWall_Floor, 1\n\treturn\n\nCeladonCity_GameCorner_EventScript_InfoClerk::\n\tmsgbox CeladonCity_GameCorner_Text_CanExchangeCoinsNextDoor, MSGBOX_NPC\n\tend\n\nCeladonCity_GameCorner_EventScript_CoinsClerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tshowmoneybox 0, 0\n\tshowcoinsbox 0, 5\n\tmessage CeladonCity_GameCorner_Text_WelcomeBuySomeCoins\n\twaitmessage\n\tmultichoice 13, 0, MULTICHOICE_GAME_CORNER_COIN_PURCHASE_COUNTER, FALSE\n\tcopyvar VAR_0x8009, VAR_RESULT\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_GameCorner_EventScript_BuyCoins\n\tcase 1, CeladonCity_GameCorner_EventScript_BuyCoins\n\tcase 2, CeladonCity_GameCorner_EventScript_BuyCoins\n\tcase 3, CeladonCity_GameCorner_EventScript_ClerkDeclineBuy\n\tcase 127, CeladonCity_GameCorner_EventScript_ClerkDeclineBuy\n\tend\n\nCeladonCity_GameCorner_EventScript_BuyCoins::\n\tgoto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_EventScript_ClerkNoCoinCase\n\tgoto_if_eq VAR_0x8009, 0, CeladonCity_GameCorner_EventScript_Buy50Coins\n\tgoto_if_eq VAR_0x8009, 1, CeladonCity_GameCorner_EventScript_Buy500Coins\n\tgoto_if_eq VAR_0x8009, 2, CeladonCity_GameCorner_EventScript_Buy1000Coins\n\tend\n\nCeladonCity_GameCorner_EventScript_Buy1000Coins::\n\tcheckcoins VAR_TEMP_1\n\tgoto_if_ge VAR_TEMP_1, (MAX_COINS + 1) - 1000, CeladonCity_GameCorner_EventScript_ClerkNoRoomForCoins\n\tcheckmoney 20000\n\tgoto_if_eq VAR_RESULT, FALSE, CeladonCity_GameCorner_EventScript_ClerkNotEnoughMoney\n\taddcoins 1000\n\tremovemoney 20000\n\tgoto CeladonCity_GameCorner_EventScript_BoughtCoins\n\tend\n\nCeladonCity_GameCorner_EventScript_Buy500Coins::\n\tcheckcoins VAR_TEMP_1\n\tgoto_if_ge VAR_TEMP_1, (MAX_COINS + 1) - 500, CeladonCity_GameCorner_EventScript_ClerkNoRoomForCoins\n\tcheckmoney 10000\n\tgoto_if_eq VAR_RESULT, FALSE, CeladonCity_GameCorner_EventScript_ClerkNotEnoughMoney\n\taddcoins 500\n\tremovemoney 10000\n\tgoto CeladonCity_GameCorner_EventScript_BoughtCoins\n\tend\n\nCeladonCity_GameCorner_EventScript_Buy50Coins::\n\tcheckcoins VAR_TEMP_1\n\tgoto_if_ge VAR_TEMP_1, (MAX_COINS + 1) - 50, CeladonCity_GameCorner_EventScript_ClerkNoRoomForCoins\n\tcheckmoney 1000\n\tgoto_if_eq VAR_RESULT, FALSE, CeladonCity_GameCorner_EventScript_ClerkNotEnoughMoney\n\taddcoins 50\n\tremovemoney 1000\n\tgoto CeladonCity_GameCorner_EventScript_BoughtCoins\n\tend\n\nCeladonCity_GameCorner_EventScript_BoughtCoins::\n\tupdatemoneybox\n\tupdatecoinsbox 0, 5\n\tplayse SE_SHOP\n\tmsgbox CeladonCity_GameCorner_Text_HereAreYourCoins\n\tgoto CeladonCity_GameCorner_EventScript_ClerkEnd\n\tend\n\nCeladonCity_GameCorner_EventScript_ClerkEnd::\n\thidemoneybox\n\thidecoinsbox 0, 5\n\trelease\n\tend\n\nCeladonCity_GameCorner_EventScript_ClerkDeclineBuy::\n\tmsgbox CeladonCity_GameCorner_Text_ComePlaySometime\n\tgoto CeladonCity_GameCorner_EventScript_ClerkEnd\n\tend\n\nCeladonCity_GameCorner_EventScript_ClerkNoCoinCase::\n\tmsgbox CeladonCity_GameCorner_Text_SorryDontHaveCoinCase\n\tgoto CeladonCity_GameCorner_EventScript_ClerkEnd\n\tend\n\nCeladonCity_GameCorner_EventScript_ClerkNoRoomForCoins::\n\tmsgbox CeladonCity_GameCorner_Text_CoinCaseIsFull\n\tgoto CeladonCity_GameCorner_EventScript_ClerkEnd\n\tend\n\nCeladonCity_GameCorner_EventScript_ClerkNotEnoughMoney::\n\tmsgbox CeladonCity_GameCorner_Text_CantAffordCoins\n\tgoto CeladonCity_GameCorner_EventScript_ClerkEnd\n\tend\n\nCeladonCity_GameCorner_EventScript_BaldingMan::\n\tlock\n\tfaceplayer\n\tmsgbox CeladonCity_GameCorner_Text_RumoredTeamRocketRunsThisPlace\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_FaceSlotMachine::\n\tclosemessage\n\tapplymovement VAR_LAST_TALKED, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nCeladonCity_GameCorner_EventScript_Woman1::\n\tlock\n\tfaceplayer\n\tmsgbox CeladonCity_GameCorner_Text_ThinkMachinesHaveDifferentOdds\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_Fisher::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_10_COINS_FROM_GAMBLER, CeladonCity_GameCorner_EventScript_FisherAlreadyGotCoins\n\tmsgbox CeladonCity_GameCorner_Text_DoYouWantToPlay\n\tgoto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_EventScript_GamblerNoCoinCase\n\tcheckcoins VAR_TEMP_1\n\tgoto_if_ge VAR_TEMP_1, (MAX_COINS + 1) - 10, CeladonCity_GameCorner_EventScript_FisherNoRoomForCoins\n\taddcoins 10\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox CeladonCity_GameCorner_Text_Received10CoinsFromMan\n\tplayse SE_SHOP\n\twaitse\n\tsetflag FLAG_GOT_10_COINS_FROM_GAMBLER\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_FisherNoRoomForCoins::\n\tmsgbox CeladonCity_GameCorner_Text_DontNeedMyCoins\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_GamblerNoCoinCase::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox CeladonCity_GameCorner_Text_DontHaveCoinCase\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_FisherAlreadyGotCoins::\n\tmsgbox CeladonCity_GameCorner_Text_WinsComeAndGo\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_GymGuy::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_DEFEATED_ERIKA, CeladonCity_GameCorner_EventScript_GymGuyPostVictory\n\tmsgbox CeladonCity_GameCorner_Text_GymGuyAdvice\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_GymGuyPostVictory::\n\tmsgbox CeladonCity_GameCorner_Text_RareMonsForCoins\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_Woman2::\n\tlock\n\tfaceplayer\n\tmsgbox CeladonCity_GameCorner_Text_WinOrLoseItsOnlyLuck\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_OldMan::\n\tlock\n\tfaceplayer\n\tmsgbox CeladonCity_GameCorner_Text_SoEasyToGetHooked\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_Scientist::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_20_COINS_FROM_GAMBLER, CeladonCity_GameCorner_EventScript_ScientistAlreadyGotCoins\n\tmsgbox CeladonCity_GameCorner_Text_WantSomeCoins\n\tgoto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_EventScript_GamblerNoCoinCase\n\tcheckcoins VAR_TEMP_1\n\tgoto_if_ge VAR_TEMP_1, (MAX_COINS + 1) - 20, CeladonCity_GameCorner_EventScript_ScientistNoRoomForCoins\n\taddcoins 20\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox CeladonCity_GameCorner_Text_Received20CoinsFromNiceGuy\n\tplayse SE_SHOP\n\twaitse\n\tsetflag FLAG_GOT_20_COINS_FROM_GAMBLER\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_ScientistNoRoomForCoins::\n\tmsgbox CeladonCity_GameCorner_Text_YouHaveLotsOfCoins\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_ScientistAlreadyGotCoins::\n\tmsgbox CeladonCity_GameCorner_Text_NeedMoreCoinsForMonIWant\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_Gentleman::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_20_COINS_FROM_GAMBLER_2, CeladonCity_GameCorner_EventScript_GentlemanAlreadyGotCoins\n\tmsgbox CeladonCity_GameCorner_Text_HereAreSomeCoinsShoo\n\tgoto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_EventScript_GamblerNoCoinCase\n\tcheckcoins VAR_TEMP_1\n\tgoto_if_ge VAR_TEMP_1, (MAX_COINS + 1) - 20, CeladonCity_GameCorner_EventScript_GentlemanNoRoomForCoins\n\taddcoins 20\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox CeladonCity_GameCorner_Text_Received20CoinsFromMan\n\tplayse SE_SHOP\n\twaitse\n\tsetflag FLAG_GOT_20_COINS_FROM_GAMBLER_2\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_GentlemanNoRoomForCoins::\n\tmsgbox CeladonCity_GameCorner_Text_YouveGotPlentyCoins\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_GentlemanAlreadyGotCoins::\n\tmsgbox CeladonCity_GameCorner_Text_WatchReelsClosely\n\tgoto CeladonCity_GameCorner_EventScript_FaceSlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine0::\n\tlockall\n\tsetvar VAR_0x8004, 0\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_DontPlaySlotMachine::\n\treleaseall\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine::\n\tgoto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_EventScript_SlotMachineNoCoinCase\n\tmsgbox CeladonCity_GameCorner_Text_SlotMachineWantToPlay, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_EventScript_DontPlaySlotMachine\n\tsetfieldeffectargument 0, OBJ_EVENT_ID_PLAYER\n.ifdef BUGFIX\n\tsetfieldeffectargument 1, MAP_NUM(CELADON_CITY_GAME_CORNER)\n\tsetfieldeffectargument 2, MAP_GROUP(CELADON_CITY_GAME_CORNER)\n.else\n\t@ Map num/group were provided in the wrong order\n\tsetfieldeffectargument 1, MAP_GROUP(CELADON_CITY_GAME_CORNER)\n\tsetfieldeffectargument 2, MAP_NUM(CELADON_CITY_GAME_CORNER)\n.endif\n\tdofieldeffect FLDEFF_SMILEY_FACE_ICON\n\twaitfieldeffect FLDEFF_SMILEY_FACE_ICON\n\tspecialvar VAR_RESULT, GetRandomSlotMachineId\n\tplayslotmachine VAR_RESULT\n\treleaseall\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine1::\n\tlockall\n\tsetvar VAR_0x8004, 1\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine2::\n\tlockall\n\tsetvar VAR_0x8004, 2\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine3::\n\tlockall\n\tsetvar VAR_0x8004, 3\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine4::\n\tlockall\n\tsetvar VAR_0x8004, 4\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine5::\n\tlockall\n\tsetvar VAR_0x8004, 5\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine6::\n\tlockall\n\tsetvar VAR_0x8004, 6\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine7::\n\tlockall\n\tsetvar VAR_0x8004, 7\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine8::\n\tlockall\n\tsetvar VAR_0x8004, 8\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine9::\n\tlockall\n\tsetvar VAR_0x8004, 9\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine10::\n\tlockall\n\tsetvar VAR_0x8004, 10\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine11::\n\tlockall\n\tsetvar VAR_0x8004, 11\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine12::\n\tlockall\n\tsetvar VAR_0x8004, 12\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine13::\n\tlockall\n\tsetvar VAR_0x8004, 13\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine14::\n\tlockall\n\tsetvar VAR_0x8004, 14\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine15::\n\tlockall\n\tsetvar VAR_0x8004, 15\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine16::\n\tlockall\n\tsetvar VAR_0x8004, 16\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine17::\n\tlockall\n\tsetvar VAR_0x8004, 17\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine18::\n\tlockall\n\tsetvar VAR_0x8004, 18\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine19::\n\tlockall\n\tsetvar VAR_0x8004, 19\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine20::\n\tlockall\n\tsetvar VAR_0x8004, 20\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachine21::\n\tlockall\n\tsetvar VAR_0x8004, 21\n\tgoto CeladonCity_GameCorner_EventScript_SlotMachine\n\tend\n\nCeladonCity_GameCorner_EventScript_SlotMachineNoCoinCase::\n\tmsgbox CeladonCity_GameCorner_Text_CoinCaseIsRequired\n\treleaseall\n\tend\n\nCeladonCity_GameCorner_EventScript_Poster::\n\tlockall\n\tmsgbox CeladonCity_GameCorner_Text_SwitchBehindPosterPushIt\n\tcall_if_unset FLAG_OPENED_ROCKET_HIDEOUT, CeladonCity_GameCorner_EventScript_OpenRocketHideout\n\treleaseall\n\tend\n\nCeladonCity_GameCorner_EventScript_OpenRocketHideout::\n\tplayse SE_UNLOCK\n\tsetmetatile 15, 2, METATILE_GameCorner_Floor_StairsTop, 0\n\tsetmetatile 16, 2, METATILE_GameCorner_StairsTop, 1\n\tsetmetatile 17, 2, METATILE_GameCorner_StairsBottom, 1\n\tsetmetatile 16, 3, METATILE_GameCorner_PurpleWall_StairsTop, 1\n\tsetmetatile 17, 3, METATILE_GameCorner_PurpleWall_stairsBottom, 1\n\tspecial DrawWholeMapView\n\tsetflag FLAG_OPENED_ROCKET_HIDEOUT\n\treturn\n\nCeladonCity_GameCorner_EventScript_RocketGrunt::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_7, CeladonCity_GameCorner_Text_GruntIntro, CeladonCity_GameCorner_Text_GruntDefeat, CeladonCity_GameCorner_Text_DefeatedGrunt\n\tmsgbox CeladonCity_GameCorner_Text_GruntPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCeladonCity_GameCorner_Text_DefeatedGrunt::\n\tmsgbox CeladonCity_GameCorner_Text_GruntPostBattle\n\tclosemessage\n\tcall_if_eq VAR_FACING, DIR_WEST, CeladonCity_GameCorner_Text_GruntExitWest\n\tcall_if_ne VAR_FACING, DIR_WEST, CeladonCity_GameCorner_Text_GruntExit\n\tremoveobject LOCALID_GRUNT\n\trelease\n\tend\n\nCeladonCity_GameCorner_Text_GruntExitWest::\n\tapplymovement LOCALID_GRUNT, CeladonCity_GameCorner_Movement_GruntExitWest\n\twaitmovement 0\n\treturn\n\nCeladonCity_GameCorner_Text_GruntExit::\n\tapplymovement LOCALID_GRUNT, CeladonCity_GameCorner_Movement_GruntExit\n\twaitmovement 0\n\treturn\n\nCeladonCity_GameCorner_Movement_GruntExitWest::\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_up\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\tstep_end\n\nCeladonCity_GameCorner_Movement_GruntExit::\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\tstep_end\n\nCeladonCity_GameCorner_EventScript_UnusableSlotMachine1::\n\tmsgbox CeladonCity_GameCorner_Text_OutOfOrder, MSGBOX_SIGN\n\tend\n\nCeladonCity_GameCorner_EventScript_UnusableSlotMachine2::\n\tmsgbox CeladonCity_GameCorner_Text_OutToLunch, MSGBOX_SIGN\n\tend\n\nCeladonCity_GameCorner_EventScript_UnusableSlotMachine3::\n\tmsgbox CeladonCity_GameCorner_Text_SomeonesKeys, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_GameCorner/text.inc",
    "content": "CeladonCity_GameCorner_Text_CanExchangeCoinsNextDoor::\n    .string \"Welcome!\\p\"\n    .string \"You can exchange your COINS for\\n\"\n    .string \"fabulous prizes next door.$\"\n\nCeladonCity_GameCorner_Text_WelcomeBuySomeCoins::\n    .string \"Welcome to ROCKET GAME CORNER!\\p\"\n    .string \"Do you need some game COINS?\\n\"\n    .string \"Would you like to buy some?$\"\n\nCeladonCity_GameCorner_Text_ComePlaySometime::\n    .string \"No?\\n\"\n    .string \"Please come play sometime!$\"\n\nCeladonCity_GameCorner_Text_SorryDontHaveCoinCase::\n    .string \"Oh, I'm sorry.\\n\"\n    .string \"You don't have a COIN CASE.$\"\n\nCeladonCity_GameCorner_Text_CoinCaseIsFull::\n    .string \"Whoops!\\n\"\n    .string \"Your COIN CASE is full.$\"\n\nCeladonCity_GameCorner_Text_CantAffordCoins::\n    .string \"You can't afford the COINS.$\"\n\nCeladonCity_GameCorner_Text_HereAreYourCoins::\n    .string \"Thank you.\\n\"\n    .string \"Here are your COINS!$\"\n\nCeladonCity_GameCorner_Text_RumoredTeamRocketRunsThisPlace::\n    .string \"Keep this quiet.\\p\"\n    .string \"It's rumored that this place is run\\n\"\n    .string \"by TEAM ROCKET.$\"\n\nCeladonCity_GameCorner_Text_ThinkMachinesHaveDifferentOdds::\n    .string \"I think these machines have\\n\"\n    .string \"different odds.$\"\n\nCeladonCity_GameCorner_Text_DoYouWantToPlay::\n    .string \"Kid, do you want to play?$\"\n\nCeladonCity_GameCorner_Text_Received10CoinsFromMan::\n    .string \"{PLAYER} received 10 COINS\\n\"\n    .string \"from the man.$\"\n\nCeladonCity_GameCorner_Text_DontNeedMyCoins::\n    .string \"You don't need my COINS!$\"\n\nCeladonCity_GameCorner_Text_WinsComeAndGo::\n    .string \"Wins seem to come and go.\\n\"\n    .string \"Nothing's a sure thing.$\"\n\nCeladonCity_GameCorner_Text_WinOrLoseItsOnlyLuck::\n    .string \"These slot games…\\n\"\n    .string \"Win or lose, it's only by luck.$\"\n\nCeladonCity_GameCorner_Text_GymGuyAdvice::\n    .string \"Hey!\\p\"\n    .string \"You have better things to do,\\n\"\n    .string \"champ in the making!\\p\"\n    .string \"CELADON GYM's LEADER is ERIKA.\\p\"\n    .string \"She is a user of GRASS-type\\n\"\n    .string \"POKéMON, and at one with nature.\\p\"\n    .string \"She might appear docile because of\\n\"\n    .string \"her flower arranging…\\p\"\n    .string \"But she's not one to be taken\\n\"\n    .string \"lightly!$\"\n\nCeladonCity_GameCorner_Text_RareMonsForCoins::\n    .string \"They offer rare POKéMON that can\\n\"\n    .string \"be exchanged for your COINS.\\p\"\n    .string \"But, I just can't seem to win!$\"\n\nCeladonCity_GameCorner_Text_SoEasyToGetHooked::\n    .string \"Games are scary!\\n\"\n    .string \"It's so easy to get hooked!$\"\n\nCeladonCity_GameCorner_Text_WantSomeCoins::\n    .string \"What's up?\\n\"\n    .string \"Want some COINS?$\"\n\nCeladonCity_GameCorner_Text_Received20CoinsFromNiceGuy::\n    .string \"{PLAYER} received 20 COINS\\n\"\n    .string \"from the nice guy.$\"\n\nCeladonCity_GameCorner_Text_YouHaveLotsOfCoins::\n    .string \"You have lots of COINS!$\"\n\nCeladonCity_GameCorner_Text_NeedMoreCoinsForMonIWant::\n    .string \"Darn! I need more COINS for the\\n\"\n    .string \"POKéMON I want!$\"\n\nCeladonCity_GameCorner_Text_HereAreSomeCoinsShoo::\n    .string \"Hey, what? You're throwing me off!\\n\"\n    .string \"Here are some COINS, so shoo!$\"\n\nCeladonCity_GameCorner_Text_Received20CoinsFromMan::\n    .string \"{PLAYER} received 20 COINS\\n\"\n    .string \"from the man.$\"\n\nCeladonCity_GameCorner_Text_YouveGotPlentyCoins::\n    .string \"You've got plenty of your own\\n\"\n    .string \"COINS!$\"\n\nCeladonCity_GameCorner_Text_WatchReelsClosely::\n    .string \"The trick is to watch the reels\\n\"\n    .string \"closely.$\"\n\nCeladonCity_GameCorner_Text_GruntIntro::\n    .string \"I'm guarding this poster!\\n\"\n    .string \"Go away, or else!$\"\n\nCeladonCity_GameCorner_Text_GruntDefeat::\n    .string \"Dang!$\"\n\nCeladonCity_GameCorner_Text_GruntPostBattle::\n    .string \"The TEAM ROCKET HIDEOUT might\\n\"\n    .string \"be discovered!\\p\"\n    .string \"I better tell BOSS!$\"\n\nCeladonCity_GameCorner_Text_SwitchBehindPosterPushIt::\n    .string \"Hey!\\p\"\n    .string \"A switch behind the poster!?\\n\"\n    .string \"Let's push it!$\"\n\nCeladonCity_GameCorner_Text_CoinCaseIsRequired::\n    .string \"A COIN CASE is required…$\"\n\nCeladonCity_GameCorner_Text_DontHaveCoinCase::\n    .string \"Oops!\\n\"\n    .string \"Don't have the COIN CASE!$\"\n\nCeladonCity_GameCorner_Text_SlotMachineWantToPlay::\n    .string \"A slot machine!\\n\"\n    .string \"Want to play?$\"\n\nCeladonCity_GameCorner_Text_OutOfOrder::\n    .string \"OUT OF ORDER\\n\"\n    .string \"This is broken.$\"\n\nCeladonCity_GameCorner_Text_OutToLunch::\n    .string \"OUT TO LUNCH\\n\"\n    .string \"This is reserved.$\"\n\nCeladonCity_GameCorner_Text_SomeonesKeys::\n    .string \"Someone's keys!\\n\"\n    .string \"They'll be back.$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_GameCorner_PrizeRoom/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_GAME_CORNER_PRIZE_ROOM\",\n  \"name\": \"CeladonCity_GameCorner_PrizeRoom\",\n  \"layout\": \"LAYOUT_CELADON_CITY_GAME_CORNER_PRIZE_ROOM\",\n  \"music\": \"MUS_CELADON\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_PrizeRoom_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"x\": 6,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_PrizeRoom_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_PrizeRoom_EventScript_PrizeClerkMons\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_PrizeRoom_EventScript_PrizeClerkTMs\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_GameCorner_PrizeRoom_EventScript_PrizeClerkItems\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_GameCorner_PrizeRoom/scripts.inc",
    "content": "CeladonCity_GameCorner_PrizeRoom_MapScripts::\n\t.byte 0\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_BaldingMan::\n\tmsgbox CeladonCity_GameCorner_PrizeRoom_Text_FancyThatPorygon, MSGBOX_NPC\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_OldMan::\n\tmsgbox CeladonCity_GameCorner_PrizeRoom_Text_RakedItInToday, MSGBOX_NPC\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_PrizeClerkMons::\n\tlock\n\tfaceplayer\n\tgoto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_PrizeRoom_EventScript_NeedCoinCase\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tshowcoinsbox 0, 0\n\tmsgbox CeladonCity_GameCorner_PrizeRoom_Text_WeExchangeCoinsForPrizes\n\tcallnative IsVersionFireRedToVarResult\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_ne CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeMon_LG\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeMon_FR\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeMon_FR::\n\tmessage CeladonCity_GameCorner_PrizeRoom_Text_WhichPrize\n\twaitmessage\n\tmultichoice 11, 0, MULTICHOICE_GAME_CORNER_POKEMON_PRIZES_FR, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_GameCorner_PrizeRoom_EventScript_Abra_FR\n\tcase 1, CeladonCity_GameCorner_PrizeRoom_EventScript_Clefairy_FR\n\tcase 2, CeladonCity_GameCorner_PrizeRoom_EventScript_DratiniPinsir_FR\n\tcase 3, CeladonCity_GameCorner_PrizeRoom_EventScript_ScytherDratini_FR\n\tcase 4, CeladonCity_GameCorner_PrizeRoom_EventScript_Porygon_FR\n\tcase 5, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tcase 127, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeMon_LG::\n\tmessage CeladonCity_GameCorner_PrizeRoom_Text_WhichPrize\n\twaitmessage\n\tmultichoice 11, 0, MULTICHOICE_GAME_CORNER_POKEMON_PRIZES_LG, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_GameCorner_PrizeRoom_EventScript_Abra_LG\n\tcase 1, CeladonCity_GameCorner_PrizeRoom_EventScript_Clefairy_LG\n\tcase 2, CeladonCity_GameCorner_PrizeRoom_EventScript_DratiniPinsir_LG\n\tcase 3, CeladonCity_GameCorner_PrizeRoom_EventScript_ScytherDratini_LG\n\tcase 4, CeladonCity_GameCorner_PrizeRoom_EventScript_Porygon_LG\n\tcase 5, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tcase 127, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange::\n\thidecoinsbox 0, 0\n\trelease\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_Abra_FR::\n\tsetvar VAR_TEMP_1, SPECIES_ABRA\n\tsetvar VAR_TEMP_2, 180\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_FR\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_Abra_LG::\n\tsetvar VAR_TEMP_1, SPECIES_ABRA\n\tsetvar VAR_TEMP_2, 120\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_LG\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_Clefairy_FR::\n\tsetvar VAR_TEMP_1, SPECIES_CLEFAIRY\n\tsetvar VAR_TEMP_2, 500\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_FR\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_Clefairy_LG::\n\tsetvar VAR_TEMP_1, SPECIES_CLEFAIRY\n\tsetvar VAR_TEMP_2, 750\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_LG\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_DratiniPinsir_FR::\n\tsetvar VAR_TEMP_1, SPECIES_DRATINI\n\tsetvar VAR_TEMP_2, 2800\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_FR\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_DratiniPinsir_LG::\n\tsetvar VAR_TEMP_1, SPECIES_PINSIR\n\tsetvar VAR_TEMP_2, 2500\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_LG\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_ScytherDratini_FR::\n\tsetvar VAR_TEMP_1, SPECIES_SCYTHER\n\tsetvar VAR_TEMP_2, 5500\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_FR\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_ScytherDratini_LG::\n\tsetvar VAR_TEMP_1, SPECIES_DRATINI\n\tsetvar VAR_TEMP_2, 4600\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_LG\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_Porygon_FR::\n\tsetvar VAR_TEMP_1, SPECIES_PORYGON\n\tsetvar VAR_TEMP_2, 9999\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_FR\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_Porygon_LG::\n\tsetvar VAR_TEMP_1, SPECIES_PORYGON\n\tsetvar VAR_TEMP_2, 6500\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_LG\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_FR::\n\tbufferspeciesname STR_VAR_1, VAR_TEMP_1\n\tmsgbox CeladonCity_GameCorner_PrizeRoom_Text_YouWantPrize, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tcheckcoins VAR_RESULT\n\tgoto_if_lt VAR_RESULT, VAR_TEMP_2, CeladonCity_GameCorner_PrizeRoom_EventScript_NotEnoughCoins\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tswitch VAR_TEMP_1\n\tcase SPECIES_ABRA,     CeladonCity_GameCorner_PrizeRoom_EventScript_GiveAbra_FR\n\tcase SPECIES_CLEFAIRY, CeladonCity_GameCorner_PrizeRoom_EventScript_GiveClefairy_FR\n\tcase SPECIES_DRATINI,  CeladonCity_GameCorner_PrizeRoom_EventScript_GiveDratini_FR\n\tcase SPECIES_SCYTHER,  CeladonCity_GameCorner_PrizeRoom_EventScript_GiveScyther_FR\n\tcase SPECIES_PORYGON,  CeladonCity_GameCorner_PrizeRoom_EventScript_GivePorygon_FR\n\tcase SPECIES_PINSIR,   CeladonCity_GameCorner_PrizeRoom_EventScript_GivePinsir_FR\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeMon_LG::\n\tbufferspeciesname STR_VAR_1, VAR_TEMP_1\n\tmsgbox CeladonCity_GameCorner_PrizeRoom_Text_YouWantPrize, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tcheckcoins VAR_RESULT\n\tgoto_if_lt VAR_RESULT, VAR_TEMP_2, CeladonCity_GameCorner_PrizeRoom_EventScript_NotEnoughCoins\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tswitch VAR_TEMP_1\n\tcase SPECIES_ABRA,     CeladonCity_GameCorner_PrizeRoom_EventScript_GiveAbra_LG\n\tcase SPECIES_CLEFAIRY, CeladonCity_GameCorner_PrizeRoom_EventScript_GiveClefairy_LG\n\tcase SPECIES_DRATINI,  CeladonCity_GameCorner_PrizeRoom_EventScript_GiveDratini_LG\n\tcase SPECIES_SCYTHER,  CeladonCity_GameCorner_PrizeRoom_EventScript_GiveScyther_LG\n\tcase SPECIES_PORYGON,  CeladonCity_GameCorner_PrizeRoom_EventScript_GivePorygon_LG\n\tcase SPECIES_PINSIR,   CeladonCity_GameCorner_PrizeRoom_EventScript_GivePinsir_LG\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_GiveAbra_FR::\n\tgivemon VAR_TEMP_1, 9, ITEM_NONE\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_GiveAbra_LG::\n\tgivemon VAR_TEMP_1, 7, ITEM_NONE\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_GiveClefairy_FR::\n\tgivemon VAR_TEMP_1, 8, ITEM_NONE\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_GiveClefairy_LG::\n\tgivemon VAR_TEMP_1, 12, ITEM_NONE\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_GiveDratini_FR::\n\tgivemon VAR_TEMP_1, 18, ITEM_NONE\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_GiveDratini_LG::\n\tgivemon VAR_TEMP_1, 24, ITEM_NONE\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_GiveScyther_FR::\n\tgivemon VAR_TEMP_1, 25, ITEM_NONE\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_GiveScyther_LG::\n\tgivemon VAR_TEMP_1, 25, ITEM_NONE\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_GivePorygon_FR::\n\tgivemon VAR_TEMP_1, 26, ITEM_NONE\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_GivePorygon_LG::\n\tgivemon VAR_TEMP_1, 18, ITEM_NONE\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_GivePinsir_FR::\n\tgivemon VAR_TEMP_1, 18, ITEM_NONE\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_GivePinsir_LG::\n\tgivemon VAR_TEMP_1, 18, ITEM_NONE\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_CheckReceivedMon::\n\tgoto_if_eq VAR_RESULT, 0, CeladonCity_GameCorner_PrizeRoom_EventScript_ReceivedMonParty\n\tgoto_if_eq VAR_RESULT, 1, CeladonCity_GameCorner_PrizeRoom_EventScript_ReceivedMonPC\n\tgoto_if_eq VAR_RESULT, 2, CeladonCity_GameCorner_PrizeRoom_EventScript_PartyFull\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_PartyFull::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox Text_NoMoreRoomForPokemon\n\thidecoinsbox 0, 0\n\trelease\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_NicknamePartyMon::\n\tgetpartysize\n\tsubvar VAR_RESULT, 1\n\tcopyvar VAR_0x8004, VAR_RESULT\n\tcall EventScript_ChangePokemonNickname\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_NeedCoinCase::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox CeladonCity_GameCorner_PrizeRoom_Text_CoinCaseRequired\n\trelease\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_NotEnoughCoins::\n\tmsgbox CeladonCity_GameCorner_PrizeRoom_Text_NeedMoreCoins\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_ReceivedMonParty::\n\tremovecoins VAR_TEMP_2\n\tupdatecoinsbox 0, 5\n\tbufferspeciesname STR_VAR_1, VAR_TEMP_1\n\tplayfanfare MUS_LEVEL_UP\n\tmessage Text_PlayerObtainedTheMon\n\twaitmessage\n\twaitfanfare\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, CeladonCity_Condominiums_RoofRoom_EventScript_NicknamePrizeParty\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\nCeladonCity_Condominiums_RoofRoom_EventScript_NicknamePrizeParty::\n\tgoto_if_eq VAR_RESULT, YES, CeladonCity_GameCorner_PrizeRoom_EventScript_NicknamePartyMon\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_ReceivedMonPC::\n\tremovecoins VAR_TEMP_2\n\tupdatecoinsbox 0, 5\n\tbufferspeciesname STR_VAR_1, VAR_TEMP_1\n\tplayfanfare MUS_LEVEL_UP\n\tmessage Text_PlayerObtainedTheMon\n\twaitmessage\n\twaitfanfare\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, CeladonCity_GameCorner_PrizeRoom_EventScript_NicknamePrizePC\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_PrizeRoom_EventScript_TransferredToPC\nCeladonCity_GameCorner_PrizeRoom_EventScript_NicknamePrizePC::\n\tcall EventScript_NameReceivedBoxMon\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_TransferredToPC\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_TransferredToPC::\n\tcall EventScript_TransferredToPC\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_PrizeClerkTMs::\n\tlock\n\tfaceplayer\n\tgoto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_PrizeRoom_EventScript_NeedCoinCase\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tshowcoinsbox 0, 0\n\tmsgbox CeladonCity_GameCorner_PrizeRoom_Text_WeExchangeCoinsForPrizes\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeTM\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeTM::\n\tmessage CeladonCity_GameCorner_PrizeRoom_Text_WhichPrize\n\twaitmessage\n\tmultichoice 11, 0, MULTICHOICE_GAME_CORNER_TMPRIZES, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_GameCorner_PrizeRoom_EventScript_TM13\n\tcase 1, CeladonCity_GameCorner_PrizeRoom_EventScript_TM23\n\tcase 2, CeladonCity_GameCorner_PrizeRoom_EventScript_TM24\n\tcase 3, CeladonCity_GameCorner_PrizeRoom_EventScript_TM30\n\tcase 4, CeladonCity_GameCorner_PrizeRoom_EventScript_TM35\n\tcase 5, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tcase 127, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_TM13::\n\tsetvar VAR_TEMP_1, ITEM_TM13\n\tsetvar VAR_TEMP_2, 4000\n\tbuffermovename STR_VAR_2, MOVE_ICE_BEAM\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeTM\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_TM23::\n\tsetvar VAR_TEMP_1, ITEM_TM23\n\tsetvar VAR_TEMP_2, 3500\n\tbuffermovename STR_VAR_2, MOVE_IRON_TAIL\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeTM\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_TM24::\n\tsetvar VAR_TEMP_1, ITEM_TM24\n\tsetvar VAR_TEMP_2, 4000\n\tbuffermovename STR_VAR_2, MOVE_THUNDERBOLT\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeTM\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_TM30::\n\tsetvar VAR_TEMP_1, ITEM_TM30\n\tsetvar VAR_TEMP_2, 4500\n\tbuffermovename STR_VAR_2, MOVE_SHADOW_BALL\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeTM\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_TM35::\n\tsetvar VAR_TEMP_1, ITEM_TM35\n\tsetvar VAR_TEMP_2, 4000\n\tbuffermovename STR_VAR_2, MOVE_FLAMETHROWER\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeTM\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeTM::\n\tcheckitem VAR_TEMP_1, 1\n\tgoto_if_eq VAR_RESULT, TRUE, CeladonCity_GameCorner_PrizeRoom_EventScript_AlreadyHaveTM\n\tmsgbox CeladonCity_GameCorner_PrizeRoom_Text_YouWantTM, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_TryGivePrize\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_AlreadyHaveTM::\n\tmsgbox CeladonCity_GameCorner_PrizeRoom_Text_YouAlreadyHaveThisTM\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeTM\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeItem::\n\tbufferitemname STR_VAR_1, VAR_TEMP_1\n\tmsgbox CeladonCity_GameCorner_PrizeRoom_Text_YouWantPrize, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_TryGivePrize\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_TryGivePrize::\n\tbufferitemname STR_VAR_1, VAR_TEMP_1\n\tcheckcoins VAR_RESULT\n\tgoto_if_lt VAR_RESULT, VAR_TEMP_2, CeladonCity_GameCorner_PrizeRoom_EventScript_NotEnoughCoins\n\tcheckitemspace VAR_TEMP_1\n\tgoto_if_eq VAR_RESULT, FALSE, CeladonCity_GameCorner_PrizeRoom_EventScript_BagFull\n\tremovecoins VAR_TEMP_2\n\tupdatecoinsbox 0, 5\n\tgiveitem VAR_TEMP_1\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_BagFull::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox Text_TooBadBagFull\n\thidecoinsbox 0, 0\n\trelease\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_PrizeClerkItems::\n\tlock\n\tfaceplayer\n\tgoto_if_unset FLAG_GOT_COIN_CASE, CeladonCity_GameCorner_PrizeRoom_EventScript_NeedCoinCase\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tshowcoinsbox 0, 0\n\tmsgbox CeladonCity_GameCorner_PrizeRoom_Text_WeExchangeCoinsForPrizes\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeItem\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_ChoosePrizeItem::\n\tmessage CeladonCity_GameCorner_PrizeRoom_Text_WhichPrize\n\twaitmessage\n\tmultichoice 10, 0, MULTICHOICE_GAME_CORNER_BATTLE_ITEM_PRIZES, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_GameCorner_PrizeRoom_EventScript_SmokeBall\n\tcase 1, CeladonCity_GameCorner_PrizeRoom_EventScript_MiracleSeed\n\tcase 2, CeladonCity_GameCorner_PrizeRoom_EventScript_Charcoal\n\tcase 3, CeladonCity_GameCorner_PrizeRoom_EventScript_MysticWater\n\tcase 4, CeladonCity_GameCorner_PrizeRoom_EventScript_YellowFlute\n\tcase 5, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tcase 127, CeladonCity_GameCorner_PrizeRoom_EventScript_EndPrizeExchange\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_SmokeBall::\n\tsetvar VAR_TEMP_1, ITEM_SMOKE_BALL\n\tsetvar VAR_TEMP_2, 800\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeItem\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_MiracleSeed::\n\tsetvar VAR_TEMP_1, ITEM_MIRACLE_SEED\n\tsetvar VAR_TEMP_2, 1000\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeItem\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_Charcoal::\n\tsetvar VAR_TEMP_1, ITEM_CHARCOAL\n\tsetvar VAR_TEMP_2, 1000\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeItem\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_MysticWater::\n\tsetvar VAR_TEMP_1, ITEM_MYSTIC_WATER\n\tsetvar VAR_TEMP_2, 1000\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeItem\n\tend\n\nCeladonCity_GameCorner_PrizeRoom_EventScript_YellowFlute::\n\tsetvar VAR_TEMP_1, ITEM_YELLOW_FLUTE\n\tsetvar VAR_TEMP_2, 1600\n\tgoto CeladonCity_GameCorner_PrizeRoom_EventScript_ConfirmPrizeItem\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_GameCorner_PrizeRoom/text.inc",
    "content": "CeladonCity_GameCorner_PrizeRoom_Text_FancyThatPorygon::\n    .string \"I sure do fancy that PORYGON!\\n\"\n    .string \"But, it's hard to win at slots!$\"\n\nCeladonCity_GameCorner_PrizeRoom_Text_RakedItInToday::\n    .string \"Gahaha! I raked it in today!\\n\"\n    .string \"If only every day were like this…$\"\n\nCeladonCity_GameCorner_PrizeRoom_Text_CoinCaseRequired::\n    .string \"A COIN CASE is required…$\"\n\nCeladonCity_GameCorner_PrizeRoom_Text_WeExchangeCoinsForPrizes::\n    .string \"We exchange your COINS for prizes.$\"\n\nCeladonCity_GameCorner_PrizeRoom_Text_WhichPrize::\n    .string \"Which prize would you like?$\"\n\nCeladonCity_GameCorner_PrizeRoom_Text_YouWantPrize::\n    .string \"So, you want the {STR_VAR_1}?$\"\n\nCeladonCity_GameCorner_PrizeRoom_Text_YouWantTM::\n    .string \"Okay, a TM of {STR_VAR_2}\\n\"\n    .string \"is what you want?$\"\n\nCeladonCity_GameCorner_PrizeRoom_Text_NeedMoreCoins::\n    .string \"Sorry, you'll need more COINS\\n\"\n    .string \"than that.$\"\n\nCeladonCity_GameCorner_PrizeRoom_Text_YouAlreadyHaveThisTM::\n    .string \"You already have this TM.$\"\n"
  },
  {
    "path": "data/maps/CeladonCity_Gym/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_GYM\",\n  \"name\": \"CeladonCity_Gym\",\n  \"layout\": \"LAYOUT_CELADON_CITY_GYM\",\n  \"music\": \"MUS_GYM\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_GYM\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"CeladonCity_Gym_EventScript_Kay\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"CeladonCity_Gym_EventScript_Bridget\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"CeladonCity_Gym_EventScript_Tina\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"CeladonCity_Gym_EventScript_Tamia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"CeladonCity_Gym_EventScript_Lori\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"CeladonCity_Gym_EventScript_Lisa\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ERIKA\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Gym_EventScript_Erika\",\n      \"flag\": \"FLAG_TEMP_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"CeladonCity_Gym_EventScript_Mary\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_CELADON_GYM_BOTTOM_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_CELADON_GYM_LEFT_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_CELADON_GYM_RIGHT_CUT_TREE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Gym_EventScript_GymStatue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeladonCity_Gym_EventScript_GymStatue\"\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_Gym/scripts.inc",
    "content": ".equ CHECK_VISITOR_STATE, 6\n.equ TYPE, VAR_0x8003\n.equ ARGUMENT, VAR_0x8004\n\nCeladonCity_Gym_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_Gym_OnTransition\n\t.byte 0\n\nCeladonCity_Gym_OnTransition::\n\tsetvar TYPE, CHECK_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_ERIKA\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 1, CeladonCity_Gym_EventScript_HideErika\n\tend\n\nCeladonCity_Gym_EventScript_HideErika::\n\tsetflag FLAG_TEMP_1\n\treturn\n\nCeladonCity_Gym_EventScript_Erika::\n\tfamechecker FAMECHECKER_ERIKA, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, CeladonCity_Gym_EventScript_Erika_ChallengeMode\n\ttrainerbattle_single TRAINER_LEADER_ERIKA, CeladonCity_Gym_Text_ErikaIntro, CeladonCity_Gym_Text_ErikaDefeat, CeladonCity_Gym_EventScript_DefeatedErika, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_ERIKA_CHALLENGE\n\tgoto_if_unset FLAG_GOT_TM19_FROM_ERIKA, CeladonCity_Gym_EventScript_GiveTM19\n\tfamechecker FAMECHECKER_ERIKA, 4\n\tmsgbox CeladonCity_Gym_Text_ErikaPostBattle\n\trelease\n\tend\n\nCeladonCity_Gym_EventScript_Erika_ChallengeMode::\n\ttrainerbattle_single TRAINER_LEADER_ERIKA_CHALLENGE, CeladonCity_Gym_Text_ErikaIntro, CeladonCity_Gym_Text_ErikaDefeat, CeladonCity_Gym_EventScript_DefeatedErika, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_ERIKA\n\tgoto_if_unset FLAG_GOT_TM19_FROM_ERIKA, CeladonCity_Gym_EventScript_GiveTM19\n\tfamechecker FAMECHECKER_ERIKA, 4\n\tmsgbox CeladonCity_Gym_Text_ErikaPostBattle\n\trelease\n\tend\n\nCeladonCity_Gym_EventScript_DefeatedErika::\n\tfamechecker FAMECHECKER_ERIKA, 1\n\tclearflag FLAG_HIDE_FAME_CHECKER_ERIKA_JOURNALS\n\tsetflag FLAG_DEFEATED_ERIKA\n\tsetflag FLAG_BADGE04_GET\n\tset_gym_trainers 4\n\tgoto CeladonCity_Gym_EventScript_GiveTM19\n\tend\n\nCeladonCity_Gym_EventScript_GiveTM19::\n\tmsgbox CeladonCity_Gym_Text_ExplainRainbowBadgeTakeThis\n\tcheckitemspace ITEM_TM19\n\tgoto_if_eq VAR_RESULT, FALSE, CeladonCity_Gym_EventScript_NoRoomForTM19\n\tgiveitem_msg CeladonCity_Gym_Text_ReceivedTM19FromErika, ITEM_TM19\n\tsetflag FLAG_GOT_TM19_FROM_ERIKA\n\tmsgbox CeladonCity_Gym_Text_ExplainTM19\n\trelease\n\tend\n\nCeladonCity_Gym_EventScript_NoRoomForTM19::\n\tmsgbox CeladonCity_Gym_Text_ShouldMakeRoomForThis\n\trelease\n\tend\n\nCeladonCity_Gym_EventScript_Kay::\n\ttrainerbattle_single TRAINER_LASS_KAY, CeladonCity_Gym_Text_KayIntro, CeladonCity_Gym_Text_KayDefeat\n\tmsgbox CeladonCity_Gym_Text_KayPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCeladonCity_Gym_EventScript_Lisa::\n\ttrainerbattle_single TRAINER_LASS_LISA, CeladonCity_Gym_Text_LisaIntro, CeladonCity_Gym_Text_LisaDefeat\n\tfamechecker FAMECHECKER_ERIKA, 2\n\tmsgbox CeladonCity_Gym_Text_LisaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCeladonCity_Gym_EventScript_Tina::\n\ttrainerbattle_single TRAINER_PICNICKER_TINA, CeladonCity_Gym_Text_TinaIntro, CeladonCity_Gym_Text_TinaDefeat\n\tmsgbox CeladonCity_Gym_Text_TinaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCeladonCity_Gym_EventScript_Bridget::\n\ttrainerbattle_single TRAINER_BEAUTY_BRIDGET, CeladonCity_Gym_Text_BridgetIntro, CeladonCity_Gym_Text_BridgetDefeat\n\tmsgbox CeladonCity_Gym_Text_BridgetPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCeladonCity_Gym_EventScript_Tamia::\n\ttrainerbattle_single TRAINER_BEAUTY_TAMIA, CeladonCity_Gym_Text_TamiaIntro, CeladonCity_Gym_Text_TamiaDefeat\n\tfamechecker FAMECHECKER_ERIKA, 3\n\tmsgbox CeladonCity_Gym_Text_TamiaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCeladonCity_Gym_EventScript_Lori::\n\ttrainerbattle_single TRAINER_BEAUTY_LORI, CeladonCity_Gym_Text_LoriIntro, CeladonCity_Gym_Text_LoriDefeat\n\tmsgbox CeladonCity_Gym_Text_LoriPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCeladonCity_Gym_EventScript_Mary::\n\ttrainerbattle_single TRAINER_COOLTRAINER_MARY, CeladonCity_Gym_Text_MaryIntro, CeladonCity_Gym_Text_MaryDefeat\n\tmsgbox CeladonCity_Gym_Text_MaryPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCeladonCity_Gym_EventScript_GymStatue::\n\tlockall\n\tgoto_if_set FLAG_BADGE04_GET, CeladonCity_Gym_EventScript_GymStatuePostVictory\n\tmsgbox CeladonCity_Gym_Text_GymStatue\n\treleaseall\n\tend\n\nCeladonCity_Gym_EventScript_GymStatuePostVictory::\n\tmsgbox CeladonCity_Gym_Text_GymStatuePlayerWon\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_Gym/text.inc",
    "content": "CeladonCity_Gym_Text_ErikaIntro::\n    .string \"Hello…\\n\"\n    .string \"Lovely weather, isn't it?\\l\"\n    .string \"It's so pleasant…\\p\"\n    .string \"…Oh, dear…\\n\"\n    .string \"I must have dozed off. Welcome.\\p\"\n    .string \"My name is ERIKA.\\n\"\n    .string \"I am the LEADER of CELADON GYM.\\p\"\n    .string \"I am a student of the art of\\n\"\n    .string \"flower arranging.\\p\"\n    .string \"My POKéMON are solely of the\\n\"\n    .string \"GRASS type.\\p\"\n    .string \"…Oh, I'm sorry, I had no idea that\\n\"\n    .string \"you wished to challenge me.\\p\"\n    .string \"Very well, but I shall not lose.{PLAY_BGM MUS_ENCOUNTER_GYM_LEADER}$\"\n\nCeladonCity_Gym_Text_ErikaDefeat::\n    .string \"Oh!\\n\"\n    .string \"I concede defeat.\\l\"\n    .string \"You are remarkably strong.\\p\"\n    .string \"I must confer on you the\\n\"\n    .string \"RAINBOWBADGE.$\"\n\nCeladonCity_Gym_Text_ErikaPostBattle::\n    .string \"You are cataloging POKéMON?\\n\"\n    .string \"I must say I'm impressed.\\p\"\n    .string \"I would never collect POKéMON if\\n\"\n    .string \"they were unattractive.$\"\n\nCeladonCity_Gym_Text_ExplainRainbowBadgeTakeThis::\n    .string \"The RAINBOWBADGE will make\\n\"\n    .string \"POKéMON up to Lv. 50 obey.\\p\"\n    .string \"It also allows POKéMON to use\\n\"\n    .string \"STRENGTH in and out of battle.\\p\"\n    .string \"Please also take this with you.$\"\n\nCeladonCity_Gym_Text_ReceivedTM19FromErika::\n    .string \"{PLAYER} received TM19\\n\"\n    .string \"from ERIKA.$\"\n\nCeladonCity_Gym_Text_ExplainTM19::\n    .string \"TM19 contains GIGA DRAIN.\\p\"\n    .string \"Half the damage it inflicts is\\n\"\n    .string \"drained to heal your POKéMON.\\p\"\n    .string \"Wouldn't you agree that it's a\\n\"\n    .string \"wonderful move?$\"\n\nCeladonCity_Gym_Text_ShouldMakeRoomForThis::\n    .string \"You should make room for this.$\"\n\nCeladonCity_Gym_Text_KayIntro::\n    .string \"I should tell you about this GYM.\\p\"\n    .string \"Only real ladies are allowed in\\n\"\n    .string \"here!$\"\n\nCeladonCity_Gym_Text_KayDefeat::\n    .string \"You're too rough!$\"\n\nCeladonCity_Gym_Text_KayPostBattle::\n    .string \"Bleaah!\\n\"\n    .string \"I hope ERIKA wipes you out!$\"\n\nCeladonCity_Gym_Text_BridgetIntro::\n    .string \"Oh, welcome.\\n\"\n    .string \"I was getting bored.$\"\n\nCeladonCity_Gym_Text_BridgetDefeat::\n    .string \"My makeup!$\"\n\nCeladonCity_Gym_Text_BridgetPostBattle::\n    .string \"GRASS-type POKéMON are tough\\n\"\n    .string \"against the WATER type.\\p\"\n    .string \"They also have an edge on ROCK-\\n\"\n    .string \"and GROUND-type POKéMON.$\"\n\nCeladonCity_Gym_Text_TinaIntro::\n    .string \"…Weren't you peeking in here\\n\"\n    .string \"earlier?$\"\n\nCeladonCity_Gym_Text_TinaDefeat::\n    .string \"You're an eye-opener!$\"\n\nCeladonCity_Gym_Text_TinaPostBattle::\n    .string \"Oh, you were looking at ERIKA…\\n\"\n    .string \"You weren't looking at me…$\"\n\nCeladonCity_Gym_Text_TamiaIntro::\n    .string \"Look, look!\\n\"\n    .string \"See my POKéMON!\\p\"\n    .string \"I like the GRASS type.\\n\"\n    .string \"I like how they're easy to raise.$\"\n\nCeladonCity_Gym_Text_TamiaDefeat::\n    .string \"No!$\"\n\nCeladonCity_Gym_Text_TamiaPostBattle::\n    .string \"We only use GRASS-type POKéMON at\\n\"\n    .string \"our GYM.\\p\"\n    .string \"Why? We also use them for making\\n\"\n    .string \"flower arrangements!$\"\n\nCeladonCity_Gym_Text_LisaIntro::\n    .string \"Oh, hey!\\p\"\n    .string \"We don't like BUG- or FIRE-type\\n\"\n    .string \"POKéMON in here!$\"\n\nCeladonCity_Gym_Text_LisaDefeat::\n    .string \"Oh!\\n\"\n    .string \"You!$\"\n\nCeladonCity_Gym_Text_LisaPostBattle::\n    .string \"Our LEADER ERIKA might be quiet,\\n\"\n    .string \"but she's famous around here.$\"\n\nCeladonCity_Gym_Text_LoriIntro::\n    .string \"Pleased to meet you.\\n\"\n    .string \"My hobby is POKéMON training.$\"\n\nCeladonCity_Gym_Text_LoriDefeat::\n    .string \"Oh!\\n\"\n    .string \"Splendid!$\"\n\nCeladonCity_Gym_Text_LoriPostBattle::\n    .string \"I have a blind date coming up.\\n\"\n    .string \"I have to learn to be polite,\\l\"\n    .string \"especially if I have to battle.$\"\n\nCeladonCity_Gym_Text_MaryIntro::\n    .string \"Welcome to CELADON GYM!\\p\"\n    .string \"You'd better not underestimate\\n\"\n    .string \"the nice ladies here.$\"\n\nCeladonCity_Gym_Text_MaryDefeat::\n    .string \"Oh!\\n\"\n    .string \"Beaten!$\"\n\nCeladonCity_Gym_Text_MaryPostBattle::\n    .string \"I didn't bring my best POKéMON.\\n\"\n    .string \"Wait until next time!$\"\n\nCeladonCity_Gym_Text_GymStatue::\n    .string \"CELADON POKéMON GYM\\n\"\n    .string \"LEADER: ERIKA\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}$\"\n\nCeladonCity_Gym_Text_GymStatuePlayerWon::\n    .string \"CELADON POKéMON GYM\\n\"\n    .string \"LEADER: ERIKA\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}, {PLAYER}$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_Hotel/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_HOTEL\",\n  \"name\": \"CeladonCity_Hotel\",\n  \"layout\": \"LAYOUT_CELADON_CITY_HOTEL\",\n  \"music\": \"MUS_CELADON\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Hotel_EventScript_Receptionist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Hotel_EventScript_Beauty\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Hotel_EventScript_BeautyBoyfriend\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Hotel_EventScript_BeautyBrother\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Gyarados\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Arcanine\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"9\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"9\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"9\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_Hotel/scripts.inc",
    "content": ".set LOCALID_GYARADOS_MASTER, 5\n.set LOCALID_ARCANINE_MASTER, 6\n.set TRAINER, VAR_0x8009\n\nCeladonCity_Hotel_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_Hotel_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nCeladonCity_Hotel_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_GYARADOS\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeladonCity_Hotel_MapScript_GyaradosMasterMovementType\n\tsetvar TRAINER, MASTER_ARCANINE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeladonCity_Hotel_MapScript_ArcanineMasterMovementType\n\tend\n\nCeladonCity_Hotel_MapScript_GyaradosMasterMovementType::\n\tsetobjectmovementtype LOCALID_GYARADOS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeladonCity_Hotel_MapScript_ArcanineMasterMovementType::\n\tsetobjectmovementtype LOCALID_ARCANINE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeladonCity_Hotel_EventScript_Receptionist::\n\tmsgbox CeladonCity_Hotel_Text_ThisHotelIsForPeople, MSGBOX_NPC\n\tend\n\nCeladonCity_Hotel_EventScript_Beauty::\n\tmsgbox CeladonCity_Hotel_Text_OnVacationWithBrotherAndBoyfriend, MSGBOX_NPC\n\tend\n\nCeladonCity_Hotel_EventScript_BeautyBoyfriend::\n\tmsgbox CeladonCity_Hotel_Text_WhyDidSheBringBrother, MSGBOX_NPC\n\tend\n\nCeladonCity_Hotel_EventScript_BeautyBrother::\n\tmsgbox CeladonCity_Hotel_Text_SisBroughtMeOnVacation, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_Hotel/text.inc",
    "content": "CeladonCity_Hotel_Text_ThisHotelIsForPeople::\n    .string \"POKéMON?\\n\"\n    .string \"No, this is a hotel for people.\\p\"\n    .string \"We're full up, unfortunately.$\"\n\nCeladonCity_Hotel_Text_OnVacationWithBrotherAndBoyfriend::\n    .string \"I'm on vacation with my brother and\\n\"\n    .string \"boyfriend.\\p\"\n    .string \"CELADON is such a pretty city!$\"\n\nCeladonCity_Hotel_Text_WhyDidSheBringBrother::\n    .string \"Why?\\n\"\n    .string \"Why did she bring her brother?$\"\n\nCeladonCity_Hotel_Text_SisBroughtMeOnVacation::\n    .string \"Yippee! I'm on vacation!\\n\"\n    .string \"My sis brought me along! Awesome!$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_House1/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_HOUSE1\",\n  \"name\": \"CeladonCity_House1\",\n  \"layout\": \"LAYOUT_HOUSE5\",\n  \"music\": \"MUS_CELADON\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"x\": 5,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_House1_EventScript_RocketChief\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 5,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_House1_EventScript_Rocket1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"x\": 8,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 5,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_House1_EventScript_Rocket2\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"8\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_House1/scripts.inc",
    "content": "CeladonCity_House1_MapScripts::\n\t.byte 0\n\nCeladonCity_House1_EventScript_RocketChief::\n\tmsgbox CeladonCity_House1_Text_SlotsReelInTheDough, MSGBOX_NPC\n\tend\n\nCeladonCity_House1_EventScript_Rocket1::\n\tmsgbox CeladonCity_House1_Text_ShippedMonsAsSlotPrizes, MSGBOX_NPC\n\tend\n\nCeladonCity_House1_EventScript_Rocket2::\n\tmsgbox CeladonCity_House1_Text_DontTouchGameCornerPoster, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_House1/text.inc",
    "content": "CeladonCity_House1_Text_SlotsReelInTheDough::\n    .string \"Hehehe!\\p\"\n    .string \"The slots just reel in the dough,\\n\"\n    .string \"big-time!$\"\n\nCeladonCity_House1_Text_ShippedMonsAsSlotPrizes::\n    .string \"CHIEF!\\p\"\n    .string \"We just shipped two thousand\\n\"\n    .string \"more POKéMON as slot prizes\\l\"\n    .string \"again today!$\"\n\nCeladonCity_House1_Text_DontTouchGameCornerPoster::\n    .string \"Don't touch the poster at the GAME\\n\"\n    .string \"CORNER!\\p\"\n    .string \"There's no secret switch behind it!$\"\n\n@ Text for the replaced altars in the rocket chiefs house / celadon mansion\n@ In English RB, this is westernized as \"It's a sculpture of DIGLETT.\", and is removed altogether in FRLG\nText_ItsABuddhistAltar::\n    .string \"ぶつだん　だ‥$\"\n"
  },
  {
    "path": "data/maps/CeladonCity_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_POKEMON_CENTER_1F\",\n  \"name\": \"CeladonCity_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_PokemonCenter_1F_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_PokemonCenter_1F_EventScript_CooltrainerF\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_PokemonCenter_1F_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_CELADON_CITY_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_PokemonCenter_1F/scripts.inc",
    "content": "CeladonCity_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeladonCity_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t//map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume\n\t.byte 0\n\nCeladonCity_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_CELADON_CITY\n\tend\n\nCeladonCity_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nCeladonCity_PokemonCenter_1F_EventScript_Gentleman::\n\tmsgbox CeladonCity_PokemonCenter_1F_Text_PokeFluteAwakensSleepingMons, MSGBOX_NPC\n\tend\n\nCeladonCity_PokemonCenter_1F_EventScript_CooltrainerF::\n\tmsgbox CeladonCity_PokemonCenter_1F_Text_RodeHereFromFuchsia, MSGBOX_NPC\n\tend\n\nCeladonCity_PokemonCenter_1F_EventScript_Youngster::\n\tmsgbox CeladonCity_PokemonCenter_1F_Text_GoToCyclingRoadIfIHadBike, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_PokemonCenter_1F/text.inc",
    "content": "CeladonCity_PokemonCenter_1F_Text_PokeFluteAwakensSleepingMons::\n    .string \"A POKé FLUTE awakens sleeping\\n\"\n    .string \"POKéMON. You know that.\\p\"\n    .string \"It does so with a sound that only\\n\"\n    .string \"they can hear.$\"\n\nCeladonCity_PokemonCenter_1F_Text_RodeHereFromFuchsia::\n    .string \"I rode here from FUCHSIA.\\p\"\n    .string \"It's an uphill ride on CYCLING\\n\"\n    .string \"ROAD, so I'm exhausted.$\"\n\nCeladonCity_PokemonCenter_1F_Text_GoToCyclingRoadIfIHadBike::\n    .string \"If I had a BIKE, I would go to\\n\"\n    .string \"CYCLING ROAD!$\"\n\n"
  },
  {
    "path": "data/maps/CeladonCity_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_POKEMON_CENTER_2F\",\n  \"name\": \"CeladonCity_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_CELADON_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_PokemonCenter_2F/scripts.inc",
    "content": "CeladonCity_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nCeladonCity_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nCeladonCity_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nCeladonCity_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_Restaurant/map.json",
    "content": "{\n  \"id\": \"MAP_CELADON_CITY_RESTAURANT\",\n  \"name\": \"CeladonCity_Restaurant\",\n  \"layout\": \"LAYOUT_CELADON_CITY_RESTAURANT\",\n  \"music\": \"MUS_CELADON\",\n  \"region_map_section\": \"MAPSEC_CELADON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHEF\",\n      \"x\": 12,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Restaurant_EventScript_Chef\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"x\": 11,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Restaurant_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"x\": 9,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Restaurant_EventScript_FatMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Restaurant_EventScript_CoinCaseMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeladonCity_Restaurant_EventScript_WorkerM\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CELADON_CITY\",\n      \"dest_warp_id\": \"7\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeladonCity_Restaurant/scripts.inc",
    "content": "CeladonCity_Restaurant_MapScripts::\n\t.byte 0\n\nCeladonCity_Restaurant_EventScript_Chef::\n\tmsgbox CeladonCity_Restaurant_Text_TakingBreakRightNow, MSGBOX_NPC\n\tend\n\nCeladonCity_Restaurant_EventScript_Woman::\n\tmsgbox CeladonCity_Restaurant_Text_OftenGoToDrugstore, MSGBOX_NPC\n\tend\n\nCeladonCity_Restaurant_EventScript_CoinCaseMan::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_COIN_CASE, CeladonCity_Restaurant_EventScript_AlreadyGotCoinCase\n\tmsgbox CeladonCity_Restaurant_Text_TakeThisImBusted\n\tcheckitemspace ITEM_COIN_CASE\n\tgoto_if_eq VAR_RESULT, FALSE, CeladonCity_Restaurant_EventScript_NoRoomForCoinCase\n\tgiveitem_msg CeladonCity_Restaurant_Text_ReceivedCoinCaseFromMan, ITEM_COIN_CASE\n\tsetflag FLAG_GOT_COIN_CASE\n\trelease\n\tend\n\nCeladonCity_Restaurant_EventScript_NoRoomForCoinCase::\n\tmsgbox CeladonCity_Restaurant_Text_MakeRoomForThis\n\trelease\n\tend\n\nCeladonCity_Restaurant_EventScript_AlreadyGotCoinCase::\n\tmsgbox CeladonCity_Restaurant_Text_ThoughtIdWinItBack\n\trelease\n\tend\n\nCeladonCity_Restaurant_EventScript_WorkerM::\n\tmsgbox CeladonCity_Restaurant_Text_PsstBasementUnderGameCorner, MSGBOX_NPC\n\tend\n\nCeladonCity_Restaurant_EventScript_FatMan::\n\tmsgbox CeladonCity_Restaurant_Text_ManLostItAllAtSlots, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/CeladonCity_Restaurant/text.inc",
    "content": "CeladonCity_Restaurant_Text_TakingBreakRightNow::\n    .string \"Hi!\\p\"\n    .string \"Sorry, but we're taking a break\\n\"\n    .string \"right now.$\"\n\nCeladonCity_Restaurant_Text_OftenGoToDrugstore::\n    .string \"My POKéMON are weak, so I often\\n\"\n    .string \"have to go to the DRUGSTORE.$\"\n\nCeladonCity_Restaurant_Text_PsstBasementUnderGameCorner::\n    .string \"Psst! There's a basement under the\\n\"\n    .string \"GAME CORNER, I hear.$\"\n\nCeladonCity_Restaurant_Text_ManLostItAllAtSlots::\n    .string \"Munch…\\p\"\n    .string \"The man at that table lost it all\\n\"\n    .string \"at the slots.$\"\n\nCeladonCity_Restaurant_Text_TakeThisImBusted::\n    .string \"Go ahead! Laugh!\\n\"\n    .string \"I'm flat-out busted!\\p\"\n    .string \"No more slots for me!\\n\"\n    .string \"I'm going straight!\\p\"\n    .string \"Here!\\n\"\n    .string \"I won't be needing this anymore!$\"\n\nCeladonCity_Restaurant_Text_ReceivedCoinCaseFromMan::\n    .string \"{PLAYER} received a COIN CASE\\n\"\n    .string \"from the man.$\"\n\nCeladonCity_Restaurant_Text_MakeRoomForThis::\n    .string \"Make room for this!$\"\n\nCeladonCity_Restaurant_Text_ThoughtIdWinItBack::\n    .string \"I always thought I was going to\\n\"\n    .string \"win it back…$\"\n\n"
  },
  {
    "path": "data/maps/CeruleanCave_1F/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CAVE_1F\",\n  \"name\": \"CeruleanCave_1F\",\n  \"layout\": \"LAYOUT_CERULEAN_CAVE_1F\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_1F_EventScript_ItemNugget\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_1F_NUGGET\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_1F_EventScript_ItemFullRestore\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_1F_FULL_RESTORE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 5,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_1F_EventScript_ItemMaxElixir\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_1F_MAX_ELIXIR\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 33,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 34,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_B1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 30,\n      \"y\": 10,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 24,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 12,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ULTRA_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CERULEAN_CAVE_1F_ULTRA_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCave_1F/scripts.inc",
    "content": "CeruleanCave_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCave_1F_OnTransition\n\t.byte 0\n\nCeruleanCave_1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_CERULEAN_CAVE_1F\n\tsetescapewarp MAP_CERULEAN_CITY, 255, 1, 13\n\tend\n"
  },
  {
    "path": "data/maps/CeruleanCave_1F_Blue/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CAVE_1F_BLUE\",\n  \"name\": \"CeruleanCave_1F_Blue\",\n  \"layout\": \"LAYOUT_CERULEAN_CAVE_1F_BLUE\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_1F_EventScript_ItemNugget\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_1F_NUGGET\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_1F_EventScript_ItemFullRestore\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_1F_FULL_RESTORE\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_1F_EventScript_ItemMaxElixir\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_1F_MAX_ELIXIR\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 33,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": 7\n    },\n    {\n      \"x\": 34,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F_BLUE\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 1,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_B1F_BLUE\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 16,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F_BLUE\",\n      \"dest_warp_id\": 1\n    },\n    {\n      \"x\": 10,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F_BLUE\",\n      \"dest_warp_id\": 2\n    },\n    {\n      \"x\": 32,\n      \"y\": 9,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F_BLUE\",\n      \"dest_warp_id\": 3\n    },\n    {\n      \"x\": 27,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F_BLUE\",\n      \"dest_warp_id\": 4\n    },\n    {\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F_BLUE\",\n      \"dest_warp_id\": 5\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 24,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ULTRA_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CERULEAN_CAVE_1F_ULTRA_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCave_1F_Blue/scripts.inc",
    "content": "CeruleanCave_1F_Blue_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCave_1F_OnTransition\n\t.byte 0\n"
  },
  {
    "path": "data/maps/CeruleanCave_1F_Blue/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/CeruleanCave_1F_Yellow/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CAVE_1F_YELLOW\",\n  \"name\": \"CeruleanCave_1F_Yellow\",\n  \"layout\": \"LAYOUT_CERULEAN_CAVE_1F_YELLOW\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 4,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_1F_EventScript_ItemNugget\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_1F_NUGGET\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_1F_EventScript_ItemFullRestore\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_1F_FULL_RESTORE\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_1F_EventScript_ItemMaxElixir\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_1F_MAX_ELIXIR\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 37,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 34,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 37,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 33,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": 7\n    },\n    {\n      \"x\": 34,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F_YELLOW\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 1,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_B1F_YELLOW\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F_YELLOW\",\n      \"dest_warp_id\": 1\n    },\n    {\n      \"x\": 5,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F_YELLOW\",\n      \"dest_warp_id\": 2\n    },\n    {\n      \"x\": 30,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F_YELLOW\",\n      \"dest_warp_id\": 3\n    },\n    {\n      \"x\": 24,\n      \"y\": 11,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F_YELLOW\",\n      \"dest_warp_id\": 4\n    },\n    {\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_2F_YELLOW\",\n      \"dest_warp_id\": 5\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 25,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ULTRA_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CERULEAN_CAVE_1F_ULTRA_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCave_1F_Yellow/scripts.inc",
    "content": "CeruleanCave_1F_Yellow_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCave_1F_OnTransition\n\t.byte 0\n"
  },
  {
    "path": "data/maps/CeruleanCave_1F_Yellow/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/CeruleanCave_2F/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CAVE_2F\",\n  \"name\": \"CeruleanCave_2F\",\n  \"layout\": \"LAYOUT_CERULEAN_CAVE_2F\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_2F_EventScript_ItemPPUp\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_2F_PP_UP\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_2F_EventScript_ItemUltraBall\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_2F_ULTRA_BALL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_2F_EventScript_ItemFullRestore\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_2F_FULL_RESTORE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_18\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_19\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1A\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1B\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 33,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 26,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 23,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F\",\n      \"dest_warp_id\": \"7\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCave_2F/scripts.inc",
    "content": "CeruleanCave_2F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/CeruleanCave_2F_Blue/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CAVE_2F_BLUE\",\n  \"name\": \"CeruleanCave_2F_Blue\",\n  \"layout\": \"LAYOUT_CERULEAN_CAVE_2F_BLUE\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_2F_EventScript_ItemPPUp\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_2F_PP_UP\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_2F_EventScript_ItemUltraBall\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_2F_ULTRA_BALL\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_2F_EventScript_ItemFullRestore\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_2F_FULL_RESTORE\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_18\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_19\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1A\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1B\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 33,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_BLUE\",\n      \"dest_warp_id\": 1\n    },\n    {\n      \"x\": 13,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_BLUE\",\n      \"dest_warp_id\": 3\n    },\n    {\n      \"x\": 7,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_BLUE\",\n      \"dest_warp_id\": 4\n    },\n    {\n      \"x\": 26,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_BLUE\",\n      \"dest_warp_id\": 5\n    },\n    {\n      \"x\": 23,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_BLUE\",\n      \"dest_warp_id\": 6\n    },\n    {\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_BLUE\",\n      \"dest_warp_id\": 7\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCave_2F_Blue/scripts.inc",
    "content": "CeruleanCave_2F_Blue_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/CeruleanCave_2F_Blue/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/CeruleanCave_2F_Yellow/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CAVE_2F_YELLOW\",\n  \"name\": \"CeruleanCave_2F_Yellow\",\n  \"layout\": \"LAYOUT_CERULEAN_CAVE_2F_YELLOW\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_2F_EventScript_ItemPPUp\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_2F_PP_UP\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_2F_EventScript_ItemUltraBall\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_2F_ULTRA_BALL\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_2F_EventScript_ItemFullRestore\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_2F_FULL_RESTORE\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_18\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_19\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1A\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1B\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 33,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_YELLOW\",\n      \"dest_warp_id\": 1\n    },\n    {\n      \"x\": 13,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_YELLOW\",\n      \"dest_warp_id\": 3\n    },\n    {\n      \"x\": 7,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_YELLOW\",\n      \"dest_warp_id\": 4\n    },\n    {\n      \"x\": 26,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_YELLOW\",\n      \"dest_warp_id\": 5\n    },\n    {\n      \"x\": 23,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_YELLOW\",\n      \"dest_warp_id\": 6\n    },\n    {\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_YELLOW\",\n      \"dest_warp_id\": 7\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCave_2F_Yellow/scripts.inc",
    "content": "CeruleanCave_2F_Yellow_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/CeruleanCave_2F_Yellow/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/CeruleanCave_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CAVE_B1F\",\n  \"name\": \"CeruleanCave_B1F\",\n  \"layout\": \"LAYOUT_CERULEAN_CAVE_B1F\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 9,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_B1F_EventScript_ItemUltraBall\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_B1F_ULTRA_BALL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_B1F_EventScript_ItemMaxRevive\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_B1F_MAX_REVIVE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MEWTWO\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_B1F_EventScript_Mewtwo\",\n      \"flag\": \"FLAG_HIDE_MEWTWO\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 37,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 37,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_18\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_19\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1A\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCave_B1F/scripts.inc",
    "content": "CeruleanCave_B1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, CeruleanCave_B1F_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCave_B1F_OnTransition\n\t.byte 0\n\nCeruleanCave_B1F_OnResume::\n\tcall_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, CeruleanCave_B1F_EventScript_TryRemoveMewtwo\n\tend\n\nCeruleanCave_B1F_EventScript_TryRemoveMewtwo::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return\n\tremoveobject VAR_LAST_TALKED\n\treturn\n\nCeruleanCave_B1F_OnTransition::\n\tcall_if_set FLAG_FOUGHT_MEWTWO, CeruleanCave_B1F_EventScript_HideMewtwo\n\tcall_if_unset FLAG_FOUGHT_MEWTWO, CeruleanCave_B1F_EventScript_TryShowMewtwo\n\tend\n\nCeruleanCave_B1F_EventScript_TryShowMewtwo::\n\tgoto_if_set FLAG_MEWTWO_FLEW_AWAY, EventScript_Return\n\tclearflag FLAG_HIDE_MEWTWO\n\treturn\n\nCeruleanCave_B1F_EventScript_HideMewtwo::\n\tsetflag FLAG_HIDE_MEWTWO\n\treturn\n\nCeruleanCave_B1F_EventScript_Mewtwo::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_MEWTWO, CRY_MODE_ENCOUNTER\n\tmessage CeruleanCave_B1F_Text_Mew\n\twaitmessage\n\twaitmoncry\n\tdelay 20\n\tplaybgm MUS_ENCOUNTER_GYM_LEADER, 0\n\twaitbuttonpress\n\tsetwildbattle SPECIES_MEWTWO, 70\n\tsetflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecial StartLegendaryBattle\n\twaitstate\n\tclearflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_WON, CeruleanCave_B1F_EventScript_DefeatedMewtwo\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_RAN, CeruleanCave_B1F_EventScript_RanFromMewtwo\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, CeruleanCave_B1F_EventScript_RanFromMewtwo\n\tsetflag FLAG_FOUGHT_MEWTWO\n\trelease\n\tend\n\nCeruleanCave_B1F_EventScript_DefeatedMewtwo::\n\tsetflag FLAG_MEWTWO_FLEW_AWAY\n\tsetvar VAR_0x8004, SPECIES_MEWTWO\n\tgoto EventScript_MonFlewAway\n\tend\n\nCeruleanCave_B1F_EventScript_RanFromMewtwo::\n\tsetvar VAR_0x8004, SPECIES_MEWTWO\n\tgoto EventScript_MonFlewAway\n\tend\n"
  },
  {
    "path": "data/maps/CeruleanCave_B1F/text.inc",
    "content": "CeruleanCave_B1F_Text_Mew::\n    .string \"Mew!$\"\n\n"
  },
  {
    "path": "data/maps/CeruleanCave_B1F_Blue/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CAVE_B1F_BLUE\",\n  \"name\": \"CeruleanCave_B1F_Blue\",\n  \"layout\": \"LAYOUT_CERULEAN_CAVE_B1F_BLUE\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_B1F_EventScript_ItemUltraBall\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_B1F_ULTRA_BALL\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_B1F_EventScript_ItemMaxRevive\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_B1F_MAX_REVIVE\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MEWTWO\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 15,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_B1F_EventScript_Mewtwo\",\n      \"flag\": \"FLAG_HIDE_MEWTWO\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_18\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_19\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1A\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_BLUE\",\n      \"dest_warp_id\": 2\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCave_B1F_Blue/scripts.inc",
    "content": "CeruleanCave_B1F_Blue_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, CeruleanCave_B1F_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCave_B1F_OnTransition\n\t.byte 0\n"
  },
  {
    "path": "data/maps/CeruleanCave_B1F_Blue/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/CeruleanCave_B1F_Yellow/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CAVE_B1F_YELLOW\",\n  \"name\": \"CeruleanCave_B1F_Yellow\",\n  \"layout\": \"LAYOUT_CERULEAN_CAVE_B1F_YELLOW\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 13,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_B1F_EventScript_ItemUltraBall\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_B1F_ULTRA_BALL\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_B1F_EventScript_ItemMaxRevive\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_B1F_MAX_REVIVE\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MEWTWO\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 15,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCave_B1F_EventScript_Mewtwo\",\n      \"flag\": \"FLAG_HIDE_MEWTWO\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 34,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 34,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_18\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_19\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1A\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_CERULEAN_CAVE_1F_YELLOW\",\n      \"dest_warp_id\": 2\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCave_B1F_Yellow/scripts.inc",
    "content": "CeruleanCave_B1F_Yellow_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, CeruleanCave_B1F_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCave_B1F_OnTransition\n\t.byte 0\n"
  },
  {
    "path": "data/maps/CeruleanCave_B1F_Yellow/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/CeruleanCity/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CITY\",\n  \"name\": \"CeruleanCity\",\n  \"layout\": \"LAYOUT_CERULEAN_CITY\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 12,\n      \"map\": \"MAP_ROUTE24\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE5\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE4\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE9\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_Policeman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_Grunt\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_ROCKET\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SLOWBRO\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_Slowbro\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_Lass\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 34,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLUE\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 0,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_RIVAL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_CERULEAN_CITY_CUT_TREE\"\n    },\n    {\n      \"type\": \"clone\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"x\": 50,\n      \"y\": 18,\n      \"target_local_id\": 10,\n      \"target_map\": \"MAP_ROUTE9\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_CeruleanCaveGuard\",\n      \"flag\": \"FLAG_HIDE_CERULEAN_CAVE_GUARD\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BLACK_BELT\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Poliwrath\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_PSYCHIC_M\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Jynx\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY_HOUSE1\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 30,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY_HOUSE2\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY_HOUSE3\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY_GYM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY_BIKE_SHOP\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 28,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY_MART\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY_HOUSE1\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY_HOUSE2\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY_HOUSE2\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY_BIKE_SHOP\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 23,\n      \"y\": 28,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY_HOUSE4\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY_HOUSE5\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 22,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_CERULEAN_CITY_RIVAL\",\n      \"var_value\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_RivalTriggerLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 23,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_CERULEAN_CITY_RIVAL\",\n      \"var_value\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_RivalTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 24,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_CERULEAN_CITY_RIVAL\",\n      \"var_value\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_RivalTriggerRight\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 33,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_CERULEAN_CITY_ROCKET\",\n      \"var_value\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_GruntTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 33,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_CERULEAN_CITY_ROCKET\",\n      \"var_value\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_GruntTriggerBottom\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 1,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_2\",\n      \"var_value\": \"0\",\n      \"script\": \"CeruleanCity_EventScript_SetCeruleanCaveWarp\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 20,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_EventScript_CitySign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 27,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_EventScript_GymSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 28,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_EventScript_BikeShopSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 19,\n      \"y\": 32,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_EventScript_TrainerTips\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 18,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"item\": \"ITEM_RARE_CANDY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CERULEAN_CITY_RARE_CANDY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Bicycle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 27,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Bicycle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Bicycle\"\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCity/scripts.inc",
    "content": ".set LOCALID_POLICEMAN, 1\n.set LOCALID_GRUNT,     2\n.set LOCALID_SLOWBRO,   5\n.set LOCALID_LASS,      6\n.set LOCALID_RIVAL,     8\n.set LOCALID_WOMAN,     11\n.set LOCALID_POLIWRATH_MASTER, 13\n.set LOCALID_JYNX_MASTER,      14\n.set TRAINER, VAR_0x8009\n\nCeruleanCity_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_OnTransition\n\t.byte 0\n\nCeruleanCity_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_CERULEAN_CITY\n\tcall_if_unset FLAG_GOT_SS_TICKET, CeruleanCity_EventScript_BlockExits\n\tgoto CeruleanCity_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nCeruleanCity_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_POLIWRATH\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeruleanCity_MapScript_PoliwrathMasterMovementType\n\tsetvar TRAINER, MASTER_JYNX\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeruleanCity_MapScript_JynxMasterMovementType\n\tend\n\nCeruleanCity_MapScript_PoliwrathMasterMovementType::\n\tsetobjectmovementtype LOCALID_POLIWRATH_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\t\nCeruleanCity_MapScript_JynxMasterMovementType::\n\tsetobjectmovementtype LOCALID_JYNX_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeruleanCity_EventScript_BlockExits::\n\tsetobjectxyperm LOCALID_POLICEMAN, 30, 12\n\tsetobjectxyperm LOCALID_SLOWBRO, 26, 31\n\tsetobjectxyperm LOCALID_LASS, 27, 31\n\treturn\n\nCeruleanCity_EventScript_RivalTriggerLeft::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto CeruleanCity_EventScript_Rival\n\tend\n\nCeruleanCity_EventScript_RivalTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tsetobjectxyperm LOCALID_RIVAL, 23, 0\n\tgoto CeruleanCity_EventScript_Rival\n\tend\n\nCeruleanCity_EventScript_RivalTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tsetobjectxyperm LOCALID_RIVAL, 24, 0\n\tgoto CeruleanCity_EventScript_Rival\n\tend\n\nCeruleanCity_EventScript_Rival::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tsetvar VAR_MAP_SCENE_ROUTE22, 2\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\taddobject LOCALID_RIVAL\n\tapplymovement LOCALID_RIVAL, CeruleanCity_Movement_RivalEnter\n\twaitmovement 0\n\tmsgbox CeruleanCity_Text_RivalIntro\n\tsetvar VAR_LAST_TALKED, LOCALID_RIVAL\n\tcall_if_eq VAR_STARTER_MON, 2, CeruleanCity_EventScript_RivalSquirtle\n\tcall_if_eq VAR_STARTER_MON, 1, CeruleanCity_EventScript_RivalBulbasaur\n\tcall_if_eq VAR_STARTER_MON, 0, CeruleanCity_EventScript_RivalCharmander\n\tfamechecker FAMECHECKER_BILL, 0\n\tmsgbox CeruleanCity_Text_RivalPostBattle\n\tclosemessage\n\tplaybgm MUS_RIVAL_EXIT, 0\n\tcall_if_eq VAR_TEMP_1, 0, CeruleanCity_EventScript_RivalStartExit\n\tcall_if_eq VAR_TEMP_1, 1, CeruleanCity_EventScript_RivalStartExit\n\tcall_if_eq VAR_TEMP_1, 2, CeruleanCity_EventScript_RivalStartExitRight\n\tmsgbox CeruleanCity_Text_OhRightLittlePresentAsFavor\n\tsetvar VAR_MAP_SCENE_CERULEAN_CITY_RIVAL, 1\n\tsetflag FLAG_GOT_FAME_CHECKER\n\tgiveitem ITEM_FAME_CHECKER\n\tmsgbox CeruleanCity_Text_ExplainFameCheckerSmellYa\n\tclosemessage\n\tapplymovement LOCALID_RIVAL, CeruleanCity_Movement_RivalExit\n\twaitmovement 0\n\tfadedefaultbgm\n\tremoveobject LOCALID_RIVAL\n\treleaseall\n\tend\n\nCeruleanCity_EventScript_RivalSquirtle::\n\ttrainerbattle_no_intro TRAINER_RIVAL_CERULEAN_SQUIRTLE, CeruleanCity_Text_RivalDefeat\n\treturn\n\nCeruleanCity_EventScript_RivalBulbasaur::\n\ttrainerbattle_no_intro TRAINER_RIVAL_CERULEAN_BULBASAUR, CeruleanCity_Text_RivalDefeat\n\treturn\n\nCeruleanCity_EventScript_RivalCharmander::\n\ttrainerbattle_no_intro TRAINER_RIVAL_CERULEAN_CHARMANDER, CeruleanCity_Text_RivalDefeat\n\treturn\n\nCeruleanCity_EventScript_RivalStartExit::\n\tapplymovement OBJ_EVENT_ID_PLAYER, CeruleanCity_Movement_PlayerWatchRivalExit\n\tapplymovement LOCALID_RIVAL, CeruleanCity_Movement_RivalStartExit\n\twaitmovement 0\n\treturn\n\nCeruleanCity_EventScript_RivalStartExitRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, CeruleanCity_Movement_PlayerWatchRivalExitRight\n\tapplymovement LOCALID_RIVAL, CeruleanCity_Movement_RivalStartExitRight\n\twaitmovement 0\n\treturn\n\nCeruleanCity_Movement_PlayerWatchRivalExit::\n\tdelay_16\n\tdelay_8\n\twalk_in_place_faster_right\n\tdelay_16\n\twalk_in_place_faster_down\n\tstep_end\n\nCeruleanCity_Movement_PlayerWatchRivalExitRight::\n\tdelay_16\n\tdelay_8\n\twalk_in_place_faster_left\n\tdelay_16\n\twalk_in_place_faster_down\n\tstep_end\n\nCeruleanCity_Movement_RivalEnter::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nCeruleanCity_Movement_RivalStartExit::\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tdelay_16\n\tdelay_16\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nCeruleanCity_Movement_RivalStartExitRight::\n\twalk_left\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tdelay_16\n\tdelay_16\n\twalk_right\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nCeruleanCity_Movement_RivalExit::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nCeruleanCity_EventScript_Grunt::\n\tlock\n\tfaceplayer\n\tgoto_if_defeated TRAINER_TEAM_ROCKET_GRUNT_5, CeruleanCity_EventScript_GruntDefeated\n\tmessage CeruleanCity_Text_GruntIntro\n\twaitmessage\n\tplaybgm MUS_ENCOUNTER_ROCKET, 0\n\twaitbuttonpress\n\ttrainerbattle_no_intro TRAINER_TEAM_ROCKET_GRUNT_5, CeruleanCity_Text_GruntDefeat\n\tsetvar VAR_MAP_SCENE_CERULEAN_CITY_ROCKET, 1\n\tgoto CeruleanCity_EventScript_GruntDefeated\n\tend\n\nCeruleanCity_EventScript_GruntDefeated::\n\tmsgbox CeruleanCity_Text_OkayIllReturnStolenTM\n\tcheckitemspace ITEM_TM28\n\tgoto_if_eq VAR_RESULT, FALSE, CeruleanCity_EventScript_NoRoomForTM28\n\tgiveitem_msg CeruleanCity_Text_RecoveredTM28FromGrunt, ITEM_TM28\n\tmsgbox CeruleanCity_Text_BetterGetMovingBye\n\tclosemessage\n\tfadescreen FADE_TO_BLACK\n\tremoveobject LOCALID_GRUNT\n\tfadescreen FADE_FROM_BLACK\n\tsetflag FLAG_GOT_TM28_FROM_ROCKET\n\trelease\n\tend\n\nCeruleanCity_EventScript_NoRoomForTM28::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox CeruleanCity_Text_MakeRoomForThisCantRun\n\trelease\n\tend\n\nCeruleanCity_EventScript_GruntTriggerTop::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tapplymovement LOCALID_GRUNT, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tgoto CeruleanCity_EventScript_GruntTrigger\n\tend\n\nCeruleanCity_EventScript_GruntTriggerBottom::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tapplymovement LOCALID_GRUNT, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tgoto CeruleanCity_EventScript_GruntTrigger\n\tend\n\nCeruleanCity_EventScript_GruntTrigger::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox CeruleanCity_Text_GruntIntro\n\tsetvar VAR_LAST_TALKED, LOCALID_GRUNT\n\ttrainerbattle_no_intro TRAINER_TEAM_ROCKET_GRUNT_5, CeruleanCity_Text_GruntDefeat\n\tsetvar VAR_MAP_SCENE_CERULEAN_CITY_ROCKET, 1\n\tgoto CeruleanCity_EventScript_GruntDefeated\n\tend\n\nCeruleanCity_EventScript_Policeman::\n\tlock\n\tfaceplayer\n\tmsgbox CeruleanCity_Text_PeopleHereWereRobbed\n\tclosemessage\n\tapplymovement LOCALID_POLICEMAN, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nCeruleanCity_EventScript_LittleBoy::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_SS_TICKET, CeruleanCity_EventScript_LittleBoySlowbroMoved\n\tmsgbox CeruleanCity_Text_IfSlowbroWasntThereCouldCutTree\n\trelease\n\tend\n\nCeruleanCity_EventScript_LittleBoySlowbroMoved::\n\tmsgbox CeruleanCity_Text_YouCanCutDownSmallTrees\n\trelease\n\tend\n\nCeruleanCity_EventScript_BaldingMan::\n\tmsgbox CeruleanCity_Text_PokemonEncyclopediaAmusing, MSGBOX_NPC\n\tend\n\nCeruleanCity_EventScript_Youngster::\n\tmsgbox CeruleanCity_Text_TrainerLifeIsToughIsntIt, MSGBOX_NPC\n\tend\n\nCeruleanCity_EventScript_CeruleanCaveGuard::\n\tmsgbox CeruleanCity_Text_ThisIsCeruleanCave, MSGBOX_NPC\n\tend\n\nCeruleanCity_EventScript_Woman::\n\tlock\n\tfaceplayer\n\tmsgbox CeruleanCity_Text_WantBrightRedBicycle\n\tclosemessage\n\tapplymovement LOCALID_WOMAN, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nCeruleanCity_EventScript_Lass::\n\tlock\n\trandom 3\n\tcopyvar VAR_0x8008, VAR_RESULT\n\tcall_if_eq VAR_0x8008, 0, CeruleanCity_EventScript_SlowbroCommand1\n\tcall_if_eq VAR_0x8008, 1, CeruleanCity_EventScript_SlowbroCommand2\n\tcall_if_eq VAR_0x8008, 2, CeruleanCity_EventScript_SlowbroCommand3\n\twaitmessage\n\tdelay 40\n\tplayse SE_PIN\n\tapplymovement LOCALID_SLOWBRO, Common_Movement_QuestionMark\n\twaitmovement 0\n\tdelay 30\n\tcall_if_eq VAR_0x8008, 0, CeruleanCity_EventScript_SlowbroFailed1\n\tcall_if_eq VAR_0x8008, 1, CeruleanCity_EventScript_SlowbroFailed2\n\tcall_if_eq VAR_0x8008, 2, CeruleanCity_EventScript_SlowbroFailed3\n\trelease\n\tend\n\nCeruleanCity_EventScript_SlowbroCommand1::\n\tmessage CeruleanCity_Text_SlowbroUseSonicboom\n\treturn\n\nCeruleanCity_EventScript_SlowbroCommand2::\n\tmessage CeruleanCity_Text_SlowbroPunch\n\treturn\n\nCeruleanCity_EventScript_SlowbroCommand3::\n\tmessage CeruleanCity_Text_SlowbroWithdraw\n\treturn\n\nCeruleanCity_EventScript_SlowbroFailed1::\n\tmsgbox CeruleanCity_Text_SlowbroPayAttention\n\treturn\n\nCeruleanCity_EventScript_SlowbroFailed2::\n\tmsgbox CeruleanCity_Text_NoYouBlewItAgain\n\treturn\n\nCeruleanCity_EventScript_SlowbroFailed3::\n\tmsgbox CeruleanCity_Text_HardToControlMonsObedience\n\treturn\n\nCeruleanCity_EventScript_Slowbro::\n\tlock\n\trandom 4\n\tcopyvar VAR_0x8008, VAR_RESULT\n\tcall_if_eq VAR_0x8008, 0, CeruleanCity_EventScript_SlowbroText1\n\tcall_if_eq VAR_0x8008, 1, CeruleanCity_EventScript_SlowbroText2\n\tcall_if_eq VAR_0x8008, 2, CeruleanCity_EventScript_SlowbroText3\n\tcall_if_eq VAR_0x8008, 3, CeruleanCity_EventScript_SlowbroText4\n\trelease\n\tend\n\nCeruleanCity_EventScript_SlowbroText1::\n\tmsgbox CeruleanCity_Text_SlowbroTookSnooze\n\treturn\n\nCeruleanCity_EventScript_SlowbroText2::\n\tmsgbox CeruleanCity_Text_SlowbroLoafingAround\n\treturn\n\nCeruleanCity_EventScript_SlowbroText3::\n\tmsgbox CeruleanCity_Text_SlowbroTurnedAway\n\treturn\n\nCeruleanCity_EventScript_SlowbroText4::\n\tmsgbox CeruleanCity_Text_SlowbroIgnoredOrders\n\treturn\n\nCeruleanCity_EventScript_CitySign::\n\tmsgbox CeruleanCity_Text_CitySign, MSGBOX_SIGN\n\tend\n\nCeruleanCity_EventScript_TrainerTips::\n\tmsgbox CeruleanCity_Text_TrainerTipsHeldItems, MSGBOX_SIGN\n\tend\n\nCeruleanCity_EventScript_BikeShopSign::\n\tmsgbox CeruleanCity_Text_BikeShopSign, MSGBOX_SIGN\n\tend\n\nCeruleanCity_EventScript_GymSign::\n\tlockall\n\tfamechecker FAMECHECKER_MISTY, 0\n\tmsgbox CeruleanCity_Text_GymSign\n\treleaseall\n\tend\n\nCeruleanCity_EventScript_SetCeruleanCaveWarp::\n\tcallnative DetermineCeruleanCaveLayout\n\tcompare VAR_RESULT, 0\n\tgoto_if_eq CeruleanCity_EventScript_SetCeruleanCaveRG\n\tcompare VAR_RESULT, 1\n\tgoto_if_eq CeruleanCity_EventScript_SetCeruleanCaveRB\n\tcompare VAR_RESULT, 2\n\tgoto_if_eq CeruleanCity_EventScript_SetCeruleanCaveY\n\tend\n\nCeruleanCity_EventScript_SetCeruleanCaveRG::\n\tsetdynamicwarp MAP_CERULEAN_CAVE_1F, 255, 33, 21\n\trelease\n\tend\n\nCeruleanCity_EventScript_SetCeruleanCaveRB::\n\tsetdynamicwarp MAP_CERULEAN_CAVE_1F_BLUE, 255, 33, 21\n\trelease\n\tend\n\nCeruleanCity_EventScript_SetCeruleanCaveY::\n\tsetdynamicwarp MAP_CERULEAN_CAVE_1F_YELLOW, 255, 33, 21\n\trelease\n\tend\n\n"
  },
  {
    "path": "data/maps/CeruleanCity/text.inc",
    "content": "CeruleanCity_Text_RivalIntro::\n    .string \"{RIVAL}: Yo! {PLAYER}!\\p\"\n    .string \"You're still struggling along back\\n\"\n    .string \"here?\\p\"\n    .string \"I'm doing great! I caught a bunch\\n\"\n    .string \"of strong and smart POKéMON!\\p\"\n    .string \"Here, let me see what you caught,\\n\"\n    .string \"{PLAYER}!$\"\n\nCeruleanCity_Text_RivalDefeat::\n    .string \"Hey!\\n\"\n    .string \"Take it easy!\\l\"\n    .string \"You won already!$\"\n\nCeruleanCity_Text_RivalPostBattle::\n    .string \"{RIVAL}: Hey, guess what?\\p\"\n    .string \"I went to BILL's and got him to\\n\"\n    .string \"show me his rare POKéMON.\\p\"\n    .string \"That added a lot of pages to my\\n\"\n    .string \"POKéDEX!\\p\"\n    .string \"After all, BILL's world famous as a\\n\"\n    .string \"POKéMANIAC.\\p\"\n    .string \"He invented the POKéMON Storage\\n\"\n    .string \"System on PC, too.\\p\"\n    .string \"Since you're using his system,\\n\"\n    .string \"you should go thank him.\\p\"\n    .string \"Well, I better get rolling!\\n\"\n    .string \"Smell ya later!$\"\n\nCeruleanCity_Text_OhRightLittlePresentAsFavor::\n    .string \"Oh, yeah, right.\\p\"\n    .string \"I feel sorry for you. No, really.\\n\"\n    .string \"You're always plodding behind me.\\p\"\n    .string \"So here, I'll give you a little\\n\"\n    .string \"present as a favor.$\"\n\nCeruleanCity_Text_ExplainFameCheckerSmellYa::\n    .string \"A chatty gossip like you…\\n\"\n    .string \"That thing's perfect.\\p\"\n    .string \"I don't need it because I don't\\n\"\n    .string \"give a hoot about others.\\p\"\n    .string \"All right, this time I really am\\n\"\n    .string \"gone. Smell ya!$\"\n\nCeruleanCity_Text_GruntIntro::\n    .string \"Hey! Stay out!\\n\"\n    .string \"It's not your yard!\\p\"\n    .string \"…Huh?\\n\"\n    .string \"Me?\\p\"\n    .string \"I'm an innocent bystander!\\n\"\n    .string \"Don't you believe me?{PLAY_BGM}{MUS_ENCOUNTER_ROCKET}$\"\n\nCeruleanCity_Text_GruntDefeat::\n    .string \"GRUNT: Stop! I give up!\\n\"\n    .string \"I'll leave quietly!$\"\n\nCeruleanCity_Text_OkayIllReturnStolenTM::\n    .string \"…Okay.\\n\"\n    .string \"I'll return the TM I stole.$\"\n\nCeruleanCity_Text_RecoveredTM28FromGrunt::\n    .string \"{PLAYER} recovered TM28 from\\n\"\n    .string \"the TEAM ROCKET GRUNT.$\"\n\nCeruleanCity_Text_BetterGetMovingBye::\n    .string \"I better get moving!\\n\"\n    .string \"Bye!$\"\n\nCeruleanCity_Text_MakeRoomForThisCantRun::\n    .string \"Make room for this!\\n\"\n    .string \"I can't run until I give it to you!$\"\n\nCeruleanCity_Text_TrainerLifeIsToughIsntIt::\n    .string \"You're a TRAINER, too?\\p\"\n    .string \"Collecting, battling…\\n\"\n    .string \"It's a tough life, isn't it?$\"\n\nCeruleanCity_Text_YouCanCutDownSmallTrees::\n    .string \"Did you know that you can CUT down\\n\"\n    .string \"small trees?\\p\"\n    .string \"Even that small tree in front of\\n\"\n    .string \"the shop can be CUT down.\\p\"\n    .string \"I think there's a way around it,\\n\"\n    .string \"though.$\"\n\nCeruleanCity_Text_IfSlowbroWasntThereCouldCutTree::\n    .string \"If that SLOWBRO wasn't there, you\\n\"\n    .string \"could CUT down the small tree.\\p\"\n    .string \"That way, you could get to the\\n\"\n    .string \"other side.\\p\"\n    .string \"I think there's a way around it,\\n\"\n    .string \"though.$\"\n\nCeruleanCity_Text_PokemonEncyclopediaAmusing::\n    .string \"You're making an encyclopedia on\\n\"\n    .string \"POKéMON? That sounds amusing.$\"\n\nCeruleanCity_Text_PeopleHereWereRobbed::\n    .string \"The people here were robbed.\\p\"\n    .string \"It's obvious that TEAM ROCKET is\\n\"\n    .string \"behind this most heinous crime!\\p\"\n    .string \"Even our POLICE FORCE has\\n\"\n    .string \"trouble with the ROCKETS!$\"\n\nCeruleanCity_Text_SlowbroUseSonicboom::\n    .string \"Okay! SLOWBRO!\\n\"\n    .string \"Use SONICBOOM!$\"\n\nCeruleanCity_Text_SlowbroPayAttention::\n    .string \"Come on, SLOWBRO, pay attention!$\"\n\nCeruleanCity_Text_SlowbroPunch::\n    .string \"SLOWBRO, punch!$\"\n\nCeruleanCity_Text_NoYouBlewItAgain::\n    .string \"No!\\n\"\n    .string \"You blew it again!$\"\n\nCeruleanCity_Text_SlowbroWithdraw::\n    .string \"SLOWBRO, WITHDRAW!$\"\n\nCeruleanCity_Text_HardToControlMonsObedience::\n    .string \"No! That's wrong!\\n\"\n    .string \"It's so hard to control POKéMON!\\p\"\n    .string \"Your POKéMON's obedience depends\\n\"\n    .string \"on your abilities as a TRAINER.$\"\n\nCeruleanCity_Text_SlowbroTookSnooze::\n    .string \"SLOWBRO took a snooze…$\"\n\nCeruleanCity_Text_SlowbroLoafingAround::\n    .string \"SLOWBRO is loafing around…$\"\n\nCeruleanCity_Text_SlowbroTurnedAway::\n    .string \"SLOWBRO turned away…$\"\n\nCeruleanCity_Text_SlowbroIgnoredOrders::\n    .string \"SLOWBRO ignored orders…$\"\n\nCeruleanCity_Text_WantBrightRedBicycle::\n    .string \"I want a bright red bicycle.\\p\"\n    .string \"I'll keep it at home, so it won't\\n\"\n    .string \"get dirty.$\"\n\nCeruleanCity_Text_ThisIsCeruleanCave::\n    .string \"This is CERULEAN CAVE.\\p\"\n    .string \"Horribly strong POKéMON live inside\\n\"\n    .string \"there.\\p\"\n    .string \"It takes a very special TRAINER to\\n\"\n    .string \"be allowed inside there.\\p\"\n    .string \"You'd have to be strong enough to\\n\"\n    .string \"become the POKéMON LEAGUE\\l\"\n    .string \"CHAMPION for starters.\\p\"\n    .string \"And, you would have to have\\n\"\n    .string \"made a great achievement.$\"\n\nCeruleanCity_Text_CitySign::\n    .string \"CERULEAN CITY\\n\"\n    .string \"A Mysterious, Blue Aura Surrounds\\l\"\n    .string \"It$\"\n\nCeruleanCity_Text_TrainerTipsHeldItems::\n    .string \"TRAINER TIPS\\p\"\n    .string \"A POKéMON can be made to hold\\n\"\n    .string \"an item.\\p\"\n    .string \"Some items can even be used by\\n\"\n    .string \"the holding POKéMON in battle.$\"\n\nCeruleanCity_Text_BikeShopSign::\n    .string \"Grass and caves handled easily!\\n\"\n    .string \"BIKE SHOP$\"\n\nCeruleanCity_Text_GymSign::\n    .string \"CERULEAN CITY POKéMON GYM\\n\"\n    .string \"LEADER: MISTY\\l\"\n    .string \"The Tomboyish Mermaid!$\"\n\n"
  },
  {
    "path": "data/maps/CeruleanCity_BikeShop/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CITY_BIKE_SHOP\",\n  \"name\": \"CeruleanCity_BikeShop\",\n  \"layout\": \"LAYOUT_CERULEAN_CITY_BIKE_SHOP\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BIRD_KEEPER\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Doduo\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Bicycle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Bicycle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Bicycle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Bicycle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Bicycle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Bicycle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Bicycle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_BikeShop_EventScript_Bicycle\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCity_BikeShop/scripts.inc",
    "content": ".set LOCALID_DODUO_MASTER, 4\n.set TRAINER, VAR_0x8009\n\nCeruleanCity_BikeShop_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_BikeShop_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nCeruleanCity_BikeShop_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_DODUO\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeruleanCity_BikeShop_MapScript_DoduoMasterMovementType\n\tend\n\nCeruleanCity_BikeShop_MapScript_DoduoMasterMovementType::\n\tsetobjectmovementtype LOCALID_DODUO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeruleanCity_BikeShop_EventScript_Clerk::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_BICYCLE, CeruleanCity_BikeShop_EventScript_AlreadyGotBicycle\n\tgoto_if_set FLAG_GOT_BIKE_VOUCHER, CeruleanCity_BikeShop_EventScript_ExchangeBikeVoucher\n\tshowmoneybox 0, 0\n\tmessage CeruleanCity_BikeShop_Text_WelcomeToBikeShop\n\twaitmessage\n\tmultichoice 11, 0, MULTICHOICE_BIKE_SHOP, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CeruleanCity_BikeShop_EventScript_TryPurchaseBicycle\n\tcase 1, CeruleanCity_BikeShop_EventScript_ClerkGoodbye\n\tcase 127, CeruleanCity_BikeShop_EventScript_ClerkGoodbye\n\tend\n\n@ The Bicycle price / players money is never actually checked\nCeruleanCity_BikeShop_EventScript_TryPurchaseBicycle::\n\tmsgbox CeruleanCity_BikeShop_Text_SorryYouCantAffordIt\n\tgoto CeruleanCity_BikeShop_EventScript_ClerkGoodbye\n\tend\n\nCeruleanCity_BikeShop_EventScript_ClerkGoodbye::\n\tmsgbox CeruleanCity_BikeShop_Text_ThankYouComeAgain\n\thidemoneybox\n\trelease\n\tend\n\nCeruleanCity_BikeShop_EventScript_ExchangeBikeVoucher::\n\tmsgbox CeruleanCity_BikeShop_Text_OhBikeVoucherHereYouGo\n\tmsgreceiveditem CeruleanCity_BikeShop_Text_ExchangedVoucherForBicycle, ITEM_BICYCLE, 1, MUS_OBTAIN_KEY_ITEM\n\tsetflag FLAG_GOT_BICYCLE\n\tadditem ITEM_BICYCLE\n\tremoveitem ITEM_BIKE_VOUCHER\n\tmsgbox CeruleanCity_BikeShop_Text_ExplainBicycleGears\n\tmsgbox CeruleanCity_BikeShop_Text_ThankYouComeAgain\n\trelease\n\tend\n\nCeruleanCity_BikeShop_EventScript_AlreadyGotBicycle::\n\tmsgbox CeruleanCity_BikeShop_Text_HowDoYouLikeNewBicycle\n\trelease\n\tend\n\n@ Unused\nCeruleanCity_BikeShop_EventScript_NoRoomForBicycle::\n\tmsgbox CeruleanCity_BikeShop_Text_MakeRoomForBicycle\n\trelease\n\tend\n\nCeruleanCity_BikeShop_EventScript_Woman::\n\tmsgbox CeruleanCity_BikeShop_Text_CityBikeGoodEnoughForMe, MSGBOX_NPC\n\tend\n\nCeruleanCity_BikeShop_EventScript_Youngster::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_BICYCLE, CeruleanCity_BikeShop_EventScript_YoungsterHaveBike\n\tmsgbox CeruleanCity_BikeShop_Text_BikesCoolButExpensive\n\trelease\n\tend\n\nCeruleanCity_BikeShop_EventScript_YoungsterHaveBike::\n\tmsgbox CeruleanCity_BikeShop_Text_WowYourBikeIsCool\n\trelease\n\tend\n\nCeruleanCity_BikeShop_EventScript_Bicycle::\n\tmsgbox CeruleanCity_BikeShop_Text_ShinyNewBicycle, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/CeruleanCity_BikeShop/text.inc",
    "content": "CeruleanCity_BikeShop_Text_WelcomeToBikeShop::\n    .string \"Hi!\\n\"\n    .string \"Welcome to our BIKE SHOP.\\p\"\n    .string \"Have we got just the BIKE for\\n\"\n    .string \"you!$\"\n\nCeruleanCity_BikeShop_Text_SorryYouCantAffordIt::\n    .string \"Sorry!\\n\"\n    .string \"You can't afford it!$\"\n\nCeruleanCity_BikeShop_Text_OhBikeVoucherHereYouGo::\n    .string \"Oh, that's…\\p\"\n    .string \"A BIKE VOUCHER!\\p\"\n    .string \"Okay!\\n\"\n    .string \"Here you go!$\"\n\nCeruleanCity_BikeShop_Text_ExchangedVoucherForBicycle::\n    .string \"{PLAYER} exchanged the\\n\"\n    .string \"BIKE VOUCHER for a BICYCLE.$\"\n\nCeruleanCity_BikeShop_Text_ThankYouComeAgain::\n    .string \"Thank you!\\n\"\n    .string \"Come back again sometime!$\"\n\nCeruleanCity_BikeShop_Text_ExplainBicycleGears::\n    .string \"This BICYCLE has two gears.\\n\"\n    .string \"Press the B Button to switch them\\l\"\n    .string \"for more control of your speed!$\"\n\nCeruleanCity_BikeShop_Text_HowDoYouLikeNewBicycle::\n    .string \"How do you like your new BICYCLE?\\n\"\n    .string \"Do you like how it rides?\\p\"\n    .string \"You can take it out on CYCLING\\n\"\n    .string \"ROAD and even into caves!\\p\"\n    .string \"You can switch gears for more\\n\"\n    .string \"speed too with the B Button!$\"\n\nCeruleanCity_BikeShop_Text_MakeRoomForBicycle::\n    .string \"You better make room for your\\n\"\n    .string \"BICYCLE!$\"\n\nCeruleanCity_BikeShop_Text_CityBikeGoodEnoughForMe::\n    .string \"A plain city bike is good enough\\n\"\n    .string \"for me.\\p\"\n    .string \"After all, you can't put a shopping\\n\"\n    .string \"basket on a mountain bike.$\"\n\nCeruleanCity_BikeShop_Text_BikesCoolButExpensive::\n    .string \"These bikes are cool, but they're\\n\"\n    .string \"way expensive!$\"\n\nCeruleanCity_BikeShop_Text_WowYourBikeIsCool::\n    .string \"Wow.\\n\"\n    .string \"Your BIKE is really cool!$\"\n\nCeruleanCity_BikeShop_Text_ShinyNewBicycle::\n    .string \"A shiny new BICYCLE!$\"\n\n"
  },
  {
    "path": "data/maps/CeruleanCity_Gym/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CITY_GYM\",\n  \"name\": \"CeruleanCity_Gym\",\n  \"layout\": \"LAYOUT_CERULEAN_CITY_GYM\",\n  \"music\": \"MUS_GYM\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_GYM\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"CeruleanCity_Gym_EventScript_Luis\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"CeruleanCity_Gym_EventScript_Diana\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MISTY\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_Gym_EventScript_Misty\",\n      \"flag\": \"FLAG_TEMP_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GYM_GUY\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_Gym_EventScript_GymGuy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_Gym_EventScript_GymStatue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_Gym_EventScript_GymStatue\"\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCity_Gym/scripts.inc",
    "content": ".equ CHECK_VISITOR_STATE, 6\n.equ TYPE, VAR_0x8003\n.equ ARGUMENT, VAR_0x8004\n\nCeruleanCity_Gym_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_Gym_OnTransition\n\t.byte 0\n\nCeruleanCity_Gym_OnTransition::\n\tsetvar TYPE, CHECK_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_MISTY\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 1, CeruleanCity_Gym_EventScript_HideMisty\n\tend\n\nCeruleanCity_Gym_EventScript_HideMisty::\n\tsetflag FLAG_TEMP_1\n\treturn\n\nCeruleanCity_Gym_EventScript_Misty::\n\tfamechecker FAMECHECKER_MISTY, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, CeruleanCity_Gym_EventScript_Misty_ChallengeMode\n\ttrainerbattle_single TRAINER_LEADER_MISTY, CeruleanCity_Gym_Text_MistyIntro, CeruleanCity_Gym_Text_MistyDefeat, CeruleanCity_Gym_EventScript_MistyDefeated, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_MISTY_CHALLENGE\n\tgoto_if_unset FLAG_GOT_TM03_FROM_MISTY, CeruleanCity_Gym_EventScript_GiveTM03\n\tmsgbox CeruleanCity_Gym_Text_ExplainTM03\n\trelease\n\tend\n\nCeruleanCity_Gym_EventScript_Misty_ChallengeMode::\n\ttrainerbattle_single TRAINER_LEADER_MISTY_CHALLENGE, CeruleanCity_Gym_Text_MistyIntro, CeruleanCity_Gym_Text_MistyDefeat, CeruleanCity_Gym_EventScript_MistyDefeated, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_MISTY\n\tgoto_if_unset FLAG_GOT_TM03_FROM_MISTY, CeruleanCity_Gym_EventScript_GiveTM03\n\tmsgbox CeruleanCity_Gym_Text_ExplainTM03\n\trelease\n\tend\n\nCeruleanCity_Gym_EventScript_MistyDefeated::\n\tfamechecker FAMECHECKER_MISTY, 1\n\tsetflag FLAG_DEFEATED_MISTY\n\tsetflag FLAG_BADGE02_GET\n\tsetrespawn SPAWN_CERULEAN_CITY\n\tset_gym_trainers 2\n\tgoto CeruleanCity_Gym_EventScript_GiveTM03\n\tend\n\nCeruleanCity_Gym_EventScript_GiveTM03::\n\tmsgbox CeruleanCity_Gym_Text_ExplainCascadeBadge\n\tcheckitemspace ITEM_TM03\n\tgoto_if_eq VAR_RESULT, FALSE, CeruleanCity_Gym_EventScript_NoRoomForTM03\n\tgiveitem_msg CeruleanCity_Gym_Text_ReceivedTM03FromMisty, ITEM_TM03\n\tsetflag FLAG_GOT_TM03_FROM_MISTY\n\tmsgbox CeruleanCity_Gym_Text_ExplainTM03\n\trelease\n\tend\n\nCeruleanCity_Gym_EventScript_NoRoomForTM03::\n\tmsgbox CeruleanCity_Gym_Text_BetterMakeRoomForThis\n\trelease\n\tend\n\nCeruleanCity_Gym_EventScript_Diana::\n\ttrainerbattle_single TRAINER_PICNICKER_DIANA, CeruleanCity_Gym_Text_DianaIntro, CeruleanCity_Gym_Text_DianaDefeat\n\tmsgbox CeruleanCity_Gym_Text_DianaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCeruleanCity_Gym_EventScript_Luis::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_LUIS, CeruleanCity_Gym_Text_LuisIntro, CeruleanCity_Gym_Text_LuisDefeat\n\tfamechecker FAMECHECKER_MISTY, 2\n\tmsgbox CeruleanCity_Gym_Text_LuisPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCeruleanCity_Gym_EventScript_GymGuy::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_DEFEATED_MISTY, CeruleanCity_Gym_EventScript_GymGuyPostVictory\n\tmsgbox CeruleanCity_Gym_Text_GymGuyAdvice\n\trelease\n\tend\n\nCeruleanCity_Gym_EventScript_GymGuyPostVictory::\n\tmsgbox CeruleanCity_Gym_Text_WeMakePrettyGoodTeam\n\trelease\n\tend\n\nCeruleanCity_Gym_EventScript_GymStatue::\n\tlockall\n\tgoto_if_set FLAG_BADGE02_GET, CeruleanCity_Gym_EventScript_GymStatuePostVictory\n\tmsgbox CeruleanCity_Gym_Text_GymStatue\n\treleaseall\n\tend\n\nCeruleanCity_Gym_EventScript_GymStatuePostVictory::\n\tmsgbox CeruleanCity_Gym_Text_GymStatuePlayerWon\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/CeruleanCity_Gym/text.inc",
    "content": "CeruleanCity_Gym_Text_MistyIntro::\n    .string \"Hi, you're a new face!\\p\"\n    .string \"Only those TRAINERS who have a\\n\"\n    .string \"policy about POKéMON can turn pro.\\p\"\n    .string \"What is your approach when you\\n\"\n    .string \"catch and train POKéMON?\\p\"\n    .string \"My policy is an all-out offensive\\n\"\n    .string \"with WATER-type POKéMON!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nCeruleanCity_Gym_Text_ExplainTM03::\n    .string \"TM03 teaches WATER PULSE.\\p\"\n    .string \"Use it on an aquatic POKéMON!$\"\n\nCeruleanCity_Gym_Text_ExplainCascadeBadge::\n    .string \"The CASCADEBADGE makes all\\n\"\n    .string \"POKéMON up to Lv. 30 obey.\\p\"\n    .string \"That includes even outsiders you\\n\"\n    .string \"got in trades.\\p\"\n    .string \"There's more. You can now use CUT\\n\"\n    .string \"anytime, even out of battle.\\p\"\n    .string \"You can CUT down small trees to\\n\"\n    .string \"open new pathways.\\p\"\n    .string \"You can also have my favorite TM.$\"\n\nCeruleanCity_Gym_Text_ReceivedTM03FromMisty::\n    .string \"{PLAYER} received TM03\\n\"\n    .string \"from MISTY.$\"\n\nCeruleanCity_Gym_Text_BetterMakeRoomForThis::\n    .string \"You better make room for this!$\"\n\nCeruleanCity_Gym_Text_MistyDefeat::\n    .string \"Wow!\\n\"\n    .string \"You're too much!\\p\"\n    .string \"All right!\\p\"\n    .string \"You can have the CASCADEBADGE to\\n\"\n    .string \"show you beat me.$\"\n\nCeruleanCity_Gym_Text_DianaIntro::\n    .string \"What? You?\\n\"\n    .string \"I'm more than good enough for you!\\p\"\n    .string \"MISTY won't have to be bothered.$\"\n\nCeruleanCity_Gym_Text_DianaDefeat::\n    .string \"You overwhelmed me!$\"\n\nCeruleanCity_Gym_Text_DianaPostBattle::\n    .string \"You have to face other TRAINERS\\n\"\n    .string \"to see how good you really are.$\"\n\nCeruleanCity_Gym_Text_LuisIntro::\n    .string \"Splash!\\p\"\n    .string \"I'm first up!\\n\"\n    .string \"Let's do it!$\"\n\nCeruleanCity_Gym_Text_LuisDefeat::\n    .string \"That can't be!$\"\n\nCeruleanCity_Gym_Text_LuisPostBattle::\n    .string \"MISTY is a TRAINER who's going to\\n\"\n    .string \"keep improving.\\p\"\n    .string \"She won't lose to someone like you!$\"\n\nCeruleanCity_Gym_Text_GymGuyAdvice::\n    .string \"Yo!\\n\"\n    .string \"Champ in the making!\\p\"\n    .string \"Let me give you some advice!\\p\"\n    .string \"The LEADER, MISTY, is a pro who\\n\"\n    .string \"uses WATER-type POKéMON.\\p\"\n    .string \"You can drain all their water with\\n\"\n    .string \"GRASS-type POKéMON.\\p\"\n    .string \"Or, you might use ELECTRIC-type\\n\"\n    .string \"POKéMON and zap them!$\"\n\nCeruleanCity_Gym_Text_WeMakePrettyGoodTeam::\n    .string \"You beat MISTY!\\n\"\n    .string \"See, what'd I tell ya?\\p\"\n    .string \"You and me, kid, we make a pretty\\n\"\n    .string \"darn-good team!$\"\n\nCeruleanCity_Gym_Text_GymStatue::\n    .string \"CERULEAN POKéMON GYM\\n\"\n    .string \"LEADER: MISTY\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}$\"\n\nCeruleanCity_Gym_Text_GymStatuePlayerWon::\n    .string \"CERULEAN POKéMON GYM\\n\"\n    .string \"LEADER: MISTY\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}, {PLAYER}$\"\n\n"
  },
  {
    "path": "data/maps/CeruleanCity_House1/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CITY_HOUSE1\",\n  \"name\": \"CeruleanCity_House1\",\n  \"layout\": \"LAYOUT_CERULEAN_CITY_HOUSE1\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_House1_EventScript_BadgeGuy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"8\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCity_House1/scripts.inc",
    "content": "CeruleanCity_House1_MapScripts::\n\t.byte 0\n\nCeruleanCity_House1_EventScript_BadgeGuy::\n\tlock\n\tfaceplayer\n\tmsgbox CeruleanCity_House1_Text_BadgesHaveAmazingSecrets\n\tmessage CeruleanCity_House1_Text_DescribeWhichBadge\n\twaitmessage\n\tsetvar VAR_0x8004, LISTMENU_BADGES\n\tspecial ListMenu\n\twaitstate\n\tswitch VAR_RESULT\n\tcase 0, CeruleanCity_House1_EventScript_DescribeBoulderBadge\n\tcase 1, CeruleanCity_House1_EventScript_DescribeCascadeBadge\n\tcase 2, CeruleanCity_House1_EventScript_DescribeThunderBadge\n\tcase 3, CeruleanCity_House1_EventScript_DescribeRainbowBadge\n\tcase 4, CeruleanCity_House1_EventScript_DescribeSoulBadge\n\tcase 5, CeruleanCity_House1_EventScript_DescribeMarshBadge\n\tcase 6, CeruleanCity_House1_EventScript_DescribeVolcanoBadge\n\tcase 7, CeruleanCity_House1_EventScript_DescribeEarthBadge\n\tcase 8, CeruleanCity_House1_EventScript_StopDescribingBadges\n\tcase 127, CeruleanCity_House1_EventScript_StopDescribingBadges\n\tend\n\nCeruleanCity_House1_EventScript_DescribeAnotherBadge::\n\tmessage CeruleanCity_House1_Text_DescribeWhichBadge\n\twaitmessage\n\tspecial ReturnToListMenu\n\twaitstate\n\tswitch VAR_RESULT\n\tcase 0, CeruleanCity_House1_EventScript_DescribeBoulderBadge\n\tcase 1, CeruleanCity_House1_EventScript_DescribeCascadeBadge\n\tcase 2, CeruleanCity_House1_EventScript_DescribeThunderBadge\n\tcase 3, CeruleanCity_House1_EventScript_DescribeRainbowBadge\n\tcase 4, CeruleanCity_House1_EventScript_DescribeSoulBadge\n\tcase 5, CeruleanCity_House1_EventScript_DescribeMarshBadge\n\tcase 6, CeruleanCity_House1_EventScript_DescribeVolcanoBadge\n\tcase 7, CeruleanCity_House1_EventScript_DescribeEarthBadge\n\tcase 8, CeruleanCity_House1_EventScript_StopDescribingBadges\n\tcase 127, CeruleanCity_House1_EventScript_StopDescribingBadges\n\tend\n\nCeruleanCity_House1_EventScript_DescribeBoulderBadge::\n\tmsgbox CeruleanCity_House1_Text_AttackStatFlash\n\tgoto CeruleanCity_House1_EventScript_DescribeAnotherBadge\n\tend\n\nCeruleanCity_House1_EventScript_DescribeCascadeBadge::\n\tmsgbox CeruleanCity_House1_Text_ObeyLv30Cut\n\tgoto CeruleanCity_House1_EventScript_DescribeAnotherBadge\n\tend\n\nCeruleanCity_House1_EventScript_DescribeThunderBadge::\n\tmsgbox CeruleanCity_House1_Text_SpeedStatFly\n\tgoto CeruleanCity_House1_EventScript_DescribeAnotherBadge\n\tend\n\nCeruleanCity_House1_EventScript_DescribeRainbowBadge::\n\tmsgbox CeruleanCity_House1_Text_ObeyLv50Strength\n\tgoto CeruleanCity_House1_EventScript_DescribeAnotherBadge\n\tend\n\nCeruleanCity_House1_EventScript_DescribeSoulBadge::\n\tmsgbox CeruleanCity_House1_Text_DefenseStatSurf\n\tgoto CeruleanCity_House1_EventScript_DescribeAnotherBadge\n\tend\n\nCeruleanCity_House1_EventScript_DescribeMarshBadge::\n\tmsgbox CeruleanCity_House1_Text_ObeyLv70RockSmash\n\tgoto CeruleanCity_House1_EventScript_DescribeAnotherBadge\n\tend\n\nCeruleanCity_House1_EventScript_DescribeVolcanoBadge::\n\tmsgbox CeruleanCity_House1_Text_SpStatsWaterfall\n\tgoto CeruleanCity_House1_EventScript_DescribeAnotherBadge\n\tend\n\nCeruleanCity_House1_EventScript_DescribeEarthBadge::\n\tmsgbox CeruleanCity_House1_Text_AllMonsWillObeyYou\n\tgoto CeruleanCity_House1_EventScript_DescribeAnotherBadge\n\tend\n\nCeruleanCity_House1_EventScript_StopDescribingBadges::\n\tmsgbox CeruleanCity_House1_Text_ComeVisitAnytime\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/CeruleanCity_House1/text.inc",
    "content": "CeruleanCity_House1_Text_BadgesHaveAmazingSecrets::\n    .string \"Only skilled TRAINERS can collect\\n\"\n    .string \"POKéMON BADGES.\\p\"\n    .string \"I see you have at least one.\\p\"\n    .string \"Those BADGES have amazing secrets,\\n\"\n    .string \"did you know?$\"\n\nCeruleanCity_House1_Text_DescribeWhichBadge::\n    .string \"Now then…\\p\"\n    .string \"Which of the eight BADGES should\\n\"\n    .string \"I describe?$\"\n\nCeruleanCity_House1_Text_ComeVisitAnytime::\n    .string \"Come visit me anytime you wish.$\"\n\nCeruleanCity_House1_Text_AttackStatFlash::\n    .string \"The ATTACK stat of all your\\n\"\n    .string \"POKéMON increases a little bit.\\p\"\n    .string \"It also lets you use the move\\n\"\n    .string \"FLASH outside of battle.$\"\n\nCeruleanCity_House1_Text_ObeyLv30Cut::\n    .string \"POKéMON up to Lv. 30 will obey\\n\"\n    .string \"you.\\p\"\n    .string \"That includes even outsiders you\\n\"\n    .string \"obtain in trades.\\p\"\n    .string \"POKéMON of higher levels will\\n\"\n    .string \"be unruly in battle, however.\\p\"\n    .string \"It also lets you use the move\\n\"\n    .string \"CUT outside of battle.$\"\n\nCeruleanCity_House1_Text_SpeedStatFly::\n    .string \"The SPEED stat of all your\\n\"\n    .string \"POKéMON increases a little bit.\\p\"\n    .string \"It also lets you use the move\\n\"\n    .string \"FLY outside of battle.$\"\n\nCeruleanCity_House1_Text_ObeyLv50Strength::\n    .string \"POKéMON up to Lv. 50 will obey\\n\"\n    .string \"you.\\p\"\n    .string \"That includes even outsiders you\\n\"\n    .string \"obtain in trades.\\p\"\n    .string \"POKéMON of higher levels will\\n\"\n    .string \"be unruly in battle, however.\\p\"\n    .string \"It also lets you use the move\\n\"\n    .string \"STRENGTH outside of battle.$\"\n\nCeruleanCity_House1_Text_DefenseStatSurf::\n    .string \"The DEFENSE stat of all your\\n\"\n    .string \"POKéMON increases a little bit.\\p\"\n    .string \"It also lets you use the move\\n\"\n    .string \"SURF outside of battle.$\"\n\nCeruleanCity_House1_Text_ObeyLv70RockSmash::\n    .string \"POKéMON up to Lv. 70 will obey\\n\"\n    .string \"you.\\p\"\n    .string \"That includes even outsiders you\\n\"\n    .string \"obtain in trades.\\p\"\n    .string \"POKéMON of higher levels will\\n\"\n    .string \"be unruly in battle, however.\\p\"\n    .string \"It also lets you use the move\\n\"\n    .string \"ROCK SMASH outside of battle.$\"\n\nCeruleanCity_House1_Text_SpStatsWaterfall::\n    .string \"The SP. ATK and SP. DEF stats of\\n\"\n    .string \"all your POKéMON rise a little bit.\\p\"\n    .string \"It also lets you use the move\\n\"\n    .string \"WATERFALL outside of battle.$\"\n\nCeruleanCity_House1_Text_AllMonsWillObeyYou::\n    .string \"All POKéMON will obey you!$\"\n\n"
  },
  {
    "path": "data/maps/CeruleanCity_House2/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CITY_HOUSE2\",\n  \"name\": \"CeruleanCity_House2\",\n  \"layout\": \"LAYOUT_CERULEAN_CITY_HOUSE2\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_House2_EventScript_Hiker\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_House2_EventScript_Lass\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Raticate\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 1,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"9\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_House2_EventScript_WallHole\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCity_House2/scripts.inc",
    "content": ".set LOCALID_RATICATE_MASTER, 3\n.set TRAINER, VAR_0x8009\n\nCeruleanCity_House2_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_House2_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nCeruleanCity_House2_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_RATICATE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeruleanCity_House2_MapScript_RaticateMasterMovementType\n\tend\n\nCeruleanCity_House2_MapScript_RaticateMasterMovementType::\n\tsetobjectmovementtype LOCALID_RATICATE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeruleanCity_House2_EventScript_Hiker::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_TM28_FROM_ROCKET, CeruleanCity_House2_EventScript_HikerGotTM28\n\tmsgbox CeruleanCity_House2_Text_RocketsStoleTMForDig\n\trelease\n\tend\n\nCeruleanCity_House2_EventScript_HikerGotTM28::\n\tmsgbox CeruleanCity_House2_Text_TeachDiglettDigWithoutTM\n\trelease\n\tend\n\nCeruleanCity_House2_EventScript_Lass::\n\tmsgbox CeruleanCity_House2_Text_TeamRocketTryingToDigIntoNoGood, MSGBOX_NPC\n\tend\n\nCeruleanCity_House2_EventScript_WallHole::\n\tmsgbox CeruleanCity_House2_Text_TeamRocketLeftWayOut, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/CeruleanCity_House2/text.inc",
    "content": "CeruleanCity_House2_Text_RocketsStoleTMForDig::\n    .string \"Those miserable ROCKETS!\\p\"\n    .string \"Look what they've done to my\\n\"\n    .string \"house!\\p\"\n    .string \"They stole a TM for teaching\\n\"\n    .string \"POKéMON how to DIG holes!\\p\"\n    .string \"I was going to use it on a\\n\"\n    .string \"MANKEY or a SANDSHREW…\\p\"\n    .string \"That cost me a bundle, it did!$\"\n\nCeruleanCity_House2_Text_TeachDiglettDigWithoutTM::\n    .string \"I figure what's lost is lost.\\p\"\n    .string \"I decided to teach DIGLETT how to\\n\"\n    .string \"DIG without a TM.$\"\n\nCeruleanCity_House2_Text_TeamRocketTryingToDigIntoNoGood::\n    .string \"TEAM ROCKET must be trying to DIG\\n\"\n    .string \"their way into no good!$\"\n\nCeruleanCity_House2_Text_TeamRocketLeftWayOut::\n    .string \"TEAM ROCKET left a way out!$\"\n\n"
  },
  {
    "path": "data/maps/CeruleanCity_House3/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CITY_HOUSE3\",\n  \"name\": \"CeruleanCity_House3\",\n  \"layout\": \"LAYOUT_HOUSE1\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_House3_EventScript_Dontae\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_House3_EventScript_OldWoman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Poliwhirl\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCity_House3/scripts.inc",
    "content": ".set LOCALID_POLIWHIRL_MASTER, 3\n.set TRAINER, VAR_0x8009\n\nCeruleanCity_House3_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_House3_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nCeruleanCity_House3_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_POLIWHIRL\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeruleanCity_House3_MapScript_PoliwhirlMasterMovementType\n\tend\n\nCeruleanCity_House3_MapScript_PoliwhirlMasterMovementType::\n\tsetobjectmovementtype LOCALID_POLIWHIRL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeruleanCity_House3_EventScript_OldWoman::\n\tmsgbox CeruleanCity_House3_Text_PleaseTradeWithMyHusband, MSGBOX_NPC\n\tend\n\nCeruleanCity_House3_EventScript_Dontae::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8008, INGAME_TRADE_JYNX\n\tcall EventScript_GetInGameTradeSpeciesInfo\n\tgoto_if_set FLAG_DID_ZYNX_TRADE, CeruleanCity_House3_EventScript_AlreadyTraded\n\tmsgbox Trade_Text_DoYouHaveMonWouldYouTradeForMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeruleanCity_House3_EventScript_DeclineTrade\n\tcall EventScript_ChooseMonForInGameTrade\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, CeruleanCity_House3_EventScript_DeclineTrade\n\tcall EventScript_GetInGameTradeSpecies\n\tgoto_if_ne VAR_RESULT, VAR_0x8009, CeruleanCity_House3_EventScript_NotRequestedMon\n\tcall EventScript_DoInGameTrade\n\tmsgbox Trade_Text_Thanks\n\tsetflag FLAG_DID_ZYNX_TRADE\n\trelease\n\tend\n\nCeruleanCity_House3_EventScript_DeclineTrade::\n\tmsgbox Trade_Text_WellIfYouDontWantTo\n\trelease\n\tend\n\nCeruleanCity_House3_EventScript_NotRequestedMon::\n\tbufferspeciesname STR_VAR_1, VAR_0x8009\n\tmsgbox Trade_Text_ThisIsntMon\n\trelease\n\tend\n\nCeruleanCity_House3_EventScript_AlreadyTraded::\n\tmsgbox Trade_Text_HasTradedMonGrownStronger\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/CeruleanCity_House3/text.inc",
    "content": "CeruleanCity_House3_Text_PleaseTradeWithMyHusband::\n    .string \"My husband likes trading POKéMON.\\p\"\n    .string \"You're collecting POKéMON for your\\n\"\n    .string \"POKéDEX, aren't you?\\p\"\n    .string \"Would you please trade with him?$\"\n\n"
  },
  {
    "path": "data/maps/CeruleanCity_House4/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CITY_HOUSE4\",\n  \"name\": \"CeruleanCity_House4\",\n  \"layout\": \"LAYOUT_HOUSE1\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"x\": 5,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_House4_EventScript_WonderNewsBerryMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"12\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCity_House4/scripts.inc",
    "content": ".set LOCALID_WONDER_NEWS_BERRY_MAN, 1\n\n.set REWARD_TYPE, VAR_0x8004\n.set REWARD_ITEM, VAR_0x8008\n\nCeruleanCity_House4_MapScripts::\n\t.byte 0\n\nCeruleanCity_House4_EventScript_WonderNewsBerryMan::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tspecialvar REWARD_TYPE, WonderNews_GetRewardInfo\n\tcopyvar REWARD_ITEM, VAR_RESULT\n\tgoto_if_eq REWARD_TYPE, NEWS_REWARD_NONE,       CeruleanCity_House4_EventScript_NoNews\n\tgoto_if_eq REWARD_TYPE, NEWS_REWARD_RECV_SMALL, CeruleanCity_House4_EventScript_Reward_RecvSmall\n\tgoto_if_eq REWARD_TYPE, NEWS_REWARD_RECV_BIG,   CeruleanCity_House4_EventScript_Reward_RecvBig\n\tgoto_if_eq REWARD_TYPE, NEWS_REWARD_WAITING,    CeruleanCity_House4_EventScript_Waiting\n\tgoto_if_eq REWARD_TYPE, NEWS_REWARD_SENT_SMALL, CeruleanCity_House4_EventScript_Reward_SentSmall\n\tgoto_if_eq REWARD_TYPE, NEWS_REWARD_SENT_BIG,   CeruleanCity_House4_EventScript_Reward_SentBig\n\tgoto_if_eq REWARD_TYPE, NEWS_REWARD_AT_MAX,     CeruleanCity_House4_EventScript_AtMax\n\tend\n\n@ Mystery Gift is not enabled, or the player has no saved Wonder News\nCeruleanCity_House4_EventScript_NoNews::\n\tmsgbox CeruleanCity_House4_Text_NothingEntertaining\n\trelease\n\tend\n\n@ Small reward for receiving Wonder News from friend\nCeruleanCity_House4_EventScript_Reward_RecvSmall::\n\tcall CeruleanCity_House4_EventScript_MovementReactionToNews\n\tmsgbox CeruleanCity_House4_Text_NewNewsInformativeHaveThis\n\tgiveitem REWARD_ITEM\n\tgoto_if_eq VAR_RESULT, FALSE, CeruleanCity_House4_EventScript_NoRoomForBerries\n\trelease\n\tend\n\n@ Big reward for receiving Wonder News from non-friend source\nCeruleanCity_House4_EventScript_Reward_RecvBig::\n\tcall CeruleanCity_House4_EventScript_MovementReactionToNews\n\tmsgbox CeruleanCity_House4_Text_IncredibleNewsHaveBerries\n\tgiveitem REWARD_ITEM, 4\n\tgoto_if_eq VAR_RESULT, FALSE, CeruleanCity_House4_EventScript_NoRoomForBerries\n\trelease\n\tend\n\n@ Player has not recently sent Wonder News\nCeruleanCity_House4_EventScript_Waiting::\n\tapplymovement LOCALID_WONDER_NEWS_BERRY_MAN, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox CeruleanCity_House4_Text_WishCouldShareNewsWithOthers\n\trelease\n\tend\n\n@ Small reward for sending Wonder News every 1-3 times\nCeruleanCity_House4_EventScript_Reward_SentSmall::\n\tcall CeruleanCity_House4_EventScript_MovementReactionToNews\n\tmsgbox CeruleanCity_House4_Text_ThanksForSpreadingNewsTakeThis\n\tgiveitem REWARD_ITEM\n\tgoto_if_eq VAR_RESULT, FALSE, CeruleanCity_House4_EventScript_NoRoomForBerries\n\trelease\n\tend\n\n@ Big reward for sending Wonder News every 4th time\nCeruleanCity_House4_EventScript_Reward_SentBig::\n\tcall CeruleanCity_House4_EventScript_MovementReactionToNews\n\tmsgbox CeruleanCity_House4_Text_MagnificentNewsSpreadHaveBerries\n\tgiveitem REWARD_ITEM, 4\n\tgoto_if_eq VAR_RESULT, FALSE, CeruleanCity_House4_EventScript_NoRoomForBerries\n\trelease\n\tend\n\n@ Player has hit reward limit and must wait to receive new rewards\nCeruleanCity_House4_EventScript_AtMax::\n\tapplymovement LOCALID_WONDER_NEWS_BERRY_MAN, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox CeruleanCity_House4_Text_EnjoyingMyselfWithAllSortsOfNews\n\trelease\n\tend\n\nCeruleanCity_House4_EventScript_MovementReactionToNews::\n\tplayse SE_PIN\n\tapplymovement LOCALID_WONDER_NEWS_BERRY_MAN, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_WONDER_NEWS_BERRY_MAN, Common_Movement_FacePlayer\n\twaitmovement 0\n\tapplymovement LOCALID_WONDER_NEWS_BERRY_MAN, Common_Movement_Delay48\n\twaitmovement 0\n\treturn\n\nCeruleanCity_House4_EventScript_NoRoomForBerries::\n\tmsgbox CeruleanCity_House4_Text_YourBerryPouchIsFull\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/CeruleanCity_House4/text.inc",
    "content": "CeruleanCity_House4_Text_NothingEntertaining::\n    .string \"Sigh…\\n\"\n    .string \"Too much time, too little to do…\\p\"\n    .string \"Is nothing entertaining happening\\n\"\n    .string \"anywhere?$\"\n\nCeruleanCity_House4_Text_NewNewsInformativeHaveThis::\n    .string \"Ah!\\n\"\n    .string \"A new news report!\\p\"\n    .string \"Hmm…\\p\"\n    .string \"I see!\\n\"\n    .string \"That was quite informative!\\p\"\n    .string \"I applaud you for taking interest\\n\"\n    .string \"in the news at your young age.\\p\"\n    .string \"As my thanks for sharing the news\\n\"\n    .string \"with me, I want you to have this.$\"\n\nCeruleanCity_House4_Text_IncredibleNewsHaveBerries::\n    .string \"Oh, oh!\\n\"\n    .string \"Th-this news report!\\p\"\n    .string \"Hmm…\\p\"\n    .string \"Amazing!\\n\"\n    .string \"What an incredible piece of news!\\p\"\n    .string \"I haven't seen a news story this\\n\"\n    .string \"incredible in too long a time!\\p\"\n    .string \"Thanks for sharing this fantastic\\n\"\n    .string \"news. Have a bunch of BERRIES!$\"\n\nCeruleanCity_House4_Text_WishCouldShareNewsWithOthers::\n    .string \"It seems such a shame to not share\\n\"\n    .string \"this news with other folks…\\p\"\n    .string \"I wish I could tell someone…\\n\"\n    .string \"Let others know the news…$\"\n\nCeruleanCity_House4_Text_ThanksForSpreadingNewsTakeThis::\n    .string \"Ah, you've spread the news for me?\\p\"\n    .string \"Good news becomes worthwhile when\\n\"\n    .string \"all sorts of people share it.\\p\"\n    .string \"As my thanks for your spreading\\n\"\n    .string \"the news, take this!$\"\n\nCeruleanCity_House4_Text_MagnificentNewsSpreadHaveBerries::\n    .string \"You've spread the news some more?\\n\"\n    .string \"Magnificent!\\p\"\n    .string \"That piece of news must be\\n\"\n    .string \"delighted to be passed around so.\\p\"\n    .string \"Yes, indeed!\\p\"\n    .string \"Consider this a show of\\n\"\n    .string \"appreciation from me and the news.\\p\"\n    .string \"I'll give you more BERRIES than\\n\"\n    .string \"I usually do.$\"\n\nCeruleanCity_House4_Text_EnjoyingMyselfWithAllSortsOfNews::\n    .string \"I'm quite enjoying myself with all\\n\"\n    .string \"sorts of news.\\p\"\n    .string \"Yes, I am satisfied!\\n\"\n    .string \"I won't be bored for a while.$\"\n\nCeruleanCity_House4_Text_YourBerryPouchIsFull::\n    .string \"Hm? Your BERRY POUCH is full.\\n\"\n    .string \"My gift remains ungiven, then.$\"\n\n"
  },
  {
    "path": "data/maps/CeruleanCity_House5/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CITY_HOUSE5\",\n  \"name\": \"CeruleanCity_House5\",\n  \"layout\": \"LAYOUT_CERULEAN_CITY_HOUSE5\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_House5_EventScript_BerryPowderMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Dragonite\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"13\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CeruleanCity_House5_EventScript_BerryCrushRankings\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCity_House5/scripts.inc",
    "content": ".set LOCALID_DRAGONITE_MASTER, 2\n.set TRAINER, VAR_0x8009\n\nCeruleanCity_House5_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_House5_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nCeruleanCity_House5_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_DRAGONITE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CeruleanCity_House5_MapScript_DragoniteMasterMovementType\n\tend\n\nCeruleanCity_House5_MapScript_DragoniteMasterMovementType::\n\tsetobjectmovementtype LOCALID_DRAGONITE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCeruleanCity_House5_EventScript_BerryPowderMan::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_POWDER_JAR, CeruleanCity_House5_EventScript_AskToExchangePowder\n\tmsgbox CeruleanCity_House1_Text_AnyInterestInBerries, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeruleanCity_House5_EventScript_NoInterestInBerries\n\tgoto_if_unset FLAG_SYS_GOT_BERRY_POUCH, CeruleanCity_House5_EventScript_NoBerries\n\tmsgbox CeruleanCity_House1_Text_HaveJustTheThing\n\tsetflag FLAG_GOT_POWDER_JAR\n\tgiveitem ITEM_POWDER_JAR\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_BagIsFull\n\tmsgbox CeruleanCity_House1_Text_GoCrushBerriesAtDirectCorner\n\trelease\n\tend\n\nCeruleanCity_House5_EventScript_NoBerries::\n\tmsgbox CeruleanCity_House1_Text_WhyMustYouLieNoBerries\n\trelease\n\tend\n\nCeruleanCity_House5_EventScript_NoInterestInBerries::\n\tmsgbox CeruleanCity_House1_Text_TakeInterestInAllSortsOfThings\n\trelease\n\tend\n\nCeruleanCity_House5_EventScript_AskToExchangePowder::\n\tspecial DisplayBerryPowderVendorMenu\n\tmsgbox CeruleanCity_House1_Text_HaveYouBroughtBerryPowder\n\tgoto CeruleanCity_House5_EventScript_ChooseExchangeItem\n\tend\n\nCeruleanCity_House5_EventScript_ChooseExchangeItem::\n\tmessage CeruleanCity_House5_Text_ExchangeWithWhat\n\twaitmessage\n\tsetvar VAR_0x8004, LISTMENU_BERRY_POWDER\n\tspecial ListMenu\n\twaitstate\n\tswitch VAR_RESULT\n\tcase 0, CeruleanCity_House5_EventScript_EnergyPowder\n\tcase 1, CeruleanCity_House5_EventScript_EnergyRoot\n\tcase 2, CeruleanCity_House5_EventScript_HealPowder\n\tcase 3, CeruleanCity_House5_EventScript_RevivalHerb\n\tcase 4, CeruleanCity_House5_EventScript_Protein\n\tcase 5, CeruleanCity_House5_EventScript_Iron\n\tcase 6, CeruleanCity_House5_EventScript_Carbos\n\tcase 7, CeruleanCity_House5_EventScript_Calcium\n\tcase 8, CeruleanCity_House5_EventScript_Zinc\n\tcase 9, CeruleanCity_House5_EventScript_HPUp\n\tcase 10, CeruleanCity_House5_EventScript_PPUp\n\tcase 11, CeruleanCity_House5_EventScript_ExitMenu\n\tcase 127, CeruleanCity_House5_EventScript_ExitMenu\n\tend\n\nCeruleanCity_House5_EventScript_EnergyPowder::\n\tbufferitemname STR_VAR_1, ITEM_ENERGY_POWDER\n\tsetvar VAR_0x8008, ITEM_ENERGY_POWDER\n\tsetvar VAR_0x8009, 50\n\tgoto CeruleanCity_House5_EventScript_ExchangePowderForItem\n\tend\n\nCeruleanCity_House5_EventScript_EnergyRoot::\n\tbufferitemname STR_VAR_1, ITEM_ENERGY_ROOT\n\tsetvar VAR_0x8008, ITEM_ENERGY_ROOT\n\tsetvar VAR_0x8009, 80\n\tgoto CeruleanCity_House5_EventScript_ExchangePowderForItem\n\tend\n\nCeruleanCity_House5_EventScript_HealPowder::\n\tbufferitemname STR_VAR_1, ITEM_HEAL_POWDER\n\tsetvar VAR_0x8008, ITEM_HEAL_POWDER\n\tsetvar VAR_0x8009, 50\n\tgoto CeruleanCity_House5_EventScript_ExchangePowderForItem\n\tend\n\nCeruleanCity_House5_EventScript_RevivalHerb::\n\tbufferitemname STR_VAR_1, ITEM_REVIVAL_HERB\n\tsetvar VAR_0x8008, ITEM_REVIVAL_HERB\n\tsetvar VAR_0x8009, 300\n\tgoto CeruleanCity_House5_EventScript_ExchangePowderForItem\n\tend\n\nCeruleanCity_House5_EventScript_Protein::\n\tbufferitemname STR_VAR_1, ITEM_PROTEIN\n\tsetvar VAR_0x8008, ITEM_PROTEIN\n\tsetvar VAR_0x8009, 1000\n\tgoto CeruleanCity_House5_EventScript_ExchangePowderForItem\n\tend\n\nCeruleanCity_House5_EventScript_Iron::\n\tbufferitemname STR_VAR_1, ITEM_IRON\n\tsetvar VAR_0x8008, ITEM_IRON\n\tsetvar VAR_0x8009, 1000\n\tgoto CeruleanCity_House5_EventScript_ExchangePowderForItem\n\tend\n\nCeruleanCity_House5_EventScript_Carbos::\n\tbufferitemname STR_VAR_1, ITEM_CARBOS\n\tsetvar VAR_0x8008, ITEM_CARBOS\n\tsetvar VAR_0x8009, 1000\n\tgoto CeruleanCity_House5_EventScript_ExchangePowderForItem\n\tend\n\nCeruleanCity_House5_EventScript_Calcium::\n\tbufferitemname STR_VAR_1, ITEM_CALCIUM\n\tsetvar VAR_0x8008, ITEM_CALCIUM\n\tsetvar VAR_0x8009, 1000\n\tgoto CeruleanCity_House5_EventScript_ExchangePowderForItem\n\tend\n\nCeruleanCity_House5_EventScript_Zinc::\n\tbufferitemname STR_VAR_1, ITEM_ZINC\n\tsetvar VAR_0x8008, ITEM_ZINC\n\tsetvar VAR_0x8009, 1000\n\tgoto CeruleanCity_House5_EventScript_ExchangePowderForItem\n\tend\n\nCeruleanCity_House5_EventScript_HPUp::\n\tbufferitemname STR_VAR_1, ITEM_HP_UP\n\tsetvar VAR_0x8008, ITEM_HP_UP\n\tsetvar VAR_0x8009, 1000\n\tgoto CeruleanCity_House5_EventScript_ExchangePowderForItem\n\tend\n\nCeruleanCity_House5_EventScript_PPUp::\n\tbufferitemname STR_VAR_1, ITEM_PP_UP\n\tsetvar VAR_0x8008, ITEM_PP_UP\n\tsetvar VAR_0x8009, 3000\n\tgoto CeruleanCity_House5_EventScript_ExchangePowderForItem\n\tend\n\nCeruleanCity_House5_EventScript_ExitMenu::\n\tmsgbox CeruleanCity_House1_Text_SeeMeIfYoudLikeToTradePowder\n\tspecial RemoveBerryPowderVendorMenu\n\trelease\n\tend\n\nCeruleanCity_House5_EventScript_ExchangePowderForItem::\n\tmsgbox CeruleanCity_House1_Text_YoullExchangeBerryPowderForItem, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeruleanCity_House5_EventScript_ChooseExchangeItem\n\tcopyvar VAR_0x8004, VAR_0x8009\n\tspecialvar VAR_RESULT, Script_HasEnoughBerryPowder\n\tgoto_if_eq VAR_RESULT, FALSE, CeruleanCity_House5_EventScript_NotEnoughBerryPowder\n\tgiveitem VAR_0x8008\n\tgoto_if_eq VAR_RESULT, FALSE, CeruleanCity_House5_EventScript_BagIsFull\n\tcopyvar VAR_0x8004, VAR_0x8009\n\tspecial Script_TakeBerryPowder\n\tspecial PrintPlayerBerryPowderAmount\n\tmsgbox CeruleanCity_House1_Text_TradeMoreBerryPowder, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, CeruleanCity_House5_EventScript_ChooseExchangeItem\n\tmsgbox CeruleanCity_House1_Text_HopeToSeeYouAgain\n\tspecial RemoveBerryPowderVendorMenu\n\trelease\n\tend\n\nCeruleanCity_House5_EventScript_BagIsFull::\n\tmsgbox Text_BagIsFull\n\tspecial RemoveBerryPowderVendorMenu\n\trelease\n\tend\n\nCeruleanCity_House5_EventScript_NotEnoughBerryPowder::\n\tmsgbox CeruleanCity_House1_Text_DontHaveEnoughBerryPowder\n\tgoto CeruleanCity_House5_EventScript_ChooseExchangeItem\n\tend\n\nCeruleanCity_House5_EventScript_BerryCrushRankings::\n\tlockall\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial ShowBerryCrushRankings\n\twaitstate\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/CeruleanCity_House5/text.inc",
    "content": "CeruleanCity_House1_Text_AnyInterestInBerries::\n    .string \"I concoct a variety of medicine\\n\"\n    .string \"from BERRY POWDER.\\p\"\n    .string \"Using good BERRY POWDER, I can\\n\"\n    .string \"make any kind of medicine.\\p\"\n    .string \"Now tell me, have you any interest\\n\"\n    .string \"in BERRIES?$\"\n\nCeruleanCity_House1_Text_HaveJustTheThing::\n    .string \"Ah, good! For you, then, I have\\n\"\n    .string \"just the thing.$\"\n\nCeruleanCity_House1_Text_GoCrushBerriesAtDirectCorner::\n    .string \"There's something new on the second\\n\"\n    .string \"floor of POKéMON CENTERS, at the\\l\"\n    .string \"DIRECT CORNER.\\p\"\n    .string \"They installed a Wireless Adapter\\n\"\n    .string \"machine for crushing BERRIES.\\p\"\n    .string \"This is where you come in.\\p\"\n    .string \"I have a favor to ask, one that\\n\"\n    .string \"I can entrust only to you.\\p\"\n    .string \"Could you make BERRY POWDER for\\n\"\n    .string \"me using that machine?\\p\"\n    .string \"Don't forget, the machine is at the\\n\"\n    .string \"DIRECT CORNER of POKéMON CENTERS.\\p\"\n    .string \"I'll concoct medicine for you if\\n\"\n    .string \"you bring me some BERRY POWDER.\\p\"\n    .string \"Don't forget, crush BERRIES into\\n\"\n    .string \"BERRY POWDER and bring it to me.$\"\n\nCeruleanCity_House1_Text_WhyMustYouLieNoBerries::\n    .string \"Why must you lie to me?\\p\"\n    .string \"How many BERRIES do you have?\\n\"\n    .string \"Not a one!$\"\n\nCeruleanCity_House1_Text_TakeInterestInAllSortsOfThings::\n    .string \"You have no interest in BERRIES?\\p\"\n    .string \"Young one, it's important to take an\\n\"\n    .string \"interest in all sorts of things.$\"\n\nCeruleanCity_House1_Text_HaveYouBroughtBerryPowder::\n    .string \"Er-hem! Have you brought me some\\n\"\n    .string \"BERRY POWDER?$\"\n\nCeruleanCity_House5_Text_ExchangeWithWhat::\n    .string \"With what would you like to \\n\"\n    .string \"exchange it?$\"\n\nCeruleanCity_House1_Text_YoullExchangeBerryPowderForItem::\n    .string \"Fine, you'll exchange your BERRY\\n\"\n    .string \"POWDER for one {STR_VAR_1}?$\"\n\nCeruleanCity_House1_Text_DontHaveEnoughBerryPowder::\n    .string \"Hm? You don't have enough\\n\"\n    .string \"BERRY POWDER.$\"\n\nCeruleanCity_House1_Text_TradeMoreBerryPowder::\n    .string \"This is fine BERRY POWDER indeed.\\n\"\n    .string \"It will make excellent medicine.\\p\"\n    .string \"Would you like to trade more BERRY\\n\"\n    .string \"POWDER for something else?$\"\n\nCeruleanCity_House1_Text_HopeToSeeYouAgain::\n    .string \"That's fine, then.\\n\"\n    .string \"I'll hope to see you back again.$\"\n\nCeruleanCity_House1_Text_SeeMeIfYoudLikeToTradePowder::\n    .string \"Come see me if you'd like to trade\\n\"\n    .string \"your BERRY POWDER.$\"\n\n"
  },
  {
    "path": "data/maps/CeruleanCity_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CITY_MART\",\n  \"name\": \"CeruleanCity_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_Mart_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_Mart_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"x\": 1,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_Mart_EventScript_Youngster\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCity_Mart/scripts.inc",
    "content": "CeruleanCity_Mart_MapScripts::\n\t.byte 0\n\nCeruleanCity_Mart_EventScript_Youngster::\n\tmsgbox CeruleanCity_Mart_Text_RepelWorksOnWeakMons, MSGBOX_NPC\n\tend\n\nCeruleanCity_Mart_EventScript_Woman::\n\tmsgbox CeruleanCity_Mart_Text_DoYouKnowAboutRareCandy, MSGBOX_NPC\n\tend\n\nCeruleanCity_Mart_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart CeruleanCity_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nCeruleanCity_Mart_Items::\n\t.2byte ITEM_POKE_BALL\n\t.2byte ITEM_SUPER_POTION\n\t.2byte ITEM_POTION\n\t.2byte ITEM_ANTIDOTE\n\t.2byte ITEM_PARALYZE_HEAL\n\t.2byte ITEM_AWAKENING\n\t.2byte ITEM_BURN_HEAL\n\t.2byte ITEM_ESCAPE_ROPE\n\t.2byte ITEM_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/CeruleanCity_Mart/text.inc",
    "content": "CeruleanCity_Mart_Text_RepelWorksOnWeakMons::\n    .string \"REPEL not only keeps bugs away,\\n\"\n    .string \"it also works on weak POKéMON.\\p\"\n    .string \"Put your strongest POKéMON at the\\n\"\n    .string \"left of the POKéMON LIST.\\p\"\n    .string \"If your first POKéMON is strong,\\n\"\n    .string \"REPEL's effect is boosted.$\"\n\nCeruleanCity_Mart_Text_DoYouKnowAboutRareCandy::\n    .string \"Do you know about RARE CANDY?\\n\"\n    .string \"They don't sell it in shops.\\p\"\n    .string \"I think it makes POKéMON grow\\n\"\n    .string \"very quickly all of a sudden.$\"\n\n"
  },
  {
    "path": "data/maps/CeruleanCity_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CITY_POKEMON_CENTER_1F\",\n  \"name\": \"CeruleanCity_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_PokemonCenter_1F_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKER\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_PokemonCenter_1F_EventScript_Rocker\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_PokemonCenter_1F_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_PokemonCenter_1F_EventScript_Lass\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_PokemonCenter_1F_EventScript_PokemonJournalMisty\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CeruleanCity_PokemonCenter_1F_EventScript_PokemonJournalMisty\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CERULEAN_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_CERULEAN_CITY_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCity_PokemonCenter_1F/scripts.inc",
    "content": "CeruleanCity_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CeruleanCity_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nCeruleanCity_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_CERULEAN_CITY\n\tend\n\nCeruleanCity_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nCeruleanCity_PokemonCenter_1F_EventScript_Gentleman::\n\tmsgbox CeruleanCity_PokemonCenter_1F_Text_EveryoneCallsBillPokemaniac, MSGBOX_NPC\n\tend\n\nCeruleanCity_PokemonCenter_1F_EventScript_Rocker::\n\tmsgbox CeruleanCity_PokemonCenter_1F_Text_BillDoesWhateverForRareMons, MSGBOX_NPC\n\tend\n\nCeruleanCity_PokemonCenter_1F_EventScript_Youngster::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_BILL, 1\n\tmsgbox CeruleanCity_PokemonCenter_1F_Text_BillCollectsRareMons\n\trelease\n\tend\n\nCeruleanCity_PokemonCenter_1F_EventScript_Lass::\n\tmsgbox CeruleanCity_PokemonCenter_1F_Text_TryTradingUpstairs, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/CeruleanCity_PokemonCenter_1F/text.inc",
    "content": "CeruleanCity_PokemonCenter_1F_Text_BillDoesWhateverForRareMons::\n    .string \"That BILL!\\p\"\n    .string \"I heard that he'll do whatever it\\n\"\n    .string \"takes to get rare POKéMON.\\p\"\n    .string \"He's not above doing all sorts\\n\"\n    .string \"of things, I've heard.$\"\n\nCeruleanCity_PokemonCenter_1F_Text_EveryoneCallsBillPokemaniac::\n    .string \"Have you heard about BILL?\\p\"\n    .string \"Everyone calls him a POKéMANIAC!\\p\"\n    .string \"I think people are just jealous of\\n\"\n    .string \"BILL, though.\\p\"\n    .string \"Who wouldn't want to boast about\\n\"\n    .string \"their POKéMON?$\"\n\nCeruleanCity_PokemonCenter_1F_Text_BillCollectsRareMons::\n    .string \"BILL has lots of POKéMON!\\n\"\n    .string \"He collects rare ones, too!$\"\n\nCeruleanCity_PokemonCenter_1F_Text_TryTradingUpstairs::\n    .string \"Why don't you go upstairs and try\\n\"\n    .string \"trading POKéMON with your friends?\\p\"\n    .string \"You could get a lot more variety\\n\"\n    .string \"by trading.\\p\"\n    .string \"The POKéMON you get in trades grow\\n\"\n    .string \"quickly, too.$\"\n\n"
  },
  {
    "path": "data/maps/CeruleanCity_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_CERULEAN_CITY_POKEMON_CENTER_2F\",\n  \"name\": \"CeruleanCity_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_CERULEAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_CERULEAN_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CeruleanCity_PokemonCenter_2F/scripts.inc",
    "content": "CeruleanCity_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nCeruleanCity_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nCeruleanCity_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nCeruleanCity_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/CinnabarIsland/map.json",
    "content": "{\n  \"id\": \"MAP_CINNABAR_ISLAND\",\n  \"name\": \"CinnabarIsland\",\n  \"layout\": \"LAYOUT_CINNABAR_ISLAND\",\n  \"music\": \"MUS_CINNABAR\",\n  \"region_map_section\": \"MAPSEC_CINNABAR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE21_SOUTH\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE20\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BILL\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_CINNABAR_BILL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 7,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_CINNABAR_SEAGALLOP\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Exeggutor\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_POKEMON_MANSION_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND_GYM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND_MART\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 19,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"CinnabarIsland_EventScript_GymDoorLocked\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CinnabarIsland_EventScript_IslandSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CinnabarIsland_EventScript_PokemonLabSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 22,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CinnabarIsland_EventScript_GymSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CinnabarIsland_EventScript_PokemonLabSign\"\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/CinnabarIsland/scripts.inc",
    "content": ".equ LOCALID_BILL, 3\n.equ LOCALID_SEAGALLOP, 4\n.set LOCALID_EXEGGUTOR_MASTER, 5\n.set TRAINER, VAR_0x8009\n\nCinnabarIsland_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CinnabarIsland_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CinnabarIsland_OnFrame\n\t.byte 0\n\nCinnabarIsland_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_CINNABAR_ISLAND\n\tcall CinnabarIsland_EventScript_CheckUnlockGym\n\tcall_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND, 1, CinnabarIsland_EventScript_ReadyObjectsSailToOneIsland\n\tcall_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND, 3, CinnabarIsland_EventScript_ReadyObjectsReturnFromSeviiIslands\n\tcall_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_2, 1, CinnabarIsland_EventScript_ReadyObjectsSailToOneIslandFromPokeCenter\n\tgoto CinnabarIsland_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nCinnabarIsland_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_EXEGGUTOR\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CinnabarIsland_MapScript_ExeggutorMasterMovementType\n\tend\n\nCinnabarIsland_MapScript_ExeggutorMasterMovementType::\n\tsetobjectmovementtype LOCALID_EXEGGUTOR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCinnabarIsland_EventScript_ReadyObjectsSailToOneIslandFromPokeCenter::\n\tsavebgm MUS_FOLLOW_ME\n\tsetflag FLAG_TEMP_2\n\tsetobjectxyperm LOCALID_BILL, 15, 12\n\tsetobjectmovementtype LOCALID_BILL, MOVEMENT_TYPE_FACE_LEFT\n\tsetobjectxyperm LOCALID_SEAGALLOP, 30, 12\n\treturn\n\nCinnabarIsland_EventScript_ReadyObjectsSailToOneIsland::\n\tgetplayerxy VAR_0x8004, VAR_0x8005\n\tgoto_if_ge VAR_0x8004, 18, CinnabarIsland_EventScript_MoveSeagallopDown\n\tsetflag FLAG_TEMP_2\n\tsetobjectxyperm LOCALID_BILL, 18, 12\n\tsetobjectmovementtype LOCALID_BILL, MOVEMENT_TYPE_FACE_UP\n\tsetobjectxyperm LOCALID_SEAGALLOP, 30, 12\n\treturn\n\nCinnabarIsland_EventScript_MoveSeagallopDown::\n\tsetobjectxyperm LOCALID_SEAGALLOP, 30, 8\n\treturn\n\nCinnabarIsland_EventScript_ReadyObjectsReturnFromSeviiIslands::\n\tsetobjectxyperm LOCALID_BILL, 21, 8\n\tsetobjectmovementtype LOCALID_BILL, MOVEMENT_TYPE_FACE_UP\n\treturn\n\nCinnabarIsland_EventScript_CheckUnlockGym::\n\tgoto_if_set FLAG_HIDE_POKEMON_MANSION_B1F_SECRET_KEY, CinnabarIsland_EventScript_UnlockGym\n\treturn\n\nCinnabarIsland_EventScript_UnlockGym::\n\tsetvar VAR_TEMP_1, 1\n\treturn\n\nCinnabarIsland_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_CINNABAR_ISLAND_2, 1, CinnabarIsland_EventScript_ExitPokeCenterForOneIsland\n\tmap_script_2 VAR_MAP_SCENE_CINNABAR_ISLAND, 1, CinnabarIsland_EventScript_BillScene\n\tmap_script_2 VAR_MAP_SCENE_CINNABAR_ISLAND, 3, CinnabarIsland_EventScript_ReturnFromSeviiIslands\n\t.2byte 0\n\nCinnabarIsland_EventScript_ExitPokeCenterForOneIsland::\n\tlockall\n\tclearflag FLAG_DONT_TRANSITION_MUSIC\n\tsavebgm MUS_DUMMY\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND_2, 2\n\tdelay 20\n\tcall CinnabarIsland_EventScript_SailToOneIsland\n\treleaseall\n\tend\n\nCinnabarIsland_EventScript_ReturnFromSeviiIslands::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox CinnabarIsland_Text_IfYouHaveTriPassYouCanGoAgain\n\tclosemessage\n\tapplymovement LOCALID_BILL, CinnabarIsland_Movement_BillExit\n\twaitmovement 0\n\tremoveobject LOCALID_BILL\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND, 4\n\tsetflag FLAG_HIDE_TWO_ISLAND_GAME_CORNER_LOSTELLE\n\tclearflag FLAG_HIDE_LOSTELLE_IN_HER_HOME\n\treleaseall\n\tend\n\nCinnabarIsland_Movement_BillExit::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nCinnabarIsland_EventScript_BillScene::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tcall_if_unset FLAG_TEMP_2, CinnabarIsland_EventScript_BillFacePlayer1\n\tcall_if_set FLAG_TEMP_2, CinnabarIsland_EventScript_BillFacePlayer2\n\tplayse SE_PIN\n\tapplymovement LOCALID_BILL, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_BILL, Common_Movement_Delay48\n\twaitmovement 0\n\tcall_if_unset FLAG_TEMP_2, CinnabarIsland_EventScript_BillApproachPlayer1\n\tcall_if_set FLAG_TEMP_2, CinnabarIsland_EventScript_BillApproachPlayer2\n\tmsgbox CinnabarIsland_Text_HeyIfItIsntPlayer\n\tmsgbox CinnabarIsland_Text_ComeWithMeToOneIsland, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, CinnabarIsland_EventScript_AgreeSailToOneIsland\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_EventScript_DeclineSailToOneIsland\n\tend\n\nCinnabarIsland_EventScript_BillFacePlayer1::\n\tapplymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_EventScript_BillFacePlayer2::\n\tapplymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_EventScript_BillApproachPlayer1::\n\tapplymovement LOCALID_BILL, CinnabarIsland_Movement_BillApproachPlayer1\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_EventScript_BillApproachPlayer2::\n\tapplymovement LOCALID_BILL, CinnabarIsland_Movement_BillApproachPlayer2\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_EventScript_AgreeSailToOneIsland::\n\tmsgbox CinnabarIsland_Text_AllRightLetsGo\n\tclosemessage\n\tcall CinnabarIsland_EventScript_SailToOneIsland\n\treleaseall\n\tend\n\nCinnabarIsland_EventScript_DeclineSailToOneIsland::\n\tmsgbox CinnabarIsland_Text_IllBeWaitingInPokeCenter\n\tclosemessage\n\tcall_if_unset FLAG_TEMP_2, CinnabarIsland_EventScript_BillExitToPokeCenter\n\tcall_if_set FLAG_TEMP_2, CinnabarIsland_EventScript_BillReturnToPokeCenter\n\tremoveobject LOCALID_BILL\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND, 2\n\tclearflag FLAG_HIDE_CINNABAR_POKECENTER_BILL\n\treleaseall\n\tend\n\nCinnabarIsland_EventScript_BillExitToPokeCenter::\n\tapplymovement LOCALID_BILL, CinnabarIsland_Movement_BillExitToPokeCenter\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Movement_BillExitToPokeCenter::\n\twalk_right\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nCinnabarIsland_EventScript_BillReturnToPokeCenter::\n\tapplymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Movement_PlayerWatchBillExit\n\tapplymovement LOCALID_BILL, CinnabarIsland_Movement_BillApproachDoor\n\twaitmovement 0\n\topendoor 14, 11\n\twaitdooranim\n\tapplymovement LOCALID_BILL, CinnabarIsland_Movement_BillReEnterPokeCenter\n\twaitmovement 0\n\tclosedoor 14, 11\n\twaitdooranim\n\treturn\n\nCinnabarIsland_Movement_PlayerWatchBillExit::\n\twalk_left\n\twalk_in_place_faster_right\n\tstep_end\n\nCinnabarIsland_Movement_BillApproachDoor::\n\tdelay_16\n\twalk_left\n\twalk_in_place_faster_up\n\tstep_end\n\nCinnabarIsland_Movement_BillReEnterPokeCenter::\n\twalk_up\n\tdelay_4\n\tset_invisible\n\tstep_end\n\n@ Can be triggered outside, or after talking to Bill in the poke center\nCinnabarIsland_EventScript_SailToOneIsland::\n\tcall_if_set FLAG_TEMP_2, CinnabarIsland_EventScript_ApproachShore\n\taddobject LOCALID_SEAGALLOP\n\tcall_if_unset FLAG_TEMP_2, CinnabarIsland_EventScript_BoatArrive\n\tcall_if_set FLAG_TEMP_2, CinnabarIsland_EventScript_BoatArriveExitedPokeCenter\n\tmsgbox CinnabarIsland_Text_MyPalsBoatArrived\n\tclosemessage\n\tcall_if_unset FLAG_TEMP_2, CinnabarIsland_EventScript_BoardBoat\n\tcall_if_set FLAG_TEMP_2, CinnabarIsland_EventScript_BoardBoatExitedPokeCenter\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND, 2\n\tremoveobject LOCALID_BILL\n\tdelay 40\n\tsetflag FLAG_HIDE_CINNABAR_SEAGALLOP\n\tsetvar VAR_MAP_SCENE_ONE_ISLAND_HARBOR, 1\n\tsetvar VAR_0x8004, SEAGALLOP_CINNABAR_ISLAND\n\tsetvar VAR_0x8006, SEAGALLOP_ONE_ISLAND\n\tgoto EventScript_SetSail\n\tend\n\nCinnabarIsland_EventScript_ApproachShore::\n\tapplymovement LOCALID_BILL, CinnabarIsland_Movement_ApproachShore\n\tapplymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Movement_ApproachShore\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_EventScript_BoatArrive::\n\tapplymovement LOCALID_BILL, CinnabarIsland_Movement_BillFaceBoat\n\tapplymovement LOCALID_SEAGALLOP, CinnabarIsland_Movement_BoatArrive\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_EventScript_BoatArriveExitedPokeCenter::\n\tapplymovement LOCALID_SEAGALLOP, CinnabarIsland_Movement_BoatArrive\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_EventScript_BoardBoat::\n\tapplymovement LOCALID_BILL, CinnabarIsland_Movement_BillBoardBoat\n\tapplymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Movement_PlayerBoardBoat\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_EventScript_BoardBoatExitedPokeCenter::\n\tapplymovement LOCALID_BILL, CinnabarIsland_Movement_BillBoardBoatFromShore\n\tapplymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Movement_PlayerBoardBoatFromShore\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Movement_BoatArrive::\n\tdelay_16\n\tdelay_16\n\twalk_fast_left\n\twalk_fast_left\n\twalk_left\n\twalk_slower_left\n\twalk_slower_left\n\tstep_end\n\nCinnabarIsland_Movement_BillBoardBoat::\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_right\n\tdelay_4\n\tset_invisible\n\tstep_end\n\nCinnabarIsland_Movement_BillApproachPlayer1::\n\twalk_up\n\tstep_end\n\nCinnabarIsland_Movement_BillApproachPlayer2::\n\twalk_left\n\twalk_left\n\twalk_left\n\tstep_end\n\nCinnabarIsland_Movement_BillFaceBoat::\n\tdelay_16\n\tdelay_16\n\tdelay_8\n\twalk_in_place_faster_right\n\tstep_end\n\nCinnabarIsland_Movement_ApproachShore::\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\tstep_end\n\nCinnabarIsland_Movement_BillBoardBoatFromShore::\n\twalk_right\n\tdelay_4\n\tset_invisible\n\tstep_end\n\nCinnabarIsland_Movement_PlayerBoardBoat::\n\twalk_down\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_in_place_faster_right\n\tdelay_4\n\twalk_right\n\tdelay_4\n\tset_invisible\n\tstep_end\n\nCinnabarIsland_Movement_PlayerBoardBoatFromShore::\n\twalk_right\n\tdelay_4\n\twalk_right\n\tdelay_4\n\tset_invisible\n\tstep_end\n\n@ Triggered when VAR_TEMP_1 is 0\nCinnabarIsland_EventScript_GymDoorLocked::\n\tlockall\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tdelay 20\n\tmsgbox CinnabarIsland_Text_DoorIsLocked\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Movement_ForcePlayerFromDoor\n\twaitmovement 0\n\treleaseall\n\tend\n\nCinnabarIsland_Movement_ForcePlayerFromDoor::\n\twalk_down\n\tstep_end\n\nCinnabarIsland_EventScript_Woman::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_BLAINE, 3\n\tmsgbox CinnabarIsland_Text_BlaineLivedHereSinceBeforeLab\n\trelease\n\tend\n\nCinnabarIsland_EventScript_OldMan::\n\tmsgbox CinnabarIsland_Text_ScientistsExperimentInMansion, MSGBOX_NPC\n\tend\n\nCinnabarIsland_EventScript_IslandSign::\n\tmsgbox CinnabarIsland_Text_IslandSign, MSGBOX_SIGN\n\tend\n\nCinnabarIsland_EventScript_PokemonLabSign::\n\tmsgbox CinnabarIsland_Text_PokemonLab, MSGBOX_SIGN\n\tend\n\nCinnabarIsland_EventScript_GymSign::\n\tlockall\n\tfamechecker FAMECHECKER_BLAINE, 0\n\tmsgbox CinnabarIsland_Text_GymSign\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/CinnabarIsland/text.inc",
    "content": "CinnabarIsland_Text_DoorIsLocked::\n    .string \"The door is locked…$\"\n\nCinnabarIsland_Text_BlaineLivedHereSinceBeforeLab::\n    .string \"CINNABAR GYM's BLAINE is quite the\\n\"\n    .string \"odd fellow.\\p\"\n    .string \"He's lived on the island since way\\n\"\n    .string \"before the LAB was built.$\"\n\nCinnabarIsland_Text_ScientistsExperimentInMansion::\n    .string \"Scientists conduct experiments \\n\"\n    .string \"in the burned-out building.\\p\"\n    .string \"You know, the one they call the\\n\"\n    .string \"POKéMON MANSION.$\"\n\nCinnabarIsland_Text_IslandSign::\n    .string \"CINNABAR ISLAND\\n\"\n    .string \"The Fiery Town of Burning Desire$\"\n\nCinnabarIsland_Text_PokemonLab::\n    .string \"POKéMON LAB$\"\n\nCinnabarIsland_Text_GymSign::\n    .string \"CINNABAR ISLAND POKéMON GYM\\n\"\n    .string \"LEADER: BLAINE\\l\"\n    .string \"The Hotheaded Quiz Master!$\"\n\nCinnabarIsland_Text_HeyIfItIsntPlayer::\n    .string \"Huh?\\n\"\n    .string \"Hey, if it isn't {PLAYER}!$\"\n\nCinnabarIsland_Text_ComeWithMeToOneIsland::\n    .string \"Look, it's me, BILL.\\n\"\n    .string \"Long time no see!\\p\"\n    .string \"I hope you're still using my\\n\"\n    .string \"PC system.\\p\"\n    .string \"Well, listen, since we met up here,\\n\"\n    .string \"how about spending time with me?\\p\"\n    .string \"There's this little island in the far\\n\"\n    .string \"south called ONE ISLAND.\\p\"\n    .string \"A friend invited me, so I'm on my\\n\"\n    .string \"way out there.\\p\"\n    .string \"How about it?\\n\"\n    .string \"Do you feel like coming with me?$\"\n\nCinnabarIsland_Text_AllRightLetsGo::\n    .string \"All right, then.\\n\"\n    .string \"Let's go!$\"\n\nCinnabarIsland_Text_IllBeWaitingInPokeCenter::\n    .string \"What, are you too busy?\\p\"\n    .string \"Well, all right.\\n\"\n    .string \"The boat hasn't arrived yet anyway.\\p\"\n    .string \"I'll be waiting at the POKéMON\\n\"\n    .string \"CENTER over there.\\p\"\n    .string \"Come see me when you're done with\\n\"\n    .string \"your business here.$\"\n\nCinnabarIsland_Text_MyPalsBoatArrived::\n    .string \"Looks like my pal's boat arrived,\\n\"\n    .string \"too.\\p\"\n    .string \"He sent it specially here to\\n\"\n    .string \"CINNABAR to pick me up.$\"\n\nCinnabarIsland_Text_IfYouHaveTriPassYouCanGoAgain::\n    .string \"Hey, wasn't that a long cruise?\\p\"\n    .string \"My buddy CELIO seemed to enjoy\\n\"\n    .string \"your company.\\p\"\n    .string \"I'm sure he'd welcome you if you\\n\"\n    .string \"were to visit him again.\\p\"\n    .string \"If you have a TRI-PASS, you can\\n\"\n    .string \"always take a ferry there from\\l\"\n    .string \"VERMILION PORT.\\p\"\n    .string \"All right, thanks for your company!$\"\n\n"
  },
  {
    "path": "data/maps/CinnabarIsland_Gym/map.json",
    "content": "{\n  \"id\": \"MAP_CINNABAR_ISLAND_GYM\",\n  \"name\": \"CinnabarIsland_Gym\",\n  \"layout\": \"LAYOUT_CINNABAR_ISLAND_GYM\",\n  \"music\": \"MUS_GYM\",\n  \"region_map_section\": \"MAPSEC_CINNABAR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_GYM\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BURGLAR\",\n      \"x\": 25,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quinn\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"x\": 25,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Erik\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"x\": 17,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Avery\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BURGLAR\",\n      \"x\": 16,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Ramon\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"x\": 16,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Derek\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BURGLAR\",\n      \"x\": 4,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Dusty\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"x\": 4,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Zac\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLAINE\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Blaine\",\n      \"flag\": \"FLAG_TEMP_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GYM_GUY\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_GymGuy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 24,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 26,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 23,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_GymStatue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 27,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_GymStatue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 22,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quz1Left\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 23,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quz1Right\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quiz2Left\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quiz2Right\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quiz3Left\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quiz3Right\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quiz4Left\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quiz4Right\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quiz5Left\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quiz5Right\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quiz6Left\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_Quiz6Right\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"CinnabarIsland_Gym_EventScript_BlaineFujiPhoto\"\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/CinnabarIsland_Gym/scripts.inc",
    "content": ".set LOCALID_QUINN, 1\n.set LOCALID_AVERY, 3\n.set LOCALID_RAMON, 4\n.set LOCALID_DEREK, 5\n.set LOCALID_DUSTY, 6\n.set LOCALID_ZAC,   7\n\n.equ CHECK_VISITOR_STATE, 6\n.equ TYPE, VAR_0x8003\n.equ ARGUMENT, VAR_0x8004\n\nCinnabarIsland_Gym_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, CinnabarIsland_Gym_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CinnabarIsland_Gym_OnTransition\n\t.byte 0\n\nCinnabarIsland_Gym_OnTransition::\n\tsetvar TYPE, CHECK_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_BLAINE\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 1, CinnabarIsland_Gym_EventScript_HideBlaine\n\tend\n\nCinnabarIsland_Gym_EventScript_HideBlaine::\n\tsetflag FLAG_TEMP_1\n\treturn\n\nCinnabarIsland_Gym_OnLoad::\n\tgoto_if_set FLAG_DEFEATED_BLAINE, CinnabarIsland_Gym_OnLoadOpenAllDoors\n\tcall_if_set FLAG_CINNABAR_GYM_QUIZ_1, CinnabarIsland_Gym_OnLoadOpenDoor1\n\tcall_if_set FLAG_CINNABAR_GYM_QUIZ_2, CinnabarIsland_Gym_OnLoadOpenDoor2\n\tcall_if_set FLAG_CINNABAR_GYM_QUIZ_3, CinnabarIsland_Gym_OnLoadOpenDoor3\n\tcall_if_set FLAG_CINNABAR_GYM_QUIZ_4, CinnabarIsland_Gym_OnLoadOpenDoor4\n\tcall_if_set FLAG_CINNABAR_GYM_QUIZ_5, CinnabarIsland_Gym_OnLoadOpenDoor5\n\tcall_if_set FLAG_CINNABAR_GYM_QUIZ_6, CinnabarIsland_Gym_OnLoadOpenDoor6\n\tend\n\nCinnabarIsland_Gym_OnLoadOpenAllDoors::\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor1\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor2\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor3\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor4\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor5\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor6\n\tend\n\nCinnabarIsland_Gym_OnLoadOpenDoor1::\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor1\n\treturn\n\nCinnabarIsland_Gym_OnLoadOpenDoor2::\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor2\n\treturn\n\nCinnabarIsland_Gym_OnLoadOpenDoor3::\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor3\n\treturn\n\nCinnabarIsland_Gym_OnLoadOpenDoor4::\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor4\n\treturn\n\nCinnabarIsland_Gym_OnLoadOpenDoor5::\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor5\n\treturn\n\nCinnabarIsland_Gym_OnLoadOpenDoor6::\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor6\n\treturn\n\nCinnabarIsland_Gym_EventScript_Blaine::\n\tfamechecker FAMECHECKER_BLAINE, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, CinnabarIsland_Gym_EventScript_Blaine_ChallengeMode\n\ttrainerbattle_single TRAINER_LEADER_BLAINE, CinnabarIsland_Gym_Text_BlaineIntro, CinnabarIsland_Gym_Text_BlaineDefeat, CinnabarIsland_Gym_EventScript_DefeatedBlaine, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_BLAINE_CHALLENGE\n\tgoto_if_unset FLAG_GOT_TM38_FROM_BLAINE, CinnabarIsland_Gym_EventScript_GiveTM38\n\tmsgbox CinnabarIsland_Gym_Text_BlainePostBattle\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_Blaine_ChallengeMode::\n\ttrainerbattle_single TRAINER_LEADER_BLAINE_CHALLENGE, CinnabarIsland_Gym_Text_BlaineIntro, CinnabarIsland_Gym_Text_BlaineDefeat, CinnabarIsland_Gym_EventScript_DefeatedBlaine, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_BLAINE\n\tgoto_if_unset FLAG_GOT_TM38_FROM_BLAINE, CinnabarIsland_Gym_EventScript_GiveTM38\n\tmsgbox CinnabarIsland_Gym_Text_BlainePostBattle\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_DefeatedBlaine::\n\tfamechecker FAMECHECKER_BLAINE, 1\n\tsetflag FLAG_DEFEATED_BLAINE\n\tsetflag FLAG_BADGE07_GET\n\tsetrespawn SPAWN_CINNABAR_ISLAND\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND, 1\n\tclearflag FLAG_HIDE_CINNABAR_BILL\n\tset_gym_trainers 7\n\tgoto CinnabarIsland_Gym_EventScript_GiveTM38\n\tend\n\nCinnabarIsland_Gym_EventScript_GiveTM38::\n\tmsgbox CinnabarIsland_Gym_Text_ExplainVolcanoBadge\n\tcheckitemspace ITEM_TM38\n\tgoto_if_eq VAR_RESULT, FALSE, CinnabarIsland_Gym_EventScript_NoRoomForTM38\n\tgiveitem_msg CinnabarIsland_Gym_Text_ReceivedTM38FromBlaine, ITEM_TM38\n\tsetflag FLAG_GOT_TM38_FROM_BLAINE\n\tmsgbox CinnabarIsland_Gym_Text_FireBlastIsUltimateFireMove\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_NoRoomForTM38::\n\tmsgbox CinnabarIsland_Gym_Text_MakeSpaceForThis\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_Erik::\n\ttrainerbattle_single TRAINER_SUPER_NERD_ERIK, CinnabarIsland_Gym_Text_ErikIntro, CinnabarIsland_Gym_Text_ErikDefeat\n\tmsgbox CinnabarIsland_Gym_Text_ErikPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCinnabarIsland_Gym_EventScript_Avery::\n\ttrainerbattle_single TRAINER_SUPER_NERD_AVERY, CinnabarIsland_Gym_Text_AveryIntro, CinnabarIsland_Gym_Text_AveryDefeat, CinnabarIsland_Gym_EventScript_DefeatedAvery\n\tmsgbox CinnabarIsland_Gym_Text_AveryPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCinnabarIsland_Gym_EventScript_DefeatedAvery::\n\tcall_if_unset FLAG_CINNABAR_GYM_QUIZ_2, CinnabarIsland_Gym_EventScript_Quiz2CompleteTrainer\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz2CompleteTrainer::\n\tcall CinnabarIsland_Gym_EventScript_Quiz2Complete\n\treturn\n\nCinnabarIsland_Gym_EventScript_Derek::\n\ttrainerbattle_single TRAINER_SUPER_NERD_DEREK, CinnabarIsland_Gym_Text_DerekIntro, CinnabarIsland_Gym_Text_DerekDefeat, CinnabarIsland_Gym_EventScript_DefeatedDerek\n\tfamechecker FAMECHECKER_BLAINE, 2\n\tmsgbox CinnabarIsland_Gym_Text_DerekPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCinnabarIsland_Gym_EventScript_DefeatedDerek::\n\tcall_if_unset FLAG_CINNABAR_GYM_QUIZ_4, CinnabarIsland_Gym_EventScript_Quiz4CompleteTrainer\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz4CompleteTrainer::\n\tcall CinnabarIsland_Gym_EventScript_Quiz4Complete\n\treturn\n\nCinnabarIsland_Gym_EventScript_Zac::\n\ttrainerbattle_single TRAINER_SUPER_NERD_ZAC, CinnabarIsland_Gym_Text_ZacIntro, CinnabarIsland_Gym_Text_ZacDefeat, CinnabarIsland_Gym_EventScript_DefeatedZac\n\tmsgbox CinnabarIsland_Gym_Text_ZacPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCinnabarIsland_Gym_EventScript_DefeatedZac::\n\tcall_if_unset FLAG_CINNABAR_GYM_QUIZ_6, CinnabarIsland_Gym_EventScript_Quiz6CompleteTrainer\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz6CompleteTrainer::\n\tcall CinnabarIsland_Gym_EventScript_Quiz6Complete\n\treturn\n\nCinnabarIsland_Gym_EventScript_Quinn::\n\ttrainerbattle_single TRAINER_BURGLAR_QUINN, CinnabarIsland_Gym_Text_QuinnIntro, CinnabarIsland_Gym_Text_QuinnDefeat, CinnabarIsland_Gym_EventScript_DefeatedQuinn\n\tmsgbox CinnabarIsland_Gym_Text_QuinnPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCinnabarIsland_Gym_EventScript_DefeatedQuinn::\n\tcall_if_unset FLAG_CINNABAR_GYM_QUIZ_1, CinnabarIsland_Gym_EventScript_Quiz1CompleteTrainer\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz1CompleteTrainer::\n\tcall CinnabarIsland_Gym_EventScript_Quiz1Complete\n\treturn\n\nCinnabarIsland_Gym_EventScript_Ramon::\n\ttrainerbattle_single TRAINER_BURGLAR_RAMON, CinnabarIsland_Gym_Text_RamonIntro, CinnabarIsland_Gym_Text_RamonDefeat, CinnabarIsland_Gym_EventScript_DefeatedRamon\n\tmsgbox CinnabarIsland_Gym_Text_RamonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCinnabarIsland_Gym_EventScript_DefeatedRamon::\n\tcall_if_unset FLAG_CINNABAR_GYM_QUIZ_3, CinnabarIsland_Gym_EventScript_Quiz3CompleteTrainer\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz3CompleteTrainer::\n\tcall CinnabarIsland_Gym_EventScript_Quiz3Complete\n\treturn\n\nCinnabarIsland_Gym_EventScript_Dusty::\n\ttrainerbattle_single TRAINER_BURGLAR_DUSTY, CinnabarIsland_Gym_Text_DustyIntro, CinnabarIsland_Gym_Text_DustyDefeat, CinnabarIsland_Gym_EventScript_DefeatedDusty\n\tmsgbox CinnabarIsland_Gym_Text_DustyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCinnabarIsland_Gym_EventScript_DefeatedDusty::\n\tcall_if_unset FLAG_CINNABAR_GYM_QUIZ_5, CinnabarIsland_Gym_EventScript_Quiz5CompleteTrainer\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz5CompleteTrainer::\n\tcall CinnabarIsland_Gym_EventScript_Quiz5Complete\n\treturn\n\nCinnabarIsland_Gym_EventScript_GymGuy::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_DEFEATED_BLAINE, CinnabarIsland_Gym_EventScript_GymGuyPostVictory\n\tmsgbox CinnabarIsland_Gym_Text_GymGuyAdvice\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_GymGuyPostVictory::\n\tmsgbox CinnabarIsland_Gym_Text_GymGuyPostVictory\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_GymStatue::\n\tlockall\n\tgoto_if_set FLAG_BADGE07_GET, CinnabarIsland_Gym_EventScript_GymStatuePostVictory\n\tmsgbox CinnabarIsland_Gym_Text_GymStatue\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_GymStatuePostVictory::\n\tmsgbox CinnabarIsland_Gym_Text_GymStatuePlayerWon\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_Quz1Left::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto CinnabarIsland_Gym_EventScript_Quiz1\n\tend\n\nCinnabarIsland_Gym_EventScript_Quz1Right::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto CinnabarIsland_Gym_EventScript_Quiz1\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz1::\n\tmsgbox CinnabarIsland_Gym_Text_PokemonQuizRules\n\tmsgbox CinnabarIsland_Gym_Text_QuizQuestion1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, CinnabarIsland_Gym_EventScript_Quiz1Correct\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_Gym_EventScript_Quiz1Incorrect\n\tend\n\nCinnabarIsland_Gym_EventScript_CorrectAnswer::\n\tplayfanfare MUS_LEVEL_UP\n\twaitfanfare\n\tmsgbox CinnabarIsland_Gym_Text_CorrectGoOnThrough\n\treturn\n\nCinnabarIsland_Gym_EventScript_IncorrectAnswer::\n\twaitse\n\tplayse SE_BOO\n\twaitse\n\tmsgbox CinnabarIsland_Gym_Text_SorryBadCall\n\tclosemessage\n\treturn\n\nCinnabarIsland_Gym_EventScript_Quiz1Correct::\n\tcall CinnabarIsland_Gym_EventScript_CorrectAnswer\n\tgoto_if_set FLAG_CINNABAR_GYM_QUIZ_1, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen\n\tcall CinnabarIsland_Gym_EventScript_Quiz1Complete\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz1Complete::\n\tplayse SE_UNLOCK\n\twaitse\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor1\n\tspecial DrawWholeMapView\n\tsetflag FLAG_CINNABAR_GYM_QUIZ_1\n\treturn\n\nCinnabarIsland_Gym_EventScript_DoorAlreadyOpen::\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz1Incorrect::\n\tcall CinnabarIsland_Gym_EventScript_IncorrectAnswer\n\tgoto_if_not_defeated TRAINER_BURGLAR_QUINN, CinnabarIsland_Gym_EventScript_BattleQuinn\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_BattleQuinn::\n\tcall_if_eq VAR_TEMP_1, 0, CinnabarIsland_Gym_EventScript_QuinnApproachLeft\n\tcall_if_eq VAR_TEMP_1, 1, CinnabarIsland_Gym_EventScript_QuinnApproachRight\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox CinnabarIsland_Gym_Text_QuinnIntro\n\ttrainerbattle_no_intro TRAINER_BURGLAR_QUINN, CinnabarIsland_Gym_Text_QuinnDefeat\n\tgoto_if_set FLAG_CINNABAR_GYM_QUIZ_1, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen\n\tcall CinnabarIsland_Gym_EventScript_Quiz1Complete\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_QuinnApproachLeft::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement LOCALID_QUINN, CinnabarIsland_Gym_Movement_QuinnApproachLeft\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Gym_EventScript_QuinnApproachRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement LOCALID_QUINN, CinnabarIsland_Gym_Movement_QuinnApproachRight\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Gym_Movement_QuinnApproachLeft::\n\twalk_left\n\twalk_left\n\tstep_end\n\nCinnabarIsland_Gym_Movement_QuinnApproachRight::\n\twalk_left\n\tstep_end\n\nCinnabarIsland_Gym_EventScript_Quiz2Left::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto CinnabarIsland_Gym_EventScript_Quiz2\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz2Right::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto CinnabarIsland_Gym_EventScript_Quiz2\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz2::\n\tmsgbox CinnabarIsland_Gym_Text_PokemonQuizRules\n\tmsgbox CinnabarIsland_Gym_Text_QuizQuestion2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, CinnabarIsland_Gym_EventScript_Quiz2Incorrect\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_Gym_EventScript_Quiz2Correct\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz2Correct::\n\tcall CinnabarIsland_Gym_EventScript_CorrectAnswer\n\tgoto_if_set FLAG_CINNABAR_GYM_QUIZ_2, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen\n\tcall CinnabarIsland_Gym_EventScript_Quiz2Complete\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz2Complete::\n\tplayse SE_UNLOCK\n\twaitse\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor2\n\tspecial DrawWholeMapView\n\tsetflag FLAG_CINNABAR_GYM_QUIZ_2\n\treturn\n\nCinnabarIsland_Gym_EventScript_Quiz2Incorrect::\n\tcall CinnabarIsland_Gym_EventScript_IncorrectAnswer\n\tgoto_if_not_defeated TRAINER_SUPER_NERD_AVERY, CinnabarIsland_Gym_EventScript_BattleAvery\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_BattleAvery::\n\tcall_if_eq VAR_TEMP_1, 0, CinnabarIsland_Gym_EventScript_AveryApproachLeft\n\tcall_if_eq VAR_TEMP_1, 1, CinnabarIsland_Gym_EventScript_AveryApproachRight\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox CinnabarIsland_Gym_Text_AveryIntro\n\ttrainerbattle_no_intro TRAINER_SUPER_NERD_AVERY, CinnabarIsland_Gym_Text_AveryDefeat\n\tgoto_if_set FLAG_CINNABAR_GYM_QUIZ_2, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen\n\tcall CinnabarIsland_Gym_EventScript_Quiz2Complete\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_AveryApproachLeft::\n\tapplymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Gym_Movement_PlayerFaceAvery\n\tapplymovement LOCALID_AVERY, CinnabarIsland_Gym_Movement_AveryApproachLeft\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Gym_EventScript_AveryApproachRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_Gym_Movement_PlayerFaceAvery\n\tapplymovement LOCALID_AVERY, CinnabarIsland_Gym_Movement_AveryApproachRight\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Gym_Movement_AveryApproachLeft::\n\twalk_up\n\twalk_up\n\twalk_left\n\tstep_end\n\nCinnabarIsland_Gym_Movement_AveryApproachRight::\n\twalk_up\n\twalk_up\n\twalk_in_place_faster_left\n\tstep_end\n\nCinnabarIsland_Gym_Movement_PlayerFaceAvery::\n\tdelay_16\n\tdelay_16\n\twalk_in_place_faster_right\n\tstep_end\n\nCinnabarIsland_Gym_EventScript_Quiz3Left::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto CinnabarIsland_Gym_EventScript_Quiz3\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz3Right::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto CinnabarIsland_Gym_EventScript_Quiz3\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz3::\n\tmsgbox CinnabarIsland_Gym_Text_PokemonQuizRules\n\tmsgbox CinnabarIsland_Gym_Text_QuizQuestion3, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, CinnabarIsland_Gym_EventScript_Quiz3Incorrect\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_Gym_EventScript_Quiz3Correct\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz3Correct::\n\tcall CinnabarIsland_Gym_EventScript_CorrectAnswer\n\tgoto_if_set FLAG_CINNABAR_GYM_QUIZ_3, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen\n\tcall CinnabarIsland_Gym_EventScript_Quiz3Complete\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz3Complete::\n\tplayse SE_UNLOCK\n\twaitse\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor3\n\tspecial DrawWholeMapView\n\tsetflag FLAG_CINNABAR_GYM_QUIZ_3\n\treturn\n\nCinnabarIsland_Gym_EventScript_Quiz3Incorrect::\n\tcall CinnabarIsland_Gym_EventScript_IncorrectAnswer\n\tgoto_if_not_defeated TRAINER_BURGLAR_RAMON, CinnabarIsland_Gym_EventScript_BattleRamon\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_BattleRamon::\n\tcall_if_eq VAR_TEMP_1, 0, CinnabarIsland_Gym_EventScript_RamonApproachLeft\n\tcall_if_eq VAR_TEMP_1, 1, CinnabarIsland_Gym_EventScript_RamonApproachRight\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox CinnabarIsland_Gym_Text_RamonIntro\n\ttrainerbattle_no_intro TRAINER_BURGLAR_RAMON, CinnabarIsland_Gym_Text_RamonDefeat\n\tgoto_if_set FLAG_CINNABAR_GYM_QUIZ_3, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen\n\tcall CinnabarIsland_Gym_EventScript_Quiz3Complete\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_RamonApproachLeft::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement LOCALID_RAMON, CinnabarIsland_Gym_Movement_RamonApproachLeft\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Gym_EventScript_RamonApproachRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement LOCALID_RAMON, CinnabarIsland_Gym_Movement_RamonApproachRight\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Gym_Movement_RamonApproachLeft::\n\twalk_left\n\twalk_left\n\tstep_end\n\nCinnabarIsland_Gym_Movement_RamonApproachRight::\n\twalk_left\n\tstep_end\n\nCinnabarIsland_Gym_EventScript_Quiz4Left::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto CinnabarIsland_Gym_EventScript_Quiz4\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz4Right::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto CinnabarIsland_Gym_EventScript_Quiz4\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz4::\n\tmsgbox CinnabarIsland_Gym_Text_PokemonQuizRules\n\tmsgbox CinnabarIsland_Gym_Text_QuizQuestion4, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, CinnabarIsland_Gym_EventScript_Quiz4Incorrect\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_Gym_EventScript_Quiz4Correct\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz4Correct::\n\tcall CinnabarIsland_Gym_EventScript_CorrectAnswer\n\tgoto_if_set FLAG_CINNABAR_GYM_QUIZ_4, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen\n\tcall CinnabarIsland_Gym_EventScript_Quiz4Complete\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz4Complete::\n\tplayse SE_UNLOCK\n\twaitse\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor4\n\tspecial DrawWholeMapView\n\tsetflag FLAG_CINNABAR_GYM_QUIZ_4\n\treturn\n\nCinnabarIsland_Gym_EventScript_Quiz4Incorrect::\n\tcall CinnabarIsland_Gym_EventScript_IncorrectAnswer\n\tgoto_if_not_defeated TRAINER_SUPER_NERD_DEREK, CinnabarIsland_Gym_EventScript_BattleDerek\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_BattleDerek::\n\tcall_if_eq VAR_TEMP_1, 0, CinnabarIsland_Gym_EventScript_DerekApproachLeft\n\tcall_if_eq VAR_TEMP_1, 1, CinnabarIsland_Gym_EventScript_DerekApproachRight\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox CinnabarIsland_Gym_Text_DerekIntro\n\ttrainerbattle_no_intro TRAINER_SUPER_NERD_DEREK, CinnabarIsland_Gym_Text_DerekDefeat\n\tgoto_if_set FLAG_CINNABAR_GYM_QUIZ_4, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen\n\tcall CinnabarIsland_Gym_EventScript_Quiz4Complete\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_DerekApproachLeft::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement LOCALID_DEREK, CinnabarIsland_Gym_Movement_DerekApproachLeft\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Gym_EventScript_DerekApproachRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement LOCALID_DEREK, CinnabarIsland_Gym_Movement_DerekApproachRight\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Gym_Movement_DerekApproachLeft::\n\twalk_left\n\twalk_left\n\tstep_end\n\nCinnabarIsland_Gym_Movement_DerekApproachRight::\n\twalk_left\n\tstep_end\n\nCinnabarIsland_Gym_EventScript_Quiz5Left::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto CinnabarIsland_Gym_EventScript_Quiz5\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz5Right::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto CinnabarIsland_Gym_EventScript_Quiz5\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz5::\n\tmsgbox CinnabarIsland_Gym_Text_PokemonQuizRules\n\tmsgbox CinnabarIsland_Gym_Text_QuizQuestion5, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, CinnabarIsland_Gym_EventScript_Quiz5Correct\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_Gym_EventScript_Quiz5Incorrect\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz5Correct::\n\tcall CinnabarIsland_Gym_EventScript_CorrectAnswer\n\tgoto_if_set FLAG_CINNABAR_GYM_QUIZ_5, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen\n\tcall CinnabarIsland_Gym_EventScript_Quiz5Complete\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz5Complete::\n\tplayse SE_UNLOCK\n\twaitse\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor5\n\tspecial DrawWholeMapView\n\tsetflag FLAG_CINNABAR_GYM_QUIZ_5\n\treturn\n\nCinnabarIsland_Gym_EventScript_Quiz5Incorrect::\n\tcall CinnabarIsland_Gym_EventScript_IncorrectAnswer\n\tgoto_if_not_defeated TRAINER_BURGLAR_DUSTY, CinnabarIsland_Gym_EventScript_BattleDusty\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_BattleDusty::\n\tcall_if_eq VAR_TEMP_1, 0, CinnabarIsland_Gym_EventScript_DustyApproachLeft\n\tcall_if_eq VAR_TEMP_1, 1, CinnabarIsland_Gym_EventScript_DustyApproachRight\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox CinnabarIsland_Gym_Text_DustyIntro\n\ttrainerbattle_no_intro TRAINER_BURGLAR_DUSTY, CinnabarIsland_Gym_Text_DustyDefeat\n\tgoto_if_set FLAG_CINNABAR_GYM_QUIZ_5, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen\n\tcall CinnabarIsland_Gym_EventScript_Quiz5Complete\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_DustyApproachLeft::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement LOCALID_DUSTY, CinnabarIsland_Gym_Movement_DustyApproachLeft\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Gym_EventScript_DustyApproachRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement LOCALID_DUSTY, CinnabarIsland_Gym_Movement_DustyApproachRight\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Gym_Movement_DustyApproachLeft::\n\twalk_left\n\twalk_left\n\tstep_end\n\nCinnabarIsland_Gym_Movement_DustyApproachRight::\n\twalk_left\n\tstep_end\n\nCinnabarIsland_Gym_EventScript_Quiz6Left::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto CinnabarIsland_Gym_EventScript_Quiz6\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz6Right::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto CinnabarIsland_Gym_EventScript_Quiz6\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz6::\n\tmsgbox CinnabarIsland_Gym_Text_PokemonQuizRules\n\tmsgbox CinnabarIsland_Gym_Text_QuizQuestion6, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, CinnabarIsland_Gym_EventScript_Quiz6Incorrect\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_Gym_EventScript_Quiz6Correct\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz6Correct::\n\tcall CinnabarIsland_Gym_EventScript_CorrectAnswer\n\tgoto_if_set FLAG_CINNABAR_GYM_QUIZ_6, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen\n\tcall CinnabarIsland_Gym_EventScript_Quiz6Complete\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_Quiz6Complete::\n\tplayse SE_UNLOCK\n\twaitse\n\tcall CinnabarIsland_Gym_EventScript_OpenDoor6\n\tspecial DrawWholeMapView\n\tsetflag FLAG_CINNABAR_GYM_QUIZ_6\n\treturn\n\nCinnabarIsland_Gym_EventScript_Quiz6Incorrect::\n\tcall CinnabarIsland_Gym_EventScript_IncorrectAnswer\n\tgoto_if_not_defeated TRAINER_SUPER_NERD_ZAC, CinnabarIsland_Gym_EventScript_BattleZac\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_BattleZac::\n\tcall_if_eq VAR_TEMP_1, 0, CinnabarIsland_Gym_EventScript_ZacApproachLeft\n\tcall_if_eq VAR_TEMP_1, 1, CinnabarIsland_Gym_EventScript_ZacApproachRight\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox CinnabarIsland_Gym_Text_ZacIntro\n\ttrainerbattle_no_intro TRAINER_SUPER_NERD_ZAC, CinnabarIsland_Gym_Text_ZacDefeat\n\tgoto_if_set FLAG_CINNABAR_GYM_QUIZ_6, CinnabarIsland_Gym_EventScript_DoorAlreadyOpen\n\tcall CinnabarIsland_Gym_EventScript_Quiz6Complete\n\treleaseall\n\tend\n\nCinnabarIsland_Gym_EventScript_ZacApproachLeft::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement LOCALID_ZAC, CinnabarIsland_Gym_Movement_ZacApproachLeft\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Gym_EventScript_ZacApproachRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement LOCALID_ZAC, CinnabarIsland_Gym_Movement_ZacApproachRight\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_Gym_Movement_ZacApproachLeft::\n\twalk_left\n\twalk_left\n\tstep_end\n\nCinnabarIsland_Gym_Movement_ZacApproachRight::\n\twalk_left\n\tstep_end\n\nCinnabarIsland_Gym_EventScript_OpenDoor1::\n\tsetmetatile 26,  8, METATILE_CinnabarGym_Floor_WallLeftCorner, 0\n\tsetmetatile 27,  8, METATILE_CinnabarGym_Floor_WallRightCorner, 0\n\tsetmetatile 26,  9, METATILE_CinnabarGym_Floor_WallLeftEdge, 0\n\tsetmetatile 27,  9, METATILE_CinnabarGym_Floor_WallRightEdge, 0\n\tsetmetatile 26, 10, METATILE_CinnabarGym_Floor_ShadeFull, 0\n\tsetmetatile 27, 10, METATILE_CinnabarGym_Floor, 0\n\tsetmetatile 28, 10, METATILE_CinnabarGym_Floor_ShadeDiagonal, 0\n\treturn\n\nCinnabarIsland_Gym_EventScript_OpenDoor2::\n\tsetmetatile 17,  8, METATILE_CinnabarGym_Floor_WallLeftCorner, 0\n\tsetmetatile 18,  8, METATILE_CinnabarGym_Floor_WallRightCorner, 0\n\tsetmetatile 17,  9, METATILE_CinnabarGym_Floor_WallLeftEdge, 0\n\tsetmetatile 18,  9, METATILE_CinnabarGym_Floor_WallRightEdge, 0\n\tsetmetatile 17, 10, METATILE_CinnabarGym_Floor_ShadeFull, 0\n\tsetmetatile 18, 10, METATILE_CinnabarGym_Floor, 0\n\tsetmetatile 19, 10, METATILE_CinnabarGym_Floor_ShadeDiagonal, 0\n\treturn\n\nCinnabarIsland_Gym_EventScript_OpenDoor3::\n\tsetmetatile 17, 15, METATILE_CinnabarGym_Floor_WallLeftCorner, 0\n\tsetmetatile 18, 15, METATILE_CinnabarGym_Floor_WallRightCorner, 0\n\tsetmetatile 17, 16, METATILE_CinnabarGym_Floor_WallLeftEdge, 0\n\tsetmetatile 18, 16, METATILE_CinnabarGym_Floor_WallRightEdge, 0\n\tsetmetatile 17, 17, METATILE_CinnabarGym_Floor_ShadeFull, 0\n\tsetmetatile 18, 17, METATILE_CinnabarGym_Floor, 0\n\tsetmetatile 19, 17, METATILE_CinnabarGym_Floor_ShadeDiagonal, 0\n\treturn\n\nCinnabarIsland_Gym_EventScript_OpenDoor4::\n\tsetmetatile 11, 21, METATILE_CinnabarGym_Wall_RetractedBarrier, 1\n\tsetmetatile 11, 22, METATILE_CinnabarGym_Floor_ShadeFull, 0\n\tsetmetatile 11, 23, METATILE_CinnabarGym_Floor, 0\n\treturn\n\nCinnabarIsland_Gym_EventScript_OpenDoor5::\n\tsetmetatile  5, 16, METATILE_CinnabarGym_Floor_WallLeftCorner, 0\n\tsetmetatile  6, 16, METATILE_CinnabarGym_Floor_WallRightCorner, 0\n\tsetmetatile  5, 17, METATILE_CinnabarGym_Floor_WallLeftEdge, 0\n\tsetmetatile  6, 17, METATILE_CinnabarGym_Floor_WallRightEdge, 0\n\tsetmetatile  5, 18, METATILE_CinnabarGym_Floor_ShadeFull, 0\n\tsetmetatile  6, 18, METATILE_CinnabarGym_Floor, 0\n\tsetmetatile  7, 18, METATILE_CinnabarGym_Floor_ShadeDiagonal, 0\n\treturn\n\nCinnabarIsland_Gym_EventScript_OpenDoor6::\n\tsetmetatile  5,  8, METATILE_CinnabarGym_Floor_WallLeftCorner, 0\n\tsetmetatile  6,  8, METATILE_CinnabarGym_Floor_WallRightCorner, 0\n\tsetmetatile  5,  9, METATILE_CinnabarGym_Floor_WallLeftEdge, 0\n\tsetmetatile  6,  9, METATILE_CinnabarGym_Floor_WallRightEdge, 0\n\tsetmetatile  5, 10, METATILE_CinnabarGym_Floor_ShadeFull, 0\n\tsetmetatile  6, 10, METATILE_CinnabarGym_Floor, 0\n\tsetmetatile  7, 10, METATILE_CinnabarGym_Floor_ShadeDiagonal, 0\n\treturn\n"
  },
  {
    "path": "data/maps/CinnabarIsland_Gym/text.inc",
    "content": "CinnabarIsland_Gym_Text_BlaineIntro::\n    .string \"Hah!\\p\"\n    .string \"I am BLAINE, the red-hot LEADER\\n\"\n    .string \"of CINNABAR GYM!\\p\"\n    .string \"My fiery POKéMON are all rough\\n\"\n    .string \"and ready with intense heat!\\p\"\n    .string \"They incinerate all challengers!\\p\"\n    .string \"Hah!\\n\"\n    .string \"You better have BURN HEAL!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nCinnabarIsland_Gym_Text_BlaineDefeat::\n    .string \"I have burned down to nothing!\\n\"\n    .string \"Not even ashes remain!\\p\"\n    .string \"You have earned the VOLCANOBADGE.$\"\n\nCinnabarIsland_Gym_Text_FireBlastIsUltimateFireMove::\n    .string \"FIRE BLAST is the ultimate fire\\n\"\n    .string \"technique.\\p\"\n    .string \"Don't waste it on WATER POKéMON.$\"\n\nCinnabarIsland_Gym_Text_ExplainVolcanoBadge::\n    .string \"Hah!\\p\"\n    .string \"The VOLCANOBADGE heightens the\\n\"\n    .string \"SPECIAL stats of your POKéMON.\\p\"\n    .string \"Here, you can have this, too!$\"\n\nCinnabarIsland_Gym_Text_ReceivedTM38FromBlaine::\n    .string \"{PLAYER} received TM38\\n\"\n    .string \"from BLAINE.$\"\n\nCinnabarIsland_Gym_Text_BlainePostBattle::\n    .string \"TM38 contains FIRE BLAST.\\n\"\n    .string \"Teach it to FIRE-type POKéMON.\\p\"\n    .string \"VULPIX or CHARMELEON would be\\n\"\n    .string \"ideal for that move.$\"\n\nCinnabarIsland_Gym_Text_MakeSpaceForThis::\n    .string \"Make space for this, child!$\"\n\nCinnabarIsland_Gym_Text_ErikIntro::\n    .string \"Do you know how hot POKéMON fire\\n\"\n    .string \"breath can get?$\"\n\nCinnabarIsland_Gym_Text_ErikDefeat::\n    .string \"Yow!\\n\"\n    .string \"Hot, hot, hot!$\"\n\nCinnabarIsland_Gym_Text_ErikPostBattle::\n    .string \"Fire, or to be more precise,\\n\"\n    .string \"combustion…\\p\"\n    .string \"…Oxygen in the air…\\n\"\n    .string \"Blah, blah, blah, blah…$\"\n\nCinnabarIsland_Gym_Text_QuinnIntro::\n    .string \"I was a thief, but I went straight\\n\"\n    .string \"as a TRAINER.$\"\n\nCinnabarIsland_Gym_Text_QuinnDefeat::\n    .string \"I surrender!$\"\n\nCinnabarIsland_Gym_Text_QuinnPostBattle::\n    .string \"I get this uncontrollable urge to\\n\"\n    .string \"steal other people's POKéMON.$\"\n\nCinnabarIsland_Gym_Text_AveryIntro::\n    .string \"I've studied POKéMON thoroughly.\\n\"\n    .string \"You can't win!$\"\n\nCinnabarIsland_Gym_Text_AveryDefeat::\n    .string \"Waah!\\n\"\n    .string \"My studies were insufficient!$\"\n\nCinnabarIsland_Gym_Text_AveryPostBattle::\n    .string \"My theories are too complicated\\n\"\n    .string \"for you to understand.$\"\n\nCinnabarIsland_Gym_Text_RamonIntro::\n    .string \"I like using FIRE-type POKéMON.\\n\"\n    .string \"I just do.$\"\n\nCinnabarIsland_Gym_Text_RamonDefeat::\n    .string \"Too hot to handle!$\"\n\nCinnabarIsland_Gym_Text_RamonPostBattle::\n    .string \"I wish there were a thief POKéMON.\\n\"\n    .string \"I'd use that!$\"\n\nCinnabarIsland_Gym_Text_DerekIntro::\n    .string \"I know why BLAINE became a\\n\"\n    .string \"TRAINER.$\"\n\nCinnabarIsland_Gym_Text_DerekDefeat::\n    .string \"Ow!$\"\n\nCinnabarIsland_Gym_Text_DerekPostBattle::\n    .string \"Our LEADER, BLAINE, became lost\\n\"\n    .string \"in the mountains but good.\\p\"\n    .string \"Night fell when a fiery bird\\n\"\n    .string \"POKéMON appeared.\\p\"\n    .string \"Its light allowed BLAINE to find\\n\"\n    .string \"his way down safely.$\"\n\nCinnabarIsland_Gym_Text_DustyIntro::\n    .string \"I've been to many GYMS, but this\\n\"\n    .string \"one best suits my style.$\"\n\nCinnabarIsland_Gym_Text_DustyDefeat::\n    .string \"Yowza!\\n\"\n    .string \"Too hot!$\"\n\nCinnabarIsland_Gym_Text_DustyPostBattle::\n    .string \"PONYTA, NINETALES…\\n\"\n    .string \"Those are popular FIRE POKéMON.$\"\n\nCinnabarIsland_Gym_Text_ZacIntro::\n    .string \"Fire is weak against H2O.$\"\n\nCinnabarIsland_Gym_Text_ZacDefeat::\n    .string \"Oh!\\n\"\n    .string \"Snuffed out!$\"\n\nCinnabarIsland_Gym_Text_ZacPostBattle::\n    .string \"Water beats fire, of course.\\p\"\n    .string \"But fire melts ice, so the FIRE\\n\"\n    .string \"type beats ICE-type POKéMON.$\"\n\nCinnabarIsland_Gym_Text_GymGuyAdvice::\n    .string \"Yo!\\n\"\n    .string \"Champ in the making!\\p\"\n    .string \"The hotheaded BLAINE is a FIRE\\n\"\n    .string \"POKéMON pro.\\p\"\n    .string \"Douse his spirits with water!\\p\"\n    .string \"You'd better take some\\n\"\n    .string \"BURN HEALS, too.$\"\n\nCinnabarIsland_Gym_Text_GymGuyPostVictory::\n    .string \"{PLAYER}!\\n\"\n    .string \"You beat that firebrand!$\"\n\nCinnabarIsland_Gym_Text_GymStatue::\n    .string \"CINNABAR POKéMON GYM\\n\"\n    .string \"LEADER: BLAINE\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}$\"\n\nCinnabarIsland_Gym_Text_GymStatuePlayerWon::\n    .string \"CINNABAR POKéMON GYM\\n\"\n    .string \"LEADER: BLAINE\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}, {PLAYER}$\"\n\nCinnabarIsland_Gym_Text_PokemonQuizRules::\n    .string \"POKéMON Quiz!\\p\"\n    .string \"Get it right, and the door opens to\\n\"\n    .string \"the next room.\\p\"\n    .string \"Get it wrong, and face a TRAINER!\\p\"\n    .string \"If you want to conserve your\\n\"\n    .string \"POKéMON for the GYM LEADER…\\p\"\n    .string \"Then get it right!\\n\"\n    .string \"Here we go!$\"\n\nCinnabarIsland_Gym_Text_QuizQuestion1::\n    .string \"CATERPIE evolves into METAPOD?$\"\n\nCinnabarIsland_Gym_Text_QuizQuestion2::\n    .string \"There are nine certified POKéMON\\n\"\n    .string \"LEAGUE BADGES?$\"\n\nCinnabarIsland_Gym_Text_QuizQuestion3::\n    .string \"POLIWAG evolves three times?$\"\n\nCinnabarIsland_Gym_Text_QuizQuestion4::\n    .string \"Are electric moves effective\\n\"\n    .string \"against GROUND-type POKéMON?$\"\n\nCinnabarIsland_Gym_Text_QuizQuestion5::\n    .string \"POKéMON of the same kind and level\\n\"\n    .string \"are not identical?$\"\n\nCinnabarIsland_Gym_Text_QuizQuestion6::\n    .string \"TM28 contains TOMBSTONY?$\"\n\nCinnabarIsland_Gym_Text_CorrectGoOnThrough::\n    .string \"You're absolutely correct!\\p\"\n    .string \"Go on through!$\"\n\nCinnabarIsland_Gym_Text_SorryBadCall::\n    .string \"Sorry!\\n\"\n    .string \"Bad call!$\"\n\n"
  },
  {
    "path": "data/maps/CinnabarIsland_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_CINNABAR_ISLAND_MART\",\n  \"name\": \"CinnabarIsland_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_CINNABAR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_Mart_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_Mart_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_Mart_EventScript_Scientist\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CinnabarIsland_Mart/scripts.inc",
    "content": "CinnabarIsland_Mart_MapScripts::\n\t.byte 0\n\nCinnabarIsland_Mart_EventScript_Woman::\n\tmsgbox CinnabarIsland_Mart_Text_DontTheyHaveXAttack, MSGBOX_NPC\n\tend\n\nCinnabarIsland_Mart_EventScript_Scientist::\n\tmsgbox CinnabarIsland_Mart_Text_ExtraItemsNeverHurt, MSGBOX_NPC\n\tend\n\nCinnabarIsland_Mart_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart CinnabarIsland_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nCinnabarIsland_Mart_Items::\n\t.2byte ITEM_ULTRA_BALL\n\t.2byte ITEM_GREAT_BALL\n\t.2byte ITEM_HYPER_POTION\n\t.2byte ITEM_REVIVE\n\t.2byte ITEM_FULL_HEAL\n\t.2byte ITEM_ESCAPE_ROPE\n\t.2byte ITEM_MAX_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/CinnabarIsland_Mart/text.inc",
    "content": "CinnabarIsland_Mart_Text_DontTheyHaveXAttack::\n    .string \"Don't they have X ATTACK?\\p\"\n    .string \"I like it because it raises the\\n\"\n    .string \"ATTACK stat in battle.$\"\n\nCinnabarIsland_Mart_Text_ExtraItemsNeverHurt::\n    .string \"It never hurts to have extra items.\\n\"\n    .string \"You never know what might happen.$\"\n\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F\",\n  \"name\": \"CinnabarIsland_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_CINNABAR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonCenter_1F_EventScript_CooltrainerF\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonCenter_1F_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonCenter_1F_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonCenter_1F_EventScript_PokemonJournalMrFuji\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonCenter_1F_EventScript_PokemonJournalMrFuji\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BILL\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonCenter_1F_EventScript_Bill\",\n      \"flag\": \"FLAG_HIDE_CINNABAR_POKECENTER_BILL\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonCenter_1F/scripts.inc",
    "content": ".set LOCALID_BILL, 8\n\nCinnabarIsland_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CinnabarIsland_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nCinnabarIsland_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_CINNABAR_ISLAND\n\tend\n\nCinnabarIsland_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nCinnabarIsland_PokemonCenter_1F_EventScript_Gentleman::\n\tmsgbox CinnabarIsland_PokemonCenter_1F_Text_VisitUnionRoom, MSGBOX_NPC\n\tend\n\nCinnabarIsland_PokemonCenter_1F_EventScript_CooltrainerF::\n\tmsgbox CinnabarIsland_PokemonCenter_1F_Text_CinnabarGymLocked, MSGBOX_NPC\n\tend\n\nCinnabarIsland_PokemonCenter_1F_EventScript_Youngster::\n\tmsgbox CinnabarIsland_PokemonCenter_1F_Text_EvolutionCanWaitForNewMoves, MSGBOX_NPC\n\tend\n\nCinnabarIsland_PokemonCenter_1F_EventScript_Bill::\n\tlock\n\tfaceplayer\n\tmsgbox CinnabarIsland_PokemonCenter_1F_Text_ReadyToSailToOneIsland, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonCenter_1F_EventScript_NotReadyToSail\n\tmsgbox CinnabarIsland_PokemonCenter_1F_Text_LetsGo\n\tclosemessage\n\tplaybgm MUS_FOLLOW_ME, 1\n\tsavebgm MUS_FOLLOW_ME\n\tsetflag FLAG_DONT_TRANSITION_MUSIC\n\tsetflag FLAG_HIDE_CINNABAR_POKECENTER_BILL\n\tdelay 20\n\tcall_if_eq VAR_FACING, DIR_SOUTH, CinnabarIsland_PokemonCenter_1F_EventScript_ExitWithBillSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, CinnabarIsland_PokemonCenter_1F_EventScript_ExitWithBillEast\n\tcall_if_eq VAR_FACING, DIR_WEST, CinnabarIsland_PokemonCenter_1F_EventScript_ExitWithBillWest\n\tremoveobject LOCALID_BILL\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND_2, 1\n\tclearflag FLAG_HIDE_CINNABAR_BILL\n\twarp MAP_CINNABAR_ISLAND, 14, 11\n\twaitstate\n\trelease\n\tend\n\nCinnabarIsland_PokemonCenter_1F_EventScript_ExitWithBillSouth::\n\tapplymovement LOCALID_BILL, CinnabarIsland_PokemonCenter_1F_Movement_BillExit\n\tapplymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_PokemonCenter_1F_Movement_PlayerExitSouth\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_PokemonCenter_1F_EventScript_ExitWithBillEast::\n\tapplymovement LOCALID_BILL, CinnabarIsland_PokemonCenter_1F_Movement_BillExitEast\n\tapplymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_PokemonCenter_1F_Movement_PlayerExitEast\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_PokemonCenter_1F_EventScript_ExitWithBillWest::\n\tapplymovement LOCALID_BILL, CinnabarIsland_PokemonCenter_1F_Movement_BillExit\n\tapplymovement OBJ_EVENT_ID_PLAYER, CinnabarIsland_PokemonCenter_1F_Movement_PlayerExitWest\n\twaitmovement 0\n\treturn\n\nCinnabarIsland_PokemonCenter_1F_EventScript_NotReadyToSail::\n\tmsgbox CinnabarIsland_PokemonCenter_1F_Text_OhNotDoneYet\n\trelease\n\tend\n\nCinnabarIsland_PokemonCenter_1F_Movement_BillExit::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\twalk_down\n\tdelay_8\n\tset_invisible\n\tstep_end\n\nCinnabarIsland_PokemonCenter_1F_Movement_PlayerExitSouth::\n\twalk_down\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\tdelay_16\n\twalk_down\n\tstep_end\n\nCinnabarIsland_PokemonCenter_1F_Movement_BillExitEast::\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\twalk_down\n\tdelay_8\n\tset_invisible\n\tstep_end\n\nCinnabarIsland_PokemonCenter_1F_Movement_PlayerExitEast::\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tface_left\n\tdelay_16\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\tdelay_8\n\twalk_down\n\tdelay_8\n\tset_invisible\n\tstep_end\n\nCinnabarIsland_PokemonCenter_1F_Movement_PlayerExitWest::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\tdelay_16\n\twalk_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonCenter_1F/text.inc",
    "content": "CinnabarIsland_PokemonCenter_1F_Text_CinnabarGymLocked::\n    .string \"I came to visit the CINNABAR GYM,\\n\"\n    .string \"but the door is locked tight.\\p\"\n    .string \"There should be a key for it\\n\"\n    .string \"somewhere.\\p\"\n    .string \"Could it be in that burned-out\\n\"\n    .string \"mansion?\\p\"\n    .string \"The GYM LEADER's friend used to\\n\"\n    .string \"live there, they say.$\"\n\nCinnabarIsland_PokemonCenter_1F_Text_VisitUnionRoom::\n    .string \"Do you have lots of friends?\\p\"\n    .string \"Linking up with the usual friends\\n\"\n    .string \"is fun, of course.\\p\"\n    .string \"But how about visiting the\\n\"\n    .string \"UNION ROOM every so often?\\p\"\n    .string \"Who knows, you may end up making\\n\"\n    .string \"new friends.\\p\"\n    .string \"I think it would be worth your time\\n\"\n    .string \"to check the UNION ROOM.$\"\n\nCinnabarIsland_PokemonCenter_1F_Text_EvolutionCanWaitForNewMoves::\n    .string \"POKéMON can still learn techniques\\n\"\n    .string \"after canceling evolution.\\p\"\n    .string \"Evolution can wait until new moves\\n\"\n    .string \"have been learned.$\"\n\nCinnabarIsland_PokemonCenter_1F_Text_ReadyToSailToOneIsland::\n    .string \"BILL: Hey, you kept me waiting!\\n\"\n    .string \"Ready to set sail to ONE ISLAND?$\"\n\nCinnabarIsland_PokemonCenter_1F_Text_OhNotDoneYet::\n    .string \"Oh, you're still not done yet?$\"\n\nCinnabarIsland_PokemonCenter_1F_Text_LetsGo::\n    .string \"Well, that's it.\\n\"\n    .string \"Let's go!$\"\n\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_CINNABAR_ISLAND_POKEMON_CENTER_2F\",\n  \"name\": \"CinnabarIsland_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_CINNABAR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonCenter_2F/scripts.inc",
    "content": "CinnabarIsland_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nCinnabarIsland_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nCinnabarIsland_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nCinnabarIsland_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonLab_Entrance/map.json",
    "content": "{\n  \"id\": \"MAP_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE\",\n  \"name\": \"CinnabarIsland_PokemonLab_Entrance\",\n  \"layout\": \"LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE\",\n  \"music\": \"MUS_CINNABAR\",\n  \"region_map_section\": \"MAPSEC_CINNABAR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonLab_Entrance_EventScript_Scientist\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND_POKEMON_LAB_LOUNGE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND_POKEMON_LAB_RESEARCH_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CinnabarIsland_PokemonLab_Entrance_EventScript_DrFujiPhoto\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CinnabarIsland_PokemonLab_Entrance_EventScript_MeetingRoomSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 18,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CinnabarIsland_PokemonLab_Entrance_EventScript_RAndDRoomSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 24,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CinnabarIsland_PokemonLab_Entrance_EventScript_TestingRoomSign\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonLab_Entrance/scripts.inc",
    "content": "CinnabarIsland_PokemonLab_Entrance_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CinnabarIsland_PokemonLab_Entrance_OnTransition\n\t.byte 0\n\nCinnabarIsland_PokemonLab_Entrance_OnTransition::\n\tcall_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 1, CinnabarIsland_PokemonLab_Entrance_EventScript_ReadyFossil\n\tend\n\nCinnabarIsland_PokemonLab_Entrance_EventScript_ReadyFossil::\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 2\n\treturn\n\nCinnabarIsland_PokemonLab_Entrance_EventScript_Scientist::\n\tcallnative CheckPlayerTrappedOnCinnabar\n\tgoto_if_ne VAR_RESULT, 0, CinnabarIsland_PokemonLab_Entrance_EventScript_Trapped\n\tmsgbox CinnabarIsland_PokemonLab_Entrance_Text_StudyMonsExtensively, MSGBOX_NPC\n\tend\n\nCinnabarIsland_PokemonLab_Entrance_EventScript_Trapped::\n\tlock\n\tfaceplayer\n\tcopyvar VAR_0x8005, VAR_RESULT\n\tmsgbox CinnabarIsland_PokemonLab_Entrance_Text_Trapped, MSGBOX_DEFAULT\n\tgivemon SPECIES_TENTACOOL, 15, ITEM_NONE\n\tcopyvar VAR_0x8007, VAR_RESULT\n\tgoto_if_eq VAR_RESULT, 0, CinnabarIsland_PokemonLab_Entrance_EventScript_GetTentacoolParty\n\tgoto_if_eq VAR_RESULT, 1, CinnabarIsland_PokemonLab_Entrance_EventScript_GetTentacoolPC\n\tgoto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_Entrance_EventScript_GetTentacoolParty::\n\ttextcolor 3\n\tplayfanfare MUS_LEVEL_UP\n\tmessage CinnabarIsland_PokemonLab_Entrance_Text_ObtainedATentacool\n\twaitmessage\n\twaitfanfare\n\tbufferspeciesname STR_VAR_1, SPECIES_TENTACOOL\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, CinnabarIsland_PokemonLab_Entrance_EventScript_NicknameTentacoolParty\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_Entrance_EventScript_CheckHaveHM03\nCinnabarIsland_PokemonLab_Entrance_EventScript_NicknameTentacoolParty::\n\tcall EventScript_GetGiftMonPartySlot\n\tcall EventScript_ChangePokemonNickname\n\tgoto CinnabarIsland_PokemonLab_Entrance_EventScript_CheckHaveHM03\n\tend\n\nCinnabarIsland_PokemonLab_Entrance_EventScript_GetTentacoolPC::\n\ttextcolor 3\n\tplayfanfare MUS_LEVEL_UP\n\tmessage CinnabarIsland_PokemonLab_Entrance_Text_ObtainedATentacool\n\twaitmessage\n\twaitfanfare\n\tbufferspeciesname STR_VAR_1, SPECIES_TENTACOOL\n\tsetvar VAR_TEMP_1, SPECIES_TENTACOOL\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, CinnabarIsland_PokemonLab_Entrance_EventScript_NicknameTentacoolPC\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tcall_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_Entrance_EventScript_TransferTentacoolToPC\nCinnabarIsland_PokemonLab_Entrance_EventScript_NicknameTentacoolPC::\n\tcall EventScript_NameReceivedBoxMon\n\tcall EventScript_TransferredToPC\n\tgoto CinnabarIsland_PokemonLab_Entrance_EventScript_CheckHaveHM03\n\tend\n\nCinnabarIsland_PokemonLab_Entrance_EventScript_CheckHaveHM03::\n\tgoto_if_ne VAR_0x8005, 1, CinnabarIsland_PokemonLab_Entrance_EventScript_TeachSurf\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_Entrance_EventScript_TeachSurf::\n\tcallnative TeachTrappedTentacoolSurf\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_Entrance_EventScript_TransferTentacoolToPC::\n\tcall EventScript_TransferredToPC\n\tgoto CinnabarIsland_PokemonLab_Entrance_EventScript_CheckHaveHM03\n\tend\n\nCinnabarIsland_PokemonLab_Entrance_Text_Trapped::\n\t.string \"Huh? Do you happen to…\\n\"\n\t.string \"not have a POKéMON that can SURF?\\p\"\n\t.string \"That must be hard on you.\\n\"\n\t.string \"…\\p\"\n\t.string \"Don't worry about it!\\n\"\n\t.string \"I'll give you a TENTACOOL!\\p\"\n\t.string \"I just caught a little too many.\\n\"\n\t.string \"I was going to release it,\\l\"\n\t.string \"so take it. Go ahead!$\"\n\nCinnabarIsland_PokemonLab_Entrance_Text_ObtainedATentacool::\n\t.string \"{PLAYER} received\\n\"\n\t.string \"the TENTACOOL!$\"\n\nCinnabarIsland_PokemonLab_Entrance_EventScript_DrFujiPhoto::\n\tmsgbox CinnabarIsland_PokemonLab_Entrance_Text_PhotoOfLabFounderDrFuji, MSGBOX_SIGN\n\tend\n\nCinnabarIsland_PokemonLab_Entrance_EventScript_MeetingRoomSign::\n\tmsgbox CinnabarIsland_PokemonLab_Entrance_Text_MeetingRoomSign, MSGBOX_SIGN\n\tend\n\nCinnabarIsland_PokemonLab_Entrance_EventScript_RAndDRoomSign::\n\tmsgbox CinnabarIsland_PokemonLab_Entrance_Text_RAndDRoomSign, MSGBOX_SIGN\n\tend\n\nCinnabarIsland_PokemonLab_Entrance_EventScript_TestingRoomSign::\n\tmsgbox CinnabarIsland_PokemonLab_Entrance_Text_TestingRoomSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonLab_Entrance/text.inc",
    "content": "CinnabarIsland_Gym_Text_PhotoOfBlaineAndFuji::\n    .string \"It's a photo of BLAINE and\\n\"\n    .string \"MR. FUJI.\\p\"\n    .string \"They're standing shoulder to\\n\"\n    .string \"shoulder with big grins.$\"\n\nCinnabarIsland_PokemonLab_Entrance_Text_StudyMonsExtensively::\n    .string \"We study POKéMON extensively\\n\"\n    .string \"every day.\\p\"\n    .string \"People often bring us rare POKéMON\\n\"\n    .string \"for examination.$\"\n\nCinnabarIsland_PokemonLab_Entrance_Text_PhotoOfLabFounderDrFuji::\n    .string \"A photo of the LAB's founder…\\n\"\n    .string \"DR. FUJI?!$\"\n\nCinnabarIsland_PokemonLab_Entrance_Text_MeetingRoomSign::\n    .string \"POKéMON LAB\\n\"\n    .string \"Meeting Room$\"\n\nCinnabarIsland_PokemonLab_Entrance_Text_RAndDRoomSign::\n    .string \"POKéMON LAB\\n\"\n    .string \"R & D Room$\"\n\nCinnabarIsland_PokemonLab_Entrance_Text_TestingRoomSign::\n    .string \"POKéMON LAB\\n\"\n    .string \"Testing Room$\"\n\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonLab_ExperimentRoom/map.json",
    "content": "{\n  \"id\": \"MAP_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM\",\n  \"name\": \"CinnabarIsland_PokemonLab_ExperimentRoom\",\n  \"layout\": \"LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM\",\n  \"music\": \"MUS_CINNABAR\",\n  \"region_map_section\": \"MAPSEC_CINNABAR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_Garett\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Omastar\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_SelfdestructTutor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonLab_ExperimentRoom/scripts.inc",
    "content": ".equ HELIX_FOSSIL, 1\n.equ DOME_FOSSIL,  2\n.equ OLD_AMBER,    3\n.set LOCALID_OMASTAR_MASTER, 3\n.set TRAINER, VAR_0x8009\n\nCinnabarIsland_PokemonLab_ExperimentRoom_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CinnabarIsland_PokemonLab_ExperimentRoom_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nCinnabarIsland_PokemonLab_ExperimentRoom_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_OMASTAR\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, CinnabarIsland_PokemonLab_ExperimentRoom_MapScript_OmastarMasterMovementType\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_MapScript_OmastarMasterMovementType::\n\tsetobjectmovementtype LOCALID_OMASTAR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_Garett::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8008, INGAME_TRADE_SEEL\n\tcall EventScript_GetInGameTradeSpeciesInfo\n\tgoto_if_set FLAG_DID_SEELOR_TRADE, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_AlreadyTraded\n\tmsgbox Trade_Text_LookingForMonWannaTradeForMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineTrade\n\tcall EventScript_ChooseMonForInGameTrade\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineTrade\n\tcall EventScript_GetInGameTradeSpecies\n\tgoto_if_ne VAR_RESULT, VAR_0x8009, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NotRequestedMon\n\tcall EventScript_DoInGameTrade\n\tmsgbox Trade_Text_HeyThanks\n\tsetflag FLAG_DID_SEELOR_TRADE\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineTrade::\n\tmsgbox Trade_Text_AwwOhWell\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NotRequestedMon::\n\tbufferspeciesname STR_VAR_1, VAR_0x8009\n\tmsgbox Trade_Text_WhatThatsNoMon\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_AlreadyTraded::\n\tmsgbox Trade_Text_IsntMyOldMonGreat\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist::\n\tlock\n\tfaceplayer\n\tsetvar VAR_RESULT, FALSE\n\tgoto_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 2, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveRevivedMon\n\tgoto_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilStillReviving\n\tcheckitem ITEM_HELIX_FOSSIL, 1\n\tcopyvar VAR_0x800A, VAR_RESULT\n\tcheckitem ITEM_DOME_FOSSIL, 1\n\tcopyvar VAR_0x800B, VAR_RESULT\n\tcheckitem ITEM_OLD_AMBER, 1\n\tcopyvar VAR_0x8007, VAR_RESULT\n\tgoto_if_ne VAR_0x800A, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_1\n\tgoto_if_ne VAR_0x800B, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_1\n\tgoto_if_ne VAR_0x8007, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_1\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil\n\treturn\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_1:\n\tgoto_if_ne VAR_0x800A, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_27\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_24:\n\tgoto_if_ne VAR_0x800A, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_23\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_21:\n\tgoto_if_ne VAR_0x800A, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_20\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_19:\n\tgoto_if_ne VAR_0x800A, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_11\n\tgoto_if_ne VAR_0x800B, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_16\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_15:\n\tgoto_if_ne VAR_0x800B, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_13\n\tmessage CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_AMBER, FALSE\n\tgoto_if_eq VAR_RESULT, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_55\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_54:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil\n\treturn\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_8:\n\tmessage CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_HELIX_DOME_AMBER, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_34\n\tcase 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_33\n\tcase 2, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_35\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_31:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil\n\treturn\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_9:\n\tmessage CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_HELIX_DOME, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_39\n\tcase 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_38\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_36:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil\n\treturn\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_10:\n\tmessage CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_HELIX_AMBER, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_42\n\tcase 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_43\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_40:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil\n\treturn\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_11:\n\tmessage CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_HELIX, FALSE\n\tcompare VAR_RESULT, 0\n\tgoto_if_eq CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_45\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_44:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil\n\treturn\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_12:\n\tmessage CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_DOME_AMBER, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_49\n\tcase 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_50\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_47:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil\n\treturn\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_13:\n\tmessage CinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_DOME, FALSE\n\tcompare VAR_RESULT, 0\n\tgoto_if_eq CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_52\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_51:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil\n\treturn\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_16:\n\tgoto_if_ne VAR_0x8007, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_12\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_15\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_20:\n\tgoto_if_ne VAR_0x8007, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_10\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_19\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_23:\n\tgoto_if_ne VAR_0x800B, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_9\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_21\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_26:\n\tgoto_if_ne VAR_0x8007, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_8\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_24\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_27:\n\tgoto_if_ne VAR_0x800B, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_26\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_24\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_33:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowDomeFossil\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_31\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_34:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowHelixFossil\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_31\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_35:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowOldAmber\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_31\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_38:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowDomeFossil\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_36\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_39:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowHelixFossil\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_36\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_42:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowHelixFossil\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_40\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_43:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowOldAmber\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_40\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_45:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowHelixFossil\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_44\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_49:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowDomeFossil\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_47\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_50:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowOldAmber\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_47\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_52:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowDomeFossil\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_51\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_55:\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowOldAmber\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilScientist_54\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowHelixFossil::\n\tbufferspeciesname STR_VAR_1, SPECIES_OMANYTE\n\tbufferitemname STR_VAR_2, ITEM_HELIX_FOSSIL\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_ThatFossilIsOfMonMakeItLiveAgain, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineReviveFossil\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_HandedFossilToWeirdDoctor\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tremoveitem ITEM_HELIX_FOSSIL\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_TakesTimeGoForWalk\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 1\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL, HELIX_FOSSIL\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowDomeFossil::\n\tbufferspeciesname STR_VAR_1, SPECIES_KABUTO\n\tbufferitemname STR_VAR_2, ITEM_DOME_FOSSIL\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_ThatFossilIsOfMonMakeItLiveAgain, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineReviveFossil\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_HandedFossilToWeirdDoctor\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tremoveitem ITEM_DOME_FOSSIL\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_TakesTimeGoForWalk\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 1\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL, DOME_FOSSIL\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_ShowOldAmber::\n\tbufferspeciesname STR_VAR_1, SPECIES_AERODACTYL\n\tbufferitemname STR_VAR_2, ITEM_OLD_AMBER\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_ThatFossilIsOfMonMakeItLiveAgain, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineReviveFossil\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_HandedFossilToWeirdDoctor\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tremoveitem ITEM_OLD_AMBER\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_TakesTimeGoForWalk\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 1\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL, OLD_AMBER\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DeclineReviveFossil::\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_YouComeAgain\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_FossilStillReviving::\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_TakesTimeGoForWalk\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveRevivedMon::\n\tgoto_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL, HELIX_FOSSIL, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveOmanyte\n\tgoto_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL, DOME_FOSSIL, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveKabuto\n\tgoto_if_eq VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL, OLD_AMBER, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveAerodactyl\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveOmanyte::\n\tsetvar VAR_TEMP_1, SPECIES_OMANYTE\n\tbufferspeciesname STR_VAR_1, SPECIES_OMANYTE\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_FossilMonBackToLife\n\tgivemon SPECIES_OMANYTE, 5\n\tgoto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon\n\tsetflag FLAG_REVIVED_HELIX\n\tgoto_if_eq VAR_RESULT, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonParty\n\tgoto_if_eq VAR_RESULT, 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonPC\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveKabuto::\n\tsetvar VAR_TEMP_1, SPECIES_KABUTO\n\tbufferspeciesname STR_VAR_1, SPECIES_KABUTO\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_FossilMonBackToLife\n\tgivemon SPECIES_KABUTO, 5\n\tgoto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon\n\tsetflag FLAG_REVIVED_DOME\n\tgoto_if_eq VAR_RESULT, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonParty\n\tgoto_if_eq VAR_RESULT, 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonPC\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_GiveAerodactyl::\n\tsetvar VAR_TEMP_1, SPECIES_AERODACTYL\n\tbufferspeciesname STR_VAR_1, SPECIES_AERODACTYL\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_FossilMonBackToLife\n\tgivemon SPECIES_AERODACTYL, 5\n\tgoto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon\n\tsetflag FLAG_REVIVED_AMBER\n\tgoto_if_eq VAR_RESULT, 0, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonParty\n\tgoto_if_eq VAR_RESULT, 1, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonPC\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonParty::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage CinnabarIsland_PokemonLab_ExperimentRoom_Text_ReceivedMonFromDoctor\n\twaitmessage\n\twaitfanfare\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 0\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameFossilParty\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_EndGiveMon\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameFossilParty::\n\tcall EventScript_GetGiftMonPartySlot\n\tcall EventScript_ChangePokemonNickname\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_EndGiveMon\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameMonPC::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage CinnabarIsland_PokemonLab_ExperimentRoom_Text_ReceivedMonFromDoctor\n\twaitmessage\n\twaitfanfare\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE, 0\n\tcallnative CheckNuzlockeMode\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameFossilPC\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_MonSentToPC\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_NicknameFossilPC::\n\tcall EventScript_NameReceivedBoxMon\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_MonSentToPC\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_MonSentToPC::\n\tcall EventScript_TransferredToPC\n\tgoto CinnabarIsland_PokemonLab_ExperimentRoom_EventScript_EndGiveMon\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_EndGiveMon::\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_RevivedAllFossils::\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_YouComeAgain\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_DontShowFossil::\n\tmsgbox CinnabarIsland_PokemonLab_ExperimentRoom_Text_NoIsTooBad\n\trelease\n\tend\n\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonLab_ExperimentRoom/text.inc",
    "content": "Text_MetronomeTeach::\n    .string \"Tch-tch-tch!\\n\"\n    .string \"I'll teach you a nifty move.\\p\"\n    .string \"Teach it to a POKéMON, and watch\\n\"\n    .string \"the fun unfold!\\p\"\n    .string \"It's a move called METRONOME.\\n\"\n    .string \"Does it strike your fancy?$\"\n\nText_MetronomeDeclined::\n    .string \"I tell you, it's a lot of fun!$\"\n\nText_MetronomeWhichMon::\n    .string \"Okay!\\n\"\n    .string \"Which POKéMON should I teach?$\"\n\nText_MetronomeTaught::\n    .string \"Tch-tch-tch!\\n\"\n    .string \"That's the sound of a METRONOME.\\p\"\n    .string \"It tweaks your POKéMON's brain into\\n\"\n    .string \"using moves it doesn't even know.$\"\n\nText_MetronomeReteach::\n    .string \"Tch-tch-tch!\\n\"\n    .string \"The METRONOME ticks eternally!\\p\"\n    .string \"I'll teach you METRONOME again\\n\"\n    .string \"in exchange for ¥5000.$\"\n\nText_MetronomeReteach2::\n    .string \"Tch-tch-tch!\\n\"\n    .string \"Let me teach METRONOME?$\"\n\nText_MetronomeNotEnoughMoney::\n    .string \"Tch-tch-tch!\\p\"\n    .string \"Time is money, and you don't\\n\"\n    .string \"have enough!$\"\n\nCinnabarIsland_PokemonLab_ExperimentRoom_Text_HaveYouAFossilForMe::\n    .string \"Hiya!\\p\"\n    .string \"I am important doctor.\\n\"\n    .string \"Yes, very much so, indeed.\\p\"\n    .string \"Here, I study rare POKéMON fossils.\\n\"\n    .string \"All the time, I study.\\p\"\n    .string \"You!\\n\"\n    .string \"Have you a fossil for me?$\"\n\nCinnabarIsland_PokemonLab_ExperimentRoom_Text_NoIsTooBad::\n    .string \"No!\\n\"\n    .string \"Is too bad!$\"\n\nCinnabarIsland_PokemonLab_ExperimentRoom_Text_FossilMonBackToLife::\n    .string \"You late.\\n\"\n    .string \"Where were you?\\p\"\n    .string \"Your fossil is back to life!\\n\"\n    .string \"It was {STR_VAR_1} like I think!$\"\n\nCinnabarIsland_PokemonLab_ExperimentRoom_Text_ReceivedMonFromDoctor::\n    .string \"{PLAYER} received the {STR_VAR_1}\\n\"\n    .string \"from the doctor.$\"\n\nCinnabarIsland_PokemonLab_ExperimentRoom_Text_ThatFossilIsOfMonMakeItLiveAgain::\n    .string \"Oh!\\n\"\n    .string \"That is {STR_VAR_2}, it is!\\p\"\n    .string \"It is fossil of {STR_VAR_1},\\n\"\n    .string \"a POKéMON that is already extinct!\\p\"\n    .string \"My Resurrection Machine will make\\n\"\n    .string \"that POKéMON live again!$\"\n\n@ TODO: Resolve text dump error below?\nCinnabarIsland_PokemonLab_ExperimentRoom_Text_HandedFossilToWeirdDoctor::\n    .string \"So!\\n\"\n    .string \"You hurry and give me that!\\p\"\n    .string \"{FONT_NORMAL}{PLAYER} handed over the\\n\"\n    .string \"{STR_VAR_2} to the weird doctor.$\"\n\nCinnabarIsland_PokemonLab_ExperimentRoom_Text_TakesTimeGoForWalk::\n    .string \"I take a little time!\\n\"\n    .string \"You go for walk a little while!$\"\n\nCinnabarIsland_PokemonLab_ExperimentRoom_Text_YouComeAgain::\n    .string \"Aiyah!\\n\"\n    .string \"You come again!$\"\n\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonLab_Lounge/map.json",
    "content": "{\n  \"id\": \"MAP_CINNABAR_ISLAND_POKEMON_LAB_LOUNGE\",\n  \"name\": \"CinnabarIsland_PokemonLab_Lounge\",\n  \"layout\": \"LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_LOUNGE\",\n  \"music\": \"MUS_CINNABAR\",\n  \"region_map_section\": \"MAPSEC_CINNABAR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"x\": 5,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonLab_Lounge_EventScript_Scientist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonLab_Lounge_EventScript_Clifton\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"x\": 10,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonLab_Lounge_EventScript_Norma\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonLab_Lounge/scripts.inc",
    "content": "CinnabarIsland_PokemonLab_Lounge_MapScripts::\n\t.byte 0\n\nCinnabarIsland_PokemonLab_Lounge_EventScript_Scientist::\n\tmsgbox CinnabarIsland_PokemonLab_Lounge_Text_FoundFossilInMtMoon, MSGBOX_NPC\n\tend\n\nCinnabarIsland_PokemonLab_Lounge_EventScript_Clifton::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8008, INGAME_TRADE_ELECTRODE\n\tcall EventScript_GetInGameTradeSpeciesInfo\n\tgoto_if_set FLAG_DID_ESPHERE_TRADE, CinnabarIsland_PokemonLab_Lounge_EventScript_CliftonAlreadyTraded\n\tmsgbox Trade_Text_DoYouHaveMonWouldYouTradeForMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_Lounge_EventScript_CliftonDeclineTrade\n\tcall EventScript_ChooseMonForInGameTrade\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, CinnabarIsland_PokemonLab_Lounge_EventScript_CliftonDeclineTrade\n\tcall EventScript_GetInGameTradeSpecies\n\tgoto_if_ne VAR_RESULT, VAR_0x8009, CinnabarIsland_PokemonLab_Lounge_EventScript_CliftonNotRequestedMon\n\tcall EventScript_DoInGameTrade\n\tmsgbox Trade_Text_Thanks\n\tsetflag FLAG_DID_ESPHERE_TRADE\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_Lounge_EventScript_CliftonDeclineTrade::\n\tmsgbox Trade_Text_WellIfYouDontWantTo\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_Lounge_EventScript_CliftonNotRequestedMon::\n\tbufferspeciesname STR_VAR_1, VAR_0x8009\n\tmsgbox Trade_Text_ThisIsntMon\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_Lounge_EventScript_CliftonAlreadyTraded::\n\tmsgbox Trade_Text_HasTradedMonGrownStronger\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_Lounge_EventScript_Norma::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8008, INGAME_TRADE_TANGELA\n\tcopyvar VAR_0x8004, VAR_0x8008\n\tspecialvar VAR_RESULT, GetInGameTradeSpeciesInfo\n\tcopyvar VAR_0x8009, VAR_RESULT\n\tgoto_if_set FLAG_DID_TANGENY_TRADE, CinnabarIsland_PokemonLab_Lounge_EventScript_NormaAlreadyTraded\n\tmsgbox Trade_Text_DoYouHaveMonWantToTradeForMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CinnabarIsland_PokemonLab_Lounge_EventScript_NormaDeclineTrade\n\tspecial ChoosePartyMon\n\twaitstate\n\tcopyvar VAR_0x800A, VAR_0x8004\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, CinnabarIsland_PokemonLab_Lounge_EventScript_NormaDeclineTrade\n\tcopyvar VAR_0x8005, VAR_0x800A\n\tspecialvar VAR_RESULT, GetTradeSpecies\n\tcopyvar VAR_0x800B, VAR_RESULT\n\tgoto_if_ne VAR_RESULT, VAR_0x8009, CinnabarIsland_PokemonLab_Lounge_EventScript_NormaNotRequestedMon\n\tcopyvar VAR_0x8004, VAR_0x8008\n\tcopyvar VAR_0x8005, VAR_0x800A\n\tspecial CreateInGameTradePokemon\n\tspecial DoInGameTradeScene\n\twaitstate\n\tmsgbox Trade_Text_ThanksYoureAPal\n\tsetflag FLAG_DID_TANGENY_TRADE\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_Lounge_EventScript_NormaDeclineTrade::\n\tmsgbox Trade_Text_ThatsTooBad\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_Lounge_EventScript_NormaNotRequestedMon::\n\tbufferspeciesname STR_VAR_1, VAR_0x8009\n\tmsgbox Trade_Text_ThisIsNoMon\n\trelease\n\tend\n\nCinnabarIsland_PokemonLab_Lounge_EventScript_NormaAlreadyTraded::\n\tmsgbox Trade_Text_HowIsMyOldMon\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonLab_Lounge/text.inc",
    "content": "CinnabarIsland_PokemonLab_Lounge_Text_FoundFossilInMtMoon::\n    .string \"I found this most remarkable fossil\\n\"\n    .string \"inside MT. MOON.\\p\"\n    .string \"I think it's of a rare, prehistoric\\n\"\n    .string \"POKéMON.$\"\n\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonLab_ResearchRoom/map.json",
    "content": "{\n  \"id\": \"MAP_CINNABAR_ISLAND_POKEMON_LAB_RESEARCH_ROOM\",\n  \"name\": \"CinnabarIsland_PokemonLab_ResearchRoom\",\n  \"layout\": \"LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_RESEARCH_ROOM\",\n  \"music\": \"MUS_CINNABAR\",\n  \"region_map_section\": \"MAPSEC_CINNABAR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonLab_ResearchRoom_EventScript_MetronomeTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"x\": 10,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CinnabarIsland_PokemonLab_ResearchRoom_EventScript_Scientist\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CinnabarIsland_PokemonLab_ResearchRoom_EventScript_AmberPipe\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"CinnabarIsland_PokemonLab_ResearchRoom_EventScript_Computer\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonLab_ResearchRoom/scripts.inc",
    "content": "CinnabarIsland_PokemonLab_ResearchRoom_MapScripts::\n\t.byte 0\n\nCinnabarIsland_PokemonLab_ResearchRoom_EventScript_MetronomeTutor::\n\tgoto EventScript_MetronomeTutor\n\tend\n\nCinnabarIsland_PokemonLab_ResearchRoom_EventScript_Scientist::\n\tmsgbox CinnabarIsland_PokemonLab_ResearchRoom_Text_EeveeCanEvolveIntroThreeMons, MSGBOX_NPC\n\tend\n\nCinnabarIsland_PokemonLab_ResearchRoom_EventScript_Computer::\n\tmsgbox CinnabarIsland_PokemonLab_ResearchRoom_Text_LegendaryBirdEmail, MSGBOX_SIGN\n\tend\n\nCinnabarIsland_PokemonLab_ResearchRoom_EventScript_AmberPipe::\n\tmsgbox CinnabarIsland_PokemonLab_ResearchRoom_Text_AnAmberPipe, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/CinnabarIsland_PokemonLab_ResearchRoom/text.inc",
    "content": "CinnabarIsland_PokemonLab_ResearchRoom_Text_EeveeCanEvolveIntroThreeMons::\n    .string \"EEVEE can evolve into one of three\\n\"\n    .string \"kinds of POKéMON.$\"\n\nCinnabarIsland_PokemonLab_ResearchRoom_Text_LegendaryBirdEmail::\n    .string \"There's an e-mail message.\\p\"\n    .string \"… … …\\p\"\n    .string \"There are three legendary bird\\n\"\n    .string \"POKéMON.\\p\"\n    .string \"They are ARTICUNO, ZAPDOS, and\\n\"\n    .string \"MOLTRES.\\p\"\n    .string \"Their whereabouts are unknown.\\p\"\n    .string \"We plan to explore the cavern\\n\"\n    .string \"close to CERULEAN.\\p\"\n    .string \"From: POKéMON RESEARCH TEAM…$\"\n\nCinnabarIsland_PokemonLab_ResearchRoom_Text_AnAmberPipe::\n    .string \"An amber pipe!$\"\n\n"
  },
  {
    "path": "data/maps/DiglettsCave_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_DIGLETTS_CAVE_B1F\",\n  \"name\": \"DiglettsCave_B1F\",\n  \"layout\": \"LAYOUT_DIGLETTS_CAVE_B1F\",\n  \"music\": \"MUS_VIRIDIAN_FOREST\",\n  \"region_map_section\": \"MAPSEC_DIGLETTS_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 51,\n      \"y\": 43,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Dugtrio\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DIGLETTS_CAVE_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 82,\n      \"y\": 71,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DIGLETTS_CAVE_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/DiglettsCave_B1F/scripts.inc",
    "content": ".set LOCALID_DUGTRIO_MASTER, 1\n.set TRAINER, VAR_0x8009\n\nDiglettsCave_B1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, DiglettsCave_B1F_OnTransition\n\t.byte 0\n\nDiglettsCave_B1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_DIGLETTS_CAVE_B1F\n\tgoto DiglettsCave_B1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nDiglettsCave_B1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_DUGTRIO\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, DiglettsCave_B1F_MapScript_DugtrioMasterMovementType\n\tend\n\nDiglettsCave_B1F_MapScript_DugtrioMasterMovementType::\n\tsetobjectmovementtype LOCALID_DUGTRIO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn"
  },
  {
    "path": "data/maps/DiglettsCave_NorthEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_DIGLETTS_CAVE_NORTH_ENTRANCE\",\n  \"name\": \"DiglettsCave_NorthEntrance\",\n  \"layout\": \"LAYOUT_DIGLETTS_CAVE_NORTH_ENTRANCE\",\n  \"music\": \"MUS_VIRIDIAN_FOREST\",\n  \"region_map_section\": \"MAPSEC_DIGLETTS_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"DiglettsCave_NorthEntrance_EventScript_Hiker\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DIGLETTS_CAVE_B1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/DiglettsCave_NorthEntrance/scripts.inc",
    "content": "DiglettsCave_NorthEntrance_MapScripts::\n\t.byte 0\n\nDiglettsCave_NorthEntrance_EventScript_Hiker::\n\tmsgbox DiglettsCave_NorthEntrance_RockTunnelPitchBlack, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/DiglettsCave_NorthEntrance/text.inc",
    "content": "DiglettsCave_NorthEntrance_RockTunnelPitchBlack::\n    .string \"I went inside ROCK TUNNEL, but it's\\n\"\n    .string \"pitch-black and scary in there.\\p\"\n    .string \"If I could get a POKéMON to use\\n\"\n    .string \"FLASH and light it up…$\"\n\n"
  },
  {
    "path": "data/maps/DiglettsCave_SouthEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_DIGLETTS_CAVE_SOUTH_ENTRANCE\",\n  \"name\": \"DiglettsCave_SouthEntrance\",\n  \"layout\": \"LAYOUT_DIGLETTS_CAVE_SOUTH_ENTRANCE\",\n  \"music\": \"MUS_VIRIDIAN_FOREST\",\n  \"region_map_section\": \"MAPSEC_DIGLETTS_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"DiglettsCave_SouthEntrance_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Diglett\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE11\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DIGLETTS_CAVE_B1F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/DiglettsCave_SouthEntrance/scripts.inc",
    "content": ".set LOCALID_DIGLETT_MASTER, 2\n.set TRAINER, VAR_0x8009\n\nDiglettsCave_SouthEntrance_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, DiglettsCave_SouthEntrance_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nDiglettsCave_SouthEntrance_EventScript_OldMan::\n\tmsgbox DiglettsCave_SouthEntrance_Text_DiglettDugThisTunnel, MSGBOX_NPC\n\tend\n\nDiglettsCave_SouthEntrance_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_DIGLETT\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, DiglettsCave_SouthEntrance_MapScript_DiglettMasterMovementType\n\tend\n\nDiglettsCave_SouthEntrance_MapScript_DiglettMasterMovementType::\n\tsetobjectmovementtype LOCALID_DIGLETT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn"
  },
  {
    "path": "data/maps/DiglettsCave_SouthEntrance/text.inc",
    "content": "DiglettsCave_SouthEntrance_Text_DiglettDugThisTunnel::\n    .string \"Well, isn't this a surprise!\\n\"\n    .string \"DIGLETT dug this long tunnel!\\p\"\n    .string \"It goes right to VIRIDIAN CITY,\\n\"\n    .string \"they tell me.$\"\n\n"
  },
  {
    "path": "data/maps/FarawayIsland_Exterior/map.json",
    "content": "{\n  \"id\": \"MAP_FARAWAY_ISLAND_EXTERIOR\",\n  \"name\": \"FarawayIsland_Exterior\",\n  \"layout\": \"LAYOUT_FARAWAY_ISLAND_EXTERIOR\",\n  \"music\": \"MUS_ABANDONED_SHIP\",\n  \"region_map_section\": \"MAPSEC_FARAWAY_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 39,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FarawayIsland_Exterior_EventScript_Sailor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 22,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FARAWAY_ISLAND_INTERIOR\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 23,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FARAWAY_ISLAND_INTERIOR\",\n      \"dest_warp_id\": 1\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 32,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FarawayIsland_Exterior_EventScript_Sign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FarawayIsland_Exterior/scripts.inc",
    "content": "FarawayIsland_Exterior_MapScripts::\n\t.byte 0\n\nFarawayIsland_Exterior_EventScript_Sailor::\n\tlock\n\tfaceplayer\n\tmsgbox FarawayIsland_Exterior_Text_SailorReturn, MSGBOX_YESNO\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq FarawayIsland_Exterior_EventScript_AsYouLike\n\tmsgbox EventTicket_Text_SailHome, MSGBOX_DEFAULT\n\tclosemessage\n\tapplymovement VAR_LAST_TALKED, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tdelay 30\n\thideobjectat 1, MAP_FARAWAY_ISLAND_EXTERIOR\n\tsetvar VAR_0x8004, 2\n\tcall EventScript_SailToVermilionCity\n\twaitstate\n\trelease\n\tend\n\nFarawayIsland_Exterior_EventScript_AsYouLike::\n\tmsgbox EventTicket_Text_AsYouLike, MSGBOX_DEFAULT\n\trelease\n\tend\n\nFarawayIsland_Exterior_EventScript_Sign::\n\tmsgbox FarawayIsland_Exterior_Text_Sign, MSGBOX_SIGN\n\tend\n\t\nFarawayIsland_Exterior_Text_Sign:\n    .string \"The writing is fading as if it was\\n\"\n    .string \"written a long time ago…\\p\"\n    .string \"“…ber, 6th day\\n\"\n    .string \"If any human…sets foot here…\\l\"\n    .string \"again…et it be a kindhearted pers…\\l\"\n    .string \"…ith that hope, I depar…”$\"\n\t\nEventTicket_Text_SailHome:\n\t.string \"Aye, right, then!\\n\"\n\t.string \"Sail home we will!$\"\n\nEventTicket_Text_AsYouLike:\n\t.string \"Aye, right, as you like, then.$\"\n\t\nFarawayIsland_Exterior_Text_SailorReturn:\n    .string \"Do you want to return to VERMILION?$\"\n"
  },
  {
    "path": "data/maps/FarawayIsland_Exterior/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/FarawayIsland_Interior/map.json",
    "content": "{\n  \"id\": \"MAP_FARAWAY_ISLAND_INTERIOR\",\n  \"name\": \"FarawayIsland_Interior\",\n  \"layout\": \"LAYOUT_FARAWAY_ISLAND_INTERIOR\",\n  \"music\": \"MUS_ABANDONED_SHIP\",\n  \"region_map_section\": \"MAPSEC_FARAWAY_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SHADE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MEW\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS\",\n      \"movement_range_x\": 15,\n      \"movement_range_y\": 15,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FarawayIsland_Interior_EventScript_Mew\",\n      \"flag\": \"FLAG_HIDE_MEW\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 12,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FARAWAY_ISLAND_EXTERIOR\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 13,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FARAWAY_ISLAND_EXTERIOR\",\n      \"dest_warp_id\": 1\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FarawayIsland_Interior/scripts.inc",
    "content": ".set LOCALID_MEW, 1\n\nFarawayIsland_Interior_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, FarawayIsland_Interior_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FarawayIsland_Interior_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, FarawayIsland_Interior_OnFrame\n\tmap_script MAP_SCRIPT_ON_RETURN_TO_FIELD, FarawayIsland_Interior_OnReturnToField\n\t.byte 0\n\nFarawayIsland_Interior_OnReturnToField:\n\tcall_if_set FLAG_SYS_CTRL_OBJ_DELETE, FarawayIsland_Interior_EventScript_TrySetMewAboveGrass\n\tend\n\nFarawayIsland_Interior_EventScript_TrySetMewAboveGrass::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_WON\n\tgoto_if_eq FarawayIsland_Interior_EventScript_SetMewAboveGrass\n\tcompare VAR_RESULT, B_OUTCOME_RAN\n\tgoto_if_eq FarawayIsland_Interior_EventScript_SetMewAboveGrass\n\tcompare VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED\n\tgoto_if_eq FarawayIsland_Interior_EventScript_SetMewAboveGrass\n\tcompare VAR_RESULT, B_OUTCOME_MON_TELEPORTED\n\tgoto_if_eq FarawayIsland_Interior_EventScript_SetMewAboveGrass\n\treturn\n\nFarawayIsland_Interior_EventScript_SetMewAboveGrass::\n\tsetvar VAR_0x8004, 1\n\tspecial SetMewAboveGrass\n\treturn\n\nFarawayIsland_Interior_OnResume:\n\tcall_if_set FLAG_SYS_CTRL_OBJ_DELETE, FarawayIsland_Interior_EventScript_TryRemoveMew\n\tend\n\t\nFarawayIsland_Interior_EventScript_TryRemoveMew::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_CAUGHT\n\tgoto_if_ne EventScript_Return\n\tremoveobject VAR_LAST_TALKED\n\treturn\n\nFarawayIsland_Interior_OnTransition:\n\tsetvar VAR_FARAWAY_ISLAND_STEP_COUNTER, 0\n\tsetvar VAR_TEMP_1, 1\n\tcall_if_set FLAG_FOUGHT_MEW, FarawayIsland_Interior_EventScript_HideMew\n\tcall_if_unset FLAG_FOUGHT_MEW, FarawayIsland_Interior_EventScript_TryShowMew\n\tend\n\nFarawayIsland_Interior_EventScript_HideMew::\n\tsetflag FLAG_HIDE_MEW\n\treturn\n\nFarawayIsland_Interior_EventScript_TryShowMew::\n\tgoto_if_set FLAG_MEW_FLEW_AWAY, EventScript_Return\n\tclearflag FLAG_HIDE_MEW\n\tsetvar VAR_TEMP_1, 0\n\treturn\n\nFarawayIsland_Interior_OnFrame:\n\tmap_script_2 VAR_TEMP_1, 0, FarawayIsland_Interior_EventScript_FindMew\n\t.2byte 0\n\nFarawayIsland_Interior_EventScript_FindMew::\n\tlockall\n\tplayse SE_PIN\n\tapplymovement LOCALID_MEW, FarawayIsland_Interior_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_MEW, FarawayIsland_Interior_Movement_Delay48\n\twaitmovement 0\n\tapplymovement LOCALID_MEW, FarawayIsland_Interior_Movement_MewMoveAndHide\n\twaitmovement 0\n\tcopyobjectxytoperm LOCALID_MEW\n\tsetvar VAR_TEMP_1, 1\n\treleaseall\n\tend\n\nFarawayIsland_Interior_Movement_ExclamationMark:\n\temote_exclamation_mark\n\tstep_end\n\nFarawayIsland_Interior_Movement_Delay48:\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tstep_end\n\nFarawayIsland_Interior_Movement_MewMoveAndHide:\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_in_place_faster_down\n\tset_invisible\n\tstep_end\n\nFarawayIsland_Interior_Movement_MewAppear:\n\tset_visible\n\tstep_end\n\nFarawayIsland_Interior_Movement_MewFloatUpNorth:\n\tlock_facing_direction\n\twalk_fast_up\n\twalk_fast_up\n\tunlock_facing_direction\n\twalk_in_place_down\n\twalk_in_place_down\n\tstep_end\n\nFarawayIsland_Interior_Movement_MewFloatUpSouth:\n\tlock_facing_direction\n\twalk_fast_up\n\twalk_fast_up\n\tunlock_facing_direction\n\twalk_in_place_up\n\twalk_in_place_up\n\tstep_end\n\nFarawayIsland_Interior_Movement_MewFloatUpWest:\n\tlock_facing_direction\n\twalk_fast_up\n\twalk_fast_up\n\tunlock_facing_direction\n\twalk_in_place_right\n\twalk_in_place_right\n\tstep_end\n\nFarawayIsland_Interior_Movement_MewFloatUpEast:\n\tlock_facing_direction\n\twalk_fast_up\n\twalk_fast_up\n\tunlock_facing_direction\n\twalk_in_place_left\n\twalk_in_place_left\n\tstep_end\n\nFarawayIsland_Interior_EventScript_Mew::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tapplymovement LOCALID_MEW, FarawayIsland_Interior_Movement_MewAppear\n\twaitmovement 0\n\tsetvar VAR_0x8004, 0\n\tspecial SetMewAboveGrass\n\tmessage FarawayIsland_Interior_Text_Mew\n\twaitse\n\tplaymoncry SPECIES_MEW, 2\n\tcompare VAR_FACING, DIR_NORTH\n\tcall_if_eq FarawayIsland_Interior_EventScript_FoundMewNorth\n\tcompare VAR_FACING, DIR_SOUTH\n\tcall_if_eq FarawayIsland_Interior_EventScript_FoundMewSouth\n\tcompare VAR_FACING, DIR_WEST\n\tcall_if_eq FarawayIsland_Interior_EventScript_FoundMewWest\n\tcompare VAR_FACING, DIR_EAST\n\tcall_if_eq FarawayIsland_Interior_EventScript_FoundMewEast\n\tdelay 40\n\twaitmoncry\n\tsetvar VAR_0x8004, SPECIES_MEW\n\tsetvar VAR_0x8005, 30 @ level\n\tsetvar VAR_0x8006, ITEM_NONE\n\tspecial CreateEnemyEventMon\n\tsetflag FLAG_SYS_CTRL_OBJ_DELETE\n\tspecial StartLegendaryBattle\n\twaitstate\n\tclearflag FLAG_SYS_CTRL_OBJ_DELETE\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_WON\n\tgoto_if_eq FarawayIsland_Interior_EventScript_MewDefeated\n\tcompare VAR_RESULT, B_OUTCOME_RAN\n\tgoto_if_eq FarawayIsland_Interior_EventScript_PlayerOrMewRan\n\tcompare VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED\n\tgoto_if_eq FarawayIsland_Interior_EventScript_PlayerOrMewRan\n\tcompare VAR_RESULT, B_OUTCOME_MON_TELEPORTED\n\tgoto_if_eq FarawayIsland_Interior_EventScript_PlayerOrMewRan\n\tsetflag FLAG_FOUGHT_MEW\n\trelease\n\tend\n\nFarawayIsland_Interior_EventScript_MewDefeated::\n\tsetflag FLAG_MEW_FLEW_AWAY\n\tsetvar VAR_0x8004, SPECIES_MEW\n\tgoto EventScript_MonFlewAway\n\tend\n\nFarawayIsland_Interior_EventScript_PlayerOrMewRan::\n\tsetvar VAR_0x8004, SPECIES_MEW\n\tgoto EventScript_MonFlewAway\n\tend\n\nFarawayIsland_Interior_EventScript_FoundMewNorth::\n\tapplymovement LOCALID_MEW, FarawayIsland_Interior_Movement_MewFloatUpNorth\n\twaitmovement 0\n\treturn\n\nFarawayIsland_Interior_EventScript_FoundMewSouth::\n\tapplymovement LOCALID_MEW, FarawayIsland_Interior_Movement_MewFloatUpSouth\n\twaitmovement 0\n\treturn\n\nFarawayIsland_Interior_EventScript_FoundMewWest::\n\tapplymovement LOCALID_MEW, FarawayIsland_Interior_Movement_MewFloatUpWest\n\twaitmovement 0\n\treturn\n\nFarawayIsland_Interior_EventScript_FoundMewEast::\n\tapplymovement LOCALID_MEW, FarawayIsland_Interior_Movement_MewFloatUpEast\n\twaitmovement 0\n\treturn\n\nFarawayIsland_Interior_EventScript_HideMewWhenGrassCut::\n\tlockall\n\tfadescreenswapbuffers FADE_TO_BLACK\n\tsetflag FLAG_HIDE_MEW\n\tremoveobject LOCALID_MEW\n\tfadescreenswapbuffers FADE_FROM_BLACK\n\tmsgbox FarawayIsland_Interior_Text_TheFeelingOfBeingWatchedFaded, MSGBOX_DEFAULT\n\tclosemessage\n\treleaseall\n\tend\n\nFarawayIsland_Interior_Text_TheFeelingOfBeingWatchedFaded:\n\t.string \"The feeling of being watched faded…$\"\n\nFarawayIsland_Interior_Text_Mew:\n\t.string \"Myuu…$\"\n\t"
  },
  {
    "path": "data/maps/FarawayIsland_Interior/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/FiveIsland/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND\",\n  \"name\": \"FiveIsland\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND\",\n  \"music\": \"MUS_VERDANTURF\",\n  \"region_map_section\": \"MAPSEC_FIVE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": -48,\n      \"map\": \"MAP_FIVE_ISLAND_WATER_LABYRINTH\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 0,\n      \"map\": \"MAP_FIVE_ISLAND_MEADOW\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_EventScript_Fisher\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_EventScript_BugCatcher\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"clone\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"x\": 32,\n      \"y\": 9,\n      \"target_local_id\": 4,\n      \"target_map\": \"MAP_FIVE_ISLAND_MEADOW\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 13,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_HARBOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FIVE_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FIVE_ISLAND_HOUSE1\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FIVE_ISLAND_HOUSE2\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 20,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_EventScript_IslandSign\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland/scripts.inc",
    "content": "FiveIsland_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FiveIsland_OnTransition\n\t.byte 0\n\nFiveIsland_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_FIVE_ISLAND\n\tend\n\nFiveIsland_EventScript_IslandSign::\n\tmsgbox FiveIsland_Text_IslandSign, MSGBOX_SIGN\n\tend\n\nFiveIsland_EventScript_BugCatcher::\n\tmsgbox FiveIsland_Text_WeirdBuildingInMeadow, MSGBOX_NPC\n\tend\n\nFiveIsland_EventScript_Fisher::\n\tmsgbox FiveIsland_Text_BeenGettingBusierAroundHere, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland/text.inc",
    "content": "FiveIsland_Text_IslandSign::\n    .string \"FIVE ISLAND\\n\"\n    .string \"Chrono Island: Where Time Goes$\"\n\nFiveIsland_Text_WeirdBuildingInMeadow::\n    .string \"Oh, this stinks. I wanted to play in\\n\"\n    .string \"the MEADOW.\\p\"\n    .string \"But they put up a weird building\\n\"\n    .string \"on it, so I can't play there.$\"\n\nFiveIsland_Text_BeenGettingBusierAroundHere::\n    .string \"It's been getting busier around\\n\"\n    .string \"these parts lately.\\p\"\n    .string \"I haven't been catching many good\\n\"\n    .string \"fish lately, either.$\"\n\n"
  },
  {
    "path": "data/maps/FiveIsland_Harbor/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_HARBOR\",\n  \"name\": \"FiveIsland_Harbor\",\n  \"layout\": \"LAYOUT_ISLAND_HARBOR\",\n  \"music\": \"MUS_VERDANTURF\",\n  \"region_map_section\": \"MAPSEC_FIVE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_Harbor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_Harbor/scripts.inc",
    "content": "FiveIsland_Harbor_MapScripts::\n\t.byte 0\n\nFiveIsland_Harbor_EventScript_Sailor::\n\tlock\n\tfaceplayer\n\tmessage Text_WhereDoYouWantToSail\n\twaitmessage\n\tsetvar VAR_0x8004, SEAGALLOP_FIVE_ISLAND\n\tgoto EventScript_ChooseDestFromIsland\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland_House1/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_HOUSE1\",\n  \"name\": \"FiveIsland_House1\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_VERDANTURF\",\n  \"region_map_section\": \"MAPSEC_FIVE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_3\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_House1_EventScript_Woman\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_House1/scripts.inc",
    "content": "FiveIsland_House1_MapScripts::\n\t.byte 0\n\nFiveIsland_House1_EventScript_Woman::\n\tmsgbox FiveIsland_House1_Text_HusbandWentOffFishing, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland_House1/text.inc",
    "content": "FiveIsland_House1_Text_HusbandWentOffFishing::\n    .string \"Don't worry about buying anything\\n\"\n    .string \"for dinner tonight!\\p\"\n    .string \"…That's what my husband said when\\n\"\n    .string \"he went off fishing today.\\p\"\n    .string \"I'm not sure if I can count on him\\n\"\n    .string \"to live up to that promise.$\"\n\n"
  },
  {
    "path": "data/maps/FiveIsland_House2/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_HOUSE2\",\n  \"name\": \"FiveIsland_House2\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_VERDANTURF\",\n  \"region_map_section\": \"MAPSEC_FIVE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_House2_EventScript_OldMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_House2/scripts.inc",
    "content": "FiveIsland_House2_MapScripts::\n\t.byte 0\n\nFiveIsland_House2_EventScript_OldMan::\n\tmsgbox FiveIsland_House2_Text_MeadowBelongedToFamily, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland_House2/text.inc",
    "content": "FiveIsland_House2_Text_MeadowBelongedToFamily::\n    .string \"That MEADOW has belonged to our\\n\"\n    .string \"family for generations.\\p\"\n    .string \"I should have had a giant mansion\\n\"\n    .string \"built on it.\\p\"\n    .string \"It would be preferable to having\\n\"\n    .string \"those thugs run wild on it!$\"\n\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Entrance/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE\",\n  \"name\": \"FiveIsland_LostCave_Entrance\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ENTRANCE\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_RESORT_GORGEOUS\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Entrance/scripts.inc",
    "content": "FiveIsland_LostCave_Entrance_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FiveIsland_LostCave_Entrance_OnTransition\n\t.byte 0\n\nFiveIsland_LostCave_Entrance_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room1/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n  \"name\": \"FiveIsland_LostCave_Room1\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_RUIN_MANIAC\",\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"FiveIsland_LostCave_Room1_EventScript_Lawson\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM2\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room1/scripts.inc",
    "content": "FiveIsland_LostCave_Room1_MapScripts::\n\t.byte 0\n\nFiveIsland_LostCave_Room1_EventScript_Lawson::\n\ttrainerbattle_single TRAINER_RUIN_MANIAC_LAWSON, FiveIsland_LostCave_Room1_Text_LawsonIntro, FiveIsland_LostCave_Room1_Text_LawsonDefeat\n\tmsgbox FiveIsland_LostCave_Room1_Text_LawsonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room1/text.inc",
    "content": "FiveIsland_LostCave_Room1_Text_LawsonIntro::\n    .string \"Aiyeeeeeh!\\p\"\n    .string \"I thought this was an ancient ruin.\\n\"\n    .string \"But it's teeming with ghosts!$\"\n\nFiveIsland_LostCave_Room1_Text_LawsonDefeat::\n    .string \"Aiyeeeeeh!\\n\"\n    .string \"Mercy!$\"\n\nFiveIsland_LostCave_Room1_Text_LawsonPostBattle::\n    .string \"I'm trying to get out of here, but\\n\"\n    .string \"I always end up at the same spot.\\p\"\n    .string \"Maybe the number of boulders is\\n\"\n    .string \"a hint…$\"\n\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room10/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM10\",\n  \"name\": \"FiveIsland_LostCave_Room10\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM10\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LADY\",\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_LOST_CAVE_SELPHY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_LostCave_Room10_EventScript_ItemSilkScarf\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM10_SILK_SCARF\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room10/scripts.inc",
    "content": ".set LOCALID_SELPHY, 1\n\nFiveIsland_LostCave_Room10_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, FiveIsland_LostCave_Room10_OnResume\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, FiveIsland_LostCave_Room10_OnFrame\n\t.byte 0\n\nFiveIsland_LostCave_Room10_OnResume::\n\tcall_if_defeated TRAINER_LADY_SELPHY, FiveIsland_LostCave_Room10_EventScript_StopSelphySceneTrigger\n\tend\n\nFiveIsland_LostCave_Room10_EventScript_StopSelphySceneTrigger::\n\tsetvar VAR_MAP_SCENE_FIVE_ISLAND_LOST_CAVE_ROOM10, 1\n\treturn\n\nFiveIsland_LostCave_Room10_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_FIVE_ISLAND_LOST_CAVE_ROOM10, 0, FiveIsland_LostCave_Room10_EventScript_FindSelphyScene\n\t.2byte 0\n\nFiveIsland_LostCave_Room10_EventScript_FindSelphyScene::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tapplymovement LOCALID_SELPHY, FiveIsland_LostCave_Room10_Movement_SelphyWander\n\twaitmovement 0\n\tdelay 100\n\tapplymovement LOCALID_SELPHY, FiveIsland_LostCave_Room10_Movement_SelphyApproach\n\twaitmovement 0\n\tmsgbox FiveIsland_LostCave_Room10_Text_SelphyIntro\n\tgoto_if_questlog FiveIsland_LostCave_Room10_EventScript_SelphyQuestLog\n\ttrainerbattle_no_intro TRAINER_LADY_SELPHY, FiveIsland_LostCave_Room10_Text_SelphyDefeat\n\tmsgbox FiveIsland_LostCave_Room10_Text_MayIAskYouToTakeMeHome\n\tclosemessage\n\tcall FiveIsland_LostCave_Room10_EventScript_SetSelphyFound\n\twarp MAP_FIVE_ISLAND_RESORT_GORGEOUS, 39, 10\n\twaitstate\n\treleaseall\n\tend\n\nFiveIsland_LostCave_Room10_EventScript_SetSelphyFound::\n\tsetflag FLAG_HIDE_LOST_CAVE_SELPHY\n\tclearflag FLAG_HIDE_RESORT_GORGEOUS_SELPHY\n\tsetvar VAR_MAP_SCENE_FIVE_ISLAND_LOST_CAVE_ROOM10, 1\n\tsetvar VAR_MAP_SCENE_FIVE_ISLAND_RESORT_GORGEOUS, 1\n\treturn\n\nFiveIsland_LostCave_Room10_EventScript_SelphyQuestLog::\n\tsettrainerflag TRAINER_LADY_SELPHY\n\tcall FiveIsland_LostCave_Room10_EventScript_SetSelphyFound\n\treleaseall\n\tend\n\nFiveIsland_LostCave_Room10_Movement_SelphyWander::\n\twalk_left\n\tdelay_16\n\twalk_right\n\tdelay_16\n\twalk_in_place_faster_up\n\tdelay_16\n\twalk_in_place_faster_down\n\tstep_end\n\nFiveIsland_LostCave_Room10_Movement_SelphyApproach::\n\twalk_down\n\twalk_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room10/text.inc",
    "content": "FiveIsland_LostCave_Room10_Text_SelphyIntro::\n    .string \"W-what do you intend to do with\\n\"\n    .string \"me?$\"\n\nFiveIsland_LostCave_Room10_Text_SelphyDefeat::\n    .string \"Oh… I was afraid that you meant to\\n\"\n    .string \"harm me.$\"\n\nFiveIsland_LostCave_Room10_Text_MayIAskYouToTakeMeHome::\n    .string \"I am so glad that you happened\\n\"\n    .string \"here.\\p\"\n    .string \"I grew rather bored of walking,\\n\"\n    .string \"and I am feeling fatigued.\\p\"\n    .string \"May I ask you to take me home\\n\"\n    .string \"from here?$\"\n\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room11/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM11\",\n  \"name\": \"FiveIsland_LostCave_Room11\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM11\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_LostCave_Room11_EventScript_ItemLaxIncense\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM11_LAX_INCENSE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room11/scripts.inc",
    "content": "FiveIsland_LostCave_Room11_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room12/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM12\",\n  \"name\": \"FiveIsland_LostCave_Room12\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM12\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_LostCave_Room12_EventScript_ItemSeaIncense\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM12_SEA_INCENSE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room12/scripts.inc",
    "content": "FiveIsland_LostCave_Room12_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room13/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM13\",\n  \"name\": \"FiveIsland_LostCave_Room13\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM13\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_LostCave_Room13_EventScript_ItemMaxRevive\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM13_MAX_REVIVE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room13/scripts.inc",
    "content": "FiveIsland_LostCave_Room13_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room14/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM14\",\n  \"name\": \"FiveIsland_LostCave_Room14\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM14\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_LostCave_Room14_EventScript_ItemRareCandy\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM14_RARE_CANDY\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room14/scripts.inc",
    "content": "FiveIsland_LostCave_Room14_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room2/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM2\",\n  \"name\": \"FiveIsland_LostCave_Room2\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM2\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM3\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM11\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room2/scripts.inc",
    "content": "FiveIsland_LostCave_Room2_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room3/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM3\",\n  \"name\": \"FiveIsland_LostCave_Room3\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM3\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM4\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room3/scripts.inc",
    "content": "FiveIsland_LostCave_Room3_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room4/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM4\",\n  \"name\": \"FiveIsland_LostCave_Room4\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM4\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PSYCHIC_F\",\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"FiveIsland_LostCave_Room4_EventScript_Laura\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM12\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM5\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room4/scripts.inc",
    "content": "FiveIsland_LostCave_Room4_MapScripts::\n\t.byte 0\n\nFiveIsland_LostCave_Room4_EventScript_Laura::\n\ttrainerbattle_single TRAINER_PSYCHIC_LAURA, FiveIsland_LostCave_Room4_Text_LauraIntro, FiveIsland_LostCave_Room4_Text_LauraDefeat\n\tmsgbox FiveIsland_LostCave_Room4_Text_LauraPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room4/text.inc",
    "content": "FiveIsland_LostCave_Room4_Text_LauraIntro::\n    .string \"I think there is a mysterious power\\n\"\n    .string \"at work in this cave.$\"\n\nFiveIsland_LostCave_Room4_Text_LauraDefeat::\n    .string \"If you don't go into the right\\n\"\n    .string \"tunnel, you won't get ahead.$\"\n\nFiveIsland_LostCave_Room4_Text_LauraPostBattle::\n    .string \"Earlier, a lady went into the caves\\n\"\n    .string \"ahead.$\"\n\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room5/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM5\",\n  \"name\": \"FiveIsland_LostCave_Room5\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM5\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM6\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room5/scripts.inc",
    "content": "FiveIsland_LostCave_Room5_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room6/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM6\",\n  \"name\": \"FiveIsland_LostCave_Room6\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM6\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM13\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM7\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room6/scripts.inc",
    "content": "FiveIsland_LostCave_Room6_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room7/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM7\",\n  \"name\": \"FiveIsland_LostCave_Room7\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM7\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM8\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room7/scripts.inc",
    "content": "FiveIsland_LostCave_Room7_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room8/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM8\",\n  \"name\": \"FiveIsland_LostCave_Room8\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM8\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM9\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM14\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room8/scripts.inc",
    "content": "FiveIsland_LostCave_Room8_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room9/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM9\",\n  \"name\": \"FiveIsland_LostCave_Room9\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM9\",\n  \"music\": \"MUS_MT_PYRE_EXTERIOR\",\n  \"region_map_section\": \"MAPSEC_LOST_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM10\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ROOM1\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_LostCave_Room9/scripts.inc",
    "content": "FiveIsland_LostCave_Room9_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FiveIsland_Meadow/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_MEADOW\",\n  \"name\": \"FiveIsland_Meadow\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_MEADOW\",\n  \"music\": \"MUS_ROUTE122\",\n  \"region_map_section\": \"MAPSEC_FIVE_ISLE_MEADOW\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": 0,\n      \"map\": \"MAP_FIVE_ISLAND\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 20,\n      \"map\": \"MAP_FIVE_ISLAND_MEMORIAL_PILLAR\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_F\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"FiveIsland_Meadow_EventScript_Rocket3\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"FiveIsland_Meadow_EventScript_Rocket1\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"FiveIsland_Meadow_EventScript_Rocket2\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_FIVE_ISLE_MEADOW_CUT_TREE_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_FIVE_ISLE_MEADOW_CUT_TREE_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_Meadow_EventScript_ItemMaxPotion\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_MEADOW_MAX_POTION\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_Meadow_EventScript_ItemPPUp\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_MEADOW_PP_UP\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 12,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FIVE_ISLAND_ROCKET_WAREHOUSE\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_Meadow_EventScript_WarehouseDoor\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_Meadow/scripts.inc",
    "content": "FiveIsland_Meadow_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, FiveIsland_Meadow_OnLoad\n\t.byte 0\n\nFiveIsland_Meadow_OnLoad::\n\tcall_if_set FLAG_UNLOCKED_ROCKET_WAREHOUSE, FiveIsland_Meadow_EventScript_SetWarehouseDoorUnlocked\n\tend\n\nFiveIsland_Meadow_EventScript_WarehouseDoor::\n\tlockall\n\tgoto_if_set FLAG_UNLOCKED_ROCKET_WAREHOUSE, FiveIsland_Meadow_EventScript_WarehouseDoorAlreadyOpen\n\tgoto_if_set FLAG_LEARNED_YES_NAH_CHANSEY, FiveIsland_Meadow_EventScript_OpenWarehouseDoor\n\tmsgbox FiveIsland_Meadow_Text_EnteredPasswordAnotherNeeded\n\treleaseall\n\tend\n\nFiveIsland_Meadow_EventScript_OpenWarehouseDoor::\n\tsetflag FLAG_UNLOCKED_ROCKET_WAREHOUSE\n\tmessage FiveIsland_Meadow_Text_EnteredPasswordDoorOpened\n\twaitmessage\n\tdelay 60\n\tcall FiveIsland_Meadow_EventScript_SetWarehouseDoorUnlocked\n\tspecial DrawWholeMapView\n\tplayse SE_PIN\n\twaitse\n\treleaseall\n\tend\n\nFiveIsland_Meadow_EventScript_WarehouseDoorAlreadyOpen::\n\tmsgbox FiveIsland_Meadow_Text_WarehouseDoorAlreadyOpen\n\treleaseall\n\tend\n\nFiveIsland_Meadow_EventScript_SetWarehouseDoorUnlocked::\n\tsetmetatile 12, 21, METATILE_SeviiIslands45_RocketWarehouseDoor_Unlocked, 1\n\treturn\n\nFiveIsland_Meadow_EventScript_Rocket1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_49, FiveIsland_Meadow_Text_Rocket1Intro, FiveIsland_Meadow_Text_Rocket1Defeat\n\tmsgbox FiveIsland_Meadow_Text_Rocket1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_Meadow_EventScript_Rocket2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_50, FiveIsland_Meadow_Text_Rocket2Intro, FiveIsland_Meadow_Text_Rocket2Defeat\n\tmsgbox FiveIsland_Meadow_Text_Rocket2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_Meadow_EventScript_Rocket3::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_51, FiveIsland_Meadow_Text_Rocket3Intro, FiveIsland_Meadow_Text_Rocket3Defeat\n\tmsgbox FiveIsland_Meadow_Text_Rocket3PostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland_Meadow/text.inc",
    "content": "FiveIsland_Meadow_Text_EnteredPasswordAnotherNeeded::\n    .string \"{PLAYER} entered a password.\\p\"\n    .string \"“GOLDEEN need log.”\\p\"\n    .string \"… …  … …  … …\\p\"\n    .string \"Another password is needed to\\n\"\n    .string \"open the door…$\"\n\nFiveIsland_Meadow_Text_EnteredPasswordDoorOpened::\n    .string \"{PLAYER} entered two passwords.\\p\"\n    .string \"“GOLDEEN need log.”\\n\"\n    .string \"“Yes, nah, CHANSEY.”\\p\"\n    .string \"… …  … …  … …\\p\"\n    .string \"The WAREHOUSE's door opened!$\"\n\nFiveIsland_Meadow_Text_WarehouseDoorAlreadyOpen::\n    .string \"The WAREHOUSE's door is already\\n\"\n    .string \"open.$\"\n\nFiveIsland_Meadow_Text_Rocket1Intro::\n    .string \"This area's strictly off-limits!\\n\"\n    .string \"Out, out!$\"\n\nFiveIsland_Meadow_Text_Rocket1Defeat::\n    .string \"Is this for real?$\"\n\nFiveIsland_Meadow_Text_Rocket1PostBattle::\n    .string \"You don't have any business here!\\n\"\n    .string \"Go home!$\"\n\nFiveIsland_Meadow_Text_Rocket2Intro::\n    .string \"There's nothing past here except\\n\"\n    .string \"our WAREHOUSE.\\p\"\n    .string \"So what brings you here?$\"\n\nFiveIsland_Meadow_Text_Rocket2Defeat::\n    .string \"That wasn't supposed to happen…$\"\n\nFiveIsland_Meadow_Text_Rocket2PostBattle::\n    .string \"You're wanting to know what's inside\\n\"\n    .string \"this WAREHOUSE?\\p\"\n    .string \"It's better you didn't know.\\n\"\n    .string \"For your own sake, I mean.$\"\n\nFiveIsland_Meadow_Text_Rocket3Intro::\n    .string \"You'd be wasting time even if you\\n\"\n    .string \"were to get by me.$\"\n\nFiveIsland_Meadow_Text_Rocket3Defeat::\n    .string \"Oh, that makes me furious!$\"\n\nFiveIsland_Meadow_Text_Rocket3PostBattle::\n    .string \"You won't be able to get in without\\n\"\n    .string \"the passwords anyway.$\"\n\n"
  },
  {
    "path": "data/maps/FiveIsland_MemorialPillar/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_MEMORIAL_PILLAR\",\n  \"name\": \"FiveIsland_MemorialPillar\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_MEMORIAL_PILLAR\",\n  \"music\": \"MUS_ROUTE122\",\n  \"region_map_section\": \"MAPSEC_MEMORIAL_PILLAR\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": -20,\n      \"map\": \"MAP_FIVE_ISLAND_MEADOW\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 44,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_MemorialPillar_EventScript_MemorialMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 12,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"FiveIsland_MemorialPillar_EventScript_Milo\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 14,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"FiveIsland_MemorialPillar_EventScript_Chaz\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 18,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"FiveIsland_MemorialPillar_EventScript_Harold\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 47,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_MemorialPillar_EventScript_ItemMetalCoat\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_MEMORIAL_PILLAR_METAL_COAT\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 43,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"FiveIsland_MemorialPillar_EventScript_Memorial\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 8,\n      \"y\": 52,\n      \"elevation\": 3,\n      \"item\": \"ITEM_BIG_PEARL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_BIG_PEARL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 15,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"item\": \"ITEM_POMEG_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_POMEG_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 17,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"item\": \"ITEM_SITRUS_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_SITRUS_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 14,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"item\": \"ITEM_KELPSY_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_KELPSY_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_MemorialPillar/scripts.inc",
    "content": ".set LOCALID_MEMORIAL_MAN, 1\n\nFiveIsland_MemorialPillar_MapScripts::\n\t.byte 0\n\nFiveIsland_MemorialPillar_EventScript_MemorialMan::\n\tlock\n\tgoto_if_set FLAG_GOT_TM42_AT_MEMORIAL_PILLAR, FiveIsland_MemorialPillar_EventScript_AlreadyGotTM42\n\tgoto_if_set FLAG_NO_ROOM_FOR_TM42_AT_MEMORIAL_PILLAR, FiveIsland_MemorialPillar_EventScript_ReturnedForTM42\n\tmsgbox FiveIsland_MemorialPillar_Text_ScrubScrub\n\tclosemessage\n\tapplymovement LOCALID_MEMORIAL_MAN, Common_Movement_FacePlayer\n\twaitmovement 0\n\tdelay 45\n\tmsgbox FiveIsland_MemorialPillar_Text_YourMonsLookHealthy\n\tapplymovement LOCALID_MEMORIAL_MAN, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tmsgbox FiveIsland_MemorialPillar_Text_ThisIsWhereIBuriedMyOnix\n\trelease\n\tend\n\nFiveIsland_MemorialPillar_EventScript_AlreadyGotTM42::\n\tmsgbox FiveIsland_MemorialPillar_Text_ScrubScrubTectonix\n\trelease\n\tend\n\nFiveIsland_MemorialPillar_EventScript_ReturnedForTM42::\n\tmsgbox FiveIsland_MemorialPillar_Text_StillHaveThingAsMyThanks\n\tgiveitem ITEM_TM42\n\tgoto_if_eq VAR_RESULT, FALSE, FiveIsland_MemorialPillar_EventScript_NoRoomForTM42\n\tcall FiveIsland_MemorialPillar_EventScript_ReceivedTM42\n\trelease\n\tend\n\nFiveIsland_MemorialPillar_EventScript_Memorial::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlockall\n\tgoto_if_set FLAG_GOT_TM42_AT_MEMORIAL_PILLAR, FiveIsland_MemorialPillar_EventScript_MemorialLemonadeAlreadyPlaced\n\tgoto_if_set FLAG_NO_ROOM_FOR_TM42_AT_MEMORIAL_PILLAR, FiveIsland_MemorialPillar_EventScript_MemorialLemonadeAlreadyPlaced\n\tmsgbox FiveIsland_MemorialPillar_Text_HereLiesTectonixLemonadeOffering\n\tcheckitem ITEM_LEMONADE\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_MemorialPillar_EventScript_AskPlaceLemonade\n\treleaseall\n\tend\n\nFiveIsland_MemorialPillar_EventScript_AskPlaceLemonade::\n\tmsgbox FiveIsland_MemorialPillar_Text_LeaveAnotherLemonadeOffering, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FiveIsland_MemorialPillar_EventScript_PlaceLemonade\n\treleaseall\n\tend\n\nFiveIsland_MemorialPillar_EventScript_PlaceLemonade::\n\tremoveitem ITEM_LEMONADE\n\tmsgbox FiveIsland_MemorialPillar_Text_PlacedCanOfLemonade\n\tclosemessage\n\tapplymovement LOCALID_MEMORIAL_MAN, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tdelay 45\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox FiveIsland_MemorialPillar_Text_ThankYouPleaseTakeThis\n\tgiveitem ITEM_TM42\n\tgoto_if_eq VAR_RESULT, FALSE, FiveIsland_MemorialPillar_EventScript_NoRoomForTM42\n\tcall FiveIsland_MemorialPillar_EventScript_ReceivedTM42\n\treleaseall\n\tend\n\nFiveIsland_MemorialPillar_EventScript_ReceivedTM42::\n\tmsgbox FiveIsland_MemorialPillar_Text_BeGoodToYourMonsToo\n\tapplymovement LOCALID_MEMORIAL_MAN, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tsetflag FLAG_GOT_TM42_AT_MEMORIAL_PILLAR\n\treturn\n\nFiveIsland_MemorialPillar_EventScript_NoRoomForTM42::\n\tsetflag FLAG_NO_ROOM_FOR_TM42_AT_MEMORIAL_PILLAR\n\tmsgbox FiveIsland_MemorialPillar_Text_DontHaveRoomForIt\n\treleaseall\n\tend\n\nFiveIsland_MemorialPillar_EventScript_MemorialLemonadeAlreadyPlaced::\n\tmsgbox FiveIsland_MemorialPillar_Text_HereLiesTectonix\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland_MemorialPillar/text.inc",
    "content": "FiveIsland_MemorialPillar_Text_MiloIntro::\n    .string \"I'm the eldest of the BIRD\\n\"\n    .string \"BROTHERS.\\p\"\n    .string \"The best thing about birds…\\n\"\n    .string \"It has to be the beak.$\"\n\nFiveIsland_MemorialPillar_Text_MiloDefeat::\n    .string \"Oh, so sharp!$\"\n\nFiveIsland_MemorialPillar_Text_MiloPostBattle::\n    .string \"You can fly to FOUR ISLAND from\\n\"\n    .string \"here.$\"\n\nFiveIsland_MemorialPillar_Text_ChazIntro::\n    .string \"I'm the middle kid of the BIRD\\n\"\n    .string \"BROTHERS.\\p\"\n    .string \"The best thing about birds…\\n\"\n    .string \"It has to be the wings.$\"\n\nFiveIsland_MemorialPillar_Text_ChazDefeat::\n    .string \"Flap, flap!$\"\n\nFiveIsland_MemorialPillar_Text_ChazPostBattle::\n    .string \"There was a really somber guy\\n\"\n    .string \"over that way.$\"\n\nFiveIsland_MemorialPillar_Text_HaroldIntro::\n    .string \"I'm the youngest of the BIRD\\n\"\n    .string \"BROTHERS.\\p\"\n    .string \"The best thing about birds…\\n\"\n    .string \"It has to be the down.$\"\n\nFiveIsland_MemorialPillar_Text_HaroldDefeat::\n    .string \"Down is so comfy…\\n\"\n    .string \"It makes me drowsy…$\"\n\nFiveIsland_MemorialPillar_Text_HaroldPostBattle::\n    .string \"It fills me with happiness when\\n\"\n    .string \"bird POKéMON beg playfully…$\"\n\nFiveIsland_MemorialPillar_Text_ScrubScrub::\n    .string \"Scrub, scrub…$\"\n\nFiveIsland_MemorialPillar_Text_YourMonsLookHealthy::\n    .string \"Hello…\\n\"\n    .string \"Your POKéMON look healthy…$\"\n\nFiveIsland_MemorialPillar_Text_ThisIsWhereIBuriedMyOnix::\n    .string \"This is where I buried my ONIX…\\n\"\n    .string \"It was named TECTONIX…$\"\n\nFiveIsland_MemorialPillar_Text_HereLiesTectonixLemonadeOffering::\n    .string \"“Here lies TECTONIX” is engraved\\n\"\n    .string \"on a boulder.\\p\"\n    .string \"There is a LEMONADE placed as an\\n\"\n    .string \"offering in front of the grave.$\"\n\nFiveIsland_MemorialPillar_Text_LeaveAnotherLemonadeOffering::\n    .string \"Would you like to leave another\\n\"\n    .string \"LEMONADE as an offering?$\"\n\nFiveIsland_MemorialPillar_Text_PlacedCanOfLemonade::\n    .string \"{PLAYER} placed a can of LEMONADE\\n\"\n    .string \"in front of the grave.$\"\n\nFiveIsland_MemorialPillar_Text_ThankYouPleaseTakeThis::\n    .string \"Th-thank you…\\p\"\n    .string \"That was my TECTONIX's favorite\\n\"\n    .string \"drink…\\p\"\n    .string \"I don't even know you, but your\\n\"\n    .string \"act of kindness…\\p\"\n    .string \"It's uplifted me a little.\\p\"\n    .string \"Can you please take this as my\\n\"\n    .string \"thanks?$\"\n\nFiveIsland_MemorialPillar_Text_BeGoodToYourMonsToo::\n    .string \"Please be good to your POKéMON,\\n\"\n    .string \"too.$\"\n\nFiveIsland_MemorialPillar_Text_DontHaveRoomForIt::\n    .string \"If you don't have room for it,\\n\"\n    .string \"I'll hold it for you till next time.$\"\n\nFiveIsland_MemorialPillar_Text_StillHaveThingAsMyThanks::\n    .string \"Oh, it's you from that time…\\p\"\n    .string \"I still have that thing I wanted\\n\"\n    .string \"you to have as my thanks.$\"\n\nFiveIsland_MemorialPillar_Text_ScrubScrubTectonix::\n    .string \"Scrub, scrub…\\p\"\n    .string \"… … …\\n\"\n    .string \"TECTONIX…$\"\n\nFiveIsland_MemorialPillar_Text_HereLiesTectonix::\n    .string \"Boulders and rocks are neatly piled\\n\"\n    .string \"up as a cairn.\\p\"\n    .string \"“Here lies TECTONIX” is engraved\\n\"\n    .string \"on a boulder.$\"\n\n"
  },
  {
    "path": "data/maps/FiveIsland_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_POKEMON_CENTER_1F\",\n  \"name\": \"FiveIsland_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_FIVE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_PokemonCenter_1F_EventScript_CooltrainerF\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHEF\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_PokemonCenter_1F_EventScript_Chef\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_PokemonCenter_1F_EventScript_PokemonJournal\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_PokemonCenter_1F_EventScript_PokemonJournal\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_FIVE_ISLAND_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_PokemonCenter_1F/scripts.inc",
    "content": "FiveIsland_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FiveIsland_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nFiveIsland_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_FIVE_ISLAND\n\tend\n\nFiveIsland_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nFiveIsland_PokemonCenter_1F_EventScript_Chef::\n\tmsgbox FiveIsland_PokemonCenter_1F_Text_OnMyWayToPrepareMeal, MSGBOX_NPC\n\tend\n\nFiveIsland_PokemonCenter_1F_EventScript_CooltrainerF::\n\tmsgbox FiveIsland_PokemonCenter_1F_Text_YoureOnQuestToCatchEveryMon, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland_PokemonCenter_1F/text.inc",
    "content": "FiveIsland_PokemonCenter_1F_Text_OnMyWayToPrepareMeal::\n    .string \"I'm on my way to prepare a meal\\n\"\n    .string \"for a certain high-society person.$\"\n\nFiveIsland_PokemonCenter_1F_Text_YoureOnQuestToCatchEveryMon::\n    .string \"You're on a quest to catch every\\n\"\n    .string \"single kind of POKéMON?\\p\"\n    .string \"…How incredible. Please tell me if\\n\"\n    .string \"you catch a strong one!$\"\n\n"
  },
  {
    "path": "data/maps/FiveIsland_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_POKEMON_CENTER_2F\",\n  \"name\": \"FiveIsland_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_FIVE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_FIVE_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_PokemonCenter_2F/scripts.inc",
    "content": "FiveIsland_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nFiveIsland_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nFiveIsland_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nFiveIsland_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland_ResortGorgeous/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_RESORT_GORGEOUS\",\n  \"name\": \"FiveIsland_ResortGorgeous\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_RESORT_GORGEOUS\",\n  \"music\": \"MUS_ROUTE122\",\n  \"region_map_section\": \"MAPSEC_RESORT_GORGEOUS\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": -48,\n      \"map\": \"MAP_FIVE_ISLAND_WATER_LABYRINTH\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PAINTER\",\n      \"x\": 44,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"FiveIsland_ResortGorgeous_EventScript_Daisy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PAINTER\",\n      \"x\": 33,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"FiveIsland_ResortGorgeous_EventScript_Celina\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PAINTER\",\n      \"x\": 12,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"FiveIsland_ResortGorgeous_EventScript_Rayna\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LADY\",\n      \"x\": 23,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"FiveIsland_ResortGorgeous_EventScript_Jacki\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LADY\",\n      \"x\": 33,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"FiveIsland_ResortGorgeous_EventScript_Gillian\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT\",\n      \"movement_range_x\": 10,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"FiveIsland_ResortGorgeous_EventScript_Destin\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 56,\n      \"y\": 7,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"FiveIsland_ResortGorgeous_EventScript_Toby\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LADY\",\n      \"x\": 39,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_RESORT_GORGEOUS_SELPHY\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 64,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 39,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FIVE_ISLAND_RESORT_GORGEOUS_HOUSE\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 10,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NEST_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_NEST_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 27,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"item\": \"ITEM_STARDUST\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STARDUST\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 40,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"item\": \"ITEM_STAR_PIECE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STAR_PIECE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 27,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_STARDUST\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STARDUST_2\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 42,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_ResortGorgeous_EventScript_SelphysHouseSign\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_ResortGorgeous/scripts.inc",
    "content": ".equ LOCALID_SELPHY, 8\n\nFiveIsland_ResortGorgeous_MapScripts::\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, FiveIsland_ResortGorgeous_OnWarp\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, FiveIsland_ResortGorgeous_OnFrame\n\t.byte 0\n\nFiveIsland_ResortGorgeous_OnWarp::\n\tmap_script_2 VAR_MAP_SCENE_FIVE_ISLAND_RESORT_GORGEOUS, 1, FiveIsland_ResortGorgeous_EventScript_TurnPlayerNorth\n\t.2byte 0\n\nFiveIsland_ResortGorgeous_EventScript_TurnPlayerNorth::\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH\n\tend\n\nFiveIsland_ResortGorgeous_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_FIVE_ISLAND_RESORT_GORGEOUS, 1, FiveIsland_ResortGorgeous_EventScript_SelphyReturnHomeScene\n\t.2byte 0\n\nFiveIsland_ResortGorgeous_EventScript_SelphyReturnHomeScene::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox FiveIsland_ResortGorgeous_Text_SelphyThanksYouMayGoNow\n\tclosemessage\n\tapplymovement LOCALID_SELPHY, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\topendoor 39, 8\n\twaitdooranim\n\tapplymovement LOCALID_SELPHY, FiveIsland_ResortGorgeous_Movement_SelphyEnterHome\n\twaitmovement 0\n\tclosedoor 39, 8\n\twaitdooranim\n\tremoveobject LOCALID_SELPHY\n\tclearflag FLAG_HIDE_RESORT_GORGEOUS_INSIDE_SELPHY\n\tsetvar VAR_MAP_SCENE_FIVE_ISLAND_RESORT_GORGEOUS, 2\n\treleaseall\n\tend\n\nFiveIsland_ResortGorgeous_Movement_SelphyEnterHome::\n\twalk_up\n\tset_invisible\n\tstep_end\n\nFiveIsland_ResortGorgeous_EventScript_SelphysHouseSign::\n\tmsgbox FiveIsland_ResortGorgeous_Text_SelphysHouse, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland_ResortGorgeous/text.inc",
    "content": "FiveIsland_ResortGorgeous_Text_DaisyIntro::\n    .string \"With these hands, I will create\\n\"\n    .string \"my victory!$\"\n\nFiveIsland_ResortGorgeous_Text_DaisyDefeat::\n    .string \"The shame of this…\\n\"\n    .string \"I'm red-faced…$\"\n\nFiveIsland_ResortGorgeous_Text_DaisyPostBattle::\n    .string \"Uh-oh, my paint tubes have\\n\"\n    .string \"scattered everywhere!$\"\n\nFiveIsland_ResortGorgeous_Text_CelinaIntro::\n    .string \"Excuse me!\\n\"\n    .string \"I'm trying to paint.\\l\"\n    .string \"Please keep out of my sight!$\"\n\nFiveIsland_ResortGorgeous_Text_CelinaDefeat::\n    .string \"This loss…\\n\"\n    .string \"I feel like I'm whiting out…$\"\n\nFiveIsland_ResortGorgeous_Text_CelinaPostBattle::\n    .string \"GILLIAN?\\n\"\n    .string \"Please tilt your head slightly…\\l\"\n    .string \"There! That's the look I want!$\"\n\nFiveIsland_ResortGorgeous_Text_RaynaIntro::\n    .string \"Hmm…\\n\"\n    .string \"The angle, it is not quite there…$\"\n\nFiveIsland_ResortGorgeous_Text_RaynaDefeat::\n    .string \"Oh…\\n\"\n    .string \"My feelings, they are blue…$\"\n\nFiveIsland_ResortGorgeous_Text_RaynaPostBattle::\n    .string \"The sky and the sea…\\n\"\n    .string \"They are so fickle.\\p\"\n    .string \"Their changing expressions make\\n\"\n    .string \"them difficult to capture.$\"\n\nFiveIsland_ResortGorgeous_Text_JackiIntro::\n    .string \"I am visiting my friend's retreat,\\n\"\n    .string \"if you must know.$\"\n\nFiveIsland_ResortGorgeous_Text_JackiDefeat::\n    .string \"Oh, my, so strong.$\"\n\nFiveIsland_ResortGorgeous_Text_JackiPostBattle::\n    .string \"I find it pleasurable to leisurely\\n\"\n    .string \"battle in the gentle sea breeze.$\"\n\nFiveIsland_ResortGorgeous_Text_GillianIntro::\n    .string \"I'm thinking of having a pool\\n\"\n    .string \"made specially for POKéMON.$\"\n\nFiveIsland_ResortGorgeous_Text_GillianDefeat::\n    .string \"Oh, my goodness gracious!$\"\n\nFiveIsland_ResortGorgeous_Text_GillianPostBattle::\n    .string \"A pool would be nice, but I must\\n\"\n    .string \"say, a sun-room may be sublime.$\"\n\nFiveIsland_ResortGorgeous_Text_DestinIntro::\n    .string \"I'm a good runner.\\n\"\n    .string \"I'm really fast!$\"\n\nFiveIsland_ResortGorgeous_Text_DestinDefeat::\n    .string \"Oops!\\n\"\n    .string \"I rushed things!$\"\n\nFiveIsland_ResortGorgeous_Text_DestinPostBattle::\n    .string \"When I run with the wind, it feels\\n\"\n    .string \"like I could fly!$\"\n\nFiveIsland_ResortGorgeous_Text_TobyIntro::\n    .string \"I say, this marine life here at\\n\"\n    .string \"this resort agrees with me.$\"\n\nFiveIsland_ResortGorgeous_Text_TobyDefeat::\n    .string \"That's a shocker!\\n\"\n    .string \"You must be joking.$\"\n\nFiveIsland_ResortGorgeous_Text_TobyPostBattle::\n    .string \"Getting so serious over this…\\n\"\n    .string \"How nonsensical.$\"\n\nFiveIsland_ResortGorgeous_Text_SelphyThanksYouMayGoNow::\n    .string \"SELPHY: Thank you.\\p\"\n    .string \"You may go now.$\"\n\nFiveIsland_ResortGorgeous_Text_SelphysHouse::\n    .string \"SELPHY'S HOUSE$\"\n\n"
  },
  {
    "path": "data/maps/FiveIsland_ResortGorgeous_House/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_RESORT_GORGEOUS_HOUSE\",\n  \"name\": \"FiveIsland_ResortGorgeous_House\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_RESORT_GORGEOUS_HOUSE\",\n  \"music\": \"MUS_VERDANTURF\",\n  \"region_map_section\": \"MAPSEC_RESORT_GORGEOUS\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LADY\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_ResortGorgeous_House_EventScript_Selphy\",\n      \"flag\": \"FLAG_HIDE_RESORT_GORGEOUS_INSIDE_SELPHY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_ResortGorgeous_House_EventScript_Butler\",\n      \"flag\": \"FLAG_HIDE_SELPHYS_BUTLER\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_RESORT_GORGEOUS\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"FiveIsland_ResortGorgeous_House_EventScript_PokemonJournal\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"FiveIsland_ResortGorgeous_House_EventScript_PokemonJournal\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_ResortGorgeous_House_EventScript_Painting\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_ResortGorgeous_House_EventScript_Painting\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_ResortGorgeous_House/scripts.inc",
    "content": ".equ LOCALID_SELPHY, 1\n.equ LOCALID_BUTLER, 2\n\n.equ SHOWN_REQUESTED_MON, FLAG_TEMP_2\n.equ MAPSEC_FOUR_ISLAND, 0x92\n\nFiveIsland_ResortGorgeous_House_MapScripts::\n\t.byte 0\n\nFiveIsland_ResortGorgeous_House_EventScript_Selphy::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tgoto_if_set SHOWN_REQUESTED_MON, FiveIsland_ResortGorgeous_House_EventScript_JustFulfilledRequest\n\tgoto_if_eq VAR_RESORT_GORGEOUS_REQUESTED_MON, 0xFFFF, FiveIsland_ResortGorgeous_House_EventScript_RequestTookTooLong\n\tgoto_if_ne VAR_RESORT_GORGEOUS_REQUESTED_MON, SPECIES_NONE, FiveIsland_ResortGorgeous_House_EventScript_CheckForRequestedMon\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_PleaseHearMyWish\n\tgoto FiveIsland_ResortGorgeous_House_EventScript_RequestMon\n\tend\n\nFiveIsland_ResortGorgeous_House_EventScript_RequestMon::\n\tspecial SampleResortGorgeousMonAndReward\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_WishToSeeMonPlease\n\trelease\n\tend\n\nFiveIsland_ResortGorgeous_House_EventScript_RequestTookTooLong::\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_OhImTiredOfWaiting\n\tgoto FiveIsland_ResortGorgeous_House_EventScript_RequestMon\n\tend\n\nFiveIsland_ResortGorgeous_House_EventScript_CheckForRequestedMon::\n\tcopyvar VAR_0x8004, VAR_RESORT_GORGEOUS_REQUESTED_MON\n\tspecialvar VAR_RESULT, DoesPlayerPartyContainSpecies\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_House_EventScript_ShowRequestedMon\n\tgoto FiveIsland_ResortGorgeous_House_EventScript_RequestMon\n\tend\n\nFiveIsland_ResortGorgeous_House_EventScript_ShowRequestedMon::\n\tspecial SampleResortGorgeousMonAndReward\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_MonYouCaughtForMeThankYou\n\taddobject LOCALID_BUTLER\n\tapplymovement LOCALID_BUTLER, FiveIsland_ResortGorgeous_House_Movement_ButlerEnter\n\twaitmovement 0\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_ButlerYesMyLady\n\tapplymovement LOCALID_SELPHY, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_SelphyGiveTokenOfAppreciation\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_ButlerIShallDoAsYouBid\n\tclosemessage\n\tcall_if_eq VAR_FACING, DIR_NORTH, FiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, FiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, FiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerEast\n\tcall_if_eq VAR_FACING, DIR_WEST, FiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerWest\n\tcopyobjectxytoperm LOCALID_BUTLER\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_ButlerPleaseAcceptThisAsHerThanks\n\tgoto_if_unset FLAG_GIVEN_CORSOLA_EGG, FiveIsland_ResortGorgeous_House_EventScript_FirstReward\n\tgiveitem VAR_RESORT_GORGEOUS_REWARD\n\tgoto_if_eq VAR_RESULT, FALSE, FiveIsland_ResortGorgeous_House_EventScript_NoRoomForReward\n\tsetflag SHOWN_REQUESTED_MON\n\tsetvar VAR_RESORT_GORGEOUS_REQUESTED_MON, SPECIES_NONE\n\trelease\n\tend\n\nFiveIsland_ResortGorgeous_House_EventScript_FirstReward::\n\tspecialvar VAR_RESULT, CalculatePlayerPartyCount\n\tgoto_if_eq VAR_RESULT, 6, FiveIsland_ResortGorgeous_House_EventScript_NoRoomForEgg\n\tplayfanfare MUS_LEVEL_UP\n\ttextcolor 3\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_ObtainedTheEgg\n\twaitmessage\n\twaitfanfare\n\tclosemessage\n\tcallnative GiveSelphyCorsolaEgg\n\tspecialvar VAR_RESULT, CalculatePlayerPartyCount\n\tsubvar VAR_RESULT, 1\n\tsetmonmetlocation VAR_RESULT, MAPSEC_FOUR_ISLAND\n\tsetflag SHOWN_REQUESTED_MON\n\tsetflag FLAG_GIVEN_CORSOLA_EGG\n\tsetvar VAR_RESORT_GORGEOUS_REQUESTED_MON, SPECIES_NONE\n\trelease\n\tend\n\nFiveIsland_ResortGorgeous_House_Text_ObtainedTheEgg::\n\t.string \"{PLAYER} received the EGG from\\n\"\n\t.string \"SEBASTIAN.$\"\n\nFiveIsland_ResortGorgeous_House_EventScript_NoRoomForEgg::\n\ttextcolor 0\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_ButlerPartyAppearsToBeFull\n\ttextcolor 1\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_OhHowDisappointing\n\tsetflag SHOWN_REQUESTED_MON\n\tsetvar VAR_RESORT_GORGEOUS_REQUESTED_MON, SPECIES_NONE\n\trelease\n\tend\n\nFiveIsland_ResortGorgeous_House_Text_ButlerPartyAppearsToBeFull::\n    .string \"Butler: Your party appears to be\\n\"\n    .string \"unfortunately full.$\"\n\nFiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerNorth::\n\tapplymovement LOCALID_SELPHY, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement LOCALID_BUTLER, FiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerNorth\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treturn\n\nFiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerSouth::\n\tapplymovement LOCALID_BUTLER, FiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerSouth\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\treturn\n\nFiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerEast::\n\tapplymovement LOCALID_SELPHY, Common_Movement_WalkInPlaceFasterLeft\n\tapplymovement LOCALID_BUTLER, FiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerEast\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\treturn\n\nFiveIsland_ResortGorgeous_House_EventScript_ButlerApproachPlayerWest::\n\tapplymovement LOCALID_BUTLER, FiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerWest\n\twaitmovement 0\n\treturn\n\nFiveIsland_ResortGorgeous_House_EventScript_NoRoomForReward::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_ButlerBagAppearsToBeFull\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_OhHowDisappointing\n\tsetflag SHOWN_REQUESTED_MON\n\tsetvar VAR_RESORT_GORGEOUS_REQUESTED_MON, SPECIES_NONE\n\trelease\n\tend\n\nFiveIsland_ResortGorgeous_House_EventScript_JustFulfilledRequest::\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_SelphyWishYouBestOfLuck\n\trelease\n\tend\n\nFiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerNorth::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_in_place_faster_right\n\tstep_end\n\nFiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerSouth::\n\twalk_left\n\twalk_left\n\twalk_in_place_faster_down\n\tstep_end\n\nFiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerEast::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\tstep_end\n\n@ Very odd. If the player is talking to Selphy facing West, then the player has clipped through the table\n@ In this case rather than approach the player the Butler walks up, which clips the Butler into a wall\nFiveIsland_ResortGorgeous_House_Movement_ButlerApproachPlayerWest::\n\twalk_up\n\tstep_end\n\nFiveIsland_ResortGorgeous_House_Movement_ButlerEnter::\n\twalk_in_place_down\n\tstep_end\n\n@ Addressed as \"Sebastian\" but speaks only as \"Butler\"\nFiveIsland_ResortGorgeous_House_EventScript_Butler::\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_LadySelphySmileHasBrillianceOfSun, MSGBOX_NPC\n\tend\n\nFiveIsland_ResortGorgeous_House_EventScript_Painting::\n\tgoto_if_unset FLAG_HIDE_RESORT_GORGEOUS_INSIDE_SELPHY, FiveIsland_ResortGorgeous_House_EventScript_PaintingSelphy\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_WomanWithCorsola, MSGBOX_SIGN\n\tend\n\nFiveIsland_ResortGorgeous_House_EventScript_PaintingSelphy::\n\tmsgbox FiveIsland_ResortGorgeous_House_Text_SelphyWithCorsola, MSGBOX_SIGN\n\tend\n\nFiveIsland_ResortGorgeous_House_Text_WomanWithCorsola::\n\t.string \"It's a photo of a woman relaxing\\n\"\n\t.string \"at a resort surrounded by many\\l\"\n\t.string \"pink, coral POKéMON.$\"\n\nFiveIsland_ResortGorgeous_House_Text_SelphyWithCorsola::\n\t.string \"It's a photo of SELPHY relaxing\\n\"\n\t.string \"at a resort surrounded by many\\l\"\n\t.string \"pink, coral POKéMON.$\"\n"
  },
  {
    "path": "data/maps/FiveIsland_ResortGorgeous_House/text.inc",
    "content": "FiveIsland_ResortGorgeous_House_Text_PleaseHearMyWish::\n    .string \"SELPHY: Oh?\\n\"\n    .string \"Do I know you from somewhere?\\p\"\n    .string \"Oh, but that doesn't matter.\\p\"\n    .string \"I am exquisitely bored.\\n\"\n    .string \"Please, hear my wish.$\"\n\nFiveIsland_ResortGorgeous_House_Text_WishToSeeMonPlease::\n    .string \"I wish to see a POKéMON.\\n\"\n    .string \"A darling {STR_VAR_1}.\\p\"\n    .string \"I want to see one right away.\\n\"\n    .string \"Please, make my wish come true.$\"\n\nFiveIsland_ResortGorgeous_House_Text_OhImTiredOfWaiting::\n    .string \"SELPHY: Oh, I'm tired of this.\\n\"\n    .string \"I'm tired of waiting for you.\\p\"\n    .string \"I'll forgive you this time, but\\n\"\n    .string \"please don't fail me next time.$\"\n\nFiveIsland_ResortGorgeous_House_Text_MonYouCaughtForMeThankYou::\n    .string \"SELPHY: Oh, hello, there.\\p\"\n    .string \"Oh, my gracious. That must be the\\n\"\n    .string \"{STR_VAR_1} you caught for me.\\p\"\n    .string \"Giggle…\\n\"\n    .string \"I see a resemblance to you.\\p\"\n    .string \"Thank you so kindly.\\p\"\n    .string \"… …  … …  … …\\n\"\n    .string \"Is something the matter?\\p\"\n    .string \"You may leave.\\p\"\n    .string \"… …  … …  … …\\n\"\n    .string \"Oh, fine. I understand now.\\p\"\n    .string \"SEBASTIAN!\\n\"\n    .string \"I need you here this instant!$\"\n\nFiveIsland_ResortGorgeous_House_Text_ButlerYesMyLady::\n    .string \"Butler: Yes, my lady.$\"\n\nFiveIsland_ResortGorgeous_House_Text_SelphyGiveTokenOfAppreciation::\n    .string \"SELPHY: See to it that this person\\n\"\n    .string \"is given a token of appreciation.$\"\n\nFiveIsland_ResortGorgeous_House_Text_ButlerIShallDoAsYouBid::\n    .string \"Butler: I shall do as you bid,\\n\"\n    .string \"my lady.$\"\n\nFiveIsland_ResortGorgeous_House_Text_ButlerPleaseAcceptThisAsHerThanks::\n    .string \"Butler: I sincerely thank you for\\n\"\n    .string \"pleasing Lady SELPHY.\\p\"\n    .string \"Please accept this as her thanks…$\"\n\nFiveIsland_ResortGorgeous_House_Text_ButlerBagAppearsToBeFull::\n    .string \"Butler: Your BAG appears to be\\n\"\n    .string \"unfortunately full.$\"\n\nFiveIsland_ResortGorgeous_House_Text_OhHowDisappointing::\n    .string \"Oh…\\n\"\n    .string \"How disappointing.$\"\n\nFiveIsland_ResortGorgeous_House_Text_SelphyWishYouBestOfLuck::\n    .string \"SELPHY: I wish you the best of\\n\"\n    .string \"luck.$\"\n\nFiveIsland_ResortGorgeous_House_Text_LadySelphySmileHasBrillianceOfSun::\n    .string \"Butler: The smile of Lady SELPHY\\n\"\n    .string \"has the brilliance of the sun.\\p\"\n    .string \"Please, I beg you to bring joy\\n\"\n    .string \"to Lady SELPHY.$\"\n\n"
  },
  {
    "path": "data/maps/FiveIsland_RocketWarehouse/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_ROCKET_WAREHOUSE\",\n  \"name\": \"FiveIsland_RocketWarehouse\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_ROCKET_WAREHOUSE\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_ROCKET_WAREHOUSE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_2\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Grunt3\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_F\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Admin1\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Admin2\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_F\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Gideon\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_ItemBigPearl\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_BIG_PEARL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_4F_EventScript_ItemTM41\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_4F_TM41\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_ItemPearl\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_PEARL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_3F_EventScript_ItemHyperPotion\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_3F_HYPER_POTION\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 24,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FIVE_ISLAND_MEADOW\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 22,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROCKET_WAREHOUSE\",\n      \"var_value\": \"0\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Admin2Trigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 23,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROCKET_WAREHOUSE\",\n      \"var_value\": \"0\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Admin2Trigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 24,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROCKET_WAREHOUSE\",\n      \"var_value\": \"0\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Admin2Trigger\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 26,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Computer\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 27,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"item\": \"ITEM_NEST_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FIVE_ISLAND_ROCKET_WAREHOUSE_NEST_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 7,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"item\": \"ITEM_NET_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FIVE_ISLAND_ROCKET_WAREHOUSE_NET_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_Cage\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_RocketWarehouse/scripts.inc",
    "content": ".equ LOCALID_GRUNT1, 5\n.equ LOCALID_GRUNT2, 1\n.equ LOCALID_GRUNT3, 2\n.equ LOCALID_ADMIN1, 3\n.equ LOCALID_ADMIN2, 4\n\n.equ PLAYER_X_POS, VAR_0x8004\n.equ PLAYER_Y_POS, VAR_0x8005\n\nFiveIsland_RocketWarehouse_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, FiveIsland_RocketWarehouse_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FiveIsland_RocketWarehouse_OnTransition\n\t.byte 0\n\nFiveIsland_RocketWarehouse_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_FIVE_ISLAND_ROCKET_WAREHOUSE\n\tend\n\nFiveIsland_RocketWarehouse_OnLoad::\n\tcall_if_defeated TRAINER_TEAM_ROCKET_ADMIN, FiveIsland_RocketWarehouse_EventScript_SetArrowsForReEntry\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_SetArrowsForReEntry::\n\tsetmetatile 26, 20, METATILE_SilphCo_Arrow_Up, 0\n\tsetmetatile 27, 20, METATILE_SilphCo_Arrow_Up, 0\n\treturn\n\nFiveIsland_RocketWarehouse_EventScript_Cage::\n\tlockall\n\tgoto_if_set FLAG_DEFEATED_ROCKETS_IN_WAREHOUSE, FiveIsland_RocketWarehouse_EventScript_CageUnlocked\n\tmsgbox FiveIsland_RocketWarehouse_Text_ManyMonsLockedInPen\n\treleaseall\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_CageUnlocked::\n\tmsgbox FiveIsland_RocketWarehouse_Text_PenUnlockedMonsFled\n\treleaseall\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_Computer::\n\tmsgbox FiveIsland_RocketWarehouse_Text_ReportWithGraphsAndText, MSGBOX_SIGN\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_Admin2Trigger::\n\tlockall\n\tapplymovement LOCALID_ADMIN2, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tsetvar VAR_MAP_SCENE_ROCKET_WAREHOUSE, 1\n\treleaseall\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_Gideon::\n\ttrainerbattle_single TRAINER_SCIENTIST_GIDEON, FiveIsland_RocketWarehouse_Text_GideonIntro, FiveIsland_RocketWarehouse_Text_GideonDefeat, FiveIsland_RocketWarehouse_EventScript_DefeatedGideon\n\tgoto_if_set FLAG_SYS_CAN_LINK_WITH_RS, FiveIsland_RocketWarehouse_EventScript_MentionGiovannisKid\n\tmsgbox FiveIsland_RocketWarehouse_Text_GetLostLeaveMeBe, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_MentionGiovannisKid::\n\tfamechecker FAMECHECKER_GIOVANNI, 5\n\tmsgbox FiveIsland_RocketWarehouse_Text_GiovannisKidHasRedHair, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_DefeatedGideon::\n\tmsgbox FiveIsland_RocketWarehouse_Text_GideonPostBattle\n\tsetflag FLAG_RECOVERED_SAPPHIRE\n\tgiveitem ITEM_SAPPHIRE\n\trelease\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_47, FiveIsland_RocketWarehouse_Text_Grunt2Intro, FiveIsland_RocketWarehouse_Text_Grunt2Defeat\n\tmsgbox FiveIsland_RocketWarehouse_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_Grunt3::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_48, FiveIsland_RocketWarehouse_Text_Grunt3Intro, FiveIsland_RocketWarehouse_Text_Grunt3Defeat\n\tmsgbox FiveIsland_RocketWarehouse_Text_Grunt3PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_Admin2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_ADMIN_2, FiveIsland_RocketWarehouse_Text_Admin2Intro, FiveIsland_RocketWarehouse_Text_Admin2Defeat, FiveIsland_RocketWarehouse_EventScript_DefeatedAdmin2\n\tmsgbox FiveIsland_RocketWarehouse_Text_Admin2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_DefeatedAdmin2::\n\tgetplayerxy PLAYER_X_POS, PLAYER_Y_POS\n\tcall_if_le PLAYER_X_POS, 24, FiveIsland_RocketWarehouse_EventScript_PlayerFaceAdmin2\n\tmsgbox FiveIsland_RocketWarehouse_Text_Admin2PostBattle\n\tclosemessage\n\tfadescreen FADE_TO_BLACK\n\tremoveobject LOCALID_GRUNT2\n\tremoveobject LOCALID_GRUNT3\n\tremoveobject LOCALID_ADMIN2\n\tremoveobject LOCALID_ADMIN1\n\tsetflag FLAG_HIDE_FIVE_ISLAND_ROCKETS\n\tfadescreen FADE_FROM_BLACK\n\tsetvar VAR_MAP_SCENE_ROCKET_WAREHOUSE, 1\n\tsetflag FLAG_DEFEATED_ROCKETS_IN_WAREHOUSE\n\trelease\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_PlayerFaceAdmin2::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\treturn\n\nFiveIsland_RocketWarehouse_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_42, FiveIsland_RocketWarehouse_Text_Grunt1Intro, FiveIsland_RocketWarehouse_Text_Grunt1Defeat\n\tmsgbox FiveIsland_RocketWarehouse_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_Admin1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_ADMIN, FiveIsland_RocketWarehouse_Text_Admin1Intro, FiveIsland_RocketWarehouse_Text_Admin1Defeat, FiveIsland_RocketWarehouse_EventScript_DefeatedAdmin1\n\tmsgbox FiveIsland_RocketWarehouse_Text_MadeItSoYouCanComeBackThrough, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_DefeatedAdmin1::\n\tgetplayerxy PLAYER_X_POS, PLAYER_Y_POS\n\tspecialvar VAR_RESULT, GetPlayerFacingDirection\n\tcall_if_eq VAR_RESULT, DIR_NORTH, FiveIsland_RocketWarehouse_EventScript_PlayerFaceAdmin1\n\tmsgbox FiveIsland_RocketWarehouse_Text_Admin1PostBattle\n\tclosemessage\n\tcall_if_le PLAYER_X_POS, 24, FiveIsland_RocketWarehouse_EventScript_AdminWalkToSwitchFar\n\tcall_if_eq PLAYER_X_POS, 25, FiveIsland_RocketWarehouse_EventScript_AdminWalkToSwitch\n\tcall_if_eq PLAYER_X_POS, 26, FiveIsland_RocketWarehouse_EventScript_AdminFaceSwitch\n\tcall_if_eq PLAYER_X_POS, 27, FiveIsland_RocketWarehouse_EventScript_AdminFaceSwitch\n\tplayse SE_PIN\n\tcall FiveIsland_RocketWarehouse_EventScript_SetArrowsForReEntry\n\tspecial DrawWholeMapView\n\twaitse\n\tcall_if_le PLAYER_X_POS, 24, FiveIsland_RocketWarehouse_EventScript_AdminFacePlayerLeft\n\tcall_if_eq PLAYER_X_POS, 25, FiveIsland_RocketWarehouse_EventScript_AdminFacePlayerLeft\n\tcall_if_eq PLAYER_X_POS, 26, FiveIsland_RocketWarehouse_EventScript_AdminFacePlayerLeft\n\tcall_if_eq PLAYER_X_POS, 27, FiveIsland_RocketWarehouse_EventScript_AdminFacePlayerDown\n\tmsgbox FiveIsland_RocketWarehouse_Text_MadeItSoYouCanComeBackThrough\n\trelease\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_PlayerFaceAdmin1::\n\tgoto_if_eq PLAYER_X_POS, 27, EventScript_Return\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\treturn\n\nFiveIsland_RocketWarehouse_EventScript_AdminWalkToSwitchFar::\n\tapplymovement LOCALID_ADMIN1, FiveIsland_RocketWarehouse_Movement_AdminWalkToSwitchFar\n\twaitmovement 0\n\treturn\n\nFiveIsland_RocketWarehouse_EventScript_AdminWalkToSwitch::\n\tapplymovement LOCALID_ADMIN1, FiveIsland_RocketWarehouse_Movement_AdminWalkToSwitch\n\twaitmovement 0\n\treturn\n\nFiveIsland_RocketWarehouse_EventScript_AdminFaceSwitch::\n\tapplymovement LOCALID_ADMIN1, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\treturn\n\nFiveIsland_RocketWarehouse_EventScript_AdminFacePlayerLeft::\n\tapplymovement LOCALID_ADMIN1, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treturn\n\nFiveIsland_RocketWarehouse_EventScript_AdminFacePlayerDown::\n\tapplymovement LOCALID_ADMIN1, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\nFiveIsland_RocketWarehouse_Movement_AdminWalkToSwitchFar::\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_up\n\tstep_end\n\nFiveIsland_RocketWarehouse_Movement_AdminWalkToSwitch::\n\twalk_right\n\twalk_in_place_faster_up\n\tstep_end\n"
  },
  {
    "path": "data/maps/FiveIsland_RocketWarehouse/text.inc",
    "content": "FiveIsland_RocketWarehouse_Text_ManyMonsLockedInPen::\n    .string \"There are many POKéMON locked\\n\"\n    .string \"away in the pen…$\"\n\nFiveIsland_RocketWarehouse_Text_PenUnlockedMonsFled::\n    .string \"The pen door is unlocked.\\n\"\n    .string \"The POKéMON appear to have fled.$\"\n\nFiveIsland_RocketWarehouse_Text_Grunt2Intro::\n    .string \"Did you come here knowing it's\\n\"\n    .string \"TEAM ROCKET's WAREHOUSE?$\"\n\nFiveIsland_RocketWarehouse_Text_Grunt2Defeat::\n    .string \"What do you think you're doing?!$\"\n\nFiveIsland_RocketWarehouse_Text_Grunt2PostBattle::\n    .string \"TEAM ROCKET broke up?\\n\"\n    .string \"What planet are you from?$\"\n\nFiveIsland_RocketWarehouse_Text_Grunt1Intro::\n    .string \"Oh, now your POKéMON look strong.\\n\"\n    .string \"You're willing to sell them?\\p\"\n    .string \"Oh?\\n\"\n    .string \"You wanted to battle?$\"\n\nFiveIsland_RocketWarehouse_Text_Grunt1Defeat::\n    .string \"Oh, but…\\n\"\n    .string \"Too much!$\"\n\nFiveIsland_RocketWarehouse_Text_Grunt1PostBattle::\n    .string \"We can give you a great price.\\n\"\n    .string \"Sell us your POKéMON!$\"\n\nFiveIsland_RocketWarehouse_Text_Grunt3Intro::\n    .string \"I got word about you from the\\n\"\n    .string \"others.\\p\"\n    .string \"But there's no way a kid like you'd\\n\"\n    .string \"know our BOSS GIOVANNI!$\"\n\nFiveIsland_RocketWarehouse_Text_Grunt3Defeat::\n    .string \"Don't…you…dare…laugh…$\"\n\nFiveIsland_RocketWarehouse_Text_Grunt3PostBattle::\n    .string \"Don't mess in the doings of adults,\\n\"\n    .string \"you jumped-up pip-squeak!$\"\n\nFiveIsland_RocketWarehouse_Text_Admin1Intro::\n    .string \"I don't know or care if what I'm\\n\"\n    .string \"doing is right or wrong…\\p\"\n    .string \"I just put my faith in GIOVANNI\\n\"\n    .string \"and do as I am told.$\"\n\nFiveIsland_RocketWarehouse_Text_Admin1Defeat::\n    .string \"I…\\n\"\n    .string \"I'm shattered…$\"\n\nFiveIsland_RocketWarehouse_Text_Admin1PostBattle::\n    .string \"You're doing things according to\\n\"\n    .string \"your beliefs and morals.\\p\"\n    .string \"I understand now…$\"\n\nFiveIsland_RocketWarehouse_Text_MadeItSoYouCanComeBackThrough::\n    .string \"I've made it so you can come back\\n\"\n    .string \"in through there.\\p\"\n    .string \"Why don't you go get rested and\\n\"\n    .string \"refreshed for what lies ahead?\\p\"\n    .string \"The ADMIN after me outranks me\\n\"\n    .string \"thoroughly as a TRAINER.\\p\"\n    .string \"You'd better steel yourself for one\\n\"\n    .string \"harsh challenge.$\"\n\nFiveIsland_RocketWarehouse_Text_Admin2Intro::\n    .string \"That's quite enough of you \\n\"\n    .string \"playing the hero, kid.\\p\"\n    .string \"Spreading lies about how TEAM\\n\"\n    .string \"ROCKET has disbanded…\\p\"\n    .string \"It's such an obvious attempt to\\n\"\n    .string \"cause confusion in our ranks.\\p\"\n    .string \"Fortunately, we're not so ignorant\\n\"\n    .string \"to fall for the lies of a child!\\p\"\n    .string \"And now, I'll show you how scary\\n\"\n    .string \"an angry adult can be!$\"\n\nFiveIsland_RocketWarehouse_Text_Admin2Defeat::\n    .string \"Urgh…\\n\"\n    .string \"You were too strong…\\p\"\n    .string \"…\\n\"\n    .string \"Th-that's GIOVANNI's BADGE!\\p\"\n    .string \"So it's true?\\n\"\n    .string \"TEAM ROCKET really has disbanded?$\"\n\nFiveIsland_RocketWarehouse_Text_Admin2PostBattle::\n    .string \"We will abandon this WAREHOUSE…\\p\"\n    .string \"But don't think this is over.\\n\"\n    .string \"I won't let this be the end.\\p\"\n    .string \"I will find GIOVANNI.\\n\"\n    .string \"And I will resurrect TEAM ROCKET!\\l\"\n    .string \"I will…\\p\"\n    .string \"Until then, farewell!$\"\n\nFiveIsland_RocketWarehouse_Text_ReportWithGraphsAndText::\n    .string \"A report with graphs and text is on\\n\"\n    .string \"the PC monitor.\\p\"\n    .string \"“The Influence of Magnetic Waves\\n\"\n    .string \"on POKéMON Evolution”…\\p\"\n    .string \"… … … … … …\\p\"\n    .string \"It's too difficult to understand…$\"\n\nFiveIsland_RocketWarehouse_Text_GideonIntro::\n    .string \"I almost managed to sell the\\n\"\n    .string \"SAPPHIRE for huge money…\\p\"\n    .string \"Then, you just had to come along\\n\"\n    .string \"and blow the whole deal apart!\\p\"\n    .string \"Fufu… Fufufufu…\\n\"\n    .string \"There's no forgiveness for you!$\"\n\nFiveIsland_RocketWarehouse_Text_GideonDefeat::\n    .string \"Gah! Darn!\\n\"\n    .string \"Darn! Darn!$\"\n\nFiveIsland_RocketWarehouse_Text_GideonPostBattle::\n    .string \"If I can't sell it, it's worthless!\\n\"\n    .string \"Go ahead, take it!$\"\n\nFiveIsland_RocketWarehouse_Text_GetLostLeaveMeBe::\n    .string \"What do you want now?\\n\"\n    .string \"Go on, get lost, leave me be.$\"\n\nFiveIsland_RocketWarehouse_Text_GiovannisKidHasRedHair::\n    .string \"What, you again?\\p\"\n    .string \"You… You're not GIOVANNI's kid,\\n\"\n    .string \"are you?\\p\"\n    .string \"No, that can't be right!\\n\"\n    .string \"GIOVANNI's kid has red hair.\\p\"\n    .string \"You don't have any reasons for\\n\"\n    .string \"bugging me. Leave me alone!$\"\n\n"
  },
  {
    "path": "data/maps/FiveIsland_WaterLabyrinth/map.json",
    "content": "{\n  \"id\": \"MAP_FIVE_ISLAND_WATER_LABYRINTH\",\n  \"name\": \"FiveIsland_WaterLabyrinth\",\n  \"layout\": \"LAYOUT_FIVE_ISLAND_WATER_LABYRINTH\",\n  \"music\": \"MUS_ROUTE122\",\n  \"region_map_section\": \"MAPSEC_WATER_LABYRINTH\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 48,\n      \"map\": \"MAP_FIVE_ISLAND_RESORT_GORGEOUS\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 48,\n      \"map\": \"MAP_FIVE_ISLAND\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_WaterLabyrinth_EventScript_EggGentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKEMON_BREEDER\",\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"FiveIsland_WaterLabyrinth_EventScript_Alize\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FiveIsland_WaterLabyrinth/scripts.inc",
    "content": "FiveIsland_WaterLabyrinth_MapScripts::\n\t.byte 0\n\nFiveIsland_WaterLabyrinth_EventScript_EggGentleman::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_TOGEPI_EGG, FiveIsland_WaterLabyrinth_EventScript_PostEggComment\n\tgoto_if_set FLAG_NO_ROOM_FOR_TOGEPI_EGG, FiveIsland_WaterLabyrinth_EventScript_ReturnForEgg\n\tmsgbox FiveIsland_WaterLabyrinth_Text_LetMeTakeLookAtMons\n\tspecialvar VAR_RESULT, GetLeadMonFriendship\n\tgoto_if_eq VAR_RESULT, 6, FiveIsland_WaterLabyrinth_EventScript_LeadMonMaxFriendship\n\tmsgbox FiveIsland_WaterLabyrinth_Text_HmmISeeIsee\n\trelease\n\tend\n\nFiveIsland_WaterLabyrinth_EventScript_MonDaisyComment::\n\tfamechecker FAMECHECKER_DAISY, 2\n\tmsgbox FiveIsland_WaterLabyrinth_Text_CuteMonRemindsMeOfDaisy\n\trelease\n\tend\n\nFiveIsland_WaterLabyrinth_EventScript_LeadMonMaxFriendship::\n\tmsgbox FiveIsland_WaterLabyrinth_Text_TreatMonRightHaveThis\n\tgoto FiveIsland_WaterLabyrinth_EventScript_TryGiveEgg\n\tend\n\nFiveIsland_WaterLabyrinth_EventScript_TryGiveEgg::\n\tgetpartysize\n\tgoto_if_eq VAR_RESULT, PARTY_SIZE, FiveIsland_WaterLabyrinth_EventScript_NoRoomForEgg\n\tsetflag FLAG_GOT_TOGEPI_EGG\n\tgiveegg SPECIES_TOGEPI\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage FiveIsland_WaterLabyrinth_Text_ReceivedEggFromMan\n\twaitfanfare\n\twaitmessage\n\tcall EventScript_RestorePrevTextColor\n\tgoto FiveIsland_WaterLabyrinth_EventScript_PostEggComment\n\tend\n\n@ If the player has a Togepi/Togetic from this game (assumed to be the one the man gave you) then comment on it\n@ Otherwise make normal comment\nFiveIsland_WaterLabyrinth_EventScript_PostEggComment::\n\tbufferspeciesname STR_VAR_2, SPECIES_TOGEPI\n\tsetvar VAR_0x8004, SPECIES_TOGEPI\n\tspecialvar VAR_RESULT, PlayerPartyContainsSpeciesWithPlayerID\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_WaterLabyrinth_EventScript_MonDaisyComment\n\tbufferspeciesname STR_VAR_2, SPECIES_TOGETIC\n\tsetvar VAR_0x8004, SPECIES_TOGETIC\n\tspecialvar VAR_RESULT, PlayerPartyContainsSpeciesWithPlayerID\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_WaterLabyrinth_EventScript_MonDaisyComment\n\tmsgbox FiveIsland_WaterLabyrinth_Text_GladIMetSomeoneLikeYou\n\trelease\n\tend\n\nFiveIsland_WaterLabyrinth_EventScript_NoRoomForEgg::\n\tsetflag FLAG_NO_ROOM_FOR_TOGEPI_EGG\n\tmsgbox FiveIsland_WaterLabyrinth_Text_DontHaveSpaceInYourParty\n\trelease\n\tend\n\nFiveIsland_WaterLabyrinth_EventScript_ReturnForEgg::\n\tgoto FiveIsland_WaterLabyrinth_EventScript_TryGiveEgg\n\tend\n"
  },
  {
    "path": "data/maps/FiveIsland_WaterLabyrinth/text.inc",
    "content": "FiveIsland_WaterLabyrinth_Text_LetMeTakeLookAtMons::\n    .string \"You travel all over the place,\\n\"\n    .string \"don't you?\\p\"\n    .string \"You're not driving your POKéMON\\n\"\n    .string \"too harshly, are you?\\p\"\n    .string \"Let me take a look.\\n\"\n    .string \"… … …   … … …$\"\n\nFiveIsland_WaterLabyrinth_Text_HmmISeeIsee::\n    .string \"Ah, hmm…\\n\"\n    .string \"I see, I see…$\"\n\nFiveIsland_WaterLabyrinth_Text_TreatMonRightHaveThis::\n    .string \"Oh, impressive.\\n\"\n    .string \"You treat your POKéMON right.\\p\"\n    .string \"I think you can be entrusted with\\n\"\n    .string \"this.\\p\"\n    .string \"Please, I'd like you to have this.$\"\n\nFiveIsland_WaterLabyrinth_Text_ReceivedEggFromMan::\n    .string \"{PLAYER} received an EGG\\n\"\n    .string \"from the man!$\"\n\nFiveIsland_WaterLabyrinth_Text_DontHaveSpaceInYourParty::\n    .string \"…Unfortunately, you don't have\\n\"\n    .string \"space for this in your party.\\p\"\n    .string \"You'd better come back for it\\n\"\n    .string \"another time.$\"\n\nFiveIsland_WaterLabyrinth_Text_GladIMetSomeoneLikeYou::\n    .string \"I received that EGG while I was\\n\"\n    .string \"traveling.\\p\"\n    .string \"I'm glad I met someone like you.$\"\n\nFiveIsland_WaterLabyrinth_Text_CuteMonRemindsMeOfDaisy::\n    .string \"Oh, hello.\\n\"\n    .string \"That's a cute {STR_VAR_2}.\\p\"\n    .string \"Seeing it reminds me of a sweet \\n\"\n    .string \"little girl I met while traveling.\\p\"\n    .string \"She was gently grooming POKéMON…\\n\"\n    .string \"She was a little angel.\\p\"\n    .string \"That little girl's name…\\n\"\n    .string \"I think it was DAISY.$\"\n\nFiveIsland_WaterLabyrinth_Text_AlizeIntro::\n    .string \"This is an excellent environment\\n\"\n    .string \"for raising POKéMON.$\"\n\nFiveIsland_WaterLabyrinth_Text_AlizeDefeat::\n    .string \"Your POKéMON are growing up\\n\"\n    .string \"admirably well!$\"\n\nFiveIsland_WaterLabyrinth_Text_AlizePostBattle::\n    .string \"You know, I think you have the\\n\"\n    .string \"talent to be a good BREEDER.$\"\n"
  },
  {
    "path": "data/maps/FourIsland/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND\",\n  \"name\": \"FourIsland\",\n  \"layout\": \"LAYOUT_FOUR_ISLAND\",\n  \"music\": \"MUS_FALLARBOR\",\n  \"region_map_section\": \"MAPSEC_FOUR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_EventScript_DaycareMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_DODUO\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NIDORAN_F\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NIDORAN_M\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PSYDUCK\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_EventScript_OldWoman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_EventScript_ItemStardust\",\n      \"flag\": \"FLAG_HIDE_FOUR_ISLAND_STARDUST\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_EventScript_FatMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_EventScript_LittleGirl\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 18,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FOUR_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FOUR_ISLAND_POKEMON_DAY_CARE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FOUR_ISLAND_HOUSE1\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 38,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 23,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FOUR_ISLAND_LORELEIS_HOUSE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FOUR_ISLAND_HOUSE2\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_CABLE_CAR_STATION\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FOUR_ISLAND_MART\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_CABLE_CAR_STATION\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FourIsland_EventScript_IslandSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 31,\n      \"y\": 23,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FourIsland_EventScript_LoreleisHouseSign\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland/scripts.inc",
    "content": ".equ LOCALID_DAYCARE_MAN, 1\n\nFourIsland_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FourIsland_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, FourIsland_OnFrame\n\t.byte 0\n\nFourIsland_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_FOUR_ISLAND\n\tcall FourIsland_EventScript_TrySetDayCareManPos\n\tend\n\nFourIsland_EventScript_TrySetDayCareManPos::\n\tgoto_if_unset FLAG_GOT_RIVAL_STARTER_EGG, FourIsland_EventScript_SetDayCareManPos\n\tgoto_if_unset FLAG_PENDING_DAYCARE_EGG, FourIsland_EventScript_EndSetDayCareManPos\n\tsetobjectmovementtype LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\nFourIsland_EventScript_EndSetDayCareManPos::\n\treturn\n\nFourIsland_EventScript_SetDayCareManPos::\n\tsetobjectmovementtype LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nFourIsland_OnFrame::\n\tmap_script_2 VAR_DAYCARE_MAN_TRIGGERS, 0, FourIsland_EventScript_RepositionDaycareMan\n\t.2byte 0\n\nFourIsland_EventScript_DaycareMan::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tgoto_if_unset FLAG_GOT_RIVAL_STARTER_EGG, FourIsland_EventScript_StarterEggDaycareMan\n\tspecial GetDaycareMonNicknames\n\tspecialvar VAR_RESULT, GetDaycareState\n\tgoto_if_eq VAR_RESULT, DAYCARE_EGG_WAITING, FourIsland_EventScript_DaycareEggWaiting\n\tgoto_if_eq VAR_RESULT, DAYCARE_ONE_MON, FourIsland_EventScript_CheckOnOneMon\n\tgoto_if_eq VAR_RESULT, DAYCARE_TWO_MONS, FourIsland_EventScript_CheckOnTwoMons\n\tmsgbox DayCare_Text_ImDaycareManSpeakToMyWife\n\trelease\n\tend\n\nFourIsland_EventScript_DaycareEggWaiting::\n\tmsgbox DayCare_Text_DoYouWantEgg, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FourIsland_EventScript_DaycareAcceptEgg\n\tmsgbox DayCare_Text_IWillKeepDoYouWantIt, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FourIsland_EventScript_DaycareAcceptEgg\n\tmsgbox DayCare_Text_IllKeepIt\n\tclearflag FLAG_PENDING_DAYCARE_EGG\n\tspecial RejectEggFromDayCare\n\tsetvar VAR_DAYCARE_MAN_TRIGGERS, 0\n\trelease\n\tsetobjectmovementtype LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_FACE_DOWN\n\tsetobjectmovementtypeinstant LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_FACE_DOWN\n\tend\n\nFourIsland_EventScript_DaycareAcceptEgg::\n\tspecialvar VAR_RESULT, CalculatePlayerPartyCount\n\tgoto_if_ne VAR_RESULT, PARTY_SIZE, FourIsland_EventScript_DaycareReceivedEgg\n\tmsgbox DayCare_Text_YouHaveNoRoomForIt\n\trelease\n\tend\n\nFourIsland_EventScript_DaycareReceivedEgg::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmessage DayCare_Text_ReceivedEgg\n\tcall EventScript_RestorePrevTextColor\n\tplayfanfare MUS_LEVEL_UP\n\twaitfanfare\n\twaitbuttonpress\n\tmsgbox DayCare_Text_TakeGoodCareOfIt\n\tspecial GiveEggFromDaycare\n\tclearflag FLAG_PENDING_DAYCARE_EGG\n\tsetvar VAR_DAYCARE_MAN_TRIGGERS, 0\n\trelease\n\tsetobjectmovementtype LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_FACE_DOWN\n\tsetobjectmovementtypeinstant LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_FACE_DOWN\n\tend\n\nFourIsland_EventScript_CheckOnOneMon::\n\tspecial GetDaycareMonNicknames\n\tmsgbox DayCare_Text_YourMonIsDoingFine\n\trelease\n\tend\n\nFourIsland_EventScript_CheckOnTwoMons::\n\tspecial GetDaycareMonNicknames\n\tmsgbox DayCare_Text_YourMonsAreDoingFine\n\tspecial SetDaycareCompatibilityString\n\tspecial ShowFieldMessageStringVar4\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nFourIsland_EventScript_OldWoman::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_SYS_CAN_LINK_WITH_RS, FourIsland_EventScript_OldWomanLoreleiLeft\n\tmsgbox FourIsland_Text_LoreleiHasReturned\n\trelease\n\tend\n\nFourIsland_EventScript_OldWomanLoreleiLeft::\n\tfamechecker FAMECHECKER_LORELEI, 5\n\tmsgbox FourIsland_Text_LoreleiMetLaprasAsChild\n\trelease\n\tend\n\nFourIsland_EventScript_LittleGirl::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_LORELEI, 4\n\tmsgbox FourIsland_Text_LoreleiHasLotsOfStuffedDolls\n\trelease\n\tend\n\nFourIsland_EventScript_FatMan::\n\tmsgbox FourIsland_Text_MadeSlushieUsingIcefallCaveIce, MSGBOX_NPC\n\tend\n\nFourIsland_EventScript_IslandSign::\n\tmsgbox FourIsland_Text_IslandSign, MSGBOX_SIGN\n\tend\n\nFourIsland_EventScript_LoreleisHouseSign::\n\tmsgbox FourIsland_Text_LoreleisHouse, MSGBOX_SIGN\n\tend\n\nFourIsland_EventScript_StarterEggDaycareMan::\n\tmsgbox FourIsland_EventScript_StarterEggDaycareMan_Text_0, MSGBOX_YESNO\n\tcompare VAR_RESULT, 0\n\tgoto_if_ne FourIsland_EventScript_StarterEggDaycareMan_2\n\tmsgbox FourIsland_EventScript_StarterEggDaycareMan_Text_1\n\trelease\n\tend\n\nFourIsland_EventScript_StarterEggDaycareMan_2:\n\tspecialvar VAR_RESULT, CalculatePlayerPartyCount\n\tcompare VAR_RESULT, PARTY_SIZE\n\tgoto_if_eq FourIsland_EventScript_StarterEggDaycareMan_5\n\ttextcolor 3\n\tmessage DayCare_Text_ReceivedEgg\n\tcall EventScript_RestorePrevTextColor\n\tplayfanfare MUS_LEVEL_UP\n\twaitfanfare\n\twaitbuttonpress\n\tmsgbox DayCare_Text_TakeGoodCareOfIt\n\tcallnative GiveRivalStarterEgg\nFourIsland_EventScript_StarterEggDaycareMan_7:\n\tsetflag FLAG_GOT_RIVAL_STARTER_EGG\n\tsetvar VAR_DAYCARE_MAN_TRIGGERS, 0\n\trelease\n\tsetobjectmovementtype LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_FACE_DOWN\n\tsetobjectmovementtypeinstant LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_FACE_DOWN\n\tend\n\nFourIsland_EventScript_StarterEggDaycareMan_5:\n\tmsgbox DayCare_Text_YouHaveNoRoomForIt\n\trelease\n\tend\n\nFourIsland_EventScript_StarterEggDaycareMan_Text_0:\n\t.string \"Ah, hello!\\nI'm the DAY-CARE MAN.\\pI help take care of the precious\\nPOKéMON of TRAINERS.\\pWe were raising a TRAINER's POKéMON\\nand were surprised to find an EGG!\\pHe didn't want it, but you look\\nlike a TRAINER.\\pWould you like to take care\\nof this EGG instead?$\"\n\nFourIsland_EventScript_StarterEggDaycareMan_Text_1:\n\t.string \"I guess I'll keep this EGG until a\\nTRAINER comes along who wants it.$\"\n\nFourIsland_EventScript_RepositionDaycareMan::\n\tgoto_if_unset FLAG_GOT_RIVAL_STARTER_EGG, FourIsland_EventScript_RepositionDaycareMan_2\n\tgoto_if_unset FLAG_PENDING_DAYCARE_EGG, FourIsland_EventScript_RepositionDaycareMan_3\nFourIsland_EventScript_RepositionDaycareMan_2:\n\tsetobjectmovementtype LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\tsetobjectmovementtypeinstant LOCALID_DAYCARE_MAN, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\nFourIsland_EventScript_RepositionDaycareMan_3:\n\tsetvar VAR_DAYCARE_MAN_TRIGGERS, 1\n\tend\n\t\n\n"
  },
  {
    "path": "data/maps/FourIsland/text.inc",
    "content": "FourIsland_Text_IslandSign::\n    .string \"FOUR ISLAND\\n\"\n    .string \"The Cold, Blue, Floe Island$\"\n\nFourIsland_Text_LoreleiHasReturned::\n    .string \"LORELEI has returned.\\p\"\n    .string \"Did she find the city life too\\n\"\n    .string \"stressful, I wonder?$\"\n\nFourIsland_Text_LoreleiMetLaprasAsChild::\n    .string \"LORELEI has gone back.\\p\"\n    .string \"The LAPRAS she has, I imagine it\\n\"\n    .string \"to be the one she met as a child.\\p\"\n    .string \"I believe it was in ICEFALL CAVE\\n\"\n    .string \"that she caught it.\\p\"\n    .string \"Perhaps that POKéMON has been with\\n\"\n    .string \"her ever since.$\"\n\nFourIsland_Text_RivalAlreadyGotEggBeSmellingYa::\n    .string \"{RIVAL}: Hey!\\n\"\n    .string \"{PLAYER}!\\p\"\n    .string \"What are you doing here in the\\n\"\n    .string \"SEVII ISLANDS?\\p\"\n    .string \"You should quit copying me,\\n\"\n    .string \"you know?\\p\"\n    .string \"Anyways, I already got my POKéMON\\n\"\n    .string \"EGG, so I'm done with this island.\\p\"\n    .string \"Heh, I bet you don't even know\\n\"\n    .string \"about POKéMON EGGS.\\p\"\n    .string \"You'll never fill your NATIONAL\\n\"\n    .string \"POKéDEX that way.\\p\"\n    .string \"By the way, I saw someone we both\\n\"\n    .string \"know on this island.\\p\"\n    .string \"Why don't you go look around if\\n\"\n    .string \"it makes you curious?\\p\"\n    .string \"Me, I don't have the time to\\n\"\n    .string \"waste.\\p\"\n    .string \"Be smelling ya!$\"\n\nFourIsland_Text_LoreleiHasLotsOfStuffedDolls::\n    .string \"Oh, you found me!\\n\"\n    .string \"Please don't tell LORELEI.\\p\"\n    .string \"Did you know that LORELEI has lots\\n\"\n    .string \"and lots of stuffed dolls?\\p\"\n    .string \"Every time she comes back to\\n\"\n    .string \"FOUR ISLAND, her collection grows!$\"\n\nFourIsland_Text_MadeSlushieUsingIcefallCaveIce::\n    .string \"Ooh, chilly!\\p\"\n    .string \"I made a slushie using ice I\\n\"\n    .string \"shaved inside ICEFALL CAVE.\\p\"\n    .string \"It's chilly and tasty!$\"\n\nFourIsland_Text_LoreleisHouse::\n    .string \"LORELEI'S HOUSE$\"\n\n"
  },
  {
    "path": "data/maps/FourIsland_Base/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_BASE\",\n  \"name\": \"FourIsland_Base\",\n  \"layout\": \"LAYOUT_FOUR_ISLAND_BASE\",\n  \"music\": \"MUS_FALLARBOR\",\n  \"region_map_section\": \"MAPSEC_FOUR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_EventScript_ItemStarPiece\",\n      \"flag\": \"FLAG_HIDE_FOUR_ISLAND_STAR_PIECE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLUE\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_FOUR_ISLAND_RIVAL\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 12,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_HARBOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_BASE_CABLE_CAR_STATION\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_BASE_CABLE_CAR_STATION\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 24,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PEARL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FOUR_ISLAND_PEARL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 6,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ULTRA_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FOUR_ISLAND_ULTRA_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 23,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FourIsland_Base_EventScript_CableCarStationSign\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_Base/scripts.inc",
    "content": ".equ LOCALID_RIVAL, 3\n\nFourIsland_Base_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FourIsland_Base_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, FourIsland_Base_OnFrame\n\t.byte 0\n\nFourIsland_Base_OnTransition::\n\tcompare VAR_MAP_SCENE_FOUR_ISLAND, 0\n\tcall_if_eq FourIsland_Base_EventScript_ShowRival\n\tend\n\nFourIsland_Base_EventScript_ShowRival::\n\tclearflag FLAG_HIDE_FOUR_ISLAND_RIVAL\n\treturn\n\nFourIsland_Base_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_FOUR_ISLAND, 0, FourIsland_Base_EventScript_RivalScene\n\t.2byte 0\n\nFourIsland_Base_EventScript_RivalScene::\n\tlockall\n\ttextcolor 0\n\tapplymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\tapplymovement LOCALID_RIVAL, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_RIVAL, Common_Movement_Delay48\n\twaitmovement 0\n\tdelay 25\n\tapplymovement LOCALID_RIVAL, FourIsland_Base_Movement_RivalApproach\n\twaitmovement 0\n\tmsgbox FourIsland_Text_RivalAlreadyGotEggBeSmellingYa\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, FourIsland_Base_Movement_PlayerWatchRivalExit\n\tapplymovement LOCALID_RIVAL, FourIsland_Base_Movement_RivalExit\n\twaitmovement 0\n\tfadedefaultbgm\n\tplayse SE_EXIT\n\tdelay 35\n\tremoveobject LOCALID_RIVAL\n\tsetvar VAR_MAP_SCENE_FOUR_ISLAND, 1\n\treleaseall\n\tend\n\nFourIsland_Base_Movement_RivalApproach::\n\twalk_right\n\twalk_right\n\twalk_down\n\twalk_down\n\tstep_end\n\nFourIsland_Base_Movement_RivalExit::\n\tdelay_16\n\tdelay_4\n\twalk_down\n\tstep_end\n\nFourIsland_Base_Movement_PlayerWatchRivalExit::\n\twalk_left\n\twalk_in_place_faster_right\n\tstep_end\n\nFourIsland_Base_EventScript_CableCarStationSign::\n\tmsgbox FourIsland_Base_Text_CableCarStationSign, MSGBOX_SIGN\n\tend\n\nFourIsland_Base_Text_CableCarStationSign::\n\t.string \"FOUR ISLAND CABLE CAR\\n\"\n\t.string \"Express trips up the mountain!$\"\n"
  },
  {
    "path": "data/maps/FourIsland_Base/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/FourIsland_Base_CableCarStation/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_BASE_CABLE_CAR_STATION\",\n  \"name\": \"FourIsland_Base_CableCarStation\",\n  \"layout\": \"LAYOUT_FOUR_ISLAND_BASE_CABLE_CAR_STATION\",\n  \"music\": \"MUS_FALLARBOR\",\n  \"region_map_section\": \"MAPSEC_FOUR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_Base_CableCarStation_EventScript_Attendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CAR\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FOUR_ISLAND_BASE\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_Base_CableCarStation/scripts.inc",
    "content": ".set LOCALID_ATTENDANT, 1\n\nFourIsland_Base_CableCarStation_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FourIsland_Base_CableCarStation_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, FourIsland_Base_CableCarStation_OnFrame\n\t.byte 0\n\nFourIsland_Base_CableCarStation_OnTransition:\n\tcompare VAR_CABLE_CAR_STATION_STATE, 2\n\tcall_if_eq FourIsland_Base_CableCarStation_EventScript_MoveAttendantAside\n\tend\n\nFourIsland_Base_CableCarStation_EventScript_MoveAttendantAside::\n\tsetobjectxyperm LOCALID_ATTENDANT, 7, 4\n\tsetobjectmovementtype LOCALID_ATTENDANT, MOVEMENT_TYPE_FACE_LEFT\n\treturn\n\nFourIsland_Base_CableCarStation_OnFrame:\n\tmap_script_2 VAR_CABLE_CAR_STATION_STATE, 2, FourIsland_Base_CableCarStation_EventScript_ExitCableCar\n\t.2byte 0\n\nFourIsland_Base_CableCarStation_EventScript_ExitCableCar::\n\tlockall\n\tapplymovement OBJ_EVENT_ID_PLAYER, FourIsland_Base_CableCarStation_Movement_ExitCableCar\n\tapplymovement LOCALID_ATTENDANT, FourIsland_Base_CableCarStation_Movement_FollowPlayerOutFromCableCar\n\twaitmovement 0\n\tsetvar VAR_CABLE_CAR_STATION_STATE, 0\n\tsetobjectxyperm LOCALID_ATTENDANT, 6, 7\n\tsetobjectmovementtype LOCALID_ATTENDANT, MOVEMENT_TYPE_FACE_DOWN\n\treleaseall\n\tend\n\nFourIsland_Base_CableCarStation_EventScript_Attendant::\n\tlock\n\tfaceplayer\n\tmsgbox FourIsland_Base_CableCarStation_Text_CableCarReadyGetOn, MSGBOX_YESNO\n\tcompare VAR_RESULT, YES\n\tgoto_if_eq FourIsland_Base_CableCarStation_EventScript_RideCableCar\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq FourIsland_Base_CableCarStation_EventScript_DeclineRide\n\tend\n\nFourIsland_Base_CableCarStation_EventScript_RideCableCar::\n\tmsgbox FourIsland_Base_CableCarStation_Text_StepThisWay, MSGBOX_DEFAULT\n\tclosemessage\n\tapplymovement LOCALID_ATTENDANT, FourIsland_Base_CableCarStation_Movement_LeadPlayerToCableCar\n\tapplymovement OBJ_EVENT_ID_PLAYER, FourIsland_Base_CableCarStation_Movement_BoardCableCar\n\twaitmovement 0\n\tsetvar VAR_0x8004, FALSE  @ Going up\n\tsetvar VAR_CABLE_CAR_STATION_STATE, 1\n\tincrementgamestat GAME_STAT_RODE_CABLE_CAR\n\tcallnative CableCarWarp\n\tcallnative CableCar\n\twaitstate\n\trelease\n\tend\n\nFourIsland_Base_CableCarStation_EventScript_DeclineRide::\n\tmsgbox FourIsland_Base_CableCarStation_Text_RideAnotherTime, MSGBOX_DEFAULT\n\trelease\n\tend\n\nFourIsland_Base_CableCarStation_Movement_LeadPlayerToCableCar:\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nFourIsland_Base_CableCarStation_Movement_FollowPlayerOutFromCableCar:\n\tdelay_16\n\twalk_left\n\twalk_down\n\twalk_down\n\tstep_end\n\nFourIsland_Base_CableCarStation_Movement_BoardCableCar:\n\twalk_up\n\twalk_up\n\twalk_up\n\tdelay_16\n\tstep_end\n\nFourIsland_Base_CableCarStation_Movement_ExitCableCar:\n\twalk_down\n\twalk_down\n\twalk_down\n\tdelay_16\n\tstep_end\n\nFourIsland_Base_CableCarStation_Text_CableCarReadyGetOn:\n\t.string \"The CABLE CAR is ready to go up.\\n\"\n\t.string \"Would you like to be on it?$\"\n\nFourIsland_Base_CableCarStation_Text_StepThisWay:\n\t.string \"Please step this way.$\"\n\nFourIsland_Base_CableCarStation_Text_RideAnotherTime:\n\t.string \"Please ride with us another time.$\"\n\n"
  },
  {
    "path": "data/maps/FourIsland_Base_CableCarStation/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/FourIsland_CableCarStation/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_CABLE_CAR_STATION\",\n  \"name\": \"FourIsland_CableCarStation\",\n  \"layout\": \"LAYOUT_FOUR_ISLAND_CABLE_CAR_STATION\",\n  \"music\": \"MUS_FALLARBOR\",\n  \"region_map_section\": \"MAPSEC_FOUR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_CableCarStation_EventScript_Attendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CAR\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FOUR_ISLAND\",\n      \"dest_warp_id\": 6\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_CableCarStation/scripts.inc",
    "content": ".set LOCALID_ATTENDANT, 1\n\nFourIsland_CableCarStation_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FourIsland_CableCarStation_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, FourIsland_CableCarStation_OnFrame\n\t.byte 0\n\nFourIsland_CableCarStation_OnTransition:\n\tcompare VAR_CABLE_CAR_STATION_STATE, 1\n\tcall_if_eq FourIsland_CableCarStation_EventScript_MoveAttendantAside\n\tend\n\nFourIsland_CableCarStation_EventScript_MoveAttendantAside::\n\tsetobjectxyperm LOCALID_ATTENDANT, 5, 10\n\tsetobjectmovementtype LOCALID_ATTENDANT, MOVEMENT_TYPE_FACE_RIGHT\n\treturn\n\nFourIsland_CableCarStation_OnFrame:\n\tmap_script_2 VAR_CABLE_CAR_STATION_STATE, 1, FourIsland_CableCarStation_EventScript_ExitCableCar\n\t.2byte 0\n\nFourIsland_CableCarStation_EventScript_ExitCableCar::\n\tlockall\n\tapplymovement OBJ_EVENT_ID_PLAYER, FourIsland_CableCarStation_Movement_ExitCableCar\n\tapplymovement LOCALID_ATTENDANT, FourIsland_CableCarStation_Movement_FollowPlayerOutFromCableCar\n\twaitmovement 0\n\tsetvar VAR_CABLE_CAR_STATION_STATE, 0\n\tsetobjectxyperm LOCALID_ATTENDANT, 6, 7\n\tsetobjectmovementtype LOCALID_ATTENDANT, MOVEMENT_TYPE_FACE_UP\n\treleaseall\n\tend\n\nFourIsland_CableCarStation_EventScript_Attendant::\n\tlock\n\tfaceplayer\n\tmsgbox FourIsland_CableCarStation_Text_CableCarReadyGetOn, MSGBOX_YESNO\n\tcompare VAR_RESULT, YES\n\tgoto_if_eq FourIsland_CableCarStation_EventScript_RideCableCar\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq FourIsland_CableCarStation_EventScript_DeclineRide\n\tend\n\nFourIsland_CableCarStation_EventScript_RideCableCar::\n\tmsgbox FourIsland_CableCarStation_Text_StepThisWay, MSGBOX_DEFAULT\n\tclosemessage\n\tapplymovement LOCALID_ATTENDANT, FourIsland_CableCarStation_Movement_LeadPlayerToCableCar\n\tapplymovement OBJ_EVENT_ID_PLAYER, FourIsland_CableCarStation_Movement_BoardCableCar\n\twaitmovement 0\n\tsetvar VAR_0x8004, TRUE  @ Going down\n\tsetvar VAR_CABLE_CAR_STATION_STATE, 2\n\tincrementgamestat GAME_STAT_RODE_CABLE_CAR\n\tcallnative CableCarWarp\n\tcallnative CableCar\n\twaitstate\n\trelease\n\tend\n\nFourIsland_CableCarStation_EventScript_DeclineRide::\n\tmsgbox FourIsland_CableCarStation_Text_RideAnotherTime, MSGBOX_DEFAULT\n\trelease\n\tend\n\nFourIsland_CableCarStation_Movement_LeadPlayerToCableCar:\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_left\n\twalk_in_place_faster_right\n\tstep_end\n\nFourIsland_CableCarStation_Movement_FollowPlayerOutFromCableCar:\n\tdelay_16\n\twalk_right\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nFourIsland_CableCarStation_Movement_BoardCableCar:\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tdelay_16\n\tstep_end\n\nFourIsland_CableCarStation_Movement_ExitCableCar:\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tdelay_16\n\tstep_end\n\nFourIsland_CableCarStation_Text_CableCarReadyGetOn:\n\t.string \"The CABLE CAR is ready to go down.\\n\"\n\t.string \"Would you like to be on it?$\"\n\nFourIsland_CableCarStation_Text_StepThisWay:\n\t.string \"Please step this way.$\"\n\nFourIsland_CableCarStation_Text_RideAnotherTime:\n\t.string \"Please ride with us another time.$\"\n\n\n"
  },
  {
    "path": "data/maps/FourIsland_CableCarStation/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/FourIsland_Harbor/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_HARBOR\",\n  \"name\": \"FourIsland_Harbor\",\n  \"layout\": \"LAYOUT_ISLAND_HARBOR\",\n  \"music\": \"MUS_FALLARBOR\",\n  \"region_map_section\": \"MAPSEC_FOUR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_Harbor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_BASE\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_Harbor/scripts.inc",
    "content": "FourIsland_Harbor_MapScripts::\n\t.byte 0\n\nFourIsland_Harbor_EventScript_Sailor::\n\tlock\n\tfaceplayer\n\tmessage Text_WhereDoYouWantToSail\n\twaitmessage\n\tsetvar VAR_0x8004, SEAGALLOP_FOUR_ISLAND\n\tgoto EventScript_ChooseDestFromIsland\n\tend\n"
  },
  {
    "path": "data/maps/FourIsland_House1/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_HOUSE1\",\n  \"name\": \"FourIsland_House1\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_FALLARBOR\",\n  \"region_map_section\": \"MAPSEC_FOUR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_House1_EventScript_BodySlamTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_House1_EventScript_FatMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_House1/scripts.inc",
    "content": "FourIsland_House1_MapScripts::\n\t.byte 0\n\nFourIsland_House1_EventScript_FatMan::\n\tmsgbox FourIsland_House1_Text_YoureAwfullyHeavy, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/FourIsland_House1/text.inc",
    "content": "@ Text for this file was split weirdly, and is instead in FourIsland_PokemonCenter_1F/text.inc\n@ Theres also an unused JP version of that text in this file instead\n\nFourIsland_House1_Text_YoureAwfullyHeavy::\n    .string \"There! Boing!\\n\"\n    .string \"You're awfully heavy!$\"\n\n"
  },
  {
    "path": "data/maps/FourIsland_House2/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_HOUSE2\",\n  \"name\": \"FourIsland_House2\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_FALLARBOR\",\n  \"region_map_section\": \"MAPSEC_FOUR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_House2_EventScript_StickerMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_House2/scripts.inc",
    "content": "FourIsland_House2_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FourIsland_IcefallCave_1F/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_1F\",\n  \"name\": \"FourIsland_IcefallCave_1F\",\n  \"layout\": \"LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_1F\",\n  \"music\": \"MUS_CAVE_OF_ORIGIN\",\n  \"region_map_section\": \"MAPSEC_ICEFALL_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_IcefallCave_1F_EventScript_ItemUltraBall\",\n      \"flag\": \"FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_ULTRA_BALL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_IcefallCave_1F_EventScript_ItemHM07\",\n      \"flag\": \"FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_HM07\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_B1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_B1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_B1F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_BACK\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_IcefallCave_1F/scripts.inc",
    "content": "FourIsland_IcefallCave_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, FourIsland_IcefallCave_1F_OnResume\n\tmap_script MAP_SCRIPT_ON_LOAD, FourIsland_IcefallCave_1F_OnLoad\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, FourIsland_IcefallCave_1F_OnFrame\n\t.byte 0\n\nFourIsland_IcefallCave_1F_OnResume::\n\tsetstepcallback STEP_CB_ICE\n\tend\n\nFourIsland_IcefallCave_1F_OnLoad::\n\tspecial SetIcefallCaveCrackedIceMetatiles\n\tend\n\nFourIsland_IcefallCave_1F_OnFrame::\n\tmap_script_2 VAR_TEMP_1, 1, FourIsland_IcefallCave_1F_EventScript_FallDownHole\n\t.2byte 0\n\nFourIsland_IcefallCave_1F_EventScript_FallDownHole::\n\tlockall\n\tdelay 20\n\tapplymovement OBJ_EVENT_ID_PLAYER, FourIsland_IcefallCave_1F_Movement_SetInvisible\n\twaitmovement 0\n\tplayse SE_FALL\n\tdelay 60\n\twarphole MAP_FOUR_ISLAND_ICEFALL_CAVE_B1F\n\twaitstate\n\treleaseall\n\tend\n\nFourIsland_IcefallCave_1F_Movement_SetInvisible::\n\tset_invisible\n\tstep_end\n"
  },
  {
    "path": "data/maps/FourIsland_IcefallCave_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_B1F\",\n  \"name\": \"FourIsland_IcefallCave_B1F\",\n  \"layout\": \"LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_B1F\",\n  \"music\": \"MUS_CAVE_OF_ORIGIN\",\n  \"region_map_section\": \"MAPSEC_ICEFALL_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_IcefallCave_B1F_EventScript_ItemFullRestore\",\n      \"flag\": \"FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_B1F_FULL_RESTORE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_IcefallCave_B1F_EventScript_ItemNeverMeltIce\",\n      \"flag\": \"FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_B1F_NEVER_MELT_ICE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 12,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_1F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_1F\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_IcefallCave_B1F/scripts.inc",
    "content": "FourIsland_IcefallCave_B1F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/FourIsland_IcefallCave_Back/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_BACK\",\n  \"name\": \"FourIsland_IcefallCave_Back\",\n  \"layout\": \"LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_BACK\",\n  \"music\": \"MUS_CAVE_OF_ORIGIN\",\n  \"region_map_section\": \"MAPSEC_ICEFALL_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_ICEFALL_CAVE_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_ICEFALL_CAVE_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LORELEI\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_IcefallCave_Back_EventScript_Lorelei\",\n      \"flag\": \"FLAG_HIDE_ICEFALL_CAVE_LORELEI\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_ICEFALL_CAVE_ROCKETS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 12,\n      \"y\": 23,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_1F\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ICEFALL_CAVE_BACK\",\n      \"var_value\": \"0\",\n      \"script\": \"FourIsland_IcefallCave_Back_EventScript_LoreleiRocketsScene\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ICEFALL_CAVE_BACK\",\n      \"var_value\": \"0\",\n      \"script\": \"FourIsland_IcefallCave_Back_EventScript_LoreleiRocketsScene\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ICEFALL_CAVE_BACK\",\n      \"var_value\": \"0\",\n      \"script\": \"FourIsland_IcefallCave_Back_EventScript_LoreleiRocketsScene\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_IcefallCave_Back/scripts.inc",
    "content": ".equ LOCALID_ROCKET1, 1\n.equ LOCALID_ROCKET2, 2\n.equ LOCALID_LORELEI, 3\n.equ LOCALID_ROCKET3, 4\n\nFourIsland_IcefallCave_Back_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FourIsland_IcefallCave_Back_OnTransition\n\t.byte 0\n\nFourIsland_IcefallCave_Back_OnTransition::\n\tcall_if_eq VAR_MAP_SCENE_ICEFALL_CAVE_BACK, 1, FourIsland_IcefallCave_Back_EventScript_HideLorelei\n\tend\n\nFourIsland_IcefallCave_Back_EventScript_HideLorelei::\n\tsetflag FLAG_HIDE_ICEFALL_CAVE_LORELEI\n\treturn\n\nFourIsland_IcefallCave_Back_EventScript_LoreleiRocketsScene::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox FourIsland_IcefallCave_Back_Text_LoreleiKeepHandsOffMons\n\tapplymovement LOCALID_ROCKET1, FourIsland_IcefallCave_Back_Movement_WalkInPlaceDown\n\twaitmovement 0\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox FourIsland_IcefallCave_Back_Text_ShutItLadyLeaveUsBe\n\tclosemessage\n\tplayse SE_PIN\n\tapplymovement LOCALID_LORELEI, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_LORELEI, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tapplymovement LOCALID_LORELEI, Common_Movement_Delay48\n\twaitmovement 0\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox FourIsland_IcefallCave_Back_Text_LoreleiPlayerHelpMeKickPoachersOut\n\tclosemessage\n\tapplymovement LOCALID_LORELEI, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tdelay 18\n\tapplymovement LOCALID_LORELEI, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tdelay 35\n\tapplymovement LOCALID_ROCKET3, FourIsland_IcefallCave_Back_Movement_Rocket3FaceLorelei\n\tapplymovement LOCALID_LORELEI, FourIsland_IcefallCave_Back_Movement_LoreleiToRockets\n\tapplymovement OBJ_EVENT_ID_PLAYER, FourIsland_IcefallCave_Back_Movement_PlayerToRockets\n\twaitmovement 0\n\tapplymovement LOCALID_ROCKET2, FourIsland_IcefallCave_Back_Movement_WalkInPlaceDown\n\twaitmovement 0\n\tplaybgm MUS_ENCOUNTER_ROCKET, 0\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox FourIsland_IcefallCave_Back_Text_GruntIntro\n\tsetvar VAR_LAST_TALKED, LOCALID_ROCKET3\n\ttrainerbattle_no_intro TRAINER_TEAM_ROCKET_GRUNT_45, FourIsland_IcefallCave_Back_Text_GruntDefeat\n\tapplymovement LOCALID_LORELEI, FourIsland_IcefallCave_Back_Movement_WalkInPlaceUp\n\twaitmovement 0\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox FourIsland_IcefallCave_Back_Text_LoreleiWhereHaveYouTakenMons\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox FourIsland_IcefallCave_Back_Text_NotTellingYouThat\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmessage FourIsland_IcefallCave_Back_Text_LoreleiWellDeepFreezeYou\n\twaitmessage\n\twaitse\n\tplaymoncry SPECIES_LAPRAS, CRY_MODE_ENCOUNTER\n\twaitbuttonpress\n\twaitmoncry\n\tapplymovement LOCALID_ROCKET1, FourIsland_IcefallCave_Back_Movement_Rocket1ReactToThreat\n\twaitmovement 0\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox FourIsland_IcefallCave_Back_Text_OkayRocketWareHouseFiveIsland\n\tclosemessage\n\tapplymovement LOCALID_LORELEI, FourIsland_IcefallCave_Back_Movement_LoreleiWatchRocketsExit\n\tapplymovement OBJ_EVENT_ID_PLAYER, FourIsland_IcefallCave_Back_Movement_PlayerWatchRocketsExit\n\tapplymovement LOCALID_ROCKET1, FourIsland_IcefallCave_Back_Movement_Rocket1Exit\n\tapplymovement LOCALID_ROCKET2, FourIsland_IcefallCave_Back_Movement_Rocket2Exit\n\tapplymovement LOCALID_ROCKET3, FourIsland_IcefallCave_Back_Movement_Rocket3Exit\n\twaitmovement 0\n\tremoveobject LOCALID_ROCKET1\n\tremoveobject LOCALID_ROCKET2\n\tremoveobject LOCALID_ROCKET3\n\tdelay 50\n\tapplymovement LOCALID_LORELEI, FourIsland_IcefallCave_Back_Movement_LoreleiWalkToPlayer\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox FourIsland_IcefallCave_Back_Text_ThankYouThisIsAwful\n\tsetflag FLAG_HIDE_RUIN_VALLEY_SCIENTIST\n\tclearflag FLAG_HIDE_LORELEI_IN_HER_HOUSE\n\tsetvar VAR_MAP_SCENE_ICEFALL_CAVE_BACK, 1\n\treleaseall\n\tend\n\nFourIsland_IcefallCave_Back_Movement_PlayerToRockets::\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_up\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_PlayerWatchRocketsExit::\n\tdelay_16\n\twalk_in_place_faster_left\n\tdelay_16\n\tdelay_16\n\twalk_in_place_faster_down\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_WalkInPlaceDown::\n\twalk_in_place_down\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_UnusedPushRight::\n\tlock_facing_direction\n\twalk_right\n\tunlock_facing_direction\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_Rocket1ReactToThreat::\n\twalk_in_place_fast_down\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_Rocket1Exit::\n\twalk_right\n\twalk_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_Rocket2Exit::\n\tdelay_16\n\twalk_left\n\twalk_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_Rocket3Exit::\n\tdelay_16\n\twalk_down\n\tdelay_16\n\twalk_down\n\twalk_fast_right\n\twalk_fast_right\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_Rocket3FaceLorelei::\n\tdelay_16\n\tdelay_8\n\twalk_in_place_faster_right\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_UnusedWalkLeft::\n\twalk_left\n\twalk_left\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_LoreleiToRockets::\n\twalk_left\n\twalk_up\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_WalkInPlaceUp::\n\twalk_in_place_up\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_LoreleiWatchRocketsExit::\n\tdelay_8\n\twalk_in_place_faster_right\n\tdelay_16\n\tdelay_16\n\twalk_in_place_faster_down\n\tstep_end\n\nFourIsland_IcefallCave_Back_Movement_LoreleiWalkToPlayer::\n\twalk_right\n\tstep_end\n\nFourIsland_IcefallCave_Back_EventScript_Lorelei::\n\tmsgbox FourIsland_IcefallCave_Back_Text_ThankYouThisIsAwful, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/FourIsland_IcefallCave_Back/text.inc",
    "content": "FourIsland_IcefallCave_Back_Text_LoreleiKeepHandsOffMons::\n    .string \"LORELEI: Keep your filthy hands\\n\"\n    .string \"off the POKéMON in the cave!\\p\"\n    .string \"Do as I say, or you'll have me to\\n\"\n    .string \"answer to!$\"\n\nFourIsland_IcefallCave_Back_Text_ShutItLadyLeaveUsBe::\n    .string \"Aww, shut it, lady, and leave\\n\"\n    .string \"us be.\\p\"\n    .string \"Don't let your glasses get all\\n\"\n    .string \"steamed up!$\"\n\nFourIsland_IcefallCave_Back_Text_LoreleiPlayerHelpMeKickPoachersOut::\n    .string \"LORELEI: {PLAYER}?!\\n\"\n    .string \"What are you doing here?\\p\"\n    .string \"No, we can catch up later.\\n\"\n    .string \"Right now, I need your help.\\p\"\n    .string \"Help me kick these poachers out\\n\"\n    .string \"before they do anything else.\\p\"\n    .string \"They've been catching POKéMON\\n\"\n    .string \"here, then selling them off!\\p\"\n    .string \"Are you ready?\\n\"\n    .string \"You take that one, please!$\"\n\nFourIsland_IcefallCave_Back_Text_GruntIntro::\n    .string \"W-what?!\\p\"\n    .string \"Who says we can't do what we want\\n\"\n    .string \"with the POKéMON we catch?$\"\n\nFourIsland_IcefallCave_Back_Text_GruntDefeat::\n    .string \"We didn't plan on this!$\"\n\nFourIsland_IcefallCave_Back_Text_LoreleiWhereHaveYouTakenMons::\n    .string \"LORELEI: Humph.\\n\"\n    .string \"So despicably weak.\\p\"\n    .string \"You!\\n\"\n    .string \"Tell me!\\p\"\n    .string \"Where have you taken the captured\\n\"\n    .string \"POKéMON?\\p\"\n    .string \"I'm smashing your ring once and\\n\"\n    .string \"for all!$\"\n\nFourIsland_IcefallCave_Back_Text_NotTellingYouThat::\n    .string \"N-no way!\\n\"\n    .string \"I'm not telling you that!$\"\n\nFourIsland_IcefallCave_Back_Text_LoreleiWellDeepFreezeYou::\n    .string \"LORELEI: If you won't confess,\\n\"\n    .string \"we'll deep-freeze you.\\p\"\n    .string \"My LAPRAS is furious for what\\n\"\n    .string \"you've done to its friends.\\p\"\n    .string \"Go, LAPRAS!\\n\"\n    .string \"ICE BEAM…$\"\n\nFourIsland_IcefallCave_Back_Text_OkayRocketWareHouseFiveIsland::\n    .string \"Wawaah! Okay!\\n\"\n    .string \"I'll talk!\\p\"\n    .string \"The POKéMON are in the ROCKET\\n\"\n    .string \"WAREHOUSE on FIVE ISLAND.\\p\"\n    .string \"There! I said it!\\n\"\n    .string \"We'll be going now!\\p\"\n    .string \"…But I doubt you'll ever make it\\n\"\n    .string \"into the ROCKET WAREHOUSE!\\p\"\n    .string \"Heheheheh!$\"\n\nFourIsland_IcefallCave_Back_Text_ThankYouThisIsAwful::\n    .string \"{PLAYER}, thank you.\\n\"\n    .string \"But this is awful…\\p\"\n    .string \"I was born and raised here on\\n\"\n    .string \"these islands.\\p\"\n    .string \"I had no idea that those horrible\\n\"\n    .string \"criminals were loose here…$\"\n\n"
  },
  {
    "path": "data/maps/FourIsland_IcefallCave_Entrance/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE\",\n  \"name\": \"FourIsland_IcefallCave_Entrance\",\n  \"layout\": \"LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE\",\n  \"music\": \"MUS_CAVE_OF_ORIGIN\",\n  \"region_map_section\": \"MAPSEC_ICEFALL_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 17,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND_ICEFALL_CAVE_1F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_IcefallCave_Entrance/scripts.inc",
    "content": "FourIsland_IcefallCave_Entrance_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FourIsland_IcefallCave_Entrance_OnTransition\n\t.byte 0\n\nFourIsland_IcefallCave_Entrance_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE\n\tend\n"
  },
  {
    "path": "data/maps/FourIsland_LoreleisHouse/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_LORELEIS_HOUSE\",\n  \"name\": \"FourIsland_LoreleisHouse\",\n  \"layout\": \"LAYOUT_FOUR_ISLAND_LORELEIS_HOUSE\",\n  \"music\": \"MUS_FALLARBOR\",\n  \"region_map_section\": \"MAPSEC_FOUR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LORELEI\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Lorelei\",\n      \"flag\": \"FLAG_HIDE_LORELEI_IN_HER_HOUSE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WIGGLYTUFF\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEEL\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PIKACHU\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SLOWPOKE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SLOWBRO\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PSYDUCK\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MEOWTH\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"FLAG_HIDE_LORELEI_HOUSE_MEOWTH_DOLL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANSEY\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"FLAG_HIDE_LORELEI_HOUSE_CHANSEY_DOLL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_JIGGLYPUFF\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"FLAG_HIDE_LORELEI_HOUSE_JIGGLYPUFF_DOLL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NIDORAN_F\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_F_DOLL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NIDORAN_M\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_M_DOLL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PIDGEOT\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 0,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"FLAG_HIDE_LORELEIS_HOUSE_PIDGEOT_DOLL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FEAROW\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 0,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"FLAG_HIDE_LORELEIS_HOUSE_FEAROW_DOLL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LAPRAS_DOLL\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_LoreleisHouse_EventScript_Doll\",\n      \"flag\": \"FLAG_HIDE_LORELEIS_HOUSE_LAPRAS_DOLL\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_LoreleisHouse/scripts.inc",
    "content": "FourIsland_LoreleisHouse_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FourIsland_LoreleisHouse_OnTransition\n\t.byte 0\n\nFourIsland_LoreleisHouse_OnTransition::\n\tspecial UpdateLoreleiDollCollection\n\tend\n\nFourIsland_LoreleisHouse_EventScript_Lorelei::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TALKED_TO_LORELEI_AFTER_WAREHOUSE, FourIsland_LoreleisHouse_EventScript_Lorelei3\n\tgoto_if_set FLAG_DEFEATED_ROCKETS_IN_WAREHOUSE, FourIsland_LoreleisHouse_EventScript_Lorelei2\n\tmsgbox FourIsland_LoreleisHouse_Text_IfAnythingWereToHappenToIsland\n\trelease\n\tend\n\nFourIsland_LoreleisHouse_EventScript_Lorelei2::\n\tsetflag FLAG_TALKED_TO_LORELEI_AFTER_WAREHOUSE\n\tmsgbox FourIsland_LoreleisHouse_Text_IllReturnToLeagueInShortWhile\n\trelease\n\tend\n\nFourIsland_LoreleisHouse_EventScript_Lorelei3::\n\tmsgbox FourIsland_LoreleisHouse_Text_WillDoWhatICanHereAndNow\n\trelease\n\tend\n\nFourIsland_LoreleisHouse_EventScript_Doll::\n\tlock\n\tmsgbox FourIsland_LoreleisHouse_Text_StuffedMonDollsGalore\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/FourIsland_LoreleisHouse/text.inc",
    "content": "FourIsland_LoreleisHouse_Text_IfAnythingWereToHappenToIsland::\n    .string \"LORELEI: There's something weighing\\n\"\n    .string \"heavily on my mind.\\p\"\n    .string \"If anything were to happen on\\n\"\n    .string \"the island where I was born…\\p\"\n    .string \"I wouldn't know about it if I were\\n\"\n    .string \"in the POKéMON LEAGUE.\\p\"\n    .string \"I wonder if that would make me\\n\"\n    .string \"irresponsible to my home…$\"\n\nFourIsland_LoreleisHouse_Text_IllReturnToLeagueInShortWhile::\n    .string \"LORELEI: So, you managed to solve\\n\"\n    .string \"all the problems here?\\p\"\n    .string \"That's wonderful.\\p\"\n    .string \"That means there isn't any reason\\n\"\n    .string \"for me to be here all the time.\\p\"\n    .string \"Thank you…\\p\"\n    .string \"I'll return to the POKéMON LEAGUE\\n\"\n    .string \"in a short while.$\"\n\nFourIsland_LoreleisHouse_Text_WillDoWhatICanHereAndNow::\n    .string \"I don't know what will happen in\\n\"\n    .string \"the future, but…\\p\"\n    .string \"I will do what I can here and now.\\n\"\n    .string \"That's all I can do.$\"\n\nFourIsland_LoreleisHouse_Text_StuffedMonDollsGalore::\n    .string \"Stuffed POKéMON dolls galore!$\"\n\n"
  },
  {
    "path": "data/maps/FourIsland_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_MART\",\n  \"name\": \"FourIsland_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_FOUR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_Mart_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_Mart_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_Mart_EventScript_Camper\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND\",\n      \"dest_warp_id\": \"7\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_Mart/scripts.inc",
    "content": "FourIsland_Mart_MapScripts::\n\t.byte 0\n\nFourIsland_Mart_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart FourIsland_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nFourIsland_Mart_Items::\n\t.2byte ITEM_ULTRA_BALL\n\t.2byte ITEM_FULL_RESTORE\n\t.2byte ITEM_MAX_POTION\n\t.2byte ITEM_REVIVE\n\t.2byte ITEM_ICE_HEAL\n\t.2byte ITEM_FULL_HEAL\n\t.2byte ITEM_ESCAPE_ROPE\n\t.2byte ITEM_MAX_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nFourIsland_Mart_EventScript_Camper::\n\tmsgbox FourIsland_Mart_Text_IcefallCaveIsFrigid, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/FourIsland_Mart/text.inc",
    "content": "FourIsland_Mart_Text_LoreleiGrewUpOnThisIsland::\n    .string \"We've had a great and powerful\\n\"\n    .string \"TRAINER grow up on this island.\\p\"\n    .string \"I bet even you'd know her.\\n\"\n    .string \"It's LORELEI of the ELITE FOUR!\\p\"\n    .string \"When LORELEI was just a tyke,\\n\"\n    .string \"I taught her about POKéMON.$\"\n\nFourIsland_Mart_Text_IcefallCaveIsFrigid::\n    .string \"The SEVII ISLANDS are in a warm\\n\"\n    .string \"region overall.\\p\"\n    .string \"But there is one exception you\\n\"\n    .string \"need to know about.\\p\"\n    .string \"The ICEFALL CAVE is frigid because\\n\"\n    .string \"of the POKéMON that live in it.$\"\n\n"
  },
  {
    "path": "data/maps/FourIsland_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_POKEMON_CENTER_1F\",\n  \"name\": \"FourIsland_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_FOUR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_PokemonCenter_1F_EventScript_Man\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_3\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_PokemonCenter_1F_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_PokemonCenter_1F_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_FOUR_ISLAND_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"FourIsland_PokemonCenter_1F_EventScript_PokemonJournal\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"FourIsland_PokemonCenter_1F_EventScript_PokemonJournal\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_PokemonCenter_1F/scripts.inc",
    "content": "FourIsland_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FourIsland_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nFourIsland_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_FOUR_ISLAND\n\tend\n\nFourIsland_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nFourIsland_PokemonCenter_1F_EventScript_Man::\n\tmsgbox FourIsland_PokemonCenter_1F_Text_RareIceMonsInCave, MSGBOX_NPC\n\tend\n\nFourIsland_PokemonCenter_1F_EventScript_Woman::\n\tmsgbox FourIsland_PokemonCenter_1F_Text_DayCarePeopleFoundEggBefore, MSGBOX_NPC\n\tend\n\nFourIsland_PokemonCenter_1F_EventScript_Gentleman::\n\tmsgbox FourIsland_PokemonCenter_1F_Text_NewPokemonJournalHasntArrived, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/FourIsland_PokemonCenter_1F/text.inc",
    "content": "@ The 5 texts below are supposed to be in FourIsland_House1\nText_BodySlamTeach::\n    .string \"Ready?\\n\"\n    .string \"Boing!\\p\"\n    .string \"We're having a BODY SLAM match\\n\"\n    .string \"to see who wimps out first.\\p\"\n    .string \"If you were to join us, you'd be\\n\"\n    .string \"squashed like a bug, though…\\p\"\n    .string \"How about I teach BODY SLAM to\\n\"\n    .string \"a POKéMON of yours instead?$\"\n\nText_BodySlamDeclined::\n    .string \"Come again!\\n\"\n    .string \"Boing!$\"\n\nText_BodySlamWhichMon::\n    .string \"Which POKéMON wants to learn how\\n\"\n    .string \"to BODY SLAM?$\"\n\nText_BodySlamTaught::\n    .string \"Boioing!$\"\n\nText_BodySlamReteach::\n    .string \"Ready for more?\\n\"\n    .string \"Boing!\\p\"\n    .string \"We're still seeing whose BODY SLAM\\n\"\n    .string \"is stronger.\\p\"\n    .string \"Hmm… And we'd still squash you\\n\"\n    .string \"if you tried to join in.\\p\"\n    .string \"How about I teach POKéMON\\n\"\n    .string \"BODY SLAM instead for ¥5000?$\"\n\nText_BodySlamReteach2::\n    .string \"Do you want me to teach your\\n\"\n    .string \"POKéMON BODY SLAM?$\"\n\nText_BodySlamNotEnoughMoney::\n    .string \"Boing? What's this?\\n\"\n    .string \"You don't have ¥5000?\\p\"\n    .string \"Well, you definitely can't join\\n\"\n    .string \"our match, it's unsafe!\\p\"\n    .string \"Come back later with the money,\\n\"\n    .string \"and I'll teach your POKéMON instead.$\"\n\nFourIsland_PokemonCenter_1F_Text_RareIceMonsInCave::\n    .string \"There's a rare kind of ICE POKéMON\\n\"\n    .string \"that lives in the cave.\\p\"\n    .string \"We get a lot of visitors hoping to\\n\"\n    .string \"see that POKéMON.$\"\n\nFourIsland_PokemonCenter_1F_Text_DayCarePeopleFoundEggBefore::\n    .string \"Oh? A POKéMON EGG?\\n\"\n    .string \"…I have no idea.\\p\"\n    .string \"…Oh, wait. The DAY-CARE people\\n\"\n    .string \"in town were saying something.\\p\"\n    .string \"They said that they'd found EGGS\\n\"\n    .string \"before on their property.$\"\n\nFourIsland_PokemonCenter_1F_Text_NewPokemonJournalHasntArrived::\n    .string \"What's this?\\p\"\n    .string \"The new POKéMON JOURNAL hasn't\\n\"\n    .string \"arrived on this island?$\"\n\n"
  },
  {
    "path": "data/maps/FourIsland_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_POKEMON_CENTER_2F\",\n  \"name\": \"FourIsland_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_FOUR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_FOUR_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_PokemonCenter_2F/scripts.inc",
    "content": "FourIsland_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nFourIsland_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nFourIsland_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nFourIsland_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/FourIsland_PokemonDayCare/map.json",
    "content": "{\n  \"id\": \"MAP_FOUR_ISLAND_POKEMON_DAY_CARE\",\n  \"name\": \"FourIsland_PokemonDayCare\",\n  \"layout\": \"LAYOUT_FOUR_ISLAND_POKEMON_DAY_CARE\",\n  \"music\": \"MUS_FALLARBOR\",\n  \"region_map_section\": \"MAPSEC_FOUR_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FourIsland_PokemonDayCare_EventScript_DaycareWoman\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FOUR_ISLAND\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FourIsland_PokemonDayCare/scripts.inc",
    "content": ".set LOCALID_DAYCARE_WOMAN, 1\n\nFourIsland_PokemonDayCare_MapScripts::\n\t.byte 0\n\nFourIsland_PokemonDayCare_EventScript_DaycareWoman::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tgoto_if_unset FLAG_GOT_RIVAL_STARTER_EGG, FourIsland_PokemonDayCare_EventScript_StarterEggDaycareWoman\n\tspecialvar VAR_RESULT, GetDaycareState\n\tgoto_if_eq VAR_RESULT, DAYCARE_EGG_WAITING, FourIsland_PokemonDayCare_EggWaiting\n\tgoto_if_eq VAR_RESULT, DAYCARE_ONE_MON, FourIsland_PokemonDayCare_OneMonInDaycare\n\tgoto_if_eq VAR_RESULT, DAYCARE_TWO_MONS, FourIsland_PokemonDayCare_TwoMonsInDaycare\n\tmsgbox DayCare_Text_WouldYouLikeUsToRaiseMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_GiveMonToRaise\n\tmsgbox DayCare_Text_FineThenComeAgain\n\trelease\n\tend\n\nFourIsland_PokemonDayCare_GiveMonToRaise::\n\tspecialvar VAR_RESULT, CountPartyNonEggMons\n\tgoto_if_eq VAR_RESULT, 1, FourIsland_PokemonDayCare_OnlyOneMonInParty\n\tmsgbox DayCare_Text_WhichMonShouldWeRaise\n\tfadescreen FADE_TO_BLACK\n\tspecial ChooseSendDaycareMon\n\twaitstate\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, FourIsland_PokemonDayCare_ComeAgain\n\tspecialvar VAR_RESULT, CountPartyAliveNonEggMons_IgnoreVar0x8004Slot\n\tgoto_if_eq VAR_RESULT, 0, FourIsland_PokemonDayCare_OnlyOneAliveMonInParty\n\tspecialvar VAR_0x8005, GetSelectedMonNicknameAndSpecies\n\twaitse\n\tplaymoncry VAR_0x8005, CRY_MODE_NORMAL\n\tmsgbox DayCare_Text_WellRaiseYourMon\n\twaitmoncry\n\tspecial StoreSelectedPokemonInDaycare\n\tincrementgamestat GAME_STAT_USED_DAYCARE\n\tspecialvar VAR_RESULT, GetDaycareState\n\tgoto_if_eq VAR_RESULT, DAYCARE_ONE_MON, FourIsland_PokemonDayCare_CanRaiseOneMore\n\trelease\n\tend\n\nFourIsland_PokemonDayCare_ComeAgain::\n\tmsgbox DayCare_Text_ComeAgain\n\trelease\n\tend\n\nFourIsland_PokemonDayCare_CanRaiseOneMore::\n\tmsgbox DayCare_Text_WeCanRaiseOneMore, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_GiveMonToRaise\n\tgoto FourIsland_PokemonDayCare_ComeAgain\n\tend\n\nFourIsland_PokemonDayCare_OnlyOneMonInParty::\n\tmsgbox DayCare_Text_YouHaveJustOneMon\n\trelease\n\tend\n\nFourIsland_PokemonDayCare_OnlyOneAliveMonInParty::\n\tmsgbox DayCare_Text_WhatWillYouBattleWith\n\trelease\n\tend\n\nFourIsland_PokemonDayCare_EggWaiting::\n\tmsgbox DayCare_Text_HusbandWasLookingForYou\n\trelease\n\tend\n\nFourIsland_PokemonDayCare_MonHasGrownXLevels::\n\tmsgbox DayCare_Text_YourMonHasGrownXLevels\n\treturn\n\nFourIsland_PokemonDayCare_DisplayLevelsGained::\n\tspecialvar VAR_RESULT, GetNumLevelsGainedFromDaycare\n\tcall_if_ne VAR_RESULT, 0, FourIsland_PokemonDayCare_MonHasGrownXLevels\n\treturn\n\nFourIsland_PokemonDayCare_OneMonInDaycare::\n\tmsgbox DayCare_Text_GoodToSeeYou\n\tsetvar VAR_0x8004, 0\n\tcall FourIsland_PokemonDayCare_DisplayLevelsGained\n\tmsgbox DayCare_Text_WeCanRaiseOneMore, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_GiveMonToRaise\n\tmsgbox DayCare_Text_TakeYourMonBack, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_TryRetrieveMon\n\tgoto FourIsland_PokemonDayCare_ComeAgain\n\tend\n\nFourIsland_PokemonDayCare_TryRetrieveMon::\n\tcallnative IsPartyAndBoxesFull\n\tgoto_if_eq VAR_RESULT, TRUE, FourIsland_PokemonDayCare_EventScript_StorageAndPartyFull\n\tspecialvar VAR_RESULT, GetDaycareState\n\tsetvar VAR_0x8004, 0\n\tgoto_if_eq VAR_RESULT, DAYCARE_ONE_MON, FourIsland_PokemonDayCare_CostPrompt\n\tspecial ShowDaycareLevelMenu\n\twaitstate\n\tcopyvar VAR_0x8004, VAR_RESULT\n\tgoto_if_eq VAR_RESULT, DAYCARE_EXITED_LEVEL_MENU, FourIsland_PokemonDayCare_ComeAgain\n\tgoto FourIsland_PokemonDayCare_CostPrompt\n\tend\n\nFourIsland_PokemonDayCare_CostPrompt::\n\tspecialvar VAR_RESULT, CalculatePlayerPartyCount\n\tcompare VAR_RESULT, PARTY_SIZE\n\tgoto_if_eq FourIsland_PokemonDayCare_NoRoomInParty\nFourIsland_PokemonDayCare_CostPrompt_Continue::\n\tspecial GetDaycareCost\n\tmsgbox DayCare_Text_ItWillCostX, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_CheckEnoughMoney\n\tgoto FourIsland_PokemonDayCare_ComeAgain\n\tend\n\nFourIsland_PokemonDayCare_CheckEnoughMoney::\n\tspecialvar VAR_RESULT, IsEnoughForCostInVar0x8005\n\tgoto_if_eq VAR_RESULT, TRUE, FourIsland_PokemonDayCare_RetrieveMon\n\tmsgbox DayCare_Text_NotEnoughMoney\n\trelease\n\tend\n\nFourIsland_PokemonDayCare_RetrieveMon::\n\tspecialvar VAR_RESULT, TakePokemonFromDaycare\n\tgoto_if_eq VAR_RESULT, 9999, FourIsland_PokemonDayCare_EventScript_StorageAndPartyFull @boxes full\n\tapplymovement LOCALID_DAYCARE_WOMAN, FourIsland_PokemonDayCare_Movement_RetrieveMon\n\twaitmovement 0\n\tspecial SubtractMoneyFromVar0x8005\n\tplayse SE_RS_SHOP\n\tmsgbox DayCare_Text_HeresYourMon\n\twaitse\n\tplaymoncry VAR_RESULT, CRY_MODE_NORMAL\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox DayCare_Text_TookBackMon\n\twaitmoncry\n\tcompare VAR_MON_BOX_ID, 9999 //not sent to box\n\tcall_if_ne Route5_PokemonDayCare_EventScript_SentToBoxNum\n\tcall EventScript_RestorePrevTextColor\n\tspecialvar VAR_RESULT, GetDaycareState\n\tgoto_if_eq VAR_RESULT, DAYCARE_ONE_MON, FourIsland_PokemonDayCare_AskRetrieveOtherMon\n\tgoto FourIsland_PokemonDayCare_ComeAgain\n\tend\n\nFourIsland_PokemonDayCare_AskRetrieveOtherMon::\n\tmsgbox DayCare_Text_TakeOtherOneBackToo, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_TryRetrieveMon\n\tgoto FourIsland_PokemonDayCare_ComeAgain\n\tend\n\nFourIsland_PokemonDayCare_NoRoomInParty::\n\tcallnative CheckDaycareMonsHaveMail\n\tgoto_if_ne VAR_RESULT, TRUE, FourIsland_PokemonDayCare_CostPrompt_Continue @selected slot has mail\nFourIsland_PokemonDayCare_EventScript_StorageAndPartyFull::\n\tmsgbox DayCare_Text_YourPartyIsFull\n\trelease\n\tend\n\nFourIsland_PokemonDayCare_Movement_RetrieveMon::\n\tdelay_16\n\tdelay_16\n\tface_right\n\tdelay_16\n\tdelay_16\n\tface_left\n\tdelay_16\n\tdelay_16\n\tface_up\n\twalk_slower_up\n\tset_invisible\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tface_down\n\tset_visible\n\twalk_slower_down\n\tstep_end\n\nFourIsland_PokemonDayCare_EventScript_StarterEggDaycareWoman::\n\tmsgbox FourIsland_PokemonDayCare_Text_StarterEggDaycareWoman\n\trelease\n\tend\n\nFourIsland_PokemonDayCare_Text_StarterEggDaycareWoman::\n\t.string \"My husband outside is looking for\\na TRAINER.\\pPlease go see him.$\"\n\n@ Unused. Possibly a commented script, or a typo end added to the above Movement script\nFourIsland_PokemonDayCare_EventScript_UnusedEnd::\n\tend\n\nFourIsland_PokemonDayCare_TwoMonsInDaycare::\n\tmsgbox DayCare_Text_GoodToSeeYou\n\tsetvar VAR_0x8004, 0\n\tcall FourIsland_PokemonDayCare_DisplayLevelsGained\n\tsetvar VAR_0x8004, 1\n\tcall FourIsland_PokemonDayCare_DisplayLevelsGained\n\tmsgbox DayCare_Text_TakeYourMonBack, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FourIsland_PokemonDayCare_TryRetrieveMon\n\tmsgbox DayCare_Text_ComeAgain\n\trelease\n\tend\n\n@ Unused\nFourIsland_PokemonDayCare_EventScript_UnusedRetrieveMon::\n\tspecial ShowDaycareLevelMenu\n\twaitstate\n\tgoto_if_eq VAR_RESULT, 2, FourIsland_PokemonDayCare_ComeAgain\n\tcopyvar VAR_0x8004, VAR_RESULT\n\tspecialvar VAR_RESULT, TakePokemonFromDaycare\n\tmsgbox DayCare_Text_HeresYourMon\n\tmsgbox DayCare_Text_ComeAgain\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/FuchsiaCity/map.json",
    "content": "{\n  \"id\": \"MAP_FUCHSIA_CITY\",\n  \"name\": \"FuchsiaCity\",\n  \"layout\": \"LAYOUT_FUCHSIA_CITY\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_FUCHSIA_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": 12,\n      \"map\": \"MAP_ROUTE19\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE18\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE15\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 37,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_EventScript_Erik\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SLOWPOKE\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND_SLOWER\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VOLTORB\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANSEY\",\n      \"in_connection\": false,\n      \"x\": 39,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LAPRAS\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 20,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_KANGASKHAN\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_FUCHSIA_CITY_CUT_TREE_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_FUCHSIA_CITY_CUT_TREE_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_FUCHSIA_CITY_CUT_TREE_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_FUCHSIA_CITY_CUT_TREE_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_EventScript_SubstituteTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_EventScript_Lass\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Kangaskhan\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Tauros\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 24,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_WARDENS_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_MART\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_SAFARI_ZONE_OFFICE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 32,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_GYM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_HOUSE1\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 38,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_HOUSE2\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 39,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_HOUSE2\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 39,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_HOUSE2\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_HOUSE3\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 31,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_EventScript_CitySign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 26,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_EventScript_SafariZoneSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 32,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_EventScript_GymSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 31,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_EventScript_WardensHomeSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 35,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_EventScript_VoltorbSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 38,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_EventScript_SlowpokeSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 41,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_EventScript_ChanseySign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_EventScript_KangaskhanSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_EventScript_FossilMonSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_EventScript_LaprasSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 22,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_EventScript_SafariGameSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 33,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"item\": \"ITEM_MAX_REVIVE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_FUCHSIA_CITY_MAX_REVIVE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FuchsiaCity/scripts.inc",
    "content": ".set LOCALID_KANGASKHAN_MASTER, 17\n.set LOCALID_TAUROS_MASTER, 18\n.set TRAINER, VAR_0x8009\n\nFuchsiaCity_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FuchsiaCity_OnTransition\n\t.byte 0\n\nFuchsiaCity_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_FUCHSIA_CITY\n\tcall_if_set FLAG_GOT_DOME_FOSSIL, FuchsiaCity_EventScript_SetOmanyteGfx\n\tcall_if_unset FLAG_GOT_DOME_FOSSIL, FuchsiaCity_EventScript_SetKabutoGfx\n\tgoto FuchsiaCity_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nFuchsiaCity_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_KANGASKHAN\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, FuchsiaCity_MapScript_KangaskhanMasterMovementType\n\tsetvar TRAINER, MASTER_TAUROS\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, FuchsiaCity_MapScript_TaurosMasterMovementType\n\tend\n\nFuchsiaCity_MapScript_KangaskhanMasterMovementType::\n\tsetobjectmovementtype LOCALID_KANGASKHAN_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nFuchsiaCity_MapScript_TaurosMasterMovementType::\n\tsetobjectmovementtype LOCALID_TAUROS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nFuchsiaCity_EventScript_SetOmanyteGfx::\n\tsetvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_OMANYTE\n\treturn\n\nFuchsiaCity_EventScript_SetKabutoGfx::\n\tsetvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_KABUTO\n\treturn\n\nFuchsiaCity_EventScript_LittleBoy::\n\tmsgbox FuchsiaCity_Text_DidYouTrySafariGame, MSGBOX_NPC\n\tend\n\nFuchsiaCity_EventScript_OldMan::\n\tmsgbox FuchsiaCity_Text_SafariZoneZooInFront, MSGBOX_NPC\n\tend\n\nFuchsiaCity_EventScript_Erik::\n\tmsgbox FuchsiaCity_Text_WheresSara, MSGBOX_NPC\n\tend\n\nFuchsiaCity_EventScript_Youngster::\n\tmsgbox FuchsiaCity_Text_ItemBallInThere, MSGBOX_NPC\n\tend\n\nFuchsiaCity_EventScript_Lass::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_KOGA, 3\n\tmsgbox FuchsiaCity_Text_MyFatherIsGymLeader\n\trelease\n\tend\n\nFuchsiaCity_EventScript_CitySign::\n\tmsgbox FuchsiaCity_Text_CitySign, MSGBOX_SIGN\n\tend\n\nFuchsiaCity_EventScript_SafariZoneSign::\n\tmsgbox FuchsiaCity_Text_SafariZoneSign, MSGBOX_SIGN\n\tend\n\nFuchsiaCity_EventScript_SafariGameSign::\n\tmsgbox FuchsiaCity_Text_SafariGameSign, MSGBOX_SIGN\n\tend\n\nFuchsiaCity_EventScript_WardensHomeSign::\n\tmsgbox FuchsiaCity_Text_WardensHomeSign, MSGBOX_SIGN\n\tend\n\n@ Unused\nFuchsiaCity_EventScript_SafariZoneOfficeSign::\n\tmsgbox FuchsiaCity_Text_SafariZoneOfficeSign, MSGBOX_SIGN\n\tend\n\nFuchsiaCity_EventScript_GymSign::\n\tlockall\n\tfamechecker FAMECHECKER_KOGA, 0\n\tmsgbox FuchsiaCity_Text_GymSign\n\treleaseall\n\tend\n\nFuchsiaCity_EventScript_ChanseySign::\n\tlockall\n\tsetvar VAR_0x8004, SPECIES_CHANSEY\n\tspecial SetSeenMon\n\tshowmonpic SPECIES_CHANSEY, 10, 3\n\tmsgbox FuchsiaCity_Text_ChanseySign\n\thidemonpic\n\treleaseall\n\tend\n\nFuchsiaCity_EventScript_VoltorbSign::\n\tlockall\n\tsetvar VAR_0x8004, SPECIES_VOLTORB\n\tspecial SetSeenMon\n\tshowmonpic SPECIES_VOLTORB, 10, 3\n\tmsgbox FuchsiaCity_Text_VoltorbSign\n\thidemonpic\n\treleaseall\n\tend\n\nFuchsiaCity_EventScript_KangaskhanSign::\n\tlockall\n\tsetvar VAR_0x8004, SPECIES_KANGASKHAN\n\tspecial SetSeenMon\n\tshowmonpic SPECIES_KANGASKHAN, 10, 3\n\tmsgbox FuchsiaCity_Text_KangaskhanSign\n\thidemonpic\n\treleaseall\n\tend\n\nFuchsiaCity_EventScript_SlowpokeSign::\n\tlockall\n\tsetvar VAR_0x8004, SPECIES_SLOWPOKE\n\tspecial SetSeenMon\n\tshowmonpic SPECIES_SLOWPOKE, 10, 3\n\tmsgbox FuchsiaCity_Text_SlowpokeSign\n\thidemonpic\n\treleaseall\n\tend\n\nFuchsiaCity_EventScript_LaprasSign::\n\tlockall\n\tsetvar VAR_0x8004, SPECIES_LAPRAS\n\tspecial SetSeenMon\n\tshowmonpic SPECIES_LAPRAS, 10, 3\n\tmsgbox FuchsiaCity_Text_LaprasSign\n\thidemonpic\n\treleaseall\n\tend\n\nFuchsiaCity_EventScript_FossilMonSign::\n\tlockall\n\tgoto_if_set FLAG_GOT_DOME_FOSSIL, FuchsiaCity_EventScript_OmanyteSign\n\tsetvar VAR_0x8004, SPECIES_KABUTO\n\tspecial SetSeenMon\n\tshowmonpic SPECIES_KABUTO, 10, 3\n\tmsgbox FuchsiaCity_Text_KabutoSign\n\thidemonpic\n\treleaseall\n\tend\n\nFuchsiaCity_EventScript_OmanyteSign::\n\tsetvar VAR_0x8004, SPECIES_OMANYTE\n\tspecial SetSeenMon\n\tshowmonpic SPECIES_OMANYTE, 10, 3\n\tmsgbox FuchsiaCity_Text_OmanyteSign\n\thidemonpic\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/FuchsiaCity/text.inc",
    "content": "FuchsiaCity_Text_DidYouTrySafariGame::\n    .string \"Did you try the SAFARI GAME?\\p\"\n    .string \"There are some rare POKéMON that\\n\"\n    .string \"can only be caught there.$\"\n\nFuchsiaCity_Text_SafariZoneZooInFront::\n    .string \"The SAFARI ZONE has a zoo in front\\n\"\n    .string \"of the entrance.\\p\"\n    .string \"Out back is the SAFARI GAME for\\n\"\n    .string \"catching POKéMON.$\"\n\nFuchsiaCity_Text_WheresSara::\n    .string \"ERIK: Where's SARA?\\n\"\n    .string \"I said I'd meet her here.$\"\n\nFuchsiaCity_Text_ItemBallInThere::\n    .string \"That item ball in there…\\n\"\n    .string \"Were you wanting that?\\p\"\n    .string \"Me, too!\\n\"\n    .string \"…Huh? That's a POKéMON?$\"\n\nFuchsiaCity_Text_CitySign::\n    .string \"FUCHSIA CITY\\n\"\n    .string \"Behold! It's Passion Pink!$\"\n\nFuchsiaCity_Text_SafariZoneSign::\n    .string \"POKéMON PARADISE\\n\"\n    .string \"SAFARI ZONE$\"\n\nFuchsiaCity_Text_SafariGameSign::\n    .string \"SAFARI GAME\\n\"\n    .string \"POKéMON-U-CATCH!$\"\n\nFuchsiaCity_Text_WardensHomeSign::\n    .string \"SAFARI ZONE\\n\"\n    .string \"WARDEN'S HOME$\"\n\nFuchsiaCity_Text_SafariZoneOfficeSign::\n    .string \"POKéMON PARADISE!\\n\"\n    .string \"Welcome to the SAFARI ZONE!\\l\"\n    .string \"SAFARI ZONE OFFICE$\"\n\nFuchsiaCity_Text_GymSign::\n    .string \"FUCHSIA CITY POKéMON GYM\\n\"\n    .string \"LEADER: KOGA\\l\"\n    .string \"The Poisonous Ninja Master$\"\n\nFuchsiaCity_Text_ChanseySign::\n    .string \"Name: CHANSEY\\n\"\n    .string \"Catching one is all up to chance.$\"\n\nFuchsiaCity_Text_VoltorbSign::\n    .string \"Name: VOLTORB\\n\"\n    .string \"The very image of a POKé BALL.$\"\n\nFuchsiaCity_Text_KangaskhanSign::\n    .string \"Name: KANGASKHAN\\p\"\n    .string \"A maternal POKéMON that raises its\\n\"\n    .string \"young in a pouch on its belly.$\"\n\nFuchsiaCity_Text_SlowpokeSign::\n    .string \"Name: SLOWPOKE\\n\"\n    .string \"Friendly and very slow moving.$\"\n\nFuchsiaCity_Text_LaprasSign::\n    .string \"Name: LAPRAS\\n\"\n    .string \"AKA the king of the seas.$\"\n\nFuchsiaCity_Text_OmanyteSign::\n    .string \"Name: OMANYTE\\n\"\n    .string \"An extremely rare POKéMON that was\\l\"\n    .string \"regenerated from a fossil.$\"\n\nFuchsiaCity_Text_KabutoSign::\n    .string \"Name: KABUTO\\n\"\n    .string \"An extremely rare POKéMON that was\\l\"\n    .string \"regenerated from a fossil.$\"\n\n@ Unused. May have been meant to be the placeholder text for the zoo mons, similar to RB's \"!\" text\nFuchsiaCity_Text_Ellipsis::\n    .string \"……$\"\n\nText_SubstituteTeach::\n    .string \"Aww, I wish I was a KANGASKHAN\\n\"\n    .string \"baby.\\p\"\n    .string \"I'd love to be a substitute for the\\n\"\n    .string \"baby…\\p\"\n    .string \"And snuggle in the mother\\n\"\n    .string \"KANGASKHAN's belly pouch.\\p\"\n    .string \"But only POKéMON can use the\\n\"\n    .string \"technique SUBSTITUTE…\\p\"\n    .string \"Want me to teach SUBSTITUTE to\\n\"\n    .string \"one of your POKéMON?$\"\n\nText_SubstituteDeclined::\n    .string \"Oh, really?\\n\"\n    .string \"SUBSTITUTE seems so fun…$\"\n\nText_SubstituteWhichMon::\n    .string \"Which POKéMON wants to learn\\n\"\n    .string \"SUBSTITUTE?$\"\n\nText_SubstituteTaught::\n    .string \"Boy, what I'd give to crawl inside\\n\"\n    .string \"a KANGASKHAN belly pouch…$\"\n\nText_SubstituteReteach::\n    .string \"I bet a KANGASKHAN's belly pouch\\n\"\n    .string \"is so comfy and warm…\\p\"\n    .string \"If only I could sub in for the\\n\"\n    .string \"baby, we could take shifts!\\p\"\n    .string \"I can teach SUBSTITUTE to one\\n\"\n    .string \"of your POKéMON again for ¥5000!$\"\n\nText_SubstituteReteach2::\n    .string \"Want me to teach SUBSTITUTE to\\n\"\n    .string \"one of your POKéMON?$\"\n\nText_SubstituteNotEnoughMoney::\n    .string \"KANGASKHAN is rare, so if I want\\n\"\n    .string \"to catch one, I need money for\\l\"\n    .string \"lots of SAFARI ZONE trips.\\p\"\n    .string \"I can't afford to teach SUBSTITUTE\\n\"\n    .string \"for less than ¥5000 anymore!$\"\n\nFuchsiaCity_Text_MyFatherIsGymLeader::\n    .string \"My father is the GYM LEADER of\\n\"\n    .string \"this town.\\p\"\n    .string \"I'm training to use POISON POKéMON\\n\"\n    .string \"as well as my father.$\"\n\n"
  },
  {
    "path": "data/maps/FuchsiaCity_Gym/map.json",
    "content": "{\n  \"id\": \"MAP_FUCHSIA_CITY_GYM\",\n  \"name\": \"FuchsiaCity_Gym\",\n  \"layout\": \"LAYOUT_FUCHSIA_CITY_GYM\",\n  \"music\": \"MUS_GYM\",\n  \"region_map_section\": \"MAPSEC_FUCHSIA_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_GYM\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_JUGGLER\",\n      \"x\": 12,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"FuchsiaCity_Gym_EventScript_Kayden\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_JUGGLER\",\n      \"x\": 2,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"FuchsiaCity_Gym_EventScript_Shawn\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_JUGGLER\",\n      \"x\": 11,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"FuchsiaCity_Gym_EventScript_Kirk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TAMER\",\n      \"x\": 13,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"FuchsiaCity_Gym_EventScript_Edgar\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TAMER\",\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"FuchsiaCity_Gym_EventScript_Phil\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_JUGGLER\",\n      \"x\": 2,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"FuchsiaCity_Gym_EventScript_Nate\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_KOGA\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_Gym_EventScript_Koga\",\n      \"flag\": \"FLAG_TEMP_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GYM_GUY\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_Gym_EventScript_GymGuy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_Gym_EventScript_GymStatue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_Gym_EventScript_GymStatue\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/FuchsiaCity_Gym/scripts.inc",
    "content": ".equ CHECK_VISITOR_STATE, 6\n.equ TYPE, VAR_0x8003\n.equ ARGUMENT, VAR_0x8004\n\nFuchsiaCity_Gym_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FuchsiaCity_Gym_OnTransition\n\t.byte 0\n\nFuchsiaCity_Gym_OnTransition::\n\tsetvar TYPE, CHECK_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_KOGA\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 1, FuchsiaCity_Gym_EventScript_HideKoga\n\tend\n\nFuchsiaCity_Gym_EventScript_HideKoga::\n\tsetflag FLAG_TEMP_1\n\treturn\n\nFuchsiaCity_Gym_EventScript_Koga::\n\tfamechecker FAMECHECKER_KOGA, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, FuchsiaCity_Gym_EventScript_Koga_ChallengeMode\n\ttrainerbattle_single TRAINER_LEADER_KOGA, FuchsiaCity_Gym_Text_KogaIntro, FuchsiaCity_Gym_Text_KogaDefeat, FuchsiaCity_Gym_EventScript_DefeatedKoga, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_KOGA_CHALLENGE\n\tgoto_if_unset FLAG_GOT_TM06_FROM_KOGA, FuchsiaCity_Gym_EventScript_GiveTM06\n\tmsgbox FuchsiaCity_Gym_Text_KogaPostBattle\n\trelease\n\tend\n\nFuchsiaCity_Gym_EventScript_Koga_ChallengeMode::\n\ttrainerbattle_single TRAINER_LEADER_KOGA_CHALLENGE, FuchsiaCity_Gym_Text_KogaIntro, FuchsiaCity_Gym_Text_KogaDefeat, FuchsiaCity_Gym_EventScript_DefeatedKoga, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_KOGA\n\tgoto_if_unset FLAG_GOT_TM06_FROM_KOGA, FuchsiaCity_Gym_EventScript_GiveTM06\n\tmsgbox FuchsiaCity_Gym_Text_KogaPostBattle\n\trelease\n\tend\n\nFuchsiaCity_Gym_EventScript_DefeatedKoga::\n\tfamechecker FAMECHECKER_KOGA, 1\n\tclearflag FLAG_HIDE_FAME_CHECKER_KOGA_JOURNAL\n\tsetflag FLAG_DEFEATED_KOGA\n\tsetflag FLAG_BADGE05_GET\n\tset_gym_trainers 5\n\tgoto FuchsiaCity_Gym_EventScript_GiveTM06\n\tend\n\nFuchsiaCity_Gym_EventScript_GiveTM06::\n\tmsgbox FuchsiaCity_Gym_Text_KogaExplainSoulBadge\n\tcheckitemspace ITEM_TM06\n\tgoto_if_eq VAR_RESULT, FALSE, FuchsiaCity_Gym_EventScript_NoRoomForTM06\n\tgiveitem_msg FuchsiaCity_Gym_Text_ReceivedTM06FromKoga, ITEM_TM06\n\tsetflag FLAG_GOT_TM06_FROM_KOGA\n\tmsgbox FuchsiaCity_Gym_Text_KogaExplainTM06\n\trelease\n\tend\n\nFuchsiaCity_Gym_EventScript_NoRoomForTM06::\n\tmsgbox FuchsiaCity_Gym_Text_MakeSpaceForThis\n\trelease\n\tend\n\nFuchsiaCity_Gym_EventScript_Phil::\n\ttrainerbattle_single TRAINER_TAMER_PHIL, FuchsiaCity_Gym_Text_PhilIntro, FuchsiaCity_Gym_Text_PhilDefeat\n\tmsgbox FuchsiaCity_Gym_Text_PhilPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFuchsiaCity_Gym_EventScript_Edgar::\n\ttrainerbattle_single TRAINER_TAMER_EDGAR, FuchsiaCity_Gym_Text_EdgarIntro, FuchsiaCity_Gym_Text_EdgarDefeat\n\tmsgbox FuchsiaCity_Gym_Text_EdgarPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFuchsiaCity_Gym_EventScript_Kirk::\n\ttrainerbattle_single TRAINER_JUGGLER_KIRK, FuchsiaCity_Gym_Text_KirkIntro, FuchsiaCity_Gym_Text_KirkDefeat\n\tfamechecker FAMECHECKER_KOGA, 2\n\tmsgbox FuchsiaCity_Gym_Text_KirkPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFuchsiaCity_Gym_EventScript_Shawn::\n\ttrainerbattle_single TRAINER_JUGGLER_SHAWN, FuchsiaCity_Gym_Text_ShawnIntro, FuchsiaCity_Gym_Text_ShawnDefeat\n\tmsgbox FuchsiaCity_Gym_Text_ShawnPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFuchsiaCity_Gym_EventScript_Kayden::\n\ttrainerbattle_single TRAINER_JUGGLER_KAYDEN, FuchsiaCity_Gym_Text_KaydenIntro, FuchsiaCity_Gym_Text_KaydenDefeat\n\tmsgbox FuchsiaCity_Gym_Text_KaydenPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFuchsiaCity_Gym_EventScript_Nate::\n\ttrainerbattle_single TRAINER_JUGGLER_NATE, FuchsiaCity_Gym_Text_NateIntro, FuchsiaCity_Gym_Text_NateDefeat\n\tmsgbox FuchsiaCity_Gym_Text_NatePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFuchsiaCity_Gym_EventScript_GymGuy::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_DEFEATED_KOGA, FuchsiaCity_Gym_EventScript_GymGuyPostVictory\n\tmsgbox FuchsiaCity_Gym_Text_GymGuyAdvice\n\trelease\n\tend\n\nFuchsiaCity_Gym_EventScript_GymGuyPostVictory::\n\tmsgbox FuchsiaCity_Gym_Text_GymGuyPostVictory\n\trelease\n\tend\n\nFuchsiaCity_Gym_EventScript_GymStatue::\n\tlockall\n\tgoto_if_set FLAG_BADGE05_GET, FuchsiaCity_Gym_EventScript_GymStatuePostVictory\n\tmsgbox FuchsiaCity_Gym_Text_GymStatue\n\treleaseall\n\tend\n\nFuchsiaCity_Gym_EventScript_GymStatuePostVictory::\n\tmsgbox FuchsiaCity_Gym_Text_GymStatuePlayerWon\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/FuchsiaCity_Gym/text.inc",
    "content": "FuchsiaCity_Gym_Text_KogaIntro::\n    .string \"KOGA: Fwahahaha!\\p\"\n    .string \"A mere child like you dares to\\n\"\n    .string \"challenge me?\\p\"\n    .string \"The very idea makes me shiver\\n\"\n    .string \"with mirth!\\p\"\n    .string \"Very well, I shall show you true\\n\"\n    .string \"terror as a ninja master.\\p\"\n    .string \"Poison brings steady doom.\\n\"\n    .string \"Sleep renders foes helpless.\\p\"\n    .string \"Despair to the creeping horror of\\n\"\n    .string \"POISON-type POKéMON!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nFuchsiaCity_Gym_Text_KogaDefeat::\n    .string \"Humph!\\n\"\n    .string \"You have proven your worth!\\p\"\n    .string \"Here!\\n\"\n    .string \"Take the SOULBADGE!$\"\n\nFuchsiaCity_Gym_Text_KogaPostBattle::\n    .string \"When afflicted by TOXIC, a POKéMON\\n\"\n    .string \"suffers more and more.\\p\"\n    .string \"It suffers worsening damage as the\\n\"\n    .string \"battle wears on!\\p\"\n    .string \"It will surely terrorize foes!$\"\n\nFuchsiaCity_Gym_Text_KogaExplainSoulBadge::\n    .string \"Now that you have the SOULBADGE,\\n\"\n    .string \"the DEFENSE of your POKéMON rises.\\p\"\n    .string \"It also lets you SURF outside of\\n\"\n    .string \"battle.\\p\"\n    .string \"Ah!\\n\"\n    .string \"Take this, too!$\"\n\nFuchsiaCity_Gym_Text_ReceivedTM06FromKoga::\n    .string \"{PLAYER} received TM06\\n\"\n    .string \"from KOGA.$\"\n\nFuchsiaCity_Gym_Text_KogaExplainTM06::\n    .string \"Sealed within that TM06 lies\\n\"\n    .string \"TOXIC!\\p\"\n    .string \"It is a secret technique dating\\n\"\n    .string \"back some four hundred years.$\"\n\nFuchsiaCity_Gym_Text_MakeSpaceForThis::\n    .string \"Make space for this, child!$\"\n\nFuchsiaCity_Gym_Text_KaydenIntro::\n    .string \"Strength isn't the key for POKéMON.\\n\"\n    .string \"Do you understand this?\\p\"\n    .string \"POKéMON is about strategy!\\p\"\n    .string \"I'll show you how strategy can\\n\"\n    .string \"beat brute strength.$\"\n\nFuchsiaCity_Gym_Text_KaydenDefeat::\n    .string \"What?\\n\"\n    .string \"Extraordinary!$\"\n\nFuchsiaCity_Gym_Text_KaydenPostBattle::\n    .string \"So, you mix brawn with brains?\\n\"\n    .string \"Good strategy!\\p\"\n    .string \"That's remarkable for a child\\n\"\n    .string \"TRAINER.$\"\n\nFuchsiaCity_Gym_Text_KirkIntro::\n    .string \"I was a magician once upon a time.\\p\"\n    .string \"But I dreamt of becoming a ninja,\\n\"\n    .string \"so I joined this GYM.$\"\n\nFuchsiaCity_Gym_Text_KirkDefeat::\n    .string \"I'm done for!$\"\n\nFuchsiaCity_Gym_Text_KirkPostBattle::\n    .string \"Even though I've lost, I will keep\\n\"\n    .string \"training according to the teachings\\l\"\n    .string \"of KOGA, my ninja master.$\"\n\nFuchsiaCity_Gym_Text_NateIntro::\n    .string \"Let's see you beat my special\\n\"\n    .string \"techniques!$\"\n\nFuchsiaCity_Gym_Text_NateDefeat::\n    .string \"You had me fooled!$\"\n\nFuchsiaCity_Gym_Text_NatePostBattle::\n    .string \"I like poison and sleep techniques,\\n\"\n    .string \"as they linger after battle!$\"\n\nFuchsiaCity_Gym_Text_PhilIntro::\n    .string \"Stop right there!\\p\"\n    .string \"The famed invisible walls of\\n\"\n    .string \"FUCHSIA GYM have you frustrated?$\"\n\nFuchsiaCity_Gym_Text_PhilDefeat::\n    .string \"Whoa!\\n\"\n    .string \"You've got it!$\"\n\nFuchsiaCity_Gym_Text_PhilPostBattle::\n    .string \"You impressed me!\\n\"\n    .string \"Here's a hint!\\p\"\n    .string \"Look very closely for gaps in the\\n\"\n    .string \"invisible walls!$\"\n\nFuchsiaCity_Gym_Text_EdgarIntro::\n    .string \"I also study the way of the ninja\\n\"\n    .string \"with Master KOGA!\\p\"\n    .string \"Ninja have a long history of using\\n\"\n    .string \"animals!$\"\n\nFuchsiaCity_Gym_Text_EdgarDefeat::\n    .string \"Awoo!$\"\n\nFuchsiaCity_Gym_Text_EdgarPostBattle::\n    .string \"I still have much to learn.$\"\n\nFuchsiaCity_Gym_Text_ShawnIntro::\n    .string \"Master KOGA comes from a long line\\n\"\n    .string \"of ninjas.\\p\"\n    .string \"What did you descend from?$\"\n\nFuchsiaCity_Gym_Text_ShawnDefeat::\n    .string \"You're more skilled than I'd\\n\"\n    .string \"thought!$\"\n\nFuchsiaCity_Gym_Text_ShawnPostBattle::\n    .string \"Where there is light, there is\\n\"\n    .string \"shadow!\\p\"\n    .string \"Light and shadow!\\n\"\n    .string \"Which do you choose?$\"\n\nFuchsiaCity_Gym_Text_GymGuyAdvice::\n    .string \"Yo!\\n\"\n    .string \"Champ in the making!\\p\"\n    .string \"FUCHSIA GYM is a tricked-up place.\\n\"\n    .string \"It's riddled with invisible walls!\\p\"\n    .string \"KOGA might appear close, but he's\\n\"\n    .string \"blocked off.\\p\"\n    .string \"You have to find gaps in the walls\\n\"\n    .string \"to reach him.$\"\n\nFuchsiaCity_Gym_Text_GymGuyPostVictory::\n    .string \"It's amazing how ninja can terrify,\\n\"\n    .string \"even now!$\"\n\nFuchsiaCity_Gym_Text_GymStatue::\n    .string \"FUCHSIA POKéMON GYM\\n\"\n    .string \"LEADER: KOGA\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}$\"\n\nFuchsiaCity_Gym_Text_GymStatuePlayerWon::\n    .string \"FUCHSIA POKéMON GYM\\n\"\n    .string \"LEADER: KOGA\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}, {PLAYER}$\"\n\n"
  },
  {
    "path": "data/maps/FuchsiaCity_House1/map.json",
    "content": "{\n  \"id\": \"MAP_FUCHSIA_CITY_HOUSE1\",\n  \"name\": \"FuchsiaCity_House1\",\n  \"layout\": \"LAYOUT_HOUSE1\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_FUCHSIA_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_House1_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_House1_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_House1_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FuchsiaCity_House1/scripts.inc",
    "content": "FuchsiaCity_House1_MapScripts::\n\t.byte 0\n\nFuchsiaCity_House1_EventScript_Woman::\n\tmsgbox FuchsiaCity_House1_Text_WardenIsOldHasFalseTeeth, MSGBOX_NPC\n\tend\n\nFuchsiaCity_House1_EventScript_OldMan::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_BILL, 2\n\tmsgbox FuchsiaCity_House1_Text_BillIsMyGrandson\n\trelease\n\tend\n\nFuchsiaCity_House1_EventScript_LittleBoy::\n\tmsgbox FuchsiaCity_House1_Text_BillFilesHisOwnMonData, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/FuchsiaCity_House1/text.inc",
    "content": "FuchsiaCity_House1_Text_WardenIsOldHasFalseTeeth::\n    .string \"The SAFARI ZONE's WARDEN is old, \\n\"\n    .string \"but he's still very much active.\\p\"\n    .string \"All his teeth are false, though.$\"\n\nFuchsiaCity_House1_Text_BillIsMyGrandson::\n    .string \"Hmm?\\n\"\n    .string \"You've met BILL?\\p\"\n    .string \"He's my grandson!\\p\"\n    .string \"He always liked collecting things,\\n\"\n    .string \"even as a child!$\"\n\nFuchsiaCity_House1_Text_BillFilesHisOwnMonData::\n    .string \"BILL files his own POKéMON data on\\n\"\n    .string \"his PC.\\p\"\n    .string \"Did he show you?$\"\n\n"
  },
  {
    "path": "data/maps/FuchsiaCity_House2/map.json",
    "content": "{\n  \"id\": \"MAP_FUCHSIA_CITY_HOUSE2\",\n  \"name\": \"FuchsiaCity_House2\",\n  \"layout\": \"LAYOUT_FUCHSIA_CITY_HOUSE2\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_FUCHSIA_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_House2_EventScript_FishingGurusBrother\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BLACK_BELT\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Machoke\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"8\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FuchsiaCity_House2/scripts.inc",
    "content": ".set LOCALID_MACHOKE_MASTER, 2\n.set TRAINER, VAR_0x8009\n\nFuchsiaCity_House2_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FuchsiaCity_House2_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nFuchsiaCity_House2_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_MACHOKE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, FuchsiaCity_House2_MapScript_MachokeMasterMovementType\n\tend\n\nFuchsiaCity_House2_MapScript_MachokeMasterMovementType::\n\tsetobjectmovementtype LOCALID_MACHOKE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nFuchsiaCity_House2_EventScript_FishingGurusBrother::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_GOOD_ROD, FuchsiaCity_House2_EventScript_AlreadyGotGoodRod\n\tmsgbox FuchsiaCity_House2_Text_DoYouLikeToFish, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FuchsiaCity_House2_EventScript_GiveGoodRod\n\tmsgbox FuchsiaCity_House2_Text_OhThatsDisappointing\n\trelease\n\tend\n\nFuchsiaCity_House2_EventScript_AlreadyGotGoodRod::\n\tmsgbox FuchsiaCity_House2_Text_HowAreTheFishBiting\n\trelease\n\tend\n\nFuchsiaCity_House2_EventScript_GiveGoodRod::\n\tmsgbox FuchsiaCity_House2_Text_LikeYourStyleTakeThis\n\tcheckitemspace ITEM_GOOD_ROD\n\tgoto_if_eq VAR_RESULT, FALSE, FuchsiaCity_House2_EventScript_NoRoomForGoodRod\n\tgiveitem_msg FuchsiaCity_House2_Text_ReceivedGoodRod, ITEM_GOOD_ROD\n\tmsgbox FuchsiaCity_House2_Text_GoodRodCanCatchBetterMons\n\tsetflag FLAG_GOT_GOOD_ROD\n\trelease\n\tend\n\nFuchsiaCity_House2_EventScript_NoRoomForGoodRod::\n\tmsgbox FuchsiaCity_House2_Text_YouHaveNoRoomForGift\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/FuchsiaCity_House2/text.inc",
    "content": "FuchsiaCity_House2_Text_DoYouLikeToFish::\n    .string \"I'm the FISHING GURU's older\\n\"\n    .string \"brother.\\p\"\n    .string \"I simply looove fishing!\\n\"\n    .string \"I can't bear to go without.\\p\"\n    .string \"Tell me, do you like to fish?$\"\n\nFuchsiaCity_House2_Text_LikeYourStyleTakeThis::\n    .string \"Grand! I like your style.\\n\"\n    .string \"I think we can be friends.\\p\"\n    .string \"Take this and fish, young friend!$\"\n\nFuchsiaCity_House2_Text_ReceivedGoodRod::\n    .string \"{PLAYER} received a GOOD ROD from\\n\"\n    .string \"the FISHING GURU's brother.$\"\n\nFuchsiaCity_House2_Text_GoodRodCanCatchBetterMons::\n    .string \"Fishing is a way of life!\\n\"\n    .string \"It is like the finest poetry.\\p\"\n    .string \"A crummy OLD ROD could only catch\\n\"\n    .string \"MAGIKARP, yes?\\p\"\n    .string \"But with a GOOD ROD, you can\\n\"\n    .string \"catch much better POKéMON.$\"\n\nFuchsiaCity_House2_Text_OhThatsDisappointing::\n    .string \"Oh…\\n\"\n    .string \"That's so disappointing…$\"\n\nFuchsiaCity_House2_Text_HowAreTheFishBiting::\n    .string \"Hello there, {PLAYER}!\\p\"\n    .string \"How are the fish biting?$\"\n\nFuchsiaCity_House2_Text_YouHaveNoRoomForGift::\n    .string \"Oh, no!\\p\"\n    .string \"I had a gift for you, but you have\\n\"\n    .string \"no room for it!$\"\n\n"
  },
  {
    "path": "data/maps/FuchsiaCity_House3/map.json",
    "content": "{\n  \"id\": \"MAP_FUCHSIA_CITY_HOUSE3\",\n  \"name\": \"FuchsiaCity_House3\",\n  \"layout\": \"LAYOUT_HOUSE1\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_FUCHSIA_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_House3_EventScript_MoveDeleter\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"10\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FuchsiaCity_House3/scripts.inc",
    "content": "FuchsiaCity_House3_MapScripts::\n\t.byte 0\n\nFuchsiaCity_House3_EventScript_MoveDeleter::\n\tlock\n\tfaceplayer\n\tmsgbox FuchsiaCity_House3_Text_WouldYouLikeToForgetMove, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FuchsiaCity_House3_EventScript_ChooseMonForMoveDeleter\n\tgoto FuchsiaCity_House3_EventScript_CancelForgetMove\n\tend\n\nFuchsiaCity_House3_EventScript_ChooseMonForMoveDeleter::\n\tmsgbox FuchsiaCity_House3_Text_WhichMonShouldForgetMove\n\tspecial ChoosePartyMon\n\twaitstate\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, FuchsiaCity_House3_EventScript_CancelForgetMove\n\tspecial IsSelectedMonEgg\n\tgoto_if_eq VAR_RESULT, TRUE, FuchsiaCity_House3_EventScript_CantForgetMoveEgg\n\tspecial GetNumMovesSelectedMonHas\n\tgoto_if_eq VAR_RESULT, 1, FuchsiaCity_House3_EventScript_CantForgetOnlyMove\n\tmsgbox FuchsiaCity_House3_Text_WhichMoveShouldBeForgotten\n\tfadescreen FADE_TO_BLACK\n\tspecial SelectMoveDeleterMove\n\tfadescreen FADE_FROM_BLACK\n\tgoto_if_eq VAR_0x8005, MAX_MON_MOVES, FuchsiaCity_House3_EventScript_ChooseMonForMoveDeleter\n\tspecial BufferMoveDeleterNicknameAndMove\n\tmsgbox FuchsiaCity_House3_Text_MonsMoveShouldBeForgotten, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FuchsiaCity_House3_EventScript_ForgetMove\n\tgoto FuchsiaCity_House3_EventScript_CancelForgetMove\n\tend\n\nFuchsiaCity_House3_EventScript_ForgetMove::\n\tspecial MoveDeleterForgetMove\n\tplayfanfare MUS_MOVE_DELETED\n\twaitfanfare\n\tmsgbox FuchsiaCity_House3_Text_MonHasForgottenMoveCompletely\n\trelease\n\tend\n\nFuchsiaCity_House3_EventScript_CantForgetOnlyMove::\n\tspecial BufferMoveDeleterNicknameAndMove\n\tmsgbox FuchsiaCity_House3_Text_MonOnlyKnowsOneMove\n\trelease\n\tend\n\nFuchsiaCity_House3_EventScript_CantForgetMoveEgg::\n\tmsgbox FuchsiaCity_House3_Text_NoEggShouldKnowMoves\n\trelease\n\tend\n\nFuchsiaCity_House3_EventScript_CancelForgetMove::\n\tmsgbox FuchsiaCity_House3_Text_ComeAgainToForgetOtherMoves\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/FuchsiaCity_House3/text.inc",
    "content": "FuchsiaCity_House3_Text_WouldYouLikeToForgetMove::\n    .string \"Uh…\\n\"\n    .string \"Oh, yes, I'm the MOVE DELETER.\\p\"\n    .string \"I can make POKéMON forget their\\n\"\n    .string \"moves.\\p\"\n    .string \"Would you like me to do that?$\"\n\nFuchsiaCity_House3_Text_WhichMonShouldForgetMove::\n    .string \"Which POKéMON should forget a\\n\"\n    .string \"move?$\"\n\nFuchsiaCity_House3_Text_WhichMoveShouldBeForgotten::\n    .string \"Which move should be forgotten?$\"\n\nFuchsiaCity_House3_Text_MonOnlyKnowsOneMove::\n    .string \"{STR_VAR_1} seems to know only one\\n\"\n    .string \"move…$\"\n\nFuchsiaCity_House3_Text_MonsMoveShouldBeForgotten::\n    .string \"Hm! {STR_VAR_1}'s {STR_VAR_2}?\\n\"\n    .string \"That move should be forgotten?$\"\n\nFuchsiaCity_House3_Text_MonHasForgottenMoveCompletely::\n    .string \"It worked to perfection!\\p\"\n    .string \"{STR_VAR_1} has forgotten\\n\"\n    .string \"{STR_VAR_2} completely.$\"\n\nFuchsiaCity_House3_Text_ComeAgainToForgetOtherMoves::\n    .string \"Come again if there are other\\n\"\n    .string \"moves to be forgotten.$\"\n\nFuchsiaCity_House3_Text_NoEggShouldKnowMoves::\n    .string \"What?\\n\"\n    .string \"No EGG should know any moves.$\"\n\n"
  },
  {
    "path": "data/maps/FuchsiaCity_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_FUCHSIA_CITY_MART\",\n  \"name\": \"FuchsiaCity_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_FUCHSIA_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_Mart_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"x\": 6,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_Mart_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"x\": 9,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_Mart_EventScript_CooltrainerF\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FuchsiaCity_Mart/scripts.inc",
    "content": "FuchsiaCity_Mart_MapScripts::\n\t.byte 0\n\nFuchsiaCity_Mart_EventScript_CooltrainerF::\n\tmsgbox FuchsiaCity_Mart_Text_DidYouTryXSpeed, MSGBOX_NPC\n\tend\n\nFuchsiaCity_Mart_EventScript_Gentleman::\n\tmsgbox FuchsiaCity_Mart_Text_DontTheyHaveSafariZonePennants, MSGBOX_NPC\n\tend\n\nFuchsiaCity_Mart_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart FuchsiaCity_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nFuchsiaCity_Mart_Items::\n\t.2byte ITEM_ULTRA_BALL\n\t.2byte ITEM_GREAT_BALL\n\t.2byte ITEM_SUPER_POTION\n\t.2byte ITEM_REVIVE\n\t.2byte ITEM_FULL_HEAL\n\t.2byte ITEM_MAX_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/FuchsiaCity_Mart/text.inc",
    "content": "FuchsiaCity_Mart_Text_DontTheyHaveSafariZonePennants::\n    .string \"Don't they have any pennants\\n\"\n    .string \"promoting the SAFARI ZONE?\\p\"\n    .string \"How about some paper lanterns?\\n\"\n    .string \"Aren't there even any calendars?$\"\n\nFuchsiaCity_Mart_Text_DidYouTryXSpeed::\n    .string \"Did you try X SPEED?\\n\"\n    .string \"It speeds up a POKéMON in battle.$\"\n\n"
  },
  {
    "path": "data/maps/FuchsiaCity_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_FUCHSIA_CITY_POKEMON_CENTER_1F\",\n  \"name\": \"FuchsiaCity_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_FUCHSIA_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_PokemonCenter_1F_EventScript_Man\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_PokemonCenter_1F_EventScript_CooltrainerF\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_PokemonCenter_1F_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Chansey\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FuchsiaCity_PokemonCenter_1F/scripts.inc",
    "content": ".set LOCALID_CHANSEY_MASTER, 7\n.set TRAINER, VAR_0x8009\n\nFuchsiaCity_PokemonCenter_1F_MapScripts::\nFuchsiaCity_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, FuchsiaCity_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nFuchsiaCity_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_FUCHSIA_CITY\n\tgoto FuchsiaCity_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nFuchsiaCity_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_CHANSEY\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, FuchsiaCity_PokemonCenter_1F_MapScript_ChanseyMasterMovementType\n\tend\n\nFuchsiaCity_PokemonCenter_1F_MapScript_ChanseyMasterMovementType::\n\tsetobjectmovementtype LOCALID_CHANSEY_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nFuchsiaCity_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nFuchsiaCity_PokemonCenter_1F_EventScript_Man::\n\tmsgbox FuchsiaCity_PokemonCenter_1F_Text_CantBecomeGoodTrainerWithOneMon, MSGBOX_NPC\n\tend\n\nFuchsiaCity_PokemonCenter_1F_EventScript_CooltrainerF::\n\tmsgbox FuchsiaCity_PokemonCenter_1F_Text_PokemonLeagueWestOfViridian, MSGBOX_NPC\n\tend\n\nFuchsiaCity_PokemonCenter_1F_EventScript_Youngster::\n\tmsgbox FuchsiaCity_PokemonCenter_1F_Text_VisitSafariZoneForPokedex, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/FuchsiaCity_PokemonCenter_1F/text.inc",
    "content": "FuchsiaCity_PokemonCenter_1F_Text_CantBecomeGoodTrainerWithOneMon::\n    .string \"You can't become a good TRAINER\\n\"\n    .string \"with just one strong POKéMON.\\p\"\n    .string \"But raising many POKéMON evenly\\n\"\n    .string \"is no easy task, either.$\"\n\nFuchsiaCity_PokemonCenter_1F_Text_PokemonLeagueWestOfViridian::\n    .string \"There's a narrow trail west of\\n\"\n    .string \"VIRIDIAN CITY.\\p\"\n    .string \"It goes to the POKéMON LEAGUE HQ.\\n\"\n    .string \"The HQ governs all TRAINERS.$\"\n\nFuchsiaCity_PokemonCenter_1F_Text_VisitSafariZoneForPokedex::\n    .string \"If you're working on a POKéDEX,\\n\"\n    .string \"visit the SAFARI ZONE.\\p\"\n    .string \"All sorts of rare POKéMON breed\\n\"\n    .string \"there.$\"\n\n"
  },
  {
    "path": "data/maps/FuchsiaCity_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_FUCHSIA_CITY_POKEMON_CENTER_2F\",\n  \"name\": \"FuchsiaCity_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_FUCHSIA_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FuchsiaCity_PokemonCenter_2F/scripts.inc",
    "content": "FuchsiaCity_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nFuchsiaCity_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nFuchsiaCity_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nFuchsiaCity_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/FuchsiaCity_SafariZone_Entrance/map.json",
    "content": "{\n  \"id\": \"MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE\",\n  \"name\": \"FuchsiaCity_SafariZone_Entrance\",\n  \"layout\": \"LAYOUT_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_FUCHSIA_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"x\": 7,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_SafariZone_Entrance_EventScript_InfoAttendant\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 4,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"FuchsiaCity_SafariZone_Entrance_EventScript_EntryTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 5,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"FuchsiaCity_SafariZone_Entrance_EventScript_EntryTriggerRight\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"FuchsiaCity_SafariZone_Entrance_EventScript_EntryTriggerLeft\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FuchsiaCity_SafariZone_Entrance/scripts.inc",
    "content": "FuchsiaCity_SafariZone_Entrance_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, FuchsiaCity_SafariZone_Entrance_OnFrame\n\t.byte 0\n\nFuchsiaCity_SafariZone_Entrance_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 1, FuchsiaCity_SafariZone_Entrance_EventScript_ExitWarpIn\n\tmap_script_2 VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 2, FuchsiaCity_SafariZone_Entrance_EventScript_ExitEarly\n\tmap_script_2 VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 3, FuchsiaCity_SafariZone_Entrance_EventScript_ExitWalkIn\n\t.2byte 0\n\n@ When player runs out of balls mid-battle\nFuchsiaCity_SafariZone_Entrance_EventScript_ExitWalkIn::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_ApproachCounter\n\twaitmovement 0\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_CatchFairShareComeAgain\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_Exit2\n\twaitmovement 0\n\tspecial ExitSafariMode\n\tsetvar VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0\n\treleaseall\n\tend\n\n@ When player runs of out balls after catching a pokemon, or runs out of steps\nFuchsiaCity_SafariZone_Entrance_EventScript_ExitWarpIn::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_CatchFairShareComeAgain\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_Exit\n\twaitmovement 0\n\tspecial ExitSafariMode\n\tsetvar VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0\n\treleaseall\n\tend\n\n@ When player re-enters the entrance building with balls/steps remaining\nFuchsiaCity_SafariZone_Entrance_EventScript_ExitEarly::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_GoingToLeaveSafariZoneEarly, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, FuchsiaCity_SafariZone_Entrance_EventScript_ReturnToSafariZone\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_PleaseReturnSafariBalls\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_Exit\n\twaitmovement 0\n\tspecial ExitSafariMode\n\tsetvar VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0\n\treleaseall\n\tend\n\nFuchsiaCity_SafariZone_Entrance_EventScript_ReturnToSafariZone::\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_GoodLuck\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_ReEnter\n\twaitmovement 0\n\twarp MAP_SAFARI_ZONE_CENTER, 26, 30\n\twaitstate\n\tend\n\nFuchsiaCity_SafariZone_Entrance_Movement_Exit::\n\twalk_down\n\twalk_down\n\tstep_end\n\nFuchsiaCity_SafariZone_Entrance_Movement_ReEnter::\n\twalk_up\n\tstep_end\n\nFuchsiaCity_SafariZone_Entrance_Movement_Exit2::\n\twalk_down\n\twalk_down\n\tstep_end\n\nFuchsiaCity_SafariZone_Entrance_Movement_ApproachCounter::\n\twalk_down\n\tdelay_8\n\tstep_end\n\nFuchsiaCity_SafariZone_Entrance_EventScript_EntryTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_2, 0\n\tgoto FuchsiaCity_SafariZone_Entrance_EventScript_AskEnterSafariZone\n\tend\n\nFuchsiaCity_SafariZone_Entrance_EventScript_EntryTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_2, 1\n\tgoto FuchsiaCity_SafariZone_Entrance_EventScript_AskEnterSafariZone\n\tend\n\nFuchsiaCity_SafariZone_Entrance_EventScript_EntryTriggerLeft::\n\tlockall\n\tsetvar VAR_TEMP_2, 2\n\tgoto FuchsiaCity_SafariZone_Entrance_EventScript_AskEnterSafariZone\n\tend\n\nFuchsiaCity_SafariZone_Entrance_EventScript_AskEnterSafariZone::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_WelcomeToSafariZone\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tcall_if_set FLAG_SYS_GAME_CLEAR, FuchsiaCity_SafariZone_Entrance_EventScript_TellExpansion1\n\tshowmoneybox 0, 0\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_PlaySafariGameFor500, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FuchsiaCity_SafariZone_Entrance_EventScript_TryEnterSafariZone\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_OkayPleaseComeAgain\n\tgoto FuchsiaCity_SafariZone_Entrance_EventScript_ForcePlayerBack\n\tend\n\nFuchsiaCity_SafariZone_Entrance_EventScript_TellExpansion1::\n\tcall_if_unset FLAG_TOLD_SAFARI_EXPANSION, FuchsiaCity_SafariZone_Entrance_EventScript_TellExpansion2\n\treturn\n\nFuchsiaCity_SafariZone_Entrance_EventScript_TellExpansion2::\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_TellExpansion\n\tsetflag FLAG_TOLD_SAFARI_EXPANSION\n\treturn\n\nFuchsiaCity_SafariZone_Entrance_Text_TellExpansion::\n\t.string \"I have exciting news!\\n\"\n\t.string \"We've finished an expansion project!\\p\"\n\t.string \"Find the new AREA 4 and 5 to\\n\"\n\t.string \"encounter exotic POKéMON imported\\l\"\n\t.string \"from far away lands!$\"\n\nFuchsiaCity_SafariZone_Entrance_EventScript_TryEnterSafariZone::\n\tcall FuchsiaCity_SafariZone_Entrance_EventScript_CheckSpaceForMons\n\tcheckmoney 500\n\tgoto_if_eq VAR_RESULT, FALSE, FuchsiaCity_SafariZone_Entrance_EventScript_NotEnoughMoney\n\tremovemoney 500\n\tupdatemoneybox\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_ThatllBe500WeOnlyUseSpecialBalls\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage FuchsiaCity_SafariZone_Entrance_Text_PlayerReceived30SafariBalls\n\twaitfanfare\n\tcall EventScript_RestorePrevTextColor\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_CallYouOnPAWhenYouRunOut\n\tclosemessage\n\thidemoneybox\n\tcall_if_eq VAR_TEMP_2, 0, FuchsiaCity_SafariZone_Entrance_EventScript_EnterSafariZoneMid\n\tcall_if_eq VAR_TEMP_2, 1, FuchsiaCity_SafariZone_Entrance_EventScript_EnterSafariZoneRight\n\tcall_if_eq VAR_TEMP_2, 2, FuchsiaCity_SafariZone_Entrance_EventScript_EnterSafariZoneLeft\n\tspecial EnterSafariMode\n\tsetvar VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 2\n\twarp MAP_SAFARI_ZONE_CENTER, 255, 26, 30\n\twaitstate\n\tend\n\nFuchsiaCity_SafariZone_Entrance_EventScript_EnterSafariZoneRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_EnterSafariZoneRight\n\twaitmovement 0\n\treturn\n\nFuchsiaCity_SafariZone_Entrance_EventScript_EnterSafariZoneMid::\n\tapplymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_EnterSafariZoneMid\n\twaitmovement 0\n\treturn\n\nFuchsiaCity_SafariZone_Entrance_EventScript_EnterSafariZoneLeft::\n\tapplymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_EnterSafariZoneLeft\n\twaitmovement 0\n\treturn\n\nFuchsiaCity_SafariZone_Entrance_EventScript_CheckSpaceForMons::\n\tgetpartysize\n\tgoto_if_ne VAR_RESULT, PARTY_SIZE, EventScript_Return\n\tspecialvar VAR_RESULT, IsThereRoomInAnyBoxForMorePokemon\n\tgoto_if_eq VAR_RESULT, TRUE, EventScript_Return\n\tmsgbox SafariZone_Text_ExcuseMeYourPCBoxIsFull\n\tgoto FuchsiaCity_SafariZone_Entrance_EventScript_ForcePlayerBack\n\tend\n\nFuchsiaCity_SafariZone_Entrance_EventScript_NotEnoughMoney::\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_OopsNotEnoughMoney\n\tgoto FuchsiaCity_SafariZone_Entrance_EventScript_ForcePlayerBack\n\tend\n\nFuchsiaCity_SafariZone_Entrance_EventScript_ForcePlayerBack::\n\tclosemessage\n\thidemoneybox\n\tapplymovement OBJ_EVENT_ID_PLAYER, FuchsiaCity_SafariZone_Entrance_Movement_ForceBack\n\twaitmovement 0\n\treleaseall\n\tend\n\nFuchsiaCity_SafariZone_Entrance_Movement_ForceBack::\n\twalk_down\n\tstep_end\n\nFuchsiaCity_SafariZone_Entrance_Movement_EnterSafariZoneMid::\n\twalk_up\n\twalk_up\n\tstep_end\n\nFuchsiaCity_SafariZone_Entrance_Movement_EnterSafariZoneRight::\n\twalk_up\n\twalk_left\n\twalk_up\n\tstep_end\n\nFuchsiaCity_SafariZone_Entrance_Movement_EnterSafariZoneLeft::\n\twalk_up\n\twalk_right\n\twalk_up\n\tstep_end\n\nFuchsiaCity_SafariZone_Entrance_EventScript_InfoAttendant::\n\tlock\n\tfaceplayer\n\tbufferstring 0, FuchsiaCity_SafariZone_Entrance_Text_InfoAttendantFour\n\tcall_if_set FLAG_SYS_GAME_CLEAR, FuchsiaCity_SafariZone_Entrance_EventScript_InfoAttendantBufferSix\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_FirstTimeAtSafariZone, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, FuchsiaCity_SafariZone_Entrance_EventScript_ExplainSafariZone\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_SorryYoureARegularHere\n\trelease\n\tend\n\nFuchsiaCity_SafariZone_Entrance_EventScript_InfoAttendantBufferSix::\n\tbufferstring 0, FuchsiaCity_SafariZone_Entrance_Text_InfoAttendantSix\n\treturn\n\nFuchsiaCity_SafariZone_Entrance_Text_InfoAttendantFour::\n\t.string \"four$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_InfoAttendantSix::\n\t.string \"six$\"\n\nFuchsiaCity_SafariZone_Entrance_EventScript_ExplainSafariZone::\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_ExplainSafariZone\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/FuchsiaCity_SafariZone_Entrance/text.inc",
    "content": "FuchsiaCity_SafariZone_Entrance_Text_WelcomeToSafariZone::\n    .string \"Welcome to the SAFARI ZONE!$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_PlaySafariGameFor500::\n    .string \"For just ¥500, you can play the\\n\"\n    .string \"SAFARI GAME.\\p\"\n    .string \"You can roam the wide-open safari\\n\"\n    .string \"and catch what you like.\\p\"\n    .string \"Would you like to play?$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_ThatllBe500WeOnlyUseSpecialBalls::\n    .string \"That'll be ¥500, please!\\p\"\n    .string \"We only use a special kind of \\n\"\n    .string \"POKé BALLS here.$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_PlayerReceived30SafariBalls::\n    .string \"{PLAYER} received 30 SAFARI BALLS\\n\"\n    .string \"from the attendant.$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_CallYouOnPAWhenYouRunOut::\n    .string \"We'll call you on the PA when you\\n\"\n    .string \"run out of time or SAFARI BALLS.\\p\"\n    .string \"Well, I'll wish you the best of\\n\"\n    .string \"luck!$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_OkayPleaseComeAgain::\n    .string \"Okay.\\n\"\n    .string \"Please come again!$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_OopsNotEnoughMoney::\n    .string \"Oops!\\n\"\n    .string \"Not enough money!$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_GoingToLeaveSafariZoneEarly::\n    .string \"Are you going to leave the\\n\"\n    .string \"SAFARI ZONE early?$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_PleaseReturnSafariBalls::\n    .string \"Please return any SAFARI BALLS\\n\"\n    .string \"you may have left.$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_GoodLuck::\n    .string \"Good luck!$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_CatchFairShareComeAgain::\n    .string \"Did you catch your fair share?\\n\"\n    .string \"Come again!$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_FirstTimeAtSafariZone::\n    .string \"Hi! Is it your first time here at\\n\"\n    .string \"the SAFARI ZONE?$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_ExplainSafariZone::\n    .string \"The SAFARI ZONE actually has\\n\"\n    .string \"{STR_VAR_1} zones in it.\\p\"\n    .string \"Each zone has different kinds of\\n\"\n    .string \"POKéMON, even some rare ones.\\p\"\n    .string \"Use the supplied SAFARI BALLS to\\n\"\n    .string \"catch them.\\p\"\n    .string \"You can also throw BAIT or ROCKS\\n\"\n    .string \"besides the SAFARI BALLS.\\p\"\n    .string \"If you throw BAIT, the POKéMON\\n\"\n    .string \"becomes less likely to flee, but\\l\"\n    .string \"harder to catch.\\p\"\n    .string \"If you throw ROCKS, the POKéMON\\n\"\n    .string \"becomes more likely to flee, but\\l\"\n    .string \"easier to catch.\\p\"\n    .string \"When you run out of time or SAFARI\\n\"\n    .string \"BALLS, it's game over for you!$\"\n\nFuchsiaCity_SafariZone_Entrance_Text_SorryYoureARegularHere::\n    .string \"Sorry, you're a regular here!$\"\n\n"
  },
  {
    "path": "data/maps/FuchsiaCity_SafariZone_Office/map.json",
    "content": "{\n  \"id\": \"MAP_FUCHSIA_CITY_SAFARI_ZONE_OFFICE\",\n  \"name\": \"FuchsiaCity_SafariZone_Office\",\n  \"layout\": \"LAYOUT_FUCHSIA_CITY_SAFARI_ZONE_OFFICE\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_FUCHSIA_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_SafariZone_Office_EventScript_Worker2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"x\": 12,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_SafariZone_Office_EventScript_Worker3\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_SafariZone_Office_EventScript_Worker1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"x\": 10,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_SafariZone_Office_EventScript_Worker4\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FuchsiaCity_SafariZone_Office/scripts.inc",
    "content": "FuchsiaCity_SafariZone_Office_MapScripts::\n\t.byte 0\n\nFuchsiaCity_SafariZone_Office_EventScript_Worker1::\n\tmsgbox FuchsiaCity_SafariZone_Office_Text_NicknamedWardenSlowpoke, MSGBOX_NPC\n\tend\n\nFuchsiaCity_SafariZone_Office_EventScript_Worker2::\n\tmsgbox FuchsiaCity_SafariZone_Office_Text_WardenIsVeryKnowledgeable, MSGBOX_NPC\n\tend\n\nFuchsiaCity_SafariZone_Office_EventScript_Worker3::\n\tmsgbox FuchsiaCity_SafariZone_Office_Text_CouldntUnderstandWarden, MSGBOX_NPC\n\tend\n\nFuchsiaCity_SafariZone_Office_EventScript_Worker4::\n\tmsgbox FuchsiaCity_SafariZone_Office_Text_PrizeInSafariZone, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/FuchsiaCity_SafariZone_Office/text.inc",
    "content": "FuchsiaCity_SafariZone_Office_Text_NicknamedWardenSlowpoke::\n    .string \"We nicknamed the WARDEN\\n\"\n    .string \"“SLOWPOKE.”\\p\"\n    .string \"You know, he has that vacant look\\n\"\n    .string \"like a SLOWPOKE.$\"\n\nFuchsiaCity_SafariZone_Office_Text_WardenIsVeryKnowledgeable::\n    .string \"WARDEN SLOWPOKE is very\\n\"\n    .string \"knowledgeable about POKéMON.\\p\"\n    .string \"He even has some fossils of rare,\\n\"\n    .string \"extinct POKéMON.$\"\n\nFuchsiaCity_SafariZone_Office_Text_CouldntUnderstandWarden::\n    .string \"WARDEN SLOWPOKE came in, but\\n\"\n    .string \"I couldn't understand him.\\p\"\n    .string \"I think he's got a speech problem!$\"\n\nFuchsiaCity_SafariZone_Office_Text_PrizeInSafariZone::\n    .string \"WARDEN SLOWPOKE is running a\\n\"\n    .string \"promotion campaign right now.\\p\"\n    .string \"Try to get to the farthest corner\\n\"\n    .string \"of the SAFARI ZONE.\\p\"\n    .string \"If you can make it, you'll win a\\n\"\n    .string \"very convenient prize.$\"\n\n"
  },
  {
    "path": "data/maps/FuchsiaCity_WardensHouse/map.json",
    "content": "{\n  \"id\": \"MAP_FUCHSIA_CITY_WARDENS_HOUSE\",\n  \"name\": \"FuchsiaCity_WardensHouse\",\n  \"layout\": \"LAYOUT_FUCHSIA_CITY_WARDENS_HOUSE\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_FUCHSIA_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_WardensHouse_EventScript_Warden\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_WardensHouse_EventScript_ItemRareCandy\",\n      \"flag\": \"FLAG_HIDE_FUCHSIA_CITY_WARDENS_HOUSE_RARE_CANDY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FuchsiaCity_WardensHouse_EventScript_PokemonJournalKoga\",\n      \"flag\": \"FLAG_HIDE_FAME_CHECKER_KOGA_JOURNAL\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_FUCHSIA_CITY\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_WardensHouse_EventScript_DisplaySign2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_WardensHouse_EventScript_DisplaySign1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_WardensHouse_EventScript_DisplaySign1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"FuchsiaCity_WardensHouse_EventScript_DisplaySign2\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/FuchsiaCity_WardensHouse/scripts.inc",
    "content": "FuchsiaCity_WardensHouse_MapScripts::\n\t.byte 0\n\nFuchsiaCity_WardensHouse_EventScript_Warden::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_HM04, FuchsiaCity_WardensHouse_EventScript_ExplainStrength\n\tgoto_if_set FLAG_HIDE_SAFARI_ZONE_WEST_GOLD_TEETH, FuchsiaCity_WardensHouse_EventScript_GiveGoldTeeth\n\tmsgbox FuchsiaCity_WardensHouse_Text_HifFuffHefifoo, MSGBOX_YESNO\n\tcall_if_eq VAR_RESULT, YES, FuchsiaCity_WardensHouse_EventScript_WardenYes\n\tcall_if_eq VAR_RESULT, NO, FuchsiaCity_WardensHouse_EventScript_WardenNo\n\trelease\n\tend\n\nFuchsiaCity_WardensHouse_EventScript_GiveGoldTeeth::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_OBTAIN_TMHM\n\tmessage FuchsiaCity_WardensHouse_Text_GaveGoldTeethToWarden\n\twaitmessage\n\twaitfanfare\n\tmsgbox FuchsiaCity_WardensHouse_Text_WardenPoppedInHisTeeth\n\tcall EventScript_RestorePrevTextColor\n\tcheckplayergender\n\tcall_if_eq VAR_RESULT, MALE, FuchsiaCity_WardensHouse_EventScript_WardenThanksMale\n\tcall_if_eq VAR_RESULT, FEMALE, FuchsiaCity_WardensHouse_EventScript_WardenThanksFemale\n\tgiveitem_msg FuchsiaCity_WardensHouse_Text_ReceivedHM04FromWarden, ITEM_HM04\n\tsetflag FLAG_GOT_HM04\n\tremoveitem ITEM_GOLD_TEETH\n\trelease\n\tend\n\nFuchsiaCity_WardensHouse_EventScript_WardenThanksMale::\n\tmsgbox FuchsiaCity_WardensHouse_Text_ThanksSonGiveYouSomething\n\treturn\n\nFuchsiaCity_WardensHouse_EventScript_WardenThanksFemale::\n\tmsgbox FuchsiaCity_WardensHouse_Text_ThanksLassieGiveYouSomething\n\treturn\n\nFuchsiaCity_WardensHouse_EventScript_WardenYes::\n\tmsgbox FuchsiaCity_WardensHouse_Text_AhHowheeHoHoo\n\treturn\n\nFuchsiaCity_WardensHouse_EventScript_WardenNo::\n\tmsgbox FuchsiaCity_WardensHouse_Text_HeOhayHeHaHoo\n\treturn\n\nFuchsiaCity_WardensHouse_EventScript_ExplainStrength::\n\tmsgbox FuchsiaCity_WardensHouse_Text_ExplainStrength\n\trelease\n\tend\n\nFuchsiaCity_WardensHouse_EventScript_DisplaySign1::\n\tmsgbox FuchsiaCity_WardensHouse_Text_MonPhotosFossilsOnDisplay, MSGBOX_SIGN\n\tend\n\nFuchsiaCity_WardensHouse_EventScript_DisplaySign2::\n\tmsgbox FuchsiaCity_WardensHouse_Text_OldMonMerchandiseOnDisplay, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/FuchsiaCity_WardensHouse/text.inc",
    "content": "FuchsiaCity_WardensHouse_Text_HifFuffHefifoo::\n    .string \"WARDEN: Hif fuff hefifoo!\\p\"\n    .string \"Ha lof ha feef ee hafahi ho.\\n\"\n    .string \"Heff hee fwee!$\"\n\nFuchsiaCity_WardensHouse_Text_AhHowheeHoHoo::\n    .string \"Ah howhee ho hoo!\\n\"\n    .string \"Eef ee hafahi ho!$\"\n\nFuchsiaCity_WardensHouse_Text_HeOhayHeHaHoo::\n    .string \"Ha?\\n\"\n    .string \"He ohay heh ha hoo ee haheh!$\"\n\nFuchsiaCity_WardensHouse_Text_GaveGoldTeethToWarden::\n    .string \"{PLAYER} gave the GOLD TEETH\\n\"\n    .string \"to the WARDEN.$\"\n\nFuchsiaCity_WardensHouse_Text_WardenPoppedInHisTeeth::\n    .string \"The WARDEN popped in his teeth!$\"\n\nFuchsiaCity_WardensHouse_Text_ThanksSonGiveYouSomething::\n    .string \"WARDEN: Thanks, son!\\n\"\n    .string \"You're a real lifesaver!\\p\"\n    .string \"No one could understand a word\\n\"\n    .string \"that I said, not a one!\\p\"\n    .string \"I was too ashamed to show my face\\n\"\n    .string \"around the OFFICE, even.\\p\"\n    .string \"Let me give you something for your\\n\"\n    .string \"trouble.$\"\n\nFuchsiaCity_WardensHouse_Text_ThanksLassieGiveYouSomething::\n    .string \"WARDEN: Thank you, lassie!\\n\"\n    .string \"You're a real lifesaver!\\p\"\n    .string \"No one could understand a word\\n\"\n    .string \"that I said, not a one!\\p\"\n    .string \"I was too ashamed to show my face\\n\"\n    .string \"around the OFFICE, even.\\p\"\n    .string \"Let me give you something for your\\n\"\n    .string \"trouble.$\"\n\nFuchsiaCity_WardensHouse_Text_ReceivedHM04FromWarden::\n    .string \"{PLAYER} received HM04\\n\"\n    .string \"from the WARDEN.$\"\n\nFuchsiaCity_WardensHouse_Text_ExplainStrength::\n    .string \"WARDEN: Inside HM04 you'll find\\n\"\n    .string \"STRENGTH.\\p\"\n    .string \"It lets POKéMON move boulders when\\n\"\n    .string \"you're outside of battle.\\p\"\n    .string \"Oh yes, did you find the SECRET\\n\"\n    .string \"HOUSE in the SAFARI ZONE?$\"\n\nFuchsiaCity_WardensHouse_Text_MonPhotosFossilsOnDisplay::\n    .string \"POKéMON photos and fossils are on\\n\"\n    .string \"display.$\"\n\nFuchsiaCity_WardensHouse_Text_OldMonMerchandiseOnDisplay::\n    .string \"Old POKéMON merchandise is on\\n\"\n    .string \"display.$\"\n\n"
  },
  {
    "path": "data/maps/IndigoPlateau_Exterior/map.json",
    "content": "{\n  \"id\": \"MAP_INDIGO_PLATEAU_EXTERIOR\",\n  \"name\": \"IndigoPlateau_Exterior\",\n  \"layout\": \"LAYOUT_INDIGO_PLATEAU_EXTERIOR\",\n  \"music\": \"MUS_VICTORY_ROAD\",\n  \"region_map_section\": \"MAPSEC_INDIGO_PLATEAU\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"map\": \"MAP_ROUTE23\",\n      \"offset\": 0,\n      \"direction\": \"down\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLUE\",\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_CREDITS_RIVAL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PROF_OAK\",\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_CREDITS_OAK\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/IndigoPlateau_Exterior/scripts.inc",
    "content": ".equ LOCALID_RIVAL,    1\n.equ LOCALID_PROF_OAK, 2\n\nIndigoPlateau_Exterior_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, IndigoPlateau_Exterior_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, IndigoPlateau_Exterior_OnFrame\n\t.byte 0\n\nIndigoPlateau_Exterior_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_INDIGO_PLATEAU_EXTERIOR\n\tcall_if_eq VAR_MAP_SCENE_INDIGO_PLATEAU_EXTERIOR, 1, IndigoPlateau_Exterior_EventScript_PlayCreditsMusic\n\tend\n\nIndigoPlateau_Exterior_EventScript_PlayCreditsMusic::\n\tplaybgm MUS_CREDITS, 0\n\treturn\n\nIndigoPlateau_Exterior_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_INDIGO_PLATEAU_EXTERIOR, 1, IndigoPlateau_Exterior_EventScript_Credits\n\t.2byte 0\n\n\n@ After beating the champion, you are warped to the main\n@ entrance of Indigo Plateau. This script starts running\n@ immediately after your walking animation.\n@ The script is timed to the music.\nIndigoPlateau_Exterior_EventScript_Credits::\n\tlockall\n\tdelay 105\n\n\t@ Rival exits building. Spawn a dummy object to lock the camera.\n\topendoor 11, 6\n\twaitdooranim\n\tspecial SpawnCameraObject\n\taddobject LOCALID_RIVAL\n\tapplymovement LOCALID_RIVAL, IndigoPlateau_Exterior_Movement_RivalExitBuilding\n\tapplymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PushPlayerOutOfWay\n\twaitmovement 0\n\tclosedoor 11, 6\n\twaitdooranim\n\n\t@ Rival runs off\n\tapplymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PlayerWatchRivalLeave\n\tapplymovement LOCALID_RIVAL, IndigoPlateau_Exterior_Movement_RivalLeave\n\twaitmovement 0\n\tdelay 100\n\n\t@ Oak exits building\n\topendoor 11, 6\n\twaitdooranim\n\taddobject LOCALID_PROF_OAK\n\tapplymovement LOCALID_PROF_OAK, IndigoPlateau_Exterior_Movement_OakExitBuilding\n\twaitmovement 0\n\tclosedoor 11, 6\n\twaitdooranim\n\tdelay 160\n\n\t@ Oak looks at player, then walks off\n\tapplymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PlayerWatchOakLeave\n\tapplymovement LOCALID_PROF_OAK, IndigoPlateau_Exterior_Movement_OakLeave\n\twaitmovement 0\n\tdelay 100\n\n\t@ Player begin to leave\n\tapplymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PlayerBeginLeave\n\twaitmovement 0\n\tdelay 155\n\tapplymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PlayerFaceLeague\n\twaitmovement 0\n\tdelay 90\n\n\t@ Player runs off\n\tapplymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PlayerTurnAround\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, IndigoPlateau_Exterior_Movement_PlayerLeave\n\twaitmovement 0\n\n\t@ Reset the map state and roll the credits\n\tspecial RemoveCameraObject\n\tsetvar VAR_MAP_SCENE_INDIGO_PLATEAU_EXTERIOR, 0\n\tremoveobject LOCALID_RIVAL\n\tremoveobject LOCALID_PROF_OAK\n\tspecial DoCredits\n\twaitstate\n\treleaseall\n\tend\n\nIndigoPlateau_Exterior_Movement_PlayerLeave::\n\tplayer_run_down\n\tplayer_run_down\n\tplayer_run_down\n\tplayer_run_down\n\tplayer_run_down\n\tplayer_run_down\n\tstep_end\n\n@ Unused\nIndigoPlateau_Exterior_Movement_PlayerExitBuilding::\n\twalk_down\n\twalk_down\n\tstep_end\n\nIndigoPlateau_Exterior_Movement_PlayerWatchRivalLeave::\n\tdelay_16\n\tdelay_4\n\twalk_in_place_faster_down\n\tstep_end\n\nIndigoPlateau_Exterior_Movement_PlayerWatchOakLeave::\n\tdelay_8\n\twalk_in_place_faster_right\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\twalk_in_place_faster_down\n\tstep_end\n\nIndigoPlateau_Exterior_Movement_PlayerBeginLeave::\n\twalk_right\n\tdelay_16\n\twalk_down\n\twalk_down\n\tdelay_16\n\tdelay_16\n\tstep_end\n\nIndigoPlateau_Exterior_Movement_PlayerTurnAround::\n\twalk_in_place_faster_down\n\tstep_end\n\nIndigoPlateau_Exterior_Movement_PushPlayerOutOfWay::\n\tface_right\n\tlock_facing_direction\n\twalk_left\n\tunlock_facing_direction\n\tstep_end\n\nIndigoPlateau_Exterior_Movement_PlayerFaceLeague::\n\twalk_in_place_faster_up\n\tstep_end\n\nIndigoPlateau_Exterior_Movement_RivalLeave::\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\tstep_end\n\nIndigoPlateau_Exterior_Movement_RivalExitBuilding::\n\twalk_fast_down\n\tstep_end\n\nIndigoPlateau_Exterior_Movement_OakLeave::\n\twalk_in_place_faster_left\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\twalk_in_place_faster_down\n\tdelay_16\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nIndigoPlateau_Exterior_Movement_OakExitBuilding::\n\twalk_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/IndigoPlateau_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F\",\n  \"name\": \"IndigoPlateau_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_INDIGO_PLATEAU_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_GYM\",\n  \"region_map_section\": \"MAPSEC_INDIGO_PLATEAU\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_GYM\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"IndigoPlateau_PokemonCenter_1F_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"IndigoPlateau_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GYM_GUY\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"IndigoPlateau_PokemonCenter_1F_EventScript_GymGuy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"IndigoPlateau_PokemonCenter_1F_EventScript_DoorGuard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"IndigoPlateau_PokemonCenter_1F_EventScript_BlackBelt\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"IndigoPlateau_PokemonCenter_1F_EventScript_PokemonJournal\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"IndigoPlateau_PokemonCenter_1F_EventScript_CooltrainerM\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"IndigoPlateau_PokemonCenter_1F_EventScript_PokemonJournal\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"IndigoPlateau_PokemonCenter_1F_EventScript_TeleportGuy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_ABRA\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"IndigoPlateau_PokemonCenter_1F_EventScript_Abra\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_INDIGO_PLATEAU_EXTERIOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_LEAGUE_LORELEIS_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 14,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_INDIGO_PLATEAU_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/IndigoPlateau_PokemonCenter_1F/scripts.inc",
    "content": ".set LOCALID_DOOR_GUARD, 4\n\nIndigoPlateau_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, IndigoPlateau_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nIndigoPlateau_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_INDIGO_PLATEAU\n\tspecialvar VAR_RESULT, IsNationalPokedexEnabled\n\tcall_if_eq VAR_RESULT, TRUE, IndigoPlateau_PokemonCenter_1F_EventScript_CheckBlockDoor\n\tend\n\nIndigoPlateau_PokemonCenter_1F_EventScript_CheckBlockDoor::\n\tgoto_if_set FLAG_SYS_CAN_LINK_WITH_RS, EventScript_Return\n\tsetobjectxyperm LOCALID_DOOR_GUARD, 4, 2\n\treturn\n\nIndigoPlateau_PokemonCenter_1F_EventScript_DoorGuard::\n\tlock\n\tfaceplayer\n\tspecialvar VAR_RESULT, IsNationalPokedexEnabled\n\tgoto_if_eq VAR_RESULT, TRUE, IndigoPlateau_PokemonCenter_1F_EventScript_CheckSeviiIslandComplete\n\tmsgbox IndigoPlateau_PokemonCenter_1F_Text_FaceEliteFourGoodLuck\n\trelease\n\tend\n\nIndigoPlateau_PokemonCenter_1F_EventScript_CheckSeviiIslandComplete::\n\tgoto_if_set FLAG_SYS_CAN_LINK_WITH_RS, IndigoPlateau_PokemonCenter_1F_EventScript_SeviiIslandComplete\n\tmsgbox IndigoPlateau_PokemonCenter_1F_Text_LoreleiIsAbsentClosedForTimeBeing\n\trelease\n\tend\n\nIndigoPlateau_PokemonCenter_1F_EventScript_SeviiIslandComplete::\n\tmsgbox IndigoPlateau_PokemonCenter_1F_Text_FaceEliteFourGoodLuck\n\trelease\n\tend\n\nIndigoPlateau_PokemonCenter_1F_EventScript_GymGuy::\n\tmsgbox IndigoPlateau_PokemonCenter_1F_Text_GymGuyAdvice, MSGBOX_NPC\n\tend\n\nIndigoPlateau_PokemonCenter_1F_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart IndigoPlateau_PokemonCenter_1F_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nIndigoPlateau_PokemonCenter_1F_Items::\n\t.2byte ITEM_ULTRA_BALL\n\t.2byte ITEM_GREAT_BALL\n\t.2byte ITEM_FULL_RESTORE\n\t.2byte ITEM_MAX_POTION\n\t.2byte ITEM_REVIVE\n\t.2byte ITEM_FULL_HEAL\n\t.2byte ITEM_MAX_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nIndigoPlateau_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nIndigoPlateau_PokemonCenter_1F_EventScript_Abra::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_ABRA, 0\n\tmsgbox IndigoPlateau_PokemonCenter_1F_Text_Abra\n\twaitmoncry\n\trelease\n\tend\n\nIndigoPlateau_PokemonCenter_1F_Text_Abra::\n\t.string \"ABRA: Aabra…$\"\n\n\nIndigoPlateau_PokemonCenter_1F_EventScript_TeleportGuy::\n\tlock\n\tfaceplayer\n\tmsgbox IndigoPlateau_PokemonCenter_1F_Text_TeleportGuyAsks, MSGBOX_YESNO\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq IndigoPlateau_PokemonCenter_1F_EventScript_TeleportGuyDeclined\n\tmsgbox IndigoPlateau_PokemonCenter_1F_Text_TeleportGuyYes, MSGBOX_DEFAULT\n\tclosemessage\n\tdelay 30\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_SOUTH\n\twarpteleport MAP_PALLET_TOWN, 255, 6, 8\n\twaitstate\n\tend\n\nIndigoPlateau_PokemonCenter_1F_EventScript_TeleportGuyDeclined::\n\tmsgbox IndigoPlateau_PokemonCenter_1F_Text_TeleportGuyDeclined, MSGBOX_NPC\n\tend\n\nIndigoPlateau_PokemonCenter_1F_Text_TeleportGuyAsks::\n\t.string \"Ah! You're challenging the\\n\"\n\t.string \"ELITE FOUR?\\p\"\n\t.string \"Are you sure you're ready?\\n\"\n\t.string \"If you need to train some more,\\l\"\n\t.string \"my ABRA can help you.\\p\"\n\t.string \"It can TELEPORT you home.\\n\"\n\t.string \"Would you like to go home now?$\"\n\nIndigoPlateau_PokemonCenter_1F_Text_TeleportGuyYes::\n\t.string \"Okay, okay.\\n\"\n\t.string \"Picture your house in your mind…$\"\n\nIndigoPlateau_PokemonCenter_1F_Text_TeleportGuyDeclined::\n\t.string \"Okay, okay.\\n\"\n\t.string \"The best of luck to you!$\"\n"
  },
  {
    "path": "data/maps/IndigoPlateau_PokemonCenter_1F/text.inc",
    "content": "IndigoPlateau_PokemonCenter_1F_Text_GymGuyAdvice::\n    .string \"Yo!\\n\"\n    .string \"Champ in the making!\\p\"\n    .string \"At the POKéMON LEAGUE, you will\\n\"\n    .string \"face the ELITE FOUR all in a row.\\p\"\n    .string \"If you lose, you have to start all\\n\"\n    .string \"over again!\\p\"\n    .string \"This is it!\\n\"\n    .string \"Go for it!$\"\n\nIndigoPlateau_PokemonCenter_1F_Text_FaceEliteFourGoodLuck::\n    .string \"From here on, you face the\\n\"\n    .string \"ELITE FOUR one by one.\\p\"\n    .string \"If you win, a door opens to the\\n\"\n    .string \"next TRAINER. Good luck!$\"\n\nIndigoPlateau_PokemonCenter_1F_Text_LoreleiIsAbsentClosedForTimeBeing::\n    .string \"I am so sorry, but you've wasted\\n\"\n    .string \"your time coming here.\\p\"\n    .string \"LORELEI of the ELITE FOUR is\\n\"\n    .string \"absent, you see.\\p\"\n    .string \"As a result, the POKéMON LEAGUE is\\n\"\n    .string \"closed for the time being.$\"\n\nIndigoPlateau_PokemonCenter_1F_Text_AgathaWhuppedUs::\n    .string \"AGATHA's GHOST-type POKéMON are\\n\"\n    .string \"horrifically terrifying in toughness.\\p\"\n    .string \"I took my FIGHTING-type POKéMON\\n\"\n    .string \"and raised them to the max.\\p\"\n    .string \"I went at AGATHA feeling pretty\\n\"\n    .string \"confident, but she whupped us.\\p\"\n    .string \"That old lady's also got a really\\n\"\n    .string \"short fuse, too.\\p\"\n    .string \"It doesn't take anything to get\\n\"\n    .string \"that scary lady hollering.$\"\n\nIndigoPlateau_PokemonCenter_1F_Text_LancesCousinGymLeaderFarAway::\n    .string \"Maybe becoming an ELITE FOUR\\n\"\n    .string \"member is in the blood.\\p\"\n    .string \"From what I've heard, LANCE has\\n\"\n    .string \"a cousin who's a GYM LEADER\\l\"\n    .string \"somewhere far away.$\"\n\n"
  },
  {
    "path": "data/maps/IndigoPlateau_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_INDIGO_PLATEAU_POKEMON_CENTER_2F\",\n  \"name\": \"IndigoPlateau_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_INDIGO_PLATEAU\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_GYM\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/IndigoPlateau_PokemonCenter_2F/scripts.inc",
    "content": "IndigoPlateau_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nIndigoPlateau_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nIndigoPlateau_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nIndigoPlateau_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/LavenderTown/map.json",
    "content": "{\n  \"id\": \"MAP_LAVENDER_TOWN\",\n  \"name\": \"LavenderTown\",\n  \"layout\": \"LAYOUT_LAVENDER_TOWN\",\n  \"music\": \"MUS_LAVENDER\",\n  \"region_map_section\": \"MAPSEC_LAVENDER_TOWN\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE10\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE12\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE8\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_EventScript_LittleGirl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_EventScript_WorkerM\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_EventScript_Boy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MR_FUJI\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_FujiOutside\",\n      \"flag\": \"FLAG_HIDE_LAVENDER_OUTSIDE_FUJI\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_PSYCHIC_M\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Gastly\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_PSYCHIC_M\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Haunter\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_PSYCHIC_M\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Gengar\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 18,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_POKEMON_TOWER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_LAVENDER_TOWN_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_LAVENDER_TOWN_HOUSE1\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_LAVENDER_TOWN_HOUSE2\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_LAVENDER_TOWN_MART\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"LavenderTown_EventScript_SilphScopeNotice\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"LavenderTown_EventScript_TownSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 21,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"LavenderTown_EventScript_PokemonTowerSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"LavenderTown_EventScript_VolunteerHouseSign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/LavenderTown/scripts.inc",
    "content": ".set LOCALID_GASTLY_MASTER, 5\n.set LOCALID_HAUNTER_MASTER, 6\n.set LOCALID_GENGAR_MASTER, 7\n.set TRAINER, VAR_0x8009\n\nLavenderTown_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, LavenderTown_OnTransition\n\t.byte 0\n\nLavenderTown_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_LAVENDER_TOWN\n\tsetvar VAR_MAP_SCENE_S_S_ANNE_2F_CORRIDOR, 1\n\tsetflag FLAG_HIDE_SS_ANNE_RIVAL\n\tgoto LavenderTown_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nLavenderTown_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_GASTLY\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, LavenderTown_MapScript_GastlyMasterMovementType\n\tsetvar TRAINER, MASTER_HAUNTER\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, LavenderTown_MapScript_HaunterMasterMovementType\n\tsetvar TRAINER, MASTER_GENGAR\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, LavenderTown_MapScript_GengarMasterMovementType\n\tend\n\nLavenderTown_MapScript_GastlyMasterMovementType::\n\tsetobjectmovementtype LOCALID_GASTLY_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nLavenderTown_MapScript_HaunterMasterMovementType::\n\tsetobjectmovementtype LOCALID_HAUNTER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nLavenderTown_MapScript_GengarMasterMovementType::\n\tsetobjectmovementtype LOCALID_GENGAR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nLavenderTown_EventScript_LittleGirl::\n\tlock\n\tfaceplayer\n\tmsgbox LavenderTown_Text_DoYouBelieveInGhosts, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, LavenderTown_EventScript_LittleGirlBelieve\n\tmsgbox LavenderTown_Text_JustImaginingWhiteHand\n\trelease\n\tend\n\nLavenderTown_EventScript_LittleGirlBelieve::\n\tmsgbox LavenderTown_Text_SoThereAreBelievers\n\trelease\n\tend\n\nLavenderTown_EventScript_WorkerM::\n\tmsgbox LavenderTown_Text_TownKnownAsMonGraveSite, MSGBOX_NPC\n\tend\n\nLavenderTown_EventScript_Boy::\n\tmsgbox LavenderTown_Text_GhostsAppearedInTower, MSGBOX_NPC\n\tend\n\nLavenderTown_EventScript_TownSign::\n\tmsgbox LavenderTown_Text_TownSign, MSGBOX_SIGN\n\tend\n\nLavenderTown_EventScript_SilphScopeNotice::\n\tmsgbox LavenderTown_Text_SilphScopeNotice, MSGBOX_SIGN\n\tend\n\nLavenderTown_EventScript_VolunteerHouseSign::\n\tmsgbox LavenderTown_Text_VolunteerPokemonHouse, MSGBOX_SIGN\n\tend\n\nLavenderTown_EventScript_PokemonTowerSign::\n\tmsgbox LavenderTown_Text_PokemonTowerSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/LavenderTown/text.inc",
    "content": "LavenderTown_Text_DoYouBelieveInGhosts::\n    .string \"Do you believe in ghosts?$\"\n\nLavenderTown_Text_SoThereAreBelievers::\n    .string \"Really?\\n\"\n    .string \"So there are believers…$\"\n\nLavenderTown_Text_JustImaginingWhiteHand::\n    .string \"Hahaha, I guess not.\\p\"\n    .string \"That white hand on your shoulder…\\n\"\n    .string \"I'm just imagining it.$\"\n\nLavenderTown_Text_TownKnownAsMonGraveSite::\n    .string \"This town is known as the grave\\n\"\n    .string \"site of POKéMON.\\p\"\n    .string \"Memorial services are held in\\n\"\n    .string \"POKéMON TOWER.$\"\n\nLavenderTown_Text_GhostsAppearedInTower::\n    .string \"Ghosts appeared in POKéMON TOWER.\\p\"\n    .string \"I think they're the spirits of\\n\"\n    .string \"POKéMON that the ROCKETS killed.$\"\n\nLavenderTown_Text_TownSign::\n    .string \"LAVENDER TOWN\\n\"\n    .string \"The Noble Purple Town$\"\n\nLavenderTown_Text_SilphScopeNotice::\n    .string \"New SILPH SCOPE!\\n\"\n    .string \"Make the Invisible Plain to See!\\p\"\n    .string \"SILPH CO.$\"\n\nLavenderTown_Text_VolunteerPokemonHouse::\n    .string \"LAVENDER VOLUNTEER\\n\"\n    .string \"POKéMON HOUSE$\"\n\nLavenderTown_Text_PokemonTowerSign::\n    .string \"POKéMON TOWER\\n\"\n    .string \"Becalm the Spirits of POKéMON$\"\n\n"
  },
  {
    "path": "data/maps/LavenderTown_House1/map.json",
    "content": "{\n  \"id\": \"MAP_LAVENDER_TOWN_HOUSE1\",\n  \"name\": \"LavenderTown_House1\",\n  \"layout\": \"LAYOUT_HOUSE5\",\n  \"music\": \"MUS_LAVENDER\",\n  \"region_map_section\": \"MAPSEC_LAVENDER_TOWN\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_House1_EventScript_CooltrainerF\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUBONE\",\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_House1_EventScript_Cubone\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/LavenderTown_House1/scripts.inc",
    "content": "LavenderTown_House1_MapScripts::\n\t.byte 0\n\nLavenderTown_House1_EventScript_CooltrainerF::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_RESCUED_MR_FUJI, LavenderTown_House1_EventScript_CooltrainerFGhostGone\n\tmsgbox LavenderTown_House1_Text_RocketsKilledCubonesMother\n\trelease\n\tend\n\nLavenderTown_House1_EventScript_CooltrainerFGhostGone::\n\tmsgbox LavenderTown_House1_Text_GhostOfPokemonTowerIsGone\n\trelease\n\tend\n\nLavenderTown_House1_EventScript_Cubone::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_CUBONE, CRY_MODE_NORMAL\n\tmsgbox LavenderTown_House1_Text_Cubone\n\twaitmoncry\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/LavenderTown_House1/text.inc",
    "content": "LavenderTown_House1_Text_Cubone::\n    .string \"CUBONE: Kyarugoo!$\"\n\nLavenderTown_House1_Text_RocketsKilledCubonesMother::\n    .string \"Those horrible ROCKETS!\\n\"\n    .string \"They deserve no mercy!\\p\"\n    .string \"That poor CUBONE's mother…\\p\"\n    .string \"It was killed trying to escape from\\n\"\n    .string \"TEAM ROCKET.$\"\n\nLavenderTown_House1_Text_GhostOfPokemonTowerIsGone::\n    .string \"The ghost of POKéMON TOWER is\\n\"\n    .string \"gone!\\p\"\n    .string \"Someone must have soothed its\\n\"\n    .string \"restless spirit!$\"\n\n"
  },
  {
    "path": "data/maps/LavenderTown_House2/map.json",
    "content": "{\n  \"id\": \"MAP_LAVENDER_TOWN_HOUSE2\",\n  \"name\": \"LavenderTown_House2\",\n  \"layout\": \"LAYOUT_HOUSE5\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_LAVENDER_TOWN\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_House2_EventScript_NameRater\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/LavenderTown_House2/scripts.inc",
    "content": "LavenderTown_House2_MapScripts::\n\t.byte 0\n\nLavenderTown_House2_EventScript_NameRater::\n\tlock\n\tfaceplayer\n\tmsgbox LavenderTown_House2_Text_WantMeToRateNicknames, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, LavenderTown_House2_EventScript_ChooseMon\n\tgoto_if_eq VAR_RESULT, NO, LavenderTown_House2_EventScript_DontRateNickname\n\tend\n\nLavenderTown_House2_EventScript_ChooseMon::\n\tmsgbox LavenderTown_House2_Text_CritiqueWhichMonsNickname\n\tspecial ChoosePartyMon\n\twaitstate\n\tgoto_if_lt VAR_0x8004, PARTY_SIZE, LavenderTown_House2_EventScript_CheckCanRateMon\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, LavenderTown_House2_EventScript_DontRateNickname\n\tend\n\nLavenderTown_House2_EventScript_DontRateNickname::\n\tmsgbox LavenderTown_House2_Text_ISeeComeVisitAgain\n\trelease\n\tend\n\nLavenderTown_House2_EventScript_CheckCanRateMon::\n\tspecialvar VAR_RESULT, GetPartyMonSpecies\n\tgoto_if_eq VAR_RESULT, SPECIES_EGG, LavenderTown_House2_EventScript_CantNicknameEgg\n\tspecial BufferMonNickname\n\tspecial IsMonOTIDNotPlayers\n\tgoto_if_eq VAR_RESULT, TRUE, LavenderTown_House2_EventScript_CantNicknameTradeMon\n\tspecialvar VAR_RESULT, IsMonOTNameNotPlayers\n\tspecial BufferMonNickname\n\tgoto_if_eq VAR_RESULT, TRUE, LavenderTown_House2_EventScript_CantNicknameTradeMon\n\tmsgbox LavenderTown_House2_Text_GiveItANicerName, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, LavenderTown_House2_EventScript_ChooseNewNickname\n\tgoto_if_eq VAR_RESULT, NO, LavenderTown_House2_EventScript_DontRateNickname\n\tend\n\nLavenderTown_House2_EventScript_CantNicknameEgg::\n\tmsgbox LavenderTown_House2_Text_ThatIsMerelyAnEgg\n\trelease\n\tend\n\nLavenderTown_House2_EventScript_CantNicknameTradeMon::\n\tmsgbox LavenderTown_House2_Text_TrulyImpeccableName\n\trelease\n\tend\n\nLavenderTown_House2_EventScript_ChooseNewNickname::\n\tmsgbox LavenderTown_House2_Text_WhatShallNewNicknameBe\n\tcall EventScript_ChangePokemonNickname\n\tspecialvar VAR_RESULT, NameRaterWasNicknameChanged\n\tspecial BufferMonNickname\n\tgoto_if_eq VAR_RESULT, TRUE, LavenderTown_House2_EventScript_ChoseNewNickname\n\tmsgbox LavenderTown_House2_Text_FromNowOnShallBeKnownAsSameName\n\trelease\n\tend\n\nLavenderTown_House2_EventScript_ChoseNewNickname::\n\tmsgbox LavenderTown_House2_Text_FromNowOnShallBeKnownAsName\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/LavenderTown_House2/text.inc",
    "content": "LavenderTown_House2_Text_WantMeToRateNicknames::\n    .string \"Hello, hello!\\n\"\n    .string \"I am the official NAME RATER!\\p\"\n    .string \"Want me to rate the nicknames of\\n\"\n    .string \"your POKéMON?$\"\n\nLavenderTown_House2_Text_CritiqueWhichMonsNickname::\n    .string \"Which POKéMON's nickname should\\n\"\n    .string \"I critique?$\"\n\nLavenderTown_House2_Text_GiveItANicerName::\n    .string \"{STR_VAR_1}, is it?\\n\"\n    .string \"That is a decent nickname!\\p\"\n    .string \"But, would you like me to give it\\n\"\n    .string \"a nicer name?\\p\"\n    .string \"How about it?$\"\n\nLavenderTown_House2_Text_WhatShallNewNicknameBe::\n    .string \"Ah, good. Then, what shall the new\\n\"\n    .string \"nickname be?$\"\n\nLavenderTown_House2_Text_FromNowOnShallBeKnownAsName::\n    .string \"Done! From now on, this POKéMON\\n\"\n    .string \"shall be known as {STR_VAR_1}!\\p\"\n    .string \"It is a better name than before!\\n\"\n    .string \"How fortunate for you!$\"\n\nLavenderTown_House2_Text_ISeeComeVisitAgain::\n    .string \"I see.\\n\"\n    .string \"Do come visit again.$\"\n\nLavenderTown_House2_Text_FromNowOnShallBeKnownAsSameName::\n    .string \"Done! From now on, this POKéMON\\n\"\n    .string \"shall be known as {STR_VAR_1}!\\p\"\n    .string \"It looks no different from before,\\n\"\n    .string \"and yet, this is vastly superior!\\p\"\n    .string \"How fortunate for you!$\"\n\nLavenderTown_House2_Text_TrulyImpeccableName::\n    .string \"{STR_VAR_1}, is it?\\n\"\n    .string \"That is a truly impeccable name!\\p\"\n    .string \"Take good care of {STR_VAR_1}!$\"\n\nLavenderTown_House2_Text_ThatIsMerelyAnEgg::\n    .string \"Now, now.\\n\"\n    .string \"That is merely an EGG!$\"\n\n"
  },
  {
    "path": "data/maps/LavenderTown_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_LAVENDER_TOWN_MART\",\n  \"name\": \"LavenderTown_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_LAVENDER_TOWN\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_Mart_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_Mart_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKER\",\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_Mart_EventScript_Rocker\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"x\": 9,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_Mart_EventScript_Youngster\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/LavenderTown_Mart/scripts.inc",
    "content": "LavenderTown_Mart_MapScripts::\n\t.byte 0\n\nLavenderTown_Mart_EventScript_BaldingMan::\n\tmsgbox LavenderTown_Mart_Text_SearchingForStatRaiseItems, MSGBOX_NPC\n\tend\n\nLavenderTown_Mart_EventScript_Rocker::\n\tmsgbox LavenderTown_Mart_Text_DidYouBuyRevives, MSGBOX_NPC\n\tend\n\nLavenderTown_Mart_EventScript_Youngster::\n\tmsgbox LavenderTown_Mart_Text_TrainerDuosCanChallengeYou, MSGBOX_NPC\n\tend\n\nLavenderTown_Mart_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart LavenderTown_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nLavenderTown_Mart_Items::\n\t.2byte ITEM_GREAT_BALL\n\t.2byte ITEM_SUPER_POTION\n\t.2byte ITEM_REVIVE\n\t.2byte ITEM_ANTIDOTE\n\t.2byte ITEM_PARALYZE_HEAL\n\t.2byte ITEM_BURN_HEAL\n\t.2byte ITEM_ICE_HEAL\n\t.2byte ITEM_ESCAPE_ROPE\n\t.2byte ITEM_SUPER_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/LavenderTown_Mart/text.inc",
    "content": "LavenderTown_Mart_Text_SearchingForStatRaiseItems::\n    .string \"I'm searching for items that raise\\n\"\n    .string \"the stats of POKéMON.\\p\"\n    .string \"They're effective over the course\\n\"\n    .string \"of a single battle.\\p\"\n    .string \"X ATTACK, X DEFEND, X SPEED, \\n\"\n    .string \"and X SPECIAL are what I'm after.\\p\"\n    .string \"Do you know where I can get them?$\"\n\nLavenderTown_Mart_Text_DidYouBuyRevives::\n    .string \"Did you buy some REVIVES?\\n\"\n    .string \"They revive any fainted POKéMON!$\"\n\nLavenderTown_Mart_Text_TrainerDuosCanChallengeYou::\n    .string \"Sometimes, a TRAINER duo will\\n\"\n    .string \"challenge you with two POKéMON\\l\"\n    .string \"at the same time.\\p\"\n    .string \"If that happens, you have to send\\n\"\n    .string \"out two POKéMON to battle, too.$\"\n"
  },
  {
    "path": "data/maps/LavenderTown_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_LAVENDER_TOWN_POKEMON_CENTER_1F\",\n  \"name\": \"LavenderTown_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_LAVENDER_TOWN\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_PokemonCenter_1F_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_PokemonCenter_1F_EventScript_Lass\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_PokemonCenter_1F_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_PokemonCenter_1F_EventScript_BaldingMan\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_LAVENDER_TOWN_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/LavenderTown_PokemonCenter_1F/scripts.inc",
    "content": "LavenderTown_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, LavenderTown_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nLavenderTown_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_LAVENDER_TOWN\n\tend\n\nLavenderTown_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nLavenderTown_PokemonCenter_1F_EventScript_Gentleman::\n\tmsgbox LavenderTown_PokemonCenter_1F_Text_RocketsDoAnythingForMoney, MSGBOX_NPC\n\tend\n\nLavenderTown_PokemonCenter_1F_EventScript_Lass::\n\tmsgbox LavenderTown_PokemonCenter_1F_Text_CubonesMotherKilledByRockets, MSGBOX_NPC\n\tend\n\nLavenderTown_PokemonCenter_1F_EventScript_Youngster::\n\tmsgbox LavenderTown_PokemonCenter_1F_Text_PeoplePayForCuboneSkulls, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/LavenderTown_PokemonCenter_1F/text.inc",
    "content": "LavenderTown_PokemonCenter_1F_Text_RocketsDoAnythingForMoney::\n    .string \"TEAM ROCKET will do anything for\\n\"\n    .string \"the sake of money!\\p\"\n    .string \"There is no job too dirty, no deed\\n\"\n    .string \"too heinous, no crime too wicked!$\"\n\nLavenderTown_PokemonCenter_1F_Text_CubonesMotherKilledByRockets::\n    .string \"I saw CUBONE's mother trying to\\n\"\n    .string \"escape from TEAM ROCKET.\\p\"\n    .string \"She was killed trying to get away…$\"\n\nLavenderTown_PokemonCenter_1F_Text_PeoplePayForCuboneSkulls::\n    .string \"You know how the CUBONE species\\n\"\n    .string \"wears skulls, right?\\p\"\n    .string \"People will pay a lot for one.$\"\n\n"
  },
  {
    "path": "data/maps/LavenderTown_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_LAVENDER_TOWN_POKEMON_CENTER_2F\",\n  \"name\": \"LavenderTown_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_LAVENDER_TOWN\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_LAVENDER_TOWN_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/LavenderTown_PokemonCenter_2F/scripts.inc",
    "content": "LavenderTown_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nLavenderTown_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nLavenderTown_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nLavenderTown_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/LavenderTown_VolunteerPokemonHouse/map.json",
    "content": "{\n  \"id\": \"MAP_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE\",\n  \"name\": \"LavenderTown_VolunteerPokemonHouse\",\n  \"layout\": \"LAYOUT_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE\",\n  \"music\": \"MUS_LAVENDER\",\n  \"region_map_section\": \"MAPSEC_LAVENDER_TOWN\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MR_FUJI\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_VolunteerPokemonHouse_EventScript_MrFuji\",\n      \"flag\": \"FLAG_HIDE_POKEHOUSE_FUJI\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NIDORINO\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_VolunteerPokemonHouse_EventScript_Nidorino\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PSYDUCK\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_VolunteerPokemonHouse_EventScript_Psyduck\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_VolunteerPokemonHouse_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_VolunteerPokemonHouse_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"LavenderTown_VolunteerPokemonHouse_EventScript_LittleGirl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Marowak\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"LavenderTown_VolunteerPokemonHouse_EventScript_PokemonFanMagazine\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"LavenderTown_VolunteerPokemonHouse_EventScript_Bookshelf\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"LavenderTown_VolunteerPokemonHouse_EventScript_Bookshelf\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/LavenderTown_VolunteerPokemonHouse/scripts.inc",
    "content": ".set LOCALID_MAROWAK_MASTER, 7\n.set TRAINER, VAR_0x8009\n\nLavenderTown_VolunteerPokemonHouse_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, LavenderTown_VolunteerPokemonHouse_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nLavenderTown_VolunteerPokemonHouse_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_MAROWAK\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, LavenderTown_VolunteerPokemonHouse_MapScript_MarowakMasterMovementType\n\tend\n\nLavenderTown_VolunteerPokemonHouse_MapScript_MarowakMasterMovementType::\n\tsetobjectmovementtype LOCALID_MAROWAK_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nLavenderTown_VolunteerPokemonHouse_EventScript_MrFuji::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_POKE_FLUTE, LavenderTown_VolunteerPokemonHouse_EventScript_AlreadyHavePokeFlute\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_IdLikeYouToHaveThis\n\tcheckitemspace ITEM_POKE_FLUTE\n\tgoto_if_eq VAR_RESULT, FALSE, LavenderTown_VolunteerPokemonHouse_EventScript_NoRoomForPokeFlute\n\tsetflag FLAG_GOT_POKE_FLUTE\n\tgiveitem_msg LavenderTown_VolunteerPokemonHouse_Text_ReceivedPokeFluteFromMrFuji, ITEM_POKE_FLUTE, 1, MUS_OBTAIN_KEY_ITEM\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_ExplainPokeFlute\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_AlreadyHavePokeFlute::\n\tcheckitem ITEM_OLD_SEA_MAP, 1\n\tgoto_if_eq VAR_RESULT, TRUE, LavenderTown_VolunteerPokemonHouse_EventScript_HaveOldSeaMap\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_HasPokeFluteHelpedYou\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_HaveOldSeaMap::\n\tgoto_if_set FLAG_CAUGHT_MEW, LavenderTown_VolunteerPokemonHouse_EventScript_MewEventFinished\n\tgoto_if_set FLAG_FOUGHT_MEW, LavenderTown_VolunteerPokemonHouse_EventScript_MewCaught\n\tgoto_if_unset FLAG_MEW_FLEW_AWAY, LavenderTown_VolunteerPokemonHouse_EventScript_MewNotEncountered\n\tgoto_if_set FLAG_MEW_FLEW_AWAY, LavenderTown_VolunteerPokemonHouse_EventScript_MewDefeated\nLavenderTown_VolunteerPokemonHouse_EventScript_MewNotEncountered:\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_FindFarawayIsland, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, LavenderTown_VolunteerPokemonHouse_EventScript_MewFoundNo\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_NotEncounteredMew\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_MewDefeated::\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_FoundMew, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, LavenderTown_VolunteerPokemonHouse_EventScript_MewFoundNo\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_DefeatedMew\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_MewCaught::\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_FoundMew, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, LavenderTown_VolunteerPokemonHouse_EventScript_MewFoundNo\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_CaughtMew\n\tsetflag FLAG_CAUGHT_MEW\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_MewEventFinished::\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_HowAreYouAndMew\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_MewFoundNo::\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_AnsweredNo\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_NoRoomForPokeFlute::\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_MustMakeRoomForThis\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_LittleGirl::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_MRFUJI, 0\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_MrFujiLooksAfterOrphanedMons\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_LittleBoy::\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_MonsNiceToHug, MSGBOX_NPC\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_Youngster::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_RESCUED_MR_FUJI, LavenderTown_VolunteerPokemonHouse_EventScript_YoungsterFujiBack\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_WhereDidMrFujiGo\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_YoungsterFujiBack::\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_MrFujiWasPrayingForCubonesMother\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_Nidorino::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_NIDORINO, CRY_MODE_NORMAL\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_Nidorino\n\twaitmoncry\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_Psyduck::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_PSYDUCK, CRY_MODE_NORMAL\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_Psyduck\n\twaitmoncry\n\trelease\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_PokemonFanMagazine::\n\tlockall\n\tfamechecker FAMECHECKER_MRFUJI, 2\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_GrandPrizeDrawingClipped\n\treleaseall\n\tend\n\nLavenderTown_VolunteerPokemonHouse_EventScript_Bookshelf::\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_PokemonMagazinesLineShelf, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/LavenderTown_VolunteerPokemonHouse/text.inc",
    "content": "LavenderTown_PokemonCenter_1F_Text_HearMrFujiNotFromAroundHere::\n    .string \"I recently moved to this town.\\p\"\n    .string \"I hear that MR. FUJI's not from\\n\"\n    .string \"these parts originally, either.$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_WhereDidMrFujiGo::\n    .string \"That's odd, MR. FUJI isn't here.\\n\"\n    .string \"Where'd he go?$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_MrFujiWasPrayingForCubonesMother::\n    .string \"MR. FUJI had been praying alone\\n\"\n    .string \"for CUBONE's mother.$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_MrFujiLooksAfterOrphanedMons::\n    .string \"This is really MR. FUJI's house.\\p\"\n    .string \"He's really kind.\\p\"\n    .string \"He looks after abandoned and\\n\"\n    .string \"orphaned POKéMON.$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_MonsNiceToHug::\n    .string \"It's so warm!\\n\"\n    .string \"POKéMON are so nice to hug.$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_Nidorino::\n    .string \"NIDORINO: Gaoo!$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_Psyduck::\n    .string \"PSYDUCK: Gwappa!$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_IdLikeYouToHaveThis::\n    .string \"MR. FUJI: {PLAYER}…\\p\"\n    .string \"Your POKéDEX quest is one that\\n\"\n    .string \"requires strong dedication.\\p\"\n    .string \"Without deep love for POKéMON,\\n\"\n    .string \"your quest may fail.\\p\"\n    .string \"I'm not sure if this will help you,\\n\"\n    .string \"but I'd like you to have it.$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_ReceivedPokeFluteFromMrFuji::\n    .string \"{PLAYER} received a POKé FLUTE\\n\"\n    .string \"from MR. FUJI.$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_ExplainPokeFlute::\n    .string \"Upon hearing the POKé FLUTE,\\n\"\n    .string \"sleeping POKéMON will spring awake.\\p\"\n    .string \"Try using it on POKéMON that are\\n\"\n    .string \"sleeping obstacles.$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_MustMakeRoomForThis::\n    .string \"You must make room for this!$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_HasPokeFluteHelpedYou::\n    .string \"MR. FUJI: Has my POKé FLUTE\\n\"\n    .string \"helped you?$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_GrandPrizeDrawingClipped::\n    .string \"POKéMON FAN MAGAZINE\\n\"\n    .string \"Monthly Grand Prize Drawing!\\p\"\n    .string \"The application form is…\\p\"\n    .string \"Gone! It's been clipped out.\\n\"\n    .string \"Someone must have applied already.$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_PokemonMagazinesLineShelf::\n    .string \"POKéMON magazines line the shelf.\\p\"\n    .string \"POKéMON INSIDER…\\p\"\n    .string \"POKéMON FAN…$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_FindFarawayIsland::\n    .string \"MR. FUJI: Have you found the\\n\"\n    .string \"island on my OLD SEA MAP?$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_FoundMew::\n    .string \"MR. FUJI: {PLAYER}!\\p\"\n    .string \"Did my OLD SEA MAP help you?\\n\"\n    .string \"Did you find that POKéMON?$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_DefeatedMew::\n    .string \"Ah, so the poor thing fled\\n\"\n    .string \"the moment it saw you.\\p\"\n    .string \"Perhaps some wrongs can never\\n\"\n    .string \"be righted…\\p\"\n    .string \"I must thank you for your kind\\n\"\n    .string \"concern anyway, {PLAYER}.\\p\"\n    .string \"Maybe that POKéMON will return\\n\"\n    .string \"someday…$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_CaughtMew::\n    .string \"You were able to befriend it?\\n\"\n    .string \"Even after all it's been through?\\p\"\n    .string \"Thank you, {PLAYER}!\\p\"\n    .string \"You have eased my mind and\\n\"\n    .string \"calmed that POKéMON's spirit.\\p\"\n    .string \"I'm sure the both of you will\\n\"\n    .string \"become even closer with time.$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_AnsweredNo::\n    .string \"The OLD SEA MAP can show you\\n\"\n    .string \"how to get to the island.\\p\"\n    .string \"A sailor should be able to\\n\"\n    .string \"read it and take you there.\\p\"\n    .string \"You know someone with a boat,\\n\"\n    .string \"Don't you, {PLAYER}?$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_NotEncounteredMew::\n    .string \"Ah, so you haven't found the\\n\"\n    .string \"POKéMON there yet.\\p\"\n    .string \"If I remember correctly, it\\n\"\n    .string \"enjoys playing in the long grass.$\"\n\nLavenderTown_VolunteerPokemonHouse_Text_HowAreYouAndMew::\n    .string \"MR. FUJI: {PLAYER}! Welcome!\\n\"\n    .string \"How are you and MEW doing?$\"\n\n"
  },
  {
    "path": "data/maps/MtEmber_Exterior/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_EXTERIOR\",\n  \"name\": \"MtEmber_Exterior\",\n  \"layout\": \"LAYOUT_MT_EMBER_EXTERIOR\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_VOLCANIC_ASH\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 45,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtEmber_Exterior_EventScript_ExplosionTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 41,\n      \"y\": 40,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtEmber_Exterior_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_MT_EMBER_EXTERIOR_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 42,\n      \"y\": 40,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtEmber_Exterior_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_MT_EMBER_EXTERIOR_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BATTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT\",\n      \"movement_range_x\": 5,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"MtEmber_Exterior_EventScript_Jocelyn\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKEMON_RANGER_M\",\n      \"x\": 15,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"MtEmber_Exterior_EventScript_Logan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKEMON_RANGER_F\",\n      \"x\": 14,\n      \"y\": 42,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"MtEmber_Exterior_EventScript_Beth\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 42,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 45,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 46,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 34,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 39,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 40,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtEmber_Exterior_EventScript_ItemUltraBall\",\n      \"flag\": \"FLAG_HIDE_MT_EMBER_EXTERIOR_ULTRA_BALL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtEmber_Exterior_EventScript_ItemFireStone\",\n      \"flag\": \"FLAG_HIDE_MT_EMBER_EXTERIOR_FIRE_STONE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 48,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtEmber_Exterior_EventScript_ItemDireHit\",\n      \"flag\": \"FLAG_HIDE_MT_EMBER_EXTERIOR_DIRE_HIT\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtEmber_Exterior_EventScript_SkyAttackTutor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 28,\n      \"y\": 48,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ONE_ISLAND_KINDLE_ROAD\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 48,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ONE_ISLAND_KINDLE_ROAD\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_SUMMIT_PATH_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 39,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_SUMMIT_PATH_3F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_SUMMIT\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 42,\n      \"y\": 39,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_1F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 37,\n      \"y\": 43,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_MT_EMBER_EXTERIOR\",\n      \"var_value\": \"1\",\n      \"script\": \"MtEmber_Exterior_EventScript_RocketPasswordScene\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 38,\n      \"y\": 43,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_MT_EMBER_EXTERIOR\",\n      \"var_value\": \"1\",\n      \"script\": \"MtEmber_Exterior_EventScript_RocketPasswordScene\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 39,\n      \"y\": 43,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_MT_EMBER_EXTERIOR\",\n      \"var_value\": \"1\",\n      \"script\": \"MtEmber_Exterior_EventScript_RocketPasswordScene\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 15,\n      \"y\": 46,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"MtEmber_Exterior_EventScript_BoulderShortcutTriggers\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 18,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"item\": \"ITEM_FIRE_STONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_MT_EMBER_EXTERIOR_FIRE_STONE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 8,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ULTRA_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_MT_EMBER_EXTERIOR_ULTRA_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_Exterior/scripts.inc",
    "content": ".set LOCALID_GRUNT1, 2\n.set LOCALID_GRUNT2, 3\n\nMtEmber_Exterior_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, MtEmber_Exterior_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, MtEmber_Exterior_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, MtEmber_Exterior_OnLoad\n\t.byte 0\n\nMtEmber_Exterior_OnResume:\n\tsetstepcallback STEP_CB_ASH\n\tend\n\nMtEmber_Exterior_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_MT_EMBER_EXTERIOR\n\tcall_if_eq VAR_MAP_SCENE_MT_EMBER_EXTERIOR, 2, MtEmber_Exterior_EventScript_RocketsFaceDown\n\tend\n\nMtEmber_Exterior_EventScript_RocketsFaceDown::\n\tsetobjectmovementtype LOCALID_GRUNT1, MOVEMENT_TYPE_FACE_DOWN\n\tsetobjectmovementtype LOCALID_GRUNT2, MOVEMENT_TYPE_FACE_DOWN\n\treturn\n\nMtEmber_Exterior_OnLoad::\n\tcall_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 4, MtEmber_Exterior_EventScript_OpenCave\n\tcall_if_set FLAG_MT_EMBER_BOULDER_SHORTCUTS, MtEmber_Exterior_EventScript_MoveBoulders\n\tend\n\nMtEmber_Exterior_EventScript_OpenCave::\n\tsetmetatile 42, 39, METATILE_MtEmber_CaveEntrance, 0\n\treturn\n\nMtEmber_Exterior_EventScript_MoveBoulders::\n\tsetobjectxyperm 9, 17, 45\n\tsetobjectxyperm 10, 13, 46\n\tsetvar VAR_TEMP_0, 1\n\treturn\n\nMtEmber_Exterior_EventScript_Grunt1::\n\tlock\n\tgoto_if_defeated TRAINER_TEAM_ROCKET_GRUNT_43, MtEmber_Exterior_EventScript_Grunt1Defeated\n\tgoto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 4, MtEmber_Exterior_EventScript_BattleGrunt1\n\tmsgbox MtEmber_Exterior_Text_WellTryDiggingHere\n\trelease\n\tend\n\nMtEmber_Exterior_EventScript_Grunt1Defeated::\n\tmsgbox MtEmber_Exterior_Text_Grunt1PostBattle\n\trelease\n\tend\n\nMtEmber_Exterior_EventScript_BattleGrunt1::\n\tapplymovement LOCALID_GRUNT1, Common_Movement_FacePlayer\n\twaitmovement 0\n\tplaybgm MUS_ENCOUNTER_ROCKET, 0\n\tmsgbox MtEmber_Exterior_Text_Grunt1Intro\n\ttrainerbattle_no_intro TRAINER_TEAM_ROCKET_GRUNT_43, MtEmber_Exterior_Text_Grunt1Defeat\n\tmsgbox MtEmber_Exterior_Text_Grunt1PostBattle\n\tgoto_if_defeated TRAINER_TEAM_ROCKET_GRUNT_44, MtEmber_Exterior_EventScript_DefeatedBothGrunts\n\trelease\n\tend\n\nMtEmber_Exterior_EventScript_DefeatedBothGrunts::\n\tmsgbox MtEmber_Exterior_Text_WellRegroupDontStepInsideThere\n\tclosemessage\n\tfadescreen FADE_TO_BLACK\n\tremoveobject LOCALID_GRUNT1\n\tremoveobject LOCALID_GRUNT2\n\tfadescreen FADE_FROM_BLACK\n\trelease\n\tend\n\nMtEmber_Exterior_EventScript_Grunt2::\n\tlock\n\tfaceplayer\n\tgoto_if_defeated TRAINER_TEAM_ROCKET_GRUNT_44, MtEmber_Exterior_EventScript_DefeatedGrunt2\n\tgoto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 4, MtEmber_Exterior_EventScript_BattleGrunt2\n\tmsgbox MtEmber_Exterior_Text_YoureInTheWayGetLost\n\tclosemessage\n\tapplymovement LOCALID_GRUNT2, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nMtEmber_Exterior_EventScript_DefeatedGrunt2::\n\tmsgbox MtEmber_Exterior_Text_Grunt2PostBattle\n\trelease\n\tend\n\nMtEmber_Exterior_EventScript_BattleGrunt2::\n\tplaybgm MUS_ENCOUNTER_ROCKET, 0\n\tmsgbox MtEmber_Exterior_Text_Grunt2Intro\n\ttrainerbattle_no_intro TRAINER_TEAM_ROCKET_GRUNT_44, MtEmber_Exterior_Text_Grunt2Defeat\n\tmsgbox MtEmber_Exterior_Text_Grunt2PostBattle\n\tgoto_if_defeated TRAINER_TEAM_ROCKET_GRUNT_43, MtEmber_Exterior_EventScript_DefeatedBothGrunts\n\trelease\n\tend\n\nMtEmber_Exterior_EventScript_RocketPasswordScene::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox MtEmber_Exterior_Text_PunchedThroughAtLast\n\tmessage MtEmber_Exterior_Text_WhatsPasswordAgain\n\twaitmessage\n\tplayse SE_PIN\n\tapplymovement LOCALID_GRUNT2, Common_Movement_QuestionMark\n\twaitmovement 0\n\twaitbuttonpress\n\tmsgbox MtEmber_Exterior_Text_FirstPasswordGoldeen\n\tapplymovement LOCALID_GRUNT1, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tplayse SE_PIN\n\tapplymovement LOCALID_GRUNT1, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_GRUNT1, Common_Movement_Delay48\n\twaitmovement 0\n\tapplymovement LOCALID_GRUNT2, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tcall MtEmber_Exterior_EventScript_RocketsFaceDown\n\tmsgbox MtEmber_Exterior_Text_SnoopsBeenListeningIn\n\tsetvar VAR_MAP_SCENE_MT_EMBER_EXTERIOR, 2\n\treleaseall\n\tend\n\nMtEmber_Exterior_EventScript_Logan::\n\ttrainerbattle_single TRAINER_PKMN_RANGER_LOGAN, MtEmber_Exterior_Text_LoganIntro, MtEmber_Exterior_Text_LoganDefeat\n\tmsgbox MtEmber_Exterior_Text_LoganPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nMtEmber_Exterior_EventScript_Beth::\n\ttrainerbattle_single TRAINER_PKMN_RANGER_BETH, MtEmber_Exterior_Text_BethIntro, MtEmber_Exterior_Text_BethDefeat\n\tmsgbox MtEmber_Exterior_Text_BethPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nMtEmber_Exterior_EventScript_Jocelyn::\n\ttrainerbattle_single TRAINER_CRUSH_GIRL_JOCELYN, MtEmber_Exterior_Text_JocelynIntro, MtEmber_Exterior_Text_JocelynDefeat\n\tmsgbox MtEmber_Exterior_Text_JocelynPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nMtEmber_Exterior_EventScript_BoulderShortcutTriggers::\n\tsetflag FLAG_MT_EMBER_BOULDER_SHORTCUTS\n\tsetvar VAR_TEMP_0, 1\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/MtEmber_Exterior/text.inc",
    "content": "Text_ExplosionTeach::\n    .string \"Can you imagine?\\n\"\n    .string \"If this volcano were to erupt?\\p\"\n    .string \"The explosion would be the end of\\n\"\n    .string \"us. How terrifying is that?\\p\"\n    .string \"While we're terrified, would you\\n\"\n    .string \"like me to teach EXPLOSION?$\"\n\nText_ExplosionDeclined::\n    .string \"Yeah, you're right.\\n\"\n    .string \"It is too terrifying.$\"\n\nText_ExplosionWhichMon::\n    .string \"You're terribly brave!\\p\"\n    .string \"Which POKéMON should I teach\\n\"\n    .string \"EXPLOSION?$\"\n\nText_ExplosionTaught::\n    .string \"Using EXPLOSION while on this\\n\"\n    .string \"volcano…\\p\"\n    .string \"What a terrifying thrill!$\"\n\nText_ExplosionReteach::\n    .string \"This volcano is still active\\n\"\n    .string \"but you came back?\\p\"\n    .string \"So, you like the thrill of\\n\"\n    .string \"risking a volcanic explosion too?$\"\n\nText_ExplosionReteach2::\n    .string \"If you want more thrills, I can\\n\"\n    .string \"teach you EXPLOSION for ¥5000.$\"\n\nText_ExplosionNotEnoughMoney::\n    .string \"You don't have enough money!\\p\"\n    .string \"You know, if this mountain explodes\\n\"\n    .string \"with us on it, we wouldn't need\\l\"\n    .string \"money anymore…\\p\"\n    .string \"Until that happens, I won't teach\\n\"\n    .string \"you EXPLOSION without ¥5000!$\"\n\nMtEmber_Exterior_Text_WellTryDiggingHere::\n    .string \"Over here.\\n\"\n    .string \"We'll try digging here.\\p\"\n    .string \"That treasure the ADMINS've been\\n\"\n    .string \"talking about should be here.$\"\n\nMtEmber_Exterior_Text_YoureInTheWayGetLost::\n    .string \"What the…?\\n\"\n    .string \"You're in the way. Get lost.$\"\n\nMtEmber_Exterior_Text_PunchedThroughAtLast::\n    .string \"Whew, punched through at last.\\n\"\n    .string \"Let's go treasure hunting!$\"\n\nMtEmber_Exterior_Text_WhatsPasswordAgain::\n    .string \"Any treasure we find, we haul back\\n\"\n    .string \"to the WAREHOUSE, understood?\\p\"\n    .string \"…Oh, and what're the passwords?\\n\"\n    .string \"At the ROCKET WAREHOUSE, I mean.$\"\n\nMtEmber_Exterior_Text_FirstPasswordGoldeen::\n    .string \"What, you forgot the password?\\n\"\n    .string \"There're actually two.\\p\"\n    .string \"The first one's “GOLDEEN need\\n\"\n    .string \"log.”\\p\"\n    .string \"And the second one is…$\"\n\nMtEmber_Exterior_Text_SnoopsBeenListeningIn::\n    .string \"Hey!\\n\"\n    .string \"This snoop's been listening in!$\"\n\nMtEmber_Exterior_Text_Grunt1Intro::\n    .string \"You've been eavesdropping on us,\\n\"\n    .string \"haven't you?$\"\n\nMtEmber_Exterior_Text_Grunt1Defeat::\n    .string \"Huh, what?$\"\n\nMtEmber_Exterior_Text_Grunt1PostBattle::\n    .string \"Why'd you have to win?$\"\n\nMtEmber_Exterior_Text_Grunt2Intro::\n    .string \"Trying to horn in on our treasure?\\n\"\n    .string \"Don't bet on it!$\"\n\nMtEmber_Exterior_Text_Grunt2Defeat::\n    .string \"Wait!\\n\"\n    .string \"But how?$\"\n\nMtEmber_Exterior_Text_Grunt2PostBattle::\n    .string \"Develop amnesia conveniently and\\n\"\n    .string \"forget everything you heard!$\"\n\nMtEmber_Exterior_Text_WellRegroupDontStepInsideThere::\n    .string \"What a setback…\\n\"\n    .string \"We'll have to regroup.\\p\"\n    .string \"You! Don't even think about taking\\n\"\n    .string \"a step inside here!\\p\"\n    .string \"If you know what's good for you,\\n\"\n    .string \"don't even think about this!$\"\n\nMtEmber_Exterior_Text_LoganIntro::\n    .string \"An active volcano is one that's\\n\"\n    .string \"erupting, or about to.$\"\n\nMtEmber_Exterior_Text_LoganDefeat::\n    .string \"Whew… That was hot!\\n\"\n    .string \"Sweat's erupting from me!$\"\n\nMtEmber_Exterior_Text_LoganPostBattle::\n    .string \"They say there're over 1,500\\n\"\n    .string \"active volcanoes in the world.\\p\"\n    .string \"Just thinking about them makes me\\n\"\n    .string \"feel all hot and gooey inside!$\"\n\nMtEmber_Exterior_Text_BethIntro::\n    .string \"Do you know how caves form inside\\n\"\n    .string \"volcanoes?$\"\n\nMtEmber_Exterior_Text_BethDefeat::\n    .string \"Atchah!\\n\"\n    .string \"You're shockingly good!$\"\n\nMtEmber_Exterior_Text_BethPostBattle::\n    .string \"When lava at the surface of magma\\n\"\n    .string \"hardens, and the magma inside flows\\l\"\n    .string \"out, caverns are left behind.$\"\n\nMtEmber_Exterior_Text_JocelynIntro::\n    .string \"I've been in training so I can mend\\n\"\n    .string \"my broken heart…\\p\"\n    .string \"It toughened me up physically at\\n\"\n    .string \"least! Hi-yah!$\"\n\nMtEmber_Exterior_Text_JocelynDefeat::\n    .string \"I think I tried to overdo it…$\"\n\nMtEmber_Exterior_Text_JocelynPostBattle::\n    .string \"The way you battle, it reminds me\\n\"\n    .string \"of the guy who dumped me…$\"\n\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_1F/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_RUBY_PATH_1F\",\n  \"name\": \"MtEmber_RubyPath_1F\",\n  \"layout\": \"LAYOUT_MT_EMBER_RUBY_PATH_1F\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 22,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_EXTERIOR\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 24,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B2F_STAIRS\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_1F/scripts.inc",
    "content": "MtEmber_RubyPath_1F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_RUBY_PATH_B1F\",\n  \"name\": \"MtEmber_RubyPath_B1F\",\n  \"layout\": \"LAYOUT_MT_EMBER_RUBY_PATH_B1F\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 9,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B1F/scripts.inc",
    "content": "MtEmber_RubyPath_B1F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B1F_Stairs/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_RUBY_PATH_B1F_STAIRS\",\n  \"name\": \"MtEmber_RubyPath_B1F_Stairs\",\n  \"layout\": \"LAYOUT_MT_EMBER_RUBY_PATH_B1F_STAIRS\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B3F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B2F_STAIRS\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B1F_Stairs/scripts.inc",
    "content": "MtEmber_RubyPath_B1F_Stairs_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B2F/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_RUBY_PATH_B2F\",\n  \"name\": \"MtEmber_RubyPath_B2F\",\n  \"layout\": \"LAYOUT_MT_EMBER_RUBY_PATH_B2F\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B3F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B2F/scripts.inc",
    "content": "MtEmber_RubyPath_B2F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B2F_Stairs/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_RUBY_PATH_B2F_STAIRS\",\n  \"name\": \"MtEmber_RubyPath_B2F_Stairs\",\n  \"layout\": \"LAYOUT_MT_EMBER_RUBY_PATH_B2F_STAIRS\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B1F_STAIRS\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_1F\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B2F_Stairs/scripts.inc",
    "content": "MtEmber_RubyPath_B2F_Stairs_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B3F/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_RUBY_PATH_B3F\",\n  \"name\": \"MtEmber_RubyPath_B3F\",\n  \"layout\": \"LAYOUT_MT_EMBER_RUBY_PATH_B3F\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B1F_STAIRS\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B4F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B3F/scripts.inc",
    "content": ".set LOCALID_RUBY, 1\n\nMtEmber_RubyPath_B3F_MapScripts::\n\t.byte 0\n\n@ Odd that this is here and not in MtEmber_RubyPath_B5F/scripts.inc\nMtEmber_RubyPath_B5F_EventScript_Ruby::\n\tlock\n\tfaceplayer\n\tsetflag FLAG_GOT_RUBY\n\tclearflag FLAG_HIDE_SCOTT\n\tremoveobject LOCALID_RUBY\n\tgiveitem_msg MtEmber_RubyPath_B3F_Text_FoundARuby, ITEM_RUBY, 1, MUS_OBTAIN_KEY_ITEM\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B3F/text.inc",
    "content": "MtEmber_RubyPath_B3F_Text_FoundARuby::\n    .string \"{PLAYER} found a RUBY!$\"\n\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B4F/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_RUBY_PATH_B4F\",\n  \"name\": \"MtEmber_RubyPath_B4F\",\n  \"layout\": \"LAYOUT_MT_EMBER_RUBY_PATH_B4F\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 14,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B5F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B3F\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleABC\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleABC\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleABC\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleGHI\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleGHI\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleGHI\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleMNO\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleMNO\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleMNO\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleTUV\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleTUV\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleTUV\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleDEF\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleDEF\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleDEF\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleJKL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleJKL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleJKL\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BraillePQRS\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BraillePeriod\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleComma\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BraillePQRS\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BraillePQRS\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleWXYZ\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleWXYZ\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B4F_EventScript_BrailleWXYZ\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B4F/scripts.inc",
    "content": "MtEmber_RubyPath_B4F_MapScripts::\n\t.byte 0\n\nMtEmber_RubyPath_B4F_EventScript_BrailleABC::\n\tlockall\n\tbraillemessage Braille_Text_ABC\n\twaitbuttonpress\n\treleaseall\n\tend\n\nMtEmber_RubyPath_B4F_EventScript_BrailleGHI::\n\tlockall\n\tbraillemessage Braille_Text_GHI\n\twaitbuttonpress\n\treleaseall\n\tend\n\nMtEmber_RubyPath_B4F_EventScript_BrailleMNO::\n\tlockall\n\tbraillemessage Braille_Text_MNO\n\twaitbuttonpress\n\treleaseall\n\tend\n\nMtEmber_RubyPath_B4F_EventScript_BrailleTUV::\n\tlockall\n\tbraillemessage Braille_Text_TUV\n\twaitbuttonpress\n\treleaseall\n\tend\n\nMtEmber_RubyPath_B4F_EventScript_BrailleDEF::\n\tlockall\n\tbraillemessage Braille_Text_DEF\n\twaitbuttonpress\n\treleaseall\n\tend\n\nMtEmber_RubyPath_B4F_EventScript_BrailleJKL::\n\tlockall\n\tbraillemessage Braille_Text_JKL\n\twaitbuttonpress\n\treleaseall\n\tend\n\nMtEmber_RubyPath_B4F_EventScript_BraillePQRS::\n\tlockall\n\tbraillemessage Braille_Text_PQRS\n\twaitbuttonpress\n\treleaseall\n\tend\n\nMtEmber_RubyPath_B4F_EventScript_BrailleWXYZ::\n\tlockall\n\tbraillemessage Braille_Text_WXYZ\n\twaitbuttonpress\n\treleaseall\n\tend\n\nMtEmber_RubyPath_B4F_EventScript_BraillePeriod::\n\tlockall\n\tbraillemessage Braille_Text_Period\n\twaitbuttonpress\n\treleaseall\n\tend\n\nMtEmber_RubyPath_B4F_EventScript_BrailleComma::\n\tlockall\n\tbraillemessage Braille_Text_Comma\n\twaitbuttonpress\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B5F/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_RUBY_PATH_B5F\",\n  \"name\": \"MtEmber_RubyPath_B5F\",\n  \"layout\": \"LAYOUT_MT_EMBER_RUBY_PATH_B5F\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_RUBY\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtEmber_RubyPath_B5F_EventScript_Ruby\",\n      \"flag\": \"FLAG_HIDE_RUBY\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_RUBY_PATH_B4F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"MtEmber_RubyPath_B5F_EventScript_BrailleMessage\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_RubyPath_B5F/scripts.inc",
    "content": "MtEmber_RubyPath_B5F_MapScripts::\n\t.byte 0\n\nMtEmber_RubyPath_B5F_EventScript_BrailleMessage::\n\tlockall\n\tsetvar VAR_0x8005, 130\n\tbraillemessage_wait Braille_Text_Everything\n\tbraillemessage_wait Braille_Text_HasMeaning1\n\tbraillemessage_wait Braille_Text_Existence\n\tbraillemessage_wait Braille_Text_HasMeaning2\n\tbraillemessage_wait Braille_Text_BeingAlive\n\tbraillemessage_wait Braille_Text_HasMeaning3\n\tbraillemessage_wait Braille_Text_HaveDreams\n\tbraillemessage Braille_Text_UsePower\n\twaitbuttonpress\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/MtEmber_Summit/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_SUMMIT\",\n  \"name\": \"MtEmber_Summit\",\n  \"layout\": \"LAYOUT_MT_EMBER_SUMMIT\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_VOLCANIC_ASH\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MOLTRES\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtEmber_Summit_EventScript_Moltres\",\n      \"flag\": \"FLAG_HIDE_MOLTRES\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 9,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_EXTERIOR\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_Summit/scripts.inc",
    "content": "MtEmber_Summit_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, MtEmber_Summit_OnTransition\n\tmap_script MAP_SCRIPT_ON_RESUME, MtEmber_Summit_OnResume\n\t.byte 0\n\nMtEmber_Summit_OnResume::\n\tcall_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, MtEmber_Summit_EventScript_TryRemoveMoltres\n\tend\n\nMtEmber_Summit_EventScript_TryRemoveMoltres::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return\n\tremoveobject VAR_LAST_TALKED\n\treturn\n\nMtEmber_Summit_OnTransition::\n\tcall_if_set FLAG_FOUGHT_MOLTRES, MtEmber_Summit_EventScript_HideMoltres\n\tcall_if_unset FLAG_FOUGHT_MOLTRES, MtEmber_Summit_EventScript_TryShowMoltres\n\tend\n\nMtEmber_Summit_EventScript_TryShowMoltres::\n\tgoto_if_set FLAG_MOLTRES_FLEW_AWAY, EventScript_Return\n\tclearflag FLAG_HIDE_MOLTRES\n\treturn\n\nMtEmber_Summit_EventScript_HideMoltres::\n\tsetflag FLAG_HIDE_MOLTRES\n\treturn\n\nMtEmber_Summit_EventScript_Moltres::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tsetwildbattle SPECIES_MOLTRES, 50\n\twaitse\n\tplaymoncry SPECIES_MOLTRES, CRY_MODE_ENCOUNTER\n\tmessage Text_Gyaoo\n\twaitmessage\n\twaitmoncry\n\tdelay 10\n\tplaybgm MUS_ENCOUNTER_GYM_LEADER, 0\n\twaitbuttonpress\n\tsetflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecial StartLegendaryBattle\n\twaitstate\n\tclearflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_WON, MtEmber_Summit_EventScript_DefeatedMoltres\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_RAN, MtEmber_Summit_EventScript_RanFromMoltres\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, MtEmber_Summit_EventScript_RanFromMoltres\n\tsetflag FLAG_FOUGHT_MOLTRES\n\trelease\n\tend\n\nMtEmber_Summit_EventScript_DefeatedMoltres::\n\tsetflag FLAG_MOLTRES_FLEW_AWAY\n\tsetvar VAR_0x8004, SPECIES_MOLTRES\n\tgoto EventScript_MonFlewAway\n\tend\n\nMtEmber_Summit_EventScript_RanFromMoltres::\n\tsetvar VAR_0x8004, SPECIES_MOLTRES\n\tgoto EventScript_MonFlewAway\n\tend\n"
  },
  {
    "path": "data/maps/MtEmber_SummitPath_1F/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_SUMMIT_PATH_1F\",\n  \"name\": \"MtEmber_SummitPath_1F\",\n  \"layout\": \"LAYOUT_MT_EMBER_SUMMIT_PATH_1F\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_EXTERIOR\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_SUMMIT_PATH_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_SummitPath_1F/scripts.inc",
    "content": "MtEmber_SummitPath_1F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/MtEmber_SummitPath_2F/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_SUMMIT_PATH_2F\",\n  \"name\": \"MtEmber_SummitPath_2F\",\n  \"layout\": \"LAYOUT_MT_EMBER_SUMMIT_PATH_2F\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 38,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_18\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_19\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1A\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 39,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_SUMMIT_PATH_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 39,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_SUMMIT_PATH_3F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_SummitPath_2F/scripts.inc",
    "content": "MtEmber_SummitPath_2F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/MtEmber_SummitPath_3F/map.json",
    "content": "{\n  \"id\": \"MAP_MT_EMBER_SUMMIT_PATH_3F\",\n  \"name\": \"MtEmber_SummitPath_3F\",\n  \"layout\": \"LAYOUT_MT_EMBER_SUMMIT_PATH_3F\",\n  \"music\": \"MUS_MT_CHIMNEY\",\n  \"region_map_section\": \"MAPSEC_MT_EMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_SUMMIT_PATH_2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_EMBER_EXTERIOR\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/MtEmber_SummitPath_3F/scripts.inc",
    "content": "MtEmber_SummitPath_3F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/MtMoon_1F/map.json",
    "content": "{\n  \"id\": \"MAP_MT_MOON_1F\",\n  \"name\": \"MtMoon_1F\",\n  \"layout\": \"LAYOUT_MT_MOON_1F\",\n  \"music\": \"MUS_MT_MOON\",\n  \"region_map_section\": \"MAPSEC_MT_MOON\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"x\": 20,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"MtMoon_1F_EventScript_Iris\",\n      \"flag\": \"0\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"x\": 36,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"MtMoon_1F_EventScript_Robby\",\n      \"flag\": \"0\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"x\": 30,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"MtMoon_1F_EventScript_Jovan\",\n      \"flag\": \"0\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"x\": 33,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP\",\n      \"movement_range_x\": 5,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"MtMoon_1F_EventScript_Miriam\",\n      \"flag\": \"0\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"x\": 7,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"MtMoon_1F_EventScript_Kent\",\n      \"flag\": \"0\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"x\": 13,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"MtMoon_1F_EventScript_Josh\",\n      \"flag\": \"0\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"x\": 7,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"MtMoon_1F_EventScript_Marcos\",\n      \"flag\": \"0\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 2,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_1F_EventScript_ItemParalyzeHeal\",\n      \"flag\": \"FLAG_HIDE_MT_MOON_1F_PARALYZE_HEAL\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 11,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_1F_EventScript_ItemTM09\",\n      \"flag\": \"FLAG_HIDE_MT_MOON_1F_TM09\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 26,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_1F_EventScript_ItemPotion\",\n      \"flag\": \"FLAG_HIDE_MT_MOON_1F_POTION\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 42,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_1F_EventScript_ItemRareCandy\",\n      \"flag\": \"FLAG_HIDE_MT_MOON_1F_RARE_CANDY\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 44,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_1F_EventScript_ItemEscapeRope\",\n      \"flag\": \"FLAG_HIDE_MT_MOON_1F_ESCAPE_ROPE\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_1F_EventScript_ItemMoonStone\",\n      \"flag\": \"FLAG_HIDE_MT_MOON_1F_MOON_STONE\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 42,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_1F_EventScript_BaldingMan\",\n      \"flag\": \"0\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BUG_CATCHER\",\n      \"x\": 44,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Paras\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\",\n      \"in_connection\": false\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_B1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_B1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_B1F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 37,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE4\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 19,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"MtMoon_1F_EventScript_ZubatSign\"\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/MtMoon_1F/scripts.inc",
    "content": ".set LOCALID_PARAS_MASTER, 15\n.set TRAINER, VAR_0x8009\n\nMtMoon_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, MtMoon_1F_OnTransition\n\t.byte 0\n\nMtMoon_1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_MT_MOON_1F\n\tgoto MtMoon_1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nMtMoon_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_PARAS\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, MtMoon_1F_MapScript_ParasMasterMovementType\n\tend\n\nMtMoon_1F_MapScript_ParasMasterMovementType::\n\tsetobjectmovementtype LOCALID_PARAS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nMtMoon_1F_EventScript_ZubatSign::\n\tmsgbox MtMoon_1F_Text_ZubatIsABloodsucker, MSGBOX_SIGN\n\tend\n\nMtMoon_1F_EventScript_Marcos::\n\ttrainerbattle_single TRAINER_HIKER_MARCOS, MtMoon_1F_Text_MarcosIntro, MtMoon_1F_Text_MarcosDefeat\n\tmsgbox MtMoon_1F_Text_MarcosPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nMtMoon_1F_EventScript_Josh::\n\ttrainerbattle_single TRAINER_YOUNGSTER_JOSH, MtMoon_1F_Text_JoshIntro, MtMoon_1F_Text_JoshDefeat\n\tmsgbox MtMoon_1F_Text_JoshPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nMtMoon_1F_EventScript_Miriam::\n\ttrainerbattle_single TRAINER_LASS_MIRIAM, MtMoon_1F_Text_MiriamIntro, MtMoon_1F_Text_MiriamDefeat\n\tmsgbox MtMoon_1F_Text_MiriamPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nMtMoon_1F_EventScript_Iris::\n\ttrainerbattle_single TRAINER_LASS_IRIS, MtMoon_1F_Text_IrisIntro, MtMoon_1F_Text_IrisDefeat\n\tmsgbox MtMoon_1F_Text_IrisPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nMtMoon_1F_EventScript_Jovan::\n\ttrainerbattle_single TRAINER_SUPER_NERD_JOVAN, MtMoon_1F_Text_JovanIntro, MtMoon_1F_Text_JovanDefeat\n\tmsgbox MtMoon_1F_Text_JovanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nMtMoon_1F_EventScript_Kent::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_KENT, MtMoon_1F_Text_KentIntro, MtMoon_1F_Text_KentDefeat\n\tmsgbox MtMoon_1F_Text_KentPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nMtMoon_1F_EventScript_Robby::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_ROBBY, MtMoon_1F_Text_RobbyIntro, MtMoon_1F_Text_RobbyDefeat\n\tmsgbox MtMoon_1F_Text_RobbyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/MtMoon_1F/text.inc",
    "content": "MtMoon_1F_Text_MarcosIntro::\n    .string \"WHOA!\\n\"\n    .string \"You shocked me!\\l\"\n    .string \"…Oh, you're just a kid!$\"\n\nMtMoon_1F_Text_MarcosDefeat::\n    .string \"Wow!\\n\"\n    .string \"Shocked again!$\"\n\nMtMoon_1F_Text_MarcosPostBattle::\n    .string \"Kids like you shouldn't be\\n\"\n    .string \"wandering around here in the dark.$\"\n\nMtMoon_1F_Text_JoshIntro::\n    .string \"Did you come to explore the cave,\\n\"\n    .string \"too?$\"\n\nMtMoon_1F_Text_JoshDefeat::\n    .string \"Losing stinks!\\n\"\n    .string \"It's so uncool.$\"\n\nMtMoon_1F_Text_JoshPostBattle::\n    .string \"I came all the way down here to\\n\"\n    .string \"show off to girls.$\"\n\nMtMoon_1F_Text_MiriamIntro::\n    .string \"Wow! It's way bigger in here than\\n\"\n    .string \"I thought!$\"\n\nMtMoon_1F_Text_MiriamDefeat::\n    .string \"Oh!\\n\"\n    .string \"I lost it!$\"\n\nMtMoon_1F_Text_MiriamPostBattle::\n    .string \"How do you get out of here?\\n\"\n    .string \"It's so big, I may get lost.$\"\n\nMtMoon_1F_Text_JovanIntro::\n    .string \"What!\\n\"\n    .string \"Don't sneak up on me!$\"\n\nMtMoon_1F_Text_JovanDefeat::\n    .string \"My POKéMON won't do!$\"\n\nMtMoon_1F_Text_JovanPostBattle::\n    .string \"I have to find stronger POKéMON.\\n\"\n    .string \"Where might they be?$\"\n\nMtMoon_1F_Text_IrisIntro::\n    .string \"What?\\n\"\n    .string \"I'm waiting for my friends to find\\l\"\n    .string \"me here.$\"\n\nMtMoon_1F_Text_IrisDefeat::\n    .string \"I lost?$\"\n\nMtMoon_1F_Text_IrisPostBattle::\n    .string \"I came because I heard there are\\n\"\n    .string \"some very rare fossils here.$\"\n\nMtMoon_1F_Text_KentIntro::\n    .string \"Suspicious men are in the cave.\\n\"\n    .string \"What about you?$\"\n\nMtMoon_1F_Text_KentDefeat::\n    .string \"You got me!$\"\n\nMtMoon_1F_Text_KentPostBattle::\n    .string \"I saw them!\\n\"\n    .string \"I'm sure they're from TEAM ROCKET!$\"\n\nMtMoon_1F_Text_RobbyIntro::\n    .string \"You need to go through this cave\\n\"\n    .string \"to get to CERULEAN CITY.$\"\n\nMtMoon_1F_Text_RobbyDefeat::\n    .string \"I lost.$\"\n\nMtMoon_1F_Text_RobbyPostBattle::\n    .string \"ZUBAT is tough!\\n\"\n    .string \"But if you can catch one, you'll\\l\"\n    .string \"be able to count on it.$\"\n\nMtMoon_1F_Text_ZubatIsABloodsucker::\n    .string \"Beware!\\n\"\n    .string \"ZUBAT is a bloodsucker!$\"\n\nMtMoon_1F_Text_BrockHelpsExcavateFossils::\n    .string \"Hi, I'm excavating for fossils here\\n\"\n    .string \"under MT. MOON.\\p\"\n    .string \"Sometimes, BROCK of PEWTER GYM\\n\"\n    .string \"lends me a hand.$\"\n"
  },
  {
    "path": "data/maps/MtMoon_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_MT_MOON_B1F\",\n  \"name\": \"MtMoon_B1F\",\n  \"layout\": \"LAYOUT_MT_MOON_B1F\",\n  \"music\": \"MUS_MT_MOON\",\n  \"region_map_section\": \"MAPSEC_MT_MOON\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Clefable\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 43,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_1F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_B2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_B2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 26,\n      \"y\": 36,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_B2F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 39,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_B2F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 45,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE4\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 46,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"item\": \"ITEM_TINY_MUSHROOM\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 26,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"item\": \"ITEM_TINY_MUSHROOM\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_2\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 39,\n      \"y\": 34,\n      \"elevation\": 0,\n      \"item\": \"ITEM_TINY_MUSHROOM\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_3\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 24,\n      \"y\": 35,\n      \"elevation\": 0,\n      \"item\": \"ITEM_BIG_MUSHROOM\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 6,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"item\": \"ITEM_BIG_MUSHROOM\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM_2\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 25,\n      \"y\": 34,\n      \"elevation\": 0,\n      \"item\": \"ITEM_BIG_MUSHROOM\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM_3\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/MtMoon_B1F/scripts.inc",
    "content": ".set LOCALID_CLEFABLE_MASTER, 1\n.set TRAINER, VAR_0x8009\n\nMtMoon_B1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, MtMoon_B1F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nMtMoon_B1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_CLEFABLE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, MtMoon_B1F_MapScript_ClefableMasterMovementType\n\tend\n\nMtMoon_B1F_MapScript_ClefableMasterMovementType::\n\tsetobjectmovementtype LOCALID_CLEFABLE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn"
  },
  {
    "path": "data/maps/MtMoon_B2F/map.json",
    "content": "{\n  \"id\": \"MAP_MT_MOON_B2F\",\n  \"name\": \"MtMoon_B2F\",\n  \"layout\": \"LAYOUT_MT_MOON_B2F\",\n  \"music\": \"MUS_MT_MOON\",\n  \"region_map_section\": \"MAPSEC_MT_MOON\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FOSSIL\",\n      \"x\": 13,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_B2F_EventScript_DomeFossil\",\n      \"flag\": \"FLAG_HIDE_DOME_FOSSIL\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FOSSIL\",\n      \"x\": 14,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_B2F_EventScript_HelixFossil\",\n      \"flag\": \"FLAG_HIDE_HELIX_FOSSIL\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"x\": 13,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_B2F_EventScript_Miguel\",\n      \"flag\": \"0\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"x\": 37,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"MtMoon_B2F_EventScript_Grunt4\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"x\": 12,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"MtMoon_B2F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"x\": 35,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"MtMoon_B2F_EventScript_Grunt3\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"x\": 18,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"MtMoon_B2F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 30,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_B2F_EventScript_ItemStarPiece\",\n      \"flag\": \"FLAG_HIDE_MT_MOON_B2F_STAR_PIECE\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 35,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_B2F_EventScript_ItemTM46\",\n      \"flag\": \"FLAG_HIDE_MT_MOON_B2F_TM46\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 24,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_B2F_EventScript_ItemRevive\",\n      \"flag\": \"FLAG_HIDE_MT_MOON_B2F_REVIVE\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 3,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MtMoon_B2F_EventScript_ItemAntidote\",\n      \"flag\": \"FLAG_HIDE_MT_MOON_B2F_ANTIDOTE\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"x\": 40,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Omanyte\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\",\n      \"in_connection\": false\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"x\": 33,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Kabuto\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\",\n      \"in_connection\": false\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 25,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_B1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_B1F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_B1F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_B1F\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 14,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_MT_MOON_B2F\",\n      \"var_value\": \"0\",\n      \"script\": \"MtMoon_B2F_EventScript_MiguelTrigger\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 20,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"item\": \"ITEM_MOON_STONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_MT_MOON_B2F_MOON_STONE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 39,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ETHER\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_MT_MOON_B2F_ETHER\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/MtMoon_B2F/scripts.inc",
    "content": ".equ LOCALID_DOME_FOSSIL,  1\n.equ LOCALID_HELIX_FOSSIL, 2\n.equ LOCALID_MIGUEL,       3\n.set LOCALID_OMANYTE_MASTER, 12\n.set LOCALID_KABUTO_MASTER, 13\n.set TRAINER, VAR_0x8009\n\nMtMoon_B2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, MtMoon_B2F_OnTransition\n\t.byte 0\n\nMtMoon_B2F_OnTransition::\n\tcall_if_unset FLAG_GOT_FOSSIL_FROM_MT_MOON, MtMoon_B2F_EventScript_ShowFossils\n\tgoto MtMoon_B2F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nMtMoon_B2F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_OMANYTE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, MtMoon_B2F_MapScript_OmanyteMasterMovementType\n\tsetvar TRAINER, MASTER_KABUTO\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, MtMoon_B2F_MapScript_KabutoMasterMovementType\n\tend\n\nMtMoon_B2F_MapScript_OmanyteMasterMovementType::\n\tsetobjectmovementtype LOCALID_OMANYTE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nMtMoon_B2F_MapScript_KabutoMasterMovementType::\n\tsetobjectmovementtype LOCALID_KABUTO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nMtMoon_B2F_EventScript_ShowFossils::\n\tclearflag FLAG_HIDE_DOME_FOSSIL\n\tclearflag FLAG_HIDE_HELIX_FOSSIL\n\treturn\n\nMtMoon_B2F_EventScript_MiguelTrigger::\n\tlockall\n\tapplymovement LOCALID_MIGUEL, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tcall MtMoon_B2F_EventScript_BattleMiguel\n\treleaseall\n\tend\n\nMtMoon_B2F_EventScript_Miguel::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_FOSSIL_FROM_MT_MOON, MtMoon_B2F_EventScript_MiguelFossilPicked\n\tgoto_if_defeated TRAINER_SUPER_NERD_MIGUEL, MtMoon_B2F_EventScript_MiguelGoPickFossil\n\tcall MtMoon_B2F_EventScript_BattleMiguel\n\trelease\n\tend\n\nMtMoon_B2F_EventScript_BattleMiguel::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmessage MtMoon_B2F_Text_MiguelIntro\n\twaitmessage\n\tplaybgm MUS_ENCOUNTER_GYM_LEADER, 0\n\twaitbuttonpress\n\tsetvar VAR_LAST_TALKED, LOCALID_MIGUEL\n\ttrainerbattle_no_intro TRAINER_SUPER_NERD_MIGUEL, MtMoon_B2F_Text_MiguelDefeat\n\tsetvar VAR_MAP_SCENE_MT_MOON_B2F, 1\n\tmsgbox MtMoon_B2F_Text_WellEachTakeAFossil\n\treturn\n\nMtMoon_B2F_EventScript_MiguelFossilPicked::\n\tmsgbox MtMoon_B2F_Text_LabOnCinnabarRegeneratesFossils\n\trelease\n\tend\n\nMtMoon_B2F_EventScript_MiguelGoPickFossil::\n\tmsgbox MtMoon_B2F_Text_WellEachTakeAFossil\n\trelease\n\tend\n\nMtMoon_B2F_EventScript_DomeFossil::\n\tlock\n\tfaceplayer\n\tmsgbox MtMoon_B2F_Text_YouWantDomeFossil, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, MtMoon_B2F_EventScript_DontTakeFossil\n\tremoveobject LOCALID_DOME_FOSSIL\n\tgiveitem_msg MtMoon_B2F_Text_ObtainedDomeFossil, ITEM_DOME_FOSSIL, 1, MUS_OBTAIN_KEY_ITEM\n\tclosemessage\n\tspecial QuestLog_CutRecording\n\tdelay 10\n\tapplymovement LOCALID_MIGUEL, MtMoon_B2F_Movement_MiguelToHelixFossil\n\twaitmovement 0\n\tcopyobjectxytoperm LOCALID_MIGUEL\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\tmessage MtMoon_B2F_Text_ThenThisFossilIsMine\n\twaitmessage\n\twaitfanfare\n\tremoveobject LOCALID_HELIX_FOSSIL\n\tsetflag FLAG_GOT_DOME_FOSSIL\n\tsetflag FLAG_GOT_FOSSIL_FROM_MT_MOON\n\trelease\n\tend\n\nMtMoon_B2F_Movement_MiguelToHelixFossil::\n\twalk_right\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nMtMoon_B2F_EventScript_HelixFossil::\n\tlock\n\tfaceplayer\n\tmsgbox MtMoon_B2F_Text_YouWantHelixFossil, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, MtMoon_B2F_EventScript_DontTakeFossil\n\tremoveobject LOCALID_HELIX_FOSSIL\n\tgiveitem_msg MtMoon_B2F_Text_ObtainedHelixFossil, ITEM_HELIX_FOSSIL, 1, MUS_OBTAIN_KEY_ITEM\n\tclosemessage\n\tspecial QuestLog_CutRecording\n\tdelay 10\n\tapplymovement LOCALID_MIGUEL, MtMoon_B2F_Movement_MiguelToDomeFossil\n\twaitmovement 0\n\tcopyobjectxytoperm LOCALID_MIGUEL\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\tmessage MtMoon_B2F_Text_ThenThisFossilIsMine\n\twaitmessage\n\twaitfanfare\n\tremoveobject LOCALID_DOME_FOSSIL\n\tsetflag FLAG_GOT_HELIX_FOSSIL\n\tsetflag FLAG_GOT_FOSSIL_FROM_MT_MOON\n\trelease\n\tend\n\nMtMoon_B2F_EventScript_DontTakeFossil::\n\trelease\n\tend\n\nMtMoon_B2F_Movement_MiguelToDomeFossil::\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nMtMoon_B2F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT, MtMoon_B2F_Text_Grunt1Intro, MtMoon_B2F_Text_Grunt1Defeat\n\tmsgbox MtMoon_B2F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nMtMoon_B2F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_2, MtMoon_B2F_Text_Grunt2Intro, MtMoon_B2F_Text_Grunt2Defeat\n\tmsgbox MtMoon_B2F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nMtMoon_B2F_EventScript_Grunt3::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_3, MtMoon_B2F_Text_Grunt3Intro, MtMoon_B2F_Text_Grunt3Defeat\n\tmsgbox MtMoon_B2F_Text_Grunt3PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nMtMoon_B2F_EventScript_Grunt4::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_4, MtMoon_B2F_Text_Grunt4Intro, MtMoon_B2F_Text_Grunt4Defeat\n\tmsgbox MtMoon_B2F_Text_Grunt4PostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/MtMoon_B2F/text.inc",
    "content": "MtMoon_B2F_Text_MiguelIntro::\n    .string \"Hey, stop!\\p\"\n    .string \"I found these fossils!\\n\"\n    .string \"They're both mine!$\"\n\nMtMoon_B2F_Text_MiguelDefeat::\n    .string \"Okay!\\n\"\n    .string \"I'll share!$\"\n\nMtMoon_B2F_Text_WellEachTakeAFossil::\n    .string \"We'll each take a fossil!\\n\"\n    .string \"No being greedy!$\"\n\nMtMoon_B2F_Text_ThenThisFossilIsMine::\n    .string \"All right.\\n\"\n    .string \"Then this fossil is mine!$\"\n\nMtMoon_B2F_Text_LabOnCinnabarRegeneratesFossils::\n    .string \"Far away, on CINNABAR ISLAND,\\n\"\n    .string \"there's a POKéMON LAB.\\p\"\n    .string \"They do research on regenerating\\n\"\n    .string \"fossils.$\"\n\nMtMoon_B2F_Text_Grunt1Intro::\n    .string \"We, TEAM ROCKET, shall find the\\n\"\n    .string \"fossils!\\p\"\n    .string \"Reviving POKéMON from them will\\n\"\n    .string \"earn us huge riches!$\"\n\nMtMoon_B2F_Text_Grunt1Defeat::\n    .string \"Urgh!\\n\"\n    .string \"Now I'm mad!$\"\n\nMtMoon_B2F_Text_Grunt1PostBattle::\n    .string \"You made me mad!\\n\"\n    .string \"TEAM ROCKET will blacklist you!$\"\n\nMtMoon_B2F_Text_Grunt2Intro::\n    .string \"We, TEAM ROCKET, are POKéMON\\n\"\n    .string \"gangsters!\\l\"\n    .string \"We strike fear with our strength!$\"\n\nMtMoon_B2F_Text_Grunt2Defeat::\n    .string \"I blew it!$\"\n\nMtMoon_B2F_Text_Grunt2PostBattle::\n    .string \"Darn it all!\\n\"\n    .string \"My associates won't stand for this!$\"\n\nMtMoon_B2F_Text_Grunt3Intro::\n    .string \"We're pulling a big job here!\\n\"\n    .string \"Get lost, kid!$\"\n\nMtMoon_B2F_Text_Grunt3Defeat::\n    .string \"So, you are good…$\"\n\nMtMoon_B2F_Text_Grunt3PostBattle::\n    .string \"If you find a fossil, give it to me\\n\"\n    .string \"and scram!$\"\n\nMtMoon_B2F_Text_Grunt4Intro::\n    .string \"Little kids shouldn't be messing\\n\"\n    .string \"around with grown-ups!\\p\"\n    .string \"It could be bad news!$\"\n\nMtMoon_B2F_Text_Grunt4Defeat::\n    .string \"I'm steamed!$\"\n\nMtMoon_B2F_Text_Grunt4PostBattle::\n    .string \"POKéMON lived here long before\\n\"\n    .string \"people came.$\"\n\nMtMoon_B2F_Text_YouWantDomeFossil::\n    .string \"Do you want the DOME FOSSIL?$\"\n\nMtMoon_B2F_Text_YouWantHelixFossil::\n    .string \"Do you want the HELIX FOSSIL?$\"\n\nMtMoon_B2F_Text_ObtainedHelixFossil::\n    .string \"Obtained the HELIX FOSSIL!$\"\n\nMtMoon_B2F_Text_ObtainedDomeFossil::\n    .string \"Obtained the DOME FOSSIL!$\"\n\n"
  },
  {
    "path": "data/maps/NavelRock_1F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_1F\",\n  \"name\": \"NavelRock_1F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_1F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_B1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_EXTERIOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_1F/scripts.inc",
    "content": "NavelRock_1F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_B1F\",\n  \"name\": \"NavelRock_B1F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_B1F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_FORK\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_B1F/scripts.inc",
    "content": "NavelRock_B1F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_Base/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_BASE\",\n  \"name\": \"NavelRock_Base\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_BASE\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LUGIA\",\n      \"x\": 10,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NavelRock_Base_EventScript_Lugia\",\n      \"flag\": \"FLAG_HIDE_LUGIA\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 13,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B11F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_Base/scripts.inc",
    "content": ".set LOCALID_LUGIA, 1\n\nNavelRock_Base_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, NavelRock_Base_OnTransition\n\tmap_script MAP_SCRIPT_ON_RESUME, NavelRock_Base_OnResume\n\t.byte 0\n\nNavelRock_Base_OnTransition::\n\tcall_if_set FLAG_FOUGHT_LUGIA, NavelRock_Base_EventScript_HideLugia\n\tcall_if_unset FLAG_FOUGHT_LUGIA, NavelRock_Base_EventScript_TryShowLugia\n\tend\n\nNavelRock_Base_EventScript_HideLugia::\n\tsetflag FLAG_HIDE_LUGIA\n\treturn\n\nNavelRock_Base_EventScript_TryShowLugia::\n\tgoto_if_set FLAG_LUGIA_FLEW_AWAY, EventScript_Return\n\tclearflag FLAG_HIDE_LUGIA\n\treturn\n\nNavelRock_Base_OnResume::\n\tcall_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, NavelRock_Base_EventScript_TryRemoveLugia\n\tend\n\nNavelRock_Base_EventScript_TryRemoveLugia::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return\n\tremoveobject LOCALID_LUGIA\n\treturn\n\nNavelRock_Base_EventScript_Lugia::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\twaitse\n\tdelay 20\n\tplayse SE_THUNDERSTORM_STOP\n\tsetvar VAR_0x8004, 0  @ Vertical pan\n\tsetvar VAR_0x8005, 3  @ Horizontal pan\n\tsetvar VAR_0x8006, 4  @ Num shakes\n\tsetvar VAR_0x8007, 2  @ Shake delay\n\tspecial ShakeScreen\n\tdelay 30\n\tplayse SE_THUNDERSTORM_STOP\n\tsetvar VAR_0x8004, 0  @ Vertical pan\n\tsetvar VAR_0x8005, 3  @ Horizontal pan\n\tsetvar VAR_0x8006, 4  @ Num shakes\n\tsetvar VAR_0x8007, 2  @ Shake delay\n\tspecial ShakeScreen\n\tdelay 30\n\tdelay 50\n\twaitse\n\tplaymoncry SPECIES_LUGIA, CRY_MODE_ENCOUNTER\n\twaitmoncry\n\tdelay 20\n\tseteventmon SPECIES_LUGIA, 70\n\tsetflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecial StartLegendaryBattle\n\twaitstate\n\tclearflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_WON, NavelRock_Base_EventScript_DefeatedLugia\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_RAN, NavelRock_Base_EventScript_RanFromLugia\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, NavelRock_Base_EventScript_RanFromLugia\n\tsetflag FLAG_FOUGHT_LUGIA\n\trelease\n\tend\n\nNavelRock_Base_EventScript_DefeatedLugia::\n\tsetflag FLAG_LUGIA_FLEW_AWAY\n\tsetvar VAR_0x8004, SPECIES_LUGIA\n\tgoto EventScript_MonFlewAway\n\tend\n\nNavelRock_Base_EventScript_RanFromLugia::\n\tsetvar VAR_0x8004, SPECIES_LUGIA\n\tgoto EventScript_MonFlewAway\n\tend\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B10F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_BASE_PATH_B10F\",\n  \"name\": \"NavelRock_BasePath_B10F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B10F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B9F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B11F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B10F/scripts.inc",
    "content": "NavelRock_BasePath_B10F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B11F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_BASE_PATH_B11F\",\n  \"name\": \"NavelRock_BasePath_B11F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B11F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B10F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B11F/scripts.inc",
    "content": "NavelRock_BasePath_B11F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_BASE_PATH_B1F\",\n  \"name\": \"NavelRock_BasePath_B1F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B1F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_FORK\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B1F/scripts.inc",
    "content": "NavelRock_BasePath_B1F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B2F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_BASE_PATH_B2F\",\n  \"name\": \"NavelRock_BasePath_B2F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B2F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B3F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B2F/scripts.inc",
    "content": "NavelRock_BasePath_B2F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B3F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_BASE_PATH_B3F\",\n  \"name\": \"NavelRock_BasePath_B3F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B3F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B4F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B3F/scripts.inc",
    "content": "NavelRock_BasePath_B3F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B4F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_BASE_PATH_B4F\",\n  \"name\": \"NavelRock_BasePath_B4F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B4F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B3F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B5F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B4F/scripts.inc",
    "content": "NavelRock_BasePath_B4F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B5F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_BASE_PATH_B5F\",\n  \"name\": \"NavelRock_BasePath_B5F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B5F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B4F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B6F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B5F/scripts.inc",
    "content": "NavelRock_BasePath_B5F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B6F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_BASE_PATH_B6F\",\n  \"name\": \"NavelRock_BasePath_B6F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B6F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B5F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B7F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B6F/scripts.inc",
    "content": "NavelRock_BasePath_B6F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B7F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_BASE_PATH_B7F\",\n  \"name\": \"NavelRock_BasePath_B7F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B7F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B6F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B8F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B7F/scripts.inc",
    "content": "NavelRock_BasePath_B7F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B8F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_BASE_PATH_B8F\",\n  \"name\": \"NavelRock_BasePath_B8F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B8F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B7F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B9F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B8F/scripts.inc",
    "content": "NavelRock_BasePath_B8F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B9F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_BASE_PATH_B9F\",\n  \"name\": \"NavelRock_BasePath_B9F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_BASE_PATH_B9F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B8F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B10F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_BasePath_B9F/scripts.inc",
    "content": "NavelRock_BasePath_B9F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_Exterior/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_EXTERIOR\",\n  \"name\": \"NavelRock_Exterior\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_EXTERIOR\",\n  \"music\": \"MUS_SEVII_ROUTE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 9,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_HARBOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_Exterior/scripts.inc",
    "content": "NavelRock_Exterior_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, NavelRock_Exterior_OnTransition\n\t.byte 0\n\nNavelRock_Exterior_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR\n\tend\n"
  },
  {
    "path": "data/maps/NavelRock_Fork/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_FORK\",\n  \"name\": \"NavelRock_Fork\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_FORK\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 13,\n      \"y\": 95,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_B1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_SUMMIT_PATH_2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 26,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_BASE_PATH_B1F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_Fork/scripts.inc",
    "content": "NavelRock_Fork_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_Harbor/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_HARBOR\",\n  \"name\": \"NavelRock_Harbor\",\n  \"layout\": \"LAYOUT_ISLAND_HARBOR\",\n  \"music\": \"MUS_SEVII_ROUTE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NavelRock_Harbor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_EXTERIOR\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_Harbor/scripts.inc",
    "content": "NavelRock_Harbor_MapScripts::\n\t.byte 0\n\nNavelRock_Harbor_EventScript_Sailor::\n\tlock\n\tfaceplayer\n\tmessage Text_WhereDoYouWantToSail\n\twaitmessage\n\tsetvar VAR_0x8004, SEAGALLOP_NAVEL_ROCK\n\tmultichoice 20, 8, MULTICHOICE_SEAGALLOP_VERMILION, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToVermilionCity\n\tcase 1, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail\n\tend\n"
  },
  {
    "path": "data/maps/NavelRock_Summit/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_SUMMIT\",\n  \"name\": \"NavelRock_Summit\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_SUMMIT\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SHADE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HO_OH\",\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_HO_OH\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_SUMMIT_PATH_5F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"NavelRock_Summit_EventScript_HoOh\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 9,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"item\": \"ITEM_SACRED_ASH\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_NAVEL_ROCK_SUMMIT_SACRED_ASH\",\n      \"quantity\": 1,\n      \"underfoot\": true\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_Summit/scripts.inc",
    "content": ".set LOCALID_HO_OH, 1\n\nNavelRock_Summit_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, NavelRock_Summit_OnTransition\n\tmap_script MAP_SCRIPT_ON_RESUME, NavelRock_Summit_OnResume\n\t.byte 0\n\nNavelRock_Summit_OnTransition::\n\tcall_if_set FLAG_FOUGHT_HO_OH, NavelRock_Summit_EventScript_HideHoOh\n\tcall_if_unset FLAG_FOUGHT_HO_OH, NavelRock_Summit_EventScript_TryShowHoOh\n\tend\n\nNavelRock_Summit_EventScript_HideHoOh::\n\tsetvar VAR_TEMP_1, 1\n\tsetflag FLAG_HIDE_HO_OH\n\treturn\n\nNavelRock_Summit_EventScript_TryShowHoOh::\n\tsetvar VAR_TEMP_1, 1\n\tgoto_if_set FLAG_HO_OH_FLEW_AWAY, EventScript_Return\n\tsetvar VAR_TEMP_1, 0\n\tclearflag FLAG_HIDE_HO_OH\n\treturn\n\nNavelRock_Summit_OnResume::\n\tcall_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, NavelRock_Summit_EventScript_TryRemoveHoOh\n\tend\n\nNavelRock_Summit_EventScript_TryRemoveHoOh::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return\n\tremoveobject LOCALID_HO_OH\n\treturn\n\nNavelRock_Summit_EventScript_HoOh::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tspecial SpawnCameraObject\n\tsetvar VAR_0x8004, 3  @ Num loops\n\tsetvar VAR_0x8005, 35 @ Delay\n\tspecial LoopWingFlapSound\n\tapplymovement LOCALID_HO_OH, Movement_HoOhAppear\n\tapplymovement OBJ_EVENT_ID_CAMERA, Movement_CameraPanUp\n\twaitmovement 0\n\tdelay 50\n\tsetweather 0\n\tdoweather\n\twaitse\n\tplaymoncry SPECIES_HO_OH, CRY_MODE_ENCOUNTER\n\tdelay 30\n\twaitmoncry\n\tdelay 60\n\tsetvar VAR_0x8004, 3  @ Num loops\n\tsetvar VAR_0x8005, 35 @ Delay\n\tspecial LoopWingFlapSound\n\tapplymovement OBJ_EVENT_ID_CAMERA, Movement_CameraPanDown\n\tapplymovement LOCALID_HO_OH, Movement_HoOhApproach\n\twaitmovement 0\n\tspecial RemoveCameraObject\n\tseteventmon SPECIES_HO_OH, 70\n\tsetflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecial StartLegendaryBattle\n\twaitstate\n\tclearflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tsetvar VAR_LAST_TALKED, LOCALID_HO_OH\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_WON, NavelRock_Summit_EventScript_DefeatedHoOh\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_RAN, NavelRock_Summit_EventScript_RanFromHoOh\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, NavelRock_Summit_EventScript_RanFromHoOh\n\tsetflag FLAG_FOUGHT_HO_OH\n\treleaseall\n\tend\n\nNavelRock_Summit_EventScript_DefeatedHoOh::\n\tsetflag FLAG_HO_OH_FLEW_AWAY\n\tsetvar VAR_0x8004, SPECIES_HO_OH\n\tgoto EventScript_MonFlewAway\n\tend\n\nNavelRock_Summit_EventScript_RanFromHoOh::\n\tsetvar VAR_0x8004, SPECIES_HO_OH\n\tgoto EventScript_MonFlewAway\n\tend\n\nMovement_CameraPanUp:\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nMovement_CameraPanDown:\n\tdelay_16\n\tdelay_16\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nMovement_HoOhApproach:\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_in_place_down\n\tdelay_16\n\tdelay_16\n\tstep_end\n\nMovement_HoOhAppear:\n\tdelay_16\n\tdelay_16\n\twalk_in_place_down\n\twalk_in_place_down\n\twalk_in_place_down\n\twalk_in_place_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/NavelRock_SummitPath_2F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_SUMMIT_PATH_2F\",\n  \"name\": \"NavelRock_SummitPath_2F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_SUMMIT_PATH_2F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_FORK\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_SUMMIT_PATH_3F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_SummitPath_2F/scripts.inc",
    "content": "NavelRock_SummitPath_2F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_SummitPath_3F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_SUMMIT_PATH_3F\",\n  \"name\": \"NavelRock_SummitPath_3F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_SUMMIT_PATH_3F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_SUMMIT_PATH_2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_SUMMIT_PATH_4F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_SummitPath_3F/scripts.inc",
    "content": "NavelRock_SummitPath_3F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_SummitPath_4F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_SUMMIT_PATH_4F\",\n  \"name\": \"NavelRock_SummitPath_4F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_SUMMIT_PATH_4F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_SUMMIT_PATH_3F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_SUMMIT_PATH_5F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_SummitPath_4F/scripts.inc",
    "content": "NavelRock_SummitPath_4F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/NavelRock_SummitPath_5F/map.json",
    "content": "{\n  \"id\": \"MAP_NAVEL_ROCK_SUMMIT_PATH_5F\",\n  \"name\": \"NavelRock_SummitPath_5F\",\n  \"layout\": \"LAYOUT_NAVEL_ROCK_SUMMIT_PATH_5F\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_NAVEL_ROCK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_SUMMIT_PATH_4F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_NAVEL_ROCK_SUMMIT\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/NavelRock_SummitPath_5F/scripts.inc",
    "content": "NavelRock_SummitPath_5F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/OneIsland/map.json",
    "content": "{\n  \"id\": \"MAP_ONE_ISLAND\",\n  \"name\": \"OneIsland\",\n  \"layout\": \"LAYOUT_ONE_ISLAND\",\n  \"music\": \"MUS_DEWFORD\",\n  \"region_map_section\": \"MAPSEC_ONE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_ONE_ISLAND_TREASURE_BEACH\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": -120,\n      \"map\": \"MAP_ONE_ISLAND_KINDLE_ROAD\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BILL\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_ONE_ISLAND_BILL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 14,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ONE_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ONE_ISLAND_HOUSE1\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ONE_ISLAND_HOUSE2\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ONE_ISLAND_HARBOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_EventScript_IslandSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_EventScript_PokemonNetCenterSign\"\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/OneIsland/scripts.inc",
    "content": ".equ LOCALID_BILL, 1\n\nOneIsland_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, OneIsland_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, OneIsland_OnFrame\n\t.byte 0\n\nOneIsland_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_ONE_ISLAND\n\tend\n\nOneIsland_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_ONE_ISLAND_HARBOR, 2, OneIsland_EventScript_EnterOneIslandFirstTime\n\t.2byte 0\n\nOneIsland_EventScript_EnterOneIslandFirstTime::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement OBJ_EVENT_ID_PLAYER, OneIsland_Movement_PlayerExitHarbor\n\twaitmovement 0\n\tmsgbox OneIsland_Text_BillLetsGoSeeCelio\n\tclosemessage\n\tapplymovement LOCALID_BILL, OneIsland_Movement_BillWalkToPokeCenter\n\tapplymovement OBJ_EVENT_ID_PLAYER, OneIsland_Movement_PlayerWalkToPokeCenter\n\twaitmovement 0\n\topendoor 14, 5\n\twaitdooranim\n\tapplymovement LOCALID_BILL, OneIsland_Movement_BillEnterPokeCenter\n\tapplymovement OBJ_EVENT_ID_PLAYER, OneIsland_Movement_PlayerEnterPokeCenter\n\twaitmovement 0\n\tclosedoor 14, 5\n\twaitdooranim\n\tremoveobject LOCALID_BILL\n\tsetvar VAR_MAP_SCENE_ONE_ISLAND_HARBOR, 3\n\twarp MAP_ONE_ISLAND_POKEMON_CENTER_1F, 9, 9\n\twaitstate\n\treleaseall\n\tend\n\n\t.macro walk_to_pokecenter\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_right\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\t.endm\n\nOneIsland_Movement_PlayerWalkToPokeCenter::\n\twalk_up\n\twalk_to_pokecenter\n\tstep_end\n\nOneIsland_Movement_PlayerEnterPokeCenter::\n\twalk_up\n\twalk_up\n\tset_invisible\n\tstep_end\n\nOneIsland_Movement_PlayerExitHarbor::\n\twalk_up\n\tstep_end\n\nOneIsland_Movement_BillWalkToPokeCenter::\n\twalk_to_pokecenter\n\twalk_up\n\tstep_end\n\nOneIsland_Movement_BillEnterPokeCenter::\n\twalk_up\n\tset_invisible\n\tstep_end\n\nOneIsland_EventScript_OldMan::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_SYS_CAN_LINK_WITH_RS, OneIsland_EventScript_OldManLinkHoenn\n\tgoto_if_set FLAG_SEVII_DETOUR_FINISHED, OneIsland_EventScript_OldManLinkKanto\n\tmsgbox OneIsland_Text_LuckyToHaveCelioHere\n\trelease\n\tend\n\nOneIsland_EventScript_OldManLinkKanto::\n\tmsgbox OneIsland_Text_HavePCLinkageWithKanto\n\trelease\n\tend\n\nOneIsland_EventScript_OldManLinkHoenn::\n\tmsgbox OneIsland_Text_HavePCLinkageWithHoenn\n\trelease\n\tend\n\nOneIsland_EventScript_BaldingMan::\n\tmsgbox OneIsland_Text_IsntWarmClimateHereGreat, MSGBOX_NPC\n\tend\n\nOneIsland_EventScript_IslandSign::\n\tmsgbox OneIsland_Text_IslandSign, MSGBOX_SIGN\n\tend\n\nOneIsland_EventScript_PokemonNetCenterSign::\n\tmsgbox OneIsland_Text_PokemonNetCenterSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/OneIsland/text.inc",
    "content": "OneIsland_Text_BillLetsGoSeeCelio::\n    .string \"BILL: Here we are!\\n\"\n    .string \"This is ONE ISLAND.\\p\"\n    .string \"There are several islands around\\n\"\n    .string \"here, and this is one of them.\\p\"\n    .string \"My friend CELIO sent the boat to\\n\"\n    .string \"fetch me here.\\p\"\n    .string \"He's in charge of the island's PC\\n\"\n    .string \"network by his lonesome.\\p\"\n    .string \"…Why am I telling you this now?\\n\"\n    .string \"Let's just go see CELIO!$\"\n\nText_WhereDoYouWantToSail::\n    .string \"Ahoy, there!\\n\"\n    .string \"Where do you want to sail?$\"\n\nOneIsland_Text_LuckyToHaveCelioHere::\n    .string \"Here we are on an island smack in\\n\"\n    .string \"the middle of nowhere.\\p\"\n    .string \"We're lucky to have an upstanding\\n\"\n    .string \"young man like CELIO here.\\p\"\n    .string \"My granddaughter was in a tizzy\\n\"\n    .string \"over CELIO's friend.\\p\"\n    .string \"Something about a famous\\n\"\n    .string \"POKéMANIAC?\\p\"\n    .string \"I'm not sure what that means, but\\n\"\n    .string \"CELIO is quite the man!$\"\n\nOneIsland_Text_HavePCLinkageWithKanto::\n    .string \"My granddaughter was in a tizzy\\n\"\n    .string \"over a new breakthrough.\\p\"\n    .string \"She said we now have PC linkage\\n\"\n    .string \"with people in KANTO.\\p\"\n    .string \"I'm not sure what that means, but\\n\"\n    .string \"CELIO is quite the man!$\"\n\nOneIsland_Text_HavePCLinkageWithHoenn::\n    .string \"My granddaughter was in a tizzy\\n\"\n    .string \"over a new breakthrough.\\p\"\n    .string \"She said we finally have PC linkage\\n\"\n    .string \"with people in HOENN.\\p\"\n    .string \"I'm not sure what that means, but\\n\"\n    .string \"CELIO is quite the man.\\p\"\n    .string \"He would make a fine husband for\\n\"\n    .string \"my granddaughter!$\"\n\nOneIsland_Text_IslandSign::\n    .string \"ONE ISLAND\\n\"\n    .string \"Friends Gather at Knot Island$\"\n\nOneIsland_Text_PokemonNetCenterSign::\n    .string \"Expanding the POKéMON World!\\n\"\n    .string \"POKéMON NET CENTER$\"\n\nOneIsland_Text_IsntWarmClimateHereGreat::\n    .string \"Hi, sight-seeing, are you?\\n\"\n    .string \"Isn't the warm climate here great?$\"\n\n"
  },
  {
    "path": "data/maps/OneIsland_Harbor/map.json",
    "content": "{\n  \"id\": \"MAP_ONE_ISLAND_HARBOR\",\n  \"name\": \"OneIsland_Harbor\",\n  \"layout\": \"LAYOUT_ISLAND_HARBOR\",\n  \"music\": \"MUS_DEWFORD\",\n  \"region_map_section\": \"MAPSEC_ONE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_Harbor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ONE_ISLAND\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/OneIsland_Harbor/scripts.inc",
    "content": "OneIsland_Harbor_MapScripts::\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, OneIsland_Harbor_OnWarp\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, OneIsland_Harbor_OnFrame\n\t.byte 0\n\nOneIsland_Harbor_OnWarp::\n\tmap_script_2 VAR_MAP_SCENE_ONE_ISLAND_HARBOR, 1, OneIsland_Harbor_EventScript_TurnPlayerNorth\n\t.2byte 0\n\nOneIsland_Harbor_EventScript_TurnPlayerNorth::\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH\n\tend\n\nOneIsland_Harbor_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_ONE_ISLAND_HARBOR, 1, OneIsland_Harbor_EventScript_PlayerEnterHarborFirstTime\n\t.2byte 0\n\nOneIsland_Harbor_EventScript_PlayerEnterHarborFirstTime::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement OBJ_EVENT_ID_PLAYER, OneIsland_Harbor_Movement_PlayerExitHarbor\n\twaitmovement 0\n\tsetvar VAR_MAP_SCENE_ONE_ISLAND_HARBOR, 2\n\twarp MAP_ONE_ISLAND, 12, 18\n\twaitstate\n\treleaseall\n\tend\n\nOneIsland_Harbor_Movement_PlayerExitHarbor::\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nOneIsland_Harbor_EventScript_Sailor::\n\tlock\n\tfaceplayer\n\tmessage Text_WhereDoYouWantToSail\n\twaitmessage\n\tsetvar VAR_0x8004, SEAGALLOP_ONE_ISLAND\n\tgoto EventScript_ChooseDestFromOneIsland\n\tend\n"
  },
  {
    "path": "data/maps/OneIsland_House1/map.json",
    "content": "{\n  \"id\": \"MAP_ONE_ISLAND_HOUSE1\",\n  \"name\": \"OneIsland_House1\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_DEWFORD\",\n  \"region_map_section\": \"MAPSEC_ONE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_House1_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_House1_EventScript_OldWoman\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ONE_ISLAND\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/OneIsland_House1/scripts.inc",
    "content": "OneIsland_House1_MapScripts::\n\t.byte 0\n\nOneIsland_House1_EventScript_OldMan::\n\tmsgbox OneIsland_House1_Text_GazeUponVolcanoOnSunnyDays, MSGBOX_NPC\n\tend\n\nOneIsland_House1_EventScript_OldWoman::\n\tmsgbox OneIsland_House1_Text_LastTimeMtEmberErupted, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/OneIsland_House1/text.inc",
    "content": "OneIsland_House1_Text_GazeUponVolcanoOnSunnyDays::\n    .string \"On sunny days, I step out and gaze\\n\"\n    .string \"upon the volcano.\\p\"\n    .string \"That's my daily routine.$\"\n\nOneIsland_House1_Text_LastTimeMtEmberErupted::\n    .string \"Let me think… When was the last\\n\"\n    .string \"time MT. EMBER erupted?$\"\n\n"
  },
  {
    "path": "data/maps/OneIsland_House2/map.json",
    "content": "{\n  \"id\": \"MAP_ONE_ISLAND_HOUSE2\",\n  \"name\": \"OneIsland_House2\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_DEWFORD\",\n  \"region_map_section\": \"MAPSEC_ONE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_House2_EventScript_Lass\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ONE_ISLAND\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/OneIsland_House2/scripts.inc",
    "content": "OneIsland_House2_MapScripts::\n\t.byte 0\n\nOneIsland_House2_EventScript_Lass::\n\tmsgbox OneIsland_House2_Text_IWantToStayHereForever, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/OneIsland_House2/text.inc",
    "content": "OneIsland_House2_Text_IWantToStayHereForever::\n    .string \"Young people all want to go off to\\n\"\n    .string \"big cities.\\p\"\n    .string \"But I want to stay here forever!$\"\n\n"
  },
  {
    "path": "data/maps/OneIsland_KindleRoad/map.json",
    "content": "{\n  \"id\": \"MAP_ONE_ISLAND_KINDLE_ROAD\",\n  \"name\": \"OneIsland_KindleRoad\",\n  \"layout\": \"LAYOUT_ONE_ISLAND_KINDLE_ROAD\",\n  \"music\": \"MUS_ROUTE120\",\n  \"region_map_section\": \"MAPSEC_KINDLE_ROAD\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": 120,\n      \"map\": \"MAP_ONE_ISLAND\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 11,\n      \"y\": 32,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Maria\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_LAND\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 132,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Abigail\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 39,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP\",\n      \"movement_range_x\": 6,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Finn\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_LAND\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 79,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Garrett\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Tommy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BATTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 53,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 7,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Sharon\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BATTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 105,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Tanya\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 64,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Shea\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 64,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Hugh\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 89,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Bryce\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 108,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Claire\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 68,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Mik\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BATTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 68,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_Kia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 104,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 95,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 96,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 95,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 105,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_18\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 75,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_19\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 84,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1A\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 74,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1B\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 73,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1C\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 111,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1D\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 86,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1E\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 110,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1F\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 112,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_11\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 70,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_ItemEther\",\n      \"flag\": \"FLAG_HIDE_ONE_ISLAND_KINDLE_ROAD_ETHER\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 103,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_ItemMaxRepel\",\n      \"flag\": \"FLAG_HIDE_ONE_ISLAND_KINDLE_ROAD_MAX_REPEL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 114,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_ItemCarbos\",\n      \"flag\": \"FLAG_HIDE_ONE_ISLAND_KINDLE_ROAD_CARBOS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_EXTERIOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_EMBER_EXTERIOR\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 58,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ONE_ISLAND_KINDLE_ROAD_EMBER_SPA\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ONE_ISLAND_KINDLE_ROAD_GLASS_WORKSHOP\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 68,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_AshWeatherTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 68,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_AshWeatherTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 14,\n      \"y\": 114,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_DefaultWeatherTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 15,\n      \"y\": 113,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_DefaultWeatherTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 114,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_DefaultWeatherTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 115,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_DefaultWeatherTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 116,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_DefaultWeatherTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 115,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_DefaultWeatherTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 116,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_DefaultWeatherTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 20,\n      \"y\": 116,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_DefaultWeatherTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 21,\n      \"y\": 117,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_DefaultWeatherTrigger\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 59,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_EmberSpaSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 115,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_RouteSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_KindleRoad_EventScript_GlassWorkshopSign\"\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/OneIsland_KindleRoad/scripts.inc",
    "content": "OneIsland_KindleRoad_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, OneIsland_KindleRoad_OnResume\n\tmap_script MAP_SCRIPT_ON_LOAD, OneIsland_KindleRoad_AshWeatherLoad\n\t.byte 0\n\nOneIsland_KindleRoad_OnResume:\n\tsetstepcallback STEP_CB_ASH\n\tend\n\nOneIsland_KindleRoad_AshWeatherLoad:\n\tgetplayerxy VAR_TEMP_1, VAR_RESULT\n\tgoto_if_le VAR_RESULT, 60, OneIsland_KindleRoad_AshWeatherTrigger\n\trelease\n\tend\n\nOneIsland_KindleRoad_AshWeatherTrigger::\n\tsetweather WEATHER_VOLCANIC_ASH\n\tdoweather\n\trelease\n\tend\n\nOneIsland_KindleRoad_DefaultWeatherTrigger::\n\tresetweather\n\tdoweather\n\trelease\n\tend\n\nOneIsland_KindleRoad_EventScript_RouteSign::\n\tmsgbox OneIsland_KindleRoad_Text_RouteSign, MSGBOX_SIGN\n\tend\n\nOneIsland_KindleRoad_EventScript_EmberSpaSign::\n\tmsgbox OneIsland_KindleRoad_Text_EmberSpaSign, MSGBOX_SIGN\n\tend\n\nOneIsland_KindleRoad_EventScript_GlassWorkshopSign::\n\tmsgbox OneIsland_KindleRoad_Text_GlassWorkshopSign, MSGBOX_SIGN\n\tend\n\nOneIsland_KindleRoad_Text_GlassWorkshopSign:\n\t.string \"GLASS WORKSHOP\\n“Making Glass Items from Fallen Ash”$\"\n"
  },
  {
    "path": "data/maps/OneIsland_KindleRoad/text.inc",
    "content": "OneIsland_KindleRoad_Text_MariaIntro::\n    .string \"The weather's treacherous!\\n\"\n    .string \"Perfect for a battle!$\"\n\nOneIsland_KindleRoad_Text_MariaDefeat::\n    .string \"Aiyeeeeh!$\"\n\nOneIsland_KindleRoad_Text_MariaPostBattle::\n    .string \"Please don't splash my face!\\n\"\n    .string \"You'll ruin the makeup.$\"\n\nOneIsland_KindleRoad_Text_AbigailIntro::\n    .string \"I'm beginning to get a sunburn…$\"\n\nOneIsland_KindleRoad_Text_AbigailDefeat::\n    .string \"Oh, you're so awful.$\"\n\nOneIsland_KindleRoad_Text_AbigailPostBattle::\n    .string \"I like that cap you have.\\n\"\n    .string \"Maybe I should wear one, too…$\"\n\nOneIsland_KindleRoad_Text_FinnIntro::\n    .string \"Seen from here, MT. EMBER towers\\n\"\n    .string \"into the sky.$\"\n\nOneIsland_KindleRoad_Text_FinnDefeat::\n    .string \"Well, aren't you tough?$\"\n\nOneIsland_KindleRoad_Text_FinnPostBattle::\n    .string \"The sky is immense around these\\n\"\n    .string \"parts.$\"\n\nOneIsland_KindleRoad_Text_GarrettIntro::\n    .string \"I took a break from swimming,\\n\"\n    .string \"only to have you challenge me?$\"\n\nOneIsland_KindleRoad_Text_GarrettDefeat::\n    .string \"Hey, what the…\\n\"\n    .string \"You're good, you!$\"\n\nOneIsland_KindleRoad_Text_GarrettPostBattle::\n    .string \"Instead of using SURF all the time,\\n\"\n    .string \"you should swim some.$\"\n\nOneIsland_KindleRoad_Text_TommyIntro::\n    .string \"Wait! Wait a second!\\n\"\n    .string \"I think I've hooked a big one!$\"\n\nOneIsland_KindleRoad_Text_TommyDefeat::\n    .string \"I've lost it all again…$\"\n\nOneIsland_KindleRoad_Text_TommyPostBattle::\n    .string \"Not only did I lose, the big one\\n\"\n    .string \"got away from me, too!$\"\n\nOneIsland_KindleRoad_Text_SharonIntro::\n    .string \"Could you help me out with my\\n\"\n    .string \"training?$\"\n\nOneIsland_KindleRoad_Text_SharonDefeat::\n    .string \"You were a cut above me.$\"\n\nOneIsland_KindleRoad_Text_SharonPostBattle::\n    .string \"It's clear that you're skilled.\\n\"\n    .string \"I like you!$\"\n\nOneIsland_KindleRoad_Text_TanyaIntro::\n    .string \"There isn't a day in which we don't\\n\"\n    .string \"train!$\"\n\nOneIsland_KindleRoad_Text_TanyaDefeat::\n    .string \"I'm such a fool!$\"\n\nOneIsland_KindleRoad_Text_TanyaPostBattle::\n    .string \"I'll train even harder from now on!$\"\n\nOneIsland_KindleRoad_Text_SheaIntro::\n    .string \"Every morning, before breakfast,\\n\"\n    .string \"I swim around this island.$\"\n\nOneIsland_KindleRoad_Text_SheaDefeat::\n    .string \"Gasp…\\n\"\n    .string \"Gasp…$\"\n\nOneIsland_KindleRoad_Text_SheaPostBattle::\n    .string \"I lost because I'm pooped from all\\n\"\n    .string \"the running I did…$\"\n\nOneIsland_KindleRoad_Text_HughIntro::\n    .string \"Dress appropriately for battle!\\n\"\n    .string \"Lose that frivolous outfit!$\"\n\nOneIsland_KindleRoad_Text_HughDefeat::\n    .string \"Why me?!$\"\n\nOneIsland_KindleRoad_Text_HughPostBattle::\n    .string \"Even martial artists are becoming\\n\"\n    .string \"fashion conscious these days…$\"\n\nOneIsland_KindleRoad_Text_BryceIntro::\n    .string \"You know, everything tastes great\\n\"\n    .string \"when you're out in the wild.$\"\n\nOneIsland_KindleRoad_Text_BryceDefeat::\n    .string \"Awww, blown!$\"\n\nOneIsland_KindleRoad_Text_BrycePostBattle::\n    .string \"The water in volcanic regions is\\n\"\n    .string \"delicious.$\"\n\nOneIsland_KindleRoad_Text_ClaireIntro::\n    .string \"My lunch filled us up, so will you\\n\"\n    .string \"battle us for some exercise?$\"\n\nOneIsland_KindleRoad_Text_ClaireDefeat::\n    .string \"That made me all sweaty.$\"\n\nOneIsland_KindleRoad_Text_ClairePostBattle::\n    .string \"What should I do?\\n\"\n    .string \"I feel famished again.$\"\n\nOneIsland_KindleRoad_Text_KiaIntro::\n    .string \"KIA: My big brother and I make\\n\"\n    .string \"an awesome combination!$\"\n\nOneIsland_KindleRoad_Text_KiaDefeat::\n    .string \"KIA: Huh?!\\n\"\n    .string \"I can't believe it!$\"\n\nOneIsland_KindleRoad_Text_KiaPostBattle::\n    .string \"KIA: How could there be anyone\\n\"\n    .string \"better than my big brother?$\"\n\nOneIsland_KindleRoad_Text_KiaNotEnoughMons::\n    .string \"KIA: If you want to battle with\\n\"\n    .string \"us, you have to bring at least two\\l\"\n    .string \"POKéMON with you.$\"\n\nOneIsland_KindleRoad_Text_MikIntro::\n    .string \"MIK: Together with KIA, I'm afraid\\n\"\n    .string \"of nothing!$\"\n\nOneIsland_KindleRoad_Text_MikDefeat::\n    .string \"MIK: Whoa!\\n\"\n    .string \"That's too much!$\"\n\nOneIsland_KindleRoad_Text_MikPostBattle::\n    .string \"MIK: How could my combination\\n\"\n    .string \"with KIA fail?$\"\n\nOneIsland_KindleRoad_Text_MikNotEnoughMons::\n    .string \"MIK: Hey, do you want to battle\\n\"\n    .string \"with us two?\\p\"\n    .string \"Bring two or more POKéMON with\\n\"\n    .string \"you, then.$\"\n\nOneIsland_KindleRoad_Text_RouteSign::\n    .string \"This is KINDLE ROAD.\\p\"\n    .string \"Go straight for MT. EMBER.$\"\n\nOneIsland_KindleRoad_Text_EmberSpaSign::\n    .string \"Light the Fire in Your Heart!\\n\"\n    .string \"EMBER SPA$\"\n\n"
  },
  {
    "path": "data/maps/OneIsland_KindleRoad_EmberSpa/map.json",
    "content": "{\n  \"id\": \"MAP_ONE_ISLAND_KINDLE_ROAD_EMBER_SPA\",\n  \"name\": \"OneIsland_KindleRoad_EmberSpa\",\n  \"layout\": \"LAYOUT_ONE_ISLAND_KINDLE_ROAD_EMBER_SPA\",\n  \"music\": \"MUS_DEWFORD\",\n  \"region_map_section\": \"MAPSEC_EMBER_SPA\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_EmberSpa_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_EmberSpa_EventScript_BaldingMan1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_EmberSpa_EventScript_BlackBelt\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_EmberSpa_EventScript_OldWoman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_EmberSpa_EventScript_RockSmashMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_EmberSpa_EventScript_BaldingMan2\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 13,\n      \"y\": 36,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ONE_ISLAND_KINDLE_ROAD\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_EmberSpa_EventScript_SpaHeal\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/OneIsland_KindleRoad_EmberSpa/scripts.inc",
    "content": "OneIsland_KindleRoad_EmberSpa_MapScripts::\n\t.byte 0\n\nOneIsland_KindleRoad_EmberSpa_EventScript_OldMan::\n\tmsgbox OneIsland_KindleRoad_EmberSpa_Text_WaterWarmsMeToCore, MSGBOX_NPC\n\tend\n\nOneIsland_KindleRoad_EmberSpa_EventScript_BaldingMan1::\n\tmsgbox OneIsland_KindleRoad_EmberSpa_Text_EnjoyBowlOfChowder, MSGBOX_NPC\n\tend\n\nOneIsland_KindleRoad_EmberSpa_EventScript_BaldingMan2::\n\tmsgbox OneIsland_KindleRoad_EmberSpa_Text_HotSpringIsTherapeutic, MSGBOX_NPC\n\tend\n\nOneIsland_KindleRoad_EmberSpa_EventScript_OldWoman::\n\tmsgbox OneIsland_KindleRoad_EmberSpa_Text_SeeHowSmoothMySkinIs, MSGBOX_NPC\n\tend\n\nOneIsland_KindleRoad_EmberSpa_EventScript_BlackBelt::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_BRUNO, 3\n\tmsgbox OneIsland_KindleRoad_EmberSpa_Text_BrunoVisitsSpaOnOccasion\n\trelease\n\tend\n\nOneIsland_KindleRoad_EmberSpa_EventScript_RockSmashMan::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_HM06, OneIsland_KindleRoad_EmberSpa_EventScript_AlreadyGotHM06\n\tmsgbox OneIsland_KindleRoad_EmberSpa_Text_UsedThisToMakeEmberSpa\n\tgiveitem ITEM_HM06\n\tsetflag FLAG_GOT_HM06\n\tmsgbox OneIsland_KindleRoad_EmberSpa_Text_ExplainHM06\n\trelease\n\tend\n\nOneIsland_KindleRoad_EmberSpa_EventScript_AlreadyGotHM06::\n\tmsgbox OneIsland_KindleRoad_EmberSpa_Text_ExplainHM06\n\trelease\n\tend\n\nOneIsland_KindleRoad_EmberSpa_EventScript_SpaHeal::\n\tlockall\n\tfadescreen FADE_TO_WHITE\n\tspecial HealPlayerParty\n\tfadescreen FADE_FROM_WHITE\n\tmsgbox OneIsland_KindleRoad_EmberSpa_Text_WaterExquisiteFullyRefreshed\n\tsetvar VAR_TEMP_1, 1\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/OneIsland_KindleRoad_EmberSpa/text.inc",
    "content": "OneIsland_KindleRoad_EmberSpa_Text_WaterWarmsMeToCore::\n    .string \"Hm!\\n\"\n    .string \"Haaaaaaaaaaah!\\p\"\n    .string \"Aaaah! This is heavenly!\\n\"\n    .string \"The water warms me to my core!\\p\"\n    .string \"You should jump in, too.\\p\"\n    .string \"Go to the middle, relax, and get\\n\"\n    .string \"good and warm!$\"\n\nOneIsland_KindleRoad_EmberSpa_Text_EnjoyBowlOfChowder::\n    .string \"My favorite part of bathing comes\\n\"\n    .string \"up right after this.\\p\"\n    .string \"I enjoy a bowl of chowder to\\n\"\n    .string \"warm me from the inside, too!$\"\n\nOneIsland_KindleRoad_EmberSpa_Text_WaterExquisiteFullyRefreshed::\n    .string \"The water is perfectly warm.\\n\"\n    .string \"It feels exquisite…\\p\"\n    .string \"{PLAYER} and the POKéMON were\\n\"\n    .string \"fully refreshed!$\"\n\nOneIsland_KindleRoad_EmberSpa_Text_HotSpringIsTherapeutic::\n    .string \"Soaking in a hot spring pool is\\n\"\n    .string \"therapeutic, people say.$\"\n\nOneIsland_KindleRoad_EmberSpa_Text_SeeHowSmoothMySkinIs::\n    .string \"Have a look at my face.\\n\"\n    .string \"See how smooth my skin is?\\p\"\n    .string \"The hot spring's water keeps my\\n\"\n    .string \"skin younger than my age.$\"\n\nOneIsland_KindleRoad_EmberSpa_Text_BrunoVisitsSpaOnOccasion::\n    .string \"After an honest day of training,\\n\"\n    .string \"nothing beats a relaxing soak in\\l\"\n    .string \"the hot spring pool.\\p\"\n    .string \"BRUNO, who's a senior ahead of me,\\n\"\n    .string \"visits the SPA on occasion.\\p\"\n    .string \"He comes to rehab injuries, both\\n\"\n    .string \"his own and his POKéMON's.$\"\n\nOneIsland_KindleRoad_EmberSpa_Text_UsedThisToMakeEmberSpa::\n    .string \"Hot springs go hand-in-hand with\\n\"\n    .string \"volcanoes.\\p\"\n    .string \"The EMBER SPA here, well,\\n\"\n    .string \"I made it years ago.\\p\"\n    .string \"I hewed the pool right out of a\\n\"\n    .string \"gigantic boulder by hand.\\p\"\n    .string \"I was using this at the time.\\n\"\n    .string \"I suppose I can part with it.$\"\n\nOneIsland_KindleRoad_EmberSpa_Text_ExplainHM06::\n    .string \"That shatters boulders as if they\\n\"\n    .string \"were made of crackers.$\"\n\n"
  },
  {
    "path": "data/maps/OneIsland_KindleRoad_GlassWorkshop/map.json",
    "content": "{\n  \"id\": \"MAP_ONE_ISLAND_KINDLE_ROAD_GLASS_WORKSHOP\",\n  \"name\": \"OneIsland_KindleRoad_GlassWorkshop\",\n  \"layout\": \"LAYOUT_ONE_ISLAND_KINDLE_ROAD_GLASS_WORKSHOP\",\n  \"music\": \"MUS_DEWFORD\",\n  \"region_map_section\": \"MAPSEC_KINDLE_ROAD\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_GlassWorkshop_EventScript_GlassWorker\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_DOWN_AND_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_GlassWorkshop_EventScript_NinjaBoy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_KindleRoad_GlassWorkshop_EventScript_Girl\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ONE_ISLAND_KINDLE_ROAD\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_KindleRoad_GlassWorkshop_EventScript_Sign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/OneIsland_KindleRoad_GlassWorkshop/scripts.inc",
    "content": "OneIsland_KindleRoad_GlassWorkshop_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, OneIsland_KindleRoad_GlassWorkshop_OnTransition\n\t.byte 0\n\n\t.set BLUE_FLUTE_PRICE,   250\n\t.set YELLOW_FLUTE_PRICE, 500\n\t.set RED_FLUTE_PRICE,    500\n\t.set WHITE_FLUTE_PRICE,  1000\n\t.set BLACK_FLUTE_PRICE,  1000\n\t.set LOWEST_ASH_PRICE,   BLUE_FLUTE_PRICE\n\nOneIsland_KindleRoad_GlassWorkshop_OnTransition:\n\tcompare VAR_GLASS_WORKSHOP_STATE, 1\n\tcall_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ReenterWorkshopAfterSootSack\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_ReenterWorkshopAfterSootSack::\n\tsetvar VAR_GLASS_WORKSHOP_STATE, 2\n\treturn\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_GlassWorker::\n\tlock\n\tfaceplayer\n\tcompare VAR_GLASS_WORKSHOP_STATE, 10\n\tgoto_if_ge OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveItemAfterNoRoom\n\tcompare VAR_GLASS_WORKSHOP_STATE, 2\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_CheckCollectedAsh\n\tcompare VAR_GLASS_WORKSHOP_STATE, 1\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ExplainSootSack\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_GoCollectAshWithThis, MSGBOX_DEFAULT\n\tgiveitem ITEM_SOOT_SACK\n\tsetvar VAR_GLASS_WORKSHOP_STATE, 1\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_ExplainSootSack, MSGBOX_DEFAULT\n\trelease\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_ExplainSootSack::\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_ExplainSootSack, MSGBOX_DEFAULT\n\trelease\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_CheckCollectedAsh::\n\tcheckitem ITEM_SOOT_SACK, 1\n\tcompare VAR_RESULT, FALSE\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_SootSackNotInBag\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_LetsSeeCollectedAshes, MSGBOX_DEFAULT\n\tcompare VAR_ASH_GATHER_COUNT, LOWEST_ASH_PRICE\n\tgoto_if_lt OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAsh\n\tmessage OneIsland_KindleRoad_GlassWorkshop_Text_WhichGlassItemWoudYouLike\n\twaitmessage\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseGlassItem\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_SootSackNotInBag::\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_HaventGotYourSootSack, MSGBOX_DEFAULT\n\trelease\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseGlassItem::\n\tmultichoice 13, 0, MULTICHOICE_GLASS_WORKSHOP_VENDOR, FALSE\n\tcopyvar VAR_0x8009, VAR_RESULT\n\tswitch VAR_RESULT\n\tcase 0, OneIsland_KindleRoad_GlassWorkshop_EventScript_BlueFlute\n\tcase 1, OneIsland_KindleRoad_GlassWorkshop_EventScript_YellowFlute\n\tcase 2, OneIsland_KindleRoad_GlassWorkshop_EventScript_RedFlute\n\tcase 3, OneIsland_KindleRoad_GlassWorkshop_EventScript_WhiteFlute\n\tcase 4, OneIsland_KindleRoad_GlassWorkshop_EventScript_BlackFlute\n\tcase 5, OneIsland_KindleRoad_GlassWorkshop_EventScript_CancelGlassItemSelect\n\tcase 127, OneIsland_KindleRoad_GlassWorkshop_EventScript_CancelGlassItemSelect\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_BlueFlute::\n\tsetvar VAR_0x8008, ITEM_BLUE_FLUTE\n\tbufferitemname STR_VAR_1, VAR_0x8008\n\tsetvar VAR_0x800A, BLUE_FLUTE_PRICE\n\tcompare VAR_ASH_GATHER_COUNT, BLUE_FLUTE_PRICE\n\tgoto_if_lt OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAshForItem\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_IsThatTheItemForYou, MSGBOX_YESNO\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseDifferentItem\n\tsetvar VAR_GLASS_WORKSHOP_STATE, 10\n\tsubvar VAR_ASH_GATHER_COUNT, BLUE_FLUTE_PRICE\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_MakeGlassItem\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_YellowFlute::\n\tsetvar VAR_0x8008, ITEM_YELLOW_FLUTE\n\tbufferitemname STR_VAR_1, VAR_0x8008\n\tsetvar VAR_0x800A, YELLOW_FLUTE_PRICE\n\tcompare VAR_ASH_GATHER_COUNT, YELLOW_FLUTE_PRICE\n\tgoto_if_lt OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAshForItem\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_IsThatTheItemForYou, MSGBOX_YESNO\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseDifferentItem\n\tsetvar VAR_GLASS_WORKSHOP_STATE, 11\n\tsubvar VAR_ASH_GATHER_COUNT, YELLOW_FLUTE_PRICE\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_MakeGlassItem\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_RedFlute::\n\tsetvar VAR_0x8008, ITEM_RED_FLUTE\n\tbufferitemname STR_VAR_1, VAR_0x8008\n\tsetvar VAR_0x800A, RED_FLUTE_PRICE\n\tcompare VAR_ASH_GATHER_COUNT, RED_FLUTE_PRICE\n\tgoto_if_lt OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAshForItem\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_IsThatTheItemForYou, MSGBOX_YESNO\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseDifferentItem\n\tsetvar VAR_GLASS_WORKSHOP_STATE, 12\n\tsubvar VAR_ASH_GATHER_COUNT, RED_FLUTE_PRICE\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_MakeGlassItem\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_WhiteFlute::\n\tsetvar VAR_0x8008, ITEM_WHITE_FLUTE\n\tbufferitemname STR_VAR_1, VAR_0x8008\n\tsetvar VAR_0x800A, WHITE_FLUTE_PRICE\n\tcompare VAR_ASH_GATHER_COUNT, WHITE_FLUTE_PRICE\n\tgoto_if_lt OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAshForItem\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_IsThatTheItemForYou, MSGBOX_YESNO\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseDifferentItem\n\tsetvar VAR_GLASS_WORKSHOP_STATE, 13\n\tsubvar VAR_ASH_GATHER_COUNT, WHITE_FLUTE_PRICE\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_MakeGlassItem\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_BlackFlute::\n\tsetvar VAR_0x8008, ITEM_BLACK_FLUTE\n\tbufferitemname STR_VAR_1, VAR_0x8008\n\tsetvar VAR_0x800A, BLACK_FLUTE_PRICE\n\tcompare VAR_ASH_GATHER_COUNT, BLACK_FLUTE_PRICE\n\tgoto_if_lt OneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAshForItem\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_IsThatTheItemForYou, MSGBOX_YESNO\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseDifferentItem\n\tsetvar VAR_GLASS_WORKSHOP_STATE, 14\n\tsubvar VAR_ASH_GATHER_COUNT, BLACK_FLUTE_PRICE\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_MakeGlassItem\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_CancelGlassItemSelect::\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_AllThatAshButDontWantAnything, MSGBOX_DEFAULT\n\trelease\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAsh::\n\tsetvar VAR_0x800A, LOWEST_ASH_PRICE\n\tsubvar VAR_0x800A, VAR_ASH_GATHER_COUNT\n\tbuffernumberstring STR_VAR_1, VAR_0x800A\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_NotEnoughAshNeedX, MSGBOX_DEFAULT\n\trelease\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_NotEnoughAshForItem::\n\tsubvar VAR_0x800A, VAR_ASH_GATHER_COUNT\n\tbuffernumberstring STR_VAR_2, VAR_0x800A\n\tmessage OneIsland_KindleRoad_GlassWorkshop_Text_NotEnoughAshToMakeItem\n\twaitmessage\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseGlassItem\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseDifferentItem::\n\tmessage OneIsland_KindleRoad_GlassWorkshop_Text_WhichWouldYouLike\n\twaitmessage\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_ChooseGlassItem\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_MakeGlassItem::\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_IllMakeItemForYou, MSGBOX_DEFAULT\n\tclosemessage\n\tfadescreen FADE_TO_BLACK\n\tplayse SE_GLASS_FLUTE\n\tdelay 30\n\tfadescreen FADE_FROM_BLACK\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_IveFinishedGlassItem, MSGBOX_DEFAULT\n\tcall OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveGlassFlute\n\tsetvar VAR_GLASS_WORKSHOP_STATE, 2\n\trelease\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_GiveGlassFlute::\n\tswitch VAR_0x8008\n\tcase ITEM_BLUE_FLUTE, OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveBlueFlute\n\tcase ITEM_YELLOW_FLUTE, OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveYellowFlute\n\tcase ITEM_RED_FLUTE, OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveRedFlute\n\tcase ITEM_WHITE_FLUTE, OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveWhiteFlute\n\tcase ITEM_BLACK_FLUTE, OneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveBlackFlute\n\treturn\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveBlueFlute:\n\tgiveitem_msg OneIsland_KindleRoad_GlassWorkshop_Text_ReceivedFlute, ITEM_BLUE_FLUTE\n\tcompare VAR_RESULT, FALSE\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_NoRoomForFlute\n\treturn\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveYellowFlute:\n\tgiveitem_msg OneIsland_KindleRoad_GlassWorkshop_Text_ReceivedFlute, ITEM_YELLOW_FLUTE\n\tcompare VAR_RESULT, FALSE\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_NoRoomForFlute\n\treturn\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveRedFlute:\n\tgiveitem_msg OneIsland_KindleRoad_GlassWorkshop_Text_ReceivedFlute, ITEM_RED_FLUTE\n\tcompare VAR_RESULT, FALSE\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_NoRoomForFlute\n\treturn\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveWhiteFlute:\n\tgiveitem_msg OneIsland_KindleRoad_GlassWorkshop_Text_ReceivedFlute, ITEM_WHITE_FLUTE\n\tcompare VAR_RESULT, FALSE\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_NoRoomForFlute\n\treturn\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_ActuallyGiveBlackFlute:\n\tgiveitem_msg OneIsland_KindleRoad_GlassWorkshop_Text_ReceivedFlute, ITEM_BLACK_FLUTE\n\tcompare VAR_RESULT, FALSE\n\tgoto_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_NoRoomForFlute\n\treturn\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_NoRoomForFlute::\n\tcall EventScript_BagIsFull\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_NoRoomInBag, MSGBOX_DEFAULT\n\trelease\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_GiveItemAfterNoRoom::\n\tswitch VAR_GLASS_WORKSHOP_STATE\n\tcase 10, OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveBlueFlute\n\tcase 11, OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveYellowFlute\n\tcase 12, OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveRedFlute\n\tcase 13, OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveWhiteFlute\n\tcase 14, OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveBlackFlute\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_GiveBlueFlute::\n\tsetvar VAR_0x8008, ITEM_BLUE_FLUTE\n\tbufferitemname STR_VAR_1, VAR_0x8008\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_TryGiveItemAgain\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_GiveYellowFlute::\n\tsetvar VAR_0x8008, ITEM_YELLOW_FLUTE\n\tbufferitemname STR_VAR_1, VAR_0x8008\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_TryGiveItemAgain\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_GiveRedFlute::\n\tsetvar VAR_0x8008, ITEM_RED_FLUTE\n\tbufferitemname STR_VAR_1, VAR_0x8008\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_TryGiveItemAgain\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_GiveWhiteFlute::\n\tsetvar VAR_0x8008, ITEM_WHITE_FLUTE\n\tbufferitemname STR_VAR_1, VAR_0x8008\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_TryGiveItemAgain\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_GiveBlackFlute::\n\tsetvar VAR_0x8008, ITEM_BLACK_FLUTE\n\tbufferitemname STR_VAR_1, VAR_0x8008\n\tgoto OneIsland_KindleRoad_GlassWorkshop_EventScript_TryGiveItemAgain\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_TryGiveItemAgain::\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_IveFinishedGlassItem, MSGBOX_DEFAULT\n\tcall_if_eq OneIsland_KindleRoad_GlassWorkshop_EventScript_GiveGlassFlute\n\tsetvar VAR_GLASS_WORKSHOP_STATE, 2\n\trelease\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_NinjaBoy::\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_FunToBlowGlassFlute, MSGBOX_NPC\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_Girl::\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_Girl, MSGBOX_NPC\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_EventScript_Sign::\n\tmsgbox OneIsland_KindleRoad_GlassWorkshop_Text_Sign, MSGBOX_SIGN\n\tend\n\nOneIsland_KindleRoad_GlassWorkshop_Text_GoCollectAshWithThis:\n\t.string \"This area is covered in volcanic ash,\\n\"\n\t.string \"huff-puff!\\p\"\n\t.string \"I'm specially gifted, huff-puff.\\p\"\n\t.string \"I make glass out of volcanic ash\\n\"\n\t.string \"and make items, huff-puff.\\p\"\n\t.string \"Go collect ashes with this,\\nhuff-puff.$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_ExplainSootSack:\n\t.string \"Just take that SOOT SACK and walk\\n\"\n\t.string \"through piles of ash, huff-puff.\\p\"\n\t.string \"And it will fill up with the\\nvolcanic ash,\"\n\t.string \" huff-puff.\\p\"\n\t.string \"Once you think you've collected a\\ngood\"\n\t.string \" amount, come back, huff-puff.$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_LetsSeeCollectedAshes:\n\t.string \"Have you collected ashes, huff-puff?\\n\"\n\t.string \"Let me see, huff-puff.$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_NotEnoughAshNeedX:\n\t.string \"Hmmm…\\n\"\n\t.string \"There's not enough here, huff-puff.\\l\"\n\t.string \"I can't craft with this, huff-puff.\\p\"\n\t.string \"Let's see… {STR_VAR_1} is the number of\\nsteps\"\n\t.string \" you'll need to walk for me\\lto make you\"\n\t.string \" a BLUE FLUTE, huff-puff.$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_WhichGlassItemWoudYouLike:\n\t.string \"Oh! You've got a lot of ashes,\\n\"\n\t.string \"huff-puff!\\p\"\n\t.string \"I'll make you something, huff-puff!\\n\"\n\t.string \"Which one would you like, huff-puff?$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_IsThatTheItemForYou:\n\t.string \"A {STR_VAR_1}, huff-puff?\\n\"\n\t.string \"Is that the one for you, huff-puff?$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_WhichWouldYouLike:\n\t.string \"Which one would you like, huff-puff?$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_IllMakeItemForYou:\n\t.string \"A {STR_VAR_1} it is, then,\\nhuff-puff!\\p\"\n\t.string \"Okay! I'll make it now, huff-puff.\\n\"\n\t.string \"Just wait a little while, huff-puff.$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_NotEnoughAshToMakeItem:\n\t.string \"A {STR_VAR_1}, huff-puff?\\p\"\n\t.string \"There's not enough ash here to make\\n\"\n\t.string \"that, though, huff-puff.\\p\"\n\t.string \"Let's see… {STR_VAR_2} is the number of\\nsteps \"\n\t.string \"you'll need to walk through\\lvolcanic ash \"\n\t.string \"for me to make that,\\lhuff-puff.\\p\"\n\t.string \"Which item would you rather have\\n\"\n\t.string \"me make instead, huff-puff?$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_AllThatAshButDontWantAnything:\n\t.string \"You've collected all that ash, but\\nyou \"\n\t.string \"don't want anything, huff-puff?$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_IveFinishedGlassItem:\n\t.string \"Ah, I've finished your {STR_VAR_1}.\\n\"\n\t.string \"Take it, huff-puff.$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_NoRoomInBag:\n\t.string \"Oh?\\n\"\n\t.string \"You've no room in your BAG, huff-puff.\\p\"\n\t.string \"I'll hold on to it, so come back later,\\n\"\n\t.string \"huff-puff.$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_HaventGotYourSootSack:\n\t.string \"Hah? You haven't got your SOOT SACK\\n\"\n\t.string \"with you, huff-puff.\\p\"\n\t.string \"You have to keep it with you to collect\\n\"\n\t.string \"volcanic ash, huff-puff.$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_FunToBlowGlassFlute:\n\t.string \"I'm an apprentice learning how to\\n\"\n\t.string \"make glass items from ash.\\p\"\n\t.string \"Did you know that the BLUE FLUTE\\n\"\n\t.string \"wakes up POKéMON who hear it?\\p\"\n\t.string \"But, to me, the nicest-sounding\\n\"\n\t.string \"flute that wakes up sleeping\\l\"\n\t.string \"POKéMON is the POKé FLUTE!\\p\"\n\t.string \"…I wonder if I'll ever learn to make\\n\"\n\t.string \"one of those.$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_Girl:\n\t.string \"My uncle makes glass stuff too!\\n\"\n\t.string \"He lives far away, huff-puff.\\p\"\n\t.string \"I saw a dizzy, spotted POKéMON when\\n\"\n\t.string \"we went to visit him, huff-puff!$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_Sign:\n\t.string \"“Available Glass Items,”\\n\"\n\t.string \"the sign says.\\p\"\n\t.string \"BLUE FLUTE: Awakens a sleeping\\n\"\n\t.string \"POKéMON.\\p\"\n\t.string \"YELLOW FLUTE: Snaps a POKéMON\\nout \"\n\t.string \"of confusion.\\p\"\n\t.string \"RED FLUTE: Snaps a POKéMON\\nout \"\n\t.string \"of infatuation.\\p\"\n\t.string \"WHITE FLUTE: Makes wild POKéMON\\n\"\n\t.string \"appear more frequently.\\p\"\n\t.string \"BLACK FLUTE: Makes wild POKéMON\\n\"\n\t.string \"appear less frequently.$\"\n\nOneIsland_KindleRoad_GlassWorkshop_Text_ReceivedFlute:\n\t.string \"{PLAYER} received the\\n{STR_VAR_1}!$\"\n\n"
  },
  {
    "path": "data/maps/OneIsland_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_ONE_ISLAND_POKEMON_CENTER_1F\",\n  \"name\": \"OneIsland_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_ONE_ISLAND_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_NET_CENTER\",\n  \"region_map_section\": \"MAPSEC_ONE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BILL\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_Bill\",\n      \"flag\": \"FLAG_HIDE_ONE_ISLAND_POKECENTER_BILL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CELIO\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_Celio\",\n      \"flag\": \"FLAG_HIDE_ONE_ISLAND_POKECENTER_CELIO\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_Hiker\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BATTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_BattleGirl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCOTT\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_Scott\",\n      \"flag\": \"FLAG_HIDE_SCOTT\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ONE_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_ONE_ISLAND_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F\",\n      \"var_value\": \"2\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F\",\n      \"var_value\": \"2\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerMidTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F\",\n      \"var_value\": \"2\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerMidBottom\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F\",\n      \"var_value\": \"2\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerBottom\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_NetworkMachine\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_NetworkMachine\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_NetworkMachine\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_NetworkMachine\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_NetworkMachine\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_NetworkMachine\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_NetworkMachine\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_NetworkMachine\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"OneIsland_PokemonCenter_1F_EventScript_NetworkMachine\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/OneIsland_PokemonCenter_1F/scripts.inc",
    "content": ".equ LOCALID_BILL,  3\n.equ LOCALID_CELIO, 4\n.equ LOCALID_SCOTT, 8\n\nOneIsland_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, OneIsland_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, OneIsland_PokemonCenter_1F_OnLoad\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, OneIsland_PokemonCenter_1F_OnFrame\n\t.byte 0\n\nOneIsland_PokemonCenter_1F_OnLoad::\n\tcall_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, OneIsland_PokemonCenter_1F_EventScript_SetRubyMetatile\n\tcall_if_set FLAG_SYS_CAN_LINK_WITH_RS, OneIsland_PokemonCenter_1F_EventScript_SetNetworkMachineOn\n\tgoto PokemonCenter_1F_OnLoad\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_SetRubyMetatile::\n\tsetmetatile 13, 4, METATILE_PokemonCenter_NetworkMachine_Ruby, 1\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_SetSapphireMetatile::\n\tsetmetatile 16, 4, METATILE_PokemonCenter_NetworkMachine_Sapphire, 1\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_SetNetworkMachineOn::\n\tcall OneIsland_PokemonCenter_1F_EventScript_SetSapphireMetatile\n\tsetmetatile 14, 4, METATILE_PokemonCenter_NetworkMachine_ScreenLeft_On, 1\n\tsetmetatile 15, 4, METATILE_PokemonCenter_NetworkMachine_ScreenRight_On, 1\n\treturn\n\nOneIsland_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_ONE_ISLAND\n\tcall_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 6, OneIsland_PokemonCenter_1F_EventScript_SetCelioQuestDone\n\tcall_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 0, OneIsland_PokemonCenter_1F_EventScript_SetBillCelioFirstMeetingPos\n\tcall_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 2, OneIsland_PokemonCenter_1F_EventScript_SetBillCelioReadyToLeavePos\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_SetCelioQuestDone::\n\tsetvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 7\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_SetBillCelioFirstMeetingPos::\n\tsetobjectxyperm LOCALID_BILL, 9, 8\n\tsetobjectmovementtype LOCALID_BILL, MOVEMENT_TYPE_FACE_UP\n\tsetobjectxyperm LOCALID_CELIO, 15, 6\n\tsetobjectmovementtype LOCALID_CELIO, MOVEMENT_TYPE_FACE_UP\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_SetBillCelioReadyToLeavePos::\n\tsetobjectxyperm LOCALID_BILL, 14, 7\n\tsetobjectmovementtype LOCALID_BILL, MOVEMENT_TYPE_FACE_LEFT\n\tsetobjectxyperm LOCALID_CELIO, 14, 8\n\tsetobjectmovementtype LOCALID_CELIO, MOVEMENT_TYPE_FACE_LEFT\n\treturn\n\nOneIsland_PokemonCenter_1F_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 0, OneIsland_PokemonCenter_1F_EventScript_MeetCelioScene\n\t.2byte 0\n\nOneIsland_PokemonCenter_1F_EventScript_MeetCelioScene::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement OBJ_EVENT_ID_PLAYER, OneIsland_PokemonCenter_1F_Movement_PlayerWalkToCelio\n\tapplymovement LOCALID_BILL, OneIsland_PokemonCenter_1F_Movement_BillWalkToCelio\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_BillHeyThereCelio\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tplayse SE_PIN\n\tapplymovement LOCALID_CELIO, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tapplymovement LOCALID_CELIO, Common_Movement_Delay48\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_CelioCantBelieveYouCameOut\n\tmsgbox OneIsland_PokemonCenter_1F_Text_BillHowsYourResearchComing\n\tapplymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_ThisIsMyBuddyCelio\n\tapplymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tcall_if_set FLAG_SYS_GAME_CLEAR, OneIsland_PokemonCenter_1F_EventScript_IntroducePlayerChamp\n\tcall_if_unset FLAG_SYS_GAME_CLEAR, OneIsland_PokemonCenter_1F_EventScript_IntroducePlayerNotChamp\n\tapplymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_CelioThatsReallyImpressive\n\tmsgbox OneIsland_PokemonCenter_1F_Text_BillBringMeUpToSpeed\n\tapplymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_CelioPCsCantLinkWithYours\n\tclosemessage\n\tapplymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_BillLetMeHelpYou\n\tapplymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_CanYouDeliverThisMeteoritePlayer\n\tmsgreceiveditem OneIsland_PokemonCenter_1F_Text_AcceptedMeteoriteFromBill, ITEM_METEORITE, 1, MUS_OBTAIN_KEY_ITEM\n\tadditem ITEM_METEORITE\n\tapplymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_CelioPleaseTakeThis\n\tgiveitem_msg OneIsland_PokemonCenter_1F_Text_ObtainedTriPass, ITEM_TRI_PASS, 1, MUS_OBTAIN_KEY_ITEM\n\tmsgbox OneIsland_PokemonCenter_1F_Text_PassLetsYouTravelBetweenIslands\n\tcall_if_ge VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2, OneIsland_PokemonCenter_1F_EventScript_ReceiveTownMapPage\n\tcall_if_lt VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2, OneIsland_PokemonCenter_1F_EventScript_ReceiveTownMap\n\tsetflag FLAG_SYS_SEVII_MAP_123\n\tmsgbox OneIsland_PokemonCenter_1F_Text_BillCatchYouLater\n\tclosemessage\n\tapplymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tapplymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tsetflag FLAG_SYS_PC_STORAGE_DISABLED\n\tsetvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 1\n\treleaseall\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_IntroducePlayerChamp::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_PlayerIsReigningPokemonChamp\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_IntroducePlayerNotChamp::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_PlayerIsRisingPokemonChamp\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_ReceiveTownMapPage::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\tmessage OneIsland_PokemonCenter_1F_Text_ReceivedExtraPageForTownMap\n\twaitmessage\n\twaitfanfare\n\tcall EventScript_RestorePrevTextColor\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_ReceiveTownMap::\n\tsetflag FLAG_HIDE_TOWN_MAP\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2\n\tgiveitem_msg OneIsland_PokemonCenter_1F_Text_ReceivedTownMap, ITEM_TOWN_MAP, 1, MUS_OBTAIN_KEY_ITEM\n\treturn\n\nOneIsland_PokemonCenter_1F_Movement_PlayerWalkToCelio::\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_up\n\tstep_end\n\nOneIsland_PokemonCenter_1F_Movement_BillWalkToCelio::\n\twalk_up\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_up\n\twalk_in_place_faster_right\n\tstep_end\n\n@ Unused\nOneIsland_PokemonCenter_1F_Movement_WalkUp:\n\twalk_up\n\tstep_end\n\n@ Unused\nOneIsland_PokemonCenter_1F_Movement_StepAsideLeft::\n\twalk_left\n\twalk_in_place_faster_right\n\tstep_end\n\nOneIsland_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_Bill::\n\tlock\n\tgoto_if_set FLAG_SEVII_DETOUR_FINISHED, OneIsland_PokemonCenter_1F_EventScript_BillGoTakeStroll\n\tmsgbox OneIsland_PokemonCenter_1F_Text_HmmHowAboutLikeThis\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_BillGoTakeStroll::\n\tapplymovement LOCALID_BILL, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_GotPCWorkingStrollAWhileMore\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_Celio::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 7, OneIsland_PokemonCenter_1F_EventScript_CelioGiveBillFact\n\tgoto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 6, OneIsland_PokemonCenter_1F_EventScript_CelioJustGivenSapphire\n\tgoto_if_set FLAG_RECOVERED_SAPPHIRE, OneIsland_PokemonCenter_1F_EventScript_GiveCelioSapphire\n\tgoto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, OneIsland_PokemonCenter_1F_EventScript_ExplainRainbowPass\n\tgoto_if_set FLAG_GOT_RUBY, OneIsland_PokemonCenter_1F_EventScript_GiveCelioRuby\n\tgoto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 4, OneIsland_PokemonCenter_1F_EventScript_CelioWaitingForRuby\n\tgoto_if_set FLAG_SYS_RECEIVED_EXTENDED_DEX, OneIsland_PokemonCenter_1F_EventScript_CelioRequestRuby\n\tgoto_if_eq VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 3, OneIsland_PokemonCenter_1F_EventScript_CelioPlayerMissingNationalDex\n\tmsgbox OneIsland_PokemonCenter_1F_Text_SorryForBeingPoorHost\n\tclosemessage\n\tapplymovement LOCALID_CELIO, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_CelioGiveBillFact::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_CelioHearingRumorsAboutYou\n\trandom 3\n\tgoto_if_eq VAR_RESULT, 0, OneIsland_PokemonCenter_1F_EventScript_BillFact1\n\tgoto_if_eq VAR_RESULT, 1, OneIsland_PokemonCenter_1F_EventScript_BillFact2\n\tfamechecker FAMECHECKER_BILL, 5\n\tmsgbox OneIsland_PokemonCenter_1F_Text_BillCantStomachMilk\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_BillFact1::\n\tfamechecker FAMECHECKER_BILL, 3\n\tmsgbox OneIsland_PokemonCenter_1F_Text_BillsFirstMonWasAbra\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_BillFact2::\n\tfamechecker FAMECHECKER_BILL, 4\n\tmsgbox OneIsland_PokemonCenter_1F_Text_BillsHometownInGoldenrod\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_CelioJustGivenSapphire::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_WishYouBestOfLuck\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_GiveCelioSapphire::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_OBTAIN_TMHM\n\tmessage OneIsland_PokemonCenter_1F_Text_HandedSapphireToCelio\n\twaitmessage\n\twaitfanfare\n\tcall EventScript_RestorePrevTextColor\n\tremoveitem ITEM_SAPPHIRE\n\tmsgbox OneIsland_PokemonCenter_1F_Text_ThankYouGiveMeTime\n\tclosemessage\n\tapplymovement LOCALID_CELIO, OneIsland_PokemonCenter_1F_Movement_CelioPutGemInMachine\n\twaitmovement 0\n\tplayse SE_CLICK\n\tcall OneIsland_PokemonCenter_1F_EventScript_SetSapphireMetatile\n\tspecial DrawWholeMapView\n\tmsgbox OneIsland_PokemonCenter_1F_Text_OkayThisIsGood\n\tclosemessage\n\tdelay 60\n\tapplymovement LOCALID_CELIO, OneIsland_PokemonCenter_1F_Movement_CelioCheckMachine\n\twaitmovement 0\n\tdelay 30\n\tapplymovement LOCALID_CELIO, OneIsland_PokemonCenter_1F_Movement_CelioCheckMachine\n\twaitmovement 0\n\tdelay 40\n\tplayse SE_PC_ON\n\tcall OneIsland_PokemonCenter_1F_EventScript_SetNetworkMachineOn\n\tspecial DrawWholeMapView\n\tmsgbox OneIsland_PokemonCenter_1F_Text_LinkedUpWithLanette\n\tapplymovement LOCALID_CELIO, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_ManagedToLinkWithHoennThankYou\n\tgiveitem ITEM_HM08, 1\n\tmsgbox OneIsland_PokemonCenter_1F_Text_ExplainDive\n\tspecial SetPostgameFlags\n\tsetflag FLAG_SYS_CAN_LINK_WITH_RS\n\tsetflag FLAG_HIDE_CERULEAN_CAVE_GUARD\n\tsetflag FLAG_HIDE_LORELEI_IN_HER_HOUSE\n\tsetvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 6\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_ExplainRainbowPass::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_PassLetYouGetToAllIslands\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_GiveCelioRuby::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_OhThats\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_OBTAIN_TMHM\n\tmessage OneIsland_PokemonCenter_1F_Text_HandedRubyToCelio\n\twaitmessage\n\twaitfanfare\n\tcall EventScript_RestorePrevTextColor\n\tclosemessage\n\tapplymovement LOCALID_CELIO, OneIsland_PokemonCenter_1F_Movement_CelioPutGemInMachine\n\twaitmovement 0\n\tplayse SE_CLICK\n\tcall OneIsland_PokemonCenter_1F_EventScript_SetRubyMetatile\n\tspecial DrawWholeMapView\n\tdelay 30\n\tapplymovement LOCALID_CELIO, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_MayIAskOneMoreFavor, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, OneIsland_PokemonCenter_1F_EventScript_DeclineHelpCelio\n\tgoto OneIsland_PokemonCenter_1F_EventScript_GiveRainbowPass\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_DeclineHelpCelio::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_PleaseINeedYourHelp, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, OneIsland_PokemonCenter_1F_EventScript_DeclineHelpCelio\n\tgoto OneIsland_PokemonCenter_1F_EventScript_GiveRainbowPass\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_GiveRainbowPass::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_AnotherGemstoneInSeviiIslands\n\tremoveitem ITEM_RUBY\n\tremoveitem ITEM_TRI_PASS\n\tsetvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5\n\tadditem ITEM_RAINBOW_PASS\n\tsetflag FLAG_SYS_SEVII_MAP_4567\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\tmessage OneIsland_PokemonCenter_1F_Text_ReturnedTriPassForRainbowPass\n\twaitmessage\n\twaitfanfare\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\tmessage OneIsland_PokemonCenter_1F_Text_ObtainedExtraMapPage\n\twaitmessage\n\twaitfanfare\n\tcall EventScript_RestorePrevTextColor\n\tgoto OneIsland_PokemonCenter_1F_EventScript_ExplainRainbowPassScott\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_ExplainRainbowPassScott::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_PassLetYouGetToAllIslandsScott\n\tclosemessage\n\tturnobject LOCALID_SCOTT, DIR_NORTH\n\tplayse SE_PIN\n\tapplymovement LOCALID_SCOTT, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_SCOTT, Common_Movement_Delay48\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_YoureTheChamp\n\tclosemessage\n\tgetplayerxy VAR_0x8005, VAR_0x8007\n\tcall_if_lt VAR_0x8005, 15, OneIsland_PokemonCenter_1F_EventScript_ScottToLeft\n\tcall_if_eq VAR_0x8005, 15, OneIsland_PokemonCenter_1F_EventScript_ScottToCenter\n\tcall_if_gt VAR_0x8005, 15, OneIsland_PokemonCenter_1F_EventScript_ScottToRight\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_SOUTH\n\tmsgbox OneIsland_PokemonCenter_1F_Text_ExcuseMe\n\tclosemessage\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_WEST\n\tgetplayerxy VAR_0x8005, VAR_0x8007\n\tcall_if_eq VAR_0x8005, 15, OneIsland_PokemonCenter_1F_EventScript_ScottLeftOne\n\tcall_if_gt VAR_0x8005, 15, OneIsland_PokemonCenter_1F_EventScript_ScottLeftTwo\n\tapplymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottExits\n\twaitmovement 0\n\tcall_if_ne VAR_0x8005, 15, OneIsland_PokemonCenter_1F_EventScript_ScottExitsDownStep\n\tremoveobject LOCALID_SCOTT\n\tplayse SE_EXIT\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_ScottExitsDownStep::\n\tapplymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottExitsDownStep\n\twaitmovement 0\n\treturn\n\nOneIsland_PokemonCenter_1F_Movement_ScottExitsDownStep::\n\twalk_down\n\tstep_end\n\nOneIsland_PokemonCenter_1F_EventScript_ScottLeftOne::\n\tapplymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottLeftOne\n\twaitmovement 0\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_ScottLeftTwo::\n\tapplymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottLeftTwo\n\twaitmovement 0\n\treturn\n\nOneIsland_PokemonCenter_1F_Movement_ScottLeftOne::\n\twalk_left\n\tstep_end\n\nOneIsland_PokemonCenter_1F_Movement_ScottLeftTwo::\n\twalk_left\n\twalk_left\n\tstep_end\n\nOneIsland_PokemonCenter_1F_Movement_ScottExits::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\tstep_end\n\nOneIsland_PokemonCenter_1F_Text_ExcuseMe::\n\t.string \"Excuse me!\\n\"\n\t.string \"I couldn't help but overhear.\\p\"\n\t.string \"Let me introduce myself.\\n\"\n\t.string \"My name's SCOTT.\\p\"\n\t.string \"I've been traveling everywhere in\\n\"\n\t.string \"search of outstanding TRAINERS.\\p\"\n\t.string \"More specifically, I'm looking for\\n\"\n\t.string \"POKéMON battle experts.\\p\"\n\t.string \"There's a place I'd like to\\n\"\n\t.string \"invite someone like you.\\p\"\n\t.string \"It's the…\\n\"\n\t.string \"BATTLE TOWER!\\p\"\n\t.string \"I'm about to head to VERMILION\\n\"\n\t.string \"to continue my search.\\p\"\n\t.string \"I'll tell the ferryman there to let\\n\"\n\t.string \"you sail to HOENN and check it out\\l\"\n\t.string \"for yourself!\\p\"\n\t.string \"Well, I'll be seeing you!$\"\n\nOneIsland_PokemonCenter_1F_EventScript_ScottToLeft::\n\tapplymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottToLeft\n\twaitmovement 0\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_ScottToCenter::\n\tapplymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottToCenter\n\twaitmovement 0\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_ScottToRight::\n\tapplymovement LOCALID_SCOTT, OneIsland_PokemonCenter_1F_Movement_ScottToRight\n\twaitmovement 0\n\treturn\n\nOneIsland_PokemonCenter_1F_Text_YoureTheChamp::\n\t.string \"You're the KANTO LEAGUE CHAMPION?$\"\n\nOneIsland_PokemonCenter_1F_EventScript_Scott::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_ScottOnPhone\n\tfaceplayer\n\tmsgbox OneIsland_PokemonCenter_1F_Text_HeyOnCall\n\tturnobject LOCALID_SCOTT, DIR_EAST\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_Text_ScottOnPhone:\n\t.string \"…I'm not so sure about the\\n\"\n\t.string \"TRAINERS here.\\p\"\n\t.string \"I think I'm going to roam the\\n\"\n\t.string \"towns in KANTO instead.$\"\n\nOneIsland_PokemonCenter_1F_Text_HeyOnCall:\n\t.string \"Hey! Can't you see I'm on a call?$\"\n\nOneIsland_PokemonCenter_1F_Movement_ScottToLeft::\n\twalk_up\n\twalk_left\n\twalk_up\n\tstep_end\n\nOneIsland_PokemonCenter_1F_Movement_ScottToCenter::\n\twalk_up\n\tstep_end\n\nOneIsland_PokemonCenter_1F_Movement_ScottToRight::\n\twalk_up\n\twalk_right\n\twalk_up\n\tstep_end\n\nOneIsland_PokemonCenter_1F_EventScript_CelioWaitingForRuby::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_TryingToFindGem\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_CelioRequestRuby::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_CelioCaughtMoreMonMaybeICanBeUseful\n\tapplymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_YoullBeTradingFromTrainersFarAway\n\tapplymovement LOCALID_CELIO, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_NeedsSpecialGemstone\n\tsetvar VAR_MAP_SCENE_MT_EMBER_EXTERIOR, 1\n\tsetvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 4\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_CelioPlayerMissingNationalDex::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_CelioImModifyingMyNetworkMachine\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_Movement_CelioCheckMachine::\n\twalk_in_place_up\n\tdelay_8\n\twalk_in_place_up\n\tstep_end\n\nOneIsland_PokemonCenter_1F_Movement_CelioPutGemInMachine::\n\twalk_in_place_faster_up\n\twalk_in_place_up\n\tdelay_16\n\twalk_in_place_up\n\twalk_in_place_up\n\tstep_end\n\nOneIsland_PokemonCenter_1F_EventScript_LittleBoy::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_CameFromPalletDontKnowIt, MSGBOX_NPC\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_Hiker::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_EnormousVolcanoOnIsland, MSGBOX_NPC\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_BattleGirl::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_SYS_CAN_LINK_WITH_RS, OneIsland_PokemonCenter_1F_EventScript_BattleGirlHoennLinked\n\tmsgbox OneIsland_PokemonCenter_1F_Text_WishICouldTradeWithBoyfriend\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_BattleGirlHoennLinked::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_TradedWithFarAwayBoyfriend\n\trelease\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_NetworkMachine::\n\tlockall\n\tgoto_if_set FLAG_SYS_CAN_LINK_WITH_RS, OneIsland_PokemonCenter_1F_EventScript_NetworkMachineLinkedWithHoenn\n\tgoto_if_set FLAG_SEVII_DETOUR_FINISHED, OneIsland_PokemonCenter_1F_EventScript_NetworkMachineLinkedWithKanto\n\tmsgbox OneIsland_PokemonCenter_1F_Text_MachineUnderAdjustment\n\treleaseall\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_NetworkMachineLinkedWithKanto::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_MachineLinkedWithKanto\n\treleaseall\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_NetworkMachineLinkedWithHoenn::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_MachineLinkedWithKantoAndHoenn\n\treleaseall\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerTop::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandScene\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerMidTop::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tgoto OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandScene\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerMidBottom::\n\tlockall\n\tsetvar VAR_TEMP_1, 3\n\tgoto OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandScene\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandTriggerBottom::\n\tlockall\n\tsetvar VAR_TEMP_1, 4\n\tgoto OneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandScene\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_LeaveOneIslandScene::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tplayse SE_PIN\n\tapplymovement LOCALID_BILL, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_BillOhHeyPlayer\n\tclosemessage\n\tcall_if_eq VAR_TEMP_1, 1, OneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillTop\n\tcall_if_eq VAR_TEMP_1, 2, OneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillMidTop\n\tcall_if_eq VAR_TEMP_1, 3, OneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillMidBottom\n\tcall_if_eq VAR_TEMP_1, 4, OneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillBottom\n\tdelay 10\n\tmsgbox OneIsland_PokemonCenter_1F_Text_BillWeGotItDone\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_CelioJobWentQuick\n\tapplymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tapplymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_BillYouveLearnedALot\n\tmsgbox OneIsland_PokemonCenter_1F_Text_CelioOhReallyEhehe\n\tclosemessage\n\tapplymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tdelay 10\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tdelay 15\n\tmsgbox OneIsland_PokemonCenter_1F_Text_BillWeShouldHeadBackToKanto\n\tclosemessage\n\tapplymovement LOCALID_BILL, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tdelay 15\n\tapplymovement LOCALID_CELIO, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tmsgbox OneIsland_PokemonCenter_1F_Text_CelioPromiseIllShowYouAroundSometime\n\tclosemessage\n\tdelay 25\n\tapplymovement OBJ_EVENT_ID_PLAYER, OneIsland_PokemonCenter_1F_Movement_PlayerExit\n\tapplymovement LOCALID_BILL, OneIsland_PokemonCenter_1F_Movement_BillExit\n\twaitmovement 0\n\tplayse SE_EXIT\n\tsetflag FLAG_HIDE_ONE_ISLAND_POKECENTER_BILL\n\tsetvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 3\n\tclearflag FLAG_HIDE_CINNABAR_BILL\n\tsetvar VAR_MAP_SCENE_CINNABAR_ISLAND, 3\n\tsetvar VAR_0x8004, SEAGALLOP_ONE_ISLAND\n\tsetvar VAR_0x8006, SEAGALLOP_CINNABAR_ISLAND\n\tgoto EventScript_SetSail\n\tend\n\nOneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillTop::\n\tapplymovement OBJ_EVENT_ID_PLAYER, OneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillTop\n\twaitmovement 0\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillMidTop::\n\tapplymovement OBJ_EVENT_ID_PLAYER, OneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillMidTop\n\twaitmovement 0\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillMidBottom::\n\tapplymovement OBJ_EVENT_ID_PLAYER, OneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillMidBottom\n\twaitmovement 0\n\treturn\n\nOneIsland_PokemonCenter_1F_EventScript_PlayerWalkToBillBottom::\n\tapplymovement OBJ_EVENT_ID_PLAYER, OneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillBottom\n\twaitmovement 0\n\treturn\n\nOneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillTop::\n\twalk_right\n\twalk_down\n\twalk_in_place_faster_right\n\tstep_end\n\nOneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillMidTop::\n\twalk_right\n\tstep_end\n\nOneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillMidBottom::\n\twalk_right\n\twalk_up\n\twalk_in_place_faster_right\n\tstep_end\n\nOneIsland_PokemonCenter_1F_Movement_PlayerWalkToBillBottom::\n\twalk_right\n\twalk_up\n\twalk_up\n\twalk_in_place_faster_right\n\tstep_end\n\n@ Unused\nOneIsland_PokemonCenter_1F_Movement_DelayWalkInPlaceLeft::\n\tdelay_16\n\tdelay_16\n\tdelay_4\n\twalk_in_place_faster_left\n\tstep_end\n\n@ Unused\nOneIsland_PokemonCenter_1F_Movement_WalkInPlaceDown::\n\twalk_in_place_fast_down\n\tstep_end\n\nOneIsland_PokemonCenter_1F_Movement_PlayerExit::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\tstep_end\n\nOneIsland_PokemonCenter_1F_Movement_BillExit::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/OneIsland_PokemonCenter_1F/text.inc",
    "content": "OneIsland_PokemonCenter_1F_Text_BillHeyThereCelio::\n    .string \"BILL: Hey, there!\\n\"\n    .string \"CELIO!$\"\n\nOneIsland_PokemonCenter_1F_Text_CelioCantBelieveYouCameOut::\n    .string \"CELIO: BILL!\\n\"\n    .string \"I can't believe you came out here.$\"\n\nOneIsland_PokemonCenter_1F_Text_BillHowsYourResearchComing::\n    .string \"BILL: Well, absolutely!\\n\"\n    .string \"How's your research coming along?\\p\"\n    .string \"…Oh, wait a sec.$\"\n\nOneIsland_PokemonCenter_1F_Text_ThisIsMyBuddyCelio::\n    .string \"{PLAYER}, this is my buddy CELIO.\\n\"\n    .string \"He's one dedicated PC MANIAC!$\"\n\nOneIsland_PokemonCenter_1F_Text_PlayerIsRisingPokemonChamp::\n    .string \"CELIO, this is {PLAYER}, a rising\\n\"\n    .string \"contender as the POKéMON CHAMP!$\"\n\nOneIsland_PokemonCenter_1F_Text_PlayerIsReigningPokemonChamp::\n    .string \"CELIO, this is {PLAYER}, the\\n\"\n    .string \"reigning POKéMON CHAMP!$\"\n\nOneIsland_PokemonCenter_1F_Text_CelioThatsReallyImpressive::\n    .string \"CELIO: That's really impressive.\\p\"\n    .string \"I hate to say it, but I have zero\\n\"\n    .string \"aptitude for battling.\\p\"\n    .string \"Anyways, I'm glad to meet you.$\"\n\nOneIsland_PokemonCenter_1F_Text_BillBringMeUpToSpeed::\n    .string \"BILL: So, bring me up to speed.\\n\"\n    .string \"How's your machine running?$\"\n\nOneIsland_PokemonCenter_1F_Text_CelioPCsCantLinkWithYours::\n    .string \"CELIO: It's running fine, but we're\\n\"\n    .string \"too remote out here.\\p\"\n    .string \"The PCs on this island just can't\\n\"\n    .string \"link with your PC, BILL.$\"\n\nOneIsland_PokemonCenter_1F_Text_BillLetMeHelpYou::\n    .string \"BILL: Oh, yeah?\\n\"\n    .string \"Okay, let me take a look-see.\\p\"\n    .string \"…Hang on here…\\n\"\n    .string \"I think we can make it work.\\l\"\n    .string \"Let me help you, okay?$\"\n\nOneIsland_PokemonCenter_1F_Text_CanYouDeliverThisMeteoritePlayer::\n    .string \"{PLAYER}, can I get you to wait for\\n\"\n    .string \"me just a bit?\\p\"\n    .string \"…Actually, can I get you to do\\n\"\n    .string \"me a favor?\\p\"\n    .string \"The island next to this one's\\n\"\n    .string \"called TWO ISLAND.\\p\"\n    .string \"There's a guy there that runs\\n\"\n    .string \"a GAME CORNER.\\p\"\n    .string \"He has this thing for rare rocks\\n\"\n    .string \"and gems.\\p\"\n    .string \"We keep in touch, being fellow\\n\"\n    .string \"maniacs.\\p\"\n    .string \"So, can I get you to deliver this\\n\"\n    .string \"METEORITE to him?$\"\n\nOneIsland_PokemonCenter_1F_Text_AcceptedMeteoriteFromBill::\n    .string \"{PLAYER} accepted the METEORITE\\n\"\n    .string \"from BILL.$\"\n\nOneIsland_PokemonCenter_1F_Text_CelioPleaseTakeThis::\n    .string \"CELIO: {PLAYER}, if you are going\\n\"\n    .string \"to TWO ISLAND, please take this.$\"\n\nOneIsland_PokemonCenter_1F_Text_PassLetsYouTravelBetweenIslands::\n    .string \"It's a PASS for the ferry service\\n\"\n    .string \"serving the local islands.\\p\"\n    .string \"It will let you travel between the\\n\"\n    .string \"ISLANDS ONE, TWO, and THREE.\\p\"\n    .string \"Oh, you should have this, too.$\"\n\nOneIsland_PokemonCenter_1F_Text_ReceivedExtraPageForTownMap::\n    .string \"{PLAYER} received an extra page\\n\"\n    .string \"for the TOWN MAP!$\"\n\nOneIsland_PokemonCenter_1F_Text_ReceivedTownMap::\n    .string \"{PLAYER} received\\n\"\n    .string \"a TOWN MAP!$\"\n\nOneIsland_PokemonCenter_1F_Text_BillCatchYouLater::\n    .string \"BILL: I'll catch you later!\\n\"\n    .string \"Say hi to the guy for me!$\"\n\nOneIsland_PokemonCenter_1F_Text_HmmHowAboutLikeThis::\n    .string \"Hmm…\\p\"\n    .string \"How about we try this like this…$\"\n\nOneIsland_PokemonCenter_1F_Text_GotPCWorkingStrollAWhileMore::\n    .string \"Oh, hey, {PLAYER}!\\p\"\n    .string \"Did you see?\\n\"\n    .string \"We got the PC working!\\p\"\n    .string \"I've got a few things to show\\n\"\n    .string \"CELIO here.\\p\"\n    .string \"Can you go out on a stroll or\\n\"\n    .string \"something for a while more?$\"\n\nOneIsland_PokemonCenter_1F_Text_SorryForBeingPoorHost::\n    .string \"I'm sorry for taking up so much of\\n\"\n    .string \"BILL's time.\\p\"\n    .string \"I'm also sorry for being such a \\n\"\n    .string \"poor host on your visit here.$\"\n\nOneIsland_PokemonCenter_1F_Text_UsualPCServicesUnavailable::\n    .string \"The usual PC services aren't\\n\"\n    .string \"available…$\"\n\nOneIsland_PokemonCenter_1F_Text_BillOhHeyPlayer::\n    .string \"BILL: Oh, hey!\\n\"\n    .string \"{PLAYER}!$\"\n\nOneIsland_PokemonCenter_1F_Text_BillWeGotItDone::\n    .string \"BILL: What kept you so long?\\n\"\n    .string \"Been out having a good time?\\p\"\n    .string \"We got it done.\\n\"\n    .string \"The PCs are up and running!$\"\n\nOneIsland_PokemonCenter_1F_Text_CelioJobWentQuick::\n    .string \"CELIO: The job went incredibly\\n\"\n    .string \"quick.\\p\"\n    .string \"BILL is one amazing guy…$\"\n\nOneIsland_PokemonCenter_1F_Text_BillYouveLearnedALot::\n    .string \"BILL: No, no! There was almost\\n\"\n    .string \"nothing left for me to do.\\p\"\n    .string \"CELIO, I have to hand it to you.\\n\"\n    .string \"You've learned a lot.$\"\n\nOneIsland_PokemonCenter_1F_Text_CelioOhReallyEhehe::\n    .string \"CELIO: Oh, really?\\n\"\n    .string \"Ehehe…$\"\n\nOneIsland_PokemonCenter_1F_Text_BillWeShouldHeadBackToKanto::\n    .string \"BILL: Well, there you have it.\\n\"\n    .string \"I'm finished with the job.\\l\"\n    .string \"We should head back to KANTO.\\p\"\n    .string \"CELIO, I'll be seeing you again.$\"\n\nOneIsland_PokemonCenter_1F_Text_CelioPromiseIllShowYouAroundSometime::\n    .string \"CELIO: {PLAYER}, I'm really sorry\\n\"\n    .string \"that we sent you off alone today.\\p\"\n    .string \"I promise, I will show you around\\n\"\n    .string \"these islands sometime.$\"\n\nOneIsland_PokemonCenter_1F_Text_CelioImModifyingMyNetworkMachine::\n    .string \"CELIO: Hello!\\n\"\n    .string \"You look awfully busy as always.\\p\"\n    .string \"How am I doing?\\p\"\n    .string \"Well, I'm modifying my Network\\n\"\n    .string \"Machine.\\p\"\n    .string \"When I get done with the machine,\\n\"\n    .string \"I hope you'll be first to use it,\\l\"\n    .string \"{PLAYER}.$\"\n\nOneIsland_PokemonCenter_1F_Text_CelioCaughtMoreMonMaybeICanBeUseful::\n    .string \"CELIO: {PLAYER}, how have things\\n\"\n    .string \"been for you?\\p\"\n    .string \"Oh, is that right?\\n\"\n    .string \"You've caught more POKéMON.\\p\"\n    .string \"Do you know what?\\n\"\n    .string \"Maybe I can be useful to you.$\"\n\nOneIsland_PokemonCenter_1F_Text_YoullBeTradingFromTrainersFarAway::\n    .string \"I'm modifying the Network Machine\\n\"\n    .string \"right now.\\p\"\n    .string \"I'm changing it so it can handle\\n\"\n    .string \"trades over long distances.\\p\"\n    .string \"When I get finished, you'll be\\n\"\n    .string \"trading for exotic POKéMON from\\l\"\n    .string \"TRAINERS far away.$\"\n\nOneIsland_PokemonCenter_1F_Text_NeedsSpecialGemstone::\n    .string \"But, there is a slight catch.\\p\"\n    .string \"For the link to work, the Machine\\n\"\n    .string \"needs a special gemstone.\\p\"\n    .string \"It's supposed to be on ONE ISLAND,\\n\"\n    .string \"but I haven't found one yet.\\p\"\n    .string \"Who knows where it could be.$\"\n\nOneIsland_PokemonCenter_1F_Text_TryingToFindGem::\n    .string \"I was trying to find the gem\\n\"\n    .string \"even while I was studying.\\p\"\n    .string \"As a result, I've made no headway\\n\"\n    .string \"in both my search and studies…\\p\"\n    .string \"If I relied on BILL, I'm sure my\\n\"\n    .string \"research would progress.\\p\"\n    .string \"But this time, I want to try to do\\n\"\n    .string \"things by myself.$\"\n\nOneIsland_PokemonCenter_1F_Text_OhThats::\n    .string \"Oh!\\n\"\n    .string \"Th-that's…$\"\n\nOneIsland_PokemonCenter_1F_Text_HandedRubyToCelio::\n    .string \"{PLAYER} handed the RUBY\\n\"\n    .string \"to CELIO.$\"\n\nOneIsland_PokemonCenter_1F_Text_MayIAskOneMoreFavor::\n    .string \"Thank you!\\n\"\n    .string \"{PLAYER}, you're simply amazing.\\p\"\n    .string \"… … …  … … …\\p\"\n    .string \"Um… May I ask one more giant favor\\n\"\n    .string \"of you?$\"\n\nOneIsland_PokemonCenter_1F_Text_PleaseINeedYourHelp::\n    .string \"It… It's not anything weird.\\n\"\n    .string \"Please, I need your help.$\"\n\nOneIsland_PokemonCenter_1F_Text_AnotherGemstoneInSeviiIslands::\n    .string \"While I was studying gemstones,\\n\"\n    .string \"I discovered something important.\\p\"\n    .string \"There is another gem that forms\\n\"\n    .string \"a pair with this RUBY.\\p\"\n    .string \"That other gemstone is supposed to\\n\"\n    .string \"be in the SEVII ISLANDS.\\p\"\n    .string \"{PLAYER}, please, I need you to go\\n\"\n    .string \"find the other gem.\\p\"\n    .string \"{PLAYER}, may I have your ferry\\n\"\n    .string \"PASS and the TOWN MAP?$\"\n\nOneIsland_PokemonCenter_1F_Text_ReturnedTriPassForRainbowPass::\n    .string \"{PLAYER} returned the TRI-PASS and\\n\"\n    .string \"received the RAINBOW PASS.$\"\n\nOneIsland_PokemonCenter_1F_Text_ObtainedExtraMapPage::\n    .string \"Obtained an extra page for the\\n\"\n    .string \"TOWN MAP!$\"\n\nOneIsland_PokemonCenter_1F_Text_PassLetYouGetToAllIslands::\n    .string \"This is my own ferry PASS.\\p\"\n    .string \"It will let you get to all the\\n\"\n    .string \"SEVII ISLANDS.\\p\"\n    .string \"{PLAYER}, please, I can't do\\n\"\n    .string \"it without your help.$\"\n\nOneIsland_PokemonCenter_1F_Text_PassLetYouGetToAllIslandsScott::\n    .string \"This is my own ferry PASS.\\p\"\n    .string \"It will let you get to all the\\n\"\n    .string \"SEVII ISLANDS.\\p\"\n    .string \"{PLAYER}, please, I can't do\\n\"\n    .string \"it without your help.\\p\"\n    .string \"As the CHAMPION, your POKéMON\\n\"\n    .string \"are amazingly strong.\\p\"\n    .string \"You should be safe exploring\\n\"\n    .string \"the rest of the islands.$\"\n\nOneIsland_PokemonCenter_1F_Text_HandedSapphireToCelio::\n    .string \"{PLAYER} handed the SAPPHIRE\\n\"\n    .string \"to CELIO.$\"\n\nOneIsland_PokemonCenter_1F_Text_ThankYouGiveMeTime::\n    .string \"CELIO: So this is the gem that\\n\"\n    .string \"forms a pair with the RUBY…\\p\"\n    .string \"{PLAYER}, you've gone through a lot\\n\"\n    .string \"to get this, didn't you?\\p\"\n    .string \"You don't have to tell me. I know\\n\"\n    .string \"it wasn't easy.\\p\"\n    .string \"Thank you so much!\\p\"\n    .string \"Now it's my turn to work for you!\\n\"\n    .string \"Please give me a little time.$\"\n\nOneIsland_PokemonCenter_1F_Text_OkayThisIsGood::\n    .string \"Okay, this is good…$\"\n\nOneIsland_PokemonCenter_1F_Text_LinkedUpWithLanette::\n    .string \"I did it!\\n\"\n    .string \"I linked up with LANETTE!$\"\n\nOneIsland_PokemonCenter_1F_Text_ManagedToLinkWithHoennThankYou::\n    .string \"{PLAYER}…\\n\"\n    .string \"{PLAYER}, I did it!\\p\"\n    .string \"I've managed to link up with\\n\"\n    .string \"TRAINERS in the HOENN region!\\p\"\n    .string \"Finally, the Network Machine is\\n\"\n    .string \"fully operational!\\p\"\n    .string \"{PLAYER}, I owe it all to you!\\p\"\n    .string \"Thanks to you, my dream came\\n\"\n    .string \"true…\\p\"\n    .string \"I want to give you something\\n\"\n    .string \"to thank you for all your help.$\"\n\nOneIsland_PokemonCenter_1F_Text_ExplainDive::\n    .string \"Sometimes while SURFING, you'll\\n\"\n    .string \"notice dark patches of water.\\p\"\n    .string \"The water there's deep, so you can\\n\"\n    .string \"use DIVE to drop to the seafloor.\\p\"\n    .string \"When you want to surface, you can\\n\"\n    .string \"use DIVE again as long there's\\l\"\n    .string \"nothing blocking you.$\"\n\nOneIsland_PokemonCenter_1F_Text_WishYouBestOfLuck::\n    .string \"I…\\n\"\n    .string \"I'm not crying.\\p\"\n    .string \"That's enough about me!\\p\"\n    .string \"{PLAYER}, you're going to keep\\n\"\n    .string \"looking for exotic POKéMON, right?\\p\"\n    .string \"I wish you the best of luck!$\"\n\nOneIsland_PokemonCenter_1F_Text_CelioHearingRumorsAboutYou::\n    .string \"CELIO: Hello!\\p\"\n    .string \"{PLAYER}, I've been hearing rumors\\n\"\n    .string \"about you.$\"\n\nOneIsland_PokemonCenter_1F_Text_BillsFirstMonWasAbra::\n    .string \"{PLAYER}, what's your favorite kind\\n\"\n    .string \"of POKéMON?\\p\"\n    .string \"BILL is a POKéMANIAC, so he loves\\n\"\n    .string \"every kind.\\p\"\n    .string \"Apparently, the first one he caught\\n\"\n    .string \"was an ABRA.$\"\n\nOneIsland_PokemonCenter_1F_Text_BillsHometownInGoldenrod::\n    .string \"By the way, {PLAYER}, you're from\\n\"\n    .string \"PALLET TOWN, aren't you?\\p\"\n    .string \"I've heard that it's a quiet and\\n\"\n    .string \"pleasant place.\\p\"\n    .string \"BILL's hometown is GOLDENROD CITY,\\n\"\n    .string \"where his folks still live.\\p\"\n    .string \"I've heard that it's quite the\\n\"\n    .string \"festive, bustling city.\\p\"\n    .string \"I'd like to go there one day.$\"\n\nOneIsland_PokemonCenter_1F_Text_BillCantStomachMilk::\n    .string \"{PLAYER}, is there anything that\\n\"\n    .string \"you can't stand?\\p\"\n    .string \"Apparently, BILL simply can't\\n\"\n    .string \"stomach milk at all.$\"\n\nOneIsland_PokemonCenter_1F_Text_CameFromPalletDontKnowIt::\n    .string \"Oh, you're a stranger here!\\n\"\n    .string \"Hi! Where did you come from?\\p\"\n    .string \"…PALLET TOWN?\\n\"\n    .string \"I don't know it!$\"\n\nOneIsland_PokemonCenter_1F_Text_EnormousVolcanoOnIsland::\n    .string \"On this island, there's an enormous\\n\"\n    .string \"volcano.\\p\"\n    .string \"It hasn't erupted lately, so why\\n\"\n    .string \"not enjoy a hike?$\"\n\nOneIsland_PokemonCenter_1F_Text_WishICouldTradeWithBoyfriend::\n    .string \"I wish I could trade POKéMON with\\n\"\n    .string \"my boyfriend who lives far away…$\"\n\nOneIsland_PokemonCenter_1F_Text_TradedWithFarAwayBoyfriend::\n    .string \"I traded POKéMON with my boyfriend\\n\"\n    .string \"far away!\\p\"\n    .string \"Everyone's saying that we can\\n\"\n    .string \"thank you and CELIO.\\p\"\n    .string \"So, thank you!$\"\n\nOneIsland_PokemonCenter_1F_Text_MachineUnderAdjustment::\n    .string \"Network Machine\\n\"\n    .string \"Link Level 0\\p\"\n    .string \"…POKéMON Storage System under\\n\"\n    .string \"adjustment…$\"\n\nOneIsland_PokemonCenter_1F_Text_MachineLinkedWithKanto::\n    .string \"Network Machine\\n\"\n    .string \"Link Level 1\\p\"\n    .string \"Link established with the KANTO\\n\"\n    .string \"region.$\"\n\nOneIsland_PokemonCenter_1F_Text_MachineLinkedWithKantoAndHoenn::\n    .string \"Network Machine\\n\"\n    .string \"Link Level 2\\p\"\n    .string \"Link established with the KANTO\\n\"\n    .string \"and HOENN regions.$\"\n\nOneIsland_PokemonCenter_1F_Text_ObtainedTriPass::\n    .string \"Obtained the TRI-PASS!$\"\n\n"
  },
  {
    "path": "data/maps/OneIsland_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_ONE_ISLAND_POKEMON_CENTER_2F\",\n  \"name\": \"OneIsland_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_ONE_ISLAND_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_NET_CENTER\",\n  \"region_map_section\": \"MAPSEC_ONE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_ONE_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/OneIsland_PokemonCenter_2F/scripts.inc",
    "content": "OneIsland_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nOneIsland_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nOneIsland_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nOneIsland_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/OneIsland_TreasureBeach/map.json",
    "content": "{\n  \"id\": \"MAP_ONE_ISLAND_TREASURE_BEACH\",\n  \"name\": \"OneIsland_TreasureBeach\",\n  \"layout\": \"LAYOUT_ONE_ISLAND_TREASURE_BEACH\",\n  \"music\": \"MUS_ROUTE120\",\n  \"region_map_section\": \"MAPSEC_TREASURE_BEACH\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_ONE_ISLAND\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 8,\n      \"y\": 11,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"OneIsland_TreasureBeach_EventScript_Amara\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"OneIsland_TreasureBeach_EventScript_Boy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 8,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"item\": \"ITEM_STARDUST\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STARDUST\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 13,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"item\": \"ITEM_STARDUST\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STARDUST_2\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 11,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PEARL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_PEARL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 9,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PEARL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_PEARL_2\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 15,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ULTRA_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 16,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ULTRA_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL_2\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 15,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"item\": \"ITEM_STAR_PIECE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STAR_PIECE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 8,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"item\": \"ITEM_BIG_PEARL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_BIG_PEARL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/OneIsland_TreasureBeach/scripts.inc",
    "content": "OneIsland_TreasureBeach_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, OneIsland_TreasureBeach_OnResume\n\t.byte 0\n\nOneIsland_TreasureBeach_OnResume:\n\tsetstepcallback STEP_CB_ASH\n\tend\n\nOneIsland_TreasureBeach_EventScript_Boy::\n\tmsgbox OneIsland_TreasureBeach_Text_GoodThingsWashUpOnBeach, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/OneIsland_TreasureBeach/text.inc",
    "content": "OneIsland_TreasureBeach_Text_AmaraIntro::\n    .string \"Lying back, rocked by the waves…\\n\"\n    .string \"It's exquisite.$\"\n\nOneIsland_TreasureBeach_Text_AmaraDefeat::\n    .string \"I lost…\\n\"\n    .string \"It feels awful.$\"\n\nOneIsland_TreasureBeach_Text_AmaraPostBattle::\n    .string \"The sea is pleasantly warm in these\\n\"\n    .string \"parts.$\"\n\nOneIsland_TreasureBeach_Text_GoodThingsWashUpOnBeach::\n    .string \"Good things get washed up by the\\n\"\n    .string \"ocean current onto this beach.\\p\"\n    .string \"That's why I often come here for\\n\"\n    .string \"some beachcombing.$\"\n\n"
  },
  {
    "path": "data/maps/PalletTown/map.json",
    "content": "{\n  \"id\": \"MAP_PALLET_TOWN\",\n  \"name\": \"PalletTown\",\n  \"layout\": \"LAYOUT_PALLET_TOWN\",\n  \"music\": \"MUS_PALLET\",\n  \"region_map_section\": \"MAPSEC_PALLET_TOWN\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE1\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE21_NORTH\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_EventScript_SignLady\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 6,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_EventScript_FatMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PROF_OAK\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_OAK_IN_PALLET_TOWN\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_EventScript_MasterYoungster\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PALLET_TOWN_PLAYERS_HOUSE_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PALLET_TOWN_RIVALS_HOUSE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 16,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PALLET_TOWN_PROFESSOR_OAKS_LAB\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PALLET_TOWN_OAK\",\n      \"var_value\": \"0\",\n      \"script\": \"PalletTown_EventScript_OakTriggerLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PALLET_TOWN_OAK\",\n      \"var_value\": \"0\",\n      \"script\": \"PalletTown_EventScript_OakTriggerRight\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_2\",\n      \"var_value\": \"1\",\n      \"script\": \"PalletTown_EventScript_SignLadyTrigger\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_EventScript_OaksLabSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_EventScript_PlayersHouseSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_EventScript_RivalsHouseSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_EventScript_TownSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_EventScript_TrainerTips\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PalletTown/scripts.inc",
    "content": ".equ LOCALID_SIGN_LADY, 1\n.equ LOCALID_PROF_OAK,  3\n.equ LOCALID_MASTER_YOUNGSTER, 4\n\n.equ SIGN_LADY_READY, VAR_TEMP_2\n\nPalletTown_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PalletTown_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, PalletTown_OnFrame\n\t.byte 0\n\nPalletTown_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_PALLET_TOWN\n\tcall_if_set FLAG_PALLET_LADY_NOT_BLOCKING_SIGN, PalletTown_EventScript_TryReadySignLady\n\tcall_if_eq VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 0, PalletTown_EventScript_SetSignLadyPos\n\tcall_if_eq VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1, PalletTown_EventScript_SetSignLadyDone\n\tcall_if_eq VAR_MAP_SCENE_PALLET_TOWN_OAK, 3, PalletTown_EventScript_PlaceMasterYoungsterOutsideLab\n\tend\n\nPalletTown_EventScript_TryReadySignLady::\n\tgoto_if_unset FLAG_OPENED_START_MENU, EventScript_Return\n\tgoto_if_ge VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1, EventScript_Return\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1\n\treturn\n\nPalletTown_EventScript_SetSignLadyDone::\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 2\n\treturn\n\nPalletTown_EventScript_SetSignLadyPos::\n\tgoto_if_set FLAG_PALLET_LADY_NOT_BLOCKING_SIGN, PalletTown_EventScript_MoveSignLadyToRouteEntrance\n\tsetobjectxyperm LOCALID_SIGN_LADY, 5, 15\n\tsetobjectmovementtype LOCALID_SIGN_LADY, MOVEMENT_TYPE_FACE_UP\n\treturn\n\nPalletTown_EventScript_MoveSignLadyToRouteEntrance::\n\tsetobjectxyperm LOCALID_SIGN_LADY, 12, 2\n\tsetobjectmovementtype LOCALID_SIGN_LADY, MOVEMENT_TYPE_FACE_DOWN\n\tsetvar SIGN_LADY_READY, TRUE\n\treturn\n\nPalletTown_EventScript_PlaceMasterYoungsterOutsideLab::\n\tsetobjectxyperm LOCALID_MASTER_YOUNGSTER, 15, 14\n\tsetobjectmovementtype LOCALID_MASTER_YOUNGSTER, MOVEMENT_TYPE_FACE_RIGHT\n\treturn\n\nPalletTown_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_PALLET_TOWN_OAK, 2, PalletTown_EventScript_OakRatingScene\n\tmap_script_2 VAR_MAP_SCENE_PALLET_TOWN_OAK, 3, PalletTown_EventScript_MasterTrainerYoungster\n\t.2byte 0\n\n@ Master Trainer Youngster explains after exiting lab with upgraded dex\nPalletTown_EventScript_MasterTrainerYoungster::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlockall\n\ttextcolor 0\n\tapplymovement LOCALID_MASTER_YOUNGSTER, SevenIsland_House_Room2_Movement_StepFastestRight\n\tapplymovement OBJ_EVENT_ID_PLAYER, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\tsetvar VAR_LAST_TALKED, LOCALID_MASTER_YOUNGSTER\n\tmsgbox PalletTown_Text_MasterYoungsterIntroduce, MSGBOX_NPC\n\tapplymovement LOCALID_MASTER_YOUNGSTER, PalletTown_Movement_MoveYoungsterOffScreen\n\twaitmovement 0\n\tsetobjectxyperm LOCALID_MASTER_YOUNGSTER, 10, 7\n\tsetobjectxy LOCALID_MASTER_YOUNGSTER, 10, 7\n\tsetobjectmovementtypeinstant LOCALID_MASTER_YOUNGSTER, MOVEMENT_TYPE_FACE_DOWN\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_OAK, 4\n\treleaseall\n\tend\n\nPalletTown_Text_MasterYoungsterIntroduce:\n\t.string \"Hey, sorry to bug you while your\\n\"\n\t.string \"world's expanding.\\p\"\n\t.string \"Now that you've successfully become\\n\"\n\t.string \"CHAMPION, I've got news for you!\\p\"\n\t.string \"The MASTER TRAINERS, TRAINERS that\\n\"\n\t.string \"that have spent their whole careers\\l\"\n\t.string \"training one specific POKéMON, have\\l\"\n\t.string \"appeared throughout KANTO.\\p\"\n\t.string \"If you want to know the details,\\n\"\n\t.string \"come talk to me!$\"\n\nPalletTown_Movement_MoveYoungsterOffScreen:\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tface_down\n\tstep_end\n\n@ Oak approaches player after exiting their house post Elite Four to check if they should receieve the National Dex\nPalletTown_EventScript_OakRatingScene::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tsetobjectxyperm LOCALID_PROF_OAK, 14, 14\n\tsetobjectmovementtype LOCALID_PROF_OAK, MOVEMENT_TYPE_FACE_LEFT\n\taddobject LOCALID_PROF_OAK\n\tapplymovement LOCALID_PROF_OAK, PalletTown_Movement_OakWalkToPlayersDoor\n\twaitmovement 0\n\tmsgbox PalletTown_Text_OakLetMeSeePokedex\n\tsetvar VAR_0x8004, 0\n\tspecialvar VAR_RESULT, GetPokedexCount\n\tcopyvar VAR_0x8008, VAR_0x8005\n\tcopyvar VAR_0x8009, VAR_0x8006\n\tbuffernumberstring STR_VAR_1, VAR_0x8008\n\tbuffernumberstring STR_VAR_2, VAR_0x8009\n\tcall_if_lt VAR_0x8009, 60, PalletTown_EventScript_NotEnoughMonsForNationalDex\n\tcall_if_ge VAR_0x8009, 60, PalletTown_EventScript_EnoughMonsForNationalDex\n\tplaybgm MUS_FOLLOW_ME, 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_Movement_PlayerWalkToLabFromHouse\n\tapplymovement LOCALID_PROF_OAK, PalletTown_Movement_OakWalkToLabFromHouse\n\twaitmovement 0\n\topendoor 16, 13\n\twaitdooranim\n\tapplymovement LOCALID_PROF_OAK, PalletTown_Movement_OakEnterLab\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_Movement_PlayerEnterLab\n\twaitmovement 0\n\tclosedoor 16, 13\n\twaitdooranim\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 7\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_OAK, 3\n\tsetflag FLAG_HIDE_OAK_IN_PALLET_TOWN\n\twarp MAP_PALLET_TOWN_PROFESSOR_OAKS_LAB, 6, 12\n\twaitstate\n\treleaseall\n\tend\n\nPalletTown_EventScript_EndOakRatingScene::\n\tclosemessage\n\tapplymovement LOCALID_PROF_OAK, PalletTown_Movement_OakExit\n\twaitmovement 0\n\tremoveobject LOCALID_PROF_OAK\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_OAK, 3\n\treleaseall\n\tend\n\nPalletTown_EventScript_NotEnoughMonsForNationalDex::\n\tmsgbox PalletTown_Text_CaughtXPuttingInHonestEffort\n\tclosemessage\n\treturn\n\nPalletTown_EventScript_EnoughMonsForNationalDex::\n\tmsgbox PalletTown_Text_CaughtXImpressiveFollowMe\n\tclosemessage\n\treturn\n\nPalletTown_Movement_OakWalkToPlayersDoor::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_in_place_faster_up\n\tstep_end\n\nPalletTown_Movement_OakExit::\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\tstep_end\n\nPalletTown_Movement_OakWalkToLabFromHouse::\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_up\n\tstep_end\n\nPalletTown_Movement_PlayerWalkToLabFromHouse::\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\tstep_end\n\nPalletTown_EventScript_OakTriggerLeft::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto PalletTown_EventScript_OakTrigger\n\tend\n\nPalletTown_EventScript_OakTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto PalletTown_EventScript_OakTrigger\n\tend\n\nPalletTown_EventScript_OakTrigger::\n\tfamechecker FAMECHECKER_OAK, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tdelay 30\n\tplaybgm MUS_OAK, 0\n\tmessage PalletTown_Text_OakDontGoOut\n\twaitmessage\n\tdelay 85\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tplayse SE_PIN\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tdelay 30\n\taddobject LOCALID_PROF_OAK\n\tcall_if_eq VAR_TEMP_1, 0, PalletTown_EventScript_OakEnterLeft\n\tcall_if_eq VAR_TEMP_1, 1, PalletTown_EventScript_OakEnterRight\n\tdelay 30\n\tmsgbox PalletTown_Text_OakGrassUnsafeNeedMon\n\tclosemessage\n\tdelay 30\n\tcall_if_eq VAR_TEMP_1, 0, PalletTown_EventScript_OakLeadPlayerToLabLeft\n\tcall_if_eq VAR_TEMP_1, 1, PalletTown_EventScript_OakLeadPlayerToLabRight\n\topendoor 16, 13\n\twaitdooranim\n\tapplymovement LOCALID_PROF_OAK, PalletTown_Movement_OakEnterLab\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_Movement_PlayerEnterLab\n\twaitmovement 0\n\tclosedoor 16, 13\n\twaitdooranim\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 1\n\tclearflag FLAG_HIDE_OAK_IN_HIS_LAB\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_OAK, 1\n\tsetflag FLAG_HIDE_OAK_IN_PALLET_TOWN\n\tsetflag FLAG_DONT_TRANSITION_MUSIC\n\twarp MAP_PALLET_TOWN_PROFESSOR_OAKS_LAB, 6, 12\n\twaitstate\n\treleaseall\n\tend\n\nPalletTown_EventScript_OakEnterLeft::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_Movement_OakEnterLeft\n\twaitmovement 0\n\treturn\n\nPalletTown_EventScript_OakEnterRight::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_Movement_OakEnterRight\n\twaitmovement 0\n\treturn\n\nPalletTown_EventScript_OakLeadPlayerToLabLeft::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_Movement_OakWalkToLabLeft\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_Movement_PlayerWalkToLabLeft\n\twaitmovement 0\n\treturn\n\nPalletTown_EventScript_OakLeadPlayerToLabRight::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_Movement_OakWalkToLabRight\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_Movement_PlayerWalkToLabRight\n\twaitmovement 0\n\treturn\n\nPalletTown_Movement_OakEnterLeft::\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_up\n\twalk_up\n\tstep_end\n\nPalletTown_Movement_OakEnterRight::\n\twalk_right\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_up\n\twalk_up\n\tstep_end\n\n\t.macro walk_to_lab\n\twalk_left\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\t.endm\n\nPalletTown_Movement_OakWalkToLabLeft::\n\twalk_down\n\twalk_to_lab\n\twalk_right\n\twalk_in_place_faster_up\n\tstep_end\n\nPalletTown_Movement_OakWalkToLabRight::\n\twalk_down\n\twalk_left\n\twalk_to_lab\n\twalk_right\n\twalk_in_place_faster_up\n\tstep_end\n\nPalletTown_Movement_OakEnterLab::\n\twalk_up\n\tset_invisible\n\tstep_end\n\nPalletTown_Movement_PlayerWalkToLabLeft::\n\twalk_down\n\twalk_down\n\twalk_to_lab\n\tstep_end\n\nPalletTown_Movement_PlayerWalkToLabRight::\n\twalk_down\n\twalk_down\n\twalk_left\n\twalk_to_lab\n\tstep_end\n\nPalletTown_Movement_PlayerEnterLab::\n\twalk_right\n\twalk_up\n\tset_invisible\n\tstep_end\n\nPalletTown_EventScript_SignLady::\n\tlock\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 2, PalletTown_EventScript_SignLadyDone\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1, PalletTown_EventScript_SignLadyJustShowedSign\n\tgoto_if_eq SIGN_LADY_READY, TRUE, PalletTown_EventScript_SignLadyStartShowSign\n\tgoto_if_set FLAG_TEMP_2, PalletTown_EventScript_SignLadyGoReadSign\n\tmsgbox PalletTown_Text_HmmIsThatRight\n\tapplymovement LOCALID_SIGN_LADY, Common_Movement_FacePlayer\n\twaitmovement 0\n\tplayse SE_PIN\n\tapplymovement LOCALID_SIGN_LADY, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_SIGN_LADY, Common_Movement_Delay48\n\twaitmovement 0\n\tmsgbox PalletTown_Text_OhLookLook\n\tclosemessage\n\tcall_if_eq VAR_FACING, DIR_EAST, PalletTown_EventScript_SignLadyMoveOutOfWayRight\n\tcall_if_ne VAR_FACING, DIR_EAST, PalletTown_EventScript_SignLadyMoveOutOfWayLeft\n\tcopyobjectxytoperm LOCALID_SIGN_LADY\n\tsetflag FLAG_TEMP_2\n\trelease\n\tend\n\nPalletTown_EventScript_SignLadyMoveOutOfWayRight::\n\tapplymovement LOCALID_SIGN_LADY, PalletTown_Movement_SignLadyMoveOutOfWayRight\n\twaitmovement 0\n\treturn\n\nPalletTown_EventScript_SignLadyMoveOutOfWayLeft::\n\tapplymovement LOCALID_SIGN_LADY, PalletTown_Movement_SignLadyMoveOutOfWayLeft\n\twaitmovement 0\n\treturn\n\nPalletTown_EventScript_SignLadyDone::\n\tapplymovement LOCALID_SIGN_LADY, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox PalletTown_Text_RaisingMonsToo\n\trelease\n\tend\n\nPalletTown_EventScript_SignLadyGoReadSign::\n\tapplymovement LOCALID_SIGN_LADY, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox PalletTown_Text_ReadItReadIt\n\trelease\n\tend\n\nPalletTown_EventScript_SignLadyJustShowedSign::\n\tapplymovement LOCALID_SIGN_LADY, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox PalletTown_Text_SignsAreUsefulArentThey\n\trelease\n\tend\n\nPalletTown_Movement_SignLadyMoveOutOfWayRight::\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nPalletTown_Movement_SignLadyMoveOutOfWayLeft::\n\twalk_left\n\twalk_in_place_faster_right\n\tstep_end\n\nPalletTown_EventScript_FatMan::\n\tmsgbox PalletTown_Text_CanStoreItemsAndMonsInPC, MSGBOX_NPC\n\tend\n\nPalletTown_EventScript_OaksLabSign::\n\tlockall\n\tfamechecker FAMECHECKER_OAK, 0\n\tmsgbox PalletTown_Text_OakPokemonResearchLab\n\treleaseall\n\tend\n\nPalletTown_EventScript_PlayersHouseSign::\n\tmsgbox PalletTown_Text_PlayersHouse, MSGBOX_SIGN\n\tend\n\nPalletTown_EventScript_RivalsHouseSign::\n\tmsgbox PalletTown_Text_RivalsHouse, MSGBOX_SIGN\n\tend\n\nPalletTown_EventScript_TownSign::\n\tmsgbox PalletTown_Text_TownSign, MSGBOX_SIGN\n\tend\n\nPalletTown_EventScript_TrainerTips::\n\tlockall\n\tmsgbox PalletTown_Text_PressStartToOpenMenu\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1\n\treleaseall\n\tend\n\nPalletTown_EventScript_SignLadyTrigger::\n\tlockall\n\tapplymovement LOCALID_SIGN_LADY, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tcall PalletTown_EventScript_SignLadyShowSign\n\treleaseall\n\tend\n\nPalletTown_EventScript_SignLadyShowSign::\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox PalletTown_Text_LookCopiedTrainerTipsSign\n\tclosemessage\n\tdelay 20\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tsetflag FLAG_OPENED_START_MENU\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1\n\tsetvar SIGN_LADY_READY, FALSE\n\tspecial SetWalkingIntoSignVars\n\tspecial DisableMsgBoxWalkaway\n\tsignmsg\n\tmsgbox PalletTown_Text_PressStartToOpenMenuCopy\n\tnormalmsg\n\treturn\n\nPalletTown_EventScript_SignLadyStartShowSign::\n\tapplymovement LOCALID_SIGN_LADY, Common_Movement_FacePlayer\n\twaitmovement 0\n\tcall PalletTown_EventScript_SignLadyShowSign\n\trelease\n\tend\n\nPalletTown_EventScript_MasterYoungster::\n\tlock\n\tfaceplayer\n\tmessage PalletTown_Text_AskAboutMasterTrainers\n\twaitmessage\n\tmultichoice 13, 5, MULTICHOICE_MASTER_YOUNGSTER, FALSE\n\tswitch VAR_RESULT\n\tcase 0, PalletTown_EventScript_WhoAreThey\n\tcase 1, PalletTown_EventScript_HowDoIBattleThem\n\tcase 2, PalletTown_EventScript_AboutTitles\n\tcase 3, PalletTown_EventScript_Nothing\n\tcase 127, PalletTown_EventScript_Nothing \n\tend\n\nPalletTown_EventScript_WhoAreThey::\n\tmsgbox PalletTown_Text_WhoAreThey, MSGBOX_NPC\n\tend\n\nPalletTown_EventScript_HowDoIBattleThem::\n\tmsgbox PalletTown_Text_HowDoIBattleThem, MSGBOX_NPC\n\tend\n\nPalletTown_EventScript_AboutTitles::\n\tmsgbox PalletTown_Text_AboutTitles, MSGBOX_NPC\n\tend\n\nPalletTown_EventScript_Nothing::\n\tmsgbox PalletTown_Text_Nothing, MSGBOX_NPC\n\tend\n\nPalletTown_Text_AskAboutMasterTrainers::\n\t.string \"What do you want to know about\\n\"\n\t.string \"the MASTER TRAINERS?$\"\n\nPalletTown_Text_WhoAreThey::\n\t.string \"The MASTER TRAINERS each focus\\n\"\n\t.string \"on training one species of POKéMON.\\p\"\n\t.string \"They're always waving at TRAINERS to\\n\"\n\t.string \"get a battle going, so you should\\l\"\n\t.string \"be able to find them pretty easily.$\"\n\nPalletTown_Text_HowDoIBattleThem::\n\t.string \"If you have the same species of\\n\"\n\t.string \"POKéMON as them, you'll be able\\l\"\n\t.string \"to battle them, one-on-one.\\p\"\n\t.string \"Neither side will be allowed to\\n\"\n\t.string \"use items, so it will be a battle\\l\"\n\t.string \"of pure skill!\\p\"\n\t.string \"If you win, you'll receive a title\\n\"\n\t.string \"and you'll be able to use it from\\l\"\n\t.string \"that point on.$\"\n\nPalletTown_Text_AboutTitles::\n\t.string \"You can change the title you're\\n\"\n\t.string \"using at the game company in\\l\"\n\t.string \"CELADON CITY.\\p\"\n\t.string \"Show it off during link battles!$\"\n\nPalletTown_Text_Nothing::\n\t.string \"Good luck!$\""
  },
  {
    "path": "data/maps/PalletTown/text.inc",
    "content": "PalletTown_Text_OakDontGoOut::\n    .string \"OAK: Hey! Wait!\\n\"\n    .string \"Don't go out!$\"\n\nPalletTown_Text_OakGrassUnsafeNeedMon::\n    .string \"OAK: It's unsafe!\\n\"\n    .string \"Wild POKéMON live in tall grass!\\p\"\n    .string \"You need your own POKéMON for\\n\"\n    .string \"your protection.\\p\"\n    .string \"I know!\\n\"\n    .string \"Here, come with me!$\"\n\nPalletTown_Text_RaisingMonsToo::\n    .string \"I'm raising POKéMON, too.\\p\"\n    .string \"When they get strong, they can\\n\"\n    .string \"protect me.$\"\n\nPalletTown_Text_CanStoreItemsAndMonsInPC::\n    .string \"Technology is incredible!\\p\"\n    .string \"You can now store and recall items\\n\"\n    .string \"and POKéMON as data via PC.$\"\n\nPalletTown_Text_OakPokemonResearchLab::\n    .string \"OAK POKéMON RESEARCH LAB$\"\n\nPalletTown_Text_PlayersHouse::\n    .string \"{PLAYER}'s house$\"\n\nPalletTown_Text_RivalsHouse::\n    .string \"{RIVAL}'s house$\"\n\nPalletTown_Text_TownSign::\n    .string \"PALLET TOWN\\n\"\n    .string \"Shades of your journey await!$\"\n\nPalletTown_Text_OakLetMeSeePokedex::\n    .string \"OAK: Ah, {PLAYER}!\\n\"\n    .string \"You're back, are you?\\p\"\n    .string \"How much have you filled in your\\n\"\n    .string \"POKéDEX?\\p\"\n    .string \"May I see it?\\p\"\n    .string \"Let's see…$\"\n\nPalletTown_Text_CaughtXPuttingInHonestEffort::\n    .string \"You've caught {STR_VAR_2}…\\p\"\n    .string \"Hm, it looks as if you're putting\\n\"\n    .string \"in an honest effort.\\p\"\n    .string \"There's something I wanted to ask\\n\"\n    .string \"of you, {PLAYER}.\\p\"\n    .string \"Come.\\n\"\n    .string \"Follow me.$\"\n\nPalletTown_Text_CaughtXImpressiveFollowMe::\n    .string \"You've caught… {STR_VAR_2}!?\\n\"\n    .string \"Now, this is impressive!\\p\"\n    .string \"There's something I wanted to ask\\n\"\n    .string \"of you, {PLAYER}.\\p\"\n    .string \"Come.\\n\"\n    .string \"Follow me.$\"\n\nPalletTown_Text_OakYouEnjoyingTraveling::\n    .string \"OAK: Ah, {PLAYER}!\\n\"\n    .string \"You seem to be enjoying traveling.\\p\"\n    .string \"Knowing you, {PLAYER}, I can easily\\n\"\n    .string \"imagine you going out to even more\\l\"\n    .string \"exotic locales.\\p\"\n    .string \"Good for you, good for you.\\n\"\n    .string \"Hohoho.$\"\n\n"
  },
  {
    "path": "data/maps/PalletTown_PlayersHouse_1F/map.json",
    "content": "{\n  \"id\": \"MAP_PALLET_TOWN_PLAYERS_HOUSE_1F\",\n  \"name\": \"PalletTown_PlayersHouse_1F\",\n  \"layout\": \"LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_1F\",\n  \"music\": \"MUS_PALLET\",\n  \"region_map_section\": \"MAPSEC_PALLET_TOWN\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MOM\",\n      \"x\": 8,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_PlayersHouse_1F_EventScript_Mom\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PALLET_TOWN\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PALLET_TOWN\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PALLET_TOWN_PLAYERS_HOUSE_2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PALLET_TOWN\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_PlayersHouse_1F_EventScript_TV\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PalletTown_PlayersHouse_1F/scripts.inc",
    "content": ".equ LOCALID_MOM, 1\n\nPalletTown_PlayersHouse_1F_MapScripts::\n\t.byte 0\n\nPalletTown_PlayersHouse_1F_EventScript_Mom::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_BEAT_RIVAL_IN_OAKS_LAB, PalletTown_PlayersHouse_1F_EventScript_MomHeal\n\tcheckplayergender\n\tcall_if_eq VAR_RESULT, MALE, PalletTown_PlayersHouse_1F_EventScript_MomOakLookingForYouMale\n\tcall_if_eq VAR_RESULT, FEMALE, PalletTown_PlayersHouse_1F_EventScript_MomOakLookingForYouFemale\n\tclosemessage\n\tapplymovement LOCALID_MOM, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nPalletTown_PlayersHouse_1F_EventScript_MomOakLookingForYouMale::\n\tmsgbox PalletTown_PlayersHouse_1F_Text_AllBoysLeaveOakLookingForYou\n\treturn\n\nPalletTown_PlayersHouse_1F_EventScript_MomOakLookingForYouFemale::\n\tmsgbox PalletTown_PlayersHouse_1F_Text_AllGirlsLeaveOakLookingForYou\n\treturn\n\nPalletTown_PlayersHouse_1F_EventScript_MomHeal::\n\tmsgbox PalletTown_PlayersHouse_1F_Text_YouShouldTakeQuickRest\n\tclosemessage\n\tcall EventScript_OutOfCenterPartyHeal\n\tmsgbox PalletTown_PlayersHouse_1F_Text_LookingGreatTakeCare\n\trelease\n\tend\n\n@ Displays special text if interacted with from side or back (which are normally inaccessible)\nPalletTown_PlayersHouse_1F_EventScript_TV::\n\tlockall\n\tgoto_if_eq VAR_FACING, DIR_NORTH, PalletTown_PlayersHouse_1F_EventScript_TVScreen\n\tmsgbox PalletTown_PlayersHouse_1F_Text_OopsWrongSide\n\treleaseall\n\tend\n\nPalletTown_PlayersHouse_1F_EventScript_TVScreen::\n\tcheckplayergender\n\tcall_if_eq VAR_RESULT, MALE, PalletTown_PlayersHouse_1F_EventScript_TVScreenMale\n\tcall_if_eq VAR_RESULT, FEMALE, PalletTown_PlayersHouse_1F_EventScript_TVScreenFemale\n\treleaseall\n\tend\n\nPalletTown_PlayersHouse_1F_EventScript_TVScreenMale::\n\tmsgbox PalletTown_PlayersHouse_1F_Text_MovieOnTVFourBoysOnRailroad\n\treturn\n\nPalletTown_PlayersHouse_1F_EventScript_TVScreenFemale::\n\tmsgbox PalletTown_PlayersHouse_1F_Text_MovieOnTVGirlOnBrickRoad\n\treturn\n"
  },
  {
    "path": "data/maps/PalletTown_PlayersHouse_1F/text.inc",
    "content": "PalletTown_PlayersHouse_1F_Text_AllBoysLeaveOakLookingForYou::\n    .string \"MOM: …Right.\\n\"\n    .string \"All boys leave home someday.\\l\"\n    .string \"It said so on TV.\\p\"\n    .string \"Oh, yes. PROF. OAK, next door, was\\n\"\n    .string \"looking for you.$\"\n\nPalletTown_PlayersHouse_1F_Text_AllGirlsLeaveOakLookingForYou::\n    .string \"MOM: …Right.\\n\"\n    .string \"All girls dream of traveling.\\l\"\n    .string \"It said so on TV.\\p\"\n    .string \"Oh, yes. PROF. OAK, next door, was\\n\"\n    .string \"looking for you.$\"\n\nPalletTown_PlayersHouse_1F_Text_YouShouldTakeQuickRest::\n    .string \"MOM: {PLAYER}!\\n\"\n    .string \"You should take a quick rest.$\"\n\nPalletTown_PlayersHouse_1F_Text_LookingGreatTakeCare::\n    .string \"MOM: Oh, good! You and your\\n\"\n    .string \"POKéMON are looking great.\\l\"\n    .string \"Take care now!$\"\n\nPalletTown_PlayersHouse_1F_Text_MovieOnTVFourBoysOnRailroad::\n    .string \"There's a movie on TV.\\n\"\n    .string \"Four boys are walking on railroad\\l\"\n    .string \"tracks.\\p\"\n    .string \"…I better go, too.$\"\n\nPalletTown_PlayersHouse_1F_Text_MovieOnTVGirlOnBrickRoad::\n    .string \"There's a movie on TV.\\n\"\n    .string \"A girl with her hair in pigtails is\\l\"\n    .string \"walking up a brick road.\\p\"\n    .string \"…I better go, too.$\"\n\nPalletTown_PlayersHouse_1F_Text_OopsWrongSide::\n    .string \"Oops, wrong side…$\"\n\n"
  },
  {
    "path": "data/maps/PalletTown_PlayersHouse_2F/map.json",
    "content": "{\n  \"id\": \"MAP_PALLET_TOWN_PLAYERS_HOUSE_2F\",\n  \"name\": \"PalletTown_PlayersHouse_2F\",\n  \"layout\": \"LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_2F\",\n  \"music\": \"MUS_PALLET\",\n  \"region_map_section\": \"MAPSEC_PALLET_TOWN\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PALLET_TOWN_PLAYERS_HOUSE_1F\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_PlayersHouse_2F_EventScript_NES\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_PlayersHouse_2F_EventScript_PC\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_PlayersHouse_2F_EventScript_Sign\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PalletTown_PlayersHouse_2F/scripts.inc",
    "content": "PalletTown_PlayersHouse_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PalletTown_PlayersHouse_2F_OnTransition\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PalletTown_PlayersHouse_2F_OnWarp\n\t.byte 0\n\nPalletTown_PlayersHouse_2F_OnTransition::\n\tcall_if_eq VAR_MAP_SCENE_PALLET_TOWN_PLAYERS_HOUSE_2F, 0, PalletTown_PlayersHouse_2F_EventScript_SetRespawn\n\tend\n\nPalletTown_PlayersHouse_2F_EventScript_SetRespawn::\n\tsetrespawn SPAWN_PALLET_TOWN\n\treturn\n\nPalletTown_PlayersHouse_2F_OnWarp::\n\tmap_script_2 VAR_MAP_SCENE_PALLET_TOWN_PLAYERS_HOUSE_2F, 0, PalletTown_PlayersHouse_2F_FirstWarpIn\n\t.2byte 0\n\nPalletTown_PlayersHouse_2F_FirstWarpIn::\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_PLAYERS_HOUSE_2F, 1\n\tend\n\nPalletTown_PlayersHouse_2F_EventScript_NES::\n\tmsgbox PalletTown_PlayersHouse_2F_Text_PlayedWithNES, MSGBOX_SIGN\n\tend\n\nPalletTown_PlayersHouse_2F_EventScript_Sign::\n\tmsgbox PalletTown_PlayersHouse_2F_Text_PressLRForHelp, MSGBOX_SIGN\n\tend\n\nPalletTown_PlayersHouse_2F_EventScript_PC::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlockall\n\tsetvar VAR_0x8004, HELPCONTEXT_BEDROOM_PC\n\tspecial Script_SetHelpContext\n\tsetvar VAR_0x8004, 1\n\tspecial AnimatePcTurnOn\n\tplayse SE_PC_ON\n\tmsgbox Text_PlayerBootedUpPC\n\tspecial BedroomPC\n\twaitstate\n\tspecial SetHelpContextForMap\n\treleaseall\n\tend\n\nEventScript_PalletTown_PlayersHouse_2F_ShutDownPC::\n\tsetvar VAR_0x8004, 1\n\tplayse SE_PC_OFF\n\tspecial AnimatePcTurnOff\n\tspecial SetHelpContextForMap\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/PalletTown_PlayersHouse_2F/text.inc",
    "content": "PalletTown_PlayersHouse_2F_Text_PlayedWithNES::\n    .string \"{PLAYER} played with the NES.\\p\"\n    .string \"…Okay!\\n\"\n    .string \"It's time to go!$\"\n\nPalletTown_PlayersHouse_2F_Text_PressLRForHelp::\n    .string \"It's a posted notice…\\p\"\n    .string \"If you're confused, ask for HELP!\\n\"\n    .string \"Press the L Button!$\"\n\n"
  },
  {
    "path": "data/maps/PalletTown_ProfessorOaksLab/map.json",
    "content": "{\n  \"id\": \"MAP_PALLET_TOWN_PROFESSOR_OAKS_LAB\",\n  \"name\": \"PalletTown_ProfessorOaksLab\",\n  \"layout\": \"LAYOUT_PALLET_TOWN_PROFESSOR_OAKS_LAB\",\n  \"music\": \"MUS_OAK_LAB\",\n  \"region_map_section\": \"MAPSEC_PALLET_TOWN\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"x\": 3,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_Aide1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"x\": 2,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_Aide3\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_Aide2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PROF_OAK\",\n      \"x\": 6,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_ProfOak\",\n      \"flag\": \"FLAG_HIDE_OAK_IN_HIS_LAB\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 8,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_BulbasaurBall\",\n      \"flag\": \"FLAG_HIDE_BULBASAUR_BALL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 9,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_SquirtleBall\",\n      \"flag\": \"FLAG_HIDE_SQUIRTLE_BALL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_CharmanderBall\",\n      \"flag\": \"FLAG_HIDE_CHARMANDER_BALL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLUE\",\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_Rival\",\n      \"flag\": \"FLAG_HIDE_RIVAL_IN_LAB\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKEDEX\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_Pokedex\",\n      \"flag\": \"FLAG_HIDE_POKEDEX\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKEDEX\",\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_Pokedex\",\n      \"flag\": \"FLAG_HIDE_POKEDEX\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PALLET_TOWN\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PALLET_TOWN\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PALLET_TOWN\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB\",\n      \"var_value\": \"2\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_LeaveStarterSceneTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB\",\n      \"var_value\": \"2\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_LeaveStarterSceneTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB\",\n      \"var_value\": \"2\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_LeaveStarterSceneTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB\",\n      \"var_value\": \"3\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_RivalBattleTriggerLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB\",\n      \"var_value\": \"3\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_RivalBattleTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB\",\n      \"var_value\": \"3\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_RivalBattleTriggerRight\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_Computer\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_Computer\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_LeftSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_ProfessorOaksLab_EventScript_RightSign\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PalletTown_ProfessorOaksLab/scripts.inc",
    "content": ".equ LOCALID_PROF_OAK,        4\n.equ LOCALID_BULBASAUR_BALL,  5\n.equ LOCALID_SQUIRTLE_BALL,   6\n.equ LOCALID_CHARMANDER_BALL, 7\n.equ LOCALID_RIVAL,           8\n.equ LOCALID_POKEDEX_1,       9\n.equ LOCALID_POKEDEX_2,       10\n\n.equ PLAYER_STARTER_NUM,      VAR_TEMP_1\n.equ PLAYER_STARTER_SPECIES,  VAR_TEMP_2\n.equ RIVAL_STARTER_SPECIES,   VAR_TEMP_3\n.equ RIVAL_STARTER_ID,        VAR_TEMP_4\n\n.equ SHOWED_OAK_COMPLETE_DEX, FLAG_TEMP_2\n.equ DECLINED_BATTLE, \t\t  FLAG_TEMP_3\n.equ WON_BATTLE, \t\t\t  FLAG_TEMP_4\n\nPalletTown_ProfessorOaksLab_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PalletTown_ProfessorOaksLab_OnTransition\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PalletTown_ProfessorOaksLab_OnWarp\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, PalletTown_ProfessorOaksLab_OnFrame\n\t.byte 0\n\nPalletTown_ProfessorOaksLab_OnTransition::\n\tsetflag FLAG_VISITED_OAKS_LAB\n\tcall_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 1, PalletTown_ProfessorOaksLab_EventScript_ReadyOakForStarterScene\n\tcall_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 7, PalletTown_ProfessorOaksLab_EventScript_ReadyOakForNationalDexScene\n\tcall_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 8, PalletTown_ProfessorOaksLab_EventScript_SetNationalDexSceneFinished\n\tcall_if_set FLAG_GOT_POKEBALLS_FROM_OAK_AFTER_22_RIVAL, PalletTown_ProfessorOaksLab_EventScript_SetSkipPokeBallCheck\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_SetSkipPokeBallCheck::\n\tsetflag FLAG_OAK_SKIP_22_RIVAL_CHECK\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_SetNationalDexSceneFinished::\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 9\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_ReadyOakForStarterScene::\n\tsetobjectxyperm LOCALID_PROF_OAK, 6, 11\n\tsetobjectmovementtype LOCALID_PROF_OAK, MOVEMENT_TYPE_FACE_UP\n\tsavebgm MUS_OAK\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_ReadyOakForNationalDexScene::\n\tsetobjectxyperm LOCALID_PROF_OAK, 6, 11\n\tsetobjectmovementtype LOCALID_PROF_OAK, MOVEMENT_TYPE_FACE_UP\n\treturn\n\nPalletTown_ProfessorOaksLab_OnWarp::\n\tmap_script_2 VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 1, PalletTown_ProfessorOaksLab_EventScript_ReadyPlayerForStarterScene\n\t.2byte 0\n\nPalletTown_ProfessorOaksLab_EventScript_ReadyPlayerForStarterScene::\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH\n\tend\n\nPalletTown_ProfessorOaksLab_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 1, PalletTown_ProfessorOaksLab_ChooseStarterScene\n\tmap_script_2 VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 7, PalletTown_ProfessorOaksLab_EventScript_EnterForNationalDexScene\n\t.2byte 0\n\nPalletTown_ProfessorOaksLab_EventScript_EnterForNationalDexScene:: \n\tlockall\n\tsetvar VAR_FACING, DIR_NORTH\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakEnter\n\twaitmovement 0\n\tremoveobject LOCALID_PROF_OAK\n\tsetobjectxyperm LOCALID_PROF_OAK, 6, 3\n\tsetobjectmovementtype LOCALID_PROF_OAK, MOVEMENT_TYPE_FACE_DOWN\n\tclearflag FLAG_HIDE_OAK_IN_HIS_LAB\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerEnter\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_NationalDexScene\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_NationalDexScene::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakSightingsOfRareMons\n\tclosemessage\n\tcall_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterEastWest\n\tcall_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterEastWest\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalJustLetMeHandleEverything\n\tfadedefaultbgm\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakNeedYourHelpTooNeedToSeePokedexes\n\tcall_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_PlayerFaceOakNorth\n\tcall_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_PlayerFaceOakWest\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakTookBothPokedexUnits\n\tclosemessage\n\tcall EventScript_RestorePrevTextColor\n\tcall_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskEast\n\tcall_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskWest\n\taddobject LOCALID_POKEDEX_1\n\taddobject LOCALID_POKEDEX_2\n\tdelay 30\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakNowTheseUnitsCanRecordMoreData\n\tclosemessage\n\tremoveobject LOCALID_POKEDEX_1\n\tremoveobject LOCALID_POKEDEX_2\n\tdelay 30\n\tcall_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverEast\n\tcall_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverWest\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\tmessage PalletTown_ProfessorOaksLab_Text_PlayersPokedexWasUpgraded\n\twaitmessage\n\twaitfanfare\n\tcall EventScript_RestorePrevTextColor\n\tsetflag FLAG_SYS_RECEIVED_EXTENDED_DEX\n\tcallnative HasNationalMonToVarResult\n\tcompare VAR_RESULT, TRUE\n\tcall_if_eq PalletTown_ProfessorOaksLab_EventScript_GiveNationalDex\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakMustReallyWorkToFillPokedex\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalIllCompleteThePokedex\n\tclosemessage\n\tplaybgm MUS_RIVAL_EXIT, 0\n\tcall_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_RivalExitNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_RivalExit\n\tcall_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_RivalExit\n\tcall_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_RivalExit\n\tremoveobject LOCALID_RIVAL\n\tfadedefaultbgm\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 8\n\treleaseall\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_GiveNationalDex::\n\tspecial EnableNationalPokedex\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterNorth::\n\tsetobjectxyperm LOCALID_RIVAL, 5, 10\n\taddobject LOCALID_RIVAL\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchRivalEnterNorth\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalEnter\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterEastWest::\n\tsetobjectxyperm LOCALID_RIVAL, 6, 10\n\taddobject LOCALID_RIVAL\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchRivalEnterEastWest\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalEnter\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_NationalDexSceneRivalEnterSouth::\n\tsetobjectxyperm LOCALID_RIVAL, 6, 10\n\taddobject LOCALID_RIVAL\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalEnter\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_PlayerFaceOakNorth::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_PlayerFaceOakWest::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskNorth::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesToDesk\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskSouth::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesToDeskSouth\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDesk\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDesk\n\twaitmovement LOCALID_PROF_OAK\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskEast::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesToDesk\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDeskEast\n\twaitmovement LOCALID_PROF_OAK\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_OakBringDexesToDeskWest::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesToDesk\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_Movement_OakBringDexesToDesk::\n\twalk_up\n\twalk_left\n\twalk_in_place_faster_up\n\tdelay_16\n\tdelay_4\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_OakBringDexesToDeskSouth::\n\twalk_left\n\twalk_left\n\twalk_up\n\tdelay_16\n\tdelay_4\n\tstep_end\n\nPalletTown_ProfessorOaksLab_ChooseStarterScene::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakEnter\n\twaitmovement 0\n\tremoveobject LOCALID_PROF_OAK\n\tsetobjectxyperm LOCALID_PROF_OAK, 6, 3\n\tsetobjectmovementtype LOCALID_PROF_OAK, MOVEMENT_TYPE_FACE_DOWN\n\tclearflag FLAG_HIDE_OAK_IN_HIS_LAB\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerEnter\n\twaitmovement 0\n\tapplymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tclearflag FLAG_DONT_TRANSITION_MUSIC\n\tsavebgm MUS_DUMMY\n\tfadedefaultbgm\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalFedUpWithWaiting\n\tclosemessage\n\tdelay 60\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakThreeMonsChooseOne\n\tclosemessage\n\tdelay 30\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalReact\n\twaitmovement 0\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalNoFairWhatAboutMe\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakBePatientRival\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 2\n\treleaseall\n\tend\n\nPalletTown_ProfessorOaksLab_Movement_OakEnter::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_PlayerEnter::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_RivalReact::\n\twalk_in_place_up\n\twalk_in_place_up\n\tstep_end\n\nPalletTown_ProfessorOaksLab_EventScript_LeaveStarterSceneTrigger::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_FaceDown\n\twaitmovement 0\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakHeyDontGoAwayYet\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerWalkUp\n\twaitmovement 0\n\treleaseall\n\tend\n\nPalletTown_ProfessorOaksLab_Movement_PlayerWalkUp::\n\twalk_up\n\tstep_end\n\nPalletTown_ProfessorOaksLab_EventScript_RivalBattleTriggerLeft::\n\tlockall\n\tsetvar VAR_TEMP_2, 1\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalBattle\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalBattleTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_2, 2\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalBattle\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalBattleTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_2, 3\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalBattle\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalBattle::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\tapplymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalLetsCheckOutMons\n\tclosemessage\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_FaceDown\n\twaitmovement 0\n\tgoto_if_eq VAR_STARTER_MON, 0, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmander\n\tgoto_if_eq VAR_STARTER_MON, 1, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaur\n\tgoto_if_eq VAR_STARTER_MON, 2, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtle\n\tend\n\n@ The scripts for the rival approaching the player for battle are a bit bloated because\n@ both the player and rival can be in 3 different positions, so theres 9 different approaches\n@ NOTE: Names below refer to the Rival's mon (e.g. for RivalBattleSquirtle, player has Charmander)\n\nPalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtle::\n\tgoto_if_eq VAR_TEMP_2, 1, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtleLeft\n\tgoto_if_eq VAR_TEMP_2, 2, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtleMid\n\tgoto_if_eq VAR_TEMP_2, 3, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtleRight\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtleLeft::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleSquirtleLeft\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalBattleSquirtle\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtleMid::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleSquirtleMid\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalBattleSquirtle\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleSquirtleRight::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleSquirtleRight\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalBattleSquirtle\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalBattleSquirtle::\n\ttrainerbattle_earlyrival TRAINER_RIVAL_OAKS_LAB_SQUIRTLE, RIVAL_BATTLE_TUTORIAL, PalletTown_ProfessorOaksLab_Text_RivalDefeat, Text_RivalVictory\n\tgoto PalletTown_ProfessorOaksLab_EventScript_EndRivalBattle\n\tend\n\nPalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleSquirtleLeft::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleSquirtleMid::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleSquirtleRight::\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmander::\n\tgoto_if_eq VAR_TEMP_2, 1, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmanderLeft\n\tgoto_if_eq VAR_TEMP_2, 2, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmanderMid\n\tgoto_if_eq VAR_TEMP_2, 3, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmanderRight\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmanderLeft::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_ApproachForBattleCharmanderLeft\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalBattleCharmander\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmanderMid::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_ApproachForBattleCharmanderMid\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalBattleCharmander\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleCharmanderRight::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_ApproachForBattleCharmanderRight\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalBattleCharmander\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalBattleCharmander::\n\ttrainerbattle_earlyrival TRAINER_RIVAL_OAKS_LAB_CHARMANDER, RIVAL_BATTLE_TUTORIAL, PalletTown_ProfessorOaksLab_Text_RivalDefeat, Text_RivalVictory\n\tgoto PalletTown_ProfessorOaksLab_EventScript_EndRivalBattle\n\tend\n\nPalletTown_ProfessorOaksLab_Movement_ApproachForBattleCharmanderLeft::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_ApproachForBattleCharmanderMid::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_ApproachForBattleCharmanderRight::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaur::\n\tgoto_if_eq VAR_TEMP_2, 1, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaurLeft\n\tgoto_if_eq VAR_TEMP_2, 2, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaurMid\n\tgoto_if_eq VAR_TEMP_2, 3, PalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaurRight\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaurLeft::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleBulbasaurLeft\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalBattleBulbasaur\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaurMid::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleBulbasaurMid\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalBattleBulbasaur\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalApproachForBattleBulbasaurRight::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleBulbasaurRight\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalBattleBulbasaur\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalBattleBulbasaur::\n\ttrainerbattle_earlyrival TRAINER_RIVAL_OAKS_LAB_BULBASAUR, RIVAL_BATTLE_TUTORIAL, PalletTown_ProfessorOaksLab_Text_RivalDefeat, Text_RivalVictory\n\tgoto PalletTown_ProfessorOaksLab_EventScript_EndRivalBattle\n\tend\n\nPalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleBulbasaurLeft::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleBulbasaurMid::\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_RivalApproachForBattleBulbasaurRight::\n\twalk_left\n\twalk_down\n\twalk_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_EventScript_EndRivalBattle::\n\tcallnative HealPlayerPartyOak\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalGoToughenMyMon\n\tclosemessage\n\tplaybgm MUS_RIVAL_EXIT, 0\n\tcall_if_eq VAR_TEMP_2, 1, PalletTown_ProfessorOaksLab_EventScript_RivalExitAfterBattleLeft\n\tcall_if_eq VAR_TEMP_2, 2, PalletTown_ProfessorOaksLab_EventScript_RivalExitAfterBattleMid\n\tcall_if_eq VAR_TEMP_2, 3, PalletTown_ProfessorOaksLab_EventScript_RivalExitAfterBattleRight\n\tremoveobject LOCALID_RIVAL\n\tplayse SE_EXIT\n\tfadedefaultbgm\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 4\n\tsetflag FLAG_BEAT_RIVAL_IN_OAKS_LAB\n\treleaseall\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalExitAfterBattleLeft::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalExitAfterBattleLeft\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerWatchRivalExitAfterBattle\n\twaitmovement LOCALID_RIVAL\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_RivalExitAfterBattleMid::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalExitAfterBattleMid\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerWatchRivalExitAfterBattle\n\twaitmovement LOCALID_RIVAL\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_RivalExitAfterBattleRight::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalExitAfterBattleRight\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerWatchRivalExitAfterBattleRight\n\twaitmovement LOCALID_RIVAL\n\treturn\n\nPalletTown_ProfessorOaksLab_Movement_RivalExitAfterBattleLeft::\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tdelay_8\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_RivalExitAfterBattleRight::\n\twalk_left\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tdelay_8\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_RivalExitAfterBattleMid::\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_left\n\twalk_down\n\twalk_down\n\tdelay_8\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_PlayerWatchRivalExitAfterBattle::\n\tdelay_16\n\tdelay_8\n\twalk_in_place_faster_right\n\tdelay_16\n\twalk_in_place_faster_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_PlayerWatchRivalExitAfterBattleRight::\n\tdelay_16\n\tdelay_8\n\twalk_in_place_faster_left\n\tdelay_16\n\twalk_in_place_faster_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_EventScript_Rival::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 3, PalletTown_ProfessorOaksLab_EventScript_RivalChoseStarter\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 2, PalletTown_ProfessorOaksLab_EventScript_RivalWaitingForStarter\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalGrampsIsntAround\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalWaitingForStarter::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalGoChoosePlayer\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalChoseStarter::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalMyMonLooksTougher\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_ProfOak::\n\tlock\n\tfaceplayer\n\tgoto_if_set SHOWED_OAK_COMPLETE_DEX, PalletTown_ProfessorOaksLab_EventScript_OakJustShownCompleteDex\n\tgoto_if_set WON_BATTLE, PalletTown_ProfessorOaksLab_EventScript_BattleJustWon\n\tcall_if_not_defeated TRAINER_MASTER_OAK, PalletTown_ProfessorOaksLab_EventScript_CheckMasterTrainerFlags\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 9, PalletTown_ProfessorOaksLab_EventScript_RatePokedex\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 8, PalletTown_ProfessorOaksLab_EventScript_MonsAroundWorldWait\n\tgoto_if_set FLAG_SYS_GAME_CLEAR, PalletTown_ProfessorOaksLab_EventScript_TryStartNationalDexScene\n\tgoto_if_eq VAR_MAP_SCENE_CERULEAN_CITY_RIVAL, 1, PalletTown_ProfessorOaksLab_EventScript_RatePokedex\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 6, PalletTown_ProfessorOaksLab_EventScript_RatePokedexOrTryGiveBalls\n\tgoto_if_ge VAR_MAP_SCENE_VIRIDIAN_CITY_MART, 1, PalletTown_ProfessorOaksLab_EventScript_ReceiveDexScene\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 4, PalletTown_ProfessorOaksLab_EventScript_OakBattleMonForItToGrow\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 3, PalletTown_ProfessorOaksLab_EventScript_OakCanReachNextTownWithMon\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakWhichOneWillYouChoose\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_CheckMasterTrainerFlags::\n\tcallnative CheckAllMasterTrainerFlags\n\tgoto_if_eq VAR_RESULT, TRUE, PalletTown_ProfessorOaksLab_EventScript_AskBattle\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_AskBattle::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_AskBattle, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, PalletTown_ProfessorOaksLab_EventScript_MasterBattle\n\tmsgbox PalletTown_ProfessorOaksLab_Text_AtLeastLetMe\n\tcall PokedexRating_EventScript_Rate\n\tgoto_if_set FLAG_OAK_SAW_DEX_COMPLETION, PalletTown_ProfessorOaksLab_EventScript_DexCompleted\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_Text_AskBattle::\n\t.string \"OAK: Ah, {PLAYER}!\\n\"\n\t.string \"It's been a long while.\\l\"\n\t.string \"You certainly look more impressive.\\p\"\n\t.string \"I heard about your conquest of the\\n\"\n\t.string \"MASTER TRAINERS around KANTO,\\l\"\n\t.string \"it's just fantastic!\\p\"\n\t.string \"Your dedication, trust, and love for\\n\"\n\t.string \"your POKéMON is truly outstanding!\\p\"\n\t.string \"It's been quite a while since I've\\n\"\n\t.string \"had a battle myself…\\p\"\n\t.string \"Would you care to have a match\\n\"\n\t.string \"with me and my old friends?$\"\n\nPalletTown_ProfessorOaksLab_Text_AtLeastLetMe::\n\t.string \"Then let me see how your POKéDEX\\n\"\n\t.string \"is coming along while you're here.\\p\"\n\t.string \"Here, let me take a look.$\"\n\nPalletTown_ProfessorOaksLab_EventScript_MasterBattle::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_StartBattle\n\twaitmessage\n\tclosemessage\n\ttrainerbattle_no_intro TRAINER_MASTER_OAK, PalletTown_ProfessorOaksLab_Text_OakDefeat\n\tsetflag WON_BATTLE\n\tmsgbox PalletTown_ProfessorOaksLab_Text_WonBattle\n\tmessage PalletTown_ProfessorOaksLab_Text_GrandMaster_EarnTitle\n    waitmessage\n    playfanfare MUS_EVOLVED\n    waitfanfare\n\twaitbuttonpress\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_Text_StartBattle::\n\t.string \"Let's see how you fare against\\n\"\n\t.string \"POKéMON with this much experience\\l\"\n\t.string \"in battle!$\"\n\nPalletTown_ProfessorOaksLab_Text_OakDefeat::\n\t.string \"OAK: Amazing, {PLAYER}.\\n\"\n\t.string \"You and your POKéMON are excellent.\\l\"\n\t.string \"I was right in my assessment of you.$\"\n\nPalletTown_ProfessorOaksLab_Text_WonBattle::\n\t.string \"OAK: {PLAYER}…\\p\"\n\t.string \"First, you registered every POKéMON\\n\"\n\t.string \"here in KANTO in your POKéDEX…\\p\"\n\t.string \"And then you raised them all, proved\\n\"\n\t.string \"mastery over each in battle…\\p\"\n\t.string \"I thought that perhaps I could best\\n\"\n\t.string \"you with my years of experience\\l\"\n\t.string \"and wizened, old POKéMON…\\p\"\n\t.string \"…But, at this point, you may know\\n\"\n\t.string \"more about bringing POKéMON to\\l\"\n\t.string \"their full potential than I do!\\p\"\n\t.string \"You could become a POKéMON\\n\"\n\t.string \"professor right now!\\p\"\n\t.string \"However, I suspect you want to keep\\n\"\n\t.string \"training and becoming stronger.\\p\"\n\t.string \"For your outstanding achievements,\\n\"\n\t.string \"you have more than earned the\\l\"\n\t.string \"title of GRAND MASTER!\\p\"\n\t.string \"Congratulations, {PLAYER}!$\"\n\nPalletTown_ProfessorOaksLab_Text_GrandMaster_EarnTitle:\n    .string \"{COLOR DARK_GRAY}You have earned the title of\\n\"\n    .string \"GRAND MASTER!$\"\n\nPalletTown_ProfessorOaksLab_EventScript_BattleJustWon::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_BattleJustWon\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_Text_BattleJustWon::\n\t.string \"OAK: I don't think I'll be battling\\n\"\n\t.string \"again for a long time.\\p\"\n\t.string \"There's a reason my POKéMON and I\\n\"\n\t.string \"retired from battling ages ago.$\"\n\nPalletTown_ProfessorOaksLab_EventScript_OakJustShownCompleteDex::\n\tmsgbox PokedexRating_Text_ThankYouMadeDreamReality\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_OakCanReachNextTownWithMon::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakCanReachNextTownWithMon\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_OakBattleMonForItToGrow::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakBattleMonForItToGrow\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_ReceiveDexScene::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakHaveSomethingForMe\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_OBTAIN_TMHM\n\tmessage PalletTown_ProfessorOaksLab_Text_DeliveredOaksParcel\n\twaitmessage\n\twaitfanfare\n\tcall EventScript_RestorePrevTextColor\n\tremoveitem ITEM_OAKS_PARCEL\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakCustomBallIOrdered\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalGramps\n\tclosemessage\n\tcall_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterEastWest\n\tcall_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterEastWest\n\tfadedefaultbgm\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalWhatDidYouCallMeFor\n\tclosemessage\n\tdelay 30\n\tplayse SE_PIN\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_Delay48\n\twaitmovement 0\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalEast\n\tcall_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalWest\n\tcall_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalNorth\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakHaveRequestForYouTwo\n\tclosemessage\n\tcall_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskEast\n\tcall_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskWest\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakPokedexOnDesk\n\tclosemessage\n\tdelay 40\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakTakeTheseWithYou\n\tclosemessage\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tremoveobject LOCALID_POKEDEX_1\n\tdelay 10\n\tremoveobject LOCALID_POKEDEX_2\n\tdelay 25\n\tcall_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverEast\n\tcall_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverWest\n\tdelay 10\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\tmessage PalletTown_ProfessorOaksLab_Text_ReceivedPokedexFromOak\n\twaitmessage\n\twaitfanfare\n\tcall EventScript_RestorePrevTextColor\n\tsetflag FLAG_SYS_POKEDEX_GET\n\tsetflag FLAG_SYS_GAME_CLEAR_OLD\n\tspecial SetUnlockedPokedexFlags\n\tsetvar VAR_MAP_SCENE_POKEMON_CENTER_TEALA, 1\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakCatchMonsForDataTakeThese\n\tgiveitem_msg PalletTown_ProfessorOaksLab_Text_ReceivedFivePokeBalls, ITEM_POKE_BALL, 5\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakExplainCatching\n\tfamechecker FAMECHECKER_OAK, 1\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakCompleteMonGuideWasMyDream\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalLeaveItToMeGramps\n\tcall_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerEastWest\n\tcall_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerEastWest\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalTellSisNotToGiveYouMap\n\tclosemessage\n\tplaybgm MUS_RIVAL_EXIT, 0\n\tcall_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_RivalExitNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_RivalExit\n\tcall_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_RivalExit\n\tcall_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_RivalExit\n\tremoveobject LOCALID_RIVAL\n\tfadedefaultbgm\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 6\n\tsetvar VAR_MAP_SCENE_VIRIDIAN_CITY_MART, 2\n\tsetvar VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 1\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 1\n\tsetvar VAR_MAP_SCENE_ROUTE22, 1\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverNorth::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesOver\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverSouth::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesOverSouth\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverEast::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesOver\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_PlayerFaceOakForDexEast\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_OakBringDexesOverWest::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakBringDexesOver\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_Movement_PlayerFaceOakForDexEast::\n\tdelay_16\n\tdelay_8\n\twalk_in_place_faster_right\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_OakBringDexesOver::\n\twalk_right\n\twalk_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_OakBringDexesOverSouth::\n\twalk_down\n\twalk_right\n\tstep_end\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskNorth::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakWalkToDesk\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskSouth::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakWalkToDeskSouth\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDesk\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDesk\n\twaitmovement LOCALID_PROF_OAK\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskEast::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakWalkToDesk\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDeskEast\n\twaitmovement LOCALID_PROF_OAK\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneOakWalkToDeskWest::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakWalkToDesk\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDeskEast::\n\tdelay_16\n\tdelay_8\n\twalk_in_place_faster_up\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_WatchOakWalkToDesk::\n\tdelay_16\n\tdelay_8\n\twalk_in_place_faster_left\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_OakWalkToDesk::\n\twalk_up\n\twalk_left\n\tdelay_16\n\twalk_in_place_faster_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_OakWalkToDeskSouth::\n\twalk_left\n\twalk_left\n\twalk_up\n\tdelay_16\n\twalk_in_place_faster_right\n\tstep_end\n\nPalletTown_ProfessorOaksLab_EventScript_RatePokedexOrTryGiveBalls::\n\tsetvar VAR_0x8004, 0\n\tspecialvar VAR_RESULT, GetPokedexCount\n\tcopyvar VAR_0x8008, VAR_0x8005\n\tcopyvar VAR_0x8009, VAR_0x8006\n\tbuffernumberstring STR_VAR_1, VAR_0x8008\n\tbuffernumberstring STR_VAR_2, VAR_0x8009\n\tgoto_if_eq VAR_0x8009, 1, PalletTown_ProfessorOaksLab_EventScript_CheckIfPlayerNeedsBalls  @ Player only has starter\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RatePokedex\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RatePokedex::\n\tcall PokedexRating_EventScript_RateInPerson\n\tgoto_if_set FLAG_OAK_SAW_DEX_COMPLETION, PalletTown_ProfessorOaksLab_EventScript_DexCompleted\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_DexCompleted::\n\tclosemessage\n\tdelay 40\n\tmessage PokedexRating_Text_Wroooaaarrr\n\twaitmessage\n\tcall_if_eq VAR_FACING, DIR_NORTH, PalletTown_ProfessorOaksLab_EventScript_OakExcitedNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PalletTown_ProfessorOaksLab_EventScript_OakExcitedSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, PalletTown_ProfessorOaksLab_EventScript_OakExcitedEast\n\tcall_if_eq VAR_FACING, DIR_WEST, PalletTown_ProfessorOaksLab_EventScript_OakExcitedWest\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_FacePlayer\n\twaitmovement 0\n\tclosemessage\n\tdelay 70\n\tmsgbox PokedexRating_Text_ThankYouMadeDreamReality\n\tsetflag SHOWED_OAK_COMPLETE_DEX\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_OakExcitedNorth::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakExcitedNorth\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_OakExcitedSouth::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakExcitedSouth\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_OakExcitedEast::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakExcitedEast\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_OakExcitedWest::\n\tapplymovement LOCALID_PROF_OAK, PalletTown_ProfessorOaksLab_Movement_OakExcitedWest\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_Movement_OakExcitedNorth::\n\twalk_in_place_down\n\twalk_in_place_fast_down\n\twalk_in_place_down\n\twalk_in_place_down\n\twalk_in_place_fast_down\n\twalk_in_place_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_OakExcitedSouth::\n\twalk_in_place_up\n\twalk_in_place_fast_up\n\twalk_in_place_up\n\twalk_in_place_up\n\twalk_in_place_fast_up\n\twalk_in_place_up\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_OakExcitedEast::\n\twalk_in_place_left\n\twalk_in_place_fast_left\n\twalk_in_place_left\n\twalk_in_place_left\n\twalk_in_place_fast_left\n\twalk_in_place_left\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_OakExcitedWest::\n\twalk_in_place_right\n\twalk_in_place_fast_right\n\twalk_in_place_right\n\twalk_in_place_right\n\twalk_in_place_fast_right\n\twalk_in_place_right\n\tstep_end\n\n@ Unused\nPalletTown_ProfessorOaksLab_Movement_Search:\n\twalk_left\n\twalk_in_place_faster_down\n\tdelay_8\n\twalk_in_place_faster_right\n\tdelay_8\n\twalk_in_place_faster_up\n\tdelay_8\n\twalk_in_place_faster_left\n\tdelay_8\n\twalk_in_place_faster_down\n\tdelay_8\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_up\n\tdelay_8\n\twalk_in_place_faster_left\n\tdelay_8\n\twalk_in_place_faster_down\n\tdelay_8\n\twalk_in_place_faster_right\n\tdelay_8\n\twalk_in_place_faster_up\n\tdelay_8\n\twalk_left\n\tstep_end\n\n@ Unused\nPalletTown_ProfessorOaksLab_Movement_VerticalPacing:\n\twalk_up\n\twalk_down\n\twalk_down\n\twalk_in_place_down\n\twalk_up\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tstep_end\n\nPalletTown_ProfessorOaksLab_EventScript_TryStartNationalDexScene::\n\tcall PokedexRating_EventScript_RateInPerson\n\tclosemessage\n\tgoto_if_lt VAR_0x8009, 60, PalletTown_ProfessorOaksLab_EventScript_DontStartNationalDexScene\n\tgoto_if_unset FLAG_WORLD_MAP_ONE_ISLAND, PalletTown_ProfessorOaksLab_EventScript_DontStartNationalDexScene\n\tdelay 30\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakFavorToAskYouPlayer\n\tgoto PalletTown_ProfessorOaksLab_EventScript_NationalDexScene\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_DontStartNationalDexScene::\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_CheckIfPlayerNeedsBalls::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tgoto_if_set FLAG_OAK_SKIP_22_RIVAL_CHECK, PalletTown_ProfessorOaksLab_EventScript_MonsAroundWorldWait\n\tgoto_if_set FLAG_GOT_POKEBALLS_FROM_OAK_AFTER_22_RIVAL, PalletTown_ProfessorOaksLab_EventScript_PlayerAlreadyGotBalls\n\tcheckitem ITEM_POKE_BALL\n\tgoto_if_eq VAR_RESULT, FALSE, PalletTown_ProfessorOaksLab_EventScript_PlayerOutOfBalls\n\tgoto PalletTown_ProfessorOaksLab_EventScript_MonsAroundWorldWait\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_PlayerOutOfBalls::\n\tgoto_if_ge VAR_MAP_SCENE_ROUTE22, 2, PalletTown_ProfessorOaksLab_EventScript_GivePlayerMoreBalls\n\tgoto PalletTown_ProfessorOaksLab_EventScript_MonsAroundWorldWait\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_GivePlayerMoreBalls::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakAddedNothingToPokedex\n\tgiveitem_msg PalletTown_ProfessorOaksLab_Text_ReceivedFivePokeBalls, ITEM_POKE_BALL, 5\n\tsetflag FLAG_GOT_POKEBALLS_FROM_OAK_AFTER_22_RIVAL\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_MonsAroundWorldWait::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakMonsAroundWorldWait\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_PlayerAlreadyGotBalls::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakComeSeeMeSometime\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterNorth::\n\tsetobjectxyperm LOCALID_RIVAL, 5, 10\n\taddobject LOCALID_RIVAL\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchRivalEnterNorth\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalEnter\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterEastWest::\n\tsetobjectxyperm LOCALID_RIVAL, 6, 10\n\taddobject LOCALID_RIVAL\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchRivalEnterEastWest\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalEnter\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneRivalEnterSouth::\n\tsetobjectxyperm LOCALID_RIVAL, 6, 10\n\taddobject LOCALID_RIVAL\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalEnter\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalSouth::\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_FacePlayer\n\twaitmovement 0\n\tdelay 15\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalWest::\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_FacePlayer\n\twaitmovement 0\n\tdelay 15\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalEast::\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_FacePlayer\n\twaitmovement 0\n\tdelay 15\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerNorth::\n\tapplymovement LOCALID_RIVAL, Common_Movement_FacePlayer\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerSouth::\n\tapplymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterUp\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneRivalFacePlayerEastWest::\n\tapplymovement LOCALID_RIVAL, Common_Movement_FacePlayer\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_RivalExitNorth::\n\tapplymovement OBJ_EVENT_ID_PLAYER, PalletTown_ProfessorOaksLab_Movement_WatchRivalEnterEastWest\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalExit\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_RivalExit::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalExit\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_EventScript_DexSceneOakFacePlayerAndRivalNorth::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\treturn\n\nPalletTown_ProfessorOaksLab_Movement_WatchRivalEnterEastWest::\n\tdelay_4\n\twalk_in_place_faster_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_WatchRivalEnterNorth::\n\twalk_in_place_faster_down\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_8\n\twalk_in_place_faster_left\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_RivalEnter::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_RivalExit::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nPalletTown_ProfessorOaksLab_EventScript_BulbasaurBall::\n\tlock\n\tfaceplayer\n\tsetvar PLAYER_STARTER_NUM, 0\n\tsetvar PLAYER_STARTER_SPECIES, SPECIES_BULBASAUR\n\tsetvar RIVAL_STARTER_SPECIES, SPECIES_CHARMANDER\n\tsetvar RIVAL_STARTER_ID, LOCALID_CHARMANDER_BALL\n\tgoto_if_ge VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 3, PalletTown_ProfessorOaksLab_EventScript_LastPokeBall\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 2, PalletTown_ProfessorOaksLab_EventScript_ConfirmStarterChoice\n\tmsgbox PalletTown_ProfessorOaksLab_Text_ThoseArePokeBalls\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_ConfirmStarterChoice::\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_FaceRight\n\twaitmovement 0\n\tshowmonpic PLAYER_STARTER_SPECIES, 10, 3\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tgoto_if_eq PLAYER_STARTER_NUM, 0, PalletTown_ProfessorOaksLab_EventScript_ConfirmBulbasaur\n\tgoto_if_eq PLAYER_STARTER_NUM, 1, PalletTown_ProfessorOaksLab_EventScript_ConfirmSquirtle\n\tgoto_if_eq PLAYER_STARTER_NUM, 2, PalletTown_ProfessorOaksLab_EventScript_ConfirmCharmander\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_ConfirmBulbasaur::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakChoosingBulbasaur, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, PalletTown_ProfessorOaksLab_EventScript_ChoseStarter\n\tgoto_if_eq VAR_RESULT, NO, PalletTown_ProfessorOaksLab_EventScript_DeclinedStarter\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_ConfirmSquirtle::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakChoosingSquirtle, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, PalletTown_ProfessorOaksLab_EventScript_ChoseStarter\n\tgoto_if_eq VAR_RESULT, NO, PalletTown_ProfessorOaksLab_EventScript_DeclinedStarter\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_ConfirmCharmander::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakChoosingCharmander, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, PalletTown_ProfessorOaksLab_EventScript_ChoseStarter\n\tgoto_if_eq VAR_RESULT, NO, PalletTown_ProfessorOaksLab_EventScript_DeclinedStarter\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_DeclinedStarter::\n\thidemonpic\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_ChoseStarter::\n\thidemonpic\n\tremoveobject VAR_LAST_TALKED\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakThisMonIsEnergetic\n\tcall EventScript_RestorePrevTextColor\n\tsetflag FLAG_SYS_POKEMON_GET\n\tsetflag FLAG_PALLET_LADY_NOT_BLOCKING_SIGN\n\tgivemon PLAYER_STARTER_SPECIES, 5\n\tcopyvar VAR_STARTER_MON, PLAYER_STARTER_NUM\n\tbufferspeciesname STR_VAR_1, PLAYER_STARTER_SPECIES\n\tmessage PalletTown_ProfessorOaksLab_Text_ReceivedMonFromOak\n\twaitmessage\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\twaitfanfare\n\tcallnative SetLastViewedPokedexEntry\n\tcallnative CheckNuzlockeMode\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq EventScript_GiveNicknameToStarter\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_GiveNicknameToStarter\n\tgoto_if_eq VAR_RESULT, NO, PalletTown_ProfessorOaksLab_EventScript_RivalPicksStarter\n\tend\n\nEventScript_GiveNicknameToStarter::\n\tsetvar VAR_0x8004, 0\n\tcall EventScript_ChangePokemonNickname\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalPicksStarter\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalPicksStarter::\n\tclosemessage\n\tgoto_if_eq PLAYER_STARTER_NUM, 0, PalletTown_ProfessorOaksLab_EventScript_RivalWalksToCharmander\n\tgoto_if_eq PLAYER_STARTER_NUM, 1, PalletTown_ProfessorOaksLab_EventScript_RivalWalksToBulbasaur\n\tgoto_if_eq PLAYER_STARTER_NUM, 2, PalletTown_ProfessorOaksLab_EventScript_RivalWalksToSquirtle\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalWalksToCharmander::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalWalksToCharmander\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalTakesStarter\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalWalksToSquirtle::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalWalksToSquirtle\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalTakesStarter\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalWalksToBulbasaur::\n\tapplymovement LOCALID_RIVAL, PalletTown_ProfessorOaksLab_Movement_RivalWalksToBulbasaur\n\twaitmovement 0\n\tgoto PalletTown_ProfessorOaksLab_EventScript_RivalTakesStarter\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RivalTakesStarter::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox PalletTown_ProfessorOaksLab_Text_RivalIllTakeThisOneThen\n\tremoveobject RIVAL_STARTER_ID\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tbufferspeciesname STR_VAR_1, RIVAL_STARTER_SPECIES\n\tmessage PalletTown_ProfessorOaksLab_Text_RivalReceivedMonFromOak\n\twaitmessage\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\twaitfanfare\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 3\n\tcall_if_set FLAG_OPENED_START_MENU, PalletTown_ProfessorOaksLab_EventScript_ReadyEndSignLadyScene\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_ReadyEndSignLadyScene::\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY, 1\n\treturn\n\nPalletTown_ProfessorOaksLab_Movement_RivalWalksToCharmander::\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_up\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_RivalWalksToSquirtle::\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_up\n\tstep_end\n\nPalletTown_ProfessorOaksLab_Movement_RivalWalksToBulbasaur::\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_up\n\tstep_end\n\nPalletTown_ProfessorOaksLab_EventScript_SquirtleBall::\n\tlock\n\tfaceplayer\n\tsetvar PLAYER_STARTER_NUM, 1\n\tsetvar PLAYER_STARTER_SPECIES, SPECIES_SQUIRTLE\n\tsetvar RIVAL_STARTER_SPECIES, SPECIES_BULBASAUR\n\tsetvar RIVAL_STARTER_ID, LOCALID_BULBASAUR_BALL\n\tgoto_if_ge VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 3, PalletTown_ProfessorOaksLab_EventScript_LastPokeBall\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 2, PalletTown_ProfessorOaksLab_EventScript_ConfirmStarterChoice\n\tmsgbox PalletTown_ProfessorOaksLab_Text_ThoseArePokeBalls\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_CharmanderBall::\n\tlock\n\tfaceplayer\n\tsetvar PLAYER_STARTER_NUM, 2\n\tsetvar PLAYER_STARTER_SPECIES, SPECIES_CHARMANDER\n\tsetvar RIVAL_STARTER_SPECIES, SPECIES_SQUIRTLE\n\tsetvar RIVAL_STARTER_ID, LOCALID_SQUIRTLE_BALL\n\tgoto_if_ge VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 3, PalletTown_ProfessorOaksLab_EventScript_LastPokeBall\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 2, PalletTown_ProfessorOaksLab_EventScript_ConfirmStarterChoice\n\tmsgbox PalletTown_ProfessorOaksLab_Text_ThoseArePokeBalls\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_LastPokeBall::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OaksLastMon\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_Aide1::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_SYS_GAME_CLEAR, PalletTown_ProfessorOaksLab_EventScript_Aide1GameClear\n\tmsgbox PalletTown_ProfessorOaksLab_Text_StudyAsOaksAide\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_Aide1GameClear::\n\tfamechecker FAMECHECKER_OAK, 5\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakIsGoingToHaveRadioShow\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_Aide2::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_SYS_GAME_CLEAR, PalletTown_ProfessorOaksLab_EventScript_Aide2GameClear\n\tmsgbox PalletTown_ProfessorOaksLab_Text_StudyAsOaksAide\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_Aide2GameClear::\n\tfamechecker FAMECHECKER_DAISY, 0\n\tmsgbox PalletTown_ProfessorOaksLab_Text_DaisyWillGroomMons\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_Aide3::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_OAK, 2\n\tmsgbox PalletTown_ProfessorOaksLab_Text_OakIsAuthorityOnMons\n\trelease\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_Pokedex::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_BlankEncyclopedia, MSGBOX_NPC\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_Computer::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_EmailMessage, MSGBOX_SIGN\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_LeftSign::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_PressStartToOpenMenu, MSGBOX_SIGN\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RightSign::\n\tlockall\n\tgoto_if_ge VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 6, PalletTown_ProfessorOaksLab_EventScript_RightSignAlt\n\tmsgbox PalletTown_ProfessorOaksLab_Text_SaveOptionInMenu\n\treleaseall\n\tend\n\nPalletTown_ProfessorOaksLab_EventScript_RightSignAlt::\n\tmsgbox PalletTown_ProfessorOaksLab_Text_AllMonTypesHaveStrongAndWeakPoints\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/PalletTown_ProfessorOaksLab/text.inc",
    "content": "PalletTown_ProfessorOaksLab_Text_RivalGrampsIsntAround::\n    .string \"{RIVAL}: What, it's only {PLAYER}?\\n\"\n    .string \"Gramps isn't around.$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalFedUpWithWaiting::\n    .string \"{RIVAL}: Gramps!\\n\"\n    .string \"I'm fed up with waiting!$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalNoFairWhatAboutMe::\n    .string \"{RIVAL}: Hey! Gramps! No fair!\\n\"\n    .string \"What about me?$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalGoChoosePlayer::\n    .string \"{RIVAL}: Heh, I don't need to be\\n\"\n    .string \"greedy like you. I'm mature!\\p\"\n    .string \"Go ahead and choose, {PLAYER}!$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalIllTakeThisOneThen::\n    .string \"{RIVAL}: I'll take this one, then!$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalReceivedMonFromOak::\n    .string \"{RIVAL} received the {STR_VAR_1}\\n\"\n    .string \"from PROF. OAK!$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalMyMonLooksTougher::\n    .string \"{RIVAL}: My POKéMON looks a lot\\n\"\n    .string \"tougher than yours.$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalLetsCheckOutMons::\n    .string \"{RIVAL}: Wait, {PLAYER}!\\n\"\n    .string \"Let's check out our POKéMON!\\p\"\n    .string \"Come on, I'll take you on!$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalDefeat::\n    .string \"WHAT?\\n\"\n    .string \"Unbelievable!\\l\"\n    .string \"I picked the wrong POKéMON!$\"\n\n@ Also used for early Route 22 battle\nText_RivalVictory::\n    .string \"{RIVAL}: Yeah!\\n\"\n    .string \"Am I great or what?$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalGoToughenMyMon::\n    .string \"{RIVAL}: Okay! I'll make my\\n\"\n    .string \"POKéMON battle to toughen it up!\\p\"\n    .string \"{PLAYER}! Gramps!\\n\"\n    .string \"Smell you later!$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalGramps::\n    .string \"{RIVAL}: Gramps!$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalWhatDidYouCallMeFor::\n    .string \"{RIVAL}: I almost forgot!\\n\"\n    .string \"What did you call me for?$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalLeaveItToMeGramps::\n    .string \"{RIVAL}: All right, Gramps!\\n\"\n    .string \"Leave it all to me!$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalTellSisNotToGiveYouMap::\n    .string \"{PLAYER}, I hate to say it, but you\\n\"\n    .string \"won't be necessary for this.\\p\"\n    .string \"I know! I'll borrow a TOWN MAP\\n\"\n    .string \"from my sis!\\p\"\n    .string \"I'll tell her not to lend you one,\\n\"\n    .string \"{PLAYER}! Hahaha!\\p\"\n    .string \"Don't bother coming around to\\n\"\n    .string \"my place after this!$\"\n\nPalletTown_ProfessorOaksLab_Text_OakThreeMonsChooseOne::\n    .string \"OAK: {RIVAL}?\\n\"\n    .string \"Let me think…\\p\"\n    .string \"Oh, that's right, I told you to\\n\"\n    .string \"come! Just wait!\\p\"\n    .string \"Here, {PLAYER}.\\p\"\n    .string \"There are three POKéMON here.\\p\"\n    .string \"Haha!\\p\"\n    .string \"The POKéMON are held inside\\n\"\n    .string \"these POKé BALLS.\\p\"\n    .string \"When I was young, I was a serious\\n\"\n    .string \"POKéMON TRAINER.\\p\"\n    .string \"But now, in my old age, I have\\n\"\n    .string \"only these three left.\\p\"\n    .string \"You can have one.\\n\"\n    .string \"Go on, choose!$\"\n\nPalletTown_ProfessorOaksLab_Text_OakBePatientRival::\n    .string \"OAK: Be patient, {RIVAL}.\\n\"\n    .string \"You can have one, too!$\"\n\nPalletTown_ProfessorOaksLab_Text_OakWhichOneWillYouChoose::\n    .string \"OAK: Now, {PLAYER}.\\p\"\n    .string \"Inside those three POKé BALLS are\\n\"\n    .string \"POKéMON.\\p\"\n    .string \"Which one will you choose for\\n\"\n    .string \"yourself?$\"\n\nPalletTown_ProfessorOaksLab_Text_OakHeyDontGoAwayYet::\n    .string \"OAK: Hey!\\n\"\n    .string \"Don't go away yet!$\"\n\nPalletTown_ProfessorOaksLab_Text_OakChoosingCharmander::\n    .string \"Ah! CHARMANDER is your choice.\\n\"\n    .string \"You should raise it patiently.\\p\"\n    .string \"So, {PLAYER}, you're claiming the\\n\"\n    .string \"FIRE POKéMON CHARMANDER?$\"\n\nPalletTown_ProfessorOaksLab_Text_OakChoosingSquirtle::\n    .string \"Hm! SQUIRTLE is your choice.\\n\"\n    .string \"It's one worth raising.\\p\"\n    .string \"So, {PLAYER}, you've decided on the\\n\"\n    .string \"WATER POKéMON SQUIRTLE?$\"\n\nPalletTown_ProfessorOaksLab_Text_OakChoosingBulbasaur::\n    .string \"I see! BULBASAUR is your choice.\\n\"\n    .string \"It's very easy to raise.\\p\"\n    .string \"So, {PLAYER}, you want to go with\\n\"\n    .string \"the GRASS POKéMON BULBASAUR?$\"\n\nPalletTown_ProfessorOaksLab_Text_OakThisMonIsEnergetic::\n    .string \"This POKéMON is really quite\\n\"\n    .string \"energetic!$\"\n\nPalletTown_ProfessorOaksLab_Text_ReceivedMonFromOak::\n    .string \"{PLAYER} received the {STR_VAR_1}\\n\"\n    .string \"from PROF. OAK!$\"\n\nPalletTown_ProfessorOaksLab_Text_OakCanReachNextTownWithMon::\n    .string \"OAK: If a wild POKéMON appears,\\n\"\n    .string \"your POKéMON can battle it.\\p\"\n    .string \"With it at your side, you should be\\n\"\n    .string \"able to reach the next town.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakBattleMonForItToGrow::\n    .string \"OAK: {PLAYER}, raise your young\\n\"\n    .string \"POKéMON by making it battle.\\p\"\n    .string \"It has to battle for it to grow.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakHaveSomethingForMe::\n    .string \"OAK: Oh, {PLAYER}!\\n\"\n    .string \"How is my old POKéMON?\\p\"\n    .string \"Well, it seems to be growing more\\n\"\n    .string \"attached to you.\\p\"\n    .string \"You must be talented as a POKéMON\\n\"\n    .string \"TRAINER.\\p\"\n    .string \"What's that?\\n\"\n    .string \"You have something for me?$\"\n\nPalletTown_ProfessorOaksLab_Text_DeliveredOaksParcel::\n    .string \"{PLAYER} delivered OAK'S PARCEL.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakCustomBallIOrdered::\n    .string \"Ah! \\n\"\n    .string \"It's the custom POKé BALL!\\p\"\n    .string \"I had it on order.\\n\"\n    .string \"Thank you!$\"\n\nPalletTown_ProfessorOaksLab_Text_OakHaveRequestForYouTwo::\n    .string \"OAK: Oh, right!\\n\"\n    .string \"I have a request for you two.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakPokedexOnDesk::\n    .string \"On the desk there is my invention,\\n\"\n    .string \"the POKéDEX!\\p\"\n    .string \"It automatically records data on\\n\"\n    .string \"POKéMON you've seen or caught.\\p\"\n    .string \"It's a high-tech encyclopedia!$\"\n\nPalletTown_ProfessorOaksLab_Text_OakTakeTheseWithYou::\n    .string \"OAK: {PLAYER} and {RIVAL}.\\n\"\n    .string \"Take these with you.$\"\n\nPalletTown_ProfessorOaksLab_Text_ReceivedPokedexFromOak::\n    .string \"{PLAYER} received the POKéDEX\\n\"\n    .string \"from PROF. OAK.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakCatchMonsForDataTakeThese::\n    .string \"OAK: You can't get detailed data\\n\"\n    .string \"on POKéMON by just seeing them.\\p\"\n    .string \"You must catch them to obtain\\n\"\n    .string \"complete data.\\p\"\n    .string \"So, here are some tools for\\n\"\n    .string \"catching wild POKéMON.$\"\n\nPalletTown_ProfessorOaksLab_Text_ReceivedFivePokeBalls::\n    .string \"{PLAYER} received five POKé BALLS.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakExplainCatching::\n    .string \"When a wild POKéMON appears,\\n\"\n    .string \"it's fair game.\\p\"\n    .string \"Just throw a POKé BALL at it and\\n\"\n    .string \"try to catch it!\\p\"\n    .string \"This won't always work, however.\\p\"\n    .string \"A healthy POKéMON can escape.\\n\"\n    .string \"You have to be lucky!$\"\n\nPalletTown_ProfessorOaksLab_Text_OakCompleteMonGuideWasMyDream::\n    .string \"To make a complete guide on all\\n\"\n    .string \"the POKéMON in the world…\\p\"\n    .string \"That was my dream!\\p\"\n    .string \"But, I'm too old.\\n\"\n    .string \"I can't get the job done.\\p\"\n    .string \"So, I want you two to fulfill my\\n\"\n    .string \"dream for me.\\p\"\n    .string \"Get moving, you two.\\p\"\n    .string \"This is a great undertaking in\\n\"\n    .string \"POKéMON history!$\"\n\nPalletTown_ProfessorOaksLab_Text_OakMonsAroundWorldWait::\n    .string \"POKéMON around the world wait for\\n\"\n    .string \"you, {PLAYER}!$\"\n\nPalletTown_ProfessorOaksLab_Text_OakAddedNothingToPokedex::\n    .string \"Ah, {PLAYER}!\\n\"\n    .string \"How is your POKéDEX shaping up?\\p\"\n    .string \"{RIVAL} has already caught some\\n\"\n    .string \"POKéMON and added to the data.\\p\"\n    .string \"So, {PLAYER}, let's have a look at\\n\"\n    .string \"your POKéDEX.\\p\"\n    .string \"…What's the matter?\\n\"\n    .string \"You've added no new data at all.\\p\"\n    .string \"I'll give you these, so do try a\\n\"\n    .string \"little harder.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakComeSeeMeSometime::\n    .string \"OAK: Come see me sometime.\\p\"\n    .string \"After all, I want to know how your\\n\"\n    .string \"POKéDEX is coming along.$\"\n\nPalletTown_ProfessorOaksLab_Text_BlankEncyclopedia::\n    .string \"It's like an encyclopedia, but the\\n\"\n    .string \"pages are blank.$\"\n\nPalletTown_ProfessorOaksLab_Text_ThoseArePokeBalls::\n    .string \"Those are POKé BALLS.\\n\"\n    .string \"They contain POKéMON!$\"\n\nPalletTown_ProfessorOaksLab_Text_OaksLastMon::\n    .string \"That's PROF. OAK's last POKéMON.$\"\n\nPalletTown_ProfessorOaksLab_Text_PressStartToOpenMenu::\n    .string \"Press START to open the MENU!$\"\n\nPalletTown_ProfessorOaksLab_Text_SaveOptionInMenu::\n    .string \"The SAVE option is on the MENU.\\n\"\n    .string \"Use it regularly.$\"\n\nPalletTown_ProfessorOaksLab_Text_AllMonTypesHaveStrongAndWeakPoints::\n    .string \"All POKéMON types have strong and\\n\"\n    .string \"weak points against others.$\"\n\nPalletTown_ProfessorOaksLab_Text_EmailMessage::\n    .string \"There's an e-mail message here.\\p\"\n    .string \"…\\p\"\n    .string \"Finally!\\n\"\n    .string \"The ultimate TRAINERS of the\\l\"\n    .string \"POKéMON LEAGUE are ready to\\l\"\n    .string \"take on all comers!\\p\"\n    .string \"Bring your best POKéMON and see\\n\"\n    .string \"how you rate as a TRAINER!\\p\"\n    .string \"POKéMON LEAGUE HQ\\n\"\n    .string \"INDIGO PLATEAU\\p\"\n    .string \"PROF. OAK, please visit us!\\n\"\n    .string \"…$\"\n\nPalletTown_ProfessorOaksLab_Text_StudyAsOaksAide::\n    .string \"I study POKéMON as PROF. OAK's\\n\"\n    .string \"AIDE.$\"\n\nPalletTown_ProfessorOaksLab_Text_DaisyWillGroomMons::\n    .string \"Hi, {PLAYER}. I bet you've become\\n\"\n    .string \"good friends with your POKéMON.\\p\"\n    .string \"By the way, did you know about\\n\"\n    .string \"DAISY?\\p\"\n    .string \"If you show DAISY your POKéMON,\\n\"\n    .string \"she can tell how much it likes you.\\p\"\n    .string \"Occasionally, she will even groom\\n\"\n    .string \"a POKéMON for you.\\p\"\n    .string \"This is a secret, so please don't\\n\"\n    .string \"tell anyone.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakIsGoingToHaveRadioShow::\n    .string \"PROF. OAK is going to have his own\\n\"\n    .string \"radio show soon.\\p\"\n    .string \"The program will be called PROF.\\n\"\n    .string \"OAK's POKéMON SEMINAR.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakIsAuthorityOnMons::\n    .string \"PROF. OAK may not look like much,\\n\"\n    .string \"but he's the authority on POKéMON.\\p\"\n    .string \"Many POKéMON TRAINERS hold him in\\n\"\n    .string \"high regard.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakFavorToAskYouPlayer::\n    .string \"Ah, now this is excellent!\\p\"\n    .string \"{PLAYER}, I have another important\\n\"\n    .string \"favor to ask of you.\\p\"\n    .string \"I need you to listen closely.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakSightingsOfRareMons::\n    .string \"Recently, there have been sightings\\n\"\n    .string \"of many rare POKéMON species.\\p\"\n    .string \"I'm talking about POKéMON that\\n\"\n    .string \"have never been seen in KANTO.\\p\"\n    .string \"I would love to go see things for\\n\"\n    .string \"myself, but I'm much too old.\\p\"\n    .string \"Since I can't do it, {PLAYER}, I'd\\n\"\n    .string \"like you to go in my place.$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalJustLetMeHandleEverything::\n    .string \"{RIVAL}: Hey, I heard that!\\p\"\n    .string \"Gramps, what's with favoring\\n\"\n    .string \"{PLAYER} over me all the time?\\p\"\n    .string \"I went and collected more POKéMON,\\n\"\n    .string \"and faster, too.\\p\"\n    .string \"You should just let me handle\\n\"\n    .string \"everything.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakNeedYourHelpTooNeedToSeePokedexes::\n    .string \"OAK: I know, I know.\\n\"\n    .string \"Of course I need your help, too.\\p\"\n    .string \"Now, I need to see both your\\n\"\n    .string \"POKéDEXES.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakTookBothPokedexUnits::\n    .string \"PROF. OAK took both POKéDEX\\n\"\n    .string \"units.$\"\n\nPalletTown_ProfessorOaksLab_Text_OakNowTheseUnitsCanRecordMoreData::\n    .string \"… … …  … … …\\p\"\n    .string \"… … …  … … …\\p\"\n    .string \"…And that's done!\\p\"\n    .string \"Now these units can record data on\\n\"\n    .string \"a lot more POKéMON.$\"\n\nPalletTown_ProfessorOaksLab_Text_PlayersPokedexWasUpgraded::\n    .string \"{PLAYER}'s POKéDEX was upgraded!$\"\n\nPalletTown_ProfessorOaksLab_Text_OakMustReallyWorkToFillPokedex::\n    .string \"Now, {PLAYER} and {RIVAL}!\\p\"\n    .string \"This time, you really must work\\n\"\n    .string \"towards filling your POKéDEXES.\\p\"\n    .string \"I urge you to make them the best\\n\"\n    .string \"and the most complete of all time!\\p\"\n    .string \"Truly, this is a monumentally great\\n\"\n    .string \"undertaking in POKéMON history!$\"\n\nPalletTown_ProfessorOaksLab_Text_RivalIllCompleteThePokedex::\n    .string \"{RIVAL}: Gramps, calm down.\\n\"\n    .string \"Don't get so excited.\\p\"\n    .string \"I'll get the POKéDEX completed,\\n\"\n    .string \"don't you worry about a thing.\\p\"\n    .string \"I think I'll try looking around\\n\"\n    .string \"ONE ISLAND first…\\p\"\n    .string \"Anyways, I'm outta here!$\"\n\n"
  },
  {
    "path": "data/maps/PalletTown_RivalsHouse/map.json",
    "content": "{\n  \"id\": \"MAP_PALLET_TOWN_RIVALS_HOUSE\",\n  \"name\": \"PalletTown_RivalsHouse\",\n  \"layout\": \"LAYOUT_PALLET_TOWN_RIVALS_HOUSE\",\n  \"music\": \"MUS_PALLET\",\n  \"region_map_section\": \"MAPSEC_PALLET_TOWN\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_DAISY\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_RivalsHouse_EventScript_Daisy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TOWN_MAP\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_RivalsHouse_EventScript_TownMap\",\n      \"flag\": \"FLAG_HIDE_TOWN_MAP\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PalletTown_RivalsHouse_EventScript_Starter\",\n      \"flag\": \"FLAG_TEMP_1\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PALLET_TOWN\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PALLET_TOWN\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PALLET_TOWN\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_RivalsHouse_EventScript_Bookshelf\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_RivalsHouse_EventScript_Bookshelf\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PalletTown_RivalsHouse_EventScript_Picture\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PalletTown_RivalsHouse/scripts.inc",
    "content": ".equ LOCALID_DAISY,    1\n.equ LOCALID_TOWN_MAP, 2\n\n.equ RECEIVED_TOWN_MAP, VAR_TEMP_1\n\nPalletTown_RivalsHouse_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PalletTown_RivalsHouse_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PalletTown_RivalsHouse_EventScript_SetStarterGfx\n\t.byte 0\n\nPalletTown_RivalsHouse_OnTransition::\n\tcall_if_lt VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2, PalletTown_RivalsHouse_EventScript_MoveDaisyToTable\n\tcall_if_ge VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2, PalletTown_RivalsHouse_EventScript_AlreadyReceivedTownMap\n\tgoto_if_unset FLAG_GOT_DAISY_STARTER, PalletTown_RivalsHouse_EventScript_CheckRemoveStarter\n\tsetflag FLAG_TEMP_1\n\tend\n\nPalletTown_RivalsHouse_EventScript_CheckRemoveStarter::\n\tgoto_if_set FLAG_SYS_CAN_LINK_WITH_RS, PalletTown_RivalsHouse_EventScript_PositionForStarterGiveaway\n\tgoto_if_set FLAG_BADGE01_GET, EventScript_ReleaseEnd\n\tsetflag FLAG_TEMP_1\n\tend\n\nPalletTown_RivalsHouse_EventScript_PositionForStarterGiveaway::\n\tsetobjectmovementtype LOCALID_DAISY, MOVEMENT_TYPE_FACE_UP\n\tsetobjectxyperm LOCALID_DAISY, 8, 5\n\tsetobjectmovementtype 3, MOVEMENT_TYPE_FACE_DOWN\n\tsetobjectxyperm 3, 8, 4\n\tend\n\nPalletTown_RivalsHouse_EventScript_SetStarterGfx::\n\tcall_if_eq VAR_STARTER_MON, 0, PalletTown_RivalsHouse_EventScript_SetSquirtleGfx\n\tcall_if_eq VAR_STARTER_MON, 1, PalletTown_RivalsHouse_EventScript_SetCharmanderGfx\n\tcall_if_ge VAR_STARTER_MON, 2, PalletTown_RivalsHouse_EventScript_SetBulbasaurGfx\n\treturn\n\nPalletTown_RivalsHouse_EventScript_SetSquirtleGfx::\n\tsetvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_SQUIRTLE\n\treturn\n\nPalletTown_RivalsHouse_EventScript_SetCharmanderGfx::\n\tsetvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_CHARMANDER\n\treturn\n\nPalletTown_RivalsHouse_EventScript_SetBulbasaurGfx::\n\tsetvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_BULBASAUR\n\treturn\n\nPalletTown_RivalsHouse_EventScript_MoveDaisyToTable::\n\tsetobjectmovementtype LOCALID_DAISY, MOVEMENT_TYPE_FACE_RIGHT\n\tsetobjectxyperm LOCALID_DAISY, 5, 4\n\treturn\n\nPalletTown_RivalsHouse_EventScript_AlreadyReceivedTownMap::\n\tsetvar RECEIVED_TOWN_MAP, TRUE\n\treturn\n\nPalletTown_RivalsHouse_EventScript_Starter::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_STARTER_MON, 0, PalletTown_RivalsHouse_EventScript_Squirtle\n\tgoto_if_eq VAR_STARTER_MON, 1, PalletTown_RivalsHouse_EventScript_Charmander\n\tgoto_if_ge VAR_STARTER_MON, 2, PalletTown_RivalsHouse_EventScript_Bulbasaur\n\tend\n\nPalletTown_RivalsHouse_EventScript_Squirtle::\n\twaitse\n\tplaymoncry SPECIES_SQUIRTLE, 0\n\tmsgbox PalletTown_RivalsHouse_Text_Squirtle\n\twaitmoncry\n\trelease\n\tend\n\nPalletTown_RivalsHouse_Text_Squirtle:\n\t.string \"SQUIRTLE: Squirtle squirt!$\"\n\nPalletTown_RivalsHouse_EventScript_Charmander::\n\twaitse\n\tplaymoncry SPECIES_CHARMANDER, 0\n\tmsgbox PalletTown_RivalsHouse_Text_Charmander\n\twaitmoncry\n\trelease\n\tend\n\nPalletTown_RivalsHouse_Text_Charmander:\n\t.string \"CHARMANDER: Char char!$\"\n\nPalletTown_RivalsHouse_EventScript_Bulbasaur::\n\twaitse\n\tplaymoncry SPECIES_BULBASAUR, 0\n\tmsgbox PalletTown_RivalsHouse_Text_Bulbasaur\n\twaitmoncry\n\trelease\n\tend\n\nPalletTown_RivalsHouse_Text_Bulbasaur:\n\t.string \"BULBASAUR: Bubba! Zoar!$\"\n\nPalletTown_RivalsHouse_EventScript_Daisy::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_DAISY, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tgoto_if_set FLAG_SYS_CAN_LINK_WITH_RS, PalletTown_RivalsHouse_EventScript_GiveFinalStarter\nPalletTown_RivalsHouse_EventScript_DaisyRegular::\n\tgoto_if_set FLAG_SYS_GAME_CLEAR, PalletTown_RivalsHouse_EventScript_GroomMon\n\tgoto_if_eq RECEIVED_TOWN_MAP, TRUE, PalletTown_RivalsHouse_EventScript_PleaseGiveMonsRest\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2, PalletTown_RivalsHouse_EventScript_ExplainTownMap\n\tgoto_if_eq VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 1, PalletTown_RivalsHouse_EventScript_GiveTownMap\n\tgoto_if_ge VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 1, PalletTown_RivalsHouse_EventScript_HeardBattledRival\n\tmsgbox PalletTown_RivalsHouse_Text_HiBrothersAtLab\n\tclosemessage\n\tapplymovement LOCALID_DAISY, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_HeardBattledRival::\n\tmsgbox PalletTown_RivalsHouse_Text_HeardYouBattledRival\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_GroomMon::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tgoto_if_lt VAR_MASSAGE_COOLDOWN_STEP_COUNTER, 500, PalletTown_RivalsHouse_EventScript_RateMonFriendship\n\tmsgbox PalletTown_RivalsHouse_Text_LikeMeToGroomMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, PalletTown_RivalsHouse_EventScript_DeclineGrooming\n\tmsgbox PalletTown_RivalsHouse_Text_GroomWhichOne\n\tspecial ChoosePartyMon\n\twaitstate\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, PalletTown_RivalsHouse_EventScript_DeclineGrooming\n\tspecialvar VAR_RESULT, GetPartyMonSpecies\n\tgoto_if_eq VAR_RESULT, SPECIES_EGG, PalletTown_RivalsHouse_EventScript_CantGroomEgg\n\tmsgbox PalletTown_RivalsHouse_Text_LookingNiceInNoTime\n\tclosemessage\n\tfadescreen FADE_TO_BLACK\n\tplayfanfare MUS_RS_HEAL\n\twaitfanfare\n\tspecial DaisyMassageServices\n\tfadescreen FADE_FROM_BLACK\n\tspecial BufferMonNickname\n\tmsgbox PalletTown_RivalsHouse_Text_ThereYouGoAllDone\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_CantGroomEgg::\n\tmsgbox PalletTown_RivalsHouse_Text_CantGroomAnEgg\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_DeclineGrooming::\n\tmsgbox PalletTown_RivalsHouse_Text_DontNeedAnyGrooming\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_RateMonFriendship::\n\tmsgbox PalletTown_RivalsHouse_Text_MayISeeFirstMon\n\tspecialvar VAR_RESULT, GetLeadMonFriendship\n\tswitch VAR_RESULT\n\tcase 0, PalletTown_RivalsHouse_EventScript_MonFriendshipLowest\n\tcase 1, PalletTown_RivalsHouse_EventScript_MonFriendshipLower\n\tcase 2, PalletTown_RivalsHouse_EventScript_MonFriendshipLow\n\tcase 3, PalletTown_RivalsHouse_EventScript_MonFriendshipMid\n\tcase 4, PalletTown_RivalsHouse_EventScript_MonFriendshipHigh\n\tcase 5, PalletTown_RivalsHouse_EventScript_MonFriendshipHigher\n\tcase 6, PalletTown_RivalsHouse_EventScript_MonFriendshipHighest\n\tend\n\nPalletTown_RivalsHouse_EventScript_MonFriendshipLowest::\n\tmsgbox PalletTown_RivalsHouse_Text_WhyWouldMonHateYouSoMuch\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_MonFriendshipLower::\n\tmsgbox PalletTown_RivalsHouse_Text_DontLikeWayItGlaresAtYou\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_MonFriendshipLow::\n\tmsgbox PalletTown_RivalsHouse_Text_NotFamiliarWithYouYet\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_MonFriendshipMid::\n\tmsgbox PalletTown_RivalsHouse_Text_ItsWarmingUpToYou\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_MonFriendshipHigh::\n\tmsgbox PalletTown_RivalsHouse_Text_ItsQuiteFriendly\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_MonFriendshipHigher::\n\tmsgbox PalletTown_RivalsHouse_Text_ItLooksVeryHappy\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_MonFriendshipHighest::\n\tmsgbox PalletTown_RivalsHouse_Text_CouldntLoveYouMore\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_PleaseGiveMonsRest::\n\tmsgbox PalletTown_RivalsHouse_Text_PleaseGiveMonsRest\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_GiveTownMap::\n\tmsgbox PalletTown_RivalsHouse_Text_ErrandForGrandpaThisWillHelp\n\tclosemessage\n\tcheckitemspace ITEM_TOWN_MAP\n\tgoto_if_eq VAR_RESULT, FALSE, PalletTown_RivalsHouse_EventScript_NoRoomForTownMap\n\tapplymovement LOCALID_DAISY, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tremoveobject LOCALID_TOWN_MAP\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE, 2\n\tdelay 15\n\tapplymovement LOCALID_DAISY, Common_Movement_FacePlayer\n\twaitmovement 0\n\tdelay 12\n\tgiveitem_msg PalletTown_RivalsHouse_Text_ReceivedTownMapFromDaisy, ITEM_TOWN_MAP, 1, MUS_OBTAIN_KEY_ITEM\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_NoRoomForTownMap::\n\tmsgbox PalletTown_RivalsHouse_Text_DontHaveSpaceForThis\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_ExplainTownMap::\n\tmsgbox PalletTown_RivalsHouse_Text_ExplainTownMap\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_TownMap::\n\tmsgbox PalletTown_RivalsHouse_Text_ItsBigMapOfKanto, MSGBOX_NPC\n\tend\n\nPalletTown_RivalsHouse_EventScript_Bookshelf::\n\tmsgbox PalletTown_RivalsHouse_Text_ShelvesCrammedFullOfBooks, MSGBOX_SIGN\n\tend\n\nPalletTown_RivalsHouse_EventScript_Picture::\n\tmsgbox PalletTown_RivalsHouse_Text_LovelyAndSweetClefairy, MSGBOX_SIGN\n\tend\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter::\n\tgoto_if_set FLAG_GOT_DAISY_STARTER, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_2\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_1:\n\tswitch VAR_STARTER_MON\n\tcase 0, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_6\n\tcase 1, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_7\n\tcase 2, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_8\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_4:\n\tmsgbox PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_3, MSGBOX_YESNO\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq PalletTown_RivalsHouse_EventScript_GiveFinalStarter_10\n\tspecialvar VAR_RESULT, CalculatePlayerPartyCount\n\tcompare VAR_RESULT, PARTY_SIZE\n\tgoto_if_eq PalletTown_RivalsHouse_EventScript_GiveFinalStarter_13\n\ttextcolor 3\n\twaitse\n\tplaymoncry VAR_TEMP_2, 0\n\tmsgbox PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_6\n\twaitmoncry\n\trelease\n\tturnobject 3, DIR_SOUTH\n\tapplymovement LOCALID_DAISY, PalletTown_RivalsHouse_Movement_FaceUp\n\twaitmovement 0\n\tremoveobject 3\n\tdelay 16\n\tfaceplayer\n\tgivemon VAR_TEMP_2, 5, ITEM_NONE\n\tplayfanfare MUS_LEVEL_UP\n\tmessage PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_7\n\twaitmessage\n\twaitfanfare\n\tcallnative CheckNuzlockeMode\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq PalletTown_RivalsHouse_EventScript_GiveFinalStarter_16\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tcompare VAR_RESULT, YES\n\tgoto_if_eq PalletTown_RivalsHouse_EventScript_GiveFinalStarter_16\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_15:\n\tcall EventScript_RestorePrevTextColor\n\tsetflag FLAG_GOT_DAISY_STARTER\n\tmsgbox PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_8\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_2:\n\tgoto PalletTown_RivalsHouse_EventScript_DaisyRegular\n\tgoto PalletTown_RivalsHouse_EventScript_GiveFinalStarter_1\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_6:\n\tbufferspeciesname STR_VAR_1, SPECIES_SQUIRTLE\n\tbufferstring 1, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_0\n\tsetvar VAR_TEMP_2, SPECIES_SQUIRTLE\n\tgoto PalletTown_RivalsHouse_EventScript_GiveFinalStarter_4\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_7:\n\tbufferspeciesname STR_VAR_1, SPECIES_CHARMANDER\n\tbufferstring 1, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_1\n\tsetvar VAR_TEMP_2, SPECIES_CHARMANDER\n\tgoto PalletTown_RivalsHouse_EventScript_GiveFinalStarter_4\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_8:\n\tbufferspeciesname STR_VAR_1, SPECIES_BULBASAUR\n\tbufferstring 1, PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_2\n\tsetvar VAR_TEMP_2, SPECIES_BULBASAUR\n\tgoto PalletTown_RivalsHouse_EventScript_GiveFinalStarter_4\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_10:\n\tmsgbox PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_4\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_13:\n\tmsgbox PalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_5\n\trelease\n\tend\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_16:\n\tcall EventScript_GetGiftMonPartySlot\n\tcall EventScript_ChangePokemonNickname\n\tgoto PalletTown_RivalsHouse_EventScript_GiveFinalStarter_15\n\n\nPalletTown_RivalsHouse_Movement_FaceUp:\n\twalk_in_place_faster_up\n\tdelay_16\n\twalk_in_place_faster_up\n\tstep_end\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_0:\n\t.string \"SQUIRTLE: Squirt! Squirtle!$\"\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_1:\n\t.string \"CHARMANDER: Charmander! Char!$\"\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_2:\n\t.string \"BULBASAUR: Zoar! Bubba!$\"\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_3:\n\t.string \"DAISY: Grandpa gave me this\\n{STR_VAR_1} to look after, but…\\p{STR_VAR_1}'s gotten terribly bored \\ncooped up here at home.\\p{PLAYER}, I think it would be much\\nhappier traveling with you.\\pWill you please take {STR_VAR_1}\\nwith you on your adventures?$\"\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_4:\n\t.string \"I understand, though {STR_VAR_1}\\nlooks disappointed.\\pPlease come back if you change\\nyour mind.$\"\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_5:\n\t.string \"Oh, you have no room to take\\n{STR_VAR_1} with you.\\pWe'll wait here until you've\\nmade some space.$\"\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_6:\n\t.string \"{STR_VAR_2}$\"\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_7:\n\t.string \"{PLAYER} received a {STR_VAR_1}\\nfrom DAISY!$\"\n\nPalletTown_RivalsHouse_EventScript_GiveFinalStarter_Text_8:\n\t.string \"DAISY: Thank you, {PLAYER}!\\pTake good care of\\n{STR_VAR_1}!$\"\n"
  },
  {
    "path": "data/maps/PalletTown_RivalsHouse/text.inc",
    "content": "PalletTown_RivalsHouse_Text_HiBrothersAtLab::\n    .string \"DAISY: Hi, {PLAYER}!\\p\"\n    .string \"My brother, {RIVAL}, is out at\\n\"\n    .string \"Grandpa's LAB.$\"\n\nPalletTown_RivalsHouse_Text_HeardYouBattledRival::\n    .string \"DAISY: {PLAYER}, I heard you had\\n\"\n    .string \"a battle against {RIVAL}.\\p\"\n    .string \"I wish I'd seen that!$\"\n\nPalletTown_RivalsHouse_Text_ErrandForGrandpaThisWillHelp::\n    .string \"Grandpa asked you to run an\\n\"\n    .string \"errand?\\p\"\n    .string \"Gee, that's lazy of him.\\n\"\n    .string \"Here, this will help you.$\"\n\nPalletTown_RivalsHouse_Text_ReceivedTownMapFromDaisy::\n    .string \"{PLAYER} received a TOWN MAP\\n\"\n    .string \"from DAISY.$\"\n\nPalletTown_RivalsHouse_Text_DontHaveSpaceForThis::\n    .string \"You don't have space for this in\\n\"\n    .string \"your BAG.$\"\n\nPalletTown_RivalsHouse_Text_ExplainTownMap::\n    .string \"You can use the TOWN MAP to find\\n\"\n    .string \"out where you are, or check the\\l\"\n    .string \"names of places.$\"\n\nPalletTown_RivalsHouse_Text_PleaseGiveMonsRest::\n    .string \"DAISY: Just like people, POKéMON\\n\"\n    .string \"are living things.\\p\"\n    .string \"When they get tired, please give\\n\"\n    .string \"them a rest.$\"\n\nPalletTown_RivalsHouse_Text_ItsBigMapOfKanto::\n    .string \"It's a big map of the KANTO region.\\n\"\n    .string \"Now this would be useful!$\"\n\nPalletTown_RivalsHouse_Text_ShelvesCrammedFullOfBooks::\n    .string \"The shelves are crammed full of\\n\"\n    .string \"books on POKéMON.$\"\n\nPalletTown_RivalsHouse_Text_LikeMeToGroomMon::\n    .string \"DAISY: Hi, {PLAYER}!\\n\"\n    .string \"Good timing.\\p\"\n    .string \"I'm about to have some tea.\\n\"\n    .string \"Would you like to join me?\\p\"\n    .string \"Oh, but look.\\n\"\n    .string \"Your POKéMON are a little dirty.\\p\"\n    .string \"Would you like me to groom one?$\"\n\nPalletTown_RivalsHouse_Text_DontNeedAnyGrooming::\n    .string \"You don't need any grooming done?\\n\"\n    .string \"Okay, we'll just have tea.$\"\n\nPalletTown_RivalsHouse_Text_GroomWhichOne::\n    .string \"Which one should I groom?$\"\n\nPalletTown_RivalsHouse_Text_LookingNiceInNoTime::\n    .string \"DAISY: Okay, I'll get it looking\\n\"\n    .string \"nice in no time.$\"\n\nPalletTown_RivalsHouse_Text_ThereYouGoAllDone::\n    .string \"{FONT_NORMAL}{STR_VAR_1} looks dreamily content…\\p\"\n    .string \"{FONT_FEMALE}DAISY: There you go! All done.\\n\"\n    .string \"See? Doesn't it look nice?\\p\"\n    .string \"Giggle…\\n\"\n    .string \"It's such a cute POKéMON.$\"\n\nPalletTown_RivalsHouse_Text_CantGroomAnEgg::\n    .string \"Oh, sorry. I honestly can't\\n\"\n    .string \"groom an EGG.$\"\n\nPalletTown_RivalsHouse_Text_MayISeeFirstMon::\n    .string \"DAISY: Your POKéMON grow to love\\n\"\n    .string \"you if you raise them with love.\\p\"\n    .string \"For example, {PLAYER}, may I see\\n\"\n    .string \"your first POKéMON?$\"\n\nPalletTown_RivalsHouse_Text_CouldntLoveYouMore::\n    .string \"It couldn't possibly love you\\n\"\n    .string \"any more than it does now.\\p\"\n    .string \"Your POKéMON is happy beyond\\n\"\n    .string \"words.$\"\n\nPalletTown_RivalsHouse_Text_ItLooksVeryHappy::\n    .string \"It looks very happy.\\p\"\n    .string \"I wish {RIVAL} could see this and\\n\"\n    .string \"learn something from it.$\"\n\nPalletTown_RivalsHouse_Text_ItsQuiteFriendly::\n    .string \"It's quite friendly with you.\\n\"\n    .string \"Keep being good to it!$\"\n\nPalletTown_RivalsHouse_Text_ItsWarmingUpToYou::\n    .string \"It's warming up to you.\\n\"\n    .string \"Trust must be growing between you.$\"\n\nPalletTown_RivalsHouse_Text_NotFamiliarWithYouYet::\n    .string \"It's not quite familiar with you\\n\"\n    .string \"yet.\\p\"\n    .string \"POKéMON are all quite wary when\\n\"\n    .string \"you first get them.$\"\n\nPalletTown_RivalsHouse_Text_DontLikeWayItGlaresAtYou::\n    .string \"{PLAYER}, I don't like the way it\\n\"\n    .string \"glares at you.\\p\"\n    .string \"Could you try being a little nicer\\n\"\n    .string \"to it?$\"\n\nPalletTown_RivalsHouse_Text_WhyWouldMonHateYouSoMuch::\n    .string \"…Um, it's not easy for me to say\\n\"\n    .string \"this, but…\\p\"\n    .string \"Is there some reason why your\\n\"\n    .string \"POKéMON would hate you so much?$\"\n\nPalletTown_RivalsHouse_Text_LovelyAndSweetClefairy::\n    .string \"“The lovely and sweet\\n\"\n    .string \"CLEFAIRY”$\"\n\n"
  },
  {
    "path": "data/maps/PewterCity/map.json",
    "content": "{\n  \"id\": \"MAP_PEWTER_CITY\",\n  \"name\": \"PewterCity\",\n  \"layout\": \"LAYOUT_PEWTER_CITY\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_PEWTER_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": 12,\n      \"map\": \"MAP_ROUTE2\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE3\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_EventScript_Lass\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_EventScript_MuseumGuide\",\n      \"flag\": \"FLAG_HIDE_PEWTER_MUSEUM_GUIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_EventScript_FatMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_EventScript_BugCatcher\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 42,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_EventScript_GymGuide\",\n      \"flag\": \"FLAG_HIDE_PEWTER_CITY_GYM_GUIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_PEWTER_CITY_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 46,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_EventScript_RunningShoesAide\",\n      \"flag\": \"FLAG_HIDE_PEWTER_CITY_RUNNING_SHOES_GUY\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BIRD_KEEPER\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Spearow\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Gloom\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 17,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY_MUSEUM_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY_MUSEUM_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY_GYM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY_MART\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY_HOUSE1\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 30,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY_HOUSE2\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 42,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PEWTER_CITY\",\n      \"var_value\": \"0\",\n      \"script\": \"PewterCity_EventScript_GymGuideTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 42,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PEWTER_CITY\",\n      \"var_value\": \"0\",\n      \"script\": \"PewterCity_EventScript_GymGuideTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 42,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PEWTER_CITY\",\n      \"var_value\": \"0\",\n      \"script\": \"PewterCity_EventScript_GymGuideTriggerBottom\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 43,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PEWTER_CITY\",\n      \"var_value\": \"0\",\n      \"script\": \"PewterCity_EventScript_GymGuideTriggerRight\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 46,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PEWTER_CITY\",\n      \"var_value\": \"1\",\n      \"script\": \"PewterCity_EventScript_RunningShoesAideTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 46,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PEWTER_CITY\",\n      \"var_value\": \"1\",\n      \"script\": \"PewterCity_EventScript_RunningShoesAideTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 46,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PEWTER_CITY\",\n      \"var_value\": \"1\",\n      \"script\": \"PewterCity_EventScript_RunningShoesAideTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 19,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_EventScript_MuseumSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 39,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_EventScript_PoliceNotice\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_EventScript_GymSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 20,\n      \"y\": 30,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_EventScript_TrainerTips\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 31,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_EventScript_CitySign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 6,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"item\": \"ITEM_POKE_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_PEWTER_CITY_POKE_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PewterCity/scripts.inc",
    "content": ".equ LOCALID_MUSEUM_GUIDE, 2\n.equ LOCALID_GYM_GUIDE,    5\n.equ LOCALID_AIDE,         7\n.set LOCALID_SPEAROW_MASTER, 8\n.set LOCALID_GLOOM_MASTER, 9\n.set TRAINER, VAR_0x8009\n\nPewterCity_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, PewterCity_MapScript_FixLedgeForMasterTrainer\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PewterCity_OnTransition\n\t.byte 0\n\nPewterCity_MapScript_FixLedgeForMasterTrainer::\n\tgoto_if_set FLAG_HIDE_MASTER_TRAINERS, EventScript_ReleaseEnd\n\tsetmetatile 28, 30, 0x28A, 1\n\tend\n\nPewterCity_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_PEWTER_CITY\n\tsetvar VAR_MAP_SCENE_PEWTER_CITY_MUSEUM_1F, 0\n\tgoto PewterCity_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nPewterCity_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_SPEAROW\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PewterCity_MapScript_SpearowMasterMovementType\n\tsetvar TRAINER, MASTER_GLOOM\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PewterCity_MapScript_GloomMasterMovementType\n\tend\n\nPewterCity_MapScript_SpearowMasterMovementType::\n\tsetobjectmovementtype LOCALID_SPEAROW_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPewterCity_MapScript_GloomMasterMovementType::\n\tsetobjectmovementtype LOCALID_GLOOM_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\n@ Impossible to speak to this NPC from a facing dir != DIR_EAST normally, so they arent checked\n@ Additionally, no movement script exists for facing DIR_SOUTH, which would necessitate walking out of bounds\nPewterCity_EventScript_GymGuide::\n\tlock\n\tfaceplayer\n\tmsgbox PewterCity_Text_BrocksLookingForChallengersFollowMe\n\tclosemessage\n\tplaybgm MUS_FOLLOW_ME, 0\n\tcall_if_eq VAR_FACING, DIR_EAST, PewterCity_EventScript_WalkToGymEast\n\tmsgbox PewterCity_Text_GoTakeOnBrock\n\tclosemessage\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GymGuideExit\n\twaitmovement 0\n\tfadedefaultbgm\n\tremoveobject LOCALID_GYM_GUIDE\n\tclearflag FLAG_HIDE_PEWTER_CITY_GYM_GUIDE\n\trelease\n\tend\n\nPewterCity_EventScript_WalkToGymEast::\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWaitForGuideEast\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideMoveToLeadEast\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymEast\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymEast\n\twaitmovement 0\n\treturn\n\n@ Unused\nPewterCity_EventScript_WalkToGymWest::\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWaitForGuideWest\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideMoveToLeadWest\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymWest\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymWest\n\twaitmovement 0\n\treturn\n\n@ Unused\nPewterCity_EventScript_WalkToGymNorth::\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWaitForGuideNorth\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideMoveToLeadNorth\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymNorth\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymNorth\n\twaitmovement 0\n\treturn\n\n.macro walk_to_gym\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n.endm\n\n.macro walk_to_gym_alt\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n.endm\n\nPewterCity_Movement_PlayerWaitForGuideEast::\n\tdelay_16\n\tdelay_16\n\tdelay_4\n\twalk_in_place_faster_down\n\tstep_end\n\nPewterCity_Movement_PlayerWalkToGymEast::\n\twalk_down\n\twalk_to_gym\n\tstep_end\n\nPewterCity_Movement_PlayerWaitForGuideWest::\n\tdelay_16\n\tstep_end\n\nPewterCity_Movement_PlayerWalkToGymWest::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_to_gym_alt\n\tstep_end\n\nPewterCity_Movement_PlayerWaitForGuideNorth::\n\tdelay_16\n\tstep_end\n\nPewterCity_Movement_PlayerWalkToGymNorth::\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_to_gym_alt\n\tstep_end\n\nPewterCity_Movement_GuideMoveToLeadEast::\n\twalk_down\n\twalk_left\n\twalk_in_place_faster_up\n\twalk_in_place_up\n\tstep_end\n\nPewterCity_Movement_GuideWalkToGymEast::\n\twalk_to_gym\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nPewterCity_Movement_GuideMoveToLeadWest::\n\twalk_in_place_right\n\tstep_end\n\nPewterCity_Movement_GuideWalkToGymWest::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_to_gym_alt\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nPewterCity_Movement_GuideMoveToLeadNorth::\n\twalk_in_place_down\n\tstep_end\n\nPewterCity_Movement_GuideWalkToGymNorth::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_to_gym_alt\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nPewterCity_Movement_GymGuideExit::\n\twalk_down\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\tstep_end\n\nPewterCity_EventScript_GymGuideTriggerTop::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto PewterCity_EventScript_GymGuideTrigger\n\tend\n\nPewterCity_EventScript_GymGuideTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto PewterCity_EventScript_GymGuideTrigger\n\tend\n\nPewterCity_EventScript_GymGuideTriggerBottom::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tgoto PewterCity_EventScript_GymGuideTrigger\n\tend\n\n@ This trigger is inaccessible and its corresponding movement script isnt linked\nPewterCity_EventScript_GymGuideTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_1, 3\n\tgoto PewterCity_EventScript_GymGuideTrigger\n\tend\n\nPewterCity_EventScript_GymGuideTrigger::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox PewterCity_Text_BrocksLookingForChallengersFollowMe\n\tclosemessage\n\tplaybgm MUS_FOLLOW_ME, 0\n\tcall_if_eq VAR_TEMP_1, 0, PewterCity_EventScript_WalkToGymTop\n\tcall_if_eq VAR_TEMP_1, 1, PewterCity_EventScript_WalkToGymMid\n\tcall_if_eq VAR_TEMP_1, 2, PewterCity_EventScript_WalkToGymBottom\n\tmsgbox PewterCity_Text_GoTakeOnBrock\n\tclosemessage\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GymGuideExit\n\twaitmovement 0\n\tfadedefaultbgm\n\tremoveobject LOCALID_GYM_GUIDE\n\tclearflag FLAG_HIDE_PEWTER_CITY_GYM_GUIDE\n\treleaseall\n\tend\n\nPewterCity_EventScript_WalkToGymTop::\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideMoveToLeadTop\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymTop\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymTop\n\twaitmovement 0\n\treturn\n\nPewterCity_EventScript_WalkToGymMid::\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideMoveToLeadMid\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymMid\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymMid\n\twaitmovement 0\n\treturn\n\nPewterCity_EventScript_WalkToGymBottom::\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideMoveToLeadBottom\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymBottom\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymBottom\n\twaitmovement 0\n\treturn\n\n@ Unused\nPewterCity_EventScript_WalkToGymRight::\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideApproachPlayerRight\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToGymRight\n\tapplymovement LOCALID_GYM_GUIDE, PewterCity_Movement_GuideWalkToGymRight\n\twaitmovement 0\n\treturn\n\nPewterCity_Movement_PlayerWalkToGymTop::\n\twalk_left\n\twalk_to_gym\n\tstep_end\n\nPewterCity_Movement_PlayerWalkToGymMid::\n\twalk_up\n\twalk_left\n\twalk_to_gym\n\tstep_end\n\nPewterCity_Movement_PlayerWalkToGymBottom::\n\twalk_up\n\twalk_up\n\twalk_left\n\twalk_to_gym\n\tstep_end\n\nPewterCity_Movement_PlayerWalkToGymRight::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_to_gym_alt\n\tstep_end\n\nPewterCity_Movement_GuideMoveToLeadTop::\n\twalk_left\n\twalk_down\n\twalk_in_place_faster_right\n\twalk_in_place_right\n\tstep_end\n\nPewterCity_Movement_GuideMoveToLeadMid::\n\twalk_down\n\twalk_in_place_down\n\tstep_end\n\nPewterCity_Movement_GuideMoveToLeadBottom::\n\twalk_down\n\twalk_down\n\twalk_in_place_down\n\tstep_end\n\nPewterCity_Movement_GuideApproachPlayerRight::\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_down\n\twalk_right\n\twalk_in_place_right\n\tstep_end\n\nPewterCity_Movement_GuideWalkToGymTop::\n\twalk_to_gym\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nPewterCity_Movement_GuideWalkToGymMid::\n\twalk_left\n\twalk_to_gym\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nPewterCity_Movement_GuideWalkToGymBottom::\n\twalk_up\n\twalk_left\n\twalk_to_gym\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nPewterCity_Movement_GuideWalkToGymRight::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_to_gym_alt\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nPewterCity_EventScript_Lass::\n\tmsgbox PewterCity_Text_ClefairyCameFromMoon, MSGBOX_NPC\n\tend\n\nPewterCity_EventScript_MuseumGuide::\n\tlock\n\tfaceplayer\n\tmsgbox PewterCity_Text_DidYouCheckOutMuseum, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, PewterCity_EventScript_CheckedOutMuseum\n\tmsgbox PewterCity_Text_ReallyYouHaveToGo\n\tclosemessage\n\tdelay 10\n\tplaybgm MUS_FOLLOW_ME, 0\n\tcall_if_eq VAR_FACING, DIR_NORTH, PewterCity_EventScript_LeadToMuseumNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PewterCity_EventScript_LeadToMuseumSouth\n\tcall_if_eq VAR_FACING, DIR_WEST, PewterCity_EventScript_LeadToMuseumWest\n\tcall_if_eq VAR_FACING, DIR_EAST, PewterCity_EventScript_LeadToMuseumEast\n\tmsgbox PewterCity_Text_ThisIsTheMuseum\n\tclosemessage\n\tdelay 10\n\tapplymovement LOCALID_MUSEUM_GUIDE, PewterCity_Movement_MuseumGuideExit\n\twaitmovement 0\n\tfadedefaultbgm\n\tremoveobject LOCALID_MUSEUM_GUIDE\n\tclearflag FLAG_HIDE_PEWTER_MUSEUM_GUIDE\n\trelease\n\tend\n\nPewterCity_EventScript_LeadToMuseumNorth::\n\tapplymovement LOCALID_MUSEUM_GUIDE, PewterCity_Movement_GuideWalkToMuseumNorth\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToMuseumNorth\n\twaitmovement 0\n\treturn\n\nPewterCity_EventScript_LeadToMuseumSouth::\n\tapplymovement LOCALID_MUSEUM_GUIDE, PewterCity_Movement_GuideWalkToMuseumSouth\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToMuseumSouth\n\twaitmovement 0\n\treturn\n\nPewterCity_EventScript_LeadToMuseumWest::\n\tapplymovement LOCALID_MUSEUM_GUIDE, PewterCity_Movement_GuideWalkToMuseumWest\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToMuseumWest\n\twaitmovement 0\n\treturn\n\nPewterCity_EventScript_LeadToMuseumEast::\n\tapplymovement LOCALID_MUSEUM_GUIDE, PewterCity_Movement_GuideWalkToMuseumEast\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Movement_PlayerWalkToMuseumEast\n\twaitmovement 0\n\treturn\n\nPewterCity_EventScript_CheckedOutMuseum::\n\tmsgbox PewterCity_Text_WerentThoseFossilsAmazing\n\trelease\n\tend\n\n.macro walk_to_museum\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n.endm\n\n.macro walk_to_museum_south\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n.endm\n\nPewterCity_Movement_PlayerWalkToMuseumNorth::\n\twalk_up\n\twalk_to_museum\n\tdelay_8\n\twalk_in_place_faster_up\n\tstep_end\n\nPewterCity_Movement_GuideWalkToMuseumNorth::\n\twalk_to_museum\n\twalk_left\n\twalk_in_place_faster_up\n\tstep_end\n\nPewterCity_Movement_PlayerWalkToMuseumSouth::\n\tdelay_16\n\tdelay_16\n\twalk_left\n\twalk_to_museum_south\n\tdelay_8\n\twalk_in_place_faster_up\n\tstep_end\n\nPewterCity_Movement_GuideWalkToMuseumSouth::\n\twalk_left\n\twalk_up\n\twalk_to_museum_south\n\twalk_left\n\twalk_in_place_faster_up\n\tstep_end\n\nPewterCity_Movement_PlayerWalkToMuseumWest::\n\twalk_left\n\twalk_to_museum\n\tdelay_8\n\twalk_in_place_faster_up\n\tstep_end\n\nPewterCity_Movement_GuideWalkToMuseumWest::\n\twalk_to_museum\n\twalk_left\n\twalk_in_place_faster_up\n\tstep_end\n\nPewterCity_Movement_PlayerWalkToMuseumEast::\n\twalk_right\n\twalk_to_museum\n\tdelay_8\n\twalk_in_place_faster_up\n\tstep_end\n\nPewterCity_Movement_GuideWalkToMuseumEast::\n\twalk_to_museum\n\twalk_left\n\twalk_in_place_faster_up\n\tstep_end\n\nPewterCity_Movement_MuseumGuideExit::\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\tstep_end\n\nPewterCity_EventScript_FatMan::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_BROCK, 2\n\tmsgbox PewterCity_Text_BrockOnlySeriousTrainerHere\n\trelease\n\tend\n\nPewterCity_EventScript_BugCatcher::\n\tlock\n\tfaceplayer\n\tmsgbox PewterCity_Text_DoYouKnowWhatImDoing, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, PewterCity_EventScript_KnowWhatTheyreDoing\n\tmsgbox PewterCity_Text_SprayingRepelToKeepWildMonsOut\n\trelease\n\tend\n\nPewterCity_EventScript_KnowWhatTheyreDoing::\n\tmsgbox PewterCity_Text_ThatsRightItsHardWork\n\trelease\n\tend\n\nPewterCity_EventScript_TrainerTips::\n\tmsgbox PewterCity_Text_TrainerTipsEarningEXP, MSGBOX_SIGN\n\tend\n\nPewterCity_EventScript_PoliceNotice::\n\tmsgbox PewterCity_Text_CallPoliceIfInfoOnThieves, MSGBOX_SIGN\n\tend\n\nPewterCity_EventScript_MuseumSign::\n\tmsgbox PewterCity_Text_MuseumOfScience, MSGBOX_SIGN\n\tend\n\nPewterCity_EventScript_GymSign::\n\tlockall\n\tfamechecker FAMECHECKER_BROCK, 0\n\tmsgbox PewterCity_Text_GymSign\n\treleaseall\n\tend\n\nPewterCity_EventScript_CitySign::\n\tmsgbox PewterCity_Text_CitySign, MSGBOX_SIGN\n\tend\n\nPewterCity_EventScript_RunningShoesAide::\n\tlock\n\tfaceplayer\n\tsetvar VAR_TEMP_1, 0\n\tcall PewterCity_EventScript_AideGiveRunningShoes\n\trelease\n\tend\n\nPewterCity_EventScript_RunningShoesAideTriggerTop::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tcall PewterCity_EventScript_AideGiveRunningShoes\n\treleaseall\n\tend\n\nPewterCity_EventScript_RunningShoesAideTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tcall PewterCity_EventScript_AideGiveRunningShoes\n\treleaseall\n\tend\n\nPewterCity_EventScript_RunningShoesAideTriggerBottom::\n\tlockall\n\tsetvar VAR_TEMP_1, 3\n\tcall PewterCity_EventScript_AideGiveRunningShoes\n\treleaseall\n\tend\n\nPewterCity_EventScript_AideGiveRunningShoes::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tcall_if_eq VAR_TEMP_1, 1, PewterCity_EventScript_AideNoticePlayer\n\tcall_if_eq VAR_TEMP_1, 2, PewterCity_EventScript_AideNoticePlayer\n\tcall_if_eq VAR_TEMP_1, 3, PewterCity_EventScript_AideNoticePlayer\n\twaitse\n\tplayse SE_PIN\n\tapplymovement LOCALID_AIDE, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_AIDE, Common_Movement_Delay48\n\twaitmovement 0\n\tmsgbox PewterCity_Text_OhPlayer\n\tcall_if_eq VAR_TEMP_1, 0, PewterCity_EventScript_AideApproachPlayer0\n\tcall_if_eq VAR_TEMP_1, 1, PewterCity_EventScript_AideApproachPlayer1\n\tcall_if_eq VAR_TEMP_1, 2, PewterCity_EventScript_AideApproachPlayer2\n\tcall_if_eq VAR_TEMP_1, 3, PewterCity_EventScript_AideApproachPlayer3\n\tmsgbox PewterCity_Text_AskedToDeliverThis\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\tmessage PewterCity_Text_ReceivedRunningShoesFromAide\n\twaitmessage\n\twaitfanfare\n\tcall EventScript_RestorePrevTextColor\n\tmsgbox PewterCity_Text_MustBeGoingBackToLab\n\tclosemessage\n\tcall_if_eq VAR_TEMP_1, 0, PewterCity_EventScript_AideExit0\n\tcall_if_eq VAR_TEMP_1, 1, PewterCity_EventScript_AideExit1\n\tcall_if_eq VAR_TEMP_1, 2, PewterCity_EventScript_AideExit2\n\tcall_if_eq VAR_TEMP_1, 3, PewterCity_EventScript_AideExit3\n\tdelay 30\n\tcheckplayergender\n\tgoto_if_eq VAR_RESULT, FEMALE, PewterCity_EventScript_LetterFemale\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PewterCity_Text_RunningShoesLetterFromMom\n\tclosemessage\n\tremoveobject LOCALID_AIDE\n\tsetvar VAR_MAP_SCENE_PEWTER_CITY, 2\n\treturn\n\nPewterCity_EventScript_LetterFemale::\n\ttextcolor 3\n\tmsgbox PewterCity_Text_RunningShoesLetterFromMomFemale\n\tclosemessage\n\tremoveobject LOCALID_AIDE\n\tsetvar VAR_MAP_SCENE_PEWTER_CITY, 2\n\treturn\n\nPewterCity_EventScript_AideNoticePlayer::\n\tapplymovement LOCALID_AIDE, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\n@ Aide already at player\nPewterCity_EventScript_AideApproachPlayer0::\n\tclosemessage\n\tdelay 20\n\treturn\n\nPewterCity_EventScript_AideApproachPlayer1::\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\treturn\n\nPewterCity_EventScript_AideApproachPlayer2::\n\tclosemessage\n\tapplymovement LOCALID_AIDE, PewterCity_Movement_AideApproachPlayerMid\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\treturn\n\nPewterCity_EventScript_AideApproachPlayer3::\n\tclosemessage\n\tapplymovement LOCALID_AIDE, PewterCity_Movement_AideApproachPlayerBottom\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\treturn\n\nPewterCity_EventScript_AideExit0::\n\tapplymovement LOCALID_AIDE, PewterCity_Movement_AideExit0\n\twaitmovement 0\n\treturn\n\nPewterCity_EventScript_AideExit1::\n\tapplymovement LOCALID_AIDE, PewterCity_Movement_AideExit1\n\twaitmovement 0\n\treturn\n\nPewterCity_EventScript_AideExit2::\n\tapplymovement LOCALID_AIDE, PewterCity_Movement_AideExit2\n\twaitmovement 0\n\treturn\n\nPewterCity_EventScript_AideExit3::\n\tapplymovement LOCALID_AIDE, PewterCity_Movement_AideExit3\n\twaitmovement 0\n\treturn\n\nPewterCity_Movement_AideApproachPlayerMid::\n\tdelay_4\n\twalk_down\n\tstep_end\n\nPewterCity_Movement_AideApproachPlayerBottom::\n\tdelay_4\n\twalk_down\n\twalk_down\n\tstep_end\n\nPewterCity_Movement_AideExit0::\n\twalk_down\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\tstep_end\n\nPewterCity_Movement_AideExit1::\n\twalk_left\n\twalk_down\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\tstep_end\n\nPewterCity_Movement_AideExit2::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\tstep_end\n\nPewterCity_Movement_AideExit3::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\tstep_end\n\n@ Unused\nPewterCity_Movement_WalkInPlaceLeft::\n\twalk_in_place_left\n\tstep_end\n"
  },
  {
    "path": "data/maps/PewterCity/text.inc",
    "content": "Text_DreamEaterTeach::\n    .string \"Yawn!\\n\"\n    .string \"I must have dozed off in the sun.\\p\"\n    .string \"I had this weird dream about\\n\"\n    .string \"a DROWZEE eating my dream.\\p\"\n    .string \"And…\\n\"\n    .string \"I learned how to eat dreams…\\p\"\n    .string \"Oogh, this is too spooky!\\p\"\n    .string \"Let me teach it to a POKéMON so\\n\"\n    .string \"I can forget about it!$\"\n\nText_DreamEaterDeclined::\n    .string \"…Snore…$\"\n\nText_DreamEaterWhichMon::\n    .string \"Which POKéMON wants to learn\\n\"\n    .string \"DREAM EATER?$\"\n\nText_DreamEaterTaught::\n    .string \"…ZZZ…\\n\"\n    .string \"I…can't eat…anymore…$\"\n\nText_DreamEaterReteach::\n    .string \"Even after teaching you DREAM\\n\"\n    .string \"EATER, I still can't forget how to\\l\"\n    .string \"eat dreams!\\p\"\n    .string \"I'll keep teaching your POKéMON\\n\"\n    .string \"DREAM EATER for ¥5000.$\"\n\nText_DreamEaterReteach2::\n    .string \"Do you want me to teach\\n\"\n    .string \"a POKéMON DREAM EATER?$\"\n\nText_DreamEaterNotEnoughMoney::\n    .string \"The only thing spookier than\\n\"\n    .string \"DREAM EATER is not having the\\l\"\n    .string \"¥5000 to learn it!\\p\"\n    .string \"I'll be happy to teach it to a\\n\"\n    .string \"POKéMON when you have enough money.$\"\n\nPewterCity_Text_ClefairyCameFromMoon::\n    .string \"CLEFAIRY came from the moon.\\n\"\n    .string \"That's what the rumor is.\\p\"\n    .string \"They appeared after MOON STONES\\n\"\n    .string \"fell on MT. MOON.$\"\n\nPewterCity_Text_BrockOnlySeriousTrainerHere::\n    .string \"There aren't many serious POKéMON\\n\"\n    .string \"TRAINERS here.\\p\"\n    .string \"They're all like BUG CATCHERS,\\n\"\n    .string \"you know, just hobbyists.\\p\"\n    .string \"But PEWTER GYM's BROCK isn't like\\n\"\n    .string \"that, not one bit.$\"\n\nPewterCity_Text_DidYouCheckOutMuseum::\n    .string \"Did you check out the MUSEUM?$\"\n\nPewterCity_Text_WerentThoseFossilsAmazing::\n    .string \"Weren't those fossils from MT. MOON\\n\"\n    .string \"amazing?$\"\n\nPewterCity_Text_ReallyYouHaveToGo::\n    .string \"Really?\\n\"\n    .string \"You absolutely have to go!$\"\n\nPewterCity_Text_ThisIsTheMuseum::\n    .string \"This is it, the MUSEUM.\\p\"\n    .string \"You have to pay to get in, but it's\\n\"\n    .string \"worth it. See you around!$\"\n\nPewterCity_Text_DoYouKnowWhatImDoing::\n    .string \"Psssst!\\n\"\n    .string \"Do you know what I'm doing?$\"\n\nPewterCity_Text_ThatsRightItsHardWork::\n    .string \"That's right!\\n\"\n    .string \"It's hard work!$\"\n\nPewterCity_Text_SprayingRepelToKeepWildMonsOut::\n    .string \"I'm spraying REPEL to keep wild\\n\"\n    .string \"POKéMON out of my garden!$\"\n\nPewterCity_Text_BrocksLookingForChallengersFollowMe::\n    .string \"You're a TRAINER, right?\\p\"\n    .string \"BROCK's looking for new\\n\"\n    .string \"challengers. Follow me!$\"\n\nPewterCity_Text_GoTakeOnBrock::\n    .string \"If you have the right stuff,\\n\"\n    .string \"go take on BROCK!$\"\n\nPewterCity_Text_TrainerTipsEarningEXP::\n    .string \"TRAINER TIPS\\p\"\n    .string \"All POKéMON that appear in battle,\\n\"\n    .string \"however briefly, earn EXP Points.$\"\n\nPewterCity_Text_CallPoliceIfInfoOnThieves::\n    .string \"NOTICE!\\p\"\n    .string \"Thieves have been stealing POKéMON\\n\"\n    .string \"fossils from MT. MOON.\\p\"\n    .string \"Please call the PEWTER POLICE if\\n\"\n    .string \"you have any information.$\"\n\nPewterCity_Text_MuseumOfScience::\n    .string \"PEWTER MUSEUM OF SCIENCE$\"\n\nPewterCity_Text_GymSign::\n    .string \"PEWTER CITY POKéMON GYM\\n\"\n    .string \"LEADER: BROCK\\l\"\n    .string \"The Rock-Solid POKéMON TRAINER!$\"\n\nPewterCity_Text_CitySign::\n    .string \"PEWTER CITY\\n\"\n    .string \"A Stone Gray City$\"\n\nPewterCity_Text_OhPlayer::\n    .string \"Oh, {PLAYER}{KUN}!$\"\n\nPewterCity_Text_AskedToDeliverThis::\n    .string \"I'm glad I caught up to you.\\n\"\n    .string \"I'm PROF. OAK's AIDE.\\p\"\n    .string \"I've been asked to deliver this,\\n\"\n    .string \"so here you go.$\"\n\nPewterCity_Text_ReceivedRunningShoesFromAide::\n    .string \"{PLAYER} received the\\n\"\n    .string \"letter from the AIDE.$\"\n\nPewterCity_Text_SwitchedShoesWithRunningShoes::\n    .string \"{PLAYER} switched shoes with the\\n\"\n    .string \"RUNNING SHOES.$\"\n\nPewterCity_Text_ExplainRunningShoes::\n    .string \"Press the B Button to run.\\n\"\n    .string \"But only where there's room to run!$\"\n\nPewterCity_Text_MustBeGoingBackToLab::\n    .string \"Well, I must be going back to\\n\"\n    .string \"the LAB.\\p\"\n    .string \"Bye-bye!$\"\n\nPewterCity_Text_RunningShoesLetterFromMom::\n    .string \"{PLAYER} opened the letter…\\p\"\n    .string \"Dear {PLAYER},\\p\"\n    .string \"I see my beloved challenger\\n\"\n    .string \"left home with his RUNNING SHOES.\\p\"\n    .string \"You can press the B Button to run,\\n\"\n    .string \"and the R Button can make it so\\l\"\n    .string \"you can run without holding B!\\p\"\n    .string \"Remember, I'll always cheer for\\n\"\n    .string \"you! Don't ever give up!\\p\"\n    .string \"From Mom$\"\n\nPewterCity_Text_RunningShoesLetterFromMomFemale::\n    .string \"{PLAYER} opened the letter…\\p\"\n    .string \"Dear {PLAYER},\\p\"\n    .string \"I see my beloved challenger\\n\"\n    .string \"left home with her RUNNING SHOES.\\p\"\n    .string \"You can press the B Button to run,\\n\"\n    .string \"and the R Button can make it so\\l\"\n    .string \"you can run without holding B!\\p\"\n    .string \"Remember, I'll always cheer for\\n\"\n    .string \"you! Don't ever give up!\\p\"\n    .string \"From Mom$\"\n"
  },
  {
    "path": "data/maps/PewterCity_Gym/map.json",
    "content": "{\n  \"id\": \"MAP_PEWTER_CITY_GYM\",\n  \"name\": \"PewterCity_Gym\",\n  \"layout\": \"LAYOUT_PEWTER_CITY_GYM\",\n  \"music\": \"MUS_GYM\",\n  \"region_map_section\": \"MAPSEC_PEWTER_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_GYM\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BROCK\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Gym_EventScript_Brock\",\n      \"flag\": \"FLAG_TEMP_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"PewterCity_Gym_EventScript_Liam\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GYM_GUY\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Gym_EventScript_GymGuy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_Gym_EventScript_GymStatue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_Gym_EventScript_GymStatue\"\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/PewterCity_Gym/scripts.inc",
    "content": ".equ CHECK_VISITOR_STATE, 6\n.equ TYPE, VAR_0x8003\n.equ ARGUMENT, VAR_0x8004\n\nPewterCity_Gym_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PewterCity_Gym_OnTransition\n\t.byte 0\n\nPewterCity_Gym_OnTransition::\n\tsetvar TYPE, CHECK_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_BROCK\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 1, PewterCity_Gym_EventScript_HideBrock\n\tend\n\nPewterCity_Gym_EventScript_HideBrock::\n\tsetflag FLAG_TEMP_1\n\treturn\n\nPewterCity_Gym_EventScript_Brock::\n\tfamechecker FAMECHECKER_BROCK, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, PewterCity_Gym_EventScript_Brock_ChallengeMode\n\ttrainerbattle_single TRAINER_LEADER_BROCK, PewterCity_Gym_Text_BrockIntro, PewterCity_Gym_Text_BrockDefeat, PewterCity_Gym_EventScript_DefeatedBrock, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_BROCK_CHALLENGE\n\tgoto_if_unset FLAG_GOT_TM39_FROM_BROCK, PewterCity_Gym_EventScript_GiveTM39\n\tmsgbox PewterCity_Gym_Text_BrockPostBattle\n\trelease\n\tend\n\nPewterCity_Gym_EventScript_Brock_ChallengeMode::\n\ttrainerbattle_single TRAINER_LEADER_BROCK_CHALLENGE, PewterCity_Gym_Text_BrockIntro, PewterCity_Gym_Text_BrockDefeat, PewterCity_Gym_EventScript_DefeatedBrock, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_BROCK\n\tgoto_if_unset FLAG_GOT_TM39_FROM_BROCK, PewterCity_Gym_EventScript_GiveTM39\n\tmsgbox PewterCity_Gym_Text_BrockPostBattle\n\trelease\n\tend\n\nPewterCity_Gym_EventScript_DefeatedBrock::\n\tfamechecker FAMECHECKER_BROCK, 1\n\tsetflag FLAG_DEFEATED_BROCK\n\tsetflag FLAG_BADGE01_GET\n\tsetvar VAR_MAP_SCENE_PEWTER_CITY, 1\n\tsetflag FLAG_HIDE_PEWTER_CITY_GYM_GUIDE\n\tclearflag FLAG_HIDE_PEWTER_CITY_RUNNING_SHOES_GUY\n\tset_gym_trainers 1\n\tsetflag FLAG_HIDE_CHARMANDER_BALL\n\tsetflag FLAG_HIDE_SQUIRTLE_BALL\n\tsetflag FLAG_HIDE_BULBASAUR_BALL\n\tgoto PewterCity_Gym_EventScript_GiveTM39\n\tend\n\nPewterCity_Gym_EventScript_GiveTM39::\n\tmsgbox PewterCity_Gym_Text_TakeThisWithYou\n\tcheckitemspace ITEM_TM39\n\tgoto_if_eq VAR_RESULT, FALSE, PewterCity_Gym_EventScript_NoRoomForTM39\n\tgiveitem_msg PewterCity_Gym_Text_ReceivedTM39FromBrock, ITEM_TM39\n\tsetflag FLAG_GOT_TM39_FROM_BROCK\n\tmsgbox PewterCity_Gym_Text_ExplainTM39\n\trelease\n\tend\n\nPewterCity_Gym_EventScript_NoRoomForTM39::\n\tmsgbox PewterCity_Gym_Text_DontHaveRoomForThis\n\trelease\n\tend\n\nPewterCity_Gym_EventScript_Liam::\n\ttrainerbattle_single TRAINER_CAMPER_LIAM, PewterCity_Gym_Text_LiamIntro, PewterCity_Gym_Text_LiamDefeat\n\tmsgbox PewterCity_Gym_Text_LiamPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPewterCity_Gym_EventScript_GymGuy::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_DEFEATED_BROCK, PewterCity_Gym_EventScript_GymGuyPostVictory\n\tmsgbox PewterCity_Gym_Text_LetMeTakeYouToTheTop, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, PewterCity_Gym_EventScript_GymGuyTakeMeToTop\n\tgoto_if_eq VAR_RESULT, NO, PewterCity_Gym_EventScript_GymGuyDontTakeMeToTop\n\tend\n\nPewterCity_Gym_EventScript_GymGuyPostVictory::\n\tmsgbox PewterCity_Gym_Text_YoureChampMaterial\n\trelease\n\tend\n\nPewterCity_Gym_EventScript_GymGuyTakeMeToTop::\n\tmsgbox PewterCity_Gym_Text_LetsGetHappening\n\tgoto PewterCity_Gym_EventScript_GymGuyAdvice\n\tend\n\nPewterCity_Gym_EventScript_GymGuyDontTakeMeToTop::\n\tmsgbox PewterCity_Gym_Text_ItsFreeLetsGetHappening\n\tgoto PewterCity_Gym_EventScript_GymGuyAdvice\n\tend\n\nPewterCity_Gym_EventScript_GymGuyAdvice::\n\tmsgbox PewterCity_Gym_Text_TryDifferentPartyOrders\n\trelease\n\tend\n\nPewterCity_Gym_EventScript_GymStatue::\n\tlockall\n\tgoto_if_set FLAG_BADGE01_GET, PewterCity_Gym_EventScript_GymStatuePostVictory\n\tmsgbox PewterCity_Gym_Text_GymStatue\n\treleaseall\n\tend\n\nPewterCity_Gym_EventScript_GymStatuePostVictory::\n\tmsgbox PewterCity_Gym_Text_GymStatuePlayerWon\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/PewterCity_Gym/text.inc",
    "content": "PewterCity_Gym_Text_BrockIntro::\n    .string \"So, you're here. I'm BROCK.\\n\"\n    .string \"I'm PEWTER's GYM LEADER.\\p\"\n    .string \"My rock-hard willpower is evident\\n\"\n    .string \"even in my POKéMON.\\p\"\n    .string \"My POKéMON are all rock hard, and\\n\"\n    .string \"have true-grit determination.\\p\"\n    .string \"That's right - my POKéMON are all\\n\"\n    .string \"the ROCK type!\\p\"\n    .string \"Fuhaha! You're going to challenge\\n\"\n    .string \"me knowing that you'll lose?\\p\"\n    .string \"That's the TRAINER's honor that\\n\"\n    .string \"compels you to challenge me.\\p\"\n    .string \"Fine, then!\\n\"\n    .string \"Show me your best!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\n@ NOTE: This defeat text actually causes a buffer overflow. It's too long for the gDisplayedStringBattle\n@ buffer that it's put into, and it stomps all over the gBattleTextBuffs after, as well as the otherwise\n@ unused array after that, sFlickerArray. Perhaps that's the reason why said array exists.\nPewterCity_Gym_Text_BrockDefeat::\n    .string \"I took you for granted, and so\\n\"\n    .string \"I lost.\\p\"\n    .string \"As proof of your victory, I confer\\n\"\n    .string \"on you this…the official POKéMON\\l\"\n    .string \"LEAGUE BOULDERBADGE.\\p\"\n    .string \"{FONT_NORMAL}{PLAYER} received the BOULDERBADGE\\n\"\n    .string \"from BROCK!{PAUSE_MUSIC}{PLAY_BGM}{MUS_OBTAIN_BADGE}{PAUSE 0xFE}{PAUSE 0x56}{RESUME_MUSIC}\\p\"\n    .string \"{FONT_MALE}Just having the BOULDERBADGE makes\\n\"\n    .string \"your POKéMON more powerful.\\p\"\n    .string \"It also enables the use of the\\n\"\n    .string \"move FLASH outside of battle.\\p\"\n    .string \"Of course, a POKéMON must know the\\n\"\n    .string \"move FLASH to use it.$\"\n\nPewterCity_Gym_Text_TakeThisWithYou::\n    .string \"Wait!\\n\"\n    .string \"Take this with you.$\"\n\nPewterCity_Gym_Text_ReceivedTM39FromBrock::\n    .string \"{PLAYER} received TM39\\n\"\n    .string \"from BROCK.$\"\n\nPewterCity_Gym_Text_ExplainTM39::\n    .string \"A TM, Technical Machine, contains a\\n\"\n    .string \"technique for POKéMON.\\p\"\n    .string \"Using a TM teaches the move it\\n\"\n    .string \"contains to a POKéMON.\\p\"\n    .string \"A TM is good forever, it can be\\n\"\n    .string \"used as many times as you want.\\p\"\n    .string \"Anyways…\\n\"\n    .string \"TM39 contains ROCK TOMB.\\p\"\n    .string \"It hurls boulders at the foe and\\n\"\n    .string \"lowers its SPEED.$\"\n\nPewterCity_Gym_Text_BrockPostBattle::\n    .string \"There are all kinds of TRAINERS in\\n\"\n    .string \"this huge world of ours.\\p\"\n    .string \"You appear to be very gifted as a\\n\"\n    .string \"POKéMON TRAINER.\\p\"\n    .string \"So let me make a suggestion.\\p\"\n    .string \"Go to the GYM in CERULEAN and test\\n\"\n    .string \"your abilities.$\"\n\nPewterCity_Gym_Text_DontHaveRoomForThis::\n    .string \"You don't have room for this.$\"\n\nPewterCity_Gym_Text_LiamIntro::\n    .string \"Stop right there, kid!\\p\"\n    .string \"You're ten thousand light-years \\n\"\n    .string \"from facing BROCK!$\"\n\nPewterCity_Gym_Text_LiamDefeat::\n    .string \"Darn!\\p\"\n    .string \"Light-years isn't time…\\n\"\n    .string \"It measures distance!$\"\n\nPewterCity_Gym_Text_LiamPostBattle::\n    .string \"You're pretty hot.\\n\"\n    .string \"…But not as hot as BROCK!$\"\n\nPewterCity_Gym_Text_LetMeTakeYouToTheTop::\n    .string \"Hiya!\\n\"\n    .string \"Do you want to dream big?\\p\"\n    .string \"Do you dare to dream of becoming\\n\"\n    .string \"the POKéMON champ?\\p\"\n    .string \"I'm no TRAINER, but I can advise\\n\"\n    .string \"you on how to win.\\p\"\n    .string \"Let me take you to the top!$\"\n\nPewterCity_Gym_Text_LetsGetHappening::\n    .string \"All right!\\n\"\n    .string \"Let's get happening!$\"\n\nPewterCity_Gym_Text_TryDifferentPartyOrders::\n    .string \"The first POKéMON out in a match is\\n\"\n    .string \"at the left of the POKéMON LIST.\\p\"\n    .string \"By changing the order of POKéMON,\\n\"\n    .string \"you may gain an advantage.\\p\"\n    .string \"Try different orders to suit your\\n\"\n    .string \"opponent's party.$\"\n\nPewterCity_Gym_Text_ItsFreeLetsGetHappening::\n    .string \"It's a free service!\\n\"\n    .string \"Let's get happening!$\"\n\nPewterCity_Gym_Text_YoureChampMaterial::\n    .string \"Just as I thought!\\n\"\n    .string \"You're POKéMON champ material!$\"\n\nPewterCity_Gym_Text_GymStatue::\n    .string \"PEWTER POKéMON GYM\\n\"\n    .string \"LEADER: BROCK\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}$\"\n\nPewterCity_Gym_Text_GymStatuePlayerWon::\n    .string \"PEWTER POKéMON GYM\\n\"\n    .string \"LEADER: BROCK\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}, {PLAYER}$\"\n\n"
  },
  {
    "path": "data/maps/PewterCity_House1/map.json",
    "content": "{\n  \"id\": \"MAP_PEWTER_CITY_HOUSE1\",\n  \"name\": \"PewterCity_House1\",\n  \"layout\": \"LAYOUT_HOUSE2\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_PEWTER_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_House1_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"x\": 5,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_House1_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NIDORAN_M\",\n      \"x\": 6,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_House1_EventScript_Nidoran\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PewterCity_House1/scripts.inc",
    "content": ".set LOCALID_NIDORAN, 3\n\nPewterCity_House1_MapScripts::\n\t.byte 0\n\nPewterCity_House1_EventScript_BaldingMan::\n\tmsgbox PewterCity_House1_Text_TradeMonsAreFinicky, MSGBOX_NPC\n\tend\n\nPewterCity_House1_EventScript_LittleBoy::\n\tlock\n\tmsgbox PewterCity_House1_Text_NidoranSit\n\tcall PewterCity_House1_EventScript_DoNidoranCry\n\trelease\n\tend\n\nPewterCity_House1_EventScript_Nidoran::\n\tlock\n\tfaceplayer\n\tcall PewterCity_House1_EventScript_DoNidoranCry\n\tapplymovement LOCALID_NIDORAN, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nPewterCity_House1_EventScript_DoNidoranCry::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\twaitse\n\tplaymoncry SPECIES_NIDORAN_M, CRY_MODE_NORMAL\n\tmsgbox PewterCity_House1_Text_Nidoran\n\twaitmoncry\n\tcall EventScript_RestorePrevTextColor\n\treturn\n"
  },
  {
    "path": "data/maps/PewterCity_House1/text.inc",
    "content": "PewterCity_House1_Text_Nidoran::\n    .string \"NIDORAN♂: Bowbow!$\"\n\nPewterCity_House1_Text_NidoranSit::\n    .string \"NIDORAN, sit!$\"\n\nPewterCity_House1_Text_TradeMonsAreFinicky::\n    .string \"Our POKéMON's an outsider, so it's\\n\"\n    .string \"finicky and hard to handle.\\p\"\n    .string \"An outsider is a POKéMON that you\\n\"\n    .string \"get in a trade.\\p\"\n    .string \"It grows fast, but it may ignore an\\n\"\n    .string \"unskilled TRAINER in battle.\\p\"\n    .string \"If only we had some BADGES…$\"\n\n"
  },
  {
    "path": "data/maps/PewterCity_House2/map.json",
    "content": "{\n  \"id\": \"MAP_PEWTER_CITY_HOUSE2\",\n  \"name\": \"PewterCity_House2\",\n  \"layout\": \"LAYOUT_HOUSE2\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_PEWTER_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_House2_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_House2_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Kabutops\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PewterCity_House2/scripts.inc",
    "content": ".set LOCALID_KABUTOPS_MASTER, 3\n.set TRAINER, VAR_0x8009\n\nPewterCity_House2_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PewterCity_House2_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nPewterCity_House2_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_KABUTOPS\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PewterCity_House2_MapScript_KabutopsMasterMovementType\n\tend\n\nPewterCity_House2_MapScript_KabutopsMasterMovementType::\n\tsetobjectmovementtype LOCALID_KABUTOPS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPewterCity_House2_EventScript_OldMan::\n\tmsgbox PewterCity_House2_Text_MonsLearnTechniquesAsTheyGrow, MSGBOX_NPC\n\tend\n\nPewterCity_House2_EventScript_LittleBoy::\n\tmsgbox PewterCity_House2_Text_MonsEasierCatchIfStatused, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/PewterCity_House2/text.inc",
    "content": "PewterCity_House2_Text_MonsLearnTechniquesAsTheyGrow::\n    .string \"POKéMON learn new techniques as\\n\"\n    .string \"they grow.\\p\"\n    .string \"But some moves must be taught to\\n\"\n    .string \"them by people.$\"\n\nPewterCity_House2_Text_MonsEasierCatchIfStatused::\n    .string \"A POKéMON becomes easier to \\n\"\n    .string \"catch if it has a status problem.\\p\"\n    .string \"Sleep, poison, burn, or paralysis…\\n\"\n    .string \"Those are all effective.\\p\"\n    .string \"But catching POKéMON is never\\n\"\n    .string \"a sure thing!$\"\n\n"
  },
  {
    "path": "data/maps/PewterCity_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_PEWTER_CITY_MART\",\n  \"name\": \"PewterCity_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_PEWTER_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Mart_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Mart_EventScript_Boy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Mart_EventScript_Clerk\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PewterCity_Mart/scripts.inc",
    "content": "PewterCity_Mart_MapScripts::\n\t.byte 0\n\nPewterCity_Mart_EventScript_Youngster::\n\tmsgbox PewterCity_Mart_Text_BoughtWeirdFishFromShadyGuy, MSGBOX_NPC\n\tend\n\nPewterCity_Mart_EventScript_Boy::\n\tmsgbox PewterCity_Mart_Text_GoodThingsIfRaiseMonsDiligently, MSGBOX_NPC\n\tend\n\nPewterCity_Mart_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart PewterCity_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nPewterCity_Mart_Items::\n\t.2byte ITEM_POKE_BALL\n\t.2byte ITEM_POTION\n\t.2byte ITEM_ANTIDOTE\n\t.2byte ITEM_PARALYZE_HEAL\n\t.2byte ITEM_AWAKENING\n\t.2byte ITEM_BURN_HEAL\n\t.2byte ITEM_ESCAPE_ROPE\n\t.2byte ITEM_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/PewterCity_Mart/text.inc",
    "content": "PewterCity_Mart_Text_BoughtWeirdFishFromShadyGuy::\n    .string \"A shady old guy sucked me into\\n\"\n    .string \"buying this weird fish POKéMON!\\p\"\n    .string \"It's totally weak and it cost ¥500!$\"\n\nPewterCity_Mart_Text_GoodThingsIfRaiseMonsDiligently::\n    .string \"Good things can happen if you raise\\n\"\n    .string \"POKéMON diligently.\\p\"\n    .string \"Even the weak ones can surprise\\n\"\n    .string \"you if you don't give up on them.$\"\n\n"
  },
  {
    "path": "data/maps/PewterCity_Museum_1F/map.json",
    "content": "{\n  \"id\": \"MAP_PEWTER_CITY_MUSEUM_1F\",\n  \"name\": \"PewterCity_Museum_1F\",\n  \"layout\": \"LAYOUT_PEWTER_CITY_MUSEUM_1F\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_PEWTER_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_Scientist1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_OldAmberScientist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_AMBER\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_OldAmber\",\n      \"flag\": \"FLAG_HIDE_OLD_AMBER\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_Scientist2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_SeismicTossTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Aerodactyl\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 13,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 21,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY_MUSEUM_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PEWTER_CITY_MUSEUM_1F\",\n      \"var_value\": \"0\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_EntranceTriggerLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PEWTER_CITY_MUSEUM_1F\",\n      \"var_value\": \"0\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_EntranceTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 14,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_PEWTER_CITY_MUSEUM_1F\",\n      \"var_value\": \"0\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_EntranceTriggerRight\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_AerodactylFossil\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_KabutopsFossil\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 27,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_PokemonJournalBrock\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 26,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"PewterCity_Museum_1F_EventScript_PokemonJournalBrock\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PewterCity_Museum_1F/scripts.inc",
    "content": ".set LOCALID_SCIENTIST1, 1\n.set LOCALID_OLD_AMBER,  4\n.set LOCALID_AERODACTYL_MASTER, 7\n.set TRAINER, VAR_0x8009\n\nPewterCity_Museum_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PewterCity_Museum_1F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nPewterCity_Museum_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_AERODACTYL\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PewterCity_Museum_1F_MapScript_AerodactylMasterMovementType\n\tend\n\nPewterCity_Museum_1F_MapScript_AerodactylMasterMovementType::\n\tsetobjectmovementtype LOCALID_AERODACTYL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPewterCity_Museum_1F_EventScript_Scientist1::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_FACING, DIR_WEST, PewterCity_Museum_1F_EventScript_Scientist1BehindCounter\n\tgoto_if_eq VAR_FACING, DIR_SOUTH, PewterCity_Museum_1F_EventScript_Scientist1BehindCounter\n\tgoto_if_eq VAR_FACING, DIR_NORTH, PewterCity_Museum_1F_EventScript_Scientist1BehindCounter\n\tmsgbox PewterCity_Museum_1F_Text_PleaseEnjoyYourself\n\trelease\n\tend\n\nPewterCity_Museum_1F_EventScript_Scientist1BehindCounter::\n\tmsgbox PewterCity_Museum_1F_Text_DoYouKnowWhatAmberIs, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, PewterCity_Museum_1F_EventScript_AmberHasGeneticMatter\n\tgoto_if_eq VAR_RESULT, NO, PewterCity_Museum_1F_EventScript_ExplainAmber\n\tend\n\nPewterCity_Museum_1F_EventScript_AmberHasGeneticMatter::\n\tmsgbox PewterCity_Museum_1F_Text_AmberContainsGeneticMatter\n\tapplymovement LOCALID_SCIENTIST1, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nPewterCity_Museum_1F_EventScript_ExplainAmber::\n\tmsgbox PewterCity_Museum_1F_Text_AmberIsFossilizedSap\n\tapplymovement LOCALID_SCIENTIST1, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nPewterCity_Museum_1F_EventScript_EntranceTriggerLeft::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tgoto PewterCity_Museum_1F_EventScript_EntranceTrigger\n\tend\n\nPewterCity_Museum_1F_EventScript_EntranceTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tgoto PewterCity_Museum_1F_EventScript_EntranceTrigger\n\tend\n\nPewterCity_Museum_1F_EventScript_EntranceTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tgoto PewterCity_Museum_1F_EventScript_EntranceTrigger\n\tend\n\nPewterCity_Museum_1F_EventScript_EntranceTrigger::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tshowmoneybox 0, 0\n\tmsgbox PewterCity_Museum_1F_Text_Its50YForChildsTicket, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, PewterCity_Museum_1F_EventScript_TryPayForTicket\n\tmsgbox PewterCity_Museum_1F_Text_ComeAgain\n\tclosemessage\n\thidemoneybox\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Museum_1F_Movement_ForcePlayerExit\n\twaitmovement 0\n\treleaseall\n\tend\n\nPewterCity_Museum_1F_EventScript_TryPayForTicket::\n\tcheckmoney 50\n\tgoto_if_eq VAR_RESULT, FALSE, PewterCity_Museum_1F_EventScript_NotEnoughMoney\n\tclosemessage\n\tcall_if_eq VAR_TEMP_1, 0, PewterCity_Museum_1F_EventScript_PlayerApproachCounterLeft\n\tcall_if_eq VAR_TEMP_1, 1, PewterCity_Museum_1F_EventScript_PlayerApproachCounterMid\n\tcall_if_eq VAR_TEMP_1, 2, PewterCity_Museum_1F_EventScript_PlayerApproachCounterRight\n\tplayse SE_SHOP\n\tremovemoney 50\n\tupdatemoneybox\n\twaitse\n\tmsgbox PewterCity_Museum_1F_Text_Right50YThankYou\n\tsetvar VAR_MAP_SCENE_PEWTER_CITY_MUSEUM_1F, 1\n\thidemoneybox\n\treleaseall\n\tend\n\nPewterCity_Museum_1F_EventScript_PlayerApproachCounterLeft::\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Museum_1F_Movement_ApproachCounterLeft\n\twaitmovement 0\n\treturn\n\nPewterCity_Museum_1F_EventScript_PlayerApproachCounterMid::\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Museum_1F_Movement_ApproachCounterMid\n\twaitmovement 0\n\treturn\n\nPewterCity_Museum_1F_EventScript_PlayerApproachCounterRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Museum_1F_Movement_ApproachCounterRight\n\twaitmovement 0\n\treturn\n\nPewterCity_Museum_1F_EventScript_NotEnoughMoney::\n\tmsgbox PewterCity_Museum_1F_Text_DontHaveEnoughMoney\n\tclosemessage\n\thidemoneybox\n\tapplymovement OBJ_EVENT_ID_PLAYER, PewterCity_Museum_1F_Movement_ForcePlayerExit\n\twaitmovement 0\n\treleaseall\n\tend\n\nPewterCity_Museum_1F_Movement_ForcePlayerExit::\n\twalk_down\n\tstep_end\n\nPewterCity_Museum_1F_Movement_ApproachCounterLeft::\n\twalk_right\n\twalk_right\n\tdelay_8\n\twalk_in_place_right\n\tstep_end\n\nPewterCity_Museum_1F_Movement_ApproachCounterMid::\n\twalk_right\n\tdelay_8\n\twalk_in_place_right\n\tstep_end\n\nPewterCity_Museum_1F_Movement_ApproachCounterRight::\n\tdelay_8\n\twalk_in_place_right\n\tstep_end\n\nPewterCity_Museum_1F_EventScript_Scientist2::\n\tmsgbox PewterCity_Museum_1F_Text_WeHaveTwoFossilsOnExhibit, MSGBOX_NPC\n\tend\n\nPewterCity_Museum_1F_EventScript_OldMan::\n\tmsgbox PewterCity_Museum_1F_Text_ShouldBeGratefulForLongLife, MSGBOX_NPC\n\tend\n\nPewterCity_Museum_1F_EventScript_OldAmberScientist::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_OLD_AMBER, PewterCity_Museum_1F_EventScript_AlreadyGotOldAmber\n\tmsgbox PewterCity_Museum_1F_Text_WantYouToGetAmberExamined\n\tcheckitemspace ITEM_OLD_AMBER\n\tgoto_if_eq VAR_RESULT, FALSE, PewterCity_Museum_1F_EventScript_NoRoomForOldAmber\n\tsetflag FLAG_GOT_OLD_AMBER\n\tremoveobject LOCALID_OLD_AMBER\n\tgiveitem_msg PewterCity_Museum_1F_Text_ReceivedOldAmberFromMan, ITEM_OLD_AMBER, 1, MUS_OBTAIN_KEY_ITEM\n\trelease\n\tend\n\nPewterCity_Museum_1F_EventScript_NoRoomForOldAmber::\n\tmsgbox PewterCity_Museum_1F_Text_DontHaveSpaceForThis\n\trelease\n\tend\n\nPewterCity_Museum_1F_EventScript_AlreadyGotOldAmber::\n\tmsgbox PewterCity_Museum_1F_Text_GetOldAmberChecked\n\trelease\n\tend\n\nPewterCity_Museum_1F_EventScript_OldAmber::\n\tmsgbox PewterCity_Museum_1F_Text_BeautifulPieceOfAmber, MSGBOX_NPC\n\tend\n\nPewterCity_Museum_1F_EventScript_AerodactylFossil::\n\tlockall\n\tsetvar VAR_0x8004, SPECIES_AERODACTYL\n\tsetvar VAR_0x8005, 10\n\tsetvar VAR_0x8006, 3\n\tspecial OpenMuseumFossilPic\n\tmsgbox PewterCity_Museum_1F_Text_AerodactylFossil\n\tspecial CloseMuseumFossilPic\n\treleaseall\n\tend\n\nPewterCity_Museum_1F_EventScript_KabutopsFossil::\n\tlockall\n\tsetvar VAR_0x8004, SPECIES_KABUTOPS\n\tsetvar VAR_0x8005, 10\n\tsetvar VAR_0x8006, 3\n\tspecial OpenMuseumFossilPic\n\tmsgbox PewterCity_Museum_1F_Text_KabutopsFossil\n\tspecial CloseMuseumFossilPic\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/PewterCity_Museum_1F/text.inc",
    "content": "PewterCity_Museum_1F_Text_Its50YForChildsTicket::\n    .string \"Yes, yes.\\n\"\n    .string \"It's ¥50 for a child's ticket.\\p\"\n    .string \"Would you like to come in?$\"\n\nPewterCity_Museum_1F_Text_ComeAgain::\n    .string \"Come again!$\"\n\nPewterCity_Museum_1F_Text_Right50YThankYou::\n    .string \"Right, ¥50!\\n\"\n    .string \"Thank you!$\"\n\nPewterCity_Museum_1F_Text_DontHaveEnoughMoney::\n    .string \"You don't have enough money.$\"\n\nPewterCity_Museum_1F_Text_PleaseEnjoyYourself::\n    .string \"Please enjoy yourself.$\"\n\nPewterCity_Museum_1F_Text_DoYouKnowWhatAmberIs::\n    .string \"You can't sneak in the back way!\\n\"\n    .string \"Nice try, kid, but no.\\p\"\n    .string \"Oh, whatever!\\n\"\n    .string \"Do you know what AMBER is?$\"\n\nPewterCity_Museum_1F_Text_AmberContainsGeneticMatter::\n    .string \"AMBER contains the genetic matter\\n\"\n    .string \"of ancient POKéMON.\\p\"\n    .string \"There's a LAB somewhere trying to\\n\"\n    .string \"resurrect POKéMON from AMBER.$\"\n\nPewterCity_Museum_1F_Text_AmberIsFossilizedSap::\n    .string \"AMBER is actually sap, that gooey\\n\"\n    .string \"stuff that oozes from trees.\\p\"\n    .string \"The ancient sap fossilized over\\n\"\n    .string \"time to become rock-hard AMBER.$\"\n\nPewterCity_Museum_1F_Text_ShouldBeGratefulForLongLife::\n    .string \"I should be grateful for my long\\n\"\n    .string \"life.\\p\"\n    .string \"Never did I think I would get to\\n\"\n    .string \"see the bones of a dragon!$\"\n\nPewterCity_Museum_1F_Text_WantYouToGetAmberExamined::\n    .string \"Ssh! Listen, I need to share a\\n\"\n    .string \"secret with someone.\\p\"\n    .string \"I think that this chunk of AMBER\\n\"\n    .string \"contains POKéMON DNA!\\p\"\n    .string \"It would be a shattering scientific\\n\"\n    .string \"breakthrough if POKéMON could be\\l\"\n    .string \"resurrected from it.\\p\"\n    .string \"But, my colleagues just ignore\\n\"\n    .string \"what I have to say.\\p\"\n    .string \"So, I have a favor to ask!\\p\"\n    .string \"I want you to get this examined at\\n\"\n    .string \"a POKéMON LAB somewhere.$\"\n\nPewterCity_Museum_1F_Text_ReceivedOldAmberFromMan::\n    .string \"{PLAYER} received the OLD AMBER\\n\"\n    .string \"from the man.$\"\n\nPewterCity_Museum_1F_Text_GetOldAmberChecked::\n    .string \"Ssh!\\n\"\n    .string \"Get the OLD AMBER checked!$\"\n\nPewterCity_Museum_1F_Text_DontHaveSpaceForThis::\n    .string \"You don't have space for this.$\"\n\nPewterCity_Museum_1F_Text_WeHaveTwoFossilsOnExhibit::\n    .string \"We have two fossils of rare,\\n\"\n    .string \"prehistoric POKéMON on exhibit.$\"\n\nPewterCity_Museum_1F_Text_BeautifulPieceOfAmber::\n    .string \"There is a beautiful piece of\\n\"\n    .string \"AMBER in a clear gold color.$\"\n\nPewterCity_Museum_1F_Text_AerodactylFossil::\n    .string \"AERODACTYL Fossil\\n\"\n    .string \"A primitive and rare POKéMON.$\"\n\nPewterCity_Museum_1F_Text_KabutopsFossil::\n    .string \"KABUTOPS Fossil\\n\"\n    .string \"A primitive and rare POKéMON.$\"\n\n"
  },
  {
    "path": "data/maps/PewterCity_Museum_2F/map.json",
    "content": "{\n  \"id\": \"MAP_PEWTER_CITY_MUSEUM_2F\",\n  \"name\": \"PewterCity_Museum_2F\",\n  \"layout\": \"LAYOUT_PEWTER_CITY_MUSEUM_2F\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_PEWTER_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_Scientist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_Man\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_LittleGirl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Golem\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY_MUSEUM_1F\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_MoonStone\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_SpaceShuttle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_SpaceShuttle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_SpaceShuttle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_SpaceShuttle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_SpaceShuttle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_SpaceShuttle\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PewterCity_Museum_2F_EventScript_MoonStone\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PewterCity_Museum_2F/scripts.inc",
    "content": ".set LOCALID_GOLEM_MASTER, 6\n.set TRAINER, VAR_0x8009\n\nPewterCity_Museum_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PewterCity_Museum_2F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nPewterCity_Museum_2F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_GOLEM\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PewterCity_Museum_2F_MapScript_GolemMasterMovementType\n\tend\n\nPewterCity_Museum_2F_MapScript_GolemMasterMovementType::\n\tsetobjectmovementtype LOCALID_GOLEM_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPewterCity_Museum_2F_EventScript_Man::\n\tmsgbox PewterCity_Museum_1F_Text_WhatsSpecialAboutMoonStone, MSGBOX_NPC\n\tend\n\nPewterCity_Museum_2F_EventScript_OldMan::\n\tmsgbox PewterCity_Museum_1F_Text_BoughtColorTVForMoonLanding, MSGBOX_NPC\n\tend\n\nPewterCity_Museum_2F_EventScript_Scientist::\n\tmsgbox PewterCity_Museum_1F_Text_RunningSpaceExhibitThisMonth, MSGBOX_NPC\n\tend\n\nPewterCity_Museum_2F_EventScript_LittleGirl::\n\tmsgbox PewterCity_Museum_1F_Text_AskedDaddyToCatchPikachu, MSGBOX_NPC\n\tend\n\nPewterCity_Museum_2F_EventScript_BaldingMan::\n\tmsgbox PewterCity_Museum_1F_Text_PikachuSoonIPromise, MSGBOX_NPC\n\tend\n\nPewterCity_Museum_2F_EventScript_SpaceShuttle::\n\tmsgbox PewterCity_Museum_1F_Text_SpaceShuttle, MSGBOX_SIGN\n\tend\n\nPewterCity_Museum_2F_EventScript_MoonStone::\n\tcallnative SetFirstDeoxysForm\n\tmsgbox PewterCity_Museum_1F_Text_MeteoriteThatFellOnMtMoon, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/PewterCity_Museum_2F/text.inc",
    "content": "Text_SeismicTossTeach::\n    .string \"The secrets of space…\\n\"\n    .string \"The mysteries of earth…\\p\"\n    .string \"There are so many things about\\n\"\n    .string \"which we know so little.\\p\"\n    .string \"But that should spur us to study\\n\"\n    .string \"harder, not toss in the towel.\\p\"\n    .string \"The only thing you should toss…\\p\"\n    .string \"Well, how about SEISMIC TOSS?\\n\"\n    .string \"Should I teach that to a POKéMON?$\"\n\nText_SeismicTossDeclined::\n    .string \"Is that so?\\n\"\n    .string \"I'm sure you'll be back for it.$\"\n\nText_SeismicTossWhichMon::\n    .string \"Which POKéMON wants to learn\\n\"\n    .string \"SEISMIC TOSS?$\"\n\nText_SeismicTossTaught::\n    .string \"I hope you won't toss in the towel.\\n\"\n    .string \"Keep it up.$\"\n\nText_SeismicTossReteach::\n    .string \"I see you still haven't tossed in\\n\"\n    .string \"the towel when it comes to raising\\l\"\n    .string \"your POKéMON.\\p\"\n    .string \"The only thing you should toss is\\n\"\n    .string \"another POKéMON with SEISMIC TOSS!\\p\"\n    .string \"I can teach it to your POKéMON\\n\"\n    .string \"again for ¥5000.$\"\n\nText_SeismicTossReteach2::\n    .string \"Well, how about it?\\n\"\n    .string \"Should I teach SEISMIC TOSS to\\l\"\n    .string \"your POKéMON?$\"\n\nText_SeismicTossNotEnoughMoney::\n    .string \"I'm afraid I have to toss in\\n\"\n    .string \"the towel on teaching your POKéMON\\l\"\n    .string \"if you don't have ¥5000…$\"\n\nPewterCity_Museum_1F_Text_WhatsSpecialAboutMoonStone::\n    .string \"MOON STONE, huh?\\p\"\n    .string \"What's so special about it?\\n\"\n    .string \"Looks like an ordinary rock to me.$\"\n\nPewterCity_Museum_1F_Text_BoughtColorTVForMoonLanding::\n    .string \"July 20, 1969!\\p\"\n    .string \"Humankind first set foot on the\\n\"\n    .string \"moon that day.\\p\"\n    .string \"I bought a color TV just so I\\n\"\n    .string \"could watch that news.$\"\n\nPewterCity_Museum_1F_Text_RunningSpaceExhibitThisMonth::\n    .string \"This month, we're running a space\\n\"\n    .string \"exhibit.$\"\n\nPewterCity_Museum_1F_Text_AskedDaddyToCatchPikachu::\n    .string \"I want a PIKACHU!\\n\"\n    .string \"It's so cute!\\p\"\n    .string \"I asked my daddy to catch me one!$\"\n\nPewterCity_Museum_1F_Text_PikachuSoonIPromise::\n    .string \"Yeah, a PIKACHU soon, I promise!$\"\n\nPewterCity_Museum_1F_Text_SpaceShuttle::\n    .string \"Space Shuttle$\"\n\nPewterCity_Museum_1F_Text_MeteoriteThatFellOnMtMoon::\n    .string \"A meteorite that fell on MT. MOON.\\n\"\n    .string \"It is thought to be a MOON STONE.$\"\n\n"
  },
  {
    "path": "data/maps/PewterCity_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_PEWTER_CITY_POKEMON_CENTER_1F\",\n  \"name\": \"PewterCity_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_PEWTER_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_JIGGLYPUFF\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_PokemonCenter_1F_EventScript_Jigglypuff\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_PokemonCenter_1F_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_PokemonCenter_1F_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MysteryEventClub_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GBA_KID\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_PokemonCenter_1F_EventScript_GBAKid1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GBA_KID\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PewterCity_PokemonCenter_1F_EventScript_GBAKid2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Jigglypuff\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_PEWTER_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_PEWTER_CITY_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PewterCity_PokemonCenter_1F/scripts.inc",
    "content": ".set LOCALID_JIGGLYPUFF_MASTER, 10\n.set TRAINER, VAR_0x8009\n\nPewterCity_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PewterCity_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nPewterCity_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_PEWTER_CITY\n\tgoto PewterCity_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nPewterCity_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_JIGGLYPUFF\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PewterCity_PokemonCenter_1F_MapScript_JigglypuffMasterMovementType\n\tend\n\nPewterCity_PokemonCenter_1F_MapScript_JigglypuffMasterMovementType::\n\tsetobjectmovementtype LOCALID_JIGGLYPUFF_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPewterCity_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nPewterCity_PokemonCenter_1F_EventScript_Gentleman::\n\tmsgbox PewterCity_PokemonCenter_1F_Text_TeamRocketMtMoonImOnPhone, MSGBOX_NPC\n\tend\n\nPewterCity_PokemonCenter_1F_EventScript_Jigglypuff::\n\tlock\n\tfaceplayer\n\tfadeoutbgm 0\n\tplaybgm MUS_JIGGLYPUFF, 0\n\tmessage PewterCity_PokemonCenter_1F_Text_Jigglypuff\n\twaitmessage\n\tdelay 455\n\tplaybgm MUS_POKE_CENTER, 1\n\trelease\n\tend\n\nPewterCity_PokemonCenter_1F_EventScript_Youngster::\n\tmsgbox PewterCity_PokemonCenter_1F_Text_WhenJiggylypuffSingsMonsGetDrowsy, MSGBOX_NPC\n\tend\n\nPewterCity_PokemonCenter_1F_EventScript_GBAKid1::\n\tlock\n\tmsgbox PewterCity_PokemonCenter_1F_Text_TradingMyClefairyForPikachu\n\trelease\n\tend\n\nPewterCity_PokemonCenter_1F_EventScript_GBAKid2::\n\tmsgbox PewterCity_PokemonCenter_1F_Text_TradingPikachuWithKid, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/PewterCity_PokemonCenter_1F/text.inc",
    "content": "PewterCity_PokemonCenter_1F_Text_TeamRocketMtMoonImOnPhone::\n    .string \"What!?\\p\"\n    .string \"TEAM ROCKET is at MT. MOON?\\n\"\n    .string \"Huh?\\p\"\n    .string \"I'm on the phone!\\n\"\n    .string \"Scram!$\"\n\nPewterCity_PokemonCenter_1F_Text_Jigglypuff::\n    .string \"JIGGLYPUFF: Puu pupuu!$\"\n\nPewterCity_PokemonCenter_1F_Text_WhenJiggylypuffSingsMonsGetDrowsy::\n    .string \"Yawn!\\p\"\n    .string \"When JIGGLYPUFF sings, POKéMON get\\n\"\n    .string \"drowsy…\\p\"\n    .string \"…Me, too…\\n\"\n    .string \"Snore…$\"\n\nPewterCity_PokemonCenter_1F_Text_TradingMyClefairyForPikachu::\n    .string \"I really want a PIKACHU, so I'm\\n\"\n    .string \"trading my CLEFAIRY for one.$\"\n\nPewterCity_PokemonCenter_1F_Text_TradingPikachuWithKid::\n    .string \"I'm trading POKéMON with that kid\\n\"\n    .string \"there.\\p\"\n    .string \"I had two PIKACHU, so I figured\\n\"\n    .string \"I might as well trade one.$\"\n\n"
  },
  {
    "path": "data/maps/PewterCity_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_PEWTER_CITY_POKEMON_CENTER_2F\",\n  \"name\": \"PewterCity_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_PEWTER_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_PEWTER_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PewterCity_PokemonCenter_2F/scripts.inc",
    "content": "PewterCity_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nPewterCity_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nPewterCity_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nPewterCity_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/PokemonLeague_AgathasRoom/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_LEAGUE_AGATHAS_ROOM\",\n  \"name\": \"PokemonLeague_AgathasRoom\",\n  \"layout\": \"LAYOUT_POKEMON_LEAGUE_AGATHAS_ROOM\",\n  \"music\": \"MUS_POKE_TOWER\",\n  \"region_map_section\": \"MAPSEC_POKEMON_LEAGUE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_AGATHA\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_AGATHA\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonLeague_AgathasRoom_EventScript_Agatha\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_POKEMON_LEAGUE_BRUNOS_ROOM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_POKEMON_LEAGUE_LANCES_ROOM\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/PokemonLeague_AgathasRoom/scripts.inc",
    "content": "PokemonLeague_AgathasRoom_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, PokemonLeague_AgathasRoom_OnResume\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonLeague_AgathasRoom_OnLoad\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PokemonLeague_AgathasRoom_OnWarp\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, PokemonLeague_AgathasRoom_OnFrame\n\t.byte 0\n\nPokemonLeague_AgathasRoom_OnResume::\n\tsetvar VAR_0x8004, 2\n\tcall PokemonLeague_EventScript_DoLightingEffect\n\tend\n\nPokemonLeague_AgathasRoom_OnLoad::\n\tcall_if_set FLAG_DEFEATED_AGATHA, PokemonLeague_AgathasRoom_EventScript_SetDoorOpen\n\tcall_if_eq VAR_MAP_SCENE_POKEMON_LEAGUE, 3, PokemonLeague_AgathasRoom_EventScript_CloseEntry\n\tend\n\nPokemonLeague_AgathasRoom_EventScript_CloseEntry::\n\tcall PokemonLeague_EventScript_CloseEntry\n\treturn\n\nPokemonLeague_AgathasRoom_EventScript_SetDoorOpen::\n\tcall PokemonLeague_EventScript_SetDoorOpen\n\treturn\n\nPokemonLeague_AgathasRoom_OnWarp::\n\tmap_script_2 VAR_TEMP_1, 0, PokemonLeague_AgathasRoom_EventScript_TurnPlayerNorth\n\t.2byte 0\n\nPokemonLeague_AgathasRoom_EventScript_TurnPlayerNorth::\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH\n\tend\n\nPokemonLeague_AgathasRoom_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_POKEMON_LEAGUE, 2, PokemonLeague_AgathasRoom_EventScript_EnterRoom\n\t.2byte 0\n\nPokemonLeague_AgathasRoom_EventScript_EnterRoom::\n\tlockall\n\tcall PokemonLeague_EventScript_EnterRoom\n\tsetvar VAR_MAP_SCENE_POKEMON_LEAGUE, 3\n\treleaseall\n\tend\n\nPokemonLeague_AgathasRoom_EventScript_Agatha::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_AGATHA, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tgoto_if_set FLAG_DEFEATED_AGATHA, PokemonLeague_AgathasRoom_EventScript_PostBattle\n\tfamechecker FAMECHECKER_AGATHA, 0\n\tfamechecker FAMECHECKER_AGATHA, 4\n\tfamechecker FAMECHECKER_OAK, 4\n\tcall_if_unset FLAG_SYS_GAME_CLEAR, PokemonLeague_AgathasRoom_EventScript_Intro\n\tcall_if_set FLAG_SYS_GAME_CLEAR, PokemonLeague_AgathasRoom_EventScript_RematchIntro\n\tsetflag FLAG_TEMP_3\n\tsetflag FLAG_TEMP_5\n\tcall_if_unset FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_AgathasRoom_EventScript_GetDifficulty\n\tcall_if_set FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_AgathasRoom_EventScript_GetDifficulty2\n\tclearflag FLAG_TEMP_5\n\tgoto PokemonLeague_AgathasRoom_EventScript_DefeatedAgatha\n\tend\n\nPokemonLeague_AgathasRoom_EventScript_Intro::\n\tmsgbox PokemonLeague_AgathasRoom_Text_Intro\n\treturn\n\nPokemonLeague_AgathasRoom_EventScript_RematchIntro::\n\tmsgbox PokemonLeague_AgathasRoom_Text_RematchIntro\n\treturn\n\nPokemonLeague_AgathasRoom_EventScript_GetDifficulty::\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, TRUE, PokemonLeague_AgathasRoom_EventScript_Battle_ChallengeMode\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, FALSE, PokemonLeague_AgathasRoom_EventScript_Battle\n\treturn\n\nPokemonLeague_AgathasRoom_EventScript_GetDifficulty2::\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, TRUE, PokemonLeague_AgathasRoom_EventScript_Battle_ChallengeModeRematch\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, FALSE, PokemonLeague_AgathasRoom_EventScript_Rematch\n\treturn\n\nPokemonLeague_AgathasRoom_EventScript_Battle_ChallengeMode::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_AGATHA_CHALLENGE, PokemonLeague_AgathasRoom_Text_Defeat\n\treturn\n\nPokemonLeague_AgathasRoom_EventScript_Battle::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_AGATHA, PokemonLeague_AgathasRoom_Text_Defeat\n\treturn\n\nPokemonLeague_AgathasRoom_EventScript_Battle_ChallengeModeRematch::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_AGATHA_CHALLENGE_2, PokemonLeague_AgathasRoom_Text_Defeat\n\treturn\n\nPokemonLeague_AgathasRoom_EventScript_Rematch::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_AGATHA_2, PokemonLeague_AgathasRoom_Text_Defeat\n\treturn\n\nPokemonLeague_AgathasRoom_EventScript_PostBattle::\n\tmsgbox PokemonLeague_AgathasRoom_Text_PostBattle\n\trelease\n\tend\n\nPokemonLeague_AgathasRoom_EventScript_DefeatedAgatha::\n\tsetflag FLAG_DEFEATED_AGATHA\n\tcall PokemonLeague_EventScript_OpenDoor\n\tmsgbox PokemonLeague_AgathasRoom_Text_PostBattle\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/PokemonLeague_AgathasRoom/text.inc",
    "content": "PokemonLeague_AgathasRoom_Text_Intro::\n    .string \"I am AGATHA of the ELITE FOUR.\\p\"\n    .string \"I hear OAK's taken a lot of\\n\"\n    .string \"interest in you, child.\\p\"\n    .string \"That old duff was once tough and\\n\"\n    .string \"handsome.\\p\"\n    .string \"But that was decades ago.\\n\"\n    .string \"He's a shadow of his former self.\\p\"\n    .string \"Now he just wants to fiddle with\\n\"\n    .string \"his POKéDEX.\\p\"\n    .string \"He's wrong.\\n\"\n    .string \"POKéMON are for battling!\\p\"\n    .string \"{PLAYER}! I'll show you how a real\\n\"\n    .string \"TRAINER battles!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nPokemonLeague_AgathasRoom_Text_RematchIntro::\n    .string \"I am AGATHA of the ELITE FOUR.\\p\"\n    .string \"You're the child that OAK's taken\\n\"\n    .string \"under his wing, aren't you?\\p\"\n    .string \"That old duff was once tough and\\n\"\n    .string \"handsome.\\p\"\n    .string \"But that was decades ago.\\n\"\n    .string \"He's a shadow of his former self.\\p\"\n    .string \"Now he just wants to fiddle with\\n\"\n    .string \"his POKéDEX.\\p\"\n    .string \"He's wrong.\\n\"\n    .string \"POKéMON are for battling!\\p\"\n    .string \"{PLAYER}! I'll show you how a real\\n\"\n    .string \"TRAINER battles!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nPokemonLeague_AgathasRoom_Text_Defeat::\n    .string \"Oh, my!\\n\"\n    .string \"You're something special, child!$\"\n\nPokemonLeague_AgathasRoom_Text_PostBattle::\n    .string \"You win!\\p\"\n    .string \"I see what the old duff sees in\\n\"\n    .string \"you now.\\p\"\n    .string \"I have nothing else to say.\\n\"\n    .string \"Run along now, child!$\"\n\n"
  },
  {
    "path": "data/maps/PokemonLeague_BrunosRoom/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_LEAGUE_BRUNOS_ROOM\",\n  \"name\": \"PokemonLeague_BrunosRoom\",\n  \"layout\": \"LAYOUT_POKEMON_LEAGUE_BRUNOS_ROOM\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_POKEMON_LEAGUE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_BRUNO\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BRUNO\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonLeague_BrunosRoom_EventScript_Bruno\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_POKEMON_LEAGUE_LORELEIS_ROOM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_POKEMON_LEAGUE_AGATHAS_ROOM\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/PokemonLeague_BrunosRoom/scripts.inc",
    "content": ".set LOCALID_BRUNO, 1\n\nPokemonLeague_BrunosRoom_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, PokemonLeague_BrunosRoom_OnResume\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonLeague_BrunosRoom_OnLoad\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PokemonLeague_BrunosRoom_OnWarp\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, PokemonLeague_BrunosRoom_OnFrame\n\t.byte 0\n\nPokemonLeague_BrunosRoom_OnResume::\n\tsetvar VAR_0x8004, 1\n\tcall PokemonLeague_EventScript_DoLightingEffect\n\tend\n\nPokemonLeague_BrunosRoom_OnLoad::\n\tcall_if_set FLAG_DEFEATED_BRUNO, PokemonLeague_BrunosRoom_EventScript_SetDoorOpen\n\tcall_if_eq VAR_MAP_SCENE_POKEMON_LEAGUE, 2, PokemonLeague_BrunosRoom_EventScript_CloseEntry\n\tend\n\nPokemonLeague_BrunosRoom_EventScript_CloseEntry::\n\tcall PokemonLeague_EventScript_CloseEntry\n\treturn\n\nPokemonLeague_BrunosRoom_EventScript_SetDoorOpen::\n\tcall PokemonLeague_EventScript_SetDoorOpen\n\treturn\n\nPokemonLeague_BrunosRoom_OnWarp::\n\tmap_script_2 VAR_TEMP_1, 0, PokemonLeague_BrunosRoom_EventScript_TurnPlayerNorth\n\t.2byte 0\n\nPokemonLeague_BrunosRoom_EventScript_TurnPlayerNorth::\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH\n\tend\n\nPokemonLeague_BrunosRoom_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_POKEMON_LEAGUE, 1, PokemonLeague_BrunosRoom_EventScript_EnterRoom\n\t.2byte 0\n\nPokemonLeague_BrunosRoom_EventScript_EnterRoom::\n\tlockall\n\tcall PokemonLeague_EventScript_EnterRoom\n\tsetvar VAR_MAP_SCENE_POKEMON_LEAGUE, 2\n\treleaseall\n\tend\n\nPokemonLeague_BrunosRoom_EventScript_Bruno::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_BRUNO, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tgoto_if_set FLAG_DEFEATED_BRUNO, PokemonLeague_BrunosRoom_EventScript_PostBattle\n\tfamechecker FAMECHECKER_BRUNO, 0\n\tfamechecker FAMECHECKER_BRUNO, 1\n\tcall_if_unset FLAG_SYS_GAME_CLEAR, PokemonLeague_BrunosRoom_EventScript_Intro\n\tcall_if_set FLAG_SYS_GAME_CLEAR, PokemonLeague_BrunosRoom_EventScript_RematchIntro\n\tsetflag FLAG_TEMP_3\n\tsetflag FLAG_TEMP_5\n\tcall_if_unset FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_BrunosRoom_EventScript_GetDifficulty\n\tcall_if_set FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_BrunosRoom_EventScript_GetDifficulty2\n\tclearflag FLAG_TEMP_5\n\tgoto PokemonLeague_BrunosRoom_EventScript_DefeatedBruno\n\tend\n\nPokemonLeague_BrunosRoom_EventScript_Intro::\n\tmsgbox PokemonLeague_BrunosRoom_Text_Intro\n\treturn\n\nPokemonLeague_BrunosRoom_EventScript_RematchIntro::\n\tmsgbox PokemonLeague_BrunosRoom_Text_RematchIntro\n\treturn\n\nPokemonLeague_BrunosRoom_EventScript_GetDifficulty::\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, TRUE, PokemonLeague_BrunosRoom_EventScript_Battle_ChallengeMode\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, FALSE, PokemonLeague_BrunosRoom_EventScript_Battle\n\treturn\n\nPokemonLeague_BrunosRoom_EventScript_GetDifficulty2::\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, TRUE, PokemonLeague_BrunosRoom_EventScript_Battle_ChallengeModeRematch\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, FALSE, PokemonLeague_BrunosRoom_EventScript_Rematch\n\treturn\n\nPokemonLeague_BrunosRoom_EventScript_Battle_ChallengeMode::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_BRUNO_CHALLENGE, PokemonLeague_BrunosRoom_Text_Defeat\n\treturn\n\nPokemonLeague_BrunosRoom_EventScript_Battle::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_BRUNO, PokemonLeague_BrunosRoom_Text_Defeat\n\treturn\n\nPokemonLeague_BrunosRoom_EventScript_Battle_ChallengeModeRematch::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_BRUNO_CHALLENGE_2, PokemonLeague_BrunosRoom_Text_Defeat\n\treturn\n\nPokemonLeague_BrunosRoom_EventScript_Rematch::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_BRUNO_2, PokemonLeague_BrunosRoom_Text_Defeat\n\treturn\n\nPokemonLeague_BrunosRoom_EventScript_PostBattle::\n\tmsgbox PokemonLeague_BrunosRoom_Text_PostBattle\n\tclosemessage\n\tcall_if_eq VAR_FACING, DIR_NORTH, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayRight\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayLeft\n\tcall_if_eq VAR_FACING, DIR_WEST, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayDown\n\tcall_if_eq VAR_FACING, DIR_EAST, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayDown\n\trelease\n\tend\n\nPokemonLeague_BrunosRoom_EventScript_DefeatedBruno::\n\tsetflag FLAG_DEFEATED_BRUNO\n\tcall PokemonLeague_EventScript_OpenDoor\n\tmsgbox PokemonLeague_BrunosRoom_Text_PostBattle\n\tclosemessage\n\tcall_if_eq VAR_FACING, DIR_NORTH, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayRight\n\tcall_if_eq VAR_FACING, DIR_SOUTH, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayLeft\n\tcall_if_eq VAR_FACING, DIR_WEST, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayDown\n\tcall_if_eq VAR_FACING, DIR_EAST, PokemonLeague_BrunosRoom_EventScript_BrunoLookAwayDown\n\trelease\n\tend\n\nPokemonLeague_BrunosRoom_EventScript_BrunoLookAwayLeft::\n\tapplymovement LOCALID_BRUNO, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treturn\n\nPokemonLeague_BrunosRoom_EventScript_BrunoLookAwayRight::\n\tapplymovement LOCALID_BRUNO, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\treturn\n\nPokemonLeague_BrunosRoom_EventScript_BrunoLookAwayDown::\n\tapplymovement LOCALID_BRUNO, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n"
  },
  {
    "path": "data/maps/PokemonLeague_BrunosRoom/text.inc",
    "content": "PokemonLeague_BrunosRoom_Text_Intro::\n    .string \"I am BRUNO of the ELITE FOUR!\\p\"\n    .string \"Through rigorous training, people\\n\"\n    .string \"and POKéMON can become stronger\\l\"\n    .string \"without limit.\\p\"\n    .string \"I've lived and trained with my\\n\"\n    .string \"fighting POKéMON!\\l\"\n    .string \"And that will never change!\\p\"\n    .string \"{PLAYER}!\\p\"\n    .string \"We will grind you down with our\\n\"\n    .string \"superior power!\\p\"\n    .string \"Hoo hah!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nPokemonLeague_BrunosRoom_Text_RematchIntro::\n    .string \"I am BRUNO of the ELITE FOUR!\\p\"\n    .string \"Through rigorous training, people\\n\"\n    .string \"and POKéMON can become stronger\\l\"\n    .string \"without limit.\\p\"\n    .string \"I've lived and trained with my\\n\"\n    .string \"fighting POKéMON!\\l\"\n    .string \"And that will never change!\\p\"\n    .string \"{PLAYER}!\\p\"\n    .string \"We will grind you down with our\\n\"\n    .string \"superior power!\\p\"\n    .string \"Hoo hah!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nPokemonLeague_BrunosRoom_Text_Defeat::\n    .string \"Why?\\n\"\n    .string \"How could I lose?$\"\n\nPokemonLeague_BrunosRoom_Text_PostBattle::\n    .string \"My job is done.\\n\"\n    .string \"Go face your next challenge.$\"\n\n"
  },
  {
    "path": "data/maps/PokemonLeague_ChampionsRoom/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_LEAGUE_CHAMPIONS_ROOM\",\n  \"name\": \"PokemonLeague_ChampionsRoom\",\n  \"layout\": \"LAYOUT_POKEMON_LEAGUE_CHAMPIONS_ROOM\",\n  \"music\": \"MUS_VICTORY_ROAD\",\n  \"region_map_section\": \"MAPSEC_POKEMON_LEAGUE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLUE\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PROF_OAK\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_OAK_IN_CHAMP_ROOM\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_LEAGUE_LANCES_ROOM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_LEAGUE_HALL_OF_FAME\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/PokemonLeague_ChampionsRoom/scripts.inc",
    "content": ".equ LOCALID_RIVAL,    1\n.equ LOCALID_PROF_OAK, 2\n\nPokemonLeague_ChampionsRoom_MapScripts::\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PokemonLeague_ChampionsRoom_OnWarp\n\tmap_script MAP_SCRIPT_ON_RESUME, PokemonLeague_ChampionsRoom_OnResume\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, PokemonLeague_ChampionsRoom_OnFrame\n\t.byte 0\n\nPokemonLeague_ChampionsRoom_OnResume::\n\tsetvar VAR_0x8004, 4\n\tcall PokemonLeague_EventScript_DoLightingEffect\n\tcall_if_eq VAR_STARTER_MON, 2, PokemonLeague_ChampionsRoom_EventScript_CheckStopTriggerSquirtle\n\tcall_if_eq VAR_STARTER_MON, 1, PokemonLeague_ChampionsRoom_EventScript_CheckStopTriggerBulbasaur\n\tcall_if_eq VAR_STARTER_MON, 0, PokemonLeague_ChampionsRoom_EventScript_CheckStopTriggerCharmander\n\tend\n\nPokemonLeague_ChampionsRoom_EventScript_CheckStopTriggerSquirtle::\n\tgoto_if_defeated TRAINER_CHAMPION_FIRST_SQUIRTLE, PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger\n\tgoto_if_defeated TRAINER_CHAMPION_REMATCH_SQUIRTLE, PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_CheckStopTriggerBulbasaur::\n\tgoto_if_defeated TRAINER_CHAMPION_FIRST_BULBASAUR, PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger\n\tgoto_if_defeated TRAINER_CHAMPION_REMATCH_BULBASAUR, PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_CheckStopTriggerCharmander::\n\tgoto_if_defeated TRAINER_CHAMPION_FIRST_CHARMANDER, PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger\n\tgoto_if_defeated TRAINER_CHAMPION_REMATCH_CHARMANDER, PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger::\n\tsetvar VAR_TEMP_1, 1\n\treturn\n\nPokemonLeague_ChampionsRoom_OnWarp::\n\tmap_script_2 VAR_TEMP_1, 0, PokemonLeague_ChampionsRoom_EventScript_TurnPlayerNorth\n\t.2byte 0\n\nPokemonLeague_ChampionsRoom_EventScript_TurnPlayerNorth::\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH\n\tend\n\nPokemonLeague_ChampionsRoom_OnFrame::\n\tmap_script_2 VAR_TEMP_1, 0, PokemonLeague_ChampionsRoom_EventScript_EnterRoom\n\t.2byte 0\n\nPokemonLeague_ChampionsRoom_EventScript_EnterRoom::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tsetflag FLAG_TEMP_2\n\tgoto_if_questlog PokemonLeague_ChampionsRoom_EventScript_QuestLogFix\n\tapplymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_ChampionsRoom_Movement_PlayerEnter\n\twaitmovement 0\n\tdelay 20\nPokemonLeague_ChampionsRoom_EventScript_QuestLogFix:\n\tcall_if_unset FLAG_SYS_GAME_CLEAR, PokemonLeague_ChampionsRoom_EventScript_Intro\n\tcall_if_set FLAG_SYS_GAME_CLEAR, PokemonLeague_ChampionsRoom_EventScript_RematchIntro\n\tgoto_if_questlog PokemonLeague_ChampionsRoom_EventScript_QuestLogEnd\n\tsetflag FLAG_TEMP_3\n\tsetflag FLAG_TEMP_5\n\tsavebgm MUS_VICTORY_GYM_LEADER\n\tcall_if_unset FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_ChampionsRoom_EventScript_GetDifficulty\n\tcall_if_set FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_ChampionsRoom_EventScript_GetDifficulty2\n\tsetflag FLAG_TEMP_4\n\tclearflag FLAG_TEMP_5\n\tsetflag FLAG_DEFEATED_CHAMP\n\tsetflag FLAG_TEMP_4\n\tmsgbox PokemonLeague_ChampionsRoom_Text_PostBattle\n\tplaybgm MUS_SLOW_PALLET, 0\n\taddobject LOCALID_PROF_OAK\n\tmsgbox PokemonLeague_ChampionsRoom_Text_OakPlayer\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_ChampionsRoom_Movement_PlayerWatchOakEnter\n\tapplymovement LOCALID_RIVAL, PokemonLeague_ChampionsRoom_Movement_RivalWatchOakEnter\n\tapplymovement LOCALID_PROF_OAK, PokemonLeague_ChampionsRoom_Movement_OakEnter\n\twaitmovement 0\n\tdelay 25\n\tspecialvar VAR_RESULT, GetStarterSpecies\n\tbufferspeciesname STR_VAR_1, VAR_RESULT\n\tmsgbox PokemonLeague_ChampionsRoom_Text_OakCongratulations\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tmsgbox PokemonLeague_ChampionsRoom_Text_OakImDisappointedRival\n\tclosemessage\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tdelay 20\n\tmsgbox PokemonLeague_ChampionsRoom_Text_OakPlayerComeWithMe\n\tclosemessage\n\tdelay 13\n\tapplymovement LOCALID_PROF_OAK, PokemonLeague_ChampionsRoom_Movement_OakExit\n\tapplymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_ChampionsRoom_Movement_PlayerExit\n\twaitmovement 0\n\tplayse SE_EXIT\n\tapplymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_ChampionsRoom_Movement_PlayerExit2\n\twaitmovement 0\n\tsetvar VAR_TEMP_1, 1\n\twarp MAP_POKEMON_LEAGUE_HALL_OF_FAME, 5, 12\n\twaitstate\n\treleaseall\n\tend\n\nPokemonLeague_ChampionsRoom_EventScript_QuestLogEnd::\n\tcall PokemonLeague_ChampionsRoom_EventScript_StopSceneTrigger\n\treleaseall\n\tend\n\nPokemonLeague_ChampionsRoom_EventScript_GetDifficulty::\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, TRUE, PokemonLeague_ChampionsRoom_EventScript_Battle_ChallengeMode\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, FALSE, PokemonLeague_ChampionsRoom_EventScript_Battle\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_GetDifficulty2::\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, TRUE, PokemonLeague_ChampionsRoom_EventScript_Battle_ChallengeModeRematch\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, FALSE, PokemonLeague_ChampionsRoom_EventScript_Rematch\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_Battle_ChallengeMode::\n\tcall_if_eq VAR_STARTER_MON, 2, PokemonLeague_ChampionsRoom_EventScript_BattleSquirtle_ChallengeMode\n\tcall_if_eq VAR_STARTER_MON, 1, PokemonLeague_ChampionsRoom_EventScript_BattleBulbasaur_ChallengeMode\n\tcall_if_eq VAR_STARTER_MON, 0, PokemonLeague_ChampionsRoom_EventScript_BattleCharmander_ChallengeMode\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_Battle::\n\tcall_if_eq VAR_STARTER_MON, 2, PokemonLeague_ChampionsRoom_EventScript_BattleSquirtle\n\tcall_if_eq VAR_STARTER_MON, 1, PokemonLeague_ChampionsRoom_EventScript_BattleBulbasaur\n\tcall_if_eq VAR_STARTER_MON, 0, PokemonLeague_ChampionsRoom_EventScript_BattleCharmander\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_Battle_ChallengeModeRematch::\n\tcall_if_eq VAR_STARTER_MON, 2, PokemonLeague_ChampionsRoom_EventScript_RematchSquirtle_ChallengeMode\n\tcall_if_eq VAR_STARTER_MON, 1, PokemonLeague_ChampionsRoom_EventScript_RematchBulbasaur_ChallengeMode\n\tcall_if_eq VAR_STARTER_MON, 0, PokemonLeague_ChampionsRoom_EventScript_RematchCharmander_ChallengeMode\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_Rematch::\n\tcall_if_eq VAR_STARTER_MON, 2, PokemonLeague_ChampionsRoom_EventScript_RematchSquirtle\n\tcall_if_eq VAR_STARTER_MON, 1, PokemonLeague_ChampionsRoom_EventScript_RematchBulbasaur\n\tcall_if_eq VAR_STARTER_MON, 0, PokemonLeague_ChampionsRoom_EventScript_RematchCharmander\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_Intro::\n\tmsgbox PokemonLeague_ChampionsRoom_Text_Intro\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_RematchIntro::\n\tmsgbox PokemonLeague_ChampionsRoom_Text_RematchIntro\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_BattleSquirtle_ChallengeMode::\n\ttrainerbattle_no_intro TRAINER_CHAMPION_FIRST_SQUIRTLE_CHALLENGE, PokemonLeague_ChampionsRoom_Text_Defeat\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_BattleBulbasaur_ChallengeMode::\n\ttrainerbattle_no_intro TRAINER_CHAMPION_FIRST_BULBASAUR_CHALLENGE, PokemonLeague_ChampionsRoom_Text_Defeat\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_BattleCharmander_ChallengeMode::\n\ttrainerbattle_no_intro TRAINER_CHAMPION_FIRST_CHARMANDER_CHALLENGE, PokemonLeague_ChampionsRoom_Text_Defeat\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_BattleSquirtle::\n\ttrainerbattle_no_intro TRAINER_CHAMPION_FIRST_SQUIRTLE, PokemonLeague_ChampionsRoom_Text_Defeat\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_BattleBulbasaur::\n\ttrainerbattle_no_intro TRAINER_CHAMPION_FIRST_BULBASAUR, PokemonLeague_ChampionsRoom_Text_Defeat\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_BattleCharmander::\n\ttrainerbattle_no_intro TRAINER_CHAMPION_FIRST_CHARMANDER, PokemonLeague_ChampionsRoom_Text_Defeat\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_RematchSquirtle_ChallengeMode::\n\ttrainerbattle_no_intro TRAINER_CHAMPION_REMATCH_SQUIRTLE_CHALLENGE, PokemonLeague_ChampionsRoom_Text_Defeat\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_RematchBulbasaur_ChallengeMode::\n\ttrainerbattle_no_intro TRAINER_CHAMPION_REMATCH_BULBASAUR_CHALLENGE, PokemonLeague_ChampionsRoom_Text_Defeat\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_RematchCharmander_ChallengeMode::\n\ttrainerbattle_no_intro TRAINER_CHAMPION_REMATCH_CHARMANDER_CHALLENGE, PokemonLeague_ChampionsRoom_Text_Defeat\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_RematchSquirtle::\n\ttrainerbattle_no_intro TRAINER_CHAMPION_REMATCH_SQUIRTLE, PokemonLeague_ChampionsRoom_Text_Defeat\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_RematchBulbasaur::\n\ttrainerbattle_no_intro TRAINER_CHAMPION_REMATCH_BULBASAUR, PokemonLeague_ChampionsRoom_Text_Defeat\n\treturn\n\nPokemonLeague_ChampionsRoom_EventScript_RematchCharmander::\n\ttrainerbattle_no_intro TRAINER_CHAMPION_REMATCH_CHARMANDER, PokemonLeague_ChampionsRoom_Text_Defeat\n\treturn\n\nPokemonLeague_ChampionsRoom_Movement_PlayerEnter::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nPokemonLeague_ChampionsRoom_Movement_PlayerExit::\n\tdelay_16\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_up\n\twalk_up\n\tstep_end\n\nPokemonLeague_ChampionsRoom_Movement_PlayerExit2::\n\twalk_up\n\twalk_up\n\tdelay_8\n\tset_invisible\n\tstep_end\n\nPokemonLeague_ChampionsRoom_Movement_PlayerWatchOakEnter::\n\tdelay_8\n\twalk_in_place_faster_down\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\twalk_in_place_faster_left\n\tstep_end\n\nPokemonLeague_ChampionsRoom_Movement_OakEnter::\n\tdelay_16\n\tdelay_16\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_in_place_faster_down\n\tdelay_16\n\tstep_end\n\nPokemonLeague_ChampionsRoom_Movement_OakExit::\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tdelay_8\n\tset_invisible\n\tstep_end\n\nPokemonLeague_ChampionsRoom_Movement_RivalWatchOakEnter::\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\twalk_in_place_faster_left\n\tstep_end\n"
  },
  {
    "path": "data/maps/PokemonLeague_ChampionsRoom/text.inc",
    "content": "PokemonLeague_ChampionsRoom_Text_Intro::\n    .string \"{RIVAL}: Hey, {PLAYER}!\\p\"\n    .string \"I was looking forward to seeing\\n\"\n    .string \"you, {PLAYER}.\\p\"\n    .string \"My rival should be strong to keep\\n\"\n    .string \"me sharp.\\p\"\n    .string \"While working on my POKéDEX, I\\n\"\n    .string \"looked all over for POKéMON.\\p\"\n    .string \"Not only that, I assembled teams\\n\"\n    .string \"that would beat any POKéMON type.\\p\"\n    .string \"And now…\\p\"\n    .string \"I'm the POKéMON LEAGUE CHAMPION!\\p\"\n    .string \"{PLAYER}!\\n\"\n    .string \"Do you know what that means?\\p\"\n    .string \"I'll tell you.\\p\"\n    .string \"I am the most powerful TRAINER in\\n\"\n    .string \"the world!$\"\n\nPokemonLeague_ChampionsRoom_Text_RematchIntro::\n    .string \"{RIVAL}: Hey, {PLAYER}!\\p\"\n    .string \"You came back, {PLAYER}!\\n\"\n    .string \"Hahah, that is so great!\\p\"\n    .string \"My rival should be strong to keep\\n\"\n    .string \"me sharp.\\p\"\n    .string \"While working on my POKéDEX, I\\n\"\n    .string \"looked all over for POKéMON.\\p\"\n    .string \"Not only that, I assembled teams\\n\"\n    .string \"that would beat any POKéMON type.\\p\"\n    .string \"And now…\\p\"\n    .string \"I'm the POKéMON LEAGUE CHAMPION!\\p\"\n    .string \"{PLAYER}!\\n\"\n    .string \"Do you know what that means?\\p\"\n    .string \"I'll tell you.\\p\"\n    .string \"I am the most powerful TRAINER in\\n\"\n    .string \"the world!$\"\n\nPokemonLeague_ChampionsRoom_Text_Defeat::\n    .string \"NO!\\n\"\n    .string \"That can't be!\\l\"\n    .string \"You beat me at my best!\\p\"\n    .string \"After all that work to become\\n\"\n    .string \"the LEAGUE CHAMP?\\p\"\n    .string \"My reign is over already?\\n\"\n    .string \"It's not fair!$\"\n\nPokemonLeague_ChampionsRoom_Text_PostBattle::\n    .string \"Why?\\n\"\n    .string \"Why did I lose?\\p\"\n    .string \"I never made any mistakes raising\\n\"\n    .string \"my POKéMON…\\p\"\n    .string \"Darn it! You're the new POKéMON\\n\"\n    .string \"LEAGUE CHAMPION!\\p\"\n    .string \"Although I don't like to admit it…$\"\n\nPokemonLeague_ChampionsRoom_Text_OakPlayer::\n    .string \"OAK: {PLAYER}!$\"\n\nPokemonLeague_ChampionsRoom_Text_OakCongratulations::\n    .string \"OAK: So, you've won!\\n\"\n    .string \"Sincerely, congratulations!\\p\"\n    .string \"You're the new POKéMON LEAGUE\\n\"\n    .string \"CHAMPION!\\p\"\n    .string \"You've grown up so much since you\\n\"\n    .string \"first left with {STR_VAR_1} to work\\l\"\n    .string \"on the POKéDEX.\\p\"\n    .string \"{PLAYER}, you have come of age!$\"\n\nPokemonLeague_ChampionsRoom_Text_OakImDisappointedRival::\n    .string \"OAK: {RIVAL}…\\n\"\n    .string \"I'm disappointed in you.\\p\"\n    .string \"I came when I heard you'd beaten\\n\"\n    .string \"the ELITE FOUR.\\p\"\n    .string \"But, when I got here, you had\\n\"\n    .string \"already lost!\\p\"\n    .string \"{RIVAL}, do you understand why\\n\"\n    .string \"you lost?\\p\"\n    .string \"You have forgotten to treat your\\n\"\n    .string \"POKéMON with love and trust.\\p\"\n    .string \"Without them, you will never\\n\"\n    .string \"become a CHAMP again!$\"\n\nPokemonLeague_ChampionsRoom_Text_OakPlayerComeWithMe::\n    .string \"OAK: {PLAYER}.\\p\"\n    .string \"You understand that your victory\\n\"\n    .string \"was not just your own doing.\\p\"\n    .string \"The bond you share with your\\n\"\n    .string \"POKéMON is marvelous.\\p\"\n    .string \"{PLAYER}!\\n\"\n    .string \"Come with me!$\"\n\n"
  },
  {
    "path": "data/maps/PokemonLeague_HallOfFame/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_LEAGUE_HALL_OF_FAME\",\n  \"name\": \"PokemonLeague_HallOfFame\",\n  \"layout\": \"LAYOUT_POKEMON_LEAGUE_HALL_OF_FAME\",\n  \"music\": \"MUS_SLOW_PALLET\",\n  \"region_map_section\": \"MAPSEC_POKEMON_LEAGUE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PROF_OAK\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_LEAGUE_CHAMPIONS_ROOM\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/PokemonLeague_HallOfFame/scripts.inc",
    "content": ".set LOCALID_PROF_OAK, 1\n\nPokemonLeague_HallOfFame_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, PokemonLeague_HallOfFame_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PokemonLeague_HallOfFame_OnWarp\n\t.byte 0\n\nPokemonLeague_HallOfFame_OnWarp::\n\tmap_script_2 VAR_TEMP_1, 0, PokemonLeague_HallOfFame_EventScript_TurnPlayerNorth\n\t.2byte 0\n\nPokemonLeague_HallOfFame_EventScript_TurnPlayerNorth::\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH\n\tend\n\nPokemonLeague_HallOfFame_OnFrame::\n\tmap_script_2 VAR_TEMP_1, 0, PokemonLeague_HallOfFame_EventScript_EnterRoom\n\t.2byte 0\n\nPokemonLeague_HallOfFame_EventScript_EnterRoom::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_HallOfFame_Movement_EnterRoom\n\twaitmovement 0\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterLeft\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tdelay 18\n\tmsgbox PokemonLeague_HallOfFame_Text_OakCongratulations\n\tclosemessage\n\tapplymovement LOCALID_PROF_OAK, Common_Movement_WalkInPlaceFasterUp\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tdelay 20\n\tdofieldeffect FLDEFF_HALL_OF_FAME_RECORD\n\twaitfieldeffect FLDEFF_HALL_OF_FAME_RECORD\n\tdelay 40\n\tsetvar VAR_TEMP_1, 1\n\tcall EventScript_SetDefeatedEliteFourFlagsVars\n\tsetrespawn SPAWN_PALLET_TOWN\n\tfadescreenspeed FADE_TO_BLACK, 24\n\tcheckitem ITEM_OLD_SEA_MAP, 1\n\tcall_if_ne VAR_RESULT, TRUE, PokemonLeague_HallOfFame_EventScript_ActivateOldSeaMapEvent\n\tspecial EnterHallOfFame\n\twaitstate\n\treleaseall\n\tend\n\nPokemonLeague_HallOfFame_EventScript_ActivateOldSeaMapEvent::\n\tclearflag FLAG_HIDE_LAVENDER_OUTSIDE_FUJI\n\tsetflag FLAG_HIDE_POKEHOUSE_FUJI\n\treturn\n\nPokemonLeague_HallOfFame_Movement_EnterRoom::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n"
  },
  {
    "path": "data/maps/PokemonLeague_HallOfFame/text.inc",
    "content": "PokemonLeague_HallOfFame_Text_OakCongratulations::\n    .string \"OAK: Er-hem!\\n\"\n    .string \"Congratulations, {PLAYER}!\\p\"\n    .string \"This floor is the POKéMON HALL OF\\n\"\n    .string \"FAME.\\p\"\n    .string \"POKéMON LEAGUE CHAMPIONS are\\n\"\n    .string \"honored for their exploits here.\\p\"\n    .string \"Their POKéMON are also recorded in\\n\"\n    .string \"the HALL OF FAME.\\p\"\n    .string \"{PLAYER}!\\p\"\n    .string \"You have worked hard to become\\n\"\n    .string \"the new LEAGUE CHAMPION.\\p\"\n    .string \"Congratulations, {PLAYER}, you and\\n\"\n    .string \"your POKéMON are HALL OF FAMERS!$\"\n\n"
  },
  {
    "path": "data/maps/PokemonLeague_LancesRoom/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_LEAGUE_LANCES_ROOM\",\n  \"name\": \"PokemonLeague_LancesRoom\",\n  \"layout\": \"LAYOUT_POKEMON_LEAGUE_LANCES_ROOM\",\n  \"music\": \"MUS_VICTORY_ROAD\",\n  \"region_map_section\": \"MAPSEC_POKEMON_LEAGUE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_LANCE\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LANCE\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonLeague_LancesRoom_EventScript_Lance\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 23,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_LEAGUE_AGATHAS_ROOM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_POKEMON_LEAGUE_CHAMPIONS_ROOM\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/PokemonLeague_LancesRoom/scripts.inc",
    "content": ".set LOCALID_LANCE, 1\n\nPokemonLeague_LancesRoom_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, PokemonLeague_LancesRoom_OnResume\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonLeague_LancesRoom_OnLoad\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PokemonLeague_LancesRoom_OnWarp\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, PokemonLeague_LancesRoom_OnFrame\n\t.byte 0\n\nPokemonLeague_LancesRoom_OnResume::\n\tsetvar VAR_0x8004, 3\n\tcall PokemonLeague_EventScript_DoLightingEffect\n\tend\n\nPokemonLeague_LancesRoom_OnLoad::\n\tcall_if_eq VAR_MAP_SCENE_POKEMON_LEAGUE, 4, PokemonLeague_LancesRoom_EventScript_CloseEntry\n\tcall_if_set FLAG_DEFEATED_LANCE, PokemonLeague_LancesRoom_EventScript_SetDoorOpen\n\tend\n\nPokemonLeague_LancesRoom_EventScript_CloseEntry::\n\tcall PokemonLeague_LancesRoom_EventScript_SetEntryClosed\n\treturn\n\nPokemonLeague_LancesRoom_EventScript_SetDoorOpen::\n\tcall PokemonLeague_EventScript_SetDoorOpenLance\n\treturn\n\nPokemonLeague_LancesRoom_OnWarp::\n\tmap_script_2 VAR_TEMP_1, 0, PokemonLeague_LancesRoom_EventScript_TurnPlayerNorth\n\t.2byte 0\n\nPokemonLeague_LancesRoom_EventScript_TurnPlayerNorth::\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH\n\tend\n\nPokemonLeague_LancesRoom_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_POKEMON_LEAGUE, 3, PokemonLeague_LancesRoom_EventScript_EnterRoom\n\t.2byte 0\n\nPokemonLeague_LancesRoom_EventScript_EnterRoom::\n\tlockall\n\tapplymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_LancesRoom_Movement_WalkThroughCorridor\n\twaitmovement 0\n\tsetflag FLAG_TEMP_2\n\tcall PokemonLeague_LancesRoom_EventScript_SetEntryClosed\n\tplayse SE_UNLOCK\n\tspecial DrawWholeMapView\n\twaitse\n\tsetvar VAR_MAP_SCENE_POKEMON_LEAGUE, 4\n\treleaseall\n\tend\n\nPokemonLeague_LancesRoom_EventScript_SetEntryClosed::\n\tsetmetatile 5, 14, METATILE_PokemonLeague_Entry_TopLeft_Closed, 1\n\tsetmetatile 6, 14, METATILE_PokemonLeague_Entry_TopMid_Closed, 1\n\tsetmetatile 7, 14, METATILE_PokemonLeague_Entry_TopRight_Closed, 1\n\tsetmetatile 5, 15, METATILE_PokemonLeague_Entry_BottomLeft_Closed, 1\n\tsetmetatile 6, 15, METATILE_PokemonLeague_Entry_BottomMid_Closed, 1\n\tsetmetatile 7, 15, METATILE_PokemonLeague_Entry_BottomRight_Closed, 1\n\tsetmetatile 6, 16, METATILE_PokemonLeague_Floor_ShadeFull_Lance, 0\n\tsetmetatile 7, 16, METATILE_PokemonLeague_Floor_ShadeFull_Lance, 0\n\treturn\n\nPokemonLeague_LancesRoom_Movement_WalkThroughCorridor::\n\twalk_up\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nPokemonLeague_LancesRoom_EventScript_Lance::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_LANCE, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tgoto_if_set FLAG_DEFEATED_LANCE, PokemonLeague_LancesRoom_EventScript_PostBattle\n\tfamechecker FAMECHECKER_LANCE, 0\n\tfamechecker FAMECHECKER_LANCE, 1\n\tcall_if_unset FLAG_SYS_GAME_CLEAR, PokemonLeague_LancesRoom_EventScript_Intro\n\tcall_if_set FLAG_SYS_GAME_CLEAR, PokemonLeague_LancesRoom_EventScript_RematchIntro\n\tsetflag FLAG_TEMP_3\n\tsetflag FLAG_TEMP_5\n\tcall_if_unset FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_LancesRoom_EventScript_GetDifficulty\n\tcall_if_set FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_LancesRoom_EventScript_GetDifficulty2\n\tclearflag FLAG_TEMP_5\n\tgoto PokemonLeague_LancesRoom_EventScript_DefeatedLance\n\tend\n\nPokemonLeague_LancesRoom_EventScript_Intro::\n\tmsgbox PokemonLeague_LancesRoom_Text_Intro\n\treturn\n\nPokemonLeague_LancesRoom_EventScript_RematchIntro::\n\tmsgbox PokemonLeague_LancesRoom_Text_RematchIntro\n\treturn\n\nPokemonLeague_LancesRoom_EventScript_GetDifficulty::\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, TRUE, PokemonLeague_LancesRoom_EventScript_Battle_ChallengeMode\n\tcallnative IsChallengeModeToVarResult\n\n\tcall_if_eq VAR_RESULT, FALSE, PokemonLeague_LancesRoom_EventScript_Battle\n\treturn\n\nPokemonLeague_LancesRoom_EventScript_GetDifficulty2::\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, TRUE, PokemonLeague_LancesRoom_EventScript_Battle_ChallengeModeRematch\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, FALSE, PokemonLeague_LancesRoom_EventScript_Rematch\n\treturn\n\nPokemonLeague_LancesRoom_EventScript_Battle_ChallengeMode::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_LANCE_CHALLENGE, PokemonLeague_LancesRoom_Text_Defeat\n\treturn\n\nPokemonLeague_LancesRoom_EventScript_Battle::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_LANCE, PokemonLeague_LancesRoom_Text_Defeat\n\treturn\n\nPokemonLeague_LancesRoom_EventScript_Battle_ChallengeModeRematch::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_LANCE_CHALLENGE_2, PokemonLeague_LancesRoom_Text_Defeat\n\treturn\n\nPokemonLeague_LancesRoom_EventScript_Rematch::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_LANCE_2, PokemonLeague_LancesRoom_Text_Defeat\n\treturn\n\nPokemonLeague_LancesRoom_EventScript_PostBattle::\n\tmsgbox PokemonLeague_LancesRoom_Text_PostBattle\n\trelease\n\tend\n\nPokemonLeague_LancesRoom_EventScript_DefeatedLance::\n\tsetvar VAR_0x8004, 0\n\tspecial Script_TryGainNewFanFromCounter\n\tsetflag FLAG_DEFEATED_LANCE\n\tcall PokemonLeague_EventScript_OpenDoorLance\n\tmsgbox PokemonLeague_LancesRoom_Text_PostBattle\n\tclosemessage\n\trelease\n\tend\n\nPokemonLeague_LancesRoom_EventScript_LanceMoveOutOfWayLeft::\n\tapplymovement LOCALID_LANCE, PokemonLeague_LancesRoom_Movement_LanceMoveOutOfWayLeft\n\twaitmovement 0\n\treturn\n\nPokemonLeague_LancesRoom_EventScript_LanceMoveOutOfWayRight::\n\tapplymovement LOCALID_LANCE, PokemonLeague_LancesRoom_Movement_LanceMoveOutOfWayRight\n\twaitmovement 0\n\treturn\n\nPokemonLeague_LancesRoom_Movement_LanceMoveOutOfWayLeft::\n\twalk_left\n\twalk_in_place_faster_right\n\tstep_end\n\nPokemonLeague_LancesRoom_Movement_LanceMoveOutOfWayRight::\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n"
  },
  {
    "path": "data/maps/PokemonLeague_LancesRoom/text.inc",
    "content": "PokemonLeague_LancesRoom_Text_Intro::\n    .string \"Ah! I've heard about you,\\n\"\n    .string \"{PLAYER}!\\p\"\n    .string \"I lead the ELITE FOUR.\\p\"\n    .string \"You can call me LANCE the dragon\\n\"\n    .string \"TRAINER.\\p\"\n    .string \"You know that dragons are\\n\"\n    .string \"mythical POKéMON.\\p\"\n    .string \"They're hard to catch and raise,\\n\"\n    .string \"but their powers are superior.\\p\"\n    .string \"They're virtually indestructible.\\n\"\n    .string \"There's no being clever with them.\\p\"\n    .string \"Well, are you ready to lose?\\p\"\n    .string \"Your LEAGUE challenge ends with\\n\"\n    .string \"me, {PLAYER}!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nPokemonLeague_LancesRoom_Text_RematchIntro::\n    .string \"Ah!\\n\"\n    .string \"So, you've returned, {PLAYER}!\\p\"\n    .string \"I lead the ELITE FOUR.\\p\"\n    .string \"You can call me LANCE the dragon\\n\"\n    .string \"TRAINER.\\p\"\n    .string \"You know that dragons are\\n\"\n    .string \"mythical POKéMON.\\p\"\n    .string \"They're hard to catch and raise,\\n\"\n    .string \"but their powers are superior.\\p\"\n    .string \"They're virtually indestructible.\\n\"\n    .string \"There's no being clever with them.\\p\"\n    .string \"Well, are you ready to lose?\\p\"\n    .string \"Your LEAGUE challenge ends with\\n\"\n    .string \"me, {PLAYER}!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nPokemonLeague_LancesRoom_Text_Defeat::\n    .string \"That's it!\\p\"\n    .string \"I hate to admit it, but you are a\\n\"\n    .string \"POKéMON master!$\"\n\nPokemonLeague_LancesRoom_Text_PostBattle::\n    .string \"I still can't believe my dragons\\n\"\n    .string \"lost to you, {PLAYER}.\\p\"\n    .string \"You are now the POKéMON LEAGUE\\n\"\n    .string \"CHAMPION!\\p\"\n    .string \"…Or, you would have been, but\\n\"\n    .string \"you have one more challenge left.\\p\"\n    .string \"There is one more TRAINER to face!\\n\"\n    .string \"His name is…\\p\"\n    .string \"{RIVAL}!\\p\"\n    .string \"He beat the ELITE FOUR before\\n\"\n    .string \"you.\\p\"\n    .string \"He is the real POKéMON LEAGUE\\n\"\n    .string \"CHAMPION.$\"\n\n"
  },
  {
    "path": "data/maps/PokemonLeague_LoreleisRoom/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_LEAGUE_LORELEIS_ROOM\",\n  \"name\": \"PokemonLeague_LoreleisRoom\",\n  \"layout\": \"LAYOUT_POKEMON_LEAGUE_LORELEIS_ROOM\",\n  \"music\": \"MUS_GYM\",\n  \"region_map_section\": \"MAPSEC_POKEMON_LEAGUE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_LORELEI\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LORELEI\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonLeague_LoreleisRoom_EventScript_Lorelei\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_POKEMON_LEAGUE_BRUNOS_ROOM\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/PokemonLeague_LoreleisRoom/scripts.inc",
    "content": "PokemonLeague_LoreleisRoom_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, PokemonLeague_LoreleisRoom_OnResume\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonLeague_LoreleisRoom_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PokemonLeague_LoreleisRoom_OnTransition\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PokemonLeague_LoreleisRoom_OnWarp\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, PokemonLeague_LoreleisRoom_OnFrame\n\t.byte 0\n\nPokemonLeague_LoreleisRoom_OnResume::\n\tsetvar VAR_0x8004, 0\n\tcall PokemonLeague_EventScript_DoLightingEffect\n\tend\n\nPokemonLeague_LoreleisRoom_OnLoad::\n\tcall_if_set FLAG_DEFEATED_LORELEI, PokemonLeague_LoreleisRoom_EventScript_SetDoorOpen\n\tcall_if_eq VAR_MAP_SCENE_POKEMON_LEAGUE, 1, PokemonLeague_LoreleisRoom_EventScript_CloseEntry\n\tend\n\nPokemonLeague_LoreleisRoom_EventScript_CloseEntry::\n\tcall PokemonLeague_EventScript_CloseEntry\n\treturn\n\nPokemonLeague_LoreleisRoom_EventScript_SetDoorOpen::\n\tcall PokemonLeague_EventScript_SetDoorOpen\n\treturn\n\nPokemonLeague_LoreleisRoom_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_POKEMON_LEAGUE_LORELEIS_ROOM\n\tend\n\nPokemonLeague_LoreleisRoom_OnWarp::\n\tmap_script_2 VAR_TEMP_1, 0, PokemonLeague_LoreleisRoom_EventScript_TurnPlayerNorth\n\t.2byte 0\n\nPokemonLeague_LoreleisRoom_EventScript_TurnPlayerNorth::\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH\n\tend\n\nPokemonLeague_LoreleisRoom_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_POKEMON_LEAGUE, 0, PokemonLeague_LoreleisRoom_EventScript_EnterRoom\n\t.2byte 0\n\nPokemonLeague_LoreleisRoom_EventScript_EnterRoom::\n\tlockall\n\tcall PokemonLeague_EventScript_EnterRoom\n\tsetvar VAR_MAP_SCENE_POKEMON_LEAGUE, 1\n\treleaseall\n\tend\n\nPokemonLeague_LoreleisRoom_EventScript_Lorelei::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_LORELEI, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tgoto_if_set FLAG_DEFEATED_LORELEI, PokemonLeague_LoreleisRoom_EventScript_PostBattle\n\tfamechecker FAMECHECKER_LORELEI, 0\n\tfamechecker FAMECHECKER_LORELEI, 1\n\tcall_if_unset FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_LoreleisRoom_EventScript_Intro\n\tcall_if_set FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_LoreleisRoom_EventScript_RematchIntro\n\tsetflag FLAG_TEMP_3\n\tsetflag FLAG_TEMP_5\n\tcall_if_unset FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_LoreleisRoom_EventScript_GetDifficulty\n\tcall_if_set FLAG_SYS_CAN_LINK_WITH_RS, PokemonLeague_LoreleisRoom_EventScript_GetDifficulty2\n\tclearflag FLAG_TEMP_5\n\tgoto PokemonLeague_LoreleisRoom_EventScript_DefeatedLorelei\n\tend\n\nPokemonLeague_LoreleisRoom_EventScript_Intro::\n\tmsgbox PokemonLeague_LoreleisRoom_Text_Intro\n\treturn\n\nPokemonLeague_LoreleisRoom_EventScript_RematchIntro::\n\tmsgbox PokemonLeague_LoreleisRoom_Text_RematchIntro\n\treturn\n\nPokemonLeague_LoreleisRoom_EventScript_GetDifficulty::\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, TRUE, PokemonLeague_LoreleisRoom_EventScript_Battle_ChallengeMode\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, FALSE, PokemonLeague_LoreleisRoom_EventScript_Battle\n\treturn\n\nPokemonLeague_LoreleisRoom_EventScript_GetDifficulty2::\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, TRUE, PokemonLeague_LoreleisRoom_EventScript_Battle_ChallengeModeRematch\n\tcallnative IsChallengeModeToVarResult\n\tcall_if_eq VAR_RESULT, FALSE, PokemonLeague_LoreleisRoom_EventScript_Rematch\n\treturn\n\nPokemonLeague_LoreleisRoom_EventScript_Battle_ChallengeMode::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_LORELEI_CHALLENGE, PokemonLeague_LoreleisRoom_Text_Defeat\n\treturn\n\nPokemonLeague_LoreleisRoom_EventScript_Battle::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_LORELEI, PokemonLeague_LoreleisRoom_Text_Defeat\n\treturn\n\nPokemonLeague_LoreleisRoom_EventScript_Battle_ChallengeModeRematch::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_LORELEI_CHALLENGE_2, PokemonLeague_LoreleisRoom_Text_Defeat\n\treturn\n\nPokemonLeague_LoreleisRoom_EventScript_Rematch::\n\ttrainerbattle_no_intro TRAINER_ELITE_FOUR_LORELEI_2, PokemonLeague_LoreleisRoom_Text_Defeat\n\treturn\n\nPokemonLeague_LoreleisRoom_EventScript_PostBattle::\n\tmsgbox PokemonLeague_LoreleisRoom_Text_PostBattle\n\trelease\n\tend\n\nPokemonLeague_LoreleisRoom_EventScript_DefeatedLorelei::\n\tsetflag FLAG_DEFEATED_LORELEI\n\tcall PokemonLeague_EventScript_OpenDoor\n\tmsgbox PokemonLeague_LoreleisRoom_Text_PostBattle\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/PokemonLeague_LoreleisRoom/text.inc",
    "content": "PokemonLeague_LoreleisRoom_Text_Intro::\n    .string \"Welcome to the POKéMON LEAGUE.\\p\"\n    .string \"I am LORELEI of the ELITE FOUR.\\p\"\n    .string \"No one can best me when it comes\\n\"\n    .string \"to icy POKéMON.\\p\"\n    .string \"Freezing moves are powerful.\\p\"\n    .string \"Your POKéMON will be at my mercy\\n\"\n    .string \"when they are frozen solid.\\p\"\n    .string \"Hahaha!\\n\"\n    .string \"Are you ready?{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nPokemonLeague_LoreleisRoom_Text_RematchIntro::\n    .string \"Welcome to the POKéMON LEAGUE.\\p\"\n    .string \"I, LORELEI of the ELITE FOUR,\\n\"\n    .string \"have returned!\\p\"\n    .string \"You know how it goes.\\n\"\n    .string \"No one can best me when it comes\\l\"\n    .string \"to icy POKéMON.\\p\"\n    .string \"Freezing moves are powerful.\\p\"\n    .string \"Your POKéMON will be at my mercy\\n\"\n    .string \"when they are frozen solid.\\p\"\n    .string \"Hahaha!\\n\"\n    .string \"Are you ready?{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nPokemonLeague_LoreleisRoom_Text_Defeat::\n    .string \"…Things shouldn't be this way!$\"\n\nPokemonLeague_LoreleisRoom_Text_PostBattle::\n    .string \"You're better than I thought.\\n\"\n    .string \"Go on ahead.\\p\"\n    .string \"You only got a taste of the\\n\"\n    .string \"POKéMON LEAGUE's power.$\"\n\n"
  },
  {
    "path": "data/maps/PokemonMansion_1F/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_MANSION_1F\",\n  \"name\": \"PokemonMansion_1F\",\n  \"layout\": \"LAYOUT_POKEMON_MANSION_1F\",\n  \"music\": \"MUS_POKE_MANSION\",\n  \"region_map_section\": \"MAPSEC_POKEMON_MANSION\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SHADE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_2\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"PokemonMansion_1F_EventScript_Ted\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonMansion_1F_EventScript_ItemCarbos\",\n      \"flag\": \"FLAG_HIDE_POKEMON_MANSION_1F_CARBOS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonMansion_1F_EventScript_ItemEscapeRope\",\n      \"flag\": \"FLAG_HIDE_POKEMON_MANSION_1F_ESCAPE_ROPE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonMansion_1F_EventScript_ItemProtein\",\n      \"flag\": \"FLAG_HIDE_POKEMON_MANSION_1F_PROTEIN\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"PokemonMansion_1F_EventScript_Johnson\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Magmar\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_2F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_B1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 34,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 35,\n      \"y\": 34,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_CINNABAR_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_3F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_3F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_POKEMON_MANSION_2F\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"PokemonMansion_1F_EventScript_Statue\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 2,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"item\": \"ITEM_MOON_STONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_POKEMON_MANSION_1F_MOON_STONE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/PokemonMansion_1F/scripts.inc",
    "content": ".set LOCALID_MAGMAR_MASTER, 6\n.set TRAINER, VAR_0x8009\n\nPokemonMansion_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonMansion_1F_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PokemonMansion_1F_OnTransition\n\t.byte 0\n\nPokemonMansion_1F_OnLoad::\n\tcall_if_set FLAG_POKEMON_MANSION_SWITCH_STATE, PokemonMansion_EventScript_PressSwitch_1F\n\tend\n\nPokemonMansion_1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_POKEMON_MANSION_1F\n\tgoto PokemonMansion_1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nPokemonMansion_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_MAGMAR\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PokemonMansion_1F_MapScript_MagmarMasterMovementType\n\tend\n\nPokemonMansion_1F_MapScript_MagmarMasterMovementType::\n\tsetobjectmovementtype LOCALID_MAGMAR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPokemonMansion_1F_EventScript_Statue::\n\tlockall\n\tsetvar VAR_0x8004, 0\n\tcall PokemonMansion_EventScript_SecretSwitch\n\tplayse SE_UNLOCK\n\tspecial DrawWholeMapView\n\twaitse\n\treleaseall\n\tend\n\nPokemonMansion_1F_EventScript_Ted::\n\ttrainerbattle_single TRAINER_SCIENTIST_TED, PokemonMansion_1F_Text_TedIntro, PokemonMansion_1F_Text_TedDefeat\n\tmsgbox PokemonMansion_1F_Text_TedPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonMansion_1F_EventScript_Johnson::\n\ttrainerbattle_single TRAINER_YOUNGSTER_JOHNSON, PokemonMansion_1F_Text_JohnsonIntro, PokemonMansion_1F_Text_JohnsonDefeat\n\tmsgbox PokemonMansion_1F_Text_JohnsonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/PokemonMansion_1F/text.inc",
    "content": "PokemonMansion_1F_Text_TedIntro::\n    .string \"Who are you?\\n\"\n    .string \"There shouldn't be anyone here.$\"\n\nPokemonMansion_1F_Text_TedDefeat::\n    .string \"Ouch!$\"\n\nPokemonMansion_1F_Text_TedPostBattle::\n    .string \"A key? I don't know what you're\\n\"\n    .string \"talking about.$\"\n\nPokemonMansion_1F_Text_JohnsonIntro::\n    .string \"W-w-waah! You startled me!\\n\"\n    .string \"I thought you were a ghost.$\"\n\nPokemonMansion_1F_Text_JohnsonDefeat::\n    .string \"Tch!\\n\"\n    .string \"I can't get any wins.$\"\n\nPokemonMansion_1F_Text_JohnsonPostBattle::\n    .string \"I was exploring here by myself,\\n\"\n    .string \"but I feel spooked.\\p\"\n    .string \"I ought to go soon.$\"\n\n"
  },
  {
    "path": "data/maps/PokemonMansion_2F/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_MANSION_2F\",\n  \"name\": \"PokemonMansion_2F\",\n  \"layout\": \"LAYOUT_POKEMON_MANSION_2F\",\n  \"music\": \"MUS_POKE_MANSION\",\n  \"region_map_section\": \"MAPSEC_POKEMON_MANSION\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SHADE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_2\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BURGLAR\",\n      \"x\": 5,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"PokemonMansion_2F_EventScript_Arnie\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonMansion_2F_EventScript_ItemCalcium\",\n      \"flag\": \"FLAG_HIDE_POKEMON_MANSION_2F_CALCIUM\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonMansion_2F_EventScript_ItemZinc\",\n      \"flag\": \"FLAG_HIDE_POKEMON_MANSION_2F_ZINC\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonMansion_2F_EventScript_ItemHPUp\",\n      \"flag\": \"FLAG_HIDE_POKEMON_MANSION_2F_HP_UP\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Muk\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 9,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_3F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 34,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_3F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_3F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 27,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_3F\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"PokemonMansion_2F_EventScript_Statue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PokemonMansion_2F_EventScript_DiaryJuly10th\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 25,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PokemonMansion_2F_EventScript_DiaryJuly5th\"\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/PokemonMansion_2F/scripts.inc",
    "content": ".set LOCALID_MUK_MASTER, 5\n.set TRAINER, VAR_0x8009\n\nPokemonMansion_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonMansion_2F_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PokemonMansion_2F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nPokemonMansion_2F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_MUK\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PokemonMansion_2F_MapScript_MukMasterMovementType\n\tend\n\nPokemonMansion_2F_MapScript_MukMasterMovementType::\n\tsetobjectmovementtype LOCALID_MUK_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPokemonMansion_2F_OnLoad::\n\tcall_if_set FLAG_POKEMON_MANSION_SWITCH_STATE, PokemonMansion_EventScript_PressSwitch_2F\n\tend\n\nPokemonMansion_2F_EventScript_Statue::\n\tlockall\n\tsetvar VAR_0x8004, 1\n\tcall PokemonMansion_EventScript_SecretSwitch\n\tplayse SE_UNLOCK\n\tspecial DrawWholeMapView\n\twaitse\n\treleaseall\n\tend\n\nPokemonMansion_2F_EventScript_DiaryJuly5th::\n\tmsgbox PokemonMansion_1F_Text_NewMonDiscoveredInGuyanaJungle, MSGBOX_SIGN\n\tend\n\nPokemonMansion_2F_EventScript_DiaryJuly10th::\n\tmsgbox PokemonMansion_1F_Text_ChristenedDiscoveredMonMew, MSGBOX_SIGN\n\tend\n\nPokemonMansion_2F_EventScript_Arnie::\n\ttrainerbattle_single TRAINER_BURGLAR_ARNIE, PokemonMansion_1F_Text_ArnieIntro, PokemonMansion_1F_Text_ArnieDefeat\n\tmsgbox PokemonMansion_1F_Text_ArniePostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/PokemonMansion_2F/text.inc",
    "content": "PokemonMansion_Text_PressSecretSwitch::\n    .string \"A secret switch!\\p\"\n    .string \"Press it?$\"\n\nPokemonMansion_Text_WhoWouldnt::\n    .string \"Who wouldn't?$\"\n\nPokemonMansion_Text_NotQuiteYet::\n    .string \"Not quite yet!$\"\n\nPokemonMansion_1F_Text_ArnieIntro::\n    .string \"I can't get out!\\n\"\n    .string \"This old place is one big puzzle.$\"\n\nPokemonMansion_1F_Text_ArnieDefeat::\n    .string \"Oh, no!\\n\"\n    .string \"My bag of loot!$\"\n\nPokemonMansion_1F_Text_ArniePostBattle::\n    .string \"The switches here open and close\\n\"\n    .string \"alternating sets of doors.$\"\n\nPokemonMansion_1F_Text_NewMonDiscoveredInGuyanaJungle::\n    .string \"Diary: July 5\\n\"\n    .string \"Guyana, South America\\p\"\n    .string \"A new POKéMON was discovered deep\\n\"\n    .string \"in the jungle.$\"\n\nPokemonMansion_1F_Text_ChristenedDiscoveredMonMew::\n    .string \"Diary: July 10\\n\"\n    .string \"We christened the newly discovered\\l\"\n    .string \"POKéMON, MEW.$\"\n\n"
  },
  {
    "path": "data/maps/PokemonMansion_3F/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_MANSION_3F\",\n  \"name\": \"PokemonMansion_3F\",\n  \"layout\": \"LAYOUT_POKEMON_MANSION_3F\",\n  \"music\": \"MUS_POKE_MANSION\",\n  \"region_map_section\": \"MAPSEC_POKEMON_MANSION\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SHADE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_2\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BURGLAR\",\n      \"x\": 7,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"PokemonMansion_3F_EventScript_Simon\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"PokemonMansion_3F_EventScript_Braydon\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonMansion_3F_EventScript_ItemMaxPotion\",\n      \"flag\": \"FLAG_HIDE_POKEMON_MANSION_3F_MAX_POTION\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonMansion_3F_EventScript_ItemIron\",\n      \"flag\": \"FLAG_HIDE_POKEMON_MANSION_3F_IRON\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Ditto\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 34,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_2F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_1F\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_1F\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 23,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_2F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_1F\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 24,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_2F\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PokemonMansion_3F_EventScript_DiaryFeb6th\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"PokemonMansion_3F_EventScript_Statue\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 36,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"item\": \"ITEM_RARE_CANDY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_POKEMON_MANSION_3F_RARE_CANDY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/PokemonMansion_3F/scripts.inc",
    "content": ".set LOCALID_DITTO_MASTER, 5\n.set TRAINER, VAR_0x8009\n\nPokemonMansion_3F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonMansion_3F_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PokemonMansion_3F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nPokemonMansion_3F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_DITTO\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PokemonMansion_3F_MapScript_DittoMasterMovementType\n\tend\n\nPokemonMansion_3F_MapScript_DittoMasterMovementType::\n\tsetobjectmovementtype LOCALID_DITTO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPokemonMansion_3F_OnLoad::\n\tcall_if_set FLAG_POKEMON_MANSION_SWITCH_STATE, PokemonMansion_EventScript_PressSwitch_3F\n\tend\n\nPokemonMansion_3F_EventScript_Statue::\n\tlockall\n\tsetvar VAR_0x8004, 2\n\tcall PokemonMansion_EventScript_SecretSwitch\n\tplayse SE_UNLOCK\n\tspecial DrawWholeMapView\n\twaitse\n\treleaseall\n\tend\n\nPokemonMansion_3F_EventScript_DiaryFeb6th::\n\tmsgbox PokemonMansion_1F_Text_MewGaveBirthToMewtwo, MSGBOX_SIGN\n\tend\n\nPokemonMansion_3F_EventScript_Simon::\n\ttrainerbattle_single TRAINER_BURGLAR_SIMON, PokemonMansion_1F_Text_SimonIntro, PokemonMansion_1F_Text_SimonDefeat\n\tmsgbox PokemonMansion_1F_Text_SimonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonMansion_3F_EventScript_Braydon::\n\ttrainerbattle_single TRAINER_SCIENTIST_BRAYDON, PokemonMansion_1F_Text_BraydonIntro, PokemonMansion_1F_Text_BraydonDefeat\n\tmsgbox PokemonMansion_1F_Text_BraydonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/PokemonMansion_3F/text.inc",
    "content": "PokemonMansion_1F_Text_SimonIntro::\n    .string \"This place is, like, huge!$\"\n\nPokemonMansion_1F_Text_SimonDefeat::\n    .string \"Ayah!$\"\n\nPokemonMansion_1F_Text_SimonPostBattle::\n    .string \"I wonder where my partner went.$\"\n\nPokemonMansion_1F_Text_BraydonIntro::\n    .string \"My mentor once lived here.$\"\n\nPokemonMansion_1F_Text_BraydonDefeat::\n    .string \"Whew!\\n\"\n    .string \"Overwhelming!$\"\n\nPokemonMansion_1F_Text_BraydonPostBattle::\n    .string \"So, you're stuck?\\n\"\n    .string \"Try jumping off over there!$\"\n\nPokemonMansion_1F_Text_MewGaveBirthToMewtwo::\n    .string \"Diary: Feb. 6\\n\"\n    .string \"MEW gave birth.\\p\"\n    .string \"We named the newborn MEWTWO.$\"\n\n"
  },
  {
    "path": "data/maps/PokemonMansion_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_MANSION_B1F\",\n  \"name\": \"PokemonMansion_B1F\",\n  \"layout\": \"LAYOUT_POKEMON_MANSION_B1F\",\n  \"music\": \"MUS_POKE_MANSION\",\n  \"region_map_section\": \"MAPSEC_POKEMON_MANSION\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SHADE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_2\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonMansion_B1F_EventScript_ItemTM22\",\n      \"flag\": \"FLAG_HIDE_POKEMON_MANSION_B1F_TM22\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BURGLAR\",\n      \"x\": 20,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"PokemonMansion_B1F_EventScript_Lewis\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 34,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"6\",\n      \"script\": \"PokemonMansion_B1F_EventScript_Ivan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonMansion_B1F_EventScript_ItemTM14\",\n      \"flag\": \"FLAG_HIDE_POKEMON_MANSION_B1F_TM14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonMansion_B1F_EventScript_ItemFullRestore\",\n      \"flag\": \"FLAG_HIDE_POKEMON_MANSION_B1F_FULL_RESTORE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonMansion_B1F_EventScript_ItemSecretKey\",\n      \"flag\": \"FLAG_HIDE_POKEMON_MANSION_B1F_SECRET_KEY\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Mewtwo\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Mew\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 34,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_MANSION_1F\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 21,\n      \"y\": 27,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"PokemonMansion_B1F_EventScript_DiarySep1st\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 24,\n      \"y\": 29,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"PokemonMansion_B1F_EventScript_Statue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 27,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"PokemonMansion_B1F_EventScript_Statue\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 35,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ELIXIR\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_POKEMON_MANSION_B1F_ELIXIR\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/PokemonMansion_B1F/scripts.inc",
    "content": ".set LOCALID_MEWTWO_MASTER, 7\n.set LOCALID_MEW_MASTER, 8\n.set TRAINER, VAR_0x8009\n\nPokemonMansion_B1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonMansion_B1F_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PokemonMansion_B1F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nPokemonMansion_B1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_MEWTWO\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PokemonMansion_B1F_MapScript_MewtwoMasterMovementType\n\tsetvar TRAINER, MASTER_MEW\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PokemonMansion_B1F_MapScript_MewMasterMovementType\n\tend\n\nPokemonMansion_B1F_MapScript_MewtwoMasterMovementType::\n\tsetobjectmovementtype LOCALID_MEWTWO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPokemonMansion_B1F_MapScript_MewMasterMovementType::\n\tsetobjectmovementtype LOCALID_MEW_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPokemonMansion_B1F_OnLoad::\n\tcall_if_set FLAG_POKEMON_MANSION_SWITCH_STATE, PokemonMansion_EventScript_PressSwitch_B1F\n\tend\n\nPokemonMansion_B1F_EventScript_Statue::\n\tlockall\n\tsetvar VAR_0x8004, 3\n\tcall PokemonMansion_EventScript_SecretSwitch\n\tplayse SE_UNLOCK\n\tspecial DrawWholeMapView\n\twaitse\n\treleaseall\n\tend\n\nPokemonMansion_B1F_EventScript_DiarySep1st::\n\tmsgbox PokemonMansion_B1F_Text_MewtwoIsFarTooPowerful, MSGBOX_SIGN\n\tend\n\nPokemonMansion_B1F_EventScript_Lewis::\n\ttrainerbattle_single TRAINER_BURGLAR_LEWIS, PokemonMansion_B1F_Text_LewisIntro, PokemonMansion_B1F_Text_LewisDefeat\n\tmsgbox PokemonMansion_B1F_Text_LewisPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonMansion_B1F_EventScript_Ivan::\n\ttrainerbattle_single TRAINER_SCIENTIST_IVAN, PokemonMansion_B1F_Text_IvanIntro, PokemonMansion_B1F_Text_IvanDefeat\n\tmsgbox PokemonMansion_B1F_Text_IvanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/PokemonMansion_B1F/text.inc",
    "content": "PokemonMansion_B1F_Text_LewisIntro::\n    .string \"Uh-oh…\\n\"\n    .string \"Where am I now?$\"\n\nPokemonMansion_B1F_Text_LewisDefeat::\n    .string \"Awooh!$\"\n\nPokemonMansion_B1F_Text_LewisPostBattle::\n    .string \"You can find stuff lying around.\\n\"\n    .string \"The residents must've left them.$\"\n\nPokemonMansion_B1F_Text_IvanIntro::\n    .string \"This place is ideal for a lab.\\n\"\n    .string \"Look at all this space.$\"\n\nPokemonMansion_B1F_Text_IvanDefeat::\n    .string \"What was that for?$\"\n\nPokemonMansion_B1F_Text_IvanPostBattle::\n    .string \"I like it here.\\n\"\n    .string \"It's conducive to my studies.$\"\n\nPokemonMansion_B1F_Text_MewtwoIsFarTooPowerful::\n    .string \"Diary: Sept. 1\\n\"\n    .string \"MEWTWO is far too powerful.\\p\"\n    .string \"We have failed to curb its vicious\\n\"\n    .string \"tendencies…$\"\n\n"
  },
  {
    "path": "data/maps/PokemonTower_1F/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_TOWER_1F\",\n  \"name\": \"PokemonTower_1F\",\n  \"layout\": \"LAYOUT_POKEMON_TOWER_1F\",\n  \"music\": \"MUS_POKE_TOWER\",\n  \"region_map_section\": \"MAPSEC_POKEMON_TOWER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_1F_EventScript_WorkerF\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_1F_EventScript_Channeler\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_1F_EventScript_Woman1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_3\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_1F_EventScript_Woman2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_1F_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_LAVENDER_TOWN\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_TOWER_2F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/PokemonTower_1F/scripts.inc",
    "content": "PokemonTower_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PokemonTower_1F_OnTransition\n\t.byte 0\n\nPokemonTower_1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_POKEMON_TOWER_1F\n\tend\n\nPokemonTower_1F_EventScript_Channeler::\n\tmsgbox PokemonTower_1F_Text_SenseSpiritsUpToMischief, MSGBOX_NPC\n\tend\n\nPokemonTower_1F_EventScript_Woman1::\n\tmsgbox PokemonTower_1F_Text_GrowlitheWhyDidYouDie, MSGBOX_NPC\n\tend\n\nPokemonTower_1F_EventScript_BaldingMan::\n\tmsgbox PokemonTower_1F_Text_CameToPrayForDepartedClefairy, MSGBOX_NPC\n\tend\n\nPokemonTower_1F_EventScript_Woman2::\n\tlock\n\tfaceplayer\n\tcheckplayergender\n\tgoto_if_eq VAR_RESULT, MALE, PokemonTower_1F_EventScript_Woman2MalePlayer\n\tmsgbox PokemonTower_1F_Text_ComeToPayRespectsGirl\n\trelease\n\tend\n\nPokemonTower_1F_EventScript_Woman2MalePlayer::\n\tmsgbox PokemonTower_1F_Text_ComeToPayRespectsSon\n\trelease\n\tend\n\nPokemonTower_1F_EventScript_WorkerF::\n\tmsgbox PokemonTower_1F_Text_ErectedInMemoryOfDeadMons, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/PokemonTower_1F/text.inc",
    "content": "PokemonTower_1F_Text_ErectedInMemoryOfDeadMons::\n    .string \"POKéMON TOWER was erected in the\\n\"\n    .string \"memory of POKéMON that died.$\"\n\nPokemonTower_1F_Text_ComeToPayRespectsSon::\n    .string \"Did you come to pay respects?\\p\"\n    .string \"Bless your POKéMON-loving heart,\\n\"\n    .string \"son.$\"\n\nPokemonTower_1F_Text_ComeToPayRespectsGirl::\n    .string \"Did you come to pay respects?\\p\"\n    .string \"Bless your POKéMON-loving heart,\\n\"\n    .string \"girl.$\"\n\nPokemonTower_1F_Text_CameToPrayForDepartedClefairy::\n    .string \"I came to pray for my dearly\\n\"\n    .string \"departed CLEFAIRY.\\p\"\n    .string \"Sniff!\\n\"\n    .string \"I'm awash in tears…$\"\n\nPokemonTower_1F_Text_GrowlitheWhyDidYouDie::\n    .string \"My GROWLITHE…\\n\"\n    .string \"Why did you die?$\"\n\nPokemonTower_1F_Text_SenseSpiritsUpToMischief::\n    .string \"I am a CHANNELER.\\p\"\n    .string \"There are spirits up to mischief.\\n\"\n    .string \"I sense them high in the TOWER.$\"\n\n"
  },
  {
    "path": "data/maps/PokemonTower_2F/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_TOWER_2F\",\n  \"name\": \"PokemonTower_2F\",\n  \"layout\": \"LAYOUT_POKEMON_TOWER_2F\",\n  \"music\": \"MUS_POKE_TOWER\",\n  \"region_map_section\": \"MAPSEC_POKEMON_TOWER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLUE\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_TOWER_RIVAL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_2F_EventScript_Channeler\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_TOWER_3F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_TOWER_1F\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 17,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_POKEMON_TOWER_2F\",\n      \"var_value\": \"0\",\n      \"script\": \"PokemonTower_2F_EventScript_RivalTriggerRight\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 16,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_POKEMON_TOWER_2F\",\n      \"var_value\": \"0\",\n      \"script\": \"PokemonTower_2F_EventScript_RivalTriggerDown\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/PokemonTower_2F/scripts.inc",
    "content": ".set LOCALID_RIVAL, 1\n\nPokemonTower_2F_MapScripts::\n\t.byte 0\n\nPokemonTower_2F_EventScript_Channeler::\n\tmsgbox PokemonTower_2F_Text_SilphScopeCouldUnmaskGhosts, MSGBOX_NPC\n\tend\n\nPokemonTower_2F_EventScript_RivalTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto PokemonTower_2F_EventScript_Rival\n\tend\n\nPokemonTower_2F_EventScript_RivalTriggerDown::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto PokemonTower_2F_EventScript_Rival\n\tend\n\nPokemonTower_2F_EventScript_Rival::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\tcall_if_eq VAR_TEMP_1, 0, PokemonTower_2F_EventScript_RivalFacePlayerRight\n\tcall_if_eq VAR_TEMP_1, 1, PokemonTower_2F_EventScript_RivalFacePlayerDown\n\tapplymovement LOCALID_RIVAL, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_RIVAL, Common_Movement_Delay48\n\twaitmovement 0\n\tmsgbox PokemonTower_2F_Text_RivalIntro\n\tsetvar VAR_LAST_TALKED, LOCALID_RIVAL\n\tcall_if_eq VAR_STARTER_MON, 2, PokemonTower_2F_EventScript_RivalSquirtle\n\tcall_if_eq VAR_STARTER_MON, 1, PokemonTower_2F_EventScript_RivalBulbasaur\n\tcall_if_eq VAR_STARTER_MON, 0, PokemonTower_2F_EventScript_RivalCharmander\n\tmsgbox PokemonTower_2F_Text_RivalPostBattle\n\tclosemessage\n\tplaybgm MUS_RIVAL_EXIT, 0\n\tcall_if_eq VAR_TEMP_1, 0, PokemonTower_2F_EventScript_RivalExitRight\n\tcall_if_eq VAR_TEMP_1, 1, PokemonTower_2F_EventScript_RivalExitDown\n\tplayse SE_EXIT\n\tdelay 25\n\tfadedefaultbgm\n\tremoveobject LOCALID_RIVAL\n\tsetvar VAR_MAP_SCENE_POKEMON_TOWER_2F, 1\n\treleaseall\n\tend\n\nPokemonTower_2F_EventScript_RivalFacePlayerRight::\n\tapplymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterRight\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treturn\n\nPokemonTower_2F_EventScript_RivalFacePlayerDown::\n\tapplymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\treturn\n\nPokemonTower_2F_EventScript_RivalSquirtle::\n\ttrainerbattle_no_intro TRAINER_RIVAL_POKEMON_TOWER_SQUIRTLE, PokemonTower_2F_Text_RivalDefeat\n\treturn\n\nPokemonTower_2F_EventScript_RivalBulbasaur::\n\ttrainerbattle_no_intro TRAINER_RIVAL_POKEMON_TOWER_BULBASAUR, PokemonTower_2F_Text_RivalDefeat\n\treturn\n\nPokemonTower_2F_EventScript_RivalCharmander::\n\ttrainerbattle_no_intro TRAINER_RIVAL_POKEMON_TOWER_CHARMANDER, PokemonTower_2F_Text_RivalDefeat\n\treturn\n\nPokemonTower_2F_EventScript_RivalExitRight::\n\tapplymovement LOCALID_RIVAL, PokemonTower_2F_Movement_RivalExitRight\n\twaitmovement 0\n\treturn\n\nPokemonTower_2F_EventScript_RivalExitDown::\n\tapplymovement LOCALID_RIVAL, PokemonTower_2F_Movement_RivalExitDown\n\twaitmovement 0\n\treturn\n\nPokemonTower_2F_Movement_RivalExitRight::\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_in_place_faster_right\n\tstep_end\n\nPokemonTower_2F_Movement_RivalExitDown::\n\twalk_right\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_in_place_faster_right\n\tstep_end\n"
  },
  {
    "path": "data/maps/PokemonTower_2F/text.inc",
    "content": "PokemonTower_2F_Text_RivalIntro::\n    .string \"{RIVAL}: Hey, {PLAYER}!\\n\"\n    .string \"What brings you here?\\l\"\n    .string \"Is your POKéMON dead?\\p\"\n    .string \"Hey! It's alive!\\p\"\n    .string \"I can at least make them faint!\\n\"\n    .string \"Let's go!$\"\n\nPokemonTower_2F_Text_RivalDefeat::\n    .string \"What?\\n\"\n    .string \"You stinker!\\p\"\n    .string \"I took it easy on you, too!$\"\n\nPokemonTower_2F_Text_RivalPostBattle::\n    .string \"How's your POKéDEX coming?\\n\"\n    .string \"I just caught a CUBONE!\\p\"\n    .string \"I can't find the bigger MAROWAK.\\n\"\n    .string \"Where could they be?\\p\"\n    .string \"I bet there aren't any left!\\p\"\n    .string \"Well, I better get going.\\n\"\n    .string \"I've got a lot to accomplish,\\l\"\n    .string \"unlike you.\\p\"\n    .string \"Smell ya later!$\"\n\nPokemonTower_2F_Text_SilphScopeCouldUnmaskGhosts::\n    .string \"Even we could not identify the\\n\"\n    .string \"wayward ghosts.\\p\"\n    .string \"A SILPH SCOPE might be able to\\n\"\n    .string \"unmask them.$\"\n\n"
  },
  {
    "path": "data/maps/PokemonTower_3F/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_TOWER_3F\",\n  \"name\": \"PokemonTower_3F\",\n  \"layout\": \"LAYOUT_POKEMON_TOWER_3F\",\n  \"music\": \"MUS_POKE_TOWER\",\n  \"region_map_section\": \"MAPSEC_POKEMON_TOWER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"PokemonTower_3F_EventScript_Patricia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"PokemonTower_3F_EventScript_Carly\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"PokemonTower_3F_EventScript_Hope\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_3F_EventScript_ItemEscapeRope\",\n      \"flag\": \"FLAG_HIDE_POKEMON_TOWER_3F_ESCAPE_ROPE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_TOWER_2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_TOWER_4F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/PokemonTower_3F/scripts.inc",
    "content": "PokemonTower_3F_MapScripts::\n\t.byte 0\n\nPokemonTower_3F_EventScript_Patricia::\n\ttrainerbattle_single TRAINER_CHANNELER_PATRICIA, PokemonTower_3F_Text_PatriciaIntro, PokemonTower_3F_Text_PatriciaDefeat\n\tmsgbox PokemonTower_3F_Text_PatriciaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonTower_3F_EventScript_Carly::\n\ttrainerbattle_single TRAINER_CHANNELER_CARLY, PokemonTower_3F_Text_CarlyIntro, PokemonTower_3F_Text_CarlyDefeat\n\tmsgbox PokemonTower_3F_Text_CarlyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonTower_3F_EventScript_Hope::\n\ttrainerbattle_single TRAINER_CHANNELER_HOPE, PokemonTower_3F_Text_HopeIntro, PokemonTower_3F_Text_HopeDefeat\n\tmsgbox PokemonTower_3F_Text_HopePostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/PokemonTower_3F/text.inc",
    "content": "PokemonTower_3F_Text_HopeIntro::\n    .string \"Urrg… Awaa…\\n\"\n    .string \"Huhu… Graa…$\"\n\nPokemonTower_3F_Text_HopeDefeat::\n    .string \"Hwa!\\n\"\n    .string \"I'm saved!$\"\n\nPokemonTower_3F_Text_HopePostBattle::\n    .string \"The ghosts can be identified by\\n\"\n    .string \"the SILPH SCOPE.$\"\n\nPokemonTower_3F_Text_CarlyIntro::\n    .string \"Kekeke…\\n\"\n    .string \"Kwaaah!$\"\n\nPokemonTower_3F_Text_CarlyDefeat::\n    .string \"Hmm?\\n\"\n    .string \"What am I doing?$\"\n\nPokemonTower_3F_Text_CarlyPostBattle::\n    .string \"Sorry!\\n\"\n    .string \"I was possessed!$\"\n\nPokemonTower_3F_Text_PatriciaIntro::\n    .string \"Be gone!\\n\"\n    .string \"Malevolent spirit!$\"\n\nPokemonTower_3F_Text_PatriciaDefeat::\n    .string \"Whew!\\n\"\n    .string \"The spirit left!$\"\n\nPokemonTower_3F_Text_PatriciaPostBattle::\n    .string \"The others above…\\n\"\n    .string \"They must have been possessed.$\"\n\n"
  },
  {
    "path": "data/maps/PokemonTower_4F/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_TOWER_4F\",\n  \"name\": \"PokemonTower_4F\",\n  \"layout\": \"LAYOUT_POKEMON_TOWER_4F\",\n  \"music\": \"MUS_POKE_TOWER\",\n  \"region_map_section\": \"MAPSEC_POKEMON_TOWER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"PokemonTower_4F_EventScript_Laurel\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"PokemonTower_4F_EventScript_Jody\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"PokemonTower_4F_EventScript_Paula\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_4F_EventScript_ItemElixir\",\n      \"flag\": \"FLAG_HIDE_POKEMON_TOWER_4F_ELIXIR\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_4F_EventScript_ItemAwakening\",\n      \"flag\": \"FLAG_HIDE_POKEMON_TOWER_4F_AWAKENING\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_4F_EventScript_ItemGreatBall\",\n      \"flag\": \"FLAG_HIDE_POKEMON_TOWER_4F_GREAT_BALL\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Lapras\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_TOWER_5F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_TOWER_3F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/PokemonTower_4F/scripts.inc",
    "content": ".set LOCALID_LAPRAS_MASTER, 7\n.set TRAINER, VAR_0x8009\n\nPokemonTower_4F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PokemonTower_4F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nPokemonTower_4F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_LAPRAS\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PokemonTower_4F_MapScript_LaprasMasterMovementType\n\tend\n\nPokemonTower_4F_MapScript_LaprasMasterMovementType::\n\tsetobjectmovementtype LOCALID_LAPRAS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPokemonTower_4F_EventScript_Paula::\n\ttrainerbattle_single TRAINER_CHANNELER_PAULA, PokemonTower_4F_Text_PaulaIntro, PokemonTower_4F_Text_PaulaDefeat\n\tmsgbox PokemonTower_4F_Text_PaulaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonTower_4F_EventScript_Laurel::\n\ttrainerbattle_single TRAINER_CHANNELER_LAUREL, PokemonTower_4F_Text_LaurelIntro, PokemonTower_4F_Text_LaurelDefeat\n\tmsgbox PokemonTower_4F_Text_LaurelPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonTower_4F_EventScript_Jody::\n\ttrainerbattle_single TRAINER_CHANNELER_JODY, PokemonTower_4F_Text_JodyIntro, PokemonTower_4F_Text_JodyDefeat\n\tmsgbox PokemonTower_4F_Text_JodyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/PokemonTower_4F/text.inc",
    "content": "PokemonTower_4F_Text_PaulaIntro::\n    .string \"Ghost! No!\\n\"\n    .string \"Kwaaah!$\"\n\nPokemonTower_4F_Text_PaulaDefeat::\n    .string \"Where is the ghost?$\"\n\nPokemonTower_4F_Text_PaulaPostBattle::\n    .string \"I must have been dreaming…$\"\n\nPokemonTower_4F_Text_LaurelIntro::\n    .string \"Be cursed with me!\\n\"\n    .string \"Kwaaah!$\"\n\nPokemonTower_4F_Text_LaurelDefeat::\n    .string \"What!$\"\n\nPokemonTower_4F_Text_LaurelPostBattle::\n    .string \"We can't determine the identity of\\n\"\n    .string \"the ghosts…$\"\n\nPokemonTower_4F_Text_JodyIntro::\n    .string \"Huhuhu…\\n\"\n    .string \"Beat me not!$\"\n\nPokemonTower_4F_Text_JodyDefeat::\n    .string \"Huh?\\n\"\n    .string \"Who? What?$\"\n\nPokemonTower_4F_Text_JodyPostBattle::\n    .string \"May the departed POKéMON rest in\\n\"\n    .string \"peace…$\"\n\n"
  },
  {
    "path": "data/maps/PokemonTower_5F/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_TOWER_5F\",\n  \"name\": \"PokemonTower_5F\",\n  \"layout\": \"LAYOUT_POKEMON_TOWER_5F\",\n  \"music\": \"MUS_POKE_TOWER\",\n  \"region_map_section\": \"MAPSEC_POKEMON_TOWER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"PokemonTower_5F_EventScript_Ruth\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"PokemonTower_5F_EventScript_Tammy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"PokemonTower_5F_EventScript_Karina\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"PokemonTower_5F_EventScript_Janae\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_5F_EventScript_Channeler\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_5F_EventScript_ItemNugget\",\n      \"flag\": \"FLAG_HIDE_POKEMON_TOWER_5F_NUGGET\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_5F_EventScript_ItemCleanseTag\",\n      \"flag\": \"FLAG_HIDE_POKEMON_TOWER_5F_CLEANSE_TAG\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_PSYCHIC_M\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Hypno\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_TOWER_4F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_TOWER_6F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"PokemonTower_5F_EventScript_PurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"PokemonTower_5F_EventScript_PurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"PokemonTower_5F_EventScript_PurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"PokemonTower_5F_EventScript_PurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"1\",\n      \"script\": \"PokemonTower_5F_EventScript_ExitPurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"PokemonTower_5F_EventScript_PurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"PokemonTower_5F_EventScript_PurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"PokemonTower_5F_EventScript_PurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"PokemonTower_5F_EventScript_PurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"1\",\n      \"script\": \"PokemonTower_5F_EventScript_ExitPurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"1\",\n      \"script\": \"PokemonTower_5F_EventScript_ExitPurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"1\",\n      \"script\": \"PokemonTower_5F_EventScript_ExitPurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"1\",\n      \"script\": \"PokemonTower_5F_EventScript_ExitPurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"1\",\n      \"script\": \"PokemonTower_5F_EventScript_ExitPurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"1\",\n      \"script\": \"PokemonTower_5F_EventScript_ExitPurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"1\",\n      \"script\": \"PokemonTower_5F_EventScript_ExitPurifiedZone\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"1\",\n      \"script\": \"PokemonTower_5F_EventScript_ExitPurifiedZone\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 7,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"item\": \"ITEM_BIG_MUSHROOM\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_POKEMON_TOWER_5F_BIG_MUSHROOM\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/PokemonTower_5F/scripts.inc",
    "content": ".set LOCALID_HYPNO_MASTER, 8\n.set TRAINER, VAR_0x8009\n\nPokemonTower_5F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PokemonTower_5F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nPokemonTower_5F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_HYPNO\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PokemonTower_5F_MapScript_HypnoMasterMovementType\n\tend\n\nPokemonTower_5F_MapScript_HypnoMasterMovementType::\n\tsetobjectmovementtype LOCALID_HYPNO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPokemonTower_5F_EventScript_Channeler::\n\tmsgbox PokemonTower_5F_Text_RestHereInPurifiedSpace, MSGBOX_NPC\n\tend\n\nPokemonTower_5F_EventScript_PurifiedZone::\n\tlockall\n\tfadescreen FADE_TO_WHITE\n\tspecial HealPlayerParty\n\tfadescreen FADE_FROM_WHITE\n\tmsgbox PokemonTower_5F_Text_PurifiedZoneMonsFullyHealed\n\tsetvar VAR_TEMP_1, 1\n\treleaseall\n\tend\n\nPokemonTower_5F_EventScript_ExitPurifiedZone::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\treleaseall\n\tend\n\nPokemonTower_5F_EventScript_Tammy::\n\ttrainerbattle_single TRAINER_CHANNELER_TAMMY, PokemonTower_5F_Text_TammyIntro, PokemonTower_5F_Text_TammyDefeat\n\tmsgbox PokemonTower_5F_Text_TammyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonTower_5F_EventScript_Ruth::\n\ttrainerbattle_single TRAINER_CHANNELER_RUTH, PokemonTower_5F_Text_RuthIntro, PokemonTower_5F_Text_RuthDefeat\n\tmsgbox PokemonTower_5F_Text_RuthPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonTower_5F_EventScript_Karina::\n\ttrainerbattle_single TRAINER_CHANNELER_KARINA, PokemonTower_5F_Text_KarinaIntro, PokemonTower_5F_Text_KarinaDefeat\n\tmsgbox PokemonTower_5F_Text_KarinaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonTower_5F_EventScript_Janae::\n\ttrainerbattle_single TRAINER_CHANNELER_JANAE, PokemonTower_5F_Text_JanaeIntro, PokemonTower_5F_Text_JanaeDefeat\n\tmsgbox PokemonTower_5F_Text_JanaePostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/PokemonTower_5F/text.inc",
    "content": "PokemonTower_5F_Text_RestHereInPurifiedSpace::\n    .string \"Come, child!\\n\"\n    .string \"I have purified this space.\\l\"\n    .string \"You can rest here.$\"\n\nPokemonTower_5F_Text_TammyIntro::\n    .string \"Give…me…\\n\"\n    .string \"your…all…$\"\n\nPokemonTower_5F_Text_TammyDefeat::\n    .string \"Gasp!$\"\n\nPokemonTower_5F_Text_TammyPostBattle::\n    .string \"I was under possession.$\"\n\nPokemonTower_5F_Text_RuthIntro::\n    .string \"You…shall…\\n\"\n    .string \"join…us…$\"\n\nPokemonTower_5F_Text_RuthDefeat::\n    .string \"What a nightmare!$\"\n\nPokemonTower_5F_Text_RuthPostBattle::\n    .string \"I was possessed.$\"\n\nPokemonTower_5F_Text_KarinaIntro::\n    .string \"Zombies!$\"\n\nPokemonTower_5F_Text_KarinaDefeat::\n    .string \"Ha?$\"\n\nPokemonTower_5F_Text_KarinaPostBattle::\n    .string \"I regained my senses.$\"\n\nPokemonTower_5F_Text_JanaeIntro::\n    .string \"Urgah…\\n\"\n    .string \"Urff…$\"\n\nPokemonTower_5F_Text_JanaeDefeat::\n    .string \"Whoo!$\"\n\nPokemonTower_5F_Text_JanaePostBattle::\n    .string \"I fell to evil spirits despite my\\n\"\n    .string \"training in the mountains…$\"\n\nPokemonTower_5F_Text_PurifiedZoneMonsFullyHealed::\n    .string \"Entered the purified and protected\\n\"\n    .string \"zone.\\p\"\n    .string \"{PLAYER}'s POKéMON were fully\\n\"\n    .string \"healed.$\"\n\n"
  },
  {
    "path": "data/maps/PokemonTower_6F/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_TOWER_6F\",\n  \"name\": \"PokemonTower_6F\",\n  \"layout\": \"LAYOUT_POKEMON_TOWER_6F\",\n  \"music\": \"MUS_POKE_TOWER\",\n  \"region_map_section\": \"MAPSEC_POKEMON_TOWER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"PokemonTower_6F_EventScript_Angelica\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"PokemonTower_6F_EventScript_Jennifer\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"PokemonTower_6F_EventScript_Emilia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_6F_EventScript_ItemRareCandy\",\n      \"flag\": \"FLAG_HIDE_POKEMON_TOWER_6F_RARE_CANDY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_6F_EventScript_ItemXAccuracy\",\n      \"flag\": \"FLAG_HIDE_POKEMON_TOWER_6F_X_ACCURACY\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Raichu\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_TOWER_7F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_TOWER_5F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_POKEMON_TOWER_6F\",\n      \"var_value\": \"0\",\n      \"script\": \"PokemonTower_6F_EventScript_MarowakGhost\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_POKEMON_TOWER_6F\",\n      \"var_value\": \"0\",\n      \"script\": \"PokemonTower_6F_EventScript_MarowakGhost\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/PokemonTower_6F/scripts.inc",
    "content": ".set LOCALID_RAICHU_MASTER, 6\n.set TRAINER, VAR_0x8009\n\nPokemonTower_6F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PokemonTower_6F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nPokemonTower_6F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_RAICHU\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PokemonTower_6F_MapScript_RaichuMasterMovementType\n\tend\n\nPokemonTower_6F_MapScript_RaichuMasterMovementType::\n\tsetobjectmovementtype LOCALID_RAICHU_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPokemonTower_6F_EventScript_MarowakGhost::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MON\n\tmsgbox PokemonTower_6F_Text_BeGoneIntruders\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tsetwildbattle SPECIES_MAROWAK, 30\n\tspecial StartMarowakBattle\n\twaitstate\n\tspecial QuestLog_CutRecording\n\tgoto_if_eq VAR_RESULT, FALSE, PokemonTower_6F_EventScript_DefeatedMarowakGhost  @ VAR_RESULT set by CB2_EndMarowakBattle\n\tapplymovement OBJ_EVENT_ID_PLAYER, PokemonTower_6F_Movement_ForcePlayerUp\n\twaitmovement 0\n\treleaseall\n\tend\n\nPokemonTower_6F_EventScript_DefeatedMarowakGhost::\n\tmessage PokemonTower_6F_Text_GhostWasCubonesMother\n\twaitmessage\n\twaitse\n\tplaymoncry SPECIES_MAROWAK, CRY_MODE_NORMAL\n\twaitbuttonpress\n\twaitmoncry\n\tmsgbox PokemonTower_6F_Text_MothersSpiritWasCalmed\n\tsetvar VAR_MAP_SCENE_POKEMON_TOWER_6F, 1\n\treleaseall\n\tend\n\nPokemonTower_6F_Movement_ForcePlayerUp::\n\twalk_up\n\tstep_end\n\nPokemonTower_6F_EventScript_Angelica::\n\ttrainerbattle_single TRAINER_CHANNELER_ANGELICA, PokemonTower_6F_Text_AngelicaIntro, PokemonTower_6F_Text_AngelicaDefeat\n\tmsgbox PokemonTower_6F_Text_AngelicaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonTower_6F_EventScript_Emilia::\n\ttrainerbattle_single TRAINER_CHANNELER_EMILIA, PokemonTower_6F_Text_EmiliaIntro, PokemonTower_6F_Text_EmiliaDefeat\n\tmsgbox PokemonTower_6F_Text_EmiliaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonTower_6F_EventScript_Jennifer::\n\ttrainerbattle_single TRAINER_CHANNELER_JENNIFER, PokemonTower_6F_Text_JenniferIntro, PokemonTower_6F_Text_JenniferDefeat\n\tmsgbox PokemonTower_6F_Text_JenniferPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/PokemonTower_6F/text.inc",
    "content": "PokemonTower_6F_Text_AngelicaIntro::\n    .string \"Give…me…\\n\"\n    .string \"blood…$\"\n\nPokemonTower_6F_Text_AngelicaDefeat::\n    .string \"Groan!$\"\n\nPokemonTower_6F_Text_AngelicaPostBattle::\n    .string \"I feel anemic and weak…$\"\n\nPokemonTower_6F_Text_EmiliaIntro::\n    .string \"Urff…\\n\"\n    .string \"Kwaah!$\"\n\nPokemonTower_6F_Text_EmiliaDefeat::\n    .string \"Something fell out!$\"\n\nPokemonTower_6F_Text_EmiliaPostBattle::\n    .string \"My hair didn't fall out!\\n\"\n    .string \"It was a malevolent spirit!$\"\n\nPokemonTower_6F_Text_JenniferIntro::\n    .string \"Ke…ke…ke…\\n\"\n    .string \"ke…ke…ke!$\"\n\nPokemonTower_6F_Text_JenniferDefeat::\n    .string \"Keee!$\"\n\nPokemonTower_6F_Text_JenniferPostBattle::\n    .string \"What's going on here?$\"\n\nPokemonTower_6F_Text_BeGoneIntruders::\n    .string \"Be gone…\\n\"\n    .string \"Intruders…$\"\n\nPokemonTower_6F_Text_GhostWasCubonesMother::\n    .string \"The ghost was the restless spirit\\n\"\n    .string \"of CUBONE's mother!$\"\n\nPokemonTower_6F_Text_MothersSpiritWasCalmed::\n    .string \"The mother's spirit was calmed.\\p\"\n    .string \"It departed to the afterlife…$\"\n\n"
  },
  {
    "path": "data/maps/PokemonTower_7F/map.json",
    "content": "{\n  \"id\": \"MAP_POKEMON_TOWER_7F\",\n  \"name\": \"PokemonTower_7F\",\n  \"layout\": \"LAYOUT_POKEMON_TOWER_7F\",\n  \"music\": \"MUS_POKE_TOWER\",\n  \"region_map_section\": \"MAPSEC_POKEMON_TOWER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_FOG_HORIZONTAL\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MR_FUJI\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PokemonTower_7F_EventScript_MrFuji\",\n      \"flag\": \"FLAG_HIDE_TOWER_FUJI\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"PokemonTower_7F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_TOWER_ROCKET_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"PokemonTower_7F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_TOWER_ROCKET_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"PokemonTower_7F_EventScript_Grunt3\",\n      \"flag\": \"FLAG_HIDE_TOWER_ROCKET_3\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Weepinbell\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POKEMON_TOWER_6F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 11,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"item\": \"ITEM_SOOTHE_BELL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_POKEMON_TOWER_7F_SOOTHE_BELL\",\n      \"quantity\": 1,\n      \"underfoot\": true\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/PokemonTower_7F/scripts.inc",
    "content": ".set LOCALID_GRUNT1, 2\n.set LOCALID_GRUNT2, 3\n.set LOCALID_GRUNT3, 4\n.set LOCALID_WEEPINBELL_MASTER, 5\n.set TRAINER, VAR_0x8009\n\nPokemonTower_7F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PokemonTower_7F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nPokemonTower_7F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_WEEPINBELL\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PokemonTower_7F_MapScript_WeepinbellMasterMovementType\n\tend\n\nPokemonTower_7F_MapScript_WeepinbellMasterMovementType::\n\tsetobjectmovementtype LOCALID_WEEPINBELL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPokemonTower_7F_EventScript_MrFuji::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_MRFUJI, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tsetflag FLAG_HIDE_TOWER_FUJI\n\tclearflag FLAG_HIDE_POKEHOUSE_FUJI\n\tsetflag FLAG_RESCUED_MR_FUJI\n\tmsgbox PokemonTower_7F_Text_MrFujiThankYouFollowMe\n\tclosemessage\n\twarp MAP_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE, 4, 7\n\twaitstate\n\trelease\n\tend\n\nPokemonTower_7F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_19, PokemonTower_7F_Text_Grunt1Intro, PokemonTower_7F_Text_Grunt1Defeat, PokemonTower_7F_EventScript_DefeatedGrunt1\n\tmsgbox PokemonTower_7F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonTower_7F_EventScript_DefeatedGrunt1::\n\tmsgbox PokemonTower_7F_Text_Grunt1PostBattle\n\tclosemessage\n\tgetplayerxy VAR_0x8004, VAR_0x8005\n\tgoto_if_eq VAR_0x8004, 10, PokemonTower_7F_EventScript_Grunt1ExitMid\n\tgoto_if_eq VAR_0x8004, 11, PokemonTower_7F_EventScript_Grunt1ExitRight\n\tgoto_if_eq VAR_0x8004, 9, PokemonTower_7F_EventScript_Grunt1ExitLeft\n\tapplymovement LOCALID_GRUNT1, PokemonTower_7F_Movement_Grunt1Exit\n\twaitmovement 0\n\tgoto PokemonTower_7F_EventScript_RemoveGrunt1\n\tend\n\nPokemonTower_7F_EventScript_Grunt1ExitMid::\n\tapplymovement LOCALID_GRUNT1, PokemonTower_7F_Movement_Grunt1ExitMid\n\twaitmovement 0\n\tgoto PokemonTower_7F_EventScript_RemoveGrunt1\n\tend\n\nPokemonTower_7F_EventScript_Grunt1ExitRight::\n\tapplymovement LOCALID_GRUNT1, PokemonTower_7F_Movement_Grunt1ExitRight\n\twaitmovement 0\n\tgoto PokemonTower_7F_EventScript_RemoveGrunt1\n\tend\n\nPokemonTower_7F_EventScript_Grunt1ExitLeft::\n\tapplymovement LOCALID_GRUNT1, PokemonTower_7F_Movement_Grunt1ExitLeft\n\twaitmovement 0\n\tplayse SE_EXIT\n\tdelay 25\n\tgoto PokemonTower_7F_EventScript_RemoveGrunt1\n\tend\n\nPokemonTower_7F_EventScript_RemoveGrunt1::\n\tremoveobject LOCALID_GRUNT1\n\trelease\n\tend\n\nPokemonTower_7F_Movement_Grunt1ExitMid::\n\twalk_down\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_down\n\twalk_down\n\tstep_end\n\nPokemonTower_7F_Movement_Grunt1ExitRight::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_down\n\twalk_down\n\tstep_end\n\nPokemonTower_7F_Movement_Grunt1Exit::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nPokemonTower_7F_Movement_Grunt1ExitLeft::\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_in_place_faster_left\n\tstep_end\n\nPokemonTower_7F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_20, PokemonTower_7F_Text_Grunt2Intro, PokemonTower_7F_Text_Grunt2Defeat, PokemonTower_7F_EventScript_DefeatedGrunt2\n\tmsgbox PokemonTower_7F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonTower_7F_EventScript_DefeatedGrunt2::\n\tfamechecker FAMECHECKER_MRFUJI, 1\n\tmsgbox PokemonTower_7F_Text_Grunt2PostBattle\n\tclosemessage\n\tgetplayerxy VAR_0x8004, VAR_0x8005\n\tgoto_if_eq VAR_0x8004, 12, PokemonTower_7F_EventScript_Grunt2ExitLeft\n\tgoto_if_eq VAR_0x8004, 13, PokemonTower_7F_EventScript_Grunt2ExitRight\n\tapplymovement LOCALID_GRUNT2, PokemonTower_7F_Movement_Grunt2Exit\n\twaitmovement 0\n\tgoto PokemonTower_7F_EventScript_RemoveGrunt2\n\tend\n\nPokemonTower_7F_EventScript_Grunt2ExitLeft::\n\tapplymovement LOCALID_GRUNT2, PokemonTower_7F_Movement_Grunt2ExitLeft\n\twaitmovement 0\n\tgoto PokemonTower_7F_EventScript_RemoveGrunt2\n\tend\n\nPokemonTower_7F_EventScript_Grunt2ExitRight::\n\tapplymovement LOCALID_GRUNT2, PokemonTower_7F_Movement_Grunt2ExitRight\n\twaitmovement 0\n\tgoto PokemonTower_7F_EventScript_RemoveGrunt2\n\tend\n\nPokemonTower_7F_EventScript_RemoveGrunt2::\n\tremoveobject LOCALID_GRUNT2\n\trelease\n\tend\n\nPokemonTower_7F_Movement_Grunt2ExitLeft::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_left\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nPokemonTower_7F_Movement_Grunt2Exit::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nPokemonTower_7F_Movement_Grunt2ExitRight::\n\twalk_left\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nPokemonTower_7F_EventScript_Grunt3::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_21, PokemonTower_7F_Text_Grunt3Intro, PokemonTower_7F_Text_Grunt3Defeat, PokemonTower_7F_EventScript_DefeatedGrunt3\n\tmsgbox PokemonTower_7F_Text_Grunt3PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nPokemonTower_7F_EventScript_DefeatedGrunt3::\n\tmsgbox PokemonTower_7F_Text_Grunt3PostBattle\n\tclosemessage\n\tgetplayerxy VAR_0x8004, VAR_0x8005\n\tgoto_if_eq VAR_0x8004, 10, PokemonTower_7F_EventScript_Grunt3ExitRight\n\tgoto_if_eq VAR_0x8004, 9, PokemonTower_7F_EventScript_Grunt3ExitLeft\n\tapplymovement LOCALID_GRUNT3, PokemonTower_7F_Movement_Grunt3Exit\n\twaitmovement 0\n\tgoto PokemonTower_7F_EventScript_RemoveGrunt3\n\tend\n\nPokemonTower_7F_EventScript_Grunt3ExitRight::\n\tapplymovement LOCALID_GRUNT3, PokemonTower_7F_Movement_Grunt3ExitRight\n\twaitmovement 0\n\tgoto PokemonTower_7F_EventScript_RemoveGrunt3\n\tend\n\nPokemonTower_7F_EventScript_Grunt3ExitLeft::\n\tapplymovement LOCALID_GRUNT3, PokemonTower_7F_Movement_Grunt3ExitLeft\n\twaitmovement 0\n\tgoto PokemonTower_7F_EventScript_RemoveGrunt3\n\tend\n\nPokemonTower_7F_EventScript_RemoveGrunt3::\n\tremoveobject LOCALID_GRUNT3\n\trelease\n\tend\n\nPokemonTower_7F_EventScript_Unused::\n\trelease\n\tend\n\nPokemonTower_7F_Movement_Grunt3ExitRight::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_down\n\tstep_end\n\nPokemonTower_7F_Movement_Grunt3Exit::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nPokemonTower_7F_Movement_Grunt3ExitLeft::\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/PokemonTower_7F/text.inc",
    "content": "PokemonTower_7F_Text_Grunt1Intro::\n    .string \"What do you want?\\n\"\n    .string \"Why are you here?$\"\n\nPokemonTower_7F_Text_Grunt1Defeat::\n    .string \"I give up!$\"\n\nPokemonTower_7F_Text_Grunt1PostBattle::\n    .string \"I'm not going to forget this!$\"\n\nPokemonTower_7F_Text_Grunt2Intro::\n    .string \"This old guy marched right up to\\n\"\n    .string \"our HIDEOUT.\\p\"\n    .string \"Then, he starts ranting about how\\n\"\n    .string \"TEAM ROCKET's abusing POKéMON.\\p\"\n    .string \"So, we're just talking it over as\\n\"\n    .string \"adults.$\"\n\nPokemonTower_7F_Text_Grunt2Defeat::\n    .string \"Please!\\n\"\n    .string \"No more!$\"\n\nPokemonTower_7F_Text_Grunt2PostBattle::\n    .string \"POKéMON are only good for making\\n\"\n    .string \"money. Why not use them?\\p\"\n    .string \"You stay out of our business!$\"\n\nPokemonTower_7F_Text_Grunt3Intro::\n    .string \"You're not saving anyone, kid!$\"\n\nPokemonTower_7F_Text_Grunt3Defeat::\n    .string \"Don't fight us ROCKETS!$\"\n\nPokemonTower_7F_Text_Grunt3PostBattle::\n    .string \"You're not getting away with this!$\"\n\nPokemonTower_7F_Text_MrFujiThankYouFollowMe::\n    .string \"MR. FUJI: Heh?\\n\"\n    .string \"You came to save me?\\p\"\n    .string \"Thank you. But, I came here of my\\n\"\n    .string \"own free will.\\p\"\n    .string \"I came to calm the spirit of\\n\"\n    .string \"CUBONE's mother.\\p\"\n    .string \"I think MAROWAK's spirit has\\n\"\n    .string \"finally left us.\\p\"\n    .string \"I must thank you for your kind\\n\"\n    .string \"concern.\\p\"\n    .string \"Follow me to my home, POKéMON\\n\"\n    .string \"HOUSE, at the foot of this tower.$\"\n\n"
  },
  {
    "path": "data/maps/PowerPlant/map.json",
    "content": "{\n  \"id\": \"MAP_POWER_PLANT\",\n  \"name\": \"PowerPlant\",\n  \"layout\": \"LAYOUT_POWER_PLANT\",\n  \"music\": \"MUS_POKE_MANSION\",\n  \"region_map_section\": \"MAPSEC_POWER_PLANT\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_2\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PowerPlant_EventScript_ItemMaxPotion\",\n      \"flag\": \"FLAG_HIDE_POWER_PLANT_MAX_POTION\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PowerPlant_EventScript_ItemTM17\",\n      \"flag\": \"FLAG_HIDE_POWER_PLANT_TM17\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 46,\n      \"y\": 37,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PowerPlant_EventScript_ItemTM25\",\n      \"flag\": \"FLAG_HIDE_POWER_PLANT_TM25\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 45,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PowerPlant_EventScript_ItemThunderStone\",\n      \"flag\": \"FLAG_HIDE_POWER_PLANT_THUNDER_STONE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PowerPlant_EventScript_ItemElixir\",\n      \"flag\": \"FLAG_HIDE_POWER_PLANT_ELIXIR\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ZAPDOS\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PowerPlant_EventScript_Zapdos\",\n      \"flag\": \"FLAG_HIDE_ZAPDOS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PowerPlant_EventScript_Electrode2\",\n      \"flag\": \"FLAG_HIDE_POWER_PLANT_ELECTRODE_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 38,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"PowerPlant_EventScript_Electrode1\",\n      \"flag\": \"FLAG_HIDE_POWER_PLANT_ELECTRODE_1\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 41,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Voltorb\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Zapdos\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 39,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE10\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 38,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE10\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 39,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE10\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE10\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 0,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE10\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 29,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"item\": \"ITEM_MAX_ELIXIR\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_POWER_PLANT_MAX_ELIXIR\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 8,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"item\": \"ITEM_THUNDER_STONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_POWER_PLANT_THUNDER_STONE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/PowerPlant/scripts.inc",
    "content": ".set LOCALID_VOLTORB_MASTER, 9\n.set LOCALID_ZAPDOS_MASTER, 10\n.set TRAINER, VAR_0x8009\n\nPowerPlant_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, PowerPlant_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, PowerPlant_OnTransition\n\t.byte 0\n\nPowerPlant_OnResume::\n\tcall_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, PowerPlant_EventScript_TryRemoveStaticMon\n\tend\n\nPowerPlant_EventScript_TryRemoveStaticMon::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return\n\tremoveobject VAR_LAST_TALKED\n\treturn\n\nPowerPlant_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_POWER_PLANT\n\tcall_if_set FLAG_FOUGHT_ZAPDOS, PowerPlant_EventScript_HideZapdos\n\tcall_if_unset FLAG_FOUGHT_ZAPDOS, PowerPlant_EventScript_TryShowZapdos\n\tcall_if_unset FLAG_FOUGHT_POWER_PLANT_ELECTRODE_1, PowerPlant_EventScript_ShowElectrode1\n\tcall_if_unset FLAG_FOUGHT_POWER_PLANT_ELECTRODE_2, PowerPlant_EventScript_ShowElectrode2\n\tgoto PowerPlant_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nPowerPlant_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_VOLTORB\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PowerPlant_MapScript_VoltorbMasterMovementType\n\tsetvar TRAINER, MASTER_ZAPDOS\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, PowerPlant_MapScript_ZapdosMasterMovementType\n\tend\n\nPowerPlant_MapScript_VoltorbMasterMovementType::\n\tsetobjectmovementtype LOCALID_VOLTORB_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPowerPlant_MapScript_ZapdosMasterMovementType::\n\tsetobjectmovementtype LOCALID_ZAPDOS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nPowerPlant_EventScript_TryShowZapdos::\n\tgoto_if_set FLAG_ZAPDOS_FLEW_AWAY, EventScript_Return\n\tclearflag FLAG_HIDE_ZAPDOS\n\treturn\n\nPowerPlant_EventScript_HideZapdos::\n\tsetflag FLAG_HIDE_ZAPDOS\n\treturn\n\nPowerPlant_EventScript_ShowElectrode1::\n\tclearflag FLAG_HIDE_POWER_PLANT_ELECTRODE_1\n\treturn\n\nPowerPlant_EventScript_ShowElectrode2::\n\tclearflag FLAG_HIDE_POWER_PLANT_ELECTRODE_2\n\treturn\n\nPowerPlant_EventScript_Zapdos::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tsetwildbattle SPECIES_ZAPDOS, 50\n\twaitse\n\tplaymoncry SPECIES_ZAPDOS, CRY_MODE_ENCOUNTER\n\tmessage Text_Gyaoo\n\twaitmessage\n\twaitmoncry\n\tdelay 10\n\tplaybgm MUS_ENCOUNTER_GYM_LEADER, 0\n\twaitbuttonpress\n\tsetflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecial StartLegendaryBattle\n\twaitstate\n\tclearflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_WON, PowerPlant_EventScript_DefeatedZapdos\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_RAN, PowerPlant_EventScript_RanFromZapdos\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, PowerPlant_EventScript_RanFromZapdos\n\tsetflag FLAG_FOUGHT_ZAPDOS\n\trelease\n\tend\n\nPowerPlant_EventScript_DefeatedZapdos::\n\tsetflag FLAG_ZAPDOS_FLEW_AWAY\n\tsetvar VAR_0x8004, SPECIES_ZAPDOS\n\tgoto EventScript_MonFlewAway\n\tend\n\nPowerPlant_EventScript_RanFromZapdos::\n\tsetvar VAR_0x8004, SPECIES_ZAPDOS\n\tgoto EventScript_MonFlewAway\n\tend\n\nPowerPlant_EventScript_Electrode1::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tsetwildbattle SPECIES_ELECTRODE, 34\n\twaitse\n\tplaymoncry SPECIES_ELECTRODE, CRY_MODE_ENCOUNTER\n\tdelay 40\n\twaitmoncry\n\tsetflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tdowildbattle\n\tclearflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecial QuestLog_CutRecording\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_WON, PowerPlant_EventScript_FoughtElectrode1\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_RAN, PowerPlant_EventScript_FoughtElectrode1\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, PowerPlant_EventScript_FoughtElectrode1\n\tsetflag FLAG_FOUGHT_POWER_PLANT_ELECTRODE_1\n\trelease\n\tend\n\nPowerPlant_EventScript_FoughtElectrode1::\n\tsetflag FLAG_FOUGHT_POWER_PLANT_ELECTRODE_1\n\tgoto EventScript_RemoveStaticMon\n\tend\n\nPowerPlant_EventScript_Electrode2::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tsetwildbattle SPECIES_ELECTRODE, 34\n\twaitse\n\tplaymoncry SPECIES_ELECTRODE, CRY_MODE_ENCOUNTER\n\tdelay 40\n\twaitmoncry\n\tsetflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tdowildbattle\n\tclearflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecial QuestLog_CutRecording\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_WON, PowerPlant_EventScript_FoughtElectrode2\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_RAN, PowerPlant_EventScript_FoughtElectrode2\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, PowerPlant_EventScript_FoughtElectrode2\n\tsetflag FLAG_FOUGHT_POWER_PLANT_ELECTRODE_2\n\trelease\n\tend\n\nPowerPlant_EventScript_FoughtElectrode2::\n\tsetflag FLAG_FOUGHT_POWER_PLANT_ELECTRODE_2\n\tgoto EventScript_RemoveStaticMon\n\tend\n"
  },
  {
    "path": "data/maps/Prototype_SeviiIsle_6/map.json",
    "content": "{\n  \"id\": \"MAP_PROTOTYPE_SEVII_ISLE_6\",\n  \"name\": \"Prototype_SeviiIsle_6\",\n  \"layout\": \"LAYOUT_PROTOTYPE_SEVII_ISLE_6\",\n  \"music\": \"MUS_SEVII_ROUTE\",\n  \"region_map_section\": \"MAPSEC_SEVII_ISLE_6\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Prototype_SeviiIsle_6/scripts.inc",
    "content": "Prototype_SeviiIsle_6_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/Prototype_SeviiIsle_7/map.json",
    "content": "{\n  \"id\": \"MAP_PROTOTYPE_SEVII_ISLE_7\",\n  \"name\": \"Prototype_SeviiIsle_7\",\n  \"layout\": \"LAYOUT_PROTOTYPE_SEVII_ISLE_7\",\n  \"music\": \"MUS_SEVII_ROUTE\",\n  \"region_map_section\": \"MAPSEC_SEVII_ISLE_7\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Prototype_SeviiIsle_7/scripts.inc",
    "content": "Prototype_SeviiIsle_7_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/Prototype_SeviiIsle_8/map.json",
    "content": "{\n  \"id\": \"MAP_PROTOTYPE_SEVII_ISLE_8\",\n  \"name\": \"Prototype_SeviiIsle_8\",\n  \"layout\": \"LAYOUT_PROTOTYPE_SEVII_ISLE_8\",\n  \"music\": \"MUS_SEVII_ROUTE\",\n  \"region_map_section\": \"MAPSEC_SEVII_ISLE_8\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Prototype_SeviiIsle_8/scripts.inc",
    "content": "Prototype_SeviiIsle_8_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/Prototype_SeviiIsle_9/map.json",
    "content": "{\n  \"id\": \"MAP_PROTOTYPE_SEVII_ISLE_9\",\n  \"name\": \"Prototype_SeviiIsle_9\",\n  \"layout\": \"LAYOUT_PROTOTYPE_SEVII_ISLE_9\",\n  \"music\": \"MUS_SEVII_ROUTE\",\n  \"region_map_section\": \"MAPSEC_SEVII_ISLE_9\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Prototype_SeviiIsle_9/scripts.inc",
    "content": "Prototype_SeviiIsle_9_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/RS_BattleTower/map.json",
    "content": "{\n  \"id\": \"MAP_RS_BATTLE_TOWER\",\n  \"name\": \"RS_BattleTower\",\n  \"layout\": \"LAYOUT_RS_BATTLE_TOWER\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BattleTower_Outside_EventScript_160275\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BattleTower_Outside_EventScript_16026C\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BattleTower_Outside_EventScript_160263\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NavelRock_Harbor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BattleFrontier_OutsideEast_EventScript_OldWoman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUDOWOODO\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BattleFrontier_OutsideEast_EventScript_Sudowoodo\",\n      \"flag\": \"FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 14,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_RS_BATTLE_TOWER_LOBBY\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 11,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ARTISAN_CAVE_B1F\",\n      \"dest_warp_id\": 0\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"BattleTower_Outside_EventScript_16025A\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/RS_BattleTower/scripts.inc",
    "content": ".set LOCALID_SUDOWOODO, 7\n\nRS_BattleTower_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, BattleFrontier_OutsideEast_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_OutsideEast_OnTransition\n\t.byte 0\n\nBattleFrontier_OutsideEast_OnResume:\n\tcall_if_set FLAG_SYS_CTRL_OBJ_DELETE, BattleFrontier_OutsideEast_EventScript_TryRemoveSudowoodo\n\tend\n\nBattleFrontier_OutsideEast_EventScript_TryRemoveSudowoodo::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_CAUGHT\n\tgoto_if_ne EventScript_Return\n\tremoveobject VAR_LAST_TALKED\n\treturn\n\nBattleFrontier_OutsideEast_OnTransition:\n\tcall_if_unset FLAG_DEFEATED_SUDOWOODO, BattleFrontier_OutsideEast_EventScript_ShowSudowoodo\n\tend\n\nBattleFrontier_OutsideEast_EventScript_ShowSudowoodo::\n\tgoto_if_set FLAG_CAUGHT_SUDOWOODO, EventScript_Return\n\tclearflag FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO\n\treturn\n\nBattleTower_Outside_EventScript_16025A::\n\tmsgbox BattleTower_Outside_Text_199C6F, MSGBOX_SIGN\n\tend\n\nBattleTower_Outside_EventScript_160263::\n\tmsgbox BattleTower_Outside_Text_199CA4, MSGBOX_NPC\n\tend\n\nBattleTower_Outside_EventScript_16026C::\n\tmsgbox BattleTower_Outside_Text_199E9C, MSGBOX_NPC\n\tend\n\nBattleTower_Outside_EventScript_160275::\n\tmsgbox BattleTower_Outside_Text_199ED4, MSGBOX_NPC\n\tend\n\nBattleFrontier_OutsideEast_EventScript_OldWoman::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_DEFEATED_SUDOWOODO, BattleFrontier_OutsideEast_EventScript_OldWomanSudowoodoGone\n\tgoto_if_set FLAG_CAUGHT_SUDOWOODO, BattleFrontier_OutsideEast_EventScript_OldWomanSudowoodoGone\n\tgoto_if_set FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO, BattleFrontier_OutsideEast_EventScript_OldWomanSudowoodoGone\n\tmsgbox BattleFrontier_OutsideEast_Text_OddTreeHereSeemsToWiggle, MSGBOX_DEFAULT\n\tturnobject 6, DIR_SOUTH //remove later\n\trelease\n\tend\n\nBattleFrontier_OutsideEast_EventScript_OldWomanSudowoodoGone::\n\tmsgbox BattleFrontier_OutsideEast_Text_OnceAnOddTreePastHere, MSGBOX_DEFAULT\n\tturnobject 6, DIR_SOUTH //remove later\n\trelease\n\tend\n\nBattleFrontier_OutsideEast_Text_OddTreeHereSeemsToWiggle: //change text to match EM later\n\t.string \"Excuse me, young one.\\n\"\n\t.string \"Have you good eyesight?\\p\"\n\t.string \"There is an odd tree here, and to\\n\"\n\t.string \"my tired eyes it seems to wiggle.$\"\n\nBattleFrontier_OutsideEast_Text_OnceAnOddTreePastHere: //change text to match EM later\n\t.string \"Excuse me, young one.\\n\"\n\t.string \"Have you a good memory?\\p\"\n\t.string \"I have this feeling there once was\\n\"\n\t.string \"an odd tree here.$\"\n\nBattleFrontier_OutsideEast_EventScript_Sudowoodo::\n\tlock\n\tfaceplayer\n\twaitse\n\tplayse SE_SUDOWOODO_SHAKE\n\tapplymovement LOCALID_SUDOWOODO, BattleFrontier_OutsideEast_Movement_SudowoodoShake\n\twaitmovement 0\n\tcheckitem ITEM_FRESH_WATER, 1\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq BattleFrontier_OutsideEast_EventScript_AskWaterSudowoodo\n\trelease\n\tend\n\nBattleFrontier_OutsideEast_EventScript_AskWaterSudowoodo::\n\tmsgbox BattleFrontier_OutsideEast_Text_UseFreshWater MSGBOX_YESNO\n\tcompare VAR_RESULT, YES\n\tgoto_if_eq BattleFrontier_OutsideEast_EventScript_WaterSudowoodo\n\trelease\n\tend\n\nBattleFrontier_OutsideEast_Text_UseFreshWater::\n\t.string \"It's a weird tree.\\n\"\n\t.string \"Water it with a FRESH WATER?$\"\n\nBattleFrontier_OutsideEast_EventScript_WaterSudowoodo::\n\tlock\n\tfaceplayer\n\tremoveitem ITEM_FRESH_WATER, 1\n\tplayse SE_SUDOWOODO_SHAKE\n\tapplymovement LOCALID_SUDOWOODO, BattleFrontier_OutsideEast_Movement_SudowoodoShakeAngry\n\twaitmovement 0\n\tapplymovement LOCALID_SUDOWOODO, BattleFrontier_OutsideEast_Movement_SudowoodoShakeAngry\n\twaitmovement 0\n\tapplymovement LOCALID_SUDOWOODO, BattleFrontier_OutsideEast_Movement_SudowoodoShakeAngry\n\twaitmovement 0\n\tmsgbox gText_Sudowoodo_Attacked, MSGBOX_DEFAULT\n\tclosemessage\n\twaitse\n\tplaymoncry SPECIES_SUDOWOODO, 2\n\tdelay 40\n\twaitmoncry\n\tsetvar VAR_LAST_TALKED, LOCALID_SUDOWOODO\n\tsetwildbattle SPECIES_SUDOWOODO, 40, ITEM_NONE\n\tsetflag FLAG_SYS_CTRL_OBJ_DELETE\n\tdowildbattle\n\tclearflag FLAG_SYS_CTRL_OBJ_DELETE\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_WON\n\tgoto_if_eq BattleFrontier_OutsideEast_EventScript_DefeatedSudowoodo\n\tcompare VAR_RESULT, B_OUTCOME_RAN\n\tgoto_if_eq BattleFrontier_OutsideEast_EventScript_RanFromSudowoodo\n\tcompare VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED\n\tgoto_if_eq BattleFrontier_OutsideEast_EventScript_RanFromSudowoodo\n\tsetflag FLAG_CAUGHT_SUDOWOODO\n\trelease\n\tend\n\ngText_Sudowoodo_Attacked::\n\t.string \"The weird tree doesn't like the\\n\"\n\t.string \"FRESH WATER!\\p\"\n\t.string \"The weird tree attacked!$\"\n\nBattleFrontier_OutsideEast_EventScript_DefeatedSudowoodo::\n\tsetflag FLAG_DEFEATED_SUDOWOODO\n\tgoto BattleFrontier_OutsideEast_EventScript_RanFromSudowoodo\n\tend\n\nBattleFrontier_OutsideEast_EventScript_RanFromSudowoodo::\n\tfadescreenswapbuffers FADE_TO_BLACK\n    removeobject VAR_LAST_TALKED\n    fadescreenswapbuffers FADE_FROM_BLACK\n    msgbox Text_WeirdTreeFledSomewhere\n    release\n    end\n\nText_WeirdTreeFledSomewhere::\n\t.string \"The weird tree fled elsewhere…$\"\n\nBattleFrontier_OutsideEast_Movement_SudowoodoShake:\n\tface_right\n\tdelay_8\n\tface_down\n\tdelay_8\n\tface_left\n\tdelay_8\n\tface_down\n\tdelay_8\n\tface_right\n\tdelay_8\n\tface_down\n\tdelay_8\n\tface_left\n\tdelay_8\n\tface_down\n\tstep_end\n\nBattleFrontier_OutsideEast_Movement_SudowoodoShakeAngry:\n\tface_right\n\tdelay_2\n\tface_down\n\tdelay_2\n\tface_left\n\tdelay_2\n\tface_down\n\tdelay_2\n\tface_right\n\tdelay_2\n\tface_down\n\tdelay_2\n\tface_left\n\tdelay_2\n\tface_down\n\tstep_end"
  },
  {
    "path": "data/maps/RS_BattleTower/text.inc",
    "content": "\nBattleTower_Outside_Text_199C6F::\n\t.string \"BATTLE TOWER\\n\"\n\t.string \"“Win it all and be the best!”$\"\n\nBattleTower_Outside_Text_199CA4::\n\t.string \"This is the BATTLE TOWER.\\p\"\n\t.string \"TRAINERS bring their best POKéMON\\n\"\n\t.string \"for elimination-style matches.$\"\n\nBattleTower_Outside_Text_199E9C::\n\t.string \"I'm not leaving until I've beaten\\n\"\n\t.string \"35 TRAINERS in a row!$\"\n\nBattleTower_Outside_Text_199ED4::\n\t.string \"Gee, there're a lot of\\n\"\n\t.string \"tough-looking TRAINERS here.\\l\"\n\t.string \"I'm not good enough to enter yet…$\"\n"
  },
  {
    "path": "data/maps/RS_BattleTower_BattleRoom/map.json",
    "content": "{\n  \"id\": \"MAP_RS_BATTLE_TOWER_BATTLE_ROOM\",\n  \"name\": \"RS_BattleTower_BattleRoom\",\n  \"layout\": \"LAYOUT_RS_BATTLE_TOWER_BATTLE_ROOM\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_LINK\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_BATTLE_TOWER_OPPONENT\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_RS_BATTLE_TOWER_LOBBY\",\n      \"dest_warp_id\": 2\n    },\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_RS_BATTLE_TOWER_LOBBY\",\n      \"dest_warp_id\": 2\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/RS_BattleTower_BattleRoom/scripts.inc",
    "content": "RS_BattleTower_BattleRoom_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, BattleTower_BattleRoom_MapScript2_1608E1\n\t.byte 0\n\nBattleTower_BattleRoom_MapScript2_1608E1::\n\tmap_script_2 VAR_TEMP_0, 0, BattleTower_BattleRoom_EventScript_1608EB\n\t.2byte 0\n\nBattleTower_BattleRoom_EventScript_1608EB::\n\tsetvar VAR_TEMP_0, 1\n\tapplymovement OBJ_EVENT_ID_PLAYER, BattleTower_BattleRoom_Movement_160AB7\n\twaitmovement 0\n\nBattleTower_BattleRoom_EventScript_1608FA::\n\tspecial ChooseNextBattleTowerTrainer\n\taddobject 1\n\tapplymovement 1, BattleTower_BattleRoom_Movement_160AC0\n\twaitmovement 0\n\tcompare VAR_LAST_TALKED, 0\n\tcall_if_eq BattleTower_BattleRoom_EventScript_TextcolorMale\n\tcompare VAR_LAST_TALKED, 1\n\tcall_if_eq BattleTower_BattleRoom_EventScript_TextcolorFemale\n\tspecial PrintBattleTowerTrainerGreeting\n\tmsgbox gStringVar4, MSGBOX_DEFAULT\n\twaitmessage\n\tclosemessage\n\tcallnative HealPlayerPartyOak\n\tsetvar VAR_0x8004, 0\n\tsetvar VAR_0x8005, 0\n\tspecial StartSpecialBattle\n\twaitstate\n\tswitch VAR_RESULT\n\tcase 1, BattleTower_BattleRoom_EventScript_160961\n\tspecial LoadPlayerParty\n\tsetvar VAR_0x8004, 0\n\tsetvar VAR_0x8005, 5\n\tspecial SetBattleTowerProperty\n\tsetvar VAR_0x8004, 14\n\tspecial SetBattleTowerProperty\n\tsetvar VAR_0x8004, 3\n\t//special sub_810FF60 //fan club thing\n\twarp MAP_RS_BATTLE_TOWER_LOBBY, 255, 6, 6\n\twaitstate\n\nBattleTower_BattleRoom_EventScript_160961::\n\tsetvar VAR_0x8004, 6\n\tspecial SetBattleTowerProperty\n\tswitch VAR_RESULT\n\tcase 8, BattleTower_BattleRoom_EventScript_160A56\n\tapplymovement 1, BattleTower_BattleRoom_Movement_160AC6\n\twaitmovement 0\n\tremoveobject 1\n\tapplymovement 2, BattleTower_BattleRoom_Movement_160ACB\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, BattleTower_BattleRoom_Movement_160ABC\n\twaitmovement 0\n\ttextcolor 0x1\n\tmsgbox BattleTower_BattleRoom_Text_19ACDC, MSGBOX_DEFAULT\n\tspecial LoadPlayerParty\n\tspecial SavePlayerParty\n\tspecial SetBattleTowerParty\n\tplayfanfare MUS_RS_HEAL\n\twaitfanfare\n\tcallnative HealPlayerPartyOak\n\nBattleTower_BattleRoom_EventScript_1609B2::\n\ttextcolor 0x1\n\tmsgbox BattleTower_BattleRoom_Text_19AD09, MSGBOX_YESNO\n\tswitch VAR_RESULT\n\tcase NO, BattleTower_BattleRoom_EventScript_1609E0\n\tcase YES, BattleTower_BattleRoom_EventScript_160A3C\n\tcase 127, BattleTower_BattleRoom_EventScript_1609E0\n\nBattleTower_BattleRoom_EventScript_1609E0::\n\ttextcolor 0x1\n\tmsgbox BattleTower_BattleRoom_Text_19AD3C, MSGBOX_YESNO\n\tswitch VAR_RESULT\n\tcase NO, BattleTower_BattleRoom_EventScript_160A0E\n\tcase YES, BattleTower_BattleRoom_EventScript_160A94\n\tcase 127, BattleTower_BattleRoom_EventScript_160A0E\n\nBattleTower_BattleRoom_EventScript_160A0E::\n\ttextcolor 0x1\n\tmsgbox BattleTower_BattleRoom_Text_19AD66, MSGBOX_YESNO\n\tswitch VAR_RESULT\n\tcase NO, BattleTower_BattleRoom_EventScript_1609B2\n\tcase YES, BattleTower_BattleRoom_EventScript_160AB1\n\tcase 127, BattleTower_BattleRoom_EventScript_1609B2\n\nBattleTower_BattleRoom_EventScript_160A3C::\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, BattleTower_BattleRoom_Movement_160ABE\n\twaitmovement 0\n\tapplymovement 2, BattleTower_BattleRoom_Movement_160AD0\n\twaitmovement 0\n\tgoto BattleTower_BattleRoom_EventScript_1608FA\n\nBattleTower_BattleRoom_EventScript_160A56::\n\tspecial LoadPlayerParty\n\tsetvar VAR_0x8004, 0\n\tsetvar VAR_0x8005, 4\n\tspecial SetBattleTowerProperty\n\tsetvar VAR_0x8004, 2\n\tsetvar VAR_0x8005, 1\n\tspecial SetBattleTowerProperty\n\tsetvar VAR_0x8004, 7\n\tspecial SetBattleTowerProperty\n\tsetvar VAR_0x8004, 14\n\tspecial SetBattleTowerProperty\n\tsetvar VAR_0x8004, 3\n\t//special sub_810FF60 //fan club thing\n\twarp MAP_RS_BATTLE_TOWER_LOBBY, 255, 6, 6\n\twaitstate\n\nBattleTower_BattleRoom_EventScript_160A94::\n\tsetvar VAR_0x8004, 2\n\tspecial SaveBattleTowerProgress\n\ttextcolor 0x3\n\tmessage BattleTower_BattleRoom_Text_1C6CE1\n\tdelay 60\n\twaitmessage\n\tplayse SE_SAVE\n\twaitse\n\tmsgbox BattleTower_BattleRoom_Text_1C6D05, MSGBOX_DEFAULT\n\nBattleTower_BattleRoom_EventScript_160AB1::\n\tfadescreen FADE_TO_BLACK\n\tspecial BattleTower_SoftReset\n\tend\n\nBattleTower_BattleRoom_EventScript_TextcolorMale::\n\ttextcolor 0x0\n\treturn\n\nBattleTower_BattleRoom_EventScript_TextcolorFemale::\n\ttextcolor 0x1\n\treturn\n\nBattleTower_BattleRoom_Movement_160AB7::\n\twalk_up\n\twalk_up\n\twalk_up\n\tface_right\n\tstep_end\n\nBattleTower_BattleRoom_Movement_160ABC::\n\tface_down\n\tstep_end\n\nBattleTower_BattleRoom_Movement_160ABE::\n\tface_right\n\tstep_end\n\nBattleTower_BattleRoom_Movement_160AC0::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tface_left\n\tstep_end\n\nBattleTower_BattleRoom_Movement_160AC6::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nBattleTower_BattleRoom_Movement_160ACB::\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_up\n\tstep_end\n\nBattleTower_BattleRoom_Movement_160AD0::\n\twalk_down\n\twalk_left\n\twalk_left\n\twalk_left\n\tface_right\n\tstep_end\n"
  },
  {
    "path": "data/maps/RS_BattleTower_BattleRoom/text.inc",
    "content": "BattleTower_BattleRoom_Text_19ACDC::\n\t.string \"We will restore your POKéMON to\\n\"\n\t.string \"full health.$\"\n\nBattleTower_BattleRoom_Text_19AD09::\n\t.string \"You will be facing opponent no. {STR_VAR_1}.\\n\"\n\t.string \"Are you ready?$\"\n\nBattleTower_BattleRoom_Text_19AD3C::\n\t.string \"Would you like to save and\\n\"\n\t.string \"quit the game?$\"\n\nBattleTower_BattleRoom_Text_19AD66::\n\t.string \"Would you like to cancel your\\n\"\n\t.string \"BATTLE ROOM challenge?$\"\n\nBattleTower_BattleRoom_Text_1C6CE1::\n\t.string \"SAVING...\\n\"\n\t.string \"DON'T TURN OFF THE POWER.$\"\n\nBattleTower_BattleRoom_Text_1C6D05::\n\t.string \"{PLAYER} saved the game.$\""
  },
  {
    "path": "data/maps/RS_BattleTower_Corridor/map.json",
    "content": "{\n  \"id\": \"MAP_RS_BATTLE_TOWER_CORRIDOR\",\n  \"name\": \"RS_BattleTower_Corridor\",\n  \"layout\": \"LAYOUT_RS_BATTLE_TOWER_CORRIDOR\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/RS_BattleTower_Corridor/scripts.inc",
    "content": "RS_BattleTower_Corridor_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, BattleTower_Corridor_MapScript1_160850\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, BattleTower_Corridor_MapScript2_160881\n\t.byte 0\n\nBattleTower_Corridor_MapScript1_160850::\n\tcompare VAR_0x8006, 1\n\tgoto_if_eq BattleTower_Corridor_EventScript_16086E\n\tsetmetatile 12, 0, 0x287, 0\n\tsetmetatile 12, 1, 0x28F, 0\n\tend\n\nBattleTower_Corridor_EventScript_16086E::\n\tsetmetatile 15, 0, 0x287, 0\n\tsetmetatile 15, 1, 0x28F, 0\n\tend\n\nBattleTower_Corridor_MapScript2_160881::\n\tmap_script_2 VAR_TEMP_0, 0, BattleTower_Corridor_EventScript_16088B\n\t.2byte 0\n\nBattleTower_Corridor_EventScript_16088B::\n\tsetvar VAR_TEMP_0, 1\n\tcompare VAR_0x8006, 1\n\tgoto_if_eq BattleTower_Corridor_EventScript_1608B1\n\tapplymovement 1, BattleTower_Corridor_Movement_1608D5\n\tapplymovement OBJ_EVENT_ID_PLAYER, BattleTower_Corridor_Movement_1608D4\n\twaitmovement 0\n\tgoto BattleTower_Corridor_EventScript_1608C2\n\nBattleTower_Corridor_EventScript_1608B1::\n\tapplymovement 1, BattleTower_Corridor_Movement_1608D2\n\tapplymovement OBJ_EVENT_ID_PLAYER, BattleTower_Corridor_Movement_1608D1\n\twaitmovement 0\n\nBattleTower_Corridor_EventScript_1608C2::\n\tsetvar VAR_TEMP_0, 0\n\twarp MAP_RS_BATTLE_TOWER_BATTLE_ROOM, 255, 4, 8\n\twaitstate\n\tend\n\nBattleTower_Corridor_Movement_1608D1::\n\twalk_right\n\nBattleTower_Corridor_Movement_1608D2::\n\twalk_right\n\twalk_right\n\nBattleTower_Corridor_Movement_1608D4::\n\twalk_right\n\nBattleTower_Corridor_Movement_1608D5::\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_up\n\tset_invisible\n\tstep_end\n"
  },
  {
    "path": "data/maps/RS_BattleTower_Corridor/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/RS_BattleTower_Elevator/map.json",
    "content": "{\n  \"id\": \"MAP_RS_BATTLE_TOWER_ELEVATOR\",\n  \"name\": \"RS_BattleTower_Elevator\",\n  \"layout\": \"LAYOUT_RS_BATTLE_TOWER_ELEVATOR\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/RS_BattleTower_Elevator/scripts.inc",
    "content": "RS_BattleTower_Elevator_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, BattleTower_Elevator_MapScript2_1607DA\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleTower_Elevator_MapScript2_160821\n\t.byte 0\n\nBattleTower_Elevator_MapScript2_1607DA::\n\tmap_script_2 VAR_TEMP_0, 0, BattleTower_Elevator_EventScript_1607E4\n\t.2byte 0\n\nBattleTower_Elevator_EventScript_1607E4::\n\tsetvar VAR_TEMP_0, 1\n\tapplymovement 1, BattleTower_Elevator_Movement_160835\n\tapplymovement OBJ_EVENT_ID_PLAYER, BattleTower_Elevator_Movement_160839\n\twaitmovement 0\n\tspecial AnimateElevator\n\twaitstate\n\tdelay 64\n\tapplymovement 1, BattleTower_Elevator_Movement_16083D\n\tapplymovement OBJ_EVENT_ID_PLAYER, BattleTower_Elevator_Movement_160841\n\twaitmovement 0\n\tsetvar VAR_TEMP_0, 0\n\twarp MAP_RS_BATTLE_TOWER_CORRIDOR, 255, 8, 1\n\twaitstate\n\tend\n\nBattleTower_Elevator_MapScript2_160821::\n\tmap_script_2 VAR_TEMP_1, 0, BattleTower_Elevator_EventScript_16082B\n\t.2byte 0\n\nBattleTower_Elevator_EventScript_16082B::\n\tsetvar VAR_TEMP_1, 1\n\tturnobject OBJ_EVENT_ID_PLAYER, 2\n\tend\n\nBattleTower_Elevator_Movement_160835::\n\twalk_up\n\twalk_right\n\tface_down\n\tstep_end\n\nBattleTower_Elevator_Movement_160839::\n\twalk_up\n\twalk_up\n\tface_down\n\tstep_end\n\nBattleTower_Elevator_Movement_16083D::\n\twalk_down\n\twalk_left\n\twalk_down\n\tset_invisible\n\tstep_end\n\nBattleTower_Elevator_Movement_160841::\n\tdelay_16\n\tdelay_16\n\twalk_down\n\twalk_down\n\tstep_end"
  },
  {
    "path": "data/maps/RS_BattleTower_Elevator/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/RS_BattleTower_Lobby/map.json",
    "content": "{\n  \"id\": \"MAP_RS_BATTLE_TOWER_LOBBY\",\n  \"name\": \"RS_BattleTower_Lobby\",\n  \"layout\": \"LAYOUT_RS_BATTLE_TOWER_LOBBY\",\n  \"music\": \"MUS_B_TOWER_RS\",\n  \"region_map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BattleTower_Lobby_EventScript_16049E\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BattleTower_Lobby_EventScript_1606A5\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BattleTower_Lobby_EventScript_160715\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BattleTower_Lobby_EventScript_16071E\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCOTT\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"BattleTower_Lobby_EventScript_Scott\",\n      \"flag\": \"FLAG_HIDE_AWARD_SCOTT_BATTLE_TOWER\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_RS_BATTLE_TOWER\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_RS_BATTLE_TOWER_BATTLE_ROOM\",\n      \"dest_warp_id\": 0\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"BattleTower_Lobby_EventScript_160727\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/RS_BattleTower_Lobby/scripts.inc",
    "content": "RS_BattleTower_Lobby_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, BattleTower_Lobby_MapScript1_160293\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, BattleTower_Lobby_MapScript2_160302\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleTower_Lobby_MapScript2_1602EE\n\t.byte 0\n\nBattleTower_Lobby_MapScript1_160293::\n\tcall BattleTower_Lobby_EventScript_16029C\n\tend\n\nBattleTower_Lobby_EventScript_16029C::\n\tsetvar VAR_0x8004, 10\n\tspecial SetBattleTowerProperty\n\tgoto_if_set FLAG_TEMP_1, BattleTower_Lobby_EventScript_160662\n\tcheckitem ITEM_EON_TICKET, 1\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq BattleTower_Lobby_EventScript_HideScott\n\tcheckitem ITEM_AURORA_TICKET, 1\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq BattleTower_Lobby_EventScript_CheckShouldGiveEonTicket\n\tcallnative GetBestBattleTowerStreakToVar0x8007\n\tcompare VAR_0x8007, 28\n\tgoto_if_lt BattleTower_Lobby_EventScript_HideScott\n\tclearflag FLAG_HIDE_AWARD_SCOTT_BATTLE_TOWER\n\tcallnative TryInitBattleTowerAwardManObjectEvent\n\treturn\n\nBattleTower_Lobby_EventScript_CheckShouldGiveEonTicket::\n\tcallnative GetBestBattleTowerStreakToVar0x8007\n\tcompare VAR_0x8007, 56\n\tgoto_if_lt BattleTower_Lobby_EventScript_HideScott\n\tclearflag FLAG_HIDE_AWARD_SCOTT_BATTLE_TOWER\n\tcallnative TryInitBattleTowerAwardManObjectEvent\n\treturn\n\nBattleTower_Lobby_EventScript_HideScott::\n\tsetflag FLAG_HIDE_AWARD_SCOTT_BATTLE_TOWER\n\treturn\n\nBattleTower_Lobby_MapScript2_1602EE::\n\tmap_script_2 VAR_TEMP_1, 0, BattleTower_Lobby_EventScript_1602F8\n\t.2byte 0\n\nBattleTower_Lobby_EventScript_1602F8::\n\tsetvar VAR_TEMP_1, 1\n\tturnobject OBJ_EVENT_ID_PLAYER, 2\n\tend\n\nBattleTower_Lobby_MapScript2_160302::\n\tmap_script_2 VAR_TEMP_0, 0, BattleTower_Lobby_EventScript_16032C\n\tmap_script_2 VAR_TEMP_0, 1, BattleTower_Lobby_EventScript_160330\n\tmap_script_2 VAR_TEMP_0, 2, BattleTower_Lobby_EventScript_160342\n\tmap_script_2 VAR_TEMP_0, 3, BattleTower_Lobby_EventScript_160419\n\tmap_script_2 VAR_TEMP_0, 4, BattleTower_Lobby_EventScript_16044B\n\t.2byte 0\n\nBattleTower_Lobby_EventScript_16032C::\n\tspecial BattleTowerMapScript2\n\tend\n\nBattleTower_Lobby_EventScript_160330::\n\tlock\n\tfaceplayer\n\ttextcolor 0x1\n\tclearflag FLAG_SYS_IS_LINKING\n\tmsgbox BattleTower_Lobby_Text_19A3FD, MSGBOX_DEFAULT\n\tclosemessage\n\tsetvar VAR_TEMP_0, 5\n\trelease\n\tend\n\nBattleTower_Lobby_EventScript_160342::\n\tlock\n\tfaceplayer\n\tclearflag FLAG_SYS_IS_LINKING\n\ttextcolor 0x1\n\tmessage BattleTower_Lobby_Text_19A487\n\twaitmessage\n\tsetvar VAR_0x8004, 0\n\tspecial BattleTowerUtil\n\tcompare VAR_RESULT, 6\n\tgoto_if_eq BattleTower_Lobby_EventScript_16037D\n\tspecial AwardBattleTowerRibbons\n\tcompare VAR_RESULT, 0\n\tgoto_if_eq BattleTower_Lobby_EventScript_16037D\n\tmessage BattleTower_Lobby_Text_19A6BE\n\twaitmessage\n\tplayfanfare MUS_OBTAIN_ITEM\n\twaitfanfare\n\tmsgbox BattleTower_Lobby_Text_19A719, MSGBOX_DEFAULT\n\nBattleTower_Lobby_EventScript_16037D::\n\tsetvar VAR_0x8004, 8\n\tspecial BattleTowerUtil\n\tcompare VAR_RESULT, 1\n\tgoto_if_eq BattleTower_Lobby_EventScript_1603AD\n\tmessage BattleTower_Lobby_Text_19A589\n\twaitmessage\n\tsetvar VAR_0x8004, 13\n\tspecial SetBattleTowerProperty\n\tspecial DetermineBattleTowerPrize\n\tsetvar VAR_0x8004, 3\n\tspecial SaveBattleTowerProgress\n\tplayse SE_SAVE\n\twaitse\n\nBattleTower_Lobby_EventScript_1603AD::\n\tsetvar VAR_0x8004, 0\n\tsetvar VAR_0x8005, 3\n\tspecial SetBattleTowerProperty\n\tmessage BattleTower_Lobby_Text_19A4BB\n\twaitmessage\n\tspecial GiveBattleTowerPrize\n\tswitch VAR_RESULT\n\tcase 0, BattleTower_Lobby_EventScript_160408\n\ttextcolor 0x3\n\tmessage BattleTower_Lobby_Text_19A506\n\twaitmessage\n\tplayfanfare MUS_OBTAIN_ITEM\n\twaitfanfare\n\tsetvar VAR_0x8004, 9\n\ttextcolor 0x1\n\tspecial BattleTowerUtil\n\tcompare VAR_RESULT, 49\n\tgoto_if_ne BattleTower_Lobby_EventScript_1603F8\n\tmsgbox BattleTower_Lobby_Text_19A617, MSGBOX_DEFAULT\n\nBattleTower_Lobby_EventScript_1603F8::\n\tmsgbox BattleTower_Lobby_Text_199FA9, MSGBOX_DEFAULT\n\tclosemessage\n\tsetvar VAR_TEMP_0, 5\n\trelease\n\tend\n\nBattleTower_Lobby_EventScript_160408::\n\tmsgbox BattleTower_Lobby_Text_19A520, MSGBOX_DEFAULT\n\twaitmessage\n\tclosemessage\n\tsetvar VAR_TEMP_0, 5\n\trelease\n\tend\n\nBattleTower_Lobby_EventScript_160419::\n\tlock\n\tfaceplayer\n\ttextcolor 0x1\n\tclearflag FLAG_SYS_IS_LINKING\n\tmessage BattleTower_Lobby_Text_19A571\n\twaitmessage\n\tmessage BattleTower_Lobby_Text_19A589\n\twaitmessage\n\tsetvar VAR_0x8004, 13\n\tspecial SetBattleTowerProperty\n\tsetvar VAR_0x8004, 0\n\tspecial SaveBattleTowerProgress\n\tplayse SE_SAVE\n\twaitse\n\tmsgbox BattleTower_Lobby_Text_199FA9, MSGBOX_DEFAULT\n\tclosemessage\n\tsetvar VAR_TEMP_0, 5\n\trelease\n\tend\n\nBattleTower_Lobby_EventScript_16044B::\n\tlock\n\tfaceplayer\n\ttextcolor 0x1\n\tmessage BattleTower_Lobby_Text_19A5B1\n\twaitmessage\n\tmessage BattleTower_Lobby_Text_19A5CE\n\twaitmessage\n\tsetvar VAR_0x8004, 1\n\tspecial SaveBattleTowerProgress\n\tplayse SE_SAVE\n\twaitse\n\tsetvar VAR_0x8004, 8\n\tsetvar VAR_0x8005, 0\n\tspecial SetBattleTowerProperty\n\tsetvar VAR_TEMP_0, 5\n\tspecial SavePlayerParty\n\tsetflag FLAG_SYS_IS_LINKING\n\tcallnative RecalculatePartyStats\n\tspecial SetBattleTowerParty\n\tmsgbox BattleTower_Lobby_Text_19A0A8, MSGBOX_DEFAULT\n\tclosemessage\n\tcall BattleTower_Lobby_EventScript_160664\n\twarp MAP_RS_BATTLE_TOWER_ELEVATOR, 255, 2, 6\n\tsetvar VAR_TEMP_0, 0\n\twaitstate\n\nBattleTower_Lobby_EventScript_16049E::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8004, 0\n\tspecial BattleTowerUtil\n\tcompare VAR_RESULT, 6\n\tgoto_if_eq BattleTower_Lobby_EventScript_160342\n\tspecial SavePlayerParty\n\tmsgbox BattleTower_Lobby_Text_199F2C, MSGBOX_DEFAULT\n\nBattleTower_Lobby_EventScript_1604BE::\n\tmessage BattleTower_Lobby_Text_199F79\n\twaitmessage\n\tmultichoice 18, 6, MULTICHOICE_CHALLENGE_INFO_EXIT, 0\n\tswitch VAR_RESULT\n\tcase 0, BattleTower_Lobby_EventScript_1604FA\n\tcase 1, BattleTower_Lobby_EventScript_160600\n\tcase 2, BattleTower_Lobby_EventScript_160652\n\tcase 127, BattleTower_Lobby_EventScript_160652\n\nBattleTower_Lobby_EventScript_1604FA::\n\tmessage BattleTower_Lobby_Text_19A024\n\twaitmessage\n\tmultichoice 18, 6, MULTICHOICE_BATTLE_TOWER_LEVELS, 0\n\tswitch VAR_RESULT\n\tcase 2, BattleTower_Lobby_EventScript_160652\n\tcase 127, BattleTower_Lobby_EventScript_160652\n\tspecial CheckPartyBattleTowerBanlist\n\tcompare VAR_0x8004, 1\n\tgoto_if_eq BattleTower_Lobby_EventScript_16060D\n\tsetvar VAR_0x8004, 1\n\tcopyvar VAR_0x8005, VAR_RESULT\n\tcopyvar VAR_0x8006, VAR_RESULT\n\tspecial SetBattleTowerProperty\n\tmsgbox BattleTower_Lobby_Text_19A07B, MSGBOX_DEFAULT\n\tsetflag FLAG_TEMP_1\n\tfadescreen FADE_TO_BLACK\n\tspecial ChooseBattleTowerPlayerParty\n\twaitstate\n\tclearflag FLAG_TEMP_1\n\tcompare VAR_RESULT, 0\n\tgoto_if_eq BattleTower_Lobby_EventScript_16064F\n\tmsgbox BattleTower_Lobby_Text_199FDA, MSGBOX_YESNO\n\tswitch VAR_RESULT\n\tcase NO, BattleTower_Lobby_EventScript_16064F\n\tcase YES, BattleTower_Lobby_EventScript_160587\n\tcase 127, BattleTower_Lobby_EventScript_16064F\n\nBattleTower_Lobby_EventScript_160587::\n\tsetvar VAR_0x8004, 5\n\tspecial SetBattleTowerProperty\n\tsetvar VAR_TEMP_0, 0\n\tsetvar VAR_0x8004, 11\n\tspecial SetBattleTowerProperty\n\tsetvar VAR_0x8004, 0\n\tsetvar VAR_0x8005, 1\n\tspecial SetBattleTowerProperty\n\tsetvar VAR_0x8004, 8\n\tsetvar VAR_0x8005, 0\n\tspecial SetBattleTowerProperty\n\tsetdynamicwarp MAP_RS_BATTLE_TOWER_LOBBY, 255, 6, 6\n\tspecial LoadPlayerParty\n\tclosemessage\n\tdelay 2\n\tcall EventScript_AskSaveGame\n\tsetvar VAR_TEMP_0, 5\n\t//erasebox 0, 0, 15, 10\n\tcompare VAR_RESULT, 0\n\tgoto_if_eq BattleTower_Lobby_EventScript_160642\n\tincrementgamestat GAME_STAT_ENTERED_BATTLE_TOWER\n\tspecial SavePlayerParty\n\tsetflag FLAG_SYS_IS_LINKING\n\tcallnative RecalculatePartyStats\n\tspecial SetBattleTowerParty\n\tmsgbox BattleTower_Lobby_Text_19A0A8, MSGBOX_DEFAULT\n\tclosemessage\n\tcall BattleTower_Lobby_EventScript_160664\n\twarp MAP_RS_BATTLE_TOWER_ELEVATOR, 255, 2, 6\n\tsetvar VAR_TEMP_0, 0\n\twaitstate\n\nBattleTower_Lobby_EventScript_160600::\n\tmsgbox BattleTower_Lobby_Text_19A0D1, MSGBOX_DEFAULT\n\tgoto BattleTower_Lobby_EventScript_1604BE\n\nBattleTower_Lobby_EventScript_16060D::\n\tswitch VAR_RESULT\n\tcase 0, BattleTower_Lobby_EventScript_160628\n\tcase 1, BattleTower_Lobby_EventScript_160635\n\nBattleTower_Lobby_EventScript_160628::\n\ttextcolor 0x1\n\tmsgbox BattleTower_Lobby_Text_19A249, MSGBOX_DEFAULT\n\tgoto BattleTower_Lobby_EventScript_160662\n\nBattleTower_Lobby_EventScript_160635::\n\tmsgbox BattleTower_Lobby_Text_19A32D, MSGBOX_DEFAULT\n\tgoto BattleTower_Lobby_EventScript_160662\n\nBattleTower_Lobby_EventScript_160642::\n\tsetvar VAR_0x8004, 12\n\tspecial SetBattleTowerProperty\n\tgoto BattleTower_Lobby_EventScript_160652\n\nBattleTower_Lobby_EventScript_16064F::\n\tspecial LoadPlayerParty\n\nBattleTower_Lobby_EventScript_160652::\n\tmsgbox BattleTower_Lobby_Text_199FA9, MSGBOX_DEFAULT\n\tsetvar VAR_0x8004, 11\n\tspecial SetBattleTowerProperty\n\nBattleTower_Lobby_EventScript_160662::\n\trelease\n\tend\n\nBattleTower_Lobby_EventScript_160664::\n\tapplymovement 1, BattleTower_Lobby_Movement_160693\n\tapplymovement OBJ_EVENT_ID_PLAYER, BattleTower_Lobby_Movement_160693\n\twaitmovement 0\n\topendoor 6, 1\n\twaitdooranim\n\tapplymovement 1, BattleTower_Lobby_Movement_160697\n\tapplymovement OBJ_EVENT_ID_PLAYER, BattleTower_Lobby_Movement_16069A\n\twaitmovement 0\n\tclosedoor 6, 1\n\twaitdooranim\n\treturn\n\nBattleTower_Lobby_Movement_160693::\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nBattleTower_Lobby_Movement_160697::\n\twalk_up\n\tset_invisible\n\tstep_end\n\nBattleTower_Lobby_Movement_16069A::\n\twalk_up\n\twalk_up\n\tset_invisible\n\tstep_end\n\n@ 816069E\n\twalk_fast_up\n\twalk_fast_up\n\twalk_fast_up\n\twalk_fast_up\n\twalk_fast_up\n\tset_invisible\n\tstep_end\n\nBattleTower_Lobby_EventScript_1606A5::\n\tmsgbox BattleTower_Lobby_Text_19A747, MSGBOX_NPC\n\tend\n\nBattleTower_Lobby_EventScript_160715::\n\tmsgbox BattleTower_Lobby_Text_19A8AE, MSGBOX_NPC\n\tend\n\nBattleTower_Lobby_EventScript_16071E::\n\tmsgbox BattleTower_Lobby_Text_19A946, MSGBOX_NPC\n\tend\n\nBattleTower_Lobby_EventScript_160727::\n\tlockall\n\tcallnative ShowBattleTowerRecords\n\twaitbuttonpress\n\tcallnative RemoveRecordsWindow\n\treleaseall\n\tend\n\t\nBattleTower_Lobby_EventScript_Scott::\n\tlock\n\tfaceplayer\n\tcheckitem ITEM_EON_TICKET, 1\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq BattleTower_Lobby_EventScript_Scott_GaveEonTicket\n\tcheckitem ITEM_AURORA_TICKET, 1\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq BattleTower_Lobby_EventScript_Scott_TryGiveEonTicket\n\tmsgbox BattleTower_Lobby_Text_Scott28Wins, MSGBOX_DEFAULT\n\tgiveitem ITEM_AURORA_TICKET, 1\n\tsetflag FLAG_RECEIVED_AURORA_TICKET\n\tsetflag FLAG_ENABLE_SHIP_BIRTH_ISLAND\n\tmsgbox BattleTower_Lobby_Text_ScottExplainAuroraTicket, MSGBOX_DEFAULT\n\trelease\n\tend\n\nBattleTower_Lobby_EventScript_Scott_TryGiveEonTicket::\n\tcallnative GetBestBattleTowerStreakToVar0x8007\n\tcompare VAR_0x8007, 56\n\tgoto_if_lt BattleTower_Lobby_EventScript_Scott_GaveAuroraTicket\n\tmsgbox BattleTower_Lobby_Text_Scott56Wins, MSGBOX_DEFAULT\n\tgiveitem ITEM_EON_TICKET, 1\n\tmsgbox BattleTower_Lobby_Text_ScottExplainEonTicket, MSGBOX_DEFAULT\n\trelease\n\tend\n\nBattleTower_Lobby_EventScript_Scott_GaveAuroraTicket::\n\tmsgbox BattleTower_Lobby_Text_ScottGaveAuroraTicket, MSGBOX_DEFAULT\n\trelease\n\tend\n\nBattleTower_Lobby_EventScript_Scott_GaveEonTicket::\n\tmsgbox BattleTower_Lobby_Text_ScottGaveEonTicket, MSGBOX_DEFAULT\n\trelease\n\tend"
  },
  {
    "path": "data/maps/RS_BattleTower_Lobby/text.inc",
    "content": "BattleTower_Lobby_Text_199F2C::\n\t.string \"Welcome to the BATTLE TOWER!\\p\"\n\t.string \"Please register with me to enter\\n\"\n\t.string \"a BATTLE ROOM.$\"\n\nBattleTower_Lobby_Text_199F79::\n\t.string \"Would you like to make a\\n\"\n\t.string \"BATTLE ROOM challenge?$\"\n\nBattleTower_Lobby_Text_199FA9::\n\t.string \"We'll be looking forward to your\\n\"\n\t.string \"next challenge.$\"\n\nBattleTower_Lobby_Text_199FDA::\n\t.string \"Before entering a BATTLE ROOM\\n\"\n\t.string \"your progress must be saved.\\lIs that okay?$\"\n\nBattleTower_Lobby_Text_19A024::\n\t.string \"There are two BATTLE ROOMS,\\n\"\n\t.string \"Level 50 and Open Level.\\l\"\n\t.string \"Which would you like to challenge?$\"\n\nBattleTower_Lobby_Text_19A07B::\n\t.string \"Please select the POKéMON you wish\\n\"\n\t.string \"to enter.$\"\n\nBattleTower_Lobby_Text_19A0A8::\n\t.string \"I'll direct you to your BATTLE\\nROOM now.$\"\n\nBattleTower_Lobby_Text_19A0D1::\n\t.string \"The BATTLE TOWER is a facility made\\n\"\n\t.string \"especially for POKéMON battles.\\p\"\n\t.string \"Within the TOWER are many\\nBATTLE ROOMS.\\p\"\n\t.string \"The BATTLE ROOMs come in two styles,\\n\"\n\t.string \"Level 50 and Open Level.\\p\"\n\t.string \"The level 50 BATTLE ROOMS are\\n\"\n\t.string \"open to POKéMON up to and\\l\"\n\t.string \"including Level 50.\\p\"\n\t.string \"No other TRAINERS in the room\\n\"\n\t.string \"will have POKéMON below Level 50.\\p\"\n\t.string \"The Open Level BATTLE ROOMS\\n\"\n\t.string \"are open to POKéMON of all levels.\\p\"\n\t.string \"The levels of your opponents will\\n\"\n\t.string \"be adjusted to match the levels\\l\"\n\t.string \"of your POKéMON.\\p\"\n\t.string \"However, no other TRAINERS in the\\n\"\n\t.string \"room will have POKéMON that are\\lbelow Level 60.\\p\"\n\t.string \"In each BATTLE ROOM, seven\\n\"\n\t.string \"TRAINERS await your challenge.\\p\"\n\t.string \"Beat all seven, and you will be\\n\"\n\t.string \"rewarded with a fabulous prize.\\p\"\n\t.string \"You may also take a break from your\\n\"\n\t.string \"challenge by saving your progress.\\p\"\n\t.string \"Make sure you save properly\\n\"\n\t.string \"or you won't be able to\\lresume your challenge.$\"\n\nBattleTower_Lobby_Text_19A249::\n\t.string \"Excuse me!\\p\"\n\t.string \"You don't have three eligible\\nPOKéMON.\\p\"\n\t.string \"You must have three different\\n\"\n\t.string \"POKéMON of Level 50 or less\\lto enter.\\p\"\n\t.string \"They also must be holding different\\n\"\n\t.string \"kinds of items.\\p\"\n\t.string \"EGGS are ineligible.\\p\"\n\t.string \"Please come see me when\\nyou are ready.$\"\n\nBattleTower_Lobby_Text_19A32D::\n\t.string \"Excuse me!\\p\"\n\t.string \"You don't have three eligible\\nPOKéMON.\\p\"\n\t.string \"You must have three different\\nPOKéMON \"\n\t.string \"to enter.\\p\"\n\t.string \"They also must be holding different\\n\"\n\t.string \"kinds of items.\\p\"\n\t.string \"EGGS are ineligible.\\p\"\n\t.string \"Please come see me when\\nyou are ready.$\"\n\nBattleTower_Lobby_Text_19A3FD::\n\t.string \"Excuse me!\\p\"\n\t.string \"You didn't save before you quit your\\n\"\n\t.string \"challenge last time.\\p\"\n\t.string \"Because of that, your challenge so\\n\"\n\t.string \"far has been disqualified. Sorry!$\"\n\nBattleTower_Lobby_Text_19A487::\n\t.string \"Congratulations!\\n\"\n\t.string \"You've beaten all seven TRAINERS!\\p\"\n\t.string \"$\"\n\nBattleTower_Lobby_Text_19A4BB::\n\t.string \"For beating your challenge, you\\n\"\n\t.string \"have earned this fabulous prize!\\p\"\n\t.string \"$\"\n\nBattleTower_Lobby_Text_19A506::\n\t.string \"{PLAYER} received the prize\\n\"\n\t.string \"{STR_VAR_1}.$\"\n\nBattleTower_Lobby_Text_19A520::\n\t.string \"Oh, your BAG appears to be full.\\p\"\n\t.string \"Please make room in your BAG,\\n\"\n\t.string \"then come see me.$\"\n\nBattleTower_Lobby_Text_19A571::\n\t.string \"Thank you for playing!\\p\"\n\t.string \"$\"\n\nBattleTower_Lobby_Text_19A589::\n\t.string \"Your record will be saved.\\n\"\n\t.string \"Please wait.$\"\n\nBattleTower_Lobby_Text_19A5B1::\n\t.string \"We've been waiting for you!\\p\"\n\t.string \"$\"\n\nBattleTower_Lobby_Text_19A5CE::\n\t.string \"Before entering a BATTLE ROOM,\\n\"\n\t.string \"your progress will be saved.\\lPlease wait.$\"\n\nBattleTower_Lobby_Text_19A617::\n\t.string \"You're finally about to face the\\n\"\n\t.string \"50th TRAINER.\\p\"\n\t.string \"From here on, every time you beat\\n\"\n\t.string \"seven TRAINERS in a row, your\\l\"\n\t.string \"POKéMON will receive a\\lcommemorative RIBBON.\\p\"\n\t.string \"Good luck!$\"\n\nBattleTower_Lobby_Text_19A6BE::\n\t.string \"Here are some RIBBONS for beating\\n\"\n\t.string \"seven tough TRAINERS in a row.\\p\"\n\t.string \"{COLOR DARK_GRAY}{PLAYER} received some RIBBONS!$\"\n\nBattleTower_Lobby_Text_19A719::\n\t.string \"{COLOR DARK_GRAY}{PLAYER} put the RIBBONS on the\\n\"\n\t.string \"challenger POKéMON.$\"\n\nBattleTower_Lobby_Text_19A747::\n    .string \"Hello, hello!\\n\"\n    .string \"Where are you from, TRAINER?\\p\"\n    .string \"…\\p\"\n    .string \"KANTO? PALLET TOWN?\\n\"\n    .string \"That's quite a ways away!$\"\n\nBattleTower_Lobby_Text_19A8AE::\n\t.string \"The number of matches you win in\\n\"\n\t.string \"a row is recorded.\\p\"\n\t.string \"The record is posted beside the\\n\"\n\t.string \"registration counter.$\"\n\nBattleTower_Lobby_Text_19A946::\n\t.string \"Once you're in the BATTLE TOWER,\\n\"\n\t.string \"you can't leave until you lose or\\l\"\n\t.string \"beat seven TRAINERS in a row.\\p\"\n\t.string \"You'd best be certain that you're\\n\"\n\t.string \"up to the challenge.$\"\n\nBattleTower_Lobby_Text_Scott28Wins::\n\t.string \"SCOTT: I heard about you!\\n\"\n\t.string \"How you ruled the BATTLE TOWER!\\l\"\n\t.string \"You beat 28 TRAINERS in a row?\\p\"\n\t.string \"That's fantastic!\\n\"\n\t.string \"I want you to have this!$\"\n\nBattleTower_Lobby_Text_ScottExplainAuroraTicket::\n\t.string \"Bring that ticket to your\\n\"\n\t.string \"friend at the VERMILION HARBOR.\\p\"\n\t.string \"He'll be able to take you to a\\n\"\n\t.string \"small island south of SIX ISLAND.\\p\"\n\t.string \"There's a strange stone and\\n\"\n\t.string \"nothing else there.\\p\"\n\t.string \"It's nice and private, though,\\n\"\n\t.string \"so it's a good vacation spot!$\"\n\nBattleTower_Lobby_Text_Scott56Wins::\n\t.string \"SCOTT: Oh my! I heard about you!\\n\"\n\t.string \"How you crushed the BATTLE TOWER!\\p\"\n\t.string \"You beat 56 TRAINERS in a row?\\p\"\n\t.string \"That's ridiculously spectacular!\\n\"\n\t.string \"You've got to have this!$\"\n\nBattleTower_Lobby_Text_ScottExplainEonTicket::\n\t.string \"Bring that ticket to your\\n\"\n\t.string \"friend at the VERMILION HARBOR.\\p\"\n\t.string \"He'll be able to take you to an\\n\"\n\t.string \"island that's not far from here.\\p\"\n\t.string \"There's a nice little grove there,\\n\"\n\t.string \"perfect for a relaxing picnic\\l\"\n\t.string \"when you're not training.$\"\n\nBattleTower_Lobby_Text_ScottGaveAuroraTicket::\n\t.string \"I'll be expecting to hear even\\n\"\n\t.string \"greater things about you now!$\"\n\nBattleTower_Lobby_Text_ScottGaveEonTicket::\n\t.string \"This BATTLE TOWER has been a\\n\"\n\t.string \"huge success but…\\p\"\n\t.string \"Perhaps it's time to push\\n\"\n\t.string \"this project to a new frontier…$\"\n\t\t"
  },
  {
    "path": "data/maps/RecordCorner/map.json",
    "content": "{\n  \"id\": \"MAP_RECORD_CORNER\",\n  \"name\": \"RecordCorner\",\n  \"layout\": \"LAYOUT_RECORD_CORNER\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SPECIAL_AREA\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RecordCorner_EventScript_Attendant\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"RecordCorner_EventScript_Spot0\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"RecordCorner_EventScript_Spot1\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"RecordCorner_EventScript_Spot2\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"RecordCorner_EventScript_Spot3\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/RecordCorner/scripts.inc",
    "content": "RecordCorner_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/RockTunnel_1F/map.json",
    "content": "{\n  \"id\": \"MAP_ROCK_TUNNEL_1F\",\n  \"name\": \"RockTunnel_1F\",\n  \"layout\": \"LAYOUT_ROCK_TUNNEL_1F\",\n  \"music\": \"MUS_MT_MOON\",\n  \"region_map_section\": \"MAPSEC_ROCK_TUNNEL\",\n  \"requires_flash\": true,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"RockTunnel_1F_EventScript_Dana\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 39,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"RockTunnel_1F_EventScript_Ariana\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 45,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"RockTunnel_1F_EventScript_Leah\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"RockTunnel_1F_EventScript_Lucas\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"RockTunnel_1F_EventScript_Oliver\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"RockTunnel_1F_EventScript_Lenny\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKE_MANIAC\",\n      \"x\": 27,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"RockTunnel_1F_EventScript_Ashton\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 37,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RockTunnel_1F_EventScript_ItemRepel\",\n      \"flag\": \"FLAG_HIDE_ROCK_TUNNEL_1F_REPEL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RockTunnel_1F_EventScript_ItemPearl\",\n      \"flag\": \"FLAG_HIDE_ROCK_TUNNEL_1F_PEARL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RockTunnel_1F_EventScript_ItemEscapeRope\",\n      \"flag\": \"FLAG_HIDE_ROCK_TUNNEL_1F_ESCAPE_ROPE\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Geodude\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 17,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE10\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 45,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCK_TUNNEL_B1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCK_TUNNEL_B1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCK_TUNNEL_B1F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 45,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCK_TUNNEL_B1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 37,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE10\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"RockTunnel_1F_EventScript_RouteSign\"\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/RockTunnel_1F/scripts.inc",
    "content": ".set LOCALID_GEODUDE_MASTER, 11\n.set TRAINER, VAR_0x8009\n\nRockTunnel_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, RockTunnel_1F_OnTransition\n\t.byte 0\n\nRockTunnel_1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_ROCK_TUNNEL_1F\n\tgoto RockTunnel_1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nRockTunnel_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_GEODUDE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, RockTunnel_1F_MapScript_GeodudeMasterMovementType\n\tend\n\nRockTunnel_1F_MapScript_GeodudeMasterMovementType::\n\tsetobjectmovementtype LOCALID_GEODUDE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRockTunnel_1F_EventScript_RouteSign::\n\tmsgbox RockTunnel_1F_Text_RouteSign, MSGBOX_SIGN\n\tend\n\nRockTunnel_1F_EventScript_Lenny::\n\ttrainerbattle_single TRAINER_HIKER_LENNY, RockTunnel_1F_Text_LennyIntro, RockTunnel_1F_Text_LennyDefeat\n\tmsgbox RockTunnel_1F_Text_LennyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_1F_EventScript_Oliver::\n\ttrainerbattle_single TRAINER_HIKER_OLIVER, RockTunnel_1F_Text_OliverIntro, RockTunnel_1F_Text_OliverDefeat\n\tmsgbox RockTunnel_1F_Text_OliverPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_1F_EventScript_Lucas::\n\ttrainerbattle_single TRAINER_HIKER_LUCAS, RockTunnel_1F_Text_LucasIntro, RockTunnel_1F_Text_LucasDefeat\n\tmsgbox RockTunnel_1F_Text_LucasPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_1F_EventScript_Ashton::\n\ttrainerbattle_single TRAINER_POKEMANIAC_ASHTON, RockTunnel_1F_Text_AshtonIntro, RockTunnel_1F_Text_AshtonDefeat\n\tmsgbox RockTunnel_1F_Text_AshtonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_1F_EventScript_Leah::\n\ttrainerbattle_single TRAINER_PICNICKER_LEAH, RockTunnel_1F_Text_LeahIntro, RockTunnel_1F_Text_LeahDefeat\n\tmsgbox RockTunnel_1F_Text_LeahPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_1F_EventScript_Ariana::\n\ttrainerbattle_single TRAINER_PICNICKER_ARIANA, RockTunnel_1F_Text_ArianaIntro, RockTunnel_1F_Text_ArianaDefeat\n\tmsgbox RockTunnel_1F_Text_ArianaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_1F_EventScript_Dana::\n\ttrainerbattle_single TRAINER_PICNICKER_DANA, RockTunnel_1F_Text_DanaIntro, RockTunnel_1F_Text_DanaDefeat\n\tmsgbox RockTunnel_1F_Text_DanaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/RockTunnel_1F/text.inc",
    "content": "RockTunnel_1F_Text_LennyIntro::\n    .string \"This tunnel goes a long way, kid!$\"\n\nRockTunnel_1F_Text_LennyDefeat::\n    .string \"Doh!\\n\"\n    .string \"You win!$\"\n\nRockTunnel_1F_Text_LennyPostBattle::\n    .string \"Watch for ONIX.\\n\"\n    .string \"They appear only occasionally.\\p\"\n    .string \"High-level ones can put the\\n\"\n    .string \"squeeze on you!$\"\n\nRockTunnel_1F_Text_OliverIntro::\n    .string \"Hmm.\\n\"\n    .string \"Maybe I'm lost in here…$\"\n\nRockTunnel_1F_Text_OliverDefeat::\n    .string \"Ease up!\\n\"\n    .string \"What am I doing?\\l\"\n    .string \"Which way is out?$\"\n\nRockTunnel_1F_Text_OliverPostBattle::\n    .string \"That sleeping POKéMON on ROUTE 12\\n\"\n    .string \"forced me to take this detour.$\"\n\nRockTunnel_1F_Text_LucasIntro::\n    .string \"Outsiders like you need to show me\\n\"\n    .string \"some respect!$\"\n\nRockTunnel_1F_Text_LucasDefeat::\n    .string \"I give!$\"\n\nRockTunnel_1F_Text_LucasPostBattle::\n    .string \"You're talented enough to hike!$\"\n\nRockTunnel_1F_Text_AshtonIntro::\n    .string \"POKéMON fight!\\n\"\n    .string \"Ready, go!$\"\n\nRockTunnel_1F_Text_AshtonDefeat::\n    .string \"Game over!$\"\n\nRockTunnel_1F_Text_AshtonPostBattle::\n    .string \"Oh well, I'll get a ZUBAT as I go!$\"\n\nRockTunnel_1F_Text_LeahIntro::\n    .string \"Eek!\\p\"\n    .string \"Don't try anything funny in the\\n\"\n    .string \"dark!$\"\n\nRockTunnel_1F_Text_LeahDefeat::\n    .string \"It was too dark…$\"\n\nRockTunnel_1F_Text_LeahPostBattle::\n    .string \"I saw a MACHOP in this tunnel.$\"\n\nRockTunnel_1F_Text_DanaIntro::\n    .string \"I came this far looking for wild\\n\"\n    .string \"POKéMON.$\"\n\nRockTunnel_1F_Text_DanaDefeat::\n    .string \"I'm out of POKéMON!$\"\n\nRockTunnel_1F_Text_DanaPostBattle::\n    .string \"You looked cute and harmless.\\n\"\n    .string \"Was I ever wrong!$\"\n\nRockTunnel_1F_Text_ArianaIntro::\n    .string \"You have POKéMON!\\n\"\n    .string \"Let's start!$\"\n\nRockTunnel_1F_Text_ArianaDefeat::\n    .string \"You play hard!$\"\n\nRockTunnel_1F_Text_ArianaPostBattle::\n    .string \"Whew!\\n\"\n    .string \"I'm all sweaty now.$\"\n\nRockTunnel_1F_Text_RouteSign::\n    .string \"ROCK TUNNEL\\n\"\n    .string \"CERULEAN CITY - LAVENDER TOWN$\"\n\n"
  },
  {
    "path": "data/maps/RockTunnel_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_ROCK_TUNNEL_B1F\",\n  \"name\": \"RockTunnel_B1F\",\n  \"layout\": \"LAYOUT_ROCK_TUNNEL_B1F\",\n  \"music\": \"MUS_MT_MOON\",\n  \"region_map_section\": \"MAPSEC_ROCK_TUNNEL\",\n  \"requires_flash\": true,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKE_MANIAC\",\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"RockTunnel_B1F_EventScript_Cooper\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"RockTunnel_B1F_EventScript_Dudley\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"RockTunnel_B1F_EventScript_Sofia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"RockTunnel_B1F_EventScript_Allen\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 41,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"RockTunnel_B1F_EventScript_Eric\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKE_MANIAC\",\n      \"x\": 23,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"RockTunnel_B1F_EventScript_Steve\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"RockTunnel_B1F_EventScript_Martha\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKE_MANIAC\",\n      \"x\": 29,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"RockTunnel_B1F_EventScript_Winston\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RockTunnel_B1F_EventScript_RockSlideTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 37,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RockTunnel_B1F_EventScript_ItemRevive\",\n      \"flag\": \"FLAG_HIDE_ROCK_TUNNEL_B1F_REVIVE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RockTunnel_B1F_EventScript_ItemMaxEther\",\n      \"flag\": \"FLAG_HIDE_ROCK_TUNNEL_B1F_MAX_ETHER\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 39,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 42,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 43,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_18\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 45,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_19\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 45,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1A\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1B\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1C\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1D\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1E\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1F\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_11\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Zubat\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 38,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCK_TUNNEL_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCK_TUNNEL_1F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 27,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCK_TUNNEL_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCK_TUNNEL_1F\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/RockTunnel_B1F/scripts.inc",
    "content": ".set LOCALID_ZUBAT_MASTER, 27\n.set TRAINER, VAR_0x8009\n\nRockTunnel_B1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, RockTunnel_B1F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRockTunnel_B1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_ZUBAT\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, RockTunnel_B1F_MapScript_ZubatMasterMovementType\n\tend\n\nRockTunnel_B1F_MapScript_ZubatMasterMovementType::\n\tsetobjectmovementtype LOCALID_ZUBAT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRockTunnel_B1F_EventScript_Sofia::\n\ttrainerbattle_single TRAINER_PICNICKER_SOFIA, RockTunnel_B1F_Text_SofiaIntro, RockTunnel_B1F_Text_SofiaDefeat\n\tmsgbox RockTunnel_B1F_Text_SofiaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_B1F_EventScript_Martha::\n\ttrainerbattle_single TRAINER_PICNICKER_MARTHA, RockTunnel_B1F_Text_MarthaIntro, RockTunnel_B1F_Text_MarthaDefeat\n\tmsgbox RockTunnel_B1F_Text_MarthaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_B1F_EventScript_Dudley::\n\ttrainerbattle_single TRAINER_HIKER_DUDLEY, RockTunnel_B1F_Text_DudleyIntro, RockTunnel_B1F_Text_DudleyDefeat\n\tmsgbox RockTunnel_B1F_Text_DudleyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_B1F_EventScript_Allen::\n\ttrainerbattle_single TRAINER_HIKER_ALLEN, RockTunnel_B1F_Text_AllenIntro, RockTunnel_B1F_Text_AllenDefeat\n\tmsgbox RockTunnel_B1F_Text_AllenPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_B1F_EventScript_Eric::\n\ttrainerbattle_single TRAINER_HIKER_ERIC, RockTunnel_B1F_Text_EricIntro, RockTunnel_B1F_Text_EricDefeat\n\tmsgbox RockTunnel_B1F_Text_EricPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_B1F_EventScript_Cooper::\n\ttrainerbattle_single TRAINER_POKEMANIAC_COOPER, RockTunnel_B1F_Text_CooperIntro, RockTunnel_B1F_Text_CooperDefeat\n\tmsgbox RockTunnel_B1F_Text_CooperPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_B1F_EventScript_Steve::\n\ttrainerbattle_single TRAINER_POKEMANIAC_STEVE, RockTunnel_B1F_Text_SteveIntro, RockTunnel_B1F_Text_SteveDefeat\n\tmsgbox RockTunnel_B1F_Text_StevePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRockTunnel_B1F_EventScript_Winston::\n\ttrainerbattle_single TRAINER_POKEMANIAC_WINSTON, RockTunnel_B1F_Text_WinstonIntro, RockTunnel_B1F_Text_WinstonDefeat\n\tmsgbox RockTunnel_B1F_Text_WinstonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/RockTunnel_B1F/text.inc",
    "content": "RockTunnel_B1F_Text_SofiaIntro::\n    .string \"Do you know how you can avoid\\n\"\n    .string \"getting lost in the mountains?\\p\"\n    .string \"You can bend twigs as trail\\n\"\n    .string \"markers.$\"\n\nRockTunnel_B1F_Text_SofiaDefeat::\n    .string \"Ohhh!\\n\"\n    .string \"I did my best!$\"\n\nRockTunnel_B1F_Text_SofiaPostBattle::\n    .string \"I want to go home!$\"\n\nRockTunnel_B1F_Text_DudleyIntro::\n    .string \"Hahaha!\\n\"\n    .string \"Can you beat my power?$\"\n\nRockTunnel_B1F_Text_DudleyDefeat::\n    .string \"Oops!\\n\"\n    .string \"Outmuscled!$\"\n\nRockTunnel_B1F_Text_DudleyPostBattle::\n    .string \"I go for power because I hate\\n\"\n    .string \"thinking.$\"\n\nRockTunnel_B1F_Text_CooperIntro::\n    .string \"You have a POKéDEX?\\n\"\n    .string \"I want one, too.$\"\n\nRockTunnel_B1F_Text_CooperDefeat::\n    .string \"Shoot!\\n\"\n    .string \"I am so jealous!$\"\n\nRockTunnel_B1F_Text_CooperPostBattle::\n    .string \"When you finish your POKéDEX,\\n\"\n    .string \"can I have it?$\"\n\nRockTunnel_B1F_Text_SteveIntro::\n    .string \"Um… Do you know about POKéMON\\n\"\n    .string \"cosplay?$\"\n\nRockTunnel_B1F_Text_SteveDefeat::\n    .string \"Well, that's that.$\"\n\nRockTunnel_B1F_Text_StevePostBattle::\n    .string \"POKéMON cosplay is dressing up as\\n\"\n    .string \"POKéMON for fun.\\p\"\n    .string \"CLEFAIRY is a favorite.$\"\n\nRockTunnel_B1F_Text_AllenIntro::\n    .string \"My POKéMON techniques will leave\\n\"\n    .string \"you crying!$\"\n\nRockTunnel_B1F_Text_AllenDefeat::\n    .string \"I give!\\n\"\n    .string \"You're a better technician!$\"\n\nRockTunnel_B1F_Text_AllenPostBattle::\n    .string \"In mountains, you'll often find\\n\"\n    .string \"ROCK-type POKéMON.$\"\n\nRockTunnel_B1F_Text_MarthaIntro::\n    .string \"I don't often come here, but I will\\n\"\n    .string \"battle you.$\"\n\nRockTunnel_B1F_Text_MarthaDefeat::\n    .string \"Oh!\\n\"\n    .string \"I lost!$\"\n\nRockTunnel_B1F_Text_MarthaPostBattle::\n    .string \"I like tiny POKéMON.\\n\"\n    .string \"Big ones are too scary!$\"\n\nRockTunnel_B1F_Text_EricIntro::\n    .string \"Hit me with your best shot!$\"\n\nRockTunnel_B1F_Text_EricDefeat::\n    .string \"Fired away!$\"\n\nRockTunnel_B1F_Text_EricPostBattle::\n    .string \"I'll raise my POKéMON to beat\\n\"\n    .string \"yours, kid.$\"\n\nRockTunnel_B1F_Text_WinstonIntro::\n    .string \"I draw illustrations of POKéMON\\n\"\n    .string \"when I'm home.$\"\n\nRockTunnel_B1F_Text_WinstonDefeat::\n    .string \"Whew…\\n\"\n    .string \"I'm exhausted…$\"\n\nRockTunnel_B1F_Text_WinstonPostBattle::\n    .string \"I'm an artist, not a fighter.\\n\"\n    .string \"I'll go home to draw.$\"\n\n"
  },
  {
    "path": "data/maps/RocketHideout_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_ROCKET_HIDEOUT_B1F\",\n  \"name\": \"RocketHideout_B1F\",\n  \"layout\": \"LAYOUT_ROCKET_HIDEOUT_B1F\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_ROCKET_HIDEOUT\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": -1,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_2\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"RocketHideout_B1F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"RocketHideout_B1F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"RocketHideout_B1F_EventScript_Grunt4\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"RocketHideout_B1F_EventScript_Grunt3\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"RocketHideout_B1F_EventScript_Grunt5\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B1F_EventScript_ItemEscapeRope\",\n      \"flag\": \"FLAG_HIDE_ROCKET_HIDEOUT_B1F_ESCAPE_ROPE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B1F_EventScript_ItemHyperPotion\",\n      \"flag\": \"FLAG_HIDE_ROCKET_HIDEOUT_B1F_HYPER_POTION\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Arbok\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 12,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_CELADON_CITY_GAME_CORNER\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_B2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_B2F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 23,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_ELEVATOR\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 24,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_ELEVATOR\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_ELEVATOR\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 16,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"item\": \"ITEM_PP_UP\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B1F_PP_UP\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/RocketHideout_B1F/scripts.inc",
    "content": ".set LOCALID_ARBOK_MASTER, 8\n.set TRAINER, VAR_0x8009\n\nRocketHideout_B1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, RocketHideout_B1F_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, RocketHideout_B1F_OnTransition\n\t.byte 0\n\nRocketHideout_B1F_OnLoad::\n\tcall_if_not_defeated TRAINER_TEAM_ROCKET_GRUNT_12 RocketHideout_B1F_EventScript_SetBarrier\n\tend\n\nRocketHideout_B1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_ROCKET_HIDEOUT_B1F\n\tgoto RocketHideout_B1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nRocketHideout_B1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_ARBOK\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, RocketHideout_B1F_MapScript_ArbokMasterMovementType\n\tend\n\nRocketHideout_B1F_MapScript_ArbokMasterMovementType::\n\tsetobjectmovementtype LOCALID_ARBOK_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRocketHideout_B1F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_8, RocketHideout_B1F_Text_Grunt1Intro, RocketHideout_B1F_Text_Grunt1Defeat\n\tmsgbox RocketHideout_B1F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRocketHideout_B1F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_9, RocketHideout_B1F_Text_Grunt2Intro, RocketHideout_B1F_Text_Grunt2Defeat\n\tmsgbox RocketHideout_B1F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRocketHideout_B1F_EventScript_Grunt3::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_10, RocketHideout_B1F_Text_Grunt3Intro, RocketHideout_B1F_Text_Grunt3Defeat\n\tmsgbox RocketHideout_B1F_Text_Grunt3PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRocketHideout_B1F_EventScript_Grunt4::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_11, RocketHideout_B1F_Text_Grunt4Intro, RocketHideout_B1F_Text_Grunt4Defeat\n\tmsgbox RocketHideout_B1F_Text_Grunt4PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRocketHideout_B1F_EventScript_Grunt5::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_12, RocketHideout_B1F_Text_Grunt5Intro, RocketHideout_B1F_Text_Grunt5Defeat, RocketHideout_B1F_EventScript_DefeatedGrunt5\n\tmsgbox RocketHideout_B1F_Text_Grunt5PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRocketHideout_B1F_EventScript_DefeatedGrunt5::\n\tcall RocketHideout_B1F_EventScript_RemoveBarrier\n\tplayse SE_UNLOCK\n\tspecial DrawWholeMapView\n\twaitse\n\trelease\n\tend\n\nRocketHideout_B1F_EventScript_SetBarrier::\n\tsetmetatile 20, 19, METATILE_SilphCo_HideoutBarrier_TopLeft_Floor, 1\n\tsetmetatile 21, 19, METATILE_SilphCo_HideoutBarrier_TopRight_Floor, 1\n\tsetmetatile 20, 20, METATILE_SilphCo_HideoutBarrier_BottomLeft, 1\n\tsetmetatile 21, 20, METATILE_SilphCo_HideoutBarrier_BottomRight, 1\n\tsetmetatile 20, 21, METATILE_SilphCo_HideoutFloor_ShadeFull, 0\n\tsetmetatile 21, 21, METATILE_SilphCo_HideoutFloor_ShadeFull, 0\n\treturn\n\nRocketHideout_B1F_EventScript_RemoveBarrier::\n\tsetmetatile 20, 19, METATILE_SilphCo_HideoutFloor_ShadeFull, 0\n\tsetmetatile 21, 19, METATILE_SilphCo_HideoutFloor, 0\n\tsetmetatile 20, 20, METATILE_SilphCo_HideoutFloor_ShadeFull, 0\n\tsetmetatile 21, 20, METATILE_SilphCo_HideoutFloor, 0\n\tsetmetatile 20, 21, METATILE_SilphCo_HideoutFloor_ShadeFull, 0\n\tsetmetatile 21, 21, METATILE_SilphCo_HideoutFloor, 0\n\treturn\n"
  },
  {
    "path": "data/maps/RocketHideout_B1F/text.inc",
    "content": "RocketHideout_B1F_Text_Grunt1Intro::\n    .string \"Who are you?\\n\"\n    .string \"How did you get here?$\"\n\nRocketHideout_B1F_Text_Grunt1Defeat::\n    .string \"Oww!\\n\"\n    .string \"Beaten!$\"\n\nRocketHideout_B1F_Text_Grunt1PostBattle::\n    .string \"Blast it… You're dissing TEAM\\n\"\n    .string \"ROCKET, aren't you?$\"\n\nRocketHideout_B1F_Text_Grunt2Intro::\n    .string \"You broke into TEAM ROCKET's\\n\"\n    .string \"operation? What nerve!$\"\n\nRocketHideout_B1F_Text_Grunt2Defeat::\n    .string \"Boom!$\"\n\nRocketHideout_B1F_Text_Grunt2PostBattle::\n    .string \"You're not going to get away with\\n\"\n    .string \"this, brat!$\"\n\nRocketHideout_B1F_Text_Grunt3Intro::\n    .string \"Intruder alert!$\"\n\nRocketHideout_B1F_Text_Grunt3Defeat::\n    .string \"I can't do it!$\"\n\nRocketHideout_B1F_Text_Grunt3PostBattle::\n    .string \"SILPH SCOPE? Humph!\\n\"\n    .string \"I don't know where it is.$\"\n\nRocketHideout_B1F_Text_Grunt4Intro::\n    .string \"Why did you come here?$\"\n\nRocketHideout_B1F_Text_Grunt4Defeat::\n    .string \"This won't do!$\"\n\nRocketHideout_B1F_Text_Grunt4PostBattle::\n    .string \"Okay, I'll talk…\\n\"\n    .string \"Take the elevator to see my BOSS.$\"\n\nRocketHideout_B1F_Text_Grunt5Intro::\n    .string \"Are you lost, you little mouse?$\"\n\nRocketHideout_B1F_Text_Grunt5Defeat::\n    .string \"Why…?$\"\n\nRocketHideout_B1F_Text_Grunt5PostBattle::\n    .string \"Uh-oh, that ruckus somehow opened\\n\"\n    .string \"the door!$\"\n\n"
  },
  {
    "path": "data/maps/RocketHideout_B2F/map.json",
    "content": "{\n  \"id\": \"MAP_ROCKET_HIDEOUT_B2F\",\n  \"name\": \"RocketHideout_B2F\",\n  \"layout\": \"LAYOUT_ROCKET_HIDEOUT_B2F\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_ROCKET_HIDEOUT\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": -2,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_2\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"RocketHideout_B2F_EventScript_Grunt\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B2F_EventScript_ItemXSpeed\",\n      \"flag\": \"FLAG_HIDE_ROCKET_HIDEOUT_B2F_X_SPEED\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B2F_EventScript_ItemMoonStone\",\n      \"flag\": \"FLAG_HIDE_ROCKET_HIDEOUT_B2F_MOON_STONE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B2F_EventScript_ItemTM12\",\n      \"flag\": \"FLAG_HIDE_ROCKET_HIDEOUT_B2F_TM12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B2F_EventScript_ItemSuperPotion\",\n      \"flag\": \"FLAG_HIDE_ROCKET_HIDEOUT_B2F_SUPER_POTION\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Rhydon\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 21,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_B3F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_B1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 23,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_B1F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_ELEVATOR\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_ELEVATOR\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/RocketHideout_B2F/scripts.inc",
    "content": ".set LOCALID_RHYDON_MASTER, 6\n.set TRAINER, VAR_0x8009\n\nRocketHideout_B2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, RocketHideout_B2F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRocketHideout_B2F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_RHYDON\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, RocketHideout_B2F_MapScript_RhydonMasterMovementType\n\tend\n\nRocketHideout_B2F_MapScript_RhydonMasterMovementType::\n\tsetobjectmovementtype LOCALID_RHYDON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRocketHideout_B2F_EventScript_Grunt::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_13, RocketHideout_B2F_Text_GruntIntro, RocketHideout_B2F_Text_GruntDefeat\n\tmsgbox RocketHideout_B2F_Text_GruntPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/RocketHideout_B2F/text.inc",
    "content": "RocketHideout_B2F_Text_GruntIntro::\n    .string \"BOSS said you can see ghosts with\\n\"\n    .string \"the SILPH SCOPE.$\"\n\nRocketHideout_B2F_Text_GruntDefeat::\n    .string \"I surrender!$\"\n\nRocketHideout_B2F_Text_GruntPostBattle::\n    .string \"The TEAM ROCKET HQ has four\\n\"\n    .string \"underground floors.\\p\"\n    .string \"Think you can reach the BOSS?$\"\n\n"
  },
  {
    "path": "data/maps/RocketHideout_B3F/map.json",
    "content": "{\n  \"id\": \"MAP_ROCKET_HIDEOUT_B3F\",\n  \"name\": \"RocketHideout_B3F\",\n  \"layout\": \"LAYOUT_ROCKET_HIDEOUT_B3F\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_ROCKET_HIDEOUT\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": -3,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_2\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"RocketHideout_B3F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"RocketHideout_B3F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B3F_EventScript_ItemRareCandy\",\n      \"flag\": \"FLAG_HIDE_ROCKET_HIDEOUT_B3F_RARE_CANDY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B3F_EventScript_ItemTM21\",\n      \"flag\": \"FLAG_HIDE_ROCKET_HIDEOUT_B3F_TM21\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B3F_EventScript_ItemBlackGlasses\",\n      \"flag\": \"FLAG_HIDE_ROCKET_HIDEOUT_B3F_BLACK_GLASSES\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Weezing\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 18,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_B2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_B4F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 1,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NUGGET\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B3F_NUGGET\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/RocketHideout_B3F/scripts.inc",
    "content": ".set LOCALID_WEEZING_MASTER, 6\n.set TRAINER, VAR_0x8009\n\nRocketHideout_B3F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, RocketHideout_B3F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRocketHideout_B3F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_WEEZING\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, RocketHideout_B3F_MapScript_WeezingMasterMovementType\n\tend\n\nRocketHideout_B3F_MapScript_WeezingMasterMovementType::\n\tsetobjectmovementtype LOCALID_WEEZING_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRocketHideout_B3F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_14, RocketHideout_B3F_Text_Grunt1Intro, RocketHideout_B3F_Text_Grunt1Defeat\n\tmsgbox RocketHideout_B3F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRocketHideout_B3F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_15, RocketHideout_B3F_Text_Grunt2Intro, RocketHideout_B3F_Text_Grunt2Defeat\n\tmsgbox RocketHideout_B3F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/RocketHideout_B3F/text.inc",
    "content": "RocketHideout_B3F_Text_Grunt1Intro::\n    .string \"Stop meddling in TEAM ROCKET's\\n\"\n    .string \"affairs or else!$\"\n\nRocketHideout_B3F_Text_Grunt1Defeat::\n    .string \"Oof!\\n\"\n    .string \"Taken down!$\"\n\nRocketHideout_B3F_Text_Grunt1PostBattle::\n    .string \"SILPH SCOPE?\\n\"\n    .string \"Oh, that machine the BOSS stole.\\p\"\n    .string \"It's here somewhere.$\"\n\nRocketHideout_B3F_Text_Grunt2Intro::\n    .string \"We got word from upstairs that you\\n\"\n    .string \"were coming!$\"\n\nRocketHideout_B3F_Text_Grunt2Defeat::\n    .string \"What?\\n\"\n    .string \"I lost? No!$\"\n\nRocketHideout_B3F_Text_Grunt2PostBattle::\n    .string \"Go ahead and go!\\p\"\n    .string \"But you can't run the elevator\\n\"\n    .string \"without the LIFT KEY.$\"\n\n"
  },
  {
    "path": "data/maps/RocketHideout_B4F/map.json",
    "content": "{\n  \"id\": \"MAP_ROCKET_HIDEOUT_B4F\",\n  \"name\": \"RocketHideout_B4F\",\n  \"layout\": \"LAYOUT_ROCKET_HIDEOUT_B4F\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_ROCKET_HIDEOUT\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": -4,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_2\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GIOVANNI\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B4F_EventScript_Giovanni\",\n      \"flag\": \"FLAG_HIDE_HIDEOUT_GIOVANNI\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B4F_EventScript_SilphScope\",\n      \"flag\": \"FLAG_HIDE_SILPH_SCOPE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"RocketHideout_B4F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B4F_EventScript_LiftKey\",\n      \"flag\": \"FLAG_HIDE_LIFT_KEY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B4F_EventScript_Grunt3\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B4F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_MISC_KANTO_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B4F_EventScript_ItemTM49\",\n      \"flag\": \"FLAG_HIDE_ROCKET_HIDEOUT_B4F_TM49\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B4F_EventScript_ItemMaxEther\",\n      \"flag\": \"FLAG_HIDE_ROCKET_HIDEOUT_B4F_MAX_ETHER\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 23,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"RocketHideout_B4F_EventScript_ItemCalcium\",\n      \"flag\": \"FLAG_HIDE_ROCKET_HIDEOUT_B4F_CALCIUM\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Persian\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_B3F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 23,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_ELEVATOR\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 21,\n      \"y\": 23,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROCKET_HIDEOUT_ELEVATOR\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 22,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NEST_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B4F_NEST_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 16,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NET_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B4F_NET_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/RocketHideout_B4F/scripts.inc",
    "content": ".equ LOCALID_GIOVANNI,    1\n.equ LOCALID_SILPH_SCOPE, 2\n.equ LOCALID_LIFT_KEY,    4\n.set LOCALID_PERSIAN_MASTER, 10\n.set TRAINER, VAR_0x8009\n\n.equ NUM_DOOR_GRUNTS_DEFEATED, VAR_TEMP_1\n\nRocketHideout_B4F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, RocketHideout_B4F_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, RocketHideout_B4F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRocketHideout_B4F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_PERSIAN\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, RocketHideout_B4F_MapScript_PersianMasterMovementType\n\tend\n\nRocketHideout_B4F_MapScript_PersianMasterMovementType::\n\tsetobjectmovementtype LOCALID_PERSIAN_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRocketHideout_B4F_OnLoad::\n\tsetvar NUM_DOOR_GRUNTS_DEFEATED, 0\n\tcall_if_defeated TRAINER_TEAM_ROCKET_GRUNT_16, RocketHideout_B4F_EventScript_CountGruntDefeated\n\tcall_if_defeated TRAINER_TEAM_ROCKET_GRUNT_17, RocketHideout_B4F_EventScript_CountGruntDefeated\n\tcall_if_ne NUM_DOOR_GRUNTS_DEFEATED, 2, RocketHideout_B4F_EventScript_SetBarrier\n\tend\n\nRocketHideout_B4F_EventScript_CountGruntDefeated::\n\taddvar NUM_DOOR_GRUNTS_DEFEATED, 1\n\treturn\n\nRocketHideout_B4F_EventScript_Giovanni::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_GIOVANNI, 0\n\tmessage RocketHideout_B4F_Text_GiovanniIntro\n\twaitmessage\n\tplaybgm MUS_ENCOUNTER_ROCKET, 0\n\twaitbuttonpress\n\ttrainerbattle_no_intro TRAINER_BOSS_GIOVANNI, RocketHideout_B4F_Text_GiovanniDefeat\n\tmsgbox RocketHideout_B4F_Text_GiovanniPostBattle\n\tfadescreen FADE_TO_BLACK\n\tclosemessage\n\tremoveobject LOCALID_GIOVANNI\n\taddobject LOCALID_SILPH_SCOPE\n\tclearflag FLAG_HIDE_SILPH_SCOPE\n\tsetflag FLAG_HIDE_CELADON_ROCKETS\n\tfamechecker FAMECHECKER_GIOVANNI, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tfadescreen FADE_FROM_BLACK\n\trelease\n\tend\n\nRocketHideout_B4F_EventScript_SilphScope::\n\tlock\n\tfaceplayer\n\tremoveobject LOCALID_SILPH_SCOPE\n\tgiveitem ITEM_SILPH_SCOPE\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_BagIsFull\n\trelease\n\tend\n\nRocketHideout_B4F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_18, RocketHideout_B4F_Text_Grunt1Intro, RocketHideout_B4F_Text_Grunt1Defeat, RocketHideout_B4F_EventScript_DefeatedGrunt1\n\tmsgbox RocketHideout_B4F_Text_Grunt1PostBattle\n\trelease\n\tend\n\nRocketHideout_B4F_EventScript_DefeatedGrunt1::\n\tmsgbox RocketHideout_B4F_Text_Grunt1PostBattle\n\taddobject LOCALID_LIFT_KEY\n\tclearflag FLAG_HIDE_LIFT_KEY\n\trelease\n\tend\n\nRocketHideout_B4F_EventScript_LiftKey::\n\tlock\n\tfaceplayer\n\tsetflag FLAG_CAN_USE_ROCKET_HIDEOUT_LIFT\n\tremoveobject LOCALID_LIFT_KEY\n\tgiveitem ITEM_LIFT_KEY\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_BagIsFull\n\trelease\n\tend\n\nRocketHideout_B4F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_16, RocketHideout_B4F_Text_Grunt2Intro, RocketHideout_B4F_Text_Grunt2Defeat, RocketHideout_B4F_EventScript_DefeatedGrunt2\n\tmsgbox RocketHideout_B4F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRocketHideout_B4F_EventScript_DefeatedGrunt2::\n\tsetvar NUM_DOOR_GRUNTS_DEFEATED, 0\n\tcall_if_defeated TRAINER_TEAM_ROCKET_GRUNT_16, RocketHideout_B4F_EventScript_CountGruntDefeated\n\tcall_if_defeated TRAINER_TEAM_ROCKET_GRUNT_17, RocketHideout_B4F_EventScript_CountGruntDefeated\n\tcall_if_eq NUM_DOOR_GRUNTS_DEFEATED, 2, RocketHideout_B4F_EventScript_RemoveBarrier\n\tcall_if_eq NUM_DOOR_GRUNTS_DEFEATED, 2, RocketHideout_B4F_EventScript_DrawMapForBarrierRemoval\n\trelease\n\tend\n\nRocketHideout_B4F_EventScript_Grunt3::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_17, RocketHideout_B4F_Text_Grunt3Intro, RocketHideout_B4F_Text_Grunt3Defeat, RocketHideout_B4F_EventScript_DefeatedGrunt3\n\tmsgbox RocketHideout_B4F_Text_Grunt3PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRocketHideout_B4F_EventScript_DefeatedGrunt3::\n\tsetvar NUM_DOOR_GRUNTS_DEFEATED, 0\n\tcall_if_defeated TRAINER_TEAM_ROCKET_GRUNT_16, RocketHideout_B4F_EventScript_CountGruntDefeated\n\tcall_if_defeated TRAINER_TEAM_ROCKET_GRUNT_17, RocketHideout_B4F_EventScript_CountGruntDefeated\n\tcall_if_eq NUM_DOOR_GRUNTS_DEFEATED, 2, RocketHideout_B4F_EventScript_RemoveBarrier\n\tcall_if_eq NUM_DOOR_GRUNTS_DEFEATED, 2, RocketHideout_B4F_EventScript_DrawMapForBarrierRemoval\n\trelease\n\tend\n\nRocketHideout_B4F_EventScript_DrawMapForBarrierRemoval::\n\tplayse SE_UNLOCK\n\tspecial DrawWholeMapView\n\twaitse\n\treturn\n\nRocketHideout_B4F_EventScript_SetBarrier::\n\tsetmetatile 17, 12, METATILE_SilphCo_HideoutBarrier_TopLeft_Floor, 1\n\tsetmetatile 18, 12, METATILE_SilphCo_HideoutBarrier_TopRight_Floor, 1\n\tsetmetatile 17, 13, METATILE_SilphCo_HideoutBarrier_BottomLeft, 1\n\tsetmetatile 18, 13, METATILE_SilphCo_HideoutBarrier_BottomRight, 1\n\tsetmetatile 17, 14, METATILE_SilphCo_HideoutFloor_ShadeFull, 0\n\tsetmetatile 18, 14, METATILE_SilphCo_HideoutFloor_ShadeFull, 0\n\treturn\n\nRocketHideout_B4F_EventScript_RemoveBarrier::\n\tsetmetatile 17, 12, METATILE_SilphCo_HideoutFloor_ShadeFull, 0\n\tsetmetatile 18, 12, METATILE_SilphCo_HideoutFloor, 0\n\tsetmetatile 17, 13, METATILE_SilphCo_HideoutFloor_ShadeFull, 0\n\tsetmetatile 18, 13, METATILE_SilphCo_HideoutFloor, 0\n\tsetmetatile 17, 14, METATILE_SilphCo_HideoutFloor_ShadeFull, 0\n\tsetmetatile 18, 14, METATILE_SilphCo_HideoutFloor, 0\n\treturn\n"
  },
  {
    "path": "data/maps/RocketHideout_B4F/text.inc",
    "content": "RocketHideout_B4F_Text_GiovanniIntro::\n    .string \"So! I must say, I am impressed you\\n\"\n    .string \"got here.\\p\"\n    .string \"TEAM ROCKET captures POKéMON from\\n\"\n    .string \"around the world.\\p\"\n    .string \"They're important tools for keeping\\n\"\n    .string \"our criminal enterprise going.\\p\"\n    .string \"I am the leader, GIOVANNI!\\p\"\n    .string \"For your insolence, you will feel a\\n\"\n    .string \"world of pain!$\"\n\nRocketHideout_B4F_Text_GiovanniDefeat::\n    .string \"WHAT!\\n\"\n    .string \"This can't be!$\"\n\nRocketHideout_B4F_Text_GiovanniPostBattle::\n    .string \"I see that you raise POKéMON with\\n\"\n    .string \"utmost care.\\p\"\n    .string \"A child like you would never\\n\"\n    .string \"understand what I hope to achieve.\\p\"\n    .string \"I shall step aside this time!\\p\"\n    .string \"I hope we meet again…$\"\n\nRocketHideout_B4F_Text_Grunt2Intro::\n    .string \"I know you!\\n\"\n    .string \"You ruined our plans at MT. MOON!$\"\n\nRocketHideout_B4F_Text_Grunt2Defeat::\n    .string \"Burned again!$\"\n\nRocketHideout_B4F_Text_Grunt2PostBattle::\n    .string \"Do you have something against TEAM\\n\"\n    .string \"ROCKET?$\"\n\nRocketHideout_B4F_Text_Grunt3Intro::\n    .string \"How can you not see the beauty of\\n\"\n    .string \"our evil?$\"\n\nRocketHideout_B4F_Text_Grunt3Defeat::\n    .string \"Ayaya!$\"\n\nRocketHideout_B4F_Text_Grunt3PostBattle::\n    .string \"BOSS!\\n\"\n    .string \"I'm sorry I failed you!$\"\n\nRocketHideout_B4F_Text_Grunt1Intro::\n    .string \"The elevator doesn't work?\\n\"\n    .string \"Who has the LIFT KEY?$\"\n\nRocketHideout_B4F_Text_Grunt1Defeat::\n    .string \"No!$\"\n\nRocketHideout_B4F_Text_Grunt1PostBattle::\n    .string \"Oh, no!\\n\"\n    .string \"I dropped the LIFT KEY!$\"\n\n"
  },
  {
    "path": "data/maps/RocketHideout_Elevator/map.json",
    "content": "{\n  \"id\": \"MAP_ROCKET_HIDEOUT_ELEVATOR\",\n  \"name\": \"RocketHideout_Elevator\",\n  \"layout\": \"LAYOUT_ROCKET_HIDEOUT_ELEVATOR\",\n  \"music\": \"MUS_ROCKET_HIDEOUT\",\n  \"region_map_section\": \"MAPSEC_ROCKET_HIDEOUT\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_2\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 0,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"RocketHideout_Elevator_EventScript_FloorSelect\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/RocketHideout_Elevator/scripts.inc",
    "content": "RocketHideout_Elevator_MapScripts::\n\t.byte 0\n\nRocketHideout_Elevator_EventScript_FloorSelect::\n\tlockall\n\tgoto_if_unset FLAG_CAN_USE_ROCKET_HIDEOUT_LIFT, RocketHideout_Elevator_EventScript_NeedKey\n\tsetvar VAR_0x8004, 2\n\tcall_if_unset FLAG_TEMP_2, EventScript_GetElevatorFloor\n\tcopyvar VAR_0x8005, VAR_ELEVATOR_FLOOR\n\tspecial DrawElevatorCurrentFloorWindow\n\tmessage Text_WantWhichFloor\n\twaitmessage\n\tsetvar VAR_0x8004, 2\n\tspecialvar VAR_RESULT, InitElevatorFloorSelectMenuPos\n\tswitch VAR_RESULT\n\tcase 0, RocketHideout_Elevator_EventScript_FloorSelectFromB1F\n\tcase 1, RocketHideout_Elevator_EventScript_FloorSelectFromB2F\n\tcase 2, RocketHideout_Elevator_EventScript_FloorSelectFromB4F\n\tend\n\nRocketHideout_Elevator_EventScript_FloorSelectFromB1F::\n\tmultichoicedefault 0, 0, MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR, 0, FALSE\n\tgoto RocketHideout_Elevator_EventScript_ChooseFloor\n\tend\n\nRocketHideout_Elevator_EventScript_FloorSelectFromB2F::\n\tmultichoicedefault 0, 0, MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR, 1, FALSE\n\tgoto RocketHideout_Elevator_EventScript_ChooseFloor\n\tend\n\nRocketHideout_Elevator_EventScript_FloorSelectFromB4F::\n\tmultichoicedefault 0, 0, MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR, 2, FALSE\n\tgoto RocketHideout_Elevator_EventScript_ChooseFloor\n\tend\n\nRocketHideout_Elevator_EventScript_ChooseFloor::\n\tswitch VAR_RESULT\n\tcase 0, RocketHideout_Elevator_EventScript_ToB1F\n\tcase 1, RocketHideout_Elevator_EventScript_ToB2F\n\tcase 2, RocketHideout_Elevator_EventScript_ToB4F\n\tcase 3, RocketHideout_Elevator_EventScript_ExitFloorSelect\n\tcase 127, RocketHideout_Elevator_EventScript_ExitFloorSelect\n\tend\n\nRocketHideout_Elevator_EventScript_ToB1F::\n\tsetvar VAR_0x8006, 3\n\tsetdynamicwarp MAP_ROCKET_HIDEOUT_B1F, 255, 24, 25\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 3, RocketHideout_Elevator_EventScript_ExitFloorSelect\n\tcall RocketHideout_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 3\n\tgoto RocketHideout_Elevator_EventScript_ExitFloorSelect\n\tend\n\nRocketHideout_Elevator_EventScript_ToB2F::\n\tsetvar VAR_0x8006, 2\n\tsetdynamicwarp MAP_ROCKET_HIDEOUT_B2F, 255, 28, 16\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 2, RocketHideout_Elevator_EventScript_ExitFloorSelect\n\tcall RocketHideout_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 2\n\tgoto RocketHideout_Elevator_EventScript_ExitFloorSelect\n\tend\n\nRocketHideout_Elevator_EventScript_ToB4F::\n\tsetvar VAR_0x8006, 0\n\tsetdynamicwarp MAP_ROCKET_HIDEOUT_B4F, 255, 20, 23\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 0, RocketHideout_Elevator_EventScript_ExitFloorSelect\n\tcall RocketHideout_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 0\n\tgoto RocketHideout_Elevator_EventScript_ExitFloorSelect\n\tend\n\nRocketHideout_Elevator_EventScript_ExitFloorSelect::\n\tspecial CloseElevatorCurrentFloorWindow\n\treleaseall\n\tend\n\nRocketHideout_Elevator_EventScript_MoveElevator::\n\tspecial CloseElevatorCurrentFloorWindow\n\tclosemessage\n\twaitse\n\tspecial AnimateElevator\n\twaitstate\n\tsetflag FLAG_TEMP_2\n\treturn\n\nRocketHideout_Elevator_EventScript_NeedKey::\n\tmsgbox RocketHideout_Elevator_Text_AppearsToNeedAKey\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/RocketHideout_Elevator/text.inc",
    "content": "RocketHideout_Elevator_Text_AppearsToNeedAKey::\n    .string \"It appears to need a key.$\"\n\n"
  },
  {
    "path": "data/maps/Route1/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE1\",\n  \"name\": \"Route1\",\n  \"layout\": \"LAYOUT_ROUTE1\",\n  \"music\": \"MUS_ROUTE1\",\n  \"region_map_section\": \"MAPSEC_ROUTE_1\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": -12,\n      \"map\": \"MAP_VIRIDIAN_CITY\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_PALLET_TOWN\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route1_EventScript_MartClerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route1_EventScript_Boy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route1_EventScript_RouteSign\"\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/Route1/scripts.inc",
    "content": "Route1_MapScripts::\n\t.byte 0\n\nRoute1_EventScript_MartClerk::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_POTION_ON_ROUTE_1, Route1_EventScript_AlreadyGotPotion\n\tmsgbox Route1_Text_WorkAtPokeMartTakeSample\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tcheckitemspace ITEM_POTION\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_BagIsFull\n\tbufferitemname STR_VAR_2, ITEM_POTION\n\tplayfanfare MUS_LEVEL_UP\n\tmessage Text_ObtainedTheX\n\twaitmessage\n\twaitfanfare\n\tadditem ITEM_POTION\n\tmsgbox Route1_Text_PutPotionAway\n\tcall EventScript_RestorePrevTextColor\n\tsetflag FLAG_GOT_POTION_ON_ROUTE_1\n\trelease\n\tend\n\nRoute1_EventScript_AlreadyGotPotion::\n\tmsgbox Route1_Text_ComeSeeUsIfYouNeedPokeBalls\n\trelease\n\tend\n\nRoute1_EventScript_Boy::\n\tmsgbox Route1_Text_CanJumpFromLedges, MSGBOX_NPC\n\tend\n\nRoute1_EventScript_RouteSign::\n\tmsgbox Route1_Text_RouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route1/text.inc",
    "content": "Route1_Text_WorkAtPokeMartTakeSample::\n    .string \"Hi!\\n\"\n    .string \"I work at a POKéMON MART.\\p\"\n    .string \"It's part of a convenient chain\\n\"\n    .string \"selling all sorts of items.\\p\"\n    .string \"Please, visit us in VIRIDIAN CITY.\\p\"\n    .string \"I know, I'll give you a sample.\\n\"\n    .string \"Here you go!$\"\n\nRoute1_Text_ComeSeeUsIfYouNeedPokeBalls::\n    .string \"Please come see us if you need\\n\"\n    .string \"POKé BALLS for catching POKéMON.$\"\n\nRoute1_Text_PutPotionAway::\n    .string \"{PLAYER} put the POTION away in\\n\"\n    .string \"the BAG's MEDICINE POCKET.$\"\n\nRoute1_Text_CanJumpFromLedges::\n    .string \"See those ledges along the road?\\p\"\n    .string \"It's a bit scary, but you can jump\\n\"\n    .string \"from them.\\p\"\n    .string \"You can get back to PALLET TOWN\\n\"\n    .string \"quicker that way.$\"\n\nRoute1_Text_RouteSign::\n    .string \"ROUTE 1\\n\"\n    .string \"PALLET TOWN - VIRIDIAN CITY$\"\n\n"
  },
  {
    "path": "data/maps/Route10/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE10\",\n  \"name\": \"Route10\",\n  \"layout\": \"LAYOUT_ROUTE10\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_10\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_LAVENDER_TOWN\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE9\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 60,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route10_EventScript_Carol\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 62,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route10_EventScript_Clark\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKE_MANIAC\",\n      \"x\": 15,\n      \"y\": 70,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route10_EventScript_Herman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 68,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route10_EventScript_Trent\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKE_MANIAC\",\n      \"x\": 13,\n      \"y\": 44,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"Route10_EventScript_Mark\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route10_EventScript_Heidi\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_10_CUT_TREE_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 22,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_10_CUT_TREE_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 24,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_10_CUT_TREE_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_10_CUT_TREE_4\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Rattata\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 42,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Electabuzz\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 70,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Charmeleon\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_PSYCHIC_M\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 62,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Alakazam\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route10_EventScript_SwaggerTutor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCK_TUNNEL_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 57,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROCK_TUNNEL_1F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 40,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POWER_PLANT\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE10_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 37,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_POWER_PLANT\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 59,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route10_EventScript_SouthRockTunnelSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 42,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route10_EventScript_PowerPlantSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route10_EventScript_NorthRockTunnelSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 10,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"item\": \"ITEM_SUPER_POTION\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE10_SUPER_POTION\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 12,\n      \"y\": 40,\n      \"elevation\": 3,\n      \"item\": \"ITEM_MAX_ETHER\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE10_MAX_ETHER\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 6,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"item\": \"ITEM_CHERI_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE10_CHERI_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 17,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PERSIM_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE10_PERSIM_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 20,\n      \"y\": 57,\n      \"elevation\": 3,\n      \"item\": \"ITEM_KELPSY_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE10_KELPSY_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/Route10/scripts.inc",
    "content": ".set LOCALID_RATTATA_MASTER, 11\n.set LOCALID_ELECTABUZZ_MASTER, 12\n.set LOCALID_CHARMELEON_MASTER, 13\n.set LOCALID_ALAKAZAM_MASTER, 14\n.set TRAINER, VAR_0x8009\n\nRoute10_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route10_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute10_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_RATTATA\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route10_MapScript_RattataMasterMovementType\n\tsetvar TRAINER, MASTER_ELECTABUZZ\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route10_MapScript_ElectabuzzMasterMovementType\n\tsetvar TRAINER, MASTER_CHARMELEON\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route10_MapScript_CharmeleonMasterMovementType\n\tsetvar TRAINER, MASTER_ALAKAZAM\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route10_MapScript_AlakazamMasterMovementType\n\tend\n\nRoute10_MapScript_RattataMasterMovementType::\n\tsetobjectmovementtype LOCALID_RATTATA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute10_MapScript_ElectabuzzMasterMovementType::\n\tsetobjectmovementtype LOCALID_ELECTABUZZ_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute10_MapScript_CharmeleonMasterMovementType::\n\tsetobjectmovementtype LOCALID_CHARMELEON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute10_MapScript_AlakazamMasterMovementType::\n\tsetobjectmovementtype LOCALID_ALAKAZAM_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute10_EventScript_NorthRockTunnelSign::\n\tmsgbox Route10_Text_RockTunnelDetourToLavender, MSGBOX_SIGN\n\tend\n\nRoute10_EventScript_SouthRockTunnelSign::\n\tmsgbox Route10_Text_RockTunnel, MSGBOX_SIGN\n\tend\n\nRoute10_EventScript_PowerPlantSign::\n\tmsgbox Route10_Text_PowerPlant, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route10/text.inc",
    "content": "Route10_Text_MarkIntro::\n    .string \"Wow, you came all the way here?\\n\"\n    .string \"Maybe you're a POKéMANIAC, too?\\l\"\n    .string \"Want to see my collection?$\"\n\nRoute10_Text_MarkDefeat::\n    .string \"Humph.\\n\"\n    .string \"I'm not angry!$\"\n\nRoute10_Text_MarkPostBattle::\n    .string \"I have more rare POKéMON at home!$\"\n\nRoute10_Text_ClarkIntro::\n    .string \"Ha-hahah-ah-ha!$\"\n\nRoute10_Text_ClarkDefeat::\n    .string \"Ha-haha!\\n\"\n    .string \"Not laughing!\\l\"\n    .string \"Ha-hay fever! Haha-ha-choo!$\"\n\nRoute10_Text_ClarkPostBattle::\n    .string \"Haha-ha-choo!\\n\"\n    .string \"Ha-choo!\\l\"\n    .string \"Snort! Snivel!$\"\n\nRoute10_Text_HermanIntro::\n    .string \"Hi, kid!\\n\"\n    .string \"Want to see my POKéMON?$\"\n\nRoute10_Text_HermanDefeat::\n    .string \"Oh, no!\\n\"\n    .string \"My POKéMON!$\"\n\nRoute10_Text_HermanPostBattle::\n    .string \"I don't like you.\\n\"\n    .string \"I don't like anyone better than me!$\"\n\nRoute10_Text_HeidiIntro::\n    .string \"I've been out at a POKéMON GYM\\n\"\n    .string \"a few times.\\p\"\n    .string \"…But I always lose.$\"\n\nRoute10_Text_HeidiDefeat::\n    .string \"Ohh!\\n\"\n    .string \"After all my training!$\"\n\nRoute10_Text_HeidiPostBattle::\n    .string \"I noticed some POKéMANIACS\\n\"\n    .string \"prowling around.\\p\"\n    .string \"Can you imagine? Them?\\n\"\n    .string \"Up here in the mountains?$\"\n\nRoute10_Text_TrentIntro::\n    .string \"Ah!\\n\"\n    .string \"This mountain air is delicious!$\"\n\nRoute10_Text_TrentDefeat::\n    .string \"That cleared my head!$\"\n\nRoute10_Text_TrentPostBattle::\n    .string \"I feel bloated on mountain air!$\"\n\nRoute10_Text_CarolIntro::\n    .string \"I'm feeling a bit faint.\\n\"\n    .string \"I haven't hiked in some time.$\"\n\nRoute10_Text_CarolDefeat::\n    .string \"I'm too tired.\\n\"\n    .string \"I wasn't up for it.$\"\n\nRoute10_Text_CarolPostBattle::\n    .string \"The POKéMON here in the mountains\\n\"\n    .string \"are so chunky…\\p\"\n    .string \"I wish there were pink POKéMON\\n\"\n    .string \"with a floral pattern!$\"\n\nRoute10_Text_RockTunnelDetourToLavender::\n    .string \"ROCK TUNNEL\\n\"\n    .string \"Detour to LAVENDER TOWN$\"\n\nRoute10_Text_RockTunnel::\n    .string \"ROCK TUNNEL$\"\n\nRoute10_Text_PowerPlant::\n    .string \"POWER PLANT$\"\n\n"
  },
  {
    "path": "data/maps/Route10_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE10_POKEMON_CENTER_1F\",\n  \"name\": \"Route10_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_10\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route10_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route10_PokemonCenter_1F_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route10_PokemonCenter_1F_EventScript_FatMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route10_PokemonCenter_1F_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route10_PokemonCenter_1F_EventScript_Aide\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE10\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE10\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE10\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_ROUTE10_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route10_PokemonCenter_1F/scripts.inc",
    "content": ".equ REQUIRED_OWNED_MONS, 20\n\nRoute10_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route10_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nRoute10_PokemonCenter_1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_ROUTE10_POKEMON_CENTER_1F\n\tsetrespawn SPAWN_ROUTE10\n\tend\n\nRoute10_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nRoute10_PokemonCenter_1F_EventScript_FatMan::\n\tmsgbox Route10_PokemonCenter_1F_Text_NuggetUselessSoldFor5000, MSGBOX_NPC\n\tend\n\nRoute10_PokemonCenter_1F_EventScript_Gentleman::\n\tmsgbox Route10_PokemonCenter_1F_Text_EveryTypeStrongerThanOthers, MSGBOX_NPC\n\tend\n\nRoute10_PokemonCenter_1F_EventScript_Youngster::\n\tmsgbox Route10_PokemonCenter_1F_Text_HeardGhostsHauntLavender, MSGBOX_NPC\n\tend\n\nRoute10_PokemonCenter_1F_EventScript_Aide::\n\tlock\n\tfaceplayer\n\tcall Route10_PokemonCenter_1F_EventScript_GetAideRequestInfo\n\tgoto_if_set FLAG_GOT_EVERSTONE_FROM_OAKS_AIDE, Route10_PokemonCenter_1F_EventScript_AlreadyGotEverstone\n\tmsgbox Route10_PokemonCenter_1F_Text_GiveEverstoneIfCaught20Mons, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Aide_EventScript_DeclineCheckMons\n\tsetvar VAR_0x8004, 0\n\tspecialvar VAR_RESULT, GetPokedexCount\n\tbuffernumberstring STR_VAR_3, VAR_0x8006\n\tcall Route10_PokemonCenter_1F_EventScript_GetAideRequestInfo\n\tgoto_if_lt VAR_0x8006, REQUIRED_OWNED_MONS, Aide_EventScript_HaventCaughtEnough\n\tmsgbox Route10_PokemonCenter_1F_Text_GreatHereYouGo\n\tcheckitemspace ITEM_EVERSTONE\n\tgoto_if_eq VAR_RESULT, FALSE, Aide_EventScript_NoRoomForItem\n\tgiveitem_msg Route10_PokemonCenter_1F_Text_ReceivedEverstoneFromAide, ITEM_EVERSTONE\n\tsetflag FLAG_GOT_EVERSTONE_FROM_OAKS_AIDE\n\tmsgbox Route10_PokemonCenter_1F_Text_ExplainEverstone\n\trelease\n\tend\n\nRoute10_PokemonCenter_1F_EventScript_AlreadyGotEverstone::\n\tmsgbox Route10_PokemonCenter_1F_Text_ExplainEverstone\n\trelease\n\tend\n\nRoute10_PokemonCenter_1F_EventScript_GetAideRequestInfo::\n\tbuffernumberstring STR_VAR_1, REQUIRED_OWNED_MONS\n\tbufferitemname STR_VAR_2, ITEM_EVERSTONE\n\treturn\n"
  },
  {
    "path": "data/maps/Route10_PokemonCenter_1F/text.inc",
    "content": "Route10_PokemonCenter_1F_Text_EveryTypeStrongerThanOthers::\n    .string \"The types of POKéMON match up\\n\"\n    .string \"differently with each other.\\p\"\n    .string \"Every type is stronger than some\\n\"\n    .string \"types and weaker than others.$\"\n\nRoute10_PokemonCenter_1F_Text_NuggetUselessSoldFor5000::\n    .string \"A NUGGET is totally useless.\\n\"\n    .string \"So I sold it for ¥5000.$\"\n\nRoute10_PokemonCenter_1F_Text_HeardGhostsHauntLavender::\n    .string \"I heard that ghosts haunt\\n\"\n    .string \"LAVENDER TOWN.$\"\n\nRoute10_PokemonCenter_1F_Text_GiveEverstoneIfCaught20Mons::\n    .string \"Oh… {PLAYER}!\\n\"\n    .string \"I've been looking for you!\\p\"\n    .string \"It's me, one of the ever-present\\n\"\n    .string \"AIDES to PROF. OAK.\\p\"\n    .string \"If your POKéDEX has complete data\\n\"\n    .string \"on twenty species, I'm supposed to\\l\"\n    .string \"give you a reward from PROF. OAK.\\p\"\n    .string \"He entrusted me with this\\n\"\n    .string \"EVERSTONE.\\p\"\n    .string \"So, {PLAYER}, let me ask you.\\p\"\n    .string \"Have you gathered data on at least\\n\"\n    .string \"twenty kinds of POKéMON?$\"\n\nRoute10_PokemonCenter_1F_Text_GreatHereYouGo::\n    .string \"Great! You have caught or owned\\n\"\n    .string \"{STR_VAR_3} kinds of POKéMON!\\p\"\n    .string \"Congratulations!\\n\"\n    .string \"Here you go!$\"\n\nRoute10_PokemonCenter_1F_Text_ReceivedEverstoneFromAide::\n    .string \"{PLAYER} received the EVERSTONE\\n\"\n    .string \"from the AIDE.$\"\n\nRoute10_PokemonCenter_1F_Text_ExplainEverstone::\n    .string \"Making POKéMON evolve certainly\\n\"\n    .string \"can add to the POKéDEX.\\p\"\n    .string \"However, at times, you may not\\n\"\n    .string \"want a certain POKéMON to evolve.\\p\"\n    .string \"In that case, give the EVERSTONE\\n\"\n    .string \"to that POKéMON.\\p\"\n    .string \"It will prevent evolution according\\n\"\n    .string \"to the PROFESSOR.$\"\n\n"
  },
  {
    "path": "data/maps/Route10_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE10_POKEMON_CENTER_2F\",\n  \"name\": \"Route10_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_10\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_ROUTE10_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route10_PokemonCenter_2F/scripts.inc",
    "content": "Route10_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nRoute10_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nRoute10_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nRoute10_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/Route11/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE11\",\n  \"name\": \"Route11\",\n  \"layout\": \"LAYOUT_ROUTE11\",\n  \"music\": \"MUS_ROUTE11\",\n  \"region_map_section\": \"MAPSEC_ROUTE_11\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": -10,\n      \"map\": \"MAP_VERMILION_CITY\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": -59,\n      \"map\": \"MAP_ROUTE12\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route11_EventScript_Eddie\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route11_EventScript_Hugo\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route11_EventScript_Dillon\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP\",\n      \"movement_range_x\": 8,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route11_EventScript_Dave\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route11_EventScript_Jasper\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 50,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route11_EventScript_Darian\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ENGINEER\",\n      \"x\": 42,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route11_EventScript_Braxton\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 50,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route11_EventScript_Yasu\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 57,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route11_EventScript_Dirk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ENGINEER\",\n      \"x\": 32,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"6\",\n      \"script\": \"Route11_EventScript_Bernie\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 42,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route11_EventScript_ItemXDefend\",\n      \"flag\": \"FLAG_HIDE_ROUTE11_X_DEFEND\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 63,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route11_EventScript_ItemGreatBall\",\n      \"flag\": \"FLAG_HIDE_ROUTE11_GREAT_BALL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route11_EventScript_ItemAwakening\",\n      \"flag\": \"FLAG_HIDE_ROUTE11_AWAKENING\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 59,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Metapod\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Sandshrew\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_DIGLETTS_CAVE_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 58,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE11_EAST_ENTRANCE_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 65,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE11_EAST_ENTRANCE_1F\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route11_EventScript_DiglettsCaveSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 58,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"item\": \"ITEM_ESCAPE_ROPE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE11_ESCAPE_ROPE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 58,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"item\": \"ITEM_TAMATO_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE11_TAMATO_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/Route11/scripts.inc",
    "content": ".set LOCALID_SANDSHREW_MASTER, 15\n.set LOCALID_METAPOD_MASTER, 14\n.set TRAINER, VAR_0x8009\n\nRoute11_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route11_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute11_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_SANDSHREW\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route11_MapScript_SandshrewMasterMovementType\n\tsetvar TRAINER, MASTER_METAPOD\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route11_MapScript_MetapodMasterMovementType\n\tend\n\nRoute11_MapScript_SandshrewMasterMovementType::\n\tsetobjectmovementtype LOCALID_SANDSHREW_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute11_MapScript_MetapodMasterMovementType::\n\tsetobjectmovementtype LOCALID_METAPOD_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute11_EventScript_DiglettsCaveSign::\n\tmsgbox Route11_Text_DiglettsCave, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route11/text.inc",
    "content": "Route11_Text_HugoIntro::\n    .string \"Win, lose, or draw!$\"\n\nRoute11_Text_HugoDefeat::\n    .string \"Atcha!\\n\"\n    .string \"Didn't go my way!$\"\n\nRoute11_Text_HugoPostBattle::\n    .string \"POKéMON is life!\\n\"\n    .string \"And to live is to gamble!$\"\n\nRoute11_Text_JasperIntro::\n    .string \"Competition!\\n\"\n    .string \"I can't get enough!$\"\n\nRoute11_Text_JasperDefeat::\n    .string \"I had a chance!$\"\n\nRoute11_Text_JasperPostBattle::\n    .string \"You can't be a coward in the world\\n\"\n    .string \"of POKéMON!$\"\n\nRoute11_Text_EddieIntro::\n    .string \"Let's go, but don't cheat!$\"\n\nRoute11_Text_EddieDefeat::\n    .string \"Huh?\\n\"\n    .string \"That's not right!$\"\n\nRoute11_Text_EddiePostBattle::\n    .string \"I did my best.\\n\"\n    .string \"I have no regrets.$\"\n\nRoute11_Text_BraxtonIntro::\n    .string \"Careful!\\n\"\n    .string \"I'm laying down some cables!$\"\n\nRoute11_Text_BraxtonDefeat::\n    .string \"That was electric!$\"\n\nRoute11_Text_BraxtonPostBattle::\n    .string \"Spread the word to save energy!$\"\n\nRoute11_Text_DillonIntro::\n    .string \"I just became a TRAINER.\\n\"\n    .string \"But, I think I can win.$\"\n\nRoute11_Text_DillonDefeat::\n    .string \"My POKéMON couldn't win…\\n\"\n    .string \"Haven't they grown enough?$\"\n\nRoute11_Text_DillonPostBattle::\n    .string \"What now?\\n\"\n    .string \"Leave me alone!$\"\n\nRoute11_Text_DirkIntro::\n    .string \"Fwahaha!\\n\"\n    .string \"I have never lost!$\"\n\nRoute11_Text_DirkDefeat::\n    .string \"My first loss!$\"\n\nRoute11_Text_DirkPostBattle::\n    .string \"Luck of the draw!\\n\"\n\t.string \"Just luck!$\"\n\nRoute11_Text_DarianIntro::\n    .string \"I have never won before…$\"\n\nRoute11_Text_DarianDefeat::\n    .string \"I saw this coming…$\"\n\nRoute11_Text_DarianPostBattle::\n    .string \"It's just luck.\\n\"\n\t.string \"Luck of the draw.$\"\n\nRoute11_Text_YasuIntro::\n    .string \"I'm the best in my class.\\n\"\n    .string \"I train every morning.$\"\n\nRoute11_Text_YasuDefeat::\n    .string \"Darn!\\n\"\n    .string \"My POKéMON need to be stronger!$\"\n\nRoute11_Text_YasuPostBattle::\n    .string \"There's a fat POKéMON that comes\\n\"\n    .string \"down from the mountains.\\p\"\n    .string \"I bet it'd be strong if you can\\n\"\n    .string \"catch it.$\"\n\nRoute11_Text_BernieIntro::\n    .string \"Watch out for live wires!$\"\n\nRoute11_Text_BernieDefeat::\n    .string \"Whoa!\\n\"\n    .string \"You spark plug!$\"\n\nRoute11_Text_BerniePostBattle::\n    .string \"Well, better get back to work.$\"\n\nRoute11_Text_DaveIntro::\n    .string \"I raised my POKéMON carefully.\\n\"\n    .string \"They should be ready by now!$\"\n\nRoute11_Text_DaveDefeat::\n    .string \"Bye-bye!\\n\"\n    .string \"Thank you, and good-bye!$\"\n\nRoute11_Text_DavePostBattle::\n    .string \"Tch…\\n\"\n    .string \"I better go find stronger ones!$\"\n\nRoute11_Text_DiglettsCave::\n    .string \"DIGLETT'S CAVE$\"\n\n"
  },
  {
    "path": "data/maps/Route11_EastEntrance_1F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE11_EAST_ENTRANCE_1F\",\n  \"name\": \"Route11_EastEntrance_1F\",\n  \"layout\": \"LAYOUT_ENTRANCE_1F\",\n  \"music\": \"MUS_VERMILLION\",\n  \"region_map_section\": \"MAPSEC_ROUTE_11\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route11_EastEntrance_1F_EventScript_TopGuard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"x\": 4,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route11_EastEntrance_1F_EventScript_BottomGuard\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE11\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE11\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE11\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE11\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE11_EAST_ENTRANCE_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route11_EastEntrance_1F/scripts.inc",
    "content": "Route11_EastEntrance_1F_MapScripts::\n\t.byte 0\n\nRoute11_EastEntrance_1F_EventScript_TopGuard::\n\tmsgbox Route11_EastEntrance_1F_Text_ManInLavenderRatesNames, MSGBOX_NPC\n\tend\n\nRoute11_EastEntrance_1F_EventScript_BottomGuard::\n\tmsgbox Route11_EastEntrance_1F_Text_RockTunnelToReachLavender, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/Route11_EastEntrance_1F/text.inc",
    "content": "Route11_EastEntrance_1F_Text_ManInLavenderRatesNames::\n    .string \"Don't you think it's hard to think\\n\"\n    .string \"up good names for POKéMON?\\p\"\n    .string \"Especially if you've caught a\\n\"\n    .string \"whole bunch?\\p\"\n    .string \"In LAVENDER TOWN, there's a man\\n\"\n    .string \"who rates POKéMON nicknames.\\p\"\n    .string \"He can even help you rename your\\n\"\n    .string \"POKéMON, too.$\"\n\nRoute11_EastEntrance_1F_Text_RockTunnelToReachLavender::\n    .string \"If you're aiming to reach LAVENDER\\n\"\n    .string \"TOWN, take ROCK TUNNEL.\\p\"\n    .string \"You can get to ROCK TUNNEL from\\n\"\n    .string \"CERULEAN CITY.$\"\n\n"
  },
  {
    "path": "data/maps/Route11_EastEntrance_2F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE11_EAST_ENTRANCE_2F\",\n  \"name\": \"Route11_EastEntrance_2F\",\n  \"layout\": \"LAYOUT_ENTRANCE_2F\",\n  \"music\": \"MUS_VERMILLION\",\n  \"region_map_section\": \"MAPSEC_ROUTE_11\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route11_EastEntrance_2F_EventScript_Turner\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route11_EastEntrance_2F_EventScript_Aide\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BLACK_BELT\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Primeape\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE11_EAST_ENTRANCE_1F\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route11_EastEntrance_2F_EventScript_LeftBinoculars\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route11_EastEntrance_2F_EventScript_RightBinoculars\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route11_EastEntrance_2F/scripts.inc",
    "content": ".equ REQUIRED_CAUGHT_MONS, 30\n.set LOCALID_PRIMEAPE_MASTER, 3\n.set TRAINER, VAR_0x8009\n\nRoute11_EastEntrance_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route11_EastEntrance_2F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute11_EastEntrance_2F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_PRIMEAPE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route11_EastEntrance_2F_MapScript_PrimeapeMasterMovementType\n\tend\n\nRoute11_EastEntrance_2F_MapScript_PrimeapeMasterMovementType::\n\tsetobjectmovementtype LOCALID_PRIMEAPE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute11_EastEntrance_2F_EventScript_LeftBinoculars::\n\tlockall\n\tgoto_if_set FLAG_WOKE_UP_ROUTE_12_SNORLAX, Route11_EastEntrance_2F_EventScript_LeftBinocularsSnorlaxGone\nRoute11_EastEntrance_2F_EventScript_SnorlaxPresent:\n\tmsgbox Route11_EastEntrance_2F_Text_BigMonAsleepOnRoad\n\treleaseall\n\tend\n\nRoute11_EastEntrance_2F_EventScript_LeftBinocularsSnorlaxGone::\n\tgoto_if_unset FLAG_ROUTE_12_SNORLAX_RETURNED_TO_MOUNTAINS, Route11_EastEntrance_2F_EventScript_SnorlaxPresent\n\tmsgbox Route11_EastEntrance_2F_Text_WhatABreathtakingView\n\treleaseall\n\tend\n\nRoute11_EastEntrance_2F_EventScript_RightBinoculars::\n\tmsgbox Route11_EastEntrance_2F_Text_RockTunnelGoodRouteToLavender, MSGBOX_SIGN\n\tend\n\nRoute11_EastEntrance_2F_EventScript_Turner::\n\tlock\n\tfaceplayer\n\tcallnative IsVersionFireRedToVarResult\n\tcompare VAR_RESULT, FALSE\n\tgoto_if_eq Route11_EastEntrance_2F_EventScript_Turner_LG\n\tsetvar VAR_0x8008, INGAME_TRADE_NIDORINA_FR\n\tcall EventScript_GetInGameTradeSpeciesInfo\n\tgoto_if_set FLAG_DID_NINA_TRADE, Route11_EastEntrance_2F_EventScript_AlreadyTraded\n\tmsgbox Trade_Text_LookingForMonWannaTradeForMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Route11_EastEntrance_2F_EventScript_DeclineTrade\n\tcall EventScript_ChooseMonForInGameTrade\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, Route11_EastEntrance_2F_EventScript_DeclineTrade\n\tcall EventScript_GetInGameTradeSpecies\n\tgoto_if_ne VAR_RESULT, VAR_0x8009, Route11_EastEntrance_2F_EventScript_NotRequestedMon\n\tcall EventScript_DoInGameTrade\n\tmsgbox Trade_Text_HeyThanks\n\tsetflag FLAG_DID_NINA_TRADE\n\trelease\n\tend\n\nRoute11_EastEntrance_2F_EventScript_Turner_LG::\n\tsetvar VAR_0x8008, INGAME_TRADE_NIDORINO_LG\n\tcall EventScript_GetInGameTradeSpeciesInfo\n\tgoto_if_set FLAG_DID_NINO_TRADE, Route11_EastEntrance_2F_EventScript_AlreadyTraded\n\tmsgbox Trade_Text_LookingForMonWannaTradeForMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Route11_EastEntrance_2F_EventScript_DeclineTrade\n\tcall EventScript_ChooseMonForInGameTrade\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, Route11_EastEntrance_2F_EventScript_DeclineTrade\n\tcall EventScript_GetInGameTradeSpecies\n\tgoto_if_ne VAR_RESULT, VAR_0x8009, Route11_EastEntrance_2F_EventScript_NotRequestedMon\n\tcall EventScript_DoInGameTrade\n\tmsgbox Trade_Text_HeyThanks\n\tsetflag FLAG_DID_NINO_TRADE\n\trelease\n\tend\n\nRoute11_EastEntrance_2F_EventScript_DeclineTrade::\n\tmsgbox Trade_Text_AwwOhWell\n\trelease\n\tend\n\nRoute11_EastEntrance_2F_EventScript_NotRequestedMon::\n\tbufferspeciesname STR_VAR_1, VAR_0x8009\n\tmsgbox Trade_Text_WhatThatsNoMon\n\trelease\n\tend\n\nRoute11_EastEntrance_2F_EventScript_AlreadyTraded::\n\tmsgbox Trade_Text_IsntMyOldMonGreat\n\trelease\n\tend\n\nRoute11_EastEntrance_2F_EventScript_Aide::\n\tlock\n\tfaceplayer\n\tcall Route11_EastEntrance_2F_EventScript_GetAideRequestInfo\n\tgoto_if_set FLAG_GOT_ITEMFINDER, Route11_EastEntrance_2F_EventScript_AlreadyGotItemfinder\n\tmsgbox Route11_EastEntrance_2F_Text_GiveItemfinderIfCaught30, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Aide_EventScript_DeclineCheckMons\n\tsetvar VAR_0x8004, 0\n\tspecialvar VAR_RESULT, GetPokedexCount\n\tbuffernumberstring STR_VAR_3, VAR_0x8006\n\tcall Route11_EastEntrance_2F_EventScript_GetAideRequestInfo\n\tgoto_if_lt VAR_0x8006, REQUIRED_CAUGHT_MONS, Aide_EventScript_HaventCaughtEnough\n\tmsgbox Route11_EastEntrance_2F_Text_GreatHereYouGo\n\tcheckitemspace ITEM_ITEMFINDER\n\tgoto_if_eq VAR_RESULT, FALSE, Aide_EventScript_NoRoomForItem\n\tgiveitem_msg Route11_EastEntrance_2F_Text_ReceivedItemfinderFromAide, ITEM_ITEMFINDER\n\tsetflag FLAG_GOT_ITEMFINDER\n\tmsgbox Route11_EastEntrance_2F_Text_ExplainItemfinder\n\trelease\n\tend\n\nRoute11_EastEntrance_2F_EventScript_AlreadyGotItemfinder::\n\tmsgbox Route11_EastEntrance_2F_Text_ExplainItemfinder\n\trelease\n\tend\n\nRoute11_EastEntrance_2F_EventScript_GetAideRequestInfo::\n\tbuffernumberstring STR_VAR_1, REQUIRED_CAUGHT_MONS\n\tbufferitemname STR_VAR_2, ITEM_ITEMFINDER\n\treturn\n"
  },
  {
    "path": "data/maps/Route11_EastEntrance_2F/text.inc",
    "content": "Route11_EastEntrance_2F_Text_GiveItemfinderIfCaught30::\n    .string \"Hi! Remember me?\\n\"\n    .string \"I'm one of PROF. OAK's AIDES.\\p\"\n    .string \"If your POKéDEX has complete data\\n\"\n    .string \"on {STR_VAR_1} species, I'm supposed to\\l\"\n    .string \"give you a reward.\\p\"\n    .string \"PROF. OAK entrusted me with the\\n\"\n    .string \"{STR_VAR_2} for you.\\p\"\n    .string \"So, {PLAYER}, let me ask you.\\p\"\n    .string \"Have you gathered data on at least\\n\"\n    .string \"{STR_VAR_1} kinds of POKéMON?$\"\n\nRoute11_EastEntrance_2F_Text_GreatHereYouGo::\n    .string \"Great! You have caught or owned\\n\"\n    .string \"{STR_VAR_3} kinds of POKéMON!\\p\"\n    .string \"Congratulations!\\n\"\n    .string \"Here you go!$\"\n\nRoute11_EastEntrance_2F_Text_ReceivedItemfinderFromAide::\n    .string \"{PLAYER} received the {STR_VAR_2}\\n\"\n    .string \"from the AIDE.$\"\n\nRoute11_EastEntrance_2F_Text_ExplainItemfinder::\n    .string \"There are items on the ground that\\n\"\n    .string \"may be hidden from view.\\p\"\n    .string \"Use the ITEMFINDER to detect any\\n\"\n    .string \"hidden items close to you.\\p\"\n    .string \"The machine is a bit limited.\\n\"\n    .string \"It can't pinpoint item locations.\\p\"\n    .string \"What it does is show the direction\\n\"\n    .string \"where the item is.\\p\"\n    .string \"Use it to get your bearings, then\\n\"\n    .string \"search the suspect area by hand.$\"\n\nRoute11_EastEntrance_2F_Text_BigMonAsleepOnRoad::\n    .string \"Let's see what the binoculars have\\n\"\n    .string \"to show…\\p\"\n    .string \"A big POKéMON is asleep on a road!$\"\n\nRoute11_EastEntrance_2F_Text_WhatABreathtakingView::\n    .string \"Let's see what the binoculars have\\n\"\n    .string \"to show…\\p\"\n    .string \"What a breathtaking view!$\"\n\nRoute11_EastEntrance_2F_Text_RockTunnelGoodRouteToLavender::\n    .string \"Let's see what the binoculars have\\n\"\n    .string \"to show…\\p\"\n    .string \"To get to LAVENDER TOWN from\\n\"\n    .string \"CERULEAN CITY…\\p\"\n    .string \"ROCK TUNNEL appears to be a good\\n\"\n    .string \"route to take.$\"\n\n"
  },
  {
    "path": "data/maps/Route12/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE12\",\n  \"name\": \"Route12\",\n  \"layout\": \"LAYOUT_ROUTE12\",\n  \"music\": \"MUS_ROUTE11\",\n  \"region_map_section\": \"MAPSEC_ROUTE_12\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_LAVENDER_TOWN\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": -48,\n      \"map\": \"MAP_ROUTE13\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": 59,\n      \"map\": \"MAP_ROUTE11\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route12_EventScript_Ned\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 39,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route12_EventScript_Chip\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 46,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route12_EventScript_Hank\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 58,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route12_EventScript_Elliot\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SNORLAX\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 69,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route12_EventScript_Snorlax\",\n      \"flag\": \"FLAG_HIDE_ROUTE_12_SNORLAX\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKER_2\",\n      \"x\": 13,\n      \"y\": 91,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route12_EventScript_Luca\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 98,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route12_EventScript_Justin\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 107,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route12_EventScript_Andrew\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 99,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_12_CUT_TREE_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route12_EventScript_ItemTM48\",\n      \"flag\": \"FLAG_HIDE_ROUTE12_TM48\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 100,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route12_EventScript_ItemIron\",\n      \"flag\": \"FLAG_HIDE_ROUTE12_IRON\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNG_COUPLE_F\",\n      \"x\": 19,\n      \"y\": 63,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route12_EventScript_Gia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNG_COUPLE_M\",\n      \"x\": 19,\n      \"y\": 62,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route12_EventScript_Jes\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 110,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_12_CUT_TREE_2\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Squirtle\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Seadra\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 90,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Goldeen\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 110,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Poliwag\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 12,\n      \"y\": 85,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE12_FISHING_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE12_NORTH_ENTRANCE_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE12_NORTH_ENTRANCE_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE12_NORTH_ENTRANCE_1F\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route12_EventScript_RouteSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 68,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route12_EventScript_FishingSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 18,\n      \"y\": 56,\n      \"elevation\": 3,\n      \"item\": \"ITEM_HYPER_POTION\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE12_HYPER_POTION\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 14,\n      \"y\": 69,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LEFTOVERS\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE12_LEFTOVERS\",\n      \"quantity\": 1,\n      \"underfoot\": true\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 9,\n      \"y\": 115,\n      \"elevation\": 3,\n      \"item\": \"ITEM_RARE_CANDY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE12_RARE_CANDY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/Route12/scripts.inc",
    "content": ".set LOCALID_SQUIRTLE_MASTER, 15\n.set LOCALID_SEADRA_MASTER, 16\n.set LOCALID_GOLDEEN_MASTER, 17\n.set LOCALID_POLIWAG_MASTER, 18\n.set TRAINER, VAR_0x8009\n\nRoute12_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route12_OnTransition\n\tmap_script MAP_SCRIPT_ON_RESUME, Route12_OnResume\n\t.byte 0\n\nRoute12_OnTransition::\n\tcall_if_set FLAG_WOKE_UP_ROUTE_12_SNORLAX, Route12_EventScript_HideSnorlax\n\tcall_if_unset FLAG_WOKE_UP_ROUTE_12_SNORLAX, Route12_EventScript_TryShowSnorlax\n\tgoto Route12_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nRoute12_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_SQUIRTLE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route12_MapScript_SquirtleMasterMovementType\n\tsetvar TRAINER, MASTER_SEADRA\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route12_MapScript_SeadraMasterMovementType\n\tsetvar TRAINER, MASTER_GOLDEEN\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route12_MapScript_GoldeenMasterMovementType\n\tsetvar TRAINER, MASTER_POLIWAG\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route12_MapScript_PoliwagMasterMovementType\n\tend\n\nRoute12_MapScript_SquirtleMasterMovementType::\n\tsetobjectmovementtype LOCALID_SQUIRTLE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute12_MapScript_SeadraMasterMovementType::\n\tsetobjectmovementtype LOCALID_SEADRA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM\n\treturn\n\nRoute12_MapScript_GoldeenMasterMovementType::\n\tsetobjectmovementtype LOCALID_GOLDEEN_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM\n\treturn\n\nRoute12_MapScript_PoliwagMasterMovementType::\n\tsetobjectmovementtype LOCALID_POLIWAG_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute12_EventScript_HideSnorlax::\n\tsetflag FLAG_HIDE_ROUTE_12_SNORLAX\n\treturn\n\nRoute12_EventScript_TryShowSnorlax::\n\tgoto_if_set FLAG_ROUTE_12_SNORLAX_RETURNED_TO_MOUNTAINS, EventScript_Return\n\tclearflag FLAG_HIDE_ROUTE_12_SNORLAX\n\treturn\n\nRoute12_OnResume::\n\tcall_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, Route12_EventScript_TryRemoveSnorlax\n\tend\n\nRoute12_EventScript_TryRemoveSnorlax::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_CAUGHT\n\tgoto_if_ne EventScript_Return\n\tremoveobject VAR_LAST_TALKED\n\treturn\n\nRoute12_EventScript_Snorlax::\n\tlock\n\tfaceplayer\n\tgoto_if_unset FLAG_GOT_POKE_FLUTE, Route12_EventScript_SnorlaxNoPokeFlute\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tmsgbox Text_WantToUsePokeFlute, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Route12_EventScript_DontUsePokeFlute\n\tcall EventScript_AwakenSnorlax\n\tsetwildbattle SPECIES_SNORLAX, 30\n\twaitse\n\tplaymoncry SPECIES_SNORLAX, CRY_MODE_ENCOUNTER\n\tdelay 40\n\twaitmoncry\n\tsetflag FLAG_HIDE_ROUTE_12_SNORLAX\n\tsetflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tdowildbattle\n\tclearflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_WON, Route12_EventScript_FoughtSnorlax\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_RAN, Route12_EventScript_FoughtSnorlax\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, Route12_EventScript_FoughtSnorlax\n\tsetflag FLAG_WOKE_UP_ROUTE_12_SNORLAX\n\trelease\n\tend\n\nRoute12_EventScript_DontUsePokeFlute::\n\trelease\n\tend\n\nRoute12_EventScript_FoughtSnorlax::\n\tsetflag FLAG_ROUTE_12_SNORLAX_RETURNED_TO_MOUNTAINS\n\tfadescreenswapbuffers FADE_TO_BLACK\n    removeobject VAR_LAST_TALKED\n    fadescreenswapbuffers FADE_FROM_BLACK\n\tmsgbox Text_SnorlaxReturnedToMountains\n\trelease\n\tend\n\nRoute12_EventScript_SnorlaxNoPokeFlute::\n\tmsgbox Route12_Text_MonSprawledOutInSlumber\n\trelease\n\tend\n\nRoute12_EventScript_RouteSign::\n\tmsgbox Route12_Text_RouteSign, MSGBOX_SIGN\n\tend\n\nRoute12_EventScript_FishingSign::\n\tmsgbox Route12_Text_SportfishingArea, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route12/text.inc",
    "content": "Route12_Text_MonSprawledOutInSlumber::\n    .string \"A POKéMON is sprawled out in\\n\"\n    .string \"a deep and comfortable slumber.$\"\n\nText_SnorlaxWokeUp::\n    .string \"SNORLAX woke up!\\p\"\n    .string \"It attacked in a grumpy rage!$\"\n\nText_SnorlaxReturnedToMountains::\n    .string \"SNORLAX calmed down.\\n\"\n    .string \"It gave a huge yawn…\\l\"\n    .string \"And returned to the mountains.$\"\n\nText_WantToUsePokeFlute::\n    .string \"Want to use the POKé FLUTE?$\"\n\nText_PlayedPokeFlute::\n    .string \"{PLAYER} played the POKé FLUTE.$\"\n\nRoute12_Text_NedIntro::\n    .string \"Yeah!\\n\"\n    .string \"I got a bite here!$\"\n\nRoute12_Text_NedDefeat::\n    .string \"Tch!\\n\"\n    .string \"Just a small fry…$\"\n\nRoute12_Text_NedPostBattle::\n    .string \"Hang on!\\n\"\n    .string \"My line's snagged!$\"\n\nRoute12_Text_ChipIntro::\n    .string \"Be patient.\\n\"\n    .string \"Fishing is a waiting game.$\"\n\nRoute12_Text_ChipDefeat::\n    .string \"That one got away!$\"\n\nRoute12_Text_ChipPostBattle::\n    .string \"With a better ROD, I could catch\\n\"\n    .string \"better POKéMON…$\"\n\nRoute12_Text_JustinIntro::\n    .string \"I'm searching for a MOON STONE.\\n\"\n    .string \"Have you found one?$\"\n\nRoute12_Text_JustinDefeat::\n    .string \"Oww!$\"\n\nRoute12_Text_JustinPostBattle::\n    .string \"I could have made my POKéMON\\n\"\n    .string \"evolve with a MOON STONE.\\p\"\n    .string \"I would have won then, I bet.$\"\n\nRoute12_Text_LucaIntro::\n    .string \"Electricity is my specialty.\\p\"\n    .string \"I don't know a thing about POKéMON\\n\"\n    .string \"of the sea, though.$\"\n\nRoute12_Text_LucaDefeat::\n    .string \"Unplugged!$\"\n\nRoute12_Text_LucaPostBattle::\n    .string \"Water conducts electricity, so you\\n\"\n    .string \"should zap sea POKéMON.$\"\n\nRoute12_Text_HankIntro::\n    .string \"The FISHING FOOL versus POKéMON\\n\"\n    .string \"KID!$\"\n\nRoute12_Text_HankDefeat::\n    .string \"Touch too much!$\"\n\nRoute12_Text_HankPostBattle::\n    .string \"I guess you get to be good at\\n\"\n    .string \"what you like.\\p\"\n    .string \"Well, you beat me at POKéMON,\\n\"\n    .string \"but you can't top me at fishing.$\"\n\nRoute12_Text_ElliotIntro::\n    .string \"I love fishing, don't get me wrong.\\p\"\n    .string \"But it'd be best if I also had more\\n\"\n    .string \"work.$\"\n\nRoute12_Text_ElliotDefeat::\n    .string \"It's not easy…$\"\n\nRoute12_Text_ElliotPostBattle::\n    .string \"It's all right.\\n\"\n    .string \"Losing doesn't bug me anymore.$\"\n\nRoute12_Text_AndrewIntro::\n    .string \"What's catching?\\p\"\n    .string \"You never know what you could\\n\"\n    .string \"catch!$\"\n\nRoute12_Text_AndrewDefeat::\n    .string \"Lost it!$\"\n\nRoute12_Text_AndrewPostBattle::\n    .string \"What, MAGIKARP?\\p\"\n    .string \"I catch them all the time, sure.\\n\"\n    .string \"But, boy are they wimpy.$\"\n\nRoute12_Text_RouteSign::\n    .string \"ROUTE 12 \\n\"\n    .string \"North to LAVENDER$\"\n\nRoute12_Text_SportfishingArea::\n    .string \"SPORTFISHING AREA$\"\n\nRoute12_Text_JesIntro::\n    .string \"JES: If I win, I'm going to\\n\"\n    .string \"propose to GIA.$\"\n\nRoute12_Text_JesDefeat::\n    .string \"JES: Oh, please, why couldn't you\\n\"\n    .string \"let us win?$\"\n\nRoute12_Text_JesPostBattle::\n    .string \"JES: Oh, GIA, forgive me,\\n\"\n    .string \"my love!$\"\n\nRoute12_Text_JesNotEnoughMons::\n    .string \"JES: GIA and I, we'll be\\n\"\n    .string \"together forever.\\p\"\n    .string \"We won't battle unless you have\\n\"\n    .string \"two POKéMON of your own.$\"\n\nRoute12_Text_GiaIntro::\n    .string \"GIA: Hey, JES…\\p\"\n    .string \"If we win, I'll marry you!$\"\n\nRoute12_Text_GiaDefeat::\n    .string \"GIA: Oh, but why?$\"\n\nRoute12_Text_GiaPostBattle::\n    .string \"GIA: JES, you silly!\\n\"\n    .string \"You ruined this!$\"\n\nRoute12_Text_GiaNotEnoughMons::\n    .string \"GIA: I can't bear to battle\\n\"\n    .string \"without my JES!\\p\"\n    .string \"Don't you have one more POKéMON?$\"\n"
  },
  {
    "path": "data/maps/Route12_FishingHouse/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE12_FISHING_HOUSE\",\n  \"name\": \"Route12_FishingHouse\",\n  \"layout\": \"LAYOUT_HOUSE4\",\n  \"music\": \"MUS_CELADON\",\n  \"region_map_section\": \"MAPSEC_ROUTE_12\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route12_FishingHouse_EventScript_FishingGuruBrother\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE12\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE12\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE12\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route12_FishingHouse_EventScript_MagikarpRecordSign\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route12_FishingHouse/scripts.inc",
    "content": "Route12_FishingHouse_MapScripts::\n\t.byte 0\n\nRoute12_FishingHouse_EventScript_FishingGuruBrother::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_SUPER_ROD, Route12_FishingHouse_EventScript_CheckMagikarpRecord\n\tmsgbox Route12_FishingHouse_Text_DoYouLikeToFish, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, Route12_FishingHouse_EventScript_GiveSuperRod\n\tmsgbox Route12_FishingHouse_Text_OhThatsDisappointing\n\trelease\n\tend\n\nRoute12_FishingHouse_EventScript_GiveSuperRod::\n\tcheckitemspace ITEM_SUPER_ROD\n\tgoto_if_eq VAR_RESULT, FALSE, Route12_FishingHouse_EventScript_NoRoomForSuperRod\n\tadditem ITEM_SUPER_ROD\n\tmsgbox Route12_FishingHouse_Text_TakeThisAndFish\n\tmsgreceiveditem Route12_FishingHouse_Text_ReceivedSuperRod, ITEM_SUPER_ROD\n\tsetflag FLAG_GOT_SUPER_ROD\n\tmsgbox Route12_FishingHouse_Text_IfYouCatchBigMagikarpShowMe\n\trelease\n\tend\n\nRoute12_FishingHouse_EventScript_NoRoomForSuperRod::\n\tmsgbox Route12_FishingHouse_Text_NoRoomForGift\n\trelease\n\tend\n\nRoute12_FishingHouse_EventScript_CheckMagikarpRecord::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tsetvar VAR_0x8004, SPECIES_MAGIKARP\n\tspecialvar VAR_RESULT, DoesPlayerPartyContainSpecies\n\tgoto_if_eq VAR_RESULT, FALSE, Route12_FishingHouse_EventScript_NoMagikarpInParty\n\tspecial GetMagikarpSizeRecordInfo\n\tmsgbox Route12_FishingHouse_Text_OhMagikarpAllowMeToSee\n\tspecial ChoosePartyMon\n\twaitstate\n\tcopyvar VAR_RESULT, VAR_0x8004\n\tgoto_if_ge VAR_RESULT, PARTY_SIZE, Route12_FishingHouse_EventScript_CancelShowMon\n\tspecial CompareMagikarpSize\n\tgoto_if_eq VAR_RESULT, 1, Route12_FishingHouse_EventScript_NotMagikarp\n\tgoto_if_eq VAR_RESULT, 2, Route12_FishingHouse_EventScript_NotRecordMagikarp\n\tgoto_if_eq VAR_RESULT, 3, Route12_FishingHouse_EventScript_NewRecordMagikarp\n\tgoto_if_eq VAR_RESULT, 4, Route12_FishingHouse_EventScript_TieRecordMagikarp\n\trelease\n\tend\n\nRoute12_FishingHouse_EventScript_NoMagikarpInParty::\n\tmsgbox Route12_FishingHouse_Text_TryFishingBringMeMagikarp\n\trelease\n\tend\n\nRoute12_FishingHouse_EventScript_CancelShowMon::\n\trelease\n\tend\n\nRoute12_FishingHouse_EventScript_NotMagikarp::\n\tmsgbox Route12_FishingHouse_Text_DoesntLookLikeMagikarp\n\trelease\n\tend\n\nRoute12_FishingHouse_EventScript_NotRecordMagikarp::\n\tgoto_if_unset FLAG_GOT_RECORD_SETTING_MAGIKARP, Route12_FishingHouse_EventScript_NewRecordMagikarp\n\tmsgbox Route12_FishingHouse_Text_HmmXInchesDoesntMeasureUp\n\trelease\n\tend\n\nRoute12_FishingHouse_EventScript_TieRecordMagikarp::\n\tgoto_if_unset FLAG_GOT_RECORD_SETTING_MAGIKARP, Route12_FishingHouse_EventScript_NewRecordMagikarp\n\tmsgbox Route12_FishingHouse_Text_HuhXInchesSameSizeAsLast\n\trelease\n\tend\n\nRoute12_FishingHouse_EventScript_NewRecordMagikarp::\n\tsetflag FLAG_GOT_RECORD_SETTING_MAGIKARP\n\tmsgbox Route12_FishingHouse_Text_WhoaXInchesTakeThis\n\tgiveitem ITEM_NET_BALL\n\tgoto_if_eq VAR_RESULT, FALSE, Route12_FishingHouse_EventScript_NoRoomForNetBall\n\tmsgbox Route12_FishingHouse_Text_LookForwardToGreaterRecords\n\trelease\n\tend\n\nRoute12_FishingHouse_EventScript_NoRoomForNetBall::\n\tmsgbox Route12_FishingHouse_Text_NoRoomForGift\n\trelease\n\tend\n\nRoute12_FishingHouse_EventScript_MagikarpRecordSign::\n\tlockall\n\tgoto_if_set FLAG_GOT_RECORD_SETTING_MAGIKARP, Route12_FishingHouse_EventScript_MagikarpRecordSignRecordSet\n\tmsgbox Route12_FishingHouse_Text_BlankChartOfSomeSort\n\treleaseall\n\tend\n\nRoute12_FishingHouse_EventScript_MagikarpRecordSignRecordSet::\n\tspecial GetMagikarpSizeRecordInfo\n\tmsgbox Route12_FishingHouse_Text_MostGiganticMagikarpXInches\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/Route12_FishingHouse/text.inc",
    "content": "Route12_FishingHouse_Text_DoYouLikeToFish::\n    .string \"I'm the FISHING GURU's younger\\n\"\n    .string \"brother.\\p\"\n    .string \"I simply looove fishing!\\n\"\n    .string \"I can't bear to go without.\\p\"\n    .string \"Tell me, do you like to fish?$\"\n\nRoute12_FishingHouse_Text_TakeThisAndFish::\n    .string \"Grand! I like your style.\\n\"\n    .string \"I think we can be friends.\\p\"\n    .string \"Take this and fish, young friend!$\"\n\nRoute12_FishingHouse_Text_ReceivedSuperRod::\n    .string \"{PLAYER} received a SUPER ROD from\\n\"\n    .string \"the FISHING GURU's brother.$\"\n\nRoute12_FishingHouse_Text_IfYouCatchBigMagikarpShowMe::\n    .string \"Fishing is a way of life!\\n\"\n    .string \"It is like the finest poetry.\\p\"\n    .string \"From the seas to rivers, go out\\n\"\n    .string \"and land the big one, my friend.\\p\"\n    .string \"Now, I have a request.\\p\"\n    .string \"If you catch a big MAGIKARP \\n\"\n    .string \"with that ROD, I want to see it.\\p\"\n    .string \"As much as I love to fish, I also\\n\"\n    .string \"love seeing gigantic MAGIKARP.$\"\n\nRoute12_FishingHouse_Text_OhThatsDisappointing::\n    .string \"Oh…\\n\"\n    .string \"That's so disappointing…$\"\n\nRoute12_FishingHouse_Text_TryFishingBringMeMagikarp::\n    .string \"Hello there, {PLAYER}!\\n\"\n    .string \"Have you been fishing?\\p\"\n    .string \"Try fishing with the SUPER ROD in\\n\"\n    .string \"any body of water.\\p\"\n    .string \"You'll find different POKéMON in\\n\"\n    .string \"different places.\\p\"\n    .string \"Oh, and don't forget to bring me\\n\"\n    .string \"gigantic MAGIKARP.$\"\n\nRoute12_FishingHouse_Text_OhMagikarpAllowMeToSee::\n    .string \"Oh? {PLAYER}?\\n\"\n    .string \"Why, if it isn't a MAGIKARP!\\p\"\n    .string \"Allow me to see it, quick!$\"\n\nRoute12_FishingHouse_Text_WhoaXInchesTakeThis::\n    .string \"… … …Whoa!\\n\"\n    .string \"{STR_VAR_2} inches!\\p\"\n    .string \"You have a rare appreciation for\\n\"\n    .string \"the fine, poetic aspects of fishing!\\p\"\n    .string \"You must take this.\\n\"\n    .string \"I insist!$\"\n\nRoute12_FishingHouse_Text_LookForwardToGreaterRecords::\n    .string \"I'll look forward to seeing greater\\n\"\n    .string \"records from you!$\"\n\nRoute12_FishingHouse_Text_HuhXInchesSameSizeAsLast::\n    .string \"Huh?\\n\"\n    .string \"{STR_VAR_2} inches?\\p\"\n    .string \"This is the same size as the one\\n\"\n    .string \"I saw before.$\"\n\nRoute12_FishingHouse_Text_HmmXInchesDoesntMeasureUp::\n    .string \"Hmm…\\n\"\n    .string \"This one is {STR_VAR_2} inches long.\\p\"\n    .string \"It doesn't measure up to the\\n\"\n    .string \"{STR_VAR_3}-inch one you brought before.$\"\n\nRoute12_FishingHouse_Text_DoesntLookLikeMagikarp::\n    .string \"Uh… That doesn't look much like\\n\"\n    .string \"a MAGIKARP.$\"\n\nRoute12_FishingHouse_Text_NoRoomForGift::\n    .string \"Oh, no!\\p\"\n    .string \"I had a gift for you, but you have\\n\"\n    .string \"no room for it.$\"\n\nRoute12_FishingHouse_Text_MostGiganticMagikarpXInches::\n    .string \"The most gigantic MAGIKARP\\n\"\n    .string \"I have ever witnessed…\\p\"\n    .string \"{STR_VAR_3} inches!$\"\n\nRoute12_FishingHouse_Text_BlankChartOfSomeSort::\n    .string \"It's a blank chart of some sort.\\p\"\n    .string \"It has spaces for writing in\\n\"\n    .string \"records of some kind.$\"\n\n"
  },
  {
    "path": "data/maps/Route12_NorthEntrance_1F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE12_NORTH_ENTRANCE_1F\",\n  \"name\": \"Route12_NorthEntrance_1F\",\n  \"layout\": \"LAYOUT_ROUTE12_NORTH_ENTRANCE_1F\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_12\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route12_NorthEntrance_1F_EventScript_Guard\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE12\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE12\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE12\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE12\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE12_NORTH_ENTRANCE_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route12_NorthEntrance_1F/scripts.inc",
    "content": "Route12_NorthEntrance_1F_MapScripts::\n\t.byte 0\n\nRoute12_NorthEntrance_1F_EventScript_Guard::\n\tmsgbox Route12_NorthEntrance_1F_Text_LookoutSpotUpstairs, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/Route12_NorthEntrance_1F/text.inc",
    "content": "Route12_NorthEntrance_1F_Text_LookoutSpotUpstairs::\n    .string \"There's a lookout spot upstairs.\\n\"\n    .string \"The view is magnificent.$\"\n\n"
  },
  {
    "path": "data/maps/Route12_NorthEntrance_2F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE12_NORTH_ENTRANCE_2F\",\n  \"name\": \"Route12_NorthEntrance_2F\",\n  \"layout\": \"LAYOUT_ENTRANCE_2F\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_12\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route12_NorthEntrance_2F_EventScript_Lass\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BIRD_KEEPER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Pidgeot\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE12_NORTH_ENTRANCE_1F\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route12_NorthEntrance_2F_EventScript_LeftBinoculars\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route12_NorthEntrance_2F_EventScript_RightBinoculars\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route12_NorthEntrance_2F/scripts.inc",
    "content": ".set LOCALID_PIDGEOT_MASTER, 2\n.set TRAINER, VAR_0x8009\n\nRoute12_NorthEntrance_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route12_NorthEntrance_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute12_NorthEntrance_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_PIDGEOT\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route12_NorthEntrance_MapScript_PidgeotMasterMovementType\n\tend\n\nRoute12_NorthEntrance_MapScript_PidgeotMasterMovementType::\n\tsetobjectmovementtype LOCALID_PIDGEOT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute12_NorthEntrance_2F_EventScript_LeftBinoculars::\n\tmsgbox Route12_NorthEntrance_2F_Text_TheresManFishing, MSGBOX_SIGN\n\tend\n\nRoute12_NorthEntrance_2F_EventScript_RightBinoculars::\n\tmsgbox Route12_NorthEntrance_2F_Text_ItsPokemonTower, MSGBOX_SIGN\n\tend\n\nRoute12_NorthEntrance_2F_EventScript_Lass::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_TM27, Route12_NorthEntrance_2F_EventScript_ExplainTM27\n\tcheckplayergender\n\tcall_if_eq VAR_RESULT, MALE, Route12_NorthEntrance_2F_EventScript_TakeTMMale\n\tcall_if_eq VAR_RESULT, FEMALE, Route12_NorthEntrance_2F_EventScript_TakeTMFemale\n\tcheckitemspace ITEM_TM27\n\tgoto_if_eq VAR_RESULT, FALSE, Route12_NorthEntrance_2F_EventScript_NoRoomForTM27\n\tgiveitem_msg Route12_NorthEntrance_2F_Text_ReceivedTM27FromLittleGirl, ITEM_TM27\n\tmsgbox Route12_NorthEntrance_2F_Text_ExplainTM27\n\tsetflag FLAG_GOT_TM27\n\trelease\n\tend\n\nRoute12_NorthEntrance_2F_EventScript_TakeTMMale::\n\tmsgbox Route12_NorthEntrance_2F_Text_TakeTMDontNeedAnymoreMale\n\treturn\n\nRoute12_NorthEntrance_2F_EventScript_TakeTMFemale::\n\tmsgbox Route12_NorthEntrance_2F_Text_TakeTMDontNeedAnymoreFemale\n\treturn\n\nRoute12_NorthEntrance_2F_EventScript_NoRoomForTM27::\n\tmsgbox Route12_NorthEntrance_2F_Text_DontHaveRoomForThis\n\trelease\n\tend\n\nRoute12_NorthEntrance_2F_EventScript_ExplainTM27::\n\tmsgbox Route12_NorthEntrance_2F_Text_ExplainTM27\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/Route12_NorthEntrance_2F/text.inc",
    "content": "@ Male and female text identical, differ (presumably) in JP\nRoute12_NorthEntrance_2F_Text_TakeTMDontNeedAnymoreMale::\n    .string \"My POKéMON's ashes are stored in\\n\"\n    .string \"POKéMON TOWER.\\p\"\n    .string \"You can have this TM.\\n\"\n    .string \"I don't need it anymore…$\"\n\nRoute12_NorthEntrance_2F_Text_TakeTMDontNeedAnymoreFemale::\n    .string \"My POKéMON's ashes are stored in\\n\"\n    .string \"POKéMON TOWER.\\p\"\n    .string \"You can have this TM.\\n\"\n    .string \"I don't need it anymore…$\"\n\nRoute12_NorthEntrance_2F_Text_ReceivedTM27FromLittleGirl::\n    .string \"{PLAYER} received TM27\\n\"\n    .string \"from the little girl.$\"\n\nRoute12_NorthEntrance_2F_Text_ExplainTM27::\n    .string \"TM27 is a move called RETURN…\\p\"\n    .string \"If you treat your POKéMON good,\\n\"\n    .string \"it will return your love by working\\l\"\n    .string \"its hardest in battle.$\"\n\nRoute12_NorthEntrance_2F_Text_DontHaveRoomForThis::\n    .string \"You don't have room for this.$\"\n\nRoute12_NorthEntrance_2F_Text_TheresManFishing::\n    .string \"Let's see what the binoculars have\\n\"\n    .string \"to show…\\p\"\n    .string \"There's a man fishing!$\"\n\nRoute12_NorthEntrance_2F_Text_ItsPokemonTower::\n    .string \"Let's see what the binoculars have\\n\"\n    .string \"to show…\\p\"\n    .string \"It's POKéMON TOWER!$\"\n\n"
  },
  {
    "path": "data/maps/Route13/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE13\",\n  \"name\": \"Route13\",\n  \"layout\": \"LAYOUT_ROUTE13\",\n  \"music\": \"MUS_ROUTE11\",\n  \"region_map_section\": \"MAPSEC_ROUTE_13\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 48,\n      \"map\": \"MAP_ROUTE12\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE14\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 62,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route13_EventScript_Alma\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 63,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route13_EventScript_Sebastian\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 54,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route13_EventScript_Susie\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 42,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route13_EventScript_Sheila\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 43,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route13_EventScript_Lola\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route13_EventScript_Valerie\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route13_EventScript_Gwen\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 9,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route13_EventScript_Robert\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 16,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route13_EventScript_Perry\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route13_EventScript_Jared\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 44,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_13_CUT_TREE\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER\",\n      \"in_connection\": false,\n      \"x\": 57,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Seaking\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 56,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Kakuna\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 41,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route13_EventScript_RouteSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 37,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route13_EventScript_TrainerTips2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 21,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route13_EventScript_TrainerTips1\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 23,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PP_UP\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE13_PP_UP\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/Route13/scripts.inc",
    "content": ".set LOCALID_SEAKING_MASTER, 12\n.set LOCALID_KAKUNA_MASTER, 13\n.set TRAINER, VAR_0x8009\n\nRoute13_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route13_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute13_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_SEAKING\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route13_MapScript_SeakingMasterMovementType\n\tsetvar TRAINER, MASTER_KAKUNA\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route13_MapScript_KakunaMasterMovementType\n\tend\n\nRoute13_MapScript_SeakingMasterMovementType::\n\tsetobjectmovementtype LOCALID_SEAKING_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM\n\treturn\n\nRoute13_MapScript_KakunaMasterMovementType::\n\tsetobjectmovementtype LOCALID_KAKUNA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute13_EventScript_TrainerTips1::\n\tmsgbox Route13_Text_LookToLeftOfThatPost, MSGBOX_SIGN\n\tend\n\nRoute13_EventScript_TrainerTips2::\n\tmsgbox Route13_Text_SelectToSwitchItems, MSGBOX_SIGN\n\tend\n\nRoute13_EventScript_RouteSign::\n\tmsgbox Route13_Text_RouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route13/text.inc",
    "content": "Route13_Text_SebastianIntro::\n    .string \"My bird POKéMON want to battle\\n\"\n    .string \"with you!$\"\n\nRoute13_Text_SebastianDefeat::\n    .string \"My PIDGEY and PIDGEOTTO combo\\n\"\n    .string \"lost?$\"\n\nRoute13_Text_SebastianPostBattle::\n    .string \"My POKéMON look happy even though\\n\"\n    .string \"they lost.$\"\n\nRoute13_Text_SusieIntro::\n    .string \"I'm told I'm good for a kid.$\"\n\nRoute13_Text_SusieDefeat::\n    .string \"Ohh!\\n\"\n    .string \"I lost!$\"\n\nRoute13_Text_SusiePostBattle::\n    .string \"I want to become a good TRAINER.\\n\"\n    .string \"I'll train hard, just watch.$\"\n\nRoute13_Text_ValerieIntro::\n    .string \"Wow!\\n\"\n    .string \"Your BADGES are too cool!$\"\n\nRoute13_Text_ValerieDefeat::\n    .string \"Not enough!$\"\n\nRoute13_Text_ValeriePostBattle::\n    .string \"You got those BADGES from GYM\\n\"\n    .string \"LEADERS. I know!$\"\n\nRoute13_Text_GwenIntro::\n    .string \"My cute POKéMON wish to make your\\n\"\n    .string \"acquaintance.$\"\n\nRoute13_Text_GwenDefeat::\n    .string \"Good going!\\n\"\n    .string \"You totally won!$\"\n\nRoute13_Text_GwenPostBattle::\n    .string \"You have to make POKéMON battle\\n\"\n    .string \"to toughen them up.$\"\n\nRoute13_Text_AlmaIntro::\n    .string \"I found CARBOS in a cave once\\n\"\n    .string \"while I was spelunking.$\"\n\nRoute13_Text_AlmaDefeat::\n    .string \"Oh, too bad!\\n\"\n    .string \"I just messed up!$\"\n\nRoute13_Text_AlmaPostBattle::\n    .string \"CARBOS boosted the SPEED of my\\n\"\n    .string \"POKéMON.$\"\n\nRoute13_Text_PerryIntro::\n    .string \"I'm not going to lose.\\n\"\n    .string \"Not when the wind's blowing my way!$\"\n\nRoute13_Text_PerryDefeat::\n    .string \"The wind turned!$\"\n\nRoute13_Text_PerryPostBattle::\n    .string \"I'm beat.\\n\"\n    .string \"I guess I'll FLY home.$\"\n\nRoute13_Text_LolaIntro::\n    .string \"Sure, I'll play with you, sweetie.$\"\n\nRoute13_Text_LolaDefeat::\n    .string \"Oh!\\n\"\n    .string \"You little beast!$\"\n\nRoute13_Text_LolaPostBattle::\n    .string \"I wonder which is stronger, male or\\n\"\n    .string \"female POKéMON?$\"\n\nRoute13_Text_SheilaIntro::\n    .string \"Do you want to battle some\\n\"\n    .string \"POKéMON with me?$\"\n\nRoute13_Text_SheilaDefeat::\n    .string \"It's over already?$\"\n\nRoute13_Text_SheilaPostBattle::\n    .string \"I don't know anything about\\n\"\n    .string \"POKéMON actually.\\p\"\n    .string \"The ones I use… I picked them\\n\"\n    .string \"for their looks!$\"\n\nRoute13_Text_JaredIntro::\n    .string \"What're you lookin' at?$\"\n\nRoute13_Text_JaredDefeat::\n    .string \"Dang!\\n\"\n    .string \"Stripped gears!$\"\n\nRoute13_Text_JaredPostBattle::\n    .string \"Get lost!$\"\n\nRoute13_Text_RobertIntro::\n    .string \"I always go with bird POKéMON.\\n\"\n    .string \"I've dedicated myself to them.$\"\n\nRoute13_Text_RobertDefeat::\n    .string \"Out of power!$\"\n\nRoute13_Text_RobertPostBattle::\n    .string \"I wish I could fly like PIDGEY and\\n\"\n    .string \"PIDGEOTTO…$\"\n\nRoute13_Text_LookToLeftOfThatPost::\n    .string \"TRAINER TIPS\\p\"\n    .string \"Look, look!\\n\"\n    .string \"Look to the left of that post!$\"\n\nRoute13_Text_SelectToSwitchItems::\n    .string \"TRAINER TIPS\\p\"\n    .string \"Use SELECT to switch items in the\\n\"\n    .string \"ITEMS window.$\"\n\nRoute13_Text_RouteSign::\n    .string \"ROUTE 13\\n\"\n    .string \"North to SILENCE BRIDGE$\"\n\n"
  },
  {
    "path": "data/maps/Route14/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE14\",\n  \"name\": \"Route14\",\n  \"layout\": \"LAYOUT_ROUTE14\",\n  \"music\": \"MUS_ROUTE11\",\n  \"region_map_section\": \"MAPSEC_ROUTE_14\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": 40,\n      \"map\": \"MAP_ROUTE15\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE13\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 37,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route14_EventScript_Gerald\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 18,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route14_EventScript_Donald\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 10,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route14_EventScript_Beck\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 16,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route14_EventScript_Marlon\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route14_EventScript_Isaac\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route14_EventScript_Malik\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route14_EventScript_Mitch\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 7,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route14_EventScript_Carter\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 37,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 6,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route14_EventScript_Lukas\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 18,\n      \"y\": 47,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route14_EventScript_Benny\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_14_CUT_TREE_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_14_CUT_TREE_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 47,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_14_CUT_TREE_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TWIN\",\n      \"x\": 13,\n      \"y\": 51,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route14_EventScript_Jan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TWIN\",\n      \"x\": 12,\n      \"y\": 51,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route14_EventScript_Kiri\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Vileplume\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 54,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Ivysaur\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route14_EventScript_RouteSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 9,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ZINC\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE14_ZINC\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 19,\n      \"y\": 53,\n      \"elevation\": 3,\n      \"item\": \"ITEM_GREPA_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE14_GREPA_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/Route14/scripts.inc",
    "content": ".set LOCALID_VILEPLUME_MASTER, 16\n.set LOCALID_IVYSAUR_MASTER, 17\n.set TRAINER, VAR_0x8009\n\nRoute14_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route14_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute14_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_VILEPLUME\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route14_MapScript_VileplumeMasterMovementType\n\tsetvar TRAINER, MASTER_IVYSAUR\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route14_MapScript_IvysaurMasterMovementType\n\tend\n\nRoute14_MapScript_VileplumeMasterMovementType::\n\tsetobjectmovementtype LOCALID_VILEPLUME_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute14_MapScript_IvysaurMasterMovementType::\n\tsetobjectmovementtype LOCALID_IVYSAUR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute14_EventScript_RouteSign::\n\tmsgbox Route14_Text_RouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route14/text.inc",
    "content": "Route14_Text_CarterIntro::\n    .string \"You need to use TMs to teach good\\n\"\n    .string \"moves to POKéMON.$\"\n\nRoute14_Text_CarterDefeat::\n    .string \"Not good enough quite yet.$\"\n\nRoute14_Text_CarterPostBattle::\n    .string \"You have some HMs, right? POKéMON\\n\"\n    .string \"can't forget those moves easily.$\"\n\nRoute14_Text_MitchIntro::\n    .string \"My bird POKéMON should be ready\\n\"\n    .string \"for battle.$\"\n\nRoute14_Text_MitchDefeat::\n    .string \"Not ready yet!$\"\n\nRoute14_Text_MitchPostBattle::\n    .string \"My bird POKéMON need to learn\\n\"\n    .string \"better moves.$\"\n\nRoute14_Text_BeckIntro::\n    .string \"They have TMs on sale at the\\n\"\n    .string \"CELADON DEPT. STORE.\\p\"\n    .string \"TMs aren't really rare, but not\\n\"\n    .string \"many people have HMs.$\"\n\nRoute14_Text_BeckDefeat::\n    .string \"Aww, bummer!$\"\n\nRoute14_Text_BeckPostBattle::\n    .string \"Try teaching POKéMON a move that's\\n\"\n    .string \"the same type as it.\\p\"\n    .string \"That apparently boosts the power\\n\"\n    .string \"of the move.$\"\n\nRoute14_Text_MarlonIntro::\n    .string \"Have you taught your bird POKéMON\\n\"\n    .string \"how to FLY?\\p\"\n    .string \"You'll be able to soar with it into\\n\"\n    .string \"the sky!$\"\n\nRoute14_Text_MarlonDefeat::\n    .string \"Shot down in flames!$\"\n\nRoute14_Text_MarlonPostBattle::\n    .string \"Bird POKéMON are my one true love.\\n\"\n    .string \"I don't want to raise anything else.$\"\n\nRoute14_Text_DonaldIntro::\n    .string \"Have you heard the legend of the\\n\"\n    .string \"winged mirages?$\"\n\nRoute14_Text_DonaldDefeat::\n    .string \"Why?\\n\"\n    .string \"Why'd I lose?$\"\n\nRoute14_Text_DonaldPostBattle::\n    .string \"Well, the winged mirages are the\\n\"\n    .string \"legendary bird POKéMON.\\p\"\n    .string \"There are three of them: ARTICUNO,\\n\"\n    .string \"ZAPDOS, and MOLTRES.$\"\n\nRoute14_Text_BennyIntro::\n    .string \"I'm not into it, but okay.\\n\"\n    .string \"Let's go!$\"\n\nRoute14_Text_BennyDefeat::\n    .string \"I knew it!$\"\n\nRoute14_Text_BennyPostBattle::\n    .string \"Winning, losing… It's insignificant\\n\"\n    .string \"under this huge sky.$\"\n\nRoute14_Text_LukasIntro::\n    .string \"C'mon, c'mon.\\n\"\n    .string \"Let's go, let's go, let's go!$\"\n\nRoute14_Text_LukasDefeat::\n    .string \"Arrg!\\n\"\n    .string \"Lost! Get lost!$\"\n\nRoute14_Text_LukasPostBattle::\n    .string \"What, what, what?\\n\"\n    .string \"What do you want still?$\"\n\nRoute14_Text_IsaacIntro::\n    .string \"I need to burn some time.\\n\"\n    .string \"Shut up and battle.$\"\n\nRoute14_Text_IsaacDefeat::\n    .string \"What?\\n\"\n    .string \"You!?$\"\n\nRoute14_Text_IsaacPostBattle::\n    .string \"Raising POKéMON is a drag, man.$\"\n\nRoute14_Text_GeraldIntro::\n    .string \"We ride out here because of the\\n\"\n    .string \"wide-open spaces.$\"\n\nRoute14_Text_GeraldDefeat::\n    .string \"Wipeout!$\"\n\nRoute14_Text_GeraldPostBattle::\n    .string \"It's cool you made your POKéMON so\\n\"\n    .string \"strong.\\p\"\n    .string \"Might is right!\\n\"\n    .string \"And you know it!$\"\n\nRoute14_Text_MalikIntro::\n    .string \"POKéMON battle?\\n\"\n    .string \"Cool! Rumble!$\"\n\nRoute14_Text_MalikDefeat::\n    .string \"Blown away!$\"\n\nRoute14_Text_MalikPostBattle::\n    .string \"You know who'd win, you and me\\n\"\n    .string \"one-on-one!$\"\n\nRoute14_Text_RouteSign::\n    .string \"ROUTE 14\\n\"\n    .string \"West to FUCHSIA CITY$\"\n\nRoute14_Text_KiriIntro::\n    .string \"KIRI: JAN, let's try really,\\n\"\n    .string \"really hard together.$\"\n\nRoute14_Text_KiriDefeat::\n    .string \"KIRI: Whimper…\\n\"\n    .string \"We lost, didn't we?$\"\n\nRoute14_Text_KiriPostBattle::\n    .string \"KIRI: Did we lose because of me?$\"\n\nRoute14_Text_KiriNotEnoughMons::\n    .string \"KIRI: We can battle if you have\\n\"\n    .string \"two POKéMON.$\"\n\nRoute14_Text_JanIntro::\n    .string \"JAN: KIRI, here we go!\\n\"\n    .string \"We have to try hard!$\"\n\nRoute14_Text_JanDefeat::\n    .string \"JAN: Eeeeh!\\n\"\n    .string \"No fair!$\"\n\nRoute14_Text_JanPostBattle::\n    .string \"JAN: KIRI, don't cry!\\n\"\n    .string \"We'll just try harder next time.$\"\n\nRoute14_Text_JanNotEnoughMons::\n    .string \"JAN: You want to battle?\\n\"\n    .string \"You don't have enough POKéMON.$\"\n"
  },
  {
    "path": "data/maps/Route15/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE15\",\n  \"name\": \"Route15\",\n  \"layout\": \"LAYOUT_ROUTE15\",\n  \"music\": \"MUS_ROUTE11\",\n  \"region_map_section\": \"MAPSEC_ROUTE_15\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": -10,\n      \"map\": \"MAP_FUCHSIA_CITY\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": -40,\n      \"map\": \"MAP_ROUTE14\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route15_EventScript_Yazmin\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 31,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"Route15_EventScript_Edwin\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 37,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route15_EventScript_Chester\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 44,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route15_EventScript_Kindra\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 50,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route15_EventScript_Olivia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 59,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route15_EventScript_Alex\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 63,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route15_EventScript_Ernest\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 52,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route15_EventScript_Becky\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 54,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route15_EventScript_Grace\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route15_EventScript_Celia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route15_EventScript_ItemTM18\",\n      \"flag\": \"FLAG_HIDE_ROUTE15_TM18\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 39,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route15_EventScript_Ron\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BATTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route15_EventScript_Mya\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"clone\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"x\": 73,\n      \"y\": 7,\n      \"target_local_id\": 13,\n      \"target_map\": \"MAP_ROUTE14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Tangela\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 43,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Venomoth\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BIRD_KEEPER\",\n      \"in_connection\": false,\n      \"x\": 61,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Dodrio\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 9,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE15_WEST_ENTRANCE_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 16,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE15_WEST_ENTRANCE_1F\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 41,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route15_EventScript_RouteSign\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/Route15/scripts.inc",
    "content": ".set LOCALID_TANGELA_MASTER, 15\n.set LOCALID_VENOMOTH_MASTER, 16\n.set LOCALID_DODRIO_MASTER, 17\n.set TRAINER, VAR_0x8009\n\nRoute15_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route15_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute15_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_TANGELA\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route15_MapScript_TangelaMasterMovementType\n\tsetvar TRAINER, MASTER_VENOMOTH\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route15_MapScript_VenomothMasterMovementType\n\tsetvar TRAINER, MASTER_DODRIO\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route15_MapScript_DodrioMasterMovementType\n\tend\n\nRoute15_MapScript_TangelaMasterMovementType::\n\tsetobjectmovementtype LOCALID_TANGELA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\t\nRoute15_MapScript_VenomothMasterMovementType::\n\tsetobjectmovementtype LOCALID_VENOMOTH_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute15_MapScript_DodrioMasterMovementType::\n\tsetobjectmovementtype LOCALID_DODRIO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\n\nRoute15_EventScript_RouteSign::\n\tmsgbox Route15_Text_RouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route15/text.inc",
    "content": "Route15_Text_KindraIntro::\n    .string \"I just got some POKéMON in trades.\\n\"\n    .string \"Can I try them out on you?$\"\n\nRoute15_Text_KindraDefeat::\n    .string \"Not good enough!$\"\n\nRoute15_Text_KindraPostBattle::\n    .string \"You can't change the nickname of\\n\"\n    .string \"any POKéMON you get in a trade.\\p\"\n    .string \"Only the Original TRAINER can get\\n\"\n    .string \"the nickname changed.$\"\n\nRoute15_Text_BeckyIntro::\n    .string \"You look gentle, so I think I can\\n\"\n    .string \"beat you.\\p\"\n    .string \"I'll give it a go!$\"\n\nRoute15_Text_BeckyDefeat::\n    .string \"No, wrong!$\"\n\nRoute15_Text_BeckyPostBattle::\n    .string \"I'm afraid of BIKERS. They look so\\n\"\n    .string \"ugly and mean!$\"\n\nRoute15_Text_EdwinIntro::\n    .string \"When I whistle, I can summon bird\\n\"\n    .string \"POKéMON.$\"\n\nRoute15_Text_EdwinDefeat::\n    .string \"Ow!\\n\"\n    .string \"That's tragic!$\"\n\nRoute15_Text_EdwinPostBattle::\n    .string \"Maybe I'm not cut out for battles.\\n\"\n    .string \"I'm not the right type, I guess.$\"\n\nRoute15_Text_ChesterIntro::\n    .string \"Hmm? My birds are shivering!\\n\"\n    .string \"You're good, aren't you?$\"\n\nRoute15_Text_ChesterDefeat::\n    .string \"Just as I thought!$\"\n\nRoute15_Text_ChesterPostBattle::\n    .string \"This is so obvious, you should know\\n\"\n    .string \"this, but…\\p\"\n    .string \"Moves like EARTHQUAKE and FISSURE\\n\"\n    .string \"have no effect on bird POKéMON.$\"\n\nRoute15_Text_GraceIntro::\n    .string \"Oh, you're a little cutie!\\n\"\n    .string \"So like a darling POKéMON!$\"\n\nRoute15_Text_GraceDefeat::\n    .string \"You looked so cute, too!$\"\n\nRoute15_Text_GracePostBattle::\n    .string \"I forgive you.\\n\"\n    .string \"I can take it.\\l\"\n    .string \"I'm a big girl now.$\"\n\nRoute15_Text_OliviaIntro::\n    .string \"I raise POKéMON for protection\\n\"\n    .string \"because I live alone.$\"\n\nRoute15_Text_OliviaDefeat::\n    .string \"POKéMON isn't about winning or\\n\"\n    .string \"losing for me.$\"\n\nRoute15_Text_OliviaPostBattle::\n    .string \"I love having my POKéMON greet me\\n\"\n    .string \"when I get home.\\p\"\n    .string \"It's so reassuring.$\"\n\nRoute15_Text_ErnestIntro::\n    .string \"Hey, kid! C'mon!\\n\"\n    .string \"I just got these off some loser!$\"\n\nRoute15_Text_ErnestDefeat::\n    .string \"Why not?$\"\n\nRoute15_Text_ErnestPostBattle::\n    .string \"Life's too short.\\n\"\n    .string \"It's cool to live as an outlaw.\\l\"\n    .string \"TEAM ROCKET RULES!$\"\n\nRoute15_Text_AlexIntro::\n    .string \"Fork over all your cash when you\\n\"\n    .string \"lose to me, kid!$\"\n\nRoute15_Text_AlexDefeat::\n    .string \"That can't be true!$\"\n\nRoute15_Text_AlexPostBattle::\n    .string \"I was just joking about the money.\\n\"\n    .string \"Don't take me all serious.$\"\n\nRoute15_Text_CeliaIntro::\n    .string \"What's cool and happening?\\n\"\n    .string \"Trading POKéMON!$\"\n\nRoute15_Text_CeliaDefeat::\n    .string \"I said trade!$\"\n\nRoute15_Text_CeliaPostBattle::\n    .string \"I trade POKéMON with my friends\\n\"\n    .string \"all the time.$\"\n\nRoute15_Text_YazminIntro::\n    .string \"Want to play with my POKéMON?$\"\n\nRoute15_Text_YazminDefeat::\n    .string \"I was too impatient!$\"\n\nRoute15_Text_YazminPostBattle::\n    .string \"I'll go train with weaker people.$\"\n\nRoute15_Text_RouteSign::\n    .string \"ROUTE 15\\n\"\n    .string \"West to FUCHSIA CITY$\"\n\nRoute15_Text_MyaIntro::\n    .string \"MYA: You're perfect.\\n\"\n    .string \"Help me train my little brother?$\"\n\nRoute15_Text_MyaDefeat::\n    .string \"MYA: RON, you have to focus!\\n\"\n    .string \"Concentrate on what you're doing!$\"\n\nRoute15_Text_MyaPostBattle::\n    .string \"MYA: Okay, we'll turn it up.\\n\"\n    .string \"I'll add to our training menu!$\"\n\nRoute15_Text_MyaNotEnoughMons::\n    .string \"MYA: Do you want to challenge us?\\n\"\n    .string \"You'll need two POKéMON, though.$\"\n\nRoute15_Text_RonIntro::\n    .string \"RON: My sister gets scary when we\\n\"\n    .string \"lose.$\"\n\nRoute15_Text_RonDefeat::\n    .string \"RON: Oh, no, no…\\n\"\n    .string \"Sis, I'm sorry!$\"\n\nRoute15_Text_RonPostBattle::\n    .string \"RON: Oh, bleah…\\n\"\n    .string \"I wish I had a nice sister…$\"\n\nRoute15_Text_RonNotEnoughMons::\n    .string \"RON: Did you want to battle with\\n\"\n    .string \"my sister and me?\\p\"\n    .string \"You need two POKéMON, then.$\"\n"
  },
  {
    "path": "data/maps/Route15_WestEntrance_1F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE15_WEST_ENTRANCE_1F\",\n  \"name\": \"Route15_WestEntrance_1F\",\n  \"layout\": \"LAYOUT_ENTRANCE_1F\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_15\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route15_WestEntrance_1F_EventScript_Guard\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE15\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE15\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE15\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE15\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE15_WEST_ENTRANCE_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route15_WestEntrance_1F/scripts.inc",
    "content": "Route15_WestEntrance_1F_MapScripts::\n\t.byte 0\n\nRoute15_WestEntrance_1F_EventScript_Guard::\n\tmsgbox Route15_WestEntrance_1F_Text_OaksAideCameByHere, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/Route15_WestEntrance_1F/text.inc",
    "content": "Route15_WestEntrance_1F_Text_OaksAideCameByHere::\n    .string \"Are you the kid who's working on\\n\"\n    .string \"a POKéDEX?\\p\"\n    .string \"PROF. OAK's AIDE came by here.$\"\n\n"
  },
  {
    "path": "data/maps/Route15_WestEntrance_2F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE15_WEST_ENTRANCE_2F\",\n  \"name\": \"Route15_WestEntrance_2F\",\n  \"layout\": \"LAYOUT_ENTRANCE_2F\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_15\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route15_WestEntrance_2F_EventScript_Aide\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Scyther\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE15_WEST_ENTRANCE_1F\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route15_WestEntrance_2F_EventScript_LeftBinoculars\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route15_WestEntrance_2F_EventScript_RightBinoculars\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route15_WestEntrance_2F/scripts.inc",
    "content": ".equ REQUIRED_CAUGHT_MONS, 50\n.set LOCALID_SCYTHER_MASTER, 16\n.set TRAINER, VAR_0x8009\n\nRoute15_WestEntrance_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route15_WestEntrance_2F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute15_WestEntrance_2F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_SCYTHER\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route15_WestEntrance_2F_MapScript_ScytherMasterMovementType\n\tend\n\nRoute15_WestEntrance_2F_MapScript_ScytherMasterMovementType::\n\tsetobjectmovementtype LOCALID_SCYTHER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute15_WestEntrance_2F_EventScript_LeftBinoculars::\n\tlockall\n\tmsgbox Route15_WestEntrance_2F_Text_LargeShiningBird\n\tshowmonpic SPECIES_ARTICUNO, 10, 3\n\tdelay 20\n\twaitbuttonpress\n\thidemonpic\n\tsetvar VAR_0x8004, SPECIES_ARTICUNO\n\tspecial SetSeenMon\n\treleaseall\n\tend\n\nRoute15_WestEntrance_2F_EventScript_RightBinoculars::\n\tmsgbox Route15_WestEntrance_2F_Text_SmallIslandOnHorizon, MSGBOX_SIGN\n\tend\n\nRoute15_WestEntrance_2F_EventScript_Aide::\n\tlock\n\tfaceplayer\n\tcall Route15_WestEntrance_2F_EventScript_GetAideRequestInfo\n\tgoto_if_set FLAG_GOT_EXP_SHARE_FROM_OAKS_AIDE, Route15_WestEntrance_2F_EventScript_AlreadyGotExpShare\n\tmsgbox Route15_WestEntrance_2F_Text_GiveItemIfCaughtEnough, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Aide_EventScript_DeclineCheckMons\n\tsetvar VAR_0x8004, 0\n\tspecialvar VAR_RESULT, GetPokedexCount\n\tbuffernumberstring STR_VAR_3, VAR_0x8006\n\tcall Route15_WestEntrance_2F_EventScript_GetAideRequestInfo\n\tgoto_if_lt VAR_0x8006, REQUIRED_CAUGHT_MONS, Aide_EventScript_HaventCaughtEnough\n\tmsgbox Route15_WestEntrance_2F_Text_GreatHereYouGo\n\tcheckitemspace ITEM_EXP_SHARE\n\tgoto_if_eq VAR_RESULT, FALSE, Aide_EventScript_NoRoomForItem\n\tgiveitem_msg Route15_WestEntrance_2F_Text_ReceivedItemFromAide, ITEM_EXP_SHARE\n\tsetflag FLAG_GOT_EXP_SHARE_FROM_OAKS_AIDE\n\tmsgbox Route15_WestEntrance_2F_Text_ExplainExpShare\n\trelease\n\tend\n\nRoute15_WestEntrance_2F_EventScript_AlreadyGotExpShare::\n\tmsgbox Route15_WestEntrance_2F_Text_ExplainExpShare\n\trelease\n\tend\n\nRoute15_WestEntrance_2F_EventScript_GetAideRequestInfo::\n\tbuffernumberstring STR_VAR_1, REQUIRED_CAUGHT_MONS\n\tbufferitemname STR_VAR_2, ITEM_EXP_SHARE\n\treturn\n"
  },
  {
    "path": "data/maps/Route15_WestEntrance_2F/text.inc",
    "content": "Route15_WestEntrance_2F_Text_GiveItemIfCaughtEnough::\n    .string \"Hi! Remember me?\\n\"\n    .string \"I'm one of PROF. OAK's AIDES.\\p\"\n    .string \"If your POKéDEX has complete data\\n\"\n    .string \"on {STR_VAR_1} species, I'm supposed to\\l\"\n    .string \"give you a reward.\\p\"\n    .string \"PROF. OAK entrusted me with the\\n\"\n    .string \"{STR_VAR_2} for you.\\p\"\n    .string \"So, {PLAYER}, let me ask you.\\p\"\n    .string \"Have you gathered data on at least\\n\"\n    .string \"{STR_VAR_1} kinds of POKéMON?$\"\n\nRoute15_WestEntrance_2F_Text_GreatHereYouGo::\n    .string \"Great! You have caught or owned\\n\"\n    .string \"{STR_VAR_3} kinds of POKéMON!\\p\"\n    .string \"Congratulations!\\n\"\n    .string \"Here you go!$\"\n\nRoute15_WestEntrance_2F_Text_ReceivedItemFromAide::\n    .string \"{PLAYER} received the {STR_VAR_2}\\n\"\n    .string \"from the AIDE.$\"\n\nRoute15_WestEntrance_2F_Text_ExplainExpShare::\n    .string \"EXP. SHARE is an item to be held\\n\"\n    .string \"by a POKéMON.\\p\"\n    .string \"The POKéMON will receive a share\\n\"\n    .string \"of the EXP. Points without having\\l\"\n    .string \"to battle.$\"\n\nRoute15_WestEntrance_2F_Text_LargeShiningBird::\n    .string \"Let's see what the binoculars have\\n\"\n    .string \"to show…\\p\"\n    .string \"A large, shining bird is flying\\n\"\n    .string \"toward the sea.$\"\n\nRoute15_WestEntrance_2F_Text_SmallIslandOnHorizon::\n    .string \"Let's see what the binoculars have\\n\"\n    .string \"to show…\\p\"\n    .string \"It looks like a small island on\\n\"\n    .string \"the horizon!$\"\n\n"
  },
  {
    "path": "data/maps/Route16/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE16\",\n  \"name\": \"Route16\",\n  \"layout\": \"LAYOUT_ROUTE16\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_16\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE17\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": -10,\n      \"map\": \"MAP_CELADON_CITY\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route16_EventScript_Lao\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUE_BALL\",\n      \"x\": 14,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route16_EventScript_Koji\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUE_BALL\",\n      \"x\": 12,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route16_EventScript_Luke\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route16_EventScript_Ruben\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route16_EventScript_Hideo\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUE_BALL\",\n      \"x\": 6,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route16_EventScript_Camron\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 41,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_16_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNG_COUPLE_F\",\n      \"x\": 30,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route16_EventScript_Lea\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNG_COUPLE_M\",\n      \"x\": 31,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route16_EventScript_Jed\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SNORLAX\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route16_EventScript_Snorlax\",\n      \"flag\": \"FLAG_HIDE_ROUTE_16_SNORLAX\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BIRD_KEEPER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Pidgeotto\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Snorlax\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Eevee\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE16_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16_NORTH_ENTRANCE_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 27,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16_NORTH_ENTRANCE_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16_NORTH_ENTRANCE_1F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 27,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16_NORTH_ENTRANCE_1F\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route16_EventScript_RouteSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 33,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route16_EventScript_CyclingRoadSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 31,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LEFTOVERS\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE16_LEFTOVERS\",\n      \"quantity\": 1,\n      \"underfoot\": true\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/Route16/scripts.inc",
    "content": ".set LOCALID_PIDGEOTTO_MASTER, 11\n.set LOCALID_SNORLAX_MASTER, 12\n.set LOCALID_EEVEE_MASTER, 13\n.set TRAINER, VAR_0x8009\n\nRoute16_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, Route16_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route16_OnTransition\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, Route16_OnWarp\n\t.byte 0\n\nRoute16_OnResume::\n\tcall_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, Route16_EventScript_RemoveSnorlax\n\tend\n\nRoute16_EventScript_RemoveSnorlax::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return\n\tremoveobject VAR_LAST_TALKED\n\treturn\n\nRoute16_OnTransition::\n\tcall_if_set FLAG_WOKE_UP_ROUTE_16_SNORLAX, Route16_EventScript_HideSnorlax\n\tcall_if_unset FLAG_WOKE_UP_ROUTE_16_SNORLAX, Route16_EventScript_TryShowSnorlax\n\tcall_if_eq VAR_MAP_SCENE_ROUTE16, 1, Route16_OnTransitionCyclingRoad\n\tgoto Route16_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nRoute16_OnTransitionCyclingRoad::\n\tsetflag FLAG_SYS_ON_CYCLING_ROAD\n\treturn\n\nRoute16_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_PIDGEOTTO\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route16_MapScript_PidgeottoMasterMovementType\n\tsetvar TRAINER, MASTER_SNORLAX\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route16_MapScript_SnorlaxMasterMovementType\n\tsetvar TRAINER, MASTER_EEVEE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route16_MapScript_EeveeMasterMovementType\n\tend\n\nRoute16_MapScript_PidgeottoMasterMovementType::\n\tsetobjectmovementtype LOCALID_PIDGEOTTO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\t\nRoute16_MapScript_SnorlaxMasterMovementType::\n\tsetobjectmovementtype LOCALID_SNORLAX_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute16_MapScript_EeveeMasterMovementType::\n\tsetobjectmovementtype LOCALID_EEVEE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute16_EventScript_HideSnorlax::\n\tsetflag FLAG_HIDE_ROUTE_16_SNORLAX\n\treturn\n\nRoute16_EventScript_TryShowSnorlax::\n\tgoto_if_set FLAG_ROUTE_16_SNORLAX_RETURNED_TO_MOUNTAINS, EventScript_Return\n\tclearflag FLAG_HIDE_ROUTE_16_SNORLAX\n\treturn\n\nRoute16_OnWarp::\n\tmap_script_2 VAR_MAP_SCENE_ROUTE16, 1, Route16_OnWarpCyclingRoad\n\t.2byte 0\n\nRoute16_OnWarpCyclingRoad::\n\tspecial ForcePlayerOntoBike\n\tend\n\nRoute16_EventScript_Snorlax::\n\tlock\n\tfaceplayer\n\tgoto_if_unset FLAG_GOT_POKE_FLUTE, Route16_EventScript_SnorlaxNoPokeFlute\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tmsgbox Text_WantToUsePokeFlute, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Route16_EventScript_DontUsePokeFlute\n\tcall EventScript_AwakenSnorlax\n\tsetwildbattle SPECIES_SNORLAX, 30\n\twaitse\n\tplaymoncry SPECIES_SNORLAX, CRY_MODE_ENCOUNTER\n\tdelay 40\n\twaitmoncry\n\tsetflag FLAG_HIDE_ROUTE_16_SNORLAX\n\tsetflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tdowildbattle\n\tclearflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_WON, Route16_EventScript_FoughtSnorlax\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_RAN, Route16_EventScript_FoughtSnorlax\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, Route16_EventScript_FoughtSnorlax\n\tsetflag FLAG_WOKE_UP_ROUTE_16_SNORLAX\n\trelease\n\tend\n\nRoute16_EventScript_DontUsePokeFlute::\n\trelease\n\tend\n\nRoute16_EventScript_FoughtSnorlax::\n\tsetflag FLAG_ROUTE_16_SNORLAX_RETURNED_TO_MOUNTAINS\n\tfadescreenswapbuffers FADE_TO_BLACK\n    removeobject VAR_LAST_TALKED\n    fadescreenswapbuffers FADE_FROM_BLACK\n\tmsgbox Text_SnorlaxReturnedToMountains\n\trelease\n\tend\n\nRoute16_EventScript_SnorlaxNoPokeFlute::\n\tmsgbox Route16_Text_MonSprawledOutInSlumber\n\trelease\n\tend\n\nRoute16_EventScript_CyclingRoadSign::\n\tmsgbox Route16_Text_CyclingRoadSign, MSGBOX_SIGN\n\tend\n\nRoute16_EventScript_RouteSign::\n\tmsgbox Route16_Text_RouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route16/text.inc",
    "content": "Route16_Text_LaoIntro::\n    .string \"What do you want?$\"\n\nRoute16_Text_LaoDefeat::\n    .string \"Don't you dare laugh!$\"\n\nRoute16_Text_LaoPostBattle::\n    .string \"We like just hanging here.\\n\"\n    .string \"What's it to you?$\"\n\nRoute16_Text_KojiIntro::\n    .string \"Nice BIKE!\\n\"\n    .string \"Hand it over!$\"\n\nRoute16_Text_KojiDefeat::\n    .string \"Knockout!$\"\n\nRoute16_Text_KojiPostBattle::\n    .string \"Forget it, who needs your BIKE!$\"\n\nRoute16_Text_LukeIntro::\n    .string \"Come out and play, little mouse!$\"\n\nRoute16_Text_LukeDefeat::\n    .string \"You little rat!$\"\n\nRoute16_Text_LukePostBattle::\n    .string \"I hate losing!\\n\"\n    .string \"Get out of my face!$\"\n\nRoute16_Text_HideoIntro::\n    .string \"Hey, you just bumped me!$\"\n\nRoute16_Text_HideoDefeat::\n    .string \"Kaboom!$\"\n\nRoute16_Text_HideoPostBattle::\n    .string \"We'll always be hanging around here\\n\"\n    .string \"even if you don't like it.\\p\"\n    .string \"You can detour to VERMILION from\\n\"\n    .string \"FUCHSIA going along the coast.$\"\n\nRoute16_Text_CamronIntro::\n    .string \"I'm feeling hungry and mean!\\n\"\n    .string \"I need a punching bag!$\"\n\nRoute16_Text_CamronDefeat::\n    .string \"Bad, bad, bad!$\"\n\nRoute16_Text_CamronPostBattle::\n    .string \"If I'm going to have POKéMON, they\\n\"\n    .string \"may as well be ferocious.\\p\"\n    .string \"I'd use them to leave my enemies\\n\"\n    .string \"in tatters.$\"\n\nRoute16_Text_RubenIntro::\n    .string \"Hey, there!\\n\"\n    .string \"Let's have ourselves a good time!$\"\n\nRoute16_Text_RubenDefeat::\n    .string \"Don't make me mad!$\"\n\nRoute16_Text_RubenPostBattle::\n    .string \"I get my kicks by harassing people\\n\"\n    .string \"with my stinking POKéMON.\\p\"\n    .string \"They're great for startling people.\\n\"\n    .string \"And, they bite, too.$\"\n\nRoute16_Text_MonSprawledOutInSlumber::\n    .string \"A POKéMON is sprawled out in\\n\"\n    .string \"a deep and comfortable slumber.$\"\n\nRoute16_Text_CyclingRoadSign::\n    .string \"Enjoy the slope!\\n\"\n    .string \"CYCLING ROAD$\"\n\nRoute16_Text_RouteSign::\n    .string \"ROUTE 16\\n\"\n    .string \"CELADON CITY - FUCHSIA CITY$\"\n\nRoute16_Text_JedIntro::\n    .string \"JED: Our love knows no bounds.\\n\"\n    .string \"We're in love and we show it!$\"\n\nRoute16_Text_JedDefeat::\n    .string \"JED: Oh, no!\\n\"\n    .string \"My love has seen me as a loser!$\"\n\nRoute16_Text_JedPostBattle::\n    .string \"JED: Listen, LEA.\\n\"\n    .string \"You need to focus less on me.$\"\n\nRoute16_Text_JedNotEnoughMons::\n    .string \"JED: You have just one POKéMON?\\n\"\n    .string \"Is there no love in your heart?$\"\n\nRoute16_Text_LeaIntro::\n    .string \"LEA: Sometimes, the intensity of\\n\"\n    .string \"our love scares me.$\"\n\nRoute16_Text_LeaDefeat::\n    .string \"LEA: Ohh! But JED looks cool\\n\"\n    .string \"even in a loss!$\"\n\nRoute16_Text_LeaPostBattle::\n    .string \"LEA: Ehehe, I'm sorry.\\n\"\n    .string \"JED is so cool.$\"\n\nRoute16_Text_LeaNotEnoughMons::\n    .string \"LEA: Oh, you don't have two\\n\"\n    .string \"POKéMON with you?\\p\"\n    .string \"Doesn't it feel lonely for you or\\n\"\n    .string \"your POKéMON?$\"\n"
  },
  {
    "path": "data/maps/Route16_House/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE16_HOUSE\",\n  \"name\": \"Route16_House\",\n  \"layout\": \"LAYOUT_HOUSE1\",\n  \"music\": \"MUS_CELADON\",\n  \"region_map_section\": \"MAPSEC_ROUTE_16\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route16_House_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FEAROW\",\n      \"x\": 9,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route16_House_EventScript_Fearow\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route16_House/scripts.inc",
    "content": "Route16_House_MapScripts::\n\t.byte 0\n\nRoute16_House_EventScript_Woman::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_HM02, Route16_House_EventScript_AlreadyGotHM02\n\tmsgbox Route16_House_Text_FoundMySecretRetreat\n\tcheckitemspace ITEM_HM02\n\tgoto_if_eq VAR_RESULT, FALSE, Route16_House_EventScript_NoRoomForHM02\n\tgiveitem_msg Route16_House_Text_ReceivedHM02FromGirl, ITEM_HM02\n\tmsgbox Route16_House_Text_ExplainHM02\n\tsetflag FLAG_GOT_HM02\n\trelease\n\tend\n\nRoute16_House_EventScript_NoRoomForHM02::\n\tmsgbox Route16_House_Text_DontHaveAnyRoomForThis\n\trelease\n\tend\n\nRoute16_House_EventScript_AlreadyGotHM02::\n\tmsgbox Route16_House_Text_ExplainHM02\n\trelease\n\tend\n\nRoute16_House_EventScript_Fearow::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_FEAROW, CRY_MODE_NORMAL\n\tmsgbox Route16_House_Text_Fearow\n\twaitmoncry\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/Route16_House/text.inc",
    "content": "Route16_House_Text_FoundMySecretRetreat::\n    .string \"Oh, dear.\\n\"\n    .string \"You've found my secret retreat.\\p\"\n    .string \"Please don't tell anyone I'm here.\\n\"\n    .string \"I'll make it up to you with this!$\"\n\nRoute16_House_Text_ReceivedHM02FromGirl::\n    .string \"{PLAYER} received HM02\\n\"\n    .string \"from the girl.$\"\n\nRoute16_House_Text_ExplainHM02::\n    .string \"HM02 is FLY.\\n\"\n    .string \"It's a wonderfully convenient move.\\p\"\n    .string \"Please, put it to good use.$\"\n\nRoute16_House_Text_DontHaveAnyRoomForThis::\n    .string \"You don't have any room for this.$\"\n\nRoute16_House_Text_Fearow::\n    .string \"FEAROW: Kyueen!$\"\n\n"
  },
  {
    "path": "data/maps/Route16_NorthEntrance_1F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE16_NORTH_ENTRANCE_1F\",\n  \"name\": \"Route16_NorthEntrance_1F\",\n  \"layout\": \"LAYOUT_ROUTE16_NORTH_ENTRANCE_1F\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_16\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route16_NorthEntrance_1F_EventScript_Guard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route16_NorthEntrance_1F_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Electrode\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16_NORTH_ENTRANCE_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE16\",\n      \"var_value\": \"1\",\n      \"script\": \"EventScript_SetExitingCyclingRoad\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 2,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE16\",\n      \"var_value\": \"0\",\n      \"script\": \"EventScript_SetEnteringCyclingRoad\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerMidTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 1,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE16\",\n      \"var_value\": \"0\",\n      \"script\": \"EventScript_SetEnteringCyclingRoad\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 1,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE16\",\n      \"var_value\": \"0\",\n      \"script\": \"EventScript_SetEnteringCyclingRoad\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE16\",\n      \"var_value\": \"1\",\n      \"script\": \"EventScript_SetExitingCyclingRoad\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE16\",\n      \"var_value\": \"1\",\n      \"script\": \"EventScript_SetExitingCyclingRoad\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerMidBottom\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"Route16_NorthEntrance_1F_EventScript_NeedBikeTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route16_NorthEntrance_1F/scripts.inc",
    "content": ".set LOCALID_ELECTRODE_MASTER, 3\n.set TRAINER, VAR_0x8009\n\nRoute16_NorthEntrance_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route16_NorthEntrance_1F_OnTransition\n\t.byte 0\n\nRoute16_NorthEntrance_1F_OnTransition::\n\tclearflag FLAG_SYS_ON_CYCLING_ROAD\n\tcall_if_set FLAG_GOT_BICYCLE, Route16_NorthEntrance_1F_EventScript_DisableNeedBikeTrigger\n\tgoto Route16_NorthEntrance_1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nRoute16_NorthEntrance_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_ELECTRODE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route16_NorthEntrance_1F_MapScript_ElectrodeMasterMovementType\n\tend\n\nRoute16_NorthEntrance_1F_MapScript_ElectrodeMasterMovementType::\n\tsetobjectmovementtype LOCALID_ELECTRODE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute16_NorthEntrance_1F_EventScript_DisableNeedBikeTrigger::\n\tsetvar VAR_TEMP_1, 1\n\treturn\n\nRoute16_NorthEntrance_1F_EventScript_Guard::\n\tmsgbox Route16_NorthEntrance_1F_Text_CyclingRoadIsDownhillCourse, MSGBOX_NPC\n\tend\n\nRoute16_NorthEntrance_1F_EventScript_NeedBikeTriggerTop::\n\tlockall\n\tsetvar VAR_0x8008, 0\n\tgoto Route16_NorthEntrance_1F_EventScript_NeedBikeTrigger\n\tend\n\nRoute16_NorthEntrance_1F_EventScript_NeedBikeTriggerMidTop::\n\tlockall\n\tsetvar VAR_0x8008, 1\n\tgoto Route16_NorthEntrance_1F_EventScript_NeedBikeTrigger\n\tend\n\nRoute16_NorthEntrance_1F_EventScript_NeedBikeTriggerMid::\n\tlockall\n\tsetvar VAR_0x8008, 2\n\tgoto Route16_NorthEntrance_1F_EventScript_NeedBikeTrigger\n\tend\n\nRoute16_NorthEntrance_1F_EventScript_NeedBikeTriggerMidBottom::\n\tlockall\n\tsetvar VAR_0x8008, 3\n\tgoto Route16_NorthEntrance_1F_EventScript_NeedBikeTrigger\n\tend\n\nRoute16_NorthEntrance_1F_EventScript_NeedBikeTriggerBottom::\n\tlockall\n\tsetvar VAR_0x8008, 4\n\tgoto Route16_NorthEntrance_1F_EventScript_NeedBikeTrigger\n\tend\n\nRoute16_NorthEntrance_1F_EventScript_NeedBikeTrigger::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox Route16_NorthEntrance_1F_Text_ExcuseMeWaitUp\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tdelay 20\n\tcall_if_eq VAR_0x8008, 1, Route16_NorthEntrance_1F_EventScript_PlayerWalkToCounterMidTop\n\tcall_if_eq VAR_0x8008, 2, Route16_NorthEntrance_1F_EventScript_PlayerWalkToCounterMid\n\tcall_if_eq VAR_0x8008, 3, Route16_NorthEntrance_1F_EventScript_PlayerWalkToCounterMidBottom\n\tcall_if_eq VAR_0x8008, 4, Route16_NorthEntrance_1F_EventScript_PlayerWalkToCounterBottom\n\tmsgbox Route16_NorthEntrance_1F_Text_NoPedestriansOnCyclingRoad\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route16_NorthEntrance_1F_Movement_WalkRight\n\twaitmovement 0\n\treleaseall\n\tend\n\nRoute16_NorthEntrance_1F_EventScript_PlayerWalkToCounterMidTop::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route16_NorthEntrance_1F_Movement_WalkUp\n\twaitmovement 0\n\treturn\n\nRoute16_NorthEntrance_1F_EventScript_PlayerWalkToCounterMid::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route16_NorthEntrance_1F_Movement_WalkUp2\n\twaitmovement 0\n\treturn\n\nRoute16_NorthEntrance_1F_EventScript_PlayerWalkToCounterMidBottom::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route16_NorthEntrance_1F_Movement_WalkUp3\n\twaitmovement 0\n\treturn\n\nRoute16_NorthEntrance_1F_EventScript_PlayerWalkToCounterBottom::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route16_NorthEntrance_1F_Movement_WalkUp4\n\twaitmovement 0\n\treturn\n\nRoute16_NorthEntrance_1F_Movement_WalkUp::\n\twalk_up\n\tstep_end\n\nRoute16_NorthEntrance_1F_Movement_WalkUp2::\n\twalk_up\n\twalk_up\n\tstep_end\n\nRoute16_NorthEntrance_1F_Movement_WalkUp3::\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nRoute16_NorthEntrance_1F_Movement_WalkUp4::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nRoute16_NorthEntrance_1F_Movement_WalkRight::\n\twalk_right\n\tstep_end\n\nRoute16_NorthEntrance_1F_EventScript_OldMan::\n\tmsgbox Route16_NorthEntrance_1F_Text_HowdYouGetInGoodEffort, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/Route16_NorthEntrance_1F/text.inc",
    "content": "Route16_NorthEntrance_1F_Text_NoPedestriansOnCyclingRoad::\n    .string \"No pedestrians are allowed on\\n\"\n    .string \"CYCLING ROAD!$\"\n\nRoute16_NorthEntrance_1F_Text_CyclingRoadIsDownhillCourse::\n    .string \"CYCLING ROAD is a downhill course\\n\"\n    .string \"by the sea. It's a great ride.$\"\n\nRoute16_NorthEntrance_1F_Text_ExcuseMeWaitUp::\n    .string \"Excuse me!\\n\"\n    .string \"Wait up, please!$\"\n\nRoute16_NorthEntrance_1F_Text_HowdYouGetInGoodEffort::\n    .string \"How'd you get in?\\n\"\n    .string \"Good effort!$\"\n\n"
  },
  {
    "path": "data/maps/Route16_NorthEntrance_2F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE16_NORTH_ENTRANCE_2F\",\n  \"name\": \"Route16_NorthEntrance_2F\",\n  \"layout\": \"LAYOUT_ENTRANCE_2F\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_16\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route16_NorthEntrance_2F_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route16_NorthEntrance_2F_EventScript_LittleGirl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route16_NorthEntrance_2F_EventScript_Aide\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Lickitung\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE16_NORTH_ENTRANCE_1F\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route16_NorthEntrance_2F_EventScript_LeftBinoculars\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route16_NorthEntrance_2F_EventScript_RightBinoculars\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route16_NorthEntrance_2F/scripts.inc",
    "content": ".equ REQUIRED_CAUGHT_MONS, 40\n.set LOCALID_LICKITUNG_MASTER, 4\n.set TRAINER, VAR_0x8009\n\nRoute16_NorthEntrance_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route16_NorthEntrance_2F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute16_NorthEntrance_2F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_LICKITUNG\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route16_NorthEntrance_2F_MapScript_LickitungMasterMovementType\n\tend\n\nRoute16_NorthEntrance_2F_MapScript_LickitungMasterMovementType::\n\tsetobjectmovementtype LOCALID_LICKITUNG_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute16_NorthEntrance_2F_EventScript_LittleBoy::\n\tmsgbox Route16_NorthEntrance_2F_Text_OnBikeRideWithGirlfriend, MSGBOX_NPC\n\tend\n\nRoute16_NorthEntrance_2F_EventScript_LittleGirl::\n\tmsgbox Route16_NorthEntrance_2F_Text_RidingTogetherOnNewBikes, MSGBOX_NPC\n\tend\n\nRoute16_NorthEntrance_2F_EventScript_LeftBinoculars::\n\tmsgbox Route16_NorthEntrance_2F_Text_ItsCeladonDeptStore, MSGBOX_SIGN\n\tend\n\nRoute16_NorthEntrance_2F_EventScript_RightBinoculars::\n\tmsgbox Route16_NorthEntrance_2F_Text_LongPathOverWater, MSGBOX_SIGN\n\tend\n\nRoute16_NorthEntrance_2F_EventScript_Aide::\n\tlock\n\tfaceplayer\n\tcall Route16_NorthEntrance_2F_EventScript_GetAideRequestInfo\n\tgoto_if_set FLAG_GOT_AMULET_COIN_FROM_OAKS_AIDE, Route16_NorthEntrance_2F_EventScript_AlreadyGotAmuletCoin\n\tmsgbox Route16_NorthEntrance_2F_Text_GiveAmuletCoinIfCaught40, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Aide_EventScript_DeclineCheckMons\n\tsetvar VAR_0x8004, 0\n\tspecialvar VAR_RESULT, GetPokedexCount\n\tbuffernumberstring STR_VAR_3, VAR_0x8006\n\tcall Route16_NorthEntrance_2F_EventScript_GetAideRequestInfo\n\tgoto_if_lt VAR_0x8006, REQUIRED_CAUGHT_MONS, Aide_EventScript_HaventCaughtEnough\n\tmsgbox Route16_NorthEntrance_2F_Text_GreatHereYouGo\n\tcheckitemspace ITEM_AMULET_COIN\n\tgoto_if_eq VAR_RESULT, FALSE, Aide_EventScript_NoRoomForItem\n\tgiveitem_msg Route16_NorthEntrance_2F_Text_ReceivedAmuletCoinFromAide, ITEM_AMULET_COIN\n\tsetflag FLAG_GOT_AMULET_COIN_FROM_OAKS_AIDE\n\tmsgbox Route16_NorthEntrance_2F_Text_ExplainAmuletCoin\n\trelease\n\tend\n\nRoute16_NorthEntrance_2F_EventScript_AlreadyGotAmuletCoin::\n\tmsgbox Route16_NorthEntrance_2F_Text_ExplainAmuletCoin\n\trelease\n\tend\n\nRoute16_NorthEntrance_2F_EventScript_GetAideRequestInfo::\n\tbuffernumberstring STR_VAR_1, REQUIRED_CAUGHT_MONS\n\tbufferitemname STR_VAR_2, ITEM_AMULET_COIN\n\treturn\n"
  },
  {
    "path": "data/maps/Route16_NorthEntrance_2F/text.inc",
    "content": "Route16_NorthEntrance_2F_Text_OnBikeRideWithGirlfriend::\n    .string \"I'm on a relaxing ride on my new\\n\"\n    .string \"bike with my girlfriend.$\"\n\nRoute16_NorthEntrance_2F_Text_RidingTogetherOnNewBikes::\n    .string \"We're going riding together on our\\n\"\n    .string \"new bikes.$\"\n\nRoute16_NorthEntrance_2F_Text_ItsCeladonDeptStore::\n    .string \"Let's see what the binoculars have\\n\"\n    .string \"to show…\\p\"\n    .string \"It's the CELADON DEPT. STORE!$\"\n\nRoute16_NorthEntrance_2F_Text_LongPathOverWater::\n    .string \"Let's see what the binoculars have\\n\"\n    .string \"to show…\\p\"\n    .string \"There's a long path over water far\\n\"\n    .string \"away.$\"\n\nRoute16_NorthEntrance_2F_Text_GiveAmuletCoinIfCaught40::\n    .string \"Hi! Remember me?\\n\"\n    .string \"I'm one of PROF. OAK's AIDES.\\p\"\n    .string \"If your POKéDEX has complete data\\n\"\n    .string \"on 40 species, I'm supposed to\\l\"\n    .string \"give you a reward.\\p\"\n    .string \"PROF. OAK entrusted me with an\\n\"\n    .string \"AMULET COIN for you.\\p\"\n    .string \"So, {PLAYER}, let me ask you.\\p\"\n    .string \"Have you gathered data on at least\\n\"\n    .string \"40 kinds of POKéMON?$\"\n\nRoute16_NorthEntrance_2F_Text_GreatHereYouGo::\n    .string \"Great! You have caught or owned\\n\"\n    .string \"{STR_VAR_3} kinds of POKéMON!\\p\"\n    .string \"Congratulations!\\n\"\n    .string \"Here you go!$\"\n\nRoute16_NorthEntrance_2F_Text_ReceivedAmuletCoinFromAide::\n    .string \"{PLAYER} received the AMULET COIN\\n\"\n    .string \"from the AIDE.$\"\n\nRoute16_NorthEntrance_2F_Text_ExplainAmuletCoin::\n    .string \"An AMULET COIN is an item to be\\n\"\n    .string \"held by a POKéMON.\\p\"\n    .string \"If the POKéMON appears in a winning\\n\"\n    .string \"battle, you will earn more money.$\"\n\n"
  },
  {
    "path": "data/maps/Route17/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE17\",\n  \"name\": \"Route17\",\n  \"layout\": \"LAYOUT_ROUTE17\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_17\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE16\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE18\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 6,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route17_EventScript_Virgil\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUE_BALL\",\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 5,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route17_EventScript_Isaiah\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUE_BALL\",\n      \"x\": 15,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route17_EventScript_Raul\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 5,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route17_EventScript_Nikolas\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 38,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"Route17_EventScript_Billy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUE_BALL\",\n      \"x\": 2,\n      \"y\": 61,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route17_EventScript_Jamal\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUE_BALL\",\n      \"x\": 21,\n      \"y\": 61,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route17_EventScript_Zeek\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUE_BALL\",\n      \"x\": 18,\n      \"y\": 94,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 5,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route17_EventScript_Corey\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 134,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP\",\n      \"movement_range_x\": 8,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route17_EventScript_William\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 116,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 5,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route17_EventScript_Jaxon\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 97,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route17_EventScript_RouteSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 83,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route17_EventScript_TrainerTips2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 68,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route17_EventScript_TrainerTips1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 53,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route17_EventScript_ItemsNotice\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 125,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route17_EventScript_BallsNotice\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 157,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route17_EventScript_CyclingRoadSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 18,\n      \"y\": 83,\n      \"elevation\": 3,\n      \"item\": \"ITEM_RARE_CANDY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE17_RARE_CANDY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 10,\n      \"y\": 53,\n      \"elevation\": 3,\n      \"item\": \"ITEM_FULL_RESTORE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE17_FULL_RESTORE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 4,\n      \"y\": 68,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PP_UP\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE17_PP_UP\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 4,\n      \"y\": 125,\n      \"elevation\": 3,\n      \"item\": \"ITEM_MAX_REVIVE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE17_MAX_REVIVE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 14,\n      \"y\": 157,\n      \"elevation\": 3,\n      \"item\": \"ITEM_MAX_ELIXIR\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE17_MAX_ELIXIR\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/Route17/scripts.inc",
    "content": "Route17_MapScripts::\n\t.byte 0\n\nRoute17_EventScript_ItemsNotice::\n\tmsgbox Route17_Text_WatchOutForDiscardedItems, MSGBOX_SIGN\n\tend\n\nRoute17_EventScript_TrainerTips1::\n\tmsgbox Route17_Text_SameSpeciesGrowDifferentRates, MSGBOX_SIGN\n\tend\n\nRoute17_EventScript_TrainerTips2::\n\tmsgbox Route17_Text_PressBToStayInPlace, MSGBOX_SIGN\n\tend\n\nRoute17_EventScript_RouteSign::\n\tmsgbox Route17_Text_RouteSign, MSGBOX_SIGN\n\tend\n\nRoute17_EventScript_BallsNotice::\n\tmsgbox Route17_Text_DontThrowGameThrowBalls, MSGBOX_SIGN\n\tend\n\nRoute17_EventScript_CyclingRoadSign::\n\tmsgbox Route17_Text_CyclingRoadSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route17/text.inc",
    "content": "Route17_Text_RaulIntro::\n    .string \"There's no getting rich quick in\\n\"\n    .string \"battling kids.$\"\n\nRoute17_Text_RaulDefeat::\n    .string \"Burned out!$\"\n\nRoute17_Text_RaulPostBattle::\n    .string \"You can find good stuff lying\\n\"\n    .string \"around on CYCLING ROAD.\\p\"\n    .string \"There's good money in picking them\\n\"\n    .string \"up and selling them.$\"\n\nRoute17_Text_IsaiahIntro::\n    .string \"I'm mighty proud of my bod, kiddo.\\n\"\n    .string \"Come on!$\"\n\nRoute17_Text_IsaiahDefeat::\n    .string \"Whoo!$\"\n\nRoute17_Text_IsaiahPostBattle::\n    .string \"I could belly-bump you outta\\n\"\n    .string \"here!$\"\n\nRoute17_Text_VirgilIntro::\n    .string \"You heading to FUCHSIA?$\"\n\nRoute17_Text_VirgilDefeat::\n    .string \"Crash and burn!$\"\n\nRoute17_Text_VirgilPostBattle::\n    .string \"I love racing downhill!$\"\n\nRoute17_Text_BillyIntro::\n    .string \"We're BIKERS!\\n\"\n    .string \"We rule the roads, man!$\"\n\nRoute17_Text_BillyDefeat::\n    .string \"Smoked!$\"\n\nRoute17_Text_BillyPostBattle::\n    .string \"Are you looking for adventure?$\"\n\nRoute17_Text_NikolasIntro::\n    .string \"Let VOLTORB electrify you!$\"\n\nRoute17_Text_NikolasDefeat::\n    .string \"Grounded out!$\"\n\nRoute17_Text_NikolasPostBattle::\n    .string \"I got my VOLTORB at the abandoned\\n\"\n    .string \"POWER PLANT.$\"\n\nRoute17_Text_ZeekIntro::\n    .string \"I leveled up my POKéMON, but it\\n\"\n    .string \"won't evolve. Why?$\"\n\nRoute17_Text_ZeekDefeat::\n    .string \"Why, you!$\"\n\nRoute17_Text_ZeekPostBattle::\n    .string \"Maybe some POKéMON need element\\n\"\n    .string \"STONES to evolve.$\"\n\nRoute17_Text_JamalIntro::\n    .string \"I need a little exercise!$\"\n\nRoute17_Text_JamalDefeat::\n    .string \"Whew!\\n\"\n    .string \"Good workout!$\"\n\nRoute17_Text_JamalPostBattle::\n    .string \"I'm sure I lost weight there!$\"\n\nRoute17_Text_CoreyIntro::\n    .string \"Be a rebel!$\"\n\nRoute17_Text_CoreyDefeat::\n    .string \"Aaaargh!$\"\n\nRoute17_Text_CoreyPostBattle::\n    .string \"Be ready to fight for your beliefs!$\"\n\nRoute17_Text_JaxonIntro::\n    .string \"Nice BIKE!\\n\"\n    .string \"How's it handle?$\"\n\nRoute17_Text_JaxonDefeat::\n    .string \"Shoot!$\"\n\nRoute17_Text_JaxonPostBattle::\n    .string \"The slope makes it hard to steer.$\"\n\nRoute17_Text_WilliamIntro::\n    .string \"Get lost, kid!\\n\"\n    .string \"I'm bushed!$\"\n\nRoute17_Text_WilliamDefeat::\n    .string \"Are you satisfied?$\"\n\nRoute17_Text_WilliamPostBattle::\n    .string \"I need to catch a few z's!$\"\n\nRoute17_Text_WatchOutForDiscardedItems::\n    .string \"It's a notice.\\p\"\n    .string \"Watch out for discarded items.$\"\n\nRoute17_Text_SameSpeciesGrowDifferentRates::\n    .string \"TRAINER TIPS\\p\"\n    .string \"All POKéMON are unique.\\p\"\n    .string \"Even POKéMON of the same species\\n\"\n    .string \"and level grow at different rates.$\"\n\nRoute17_Text_PressBToStayInPlace::\n    .string \"TRAINER TIPS\\p\"\n    .string \"Press the B Button to stay in place\\n\"\n    .string \"while on a slope.$\"\n\nRoute17_Text_RouteSign::\n    .string \"ROUTE 17\\n\"\n    .string \"CELADON CITY - FUCHSIA CITY$\"\n\nRoute17_Text_DontThrowGameThrowBalls::\n    .string \"It's a notice!\\p\"\n    .string \"Don't throw the game, throw POKé\\n\"\n    .string \"BALLS instead!$\"\n\nRoute17_Text_CyclingRoadSign::\n    .string \"CYCLING ROAD\\n\"\n    .string \"Slope ends here!$\"\n\n"
  },
  {
    "path": "data/maps/Route18/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE18\",\n  \"name\": \"Route18\",\n  \"layout\": \"LAYOUT_ROUTE18\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_18\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE17\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": -10,\n      \"map\": \"MAP_FUCHSIA_CITY\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 46,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route18_EventScript_Jacob\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 41,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route18_EventScript_Ramiro\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 39,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"6\",\n      \"script\": \"Route18_EventScript_Wilton\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 49,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Caterpie\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BIRD_KEEPER\",\n      \"in_connection\": false,\n      \"x\": 39,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Fearow\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 46,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Rhyhorn\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 41,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE18_EAST_ENTRANCE_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 48,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE18_EAST_ENTRANCE_1F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 37,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route18_EventScript_CyclingRoadSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 52,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route18_EventScript_RouteSign\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/Route18/scripts.inc",
    "content": ".set LOCALID_CATERPIE_MASTER, 4\n.set LOCALID_FEAROW_MASTER, 5\n.set LOCALID_RHYHORN_MASTER, 6\n.set TRAINER, VAR_0x8009\n\nRoute18_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route18_OnTransition\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, Route18_OnWarp\n\t.byte 0\n\nRoute18_OnTransition::\n\tcompare VAR_MAP_SCENE_ROUTE16, 1\n\tcall_if_eq Route18_OnTransitionCyclingRoad\n\tgoto Route18_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nRoute18_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_CATERPIE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route18_MapScript_CaterpieMasterMovementType\n\tsetvar TRAINER, MASTER_FEAROW\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route18_MapScript_FearowMasterMovementType\n\tsetvar TRAINER, MASTER_RHYHORN\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route18_MapScript_RhyhornMasterMovementType\n\tend\n\nRoute18_MapScript_CaterpieMasterMovementType::\n\tsetobjectmovementtype LOCALID_CATERPIE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\t\nRoute18_MapScript_FearowMasterMovementType::\n\tsetobjectmovementtype LOCALID_FEAROW_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute18_MapScript_RhyhornMasterMovementType::\n\tsetobjectmovementtype LOCALID_RHYHORN_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute18_OnTransitionCyclingRoad::\n\tsetflag FLAG_SYS_ON_CYCLING_ROAD\n\treturn\n\nRoute18_OnWarp::\n\tmap_script_2 VAR_MAP_SCENE_ROUTE16, 1, Route18_OnWarpCyclingRoad\n\t.2byte 0\n\nRoute18_OnWarpCyclingRoad::\n\tspecial ForcePlayerOntoBike\n\tend\n\nRoute18_EventScript_RouteSign::\n\tmsgbox Route18_Text_RouteSign, MSGBOX_SIGN\n\tend\n\nRoute18_EventScript_CyclingRoadSign::\n\tmsgbox Route18_Text_CyclingRoadSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route18/text.inc",
    "content": "Route18_Text_WiltonIntro::\n    .string \"I always check every grassy area\\n\"\n    .string \"for new POKéMON.$\"\n\nRoute18_Text_WiltonDefeat::\n    .string \"Tch!$\"\n\nRoute18_Text_WiltonPostBattle::\n    .string \"I wish I had a BIKE!$\"\n\nRoute18_Text_RamiroIntro::\n    .string \"Kurukkoo!\\n\"\n    .string \"How do you like my birdcall?$\"\n\nRoute18_Text_RamiroDefeat::\n    .string \"I had to bug you!$\"\n\nRoute18_Text_RamiroPostBattle::\n    .string \"I collect sea POKéMON on weekends\\n\"\n    .string \"because the sea is so close.$\"\n\nRoute18_Text_JacobIntro::\n    .string \"This is my turf!\\n\"\n    .string \"Get out of here!$\"\n\nRoute18_Text_JacobDefeat::\n    .string \"Darn!$\"\n\nRoute18_Text_JacobPostBattle::\n    .string \"This is my fave area for catching\\n\"\n    .string \"POKéMON.$\"\n\nRoute18_Text_RouteSign::\n    .string \"ROUTE 18\\n\"\n    .string \"CELADON CITY - FUCHSIA CITY$\"\n\nRoute18_Text_CyclingRoadSign::\n    .string \"CYCLING ROAD\\n\"\n    .string \"No pedestrians permitted!$\"\n\n"
  },
  {
    "path": "data/maps/Route18_EastEntrance_1F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE18_EAST_ENTRANCE_1F\",\n  \"name\": \"Route18_EastEntrance_1F\",\n  \"layout\": \"LAYOUT_ENTRANCE_1F\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_18\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route18_EastEntrance_1F_EventScript_Guard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Koffing\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE18\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE18\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE18_EAST_ENTRANCE_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE16\",\n      \"var_value\": \"0\",\n      \"script\": \"EventScript_SetEnteringCyclingRoad\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"Route18_EastEntrance_1F_EventScript_NeedBikeTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"Route18_EastEntrance_1F_EventScript_NeedBikeTriggerMidTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"Route18_EastEntrance_1F_EventScript_NeedBikeTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"Route18_EastEntrance_1F_EventScript_NeedBikeTriggerMidBottom\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"Route18_EastEntrance_1F_EventScript_NeedBikeTriggerBottom\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE16\",\n      \"var_value\": \"1\",\n      \"script\": \"EventScript_SetExitingCyclingRoad\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE16\",\n      \"var_value\": \"1\",\n      \"script\": \"EventScript_SetExitingCyclingRoad\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE16\",\n      \"var_value\": \"1\",\n      \"script\": \"EventScript_SetExitingCyclingRoad\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE16\",\n      \"var_value\": \"0\",\n      \"script\": \"EventScript_SetEnteringCyclingRoad\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 1,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE16\",\n      \"var_value\": \"0\",\n      \"script\": \"EventScript_SetEnteringCyclingRoad\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route18_EastEntrance_1F/scripts.inc",
    "content": ".set LOCALID_KOFFING_MASTER, 2\n.set TRAINER, VAR_0x8009\n\nRoute18_EastEntrance_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route18_EastEntrance_1F_OnTransition\n\t.byte 0\n\nRoute18_EastEntrance_1F_OnTransition::\n\tclearflag FLAG_SYS_ON_CYCLING_ROAD\n\tcall_if_set FLAG_GOT_BICYCLE, Route18_EastEntrance_1F_EventScript_DisableNeedBikeTrigger\n\tgoto Route18_EastEntrance_1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nRoute18_EastEntrance_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_KOFFING\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route18_EastEntrance_1F_MapScript_KoffingMasterMovementType\n\tend\n\nRoute18_EastEntrance_1F_MapScript_KoffingMasterMovementType::\n\tsetobjectmovementtype LOCALID_KOFFING_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute18_EastEntrance_1F_EventScript_DisableNeedBikeTrigger::\n\tsetvar VAR_TEMP_1, 1\n\treturn\n\nRoute18_EastEntrance_1F_EventScript_Guard::\n\tmsgbox Route18_EastEntrance_1F_Text_CyclingRoadAllUphillFromHere, MSGBOX_NPC\n\tend\n\nRoute18_EastEntrance_1F_EventScript_NeedBikeTriggerTop::\n\tlockall\n\tsetvar VAR_0x8008, 0\n\tgoto Route18_EastEntrance_1F_EventScript_NeedBikeTrigger\n\tend\n\nRoute18_EastEntrance_1F_EventScript_NeedBikeTriggerMidTop::\n\tlockall\n\tsetvar VAR_0x8008, 1\n\tgoto Route18_EastEntrance_1F_EventScript_NeedBikeTrigger\n\tend\n\nRoute18_EastEntrance_1F_EventScript_NeedBikeTriggerMid::\n\tlockall\n\tsetvar VAR_0x8008, 2\n\tgoto Route18_EastEntrance_1F_EventScript_NeedBikeTrigger\n\tend\n\nRoute18_EastEntrance_1F_EventScript_NeedBikeTriggerMidBottom::\n\tlockall\n\tsetvar VAR_0x8008, 3\n\tgoto Route18_EastEntrance_1F_EventScript_NeedBikeTrigger\n\tend\n\nRoute18_EastEntrance_1F_EventScript_NeedBikeTriggerBottom::\n\tlockall\n\tsetvar VAR_0x8008, 4\n\tgoto Route18_EastEntrance_1F_EventScript_NeedBikeTrigger\n\tend\n\nRoute18_EastEntrance_1F_EventScript_NeedBikeTrigger::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox Route18_EastEntrance_1F_Text_ExcuseMe\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tdelay 20\n\tcall_if_eq VAR_0x8008, 1, Route18_EastEntrance_1F_EventScript_PlayerWalkToCounterMidTop\n\tcall_if_eq VAR_0x8008, 2, Route18_EastEntrance_1F_EventScript_PlayerWalkToCounterMid\n\tcall_if_eq VAR_0x8008, 3, Route18_EastEntrance_1F_EventScript_PlayerWalkToCounterMidBottom\n\tcall_if_eq VAR_0x8008, 4, Route18_EastEntrance_1F_EventScript_PlayerWalkToCounterBottom\n\tmsgbox Route18_EastEntrance_1F_Text_NeedBicycleForCyclingRoad\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route18_EastEntrance_1F_Movement_WalkRight\n\twaitmovement 0\n\treleaseall\n\tend\n\nRoute18_EastEntrance_1F_EventScript_PlayerWalkToCounterMidTop::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route18_EastEntrance_1F_Movement_WalkUp\n\twaitmovement 0\n\treturn\n\nRoute18_EastEntrance_1F_EventScript_PlayerWalkToCounterMid::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route18_EastEntrance_1F_Movement_WalkUp2\n\twaitmovement 0\n\treturn\n\nRoute18_EastEntrance_1F_EventScript_PlayerWalkToCounterMidBottom::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route18_EastEntrance_1F_Movement_WalkUp3\n\twaitmovement 0\n\treturn\n\nRoute18_EastEntrance_1F_EventScript_PlayerWalkToCounterBottom::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route18_EastEntrance_1F_Movement_WalkUp4\n\twaitmovement 0\n\treturn\n\nRoute18_EastEntrance_1F_Movement_WalkUp::\n\twalk_up\n\tstep_end\n\nRoute18_EastEntrance_1F_Movement_WalkUp2::\n\twalk_up\n\twalk_up\n\tstep_end\n\nRoute18_EastEntrance_1F_Movement_WalkUp3::\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nRoute18_EastEntrance_1F_Movement_WalkUp4::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nRoute18_EastEntrance_1F_Movement_WalkRight::\n\twalk_right\n\tstep_end\n"
  },
  {
    "path": "data/maps/Route18_EastEntrance_1F/text.inc",
    "content": "Route18_EastEntrance_1F_Text_NeedBicycleForCyclingRoad::\n    .string \"You need a BICYCLE to go out on\\n\"\n    .string \"CYCLING ROAD!$\"\n\nRoute18_EastEntrance_1F_Text_CyclingRoadAllUphillFromHere::\n    .string \"CYCLING ROAD is all uphill from\\n\"\n    .string \"here.$\"\n\nRoute18_EastEntrance_1F_Text_ExcuseMe::\n    .string \"Excuse me!$\"\n\n"
  },
  {
    "path": "data/maps/Route18_EastEntrance_2F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE18_EAST_ENTRANCE_2F\",\n  \"name\": \"Route18_EastEntrance_2F\",\n  \"layout\": \"LAYOUT_ENTRANCE_2F\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_18\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route18_EastEntrance_2F_EventScript_Haden\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Pinsir\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE18_EAST_ENTRANCE_1F\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route18_EastEntrance_2F_EventScript_LeftBinoculars\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route18_EastEntrance_2F_EventScript_RightBinoculars\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route18_EastEntrance_2F/scripts.inc",
    "content": ".set LOCALID_PINSIR_MASTER, 2\n.set TRAINER, VAR_0x8009\n\nRoute18_EastEntrance_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route18_EastEntrance_2F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute18_EastEntrance_2F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_PINSIR\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route18_EastEntrance_2F_MapScript_PinsirMasterMovementType\n\tend\n\nRoute18_EastEntrance_2F_MapScript_PinsirMasterMovementType::\n\tsetobjectmovementtype LOCALID_PINSIR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute18_EastEntrance_2F_EventScript_LeftBinoculars::\n\tmsgbox Route18_EastEntrance_2F_Text_PalletTownInWest, MSGBOX_SIGN\n\tend\n\nRoute18_EastEntrance_2F_EventScript_RightBinoculars::\n\tmsgbox Route18_EastEntrance_2F_Text_PeopleSwimming, MSGBOX_SIGN\n\tend\n\nRoute18_EastEntrance_2F_EventScript_Haden::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8008, INGAME_TRADE_LICKITUNG\n\tcall EventScript_GetInGameTradeSpeciesInfo\n\tcallnative IsVersionFireRedToVarResult\n\tcompare VAR_RESULT, TRUE\n\tcall_if_eq Route18_EastEntrance_2F_EventScript_Haden_SetFRRequestedSpecies\n\tcallnative IsVersionFireRedToVarResult\n\tcompare VAR_RESULT, FALSE\n\tcall_if_eq Route18_EastEntrance_2F_EventScript_Haden_SetLGRequestedSpecies\n\tgoto_if_set FLAG_DID_MARC_TRADE, Route18_EastEntrance_2F_EventScript_AlreadyTraded\n\tmsgbox Trade_Text_LookingForMonWannaTradeForMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Route18_EastEntrance_2F_EventScript_DeclineTrade\n\tcall EventScript_ChooseMonForInGameTrade\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, Route18_EastEntrance_2F_EventScript_DeclineTrade\n\tcall EventScript_GetInGameTradeSpecies\n\tgoto_if_ne VAR_RESULT, VAR_0x8009, Route18_EastEntrance_2F_EventScript_NotRequestedMon\n\tcall EventScript_DoInGameTrade\n\tmsgbox Trade_Text_HeyThanks\n\tsetflag FLAG_DID_MARC_TRADE\n\trelease\n\tend\n\nRoute18_EastEntrance_2F_EventScript_Haden_SetFRRequestedSpecies::\n\tsetvar 0x8009, SPECIES_GOLDUCK\n\treturn\n\nRoute18_EastEntrance_2F_EventScript_Haden_SetLGRequestedSpecies::\n\tsetvar 0x8009, SPECIES_SLOWBRO\n\treturn\n\nRoute18_EastEntrance_2F_EventScript_DeclineTrade::\n\tmsgbox Trade_Text_AwwOhWell\n\trelease\n\tend\n\nRoute18_EastEntrance_2F_EventScript_NotRequestedMon::\n\tbufferspeciesname STR_VAR_1, VAR_0x8009\n\tmsgbox Trade_Text_WhatThatsNoMon\n\trelease\n\tend\n\nRoute18_EastEntrance_2F_EventScript_AlreadyTraded::\n\tmsgbox Trade_Text_IsntMyOldMonGreat\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/Route18_EastEntrance_2F/text.inc",
    "content": "Route18_EastEntrance_2F_Text_PalletTownInWest::\n    .string \"Let's see what the binoculars have\\n\"\n    .string \"to show…\\p\"\n    .string \"PALLET TOWN is in the west.$\"\n\nRoute18_EastEntrance_2F_Text_PeopleSwimming::\n    .string \"Let's see what the binoculars have\\n\"\n    .string \"to show…\\p\"\n    .string \"There are people swimming.$\"\n\n"
  },
  {
    "path": "data/maps/Route19/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE19\",\n  \"name\": \"Route19\",\n  \"layout\": \"LAYOUT_ROUTE19\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_19\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": -12,\n      \"map\": \"MAP_FUCHSIA_CITY\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": 40,\n      \"map\": \"MAP_ROUTE20\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_LAND\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 6,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route19_EventScript_Reece\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_LAND\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route19_EventScript_Richard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 17,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route19_EventScript_Tony\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 33,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN\",\n      \"movement_range_x\": 5,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route19_EventScript_Matthew\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 27,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route19_EventScript_Douglas\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 22,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"6\",\n      \"script\": \"Route19_EventScript_David\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 47,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route19_EventScript_Axle\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 14,\n      \"y\": 48,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route19_EventScript_Alice\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 12,\n      \"y\": 49,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route19_EventScript_Connie\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 9,\n      \"y\": 48,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route19_EventScript_Anya\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 8,\n      \"y\": 41,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route19_EventScript_Lia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TUBER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 41,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route19_EventScript_Luc\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Staryu\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Horsea\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 56,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Shellder\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route19_EventScript_RouteSign\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/Route19/scripts.inc",
    "content": ".set LOCALID_STARYU_MASTER, 13\n.set LOCALID_HORSEA_MASTER, 14\n.set LOCALID_SHELLDER_MASTER, 15\n.set TRAINER, VAR_0x8009\n\nRoute19_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route19_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute19_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_STARYU\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route19_MapScript_StaryuMasterMovementType\n\tsetvar TRAINER, MASTER_HORSEA\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route19_MapScript_HorseaMasterMovementType\n\tsetvar TRAINER, MASTER_SHELLDER\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route19_MapScript_ShellderMasterMovementType\n\tend\n\nRoute19_MapScript_StaryuMasterMovementType::\n\tsetobjectmovementtype LOCALID_STARYU_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\t\nRoute19_MapScript_HorseaMasterMovementType::\n\tsetobjectmovementtype LOCALID_HORSEA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM\n\treturn\n\nRoute19_MapScript_ShellderMasterMovementType::\n\tsetobjectmovementtype LOCALID_SHELLDER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM\n\treturn\n\nRoute19_EventScript_RouteSign::\n\tmsgbox Route19_Text_RouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route19/text.inc",
    "content": "Route19_Text_RichardIntro::\n    .string \"I have to exercise and warm up\\n\"\n    .string \"before going out for a swim.$\"\n\nRoute19_Text_RichardDefeat::\n    .string \"All warmed up!$\"\n\nRoute19_Text_RichardPostBattle::\n    .string \"Thanks, kid!\\n\"\n    .string \"I'm ready for a swim.$\"\n\nRoute19_Text_ReeceIntro::\n    .string \"Wait! Slow down!\\n\"\n    .string \"You'll have a heart attack!$\"\n\nRoute19_Text_ReeceDefeat::\n    .string \"Ooh!\\n\"\n    .string \"That's chilly!$\"\n\nRoute19_Text_ReecePostBattle::\n    .string \"Watch out for TENTACOOL.\\n\"\n    .string \"They sting so painfully.$\"\n\nRoute19_Text_MatthewIntro::\n    .string \"I love swimming!\\n\"\n    .string \"What about you?$\"\n\nRoute19_Text_MatthewDefeat::\n    .string \"Belly flop!$\"\n\nRoute19_Text_MatthewPostBattle::\n    .string \"I can beat even marine POKéMON\\n\"\n    .string \"at swimming.$\"\n\nRoute19_Text_DouglasIntro::\n    .string \"What's beyond the horizon?$\"\n\nRoute19_Text_DouglasDefeat::\n    .string \"Glub!$\"\n\nRoute19_Text_DouglasPostBattle::\n    .string \"I see a couple of islands over\\n\"\n    .string \"yonder!$\"\n\nRoute19_Text_DavidIntro::\n    .string \"I tried diving for POKéMON, but it\\n\"\n    .string \"was a no-go.$\"\n\nRoute19_Text_DavidDefeat::\n    .string \"Help!$\"\n\nRoute19_Text_DavidPostBattle::\n    .string \"I guess you have to fish for sea\\n\"\n    .string \"POKéMON.$\"\n\nRoute19_Text_TonyIntro::\n    .string \"I look at the sea to forget all\\n\"\n    .string \"the bad things that happened.$\"\n\nRoute19_Text_TonyDefeat::\n    .string \"Ooh!\\n\"\n    .string \"Traumatic!$\"\n\nRoute19_Text_TonyPostBattle::\n    .string \"I'm looking at the sea to forget\\n\"\n    .string \"the bad thing that happened!$\"\n\nRoute19_Text_AnyaIntro::\n    .string \"Oh, I just love your ride!\\n\"\n    .string \"Can I have it if I win?$\"\n\nRoute19_Text_AnyaDefeat::\n    .string \"Oh! I lost!$\"\n\nRoute19_Text_AnyaPostBattle::\n    .string \"It's still a long way to go to\\n\"\n    .string \"SEAFOAM ISLANDS…\\p\"\n    .string \"I want to go back to FUCHSIA…$\"\n\nRoute19_Text_AliceIntro::\n    .string \"Swimming's great!\\n\"\n    .string \"Sunburns aren't!$\"\n\nRoute19_Text_AliceDefeat::\n    .string \"Shocker!$\"\n\nRoute19_Text_AlicePostBattle::\n    .string \"My boyfriend wanted to swim to\\n\"\n    .string \"SEAFOAM ISLANDS.$\"\n\nRoute19_Text_AxleIntro::\n    .string \"Ahoy, there!\\n\"\n    .string \"These waters are treacherous!$\"\n\nRoute19_Text_AxleDefeat::\n    .string \"Ooh!\\n\"\n    .string \"Dangerous!$\"\n\nRoute19_Text_AxlePostBattle::\n    .string \"M-my legs! They cramped up!\\n\"\n    .string \"Glub, glub…$\"\n\nRoute19_Text_ConnieIntro::\n    .string \"I swam here with my friends…\\n\"\n    .string \"I'm tired…$\"\n\nRoute19_Text_ConnieDefeat::\n    .string \"I'm exhausted…$\"\n\nRoute19_Text_ConniePostBattle::\n    .string \"If I were to ride a POKéMON on\\n\"\n    .string \"the sea, I'd like a LAPRAS.\\p\"\n    .string \"LAPRAS is so big, I bet it\\n\"\n    .string \"would keep me dry on water.$\"\n\nRoute19_Text_RouteSign::\n    .string \"SEA ROUTE 19\\n\"\n    .string \"FUCHSIA CITY - SEAFOAM ISLANDS$\"\n\nRoute19_Text_LiaIntro::\n    .string \"LIA: I'm looking after my brother.\\n\"\n    .string \"He just became a TRAINER.$\"\n\nRoute19_Text_LiaDefeat::\n    .string \"LIA: That's no way to treat my\\n\"\n    .string \"little brother!$\"\n\nRoute19_Text_LiaPostBattle::\n    .string \"LIA: Do you have a younger\\n\"\n    .string \"brother?\\p\"\n    .string \"I hope you're teaching him all\\n\"\n    .string \"sorts of things.$\"\n\nRoute19_Text_LiaNotEnoughMons::\n    .string \"LIA: I want to battle together\\n\"\n    .string \"with my little brother.\\p\"\n    .string \"Don't you have two POKéMON?$\"\n\nRoute19_Text_LucIntro::\n    .string \"LUC: My big sis taught me how\\n\"\n    .string \"to swim and train POKéMON.$\"\n\nRoute19_Text_LucDefeat::\n    .string \"LUC: Oh, wow!\\n\"\n    .string \"Someone tougher than my big sis!$\"\n\nRoute19_Text_LucPostBattle::\n    .string \"LUC: My big sis is strong and nice.\\n\"\n    .string \"I think she's awesome!$\"\n\nRoute19_Text_LucNotEnoughMons::\n    .string \"LUC: I don't want to if I can't\\n\"\n    .string \"battle you with my big sis.\\p\"\n    .string \"Don't you have two POKéMON?$\"\n"
  },
  {
    "path": "data/maps/Route19_UnusedHouse/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE19_UNUSED_HOUSE\",\n  \"name\": \"Route19_UnusedHouse\",\n  \"layout\": \"LAYOUT_HOUSE2\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_19\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route19_UnusedHouse/scripts.inc",
    "content": "Route19_UnusedHouse_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/Route2/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE2\",\n  \"name\": \"Route2\",\n  \"layout\": \"LAYOUT_ROUTE2\",\n  \"music\": \"MUS_ROUTE1\",\n  \"region_map_section\": \"MAPSEC_ROUTE_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": -12,\n      \"map\": \"MAP_PEWTER_CITY\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": -12,\n      \"map\": \"MAP_VIRIDIAN_CITY\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 62,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_2_CUT_TREE_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 69,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_2_CUT_TREE_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_2_CUT_TREE_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_2_CUT_TREE_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 54,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route2_EventScript_ItemEther\",\n      \"flag\": \"FLAG_HIDE_ROUTE2_ETHER\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 64,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route2_EventScript_ItemParalyzeHeal\",\n      \"flag\": \"FLAG_HIDE_ROUTE2_PARALYZE_HEAL\"\n    },\n    {\n      \"type\": \"clone\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"x\": 6,\n      \"y\": 85,\n      \"target_local_id\": 8,\n      \"target_map\": \"MAP_VIRIDIAN_CITY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BIRD_KEEPER\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 71,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Pidgey\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 75,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Parasect\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 51,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DIGLETTS_CAVE_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 22,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE2_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 46,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_EAST_BUILDING\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_EAST_BUILDING\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_EAST_BUILDING\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 46,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_EAST_BUILDING\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 51,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route2_EventScript_DiglettsCaveSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 73,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route2_EventScript_RouteSign\"\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/Route2/scripts.inc",
    "content": ".set LOCALID_PIDGEY_MASTER, 8\n.set LOCALID_PARASECT_MASTER, 9\n.set TRAINER, VAR_0x8009\n\nRoute2_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, Route2_MapScript_FixLedgeForMasterTrainer\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route2_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute2_MapScript_FixLedgeForMasterTrainer::\n\tgoto_if_set FLAG_HIDE_MASTER_TRAINERS, EventScript_ReleaseEnd\n\tsetmetatile 2, 70, 0x2D7, 1\n\tend\n\nRoute2_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_PIDGEY\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route2_MapScript_PidgeyMasterMovementType\n\tsetvar TRAINER, MASTER_PARASECT\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route2_MapScript_ParasectMasterMovementType\n\tend\n\nRoute2_MapScript_PidgeyMasterMovementType::\n\tsetobjectmovementtype LOCALID_PIDGEY_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute2_MapScript_ParasectMasterMovementType::\n\tsetobjectmovementtype LOCALID_PARASECT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute2_EventScript_RouteSign::\n\tmsgbox Route2_Text_RouteSign, MSGBOX_SIGN\n\tend\n\nRoute2_EventScript_DiglettsCaveSign::\n\tmsgbox Route2_Text_DiglettsCave, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route2/text.inc",
    "content": "Route2_Text_RouteSign::\n    .string \"ROUTE 2\\n\"\n    .string \"VIRIDIAN CITY - PEWTER CITY$\"\n\nRoute2_Text_DiglettsCave::\n    .string \"DIGLETT'S CAVE$\"\n\n"
  },
  {
    "path": "data/maps/Route20/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE20\",\n  \"name\": \"Route20\",\n  \"layout\": \"LAYOUT_ROUTE20\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_20\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": 0,\n      \"map\": \"MAP_CINNABAR_ISLAND\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": -40,\n      \"map\": \"MAP_ROUTE19\"\n    },\n    {\n      \"direction\": \"dive\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE20_UNDERWATER\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 8,\n      \"y\": 11,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route20_EventScript_Melissa\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route20_EventScript_Missy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 34,\n      \"y\": 7,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route20_EventScript_Nora\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"x\": 43,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route20_EventScript_Roger\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 10,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP\",\n      \"movement_range_x\": 5,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route20_EventScript_Dean\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 73,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route20_EventScript_Irene\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 111,\n      \"y\": 9,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT\",\n      \"movement_range_x\": 5,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route20_EventScript_Barry\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 106,\n      \"y\": 11,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT\",\n      \"movement_range_x\": 5,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route20_EventScript_Darrin\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 93,\n      \"y\": 10,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"Route20_EventScript_Shirley\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 54,\n      \"y\": 11,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route20_EventScript_Tiffany\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 69,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route20_EventScript_Camper\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER\",\n      \"in_connection\": false,\n      \"x\": 82,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Blastoise\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 76,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Tentacool\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER\",\n      \"in_connection\": false,\n      \"x\": 63,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Cloyster\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Wartortle\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Tentacruel\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 60,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 72,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_1F\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 68,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route20_EventScript_SeafoamIslandsSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 64,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route20_EventScript_SeafoamIslandsSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 23,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"item\": \"ITEM_STARDUST\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE20_STARDUST\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/Route20/scripts.inc",
    "content": ".set LOCALID_BLASTOISE_MASTER, 12\n.set LOCALID_TENTACOOL_MASTER, 13\n.set LOCALID_CLOYSTER_MASTER, 14\n.set LOCALID_WARTORTLE_MASTER, 15\n.set LOCALID_TENTACRUEL_MASTER, 16\n.set TRAINER, VAR_0x8009\n\nRoute20_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route20_OnTransition\n\t.byte 0\n\nRoute20_OnTransition::\n\tcall_if_unset FLAG_STOPPED_SEAFOAM_B3F_CURRENT, Route20_EventScript_ResetSeafoamBouldersForB3F\n\tcall_if_unset FLAG_STOPPED_SEAFOAM_B4F_CURRENT, Route20_EventScript_ResetSeafoamBouldersForB4F\n\tgoto Route20_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nRoute20_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_BLASTOISE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route20_MapScript_BlastoiseMasterMovementType\n\tsetvar TRAINER, MASTER_TENTACOOL\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route20_MapScript_TentacoolMasterMovementType\n\tsetvar TRAINER, MASTER_CLOYSTER\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route20_MapScript_CloysterMasterMovementType\n\tsetvar TRAINER, MASTER_WARTORTLE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route20_MapScript_WartortleMasterMovementType\n\tsetvar TRAINER, MASTER_TENTACRUEL\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route20_MapScript_TentacruelMasterMovementType\n\tend\n\nRoute20_MapScript_BlastoiseMasterMovementType::\n\tsetobjectmovementtype LOCALID_BLASTOISE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM\n\treturn\n\nRoute20_MapScript_TentacoolMasterMovementType::\n\tsetobjectmovementtype LOCALID_TENTACOOL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute20_MapScript_CloysterMasterMovementType::\n\tsetobjectmovementtype LOCALID_CLOYSTER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM\n\treturn\n\nRoute20_MapScript_WartortleMasterMovementType::\n\tsetobjectmovementtype LOCALID_WARTORTLE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM\n\treturn\n\n\nRoute20_MapScript_TentacruelMasterMovementType::\n\tsetobjectmovementtype LOCALID_TENTACRUEL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute20_EventScript_ResetSeafoamBouldersForB3F::\n\tclearflag FLAG_HIDE_SEAFOAM_1F_BOULDER_1\n\tclearflag FLAG_HIDE_SEAFOAM_1F_BOULDER_2\n\tsetflag FLAG_HIDE_SEAFOAM_B1F_BOULDER_1\n\tsetflag FLAG_HIDE_SEAFOAM_B1F_BOULDER_2\n\tsetflag FLAG_HIDE_SEAFOAM_B2F_BOULDER_1\n\tsetflag FLAG_HIDE_SEAFOAM_B2F_BOULDER_2\n\tsetflag FLAG_HIDE_SEAFOAM_B3F_BOULDER_1\n\tsetflag FLAG_HIDE_SEAFOAM_B3F_BOULDER_2\n\treturn\n\nRoute20_EventScript_ResetSeafoamBouldersForB4F::\n\tclearflag FLAG_HIDE_SEAFOAM_B3F_BOULDER_3\n\tclearflag FLAG_HIDE_SEAFOAM_B3F_BOULDER_4\n\tclearflag FLAG_HIDE_SEAFOAM_B3F_BOULDER_5\n\tclearflag FLAG_HIDE_SEAFOAM_B3F_BOULDER_6\n\tsetflag FLAG_HIDE_SEAFOAM_B4F_BOULDER_1\n\tsetflag FLAG_HIDE_SEAFOAM_B4F_BOULDER_2\n\treturn\n\nRoute20_EventScript_SeafoamIslandsSign::\n\tmsgbox Route20_Text_SeafoamIslands, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route20/text.inc",
    "content": "Route20_Text_BarryIntro::\n    .string \"The water is shallow here.\\n\"\n    .string \"There are many people swimming.$\"\n\nRoute20_Text_BarryDefeat::\n    .string \"Splash!$\"\n\nRoute20_Text_BarryPostBattle::\n    .string \"I wish I could ride my POKéMON.\\n\"\n    .string \"I bet you're not tired.$\"\n\nRoute20_Text_ShirleyIntro::\n    .string \"SEAFOAM is a quiet getaway.\\n\"\n    .string \"I'm vacationing here.$\"\n\nRoute20_Text_ShirleyDefeat::\n    .string \"Quit it!$\"\n\nRoute20_Text_ShirleyPostBattle::\n    .string \"There's a huge cavern underneath\\n\"\n    .string \"this island.$\"\n\nRoute20_Text_TiffanyIntro::\n    .string \"I love floating with the fishes\\n\"\n    .string \"here among the waves.$\"\n\nRoute20_Text_TiffanyDefeat::\n    .string \"Yowch!$\"\n\nRoute20_Text_TiffanyPostBattle::\n    .string \"Want to float with me?$\"\n\nRoute20_Text_IreneIntro::\n    .string \"Are you on vacation, too?$\"\n\nRoute20_Text_IreneDefeat::\n    .string \"No mercy at all!$\"\n\nRoute20_Text_IrenePostBattle::\n    .string \"SEAFOAM used to be a single island\\n\"\n    .string \"in the distant past.$\"\n\nRoute20_Text_DeanIntro::\n    .string \"Check out my buff physique!$\"\n\nRoute20_Text_DeanDefeat::\n    .string \"Wimpy!$\"\n\nRoute20_Text_DeanPostBattle::\n    .string \"I should've been buffing up my\\n\"\n    .string \"POKéMON, not me!$\"\n\nRoute20_Text_DarrinIntro::\n    .string \"Why are you riding a POKéMON?\\n\"\n    .string \"Can't you swim?$\"\n\nRoute20_Text_DarrinDefeat::\n    .string \"Ouch!\\n\"\n    .string \"Torpedoed!$\"\n\nRoute20_Text_DarrinPostBattle::\n    .string \"Riding a POKéMON sure looks fun!$\"\n\nRoute20_Text_RogerIntro::\n    .string \"I rode my bird POKéMON here.$\"\n\nRoute20_Text_RogerDefeat::\n    .string \"Oh, no!\\n\"\n    .string \"Now what am I to do?$\"\n\nRoute20_Text_RogerPostBattle::\n    .string \"My birds are exhausted.\\n\"\n    .string \"They can't FLY me back!$\"\n\nRoute20_Text_NoraIntro::\n    .string \"My boyfriend gave me big pearls.$\"\n\nRoute20_Text_NoraDefeat::\n    .string \"Oh, no!\\n\"\n    .string \"My pearls were in them!$\"\n\nRoute20_Text_NoraPostBattle::\n    .string \"Will my pearls grow bigger inside\\n\"\n    .string \"CLOYSTER?$\"\n\nRoute20_Text_MissyIntro::\n    .string \"I swam here from CINNABAR ISLAND.\\n\"\n    .string \"It wasn't easy, I tell you.$\"\n\nRoute20_Text_MissyDefeat::\n    .string \"I'm so disappointed!$\"\n\nRoute20_Text_MissyPostBattle::\n    .string \"POKéMON have taken over an\\n\"\n    .string \"abandoned mansion on CINNABAR.\\p\"\n    .string \"They call it the POKéMON MANSION\\n\"\n    .string \"now.$\"\n\nRoute20_Text_MelissaIntro::\n    .string \"CINNABAR, in the west, has a LAB\\n\"\n    .string \"for POKéMON.\\p\"\n    .string \"My daddy works there.$\"\n\nRoute20_Text_MelissaDefeat::\n    .string \"Wait!\\n\"\n    .string \"You're supposed to wait!$\"\n\nRoute20_Text_MelissaPostBattle::\n    .string \"CINNABAR is a volcanic island.\\p\"\n    .string \"I heard it rose out of the sea\\n\"\n    .string \"when a volcano erupted.$\"\n\nRoute20_Text_SeafoamIslands::\n    .string \"SEAFOAM ISLANDS$\"\n\nRoute20_Text_MistyTrainsHere::\n    .string \"Strong TRAINERS and WATER POKéMON\\n\"\n    .string \"are common sights in these parts.\\p\"\n    .string \"They say that MISTY of the\\n\"\n    .string \"CERULEAN GYM trains here.$\"\n"
  },
  {
    "path": "data/maps/Route20_Underwater/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE20_UNDERWATER\",\n  \"name\": \"Route20_Underwater\",\n  \"layout\": \"LAYOUT_ROUTE20_UNDERWATER\",\n  \"music\": \"MUS_UNDERWATER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_20\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_UNDERWATER_BUBBLES\",\n  \"map_type\": \"MAP_TYPE_UNDERWATER\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"emerge\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE20\"\n    }\n  ],\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 67,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"item\": \"ITEM_BIG_PEARL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE20_UNDERWATER_BIG_PEARL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/Route20_Underwater/scripts.inc",
    "content": "Route20_Underwater_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/Route20_Underwater/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/Route21_North/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE21_NORTH\",\n  \"name\": \"Route21_North\",\n  \"layout\": \"LAYOUT_ROUTE21_NORTH\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_21\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_PALLET_TOWN\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE21_SOUTH\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route21_North_EventScript_Ronald\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route21_North_EventScript_Wade\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 44,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route21_North_EventScript_Spencer\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 14,\n      \"y\": 35,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route21_North_EventScript_Lil\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TUBER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 35,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route21_North_EventScript_Ian\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"clone\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"x\": 13,\n      \"y\": -3,\n      \"target_local_id\": 2,\n      \"target_map\": \"MAP_PALLET_TOWN\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Slowbro\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 17,\n      \"y\": 42,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PEARL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE21_NORTH_PEARL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/Route21_North/scripts.inc",
    "content": ".set LOCALID_SLOWBRO_MASTER, 7\n.set TRAINER, VAR_0x8009\n\nRoute21_North_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route21_North_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute21_North_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_SLOWBRO\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route21_North_MapScript_SlowbroMasterMovementType\n\tend\n\nRoute21_North_MapScript_SlowbroMasterMovementType::\n\tsetobjectmovementtype LOCALID_SLOWBRO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n"
  },
  {
    "path": "data/maps/Route21_North/text.inc",
    "content": "Route21_North_Text_RonaldIntro::\n\t.string \"You want to know if the fish are\\n\"\n\t.string \"biting?$\"\n\nRoute21_North_Text_RonaldDefeat::\n\t.string \"Dang!$\"\n\nRoute21_North_Text_RonaldPostBattle::\n\t.string \"I can't catch anything good.\\n\"\n\t.string \"Not one good POKéMON to be had!$\"\n\nRoute21_North_Text_WadeIntro::\n\t.string \"I got a big haul!\\n\"\n\t.string \"Wanna go for it?$\"\n\nRoute21_North_Text_WadeDefeat::\n\t.string \"Heheh, MAGIKARP just don't make\\n\"\n\t.string \"the grade, do they?$\"\n\nRoute21_North_Text_WadePostBattle::\n\t.string \"I seem to only catch MAGIKARP!$\"\n\nRoute21_North_Text_SpencerIntro::\n\t.string \"The sea cleanses my body and soul!$\"\n\nRoute21_North_Text_SpencerDefeat::\n\t.string \"Ayah!$\"\n\nRoute21_North_Text_SpencerPostBattle::\n\t.string \"The sea is great and all, but I\\n\"\n\t.string \"like the mountains, too.$\"\n"
  },
  {
    "path": "data/maps/Route21_South/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE21_SOUTH\",\n  \"name\": \"Route21_South\",\n  \"layout\": \"LAYOUT_ROUTE21_SOUTH\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_21\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE21_NORTH\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_CINNABAR_ISLAND\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route21_South_EventScript_Claude\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route21_South_EventScript_Nolan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 24,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route21_South_EventScript_Jack\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 38,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route21_South_EventScript_Jerome\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 29,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route21_South_EventScript_Roland\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Slowpoke\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Psyduck\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/Route21_South/scripts.inc",
    "content": ".set LOCALID_SLOWPOKE_MASTER, 6\n.set LOCALID_PSYDUCK_MASTER, 7\n.set TRAINER, VAR_0x8009\n\nRoute21_South_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route21_South_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute21_South_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_SLOWPOKE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route21_South_MapScript_SlowpokeMasterMovementType\n\tsetvar TRAINER, MASTER_PSYDUCK\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route21_South_MapScript_PsyduckMasterMovementType\n\tend\n\nRoute21_South_MapScript_SlowpokeMasterMovementType::\n\tsetobjectmovementtype LOCALID_SLOWPOKE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute21_South_MapScript_PsyduckMasterMovementType::\n\tsetobjectmovementtype LOCALID_PSYDUCK_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM\n\treturn\n"
  },
  {
    "path": "data/maps/Route21_South/text.inc",
    "content": "Route21_South_Text_JackIntro::\n\t.string \"I caught my POKéMON at sea.$\"\n\nRoute21_South_Text_JackDefeat::\n\t.string \"Diver!!\\n\"\n\t.string \"Down!!$\"\n\nRoute21_South_Text_JackPostBattle::\n\t.string \"Where'd you catch your POKéMON?$\"\n\nRoute21_South_Text_JeromeIntro::\n\t.string \"Right now, I'm in a triathlon meet.$\"\n\nRoute21_South_Text_JeromeDefeat::\n\t.string \"Pant…\\n\"\n\t.string \"Pant… Pant…$\"\n\nRoute21_South_Text_JeromePostBattle::\n\t.string \"I'm beat! But, I still have the\\n\"\n\t.string \"bike race and marathon left!$\"\n\nRoute21_South_Text_RolandIntro::\n\t.string \"Ahh!\\n\"\n\t.string \"Feel the sun and the wind!$\"\n\nRoute21_South_Text_RolandDefeat::\n\t.string \"Yow!\\n\"\n\t.string \"I lost!$\"\n\nRoute21_South_Text_RolandPostBattle::\n\t.string \"I'm sunburnt to a crisp!$\"\n\nRoute21_South_Text_ClaudeIntro::\n\t.string \"Hey, don't scare away the fish!$\"\n\nRoute21_South_Text_ClaudeDefeat::\n\t.string \"Sorry! I'm just so frustrated from\\n\"\n\t.string \"not catching anything.$\"\n\nRoute21_South_Text_ClaudePostBattle::\n\t.string \"Sheesh, I haven't caught a thing.\\n\"\n\t.string \"Could this place actually be a\\l\"\n\t.string \"giant pool or something?$\"\n\nRoute21_South_Text_NolanIntro::\n\t.string \"Keep me company till I get a hit.$\"\n\nRoute21_South_Text_NolanDefeat::\n\t.string \"That burned some time.$\"\n\nRoute21_South_Text_NolanPostBattle::\n\t.string \"Oh wait!\\n\"\n\t.string \"I got a bite! Yeah!$\"\n\nRoute21_North_Text_LilIntro::\n\t.string \"LIL: Huh? A battle?\\n\"\n\t.string \"IAN, can't you do it alone?$\"\n\nRoute21_North_Text_LilDefeat::\n\t.string \"LIL: Oh, see?\\n\"\n\t.string \"We lost. Happy now?$\"\n\nRoute21_North_Text_LilPostBattle::\n\t.string \"LIL: I'm tired.\\n\"\n\t.string \"Can't we go home already?$\"\n\nRoute21_North_Text_LilNotEnoughMons::\n\t.string \"LIL: Huh? A battle?\\n\"\n\t.string \"I can't be bothered to do it alone.\\l\"\n\t.string \"Bring two POKéMON, won't you?$\"\n\nRoute21_North_Text_IanIntro::\n\t.string \"IAN: My sis doesn't get enough\\n\"\n\t.string \"exercise, so I made her come.$\"\n\nRoute21_North_Text_IanDefeat::\n\t.string \"IAN: Awww, Sis!\\n\"\n\t.string \"Get it together!$\"\n\nRoute21_North_Text_IanPostBattle::\n\t.string \"IAN: Come on, Sis!\\p\"\n\t.string \"You're not going to lose weight\\n\"\n\t.string \"like this!$\"\n\nRoute21_North_Text_IanNotEnoughMons::\n\t.string \"IAN: We want a two-on-two battle.\\n\"\n\t.string \"So can you bring two POKéMON?$\"\n"
  },
  {
    "path": "data/maps/Route22/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE22\",\n  \"name\": \"Route22\",\n  \"layout\": \"LAYOUT_ROUTE22\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_22\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE23\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": -10,\n      \"map\": \"MAP_VIRIDIAN_CITY\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLUE\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_ROUTE_22_RIVAL\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE22_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE22_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 33,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE22\",\n      \"var_value\": \"1\",\n      \"script\": \"Route22_EventScript_EarlyRivalTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 33,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE22\",\n      \"var_value\": \"1\",\n      \"script\": \"Route22_EventScript_EarlyRivalTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 33,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE22\",\n      \"var_value\": \"1\",\n      \"script\": \"Route22_EventScript_EarlyRivalTriggerBottom\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 33,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE22\",\n      \"var_value\": \"3\",\n      \"script\": \"Route22_EventScript_LateRivalTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 33,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE22\",\n      \"var_value\": \"3\",\n      \"script\": \"Route22_EventScript_LateRivalTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 33,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE22\",\n      \"var_value\": \"3\",\n      \"script\": \"Route22_EventScript_LateRivalTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route22_EventScript_LeagueGateSign\"\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/Route22/scripts.inc",
    "content": ".set LOCALID_RIVAL, 1\n\nRoute22_MapScripts::\n\t.byte 0\n\nRoute22_EventScript_EarlyRivalTriggerTop::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto Route22_EventScript_EarlyRival\n\tend\n\nRoute22_EventScript_EarlyRivalTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tsetobjectxyperm LOCALID_RIVAL, 25, 5\n\tgoto Route22_EventScript_EarlyRival\n\tend\n\nRoute22_EventScript_EarlyRivalTriggerBottom::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tsetobjectxyperm LOCALID_RIVAL, 25, 5\n\tgoto Route22_EventScript_EarlyRival\n\tend\n\nRoute22_EventScript_EarlyRival::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\taddobject LOCALID_RIVAL\n\tcall_if_eq VAR_TEMP_1, 0, Route22_EventScript_EarlyRivalApproach\n\tcall_if_eq VAR_TEMP_1, 1, Route22_EventScript_EarlyRivalApproach\n\tcall_if_eq VAR_TEMP_1, 2, Route22_EventScript_EarlyRivalApproachBottom\n\tdelay 6\n\tmsgbox Route22_Text_EarlyRivalIntro\n\tcall_if_eq VAR_STARTER_MON, 2, Route22_EventScript_EarlyRivalSquirtle\n\tcall_if_eq VAR_STARTER_MON, 1, Route22_EventScript_EarlyRivalBulbasaur\n\tcall_if_eq VAR_STARTER_MON, 0, Route22_EventScript_EarlyRivalCharmander\n\tmsgbox Route22_Text_EarlyRivalPostBattle\n\tclosemessage\n\tdelay 10\n\tplaybgm MUS_RIVAL_EXIT, 0\n\tcall_if_eq VAR_TEMP_1, 0, Route22_EventScript_EarlyRivalExit\n\tcall_if_eq VAR_TEMP_1, 1, Route22_EventScript_EarlyRivalExit\n\tcall_if_eq VAR_TEMP_1, 2, Route22_EventScript_EarlyRivalExitBottom\n\tfadedefaultbgm\n\tremoveobject LOCALID_RIVAL\n\tsetvar VAR_MAP_SCENE_ROUTE22, 2\n\treleaseall\n\tend\n\nRoute22_EventScript_EarlyRivalApproach::\n\tapplymovement LOCALID_RIVAL, Route22_Movement_RivalApproach\n\twaitmovement 0\n\treturn\n\nRoute22_EventScript_EarlyRivalApproachBottom::\n\tapplymovement LOCALID_RIVAL, Route22_Movement_RivalApproachBottom\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route22_Movement_PlayerFaceRival\n\twaitmovement 0\n\treturn\n\nRoute22_EventScript_EarlyRivalSquirtle::\n\ttrainerbattle_earlyrival TRAINER_RIVAL_ROUTE22_EARLY_SQUIRTLE, 0, Route22_Text_EarlyRivalDefeat, Text_RivalVictory\n\treturn\n\nRoute22_EventScript_EarlyRivalBulbasaur::\n\ttrainerbattle_earlyrival TRAINER_RIVAL_ROUTE22_EARLY_BULBASAUR, 0, Route22_Text_EarlyRivalDefeat, Text_RivalVictory\n\treturn\n\nRoute22_EventScript_EarlyRivalCharmander::\n\ttrainerbattle_earlyrival TRAINER_RIVAL_ROUTE22_EARLY_CHARMANDER, 0, Route22_Text_EarlyRivalDefeat, Text_RivalVictory\n\treturn\n\nRoute22_EventScript_EarlyRivalExit::\n\tapplymovement LOCALID_RIVAL, Route22_Movement_EarlyRivalExit\n\twaitmovement 0\n\treturn\n\nRoute22_EventScript_EarlyRivalExitBottom::\n\tapplymovement LOCALID_RIVAL, Route22_Movement_EarlyRivalExitBottom\n\twaitmovement 0\n\treturn\n\nRoute22_Movement_UnusedRivalExit::\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\tstep_end\n\nRoute22_Movement_EarlyRivalExit::\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nRoute22_Movement_EarlyRivalExitBottom::\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nRoute22_Movement_RivalApproach::\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\tstep_end\n\nRoute22_Movement_RivalApproachBottom::\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_down\n\tstep_end\n\nRoute22_Movement_PlayerFaceRival::\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_8\n\twalk_in_place_faster_up\n\tstep_end\n\nRoute22_EventScript_LateRivalTriggerTop::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto Route22_EventScript_LateRival\n\tend\n\nRoute22_EventScript_LateRivalTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tsetobjectxyperm LOCALID_RIVAL, 25, 5\n\tgoto Route22_EventScript_LateRival\n\tend\n\nRoute22_EventScript_LateRivalTriggerBottom::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tsetobjectxyperm LOCALID_RIVAL, 25, 5\n\tgoto Route22_EventScript_LateRival\n\tend\n\nRoute22_EventScript_LateRival::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\taddobject LOCALID_RIVAL\n\tcall_if_eq VAR_TEMP_1, 0, Route22_EventScript_LateRivalApproach\n\tcall_if_eq VAR_TEMP_1, 1, Route22_EventScript_LateRivalApproach\n\tcall_if_eq VAR_TEMP_1, 2, Route22_EventScript_LateRivalApproachBottom\n\tmsgbox Route22_Text_LateRivalIntro\n\tsetvar VAR_LAST_TALKED, LOCALID_RIVAL\n\tcall_if_eq VAR_STARTER_MON, 2, Route22_EventScript_LateRivalSquirtle\n\tcall_if_eq VAR_STARTER_MON, 1, Route22_EventScript_LateRivalBulbasaur\n\tcall_if_eq VAR_STARTER_MON, 0, Route22_EventScript_LateRivalCharmander\n\tmsgbox Route22_Text_LateRivalPostBattle\n\tclosemessage\n\tdelay 10\n\tplaybgm MUS_RIVAL_EXIT, 0\n\tapplymovement LOCALID_RIVAL, Route22_Movement_LateRivalExit\n\twaitmovement 0\n\tfadedefaultbgm\n\tremoveobject LOCALID_RIVAL\n\tsetvar VAR_MAP_SCENE_ROUTE22, 4\n\treleaseall\n\tend\n\nRoute22_EventScript_LateRivalApproach::\n\tapplymovement LOCALID_RIVAL, Route22_Movement_RivalApproach\n\twaitmovement 0\n\treturn\n\nRoute22_EventScript_LateRivalApproachBottom::\n\tapplymovement LOCALID_RIVAL, Route22_Movement_RivalApproachBottom\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route22_Movement_PlayerFaceRival\n\twaitmovement 0\n\treturn\n\nRoute22_EventScript_LateRivalSquirtle::\n\ttrainerbattle_no_intro TRAINER_RIVAL_ROUTE22_LATE_SQUIRTLE, Route22_Text_LateRivalDefeat\n\treturn\n\nRoute22_EventScript_LateRivalBulbasaur::\n\ttrainerbattle_no_intro TRAINER_RIVAL_ROUTE22_LATE_BULBASAUR, Route22_Text_LateRivalDefeat\n\treturn\n\nRoute22_EventScript_LateRivalCharmander::\n\ttrainerbattle_no_intro TRAINER_RIVAL_ROUTE22_LATE_CHARMANDER, Route22_Text_LateRivalDefeat\n\treturn\n\nRoute22_Movement_LateRivalExit::\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\tstep_end\n\nRoute22_EventScript_LeagueGateSign::\n\tmsgbox Route22_Text_LeagueGateSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route22/text.inc",
    "content": "Route22_Text_EarlyRivalIntro::\n\t.string \"{RIVAL}: Hey! {PLAYER}!\\p\"\n\t.string \"You're off to the POKéMON LEAGUE?\\n\"\n\t.string \"Forget about it!\\p\"\n\t.string \"You probably don't have any\\n\"\n\t.string \"BADGES, do you?\\p\"\n\t.string \"The guard won't let you through\\n\"\n\t.string \"without them.\\p\"\n\t.string \"By the way, did your POKéMON get\\n\"\n\t.string \"any stronger?$\"\n\nRoute22_Text_EarlyRivalDefeat::\n\t.string \"Awww!\\n\"\n\t.string \"You just lucked out!$\"\n\nRoute22_Text_EarlyRivalPostBattle::\n\t.string \"I heard the POKéMON LEAGUE is\\n\"\n\t.string \"crawling with tough TRAINERS.\\p\"\n\t.string \"I have to figure out how to get\\n\"\n\t.string \"past them.\\p\"\n\t.string \"You should quit dawdling and get a\\n\"\n\t.string \"move on!$\"\n\nRoute22_Text_LateRivalIntro::\n\t.string \"{RIVAL}: What? {PLAYER}!\\n\"\n\t.string \"What a surprise to see you here!\\p\"\n\t.string \"So you're going to the POKéMON\\n\"\n\t.string \"LEAGUE?\\p\"\n\t.string \"You collected all the BADGES, too?\\n\"\n\t.string \"That's cool!\\p\"\n\t.string \"Then I'll whip you, {PLAYER}, as a\\n\"\n\t.string \"warm-up for the POKéMON LEAGUE!\\p\"\n\t.string \"Come on!$\"\n\nRoute22_Text_LateRivalDefeat::\n\t.string \"What!?\\p\"\n\t.string \"I was just careless, you!$\"\n\nRoute22_Text_LateRivalPostBattle::\n\t.string \"That loosened me up.\\n\"\n\t.string \"I'm ready for the POKéMON LEAGUE!\\p\"\n\t.string \"{PLAYER}, you need more practice.\\p\"\n\t.string \"But hey, you know that!\\n\"\n\t.string \"I'm out of here. Smell ya!$\"\n\nRoute22_Text_LeagueGateSign::\n\t.string \"POKéMON LEAGUE\\n\"\n\t.string \"Front Gate$\"\n\n"
  },
  {
    "path": "data/maps/Route22_NorthEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE22_NORTH_ENTRANCE\",\n  \"name\": \"Route22_NorthEntrance\",\n  \"layout\": \"LAYOUT_ROUTE22_NORTH_ENTRANCE\",\n  \"music\": \"MUS_VIRIDIAN_FOREST\",\n  \"region_map_section\": \"MAPSEC_ROUTE_22\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route22_NorthEntrance_EventScript_BoulderBadgeGuard\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE23\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE22\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE22\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE22\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"0\",\n      \"script\": \"Route22_NorthEntrance_EventScript_BoulderBadgeGuardTrigger\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route22_NorthEntrance/scripts.inc",
    "content": "Route22_NorthEntrance_MapScripts::\n\t.byte 0\n\nRoute22_NorthEntrance_EventScript_BoulderBadgeGuard::\n\tlock\n\tfaceplayer\n\tsetvar VAR_TEMP_1, 1\n\tbufferstdstring STR_VAR_1, STDSTRING_BOULDER_BADGE\n\tgoto Route22_NorthEntrance_EventScript_BadgeGuard\n\tend\n\nRoute22_NorthEntrance_EventScript_BoulderBadgeGuardTrigger::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tsetvar VAR_0x8009, 1\n\tbufferstdstring STR_VAR_1, STDSTRING_BOULDER_BADGE\n\tgoto Route23_EventScript_BadgeGuardTrigger\n\tend\n"
  },
  {
    "path": "data/maps/Route23/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE23\",\n  \"name\": \"Route23\",\n  \"layout\": \"LAYOUT_ROUTE23\",\n  \"music\": \"MUS_VICTORY_ROAD\",\n  \"region_map_section\": \"MAPSEC_ROUTE_23\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_INDIGO_PLATEAU_EXTERIOR\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE22\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 149,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route23_EventScript_CascadeBadgeGuard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 140,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route23_EventScript_ThunderBadgeGuard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 123,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route23_EventScript_RainbowBadgeGuard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 112,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route23_EventScript_SoulBadgeGuard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 94,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route23_EventScript_MarshBadgeGuard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 61,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route23_EventScript_VolcanoBadgeGuard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route23_EventScript_EarthBadgeGuard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 103,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Dratini\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 73,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Nidoqueen\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 53,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Nidoking\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Charizard\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Venusaur\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_2F\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 153,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE22_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 154,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE22_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 149,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"1\",\n      \"script\": \"Route23_EventScript_CascadeBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 140,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"2\",\n      \"script\": \"Route23_EventScript_ThunderBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 123,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"3\",\n      \"script\": \"Route23_EventScript_RainbowBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 111,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"4\",\n      \"script\": \"Route23_EventScript_SoulBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 94,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"5\",\n      \"script\": \"Route23_EventScript_MarshBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 61,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"6\",\n      \"script\": \"Route23_EventScript_VolcanoBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 1,\n      \"y\": 35,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"7\",\n      \"script\": \"Route23_EventScript_EarthBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 1,\n      \"y\": 34,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"7\",\n      \"script\": \"Route23_EventScript_EarthBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 1,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"7\",\n      \"script\": \"Route23_EventScript_EarthBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 1,\n      \"y\": 33,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"7\",\n      \"script\": \"Route23_EventScript_EarthBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 1,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"7\",\n      \"script\": \"Route23_EventScript_EarthBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 1,\n      \"y\": 36,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"7\",\n      \"script\": \"Route23_EventScript_EarthBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 5,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"7\",\n      \"script\": \"Route23_EventScript_EarthBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 4,\n      \"y\": 35,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"7\",\n      \"script\": \"Route23_EventScript_EarthBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 60,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"6\",\n      \"script\": \"Route23_EventScript_VolcanoBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 61,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"6\",\n      \"script\": \"Route23_EventScript_VolcanoBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 60,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"6\",\n      \"script\": \"Route23_EventScript_VolcanoBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 8,\n      \"y\": 94,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"5\",\n      \"script\": \"Route23_EventScript_MarshBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 5,\n      \"y\": 92,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"5\",\n      \"script\": \"Route23_EventScript_MarshBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 94,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"5\",\n      \"script\": \"Route23_EventScript_MarshBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 4,\n      \"y\": 92,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"5\",\n      \"script\": \"Route23_EventScript_MarshBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 3,\n      \"y\": 92,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"5\",\n      \"script\": \"Route23_EventScript_MarshBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 2,\n      \"y\": 92,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"5\",\n      \"script\": \"Route23_EventScript_MarshBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 4,\n      \"y\": 139,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"2\",\n      \"script\": \"Route23_EventScript_ThunderBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 5,\n      \"y\": 139,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"2\",\n      \"script\": \"Route23_EventScript_ThunderBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 140,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"2\",\n      \"script\": \"Route23_EventScript_ThunderBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 122,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"3\",\n      \"script\": \"Route23_EventScript_RainbowBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 122,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"3\",\n      \"script\": \"Route23_EventScript_RainbowBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 123,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"3\",\n      \"script\": \"Route23_EventScript_RainbowBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 8,\n      \"y\": 109,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"4\",\n      \"script\": \"Route23_EventScript_SoulBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 109,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"4\",\n      \"script\": \"Route23_EventScript_SoulBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 109,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"4\",\n      \"script\": \"Route23_EventScript_SoulBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 109,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"4\",\n      \"script\": \"Route23_EventScript_SoulBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 109,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"4\",\n      \"script\": \"Route23_EventScript_SoulBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 111,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"4\",\n      \"script\": \"Route23_EventScript_SoulBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 14,\n      \"y\": 112,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"4\",\n      \"script\": \"Route23_EventScript_SoulBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 13,\n      \"y\": 112,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"4\",\n      \"script\": \"Route23_EventScript_SoulBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 15,\n      \"y\": 112,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"4\",\n      \"script\": \"Route23_EventScript_SoulBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 12,\n      \"y\": 148,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"1\",\n      \"script\": \"Route23_EventScript_CascadeBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 148,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"1\",\n      \"script\": \"Route23_EventScript_CascadeBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 14,\n      \"y\": 149,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"1\",\n      \"script\": \"Route23_EventScript_CascadeBadgeGuardTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 148,\n      \"elevation\": 0,\n      \"var\": \"VAR_MAP_SCENE_ROUTE23\",\n      \"var_value\": \"1\",\n      \"script\": \"Route23_EventScript_CascadeBadgeGuardTrigger\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 19,\n      \"y\": 42,\n      \"elevation\": 0,\n      \"item\": \"ITEM_FULL_RESTORE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE23_FULL_RESTORE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 20,\n      \"y\": 72,\n      \"elevation\": 0,\n      \"item\": \"ITEM_ULTRA_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE23_ULTRA_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 11,\n      \"y\": 101,\n      \"elevation\": 3,\n      \"item\": \"ITEM_MAX_ETHER\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE23_MAX_ETHER\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 3,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LUM_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE23_LUM_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 2,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"item\": \"ITEM_SITRUS_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE23_SITRUS_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 10,\n      \"y\": 67,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ASPEAR_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE23_ASPEAR_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 3,\n      \"y\": 128,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LEPPA_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE23_LEPPA_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 9,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"item\": \"ITEM_MAX_ELIXIR\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE23_MAX_ELIXIR\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route23_EventScript_VictoryRoadGateSign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route23/scripts.inc",
    "content": ".set LOCALID_CASCADE_BADGE_GUARD, 1\n.set LOCALID_THUNDER_BADGE_GUARD, 2\n.set LOCALID_RAINBOW_BADGE_GUARD, 3\n.set LOCALID_SOUL_BADGE_GUARD,    4\n.set LOCALID_MARSH_BADGE_GUARD,   5\n.set LOCALID_VOLCANO_BADGE_GUARD, 6\n.set LOCALID_EARTH_BADGE_GUARD,   7\n\n.set LOCALID_DRATINI_MASTER, 8\n.set LOCALID_NIDOQUEEN_MASTER, 9\n.set LOCALID_NIDOKING_MASTER, 10\n.set LOCALID_CHARIZARD_MASTER, 11\n.set LOCALID_VENUSAUR_MASTER, 12\n.set TRAINER, VAR_0x8009\n\nRoute23_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route23_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute23_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_DRATINI\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route23_MapScript_DratiniMasterMovementType\n\tsetvar TRAINER, MASTER_NIDOQUEEN\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route23_MapScript_NidoqueenMMasterMovementType\n\tsetvar TRAINER, MASTER_NIDOKING\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route23_MapScript_NidokingMasterMovementType\n\tsetvar TRAINER, MASTER_CHARIZARD\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route23_MapScript_CharizardMasterMovementType\n\tsetvar TRAINER, MASTER_VENUSAUR\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route23_MapScript_VenusaurMasterMovementType\n\tend\n\nRoute23_MapScript_DratiniMasterMovementType::\n\tsetobjectmovementtype LOCALID_DRATINI_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute23_MapScript_NidoqueenMMasterMovementType::\n\tsetobjectmovementtype LOCALID_NIDOQUEEN_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute23_MapScript_NidokingMasterMovementType::\n\tsetobjectmovementtype LOCALID_NIDOKING_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute23_MapScript_CharizardMasterMovementType::\n\tsetobjectmovementtype LOCALID_CHARIZARD_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute23_MapScript_VenusaurMasterMovementType::\n\tsetobjectmovementtype LOCALID_VENUSAUR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute23_EventScript_CascadeBadgeGuard::\n\tlock\n\tfaceplayer\n\tsetvar VAR_TEMP_1, 2\n\tbufferstdstring STR_VAR_1, STDSTRING_CASCADE_BADGE\n\tgoto Route23_EventScript_BadgeGuard\n\tend\n\nRoute23_EventScript_ThunderBadgeGuard::\n\tlock\n\tfaceplayer\n\tsetvar VAR_TEMP_1, 3\n\tbufferstdstring STR_VAR_1, STDSTRING_THUNDER_BADGE\n\tgoto Route23_EventScript_BadgeGuard\n\tend\n\nRoute23_EventScript_RainbowBadgeGuard::\n\tlock\n\tfaceplayer\n\tsetvar VAR_TEMP_1, 4\n\tbufferstdstring STR_VAR_1, STDSTRING_RAINBOW_BADGE\n\tgoto Route23_EventScript_BadgeGuard\n\tend\n\nRoute23_EventScript_SoulBadgeGuard::\n\tlock\n\tfaceplayer\n\tsetvar VAR_TEMP_1, 5\n\tbufferstdstring STR_VAR_1, STDSTRING_SOUL_BADGE\n\tgoto Route23_EventScript_BadgeGuard\n\tend\n\nRoute23_EventScript_MarshBadgeGuard::\n\tlock\n\tfaceplayer\n\tsetvar VAR_TEMP_1, 6\n\tbufferstdstring STR_VAR_1, STDSTRING_MARSH_BADGE\n\tgoto Route23_EventScript_BadgeGuard\n\tend\n\nRoute23_EventScript_VolcanoBadgeGuard::\n\tlock\n\tfaceplayer\n\tsetvar VAR_TEMP_1, 7\n\tbufferstdstring STR_VAR_1, STDSTRING_VOLCANO_BADGE\n\tgoto Route23_EventScript_BadgeGuard\n\tend\n\nRoute23_EventScript_EarthBadgeGuard::\n\tlock\n\tfaceplayer\n\tsetvar VAR_TEMP_1, 8\n\tbufferstdstring STR_VAR_1, STDSTRING_EARTH_BADGE\n\tgoto Route23_EventScript_BadgeGuard\n\tend\n\nRoute23_EventScript_CascadeBadgeGuardTrigger::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tsetvar VAR_0x8009, LOCALID_CASCADE_BADGE_GUARD\n\tbufferstdstring STR_VAR_1, STDSTRING_CASCADE_BADGE\n\tgoto Route23_EventScript_BadgeGuardTrigger\n\tend\n\nRoute23_EventScript_ThunderBadgeGuardTrigger::\n\tlockall\n\tsetvar VAR_TEMP_1, 3\n\tsetvar VAR_0x8009, LOCALID_THUNDER_BADGE_GUARD\n\tbufferstdstring STR_VAR_1, STDSTRING_THUNDER_BADGE\n\tgoto Route23_EventScript_BadgeGuardTrigger\n\tend\n\nRoute23_EventScript_RainbowBadgeGuardTrigger::\n\tlockall\n\tsetvar VAR_TEMP_1, 4\n\tsetvar VAR_0x8009, LOCALID_RAINBOW_BADGE_GUARD\n\tbufferstdstring STR_VAR_1, STDSTRING_RAINBOW_BADGE\n\tgoto Route23_EventScript_BadgeGuardTrigger\n\tend\n\nRoute23_EventScript_SoulBadgeGuardTrigger::\n\tlockall\n\tsetvar VAR_TEMP_1, 5\n\tsetvar VAR_0x8009, LOCALID_SOUL_BADGE_GUARD\n\tbufferstdstring STR_VAR_1, STDSTRING_SOUL_BADGE\n\tgoto Route23_EventScript_BadgeGuardTrigger\n\tend\n\nRoute23_EventScript_MarshBadgeGuardTrigger::\n\tlockall\n\tsetvar VAR_TEMP_1, 6\n\tsetvar VAR_0x8009, LOCALID_MARSH_BADGE_GUARD\n\tbufferstdstring STR_VAR_1, STDSTRING_MARSH_BADGE\n\tgoto Route23_EventScript_BadgeGuardTrigger\n\tend\n\nRoute23_EventScript_VolcanoBadgeGuardTrigger::\n\tlockall\n\tsetvar VAR_TEMP_1, 7\n\tsetvar VAR_0x8009, LOCALID_VOLCANO_BADGE_GUARD\n\tbufferstdstring STR_VAR_1, STDSTRING_VOLCANO_BADGE\n\tgoto Route23_EventScript_BadgeGuardTrigger\n\tend\n\nRoute23_EventScript_EarthBadgeGuardTrigger::\n\tlockall\n\tsetvar VAR_TEMP_1, 8\n\tsetvar VAR_0x8009, LOCALID_EARTH_BADGE_GUARD\n\tbufferstdstring STR_VAR_1, STDSTRING_EARTH_BADGE\n\tgoto Route23_EventScript_BadgeGuardTrigger\n\tend\n\nRoute23_EventScript_VictoryRoadGateSign::\n\tmsgbox Route23_Text_VictoryRoadGateSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route23/text.inc",
    "content": "Route23_Text_VictoryRoadGateSign::\n    .string \"VICTORY ROAD GATE -\\n\"\n    .string \"POKéMON LEAGUE$\"\n\n"
  },
  {
    "path": "data/maps/Route23_UnusedHouse/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE23_UNUSED_HOUSE\",\n  \"name\": \"Route23_UnusedHouse\",\n  \"layout\": \"LAYOUT_HOUSE2\",\n  \"music\": \"MUS_VICTORY_ROAD\",\n  \"region_map_section\": \"MAPSEC_ROUTE_23\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route23_UnusedHouse/scripts.inc",
    "content": "Route23_UnusedHouse_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/Route24/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE24\",\n  \"name\": \"Route24\",\n  \"layout\": \"LAYOUT_ROUTE24\",\n  \"music\": \"MUS_ROUTE24\",\n  \"region_map_section\": \"MAPSEC_ROUTE_24\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": -12,\n      \"map\": \"MAP_CERULEAN_CITY\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE25\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route24_EventScript_Rocket\",\n      \"flag\": \"FLAG_HIDE_NUGGET_BRIDGE_ROCKET\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route24_EventScript_Ethan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route24_EventScript_Reli\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route24_EventScript_Timmy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route24_EventScript_Ali\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route24_EventScript_Cale\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"Route24_EventScript_Shane\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route24_EventScript_ItemTM45\",\n      \"flag\": \"FLAG_HIDE_ROUTE24_TM45\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Venonat\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Exeggcute\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route24_EventScript_RolloutTutor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE24\",\n      \"var_value\": \"0\",\n      \"script\": \"Route24_EventScript_RocketTriggerLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE24\",\n      \"var_value\": \"0\",\n      \"script\": \"Route24_EventScript_RocketTriggerRight\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 19,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PECHA_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE24_PECHA_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/Route24/scripts.inc",
    "content": ".equ LOCALID_ROCKET, 1\n.set LOCALID_VENONAT_MASTER, 9\n.set LOCALID_EXEGGCUTE_MASTER, 10\n.set TRAINER, VAR_0x8009\n\nRoute24_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route24_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute24_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_VENONAT\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route24_MapScript_VenonatMasterMovementType\n\tsetvar TRAINER, MASTER_EXEGGCUTE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route24_MapScript_ExeggcuteMasterMovementType\n\tend\n\nRoute24_MapScript_VenonatMasterMovementType::\n\tsetobjectmovementtype LOCALID_VENONAT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\t\nRoute24_MapScript_ExeggcuteMasterMovementType::\n\tsetobjectmovementtype LOCALID_EXEGGCUTE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute24_EventScript_Rocket::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_MAP_SCENE_ROUTE24, 1, Route24_EventScript_RocketPostBattle\n\tmsgbox Route24_Text_JustEarnedFabulousPrize\n\tcheckitemspace ITEM_NUGGET\n\tgoto_if_eq VAR_RESULT, FALSE, Route24_EventScript_NoRoomForNugget\n\tcall Route24_EventScript_BattleRocket\n\trelease\n\tend\n\nRoute24_EventScript_NoRoomForNugget::\n\tmsgbox Route24_Text_YouDontHaveAnyRoom\n\trelease\n\tend\n\nRoute24_EventScript_RocketPostBattle::\n\tmsgbox Route24_Text_YoudBecomeTopRocketLeader\n\trelease\n\tend\n\nRoute24_EventScript_RocketTriggerLeft::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto Route24_EventScript_RocketTrigger\n\tend\n\nRoute24_EventScript_RocketTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto Route24_EventScript_RocketTrigger\n\tend\n\nRoute24_EventScript_RocketTrigger::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tcall_if_eq VAR_TEMP_1, 0, Route24_EventScript_RocketApproachPlayer\n\tcall_if_eq VAR_TEMP_1, 1, Route24_EventScript_RocketMotionToPlayer\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tmsgbox Route24_Text_JustEarnedFabulousPrize\n\tcheckitemspace ITEM_NUGGET\n\tgoto_if_eq VAR_RESULT, FALSE, Route24_EventScript_NoRoomForNuggetTrigger\n\tcall Route24_EventScript_BattleRocket\n\treleaseall\n\tend\n\nRoute24_EventScript_BattleRocket::\n\tgiveitem_msg Route24_Text_ReceivedNuggetFromMysteryTrainer, ITEM_NUGGET\n\tmessage Route24_Text_JoinTeamRocket\n\twaitmessage\n\tplaybgm MUS_ENCOUNTER_ROCKET, 0\n\twaitbuttonpress\n\tsetvar VAR_LAST_TALKED, LOCALID_ROCKET\n\tsetvar VAR_MAP_SCENE_ROUTE24, 1\n\ttrainerbattle_no_intro TRAINER_TEAM_ROCKET_GRUNT_6, Route24_Text_RocketDefeat\n\tmsgbox Route24_Text_YoudBecomeTopRocketLeader\n\treturn\n\nRoute24_EventScript_RocketApproachPlayer::\n\tapplymovement LOCALID_ROCKET, Route24_Movement_RocketApproachPlayer\n\twaitmovement 0\n\treturn\n\nRoute24_EventScript_RocketMotionToPlayer::\n\tapplymovement LOCALID_ROCKET, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treturn\n\nRoute24_EventScript_NoRoomForNuggetTrigger::\n\tmsgbox Route24_Text_YouDontHaveAnyRoom\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route24_Movement_WalkDown\n\twaitmovement 0\n\tcall_if_eq VAR_TEMP_1, 0, Route24_EventScript_RocketWalkBackToPos\n\trelease\n\tend\n\nRoute24_EventScript_RocketWalkBackToPos::\n\tapplymovement LOCALID_ROCKET, Route24_Movement_RocketWalkBackToPos\n\twaitmovement 0\n\treturn\n\nRoute24_Movement_RocketApproachPlayer::\n\twalk_left\n\tstep_end\n\nRoute24_Movement_RocketWalkBackToPos::\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nRoute24_Movement_WalkDown::\n\twalk_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/Route24/text.inc",
    "content": "Route24_Text_JustEarnedFabulousPrize::\n    .string \"Congratulations! You beat our\\n\"\n    .string \"five contest TRAINERS!\\p\"\n    .string \"You just earned a fabulous prize!$\"\n\nRoute24_Text_ReceivedNuggetFromMysteryTrainer::\n    .string \"{PLAYER} received a NUGGET\\n\"\n    .string \"from the mystery TRAINER!$\"\n\nRoute24_Text_YouDontHaveAnyRoom::\n    .string \"You don't have any room!$\"\n\nRoute24_Text_JoinTeamRocket::\n    .string \"By the way, how would you like to\\n\"\n    .string \"join TEAM ROCKET?\\p\"\n    .string \"We're a group of professional\\n\"\n    .string \"criminals specializing in POKéMON!\\p\"\n    .string \"Want to join?\\p\"\n    .string \"Are you sure?\\p\"\n    .string \"Come on, join us!\\p\"\n    .string \"I'm telling you to join!\\p\"\n    .string \"…Okay, you need convincing!\\p\"\n    .string \"I'll make you an offer you can't\\n\"\n    .string \"refuse!$\"\n\nRoute24_Text_RocketDefeat::\n    .string \"Arrgh!\\n\"\n    .string \"You are good!$\"\n\nRoute24_Text_YoudBecomeTopRocketLeader::\n    .string \"With your ability, you'd become\\n\"\n    .string \"a top leader in TEAM ROCKET.\\p\"\n    .string \"Come on, think of the opportunity!\\n\"\n    .string \"Don't let this chance go to waste.$\"\n\nRoute24_Text_ShaneIntro::\n    .string \"I saw your feat from the grass!$\"\n\nRoute24_Text_ShaneDefeat::\n    .string \"I thought not!$\"\n\nRoute24_Text_ShanePostBattle::\n    .string \"I hid because the people on the\\n\"\n    .string \"bridge frightened me.$\"\n\nRoute24_Text_EthanIntro::\n    .string \"Okay! I'm No. 5!\\n\"\n    .string \"I'll stomp you!$\"\n\nRoute24_Text_EthanDefeat::\n    .string \"Whoa!\\n\"\n    .string \"Too much!$\"\n\nRoute24_Text_EthanPostBattle::\n    .string \"I did my best. I have no regrets!$\"\n\nRoute24_Text_ReliIntro::\n    .string \"I'm No. 4!\\n\"\n    .string \"Getting tired?$\"\n\nRoute24_Text_ReliDefeat::\n    .string \"I lost, too!$\"\n\nRoute24_Text_ReliPostBattle::\n    .string \"I did my best, so I've no regrets!$\"\n\nRoute24_Text_TimmyIntro::\n    .string \"Here's No. 3!\\n\"\n    .string \"I won't be easy!$\"\n\nRoute24_Text_TimmyDefeat::\n    .string \"Ow!\\n\"\n    .string \"Stomped flat!$\"\n\nRoute24_Text_TimmyPostBattle::\n    .string \"I did my best. I have no regrets!$\"\n\nRoute24_Text_AliIntro::\n    .string \"I'm second!\\n\"\n    .string \"Now it's serious!$\"\n\nRoute24_Text_AliDefeat::\n    .string \"How could I lose?$\"\n\nRoute24_Text_AliPostBattle::\n    .string \"I did my best. I have no regrets!$\"\n\nRoute24_Text_CaleIntro::\n    .string \"People call this the NUGGET\\n\"\n    .string \"BRIDGE!\\p\"\n    .string \"Beat us five TRAINERS and win\\n\"\n    .string \"a fabulous prize!\\p\"\n    .string \"Think you got what it takes?$\"\n\nRoute24_Text_CaleDefeat::\n    .string \"Whoo!\\n\"\n    .string \"Good stuff!$\"\n\nRoute24_Text_CalePostBattle::\n    .string \"I did my best. I have no regrets!$\"\n"
  },
  {
    "path": "data/maps/Route25/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE25\",\n  \"name\": \"Route25\",\n  \"layout\": \"LAYOUT_ROUTE25\",\n  \"music\": \"MUS_ROUTE24\",\n  \"region_map_section\": \"MAPSEC_ROUTE_25\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE24\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route25_EventScript_Franklin\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route25_EventScript_Joey\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route25_EventScript_Wayne\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route25_EventScript_Dan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route25_EventScript_Kelsey\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route25_EventScript_Nob\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route25_EventScript_Flint\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route25_EventScript_Chad\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 42,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route25_EventScript_Haley\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route25_EventScript_ItemTM43\",\n      \"flag\": \"FLAG_HIDE_ROUTE25_TM43\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_25_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 49,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route25_EventScript_Beauty\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 49,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route25_EventScript_Man\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_PSYCHIC_M\",\n      \"in_connection\": false,\n      \"x\": 60,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Starmie\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 51,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE25_SEA_COTTAGE\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 48,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route25_EventScript_SeaCottageSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 14,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ELIXIR\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE25_ELIXIR\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 58,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ETHER\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE25_ETHER\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 33,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ORAN_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE25_ORAN_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 40,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"item\": \"ITEM_POMEG_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE25_POMEG_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/Route25/scripts.inc",
    "content": ".set LOCALID_STARMIE_MASTER, 14\n.set TRAINER, VAR_0x8009\n\nRoute25_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route25_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute25_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_STARMIE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route25_MapScript_StarmieMasterMovementType\n\tend\n\nRoute25_MapScript_StarmieMasterMovementType::\n\tsetobjectmovementtype LOCALID_STARMIE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute25_EventScript_SeaCottageSign::\n\tmsgbox Route25_Text_SeaCottageSign, MSGBOX_SIGN\n\tend\n\nRoute25_EventScript_Man::\n\tmsgbox Route25_Text_AreYouHereAlone, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/Route25/text.inc",
    "content": "Route25_Text_JoeyIntro::\n    .string \"Local TRAINERS come here to\\n\"\n    .string \"practice.$\"\n\nRoute25_Text_JoeyDefeat::\n    .string \"You're decent.$\"\n\nRoute25_Text_JoeyPostBattle::\n    .string \"All POKéMON have weaknesses.\\n\"\n    .string \"Even the strongest ones.\\p\"\n    .string \"That's why it's best to raise\\n\"\n    .string \"POKéMON of different types.$\"\n\nRoute25_Text_DanIntro::\n    .string \"Dad took me to a great party on\\n\"\n    .string \"the S.S. ANNE at VERMILION CITY.$\"\n\nRoute25_Text_DanDefeat::\n    .string \"I'm not mad!$\"\n\nRoute25_Text_DanPostBattle::\n    .string \"On the S.S. ANNE, I saw TRAINERS\\n\"\n    .string \"from around the world.$\"\n\nRoute25_Text_FlintIntro::\n    .string \"I'm a cool guy.\\n\"\n    .string \"I've got a girlfriend!$\"\n\nRoute25_Text_FlintDefeat::\n    .string \"Aww, darn…$\"\n\nRoute25_Text_FlintPostBattle::\n    .string \"Oh, well.\\n\"\n    .string \"My girlfriend will cheer me up.$\"\n\nRoute25_Text_KelseyIntro::\n    .string \"Hi!\\n\"\n    .string \"My boyfriend is cool!$\"\n\nRoute25_Text_KelseyDefeat::\n    .string \"My conditioning isn't the best…$\"\n\nRoute25_Text_KelseyPostBattle::\n    .string \"I wish my boyfriend was as good\\n\"\n    .string \"as you.$\"\n\nRoute25_Text_ChadIntro::\n    .string \"I had this feeling…\\n\"\n    .string \"I knew I had to battle you!$\"\n\nRoute25_Text_ChadDefeat::\n    .string \"I knew I'd lose, too!$\"\n\nRoute25_Text_ChadPostBattle::\n    .string \"If your POKéMON gets confused,\\n\"\n    .string \"switch it out.\\p\"\n    .string \"That's a good tactic.$\"\n\nRoute25_Text_HaleyIntro::\n    .string \"My friend has many cute POKéMON.\\n\"\n    .string \"I'm so jealous!$\"\n\nRoute25_Text_HaleyDefeat::\n    .string \"I'm not so jealous!$\"\n\nRoute25_Text_HaleyPostBattle::\n    .string \"You came from MT. MOON?\\n\"\n    .string \"May I have a CLEFAIRY?$\"\n\nRoute25_Text_FranklinIntro::\n    .string \"I just got down from MT. MOON,\\n\"\n    .string \"but I've still got gas in the tank!$\"\n\nRoute25_Text_FranklinDefeat::\n    .string \"You worked hard!$\"\n\nRoute25_Text_FranklinPostBattle::\n    .string \"Drat!\\n\"\n    .string \"A ZUBAT bit me back in that cave.$\"\n\nRoute25_Text_NobIntro::\n    .string \"I'm off to see a POKéMANIAC's\\n\"\n    .string \"collection at the cape.$\"\n\nRoute25_Text_NobDefeat::\n    .string \"You done got me, and real good,\\n\"\n    .string \"too!$\"\n\nRoute25_Text_NobPostBattle::\n    .string \"The POKéMANIAC sure lives up to\\n\"\n    .string \"his name.\\p\"\n    .string \"His collection includes many rare\\n\"\n    .string \"species of POKéMON.$\"\n\nRoute25_Text_WayneIntro::\n    .string \"You're going to see BILL?\\n\"\n    .string \"First, we battle!$\"\n\nRoute25_Text_WayneDefeat::\n    .string \"You're something.$\"\n\nRoute25_Text_WaynePostBattle::\n    .string \"The trail below is a shortcut to\\n\"\n    .string \"CERULEAN CITY.$\"\n\nRoute25_Text_SeaCottageSign::\n    .string \"SEA COTTAGE\\n\"\n    .string \"BILL lives here!$\"\n\nRoute25_Text_MistyHighHopesAboutThisPlace::\n    .string \"This cape is a famous date spot.\\p\"\n    .string \"MISTY, the GYM LEADER, has high\\n\"\n    .string \"hopes about this place.$\"\n\nRoute25_Text_AreYouHereAlone::\n    .string \"Hello, are you here alone?\\p\"\n    .string \"If you're out at CERULEAN's cape…\\n\"\n    .string \"Well, it should be as a couple.$\"\n\n"
  },
  {
    "path": "data/maps/Route25_SeaCottage/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE25_SEA_COTTAGE\",\n  \"name\": \"Route25_SeaCottage\",\n  \"layout\": \"LAYOUT_ROUTE25_SEA_COTTAGE\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_ROUTE_25\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BILL\",\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route25_SeaCottage_EventScript_Bill\",\n      \"flag\": \"FLAG_HIDE_BILL_HUMAN_SEA_COTTAGE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLEFAIRY\",\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route25_SeaCottage_EventScript_Bill\",\n      \"flag\": \"FLAG_HIDE_BILL_CLEFAIRY\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE25\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE25\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE25\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"Route25_SeaCottage_EventScript_Computer\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route25_SeaCottage/scripts.inc",
    "content": ".equ LOCALID_BILL_HUMAN,    1\n.equ LOCALID_BILL_CLEFAIRY, 2\n\n.equ BILL_IN_TELEPORTER,     FLAG_TEMP_2\n.equ RETURN_AFTER_SS_TICKET, FLAG_TEMP_3\n\nRoute25_SeaCottage_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route25_SeaCottage_OnTransition\n\t.byte 0\n\nRoute25_SeaCottage_OnTransition::\n\tcall_if_unset FLAG_HELPED_BILL_IN_SEA_COTTAGE, Route25_SeaCottage_EventScript_HideClefairyBill\n\tcall_if_set FLAG_GOT_SS_TICKET, Route25_SeaCottage_EventScript_SetReturnedAfterSSTicket\n\tend\n\nRoute25_SeaCottage_EventScript_HideClefairyBill::\n\tclearflag FLAG_HIDE_BILL_CLEFAIRY\n\tsetobjectxyperm LOCALID_BILL_HUMAN, 3, 3\n\treturn\n\nRoute25_SeaCottage_EventScript_SetReturnedAfterSSTicket::\n\tsetflag RETURN_AFTER_SS_TICKET\n\treturn\n\nRoute25_SeaCottage_EventScript_Bill::\n\tlock\n\tfaceplayer\n\tgoto_if_set RETURN_AFTER_SS_TICKET, Route25_SeaCottage_EventScript_BillGoLookAtPC\n\tgoto_if_set FLAG_GOT_SS_TICKET, Route25_SeaCottage_EventScript_BillGoToSSAnne\n\tgoto_if_set FLAG_HELPED_BILL_IN_SEA_COTTAGE, Route25_SeaCottage_EventScript_BillGiveSSTicket\n\tcheckplayergender\n\tgoto_if_eq VAR_RESULT, MALE, Route25_SeaCottage_EventScript_BillAskForHelpMale\n\tgoto_if_eq VAR_RESULT, FEMALE, Route25_SeaCottage_EventScript_BillAskForHelpFemale\n\tend\n\nRoute25_SeaCottage_EventScript_BillAskForHelpMale::\n\tmsgbox Route25_SeaCottage_Text_ImBillHelpMeOutPal, MSGBOX_YESNO\n\tgoto Route25_SeaCottage_EventScript_BillAskForHelp\n\tend\n\nRoute25_SeaCottage_EventScript_BillAskForHelpFemale::\n\tmsgbox Route25_SeaCottage_Text_ImBillHelpMeOutLady, MSGBOX_YESNO\n\tgoto Route25_SeaCottage_EventScript_BillAskForHelp\n\tend\n\nRoute25_SeaCottage_EventScript_BillAskForHelp::\n\tcall_if_eq VAR_RESULT, NO, Route25_SeaCottage_EventScript_DeclineHelpBill\n\tmsgbox Route25_SeaCottage_Text_RunCellSeparationOnPC\n\tclosemessage\n\tdelay 10\n\tcall_if_eq VAR_FACING, DIR_SOUTH, Route25_SeaCottage_EventScript_BillWalkToTeleporterSouth\n\tcall_if_eq VAR_FACING, DIR_NORTH, Route25_SeaCottage_EventScript_BillWalkToTeleporter\n\tcall_if_eq VAR_FACING, DIR_WEST, Route25_SeaCottage_EventScript_BillWalkToTeleporter\n\tcall_if_eq VAR_FACING, DIR_EAST, Route25_SeaCottage_EventScript_BillWalkToTeleporter\n\topendoor 10, 3\n\twaitdooranim\n\tapplymovement LOCALID_BILL_CLEFAIRY, Route25_SeaCottage_Movement_BillEnterTeleporter\n\twaitmovement 0\n\tremoveobject LOCALID_BILL_CLEFAIRY\n\tplayse SE_CONTEST_CURTAIN_FALL\n\tclosedoor 10, 3\n\twaitdooranim\n\tsetflag BILL_IN_TELEPORTER\n\trelease\n\tend\n\n@ Just returns after message, execution continues as if player had said yes\nRoute25_SeaCottage_EventScript_DeclineHelpBill::\n\tcheckplayergender\n\tcall_if_eq VAR_RESULT, MALE, Route25_SeaCottage_EventScript_DeclineHelpBillMale\n\tcall_if_eq VAR_RESULT, FEMALE, Route25_SeaCottage_EventScript_DeclineHelpBillFemale\n\treturn\n\nRoute25_SeaCottage_EventScript_DeclineHelpBillMale::\n\tmsgbox Route25_SeaCottage_Text_NoPleaseChief\n\treturn\n\nRoute25_SeaCottage_EventScript_DeclineHelpBillFemale::\n\tmsgbox Route25_SeaCottage_Text_NoPleaseBeautiful\n\treturn\n\nRoute25_SeaCottage_EventScript_BillWalkToTeleporterSouth::\n\tapplymovement LOCALID_BILL_CLEFAIRY, Route25_SeaCottage_Movement_BillWalkToTeleporterSouth\n\twaitmovement 0\n\treturn\n\nRoute25_SeaCottage_EventScript_BillWalkToTeleporter::\n\tapplymovement LOCALID_BILL_CLEFAIRY, Route25_SeaCottage_Movement_BillWalkToTeleporter\n\twaitmovement 0\n\treturn\n\nRoute25_SeaCottage_EventScript_BillGoToSSAnne::\n\tmsgbox Route25_SeaCottage_Text_SSAnnePartyYouGoInstead\n\trelease\n\tend\n\nRoute25_SeaCottage_EventScript_BillGiveSSTicket::\n\tfamechecker FAMECHECKER_BILL, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tcheckplayergender\n\tcall_if_eq VAR_RESULT, MALE, Route25_SeaCottage_EventScript_BillThanksMale\n\tcall_if_eq VAR_RESULT, FEMALE, Route25_SeaCottage_EventScript_BillThanksFemale\n\tcheckitemspace ITEM_SS_TICKET\n\tgoto_if_eq VAR_RESULT, FALSE, Route25_SeaCottage_EventScript_NoRoomForSSTicket\n\tgiveitem_msg Route25_SeaCottage_Text_ReceivedSSTicketFromBill, ITEM_SS_TICKET, 1, MUS_OBTAIN_KEY_ITEM\n\tsetflag FLAG_GOT_SS_TICKET_DUP\n\tsetflag FLAG_HIDE_NUGGET_BRIDGE_ROCKET\n\tsetflag FLAG_GOT_SS_TICKET\n\tsetflag FLAG_SYS_NOT_SOMEONES_PC\n\tgoto Route25_SeaCottage_EventScript_BillGoToSSAnne\n\tend\n\nRoute25_SeaCottage_EventScript_BillThanksMale::\n\tmsgbox Route25_SeaCottage_Text_ThanksBudTakeThis\n\treturn\n\nRoute25_SeaCottage_EventScript_BillThanksFemale::\n\tmsgbox Route25_SeaCottage_Text_ThanksLadyTakeThis\n\treturn\n\nRoute25_SeaCottage_EventScript_NoRoomForSSTicket::\n\tmsgbox Route25_SeaCottage_Text_YouveGotTooMuchStuff\n\trelease\n\tend\n\nRoute25_SeaCottage_EventScript_BillGoLookAtPC::\n\tmsgbox Route25_SeaCottage_Text_CheckOutRareMonsOnPC\n\trelease\n\tend\n\nRoute25_SeaCottage_Movement_BillWalkToTeleporter::\n\twalk_up\n\twalk_up\n\tstep_end\n\nRoute25_SeaCottage_Movement_BillWalkToTeleporterSouth::\n\twalk_right\n\twalk_up\n\twalk_up\n\twalk_left\n\twalk_in_place_faster_up\n\tstep_end\n\nRoute25_SeaCottage_Movement_BillEnterTeleporter::\n\twalk_up\n\tstep_end\n\nRoute25_SeaCottage_EventScript_Computer::\n\tlockall\n\tgoto_if_set RETURN_AFTER_SS_TICKET, Route25_SeaCottage_EventScript_OpenBillsMonList\n\tgoto_if_set BILL_IN_TELEPORTER, Route25_SeaCottage_EventScript_RunCellSeparator\n\tmsgbox Route25_SeaCottage_Text_TeleporterIsDisplayed\n\treleaseall\n\tend\n\nRoute25_SeaCottage_EventScript_RunCellSeparator::\n\tfadeoutbgm 0\n\tmsgbox Route25_SeaCottage_Text_InitiatedTeleportersCellSeparator\n\tclosemessage\n\tclearflag BILL_IN_TELEPORTER\n\tsetflag FLAG_HELPED_BILL_IN_SEA_COTTAGE\n\tspecial SpawnCameraObject\n\tapplymovement OBJ_EVENT_ID_CAMERA, Route25_SeaCottage_Movement_CameraPanToTeleporters\n\twaitmovement 0\n\tdelay 35\n\tplayse SE_PIN\n\twaitse\n\tsetvar VAR_0x8004, 0\n\tspecial AnimateTeleporterHousing\n\tdelay 10\n\tcall Route25_SeaCottage_EventScript_PlayTeleporterBeepSE\n\tcall Route25_SeaCottage_EventScript_PlayTeleporterBeepSE\n\tcall Route25_SeaCottage_EventScript_PlayTeleporterBeepSE\n\tcall Route25_SeaCottage_EventScript_PlayTeleporterBeepSE\n\tcall Route25_SeaCottage_EventScript_PlayTeleporterBeepSE\n\tcall Route25_SeaCottage_EventScript_PlayTeleporterBeepSE\n\tcall Route25_SeaCottage_EventScript_PlayTeleporterBeepSE\n\tsetvar VAR_0x8004, 1\n\tspecial AnimateTeleporterHousing\n\tplayse SE_WARP_IN\n\tspecial AnimateTeleporterCable\n\twaitse\n\tcall Route25_SeaCottage_EventScript_PlayTeleporterBeepSE\n\tcall Route25_SeaCottage_EventScript_PlayTeleporterBeepSE\n\tcall Route25_SeaCottage_EventScript_PlayTeleporterBeepSE\n\tcall Route25_SeaCottage_EventScript_PlayTeleporterBeepSE\n\tcall Route25_SeaCottage_EventScript_PlayTeleporterBeepSE\n\topendoor 3, 3\n\twaitdooranim\n\tfadeinbgm 0\n\taddobject LOCALID_BILL_HUMAN\n\tclearflag FLAG_HIDE_BILL_HUMAN_SEA_COTTAGE\n\tdelay 50\n\tplayfanfare MUS_LEVEL_UP\n\tapplymovement LOCALID_BILL_HUMAN, Route25_SeaCottage_Movement_BillExitTeleporter\n\twaitmovement 0\n\twaitfanfare\n\tapplymovement OBJ_EVENT_ID_CAMERA, Route25_SeaCottage_Movement_CameraPanBackFromTeleporters\n\twaitmovement 0\n\tplayse SE_CONTEST_CURTAIN_FALL\n\tclosedoor 3, 3\n\twaitdooranim\n\tapplymovement LOCALID_BILL_HUMAN, Route25_SeaCottage_Movement_BillWalkToMiddleOfRoom\n\twaitmovement 0\n\tspecial RemoveCameraObject\n\treleaseall\n\tend\n\nRoute25_SeaCottage_EventScript_PlayTeleporterBeepSE::\n\tplayse SE_BALL\n\twaitse\n\tdelay 20\n\treturn\n\nRoute25_SeaCottage_Movement_CameraPanToTeleporters::\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_right\n\tstep_end\n\nRoute25_SeaCottage_Movement_CameraPanBackFromTeleporters::\n\tdelay_16\n\tdelay_16\n\twalk_down\n\twalk_down\n\twalk_left\n\twalk_left\n\tstep_end\n\nRoute25_SeaCottage_EventScript_OpenBillsMonList::\n\tmsgbox Route25_SeaCottage_Text_BillsFavoriteMonList\n\tgoto Route25_SeaCottage_EventScript_BillsMonList\n\tend\n\nRoute25_SeaCottage_EventScript_BillsMonList::\n\tmessage Route25_SeaCottage_Text_SeeWhichMon\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_EEVEELUTIONS, FALSE\n\tswitch VAR_RESULT\n\tcase 0, Route25_SeaCottage_EventScript_ViewEevee\n\tcase 1, Route25_SeaCottage_EventScript_ViewFlareon\n\tcase 2, Route25_SeaCottage_EventScript_ViewJolteon\n\tcase 3, Route25_SeaCottage_EventScript_ViewVaporeon\n\tcase 4, Route25_SeaCottage_EventScript_ExitBillsMonList\n\tcase 127, Route25_SeaCottage_EventScript_ExitBillsMonList\n\tend\n\nRoute25_SeaCottage_EventScript_ViewEevee::\n\tshowmonpic SPECIES_EEVEE, 10, 3\n\twaitbuttonpress\n\thidemonpic\n\tsetvar VAR_0x8004, SPECIES_EEVEE\n\tspecial SetSeenMon\n\tgoto Route25_SeaCottage_EventScript_BillsMonList\n\tend\n\nRoute25_SeaCottage_EventScript_ViewFlareon::\n\tshowmonpic SPECIES_FLAREON, 10, 3\n\twaitbuttonpress\n\thidemonpic\n\tsetvar VAR_0x8004, SPECIES_FLAREON\n\tspecial SetSeenMon\n\tgoto Route25_SeaCottage_EventScript_BillsMonList\n\tend\n\nRoute25_SeaCottage_EventScript_ViewJolteon::\n\tshowmonpic SPECIES_JOLTEON, 10, 3\n\twaitbuttonpress\n\thidemonpic\n\tsetvar VAR_0x8004, SPECIES_JOLTEON\n\tspecial SetSeenMon\n\tgoto Route25_SeaCottage_EventScript_BillsMonList\n\tend\n\nRoute25_SeaCottage_EventScript_ViewVaporeon::\n\tshowmonpic SPECIES_VAPOREON, 10, 3\n\twaitbuttonpress\n\thidemonpic\n\tsetvar VAR_0x8004, SPECIES_VAPOREON\n\tspecial SetSeenMon\n\tgoto Route25_SeaCottage_EventScript_BillsMonList\n\tend\n\nRoute25_SeaCottage_EventScript_ExitBillsMonList::\n\treleaseall\n\tend\n\nRoute25_SeaCottage_Movement_BillWalkToMiddleOfRoom::\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_down\n\twalk_down\n\tstep_end\n\nRoute25_SeaCottage_Movement_BillExitTeleporter::\n\twalk_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/Route25_SeaCottage/text.inc",
    "content": "Route25_SeaCottage_Text_ImBillHelpMeOutPal::\n    .string \"Hiya! I'm a POKéMON…\\n\"\n    .string \"…No I'm not!\\p\"\n    .string \"Call me BILL!\\n\"\n    .string \"I'm a true-blue POKéMANIAC!\\p\"\n    .string \"Hey!\\n\"\n    .string \"What's with that skeptical look?\\p\"\n    .string \"I'm not joshing you, pal.\\p\"\n    .string \"I screwed up an experiment and got\\n\"\n    .string \"combined with a POKéMON!\\p\"\n    .string \"So, how about it?\\n\"\n    .string \"Help me out here!$\"\n\nRoute25_SeaCottage_Text_ImBillHelpMeOutLady::\n    .string \"Hiya! I'm a POKéMON…\\n\"\n    .string \"…No I'm not!\\p\"\n    .string \"Call me BILL!\\n\"\n    .string \"I'm a true-blue POKéMANIAC!\\p\"\n    .string \"Hey!\\n\"\n    .string \"What's with that skeptical look?\\p\"\n    .string \"I'm not joshing you, lady.\\p\"\n    .string \"I screwed up an experiment and got\\n\"\n    .string \"combined with a POKéMON!\\p\"\n    .string \"So, how about it?\\n\"\n    .string \"Help me out here!$\"\n\nRoute25_SeaCottage_Text_RunCellSeparationOnPC::\n    .string \"Wait till I get inside the\\n\"\n    .string \"TELEPORTER.\\p\"\n    .string \"When I do, go to my PC and run\\n\"\n    .string \"the Cell Separation System.$\"\n\nRoute25_SeaCottage_Text_NoPleaseChief::\n    .string \"No!?\\n\"\n    .string \"Now don't be so cold!\\p\"\n    .string \"Come on, you gotta help a guy in\\n\"\n    .string \"deep, deep trouble!\\p\"\n    .string \"What do you say, chief?\\n\"\n    .string \"Please?\\l\"\n    .string \"Okay?\\l\"\n    .string \"All right!$\"\n\nRoute25_SeaCottage_Text_NoPleaseBeautiful::\n    .string \"No!?\\n\"\n    .string \"Now don't be so cold!\\p\"\n    .string \"Come on, you gotta help a guy in\\n\"\n    .string \"deep, deep trouble!\\p\"\n    .string \"What do you say, beautiful?\\n\"\n    .string \"Please?\\l\"\n    .string \"Okay?\\l\"\n    .string \"All right!$\"\n\nRoute25_SeaCottage_Text_ThanksBudTakeThis::\n    .string \"BILL: Yeehah!\\n\"\n    .string \"Thanks, bud! I owe you one!\\p\"\n    .string \"So, did you come to see my\\n\"\n    .string \"POKéMON collection?\\p\"\n    .string \"You didn't?\\n\"\n    .string \"That's a bummer.\\p\"\n    .string \"I've got to thank you…\\n\"\n    .string \"Oh, here, maybe this'll do.$\"\n\nRoute25_SeaCottage_Text_ThanksLadyTakeThis::\n    .string \"BILL: Yeehah!\\n\"\n    .string \"Thanks, lady! I owe you one!\\p\"\n    .string \"So, did you come to see my\\n\"\n    .string \"POKéMON collection?\\p\"\n    .string \"You didn't?\\n\"\n    .string \"That's a bummer.\\p\"\n    .string \"I've got to thank you…\\n\"\n    .string \"Oh, here, maybe this'll do.$\"\n\nRoute25_SeaCottage_Text_ReceivedSSTicketFromBill::\n    .string \"{PLAYER} received an S.S. TICKET\\n\"\n    .string \"from BILL.$\"\n\nRoute25_SeaCottage_Text_YouveGotTooMuchStuff::\n    .string \"You've got too much stuff!$\"\n\nRoute25_SeaCottage_Text_SSAnnePartyYouGoInstead::\n    .string \"That cruise ship S.S. ANNE is in\\n\"\n    .string \"VERMILION CITY.\\p\"\n    .string \"I hear there are lots of TRAINERS\\n\"\n    .string \"on board, too.\\p\"\n    .string \"They invited me to their party, but\\n\"\n    .string \"I can't stand fancy do's.\\p\"\n    .string \"Why don't you go instead of me?\\n\"\n    .string \"Go on and have a good time.$\"\n\nRoute25_SeaCottage_Text_CheckOutRareMonsOnPC::\n    .string \"BILL: Feel like checking out some\\n\"\n    .string \"of my rare POKéMON on my PC?\\p\"\n    .string \"Go on, check out my PC.$\"\n\nRoute25_SeaCottage_Text_TeleporterIsDisplayed::\n    .string \"TELEPORTER is displayed on the PC\\n\"\n    .string \"monitor.$\"\n\nRoute25_SeaCottage_Text_InitiatedTeleportersCellSeparator::\n    .string \"{PLAYER} initiated the TELEPORTER's\\n\"\n    .string \"Cell Separator.$\"\n\nRoute25_SeaCottage_Text_BillsFavoriteMonList::\n    .string \"BILL's favorite POKéMON list!$\"\n\nRoute25_SeaCottage_Text_SeeWhichMon::\n    .string \"Which POKéMON do you want to see?$\"\n\n"
  },
  {
    "path": "data/maps/Route2_EastBuilding/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE2_EAST_BUILDING\",\n  \"name\": \"Route2_EastBuilding\",\n  \"layout\": \"LAYOUT_ROUTE2_ENTRANCE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route2_EastBuilding_EventScript_Aide\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKER\",\n      \"x\": 10,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route2_EastBuilding_EventScript_Rocker\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE2\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route2_EastBuilding/scripts.inc",
    "content": ".equ REQUIRED_SEEN_MONS, 10\n\nRoute2_EastBuilding_MapScripts::\n\t.byte 0\n\nRoute2_EastBuilding_EventScript_Aide::\n\tlock\n\tfaceplayer\n\tcall Route2_EastBuilding_EventScript_GetAideRequestInfo\n\tgoto_if_set FLAG_GOT_HM05, Route2_EastBuilding_EventScript_AlreadyGotHM05\n\tmsgbox Route2_EastBuilding_Text_GiveHM05IfSeen10Mons, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Aide_EventScript_DeclineCheckMons\n\tsetvar VAR_0x8004, 0\n\tspecialvar VAR_RESULT, GetPokedexCount\n\tbuffernumberstring STR_VAR_3, VAR_0x8006\n\tcall Route2_EastBuilding_EventScript_GetAideRequestInfo\n\tgoto_if_lt VAR_0x8006, REQUIRED_SEEN_MONS, Aide_EventScript_HaventCaughtEnough\n\tmsgbox Route2_EastBuilding_Text_GreatHereYouGo\n\tcheckitemspace ITEM_HM05\n\tgoto_if_eq VAR_RESULT, FALSE, Aide_EventScript_NoRoomForItem\n\tgiveitem_msg Route2_EastBuilding_Text_ReceivedHM05FromAide, ITEM_HM05\n\tsetflag FLAG_GOT_HM05\n\tmsgbox Route2_EastBuilding_Text_ExplainHM05\n\trelease\n\tend\n\nRoute2_EastBuilding_EventScript_AlreadyGotHM05::\n\tmsgbox Route2_EastBuilding_Text_ExplainHM05\n\trelease\n\tend\n\nRoute2_EastBuilding_EventScript_GetAideRequestInfo::\n\tbuffernumberstring STR_VAR_1, REQUIRED_SEEN_MONS\n\tbufferitemname STR_VAR_2, ITEM_HM05\n\treturn\n\nRoute2_EastBuilding_EventScript_Rocker::\n\tmsgbox Route2_EastBuilding_Text_CanGetThroughRockTunnel, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/Route2_EastBuilding/text.inc",
    "content": "Route2_EastBuilding_Text_GiveHM05IfSeen10Mons::\n    .string \"Hi! Remember me?\\n\"\n    .string \"I'm one of PROF. OAK's AIDES.\\p\"\n    .string \"If your POKéDEX has complete data\\n\"\n    .string \"on ten species, I'm supposed to\\l\"\n    .string \"give you a reward.\\p\"\n    .string \"PROF. OAK entrusted me with\\n\"\n    .string \"HM05 for you.\\p\"\n    .string \"So, {PLAYER}, let me ask you.\\p\"\n    .string \"Have you gathered data on at least\\n\"\n    .string \"ten kinds of POKéMON?$\"\n\nRoute2_EastBuilding_Text_GreatHereYouGo::\n    .string \"Great! You have caught or owned\\n\"\n    .string \"{STR_VAR_3} kinds of POKéMON!\\p\"\n    .string \"Congratulations!\\n\"\n    .string \"Here you go!$\"\n\nRoute2_EastBuilding_Text_ReceivedHM05FromAide::\n    .string \"{PLAYER} received HM05\\n\"\n    .string \"from the AIDE.$\"\n\nRoute2_EastBuilding_Text_ExplainHM05::\n    .string \"HM05 contains the hidden move\\n\"\n    .string \"FLASH.\\p\"\n    .string \"FLASH lights up even the darkest\\n\"\n    .string \"of caves and dungeons.$\"\n\nRoute2_EastBuilding_Text_CanGetThroughRockTunnel::\n    .string \"Once a POKéMON learns FLASH, you\\n\"\n    .string \"can get through ROCK TUNNEL.$\"\n\n"
  },
  {
    "path": "data/maps/Route2_House/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE2_HOUSE\",\n  \"name\": \"Route2_House\",\n  \"layout\": \"LAYOUT_HOUSE2\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route2_House_EventScript_Scientist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GBA_KID\",\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route2_House_EventScript_Reyley\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE2\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE2\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE2\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route2_House/scripts.inc",
    "content": "Route2_House_MapScripts::\n\t.byte 0\n\nRoute2_House_EventScript_Scientist::\n\tmsgbox Route2_House_Text_FaintedMonsCanUseFieldMoves, MSGBOX_NPC\n\tend\n\nRoute2_House_EventScript_Reyley::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8008, INGAME_TRADE_MR_MIME\n\tcall EventScript_GetInGameTradeSpeciesInfo\n\tgoto_if_set FLAG_DID_MIMIEN_TRADE, Route2_House_EventScript_AlreadyTraded\n\tmsgbox Trade_Text_LookingForMonWannaTradeForMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Route2_House_EventScript_DeclineTrade\n\tcall EventScript_ChooseMonForInGameTrade\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, Route2_House_EventScript_DeclineTrade\n\tcall EventScript_GetInGameTradeSpecies\n\tgoto_if_ne VAR_RESULT, VAR_0x8009, Route2_House_EventScript_NotRequestedMon\n\tcall EventScript_DoInGameTrade\n\tmsgbox Trade_Text_HeyThanks\n\tsetflag FLAG_DID_MIMIEN_TRADE\n\trelease\n\tend\n\nRoute2_House_EventScript_DeclineTrade::\n\tmsgbox Trade_Text_AwwOhWell\n\trelease\n\tend\n\nRoute2_House_EventScript_NotRequestedMon::\n\tbufferspeciesname STR_VAR_1, VAR_0x8009\n\tmsgbox Trade_Text_WhatThatsNoMon\n\trelease\n\tend\n\nRoute2_House_EventScript_AlreadyTraded::\n\tmsgbox Trade_Text_IsntMyOldMonGreat\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/Route2_House/text.inc",
    "content": "Route2_House_Text_FaintedMonsCanUseFieldMoves::\n    .string \"A fainted POKéMON just has no\\n\"\n    .string \"energy left to battle.\\p\"\n    .string \"It can still use moves like CUT\\n\"\n    .string \"outside of battle.$\"\n\n"
  },
  {
    "path": "data/maps/Route2_ViridianForest_NorthEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE\",\n  \"name\": \"Route2_ViridianForest_NorthEntrance\",\n  \"layout\": \"LAYOUT_ROUTE2_ENTRANCE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route2_ViridianForest_NorthEntrance_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route2_ViridianForest_NorthEntrance_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route2_ViridianForest_NorthEntrance_EventScript_CooltrainerF\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Butterfree\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_FOREST\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_FOREST\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_FOREST\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route2_ViridianForest_NorthEntrance/scripts.inc",
    "content": ".set LOCALID_BUTTERFREE_MASTER, 4\n.set TRAINER, VAR_0x8009\n\nRoute2_ViridianForest_NorthEntrance_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route2_ViridianForest_NorthEntrance_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute2_ViridianForest_NorthEntrance_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_BUTTERFREE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route2_ViridianForest_NorthEntrance_MapScript_ButterfreeMasterMovementType\n\tend\n\nRoute2_ViridianForest_NorthEntrance_MapScript_ButterfreeMasterMovementType::\n\tsetobjectmovementtype LOCALID_BUTTERFREE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute2_ViridianForest_NorthEntrance_EventScript_Youngster::\n\tmsgbox Route2_ViridianForest_NorthEntrance_Text_ManyMonsOnlyInForests, MSGBOX_NPC\n\tend\n\nRoute2_ViridianForest_NorthEntrance_EventScript_OldMan::\n\tmsgbox Route2_ViridianForest_NorthEntrance_Text_CanCutSkinnyTrees, MSGBOX_NPC\n\tend\n\nRoute2_ViridianForest_NorthEntrance_EventScript_CooltrainerF::\n\tmsgbox Route2_ViridianForest_NorthEntrance_Text_CanCancelEvolution, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/Route2_ViridianForest_NorthEntrance/text.inc",
    "content": "Route2_ViridianForest_NorthEntrance_Text_ManyMonsOnlyInForests::\n    .string \"Many POKéMON live only in forests \\n\"\n    .string \"and caves.\\p\"\n    .string \"You need to be persistent and look\\n\"\n    .string \"everywhere to get different kinds.$\"\n\nRoute2_ViridianForest_NorthEntrance_Text_CanCutSkinnyTrees::\n    .string \"Have you noticed the skinny trees\\n\"\n    .string \"on the roadside?\\p\"\n    .string \"They can be cut down by a special\\n\"\n    .string \"POKéMON move, I hear.$\"\n\nRoute2_ViridianForest_NorthEntrance_Text_CanCancelEvolution::\n    .string \"Do you know the evolution-cancel\\n\"\n    .string \"technique?\\p\"\n    .string \"When a POKéMON is evolving, you\\n\"\n    .string \"can stop the process.\\p\"\n    .string \"It's a technique for raising\\n\"\n    .string \"POKéMON the way they are.$\"\n\n"
  },
  {
    "path": "data/maps/Route2_ViridianForest_SouthEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE\",\n  \"name\": \"Route2_ViridianForest_SouthEntrance\",\n  \"layout\": \"LAYOUT_ROUTE2_ENTRANCE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route2_ViridianForest_SouthEntrance_EventScript_Woman1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route2_ViridianForest_SouthEntrance_EventScript_Woman2\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_FOREST\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route2_ViridianForest_SouthEntrance/scripts.inc",
    "content": "Route2_ViridianForest_SouthEntrance_MapScripts::\n\t.byte 0\n\nRoute2_ViridianForest_SouthEntrance_EventScript_Woman1::\n\tmsgbox Route2_ViridianForest_SouthEntrance_Text_ForestIsMaze, MSGBOX_NPC\n\tend\n\nRoute2_ViridianForest_SouthEntrance_EventScript_Woman2::\n\tmsgbox Route2_ViridianForest_SouthEntrance_Text_RattataHasWickedBite, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/Route2_ViridianForest_SouthEntrance/text.inc",
    "content": "Route2_ViridianForest_SouthEntrance_Text_ForestIsMaze::\n    .string \"Are you going to VIRIDIAN FOREST?\\n\"\n    .string \"It's a natural maze in there.\\l\"\n    .string \"Be careful you don't get lost.$\"\n\nRoute2_ViridianForest_SouthEntrance_Text_RattataHasWickedBite::\n    .string \"RATTATA may be small, but don't\\n\"\n    .string \"underestimate its wicked bite.\\p\"\n    .string \"Have you caught one already?$\"\n\n"
  },
  {
    "path": "data/maps/Route3/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE3\",\n  \"name\": \"Route3\",\n  \"layout\": \"LAYOUT_ROUTE3\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_3\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 60,\n      \"map\": \"MAP_ROUTE4\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": -10,\n      \"map\": \"MAP_PEWTER_CITY\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 70,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route3_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route3_EventScript_Robin\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route3_EventScript_James\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"Route3_EventScript_Sally\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route3_EventScript_Greg\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"Route3_EventScript_Calvin\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"Route3_EventScript_Janice\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route3_EventScript_Colton\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route3_EventScript_Ben\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 43,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_NidoranF\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 72,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route3_EventScript_RouteSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 26,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ORAN_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE3_ORAN_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/Route3/scripts.inc",
    "content": ".set LOCALID_NIDORAN_F_MASTER, 10\n.set TRAINER, VAR_0x8009\n\nRoute3_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route3_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute3_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_NIDORAN_F\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route3_MapScript_NidoranFMasterMovementType\n\tend\n\nRoute3_MapScript_NidoranFMasterMovementType::\n\tsetobjectmovementtype LOCALID_NIDORAN_F_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute3_EventScript_Youngster::\n\tmsgbox Route3_Text_TunnelFromCeruleanTiring, MSGBOX_NPC\n\tend\n\nRoute3_EventScript_RouteSign::\n\tmsgbox Route3_Text_RouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route3/text.inc",
    "content": "Route3_Text_TunnelFromCeruleanTiring::\n    .string \"Whew… I better take a rest…\\n\"\n    .string \"Groan…\\p\"\n    .string \"That tunnel from CERULEAN takes a\\n\"\n    .string \"lot out of you!$\"\n\nRoute3_Text_ColtonIntro::\n    .string \"Hey!\\n\"\n    .string \"I saw you in VIRIDIAN FOREST!$\"\n\nRoute3_Text_ColtonDefeat::\n    .string \"You beat me again!$\"\n\nRoute3_Text_ColtonPostBattle::\n    .string \"There are other kinds of POKéMON\\n\"\n    .string \"than the ones you find in forests.$\"\n\nRoute3_Text_BenIntro::\n    .string \"Hi!\\n\"\n    .string \"I like shorts!\\p\"\n    .string \"They're delightfully comfy and\\n\"\n    .string \"easy to wear!$\"\n\nRoute3_Text_BenDefeat::\n    .string \"I don't believe it!$\"\n\nRoute3_Text_BenPostBattle::\n    .string \"Are you using a POKéMON CENTER's\\n\"\n    .string \"PC for storing your POKéMON?\\p\"\n    .string \"Each BOX can hold up to\\n\"\n    .string \"30 POKéMON.$\"\n\nRoute3_Text_JaniceIntro::\n    .string \"Excuse me!\\n\"\n    .string \"You looked at me, didn't you?$\"\n\nRoute3_Text_JaniceDefeat::\n    .string \"You're mean!$\"\n\nRoute3_Text_JanicePostBattle::\n    .string \"You shouldn't be staring if you\\n\"\n    .string \"don't want to battle!$\"\n\nRoute3_Text_GregIntro::\n    .string \"Are you a TRAINER?\\n\"\n    .string \"Let's get with it right away!$\"\n\nRoute3_Text_GregDefeat::\n    .string \"If I had new POKéMON, I would've\\n\"\n    .string \"won!$\"\n\nRoute3_Text_GregPostBattle::\n    .string \"If a POKéMON BOX on the PC gets\\n\"\n    .string \"full, just switch to another BOX.$\"\n\nRoute3_Text_SallyIntro::\n    .string \"That look you gave me…\\n\"\n    .string \"It's so intriguing!$\"\n\nRoute3_Text_SallyDefeat::\n    .string \"Be nice!$\"\n\nRoute3_Text_SallyPostBattle::\n    .string \"You can avoid battles by not\\n\"\n    .string \"letting TRAINERS see you.$\"\n\nRoute3_Text_CalvinIntro::\n    .string \"Hey! You're not wearing shorts!\\n\"\n    .string \"What's wrong with you?$\"\n\nRoute3_Text_CalvinDefeat::\n    .string \"Lost!\\n\"\n    .string \"Lost! Lost!$\"\n\nRoute3_Text_CalvinPostBattle::\n    .string \"I always wear shorts, even in\\n\"\n    .string \"winter. That's my policy.$\"\n\nRoute3_Text_JamesIntro::\n    .string \"I'll battle you with the POKéMON\\n\"\n    .string \"I just caught.$\"\n\nRoute3_Text_JamesDefeat::\n    .string \"Done like dinner!$\"\n\nRoute3_Text_JamesPostBattle::\n    .string \"Trained POKéMON are stronger than\\n\"\n    .string \"the wild ones.$\"\n\nRoute3_Text_RobinIntro::\n    .string \"Eek!\\n\"\n    .string \"Did you touch me?$\"\n\nRoute3_Text_RobinDefeat::\n    .string \"That's it?$\"\n\nRoute3_Text_RobinPostBattle::\n    .string \"ROUTE 4 is at the foot of\\n\"\n    .string \"MT. MOON.$\"\n\nRoute3_Text_RouteSign::\n    .string \"ROUTE 3\\n\"\n    .string \"MT. MOON AHEAD$\"\n\n"
  },
  {
    "path": "data/maps/Route4/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE4\",\n  \"name\": \"Route4\",\n  \"layout\": \"LAYOUT_ROUTE4\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_4\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": -60,\n      \"map\": \"MAP_ROUTE3\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": -10,\n      \"map\": \"MAP_CERULEAN_CITY\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route4_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 75,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route4_EventScript_Crissy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 67,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route4_EventScript_ItemTM05\",\n      \"flag\": \"FLAG_HIDE_ROUTE4_TM05\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route4_EventScript_Boy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 47,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route4_EventScript_MegaPunchTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 50,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route4_EventScript_MegaKickTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"clone\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"x\": 109,\n      \"y\": 3,\n      \"target_local_id\": 12,\n      \"target_map\": \"MAP_CERULEAN_CITY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 58,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Bulbasaur\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_NidoranM\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 85,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Ekans\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER\",\n      \"in_connection\": false,\n      \"x\": 98,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Golduck\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 19,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_MT_MOON_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 32,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_MT_MOON_B1F\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE4_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 18,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route4_EventScript_MtMoonSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 34,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route4_EventScript_RouteSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 43,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"item\": \"ITEM_GREAT_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE4_GREAT_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PERSIM_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE4_PERSIM_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 67,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"item\": \"ITEM_HONDEW_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE4_HONDEW_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/Route4/scripts.inc",
    "content": ".set LOCALID_BULBASAUR_MASTER, 8\n.set LOCALID_NIDORAN_M_MASTER, 9\n.set LOCALID_EKANS_MASTER, 10\n.set LOCALID_GOLDUCK_MASTER, 11\n.set TRAINER, VAR_0x8009\n\nRoute4_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route4_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute4_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_BULBASAUR\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route4_MapScript_BulbasaurMasterMovementType\n\tsetvar TRAINER, MASTER_NIDORAN_M\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route4_MapScript_NidoranMMasterMovementType\n\tsetvar TRAINER, MASTER_EKANS\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route4_MapScript_EkansMasterMovementType\n\tsetvar TRAINER, MASTER_GOLDUCK\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route4_MapScript_GolduckMasterMovementType\n\tend\n\nRoute4_MapScript_BulbasaurMasterMovementType::\n\tsetobjectmovementtype LOCALID_BULBASAUR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute4_MapScript_NidoranMMasterMovementType::\n\tsetobjectmovementtype LOCALID_NIDORAN_M_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute4_MapScript_EkansMasterMovementType::\n\tsetobjectmovementtype LOCALID_EKANS_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute4_MapScript_GolduckMasterMovementType::\n\tsetobjectmovementtype LOCALID_GOLDUCK_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_SWIM\n\treturn\n\nRoute4_EventScript_Woman::\n\tmsgbox Route4_Text_TrippedOverGeodude, MSGBOX_NPC\n\tend\n\nRoute4_EventScript_MtMoonSign::\n\tmsgbox Route4_Text_MtMoonEntrance, MSGBOX_SIGN\n\tend\n\nRoute4_EventScript_RouteSign::\n\tmsgbox Route4_Text_RouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route4/text.inc",
    "content": "Route4_Text_TrippedOverGeodude::\n    .string \"Ouch! I tripped over a rocky\\n\"\n    .string \"POKéMON, GEODUDE!$\"\n\nRoute4_Text_CrissyIntro::\n    .string \"I came to MT. MOON in search of\\n\"\n    .string \"mushroom POKéMON.$\"\n\nRoute4_Text_CrissyDefeat::\n    .string \"After all I did to catch them!$\"\n\nRoute4_Text_CrissyPostBattle::\n    .string \"There might not be any more\\n\"\n    .string \"mushrooms here.\\p\"\n    .string \"I think I got them all.$\"\n\nRoute4_Text_MtMoonEntrance::\n    .string \"MT. MOON\\n\"\n    .string \"Tunnel Entrance$\"\n\nRoute4_Text_RouteSign::\n    .string \"ROUTE 4\\n\"\n    .string \"MT. MOON - CERULEAN CITY$\"\n\nText_MegaPunchTeach::\n    .string \"A punch of roaring ferocity!\\p\"\n    .string \"Packed with destructive power!\\p\"\n    .string \"When the chips are down,\\n\"\n    .string \"MEGA PUNCH is the ultimate attack!\\l\"\n    .string \"You agree, yes?\\p\"\n    .string \"Now!\\n\"\n    .string \"Let me teach it to your POKéMON!$\"\n\nText_MegaPunchDeclined::\n    .string \"You'll be back when you understand\\n\"\n    .string \"the worth of MEGA PUNCH.$\"\n\nText_MegaPunchWhichMon::\n    .string \"Fine!\\n\"\n    .string \"Which POKéMON will learn it?$\"\n\nText_MegaPunchTaught::\n    .string \"Now, we are comrades in the way of\\n\"\n    .string \"punching!\\p\"\n    .string \"You should go before you're seen\\n\"\n    .string \"by the misguided fool who trains\\l\"\n    .string \"only his silly kicking over there.$\"\n\nText_MegaPunchReteach::\n    .string \"A punch so powerful, you can't\\n\"\n    .string \"help but want to learn it again!\\p\"\n    .string \"I can teach you the power-packed\\n\"\n    .string \"MEGA PUNCH again for ¥5000!$\"\n\nText_MegaPunchReteach2::\n    .string \"Do you want me to teach MEGA PUNCH\\n\"\n    .string \"to your POKéMON?$\"\n\nText_MegaPunchNotEnoughMoney::\n    .string \"Money is packed with power too,\\n\"\n    .string \"and without ¥5000, I can't teach\\l\"\n    .string \"MEGA PUNCH to your POKéMON!$\"\n\nText_MegaKickTeach::\n    .string \"A kick of brutal ferocity!\\p\"\n    .string \"Packed with destructive power!\\p\"\n    .string \"When you get right down to it,\\n\"\n    .string \"MEGA KICK is the ultimate attack!\\l\"\n    .string \"Don't you agree?\\p\"\n    .string \"Okay!\\n\"\n    .string \"I'll teach it to your POKéMON!$\"\n\nText_MegaKickDeclined::\n    .string \"You'll come crawling back when you\\n\"\n    .string \"realize the value of MEGA KICK.$\"\n\nText_MegaKickWhichMon::\n    .string \"All right!\\n\"\n    .string \"Which POKéMON wants to learn it?$\"\n\nText_MegaKickTaught::\n    .string \"Now, we are soul mates in the way\\n\"\n    .string \"of kicking!\\p\"\n    .string \"You should run before you're seen\\n\"\n    .string \"by the deluded nitwit who trains\\l\"\n    .string \"only simple punching over there.$\"\n\nText_MegaKickReteach::\n    .string \"A kick so powerful, you can't\\n\"\n    .string \"help but want to learn it again!\\p\"\n    .string \"I can teach you the power-packed\\n\"\n    .string \"MEGA KICK again for ¥5000!$\"\n\nText_MegaKickReteach2::\n    .string \"Do you want me to teach MEGA KICK\\n\"\n    .string \"to your POKéMON?$\"\n\nText_MegaKickNotEnoughMoney::\n    .string \"Money is packed with power too,\\n\"\n    .string \"and without ¥5000, I can't teach\\l\"\n    .string \"MEGA KICK to your POKéMON!$\"\n\nRoute4_Text_PeopleLikeAndRespectBrock::\n    .string \"Oh, wow, that's the BOULDERBADGE!\\n\"\n    .string \"You got it from BROCK, didn't you?\\p\"\n    .string \"BROCK is cool. He's not just tough.\\n\"\n    .string \"People like and respect him.\\p\"\n    .string \"I want to become a GYM LEADER\\n\"\n    .string \"like him.$\"\n"
  },
  {
    "path": "data/maps/Route4_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE4_POKEMON_CENTER_1F\",\n  \"name\": \"Route4_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_4\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route4_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route4_PokemonCenter_1F_EventScript_MagikarpSalesman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route4_PokemonCenter_1F_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route4_PokemonCenter_1F_EventScript_Boy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route4_PokemonCenter_1F_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLIPBOARD\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route4_PokemonCenter_1F_EventScript_Newspaper\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Magikarp\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE4\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE4\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE4\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_ROUTE4_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route4_PokemonCenter_1F/scripts.inc",
    "content": ".equ MAGIKARP_PRICE, 500\n.set LOCALID_MAGIKARP_MASTER, 9\n.set TRAINER, VAR_0x8009\n\nRoute4_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route4_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nRoute4_PokemonCenter_1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_ROUTE4_POKEMON_CENTER_1F\n\tsetrespawn SPAWN_ROUTE4\n\tgoto Route4_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nRoute4_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_MAGIKARP\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route4_PokemonCenter_1F_MapScript_MagikarpMasterMovementType\n\tend\n\nRoute4_PokemonCenter_1F_MapScript_MagikarpMasterMovementType::\n\tsetobjectmovementtype LOCALID_MAGIKARP_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute4_PokemonCenter_1F_EventScript_Boy::\n\tmsgbox Route4_PokemonCenter_1F_Text_CanHaveSixMonsWithYou, MSGBOX_NPC\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_Gentleman::\n\tlock\n\tmsgbox Route4_PokemonCenter_1F_Text_TeamRocketAttacksCerulean\n\trelease\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_MagikarpSalesman::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_BOUGHT_MAGIKARP, Route4_PokemonCenter_1F_EventScript_AlreadyBoughtMagikarp\n\tshowmoneybox 0, 0\n\tcheckplayergender\n\tgoto_if_eq VAR_RESULT, MALE, Route4_PokemonCenter_1F_EventScript_AskBuyMagikarpMale\n\tgoto_if_eq VAR_RESULT, FEMALE, Route4_PokemonCenter_1F_EventScript_AskBuyMagikarpFemale\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_AskBuyMagikarpMale::\n\tmsgbox Route4_PokemonCenter_1F_Text_LaddieBuyMagikarpForJust500, MSGBOX_YESNO\n\tgoto Route4_PokemonCenter_1F_EventScript_TryBuyMagikarp\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_AskBuyMagikarpFemale::\n\tmsgbox Route4_PokemonCenter_1F_Text_SweetieBuyMagikarpForJust500, MSGBOX_YESNO\n\tgoto Route4_PokemonCenter_1F_EventScript_TryBuyMagikarp\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_TryBuyMagikarp::\n\tgoto_if_eq VAR_RESULT, NO, Route4_PokemonCenter_1F_EventScript_DeclineMagikarp\n\tcheckmoney MAGIKARP_PRICE\n\tgoto_if_eq VAR_RESULT, FALSE, Route4_PokemonCenter_1F_EventScript_NotEnoughMoney\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tsetvar VAR_TEMP_1, SPECIES_MAGIKARP\n\tgivemon SPECIES_MAGIKARP, 5\n\tgoto_if_eq VAR_RESULT, 0, Route4_PokemonCenter_1F_EventScript_BuyMagikarpParty\n\tgoto_if_eq VAR_RESULT, 1, Route4_PokemonCenter_1F_EventScript_BuyMagikarpPC\n\tgoto_if_eq VAR_RESULT, 2, Route4_PokemonCenter_1F_EventScript_NoRoomForMagikarp\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_BuyMagikarpParty::\n\tcall Route4_PokemonCenter_1F_EventScript_PayForMagikarp\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, Route4_PokemonCenter_1F_EventScript_NicknameMagikarpParty\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Route4_PokemonCenter_1F_EventScript_EndPurchaseMagikarp\nRoute4_PokemonCenter_1F_EventScript_NicknameMagikarpParty::\n\tcall EventScript_GetGiftMonPartySlot\n\tfadescreen FADE_TO_BLACK\n\thidemoneybox\n\tspecial ChangePokemonNickname\n\twaitstate\n\tgoto Route4_PokemonCenter_1F_EventScript_BoughtMagikarp\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_BuyMagikarpPC::\n\tcall Route4_PokemonCenter_1F_EventScript_PayForMagikarp\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, Route4_PokemonCenter_1F_EventScript_NicknameMagikarpPC\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, Route4_PokemonCenter_1F_EventScript_TransferMagikarpCloseMoneyBox\nRoute4_PokemonCenter_1F_EventScript_NicknameMagikarpPC::\n\tfadescreen FADE_TO_BLACK\n\thidemoneybox\n\tspecial ChangeBoxPokemonNickname\n\twaitstate\n\tlock\n\tfaceplayer\n\tgoto Route4_PokemonCenter_1F_EventScript_TransferMagikarp\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_TransferMagikarpCloseMoneyBox::\n\tcall EventScript_TransferredToPC\n\tgoto Route4_PokemonCenter_1F_EventScript_EndPurchaseMagikarp\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_TransferMagikarp::\n\tcall EventScript_TransferredToPC\n\tgoto Route4_PokemonCenter_1F_EventScript_BoughtMagikarp\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_EndPurchaseMagikarp::\n\thidemoneybox\n\tgoto Route4_PokemonCenter_1F_EventScript_BoughtMagikarp\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_BoughtMagikarp::\n\tsetflag FLAG_BOUGHT_MAGIKARP\n\trelease\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_PayForMagikarp::\n\tremovemoney MAGIKARP_PRICE\n\tupdatemoneybox\n\tplayfanfare MUS_LEVEL_UP\n\tmessage Route4_PokemonCenter_1F_Text_PaidOutrageouslyForMagikarp\n\twaitmessage\n\twaitfanfare\n\tbufferspeciesname STR_VAR_1, SPECIES_MAGIKARP\n\treturn\n\nRoute4_PokemonCenter_1F_EventScript_DeclineMagikarp::\n\tmsgbox Route4_PokemonCenter_1F_Text_OnlyDoingThisAsFavorToYou\n\thidemoneybox\n\trelease\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_NotEnoughMoney::\n\tmsgbox Route4_PokemonCenter_1F_Text_YoullNeedMoreMoney\n\thidemoneybox\n\trelease\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_AlreadyBoughtMagikarp::\n\tmsgbox Route4_PokemonCenter_1F_Text_IDontGiveRefunds\n\trelease\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_NoRoomForMagikarp::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox Route4_PokemonCenter_1F_Text_NoRoomForMorePokemon\n\thidemoneybox\n\trelease\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_Youngster::\n\tmsgbox Route4_PokemonCenter_1F_Text_ShouldStoreMonsUsingPC, MSGBOX_NPC\n\tend\n\nRoute4_PokemonCenter_1F_EventScript_Newspaper::\n\tlock\n\tmsgbox Route4_PokemonCenter_1F_Text_ItsANewspaper\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/Route4_PokemonCenter_1F/text.inc",
    "content": "Route4_PokemonCenter_1F_Text_CanHaveSixMonsWithYou::\n    .string \"Okay, set six POKé BALLS in my\\n\"\n    .string \"belt…\\p\"\n    .string \"Yeah, that'll do it. At most, you\\n\"\n    .string \"can have six POKéMON with you.$\"\n\nRoute4_PokemonCenter_1F_Text_TeamRocketAttacksCerulean::\n    .string \"TEAM ROCKET attacks CERULEAN\\n\"\n    .string \"citizens…\\p\"\n    .string \"Not a day goes by without TEAM\\n\"\n    .string \"ROCKET being in the news.$\"\n\nRoute4_PokemonCenter_1F_Text_LaddieBuyMagikarpForJust500::\n    .string \"MAN: Hello there, laddie!\\n\"\n    .string \"Have I got a deal just for you!\\p\"\n    .string \"I'll let you have a secret POKéMON\\n\"\n    .string \"- a MAGIKARP - for just ¥500!\\p\"\n    .string \"So, you'll buy it, am I right?$\"\n\nRoute4_PokemonCenter_1F_Text_SweetieBuyMagikarpForJust500::\n    .string \"MAN: Hello there, sweetie pie!\\n\"\n    .string \"Have I got a deal just for you!\\p\"\n    .string \"I'll let you have a secret POKéMON\\n\"\n    .string \"- a MAGIKARP - for just ¥500!\\p\"\n    .string \"So, you'll buy it, am I right?$\"\n\nRoute4_PokemonCenter_1F_Text_PaidOutrageouslyForMagikarp::\n    .string \"{PLAYER} paid an outrageous ¥500\\n\"\n    .string \"and bought the MAGIKARP…$\"\n\nRoute4_PokemonCenter_1F_Text_OnlyDoingThisAsFavorToYou::\n    .string \"No? You say no? I'm only doing this\\n\"\n    .string \"as a favor to you!$\"\n\nRoute4_PokemonCenter_1F_Text_NoRoomForMorePokemon::\n    .string \"There's no more room for any more\\n\"\n    .string \"POKéMON, it looks like.$\"\n\nRoute4_PokemonCenter_1F_Text_YoullNeedMoreMoney::\n    .string \"You'll need more money than that!$\"\n\nRoute4_PokemonCenter_1F_Text_IDontGiveRefunds::\n    .string \"MAN: Well, I don't give refunds.\\n\"\n    .string \"You knew what you were getting!$\"\n\nRoute4_PokemonCenter_1F_Text_ShouldStoreMonsUsingPC::\n    .string \"Sometimes, you'll have too many\\n\"\n    .string \"POKéMON with you to add any more.\\p\"\n    .string \"In that case, you should just\\n\"\n    .string \"store some using any PC.$\"\n\nRoute4_PokemonCenter_1F_Text_ItsANewspaper::\n    .string \"It's a newspaper.$\"\n\n"
  },
  {
    "path": "data/maps/Route4_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE4_POKEMON_CENTER_2F\",\n  \"name\": \"Route4_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_4\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_ROUTE4_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route4_PokemonCenter_2F/scripts.inc",
    "content": "Route4_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nRoute4_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nRoute4_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nRoute4_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/Route5/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE5\",\n  \"name\": \"Route5\",\n  \"layout\": \"LAYOUT_ROUTE5\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_5\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_CERULEAN_CITY\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_SAFFRON_CITY_CONNECTION\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BLACK_BELT\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Mankey\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 31,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNDERGROUND_PATH_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 23,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE5_POKEMON_DAY_CARE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 24,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE5_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE5_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 32,\n      \"y\": 32,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route5_EventScript_UndergroundPathSign\"\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/Route5/scripts.inc",
    "content": ".set LOCALID_MANKEY_MASTER, 1\n.set TRAINER, VAR_0x8009\n\nRoute5_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route5_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute5_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_MANKEY\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route5_MapScript_MankeyMasterMovementType\n\tend\n\nRoute5_MapScript_MankeyMasterMovementType::\n\tsetobjectmovementtype LOCALID_MANKEY_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute5_EventScript_UndergroundPathSign::\n\tmsgbox Route5_Text_UndergroundPathSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route5/text.inc",
    "content": "Route5_Text_UndergroundPathSign::\n    .string \"UNDERGROUND PATH\\n\"\n    .string \"CERULEAN CITY - VERMILION CITY$\"\n\n"
  },
  {
    "path": "data/maps/Route5_PokemonDayCare/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE5_POKEMON_DAY_CARE\",\n  \"name\": \"Route5_PokemonDayCare\",\n  \"layout\": \"LAYOUT_ROUTE5_POKEMON_DAY_CARE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_5\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route5_PokemonDayCare_EventScript_DaycareMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE5\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE5\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE5\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route5_PokemonDayCare/scripts.inc",
    "content": "@ Handled by data/scripts/day_care.inc\n\nRoute5_PokemonDayCare_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/Route5_PokemonDayCare/text.inc",
    "content": "Route5_PokemonDayCare_Text_WantMeToRaiseMon::\n\t.string \"I run the DAY-CARE service.\\p\"\n\t.string \"Would you like me to raise one of\\n\"\n\t.string \"your POKéMON?$\"\n\nRoute5_PokemonDayCare_Text_ComeAgain::\n\t.string \"Come again.$\"\n\nRoute5_PokemonDayCare_Text_WhichMonShouldIRaise::\n\t.string \"Which POKéMON should I raise?$\"\n\nRoute5_PokemonDayCare_Text_ComeAnytimeYouLike::\n\t.string \"Fine.\\n\"\n\t.string \"Come anytime you like.$\"\n\nRoute5_PokemonDayCare_Text_LookAfterMonForAWhile::\n\t.string \"Fine, I'll look after your\\n\"\n\t.string \"{STR_VAR_1} for a while.$\"\n\nRoute5_PokemonDayCare_Text_ComeSeeMeInAWhile::\n\t.string \"Come see me in a while.$\"\n\nRoute5_PokemonDayCare_Text_MonNeedsToSpendMoreTime::\n\t.string \"You're back already?\\p\"\n\t.string \"Your {STR_VAR_1} needs to spend\\n\"\n\t.string \"some more time with me.$\"\n\nRoute5_PokemonDayCare_Text_OweMeXForMonsReturn::\n\t.string \"You owe me ¥{STR_VAR_2} for the return\\n\"\n\t.string \"of this POKéMON.$\"\n\nRoute5_PokemonDayCare_Text_ThankYouHeresMon::\n\t.string \"Thank you!\\n\"\n\t.string \"Here's your POKéMON.$\"\n\nRoute5_PokemonDayCare_Text_PlayerGotMonBack::\n\t.string \"{PLAYER} got {STR_VAR_2} back\\n\"\n\t.string \"from the DAY-CARE MAN.$\"\n\nRoute5_PokemonDayCare_Text_OnlyHaveOneMonWithYou::\n\t.string \"Oh? You only have one POKéMON\\n\"\n\t.string \"with you.$\"\n\nRoute5_PokemonDayCare_Text_WhatWillYouBattleWith::\n\t.string \"If you leave me that POKéMON,\\n\"\n\t.string \"what will you battle with?$\"\n\nRoute5_PokemonDayCare_Text_MonHasGrownByXLevels::\n\t.string \"Your {STR_VAR_1} has grown a lot.\\n\"\n\t.string \"Yes, quite a lot, I'd say.\\p\"\n\t.string \"Let me see… It started at {STR_VAR_3},\\n\"\n\t.string \"so by level it's grown by {STR_VAR_2}.\\p\"\n\t.string \"Aren't I great?$\"\n\nRoute5_PokemonDayCare_Text_YouveGotNoRoomForIt::\n\t.string \"You can't take this POKéMON back\\n\"\n\t.string \"if you've got no room for it.$\"\n\nRoute5_PokemonDayCare_Text_DontHaveEnoughMoney::\n\t.string \"You don't have enough money.$\"\n"
  },
  {
    "path": "data/maps/Route5_SouthEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE5_SOUTH_ENTRANCE\",\n  \"name\": \"Route5_SouthEntrance\",\n  \"layout\": \"LAYOUT_SAFFRON_CITY_NORTH_SOUTH_ENTRANCE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_5\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route5_SouthEntrance_EventScript_Guard\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"9\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE5\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"9\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE5\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES\",\n      \"var_value\": \"0\",\n      \"script\": \"Route5_SouthEntrance_EventScript_GuardTriggerLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES\",\n      \"var_value\": \"0\",\n      \"script\": \"Route5_SouthEntrance_EventScript_GuardTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES\",\n      \"var_value\": \"0\",\n      \"script\": \"Route5_SouthEntrance_EventScript_GuardTriggerRight\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route5_SouthEntrance/scripts.inc",
    "content": "Route5_SouthEntrance_MapScripts::\n\t.byte 0\n\nRoute5_SouthEntrance_EventScript_Guard::\n\tmsgbox Route5_SouthEntrance_Text_HiHowsItGoing, MSGBOX_NPC\n\tend\n\nRoute5_SouthEntrance_EventScript_GuardTriggerLeft::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto Route5_SouthEntrance_EventScript_GuardTrigger\n\tend\n\nRoute5_SouthEntrance_EventScript_GuardTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto Route5_SouthEntrance_EventScript_GuardTrigger\n\tend\n\nRoute5_SouthEntrance_EventScript_GuardTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tgoto Route5_SouthEntrance_EventScript_GuardTrigger\n\tend\n\nRoute5_SouthEntrance_EventScript_GuardTrigger::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tgoto_if_set FLAG_GOT_TEA, Route5_SouthEntrance_EventScript_GiveTea\n\tmsgbox Route5_SouthEntrance_Text_ThirstyOnGuardDuty\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route5_SouthEntrance_Movement_BlockPlayerEntry\n\twaitmovement 0\n\treleaseall\n\tend\n\nRoute5_SouthEntrance_EventScript_GiveTea::\n\tremoveitem ITEM_TEA\n\tgoto Route5_SouthEntrance_EventScript_GuardDrinkTea\n\tend\n\nRoute5_SouthEntrance_EventScript_GuardDrinkTea::\n\tmsgbox Route5_SouthEntrance_Text_ThatTeaLooksTasty\n\tclosemessage\n\tcall_if_eq VAR_TEMP_1, 0, Route5_SouthEntrance_EventScript_WalkToGuardLeft\n\tcall_if_eq VAR_TEMP_1, 1, Route5_SouthEntrance_EventScript_WalkToGuardMid\n\tcall_if_eq VAR_TEMP_1, 2, Route5_SouthEntrance_EventScript_WalkToGuardRight\n\tmsgbox Route5_SouthEntrance_Text_ThanksIllShareTeaWithGuards\n\tsetvar VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES, 1\n\treleaseall\n\tend\n\nRoute5_SouthEntrance_EventScript_WalkToGuardLeft::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route5_SouthEntrance_Movement_WalkToGuardLeft\n\twaitmovement 0\n\treturn\n\nRoute5_SouthEntrance_EventScript_WalkToGuardMid::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route5_SouthEntrance_Movement_WalkToGuardMid\n\twaitmovement 0\n\treturn\n\nRoute5_SouthEntrance_EventScript_WalkToGuardRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route5_SouthEntrance_Movement_WalkToGuardRight\n\twaitmovement 0\n\treturn\n\nRoute5_SouthEntrance_Movement_WalkToGuardMid::\n\twalk_left\n\tstep_end\n\nRoute5_SouthEntrance_Movement_WalkToGuardRight::\n\twalk_left\n\twalk_left\n\tstep_end\n\nRoute5_SouthEntrance_Movement_WalkToGuardLeft::\n\twalk_in_place_left\n\tstep_end\n\nRoute5_SouthEntrance_Movement_BlockPlayerEntry::\n\twalk_up\n\tstep_end\n"
  },
  {
    "path": "data/maps/Route5_SouthEntrance/text.inc",
    "content": "Route5_SouthEntrance_Text_ThirstyOnGuardDuty::\n    .string \"I'm on guard duty.\\n\"\n    .string \"Gee, I'm thirsty, though!\\p\"\n    .string \"Oh, wait there, the road's closed.$\"\n\nRoute5_SouthEntrance_Text_ThatTeaLooksTasty::\n    .string \"Oh, that TEA…\\n\"\n    .string \"It looks awfully tasty…$\"\n\nRoute5_SouthEntrance_Text_ThanksIllShareTeaWithGuards::\n    .string \"Huh? I can have this drink?\\n\"\n    .string \"Gee, thanks!\\l\"\n    .string \"… …\\l\"\n    .string \"Glug, glug…\\l\"\n    .string \"… …\\l\"\n    .string \"Gulp…\\l\"\n    .string \"If you want to go to SAFFRON\\l\"\n    .string \"CITY…\\l\"\n    .string \"… …\\l\"\n    .string \"You can go on through.\\p\"\n    .string \"I'll share this TEA with the other\\n\"\n    .string \"guards!$\"\n\nRoute5_SouthEntrance_Text_HiHowsItGoing::\n    .string \"Hi, how's it going?$\"\n\n"
  },
  {
    "path": "data/maps/Route6/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE6\",\n  \"name\": \"Route6\",\n  \"layout\": \"LAYOUT_ROUTE6\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_6\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_SAFFRON_CITY_CONNECTION\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": -12,\n      \"map\": \"MAP_VERMILION_CITY\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"Route6_EventScript_Keigo\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route6_EventScript_Ricky\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route6_EventScript_Nancy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route6_EventScript_Elijah\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route6_EventScript_Isabelle\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route6_EventScript_Jeff\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Vulpix\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 19,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNDERGROUND_PATH_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE6_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE6_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 21,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route6_EventScript_UndergroundPathSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_SITRUS_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE6_SITRUS_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 19,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_RARE_CANDY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE6_RARE_CANDY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/Route6/scripts.inc",
    "content": ".set LOCALID_VULPIX_MASTER, 7\n.set TRAINER, VAR_0x8009\n\nRoute6_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route6_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute6_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_VULPIX\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route6_MapScript_VulpixMasterMovementType\n\tend\n\nRoute6_MapScript_VulpixMasterMovementType::\n\tsetobjectmovementtype LOCALID_VULPIX_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute6_EventScript_UndergroundPathSign::\n\tmsgbox Route6_Text_UndergroundPathSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route6/text.inc",
    "content": "Route6_Text_RickyIntro::\n    .string \"Who's there?\\n\"\n    .string \"Quit listening in on us!$\"\n\nRoute6_Text_RickyDefeat::\n    .string \"I just can't win!$\"\n\nRoute6_Text_RickyPostBattle::\n    .string \"Whisper…\\n\"\n    .string \"Whisper…$\"\n\nRoute6_Text_NancyIntro::\n    .string \"Excuse me!\\n\"\n    .string \"This is a private conversation!$\"\n\nRoute6_Text_NancyDefeat::\n    .string \"Ugh!\\n\"\n    .string \"I hate losing.$\"\n\nRoute6_Text_NancyPostBattle::\n    .string \"Whisper…\\n\"\n    .string \"Whisper…$\"\n\nRoute6_Text_KeigoIntro::\n    .string \"There aren't many bugs out here.$\"\n\nRoute6_Text_KeigoDefeat::\n    .string \"No!\\n\"\n    .string \"You're kidding!$\"\n\nRoute6_Text_KeigoPostBattle::\n    .string \"I like bugs, so I'm going back to\\n\"\n    .string \"VIRIDIAN FOREST.$\"\n\nRoute6_Text_JeffIntro::\n    .string \"Huh?\\n\"\n    .string \"You want to talk to me?$\"\n\nRoute6_Text_JeffDefeat::\n    .string \"This stinks…\\n\"\n    .string \"I couldn't beat your challenge…$\"\n\nRoute6_Text_JeffPostBattle::\n    .string \"I should bring more POKéMON with\\n\"\n    .string \"me. I'll feel safer that way.$\"\n\nRoute6_Text_IsabelleIntro::\n    .string \"Me?\\n\"\n    .string \"Well, okay. I'll play!$\"\n\nRoute6_Text_IsabelleDefeat::\n    .string \"Things just didn't work…$\"\n\nRoute6_Text_IsabellePostBattle::\n    .string \"I want to get stronger.\\n\"\n    .string \"What's your secret?$\"\n\nRoute6_Text_ElijahIntro::\n    .string \"I've never seen you around.\\n\"\n    .string \"Are you good?$\"\n\nRoute6_Text_ElijahDefeat::\n    .string \"You're too good!$\"\n\nRoute6_Text_ElijahPostBattle::\n    .string \"Are my POKéMON weak?\\n\"\n    .string \"Or, am I just bad?\\l\"\n    .string \"Which do you think?$\"\n\nRoute6_Text_UndergroundPathSign::\n    .string \"UNDERGROUND PATH\\n\"\n    .string \"CERULEAN CITY - VERMILION CITY$\"\n\n"
  },
  {
    "path": "data/maps/Route6_NorthEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE6_NORTH_ENTRANCE\",\n  \"name\": \"Route6_NorthEntrance\",\n  \"layout\": \"LAYOUT_SAFFRON_CITY_NORTH_SOUTH_ENTRANCE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_6\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route6_NorthEntrance_EventScript_Guard\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"11\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"11\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE6\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE6\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES\",\n      \"var_value\": \"0\",\n      \"script\": \"Route6_NorthEntrance_EventScript_GuardTriggerLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES\",\n      \"var_value\": \"0\",\n      \"script\": \"Route6_NorthEntrance_EventScript_GuardTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES\",\n      \"var_value\": \"0\",\n      \"script\": \"Route6_NorthEntrance_EventScript_GuardTriggerRight\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route6_NorthEntrance/scripts.inc",
    "content": "Route6_NorthEntrance_MapScripts::\n\t.byte 0\n\nRoute6_NorthEntrance_EventScript_Guard::\n\tmsgbox Route6_NorthEntrance_Text_HiHowsItGoing, MSGBOX_NPC\n\tend\n\nRoute6_NorthEntrance_EventScript_GuardTriggerLeft::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto Route6_NorthEntrance_EventScript_GuardTrigger\n\tend\n\nRoute6_NorthEntrance_EventScript_GuardTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto Route6_NorthEntrance_EventScript_GuardTrigger\n\tend\n\nRoute6_NorthEntrance_EventScript_GuardTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tgoto Route6_NorthEntrance_EventScript_GuardTrigger\n\tend\n\nRoute6_NorthEntrance_EventScript_GuardTrigger::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tgoto_if_set FLAG_GOT_TEA, Route6_NorthEntrance_EventScript_GiveTea\n\tmsgbox Route6_NorthEntrance_Text_ThirstyOnGuardDuty\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route6_NorthEntrance_Movement_BlockPlayerEntry\n\twaitmovement 0\n\treleaseall\n\tend\n\nRoute6_NorthEntrance_EventScript_GiveTea::\n\tremoveitem ITEM_TEA\n\tgoto Route6_NorthEntrance_EventScript_GuardDrinkTea\n\tend\n\nRoute6_NorthEntrance_EventScript_GuardDrinkTea::\n\tmsgbox Route6_NorthEntrance_Text_ThatTeaLooksTasty\n\tclosemessage\n\tcall_if_eq VAR_TEMP_1, 0, Route6_NorthEntrance_EventScript_WalkToGuardLeft\n\tcall_if_eq VAR_TEMP_1, 1, Route6_NorthEntrance_EventScript_WalkToGuardMid\n\tcall_if_eq VAR_TEMP_1, 2, Route6_NorthEntrance_EventScript_WalkToGuardRight\n\tmsgbox Route6_NorthEntrance_Text_ThanksIllShareTeaWithGuards\n\tsetvar VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES, 1\n\treleaseall\n\tend\n\nRoute6_NorthEntrance_EventScript_WalkToGuardLeft::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route6_NorthEntrance_Movement_WalkToGuardLeft\n\twaitmovement 0\n\treturn\n\nRoute6_NorthEntrance_EventScript_WalkToGuardMid::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route6_NorthEntrance_Movement_WalkToGuardMid\n\twaitmovement 0\n\treturn\n\nRoute6_NorthEntrance_EventScript_WalkToGuardRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route6_NorthEntrance_Movement_WalkToGuardRight\n\twaitmovement 0\n\treturn\n\nRoute6_NorthEntrance_Movement_WalkToGuardLeft::\n\twalk_right\n\twalk_right\n\tstep_end\n\nRoute6_NorthEntrance_Movement_WalkToGuardMid::\n\twalk_right\n\tstep_end\n\nRoute6_NorthEntrance_Movement_WalkToGuardRight::\n\twalk_in_place_right\n\tstep_end\n\nRoute6_NorthEntrance_Movement_BlockPlayerEntry::\n\twalk_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/Route6_NorthEntrance/text.inc",
    "content": "Route6_NorthEntrance_Text_ThirstyOnGuardDuty::\n    .string \"I'm on guard duty.\\n\"\n    .string \"Gee, I'm thirsty, though!\\p\"\n    .string \"Oh, wait there, the road's closed.$\"\n\nRoute6_NorthEntrance_Text_ThatTeaLooksTasty::\n    .string \"Oh, that TEA…\\n\"\n    .string \"It looks awfully tasty…$\"\n\nRoute6_NorthEntrance_Text_ThanksIllShareTeaWithGuards::\n    .string \"Huh? I can have this drink?\\n\"\n    .string \"Gee, thanks!\\l\"\n    .string \"… …\\l\"\n    .string \"Glug, glug…\\l\"\n    .string \"… …\\l\"\n    .string \"Gulp…\\l\"\n    .string \"If you want to go to SAFFRON\\l\"\n    .string \"CITY…\\l\"\n    .string \"… …\\l\"\n    .string \"You can go on through.\\p\"\n    .string \"I'll share this TEA with the other\\n\"\n    .string \"guards!$\"\n\nRoute6_NorthEntrance_Text_HiHowsItGoing::\n    .string \"Hi, how's it going?$\"\n\n"
  },
  {
    "path": "data/maps/Route6_UnusedHouse/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE6_UNUSED_HOUSE\",\n  \"name\": \"Route6_UnusedHouse\",\n  \"layout\": \"LAYOUT_HOUSE2\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_6\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route6_UnusedHouse/scripts.inc",
    "content": "Route6_UnusedHouse_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/Route7/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE7\",\n  \"name\": \"Route7\",\n  \"layout\": \"LAYOUT_ROUTE7\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_7\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": -10,\n      \"map\": \"MAP_CELADON_CITY\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": -10,\n      \"map\": \"MAP_SAFFRON_CITY_CONNECTION\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"clone\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"x\": -8,\n      \"y\": 12,\n      \"target_local_id\": 10,\n      \"target_map\": \"MAP_CELADON_CITY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Growlithe\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNDERGROUND_PATH_WEST_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE7_EAST_ENTRANCE\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route7_EventScript_UndergroundPathSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 16,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"item\": \"ITEM_QUALOT_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE7_QUALOT_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route7/scripts.inc",
    "content": ".set LOCALID_GROWLITHE_MASTER, 2\n.set TRAINER, VAR_0x8009\n\nRoute7_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route7_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute7_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_GROWLITHE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route7_MapScript_GrowlitheMasterMovementType\n\tend\n\nRoute7_MapScript_GrowlitheMasterMovementType::\n\tsetobjectmovementtype LOCALID_GROWLITHE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute7_EventScript_UndergroundPathSign::\n\tmsgbox Route7_Text_UndergroundPathSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route7/text.inc",
    "content": "Route7_Text_UndergroundPathSign::\n    .string \"UNDERGROUND PATH\\n\"\n    .string \"CELADON CITY - LAVENDER TOWN$\"\n\n"
  },
  {
    "path": "data/maps/Route7_EastEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE7_EAST_ENTRANCE\",\n  \"name\": \"Route7_EastEntrance\",\n  \"layout\": \"LAYOUT_SAFFRON_CITY_EAST_WEST_ENTRANCE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_7\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route7_EastEntrance_EventScript_Guard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Sandslash\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE7\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE7\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"8\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES\",\n      \"var_value\": \"0\",\n      \"script\": \"Route7_EastEntrance_EventScript_GuardTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES\",\n      \"var_value\": \"0\",\n      \"script\": \"Route7_EastEntrance_EventScript_GuardTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES\",\n      \"var_value\": \"0\",\n      \"script\": \"Route7_EastEntrance_EventScript_GuardTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route7_EastEntrance/scripts.inc",
    "content": ".set LOCALID_SANDSLASH_MASTER, 2\n.set TRAINER, VAR_0x8009\n\nRoute7_EastEntrance_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route7_EastEntrance_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute7_EastEntrance_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_SANDSLASH\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route7_EastEntrance_MapScript_SandslashMasterMovementType\n\tend\n\nRoute7_EastEntrance_MapScript_SandslashMasterMovementType::\n\tsetobjectmovementtype LOCALID_SANDSLASH_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute7_EastEntrance_EventScript_Guard::\n\tmsgbox Route7_EastEntrance_Text_HiHowsItGoing, MSGBOX_NPC\n\tend\n\nRoute7_EastEntrance_EventScript_GuardTriggerTop::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto Route7_EastEntrance_EventScript_GuardTrigger\n\tend\n\nRoute7_EastEntrance_EventScript_GuardTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto Route7_EastEntrance_EventScript_GuardTrigger\n\tend\n\nRoute7_EastEntrance_EventScript_GuardTriggerBottom::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tgoto Route7_EastEntrance_EventScript_GuardTrigger\n\tend\n\nRoute7_EastEntrance_EventScript_GuardTrigger::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tgoto_if_set FLAG_GOT_TEA, Route7_EastEntrance_EventScript_GiveTea\n\tmsgbox Route7_EastEntrance_Text_ThirstyOnGuardDuty\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route7_EastEntrance_Movement_BlockPlayerEntry\n\twaitmovement 0\n\treleaseall\n\tend\n\nRoute7_EastEntrance_EventScript_GiveTea::\n\tremoveitem ITEM_TEA\n\tgoto Route7_EastEntrance_EventScript_GuardDrinkTea\n\tend\n\nRoute7_EastEntrance_EventScript_GuardDrinkTea::\n\tmsgbox Route7_EastEntrance_Text_ThatTeaLooksTasty\n\tclosemessage\n\tcall_if_eq VAR_TEMP_1, 0, Route7_EastEntrance_WalkToGuardTop\n\tcall_if_eq VAR_TEMP_1, 1, Route7_EastEntrance_WalkToGuardMid\n\tcall_if_eq VAR_TEMP_1, 2, Route7_EastEntrance_WalkToGuardBottom\n\tmsgbox Route7_EastEntrance_Text_ThanksIllShareTeaWithGuards\n\tsetvar VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES, 1\n\treleaseall\n\tend\n\nRoute7_EastEntrance_WalkToGuardTop::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route7_EastEntrance_Movement_WalkToGuardTop\n\twaitmovement 0\n\treturn\n\nRoute7_EastEntrance_WalkToGuardMid::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route7_EastEntrance_Movement_WalkToGuardMid\n\twaitmovement 0\n\treturn\n\nRoute7_EastEntrance_WalkToGuardBottom::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route7_EastEntrance_Movement_WalkToGuardBottom\n\twaitmovement 0\n\treturn\n\nRoute7_EastEntrance_Movement_WalkToGuardMid::\n\twalk_up\n\tstep_end\n\nRoute7_EastEntrance_Movement_WalkToGuardBottom::\n\twalk_up\n\twalk_up\n\tstep_end\n\nRoute7_EastEntrance_Movement_WalkToGuardTop::\n\twalk_in_place_up\n\tstep_end\n\nRoute7_EastEntrance_Movement_BlockPlayerEntry::\n\twalk_left\n\tstep_end\n"
  },
  {
    "path": "data/maps/Route7_EastEntrance/text.inc",
    "content": "Route7_EastEntrance_Text_ThirstyOnGuardDuty::\n    .string \"I'm on guard duty.\\n\"\n    .string \"Gee, I'm thirsty, though!\\p\"\n    .string \"Oh, wait there, the road's closed.$\"\n\nRoute7_EastEntrance_Text_ThatTeaLooksTasty::\n    .string \"Oh, that TEA…\\n\"\n    .string \"It looks awfully tasty…$\"\n\nRoute7_EastEntrance_Text_ThanksIllShareTeaWithGuards::\n    .string \"Huh? I can have this drink?\\n\"\n    .string \"Gee, thanks!\\l\"\n    .string \"… …\\l\"\n    .string \"Glug, glug…\\l\"\n    .string \"… …\\l\"\n    .string \"Gulp…\\l\"\n    .string \"If you want to go to SAFFRON\\l\"\n    .string \"CITY…\\l\"\n    .string \"… …\\l\"\n    .string \"You can go on through.\\p\"\n    .string \"I'll share this TEA with the other\\n\"\n    .string \"guards!$\"\n\nRoute7_EastEntrance_Text_HiHowsItGoing::\n    .string \"Hi, how's it going?$\"\n\n"
  },
  {
    "path": "data/maps/Route8/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE8\",\n  \"name\": \"Route8\",\n  \"layout\": \"LAYOUT_ROUTE8\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_8\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": -10,\n      \"map\": \"MAP_SAFFRON_CITY_CONNECTION\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 0,\n      \"map\": \"MAP_LAVENDER_TOWN\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 62,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"6\",\n      \"script\": \"Route8_EventScript_Julia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 55,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route8_EventScript_Rich\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"x\": 51,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route8_EventScript_Glenn\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route8_EventScript_Paige\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"x\": 29,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"6\",\n      \"script\": \"Route8_EventScript_Leslie\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route8_EventScript_Andrea\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"6\",\n      \"script\": \"Route8_EventScript_Megan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route8_EventScript_Stan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route8_EventScript_Aidan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_8_CUT_TREE_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 47,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_8_CUT_TREE_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TWIN\",\n      \"x\": 40,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route8_EventScript_Eli\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TWIN\",\n      \"x\": 41,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route8_EventScript_Anne\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP\",\n      \"movement_range_x\": 5,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route8_EventScript_Ricardo\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT\",\n      \"movement_range_x\": 5,\n      \"movement_range_y\": 5,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route8_EventScript_Jaren\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Beedrill\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 13,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNDERGROUND_PATH_EAST_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE8_WEST_ENTRANCE\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route8_EventScript_UndergroundPathSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 42,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"item\": \"ITEM_RAWST_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE8_RAWST_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 38,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LUM_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE8_LUM_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 42,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LEPPA_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE8_LEPPA_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/Route8/scripts.inc",
    "content": ".set LOCALID_BEEDRILL_MASTER, 16\n.set TRAINER, VAR_0x8009\n\nRoute8_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route8_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute8_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_BEEDRILL\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route8_MapScript_BeedrillMasterMovementType\n\tend\n\nRoute8_MapScript_BeedrillMasterMovementType::\n\tsetobjectmovementtype LOCALID_BEEDRILL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute8_EventScript_UndergroundPathSign::\n\tmsgbox Route8_Text_UndergroundPathSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route8/text.inc",
    "content": "Route8_Text_AidanIntro::\n    .string \"You look good at POKéMON, but how\\n\"\n    .string \"is your chemistry grade?$\"\n\nRoute8_Text_AidanDefeat::\n    .string \"Ow!\\n\"\n    .string \"Meltdown!$\"\n\nRoute8_Text_AidanPostBattle::\n    .string \"I am better at school than this!$\"\n\nRoute8_Text_StanIntro::\n    .string \"All right!\\n\"\n    .string \"Let's roll the dice!$\"\n\nRoute8_Text_StanDefeat::\n    .string \"Drat!\\n\"\n    .string \"Came up short!$\"\n\nRoute8_Text_StanPostBattle::\n    .string \"Lady luck's not with me today.$\"\n\nRoute8_Text_GlennIntro::\n    .string \"You should be informed.\\n\"\n    .string \"You need strategy to win at this!$\"\n\nRoute8_Text_GlennDefeat::\n    .string \"It's not logical!$\"\n\nRoute8_Text_GlennPostBattle::\n    .string \"Go with GRIMER first…and…\\n\"\n    .string \"…and…then…$\"\n\nRoute8_Text_PaigeIntro::\n    .string \"I like NIDORAN, so I collect them!$\"\n\nRoute8_Text_PaigeDefeat::\n    .string \"Why?\\n\"\n    .string \"Why??$\"\n\nRoute8_Text_PaigePostBattle::\n    .string \"When POKéMON grow up, they get\\n\"\n    .string \"ugly! They shouldn't evolve.$\"\n\nRoute8_Text_LeslieIntro::\n    .string \"School is fun, but so are POKéMON.$\"\n\nRoute8_Text_LeslieDefeat::\n    .string \"You made it clear to me that\\n\"\n    .string \"I should stick with school.$\"\n\nRoute8_Text_LesliePostBattle::\n    .string \"I was planning on getting some\\n\"\n    .string \"fresh air for a change, but…\\p\"\n    .string \"We're stuck here because of the\\n\"\n    .string \"gates at SAFFRON.$\"\n\nRoute8_Text_AndreaIntro::\n    .string \"MEOWTH is so cute, meow, meow,\\n\"\n    .string \"meow!$\"\n\nRoute8_Text_AndreaDefeat::\n    .string \"Meeeeyow!$\"\n\nRoute8_Text_AndreaPostBattle::\n    .string \"I think PIDGEY and RATTATA are\\n\"\n    .string \"cute, too!$\"\n\nRoute8_Text_MeganIntro::\n    .string \"We must look silly standing here\\n\"\n    .string \"like this.$\"\n\nRoute8_Text_MeganDefeat::\n    .string \"Look what you did to my poor, cute\\n\"\n    .string \"POKéMON!$\"\n\nRoute8_Text_MeganPostBattle::\n    .string \"SAFFRON's gatekeeper won't let us\\n\"\n    .string \"go through.\\p\"\n    .string \"I know he's doing his job, but I\\n\"\n    .string \"think he's mean.$\"\n\nRoute8_Text_RichIntro::\n    .string \"I'm a rambling, gambling dude!$\"\n\nRoute8_Text_RichDefeat::\n    .string \"Missed the big score!$\"\n\nRoute8_Text_RichPostBattle::\n    .string \"Gambling and POKéMON are like\\n\"\n    .string \"eating peanuts! I just can't stop!$\"\n\nRoute8_Text_JuliaIntro::\n    .string \"What's a cute, round, and fluffy\\n\"\n    .string \"POKéMON?$\"\n\nRoute8_Text_JuliaDefeat::\n    .string \"Stop!\\p\"\n    .string \"Don't be so mean to my CLEFAIRY!$\"\n\nRoute8_Text_JuliaPostBattle::\n    .string \"I read that CLEFAIRY evolves when\\n\"\n    .string \"it's exposed to a MOON STONE.\\p\"\n    .string \"I read that in a POKéMON JOURNAL.\\n\"\n    .string \"I wonder if it's true?$\"\n\nRoute8_Text_UndergroundPathSign::\n    .string \"UNDERGROUND PATH\\n\"\n    .string \"CELADON CITY - LAVENDER TOWN$\"\n\nRoute8_Text_EliIntro::\n    .string \"ELI: Twin power is fantastic.\\n\"\n    .string \"Did you know?$\"\n\nRoute8_Text_EliDefeat::\n    .string \"ELI: But…\\n\"\n    .string \"We used our twin power…$\"\n\nRoute8_Text_EliPostBattle::\n    .string \"ELI: I caught my POKéMON with\\n\"\n    .string \"ANNE!$\"\n\nRoute8_Text_EliNotEnoughMons::\n    .string \"ELI: We can't battle if you don't\\n\"\n    .string \"have two POKéMON.$\"\n\nRoute8_Text_AnneIntro::\n    .string \"ANNE: We'll shock you with our twin\\n\"\n    .string \"power!$\"\n\nRoute8_Text_AnneDefeat::\n    .string \"ANNE: Our twin power…$\"\n\nRoute8_Text_AnnePostBattle::\n    .string \"ANNE: I'm raising POKéMON with\\n\"\n    .string \"ELI.$\"\n\nRoute8_Text_AnneNotEnoughMons::\n    .string \"ANNE: Hi, hi! Let's battle!\\n\"\n    .string \"But bring two POKéMON.$\"\n\nRoute8_Text_RicardoIntro::\n    .string \"My bike's acting up, man.$\"\n\nRoute8_Text_RicardoDefeat::\n    .string \"Aww, man.\\n\"\n    .string \"I'm not into this.$\"\n\nRoute8_Text_RicardoPostBattle::\n    .string \"I got grass caught up in my\\n\"\n    .string \"spokes, man.$\"\n\nRoute8_Text_JarenIntro::\n    .string \"Clear the way, or I'll run you\\n\"\n    .string \"down!$\"\n\nRoute8_Text_JarenDefeat::\n    .string \"You for real, kid?$\"\n\nRoute8_Text_JarenPostBattle::\n    .string \"Don't think you're all special and\\n\"\n    .string \"all just because of this.$\"\n"
  },
  {
    "path": "data/maps/Route8_WestEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE8_WEST_ENTRANCE\",\n  \"name\": \"Route8_WestEntrance\",\n  \"layout\": \"LAYOUT_SAFFRON_CITY_EAST_WEST_ENTRANCE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_ROUTE_8\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POLICEMAN\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route8_WestEntrance_EventScript_Guard\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Cubone\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"10\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"10\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE8\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE8\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES\",\n      \"var_value\": \"0\",\n      \"script\": \"Route8_WestEntrance_EventScript_GuardTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES\",\n      \"var_value\": \"0\",\n      \"script\": \"Route8_WestEntrance_EventScript_GuardTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES\",\n      \"var_value\": \"0\",\n      \"script\": \"Route8_WestEntrance_EventScript_GuardTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/Route8_WestEntrance/scripts.inc",
    "content": ".set LOCALID_CUBONE_MASTER, 2\n.set TRAINER, VAR_0x8009\n\nRoute8_WestEntrance_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route8_WestEntrance_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute8_WestEntrance_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_CUBONE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route8_WestEntrance_MapScript_CuboneMasterMovementType\n\tend\n\nRoute8_WestEntrance_MapScript_CuboneMasterMovementType::\n\tsetobjectmovementtype LOCALID_CUBONE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute8_WestEntrance_EventScript_Guard::\n\tmsgbox Route8_WestEntrance_Text_HiHowsItGoing, MSGBOX_NPC\n\tend\n\nRoute8_WestEntrance_EventScript_GuardTriggerTop::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto Route8_WestEntrance_EventScript_GuardTrigger\n\tend\n\nRoute8_WestEntrance_EventScript_GuardTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto Route8_WestEntrance_EventScript_GuardTrigger\n\tend\n\nRoute8_WestEntrance_EventScript_GuardTriggerBottom::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tgoto Route8_WestEntrance_EventScript_GuardTrigger\n\tend\n\nRoute8_WestEntrance_EventScript_GuardTrigger::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tgoto_if_set FLAG_GOT_TEA, Route8_WestEntrance_EventScript_GiveTea\n\tmsgbox Route8_WestEntrance_Text_ThirstyOnGuardDuty\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route8_WestEntrance_Movement_BlockPlayerEntry\n\twaitmovement 0\n\treleaseall\n\tend\n\nRoute8_WestEntrance_EventScript_GiveTea::\n\tremoveitem ITEM_TEA\n\tgoto Route8_WestEntrance_EventScript_GuardDrinkTea\n\tend\n\n@ Unused\nRoute8_WestEntrance_EventScript_GiveSodaPop::\n\tremoveitem ITEM_SODA_POP\n\tgoto Route8_WestEntrance_EventScript_GuardDrinkTea\n\tend\n\n@ Unused\nRoute8_WestEntrance_EventScript_GiveLemonade::\n\tremoveitem ITEM_LEMONADE\n\tgoto Route8_WestEntrance_EventScript_GuardDrinkTea\n\tend\n\nRoute8_WestEntrance_EventScript_GuardDrinkTea::\n\tmsgbox Route8_WestEntrance_Text_ThatTeaLooksTasty\n\tclosemessage\n\tcall_if_eq VAR_TEMP_1, 0, Route8_WestEntrance_EventScript_WalkToGuardTop\n\tcall_if_eq VAR_TEMP_1, 1, Route8_WestEntrance_EventScript_WalkToGuardMid\n\tcall_if_eq VAR_TEMP_1, 2, Route8_WestEntrance_EventScript_WalkToGuardBottom\n\tmsgbox Route8_WestEntrance_Text_ThanksIllShareTeaWithGuards\n\tsetvar VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES, 1\n\treleaseall\n\tend\n\nRoute8_WestEntrance_EventScript_WalkToGuardTop::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route8_WestEntrance_Movement_WalkToGuardTop\n\twaitmovement 0\n\treturn\n\nRoute8_WestEntrance_EventScript_WalkToGuardMid::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route8_WestEntrance_Movement_WalkToGuardMid\n\twaitmovement 0\n\treturn\n\nRoute8_WestEntrance_EventScript_WalkToGuardBottom::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route8_WestEntrance_Movement_WalkToGuardBottom\n\twaitmovement 0\n\treturn\n\nRoute8_WestEntrance_Movement_WalkToGuardMid::\n\twalk_up\n\tstep_end\n\nRoute8_WestEntrance_Movement_WalkToGuardBottom::\n\twalk_up\n\twalk_up\n\tstep_end\n\nRoute8_WestEntrance_Movement_WalkToGuardTop::\n\twalk_in_place_up\n\tstep_end\n\nRoute8_WestEntrance_Movement_BlockPlayerEntry::\n\twalk_right\n\tstep_end\n"
  },
  {
    "path": "data/maps/Route8_WestEntrance/text.inc",
    "content": "Route8_WestEntrance_Text_ThirstyOnGuardDuty::\n    .string \"I'm on guard duty.\\n\"\n    .string \"Gee, I'm thirsty, though!\\p\"\n    .string \"Oh, wait there, the road's closed.$\"\n\nRoute8_WestEntrance_Text_ThatTeaLooksTasty::\n    .string \"Oh, that TEA…\\n\"\n    .string \"It looks awfully tasty…$\"\n\nRoute8_WestEntrance_Text_ThanksIllShareTeaWithGuards::\n    .string \"Huh? I can have this drink?\\n\"\n    .string \"Gee, thanks!\\l\"\n    .string \"… …\\l\"\n    .string \"Glug, glug…\\l\"\n    .string \"… …\\l\"\n    .string \"Gulp…\\l\"\n    .string \"If you want to go to SAFFRON\\l\"\n    .string \"CITY…\\l\"\n    .string \"… …\\l\"\n    .string \"You can go on through.\\p\"\n    .string \"I'll share this TEA with the other\\n\"\n    .string \"guards!$\"\n\nRoute8_WestEntrance_Text_HiHowsItGoing::\n    .string \"Hi, how's it going?$\"\n\n"
  },
  {
    "path": "data/maps/Route9/map.json",
    "content": "{\n  \"id\": \"MAP_ROUTE9\",\n  \"name\": \"Route9\",\n  \"layout\": \"LAYOUT_ROUTE9\",\n  \"music\": \"MUS_ROUTE3\",\n  \"region_map_section\": \"MAPSEC_ROUTE_9\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": -10,\n      \"map\": \"MAP_CERULEAN_CITY\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE10\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route9_EventScript_Alicia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route9_EventScript_Jeremy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 61,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route9_EventScript_Alan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route9_EventScript_Chris\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"Route9_EventScript_Brent\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 49,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"Route9_EventScript_Conner\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 53,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"Route9_EventScript_Brice\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 60,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"Route9_EventScript_Caitlin\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"Route9_EventScript_Drew\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_ROUTE_9_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route9_EventScript_ItemTM40\",\n      \"flag\": \"FLAG_HIDE_ROUTE9_TM40\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 65,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Route9_EventScript_ItemBurnHeal\",\n      \"flag\": \"FLAG_HIDE_ROUTE9_BURN_HEAL\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 58,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Ninetales\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 29,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"Route9_EventScript_RouteSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 15,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"item\": \"ITEM_ETHER\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE9_ETHER\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 63,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"item\": \"ITEM_RARE_CANDY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE9_RARE_CANDY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 48,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"item\": \"ITEM_CHESTO_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_ROUTE9_CHESTO_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/Route9/scripts.inc",
    "content": ".set LOCALID_NINETALES_MASTER, 13\n.set TRAINER, VAR_0x8009\n\nRoute9_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, Route9_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nRoute9_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_NINETALES\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, Route9_MapScript_NinetalesMasterMovementType\n\tend\n\nRoute9_MapScript_NinetalesMasterMovementType::\n\tsetobjectmovementtype LOCALID_NINETALES_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nRoute9_EventScript_RouteSign::\n\tmsgbox Route9_Text_RouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/Route9/text.inc",
    "content": "Route9_Text_AliciaIntro::\n    .string \"You have POKéMON with you!\\n\"\n    .string \"You're mine!$\"\n\nRoute9_Text_AliciaDefeat::\n    .string \"You deceived me…$\"\n\nRoute9_Text_AliciaPostBattle::\n    .string \"The tunnel coming up is pitch-black\\n\"\n    .string \"inside.\\p\"\n    .string \"You'll need FLASH to get through\\n\"\n    .string \"there.$\"\n\nRoute9_Text_ChrisIntro::\n    .string \"Who's that walking there with those\\n\"\n    .string \"good-looking POKéMON?$\"\n\nRoute9_Text_ChrisDefeat::\n    .string \"Out like a light!$\"\n\nRoute9_Text_ChrisPostBattle::\n    .string \"Keep walking!$\"\n\nRoute9_Text_DrewIntro::\n    .string \"I'm taking the ROCK TUNNEL to\\n\"\n    .string \"go to LAVENDER…$\"\n\nRoute9_Text_DrewDefeat::\n    .string \"Can't measure up…$\"\n\nRoute9_Text_DrewPostBattle::\n    .string \"Are you off to ROCK TUNNEL, too?$\"\n\nRoute9_Text_CaitlinIntro::\n    .string \"Don't you dare patronize me!$\"\n\nRoute9_Text_CaitlinDefeat::\n    .string \"No!\\n\"\n    .string \"You're too much.$\"\n\nRoute9_Text_CaitlinPostBattle::\n    .string \"You're obviously talented.\\n\"\n    .string \"Good luck to you!$\"\n\nRoute9_Text_JeremyIntro::\n    .string \"Bwahaha!\\n\"\n    .string \"Great! I was bored, eh!$\"\n\nRoute9_Text_JeremyDefeat::\n    .string \"Keep it coming, eh!\\p\"\n    .string \"Oh wait.\\n\"\n    .string \"I'm out of POKéMON!$\"\n\nRoute9_Text_JeremyPostBattle::\n    .string \"You sure had guts standing up to\\n\"\n    .string \"me there, eh?$\"\n\nRoute9_Text_BriceIntro::\n    .string \"Hahaha!\\n\"\n    .string \"Aren't you a little toughie!$\"\n\nRoute9_Text_BriceDefeat::\n    .string \"What's that?$\"\n\nRoute9_Text_BricePostBattle::\n    .string \"Hahaha!\\n\"\n    .string \"Kids should be tough!$\"\n\nRoute9_Text_BrentIntro::\n    .string \"I got up early every day to raise\\n\"\n    .string \"my POKéMON from cocoons!$\"\n\nRoute9_Text_BrentDefeat::\n    .string \"WHAT?\\p\"\n    .string \"What a total waste of time!$\"\n\nRoute9_Text_BrentPostBattle::\n    .string \"I have to collect more than bugs\\n\"\n    .string \"to get stronger…$\"\n\nRoute9_Text_AlanIntro::\n    .string \"Hahahaha!\\n\"\n    .string \"Bring it on!$\"\n\nRoute9_Text_AlanDefeat::\n    .string \"Hahahaha!\\n\"\n    .string \"You beat me fair!$\"\n\nRoute9_Text_AlanPostBattle::\n    .string \"Hahahaha!\\n\"\n    .string \"Us hearty guys always laugh!$\"\n\nRoute9_Text_ConnerIntro::\n    .string \"Go, my super BUG POKéMON!$\"\n\nRoute9_Text_ConnerDefeat::\n    .string \"My bugs…$\"\n\nRoute9_Text_ConnerPostBattle::\n    .string \"If you don't like BUG POKéMON,\\n\"\n    .string \"you bug me!$\"\n\nRoute9_Text_RouteSign::\n    .string \"ROUTE 9\\n\"\n    .string \"CERULEAN CITY - ROCK TUNNEL$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Corridor/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_1F_CORRIDOR\",\n  \"name\": \"SSAnne_1F_Corridor\",\n  \"layout\": \"LAYOUT_SSANNE_1F_CORRIDOR\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 18,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_1F_Corridor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"x\": 12,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_1F_Corridor_EventScript_WorkerM\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_2F_CORRIDOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_KITCHEN\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_EXTERIOR\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 0,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_EXTERIOR\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_KITCHEN\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_B1F_CORRIDOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_1F_ROOM1\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_1F_ROOM2\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_1F_ROOM3\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_1F_ROOM4\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_1F_ROOM5\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 23,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_1F_ROOM7\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_1F_ROOM6\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Corridor/scripts.inc",
    "content": "SSAnne_1F_Corridor_MapScripts::\n\t.byte 0\n\nSSAnne_1F_Corridor_EventScript_WorkerM::\n\tmsgbox SSAnne_1F_Corridor_Text_LeStrongSilentType, MSGBOX_NPC\n\tend\n\nSSAnne_1F_Corridor_EventScript_Sailor::\n\tmsgbox SSAnne_1F_Corridor_Text_PassengersAreRestless, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Corridor/text.inc",
    "content": "SSAnne_1F_Corridor_Text_LeStrongSilentType::\n    .string \"Bonjour!\\n\"\n    .string \"I am le waiter on this ship!\\p\"\n    .string \"I will be happy to serve you\\n\"\n    .string \"anything you please!\\p\"\n    .string \"… … …\\n\"\n    .string \"Ah! Le strong silent type!$\"\n\nSSAnne_1F_Corridor_Text_PassengersAreRestless::\n    .string \"The passengers are restless from\\n\"\n    .string \"this long voyage.\\p\"\n    .string \"You might be challenged by the\\n\"\n    .string \"more bored ones!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room1/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_1F_ROOM1\",\n  \"name\": \"SSAnne_1F_Room1\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM1\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_1F_Room1_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_1F_CORRIDOR\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room1/scripts.inc",
    "content": "SSAnne_1F_Room1_MapScripts::\n\t.byte 0\n\nSSAnne_1F_Room1_EventScript_Gentleman::\n\tmsgbox SSAnne_1F_Room1_Text_ImAGlobalPoliceAgent, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room1/text.inc",
    "content": "SSAnne_1F_Room1_Text_ImAGlobalPoliceAgent::\n    .string \"Ssh…!\\n\"\n    .string \"I'm a GLOBAL POLICE agent.\\p\"\n    .string \"I'm on the trail of TEAM ROCKET.\\n\"\n    .string \"They're up to nothing good!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room2/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_1F_ROOM2\",\n  \"name\": \"SSAnne_1F_Room2\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM1\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"x\": 5,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SSAnne_1F_Room2_EventScript_Ann\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"x\": 0,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SSAnne_1F_Room2_EventScript_Tyler\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SSAnne_1F_Room2_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_1F_Room2_EventScript_ItemTM31\",\n      \"flag\": \"FLAG_HIDE_SSANNE_1F_ROOM2_TM31\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_1F_CORRIDOR\",\n      \"dest_warp_id\": \"7\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room2/scripts.inc",
    "content": "SSAnne_1F_Room2_MapScripts::\n\t.byte 0\n\nSSAnne_1F_Room2_EventScript_Woman::\n\tmsgbox SSAnne_1F_Room2_Text_CruisingAroundWorld, MSGBOX_NPC\n\tend\n\nSSAnne_1F_Room2_EventScript_Ann::\n\ttrainerbattle_single TRAINER_LASS_ANN, SSAnne_1F_Room2_Text_AnnIntro, SSAnne_1F_Room2_Text_AnnDefeat\n\tmsgbox SSAnne_1F_Room2_Text_AnnPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSSAnne_1F_Room2_EventScript_Tyler::\n\ttrainerbattle_single TRAINER_YOUNGSTER_TYLER, SSAnne_1F_Room2_Text_TylerIntro, SSAnne_1F_Room2_Text_TylerDefeat\n\tmsgbox SSAnne_1F_Room2_Text_TylerPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room2/text.inc",
    "content": "SSAnne_1F_Room2_Text_TylerIntro::\n    .string \"I love POKéMON!\\n\"\n    .string \"Do you?$\"\n\nSSAnne_1F_Room2_Text_TylerDefeat::\n    .string \"Wow! \\n\"\n    .string \"You're great!$\"\n\nSSAnne_1F_Room2_Text_TylerPostBattle::\n    .string \"Listen, listen!\\n\"\n    .string \"Let me be your friend, okay?\\p\"\n    .string \"Then we can trade POKéMON and\\n\"\n    .string \"do stuff.$\"\n\nSSAnne_1F_Room2_Text_AnnIntro::\n    .string \"I collected these POKéMON\\n\"\n    .string \"from all around the world!$\"\n\nSSAnne_1F_Room2_Text_AnnDefeat::\n    .string \"Oh, no!\\n\"\n    .string \"I went around the world for these!$\"\n\nSSAnne_1F_Room2_Text_AnnPostBattle::\n    .string \"You hurt my poor POKéMON!\\p\"\n    .string \"I demand that you heal them at a\\n\"\n    .string \"POKéMON CENTER!$\"\n\nSSAnne_1F_Room2_Text_CruisingAroundWorld::\n    .string \"We are cruising around the world,\\n\"\n    .string \"my children and I.$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room3/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_1F_ROOM3\",\n  \"name\": \"SSAnne_1F_Room3\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM1\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_1F_Room3_EventScript_LittleGirl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WIGGLYTUFF\",\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_1F_Room3_EventScript_Wigglytuff\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 0,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_1F_Room3_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_1F_CORRIDOR\",\n      \"dest_warp_id\": \"8\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room3/scripts.inc",
    "content": "SSAnne_1F_Room3_MapScripts::\n\t.byte 0\n\nSSAnne_1F_Room3_EventScript_LittleGirl::\n\tmsgbox SSAnne_1F_Room3_Text_AlwaysTravelWithWigglytuff, MSGBOX_NPC\n\tend\n\nSSAnne_1F_Room3_EventScript_BaldingMan::\n\tmsgbox SSAnne_1F_Room3_Text_CruiseIsElegantAndCozy, MSGBOX_NPC\n\tend\n\nSSAnne_1F_Room3_EventScript_Wigglytuff::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_WIGGLYTUFF, CRY_MODE_NORMAL\n\tmsgbox SSAnne_1F_Room3_Text_Wigglytuff\n\twaitmoncry\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room3/text.inc",
    "content": "SSAnne_1F_Room3_Text_CruiseIsElegantAndCozy::\n    .string \"A world cruise is so elegant yet\\n\"\n    .string \"cozy!$\"\n\nSSAnne_1F_Room3_Text_AlwaysTravelWithWigglytuff::\n    .string \"I always travel with WIGGLYTUFF.\\n\"\n    .string \"I never leave home without it.$\"\n\nSSAnne_1F_Room3_Text_Wigglytuff::\n    .string \"WIGGLYTUFF: Puup pupuu!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room4/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_1F_ROOM4\",\n  \"name\": \"SSAnne_1F_Room4\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM1\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_1F_Room4_EventScript_Woman\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_1F_CORRIDOR\",\n      \"dest_warp_id\": \"9\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room4/scripts.inc",
    "content": "SSAnne_1F_Room4_MapScripts::\n\t.byte 0\n\nSSAnne_1F_Room4_EventScript_Woman::\n\tlock\n\tfaceplayer\n\tcheckplayergender\n\tgoto_if_eq VAR_RESULT, MALE, SSAnne_1F_Room4_EventScript_WomanPlayerMale\n\tmsgbox SSAnne_1F_Room4_Text_WaitressCherryPiePlease\n\trelease\n\tend\n\nSSAnne_1F_Room4_EventScript_WomanPlayerMale::\n\tmsgbox SSAnne_1F_Room4_Text_WaiterCherryPiePlease\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room4/text.inc",
    "content": "SSAnne_1F_Room4_Text_WaiterCherryPiePlease::\n    .string \"Waiter, I would like a cherry pie,\\n\"\n    .string \"please!$\"\n\nSSAnne_1F_Room4_Text_WaitressCherryPiePlease::\n    .string \"Waitress, I would like a cherry\\n\"\n    .string \"pie, please!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room5/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_1F_ROOM5\",\n  \"name\": \"SSAnne_1F_Room5\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM1\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"SSAnne_1F_Room5_EventScript_Arthur\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_1F_CORRIDOR\",\n      \"dest_warp_id\": \"10\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room5/scripts.inc",
    "content": "SSAnne_1F_Room5_MapScripts::\n\t.byte 0\n\nSSAnne_1F_Room5_EventScript_Arthur::\n\ttrainerbattle_single TRAINER_GENTLEMAN_ARTHUR, SSAnne_1F_Room5_Text_ArthurIntro, SSAnne_1F_Room5_Text_ArthurDefeat\n\tmsgbox SSAnne_1F_Room5_Text_ArthurPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room5/text.inc",
    "content": "SSAnne_1F_Room5_Text_ArthurIntro::\n    .string \"You insolent pup!\\n\"\n    .string \"How dare you barge in!$\"\n\nSSAnne_1F_Room5_Text_ArthurDefeat::\n    .string \"Humph! You rude child!\\n\"\n    .string \"You have no sense of courtesy!$\"\n\nSSAnne_1F_Room5_Text_ArthurPostBattle::\n    .string \"I wish to be left alone!\\n\"\n    .string \"Get out!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room6/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_1F_ROOM6\",\n  \"name\": \"SSAnne_1F_Room6\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM1\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_1F_Room6_EventScript_Woman\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_1F_CORRIDOR\",\n      \"dest_warp_id\": \"12\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room6/scripts.inc",
    "content": "SSAnne_1F_Room6_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD SSAnne_1F_Room6_MapScript_MakePc\n\t.byte 0\n\nSSAnne_1F_Room6_MapScript_MakePc:\n\tsetmetatile 0, 0, 0x3D0, 1\n\tsetmetatile 0, 1, 0x062, 1\n\tsetmetatile 0, 2, 0x3D1, 0\n\tsetmetatile 1, 2, 0x31D, 0\n\tend\n\nSSAnne_1F_Room6_EventScript_Woman::\n\tlock\n\tfaceplayer\n\tmsgbox SSAnne_1F_Room6_Text_TakeAShortRest, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, SSAnne_1F_Room6_EventScript_DeclineHeal\n\tclosemessage\n\tcall EventScript_OutOfCenterPartyHeal\n\tmsgbox SSAnne_1F_Room6_Text_GladEveryoneIsRefreshed\n\trelease\n\tend\n\nSSAnne_1F_Room6_EventScript_DeclineHeal::\n\tcheckplayergender\n\tgoto_if_eq VAR_RESULT, MALE, SSAnne_1F_Room6_EventScript_DeclineHealMale\n\tmsgbox SSAnne_1F_Room6_Text_SorryYouLookLikeMySister\n\trelease\n\tend\n\nSSAnne_1F_Room6_EventScript_DeclineHealMale::\n\tmsgbox SSAnne_1F_Room6_Text_SorryYouLookLikeMyBrother\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room6/text.inc",
    "content": "SSAnne_1F_Room6_Text_TakeAShortRest::\n    .string \"You look tired. Would you like to\\n\"\n    .string \"take a short rest?$\"\n\nSSAnne_1F_Room6_Text_GladEveryoneIsRefreshed::\n    .string \"I'm glad to see that everyone is\\n\"\n    .string \"looking refreshed and chipper.$\"\n\nSSAnne_1F_Room6_Text_SorryYouLookLikeMyBrother::\n    .string \"Oh, I'm sorry for fussing over you.\\n\"\n    .string \"You look like my little brother…$\"\n\nSSAnne_1F_Room6_Text_SorryYouLookLikeMySister::\n    .string \"Oh, I'm sorry for fussing over you.\\n\"\n    .string \"You look like my little sister…$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room7/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_1F_ROOM7\",\n  \"name\": \"SSAnne_1F_Room7\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM1\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"x\": 4,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SSAnne_1F_Room7_EventScript_Thomas\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_1F_CORRIDOR\",\n      \"dest_warp_id\": \"11\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room7/scripts.inc",
    "content": "SSAnne_1F_Room7_MapScripts::\n\t.byte 0\n\nSSAnne_1F_Room7_EventScript_Thomas::\n\ttrainerbattle_single TRAINER_GENTLEMAN_THOMAS, SSAnne_1F_Room7_Text_ThomasIntro, SSAnne_1F_Room7_Text_ThomasDefeat\n\tmsgbox SSAnne_1F_Room7_Text_ThomasPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_1F_Room7/text.inc",
    "content": "SSAnne_1F_Room7_Text_ThomasIntro::\n    .string \"I am but a solitary traveler…\\p\"\n    .string \"My sole companions and friends are\\n\"\n    .string \"POKéMON I caught on my journeys…$\"\n\nSSAnne_1F_Room7_Text_ThomasDefeat::\n    .string \"My, my friends…$\"\n\nSSAnne_1F_Room7_Text_ThomasPostBattle::\n    .string \"You should be nice to friends!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Corridor/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_2F_CORRIDOR\",\n  \"name\": \"SSAnne_2F_Corridor\",\n  \"layout\": \"LAYOUT_SSANNE_2F_CORRIDOR\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLUE\",\n      \"x\": 30,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_SS_ANNE_RIVAL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 2,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_2F_Corridor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_1F_CORRIDOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_3F_CORRIDOR\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 30,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_CAPTAINS_OFFICE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_2F_ROOM1\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_2F_ROOM2\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_2F_ROOM3\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_2F_ROOM4\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_2F_ROOM5\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 26,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_2F_ROOM6\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 30,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_S_S_ANNE_2F_CORRIDOR\",\n      \"var_value\": \"0\",\n      \"script\": \"SSAnne_2F_Corridor_EventScript_RivalTriggerLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 31,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_S_S_ANNE_2F_CORRIDOR\",\n      \"var_value\": \"0\",\n      \"script\": \"SSAnne_2F_Corridor_EventScript_RivalTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 32,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_S_S_ANNE_2F_CORRIDOR\",\n      \"var_value\": \"0\",\n      \"script\": \"SSAnne_2F_Corridor_EventScript_RivalTriggerRight\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Corridor/scripts.inc",
    "content": ".set LOCALID_RIVAL, 1\n\nSSAnne_2F_Corridor_MapScripts::\n\t.byte 0\n\nSSAnne_2F_Corridor_EventScript_RivalTriggerLeft::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto SSAnne_2F_Corridor_EventScript_RivalTrigger\n\tend\n\nSSAnne_2F_Corridor_EventScript_RivalTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto SSAnne_2F_Corridor_EventScript_RivalTrigger\n\tend\n\nSSAnne_2F_Corridor_EventScript_RivalTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tgoto SSAnne_2F_Corridor_EventScript_RivalTrigger\n\tend\n\nSSAnne_2F_Corridor_EventScript_RivalTrigger::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tplayse SE_EXIT\n\tdelay 5\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\taddobject LOCALID_RIVAL\n\tdelay 10\n\tapplymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tdelay 20\n\tcall_if_eq VAR_TEMP_1, 0, SSAnne_2F_Corridor_EventScript_RivalApproachLeft\n\tcall_if_eq VAR_TEMP_1, 1, SSAnne_2F_Corridor_EventScript_RivalApproachMid\n\tcall_if_eq VAR_TEMP_1, 2, SSAnne_2F_Corridor_EventScript_RivalApproachRight\n\tmsgbox SSAnne_2F_Corridor_Text_RivalIntro\n\tsetvar VAR_LAST_TALKED, LOCALID_RIVAL\n\tcall_if_eq VAR_STARTER_MON, 2, SSAnne_2F_Corridor_EventScript_RivalSquirtle\n\tcall_if_eq VAR_STARTER_MON, 1, SSAnne_2F_Corridor_EventScript_RivalBulbasaur\n\tcall_if_eq VAR_STARTER_MON, 0, SSAnne_2F_Corridor_EventScript_RivalCharmander\n\tmsgbox SSAnne_2F_Corridor_Text_RivalPostBattle\n\tclosemessage\n\tdelay 10\n\tplaybgm MUS_RIVAL_EXIT, 0\n\tcall_if_eq VAR_TEMP_1, 0, SSAnne_2F_Corridor_EventScript_RivalExitLeft\n\tcall_if_eq VAR_TEMP_1, 1, SSAnne_2F_Corridor_EventScript_RivalExitMid\n\tcall_if_eq VAR_TEMP_1, 2, SSAnne_2F_Corridor_EventScript_RivalExitRight\n\tfadedefaultbgm\n\tremoveobject LOCALID_RIVAL\n\tsetvar VAR_MAP_SCENE_S_S_ANNE_2F_CORRIDOR, 1\n\treleaseall\n\tend\n\nSSAnne_2F_Corridor_EventScript_RivalApproachLeft::\n\tapplymovement LOCALID_RIVAL, SSAnne_2F_Corridor_Movement_RivalApproachLeft\n\twaitmovement 0\n\treturn\n\nSSAnne_2F_Corridor_EventScript_RivalApproachMid::\n\tapplymovement LOCALID_RIVAL, SSAnne_2F_Corridor_Movement_RivalApproachMid\n\tapplymovement OBJ_EVENT_ID_PLAYER, SSAnne_2F_Corridor_Movement_PlayerFaceRivalMid\n\twaitmovement 0\n\treturn\n\nSSAnne_2F_Corridor_EventScript_RivalApproachRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, SSAnne_2F_Corridor_Movement_PlayerFaceRivalRight\n\tapplymovement LOCALID_RIVAL, SSAnne_2F_Corridor_Movement_RivalApproachRight\n\twaitmovement 0\n\treturn\n\nSSAnne_2F_Corridor_EventScript_RivalSquirtle::\n\ttrainerbattle_no_intro TRAINER_RIVAL_SS_ANNE_SQUIRTLE, SSAnne_2F_Corridor_Text_RivalDefeat\n\treturn\n\nSSAnne_2F_Corridor_EventScript_RivalBulbasaur::\n\ttrainerbattle_no_intro TRAINER_RIVAL_SS_ANNE_BULBASAUR, SSAnne_2F_Corridor_Text_RivalDefeat\n\treturn\n\nSSAnne_2F_Corridor_EventScript_RivalCharmander::\n\ttrainerbattle_no_intro TRAINER_RIVAL_SS_ANNE_CHARMANDER, SSAnne_2F_Corridor_Text_RivalDefeat\n\treturn\n\nSSAnne_2F_Corridor_EventScript_RivalExitLeft::\n\tapplymovement LOCALID_RIVAL, SSAnne_2F_Corridor_Movement_RivalExitLeft\n\twaitmovement 0\n\treturn\n\nSSAnne_2F_Corridor_EventScript_RivalExitMid::\n\tapplymovement LOCALID_RIVAL, SSAnne_2F_Corridor_Movement_RivalExitMid\n\twaitmovement 0\n\treturn\n\nSSAnne_2F_Corridor_EventScript_RivalExitRight::\n\tapplymovement LOCALID_RIVAL, SSAnne_2F_Corridor_Movement_RivalExitRight\n\twaitmovement 0\n\treturn\n\nSSAnne_2F_Corridor_Movement_PlayerFaceRivalRight::\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\twalk_in_place_faster_left\n\tstep_end\n\nSSAnne_2F_Corridor_Movement_PlayerFaceRivalMid::\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\twalk_in_place_faster_left\n\tstep_end\n\nSSAnne_2F_Corridor_Movement_RivalApproachLeft::\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nSSAnne_2F_Corridor_Movement_RivalApproachMid::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_in_place_faster_right\n\tstep_end\n\nSSAnne_2F_Corridor_Movement_RivalApproachRight::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\tdelay_4\n\tstep_end\n\nSSAnne_2F_Corridor_Movement_RivalExitLeft::\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nSSAnne_2F_Corridor_Movement_RivalExitMid::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nSSAnne_2F_Corridor_Movement_RivalExitRight::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nSSAnne_2F_Corridor_EventScript_Sailor::\n\tmsgbox SSAnne_2F_Corridor_Text_ThisShipIsLuxuryLiner, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Corridor/text.inc",
    "content": "SSAnne_2F_Corridor_Text_ThisShipIsLuxuryLiner::\n    .string \"This ship, she is a luxury liner for\\n\"\n    .string \"TRAINERS of the world!\\p\"\n    .string \"At every port, we hold parties with\\n\"\n    .string \"invited TRAINERS.$\"\n\nSSAnne_2F_Corridor_Text_RivalIntro::\n    .string \"{RIVAL}: Bonjour!\\n\"\n    .string \"{PLAYER}!\\p\"\n    .string \"Imagine seeing you here!\\n\"\n    .string \"{PLAYER}, were you really invited?\\p\"\n    .string \"So how's your POKéDEX coming?\\p\"\n    .string \"I already caught 40 kinds, pal.\\n\"\n    .string \"Different kinds are everywhere.\\p\"\n    .string \"Crawl around in grassy areas, and\\n\"\n    .string \"look hard for them.$\"\n\nSSAnne_2F_Corridor_Text_RivalDefeat::\n    .string \"Humph!\\p\"\n    .string \"At least you're raising your\\n\"\n    .string \"POKéMON!$\"\n\nSSAnne_2F_Corridor_Text_RivalPostBattle::\n    .string \"{RIVAL}: I heard there was a CUT\\n\"\n    .string \"master on board.\\p\"\n    .string \"But he was just a seasick old man!\\p\"\n    .string \"CUT itself is really useful.\\n\"\n    .string \"Yup, it'll be handy.\\p\"\n    .string \"You should go see him, too.\\n\"\n    .string \"Smell ya!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room1/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_2F_ROOM1\",\n  \"name\": \"SSAnne_2F_Room1\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM2\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"x\": 1,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_2F_Room1_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_2F_CORRIDOR\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room1/scripts.inc",
    "content": "SSAnne_2F_Room1_MapScripts::\n\t.byte 0\n\nSSAnne_2F_Room1_EventScript_Gentleman::\n\tlock\n\tfaceplayer\n\tmessage SSAnne_2F_Room1_Text_SleepingMonLookedLikeThis\n\twaitmessage\n\tsetvar VAR_0x8004, SPECIES_SNORLAX\n\tspecial SetSeenMon\n\tshowmonpic SPECIES_SNORLAX, 10, 3\n\twaitbuttonpress\n\thidemonpic\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room1/text.inc",
    "content": "SSAnne_2F_Room1_Text_SleepingMonLookedLikeThis::\n    .string \"I've journeyed far and wide, but in\\n\"\n    .string \"all my travels I've never seen\\l\"\n    .string \"any POKéMON sleep like this one!\\p\"\n    .string \"It was something like this!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room2/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_2F_ROOM2\",\n  \"name\": \"SSAnne_2F_Room2\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM2\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SSAnne_2F_Room2_EventScript_Dale\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"x\": 1,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SSAnne_2F_Room2_EventScript_Brooks\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_2F_Room2_EventScript_ItemStardust\",\n      \"flag\": \"FLAG_HIDE_SSANNE_2F_ROOM2_STARDUST\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_2F_CORRIDOR\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room2/scripts.inc",
    "content": "SSAnne_2F_Room2_MapScripts::\n\t.byte 0\n\nSSAnne_2F_Room2_EventScript_Dale::\n\ttrainerbattle_single TRAINER_FISHERMAN_DALE, SSAnne_2F_Room2_Text_DaleIntro, SSAnne_2F_Room2_Text_DaleDefeat\n\tmsgbox SSAnne_2F_Room2_Text_DalePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSSAnne_2F_Room2_EventScript_Brooks::\n\ttrainerbattle_single TRAINER_GENTLEMAN_BROOKS, SSAnne_2F_Room2_Text_BrooksIntro, SSAnne_2F_Room2_Text_BrooksDefeat\n\tmsgbox SSAnne_2F_Room2_Text_BrooksPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room2/text.inc",
    "content": "SSAnne_2F_Room2_Text_BrooksIntro::\n    .string \"Competing against the young keeps\\n\"\n    .string \"me youthful.$\"\n\nSSAnne_2F_Room2_Text_BrooksDefeat::\n    .string \"Good match!\\n\"\n    .string \"Ah, I feel young again!$\"\n\nSSAnne_2F_Room2_Text_BrooksPostBattle::\n    .string \"Fifteen years ago, I would\\n\"\n    .string \"have won!$\"\n\nSSAnne_2F_Room2_Text_DaleIntro::\n    .string \"Check out what I fished up!$\"\n\nSSAnne_2F_Room2_Text_DaleDefeat::\n    .string \"I'm all out!$\"\n\nSSAnne_2F_Room2_Text_DalePostBattle::\n    .string \"Party?\\p\"\n    .string \"The cruise ship's party should be\\n\"\n    .string \"over by now.$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room3/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_2F_ROOM3\",\n  \"name\": \"SSAnne_2F_Room3\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM2\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_2F_Room3_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_2F_Room3_EventScript_OldMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_2F_CORRIDOR\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room3/scripts.inc",
    "content": "SSAnne_2F_Room3_MapScripts::\n\t.byte 0\n\nSSAnne_2F_Room3_EventScript_Gentleman::\n\tmsgbox SSAnne_2F_Room3_Text_SeenMonsFerryPeople, MSGBOX_NPC\n\tend\n\nSSAnne_2F_Room3_EventScript_OldMan::\n\tmsgbox SSAnne_2F_Room3_Text_SomeTreesCanBeCutDown, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room3/text.inc",
    "content": "SSAnne_2F_Room3_Text_SeenMonsFerryPeople::\n    .string \"Ah, yes, I have seen some POKéMON\\n\"\n    .string \"ferry people across the water!$\"\n\nSSAnne_2F_Room3_Text_SomeTreesCanBeCutDown::\n    .string \"Small trees can be chopped down\\n\"\n    .string \"using the move CUT.\\p\"\n    .string \"But remember this!\\n\"\n    .string \"CUT is an HM technique.\\p\"\n    .string \"Once learned, it is not so easily\\n\"\n    .string \"discarded.$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room4/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_2F_ROOM4\",\n  \"name\": \"SSAnne_2F_Room4\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM2\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"x\": 0,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SSAnne_2F_Room4_EventScript_Lamar\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SSAnne_2F_Room4_EventScript_Dawn\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_2F_Room4_EventScript_ItemXAttack\",\n      \"flag\": \"FLAG_HIDE_SSANNE_2F_ROOM4_X_ATTACK\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_2F_CORRIDOR\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room4/scripts.inc",
    "content": "SSAnne_2F_Room4_MapScripts::\n\t.byte 0\n\nSSAnne_2F_Room4_EventScript_Lamar::\n\ttrainerbattle_single TRAINER_GENTLEMAN_LAMAR, SSAnne_2F_Room4_Text_LamarIntro, SSAnne_2F_Room4_Text_LamarDefeat\n\tmsgbox SSAnne_2F_Room4_Text_LamarPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSSAnne_2F_Room4_EventScript_Dawn::\n\ttrainerbattle_single TRAINER_LASS_DAWN, SSAnne_2F_Room4_Text_DawnIntro, SSAnne_2F_Room4_Text_DawnDefeat\n\tmsgbox SSAnne_2F_Room4_Text_DawnPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room4/text.inc",
    "content": "SSAnne_2F_Room4_Text_LamarIntro::\n    .string \"Which do you find more worthy,\\n\"\n    .string \"a strong or a rare POKéMON?$\"\n\nSSAnne_2F_Room4_Text_LamarDefeat::\n    .string \"I must salute you!$\"\n\nSSAnne_2F_Room4_Text_LamarPostBattle::\n    .string \"Personally, I prefer strong and\\n\"\n    .string \"rare POKéMON.$\"\n\nSSAnne_2F_Room4_Text_DawnIntro::\n    .string \"I don't believe I saw you at the\\n\"\n    .string \"party?$\"\n\nSSAnne_2F_Room4_Text_DawnDefeat::\n    .string \"Take it easy!$\"\n\nSSAnne_2F_Room4_Text_DawnPostBattle::\n    .string \"Oh, I adore your strong POKéMON!\\n\"\n    .string \"Oh, how I envy you for them!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room5/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_2F_ROOM5\",\n  \"name\": \"SSAnne_2F_Room5\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM2\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"x\": 5,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_2F_Room5_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_2F_Room5_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_2F_CORRIDOR\",\n      \"dest_warp_id\": \"7\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room5/scripts.inc",
    "content": "SSAnne_2F_Room5_MapScripts::\n\t.byte 0\n\nSSAnne_2F_Room5_EventScript_Gentleman::\n\tmsgbox SSAnne_2F_Room5_Text_HaveYouGoneToSafariZone, MSGBOX_NPC\n\tend\n\nSSAnne_2F_Room5_EventScript_LittleBoy::\n\tmsgbox SSAnne_2F_Room5_Text_WeThinkSafariZoneIsAwesome, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room5/text.inc",
    "content": "SSAnne_2F_Room5_Text_HaveYouGoneToSafariZone::\n    .string \"Have you gone to the SAFARI ZONE\\n\"\n    .string \"in FUCHSIA CITY?\\p\"\n    .string \"There are many kinds of rare\\n\"\n    .string \"POKéMON.$\"\n\nSSAnne_2F_Room5_Text_WeThinkSafariZoneIsAwesome::\n    .string \"Me and my daddy think the SAFARI\\n\"\n    .string \"ZONE is awesome!\\l\"\n    .string \"I wish we could go there again.$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room6/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_2F_ROOM6\",\n  \"name\": \"SSAnne_2F_Room6\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM2\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_3\",\n      \"x\": 1,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_2F_Room6_EventScript_Woman2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_2F_Room6_EventScript_Woman1\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_2F_CORRIDOR\",\n      \"dest_warp_id\": \"8\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room6/scripts.inc",
    "content": "SSAnne_2F_Room6_MapScripts::\n\t.byte 0\n\nSSAnne_2F_Room6_EventScript_Woman1::\n\tmsgbox SSAnne_2F_Room6_Text_CaptainIsAwfullySick, MSGBOX_NPC\n\tend\n\nSSAnne_2F_Room6_EventScript_Woman2::\n\tmsgbox SSAnne_2F_Room6_Text_ManyPeopleGetSeasick, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_2F_Room6/text.inc",
    "content": "SSAnne_2F_Room6_Text_CaptainIsAwfullySick::\n    .string \"The CAPTAIN said he's awfully sick.\\n\"\n    .string \"He was all pale.$\"\n\nSSAnne_2F_Room6_Text_ManyPeopleGetSeasick::\n    .string \"I hear many people get seasick.$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_3F_Corridor/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_3F_CORRIDOR\",\n  \"name\": \"SSAnne_3F_Corridor\",\n  \"layout\": \"LAYOUT_SSANNE_3F_CORRIDOR\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_3F_Corridor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_DECK\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_2F_CORRIDOR\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 0,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_DECK\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_3F_Corridor/scripts.inc",
    "content": "SSAnne_3F_Corridor_MapScripts::\n\t.byte 0\n\nSSAnne_3F_Corridor_EventScript_Sailor::\n\tmsgbox SSAnne_3F_Corridor_Text_CaptainTeachesCutToMons, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_3F_Corridor/text.inc",
    "content": "SSAnne_3F_Corridor_Text_CaptainTeachesCutToMons::\n    .string \"Our CAPTAIN is a sword master.\\n\"\n    .string \"He's awesome at using CUT.\\p\"\n    .string \"They say he even teaches CUT\\n\"\n    .string \"to POKéMON!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Corridor/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_B1F_CORRIDOR\",\n  \"name\": \"SSAnne_B1F_Corridor\",\n  \"layout\": \"LAYOUT_SSANNE_B1F_CORRIDOR\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 19,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_1F_CORRIDOR\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_B1F_ROOM1\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_B1F_ROOM2\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_B1F_ROOM3\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_B1F_ROOM4\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_B1F_ROOM5\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 21,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_HYPER_POTION\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SSANNE_B1F_CORRIDOR_HYPER_POTION\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Corridor/scripts.inc",
    "content": "SSAnne_B1F_Corridor_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room1/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_B1F_ROOM1\",\n  \"name\": \"SSAnne_B1F_Room1\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM2\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"x\": 5,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SSAnne_B1F_Room1_EventScript_Barny\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SSAnne_B1F_Room1_EventScript_Phillip\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_B1F_CORRIDOR\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room1/scripts.inc",
    "content": "SSAnne_B1F_Room1_MapScripts::\n\t.byte 0\n\nSSAnne_B1F_Room1_EventScript_Barny::\n\ttrainerbattle_single TRAINER_FISHERMAN_BARNY, SSAnne_B1F_Room1_Text_BarnyIntro, SSAnne_B1F_Room1_Text_BarnyDefeat\n\tmsgbox SSAnne_B1F_Room1_Text_BarnyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSSAnne_B1F_Room1_EventScript_Phillip::\n\ttrainerbattle_single TRAINER_SAILOR_PHILLIP, SSAnne_B1F_Room1_Text_PhillipIntro, SSAnne_B1F_Room1_Text_PhillipDefeat\n\tmsgbox SSAnne_B1F_Room1_Text_PhillipPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room1/text.inc",
    "content": "SSAnne_B1F_Room1_Text_PhillipIntro::\n    .string \"Matey, you're walking the plank if\\n\"\n    .string \"you lose!$\"\n\nSSAnne_B1F_Room1_Text_PhillipDefeat::\n    .string \"Argh!\\n\"\n    .string \"Beaten by a kid!$\"\n\nSSAnne_B1F_Room1_Text_PhillipPostBattle::\n    .string \"When we're out at sea, jellyfish\\n\"\n    .string \"POKéMON sometimes drift by.$\"\n\nSSAnne_B1F_Room1_Text_BarnyIntro::\n    .string \"Hello, stranger!\\p\"\n    .string \"I can't tell if you're from the seas\\n\"\n    .string \"or mountains, but stop and chat.\\p\"\n    .string \"All my POKéMON are from the sea.$\"\n\nSSAnne_B1F_Room1_Text_BarnyDefeat::\n    .string \"Darn!\\n\"\n    .string \"I let that one get away!$\"\n\nSSAnne_B1F_Room1_Text_BarnyPostBattle::\n    .string \"I was going to make you my\\n\"\n    .string \"assistant, too!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room2/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_B1F_ROOM2\",\n  \"name\": \"SSAnne_B1F_Room2\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM2\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SSAnne_B1F_Room2_EventScript_Huey\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_B1F_Room2_EventScript_ItemTM44\",\n      \"flag\": \"FLAG_HIDE_SSANNE_B1F_ROOM2_TM44\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_B1F_CORRIDOR\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room2/scripts.inc",
    "content": "SSAnne_B1F_Room2_MapScripts::\n\t.byte 0\n\nSSAnne_B1F_Room2_EventScript_Huey::\n\ttrainerbattle_single TRAINER_SAILOR_HUEY, SSAnne_B1F_Room2_Text_HueyIntro, SSAnne_B1F_Room2_Text_HueyDefeat\n\tmsgbox SSAnne_B1F_Room2_Text_HueyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room2/text.inc",
    "content": "SSAnne_B1F_Room2_Text_HueyIntro::\n    .string \"Even us sailors have POKéMON, too!$\"\n\nSSAnne_B1F_Room2_Text_HueyDefeat::\n    .string \"Okay, you're not bad.$\"\n\nSSAnne_B1F_Room2_Text_HueyPostBattle::\n    .string \"We caught all our POKéMON while\\n\"\n    .string \"we were out at sea.$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room3/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_B1F_ROOM3\",\n  \"name\": \"SSAnne_B1F_Room3\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM2\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SSAnne_B1F_Room3_EventScript_Dylan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_B1F_Room3_EventScript_ItemEther\",\n      \"flag\": \"FLAG_HIDE_SSANNE_B1F_ROOM3_ETHER\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_B1F_CORRIDOR\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room3/scripts.inc",
    "content": "SSAnne_B1F_Room3_MapScripts::\n\t.byte 0\n\nSSAnne_B1F_Room3_EventScript_Dylan::\n\ttrainerbattle_single TRAINER_SAILOR_DYLAN, SSAnne_B1F_Room3_Text_DylanIntro, SSAnne_B1F_Room3_Text_DylanDefeat\n\tmsgbox SSAnne_B1F_Room3_Text_DylanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room3/text.inc",
    "content": "SSAnne_B1F_Room3_Text_DylanIntro::\n    .string \"I like feisty kids like you!$\"\n\nSSAnne_B1F_Room3_Text_DylanDefeat::\n    .string \"Argh!\\n\"\n    .string \"Lost it!$\"\n\nSSAnne_B1F_Room3_Text_DylanPostBattle::\n    .string \"Sea POKéMON live in deep water.\\n\"\n    .string \"You'll need a ROD to fish them up!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room4/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_B1F_ROOM4\",\n  \"name\": \"SSAnne_B1F_Room4\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM2\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SSAnne_B1F_Room4_EventScript_Duncan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SSAnne_B1F_Room4_EventScript_Leonard\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_B1F_CORRIDOR\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room4/scripts.inc",
    "content": "SSAnne_B1F_Room4_MapScripts::\n\t.byte 0\n\nSSAnne_B1F_Room4_EventScript_Leonard::\n\ttrainerbattle_single TRAINER_SAILOR_LEONARD, SSAnne_B1F_Room4_Text_LeonardIntro, SSAnne_B1F_Room4_Text_LeonardDefeat\n\tmsgbox SSAnne_B1F_Room4_Text_LeonardPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSSAnne_B1F_Room4_EventScript_Duncan::\n\ttrainerbattle_single TRAINER_SAILOR_DUNCAN, SSAnne_B1F_Room4_Text_DuncanIntro, SSAnne_B1F_Room4_Text_DuncanDefeat\n\tmsgbox SSAnne_B1F_Room4_Text_DuncanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room4/text.inc",
    "content": "SSAnne_B1F_Room4_Text_LeonardIntro::\n    .string \"You know what they say about\\n\"\n    .string \"sailors and battling!$\"\n\nSSAnne_B1F_Room4_Text_LeonardDefeat::\n    .string \"Right!\\n\"\n    .string \"Good battle, mate!$\"\n\nSSAnne_B1F_Room4_Text_LeonardPostBattle::\n    .string \"Hahaha!\\n\"\n    .string \"Want to be a sailor, mate?$\"\n\nSSAnne_B1F_Room4_Text_DuncanIntro::\n    .string \"Come on, then!\\n\"\n    .string \"My sailor's pride is at stake!$\"\n\nSSAnne_B1F_Room4_Text_DuncanDefeat::\n    .string \"Your spirit sank me!$\"\n\nSSAnne_B1F_Room4_Text_DuncanPostBattle::\n    .string \"Did you see the FISHING GURU in\\n\"\n    .string \"VERMILION CITY?$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room5/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_B1F_ROOM5\",\n  \"name\": \"SSAnne_B1F_Room5\",\n  \"layout\": \"LAYOUT_SSANNE_ROOM2\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_B1F_Room5_EventScript_Boy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MACHOKE\",\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_B1F_Room5_EventScript_Machoke\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_B1F_Room5_EventScript_ItemSuperPotion\",\n      \"flag\": \"FLAG_HIDE_SSANNE_B1F_ROOM5_SUPER_POTION\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_B1F_CORRIDOR\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room5/scripts.inc",
    "content": "SSAnne_B1F_Room5_MapScripts::\n\t.byte 0\n\nSSAnne_B1F_Room5_EventScript_Boy::\n\tmsgbox SSAnne_B1F_Room5_Text_MachokeHasStrengthToMoveRocks, MSGBOX_NPC\n\tend\n\nSSAnne_B1F_Room5_EventScript_Machoke::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_MACHOKE, CRY_MODE_NORMAL\n\tmsgbox SSAnne_B1F_Room5_Text_Machoke\n\twaitmoncry\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_B1F_Room5/text.inc",
    "content": "SSAnne_B1F_Room5_Text_MachokeHasStrengthToMoveRocks::\n    .string \"My buddy MACHOKE is super strong!\\p\"\n    .string \"He has enough STRENGTH to move\\n\"\n    .string \"big rocks!$\"\n\nSSAnne_B1F_Room5_Text_Machoke::\n    .string \"MACHOKE: Gwoh! Goggoh!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_CaptainsOffice/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_CAPTAINS_OFFICE\",\n  \"name\": \"SSAnne_CaptainsOffice\",\n  \"layout\": \"LAYOUT_SSANNE_CAPTAINS_OFFICE\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAPTAIN\",\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_CaptainsOffice_EventScript_Captain\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_2F_CORRIDOR\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SSAnne_CaptainsOffice_EventScript_Book\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SSAnne_CaptainsOffice_EventScript_TrashCan\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SSAnne_CaptainsOffice_EventScript_Book\"\n    }\n  ],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_CaptainsOffice/scripts.inc",
    "content": ".set LOCALID_CAPTAIN, 1\n\nSSAnne_CaptainsOffice_MapScripts::\n\t.byte 0\n\nSSAnne_CaptainsOffice_EventScript_Captain::\n\tlock\n\tgoto_if_set FLAG_GOT_HM01, SSAnne_CaptainsOffice_EventScript_AlreadyGotCut\n\tmsgbox SSAnne_CaptainsOffice_Text_CaptainIFeelSeasick\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmessage SSAnne_CaptainsOffice_Text_RubbedCaptainsBack\n\twaitmessage\n\tplayfanfare MUS_RS_HEAL\n\twaitfanfare\n\tcall EventScript_RestorePrevTextColor\n\tdelay 50\n\tapplymovement LOCALID_CAPTAIN, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox SSAnne_CaptainsOffice_Text_ThankYouHaveHMForCut\n\tgiveitem_msg SSAnne_CaptainsOffice_Text_ObtainedHM01FromCaptain, ITEM_HM01, 1, MUS_OBTAIN_KEY_ITEM\n\tmsgbox SSAnne_CaptainsOffice_Text_ExplainCut\n\tsetflag FLAG_GOT_HM01\n\tsetvar VAR_MAP_SCENE_VERMILION_CITY, 1\n\trelease\n\tend\n\n@ Unused\nSSAnne_CaptainsOffice_EventScript_NoRoomForCut::\n\tmsgbox SSAnne_CaptainsOffice_Text_YouHaveNoRoomForThis\n\tclosemessage\n\tapplymovement LOCALID_CAPTAIN, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nSSAnne_CaptainsOffice_EventScript_AlreadyGotCut::\n\tapplymovement LOCALID_CAPTAIN, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox SSAnne_CaptainsOffice_Text_SSAnneWillSetSailSoon\n\trelease\n\tend\n\nSSAnne_CaptainsOffice_EventScript_TrashCan::\n\tmsgbox SSAnne_CaptainsOffice_Text_YuckShouldntHaveLooked, MSGBOX_SIGN\n\tend\n\nSSAnne_CaptainsOffice_EventScript_Book::\n\tmsgbox SSAnne_CaptainsOffice_Text_HowToConquerSeasickness, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_CaptainsOffice/text.inc",
    "content": "SSAnne_CaptainsOffice_Text_CaptainIFeelSeasick::\n    .string \"CAPTAIN: Ooargh…\\n\"\n    .string \"I feel hideous…\\l\"\n    .string \"Urrp! Seasick…$\"\n\nSSAnne_CaptainsOffice_Text_RubbedCaptainsBack::\n    .string \"{PLAYER} rubbed the CAPTAIN's\\n\"\n    .string \"back!\\p\"\n    .string \"Rub-rub…\\n\"\n    .string \"Rub-rub…$\"\n\nSSAnne_CaptainsOffice_Text_ThankYouHaveHMForCut::\n    .string \"CAPTAIN: Whew! Thank you!\\n\"\n    .string \"I'm feeling much better now.\\p\"\n    .string \"You want to see my hidden CUT\\n\"\n    .string \"technique?\\p\"\n    .string \"I could show you my prized CUT\\n\"\n    .string \"technique if I weren't so ill…\\p\"\n    .string \"I know! You can have this!\\n\"\n    .string \"This HIDDEN MACHINE!\\p\"\n    .string \"Teach CUT to your POKéMON, and\\n\"\n    .string \"you can see it CUT anytime!$\"\n\nSSAnne_CaptainsOffice_Text_ObtainedHM01FromCaptain::\n    .string \"{PLAYER} obtained HM01\\n\"\n    .string \"from the CAPTAIN!$\"\n\nSSAnne_CaptainsOffice_Text_ExplainCut::\n    .string \"Using CUT, you can chop down\\n\"\n    .string \"small trees.\\p\"\n    .string \"Why not try it with the trees\\n\"\n    .string \"around VERMILION CITY?$\"\n\nSSAnne_CaptainsOffice_Text_SSAnneWillSetSailSoon::\n    .string \"CAPTAIN: …Whew!\\p\"\n    .string \"Now that I'm not sick anymore,\\n\"\n    .string \"I guess it's time.\\p\"\n    .string \"The S.S. ANNE will set sail soon!\\p\"\n    .string \"Farewell, until our return to\\n\"\n    .string \"VERMILION CITY!$\"\n\nSSAnne_CaptainsOffice_Text_YouHaveNoRoomForThis::\n    .string \"Oh, no!\\n\"\n    .string \"You have no room for this!$\"\n\nSSAnne_CaptainsOffice_Text_YuckShouldntHaveLooked::\n    .string \"Yuck!\\n\"\n    .string \"Shouldn't have looked!$\"\n\nSSAnne_CaptainsOffice_Text_HowToConquerSeasickness::\n    .string \"How to Conquer Seasickness…\\n\"\n    .string \"The CAPTAIN's reading this!$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_Deck/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_DECK\",\n  \"name\": \"SSAnne_Deck\",\n  \"layout\": \"LAYOUT_SSANNE_DECK\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 12,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SSAnne_Deck_EventScript_Trevor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 14,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_Deck_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 13,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_Deck_EventScript_Sailor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SSAnne_Deck_EventScript_Edmond\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_Deck_EventScript_Youngster\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 16,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_3F_CORRIDOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 16,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_3F_CORRIDOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_Deck/scripts.inc",
    "content": "SSAnne_Deck_MapScripts::\n\t.byte 0\n\nSSAnne_Deck_EventScript_Youngster::\n\tmsgbox SSAnne_Deck_Text_ShipDepartingSoon, MSGBOX_NPC\n\tend\n\nSSAnne_Deck_EventScript_BaldingMan::\n\tmsgbox SSAnne_Deck_Text_FeelSeasick, MSGBOX_NPC\n\tend\n\nSSAnne_Deck_EventScript_Sailor::\n\tmsgbox SSAnne_Deck_Text_ScrubbingDecksHardWork, MSGBOX_NPC\n\tend\n\nSSAnne_Deck_EventScript_Edmond::\n\ttrainerbattle_single TRAINER_SAILOR_EDMOND, SSAnne_Deck_Text_EdmondIntro, SSAnne_Deck_Text_EdmondDefeat\n\tmsgbox SSAnne_Deck_Text_EdmondPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSSAnne_Deck_EventScript_Trevor::\n\ttrainerbattle_single TRAINER_SAILOR_TREVOR, SSAnne_Deck_Text_TrevorIntro, SSAnne_Deck_Text_TrevorDefeat\n\tmsgbox SSAnne_Deck_Text_TrevorPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_Deck/text.inc",
    "content": "SSAnne_Deck_Text_ShipDepartingSoon::\n    .string \"The party's over.\\n\"\n    .string \"The ship will be departing soon.$\"\n\nSSAnne_Deck_Text_ScrubbingDecksHardWork::\n    .string \"Whew!\\n\"\n    .string \"Scrubbing decks is hard work!$\"\n\nSSAnne_Deck_Text_FeelSeasick::\n    .string \"Urf… I feel ill…\\p\"\n    .string \"I got seasick, so I stepped out to\\n\"\n    .string \"get some air…$\"\n\nSSAnne_Deck_Text_EdmondIntro::\n    .string \"Hey, matey!\\p\"\n    .string \"Let's do a little jig!$\"\n\nSSAnne_Deck_Text_EdmondDefeat::\n    .string \"You're impressive!$\"\n\nSSAnne_Deck_Text_EdmondPostBattle::\n    .string \"How many kinds of POKéMON do you\\n\"\n    .string \"think there are in this big world?$\"\n\nSSAnne_Deck_Text_TrevorIntro::\n    .string \"Ahoy, there!\\n\"\n    .string \"Are you seasick?$\"\n\nSSAnne_Deck_Text_TrevorDefeat::\n    .string \"I was just careless!$\"\n\nSSAnne_Deck_Text_TrevorPostBattle::\n    .string \"My pa said there are 100 kinds of\\n\"\n    .string \"POKéMON. I think there are more.$\"\n\n"
  },
  {
    "path": "data/maps/SSAnne_Exterior/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_EXTERIOR\",\n  \"name\": \"SSAnne_Exterior\",\n  \"layout\": \"LAYOUT_SSANNE_EXTERIOR\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SS_ANNE\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 16,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_SS_ANNE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 31,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 32,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 32,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_1F_CORRIDOR\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_1F_CORRIDOR\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 58,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LAVA_COOKIE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SSANNE_EXTERIOR_LAVA_COOKIE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_Exterior/scripts.inc",
    "content": ".set LOCALID_SS_ANNE, 1\n\nSSAnne_Exterior_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SSAnne_Exterior_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, SSAnne_Exterior_OnFrame\n\t.byte 0\n\nSSAnne_Exterior_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_SSANNE_EXTERIOR\n\tend\n\nSSAnne_Exterior_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_VERMILION_CITY, 1, SSAnne_Exterior_ExitSSAnne\n\t.2byte 0\n\nSSAnne_Exterior_ExitSSAnne::\n\tlockall\n\tgetplayerxy VAR_0x8004, VAR_0x8005\n\tcall_if_le VAR_0x8005, 6, SSAnne_Exterior_WalkDown\n\tcall_if_ge VAR_0x8005, 7, SSAnne_Exterior_WalkInPlaceDown\n\tfadenewbgm MUS_SURF\n\tdelay 50\n\tspecial DoSSAnneDepartureCutscene\n\twaitstate\n\tremoveobject LOCALID_SS_ANNE\n\tapplymovement OBJ_EVENT_ID_PLAYER, SSAnne_Exterior_Movement_Exit\n\twaitmovement 0\n\tsetvar VAR_MAP_SCENE_VERMILION_CITY, 2\n\tsetvar VAR_VERMILION_CITY_TICKET_CHECK_TRIGGER, 0\n\twarp MAP_VERMILION_CITY, 23, 34\n\twaitstate\n\treleaseall\n\tend\n\nSSAnne_Exterior_WalkDown::\n\tapplymovement OBJ_EVENT_ID_PLAYER, SSAnne_Exterior_Movement_WalkDown\n\twaitmovement 0\n\treturn\n\nSSAnne_Exterior_WalkInPlaceDown::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\nSSAnne_Exterior_Movement_Exit::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nSSAnne_Exterior_Movement_WalkDown::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/SSAnne_Kitchen/map.json",
    "content": "{\n  \"id\": \"MAP_SSANNE_KITCHEN\",\n  \"name\": \"SSAnne_Kitchen\",\n  \"layout\": \"LAYOUT_SSANNE_KITCHEN\",\n  \"music\": \"MUS_SS_ANNE\",\n  \"region_map_section\": \"MAPSEC_S_S_ANNE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHEF\",\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_Kitchen_EventScript_Chef1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHEF\",\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_Kitchen_EventScript_Chef2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHEF\",\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_Kitchen_EventScript_Chef3\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHEF\",\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_Kitchen_EventScript_Chef4\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHEF\",\n      \"x\": 14,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_Kitchen_EventScript_Chef5\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHEF\",\n      \"x\": 14,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_Kitchen_EventScript_Chef6\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHEF\",\n      \"x\": 14,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_Kitchen_EventScript_Chef7\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"x\": 1,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_Kitchen_EventScript_ItemGreatBall\",\n      \"flag\": \"FLAG_HIDE_SSANNE_KITCHEN_GREAT_BALL\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SSANNE_1F_CORRIDOR\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 14,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"item\": \"ITEM_CHESTO_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SSANNE_KITCHEN_CHESTO_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 14,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"item\": \"ITEM_PECHA_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SSANNE_KITCHEN_PECHA_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"item\": \"ITEM_CHERI_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SSANNE_KITCHEN_CHERI_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n\t\"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/SSAnne_Kitchen/scripts.inc",
    "content": "SSAnne_Kitchen_MapScripts::\n\t.byte 0\n\nSSAnne_Kitchen_EventScript_Chef1::\n\tmsgbox SSAnne_Kitchen_Text_BusyOutOfTheWay, MSGBOX_NPC\n\tend\n\nSSAnne_Kitchen_EventScript_Chef2::\n\tmsgbox SSAnne_Kitchen_Text_SawOddBerryInTrash, MSGBOX_NPC\n\tend\n\nSSAnne_Kitchen_EventScript_Chef3::\n\tmsgbox SSAnne_Kitchen_Text_SoBusyImDizzy, MSGBOX_NPC\n\tend\n\nSSAnne_Kitchen_EventScript_Chef4::\n\tlock\n\tfaceplayer\n\tmsgbox SSAnne_Kitchen_Text_IAmLeChefMainCourseIs\n\trandom 3\n\tcopyvar VAR_0x8008, VAR_RESULT\n\tcall_if_eq VAR_0x8008, 0, SSAnne_Kitchen_EventScript_SalmonDuSalad\n\tcall_if_eq VAR_0x8008, 1, SSAnne_Kitchen_EventScript_EelsAuBarbecue\n\tcall_if_eq VAR_0x8008, 2, SSAnne_Kitchen_EventScript_PrimeBeefsteak\n\trelease\n\tend\n\nSSAnne_Kitchen_EventScript_SalmonDuSalad::\n\tmsgbox SSAnne_Kitchen_Text_SalmonDuSalad\n\treturn\n\nSSAnne_Kitchen_EventScript_EelsAuBarbecue::\n\tmsgbox SSAnne_Kitchen_Text_EelsAuBarbecue\n\treturn\n\nSSAnne_Kitchen_EventScript_PrimeBeefsteak::\n\tmsgbox SSAnne_Kitchen_Text_PrimeBeefsteak\n\treturn\n\nSSAnne_Kitchen_EventScript_Chef5::\n\tmsgbox SSAnne_Kitchen_Text_PeelSpudsEveryDay, MSGBOX_NPC\n\tend\n\nSSAnne_Kitchen_EventScript_Chef6::\n\tmsgbox SSAnne_Kitchen_Text_HearAboutSnorlaxItsAGlutton, MSGBOX_NPC\n\tend\n\nSSAnne_Kitchen_EventScript_Chef7::\n\tmsgbox SSAnne_Kitchen_Text_OnlyGetToPeelOnions, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SSAnne_Kitchen/text.inc",
    "content": "SSAnne_Kitchen_Text_BusyOutOfTheWay::\n    .string \"You, mon petit!\\n\"\n    .string \"We're busy here!\\l\"\n    .string \"Out of the way!$\"\n\nSSAnne_Kitchen_Text_SawOddBerryInTrash::\n    .string \"I saw an odd BERRY in the trash.\\n\"\n    .string \"I wonder what that was?$\"\n\nSSAnne_Kitchen_Text_SoBusyImDizzy::\n    .string \"I'm so busy I'm getting dizzy!\\n\"\n    .string \"You have to give me room here!$\"\n\nSSAnne_Kitchen_Text_PeelSpudsEveryDay::\n    .string \"Hum-de-hum-de-ho…\\p\"\n    .string \"I peel spuds every day!\\n\"\n    .string \"Hum-hum…$\"\n\nSSAnne_Kitchen_Text_HearAboutSnorlaxItsAGlutton::\n    .string \"Did you hear about SNORLAX?\\n\"\n    .string \"It's a glutton.\\p\"\n    .string \"No other POKéMON eats and sleeps\\n\"\n    .string \"the way SNORLAX can and does!$\"\n\nSSAnne_Kitchen_Text_OnlyGetToPeelOnions::\n    .string \"Snivel… Sniff…\\p\"\n    .string \"I only get to peel onions…\\n\"\n    .string \"Snivel…$\"\n\nSSAnne_Kitchen_Text_IAmLeChefMainCourseIs::\n    .string \"Er-hem!\\n\"\n    .string \"Indeed I am le CHEF!\\p\"\n    .string \"Le main course is$\"\n\nSSAnne_Kitchen_Text_SalmonDuSalad::\n    .string \"Salmon du Salad!\\p\"\n    .string \"Les guests may gripe it's fish\\n\"\n    .string \"again, however!$\"\n\nSSAnne_Kitchen_Text_EelsAuBarbecue::\n    .string \"Eels au Barbecue!\\p\"\n    .string \"Les guests will mutiny, I fear.$\"\n\nSSAnne_Kitchen_Text_PrimeBeefsteak::\n    .string \"Prime Beefsteak!\\p\"\n    .string \"But, have I enough fillets du\\n\"\n    .string \"beef?$\"\n\n"
  },
  {
    "path": "data/maps/SafariZone_Center/map.json",
    "content": "{\n  \"id\": \"MAP_SAFARI_ZONE_CENTER\",\n  \"name\": \"SafariZone_Center\",\n  \"layout\": \"LAYOUT_SAFARI_ZONE_CENTER\",\n  \"music\": \"MUS_EVOLUTION\",\n  \"region_map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_Center_EventScript_ItemNugget\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_CENTER_NUGGET\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 25,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 26,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 27,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"9\"\n    },\n    {\n      \"x\": 26,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"10\"\n    },\n    {\n      \"x\": 27,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"11\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 43,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_EAST\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 43,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_EAST\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 43,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_EAST\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER_REST_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 30,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_Center_EventScript_RestHouseSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 25,\n      \"y\": 27,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_Center_EventScript_TrainerTips\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 27,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LEAF_STONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SAFARI_ZONE_CENTER_LEAF_STONE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 33,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_Center_EventScript_AreaSign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SafariZone_Center/scripts.inc",
    "content": "SafariZone_Center_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SafariZone_Center_OnTransition\n\t.byte 0\n\nSafariZone_Center_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_SAFARI_ZONE_CENTER\n\tend\n\nSafariZone_Center_EventScript_RestHouseSign::\n\tmsgbox SafariZone_Center_Text_RestHouse, MSGBOX_SIGN\n\tend\n\nSafariZone_Center_EventScript_TrainerTips::\n\tmsgbox SafariZone_Center_Text_PressStartToCheckTime, MSGBOX_SIGN\n\tend\n\nSafariZone_Center_EventScript_AreaSign::\n\tmsgbox SafariZone_Center_Text_CenterArea, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SafariZone_Center/text.inc",
    "content": "SafariZone_Center_Text_RestHouse::\n    .string \"REST HOUSE$\"\n\nSafariZone_Center_Text_PressStartToCheckTime::\n    .string \"TRAINER TIPS\\p\"\n    .string \"Press START to check\\n\"\n    .string \"remaining time.$\"\n\nSafariZone_Center_Text_CenterArea::\n    .string \"CENTER AREA$\"\n\n"
  },
  {
    "path": "data/maps/SafariZone_Center_RestHouse/map.json",
    "content": "{\n  \"id\": \"MAP_SAFARI_ZONE_CENTER_REST_HOUSE\",\n  \"name\": \"SafariZone_Center_RestHouse\",\n  \"layout\": \"LAYOUT_SAFARI_ZONE_REST_HOUSE\",\n  \"music\": \"MUS_EVOLUTION\",\n  \"region_map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_Center_RestHouse_EventScript_Scientist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"x\": 7,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_Center_RestHouse_EventScript_Sara\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"12\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"12\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"12\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SafariZone_Center_RestHouse/scripts.inc",
    "content": "SafariZone_Center_RestHouse_MapScripts::\n\t.byte 0\n\nSafariZone_Center_RestHouse_EventScript_Sara::\n\tmsgbox SafariZone_Center_Text_WhereDidErikGo, MSGBOX_NPC\n\tend\n\nSafariZone_Center_RestHouse_EventScript_Scientist::\n\tmsgbox SafariZone_Center_Text_CatchingMonsAsGifts, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SafariZone_Center_RestHouse/text.inc",
    "content": "SafariZone_Center_Text_WhereDidErikGo::\n    .string \"SARA: Where did my boyfriend,\\n\"\n    .string \"ERIK, go?$\"\n\nSafariZone_Center_Text_CatchingMonsAsGifts::\n    .string \"I'm catching POKéMON to take home\\n\"\n    .string \"as gifts.$\"\n\n"
  },
  {
    "path": "data/maps/SafariZone_East/map.json",
    "content": "{\n  \"id\": \"MAP_SAFARI_ZONE_EAST\",\n  \"name\": \"SafariZone_East\",\n  \"layout\": \"LAYOUT_SAFARI_ZONE_EAST\",\n  \"music\": \"MUS_EVOLUTION\",\n  \"region_map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_East_EventScript_ItemMaxPotion\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_EAST_MAX_POTION\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 37,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_East_EventScript_ItemFullRestore\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_EAST_FULL_RESTORE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_East_EventScript_ItemTM11\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_EAST_TM11\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 17,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_East_EventScript_ItemLeafStone\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_EAST_LEAF_STONE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"9\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"10\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 28,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"11\"\n    },\n    {\n      \"x\": 40,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_EAST_REST_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 18,\n      \"y\": 27,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_East_EventScript_AreaSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 43,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_East_EventScript_RestHouseSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_East_EventScript_TrainerTips\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SafariZone_East/scripts.inc",
    "content": "SafariZone_East_MapScripts::\n\t.byte 0\n\nSafariZone_East_EventScript_RestHouseSign::\n\tmsgbox SafariZone_East_Text_RestHouse, MSGBOX_SIGN\n\tend\n\nSafariZone_East_EventScript_TrainerTips::\n\tmsgbox SafariZone_East_Text_TimeDeclinesOnlyWhileYouWalk, MSGBOX_SIGN\n\tend\n\nSafariZone_East_EventScript_AreaSign::\n\tmsgbox SafariZone_East_Text_AreaSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SafariZone_East/text.inc",
    "content": "SafariZone_East_Text_RestHouse::\n    .string \"REST HOUSE$\"\n\nSafariZone_East_Text_TimeDeclinesOnlyWhileYouWalk::\n    .string \"TRAINER TIPS\\p\"\n    .string \"The remaining time declines only\\n\"\n    .string \"while you walk.$\"\n\nSafariZone_East_Text_AreaSign::\n    .string \"AREA 1\\n\"\n    .string \"WEST: CENTER AREA$\"\n\n"
  },
  {
    "path": "data/maps/SafariZone_East_RestHouse/map.json",
    "content": "{\n  \"id\": \"MAP_SAFARI_ZONE_EAST_REST_HOUSE\",\n  \"name\": \"SafariZone_East_RestHouse\",\n  \"layout\": \"LAYOUT_SAFARI_ZONE_REST_HOUSE\",\n  \"music\": \"MUS_EVOLUTION\",\n  \"region_map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_East_RestHouse_EventScript_Scientist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKER\",\n      \"x\": 6,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_East_RestHouse_EventScript_Rocker\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 7,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_East_RestHouse_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_EAST\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_EAST\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_EAST\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SafariZone_East_RestHouse/scripts.inc",
    "content": "SafariZone_East_RestHouse_MapScripts::\n\t.byte 0\n\nSafariZone_East_RestHouse_EventScript_Rocker::\n\tmsgbox SafariZone_East_Text_CaughtChanseyAllWorthwhile, MSGBOX_NPC\n\tend\n\nSafariZone_East_RestHouse_EventScript_Scientist::\n\tmsgbox SafariZone_East_Text_HowManyDidYouCatch, MSGBOX_NPC\n\tend\n\nSafariZone_East_RestHouse_EventScript_BaldingMan::\n\tmsgbox SafariZone_East_Text_TiredFromAllTheFun, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SafariZone_East_RestHouse/text.inc",
    "content": "SafariZone_East_Text_HowManyDidYouCatch::\n    .string \"How many did you catch?\\n\"\n    .string \"I'm bushed from the effort!$\"\n\nSafariZone_East_Text_CaughtChanseyAllWorthwhile::\n    .string \"I caught a CHANSEY!\\p\"\n    .string \"That makes this all worthwhile.$\"\n\nSafariZone_East_Text_TiredFromAllTheFun::\n    .string \"Whew!\\n\"\n    .string \"I'm tired from all the fun!$\"\n\n"
  },
  {
    "path": "data/maps/SafariZone_North/map.json",
    "content": "{\n  \"id\": \"MAP_SAFARI_ZONE_NORTH\",\n  \"name\": \"SafariZone_North\",\n  \"layout\": \"LAYOUT_SAFARI_ZONE_NORTH\",\n  \"music\": \"MUS_EVOLUTION\",\n  \"region_map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_North_EventScript_ItemProtein\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_NORTH_PROTEIN\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_North_EventScript_ItemTM47\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_NORTH_TM47\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_North_EventScript_ItemQuickClaw\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_NORTH_QUICK_CLAW\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_North_EventScript_Worker2\",\n      \"flag\": \"FLAG_SYS_GAME_CLEAR\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_North_EventScript_Worker1\",\n      \"flag\": \"FLAG_SYS_GAME_CLEAR\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 36,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 36,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 36,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 36,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 21,\n      \"y\": 36,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 36,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 48,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_EAST\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 48,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_EAST\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 48,\n      \"y\": 35,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_EAST\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 30,\n      \"y\": 36,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 36,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 32,\n      \"y\": 36,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 43,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH_REST_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH_WEST\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH_WEST\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 29,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_North_EventScript_TrainerTips1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 23,\n      \"y\": 33,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_North_EventScript_AreaSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 29,\n      \"y\": 34,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_North_EventScript_TrainerTips2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 34,\n      \"y\": 30,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_North_EventScript_TrainerTips3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 44,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_North_EventScript_RestHouseSign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SafariZone_North/scripts.inc",
    "content": "SafariZone_North_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, SafariZone_North_EventScript_MakeExtension\n\t.byte 0\n\nSafariZone_North_EventScript_MakeExtension::\n\tgoto_if_unset FLAG_SYS_GAME_CLEAR, EventScript_ReleaseEnd\n\tsetmetatile 12, 2, 0x0DB, 1\n\tsetmetatile 12, 3, 0x0DB, 1\n\tsetmetatile 12, 4, 0x0DB, 1\n\tsetmetatile 12, 5, 0x0DB, 1\n\tsetmetatile 12, 6, 0x2EA, 0\n\tsetmetatile 13, 2, 0x0DD, 1\n\tsetmetatile 13, 3, 0x0DD, 1\n\tsetmetatile 13, 4, 0x0DD, 1\n\tsetmetatile 13, 5, 0x0DD, 1\n\tsetmetatile 13, 6, 0x2EB, 0\n\tsetmetatile 14, 2, 0x0E6, 1\n\tsetmetatile 14, 3, 0x0E6, 1\n\tsetmetatile 14, 4, 0x0E6, 1\n\tsetmetatile 14, 5, 0x0E6, 1\n\tsetmetatile 14, 6, 0x358, 1\n\tsetmetatile 11, 2, 0x304, 1\n\tsetmetatile 11, 3, 0x2FC, 1\n\tsetmetatile 11, 4, 0x304, 1\n\tsetmetatile 11, 5, 0x30C, 1\n\tsetmetatile 15, 2, 0x303, 1\n\tsetmetatile 15, 3, 0x2FB, 1\n\tsetmetatile 15, 4, 0x303, 1\n\tsetmetatile 15, 5, 0x30B, 1\n\tend\n\nSafariZone_North_EventScript_RestHouseSign::\n\tmsgbox SafariZone_North_Text_RestHouse, MSGBOX_SIGN\n\tend\n\nSafariZone_North_EventScript_TrainerTips1::\n\tmsgbox SafariZone_North_Text_SecretHouseStillAhead, MSGBOX_SIGN\n\tend\n\nSafariZone_North_EventScript_AreaSign::\n\tmsgbox SafariZone_North_Text_Area2, MSGBOX_SIGN\n\tend\n\nSafariZone_North_EventScript_TrainerTips2::\n\tmsgbox SafariZone_North_Text_ZigzagThroughTallGrass, MSGBOX_SIGN\n\tend\n\nSafariZone_North_EventScript_TrainerTips3::\n\tmsgbox SafariZone_North_Text_WinFreeHMFindSecretHouse, MSGBOX_SIGN\n\tend\n\nSafariZone_North_EventScript_Worker1::\n\tmsgbox SafariZone_North_Text_Worker1, MSGBOX_NPC\n\tturnobject 5, DIR_NORTH\n\tend\n\nSafariZone_North_Text_Worker1::\n\t.string \"Are you enjoying the SAFARI GAME?\\p\"\n\t.string \"We're working, so please go on with\\n\"\n\t.string \"your excursion and leave us be.$\"\n\nSafariZone_North_EventScript_Worker2::\n\tmsgbox SafariZone_North_Text_Worker2, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSafariZone_North_Text_Worker2::\n\t.string \"…If we cut through here…\\n\"\n\t.string \"…Hmm…$\"\n"
  },
  {
    "path": "data/maps/SafariZone_North/text.inc",
    "content": "SafariZone_North_Text_RestHouse::\n    .string \"REST HOUSE$\"\n\nSafariZone_North_Text_SecretHouseStillAhead::\n    .string \"TRAINER TIPS\\p\"\n    .string \"The SECRET HOUSE is still ahead.$\"\n\nSafariZone_North_Text_Area2::\n    .string \"AREA 2$\"\n\nSafariZone_North_Text_ZigzagThroughTallGrass::\n    .string \"TRAINER TIPS\\p\"\n    .string \"POKéMON hide in tall grass.\\p\"\n    .string \"Zigzag through grassy areas to\\n\"\n    .string \"flush them out.$\"\n\nSafariZone_North_Text_WinFreeHMFindSecretHouse::\n    .string \"TRAINER TIPS\\p\"\n    .string \"Win a free HM for finding the\\n\"\n    .string \"SECRET HOUSE.$\"\n\n"
  },
  {
    "path": "data/maps/SafariZone_NorthEast/map.json",
    "content": "{\n  \"id\": \"MAP_SAFARI_ZONE_NORTH_EAST\",\n  \"name\": \"SafariZone_NorthEast\",\n  \"layout\": \"LAYOUT_SAFARI_ZONE_NORTH_EAST\",\n  \"music\": \"MUS_EVOLUTION\",\n  \"region_map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 41,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 37,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 44,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthEast_EventScript_ItemGlitterMail\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_NORTHEAST_GLITTER_MAIL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthEast_EventScript_ItemWhiteHerb\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_NORTHEAST_WHITE_HERB\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 44,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthEast_EventScript_ItemMaxRevive\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_NORTHEAST_MAX_REVIVE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 9,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH_WEST\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH_WEST\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_NorthEast_EventScript_AreaSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 28,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"item\": \"ITEM_SALAC_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHEAST_SALAC_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 37,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"item\": \"ITEM_BRIGHT_POWDER\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHEAST_BRIGHTPOWDER\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_NorthEast_EventScript_RoughTerrainSign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SafariZone_NorthEast/scripts.inc",
    "content": "SafariZone_NorthEast_MapScripts::\n\t.byte 0\n\nSafariZone_NorthEast_EventScript_AreaSign::\n\tmsgbox SafariZone_NorthEast_Text_AreaSign, MSGBOX_SIGN\n\tend\n\nSafariZone_NorthEast_Text_AreaSign::\n\t.string \"AREA 5$\"\n\nSafariZone_NorthEast_EventScript_RoughTerrainSign::\n\tmsgbox SafariZone_NorthEast_Text_RoughTerrainSign, MSGBOX_SIGN\n\tend\n\nSafariZone_NorthEast_Text_RoughTerrainSign::\n\t.string \"NOTICE!\\p\"\n\t.string \"Rough terrain ahead!\\n\"\n\t.string \"Exercise caution while exploring!$\""
  },
  {
    "path": "data/maps/SafariZone_NorthEast/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/SafariZone_NorthWest/map.json",
    "content": "{\n  \"id\": \"MAP_SAFARI_ZONE_NORTH_WEST\",\n  \"name\": \"SafariZone_NorthWest\",\n  \"layout\": \"LAYOUT_SAFARI_ZONE_NORTH_WEST\",\n  \"music\": \"MUS_EVOLUTION\",\n  \"region_map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 34,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthWest_EventScript_ItemSunStone\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_NORTHWEST_SUN_STONE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 44,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthWest_EventScript_ItemRareCandy\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_NORTHWEST_RARE_CANDY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthWest_EventScript_ItemPPMax\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_NORTHWEST_PP_MAX\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_18\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_14\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthWest_EventScript_ItemKingsRock\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_NORTHWEST_KINGS_ROCK\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 12,\n      \"y\": 30,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"13\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 30,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"14\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH_WEST_REST_HOUSE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 44,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH_EAST\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 44,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH_EAST\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_NorthWest_EventScript_RestHouseSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 21,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_NorthWest_EventScript_AreaSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 19,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LIECHI_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHWEST_LIECHI_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 43,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"item\": \"ITEM_SITRUS_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHWEST_SITRUS_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 34,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"item\": \"ITEM_SHELL_BELL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHWEST_SHELL_BELL\",\n      \"quantity\": 1,\n      \"underfoot\": true\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SafariZone_NorthWest/scripts.inc",
    "content": "SafariZone_NorthWest_MapScripts::\n\t.byte 0\n\nSafariZone_NorthWest_EventScript_RestHouseSign::\n\tmsgbox SafariZone_NorthWest_Text_RestHouseSign, MSGBOX_SIGN\n\tend\n\nSafariZone_NorthWest_Text_RestHouseSign::\n\t.string \"REST HOUSE\\n\"\n\t.string \"Fill up on steps inside!$\"\n\nSafariZone_NorthWest_EventScript_AreaSign::\n\tmsgbox SafariZone_NorthWest_Text_AreaSign, MSGBOX_SIGN\n\tend\n\nSafariZone_NorthWest_Text_AreaSign::\n\t.string \"AREA 4$\""
  },
  {
    "path": "data/maps/SafariZone_NorthWest/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/SafariZone_NorthWest_RestHouse/map.json",
    "content": "{\n  \"id\": \"MAP_SAFARI_ZONE_NORTH_WEST_REST_HOUSE\",\n  \"name\": \"SafariZone_NorthWest_RestHouse\",\n  \"layout\": \"LAYOUT_SAFARI_ZONE_REST_HOUSE\",\n  \"music\": \"MUS_EVOLUTION\",\n  \"region_map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthWest_RestHouse_EventScript_Worker\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthWest_RestHouse_EventScript_Stepmonger\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthWest_RestHouse_EventScript_SuperNerd\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthWest_RestHouse_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthWest_RestHouse_EventScript_OldWoman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthWest_RestHouse_EventScript_Lass\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLIPBOARD\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_NorthWest_RestHouse_EventScript_Clipboard\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH_WEST\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SafariZone_NorthWest_RestHouse/scripts.inc",
    "content": "SafariZone_NorthWest_RestHouse_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD SafariZone_NorthWest_RestHouse_MapScript_MakePC\n\t.byte 0\n\nSafariZone_NorthWest_RestHouse_MapScript_MakePC::\n\tsetmetatile 2, 0, 0x300, 1\n\tsetmetatile 2, 1, 0x062, 1\n\tsetmetatile 2, 2, 0x301, 0\n\tsetmetatile 4, 0, 0x2C8, 1\n\tsetmetatile 4, 1, 0x2CA, 1\n\tsetmetatile 5, 0, 0x2C9, 1\n\tsetmetatile 5, 1, 0x2CB, 1\n\tend\n\nSafariZone_NorthWest_RestHouse_EventScript_OldWoman::\n\tmsgbox SafariZone_NorthWest_RestHouse_Text_OldWoman, MSGBOX_NPC\n\tend\n\nSafariZone_NorthWest_RestHouse_Text_OldWoman::\n\t.string \"My grandson has a lot of energy,\\n\"\n\t.string \"but getting here has worn me out!$\"\n\nSafariZone_NorthWest_RestHouse_EventScript_LittleBoy::\n\tmsgbox SafariZone_NorthWest_RestHouse_Text_LittleBoy, MSGBOX_NPC\n\tend\n\nSafariZone_NorthWest_RestHouse_Text_LittleBoy::\n\t.string \"Me and Grandma are here to see\\n\"\n\t.string \"the new POKéMON!\\p\"\n\t.string \"There are so many here I've never\\n\"\n\t.string \"seen before!$\"\n\nSafariZone_NorthWest_RestHouse_EventScript_SuperNerd::\n\tmsgbox SafariZone_NorthWest_RestHouse_Text_SuperNerd, MSGBOX_NPC\n\tend\n\nSafariZone_NorthWest_RestHouse_Text_SuperNerd::\n\t.string \"I saw a weird, noodley POKéMON\\n\"\n\t.string \"hiding in the rocks on the\\l\"\n\t.string \"ridge behind us.\\p\"\n\t.string \"Too bad I don't have a POKéMON\\n\"\n\t.string \"that can learn ROCK SMASH!$\"\n\nSafariZone_NorthWest_RestHouse_EventScript_Lass::\n\tmsgbox SafariZone_NorthWest_RestHouse_Text_Lass, MSGBOX_NPC\n\tend\n\nSafariZone_NorthWest_RestHouse_Text_Lass::\n\t.string \"These REST HOUSES are so nice.\\n\"\n\t.string \"I love sprawling out here.\\p\"\n\t.string \"Our steps aren't counted while we're\\n\"\n\t.string \"resting, so they're not wasted!$\"\n\nSafariZone_NorthWest_RestHouse_EventScript_Worker::\n\tmsgbox SafariZone_NorthWest_RestHouse_Text_Worker, MSGBOX_NPC\n\tend\n\nSafariZone_NorthWest_RestHouse_Text_Worker::\n\t.string \"We thought we'd have to landscape\\n\"\n\t.string \"this whole area to make it a\\l\"\n\t.string \"suitable POKéMON habitat.\\p\"\n\t.string \"But we cut through the trees and\\n\"\n\t.string \"discovered a lovely natural vista.\\p\"\n\t.string \"We imported rare POKéMON to fill it!\\n\"\n\t.string \"I hope you're enjoying yourself!$\"\n\nSafariZone_NorthWest_RestHouse_EventScript_Clipboard::\n\tmsgbox SafariZone_NorthWest_RestHouse_Text_Clipboard, MSGBOX_NPC\n\tend\n\nSafariZone_NorthWest_RestHouse_Text_Clipboard::\n\t.string \"It's a message from the SAFARI\\n\"\n\t.string \"ZONE WARDEN.\\p\"\n\t.string \"“I just heard that the SAFARI ZONE\\n\"\n\t.string \"in HOENN has opened a new wing\\l\"\n\t.string \"with exotic POKéMON!\\p\"\n\t.string \"We can't allow our beloved SAFARI\\n\"\n\t.string \"ZONE to become out of date!\\p\"\n\t.string \"I'm putting a team together to\\n\"\n\t.string \"scout for viable expansion sites.\\p\"\n\t.string \"Interested employees please sign up\\n\"\n\t.string \"at the office.”\\p\"\n\t.string \"- WARDEN BAOBA$\"\n\nSafariZone_NorthWest_RestHouse_EventScript_Stepmonger::\n\tcallnative SafariZoneCheckSteps\n\tgoto_if_eq VAR_RESULT, 600, SafariZone_NorthWest_RestHouse_EventScript_StepmongerFull\n\tmsgbox SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_0\n\tshowmoneybox 0, 0\n\tmsgbox SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_2\n\tcheckmoney 750\n\tgoto_if_eq VAR_RESULT, FALSE, SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_5\n\tremovemoney 750\n\tupdatemoneybox\n\ttextcolor 3\n\tplayfanfare MUS_LEVEL_UP\n\tmsgbox SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_3\n\twaitfanfare\n\tcall EventScript_RestorePrevTextColor\n\tmsgbox SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_4, MSGBOX_NPC\n\thidemoneybox\n\tcallnative SafariZoneRefillSteps\n\trelease\n\tend\n\nSafariZone_NorthWest_RestHouse_EventScript_Stepmonger_2:\n\tmsgbox SafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_2, MSGBOX_NPC\n\thidemoneybox\n\tend\n\nSafariZone_NorthWest_RestHouse_EventScript_Stepmonger_5:\n\tmsgbox FuchsiaCity_SafariZone_Entrance_Text_OopsNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nSafariZone_NorthWest_RestHouse_EventScript_StepmongerFull:\n\tmsgbox SafariZone_NorthWest_RestHouse_Text_StepmongerFull, MSGBOX_NPC\n\tend\n\nSafariZone_NorthWest_RestHouse_Text_StepmongerFull:\n\t.string \"Welcome to AREA 4!\\nYour step allowance is full.\\pWe don't count time spent\\ninside REST HOUSES.\\pCome back when you run low\\non steps!$\"\n\nSafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_0:\n\t.string \"Welcome to AREA 4!\\nDo you need more steps?$\"\n\nSafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_1:\n\t.string \"I can refill your step allowance\\nfor ¥750.\\pDo you want to refill your steps?$\"\n\nSafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_2:\n\t.string \"Okay, I wish you the best of luck\\non your SAFARI GAME!$\"\n\nSafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_3:\n\t.string \"{PLAYER}'s steps were refilled!$\"\n\nSafariZone_NorthWest_RestHouse_EventScript_Stepmonger_Text_4:\n\t.string \"Your steps are topped up!\\nGood luck on your wild excursion!$\""
  },
  {
    "path": "data/maps/SafariZone_NorthWest_RestHouse/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/SafariZone_North_RestHouse/map.json",
    "content": "{\n  \"id\": \"MAP_SAFARI_ZONE_NORTH_REST_HOUSE\",\n  \"name\": \"SafariZone_North_RestHouse\",\n  \"layout\": \"LAYOUT_SAFARI_ZONE_REST_HOUSE\",\n  \"music\": \"MUS_EVOLUTION\",\n  \"region_map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_North_RestHouse_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_North_RestHouse_EventScript_Scientist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_North_RestHouse_EventScript_Fisher\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 11,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_North_RestHouse_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"12\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"12\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"12\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SafariZone_North_RestHouse/scripts.inc",
    "content": "SafariZone_North_RestHouse_MapScripts::\n\t.byte 0\n\nSafariZone_North_RestHouse_EventScript_Fisher::\n\tmsgbox SafariZone_East_Text_PrizeInDeepestPartOfSafariZone, MSGBOX_NPC\n\tend\n\nSafariZone_North_RestHouse_EventScript_Scientist::\n\tmsgbox SafariZone_East_Text_KeepAnyItemFoundOnSafari, MSGBOX_NPC\n\tend\n\nSafariZone_North_RestHouse_EventScript_Gentleman::\n\tmsgbox SafariZone_East_Text_MyEeveeEvolvedIntoFlareon, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SafariZone_North_RestHouse/text.inc",
    "content": "SafariZone_East_Text_KeepAnyItemFoundOnSafari::\n    .string \"You can keep any item you find in\\n\"\n    .string \"the SAFARI ZONE.\\p\"\n    .string \"But, you'll run out of time if you\\n\"\n    .string \"try for all of them at once.$\"\n\nSafariZone_East_Text_PrizeInDeepestPartOfSafariZone::\n    .string \"Go to the deepest part of the\\n\"\n    .string \"SAFARI ZONE. You will win a prize!$\"\n\nSafariZone_East_Text_MyEeveeEvolvedIntoFlareon::\n    .string \"My EEVEE evolved into FLAREON.\\p\"\n    .string \"But, a friend's EEVEE turned into a\\n\"\n    .string \"VAPOREON. I wonder why?$\"\n\n"
  },
  {
    "path": "data/maps/SafariZone_SecretHouse/map.json",
    "content": "{\n  \"id\": \"MAP_SAFARI_ZONE_SECRET_HOUSE\",\n  \"name\": \"SafariZone_SecretHouse\",\n  \"layout\": \"LAYOUT_SAFARI_ZONE_SECRET_HOUSE\",\n  \"music\": \"MUS_EVOLUTION\",\n  \"region_map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_SecretHouse_EventScript_Attendant\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"9\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"9\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"9\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SafariZone_SecretHouse/scripts.inc",
    "content": "SafariZone_SecretHouse_MapScripts::\n\t.byte 0\n\nSafariZone_SecretHouse_EventScript_Attendant::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_HM03, SafariZone_SecretHouse_EventScript_ExplainSurf\n\tmsgbox SafariZone_SecretHouse_Text_CongratsYouveWon\n\tcheckitemspace ITEM_HM03\n\tgoto_if_eq VAR_RESULT, FALSE, SafariZone_SecretHouse_EventScript_NoRoomForHM03\n\tgiveitem_msg SafariZone_SecretHouse_Text_ReceivedHM03FromAttendant, ITEM_HM03\n\tmsgbox SafariZone_SecretHouse_Text_ExplainSurf\n\tsetflag FLAG_GOT_HM03\n\trelease\n\tend\n\nSafariZone_SecretHouse_EventScript_NoRoomForHM03::\n\tmsgbox SafariZone_SecretHouse_Text_DontHaveRoomForPrize\n\trelease\n\tend\n\nSafariZone_SecretHouse_EventScript_ExplainSurf::\n\tmsgbox SafariZone_SecretHouse_Text_ExplainSurf\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SafariZone_SecretHouse/text.inc",
    "content": "SafariZone_SecretHouse_Text_CongratsYouveWon::\n    .string \"Ah! Finally!\\p\"\n    .string \"You're the first person to reach\\n\"\n    .string \"the SECRET HOUSE!\\p\"\n    .string \"Although I made a campaign\\n\"\n    .string \"for our grand opening,\\p\"\n    .string \"I was getting worried that no one\\n\"\n    .string \"would win our campaign prize.\\p\"\n    .string \"Congratulations!\\n\"\n    .string \"You have won!$\"\n\nSafariZone_SecretHouse_Text_ReceivedHM03FromAttendant::\n    .string \"{PLAYER} received HM03\\n\"\n    .string \"from the attendant!$\"\n\nSafariZone_SecretHouse_Text_ExplainSurf::\n    .string \"HM03 is SURF.\\p\"\n    .string \"POKéMON will be able to ferry you\\n\"\n    .string \"across water using it.\\p\"\n    .string \"And, this HM isn't disposable, so\\n\"\n    .string \"you can use it over and over.\\p\"\n    .string \"You're super lucky for winning this\\n\"\n    .string \"fabulous prize!$\"\n\nSafariZone_SecretHouse_Text_DontHaveRoomForPrize::\n    .string \"You don't have room for this\\n\"\n    .string \"fabulous prize!$\"\n\n"
  },
  {
    "path": "data/maps/SafariZone_West/map.json",
    "content": "{\n  \"id\": \"MAP_SAFARI_ZONE_WEST\",\n  \"name\": \"SafariZone_West\",\n  \"layout\": \"LAYOUT_SAFARI_ZONE_WEST\",\n  \"music\": \"MUS_EVOLUTION\",\n  \"region_map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_West_EventScript_ItemGoldTeeth\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_WEST_GOLD_TEETH\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_West_EventScript_ItemTM32\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_WEST_TM32\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_West_EventScript_ItemMaxPotion\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_WEST_MAX_POTION\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_West_EventScript_ItemMaxRevive\",\n      \"flag\": \"FLAG_HIDE_SAFARI_ZONE_WEST_MAX_REVIVE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 30,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 32,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 37,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 38,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 39,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_NORTH\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 40,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 40,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 40,\n      \"y\": 28,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_CENTER\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_SECRET_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST_REST_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 27,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_West_EventScript_LostTeethNotice\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 36,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_West_EventScript_TrainerTips\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 35,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_West_EventScript_AreaSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 22,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SafariZone_West_EventScript_RestHouseSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 13,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"item\": \"ITEM_REVIVE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SAFARI_ZONE_WEST_REVIVE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SafariZone_West/scripts.inc",
    "content": "SafariZone_West_MapScripts::\n\t.byte 0\n\nSafariZone_West_EventScript_RestHouseSign::\n\tmsgbox SafariZone_West_Text_RestHouse, MSGBOX_SIGN\n\tend\n\nSafariZone_West_EventScript_LostTeethNotice::\n\tmsgbox SafariZone_West_Text_PleaseFindWardensLostTeeth, MSGBOX_SIGN\n\tend\n\nSafariZone_West_EventScript_TrainerTips::\n\tmsgbox SafariZone_West_Text_SearchForSecretHouse, MSGBOX_SIGN\n\tend\n\nSafariZone_West_EventScript_AreaSign::\n\tmsgbox SafariZone_West_Text_AreaSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SafariZone_West/text.inc",
    "content": "SafariZone_West_Text_RestHouse::\n    .string \"REST HOUSE$\"\n\nSafariZone_West_Text_PleaseFindWardensLostTeeth::\n    .string \"REQUEST NOTICE\\p\"\n    .string \"Please find the SAFARI WARDEN's\\n\"\n    .string \"lost GOLD TEETH.\\l\"\n    .string \"They're around here somewhere.\\p\"\n    .string \"Reward offered!\\n\"\n    .string \"Contact: WARDEN$\"\n\nSafariZone_West_Text_SearchForSecretHouse::\n    .string \"TRAINER TIPS\\p\"\n    .string \"Zone Exploration Campaign!\\n\"\n    .string \"The Search for the SECRET HOUSE!$\"\n\nSafariZone_West_Text_AreaSign::\n    .string \"AREA 3\\n\"\n    .string \"EAST: CENTER AREA$\"\n\n"
  },
  {
    "path": "data/maps/SafariZone_West_RestHouse/map.json",
    "content": "{\n  \"id\": \"MAP_SAFARI_ZONE_WEST_REST_HOUSE\",\n  \"name\": \"SafariZone_West_RestHouse\",\n  \"layout\": \"LAYOUT_SAFARI_ZONE_REST_HOUSE\",\n  \"music\": \"MUS_EVOLUTION\",\n  \"region_map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_West_RestHouse_EventScript_Scientist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_West_RestHouse_EventScript_Man\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"x\": 7,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SafariZone_West_RestHouse_EventScript_CooltrainerF\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"10\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"10\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFARI_ZONE_WEST\",\n      \"dest_warp_id\": \"10\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SafariZone_West_RestHouse/scripts.inc",
    "content": "SafariZone_West_RestHouse_MapScripts::\n\t.byte 0\n\nSafariZone_West_RestHouse_EventScript_Man::\n\tmsgbox SafariZone_West_Text_BaitMakesMonStickAround, MSGBOX_NPC\n\tend\n\nSafariZone_West_RestHouse_EventScript_Scientist::\n\tmsgbox SafariZone_West_Text_RocksMakeMonRunButEasierCatch, MSGBOX_NPC\n\tend\n\nSafariZone_West_RestHouse_EventScript_CooltrainerF::\n\tmsgbox SafariZone_West_Text_HikedLotsDidntSeeMonIWanted, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SafariZone_West_RestHouse/text.inc",
    "content": "SafariZone_West_Text_KogaPatrolsSafariEverySoOften::\n    .string \"The SAFARI ZONE's huge, wouldn't\\n\"\n    .string \"you say?\\p\"\n    .string \"FUCHSIA's GYM LEADER, KOGA, \\n\"\n    .string \"patrols the grounds every so often.\\p\"\n    .string \"Thanks to him, we can play here\\n\"\n    .string \"knowing that we're safe.$\"\n\nSafariZone_West_Text_RocksMakeMonRunButEasierCatch::\n    .string \"Tossing ROCKS at POKéMON might\\n\"\n    .string \"make them run, but they'll be\\l\"\n    .string \"easier to catch.$\"\n\nSafariZone_West_Text_BaitMakesMonStickAround::\n    .string \"Using BAIT will make POKéMON more\\n\"\n    .string \"likely to stick around if they get\\l\"\n    .string \"busy eating.$\"\n\nSafariZone_West_Text_HikedLotsDidntSeeMonIWanted::\n    .string \"I hiked a lot, but I didn't see any\\n\"\n    .string \"POKéMON I wanted.$\"\n\n"
  },
  {
    "path": "data/maps/SaffronCity/map.json",
    "content": "{\n  \"id\": \"MAP_SAFFRON_CITY\",\n  \"name\": \"SaffronCity\",\n  \"layout\": \"LAYOUT_SAFFRON_CITY\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_SAFFRON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE5\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 12,\n      \"map\": \"MAP_ROUTE6\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE7\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE8\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_RocketGrunt1\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_RocketGrunt2\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 46,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_RocketGrunt3\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_RocketGrunt4\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 7,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_RocketGrunt5\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 34,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_DoorGuardGrunt\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 39,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 5,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_RocketGrunt7\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 48,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_RocketGrunt6\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 37,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_Youngster\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_WorkerM\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 39,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_Man\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 44,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_Boy\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PIDGEOT\",\n      \"in_connection\": false,\n      \"x\": 45,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_Pidgeot\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 39,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 5,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_Lass\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BATTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 47,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_BattleGirl\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 39,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Ponyta\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Rapidash\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Clefairy\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 48,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_IN_PLACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_EventScript_DynamicPunchTutor\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 33,\n      \"y\": 30,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFFRON_CITY_COPYCATS_HOUSE_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 40,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFFRON_CITY_DOJO\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 46,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 27,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFFRON_CITY_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 40,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFFRON_CITY_MART\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 24,\n      \"y\": 38,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFFRON_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 43,\n      \"y\": 38,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFFRON_CITY_MR_PSYCHICS_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE7_EAST_ENTRANCE\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 34,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE5_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 58,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE8_WEST_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 34,\n      \"y\": 46,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE6_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 35,\n      \"y\": 46,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE6_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 35,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE5_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 47,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 29,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_EventScript_CitySign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 42,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_EventScript_DojoSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_EventScript_SilphProductSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 18,\n      \"y\": 30,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_EventScript_TrainerTips2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 29,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_EventScript_SilphCoSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 54,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_EventScript_TrainerTips1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 50,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_EventScript_GymSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 40,\n      \"y\": 38,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_EventScript_MrPsychicsHouseSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 49,\n      \"y\": 22,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_EventScript_TrainerFanClubSign\"\n    }\n  ],\n  \"connections_no_include\": \"\",\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SaffronCity/scripts.inc",
    "content": ".set LOCALID_DOOR_GUARD_GRUNT, 6\n.set LOCALID_PONYTA_MASTER,    16\n.set LOCALID_RAPIDASH_MASTER,  17\n.set LOCALID_CLEFAIRY_MASTER,  18\n.set TRAINER, VAR_0x8009\n\nSaffronCity_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SaffronCity_OnTransition\n\t.byte 0\n\nSaffronCity_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_SAFFRON_CITY\n\tcall_if_unset FLAG_RESCUED_MR_FUJI, SaffronCity_EventScript_MoveDoorGuardGrunt\n\tgoto SaffronCity_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nSaffronCity_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_PONYTA\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_MapScript_PonytaMasterMovementType\n\tsetvar TRAINER, MASTER_RAPIDASH\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_MapScript_RapidashMasterMovementType\n\tsetvar TRAINER, MASTER_CLEFAIRY\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_MapScript_ClefairyMasterMovementType\n\tend\n\nSaffronCity_MapScript_PonytaMasterMovementType::\n\tsetobjectmovementtype LOCALID_PONYTA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\t\nSaffronCity_MapScript_RapidashMasterMovementType::\n\tsetobjectmovementtype LOCALID_RAPIDASH_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nSaffronCity_MapScript_ClefairyMasterMovementType::\n\tsetobjectmovementtype LOCALID_CLEFAIRY_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nSaffronCity_EventScript_MoveDoorGuardGrunt::\n\tsetobjectxyperm LOCALID_DOOR_GUARD_GRUNT, 33, 31\n\treturn\n\nSaffronCity_EventScript_RocketGrunt1::\n\tmsgbox SaffronCity_Text_WhatDoYouWantGetLost, MSGBOX_NPC\n\tend\n\nSaffronCity_EventScript_RocketGrunt2::\n\tmsgbox SaffronCity_Text_BossTakeTownForTeamRocket, MSGBOX_NPC\n\tend\n\nSaffronCity_EventScript_RocketGrunt3::\n\tmsgbox SaffronCity_Text_DontGetDefiantOrIllHurtYou, MSGBOX_NPC\n\tend\n\nSaffronCity_EventScript_RocketGrunt4::\n\tmsgbox SaffronCity_Text_SaffronBelongsToTeamRocket, MSGBOX_NPC\n\tend\n\nSaffronCity_EventScript_RocketGrunt5::\n\tmsgbox SaffronCity_Text_CriminalLifeMakesMeFeelAlive, MSGBOX_NPC\n\tend\n\nSaffronCity_EventScript_RocketGrunt6::\n\tmsgbox SaffronCity_Text_WatchWhereYoureWalking, MSGBOX_NPC\n\tend\n\nSaffronCity_EventScript_RocketGrunt7::\n\tmsgbox SaffronCity_Text_WeCanExploitMonsAroundWorld, MSGBOX_NPC\n\tend\n\nSaffronCity_EventScript_DoorGuardGrunt::\n\tlock\n\tgoto_if_set FLAG_RESCUED_MR_FUJI, SaffronCity_EventScript_DoorGuardAsleep\n\tapplymovement LOCALID_DOOR_GUARD_GRUNT, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox SaffronCity_Text_ImASecurityGuard\n\trelease\n\tend\n\nSaffronCity_EventScript_DoorGuardAsleep::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox SaffronCity_Text_HesTakingASnooze\n\trelease\n\tend\n\nSaffronCity_EventScript_WorkerM::\n\tmsgbox SaffronCity_Text_YouBeatTeamRocket, MSGBOX_NPC\n\tend\n\nSaffronCity_EventScript_Youngster::\n\tmsgbox SaffronCity_Text_SafeToGoOutAgain, MSGBOX_NPC\n\tend\n\nSaffronCity_EventScript_Lass::\n\tmsgbox SaffronCity_Text_PeopleComingBackToSaffron, MSGBOX_NPC\n\tend\n\nSaffronCity_EventScript_Boy::\n\tmsgbox SaffronCity_Text_FlewHereOnPidgeot, MSGBOX_NPC\n\tend\n\nSaffronCity_EventScript_Pidgeot::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_PIDGEOT, CRY_MODE_NORMAL\n\tmsgbox SaffronCity_Text_Pidgeot\n\twaitmoncry\n\trelease\n\tend\n\nSaffronCity_EventScript_Man::\n\tmsgbox SaffronCity_Text_SawRocketBossEscaping, MSGBOX_NPC\n\tend\n\nSaffronCity_EventScript_CitySign::\n\tmsgbox SaffronCity_Text_CitySign, MSGBOX_SIGN\n\tend\n\nSaffronCity_EventScript_DojoSign::\n\tmsgbox SaffronCity_Text_FightingDojo, MSGBOX_SIGN\n\tend\n\nSaffronCity_EventScript_GymSign::\n\tlockall\n\tfamechecker FAMECHECKER_SABRINA, 0\n\tmsgbox SaffronCity_Text_GymSign\n\treleaseall\n\tend\n\nSaffronCity_EventScript_TrainerTips1::\n\tmsgbox SaffronCity_Text_FullHealCuresStatus, MSGBOX_SIGN\n\tend\n\nSaffronCity_EventScript_TrainerTips2::\n\tmsgbox SaffronCity_Text_GreatBallImprovedCatchRate, MSGBOX_SIGN\n\tend\n\nSaffronCity_EventScript_SilphCoSign::\n\tmsgbox SaffronCity_Text_SilphCoSign, MSGBOX_SIGN\n\tend\n\nSaffronCity_EventScript_MrPsychicsHouseSign::\n\tmsgbox SaffronCity_Text_MrPsychicsHouse, MSGBOX_SIGN\n\tend\n\nSaffronCity_EventScript_SilphProductSign::\n\tmsgbox SaffronCity_Text_SilphsLatestProduct, MSGBOX_SIGN\n\tend\n\nSaffronCity_EventScript_TrainerFanClubSign::\n\tmsgbox SaffronCity_Text_TrainerFanClubSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SaffronCity/text.inc",
    "content": "SaffronCity_Text_WhatDoYouWantGetLost::\n    .string \"What do you want?\\n\"\n    .string \"Get lost!$\"\n\nSaffronCity_Text_BossTakeTownForTeamRocket::\n    .string \"BOSS said he'll take this town\\n\"\n    .string \"in the name of TEAM ROCKET!$\"\n\nSaffronCity_Text_DontGetDefiantOrIllHurtYou::\n    .string \"Don't get defiant!\\n\"\n    .string \"Or I'll have to hurt you!$\"\n\nSaffronCity_Text_SaffronBelongsToTeamRocket::\n    .string \"SAFFRON belongs to TEAM ROCKET!$\"\n\nSaffronCity_Text_CriminalLifeMakesMeFeelAlive::\n    .string \"My life as a criminal makes me feel\\n\"\n    .string \"so alive!$\"\n\nSaffronCity_Text_WatchWhereYoureWalking::\n    .string \"Ow!\\n\"\n    .string \"Watch where you're walking!$\"\n\nSaffronCity_Text_WeCanExploitMonsAroundWorld::\n    .string \"With SILPH under control, we can\\n\"\n    .string \"exploit POKéMON around the world!\\p\"\n    .string \"We'll get stinking rich, yeahah!$\"\n\nSaffronCity_Text_YouBeatTeamRocket::\n    .string \"You beat TEAM ROCKET all alone?\\n\"\n    .string \"That's amazing!$\"\n\nSaffronCity_Text_SafeToGoOutAgain::\n    .string \"Yeah! TEAM ROCKET is gone!\\n\"\n    .string \"It's safe to go out again!$\"\n\nSaffronCity_Text_PeopleComingBackToSaffron::\n    .string \"People fled from here in droves\\n\"\n    .string \"when those ROCKETS came.\\p\"\n    .string \"They should be flocking back to\\n\"\n    .string \"SAFFRON now.$\"\n\nSaffronCity_Text_FlewHereOnPidgeot::\n    .string \"I flew here on my PIDGEOT when\\n\"\n    .string \"I read about SILPH.\\p\"\n    .string \"It's already over?\\n\"\n    .string \"I missed the media action…$\"\n\nSaffronCity_Text_Pidgeot::\n    .string \"PIDGEOT: Bi bibii!$\"\n\nSaffronCity_Text_SawRocketBossEscaping::\n    .string \"I saw the ROCKET BOSS escaping\\n\"\n    .string \"SILPH's building.$\"\n\nSaffronCity_Text_ImASecurityGuard::\n    .string \"I'm a security guard.\\p\"\n    .string \"Suspicious kids I don't allow in!$\"\n\nSaffronCity_Text_HesTakingASnooze::\n    .string \"…\\n\"\n    .string \"Snore…\\p\"\n    .string \"Hah! He's taking a snooze!$\"\n\nSaffronCity_Text_CitySign::\n    .string \"SAFFRON CITY\\n\"\n    .string \"Shining, Golden Land of Commerce$\"\n\nSaffronCity_Text_FightingDojo::\n    .string \"FIGHTING DOJO$\"\n\nSaffronCity_Text_GymSign::\n    .string \"SAFFRON CITY POKéMON GYM\\n\"\n    .string \"LEADER: SABRINA\\l\"\n    .string \"The Master of PSYCHIC POKéMON!$\"\n\nSaffronCity_Text_FullHealCuresStatus::\n    .string \"TRAINER TIPS\\p\"\n    .string \"FULL HEAL cures all ailments like\\n\"\n    .string \"burns, paralysis, poisoning,\\l\"\n    .string \"freezing, and sleep.\\p\"\n    .string \"It costs a bit more, but it's more\\n\"\n    .string \"convenient than buying other items.$\"\n\nSaffronCity_Text_GreatBallImprovedCatchRate::\n    .string \"TRAINER TIPS\\p\"\n    .string \"The new GREAT BALL offers improved\\n\"\n    .string \"catching rates.\\p\"\n    .string \"Try it on those hard-to-catch\\n\"\n    .string \"POKéMON.$\"\n\nSaffronCity_Text_SilphCoSign::\n    .string \"SILPH CO. OFFICE BUILDING$\"\n\nSaffronCity_Text_MrPsychicsHouse::\n    .string \"MR. PSYCHIC'S HOUSE$\"\n\nSaffronCity_Text_SilphsLatestProduct::\n    .string \"SILPH's latest product!\\n\"\n    .string \"Release to be determined…$\"\n\nSaffronCity_Text_TrainerFanClubSign::\n    .string \"POKéMON TRAINER FAN CLUB\\p\"\n    .string \"Many TRAINERS have scribbled their\\n\"\n    .string \"names on this sign.$\"\n\nSaffronCity_Text_HowCanClubNotRecognizeLance::\n    .string \"This FAN CLUB…\\n\"\n    .string \"No one here has a clue!\\p\"\n    .string \"How could they not recognize\\n\"\n    .string \"the brilliance that is LANCE?\\p\"\n    .string \"He stands for justice!\\n\"\n    .string \"He's cool, and yet passionate!\\l\"\n    .string \"He's the greatest, LANCE!$\"\n\n"
  },
  {
    "path": "data/maps/SaffronCity_Connection/map.json",
    "content": "{\n  \"id\": \"MAP_SAFFRON_CITY_CONNECTION\",\n  \"name\": \"SaffronCity_Connection\",\n  \"layout\": \"LAYOUT_SAFFRON_CITY_CONNECTION\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_SAFFRON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE5\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_ROUTE6\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE7\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE8\"\n    }\n  ],\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SaffronCity_Connection/scripts.inc",
    "content": "SaffronCity_Connection_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/SaffronCity_CopycatsHouse_1F/map.json",
    "content": "{\n  \"id\": \"MAP_SAFFRON_CITY_COPYCATS_HOUSE_1F\",\n  \"name\": \"SaffronCity_CopycatsHouse_1F\",\n  \"layout\": \"LAYOUT_SAFFRON_CITY_COPYCATS_HOUSE_1F\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_SAFFRON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 8,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_CopycatsHouse_1F_EventScript_CopycatsDad\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_3\",\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_CopycatsHouse_1F_EventScript_CopycatsMom\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANSEY\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_CopycatsHouse_1F_EventScript_Chansey\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_COPYCATS_HOUSE_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SaffronCity_CopycatsHouse_1F/scripts.inc",
    "content": "SaffronCity_CopycatsHouse_1F_MapScripts::\n\t.byte 0\n\nSaffronCity_CopycatsHouse_1F_EventScript_CopycatsMom::\n\tmsgbox SaffronCity_CopycatsHouse_1F_Text_DaughterIsSelfCentered, MSGBOX_NPC\n\tend\n\nSaffronCity_CopycatsHouse_1F_EventScript_CopycatsDad::\n\tmsgbox SaffronCity_CopycatsHouse_1F_Text_DaughterLikesToMimicPeople, MSGBOX_NPC\n\tend\n\nSaffronCity_CopycatsHouse_1F_EventScript_Chansey::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_CHANSEY, CRY_MODE_NORMAL\n\tmsgbox SaffronCity_CopycatsHouse_1F_Text_Chansey\n\twaitmoncry\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SaffronCity_CopycatsHouse_1F/text.inc",
    "content": "SaffronCity_CopycatsHouse_1F_Text_DaughterIsSelfCentered::\n    .string \"My daughter is so self-centered.\\n\"\n    .string \"She has but a few friends.$\"\n\nSaffronCity_CopycatsHouse_1F_Text_DaughterLikesToMimicPeople::\n    .string \"My daughter likes to mimic people.\\n\"\n    .string \"It's rather vexing.\\p\"\n    .string \"Her mimicry has earned her the\\n\"\n    .string \"nickname COPYCAT around here.$\"\n\nSaffronCity_CopycatsHouse_1F_Text_Chansey::\n    .string \"CHANSEY: Chaan! Sii!$\"\n\n"
  },
  {
    "path": "data/maps/SaffronCity_CopycatsHouse_2F/map.json",
    "content": "{\n  \"id\": \"MAP_SAFFRON_CITY_COPYCATS_HOUSE_2F\",\n  \"name\": \"SaffronCity_CopycatsHouse_2F\",\n  \"layout\": \"LAYOUT_SAFFRON_CITY_COPYCATS_HOUSE_2F\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_SAFFRON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_DODUO\",\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_CopycatsHouse_2F_EventScript_Doduo\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PIKACHU\",\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_CopycatsHouse_2F_EventScript_Doll\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_JIGGLYPUFF\",\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_CopycatsHouse_2F_EventScript_Doll\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_CopycatsHouse_2F_EventScript_Copycat\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_COPYCATS_HOUSE_1F\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_CopycatsHouse_2F_EventScript_Computer\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_CopycatsHouse_2F_EventScript_Game\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"item\": \"ITEM_NUGGET\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SAFFRON_CITY_COPYCATS_HOUSE_2F_NUGGET\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SaffronCity_CopycatsHouse_2F/scripts.inc",
    "content": "SaffronCity_CopycatsHouse_2F_MapScripts::\n\t.byte 0\n\nSaffronCity_CopycatsHouse_2F_EventScript_Doduo::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_DODUO, CRY_MODE_NORMAL\n\tmsgbox SaffronCity_CopycatsHouse_2F_Text_Doduo\n\twaitmoncry\n\trelease\n\tend\n\nSaffronCity_CopycatsHouse_2F_EventScript_Doll::\n\tlock\n\tmsgbox SaffronCity_CopycatsHouse_2F_Text_RareMonOnlyDoll\n\trelease\n\tend\n\nSaffronCity_CopycatsHouse_2F_EventScript_Copycat::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tcheckitem ITEM_POKE_DOLL\n\tgoto_if_eq VAR_RESULT, TRUE, EventScript_MimicTutor\n\tcheckplayergender\n\tcall_if_eq VAR_RESULT, MALE, SaffronCity_CopycatsHouse_2F_EventScript_MimicPlayerMale\n\tcall_if_eq VAR_RESULT, FEMALE, SaffronCity_CopycatsHouse_2F_EventScript_MimicPlayerFemale\n\trelease\n\tend\n\nSaffronCity_CopycatsHouse_2F_EventScript_MimicPlayerMale::\n\tmsgbox SaffronCity_CopycatsHouse_2F_Text_MimickingFavoriteHobbyMale\n\treturn\n\nSaffronCity_CopycatsHouse_2F_EventScript_MimicPlayerFemale::\n\tmsgbox SaffronCity_CopycatsHouse_2F_Text_MimickingFavoriteHobbyFemale\n\treturn\n\nSaffronCity_CopycatsHouse_2F_EventScript_Computer::\n\tmsgbox SaffronCity_CopycatsHouse_2F_Text_MySecrets, MSGBOX_SIGN\n\tend\n\nSaffronCity_CopycatsHouse_2F_EventScript_Game::\n\tmsgbox SaffronCity_CopycatsHouse_2F_Text_MarioWearingABucket, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SaffronCity_CopycatsHouse_2F/text.inc",
    "content": "SaffronCity_CopycatsHouse_2F_Text_MimickingFavoriteHobbyMale::\n    .string \"{PLAYER}: Hi!\\n\"\n    .string \"Do you like POKéMON?\\p\"\n    .string \"{PLAYER}: Uh, no, I just asked you.\\p\"\n    .string \"{PLAYER}: Huh?\\n\"\n    .string \"You're strange!\\p\"\n    .string \"COPYCAT: Hmm? Quit mimicking?\\n\"\n    .string \"But, that's my favorite hobby!$\"\n\nSaffronCity_CopycatsHouse_2F_Text_MimickingFavoriteHobbyFemale::\n    .string \"{PLAYER}: Hi.\\n\"\n    .string \"You must like POKéMON.\\p\"\n    .string \"{PLAYER}: No, not me.\\n\"\n    .string \"I asked you.\\p\"\n    .string \"{PLAYER}: Pardon?\\n\"\n    .string \"You're weird!\\l\"\n    .string \" \\l\"\n    .string \"COPYCAT: Hmm? Quit mimicking?\\l\"\n    .string \"But that's my favorite hobby!$\"\n\nText_MimicTeach::\n    .string \"Oh wow!\\n\"\n    .string \"A POKé DOLL!\\p\"\n    .string \"For me?\\n\"\n    .string \"Thank you!\\p\"\n    .string \"You know what?\\n\"\n    .string \"I can teach the move MIMIC.$\"\n\nText_MimicDeclined::\n    .string \"Don't you like MIMIC?$\"\n\nText_MimicWhichMon::\n    .string \"I really love MIMIC!\\n\"\n    .string \"Who's going to learn it?$\"\n\nText_MimicTaughtMale::\n    .string \"{PLAYER}: Hi!\\n\"\n    .string \"Thanks for earlier!\\p\"\n    .string \"{PLAYER}: Pardon?\\p\"\n    .string \"{PLAYER}: Is it that fun to mimic my\\n\"\n    .string \"every move?\\p\"\n    .string \"COPYCAT: You bet!\\n\"\n    .string \"It's a scream!$\"\n\nText_MimicTaughtFemale::\n    .string \"{PLAYER}: Hi!\\n\"\n    .string \"Thanks for what you did for us.\\p\"\n    .string \"{PLAYER}: Pardon?\\p\"\n    .string \"{PLAYER}: Is it really that fun to\\n\"\n    .string \"copy what I say and do?\\p\"\n    .string \"COPYCAT: You bet!\\n\"\n    .string \"It's a scream!$\"\n\nText_MimicReteach::\n    .string \"{PLAYER}: Hi!\\n\"\n    .string \"Could you teach us MIMIC again?\\p\"\n    .string \"{PLAYER}: Pardon?\\p\"\n    .string \"{PLAYER}: Is it that fun to copy my\\n\"\n    .string \"every word?\\p\"\n    .string \"COPYCAT: Absolutely!\\n\"\n    .string \"It's a scream!\\p\"\n    .string \"I can reteach MIMIC if you'll give\\n\"\n    .string \"me ¥5000 for more dolls!$\"\n\nText_MimicReteach2::\n    .string \"Is that okay?\\n\"\n    .string \"Should I mimic teaching MIMIC?$\"\n\nText_MimicNotEnoughMoney::\n    .string \"{PLAYER}: ¥5000?\\n\"\n    .string \"But a POKé DOLL only costs ¥1000!\\p\"\n    .string \"I don't have enough money for\\n\"\n    .string \"that right now…\\p\"\n    .string \"COPYCAT: I want to buy five\\n\"\n    .string \"POKé DOLLS! So I need ¥5000!\\p\"\n    .string \"I'll mimic teaching MIMIC to\\n\"\n    .string \"your POKéMON when you have it!$\"\n\nText_MimicTaughtMale2::\n    .string \"{PLAYER}: Okay!\\n\"\n    .string \"Thanks for that!\\p\"\n    .string \"{PLAYER}: Pardon?\\p\"\n    .string \"{PLAYER}: Is it that fun to mimic my\\n\"\n    .string \"every move?\\p\"\n    .string \"COPYCAT: You bet!\\n\"\n    .string \"It's a scream!$\"\n\nText_MimicTaughtFemale2::\n    .string \"{PLAYER}: Okay!\\n\"\n    .string \"Thanks for what you did for us.\\p\"\n    .string \"{PLAYER}: Pardon?\\p\"\n    .string \"{PLAYER}: Is it really that fun to\\n\"\n    .string \"copy what I say and do?\\p\"\n    .string \"COPYCAT: You bet!\\n\"\n    .string \"It's a scream!$\"\n\nSaffronCity_CopycatsHouse_2F_Text_Doduo::\n    .string \"DODUO: Giiih!\\p\"\n    .string \"PRETTY MIRROR LOOK AT ME,\\n\"\n    .string \"SEE HOW PRETTY I CAN BE?$\"\n\nSaffronCity_CopycatsHouse_2F_Text_RareMonOnlyDoll::\n    .string \"This is a rare POKéMON!\\n\"\n    .string \"Huh? It's only a doll!$\"\n\nSaffronCity_CopycatsHouse_2F_Text_MarioWearingABucket::\n    .string \"A game with MARIO wearing a bucket\\n\"\n    .string \"on his head!$\"\n\nSaffronCity_CopycatsHouse_2F_Text_MySecrets::\n    .string \"…\\p\"\n    .string \"My Secrets!\\p\"\n    .string \"Skill: Mimicry!\\n\"\n    .string \"Hobby: Collecting dolls!\\l\"\n    .string \"Favorite POKéMON: CLEFAIRY!$\"\n"
  },
  {
    "path": "data/maps/SaffronCity_Dojo/map.json",
    "content": "{\n  \"id\": \"MAP_SAFFRON_CITY_DOJO\",\n  \"name\": \"SaffronCity_Dojo\",\n  \"layout\": \"LAYOUT_SAFFRON_CITY_DOJO\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_SAFFRON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"7\",\n      \"script\": \"SaffronCity_Dojo_EventScript_Hitoshi\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"7\",\n      \"script\": \"SaffronCity_Dojo_EventScript_Hideki\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"7\",\n      \"script\": \"SaffronCity_Dojo_EventScript_Aaron\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"7\",\n      \"script\": \"SaffronCity_Dojo_EventScript_Mike\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SaffronCity_Dojo_EventScript_MasterKoichi\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_Dojo_EventScript_HitmonleeBall\",\n      \"flag\": \"FLAG_HIDE_DOJO_HITMONLEE_BALL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_Dojo_EventScript_HitmonchanBall\",\n      \"flag\": \"FLAG_HIDE_DOJO_HITMONCHAN_BALL\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BLACK_BELT\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Hitmonlee\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BLACK_BELT\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Hitmonchan\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_SAFFRON_CITY_DOJO\",\n      \"var_value\": \"0\",\n      \"script\": \"SaffronCity_Dojo_EventScript_TriggerMasterBattleLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_SAFFRON_CITY_DOJO\",\n      \"var_value\": \"0\",\n      \"script\": \"SaffronCity_Dojo_EventScript_TriggerMasterBattleRight\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_Dojo_EventScript_Statue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_Dojo_EventScript_Statue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_Dojo_EventScript_LeftScroll\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_Dojo_EventScript_RightScroll\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SaffronCity_Dojo/scripts.inc",
    "content": ".equ LOCALID_KARATE_MASTER, 5\n.set LOCALID_HITMONLEE_MASTER, 8\n.set LOCALID_HITMONCHAN_MASTER, 9\n.set TRAINER, VAR_0x8009\n\nSaffronCity_Dojo_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SaffronCity_Dojo_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nSaffronCity_Dojo_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_HITMONLEE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_Dojo_MapScript_HitmonleeMasterMovementType\n\tsetvar TRAINER, MASTER_HITMONCHAN\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_Dojo_MapScript_HitmonchanMasterMovementType\n\tend\n\nSaffronCity_Dojo_MapScript_HitmonleeMasterMovementType::\n\tsetobjectmovementtype LOCALID_HITMONLEE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nSaffronCity_Dojo_MapScript_HitmonchanMasterMovementType::\n\tsetobjectmovementtype LOCALID_HITMONCHAN_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nSaffronCity_Dojo_EventScript_TriggerMasterBattleLeft::\n\tlockall\n\tsetvar VAR_MAP_SCENE_SAFFRON_CITY_DOJO, 1\n\tapplymovement LOCALID_KARATE_MASTER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treleaseall\n\tend\n\nSaffronCity_Dojo_EventScript_TriggerMasterBattleRight::\n\tlockall\n\tsetvar VAR_MAP_SCENE_SAFFRON_CITY_DOJO, 1\n\tapplymovement LOCALID_KARATE_MASTER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\treleaseall\n\tend\n\nSaffronCity_Dojo_EventScript_HitmonleeBall::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_HITMON_FROM_DOJO, SaffronCity_Dojo_EventScript_AlreadyGotHitmon\n\tshowmonpic SPECIES_HITMONLEE, 10, 3\n\tsetvar VAR_TEMP_1, SPECIES_HITMONLEE\n\tapplymovement LOCALID_KARATE_MASTER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox SaffronCity_Dojo_Text_YouWantHitmonlee, MSGBOX_YESNO\n\tcall EventScript_RestorePrevTextColor\n\tgoto_if_eq VAR_RESULT, YES, SaffronCity_Dojo_EventScript_GiveHitmon\n\thidemonpic\n\trelease\n\tend\n\nSaffronCity_Dojo_EventScript_AlreadyGotHitmon::\n\tmsgbox SaffronCity_Dojo_Text_BetterNotGetGreedy\n\trelease\n\tend\n\nSaffronCity_Dojo_EventScript_HitmonchanBall::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_HITMON_FROM_DOJO, SaffronCity_Dojo_EventScript_AlreadyGotHitmon\n\tshowmonpic SPECIES_HITMONCHAN, 10, 3\n\tsetvar VAR_TEMP_1, SPECIES_HITMONCHAN\n\tapplymovement LOCALID_KARATE_MASTER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox SaffronCity_Dojo_Text_YouWantHitmonchan, MSGBOX_YESNO\n\tcall EventScript_RestorePrevTextColor\n\tgoto_if_eq VAR_RESULT, YES, SaffronCity_Dojo_EventScript_GiveHitmon\n\thidemonpic\n\trelease\n\tend\n\nSaffronCity_Dojo_EventScript_GiveHitmon::\n\thidemonpic\n\tgivemon VAR_TEMP_1, 25\n\tgoto_if_eq VAR_RESULT, 0, SaffronCity_Dojo_EventScript_ReceivedHitmonParty\n\tgoto_if_eq VAR_RESULT, 1, SaffronCity_Dojo_EventScript_ReceivedHitmonPC\n\tgoto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon\n\trelease\n\tend\n\nSaffronCity_Dojo_EventScript_ReceivedHitmonParty::\n\tremoveobject VAR_LAST_TALKED\n\tbufferspeciesname STR_VAR_1, VAR_TEMP_1\n\tplayfanfare MUS_LEVEL_UP\n\tmessage SaffronCity_Dojo_Text_ReceivedMonFromKarateMaster\n\twaitmessage\n\twaitfanfare\n\tsetflag FLAG_GOT_HITMON_FROM_DOJO\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, SaffronCity_Dojo_EventScript_NicknameHitmonParty\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, SaffronCity_Dojo_EventScript_EndGiveMon\nSaffronCity_Dojo_EventScript_NicknameHitmonParty::\n\tcall EventScript_GetGiftMonPartySlot\n\tcall EventScript_ChangePokemonNickname\n\tgoto SaffronCity_Dojo_EventScript_EndGiveMon\n\tend\n\nSaffronCity_Dojo_EventScript_ReceivedHitmonPC::\n\tremoveobject VAR_LAST_TALKED\n\tbufferspeciesname STR_VAR_1, VAR_TEMP_1\n\tplayfanfare MUS_LEVEL_UP\n\tmessage SaffronCity_Dojo_Text_ReceivedMonFromKarateMaster\n\twaitmessage\n\twaitfanfare\n\tsetflag FLAG_GOT_HITMON_FROM_DOJO\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, SaffronCity_Dojo_EventScript_NicknameHitmonPC\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, SaffronCity_Dojo_EventScript_TransferredHitmonToPC\nSaffronCity_Dojo_EventScript_NicknameHitmonPC::\n\tcall EventScript_NameReceivedBoxMon\n\tgoto SaffronCity_Dojo_EventScript_TransferredHitmonToPC\n\tend\n\nSaffronCity_Dojo_EventScript_TransferredHitmonToPC::\n\tcall EventScript_TransferredToPC\n\tgoto SaffronCity_Dojo_EventScript_EndGiveMon\n\tend\n\nSaffronCity_Dojo_EventScript_EndGiveMon::\n\trelease\n\tend\n\nSaffronCity_Dojo_EventScript_Statue::\n\tmsgbox SaffronCity_Dojo_Text_FightingDojo, MSGBOX_SIGN\n\tend\n\nSaffronCity_Dojo_EventScript_LeftScroll::\n\tmsgbox SaffronCity_Dojo_Text_EnemiesOnEverySide, MSGBOX_SIGN\n\tend\n\nSaffronCity_Dojo_EventScript_RightScroll::\n\tmsgbox SaffronCity_Dojo_Text_GoesAroundComesAround, MSGBOX_SIGN\n\tend\n\nSaffronCity_Dojo_EventScript_Hitoshi::\n\ttrainerbattle_single TRAINER_BLACK_BELT_HITOSHI, SaffronCity_Dojo_Text_HitoshiIntro, SaffronCity_Dojo_Text_HitoshiDefeat\n\tmsgbox SaffronCity_Dojo_Text_HitoshiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSaffronCity_Dojo_EventScript_Hideki::\n\ttrainerbattle_single TRAINER_BLACK_BELT_HIDEKI, SaffronCity_Dojo_Text_HidekiIntro, SaffronCity_Dojo_Text_HidekiDefeat\n\tmsgbox SaffronCity_Dojo_Text_HidekiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSaffronCity_Dojo_EventScript_Aaron::\n\ttrainerbattle_single TRAINER_BLACK_BELT_AARON, SaffronCity_Dojo_Text_AaronIntro, SaffronCity_Dojo_Text_AaronDefeat\n\tmsgbox SaffronCity_Dojo_Text_AaronPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSaffronCity_Dojo_EventScript_Mike::\n\ttrainerbattle_single TRAINER_BLACK_BELT_MIKE, SaffronCity_Dojo_Text_MikeIntro, SaffronCity_Dojo_Text_MikeDefeat\n\tmsgbox SaffronCity_Dojo_Text_MikePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSaffronCity_Dojo_EventScript_MasterKoichi::\n\ttrainerbattle_single TRAINER_BLACK_BELT_KOICHI, SaffronCity_Dojo_Text_MasterKoichiIntro, SaffronCity_Dojo_Text_MasterKoichiDefeat, SaffronCity_Dojo_EventScript_DefeatedMasterKoichi\n\tgoto_if_set FLAG_GOT_HITMON_FROM_DOJO, SaffronCity_Dojo_EventScript_MasterKoichiAlreadyGotHitmon\n\tmsgbox SaffronCity_Dojo_Text_ChoosePrizedFightingMon, MSGBOX_AUTOCLOSE\n\tend\n\nSaffronCity_Dojo_EventScript_MasterKoichiAlreadyGotHitmon::\n\tmsgbox SaffronCity_Dojo_Text_StayAndTrainWithUs\n\trelease\n\tend\n\nSaffronCity_Dojo_EventScript_DefeatedMasterKoichi::\n\tsetvar VAR_MAP_SCENE_SAFFRON_CITY_DOJO, 1\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SaffronCity_Dojo/text.inc",
    "content": "SaffronCity_Dojo_Text_MasterKoichiIntro::\n    .string \"Grunt!\\p\"\n    .string \"I am the KARATE MASTER!\\n\"\n    .string \"I am the LEADER here!\\p\"\n    .string \"You wish to challenge us?\\n\"\n    .string \"Expect no mercy!\\p\"\n    .string \"Fwaaa!$\"\n\nSaffronCity_Dojo_Text_MasterKoichiDefeat::\n    .string \"Hwa!\\n\"\n    .string \"Arrgh! Beaten!$\"\n\nSaffronCity_Dojo_Text_ChoosePrizedFightingMon::\n    .string \"Indeed, I have lost!\\p\"\n    .string \"But, I beseech you, do not take\\n\"\n    .string \"our emblem as your trophy!\\p\"\n    .string \"In return, I will give you a prized\\n\"\n    .string \"FIGHTING POKéMON!\\p\"\n    .string \"Choose whichever one you like!$\"\n\nSaffronCity_Dojo_Text_StayAndTrainWithUs::\n    .string \"Grunt!\\n\"\n    .string \"Stay and train at karate with us!$\"\n\nSaffronCity_Dojo_Text_MikeIntro::\n    .string \"Hoargh!\\n\"\n    .string \"Take your shoes off!$\"\n\nSaffronCity_Dojo_Text_MikeDefeat::\n    .string \"I give up!$\"\n\nSaffronCity_Dojo_Text_MikePostBattle::\n    .string \"You wait 'til you see our MASTER!\\n\"\n    .string \"I'm a small fry compared to him!$\"\n\nSaffronCity_Dojo_Text_HidekiIntro::\n    .string \"I hear you're good!\\n\"\n    .string \"Show me!$\"\n\nSaffronCity_Dojo_Text_HidekiDefeat::\n    .string \"Judge!\\n\"\n    .string \"One point!$\"\n\nSaffronCity_Dojo_Text_HidekiPostBattle::\n    .string \"Our MASTER is a pro fighter.\\n\"\n    .string \"Be prepared to lose!$\"\n\nSaffronCity_Dojo_Text_AaronIntro::\n    .string \"Hiyah!\\n\"\n    .string \"I have no fear for anything tough!\\p\"\n    .string \"I shatter boulders for training\\n\"\n    .string \"every day!$\"\n\nSaffronCity_Dojo_Text_AaronDefeat::\n    .string \"Yow!\\n\"\n    .string \"Stubbed fingers!$\"\n\nSaffronCity_Dojo_Text_AaronPostBattle::\n    .string \"The only thing that frightens us is\\n\"\n    .string \"psychic power!$\"\n\nSaffronCity_Dojo_Text_HitoshiIntro::\n    .string \"Hwaah!\\p\"\n    .string \"You're trespassing in our\\n\"\n    .string \"FIGHTING DOJO!$\"\n\nSaffronCity_Dojo_Text_HitoshiDefeat::\n    .string \"Oof!\\n\"\n    .string \"I give up!$\"\n\nSaffronCity_Dojo_Text_HitoshiPostBattle::\n    .string \"The prime fighters across the land\\n\"\n    .string \"train here.$\"\n\nSaffronCity_Dojo_Text_YouWantHitmonlee::\n    .string \"You want the hard-kicking\\n\"\n    .string \"HITMONLEE?$\"\n\nSaffronCity_Dojo_Text_ReceivedMonFromKarateMaster::\n    .string \"{PLAYER} received the {STR_VAR_1}\\n\"\n    .string \"from the KARATE MASTER.$\"\n\nSaffronCity_Dojo_Text_YouWantHitmonchan::\n    .string \"You want the piston-punching\\n\"\n    .string \"HITMONCHAN?$\"\n\nSaffronCity_Dojo_Text_BetterNotGetGreedy::\n    .string \"Better not get greedy…$\"\n\nSaffronCity_Dojo_Text_EnemiesOnEverySide::\n    .string \"Enemies on every side!$\"\n\nSaffronCity_Dojo_Text_GoesAroundComesAround::\n    .string \"What goes around comes around.$\"\n\nSaffronCity_Dojo_Text_FightingDojo::\n    .string \"FIGHTING DOJO$\"\n\n"
  },
  {
    "path": "data/maps/SaffronCity_Gym/map.json",
    "content": "{\n  \"id\": \"MAP_SAFFRON_CITY_GYM\",\n  \"name\": \"SaffronCity_Gym\",\n  \"layout\": \"LAYOUT_SAFFRON_CITY_GYM\",\n  \"music\": \"MUS_GYM\",\n  \"region_map_section\": \"MAPSEC_SAFFRON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_GYM\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PSYCHIC_M\",\n      \"x\": 24,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SaffronCity_Gym_EventScript_Cameron\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PSYCHIC_M\",\n      \"x\": 24,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SaffronCity_Gym_EventScript_Johan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PSYCHIC_M\",\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SaffronCity_Gym_EventScript_Preston\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SaffronCity_Gym_EventScript_Amanda\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SaffronCity_Gym_EventScript_Stacy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SaffronCity_Gym_EventScript_Tasha\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SABRINA\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_Gym_EventScript_Sabrina\",\n      \"flag\": \"FLAG_TEMP_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PSYCHIC_M\",\n      \"x\": 24,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SaffronCity_Gym_EventScript_Tyron\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GYM_GUY\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_Gym_EventScript_GymGuy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 13,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"32\"\n    },\n    {\n      \"x\": 0,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"22\"\n    },\n    {\n      \"x\": 0,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"20\"\n    },\n    {\n      \"x\": 0,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"30\"\n    },\n    {\n      \"x\": 0,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"11\"\n    },\n    {\n      \"x\": 0,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"28\"\n    },\n    {\n      \"x\": 0,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"19\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"18\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"17\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"15\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"26\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"13\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"24\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"12\"\n    },\n    {\n      \"x\": 16,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"10\"\n    },\n    {\n      \"x\": 16,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"9\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"23\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"21\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"16\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"27\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"14\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"25\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"31\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"29\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY_GYM\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_Gym_EventScript_GymStatue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_Gym_EventScript_GymStatue\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SaffronCity_Gym/scripts.inc",
    "content": ".equ CHECK_VISITOR_STATE, 6\n.equ TYPE, VAR_0x8003\n.equ ARGUMENT, VAR_0x8004\n\nSaffronCity_Gym_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SaffronCity_Gym_OnTransition\n\t.byte 0\n\nSaffronCity_Gym_OnTransition::\n\tsetvar TYPE, CHECK_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_SABRINA\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 1, SaffronCity_Gym_EventScript_HideSabrina\n\tend\n\nSaffronCity_Gym_EventScript_HideSabrina::\n\tsetflag FLAG_TEMP_1\n\treturn\n\nSaffronCity_Gym_EventScript_Sabrina::\n\tfamechecker FAMECHECKER_SABRINA, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, SaffronCity_Gym_EventScript_Sabrina_ChallengeMode\n\ttrainerbattle_single TRAINER_LEADER_SABRINA, SaffronCity_Gym_Text_SabrinaIntro, SaffronCity_Gym_Text_SabrinaDefeat, SaffronCity_Gym_EventScript_DefeatedSabrina, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_SABRINA_CHALLENGE\n\tgoto_if_unset FLAG_GOT_TM04_FROM_SABRINA, SaffronCity_Gym_EventScript_GiveTM04\n\tmsgbox SaffronCity_Gym_Text_ExplainTM04\n\trelease\n\tend\n\nSaffronCity_Gym_EventScript_Sabrina_ChallengeMode::\n\ttrainerbattle_single TRAINER_LEADER_SABRINA_CHALLENGE, SaffronCity_Gym_Text_SabrinaIntro, SaffronCity_Gym_Text_SabrinaDefeat, SaffronCity_Gym_EventScript_DefeatedSabrina, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_SABRINA\n\tgoto_if_unset FLAG_GOT_TM04_FROM_SABRINA, SaffronCity_Gym_EventScript_GiveTM04\n\tmsgbox SaffronCity_Gym_Text_ExplainTM04\n\trelease\n\tend\n\nSaffronCity_Gym_EventScript_DefeatedSabrina::\n\tfamechecker FAMECHECKER_SABRINA, 2\n\tfamechecker FAMECHECKER_SABRINA, 3\n\tclearflag FLAG_HIDE_SAFFRON_CITY_POKECENTER_SABRINA_JOURNALS\n\tsetflag FLAG_DEFEATED_SABRINA\n\tsetflag FLAG_BADGE06_GET\n\tset_gym_trainers 6\n\tgoto SaffronCity_Gym_EventScript_GiveTM04\n\tend\n\nSaffronCity_Gym_EventScript_GiveTM04::\n\tmsgbox SaffronCity_Gym_Text_ExplainMarshBadgeTakeThis\n\tcheckitemspace ITEM_TM04\n\tgoto_if_eq VAR_RESULT, FALSE, SaffronCity_Gym_EventScript_NoRoomForTM04\n\tgiveitem_msg SaffronCity_Gym_Text_ReceivedTM04FromSabrina, ITEM_TM04\n\tsetflag FLAG_GOT_TM04_FROM_SABRINA\n\tmsgbox SaffronCity_Gym_Text_SabrinaPostBattle\n\trelease\n\tend\n\nSaffronCity_Gym_EventScript_NoRoomForTM04::\n\tmsgbox SaffronCity_Gym_Text_BagFullOfOtherItems\n\trelease\n\tend\n\nSaffronCity_Gym_EventScript_Johan::\n\ttrainerbattle_single TRAINER_PSYCHIC_JOHAN, SaffronCity_Gym_Text_JohanIntro, SaffronCity_Gym_Text_JohanDefeat\n\tmsgbox SaffronCity_Gym_Text_JohanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSaffronCity_Gym_EventScript_Tyron::\n\ttrainerbattle_single TRAINER_PSYCHIC_TYRON, SaffronCity_Gym_Text_TyronIntro, SaffronCity_Gym_Text_TyronDefeat\n\tfamechecker FAMECHECKER_SABRINA, 5\n\tmsgbox SaffronCity_Gym_Text_TyronPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSaffronCity_Gym_EventScript_Cameron::\n\ttrainerbattle_single TRAINER_PSYCHIC_CAMERON, SaffronCity_Gym_Text_CameronIntro, SaffronCity_Gym_Text_CameronDefeat\n\tmsgbox SaffronCity_Gym_Text_CameronPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSaffronCity_Gym_EventScript_Preston::\n\ttrainerbattle_single TRAINER_PSYCHIC_PRESTON, SaffronCity_Gym_Text_PrestonIntro, SaffronCity_Gym_Text_PrestonDefeat\n\tmsgbox SaffronCity_Gym_Text_PrestonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSaffronCity_Gym_EventScript_Amanda::\n\ttrainerbattle_single TRAINER_CHANNELER_AMANDA, SaffronCity_Gym_Text_AmandaIntro, SaffronCity_Gym_Text_AmandaDefeat\n\tmsgbox SaffronCity_Gym_Text_AmandaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSaffronCity_Gym_EventScript_Stacy::\n\ttrainerbattle_single TRAINER_CHANNELER_STACY, SaffronCity_Gym_Text_StacyIntro, SaffronCity_Gym_Text_StacyDefeat\n\tmsgbox SaffronCity_Gym_Text_StacyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSaffronCity_Gym_EventScript_Tasha::\n\ttrainerbattle_single TRAINER_CHANNELER_TASHA, SaffronCity_Gym_Text_TashaIntro, SaffronCity_Gym_Text_TashaDefeat\n\tmsgbox SaffronCity_Gym_Text_TashaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSaffronCity_Gym_EventScript_GymGuy::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_DEFEATED_SABRINA, SaffronCity_Gym_EventScript_GymGuyPostVictory\n\tmsgbox SaffronCity_Gym_Text_GymGuyAdvice\n\trelease\n\tend\n\nSaffronCity_Gym_EventScript_GymGuyPostVictory::\n\tmsgbox SaffronCity_Gym_Text_GymGuyPostVictory\n\trelease\n\tend\n\nSaffronCity_Gym_EventScript_GymStatue::\n\tlockall\n\tgoto_if_set FLAG_BADGE06_GET, SaffronCity_Gym_EventScript_GymStatuePostVictory\n\tmsgbox SaffronCity_Gym_Text_GymStatue\n\treleaseall\n\tend\n\nSaffronCity_Gym_EventScript_GymStatuePostVictory::\n\tmsgbox SaffronCity_Gym_Text_GymStatuePlayerWon\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/SaffronCity_Gym/text.inc",
    "content": "SaffronCity_Gym_Text_SabrinaIntro::\n    .string \"I had a vision of your arrival.\\p\"\n    .string \"I have had psychic powers since\\n\"\n    .string \"I was a child.\\p\"\n    .string \"It started when a spoon I\\n\"\n    .string \"carelessly tossed, bent.\\p\"\n    .string \"I dislike battling, but if you wish,\\n\"\n    .string \"I will show you my powers!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nSaffronCity_Gym_Text_SabrinaDefeat::\n    .string \"This loss shocks me!\\n\"\n    .string \"But, a loss is a loss.\\p\"\n    .string \"I admit, I didn't work hard enough\\n\"\n    .string \"to win.\\p\"\n    .string \"Your victory has earned you the\\n\"\n    .string \"MARSHBADGE.$\"\n\nSaffronCity_Gym_Text_SabrinaPostBattle::\n    .string \"Psychic power isn't something that\\n\"\n    .string \"only a few people have.\\p\"\n    .string \"Everyone has psychic power.\\n\"\n    .string \"People just don't realize it.$\"\n\nSaffronCity_Gym_Text_ExplainMarshBadgeTakeThis::\n    .string \"The MARSHBADGE makes POKéMON up\\n\"\n    .string \"to Lv. 70 obey you.\\p\"\n    .string \"Stronger POKéMON will become wild,\\n\"\n    .string \"ignoring your orders in battle.\\p\"\n    .string \"Just don't raise your POKéMON too\\n\"\n    .string \"much to avoid that problem.\\p\"\n    .string \"Wait, please take this TM with you.$\"\n\nSaffronCity_Gym_Text_ReceivedTM04FromSabrina::\n    .string \"{PLAYER} received TM04 from\\n\"\n    .string \"SABRINA.$\"\n\nSaffronCity_Gym_Text_ExplainTM04::\n    .string \"TM04 is CALM MIND.\\p\"\n    .string \"It makes the POKéMON concentrate\\n\"\n    .string \"to raise both SP. ATK and SP. DEF.$\"\n\nSaffronCity_Gym_Text_BagFullOfOtherItems::\n    .string \"Your BAG is full of other items.$\"\n\nSaffronCity_Gym_Text_AmandaIntro::\n    .string \"SABRINA is far younger than I,\\n\"\n    .string \"but she has earned my respect.$\"\n\nSaffronCity_Gym_Text_AmandaDefeat::\n    .string \"Not good enough!$\"\n\nSaffronCity_Gym_Text_AmandaPostBattle::\n    .string \"In a battle of equals, the one\\n\"\n    .string \"with the stronger will wins.\\p\"\n    .string \"If you wish to beat SABRINA, focus\\n\"\n    .string \"and will yourself to victory.$\"\n\nSaffronCity_Gym_Text_JohanIntro::\n    .string \"Does our unseen power scare you?$\"\n\nSaffronCity_Gym_Text_JohanDefeat::\n    .string \"I never foresaw this!$\"\n\nSaffronCity_Gym_Text_JohanPostBattle::\n    .string \"PSYCHIC POKéMON fear only ghosts\\n\"\n    .string \"and bugs!$\"\n\nSaffronCity_Gym_Text_StacyIntro::\n    .string \"POKéMON take on the appearance of\\n\"\n    .string \"their TRAINERS.\\p\"\n    .string \"Your POKéMON must be tough, then!$\"\n\nSaffronCity_Gym_Text_StacyDefeat::\n    .string \"I knew it!$\"\n\nSaffronCity_Gym_Text_StacyPostBattle::\n    .string \"I have much to learn still…\\p\"\n    .string \"I must master PSYCHIC and teach it\\n\"\n    .string \"to my POKéMON…$\"\n\nSaffronCity_Gym_Text_TyronIntro::\n    .string \"You understand, don't you?\\p\"\n    .string \"That power alone isn't enough to\\n\"\n    .string \"win in the world of POKéMON?$\"\n\nSaffronCity_Gym_Text_TyronDefeat::\n    .string \"I don't believe this!$\"\n\nSaffronCity_Gym_Text_TyronPostBattle::\n    .string \"SABRINA just wiped out the KARATE\\n\"\n    .string \"MASTER next door.$\"\n\nSaffronCity_Gym_Text_TashaIntro::\n    .string \"You and I, our POKéMON shall\\n\"\n    .string \"battle!$\"\n\nSaffronCity_Gym_Text_TashaDefeat::\n    .string \"I lost after all!$\"\n\nSaffronCity_Gym_Text_TashaPostBattle::\n    .string \"I knew that this was going to take\\n\"\n    .string \"place.$\"\n\nSaffronCity_Gym_Text_CameronIntro::\n    .string \"SABRINA is young, but she's also\\n\"\n    .string \"our highly skilled LEADER.\\p\"\n    .string \"You won't reach her easily!$\"\n\nSaffronCity_Gym_Text_CameronDefeat::\n    .string \"Ow!\\n\"\n    .string \"Down and out!$\"\n\nSaffronCity_Gym_Text_CameronPostBattle::\n    .string \"There used to be two POKéMON GYMS\\n\"\n    .string \"in SAFFRON.\\p\"\n    .string \"The FIGHTING DOJO next door lost\\n\"\n    .string \"its GYM status, though.\\p\"\n    .string \"We simply creamed them when we\\n\"\n    .string \"decided to have just one GYM.$\"\n\nSaffronCity_Gym_Text_PrestonIntro::\n    .string \"SAFFRON POKéMON GYM is famous for\\n\"\n    .string \"training psychics.\\p\"\n    .string \"You want to see SABRINA, don't\\n\"\n    .string \"you? I can tell!$\"\n\nSaffronCity_Gym_Text_PrestonDefeat::\n    .string \"Arrrgh!$\"\n\nSaffronCity_Gym_Text_PrestonPostBattle::\n    .string \"That's right! I used telepathy to\\n\"\n    .string \"read your mind!$\"\n\nSaffronCity_Gym_Text_GymGuyAdvice::\n    .string \"Yo!\\n\"\n    .string \"Champ in the making!\\p\"\n    .string \"SABRINA's POKéMON use psychic\\n\"\n    .string \"power instead of force.\\p\"\n    .string \"FIGHTING POKéMON are especially\\n\"\n    .string \"weak against PSYCHIC POKéMON.\\p\"\n    .string \"They'll get destroyed before they\\n\"\n    .string \"can even aim a punch!$\"\n\nSaffronCity_Gym_Text_GymGuyPostVictory::\n    .string \"Psychic power, huh?\\p\"\n    .string \"If I had that, I'd make a bundle\\n\"\n    .string \"at the slots!$\"\n\nSaffronCity_Gym_Text_GymStatue::\n    .string \"SAFFRON POKéMON GYM\\n\"\n    .string \"LEADER: SABRINA\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}$\"\n\nSaffronCity_Gym_Text_GymStatuePlayerWon::\n    .string \"SAFFRON POKéMON GYM\\n\"\n    .string \"LEADER: SABRINA\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}, {PLAYER}$\"\n\n"
  },
  {
    "path": "data/maps/SaffronCity_House/map.json",
    "content": "{\n  \"id\": \"MAP_SAFFRON_CITY_HOUSE\",\n  \"name\": \"SaffronCity_House\",\n  \"layout\": \"LAYOUT_HOUSE5\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_SAFFRON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PIDGEY\",\n      \"x\": 0,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_House_EventScript_Pidgey\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_House_EventScript_Lass\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_House_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLIPBOARD\",\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SaffronCity_House_EventScript_Letter\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SaffronCity_House/scripts.inc",
    "content": "SaffronCity_House_MapScripts::\n\t.byte 0\n\nSaffronCity_House_EventScript_Lass::\n\tmsgbox SaffronCity_House_Text_DontLookAtMyLetter, MSGBOX_NPC\n\tend\n\nSaffronCity_House_EventScript_Youngster::\n\tmsgbox SaffronCity_House_Text_GettingCopycatPokeDoll, MSGBOX_NPC\n\tend\n\nSaffronCity_House_EventScript_Pidgey::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_PIDGEY, CRY_MODE_NORMAL\n\tmsgbox SaffronCity_House_Text_Pidgey\n\twaitmoncry\n\trelease\n\tend\n\nSaffronCity_House_EventScript_Letter::\n\tmsgbox SaffronCity_House_Text_ExplainPPUp, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SaffronCity_House/text.inc",
    "content": "SaffronCity_House_Text_DontLookAtMyLetter::\n    .string \"…Thank you for writing.\\n\"\n    .string \"I hope to see you soon!\\p\"\n    .string \"…Hey!\\n\"\n    .string \"Don't look at my letter!$\"\n\nSaffronCity_House_Text_Pidgey::\n    .string \"PIDGEY: Kurukkoo!$\"\n\nSaffronCity_House_Text_GettingCopycatPokeDoll::\n    .string \"The COPYCAT is cute!\\n\"\n    .string \"I'm getting her a POKé DOLL.$\"\n\nSaffronCity_House_Text_ExplainPPUp::\n    .string \"I was given a PP UP as a gift.\\p\"\n    .string \"It's used to increase the PP of\\n\"\n    .string \"a POKéMON's move.\\p\"\n    .string \"I should use it on a powerful move\\n\"\n    .string \"with only a few PP.$\"\n\n"
  },
  {
    "path": "data/maps/SaffronCity_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_SAFFRON_CITY_MART\",\n  \"name\": \"SaffronCity_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SAFFRON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_Mart_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"x\": 1,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_Mart_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"x\": 9,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_Mart_EventScript_Lass\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SaffronCity_Mart/scripts.inc",
    "content": "SaffronCity_Mart_MapScripts::\n\t.byte 0\n\nSaffronCity_Mart_EventScript_Lass::\n\tmsgbox SaffronCity_Mart_Text_ReviveIsCostly, MSGBOX_NPC\n\tend\n\nSaffronCity_Mart_EventScript_Youngster::\n\tmsgbox SaffronCity_Mart_Text_MaxRepelMoreEffectiveThanSuper, MSGBOX_NPC\n\tend\n\nSaffronCity_Mart_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart SaffronCity_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nSaffronCity_Mart_Items::\n\t.2byte ITEM_GREAT_BALL\n\t.2byte ITEM_HYPER_POTION\n\t.2byte ITEM_REVIVE\n\t.2byte ITEM_FULL_HEAL\n\t.2byte ITEM_ESCAPE_ROPE\n\t.2byte ITEM_MAX_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SaffronCity_Mart/text.inc",
    "content": "SaffronCity_Mart_Text_MaxRepelMoreEffectiveThanSuper::\n    .string \"MAX REPEL keeps weaker POKéMON\\n\"\n    .string \"from appearing.\\p\"\n    .string \"MAX REPEL stays effective longer\\n\"\n    .string \"than SUPER REPEL.$\"\n\nSaffronCity_Mart_Text_ReviveIsCostly::\n    .string \"REVIVE is costly, but it revives\\n\"\n    .string \"fainted POKéMON!$\"\n\n"
  },
  {
    "path": "data/maps/SaffronCity_MrPsychicsHouse/map.json",
    "content": "{\n  \"id\": \"MAP_SAFFRON_CITY_MR_PSYCHICS_HOUSE\",\n  \"name\": \"SaffronCity_MrPsychicsHouse\",\n  \"layout\": \"LAYOUT_HOUSE5\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_SAFFRON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_MrPsychicsHouse_EventScript_MrPsychic\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_PSYCHIC_M\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Kadabra\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"7\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SaffronCity_MrPsychicsHouse/scripts.inc",
    "content": ".set LOCALID_KADABRA_MASTER, 2\n.set TRAINER, VAR_0x8009\n\nSaffronCity_MrPsychicsHouse_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SaffronCity_MrPsychicsHouse_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nSaffronCity_MrPsychicsHouse_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_KADABRA\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_MrPsychicsHouse_MapScript_KadabraMasterMovementType\n\tend\n\nSaffronCity_MrPsychicsHouse_MapScript_KadabraMasterMovementType::\n\tsetobjectmovementtype LOCALID_KADABRA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nSaffronCity_MrPsychicsHouse_EventScript_MrPsychic::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_TM29_FROM_MR_PSYCHIC, SaffronCity_MrPsychicsHouse_EventScript_AlreadyGotTM29\n\tmsgbox SaffronCity_MrPsychicsHouse_Text_YouWantedThis\n\tcheckitemspace ITEM_TM29\n\tgoto_if_eq VAR_RESULT, FALSE, SaffronCity_MrPsychicsHouse_EventScript_NoRoomForTM29\n\tgiveitem_msg SaffronCity_MrPsychicsHouse_Text_ReceivedTM29FromMrPsychic, ITEM_TM29\n\tmsgbox SaffronCity_MrPsychicsHouse_Text_ExplainTM29\n\tsetflag FLAG_GOT_TM29_FROM_MR_PSYCHIC\n\trelease\n\tend\n\nSaffronCity_MrPsychicsHouse_EventScript_NoRoomForTM29::\n\tmsgbox SaffronCity_MrPsychicsHouse_Text_YouveNoRoom\n\trelease\n\tend\n\nSaffronCity_MrPsychicsHouse_EventScript_AlreadyGotTM29::\n\tmsgbox SaffronCity_MrPsychicsHouse_Text_ExplainTM29\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SaffronCity_MrPsychicsHouse/text.inc",
    "content": "SaffronCity_MrPsychicsHouse_Text_YouWantedThis::\n    .string \"…Wait! Don't say a word!\\p\"\n    .string \"You wanted this!$\"\n\nSaffronCity_MrPsychicsHouse_Text_ReceivedTM29FromMrPsychic::\n    .string \"{PLAYER} received TM29\\n\"\n    .string \"from MR. PSYCHIC.$\"\n\nSaffronCity_MrPsychicsHouse_Text_ExplainTM29::\n    .string \"You already know, don't you?\\n\"\n    .string \"TM29 is PSYCHIC.\\p\"\n    .string \"It's an attack that may also lower\\n\"\n    .string \"the target's special stats.$\"\n\nSaffronCity_MrPsychicsHouse_Text_YouveNoRoom::\n    .string \"Where do you plan to put this?\\n\"\n    .string \"You've no room.$\"\n\n"
  },
  {
    "path": "data/maps/SaffronCity_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_SAFFRON_CITY_POKEMON_CENTER_1F\",\n  \"name\": \"SaffronCity_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SAFFRON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonCenter_1F_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_3\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonCenter_1F_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonCenter_1F_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonCenter_1F_EventScript_PokemonJournalSabrina\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CITY_POKECENTER_SABRINA_JOURNALS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonCenter_1F_EventScript_PokemonJournalSabrina\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CITY_POKECENTER_SABRINA_JOURNALS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SAFFRON_CITY_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SaffronCity_PokemonCenter_1F/scripts.inc",
    "content": "SaffronCity_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SaffronCity_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nSaffronCity_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_SAFFRON_CITY\n\tend\n\nSaffronCity_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nSaffronCity_PokemonCenter_1F_EventScript_Gentleman::\n\tmsgbox SaffronCity_PokemonCenter_1F_Text_SilphCoVictimOfFame, MSGBOX_NPC\n\tend\n\nSaffronCity_PokemonCenter_1F_EventScript_Woman::\n\tmsgbox SaffronCity_PokemonCenter_1F_Text_GrowthRatesDifferBySpecies, MSGBOX_NPC\n\tend\n\nSaffronCity_PokemonCenter_1F_EventScript_Youngster::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_MAP_SCENE_SILPH_CO_11F, 1, SaffronCity_PokemonCenter_1F_EventScript_YoungsterRocketsGone\n\tmsgbox SaffronCity_PokemonCenter_1F_Text_GreatIfEliteFourCameBeatRockets\n\trelease\n\tend\n\nSaffronCity_PokemonCenter_1F_EventScript_YoungsterRocketsGone::\n\tmsgbox SaffronCity_PokemonCenter_1F_Text_TeamRocketTookOff\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SaffronCity_PokemonCenter_1F/text.inc",
    "content": "SaffronCity_PokemonCenter_1F_Text_GrowthRatesDifferBySpecies::\n    .string \"POKéMON growth rates differ from\\n\"\n    .string \"species to species.$\"\n\nSaffronCity_PokemonCenter_1F_Text_SilphCoVictimOfFame::\n    .string \"SILPH CO. is widely known to all.\\p\"\n    .string \"It's a victim of its own fame - it\\n\"\n    .string \"attracted TEAM ROCKET.$\"\n\nSaffronCity_PokemonCenter_1F_Text_GreatIfEliteFourCameBeatRockets::\n    .string \"Sigh…\\n\"\n    .string \"Wouldn't this be great?\\p\"\n    .string \"If the ELITE FOUR came and\\n\"\n    .string \"stomped TEAM ROCKET?$\"\n\nSaffronCity_PokemonCenter_1F_Text_TeamRocketTookOff::\n    .string \"TEAM ROCKET took off!\\n\"\n    .string \"We can go out safely again!\\l\"\n    .string \"That's great!$\"\n\n"
  },
  {
    "path": "data/maps/SaffronCity_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_SAFFRON_CITY_POKEMON_CENTER_2F\",\n  \"name\": \"SaffronCity_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SAFFRON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SAFFRON_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SaffronCity_PokemonCenter_2F/scripts.inc",
    "content": "SaffronCity_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nSaffronCity_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nSaffronCity_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nSaffronCity_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/SaffronCity_PokemonTrainerFanClub/map.json",
    "content": "{\n  \"id\": \"MAP_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB\",\n  \"name\": \"SaffronCity_PokemonTrainerFanClub\",\n  \"layout\": \"LAYOUT_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_SAFFRON_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BATTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonTrainerFanClub_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonTrainerFanClub_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_3\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonTrainerFanClub_EventScript_Woman\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_FAN_CLUB_WOMAN\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonTrainerFanClub_EventScript_Rocker\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_FAN_CLUB_ROCKER\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonTrainerFanClub_EventScript_Beauty\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_FAN_CLUB_BEAUTY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonTrainerFanClub_EventScript_BlackBelt\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_FAN_CLUB_BLACKBELT\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonTrainerFanClub_EventScript_PokemonJournalBruno\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SaffronCity_PokemonTrainerFanClub_EventScript_PokemonJournalBruno\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"14\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SaffronCity_PokemonTrainerFanClub/scripts.inc",
    "content": ".set LOCALID_BATTLE_GIRL, 1\n.set LOCALID_LITTLE_GIRL, 2\n.set LOCALID_YOUNGSTER,   3\n.set LOCALID_GENTLEMAN,   4\n.set LOCALID_WOMAN,       5\n.set LOCALID_ROCKER,      6\n.set LOCALID_BEAUTY,      7\n.set LOCALID_BLACK_BELT,  8\n\nSaffronCity_PokemonTrainerFanClub_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, SaffronCity_PokemonTrainerFanClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SaffronCity_PokemonTrainerFanClub_OnTransition\n\t.byte 0\n\nSaffronCity_PokemonTrainerFanClub_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 1, SaffronCity_PokemonTrainerFanClub_EventScript_MeetFirstFans\n\t.2byte 0\n\nSaffronCity_PokemonTrainerFanClub_EventScript_MeetFirstFans::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tapplymovement LOCALID_BATTLE_GIRL, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tplayse SE_PIN\n\tapplymovement LOCALID_BATTLE_GIRL, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_BATTLE_GIRL, Common_Movement_Delay48\n\twaitmovement 0\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_HuhYou\n\tclosemessage\n\tapplymovement LOCALID_BATTLE_GIRL, SaffronCity_PokemonTrainerFanClub_Movement_FanApproachPlayer\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_YourePlayerWereYourFansNow\n\tsetvar VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 2\n\treleaseall\n\tend\n\nSaffronCity_PokemonTrainerFanClub_Movement_FanApproachPlayer::\n\tdelay_16\n\tdelay_8\n\twalk_down\n\tdelay_16\n\twalk_down\n\tdelay_8\n\twalk_left\n\tstep_end\n\n@ Unused, leftover from RS\nLilycoveCity_PokemonTrainerFanClub_Movement_FanApproachPlayer::\n\tdelay_8\n\twalk_in_place_faster_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_left\n\twalk_left\n\tstep_end\n\n@ Unused, leftover from RS\nLilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlWatchPlayer::\n\twalk_fast_left\n\twalk_fast_left\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_left\n\twalk_fast_down\n\tstep_end\n\n@ Unused, leftover from RS\nLilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlMoveCloserToPlayer::\n\twalk_down\n\twalk_in_place_faster_right\n\tstep_end\n\n@ Unused, leftover from RS\nLilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlHideFromPlayer::\n\tjump_in_place_right\n\twalk_fast_up\n\twalk_fast_up\n\twalk_fast_right\n\twalk_in_place_faster_down\n\tstep_end\n\nSaffronCity_PokemonTrainerFanClub_OnTransition::\n\tgoto_if_eq VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 1, SaffronCity_PokemonTrainerFanClub_EventScript_SetMemberPosForFirstMeeting\n\tgoto_if_eq VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 2, SaffronCity_PokemonTrainerFanClub_EventScript_UpdateFanMemberPositions\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_UpdateFanMemberPositions::\n\tspecial Script_TryLoseFansFromPlayTime\n\tsetvar VAR_0x8004, FANCLUB_MEMBER1\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember1ToFarTable\n\tsetvar VAR_0x8004, FANCLUB_MEMBER2\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember2ToFarTable\n\tsetvar VAR_0x8004, FANCLUB_MEMBER3\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember3ToFarTable\n\tsetvar VAR_0x8004, FANCLUB_MEMBER4\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember4ToFarTable\n\tsetvar VAR_0x8004, FANCLUB_MEMBER5\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember5ToFarTable\n\tsetvar VAR_0x8004, FANCLUB_MEMBER6\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember6ToFarTable\n\tsetvar VAR_0x8004, FANCLUB_MEMBER7\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember7ToFarTable\n\tsetvar VAR_0x8004, FANCLUB_MEMBER8\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tcall_if_eq VAR_RESULT, FALSE, SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember8ToFarTable\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_MoveMember1ToFarTable::\n\tsetobjectxyperm LOCALID_BATTLE_GIRL, 5, 2\n\tsetobjectmovementtype LOCALID_BATTLE_GIRL, MOVEMENT_TYPE_FACE_UP\n\treturn\n\nSaffronCity_PokemonTrainerFanClub_EventScript_MoveMember2ToFarTable::\n\tsetobjectxyperm LOCALID_YOUNGSTER, 7, 4\n\tsetobjectmovementtype LOCALID_YOUNGSTER, MOVEMENT_TYPE_FACE_LEFT\n\treturn\n\nSaffronCity_PokemonTrainerFanClub_EventScript_MoveMember3ToFarTable::\n\tsetobjectxyperm LOCALID_GENTLEMAN, 2, 2\n\tsetobjectmovementtype LOCALID_GENTLEMAN, MOVEMENT_TYPE_FACE_UP\n\treturn\n\nSaffronCity_PokemonTrainerFanClub_EventScript_MoveMember4ToFarTable::\n\tsetobjectxyperm LOCALID_LITTLE_GIRL, 3, 4\n\tsetobjectmovementtype LOCALID_LITTLE_GIRL, MOVEMENT_TYPE_FACE_RIGHT\n\treturn\n\nSaffronCity_PokemonTrainerFanClub_EventScript_MoveMember5ToFarTable::\n\tsetobjectxyperm LOCALID_ROCKER, 4, 6\n\tsetobjectmovementtype LOCALID_ROCKER, MOVEMENT_TYPE_FACE_UP\n\treturn\n\nSaffronCity_PokemonTrainerFanClub_EventScript_MoveMember6ToFarTable::\n\tsetobjectxyperm LOCALID_WOMAN, 10, 3\n\tsetobjectmovementtype LOCALID_WOMAN, MOVEMENT_TYPE_FACE_UP\n\treturn\n\nSaffronCity_PokemonTrainerFanClub_EventScript_MoveMember7ToFarTable::\n\tsetobjectxyperm LOCALID_BEAUTY, 7, 5\n\tsetobjectmovementtype LOCALID_BEAUTY, MOVEMENT_TYPE_FACE_LEFT\n\treturn\n\nSaffronCity_PokemonTrainerFanClub_EventScript_MoveMember8ToFarTable::\n\tsetobjectxyperm LOCALID_BLACK_BELT, 9, 6\n\tsetobjectmovementtype LOCALID_BLACK_BELT, MOVEMENT_TYPE_FACE_LEFT\n\treturn\n\nSaffronCity_PokemonTrainerFanClub_EventScript_SetMemberPosForFirstMeeting::\n\tcall SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember4ToFarTable\n\tcall SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember5ToFarTable\n\tcall SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember6ToFarTable\n\tcall SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember7ToFarTable\n\tcall SaffronCity_PokemonTrainerFanClub_EventScript_MoveMember8ToFarTable\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_BattleGirl::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8004, FANCLUB_MEMBER1\n\tspecial Script_BufferFanClubTrainerName\n\tgoto_if_eq VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 0, SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlPlayerNotChampion\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tgoto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlPlayersFan\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlOnlyNonFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_WasYourFanNotAnymore\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlPlayersFan::\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlOnlyFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_AlwaysCheerForYou\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlOnlyFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_IllAlwaysBelieveInYou\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlOnlyNonFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_EveryonesYourFanButICantBe\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_BattleGirlPlayerNotChampion::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_TrainersCoolWhenBattling\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_LittleGirl::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8004, FANCLUB_MEMBER4\n\tspecial Script_BufferFanClubTrainerName\n\tgoto_if_eq VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 0, SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlPlayerNotChampion\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tgoto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlPlayersFan\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlOnlyNonFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_WantToBeLikeSabrina\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlPlayersFan::\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlOnlyFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_WantToBeLikeYouOneDay\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlOnlyFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_EveryoneButMeStoppedBeingYourFan\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlOnlyNonFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_WontStopBeingSabrinasFan\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_LittleGirlPlayerNotChampion::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_CanIBecomeCoolTrainerOneDay\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_Youngster::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8004, FANCLUB_MEMBER2\n\tspecial Script_BufferFanClubTrainerName\n\tgoto_if_eq VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 0, SaffronCity_PokemonTrainerFanClub_EventScript_YoungsterPlayerNotChampion\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tgoto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_YoungsterPlayersFan\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_YoungsterOnlyNonFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_BrocksMyHero\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_YoungsterPlayersFan::\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_YoungsterOnlyFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_CanYouAutographShorts\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_YoungsterOnlyFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_CountingOnYou\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_YoungsterOnlyNonFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_BrocksFanToBitterEnd\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_YoungsterPlayerNotChampion::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_BrocksLastWordOnCool\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_Gentleman::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8004, FANCLUB_MEMBER3\n\tspecial Script_BufferFanClubTrainerName\n\tgoto_if_eq VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 0, SaffronCity_PokemonTrainerFanClub_EventScript_GentlemanPlayerNotChampion\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tgoto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_GentlemanPlayersFan\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_GentlemanOnlyNonFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_HmmAndYouAre\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_GentlemanPlayersFan::\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_GentlemanOnlyFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_HadPleasureOfWatchingYouBattle\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_GentlemanOnlyFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_NeverSeenTrainerOfYourMagnificence\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_GentlemanOnlyNonFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_YouveStillAWaysToGo\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_GentlemanPlayerNotChampion::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_YoullBeTalkedAboutIfYouKeepWinning\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_Woman::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8004, FANCLUB_MEMBER6\n\tspecial Script_BufferFanClubTrainerName\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tgoto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_WomanPlayersFan\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_WomanOnlyNonFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_TrainerHasBeenOnFire\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_WomanPlayersFan::\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_WomanOnlyFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_AdoreWayYouBattle\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_WomanOnlyFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_ImYourNumberOneFan\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_WomanOnlyNonFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_EveryoneTalksAboutYou\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_Rocker::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8004, FANCLUB_MEMBER5\n\tspecial Script_BufferFanClubTrainerName\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tgoto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_RockerPlayersFan\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_RockerOnlyNonFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_LoveWayTrainerTalks\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_RockerPlayersFan::\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_RockerOnlyFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_TheWayYouBattleIsCool\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_RockerOnlyFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_ImOnlyOneLeftOfYourFans\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_RockerOnlyNonFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_ImLoneTrainerFan\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_Beauty::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8004, FANCLUB_MEMBER7\n\tspecial Script_BufferFanClubTrainerName\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tgoto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_BeautyPlayersFan\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_BeautyOnlyNonFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_WhyCantOthersSeeMastersDignity\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_BeautyPlayersFan::\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_BeautyOnlyFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_YouReallyAreAmazing\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_BeautyOnlyFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_ImYourOnlyFan\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_BeautyOnlyNonFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_BelieveInMasterWithAllMyHeart\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_BlackBelt::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8004, FANCLUB_MEMBER8\n\tspecial Script_BufferFanClubTrainerName\n\tspecialvar VAR_RESULT, Script_IsFanClubMemberFanOfPlayer\n\tgoto_if_eq VAR_RESULT, TRUE, SaffronCity_PokemonTrainerFanClub_EventScript_BlackBeltPlayersFan\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, (NUM_TRAINER_FAN_CLUB_MEMBERS - 1), SaffronCity_PokemonTrainerFanClub_EventScript_BlackBeltOnlyNonFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_OnlyMasterHasMyRespect\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_BlackBeltPlayersFan::\n\tspecialvar VAR_RESULT, Script_GetNumFansOfPlayerInTrainerFanClub\n\tgoto_if_eq VAR_RESULT, 1, SaffronCity_PokemonTrainerFanClub_EventScript_BlackBeltOnlyFan\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_YourBattleStyleIsEducational\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_BlackBeltOnlyFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_WontStopBeingYourFan\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_BlackBeltOnlyNonFan::\n\tmsgbox SaffronCity_PokemonTrainerFanClub_Text_NeverBeFanOfAnyoneButMaster\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SaffronCity_PokemonTrainerFanClub/text.inc",
    "content": "SaffronCity_PokemonTrainerFanClub_Text_HuhYou::\n    .string \"Huh?\\n\"\n    .string \"You…$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_YourePlayerWereYourFansNow::\n    .string \"Are you maybe…\\n\"\n    .string \"… …\\p\"\n    .string \"You are!\\n\"\n    .string \"You are {PLAYER}!\\p\"\n    .string \"We were just talking about you!\\p\"\n    .string \"We were talking about how an\\n\"\n    .string \"incredibly good TRAINER appeared.\\p\"\n    .string \"And that someone is you!\\n\"\n    .string \"You're so cool!\\p\"\n    .string \"So, we decided that we'll become\\n\"\n    .string \"your FAN CLUB!\\p\"\n    .string \"We all hope you'll keep battling\\n\"\n    .string \"and show us how cool you are.\\p\"\n    .string \"That way, maybe other people will\\n\"\n    .string \"become fans just like me.$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_AlwaysCheerForYou::\n    .string \"I'll always be cheering for you!\\p\"\n    .string \"Go, {PLAYER}, go!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_IllAlwaysBelieveInYou::\n    .string \"I'll always believe in you,\\n\"\n    .string \"{PLAYER}.\\p\"\n    .string \"Please show the others what you're\\n\"\n    .string \"like when you battle seriously.$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_WasYourFanNotAnymore::\n    .string \"I'm sorry.\\n\"\n    .string \"I was your fan before.\\p\"\n    .string \"But now, you seem to have lost\\n\"\n    .string \"the drive you had before.\\p\"\n    .string \"Lately, I think {STR_VAR_1} has been\\n\"\n    .string \"a lot cooler.$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_EveryonesYourFanButICantBe::\n    .string \"Oh!\\n\"\n    .string \"{PLAYER}!\\p\"\n    .string \"Everyone's been all excited about\\n\"\n    .string \"you recently.\\p\"\n    .string \"I can understand why.\\n\"\n    .string \"I know that you're strong.\\p\"\n    .string \"But, do you know what?\\p\"\n    .string \"Once I became {STR_VAR_1}'s fan,\\n\"\n    .string \"I can't just stop being a fan.$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_TrainersCoolWhenBattling::\n    .string \"I think TRAINERS are so cool when\\n\"\n    .string \"they're battling.\\p\"\n    .string \"Don't you think so, too?$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_CanYouAutographShorts::\n    .string \"Oh! It's {PLAYER}!\\n\"\n    .string \"Too cool!\\p\"\n    .string \"Oh!\\n\"\n    .string \"Oh, yeah!\\p\"\n    .string \"Can you autograph something?\\n\"\n    .string \"How about my shorts?$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_CountingOnYou::\n    .string \"However hot it's been…\\p\"\n    .string \"And however cold it may get…\\p\"\n    .string \"I've always believed in, and worn,\\n\"\n    .string \"shorts!\\p\"\n    .string \"I'm counting on you to keep\\n\"\n    .string \"winning!\\p\"\n    .string \"I believe in you just as much as\\n\"\n    .string \"I believe in shorts!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_BrocksMyHero::\n    .string \"BROCK's my hero!\\n\"\n    .string \"He's a man among men!\\p\"\n    .string \"Heheh, I got my mom to do\\n\"\n    .string \"something for me.\\p\"\n    .string \"I got her to embroider “BROCK”\\n\"\n    .string \"on my shorts!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_BrocksFanToBitterEnd::\n    .string \"…  …\\p\"\n    .string \"…  …\\n\"\n    .string \"I'm BROCK's fan!\\p\"\n    .string \"Even if I were his only fan,\\n\"\n    .string \"I swear it on my rock-hard will,\\l\"\n    .string \"and on my shorts!\\p\"\n    .string \"I'll be his fan to the bitter end!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_BrocksLastWordOnCool::\n    .string \"BROCK's the last word on cool,\\n\"\n    .string \"end of story!\\p\"\n    .string \"Now there's a guy who I want to\\n\"\n    .string \"be like!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_HadPleasureOfWatchingYouBattle::\n    .string \"{PLAYER}, I've had the pleasure of\\n\"\n    .string \"watching you battle.\\p\"\n    .string \"It brings back sweet memories of\\n\"\n    .string \"my own long-lost youth.\\p\"\n    .string \"May you continue to find success.\\n\"\n    .string \"You have a fan in me!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_NeverSeenTrainerOfYourMagnificence::\n    .string \"I have journeyed far and wide\\n\"\n    .string \"across the lands.\\p\"\n    .string \"But never have I seen a TRAINER\\n\"\n    .string \"of your magnificence.\\p\"\n    .string \"Take courage in your abilities\\n\"\n    .string \"and keep battling on!\\p\"\n    .string \"Make that a promise to me,\\n\"\n    .string \"my young idol!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_HmmAndYouAre::\n    .string \"Hmm…\\n\"\n    .string \"And you are?\\p\"\n    .string \"Were you hoping to sign up for\\n\"\n    .string \"a membership in our FAN CLUB?$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_YouveStillAWaysToGo::\n    .string \"Ah, so you are the much-\\n\"\n    .string \"talked-about {PLAYER}.\\p\"\n    .string \"You certainly do have the look of\\n\"\n    .string \"a winner.\\p\"\n    .string \"But for me to accept you as\\n\"\n    .string \"a true POKéMON great…\\p\"\n    .string \"… …\\p\"\n    .string \"You've still a ways to go!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_YoullBeTalkedAboutIfYouKeepWinning::\n    .string \"All of us gathered here are fans\\n\"\n    .string \"of POKéMON TRAINERS.\\p\"\n    .string \"The way they look in battle…\\n\"\n    .string \"They are the picture of coolness.\\p\"\n    .string \"Perhaps you will be talked about\\n\"\n    .string \"here, too, if you keep winning.$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_WantToBeLikeYouOneDay::\n    .string \"It's {PLAYER}!\\n\"\n    .string \"It's {PLAYER}!\\p\"\n    .string \"I want to be like {PLAYER} one day!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_EveryoneButMeStoppedBeingYourFan::\n    .string \"Everyone stopped being {PLAYER}'s\\n\"\n    .string \"fan…\\p\"\n    .string \"But that means I can have {PLAYER}\\n\"\n    .string \"all to myself!\\p\"\n    .string \"Yay! Go for it!\\n\"\n    .string \"My one and only {PLAYER}!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_WantToBeLikeSabrina::\n    .string \"Do you know what?\\n\"\n    .string \"I want to be like SABRINA!\\p\"\n    .string \"I want to be a psychic girl just\\n\"\n    .string \"like her!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_WontStopBeingSabrinasFan::\n    .string \"Even if I'm the only one, I won't\\n\"\n    .string \"stop being SABRINA's fan.\\p\"\n    .string \"My dream is to be like SABRINA,\\n\"\n    .string \"cute, but cool.\\p\"\n    .string \"I want to be a psychic girl just\\n\"\n    .string \"like her!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_CanIBecomeCoolTrainerOneDay::\n    .string \"I wonder if I can become a cool\\n\"\n    .string \"TRAINER one day?$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_TheWayYouBattleIsCool::\n    .string \"Oh, man, oh, man!\\n\"\n    .string \"Cool! Too cool!\\p\"\n    .string \"…Huh?\\n\"\n    .string \"No, not you.\\p\"\n    .string \"Just the way you battle.\\n\"\n    .string \"That's cool.$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_ImOnlyOneLeftOfYourFans::\n    .string \"Yo, {PLAYER}!\\p\"\n    .string \"Looks like I'm the only one left\\n\"\n    .string \"out of your fans.\\p\"\n    .string \"But, you know, I like being an only\\n\"\n    .string \"fan… It's less stressful.\\p\"\n    .string \"Keep up and at it!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_LoveWayTrainerTalks::\n    .string \"{STR_VAR_1}'s cool, huh?\\n\"\n    .string \"I love the way he talks.\\p\"\n    .string \"I'd really relish a chance to meet\\n\"\n    .string \"him in person once.$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_ImLoneTrainerFan::\n    .string \"Huh, can you believe it?\\n\"\n    .string \"Everyone turned into your fans.\\p\"\n    .string \"So after all we've been through,\\n\"\n    .string \"I'm the lone {STR_VAR_1} fan?\\p\"\n    .string \"Eh, being the one and only\\n\"\n    .string \"{STR_VAR_1} fan's my style, anyway.$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_AdoreWayYouBattle::\n    .string \"Oh, my goodness!\\n\"\n    .string \"Is it really you, {PLAYER}?\\p\"\n    .string \"I have to tell you, I adore the\\n\"\n    .string \"way you battle.\\p\"\n    .string \"I hope you'll keep at it.\\n\"\n    .string \"I'll be your number one fan!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_ImYourNumberOneFan::\n    .string \"Oh, my goodness!\\n\"\n    .string \"If it isn't {PLAYER}!\\p\"\n    .string \"It's so disappointing… I realized\\n\"\n    .string \"I'm your number-one-and-only fan!\\p\"\n    .string \"Well, it can't be helped!\\n\"\n    .string \"Let me cheer you on, at least!\\p\"\n    .string \"Hurray, hurray, {PLAYER}!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_TrainerHasBeenOnFire::\n    .string \"Recently, {STR_VAR_1} has been on\\n\"\n    .string \"fire.\\p\"\n    .string \"The way he battles… It's just \\n\"\n    .string \"the way that I like it!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_EveryoneTalksAboutYou::\n    .string \"Oh, hello!\\n\"\n    .string \"If it isn't {PLAYER}!\\p\"\n    .string \"Lately, all everyone talks about\\n\"\n    .string \"is you.\\p\"\n    .string \"I'm feeling lonesome because I\\n\"\n    .string \"prefer {STR_VAR_1}.$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_YouReallyAreAmazing::\n    .string \"Amazing!\\n\"\n    .string \"{PLAYER}, you really are amazing!\\p\"\n    .string \"Instead of just watching, maybe\\n\"\n    .string \"I should become a TRAINER, too.$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_ImYourOnlyFan::\n    .string \"I'm your only fan…\\n\"\n    .string \"Sigh… This is lonely…\\p\"\n    .string \"Can't you try harder and make the\\n\"\n    .string \"others take notice of you?$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_WhyCantOthersSeeMastersDignity::\n    .string \"Master {STR_VAR_1} is so dignified…\\n\"\n    .string \"He is so my type.\\p\"\n    .string \"Why can't the others see the\\n\"\n    .string \"dignity he simply oozes?$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_BelieveInMasterWithAllMyHeart::\n    .string \"I believe in Master {STR_VAR_1}\\n\"\n    .string \"with all my heart.\\p\"\n    .string \"Even if I am the only one to\\n\"\n    .string \"believe in him.\\p\"\n    .string \"I won't ever feel lonesome, though.\\p\"\n    .string \"Not if I keep thinking about Master\\n\"\n    .string \"{STR_VAR_1}.$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_YourBattleStyleIsEducational::\n    .string \"Hiyah!\\p\"\n    .string \"Your battling style is most\\n\"\n    .string \"educational.\\p\"\n    .string \"I hope that you will keep plugging\\n\"\n    .string \"away at success, hiyah!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_WontStopBeingYourFan::\n    .string \"Instead of just watching others\\n\"\n    .string \"battle, battle yourself!\\p\"\n    .string \"…My DOJO's MASTER chewed me out\\n\"\n    .string \"like that…\\p\"\n    .string \"But I won't let that stop me from\\n\"\n    .string \"being your fan!\\p\"\n    .string \"I can't stop being your fan!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_OnlyMasterHasMyRespect::\n    .string \"Hiyah! There is but one TRAINER\\n\"\n    .string \"who has my respect.\\p\"\n    .string \"And that is none other than my\\n\"\n    .string \"MASTER at the FIGHTING DOJO.\\p\"\n    .string \"You should become a fan of my\\n\"\n    .string \"MASTER like me! Hiyah!$\"\n\nSaffronCity_PokemonTrainerFanClub_Text_NeverBeFanOfAnyoneButMaster::\n    .string \"Hiyah! I respect my MASTER at the\\n\"\n    .string \"FIGHTING DOJO.\\p\"\n    .string \"I will never become a fan of\\n\"\n    .string \"anyone other than my MASTER!\\p\"\n    .string \"I will even sneak out of the DOJO\\n\"\n    .string \"to spread word of his greatness.\\p\"\n    .string \"Hiyah!$\"\n\n"
  },
  {
    "path": "data/maps/SeafoamIslands_1F/map.json",
    "content": "{\n  \"id\": \"MAP_SEAFOAM_ISLANDS_1F\",\n  \"name\": \"SeafoamIslands_1F\",\n  \"layout\": \"LAYOUT_SEAFOAM_ISLANDS_1F\",\n  \"music\": \"MUS_VIRIDIAN_FOREST\",\n  \"region_map_section\": \"MAPSEC_SEAFOAM_ISLANDS\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"FLAG_HIDE_SEAFOAM_B1F_BOULDER_1\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_1F_BOULDER_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"FLAG_HIDE_SEAFOAM_B1F_BOULDER_2\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_1F_BOULDER_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SeafoamIslands_1F_EventScript_ItemIceHeal\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_ISLANDS_1F_ICE_HEAL\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Seel\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B1F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE20\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 32,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE20\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 21,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B1F\",\n      \"dest_warp_id\": \"9\"\n    },\n    {\n      \"x\": 30,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B1F\",\n      \"dest_warp_id\": \"10\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SeafoamIslands_1F/scripts.inc",
    "content": ".set LOCALID_SEEL_MASTER, 4\n.set TRAINER, VAR_0x8009\n\nSeafoamIslands_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SeafoamIslands_1F_OnTransition\n\t.byte 0\n\nSeafoamIslands_1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_SEAFOAM_ISLANDS_1F\n\tgoto SeafoamIslands_1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nSeafoamIslands_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_SEEL\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SeafoamIslands_1F_MapScript_SeelMasterMovementType\n\tend\n\nSeafoamIslands_1F_MapScript_SeelMasterMovementType::\n\tsetobjectmovementtype LOCALID_SEEL_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n"
  },
  {
    "path": "data/maps/SeafoamIslands_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_SEAFOAM_ISLANDS_B1F\",\n  \"name\": \"SeafoamIslands_B1F\",\n  \"layout\": \"LAYOUT_SEAFOAM_ISLANDS_B1F\",\n  \"music\": \"MUS_VIRIDIAN_FOREST\",\n  \"region_map_section\": \"MAPSEC_SEAFOAM_ISLANDS\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"FLAG_HIDE_SEAFOAM_B2F_BOULDER_1\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_B1F_BOULDER_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"FLAG_HIDE_SEAFOAM_B2F_BOULDER_2\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_B1F_BOULDER_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SeafoamIslands_B1F_EventScript_ItemWaterStone\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_ISLANDS_B1F_WATER_STONE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 14,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SeafoamIslands_B1F_EventScript_ItemRevive\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_ISLANDS_B1F_REVIVE\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Dewgong\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_1F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B2F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 9,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B2F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B2F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 32,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B2F\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 23,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B2F\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B2F\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 21,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_1F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_1F\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/SeafoamIslands_B1F/scripts.inc",
    "content": ".set LOCALID_DEWGONG_MASTER, 5\n.set TRAINER, VAR_0x8009\n\nSeafoamIslands_B1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SeafoamIslands_B1F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nSeafoamIslands_B1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_DEWGONG\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SeafoamIslands_B1F_MapScript_DewgongMasterMovementType\n\tend\n\nSeafoamIslands_B1F_MapScript_DewgongMasterMovementType::\n\tsetobjectmovementtype LOCALID_DEWGONG_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn"
  },
  {
    "path": "data/maps/SeafoamIslands_B2F/map.json",
    "content": "{\n  \"id\": \"MAP_SEAFOAM_ISLANDS_B2F\",\n  \"name\": \"SeafoamIslands_B2F\",\n  \"layout\": \"LAYOUT_SEAFOAM_ISLANDS_B2F\",\n  \"music\": \"MUS_VIRIDIAN_FOREST\",\n  \"region_map_section\": \"MAPSEC_SEAFOAM_ISLANDS\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"FLAG_HIDE_SEAFOAM_B3F_BOULDER_1\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_B2F_BOULDER_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"FLAG_HIDE_SEAFOAM_B3F_BOULDER_2\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_B2F_BOULDER_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SeafoamIslands_B2F_EventScript_ItemBigPearl\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_ISLANDS_B2F_BIG_PEARL\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B3F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 32,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B3F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 17,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B3F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 9,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B1F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B1F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 32,\n      \"y\": 14,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B1F\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B1F\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B1F\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 24,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B3F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 27,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B3F\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/SeafoamIslands_B2F/scripts.inc",
    "content": "SeafoamIslands_B2F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/SeafoamIslands_B3F/map.json",
    "content": "{\n  \"id\": \"MAP_SEAFOAM_ISLANDS_B3F\",\n  \"name\": \"SeafoamIslands_B3F\",\n  \"layout\": \"LAYOUT_SEAFOAM_ISLANDS_B3F\",\n  \"music\": \"MUS_VIRIDIAN_FOREST\",\n  \"region_map_section\": \"MAPSEC_SEAFOAM_ISLANDS\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 8,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_B3F_BOULDER_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 8,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_B3F_BOULDER_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"FLAG_HIDE_SEAFOAM_B4F_BOULDER_2\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_B3F_BOULDER_5\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_B3F_BOULDER_6\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_B3F_BOULDER_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"FLAG_HIDE_SEAFOAM_B4F_BOULDER_1\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_B3F_BOULDER_3\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Dragonair\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 14,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 16,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B2F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B4F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B4F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 23,\n      \"y\": 9,\n      \"elevation\": 1,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B2F\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 24,\n      \"y\": 9,\n      \"elevation\": 1,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B2F\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B4F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B4F\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 5,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"item\": \"ITEM_NUGGET\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SEAFOAM_ISLANDS_B3F_NUGGET\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/SeafoamIslands_B3F/scripts.inc",
    "content": ".equ NUM_BOULDERS_PRESENT, VAR_TEMP_2\n.set LOCALID_DRAGONAIR_MASTER, 7\n.set TRAINER, VAR_0x8009\n\nSeafoamIslands_B3F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SeafoamIslands_B3F_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, SeafoamIslands_B3F_OnFrame\n\t.byte 0\n\nSeafoamIslands_B3F_OnTransition::\n\tcall_if_unset FLAG_STOPPED_SEAFOAM_B3F_CURRENT, SeafoamIslands_B3F_EventScript_CheckStoppedCurrent\n\tcall_if_set FLAG_STOPPED_SEAFOAM_B3F_CURRENT, SeafoamIslands_B3F_EventScript_SetNoCurrentLayout\n\tgoto SeafoamIslands_B3F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nSeafoamIslands_B3F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_DRAGONAIR\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SeafoamIslands_B3F_MapScript_DragonairMasterMovementType\n\tend\n\nSeafoamIslands_B3F_MapScript_DragonairMasterMovementType::\n\tsetobjectmovementtype LOCALID_DRAGONAIR_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nSeafoamIslands_B3F_EventScript_CheckStoppedCurrent::\n\tsetvar NUM_BOULDERS_PRESENT, 0\n\tcall_if_unset FLAG_HIDE_SEAFOAM_B3F_BOULDER_1, SeafoamIslands_B3F_EventScript_AddBoulderPresent\n\tcall_if_unset FLAG_HIDE_SEAFOAM_B3F_BOULDER_2, SeafoamIslands_B3F_EventScript_AddBoulderPresent\n\tcall_if_eq NUM_BOULDERS_PRESENT, 2, SeafoamIslands_B3F_EventScript_StoppedCurrent\n\treturn\n\nSeafoamIslands_B3F_EventScript_StoppedCurrent::\n\tsetflag FLAG_STOPPED_SEAFOAM_B3F_CURRENT\n\treturn\n\nSeafoamIslands_B3F_EventScript_SetNoCurrentLayout::\n\tsetmaplayoutindex LAYOUT_SEAFOAM_ISLANDS_B3F_CURRENT_STOPPED\n\treturn\n\nSeafoamIslands_B3F_OnFrame::\n\tmap_script_2 VAR_TEMP_1, 1, SeafoamIslands_B3F_EventScript_EnterByFalling\n\t.2byte 0\n\nSeafoamIslands_B3F_EventScript_EnterByFalling::\n\tlockall\n\tsetvar NUM_BOULDERS_PRESENT, 0\n\tcall_if_unset FLAG_HIDE_SEAFOAM_B3F_BOULDER_1, SeafoamIslands_B3F_EventScript_AddBoulderPresent\n\tcall_if_unset FLAG_HIDE_SEAFOAM_B3F_BOULDER_2, SeafoamIslands_B3F_EventScript_AddBoulderPresent\n\tgoto_if_eq NUM_BOULDERS_PRESENT, 2, SeafoamIslands_B3F_EventScript_CurrentBlocked\n\tgetplayerxy VAR_0x8008, VAR_0x8009\n\tcall_if_lt VAR_0x8008, 24, SeafoamIslands_B3F_EventScript_RideCurrentFar\n\tcall_if_ge VAR_0x8008, 24, SeafoamIslands_B3F_EventScript_RideCurrentClose\n\tsetvar VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F, 1\n\twarp MAP_SEAFOAM_ISLANDS_B4F, 27, 21\n\twaitstate\n\treleaseall\n\tend\n\nSeafoamIslands_B3F_EventScript_AddBoulderPresent::\n\taddvar NUM_BOULDERS_PRESENT, 1\n\treturn\n\nSeafoamIslands_B3F_EventScript_RideCurrentFar::\n\tapplymovement OBJ_EVENT_ID_PLAYER, SeafoamIslands_B3F_Movement_RideCurrentFar\n\twaitmovement 0\n\treturn\n\nSeafoamIslands_B3F_EventScript_RideCurrentClose::\n\tapplymovement OBJ_EVENT_ID_PLAYER, SeafoamIslands_B3F_Movement_RideCurrentClose\n\twaitmovement 0\n\treturn\n\nSeafoamIslands_B3F_EventScript_CurrentBlocked::\n\tsetvar VAR_TEMP_1, 0\n\treleaseall\n\tend\n\nSeafoamIslands_B3F_Movement_RideCurrentFar::\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_right\n\twalk_fast_right\n\twalk_fast_right\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\tstep_end\n\nSeafoamIslands_B3F_Movement_RideCurrentClose::\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_right\n\twalk_fast_right\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\twalk_fast_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/SeafoamIslands_B4F/map.json",
    "content": "{\n  \"id\": \"MAP_SEAFOAM_ISLANDS_B4F\",\n  \"name\": \"SeafoamIslands_B4F\",\n  \"layout\": \"LAYOUT_SEAFOAM_ISLANDS_B4F\",\n  \"music\": \"MUS_VIRIDIAN_FOREST\",\n  \"region_map_section\": \"MAPSEC_SEAFOAM_ISLANDS\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 18,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_B4F_BOULDER_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 18,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_B4F_BOULDER_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ARTICUNO\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SeafoamIslands_B4F_EventScript_Articuno\",\n      \"flag\": \"FLAG_HIDE_ARTICUNO\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 19,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SeafoamIslands_B4F_EventScript_ItemUltraBall\",\n      \"flag\": \"FLAG_HIDE_SEAFOAM_ISLANDS_B4F_ULTRA_BALL\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Articuno\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 15,\n      \"y\": 9,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B3F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 32,\n      \"y\": 5,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B3F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 17,\n      \"elevation\": 1,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B3F\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 17,\n      \"elevation\": 1,\n      \"dest_map\": \"MAP_SEAFOAM_ISLANDS_B3F\",\n      \"dest_warp_id\": \"8\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 26,\n      \"y\": 19,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F\",\n      \"var_value\": \"0\",\n      \"script\": \"SeafoamIslands_B4F_EventScript_UpwardCurrent\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 27,\n      \"y\": 19,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F\",\n      \"var_value\": \"0\",\n      \"script\": \"SeafoamIslands_B4F_EventScript_UpwardCurrent\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 28,\n      \"y\": 19,\n      \"elevation\": 1,\n      \"var\": \"VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F\",\n      \"var_value\": \"0\",\n      \"script\": \"SeafoamIslands_B4F_EventScript_UpwardCurrent\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 13,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"item\": \"ITEM_WATER_STONE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SEAFOAM_ISLANDS_B4F_WATER_STONE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 30,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SeafoamIslands_B4F_EventScript_FastCurrentSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SeafoamIslands_B4F_EventScript_BoulderHintSign\"\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/SeafoamIslands_B4F/scripts.inc",
    "content": ".equ NUM_BOULDERS_PRESENT, VAR_TEMP_2\n.set LOCALID_ARTICUNO_MASTER, 5\n.set TRAINER, VAR_0x8009\n\nSeafoamIslands_B4F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SeafoamIslands_B4F_OnTransition\n\tmap_script MAP_SCRIPT_ON_RESUME, SeafoamIslands_B4F_OnResume\n\tmap_script MAP_SCRIPT_ON_LOAD, SeafoamIslands_B4F_OnLoad\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, SeafoamIslands_B4F_OnWarp\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, SeafoamIslands_B4F_OnFrame\n\t.byte 0\n\nSeafoamIslands_B4F_OnResume::\n\tcall_if_set FLAG_SYS_SPECIAL_WILD_BATTLE, SeafoamIslands_B4F_EventScript_TryRemoveArticuno\n\tend\n\nSeafoamIslands_B4F_EventScript_TryRemoveArticuno::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, EventScript_Return\n\tremoveobject VAR_LAST_TALKED\n\treturn\n\nSeafoamIslands_B4F_OnTransition::\n\tcall_if_set FLAG_FOUGHT_ARTICUNO, SeafoamIslands_B4F_EventScript_HideArticuno\n\tcall_if_unset FLAG_FOUGHT_ARTICUNO, SeafoamIslands_B4F_EventScript_TryShowArticuno\n\tcall_if_unset FLAG_STOPPED_SEAFOAM_B4F_CURRENT, SeafoamIslands_B4F_EventScript_CheckStoppedCurrent\n\tcall_if_set FLAG_STOPPED_SEAFOAM_B4F_CURRENT, SeafoamIslands_B4F_EventScript_SetNoCurrentLayout\n\tgoto SeafoamIslands_B4F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nSeafoamIslands_B4F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_ARTICUNO\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SeafoamIslands_B4F_MapScript_ArticunoMasterMovementType\n\tend\n\nSeafoamIslands_B4F_MapScript_ArticunoMasterMovementType::\n\tsetobjectmovementtype LOCALID_ARTICUNO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nSeafoamIslands_B4F_EventScript_CheckStoppedCurrent::\n\tsetvar NUM_BOULDERS_PRESENT, 0\n\tcall_if_unset FLAG_HIDE_SEAFOAM_B4F_BOULDER_1, SeafoamIslands_B4F_EventScript_AddBoulderPresent\n\tcall_if_unset FLAG_HIDE_SEAFOAM_B4F_BOULDER_2, SeafoamIslands_B4F_EventScript_AddBoulderPresent\n\tcall_if_eq NUM_BOULDERS_PRESENT, 2, SeafoamIslands_B4F_EventScript_StoppedCurrent\n\treturn\n\nSeafoamIslands_B4F_EventScript_StoppedCurrent::\n\tsetflag FLAG_STOPPED_SEAFOAM_B4F_CURRENT\n\treturn\n\nSeafoamIslands_B4F_EventScript_SetNoCurrentLayout::\n\tsetmaplayoutindex LAYOUT_SEAFOAM_ISLANDS_B4F_CURRENT_STOPPED\n\treturn\n\nSeafoamIslands_B4F_EventScript_TryShowArticuno::\n\tgoto_if_set FLAG_ARTICUNO_FLEW_AWAY, EventScript_Return\n\tclearflag FLAG_HIDE_ARTICUNO\n\treturn\n\nSeafoamIslands_B4F_EventScript_HideArticuno::\n\tsetflag FLAG_HIDE_ARTICUNO\n\treturn\n\nSeafoamIslands_B4F_OnLoad::\n\tsetvar NUM_BOULDERS_PRESENT, 0\n\tcall_if_unset FLAG_HIDE_SEAFOAM_B4F_BOULDER_1, SeafoamIslands_B4F_EventScript_AddBoulderPresent\n\tcall_if_unset FLAG_HIDE_SEAFOAM_B4F_BOULDER_2, SeafoamIslands_B4F_EventScript_AddBoulderPresent\n\tgoto_if_eq NUM_BOULDERS_PRESENT, 2, SeafoamIslands_B4F_EventScript_SetCalmWaterNearStairs\n\tend\n\nSeafoamIslands_B4F_EventScript_SetCalmWaterNearStairs::\n\tsetmetatile 12, 14, METATILE_General_CalmWater, 0\n\tsetmetatile 13, 14, METATILE_General_CalmWater, 0\n\tend\n\nSeafoamIslands_B4F_OnWarp::\n\tmap_script_2 VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F, 1, SeafoamIslands_B4F_EventScript_WarpInOnCurrent\n\t.2byte 0\n\nSeafoamIslands_B4F_EventScript_WarpInOnCurrent::\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH\n\tspecial ForcePlayerToStartSurfing\n\tend\n\nSeafoamIslands_B4F_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F, 1, SeafoamIslands_B4F_EventScript_EnterOnCurrent\n\tmap_script_2 VAR_TEMP_1, 1, SeafoamIslands_B4F_EventScript_EnterByFalling\n\t.2byte 0\n\n@ The current the player is forced in on from B3F\nSeafoamIslands_B4F_EventScript_EnterOnCurrent::\n\tlockall\n\tapplymovement OBJ_EVENT_ID_PLAYER, SeafoamIslands_B4F_Movement_EnterOnCurrent\n\twaitmovement 0\n\tsetvar VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F, 0\n\treleaseall\n\tend\n\nSeafoamIslands_B4F_Movement_EnterOnCurrent::\n\twalk_fast_up\n\twalk_fast_up\n\twalk_fast_up\n\tstep_end\n\n@ The current the player lands on when entering the map by falling\nSeafoamIslands_B4F_EventScript_EnterByFalling::\n\tlockall\n\tsetvar NUM_BOULDERS_PRESENT, 0\n\tcall_if_unset FLAG_HIDE_SEAFOAM_B4F_BOULDER_1, SeafoamIslands_B4F_EventScript_AddBoulderPresent\n\tcall_if_unset FLAG_HIDE_SEAFOAM_B4F_BOULDER_2, SeafoamIslands_B4F_EventScript_AddBoulderPresent\n\tgoto_if_eq NUM_BOULDERS_PRESENT, 2, SeafoamIslands_B4F_EventScript_CurrentBlocked\n\tgetplayerxy VAR_0x8008, VAR_0x8009\n\tcall_if_lt VAR_0x8008, 9, SeafoamIslands_B4F_EventScript_RideCurrentFar\n\tcall_if_ge VAR_0x8008, 9, SeafoamIslands_B4F_EventScript_RideCurrentClose\n\tspecial SeafoamIslandsB4F_CurrentDumpsPlayerOnLand\n\tsetvar VAR_TEMP_1, 0\n\treleaseall\n\tend\n\nSeafoamIslands_B4F_EventScript_AddBoulderPresent::\n\taddvar NUM_BOULDERS_PRESENT, 1\n\treturn\n\nSeafoamIslands_B4F_EventScript_RideCurrentFar::\n\tapplymovement OBJ_EVENT_ID_PLAYER, SeafoamIslands_B4F_Movement_RideCurrentFar\n\twaitmovement 0\n\treturn\n\nSeafoamIslands_B4F_EventScript_RideCurrentClose::\n\tapplymovement OBJ_EVENT_ID_PLAYER, SeafoamIslands_B4F_Movement_RideCurrentClose\n\twaitmovement 0\n\treturn\n\nSeafoamIslands_B4F_EventScript_CurrentBlocked::\n\tsetvar VAR_TEMP_1, 0\n\treleaseall\n\tend\n\nSeafoamIslands_B4F_Movement_RideCurrentFar::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_up\n\tstep_end\n\nSeafoamIslands_B4F_Movement_RideCurrentClose::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_up\n\tstep_end\n\n@ Triggers blocking re-entry to B3F\nSeafoamIslands_B4F_EventScript_UpwardCurrent::\n\tlockall\n\tapplymovement OBJ_EVENT_ID_PLAYER, SeafoamIslands_B4F_Movement_WalkUp\n\twaitmovement 0\n\treleaseall\n\tend\n\nSeafoamIslands_B4F_Movement_WalkUp::\n\twalk_up\n\tstep_end\n\nSeafoamIslands_B4F_EventScript_Articuno::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tsetwildbattle SPECIES_ARTICUNO, 50\n\twaitse\n\tplaymoncry SPECIES_ARTICUNO, CRY_MODE_ENCOUNTER\n\tmessage Text_Gyaoo\n\twaitmessage\n\twaitmoncry\n\tdelay 10\n\tplaybgm MUS_ENCOUNTER_GYM_LEADER, 0\n\twaitbuttonpress\n\tsetflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecial StartLegendaryBattle\n\twaitstate\n\tclearflag FLAG_SYS_SPECIAL_WILD_BATTLE\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_WON, SeafoamIslands_B4F_EventScript_DefeatedArticuno\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_RAN, SeafoamIslands_B4F_EventScript_RanFromArticuno\n\tgoto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, SeafoamIslands_B4F_EventScript_RanFromArticuno\n\tsetflag FLAG_FOUGHT_ARTICUNO\n\trelease\n\tend\n\nSeafoamIslands_B4F_EventScript_DefeatedArticuno::\n\tsetflag FLAG_ARTICUNO_FLEW_AWAY\n\tsetvar VAR_0x8004, SPECIES_ARTICUNO\n\tgoto EventScript_MonFlewAway\n\tend\n\nSeafoamIslands_B4F_EventScript_RanFromArticuno::\n\tsetvar VAR_0x8004, SPECIES_ARTICUNO\n\tgoto EventScript_MonFlewAway\n\tend\n\nSeafoamIslands_B4F_EventScript_BoulderHintSign::\n\tmsgbox SeafoamIslands_B4F_Text_BouldersMightChangeWaterFlow, MSGBOX_SIGN\n\tend\n\nSeafoamIslands_B4F_EventScript_FastCurrentSign::\n\tmsgbox SeafoamIslands_B4F_Text_DangerFastCurrent, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SeafoamIslands_B4F/text.inc",
    "content": "Text_RockSlideTeach::\n    .string \"When you're up on a rocky mountain\\n\"\n    .string \"like this, rockslides are a threat.\\p\"\n    .string \"Can you imagine?\\n\"\n    .string \"Boulders tumbling down on you?\\p\"\n    .string \"That'd be, like, waaaaaaaaaaah!\\n\"\n    .string \"Total terror!\\p\"\n    .string \"You don't seem to be scared.\\n\"\n    .string \"Want to try using ROCK SLIDE?$\"\n\nText_RockSlideDeclined::\n    .string \"Oh, so you are scared after all.$\"\n\nText_RockSlideWhichMon::\n    .string \"Which POKéMON should I teach\\n\"\n    .string \"ROCK SLIDE?$\"\n\nText_RockSlideTaught::\n    .string \"It might be scary to use it in this\\n\"\n    .string \"tunnel…$\"\n\nText_RockSlideReteach::\n    .string \"You really aren't afraid of rockslides\\n\"\n    .string \"if you're here spelunking again.\\p\"\n    .string \"I can teach you ROCK SLIDE\\n\"\n    .string \"once more if you can pay ¥5000.$\"\n\nText_RockSlideReteach2::\n    .string \"Would you like me to teach\\n\"\n    .string \"ROCK SLIDE?$\"\n\nText_RockSlideNotEnoughMoney::\n    .string \"Supplies for exploring caves\\n\"\n    .string \"don't come cheap.\\p\"\n    .string \"If I don't charge for my services,\\n\"\n    .string \"I can't afford to keep exploring!\\p\"\n    .string \"If you want to learn ROCK SLIDE,\\n\"\n    .string \"come back with ¥5000.$\"\n\nSeafoamIslands_B4F_Text_BouldersMightChangeWaterFlow::\n    .string \"Hint: Boulders might change the\\n\"\n    .string \"flow of water.$\"\n\nSeafoamIslands_B4F_Text_DangerFastCurrent::\n    .string \"DANGER\\n\"\n    .string \"Fast current!$\"\n\n"
  },
  {
    "path": "data/maps/SevenIsland/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND\",\n  \"name\": \"SevenIsland\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND\",\n  \"music\": \"MUS_SEVII_67\",\n  \"region_map_section\": \"MAPSEC_SEVEN_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": -10,\n      \"map\": \"MAP_SEVEN_ISLAND_TRAINER_TOWER\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_EventScript_SwordsDanceTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_EventScript_OldWoman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_EventScript_Scientist\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 12,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_HOUSE_ROOM1\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_MART\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 16,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_HARBOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SevenIsland_EventScript_IslandSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SevenIsland_EventScript_IslandMailbox\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland/scripts.inc",
    "content": ".equ CHECK_BOXES_MOVED, 9\n.equ CHECK_ANY_VISITORS, 10\n.equ CREATE_VISITOR_STRING, 12\n\n.equ TYPE, VAR_0x8003\n\nSevenIsland_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_OnTransition\n\t.byte 0\n\nSevenIsland_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_SEVEN_ISLAND\n\tend\n\nSevenIsland_EventScript_IslandSign::\n\tmsgbox SevenIsland_Text_IslandSign, MSGBOX_SIGN\n\tend\n\nSevenIsland_EventScript_OldWoman::\n\tmsgbox SevenIsland_Text_IslandsMadeInSevenDays, MSGBOX_NPC\n\tend\n\nSevenIsland_EventScript_Scientist::\n\tmsgbox SevenIsland_Text_IslandVirtuallyUntouched, MSGBOX_NPC\n\tend\n\nSevenIsland_EventScript_IslandMailbox::\n\tsetvar TYPE, CHECK_BOXES_MOVED\n\tcallnative UseBattleHouseVar\n\tcompare VAR_RESULT, 1\n\tgoto_if_eq SevenIsland_EventScript_BattleHouse\n\tmsgbox SevenIsland_Text_FadedWriting, MSGBOX_SIGN\n\tend\n\nSevenIsland_EventScript_BattleHouse::\n\tsetvar TYPE, CHECK_ANY_VISITORS\n\tcallnative UseBattleHouseVar\n\tcompare VAR_RESULT, 0\n\tgoto_if_eq SevenIsland_EventScript_BattleHouseNoVisitors\n\tswitch VAR_RESULT\n\tcase 1, SevenIsland_EventScript_Buffer1\n\tcase 2, SevenIsland_EventScript_Buffer2\n\tcase 3, SevenIsland_EventScript_Buffer3\n\tcase 4, SevenIsland_EventScript_Buffer4\n\tcase 5, SevenIsland_EventScript_Buffer5\n\tcase 6, SevenIsland_EventScript_Buffer6\n\tcase 7, SevenIsland_EventScript_Buffer7\n\tend\n\nSevenIsland_EventScript_BattleHouseNoVisitors::\n\tmsgbox SevenIsland_Text_BattleHouseWithNoVisitors, MSGBOX_SIGN\n\tend\n\nSevenIsland_EventScript_Buffer1::\n\tsetvar TYPE, CREATE_VISITOR_STRING\n\tcallnative UseBattleHouseVar\n\tmsgbox SevenIsland_Text_BattleHouseOneVisitor, MSGBOX_SIGN\n\tend\n\nSevenIsland_EventScript_Buffer2::\n\tsetvar TYPE, CREATE_VISITOR_STRING\n\tcallnative UseBattleHouseVar\n\tmsgbox SevenIsland_Text_BattleHouseTwoVisitors, MSGBOX_SIGN\n\tend\n\nSevenIsland_EventScript_Buffer3::\n\tsetvar TYPE, CREATE_VISITOR_STRING\n\tcallnative UseBattleHouseVar\n\tmsgbox SevenIsland_Text_BattleHouseThreeVisitors, MSGBOX_SIGN\n\tend\n\nSevenIsland_EventScript_Buffer4::\n\tsetvar TYPE, CREATE_VISITOR_STRING\n\tcallnative UseBattleHouseVar\n\tmsgbox SevenIsland_Text_BattleHouseFourVisitors, MSGBOX_SIGN\n\tend\n\nSevenIsland_EventScript_Buffer5::\n\tsetvar TYPE, CREATE_VISITOR_STRING\n\tcallnative UseBattleHouseVar\n\tmsgbox SevenIsland_Text_BattleHouseFiveVisitors, MSGBOX_SIGN\n\tend\n\nSevenIsland_EventScript_Buffer6::\n\tsetvar TYPE, CREATE_VISITOR_STRING\n\tcallnative UseBattleHouseVar\n\tmsgbox SevenIsland_Text_BattleHouseSixVisitors, MSGBOX_SIGN\n\tend\n\nSevenIsland_EventScript_Buffer7::\n\tsetvar TYPE, CREATE_VISITOR_STRING\n\tcallnative UseBattleHouseVar\n\tmsgbox SevenIsland_Text_BattleHouseSevenVisitors, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland/text.inc",
    "content": "Text_SwordsDanceTeach::\n    .string \"Not many people come out here.\\p\"\n    .string \"If I train here, I'm convinced that\\n\"\n    .string \"I'll get stronger and stronger.\\p\"\n    .string \"Yep, stronger and stronger…\\p\"\n    .string \"How would you like to learn a move\\n\"\n    .string \"like that? It's SWORDS DANCE.$\"\n\nText_SwordsDanceDeclined::\n    .string \"Well, that's fine, too.$\"\n\nText_SwordsDanceWhichMon::\n    .string \"All right, pick which POKéMON\\n\"\n    .string \"I should teach it to.$\"\n\nText_SwordsDanceReteach::\n    .string \"I'm still trying to get stronger\\n\"\n    .string \"and stronger…\\p\"\n    .string \"I've heard that vitamins strengthen\\n\"\n    .string \"POKéMON, but they're so expensive!\\p\"\n    .string \"So, I started charging ¥5000 to\\n\"\n    .string \"teach other POKéMON SWORDS DANCE.$\"\n\nText_SwordsDanceReteach2::\n    .string \"Would you like me to teach your\\n\"\n    .string \"POKéMON the move SWORDS DANCE?$\"\n\nText_SwordsDanceNotEnoughMoney::\n    .string \"You don't have ¥5000?\\p\"\n    .string \"I'm sorry, but I need the money\\n\"\n    .string \"to make my POKéMON strong.\\p\"\n    .string \"I'll teach SWORDS DANCE to you\\n\"\n    .string \"when you come back with enough.$\"\n\nText_SwordsDanceTaught::\n    .string \"If only we could keep getting\\n\"\n    .string \"stronger and stronger, eh?$\"\n\nSevenIsland_Text_IslandSign::\n    .string \"SEVEN ISLAND\\n\"\n    .string \"Quest Island of Infinity$\"\n\nSevenIsland_Text_IslandsMadeInSevenDays::\n    .string \"These islands are called the SEVII\\n\"\n    .string \"ISLANDS because there are seven.\\p\"\n    .string \"…Or at least that's what the young\\n\"\n    .string \"people believe.\\p\"\n    .string \"The truth is, these islands are so\\n\"\n    .string \"named because they are said to\\l\"\n    .string \"have been made in seven days.$\"\n\nSevenIsland_Text_IslandVirtuallyUntouched::\n    .string \"This island has been left virtually\\n\"\n    .string \"untouched in its natural state.\\p\"\n    .string \"It could be a little difficult to\\n\"\n    .string \"hike around because of that.$\"\n\nSevenIsland_Text_FadedWriting::\n    .string \"The writing is too faded to read…$\"\n\nSevenIsland_Text_BattleHouseWithNoVisitors::\n    .string \"BATTLE HOUSE\\n\"\n    .string \"…The sign-in sheet is empty.$\"\n\nSevenIsland_Text_BattleHouseOneVisitor::\n    .string \"BATTLE HOUSE\\n\"\n    .string \"There is one person signed in:\\p\"\n    .string \"{STR_VAR_1}.$\"\n\nSevenIsland_Text_BattleHouseTwoVisitors::\n    .string \"BATTLE HOUSE\\n\"\n    .string \"There are two people signed in:\\p\"\n    .string \"{STR_VAR_1}.$\"\n\nSevenIsland_Text_BattleHouseThreeVisitors::\n    .string \"BATTLE HOUSE\\n\"\n    .string \"There are three people signed in:\\p\"\n    .string \"{STR_VAR_1}.$\"\n\nSevenIsland_Text_BattleHouseFourVisitors::\n    .string \"BATTLE HOUSE\\n\"\n    .string \"There are four people signed in:\\p\"\n    .string \"{STR_VAR_1}.$\"\n\nSevenIsland_Text_BattleHouseFiveVisitors::\n    .string \"BATTLE HOUSE\\n\"\n    .string \"There are five people signed in:\\p\"\n    .string \"{STR_VAR_1}.$\"\n\nSevenIsland_Text_BattleHouseSixVisitors::\n    .string \"BATTLE HOUSE\\n\"\n    .string \"There are six people signed in:\\p\"\n    .string \"{STR_VAR_1}.$\"\n\nSevenIsland_Text_BattleHouseSevenVisitors::\n    .string \"BATTLE HOUSE\\n\"\n    .string \"There are seven people signed in:\\p\"\n    .string \"{STR_VAR_1}.$\"\n"
  },
  {
    "path": "data/maps/SevenIsland_Harbor/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_HARBOR\",\n  \"name\": \"SevenIsland_Harbor\",\n  \"layout\": \"LAYOUT_ISLAND_HARBOR\",\n  \"music\": \"MUS_SEVII_67\",\n  \"region_map_section\": \"MAPSEC_SEVEN_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_Harbor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_Harbor/scripts.inc",
    "content": "SevenIsland_Harbor_MapScripts::\n\t.byte 0\n\nSevenIsland_Harbor_EventScript_Sailor::\n\tlock\n\tfaceplayer\n\tmessage Text_WhereDoYouWantToSail\n\twaitmessage\n\tsetvar VAR_0x8004, SEAGALLOP_SEVEN_ISLAND\n\tgoto EventScript_ChooseDestFromIsland\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_House_Room1/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_HOUSE_ROOM1\",\n  \"name\": \"SevenIsland_House_Room1\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_HOUSE_ROOM1\",\n  \"music\": \"MUS_SEVII_67\",\n  \"region_map_section\": \"MAPSEC_SEVEN_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_GYM\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_House_Room1_EventScript_OldWoman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SPEAROW\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_House_Room1_EventScript_Spearow\",\n      \"flag\": \"FLAG_TEMP_1\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_HOUSE_ROOM2\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SevenIsland_House_Room1_EventScript_Box\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_House_Room1/scripts.inc",
    "content": ".equ LOCALID_OLD_WOMAN, 1\n.equ LOCALID_SPEAROW, 2\n\n.equ SET_SPEAROW_STATE, 0\n.equ SET_TOLD_FAMECHECKER, 1\n.equ SET_VISITOR_STATE, 2\n.equ SET_LEVEL_GROWTH, 3\n.equ CHECK_SPEAROW_STATE, 4\n.equ CHECK_TOLD_FAMECHECKER, 5\n.equ CHECK_VISITOR_STATE, 6\n.equ CHECK_LEVEL_GROWTH, 7\n.equ SET_BOXES_MOVED, 8\n.equ CHECK_BOXES_MOVED, 9\n.equ CHECK_ANY_VISITORS, 10\n.equ CHECK_ALL_TOLD, 11\n.equ CREATE_VISITOR_STRING, 12\n\n.equ TYPE, VAR_0x8003\n.equ ARGUMENT, VAR_0x8004\n.equ LEADER_READY, VAR_0x8006\n\nSevenIsland_House_Room1_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_House_Room1_OnTransition\n\t.byte 0\n\nSevenIsland_House_Room1_OnTransition::\n\tsetvar LEADER_READY, 0\n\tsetvar TYPE, CHECK_BOXES_MOVED\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_SetTrainerVisitingLayout\n\tsetvar TYPE, CHECK_SPEAROW_STATE\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_HideSpearow\n\tsetvar TYPE, CHECK_ALL_TOLD\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 7, SevenIsland_House_Room1_EventScript_WalkSpearow\n\tend\n\nSevenIsland_House_Room1_EventScript_SetTrainerVisitingLayout::\n\tsetmaplayoutindex LAYOUT_SEVEN_ISLAND_HOUSE_ROOM1_DOOR_OPEN\n\treturn\n\nSevenIsland_House_Room1_EventScript_HideSpearow::\n\tsetflag FLAG_TEMP_1\n\treturn\n\nSevenIsland_House_Room1_EventScript_WalkSpearow::\n\tsetobjectmovementtype LOCALID_SPEAROW, MOVEMENT_TYPE_WANDER_AROUND\n\treturn\n\nSevenIsland_House_Room1_EventScript_OldWoman::\n\t@ buffernumberstring STR_VAR_1, VAR_BATTLE_HOUSE2\n\t@ buffernumberstring STR_VAR_2, VAR_BATTLE_HOUSE2\n\t@ msgbox TESTTESTTEST\n\tlock\n\tfaceplayer\n\tsetvar TYPE, CHECK_SPEAROW_STATE\n\tcallnative UseBattleHouseVar\n\tgoto_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_SpearowGone\n\tsetvar TYPE, CHECK_BOXES_MOVED\n\tcallnative UseBattleHouseVar\n\tgoto_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_OldWomanBasementOpen\n\tmsgbox SevenIsland_House_Room1_Text_OnlyEnjoymentWatchingBattles\n\ttextcolor 3\n\tmsgbox SevenIsland_House_Room1_Text_ShowFameChecker, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, SevenIsland_House_Room1_EventScript_ShowingFameChecker\n\ttextcolor 1\n\tmsgbox SevenIsland_House_Room1_Text_NoShowFameChecker\n\trelease\n\tend\n\nSevenIsland_House_Room1_EventScript_ShowingFameChecker::\n\ttextcolor 1\n\tmessage SevenIsland_House_Room1_Text_ManyTrainersWhich\n\twaitmessage\n\tsetvar VAR_0x8004, LISTMENU_GYM_LEADERS\n\tspecial ListMenu\n\twaitstate\n\tswitch VAR_RESULT\n\tcase 0, SevenIsland_House_Room1_EventScript_Brock\n\tcase 1, SevenIsland_House_Room1_EventScript_Misty\n\tcase 2, SevenIsland_House_Room1_EventScript_LtSurge\n\tcase 3, SevenIsland_House_Room1_EventScript_Erika\n\tcase 4, SevenIsland_House_Room1_EventScript_Koga\n\tcase 5, SevenIsland_House_Room1_EventScript_Sabrina\n\tcase 6, SevenIsland_House_Room1_EventScript_Blaine\n\tcase 8, SevenIsland_House_Room1_EventScript_RefuseToSelectLeader\n\tcase 127, SevenIsland_House_Room1_EventScript_RefuseToSelectLeader\n\tend\n\nSevenIsland_House_Room1_EventScript_Brock::\n\tsetvar 0x8004, FAMECHECKER_BROCK\n\tbufferstring 0, gText_Brock\n\tbufferstring 1, SevenIsland_House_Room1_Text_HeString\n\tbufferstring 2, gFameCheckerFlavorTextOriginLocation_Brock0\n\tcallnative CheckFilledFameCheckerFor0x8004\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson\n\tgoto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson\n\nSevenIsland_House_Room1_EventScript_Misty::\n\tsetvar 0x8004, FAMECHECKER_MISTY\n\tbufferstring 0, gText_Misty\n\tbufferstring 1, SevenIsland_House_Room1_Text_SheString\n\tbufferstring 2, gFameCheckerFlavorTextOriginLocation_Misty0\n\tcallnative CheckFilledFameCheckerFor0x8004\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson\n\tgoto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson\n\nSevenIsland_House_Room1_EventScript_LtSurge::\n\tsetvar 0x8004, FAMECHECKER_LTSURGE\n\tbufferstring 0, gText_LtSurge\n\tbufferstring 1, SevenIsland_House_Room1_Text_HeString\n\tbufferstring 2, gFameCheckerFlavorTextOriginLocation_LtSurge0\n\tcallnative CheckFilledFameCheckerFor0x8004\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson\n\tgoto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson\n\nSevenIsland_House_Room1_EventScript_Erika::\n\tsetvar 0x8004, FAMECHECKER_ERIKA\n\tbufferstring 0, gText_Erika\n\tbufferstring 1, SevenIsland_House_Room1_Text_SheString\n\tbufferstring 2, gFameCheckerFlavorTextOriginLocation_Erika0\n\tcallnative CheckFilledFameCheckerFor0x8004\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson\n\tgoto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson\n\nSevenIsland_House_Room1_EventScript_Koga::\n\tsetvar 0x8004, FAMECHECKER_KOGA\n\tbufferstring 0, gText_Koga\n\tbufferstring 1, SevenIsland_House_Room1_Text_HeString\n\tbufferstring 2, gFameCheckerFlavorTextOriginLocation_Koga0\n\tcallnative CheckFilledFameCheckerFor0x8004\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson\n\tgoto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson\n\nSevenIsland_House_Room1_EventScript_Sabrina::\n\tsetvar 0x8004, FAMECHECKER_SABRINA\n\tbufferstring 0, gText_Sabrina\n\tbufferstring 1, SevenIsland_House_Room1_Text_SheString\n\tbufferstring 2, gFameCheckerFlavorTextOriginLocation_Sabrina0\n\tcallnative CheckFilledFameCheckerFor0x8004\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson\n\tgoto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson\n\nSevenIsland_House_Room1_EventScript_Blaine::\n\tsetvar 0x8004, FAMECHECKER_BLAINE\n\tbufferstring 0, gText_Blaine\n\tbufferstring 1, SevenIsland_House_Room1_Text_HeString\n\tbufferstring 2, gFameCheckerFlavorTextOriginLocation_Blaine0\n\tcallnative CheckFilledFameCheckerFor0x8004\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room1_EventScript_FullFamecheckerForPerson\n\tgoto SevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson\n\nSevenIsland_House_Room1_EventScript_RefuseToSelectLeader::\n\tmsgbox SevenIsland_House_Room1_Text_NoShowFameChecker\n\trelease\n\tend\n\nSevenIsland_House_Room1_EventScript_FullFamecheckerForPerson::\n\tsetvar TYPE, CHECK_TOLD_FAMECHECKER\n\t@ ARGUMENT already set\n\tcallnative UseBattleHouseVar\n\tgoto_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_AlreadyShownPerson\n\tmsgbox SevenIsland_House_Room1_Text_FullFamecheckerForPerson\n\tgoto_if_ge VAR_BATTLE_HOUSE, 1, SevenIsland_House_Room1_EventScript_AlreadyUnlockedBasement\n\tmsgbox SevenIsland_House_Room1_Text_FirstFullFamecheckerPerson\nSevenIsland_House_Room1_SendOutSpearow::\n\tturnobject LOCALID_OLD_WOMAN, DIR_EAST\n\tmsgbox SevenIsland_House_Room1_Text_CallSpearow\n\tlockall\n\tturnobject LOCALID_SPEAROW, DIR_WEST\n\twaitse\n\tplaymoncry SPECIES_SPEAROW, 0\n\tmsgbox SevenIsland_House_Room1_Text_Spearow\n\twaitmoncry\n\trelease\n\tapplymovement LOCALID_SPEAROW, SevenIsland_House_Room1_Movement_SpearowToTable\n\twaitmovement 0\n\tplayse SE_LEDGE\n\tapplymovement LOCALID_SPEAROW, SevenIsland_House_Room1_Movement_SpearowFinishToTable\n\twaitmovement 0\n\tmsgbox SevenIsland_House_Room1_Text_DeliverToLeader\n\trelease\n\twaitse\n\tplaymoncry SPECIES_SPEAROW, 0\n\tmsgbox SevenIsland_House_Room1_Text_Spearow\n\twaitmoncry\n\trelease\n\tplayse SE_LEDGE\n\tapplymovement LOCALID_SPEAROW, SevenIsland_House_Room1_Movement_SpearowExitHouse\n\twaitmovement 0\n\tplayse SE_EXIT\n\tremoveobject LOCALID_SPEAROW\n\tfaceplayer\n\tgoto_if_ge VAR_BATTLE_HOUSE, 1, SevenIsland_House_Room1_EventScript_SpearowLeftAlreadyUnlockedBasement\n\tsetvar TYPE, SET_SPEAROW_STATE\n\tcallnative UseBattleHouseVar\n\tsetvar TYPE, SET_TOLD_FAMECHECKER\n\t@ ARGUMENT already set\n\tcallnative UseBattleHouseVar\n\tmsgbox SevenIsland_House_Room1_Text_FirstTakeTime\n\trelease\n\tend\n\nSevenIsland_House_Room1_EventScript_NotFullFamecheckerForPerson::\n\tmsgbox SevenIsland_House_Room1_Text_NotFullFamecheckerForPerson\n\trelease\n\tend\n\nSevenIsland_House_Room1_Movement_SpearowToTable::\n\twalk_fast_up\n\twalk_fast_up\n\twalk_fast_left\n\twalk_fast_left\n\tstep_end\n\nSevenIsland_House_Room1_Movement_SpearowFinishToTable::\n\tjump_left\n\twalk_left\n\tstep_end\n\nSevenIsland_House_Room1_Movement_SpearowExitHouse::\n\tjump_2_down\n\twalk_fast_left\n\twalk_fast_down\n\tdelay_8\n\tset_invisible\n\tstep_end\n\nSevenIsland_House_Room1_EventScript_AlreadyShownPerson::\n\tmsgbox SevenIsland_House_Room1_Text_AlreadyShownPerson\n\tgoto SevenIsland_House_Room1_EventScript_ShowingFameChecker\n\nSevenIsland_House_Room1_EventScript_AlreadyUnlockedBasement::\n\tmsgbox SevenIsland_House_Room1_Text_InviteBasementOpen\n\tgoto SevenIsland_House_Room1_SendOutSpearow\n\nSevenIsland_House_Room1_EventScript_SpearowLeftAlreadyUnlockedBasement::\n\tsetvar TYPE, SET_SPEAROW_STATE\n\tcallnative UseBattleHouseVar\n\tsetvar TYPE, SET_TOLD_FAMECHECKER\n\t@ ARGUMENT already set\n\tcallnative UseBattleHouseVar\n\tmsgbox SevenIsland_House_Room1_Text_TakeTime\n\trelease\n\tend\n\nSevenIsland_House_Room1_EventScript_SpearowGone::\n\tmsgbox SevenIsland_House_Room1_Text_SpearowNotBackYet\n\trelease\n\tend\n\nSevenIsland_House_Room1_EventScript_Spearow::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_SPEAROW, 0\n\tmsgbox SevenIsland_House_Room1_Text_Spearow\n\twaitmoncry\n\trelease\n\tend\n\nSevenIsland_House_Room1_EventScript_OldWomanBasementOpen::\n\tsetvar TYPE, CHECK_ALL_TOLD\n\tcallnative UseBattleHouseVar\n\tcopyvar VAR_0x8000, VAR_RESULT\n\tsetvar TYPE, CHECK_ANY_VISITORS\n\tcallnative UseBattleHouseVar\n\tgoto_if_ge VAR_0x8000, 7, SevenIsland_House_Room1_EventScript_OldWomanToldAll\n\tgoto_if_eq VAR_RESULT, 0, SevenIsland_House_Room1_EventScript_OldWomanNoVisitors\n\tgoto_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_OldWomanOneVisitor\n\tswitch VAR_RESULT\n\tcase 2, SevenIsland_House_Room1_EventScript_Buffer2\n\tcase 3, SevenIsland_House_Room1_EventScript_Buffer3\n\tcase 4, SevenIsland_House_Room1_EventScript_Buffer4\n\tcase 5, SevenIsland_House_Room1_EventScript_Buffer5\n\tcase 6, SevenIsland_House_Room1_EventScript_Buffer6\n\tcase 7, SevenIsland_House_Room1_EventScript_Buffer7\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors\n\nSevenIsland_House_Room1_EventScript_OldWomanNoVisitors::\n\tmsgbox SevenIsland_House_Room1_Text_OldWomanNoVisitors\n\tgoto SevenIsland_House_Room1_EventScript_ShowFameCheckerQuestion\n\tend\n\nSevenIsland_House_Room1_EventScript_OldWomanOneVisitor::\n\tmsgbox SevenIsland_House_Room1_Text_OldWomanOneVisitor\n\tgoto SevenIsland_House_Room1_EventScript_ShowFameCheckerQuestion\n\tend\n\nSevenIsland_House_Room1_EventScript_OldWomanMultiVisitors::\n\tmsgbox SevenIsland_House_Room1_Text_OldWomanMultiVisitors\n\tgoto SevenIsland_House_Room1_EventScript_ShowFameCheckerQuestion\n\tend\n\nSevenIsland_House_Room1_EventScript_ShowFameCheckerQuestion::\n\ttextcolor 3\n\tmsgbox SevenIsland_House_Room1_Text_ShowFameChecker, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, SevenIsland_House_Room1_EventScript_ShowingFameChecker\n\ttextcolor 1\n\tmsgbox SevenIsland_House_Room1_Text_NoShowFameChecker2\n\trelease\n\tend\n\nSevenIsland_House_Room1_EventScript_OldWomanToldAll::\n\tgoto_if_eq VAR_RESULT, 0, SevenIsland_House_Room1_EventScript_OldWomanToldAllNoVisitors\n\tgoto_if_eq VAR_RESULT, 1, SevenIsland_House_Room1_EventScript_OldWomanToldAllOneVisitor\n\tswitch VAR_RESULT\n\tcase 2, SevenIsland_House_Room1_EventScript_Buffer2All\n\tcase 3, SevenIsland_House_Room1_EventScript_Buffer3All\n\tcase 4, SevenIsland_House_Room1_EventScript_Buffer4All\n\tcase 5, SevenIsland_House_Room1_EventScript_Buffer5All\n\tcase 6, SevenIsland_House_Room1_EventScript_Buffer6All\n\tcase 7, SevenIsland_House_Room1_EventScript_Buffer7All\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors\n\nSevenIsland_House_Room1_EventScript_OldWomanToldAllNoVisitors::\n\tmsgbox SevenIsland_House_Room1_Text_OldWomanToldAllNoVisitors\n\trelease\n\tend\n\nSevenIsland_House_Room1_EventScript_OldWomanToldAllOneVisitor::\n\tmsgbox SevenIsland_House_Room1_Text_OldWomanToldAllOneVisitor\n\trelease\n\tend\n\nSevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors::\n\tmsgbox SevenIsland_House_Room1_Text_OldWomanToldAllMultiVisitors\n\trelease\n\tend\n\nSevenIsland_House_Room1_EventScript_Buffer2::\n\tbufferstring 1, SevenIsland_House_Room1_Text_Two\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors\n\nSevenIsland_House_Room1_EventScript_Buffer3::\n\tbufferstring 1, SevenIsland_House_Room1_Text_Three\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors\n\nSevenIsland_House_Room1_EventScript_Buffer4::\n\tbufferstring 1, SevenIsland_House_Room1_Text_Four\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors\n\nSevenIsland_House_Room1_EventScript_Buffer5::\n\tbufferstring 1, SevenIsland_House_Room1_Text_Five\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors\n\nSevenIsland_House_Room1_EventScript_Buffer6::\n\tbufferstring 1, SevenIsland_House_Room1_Text_Six\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors\n\nSevenIsland_House_Room1_EventScript_Buffer7::\n\tbufferstring 1, SevenIsland_House_Room1_Text_Seven\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanMultiVisitors\n\nSevenIsland_House_Room1_EventScript_Buffer2All::\n\tbufferstring 1, SevenIsland_House_Room1_Text_Two\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors\n\nSevenIsland_House_Room1_EventScript_Buffer3All::\n\tbufferstring 1, SevenIsland_House_Room1_Text_Three\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors\n\nSevenIsland_House_Room1_EventScript_Buffer4All::\n\tbufferstring 1, SevenIsland_House_Room1_Text_Four\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors\n\nSevenIsland_House_Room1_EventScript_Buffer5All::\n\tbufferstring 1, SevenIsland_House_Room1_Text_Five\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors\n\nSevenIsland_House_Room1_EventScript_Buffer6All::\n\tbufferstring 1, SevenIsland_House_Room1_Text_Six\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors\n\nSevenIsland_House_Room1_EventScript_Buffer7All::\n\tbufferstring 1, SevenIsland_House_Room1_Text_Seven\n\tgoto SevenIsland_House_Room1_EventScript_OldWomanToldAllMultiVisitors\n\nSevenIsland_House_Room1_EventScript_Box::\n\tmsgbox SevenIsland_House_Room1_Text_SlightBreezeAroundBox, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_House_Room1/text.inc",
    "content": "SevenIsland_House_Room1_Text_OnlyEnjoymentWatchingBattles::\n    .string \"I may not look like much now,\\n\"\n    .string \"but when I was younger…\\p\"\n    .string \"I flew everywhere, challenging\\n\"\n    .string \"TRAINERS wherever I found them.\\p\"\n    .string \"Now, my only source of enjoyment\\n\"\n    .string \"is reminiscing about the past while\\l\"\n    .string \"watching tough TRAINERS battle.\\p\"\n    .string \"Wait, those BADGES…\\n\"\n    .string \"You've beaten the GYMS of KANTO?\\l\"\n    .string \"Funny, you don't look like much.\\p\"\n    .string \"But, then, you must know many\\n\"\n    .string \"tough TRAINERS from your travels.\\p\"\n    .string \"Can you stay a while and tell\\n\"\n    .string \"a bored old woman about them?$\"\n\nSevenIsland_House_Room1_Text_ShowFameChecker::\n    .string \"Show her the FAME CHECKER?$\"\n\nSevenIsland_House_Room1_Text_NoShowFameChecker::\n    .string \"I see…\\n\"\n    .string \"Well, go on with your travels then…$\"\n\nSevenIsland_House_Room1_Text_ManyTrainersWhich::\n    .string \"There are many TRAINERS in here.\\n\"\n    .string \"Who do you want to tell me about?$\"\n\nSevenIsland_House_Room1_Text_NotFullFamecheckerForPerson::\n    .string \"Hmm… {STR_VAR_1}…?\\p\"\n    .string \"There's not enough information on\\n\"\n    .string \"{STR_VAR_1} for me to be able to\\l\"\n    .string \"truly tell how {STR_VAR_2} battles.\\p\"\n    .string \"Maybe once you've gathered more\\n\"\n    .string \"knowledge, you can show me again.$\"\n\nSevenIsland_House_Room1_Text_FullFamecheckerForPerson::\n    .string \"…!\\p\"\n    .string \"Yes, {STR_VAR_1} seems like exactly\\n\"\n    .string \"the type of battler I like to watch.$\"\n\nSevenIsland_House_Room1_Text_FirstFullFamecheckerPerson::\n    .string \"Let me tell you something. There's\\n\"\n    .string \"a hidden room in the basement.\\p\"\n    .string \"I once trained my POKéMON there and\\n\"\n    .string \"invited others down to battle too.\\p\"\n    .string \"I think I'm going to reopen the\\n\"\n    .string \"basement room and invite {STR_VAR_1}\\l\"\n    .string \"here to train.$\"\n\nSevenIsland_House_Room1_Text_CallSpearow::\n    .string \"SPEAROW!\\n\"\n    .string \"Come here please!$\"\n\nSevenIsland_House_Room1_Text_DeliverToLeader::\n    .string \"Take this invitation to {STR_VAR_1}\\n\"\n    .string \"in the {STR_VAR_3} GYM!$\"\n\nSevenIsland_House_Room1_Text_FirstTakeTime::\n    .string \"It'll take time for SPEAROW\\n\"\n    .string \"to return with a reply.\\p\"\n    .string \"You don't have to wait here\\n\"\n    .string \"with me. Come back later.\\p\"\n    .string \"In the mean time, I'll start\\n\"\n    .string \"renovating the basement.$\"\n\nSevenIsland_House_Room1_Text_TakeTime::\n    .string \"It'll take time for SPEAROW\\n\"\n    .string \"to return with a reply.\\p\"\n    .string \"You don't have to wait here\\n\"\n    .string \"with me. Come back later.$\"\n\nSevenIsland_House_Room1_Text_AlreadyShownPerson::\n    .string \"{STR_VAR_1}?\\p\"\n    .string \"We've already invited {STR_VAR_1}\\n\"\n    .string \"to train here with us.$\"\n\nSevenIsland_House_Room1_Text_SpearowNotBackYet::\n    .string \"SPEAROW hasn't come back yet.\\n\"\n    .string \"We'll have to wait a little longer\\l\"\n    .string \"for the reply to our invitation.$\"\n\nSevenIsland_House_Room1_Text_InviteBasementOpen::\n    .string \"I'm going to pen an invitation to\\n\"\n    .string \"{STR_VAR_1} and send it right now!$\"\n\nSevenIsland_House_Room1_Text_HeString::\n    .string \"he$\"\n\nSevenIsland_House_Room1_Text_SheString::\n    .string \"she$\"\n\nSevenIsland_House_Room1_Text_Spearow::\n    .string \"SPEAROW: Tetweet!$\"\n\nSevenIsland_House_Room1_Text_SlightBreezeAroundBox::\n    .string \"There is a slight breeze blowing\\n\"\n    .string \"around the box.$\"\n\nSevenIsland_House_Room1_Text_OldWomanNoVisitors::\n    .string \"Hello, {PLAYER}.\\n\"\n    .string \"Have you come to train?\\p\"\n    .string \"Right now no one is visiting\\n\"\n    .string \"in the basement, but if you've\\l\"\n    .string \"learned about more tough TRAINERS,\\l\"\n    .string \"I'd like to hear about them!$\"\n\nSevenIsland_House_Room1_Text_OldWomanOneVisitor::\n    .string \"Hello, {PLAYER}.\\n\"\n    .string \"Have you come to train?\\p\"\n    .string \"Right now {STR_VAR_1} is visiting\\n\"\n    .string \"in the basement.\\p\"\n    .string \"Or have you learned about\\n\"\n    .string \"more tough TRAINERS?$\"\n\nSevenIsland_House_Room1_Text_OldWomanMultiVisitors::\n    .string \"Hello, {PLAYER}.\\n\"\n    .string \"Have you come to train?\\p\"\n    .string \"Right now {STR_VAR_2} TRAINERS are\\n\"\n    .string \"visiting in the basement.\\p\"\n    .string \"Or have you learned about\\n\"\n    .string \"more tough TRAINERS?$\"\n\nSevenIsland_House_Room1_Text_OldWomanToldAllNoVisitors::\n    .string \"Hello, {PLAYER}.\\n\"\n    .string \"Have you come to train?\\p\"\n    .string \"Right now no one is visiting\\n\"\n    .string \"in the basement.\\p\"\n    .string \"Despite that, my heart is filled\\n\"\n    .string \"with joy at the battles I've\\l\"\n    .string \"watched thanks to you.$\"\n\nSevenIsland_House_Room1_Text_OldWomanToldAllOneVisitor::\n    .string \"Hello, {PLAYER}.\\n\"\n    .string \"Have you come to train?\\p\"\n    .string \"Right now {STR_VAR_1} is visiting\\n\"\n    .string \"in the basement.\\p\"\n    .string \"I can't thank you enough for\\n\"\n    .string \"filling my life with the joy of\\l\"\n    .string \"watching great battles again.$\"\n\nSevenIsland_House_Room1_Text_OldWomanToldAllMultiVisitors::\n    .string \"Hello, {PLAYER}.\\n\"\n    .string \"Have you come to train?\\p\"\n    .string \"Right now {STR_VAR_2} TRAINERS are\\n\"\n    .string \"visiting in the basement.\\p\"\n    .string \"I can't thank you enough for\\n\"\n    .string \"filling my life with the joy of\\l\"\n    .string \"watching great battles again.$\"\n\nSevenIsland_House_Room1_Text_NoShowFameChecker2::\n    .string \"Okay, {PLAYER}, let me know\\n\"\n    .string \"when you've learned more.$\"\n\nSevenIsland_House_Room1_Text_Two::\n    .string \"two$\"\n\nSevenIsland_House_Room1_Text_Three::\n    .string \"three$\"\n\nSevenIsland_House_Room1_Text_Four::\n    .string \"four$\"\n\nSevenIsland_House_Room1_Text_Five::\n    .string \"five$\"\n\nSevenIsland_House_Room1_Text_Six::\n    .string \"six$\"\n\nSevenIsland_House_Room1_Text_Seven::\n    .string \"seven$\"\n"
  },
  {
    "path": "data/maps/SevenIsland_House_Room2/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_HOUSE_ROOM2\",\n  \"name\": \"SevenIsland_House_Room2\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_HOUSE_ROOM2\",\n  \"music\": \"MUS_SEVII_67\",\n  \"region_map_section\": \"MAPSEC_SEVEN_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_GYM\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BROCK\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_House_Room2_Eventscript_Brock\",\n      \"flag\": \"FLAG_TEMP_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MISTY\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_House_Room2_Eventscript_Misty\",\n      \"flag\": \"FLAG_TEMP_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LT_SURGE\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_IN_PLACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_House_Room2_Eventscript_LtSurge\",\n      \"flag\": \"FLAG_TEMP_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ERIKA\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_House_Room2_Eventscript_Erika\",\n      \"flag\": \"FLAG_TEMP_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_KOGA\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_House_Room2_Eventscript_Koga\",\n      \"flag\": \"FLAG_TEMP_5\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SABRINA\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_House_Room2_Eventscript_Sabrina\",\n      \"flag\": \"FLAG_TEMP_6\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLAINE\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_House_Room2_Eventscript_Blaine\",\n      \"flag\": \"FLAG_TEMP_7\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_HOUSE_ROOM1\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"SevenIsland_House_Room2_Eventscript_Trigger\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SevenIsland_House_Room2_EventScript_LeftPainting\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SevenIsland_House_Room2_EventScript_MiddlePainting\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SevenIsland_House_Room2_EventScript_MiddlePainting\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SevenIsland_House_Room2_EventScript_RightPainting\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_EAST\",\n      \"script\": \"SevenIsland_House_Room2_EventScript_HealingMachine\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_House_Room2/scripts.inc",
    "content": ".equ LOCALID_BROCK, 1\n.equ LOCALID_MISTY, 2\n.equ LOCALID_LT_SURGE, 3\n.equ LOCALID_ERIKA, 4\n.equ LOCALID_KOGA, 5\n.equ LOCALID_SABRINA, 6\n.equ LOCALID_BLAINE, 7\n\n.equ SET_SPEAROW_STATE, 0\n.equ SET_TOLD_FAMECHECKER, 1\n.equ SET_VISITOR_STATE, 2\n.equ SET_LEVEL_GROWTH, 3\n.equ CHECK_SPEAROW_STATE, 4\n.equ CHECK_TOLD_FAMECHECKER, 5\n.equ CHECK_VISITOR_STATE, 6\n.equ CHECK_LEVEL_GROWTH, 7\n.equ SET_BOXES_MOVED, 8\n.equ CHECK_BOXES_MOVED, 9\n\n.equ TYPE, VAR_TEMP_3\n.equ ARGUMENT, VAR_TEMP_4\n.equ LEADER_READY, VAR_TEMP_6\n.equ X_COORD, VAR_TEMP_7\n.equ Y_COORD, VAR_TEMP_8\n\nSevenIsland_House_Room2_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_House_Room2_OnTransition\n\t.byte 0\n\nSevenIsland_House_Room2_OnTransition::\n\tsetvar TYPE, CHECK_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_BROCK\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideBrock\n\tsetvar ARGUMENT, FAMECHECKER_MISTY\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideMisty\n\tsetvar ARGUMENT, FAMECHECKER_LTSURGE\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideLtSurge\n\tsetvar ARGUMENT, FAMECHECKER_ERIKA\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideErika\n\tsetvar ARGUMENT, FAMECHECKER_KOGA\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideKoga\n\tsetvar ARGUMENT, FAMECHECKER_SABRINA\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideSabrina\n\tsetvar ARGUMENT, FAMECHECKER_BLAINE\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 0, SevenIsland_House_Room2_HideBlaine\n\tend\n\nSevenIsland_House_Room2_HideBrock::\n\tsetflag FLAG_TEMP_1\n\treturn\n\nSevenIsland_House_Room2_HideMisty::\n\tsetflag FLAG_TEMP_2\n\treturn\n\nSevenIsland_House_Room2_HideLtSurge::\n\tsetflag FLAG_TEMP_3\n\treturn\n\nSevenIsland_House_Room2_HideErika::\n\tsetflag FLAG_TEMP_4\n\treturn\n\nSevenIsland_House_Room2_HideKoga::\n\tsetflag FLAG_TEMP_5\n\treturn\n\nSevenIsland_House_Room2_HideSabrina::\n\tsetflag FLAG_TEMP_6\n\treturn\n\nSevenIsland_House_Room2_HideBlaine::\n\tsetflag FLAG_TEMP_7\n\treturn\t\n\t\nSevenIsland_House_Room2_EventScript_LeftPainting::\n\tmsgbox SevenIsland_House_Room2_Text_LeftPainting, MSGBOX_SIGN\n\tend\n\nSevenIsland_House_Room2_Text_LeftPainting::\n\t.string \"It's a photo of a young woman.\\n\"\n\t.string \"She's surrounded by happy,\\l\"\n\t.string \"strong-looking POKéMON.$\"\n\nSevenIsland_House_Room2_EventScript_MiddlePainting::\n\tmsgbox SevenIsland_House_Room2_Text_MiddlePainting, MSGBOX_SIGN\n\tend\n\nSevenIsland_House_Room2_Text_MiddlePainting::\n\t.string \"It's a photo of a young woman.\\n\"\n\t.string \"A SPEAROW perches on her arm.$\"\n\nSevenIsland_House_Room2_EventScript_RightPainting::\n\tcall_if_eq VAR_STARTER_MON, 0, SevenIsland_House_Room2_EventScript_BufferBulbasaur\n\tcall_if_eq VAR_STARTER_MON, 1, SevenIsland_House_Room2_EventScript_BufferSquirtle\n\tcall_if_ge VAR_STARTER_MON, 2, SevenIsland_House_Room2_EventScript_BufferCharmander\n\tmsgbox SevenIsland_House_Room2_Text_RightPainting, MSGBOX_SIGN\n\tend\n\nSevenIsland_House_Room2_Text_RightPainting::\n\t.string \"It's a photo of a TRAINER battle.\\p\"\n\t.string \"A young woman is ordering her\\n\"\n\t.string \"{STR_VAR_1} to attack an opposing\\l\"\n\t.string \"{STR_VAR_2}.\\p\"\n\t.string \"A SPEAROW hovers above the battle,\\n\"\n\t.string \"watching intently.$\"\n\nSevenIsland_House_Room2_EventScript_BufferBulbasaur::\n\tbufferspeciesname STR_VAR_1, SPECIES_VENUSAUR\n\tbufferspeciesname STR_VAR_2, SPECIES_CHARIZARD\n\treturn\n\nSevenIsland_House_Room2_EventScript_BufferSquirtle::\n\tbufferspeciesname STR_VAR_1, SPECIES_BLASTOISE\n\tbufferspeciesname STR_VAR_2, SPECIES_VENUSAUR\n\treturn\n\nSevenIsland_House_Room2_EventScript_BufferCharmander::\n\tbufferspeciesname STR_VAR_1, SPECIES_CHARIZARD\n\tbufferspeciesname STR_VAR_2, SPECIES_BLASTOISE\n\treturn\n\nSevenIsland_House_Room2_EventScript_HealingMachine::\n\tmsgbox SevenIsland_House_Room2_Text_HealPokemon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, SevenIsland_House_Room2_EventScript_HealPokemon\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_HealPokemon::\n\t.string \"Use the machine to heal\\n\"\n\t.string \"your POKéMON?$\"\n\nSevenIsland_House_Room2_EventScript_HealPokemon::\n\trelease\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tdelay 24\n\tdofieldeffect FLDEFF_POKECENTER_HEAL\n\twaitfieldeffect FLDEFF_POKECENTER_HEAL\n\tspecial HealPlayerParty\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_Trigger::\n\tgoto_if_eq LEADER_READY, 0, EventScript_ReleaseEnd\n\tapplymovement OBJ_EVENT_ID_PLAYER, SevenIsland_House_Room2_Movement_StepFastestRight\n\twaitmovement 0\n\tswitch LEADER_READY\n\tcase LOCALID_BROCK, SevenIsland_House_Room2_Eventscript_BrockBattle\n\tcase LOCALID_MISTY, SevenIsland_House_Room2_Eventscript_MistyBattle\n\tcase LOCALID_LT_SURGE, SevenIsland_House_Room2_Eventscript_LtSurgeBattle\n\tcase LOCALID_ERIKA, SevenIsland_House_Room2_Eventscript_ErikaBattle\n\tcase LOCALID_KOGA, SevenIsland_House_Room2_Eventscript_KogaBattle\n\tcase LOCALID_SABRINA, SevenIsland_House_Room2_Eventscript_SabrinaBattle\n\tcase LOCALID_BLAINE, SevenIsland_House_Room2_Eventscript_BlaineBattle\n\trelease\n\tend\n\n@ LEADER BROCK\nSevenIsland_House_Room2_Eventscript_Brock::\n\tlock\n\tfaceplayer\n\tgoto_if_eq LEADER_READY, 1, SevenIsland_House_Room2_Eventscript_BrockReady\n\tgoto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_BrockOtherLeaderReady\n\tmsgbox SevenIsland_House_Room2_Text_Brock_Intro, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_BrockDeclined\n\tclosemessage\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq Y_COORD, 6, SevenIsland_House_Room2_Eventscript_MoveBrockDown\n\tcall_if_ne Y_COORD, 6, SevenIsland_House_Room2_Eventscript_MoveBrockLeft\n\tapplymovement LOCALID_BROCK, SevenIsland_House_Room2_Movement_BrockToMat\n\twaitmovement 0\n\tsetobjectxyperm LOCALID_BROCK, 7, 5\n\tsetobjectmovementtypeinstant LOCALID_BROCK, MOVEMENT_TYPE_FACE_LEFT\n\tsetvar LEADER_READY, LOCALID_BROCK\n\tmsgbox SevenIsland_House_Room2_Text_BrockSquareUp, MSGBOX_DEFAULT \n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_Brock_Intro:\n\t.string \"BROCK: …You sure look different\\n\"\n\t.string \"from when we first met!\\p\"\n\t.string \"I have a request for you, since\\n\"\n\t.string \"you're now the CHAMPION.\\p\"\n\t.string \"The truth is, GYM LEADERS have a\\n\"\n\t.string \"right to challenge the CHAMPION!\\p\"\n\t.string \"…Please allow me the privilege of\\n\"\n\t.string \"facing you in battle once again!\\p\"\n\t.string \"Allow me to show you the true\\n\"\n\t.string \"rock-hard strength of my POKéMON!$\"\n\nSevenIsland_House_Room2_Text_BrockSquareUp:\n\t.string \"BROCK: Take your place and we'll\\n\"\n\t.string \"start our battle!$\"\n\nSevenIsland_House_Room2_Eventscript_BrockReady:\n\tmsgbox SevenIsland_House_Room2_Text_BrockSquareUp, MSGBOX_DEFAULT\n\trelease\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront\n\tapplymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_BrockOtherLeaderReady:\n\tmsgbox SevenIsland_House_Room2_Text_BrockOtherLeader, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_BrockOtherLeader:\n\t.string \"BROCK: Don't underestimate the other\\n\"\n\t.string \"GYM LEADERS, {PLAYER}.\\p\"\n\t.string \"We'll use our best POKéMON against\\n\"\n\t.string \"the POKéMON LEAGUE CHAMPION!$\"\n\nSevenIsland_House_Room2_Eventscript_BrockDeclined::\n\tmsgbox SevenIsland_House_Room2_Text_Brock_Declined, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_Brock_Declined:\n\t.string \"I guess my POKéMON and I will keep\\n\"\n\t.string \"training to stay rock-hard and tough!$\"\n\nSevenIsland_House_Room2_Eventscript_MoveBrockDown:\n\tapplymovement LOCALID_BROCK, SevenIsland_House_Room2_Movement_BrockAroundPlayer\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Eventscript_MoveBrockLeft:\n\tapplymovement LOCALID_BROCK, SevenIsland_House_Room2_Movement_BrockRight\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Movement_BrockAroundPlayer:\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_up\n\tstep_end\n\nSevenIsland_House_Room2_Movement_BrockRight:\n\twalk_right\n\twalk_right\n\tstep_end\n\nSevenIsland_House_Room2_Movement_BrockToMat:\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_up\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Eventscript_BrockBattle:\n\tsetvar TYPE, SET_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_BROCK\n\tcallnative UseBattleHouseVar\n\tapplymovement LOCALID_BROCK, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 0\n\tmsgbox SevenIsland_House_Room2_Text_BrockBeforeBattle, MSGBOX_DEFAULT\n\trelease\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeBrockBattle\n\ttrainerbattle_no_intro TRAINER_BROCK_REMATCH, SevenIsland_House_Room2_Text_BrockLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_BrockExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_BrockBeforeBattle:\n\t.string \"BROCK: No matter what kind of\\n\"\n\t.string \"opponent you may be, my ROCK-type\\l\"\n\t.string \"POKéMON will take you on!\\p\"\n\t.string \"That's the promise of my\\n\"\n\t.string \"rock-hard will!$\"\n\nSevenIsland_House_Room2_Text_BrockLoss:\n\t.string \"BROCK: I knew you were strong,\\n\"\n\t.string \"but this…$\"\n\nSevenIsland_House_Room2_Eventscript_ChallengeBrockBattle:\n\ttrainerbattle_no_intro TRAINER_BROCK_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_BrockLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_BrockExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_BrockExit:\n\tapplymovement LOCALID_BROCK, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 0\n\tmsgbox SevenIsland_House_Room2_Text_BrockExit, MSGBOX_DEFAULT\n\trelease\n\tapplymovement LOCALID_BROCK, SevenIsland_House_Room2_Movement_LeaderExits\n\twaitmovement 0\n\tplayse SE_EXIT\n\tsetvar LEADER_READY, 0\n\tremoveobject LOCALID_BROCK\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_BrockExit:\n\t.string \"BROCK: I have other ambitions that\\n\"\n\t.string \"I've chosen to postpone for a bit.\\p\"\n\t.string \"Right now I'm more interested in\\n\"\n\t.string \"training to grow strong enough to\\l\"\n\t.string \"one day face and defeat you!\\p\"\n\t.string \"I should be getting back to my GYM.\\n\"\n\t.string \"I look forward to our next battle.$\"\n\n@ LEADER MISTY\nSevenIsland_House_Room2_Eventscript_Misty::\n\tlock\n\tfaceplayer\n\tgoto_if_eq LEADER_READY, 2, SevenIsland_House_Room2_Eventscript_MistyReady\n\tgoto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_MistyOtherLeaderReady\n\tmsgbox SevenIsland_House_Room2_Text_Misty_Intro, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_MistyDeclined\n\tclosemessage\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq Y_COORD, 3, SevenIsland_House_Room2_Eventscript_MoveMistyRight\n\tcall_if_ne Y_COORD, 3, SevenIsland_House_Room2_Eventscript_MoveMistyDown\n\tsetobjectxyperm LOCALID_MISTY, 7, 5\n\tsetobjectmovementtypeinstant LOCALID_MISTY, MOVEMENT_TYPE_FACE_LEFT\n\tsetvar LEADER_READY, LOCALID_MISTY\n\tmsgbox SevenIsland_House_Room2_Text_MistySquareUp, MSGBOX_DEFAULT \n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_Misty_Intro:\n\t.string \"MISTY: I heard an interesting\\n\"\n\t.string \"rumor!\\p\"\n\t.string \"Not only did you defeat those\\n\"\n\t.string \"TEAM ROCKET guys, but you battled\\l\"\n\t.string \"that other kid from PALLET TOWN\\l\"\n\t.string \"to become the CHAMPION!\\p\"\n\t.string \"Argh!\\n\"\n\t.string \"I just can't take it any more!\\p\"\n\t.string \"I just absolutely have to battle\\n\"\n\t.string \"you again!\\l\"\n\t.string \"You got that? No refusing!$\"\n\nSevenIsland_House_Room2_Text_MistySquareUp:\n\t.string \"MISTY: Stand opposite me and\\n\"\n\t.string \"we'll get started!$\"\n\nSevenIsland_House_Room2_Eventscript_MistyReady:\n\tmsgbox SevenIsland_House_Room2_Text_MistySquareUp, MSGBOX_DEFAULT\n\trelease\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront\n\tapplymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_MistyOtherLeaderReady:\n\tmsgbox SevenIsland_House_Room2_Text_MistyOtherLeader, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_MistyOtherLeader:\n\t.string \"MISTY: The lady upstairs isn't the\\n\"\n\t.string \"only one who likes seeing battles.\\p\"\n\t.string \"I hope you'll use a WATER-type\\n\"\n\t.string \"so I can see how you handle them!$\"\n\nSevenIsland_House_Room2_Eventscript_MistyDeclined::\n\tmsgbox SevenIsland_House_Room2_Text_Misty_Declined, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_Misty_Declined:\n\t.string \"But I said no refusing!\\n\"\n\t.string \"Argh, fine…\\p\"\n\t.string \"My new policy on POKéMON is to\\n\"\n\t.string \"train hard to defeat you!\\p\"\n\t.string \"When we finally have our rematch,\\n\"\n\t.string \"we'll overwhelm you!$\"\n\nSevenIsland_House_Room2_Eventscript_MoveMistyRight:\n\tapplymovement LOCALID_MISTY, SevenIsland_House_Room2_Movement_MistyAroundPlayer\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Eventscript_MoveMistyDown:\n\tapplymovement LOCALID_MISTY, SevenIsland_House_Room2_Movement_MistyDownToMat\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Movement_MistyAroundPlayer:\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Movement_MistyDownToMat:\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Eventscript_MistyBattle:\n\tsetvar TYPE, SET_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_MISTY\n\tcallnative UseBattleHouseVar\n\tapplymovement LOCALID_MISTY, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 1\n\tmsgbox SevenIsland_House_Room2_Text_MistyBeforeBattle, MSGBOX_DEFAULT\n\trelease\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeMistyBattle\n\ttrainerbattle_no_intro TRAINER_MISTY_REMATCH, SevenIsland_House_Room2_Text_MistyLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_MistyExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_MistyBeforeBattle:\n\t.string \"MISTY: My adorable POKéMON are\\n\"\n\t.string \"ready to take you on!\\p\"\n\t.string \"The ultimate offense of WATER-type\\n\"\n\t.string \"POKéMON! I hope you're ready!$\"\n\nSevenIsland_House_Room2_Text_MistyLoss:\n\t.string \"MISTY: Hmph!\\nHow annoying!$\"\n\nSevenIsland_House_Room2_Eventscript_ChallengeMistyBattle:\n\ttrainerbattle_no_intro TRAINER_MISTY_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_MistyLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_MistyExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_MistyExit:\n\tapplymovement LOCALID_MISTY, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 1\n\tmsgbox SevenIsland_House_Room2_Text_MistyExit, MSGBOX_DEFAULT\n\trelease\n\tapplymovement LOCALID_MISTY, SevenIsland_House_Room2_Movement_LeaderExits\n\twaitmovement 0\n\tplayse SE_EXIT\n\tsetvar LEADER_READY, 0\n\tremoveobject LOCALID_MISTY\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_MistyExit:\n\t.string \"MISTY: I lost…\\p\"\n\t.string \"I need to try swimming around in my\\n\"\n\t.string \"GYM for a bit so that I can clear\\l\"\n\t.string \"my head of these feelings.\\p\"\n\t.string \"…I definitely won't lose next time!$\"\n\n@ LEADER LTSURGE\nSevenIsland_House_Room2_Eventscript_LtSurge::\n\tlock\n\tfaceplayer\n\tgoto_if_eq LEADER_READY, 3, SevenIsland_House_Room2_Eventscript_LtSurgeReady\n\tgoto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_LtSurgeOtherLeaderReady\n\tmsgbox SevenIsland_House_Room2_Text_LtSurge_Intro, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_LtSurgeDeclined\n\tclosemessage\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq Y_COORD, 5, SevenIsland_House_Room2_Eventscript_MoveLtSurgeLeft\n\tcall_if_ne Y_COORD, 5, SevenIsland_House_Room2_Eventscript_MoveLtSurgeDown\n\tsetobjectxyperm LOCALID_LT_SURGE, 7, 5\n\tsetobjectmovementtypeinstant LOCALID_LT_SURGE, MOVEMENT_TYPE_FACE_LEFT\n\tsetvar LEADER_READY, LOCALID_LT_SURGE\n\tmsgbox SevenIsland_House_Room2_Text_LtSurgeSquareUp, MSGBOX_DEFAULT \n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_LtSurge_Intro:\n\t.string \"LT. SURGE: Hey there, kid!\\p\"\n\t.string \"Pretty shocking you made it through\\n\"\n\t.string \"the POKéMON LEAGUE!\\p\"\n\t.string \"No doubt some ELECTRIC-types\\n\"\n\t.string \"had a hand in that, right?\\p\"\n\t.string \"All right, then.\\p\"\n\t.string \"How about you show me what kind\\n\"\n\t.string \"of POKéMON you've raised?$\"\n\nSevenIsland_House_Room2_Text_LtSurgeSquareUp:\n\t.string \"LT. SURGE: Fall in, soldier!\\n\"\n\t.string \"We'll short your POKéMON out!$\"\n\nSevenIsland_House_Room2_Eventscript_LtSurgeReady:\n\tmsgbox SevenIsland_House_Room2_Text_LtSurgeSquareUp, MSGBOX_DEFAULT\n\trelease\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront\n\tapplymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_LtSurgeOtherLeaderReady:\n\tmsgbox SevenIsland_House_Room2_Text_LtSurgeOtherLeader, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_LtSurgeOtherLeader:\n\t.string \"LT. SURGE: The other GYM LEADERS\\n\"\n\t.string \"may not have the discipline that\\l\"\n\t.string \"I do, but they train just as hard.$\"\n\nSevenIsland_House_Room2_Eventscript_LtSurgeDeclined::\n\tmsgbox SevenIsland_House_Room2_Text_LtSurge_Declined, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_LtSurge_Declined:\n\t.string \"Hahaha!\\n\"\n\t.string \"Afraid we'd fry you?\\p\"\n\t.string \"If you let me keep training my\\n\"\n\t.string \"team, we'll be even harder to beat!$\" \n\nSevenIsland_House_Room2_Eventscript_MoveLtSurgeLeft:\n\tapplymovement LOCALID_LT_SURGE, SevenIsland_House_Room2_Movement_LtSurgeAroundPlayer\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Eventscript_MoveLtSurgeDown:\n\tapplymovement LOCALID_LT_SURGE, SevenIsland_House_Room2_Movement_LtSurgeToMat\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Movement_LtSurgeAroundPlayer:\n\twalk_left\n\twalk_down\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Movement_LtSurgeToMat:\n\twalk_down\n\twalk_left\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Eventscript_LtSurgeBattle:\n\tsetvar TYPE, SET_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_LTSURGE\n\tcallnative UseBattleHouseVar\n\tapplymovement LOCALID_LT_SURGE, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 0\n\tmsgbox SevenIsland_House_Room2_Text_LtSurgeBeforeBattle, MSGBOX_DEFAULT\n\trelease\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeLtSurgeBattle\n\ttrainerbattle_no_intro TRAINER_LT_SURGE_REMATCH, SevenIsland_House_Room2_Text_LtSurgeLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_LtSurgeExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_LtSurgeBeforeBattle:\n\t.string \"LT. SURGE: Trainers like us have\\n\"\n\t.string \"no need for words!\\p\"\n\t.string \"Let's go, kid!$\"\n\nSevenIsland_House_Room2_Text_LtSurgeLoss:\n\t.string \"LT. SURGE: Absolutely shocking!$\"\n\nSevenIsland_House_Room2_Eventscript_ChallengeLtSurgeBattle:\n\ttrainerbattle_no_intro TRAINER_LT_SURGE_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_LtSurgeLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_LtSurgeExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_LtSurgeExit:\n\tapplymovement LOCALID_LT_SURGE, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 0\n\tmsgbox SevenIsland_House_Room2_Text_LtSurgeExit, MSGBOX_DEFAULT\n\trelease\n\tapplymovement LOCALID_LT_SURGE, SevenIsland_House_Room2_Movement_LeaderExits\n\twaitmovement 0\n\tplayse SE_EXIT\n\tsetvar LEADER_READY, 0\n\tremoveobject LOCALID_LT_SURGE\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_LtSurgeExit:\n\t.string \"LT. SURGE: Looks like there's still\\n\"\n\t.string \"a gap between our skill levels that\\l\"\n\t.string \"I need to close, kid!\\p\"\n\t.string \"This is the first time I've felt\\n\"\n\t.string \"like this since I left home!\\p\"\n\t.string \"I have to return to base.\\n\"\n\t.string \"I can't leave my troops without\\l\"\n\t.string \"their CO for long!$\"\n\n@ LEADER ERIKA\nSevenIsland_House_Room2_Eventscript_Erika::\n\tlock\n\tfaceplayer\n\tgoto_if_eq LEADER_READY, 4, SevenIsland_House_Room2_Eventscript_ErikaReady\n\tgoto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_ErikaOtherLeaderReady\n\tmsgbox SevenIsland_House_Room2_Text_Erika_Intro, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_ErikaDeclined\n\tclosemessage\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq Y_COORD, 3, SevenIsland_House_Room2_Eventscript_MoveErikaRight\n\tcall_if_ne Y_COORD, 3, SevenIsland_House_Room2_Eventscript_MoveErikaDown\n\tsetobjectxyperm LOCALID_ERIKA, 7, 5\n\tsetobjectmovementtypeinstant LOCALID_ERIKA, MOVEMENT_TYPE_FACE_LEFT\n\tsetvar LEADER_READY, LOCALID_ERIKA\n\tmsgbox SevenIsland_House_Room2_Text_ErikaSquareUp, MSGBOX_DEFAULT \n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_Erika_Intro:\n\t.string \"ERIKA: Oh, if it isn't the one who's\\n\"\n\t.string \"been trying to fill the POKéDEX.\\p\"\n\t.string \"I hope things have been going well\\n\"\n\t.string \"for you since our last encounter.\\p\"\n\t.string \"…I see. You've certainly been busy.\\n\"\n\t.string \"I'm not particularly fond of those\\l\"\n\t.string \"kinds of public things…\\p\"\n\t.string \"However, battles are different.\\n\"\n\t.string \"That's what you came for, isn't it?$\"\n\nSevenIsland_House_Room2_Text_ErikaSquareUp:\n\t.string \"ERIKA: Plant yourself over there\\n\"\n\t.string \"and we'll begin.$\"\n\nSevenIsland_House_Room2_Eventscript_ErikaReady:\n\tmsgbox SevenIsland_House_Room2_Text_ErikaSquareUp, MSGBOX_DEFAULT\n\trelease\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront\n\tapplymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_ErikaOtherLeaderReady:\n\tmsgbox SevenIsland_House_Room2_Text_ErikaOtherLeader, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_ErikaOtherLeader:\n\t.string \"ERIKA: …Zzz…zzz…\\n\"\n\t.string \"Oh, you're preparing for a battle?$\"\n\nSevenIsland_House_Room2_Eventscript_ErikaDeclined::\n\tmsgbox SevenIsland_House_Room2_Text_Erika_Declined, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_Erika_Declined:\n\t.string \"… … … …$\"\n\nSevenIsland_House_Room2_Eventscript_MoveErikaRight:\n\tapplymovement LOCALID_ERIKA, SevenIsland_House_Room2_Movement_ErikaAroundPlayer\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Eventscript_MoveErikaDown:\n\tapplymovement LOCALID_ERIKA, SevenIsland_House_Room2_Movement_ErikaDownToMat\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Movement_ErikaAroundPlayer:\n\twalk_right\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Movement_ErikaDownToMat:\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Eventscript_ErikaBattle:\n\tsetvar TYPE, SET_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_ERIKA\n\tcallnative UseBattleHouseVar\n\tapplymovement LOCALID_ERIKA, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 1\n\tmsgbox SevenIsland_House_Room2_Text_ErikaBeforeBattle, MSGBOX_DEFAULT\n\trelease\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeErikaBattle\n\ttrainerbattle_no_intro TRAINER_ERIKA_REMATCH, SevenIsland_House_Room2_Text_ErikaLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_ErikaExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_ErikaBeforeBattle:\n\t.string \"ERIKA: I graciously accept your\\n\"\n\t.string \"challenge. I shall not lose!$\"\n\nSevenIsland_House_Room2_Text_ErikaLoss:\n\t.string \"ERIKA: Oh!\\n\"\n\t.string \"It appears it is my loss… … … …$\"\n\nSevenIsland_House_Room2_Eventscript_ChallengeErikaBattle:\n\ttrainerbattle_no_intro TRAINER_ERIKA_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_ErikaLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_ErikaExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_ErikaExit:\n\tapplymovement LOCALID_ERIKA, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 1\n\tmsgbox SevenIsland_House_Room2_Text_ErikaExit, MSGBOX_DEFAULT\n\trelease\n\tapplymovement LOCALID_ERIKA, SevenIsland_House_Room2_Movement_LeaderExits\n\twaitmovement 0\n\tplayse SE_EXIT\n\tsetvar LEADER_READY, 0\n\tremoveobject LOCALID_ERIKA\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_ErikaExit:\n\t.string \"ERIKA: Simply marvelous.\\p\"\n\t.string \"That was an effort worthy of\\n\"\n\t.string \"at least ten RAINBOWBADGES.\\p\"\n\t.string \"I feel inspired by our rematch.\\n\"\n\t.string \"I should return to CELADON and\\l\"\n\t.string \"tend to my flowers.\\p\"\n\t.string \"…Until next time, {PLAYER}.$\"\n\n@ LEADER KOGA\nSevenIsland_House_Room2_Eventscript_Koga::\n\tlock\n\tfaceplayer\n\tgoto_if_eq LEADER_READY, 5, SevenIsland_House_Room2_Eventscript_KogaReady\n\tgoto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_KogaOtherLeaderReady\n\tmsgbox SevenIsland_House_Room2_Text_Koga_Intro, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_KogaDeclined\n\tclosemessage\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq Y_COORD, 7, SevenIsland_House_Room2_Eventscript_MoveKogaRight\n\tcall_if_ne Y_COORD, 7, SevenIsland_House_Room2_Eventscript_MoveKogaUp\n\tsetobjectxyperm LOCALID_KOGA, 7, 5\n\tsetobjectmovementtypeinstant LOCALID_KOGA, MOVEMENT_TYPE_FACE_LEFT\n\tsetvar LEADER_READY, LOCALID_KOGA\n\tmsgbox SevenIsland_House_Room2_Text_KogaSquareUp, MSGBOX_DEFAULT \n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_Koga_Intro:\n\t.string \"KOGA: Fwahahaha!\\n\"\n\t.string \"If it isn't the child.\\p\"\n\t.string \"It seems we are fated to meet\\n\"\n\t.string \"again and again.\\p\"\n\t.string \"You have come at a truly opportune\\n\"\n\t.string \"time; I was just thinking that I\\l\"\n\t.string \"wanted to test my newly-refined\\l\"\n\t.string \"sinister techniques… in a battle\\l\"\n\t.string \"that will end in your utter defeat!\\p\"\n\t.string \"Fwahahaha!\\n\"\n\t.string \"What do you say?$\"\n\nSevenIsland_House_Room2_Text_KogaSquareUp:\n\t.string \"KOGA: Ready yourself, child!$\"\n\nSevenIsland_House_Room2_Eventscript_KogaReady:\n\tmsgbox SevenIsland_House_Room2_Text_KogaSquareUp, MSGBOX_DEFAULT\n\trelease\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront\n\tapplymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_KogaOtherLeaderReady:\n\tmsgbox SevenIsland_House_Room2_Text_KogaOtherLeader, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_KogaOtherLeader:\n\t.string \"KOGA: I should bring my daughter\\n\"\n\t.string \"here to learn from the battle\\l\"\n\t.string \"styles of the other GYM LEADERS.$\"\n\nSevenIsland_House_Room2_Eventscript_KogaDeclined::\n\tmsgbox SevenIsland_House_Room2_Text_Koga_Declined, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_Koga_Declined:\n\t.string \"What? Hmph.\\p\"\n\t.string \"How did you beat the POKéMON\\n\"\n\t.string \"LEAGUE with such little resolve?$\"\n\nSevenIsland_House_Room2_Eventscript_MoveKogaRight:\n\tapplymovement LOCALID_KOGA, SevenIsland_House_Room2_Movement_KogaAroundPlayer\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Eventscript_MoveKogaUp:\n\tapplymovement LOCALID_KOGA, SevenIsland_House_Room2_Movement_KogaToMat\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Movement_KogaAroundPlayer:\n\twalk_right\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_left\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Movement_KogaToMat:\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Eventscript_KogaBattle:\n\tsetvar TYPE, SET_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_KOGA\n\tcallnative UseBattleHouseVar\n\tapplymovement LOCALID_KOGA, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 0\n\tmsgbox SevenIsland_House_Room2_Text_KogaBeforeBattle, MSGBOX_DEFAULT\n\trelease\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeKogaBattle\n\ttrainerbattle_no_intro TRAINER_KOGA_REMATCH, SevenIsland_House_Room2_Text_KogaLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_KogaExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_KogaBeforeBattle:\n\t.string \"KOGA: Fwahahaha!\\p\"\n\t.string \"Today I'll not only defeat you,\\n\"\n\t.string \"but I will also demonstrate my\\l\"\n\t.string \"fatherly dignity to my daughter!$\"\n\nSevenIsland_House_Room2_Text_KogaLoss:\n\t.string \"KOGA: …If I am not strong enough\\n\"\n\t.string \"to defeat you now, there is but\\l\"\n\t.string \"one thing to do.\\p\"\n\t.string \"I must hone my skills.$\"\n\nSevenIsland_House_Room2_Eventscript_ChallengeKogaBattle:\n\ttrainerbattle_no_intro TRAINER_KOGA_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_KogaLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_KogaExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_KogaExit:\n\tapplymovement LOCALID_KOGA, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 0\n\tmsgbox SevenIsland_House_Room2_Text_KogaExit, MSGBOX_DEFAULT\n\trelease\n\tapplymovement LOCALID_KOGA, SevenIsland_House_Room2_Movement_LeaderExits\n\twaitmovement 0\n\tplayse SE_EXIT\n\tsetvar LEADER_READY, 0\n\tremoveobject LOCALID_KOGA\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_KogaExit:\n\t.string \"KOGA: With TRAINERS like you and\\n\"\n\t.string \"{RIVAL}, the POKéMON LEAGUE must\\l\"\n\t.string \"be a place of formidable strength!\\l\"\n\t.string \"It's truly a thing to be proud of!\\p\"\n\t.string \"As it so happens, I have been\\n\"\n\t.string \"thinking of aiming to join the\\l\"\n\t.string \"ELITE FOUR myself…\\p\"\n\t.string \"…But I'll never get there if I\\n\"\n\t.string \"neglect my duties as a GYM LEADER!\\p\"\n\t.string \"I must travel back to FUCHSIA CITY.\\n\"\n\t.string \"Farewell, child.$\"\n\n@ LEADER SABRINA\nSevenIsland_House_Room2_Eventscript_Sabrina::\n\tlock\n\tfaceplayer\n\tgoto_if_eq LEADER_READY, 6, SevenIsland_House_Room2_Eventscript_SabrinaReady\n\tgoto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_SabrinaOtherLeaderReady\n\tmsgbox SevenIsland_House_Room2_Text_Sabrina_Intro, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_SabrinaDeclined\n\tclosemessage\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq Y_COORD, 6, SevenIsland_House_Room2_Eventscript_MoveSabrinaRight\n\tcall_if_ne Y_COORD, 6, SevenIsland_House_Room2_Eventscript_MoveSabrinaUp\n\tsetobjectxyperm LOCALID_SABRINA, 7, 5\n\tsetobjectmovementtypeinstant LOCALID_SABRINA, MOVEMENT_TYPE_FACE_LEFT\n\tsetvar LEADER_READY, LOCALID_SABRINA\n\tmsgbox SevenIsland_House_Room2_Text_SabrinaSquareUp, MSGBOX_DEFAULT \n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_Sabrina_Intro:\n\t.string \"SABRINA: …It's true that psychic\\n\"\n\t.string \"power is a potent ability.\\p\"\n\t.string \"However, some things cannot be\\n\"\n\t.string \"overcome with that power alone.\\p\"\n\t.string \"I finally understand that now, after\\n\"\n\t.string \"losing to you in our last battle.\\p\"\n\t.string \"I won't be relying on just psychic\\n\"\n\t.string \"power this time.\\p\"\n\t.string \"My true strength… my true self…\\n\"\n\t.string \"Allow me to test them against you!$\"\n\nSevenIsland_House_Room2_Text_SabrinaSquareUp:\n\t.string \"SABRINA: You are fated to stand\\n\"\n\t.string \"over there for this battle.$\"\n\nSevenIsland_House_Room2_Eventscript_SabrinaReady:\n\tmsgbox SevenIsland_House_Room2_Text_SabrinaSquareUp, MSGBOX_DEFAULT\n\trelease\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront\n\tapplymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_SabrinaOtherLeaderReady:\n\tmsgbox SevenIsland_House_Room2_Text_SabrinaOtherLeader, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_SabrinaOtherLeader:\n\t.string \"SABRINA: I don't need to peer into\\n\"\n\t.string \"the future to know who will win\\l\"\n\t.string \"this match.$\"\n\nSevenIsland_House_Room2_Eventscript_SabrinaDeclined::\n\tmsgbox SevenIsland_House_Room2_Text_Sabrina_Declined, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_Sabrina_Declined:\n\t.string \"I foresaw that you would decline,\\n\"\n\t.string \"but we will battle again eventually.$\"\n\nSevenIsland_House_Room2_Eventscript_MoveSabrinaRight:\n\tapplymovement LOCALID_SABRINA, SevenIsland_House_Room2_Movement_SabrinaAroundPlayer\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Eventscript_MoveSabrinaUp:\n\tapplymovement LOCALID_SABRINA, SevenIsland_House_Room2_Movement_SabrinaUpToMat\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Movement_SabrinaAroundPlayer:\n\twalk_right\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Movement_SabrinaUpToMat:\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Eventscript_SabrinaBattle:\n\tsetvar TYPE, SET_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_SABRINA\n\tcallnative UseBattleHouseVar\n\tapplymovement LOCALID_SABRINA, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 1\n\tmsgbox SevenIsland_House_Room2_Text_SabrinaBeforeBattle, MSGBOX_DEFAULT\n\trelease\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeSabrinaBattle\n\ttrainerbattle_no_intro TRAINER_SABRINA_REMATCH, SevenIsland_House_Room2_Text_SabrinaLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_SabrinaExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_SabrinaBeforeBattle:\n\t.string \"SABRINA: I foresaw that we would\\n\"\n\t.string \"be here by looking into the future.\\p\"\n\t.string \"But I intentionally didn't look to\\n\"\n\t.string \"see who will win our battle.\\p\"\n\t.string \"Let's find out together!$\"\n\nSevenIsland_House_Room2_Text_SabrinaLoss:\n\t.string \"SABRINA: I won't encounter another\\n\"\n\t.string \"TRAINER like you for around another\\l\"\n\t.string \"three years.$\"\n\nSevenIsland_House_Room2_Eventscript_ChallengeSabrinaBattle:\n\ttrainerbattle_no_intro TRAINER_SABRINA_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_SabrinaLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_SabrinaExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_SabrinaExit:\n\tapplymovement LOCALID_SABRINA, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 1\n\tmsgbox SevenIsland_House_Room2_Text_SabrinaExit, MSGBOX_DEFAULT\n\trelease\n\tapplymovement LOCALID_SABRINA, SevenIsland_House_Room2_Movement_LeaderExits\n\twaitmovement 0\n\tplayse SE_EXIT\n\tsetvar LEADER_READY, 0\n\tremoveobject LOCALID_SABRINA\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_SabrinaExit:\n\t.string \"SABRINA: There was once a time\\n\"\n\t.string \"when I was shocked to lose to you.\\l\"\n\t.string \"That feeling is gone now.\\p\"\n\t.string \"It's been replaced with a desire\\n\"\n\t.string \"to grow strong and live freely,\\l\"\n\t.string \"as you do.\\p\"\n\t.string \"If I don't make it back to my GYM\\n\"\n\t.string \"in the near future, I will miss\\l\"\n\t.string \"a challenger.\\p\"\n\t.string \"Don't worry, {PLAYER}.\\n\"\n\t.string \"We will battle again soon.$\"\n\n@ LEADER BLAINE\nSevenIsland_House_Room2_Eventscript_Blaine::\n\tlock\n\tfaceplayer\n\tgoto_if_eq LEADER_READY, 7, SevenIsland_House_Room2_Eventscript_BlaineReady\n\tgoto_if_ne LEADER_READY, 0, SevenIsland_House_Room2_Eventscript_BlaineOtherLeaderReady\n\tmsgbox SevenIsland_House_Room2_Text_Blaine_Intro, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, FALSE, SevenIsland_House_Room2_Eventscript_BlaineDeclined\n\tclosemessage\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq Y_COORD, 5, SevenIsland_House_Room2_Eventscript_MoveBlaineLeft\n\tcall_if_ne Y_COORD, 5, SevenIsland_House_Room2_Eventscript_MoveBlaineUp\n\tsetobjectxyperm LOCALID_BLAINE, 7, 5\n\tsetobjectmovementtypeinstant LOCALID_BLAINE, MOVEMENT_TYPE_FACE_LEFT\n\tsetvar LEADER_READY, LOCALID_BLAINE\n\tmsgbox SevenIsland_House_Room2_Text_BlaineSquareUp, MSGBOX_DEFAULT \n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_Blaine_Intro:\n\t.string \"BLAINE: Hah!\\n\"\n\t.string \"Well done, becoming CHAMPION!\\p\"\n\t.string \"I'm taking the opportunity to train\\n\"\n\t.string \"with the other LEADERS here, but\\l\"\n\t.string \"I can't stay away from CINNABAR\\l\"\n\t.string \"for too long.\\p\"\n\t.string \"The volcano beneath my GYM is\\n\"\n\t.string \"showing signs of waking up!\\p\"\n\t.string \"But since you came all this way,\\n\"\n\t.string \"we should have a red-hot battle!$\"\n\nSevenIsland_House_Room2_Text_BlaineSquareUp:\n\t.string \"BLAINE: Square up, challenger!$\"\n\nSevenIsland_House_Room2_Eventscript_BlaineReady:\n\tmsgbox SevenIsland_House_Room2_Text_BlaineSquareUp, MSGBOX_DEFAULT\n\trelease\n\tgetplayerxy X_COORD, Y_COORD\n\tcall_if_eq X_COORD, 6, SevenIsland_House_Room2_Eventscript_CheckInFront\n\tapplymovement VAR_LAST_TALKED, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_BlaineOtherLeaderReady:\n\tmsgbox SevenIsland_House_Room2_Text_BlaineOtherLeader, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_BlaineOtherLeader:\n\t.string \"BLAINE: We GYM LEADERS battle\\n\"\n\t.string \"each other all the time, but it's\\l\"\n\t.string \"nice to have a dedicated space\\l\"\n\t.string \"now that we can practice in.$\"\n\nSevenIsland_House_Room2_Eventscript_BlaineDeclined::\n\tmsgbox SevenIsland_House_Room2_Text_Blaine_Declined, MSGBOX_DEFAULT\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_Blaine_Declined:\n\t.string \"No?\\n\"\n\t.string \"But I'm all fired up!$\"\n\nSevenIsland_House_Room2_Eventscript_MoveBlaineLeft:\n\tapplymovement LOCALID_BLAINE, SevenIsland_House_Room2_Movement_BlaineAroundPlayer\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Eventscript_MoveBlaineUp:\n\tapplymovement LOCALID_BLAINE, SevenIsland_House_Room2_Movement_BlaineUpToMat\n\twaitmovement 0\n\treturn\n\nSevenIsland_House_Room2_Movement_BlaineAroundPlayer:\n\twalk_left\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Movement_BlaineUpToMat:\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Eventscript_BlaineBattle:\n\tsetvar TYPE, SET_VISITOR_STATE\n\tsetvar ARGUMENT, FAMECHECKER_BLAINE\n\tcallnative UseBattleHouseVar\n\tapplymovement LOCALID_BLAINE, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 0\n\tmsgbox SevenIsland_House_Room2_Text_BlaineBeforeBattle, MSGBOX_DEFAULT\n\trelease\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_House_Room2_Eventscript_ChallengeBlaineBattle\n\ttrainerbattle_no_intro TRAINER_BLAINE_REMATCH, SevenIsland_House_Room2_Text_BlaineLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_BlaineExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_BlaineBeforeBattle:\n\t.string \"BLAINE: Here's a quiz for you!\\n\"\n\t.string \"Whose POKéMON are about to be\\l\"\n\t.string \"reduced to ashes?$\"\n\nSevenIsland_House_Room2_Text_BlaineLoss:\n\t.string \"BLAINE: …Apparently mine, hah!$\"\n\nSevenIsland_House_Room2_Eventscript_ChallengeBlaineBattle:\n\ttrainerbattle_no_intro TRAINER_BLAINE_REMATCH_CHALLENGE, SevenIsland_House_Room2_Text_BlaineLoss\n\tsetvar TYPE, SET_LEVEL_GROWTH\n\tcallnative UseBattleHouseVar\n\tgoto SevenIsland_House_Room2_Eventscript_BlaineExit\n\trelease\n\tend\n\nSevenIsland_House_Room2_Eventscript_BlaineExit:\n\tapplymovement LOCALID_BLAINE, SevenIsland_House_Room2_Movement_StepFastestLeft\n\twaitmovement 0\n\ttextcolor 0\n\tmsgbox SevenIsland_House_Room2_Text_BlaineExit, MSGBOX_DEFAULT\n\trelease\n\tapplymovement LOCALID_BLAINE, SevenIsland_House_Room2_Movement_LeaderExits\n\twaitmovement 0\n\tplayse SE_EXIT\n\tsetvar LEADER_READY, 0\n\tremoveobject LOCALID_BLAINE\n\trelease\n\tend\n\nSevenIsland_House_Room2_Text_BlaineExit:\n\t.string \"BLAINE: Hah!\\n\"\n\t.string \"What a rematch!\\p\"\n\t.string \"I feel a fire burning within me,\\n\"\n\t.string \"the need to keep getting stronger!\\p\"\n\t.string \"CINNABAR ISLAND's volcano is getting\\n\"\n\t.string \"more and more active every day…\\p\"\n\t.string \"I should head back and keep an\\n\"\n\t.string \"eye on it.$\"\n\nSevenIsland_House_Room2_Eventscript_CheckInFront:\n\tgoto_if_eq Y_COORD, 5, EventScript_ReleaseEnd\n\treturn\n\nSevenIsland_House_Room2_Movement_LeaderExits:\n\twalk_up\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_up\n\tdelay_4\n\tset_invisible\n\tstep_end\n\nSevenIsland_House_Room2_Movement_StepFastestLeft:\n\twalk_in_place_faster_left\n\tstep_end\n\nSevenIsland_House_Room2_Movement_StepFastestRight:\n\twalk_in_place_faster_right\n\tstep_end\n"
  },
  {
    "path": "data/maps/SevenIsland_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_MART\",\n  \"name\": \"SevenIsland_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SEVEN_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_Mart_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_Mart_EventScript_Lass\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"x\": 9,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_Mart_EventScript_Fisher\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_Mart_EventScript_Hiker\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_Mart/scripts.inc",
    "content": "SevenIsland_Mart_MapScripts::\n\t.byte 0\n\nSevenIsland_Mart_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart SevenIsland_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nSevenIsland_Mart_Items::\n\t.2byte ITEM_ULTRA_BALL\n\t.2byte ITEM_GREAT_BALL\n\t.2byte ITEM_FULL_RESTORE\n\t.2byte ITEM_MAX_POTION\n\t.2byte ITEM_HYPER_POTION\n\t.2byte ITEM_REVIVE\n\t.2byte ITEM_FULL_HEAL\n\t.2byte ITEM_ESCAPE_ROPE\n\t.2byte ITEM_MAX_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nSevenIsland_Mart_EventScript_Lass::\n\tmsgbox SevenIsland_Mart_Text_MonHavePersonalitiesOfTheirOwn, MSGBOX_NPC\n\tend\n\nSevenIsland_Mart_EventScript_Hiker::\n\tmsgbox SevenIsland_Mart_Text_PreparationsCompleteForRuins, MSGBOX_NPC\n\tend\n\nSevenIsland_Mart_EventScript_Fisher::\n\tmsgbox SevenIsland_Mart_Text_NeedToFishOnSevenIsland, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_Mart/text.inc",
    "content": "SevenIsland_Mart_Text_MonHavePersonalitiesOfTheirOwn::\n    .string \"POKéMON have personalities of their\\n\"\n    .string \"own, just like people.\\p\"\n    .string \"My PIKACHU has a HASTY nature,\\n\"\n    .string \"so it grew to be a speedy POKéMON.$\"\n\nSevenIsland_Mart_Text_PreparationsCompleteForRuins::\n    .string \"Okay, preparations are complete\\n\"\n    .string \"for me to explore the RUINS.$\"\n\nSevenIsland_Mart_Text_NeedToFishOnSevenIsland::\n    .string \"I need to fish on SEVEN ISLAND.\\p\"\n    .string \"That will complete my fishing tour\\n\"\n    .string \"of the SEVII ISLANDS.\\p\"\n    .string \"I'd better stock up on some\\n\"\n    .string \"POKé BALLS first, though.$\"\n\n"
  },
  {
    "path": "data/maps/SevenIsland_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_POKEMON_CENTER_1F\",\n  \"name\": \"SevenIsland_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SEVEN_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_PokemonCenter_1F_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_PokemonCenter_1F_EventScript_Sailor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_PokemonCenter_1F_EventScript_Beauty\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_PokemonCenter_1F_EventScript_PokemonJournal\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_PokemonCenter_1F_EventScript_PokemonJournal\",\n      \"flag\": \"FLAG_HIDE_POSTGAME_GOSSIPERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_PokemonCenter_1F/scripts.inc",
    "content": "SevenIsland_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nSevenIsland_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_SEVEN_ISLAND\n\tend\n\nSevenIsland_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nSevenIsland_PokemonCenter_1F_EventScript_OldMan::\n\tmsgbox SevenIsland_PokemonCenter_1F_Text_EventsDependingOnConnections, MSGBOX_NPC\n\tend\n\nSevenIsland_PokemonCenter_1F_EventScript_Sailor::\n\tmsgbox SevenIsland_PokemonCenter_1F_Text_DidYouRideSeagallopHere, MSGBOX_NPC\n\tend\n\nSevenIsland_PokemonCenter_1F_EventScript_Beauty::\n\tmsgbox SevenIsland_PokemonCenter_1F_Text_CheckOutTrainerTower, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_PokemonCenter_1F/text.inc",
    "content": "SevenIsland_PokemonCenter_1F_Text_EventsDependingOnConnections::\n    .string \"On this island, different events\\n\"\n    .string \"occur depending on connections.\\p\"\n    .string \"What are those connections?\\p\"\n    .string \"They are for you to discover on\\n\"\n    .string \"your own.$\"\n\nSevenIsland_PokemonCenter_1F_Text_DidYouRideSeagallopHere::\n    .string \"Did you ride a SEAGALLOP ferry\\n\"\n    .string \"to get here?\\p\"\n    .string \"There are at least ten of those\\n\"\n    .string \"high-speed ships.\\p\"\n    .string \"I don't know where they all go,\\n\"\n    .string \"though.$\"\n\nSevenIsland_PokemonCenter_1F_Text_CheckOutTrainerTower::\n    .string \"If you're confident, you should\\n\"\n    .string \"check out TRAINER TOWER.$\"\n\n"
  },
  {
    "path": "data/maps/SevenIsland_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_POKEMON_CENTER_2F\",\n  \"name\": \"SevenIsland_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SEVEN_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_PokemonCenter_2F/scripts.inc",
    "content": "SevenIsland_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nSevenIsland_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nSevenIsland_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nSevenIsland_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_SevaultCanyon/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_SEVAULT_CANYON\",\n  \"name\": \"SevenIsland_SevaultCanyon\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON\",\n  \"music\": \"MUS_ROUTE110\",\n  \"region_map_section\": \"MAPSEC_SEVAULT_CANYON\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": -48,\n      \"map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": -19,\n      \"map\": \"MAP_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BATTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 44,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_Cyndy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TAMER\",\n      \"x\": 13,\n      \"y\": 37,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_Evan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKEMON_RANGER_M\",\n      \"x\": 3,\n      \"y\": 36,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_Jackson\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKEMON_RANGER_F\",\n      \"x\": 3,\n      \"y\": 37,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_Katelyn\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 57,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_Leroy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 64,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_Michelle\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_Lex\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_Nya\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 42,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_12\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 48,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 45,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_13\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 48,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_15\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 47,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_16\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 48,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_17\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 48,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCK_SMASH_ROCK\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_RockSmash\",\n      \"flag\": \"FLAG_TEMP_1B\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 46,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_ItemKingsRock\",\n      \"flag\": \"FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_KINGS_ROCK\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 39,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_ItemMaxElixir\",\n      \"flag\": \"FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_MAX_ELIXIR\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_ItemNugget\",\n      \"flag\": \"FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_NUGGET\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_BlackBelt\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 18,\n      \"elevation\": 5,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 62,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_SEVAULT_CANYON_HOUSE\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 15,\n      \"y\": 67,\n      \"elevation\": 3,\n      \"item\": \"ITEM_CHERI_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SEVEN_ISLAND_SEVAULT_CANYON_CHERI_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 72,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SevenIsland_SevaultCanyon_EventScript_RouteSign\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_SevaultCanyon/scripts.inc",
    "content": "SevenIsland_SevaultCanyon_MapScripts::\n\t.byte 0\n\nSevenIsland_SevaultCanyon_EventScript_RouteSign::\n\tmsgbox SevenIsland_SevaultCanyon_Text_RouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_SevaultCanyon/text.inc",
    "content": "SevenIsland_SevaultCanyon_Text_CyndyIntro::\n    .string \"My conditioning's in top form!$\"\n\nSevenIsland_SevaultCanyon_Text_CyndyDefeat::\n    .string \"Huh?\\n\"\n    .string \"Something's not right…$\"\n\nSevenIsland_SevaultCanyon_Text_CyndyPostBattle::\n    .string \"The way I am now, I may have to\\n\"\n    .string \"hold off on TRAINER TOWER…$\"\n\nSevenIsland_SevaultCanyon_Text_EvanIntro::\n    .string \"It doesn't matter if you happen to\\n\"\n    .string \"have the strongest POKéMON…\\p\"\n    .string \"It doesn't mean a thing if you don't\\n\"\n    .string \"know how to use them properly!$\"\n\nSevenIsland_SevaultCanyon_Text_EvanDefeat::\n    .string \"You're a master at this.$\"\n\nSevenIsland_SevaultCanyon_Text_EvanPostBattle::\n    .string \"You see them every so often,\\n\"\n    .string \"TRAINERS with awesome POKéMON\\l\"\n    .string \"who have no idea what to do.\\p\"\n    .string \"Before training POKéMON, TRAINERS\\n\"\n    .string \"themselves need to grow up.$\"\n\nSevenIsland_SevaultCanyon_Text_JacksonIntro::\n    .string \"I work to protect the environment.\\n\"\n    .string \"In turn, nature protects me!$\"\n\nSevenIsland_SevaultCanyon_Text_JacksonDefeat::\n    .string \"Whoa! You're tough!\\n\"\n    .string \"How about protecting me?$\"\n\nSevenIsland_SevaultCanyon_Text_JacksonPostBattle::\n    .string \"From far out among the stars, our\\n\"\n    .string \"planet is just a drop of water.\\p\"\n    .string \"But we want to protect that drop\\n\"\n    .string \"of water for everyone.$\"\n\nSevenIsland_SevaultCanyon_Text_KatelynIntro::\n    .string \"Those shoes you have are pretty\\n\"\n    .string \"snazzy.$\"\n\nSevenIsland_SevaultCanyon_Text_KatelynDefeat::\n    .string \"You're hot stuff in spite of your\\n\"\n    .string \"cute looks.$\"\n\nSevenIsland_SevaultCanyon_Text_KatelynPostBattle::\n    .string \"Your mom bought those snazzy\\n\"\n    .string \"RUNNING SHOES for you?\\p\"\n    .string \"She must adore you.$\"\n\nSevenIsland_SevaultCanyon_Text_LeroyIntro::\n    .string \"You look strong.\\n\"\n    .string \"Let me battle you, please!$\"\n\nSevenIsland_SevaultCanyon_Text_LeroyDefeat::\n    .string \"I knew it!\\n\"\n    .string \"You're as tough as I thought!$\"\n\nSevenIsland_SevaultCanyon_Text_LeroyPostBattle::\n    .string \"The way you battle has given me\\n\"\n    .string \"a lot of useful data.\\p\"\n    .string \"Thanks so much!$\"\n\nSevenIsland_SevaultCanyon_Text_MichelleIntro::\n    .string \"I was given the best possible\\n\"\n    .string \"education to become this strong.\\p\"\n    .string \"I don't want to lose to anyone!$\"\n\nSevenIsland_SevaultCanyon_Text_MichelleDefeat::\n    .string \"Thank you. I feel like I've been\\n\"\n    .string \"set free by losing to you.$\"\n\nSevenIsland_SevaultCanyon_Text_MichellePostBattle::\n    .string \"For some reason, I get furious\\n\"\n    .string \"over the slightest thing.\\p\"\n    .string \"I'll calm myself by breathing\\n\"\n    .string \"deeply.$\"\n\nSevenIsland_SevaultCanyon_Text_LexIntro::\n    .string \"LEX: My darling NYA, together\\n\"\n    .string \"we could win!$\"\n\nSevenIsland_SevaultCanyon_Text_LexDefeat::\n    .string \"LEX: I seem to have been too\\n\"\n    .string \"careless…$\"\n\nSevenIsland_SevaultCanyon_Text_LexPostBattle::\n    .string \"LEX: I think it was a good\\n\"\n    .string \"experience for NYA.\\p\"\n    .string \"You have my gratitude.$\"\n\nSevenIsland_SevaultCanyon_Text_LexNotEnoughMons::\n    .string \"LEX: May I ask you to battle the\\n\"\n    .string \"both of us at the same time?$\"\n\nSevenIsland_SevaultCanyon_Text_NyaIntro::\n    .string \"NYA: I'll do my best so I won't\\n\"\n    .string \"drag down my mentor, LEX!$\"\n\nSevenIsland_SevaultCanyon_Text_NyaDefeat::\n    .string \"NYA: Oh, no…\\n\"\n    .string \"I'm so sorry, I…$\"\n\nSevenIsland_SevaultCanyon_Text_NyaPostBattle::\n    .string \"NYA: I think I'm going to need\\n\"\n    .string \"much more seasoning and tutoring\\l\"\n    .string \"under LEX…\\p\"\n    .string \"…So, LEX, please, may I stay with\\n\"\n    .string \"you like this?$\"\n\nSevenIsland_SevaultCanyon_Text_NyaNotEnoughMons::\n    .string \"NYA: I'm sorry, but may we battle\\n\"\n    .string \"in two-on-two style?$\"\n\nSevenIsland_SevaultCanyon_Text_RouteSign::\n    .string \"SEVAULT CANYON\\n\"\n    .string \"TANOBY RUINS AHEAD$\"\n\nSevenIsland_SevaultCanyon_Text_BrunoTrainedWithBrawly::\n    .string \"Training by oneself is certainly\\n\"\n    .string \"not a bad thing.\\p\"\n    .string \"But it's also not bad to aim for\\n\"\n    .string \"the top with a partner.\\p\"\n    .string \"Even BRUNO…\\n\"\n    .string \"He trained with a fellow by the\\l\"\n    .string \"name of BRAWLY before.$\"\n"
  },
  {
    "path": "data/maps/SevenIsland_SevaultCanyon_Entrance/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE\",\n  \"name\": \"SevenIsland_SevaultCanyon_Entrance\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE\",\n  \"music\": \"MUS_ROUTE110\",\n  \"region_map_section\": \"MAPSEC_CANYON_ENTRANCE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_SEVEN_ISLAND\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 19,\n      \"map\": \"MAP_SEVEN_ISLAND_SEVAULT_CANYON\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_AROMA_LADY\",\n      \"x\": 12,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"SevenIsland_SevaultCanyon_Entrance_EventScript_Miah\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNG_COUPLE_F\",\n      \"x\": 3,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_SevaultCanyon_Entrance_EventScript_Eve\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNG_COUPLE_M\",\n      \"x\": 4,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_SevaultCanyon_Entrance_EventScript_Jon\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKEMON_RANGER_M\",\n      \"x\": 11,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SevenIsland_SevaultCanyon_Entrance_EventScript_Nicolas\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKEMON_RANGER_F\",\n      \"x\": 10,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SevenIsland_SevaultCanyon_Entrance_EventScript_Madeline\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_JUGGLER\",\n      \"x\": 11,\n      \"y\": 17,\n      \"elevation\": 5,\n      \"movement_type\": \"MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_SevaultCanyon_Entrance_EventScript_Mason\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"clone\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"x\": 7,\n      \"y\": -2,\n      \"target_local_id\": 1,\n      \"target_map\": \"MAP_SEVEN_ISLAND\"\n    }\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 8,\n      \"y\": 29,\n      \"elevation\": 5,\n      \"item\": \"ITEM_RAWST_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE_RAWST_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SevenIsland_SevaultCanyon_Entrance_EventScript_RouteSign\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_SevaultCanyon_Entrance/scripts.inc",
    "content": "SevenIsland_SevaultCanyon_Entrance_MapScripts::\n\t.byte 0\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_RouteSign::\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_RouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_SevaultCanyon_Entrance/text.inc",
    "content": "SevenIsland_SevaultCanyon_Entrance_Text_MiahIntro::\n    .string \"Kyahaha!\\n\"\n    .string \"I'll flick you away effortlessly!$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_MiahDefeat::\n    .string \"Tch!\\n\"\n    .string \"Too strong for me!$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_MiahPostBattle::\n    .string \"What's that?\\n\"\n    .string \"I don't act the way I look?\\p\"\n    .string \"Heh, that's a part of my strategy!$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_MasonIntro::\n    .string \"Howdy!\\n\"\n    .string \"Are you a member of my fan club?$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_MasonDefeat::\n    .string \"Oh, so you're not a fan…\\p\"\n    .string \"Well, I can change that.\\n\"\n    .string \"Let me sing for you!$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_MasonPostBattle::\n    .string \"Lalalah…\\n\"\n    .string \"My POKéMON, I send them out,\\l\"\n    .string \"all the girls scream and shout!$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_NicolasIntro::\n    .string \"This island is too spread out…\\n\"\n    .string \"It's not easy patrolling the place.$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_NicolasDefeat::\n    .string \"Uh-huh…$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_NicolasPostBattle::\n    .string \"TRAINERS like you from cities,\\n\"\n    .string \"they sure are tough.\\p\"\n    .string \"You'll be headed for the TOWER,\\n\"\n    .string \"won't you?$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_MadelineIntro::\n    .string \"I punish people who abuse\\n\"\n    .string \"POKéMON!$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_MadelineDefeat::\n    .string \"You don't seem to be a problem\\n\"\n    .string \"TRAINER.$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_MadelinePostBattle::\n    .string \"If you treat your POKéMON with\\n\"\n    .string \"kindness, they'll understand.$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_EveIntro::\n    .string \"EVE: I'll team up with JON and\\n\"\n    .string \"battle together.$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_EveDefeat::\n    .string \"EVE: Me and JON, we lost.\\n\"\n    .string \"Ehehe.$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_EvePostBattle::\n    .string \"EVE: I'm going to work harder with\\n\"\n    .string \"JON.$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_EveNotEnoughMons::\n    .string \"EVE: I want to team up with JON\\n\"\n    .string \"when I battle you.\\p\"\n    .string \"Come back with two POKéMON, okay?$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_JonIntro::\n    .string \"JON: When I'm with EVE, it feels\\n\"\n    .string \"like we could never lose.$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_JonDefeat::\n    .string \"JON: When I'm with EVE,\\n\"\n    .string \"it doesn't feel like I've lost!$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_JonPostBattle::\n    .string \"JON: When I'm with EVE, I feel\\n\"\n    .string \"giddy whether I win or lose.\\p\"\n    .string \"It's magical!$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_JonNotEnoughMons::\n    .string \"JON: If it's with EVE, I'll be\\n\"\n    .string \"happy to battle with you.\\p\"\n    .string \"So, I'd like to make it a\\n\"\n    .string \"two-on-two battle, if I may.$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_RouteSign::\n    .string \"SEVAULT CANYON ENTRANCE\\p\"\n    .string \"TRAINERS are asked to refrain from\\n\"\n    .string \"damaging plants in the CANYON.$\"\n\n"
  },
  {
    "path": "data/maps/SevenIsland_SevaultCanyon_House/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_SEVAULT_CANYON_HOUSE\",\n  \"name\": \"SevenIsland_SevaultCanyon_House\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_SEVII_67\",\n  \"region_map_section\": \"MAPSEC_SEVAULT_CANYON\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_SevaultCanyon_House_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANSEY\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_SevaultCanyon_House_EventScript_Chansey\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SevenIsland_SevaultCanyon_House_EventScript_ItemLuckyPunch\",\n      \"flag\": \"FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_HOUSE_LUCKY_PUNCH\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_SEVAULT_CANYON\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_SevaultCanyon_House/scripts.inc",
    "content": ".set LOCALID_BALDING_MAN, 1\n\nSevenIsland_SevaultCanyon_House_MapScripts::\n\t.byte 0\n\nSevenIsland_SevaultCanyon_House_EventScript_BaldingMan::\n\tlock\n\tgoto_if_set FLAG_TEMP_2, SevenIsland_SevaultCanyon_House_EventScript_AlreadyDanced\n\tplaybgm MUS_SCHOOL, 0\n\tapplymovement LOCALID_BALDING_MAN, SevenIsland_SevaultCanyon_House_Movement_ChanseyDance\n\twaitmovement 0\n\tfadedefaultbgm\n\tdelay 30\n\tapplymovement LOCALID_BALDING_MAN, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox SevenIsland_SevaultCanyon_House_Text_ChanseyDanceJoinIn\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox SevenIsland_SevaultCanyon_House_Text_WouldYouLikeToDance, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, SevenIsland_SevaultCanyon_House_EventScript_DeclineDance\n\tmsgbox SevenIsland_SevaultCanyon_House_Text_DancedChanseyDance\n\tclosemessage\n\tcall EventScript_RestorePrevTextColor\n\tcall_if_ne VAR_FACING, DIR_SOUTH, SevenIsland_SevaultCanyon_House_EventScript_PlayerFaceDown\n\tdelay 30\n\tplaybgm MUS_SCHOOL, 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, SevenIsland_SevaultCanyon_House_Movement_ChanseyDance\n\twaitmovement 0\n\tfadedefaultbgm\n\tdelay 30\n\tcall EventScript_OutOfCenterPartyHeal\n\tmsgbox SevenIsland_SevaultCanyon_House_Text_YoureAllChipperNow\n\tsetflag FLAG_TEMP_2\n\trelease\n\tend\n\nSevenIsland_SevaultCanyon_House_EventScript_PlayerFaceDown::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\nSevenIsland_SevaultCanyon_House_EventScript_AlreadyDanced::\n\tapplymovement LOCALID_BALDING_MAN, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox SevenIsland_SevaultCanyon_House_Text_ChanseyDanceJoinIn\n\trelease\n\tend\n\nSevenIsland_SevaultCanyon_House_EventScript_DeclineDance::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox SevenIsland_SevaultCanyon_House_Text_ComeOnDance\n\trelease\n\tend\n\nSevenIsland_SevaultCanyon_House_Movement_ChanseyDance::\n\twalk_in_place_down\n\tdelay_16\n\twalk_in_place_down\n\tdelay_16\n\twalk_in_place_down\n\tdelay_16\n\twalk_in_place_down\n\tdelay_16\n\twalk_in_place_faster_right\n\tdelay_4\n\twalk_in_place_faster_up\n\tdelay_4\n\twalk_in_place_faster_left\n\tdelay_4\n\twalk_in_place_faster_down\n\tdelay_4\n\tstep_end\n\nSevenIsland_SevaultCanyon_House_EventScript_Chansey::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_CHANSEY, CRY_MODE_NORMAL\n\tmsgbox SevenIsland_SevaultCanyon_House_Text_Chansey\n\twaitmoncry\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_SevaultCanyon_House/text.inc",
    "content": "SevenIsland_SevaultCanyon_House_Text_ChanseyDanceJoinIn::\n    .string \"Dance, dance!\\n\"\n    .string \"CHANSEY Dance!\\p\"\n    .string \"You join in, too!\\n\"\n    .string \"Dance, dance!$\"\n\nSevenIsland_SevaultCanyon_House_Text_WouldYouLikeToDance::\n    .string \"Would you like to dance?$\"\n\nSevenIsland_SevaultCanyon_House_Text_ComeOnDance::\n    .string \"Come on, dance!$\"\n\nSevenIsland_SevaultCanyon_House_Text_DancedChanseyDance::\n    .string \"{PLAYER} danced the CHANSEY Dance!$\"\n\nSevenIsland_SevaultCanyon_House_Text_YoureAllChipperNow::\n    .string \"Ahahahaha!\\p\"\n    .string \"There, you're all chipper now!\\n\"\n    .string \"Lucky!$\"\n\nSevenIsland_SevaultCanyon_House_Text_Chansey::\n    .string \"CHANSEY: Chansi! Chansi!$\"\n"
  },
  {
    "path": "data/maps/SevenIsland_SevaultCanyon_TanobyKey/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY\",\n  \"name\": \"SevenIsland_SevaultCanyon_TanobyKey\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_TANOBY_KEY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_SEVAULT_CANYON\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"99\",\n      \"script\": \"SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch1\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_7\",\n      \"var_value\": \"99\",\n      \"script\": \"SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch7\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_6\",\n      \"var_value\": \"99\",\n      \"script\": \"SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch6\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_5\",\n      \"var_value\": \"99\",\n      \"script\": \"SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch5\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_4\",\n      \"var_value\": \"99\",\n      \"script\": \"SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch4\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_3\",\n      \"var_value\": \"99\",\n      \"script\": \"SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch3\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_2\",\n      \"var_value\": \"99\",\n      \"script\": \"SevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch2\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_SevaultCanyon_TanobyKey/scripts.inc",
    "content": ".set LOCALID_BOULDER1, 1\n.set LOCALID_BOULDER2, 2\n.set LOCALID_BOULDER3, 3\n.set LOCALID_BOULDER4, 4\n.set LOCALID_BOULDER5, 5\n.set LOCALID_BOULDER6, 6\n.set LOCALID_BOULDER7, 7\n\n.equ NUM_SWITCHES_PRESSED, VAR_TEMP_8\n\nSevenIsland_SevaultCanyon_TanobyKey_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_SevaultCanyon_TanobyKey_OnTransition\n\t.byte 0\n\nSevenIsland_SevaultCanyon_TanobyKey_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY\n\tcall_if_set FLAG_SYS_UNLOCKED_TANOBY_RUINS, SevenIsland_SevaultCanyon_TanobyKey_EventScript_MoveBouldersToSolvedPos\n\tsetvar VAR_TEMP_1, 0\n\tsetvar VAR_TEMP_2, 0\n\tsetvar VAR_TEMP_3, 0\n\tsetvar VAR_TEMP_4, 0\n\tsetvar VAR_TEMP_5, 0\n\tsetvar VAR_TEMP_6, 0\n\tsetvar VAR_TEMP_7, 0\n\tsetvar NUM_SWITCHES_PRESSED, 0\n\tend\n\nSevenIsland_SevaultCanyon_TanobyKey_EventScript_MoveBouldersToSolvedPos::\n\tsetobjectxyperm LOCALID_BOULDER1, 7, 2\n\tsetobjectxyperm LOCALID_BOULDER2, 4, 4\n\tsetobjectxyperm LOCALID_BOULDER3, 10, 4\n\tsetobjectxyperm LOCALID_BOULDER4, 5, 6\n\tsetobjectxyperm LOCALID_BOULDER5, 9, 6\n\tsetobjectxyperm LOCALID_BOULDER6, 5, 8\n\tsetobjectxyperm LOCALID_BOULDER7, 9, 8\n\treturn\n\nSevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch1::\n\tlockall\n\tgoto_if_eq VAR_TEMP_1, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed\n\tcall SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed\n\tsetvar VAR_TEMP_1, 100\n\tgoto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved\n\treleaseall\n\tend\n\nSevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch2::\n\tlockall\n\tgoto_if_eq VAR_TEMP_2, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed\n\tcall SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed\n\tsetvar VAR_TEMP_2, 100\n\tgoto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved\n\treleaseall\n\tend\n\nSevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch3::\n\tlockall\n\tgoto_if_eq VAR_TEMP_3, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed\n\tcall SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed\n\tsetvar VAR_TEMP_3, 100\n\tgoto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved\n\treleaseall\n\tend\n\nSevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch4::\n\tlockall\n\tgoto_if_eq VAR_TEMP_4, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed\n\tcall SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed\n\tsetvar VAR_TEMP_4, 100\n\tgoto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved\n\treleaseall\n\tend\n\nSevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch5::\n\tlockall\n\tgoto_if_eq VAR_TEMP_5, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed\n\tcall SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed\n\tsetvar VAR_TEMP_5, 100\n\tgoto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved\n\treleaseall\n\tend\n\nSevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch6::\n\tlockall\n\tgoto_if_eq VAR_TEMP_6, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed\n\tcall SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed\n\tsetvar VAR_TEMP_6, 100\n\tgoto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved\n\treleaseall\n\tend\n\nSevenIsland_SevaultCanyon_TanobyKey_EventScript_Switch7::\n\tlockall\n\tgoto_if_eq VAR_TEMP_7, 100, SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed\n\tcall SevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed\n\tsetvar VAR_TEMP_7, 100\n\tgoto_if_eq NUM_SWITCHES_PRESSED, 7, SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved\n\treleaseall\n\tend\n\nSevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchPressed::\n\taddvar NUM_SWITCHES_PRESSED, 1\n\tplayse SE_TRUCK_MOVE\n\tsetvar VAR_0x8004, 1\n\tsetvar VAR_0x8005, 1\n\tsetvar VAR_0x8006, 8\n\tsetvar VAR_0x8007, 3\n\tspecial ShakeScreen\n\tdelay 60\n\treturn\n\nSevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolvedShakeScreen::\n\tsetvar VAR_0x8004, 2\n\tsetvar VAR_0x8005, 2\n\tsetvar VAR_0x8006, 10\n\tsetvar VAR_0x8007, 3\n\tspecial ShakeScreen\n\tdelay 60\n\tsetvar VAR_0x8004, 3\n\tsetvar VAR_0x8005, 3\n\tsetvar VAR_0x8006, 12\n\tsetvar VAR_0x8007, 2\n\tspecial ShakeScreen\n\tdelay 60\n\tplayse SE_LAVARIDGE_FALL_WARP\n\twaitse\n\treturn\n\nSevenIsland_SevaultCanyon_TanobyKey_EventScript_SwitchAlreadyPressed::\n\treleaseall\n\tend\n\nSevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolved::\n\tcall SevenIsland_SevaultCanyon_TanobyKey_EventScript_PuzzleSolvedShakeScreen\n\tmsgbox SevenIsland_SevaultCanyon_TanobyKey_Text_MysteriousRumbleFarAway\n\tsetflag FLAG_SYS_UNLOCKED_TANOBY_RUINS\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_SevaultCanyon_TanobyKey/text.inc",
    "content": "SevenIsland_SevaultCanyon_TanobyKey_Text_MysteriousRumbleFarAway::\n    .string \"A mysterious rumble echoed\\n\"\n    .string \"somewhere far away.$\"\n\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS\",\n  \"name\": \"SevenIsland_TanobyRuins\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS\",\n  \"music\": \"MUS_ROUTE110\",\n  \"region_map_section\": \"MAPSEC_TANOBY_RUINS\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 48,\n      \"map\": \"MAP_SEVEN_ISLAND_SEVAULT_CANYON\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_RUIN_MANIAC\",\n      \"x\": 35,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_TanobyRuins_EventScript_Brandon\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_RUIN_MANIAC\",\n      \"x\": 121,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_TanobyRuins_EventScript_Benjamin\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PAINTER\",\n      \"x\": 85,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_TanobyRuins_EventScript_Edna\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 85,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_TanobyRuins_EventScript_Clifford\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 120,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 103,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 88,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 44,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 32,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 33,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"item\": \"ITEM_HEART_SCALE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 86,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"item\": \"ITEM_HEART_SCALE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_2\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 125,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_HEART_SCALE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_3\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"item\": \"ITEM_HEART_SCALE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_4\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins/scripts.inc",
    "content": "SevenIsland_TanobyRuins_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins/text.inc",
    "content": "SevenIsland_TanobyRuins_Text_BrandonIntro::\n    .string \"Do you know anything about this\\n\"\n    .string \"stone chamber?$\"\n\nSevenIsland_TanobyRuins_Text_BrandonDefeat::\n    .string \"That was uncalled for.\\n\"\n    .string \"You didn't have to be so rough.$\"\n\nSevenIsland_TanobyRuins_Text_BrandonPostBattle::\n    .string \"The TANOBY RUINS date back at\\n\"\n    .string \"least 1,500 years.\\p\"\n    .string \"But it's a baffling mystery as to\\n\"\n    .string \"why it was built in the first place.$\"\n\nSevenIsland_TanobyRuins_Text_BenjaminIntro::\n    .string \"A mystic POKéMON is said to sleep\\n\"\n    .string \"inside here.$\"\n\nSevenIsland_TanobyRuins_Text_BenjaminDefeat::\n    .string \"I'm not much good in battle.$\"\n\nSevenIsland_TanobyRuins_Text_BenjaminPostBattle::\n    .string \"I hear there are other ruins like\\n\"\n    .string \"the one here.\\p\"\n    .string \"Might they be the resting places\\n\"\n    .string \"of other mystic POKéMON?$\"\n\nSevenIsland_TanobyRuins_Text_EdnaIntro::\n    .string \"CLIFFORD is teaching me how to\\n\"\n    .string \"paint.$\"\n\nSevenIsland_TanobyRuins_Text_EdnaDefeat::\n    .string \"We might get in trouble for being\\n\"\n    .string \"noisy here.$\"\n\nSevenIsland_TanobyRuins_Text_EdnaPostBattle::\n    .string \"I said that I wanted to paint an\\n\"\n    .string \"old building.\\p\"\n    .string \"So CLIFFORD brought me here.$\"\n\nSevenIsland_TanobyRuins_Text_CliffordIntro::\n    .string \"Today, in addition to our lesson,\\n\"\n    .string \"we came to see the chamber.$\"\n\nSevenIsland_TanobyRuins_Text_CliffordDefeat::\n    .string \"My, how extraordinary.$\"\n\nSevenIsland_TanobyRuins_Text_CliffordPostBattle::\n    .string \"Ah, so you are studying POKéMON\\n\"\n    .string \"on your own…\\p\"\n    .string \"Yes, you certainly are quite the\\n\"\n    .string \"extraordinary person, indeed.$\"\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_DilfordChamber/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER\",\n  \"name\": \"SevenIsland_TanobyRuins_DilfordChamber\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_DILFORD_CHAMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_DilfordChamber/scripts.inc",
    "content": "SevenIsland_TanobyRuins_DilfordChamber_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_DilfordChamber_OnTransition\n\t.byte 0\n\nSevenIsland_TanobyRuins_DilfordChamber_OnTransition::\n\tcall EventScript_TryDarkenRuins\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_LiptooChamber/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER\",\n  \"name\": \"SevenIsland_TanobyRuins_LiptooChamber\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_LIPTOO_CHAMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_LiptooChamber/scripts.inc",
    "content": "SevenIsland_TanobyRuins_LiptooChamber_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_LiptooChamber_OnTransition\n\t.byte 0\n\nSevenIsland_TanobyRuins_LiptooChamber_OnTransition::\n\tcall EventScript_TryDarkenRuins\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_MoneanChamber/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER\",\n  \"name\": \"SevenIsland_TanobyRuins_MoneanChamber\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_MONEAN_CHAMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_MoneanChamber/scripts.inc",
    "content": "SevenIsland_TanobyRuins_MoneanChamber_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_MoneanChamber_OnTransition\n\t.byte 0\n\nSevenIsland_TanobyRuins_MoneanChamber_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER\n\tcall EventScript_TryDarkenRuins\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_RixyChamber/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER\",\n  \"name\": \"SevenIsland_TanobyRuins_RixyChamber\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_RIXY_CHAMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_RixyChamber/scripts.inc",
    "content": "SevenIsland_TanobyRuins_RixyChamber_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_RixyChamber_OnTransition\n\t.byte 0\n\nSevenIsland_TanobyRuins_RixyChamber_OnTransition::\n\tcall EventScript_TryDarkenRuins\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_ScufibChamber/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER\",\n  \"name\": \"SevenIsland_TanobyRuins_ScufibChamber\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_SCUFIB_CHAMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_ScufibChamber/scripts.inc",
    "content": "SevenIsland_TanobyRuins_ScufibChamber_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_ScufibChamber_OnTransition\n\t.byte 0\n\nSevenIsland_TanobyRuins_ScufibChamber_OnTransition::\n\tcall EventScript_TryDarkenRuins\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_ViapoisChamber/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER\",\n  \"name\": \"SevenIsland_TanobyRuins_ViapoisChamber\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_VIAPOIS_CHAMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_ViapoisChamber/scripts.inc",
    "content": "SevenIsland_TanobyRuins_ViapoisChamber_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_ViapoisChamber_OnTransition\n\t.byte 0\n\nSevenIsland_TanobyRuins_ViapoisChamber_OnTransition::\n\tcall EventScript_TryDarkenRuins\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_WeepthChamber/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER\",\n  \"name\": \"SevenIsland_TanobyRuins_WeepthChamber\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_WEEPTH_CHAMBER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_INDOOR_1\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TANOBY_RUINS\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_TanobyRuins_WeepthChamber/scripts.inc",
    "content": "SevenIsland_TanobyRuins_WeepthChamber_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TanobyRuins_WeepthChamber_OnTransition\n\t.byte 0\n\nSevenIsland_TanobyRuins_WeepthChamber_OnTransition::\n\tcall EventScript_TryDarkenRuins\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_TrainerTower/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_TRAINER_TOWER\",\n  \"name\": \"SevenIsland_TrainerTower\",\n  \"layout\": \"LAYOUT_SEVEN_ISLAND_TRAINER_TOWER\",\n  \"music\": \"MUS_ROUTE110\",\n  \"region_map_section\": \"MAPSEC_TRAINER_TOWER\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": 10,\n      \"map\": \"MAP_SEVEN_ISLAND\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PSYCHIC_M\",\n      \"x\": 18,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_TrainerTower_EventScript_Dario\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PSYCHIC_F\",\n      \"x\": 18,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SevenIsland_TrainerTower_EventScript_Rodette\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 20,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_LOBBY\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 11,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"item\": \"ITEM_BIG_PEARL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_BIG_PEARL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 9,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PEARL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_PEARL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 21,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"item\": \"ITEM_HONDEW_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_HONDEW_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 18,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SevenIsland_TrainerTower_EventScript_TrainerTowerSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 30,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SevenIsland_TrainerTower_EventScript_TrainerTowerAheadSign\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_TrainerTower/scripts.inc",
    "content": "SevenIsland_TrainerTower_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SevenIsland_TrainerTower_OnTransition\n\t.byte 0\n\nSevenIsland_TrainerTower_OnTransition::\n\tsetvar VAR_MAP_SCENE_TRAINER_TOWER, 0\n\tend\n\nSevenIsland_TrainerTower_EventScript_TrainerTowerSign::\n\tmsgbox SevenIsland_TrainerTower_Text_TrainerTowerSign, MSGBOX_SIGN\n\tend\n\nSevenIsland_TrainerTower_EventScript_TrainerTowerAheadSign::\n\tmsgbox SevenIsland_TrainerTower_Text_TrainerTowerAhead, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SevenIsland_TrainerTower/text.inc",
    "content": "SevenIsland_TrainerTower_Text_DarioIntro::\n    .string \"I sensed your approach.$\"\n\nSevenIsland_TrainerTower_Text_DarioDefeat::\n    .string \"Give up…$\"\n\nSevenIsland_TrainerTower_Text_DarioPostBattle::\n    .string \"In your future, I sense that you\\n\"\n    .string \"will meet many others.\\p\"\n    .string \"I think you will be linked to each\\n\"\n    .string \"other by a strange power.$\"\n\nSevenIsland_TrainerTower_Text_RodetteIntro::\n    .string \"Somewhere on this island, peculiar\\n\"\n    .string \"POKéMON are sleeping.$\"\n\nSevenIsland_TrainerTower_Text_RodetteDefeat::\n    .string \"What an amazing TRAINER!$\"\n\nSevenIsland_TrainerTower_Text_RodettePostBattle::\n    .string \"Somewhere on this island, peculiar\\n\"\n    .string \"POKéMON are sleeping.\\p\"\n    .string \"Could it be that they're waiting\\n\"\n    .string \"for you?$\"\n\nSevenIsland_TrainerTower_Text_TrainerTowerSign::\n    .string \"TRAINER TOWER ENTRANCE\\n\"\n    .string \"Rise to the Challenge, TRAINERS!$\"\n\nSevenIsland_TrainerTower_Text_TrainerTowerAhead::\n    .string \"TRAINER TOWER AHEAD$\"\n\n"
  },
  {
    "path": "data/maps/SevenIsland_UnusedHouse/map.json",
    "content": "{\n  \"id\": \"MAP_SEVEN_ISLAND_UNUSED_HOUSE\",\n  \"name\": \"SevenIsland_UnusedHouse\",\n  \"layout\": \"LAYOUT_HOUSE4\",\n  \"music\": \"MUS_SEVII_67\",\n  \"region_map_section\": \"MAPSEC_SEVEN_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SevenIsland_UnusedHouse/scripts.inc",
    "content": "SevenIsland_UnusedHouse_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/SilphCo_10F/map.json",
    "content": "{\n  \"id\": \"MAP_SILPH_CO_10F\",\n  \"name\": \"SilphCo_10F\",\n  \"layout\": \"LAYOUT_SILPH_CO_10F\",\n  \"music\": \"MUS_SILPH\",\n  \"region_map_section\": \"MAPSEC_SILPH_CO\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 10,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SilphCo_10F_EventScript_Travis\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_10F_EventScript_WorkerF\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"SilphCo_10F_EventScript_Grunt\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_10F_EventScript_ItemCarbos\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_10F_CARBOS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_10F_EventScript_ItemUltraBall\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_10F_ULTRA_BALL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_10F_EventScript_ItemRareCandy\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_10F_RARE_CANDY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_10F_EventScript_WorkerBro\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_10F_EventScript_WorkerM\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_11F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_4F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_4F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_9F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_4F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_10F_EventScript_Door\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_10F_EventScript_Door\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_10F_EventScript_Door\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_10F_EventScript_Door\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"item\": \"ITEM_HP_UP\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SILPH_CO_10F_HP_UP\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_10F_EventScript_FloorSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_10F_EventScript_Painting\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_10F_EventScript_Painting\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SilphCo_10F/scripts.inc",
    "content": "SilphCo_10F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, SilphCo_10F_OnLoad\n\t.byte 0\n\nSilphCo_10F_OnLoad::\n\tcall_if_unset FLAG_SILPH_10F_DOOR, EventScript_Close10FDoor\n\tend\n\nSilphCo_10F_EventScript_WorkerF::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_10F_EventScript_WorkerFRocketsGone\n\tmsgbox SilphCo_10F_Text_WaaaImScared\n\trelease\n\tend\n\nSilphCo_10F_EventScript_WorkerFRocketsGone::\n\tmsgbox SilphCo_10F_Text_KeepMeCryingASecret\n\trelease\n\tend\n\nSilphCo_10F_EventScript_FloorSign::\n\tmsgbox SilphCo_10F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nSilphCo_10F_EventScript_Travis::\n\ttrainerbattle_single TRAINER_SCIENTIST_TRAVIS, SilphCo_10F_Text_TravisIntro, SilphCo_10F_Text_TravisDefeat\n\tmsgbox SilphCo_10F_Text_TravisPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_10F_EventScript_Grunt::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_39, SilphCo_10F_Text_GruntIntro, SilphCo_10F_Text_GruntDefeat\n\tmsgbox SilphCo_10F_Text_GruntPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_10F_EventScript_WorkerBro::\n\tmsgbox SilphCo_10F_Text_WorkerBro, MSGBOX_NPC\n\tend\n\nSilphCo_10F_Text_WorkerBro:\n\t.string \"I am one of the four SILPH\\n\"\n    .string \"BROTHERS!\\p\"\n\t.string \"I'm a janitor!\\n\"\n\t.string \"I keep this whole place sparkling!$\"\n\nSilphCo_10F_EventScript_WorkerM::\n\tmsgbox SilphCo_10F_Text_WorkerM, MSGBOX_NPC\n\tend\n\nSilphCo_10F_Text_WorkerM:\n\t.string \"Ahh!\\n\"\n\t.string \"You startled me!\\p\"\n\t.string \"…\\n\"\n\t.string \"What am I doing?\\l\"\n\t.string \"…Okay, you caught me.\\p\"\n\t.string \"I never wanted to be an office\\n\"\n\t.string \"drone, I wanted to be an artist!\\p\"\n\t.string \"I'm replacing some of the paintings\\n\"\n\t.string \"around here with some of my own\\l\"\n\t.string \"to see if people like them.\\p\"\n\t.string \"Don't worry, I'm putting the old\\n\"\n\t.string \"paintings in storage.\\p\"\n\t.string \"I'd never take such derivative\\n\"\n\t.string \"work home for myself.$\"\n\nSilphCo_10F_EventScript_Painting::\n\tgoto_if_unset FLAG_HIDE_SAFFRON_CIVILIANS, SilphCo_10F_EventScript_NewPainting\n\tmsgbox Text_Painting, MSGBOX_SIGN\n\tend\n\nSilphCo_10F_EventScript_NewPainting::\n\tmsgbox SilphCo_10F_Text_NewPainting, MSGBOX_SIGN\n\tend\n\nSilphCo_10F_Text_NewPainting:\n\t.string \"It's a gorgeous painting of a lush,\\n\"\n\t.string \"verdant landscape at sunset.$\""
  },
  {
    "path": "data/maps/SilphCo_10F/text.inc",
    "content": "SilphCo_10F_Text_GruntIntro::\n    .string \"Welcome to 10F!\\n\"\n    .string \"So good of you to join me!$\"\n\nSilphCo_10F_Text_GruntDefeat::\n    .string \"I'm stunned!$\"\n\nSilphCo_10F_Text_GruntPostBattle::\n    .string \"Nice try, but the boardroom is up\\n\"\n    .string \"one more floor.$\"\n\nSilphCo_10F_Text_TravisIntro::\n    .string \"Enough of your silly games!$\"\n\nSilphCo_10F_Text_TravisDefeat::\n    .string \"No continues left!$\"\n\nSilphCo_10F_Text_TravisPostBattle::\n    .string \"Are you satisfied with beating me?\\n\"\n    .string \"Then go on home!$\"\n\nSilphCo_10F_Text_WaaaImScared::\n    .string \"Waaaaa!\\n\"\n    .string \"I'm scared!$\"\n\nSilphCo_10F_Text_KeepMeCryingASecret::\n    .string \"I know you saw me crying before…\\n\"\n    .string \"Please, don't tell anyone!$\"\n\nSilphCo_10F_Text_FloorSign::\n    .string \"SILPH CO. HEAD OFFICE\\n\"\n    .string \"10F$\"\n\n"
  },
  {
    "path": "data/maps/SilphCo_11F/map.json",
    "content": "{\n  \"id\": \"MAP_SILPH_CO_11F\",\n  \"name\": \"SilphCo_11F\",\n  \"layout\": \"LAYOUT_SILPH_CO_11F\",\n  \"music\": \"MUS_SILPH\",\n  \"region_map_section\": \"MAPSEC_SILPH_CO\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 11,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_11F_EventScript_President\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_11F_EventScript_Secretary\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GIOVANNI\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"SilphCo_11F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_11F_EventScript_ItemZinc\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_11F_ZINC\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"SilphCo_11F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_11F_EventScript_WorkerM\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_11F_EventScript_DevonSpy\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Wigglytuff\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_10F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_7F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 5,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_SILPH_CO_11F\",\n      \"var_value\": \"0\",\n      \"script\": \"SilphCo_11F_EventScript_GiovanniTriggerLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 6,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_SILPH_CO_11F\",\n      \"var_value\": \"0\",\n      \"script\": \"SilphCo_11F_EventScript_GiovanniTriggerRight\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_11F_EventScript_Door\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_11F_EventScript_Door\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_11F_EventScript_Door\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_11F_EventScript_Door\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 10,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"item\": \"ITEM_REVIVE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SILPH_CO_11F_REVIVE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_11F_EventScript_FloorSign\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SilphCo_11F/scripts.inc",
    "content": ".set LOCALID_GIOVANNI, 3\n.set LOCALID_GRUNT1,   4\n.set LOCALID_GRUNT2,   6\n.set LOCALID_WORKERM,  7\n.set LOCALID_WIGGLYTUFF_MASTER, 9\n.set TRAINER, VAR_0x8009\n\nSilphCo_11F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, SilphCo_11F_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SilphCo_11F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nSilphCo_11F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_WIGGLYTUFF\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SilphCo_11F_MapScript_WigglytuffMasterMovementType\n\tend\n\nSilphCo_11F_MapScript_WigglytuffMasterMovementType::\n\tsetobjectmovementtype LOCALID_WIGGLYTUFF_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nSilphCo_11F_OnLoad::\n\tcall_if_unset FLAG_SILPH_11F_DOOR, EventScript_Close11FDoor\n\tend\n\nSilphCo_11F_EventScript_President::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_MASTER_BALL_FROM_SILPH, SilphCo_11F_EventScript_AlreadyGotMasterBall\n\tcheckplayergender\n\tcall_if_eq VAR_RESULT, MALE, SilphCo_11F_EventScript_PresidentThanksMale\n\tcall_if_eq VAR_RESULT, FEMALE, SilphCo_11F_EventScript_PresidentThanksFemale\n\tcheckitemspace ITEM_MASTER_BALL\n\tgoto_if_eq VAR_RESULT, FALSE, SilphCo_11F_EventScript_NoRoomForMasterBall\n\tgiveitem_msg SilphCo_11F_Text_ObtainedMasterBallFromPresident, ITEM_MASTER_BALL, 1, MUS_OBTAIN_KEY_ITEM\n\tmsgbox SilphCo_11F_Text_ThatsOurSecretPrototype\n\tsetflag FLAG_GOT_MASTER_BALL_FROM_SILPH\n\trelease\n\tend\n\nSilphCo_11F_EventScript_PresidentThanksMale::\n\tmsgbox SilphCo_11F_Text_ThanksForSavingMeDearBoy\n\treturn\n\nSilphCo_11F_EventScript_PresidentThanksFemale::\n\tmsgbox SilphCo_11F_Text_ThanksForSavingMeDearGirl\n\treturn\n\nSilphCo_11F_EventScript_NoRoomForMasterBall::\n\tmsgbox SilphCo_11F_Text_YouHaveNoRoomForThis\n\trelease\n\tend\n\nSilphCo_11F_EventScript_AlreadyGotMasterBall::\n\tmsgbox SilphCo_11F_Text_ThatsOurSecretPrototype\n\trelease\n\tend\n\nSilphCo_11F_EventScript_Secretary::\n\tmsgbox SilphCo_11F_Text_ThanksForRescuingUs, MSGBOX_NPC\n\tend\n\nSilphCo_11F_EventScript_GiovanniTriggerLeft::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto SilphCo_11F_EventScript_BattleGiovanni\n\tend\n\nSilphCo_11F_EventScript_GiovanniTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto SilphCo_11F_EventScript_BattleGiovanni\n\tend\n\nSilphCo_11F_EventScript_BattleGiovanni::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement LOCALID_GIOVANNI, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tdelay 25\n\tmsgbox SilphCo_11F_Text_GiovanniIntro\n\tclosemessage\n\tcall_if_eq VAR_TEMP_1, 0, SilphCo_11F_EventScript_GiovanniApproachLeft\n\tcall_if_eq VAR_TEMP_1, 1, SilphCo_11F_EventScript_GiovanniApproachRight\n\tsetvar VAR_LAST_TALKED, LOCALID_GIOVANNI\n\ttrainerbattle_no_intro TRAINER_BOSS_GIOVANNI_2, SilphCo_11F_Text_GiovanniDefeat\n\tmsgbox SilphCo_11F_Text_GiovanniPostBattle\n\tclosemessage\n\tfadescreen FADE_TO_BLACK\n\tremoveobject LOCALID_GIOVANNI\n\tremoveobject LOCALID_GRUNT1\n\tremoveobject LOCALID_GRUNT2\n\tplaybgm MUS_GSC_PEWTER 0\n\taddobject LOCALID_WORKERM\n\tfadescreen FADE_FROM_BLACK\n\tsetvar VAR_MAP_SCENE_SILPH_CO_11F, 1\n\tsetflag FLAG_HIDE_SAFFRON_ROCKETS\n\tclearflag FLAG_HIDE_SAFFRON_CIVILIANS\n\treleaseall\n\tend\n\nSilphCo_11F_EventScript_GiovanniApproachLeft::\n\tapplymovement LOCALID_GIOVANNI, SilphCo_11F_Movement_GiovanniApproachLeft\n\tapplymovement OBJ_EVENT_ID_PLAYER, SilphCo_11F_Movement_PlayerFaceGiovanni\n\twaitmovement 0\n\treturn\n\nSilphCo_11F_EventScript_GiovanniApproachRight::\n\tapplymovement LOCALID_GIOVANNI, SilphCo_11F_Movement_GiovanniApproachRight\n\twaitmovement 0\n\treturn\n\nSilphCo_11F_Movement_GiovanniApproachLeft::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_in_place_faster_left\n\tstep_end\n\nSilphCo_11F_Movement_GiovanniApproachRight::\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nSilphCo_11F_Movement_PlayerFaceGiovanni::\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_8\n\tdelay_4\n\twalk_in_place_faster_right\n\tstep_end\n\n@ Unused\nSilphCo_11F_EventScript_Monitor::\n\tmsgbox SilphCo_11F_Text_MonitorHasMonsOnIt, MSGBOX_SIGN\n\tend\n\nSilphCo_11F_EventScript_FloorSign::\n\tmsgbox SilphCo_11F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nSilphCo_11F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_40, SilphCo_11F_Text_Grunt1Intro, SilphCo_11F_Text_Grunt1Defeat\n\tmsgbox SilphCo_11F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_11F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_41, SilphCo_11F_Text_Grunt2Intro, SilphCo_11F_Text_Grunt2Defeat\n\tmsgbox SilphCo_11F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_11F_EventScript_WorkerM::\n\tmsgbox SilphCo_11F_Text_WorkerM, MSGBOX_NPC\n\tend\n\nSilphCo_11F_Text_WorkerM:\n\t.string \"Excuse me!\\p\"\n\t.string \"Do you have an appointment to see\\n\"\n\t.string \"the PRESIDENT?\\p\"\n\t.string \"Oh, {PLAYER}!\\n\"\n\t.string \"Sorry, go on ahead.$\"\n\nSilphCo_11F_EventScript_DevonSpy::\n\tcall_if_unset FLAG_MET_DEVON_SPY, SilphCo_11F_EventScript_DevonSpyFirstTime\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tmsgbox SilphCo_11F_Text_DevonSpy\n\trelease\n\tfaceplayer\n\tplayse SE_PIN\n\tapplymovement 8, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement 8, Common_Movement_Delay48\n\twaitmovement 0\n\tlock\n\tmessage SilphCo_11F_Text_DevonSpyYoureBack\n\twaitmessage\n\tpokemart SilphCo_11F_DevonSpy_Items\n\tmsgbox SilphCo_11F_Text_DevonSpyComeBackLater\n\trelease\n\tturnobject 8, DIR_WEST\n\tend\n\nSilphCo_11F_EventScript_DevonSpyFirstTime::\n\tmsgbox SilphCo_11F_Text_DevonSpyFirstTime\n\trelease\n\tfaceplayer\n\tplayse SE_PIN\n\tapplymovement 8, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement 8, Common_Movement_Delay48\n\twaitmovement 0\n\tmsgbox SilphCo_11F_Text_Explain, MSGBOX_YESNO\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq SilphCo_11F_EventScript_DevonSpyFirstTimeNo\nSilphCo_11F_EventScript_DevonSpyFirstTimeYes::\n\tsetflag FLAG_MET_DEVON_SPY\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tmessage SilphCo_11F_Text_DevonSpyAccepted\n\twaitmessage\n\tpokemart SilphCo_11F_DevonSpy_Items\n\tmsgbox SilphCo_11F_Text_DevonSpyComeBackLater\n\trelease\n\tturnobject 8, DIR_WEST\n\tend\n\n\t.align 2\nSilphCo_11F_DevonSpy_Items::\n\t.2byte ITEM_NET_BALL\n\t.2byte ITEM_NEST_BALL\n\t.2byte ITEM_REPEAT_BALL\n\t.2byte ITEM_TIMER_BALL\n\t.2byte ITEM_LUXURY_BALL\n\t.2byte ITEM_DIVE_BALL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nSilphCo_11F_EventScript_DevonSpyFirstTimeNo::\n\tmsgbox SilphCo_11F_Text_DevonSpyComeOn, MSGBOX_YESNO\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq SilphCo_11F_EventScript_DevonSpyFirstTimeNo\n\tgoto SilphCo_11F_EventScript_DevonSpyFirstTimeYes\n\nSilphCo_11F_Text_DevonSpy:\n\t.string \"POKé… TEAR?\\n\"\n\t.string \"Lets TRAINERS make dolls anywhere?\\l\"\n\t.string \"That can't be right…$\"\n\nSilphCo_11F_Text_DevonSpyYoureBack:\n\t.string \"Gah!\\p\"\n\t.string \"I-I'm just checking how sturdy\\n\"\n\t.string \"the walls are!\\p\"\n\t.string \"Oh, it's you again, kid.\\p\"\n\t.string \"I've got the imported POKé BALLS\\n\"\n\t.string \"if you've got the cash.$\"\n\nSilphCo_11F_Text_DevonSpyFirstTime:\n\t.string \"Getting the MASTER BALL research\\n\"\n\t.string \"and development was a huge score…\\p\"\n\t.string \"Bringing back the next big project's\\n\"\n\t.string \"intel will be a massive payday!$\"\n\nSilphCo_11F_Text_Explain:\n\t.string \"Gah!\\p\"\n\t.string \"Where did you come from?\\p\"\n\t.string \"Wait! It's not what you think!\\n\"\n\t.string \"I'm not with TEAM ROCKET!\\p\"\n\t.string \"I work for SILPH, but I also\\n\"\n\t.string \"work for another company that's\\l\"\n\t.string \"based very far away.\\p\"\n\t.string \"They pay me to pass along info\\n\"\n\t.string \"about SILPH's product development.\\p\"\n\t.string \"Listen kid, I've got a good thing\\n\"\n\t.string \"going on for myself here, and I'm\\l\"\n\t.string \"willing to pay for your silence.\\p\"\n\t.string \"Well, more like sell to you at cost\\n\"\n\t.string \"for your silence, hehehe.\\p\"\n\t.string \"I have special POKé BALLS that I\\n\"\n\t.string \"imported from my company abroad.\\p\"\n\t.string \"I'll sell them to you for cheap\\n\"\n\t.string \"if you forget you ever saw me.$\"\n\nSilphCo_11F_Text_DevonSpyComeOn:\n\t.string \"Oh come on, kid.\\n\"\n\t.string \"Help me help you help me.$\"\n\nSilphCo_11F_Text_DevonSpyAccepted:\n\t.string \"Excellent!\\n\"\n\t.string \"You'll love these POKé BALLS, kid.\\p\"\n\t.string \"This is all of them,\\n\"\n\t.string \"which ones are you interested in?$\"\n\nSilphCo_11F_Text_DevonSpyComeBackLater:\n\t.string \"I'll sell these to you anytime as\\n\"\n\t.string \"long as you promise to keep quiet.$\""
  },
  {
    "path": "data/maps/SilphCo_11F/text.inc",
    "content": "SilphCo_11F_Text_ThanksForSavingMeDearBoy::\n    .string \"PRESIDENT: Oh, dear boy!\\n\"\n    .string \"Thank you for saving SILPH.\\p\"\n    .string \"I will never forget you saved us in\\n\"\n    .string \"our moment of peril.\\p\"\n    .string \"I have to thank you in some way.\\p\"\n    .string \"Because I am rich, I can give you\\n\"\n    .string \"anything.\\p\"\n    .string \"Here, maybe this will do.$\"\n\nSilphCo_11F_Text_ThanksForSavingMeDearGirl::\n    .string \"PRESIDENT: Oh, dear girl!\\n\"\n    .string \"Thank you for saving SILPH.\\p\"\n    .string \"I will never forget you saved us in\\n\"\n    .string \"our moment of peril.\\p\"\n    .string \"I have to thank you in some way.\\p\"\n    .string \"Because I am rich, I can give you\\n\"\n    .string \"anything.\\p\"\n    .string \"Here, maybe this will do.$\"\n\nSilphCo_11F_Text_ObtainedMasterBallFromPresident::\n    .string \"{PLAYER} obtained a MASTER BALL\\n\"\n    .string \"from the PRESIDENT!$\"\n\nSilphCo_11F_Text_ThatsOurSecretPrototype::\n    .string \"PRESIDENT: You can't buy that\\n\"\n    .string \"anywhere.\\p\"\n    .string \"It's our secret prototype MASTER\\n\"\n    .string \"BALL.\\p\"\n    .string \"It will catch any POKéMON without\\n\"\n    .string \"fail!\\p\"\n    .string \"You should be quiet about using it,\\n\"\n    .string \"though.$\"\n\nSilphCo_11F_Text_YouHaveNoRoomForThis::\n    .string \"You have no room for this.$\"\n\nSilphCo_11F_Text_ThanksForRescuingUs::\n    .string \"SECRETARY: Thank you for rescuing\\n\"\n    .string \"all of us.\\p\"\n    .string \"We, from the PRESIDENT down,\\n\"\n    .string \"are indebted to you.$\"\n\nSilphCo_11F_Text_GiovanniIntro::\n    .string \"Ah, {PLAYER}!\\n\"\n    .string \"So we meet again!\\p\"\n    .string \"The PRESIDENT and I are discussing\\n\"\n    .string \"a vital business proposition.\\p\"\n    .string \"Keep your nose out of grown-up\\n\"\n    .string \"matters…\\p\"\n    .string \"Or, experience a world of pain!$\"\n\nSilphCo_11F_Text_GiovanniDefeat::\n    .string \"Arrgh!!\\n\"\n    .string \"I lost again!?$\"\n\nSilphCo_11F_Text_GiovanniPostBattle::\n    .string \"Blast it all!\\n\"\n    .string \"You ruined our plans for SILPH!\\p\"\n    .string \"But, TEAM ROCKET will never fall!\\p\"\n    .string \"{PLAYER}! Never forget that all\\n\"\n    .string \"POKéMON exist for TEAM ROCKET!\\p\"\n    .string \"I must go, but I shall return!$\"\n\nSilphCo_11F_Text_Grunt2Intro::\n    .string \"Stop right there!\\n\"\n    .string \"Don't you move!$\"\n\nSilphCo_11F_Text_Grunt2Defeat::\n    .string \"Don't…\\n\"\n    .string \"Please!$\"\n\nSilphCo_11F_Text_Grunt2PostBattle::\n    .string \"So, you want to see my BOSS?$\"\n\nSilphCo_11F_Text_Grunt1Intro::\n    .string \"Halt! Do you have an appointment\\n\"\n    .string \"with my BOSS?$\"\n\nSilphCo_11F_Text_Grunt1Defeat::\n    .string \"Gaah!\\n\"\n    .string \"Demolished!$\"\n\nSilphCo_11F_Text_Grunt1PostBattle::\n    .string \"Watch your step…\\n\"\n    .string \"My BOSS likes his POKéMON tough!$\"\n\nSilphCo_11F_Text_MonitorHasMonsOnIt::\n    .string \"The monitor has POKéMON on it!$\"\n\nSilphCo_11F_Text_FloorSign::\n    .string \"SILPH CO. HEAD OFFICE\\n\"\n    .string \"11F$\"\n\n"
  },
  {
    "path": "data/maps/SilphCo_1F/map.json",
    "content": "{\n  \"id\": \"MAP_SILPH_CO_1F\",\n  \"name\": \"SilphCo_1F\",\n  \"layout\": \"LAYOUT_SILPH_CO_1F\",\n  \"music\": \"MUS_SILPH\",\n  \"region_map_section\": \"MAPSEC_SILPH_CO\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 1,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_1F_EventScript_Receptionist\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_1F_EventScript_CouchWoman\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_1F_EventScript_CouchMan\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_1F_EventScript_WalkingWoman\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_1F_EventScript_CushionMan\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_1F_EventScript_FountainMan\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Kingler\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SAFFRON_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 31,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_2F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 30,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_1F_EventScript_FloorSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_1F_EventScript_Painting\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SilphCo_1F/scripts.inc",
    "content": ".set LOCALID_KINGLER_MASTER, 7\n.set TRAINER, VAR_0x8009\n\nSilphCo_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SilphCo_1F_OnTransition\n\t.byte 0\n\nSilphCo_1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_SILPH_CO_1F\n\tgoto SilphCo_1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nSilphCo_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_KINGLER\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SilphCo_1F_MapScript_KinglerMasterMovementType\n\tend\n\nSilphCo_1F_MapScript_KinglerMasterMovementType::\n\tsetobjectmovementtype LOCALID_KINGLER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nSilphCo_1F_EventScript_Receptionist::\n\tmsgbox SilphCo_1F_Text_WelcomePresidentInBoardroom, MSGBOX_NPC\n\tend\n\nSilphCo_1F_EventScript_FloorSign::\n\tmsgbox SilphCo_1F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nSilphCo_1F_EventScript_CouchWoman::\n\tmsgbox SilphCo_1F_Text_CouchWoman, MSGBOX_NPC\n\tend\n\nSilphCo_1F_Text_CouchWoman:\n\t.string \"I was captured by TEAM ROCKET.\\p\"\n\t.string \"I wonder if our insurance plan\\n\"\n\t.string \"covers that kind of thing…?$\"\n\nSilphCo_1F_EventScript_CouchMan::\n\tmsgbox SilphCo_1F_Text_CouchMan, MSGBOX_NPC\n\tend\n\nSilphCo_1F_Text_CouchMan:\n\t.string \"I heard that the one who took on\\n\"\n\t.string \"TEAM ROCKET was actually some kid!\\p\"\n\t.string \"Wait, could it be you…?\\n\"\n\t.string \"No, no, couldn't be…$\"\n\nSilphCo_1F_EventScript_FountainMan::\n\tmsgbox SilphCo_1F_Text_FountainMan, MSGBOX_NPC\n\tend\n\nSilphCo_1F_Text_FountainMan:\n\t.string \"Any tool can be used for good\\n\"\n\t.string \"or evil, depending on the user.\\p\"\n\t.string \"I shudder to think what would've\\n\"\n\t.string \"happened if TEAM ROCKET had gotten\\l\"\n\t.string \"their hands on SILPH technology…$\"\n\nSilphCo_1F_EventScript_CushionMan::\n\tmsgbox SilphCo_1F_Text_CushionMan, MSGBOX_NPC\n\tend\n\nSilphCo_1F_Text_CushionMan:\n\t.string \"I came back from playing hooky only\\n\"\n\t.string \"to find out the company had been\\l\"\n\t.string \"taken over!\\l\"\n\t.string \"That was quite a surprise, for sure.$\"\n\nSilphCo_1F_EventScript_WalkingWoman::\n\tmsgbox SilphCo_1F_Text_WalkingWoman, MSGBOX_NPC\n\tend\n\nSilphCo_1F_Text_WalkingWoman:\n\t.string \"A lot of work's piled up, so we\\n\"\n\t.string \"need to get cracking!$\"\n\nSilphCo_1F_EventScript_Painting::\n\tgoto_if_unset FLAG_HIDE_SAFFRON_CIVILIANS, SilphCo_1F_EventScript_NewPainting\n\tmsgbox Text_Painting, MSGBOX_SIGN\n\tend\n\nSilphCo_1F_EventScript_NewPainting::\n\tmsgbox SilphCo_1F_Text_NewPainting, MSGBOX_SIGN\n\tend\n\nSilphCo_1F_Text_NewPainting:\n\t.string \"It's a gorgeous painting of a cabin\\n\"\n\t.string \"surrounded by a field of flowers.$\""
  },
  {
    "path": "data/maps/SilphCo_1F/text.inc",
    "content": "SilphCo_1F_Text_WelcomePresidentInBoardroom::\n    .string \"Welcome.\\p\"\n    .string \"The PRESIDENT is in the boardroom\\n\"\n    .string \"on 11F.$\"\n\nSilphCo_1F_Text_FloorSign::\n    .string \"SILPH CO. HEAD OFFICE\\n\"\n    .string \"1F$\"\n\n"
  },
  {
    "path": "data/maps/SilphCo_2F/map.json",
    "content": "{\n  \"id\": \"MAP_SILPH_CO_2F\",\n  \"name\": \"SilphCo_2F\",\n  \"layout\": \"LAYOUT_SILPH_CO_2F\",\n  \"music\": \"MUS_SILPH\",\n  \"region_map_section\": \"MAPSEC_SILPH_CO\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 2,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"SilphCo_2F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"SilphCo_2F_EventScript_Jerry\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SilphCo_2F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_2F_EventScript_Connor\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_2F_EventScript_ThunderWaveTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_2F_EventScript_Scientist\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_2F_EventScript_WorkerF1\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_2F_EventScript_Woman\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_2F_EventScript_WorkerM\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_2F_EventScript_WorkerF2\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 28,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_3F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_3F\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_8F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 30,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_6F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_8F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_2F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_2F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_2F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_2F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_2F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_2F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_2F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_2F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 11,\n      \"y\": 21,\n      \"elevation\": 0,\n      \"item\": \"ITEM_ULTRA_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SILPH_CO_2F_ULTRA_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 29,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_2F_EventScript_FloorSign\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SilphCo_2F/scripts.inc",
    "content": "SilphCo_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, SilphCo_2F_OnLoad\n\t.byte 0\n\nSilphCo_2F_OnLoad::\n\tcall_if_unset FLAG_SILPH_2F_DOOR_1, EventScript_Close2FDoor1\n\tcall_if_unset FLAG_SILPH_2F_DOOR_2, EventScript_Close2FDoor2\n\tend\n\nSilphCo_2F_EventScript_ThunderWaveTutor::\n\tgoto EventScript_ThunderWaveTutor\n\tend\n\nSilphCo_2F_EventScript_FloorSign::\n\tmsgbox SilphCo_2F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nSilphCo_2F_EventScript_Connor::\n\ttrainerbattle_single TRAINER_SCIENTIST_CONNOR, SilphCo_2F_Text_ConnorIntro, SilphCo_2F_Text_ConnorDefeat\n\tmsgbox SilphCo_2F_Text_ConnorPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_2F_EventScript_Jerry::\n\ttrainerbattle_single TRAINER_SCIENTIST_JERRY, SilphCo_2F_Text_JerryIntro, SilphCo_2F_Text_JerryDefeat\n\tmsgbox SilphCo_2F_Text_JerryPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_2F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_23, SilphCo_2F_Text_Grunt1Intro, SilphCo_2F_Text_Grunt1Defeat\n\tmsgbox SilphCo_2F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_2F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_24, SilphCo_2F_Text_Grunt2Intro, SilphCo_2F_Text_Grunt2Defeat\n\tmsgbox SilphCo_2F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_2F_EventScript_Scientist::\n\tmsgbox SilphCo_2F_Text_Scientist, MSGBOX_NPC\n\tend\n\nSilphCo_2F_Text_Scientist:\n\t.string \"Now that we're not working on the\\n\"\n\t.string \"MASTER BALL anymore, we're pivoting\\l\"\n\t.string \"to other projects.$\"\n\nSilphCo_2F_EventScript_WorkerF1::\n\tmsgbox SilphCo_2F_Text_WorkerF1, MSGBOX_NPC\n\tend\n\nSilphCo_2F_Text_WorkerF1:\n\t.string \"Maybe our next product can be a\\n\"\n\t.string \"security system to keep people\\l\"\n\t.string \"like TEAM ROCKET out!$\"\n\nSilphCo_2F_EventScript_WorkerF2::\n\tmsgbox SilphCo_2F_Text_WorkerF2, MSGBOX_NPC\n\tend\n\nSilphCo_2F_Text_WorkerF2:\n\t.string \"Programming is hard work!\\p\"\n\t.string \"Can you imagine how difficult\\n\"\n\t.string \"coding a PORYGON would be?\\p\"\n\t.string \"To create a POKéMON out of\\n\"\n\t.string \"code like that…\\l\"\n\t.string \"It's unbelievable!$\"\n\nSilphCo_2F_EventScript_Woman::\n\tmsgbox SilphCo_2F_Text_Woman, MSGBOX_NPC\n\tend\n\nSilphCo_2F_Text_Woman:\n\t.string \"We're constantly in and out of\\n\"\n\t.string \"meetings all day long.\\p\"\n\t.string \"I wish they would just let me\\n\"\n\t.string \"work in peace…$\"\n\nSilphCo_2F_EventScript_WorkerM::\n\ttextcolor 3\n\tmsgbox SilphCo_2F_Text_WorkerM\n\trelease\n\tend\n\nSilphCo_2F_Text_WorkerM:\n\t.string \"…\\p\"\n\t.string \"He's asleep on the job!$\"\n"
  },
  {
    "path": "data/maps/SilphCo_2F/text.inc",
    "content": "SilphCo_2F_Text_ConnorIntro::\n    .string \"Help!\\n\"\n    .string \"I'm a SILPH employee.$\"\n\nSilphCo_2F_Text_ConnorDefeat::\n    .string \"How did you know\\n\"\n    .string \"I was a ROCKET?$\"\n\nSilphCo_2F_Text_ConnorPostBattle::\n    .string \"I work for both SILPH and TEAM\\n\"\n    .string \"ROCKET.$\"\n\nSilphCo_2F_Text_JerryIntro::\n    .string \"It's off-limits here!\\n\"\n    .string \"Go home!$\"\n\nSilphCo_2F_Text_JerryDefeat::\n    .string \"You're good.$\"\n\nSilphCo_2F_Text_JerryPostBattle::\n    .string \"Can you solve the maze in here?\\n\"\n    .string \"It's not easy, I tell you!$\"\n\nSilphCo_2F_Text_Grunt1Intro::\n    .string \"No kids are allowed in here!$\"\n\nSilphCo_2F_Text_Grunt1Defeat::\n    .string \"Tough!$\"\n\nSilphCo_2F_Text_Grunt1PostBattle::\n    .string \"Diamond-shaped tiles are teleport\\n\"\n    .string \"blocks.\\p\"\n    .string \"They're transporters for this\\n\"\n    .string \"high-tech building.$\"\n\nSilphCo_2F_Text_Grunt2Intro::\n    .string \"Hey, kid!\\n\"\n    .string \"What are you wandering here for?$\"\n\nSilphCo_2F_Text_Grunt2Defeat::\n    .string \"I goofed!$\"\n\nSilphCo_2F_Text_Grunt2PostBattle::\n    .string \"SILPH CO. will be associated with\\n\"\n    .string \"TEAM ROCKET!$\"\n\nText_ThunderWaveTeach::\n    .string \"Eeek!\\n\"\n    .string \"No! Stop! Help!\\p\"\n    .string \"Oh, you're not with TEAM ROCKET.\\n\"\n    .string \"I'm sorry, I thought…\\p\"\n    .string \"Will you forgive me if I teach\\n\"\n    .string \"you the THUNDER WAVE technique?$\"\n\nText_ThunderWaveDeclined::\n    .string \"Oh…\\n\"\n    .string \"But THUNDER WAVE is convenient…$\"\n\nText_ThunderWaveWhichMon::\n    .string \"Which POKéMON should I teach\\n\"\n    .string \"THUNDER WAVE?$\"\n\nText_ThunderWaveTaught::\n    .string \"THUNDER WAVE causes paralysis in\\n\"\n    .string \"the target POKéMON.\\p\"\n    .string \"A paralyzed POKéMON may be unable\\n\"\n    .string \"to move in battle.\\p\"\n    .string \"It's an ELECTRIC-type move, so it\\n\"\n    .string \"won't work on some POKéMON.$\"\n\nText_ThunderWaveReteach::\n    .string \"Eeek!\\n\"\n    .string \"No! Stop! Help!\\p\"\n    .string \"…Oh, it's you again.\\n\"\n    .string \"Sorry, I'm still a little jumpy.\\p\"\n    .string \"I can teach you the THUNDER WAVE\\n\"\n    .string \"technique again if you'd like,\\l\"\n    .string \"but I'd have to charge you ¥5000.$\"\n\nText_ThunderWaveReteach2::\n    .string \"Would you like me to teach you\\n\"\n    .string \"the THUNDER WAVE technique?$\"\n\nText_ThunderWaveNotEnoughMoney::\n    .string \"I'm sorry, it's company policy\\n\"\n    .string \"to charge to teach this move.\\p\"\n    .string \"If I taught it to you for free\\n\"\n    .string \"again, I could get in trouble.\\p\"\n    .string \"Come back when you have ¥5000\\n\"\n    .string \"and I'll teach you THUNDER WAVE.$\"\n\nSilphCo_2F_Text_FloorSign::\n    .string \"SILPH CO. HEAD OFFICE\\n\"\n    .string \"2F$\"\n\n"
  },
  {
    "path": "data/maps/SilphCo_3F/map.json",
    "content": "{\n  \"id\": \"MAP_SILPH_CO_3F\",\n  \"name\": \"SilphCo_3F\",\n  \"layout\": \"LAYOUT_SILPH_CO_3F\",\n  \"music\": \"MUS_SILPH\",\n  \"region_map_section\": \"MAPSEC_SILPH_CO\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 3,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SilphCo_3F_EventScript_Grunt\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_3F_EventScript_WorkerM\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_3F_EventScript_Jose\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_ItemUpGrade\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_UP_GRADE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT\",\n      \"movement_range_x\": 10,\n      \"movement_range_y\": 13,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_3F_EventScript_WorkerMWalking\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_3F_EventScript_WorkerF\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_3F_EventScript_Scientist\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 28,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_5F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_7F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 30,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_4F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_9F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_5F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_3F\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 32,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_3F\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_3F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_3F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 21,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_3F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 21,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_3F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_3F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_3F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 20,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_3F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 20,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_3F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 34,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"item\": \"ITEM_PROTEIN\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SILPH_CO_3F_PROTEIN\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 29,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_3F_EventScript_FloorSign\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SilphCo_3F/scripts.inc",
    "content": "SilphCo_3F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, SilphCo_3F_OnLoad\n\t.byte 0\n\nSilphCo_3F_OnLoad::\n\tcall_if_unset FLAG_SILPH_3F_DOOR_1, EventScript_Close3FDoor1\n\tcall_if_unset FLAG_SILPH_3F_DOOR_2, EventScript_Close3FDoor2\n\tend\n\nSilphCo_3F_EventScript_WorkerM::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_3F_EventScript_WorkerMRocketsGone\n\tmsgbox SilphCo_3F_Text_WhatAmIToDo\n\trelease\n\tend\n\nSilphCo_3F_EventScript_WorkerMRocketsGone::\n\tmsgbox SilphCo_3F_Text_YouAndYourMonsSavedUs\n\trelease\n\tend\n\nSilphCo_3F_EventScript_FloorSign::\n\tmsgbox SilphCo_3F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nSilphCo_3F_EventScript_Jose::\n\ttrainerbattle_single TRAINER_SCIENTIST_JOSE, SilphCo_3F_Text_JoseIntro, SilphCo_3F_Text_JoseDefeat\n\tmsgbox SilphCo_3F_Text_JosePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_3F_EventScript_Grunt::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_25, SilphCo_3F_Text_GruntIntro, SilphCo_3F_Text_GruntDefeat\n\tmsgbox SilphCo_3F_Text_GruntPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_3F_EventScript_WorkerMWalking::\n\tmsgbox SilphCo_3F_Text_WorkerMWalking, MSGBOX_NPC\n\tend\n\nSilphCo_3F_Text_WorkerMWalking:\n\t.string \"Sometimes, when I get stuck on\\n\"\n\t.string \"a problem, I stroll the office.\\p\"\n\t.string \"If you put on a serious face and\\n\"\n\t.string \"walk fast, people think you're\\l\"\n\t.string \"doing something important!$\"\n\nSilphCo_3F_EventScript_WorkerF::\n\tmsgbox SilphCo_3F_Text_WorkerF, MSGBOX_NPC\n\tend\n\nSilphCo_3F_Text_WorkerF:\n\t.string \"To be honest, I kind of miss\\n\"\n\t.string \"TEAM ROCKET.\\p\"\n\t.string \"It was scary, but at least I\\n\"\n\t.string \"had an excuse to not work.$\"\n\nSilphCo_3F_EventScript_Scientist::\n\tlock\n\tmsgbox SilphCo_3F_Text_Scientist\n\trelease\n\tmsgbox SilphCo_3F_Text_Scientist2, MSGBOX_NPC\n\tturnobject 7, DIR_NORTH\n\tend\n\nSilphCo_3F_Text_Scientist:\n\t.string \"Uh huh…\\n\"\n\t.string \"No, of course not!\\l\"\n\t.string \"There's no way that'd work…\\p\"\n\t.string \"…Unless…\\p\"\n\t.string \"I have to run this by the team.\\n\"\n\t.string \"I'll call you back.$\"\n\nSilphCo_3F_Text_Scientist2::\n\t.string \"Excuse me, I have to make\\n\"\n\t.string \"another phone call.$\""
  },
  {
    "path": "data/maps/SilphCo_3F/text.inc",
    "content": "SilphCo_3F_Text_WhatAmIToDo::\n    .string \"I work for SILPH CO.\\n\"\n    .string \"What am I to do?$\"\n\nSilphCo_3F_Text_YouAndYourMonsSavedUs::\n    .string \"{PLAYER}!\\n\"\n    .string \"You and your POKéMON saved us!$\"\n\nSilphCo_3F_Text_GruntIntro::\n    .string \"Quit messing with us, kid!$\"\n\nSilphCo_3F_Text_GruntDefeat::\n    .string \"I give up!$\"\n\nSilphCo_3F_Text_GruntPostBattle::\n    .string \"A hint? You can open doors with\\n\"\n    .string \"a CARD KEY!$\"\n\nSilphCo_3F_Text_JoseIntro::\n    .string \"I support TEAM ROCKET more than\\n\"\n    .string \"I support SILPH CO.!$\"\n\nSilphCo_3F_Text_JoseDefeat::\n    .string \"You really got me!$\"\n\nSilphCo_3F_Text_JosePostBattle::\n    .string \"Humph…\\p\"\n    .string \"TEAM ROCKET said that if I helped\\n\"\n    .string \"them, they'd let me study POKéMON.$\"\n\nSilphCo_3F_Text_FloorSign::\n    .string \"SILPH CO. HEAD OFFICE\\n\"\n    .string \"3F$\"\n\n"
  },
  {
    "path": "data/maps/SilphCo_4F/map.json",
    "content": "{\n  \"id\": \"MAP_SILPH_CO_4F\",\n  \"name\": \"SilphCo_4F\",\n  \"layout\": \"LAYOUT_SILPH_CO_4F\",\n  \"music\": \"MUS_SILPH\",\n  \"region_map_section\": \"MAPSEC_SILPH_CO\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 4,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SilphCo_4F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"SilphCo_4F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SilphCo_4F_EventScript_Rodney\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_4F_EventScript_WorkerM\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_4F_EventScript_ItemMaxRevive\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_4F_MAX_REVIVE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_4F_EventScript_ItemEscapeRope\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_4F_ESCAPE_ROPE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_4F_EventScript_ItemFullHeal\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_4F_FULL_HEAL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"FiveIsland_RocketWarehouse_EventScript_ItemTM36\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_TM36\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_4F_EventScript_BaldingMan\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_4F_EventScript_WorkerF\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_4F_EventScript_Scientist\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_4F_EventScript_WorkerM2\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BLACK_BELT\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Machop\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 28,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_5F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_6F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 30,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_3F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_10F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_10F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_10F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_4F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_4F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_4F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_4F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_4F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_4F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_4F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_4F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 35,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"item\": \"ITEM_IRON\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SILPH_CO_4F_IRON\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 29,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_4F_EventScript_FloorSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_4F_EventScript_Painting\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_4F_EventScript_Painting\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SilphCo_4F/scripts.inc",
    "content": ".set LOCALID_MACHOP_MASTER, 13\n.set TRAINER, VAR_0x8009\n\nSilphCo_4F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, SilphCo_4F_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SilphCo_4F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nSilphCo_4F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_MACHOP\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, SilphCo_4F_MapScript_MachopMasterMovementType\n\tend\n\nSilphCo_4F_MapScript_MachopMasterMovementType::\n\tsetobjectmovementtype LOCALID_MACHOP_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nSilphCo_4F_OnLoad::\n\tcall_if_unset FLAG_SILPH_4F_DOOR_1, EventScript_Close4FDoor1\n\tcall_if_unset FLAG_SILPH_4F_DOOR_2, EventScript_Close4FDoor2\n\tend\n\nSilphCo_4F_EventScript_WorkerM::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_4F_EventScript_WorkerMRocketsGone\n\tmsgbox SilphCo_4F_Text_CantYouSeeImHiding\n\trelease\n\tend\n\nSilphCo_4F_EventScript_WorkerMRocketsGone::\n\tmsgbox SilphCo_4F_Text_TeamRocketIsGone\n\trelease\n\tend\n\nSilphCo_4F_EventScript_FloorSign::\n\tmsgbox SilphCo_4F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nSilphCo_4F_EventScript_Rodney::\n\ttrainerbattle_single TRAINER_SCIENTIST_RODNEY, SilphCo_4F_Text_RodneyIntro, SilphCo_4F_Text_RodneyDefeat\n\tmsgbox SilphCo_4F_Text_RodneyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_4F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_26, SilphCo_4F_Text_Grunt1Intro, SilphCo_4F_Text_Grunt1Defeat\n\tmsgbox SilphCo_4F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_4F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_27, SilphCo_4F_Text_Grunt2Intro, SilphCo_4F_Text_Grunt2Defeat\n\tmsgbox SilphCo_4F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_4F_EventScript_BaldingMan::\n\tmsgbox SilphCo_4F_Text_BaldingMan, MSGBOX_NPC\n\tend\n\nSilphCo_4F_Text_BaldingMan:\n\t.string \"My office mate brings the most\\n\"\n\t.string \"disgusting-smelling food.\\p\"\n\t.string \"I wish she would take her lunch\\n\"\n\t.string \"break somewhere else.$\"\n\nSilphCo_4F_EventScript_WorkerF::\n\tmsgbox SilphCo_4F_Text_WorkerF, MSGBOX_NPC\n\tend\n\nSilphCo_4F_Text_WorkerF:\n\t.string \"Between you and me, I'm trying\\n\"\n\t.string \"to impress my office mate.\\p\"\n\t.string \"He's due for a promotion, and I\\n\"\n\t.string \"want to be the first one he thinks\\l\"\n\t.string \"to promote!$\"\n\nSilphCo_4F_EventScript_WorkerM2::\n\tmsgbox SilphCo_4F_Text_WorkerM2, MSGBOX_NPC\n\tend\n\nSilphCo_4F_Text_WorkerM2:\n\t.string \"I'm on my break, kid.\\n\"\n\t.string \"I can't give you a tour now.$\"\n\nSilphCo_4F_EventScript_Scientist::\n\tmsgbox SilphCo_4F_Text_Scientist, MSGBOX_NPC\n\tend\n\nSilphCo_4F_Text_Scientist:\n\t.string \"What? Why are you looking at\\n\"\n\t.string \"me like that?\\p\"\n\t.string \"There was a TEAM ROCKET SCIENTIST\\n\"\n\t.string \"in here during the takeover?\\p\"\n\t.string \"Well, I'm obviously not him.\\n\"\n\t.string \"We must look completely different.$\"\n\nSilphCo_4F_EventScript_Painting::\n\tgoto_if_unset FLAG_HIDE_SAFFRON_CIVILIANS, SilphCo_4F_EventScript_NewPainting\n\tmsgbox Text_Painting, MSGBOX_SIGN\n\tend\n\nSilphCo_4F_EventScript_NewPainting::\n\tmsgbox SilphCo_4F_Text_NewPainting, MSGBOX_SIGN\n\tend\n\nSilphCo_4F_Text_NewPainting:\n\t.string \"It's a gorgeous painting of a POKéMON\\n\"\n\t.string \"swimming in an underwater paradise.$\"\n"
  },
  {
    "path": "data/maps/SilphCo_4F/text.inc",
    "content": "SilphCo_4F_Text_CantYouSeeImHiding::\n    .string \"Sssh!\\n\"\n    .string \"Can't you see I'm hiding?$\"\n\nSilphCo_4F_Text_TeamRocketIsGone::\n    .string \"Huh?\\n\"\n    .string \"TEAM ROCKET is gone?$\"\n\nSilphCo_4F_Text_Grunt1Intro::\n    .string \"TEAM ROCKET has taken control\\n\"\n    .string \"of SILPH CO.!$\"\n\nSilphCo_4F_Text_Grunt1Defeat::\n    .string \"Arrgh!$\"\n\nSilphCo_4F_Text_Grunt1PostBattle::\n    .string \"Fwahahaha!\\n\"\n    .string \"My BOSS has been after this place!$\"\n\nSilphCo_4F_Text_RodneyIntro::\n    .string \"My POKéMON is my loyal servant.$\"\n\nSilphCo_4F_Text_RodneyDefeat::\n    .string \"Darn!\\n\"\n    .string \"You weak POKéMON!$\"\n\nSilphCo_4F_Text_RodneyPostBattle::\n    .string \"The doors are electronically\\n\"\n    .string \"locked.\\p\"\n    .string \"It takes a CARD KEY to open the\\n\"\n    .string \"doors here.$\"\n\nSilphCo_4F_Text_Grunt2Intro::\n    .string \"Intruder spotted!$\"\n\nSilphCo_4F_Text_Grunt2Defeat::\n    .string \"Who are you?$\"\n\nSilphCo_4F_Text_Grunt2PostBattle::\n    .string \"I better tell the BOSS on 11F!$\"\n\nSilphCo_4F_Text_FloorSign::\n    .string \"SILPH CO. HEAD OFFICE\\n\"\n    .string \"4F$\"\n\n"
  },
  {
    "path": "data/maps/SilphCo_5F/map.json",
    "content": "{\n  \"id\": \"MAP_SILPH_CO_5F\",\n  \"name\": \"SilphCo_5F\",\n  \"layout\": \"LAYOUT_SILPH_CO_5F\",\n  \"music\": \"MUS_SILPH\",\n  \"region_map_section\": \"MAPSEC_SILPH_CO\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 5,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SilphCo_5F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_JUGGLER\",\n      \"x\": 23,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"SilphCo_5F_EventScript_Dalton\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_5F_EventScript_WorkerM\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SilphCo_5F_EventScript_Beau\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SilphCo_5F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_5F_EventScript_ItemProtein\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_5F_PROTEIN\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_5F_EventScript_ItemTM01\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_5F_TM01\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_5F_EventScript_ItemCardKey\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_5F_CARD_KEY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_5F_EventScript_Scientist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_5F_EventScript_WorkerM2\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_5F_EventScript_Scientist2\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_5F_EventScript_WorkerF\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 28,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_4F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_3F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 30,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_6F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_9F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_3F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_7F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 13,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"item\": \"ITEM_ELIXIR\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SILPH_CO_5F_ELIXIR\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 19,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_Door3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 19,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_Door3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 18,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_Door3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 18,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_Door3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 28,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_PokemonReport3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 30,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_PokemonReport2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 25,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_PokemonReport1\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 32,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"item\": \"ITEM_PP_UP\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SILPH_CO_5F_PP_UP\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 29,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_5F_EventScript_FloorSign\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SilphCo_5F/scripts.inc",
    "content": "SilphCo_5F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, SilphCo_5F_OnLoad\n\t.byte 0\n\nSilphCo_5F_OnLoad::\n\tcall_if_unset FLAG_SILPH_5F_DOOR_1, EventScript_Close5FDoor1\n\tcall_if_unset FLAG_SILPH_5F_DOOR_2, EventScript_Close5FDoor2\n\tcall_if_unset FLAG_SILPH_5F_DOOR_3, EventScript_Close5FDoor3\n\tcall_if_unset FLAG_HIDE_SAFFRON_CIVILIANS, SilphCo_5F_EventScript_ScientistMovementType\n\tend\n\nSilphCo_5F_EventScript_ScientistMovementType::\n\tsetobjectmovementtype 9, MOVEMENT_TYPE_WANDER_AROUND\n\treturn\n\nSilphCo_5F_EventScript_WorkerM::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_5F_EventScript_WorkerMRocketsGone\n\tmsgbox SilphCo_5F_Text_RocketsInUproarAboutIntruder\n\trelease\n\tend\n\nSilphCo_5F_EventScript_WorkerMRocketsGone::\n\tmsgbox SilphCo_5F_Text_YoureOurHeroThankYou\n\trelease\n\tend\n\nSilphCo_5F_EventScript_PokemonReport1::\n\tmsgbox SilphCo_5F_Text_PorygonFirstVRMon, MSGBOX_SIGN\n\tend\n\nSilphCo_5F_EventScript_PokemonReport2::\n\tmsgbox SilphCo_5F_Text_Over350TechniquesConfirmed, MSGBOX_SIGN\n\tend\n\nSilphCo_5F_EventScript_PokemonReport3::\n\tmsgbox SilphCo_5F_Text_SomeMonsEvolveWhenTraded, MSGBOX_SIGN\n\tend\n\nSilphCo_5F_EventScript_FloorSign::\n\tmsgbox SilphCo_5F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nSilphCo_5F_EventScript_Beau::\n\ttrainerbattle_single TRAINER_SCIENTIST_BEAU, SilphCo_5F_Text_BeauIntro, SilphCo_5F_Text_BeauDefeat\n\tmsgbox SilphCo_5F_Text_BeauPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_5F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_28, SilphCo_5F_Text_Grunt1Intro, SilphCo_5F_Text_Grunt1Defeat\n\tmsgbox SilphCo_5F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_5F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_29, SilphCo_5F_Text_Grunt2Intro, SilphCo_5F_Text_Grunt2Defeat\n\tmsgbox SilphCo_5F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_5F_EventScript_Dalton::\n\ttrainerbattle_single TRAINER_JUGGLER_DALTON, SilphCo_5F_Text_DaltonIntro, SilphCo_5F_Text_DaltonDefeat\n\tmsgbox SilphCo_5F_Text_DaltonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_5F_EventScript_WorkerM2::\n\tmsgbox SilphCo_5F_Text_WorkerM2, MSGBOX_NPC\n\tend\n\nSilphCo_5F_Text_WorkerM2:\n\t.string \"Synergy!\\n\"\n\t.string \"Disruption!\\l\"\n\t.string \"Paradigm shift!$\"\n\nSilphCo_5F_EventScript_WorkerF::\n\tmsgbox SilphCo_5F_Text_WorkerF, MSGBOX_NPC\n\tend\n\nSilphCo_5F_Text_WorkerF:\n\t.string \"Is it just me or is this guy\\n\"\n\t.string \"not actually saying anything?$\"\n\nSilphCo_5F_EventScript_Scientist2::\n\tmsgbox SilphCo_5F_Text_Scientist2, MSGBOX_NPC\n\tend\n\nSilphCo_5F_Text_Scientist2:\n\t.string \"He-he's a visionary!\\n\"\n\t.string \"I've got to take notes!$\""
  },
  {
    "path": "data/maps/SilphCo_5F/text.inc",
    "content": "SilphCo_5F_Text_RocketsInUproarAboutIntruder::\n    .string \"TEAM ROCKET is in an uproar over\\n\"\n    .string \"some intruder.\\p\"\n    .string \"That's you, right?$\"\n\nSilphCo_5F_Text_YoureOurHeroThankYou::\n    .string \"TEAM ROCKET took off!\\n\"\n    .string \"You're our hero! Thank you!$\"\n\nSilphCo_5F_Text_Grunt1Intro::\n    .string \"I heard a kid was wandering\\n\"\n    .string \"around.$\"\n\nSilphCo_5F_Text_Grunt1Defeat::\n    .string \"Boom!$\"\n\nSilphCo_5F_Text_Grunt1PostBattle::\n    .string \"It's not smart to pick a fight with\\n\"\n    .string \"TEAM ROCKET!$\"\n\nSilphCo_5F_Text_BeauIntro::\n    .string \"We study POKé BALL technology on\\n\"\n    .string \"this floor.$\"\n\nSilphCo_5F_Text_BeauDefeat::\n    .string \"Dang!\\n\"\n    .string \"Blast it!$\"\n\nSilphCo_5F_Text_BeauPostBattle::\n    .string \"We worked on the ultimate POKé\\n\"\n    .string \"BALL which would catch anything.$\"\n\nSilphCo_5F_Text_DaltonIntro::\n    .string \"Whaaat?\\p\"\n    .string \"There shouldn't be any children\\n\"\n    .string \"here!$\"\n\nSilphCo_5F_Text_DaltonDefeat::\n    .string \"Oh, goodness!$\"\n\nSilphCo_5F_Text_DaltonPostBattle::\n    .string \"You're only on 5F.\\n\"\n    .string \"It's a long way to my BOSS!$\"\n\nSilphCo_5F_Text_Grunt2Intro::\n    .string \"Show TEAM ROCKET a little respect!$\"\n\nSilphCo_5F_Text_Grunt2Defeat::\n    .string \"Cough…\\n\"\n    .string \"Cough…$\"\n\nSilphCo_5F_Text_Grunt2PostBattle::\n    .string \"Which reminds me.\\p\"\n    .string \"KOFFING evolves into WEEZING!$\"\n\nSilphCo_5F_Text_PorygonFirstVRMon::\n    .string \"It's a POKéMON REPORT!\\p\"\n    .string \"POKéMON LAB created PORYGON,\\n\"\n    .string \"the first virtual-reality POKéMON.$\"\n\nSilphCo_5F_Text_Over350TechniquesConfirmed::\n    .string \"It's a POKéMON REPORT!\\p\"\n    .string \"Over 350 POKéMON techniques have\\n\"\n    .string \"been confirmed.$\"\n\nSilphCo_5F_Text_SomeMonsEvolveWhenTraded::\n    .string \"It's a POKéMON REPORT!\\p\"\n    .string \"Some POKéMON have been confirmed\\n\"\n    .string \"to evolve when they are traded.$\"\n\nSilphCo_5F_Text_FloorSign::\n    .string \"SILPH CO. HEAD OFFICE\\n\"\n    .string \"5F$\"\n\nSilphCo_5F_Text_RocketBossLookingForStrongMons::\n    .string \"Those thugs that took over our\\n\"\n    .string \"building…\\p\"\n    .string \"Their BOSS said he was looking for\\n\"\n    .string \"strong POKéMON.\\p\"\n    .string \"I hope our PRESIDENT managed to\\n\"\n    .string \"avoid trouble…$\"\n"
  },
  {
    "path": "data/maps/SilphCo_6F/map.json",
    "content": "{\n  \"id\": \"MAP_SILPH_CO_6F\",\n  \"name\": \"SilphCo_6F\",\n  \"layout\": \"LAYOUT_SILPH_CO_6F\",\n  \"music\": \"MUS_SILPH\",\n  \"region_map_section\": \"MAPSEC_SILPH_CO\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 6,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SilphCo_6F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_6F_EventScript_WorkerM1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_6F_EventScript_WorkerF1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_6F_EventScript_WorkerM2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_6F_EventScript_WorkerM3\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_6F_EventScript_WorkerF2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"SilphCo_6F_EventScript_Taylor\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_6F_EventScript_ItemHPUp\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_6F_HP_UP\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_6F_EventScript_ItemXSpecial\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_6F_X_SPECIAL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SilphCo_6F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_6F_EventScript_SuperNerd\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 14,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_7F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_2F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 26,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_5F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_4F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_6F_EventScript_Door\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_6F_EventScript_Door\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 15,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_6F_EventScript_Door\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_6F_EventScript_Door\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 1,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"item\": \"ITEM_CARBOS\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SILPH_CO_6F_CARBOS\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 25,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_6F_EventScript_FloorSign\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SilphCo_6F/scripts.inc",
    "content": "SilphCo_6F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, SilphCo_6F_OnLoad\n\t.byte 0\n\nSilphCo_6F_OnLoad::\n\tcall_if_unset FLAG_SILPH_6F_DOOR, EventScript_Close6FDoor\n\tend\n\nSilphCo_6F_EventScript_WorkerM2::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_6F_EventScript_WorkerM2RocketsGone\n\tmsgbox SilphCo_6F_Text_TargetedSilphForOurMonProducts\n\trelease\n\tend\n\nSilphCo_6F_EventScript_WorkerM2RocketsGone::\n\tmsgbox SilphCo_6F_Text_ComeWorkForSilphWhenYoureOlder\n\trelease\n\tend\n\nSilphCo_6F_EventScript_WorkerM3::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_6F_EventScript_WorkerM3RocketsGone\n\tmsgbox SilphCo_6F_Text_RocketsTookOverBuilding\n\trelease\n\tend\n\nSilphCo_6F_EventScript_WorkerM3RocketsGone::\n\tmsgbox SilphCo_6F_Text_BetterGetBackToWork\n\trelease\n\tend\n\nSilphCo_6F_EventScript_WorkerM1::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_6F_EventScript_WorkerM1RocketsGone\n\tmsgbox SilphCo_6F_Text_HelpMePlease\n\trelease\n\tend\n\nSilphCo_6F_EventScript_WorkerM1RocketsGone::\n\tmsgbox SilphCo_6F_Text_WeGotEngaged\n\trelease\n\tend\n\nSilphCo_6F_EventScript_WorkerF1::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_6F_EventScript_WorkerF1RocketsGone\n\tmsgbox SilphCo_6F_Text_ThatManIsSuchACoward\n\trelease\n\tend\n\nSilphCo_6F_EventScript_WorkerF1RocketsGone::\n\tmsgbox SilphCo_6F_Text_NeedsMeToLookAfterHim\n\trelease\n\tend\n\nSilphCo_6F_EventScript_WorkerF2::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_6F_EventScript_WorkerF2RocketsGone\n\tmsgbox SilphCo_6F_Text_RocketsTryingToConquerWorld\n\trelease\n\tend\n\nSilphCo_6F_EventScript_WorkerF2RocketsGone::\n\tmsgbox SilphCo_6F_Text_RocketsRanAwayBecauseOfYou\n\trelease\n\tend\n\nSilphCo_6F_EventScript_FloorSign::\n\tmsgbox SilphCo_6F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nSilphCo_6F_EventScript_Taylor::\n\ttrainerbattle_single TRAINER_SCIENTIST_TAYLOR, SilphCo_6F_Text_TaylorIntro, SilphCo_6F_Text_TaylorDefeat\n\tmsgbox SilphCo_6F_Text_TaylorPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_6F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_30, SilphCo_6F_Text_Grunt1Intro, SilphCo_6F_Text_Grunt1Defeat\n\tmsgbox SilphCo_6F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_6F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_31, SilphCo_6F_Text_Grunt2Intro, SilphCo_6F_Text_Grunt2Defeat\n\tmsgbox SilphCo_6F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_6F_EventScript_SuperNerd::\n\tmsgbox SilphCo_6F_Text_SuperNerd, MSGBOX_NPC\n\tend\n\nSilphCo_6F_Text_SuperNerd:\n\t.string \"I am one of the four SILPH\\n\"\n    .string \"BROTHERS!\\p\"\n\t.string \"I make sure the company inventory\\n\"\n\t.string \"counts are correct!$\"\n"
  },
  {
    "path": "data/maps/SilphCo_6F/text.inc",
    "content": "SilphCo_6F_Text_RocketsTookOverBuilding::\n    .string \"The ROCKETS came and took over\\n\"\n    .string \"the building!$\"\n\nSilphCo_6F_Text_BetterGetBackToWork::\n    .string \"Well, better get back to work.$\"\n\nSilphCo_6F_Text_HelpMePlease::\n    .string \"Oh dear, oh dear.\\n\"\n    .string \"Help me, please!$\"\n\nSilphCo_6F_Text_WeGotEngaged::\n    .string \"We got engaged.\\n\"\n    .string \"Heheh!$\"\n\nSilphCo_6F_Text_ThatManIsSuchACoward::\n    .string \"That man next to me…\\n\"\n    .string \"He's such a coward!$\"\n\nSilphCo_6F_Text_NeedsMeToLookAfterHim::\n    .string \"He's so helpless, he needs\\n\"\n    .string \"someone like me to look after him.$\"\n\nSilphCo_6F_Text_RocketsTryingToConquerWorld::\n    .string \"TEAM ROCKET is trying to conquer\\n\"\n    .string \"the world with POKéMON.$\"\n\nSilphCo_6F_Text_RocketsRanAwayBecauseOfYou::\n    .string \"TEAM ROCKET ran away, and it's all\\n\"\n    .string \"because of you!$\"\n\nSilphCo_6F_Text_TargetedSilphForOurMonProducts::\n    .string \"They must have targeted SILPH for\\n\"\n    .string \"our POKéMON products.$\"\n\nSilphCo_6F_Text_ComeWorkForSilphWhenYoureOlder::\n    .string \"Come work for SILPH when you\\n\"\n    .string \"get older.$\"\n\nSilphCo_6F_Text_Grunt1Intro::\n    .string \"I am one of the four ROCKET\\n\"\n    .string \"BROTHERS!$\"\n\nSilphCo_6F_Text_Grunt1Defeat::\n    .string \"Flame out!$\"\n\nSilphCo_6F_Text_Grunt1PostBattle::\n    .string \"No matter!\\n\"\n    .string \"My brothers will avenge me!$\"\n\nSilphCo_6F_Text_TaylorIntro::\n    .string \"That rotten PRESIDENT!\\p\"\n    .string \"Serves him right for shipping me\\n\"\n    .string \"off to the TIKSI BRANCH!\\p\"\n    .string \"That's why TEAM ROCKET came after\\n\"\n    .string \"us, I'm sure of it!$\"\n\nSilphCo_6F_Text_TaylorDefeat::\n    .string \"Shoot!$\"\n\nSilphCo_6F_Text_TaylorPostBattle::\n    .string \"TIKSI BRANCH?\\n\"\n    .string \"It's in Russian no-man's-land!$\"\n\nSilphCo_6F_Text_Grunt2Intro::\n    .string \"You dare betray TEAM ROCKET?$\"\n\nSilphCo_6F_Text_Grunt2Defeat::\n    .string \"You traitor!$\"\n\nSilphCo_6F_Text_Grunt2PostBattle::\n    .string \"If you stand for justice, you\\n\"\n    .string \"betray us bad guys!$\"\n\nSilphCo_6F_Text_FloorSign::\n    .string \"SILPH CO. HEAD OFFICE\\n\"\n    .string \"6F$\"\n\n"
  },
  {
    "path": "data/maps/SilphCo_7F/map.json",
    "content": "{\n  \"id\": \"MAP_SILPH_CO_7F\",\n  \"name\": \"SilphCo_7F\",\n  \"layout\": \"LAYOUT_SILPH_CO_7F\",\n  \"music\": \"MUS_SILPH\",\n  \"region_map_section\": \"MAPSEC_SILPH_CO\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 7,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLUE\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_SILPH_RIVAL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_7F_EventScript_LaprasGuy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"SilphCo_7F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SilphCo_7F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SilphCo_7F_EventScript_Grunt3\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_7F_EventScript_WorkerF\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_7F_EventScript_WorkerM1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_7F_EventScript_WorkerM2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SilphCo_7F_EventScript_Joshua\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_7F_EventScript_ItemCalcium\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_7F_CALCIUM\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_7F_EventScript_ItemTM08\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_7F_TM08\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_7F_EventScript_WorkerBro\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_7F_EventScript_WorkerFPhone\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 19,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_6F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_11F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_5F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 27,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_8F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_3F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 23,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_SILPH_CO_7F\",\n      \"var_value\": \"0\",\n      \"script\": \"SilphCo_7F_EventScript_RivalTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_SILPH_CO_7F\",\n      \"var_value\": \"0\",\n      \"script\": \"SilphCo_7F_EventScript_RivalTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 11,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 24,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 25,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 25,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 24,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 25,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Door3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 26,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Door3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 25,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Door3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 26,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Door3\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 22,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"item\": \"ITEM_ZINC\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SILPH_CO_7F_ZINC\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 20,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_FloorSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Painting\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 14,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_7F_EventScript_Painting\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SilphCo_7F/scripts.inc",
    "content": ".set LOCALID_RIVAL,     1\n.set LOCALID_WORKER_M2, 8\n\nSilphCo_7F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, SilphCo_7F_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SilphCo_7F_OnTransition\n\t.byte 0\n\nSilphCo_7F_OnLoad::\n\tcall_if_unset FLAG_SILPH_7F_DOOR_1, EventScript_Close7FDoor1\n\tcall_if_unset FLAG_SILPH_7F_DOOR_2, EventScript_Close7FDoor2\n\tcall_if_unset FLAG_SILPH_7F_DOOR_3, EventScript_Close7FDoor3\n\tend\n\nSilphCo_7F_OnTransition::\n\tcall_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_7F_EventScript_SetObjRocketsGone\n\tend\n\nSilphCo_7F_EventScript_SetObjRocketsGone::\n\tsetobjectmovementtype LOCALID_WORKER_M2, MOVEMENT_TYPE_FACE_UP\n\treturn\n\nSilphCo_7F_EventScript_RivalTriggerTop::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto SilphCo_7F_EventScript_RivalScene\n\tend\n\nSilphCo_7F_EventScript_RivalTriggerBottom::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto SilphCo_7F_EventScript_RivalScene\n\tend\n\nSilphCo_7F_EventScript_RivalScene::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\tapplymovement LOCALID_RIVAL, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement LOCALID_RIVAL, Common_Movement_Delay48\n\twaitmovement 0\n\tmsgbox SilphCo_7F_Text_RivalWhatKeptYou\n\tcall_if_eq VAR_TEMP_1, 0, SilphCo_7F_EventScript_RivalApproachTop\n\tcall_if_eq VAR_TEMP_1, 1, SilphCo_7F_EventScript_RivalApproachBottom\n\tmsgbox SilphCo_7F_Text_RivalIntro\n\tsetvar VAR_LAST_TALKED, LOCALID_RIVAL\n\tcall_if_eq VAR_STARTER_MON, 2, SilphCo_7F_EventScript_RivalSquirtle\n\tcall_if_eq VAR_STARTER_MON, 1, SilphCo_7F_EventScript_RivalBulbasaur\n\tcall_if_eq VAR_STARTER_MON, 0, SilphCo_7F_EventScript_RivalCharmander\n\tmsgbox SilphCo_7F_Text_RivalPostBattle\n\tclosemessage\n\tplaybgm MUS_RIVAL_EXIT, 0\n\tcall_if_eq VAR_TEMP_1, 0, SilphCo_7F_EventScript_RivalExitTop\n\tcall_if_eq VAR_TEMP_1, 1, SilphCo_7F_EventScript_RivalExitBottom\n\tcall SilphCo_7F_EventScript_RivalGivesLinkBracelet\n\tplayse SE_WARP_IN\n\tfadedefaultbgm\n\tremoveobject LOCALID_RIVAL\n\twaitse\n\tsetvar VAR_MAP_SCENE_SILPH_CO_7F, 1\n\treleaseall\n\tend\n\nSilphCo_7F_EventScript_RivalApproachTop::\n\tclosemessage\n\tapplymovement LOCALID_RIVAL, SilphCo_7F_Movement_RivalApproachTop\n\twaitmovement 0\n\treturn\n\nSilphCo_7F_EventScript_RivalApproachBottom::\n\treturn\n\nSilphCo_7F_EventScript_RivalSquirtle::\n\ttrainerbattle_no_intro TRAINER_RIVAL_SILPH_SQUIRTLE, SilphCo_7F_Text_RivalDefeat\n\treturn\n\nSilphCo_7F_EventScript_RivalBulbasaur::\n\ttrainerbattle_no_intro TRAINER_RIVAL_SILPH_BULBASAUR, SilphCo_7F_Text_RivalDefeat\n\treturn\n\nSilphCo_7F_EventScript_RivalCharmander::\n\ttrainerbattle_no_intro TRAINER_RIVAL_SILPH_CHARMANDER, SilphCo_7F_Text_RivalDefeat\n\treturn\n\nSilphCo_7F_EventScript_RivalExitTop::\n\tapplymovement LOCALID_RIVAL, SilphCo_7F_Movement_RivalExitTop\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n    waitmovement 0\n\treturn\n\nSilphCo_7F_EventScript_RivalExitBottom::\n\tapplymovement LOCALID_RIVAL, SilphCo_7F_Movement_RivalExitBottom\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n    waitmovement 0\n\treturn\n\nSilphCo_7F_Movement_RivalApproachTop::\n\twalk_up\n\tstep_end\n\nSilphCo_7F_Movement_RivalExitTop::\n\twalk_right\n\twalk_right\n\twalk_right\n\tdelay_16\n\tface_left\n\tdelay_16\n\twalk_left\n\twalk_up\n\twalk_left\n\tstep_end\n\nSilphCo_7F_Movement_RivalExitBottom::\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_right\n\twalk_right\n\twalk_right\n\tdelay_16\n\tface_left\n\tdelay_16\n\twalk_left\n\twalk_left\n\tface_down\n\tstep_end\n\nSilphCo_7F_EventScript_LaprasGuy::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_LAPRAS_FROM_SILPH, SilphCo_7F_EventScript_AlreadyGotLapras\n\tmsgbox SilphCo_7F_Text_HaveMonForSavingUs\n\tsetvar VAR_TEMP_1, SPECIES_LAPRAS\n\tgivemon SPECIES_LAPRAS, 25\n\tgoto_if_eq VAR_RESULT, 0, SilphCo_7F_EventScript_ReceiveLaprasParty\n\tgoto_if_eq VAR_RESULT, 1, SilphCo_7F_EventScript_ReceiveLaprasPC\n\tgoto_if_eq VAR_RESULT, 2, EventScript_NoMoreRoomForPokemon\n\trelease\n\tend\n\nSilphCo_7F_EventScript_ReceiveLaprasParty::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage SilphCo_7F_Text_ObtainedLaprasFromEmployee\n\twaitmessage\n\twaitfanfare\n\tbufferspeciesname STR_VAR_1, SPECIES_LAPRAS\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, SilphCo_7F_EventScript_NicknameLaprasParty\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, SilphCo_7F_EventScript_EndReceiveLapras\nSilphCo_7F_EventScript_NicknameLaprasParty::\n\tcall EventScript_GetGiftMonPartySlot\n\tcall EventScript_ChangePokemonNickname\n\tgoto SilphCo_7F_EventScript_EndReceiveLapras\n\tend\n\nSilphCo_7F_EventScript_ReceiveLaprasPC::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage SilphCo_7F_Text_ObtainedLaprasFromEmployee\n\twaitmessage\n\twaitfanfare\n\tbufferspeciesname STR_VAR_1, SPECIES_LAPRAS\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, SilphCo_7F_EventScript_NicknameLaprasPC\n\tmsgbox Text_GiveNicknameToThisMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, SilphCo_7F_EventScript_LaprasTransferredToPC\nSilphCo_7F_EventScript_NicknameLaprasPC::\n\tcall EventScript_NameReceivedBoxMon\n\tgoto SilphCo_7F_EventScript_LaprasTransferredToPC\n\tend\n\nSilphCo_7F_EventScript_LaprasTransferredToPC::\n\tcall EventScript_TransferredToPC\n\tgoto SilphCo_7F_EventScript_EndReceiveLapras\n\tend\n\nSilphCo_7F_EventScript_EndReceiveLapras::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox SilphCo_7F_Text_ExplainLapras\n\tsetflag FLAG_GOT_LAPRAS_FROM_SILPH\n\trelease\n\tend\n\nSilphCo_7F_EventScript_AlreadyGotLapras::\n\tmsgbox SilphCo_7F_Text_RocketBossWentToBoardroom\n\trelease\n\tend\n\nSilphCo_7F_EventScript_WorkerM1::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_7F_EventScript_WorkerM1RocketsGone\n\tmsgbox SilphCo_7F_Text_RocketsAfterMasterBall\n\trelease\n\tend\n\nSilphCo_7F_EventScript_WorkerM1RocketsGone::\n\tmsgbox SilphCo_7F_Text_CanceledMasterBallProject\n\trelease\n\tend\n\nSilphCo_7F_EventScript_WorkerM2::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_7F_EventScript_WorkerM2RocketsGone\n\tmsgbox SilphCo_7F_Text_BadIfTeamRocketTookOver\n\trelease\n\tend\n\nSilphCo_7F_EventScript_WorkerM2RocketsGone::\n\tmsgbox SilphCo_7F_Text_WowYouChasedOffTeamRocket\n\trelease\n\tend\n\nSilphCo_7F_EventScript_WorkerF::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_7F_EventScript_WorkerFRocketsGone\n\tmsgbox SilphCo_7F_Text_ReallyDangerousHere\n\trelease\n\tend\n\nSilphCo_7F_EventScript_WorkerFRocketsGone::\n\tmsgbox SilphCo_7F_Text_ThankYouSoMuch\n\trelease\n\tend\n\nSilphCo_7F_EventScript_FloorSign::\n\tmsgbox SilphCo_7F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nSilphCo_7F_EventScript_Joshua::\n\ttrainerbattle_single TRAINER_SCIENTIST_JOSHUA, SilphCo_7F_Text_JoshuaIntro, SilphCo_7F_Text_JoshuaDefeat\n\tmsgbox SilphCo_7F_Text_JoshuaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_7F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_33, SilphCo_7F_Text_Grunt1Intro, SilphCo_7F_Text_Grunt1Defeat\n\tmsgbox SilphCo_7F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_7F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_34, SilphCo_7F_Text_Grunt2Intro, SilphCo_7F_Text_Grunt2Defeat\n\tmsgbox SilphCo_7F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_7F_EventScript_Grunt3::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_35, SilphCo_7F_Text_Grunt3Intro, SilphCo_7F_Text_Grunt3Defeat\n\tmsgbox SilphCo_7F_Text_Grunt3PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_7F_EventScript_RivalGivesLinkBracelet::\n\tmsgbox SilphCo_7F_EventScript_RivalGivesLinkBracelet_Text_0\n\tgiveitem_msg SilphCo_7F_EventScript_RivalGivesLinkBracelet_Text_1, ITEM_LINK_BRACELET, 1, MUS_OBTAIN_KEY_ITEM\n\tmsgbox SilphCo_7F_EventScript_RivalGivesLinkBracelet_Text_2\n\tclosemessage\n\tcall_if_eq VAR_TEMP_1, 0, SilphCo_7F_EventScript_RivalToWarpTileTop\n\tcall_if_eq VAR_TEMP_1, 1, SilphCo_7F_EventScript_RivalToWarpTileBottom\n\treturn\n\nSilphCo_7F_EventScript_RivalToWarpTileTop:\n\tapplymovement 1, Movement_RivalToWarpTileTop\n\twaitmovement 0\n\treturn\n\nSilphCo_7F_EventScript_RivalToWarpTileBottom:\n\tapplymovement 1, Movement_RivalToWarpTileBottom\n\twaitmovement 0\n\treturn\n\nMovement_RivalToWarpTileTop:\n\twalk_right\n\twalk_right\n\tdelay_16\n\tstep_end\n\nMovement_RivalToWarpTileBottom:\n\twalk_right\n\twalk_right\n\twalk_right\n\tdelay_16\n\tstep_end\n\nSilphCo_7F_EventScript_RivalGivesLinkBracelet_Text_0:\n\t.string \"Oh, yeah, right.\\pYou're so far behind me now that\\nthis probably won't matter but…\\pI found a pair of bracelets that\\ncan evolve certain POKéMON, but\\lthey barely work unless you give\\lone to someone else.\\pHere, {PLAYER}. I feel sorry for\\nyou, so you can have this.$\"\n\nSilphCo_7F_EventScript_RivalGivesLinkBracelet_Text_1:\n\t.string \"{PLAYER} received a LINK BRACELET\\nfrom {RIVAL}!$\"\n\nSilphCo_7F_EventScript_RivalGivesLinkBracelet_Text_2:\n\t.string \"All right, I'm really going this\\ntime. Smell ya!$\"\n\nSilphCo_7F_EventScript_WorkerBro::\n\tmsgbox SilphCo_7F_Text_WorkerBro, MSGBOX_NPC\n\tend\n\nSilphCo_7F_Text_WorkerBro:\n\t.string \"I am one of the four SILPH\\n\"\n    .string \"BROTHERS!\\p\"\n\t.string \"I make sure the company servers\\n\"\n\t.string \"are working properly!$\"\n\nSilphCo_7F_EventScript_WorkerFPhone::\n\tlock\n\tmsgbox SilphCo_7F_Text_WorkerFPhone\n\trelease\n\tmsgbox SilphCo_7F_Text_WorkerFPhone2, MSGBOX_NPC\n\tturnobject 13, DIR_NORTH\n\tend\n\nSilphCo_7F_Text_WorkerFPhone:\n\t.string \"Have you tried doing what I\\n\"\n    .string \"suggested earlier?\\p\"\n\t.string \"I'm telling you it'd work.\\n\"\n\t.string \"Okay, call me back.$\"\n\nSilphCo_7F_Text_WorkerFPhone2:\n\t.string \"My coworker downstairs asks\\n\"\n\t.string \"me for help all the time.\\p\"\n\t.string \"I usually figure out the\\n\"\n\t.string \"solution pretty quickly…\\p\"\n\t.string \"But does he ever listen to\\n\"\n\t.string \"me the first time?\\p\"\n\t.string \"No!\\n\"\n\t.string \"Of course not!$\"\n\nSilphCo_7F_EventScript_Painting::\n\tgoto_if_unset FLAG_HIDE_SAFFRON_CIVILIANS, SilphCo_7F_EventScript_NewPainting\n\tmsgbox Text_Painting, MSGBOX_SIGN\n\tend\n\nSilphCo_7F_EventScript_NewPainting::\n\tmsgbox SilphCo_7F_Text_NewPainting, MSGBOX_SIGN\n\tend\n\nSilphCo_7F_Text_NewPainting:\n\t.string \"It's a gorgeous painting of a bird\\n\"\n\t.string \"POKéMON darting between the trees.$\""
  },
  {
    "path": "data/maps/SilphCo_7F/text.inc",
    "content": "SilphCo_7F_Text_HaveMonForSavingUs::\n    .string \"Oh! Hi! You're not a ROCKET!\\n\"\n    .string \"You came to save us?\\l\"\n    .string \"Why, thank you!\\p\"\n    .string \"I want you to have this POKéMON\\n\"\n    .string \"for saving us.$\"\n\nSilphCo_7F_Text_ObtainedLaprasFromEmployee::\n    .string \"{PLAYER} obtained a LAPRAS from\\n\"\n    .string \"the SILPH employee!$\"\n\nSilphCo_7F_Text_ExplainLapras::\n    .string \"It's a LAPRAS.\\n\"\n    .string \"It's a very intelligent POKéMON.\\p\"\n    .string \"We kept it in our lab, but it will\\n\"\n    .string \"be much better off with you.\\p\"\n    .string \"I think you will be a good TRAINER\\n\"\n    .string \"for LAPRAS!\\p\"\n    .string \"It's a good swimmer.\\n\"\n    .string \"It'll give you a lift across water!$\"\n\nSilphCo_7F_Text_RocketBossWentToBoardroom::\n    .string \"TEAM ROCKET's BOSS went to the\\n\"\n    .string \"boardroom!\\p\"\n    .string \"Is our PRESIDENT okay?\\n\"\n    .string \"I'm worried.$\"\n\nSilphCo_7F_Text_RocketsAfterMasterBall::\n    .string \"TEAM ROCKET was after the MASTER\\n\"\n    .string \"BALL, which catches any POKéMON.$\"\n\nSilphCo_7F_Text_CanceledMasterBallProject::\n    .string \"We canceled the MASTER BALL\\n\"\n    .string \"project because of TEAM ROCKET.$\"\n\nSilphCo_7F_Text_BadIfTeamRocketTookOver::\n    .string \"It would be bad if TEAM ROCKET\\n\"\n    .string \"took over SILPH or our POKéMON.$\"\n\nSilphCo_7F_Text_WowYouChasedOffTeamRocket::\n    .string \"Wow!\\p\"\n    .string \"You chased off TEAM ROCKET all by\\n\"\n    .string \"yourself?$\"\n\nSilphCo_7F_Text_ReallyDangerousHere::\n    .string \"You!\\n\"\n    .string \"It's really dangerous here!\\p\"\n    .string \"You came to save me?\\n\"\n    .string \"You can't!$\"\n\nSilphCo_7F_Text_ThankYouSoMuch::\n    .string \"Thank you so much!$\"\n\nSilphCo_7F_Text_Grunt3Intro::\n    .string \"Uh-oh!\\n\"\n    .string \"I smell a little mouse!$\"\n\nSilphCo_7F_Text_Grunt3Defeat::\n    .string \"Lights out!$\"\n\nSilphCo_7F_Text_Grunt3PostBattle::\n    .string \"You won't find my BOSS by just\\n\"\n    .string \"scurrying around!$\"\n\nSilphCo_7F_Text_JoshuaIntro::\n    .string \"Heheh!\\p\"\n    .string \"You mistook me for a SILPH worker?$\"\n\nSilphCo_7F_Text_JoshuaDefeat::\n    .string \"I'm done!$\"\n\nSilphCo_7F_Text_JoshuaPostBattle::\n    .string \"Despite your age, you are a\\n\"\n    .string \"skilled TRAINER!$\"\n\nSilphCo_7F_Text_Grunt1Intro::\n    .string \"I am one of the four ROCKET\\n\"\n    .string \"BROTHERS!$\"\n\nSilphCo_7F_Text_Grunt1Defeat::\n    .string \"Aack!\\n\"\n    .string \"Brothers, I lost!$\"\n\nSilphCo_7F_Text_Grunt1PostBattle::\n    .string \"Doesn't matter.\\n\"\n    .string \"My brothers will repay the favor!$\"\n\nSilphCo_7F_Text_Grunt2Intro::\n    .string \"A child intruder?\\n\"\n    .string \"That must be you!$\"\n\nSilphCo_7F_Text_Grunt2Defeat::\n    .string \"Fine!\\n\"\n    .string \"I lost!$\"\n\nSilphCo_7F_Text_Grunt2PostBattle::\n    .string \"Go on home before my BOSS gets\\n\"\n    .string \"ticked off!$\"\n\nSilphCo_7F_Text_RivalWhatKeptYou::\n    .string \"{RIVAL}: What kept you, {PLAYER}?$\"\n\nSilphCo_7F_Text_RivalIntro::\n    .string \"{RIVAL}: Hahaha! I thought you'd\\n\"\n    .string \"turn up if I waited here!\\p\"\n    .string \"I guess TEAM ROCKET slowed you\\n\"\n    .string \"down! Not that I care!\\p\"\n    .string \"I saw you in SAFFRON, so I decided\\n\"\n    .string \"to see if you got better!$\"\n\nSilphCo_7F_Text_RivalDefeat::\n    .string \"Oh, man!\\n\"\n    .string \"So, you are ready for BOSS\\l\"\n    .string \"ROCKET!$\"\n\nSilphCo_7F_Text_RivalPostBattle::\n    .string \"Well, {PLAYER}!\\n\"\n    .string \"I'm moving on up and ahead!\\p\"\n    .string \"By checking my POKéDEX, I'm\\n\"\n    .string \"starting to see what's strong and\\l\"\n    .string \"how they evolve!\\p\"\n    .string \"Am I a genius or what?\\p\"\n    .string \"I'm going to the POKéMON LEAGUE to\\n\"\n    .string \"boot out the ELITE FOUR.\\p\"\n    .string \"I'll become the world's most\\n\"\n    .string \"powerful TRAINER!\\p\"\n    .string \"{PLAYER}, well, good luck to you!\\n\"\n    .string \"Don't sweat it!\\l\"\n    .string \"Smell ya!$\"\n\nSilphCo_7F_Text_FloorSign::\n    .string \"SILPH CO. HEAD OFFICE\\n\"\n    .string \"7F$\"\n\n"
  },
  {
    "path": "data/maps/SilphCo_8F/map.json",
    "content": "{\n  \"id\": \"MAP_SILPH_CO_8F\",\n  \"name\": \"SilphCo_8F\",\n  \"layout\": \"LAYOUT_SILPH_CO_8F\",\n  \"music\": \"MUS_SILPH\",\n  \"region_map_section\": \"MAPSEC_SILPH_CO\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 8,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"SilphCo_8F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"SilphCo_8F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SilphCo_8F_EventScript_Parker\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_8F_EventScript_WorkerM\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_8F_EventScript_ItemIron\",\n      \"flag\": \"FLAG_HIDE_SILPH_CO_8F_IRON\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_8F_EventScript_Scientist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 0,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_8F_EventScript_ScientistBro\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_8F_EventScript_WorkerF\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WIGGLYTUFF\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SSAnne_1F_Room3_EventScript_Wigglytuff\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 16,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_9F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_8F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_2F\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_7F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_8F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 2,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_2F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_8F_EventScript_Door\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_8F_EventScript_Door\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_8F_EventScript_Door\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_8F_EventScript_Door\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 29,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"item\": \"ITEM_NUGGET\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SILPH_CO_8F_NUGGET\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 27,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_8F_EventScript_FloorSign\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SilphCo_8F/scripts.inc",
    "content": "SilphCo_8F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, SilphCo_8F_OnLoad\n\t.byte 0\n\nSilphCo_8F_OnLoad::\n\tcall_if_unset FLAG_SILPH_8F_DOOR, EventScript_Close8FDoor\n\tcall_if_unset FLAG_HIDE_SAFFRON_CIVILIANS, SilphCo_8F_EventScript_ScientistPosition\n\tend\n\nSilphCo_8F_EventScript_ScientistPosition::\n\tsetobjectmovementtype 6, MOVEMENT_TYPE_WANDER_AROUND\n\tsetobjectxyperm 6, 26, 11\n\treturn\n\nSilphCo_8F_EventScript_WorkerM::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_8F_EventScript_WorkerMRocketsGone\n\tmsgbox SilphCo_8F_Text_WonderIfSilphIsFinished\n\trelease\n\tend\n\nSilphCo_8F_EventScript_WorkerMRocketsGone::\n\tmsgbox SilphCo_8F_Text_ThanksForSavingUs\n\trelease\n\tend\n\nSilphCo_8F_EventScript_FloorSign::\n\tmsgbox SilphCo_8F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nSilphCo_8F_EventScript_Parker::\n\ttrainerbattle_single TRAINER_SCIENTIST_PARKER, SilphCo_8F_Text_ParkerIntro, SilphCo_8F_Text_ParkerDefeat\n\tmsgbox SilphCo_8F_Text_ParkerPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_8F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_32, SilphCo_8F_Text_Grunt1Intro, SilphCo_8F_Text_Grunt1Defeat\n\tmsgbox SilphCo_8F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_8F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_36, SilphCo_8F_Text_Grunt2Intro, SilphCo_8F_Text_Grunt2Defeat\n\tmsgbox SilphCo_8F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_8F_EventScript_ScientistBro::\n\tmsgbox SilphCo_8F_Text_ScientistBro, MSGBOX_NPC\n\tend\n\nSilphCo_8F_Text_ScientistBro:\n\t.string \"I am one of the four SILPH\\n\"\n    .string \"BROTHERS!\\p\"\n\t.string \"I'm not actually sure what I do\\n\"\n\t.string \"for the company…\\p\"\n\t.string \"Nobody has come to give me\\n\"\n\t.string \"work to do in a while…\\p\"\n\t.string \"Have they forgotten about me?\\n\"\n\t.string \"Do I just come in and do nothing?\\p\"\n\t.string \"At least I'm still getting paid.$\"\n\nSilphCo_8F_EventScript_WorkerF::\n\tmsgbox SilphCo_8F_Text_WorkerF, MSGBOX_NPC\n\tend\n\nSilphCo_8F_Text_WorkerF:\n\t.string \"Can't talk, I've gotta eat fast!\\n\"\n\t.string \"My lunch break is almost over!\\p\"\n\t.string \"Hurry up, WIGGLYTUFF!\\n\"\n\t.string \"Don't make me late again!$\""
  },
  {
    "path": "data/maps/SilphCo_8F/text.inc",
    "content": "SilphCo_8F_Text_WonderIfSilphIsFinished::\n    .string \"I wonder if SILPH is finished…$\"\n\nSilphCo_8F_Text_ThanksForSavingUs::\n    .string \"Thanks for saving us!$\"\n\nSilphCo_8F_Text_Grunt1Intro::\n    .string \"That's as far as you'll go!$\"\n\nSilphCo_8F_Text_Grunt1Defeat::\n    .string \"Not enough grit!$\"\n\nSilphCo_8F_Text_Grunt1PostBattle::\n    .string \"If you don't turn back…\\n\"\n    .string \"I'll call for backup!$\"\n\nSilphCo_8F_Text_ParkerIntro::\n    .string \"You're causing us problems!$\"\n\nSilphCo_8F_Text_ParkerDefeat::\n    .string \"Huh?\\n\"\n    .string \"I lost?$\"\n\nSilphCo_8F_Text_ParkerPostBattle::\n    .string \"So, what do you think of SILPH\\n\"\n    .string \"BUILDING's maze?$\"\n\nSilphCo_8F_Text_Grunt2Intro::\n    .string \"I am one of the four ROCKET\\n\"\n    .string \"BROTHERS!$\"\n\nSilphCo_8F_Text_Grunt2Defeat::\n    .string \"Whoo!\\n\"\n    .string \"Oh, Brothers!$\"\n\nSilphCo_8F_Text_Grunt2PostBattle::\n    .string \"I'll leave you up to my brothers.$\"\n\nSilphCo_8F_Text_FloorSign::\n    .string \"SILPH CO. HEAD OFFICE\\n\"\n    .string \"8F$\"\n\nSilphCo_8F_Text_ToRocketBossMonsAreTools::\n    .string \"TEAM ROCKET's BOSS is terribly\\n\"\n    .string \"cruel!\\p\"\n    .string \"To him, POKéMON are just tools to\\n\"\n    .string \"be used.\\p\"\n    .string \"What will happen if that tyrant\\n\"\n    .string \"takes over our company…$\"\n"
  },
  {
    "path": "data/maps/SilphCo_9F/map.json",
    "content": "{\n  \"id\": \"MAP_SILPH_CO_9F\",\n  \"name\": \"SilphCo_9F\",\n  \"layout\": \"LAYOUT_SILPH_CO_9F\",\n  \"music\": \"MUS_SILPH\",\n  \"region_map_section\": \"MAPSEC_SILPH_CO\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 9,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SilphCo_9F_EventScript_Ed\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SilphCo_9F_EventScript_Grunt2\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_9F_EventScript_HealWoman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"SilphCo_9F_EventScript_Grunt1\",\n      \"flag\": \"FLAG_HIDE_SILPH_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_9F_EventScript_BragWorkerM\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_9F_EventScript_WorkerF\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_9F_EventScript_Scientist\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PIDGEY\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_House3_EventScript_Pidgey\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_9F_EventScript_Newbie\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_9F_EventScript_Woman\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_9F_EventScript_LittleBoy\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_9F_EventScript_LittleGirl\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GBA_KID\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_9F_EventScript_GBAKid\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_9F_EventScript_SeelGirl\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEEL\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonFanClub_EventScript_Seel\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_M\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_9F_EventScript_SleepTalkTutor\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SilphCo_9F_EventScript_NightmareTutor\",\n      \"flag\": \"FLAG_HIDE_SAFFRON_CIVILIANS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 16,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_8F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 22,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_5F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_3F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SILPH_CO_10F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 24,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SILPH_CO_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 11,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"item\": \"ITEM_MAX_POTION\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SILPH_CO_9F_MAX_POTION\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 21,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 22,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 22,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 21,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 21,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door4\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 21,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door4\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 22,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door4\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 22,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door4\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_Door2\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"item\": \"ITEM_CALCIUM\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SILPH_CO_9F_CALCIUM\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 17,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_9F_EventScript_FloorSign\"\n    }\n  ],\n  \"level_scaling\": \"3\"\n}\n"
  },
  {
    "path": "data/maps/SilphCo_9F/scripts.inc",
    "content": "SilphCo_9F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, SilphCo_9F_OnLoad\n\t.byte 0\n\nSilphCo_9F_OnLoad::\n\tcall_if_unset FLAG_SILPH_9F_DOOR_1, EventScript_Close9FDoor1\n\tcall_if_unset FLAG_SILPH_9F_DOOR_2, EventScript_Close9FDoor2\n\tcall_if_unset FLAG_SILPH_9F_DOOR_3, EventScript_Close9FDoor3\n\tcall_if_unset FLAG_SILPH_9F_DOOR_4, EventScript_Close9FDoor4\n\tend\n\nSilphCo_9F_EventScript_HealWoman::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_SILPH_CO_11F, 1, SilphCo_9F_EventScript_HealWomanRocketsGone\n\tmsgbox SilphCo_9F_Text_YouShouldTakeQuickNap\n\tclosemessage\n\tcall EventScript_OutOfCenterPartyHeal\n\tmsgbox SilphCo_9F_Text_DontGiveUp\n\trelease\n\tend\n\nSilphCo_9F_EventScript_HealWomanRocketsGone::\n\tmsgbox SilphCo_9F_Text_ThankYouSoMuch\n\trelease\n\tend\n\nSilphCo_9F_EventScript_FloorSign::\n\tmsgbox SilphCo_9F_Text_FloorSign, MSGBOX_SIGN\n\tend\n\nSilphCo_9F_EventScript_Ed::\n\ttrainerbattle_single TRAINER_SCIENTIST_ED, SilphCo_9F_Text_EdIntro, SilphCo_9F_Text_EdDefeat\n\tmsgbox SilphCo_9F_Text_EdPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_9F_EventScript_Grunt1::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_37, SilphCo_9F_Text_Grunt1Intro, SilphCo_9F_Text_Grunt1Defeat\n\tmsgbox SilphCo_9F_Text_Grunt1PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_9F_EventScript_Grunt2::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_38, SilphCo_9F_Text_Grunt2Intro, SilphCo_9F_Text_Grunt2Defeat\n\tmsgbox SilphCo_9F_Text_Grunt2PostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSilphCo_9F_EventScript_Woman::\n\tmsgbox SilphCo_9F_Text_Woman, MSGBOX_NPC\n\tend\n\nSilphCo_9F_Text_Woman:\n\t.string \"Oh, hello.\\n\"\n\t.string \"Do your parents work here?\\p\"\n\t.string \"SILPH CO. provides childcare\\n\"\n\t.string \"for workers who need it.\\p\"\n\t.string \"Fortunately, we were out on\\n\"\n\t.string \"a trip when the ROCKETS came.$\"\n\nSilphCo_9F_EventScript_GBAKid::\n\tmsgbox SilphCo_9F_Text_GBAKid, MSGBOX_NPC\n\tend\n\nSilphCo_9F_Text_GBAKid:\n\t.string \"Hey, aren't you the TRAINER\\n\"\n\t.string \"that stopped TEAM ROCKET?\\l\"\n\t.string \"What are you doing back here?\\p\"\n\t.string \"Did you miss some of the stuff\\n\"\n\t.string \"the ROCKETS dropped?$\"\n\nSilphCo_9F_EventScript_LittleGirl::\n\tmsgbox SilphCo_9F_Text_LittleGirl, MSGBOX_NPC\n\tend\n\nSilphCo_9F_Text_LittleGirl:\n\t.string \"If a mean guy took over this room,\\n\"\n\t.string \"you know what I'd do?\\p\"\n\t.string \"I tell him to go home, but I'd\\n\"\n\t.string \"be really loud!\\l\"\n\t.string \"He'd have to listen after that!$\"\n\nSilphCo_9F_EventScript_LittleBoy::\n\tmsgbox SilphCo_9F_Text_LittleBoy, MSGBOX_NPC\n\tend\n\nSilphCo_9F_Text_LittleBoy:\n\t.string \"What's your favorite POKéMON?\\p\"\n\t.string \"I don't have one, but I do have\\n\"\n\t.string \"a least favorite.\\p\"\n\t.string \"…\\n\"\n\t.string \"It's SEEL…$\"\n\nSilphCo_9F_EventScript_SeelGirl::\n\tmsgbox SilphCo_9F_Text_SeelGirl, MSGBOX_NPC\n\tend\n\nSilphCo_9F_Text_SeelGirl:\n\t.string \"My SEEL gets jealous when I spend\\n\"\n\t.string \"time with other kids.\\p\"\n\t.string \"My friend gets jealous when I spend\\n\"\n\t.string \"time with SEEL.\\p\"\n\t.string \"I just can't win!$\"\n\nSilphCo_9F_EventScript_Newbie::\n\tmsgbox SilphCo_9F_Text_Newbie, MSGBOX_NPC\n\tend\n\nSilphCo_9F_Text_Newbie:\n\t.string \"I'm new a brand new hire.\\n\"\n\t.string \"It's hard learning my way around.\\p\"\n\t.string \"And who decided these pads were\\n\"\n\t.string \"a good idea, anyway?\\p\"\n\t.string \"I try to go to the water cooler\\n\"\n\t.string \"and suddenly I'm four floors up\\l\"\n\t.string \"and totally lost.$\"\n\nSilphCo_9F_EventScript_WorkerF::\n\tmsgbox SilphCo_9F_Text_WorkerF\n\trelease\n\tend\n\nSilphCo_9F_Text_WorkerF:\n\t.string \"I can't believe you fought\\n\"\n\t.string \"all those ROCKETS.\\p\"\n\t.string \"You're so brave!$\"\n\nSilphCo_9F_EventScript_BragWorkerM::\n\tmsgbox SilphCo_9F_Text_BragWorkerM\n\trelease\n\tend\n\nSilphCo_9F_Text_BragWorkerM:\n\t.string \"PIDGEY and I took on two\\n\"\n\t.string \"of those ROCKET GRUNTS solo!\\p\"\n\t.string \"They had two big RHYDON and four\\n\"\n\t.string \"humongous GYARADOS between them!\\p\"\n\t.string \"It was no use, though, PIDGEY\\n\"\n\t.string \"and I wiped the floor with them.\\p\"\n\t.string \"I doubt they'll be back any time\\n\"\n\t.string \"soon after the thrashing they got.$\"\n\nSilphCo_9F_EventScript_Scientist::\n\tmsgbox SilphCo_9F_Text_Scientist, MSGBOX_NPC\n\tend\n\nSilphCo_9F_Text_Scientist:\n\t.string \"I remember this story differently.\\p\"\n\t.string \"It was one ROCKET GRUNT with a\\n\"\n\t.string \"RATTATA and a ZUBAT.\\p\"\n\t.string \"PIDGEY lost so badly that the\\n\"\n\t.string \"GRUNT said it wasn't worth stealing.\\p\"\n\t.string \"Then he shoved them both\\n\"\n\t.string \"in a utility closet.$\"\n"
  },
  {
    "path": "data/maps/SilphCo_9F/text.inc",
    "content": "SilphCo_9F_Text_YouShouldTakeQuickNap::\n    .string \"You look tired.\\n\"\n    .string \"You should take a quick nap.$\"\n\nSilphCo_9F_Text_DontGiveUp::\n    .string \"Don't give up!$\"\n\nSilphCo_9F_Text_ThankYouSoMuch::\n    .string \"Thank you so much.$\"\n\nSilphCo_9F_Text_Grunt1Intro::\n    .string \"Your POKéMON seem to adore you,\\n\"\n    .string \"kid!$\"\n\nSilphCo_9F_Text_Grunt1Defeat::\n    .string \"Ghaaah!$\"\n\nSilphCo_9F_Text_Grunt1PostBattle::\n    .string \"If I had started as a TRAINER at\\n\"\n    .string \"your age…$\"\n\nSilphCo_9F_Text_EdIntro::\n    .string \"Your POKéMON have weak points!\\n\"\n    .string \"I can nail them!$\"\n\nSilphCo_9F_Text_EdDefeat::\n    .string \"You hammered me!$\"\n\nSilphCo_9F_Text_EdPostBattle::\n    .string \"Exploiting weak spots does work.\\n\"\n    .string \"Think about type advantages.$\"\n\nSilphCo_9F_Text_Grunt2Intro::\n    .string \"I am one of the four ROCKET\\n\"\n    .string \"BROTHERS!$\"\n\nSilphCo_9F_Text_Grunt2Defeat::\n    .string \"Warg!\\n\"\n    .string \"Brothers, I lost!$\"\n\nSilphCo_9F_Text_Grunt2PostBattle::\n    .string \"My brothers will avenge me!$\"\n\nSilphCo_9F_Text_FloorSign::\n    .string \"SILPH CO. HEAD OFFICE\\n\"\n    .string \"9F$\"\n\n"
  },
  {
    "path": "data/maps/SilphCo_Elevator/map.json",
    "content": "{\n  \"id\": \"MAP_SILPH_CO_ELEVATOR\",\n  \"name\": \"SilphCo_Elevator\",\n  \"layout\": \"LAYOUT_SILPH_CO_ELEVATOR\",\n  \"music\": \"MUS_SILPH\",\n  \"region_map_section\": \"MAPSEC_SILPH_CO\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 0,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SilphCo_Elevator_EventScript_FloorSelect\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SilphCo_Elevator/scripts.inc",
    "content": "SilphCo_Elevator_MapScripts::\n\t.byte 0\n\nSilphCo_Elevator_EventScript_FloorSelect::\n\tlockall\n\tsetvar VAR_0x8004, 1\n\tcall_if_unset FLAG_TEMP_2, EventScript_GetElevatorFloor\n\tcopyvar VAR_0x8005, VAR_ELEVATOR_FLOOR\n\tspecial DrawElevatorCurrentFloorWindow\n\tmessage Text_WantWhichFloor\n\twaitmessage\n\tsetvar VAR_0x8004, LISTMENU_SILPHCO_FLOORS\n\tspecialvar VAR_RESULT, InitElevatorFloorSelectMenuPos\n\tspecial ListMenu\n\twaitstate\n\tswitch VAR_RESULT\n\tcase 0, SilphCo_Elevator_EventScript_To11F\n\tcase 1, SilphCo_Elevator_EventScript_To10F\n\tcase 2, SilphCo_Elevator_EventScript_To9F\n\tcase 3, SilphCo_Elevator_EventScript_To8F\n\tcase 4, SilphCo_Elevator_EventScript_To7F\n\tcase 5, SilphCo_Elevator_EventScript_To6F\n\tcase 6, SilphCo_Elevator_EventScript_To5F\n\tcase 7, SilphCo_Elevator_EventScript_To4F\n\tcase 8, SilphCo_Elevator_EventScript_To3F\n\tcase 9, SilphCo_Elevator_EventScript_To2F\n\tcase 10, SilphCo_Elevator_EventScript_To1F\n\tcase 11, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tcase 127, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tend\n\nSilphCo_Elevator_EventScript_To1F::\n\tsetvar VAR_0x8006, 4\n\tsetdynamicwarp MAP_SILPH_CO_1F, 255, 22, 3\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 4, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tcall SilphCo_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 4\n\tgoto SilphCo_Elevator_EventScript_ExitFloorSelect\n\tend\n\nSilphCo_Elevator_EventScript_To2F::\n\tsetvar VAR_0x8006, 5\n\tsetdynamicwarp MAP_SILPH_CO_2F, 255, 22, 3\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 5, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tcall SilphCo_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 5\n\tgoto SilphCo_Elevator_EventScript_ExitFloorSelect\n\tend\n\nSilphCo_Elevator_EventScript_To3F::\n\tsetvar VAR_0x8006, 6\n\tsetdynamicwarp MAP_SILPH_CO_3F, 255, 22, 3\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 6, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tcall SilphCo_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 6\n\tgoto SilphCo_Elevator_EventScript_ExitFloorSelect\n\tend\n\nSilphCo_Elevator_EventScript_To4F::\n\tsetvar VAR_0x8006, 7\n\tsetdynamicwarp MAP_SILPH_CO_4F, 255, 22, 3\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 7, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tcall SilphCo_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 7\n\tgoto SilphCo_Elevator_EventScript_ExitFloorSelect\n\tend\n\nSilphCo_Elevator_EventScript_To5F::\n\tsetvar VAR_0x8006, 8\n\tsetdynamicwarp MAP_SILPH_CO_5F, 255, 22, 3\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 8, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tcall SilphCo_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 8\n\tgoto SilphCo_Elevator_EventScript_ExitFloorSelect\n\tend\n\nSilphCo_Elevator_EventScript_To6F::\n\tsetvar VAR_0x8006, 9\n\tsetdynamicwarp MAP_SILPH_CO_6F, 255, 20, 3\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 9, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tcall SilphCo_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 9\n\tgoto SilphCo_Elevator_EventScript_ExitFloorSelect\n\tend\n\nSilphCo_Elevator_EventScript_To7F::\n\tsetvar VAR_0x8006, 10\n\tsetdynamicwarp MAP_SILPH_CO_7F, 255, 23, 3\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 10, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tcall SilphCo_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 10\n\tgoto SilphCo_Elevator_EventScript_ExitFloorSelect\n\tend\n\nSilphCo_Elevator_EventScript_To8F::\n\tsetvar VAR_0x8006, 11\n\tsetdynamicwarp MAP_SILPH_CO_8F, 255, 22, 3\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 11, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tcall SilphCo_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 11\n\tgoto SilphCo_Elevator_EventScript_ExitFloorSelect\n\tend\n\nSilphCo_Elevator_EventScript_To9F::\n\tsetvar VAR_0x8006, 12\n\tsetdynamicwarp MAP_SILPH_CO_9F, 255, 24, 3\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 12, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tcall SilphCo_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 12\n\tgoto SilphCo_Elevator_EventScript_ExitFloorSelect\n\tend\n\nSilphCo_Elevator_EventScript_To10F::\n\tsetvar VAR_0x8006, 13\n\tsetdynamicwarp MAP_SILPH_CO_10F, 255, 13, 3\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 13, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tcall SilphCo_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 13\n\tgoto SilphCo_Elevator_EventScript_ExitFloorSelect\n\tend\n\nSilphCo_Elevator_EventScript_To11F::\n\tsetvar VAR_0x8006, 14\n\tsetdynamicwarp MAP_SILPH_CO_11F, 255, 13, 3\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 14, SilphCo_Elevator_EventScript_ExitFloorSelect\n\tcall SilphCo_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 14\n\tgoto SilphCo_Elevator_EventScript_ExitFloorSelect\n\tend\n\nSilphCo_Elevator_EventScript_ExitFloorSelect::\n\tspecial CloseElevatorCurrentFloorWindow\n\treleaseall\n\tend\n\nSilphCo_Elevator_EventScript_MoveElevator::\n\tspecial CloseElevatorCurrentFloorWindow\n\tclosemessage\n\twaitse\n\tspecial AnimateElevator\n\twaitstate\n\tsetflag FLAG_TEMP_2\n\treturn\n"
  },
  {
    "path": "data/maps/SixIsland/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND\",\n  \"name\": \"SixIsland\",\n  \"layout\": \"LAYOUT_SIX_ISLAND\",\n  \"music\": \"MUS_SEVII_45\",\n  \"region_map_section\": \"MAPSEC_SIX_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"right\",\n      \"offset\": -40,\n      \"map\": \"MAP_SIX_ISLAND_WATER_PATH\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_EventScript_Boy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_EventScript_Hiker\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 12,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_HARBOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SIX_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SIX_ISLAND_HOUSE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 20,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SIX_ISLAND_MART\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SixIsland_EventScript_IslandSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 10,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LEPPA_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SIX_ISLAND_LEPPA_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland/scripts.inc",
    "content": "SixIsland_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SixIsland_OnTransition\n\t.byte 0\n\nSixIsland_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_SIX_ISLAND\n\tend\n\nSixIsland_EventScript_Hiker::\n\tmsgbox SixIsland_Text_ThatWayToWaterPathRuinValley, MSGBOX_NPC\n\tend\n\nSixIsland_EventScript_Boy::\n\tmsgbox SixIsland_Text_SkyAtNightIsFantastic, MSGBOX_NPC\n\tend\n\nSixIsland_EventScript_IslandSign::\n\tmsgbox SixIsland_Text_IslandSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland/text.inc",
    "content": "SixIsland_Text_IslandSign::\n    .string \"SIX ISLAND\\n\"\n    .string \"Fortune Island of Aged Wisdom$\"\n\nSixIsland_Text_ThatWayToWaterPathRuinValley::\n    .string \"Keep going this way and you'll get\\n\"\n    .string \"to the WATER PATH.\\p\"\n    .string \"Stay on that and you'll get to\\n\"\n    .string \"the RUIN VALLEY.$\"\n\nSixIsland_Text_SkyAtNightIsFantastic::\n    .string \"When you're this far away from the\\n\"\n    .string \"city, the sky at night is fantastic.$\"\n\n"
  },
  {
    "path": "data/maps/SixIsland_AlteringCave/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_ALTERING_CAVE\",\n  \"name\": \"SixIsland_AlteringCave\",\n  \"layout\": \"LAYOUT_SIX_ISLAND_ALTERING_CAVE\",\n  \"music\": \"MUS_SEVII_CAVE\",\n  \"region_map_section\": \"MAPSEC_ALTERING_CAVE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 18,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_OUTCAST_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_AlteringCave/scripts.inc",
    "content": "SixIsland_AlteringCave_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SixIsland_AlteringCave_OnTransition\n\t.byte 0\n\nSixIsland_AlteringCave_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_SIX_ISLAND_ALTERING_CAVE\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_1F/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n  \"name\": \"SixIsland_DottedHole_1F\",\n  \"layout\": \"LAYOUT_SIX_ISLAND_DOTTED_HOLE_1F\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_DOTTED_HOLE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_RUIN_VALLEY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B1F\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_1F/scripts.inc",
    "content": "SixIsland_DottedHole_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SixIsland_DottedHole_1F_OnTransition\n\t.byte 0\n\nSixIsland_DottedHole_1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_SIX_ISLAND_DOTTED_HOLE_1F\n\tend\n\nSixIsland_DottedHole_B1F_EventScript_BrailleUp::\n\tlockall\n\tbraillemessage Braille_Text_Up\n\twaitbuttonpress\n\treleaseall\n\tend\n\nSixIsland_DottedHole_B4F_EventScript_BrailleDown::\n\tlockall\n\tbraillemessage Braille_Text_Down\n\twaitbuttonpress\n\treleaseall\n\tend\n\nSixIsland_DottedHole_B3F_EventScript_BrailleRight::\n\tlockall\n\tbraillemessage Braille_Text_Right\n\twaitbuttonpress\n\treleaseall\n\tend\n\nSixIsland_DottedHole_B2F_EventScript_BrailleLeft::\n\tlockall\n\tbraillemessage Braille_Text_Left\n\twaitbuttonpress\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_B1F/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B1F\",\n  \"name\": \"SixIsland_DottedHole_B1F\",\n  \"layout\": \"LAYOUT_SIX_ISLAND_DOTTED_HOLE_B1F\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_DOTTED_HOLE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"SixIsland_DottedHole_B1F_EventScript_BrailleUp\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_B1F/scripts.inc",
    "content": "SixIsland_DottedHole_B1F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_B2F/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B2F\",\n  \"name\": \"SixIsland_DottedHole_B2F\",\n  \"layout\": \"LAYOUT_SIX_ISLAND_DOTTED_HOLE_B2F\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_DOTTED_HOLE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B3F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"SixIsland_DottedHole_B2F_EventScript_BrailleLeft\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_B2F/scripts.inc",
    "content": "SixIsland_DottedHole_B2F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_B3F/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B3F\",\n  \"name\": \"SixIsland_DottedHole_B3F\",\n  \"layout\": \"LAYOUT_SIX_ISLAND_DOTTED_HOLE_B3F\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_DOTTED_HOLE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B2F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B4F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"SixIsland_DottedHole_B3F_EventScript_BrailleRight\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_B3F/scripts.inc",
    "content": "SixIsland_DottedHole_B3F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_B4F/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B4F\",\n  \"name\": \"SixIsland_DottedHole_B4F\",\n  \"layout\": \"LAYOUT_SIX_ISLAND_DOTTED_HOLE_B4F\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_DOTTED_HOLE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B3F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"SixIsland_DottedHole_B4F_EventScript_BrailleDown\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_B4F/scripts.inc",
    "content": "SixIsland_DottedHole_B4F_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_SapphireRoom/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM\",\n  \"name\": \"SixIsland_DottedHole_SapphireRoom\",\n  \"layout\": \"LAYOUT_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM\",\n  \"music\": \"MUS_SEVII_DUNGEON\",\n  \"region_map_section\": \"MAPSEC_DOTTED_HOLE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAPPHIRE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_DottedHole_SapphireRoom_EventScript_Sapphire\",\n      \"flag\": \"FLAG_HIDE_SAPPHIRE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_DOTTED_HOLE_SCIENTIST\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_B4F\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"SixIsland_DottedHole_SapphireRoom_EventScript_BrailleMessage\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_SapphireRoom/scripts.inc",
    "content": ".equ LOCALID_SAPPHIRE, 1\n.equ LOCALID_THIEF,    2\n\nSixIsland_DottedHole_SapphireRoom_MapScripts::\n\t.byte 0\n\nSixIsland_DottedHole_SapphireRoom_EventScript_Sapphire::\n\tlock\n\tfaceplayer\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\tmessage SixIsland_DottedHole_SapphireRoom_Text_FoundSapphire\n\twaitmessage\n\twaitfanfare\n\tclosemessage\n\tsetobjectxyperm LOCALID_THIEF, 5, 0\n\taddobject LOCALID_THIEF\n\tplayse SE_FALL\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefFallIn\n\twaitmovement 0\n\tplayse SE_M_STRENGTH\n\tcall_if_eq VAR_FACING, DIR_NORTH, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefLeft\n\tcall_if_eq VAR_FACING, DIR_SOUTH, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefLeft\n\tcall_if_eq VAR_FACING, DIR_EAST, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefDown\n\tcall_if_eq VAR_FACING, DIR_WEST, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefDown\n\tsetvar VAR_0x8004, 3\n\tsetvar VAR_0x8005, 0\n\tsetvar VAR_0x8006, 12\n\tsetvar VAR_0x8007, 3\n\tspecial ShakeScreen\n\tdelay 60\n\tcall_if_eq VAR_FACING, DIR_NORTH, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireEast\n\tcall_if_eq VAR_FACING, DIR_WEST, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireWest\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox SixIsland_DottedHole_SapphireRoom_Text_IWasRightInTailingYou\n\tclosemessage\n\tcall_if_eq VAR_FACING, DIR_NORTH, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireEast\n\tcall_if_eq VAR_FACING, DIR_WEST, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireWest\n\tremoveobject LOCALID_SAPPHIRE\n\tcall_if_eq VAR_FACING, DIR_NORTH, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefLeft2\n\tcall_if_eq VAR_FACING, DIR_SOUTH, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefLeft2\n\tcall_if_eq VAR_FACING, DIR_EAST, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefDown2\n\tcall_if_eq VAR_FACING, DIR_WEST, SixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefDown2\n\tmsgbox SixIsland_DottedHole_SapphireRoom_Text_SellToTeamRocketTellPassword\n\tclosemessage\n\tcall_if_eq VAR_FACING, DIR_NORTH, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitNorth\n\tcall_if_eq VAR_FACING, DIR_SOUTH, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitSouth\n\tcall_if_eq VAR_FACING, DIR_EAST, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitEast\n\tcall_if_eq VAR_FACING, DIR_WEST, SixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitWest\n\tplayse SE_EXIT\n\tdelay 35\n\tremoveobject LOCALID_THIEF\n\tsetflag FLAG_LEARNED_YES_NAH_CHANSEY\n\trelease\n\tend\n\n@ Lots of redundant scripts below\nSixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefLeft2::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefDown2::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefLeft::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_PlayerFaceThiefDown::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireNorth::\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefLookAtSapphireFromLeft\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireSouth::\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefLookAtSapphireFromLeft\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireEast::\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefLookAtSapphireFromBelow\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_ThiefLookAtSapphireWest::\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefLookAtSapphireFromBelow\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireNorth::\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefGetSapphireFromLeft\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireSouth::\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefGetSapphireFromLeft\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireEast::\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefGetSapphireFromBelow\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_ThiefGetSapphireWest::\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefGetSapphireFromBelow\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitNorth::\n\tapplymovement OBJ_EVENT_ID_PLAYER, SixIsland_DottedHole_SapphireRoom_Movement_PlayerWatchThiefExit\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefExitNorth\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitSouth::\n\tapplymovement OBJ_EVENT_ID_PLAYER, SixIsland_DottedHole_SapphireRoom_Movement_PlayerWatchThiefExit\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefExitSouth\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitEast::\n\tapplymovement OBJ_EVENT_ID_PLAYER, SixIsland_DottedHole_SapphireRoom_Movement_PlayerWatchThiefExit\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefExitEastWest\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_EventScript_ThiefExitWest::\n\tapplymovement OBJ_EVENT_ID_PLAYER, SixIsland_DottedHole_SapphireRoom_Movement_PlayerWatchThiefExit\n\tapplymovement LOCALID_THIEF, SixIsland_DottedHole_SapphireRoom_Movement_ThiefExitEastWest\n\twaitmovement 0\n\treturn\n\nSixIsland_DottedHole_SapphireRoom_Movement_ThiefLookAtSapphireFromLeft::\n\twalk_up\n\twalk_up\n\twalk_in_place_faster_right\n\tstep_end\n\nSixIsland_DottedHole_SapphireRoom_Movement_ThiefLookAtSapphireFromBelow::\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_up\n\tstep_end\n\nSixIsland_DottedHole_SapphireRoom_Movement_ThiefGetSapphireFromLeft::\n\twalk_right\n\tstep_end\n\nSixIsland_DottedHole_SapphireRoom_Movement_ThiefGetSapphireFromBelow::\n\twalk_up\n\tstep_end\n\nSixIsland_DottedHole_SapphireRoom_Movement_ThiefExitNorth::\n\twalk_fast_up\n\twalk_fast_right\n\twalk_fast_right\n\twalk_fast_right\n\twalk_fast_down\n\twalk_fast_right\n\twalk_fast_right\n\tstep_end\n\nSixIsland_DottedHole_SapphireRoom_Movement_ThiefExitSouth::\n\twalk_fast_down\n\twalk_fast_right\n\twalk_fast_right\n\twalk_fast_right\n\twalk_fast_up\n\twalk_fast_right\n\twalk_fast_right\n\tstep_end\n\nSixIsland_DottedHole_SapphireRoom_Movement_ThiefExitEastWest::\n\twalk_fast_right\n\twalk_fast_right\n\twalk_fast_right\n\twalk_fast_right\n\twalk_fast_up\n\tstep_end\n\nSixIsland_DottedHole_SapphireRoom_Movement_ThiefFallIn::\n\tface_down\n\tdisable_anim\n\tslide_down\n\tslide_down\n\tslide_down\n\tslide_down\n\tslide_down\n\tslide_down\n\tslide_down\n\tslide_down\n\tslide_down\n\trestore_anim\n\tstep_end\n\nSixIsland_DottedHole_SapphireRoom_Movement_PlayerWatchThiefExit::\n\tdelay_16\n\twalk_in_place_faster_right\n\tstep_end\n\nSixIsland_DottedHole_SapphireRoom_EventScript_BrailleMessage::\n\tlockall\n\tsetvar VAR_0x8005, 130\n\tbraillemessage_wait Braille_Text_LetTheTwo\n\tbraillemessage_wait Braille_Text_Glittering\n\tbraillemessage_wait Braille_Text_Stones\n\tbraillemessage_wait Braille_Text_OneInRed\n\tbraillemessage_wait Braille_Text_OneInBlue\n\tbraillemessage_wait Braille_Text_ConnectThe\n\tbraillemessage_wait Braille_Text_Past\n\tbraillemessage_wait Braille_Text_TwoFriends\n\tbraillemessage_wait Braille_Text_Sharing\n\tbraillemessage_wait Braille_Text_PowerOpen\n\tbraillemessage_wait Braille_Text_AWindowTo\n\tbraillemessage_wait Braille_Text_ANewWorld\n\tbraillemessage_wait Braille_Text_ThatGlows\n\tbraillemessage_wait Braille_Text_TheNext\n\tbraillemessage_wait Braille_Text_WorldWaits\n\tbraillemessage Braille_Text_ForYou\n\twaitbuttonpress\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_DottedHole_SapphireRoom/text.inc",
    "content": "SixIsland_DottedHole_SapphireRoom_Text_FoundSapphire::\n    .string \"{PLAYER} found a SAPPHIRE!$\"\n\nSixIsland_DottedHole_SapphireRoom_Text_IWasRightInTailingYou::\n    .string \"Fufu… Fufufufu…\\n\"\n    .string \"I guessed right.\\p\"\n    .string \"I was right in tailing you!$\"\n\nSixIsland_DottedHole_SapphireRoom_Text_SellToTeamRocketTellPassword::\n    .string \"I knew that there was a SAPPHIRE\\n\"\n    .string \"here, so it belongs to me!\\p\"\n    .string \"I'll sell it to TEAM ROCKET for\\n\"\n    .string \"serious money.\\p\"\n    .string \"…D-don't glare at me like that!\\p\"\n    .string \"If you want it back, why don't you\\n\"\n    .string \"go get it after I sell it?\\p\"\n    .string \"I'll even tell you one of the\\n\"\n    .string \"passwords to TEAM ROCKET's\\l\"\n    .string \"WAREHOUSE.\\p\"\n    .string \"The WAREHOUSE password I know is\\n\"\n    .string \"“Yes, nah, CHANSEY.”\\p\"\n    .string \"I'm done.\\n\"\n    .string \"Don't think badly of me!$\"\n\n"
  },
  {
    "path": "data/maps/SixIsland_GreenPath/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_GREEN_PATH\",\n  \"name\": \"SixIsland_GreenPath\",\n  \"layout\": \"LAYOUT_SIX_ISLAND_GREEN_PATH\",\n  \"music\": \"MUS_SEVII_ROUTE\",\n  \"region_map_section\": \"MAPSEC_GREEN_PATH\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_SIX_ISLAND_OUTCAST_ISLAND\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 0,\n      \"map\": \"MAP_SIX_ISLAND_WATER_PATH\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PSYCHIC_F\",\n      \"x\": 11,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SixIsland_GreenPath_EventScript_Jaclyn\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 67,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_PATTERN_BUSH\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 68,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_PATTERN_BUSH\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 69,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_PATTERN_BUSH\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 46,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_PATTERN_BUSH\",\n      \"dest_warp_id\": 3\n    },\n    {\n      \"x\": 47,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_PATTERN_BUSH\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 48,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_PATTERN_BUSH\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 41,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SixIsland_GreenPath_EventScript_LeftRouteSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 75,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SixIsland_GreenPath_EventScript_RightRouteSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 12,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ULTRA_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SIX_ISLAND_GREEN_PATH_ULTRA_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_GreenPath/scripts.inc",
    "content": "SixIsland_GreenPath_MapScripts::\n\t.byte 0\n\nSixIsland_GreenPath_EventScript_RightRouteSign::\n\tmsgbox SixIsland_GreenPath_Text_LeftRouteSign, MSGBOX_SIGN\n\tend\n\nSixIsland_GreenPath_EventScript_LeftRouteSign::\n\tmsgbox SixIsland_GreenPath_Text_RightRouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_GreenPath/text.inc",
    "content": "SixIsland_GreenPath_Text_JaclynIntro::\n    .string \"…Huh?\\p\"\n    .string \"I was envisioning my house, but\\n\"\n    .string \"this is where I TELEPORT?$\"\n\nSixIsland_GreenPath_Text_JaclynDefeat::\n    .string \"Big boo-boo!$\"\n\nSixIsland_GreenPath_Text_JaclynPostBattle::\n    .string \"I am so scatterbrained!\\p\"\n    .string \"I need to focus so I can TELEPORT\\n\"\n    .string \"properly to my house!$\"\n\nSixIsland_GreenPath_Text_LeftRouteSign::\n    .string \"GREEN PATH\\n\"\n    .string \"PATTERN BUSH AHEAD$\"\n\nSixIsland_GreenPath_Text_RightRouteSign::\n    .string \"GREEN PATH\\n\"\n    .string \"Think Green, Keep Nature Clean!$\"\n\n"
  },
  {
    "path": "data/maps/SixIsland_Harbor/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_HARBOR\",\n  \"name\": \"SixIsland_Harbor\",\n  \"layout\": \"LAYOUT_ISLAND_HARBOR\",\n  \"music\": \"MUS_SEVII_45\",\n  \"region_map_section\": \"MAPSEC_SIX_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_Harbor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_Harbor/scripts.inc",
    "content": "SixIsland_Harbor_MapScripts::\n\t.byte 0\n\nSixIsland_Harbor_EventScript_Sailor::\n\tlock\n\tfaceplayer\n\tmessage Text_WhereDoYouWantToSail\n\twaitmessage\n\tsetvar VAR_0x8004, SEAGALLOP_SIX_ISLAND\n\tgoto EventScript_ChooseDestFromIsland\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_House/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_HOUSE\",\n  \"name\": \"SixIsland_House\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_SEVII_45\",\n  \"region_map_section\": \"MAPSEC_SIX_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_House_EventScript_OldMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_House/scripts.inc",
    "content": "SixIsland_House_MapScripts::\n\t.byte 0\n\nSixIsland_House_EventScript_OldMan::\n\tmsgbox SixIsland_House_Text_GoodPlaceForNatureAndHistory, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_House/text.inc",
    "content": "SixIsland_House_Text_GoodPlaceForNatureAndHistory::\n    .string \"There's nothing that young people'd\\n\"\n    .string \"find exciting here on this island.\\p\"\n    .string \"But, this is a good place in terms\\n\"\n    .string \"of nature and history.\\p\"\n    .string \"Relax and enjoy your stay.$\"\n\n"
  },
  {
    "path": "data/maps/SixIsland_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_MART\",\n  \"name\": \"SixIsland_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SIX_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_Mart_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_WOMAN\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_Mart_EventScript_OldWoman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_Mart_EventScript_Picnicker\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_Mart/scripts.inc",
    "content": "SixIsland_Mart_MapScripts::\n\t.byte 0\n\nSixIsland_Mart_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart SixIsland_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nSixIsland_Mart_Items::\n\t.2byte ITEM_ULTRA_BALL\n\t.2byte ITEM_FULL_RESTORE\n\t.2byte ITEM_MAX_POTION\n\t.2byte ITEM_REVIVE\n\t.2byte ITEM_FULL_HEAL\n\t.2byte ITEM_ESCAPE_ROPE\n\t.2byte ITEM_MAX_REPEL\n\t.2byte ITEM_DREAM_MAIL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nSixIsland_Mart_EventScript_Picnicker::\n\tmsgbox SixIsland_Mart_Text_ShouldBuyMailAndWriteLetter, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_Mart/text.inc",
    "content": "SixIsland_Mart_Text_AgathaOldestEverEliteFourMember::\n    .string \"Play with POKéMON lots and live\\n\"\n    .string \"a long life!\\p\"\n    .string \"Take AGATHA, for example.\\p\"\n    .string \"She set a record for being the\\n\"\n    .string \"oldest-ever ELITE FOUR member.\\p\"\n    .string \"She spurs me to do bigger things.$\"\n\nSixIsland_Mart_Text_ShouldBuyMailAndWriteLetter::\n    .string \"I should buy some MAIL and write\\n\"\n    .string \"him a letter…$\"\n\n"
  },
  {
    "path": "data/maps/SixIsland_OutcastIsland/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_OUTCAST_ISLAND\",\n  \"name\": \"SixIsland_OutcastIsland\",\n  \"layout\": \"LAYOUT_SIX_ISLAND_OUTCAST_ISLAND\",\n  \"music\": \"MUS_SEVII_ROUTE\",\n  \"region_map_section\": \"MAPSEC_OUTCAST_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_SIX_ISLAND_GREEN_PATH\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKET_M\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_OutcastIsland_EventScript_Rocket\",\n      \"flag\": \"FLAG_HIDE_FIVE_ISLAND_ROCKETS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_OutcastIsland_EventScript_Tylor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 34,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_OutcastIsland_EventScript_Mymo\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 14,\n      \"y\": 61,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_OutcastIsland_EventScript_Nicole\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 10,\n      \"y\": 44,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_OutcastIsland_EventScript_Ava\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TUBER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 44,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_OutcastIsland_EventScript_Geb\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_OutcastIsland_EventScript_ItemPPUp\",\n      \"flag\": \"FLAG_HIDE_SIX_ISLAND_OUTCAST_ISLAND_PP_UP\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_ALTERING_CAVE\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 16,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"item\": \"ITEM_STAR_PIECE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SIX_ISLAND_OUTCAST_ISLAND_STAR_PIECE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 6,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"item\": \"ITEM_NET_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SIX_ISLAND_OUTCAST_ISLAND_NET_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_OutcastIsland/scripts.inc",
    "content": "SixIsland_OutcastIsland_MapScripts::\n\t.byte 0\n\nSixIsland_OutcastIsland_EventScript_Rocket::\n\ttrainerbattle_single TRAINER_TEAM_ROCKET_GRUNT_46, SixIsland_OutcastIsland_Text_RocketIntro, SixIsland_OutcastIsland_Text_RocketDefeat\n\tmsgbox SixIsland_OutcastIsland_Text_RocketPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_OutcastIsland/text.inc",
    "content": "SixIsland_OutcastIsland_Text_RocketIntro::\n    .string \"There're no rare POKéMON around\\n\"\n    .string \"these parts! Not a one!\\p\"\n    .string \"That burns me up, man.\\n\"\n    .string \"I'll take it out on you!$\"\n\nSixIsland_OutcastIsland_Text_RocketDefeat::\n    .string \"…Huh?$\"\n\nSixIsland_OutcastIsland_Text_RocketPostBattle::\n    .string \"So listen, you haven't seen any\\n\"\n    .string \"rare POKéMON, have you?$\"\n\nSixIsland_OutcastIsland_Text_TylorIntro::\n    .string \"I'm having no luck at all.\\n\"\n    .string \"A battle'd be a change of pace!$\"\n\nSixIsland_OutcastIsland_Text_TylorDefeat::\n    .string \"Nope, no luck at all…$\"\n\nSixIsland_OutcastIsland_Text_TylorPostBattle::\n    .string \"I can't very well go home without\\n\"\n    .string \"catching something, though.$\"\n\nSixIsland_OutcastIsland_Text_MymoIntro::\n    .string \"Gasp… Gasp…\\p\"\n    .string \"I swam here from SIX ISLE PORT\\n\"\n    .string \"in one go.$\"\n\nSixIsland_OutcastIsland_Text_MymoDefeat::\n    .string \"Gasp…\\n\"\n    .string \"Gasp…$\"\n\nSixIsland_OutcastIsland_Text_MymoPostBattle::\n    .string \"I'm only at the halfway point…\\n\"\n    .string \"I'm beat…$\"\n\nSixIsland_OutcastIsland_Text_NicoleIntro::\n    .string \"It's not so easy sending POKéMON\\n\"\n    .string \"out while swimming, you know?$\"\n\nSixIsland_OutcastIsland_Text_NicoleDefeat::\n    .string \"I didn't lose to you at swimming.\\n\"\n    .string \"This doesn't bother me.$\"\n\nSixIsland_OutcastIsland_Text_NicolePostBattle::\n    .string \"Are you headed for the island up\\n\"\n    .string \"past here?\\p\"\n    .string \"I didn't see anything interesting\\n\"\n    .string \"there.$\"\n\nSixIsland_OutcastIsland_Text_AvaIntro::\n    .string \"AVA: Let's have a two-on-two\\n\"\n    .string \"marine battle!$\"\n\nSixIsland_OutcastIsland_Text_AvaDefeat::\n    .string \"AVA: Oh, you're amazing!\\n\"\n    .string \"Even better, you're on your own!$\"\n\nSixIsland_OutcastIsland_Text_AvaPostBattle::\n    .string \"AVA: You know, I do prefer the\\n\"\n    .string \"sea over any pool.$\"\n\nSixIsland_OutcastIsland_Text_AvaNotEnoughMons::\n    .string \"AVA: You're challenging us to\\n\"\n    .string \"a battle?\\p\"\n    .string \"You'll need at least two POKéMON\\n\"\n    .string \"if you want to do that.$\"\n\nSixIsland_OutcastIsland_Text_GebIntro::\n    .string \"GEB: Big Sister, help!\\n\"\n    .string \"Please battle with me!$\"\n\nSixIsland_OutcastIsland_Text_GebDefeat::\n    .string \"GEB: Wow, Big Sister, this person's\\n\"\n    .string \"really good!$\"\n\nSixIsland_OutcastIsland_Text_GebPostBattle::\n    .string \"GEB: I'm hanging onto my sister\\n\"\n    .string \"because I can't touch the bottom.$\"\n\nSixIsland_OutcastIsland_Text_GebNotEnoughMons::\n    .string \"GEB: Please battle against me and\\n\"\n    .string \"my sister!\\p\"\n    .string \"…Oh, you don't have two POKéMON?$\"\n"
  },
  {
    "path": "data/maps/SixIsland_PatternBush/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_PATTERN_BUSH\",\n  \"name\": \"SixIsland_PatternBush\",\n  \"layout\": \"LAYOUT_SIX_ISLAND_PATTERN_BUSH\",\n  \"music\": \"MUS_VIRIDIAN_FOREST\",\n  \"region_map_section\": \"MAPSEC_PATTERN_BUSH\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"in_connection\": false,\n      \"x\": 48,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SixIsland_PatternBush_EventScript_Bethany\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKEMON_BREEDER\",\n      \"x\": 10,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SixIsland_PatternBush_EventScript_Allison\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 51,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SixIsland_PatternBush_EventScript_Garret\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SixIsland_PatternBush_EventScript_Jonah\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 37,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 5,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_PatternBush_EventScript_Vance\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SixIsland_PatternBush_EventScript_Nash\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 52,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"SixIsland_PatternBush_EventScript_Cordell\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"SixIsland_PatternBush_EventScript_Dalia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 39,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SixIsland_PatternBush_EventScript_Joana\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CAMPER\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SixIsland_PatternBush_EventScript_Riley\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT\",\n      \"movement_range_x\": 5,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_PatternBush_EventScript_Marcy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_RUIN_MANIAC\",\n      \"x\": 30,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SixIsland_PatternBush_EventScript_Layton\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 54,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_GREEN_PATH\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 55,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_GREEN_PATH\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 56,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_GREEN_PATH\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_GREEN_PATH\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_GREEN_PATH\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_GREEN_PATH\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_PatternBush/scripts.inc",
    "content": "SixIsland_PatternBush_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SixIsland_PatternBush_OnTransition\n\t.byte 0\n\nSixIsland_PatternBush_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_SIX_ISLAND_PATTERN_BUSH\n\tgetplayerxy VAR_TEMP_1, VAR_TEMP_2\n\tcall_if_ge VAR_TEMP_1, 50, SixIsland_PatternBush_EventScript_SetEscapeRightExit\n\tcall_if_le VAR_TEMP_1, 49, SixIsland_PatternBush_EventScript_SetEscapeLeftExit\n\tend\n\nSixIsland_PatternBush_EventScript_SetEscapeRightExit::\n\tsetescapewarp MAP_SIX_ISLAND_GREEN_PATH, 255, 64, 10\n\treturn\n\nSixIsland_PatternBush_EventScript_SetEscapeLeftExit::\n\tsetescapewarp MAP_SIX_ISLAND_GREEN_PATH, 255, 45, 10\n\treturn\n\nSixIsland_PatternBush_EventScript_Bethany::\n\ttrainerbattle_single TRAINER_PKMN_BREEDER_BETHANY, SixIsland_PatternBush_Text_BethanyIntro, SixIsland_PatternBush_Text_BethanyDefeat\n\tmsgbox SixIsland_PatternBush_Text_BethanyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_PatternBush_EventScript_Allison::\n\ttrainerbattle_single TRAINER_PKMN_BREEDER_ALLISON, SixIsland_PatternBush_Text_AllisonIntro, SixIsland_PatternBush_Text_AllisonDefeat\n\tmsgbox SixIsland_PatternBush_Text_AllisonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_PatternBush_EventScript_Garret::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_GARRET, SixIsland_PatternBush_Text_GarretIntro, SixIsland_PatternBush_Text_GarretDefeat\n\tmsgbox SixIsland_PatternBush_Text_GarretPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_PatternBush_EventScript_Jonah::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_JONAH, SixIsland_PatternBush_Text_JonahIntro, SixIsland_PatternBush_Text_JonahDefeat\n\tmsgbox SixIsland_PatternBush_Text_JonahPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_PatternBush_EventScript_Vance::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_VANCE, SixIsland_PatternBush_Text_VanceIntro, SixIsland_PatternBush_Text_VanceDefeat\n\tmsgbox SixIsland_PatternBush_Text_VancePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_PatternBush_EventScript_Nash::\n\ttrainerbattle_single TRAINER_YOUNGSTER_NASH, SixIsland_PatternBush_Text_NashIntro, SixIsland_PatternBush_Text_NashDefeat\n\tmsgbox SixIsland_PatternBush_Text_NashPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_PatternBush_EventScript_Cordell::\n\ttrainerbattle_single TRAINER_YOUNGSTER_CORDELL, SixIsland_PatternBush_Text_CordellIntro, SixIsland_PatternBush_Text_CordellDefeat\n\tmsgbox SixIsland_PatternBush_Text_CordellPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_PatternBush_EventScript_Dalia::\n\ttrainerbattle_single TRAINER_LASS_DALIA, SixIsland_PatternBush_Text_DaliaIntro, SixIsland_PatternBush_Text_DaliaDefeat\n\tmsgbox SixIsland_PatternBush_Text_DaliaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_PatternBush_EventScript_Joana::\n\ttrainerbattle_single TRAINER_LASS_JOANA, SixIsland_PatternBush_Text_JoanaIntro, SixIsland_PatternBush_Text_JoanaDefeat\n\tmsgbox SixIsland_PatternBush_Text_JoanaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_PatternBush_EventScript_Riley::\n\ttrainerbattle_single TRAINER_CAMPER_RILEY, SixIsland_PatternBush_Text_RileyIntro, SixIsland_PatternBush_Text_RileyDefeat\n\tmsgbox SixIsland_PatternBush_Text_RileyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_PatternBush_EventScript_Marcy::\n\ttrainerbattle_single TRAINER_PICNICKER_MARCY, SixIsland_PatternBush_Text_MarcyIntro, SixIsland_PatternBush_Text_MarcyDefeat\n\tmsgbox SixIsland_PatternBush_Text_MarcyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_PatternBush_EventScript_Layton::\n\ttrainerbattle_single TRAINER_RUIN_MANIAC_LAYTON, SixIsland_PatternBush_Text_LaytonIntro, SixIsland_PatternBush_Text_LaytonDefeat\n\tmsgbox SixIsland_PatternBush_Text_LaytonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_PatternBush/text.inc",
    "content": "SixIsland_PatternBush_Text_BethanyIntro::\n    .string \"I'm curious, how do you raise your\\n\"\n    .string \"POKéMON?$\"\n\nSixIsland_PatternBush_Text_BethanyDefeat::\n    .string \"You raise your POKéMON with a\\n\"\n    .string \"whole lot of love!$\"\n\nSixIsland_PatternBush_Text_BethanyPostBattle::\n    .string \"In the same way your mother raised\\n\"\n    .string \"you full of love, you should raise\\l\"\n    .string \"your POKéMON.$\"\n\nSixIsland_PatternBush_Text_AllisonIntro::\n    .string \"I'm working to preserve the natural\\n\"\n    .string \"ecology of POKéMON here.$\"\n\nSixIsland_PatternBush_Text_AllisonDefeat::\n    .string \"Oh, for someone so young, you are\\n\"\n    .string \"tremendous!$\"\n\nSixIsland_PatternBush_Text_AllisonPostBattle::\n    .string \"I'm not saying that you shouldn't\\n\"\n    .string \"catch POKéMON.\\p\"\n    .string \"I just want people to raise their\\n\"\n    .string \"POKéMON responsibly.$\"\n\nSixIsland_PatternBush_Text_GarretIntro::\n    .string \"I caught a BUG POKéMON that lives\\n\"\n    .string \"only around here!$\"\n\nSixIsland_PatternBush_Text_GarretDefeat::\n    .string \"Heheh…\\n\"\n    .string \"Isn't my POKéMON awesome?$\"\n\nSixIsland_PatternBush_Text_GarretPostBattle::\n    .string \"There's a girl near the BUSH who\\n\"\n    .string \"measures HERACROSS for TRAINERS.$\"\n\nSixIsland_PatternBush_Text_JonahIntro::\n    .string \"You know, it just doesn't feel right\\n\"\n    .string \"if I don't use BUG POKéMON.$\"\n\nSixIsland_PatternBush_Text_JonahDefeat::\n    .string \"It's okay, losing is a fun part of\\n\"\n    .string \"POKéMON's appeal, too.$\"\n\nSixIsland_PatternBush_Text_JonahPostBattle::\n    .string \"By the way, “appeal” is a weird\\n\"\n    .string \"word, if you think about it.\\p\"\n    .string \"Like, is it like an orange peel?\\n\"\n    .string \"Or like a ringing bell?$\"\n\nSixIsland_PatternBush_Text_VanceIntro::\n    .string \"Yeah, yeah, yeah!\\n\"\n    .string \"Look at all the BUG POKéMON!$\"\n\nSixIsland_PatternBush_Text_VanceDefeat::\n    .string \"I got beat while I was still busy\\n\"\n    .string \"celebrating!$\"\n\nSixIsland_PatternBush_Text_VancePostBattle::\n    .string \"I'm going to bring my little brother\\n\"\n    .string \"here next time.$\"\n\nSixIsland_PatternBush_Text_NashIntro::\n    .string \"Look, look! There are funny\\n\"\n    .string \"patterns on the ground.$\"\n\nSixIsland_PatternBush_Text_NashDefeat::\n    .string \"Super awesome!$\"\n\nSixIsland_PatternBush_Text_NashPostBattle::\n    .string \"The funny patterns on the ground…\\p\"\n    .string \"They look like the patterns on my\\n\"\n    .string \"grandpa's clothes.$\"\n\nSixIsland_PatternBush_Text_CordellIntro::\n    .string \"I bet you think I'm just some guy,\\n\"\n    .string \"don't you, eh?$\"\n\nSixIsland_PatternBush_Text_CordellDefeat::\n    .string \"I bet you think I'm weak,\\n\"\n    .string \"don't you, eh?$\"\n\nSixIsland_PatternBush_Text_CordellPostBattle::\n    .string \"Ayup, you townies come around all\\n\"\n    .string \"so dandy with a hat that flashy…\\p\"\n    .string \"How about giving me that?$\"\n\nSixIsland_PatternBush_Text_DaliaIntro::\n    .string \"Take a deep breath.\\n\"\n    .string \"Isn't the air delicious?$\"\n\nSixIsland_PatternBush_Text_DaliaDefeat::\n    .string \"If you'd like, I can teach you how\\n\"\n    .string \"to breathe properly.$\"\n\nSixIsland_PatternBush_Text_DaliaPostBattle::\n    .string \"First, exhale.\\n\"\n    .string \"Blow everything out.\\p\"\n    .string \"When you can't exhale anymore,\\n\"\n    .string \"inhale the clean air!\\p\"\n    .string \"Isn't it refreshing?$\"\n\nSixIsland_PatternBush_Text_JoanaIntro::\n    .string \"I love BUG POKéMON.\\n\"\n    .string \"That's why I'm here all the time.\\p\"\n    .string \"Am I the only girl like that?$\"\n\nSixIsland_PatternBush_Text_JoanaDefeat::\n    .string \"I lost, but I'm still laughing.\\n\"\n    .string \"Am I the only girl like that?$\"\n\nSixIsland_PatternBush_Text_JoanaPostBattle::\n    .string \"I'm going to keep on collecting\\n\"\n    .string \"BUG POKéMON.\\p\"\n    .string \"Am I the only girl like that?$\"\n\nSixIsland_PatternBush_Text_RileyIntro::\n    .string \"This is a good spot.\\n\"\n    .string \"I'll pitch my tent here.$\"\n\nSixIsland_PatternBush_Text_RileyDefeat::\n    .string \"Wimped out…$\"\n\nSixIsland_PatternBush_Text_RileyPostBattle::\n    .string \"I'm going to observe the night sky\\n\"\n    .string \"here.$\"\n\nSixIsland_PatternBush_Text_MarcyIntro::\n    .string \"Oh, yuck!\\n\"\n    .string \"I think a bug stung me!$\"\n\nSixIsland_PatternBush_Text_MarcyDefeat::\n    .string \"It wasn't a bug.\\n\"\n    .string \"I cut my shin on some grass.$\"\n\nSixIsland_PatternBush_Text_MarcyPostBattle::\n    .string \"A little cut like that…\\n\"\n    .string \"A little spit's enough to cure it!$\"\n\nSixIsland_PatternBush_Text_LaytonIntro::\n    .string \"Have you noticed something odd\\n\"\n    .string \"about these parts?$\"\n\nSixIsland_PatternBush_Text_LaytonDefeat::\n    .string \"Have you taken a good look around\\n\"\n    .string \"your feet?$\"\n\nSixIsland_PatternBush_Text_LaytonPostBattle::\n    .string \"There are places here in PATTERN\\n\"\n    .string \"BUSH where grass won't grow.\\p\"\n    .string \"What could be the cause of such\\n\"\n    .string \"a phenomenon?$\"\n\n"
  },
  {
    "path": "data/maps/SixIsland_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_POKEMON_CENTER_1F\",\n  \"name\": \"SixIsland_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SIX_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLUE\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_SIX_ISLAND_POKECENTER_RIVAL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_PokemonCenter_1F_EventScript_Hiker\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_PokemonCenter_1F_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SIX_ISLAND_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_PokemonCenter_1F/scripts.inc",
    "content": ".equ LOCALID_RIVAL, 3\n\nSixIsland_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, SixIsland_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, SixIsland_PokemonCenter_1F_OnFrame\n\t.byte 0\n\nSixIsland_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_SIX_ISLAND\n\tcall_if_eq VAR_MAP_SCENE_SIX_ISLAND_POKEMON_CENTER_1F, 0, SixIsland_PokemonCenter_1F_EventScript_ShowRival\n\tend\n\nSixIsland_PokemonCenter_1F_EventScript_ShowRival::\n\tclearflag FLAG_HIDE_SIX_ISLAND_POKECENTER_RIVAL\n\treturn\n\nSixIsland_PokemonCenter_1F_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_SIX_ISLAND_POKEMON_CENTER_1F, 0, SixIsland_PokemonCenter_1F_EventScript_RivalScene\n\t.2byte 0\n\nSixIsland_PokemonCenter_1F_EventScript_RivalScene::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tplaybgm MUS_ENCOUNTER_RIVAL, 0\n\tapplymovement LOCALID_RIVAL, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_RIVAL, Common_Movement_Delay48\n\twaitmovement 0\n\tdelay 25\n\tapplymovement LOCALID_RIVAL, SixIsland_PokemonCenter_1F_Movement_RivalApproach\n\twaitmovement 0\n\tmsgbox SixIsland_PokemonCenter_1F_Text_RivalImpossibleToGetAllMonsAroundHere\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, SixIsland_PokemonCenter_1F_Movement_PlayerWatchRivalExit\n\tapplymovement LOCALID_RIVAL, SixIsland_PokemonCenter_1F_Movement_RivalExit\n\twaitmovement 0\n\tfadedefaultbgm\n\tplayse SE_EXIT\n\tdelay 35\n\tremoveobject LOCALID_RIVAL\n\tsetvar VAR_MAP_SCENE_SIX_ISLAND_POKEMON_CENTER_1F, 1\n\tsetvar VAR_MAP_SCENE_FOUR_ISLAND, 1\n\treleaseall\n\tend\n\nSixIsland_PokemonCenter_1F_Movement_RivalApproach::\n\twalk_right\n\twalk_right\n\twalk_down\n\twalk_down\n\tstep_end\n\nSixIsland_PokemonCenter_1F_Movement_RivalExit::\n\tdelay_16\n\tdelay_4\n\twalk_down\n\tstep_end\n\nSixIsland_PokemonCenter_1F_Movement_PlayerWatchRivalExit::\n\twalk_left\n\twalk_in_place_faster_right\n\tstep_end\n\nSixIsland_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nSixIsland_PokemonCenter_1F_EventScript_Hiker::\n\tmsgbox SixIsland_PokemonCenter_1F_Text_SomethingHiddenOnThisIsland, MSGBOX_NPC\n\tend\n\nSixIsland_PokemonCenter_1F_EventScript_OldMan::\n\tmsgbox SixIsland_PokemonCenter_1F_Text_SomeMonsEvolveByTradingWithHeldItem, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_PokemonCenter_1F/text.inc",
    "content": "SixIsland_PokemonCenter_1F_Text_SomethingHiddenOnThisIsland::\n    .string \"For ten years, I've searched for\\n\"\n    .string \"RUINS.\\p\"\n    .string \"No, make that twenty years.\\p\"\n    .string \"I get this feeling that there's\\n\"\n    .string \"something hidden on this island.$\"\n\nSixIsland_PokemonCenter_1F_Text_SomeMonsEvolveByTradingWithHeldItem::\n    .string \"You know of POKéMON that evolve\\n\"\n    .string \"only upon trading, yes?\\p\"\n    .string \"But did you know that there are\\n\"\n    .string \"still others?\\p\"\n    .string \"Some POKéMON evolve only when\\n\"\n    .string \"traded while holding specific items.$\"\n\nSixIsland_PokemonCenter_1F_Text_RivalImpossibleToGetAllMonsAroundHere::\n    .string \"{RIVAL}: Hey, {PLAYER}!\\n\"\n    .string \"How's your POKéDEX filling up?\\p\"\n    .string \"It looks like it's impossible to get\\n\"\n    .string \"all the POKéMON by hanging around\\l\"\n    .string \"just these parts.\\p\"\n    .string \"Maybe there are POKéMON we don't\\n\"\n    .string \"know about somewhere far away…\\p\"\n    .string \"… … …  … … …  … … …\\p\"\n    .string \"Well, if I can't do it, there's no\\n\"\n    .string \"way for you to get it done.\\p\"\n    .string \"I'm not going to get all desperate\\n\"\n    .string \"over this.\\p\"\n    .string \"I'll keep collecting POKéMON at my\\n\"\n    .string \"own pace while I train them.\\p\"\n    .string \"That's what I'll do.\\n\"\n    .string \"So there's no point staying here.\\l\"\n    .string \"I may as well leave for home.\\p\"\n    .string \"That's that, then!\\n\"\n    .string \"Smell ya later!$\"\n\n"
  },
  {
    "path": "data/maps/SixIsland_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_POKEMON_CENTER_2F\",\n  \"name\": \"SixIsland_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SIX_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"in_connection\": false,\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_SIX_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_PokemonCenter_2F/scripts.inc",
    "content": "SixIsland_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nSixIsland_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nSixIsland_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nSixIsland_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_RuinValley/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_RUIN_VALLEY\",\n  \"name\": \"SixIsland_RuinValley\",\n  \"layout\": \"LAYOUT_SIX_ISLAND_RUIN_VALLEY\",\n  \"music\": \"MUS_SEVII_ROUTE\",\n  \"region_map_section\": \"MAPSEC_RUIN_VALLEY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"right\",\n      \"offset\": -80,\n      \"map\": \"MAP_SIX_ISLAND_WATER_PATH\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_RuinValley_EventScript_Scientist\",\n      \"flag\": \"FLAG_HIDE_RUIN_VALLEY_SCIENTIST\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_RUIN_MANIAC\",\n      \"x\": 32,\n      \"y\": 11,\n      \"elevation\": 5,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"SixIsland_RuinValley_EventScript_Stanly\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_RUIN_MANIAC\",\n      \"x\": 33,\n      \"y\": 16,\n      \"elevation\": 5,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SixIsland_RuinValley_EventScript_Foster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_RUIN_MANIAC\",\n      \"x\": 31,\n      \"y\": 24,\n      \"elevation\": 5,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_RuinValley_EventScript_Larry\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 10,\n      \"elevation\": 5,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"SixIsland_RuinValley_EventScript_Daryl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKE_MANIAC\",\n      \"x\": 21,\n      \"y\": 29,\n      \"elevation\": 5,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_RuinValley_EventScript_Hector\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 10,\n      \"elevation\": 5,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 12,\n      \"elevation\": 5,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 11,\n      \"elevation\": 5,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 41,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 41,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 42,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_RuinValley_EventScript_ItemHPUp\",\n      \"flag\": \"FLAG_HIDE_SIX_ISLAND_RUIN_VALLEY_HP_UP\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 11,\n      \"elevation\": 5,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_RuinValley_EventScript_ItemFullRestore\",\n      \"flag\": \"FLAG_HIDE_SIX_ISLAND_RUIN_VALLEY_FULL_RESTORE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 43,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_RuinValley_EventScript_ItemSunStone\",\n      \"flag\": \"FLAG_HIDE_SIX_ISLAND_RUIN_VALLEY_SUN_STONE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 24,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_DOTTED_HOLE_1F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 24,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SixIsland_RuinValley_EventScript_DottedHoleDoor\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_RuinValley/scripts.inc",
    "content": ".set LOCALID_SCIENTIST, 1\n\nSixIsland_RuinValley_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, SixIsland_RuinValley_OnLoad\n\t.byte 0\n\nSixIsland_RuinValley_OnLoad::\n\tcall_if_set FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE, SixIsland_RuinValley_EventScript_OpenDottedHoleDoor\n\tend\n\nSixIsland_RuinValley_EventScript_OpenDottedHoleDoor::\n\tsetmetatile 24, 24, METATILE_SeviiIslands67_DottedHoleDoor_Open, 0\n\treturn\n\nSixIsland_RuinValley_EventScript_Scientist::\n\tlock\n\tmsgbox SixIsland_RuinValley_Text_CantFigureOutHowToGetInside\n\tapplymovement LOCALID_SCIENTIST, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox SixIsland_RuinValley_Text_IFoundThisPlace\n\tapplymovement LOCALID_SCIENTIST, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nSixIsland_RuinValley_EventScript_DottedHoleDoor::\n\tlockall\n\tgoto_if_set FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE, SixIsland_RuinValley_EventScript_DottedHoleDoorOpen\n\tmsgbox SixIsland_RuinValley_Text_CheckDoorMoreThoroughly, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, SixIsland_RuinValley_EventScript_IgnoreDottedHoleDoor\n\tmsgbox SixIsland_RuinValley_Text_SeveralDotsOnTheDoor\n\tbraillemessage Braille_Text_Cut\n\twaitbuttonpress\n\treleaseall\n\tend\n\nSixIsland_RuinValley_EventScript_DottedHoleDoorOpen::\n\tmsgbox SixIsland_RuinValley_Text_DoorIsOpen\n\treleaseall\n\tend\n\nSixIsland_RuinValley_EventScript_IgnoreDottedHoleDoor::\n\tmsgbox SixIsland_RuinValley_Text_LeftDoorAlone\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_RuinValley/text.inc",
    "content": "SixIsland_RuinValley_Text_CantFigureOutHowToGetInside::\n    .string \"I can't figure out how I'm supposed\\n\"\n    .string \"to get inside.$\"\n\nSixIsland_RuinValley_Text_IFoundThisPlace::\n    .string \"Let me tell you, I found this\\n\"\n    .string \"place.\\p\"\n    .string \"Don't look so envious, will you?$\"\n\nSixIsland_RuinValley_Text_CheckDoorMoreThoroughly::\n    .string \"The door doesn't budge at all.\\n\"\n    .string \"Check it more thoroughly?$\"\n\nSixIsland_RuinValley_Text_LeftDoorAlone::\n    .string \"{PLAYER} left the door alone.$\"\n\nSixIsland_RuinValley_Text_SeveralDotsOnTheDoor::\n    .string \"On closer inspection, there are\\n\"\n    .string \"several dots on the door…$\"\n\nSixIsland_RuinValley_Text_DoorIsOpen::\n    .string \"The door is open.$\"\n\nSixIsland_RuinValley_Text_StanlyIntro::\n    .string \"There appear to be many secrets\\n\"\n    .string \"still unsolved in this world.$\"\n\nSixIsland_RuinValley_Text_StanlyDefeat::\n    .string \"Hmm…$\"\n\nSixIsland_RuinValley_Text_StanlyPostBattle::\n    .string \"I suggest to you that you, too,\\n\"\n    .string \"give a thought to the secrets and\\l\"\n    .string \"mysteries of our world once a day.$\"\n\nSixIsland_RuinValley_Text_FosterIntro::\n    .string \"I'm curious, what compelled you to\\n\"\n    .string \"come here?$\"\n\nSixIsland_RuinValley_Text_FosterDefeat::\n    .string \"It's been so long since I battled,\\n\"\n    .string \"my instincts are off.$\"\n\nSixIsland_RuinValley_Text_FosterPostBattle::\n    .string \"There are several ruins on the\\n\"\n    .string \"SEVII ISLANDS.\\p\"\n    .string \"The majority of them date back\\n\"\n    .string \"a long way.$\"\n\nSixIsland_RuinValley_Text_LarryIntro::\n    .string \"It's been said that there are\\n\"\n    .string \"mysterious stones on this island.\\p\"\n    .string \"I suspect it has something to do\\n\"\n    .string \"with the ruins here.$\"\n\nSixIsland_RuinValley_Text_LarryDefeat::\n    .string \"Oh, interesting.$\"\n\nSixIsland_RuinValley_Text_LarryPostBattle::\n    .string \"Those ruins over there…\\p\"\n    .string \"I haven't had any luck in finding\\n\"\n    .string \"how I can get inside.$\"\n\nSixIsland_RuinValley_Text_DarylIntro::\n    .string \"A battle with you, so high up!$\"\n\nSixIsland_RuinValley_Text_DarylDefeat::\n    .string \"Oh, the heartbreak of losing so\\n\"\n    .string \"easily to you!$\"\n\nSixIsland_RuinValley_Text_DarylPostBattle::\n    .string \"Experience the joy of climbing!$\"\n\nSixIsland_RuinValley_Text_HectorIntro::\n    .string \"I'm pretty familiar with the land\\n\"\n    .string \"around these parts.$\"\n\nSixIsland_RuinValley_Text_HectorDefeat::\n    .string \"You don't need to be so pushy.\\n\"\n    .string \"I'll be happy to tell you.$\"\n\nSixIsland_RuinValley_Text_HectorPostBattle::\n    .string \"The door to the ruins…\\n\"\n    .string \"It has these strange patterns\\l\"\n    .string \"engraved on the outside.\\p\"\n    .string \"I don't know what they mean,\\n\"\n    .string \"though.$\"\n"
  },
  {
    "path": "data/maps/SixIsland_WaterPath/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_WATER_PATH\",\n  \"name\": \"SixIsland_WaterPath\",\n  \"layout\": \"LAYOUT_SIX_ISLAND_WATER_PATH\",\n  \"music\": \"MUS_SEVII_ROUTE\",\n  \"region_map_section\": \"MAPSEC_WATER_PATH\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"left\",\n      \"offset\": 0,\n      \"map\": \"MAP_SIX_ISLAND_GREEN_PATH\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": 40,\n      \"map\": \"MAP_SIX_ISLAND\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": 80,\n      \"map\": \"MAP_SIX_ISLAND_RUIN_VALLEY\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_AROMA_LADY\",\n      \"x\": 12,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SixIsland_WaterPath_EventScript_Rose\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_JUGGLER\",\n      \"x\": 11,\n      \"y\": 52,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"SixIsland_WaterPath_EventScript_Edward\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_M_WATER\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 35,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"SixIsland_WaterPath_EventScript_Samir\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 15,\n      \"y\": 45,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_WaterPath_EventScript_Denise\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TWIN\",\n      \"x\": 6,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_WaterPath_EventScript_Miu\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TWIN\",\n      \"x\": 7,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"SixIsland_WaterPath_EventScript_Mia\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 76,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"SixIsland_WaterPath_EventScript_Earl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_WaterPath_EventScript_ItemElixir\",\n      \"flag\": \"FLAG_HIDE_SIX_ISLAND_WATER_PATH_ELIXIR\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 87,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_WaterPath_EventScript_ItemDragonScale\",\n      \"flag\": \"FLAG_HIDE_SIX_ISLAND_WATER_PATH_DRAGON_SCALE\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SIX_ISLAND_WATER_PATH_HOUSE1\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SIX_ISLAND_WATER_PATH_HOUSE2\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SixIsland_WaterPath_EventScript_HornWantedSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 15,\n      \"y\": 76,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ASPEAR_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SIX_ISLAND_WATER_PATH_ASPEAR_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 3,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ORAN_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SIX_ISLAND_WATER_PATH_ORAN_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 13,\n      \"y\": 63,\n      \"elevation\": 3,\n      \"item\": \"ITEM_QUALOT_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_SIX_ISLAND_WATER_PATH_QUALOT_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 54,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SixIsland_WaterPath_EventScript_RouteSign\"\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_WaterPath/scripts.inc",
    "content": "SixIsland_WaterPath_MapScripts::\n\t.byte 0\n\nSixIsland_WaterPath_EventScript_HornWantedSign::\n\tmsgbox SixIsland_WaterPath_Text_WantedUltimateHorn, MSGBOX_SIGN\n\tend\n\nSixIsland_WaterPath_EventScript_RouteSign::\n\tmsgbox SixIsland_WaterPath_Text_RouteSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_WaterPath/text.inc",
    "content": "SixIsland_WaterPath_Text_RoseIntro::\n    .string \"I let a pleasant breeze lead me\\n\"\n    .string \"all the way here.$\"\n\nSixIsland_WaterPath_Text_RoseDefeat::\n    .string \"Giggle… You're so cute when you're\\n\"\n    .string \"determined.$\"\n\nSixIsland_WaterPath_Text_RosePostBattle::\n    .string \"I want to go to the woods over\\n\"\n    .string \"there, but…\\p\"\n    .string \"There are lots of BUG POKéMON.\\n\"\n    .string \"They scare me a little.$\"\n\nSixIsland_WaterPath_Text_EdwardIntro::\n    .string \"I'm practicing in secret so no one\\n\"\n    .string \"can see me.$\"\n\nSixIsland_WaterPath_Text_EdwardDefeat::\n    .string \"Nobody saw me losing, right?$\"\n\nSixIsland_WaterPath_Text_EdwardPostBattle::\n    .string \"As a performer, I don't want people\\n\"\n    .string \"to know about the effort I put in.$\"\n\nSixIsland_WaterPath_Text_SamirIntro::\n    .string \"What, you're suggesting that you're\\n\"\n    .string \"sick of seeing SWIMMERS like me?\\p\"\n    .string \"Aww, don't be hatin'!$\"\n\nSixIsland_WaterPath_Text_SamirDefeat::\n    .string \"Oh, no, no, no.$\"\n\nSixIsland_WaterPath_Text_SamirPostBattle::\n    .string \"I couldn't lift the stigma of being\\n\"\n    .string \"a SWIMMER…$\"\n\nSixIsland_WaterPath_Text_DeniseIntro::\n    .string \"My boyfriend's always busy, so I\\n\"\n    .string \"come swimming by myself.$\"\n\nSixIsland_WaterPath_Text_DeniseDefeat::\n    .string \"Awww, I knew this would happen!$\"\n\nSixIsland_WaterPath_Text_DenisePostBattle::\n    .string \"When I can't be with my boyfriend,\\n\"\n    .string \"I spend time with the POKéMON he\\l\"\n    .string \"gave me.$\"\n\nSixIsland_WaterPath_Text_EarlIntro::\n    .string \"Tell me, where are the mountains\\n\"\n    .string \"around these parts?$\"\n\nSixIsland_WaterPath_Text_EarlDefeat::\n    .string \"I lost my way while I was busy\\n\"\n    .string \"battling!$\"\n\nSixIsland_WaterPath_Text_EarlPostBattle::\n    .string \"Aren't there any mountains around\\n\"\n    .string \"these parts?$\"\n\nSixIsland_WaterPath_Text_MiuIntro::\n    .string \"MIU: Hello, POKéMON!\\n\"\n    .string \"It's time to play!$\"\n\nSixIsland_WaterPath_Text_MiuDefeat::\n    .string \"MIU: Oh, no!\\n\"\n    .string \"Mommy!$\"\n\nSixIsland_WaterPath_Text_MiuPostBattle::\n    .string \"MIU: It makes me all sad inside\\n\"\n    .string \"when we lose…$\"\n\nSixIsland_WaterPath_Text_MiuNotEnoughMons::\n    .string \"MIU: MIA and I are TWINS.\\n\"\n    .string \"We want to battle together.$\"\n\nSixIsland_WaterPath_Text_MiaIntro::\n    .string \"MIA: Hello, POKéMON!\\n\"\n    .string \"It's time to battle!$\"\n\nSixIsland_WaterPath_Text_MiaDefeat::\n    .string \"MIA: You're mean!\\n\"\n    .string \"You're bad for winning!$\"\n\nSixIsland_WaterPath_Text_MiaPostBattle::\n    .string \"MIA: Ohh…\\n\"\n    .string \"I'm sorry, my POKéMON…$\"\n\nSixIsland_WaterPath_Text_MiaNotEnoughMons::\n    .string \"MIA: Oh, you only have one\\n\"\n    .string \"POKéMON?\\p\"\n    .string \"Don't you feel lonesome?$\"\n\nSixIsland_WaterPath_Text_WantedUltimateHorn::\n    .string \"Wanted!\\n\"\n    .string \"The Ultimate Horn!$\"\n\nSixIsland_WaterPath_Text_RouteSign::\n    .string \"WATER PATH\\n\"\n    .string \"Leads to RUIN VALLEY$\"\n\n"
  },
  {
    "path": "data/maps/SixIsland_WaterPath_House1/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_WATER_PATH_HOUSE1\",\n  \"name\": \"SixIsland_WaterPath_House1\",\n  \"layout\": \"LAYOUT_HOUSE4\",\n  \"music\": \"MUS_SEVII_45\",\n  \"region_map_section\": \"MAPSEC_WATER_PATH\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_WaterPath_House1_EventScript_Beauty\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_WATER_PATH\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SixIsland_WaterPath_House1_EventScript_SizeRecord\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_WaterPath_House1/scripts.inc",
    "content": "SixIsland_WaterPath_House1_MapScripts::\n\t.byte 0\n\nSixIsland_WaterPath_House1_EventScript_Beauty::\n\tlock\n\tfaceplayer\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tsetvar VAR_0x8004, SPECIES_HERACROSS\n\tspecialvar VAR_RESULT, DoesPlayerPartyContainSpecies\n\tgoto_if_eq VAR_RESULT, FALSE, SixIsland_WaterPath_House1_EventScript_NoHeracrossInParty\n\tspecial GetHeracrossSizeRecordInfo\n\tmsgbox SixIsland_WaterPath_House1_Text_MayIMeasureHeracross\n\tspecial ChoosePartyMon\n\twaitstate\n\tcopyvar VAR_RESULT, VAR_0x8004\n\tgoto_if_ge VAR_RESULT, PARTY_SIZE, SixIsland_WaterPath_House1_EventScript_DontShowMon\n\tspecial CompareHeracrossSize\n\tgoto_if_eq VAR_RESULT, 1, SixIsland_WaterPath_House1_EventScript_ShownNonHeracross\n\tgoto_if_eq VAR_RESULT, 2, SixIsland_WaterPath_House1_EventScript_ShownSmallHeracross\n\tgoto_if_eq VAR_RESULT, 3, SixIsland_WaterPath_House1_EventScript_ShownBigHeracross\n\tgoto_if_eq VAR_RESULT, 4, SixIsland_WaterPath_House1_EventScript_ShownTiedHeracross\n\trelease\n\tend\n\nSixIsland_WaterPath_House1_EventScript_NoHeracrossInParty::\n\tmsgbox SixIsland_WaterPath_House1_Text_LoveItNeedItHeracross\n\trelease\n\tend\n\nSixIsland_WaterPath_House1_EventScript_DontShowMon::\n\trelease\n\tend\n\nSixIsland_WaterPath_House1_EventScript_ShownNonHeracross::\n\tmsgbox SixIsland_WaterPath_House1_Text_ThisWontDo\n\trelease\n\tend\n\nSixIsland_WaterPath_House1_EventScript_ShownSmallHeracross::\n\tgoto_if_unset FLAG_GOT_NEST_BALL_FROM_WATER_PATH_HOUSE_1, SixIsland_WaterPath_House1_EventScript_ShownBigHeracross\n\tmsgbox SixIsland_WaterPath_House1_Text_ItsXInchesYInchesWasBiggest\n\trelease\n\tend\n\nSixIsland_WaterPath_House1_EventScript_ShownTiedHeracross::\n\tgoto_if_unset FLAG_GOT_NEST_BALL_FROM_WATER_PATH_HOUSE_1, SixIsland_WaterPath_House1_EventScript_ShownBigHeracross\n\tmsgbox SixIsland_WaterPath_House1_Text_ItsXInchesSameAsBefore\n\trelease\n\tend\n\nSixIsland_WaterPath_House1_EventScript_ShownBigHeracross::\n\tsetflag FLAG_GOT_NEST_BALL_FROM_WATER_PATH_HOUSE_1\n\tmsgbox SixIsland_WaterPath_House1_Text_ItsXInchesDeserveReward\n\tgiveitem ITEM_NEST_BALL\n\tgoto_if_eq VAR_RESULT, FALSE, SixIsland_WaterPath_House1_EventScript_NoRoomForNestBall\n\tmsgbox SixIsland_WaterPath_House1_Text_WantToSeeBiggerOne\n\trelease\n\tend\n\nSixIsland_WaterPath_House1_EventScript_NoRoomForNestBall::\n\tmsgbox SixIsland_WaterPath_House1_Text_YourBagIsFull\n\trelease\n\tend\n\nSixIsland_WaterPath_House1_EventScript_SizeRecord::\n\tlockall\n\tgoto_if_set FLAG_GOT_NEST_BALL_FROM_WATER_PATH_HOUSE_1, SixIsland_WaterPath_House1_EventScript_SizeRecordNonEmpty\n\tmsgbox SixIsland_WaterPath_House1_Text_BlankChartOfSomeSort\n\treleaseall\n\tend\n\nSixIsland_WaterPath_House1_EventScript_SizeRecordNonEmpty::\n\tspecial GetHeracrossSizeRecordInfo\n\tmsgbox SixIsland_WaterPath_House1_Text_BiggestHeracrossIsXInches\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_WaterPath_House1/text.inc",
    "content": "SixIsland_WaterPath_House1_Text_LoveItNeedItHeracross::\n    .string \"Hera, hera, HERACROSS!\\n\"\n    .string \"Big and shiny, it's the bug boss!\\l\"\n    .string \"Love it, need it, HERACROSS!$\"\n\nSixIsland_WaterPath_House1_Text_MayIMeasureHeracross::\n    .string \"Eeeeek!\\n\"\n    .string \"That's a HERACROSS!\\p\"\n    .string \"Please, please, may I measure how\\n\"\n    .string \"big it is?$\"\n\nSixIsland_WaterPath_House1_Text_ItsXInchesDeserveReward::\n    .string \"Eeeek, it's {STR_VAR_2} inches!\\n\"\n    .string \"I've never seen anything like this!\\l\"\n    .string \"You deserve a reward!$\"\n\nSixIsland_WaterPath_House1_Text_WantToSeeBiggerOne::\n    .string \"I want to see a much, much bigger\\n\"\n    .string \"HERACROSS than that one.\\p\"\n    .string \"Oh, how I adore them, big\\n\"\n    .string \"HERACROSS!$\"\n\nSixIsland_WaterPath_House1_Text_ItsXInchesSameAsBefore::\n    .string \"Huh? This {STR_VAR_2}-inch measurement…\\n\"\n    .string \"Oh, boo! It's the same as before.$\"\n\nSixIsland_WaterPath_House1_Text_ItsXInchesYInchesWasBiggest::\n    .string \"Oh, it's just {STR_VAR_2} inches.\\n\"\n    .string \"The HERACROSS before was bigger.\\p\"\n    .string \"It was {STR_VAR_3} inches, the biggest\\n\"\n    .string \"HERACROSS you've brought me.$\"\n\nSixIsland_WaterPath_House1_Text_ThisWontDo::\n    .string \"Oh, no! This won't do!\\p\"\n    .string \"HERACROSS looks much more macho\\n\"\n    .string \"and cool, and has a lovely horn!$\"\n\nSixIsland_WaterPath_House1_Text_YourBagIsFull::\n    .string \"Your BAG is full.\\n\"\n    .string \"My reward won't fit.$\"\n\nSixIsland_WaterPath_House1_Text_BiggestHeracrossIsXInches::\n    .string \"The biggest HERACROSS that I have\\n\"\n    .string \"ever seen measured so far is:\\p\"\n    .string \"{STR_VAR_3} inches!$\"\n\nSixIsland_WaterPath_House1_Text_BlankChartOfSomeSort::\n    .string \"It's a blank chart of some sort.\\p\"\n    .string \"It has spaces for writing in\\n\"\n    .string \"records of some kind.$\"\n\n"
  },
  {
    "path": "data/maps/SixIsland_WaterPath_House2/map.json",
    "content": "{\n  \"id\": \"MAP_SIX_ISLAND_WATER_PATH_HOUSE2\",\n  \"name\": \"SixIsland_WaterPath_House2\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_SEVII_45\",\n  \"region_map_section\": \"MAPSEC_WATER_PATH\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"SixIsland_WaterPath_House2_EventScript_Man\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SIX_ISLAND_WATER_PATH\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SixIsland_WaterPath_House2/scripts.inc",
    "content": "SixIsland_WaterPath_House2_MapScripts::\n\t.byte 0\n\nSixIsland_WaterPath_House2_EventScript_Man::\n\tmsgbox SixIsland_WaterPath_House2_Text_MyNeighborMeasuredMe, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/SixIsland_WaterPath_House2/text.inc",
    "content": "SixIsland_WaterPath_House2_Text_MyNeighborMeasuredMe::\n    .string \"My height is 67.0 inches on the\\n\"\n    .string \"button.\\p\"\n    .string \"I know it is this precisely because\\n\"\n    .string \"my neighbor measured me.$\"\n\n"
  },
  {
    "path": "data/maps/SouthernIsland_Exterior/map.json",
    "content": "{\n  \"id\": \"MAP_SOUTHERN_ISLAND_EXTERIOR\",\n  \"name\": \"SouthernIsland_Exterior\",\n  \"layout\": \"LAYOUT_SOUTHERN_ISLAND_EXTERIOR\",\n  \"music\": \"MUS_ABANDONED_SHIP\",\n  \"region_map_section\": \"MAPSEC_SOUTHERN_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NavelRock_Harbor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_NONE\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SOUTHERN_ISLAND_INTERIOR\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SOUTHERN_ISLAND_INTERIOR\",\n      \"dest_warp_id\": 1\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 16,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"SouthernIsland_Exterior_EventScript_Sign\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SouthernIsland_Exterior/scripts.inc",
    "content": "SouthernIsland_Exterior_MapScripts::\n\t.byte 0\n\nSouthernIsland_Exterior_EventScript_Sign::\n\tmsgbox SouthernIsland_Exterior_Text_Sign, MSGBOX_SIGN\n\tend\n\nSouthernIsland_Exterior_Text_Sign::\n\t.string \"“Those whose memories fade seek to\\n\"\n\t.string \"carve them in their hearts…”$\""
  },
  {
    "path": "data/maps/SouthernIsland_Exterior/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/SouthernIsland_Interior/map.json",
    "content": "{\n  \"id\": \"MAP_SOUTHERN_ISLAND_INTERIOR\",\n  \"name\": \"SouthernIsland_Interior\",\n  \"layout\": \"LAYOUT_SOUTHERN_ISLAND_INTERIOR\",\n  \"music\": \"MUS_ABANDONED_SHIP\",\n  \"region_map_section\": \"MAPSEC_SOUTHERN_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SHADE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_LATI\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 13,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SOUTHERN_ISLAND_EXTERIOR\",\n      \"dest_warp_id\": 0\n    },\n    {\n      \"x\": 14,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_SOUTHERN_ISLAND_EXTERIOR\",\n      \"dest_warp_id\": 1\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 13,\n      \"y\": 11,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"SouthernIsland_Interior_EventScript_TryLatiEncounter\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/SouthernIsland_Interior/scripts.inc",
    "content": ".set LOCALID_LATI, 1\n\nSouthernIsland_Interior_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, SouthernIsland_Interior_OnResume\n\tmap_script MAP_SCRIPT_ON_LOAD, SouthernIsland_Interior_OnLoad\n\t.byte 0\n\nSouthernIsland_Interior_OnResume:\n\tcall_if_set FLAG_SYS_CTRL_OBJ_DELETE, SouthernIsland_Interior_EventScript_TryRemoveLati\n\tend\n\nSouthernIsland_Interior_EventScript_TryRemoveLati::\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_CAUGHT\n\tgoto_if_ne EventScript_Return\n\tremoveobject LOCALID_LATI\n\treturn\n\nSouthernIsland_Interior_OnLoad:\n\tcallnative IsVersionFireRedToVarResult\n\tcompare VAR_RESULT, TRUE\n\tcall_if_eq SouthernIsland_Interior_EventScript_SetUpLatios\n\tcompare VAR_RESULT, FALSE\n\tcall_if_eq SouthernIsland_Interior_EventScript_SetUpLatias\n\tend\n\nSouthernIsland_Interior_EventScript_SetUpLatios::\n\tsetvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_LATIOS\n\tsetvar VAR_TEMP_4, SPECIES_LATIOS\n\treturn\n\nSouthernIsland_Interior_EventScript_SetUpLatias::\n\tsetvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_LATIAS\n\tsetvar VAR_TEMP_4, SPECIES_LATIAS\n\treturn\n\nSouthernIsland_Interior_EventScript_TryLatiEncounter::\n\tlockall\n\tsetvar VAR_0x8008, 12\n\tgoto SouthernIsland_Interior_EventScript_Lati\n\tend\n\nSouthernIsland_Interior_EventScript_Lati::\n\tgoto_if_set FLAG_TEMP_2, SouthernIsland_Interior_EventScript_Sign\n\tcallnative IsVersionFireRedToVarResult\n\tcompare VAR_RESULT, TRUE\n\tcall_if_eq SouthernIsland_Interior_EventScript_CheckDefeatedLatios\n\tcompare VAR_RESULT, FALSE\n\tcall_if_eq SouthernIsland_Interior_EventScript_CheckDefeatedLatias\n\tcallnative IsVersionFireRedToVarResult\n\tcompare VAR_RESULT, TRUE\n\tcall_if_eq SouthernIsland_Interior_EventScript_CheckCaughtLatios\n\tcompare VAR_RESULT, FALSE\n\tcall_if_eq SouthernIsland_Interior_EventScript_CheckCaughtLatias\n\tsetflag FLAG_TEMP_2\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tspecial SpawnCameraObject\n\tapplymovement OBJ_EVENT_ID_CAMERA, SouthernIsland_Interior_Movement_CameraPanUp\n\twaitmovement 0\n\tdelay 50\n\twaitse\n\tplaymoncry VAR_TEMP_4, 0\n\tdelay 30\n\twaitmoncry\n\taddobject LOCALID_LATI\n\tdelay 30\n\tapplymovement OBJ_EVENT_ID_CAMERA, SouthernIsland_Interior_Movement_CameraPanDown\n\tapplymovement LOCALID_LATI, SouthernIsland_Interior_Movement_LatiApproach\n\twaitmovement 0\n\tdelay 50\n\tspecial RemoveCameraObject\n\tsetvar VAR_LAST_TALKED, LOCALID_LATI\n\tcallnative IsVersionFireRedToVarResult\n\tcompare VAR_RESULT, TRUE\n\tcall_if_eq SouthernIsland_Interior_EventScript_SetLatiosBattleVars\n\tcompare VAR_RESULT, FALSE\n\tcall_if_eq SouthernIsland_Interior_EventScript_SetLatiasBattleVars\n\tsetflag FLAG_SYS_CTRL_OBJ_DELETE\n\tspecial StartSouthernIslandBattle\n\twaitstate\n\tclearflag FLAG_SYS_CTRL_OBJ_DELETE\n\tspecialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_WON\n\tgoto_if_eq SouthernIsland_Interior_EventScript_LatiDefeated\n\tcompare VAR_RESULT, B_OUTCOME_RAN\n\tgoto_if_eq SouthernIsland_Interior_EventScript_RanFromLati\n\tcompare VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED\n\tgoto_if_eq SouthernIsland_Interior_EventScript_RanFromLati\n\tcallnative IsVersionFireRedToVarResult\n\tcompare VAR_RESULT, TRUE\n\tcall_if_eq SouthernIsland_Interior_EventScript_SetCaughtLatios\n\tcompare VAR_RESULT, FALSE\n\tcall_if_eq SouthernIsland_Interior_EventScript_SetCaughtLatias\n\treleaseall\n\tend\n\nSouthernIsland_Interior_EventScript_CheckDefeatedLatios::\n\tgoto_if_set FLAG_DEFEATED_LATIOS, SouthernIsland_Interior_EventScript_Sign\n\treturn\n\nSouthernIsland_Interior_EventScript_CheckDefeatedLatias::\n\tgoto_if_set FLAG_DEFEATED_LATIAS, SouthernIsland_Interior_EventScript_Sign\n\treturn\n\nSouthernIsland_Interior_EventScript_SetCaughtLatios::\n\tsetflag FLAG_CAUGHT_LATIOS\n\treturn\n\nSouthernIsland_Interior_EventScript_SetCaughtLatias::\n\tsetflag FLAG_CAUGHT_LATIAS\n\treturn\n\nSouthernIsland_Interior_EventScript_CheckCaughtLatios::\n\tgoto_if_set FLAG_CAUGHT_LATIOS, SouthernIsland_Interior_EventScript_Sign\n\treturn\n\nSouthernIsland_Interior_EventScript_CheckCaughtLatias::\n\tgoto_if_set FLAG_CAUGHT_LATIAS, SouthernIsland_Interior_EventScript_Sign\n\treturn\n\nSouthernIsland_Interior_EventScript_LatiDefeated::\n\tcallnative IsVersionFireRedToVarResult\n\tcompare VAR_RESULT, TRUE\n\tcall_if_eq SouthernIsland_Interior_EventScript_SetDefeatedLatios\n\tcompare VAR_RESULT, FALSE\n\tcall_if_eq SouthernIsland_Interior_EventScript_SetDefeatedLatias\n\tcopyvar VAR_0x8004, VAR_TEMP_4\n\tgoto EventScript_MonFlewAway\n\tend\n\nSouthernIsland_Interior_EventScript_SetDefeatedLatios::\n\tsetflag FLAG_DEFEATED_LATIOS\n\treturn\n\nSouthernIsland_Interior_EventScript_SetDefeatedLatias::\n\tsetflag FLAG_DEFEATED_LATIAS\n\treturn\n\nSouthernIsland_Interior_EventScript_RanFromLati::\n\tcopyvar VAR_0x8004, VAR_TEMP_4\n\tgoto EventScript_MonFlewAway\n\tend\n\nSouthernIsland_Interior_EventScript_Sign::\n\tsignmsg\n\tmsgbox SouthernIsland_Interior_Text_Sign, MSGBOX_SIGN\n\tnormalmsg\n\treleaseall\n\tend\n\nSouthernIsland_Interior_EventScript_SetLatiosBattleVars::\n\tsetvar VAR_0x8004, SPECIES_LATIOS\n\tsetvar VAR_0x8005, 50 @ level\n\tsetvar VAR_0x8006, ITEM_SOUL_DEW\n\tspecial CreateEnemyEventMon\n\treturn\n\nSouthernIsland_Interior_EventScript_SetLatiasBattleVars::\n\tsetvar VAR_0x8004, SPECIES_LATIAS\n\tsetvar VAR_0x8005, 50 @ level\n\tsetvar VAR_0x8006, ITEM_SOUL_DEW\n\tspecial CreateEnemyEventMon\n\treturn\n\nSouthernIsland_Interior_Movement_CameraPanUp:\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nSouthernIsland_Interior_Movement_CameraPanDown:\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_in_place_faster_up\n\tstep_end\n\nSouthernIsland_Interior_Movement_LatiApproach:\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tdelay_16\n\tdelay_16\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_down\n\tstep_end\n\nSouthernIsland_Interior_Text_Sign:\n\t.string \"“All dreams are but another reality.\\n\"\n\t.string \"Never forget…”$\""
  },
  {
    "path": "data/maps/SouthernIsland_Interior/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/ThreeIsland/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND\",\n  \"name\": \"ThreeIsland\",\n  \"layout\": \"LAYOUT_THREE_ISLAND\",\n  \"music\": \"MUS_RUSTBORO\",\n  \"region_map_section\": \"MAPSEC_THREE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": 0,\n      \"map\": \"MAP_THREE_ISLAND_PORT\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": -20,\n      \"map\": \"MAP_THREE_ISLAND_BOND_BRIDGE\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_AntiBiker1\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_ANTIBIKERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_AntiBiker2\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_ANTIBIKERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUE_BALL\",\n      \"x\": 8,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_Biker\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_LONE_BIKER\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_Biker\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_BIKERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_Biker\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_BIKERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_Biker\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_BIKERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_Biker\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_BIKERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_Biker\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_BIKERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_THREE_ISLAND_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_ItemZinc\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_ZINC\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_DODUO\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_Doduo\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_EventScript_Biker6\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_BIKERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_THREE_ISLAND_HOUSE1\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 27,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_THREE_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_THREE_ISLAND_MART\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_THREE_ISLAND_HOUSE2\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_THREE_ISLAND_HOUSE3\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_THREE_ISLAND_HOUSE4\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_THREE_ISLAND_HOUSE5\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_THREE_ISLAND\",\n      \"var_value\": \"2\",\n      \"script\": \"ThreeIsland_EventScript_BikerBossIntroTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 8,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_THREE_ISLAND\",\n      \"var_value\": \"2\",\n      \"script\": \"ThreeIsland_EventScript_BikerBossIntroTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_THREE_ISLAND\",\n      \"var_value\": \"2\",\n      \"script\": \"ThreeIsland_EventScript_BikerBossIntroTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_THREE_ISLAND\",\n      \"var_value\": \"2\",\n      \"script\": \"ThreeIsland_EventScript_BikerBossIntroTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_THREE_ISLAND\",\n      \"var_value\": \"3\",\n      \"script\": \"ThreeIsland_EventScript_BattleBikersTriggerLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 8,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_THREE_ISLAND\",\n      \"var_value\": \"3\",\n      \"script\": \"ThreeIsland_EventScript_BattleBikersTriggerMidLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_THREE_ISLAND\",\n      \"var_value\": \"3\",\n      \"script\": \"ThreeIsland_EventScript_BattleBikersTriggerMid\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_THREE_ISLAND\",\n      \"var_value\": \"2\",\n      \"script\": \"ThreeIsland_EventScript_BikerBossIntroTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_THREE_ISLAND\",\n      \"var_value\": \"3\",\n      \"script\": \"ThreeIsland_EventScript_BattleBikersTriggerMidRight\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 11,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_THREE_ISLAND\",\n      \"var_value\": \"3\",\n      \"script\": \"ThreeIsland_EventScript_BattleBikersTriggerRight\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 12,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ThreeIsland_EventScript_IslandSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 5,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PP_UP\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_PP_UP\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland/scripts.inc",
    "content": ".equ LOCALID_ANTIBIKER1, 1\n.equ LOCALID_ANTIBIKER2, 2\n.equ LOCALID_PAXTON, 3\n.equ LOCALID_BIKER1, 5\n.equ LOCALID_BIKER2, 7\n.equ LOCALID_BIKER3, 4\n.equ LOCALID_BIKER4, 6\n.equ LOCALID_BIKER5, 8\n.equ LOCALID_BIKER6, 14\n\nThreeIsland_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, ThreeIsland_OnTransition\n\t.byte 0\n\nThreeIsland_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_THREE_ISLAND\n\tcall_if_set FLAG_RESCUED_LOSTELLE, ThreeIsland_EventScript_HideAntiBikers\n\tcall_if_eq VAR_MAP_SCENE_THREE_ISLAND, 4, ThreeIsland_EventScript_SetAntiBikersMovementAfterBikers\n\tend\n\nThreeIsland_EventScript_HideAntiBikers::\n\tsetflag FLAG_HIDE_THREE_ISLAND_ANTIBIKERS\n\treturn\n\nThreeIsland_EventScript_SetAntiBikersMovementAfterBikers::\n\tsetobjectmovementtype LOCALID_ANTIBIKER1, MOVEMENT_TYPE_LOOK_AROUND\n\tsetobjectmovementtype LOCALID_ANTIBIKER2, MOVEMENT_TYPE_LOOK_AROUND\n\treturn\n\nThreeIsland_EventScript_Biker::\n\tlock\n\tsetvar VAR_TEMP_1, 2\n\tcall ThreeIsland_EventScript_BikerArgumentScene\n\trelease\n\tend\n\nThreeIsland_EventScript_AntiBiker1::\n\tlock\n\tgoto_if_set FLAG_GOT_FULL_RESTORE_FROM_THREE_ISLAND_DEFENDER, ThreeIsland_EventScript_AntiBiker1GotFullRestore\n\tgoto_if_eq VAR_MAP_SCENE_THREE_ISLAND, 4, ThreeIsland_EventScript_GiveFullRestore\n\tsetvar VAR_TEMP_1, 0\n\tcall ThreeIsland_EventScript_BikerArgumentScene\n\trelease\n\tend\n\nThreeIsland_EventScript_AntiBiker1GotFullRestore::\n\tapplymovement LOCALID_ANTIBIKER1, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_YouveGotImpressiveMons\n\trelease\n\tend\n\nThreeIsland_EventScript_GiveFullRestore::\n\tapplymovement LOCALID_ANTIBIKER1, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_ThankYouOhYourMonGotHurt\n\tcheckitemspace ITEM_FULL_RESTORE\n\tgoto_if_eq VAR_RESULT, FALSE, ThreeIsland_EventScript_NoRoomForFullRestore\n\tmsgreceiveditem ThreeIsland_Text_GivenFullRestore, ITEM_FULL_RESTORE\n\tadditem ITEM_FULL_RESTORE\n\tsetflag FLAG_GOT_FULL_RESTORE_FROM_THREE_ISLAND_DEFENDER\n\tmsgbox ThreeIsland_Text_YouveGotImpressiveMons\n\trelease\n\tend\n\nThreeIsland_EventScript_NoRoomForFullRestore::\n\tmsgbox ThreeIsland_Text_OhYourBagIsFull\n\trelease\n\tend\n\nThreeIsland_EventScript_BikerArgumentScene::\n\tcall_if_eq VAR_TEMP_1, 1, ThreeIsland_EventScript_PlayerFaceLeft\n\tcall_if_eq VAR_TEMP_1, 2, ThreeIsland_EventScript_PlayerFaceLeft\n\tapplymovement LOCALID_ANTIBIKER1, ThreeIsland_Movement_SpeakRight\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_GoBackToKanto\n\tcall_if_eq VAR_TEMP_1, 0, ThreeIsland_EventScript_PlayerFaceRight\n\tcall_if_eq VAR_TEMP_1, 1, ThreeIsland_EventScript_PlayerFaceRight\n\tcall_if_eq VAR_TEMP_1, 2, ThreeIsland_EventScript_PlayerFaceBiker\n\tapplymovement LOCALID_BIKER1, ThreeIsland_Movement_SpeakLeft\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_BossIsOnHisWay\n\tcall_if_eq VAR_TEMP_1, 0, ThreeIsland_EventScript_PlayerFaceUp\n\tcall_if_eq VAR_TEMP_1, 1, ThreeIsland_EventScript_PlayerFaceUp\n\tcall_if_eq VAR_TEMP_1, 2, ThreeIsland_EventScript_PlayerFaceAntiBiker\n\tapplymovement LOCALID_ANTIBIKER2, ThreeIsland_Movement_SpeakRight\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_GetOffIslandNow\n\tcall_if_eq VAR_TEMP_1, 0, ThreeIsland_EventScript_PlayerFaceRight\n\tcall_if_eq VAR_TEMP_1, 1, ThreeIsland_EventScript_PlayerFaceRight\n\tcall_if_eq VAR_TEMP_1, 2, ThreeIsland_EventScript_PlayerFaceBiker\n\tapplymovement LOCALID_BIKER3, ThreeIsland_Movement_SpeakLeft\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_WhosGonnaMakeMe\n\treturn\n\nThreeIsland_EventScript_PlayerFaceUp::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\treturn\n\n@ Unused\nThreeIsland_EventScript_PlayerFaceDown::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treturn\n\nThreeIsland_EventScript_PlayerFaceLeft::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\treturn\n\nThreeIsland_EventScript_PlayerFaceRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\treturn\n\nThreeIsland_EventScript_PlayerFaceBiker::\n\tgetplayerxy VAR_0x8004, VAR_0x8005\n\tgoto_if_ge VAR_0x8004, 9, ThreeIsland_EventScript_PlayerFaceUp\n\tgoto ThreeIsland_EventScript_PlayerFaceRight\n\tend\n\nThreeIsland_EventScript_PlayerFaceAntiBiker::\n\tgetplayerxy VAR_0x8004, VAR_0x8005\n\tgoto_if_ge VAR_0x8004, 9, ThreeIsland_EventScript_PlayerFaceLeft\n\tgoto ThreeIsland_EventScript_PlayerFaceUp\n\tend\n\nThreeIsland_EventScript_AntiBiker2::\n\tlock\n\tgoto_if_eq VAR_MAP_SCENE_THREE_ISLAND, 4, ThreeIsland_EventScript_AntiBiker2BikersGone\n\tsetvar VAR_TEMP_1, 1\n\tcall ThreeIsland_EventScript_BikerArgumentScene\n\trelease\n\tend\n\nThreeIsland_EventScript_AntiBiker2BikersGone::\n\tapplymovement LOCALID_ANTIBIKER2, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_LostelleWentOffTowardsBondBridge\n\trelease\n\tend\n\nThreeIsland_EventScript_BikerBossIntroTrigger::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement LOCALID_ANTIBIKER1, ThreeIsland_Movement_SpeakRight\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_AreYouBossGoBackToKanto\n\tapplymovement LOCALID_PAXTON, ThreeIsland_Movement_SpeakLeft\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_JustGotHerePal\n\tapplymovement LOCALID_ANTIBIKER1, ThreeIsland_Movement_SpeakRight\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_FollowersRaisingHavoc\n\tapplymovement LOCALID_PAXTON, ThreeIsland_Movement_SpeakLeft\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_OughtToBeThankingUs\n\tapplymovement LOCALID_ANTIBIKER1, ThreeIsland_Movement_SpeakRight\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_YouCowardsToughInPack\n\tsetvar VAR_MAP_SCENE_THREE_ISLAND, 3\n\treleaseall\n\tend\n\nThreeIsland_Movement_SpeakLeft::\n\twalk_in_place_left\n\tstep_end\n\nThreeIsland_Movement_SpeakRight::\n\twalk_in_place_right\n\tstep_end\n\nThreeIsland_EventScript_BattleBikersTriggerLeft::\n\tlockall\n\tsetvar VAR_TEMP_1, 0\n\tgoto ThreeIsland_EventScript_BattleBikersScene\n\tend\n\nThreeIsland_EventScript_BattleBikersTriggerMidLeft::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto ThreeIsland_EventScript_BattleBikersScene\n\tend\n\nThreeIsland_EventScript_BattleBikersTriggerMid::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tgoto ThreeIsland_EventScript_BattleBikersScene\n\tend\n\nThreeIsland_EventScript_BattleBikersTriggerMidRight::\n\tlockall\n\tsetvar VAR_TEMP_1, 3\n\tgoto ThreeIsland_EventScript_BattleBikersScene\n\tend\n\nThreeIsland_EventScript_BattleBikersTriggerRight::\n\tlockall\n\tsetvar VAR_TEMP_1, 4\n\tgoto ThreeIsland_EventScript_BattleBikersScene\n\tend\n\nThreeIsland_EventScript_BattleBikersScene::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement LOCALID_BIKER1, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tplayse SE_PIN\n\tapplymovement LOCALID_BIKER1, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_BIKER1, Common_Movement_Delay48\n\twaitmovement 0\n\tapplymovement LOCALID_BIKER1, ThreeIsland_Movement_BikerApproach\n\twaitmovement 0\n\tplaybgm MUS_ENCOUNTER_BOY, 0\n\tmsgbox ThreeIsland_Text_WannaMakeSomethingOfYourStaring, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, ThreeIsland_EventScript_LeaveBikersAlone\n\tmsgbox ThreeIsland_Text_Biker1Intro\n\tsetvar VAR_LAST_TALKED, LOCALID_BIKER1\n\ttrainerbattle_no_intro TRAINER_BIKER_GOON, ThreeIsland_Text_Biker1Defeat\n\tapplymovement LOCALID_BIKER1, ThreeIsland_Movement_BikerSpeak\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_Biker1PostBattle\n\tclosemessage\n\tapplymovement LOCALID_BIKER2, ThreeIsland_Movement_BikerApproach\n\twaitmovement 0\n\tplaybgm MUS_ENCOUNTER_BOY, 0\n\tmsgbox ThreeIsland_Text_Biker2Intro\n\tsetvar VAR_LAST_TALKED, LOCALID_BIKER2\n\ttrainerbattle_no_intro TRAINER_BIKER_GOON_2, ThreeIsland_Text_Biker2Defeat\n\tapplymovement LOCALID_BIKER2, ThreeIsland_Movement_BikerSpeak\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_Biker2PostBattle\n\tclosemessage\n\tapplymovement LOCALID_BIKER3, ThreeIsland_Movement_BikerApproach\n\twaitmovement 0\n\tplaybgm MUS_ENCOUNTER_BOY, 0\n\tmsgbox ThreeIsland_Text_Biker3Intro\n\tsetvar VAR_LAST_TALKED, LOCALID_BIKER3\n\ttrainerbattle_no_intro TRAINER_BIKER_GOON_3, ThreeIsland_Text_Biker3Defeat\n\tapplymovement LOCALID_BIKER3, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tapplymovement LOCALID_BIKER4, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement LOCALID_BIKER5, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tmsgbox ThreeIsland_Text_Biker3PostBattle\n\tclosemessage\n\tdelay 45\n\tcall_if_eq VAR_TEMP_1, 0, ThreeIsland_EventScript_PaxtonApproachLeft\n\tcall_if_eq VAR_TEMP_1, 1, ThreeIsland_EventScript_PaxtonApproachMidLeft\n\tcall_if_eq VAR_TEMP_1, 2, ThreeIsland_EventScript_PaxtonApproachMid\n\tcall_if_eq VAR_TEMP_1, 3, ThreeIsland_EventScript_PaxtonApproachMidRight\n\tcall_if_eq VAR_TEMP_1, 4, ThreeIsland_EventScript_PaxtonApproachRight\n\tplaybgm MUS_ENCOUNTER_BOY, 0\n\tmsgbox ThreeIsland_Text_PaxtonIntro\n\tsetvar VAR_LAST_TALKED, LOCALID_PAXTON\n\ttrainerbattle_no_intro TRAINER_CUE_BALL_PAXTON, ThreeIsland_Text_PaxtonDefeat\n\tmsgbox ThreeIsland_Text_PaxtonPostBattle\n\tclosemessage\n\tfadescreen FADE_TO_BLACK\n\tremoveobject LOCALID_PAXTON\n\tremoveobject LOCALID_BIKER1\n\tremoveobject LOCALID_BIKER2\n\tremoveobject LOCALID_BIKER3\n\tremoveobject LOCALID_BIKER4\n\tremoveobject LOCALID_BIKER5\n\tremoveobject LOCALID_BIKER6\n\tfadescreen FADE_FROM_BLACK\n\tsetvar VAR_MAP_SCENE_THREE_ISLAND, 4\n\treleaseall\n\tend\n\nThreeIsland_EventScript_PaxtonApproachLeft::\n\tapplymovement LOCALID_BIKER3, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement LOCALID_PAXTON, ThreeIsland_Movement_PaxtonApproachLeft\n\twaitmovement 0\n\treturn\n\nThreeIsland_EventScript_PaxtonApproachMidLeft::\n\tapplymovement LOCALID_BIKER3, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement LOCALID_PAXTON, ThreeIsland_Movement_PaxtonApproachMidLeft\n\twaitmovement 0\n\treturn\n\nThreeIsland_EventScript_PaxtonApproachMid::\n\tapplymovement LOCALID_BIKER3, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement LOCALID_PAXTON, ThreeIsland_Movement_PaxtonApproachMid\n\tapplymovement OBJ_EVENT_ID_PLAYER, ThreeIsland_Movement_PlayerFacePaxton\n\twaitmovement 0\n\treturn\n\nThreeIsland_EventScript_PaxtonApproachMidRight::\n\tapplymovement LOCALID_BIKER3, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement OBJ_EVENT_ID_PLAYER, ThreeIsland_Movement_PlayerFacePaxton\n\tapplymovement LOCALID_PAXTON, ThreeIsland_Movement_PaxtonApproachMidRight\n\twaitmovement 0\n\treturn\n\nThreeIsland_EventScript_PaxtonApproachRight::\n\tapplymovement LOCALID_BIKER3, Common_Movement_WalkInPlaceFasterDown\n\tapplymovement OBJ_EVENT_ID_PLAYER, ThreeIsland_Movement_PlayerFacePaxton\n\tapplymovement LOCALID_PAXTON, ThreeIsland_Movement_PaxtonApproachRight\n\twaitmovement 0\n\treturn\n\nThreeIsland_EventScript_LeaveBikersAlone::\n\tmsgbox ThreeIsland_Text_ThatsSmart\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, ThreeIsland_Movement_PlayerLeaveBikers\n\twaitmovement 0\n\tapplymovement LOCALID_BIKER1, ThreeIsland_Movement_Biker1ReturnToPack\n\twaitmovement 0\n\tfadedefaultbgm\n\treleaseall\n\tend\n\nThreeIsland_Movement_PlayerLeaveBikers::\n\twalk_down\n\tstep_end\n\nThreeIsland_Movement_BikerApproach::\n\twalk_down\n\tstep_end\n\nThreeIsland_Movement_Biker1ReturnToPack::\n\twalk_up\n\twalk_in_place_faster_left\n\tstep_end\n\nThreeIsland_Movement_BikerSpeak::\n\twalk_in_place_down\n\tstep_end\n\nThreeIsland_Movement_PaxtonApproachLeft::\n\twalk_down\n\twalk_left\n\twalk_in_place_faster_down\n\tstep_end\n\nThreeIsland_Movement_PaxtonApproachMidLeft::\n\twalk_down\n\tstep_end\n\nThreeIsland_Movement_PaxtonApproachMid::\n\twalk_down\n\twalk_down\n\twalk_in_place_faster_right\n\tstep_end\n\nThreeIsland_Movement_PlayerFacePaxton::\n\tdelay_16\n\tdelay_16\n\twalk_in_place_faster_left\n\tstep_end\n\nThreeIsland_Movement_PaxtonApproachMidRight::\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_in_place_faster_right\n\tstep_end\n\nThreeIsland_Movement_PaxtonApproachRight::\n\twalk_down\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_in_place_faster_right\n\tstep_end\n\nThreeIsland_EventScript_Woman::\n\tmsgbox ThreeIsland_Text_WouldntWantToSeeBikersHereAgain, MSGBOX_NPC\n\tend\n\nThreeIsland_EventScript_LittleBoy::\n\tmsgbox ThreeIsland_Text_WhenDodouEvolvesGoingToPlayGame, MSGBOX_NPC\n\tend\n\nThreeIsland_EventScript_Doduo::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_DODUO, CRY_MODE_NORMAL\n\tmsgbox ThreeIsland_Text_Doduo\n\twaitmoncry\n\trelease\n\tend\n\nThreeIsland_EventScript_IslandSign::\n\tmsgbox ThreeIsland_Text_IslandSign, MSGBOX_SIGN\n\tend\n\nThreeIsland_EventScript_Biker6::\n\tmsgbox ThreeIsland_Text_IslandBelongsToUs, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland/text.inc",
    "content": "ThreeIsland_Text_IslandSign::\n    .string \"THREE ISLAND\\n\"\n    .string \"Kin Island of Family Bonding$\"\n\nThreeIsland_Text_IslandBelongsToUs::\n    .string \"Hyahoo!\\p\"\n    .string \"From this day on, this island\\n\"\n    .string \"belongs to us!$\"\n\nThreeIsland_Text_GoBackToKanto::\n    .string \"We don't need you people bringing\\n\"\n    .string \"your noise and trouble here!\\p\"\n    .string \"We're asking you to go back to\\n\"\n    .string \"KANTO!$\"\n\nThreeIsland_Text_BossIsOnHisWay::\n    .string \"Hey, go cry somewhere else.\\n\"\n    .string \"Our boss is on his way.\\p\"\n    .string \"When he gets here, we'll give you\\n\"\n    .string \"a k-rad motorbike show you won't\\l\"\n    .string \"soon forget!$\"\n\nThreeIsland_Text_GetOffIslandNow::\n    .string \"W-what!? Not on your life!\\n\"\n    .string \"Get off the island now!$\"\n\nThreeIsland_Text_WhosGonnaMakeMe::\n    .string \"Who's gonna make me?$\"\n\nThreeIsland_Text_AreYouBossGoBackToKanto::\n    .string \"Are you the boss?\\n\"\n    .string \"Go back to KANTO right now!$\"\n\nThreeIsland_Text_JustGotHerePal::\n    .string \"Hah?\\p\"\n    .string \"I just got here, pal.\\p\"\n    .string \"What's with the hostile attitude?\\n\"\n    .string \"It's mighty cold of you!$\"\n\nThreeIsland_Text_FollowersRaisingHavoc::\n    .string \"Your gang of followers have been\\n\"\n    .string \"raising havoc on their bikes.\\p\"\n    .string \"Do you have any idea how much\\n\"\n    .string \"trouble they've caused us on the\\l\"\n    .string \"island?$\"\n\nThreeIsland_Text_OughtToBeThankingUs::\n    .string \"No, man, I don't get it at all.\\p\"\n    .string \"Look at this place.\\n\"\n    .string \"What do you do for entertainment?\\p\"\n    .string \"You ought to be thanking us for\\n\"\n    .string \"livening up this sleepy village.\\p\"\n    .string \"But hey, if you insist, you can try\\n\"\n    .string \"making us leave.$\"\n\nThreeIsland_Text_YouCowardsToughInPack::\n    .string \"Grr… You cowards…\\n\"\n    .string \"So tough in a pack…$\"\n\nThreeIsland_Text_WannaMakeSomethingOfYourStaring::\n    .string \"You, what are you staring at?\\n\"\n    .string \"Don't you know it's not polite?\\p\"\n    .string \"You wanna make something of it\\n\"\n    .string \"or what?$\"\n\nThreeIsland_Text_ThatsSmart::\n    .string \"That's smart.\\n\"\n    .string \"Keep your nose out of this.$\"\n\nThreeIsland_Text_Biker1Intro::\n    .string \"Heh, I like your guts.\\n\"\n    .string \"You'll be losing money to me, but…$\"\n\nThreeIsland_Text_Biker1Defeat::\n    .string \"Wha…\\n\"\n    .string \"What is this kid?!$\"\n\nThreeIsland_Text_Biker1PostBattle::\n    .string \"Aww, man…\\n\"\n    .string \"Don't you dare laugh!$\"\n\nThreeIsland_Text_Biker2Intro::\n    .string \"Aren't you from KANTO?\\n\"\n    .string \"You should be on our side!$\"\n\nThreeIsland_Text_Biker2Defeat::\n    .string \"Stop fooling around!$\"\n\nThreeIsland_Text_Biker2PostBattle::\n    .string \"What's the matter with you,\\n\"\n    .string \"getting all hot like that?\\p\"\n    .string \"Totally uncool, man!$\"\n\nThreeIsland_Text_Biker3Intro::\n    .string \"We invited the boss out here,\\n\"\n    .string \"but you had to mess it up!\\p\"\n    .string \"You embarrassed us, man!$\"\n\nThreeIsland_Text_Biker3Defeat::\n    .string \"… … …   … … …$\"\n\nThreeIsland_Text_Biker3PostBattle::\n    .string \"Boss, I'm telling you, you've gotta\\n\"\n    .string \"do something about this kid!$\"\n\nThreeIsland_Text_PaxtonIntro::\n    .string \"I've been watching you, and I'd say\\n\"\n    .string \"you've done enough.\\p\"\n    .string \"What are you, their friend or\\n\"\n    .string \"something?\\p\"\n    .string \"Then I guess you'll be battling me\\n\"\n    .string \"in their place.$\"\n\nThreeIsland_Text_PaxtonDefeat::\n    .string \"All right, enough!\\n\"\n    .string \"We'll leave like you wanted!\\p\"\n    .string \"We'll be happy to see the last of\\n\"\n    .string \"this boring island!$\"\n\nThreeIsland_Text_PaxtonPostBattle::\n    .string \"Humph! Yeah, go right on hanging\\n\"\n    .string \"around with these hayseeds!$\"\n\nThreeIsland_Text_ThankYouOhYourMonGotHurt::\n    .string \"Thank you! Those goons were\\n\"\n    .string \"nothing but bad trouble.\\p\"\n    .string \"Oh, look, your POKéMON got hurt\\n\"\n    .string \"on my account.$\"\n\nThreeIsland_Text_GivenFullRestore::\n    .string \"{PLAYER} was given\\n\"\n    .string \"a FULL RESTORE.$\"\n\nThreeIsland_Text_OhYourBagIsFull::\n    .string \"Oh?\\n\"\n    .string \"Your BAG is full.$\"\n\nThreeIsland_Text_YouveGotImpressiveMons::\n    .string \"You've got seriously impressive\\n\"\n    .string \"POKéMON with you.$\"\n\nThreeIsland_Text_LostelleWentOffTowardsBondBridge::\n    .string \"It'd be fantastic if someone as\\n\"\n    .string \"strong as you lived here.\\p\"\n    .string \"I hope you'll at least stay here\\n\"\n    .string \"a while.\\p\"\n    .string \"…I beg your pardon?\\n\"\n    .string \"You're looking for LOSTELLE?\\p\"\n    .string \"LOSTELLE went off towards BOND\\n\"\n    .string \"BRIDGE a while ago.$\"\n\nThreeIsland_Text_WouldntWantToSeeBikersHereAgain::\n    .string \"THREE ISLAND is actually the most\\n\"\n    .string \"populous of the islands here.\\p\"\n    .string \"Still, it could be less sleepy.\\p\"\n    .string \"But I wouldn't want to see goons\\n\"\n    .string \"like those BIKERS here again.$\"\n\nThreeIsland_Text_WhenDodouEvolvesGoingToPlayGame::\n    .string \"I'm going to train my DODUO in the\\n\"\n    .string \"BERRY FOREST.\\p\"\n    .string \"When it evolves, I'm going to play\\n\"\n    .string \"a game on TWO ISLAND.$\"\n\nThreeIsland_Text_Doduo::\n    .string \"DODUO: Gigiih!$\"\n\n"
  },
  {
    "path": "data/maps/ThreeIsland_BerryForest/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_BERRY_FOREST\",\n  \"name\": \"ThreeIsland_BerryForest\",\n  \"layout\": \"LAYOUT_THREE_ISLAND_BERRY_FOREST\",\n  \"music\": \"MUS_VIRIDIAN_FOREST\",\n  \"region_map_section\": \"MAPSEC_BERRY_FOREST\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SHADE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TWIN\",\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_BerryForest_EventScript_Lostelle\",\n      \"flag\": \"FLAG_HIDE_LOSTELLE_IN_BERRY_FOREST\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_BERRY_FOREST_CUT_TREE_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_BERRY_FOREST_CUT_TREE_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_BERRY_FOREST_CUT_TREE_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_BERRY_FOREST_CUT_TREE_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 44,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_BERRY_FOREST_CUT_TREE_5\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 44,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_BERRY_FOREST_CUT_TREE_6\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 43,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_BERRY_FOREST_CUT_TREE_10\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 39,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_BERRY_FOREST_CUT_TREE_9\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 39,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_BERRY_FOREST_CUT_TREE_8\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 39,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_BERRY_FOREST_CUT_TREE_7\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_BerryForest_EventScript_ItemMaxEther\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_BERRY_FOREST_MAX_ETHER\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_BerryForest_EventScript_ItemFullHeal\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_BERRY_FOREST_FULL_HEAL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 43,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_BerryForest_EventScript_ItemMaxElixir\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_BERRY_FOREST_MAX_ELIXIR\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 43,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_BOND_BRIDGE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 42,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_BOND_BRIDGE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 44,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_BOND_BRIDGE\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 75,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_BOND_BRIDGE\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 76,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_BOND_BRIDGE\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 77,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_BOND_BRIDGE\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 27,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ThreeIsland_BerryForest_EventScript_BewareSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 39,\n      \"y\": 35,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ThreeIsland_BerryForest_EventScript_WelcomeSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 31,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"item\": \"ITEM_POMEG_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_POMEG_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 15,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"item\": \"ITEM_KELPSY_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_KELPSY_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 25,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"item\": \"ITEM_QUALOT_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_QUALOT_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 11,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"item\": \"ITEM_HONDEW_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_HONDEW_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 37,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ORAN_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ORAN_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 14,\n      \"y\": 23,\n      \"elevation\": 3,\n      \"item\": \"ITEM_CHERI_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHERI_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 47,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_CHESTO_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHESTO_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 7,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PECHA_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PECHA_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 16,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_RAWST_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_RAWST_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 25,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ASPEAR_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ASPEAR_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 46,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PERSIM_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PERSIM_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 43,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"item\": \"ITEM_GREPA_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_GREPA_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 8,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LUM_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_LUM_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 49,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"item\": \"ITEM_TAMATO_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_TAMATO_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 38,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"item\": \"ITEM_SITRUS_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_SITRUS_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 67,\n      \"y\": 36,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LIECHI_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_RAWST_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 77,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"item\": \"ITEM_STARF_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_LUM_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 77,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"item\": \"ITEM_GANLON_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHESTO_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 67,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"item\": \"ITEM_LANSAT_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PECHA_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 60,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"item\": \"ITEM_SALAC_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PERSIM_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 71,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"item\": \"ITEM_APICOT_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHERI_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 60,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PETAYA_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ASPEAR_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_BerryForest/scripts.inc",
    "content": ".set LOCALID_LOSTELLE, 1\n\nThreeIsland_BerryForest_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, ThreeIsland_BerryForest_OnTransition\n\t.byte 0\n\nThreeIsland_BerryForest_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST\n\tgetplayerxy VAR_RESULT, VAR_TEMP_1\n\tgoto_if_ge VAR_RESULT, 59, ThreeIsland_BerryForest_SetNewAreaEscapeWarp\n\tsetescapewarp MAP_THREE_ISLAND_BOND_BRIDGE, 255, 12, 26\n\tend\n\nThreeIsland_BerryForest_SetNewAreaEscapeWarp::\n\tsetescapewarp MAP_THREE_ISLAND_BOND_BRIDGE, 255, 28, 5\n\tend\n\nThreeIsland_BerryForest_EventScript_Lostelle::\n\tlock\n\tfaceplayer\n\tmsgbox ThreeIsland_BerryForest_Text_HelpScaryPokemon\n\tplayse SE_PIN\n\tapplymovement LOCALID_LOSTELLE, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_LOSTELLE, ThreeIsland_BerryForest_Movement_LostelleLookAround\n\twaitmovement 0\n\tmsgbox ThreeIsland_BerryForest_Text_HereItComesAgain\n\tgoto_if_questlog EventScript_ReleaseEnd\n\twaitse\n\tplaymoncry SPECIES_HYPNO, CRY_MODE_ENCOUNTER\n\twaitmoncry\n\tsetwildbattle SPECIES_HYPNO, 30\n\tdowildbattle\n\tspecial QuestLog_CutRecording\n\tapplymovement LOCALID_LOSTELLE, Common_Movement_FacePlayer\n\twaitmovement 0\n\tmsgbox ThreeIsland_BerryForest_Text_ThankYouHaveThis\n\tgiveitem ITEM_KELPSY_BERRY\n\tcall_if_eq VAR_RESULT, FALSE, ThreeIsland_BerryForest_EventScript_NoRoomForBerry\n\tspecial BufferBigGuyOrBigGirlString\n\tmsgbox ThreeIsland_BerryForest_Text_LetsGoHome\n\tclosemessage\n\tsetflag FLAG_RESCUED_LOSTELLE\n\tsetflag FLAG_HIDE_LOSTELLE_IN_BERRY_FOREST\n\tsetvar VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 2\n\tclearflag FLAG_HIDE_TWO_ISLAND_GAME_CORNER_LOSTELLE\n\twarp MAP_TWO_ISLAND_JOYFUL_GAME_CORNER, 6, 6\n\twaitstate\n\trelease\n\tend\n\nThreeIsland_BerryForest_EventScript_NoRoomForBerry::\n\tmsgbox ThreeIsland_BerryForest_Text_BerryPouchIsFull\n\treturn\n\nThreeIsland_BerryForest_Movement_LostelleLookAround::\n\twalk_in_place_faster_left\n\tdelay_16\n\twalk_in_place_faster_right\n\tdelay_8\n\twalk_in_place_faster_left\n\tstep_end\n\nThreeIsland_BerryForest_EventScript_WelcomeSign::\n\tmsgbox ThreeIsland_BerryForest_Text_WelcomeToBerryForest, MSGBOX_SIGN\n\tend\n\nThreeIsland_BerryForest_EventScript_BewareSign::\n\tmsgbox ThreeIsland_BerryForest_Text_BewareWildBerryLovingMons, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland_BerryForest/text.inc",
    "content": "ThreeIsland_BerryForest_Text_HelpScaryPokemon::\n    .string \"LOSTELLE: Whimper… Sniff…\\n\"\n    .string \"Oh! Please, help!\\p\"\n    .string \"A scary POKéMON appeared there\\n\"\n    .string \"a little while ago.\\p\"\n    .string \"It kept scaring.\\n\"\n    .string \"It made LOSTELLE scared.\\p\"\n    .string \"I'm too scared to move!\\n\"\n    .string \"But I want to go home…$\"\n\nThreeIsland_BerryForest_Text_HereItComesAgain::\n    .string \"Oh! Here it comes again!\\n\"\n    .string \"No! Go away! It's scaring me!\\p\"\n    .string \"Waaaaaaah!\\n\"\n    .string \"I want my daddy!$\"\n\nThreeIsland_BerryForest_Text_ThankYouHaveThis::\n    .string \"Ohh! That was so scary!\\n\"\n    .string \"Thank you!\\p\"\n    .string \"LOSTELLE came to pick some\\n\"\n    .string \"BERRIES.\\p\"\n    .string \"You can have this!$\"\n\nThreeIsland_BerryForest_Text_LetsGoHome::\n    .string \"What's your name?\\p\"\n    .string \"LOSTELLE's scared, so can I go\\n\"\n    .string \"with you to my daddy's house?\\p\"\n    .string \"Okay!\\n\"\n    .string \"Let's go home!$\"\n\nThreeIsland_BerryForest_Text_BerryPouchIsFull::\n    .string \"Your BERRY POUCH is full.\\n\"\n    .string \"I guess you don't want this.$\"\n\nThreeIsland_BerryForest_Text_WelcomeToBerryForest::\n    .string \"Welcome to the BERRY FOREST\\p\"\n    .string \"Be friendly and share BERRIES with\\n\"\n    .string \"others and POKéMON.$\"\n\nThreeIsland_BerryForest_Text_BewareWildBerryLovingMons::\n    .string \"Beware of wild, BERRY-loving\\n\"\n    .string \"POKéMON!$\"\n\n"
  },
  {
    "path": "data/maps/ThreeIsland_BondBridge/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_BOND_BRIDGE\",\n  \"name\": \"ThreeIsland_BondBridge\",\n  \"layout\": \"LAYOUT_THREE_ISLAND_BOND_BRIDGE\",\n  \"music\": \"MUS_ROUTE104\",\n  \"region_map_section\": \"MAPSEC_BOND_BRIDGE\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"right\",\n      \"offset\": 20,\n      \"map\": \"MAP_THREE_ISLAND\"\n    },\n    {\n      \"direction\": \"dive\",\n      \"offset\": 0,\n      \"map\": \"MAP_THREE_ISLAND_BOND_BRIDGE_UNDERWATER\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_AROMA_LADY\",\n      \"x\": 27,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"ThreeIsland_BondBridge_EventScript_Nikki\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_AROMA_LADY\",\n      \"x\": 68,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"ThreeIsland_BondBridge_EventScript_Violet\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TUBER_F\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"ThreeIsland_BondBridge_EventScript_Amira\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TUBER_F\",\n      \"in_connection\": false,\n      \"x\": 50,\n      \"y\": 31,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"ThreeIsland_BondBridge_EventScript_Alexis\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_WATER_2\",\n      \"x\": 36,\n      \"y\": 24,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"ThreeIsland_BondBridge_EventScript_Tisha\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TWIN\",\n      \"x\": 77,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"ThreeIsland_BondBridge_EventScript_Joy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TWIN\",\n      \"x\": 78,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"ThreeIsland_BondBridge_EventScript_Meg\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 72,\n      \"y\": 28,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_BOND_BRIDGE_CUT_TREE_1\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 86,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_BOND_BRIDGE_CUT_TREE_2\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 11,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_BERRY_FOREST\",\n      \"dest_warp_id\": 1\n    },\n    {\n      \"x\": 12,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_BERRY_FOREST\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_THREE_ISLAND_BERRY_FOREST\",\n      \"dest_warp_id\": 2\n    },\n    {\n      \"x\": 27,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_BERRY_FOREST\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_BERRY_FOREST\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_BERRY_FOREST\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 19,\n      \"y\": 32,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ThreeIsland_BondBridge_EventScript_BerryForestSign\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 61,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"item\": \"ITEM_MAX_REPEL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_MAX_REPEL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 44,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PEARL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_PEARL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 33,\n      \"y\": 27,\n      \"elevation\": 3,\n      \"item\": \"ITEM_STARDUST\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_STARDUST\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 91,\n      \"y\": 29,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ThreeIsland_BondBridge_EventScript_BondBridgeSign\"\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_BondBridge/scripts.inc",
    "content": "ThreeIsland_BondBridge_MapScripts::\n\t.byte 0\n\nThreeIsland_BondBridge_EventScript_BerryForestSign::\n\tmsgbox ThreeIsland_BondBridge_Text_BerryForestAhead, MSGBOX_SIGN\n\tend\n\nThreeIsland_BondBridge_EventScript_BondBridgeSign::\n\tmsgbox ThreeIsland_BondBridge_Text_BondBridgeSign, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland_BondBridge/text.inc",
    "content": "ThreeIsland_BondBridge_Text_NikkiIntro::\n    .string \"The salty tang of the sea…\\n\"\n    .string \"It tickles my heart.$\"\n\nThreeIsland_BondBridge_Text_NikkiDefeat::\n    .string \"…Sniff, sniff…\\n\"\n    .string \"Something smells unpleasant…$\"\n\nThreeIsland_BondBridge_Text_NikkiPostBattle::\n    .string \"Perhaps that reek is your sweaty\\n\"\n    .string \"POKéMON's body odor…$\"\n\nThreeIsland_BondBridge_Text_VioletIntro::\n    .string \"Where are you off to in such\\n\"\n    .string \"a hurry?$\"\n\nThreeIsland_BondBridge_Text_VioletDefeat::\n    .string \"You're raising some wonderful\\n\"\n    .string \"POKéMON.$\"\n\nThreeIsland_BondBridge_Text_VioletPostBattle::\n    .string \"If you keep going this way, you'll\\n\"\n    .string \"eventually reach BERRY FOREST.$\"\n\nThreeIsland_BondBridge_Text_AmiraIntro::\n    .string \"My mommy said that I can't swim\\n\"\n    .string \"without my float ring.$\"\n\nThreeIsland_BondBridge_Text_AmiraDefeat::\n    .string \"Waaah!\\n\"\n    .string \"Waaah!$\"\n\nThreeIsland_BondBridge_Text_AmiraPostBattle::\n    .string \"This year, I'm going to finally\\n\"\n    .string \"learn how to swim!$\"\n\nThreeIsland_BondBridge_Text_AlexisIntro::\n    .string \"Yay, yay!\\n\"\n    .string \"POKéMON!$\"\n\nThreeIsland_BondBridge_Text_AlexisDefeat::\n    .string \"What happens now?$\"\n\nThreeIsland_BondBridge_Text_AlexisPostBattle::\n    .string \"Did I just win?\\n\"\n    .string \"Or did I lose?$\"\n\nThreeIsland_BondBridge_Text_TishaIntro::\n    .string \"Oh, no, don't come here!\\n\"\n    .string \"Please, stay away from me!$\"\n\nThreeIsland_BondBridge_Text_TishaDefeat::\n    .string \"Okay, you've won!\\n\"\n    .string \"Now will you please go away?$\"\n\nThreeIsland_BondBridge_Text_TishaPostBattle::\n    .string \"A POKéMON bit through my \\n\"\n    .string \"swimsuit.\\p\"\n    .string \"I can't get out of the water!$\"\n\nThreeIsland_BondBridge_Text_JoyIntro::\n    .string \"JOY: We'll teach you what our\\n\"\n    .string \"favorite POKéMON is!$\"\n\nThreeIsland_BondBridge_Text_JoyDefeat::\n    .string \"JOY: Ohh…\\n\"\n    .string \"MEG!$\"\n\nThreeIsland_BondBridge_Text_JoyPostBattle::\n    .string \"JOY: Wasn't that fun?\\n\"\n    .string \"I hope we can battle again!$\"\n\nThreeIsland_BondBridge_Text_JoyNotEnoughMons::\n    .string \"JOY: I really want to battle with\\n\"\n    .string \"MEG.\\p\"\n    .string \"One POKéMON isn't enough.$\"\n\nThreeIsland_BondBridge_Text_MegIntro::\n    .string \"MEG: We'll show you our favorite\\n\"\n    .string \"POKéMON.$\"\n\nThreeIsland_BondBridge_Text_MegDefeat::\n    .string \"MEG: Ohh…\\n\"\n    .string \"JOY!$\"\n\nThreeIsland_BondBridge_Text_MegPostBattle::\n    .string \"MEG: JOY, wasn't that fun?$\"\n\nThreeIsland_BondBridge_Text_MegNotEnoughMons::\n    .string \"MEG: I want to battle together\\n\"\n    .string \"with JOY.\\p\"\n    .string \"One POKéMON isn't enough.$\"\n\nThreeIsland_BondBridge_Text_BerryForestAhead::\n    .string \"BERRY FOREST AHEAD$\"\n\nThreeIsland_BondBridge_Text_BondBridgeSign::\n    .string \"BOND BRIDGE\\n\"\n    .string \"Please be quiet when crossing.\\p\"\n    .string \"BERRY FOREST AHEAD$\"\n\n"
  },
  {
    "path": "data/maps/ThreeIsland_BondBridge_Underwater/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_BOND_BRIDGE_UNDERWATER\",\n  \"name\": \"ThreeIsland_BondBridge_Underwater\",\n  \"layout\": \"LAYOUT_THREE_ISLAND_BOND_BRIDGE_UNDERWATER\",\n  \"music\": \"MUS_UNDERWATER\",\n  \"region_map_section\": \"MAPSEC_UNDERWATER_124\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_UNDERWATER_BUBBLES\",\n  \"map_type\": \"MAP_TYPE_UNDERWATER\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"emerge\",\n      \"offset\": 0,\n      \"map\": \"MAP_THREE_ISLAND_BOND_BRIDGE\"\n    }\n  ],\n  \"object_events\": [\n\n  ],\n  \"warp_events\": [\n\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 30,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"item\": \"ITEM_HEART_SCALE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_UNDERWATER_HEART_SCALE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 55,\n      \"y\": 36,\n      \"elevation\": 3,\n      \"item\": \"ITEM_DIVE_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_UNDERWATER_DIVE_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"5\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_BondBridge_Underwater/scripts.inc",
    "content": "ThreeIsland_BondBridge_Underwater_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/ThreeIsland_BondBridge_Underwater/text.inc",
    "content": "\n"
  },
  {
    "path": "data/maps/ThreeIsland_DunsparceTunnel/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_DUNSPARCE_TUNNEL\",\n  \"name\": \"ThreeIsland_DunsparceTunnel\",\n  \"layout\": \"LAYOUT_THREE_ISLAND_DUNSPARCE_TUNNEL\",\n  \"music\": \"MUS_PETALBURG_WOODS\",\n  \"region_map_section\": \"MAPSEC_THREE_ISLE_PATH\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_DunsparceTunnel_EventScript_Prospector\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_PORT\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_PORT\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 21,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"item\": \"ITEM_NUGGET\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_DUNSPARCE_TUNNEL_NUGGET\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_DunsparceTunnel/scripts.inc",
    "content": ".set LOCALID_PROSPECTOR, 1\n\nThreeIsland_DunsparceTunnel_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, ThreeIsland_DunsparceTunnel_OnTransition\n\t.byte 0\n\nThreeIsland_DunsparceTunnel_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_THREE_ISLAND_DUNSPARCE_TUNNEL\n\tcall_if_set FLAG_SYS_RECEIVED_EXTENDED_DEX, ThreeIsland_DunsparceTunnel_EventScript_SetLayoutDugOut\n\tcall_if_unset FLAG_SYS_RECEIVED_EXTENDED_DEX, ThreeIsland_DunsparceTunnel_EventScript_MoveProspectorToWall\n\tend\n\nThreeIsland_DunsparceTunnel_EventScript_SetLayoutDugOut::\n\tsetmaplayoutindex LAYOUT_THREE_ISLAND_DUNSPARCE_TUNNEL_DUG_OUT\n\treturn\n\nThreeIsland_DunsparceTunnel_EventScript_MoveProspectorToWall::\n\tsetobjectxyperm LOCALID_PROSPECTOR, 6, 3\n\tsetobjectmovementtype LOCALID_PROSPECTOR, MOVEMENT_TYPE_FACE_RIGHT\n\treturn\n\nThreeIsland_DunsparceTunnel_EventScript_Prospector::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_NUGGET_FROM_DUNSPARCE_TUNNEL, ThreeIsland_DunsparceTunnel_EventScript_ProspectorAlreadyGaveNugget\n\tgoto_if_set FLAG_SYS_RECEIVED_EXTENDED_DEX, ThreeIsland_DunsparceTunnel_EventScript_ProspectorStruckGold\n\tmsgbox ThreeIsland_DunsparceTunnel_Text_ProspectingForGold\n\tclosemessage\n\tapplymovement LOCALID_PROSPECTOR, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nThreeIsland_DunsparceTunnel_EventScript_ProspectorStruckGold::\n\tmsgbox ThreeIsland_DunsparceTunnel_Text_StruckGoldThisIsForYou\n\tgoto_if_set FLAG_GOT_DOME_FOSSIL, ThreeIsland_DunsparceTunnel_EventScript_GiveHelixFossil\n\tbufferitemnameplural 0, ITEM_DOME_FOSSIL, 1\n\tgiveitem_msg ThreeIsland_DunsparceTunnel_Text_ObtainedFossil, ITEM_DOME_FOSSIL, 1, MUS_OBTAIN_KEY_ITEM\n\tgoto_if_eq VAR_RESULT, FALSE, ThreeIsland_DunsparceTunnel_EventScript_NoRoomForNugget\n\tsetflag FLAG_GOT_NUGGET_FROM_DUNSPARCE_TUNNEL\n\tgoto ThreeIsland_DunsparceTunnel_EventScript_ProspectorAlreadyGaveNugget\n\tend\n\nThreeIsland_DunsparceTunnel_EventScript_GiveHelixFossil::\n\tbufferitemnameplural 0, ITEM_HELIX_FOSSIL, 1\n\tgiveitem_msg ThreeIsland_DunsparceTunnel_Text_ObtainedFossil, ITEM_HELIX_FOSSIL, 1, MUS_OBTAIN_KEY_ITEM\n\tgoto_if_eq VAR_RESULT, FALSE, ThreeIsland_DunsparceTunnel_EventScript_NoRoomForNugget\n\tsetflag FLAG_GOT_NUGGET_FROM_DUNSPARCE_TUNNEL\n\tgoto ThreeIsland_DunsparceTunnel_EventScript_ProspectorAlreadyGaveNugget\n\tend\n\nThreeIsland_DunsparceTunnel_EventScript_NoRoomForNugget::\n\tmsgbox ThreeIsland_DunsparceTunnel_Text_WhoopsBagCrammedFull\n\trelease\n\tend\n\nThreeIsland_DunsparceTunnel_EventScript_ProspectorAlreadyGaveNugget::\n\tcall_if_set FLAG_GOT_DOME_FOSSIL, ThreeIsland_DunsparceTunnel_EventScript_BufferHelix\n\tcall_if_unset FLAG_GOT_DOME_FOSSIL, ThreeIsland_DunsparceTunnel_EventScript_BufferDome\n\tmsgbox ThreeIsland_DunsparceTunnel_Text_ThatsANugget\n\trelease\n\tend\n\nThreeIsland_DunsparceTunnel_EventScript_BufferHelix::\n\tbufferitemnameplural 0, ITEM_HELIX_FOSSIL, 1\n\treturn\n\nThreeIsland_DunsparceTunnel_EventScript_BufferDome::\n\tbufferitemnameplural 0, ITEM_DOME_FOSSIL, 1\n\treturn\n"
  },
  {
    "path": "data/maps/ThreeIsland_DunsparceTunnel/text.inc",
    "content": "ThreeIsland_DunsparceTunnel_Text_ProspectingForGold::\n    .string \"Hey, there!\\n\"\n    .string \"How's it going?\\p\"\n    .string \"What am I doing here, you ask?\\n\"\n    .string \"Why, I'm prospecting for gold!\\p\"\n    .string \"When I strike it rich, I'm buying\\n\"\n    .string \"a house in KANTO.$\"\n\nThreeIsland_DunsparceTunnel_Text_StruckGoldThisIsForYou::\n    .string \"Hey, there! How's it going?\\n\"\n    .string \"Did you hear? I've struck gold!\\p\"\n    .string \"You remembered that I was\\n\"\n    .string \"prospecting, didn't you?\\p\"\n    .string \"You can't begin to imagine just\\n\"\n    .string \"how happy I am.\\p\"\n    .string \"I also found something peculiar\\n\"\n    .string \"while digging through here.\\p\"\n    .string \"I'm feeling generous now that\\n\"\n    .string \"I'm rich, so this is for you!$\"\n\nThreeIsland_DunsparceTunnel_Text_ThatsANugget::\n    .string \"That's a {STR_VAR_1}!\\p\"\n    .string \"I can't give you any of its ancient\\n\"\n    .string \"wisdom, so that'll have to do!$\"\n\nThreeIsland_DunsparceTunnel_Text_WhoopsBagCrammedFull::\n    .string \"Whoops, your BAG is crammed full!\\n\"\n    .string \"I'll give this to you later.$\"\n\nThreeIsland_DunsparceTunnel_Text_ObtainedFossil::\n    .string \"{PLAYER} received a {STR_VAR_1}\\nfrom the prospector!$\"\n"
  },
  {
    "path": "data/maps/ThreeIsland_Harbor/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_HARBOR\",\n  \"name\": \"ThreeIsland_Harbor\",\n  \"layout\": \"LAYOUT_ISLAND_HARBOR\",\n  \"music\": \"MUS_RUSTBORO\",\n  \"region_map_section\": \"MAPSEC_THREE_ISLE_PORT\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_Harbor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_PORT\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_Harbor/scripts.inc",
    "content": "ThreeIsland_Harbor_MapScripts::\n\t.byte 0\n\nThreeIsland_Harbor_EventScript_Sailor::\n\tlock\n\tfaceplayer\n\tmessage Text_WhereDoYouWantToSail\n\twaitmessage\n\tsetvar VAR_0x8004, SEAGALLOP_THREE_ISLAND\n\tgoto EventScript_ChooseDestFromIsland\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland_House1/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_HOUSE1\",\n  \"name\": \"ThreeIsland_House1\",\n  \"layout\": \"LAYOUT_THREE_ISLAND_HOUSE1\",\n  \"music\": \"MUS_RUSTBORO\",\n  \"region_map_section\": \"MAPSEC_THREE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TWIN\",\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_House1_EventScript_Lostelle\",\n      \"flag\": \"FLAG_HIDE_LOSTELLE_IN_HER_HOME\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ThreeIsland_House1_EventScript_DisplayCase\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_House1/scripts.inc",
    "content": "ThreeIsland_House1_MapScripts::\n\t.byte 0\n\nThreeIsland_House1_EventScript_Lostelle::\n\tlock\n\tfaceplayer\n\tspecial BufferBigGuyOrBigGirlString\n\tmsgbox ThreeIsland_House1_Text_YoureAlwaysSoCool\n\trelease\n\tend\n\nThreeIsland_House1_EventScript_DisplayCase::\n\tmsgbox ThreeIsland_House1_Text_RareRocksGemsDisplayed, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland_House1/text.inc",
    "content": "ThreeIsland_House1_Text_YoureAlwaysSoCool::\n    .string \"LOSTELLE: Hi, {PLAYER}!\\n\"\n    .string \"You're always so cool!\\p\"\n    .string \"I'll make lunch for you, too, one\\n\"\n    .string \"day, {PLAYER}.$\"\n\nThreeIsland_House1_Text_RareRocksGemsDisplayed::\n    .string \"Rare rocks and gems are displayed.$\"\n\n"
  },
  {
    "path": "data/maps/ThreeIsland_House2/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_HOUSE2\",\n  \"name\": \"ThreeIsland_House2\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_RUSTBORO\",\n  \"region_map_section\": \"MAPSEC_THREE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_House2_EventScript_Rocker\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_House2_EventScript_Man\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_House2/scripts.inc",
    "content": "ThreeIsland_House2_MapScripts::\n\t.byte 0\n\nThreeIsland_House2_EventScript_Man::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_SABRINA, 1\n\tmsgbox ThreeIsland_House2_Text_IAdmireSabrina\n\trelease\n\tend\n\nThreeIsland_House2_EventScript_Rocker::\n\tmsgbox ThreeIsland_House2_Text_CantMakeThisSpoonBend, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland_House2/text.inc",
    "content": "ThreeIsland_House2_Text_CantMakeThisSpoonBend::\n    .string \"Urrrrrrrrgggghhhh…\\n\"\n    .string \"Kwaaaaah!\\p\"\n    .string \"…It's useless! I can't make this\\n\"\n    .string \"spoon bend with my mind.\\p\"\n    .string \"Maybe I really don't have any\\n\"\n    .string \"psychic powers.$\"\n\nThreeIsland_House2_Text_IAdmireSabrina::\n    .string \"You know about a girl GYM LEADER\\n\"\n    .string \"in SAFFRON CITY?\\p\"\n    .string \"She uses PSYCHIC-type POKéMON,\\n\"\n    .string \"right?\\p\"\n    .string \"I admire her, I really do.\\p\"\n    .string \"I've heard that she's one cool\\n\"\n    .string \"customer and beautiful, too.$\"\n\n"
  },
  {
    "path": "data/maps/ThreeIsland_House3/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_HOUSE3\",\n  \"name\": \"ThreeIsland_House3\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_RUSTBORO\",\n  \"region_map_section\": \"MAPSEC_THREE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_House3_EventScript_Beauty\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_House3/scripts.inc",
    "content": "ThreeIsland_House3_MapScripts::\n\t.byte 0\n\nThreeIsland_House3_EventScript_Beauty::\n\tmsgbox ThreeIsland_House3_Text_WantedToLiveSomewhereQuiet, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland_House3/text.inc",
    "content": "ThreeIsland_House3_Text_WantedToLiveSomewhereQuiet::\n    .string \"I bought this house because I\\n\"\n    .string \"wanted to live somewhere quiet.\\p\"\n    .string \"Today, I think I'll go out fishing.$\"\n\n"
  },
  {
    "path": "data/maps/ThreeIsland_House4/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_HOUSE4\",\n  \"name\": \"ThreeIsland_House4\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_RUSTBORO\",\n  \"region_map_section\": \"MAPSEC_THREE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_House4_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_House4_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_House4/scripts.inc",
    "content": "ThreeIsland_House4_MapScripts::\n\t.byte 0\n\nThreeIsland_House4_EventScript_BaldingMan::\n\tmsgbox ThreeIsland_House4_Text_GhostsInBerryForest, MSGBOX_NPC\n\tend\n\nThreeIsland_House4_EventScript_LittleBoy::\n\tmsgbox ThreeIsland_House4_Text_PapaKeepsLyingToMe, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland_House4/text.inc",
    "content": "ThreeIsland_House4_Text_GhostsInBerryForest::\n    .string \"You must never, ever go out to\\n\"\n    .string \"the BERRY FOREST alone.\\p\"\n    .string \"Why?\\n\"\n    .string \"There are ghosts there.$\"\n\nThreeIsland_House4_Text_PapaKeepsLyingToMe::\n    .string \"Papa keeps lying to me, and won't\\n\"\n    .string \"let me go out and play!$\"\n\n"
  },
  {
    "path": "data/maps/ThreeIsland_House5/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_HOUSE5\",\n  \"name\": \"ThreeIsland_House5\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_RUSTBORO\",\n  \"region_map_section\": \"MAPSEC_THREE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_House5_EventScript_LittleGirl\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_House5/scripts.inc",
    "content": "ThreeIsland_House5_MapScripts::\n\t.byte 0\n\nThreeIsland_House5_EventScript_LittleGirl::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_RESCUED_LOSTELLE, ThreeIsland_House5_EventScript_LittleGirlLostelleFound\n\tmsgbox ThreeIsland_House5_Text_ImNotLostelle\n\trelease\n\tend\n\nThreeIsland_House5_EventScript_LittleGirlLostelleFound::\n\tmsgbox ThreeIsland_House5_Text_IllGoPlayWithLostelle\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland_House5/text.inc",
    "content": "ThreeIsland_House5_Text_ImNotLostelle::\n    .string \"Me?\\n\"\n    .string \"I'm not LOSTELLE.\\p\"\n    .string \"She's probably gone to the\\n\"\n    .string \"BERRY FOREST, I think.\\p\"\n    .string \"She picks BERRIES there for making\\n\"\n    .string \"lunch.$\"\n\nThreeIsland_House5_Text_IllGoPlayWithLostelle::\n    .string \"I think I'll go play with LOSTELLE\\n\"\n    .string \"today.$\"\n\n"
  },
  {
    "path": "data/maps/ThreeIsland_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_MART\",\n  \"name\": \"ThreeIsland_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_THREE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_Mart_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PICNICKER\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_Mart_EventScript_Picnicker\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_Mart_EventScript_BugCatcher\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_Mart_EventScript_Youngster\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_Mart/scripts.inc",
    "content": "ThreeIsland_Mart_MapScripts::\n\t.byte 0\n\nThreeIsland_Mart_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart ThreeIsland_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nThreeIsland_Mart_Items::\n\t.2byte ITEM_ULTRA_BALL\n\t.2byte ITEM_HYPER_POTION\n\t.2byte ITEM_REVIVE\n\t.2byte ITEM_FULL_HEAL\n\t.2byte ITEM_ESCAPE_ROPE\n\t.2byte ITEM_MAX_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nThreeIsland_Mart_EventScript_Picnicker::\n\tmsgbox ThreeIsland_Mart_Text_TrueThatCeldadonDeptStoreBigger, MSGBOX_NPC\n\tend\n\nThreeIsland_Mart_EventScript_BugCatcher::\n\tmsgbox ThreeIsland_Mart_Text_PeopleHealWithBerriesFromForest, MSGBOX_NPC\n\tend\n\nThreeIsland_Mart_EventScript_Youngster::\n\tmsgbox ThreeIsland_Mart_Text_BikersWereAboutToTrashMart, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland_Mart/text.inc",
    "content": "ThreeIsland_Mart_Text_TrueThatCeldadonDeptStoreBigger::\n    .string \"Is it true?\\p\"\n    .string \"CELADON DEPT. STORE is several\\n\"\n    .string \"times bigger than this shop?$\"\n\nThreeIsland_Mart_Text_PeopleHealWithBerriesFromForest::\n    .string \"I sometimes buy medicine here.\\p\"\n    .string \"But a lot of people heal POKéMON\\n\"\n    .string \"with BERRIES from BERRY FOREST.\\p\"\n    .string \"After all, BERRIES are free and\\n\"\n    .string \"they never run out.$\"\n\nThreeIsland_Mart_Text_BikersWereAboutToTrashMart::\n    .string \"Those BIKERS were about to trash\\n\"\n    .string \"this POKéMON MART.\\p\"\n    .string \"Am I glad they decided to leave!$\"\n\n"
  },
  {
    "path": "data/maps/ThreeIsland_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_POKEMON_CENTER_1F\",\n  \"name\": \"ThreeIsland_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_THREE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ROCKER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_PokemonCenter_1F_EventScript_Rocker\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_PokemonCenter_1F_EventScript_Lass\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_PokemonCenter_1F_EventScript_Sailor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_THREE_ISLAND_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_PokemonCenter_1F/scripts.inc",
    "content": "ThreeIsland_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, ThreeIsland_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nThreeIsland_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_THREE_ISLAND\n\tend\n\nThreeIsland_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nThreeIsland_PokemonCenter_1F_EventScript_Sailor::\n\tmsgbox ThreeIsland_PokemonCenter_1F_Text_ImpossibleToSurfBetweenIslands, MSGBOX_NPC\n\tend\n\nThreeIsland_PokemonCenter_1F_EventScript_Lass::\n\tmsgbox ThreeIsland_PokemonCenter_1F_Text_AlwaysBerriesInBerryForest, MSGBOX_NPC\n\tend\n\nThreeIsland_PokemonCenter_1F_EventScript_Rocker::\n\tmsgbox ThreeIsland_PokemonCenter_1F_Text_PCNetworkCanLinkWithKanto, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland_PokemonCenter_1F/text.inc",
    "content": "ThreeIsland_PokemonCenter_1F_Text_PCNetworkCanLinkWithKanto::\n    .string \"Hey, did you hear the news?\\p\"\n    .string \"The PC network here can now link\\n\"\n    .string \"with PCs in KANTO.\\p\"\n    .string \"I don't know how that came about,\\n\"\n    .string \"but it's fantastic!$\"\n\nThreeIsland_PokemonCenter_1F_Text_ImpossibleToSurfBetweenIslands::\n    .string \"It's impossible to SURF between the\\n\"\n    .string \"islands around these parts.\\p\"\n    .string \"The tides are too fast and\\n\"\n    .string \"treacherous.$\"\n\nThreeIsland_PokemonCenter_1F_Text_AlwaysBerriesInBerryForest::\n    .string \"Let's crush BERRIES!\\n\"\n    .string \"…That'd be wasting BERRIES?\\p\"\n    .string \"You can always find some BERRIES\\n\"\n    .string \"on the ground in BERRY FOREST.$\"\n\n"
  },
  {
    "path": "data/maps/ThreeIsland_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_POKEMON_CENTER_2F\",\n  \"name\": \"ThreeIsland_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_THREE_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_THREE_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_PokemonCenter_2F/scripts.inc",
    "content": "ThreeIsland_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nThreeIsland_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nThreeIsland_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nThreeIsland_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland_Port/map.json",
    "content": "{\n  \"id\": \"MAP_THREE_ISLAND_PORT\",\n  \"name\": \"ThreeIsland_Port\",\n  \"layout\": \"LAYOUT_THREE_ISLAND_PORT\",\n  \"music\": \"MUS_ROUTE104\",\n  \"region_map_section\": \"MAPSEC_THREE_ISLE_PORT\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 0,\n      \"map\": \"MAP_THREE_ISLAND\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_3\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_Port_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT\",\n      \"movement_range_x\": 3,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_Port_EventScript_Biker1\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_BIKERS\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ThreeIsland_Port_EventScript_Biker2\",\n      \"flag\": \"FLAG_HIDE_THREE_ISLAND_BIKERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 16,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_THREE_ISLAND_DUNSPARCE_TUNNEL\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 38,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_DUNSPARCE_TUNNEL\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_THREE_ISLAND_HARBOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 39,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"item\": \"ITEM_TAMATO_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_THREE_ISLAND_PORT_TAMATO_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/ThreeIsland_Port/scripts.inc",
    "content": "ThreeIsland_Port_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, ThreeIsland_Port_OnTransition\n\t.byte 0\n\nThreeIsland_Port_OnTransition::\n\tclearflag FLAG_SYS_PC_STORAGE_DISABLED\n\tsetflag FLAG_SEVII_DETOUR_FINISHED\n\tend\n\nThreeIsland_Port_EventScript_Woman::\n\tlock\n\tfaceplayer\n\tgoto_if_ge VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 2, ThreeIsland_Port_EventScript_WomanLostelleFound\n\tgoto_if_ge VAR_MAP_SCENE_THREE_ISLAND, 4, ThreeIsland_Port_EventScript_WomanBikersGone\n\tmsgbox ThreeIsland_Port_Text_IllCallThePolice\n\trelease\n\tend\n\nThreeIsland_Port_EventScript_WomanLostelleFound::\n\tmsgbox ThreeIsland_Port_Text_EverythingTurnedOutForBest\n\trelease\n\tend\n\nThreeIsland_Port_EventScript_WomanBikersGone::\n\tmsgbox ThreeIsland_Port_Text_ThankGoodnessBikersGone\n\trelease\n\tend\n\nThreeIsland_Port_EventScript_Biker1::\n\tmsgbox ThreeIsland_Port_Text_WereKantoRiderFederation, MSGBOX_NPC\n\tend\n\nThreeIsland_Port_EventScript_Biker2::\n\tlock\n\tmsgbox ThreeIsland_Port_Text_ForkOverMoney\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/ThreeIsland_Port/text.inc",
    "content": "ThreeIsland_Port_Text_WereKantoRiderFederation::\n    .string \"We're the KANTO RIDER FEDERATION!\\n\"\n    .string \"Vroom! Vavavavooom! Vroom!\\p\"\n    .string \"My bike's wimpy, so I have to\\n\"\n    .string \"make exhaust noises myself!$\"\n\nThreeIsland_Port_Text_ForkOverMoney::\n    .string \"Hey, hey, lady!\\n\"\n    .string \"Fork over some spending money!$\"\n\nThreeIsland_Port_Text_IllCallThePolice::\n    .string \"Aiyeeh!\\p\"\n    .string \"Wh-who are you?!\\n\"\n    .string \"I… I'll call the police!$\"\n\nThreeIsland_Port_Text_ThankGoodnessBikersGone::\n    .string \"Those BIKERS…\\n\"\n    .string \"Are they gone?\\p\"\n    .string \"Oh, thank goodness!\\n\"\n    .string \"They certainly had me terrified!$\"\n\nThreeIsland_Port_Text_EverythingTurnedOutForBest::\n    .string \"Those BIKERS ran off, and\\n\"\n    .string \"LOSTELLE was found safe.\\p\"\n    .string \"Everything turned out for the best!$\"\n\n"
  },
  {
    "path": "data/maps/TradeCenter/map.json",
    "content": "{\n  \"id\": \"MAP_TRADE_CENTER\",\n  \"name\": \"TradeCenter\",\n  \"layout\": \"LAYOUT_TRADE_CENTER\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_SPECIAL_AREA\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST\",\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TradeCenter_EventScript_Attendant\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"TradeCenter_EventScript_Chair0\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"TradeCenter_EventScript_Chair1\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TradeCenter/scripts.inc",
    "content": "TradeCenter_MapScripts::\n\t.byte 0\n"
  },
  {
    "path": "data/maps/TrainerTower_1F/map.json",
    "content": "{\n  \"id\": \"MAP_TRAINER_TOWER_1F\",\n  \"name\": \"TrainerTower_1F\",\n  \"layout\": \"LAYOUT_TRAINER_TOWER_1F\",\n  \"music\": \"MUS_TRAINER_TOWER\",\n  \"region_map_section\": \"MAPSEC_TRAINER_TOWER_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TRAINER_TOWER_DUDE\",\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_TEMP_6\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer1\",\n      \"flag\": \"FLAG_TEMP_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_1\",\n      \"x\": 15,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SinglesTrainer\",\n      \"flag\": \"FLAG_TEMP_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_2\",\n      \"x\": 10,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_KnockoutTrainer\",\n      \"flag\": \"FLAG_TEMP_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_3\",\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer2\",\n      \"flag\": \"FLAG_TEMP_5\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_LOBBY\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_E\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SingleBattleTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TrainerTower_1F/scripts.inc",
    "content": "TrainerTower_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame\n\t.byte 0\n\n@ All Trainer Tower floors/roof share these scripts for their object events\n\nTrainerTower_EventScript_DoublesTrainer1::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer1\n\tend\n\nTrainerTower_EventScript_SinglesTrainer::\n\tcall TrainerTower_EventScript_SpeakToSinglesTrainer\n\tend\n\nTrainerTower_EventScript_KnockoutTrainer::\n\tcall TrainerTower_EventScript_SpeakToKnockoutTrainer\n\tend\n\nTrainerTower_EventScript_DoublesTrainer2::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer2\n\tend\n\nTrainerTower_EventScript_Owner::\n\tcall TrainerTower_EventScript_SpeakToOwner\n\tend\n"
  },
  {
    "path": "data/maps/TrainerTower_2F/map.json",
    "content": "{\n  \"id\": \"MAP_TRAINER_TOWER_2F\",\n  \"name\": \"TrainerTower_2F\",\n  \"layout\": \"LAYOUT_TRAINER_TOWER_2F\",\n  \"music\": \"MUS_TRAINER_TOWER\",\n  \"region_map_section\": \"MAPSEC_TRAINER_TOWER_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TRAINER_TOWER_DUDE\",\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_Owner\",\n      \"flag\": \"FLAG_TEMP_6\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer1\",\n      \"flag\": \"FLAG_TEMP_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_1\",\n      \"x\": 15,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SinglesTrainer\",\n      \"flag\": \"FLAG_TEMP_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_2\",\n      \"x\": 10,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_KnockoutTrainer\",\n      \"flag\": \"FLAG_TEMP_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_3\",\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer2\",\n      \"flag\": \"FLAG_TEMP_5\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_3F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRAINER_TOWER_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_E\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SingleBattleTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TrainerTower_2F/scripts.inc",
    "content": "TrainerTower_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame\n\t.byte 0\n\n@ Below scripts are unused, the identical versions in the 1F script are used instead\n\nTrainerTower_2F_EventScript_DoublesTrainer1::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer1\n\tend\n\nTrainerTower_2F_EventScript_SinglesTrainer::\n\tcall TrainerTower_EventScript_SpeakToSinglesTrainer\n\tend\n\nTrainerTower_2F_EventScript_KnockoutTrainer::\n\tcall TrainerTower_EventScript_SpeakToKnockoutTrainer\n\tend\n\nTrainerTower_2F_EventScript_DoublesTrainer2::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer2\n\tend\n\nTrainerTower_2F_EventScript_Owner::\n\tcall TrainerTower_EventScript_SpeakToOwner\n\tend\n"
  },
  {
    "path": "data/maps/TrainerTower_3F/map.json",
    "content": "{\n  \"id\": \"MAP_TRAINER_TOWER_3F\",\n  \"name\": \"TrainerTower_3F\",\n  \"layout\": \"LAYOUT_TRAINER_TOWER_3F\",\n  \"music\": \"MUS_TRAINER_TOWER\",\n  \"region_map_section\": \"MAPSEC_TRAINER_TOWER_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TRAINER_TOWER_DUDE\",\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_Owner\",\n      \"flag\": \"FLAG_TEMP_6\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer1\",\n      \"flag\": \"FLAG_TEMP_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_1\",\n      \"x\": 15,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SinglesTrainer\",\n      \"flag\": \"FLAG_TEMP_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_2\",\n      \"x\": 10,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_KnockoutTrainer\",\n      \"flag\": \"FLAG_TEMP_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_3\",\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer2\",\n      \"flag\": \"FLAG_TEMP_5\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_4F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRAINER_TOWER_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_E\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SingleBattleTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TrainerTower_3F/scripts.inc",
    "content": "TrainerTower_3F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame\n\t.byte 0\n\n@ Below scripts are unused, the identical versions in the 1F script are used instead\n\nTrainerTower_3F_EventScript_DoublesTrainer1::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer1\n\tend\n\nTrainerTower_3F_EventScript_SinglesTrainer::\n\tcall TrainerTower_EventScript_SpeakToSinglesTrainer\n\tend\n\nTrainerTower_3F_EventScript_KnockoutTrainer::\n\tcall TrainerTower_EventScript_SpeakToKnockoutTrainer\n\tend\n\nTrainerTower_3F_EventScript_DoublesTrainer2::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer2\n\tend\n\nTrainerTower_3F_EventScript_Owner::\n\tcall TrainerTower_EventScript_SpeakToOwner\n\tend\n"
  },
  {
    "path": "data/maps/TrainerTower_4F/map.json",
    "content": "{\n  \"id\": \"MAP_TRAINER_TOWER_4F\",\n  \"name\": \"TrainerTower_4F\",\n  \"layout\": \"LAYOUT_TRAINER_TOWER_4F\",\n  \"music\": \"MUS_TRAINER_TOWER\",\n  \"region_map_section\": \"MAPSEC_TRAINER_TOWER_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TRAINER_TOWER_DUDE\",\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_Owner\",\n      \"flag\": \"FLAG_TEMP_6\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer1\",\n      \"flag\": \"FLAG_TEMP_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_1\",\n      \"x\": 15,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SinglesTrainer\",\n      \"flag\": \"FLAG_TEMP_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_2\",\n      \"x\": 10,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_KnockoutTrainer\",\n      \"flag\": \"FLAG_TEMP_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_3\",\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer2\",\n      \"flag\": \"FLAG_TEMP_5\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_5F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_3F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRAINER_TOWER_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_E\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SingleBattleTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TrainerTower_4F/scripts.inc",
    "content": "TrainerTower_4F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame\n\t.byte 0\n\n@ Below scripts are unused, the identical versions in the 1F script are used instead\n\nTrainerTower_4F_EventScript_DoublesTrainer1::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer1\n\tend\n\nTrainerTower_4F_EventScript_SinglesTrainer::\n\tcall TrainerTower_EventScript_SpeakToSinglesTrainer\n\tend\n\nTrainerTower_4F_EventScript_KnockoutTrainer::\n\tcall TrainerTower_EventScript_SpeakToKnockoutTrainer\n\tend\n\nTrainerTower_4F_EventScript_DoublesTrainer2::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer2\n\tend\n\nTrainerTower_4F_EventScript_Owner::\n\tcall TrainerTower_EventScript_SpeakToOwner\n\tend\n"
  },
  {
    "path": "data/maps/TrainerTower_5F/map.json",
    "content": "{\n  \"id\": \"MAP_TRAINER_TOWER_5F\",\n  \"name\": \"TrainerTower_5F\",\n  \"layout\": \"LAYOUT_TRAINER_TOWER_5F\",\n  \"music\": \"MUS_TRAINER_TOWER\",\n  \"region_map_section\": \"MAPSEC_TRAINER_TOWER_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TRAINER_TOWER_DUDE\",\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_Owner\",\n      \"flag\": \"FLAG_TEMP_6\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer1\",\n      \"flag\": \"FLAG_TEMP_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_1\",\n      \"x\": 15,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SinglesTrainer\",\n      \"flag\": \"FLAG_TEMP_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_2\",\n      \"x\": 10,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_KnockoutTrainer\",\n      \"flag\": \"FLAG_TEMP_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_3\",\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer2\",\n      \"flag\": \"FLAG_TEMP_5\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_6F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_4F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRAINER_TOWER_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_E\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SingleBattleTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TrainerTower_5F/scripts.inc",
    "content": "TrainerTower_5F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame\n\t.byte 0\n\n@ Below scripts are unused, the identical versions in the 1F script are used instead\n\nTrainerTower_5F_EventScript_DoublesTrainer1::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer1\n\tend\n\nTrainerTower_5F_EventScript_SinglesTrainer::\n\tcall TrainerTower_EventScript_SpeakToSinglesTrainer\n\tend\n\nTrainerTower_5F_EventScript_KnockoutTrainer::\n\tcall TrainerTower_EventScript_SpeakToKnockoutTrainer\n\tend\n\nTrainerTower_5F_EventScript_DoublesTrainer2::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer2\n\tend\n\nTrainerTower_5F_EventScript_Owner::\n\tcall TrainerTower_EventScript_SpeakToOwner\n\tend\n"
  },
  {
    "path": "data/maps/TrainerTower_6F/map.json",
    "content": "{\n  \"id\": \"MAP_TRAINER_TOWER_6F\",\n  \"name\": \"TrainerTower_6F\",\n  \"layout\": \"LAYOUT_TRAINER_TOWER_6F\",\n  \"music\": \"MUS_TRAINER_TOWER\",\n  \"region_map_section\": \"MAPSEC_TRAINER_TOWER_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TRAINER_TOWER_DUDE\",\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_Owner\",\n      \"flag\": \"FLAG_TEMP_6\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer1\",\n      \"flag\": \"FLAG_TEMP_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_1\",\n      \"x\": 15,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SinglesTrainer\",\n      \"flag\": \"FLAG_TEMP_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_2\",\n      \"x\": 10,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_KnockoutTrainer\",\n      \"flag\": \"FLAG_TEMP_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_3\",\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer2\",\n      \"flag\": \"FLAG_TEMP_5\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_7F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_5F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRAINER_TOWER_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_E\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SingleBattleTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TrainerTower_6F/scripts.inc",
    "content": "TrainerTower_6F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame\n\t.byte 0\n\n@ Below scripts are unused, the identical versions in the 1F script are used instead\n\nTrainerTower_6F_EventScript_DoublesTrainer1::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer1\n\tend\n\nTrainerTower_6F_EventScript_SinglesTrainer::\n\tcall TrainerTower_EventScript_SpeakToSinglesTrainer\n\tend\n\nTrainerTower_6F_EventScript_KnockoutTrainer::\n\tcall TrainerTower_EventScript_SpeakToKnockoutTrainer\n\tend\n\nTrainerTower_6F_EventScript_DoublesTrainer2::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer2\n\tend\n\nTrainerTower_6F_EventScript_Owner::\n\tcall TrainerTower_EventScript_SpeakToOwner\n\tend\n"
  },
  {
    "path": "data/maps/TrainerTower_7F/map.json",
    "content": "{\n  \"id\": \"MAP_TRAINER_TOWER_7F\",\n  \"name\": \"TrainerTower_7F\",\n  \"layout\": \"LAYOUT_TRAINER_TOWER_7F\",\n  \"music\": \"MUS_TRAINER_TOWER\",\n  \"region_map_section\": \"MAPSEC_TRAINER_TOWER_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TRAINER_TOWER_DUDE\",\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_Owner\",\n      \"flag\": \"FLAG_TEMP_6\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer1\",\n      \"flag\": \"FLAG_TEMP_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_1\",\n      \"x\": 15,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SinglesTrainer\",\n      \"flag\": \"FLAG_TEMP_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_2\",\n      \"x\": 10,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_KnockoutTrainer\",\n      \"flag\": \"FLAG_TEMP_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_3\",\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer2\",\n      \"flag\": \"FLAG_TEMP_5\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_8F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_6F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRAINER_TOWER_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_E\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SingleBattleTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TrainerTower_7F/scripts.inc",
    "content": "TrainerTower_7F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame\n\t.byte 0\n\n@ Below scripts are unused, the identical versions in the 1F script are used instead\n\nTrainerTower_7F_EventScript_DoublesTrainer1::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer1\n\tend\n\nTrainerTower_7F_EventScript_SinglesTrainer::\n\tcall TrainerTower_EventScript_SpeakToSinglesTrainer\n\tend\n\nTrainerTower_7F_EventScript_KnockoutTrainer::\n\tcall TrainerTower_EventScript_SpeakToKnockoutTrainer\n\tend\n\nTrainerTower_7F_EventScript_DoublesTrainer2::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer2\n\tend\n\nTrainerTower_7F_EventScript_Owner::\n\tcall TrainerTower_EventScript_SpeakToOwner\n\tend\n"
  },
  {
    "path": "data/maps/TrainerTower_8F/map.json",
    "content": "{\n  \"id\": \"MAP_TRAINER_TOWER_8F\",\n  \"name\": \"TrainerTower_8F\",\n  \"layout\": \"LAYOUT_TRAINER_TOWER_8F\",\n  \"music\": \"MUS_TRAINER_TOWER\",\n  \"region_map_section\": \"MAPSEC_TRAINER_TOWER_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TRAINER_TOWER_DUDE\",\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_Owner\",\n      \"flag\": \"FLAG_TEMP_6\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer1\",\n      \"flag\": \"FLAG_TEMP_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_1\",\n      \"x\": 15,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SinglesTrainer\",\n      \"flag\": \"FLAG_TEMP_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_2\",\n      \"x\": 10,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_KnockoutTrainer\",\n      \"flag\": \"FLAG_TEMP_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_3\",\n      \"x\": 11,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoublesTrainer2\",\n      \"flag\": \"FLAG_TEMP_5\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_ROOF\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_7F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRAINER_TOWER_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 10,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_E\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_SingleBattleTrigger\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerTop\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"var\": \"VAR_TEMP_F\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_EventScript_DoubleBattleTriggerBottom\"\n    }\n  ],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TrainerTower_8F/scripts.inc",
    "content": "TrainerTower_8F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame\n\t.byte 0\n\n@ Below scripts are unused, the identical versions in the 1F script are used instead\n\nTrainerTower_8F_EventScript_DoublesTrainer1::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer1\n\tend\n\nTrainerTower_8F_EventScript_SinglesTrainer::\n\tcall TrainerTower_EventScript_SpeakToSinglesTrainer\n\tend\n\nTrainerTower_8F_EventScript_KnockoutTrainer::\n\tcall TrainerTower_EventScript_SpeakToKnockoutTrainer\n\tend\n\nTrainerTower_8F_EventScript_DoublesTrainer2::\n\tcall TrainerTower_EventScript_SpeakToDoublesTrainer2\n\tend\n\nTrainerTower_8F_EventScript_Owner::\n\tcall TrainerTower_EventScript_SpeakToOwner\n\tend\n"
  },
  {
    "path": "data/maps/TrainerTower_Elevator/map.json",
    "content": "{\n  \"id\": \"MAP_TRAINER_TOWER_ELEVATOR\",\n  \"name\": \"TrainerTower_Elevator\",\n  \"layout\": \"LAYOUT_TRAINER_TOWER_ELEVATOR\",\n  \"music\": \"MUS_TRAINER_TOWER\",\n  \"region_map_section\": \"MAPSEC_TRAINER_TOWER_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [],\n  \"warp_events\": [\n    {\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 0,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"TrainerTower_Elevator_EventScript_FloorSelect\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TrainerTower_Elevator/scripts.inc",
    "content": "TrainerTower_Elevator_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame\n\t.byte 0\n\nTrainerTower_Elevator_EventScript_FloorSelect::\n\tlockall\n\tsetvar VAR_0x8004, 6\n\tcall_if_unset FLAG_TEMP_2, EventScript_GetElevatorFloor\n\tcopyvar VAR_0x8005, VAR_ELEVATOR_FLOOR\n\tspecial DrawElevatorCurrentFloorWindow\n\tmessage Text_WantWhichFloor\n\twaitmessage\n\tsetvar VAR_0x8004, 6\n\tspecialvar VAR_RESULT, InitElevatorFloorSelectMenuPos\n\tswitch VAR_RESULT\n\tcase 0, TrainerTower_Elevator_EventScript_FloorSelectFromRoof\n\tcase 1, TrainerTower_Elevator_EventScript_FloorSelectFromLobby\n\tend\n\nTrainerTower_Elevator_EventScript_FloorSelectFromRoof::\n\tmultichoicedefault 0, 0, MULTICHOICE_ROOFTOP_B1F, 0, FALSE\n\tgoto TrainerTower_Elevator_EventScript_ChooseFloor\n\tend\n\nTrainerTower_Elevator_EventScript_FloorSelectFromLobby::\n\tmultichoicedefault 0, 0, MULTICHOICE_ROOFTOP_B1F, 1, FALSE\n\tgoto TrainerTower_Elevator_EventScript_ChooseFloor\n\tend\n\nTrainerTower_Elevator_EventScript_ChooseFloor::\n\tswitch VAR_RESULT\n\tcase 0, TrainerTower_Elevator_EventScript_SelectRoof\n\tcase 1, TrainerTower_Elevator_EventScript_SelectLobby\n\tcase 2, TrainerTower_Elevator_EventScript_CloseFloorSelect\n\tcase SCR_MENU_CANCEL, TrainerTower_Elevator_EventScript_CloseFloorSelect\n\tend\n\nTrainerTower_Elevator_EventScript_SelectLobby::\n\tsetvar VAR_0x8006, 3\n\tsetdynamicwarp MAP_TRAINER_TOWER_LOBBY, 17, 8\n\tgoto_if_eq VAR_ELEVATOR_FLOOR, 3, TrainerTower_Elevator_EventScript_CloseFloorSelect\n\tcall TrainerTower_Elevator_EventScript_MoveElevator\n\tsetvar VAR_ELEVATOR_FLOOR, 3\n\tspecial CloseElevatorCurrentFloorWindow\n\tdelay 25\n\tapplymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Elevator_Movement_ExitElevator\n\twaitmovement 0\n\twarp MAP_TRAINER_TOWER_LOBBY, 17, 8\n\twaitstate\n\treleaseall\n\tend\n\nTrainerTower_Elevator_EventScript_SelectRoof::\n\tgoto TrainerTower_Elevator_EventScript_CloseFloorSelect\n\tend\n\nTrainerTower_Elevator_EventScript_CloseFloorSelect::\n\tspecial CloseElevatorCurrentFloorWindow\n\treleaseall\n\tend\n\nTrainerTower_Elevator_EventScript_MoveElevator::\n\tspecial CloseElevatorCurrentFloorWindow\n\tclosemessage\n\twaitse\n\tspecial AnimateElevator\n\twaitstate\n\tsetflag FLAG_TEMP_2\n\treturn\n\nTrainerTower_Elevator_Movement_ExitElevator::\n\twalk_in_place_faster_down\n\tdelay_16\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_down\n\tstep_end\n"
  },
  {
    "path": "data/maps/TrainerTower_Lobby/map.json",
    "content": "{\n  \"id\": \"MAP_TRAINER_TOWER_LOBBY\",\n  \"name\": \"TrainerTower_Lobby\",\n  \"layout\": \"LAYOUT_TRAINER_TOWER_LOBBY\",\n  \"music\": \"MUS_TRAINER_TOWER\",\n  \"region_map_section\": \"MAPSEC_TRAINER_TOWER_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_Lobby_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST\",\n      \"x\": 14,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_Lobby_EventScript_MartClerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST\",\n      \"x\": 11,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_Lobby_EventScript_Receptionist\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"x\": 12,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_Lobby_EventScript_CooltrainerF\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 2,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_Lobby_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SEVEN_ISLAND_TRAINER_TOWER\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRAINER_TOWER_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_TRAINER_TOWER\",\n      \"var_value\": \"0\",\n      \"script\": \"TrainerTower_Lobby_EventScript_EntryTrigger\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"TrainerTower_Lobby_EventScript_ShowRecords\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TrainerTower_Lobby/scripts.inc",
    "content": ".set LOCALID_NURSE,         1\n.set LOCALID_MART_CLERK,    2\n.set LOCALID_RECEPTIONIST,  3\n.set LOCALID_COOLTRAINER_F, 4\n.set LOCALID_BALDING_MAN,   5\n\nTrainerTower_Lobby_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, TrainerTower_Lobby_OnResume\n\tmap_script MAP_SCRIPT_ON_RETURN_TO_FIELD, TrainerTower_Lobby_OnReturnToField\n\tmap_script MAP_SCRIPT_ON_TRANSITION, TrainerTower_Lobby_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, TrainerTower_Lobby_OnLoad\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_Lobby_OnFrame\n\t.byte 0\n\nTrainerTower_Lobby_OnResume::\n\tsetvar VAR_TEMP_2, 0\n\tttower_resumetimer\n\tttower_shouldexit\n\tgoto_if_eq VAR_RESULT, FALSE, TrainerTower_Lobby_OnResumeEnd\n\t@ Never reached, above always FALSE\n\tsetvar VAR_TEMP_0, 0\n\tsetobjectxy OBJ_EVENT_ID_PLAYER, 9, 7\n\tapplymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_FaceReceptionist\nTrainerTower_Lobby_OnResumeEnd::\n\tend\n\nTrainerTower_Lobby_OnReturnToField::\n\taddobject LOCALID_NURSE\n\taddobject LOCALID_MART_CLERK\n\taddobject LOCALID_RECEPTIONIST\n\taddobject LOCALID_COOLTRAINER_F\n\taddobject LOCALID_BALDING_MAN\n\tend\n\nTrainerTower_Lobby_OnLoad::\n\tcall_if_eq VAR_TEMP_D, 17, TrainerTower_Lobby_OpenCounterBarrier\n\tend\n\nTrainerTower_Lobby_OpenCounterBarrier::\n\tsetmetatile 17, 10, METATILE_TrainerTower_Floor_ShadeBottomLeft, 0\n\treturn\n\nTrainerTower_Lobby_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_TRAINER_TOWER_LOBBY\n\tgetplayerxy VAR_TEMP_D, VAR_RESULT\n\tend\n\nTrainerTower_Lobby_OnFrame::\n\tmap_script_2 VAR_TEMP_0, 0, TrainerTower_Lobby_EventScript_Enter\n\tmap_script_2 VAR_TEMP_D, 17, TrainerTower_Lobby_EventScript_ExitElevator\n\t.2byte 0\n\nTrainerTower_Lobby_EventScript_ExitElevator::\n\tlockall\n\tapplymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_ExitElevator\n\twaitmovement 0\n\tsetmetatile 17, 10, METATILE_TrainerTower_CounterBarrier, 1\n\tspecial DrawWholeMapView\n\tplayse SE_CLICK\n\twaitse\n\tsetvar VAR_TEMP_D, 0\n\treleaseall\n\tend\n\nTrainerTower_Lobby_Movement_ExitElevator::\n\twalk_down\n\twalk_down\n\tstep_end\n\nTrainerTower_Lobby_EventScript_Enter::\n\tsetvar VAR_TEMP_0, 1\n\tttower_getchallengestatus\n\tswitch VAR_RESULT\n\tcase CHALLENGE_STATUS_LOST, TrainerTower_Lobby_EventScript_LostChallenge\n\tcase CHALLENGE_STATUS_UNK, TrainerTower_Lobby_EventScript_ExitChallengeSpeakToReceptionist\n\tcase CHALLENGE_STATUS_NORMAL, TrainerTower_Lobby_EventScript_EnterEnd\n\nTrainerTower_Lobby_EventScript_LostChallenge::\n\tlock\n\tfaceplayer\n\tapplymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_FaceReceptionist\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox TrainerTower_Lobby_Text_TooBadComeBackTryAgain\n\tgoto TrainerTower_Lobby_EventScript_ExitChallenge\n\n@ Presumably E-Reader related\nTrainerTower_Lobby_EventScript_ExitChallengeSpeakToReceptionist::\n\tlock\n\tfaceplayer\n\tapplymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_FaceReceptionist\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox TrainerTower_Lobby_Text_MoveCounterHereWhenTrainersSwitch\nTrainerTower_Lobby_EventScript_ExitChallenge::\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_WalkDown\n\twaitmovement 0\n\tsetvar VAR_MAP_SCENE_TRAINER_TOWER, 0\n\trelease\nTrainerTower_Lobby_EventScript_EnterEnd::\n\tend\n\nTrainerTower_Lobby_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nTrainerTower_Lobby_EventScript_Receptionist::\n\tlock\n\tfaceplayer\n\tttower_getbeatchallenge\n\tgoto_if_eq VAR_RESULT, TRUE, TrainerTower_Lobby_EventScript_ThanksForCompeting\n\tmsgbox TrainerTower_Lobby_Text_GiveItYourBest\n\tgoto TrainerTower_Lobby_EventScript_ReceptionistEnd\n\nTrainerTower_Lobby_EventScript_ThanksForCompeting::\n\tmsgbox TrainerTower_Lobby_Text_ThanksForCompeting\nTrainerTower_Lobby_EventScript_ReceptionistEnd::\n\trelease\n\tend\n\nTrainerTower_Lobby_EventScript_MartClerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart TrainerTower_Lobby_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nTrainerTower_Lobby_Mart_Items::\n\t.2byte ITEM_ULTRA_BALL\n\t.2byte ITEM_GREAT_BALL\n\t.2byte ITEM_FULL_RESTORE\n\t.2byte ITEM_MAX_POTION\n\t.2byte ITEM_HYPER_POTION\n\t.2byte ITEM_REVIVE\n\t.2byte ITEM_FULL_HEAL\n\t.2byte ITEM_ESCAPE_ROPE\n\t.2byte ITEM_MAX_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nTrainerTower_Lobby_EventScript_CantEnterInNuzlockeMode:\n\tcallnative CheckNoFreeHealsMode\n\tgoto_if_eq VAR_RESULT, TRUE, TrainerTower_Lobby_EventScript_CantEnterInBothModes\n\tsignmsg\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox TrainerTower_Lobby_Text_CantEnterInNuzlockeMode\n\tcall EventScript_RestorePrevTextColor\n\tnormalmsg\n\tgoto TrainerTower_Lobby_EventScript_DeclineChallenge\n\nTrainerTower_Lobby_Text_CantEnterInNuzlockeMode:\n\t.string \"The TRAINER TOWER cannot be\\n\"\n\t.string \"entered in NUZLOCKE MODE.$\"\n\nTrainerTower_Lobby_EventScript_CantEnterInBothModes:\n\tsignmsg\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox TrainerTower_Lobby_Text_CantEnterInBothModes\n\tcall EventScript_RestorePrevTextColor\n\tnormalmsg\n\tgoto TrainerTower_Lobby_EventScript_DeclineChallenge\n\nTrainerTower_Lobby_Text_CantEnterInBothModes:\n\t.string \"The TRAINER TOWER cannot be\\n\"\n\t.string \"entered in the NUZLOCKE or\\l\"\n\t.string \"NO FREE HEALS MODES.$\"\n\nTrainerTower_Lobby_EventScript_CantEnterInNoFreeHealsMode:\n\tsignmsg\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox TrainerTower_Lobby_Text_CantEnterInNoFreeHealsMode\n\tcall EventScript_RestorePrevTextColor\n\tnormalmsg\n\tgoto TrainerTower_Lobby_EventScript_DeclineChallenge\n\nTrainerTower_Lobby_Text_CantEnterInNoFreeHealsMode:\n\t.string \"The TRAINER TOWER cannot be\\n\"\n\t.string \"entered in NO FREE HEALS MODE.$\"\n\nTrainerTower_Lobby_EventScript_EntryTrigger::\n\tlockall\n\tapplymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_FaceReceptionist\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox TrainerTower_Lobby_Text_WelcomeToTrainerTower\n\tcallnative CheckNuzlockeMode\n\tgoto_if_eq VAR_RESULT, TRUE, TrainerTower_Lobby_EventScript_CantEnterInNuzlockeMode\n\tcallnative CheckNoFreeHealsMode\n\tgoto_if_eq VAR_RESULT, TRUE, TrainerTower_Lobby_EventScript_CantEnterInNoFreeHealsMode\n\tttower_getnumfloors\n\tgoto_if_eq VAR_RESULT, FALSE, TrainerTower_Lobby_EventScript_AllFloorsUsed\n\tmsgbox TrainerTower_Lobby_Text_TrainersUpToFloorNum\n\tgoto TrainerTower_Lobby_EventScript_AskEnterChallenge\n\nTrainerTower_Lobby_EventScript_AllFloorsUsed::\n\tmsgbox TrainerTower_Lobby_Text_TrainersUpEighthFloor\nTrainerTower_Lobby_EventScript_AskEnterChallenge::\n\tmessage TrainerTower_Lobby_Text_LikeToChallengeTrainers\n\twaitmessage\n\tmultichoice 18, 6, MULTICHOICE_YES_NO_INFO, FALSE\n\tswitch VAR_RESULT\n\tcase 0, TrainerTower_Lobby_EventScript_ChooseChallenge\n\tcase 1, TrainerTower_Lobby_EventScript_DeclineChallenge\n\tcase 2, TrainerTower_Lobby_EventScript_ChallengeInfo\n\tcase SCR_MENU_CANCEL, TrainerTower_Lobby_EventScript_DeclineChallenge\n\tend\n\nTrainerTower_Lobby_EventScript_ChallengeInfo::\n\tmsgbox TrainerTower_Lobby_Text_ExplainTrainerTower\n\tgoto TrainerTower_Lobby_EventScript_AskEnterChallenge\n\tend\n\nTrainerTower_Lobby_EventScript_ChooseChallenge::\n\tmultichoice 13, 3, MULTICHOICE_TRAINER_TOWER_MODE, FALSE\n\tswitch VAR_RESULT\n\tcase 0, TrainerTower_Lobby_EventScript_BeginChallenge\n\tcase 1, TrainerTower_Lobby_EventScript_BeginChallenge\n\tcase 2, TrainerTower_Lobby_EventScript_BeginChallenge\n\tcase 3, TrainerTower_Lobby_EventScript_BeginChallenge\n\tcase 4, TrainerTower_Lobby_EventScript_DeclineChallenge\n\tcase SCR_MENU_CANCEL, TrainerTower_Lobby_EventScript_DeclineChallenge\n\tend\n\nTrainerTower_Lobby_EventScript_BeginChallenge::\n\tcopyvar VAR_0x8005, VAR_RESULT\n\tsetvar VAR_MAP_SCENE_TRAINER_TOWER, 1\n\tspecial HealPlayerParty\n\tmsgbox TrainerTower_Lobby_Text_StartClockGetSetGo\n\tttower_startchallenge\n\treleaseall\n\tend\n\nTrainerTower_Lobby_EventScript_DeclineChallenge::\n\tmsgbox TrainerTower_Lobby_Text_PleaseVisitUsAgain\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Lobby_Movement_WalkDown\n\twaitmovement 0\n\treleaseall\n\tend\n\nTrainerTower_Lobby_Movement_FaceReceptionist::\n\tface_right\n\tstep_end\n\nTrainerTower_Lobby_Movement_WalkDown::\n\twalk_down\n\tstep_end\n\nTrainerTower_Lobby_EventScript_ShowRecords::\n\tlockall\n\tfadescreen FADE_TO_BLACK\n\tsetvar VAR_0x8004, 1\n\tspecial ShowBattleRecords\n\twaitstate\n\treleaseall\n\tend\n\nTrainerTower_Lobby_EventScript_CooltrainerF::\n\tmsgbox TrainerTower_Lobby_Text_WonderWhatKindsOfTrainers, MSGBOX_NPC\n\tend\n\nTrainerTower_Lobby_EventScript_BaldingMan::\n\tmsgbox TrainerTower_Lobby_Text_StairsTougherThanAnyBattle, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/TrainerTower_Lobby/text.inc",
    "content": "@ All Trainer Tower text (Lobby and Roof) is interleaved here\n\nTrainerTower_Lobby_Text_WelcomeToTrainerTower::\n    .string \"Hello!\\p\"\n    .string \"Welcome to TRAINER TOWER where\\n\"\n    .string \"TRAINERS gather from all over!$\"\n\nTrainerTower_Lobby_Text_TrainersUpToFloorNum::\n    .string \"TRAINERS from all over the world\\n\"\n    .string \"gather here to battle.\\p\"\n    .string \"Let me see…\\p\"\n    .string \"Right now, there are TRAINERS only\\n\"\n    .string \"up to Floor {STR_VAR_1}.$\"\n\nTrainerTower_Lobby_Text_TrainersUpEighthFloor::\n    .string \"TRAINERS are awaiting your\\n\"\n    .string \"challenge up to the eighth floor.$\"\n\nTrainerTower_Lobby_Text_LikeToChallengeTrainers::\n    .string \"Would you like to challenge the\\n\"\n    .string \"waiting TRAINERS?$\"\n\nTrainerTower_Lobby_Text_StartClockGetSetGo::\n    .string \"Okay, I'll get the clock started,\\n\"\n    .string \"so give it everything you have.\\p\"\n    .string \"On your marks…\\p\"\n    .string \"Get set…\\p\"\n    .string \"Go!$\"\n\nTrainerTower_Lobby_Text_PleaseVisitUsAgain::\n    .string \"Please do visit us again!$\"\n\nTrainerTower_Lobby_Text_TooBadComeBackTryAgain::\n    .string \"That was too bad.\\p\"\n    .string \"I think you put in a tremendous\\n\"\n    .string \"effort in your battling.\\p\"\n    .string \"Please come back and try again!$\"\n\nTrainerTower_Lobby_Text_GiveItYourBest::\n    .string \"I hope you give it your best.$\"\n\nTrainerTower_Lobby_Text_MoveCounterHereWhenTrainersSwitch::\n    .string \"When the TRAINERS switch places,\\n\"\n    .string \"the movement can be hectic.\\p\"\n    .string \"To avoid the stampede, we moved\\n\"\n    .string \"the reception counter here.\\p\"\n    .string \"I'm sorry for the inconvenience.$\"\n\nTrainerTower_Roof_Text_ImOwnerBattledPerfectly::\n    .string \"Hello…\\p\"\n    .string \"I am the owner of this TOWER…\\p\"\n    .string \"How the sky soars above this\\n\"\n    .string \"rooftop…\\p\"\n    .string \"The caress of the winds up here…\\p\"\n    .string \"It's all so perfect…\\p\"\n    .string \"The way you battled…\\n\"\n    .string \"It, too, was perfection…$\"\n\nTrainerTower_Roof_Text_ThisIsForYou::\n    .string \"This is for you…$\"\n\nTrainerTower_Roof_Text_DoneItInRecordTime::\n    .string \"Oh!\\n\"\n    .string \"Stupendous!\\p\"\n    .string \"It's marvelous how you've come up\\n\"\n    .string \"here so quickly.\\p\"\n    .string \"The fact is, you've done it in\\n\"\n    .string \"record time…\\p\"\n    .string \"I'll have your record posted at\\n\"\n    .string \"the reception counter.$\"\n\nTrainerTower_Roof_Text_TookSweetTimeGettingHere::\n    .string \"You seem to have taken your sweet\\n\"\n    .string \"time getting here…$\"\n\nTrainerTower_Roof_Text_IdLikeToSeeBetterTime::\n    .string \"What I would like to see is a\\n\"\n    .string \"better time out of you…\\p\"\n    .string \"I'm counting on you.\\p\"\n    .string \"Until then, farewell…$\"\n\nTrainerTower_Text_XMinYZSec::\n    .string \"{STR_VAR_1} min. {STR_VAR_2}.{STR_VAR_3} sec.$\"\n\nTrainerTower_Lobby_Text_NeedTwoMonsForDouble::\n    .string \"This is a two-on-two battle.\\p\"\n    .string \"You may not battle unless you have\\n\"\n    .string \"at least two POKéMON.$\"\n\nTrainerTower_Lobby_Text_ExplainTrainerTower::\n    .string \"Here at TRAINER TOWER, there is an\\n\"\n    .string \"event called TIME ATTACK.\\p\"\n    .string \"You will be timed on how quickly\\n\"\n    .string \"you can get from the reception\\l\"\n    .string \"counter to the OWNER on the roof.\\p\"\n    .string \"The best times will be recorded on\\n\"\n    .string \"the Time Board.\\p\"\n    .string \"Try competing with friends to see\\n\"\n    .string \"who can beat it the fastest.\\p\"\n    .string \"You will not earn any EXP. Points\\n\"\n    .string \"or money by beating TRAINERS here.$\"\n\nTrainerTower_Lobby_Text_ThanksForCompeting::\n    .string \"Thank you for competing!$\"\n\nTrainerTower_Lobby_Text_WonderWhatKindsOfTrainers::\n    .string \"I'm here to see how good I am.\\p\"\n    .string \"I wonder what kinds of TRAINERS\\n\"\n    .string \"are waiting for me?\\p\"\n    .string \"It's nerve-racking!$\"\n\nTrainerTower_Lobby_Text_StairsTougherThanAnyBattle::\n    .string \"Gasp, gasp…\\n\"\n    .string \"Gasp…\\p\"\n    .string \"Never mind battling! These stairs…\\n\"\n    .string \"They're tougher than any battle…$\"\n\n"
  },
  {
    "path": "data/maps/TrainerTower_Roof/map.json",
    "content": "{\n  \"id\": \"MAP_TRAINER_TOWER_ROOF\",\n  \"name\": \"TrainerTower_Roof\",\n  \"layout\": \"LAYOUT_TRAINER_TOWER_ROOF\",\n  \"music\": \"MUS_TRAINER_TOWER\",\n  \"region_map_section\": \"MAPSEC_TRAINER_TOWER_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TRAINER_TOWER_DUDE\",\n      \"x\": 9,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TrainerTower_EventScript_Owner\",\n      \"flag\": \"FLAG_TEMP_6\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRAINER_TOWER_ELEVATOR\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TRAINER_TOWER_8F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TrainerTower_Roof/scripts.inc",
    "content": "TrainerTower_Roof_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, TrainerTower_OnResume\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerTower_OnFrame\n\t.byte 0\n\n@ Below script is unused, the identical version in the 1F script is used instead\n\nTrainerTower_Roof_EventScript_Owner::\n\tcall TrainerTower_EventScript_SpeakToOwner\n\tend\n"
  },
  {
    "path": "data/maps/TwoIsland/map.json",
    "content": "{\n  \"id\": \"MAP_TWO_ISLAND\",\n  \"name\": \"TwoIsland\",\n  \"layout\": \"LAYOUT_TWO_ISLAND\",\n  \"music\": \"MUS_FORTREE\",\n  \"region_map_section\": \"MAPSEC_TWO_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": -3,\n      \"map\": \"MAP_TWO_ISLAND_CAPE_BRINK\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 28,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_EventScript_Woman\",\n      \"flag\": \"FLAG_HIDE_TWO_ISLAND_WOMAN\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BEAUTY\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_EventScript_Beauty\",\n      \"flag\": \"FLAG_HIDE_TWO_ISLAND_BEAUTY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 26,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_EventScript_Sailor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SUPER_NERD\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_EventScript_SuperNerd\",\n      \"flag\": \"FLAG_HIDE_TWO_ISLAND_SUPER_NERD\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 30,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_TWO_ISLAND_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 39,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_EventScript_ItemRevive\",\n      \"flag\": \"FLAG_HIDE_TWO_ISLAND_REVIVE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 37,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_EventScript_LittleBoy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_EventScript_Boy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 39,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TWO_ISLAND_JOYFUL_GAME_CORNER\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 33,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TWO_ISLAND_HOUSE\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 21,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TWO_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 10,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TWO_ISLAND_HARBOR\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 29,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"TwoIsland_EventScript_IslandSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 40,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"TwoIsland_EventScript_JoyfulGameCornerSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"TwoIsland_EventScript_FastCurrentSign\"\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/TwoIsland/scripts.inc",
    "content": "TwoIsland_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, TwoIsland_OnTransition\n\t.byte 0\n\nTwoIsland_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_TWO_ISLAND\n\tsetflag FLAG_VISITED_TWO_ISLAND\n\tcall TwoIsland_EventScript_SetShopState\n\tend\n\nTwoIsland_EventScript_SetShopState::\n\tgoto_if_set FLAG_SYS_CAN_LINK_WITH_RS, TwoIsland_EventScript_SetShopStateAfterHoennLink\n\tgoto_if_set FLAG_SYS_GAME_CLEAR, TwoIsland_EventScript_SetShopStateAfterChampion\n\tgoto_if_set FLAG_RESCUED_LOSTELLE, TwoIsland_EventScript_SetShopStateAfterLostelleRescue\n\tgoto TwoIsland_EventScript_SetShopStateDefault\n\tend\n\nTwoIsland_EventScript_SetShopStateAfterHoennLink::\n\tgoto_if_unset FLAG_TWO_ISLAND_SHOP_INTRODUCED, TwoIsland_EventScript_SetShopInitial\n\tgoto_if_unset FLAG_TWO_ISLAND_SHOP_EXPANDED_1, TwoIsland_EventScript_SetShopExpanded1\n\tgoto_if_unset FLAG_TWO_ISLAND_SHOP_EXPANDED_2, TwoIsland_EventScript_SetShopExpanded2\n\tgoto TwoIsland_EventScript_SetShopExpanded3\n\tend\n\nTwoIsland_EventScript_SetShopStateAfterChampion::\n\tgoto_if_unset FLAG_TWO_ISLAND_SHOP_INTRODUCED, TwoIsland_EventScript_SetShopInitial\n\tgoto_if_unset FLAG_RESCUED_LOSTELLE, TwoIsland_EventScript_SetShopInitial\n\tgoto_if_unset FLAG_TWO_ISLAND_SHOP_EXPANDED_1, TwoIsland_EventScript_SetShopExpanded1\n\tgoto TwoIsland_EventScript_SetShopExpanded2\n\tend\n\nTwoIsland_EventScript_SetShopStateAfterLostelleRescue::\n\tgoto_if_unset FLAG_TWO_ISLAND_SHOP_INTRODUCED, TwoIsland_EventScript_SetShopInitial\n\tgoto TwoIsland_EventScript_SetShopExpanded1\n\tend\n\nTwoIsland_EventScript_SetShopStateDefault::\n\tgoto TwoIsland_EventScript_SetShopInitial\n\tend\n\nTwoIsland_EventScript_SetShopInitial::\n\tsetvar VAR_MAP_SCENE_TWO_ISLAND, 1\n\treturn\n\nTwoIsland_EventScript_SetShopExpanded1::\n\tsetvar VAR_MAP_SCENE_TWO_ISLAND, 2\n\tclearflag FLAG_HIDE_TWO_ISLAND_WOMAN\n\treturn\n\nTwoIsland_EventScript_SetShopExpanded2::\n\tsetvar VAR_MAP_SCENE_TWO_ISLAND, 3\n\tclearflag FLAG_HIDE_TWO_ISLAND_BEAUTY\n\treturn\n\nTwoIsland_EventScript_SetShopExpanded3::\n\tsetvar VAR_MAP_SCENE_TWO_ISLAND, 4\n\tclearflag FLAG_HIDE_TWO_ISLAND_SUPER_NERD\n\treturn\n\nTwoIsland_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_MAP_SCENE_TWO_ISLAND, 4, TwoIsland_EventScript_ClerkShopExpanded3\n\tgoto_if_eq VAR_MAP_SCENE_TWO_ISLAND, 3, TwoIsland_EventScript_ClerkShopExpanded2\n\tgoto_if_eq VAR_MAP_SCENE_TWO_ISLAND, 2, TwoIsland_EventScript_ClerkShopExpanded1\n\tgoto TwoIsland_EventScript_ClerkShopInitial\n\tend\n\nTwoIsland_EventScript_ClerkShopExpanded3::\n\tgoto_if_set FLAG_TWO_ISLAND_SHOP_EXPANDED_3, TwoIsland_EventScript_ClerkShopSkipIntro\n\tsetflag FLAG_TWO_ISLAND_SHOP_EXPANDED_3\n\tmessage TwoIsland_Text_BringingItemsFromDistantLands\n\twaitmessage\n\tgoto TwoIsland_EventScript_ShopExpanded3\n\tend\n\nTwoIsland_EventScript_ClerkShopExpanded2::\n\tgoto_if_set FLAG_TWO_ISLAND_SHOP_EXPANDED_2, TwoIsland_EventScript_ClerkShopSkipIntro\n\tsetflag FLAG_TWO_ISLAND_SHOP_EXPANDED_2\n\tmessage TwoIsland_Text_HopeYouGiveItYourBest\n\twaitmessage\n\tgoto TwoIsland_EventScript_ShopExpanded2\n\tend\n\nTwoIsland_EventScript_ClerkShopExpanded1::\n\tgoto_if_set FLAG_TWO_ISLAND_SHOP_EXPANDED_1, TwoIsland_EventScript_ClerkShopSkipIntro\n\tsetflag FLAG_TWO_ISLAND_SHOP_EXPANDED_1\n\tmessage TwoIsland_Text_AddedMerchandiseForLostelle\n\twaitmessage\n\tgoto TwoIsland_EventScript_ShopExpanded1\n\tend\n\nTwoIsland_EventScript_ClerkShopInitial::\n\tgoto_if_set FLAG_TWO_ISLAND_SHOP_INTRODUCED, TwoIsland_EventScript_ClerkShopSkipIntro\n\tsetflag FLAG_TWO_ISLAND_SHOP_INTRODUCED\n\tmessage TwoIsland_Text_WelcomeToShopMerchandiseLimited\n\twaitmessage\n\tgoto TwoIsland_EventScript_ShopInitial\n\tend\n\nTwoIsland_EventScript_ClerkShopSkipIntro::\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tgoto_if_eq VAR_MAP_SCENE_TWO_ISLAND, 4, TwoIsland_EventScript_ShopExpanded3\n\tgoto_if_eq VAR_MAP_SCENE_TWO_ISLAND, 3, TwoIsland_EventScript_ShopExpanded2\n\tgoto_if_eq VAR_MAP_SCENE_TWO_ISLAND, 2, TwoIsland_EventScript_ShopExpanded1\n\tgoto TwoIsland_EventScript_ShopInitial\n\tend\n\nTwoIsland_EventScript_ShopInitial::\n\tpokemart TwoIsland_Items_ShopInitial\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nTwoIsland_Items_ShopInitial::\n\t.2byte ITEM_GREAT_BALL\n\t.2byte ITEM_FRESH_WATER\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nTwoIsland_EventScript_ShopExpanded1::\n\tpokemart TwoIsland_Items_ShopExpanded1\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nTwoIsland_Items_ShopExpanded1::\n\t.2byte ITEM_ULTRA_BALL\n\t.2byte ITEM_GREAT_BALL\n\t.2byte ITEM_SODA_POP\n\t.2byte ITEM_FRESH_WATER\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nTwoIsland_EventScript_ShopExpanded2::\n\tpokemart TwoIsland_Items_ShopExpanded2\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nTwoIsland_Items_ShopExpanded2::\n\t.2byte ITEM_ULTRA_BALL\n\t.2byte ITEM_GREAT_BALL\n\t.2byte ITEM_LEMONADE\n\t.2byte ITEM_SODA_POP\n\t.2byte ITEM_FRESH_WATER\n\t.2byte ITEM_MOOMOO_MILK\n\t.2byte ITEM_MOON_STONE\n\t.2byte ITEM_SUN_STONE\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nTwoIsland_EventScript_ShopExpanded3::\n\tpokemart TwoIsland_Items_ShopExpanded3\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nTwoIsland_Items_ShopExpanded3::\n\t.2byte ITEM_ULTRA_BALL\n\t.2byte ITEM_REPEAT_BALL\n\t.2byte ITEM_TIMER_BALL\n\t.2byte ITEM_LEMONADE\n\t.2byte ITEM_SODA_POP\n\t.2byte ITEM_FRESH_WATER\n\t.2byte ITEM_MOOMOO_MILK\n\t.2byte ITEM_LAVA_COOKIE\n\t.2byte ITEM_MOON_STONE\n\t.2byte ITEM_SUN_STONE\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nTwoIsland_EventScript_Sailor::\n\tmsgbox TwoIsland_Text_FellowMovedFromCeladonCity, MSGBOX_NPC\n\tend\n\nTwoIsland_EventScript_Woman::\n\tmsgbox TwoIsland_Text_ShopkeepersBrotherWorksGameCorner, MSGBOX_NPC\n\tend\n\nTwoIsland_EventScript_Beauty::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_BRUNO, 4\n\tmsgbox TwoIsland_Text_BrunoCameToIslandWhileBack\n\trelease\n\tend\n\nTwoIsland_EventScript_SuperNerd::\n\tmsgbox TwoIsland_Text_BuyRareItemsHere, MSGBOX_NPC\n\tend\n\nTwoIsland_EventScript_Boy::\n\tmsgbox TwoIsland_Text_OldWomanLivesOutOnCape, MSGBOX_NPC\n\tend\n\nTwoIsland_EventScript_LittleBoy::\n\tmsgbox TwoIsland_Text_HaveYouTriedJumpingGame, MSGBOX_NPC\n\tend\n\nTwoIsland_EventScript_IslandSign::\n\tmsgbox TwoIsland_Text_IslandSign, MSGBOX_SIGN\n\tend\n\nTwoIsland_EventScript_JoyfulGameCornerSign::\n\tmsgbox TwoIsland_Text_JoyfulGameCornerSign, MSGBOX_SIGN\n\tend\n\nTwoIsland_EventScript_FastCurrentSign::\n\tmsgbox TwoIsland_Text_DangerFastCurrent, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/TwoIsland/text.inc",
    "content": "TwoIsland_Text_IslandSign::\n    .string \"TWO ISLAND\\n\"\n    .string \"Boon Island for Two$\"\n\nTwoIsland_Text_JoyfulGameCornerSign::\n    .string \"Skip & Chomp!\\n\"\n    .string \"Joyful GAME CORNER$\"\n\nTwoIsland_Text_DangerFastCurrent::\n    .string \"DANGER! FAST CURRENT!\\n\"\n    .string \"Fishing and surfing prohibited!$\"\n\nTwoIsland_Text_WelcomeToShopMerchandiseLimited::\n    .string \"Oh!\\n\"\n    .string \"Hello, welcome to my shop!\\p\"\n    .string \"We've only opened up recently.\\p\"\n    .string \"Our merchandise is limited, but I\\n\"\n    .string \"hope we can serve your needs.$\"\n\nTwoIsland_Text_AddedMerchandiseForLostelle::\n    .string \"I can't tell you how grateful I am\\n\"\n    .string \"for your rescue of LOSTELLE.\\p\"\n    .string \"Thanks to your feat, the people of\\n\"\n    .string \"THREE ISLAND have changed their\\l\"\n    .string \"attitudes about KANTO people.\\p\"\n    .string \"And, I'm from KANTO, you see.\\p\"\n    .string \"The people of THREE ISLAND\\n\"\n    .string \"helped me add to my merchandise.$\"\n\nTwoIsland_Text_HopeYouGiveItYourBest::\n    .string \"Hi! I'm giving it my best here.\\n\"\n    .string \"I hope you do too, {PLAYER}.$\"\n\nTwoIsland_Text_BringingItemsFromDistantLands::\n    .string \"Oh, hello, {PLAYER}!\\n\"\n    .string \"Welcome!\\p\"\n    .string \"I've started bringing in items from\\n\"\n    .string \"distant lands.\\p\"\n    .string \"I've got some rare items in, too.\\n\"\n    .string \"Please have a look!$\"\n\nTwoIsland_Text_FellowMovedFromCeladonCity::\n    .string \"That fellow there, he moved here\\n\"\n    .string \"from CELADON CITY.\\p\"\n    .string \"He started up a shop with his\\n\"\n    .string \"younger brother.\\p\"\n    .string \"You have to wonder if he knew what\\n\"\n    .string \"he was getting into.$\"\n\nTwoIsland_Text_ShopkeepersBrotherWorksGameCorner::\n    .string \"The shopkeeper's brother took\\n\"\n    .string \"a job at the GAME CORNER.\\p\"\n    .string \"He's trying to pull together money\\n\"\n    .string \"so they can buy more merchandise.$\"\n\nTwoIsland_Text_BrunoCameToIslandWhileBack::\n    .string \"Listen, listen.\\n\"\n    .string \"Did you know?\\p\"\n    .string \"A famous TRAINER came to the\\n\"\n    .string \"ISLAND a little while back.\\p\"\n    .string \"He's one of the ELITE FOUR.\\n\"\n    .string \"His name is BRUNO.\\p\"\n    .string \"He went away disappointed when he\\n\"\n    .string \"found out that they were all sold\\l\"\n    .string \"out of Rage Candybars.$\"\n\nTwoIsland_Text_BuyRareItemsHere::\n    .string \"The discerning TRAINER knows to\\n\"\n    .string \"buy rare items here!$\"\n\nTwoIsland_Text_OldWomanLivesOutOnCape::\n    .string \"There's an old woman who lives in\\n\"\n    .string \"a cottage out on the cape.\\p\"\n    .string \"She gives the eye to POKéMON.\\n\"\n    .string \"It's a bit unnerving.$\"\n\nTwoIsland_Text_HaveYouTriedJumpingGame::\n    .string \"Boing! Boing!\\n\"\n    .string \"Have you tried the jumping game?\\p\"\n    .string \"The POKéMON you can enter…\\n\"\n    .string \"Boing!\\p\"\n    .string \"Some go boing!\\p\"\n    .string \"And some go boooooooing!\\p\"\n    .string \"Did you know that?\\n\"\n    .string \"Boing!$\"\n\n"
  },
  {
    "path": "data/maps/TwoIsland_CapeBrink/map.json",
    "content": "{\n  \"id\": \"MAP_TWO_ISLAND_CAPE_BRINK\",\n  \"name\": \"TwoIsland_CapeBrink\",\n  \"layout\": \"LAYOUT_TWO_ISLAND_CAPE_BRINK\",\n  \"music\": \"MUS_ROUTE119\",\n  \"region_map_section\": \"MAPSEC_CAPE_BRINK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"down\",\n      \"offset\": 3,\n      \"map\": \"MAP_TWO_ISLAND\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKEMON_RANGER_F\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"CapeBrink_EventScript_Helena\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 15,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"CapeBrink_EventScript_Atticus\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CapeBrink_EventScript_Deforest\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIRD_KEEPER\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"CapeBrink_EventScript_Spedo\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 17,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"CapeBrink_EventScript_Caspara\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_SWIMMER_F_LAND\",\n      \"in_connection\": false,\n      \"x\": 23,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CapeBrink_EventScript_Sedef\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_TUBER_M_LAND\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 25,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CapeBrink_EventScript_Tuber\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 39,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TWO_ISLAND_CAPE_BRINK_HOUSE\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 43,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PP_MAX\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_TWO_ISLAND_CAPE_BRINK_PP_MAX\",\n      \"quantity\": 1,\n      \"underfoot\": true\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 42,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"item\": \"ITEM_RARE_CANDY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_TWO_ISLAND_CAPE_BRINK_RARE_CANDY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 43,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"item\": \"ITEM_GREPA_BERRY\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CAPE_BRINK_GREPA_BERRY\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 11,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"item\": \"ITEM_BIG_PEARL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_CAPE_BRINK_BIG_PEARL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/TwoIsland_CapeBrink/scripts.inc",
    "content": "TwoIsland_CapeBrink_MapScripts::\n\t.byte 0\n\nCapeBrink_EventScript_Helena::\n\ttrainerbattle_single TRAINER_PKMN_RANGER_HELENA, CapeBrink_Text_HelenaIntro, CapeBrink_Text_HelenaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq CapeBrink_EventScript_HelenaRematch\n\tmsgbox CapeBrink_Text_HelenaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCapeBrink_EventScript_HelenaRematch::\n\ttrainerbattle_rematch TRAINER_PKMN_RANGER_HELENA, CapeBrink_Text_HelenaRematchIntro, CapeBrink_Text_HelenaDefeat\n\tmsgbox CapeBrink_Text_HelenaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCapeBrink_Text_HelenaIntro:\n\t.string \"I'm combing the beach for litter,\\n\"\n\t.string \"but I guess I can do a quick battle.$\"\n\nCapeBrink_Text_HelenaDefeat:\n\t.string \"I'm all washed up!$\"\n\nCapeBrink_Text_HelenaPostBattle:\n\t.string \"It's important to keep the oceans\\n\"\n\t.string \"clear of our trash.\\p\"\n\t.string \"Try to get things that are reusable\\n\"\n\t.string \"or refillable so you're throwing\\l\"\n\t.string \"less stuff away.$\"\n\nCapeBrink_Text_HelenaRematchIntro:\n\t.string \"I'm combing the beach for litter,\\n\"\n\t.string \"but found a TRAINER instead!$\"\n\nCapeBrink_EventScript_Atticus::\n\ttrainerbattle_single TRAINER_COOLTRAINER_ATTICUS, CapeBrink_Text_AtticusIntro, CapeBrink_Text_AtticusDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq CapeBrink_EventScript_AtticusRematch\n\tmsgbox CapeBrink_Text_AtticusPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCapeBrink_EventScript_AtticusRematch::\n\ttrainerbattle_rematch TRAINER_COOLTRAINER_ATTICUS, CapeBrink_Text_AtticusRematchIntro, CapeBrink_Text_AtticusDefeat\n\tmsgbox CapeBrink_Text_AtticusPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCapeBrink_Text_AtticusIntro:\n\t.string \"TWO ISLAND has absolutely nothing\\n\"\n\t.string \"going on…\\l\"\n\t.string \"Hey, cure my boredom with a battle!$\"\n\nCapeBrink_Text_AtticusDefeat:\n\t.string \"…And now I'm bored again…$\"\n\nCapeBrink_Text_AtticusPostBattle:\n\t.string \"TRAINERS come here to battle\\n\"\n\t.string \"each other.\\p\"\n\t.string \"This island is so sleepy that\\n\"\n\t.string \"there's not much else to do here.$\"\n\nCapeBrink_Text_AtticusRematchIntro:\n\t.string \"…Yawn…\\n\"\n\t.string \"…So bored…\\p\"\n\t.string \"Oh, a battle?\\n\"\n\t.string \"You bet! Bring it on!$\"\n\nCapeBrink_EventScript_Deforest::\n\ttrainerbattle_single TRAINER_FISHERMAN_DEFOREST, CapeBrink_Text_DeforestIntro, CapeBrink_Text_DeforestDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq CapeBrink_EventScript_DeforestRematch\n\tmsgbox CapeBrink_Text_DeforestPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCapeBrink_EventScript_DeforestRematch::\n\ttrainerbattle_rematch TRAINER_FISHERMAN_DEFOREST, CapeBrink_Text_DeforestRematchIntro, CapeBrink_Text_DeforestRematchDefeat\n\tmsgbox CapeBrink_Text_DeforestPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCapeBrink_Text_DeforestIntro:\n\t.string \"Ach! Nothing's biting!\\p\"\n\t.string \"I'll take my frustration out\\n\"\n\t.string \"on your POKéMON!$\"\n\nCapeBrink_Text_DeforestDefeat:\n\t.string \"Like a fish out of water!$\"\n\nCapeBrink_Text_DeforestPostBattle:\n\t.string \"These fast-moving currents make it\\n\"\n\t.string \"impossible to catch fish, but I\\l\"\n\t.string \"still keep trying.$\"\n\nCapeBrink_Text_DeforestRematchIntro:\n\t.string \"You want another battle? Sure,\\n\"\n\t.string \"it's not like I've hooked anything.$\"\n\nCapeBrink_Text_DeforestRematchDefeat:\n\t.string \"Why won't my POLIWHIRL evolve\\n\"\n\t.string \"into POLITOED?$\"\n\nCapeBrink_EventScript_Spedo::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_SPEDO, CapeBrink_Text_SpedoIntro, CapeBrink_Text_SpedoDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq CapeBrink_EventScript_SpedoRematch\n\tmsgbox CapeBrink_Text_SpedoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCapeBrink_EventScript_SpedoRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_SPEDO, CapeBrink_Text_SpedoRematchIntro, CapeBrink_Text_SpedoDefeat\n\tmsgbox CapeBrink_Text_SpedoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCapeBrink_Text_SpedoIntro:\n\t.string \"We may not be able to swim or\\n\"\n\t.string \"SURF, but my POKéMON sure can FLY!$\"\n\nCapeBrink_Text_SpedoDefeat:\n\t.string \"Crash landing!$\"\n\nCapeBrink_Text_SpedoPostBattle:\n\t.string \"Even if it's too dangerous to get\\n\"\n\t.string \"in the water, I still have fun\\l\"\n\t.string \"hanging out on the beach.$\"\n\nCapeBrink_Text_SpedoRematchIntro:\n\t.string \"Can't swim and can't SURF,\\n\"\n\t.string \"so let's have fun by battling!$\"\n\nCapeBrink_EventScript_Caspara::\n\ttrainerbattle_single TRAINER_COOLTRAINER_CASPARA, CapeBrink_Text_CasparaIntro, CapeBrink_Text_CasparaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq CapeBrink_EventScript_CasparaRematch\n\tmsgbox CapeBrink_Text_CasparaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCapeBrink_EventScript_CasparaRematch::\n\ttrainerbattle_rematch TRAINER_COOLTRAINER_CASPARA, CapeBrink_Text_CasparaRematchIntro, CapeBrink_Text_CasparaDefeat\n\tmsgbox CapeBrink_Text_CasparaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCapeBrink_Text_CasparaIntro:\n\t.string \"Hey! You're in my sun!\\n\"\n\t.string \"Get out of here, kid!$\"\n\nCapeBrink_Text_CasparaDefeat:\n\t.string \"Great, now go somewhere else.$\"\n\nCapeBrink_Text_CasparaPostBattle:\n\t.string \"The sun is really bad for you,\\n\"\n\t.string \"especially without sunscreen.\\p\"\n\t.string \"Sometimes I wonder if tanning\\n\"\n\t.string \"like this is really worth it.$\"\n\nCapeBrink_Text_CasparaRematchIntro:\n\t.string \"You don't have to keep bothering me,\\n\"\n\t.string \"that chair over there is free.\\p\"\n\t.string \"Another battle?\\n\"\n\t.string \"…If it makes you go away, then fine.$\"\n\nCapeBrink_EventScript_Sedef::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_SEDEF, CapeBrink_Text_SedefIntro, CapeBrink_Text_SedefDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tcompare VAR_RESULT, TRUE\n\tgoto_if_eq CapeBrink_EventScript_SedefRematch\n\tmsgbox CapeBrink_Text_SedefPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCapeBrink_EventScript_SedefRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_SEDEF, CapeBrink_Text_SedefRematchIntro, CapeBrink_Text_SedefDefeat\n\tmsgbox CapeBrink_Text_SedefPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nCapeBrink_Text_SedefIntro:\n\t.string \"I'm the best SWIMMER in the world!\\n\"\n\t.string \"Watch me sink your POKéMON!$\"\n\nCapeBrink_Text_SedefDefeat:\n\t.string \"Caught in a riptide!$\"\n\nCapeBrink_Text_SedefPostBattle:\n\t.string \"I could easily swim in these\\n\"\n\t.string \"currents, I just prefer lying here.$\"\n\nCapeBrink_Text_SedefRematchIntro:\n\t.string \"I'm the best relaxer in the world!\\n\"\n\t.string \"I'll beat you while snoozing!$\"\n\nCapeBrink_EventScript_Tuber::\n\tmsgbox CapeBrink_Text_Tuber, MSGBOX_NPC\n\tend\n\nCapeBrink_Text_Tuber:\n\t.string \"This beach is famous for attracting\\n\"\n\t.string \"strong TRAINERS from all over.\\p\"\n\t.string \"I like watching their battles\\n\"\n\t.string \"from up here.$\""
  },
  {
    "path": "data/maps/TwoIsland_CapeBrink_House/map.json",
    "content": "{\n  \"id\": \"MAP_TWO_ISLAND_CAPE_BRINK_HOUSE\",\n  \"name\": \"TwoIsland_CapeBrink_House\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_FORTREE\",\n  \"region_map_section\": \"MAPSEC_CAPE_BRINK\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CHANNELER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_CapeBrink_House_EventScript_StarterTutor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TWO_ISLAND_CAPE_BRINK\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TwoIsland_CapeBrink_House/scripts.inc",
    "content": "TwoIsland_CapeBrink_House_MapScripts::\n\t.byte 0\n\n@ See move_tutors.inc\n"
  },
  {
    "path": "data/maps/TwoIsland_CapeBrink_House/text.inc",
    "content": "Text_UltimateMoveThatMon::\n    .string \"I perfected the ultimate move of\\n\"\n    .string \"its type…\\p\"\n    .string \"But will no one take it for\\n\"\n    .string \"future use?\\p\"\n    .string \"…Hm? Hmmm!\\p\"\n    .string \"Y-you…\\n\"\n    .string \"Th-that {STR_VAR_1}…$\"\n\nText_JustMistaken::\n    .string \"…No…\\n\"\n    .string \"I was just mistaken.$\"\n\nText_AllowMeToTeachMonUltimateMove::\n    .string \"Oh! This is the one!\\n\"\n    .string \"This is the POKéMON!\\p\"\n    .string \"This {STR_VAR_1} is worthy of\\n\"\n    .string \"learning my ultimate move!\\p\"\n    .string \"Will you allow it?\\p\"\n    .string \"Will you allow your {STR_VAR_1} to\\n\"\n    .string \"learn my {STR_VAR_2}?$\"\n\nText_YouRejectIt::\n    .string \"Gaah! You reject it?\\n\"\n    .string \"No, I won't be dissuaded!$\"\n\nText_LetMeConferUltimateMove::\n    .string \"You will allow it?\\p\"\n    .string \"Then, let me confer my ultimate\\n\"\n    .string \"{STR_VAR_2} on your {STR_VAR_1}.\\p\"\n    .string \"Ggggrah-awooo!$\"\n\nText_TaughtMove::\n    .string \"Gasp, gasp, gasp…\\p\"\n    .string \"I didn't think I could teach that\\n\"\n    .string \"move while I still lived…$\"\n\nText_MakeBestUseOfMove::\n    .string \"I implore you to make the best\\n\"\n    .string \"use of that move and gain power!$\"\n\nText_PassedOnEverythingIKnow::\n    .string \"Gasp, gasp, gasp…\\p\"\n    .string \"I have no regrets now.\\n\"\n    .string \"I've passed on everything I know.\\p\"\n    .string \"Now I can live out my life knowing\\n\"\n    .string \"my work is done.$\"\n\nText_FeelRejuvenated::\n    .string \"After I passed on my knowledge to\\n\"\n    .string \"you, I felt so much relief.\\p\"\n    .string \"In fact, I feel rejuvenated,\\n\"\n    .string \"as if I were younger again!\\p\"\n    .string \"I feel young enough to keep\\n\"\n    .string \"teaching my ultimate moves.$\"\n\nText_NotTheRightPokemon::\n    .string \"But, that {STR_VAR_1}…\\p\"\n    .string \"No, it cannot learn one\\n\"\n    .string \"of my moves.$\"\n\nText_RightPokemon::\n    .string \"But, that {STR_VAR_1}…\\n\"\n    .string \"Oh! Yes! This is the one!\\p\"\n    .string \"This {STR_VAR_1} is worthy of\\n\"\n    .string \"learning an ultimate move!\\p\"\n    .string \"Will you allow it?\\p\"\n    .string \"Will you allow your {STR_VAR_1} to\\n\"\n    .string \"learn my {STR_VAR_2}?$\"\n\n"
  },
  {
    "path": "data/maps/TwoIsland_Harbor/map.json",
    "content": "{\n  \"id\": \"MAP_TWO_ISLAND_HARBOR\",\n  \"name\": \"TwoIsland_Harbor\",\n  \"layout\": \"LAYOUT_ISLAND_HARBOR\",\n  \"music\": \"MUS_FORTREE\",\n  \"region_map_section\": \"MAPSEC_TWO_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEAGALLOP\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 9,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_Harbor_EventScript_Sailor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TWO_ISLAND\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TwoIsland_Harbor/scripts.inc",
    "content": "TwoIsland_Harbor_MapScripts::\n\t.byte 0\n\nTwoIsland_Harbor_EventScript_Sailor::\n\tlock\n\tfaceplayer\n\tmessage Text_WhereDoYouWantToSail\n\twaitmessage\n\tsetvar VAR_0x8004, SEAGALLOP_TWO_ISLAND\n\tgoto EventScript_ChooseDestFromTwoIsland\n\tend\n"
  },
  {
    "path": "data/maps/TwoIsland_House/map.json",
    "content": "{\n  \"id\": \"MAP_TWO_ISLAND_HOUSE\",\n  \"name\": \"TwoIsland_House\",\n  \"layout\": \"LAYOUT_HOUSE3\",\n  \"music\": \"MUS_FORTREE\",\n  \"region_map_section\": \"MAPSEC_TWO_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_House_EventScript_MoveManiac\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_House_EventScript_EffortWoman\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TWO_ISLAND\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TwoIsland_House/scripts.inc",
    "content": ".equ CHECKED_MUSHROOMS,  FLAG_TEMP_1\n.equ HAS_BIG_MUSHROOM,   FLAG_TEMP_2\n.equ HAS_TINY_MUSHROOMS, FLAG_TEMP_3\n.equ HAS_BOTH_MUSHROOMS, FLAG_TEMP_4\n\nTwoIsland_House_MapScripts::\n\t.byte 0\n\nTwoIsland_House_EventScript_MoveManiac::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tclearflag HAS_BIG_MUSHROOM\n\tclearflag HAS_TINY_MUSHROOMS\n\tclearflag HAS_BOTH_MUSHROOMS\n\tgoto_if_set CHECKED_MUSHROOMS, TwoIsland_House_EventScript_CheckPlayerHasMushrooms\n\tmsgbox TwoIsland_House_Text_TeachMonMoveForMushroom\n\tsetflag CHECKED_MUSHROOMS\n\tgoto TwoIsland_House_EventScript_CheckPlayerHasMushrooms\n\tend\n\nTwoIsland_House_EventScript_CheckPlayerHasMushrooms::\n\tcheckitem ITEM_BIG_MUSHROOM\n\tcall_if_eq VAR_RESULT, TRUE, TwoIsland_House_EventScript_SetHasBigMushroom\n\tcheckitem ITEM_TINY_MUSHROOM, 2\n\tcall_if_eq VAR_RESULT, TRUE, TwoIsland_House_EventScript_SetHasTinyMushrooms\n\tgoto_if_set HAS_BIG_MUSHROOM, TwoIsland_House_EventScript_CheckAlsoHasTinyMushrooms\n\tgoto_if_set HAS_TINY_MUSHROOMS, TwoIsland_House_EventScript_CheckAlsoHasBigMushroom\n\tgoto TwoIsland_House_EventScript_EndTutorMove\n\tend\n\nTwoIsland_House_EventScript_CheckAlsoHasTinyMushrooms::\n\tcall_if_set HAS_TINY_MUSHROOMS, TwoIsland_House_EventScript_SetHasBothMushrooms\n\tgoto TwoIsland_House_EventScript_AskTutorMon\n\tend\n\nTwoIsland_House_EventScript_CheckAlsoHasBigMushroom::\n\tcall_if_set HAS_BIG_MUSHROOM, TwoIsland_House_EventScript_SetHasBothMushrooms\n\tgoto TwoIsland_House_EventScript_AskTutorMon\n\tend\n\nTwoIsland_House_EventScript_AskTutorMon::\n\tmsgbox TwoIsland_House_Text_WantMeToTeachMove, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, TwoIsland_House_EventScript_EndTutorMove\n\tgoto TwoIsland_House_EventScript_ChooseMonToTutor\n\tend\n\nTwoIsland_House_EventScript_ChooseMonToTutor::\n\tsetvar VAR_TEMP_0, 1\n\tmsgbox TwoIsland_House_Text_TutorWhichMon\n\tspecial SelectMoveTutorMon\n\twaitstate\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, TwoIsland_House_EventScript_EndTutorMove\n\tspecial IsSelectedMonEgg\n\tgoto_if_eq VAR_RESULT, TRUE, TwoIsland_House_EventScript_CantTutorEgg\n\tgoto_if_eq VAR_0x8005, 0, TwoIsland_House_EventScript_NoMoveToTutorMon\n\tgoto TwoIsland_House_EventScript_ChooseMoveToTeach\n\tend\n\nTwoIsland_House_EventScript_ChooseMoveToTeach::\n\tmsgbox TwoIsland_House_Text_TeachWhichMove\n\tspecial DisplayMoveTutorMenu\n\twaitstate\n\tgoto_if_eq VAR_0x8004, 0, TwoIsland_House_EventScript_ChooseMonToTutor\n\tgoto_if_set HAS_BOTH_MUSHROOMS, TwoIsland_House_EventScript_ChooseMushroom\n\tgoto_if_set HAS_BIG_MUSHROOM, TwoIsland_House_EventScript_GiveBigMushroom\n\tgoto_if_set HAS_TINY_MUSHROOMS, TwoIsland_House_EventScript_GiveTinyMushrooms\n\tend\n\nTwoIsland_House_EventScript_GiveBigMushroom::\n\tremoveitem ITEM_BIG_MUSHROOM\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox TwoIsland_House_Text_HandedOverOneBigMushroom\n\tcall EventScript_RestorePrevTextColor\n\tgoto TwoIsland_House_EventScript_EndTutorMove\n\tend\n\nTwoIsland_House_EventScript_GiveTinyMushrooms::\n\tremoveitem ITEM_TINY_MUSHROOM, 2\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox TwoIsland_House_Text_HandedOverTwoTinyMushrooms\n\tcall EventScript_RestorePrevTextColor\n\tgoto TwoIsland_House_EventScript_EndTutorMove\n\tend\n\nTwoIsland_House_EventScript_ChooseMushroom::\n\tmessage TwoIsland_House_Text_IllNeedMushroomOrTwo\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_MUSHROOMS, TRUE\n\tswitch VAR_RESULT\n\tcase 0, TwoIsland_House_EventScript_GiveTinyMushrooms\n\tcase 1, TwoIsland_House_EventScript_GiveBigMushroom\n\tend\n\nTwoIsland_House_EventScript_NoMoveToTutorMon::\n\tmsgbox TwoIsland_House_Text_NoMoveICanTeachThatMon\n\tgoto TwoIsland_House_EventScript_ChooseMonToTutor\n\tend\n\nTwoIsland_House_EventScript_CantTutorEgg::\n\tmsgbox TwoIsland_House_Text_CantTeachAnEgg\n\tgoto TwoIsland_House_EventScript_ChooseMonToTutor\n\tend\n\nTwoIsland_House_EventScript_EndTutorMove::\n\tsetvar VAR_TEMP_0, 0\n\tmsgbox TwoIsland_House_Text_NeedMushroomOrTwoToLearnMove\n\trelease\n\tend\n\nTwoIsland_House_EventScript_SetHasBigMushroom::\n\tsetflag HAS_BIG_MUSHROOM\n\treturn\n\nTwoIsland_House_EventScript_SetHasTinyMushrooms::\n\tsetflag HAS_TINY_MUSHROOMS\n\treturn\n\nTwoIsland_House_EventScript_SetHasBothMushrooms::\n\tsetflag HAS_BOTH_MUSHROOMS\n\treturn\n\nTwoIsland_House_EventScript_EffortWoman::\n\tlock\n\tfaceplayer\n\tbufferleadmonspeciesname 0\n\tmsgbox TwoIsland_House_Text_OhYourPokemon, MSGBOX_DEFAULT\n\tspecialvar VAR_RESULT, LeadMonHasEffortRibbon\n\tcompare VAR_RESULT, TRUE\n\tcall_if_eq TwoIsland_House_EventScript_MonHasEffortRibbon\n\tspecialvar VAR_RESULT, AreLeadMonEVsMaxedOut\n\tcompare VAR_RESULT, FALSE\n\tcall_if_eq TwoIsland_House_EventScript_MonEVsNotMaxed\n\tmsgbox TwoIsland_House_Text_PleaseGiveItThisEffortRibbon, MSGBOX_DEFAULT\n\tplayfanfare MUS_OBTAIN_ITEM\n\tmessage TwoIsland_House_Text_ReceivedEffortRibbon\n\twaitfanfare\n\tmsgbox TwoIsland_House_Text_PutEffortRibbonOnMon, MSGBOX_DEFAULT\n\tspecial GiveLeadMonEffortRibbon\n\trelease\n\tend\n\nTwoIsland_House_EventScript_MonEVsNotMaxed::\n\tmsgbox TwoIsland_House_Text_GoForItLittleHarder, MSGBOX_DEFAULT\n\trelease\n\tend\n\nTwoIsland_House_EventScript_MonHasEffortRibbon::\n\tmsgbox TwoIsland_House_Text_EffortRibbonLooksGoodOnIt, MSGBOX_DEFAULT\n\trelease\n\tend\n\nTwoIsland_House_Text_OhYourPokemon:\n\t.string \"Oh?\\n\"\n\t.string \"Your {STR_VAR_1}…$\"\n\nTwoIsland_House_Text_PleaseGiveItThisEffortRibbon:\n\t.string \"Went for it stupendously!\\p\"\n\t.string \"As its reward, please give it this\\n\"\n\t.string \"EFFORT RIBBON.$\"\n\nTwoIsland_House_Text_ReceivedEffortRibbon:\n\t.string \"{COLOR DARK_GRAY}{PLAYER} received the EFFORT RIBBON.$\"\n\nTwoIsland_House_Text_PutEffortRibbonOnMon:\n\t.string \"{COLOR DARK_GRAY}{PLAYER} put the EFFORT RIBBON\\n\"\n\t.string \"on {STR_VAR_1}.$\"\n\nTwoIsland_House_Text_GoForItLittleHarder:\n\t.string \"You have to go for it a\\n\"\n\t.string \"little harder.\\p\"\n\t.string \"If you do, I'll give your POKéMON\\n\"\n\t.string \"something nice.$\"\n\nTwoIsland_House_Text_EffortRibbonLooksGoodOnIt:\n\t.string \"Oh! Your {STR_VAR_1}, that EFFORT\\n\"\n\t.string \"RIBBON looks good on it!$\"\n"
  },
  {
    "path": "data/maps/TwoIsland_House/text.inc",
    "content": "TwoIsland_House_Text_TeachMonMoveForMushroom::\n    .string \"I'm the POKéMON MOVE MANIAC.\\p\"\n    .string \"I know every single move that\\n\"\n    .string \"POKéMON learn growing up.\\p\"\n    .string \"I'm also a mushroom maniac.\\p\"\n    .string \"Bring me two TINYMUSHROOMS,\\n\"\n    .string \"or one BIG MUSHROOM.\\p\"\n    .string \"If you do that for me, I'll teach\\n\"\n    .string \"a move to one POKéMON.$\"\n\nTwoIsland_House_Text_WantMeToTeachMove::\n    .string \"Sniff, sniff…\\n\"\n    .string \"Hm! You smell of MUSHROOMS!\\p\"\n    .string \"Do you want me to teach a move\\n\"\n    .string \"to a POKéMON of yours?$\"\n\nTwoIsland_House_Text_TutorWhichMon::\n    .string \"Which POKéMON needs tutoring?$\"\n\nTwoIsland_House_Text_TeachWhichMove::\n    .string \"Which move should I teach?$\"\n\nTwoIsland_House_Text_NoMoveICanTeachThatMon::\n    .string \"Sorry…\\p\"\n    .string \"It doesn't appear as if I have a\\n\"\n    .string \"move I can teach that POKéMON.$\"\n\nTwoIsland_House_Text_IllNeedMushroomOrTwo::\n    .string \"Then, I'll need a MUSHROOM or two.\\n\"\n    .string \"What are you going to give me?$\"\n\nTwoIsland_House_Text_HandedOverTwoTinyMushrooms::\n    .string \"{PLAYER} handed over two\\n\"\n    .string \"TINYMUSHROOMS in exchange.$\"\n\nTwoIsland_House_Text_HandedOverOneBigMushroom::\n    .string \"{PLAYER} handed over one\\n\"\n    .string \"BIG MUSHROOM in exchange.$\"\n\nTwoIsland_House_Text_NeedMushroomOrTwoToLearnMove::\n    .string \"If your POKéMON need to learn a\\n\"\n    .string \"move, I need a MUSHROOM or two.$\"\n\nTwoIsland_House_Text_CantTeachAnEgg::\n    .string \"Hunh? There isn't a single move\\n\"\n    .string \"that I can teach an EGG.$\"\n\n"
  },
  {
    "path": "data/maps/TwoIsland_JoyfulGameCorner/map.json",
    "content": "{\n  \"id\": \"MAP_TWO_ISLAND_JOYFUL_GAME_CORNER\",\n  \"name\": \"TwoIsland_JoyfulGameCorner\",\n  \"layout\": \"LAYOUT_TWO_ISLAND_JOYFUL_GAME_CORNER\",\n  \"music\": \"MUS_RS_GAME_CORNER\",\n  \"region_map_section\": \"MAPSEC_TWO_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 5,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_JoyfulGameCorner_EventScript_LostellesDaddy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BIKER\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"FLAG_HIDE_TWO_ISLAND_GAME_CORNER_BIKER\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TWIN\",\n      \"x\": 6,\n      \"y\": 5,\n      \"elevation\": 1,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_JoyfulGameCorner_EventScript_Lostelle\",\n      \"flag\": \"FLAG_HIDE_TWO_ISLAND_GAME_CORNER_LOSTELLE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_JoyfulGameCorner_EventScript_InfoMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TWO_ISLAND\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"TwoIsland_JoyfulGameCorner_EventScript_ShowPokemonJumpRecords\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 0,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"TwoIsland_JoyfulGameCorner_EventScript_ShowDodrioBerryPickingRecords\"\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/TwoIsland_JoyfulGameCorner/scripts.inc",
    "content": ".equ LOCALID_DADDY,    1\n.equ LOCALID_BIKER,    2\n.equ LOCALID_LOSTELLE, 3\n\nTwoIsland_JoyfulGameCorner_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, TwoIsland_JoyfulGameCorner_OnTransition\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, TwoIsland_JoyfulGameCorner_OnWarp\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, TwoIsland_JoyfulGameCorner_OnFrame\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\t.byte 0\n\nTwoIsland_JoyfulGameCorner_OnTransition::\n\tcall_if_set FLAG_GOT_MOON_STONE_FROM_JOYFUL_GAME_CORNER, TwoIsland_JoyfulGameCorner_EventScript_SetLostelleReturnedPos\n\tend\n\nTwoIsland_JoyfulGameCorner_EventScript_SetLostelleReturnedPos::\n\tsetobjectxyperm LOCALID_DADDY, 6, 2\n\tsetobjectmovementtype LOCALID_DADDY, MOVEMENT_TYPE_FACE_DOWN\n\tsetobjectmovementtype LOCALID_LOSTELLE, MOVEMENT_TYPE_LOOK_AROUND\n\tsetvar VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 4\n\treturn\n\nTwoIsland_JoyfulGameCorner_OnWarp::\n\tmap_script_2 VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 2, TwoIsland_JoyfulGameCorner_EventScript_TurnPlayerNorth\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_MINIGAME, EventScript_CheckTurnAttendant\n\t.2byte 0\n\nTwoIsland_JoyfulGameCorner_EventScript_TurnPlayerNorth::\n\tturnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH\n\tend\n\nTwoIsland_JoyfulGameCorner_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 0, TwoIsland_JoyfulGameCorner_EventScript_HelpFindLostelleScene\n\tmap_script_2 VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 2, TwoIsland_JoyfulGameCorner_EventScript_FoundLostelleScene\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_MINIGAME, CableClub_EventScript_ExitMinigameRoom\n\t.2byte 0\n\nTwoIsland_JoyfulGameCorner_EventScript_FoundLostelleScene::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_YouRescuedLostelle\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tspecial BufferBigGuyOrBigGirlString\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_LostelleItsOkayDaddy\n\tclosemessage\n\tapplymovement LOCALID_LOSTELLE, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tsetvar VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 3\n\treleaseall\n\tend\n\nTwoIsland_JoyfulGameCorner_EventScript_HelpFindLostelleScene::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement LOCALID_DADDY, TwoIsland_JoyfulGameCorner_Movement_DaddyPacing\n\twaitmovement 0\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_WhereHasLostelleGottenTo\n\tclosemessage\n\tapplymovement LOCALID_DADDY, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tplayse SE_PIN\n\tapplymovement LOCALID_DADDY, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_DADDY, Common_Movement_Delay48\n\twaitmovement 0\n\tapplymovement LOCALID_DADDY, TwoIsland_JoyfulGameCorner_Movement_DaddyApproachPlayer\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_PleaseHelpFindLostelle\n\tclosemessage\n\tplayse SE_RS_DOOR\n\twaitse\n\tapplymovement OBJ_EVENT_ID_PLAYER, TwoIsland_JoyfulGameCorner_Movement_PlayerFaceDaddy\n\twaitmovement 0\n\tplaybgm MUS_ENCOUNTER_BOY, 0\n\taddobject LOCALID_BIKER\n\tapplymovement LOCALID_BIKER, TwoIsland_JoyfulGameCorner_Movement_BikerLookAround\n\twaitmovement 0\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_IsThisOnlyThreeIsland\n\tapplymovement LOCALID_BIKER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_ThisIsTwoIslandMoveIt\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_TheseIslandsAreConfusing\n\tclosemessage\n\tapplymovement LOCALID_BIKER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tplayse SE_EXIT\n\tremoveobject LOCALID_BIKER\n\tfadedefaultbgm\n\tdelay 60\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_PunkScuffedUpMyFloor\n\tclearflag FLAG_HIDE_THREE_ISLAND_LONE_BIKER\n\tsetvar VAR_MAP_SCENE_THREE_ISLAND, 2\n\tsetvar VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 1\n\treleaseall\n\tend\n\nTwoIsland_JoyfulGameCorner_Movement_DaddyPacing::\n\twalk_left\n\twalk_right\n\twalk_right\n\tdelay_8\n\twalk_in_place_faster_up\n\tdelay_16\n\tstep_end\n\nTwoIsland_JoyfulGameCorner_Movement_DaddyApproachPlayer::\n\twalk_down\n\twalk_down\n\twalk_down\n\twalk_in_place_faster_left\n\tstep_end\n\nTwoIsland_JoyfulGameCorner_Movement_PlayerFaceDaddy::\n\twalk_left\n\twalk_in_place_faster_right\n\tstep_end\n\nTwoIsland_JoyfulGameCorner_Movement_BikerLookAround::\n\twalk_in_place_faster_left\n\tdelay_8\n\twalk_in_place_faster_right\n\tdelay_8\n\twalk_in_place_faster_up\n\tstep_end\n\nTwoIsland_JoyfulGameCorner_EventScript_InfoMan::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 4, JoyfulGameCorner_EventScript_InfoMan2\n\tgoto_if_set FLAG_RESCUED_LOSTELLE, TwoIsland_JoyfulGameCorner_EventScript_GetGamesGoingSoon\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_NotRunningAnyGamesToday\n\trelease\n\tend\n\nTwoIsland_JoyfulGameCorner_EventScript_GetGamesGoingSoon::\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_GetGamesGoingSoon\n\trelease\n\tend\n\n@ Only referred to as Lostelles Daddy in text\nTwoIsland_JoyfulGameCorner_EventScript_LostellesDaddy::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 4, JoyfulGameCorner_EventScript_MinigameAttendant\n\tgoto_if_set FLAG_GOT_MOON_STONE_FROM_JOYFUL_GAME_CORNER, TwoIsland_JoyfulGameCorner_EventScript_GetGameCornerRunning\n\tgoto_if_eq VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER, 3, TwoIsland_JoyfulGameCorner_EventScript_GiveDaddyMeteorite\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_PleaseGoToThreeIsland\n\trelease\n\tend\n\nTwoIsland_JoyfulGameCorner_EventScript_GiveDaddyMeteorite::\n\tgoto_if_set FLAG_NO_ROOM_FOR_JOYFUL_GAME_CORNER_MOON_STONE, TwoIsland_JoyfulGameCorner_EventScript_ReceiveMoonStone\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_ThisIsForMe\n\tsetvar VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 2\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_OBTAIN_TMHM\n\tmessage TwoIsland_JoyfulGameCorner_Text_HandedMeteoriteToLostellesDaddy\n\twaitmessage\n\twaitfanfare\n\tcall EventScript_RestorePrevTextColor\n\tremoveitem ITEM_METEORITE\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_OhThisIsFromBill\n\tgoto TwoIsland_JoyfulGameCorner_EventScript_ReceiveMoonStone\n\tend\n\nTwoIsland_JoyfulGameCorner_EventScript_ReceiveMoonStone::\n\tcheckitemspace ITEM_MOON_STONE\n\tgoto_if_eq VAR_RESULT, FALSE, TwoIsland_JoyfulGameCorner_EventScript_NoRoomForMoonStone\n\tadditem ITEM_MOON_STONE\n\tsetflag FLAG_GOT_MOON_STONE_FROM_JOYFUL_GAME_CORNER\n\tmsgreceiveditem TwoIsland_JoyfulGameCorner_Text_ReceivedMoonStoneFromLostellesDaddy, ITEM_MOON_STONE\n\trelease\n\tend\n\nTwoIsland_JoyfulGameCorner_EventScript_GetGameCornerRunning::\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_IllGetGameCornerRunning\n\trelease\n\tend\n\nTwoIsland_JoyfulGameCorner_EventScript_NoRoomForMoonStone::\n\tsetflag FLAG_NO_ROOM_FOR_JOYFUL_GAME_CORNER_MOON_STONE\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_NotGoingToFitInBag\n\trelease\n\tend\n\nTwoIsland_JoyfulGameCorner_EventScript_Lostelle::\n\tlock\n\tfaceplayer\n\tmsgbox TwoIsland_JoyfulGameCorner_Text_PleaseShowMeYouBeingCool\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/TwoIsland_JoyfulGameCorner/text.inc",
    "content": "TwoIsland_JoyfulGameCorner_Text_WhereHasLostelleGottenTo::\n    .string \"Now, where's LOSTELLE gotten to\\n\"\n    .string \"today?\\p\"\n    .string \"She always brings me lunch every\\n\"\n    .string \"day right about now…$\"\n\nTwoIsland_JoyfulGameCorner_Text_PleaseHelpFindLostelle::\n    .string \"Hm? You, there!\\n\"\n    .string \"Are you a friend of LOSTELLE's?\\p\"\n    .string \"Have you seen LOSTELLE around?\\n\"\n    .string \"I don't know where she might be.\\l\"\n    .string \"She should've been here long ago.\\p\"\n    .string \"LOSTELLE's a cutie - she got my\\n\"\n    .string \"looks - so what if someone…\\p\"\n    .string \"What if something's happened to\\n\"\n    .string \"my LOSTELLE?!\\p\"\n    .string \"Please, help me find her!\\n\"\n    .string \"Please go search THREE ISLAND!$\"\n\nTwoIsland_JoyfulGameCorner_Text_IsThisOnlyThreeIsland::\n    .string \"Hah? What is this GAME CORNER?\\n\"\n    .string \"How much sadder can this get?\\p\"\n    .string \"Those clowns…\\p\"\n    .string \"They said they'd be waiting on the\\n\"\n    .string \"island, so where are they?\\p\"\n    .string \"Hey, you! Is this the only THREE\\n\"\n    .string \"ISLAND around here?$\"\n\nTwoIsland_JoyfulGameCorner_Text_ThisIsTwoIslandMoveIt::\n    .string \"Try waking up before you crawl out\\n\"\n    .string \"of bed, you punk.\\p\"\n    .string \"This is TWO ISLAND!\\p\"\n    .string \"Move it! Get your filthy motorbike\\n\"\n    .string \"out of my place!$\"\n\nTwoIsland_JoyfulGameCorner_Text_TheseIslandsAreConfusing::\n    .string \"Huh…\\n\"\n    .string \"Oh, oh, gotcha.\\p\"\n    .string \"Tch…\\n\"\n    .string \"These islands are confusing…$\"\n\nTwoIsland_JoyfulGameCorner_Text_PunkScuffedUpMyFloor::\n    .string \"Would you look at that?\\n\"\n    .string \"That punk scuffed up my floor.$\"\n\nTwoIsland_JoyfulGameCorner_Text_PleaseGoToThreeIsland::\n    .string \"Hey, but listen! I'm begging you,\\n\"\n    .string \"you have to go to THREE ISLAND.\\p\"\n    .string \"If anything were to happen to my\\n\"\n    .string \"LOSTELLE…\\p\"\n    .string \"My place is the house with the red\\n\"\n    .string \"roof on THREE ISLAND.\\p\"\n    .string \"She may just show up late here,\\n\"\n    .string \"so I can't run off anywhere.\\p\"\n    .string \"That's why I have to get you to do\\n\"\n    .string \"me this big favor.$\"\n\nTwoIsland_JoyfulGameCorner_Text_NotRunningAnyGamesToday::\n    .string \"I'm sorry.\\n\"\n    .string \"We're not running any games today.$\"\n\nTwoIsland_JoyfulGameCorner_Text_GetGamesGoingSoon::\n    .string \"We'll get the games going soon\\n\"\n    .string \"for you!$\"\n\nTwoIsland_JoyfulGameCorner_Text_YouRescuedLostelle::\n    .string \"So you rescued LOSTELLE?\\n\"\n    .string \"How can I thank you?\\p\"\n    .string \"LOSTELLE, darling, forgive me!\\p\"\n    .string \"Daddy didn't know you were scared\\n\"\n    .string \"and in trouble!$\"\n\nTwoIsland_JoyfulGameCorner_Text_LostelleItsOkayDaddy::\n    .string \"LOSTELLE: It's okay, Daddy.\\n\"\n    .string \"I got to be friends with {PLAYER}!$\"\n\nTwoIsland_JoyfulGameCorner_Text_ThisIsForMe::\n    .string \"Oh, what's that?\\n\"\n    .string \"You're saying that this is for me?\\p\"\n    .string \"How did you know that I love rare\\n\"\n    .string \"rocks and gems?\\p\"\n    .string \"You sure know how to make a guy\\n\"\n    .string \"happy.$\"\n\nTwoIsland_JoyfulGameCorner_Text_HandedMeteoriteToLostellesDaddy::\n    .string \"{PLAYER} handed the METEORITE\\n\"\n    .string \"to LOSTELLE's daddy.$\"\n\nTwoIsland_JoyfulGameCorner_Text_OhThisIsFromBill::\n    .string \"Oh, I see, this is from BILL!\\n\"\n    .string \"You have to thank him for me!\\p\"\n    .string \"You know, you've been fantastic.\\n\"\n    .string \"I want you to have this.$\"\n\nTwoIsland_JoyfulGameCorner_Text_ReceivedMoonStoneFromLostellesDaddy::\n    .string \"{PLAYER} received a MOON STONE\\n\"\n    .string \"from LOSTELLE's daddy.$\"\n\nTwoIsland_JoyfulGameCorner_Text_NotGoingToFitInBag::\n    .string \"Your BAG's not going to fit another\\n\"\n    .string \"thing…$\"\n\nTwoIsland_JoyfulGameCorner_Text_IllGetGameCornerRunning::\n    .string \"All right, I'll get the GAME CORNER\\n\"\n    .string \"running right away.\\p\"\n    .string \"You have to come visit with a\\n\"\n    .string \"friend.$\"\n\nTwoIsland_JoyfulGameCorner_Text_PleaseShowMeYouBeingCool::\n    .string \"Listen, listen!\\p\"\n    .string \"Please show me you being cool\\n\"\n    .string \"again!$\"\n\n"
  },
  {
    "path": "data/maps/TwoIsland_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_TWO_ISLAND_POKEMON_CENTER_1F\",\n  \"name\": \"TwoIsland_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_TWO_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GBA_KID\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_PokemonCenter_1F_EventScript_GBAKid\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"TwoIsland_PokemonCenter_1F_EventScript_BugCatcher\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_TWO_ISLAND\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_TWO_ISLAND_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TwoIsland_PokemonCenter_1F/scripts.inc",
    "content": "TwoIsland_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, TwoIsland_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nTwoIsland_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_TWO_ISLAND\n\tend\n\nTwoIsland_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nTwoIsland_PokemonCenter_1F_EventScript_GBAKid::\n\tmsgbox TwoIsland_PokemonCenter_1F_Text_HaveYouVisitedGameCorner, MSGBOX_NPC\n\tend\n\nTwoIsland_PokemonCenter_1F_EventScript_BugCatcher::\n\tmsgbox TwoIsland_PokemonCenter_1F_Text_OldLadyLivesOutOnCape, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/TwoIsland_PokemonCenter_1F/text.inc",
    "content": "TwoIsland_PokemonCenter_1F_Text_HaveYouVisitedGameCorner::\n    .string \"Have you visited the GAME CORNER\\n\"\n    .string \"already?\\p\"\n    .string \"It's no good to go alone.\\n\"\n    .string \"You have to take a friend along.$\"\n\nTwoIsland_PokemonCenter_1F_Text_OldLadyLivesOutOnCape::\n    .string \"Not many people live on\\n\"\n    .string \"TWO ISLAND.\\p\"\n    .string \"There is this old lady who lives\\n\"\n    .string \"out on the cape.\\p\"\n    .string \"She's been there since I don't know\\n\"\n    .string \"when.$\"\n\n"
  },
  {
    "path": "data/maps/TwoIsland_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_TWO_ISLAND_POKEMON_CENTER_2F\",\n  \"name\": \"TwoIsland_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_TWO_ISLAND\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_TWO_ISLAND_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/TwoIsland_PokemonCenter_2F/scripts.inc",
    "content": "TwoIsland_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nTwoIsland_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nTwoIsland_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nTwoIsland_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/UndergroundPath_EastEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_UNDERGROUND_PATH_EAST_ENTRANCE\",\n  \"name\": \"UndergroundPath_EastEntrance\",\n  \"layout\": \"LAYOUT_UNDERGROUND_PATH_ENTRANCE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_UNDERGROUND_PATH_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UndergroundPath_EastEntrance_EventScript_Woman\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE8\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE8\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE8\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/UndergroundPath_EastEntrance/scripts.inc",
    "content": "UndergroundPath_EastEntrance_MapScripts::\n\t.byte 0\n\nUndergroundPath_EastEntrance_EventScript_Woman::\n\tmsgbox UndergroundPath_EastEntrance_Text_DoYouGoToCeladonDeptStore, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/UndergroundPath_EastEntrance/text.inc",
    "content": "UndergroundPath_EastEntrance_Text_DoYouGoToCeladonDeptStore::\n    .string \"The DEPARTMENT STORE in CELADON\\n\"\n    .string \"has a great selection.\\p\"\n    .string \"Do you go there very often?$\"\n\n"
  },
  {
    "path": "data/maps/UndergroundPath_EastWestTunnel/map.json",
    "content": "{\n  \"id\": \"MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL\",\n  \"name\": \"UndergroundPath_EastWestTunnel\",\n  \"layout\": \"LAYOUT_UNDERGROUND_PATH_EAST_WEST_TUNNEL\",\n  \"music\": \"MUS_ROUTE1\",\n  \"region_map_section\": \"MAPSEC_UNDERGROUND_PATH_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 51,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Nidorino\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 53,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Nidorina\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Onix\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 76,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_UNDERGROUND_PATH_EAST_ENTRANCE\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_UNDERGROUND_PATH_WEST_ENTRANCE\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 7,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"item\": \"ITEM_POTION\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_POTION\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 17,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PARALYZE_HEAL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_PARALYZE_HEAL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 31,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"item\": \"ITEM_AWAKENING\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_AWAKENING\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 45,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"item\": \"ITEM_BURN_HEAL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_BURN_HEAL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 70,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ICE_HEAL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ICE_HEAL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 55,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ETHER\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ETHER\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 62,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ANTIDOTE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ANTIDOTE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/UndergroundPath_EastWestTunnel/scripts.inc",
    "content": ".set LOCALID_NIDORINO_MASTER, 1\n.set LOCALID_NIDORINA_MASTER, 2\n.set LOCALID_ONIX_MASTER, 3\n.set TRAINER, VAR_0x8009\n\nUndergroundPath_EastWestTunnel_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, UndergroundPath_EastWestTunnel_OnTransition\n\t.byte 0\n\nUndergroundPath_EastWestTunnel_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL\n\tgoto UndergroundPath_EastWestTunnel_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nUndergroundPath_EastWestTunnel_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_NIDORINO\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, UndergroundPath_EastWestTunnel_MapScript_NidorinoMasterMovementType\n\tsetvar TRAINER, MASTER_NIDORINA\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, UndergroundPath_EastWestTunnel_MapScript_NidorinaMasterMovementType\n\tsetvar TRAINER, MASTER_ONIX\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, UndergroundPath_EastWestTunnel_MapScript_OnixMasterMovementType\n\tend\n\nUndergroundPath_EastWestTunnel_MapScript_NidorinoMasterMovementType::\n\tsetobjectmovementtype LOCALID_NIDORINO_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\t\nUndergroundPath_EastWestTunnel_MapScript_NidorinaMasterMovementType::\n\tsetobjectmovementtype LOCALID_NIDORINA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nUndergroundPath_EastWestTunnel_MapScript_OnixMasterMovementType::\n\tsetobjectmovementtype LOCALID_ONIX_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n"
  },
  {
    "path": "data/maps/UndergroundPath_NorthEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_UNDERGROUND_PATH_NORTH_ENTRANCE\",\n  \"name\": \"UndergroundPath_NorthEntrance\",\n  \"layout\": \"LAYOUT_UNDERGROUND_PATH_ENTRANCE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_UNDERGROUND_PATH\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UndergroundPath_NorthEntrance_EventScript_Saige\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE5\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE5\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE5\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/UndergroundPath_NorthEntrance/scripts.inc",
    "content": "UndergroundPath_NorthEntrance_MapScripts::\n\t.byte 0\n\nUndergroundPath_NorthEntrance_EventScript_Saige::\n\tlock\n\tfaceplayer\n\tcallnative IsVersionFireRedToVarResult\n\tgoto_if_eq VAR_RESULT, FALSE, UndergroundPath_NorthEntrance_EventScript_Saige_LG\n\tsetvar VAR_0x8008, INGAME_TRADE_NIDORAN_F_FR\n\tcall EventScript_GetInGameTradeSpeciesInfo\n\tgoto_if_set FLAG_DID_MS_NIDO_TRADE, UndergroundPath_NorthEntrance_EventScript_AlreadyTraded\n\tmsgbox Trade_Text_DoYouHaveMonWantToTradeForMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, UndergroundPath_NorthEntrance_EventScript_DeclineTrade\n\tcall EventScript_ChooseMonForInGameTrade\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, UndergroundPath_NorthEntrance_EventScript_DeclineTrade\n\tcall EventScript_GetInGameTradeSpecies\n\tgoto_if_ne VAR_RESULT, VAR_0x8009, UndergroundPath_NorthEntrance_EventScript_NotRequestedMon\n\tcall EventScript_DoInGameTrade\n\tmsgbox Trade_Text_ThanksYoureAPal\n\tsetflag FLAG_DID_MS_NIDO_TRADE\n\trelease\n\tend\n\nUndergroundPath_NorthEntrance_EventScript_Saige_LG::\n\tsetvar VAR_0x8008, INGAME_TRADE_NIDORAN_M_LG\n\tcall EventScript_GetInGameTradeSpeciesInfo\n\tgoto_if_set FLAG_DID_MR_NIDO_TRADE, UndergroundPath_NorthEntrance_EventScript_AlreadyTraded\n\tmsgbox Trade_Text_DoYouHaveMonWantToTradeForMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, UndergroundPath_NorthEntrance_EventScript_DeclineTrade\n\tcall EventScript_ChooseMonForInGameTrade\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, UndergroundPath_NorthEntrance_EventScript_DeclineTrade\n\tcall EventScript_GetInGameTradeSpecies\n\tgoto_if_ne VAR_RESULT, VAR_0x8009, UndergroundPath_NorthEntrance_EventScript_NotRequestedMon\n\tcall EventScript_DoInGameTrade\n\tmsgbox Trade_Text_ThanksYoureAPal\n\tsetflag FLAG_DID_MR_NIDO_TRADE\n\trelease\n\tend\n\nUndergroundPath_NorthEntrance_EventScript_DeclineTrade::\n\tmsgbox Trade_Text_ThatsTooBad\n\trelease\n\tend\n\nUndergroundPath_NorthEntrance_EventScript_NotRequestedMon::\n\tbufferspeciesname STR_VAR_1, VAR_0x8009\n\tmsgbox Trade_Text_ThisIsNoMon\n\trelease\n\tend\n\nUndergroundPath_NorthEntrance_EventScript_AlreadyTraded::\n\tmsgbox Trade_Text_HowIsMyOldMon\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/UndergroundPath_NorthSouthTunnel/map.json",
    "content": "{\n  \"id\": \"MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL\",\n  \"name\": \"UndergroundPath_NorthSouthTunnel\",\n  \"layout\": \"LAYOUT_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL\",\n  \"music\": \"MUS_ROUTE1\",\n  \"region_map_section\": \"MAPSEC_UNDERGROUND_PATH\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Magneton\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Magnemite\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_UNDERGROUND_PATH_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 60,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_UNDERGROUND_PATH_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 5,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"item\": \"ITEM_POTION\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_POTION\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ANTIDOTE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ANTIDOTE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 2,\n      \"y\": 57,\n      \"elevation\": 3,\n      \"item\": \"ITEM_BURN_HEAL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_BURN_HEAL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 1,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"item\": \"ITEM_AWAKENING\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_AWAKENING\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 6,\n      \"y\": 53,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ICE_HEAL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ICE_HEAL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 3,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"item\": \"ITEM_PARALYZE_HEAL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_PARALYZE_HEAL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 3,\n      \"y\": 39,\n      \"elevation\": 3,\n      \"item\": \"ITEM_ETHER\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ETHER\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/UndergroundPath_NorthSouthTunnel/scripts.inc",
    "content": ".set LOCALID_MAGNETON_MASTER, 1\n.set LOCALID_MAGNEMITE_MASTER, 2\n.set TRAINER, VAR_0x8009\n\nUndergroundPath_NorthSouthTunnel_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, UndergroundPath_NorthSouthTunnel_OnTransition\n\t.byte 0\n\nUndergroundPath_NorthSouthTunnel_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL\n\tgoto UndergroundPath_NorthSouthTunnel_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nUndergroundPath_NorthSouthTunnel_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_MAGNEMITE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, UndergroundPath_NorthSouthTunnel_MapScript_MagnemiteMasterMovementType\n\tsetvar TRAINER, MASTER_MAGNETON\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, UndergroundPath_NorthSouthTunnel_MapScript_MagnetonMasterMovementType\n\tend\n\nUndergroundPath_NorthSouthTunnel_MapScript_MagnemiteMasterMovementType::\n\tsetobjectmovementtype LOCALID_MAGNEMITE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\t\nUndergroundPath_NorthSouthTunnel_MapScript_MagnetonMasterMovementType::\n\tsetobjectmovementtype LOCALID_MAGNETON_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn"
  },
  {
    "path": "data/maps/UndergroundPath_SouthEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_UNDERGROUND_PATH_SOUTH_ENTRANCE\",\n  \"name\": \"UndergroundPath_SouthEntrance\",\n  \"layout\": \"LAYOUT_UNDERGROUND_PATH_ENTRANCE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_UNDERGROUND_PATH\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UndergroundPath_SouthEntrance_EventScript_Woman\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE6\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE6\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE6\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/UndergroundPath_SouthEntrance/scripts.inc",
    "content": "UndergroundPath_SouthEntrance_MapScripts::\n\t.byte 0\n\nUndergroundPath_SouthEntrance_EventScript_Woman::\n\tmsgbox UndergroundPath_SouthEntrance_Text_PeopleLoseThingsInTheDarkness, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/UndergroundPath_SouthEntrance/text.inc",
    "content": "UndergroundPath_SouthEntrance_Text_PeopleLoseThingsInTheDarkness::\n    .string \"People often lose things in the\\n\"\n    .string \"darkness of the UNDERGROUND PATH.$\"\n\n"
  },
  {
    "path": "data/maps/UndergroundPath_WestEntrance/map.json",
    "content": "{\n  \"id\": \"MAP_UNDERGROUND_PATH_WEST_ENTRANCE\",\n  \"name\": \"UndergroundPath_WestEntrance\",\n  \"layout\": \"LAYOUT_UNDERGROUND_PATH_ENTRANCE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_UNDERGROUND_PATH_2\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 5,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UndergroundPath_WestEntrance_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE7\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE7\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE7\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/UndergroundPath_WestEntrance/scripts.inc",
    "content": "UndergroundPath_WestEntrance_MapScripts::\n\t.byte 0\n\nUndergroundPath_WestEntrance_EventScript_BaldingMan::\n\tmsgbox UndergroundPath_WestEntrance_Text_SleepyMonNearCeladon, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/UndergroundPath_WestEntrance/text.inc",
    "content": "UndergroundPath_WestEntrance_Text_SleepyMonNearCeladon::\n    .string \"I heard a sleepy POKéMON appeared\\n\"\n    .string \"out near CELADON CITY, too.$\"\n\n"
  },
  {
    "path": "data/maps/UnionRoom/map.json",
    "content": "{\n  \"id\": \"MAP_UNION_ROOM\",\n  \"name\": \"UnionRoom\",\n  \"layout\": \"LAYOUT_UNION_ROOM\",\n  \"music\": \"MUS_UNION_ROOM\",\n  \"region_map_section\": \"MAPSEC_SPECIAL_AREA\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_LINK\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST\",\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UnionRoom_EventScript_Attendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_3\",\n      \"x\": 1,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UnionRoom_EventScript_Player4\",\n      \"flag\": \"FLAG_HIDE_UNION_ROOM_PLAYER_4\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_7\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UnionRoom_EventScript_Player8\",\n      \"flag\": \"FLAG_HIDE_UNION_ROOM_PLAYER_8\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_6\",\n      \"x\": 1,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UnionRoom_EventScript_Player7\",\n      \"flag\": \"FLAG_HIDE_UNION_ROOM_PLAYER_7\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_5\",\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UnionRoom_EventScript_Player6\",\n      \"flag\": \"FLAG_HIDE_UNION_ROOM_PLAYER_6\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_4\",\n      \"x\": 13,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UnionRoom_EventScript_Player5\",\n      \"flag\": \"FLAG_HIDE_UNION_ROOM_PLAYER_5\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_2\",\n      \"x\": 10,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UnionRoom_EventScript_Player3\",\n      \"flag\": \"FLAG_HIDE_UNION_ROOM_PLAYER_3\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_1\",\n      \"x\": 13,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UnionRoom_EventScript_Player2\",\n      \"flag\": \"FLAG_HIDE_UNION_ROOM_PLAYER_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"UnionRoom_EventScript_Player1\",\n      \"flag\": \"FLAG_HIDE_UNION_ROOM_PLAYER_1\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 7,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_DYNAMIC\",\n      \"dest_warp_id\": \"WARP_ID_DYNAMIC\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/UnionRoom/scripts.inc",
    "content": "UnionRoom_MapScripts::\n\tmap_script MAP_SCRIPT_ON_RESUME, UnionRoom_OnResume\n\tmap_script MAP_SCRIPT_ON_TRANSITION, UnionRoom_OnTransition\n\t.byte 0\n\nUnionRoom_OnResume::\n\tsetflag FLAG_HIDE_UNION_ROOM_PLAYER_1\n\tsetflag FLAG_HIDE_UNION_ROOM_PLAYER_2\n\tsetflag FLAG_HIDE_UNION_ROOM_PLAYER_3\n\tsetflag FLAG_HIDE_UNION_ROOM_PLAYER_4\n\tsetflag FLAG_HIDE_UNION_ROOM_PLAYER_5\n\tsetflag FLAG_HIDE_UNION_ROOM_PLAYER_6\n\tsetflag FLAG_HIDE_UNION_ROOM_PLAYER_7\n\tsetflag FLAG_HIDE_UNION_ROOM_PLAYER_8\n\tremoveobject LOCALID_UNION_ROOM_PLAYER_1\n\tremoveobject LOCALID_UNION_ROOM_PLAYER_2\n\tremoveobject LOCALID_UNION_ROOM_PLAYER_3\n\tremoveobject LOCALID_UNION_ROOM_PLAYER_4\n\tremoveobject LOCALID_UNION_ROOM_PLAYER_5\n\tremoveobject LOCALID_UNION_ROOM_PLAYER_6\n\tremoveobject LOCALID_UNION_ROOM_PLAYER_7\n\tremoveobject LOCALID_UNION_ROOM_PLAYER_8\n\tspecial RunUnionRoom\n\tend\n\nUnionRoom_OnTransition::\n\tend\n\nUnionRoom_EventScript_Player1::\n\tlock\n\tfaceplayer\n\tsetvar VAR_RESULT, 1\n\twaitstate\n\trelease\n\tend\n\nUnionRoom_EventScript_Player2::\n\tlock\n\tfaceplayer\n\tsetvar VAR_RESULT, 2\n\twaitstate\n\trelease\n\tend\n\nUnionRoom_EventScript_Player3::\n\tlock\n\tfaceplayer\n\tsetvar VAR_RESULT, 3\n\twaitstate\n\trelease\n\tend\n\nUnionRoom_EventScript_Player4::\n\tlock\n\tfaceplayer\n\tsetvar VAR_RESULT, 4\n\twaitstate\n\trelease\n\tend\n\nUnionRoom_EventScript_Player5::\n\tlock\n\tfaceplayer\n\tsetvar VAR_RESULT, 5\n\twaitstate\n\trelease\n\tend\n\nUnionRoom_EventScript_Player6::\n\tlock\n\tfaceplayer\n\tsetvar VAR_RESULT, 6\n\twaitstate\n\trelease\n\tend\n\nUnionRoom_EventScript_Player7::\n\tlock\n\tfaceplayer\n\tsetvar VAR_RESULT, 7\n\twaitstate\n\trelease\n\tend\n\nUnionRoom_EventScript_Player8::\n\tlock\n\tfaceplayer\n\tsetvar VAR_RESULT, 8\n\twaitstate\n\trelease\n\tend\n\nUnionRoom_EventScript_Attendant::\n\tlock\n\tfaceplayer\n\tsetvar VAR_RESULT, 9\n\twaitstate\n\trelease\n\tend\n\nUnionRoom_EventScript_Unused::\n\tlockall\n\tsetvar VAR_RESULT, 10\n\twaitstate\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/VermilionCity/map.json",
    "content": "{\n  \"id\": \"MAP_VERMILION_CITY\",\n  \"name\": \"VermilionCity\",\n  \"layout\": \"LAYOUT_VERMILION_CITY\",\n  \"music\": \"MUS_VERMILLION\",\n  \"region_map_section\": \"MAPSEC_VERMILION_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 12,\n      \"map\": \"MAP_ROUTE6\"\n    },\n    {\n      \"direction\": \"right\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE11\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 22,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_EventScript_OldMan1\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_2\",\n      \"in_connection\": false,\n      \"x\": 36,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_EventScript_OldMan2\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MACHOP\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_EventScript_Machop\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 31,\n      \"y\": 30,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_EventScript_Sailor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 24,\n      \"y\": 33,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_EventScript_FerrySailor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_VERMILION_CITY_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_EventScript_OaksAide\",\n      \"flag\": \"FLAG_HIDE_VERMILION_CITY_OAKS_AIDE\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BLACK_BELT\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Machamp\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BIRD_KEEPER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Farfetchd\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 22,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_EXTERIOR\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 23,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_EXTERIOR\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 24,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_SSANNE_EXTERIOR\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VERMILION_CITY_HOUSE1\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 15,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 12,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VERMILION_CITY_POKEMON_FAN_CLUB\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 19,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VERMILION_CITY_HOUSE2\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 29,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VERMILION_CITY_MART\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 24,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VERMILION_CITY_HOUSE3\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 14,\n      \"y\": 25,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VERMILION_CITY_GYM\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 22,\n      \"y\": 33,\n      \"elevation\": 0,\n      \"var\": \"VAR_VERMILION_CITY_TICKET_CHECK_TRIGGER\",\n      \"var_value\": \"0\",\n      \"script\": \"VermilionCity_EventScript_CheckTicketLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 23,\n      \"y\": 33,\n      \"elevation\": 0,\n      \"var\": \"VAR_VERMILION_CITY_TICKET_CHECK_TRIGGER\",\n      \"var_value\": \"0\",\n      \"script\": \"VermilionCity_EventScript_CheckTicketRight\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 22,\n      \"y\": 32,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"VermilionCity_EventScript_ExitedTicketCheck\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 23,\n      \"y\": 32,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_1\",\n      \"var_value\": \"0\",\n      \"script\": \"VermilionCity_EventScript_ExitedTicketCheck\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 33,\n      \"y\": 6,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_EventScript_CitySign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_EventScript_PokemonFanClubSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 10,\n      \"y\": 24,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_EventScript_GymSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 34,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_EventScript_HarborSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 45,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_EventScript_SnorlaxNotice\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 14,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"item\": \"ITEM_MAX_ETHER\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_VERMILION_CITY_MAX_ETHER\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/VermilionCity/scripts.inc",
    "content": ".equ LOCALID_FERRY_SAILOR, 6\n.set LOCALID_MACHAMP_MASTER, 9\n.set LOCALID_FARFETCHD_MASTER, 10\n.set TRAINER, VAR_0x8009\n\n.equ HAS_TICKETS, 16\n.equ NEEDS_SHOW_EON, 17\n.equ NEEDS_SHOW_AURORA, 18\n.equ NEEDS_SHOW_MYSTIC, 19\n.equ NEEDS_SHOW_OLD_SEA_MAP, 20\n.equ HAS_NO_TICKETS, 21\n.equ F, 1\n.equ N, 2\n.equ NF, 3\n.equ B, 4\n.equ BF, 5\n.equ BN, 6\n.equ BNF, 7\n.equ S, 8\n.equ SF, 9\n.equ SN, 10\n.equ SNF, 11\n.equ SB, 12\n.equ SBF, 13\n.equ SBN, 14\n.equ SBNF, 15\n\nVermilionCity_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, VermilionCity_OnTransition\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, VermilionCity_OnFrame\n\t.byte 0\n\nVermilionCity_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_VERMILION_CITY, 2, VermilionCity_EventScript_ExitSSAnne\n\t.2byte 0\n\nVermilionCity_EventScript_ExitSSAnne::\n\tlockall\n\tapplymovement OBJ_EVENT_ID_PLAYER, VermilionCity_Movement_ExitSSAnne\n\twaitmovement 0\n\tsetvar VAR_MAP_SCENE_VERMILION_CITY, 3\n\treleaseall\n\tend\n\nVermilionCity_Movement_ExitSSAnne::\n\twalk_up\n\twalk_up\n\tstep_end\n\nVermilionCity_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_VERMILION_CITY\n\tcall_if_set FLAG_TALKED_TO_OAKS_AIDE_IN_VERMILION, VermilionCity_EventScript_HideOaksAide\n\tgoto VermilionCity_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nVermilionCity_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_MACHAMP\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, VermilionCity_MapScript_MachampMasterMovementType\n\tsetvar TRAINER, MASTER_FARFETCHD\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, VermilionCity_MapScript_FarfetchdMasterMovementType\n\tend\n\nVermilionCity_MapScript_MachampMasterMovementType::\n\tsetobjectmovementtype LOCALID_MACHAMP_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\t\nVermilionCity_MapScript_FarfetchdMasterMovementType::\n\tsetobjectmovementtype LOCALID_FARFETCHD_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nVermilionCity_EventScript_HideOaksAide::\n\tsetflag FLAG_HIDE_VERMILION_CITY_OAKS_AIDE\n\treturn\n\nVermilionCity_EventScript_Woman::\n\tmsgbox VermilionCity_Text_GrimerMultipliesInSludge, MSGBOX_NPC\n\tend\n\nVermilionCity_EventScript_OldMan1::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_MAP_SCENE_VERMILION_CITY, 3, VermilionCity_EventScript_OldMan1SSAnneLeft\n\tmsgbox VermilionCity_Text_DidYouSeeSSAnneInHarbor\n\trelease\n\tend\n\nVermilionCity_EventScript_OldMan1SSAnneLeft::\n\tmsgbox VermilionCity_Text_SSAnneHasDepartedForYear\n\trelease\n\tend\n\nVermilionCity_EventScript_FerrySailor::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_MAP_SCENE_VERMILION_CITY, 3, VermilionCity_EventScript_CheckSeagallopPresent\n\tmsgbox VermilionCity_Text_WelcomeToTheSSAnne\n\trelease\n\tend\n\nVermilionCity_EventScript_CheckSeagallopPresent::\n\tsetvar VAR_0x8004, SEAGALLOP_VERMILION_CITY\n\tgoto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, VermilionCity_EventScript_ChooseSeagallopDestRainbowPass\n\tgoto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 1, VermilionCity_EventScript_ChooseSeagallopDestTriPass\n\tmsgbox VermilionCity_Text_TheShipSetSail\n\trelease\n\tend\n\nVermilionCity_EventScript_SetSailToBattleTower::\n\tmsgbox VermilionCity_Text_Seagallop13Departing\n\tsetvar VAR_0x8004, SEAGALLOP_VERMILION_CITY\n\tsetvar VAR_0x8006, SEAGALLOP_BATTLE_TOWER\n\tgoto EventScript_SetSail\n\tend\n\nVermilionCity_EventScript_SetSailToSouthernIsland::\n\tmsgbox VermilionCity_Text_Seagallop13Departing\n\tsetvar VAR_0x8004, SEAGALLOP_VERMILION_CITY\n\tsetvar VAR_0x8006, SEAGALLOP_SOUTHERN_ISLAND\n\tgoto EventScript_SetSail\n\tend\n\nVermilionCity_EventScript_SetSailToFarawayIsland::\n\tmsgbox VermilionCity_Text_Seagallop14Departing\n\tsetvar VAR_0x8004, SEAGALLOP_VERMILION_CITY\n\tsetvar VAR_0x8006, SEAGALLOP_FARAWAY_ISLAND\n\tgoto EventScript_SetSail\n\tend\n\nVermilionCity_EventScript_ChooseSeagallopDestRainbowPass::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tsetvar VAR_RESULT, 0\n\tcallnative CheckEventTickets\n\tswitch VAR_RESULT\n\tcase NEEDS_SHOW_EON, VermilionCity_EventScript_ShowEonTicket\n\tcase NEEDS_SHOW_AURORA, VermilionCity_EventScript_ShowAuroraTicket\n\tcase NEEDS_SHOW_MYSTIC, VermilionCity_EventScript_ShowMysticTicket\n\tcase NEEDS_SHOW_OLD_SEA_MAP, VermilionCity_EventScript_ShowOldSeaMap\n\tcase HAS_TICKETS, VermilionCity_EventScript_HasTicketsRainbowPass\n\tsetvar VAR_0x8004, SEAGALLOP_VERMILION_CITY\n\tmessage VermilionCity_Text_BoardSeagallopRainbowPass\n\twaitmessage\n\tmultichoice 13, 6, MULTICHOICE_SEVII_BATTLE_TOWER, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SeviiDestinationsPage1\n\tcase 1, VermilionCity_EventScript_SetSailToBattleTower\n\tcase 2, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_HasTicketsRainbowPass::\n\tsetvar VAR_0x8004, SEAGALLOP_VERMILION_CITY\n\tmessage VermilionCity_Text_BoardSeagallopRainbowPass\n\twaitmessage\n\tmultichoice 13, 5, MULTICHOICE_SEVII_BATTLE_TOWER_OTHER, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SeviiDestinationsPage1\n\tcase 1, VermilionCity_EventScript_SetSailToBattleTower\n\tcase 2, VermilionCity_EventScript_EventIslandsMultichoice\n\tcase 3, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_ShowOldSeaMap::\n\tsetflag FLAG_SHOWN_OLD_SEA_MAP\n\tmsgbox VermilionCity_Text_OldSeaMapTakeYouToFarawayIsland\n\tgoto VermilionCity_EventScript_CheckSeagallopPresentTrigger\n\nVermilionCity_EventScript_ShowMysticTicket::\n\tsetflag FLAG_SHOWN_MYSTIC_TICKET\n\tmsgbox VermilionCity_Text_OhMysticTicketTakeYouToNavelRock\n\tgoto VermilionCity_EventScript_CheckSeagallopPresentTrigger\n\nVermilionCity_EventScript_ShowAuroraTicket::\n\tsetflag FLAG_SHOWN_AURORA_TICKET\n\tmsgbox VermilionCity_Text_OhAuroraTicketTakeYouToBirthIsland\n\tgoto VermilionCity_EventScript_CheckSeagallopPresentTrigger\n\nEventScript_SailToNavelRock::\n\tmsgbox VermilionCity_Text_Seagallop10Departing\n\tsetvar VAR_0x8004, SEAGALLOP_VERMILION_CITY\n\tsetvar VAR_0x8006, SEAGALLOP_NAVEL_ROCK\n\tgoto EventScript_SetSail\n\tend\n\nEventScript_SailToBirthIsland::\n\tmsgbox VermilionCity_Text_Seagallop12Departing\n\tsetvar VAR_0x8004, SEAGALLOP_VERMILION_CITY\n\tsetvar VAR_0x8006, SEAGALLOP_BIRTH_ISLAND\n\tgoto EventScript_SetSail\n\tend\n\nVermilionCity_EventScript_ChooseSeagallopDestTriPass::\n\tsetvar VAR_RESULT, 0\n\tcallnative CheckEventTickets\n\tswitch VAR_RESULT\n\tcase NEEDS_SHOW_EON, VermilionCity_EventScript_ShowEonTicket\n\tcase NEEDS_SHOW_AURORA, VermilionCity_EventScript_ShowAuroraTicket\n\tcase NEEDS_SHOW_MYSTIC, VermilionCity_EventScript_ShowMysticTicket\n\tcase NEEDS_SHOW_OLD_SEA_MAP, VermilionCity_EventScript_ShowOldSeaMap\n\tcase HAS_TICKETS, VermilionCity_EventScript_HasTicketsTriPass\n\tmessage VermilionCity_Text_BoardSeagallopTriPass\n\twaitmessage\n\tsetvar VAR_0x8004, SEAGALLOP_VERMILION_CITY\nVermilionCity_EventScript_TriPassOriginalMultichoice:\n\tmultichoice 19, 5, MULTICHOICE_SEAGALLOP_123, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToOneIsland2\n\tcase 1, EventScript_SailToTwoIsland2\n\tcase 2, EventScript_SailToThreeIsland2\n\tcase 3, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail\n\tend\n\nVermilionCity_EventScript_ShowEonTicket::\n\tsetflag FLAG_SHOWN_EON_TICKET\n\tmsgbox VermilionCity_Text_OhEonTicketTakeYouToSouthernIsland\n\tgoto VermilionCity_EventScript_CheckSeagallopPresentTrigger\n\nVermilionCity_EventScript_HasTicketsTriPass::\n\tmessage VermilionCity_Text_BoardSeagallopTriPass\n\twaitmessage\n\tsetvar VAR_0x8004, SEAGALLOP_VERMILION_CITY\n\tmultichoice 13, 6, MULTICHOICE_SEVII_OTHER, FALSE\n\tswitch VAR_RESULT\n\tcase 0, VermilionCity_EventScript_TriPassOriginalMultichoice\n\tcase 1, VermilionCity_EventScript_EventIslandsMultichoice\n\tcase 2, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail\n\tend\n\nVermilionCity_EventScript_EventIslandsMultichoice::\n\tsetvar VAR_RESULT, 1\n\tcallnative CheckEventTickets\n\tbuffernumberstring STR_VAR_1, VAR_RESULT\n\tswitch VAR_RESULT\n\tcase F, VermilionCity_EventScript_Faraway\n\tcase N, VermilionCity_EventScript_Navel\n\tcase NF, VermilionCity_EventScript_NavelFaraway\n\tcase B, VermilionCity_EventScript_Birth\n\tcase BF, VermilionCity_EventScript_BirthFaraway\n\tcase BN, VermilionCity_EventScript_BirthNavel\n\tcase BNF, VermilionCity_EventScript_BirthNavelFaraway\n\tcase S, VermilionCity_EventScript_Southern\n\tcase SF, VermilionCity_EventScript_SouthernFaraway\n\tcase SN, VermilionCity_EventScript_SouthernNavel\n\tcase SNF, VermilionCity_EventScript_SouthernNavelFaraway\n\tcase SB, VermilionCity_EventScript_SouthernBirth\n\tcase SBF, VermilionCity_EventScript_SouthernBirthFaraway\n\tcase SBN, VermilionCity_EventScript_SouthernBirthNavel\n\tcase SBNF, VermilionCity_EventScript_SouthernBirthNavelFaraway\n\tend\n\nVermilionCity_EventScript_Faraway::\n\tmultichoice 13, 8, MULTICHOICE_FARAWAY, FALSE\n\tswitch VAR_RESULT\n\tcase 0, VermilionCity_EventScript_SetSailToFarawayIsland\n\tcase 1, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_Navel::\n\tmultichoice 13, 8, MULTICHOICE_NAVEL, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToNavelRock\n\tcase 1, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_NavelFaraway::\n\tmultichoice 13, 6, MULTICHOICE_NAVEL_FARAWAY, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToNavelRock\n\tcase 1, VermilionCity_EventScript_SetSailToFarawayIsland\n\tcase 2, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_Birth::\n\tmultichoice 13, 8, MULTICHOICE_BIRTH, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToBirthIsland\n\tcase 1, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_BirthFaraway::\n\tmultichoice 13, 6, MULTICHOICE_BIRTH_FARAWAY, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToBirthIsland\n\tcase 1, VermilionCity_EventScript_SetSailToFarawayIsland\n\tcase 2, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_BirthNavel::\n\tmultichoice 13, 6, MULTICHOICE_BIRTH_NAVEL, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToBirthIsland\n\tcase 1, EventScript_SailToNavelRock\n\tcase 2, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_BirthNavelFaraway::\n\tmultichoice 13, 5, MULTICHOICE_BIRTH_NAVEL_FARAWAY, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToBirthIsland\n\tcase 1, EventScript_SailToNavelRock\n\tcase 2, VermilionCity_EventScript_SetSailToFarawayIsland\n\tcase 3, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_Southern::\n\tmultichoice 13, 8, MULTICHOICE_SOUTHERN, FALSE\n\tswitch VAR_RESULT\n\tcase 0, VermilionCity_EventScript_SetSailToSouthernIsland\n\tcase 1, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_SouthernFaraway::\n\tmultichoice 13, 6, MULTICHOICE_SOUTHERN_FARAWAY, FALSE\n\tswitch VAR_RESULT\n\tcase 0, VermilionCity_EventScript_SetSailToSouthernIsland\n\tcase 1, VermilionCity_EventScript_SetSailToFarawayIsland\n\tcase 2, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_SouthernNavel::\n\tmultichoice 13, 6, MULTICHOICE_SOUTHERN_NAVEL, FALSE\n\tswitch VAR_RESULT\n\tcase 0, VermilionCity_EventScript_SetSailToSouthernIsland\n\tcase 1, EventScript_SailToNavelRock\n\tcase 2, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_SouthernNavelFaraway::\n\tmultichoice 13, 5, MULTICHOICE_SOUTHERN_NAVEL_FARAWAY, FALSE\n\tswitch VAR_RESULT\n\tcase 0, VermilionCity_EventScript_SetSailToSouthernIsland\n\tcase 1, EventScript_SailToNavelRock\n\tcase 2, VermilionCity_EventScript_SetSailToFarawayIsland\n\tcase 3, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_SouthernBirth::\n\tmultichoice 13, 6, MULTICHOICE_SOUTHERN_BIRTH, FALSE\n\tswitch VAR_RESULT\n\tcase 0, VermilionCity_EventScript_SetSailToSouthernIsland\n\tcase 1, EventScript_SailToBirthIsland\n\tcase 2, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_SouthernBirthFaraway::\n\tmultichoice 13, 5, MULTICHOICE_SOUTHERN_BIRTH_FARAWAY, FALSE\n\tswitch VAR_RESULT\n\tcase 0, VermilionCity_EventScript_SetSailToSouthernIsland\n\tcase 1, EventScript_SailToBirthIsland\n\tcase 2, VermilionCity_EventScript_SetSailToFarawayIsland\n\tcase 3, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_SouthernBirthNavel::\n\tmultichoice 13, 5, MULTICHOICE_SOUTHERN_BIRTH_NAVEL, FALSE\n\tswitch VAR_RESULT\n\tcase 0, VermilionCity_EventScript_SetSailToSouthernIsland\n\tcase 1, EventScript_SailToBirthIsland\n\tcase 2, EventScript_SailToNavelRock\n\tcase 3, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_SouthernBirthNavelFaraway::\n\tmultichoice 13, 3, MULTICHOICE_SOUTHERN_BIRTH_NAVEL_FARAWAY, FALSE\n\tswitch VAR_RESULT\n\tcase 0, VermilionCity_EventScript_SetSailToSouthernIsland\n\tcase 1, EventScript_SailToBirthIsland\n\tcase 2, EventScript_SailToNavelRock\n\tcase 3, VermilionCity_EventScript_SetSailToFarawayIsland\n\tcase 4, EventScript_CancelSail\n\tcase 127, EventScript_CancelSail \n\tend\n\nVermilionCity_EventScript_CheckTicketLeft::\n\tlockall\n\tgoto VermilionCity_EventScript_CheckTicket\n\tend\n\nVermilionCity_EventScript_CheckTicketRight::\n\tlockall\n\tgoto VermilionCity_EventScript_CheckTicket\n\tend\n\nVermilionCity_EventScript_ExitedTicketCheck::\n\tlockall\n\tsetvar VAR_VERMILION_CITY_TICKET_CHECK_TRIGGER, 0\n\treleaseall\n\tend\n\nVermilionCity_EventScript_CheckTicket::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement LOCALID_FERRY_SAILOR, Common_Movement_WalkInPlaceFasterLeft\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tgoto_if_eq VAR_MAP_SCENE_VERMILION_CITY, 3, VermilionCity_EventScript_CheckSeagallopPresentTrigger\n\tmsgbox VermilionCity_Text_DoYouHaveATicket\n\tgoto_if_unset FLAG_GOT_SS_TICKET, VermilionCity_EventScript_DontHaveSSTicket\n\tmsgbox VermilionCity_Text_FlashedSSTicket\n\tsetvar VAR_VERMILION_CITY_TICKET_CHECK_TRIGGER, 1\n\treleaseall\n\tend\n\nVermilionCity_EventScript_DontHaveSSTicket::\n\tmsgbox VermilionCity_Text_DontHaveNeededSSTicket\n\tclosemessage\n\tgoto VermilionCity_EventScript_WalkUpPier\n\tend\n\nVermilionCity_EventScript_CheckSeagallopPresentTrigger::\n\tsetvar VAR_0x8004, SEAGALLOP_VERMILION_CITY\n\tgoto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, VermilionCity_EventScript_ChooseSeagallopDestRainbowPass\n\tgoto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 1, VermilionCity_EventScript_ChooseSeagallopDestTriPass\n\tmsgbox VermilionCity_Text_TheShipSetSail\n\tclosemessage\n\tgoto VermilionCity_EventScript_WalkUpPier\n\tend\n\nVermilionCity_EventScript_Sailor::\n\tmsgbox VermilionCity_Text_SSAnneVisitsOnceAYear, MSGBOX_NPC\n\tend\n\nVermilionCity_EventScript_OaksAide::\n\tlock\n\tfaceplayer\n\tsetflag FLAG_TALKED_TO_OAKS_AIDE_IN_VERMILION\n\tmsgbox VermilionCity_Text_Route2AideHasPackageForYou\n\trelease\n\tend\n\nVermilionCity_EventScript_OldMan2::\n\tmsgbox VermilionCity_Text_BuildingOnThisLand, MSGBOX_NPC\n\tend\n\nVermilionCity_EventScript_Machop::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_MACHOP, CRY_MODE_NORMAL\n\tmsgbox VermilionCity_Text_Machop\n\twaitmoncry\n\tmsgbox VermilionCity_Text_MachopStompingLandFlat\n\trelease\n\tend\n\nVermilionCity_EventScript_CitySign::\n\tmsgbox VermilionCity_Text_CitySign, MSGBOX_SIGN\n\tend\n\nVermilionCity_EventScript_SnorlaxNotice::\n\tmsgbox VermilionCity_Text_SnorlaxBlockingRoute12, MSGBOX_SIGN\n\tend\n\nVermilionCity_EventScript_PokemonFanClubSign::\n\tmsgbox VermilionCity_Text_PokemonFanClubSign, MSGBOX_SIGN\n\tend\n\nVermilionCity_EventScript_GymSign::\n\tlockall\n\tfamechecker FAMECHECKER_LTSURGE, 0\n\tmsgbox VermilionCity_Text_GymSign\n\treleaseall\n\tend\n\nVermilionCity_EventScript_HarborSign::\n\tmsgbox VermilionCity_Text_VermilionHarbor, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/VermilionCity/text.inc",
    "content": "VermilionCity_Text_GrimerMultipliesInSludge::\n    .string \"We're careful about pollution here.\\p\"\n    .string \"We've heard GRIMER multiplies in\\n\"\n    .string \"toxic sludge.$\"\n\nVermilionCity_Text_DidYouSeeSSAnneInHarbor::\n    .string \"Did you see the S.S. ANNE moored\\n\"\n    .string \"in the harbor?$\"\n\nVermilionCity_Text_SSAnneHasDepartedForYear::\n    .string \"So, the S.S. ANNE has departed?\\p\"\n    .string \"She'll be back in VERMILION about\\n\"\n    .string \"this time next year.$\"\n\nVermilionCity_Text_BuildingOnThisLand::\n    .string \"I'm putting up a building on this\\n\"\n    .string \"plot of land. I own it all.\\p\"\n    .string \"My POKéMON is tamping the land\\n\"\n    .string \"to lay the foundation.$\"\n\nVermilionCity_Text_Machop::\n    .string \"MACHOP: Guoh! Gogogoh!$\"\n\nVermilionCity_Text_MachopStompingLandFlat::\n    .string \"A MACHOP is stomping the land flat.$\"\n\nVermilionCity_Text_SSAnneVisitsOnceAYear::\n    .string \"The S.S. ANNE is a famous luxury\\n\"\n    .string \"cruise ship.\\p\"\n    .string \"It visits VERMILION once a year.$\"\n\nVermilionCity_Text_CitySign::\n    .string \"VERMILION CITY\\n\"\n    .string \"The Port of Exquisite Sunsets$\"\n\nVermilionCity_Text_SnorlaxBlockingRoute12::\n    .string \"NOTICE!\\p\"\n    .string \"ROUTE 12 may be blocked off by a\\n\"\n    .string \"sleeping POKéMON.\\p\"\n    .string \"Detour through ROCK TUNNEL to\\n\"\n    .string \"LAVENDER TOWN.\\p\"\n    .string \"VERMILION POLICE$\"\n\nVermilionCity_Text_PokemonFanClubSign::\n    .string \"POKéMON FAN CLUB\\n\"\n    .string \"All POKéMON fans welcome!$\"\n\nVermilionCity_Text_GymSign::\n    .string \"VERMILION CITY POKéMON GYM\\n\"\n    .string \"LEADER: LT. SURGE\\l\"\n    .string \"The Lightning American!$\"\n\nVermilionCity_Text_VermilionHarbor::\n    .string \"VERMILION HARBOR$\"\n\nVermilionCity_Text_WelcomeToTheSSAnne::\n    .string \"Welcome to the S.S. ANNE!$\"\n\nVermilionCity_Text_DoYouHaveATicket::\n    .string \"Welcome to the S.S. ANNE!\\p\"\n    .string \"Excuse me, do you have a ticket?$\"\n\nVermilionCity_Text_FlashedSSTicket::\n    .string \"{FONT_NORMAL}{PLAYER} flashed the S.S. TICKET!\\p\"\n    .string \"{FONT_MALE}Great!\\n\"\n    .string \"Welcome to the S.S. ANNE!$\"\n\nVermilionCity_Text_DontHaveNeededSSTicket::\n    .string \"{FONT_NORMAL}{PLAYER} doesn't have the needed\\n\"\n    .string \"S.S. TICKET.\\p\"\n    .string \"{FONT_MALE}Sorry!\\p\"\n    .string \"You need a ticket to get aboard.$\"\n\nVermilionCity_Text_TheShipSetSail::\n    .string \"The ship set sail.$\"\n\nVermilionCity_Text_BoardSeagallopTriPass::\n    .string \"Ah, you have a TRI-PASS.\\p\"\n    .string \"Would you like to board\\n\"\n    .string \"a SEAGALLOP ferry?$\"\n\nVermilionCity_Text_Seagallop7Departing::\n    .string \"Okay, everything's in order.\\p\"\n    .string \"SEAGALLOP HI-SPEED 7 will be\\n\"\n    .string \"departing immediately.$\"\n\nVermilionCity_Text_BoardSeagallopRainbowPass::\n    .string \"Ah, you have a RAINBOW PASS.\\p\"\n    .string \"Would you like to board\\n\"\n    .string \"a SEAGALLOP ferry?$\"\n\nVermilionCity_Text_OldSeaMapTakeYouToFarawayIsland::\n    .string \"What do you have there?\\n\"\n    .string \"A tattered old map, eh?\\p\"\n    .string \"Let's have a look.\\n\"\n    .string \"… … … … … …\\p\"\n    .string \"Where you're trying to go is an\\n\"\n    .string \"island that's far, far away.\\p\"\n    .string \"I can take you there, but it'll\\n\"\n    .string \"be a long trip.\\p\"\n    .string \"Let me know when you're ready\\n\"\n    .string \"to leave.$\"\n\nVermilionCity_Text_OhEonTicketTakeYouToSouthernIsland::\n    .string \"Oh! That's an EON TICKET!\\n\"\n    .string \"Now that is rare.\\p\"\n    .string \"It points to a tiny spit of an\\n\"\n    .string \"island south of HOENN.\\p\"\n    .string \"We'll be happy to take you to\\n\"\n    .string \"SOUTHERN ISLAND anytime.$\"\n\nVermilionCity_Text_OhMysticTicketTakeYouToNavelRock::\n    .string \"Oh! That's a MYSTICTICKET!\\n\"\n    .string \"Now that is rare.\\p\"\n    .string \"We'll be happy to take you to\\n\"\n    .string \"NAVEL ROCK anytime.$\"\n\nVermilionCity_Text_OhAuroraTicketTakeYouToBirthIsland::\n    .string \"Oh! That's an AURORATICKET!\\n\"\n    .string \"Now that is rare.\\p\"\n    .string \"We'll be happy to take you to\\n\"\n    .string \"BIRTH ISLAND anytime.$\"\n\nVermilionCity_Text_BoardSeagallopFerry::\n    .string \"Would you like to board\\n\"\n    .string \"a SEAGALLOP ferry?$\"\n\nVermilionCity_Text_Seagallop10Departing::\n    .string \"Okay, everything's in order for you\\n\"\n    .string \"to board a special ferry.\\p\"\n    .string \"SEAGALLOP HI-SPEED 10 will be\\n\"\n    .string \"departing immediately.$\"\n\nVermilionCity_Text_Seagallop12Departing::\n    .string \"Okay, everything's in order for you\\n\"\n    .string \"to board a special ferry.\\p\"\n    .string \"SEAGALLOP HI-SPEED 12 will be\\n\"\n    .string \"departing immediately.$\"\n\nVermilionCity_Text_Seagallop14Departing::\n    .string \"Okay, everything's in order for you\\n\"\n    .string \"to board a special ferry.\\p\"\n    .string \"SEAGALLOP HI-SPEED 14 will be\\n\"\n    .string \"departing immediately.$\"\n\nVermilionCity_Text_Seagallop13Departing::\n    .string \"Okay, everything's in order for you\\n\"\n    .string \"to board a special ferry to HOENN.\\p\"\n    .string \"SEAGALLOP HI-SPEED 13 will be\\n\"\n    .string \"departing immediately.$\"\n\nVermilionCity_Text_Route2AideHasPackageForYou::\n    .string \"Oh, hello, {PLAYER}!\\n\"\n    .string \"How are you doing?\\p\"\n    .string \"It's me, one of PROF. OAK's AIDES.\\p\"\n    .string \"Did you meet the other AIDE?\\p\"\n    .string \"He had a package from PROF. OAK\\n\"\n    .string \"for you, {PLAYER}.\\p\"\n    .string \"He said he'd look for you around\\n\"\n    .string \"ROUTE 2, {PLAYER}.\\p\"\n    .string \"If you're in the ROUTE 2 area,\\n\"\n    .string \"please look for him.$\"\n\n"
  },
  {
    "path": "data/maps/VermilionCity_Gym/map.json",
    "content": "{\n  \"id\": \"MAP_VERMILION_CITY_GYM\",\n  \"name\": \"VermilionCity_Gym\",\n  \"layout\": \"LAYOUT_VERMILION_CITY_GYM\",\n  \"music\": \"MUS_GYM\",\n  \"region_map_section\": \"MAPSEC_VERMILION_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_GYM\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LT_SURGE\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_Gym_EventScript_LtSurge\",\n      \"flag\": \"FLAG_TEMP_2\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ENGINEER\",\n      \"x\": 2,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"VermilionCity_Gym_EventScript_Baily\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SAILOR\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"VermilionCity_Gym_EventScript_Dwayne\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GYM_GUY\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_Gym_EventScript_GymGuy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"VermilionCity_Gym_EventScript_Tucker\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"9\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"9\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"9\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_GymStatue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 17,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_GymStatue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan4\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan5\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan6\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan7\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan8\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan9\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan10\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 1,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan11\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 3,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan12\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan13\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan14\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 14,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_Gym_EventScript_TrashCan15\"\n    }\n  ],\n  \"level_scaling\": \"2\"\n}\n"
  },
  {
    "path": "data/maps/VermilionCity_Gym/scripts.inc",
    "content": ".equ FOUND_FIRST_SWITCH, FLAG_TEMP_1\n.equ SWITCH1_ID,         VAR_0x8004\n.equ SWITCH2_ID,         VAR_0x8005\n.equ TRASH_CAN_ID,       VAR_0x8008\n\n.equ CHECK_VISITOR_STATE, 6\n.equ TYPE, VAR_0x8003\n.equ ARGUMENT, VAR_0x8004\n\nVermilionCity_Gym_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, VermilionCity_Gym_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, VermilionCity_Gym_OnTransition\n\t.byte 0\n\nVermilionCity_Gym_OnLoad::\n\tcall_if_set FOUND_FIRST_SWITCH, VermilionCity_Gym_EventScript_SetOneBeamOff\n\tcall_if_set FLAG_FOUND_BOTH_VERMILION_GYM_SWITCHES, VermilionCity_Gym_EventScript_SetBeamsOff\n\tend\n\nVermilionCity_Gym_EventScript_SetOneBeamOff::\n\tsetmetatile 3, 6, METATILE_VermilionGym_Beam_Node_TopLeft_HalfOn, 1\n\tsetmetatile 4, 6, METATILE_VermilionGym_Beam_Node_TopLeft_Edge_HalfOn, 1\n\tsetmetatile 5, 6, METATILE_VermilionGym_Beam_MidTop_HalfOn, 1\n\tsetmetatile 6, 6, METATILE_VermilionGym_Beam_Node_TopRight_Edge_HalfOn, 1\n\tsetmetatile 7, 6, METATILE_VermilionGym_Beam_Node_TopRight_HalfOn, 1\n\tsetmetatile 3, 7, METATILE_VermilionGym_Beam_Node_BottomLeft_HalfOn, 1\n\tsetmetatile 4, 7, METATILE_VermilionGym_Beam_Node_BottomLeft_Edge_HalfOn, 1\n\tsetmetatile 5, 7, METATILE_VermilionGym_Beam_MidBottom_HalfOn, 1\n\tsetmetatile 6, 7, METATILE_VermilionGym_Beam_Node_BottomRight_Edge_HalfOn, 1\n\tsetmetatile 7, 7, METATILE_VermilionGym_Beam_Node_BottomRight_HalfOn, 1\n\treturn\n\nVermilionCity_Gym_EventScript_SetBeamsOff::\n\tsetmetatile 3, 6, METATILE_VermilionGym_Beam_Node_TopLeft_Off, 1\n\tsetmetatile 4, 6, METATILE_VermilionGym_Beam_Node_TopLeft_Edge_Off, 0\n\tsetmetatile 5, 6, METATILE_VermilionGym_Floor, 0\n\tsetmetatile 6, 6, METATILE_VermilionGym_Beam_Node_TopRight_Edge_Off, 0\n\tsetmetatile 7, 6, METATILE_VermilionGym_Beam_Node_TopRight_Off, 1\n\tsetmetatile 3, 7, METATILE_VermilionGym_Beam_Node_BottomLeft_Off, 1\n\tsetmetatile 4, 7, METATILE_VermilionGym_Beam_Node_BottomLeft_Edge_Off, 0\n\tsetmetatile 5, 7, METATILE_VermilionGym_Floor, 0\n\tsetmetatile 6, 7, METATILE_VermilionGym_Beam_Node_BottomRight_Edge_Off, 0\n\tsetmetatile 7, 7, METATILE_VermilionGym_Beam_Node_BottomRight_Off, 1\n\treturn\n\nVermilionCity_Gym_OnTransition::\n\tcall VermilionCity_Gym_EventScript_InitTrashCans\n\tsetvar TYPE, CHECK_VISITOR_STATE\n\tcopyvar VAR_0x800A, ARGUMENT\n\tsetvar ARGUMENT, FAMECHECKER_LTSURGE\n\tcallnative UseBattleHouseVar\n\tcall_if_eq VAR_RESULT, 1, VermilionCity_Gym_EventScript_HideLtSurge\n\tcopyvar ARGUMENT, VAR_0x800A\n\tend\n\nVermilionCity_Gym_EventScript_HideLtSurge::\n\tsetflag FLAG_TEMP_2\n\treturn\n\nVermilionCity_Gym_EventScript_InitTrashCans::\n\tgoto_if_set FLAG_FOUND_BOTH_VERMILION_GYM_SWITCHES, EventScript_Return\n\tspecial SetVermilionTrashCans\n\tcopyvar VAR_TEMP_0, SWITCH1_ID\n\tcopyvar VAR_TEMP_1, SWITCH2_ID\n\treturn\n\nVermilionCity_Gym_EventScript_TrashCan1::\n\tlockall\n\tsetvar TRASH_CAN_ID, 1\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan2::\n\tlockall\n\tsetvar TRASH_CAN_ID, 2\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan3::\n\tlockall\n\tsetvar TRASH_CAN_ID, 3\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan4::\n\tlockall\n\tsetvar TRASH_CAN_ID, 4\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan5::\n\tlockall\n\tsetvar TRASH_CAN_ID, 5\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan6::\n\tlockall\n\tsetvar TRASH_CAN_ID, 6\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan7::\n\tlockall\n\tsetvar TRASH_CAN_ID, 7\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan8::\n\tlockall\n\tsetvar TRASH_CAN_ID, 8\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan9::\n\tlockall\n\tsetvar TRASH_CAN_ID, 9\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan10::\n\tlockall\n\tsetvar TRASH_CAN_ID, 10\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan11::\n\tlockall\n\tsetvar TRASH_CAN_ID, 11\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan12::\n\tlockall\n\tsetvar TRASH_CAN_ID, 12\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan13::\n\tlockall\n\tsetvar TRASH_CAN_ID, 13\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan14::\n\tlockall\n\tsetvar TRASH_CAN_ID, 14\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan15::\n\tlockall\n\tsetvar TRASH_CAN_ID, 15\n\tgoto VermilionCity_Gym_EventScript_TrashCan\n\tend\n\nVermilionCity_Gym_EventScript_TrashCan::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tcopyvar SWITCH1_ID, VAR_TEMP_0\n\tcopyvar SWITCH2_ID, VAR_TEMP_1\n\tgoto_if_set FLAG_FOUND_BOTH_VERMILION_GYM_SWITCHES, VermilionCity_Gym_EventScript_LocksAlreadyOpen\n\tgoto_if_set FOUND_FIRST_SWITCH, VermilionCity_Gym_EventScript_TrySwitchTwo\n\tgoto_if_eq SWITCH1_ID, TRASH_CAN_ID, VermilionCity_Gym_EventScript_FoundSwitchOne\n\tmsgbox VermilionCity_Gym_Text_NopeOnlyTrashHere\n\treleaseall\n\tend\n\nVermilionCity_Gym_EventScript_FoundSwitchOne::\n\tmsgbox VermilionCity_Gym_Text_SwitchUnderTrashFirstLockOpened\n\tplayse SE_PIN\n\twaitse\n\tcall VermilionCity_Gym_EventScript_SetOneBeamOff\n\tspecial DrawWholeMapView\n\tsetflag FOUND_FIRST_SWITCH\n\treleaseall\n\tend\n\nVermilionCity_Gym_EventScript_TrySwitchTwo::\n\tgoto_if_eq SWITCH2_ID, TRASH_CAN_ID, VermilionCity_Gym_EventScript_FoundSwitchTwo\n\tmsgbox VermilionCity_Gym_Text_OnlyTrashLocksWereReset\n\tclearflag FOUND_FIRST_SWITCH\n\tspecial SetVermilionTrashCans\n\tcopyvar VAR_TEMP_0, SWITCH1_ID\n\tcopyvar VAR_TEMP_1, SWITCH2_ID\n\tcall VermilionCity_Gym_EventScript_SetBeamsOn\n\tspecial DrawWholeMapView\n\treleaseall\n\tend\n\nVermilionCity_Gym_EventScript_FoundSwitchTwo::\n\tmsgbox VermilionCity_Gym_Text_SecondLockOpened\n\tclosemessage\n\tcall VermilionCity_Gym_EventScript_SetBeamsOff\n\tspecial DrawWholeMapView\n\tplayse SE_UNLOCK\n\twaitse\n\tsetflag FLAG_FOUND_BOTH_VERMILION_GYM_SWITCHES\n\treleaseall\n\tend\n\nVermilionCity_Gym_EventScript_LocksAlreadyOpen::\n\tmsgbox VermilionCity_Gym_Text_NopeOnlyTrashHere\n\treleaseall\n\tend\n\nVermilionCity_Gym_EventScript_SetBeamsOn::\n\tsetmetatile 3, 6, METATILE_VermilionGym_Beam_Node_TopLeft_On, 1\n\tsetmetatile 4, 6, METATILE_VermilionGym_Beam_Node_TopLeft_Edge_On, 1\n\tsetmetatile 5, 6, METATILE_VermilionGym_Beam_MidTop, 1\n\tsetmetatile 6, 6, METATILE_VermilionGym_Beam_Node_TopRight_Edge_On, 1\n\tsetmetatile 7, 6, METATILE_VermilionGym_Beam_Node_TopRight_On, 1\n\tsetmetatile 3, 7, METATILE_VermilionGym_Beam_Node_BottomLeft_On, 1\n\tsetmetatile 4, 7, METATILE_VermilionGym_Beam_Node_BottomLeft_Edge_On, 1\n\tsetmetatile 5, 7, METATILE_VermilionGym_Beam_MidBottom, 1\n\tsetmetatile 6, 7, METATILE_VermilionGym_Beam_Node_BottomRight_Edge_On, 1\n\tsetmetatile 7, 7, METATILE_VermilionGym_Beam_Node_BottomRight_On, 1\n\treturn\n\nVermilionCity_Gym_EventScript_LtSurge::\n\tfamechecker FAMECHECKER_LTSURGE, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, VermilionCity_Gym_EventScript_LtSurge_ChallengeMode\n\ttrainerbattle_single TRAINER_LEADER_LT_SURGE, VermilionCity_Gym_Text_LtSurgeIntro, VermilionCity_Gym_Text_LtSurgeDefeat, VermilionCity_Gym_EventScript_DefeatedLtSurge, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_LT_SURGE_CHALLENGE\n\tgoto_if_unset FLAG_GOT_TM34_FROM_SURGE, VermilionCity_Gym_EventScript_GiveTM34\n\tmsgbox VermilionCity_Gym_Text_LtSurgePostBattle\n\trelease\n\tend\n\nVermilionCity_Gym_EventScript_LtSurge_ChallengeMode::\n\ttrainerbattle_single TRAINER_LEADER_LT_SURGE_CHALLENGE, VermilionCity_Gym_Text_LtSurgeIntro, VermilionCity_Gym_Text_LtSurgeDefeat, VermilionCity_Gym_EventScript_DefeatedLtSurge, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_LT_SURGE\n\tgoto_if_unset FLAG_GOT_TM34_FROM_SURGE, VermilionCity_Gym_EventScript_GiveTM34\n\tmsgbox VermilionCity_Gym_Text_LtSurgePostBattle\n\trelease\n\tend\n\nVermilionCity_Gym_EventScript_DefeatedLtSurge::\n\tfamechecker FAMECHECKER_LTSURGE, 1\n\tcall_if_unset FLAG_GOT_HM05, VermilionCity_Gym_EventScript_ShowOaksAide\n\tclearflag FLAG_HIDE_FAME_CHECKER_LT_SURGE_JOURNAL\n\tsetflag FLAG_DEFEATED_LT_SURGE\n\tsetflag FLAG_BADGE03_GET\n\tset_gym_trainers 3\n\tgoto VermilionCity_Gym_EventScript_GiveTM34\n\tend\n\nVermilionCity_Gym_EventScript_ShowOaksAide::\n\tclearflag FLAG_HIDE_VERMILION_CITY_OAKS_AIDE\n\treturn\n\nVermilionCity_Gym_EventScript_GiveTM34::\n\tmsgbox VermilionCity_Gym_Text_ExplainThunderBadgeTakeThis\n\tcheckitemspace ITEM_TM34\n\tgoto_if_eq VAR_RESULT, FALSE, VermilionCity_Gym_EventScript_NoRoomForTM34\n\tgiveitem_msg VermilionCity_Gym_Text_ReceivedTM34FromLtSurge, ITEM_TM34\n\tsetflag FLAG_GOT_TM34_FROM_SURGE\n\tmsgbox VermilionCity_Gym_Text_ExplainTM34\n\trelease\n\tend\n\nVermilionCity_Gym_EventScript_NoRoomForTM34::\n\tmsgbox VermilionCity_Gym_Text_MakeRoomInYourBag\n\trelease\n\tend\n\nVermilionCity_Gym_EventScript_Dwayne::\n\ttrainerbattle_single TRAINER_SAILOR_DWAYNE, VermilionCity_Gym_Text_DwayneIntro, VermilionCity_Gym_Text_DwayneDefeat\n\tfamechecker FAMECHECKER_LTSURGE, 4\n\tmsgbox VermilionCity_Gym_Text_DwaynePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVermilionCity_Gym_EventScript_Baily::\n\ttrainerbattle_single TRAINER_ENGINEER_BAILY, VermilionCity_Gym_Text_BailyIntro, VermilionCity_Gym_Text_BailyDefeat\n\tmsgbox VermilionCity_Gym_Text_BailyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVermilionCity_Gym_EventScript_Tucker::\n\ttrainerbattle_single TRAINER_GENTLEMAN_TUCKER, VermilionCity_Gym_Text_TuckerIntro, VermilionCity_Gym_Text_TuckerDefeat, VermilionCity_Gym_EventScript_DefeatedTucker\n\tfamechecker FAMECHECKER_LTSURGE, 3\n\tmsgbox VermilionCity_Gym_Text_TuckerPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVermilionCity_Gym_EventScript_DefeatedTucker::\n\tfamechecker FAMECHECKER_LTSURGE, 2\n\trelease\n\tend\n\nVermilionCity_Gym_EventScript_GymGuy::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_DEFEATED_LT_SURGE, VermilionCity_Gym_EventScript_GymGuyPostVictory\n\tmsgbox VermilionCity_Gym_Text_GymGuyAdvice\n\trelease\n\tend\n\nVermilionCity_Gym_EventScript_GymGuyPostVictory::\n\tmsgbox VermilionCity_Gym_Text_GymGuyPostVictory\n\trelease\n\tend\n\nVermilionCity_Gym_EventScript_GymStatue::\n\tlockall\n\tgoto_if_set FLAG_BADGE03_GET, VermilionCity_Gym_EventScript_GymStatuePostVictory\n\tmsgbox VermilionCity_Gym_Text_GymStatue\n\treleaseall\n\tend\n\nVermilionCity_Gym_EventScript_GymStatuePostVictory::\n\tmsgbox VermilionCity_Gym_Text_GymStatuePlayerWon\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/VermilionCity_Gym/text.inc",
    "content": "VermilionCity_Gym_Text_LtSurgeIntro::\n    .string \"Hey, kid! What do you think you're\\n\"\n    .string \"doing here?\\p\"\n    .string \"You won't live long in combat!\\n\"\n    .string \"Not with your puny power!\\p\"\n    .string \"I tell you, kid, electric POKéMON\\n\"\n    .string \"saved me during the war!\\p\"\n    .string \"They zapped my enemies into\\n\"\n    .string \"paralysis!\\p\"\n    .string \"The same as I'll do to you!{PLAY_BGM}{MUS_ENCOUNTER_GYM_LEADER}$\"\n\nVermilionCity_Gym_Text_LtSurgePostBattle::\n    .string \"A little word of advice, kid!\\p\"\n    .string \"Electricity is sure powerful!\\p\"\n    .string \"But, it's useless against GROUND-\\n\"\n    .string \"type POKéMON!$\"\n\nVermilionCity_Gym_Text_ExplainThunderBadgeTakeThis::\n    .string \"The THUNDERBADGE cranks up your\\n\"\n    .string \"POKéMON's SPEED!\\p\"\n    .string \"It also lets your POKéMON FLY\\n\"\n    .string \"lightning-quick anytime, kid!\\p\"\n    .string \"You're special, kid!\\n\"\n    .string \"Take this!$\"\n\nVermilionCity_Gym_Text_ReceivedTM34FromLtSurge::\n    .string \"{PLAYER} received TM34\\n\"\n    .string \"from LT. SURGE.$\"\n\nVermilionCity_Gym_Text_ExplainTM34::\n    .string \"TM34 contains SHOCK WAVE!\\p\"\n    .string \"Teach it to an ELECTRIC POKéMON!$\"\n\nVermilionCity_Gym_Text_MakeRoomInYourBag::\n    .string \"Yo, kid, make room in your BAG!$\"\n\nVermilionCity_Gym_Text_LtSurgeDefeat::\n    .string \"Now that's a shocker!\\p\"\n    .string \"You're the real deal, kid!\\p\"\n    .string \"Fine, then, take the THUNDERBADGE!$\"\n\nVermilionCity_Gym_Text_TuckerIntro::\n    .string \"When I was in the Army, LT. SURGE\\n\"\n    .string \"was my strict CO.\\p\"\n    .string \"He was a hard taskmaster.$\"\n\nVermilionCity_Gym_Text_TuckerDefeat::\n    .string \"Stop!\\n\"\n    .string \"You're very good!$\"\n\nVermilionCity_Gym_Text_TuckerPostBattle::\n    .string \"It's not easy opening that door.\\p\"\n    .string \"LT. SURGE was always famous for\\n\"\n    .string \"his cautious nature in the Army.$\"\n\nVermilionCity_Gym_Text_BailyIntro::\n    .string \"I'm a lightweight, but I'm good\\n\"\n    .string \"with electricity!\\p\"\n    .string \"That's why I joined this GYM.$\"\n\nVermilionCity_Gym_Text_BailyDefeat::\n    .string \"Fried!$\"\n\nVermilionCity_Gym_Text_BailyPostBattle::\n    .string \"Okay, I'll talk!\\p\"\n    .string \"LT. SURGE said he hid door\\n\"\n    .string \"switches inside something.$\"\n\nVermilionCity_Gym_Text_DwayneIntro::\n    .string \"This is no place for kids!\\n\"\n    .string \"Not even if you're good!$\"\n\nVermilionCity_Gym_Text_DwayneDefeat::\n    .string \"Wow!\\n\"\n    .string \"Surprised me!$\"\n\nVermilionCity_Gym_Text_DwaynePostBattle::\n    .string \"LT. SURGE installed the traps in\\n\"\n    .string \"the GYM himself.\\p\"\n    .string \"He set up double locks everywhere.\\n\"\n    .string \"Let me give you a hint.\\p\"\n    .string \"When you open the first lock, the\\n\"\n    .string \"second lock is right next to it.$\"\n\nVermilionCity_Gym_Text_GymGuyAdvice::\n    .string \"Yo!\\n\"\n    .string \"Champ in the making!\\p\"\n    .string \"LT. SURGE has a nickname.\\p\"\n    .string \"People refer to him as the\\n\"\n    .string \"Lightning American!\\p\"\n    .string \"He's an expert on electric\\n\"\n    .string \"POKéMON.\\p\"\n    .string \"BIRD/WATER-type POKéMON match\\n\"\n    .string \"poorly against the ELECTRIC type.\\p\"\n    .string \"Beware of paralysis, too.\\p\"\n    .string \"LT. SURGE is very cautious.\\p\"\n    .string \"He's locked himself in, so it won't\\n\"\n    .string \"be easy getting to him.$\"\n\nVermilionCity_Gym_Text_GymGuyPostVictory::\n    .string \"Whew!\\n\"\n    .string \"That match was electric!$\"\n\nVermilionCity_Gym_Text_GymStatue::\n    .string \"VERMILION POKéMON GYM\\n\"\n    .string \"LEADER: LT. SURGE\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}$\"\n\nVermilionCity_Gym_Text_GymStatuePlayerWon::\n    .string \"VERMILION POKéMON GYM\\n\"\n    .string \"LEADER: LT. SURGE\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}, {PLAYER}$\"\n\nVermilionCity_Gym_Text_NopeOnlyTrashHere::\n    .string \"Nope!\\n\"\n    .string \"There's only trash here.$\"\n\nVermilionCity_Gym_Text_SwitchUnderTrashFirstLockOpened::\n    .string \"Hey! There's a switch under the\\n\"\n    .string \"trash! Turn it on!\\p\"\n    .string \"The first electric lock opened!$\"\n\nVermilionCity_Gym_Text_SecondLockOpened::\n    .string \"The second electric lock opened!\\n\"\n    .string \"The motorized door opened!$\"\n\nVermilionCity_Gym_Text_OnlyTrashLocksWereReset::\n    .string \"Nope!\\n\"\n    .string \"There's only trash here.\\p\"\n    .string \"Hey!\\n\"\n    .string \"The electric locks were reset!$\"\n\n"
  },
  {
    "path": "data/maps/VermilionCity_House1/map.json",
    "content": "{\n  \"id\": \"MAP_VERMILION_CITY_HOUSE1\",\n  \"name\": \"VermilionCity_House1\",\n  \"layout\": \"LAYOUT_HOUSE1\",\n  \"music\": \"MUS_FUCHSIA\",\n  \"region_map_section\": \"MAPSEC_VERMILION_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FISHER\",\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_House1_EventScript_FishingGuru\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/VermilionCity_House1/scripts.inc",
    "content": "VermilionCity_House1_MapScripts::\n\t.byte 0\n\nVermilionCity_House1_EventScript_FishingGuru::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_OLD_ROD, VermilionCity_House1_EventScript_AlreadyGotOldRod\n\tmsgbox VermilionCity_House1_Text_ImFishingGuruDoYouLikeToFish, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, VermilionCity_House1_EventScript_GiveOldRod\n\tmsgbox VermilionCity_House1_Text_OhThatsSoDisappointing\n\trelease\n\tend\n\nVermilionCity_House1_EventScript_AlreadyGotOldRod::\n\tmsgbox VermilionCity_House1_Text_HowAreTheFishBiting\n\trelease\n\tend\n\nVermilionCity_House1_EventScript_GiveOldRod::\n\tcheckitemspace ITEM_OLD_ROD\n\tgoto_if_eq VAR_RESULT, FALSE, VermilionCity_House1_EventScript_NoRoomForOldRod\n\tadditem ITEM_OLD_ROD\n\tmsgbox VermilionCity_House1_Text_TakeThisAndFish\n\tmsgreceiveditem VermilionCity_House1_Text_ReceivedOldRodFromFishingGuru, ITEM_OLD_ROD\n\tsetflag FLAG_GOT_OLD_ROD\n\tmsgbox VermilionCity_House1_Text_FishingIsAWayOfLife\n\trelease\n\tend\n\nVermilionCity_House1_EventScript_NoRoomForOldRod::\n\tmsgbox VermilionCity_House1_Text_NoRoomForNiceGift\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/VermilionCity_House1/text.inc",
    "content": "VermilionCity_House1_Text_ImFishingGuruDoYouLikeToFish::\n    .string \"I'm the FISHING GURU!\\p\"\n    .string \"I simply looove fishing!\\n\"\n    .string \"I can't bear to go without.\\p\"\n    .string \"Tell me, do you like to fish?$\"\n\nVermilionCity_House1_Text_TakeThisAndFish::\n    .string \"Grand! I like your style.\\n\"\n    .string \"I think we can be friends.\\p\"\n    .string \"Take this and fish, young friend!$\"\n\nVermilionCity_House1_Text_ReceivedOldRodFromFishingGuru::\n    .string \"{PLAYER} received an OLD ROD from\\n\"\n    .string \"the FISHING GURU.$\"\n\nVermilionCity_House1_Text_FishingIsAWayOfLife::\n    .string \"Fishing is a way of life!\\n\"\n    .string \"It is like the finest poetry.\\p\"\n    .string \"From the seas to rivers, go out\\n\"\n    .string \"and land the big one, my friend.$\"\n\nVermilionCity_House1_Text_OhThatsSoDisappointing::\n    .string \"Oh…\\n\"\n    .string \"That's so disappointing…$\"\n\nVermilionCity_House1_Text_HowAreTheFishBiting::\n    .string \"Hello there, {PLAYER}!\\p\"\n    .string \"How are the fish biting?$\"\n\nVermilionCity_House1_Text_NoRoomForNiceGift::\n    .string \"Oh, no!\\p\"\n    .string \"I had a nice gift for you, but you\\n\"\n    .string \"have no room for it!$\"\n\n"
  },
  {
    "path": "data/maps/VermilionCity_House2/map.json",
    "content": "{\n  \"id\": \"MAP_VERMILION_CITY_HOUSE2\",\n  \"name\": \"VermilionCity_House2\",\n  \"layout\": \"LAYOUT_HOUSE1\",\n  \"music\": \"MUS_VERMILLION\",\n  \"region_map_section\": \"MAPSEC_VERMILION_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_House2_EventScript_Elyssa\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_BOY\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_House2_EventScript_FuryCutterTutor\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"6\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"6\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/VermilionCity_House2/scripts.inc",
    "content": "VermilionCity_House2_MapScripts::\n\t.byte 0\n\nVermilionCity_House2_EventScript_Elyssa::\n\tlock\n\tfaceplayer\n\tsetvar VAR_0x8008, INGAME_TRADE_FARFETCHD\n\tcall EventScript_GetInGameTradeSpeciesInfo\n\tgoto_if_set FLAG_DID_CH_DING_TRADE, VermilionCity_House2_EventScript_AlreadyTraded\n\tmsgbox VermilionCity_House2_Text_DoYouHaveMonWantToTradeForMyMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, VermilionCity_House2_EventScript_DeclineTrade\n\tcall EventScript_ChooseMonForInGameTrade\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, VermilionCity_House2_EventScript_DeclineTrade\n\tcall EventScript_GetInGameTradeSpecies\n\tgoto_if_ne VAR_RESULT, VAR_0x8009, VermilionCity_House2_EventScript_NotRequestedMon\n\tcall EventScript_DoInGameTrade\n\tmsgbox VermilionCity_House2_Text_ThankYou\n\tsetflag FLAG_DID_CH_DING_TRADE\n\trelease\n\tend\n\nVermilionCity_House2_EventScript_DeclineTrade::\n\tmsgbox VermilionCity_House2_Text_ThatsTooBad\n\trelease\n\tend\n\nVermilionCity_House2_EventScript_NotRequestedMon::\n\tbufferspeciesname STR_VAR_1, VAR_0x8009\n\tmsgbox VermilionCity_House2_Text_ThisIsNoMon\n\trelease\n\tend\n\nVermilionCity_House2_EventScript_AlreadyTraded::\n\tmsgbox VermilionCity_House2_Text_HowIsMyOldMon\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/VermilionCity_House2/text.inc",
    "content": "VermilionCity_House2_Text_DoYouHaveMonWantToTradeForMyMon::\n\t.string \"Hi!\\n\"\n\t.string \"Do you have a {STR_VAR_1}?\\p\"\n\t.string \"Want to trade it for my\\n\"\n\t.string \"{STR_VAR_2}?$\"\n\nVermilionCity_House2_Text_ThatsTooBad::\n\t.string \"That's too bad.$\"\n\nVermilionCity_House2_Text_ThisIsNoMon::\n\t.string \"…This is no {STR_VAR_1}.\\p\"\n\t.string \"If you get one, please trade it\\n\"\n\t.string \"to me!$\"\n\nVermilionCity_House2_Text_ThankYou::\n\t.string \"Thank you!$\"\n\nVermilionCity_House2_Text_HowIsMyOldMon::\n\t.string \"How is my old {STR_VAR_2}?\\p\"\n\t.string \"My {STR_VAR_1} is doing great!$\"\n"
  },
  {
    "path": "data/maps/VermilionCity_House3/map.json",
    "content": "{\n  \"id\": \"MAP_VERMILION_CITY_HOUSE3\",\n  \"name\": \"VermilionCity_House3\",\n  \"layout\": \"LAYOUT_HOUSE1\",\n  \"music\": \"MUS_VERMILLION\",\n  \"region_map_section\": \"MAPSEC_VERMILION_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_House3_EventScript_Boy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PIDGEY\",\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_House3_EventScript_Pidgey\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLIPBOARD\",\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"0x0\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"x\": 2,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_House3_EventScript_Lass\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"8\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"8\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_House3_EventScript_Letter\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/VermilionCity_House3/scripts.inc",
    "content": "VermilionCity_House3_MapScripts::\n\t.byte 0\n\nVermilionCity_House3_EventScript_Boy::\n\tmsgbox VermilionCity_House3_Text_PidgeyFlyLetterToSaffron, MSGBOX_NPC\n\tend\n\nVermilionCity_House3_EventScript_Lass::\n\tmsgbox VermilionCity_House3_Text_SendMyPidgeyToUnionRoom, MSGBOX_NPC\n\tend\n\nVermilionCity_House3_EventScript_Pidgey::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_PIDGEY, CRY_MODE_NORMAL\n\tmsgbox VermilionCity_House3_Text_Pidgey\n\twaitmoncry\n\trelease\n\tend\n\nVermilionCity_House3_EventScript_Letter::\n\tmsgbox VermilionCity_House3_Text_DearPippiLetter, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/VermilionCity_House3/text.inc",
    "content": "VermilionCity_House3_Text_PidgeyFlyLetterToSaffron::\n    .string \"I'm getting my PIDGEY to fly a\\n\"\n    .string \"letter to SAFFRON in the north.$\"\n\nVermilionCity_House3_Text_Pidgey::\n    .string \"PIDGEY: Kurukkoo!$\"\n\nVermilionCity_House3_Text_DearPippiLetter::\n    .string \"Dear PIPPI,\\n\"\n    .string \"I hope to see you soon.\\p\"\n    .string \"I heard SAFFRON has problems with\\n\"\n    .string \"TEAM ROCKET.\\p\"\n    .string \"VERMILION appears to be safe.$\"\n\nVermilionCity_House3_Text_SendMyPidgeyToUnionRoom::\n    .string \"I want to exchange MAIL with all\\n\"\n    .string \"sorts of people.\\p\"\n    .string \"I send my PIDGEY to a UNION ROOM\\n\"\n    .string \"to exchange MAIL for me.$\"\n\n"
  },
  {
    "path": "data/maps/VermilionCity_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_VERMILION_CITY_MART\",\n  \"name\": \"VermilionCity_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_VERMILION_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_Mart_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_Mart_EventScript_CooltrainerF\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 9,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_Mart_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"7\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"7\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/VermilionCity_Mart/scripts.inc",
    "content": "VermilionCity_Mart_MapScripts::\n\t.byte 0\n\nVermilionCity_Mart_EventScript_CooltrainerF::\n\tmsgbox VermilionCity_Mart_Text_MonsGoodOrBadDependingOnTrainer, MSGBOX_NPC\n\tend\n\nVermilionCity_Mart_EventScript_BaldingMan::\n\tmsgbox VermilionCity_Mart_Text_TeamRocketAreWickedPeople, MSGBOX_NPC\n\tend\n\nVermilionCity_Mart_EventScript_Clerk::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart VermilionCity_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nVermilionCity_Mart_Items::\n\t.2byte ITEM_POKE_BALL\n\t.2byte ITEM_SUPER_POTION\n\t.2byte ITEM_ANTIDOTE\n\t.2byte ITEM_PARALYZE_HEAL\n\t.2byte ITEM_AWAKENING\n\t.2byte ITEM_ICE_HEAL\n\t.2byte ITEM_REPEL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n"
  },
  {
    "path": "data/maps/VermilionCity_Mart/text.inc",
    "content": "VermilionCity_Mart_Text_TeamRocketAreWickedPeople::\n    .string \"There are wicked people who will\\n\"\n    .string \"use POKéMON for criminal acts.\\p\"\n    .string \"TEAM ROCKET traffics in rare\\n\"\n    .string \"POKéMON, for example.\\p\"\n    .string \"They also abandon POKéMON that\\n\"\n    .string \"they consider unpopular or useless.\\p\"\n    .string \"That's the sort of horrid people\\n\"\n    .string \"they are, TEAM ROCKET.$\"\n\nVermilionCity_Mart_Text_MonsGoodOrBadDependingOnTrainer::\n    .string \"I think POKéMON can be good or\\n\"\n    .string \"bad. It depends on the TRAINER.$\"\n\n"
  },
  {
    "path": "data/maps/VermilionCity_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_VERMILION_CITY_POKEMON_CENTER_1F\",\n  \"name\": \"VermilionCity_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_VERMILION_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MAN\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonCenter_1F_EventScript_Man\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_HIKER\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonCenter_1F_EventScript_Hiker\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonCenter_1F_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonCenter_1F_EventScript_VSSeekerWoman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonCenter_1F_EventScript_PokemonJournalLtSurge\",\n      \"flag\": \"FLAG_HIDE_FAME_CHECKER_LT_SURGE_JOURNAL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"0\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_INVISIBLE\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonCenter_1F_EventScript_PokemonJournalLtSurge\",\n      \"flag\": \"FLAG_HIDE_FAME_CHECKER_LT_SURGE_JOURNAL\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_VERMILION_CITY_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/VermilionCity_PokemonCenter_1F/scripts.inc",
    "content": "VermilionCity_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, VermilionCity_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nVermilionCity_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_VERMILION_CITY\n\tend\n\nVermilionCity_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nVermilionCity_PokemonCenter_1F_EventScript_Man::\n\tmsgbox VermilionCity_PokemonCenter_1F_Text_PoisonedMonFaintedWhileWalking, MSGBOX_NPC\n\tend\n\nVermilionCity_PokemonCenter_1F_EventScript_Hiker::\n\tmsgbox VermilionCity_PokemonCenter_1F_Text_TrainerMonsStrongerThanWild, MSGBOX_NPC\n\tend\n\nVermilionCity_PokemonCenter_1F_EventScript_Youngster::\n\tmsgbox VermilionCity_PokemonCenter_1F_Text_AllMonWeakToSpecificTypes, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/VermilionCity_PokemonCenter_1F/text.inc",
    "content": "VermilionCity_PokemonCenter_1F_Text_TrainerMonsStrongerThanWild::\n    .string \"Even if they are the same level,\\n\"\n    .string \"POKéMON can have very different\\l\"\n    .string \"stats and abilities.\\p\"\n    .string \"A POKéMON raised by a TRAINER is\\n\"\n    .string \"stronger than one in the wild.$\"\n\nVermilionCity_PokemonCenter_1F_Text_PoisonedMonFaintedWhileWalking::\n    .string \"My POKéMON was poisoned!\\n\"\n    .string \"It fainted while we were walking!$\"\n\nVermilionCity_PokemonCenter_1F_Text_AllMonWeakToSpecificTypes::\n    .string \"It is true that a higher-level\\n\"\n    .string \"POKéMON will be more powerful…\\p\"\n    .string \"But, all POKéMON will have weak\\n\"\n    .string \"points against specific types.\\p\"\n    .string \"So, there appears to be no\\n\"\n    .string \"universally strong POKéMON.$\"\n\nVermilionCity_PokemonCenter_1F_Text_UrgeToBattleSomeoneAgain::\n    .string \"The urge to battle with someone\\n\"\n    .string \"you've tangled with before…\\p\"\n    .string \"Have you ever had that urge?\\n\"\n    .string \"I'm sure you have.\\p\"\n    .string \"I wanted to battle certain people\\n\"\n    .string \"again over and over, too.\\p\"\n    .string \"So, I've been giving these away.\\n\"\n    .string \"Please, take one!$\"\n\nVermilionCity_PokemonCenter_1F_Text_UseDeviceForRematches::\n    .string \"Use that device and you'll find\\n\"\n    .string \"TRAINERS looking for a rematch.\\p\"\n    .string \"You have to charge its battery to\\n\"\n    .string \"use it, though.$\"\n\nVermilionCity_PokemonCenter_1F_Text_ExplainVSSeeker::\n    .string \"How do you use the VS SEEKER?\\n\"\n    .string \"There's nothing to it.\\p\"\n    .string \"Use it like beep-beep-beep, and\\n\"\n    .string \"TRAINERS around you will notice.\\p\"\n    .string \"If any TRAINER wants a rematch,\\n\"\n    .string \"it will let you know immediately.\\p\"\n    .string \"Charge its battery and use it\\n\"\n    .string \"while you're on a road.$\"\n"
  },
  {
    "path": "data/maps/VermilionCity_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_VERMILION_CITY_POKEMON_CENTER_2F\",\n  \"name\": \"VermilionCity_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_VERMILION_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_VERMILION_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/VermilionCity_PokemonCenter_2F/scripts.inc",
    "content": "VermilionCity_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nVermilionCity_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nVermilionCity_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nVermilionCity_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/VermilionCity_PokemonFanClub/map.json",
    "content": "{\n  \"id\": \"MAP_VERMILION_CITY_POKEMON_FAN_CLUB\",\n  \"name\": \"VermilionCity_PokemonFanClub\",\n  \"layout\": \"LAYOUT_VERMILION_CITY_POKEMON_FAN_CLUB\",\n  \"music\": \"MUS_VERMILLION\",\n  \"region_map_section\": \"MAPSEC_VERMILION_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 4,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonFanClub_EventScript_Chairman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WORKER_F\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 4,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonFanClub_EventScript_WorkerF\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PIKACHU\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonFanClub_EventScript_Pikachu\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SEEL\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonFanClub_EventScript_Seel\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonFanClub_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 5,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VermilionCity_PokemonFanClub_EventScript_FatMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Krabby\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 4,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"5\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VERMILION_CITY\",\n      \"dest_warp_id\": \"5\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 2,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_PokemonFanClub_EventScript_RulesSign1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"VermilionCity_PokemonFanClub_EventScript_RulesSign2\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/VermilionCity_PokemonFanClub/scripts.inc",
    "content": ".set LOCALID_WOMAN,   5\n.set LOCALID_FAT_MAN, 6\n.set SPOKE_TO_WOMAN_LAST,   FLAG_TEMP_2\n.set SPOKE_TO_FAT_MAN_LAST, FLAG_TEMP_3\n.set LOCALID_KRABBY_MASTER, 7\n.set TRAINER, VAR_0x8009\n\nVermilionCity_PokemonFanClub_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, VermilionCity_PokemonFanClub_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nVermilionCity_PokemonFanClub_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_KRABBY\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, VermilionCity_PokemonFanClub_MapScript_KrabbyMasterMovementType\n\tend\n\nVermilionCity_PokemonFanClub_MapScript_KrabbyMasterMovementType::\n\tsetobjectmovementtype LOCALID_KRABBY_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nVermilionCity_PokemonFanClub_EventScript_Chairman::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_GOT_BIKE_VOUCHER, VermilionCity_PokemonFanClub_EventScript_AlreadyHeardStory\n\tmsgbox VermilionCity_PokemonFanClub_Text_DidYouComeToHearAboutMyMons, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, VermilionCity_PokemonFanClub_EventScript_ChairmanStory\n\tmsgbox VermilionCity_PokemonFanClub_Text_ComeBackToHearStory\n\trelease\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_AlreadyHeardStory::\n\tmsgbox VermilionCity_PokemonFanClub_Text_DidntComeToSeeAboutMonsAgain\n\trelease\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_ChairmanStory::\n\tmsgbox VermilionCity_PokemonFanClub_Text_ChairmansStory\n\tcheckitemspace ITEM_BIKE_VOUCHER\n\tgoto_if_eq VAR_RESULT, FALSE, VermilionCity_PokemonFanClub_EventScript_NoRoomForBikeVoucher\n\tsetflag FLAG_GOT_BIKE_VOUCHER\n\tgiveitem_msg VermilionCity_PokemonFanClub_Text_ReceivedBikeVoucherFromChairman, ITEM_BIKE_VOUCHER, 1, MUS_OBTAIN_KEY_ITEM\n\tmsgbox VermilionCity_PokemonFanClub_Text_ExplainBikeVoucher\n\trelease\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_NoRoomForBikeVoucher::\n\tmsgbox VermilionCity_PokemonFanClub_Text_MakeRoomForThis\n\trelease\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_WorkerF::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_SYS_GAME_CLEAR, VermilionCity_PokemonFanClub_EventScript_WorkerFGameClear\n\tmsgbox VermilionCity_PokemonFanClub_Text_ChairmanVeryVocalAboutPokemon\n\trelease\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_WorkerFGameClear::\n\tfamechecker FAMECHECKER_DAISY, 1\n\tmsgbox VermilionCity_PokemonFanClub_Text_ChairmanReallyAdoresHisMons\n\trelease\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_Woman::\n\tlock\n\tfaceplayer\n\tgoto_if_set SPOKE_TO_FAT_MAN_LAST, VermilionCity_PokemonFanClub_EventScript_WomanSpokeToFatMan\n\tmsgbox VermilionCity_PokemonFanClub_Text_AdoreMySeel\n\tclosemessage\n\tapplymovement LOCALID_WOMAN, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\tsetflag SPOKE_TO_WOMAN_LAST\n\trelease\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_WomanSpokeToFatMan::\n\tmsgbox VermilionCity_PokemonFanClub_Text_SeelFarMoreAttractive\n\tclosemessage\n\tapplymovement LOCALID_WOMAN, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\tclearflag SPOKE_TO_FAT_MAN_LAST\n\trelease\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_FatMan::\n\tlock\n\tfaceplayer\n\tgoto_if_set SPOKE_TO_WOMAN_LAST, VermilionCity_PokemonFanClub_EventScript_FatManSpokeToWoman\n\tmsgbox VermilionCity_PokemonFanClub_Text_AdmirePikachusTail\n\tclosemessage\n\tapplymovement LOCALID_FAT_MAN, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\tsetflag SPOKE_TO_FAT_MAN_LAST\n\trelease\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_FatManSpokeToWoman::\n\tmsgbox VermilionCity_PokemonFanClub_Text_PikachuTwiceAsCute\n\tclosemessage\n\tapplymovement LOCALID_FAT_MAN, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\tclearflag SPOKE_TO_WOMAN_LAST\n\trelease\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_Pikachu::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_PIKACHU, CRY_MODE_NORMAL\n\tmsgbox VermilionCity_PokemonFanClub_Text_Pikachu\n\twaitmoncry\n\trelease\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_Seel::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_SEEL, CRY_MODE_NORMAL\n\tmsgbox VermilionCity_PokemonFanClub_Text_Seel\n\twaitmoncry\n\trelease\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_RulesSign1::\n\tmsgbox VermilionCity_PokemonFanClub_Text_ListenPolitelyToOtherTrainers, MSGBOX_SIGN\n\tend\n\nVermilionCity_PokemonFanClub_EventScript_RulesSign2::\n\tmsgbox VermilionCity_PokemonFanClub_Text_SomeoneBragsBragBack, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/VermilionCity_PokemonFanClub/text.inc",
    "content": "VermilionCity_PokemonFanClub_Text_AdmirePikachusTail::\n    .string \"Won't you admire my PIKACHU's\\n\"\n    .string \"adorable tail?$\"\n\nVermilionCity_PokemonFanClub_Text_PikachuTwiceAsCute::\n    .string \"Humph!\\p\"\n    .string \"My PIKACHU is twice as cute as\\n\"\n    .string \"that one!$\"\n\nVermilionCity_PokemonFanClub_Text_AdoreMySeel::\n    .string \"I just adore my SEEL!\\n\"\n    .string \"It's so lovable!\\p\"\n    .string \"It squeals, “Kyuuuh,” when I\\n\"\n    .string \"hug it!$\"\n\nVermilionCity_PokemonFanClub_Text_SeelFarMoreAttractive::\n    .string \"Oh, dear!\\p\"\n    .string \"My SEEL is far more attractive.\\n\"\n    .string \"By double, I would say.$\"\n\nVermilionCity_PokemonFanClub_Text_Pikachu::\n    .string \"PIKACHU: Chu! Pikachu!$\"\n\nVermilionCity_PokemonFanClub_Text_Seel::\n    .string \"SEEL: Kyuoo!$\"\n\nVermilionCity_PokemonFanClub_Text_DidYouComeToHearAboutMyMons::\n    .string \"I chair the POKéMON Fan Club!\\p\"\n    .string \"I raise more than a hundred\\n\"\n    .string \"POKéMON!\\p\"\n    .string \"I'm very fussy when it comes to\\n\"\n    .string \"POKéMON! I surely am!\\p\"\n    .string \"So…\\p\"\n    .string \"Did you come visit to hear about\\n\"\n    .string \"my POKéMON?$\"\n\nVermilionCity_PokemonFanClub_Text_ChairmansStory::\n    .string \"Good!\\n\"\n    .string \"Then listen up!\\p\"\n    .string \"My favorite RAPIDASH…\\p\"\n    .string \"It's…cute…lovely…smart… \\n\"\n    .string \"plus…amazing…you think so?…\\l\"\n    .string \"oh yes…it's…stunning…\\l\"\n    .string \"kindly…love it!\\p\"\n    .string \"Hug it…when…sleeping…warm\\n\"\n    .string \"and cuddly…spectacular…\\l\"\n    .string \"ravishing…\\l\"\n    .string \"…Oops! Look at the time!\\l\"\n    .string \"I kept you too long!\\p\"\n    .string \"Thanks for hearing me out!\\n\"\n    .string \"I want you to have this!$\"\n\nVermilionCity_PokemonFanClub_Text_ReceivedBikeVoucherFromChairman::\n    .string \"{PLAYER} received a BIKE VOUCHER\\n\"\n    .string \"from the CHAIRMAN.$\"\n\nVermilionCity_PokemonFanClub_Text_ExplainBikeVoucher::\n    .string \"Take that BIKE VOUCHER to the\\n\"\n    .string \"BIKE SHOP in CERULEAN CITY.\\p\"\n    .string \"Exchange that for a BICYCLE\\n\"\n    .string \"free of charge!\\p\"\n    .string \"Don't worry, my favorite FEAROW\\n\"\n    .string \"will FLY me anywhere I need to go.\\p\"\n    .string \"So, I have no need for a BICYCLE.\\p\"\n    .string \"I hope you like cycling!$\"\n\nVermilionCity_PokemonFanClub_Text_ComeBackToHearStory::\n    .string \"Oh. Come back when you want to\\n\"\n    .string \"hear my story!$\"\n\nVermilionCity_PokemonFanClub_Text_DidntComeToSeeAboutMonsAgain::\n    .string \"Hello, {PLAYER}!\\p\"\n    .string \"Did you come see me about my\\n\"\n    .string \"POKéMON again?\\p\"\n    .string \"No?\\n\"\n    .string \"Too bad!$\"\n\nVermilionCity_PokemonFanClub_Text_MakeRoomForThis::\n    .string \"Make room for this!$\"\n\nVermilionCity_PokemonFanClub_Text_ChairmanVeryVocalAboutPokemon::\n    .string \"Our CHAIRMAN is very vocal about\\n\"\n    .string \"POKéMON.$\"\n\nVermilionCity_PokemonFanClub_Text_ListenPolitelyToOtherTrainers::\n    .string \"Let's all listen politely to other\\n\"\n    .string \"TRAINERS!$\"\n\nVermilionCity_PokemonFanClub_Text_SomeoneBragsBragBack::\n    .string \"If someone brags, brag right back!$\"\n\nVermilionCity_PokemonFanClub_Text_ChairmanReallyAdoresHisMons::\n    .string \"Our CHAIRMAN really does adore his\\n\"\n    .string \"POKéMON.\\p\"\n    .string \"But the person who is most liked by\\n\"\n    .string \"POKéMON is DAISY, I think.$\"\n"
  },
  {
    "path": "data/maps/VictoryRoad_1F/map.json",
    "content": "{\n  \"id\": \"MAP_VICTORY_ROAD_1F\",\n  \"name\": \"VictoryRoad_1F\",\n  \"layout\": \"LAYOUT_VICTORY_ROAD_1F\",\n  \"music\": \"MUS_MT_MOON\",\n  \"region_map_section\": \"MAPSEC_KANTO_VICTORY_ROAD\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"VictoryRoad_1F_EventScript_Rolando\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"VictoryRoad_1F_EventScript_Naomi\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VictoryRoad_1F_EventScript_ItemRareCandy\",\n      \"flag\": \"FLAG_HIDE_VICTORY_ROAD_1F_RARE_CANDY\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VictoryRoad_1F_EventScript_ItemTM02\",\n      \"flag\": \"FLAG_HIDE_VICTORY_ROAD_1F_TM02\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_HIKER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 11,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Graveler\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_2F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 11,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE23\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 20,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_VICTORY_ROAD_1F\",\n      \"var_value\": \"99\",\n      \"script\": \"VictoryRoad_1F_EventScript_FloorSwitch\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 12,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"item\": \"ITEM_ULTRA_BALL\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 16,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"item\": \"ITEM_FULL_RESTORE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_FULL_RESTORE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/VictoryRoad_1F/scripts.inc",
    "content": ".set LOCALID_GRAVELER_MASTER, 8\n.set TRAINER, VAR_0x8009\n.set LOCALID_BOULDER, 5\n\nVictoryRoad_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, VictoryRoad_1F_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, VictoryRoad_1F_OnTransition\n\t.byte 0\n\nVictoryRoad_1F_OnLoad::\n\tcall_if_ne VAR_MAP_SCENE_VICTORY_ROAD_1F, 100, VictoryRoad_1F_EventScript_SetRockBarrier\n\tcall_if_eq VAR_MAP_SCENE_VICTORY_ROAD_1F, 100, VictoryRoad_1F_EventScript_MoveSwitchBoulder\n\tend\n\nVictoryRoad_1F_EventScript_SetRockBarrier::\n\tsetmetatile 12, 14, METATILE_Cave_RockBarrier_Top, 1\n\tsetmetatile 12, 15, METATILE_Cave_RockBarrier_Bottom, 1\n\treturn\n\nVictoryRoad_1F_EventScript_MoveSwitchBoulder::\n\tsetobjectxyperm LOCALID_BOULDER, 20, 16\n\tend\n\nVictoryRoad_1F_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_VICTORY_ROAD_1F\n\tgoto VictoryRoad_1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nVictoryRoad_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_GRAVELER\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, VictoryRoad_1F_MapScript_GravelerMasterMovementType\n\tend\n\nVictoryRoad_1F_MapScript_GravelerMasterMovementType::\n\tsetobjectmovementtype LOCALID_GRAVELER_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nVictoryRoad_1F_EventScript_FloorSwitch::\n\tlockall\n\tgoto_if_eq VAR_MAP_SCENE_VICTORY_ROAD_1F, 100, VictoryRoad_1F_EventScript_FloorSwitchAlreadyPressed\n\tsetmetatile 12, 14, METATILE_Cave_Floor_Ledge_Top, 0\n\tsetmetatile 12, 15, METATILE_Cave_Floor_Ledge_Bottom, 0\n\tplayse SE_ICE_BREAK\n\tspecial DrawWholeMapView\n\twaitse\n\tcopyobjectxytoperm LOCALID_BOULDER\n\tsetvar VAR_MAP_SCENE_VICTORY_ROAD_1F, 100\n\treleaseall\n\tend\n\nVictoryRoad_1F_EventScript_FloorSwitchAlreadyPressed::\n\treleaseall\n\tend\n\nVictoryRoad_1F_EventScript_Naomi::\n\ttrainerbattle_single TRAINER_COOLTRAINER_NAOMI, VictoryRoad_1F_Text_NaomiIntro, VictoryRoad_1F_Text_NaomiDefeat\n\tmsgbox VictoryRoad_1F_Text_NaomiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVictoryRoad_1F_EventScript_Rolando::\n\ttrainerbattle_single TRAINER_COOLTRAINER_ROLANDO, VictoryRoad_1F_Text_RolandoIntro, VictoryRoad_1F_Text_RolandoDefeat\n\tmsgbox VictoryRoad_1F_Text_RolandoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/VictoryRoad_1F/text.inc",
    "content": "VictoryRoad_1F_Text_NaomiIntro::\n    .string \"I wonder if you are good enough\\n\"\n    .string \"for me?$\"\n\nVictoryRoad_1F_Text_NaomiDefeat::\n    .string \"I lost out…$\"\n\nVictoryRoad_1F_Text_NaomiPostBattle::\n    .string \"I never wanted to lose to anybody,\\n\"\n    .string \"especially to a younger kid…$\"\n\nVictoryRoad_1F_Text_RolandoIntro::\n    .string \"I can see you're good.\\n\"\n    .string \"Let me see exactly how good!$\"\n\nVictoryRoad_1F_Text_RolandoDefeat::\n    .string \"I had a chance…$\"\n\nVictoryRoad_1F_Text_RolandoPostBattle::\n    .string \"Tch!\\n\"\n    .string \"I concede, you are better than I!$\"\n\n"
  },
  {
    "path": "data/maps/VictoryRoad_2F/map.json",
    "content": "{\n  \"id\": \"MAP_VICTORY_ROAD_2F\",\n  \"name\": \"VictoryRoad_2F\",\n  \"layout\": \"LAYOUT_VICTORY_ROAD_2F\",\n  \"music\": \"MUS_MT_MOON\",\n  \"region_map_section\": \"MAPSEC_KANTO_VICTORY_ROAD\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_POKE_MANIAC\",\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"VictoryRoad_2F_EventScript_Dawson\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 11,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"VictoryRoad_2F_EventScript_Daisuke\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_JUGGLER\",\n      \"x\": 31,\n      \"y\": 16,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"VictoryRoad_2F_EventScript_Nelson\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TAMER\",\n      \"x\": 26,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 4,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"VictoryRoad_2F_EventScript_Vincent\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_JUGGLER\",\n      \"x\": 36,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"VictoryRoad_2F_EventScript_Gregory\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VictoryRoad_2F_EventScript_ItemGuardSpec\",\n      \"flag\": \"FLAG_HIDE_VICTORY_ROAD_2F_GUARD_SPEC\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VictoryRoad_2F_EventScript_ItemTM07\",\n      \"flag\": \"FLAG_HIDE_VICTORY_ROAD_2F_TM07\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 25,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VictoryRoad_2F_EventScript_ItemFullHeal\",\n      \"flag\": \"FLAG_HIDE_VICTORY_ROAD_2F_FULL_HEAL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VictoryRoad_2F_EventScript_ItemTM37\",\n      \"flag\": \"FLAG_HIDE_VICTORY_ROAD_2F_TM37\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"FLAG_HIDE_VICTORY_ROAD_2F_BOULDER\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VictoryRoad_2F_EventScript_DoubleEdgeTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 27,\n      \"y\": 17,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Moltres\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_1F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 3,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_3F\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 34,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_3F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 38,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_3F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 36,\n      \"y\": 17,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_VICTORY_ROAD_3F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 49,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE23\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 48,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE23\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 47,\n      \"y\": 13,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_ROUTE23\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 34,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_3F\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 2,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER1\",\n      \"var_value\": \"99\",\n      \"script\": \"VictoryRoad_2F_EventScript_FloorSwitch1\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 14,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2\",\n      \"var_value\": \"99\",\n      \"script\": \"VictoryRoad_2F_EventScript_FloorSwitch2\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/VictoryRoad_2F/scripts.inc",
    "content": ".set LOCALID_MOLTRES_MASTER, 14\n.set TRAINER, VAR_0x8009\n.set LOCALID_BOULDER1, 11\n.set LOCALID_BOULDER2, 12\n\nVictoryRoad_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, VictoryRoad_2F_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, VictoryRoad_2F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nVictoryRoad_2F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_MOLTRES\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, VictoryRoad_2F_MapScript_MoltresMasterMovementType\n\tend\n\nVictoryRoad_2F_MapScript_MoltresMasterMovementType::\n\tsetobjectmovementtype LOCALID_MOLTRES_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nVictoryRoad_2F_OnLoad::\n\tcall_if_ne VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER1, 100, VictoryRoad_2F_EventScript_SetRockBarrier1\n\tcall_if_eq VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER1, 100, VictoryRoad_2F_EventScript_MoveSwitch1Boulder\n\tcall_if_ne VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2, 100, VictoryRoad_2F_EventScript_SetRockBarrier2\n\tcall_if_eq VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2, 100, VictoryRoad_2F_EventScript_MoveSwitch2Boulder\n\tend\n\nVictoryRoad_2F_EventScript_MoveSwitch1Boulder::\n\tsetobjectxyperm LOCALID_BOULDER1, 2, 19\n\treturn\n\nVictoryRoad_2F_EventScript_MoveSwitch2Boulder::\n\tsetobjectxyperm LOCALID_BOULDER2, 14, 19\n\treturn\n\nVictoryRoad_2F_EventScript_SetRockBarrier1::\n\tsetmetatile 13, 10, METATILE_Cave_RockBarrier_Top, 1\n\tsetmetatile 13, 11, METATILE_Cave_RockBarrier_Bottom, 1\n\treturn\n\nVictoryRoad_2F_EventScript_SetRockBarrier2::\n\tsetmetatile 33, 16, METATILE_Cave_RockBarrier_Top, 1\n\tsetmetatile 33, 17, METATILE_Cave_RockBarrier_Bottom, 1\n\treturn\n\nVictoryRoad_2F_EventScript_FloorSwitch1::\n\tlockall\n\tgoto_if_eq VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER1, 100, VictoryRoad_2F_EventScript_FloorSwitch1AlreadyPressed\n\tsetmetatile 13, 10, METATILE_Cave_Floor_Ledge_Top, 0\n\tsetmetatile 13, 11, METATILE_Cave_Floor_Ledge_Bottom, 0\n\tplayse SE_ICE_BREAK\n\tspecial DrawWholeMapView\n\twaitse\n\tcopyobjectxytoperm LOCALID_BOULDER1\n\tsetvar VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER1, 100\n\treleaseall\n\tend\n\nVictoryRoad_2F_EventScript_FloorSwitch1AlreadyPressed::\n\treleaseall\n\tend\n\nVictoryRoad_2F_EventScript_FloorSwitch2::\n\tlockall\n\tgoto_if_eq VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2, 100, VictoryRoad_2F_EventScript_FloorSwitch2AlreadyPressed\n\tsetmetatile 33, 16, METATILE_Cave_Floor_Ledge_Top, 0\n\tsetmetatile 33, 17, METATILE_Cave_Floor_Ledge_Bottom, 0\n\tplayse SE_ICE_BREAK\n\tspecial DrawWholeMapView\n\twaitse\n\tcopyobjectxytoperm LOCALID_BOULDER2\n\tsetvar VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2, 100\n\treleaseall\n\tend\n\nVictoryRoad_2F_EventScript_FloorSwitch2AlreadyPressed::\n\treleaseall\n\tend\n\nVictoryRoad_2F_EventScript_Dawson::\n\ttrainerbattle_single TRAINER_POKEMANIAC_DAWSON, VictoryRoad_2F_Text_DawsonIntro, VictoryRoad_2F_Text_DawsonDefeat\n\tmsgbox VictoryRoad_2F_Text_DawsonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVictoryRoad_2F_EventScript_Daisuke::\n\ttrainerbattle_single TRAINER_BLACK_BELT_DAISUKE, VictoryRoad_2F_Text_DaisukeIntro, VictoryRoad_2F_Text_DaisukeDefeat\n\tmsgbox VictoryRoad_2F_Text_DaisukePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVictoryRoad_2F_EventScript_Nelson::\n\ttrainerbattle_single TRAINER_JUGGLER_NELSON, VictoryRoad_2F_Text_NelsonIntro, VictoryRoad_2F_Text_NelsonDefeat\n\tmsgbox VictoryRoad_2F_Text_NelsonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVictoryRoad_2F_EventScript_Gregory::\n\ttrainerbattle_single TRAINER_JUGGLER_GREGORY, VictoryRoad_2F_Text_GregoryIntro, VictoryRoad_2F_Text_GregoryDefeat\n\tmsgbox VictoryRoad_2F_Text_GregoryPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVictoryRoad_2F_EventScript_Vincent::\n\ttrainerbattle_single TRAINER_TAMER_VINCENT, VictoryRoad_2F_Text_VincentIntro, VictoryRoad_2F_Text_VincentDefeat\n\tmsgbox VictoryRoad_2F_Text_VincentPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/VictoryRoad_2F/text.inc",
    "content": "VictoryRoad_2F_Text_DawsonIntro::\n    .string \"If you can get through here,\\n\"\n    .string \"you can go meet the ELITE FOUR.$\"\n\nVictoryRoad_2F_Text_DawsonDefeat::\n    .string \"No!\\n\"\n    .string \"Unbelievable!$\"\n\nVictoryRoad_2F_Text_DawsonPostBattle::\n    .string \"I can beat you when it comes to\\n\"\n    .string \"knowledge about POKéMON!$\"\n\nVictoryRoad_2F_Text_DaisukeIntro::\n    .string \"This here is VICTORY ROAD.\\n\"\n    .string \"It's the final test for TRAINERS!$\"\n\nVictoryRoad_2F_Text_DaisukeDefeat::\n    .string \"Atcho!$\"\n\nVictoryRoad_2F_Text_DaisukePostBattle::\n    .string \"If you get stuck, try moving some\\n\"\n    .string \"boulders around.$\"\n\nVictoryRoad_2F_Text_NelsonIntro::\n    .string \"Ah, so you wish to challenge the\\n\"\n    .string \"ELITE FOUR?$\"\n\nVictoryRoad_2F_Text_NelsonDefeat::\n    .string \"You got me!$\"\n\nVictoryRoad_2F_Text_NelsonPostBattle::\n    .string \"{RIVAL} also came through here.$\"\n\nVictoryRoad_2F_Text_VincentIntro::\n    .string \"Come on!\\n\"\n    .string \"I'll whip you!$\"\n\nVictoryRoad_2F_Text_VincentDefeat::\n    .string \"I got whipped!$\"\n\nVictoryRoad_2F_Text_VincentPostBattle::\n    .string \"You earned the right to be on\\n\"\n    .string \"VICTORY ROAD…$\"\n\nVictoryRoad_2F_Text_GregoryIntro::\n    .string \"Is VICTORY ROAD too tough?$\"\n\nVictoryRoad_2F_Text_GregoryDefeat::\n    .string \"Well done!$\"\n\nVictoryRoad_2F_Text_GregoryPostBattle::\n    .string \"Many TRAINERS give up their\\n\"\n    .string \"challenge here and go home.$\"\n\n@ Unused, old text for Moltres\nVictoryRoad_2F_Text_Gyaoo::\n    .string \"ギヤーオ！$\"\n\n"
  },
  {
    "path": "data/maps/VictoryRoad_3F/map.json",
    "content": "{\n  \"id\": \"MAP_VICTORY_ROAD_3F\",\n  \"name\": \"VictoryRoad_3F\",\n  \"layout\": \"LAYOUT_VICTORY_ROAD_3F\",\n  \"music\": \"MUS_MT_MOON\",\n  \"region_map_section\": \"MAPSEC_KANTO_VICTORY_ROAD\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_UNDERGROUND\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"VictoryRoad_3F_EventScript_George\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 5,\n      \"elevation\": 4,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"VictoryRoad_3F_EventScript_Alexa\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"VictoryRoad_3F_EventScript_Colby\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 16,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"VictoryRoad_3F_EventScript_Caroline\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VictoryRoad_3F_EventScript_ItemMaxRevive\",\n      \"flag\": \"FLAG_HIDE_VICTORY_ROAD_3F_MAX_REVIVE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"VictoryRoad_3F_EventScript_ItemTM50\",\n      \"flag\": \"FLAG_HIDE_VICTORY_ROAD_3F_TM50\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 19,\n      \"y\": 15,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"FLAG_HIDE_VICTORY_ROAD_2F_BOULDER\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"FLAG_HIDE_VICTORY_ROAD_3F_BOULDER\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 35,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_PUSHABLE_BOULDER\",\n      \"in_connection\": false,\n      \"x\": 32,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_StrengthBoulder\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"VictoryRoad_3F_EventScript_Ray\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_F\",\n      \"in_connection\": false,\n      \"x\": 39,\n      \"y\": 13,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"VictoryRoad_3F_EventScript_Tyra\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 19,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Golbat\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 5,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_2F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 34,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_2F\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 37,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_2F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 39,\n      \"y\": 17,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_2F\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 34,\n      \"y\": 18,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VICTORY_ROAD_2F\",\n      \"dest_warp_id\": \"8\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_VICTORY_ROAD_3F\",\n      \"var_value\": \"99\",\n      \"script\": \"VictoryRoad_3F_EventScript_FloorSwitch\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/VictoryRoad_3F/scripts.inc",
    "content": ".set LOCALID_GOLBAT_MASTER, 13\n.set TRAINER, VAR_0x8009\n.set LOCALID_BOULDER1, 7\n.set LOCALID_BOULDER2, 10\n\nVictoryRoad_3F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, VictoryRoad_3F_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, VictoryRoad_3F_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nVictoryRoad_3F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_GOLBAT\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, VictoryRoad_3F_MapScript_GolbatMasterMovementType\n\tend\n\nVictoryRoad_3F_MapScript_GolbatMasterMovementType::\n\tsetobjectmovementtype LOCALID_GOLBAT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nVictoryRoad_3F_OnLoad::\n\tcall_if_ne VAR_MAP_SCENE_VICTORY_ROAD_3F, 100, VictoryRoad_3F_EventScript_SetRockBarrier\n\tcall_if_eq VAR_MAP_SCENE_VICTORY_ROAD_3F, 100, VictoryRoad_3F_EventScript_MoveSwitchBoulder\n\tend\n\nVictoryRoad_3F_EventScript_MoveSwitchBoulder::\n\tsetobjectxyperm LOCALID_BOULDER2, 7 ,7\n\treturn\n\nVictoryRoad_3F_EventScript_SetRockBarrier::\n\tsetmetatile 12, 12, METATILE_Cave_RockBarrier_Top, 1\n\tsetmetatile 12, 13, METATILE_Cave_RockBarrier_Bottom, 1\n\treturn\n\nVictoryRoad_3F_EventScript_FloorSwitch::\n\tlockall\n\tgoto_if_eq VAR_MAP_SCENE_VICTORY_ROAD_3F, 100, VictoryRoad_3F_EventScript_FloorSwitchAlreadyPressed\n\tsetmetatile 12, 12, METATILE_Cave_Floor_Ledge_Top, 0\n\tsetmetatile 12, 13, METATILE_Cave_Floor_Ledge_Bottom, 0\n\tplayse SE_ICE_BREAK\n\tspecial DrawWholeMapView\n\twaitse\n\tcopyobjectxytoperm LOCALID_BOULDER1\n\tcopyobjectxytoperm LOCALID_BOULDER2\n\tsetvar VAR_MAP_SCENE_VICTORY_ROAD_3F, 100\n\treleaseall\n\tend\n\nVictoryRoad_3F_EventScript_FloorSwitchAlreadyPressed::\n\treleaseall\n\tend\n\nVictoryRoad_3F_EventScript_George::\n\ttrainerbattle_single TRAINER_COOLTRAINER_GEORGE, VictoryRoad_3F_Text_GeorgeIntro, VictoryRoad_3F_Text_GeorgeDefeat\n\tmsgbox VictoryRoad_3F_Text_GeorgePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVictoryRoad_3F_EventScript_Colby::\n\ttrainerbattle_single TRAINER_COOLTRAINER_COLBY, VictoryRoad_3F_Text_ColbyIntro, VictoryRoad_3F_Text_ColbyDefeat\n\tmsgbox VictoryRoad_3F_Text_ColbyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVictoryRoad_3F_EventScript_Caroline::\n\ttrainerbattle_single TRAINER_COOLTRAINER_CAROLINE, VictoryRoad_3F_Text_CarolineIntro, VictoryRoad_3F_Text_CarolineDefeat\n\tmsgbox VictoryRoad_3F_Text_CarolinePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVictoryRoad_3F_EventScript_Alexa::\n\ttrainerbattle_single TRAINER_COOLTRAINER_ALEXA, VictoryRoad_3F_Text_AlexaIntro, VictoryRoad_3F_Text_AlexaDefeat\n\tmsgbox VictoryRoad_3F_Text_AlexaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVictoryRoad_3F_EventScript_Ray::\n\ttrainerbattle_double TRAINER_COOL_COUPLE_RAY_TYRA, VictoryRoad_3F_Text_RayIntro, VictoryRoad_3F_Text_RayDefeat, VictoryRoad_3F_Text_RayNotEnoughMons\n\tmsgbox VictoryRoad_3F_Text_RayPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nVictoryRoad_3F_EventScript_Tyra::\n\ttrainerbattle_double TRAINER_COOL_COUPLE_RAY_TYRA, VictoryRoad_3F_Text_TyraIntro, VictoryRoad_3F_Text_TyraDefeat, VictoryRoad_3F_Text_TyraNotEnoughMons\n\tmsgbox VictoryRoad_3F_Text_TyraPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/VictoryRoad_3F/text.inc",
    "content": "Text_DoubleEdgeTeach::\n    .string \"You should be proud of yourself,\\n\"\n    .string \"having battled your way through\\l\"\n    .string \"VICTORY ROAD so courageously.\\p\"\n    .string \"In recognition of your feat,\\n\"\n    .string \"I'll teach you DOUBLE-EDGE.\\p\"\n    .string \"Would you like me to teach that\\n\"\n    .string \"technique?$\"\n\nText_DoubleEdgeDeclined::\n    .string \"I'll teach you the technique\\n\"\n    .string \"anytime.$\"\n\nText_DoubleEdgeWhichMon::\n    .string \"Which POKéMON should I teach\\n\"\n    .string \"DOUBLE-EDGE?$\"\n\nText_DoubleEdgeTaught::\n    .string \"Keep that drive going for the\\n\"\n    .string \"POKéMON LEAGUE!\\p\"\n    .string \"Take a run at them and knock 'em\\n\"\n    .string \"out!$\"\n\nText_DoubleEdgeReteach::\n    .string \"Back again?\\p\"\n    .string \"I'll teach you the DOUBLE-EDGE\\n\"\n    .string \"technique again, but it'll cost\\l\"\n    .string \"you ¥5000.$\"\n\nText_DoubleEdgeReteach2::\n    .string \"Would you like me to teach that\\n\"\n    .string \"technique?$\"\n\nText_DoubleEdgeNotEnoughMoney::\n    .string \"Hey! You don't have enough money\\n\"\n    .string \"to pay for this!\\p\"\n    .string \"If you want to learn DOUBLE-EDGE\\n\"\n    .string \"again, come back with ¥5000!$\"\n\nVictoryRoad_3F_Text_GeorgeIntro::\n    .string \"I heard rumors of a child prodigy.$\"\n\nVictoryRoad_3F_Text_GeorgeDefeat::\n    .string \"The rumors were true!$\"\n\nVictoryRoad_3F_Text_GeorgePostBattle::\n    .string \"So, it was you who beat GIOVANNI\\n\"\n    .string \"of TEAM ROCKET?$\"\n\nVictoryRoad_3F_Text_AlexaIntro::\n    .string \"TRAINERS live to seek stronger\\n\"\n    .string \"opponents.$\"\n\nVictoryRoad_3F_Text_AlexaDefeat::\n    .string \"Oh!\\n\"\n    .string \"So strong!$\"\n\nVictoryRoad_3F_Text_AlexaPostBattle::\n    .string \"By fighting tough battles, you get\\n\"\n    .string \"stronger.$\"\n\nVictoryRoad_3F_Text_CarolineIntro::\n    .string \"I'll show you just how good you\\n\"\n    .string \"are. Not!$\"\n\nVictoryRoad_3F_Text_CarolineDefeat::\n    .string \"I'm furious!$\"\n\nVictoryRoad_3F_Text_CarolinePostBattle::\n    .string \"You showed me just how good\\n\"\n    .string \"I was…$\"\n\nVictoryRoad_3F_Text_ColbyIntro::\n    .string \"Only the chosen can pass here!$\"\n\nVictoryRoad_3F_Text_ColbyDefeat::\n    .string \"I don't believe it!$\"\n\nVictoryRoad_3F_Text_ColbyPostBattle::\n    .string \"All TRAINERS here are headed to\\n\"\n    .string \"the POKéMON LEAGUE.\\p\"\n    .string \"Don't let down your guard.$\"\n\nVictoryRoad_3F_Text_RayIntro::\n    .string \"RAY: Together, the two of us are\\n\"\n    .string \"destined for greatness!$\"\n\nVictoryRoad_3F_Text_RayDefeat::\n    .string \"RAY: Ludicrous!\\n\"\n    .string \"This can't be!$\"\n\nVictoryRoad_3F_Text_RayPostBattle::\n    .string \"RAY: You've beaten us.\\n\"\n    .string \"Greatness remains elusive…$\"\n\nVictoryRoad_3F_Text_RayNotEnoughMons::\n    .string \"RAY: Together, the two of us are\\n\"\n    .string \"striving for the pinnacle.\\p\"\n    .string \"We need you to bring two POKéMON\\n\"\n    .string \"into battle with us.$\"\n\nVictoryRoad_3F_Text_TyraIntro::\n    .string \"TYRA: We're trying to become\\n\"\n    .string \"champions together.$\"\n\nVictoryRoad_3F_Text_TyraDefeat::\n    .string \"TYRA: Oh, but…$\"\n\nVictoryRoad_3F_Text_TyraPostBattle::\n    .string \"TYRA: You've taught me that power\\n\"\n    .string \"can be infinite in shape and form.$\"\n\nVictoryRoad_3F_Text_TyraNotEnoughMons::\n    .string \"TYRA: You can't battle with us if\\n\"\n    .string \"you have only one POKéMON.$\"\n\n"
  },
  {
    "path": "data/maps/ViridianCity/map.json",
    "content": "{\n  \"id\": \"MAP_VIRIDIAN_CITY\",\n  \"name\": \"ViridianCity\",\n  \"layout\": \"LAYOUT_VIRIDIAN_CITY\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_VIRIDIAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SUNNY\",\n  \"map_type\": \"MAP_TYPE_TOWN\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": false,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": [\n    {\n      \"direction\": \"up\",\n      \"offset\": 12,\n      \"map\": \"MAP_ROUTE2\"\n    },\n    {\n      \"direction\": \"down\",\n      \"offset\": 12,\n      \"map\": \"MAP_ROUTE1\"\n    },\n    {\n      \"direction\": \"left\",\n      \"offset\": 10,\n      \"map\": \"MAP_ROUTE22\"\n    }\n  ],\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_FAT_MAN\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_EventScript_DreamEaterTutor\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_VIRIDIAN_CITY_SOUTH_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_OLD_MAN_1\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_EventScript_OldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_VAR_0\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 2,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_EventScript_TutorialOldMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_3\",\n      \"in_connection\": false,\n      \"x\": 20,\n      \"y\": 12,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 3,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 33,\n      \"y\": 26,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_EventScript_Boy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CUT_TREE\",\n      \"in_connection\": false,\n      \"x\": 18,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_CutTree\",\n      \"flag\": \"FLAG_VIRIDIAN_CITY_NORTH_CUT_TREE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 17,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_EventScript_ItemPotion\",\n      \"flag\": \"FLAG_HIDE_VIRIDIAN_CITY_POTION\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_PSYCHIC_M\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 32,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Abra\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 38,\n      \"y\": 24,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Oddish\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 26,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY_HOUSE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 35,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY_GYM\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 25,\n      \"y\": 18,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY_SCHOOL\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 36,\n      \"y\": 19,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY_MART\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 22,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN\",\n      \"var_value\": \"0\",\n      \"script\": \"ViridianCity_EventScript_RoadBlocked\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 35,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_VIRIDIAN_CITY_GYM_DOOR\",\n      \"var_value\": \"0\",\n      \"script\": \"ViridianCity_EventScript_GymDoorLocked\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 20,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN\",\n      \"var_value\": \"1\",\n      \"script\": \"ViridianCity_EventScript_TutorialTriggerLeft\"\n    },\n    {\n      \"type\": \"trigger\",\n      \"x\": 22,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"var\": \"VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN\",\n      \"var_value\": \"1\",\n      \"script\": \"ViridianCity_EventScript_TutorialTriggerRight\"\n    }\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 23,\n      \"y\": 1,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianCity_EventScript_TrainerTips1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 31,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianCity_EventScript_GymSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 20,\n      \"y\": 31,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianCity_EventScript_TrainerTips2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 20,\n      \"y\": 16,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianCity_EventScript_CitySign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 35,\n      \"y\": 10,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianCity_EventScript_GymDoor\"\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/ViridianCity/scripts.inc",
    "content": ".set LOCALID_OLD_MAN,      3\n.set LOCALID_TUTORIAL_MAN, 4\n.set LOCALID_WOMAN,        5\n.set LOCALID_ABRA_MASTER, 10\n.set LOCALID_ODDISH_MASTER, 11\n.set TRAINER, VAR_0x8009\n\nViridianCity_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, ViridianCity_OnTransition\n\t.byte 0\n\nViridianCity_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_ABRA\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, ViridianCity_MapScript_AbraMasterMovementType\n\tsetvar TRAINER, MASTER_ODDISH\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, ViridianCity_MapScript_OddishMasterMovementType\n\tend\n\nViridianCity_MapScript_AbraMasterMovementType::\n\tsetobjectmovementtype LOCALID_ABRA_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nViridianCity_MapScript_OddishMasterMovementType::\n\tsetobjectmovementtype LOCALID_ODDISH_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nViridianCity_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_VIRIDIAN_CITY\n\tcall_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 0, ViridianCity_EventScript_SetOldManBlockingRoad\n\tcall_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 1, ViridianCity_EventScript_SetOldManStandingByRoad\n\tcall_if_ge VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 2, ViridianCity_EventScript_SetOldManNormal\n\tcall_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_GYM_DOOR, 0, ViridianCity_EventScript_TryUnlockGym\n\tgoto ViridianCity_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nViridianCity_EventScript_SetOldManNormal::\n\tsetvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_OLD_MAN_1\n\treturn\n\nViridianCity_EventScript_SetOldManStandingByRoad::\n\tsetvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_OLD_MAN_1\n\tsetobjectxyperm LOCALID_TUTORIAL_MAN, 21, 8\n\tsetobjectmovementtype LOCALID_TUTORIAL_MAN, MOVEMENT_TYPE_LOOK_AROUND\n\treturn\n\nViridianCity_EventScript_SetOldManBlockingRoad::\n\tsetvar VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_OLD_MAN_LYING_DOWN\n\tsetobjectxyperm LOCALID_TUTORIAL_MAN, 21, 11\n\tsetobjectmovementtype LOCALID_TUTORIAL_MAN, MOVEMENT_TYPE_FACE_DOWN\n\treturn\n\nViridianCity_EventScript_TryUnlockGym::\n\tgoto_if_unset FLAG_BADGE02_GET, EventScript_Return\n\tgoto_if_unset FLAG_BADGE03_GET, EventScript_Return\n\tgoto_if_unset FLAG_BADGE04_GET, EventScript_Return\n\tgoto_if_unset FLAG_BADGE05_GET, EventScript_Return\n\tgoto_if_unset FLAG_BADGE06_GET, EventScript_Return\n\tgoto_if_unset FLAG_BADGE07_GET, EventScript_Return\n\tsetvar VAR_MAP_SCENE_VIRIDIAN_CITY_GYM_DOOR, 1\n\treturn\n\nViridianCity_EventScript_GymDoorLocked::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tdelay 20\n\tmsgbox ViridianCity_Text_GymDoorsAreLocked\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, ViridianCity_Movement_JumpDownLedge\n\twaitmovement 0\n\treleaseall\n\tend\n\nViridianCity_Movement_JumpDownLedge::\n\tjump_2_down\n\tstep_end\n\nViridianCity_EventScript_CitySign::\n\tmsgbox ViridianCity_Text_CitySign, MSGBOX_SIGN\n\tend\n\nViridianCity_EventScript_TrainerTips1::\n\tmsgbox ViridianCity_Text_CatchMonsForEasierBattles, MSGBOX_SIGN\n\tend\n\nViridianCity_EventScript_TrainerTips2::\n\tmsgbox ViridianCity_Text_MovesLimitedByPP, MSGBOX_SIGN\n\tend\n\nViridianCity_EventScript_GymSign::\n\tmsgbox ViridianCity_Text_GymSign, MSGBOX_SIGN\n\tend\n\nViridianCity_EventScript_GymDoor::\n\tmsgbox ViridianCity_Text_GymDoorsAreLocked, MSGBOX_SIGN\n\tend\n\nViridianCity_EventScript_Boy::\n\tmsgbox ViridianCity_Text_CanCarryMonsAnywhere, MSGBOX_NPC\n\tend\n\n@ Other old man, not the tutorial old man\nViridianCity_EventScript_OldMan::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_GYM_DOOR, 1, ViridianCity_EventScript_OldManGymLeaderReturned\n\tmsgbox ViridianCity_Text_GymClosedWonderWhoLeaderIs\n\tclosemessage\n\tapplymovement LOCALID_OLD_MAN, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nViridianCity_EventScript_OldManGymLeaderReturned::\n\tmsgbox ViridianCity_Text_ViridiansGymLeaderReturned\n\trelease\n\tend\n\nViridianCity_EventScript_TutorialOldMan::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_BADGE01_GET, ViridianCity_EventScript_AskIfTeachyTVHelpful\n\tgoto_if_ge VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 2, ViridianCity_EventScript_TutorialCompleted\n\tgoto_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 1, ViridianCity_EventScript_TutorialStart\n\tgoto_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 0, ViridianCity_EventScript_TutorialNotReady\n\tend\n\nViridianCity_EventScript_AskIfTeachyTVHelpful::\n\tmsgbox ViridianCity_Text_HowsTeachyTVHelping, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, ViridianCity_EventScript_TeachyTVNotHelpful\n\tmsgbox ViridianCity_Text_MyGrandsonOnTheShow\n\trelease\n\tend\n\nViridianCity_EventScript_TeachyTVNotHelpful::\n\tmsgbox ViridianCity_Text_TooBusyForTeachyTV\n\trelease\n\tend\n\nViridianCity_EventScript_TutorialCompleted::\n\tmsgbox ViridianCity_Text_WeakenMonsFirstToCatch\n\trelease\n\tend\n\nViridianCity_EventScript_TutorialStart::\n\tcall ViridianCity_EventScript_DoTutorialBattle\n\trelease\n\tend\n\n@ Unused\nViridianCity_EventScript_WatchToLearnBasics::\n\tmsgbox ViridianCity_Text_WatchThatToLearnBasics\n\trelease\n\tend\n\n@ Unused. Starts battle after the post battle text, which is odd.\nViridianCity_EventScript_TutorialUnused::\n\tmsgbox ViridianCity_Text_ThatWasEducationalTakeThis\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tspecial StartOldManTutorialBattle\n\twaitstate\n\trelease\n\tend\n\nViridianCity_EventScript_TutorialNotReady::\n\tmsgbox ViridianCity_Text_ThisIsPrivateProperty\n\tclosemessage\n\trelease\n\tend\n\nViridianCity_EventScript_Youngster::\n\tlock\n\tfaceplayer\n\tmsgbox ViridianCity_Text_WantToKnowAboutCaterpillarMons, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, ViridianCity_EventScript_YoungsterExplainCaterpillars\n\tgoto_if_eq VAR_RESULT, NO, ViridianCity_EventScript_YoungsterDeclineExplanation\n\tend\n\nViridianCity_EventScript_YoungsterExplainCaterpillars::\n\tmsgbox ViridianCity_Text_ExplainCaterpieWeedle\n\trelease\n\tend\n\nViridianCity_EventScript_YoungsterDeclineExplanation::\n\tmsgbox ViridianCity_Text_OhOkayThen\n\trelease\n\tend\n\nViridianCity_EventScript_Woman::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 0, ViridianCity_EventScript_WomanRoadBlocked\n\tmsgbox ViridianCity_Text_GoShoppingInPewterOccasionally\n\trelease\n\tend\n\nViridianCity_EventScript_WomanRoadBlocked::\n\tmsgbox ViridianCity_Text_GrandpaHasntHadCoffeeYet\n\tclosemessage\n\tapplymovement LOCALID_WOMAN, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nViridianCity_EventScript_DreamEaterTutor::\n\tgoto EventScript_DreamEaterTutor\n\tend\n\nViridianCity_EventScript_RoadBlocked::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox ViridianCity_Text_ThisIsPrivateProperty\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, ViridianCity_Movement_WalkDown\n\twaitmovement 0\n\treleaseall\n\tend\n\nViridianCity_Movement_WalkDown::\n\twalk_down\n\tstep_end\n\nViridianCity_EventScript_TutorialTriggerLeft::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement LOCALID_TUTORIAL_MAN, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tcall ViridianCity_EventScript_DoTutorialBattle\n\trelease\n\tend\n\nViridianCity_EventScript_TutorialTriggerRight::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement LOCALID_TUTORIAL_MAN, Common_Movement_WalkInPlaceFasterRight\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tcall ViridianCity_EventScript_DoTutorialBattle\n\trelease\n\tend\n\nViridianCity_EventScript_DoTutorialBattle::\n\tspecialvar VAR_RESULT, CalculatePlayerPartyCount\n\tgoto_if_ne VAR_RESULT, 1, ViridianCity_EventScript_SkipTutorialBattle\n\tmsgbox ViridianCity_Text_ShowYouHowToCatchMons\n\tclosemessage\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tspecial StartOldManTutorialBattle\n\twaitstate\n\tlock\n\tfaceplayer\n\tmsgbox ViridianCity_Text_ThatWasEducationalTakeThis\n\tsetvar VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 2\n\tgiveitem ITEM_TEACHY_TV\n\tmsgbox ViridianCity_Text_WatchThatToLearnBasics\n\treturn\n\nViridianCity_EventScript_SkipTutorialBattle::\n\tmsgbox ViridianCity_Text_SkipTutorial\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tsetvar VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN, 2\n\tgiveitem ITEM_TEACHY_TV\n\tmsgbox ViridianCity_Text_WatchThatToLearnBasics\n\trelease\n\tend"
  },
  {
    "path": "data/maps/ViridianCity/text.inc",
    "content": "ViridianCity_Text_CanCarryMonsAnywhere::\n    .string \"Those POKé BALLS at your waist!\\n\"\n    .string \"You have POKéMON, don't you?\\p\"\n    .string \"It's great that you can carry and\\n\"\n    .string \"use POKéMON anytime, anywhere.$\"\n\nViridianCity_Text_GymClosedWonderWhoLeaderIs::\n    .string \"This POKéMON GYM is always closed.\\p\"\n    .string \"I wonder who the LEADER is?$\"\n\nViridianCity_Text_ViridiansGymLeaderReturned::\n    .string \"VIRIDIAN GYM's LEADER returned!$\"\n\nViridianCity_Text_WantToKnowAboutCaterpillarMons::\n    .string \"You want to know about the two\\n\"\n    .string \"kinds of caterpillar POKéMON?$\"\n\nViridianCity_Text_OhOkayThen::\n    .string \"Oh, okay then!$\"\n\nViridianCity_Text_ExplainCaterpieWeedle::\n    .string \"CATERPIE has no poison,\\n\"\n    .string \"but WEEDLE does.\\p\"\n    .string \"Watch that your POKéMON aren't\\n\"\n    .string \"stabbed by WEEDLE's POISON STING.$\"\n\nViridianCity_Text_GrandpaHasntHadCoffeeYet::\n    .string \"Oh, Grandpa!\\n\"\n    .string \"Don't be so mean!\\p\"\n    .string \"I'm so sorry.\\n\"\n    .string \"He hasn't had his coffee yet.$\"\n\nViridianCity_Text_GoShoppingInPewterOccasionally::\n    .string \"I go shopping in PEWTER CITY\\n\"\n    .string \"occasionally.\\p\"\n    .string \"I have to take the winding trail in\\n\"\n    .string \"VIRIDIAN FOREST when I go.$\"\n\nViridianCity_Text_ThisIsPrivateProperty::\n    .string \"I absolutely forbid you from\\n\"\n    .string \"going through here!\\p\"\n    .string \"This is private property!$\"\n\nViridianCity_Text_ShowYouHowToCatchMons::\n    .string \"Well, now, I've had my coffee, and\\n\"\n    .string \"that's what I need to get going!\\p\"\n    .string \"Hm?\\n\"\n    .string \"What is that red box you have?\\p\"\n    .string \"Ah, so you're working on your\\n\"\n    .string \"POKéDEX.\\p\"\n    .string \"Then let me give you a word of\\n\"\n    .string \"advice.\\p\"\n    .string \"Whenever you catch a POKéMON,\\n\"\n    .string \"the POKéDEX automatically updates\\l\"\n    .string \"its data.\\p\"\n    .string \"…You don't know how to catch\\n\"\n    .string \"a POKéMON?\\p\"\n    .string \"I suppose I had better show you\\n\"\n    .string \"then!$\"\n\nViridianCity_Text_SkipTutorial::\n    .string \"Well, now, I've had my coffee, and\\n\"\n    .string \"that's what I need to get going!\\p\"\n    .string \"Hm?\\n\"\n    .string \"What is that red box you have?\\p\"\n    .string \"Ah, so you're working on your\\n\"\n    .string \"POKéDEX.\\p\"\n    .string \"Then let me give you a word of\\n\"\n    .string \"advice.\\p\"\n    .string \"Whenever you catch a POKéMON,\\n\"\n    .string \"the POKéDEX automatically updates\\l\"\n    .string \"its data.\\p\"\n    .string \"I see you already know how to\\n\"\n    .string \"catch POKéMON!\\p\"\n    .string \"Why don't you take this with you,\"\n    .string \"\\nthen?$\"\n\nViridianCity_Text_ThatWasEducationalTakeThis::\n    .string \"There! Now tell me, that was\\n\"\n    .string \"educational, was it not?\\p\"\n    .string \"And here, take this, too.$\"\n\nViridianCity_Text_WatchThatToLearnBasics::\n    .string \"If there's something you don't\\n\"\n    .string \"understand, watch that.\\p\"\n    .string \"It will teach you about the basics\\n\"\n    .string \"of being a POKéMON TRAINER.$\"\n\nViridianCity_Text_WeakenMonsFirstToCatch::\n    .string \"Well, now, I've had my coffee, and\\n\"\n    .string \"that's what I need to get going!\\p\"\n    .string \"But I made it too strong.\\n\"\n    .string \"It gave me a headache…\\p\"\n    .string \"Incidentally, are you filling your\\n\"\n    .string \"POKéDEX?\\p\"\n    .string \"At first, focus on weakening the\\n\"\n    .string \"POKéMON before trying to catch it.$\"\n\nViridianCity_Text_HowsTeachyTVHelping::\n    .string \"Well, now, I've had my coffee, and\\n\"\n    .string \"that's what I need to get going!\\p\"\n    .string \"But I made it too strong.\\n\"\n    .string \"It gave me a headache…\\p\"\n    .string \"Incidentally, is my old TEACHY TV\\n\"\n    .string \"helping you?$\"\n\nViridianCity_Text_MyGrandsonOnTheShow::\n    .string \"Wahaha!\\n\"\n    .string \"It's my grandson on the show!\\p\"\n    .string \"Since he's the one doing the\\n\"\n    .string \"teaching, you're bound to learn.$\"\n\nViridianCity_Text_TooBusyForTeachyTV::\n    .string \"Hm… You're too busy to not even\\n\"\n    .string \"have the time for TEACHY TV…\\p\"\n    .string \"Time is money, and neither should\\n\"\n    .string \"be ill spent…$\"\n\nViridianCity_Text_CitySign::\n    .string \"VIRIDIAN CITY \\n\"\n    .string \"The Eternally Green Paradise$\"\n\nViridianCity_Text_CatchMonsForEasierBattles::\n    .string \"TRAINER TIPS\\p\"\n    .string \"Catch POKéMON and expand your\\n\"\n    .string \"collection.\\p\"\n    .string \"The more you have, the easier it\\n\"\n    .string \"is to battle.$\"\n\nViridianCity_Text_MovesLimitedByPP::\n    .string \"TRAINER TIPS\\p\"\n    .string \"The battle moves of POKéMON are\\n\"\n    .string \"limited by their POWER POINTS, PP.\\p\"\n    .string \"To replenish PP, rest your tired\\n\"\n    .string \"POKéMON at a POKéMON CENTER.$\"\n\nViridianCity_Text_GymSign::\n    .string \"VIRIDIAN CITY POKéMON GYM$\"\n\nViridianCity_Text_GymDoorsAreLocked::\n    .string \"VIRIDIAN GYM's doors are locked…$\"\n\n"
  },
  {
    "path": "data/maps/ViridianCity_Gym/map.json",
    "content": "{\n  \"id\": \"MAP_VIRIDIAN_CITY_GYM\",\n  \"name\": \"ViridianCity_Gym\",\n  \"layout\": \"LAYOUT_VIRIDIAN_CITY_GYM\",\n  \"music\": \"MUS_GYM\",\n  \"region_map_section\": \"MAPSEC_VIRIDIAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_GYM\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"ViridianCity_Gym_EventScript_Takashi\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"ViridianCity_Gym_EventScript_Yuji\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 11,\n      \"y\": 14,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"ViridianCity_Gym_EventScript_Atsushi\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TAMER\",\n      \"x\": 10,\n      \"y\": 10,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"ViridianCity_Gym_EventScript_Jason\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_TAMER\",\n      \"x\": 2,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"ViridianCity_Gym_EventScript_Cole\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BLACKBELT\",\n      \"in_connection\": false,\n      \"x\": 3,\n      \"y\": 11,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"2\",\n      \"script\": \"ViridianCity_Gym_EventScript_Kiyo\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"ViridianCity_Gym_EventScript_Samuel\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GIOVANNI\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_Gym_EventScript_Giovanni\",\n      \"flag\": \"FLAG_HIDE_VIRIDIAN_GIOVANNI\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_COOLTRAINER_M\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"3\",\n      \"script\": \"ViridianCity_Gym_EventScript_Warren\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GYM_GUY\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 20,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_Gym_EventScript_GymGuy\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 16,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 17,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"2\"\n    },\n    {\n      \"x\": 18,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"2\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 15,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianCity_Gym_EventScript_GymStatue\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 19,\n      \"y\": 20,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianCity_Gym_EventScript_GymStatue\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"item\": \"ITEM_MACHO_BRACE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_VIRIDIAN_CITY_GYM_MACHO_BRACE\",\n      \"quantity\": 1,\n      \"underfoot\": true\n    }\n  ],\n  \"level_scaling\": \"4\"\n}\n"
  },
  {
    "path": "data/maps/ViridianCity_Gym/scripts.inc",
    "content": ".set LOCALID_GIOVANNI, 8\n\nViridianCity_Gym_MapScripts::\n\t.byte 0\n\nViridianCity_Gym_EventScript_Giovanni::\n\tfamechecker FAMECHECKER_GIOVANNI, FCPICKSTATE_COLORED, UpdatePickStateFromSpecialVar8005\n\tcallnative IsChallengeModeToVarResult\n\tgoto_if_eq VAR_RESULT, TRUE, ViridianCity_Gym_EventScript_Giovanni_ChallengeMode\n\ttrainerbattle_single TRAINER_LEADER_GIOVANNI, ViridianCity_Gym_Text_GiovanniIntro, ViridianCity_Gym_Text_GiovanniDefeat, ViridianCity_Gym_EventScript_DefeatedGiovanni, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_GIOVANNI_CHALLENGE\n\tgoto_if_unset FLAG_GOT_TM26_FROM_GIOVANNI, ViridianCity_Gym_EventScript_GiveTM26\n\tmsgbox ViridianCity_Gym_Text_GiovanniPostBattle\n\tclosemessage\n\tfadescreen FADE_TO_BLACK\n\tremoveobject 8\n\tfadescreen FADE_FROM_BLACK\n\trelease\n\tend\n\nViridianCity_Gym_EventScript_Giovanni_ChallengeMode::\n\ttrainerbattle_single TRAINER_LEADER_GIOVANNI_CHALLENGE, ViridianCity_Gym_Text_GiovanniIntro, ViridianCity_Gym_Text_GiovanniDefeat, ViridianCity_Gym_EventScript_DefeatedGiovanni, NO_MUSIC\n\tsettrainerflag TRAINER_LEADER_GIOVANNI\n\tgoto_if_unset FLAG_GOT_TM26_FROM_GIOVANNI, ViridianCity_Gym_EventScript_GiveTM26\n\tmsgbox ViridianCity_Gym_Text_GiovanniPostBattle\n\tclosemessage\n\tfadescreen FADE_TO_BLACK\n\tremoveobject LOCALID_GIOVANNI\n\tfadescreen FADE_FROM_BLACK\n\trelease\n\tend\n\nViridianCity_Gym_EventScript_DefeatedGiovanni::\n\tfamechecker FAMECHECKER_GIOVANNI, 3\n\tsetflag FLAG_HIDE_MISC_KANTO_ROCKETS\n\tsetflag FLAG_DEFEATED_LEADER_GIOVANNI\n\tsetflag FLAG_BADGE08_GET\n\tsetvar VAR_MAP_SCENE_ROUTE22, 3\n\tset_gym_trainers 8\n\tgoto ViridianCity_Gym_EventScript_GiveTM26\n\tend\n\nViridianCity_Gym_EventScript_GiveTM26::\n\tmsgbox ViridianCity_Gym_Text_ExplainEarthBadgeTakeThis\n\tcheckitemspace ITEM_TM26\n\tgoto_if_eq VAR_RESULT, FALSE, ViridianCity_Gym_EventScript_NoRoomForTM26\n\tgiveitem_msg ViridianCity_Gym_Text_ReceivedTM26FromGiovanni, ITEM_TM26\n\tsetflag FLAG_GOT_TM26_FROM_GIOVANNI\n\tmsgbox ViridianCity_Gym_Text_ExplainTM26\n\trelease\n\tend\n\nViridianCity_Gym_EventScript_NoRoomForTM26::\n\tmsgbox ViridianCity_Gym_Text_YouDoNotHaveSpace\n\trelease\n\tend\n\nViridianCity_Gym_EventScript_Jason::\n\ttrainerbattle_single TRAINER_TAMER_JASON, ViridianCity_Gym_Text_JasonIntro, ViridianCity_Gym_Text_JasonDefeat\n\tmsgbox ViridianCity_Gym_Text_JasonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nViridianCity_Gym_EventScript_Cole::\n\ttrainerbattle_single TRAINER_TAMER_COLE, ViridianCity_Gym_Text_ColeIntro, ViridianCity_Gym_Text_ColeDefeat\n\tmsgbox ViridianCity_Gym_Text_ColePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nViridianCity_Gym_EventScript_Atsushi::\n\ttrainerbattle_single TRAINER_BLACK_BELT_ATSUSHI, ViridianCity_Gym_Text_AtsushiIntro, ViridianCity_Gym_Text_AtsushiDefeat\n\tmsgbox ViridianCity_Gym_Text_AtsushiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nViridianCity_Gym_EventScript_Kiyo::\n\ttrainerbattle_single TRAINER_BLACK_BELT_KIYO, ViridianCity_Gym_Text_KiyoIntro, ViridianCity_Gym_Text_KiyoDefeat\n\tmsgbox ViridianCity_Gym_Text_KiyoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nViridianCity_Gym_EventScript_Takashi::\n\ttrainerbattle_single TRAINER_BLACK_BELT_TAKASHI, ViridianCity_Gym_Text_TakashiIntro, ViridianCity_Gym_Text_TakashiDefeat\n\tmsgbox ViridianCity_Gym_Text_TakashiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nViridianCity_Gym_EventScript_Samuel::\n\ttrainerbattle_single TRAINER_COOLTRAINER_SAMUEL, ViridianCity_Gym_Text_SamuelIntro, ViridianCity_Gym_Text_SamuelDefeat\n\tmsgbox ViridianCity_Gym_Text_SamuelPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nViridianCity_Gym_EventScript_Yuji::\n\ttrainerbattle_single TRAINER_COOLTRAINER_YUJI, ViridianCity_Gym_Text_YujiIntro, ViridianCity_Gym_Text_YujiDefeat\n\tmsgbox ViridianCity_Gym_Text_YujiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nViridianCity_Gym_EventScript_Warren::\n\ttrainerbattle_single TRAINER_COOLTRAINER_WARREN, ViridianCity_Gym_Text_WarrenIntro, ViridianCity_Gym_Text_WarrenDefeat\n\tmsgbox ViridianCity_Gym_Text_WarrenPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nViridianCity_Gym_EventScript_GymGuy::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_DEFEATED_LEADER_GIOVANNI, ViridianCity_Gym_EventScript_GymGuyPostVictory\n\tmsgbox ViridianCity_Gym_Text_GymGuyAdvice\n\trelease\n\tend\n\nViridianCity_Gym_EventScript_GymGuyPostVictory::\n\tfamechecker FAMECHECKER_GIOVANNI, 4\n\tmsgbox ViridianCity_Gym_Text_GymGuyPostVictory\n\trelease\n\tend\n\nViridianCity_Gym_EventScript_GymStatue::\n\tlockall\n\tgoto_if_set FLAG_BADGE08_GET, ViridianCity_Gym_EventScript_GymStatuePostVictory\n\tmsgbox ViridianCity_Gym_Text_GymStatue\n\treleaseall\n\tend\n\nViridianCity_Gym_EventScript_GymStatuePostVictory::\n\tmsgbox ViridianCity_Gym_Text_GymStatuePlayerWon\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/ViridianCity_Gym/text.inc",
    "content": "ViridianCity_Gym_Text_GiovanniIntro::\n    .string \"Fwahahaha!\\n\"\n    .string \"Welcome to my hideout!\\p\"\n    .string \"It shall be so until I can restore\\n\"\n    .string \"TEAM ROCKET to its former glory.\\p\"\n    .string \"But, you have found me again.\\n\"\n    .string \"So be it.\\l\"\n    .string \"This time, I'm not holding back!\\p\"\n    .string \"Once more, you shall face\\n\"\n    .string \"GIOVANNI, the greatest TRAINER!{PLAY_BGM}{MUS_ENCOUNTER_ROCKET}$\"\n\nViridianCity_Gym_Text_GiovanniDefeat::\n    .string \"Ha!\\n\"\n    .string \"That was a truly intense fight.\\l\"\n    .string \"You have won!\\p\"\n    .string \"As proof, here is the EARTHBADGE!\\n\"\n    .string \"{PAUSE_MUSIC}{PLAY_BGM}{MUS_OBTAIN_BADGE}{PAUSE 0xFE}{PAUSE 0x56}{RESUME_MUSIC}$\"\n\nViridianCity_Gym_Text_GiovanniPostBattle::\n    .string \"Having lost in this fashion, \\n\"\n    .string \"I can't face my followers.\\l\"\n    .string \"I have betrayed their trust.\\p\"\n    .string \"As of today, TEAM ROCKET is\\n\"\n    .string \"finished forever!\\p\"\n    .string \"As for myself, I shall dedicate\\n\"\n    .string \"my life to training again.\\p\"\n    .string \"Let us meet again someday!\\n\"\n    .string \"Farewell!$\"\n\nViridianCity_Gym_Text_ExplainEarthBadgeTakeThis::\n    .string \"The EARTHBADGE makes POKéMON of\\n\"\n    .string \"any level obey without question.\\p\"\n    .string \"It is evidence of your mastery as\\n\"\n    .string \"a POKéMON TRAINER.\\p\"\n    .string \"With it, you can challenge the\\n\"\n    .string \"POKéMON LEAGUE.\\p\"\n    .string \"Also, take this TM.\\p\"\n    .string \"Consider it a gift for your POKéMON\\n\"\n    .string \"LEAGUE challenge.$\"\n\nViridianCity_Gym_Text_ReceivedTM26FromGiovanni::\n    .string \"{PLAYER} received TM26\\n\"\n    .string \"from GIOVANNI.$\"\n\nViridianCity_Gym_Text_ExplainTM26::\n    .string \"TM26 contains EARTHQUAKE.\\p\"\n    .string \"It is a powerful attack that causes\\n\"\n    .string \"a massive tremor.\\p\"\n    .string \"I made it when I ran the GYM here,\\n\"\n    .string \"far too long ago… $\"\n\nViridianCity_Gym_Text_YouDoNotHaveSpace::\n    .string \"You do not have space for this!$\"\n\nViridianCity_Gym_Text_YujiIntro::\n    .string \"Heh!\\n\"\n    .string \"You must be running out of steam\\l\"\n    .string \"by now!$\"\n\nViridianCity_Gym_Text_YujiDefeat::\n    .string \"I ran out of gas!$\"\n\nViridianCity_Gym_Text_YujiPostBattle::\n    .string \"You'll need power to keep up with\\n\"\n    .string \"our GYM LEADER.$\"\n\nViridianCity_Gym_Text_AtsushiIntro::\n    .string \"Rrrroar!\\n\"\n    .string \"I'm working myself into a rage!$\"\n\nViridianCity_Gym_Text_AtsushiDefeat::\n    .string \"Wargh!$\"\n\nViridianCity_Gym_Text_AtsushiPostBattle::\n    .string \"I'm still not worthy!$\"\n\nViridianCity_Gym_Text_JasonIntro::\n    .string \"POKéMON and I, we make wonderful\\n\"\n    .string \"music together!$\"\n\nViridianCity_Gym_Text_JasonDefeat::\n    .string \"You are in perfect harmony!$\"\n\nViridianCity_Gym_Text_JasonPostBattle::\n    .string \"Do you know the identity of our\\n\"\n    .string \"GYM LEADER?$\"\n\nViridianCity_Gym_Text_KiyoIntro::\n    .string \"Karate is the ultimate form of\\n\"\n    .string \"martial arts!$\"\n\nViridianCity_Gym_Text_KiyoDefeat::\n    .string \"Aiyah!$\"\n\nViridianCity_Gym_Text_KiyoPostBattle::\n    .string \"If my POKéMON were as good at\\n\"\n    .string \"karate as I…$\"\n\nViridianCity_Gym_Text_WarrenIntro::\n    .string \"The truly talented win with style.$\"\n\nViridianCity_Gym_Text_WarrenDefeat::\n    .string \"I lost my grip!$\"\n\nViridianCity_Gym_Text_WarrenPostBattle::\n    .string \"The LEADER will scold me for\\n\"\n    .string \"losing this way…$\"\n\nViridianCity_Gym_Text_TakashiIntro::\n    .string \"I'm the KARATE KING!\\n\"\n    .string \"Your fate rests with me!$\"\n\nViridianCity_Gym_Text_TakashiDefeat::\n    .string \"Ayah!$\"\n\nViridianCity_Gym_Text_TakashiPostBattle::\n    .string \"The POKéMON LEAGUE?\\n\"\n    .string \"You? Don't get cocky!$\"\n\nViridianCity_Gym_Text_ColeIntro::\n    .string \"Your POKéMON will cower at the\\n\"\n    .string \"crack of my whip!$\"\n\nViridianCity_Gym_Text_ColeDefeat::\n    .string \"Yowch!\\n\"\n    .string \"Whiplash!$\"\n\nViridianCity_Gym_Text_ColePostBattle::\n    .string \"Wait!\\n\"\n    .string \"I was just careless!$\"\n\nViridianCity_Gym_Text_SamuelIntro::\n    .string \"VIRIDIAN GYM was closed for a\\n\"\n    .string \"long time.\\p\"\n    .string \"But now, our LEADER is back!$\"\n\nViridianCity_Gym_Text_SamuelDefeat::\n    .string \"I was beaten?$\"\n\nViridianCity_Gym_Text_SamuelPostBattle::\n    .string \"You can go on to the POKéMON\\n\"\n    .string \"LEAGUE only by defeating our GYM\\l\"\n    .string \"LEADER!$\"\n\nViridianCity_Gym_Text_GymGuyAdvice::\n    .string \"Yo!\\n\"\n    .string \"Champ in the making!\\p\"\n    .string \"Even I don't know the VIRIDIAN\\n\"\n    .string \"LEADER's identity.\\p\"\n    .string \"But one thing's certain.\\n\"\n    .string \"This will be the toughest of all\\l\"\n    .string \"the GYM LEADERS.\\p\"\n    .string \"Also, I heard that the TRAINERS\\n\"\n    .string \"here like GROUND-type POKéMON.$\"\n\nViridianCity_Gym_Text_GymGuyPostVictory::\n    .string \"Blow me away! GIOVANNI was the\\n\"\n    .string \"GYM LEADER of VIRIDIAN?$\"\n\nViridianCity_Gym_Text_GymStatue::\n    .string \"VIRIDIAN POKéMON GYM\\n\"\n    .string \"LEADER: ?\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}$\"\n\nViridianCity_Gym_Text_GymStatuePlayerWon::\n    .string \"VIRIDIAN POKéMON GYM\\n\"\n    .string \"LEADER: GIOVANNI\\p\"\n    .string \"WINNING TRAINERS:\\n\"\n    .string \"{RIVAL}, {PLAYER}$\"\n\n"
  },
  {
    "path": "data/maps/ViridianCity_House/map.json",
    "content": "{\n  \"id\": \"MAP_VIRIDIAN_CITY_HOUSE\",\n  \"name\": \"ViridianCity_House\",\n  \"layout\": \"LAYOUT_VIRIDIAN_CITY_HOUSE\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_VIRIDIAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BALDING_MAN\",\n      \"x\": 7,\n      \"y\": 4,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_House_EventScript_BaldingMan\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LITTLE_GIRL\",\n      \"x\": 2,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 2,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_House_EventScript_LittleGirl\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SPEAROW\",\n      \"x\": 6,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT\",\n      \"movement_range_x\": 4,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_House_EventScript_Speary\",\n      \"flag\": \"0\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 7,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianCity_House_EventScript_NicknameSign\"\n    }\n  ],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ViridianCity_House/scripts.inc",
    "content": "ViridianCity_House_MapScripts::\n\t.byte 0\n\nViridianCity_House_EventScript_BaldingMan::\n\tmsgbox ViridianCity_House_Text_NicknamingIsFun, MSGBOX_NPC\n\tend\n\nViridianCity_House_EventScript_LittleGirl::\n\tmsgbox ViridianCity_House_Text_MyDaddyLovesMonsToo, MSGBOX_NPC\n\tend\n\nViridianCity_House_EventScript_Speary::\n\tlock\n\tfaceplayer\n\twaitse\n\tplaymoncry SPECIES_SPEAROW, CRY_MODE_NORMAL\n\tmsgbox ViridianCity_House_Text_Speary\n\twaitmoncry\n\trelease\n\tend\n\nViridianCity_House_EventScript_NicknameSign::\n\tmsgbox ViridianCity_House_Text_SpearowNameSpeary, MSGBOX_SIGN\n\tend\n"
  },
  {
    "path": "data/maps/ViridianCity_House/text.inc",
    "content": "ViridianCity_House_Text_NicknamingIsFun::\n    .string \"Coming up with nicknames is fun,\\n\"\n    .string \"but it's not so easy to do.\\p\"\n    .string \"Clever names are nice, but simple\\n\"\n    .string \"names are easier to remember.$\"\n\nViridianCity_House_Text_MyDaddyLovesMonsToo::\n    .string \"My daddy loves POKéMON, too.$\"\n\nViridianCity_House_Text_Speary::\n    .string \"SPEARY: Tetweet!$\"\n\nViridianCity_House_Text_SpearowNameSpeary::\n    .string \"SPEAROW\\n\"\n    .string \"Name: SPEARY$\"\n\n"
  },
  {
    "path": "data/maps/ViridianCity_Mart/map.json",
    "content": "{\n  \"id\": \"MAP_VIRIDIAN_CITY_MART\",\n  \"name\": \"ViridianCity_Mart\",\n  \"layout\": \"LAYOUT_MART\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_VIRIDIAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 0,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_RIGHT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_Mart_EventScript_Clerk\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_Mart_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_1\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_UP_AND_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_Mart_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Meowth\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"4\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"4\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ViridianCity_Mart/scripts.inc",
    "content": ".set LOCALID_CLERK, 1\n.set LOCALID_MEOWTH_MASTER, 4\n.set TRAINER, VAR_0x8009\n\nViridianCity_Mart_MapScripts::\n\tmap_script MAP_SCRIPT_ON_LOAD, ViridianCity_Mart_OnLoad\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, ViridianCity_Mart_OnFrame\n\tmap_script MAP_SCRIPT_ON_TRANSITION, ViridianCity_Mart_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nViridianCity_Mart_OnLoad::\n\tgoto_if_unset FLAG_SYS_POKEDEX_GET, ViridianCity_Mart_EventScript_HideQuestionnaire\n\tend\n\nViridianCity_Mart_MapScript_SetMasterTrainerMovementTypes:\n\tsetvar TRAINER, MASTER_MEOWTH\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, ViridianCity_Mart_MapScript_MeowthMasterMovementType\n\tend\n\nViridianCity_Mart_MapScript_MeowthMasterMovementType::\n\tsetobjectmovementtype LOCALID_MEOWTH_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nViridianCity_Mart_EventScript_HideQuestionnaire::\n\tsetmetatile 1, 3, METATILE_Mart_CounterMid_Top, 1\n\tsetmetatile 1, 4, METATILE_Mart_CounterMid_Bottom, 1\n\tend\n\nViridianCity_Mart_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_VIRIDIAN_CITY_MART, 0, ViridianCity_Mart_EventScript_ParcelScene\n\t.2byte 0\n\nViridianCity_Mart_EventScript_ParcelScene::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement LOCALID_CLERK, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tmsgbox ViridianCity_Mart_Text_YouCameFromPallet\n\tclosemessage\n\tapplymovement LOCALID_CLERK, ViridianCity_Mart_Movement_FacePlayer\n\tapplymovement OBJ_EVENT_ID_PLAYER, ViridianCity_Mart_Movement_ApproachCounter\n\twaitmovement 0\n\tmsgbox ViridianCity_Mart_Text_TakeThisToProfOak\n\tsetvar VAR_MAP_SCENE_VIRIDIAN_CITY_MART, 1\n\tgiveitem_msg ViridianCity_Mart_Text_ReceivedOaksParcelFromClerk, ITEM_OAKS_PARCEL, 1, MUS_OBTAIN_KEY_ITEM\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB, 5\n\treleaseall\n\tend\n\nViridianCity_Mart_Movement_ApproachCounter::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_in_place_faster_left\n\tstep_end\n\nViridianCity_Mart_Movement_FacePlayer::\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\twalk_in_place_faster_right\n\tstep_end\n\nViridianCity_Mart_EventScript_Clerk::\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_MAP_SCENE_VIRIDIAN_CITY_MART, 1, ViridianCity_Mart_EventScript_SayHiToOak\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tmessage Text_MayIHelpYou\n\twaitmessage\n\tpokemart ViridianCity_Mart_Items\n\tmsgbox Text_PleaseComeAgain\n\trelease\n\tend\n\n\t.align 2\nViridianCity_Mart_Items::\n\t.2byte ITEM_POKE_BALL\n\t.2byte ITEM_POTION\n\t.2byte ITEM_ANTIDOTE\n\t.2byte ITEM_PARALYZE_HEAL\n\t.2byte ITEM_NONE\n\trelease\n\tend\n\nViridianCity_Mart_EventScript_SayHiToOak::\n\tmsgbox ViridianCity_Mart_Text_SayHiToOakForMe\n\trelease\n\tend\n\nViridianCity_Mart_EventScript_Woman::\n\tmsgbox ViridianCity_Mart_Text_ShopDoesGoodBusinessInAntidotes, MSGBOX_NPC\n\tend\n\nViridianCity_Mart_EventScript_Youngster::\n\tmsgbox ViridianCity_Mart_Text_GotToBuySomePotions, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/ViridianCity_Mart/text.inc",
    "content": "ViridianCity_Mart_Text_YouCameFromPallet::\n    .string \"Hey!\\n\"\n    .string \"You came from PALLET TOWN?$\"\n\nViridianCity_Mart_Text_TakeThisToProfOak::\n    .string \"You know PROF. OAK, right?\\p\"\n    .string \"His order came in.\\n\"\n    .string \"Can I get you to take it to him?$\"\n\nViridianCity_Mart_Text_ReceivedOaksParcelFromClerk::\n    .string \"{PLAYER} received OAK'S PARCEL\\n\"\n    .string \"from the POKéMON MART clerk.$\"\n\nViridianCity_Mart_Text_SayHiToOakForMe::\n    .string \"Okay, thanks! Please say hi to\\n\"\n    .string \"PROF. OAK for me, too.$\"\n\nViridianCity_Mart_Text_ShopDoesGoodBusinessInAntidotes::\n    .string \"This shop does good business in\\n\"\n    .string \"ANTIDOTES, I've heard.$\"\n\nViridianCity_Mart_Text_GotToBuySomePotions::\n    .string \"I've got to buy some POTIONS.\\p\"\n    .string \"You never know when your POKéMON\\n\"\n    .string \"will need quick healing.$\"\n\n"
  },
  {
    "path": "data/maps/ViridianCity_PokemonCenter_1F/map.json",
    "content": "{\n  \"id\": \"MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F\",\n  \"name\": \"ViridianCity_PokemonCenter_1F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_1F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_VIRIDIAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_NURSE\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_PokemonCenter_1F_EventScript_Nurse\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_SCIENTIST\",\n      \"in_connection\": false,\n      \"x\": 9,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"NULL\",\n      \"flag\": \"FLAG_HIDE_NATIONAL_DEX_AIDE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_GENTLEMAN\",\n      \"in_connection\": false,\n      \"x\": 12,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_PokemonCenter_1F_EventScript_Gentleman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_LOOK_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_PokemonCenter_1F_EventScript_Boy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 2,\n      \"y\": 3,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_WANDER_AROUND\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_PokemonCenter_1F_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_CLERK\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"EventScript_SoftlockClerk\",\n      \"flag\": \"FLAG_TEMP_8\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_PSYCHIC_M\",\n      \"in_connection\": false,\n      \"x\": 14,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Drowzee\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 6,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 8,\n      \"y\": 8,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY_POKEMON_CENTER_2F\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [\n    {\n      \"type\": \"trigger\",\n      \"x\": 7,\n      \"y\": 8,\n      \"elevation\": 0,\n      \"var\": \"VAR_TEMP_0\",\n      \"var_value\": \"0\",\n      \"script\": \"NationalDexAideEvent\"\n    }\n  ],\n  \"bg_events\": [\n\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ViridianCity_PokemonCenter_1F/scripts.inc",
    "content": ".set LOCALID_DROWZEE_MASTER, 7\n.set TRAINER, VAR_0x8009\n\nViridianCity_PokemonCenter_1F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, ViridianCity_PokemonCenter_1F_OnTransition\n\tmap_script MAP_SCRIPT_ON_LOAD, PokemonCenter_1F_OnLoad\n\t.byte 0\n\nViridianCity_PokemonCenter_1F_MapScript_DrowzeeMasterMovementType:\n\tsetobjectmovementtype LOCALID_DROWZEE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nViridianCity_PokemonCenter_1F_OnTransition::\n\tsetrespawn SPAWN_VIRIDIAN_CITY\n\tgoto ViridianCity_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nViridianCity_PokemonCenter_1F_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_DROWZEE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, ViridianCity_PokemonCenter_1F_MapScript_DrowzeeMasterMovementType\n\tend\n\nViridianCity_PokemonCenter_1F_EventScript_Nurse::\n\tlock\n\tfaceplayer\n\tcall EventScript_PkmnCenterNurse\n\trelease\n\tend\n\nViridianCity_PokemonCenter_1F_EventScript_Boy::\n\tmsgbox ViridianCity_PokemonCenter_1F_Text_PokeCenterInEveryTown, MSGBOX_NPC\n\tend\n\nViridianCity_PokemonCenter_1F_EventScript_Gentleman::\n\tmsgbox ViridianCity_PokemonCenter_1F_Text_FeelFreeToUsePC, MSGBOX_NPC\n\tend\n\nViridianCity_PokemonCenter_1F_EventScript_Youngster::\n\tmsgbox ViridianCity_PokemonCenter_1F_Text_PokeCentersHealMons, MSGBOX_NPC\n\tend\n"
  },
  {
    "path": "data/maps/ViridianCity_PokemonCenter_1F/text.inc",
    "content": "ViridianCity_PokemonCenter_1F_Text_FeelFreeToUsePC::\n    .string \"Please feel free to use that PC in\\n\"\n    .string \"the corner.\\p\"\n    .string \"The receptionist told me so.\\n\"\n    .string \"It's so kind of her!$\"\n\nViridianCity_PokemonCenter_1F_Text_PokeCenterInEveryTown::\n    .string \"There's a POKéMON CENTER in every\\n\"\n    .string \"town ahead.\\p\"\n    .string \"They charge no money, so don't\\n\"\n    .string \"be shy about healing POKéMON.$\"\n\nViridianCity_PokemonCenter_1F_Text_PokeCentersHealMons::\n    .string \"POKéMON CENTERS heal your tired,\\n\"\n    .string \"hurt, or fainted POKéMON.\\p\"\n    .string \"They make all POKéMON completely\\n\"\n    .string \"healthy.$\"\n\n"
  },
  {
    "path": "data/maps/ViridianCity_PokemonCenter_2F/map.json",
    "content": "{\n  \"id\": \"MAP_VIRIDIAN_CITY_POKEMON_CENTER_2F\",\n  \"name\": \"ViridianCity_PokemonCenter_2F\",\n  \"layout\": \"LAYOUT_POKEMON_CENTER_2F\",\n  \"music\": \"MUS_POKE_CENTER\",\n  \"region_map_section\": \"MAPSEC_VIRIDIAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": null,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_UnionRoomAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 2,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_WirelessClubAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\",\n      \"x\": 10,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"Common_EventScript_DirectCornerAttendant\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_MG_DELIVERYMAN\",\n      \"x\": 1,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"CableClub_EventScript_MysteryGiftMan\",\n      \"flag\": \"FLAG_HIDE_MG_DELIVERYMEN\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 1,\n      \"y\": 6,\n      \"elevation\": 4,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_UNION_ROOM\",\n      \"dest_warp_id\": \"0\"\n    },\n    {\n      \"x\": 9,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_TRADE_CENTER\",\n      \"dest_warp_id\": \"0\"\n    }\n  ],\n  \"coord_events\": [],\n  \"bg_events\": [],\n\t\"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ViridianCity_PokemonCenter_2F/scripts.inc",
    "content": "ViridianCity_PokemonCenter_2F_MapScripts::\n\tmap_script MAP_SCRIPT_ON_FRAME_TABLE, CableClub_OnFrame\n\tmap_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, CableClub_OnWarp\n\tmap_script MAP_SCRIPT_ON_LOAD, CableClub_OnLoad\n\tmap_script MAP_SCRIPT_ON_TRANSITION, CableClub_OnTransition\n\t.byte 0\n\n@ The below 3 are unused and leftover from RS\nViridianCity_PokemonCenter_2F_EventScript_Colosseum::\n\tcall CableClub_EventScript_Colosseum\n\tend\n\nViridianCity_PokemonCenter_2F_EventScript_TradeCenter::\n\tcall CableClub_EventScript_TradeCenter\n\tend\n\nViridianCity_PokemonCenter_2F_EventScript_RecordCorner::\n\tcall CableClub_EventScript_RecordCorner\n\tend\n"
  },
  {
    "path": "data/maps/ViridianCity_School/map.json",
    "content": "{\n  \"id\": \"MAP_VIRIDIAN_CITY_SCHOOL\",\n  \"name\": \"ViridianCity_School\",\n  \"layout\": \"LAYOUT_VIRIDIAN_CITY_SCHOOL\",\n  \"music\": \"MUS_PEWTER\",\n  \"region_map_section\": \"MAPSEC_VIRIDIAN_CITY\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_NONE\",\n  \"map_type\": \"MAP_TYPE_INDOOR\",\n  \"allow_cycling\": false,\n  \"allow_escaping\": false,\n  \"allow_running\": false,\n  \"show_map_name\": false,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_WOMAN_2\",\n      \"in_connection\": false,\n      \"x\": 6,\n      \"y\": 2,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_School_EventScript_Woman\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_LASS\",\n      \"in_connection\": false,\n      \"x\": 4,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianCity_School_EventScript_Lass\",\n      \"flag\": \"0\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 8,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Bellsprout\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 3,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 7,\n      \"elevation\": 0,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 7,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_VIRIDIAN_CITY\",\n      \"dest_warp_id\": \"3\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 4,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianCity_School_EventScript_Notebook\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 5,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianCity_School_EventScript_Blackboard\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 4,\n      \"y\": 1,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianCity_School_EventScript_Blackboard\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"ViridianCity_School_EventScript_PokemonJournal\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 8,\n      \"y\": 2,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_NORTH\",\n      \"script\": \"ViridianCity_School_EventScript_PokemonJournal\"\n    }\n  ],\n  \"level_scaling\": \"0\"\n}\n"
  },
  {
    "path": "data/maps/ViridianCity_School/scripts.inc",
    "content": ".set LOCALID_WOMAN, 1\n.set LOCALID_LASS,  2\n.set LOCALID_BELLSPROUT_MASTER, 3\n.set TRAINER, VAR_0x8009\n\nViridianCity_School_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, ViridianCity_School_MapScript_SetMasterTrainerMovementTypes\n\t.byte 0\n\nViridianCity_School_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_BELLSPROUT\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, ViridianCity_School_MapScript_BellsproutMasterMovementType\n\tend\n\nViridianCity_School_MapScript_BellsproutMasterMovementType::\n\tsetobjectmovementtype LOCALID_BELLSPROUT_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nViridianCity_School_EventScript_Lass::\n\tlock\n\tfaceplayer\n\tmsgbox ViridianCity_School_Text_TryingToMemorizeNotes\n\tclosemessage\n\tapplymovement LOCALID_LASS, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\trelease\n\tend\n\nViridianCity_School_EventScript_Woman::\n\tlock\n\tfaceplayer\n\tmsgbox ViridianCity_School_Text_ReadBlackboardCarefully\n\tclosemessage\n\tapplymovement LOCALID_WOMAN, Common_Movement_FaceOriginalDirection\n\twaitmovement 0\n\trelease\n\tend\n\nViridianCity_School_EventScript_Notebook::\n\tlockall\n\tmsgbox ViridianCity_School_Text_NotebookFirstPage\n\tmsgbox ViridianCity_School_Text_TurnThePage, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, ViridianCity_School_EventScript_StopReadingNotebook\n\tmsgbox ViridianCity_School_Text_NotebookSecondPage\n\tmsgbox ViridianCity_School_Text_TurnThePage, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, ViridianCity_School_EventScript_StopReadingNotebook\n\tmsgbox ViridianCity_School_Text_NotebookThirdPage\n\tmsgbox ViridianCity_School_Text_TurnThePage, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, ViridianCity_School_EventScript_StopReadingNotebook\n\tmsgbox ViridianCity_School_Text_NotebookFourthPage\n\tapplymovement LOCALID_LASS, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox ViridianCity_School_Text_HeyDontLookAtMyNotes\n\treleaseall\n\tend\n\nViridianCity_School_EventScript_StopReadingNotebook::\n\treleaseall\n\tend\n\nViridianCity_School_EventScript_Blackboard::\n\tlockall\n\tmsgbox ViridianCity_School_Text_BlackboardListsStatusProblems\n\tgoto ViridianCity_School_EventScript_ChooseBlackboardTopic\n\tend\n\nViridianCity_School_EventScript_ChooseBlackboardTopic::\n\tmessage ViridianCity_School_Text_ReadWhichTopic\n\twaitmessage\n\tmultichoicegrid 7, 1, MULTICHOICE_TRAINER_SCHOOL_WHITEBOARD, 3, FALSE\n\tswitch VAR_RESULT\n\tcase 0, ViridianCity_School_EventScript_ReadSleep\n\tcase 1, ViridianCity_School_EventScript_ReadPoison\n\tcase 2, ViridianCity_School_EventScript_ReadParalysis\n\tcase 3, ViridianCity_School_EventScript_ReadBurn\n\tcase 4, ViridianCity_School_EventScript_ReadFreeze\n\tcase 5, ViridianCity_School_EventScript_ExitBlackboard\n\tcase 127, ViridianCity_School_EventScript_ExitBlackboard\n\tend\n\nViridianCity_School_EventScript_ReadSleep::\n\tmsgbox ViridianCity_School_Text_ExplainSleep\n\tgoto ViridianCity_School_EventScript_ChooseBlackboardTopic\n\tend\n\nViridianCity_School_EventScript_ReadBurn::\n\tmsgbox ViridianCity_School_Text_ExplainBurn\n\tgoto ViridianCity_School_EventScript_ChooseBlackboardTopic\n\tend\n\nViridianCity_School_EventScript_ReadPoison::\n\tmsgbox ViridianCity_School_Text_ExplainPoison\n\tgoto ViridianCity_School_EventScript_ChooseBlackboardTopic\n\tend\n\nViridianCity_School_EventScript_ReadFreeze::\n\tmsgbox ViridianCity_School_Text_ExplainFreeze\n\tgoto ViridianCity_School_EventScript_ChooseBlackboardTopic\n\tend\n\nViridianCity_School_EventScript_ReadParalysis::\n\tmsgbox ViridianCity_School_Text_ExplainParalysis\n\tgoto ViridianCity_School_EventScript_ChooseBlackboardTopic\n\tend\n\nViridianCity_School_EventScript_ExitBlackboard::\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/maps/ViridianCity_School/text.inc",
    "content": "ViridianCity_School_Text_TryingToMemorizeNotes::\n    .string \"Whew! I'm trying to memorize all my\\n\"\n    .string \"notes.$\"\n\nViridianCity_School_Text_ReadBlackboardCarefully::\n    .string \"Okay!\\p\"\n    .string \"Be sure to read what's on the\\n\"\n    .string \"blackboard carefully!$\"\n\nViridianCity_School_Text_NotebookFirstPage::\n    .string \"Let's check out the notebook.\\p\"\n    .string \"First page…\\p\"\n    .string \"POKé BALLS are used to catch\\n\"\n    .string \"POKéMON.\\p\"\n    .string \"Up to six POKéMON can be carried\\n\"\n    .string \"in your party.\\p\"\n    .string \"People who raise and battle\\n\"\n    .string \"with POKéMON are called TRAINERS.$\"\n\nViridianCity_School_Text_NotebookSecondPage::\n    .string \"Second page…\\p\"\n    .string \"A healthy POKéMON may be hard to\\n\"\n    .string \"catch, so weaken it first.\\p\"\n    .string \"Poison, burn, or cause another\\n\"\n    .string \"status problem to weaken it.$\"\n\nViridianCity_School_Text_NotebookThirdPage::\n    .string \"Third page…\\p\"\n    .string \"POKéMON TRAINERS seek others to\\n\"\n    .string \"engage in POKéMON battles.\\p\"\n    .string \"To TRAINERS, the taste of victory\\n\"\n    .string \"is sweet, indeed.\\p\"\n    .string \"Battles are constantly waged at\\n\"\n    .string \"POKéMON GYMS everywhere.$\"\n\nViridianCity_School_Text_NotebookFourthPage::\n    .string \"Fourth page…\\p\"\n    .string \"The ultimate goal for all POKéMON\\n\"\n    .string \"TRAINERS is simple.\\p\"\n    .string \"It is to defeat the top eight\\n\"\n    .string \"POKéMON GYM LEADERS.\\p\"\n    .string \"Do so to earn the right to face…\\p\"\n    .string \"The ELITE FOUR of the POKéMON\\n\"\n    .string \"LEAGUE!$\"\n\nViridianCity_School_Text_TurnThePage::\n    .string \"Turn the page?$\"\n\nViridianCity_School_Text_HeyDontLookAtMyNotes::\n    .string \"GIRL: Hey!\\n\"\n    .string \"Don't look at my notes!$\"\n\nViridianCity_School_Text_BlackboardListsStatusProblems::\n    .string \"The blackboard lists POKéMON\\n\"\n    .string \"STATUS problems during battles.$\"\n\nViridianCity_School_Text_ReadWhichTopic::\n    .string \"Which topic do you want to read?$\"\n\nViridianCity_School_Text_ExplainSleep::\n    .string \"A POKéMON can't attack if it's\\n\"\n    .string \"asleep.\\p\"\n    .string \"POKéMON will stay asleep even\\n\"\n    .string \"after battles.\\p\"\n    .string \"Use AWAKENING to awaken one\\n\"\n    .string \"from sleep.$\"\n\nViridianCity_School_Text_ExplainBurn::\n    .string \"A burn reduces ATTACK power.\\n\"\n    .string \"It also causes ongoing HP loss.\\p\"\n    .string \"A burn remains after a battle.\\n\"\n    .string \"Use BURN HEAL to cure a burn.$\"\n\nViridianCity_School_Text_ExplainPoison::\n    .string \"When poisoned, a POKéMON's health\\n\"\n    .string \"steadily drops.\\p\"\n    .string \"Poison lingers after battles.\\n\"\n    .string \"Use an ANTIDOTE to cure poison!$\"\n\nViridianCity_School_Text_ExplainFreeze::\n    .string \"A frozen POKéMON becomes\\n\"\n    .string \"helplessly immobile.\\p\"\n    .string \"It stays frozen even after the\\n\"\n    .string \"battle ends.\\p\"\n    .string \"Use ICE HEAL to thaw out the\\n\"\n    .string \"suffering POKéMON.$\"\n\nViridianCity_School_Text_ExplainParalysis::\n    .string \"Paralysis reduces SPEED and may\\n\"\n    .string \"prevent the POKéMON from moving.\\p\"\n    .string \"Paralysis remains after battles.\\n\"\n    .string \"Use PARLYZ HEAL for treatment.$\"\n\n"
  },
  {
    "path": "data/maps/ViridianForest/map.json",
    "content": "{\n  \"id\": \"MAP_VIRIDIAN_FOREST\",\n  \"name\": \"ViridianForest\",\n  \"layout\": \"LAYOUT_VIRIDIAN_FOREST\",\n  \"music\": \"MUS_VIRIDIAN_FOREST\",\n  \"region_map_section\": \"MAPSEC_VIRIDIAN_FOREST\",\n  \"requires_flash\": false,\n  \"weather\": \"WEATHER_SHADE\",\n  \"map_type\": \"MAP_TYPE_ROUTE\",\n  \"allow_cycling\": true,\n  \"allow_escaping\": true,\n  \"allow_running\": true,\n  \"show_map_name\": true,\n  \"floor_number\": 0,\n  \"battle_scene\": \"MAP_BATTLE_SCENE_NORMAL\",\n  \"connections\": 0,\n  \"object_events\": [\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_YOUNGSTER\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 58,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianForest_EventScript_Youngster\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BOY\",\n      \"in_connection\": false,\n      \"x\": 45,\n      \"y\": 58,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianForest_EventScript_Boy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 47,\n      \"y\": 45,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"5\",\n      \"script\": \"ViridianForest_EventScript_Rick\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 47,\n      \"y\": 29,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"ViridianForest_EventScript_Doug\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 7,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_LEFT\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"4\",\n      \"script\": \"ViridianForest_EventScript_Sammy\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 5,\n      \"y\": 41,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianForest_EventScript_ItemPokeBall\",\n      \"flag\": \"FLAG_HIDE_VIRIDIAN_FOREST_POKE_BALL\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 40,\n      \"y\": 21,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianForest_EventScript_ItemAntidote\",\n      \"flag\": \"FLAG_HIDE_VIRIDIAN_FOREST_ANTIDOTE\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 21,\n      \"y\": 34,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianForest_EventScript_ItemPotion\",\n      \"flag\": \"FLAG_HIDE_VIRIDIAN_FOREST_POTION\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 43,\n      \"y\": 6,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN_AND_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"ViridianForest_EventScript_Anthony\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 16,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_UP\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NORMAL\",\n      \"trainer_sight_or_berry_tree_id\": \"1\",\n      \"script\": \"ViridianForest_EventScript_Charlie\",\n      \"flag\": \"0\"\n    },\n    {\n      \"type\": \"object\",\n      \"graphics_id\": \"OBJ_EVENT_GFX_ITEM_BALL\",\n      \"in_connection\": false,\n      \"x\": 49,\n      \"y\": 60,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 1,\n      \"movement_range_y\": 1,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"ViridianForest_EventScript_ItemPotion2\",\n      \"flag\": \"FLAG_HIDE_VIRIDIAN_FOREST_POTION_2\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_LASS\",\n      \"in_connection\": false,\n      \"x\": 13,\n      \"y\": 5,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Pikachu\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    },\n    {\n      \"graphics_id\": \"OBJ_EVENT_GFX_MASTER_BUG_CATCHER\",\n      \"in_connection\": false,\n      \"x\": 29,\n      \"y\": 44,\n      \"elevation\": 3,\n      \"movement_type\": \"MOVEMENT_TYPE_FACE_DOWN\",\n      \"movement_range_x\": 0,\n      \"movement_range_y\": 0,\n      \"trainer_type\": \"TRAINER_TYPE_NONE\",\n      \"trainer_sight_or_berry_tree_id\": \"0\",\n      \"script\": \"MasterTrainer_EventScript_Weedle\",\n      \"flag\": \"FLAG_HIDE_MASTER_TRAINERS\"\n    }\n  ],\n  \"warp_events\": [\n    {\n      \"x\": 29,\n      \"y\": 62,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 28,\n      \"y\": 62,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 5,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 6,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    },\n    {\n      \"x\": 30,\n      \"y\": 62,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE\",\n      \"dest_warp_id\": \"3\"\n    },\n    {\n      \"x\": 4,\n      \"y\": 9,\n      \"elevation\": 3,\n      \"dest_map\": \"MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE\",\n      \"dest_warp_id\": \"1\"\n    }\n  ],\n  \"coord_events\": [\n\n  ],\n  \"bg_events\": [\n    {\n      \"type\": \"sign\",\n      \"x\": 39,\n      \"y\": 59,\n      \"elevation\": 3,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianForest_EventScript_TrainerTips1\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 43,\n      \"y\": 26,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianForest_EventScript_TrainerTips3\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 9,\n      \"y\": 29,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianForest_EventScript_TrainerTips4\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 6,\n      \"y\": 12,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianForest_EventScript_ExitSign\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 28,\n      \"y\": 44,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianForest_EventScript_TrainerTips2\"\n    },\n    {\n      \"type\": \"sign\",\n      \"x\": 31,\n      \"y\": 60,\n      \"elevation\": 0,\n      \"player_facing_dir\": \"BG_EVENT_PLAYER_FACING_ANY\",\n      \"script\": \"ViridianForest_EventScript_TrainerTips5\"\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 3,\n      \"y\": 22,\n      \"elevation\": 3,\n      \"item\": \"ITEM_POTION\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_VIRIDIAN_FOREST_POTION\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    },\n    {\n      \"type\": \"hidden_item\",\n      \"x\": 28,\n      \"y\": 57,\n      \"elevation\": 0,\n      \"item\": \"ITEM_ANTIDOTE\",\n      \"flag\": \"FLAG_HIDDEN_ITEM_VIRIDIAN_FOREST_ANTIDOTE\",\n      \"quantity\": 1,\n      \"underfoot\": false\n    }\n  ],\n  \"level_scaling\": \"1\"\n}\n"
  },
  {
    "path": "data/maps/ViridianForest/scripts.inc",
    "content": ".set LOCALID_PIKACHU_MASTER, 12\n.set LOCALID_WEEDLE_MASTER, 13\n.set TRAINER, VAR_0x8009\n\nViridianForest_MapScripts::\n\tmap_script MAP_SCRIPT_ON_TRANSITION, ViridianForest_OnTransition\n\t.byte 0\n\nViridianForest_OnTransition::\n\tsetworldmapflag FLAG_WORLD_MAP_VIRIDIAN_FOREST\n\tgoto ViridianForest_MapScript_SetMasterTrainerMovementTypes\n\tend\n\nViridianForest_MapScript_SetMasterTrainerMovementTypes::\n\tsetvar TRAINER, MASTER_PIKACHU\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, ViridianForest_MapScript_PikachuMasterMovementType\n\tsetvar TRAINER, MASTER_WEEDLE\n\tcallnative ShouldChangeMasterTrainerMovementType\n\tcall_if_eq VAR_RESULT, FALSE, ViridianForest_MapScript_WeedleMasterMovementType\n\tend\n\nViridianForest_MapScript_PikachuMasterMovementType::\n\tsetobjectmovementtype LOCALID_PIKACHU_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nViridianForest_MapScript_WeedleMasterMovementType::\n\tsetobjectmovementtype LOCALID_WEEDLE_MASTER, MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n\treturn\n\nViridianForest_EventScript_Youngster::\n\tmsgbox ViridianForest_Text_FriendsItchingToBattle, MSGBOX_NPC\n\tend\n\nViridianForest_EventScript_Boy::\n\tmsgbox ViridianForest_Text_RanOutOfPokeBalls, MSGBOX_NPC\n\tend\n\nViridianForest_EventScript_TrainerTips1::\n\tmsgbox ViridianForest_Text_AvoidGrassyAreasWhenWeak, MSGBOX_SIGN\n\tend\n\nViridianForest_EventScript_TrainerTips2::\n\tmsgbox ViridianForest_Text_UseAntidoteForPoison, MSGBOX_SIGN\n\tend\n\nViridianForest_EventScript_TrainerTips3::\n\tmsgbox ViridianForest_Text_ContactOakViaPCToRatePokedex, MSGBOX_SIGN\n\tend\n\nViridianForest_EventScript_TrainerTips4::\n\tmsgbox ViridianForest_Text_CantCatchOwnedMons, MSGBOX_SIGN\n\tend\n\nViridianForest_EventScript_TrainerTips5::\n\tmsgbox ViridianForest_Text_WeakenMonsBeforeCapture, MSGBOX_SIGN\n\tend\n\nViridianForest_EventScript_ExitSign::\n\tmsgbox ViridianForest_Text_LeavingViridianForest, MSGBOX_SIGN\n\tend\n\nViridianForest_EventScript_Rick::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_RICK, ViridianForest_Text_RickIntro, ViridianForest_Text_RickDefeat\n\tmsgbox ViridianForest_Text_RickPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nViridianForest_EventScript_Doug::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_DOUG, ViridianForest_Text_DougIntro, ViridianForest_Text_DougDefeat\n\tmsgbox ViridianForest_Text_DougPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nViridianForest_EventScript_Sammy::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_SAMMY, ViridianForest_Text_SammyIntro, ViridianForest_Text_SammyDefeat\n\tmsgbox ViridianForest_Text_SammyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nViridianForest_EventScript_Anthony::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_ANTHONY, ViridianForest_Text_AnthonyIntro, ViridianForest_Text_AnthonyDefeat\n\tmsgbox ViridianForest_Text_AnthonyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nViridianForest_EventScript_Charlie::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_CHARLIE, ViridianForest_Text_CharlieIntro, ViridianForest_Text_CharlieDefeat\n\tmsgbox ViridianForest_Text_CharliePostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/maps/ViridianForest/text.inc",
    "content": "ViridianForest_Text_FriendsItchingToBattle::\n    .string \"I came here with some friends to\\n\"\n    .string \"catch us some BUG POKéMON!\\p\"\n    .string \"They're all itching to get into\\n\"\n    .string \"some POKéMON battles!$\"\n\nViridianForest_Text_RickIntro::\n    .string \"Hey! You have POKéMON!\\n\"\n    .string \"Come on!\\l\"\n    .string \"Let's battle 'em!$\"\n\nViridianForest_Text_RickDefeat::\n    .string \"No!\\nCATERPIE can't hack it!$\"\n\nViridianForest_Text_RickPostBattle::\n    .string \"Ssh! You'll scare the bugs away.\\n\"\n    .string \"Another time, okay?$\"\n\nViridianForest_Text_DougIntro::\n    .string \"Yo!\\n\"\n    .string \"You can't jam out if you're a\\l\"\n    .string \"POKéMON TRAINER!$\"\n\nViridianForest_Text_DougDefeat::\n    .string \"Huh?\\n\"\n    .string \"I ran out of POKéMON!$\"\n\nViridianForest_Text_DougPostBattle::\n    .string \"That totally stinks! I'm going to\\n\"\n    .string \"catch some stronger ones!$\"\n\nViridianForest_Text_SammyIntro::\n    .string \"Hey, wait up!\\n\"\n    .string \"What's the hurry? Why the rush?$\"\n\nViridianForest_Text_SammyDefeat::\n    .string \"I give!\\n\"\n    .string \"You're good at this!$\"\n\nViridianForest_Text_SammyPostBattle::\n    .string \"Sometimes, you can find stuff on\\n\"\n    .string \"the ground.\\p\"\n    .string \"I'm looking for the stuff I\\n\"\n    .string \"dropped. Can you help me?$\"\n\nViridianForest_Text_AnthonyIntro::\n    .string \"I might be little, but I won't like\\n\"\n    .string \"it if you go easy on me!$\"\n\nViridianForest_Text_AnthonyDefeat::\n    .string \"Oh, boo.\\n\"\n    .string \"Nothing went right.$\"\n\nViridianForest_Text_AnthonyPostBattle::\n    .string \"I lost some of my allowance…$\"\n\nViridianForest_Text_CharlieIntro::\n    .string \"Did you know that POKéMON evolve?$\"\n\nViridianForest_Text_CharlieDefeat::\n    .string \"Oh!\\n\"\n    .string \"I lost!$\"\n\nViridianForest_Text_CharliePostBattle::\n    .string \"BUG POKéMON evolve quickly.\\n\"\n    .string \"They're a lot of fun!$\"\n\nViridianForest_Text_RanOutOfPokeBalls::\n    .string \"I was throwing POKé BALLS to\\n\"\n    .string \"catch POKéMON, and I ran out.\\p\"\n    .string \"That's why you can never have too\\n\"\n    .string \"many POKé BALLS.$\"\n\nViridianForest_Text_AvoidGrassyAreasWhenWeak::\n    .string \"TRAINER TIPS\\p\"\n    .string \"If your POKéMON are weak and you\\n\"\n    .string \"want to avoid battles, stay away\\l\"\n    .string \"from grassy areas!$\"\n\nViridianForest_Text_UseAntidoteForPoison::\n    .string \"For poison, use ANTIDOTE!\\n\"\n    .string \"Get it at POKéMON MARTS!$\"\n\nViridianForest_Text_ContactOakViaPCToRatePokedex::\n    .string \"TRAINER TIPS\\p\"\n    .string \"Contact PROF. OAK via a PC to\\n\"\n    .string \"get your POKéDEX evaluated!$\"\n\nViridianForest_Text_CantCatchOwnedMons::\n    .string \"TRAINER TIPS\\p\"\n    .string \"You can't catch a POKéMON that\\n\"\n    .string \"belongs to someone else.\\p\"\n    .string \"Throw POKé BALLS only at wild\\n\"\n    .string \"POKéMON to catch them!$\"\n\nViridianForest_Text_WeakenMonsBeforeCapture::\n    .string \"TRAINER TIPS\\p\"\n    .string \"Weaken POKéMON before attempting\\n\"\n    .string \"capture!\\p\"\n    .string \"When healthy, they may escape!$\"\n\nViridianForest_Text_LeavingViridianForest::\n    .string \"LEAVING VIRIDIAN FOREST\\n\"\n    .string \"PEWTER CITY AHEAD$\"\n\n"
  },
  {
    "path": "data/maps/map_groups.json",
    "content": "{\n  \"group_order\": [\n    \"gMapGroup_Link\",\n    \"gMapGroup_Dungeons\",\n    \"gMapGroup_SpecialArea\",\n    \"gMapGroup_TownsAndRoutes\",\n    \"gMapGroup_IndoorPallet\",\n    \"gMapGroup_IndoorViridian\",\n    \"gMapGroup_IndoorPewter\",\n    \"gMapGroup_IndoorCerulean\",\n    \"gMapGroup_IndoorLavender\",\n    \"gMapGroup_IndoorVermilion\",\n    \"gMapGroup_IndoorCeladon\",\n    \"gMapGroup_IndoorFuchsia\",\n    \"gMapGroup_IndoorCinnabar\",\n    \"gMapGroup_IndoorIndigoPlateau\",\n    \"gMapGroup_IndoorSaffron\",\n    \"gMapGroup_IndoorRoute2\",\n    \"gMapGroup_IndoorRoute4\",\n    \"gMapGroup_IndoorRoute5\",\n    \"gMapGroup_IndoorRoute6\",\n    \"gMapGroup_IndoorRoute7\",\n    \"gMapGroup_IndoorRoute8\",\n    \"gMapGroup_IndoorRoute10\",\n    \"gMapGroup_IndoorRoute11\",\n    \"gMapGroup_IndoorRoute12\",\n    \"gMapGroup_IndoorRoute15\",\n    \"gMapGroup_IndoorRoute16\",\n    \"gMapGroup_IndoorRoute18\",\n    \"gMapGroup_IndoorRoute19\",\n    \"gMapGroup_IndoorRoute22\",\n    \"gMapGroup_IndoorRoute23\",\n    \"gMapGroup_IndoorRoute25\",\n    \"gMapGroup_IndoorSevenIsland\",\n    \"gMapGroup_IndoorOneIsland\",\n    \"gMapGroup_IndoorTwoIsland\",\n    \"gMapGroup_IndoorThreeIsland\",\n    \"gMapGroup_IndoorFourIsland\",\n    \"gMapGroup_IndoorFiveIsland\",\n    \"gMapGroup_IndoorSixIsland\",\n    \"gMapGroup_IndoorThreeIslandRoute\",\n    \"gMapGroup_IndoorFiveIslandRoute\",\n    \"gMapGroup_IndoorTwoIslandRoute\",\n    \"gMapGroup_IndoorSixIslandRoute\",\n    \"gMapGroup_IndoorSevenIslandRoute\",\n    \"gMapGroup_RSE\"\n  ],\n  \"gMapGroup_Link\": [\n    \"BattleColosseum_2P\",\n    \"TradeCenter\",\n    \"RecordCorner\",\n    \"BattleColosseum_4P\",\n    \"UnionRoom\"\n  ],\n  \"gMapGroup_Dungeons\": [\n    \"ViridianForest\",\n    \"MtMoon_1F\",\n    \"MtMoon_B1F\",\n    \"MtMoon_B2F\",\n    \"SSAnne_Exterior\",\n    \"SSAnne_1F_Corridor\",\n    \"SSAnne_2F_Corridor\",\n    \"SSAnne_3F_Corridor\",\n    \"SSAnne_B1F_Corridor\",\n    \"SSAnne_Deck\",\n    \"SSAnne_Kitchen\",\n    \"SSAnne_CaptainsOffice\",\n    \"SSAnne_1F_Room1\",\n    \"SSAnne_1F_Room2\",\n    \"SSAnne_1F_Room3\",\n    \"SSAnne_1F_Room4\",\n    \"SSAnne_1F_Room5\",\n    \"SSAnne_1F_Room7\",\n    \"SSAnne_2F_Room1\",\n    \"SSAnne_2F_Room2\",\n    \"SSAnne_2F_Room3\",\n    \"SSAnne_2F_Room4\",\n    \"SSAnne_2F_Room5\",\n    \"SSAnne_2F_Room6\",\n    \"SSAnne_B1F_Room1\",\n    \"SSAnne_B1F_Room2\",\n    \"SSAnne_B1F_Room3\",\n    \"SSAnne_B1F_Room4\",\n    \"SSAnne_B1F_Room5\",\n    \"SSAnne_1F_Room6\",\n    \"UndergroundPath_NorthEntrance\",\n    \"UndergroundPath_NorthSouthTunnel\",\n    \"UndergroundPath_SouthEntrance\",\n    \"UndergroundPath_WestEntrance\",\n    \"UndergroundPath_EastWestTunnel\",\n    \"UndergroundPath_EastEntrance\",\n    \"DiglettsCave_NorthEntrance\",\n    \"DiglettsCave_B1F\",\n    \"DiglettsCave_SouthEntrance\",\n    \"VictoryRoad_1F\",\n    \"VictoryRoad_2F\",\n    \"VictoryRoad_3F\",\n    \"RocketHideout_B1F\",\n    \"RocketHideout_B2F\",\n    \"RocketHideout_B3F\",\n    \"RocketHideout_B4F\",\n    \"RocketHideout_Elevator\",\n    \"SilphCo_1F\",\n    \"SilphCo_2F\",\n    \"SilphCo_3F\",\n    \"SilphCo_4F\",\n    \"SilphCo_5F\",\n    \"SilphCo_6F\",\n    \"SilphCo_7F\",\n    \"SilphCo_8F\",\n    \"SilphCo_9F\",\n    \"SilphCo_10F\",\n    \"SilphCo_11F\",\n    \"SilphCo_Elevator\",\n    \"PokemonMansion_1F\",\n    \"PokemonMansion_2F\",\n    \"PokemonMansion_3F\",\n    \"PokemonMansion_B1F\",\n    \"SafariZone_Center\",\n    \"SafariZone_East\",\n    \"SafariZone_North\",\n    \"SafariZone_West\",\n    \"SafariZone_Center_RestHouse\",\n    \"SafariZone_East_RestHouse\",\n    \"SafariZone_North_RestHouse\",\n    \"SafariZone_West_RestHouse\",\n    \"SafariZone_SecretHouse\",\n    \"SafariZone_NorthWest\",\n    \"SafariZone_NorthEast\",\n    \"SafariZone_NorthWest_RestHouse\",\n    \"CeruleanCave_1F\",\n    \"CeruleanCave_2F\",\n    \"CeruleanCave_B1F\",\n    \"PokemonLeague_LoreleisRoom\",\n    \"PokemonLeague_BrunosRoom\",\n    \"PokemonLeague_AgathasRoom\",\n    \"PokemonLeague_LancesRoom\",\n    \"PokemonLeague_ChampionsRoom\",\n    \"PokemonLeague_HallOfFame\",\n    \"RockTunnel_1F\",\n    \"RockTunnel_B1F\",\n    \"SeafoamIslands_1F\",\n    \"SeafoamIslands_B1F\",\n    \"SeafoamIslands_B2F\",\n    \"SeafoamIslands_B3F\",\n    \"SeafoamIslands_B4F\",\n    \"PokemonTower_1F\",\n    \"PokemonTower_2F\",\n    \"PokemonTower_3F\",\n    \"PokemonTower_4F\",\n    \"PokemonTower_5F\",\n    \"PokemonTower_6F\",\n    \"PokemonTower_7F\",\n    \"PowerPlant\",\n    \"MtEmber_RubyPath_B4F\",\n    \"MtEmber_Exterior\",\n    \"MtEmber_SummitPath_1F\",\n    \"MtEmber_SummitPath_2F\",\n    \"MtEmber_SummitPath_3F\",\n    \"MtEmber_Summit\",\n    \"MtEmber_RubyPath_B5F\",\n    \"MtEmber_RubyPath_1F\",\n    \"MtEmber_RubyPath_B1F\",\n    \"MtEmber_RubyPath_B2F\",\n    \"MtEmber_RubyPath_B3F\",\n    \"MtEmber_RubyPath_B1F_Stairs\",\n    \"MtEmber_RubyPath_B2F_Stairs\",\n    \"ThreeIsland_BerryForest\",\n    \"FourIsland_IcefallCave_Entrance\",\n    \"FourIsland_IcefallCave_1F\",\n    \"FourIsland_IcefallCave_B1F\",\n    \"FourIsland_IcefallCave_Back\",\n    \"FiveIsland_RocketWarehouse\",\n    \"SixIsland_DottedHole_1F\",\n    \"SixIsland_DottedHole_B1F\",\n    \"SixIsland_DottedHole_B2F\",\n    \"SixIsland_DottedHole_B3F\",\n    \"SixIsland_DottedHole_B4F\",\n    \"SixIsland_DottedHole_SapphireRoom\",\n    \"SixIsland_PatternBush\",\n    \"SixIsland_AlteringCave\"\n  ],\n  \"gMapGroup_SpecialArea\": [\n    \"NavelRock_Exterior\",\n    \"TrainerTower_1F\",\n    \"TrainerTower_2F\",\n    \"TrainerTower_3F\",\n    \"TrainerTower_4F\",\n    \"TrainerTower_5F\",\n    \"TrainerTower_6F\",\n    \"TrainerTower_7F\",\n    \"TrainerTower_8F\",\n    \"TrainerTower_Roof\",\n    \"TrainerTower_Lobby\",\n    \"TrainerTower_Elevator\",\n    \"FiveIsland_LostCave_Entrance\",\n    \"FiveIsland_LostCave_Room1\",\n    \"FiveIsland_LostCave_Room2\",\n    \"FiveIsland_LostCave_Room3\",\n    \"FiveIsland_LostCave_Room4\",\n    \"FiveIsland_LostCave_Room5\",\n    \"FiveIsland_LostCave_Room6\",\n    \"FiveIsland_LostCave_Room7\",\n    \"FiveIsland_LostCave_Room8\",\n    \"FiveIsland_LostCave_Room9\",\n    \"FiveIsland_LostCave_Room10\",\n    \"FiveIsland_LostCave_Room11\",\n    \"FiveIsland_LostCave_Room12\",\n    \"FiveIsland_LostCave_Room13\",\n    \"FiveIsland_LostCave_Room14\",\n    \"SevenIsland_TanobyRuins_MoneanChamber\",\n    \"SevenIsland_TanobyRuins_LiptooChamber\",\n    \"SevenIsland_TanobyRuins_WeepthChamber\",\n    \"SevenIsland_TanobyRuins_DilfordChamber\",\n    \"SevenIsland_TanobyRuins_ScufibChamber\",\n    \"SevenIsland_TanobyRuins_RixyChamber\",\n    \"SevenIsland_TanobyRuins_ViapoisChamber\",\n    \"ThreeIsland_DunsparceTunnel\",\n    \"SevenIsland_SevaultCanyon_TanobyKey\",\n    \"NavelRock_1F\",\n    \"NavelRock_Summit\",\n    \"NavelRock_Base\",\n    \"NavelRock_SummitPath_2F\",\n    \"NavelRock_SummitPath_3F\",\n    \"NavelRock_SummitPath_4F\",\n    \"NavelRock_SummitPath_5F\",\n    \"NavelRock_BasePath_B1F\",\n    \"NavelRock_BasePath_B2F\",\n    \"NavelRock_BasePath_B3F\",\n    \"NavelRock_BasePath_B4F\",\n    \"NavelRock_BasePath_B5F\",\n    \"NavelRock_BasePath_B6F\",\n    \"NavelRock_BasePath_B7F\",\n    \"NavelRock_BasePath_B8F\",\n    \"NavelRock_BasePath_B9F\",\n    \"NavelRock_BasePath_B10F\",\n    \"NavelRock_BasePath_B11F\",\n    \"NavelRock_B1F\",\n    \"NavelRock_Fork\",\n    \"BirthIsland_Exterior\",\n    \"OneIsland_KindleRoad_EmberSpa\",\n    \"BirthIsland_Harbor\",\n    \"NavelRock_Harbor\",\n    \"FarawayIsland_Exterior\",\n    \"FarawayIsland_Interior\",\n    \"ArtisanCave_B1F\",\n    \"ArtisanCave_1F\",\n    \"SouthernIsland_Exterior\",\n    \"SouthernIsland_Interior\",\n    \"CeruleanCave_1F_Blue\",\n    \"CeruleanCave_2F_Blue\",\n    \"CeruleanCave_B1F_Blue\",\n    \"CeruleanCave_1F_Yellow\",\n    \"CeruleanCave_2F_Yellow\",\n    \"CeruleanCave_B1F_Yellow\"\n  ],\n  \"gMapGroup_TownsAndRoutes\": [\n    \"PalletTown\",\n    \"ViridianCity\",\n    \"PewterCity\",\n    \"CeruleanCity\",\n    \"LavenderTown\",\n    \"VermilionCity\",\n    \"CeladonCity\",\n    \"FuchsiaCity\",\n    \"CinnabarIsland\",\n    \"IndigoPlateau_Exterior\",\n    \"SaffronCity\",\n    \"SaffronCity_Connection\",\n    \"OneIsland\",\n    \"TwoIsland\",\n    \"ThreeIsland\",\n    \"FourIsland\",\n    \"FiveIsland\",\n    \"SevenIsland\",\n    \"SixIsland\",\n    \"Route1\",\n    \"Route2\",\n    \"Route3\",\n    \"Route4\",\n    \"Route5\",\n    \"Route6\",\n    \"Route7\",\n    \"Route8\",\n    \"Route9\",\n    \"Route10\",\n    \"Route11\",\n    \"Route12\",\n    \"Route13\",\n    \"Route14\",\n    \"Route15\",\n    \"Route16\",\n    \"Route17\",\n    \"Route18\",\n    \"Route19\",\n    \"Route20\",\n    \"Route21_North\",\n    \"Route21_South\",\n    \"Route22\",\n    \"Route23\",\n    \"Route24\",\n    \"Route25\",\n    \"OneIsland_KindleRoad\",\n    \"OneIsland_TreasureBeach\",\n    \"TwoIsland_CapeBrink\",\n    \"ThreeIsland_BondBridge\",\n    \"ThreeIsland_Port\",\n    \"Prototype_SeviiIsle_6\",\n    \"Prototype_SeviiIsle_7\",\n    \"Prototype_SeviiIsle_8\",\n    \"Prototype_SeviiIsle_9\",\n    \"FiveIsland_ResortGorgeous\",\n    \"FiveIsland_WaterLabyrinth\",\n    \"FiveIsland_Meadow\",\n    \"FiveIsland_MemorialPillar\",\n    \"SixIsland_OutcastIsland\",\n    \"SixIsland_GreenPath\",\n    \"SixIsland_WaterPath\",\n    \"SixIsland_RuinValley\",\n    \"SevenIsland_TrainerTower\",\n    \"SevenIsland_SevaultCanyon_Entrance\",\n    \"SevenIsland_SevaultCanyon\",\n    \"SevenIsland_TanobyRuins\",\n    \"Route20_Underwater\",\n    \"ThreeIsland_BondBridge_Underwater\",\n    \"FourIsland_Base\"\n  ],\n  \"gMapGroup_IndoorPallet\": [\n    \"PalletTown_PlayersHouse_1F\",\n    \"PalletTown_PlayersHouse_2F\",\n    \"PalletTown_RivalsHouse\",\n    \"PalletTown_ProfessorOaksLab\"\n  ],\n  \"gMapGroup_IndoorViridian\": [\n    \"ViridianCity_House\",\n    \"ViridianCity_Gym\",\n    \"ViridianCity_School\",\n    \"ViridianCity_Mart\",\n    \"ViridianCity_PokemonCenter_1F\",\n    \"ViridianCity_PokemonCenter_2F\"\n  ],\n  \"gMapGroup_IndoorPewter\": [\n    \"PewterCity_Museum_1F\",\n    \"PewterCity_Museum_2F\",\n    \"PewterCity_Gym\",\n    \"PewterCity_Mart\",\n    \"PewterCity_House1\",\n    \"PewterCity_PokemonCenter_1F\",\n    \"PewterCity_PokemonCenter_2F\",\n    \"PewterCity_House2\"\n  ],\n  \"gMapGroup_IndoorCerulean\": [\n    \"CeruleanCity_House1\",\n    \"CeruleanCity_House2\",\n    \"CeruleanCity_House3\",\n    \"CeruleanCity_PokemonCenter_1F\",\n    \"CeruleanCity_PokemonCenter_2F\",\n    \"CeruleanCity_Gym\",\n    \"CeruleanCity_BikeShop\",\n    \"CeruleanCity_Mart\",\n    \"CeruleanCity_House4\",\n    \"CeruleanCity_House5\"\n  ],\n  \"gMapGroup_IndoorLavender\": [\n    \"LavenderTown_PokemonCenter_1F\",\n    \"LavenderTown_PokemonCenter_2F\",\n    \"LavenderTown_VolunteerPokemonHouse\",\n    \"LavenderTown_House1\",\n    \"LavenderTown_House2\",\n    \"LavenderTown_Mart\"\n  ],\n  \"gMapGroup_IndoorVermilion\": [\n    \"VermilionCity_House1\",\n    \"VermilionCity_PokemonCenter_1F\",\n    \"VermilionCity_PokemonCenter_2F\",\n    \"VermilionCity_PokemonFanClub\",\n    \"VermilionCity_House2\",\n    \"VermilionCity_Mart\",\n    \"VermilionCity_Gym\",\n    \"VermilionCity_House3\"\n  ],\n  \"gMapGroup_IndoorCeladon\": [\n    \"CeladonCity_DepartmentStore_1F\",\n    \"CeladonCity_DepartmentStore_2F\",\n    \"CeladonCity_DepartmentStore_3F\",\n    \"CeladonCity_DepartmentStore_4F\",\n    \"CeladonCity_DepartmentStore_5F\",\n    \"CeladonCity_DepartmentStore_Roof\",\n    \"CeladonCity_DepartmentStore_Elevator\",\n    \"CeladonCity_Condominiums_1F\",\n    \"CeladonCity_Condominiums_2F\",\n    \"CeladonCity_Condominiums_3F\",\n    \"CeladonCity_Condominiums_Roof\",\n    \"CeladonCity_Condominiums_RoofRoom\",\n    \"CeladonCity_PokemonCenter_1F\",\n    \"CeladonCity_PokemonCenter_2F\",\n    \"CeladonCity_GameCorner\",\n    \"CeladonCity_GameCorner_PrizeRoom\",\n    \"CeladonCity_Gym\",\n    \"CeladonCity_Restaurant\",\n    \"CeladonCity_House1\",\n    \"CeladonCity_Hotel\"\n  ],\n  \"gMapGroup_IndoorFuchsia\": [\n    \"FuchsiaCity_SafariZone_Entrance\",\n    \"FuchsiaCity_Mart\",\n    \"FuchsiaCity_SafariZone_Office\",\n    \"FuchsiaCity_Gym\",\n    \"FuchsiaCity_House1\",\n    \"FuchsiaCity_PokemonCenter_1F\",\n    \"FuchsiaCity_PokemonCenter_2F\",\n    \"FuchsiaCity_WardensHouse\",\n    \"FuchsiaCity_House2\",\n    \"FuchsiaCity_House3\"\n  ],\n  \"gMapGroup_IndoorCinnabar\": [\n    \"CinnabarIsland_Gym\",\n    \"CinnabarIsland_PokemonLab_Entrance\",\n    \"CinnabarIsland_PokemonLab_Lounge\",\n    \"CinnabarIsland_PokemonLab_ResearchRoom\",\n    \"CinnabarIsland_PokemonLab_ExperimentRoom\",\n    \"CinnabarIsland_PokemonCenter_1F\",\n    \"CinnabarIsland_PokemonCenter_2F\",\n    \"CinnabarIsland_Mart\"\n  ],\n  \"gMapGroup_IndoorIndigoPlateau\": [\n    \"IndigoPlateau_PokemonCenter_1F\",\n    \"IndigoPlateau_PokemonCenter_2F\"\n  ],\n  \"gMapGroup_IndoorSaffron\": [\n    \"SaffronCity_CopycatsHouse_1F\",\n    \"SaffronCity_CopycatsHouse_2F\",\n    \"SaffronCity_Dojo\",\n    \"SaffronCity_Gym\",\n    \"SaffronCity_House\",\n    \"SaffronCity_Mart\",\n    \"SaffronCity_PokemonCenter_1F\",\n    \"SaffronCity_PokemonCenter_2F\",\n    \"SaffronCity_MrPsychicsHouse\",\n    \"SaffronCity_PokemonTrainerFanClub\"\n  ],\n  \"gMapGroup_IndoorRoute2\": [\n    \"Route2_ViridianForest_SouthEntrance\",\n    \"Route2_House\",\n    \"Route2_EastBuilding\",\n    \"Route2_ViridianForest_NorthEntrance\"\n  ],\n  \"gMapGroup_IndoorRoute4\": [\n    \"Route4_PokemonCenter_1F\",\n    \"Route4_PokemonCenter_2F\"\n  ],\n  \"gMapGroup_IndoorRoute5\": [\n    \"Route5_PokemonDayCare\",\n    \"Route5_SouthEntrance\"\n  ],\n  \"gMapGroup_IndoorRoute6\": [\n    \"Route6_NorthEntrance\",\n    \"Route6_UnusedHouse\"\n  ],\n  \"gMapGroup_IndoorRoute7\": [\n    \"Route7_EastEntrance\"\n  ],\n  \"gMapGroup_IndoorRoute8\": [\n    \"Route8_WestEntrance\"\n  ],\n  \"gMapGroup_IndoorRoute10\": [\n    \"Route10_PokemonCenter_1F\",\n    \"Route10_PokemonCenter_2F\"\n  ],\n  \"gMapGroup_IndoorRoute11\": [\n    \"Route11_EastEntrance_1F\",\n    \"Route11_EastEntrance_2F\"\n  ],\n  \"gMapGroup_IndoorRoute12\": [\n    \"Route12_NorthEntrance_1F\",\n    \"Route12_NorthEntrance_2F\",\n    \"Route12_FishingHouse\"\n  ],\n  \"gMapGroup_IndoorRoute15\": [\n    \"Route15_WestEntrance_1F\",\n    \"Route15_WestEntrance_2F\"\n  ],\n  \"gMapGroup_IndoorRoute16\": [\n    \"Route16_House\",\n    \"Route16_NorthEntrance_1F\",\n    \"Route16_NorthEntrance_2F\"\n  ],\n  \"gMapGroup_IndoorRoute18\": [\n    \"Route18_EastEntrance_1F\",\n    \"Route18_EastEntrance_2F\"\n  ],\n  \"gMapGroup_IndoorRoute19\": [\n    \"Route19_UnusedHouse\"\n  ],\n  \"gMapGroup_IndoorRoute22\": [\n    \"Route22_NorthEntrance\"\n  ],\n  \"gMapGroup_IndoorRoute23\": [\n    \"Route23_UnusedHouse\"\n  ],\n  \"gMapGroup_IndoorRoute25\": [\n    \"Route25_SeaCottage\"\n  ],\n  \"gMapGroup_IndoorSevenIsland\": [\n    \"SevenIsland_House_Room1\",\n    \"SevenIsland_House_Room2\",\n    \"SevenIsland_Mart\",\n    \"SevenIsland_PokemonCenter_1F\",\n    \"SevenIsland_PokemonCenter_2F\",\n    \"SevenIsland_UnusedHouse\",\n    \"SevenIsland_Harbor\"\n  ],\n  \"gMapGroup_IndoorOneIsland\": [\n    \"OneIsland_PokemonCenter_1F\",\n    \"OneIsland_PokemonCenter_2F\",\n    \"OneIsland_House1\",\n    \"OneIsland_House2\",\n    \"OneIsland_Harbor\",\n    \"OneIsland_KindleRoad_GlassWorkshop\"\n  ],\n  \"gMapGroup_IndoorTwoIsland\": [\n    \"TwoIsland_JoyfulGameCorner\",\n    \"TwoIsland_House\",\n    \"TwoIsland_PokemonCenter_1F\",\n    \"TwoIsland_PokemonCenter_2F\",\n    \"TwoIsland_Harbor\"\n  ],\n  \"gMapGroup_IndoorThreeIsland\": [\n    \"ThreeIsland_House1\",\n    \"ThreeIsland_PokemonCenter_1F\",\n    \"ThreeIsland_PokemonCenter_2F\",\n    \"ThreeIsland_Mart\",\n    \"ThreeIsland_House2\",\n    \"ThreeIsland_House3\",\n    \"ThreeIsland_House4\",\n    \"ThreeIsland_House5\"\n  ],\n  \"gMapGroup_IndoorFourIsland\": [\n    \"FourIsland_PokemonDayCare\",\n    \"FourIsland_PokemonCenter_1F\",\n    \"FourIsland_PokemonCenter_2F\",\n    \"FourIsland_House1\",\n    \"FourIsland_LoreleisHouse\",\n    \"FourIsland_Harbor\",\n    \"FourIsland_House2\",\n    \"FourIsland_Mart\",\n    \"FourIsland_Base_CableCarStation\",\n    \"FourIsland_CableCarStation\"\n  ],\n  \"gMapGroup_IndoorFiveIsland\": [\n    \"FiveIsland_PokemonCenter_1F\",\n    \"FiveIsland_PokemonCenter_2F\",\n    \"FiveIsland_Harbor\",\n    \"FiveIsland_House1\",\n    \"FiveIsland_House2\"\n  ],\n  \"gMapGroup_IndoorSixIsland\": [\n    \"SixIsland_PokemonCenter_1F\",\n    \"SixIsland_PokemonCenter_2F\",\n    \"SixIsland_Harbor\",\n    \"SixIsland_House\",\n    \"SixIsland_Mart\"\n  ],\n  \"gMapGroup_IndoorThreeIslandRoute\": [\n    \"ThreeIsland_Harbor\"\n  ],\n  \"gMapGroup_IndoorFiveIslandRoute\": [\n    \"FiveIsland_ResortGorgeous_House\"\n  ],\n  \"gMapGroup_IndoorTwoIslandRoute\": [\n    \"TwoIsland_CapeBrink_House\"\n  ],\n  \"gMapGroup_IndoorSixIslandRoute\": [\n    \"SixIsland_WaterPath_House1\",\n    \"SixIsland_WaterPath_House2\"\n  ],\n  \"gMapGroup_IndoorSevenIslandRoute\": [\n    \"SevenIsland_SevaultCanyon_House\"\n  ],\n  \"gMapGroup_RSE\": [\n    \"RS_BattleTower\",\n    \"RS_BattleTower_Lobby\",\n    \"RS_BattleTower_Elevator\",\n    \"RS_BattleTower_Corridor\",\n    \"RS_BattleTower_BattleRoom\",\n    \"BattleFrontier_OutsideWest\",\n    \"BattleFrontier_OutsideEast\",\n    \"BattleFrontier_ReceptionGate\",\n    \"BattleFrontier_PokemonCenter_1F\",\n    \"BattleFrontier_PokemonCenter_2F\",\n    \"BattleFrontier_Mart\",\n    \"BattleFrontier_ExchangeServiceCorner\",\n    \"BattleFrontier_RankingHall\",\n    \"BattleFrontier_ScottsHouse\",\n    \"BattleFrontier_Lounge1\",\n    \"BattleFrontier_Lounge2\",\n    \"BattleFrontier_Lounge3\",\n    \"BattleFrontier_Lounge4\",\n    \"BattleFrontier_Lounge5\",\n    \"BattleFrontier_Lounge6\",\n    \"BattleFrontier_Lounge7\",\n    \"BattleFrontier_Lounge8\"\n  ]\n}\n"
  },
  {
    "path": "data/maps.s",
    "content": "#include \"constants/global.h\"\n#include \"constants/layouts.h\"\n#include \"constants/maps.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/songs.h\"\n#include \"constants/items.h\"\n#include \"constants/weather.h\"\n\t.include \"asm/macros.inc\"\n\t.include \"constants/constants.inc\"\n\n\t.section .rodata\n\n\t.include \"data/layouts/layouts.inc\"\n\t.include \"data/layouts/layouts_table.inc\"\n\t.include \"data/maps/headers.inc\"\n\t.include \"data/maps/groups.inc\"\n\t.include \"data/maps/connections.inc\"\n"
  },
  {
    "path": "data/multiboot_berry_glitch_fix.s",
    "content": "\t.section .rodata\n\ngMultiBootProgram_BerryGlitchFix_Start::\n\t.incbin \"data/mb_berry_fix.gba\"\ngMultiBootProgram_BerryGlitchFix_End::\n"
  },
  {
    "path": "data/multiboot_ereader.s",
    "content": "\t.section .rodata\n\ngMultiBootProgram_EReader_Start::\n\t.incbin \"data/mb_ereader.gba\"\ngMultiBootProgram_EReader_End::\n"
  },
  {
    "path": "data/multiboot_pokemon_colosseum.s",
    "content": "\t.section .rodata\n\ngMultiBootProgram_PokemonColosseum_Start::\n\t.incbin \"data/mb_colosseum.gba\"\ngMultiBootProgram_PokemonColosseum_End::\n"
  },
  {
    "path": "data/mystery_event_msg.s",
    "content": "@ These are event scripts. They should not be moved to C.\n\n#include \"constants/global.h\"\n#include \"constants/flags.h\"\n#include \"constants/moves.h\"\n#include \"constants/songs.h\"\n#include \"constants/species.h\"\n#include \"constants/vars.h\"\n#include \"constants/items.h\"\n#include \"constants/region_map_sections.h\"\n\t.include \"asm/macros.inc\"\n\t.include \"asm/macros/event.inc\"\n\t.include \"constants/constants.inc\"\n\n\t.section .rodata\n\t\n\t.align 2\nMysteryEventScript_StampCard::\n\tsetvaddress MysteryEventScript_StampCard\n\tsetorcopyvar VAR_RESULT, 1\n\tspecialvar VAR_0x8008, GetMysteryGiftCardStat\n\tsetorcopyvar VAR_RESULT, 0\n\tspecialvar VAR_0x8009, GetMysteryGiftCardStat\n\tsubvar VAR_0x8008, VAR_0x8009\n\tbuffernumberstring STR_VAR_1, VAR_0x8008\n\tlock\n\tfaceplayer\n\tvmessage sText_MysteryGiftStampCard\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nsText_MysteryGiftStampCard:\n\t.string \"Thank you for using the STAMP CARD\\n\"\n\t.string \"System.\\p\"\n\t.string \"You have {STR_VAR_1} more to collect to\\n\"\n\t.string \"fill your STAMP CARD.$\"\n\nMysteryEventScript_SurfPichu::\n\tsetvaddress MysteryEventScript_SurfPichu\n\tvgoto_if_unset FLAG_MYSTERY_GIFT_DONE, SurfPichu_GiveIfPossible\n\treturnram\n\nSurfPichu_GiveIfPossible:\n\tspecialvar VAR_EVENT_PICHU_SLOT, CalculatePlayerPartyCount\n\tvgoto_if_eq VAR_EVENT_PICHU_SLOT, PARTY_SIZE, SurfPichu_FullParty\n\tsetflag FLAG_MYSTERY_GIFT_DONE\n\tvcall SurfPichu_GiveEgg\n\tlock\n\tfaceplayer\n\tvmessage sText_MysteryGiftEgg\n\twaitmessage\n\twaitbuttonpress\n\tplayfanfare MUS_OBTAIN_ITEM\n\twaitfanfare\n\trelease\n\tend\n\nSurfPichu_FullParty:\n\tlock\n\tfaceplayer\n\tvmessage sText_FullParty\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nSurfPichu_GiveEgg:\n\tgiveegg SPECIES_PICHU\n\tsetmonmodernfatefulencounter VAR_EVENT_PICHU_SLOT\n\tsetmonmetlocation VAR_EVENT_PICHU_SLOT, METLOC_FATEFUL_ENCOUNTER\n\tvgoto_if_eq VAR_EVENT_PICHU_SLOT, 1, SurfPichu_Slot1\n\tvgoto_if_eq VAR_EVENT_PICHU_SLOT, 2, SurfPichu_Slot2\n\tvgoto_if_eq VAR_EVENT_PICHU_SLOT, 3, SurfPichu_Slot3\n\tvgoto_if_eq VAR_EVENT_PICHU_SLOT, 4, SurfPichu_Slot4\n\tvgoto_if_eq VAR_EVENT_PICHU_SLOT, 5, SurfPichu_Slot5\n\treturn\n\nSurfPichu_Slot1:\n\tsetmonmove 1, 2, MOVE_SURF\n\treturn\n\nSurfPichu_Slot2:\n\tsetmonmove 2, 2, MOVE_SURF\n\treturn\n\nSurfPichu_Slot3:\n\tsetmonmove 3, 2, MOVE_SURF\n\treturn\n\nSurfPichu_Slot4:\n\tsetmonmove 4, 2, MOVE_SURF\n\treturn\n\nSurfPichu_Slot5:\n\tsetmonmove 5, 2, MOVE_SURF\n\treturn\n\nsText_MysteryGiftEgg:\n\t.string \"Thank you for using the MYSTERY\\n\"\n\t.string \"GIFT System.\\p\"\n\t.string \"From the POKéMON CENTER we\\n\"\n\t.string \"have a gift - a POKéMON EGG!\\p\"\n\t.string \"Please raise it with love and\\n\"\n\t.string \"kindness.$\"\n\nsText_FullParty:\n\t.string \"Oh, your party appears to be full.\\p\"\n\t.string \"Please come see me after storing\\n\"\n\t.string \"a POKéMON on a PC.$\"\n\nMysteryEventScript_VisitingTrainer::\n\tsetvaddress MysteryEventScript_VisitingTrainer\n\tspecial ValidateEReaderTrainer\n\tvgoto_if_eq VAR_RESULT, 0, MysteryEventScript_VisitingTrainerArrived\n\tlock\n\tfaceplayer\n\tvmessage sText_MysteryGiftVisitingTrainer\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nMysteryEventScript_VisitingTrainerArrived:\n\tlock\n\tfaceplayer\n\tvmessage sText_MysteryGiftVisitingTrainer_2\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nsText_MysteryGiftVisitingTrainer:\n\t.string \"Thank you for using the MYSTERY\\n\"\n\t.string \"GIFT System.\\p\"\n\t.string \"By holding this WONDER CARD, you\\n\"\n\t.string \"may take part in a survey at a\\l\"\n\t.string \"POKéMON MART.\\p\"\n\t.string \"Use these surveys to invite\\n\"\n\t.string \"TRAINERS to the SEVII ISLANDS.\\p\"\n\t.string \"…Let me give you a secret\\n\"\n\t.string \"password for a survey:\\p\"\n\t.string \"“GIVE ME\\n\"\n\t.string \"AWESOME TRAINER”\\p\"\n\t.string \"Write that in on a survey and send\\n\"\n\t.string \"it to the WIRELESS\\l\"\n\t.string \"COMMUNICATION SYSTEM.$\"\n\nsText_MysteryGiftVisitingTrainer_2:\n\t.string \"Thank you for using the MYSTERY\\n\"\n\t.string \"GIFT System.\\p\"\n\t.string \"A TRAINER has arrived in the SEVII\\n\"\n\t.string \"ISLANDS looking for you.\\p\"\n\t.string \"We hope you will enjoy\\n\"\n\t.string \"battling the visiting TRAINER.\\p\"\n\t.string \"You may invite other TRAINERS by\\n\"\n\t.string \"entering other passwords.\\p\"\n\t.string \"Try looking for other passwords\\n\"\n\t.string \"that may work.$\"\n\nMysteryEventScript_BattleCard::\n\tsetvaddress MysteryEventScript_BattleCard\n\tvgoto_if_set FLAG_MYSTERY_GIFT_DONE, MysteryEventScript_BattleCardInfo\n\tsetorcopyvar VAR_RESULT, 2\n\tspecialvar VAR_0x8008, GetMysteryGiftCardStat\n\tvgoto_if_ne VAR_0x8008, 3, MysteryEventScript_BattleCardInfo\n\tlock\n\tfaceplayer\n\tvmessage sText_MysteryGiftBattleCountCard_2\n\twaitmessage\n\twaitbuttonpress\n\tgiveitem ITEM_POTION\n\trelease\n\tsetflag FLAG_MYSTERY_GIFT_DONE\n\tend\n\nMysteryEventScript_BattleCardInfo:\n\tlock\n\tfaceplayer\n\tvmessage sText_MysteryGiftBattleCountCard\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nsText_MysteryGiftBattleCountCard:\n\t.string \"Thank you for using the MYSTERY\\n\"\n\t.string \"GIFT System.\\p\"\n\t.string \"Your BATTLE COUNT CARD keeps\\n\"\n\t.string \"track of your battle record against\\l\"\n\t.string \"TRAINERS with the same CARD.\\p\"\n\t.string \"Look for and battle TRAINERS who\\n\"\n\t.string \"have the same CARD as you.\\p\"\n\t.string \"You may check the overall rankings\\n\"\n\t.string \"by reading the NEWS.\\p\"\n\t.string \"Please do give it a try!$\"\n\nsText_MysteryGiftBattleCountCard_2:\n\t.string \"Thank you for using the MYSTERY\\n\"\n\t.string \"GIFT System.\\p\"\n\t.string \"Congratulations!\\p\"\n\t.string \"You have won a prize for winning\\n\"\n\t.string \"three battles!\\p\"\n\t.string \"We hope you will be inspired to\\n\"\n\t.string \"battle some more.$\"\n\nMysteryEventScript_AuroraTicket::\n\tsetvaddress MysteryEventScript_AuroraTicket\n\tlock\n\tfaceplayer\n\tvgoto_if_set FLAG_RECEIVED_AURORA_TICKET, AuroraTicket_Obtained\n\tvgoto_if_set FLAG_FOUGHT_DEOXYS, AuroraTicket_Obtained\n\tcheckitem ITEM_AURORA_TICKET, 1\n\tvgoto_if_eq VAR_RESULT, TRUE, AuroraTicket_Obtained\n\tvmessage sText_AuroraTicket1\n\twaitmessage\n\twaitbuttonpress\n\tcheckitemspace ITEM_AURORA_TICKET, 1\n\tvgoto_if_eq VAR_RESULT, FALSE, AuroraTicket_NoBagSpace\n\tgiveitem ITEM_AURORA_TICKET\n\tsetflag FLAG_ENABLE_SHIP_BIRTH_ISLAND\n\tsetflag FLAG_RECEIVED_AURORA_TICKET\n\tvmessage sText_AuroraTicket2\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nAuroraTicket_NoBagSpace:\n\tvmessage sText_AuroraTicketNoPlace\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nAuroraTicket_Obtained:\n\tvmessage sText_AuroraTicketGot\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nsText_AuroraTicket1:\n\t.string \"Thank you for using the MYSTERY\\n\"\n\t.string \"GIFT System.\\p\"\n\t.string \"You must be {PLAYER}.\\n\"\n\t.string \"There is a ticket here for you.$\"\n\nsText_AuroraTicket2:\n\t.string \"It appears to be for use at the\\n\"\n\t.string \"VERMILION CITY port.\\p\"\n\t.string \"Why not give it a try and see what\\n\"\n\t.string \"it is about?$\"\n\nsText_AuroraTicketGot:\n\t.string \"Thank you for using the MYSTERY\\n\"\n\t.string \"GIFT System.$\"\n\nsText_AuroraTicketNoPlace:\n\t.string \"Oh, I'm sorry, {PLAYER}. Your BAG's\\n\"\n\t.string \"KEY ITEMS POCKET is full.\\p\"\n\t.string \"Please store something on your PC,\\n\"\n\t.string \"then come back for this.$\"\n\nMysteryEventScript_MysticTicket::\n\tsetvaddress MysteryEventScript_MysticTicket\n\tlock\n\tfaceplayer\n\tvgoto_if_set FLAG_RECEIVED_MYSTIC_TICKET, MysticTicket_Obtained\n\tvgoto_if_set FLAG_FOUGHT_LUGIA, MysticTicket_Obtained\n\tvgoto_if_set FLAG_FOUGHT_HO_OH, MysticTicket_Obtained\n\tcheckitem ITEM_MYSTIC_TICKET, 1\n\tvgoto_if_eq VAR_RESULT, TRUE, MysticTicket_Obtained\n\tvmessage sText_MysticTicket2\n\twaitmessage\n\twaitbuttonpress\n\tcheckitemspace ITEM_MYSTIC_TICKET, 1\n\tvgoto_if_eq VAR_RESULT, FALSE, MysticTicket_NoBagSpace\n\tgiveitem ITEM_MYSTIC_TICKET\n\tsetflag FLAG_ENABLE_SHIP_NAVEL_ROCK\n\tsetflag FLAG_RECEIVED_MYSTIC_TICKET\n\tvmessage sText_MysticTicket1\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nMysticTicket_NoBagSpace:\n\tvmessage sText_MysticTicketNoPlace\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nMysticTicket_Obtained:\n\tvmessage sText_MysticTicketGot\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nsText_MysticTicket2:\n\t.string \"Thank you for using the MYSTERY\\n\"\n\t.string \"GIFT System.\\p\"\n\t.string \"You must be {PLAYER}.\\n\"\n\t.string \"There is a ticket here for you.$\"\n\nsText_MysticTicket1:\n\t.string \"It appears to be for use at the\\n\"\n\t.string \"VERMILION CITY port.\\p\"\n\t.string \"Why not give it a try and see what\\n\"\n\t.string \"it is about?$\"\n\nsText_MysticTicketGot:\n\t.string \"Thank you for using the MYSTERY\\n\"\n\t.string \"GIFT System.$\"\n\nsText_MysticTicketNoPlace:\n\t.string \"Oh, I'm sorry, {PLAYER}. Your BAG's\\n\"\n\t.string \"KEY ITEMS POCKET is full.\\p\"\n\t.string \"Please store something on your PC,\\n\"\n\t.string \"then come back for this.$\"\n\nMysteryEventScript_AlteringCave::\n\tsetvaddress MysteryEventScript_AlteringCave\n\taddvar VAR_ALTERING_CAVE_WILD_SET, 1\n\tvgoto_if_ne VAR_ALTERING_CAVE_WILD_SET, 10, MysteryEventScript_AlteringCave_\n\tsetvar VAR_ALTERING_CAVE_WILD_SET, 0\nMysteryEventScript_AlteringCave_:\n\tlock\n\tfaceplayer\n\tvmessage sText_MysteryGiftAlteringCave\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nsText_MysteryGiftAlteringCave:\n\t.string \"Thank you for using the MYSTERY\\n\"\n\t.string \"GIFT System.\\p\"\n\t.string \"Recently, there have been rumors\\n\"\n\t.string \"of rare POKéMON appearances.\\p\"\n\t.string \"The rumors are about ALTERING\\n\"\n\t.string \"CAVE on OUTCAST ISLAND.\\p\"\n\t.string \"Why not visit there and check if\\n\"\n\t.string \"the rumors are indeed true?$\"\n"
  },
  {
    "path": "data/mystery_event_script_cmd_table.s",
    "content": "\t.section script_data, \"aw\", %progbits\n\n\t.align 2\ngMysteryEventScriptCmdTable::\n\t.4byte MEScrCmd_nop\n\t.4byte MEScrCmd_checkcompat\n\t.4byte MEScrCmd_end\n\t.4byte MEScrCmd_setmsg\n\t.4byte MEScrCmd_setstatus\n\t.4byte MEScrCmd_runscript\n\t.4byte MEScrCmd_initramscript\n\t.4byte MEScrCmd_setenigmaberry\n\t.4byte MEScrCmd_giveribbon\n\t.4byte MEScrCmd_givenationaldex\n\t.4byte MEScrCmd_addrareword\n\t.4byte MEScrCmd_setrecordmixinggift\n\t.4byte MEScrCmd_givepokemon\n\t.4byte MEScrCmd_addtrainer\n\t.4byte MEScrCmd_enableresetrtc\n\t.4byte MEScrCmd_checksum\n\t.4byte MEScrCmd_crc\ngMysteryEventScriptCmdTableEnd::\n"
  },
  {
    "path": "data/script_cmd_table.inc",
    "content": "\t.align 2\n\ngScriptCmdTable::\n\t.4byte ScrCmd_nop      \t                     @ 0x00\n\t.4byte ScrCmd_nop1                           @ 0x01\n\t.4byte ScrCmd_end      \t                     @ 0x02\n\t.4byte ScrCmd_return                         @ 0x03\n\t.4byte ScrCmd_call                           @ 0x04\n\t.4byte ScrCmd_goto                           @ 0x05\n\t.4byte ScrCmd_goto_if                        @ 0x06\n\t.4byte ScrCmd_call_if                        @ 0x07\n\t.4byte ScrCmd_gotostd                        @ 0x08\n\t.4byte ScrCmd_callstd                        @ 0x09\n\t.4byte ScrCmd_gotostd_if                     @ 0x0a\n\t.4byte ScrCmd_callstd_if                     @ 0x0b\n\t.4byte ScrCmd_returnram                      @ 0x0c\n\t.4byte ScrCmd_endram                         @ 0x0d\n\t.4byte ScrCmd_setmysteryeventstatus          @ 0x0e\n\t.4byte ScrCmd_loadword                       @ 0x0f\n\t.4byte ScrCmd_loadbyte                       @ 0x10\n\t.4byte ScrCmd_setptr                         @ 0x11\n\t.4byte ScrCmd_loadbytefromptr                @ 0x12\n\t.4byte ScrCmd_setptrbyte                     @ 0x13\n\t.4byte ScrCmd_copylocal                      @ 0x14\n\t.4byte ScrCmd_copybyte                       @ 0x15\n\t.4byte ScrCmd_setvar                         @ 0x16\n\t.4byte ScrCmd_addvar                         @ 0x17\n\t.4byte ScrCmd_subvar                         @ 0x18\n\t.4byte ScrCmd_copyvar                        @ 0x19\n\t.4byte ScrCmd_setorcopyvar                   @ 0x1a\n\t.4byte ScrCmd_compare_local_to_local         @ 0x1b\n\t.4byte ScrCmd_compare_local_to_value         @ 0x1c\n\t.4byte ScrCmd_compare_local_to_ptr           @ 0x1d\n\t.4byte ScrCmd_compare_ptr_to_local           @ 0x1e\n\t.4byte ScrCmd_compare_ptr_to_value           @ 0x1f\n\t.4byte ScrCmd_compare_ptr_to_ptr             @ 0x20\n\t.4byte ScrCmd_compare_var_to_value           @ 0x21\n\t.4byte ScrCmd_compare_var_to_var             @ 0x22\n\t.4byte ScrCmd_callnative                     @ 0x23\n\t.4byte ScrCmd_gotonative                     @ 0x24\n\t.4byte ScrCmd_special                        @ 0x25\n\t.4byte ScrCmd_specialvar                     @ 0x26\n\t.4byte ScrCmd_waitstate                      @ 0x27\n\t.4byte ScrCmd_delay                          @ 0x28\n\t.4byte ScrCmd_setflag                        @ 0x29\n\t.4byte ScrCmd_clearflag                      @ 0x2a\n\t.4byte ScrCmd_checkflag                      @ 0x2b\n\t.4byte ScrCmd_initclock                      @ 0x2c\n\t.4byte ScrCmd_dotimebasedevents              @ 0x2d\n\t.4byte ScrCmd_gettime                        @ 0x2e\n\t.4byte ScrCmd_playse                         @ 0x2f\n\t.4byte ScrCmd_waitse                         @ 0x30\n\t.4byte ScrCmd_playfanfare                    @ 0x31\n\t.4byte ScrCmd_waitfanfare                    @ 0x32\n\t.4byte ScrCmd_playbgm                        @ 0x33\n\t.4byte ScrCmd_savebgm                        @ 0x34\n\t.4byte ScrCmd_fadedefaultbgm                 @ 0x35\n\t.4byte ScrCmd_fadenewbgm                     @ 0x36\n\t.4byte ScrCmd_fadeoutbgm                     @ 0x37\n\t.4byte ScrCmd_fadeinbgm                      @ 0x38\n\t.4byte ScrCmd_warp                           @ 0x39\n\t.4byte ScrCmd_warpsilent                     @ 0x3a\n\t.4byte ScrCmd_warpdoor                       @ 0x3b\n\t.4byte ScrCmd_warphole                       @ 0x3c\n\t.4byte ScrCmd_warpteleport                   @ 0x3d\n\t.4byte ScrCmd_setwarp                        @ 0x3e\n\t.4byte ScrCmd_setdynamicwarp                 @ 0x3f\n\t.4byte ScrCmd_setdivewarp                    @ 0x40\n\t.4byte ScrCmd_setholewarp                    @ 0x41\n\t.4byte ScrCmd_getplayerxy                    @ 0x42\n\t.4byte ScrCmd_getpartysize                   @ 0x43\n\t.4byte ScrCmd_additem                        @ 0x44\n\t.4byte ScrCmd_removeitem                     @ 0x45\n\t.4byte ScrCmd_checkitemspace                 @ 0x46\n\t.4byte ScrCmd_checkitem                      @ 0x47\n\t.4byte ScrCmd_checkitemtype                  @ 0x48\n\t.4byte ScrCmd_addpcitem                      @ 0x49\n\t.4byte ScrCmd_checkpcitem                    @ 0x4a\n\t.4byte ScrCmd_adddecoration                  @ 0x4b\n\t.4byte ScrCmd_removedecoration               @ 0x4c\n\t.4byte ScrCmd_checkdecor                     @ 0x4d\n\t.4byte ScrCmd_checkdecorspace                @ 0x4e\n\t.4byte ScrCmd_applymovement                  @ 0x4f\n\t.4byte ScrCmd_applymovementat                @ 0x50\n\t.4byte ScrCmd_waitmovement                   @ 0x51\n\t.4byte ScrCmd_waitmovementat                 @ 0x52\n\t.4byte ScrCmd_removeobject                   @ 0x53\n\t.4byte ScrCmd_removeobjectat                 @ 0x54\n\t.4byte ScrCmd_addobject                      @ 0x55\n\t.4byte ScrCmd_addobjectat                    @ 0x56\n\t.4byte ScrCmd_setobjectxy                    @ 0x57\n\t.4byte ScrCmd_showobjectat                   @ 0x58\n\t.4byte ScrCmd_hideobjectat                   @ 0x59\n\t.4byte ScrCmd_faceplayer                     @ 0x5a\n\t.4byte ScrCmd_turnobject                     @ 0x5b\n\t.4byte ScrCmd_trainerbattle                  @ 0x5c\n\t.4byte ScrCmd_dotrainerbattle                @ 0x5d\n\t.4byte ScrCmd_gotopostbattlescript           @ 0x5e\n\t.4byte ScrCmd_gotobeatenscript               @ 0x5f\n\t.4byte ScrCmd_checktrainerflag               @ 0x60\n\t.4byte ScrCmd_settrainerflag                 @ 0x61\n\t.4byte ScrCmd_cleartrainerflag               @ 0x62\n\t.4byte ScrCmd_setobjectxyperm                @ 0x63\n\t.4byte ScrCmd_copyobjectxytoperm             @ 0x64\n\t.4byte ScrCmd_setobjectmovementtype          @ 0x65\n\t.4byte ScrCmd_waitmessage                    @ 0x66\n\t.4byte ScrCmd_message                        @ 0x67\n\t.4byte ScrCmd_closemessage                   @ 0x68\n\t.4byte ScrCmd_lockall                        @ 0x69\n\t.4byte ScrCmd_lock                           @ 0x6a\n\t.4byte ScrCmd_releaseall                     @ 0x6b\n\t.4byte ScrCmd_release                        @ 0x6c\n\t.4byte ScrCmd_waitbuttonpress                @ 0x6d\n\t.4byte ScrCmd_yesnobox                       @ 0x6e\n\t.4byte ScrCmd_multichoice                    @ 0x6f\n\t.4byte ScrCmd_multichoicedefault             @ 0x70\n\t.4byte ScrCmd_multichoicegrid                @ 0x71\n\t.4byte ScrCmd_drawbox                        @ 0x72\n\t.4byte ScrCmd_erasebox                       @ 0x73\n\t.4byte ScrCmd_drawboxtext                    @ 0x74\n\t.4byte ScrCmd_showmonpic                     @ 0x75\n\t.4byte ScrCmd_hidemonpic                     @ 0x76\n\t.4byte ScrCmd_showcontestpainting            @ 0x77\n\t.4byte ScrCmd_braillemessage                 @ 0x78\n\t.4byte ScrCmd_givemon                        @ 0x79\n\t.4byte ScrCmd_giveegg                        @ 0x7a\n\t.4byte ScrCmd_setmonmove                     @ 0x7b\n\t.4byte ScrCmd_checkpartymove                 @ 0x7c\n\t.4byte ScrCmd_bufferspeciesname              @ 0x7d\n\t.4byte ScrCmd_bufferleadmonspeciesname       @ 0x7e\n\t.4byte ScrCmd_bufferpartymonnick             @ 0x7f\n\t.4byte ScrCmd_bufferitemname                 @ 0x80\n\t.4byte ScrCmd_bufferdecorationname           @ 0x81\n\t.4byte ScrCmd_buffermovename                 @ 0x82\n\t.4byte ScrCmd_buffernumberstring             @ 0x83\n\t.4byte ScrCmd_bufferstdstring                @ 0x84\n\t.4byte ScrCmd_bufferstring                   @ 0x85\n\t.4byte ScrCmd_pokemart                       @ 0x86\n\t.4byte ScrCmd_pokemartdecoration             @ 0x87\n\t.4byte ScrCmd_pokemartdecoration2            @ 0x88\n\t.4byte ScrCmd_playslotmachine                @ 0x89\n\t.4byte ScrCmd_setberrytree                   @ 0x8a\n\t.4byte ScrCmd_choosecontestmon               @ 0x8b\n\t.4byte ScrCmd_startcontest                   @ 0x8c\n\t.4byte ScrCmd_showcontestresults             @ 0x8d\n\t.4byte ScrCmd_contestlinktransfer            @ 0x8e\n\t.4byte ScrCmd_random                         @ 0x8f\n\t.4byte ScrCmd_addmoney                       @ 0x90\n\t.4byte ScrCmd_removemoney                    @ 0x91\n\t.4byte ScrCmd_checkmoney                     @ 0x92\n\t.4byte ScrCmd_showmoneybox                   @ 0x93\n\t.4byte ScrCmd_hidemoneybox                   @ 0x94\n\t.4byte ScrCmd_updatemoneybox                 @ 0x95\n\t.4byte ScrCmd_getpokenewsactive              @ 0x96\n\t.4byte ScrCmd_fadescreen                     @ 0x97\n\t.4byte ScrCmd_fadescreenspeed                @ 0x98\n\t.4byte ScrCmd_setflashlevel                  @ 0x99\n\t.4byte ScrCmd_animateflash                   @ 0x9a\n\t.4byte ScrCmd_messageautoscroll              @ 0x9b\n\t.4byte ScrCmd_dofieldeffect                  @ 0x9c\n\t.4byte ScrCmd_setfieldeffectargument         @ 0x9d\n\t.4byte ScrCmd_waitfieldeffect                @ 0x9e\n\t.4byte ScrCmd_setrespawn                     @ 0x9f\n\t.4byte ScrCmd_checkplayergender              @ 0xa0\n\t.4byte ScrCmd_playmoncry                     @ 0xa1\n\t.4byte ScrCmd_setmetatile                    @ 0xa2\n\t.4byte ScrCmd_resetweather                   @ 0xa3\n\t.4byte ScrCmd_setweather                     @ 0xa4\n\t.4byte ScrCmd_doweather                      @ 0xa5\n\t.4byte ScrCmd_setstepcallback                @ 0xa6\n\t.4byte ScrCmd_setmaplayoutindex              @ 0xa7\n\t.4byte ScrCmd_setobjectsubpriority           @ 0xa8\n\t.4byte ScrCmd_resetobjectsubpriority         @ 0xa9\n\t.4byte ScrCmd_createvobject                  @ 0xaa\n\t.4byte ScrCmd_turnvobject                    @ 0xab\n\t.4byte ScrCmd_opendoor                       @ 0xac\n\t.4byte ScrCmd_closedoor                      @ 0xad\n\t.4byte ScrCmd_waitdooranim                   @ 0xae\n\t.4byte ScrCmd_setdooropen                    @ 0xaf\n\t.4byte ScrCmd_setdoorclosed                  @ 0xb0\n\t.4byte ScrCmd_addelevmenuitem                @ 0xb1\n\t.4byte ScrCmd_showelevmenu                   @ 0xb2\n\t.4byte ScrCmd_checkcoins                     @ 0xb3\n\t.4byte ScrCmd_addcoins                       @ 0xb4\n\t.4byte ScrCmd_removecoins                    @ 0xb5\n\t.4byte ScrCmd_setwildbattle                  @ 0xb6\n\t.4byte ScrCmd_dowildbattle                   @ 0xb7\n\t.4byte ScrCmd_setvaddress                    @ 0xb8\n\t.4byte ScrCmd_vgoto                          @ 0xb9\n\t.4byte ScrCmd_vcall                          @ 0xba\n\t.4byte ScrCmd_vgoto_if                       @ 0xbb\n\t.4byte ScrCmd_vcall_if                       @ 0xbc\n\t.4byte ScrCmd_vmessage                       @ 0xbd\n\t.4byte ScrCmd_vbuffermessage                 @ 0xbe\n\t.4byte ScrCmd_vbufferstring                  @ 0xbf\n\t.4byte ScrCmd_showcoinsbox                   @ 0xc0\n\t.4byte ScrCmd_hidecoinsbox                   @ 0xc1\n\t.4byte ScrCmd_updatecoinsbox                 @ 0xc2\n\t.4byte ScrCmd_incrementgamestat              @ 0xc3\n\t.4byte ScrCmd_setescapewarp                  @ 0xc4\n\t.4byte ScrCmd_waitmoncry                     @ 0xc5\n\t.4byte ScrCmd_bufferboxname                  @ 0xc6\n\t.4byte ScrCmd_textcolor                      @ 0xc7\n\t.4byte ScrCmd_loadhelp                       @ 0xc8\n\t.4byte ScrCmd_unloadhelp                     @ 0xc9\n\t.4byte ScrCmd_signmsg                        @ 0xca\n\t.4byte ScrCmd_normalmsg                      @ 0xcb\n\t.4byte ScrCmd_comparestat                    @ 0xcc\n\t.4byte ScrCmd_setmonmodernfatefulencounter   @ 0xcd\n\t.4byte ScrCmd_checkmonmodernfatefulencounter @ 0xce\n\t.4byte ScrCmd_trywondercardscript            @ 0xcf\n\t.4byte ScrCmd_setworldmapflag                @ 0xd0\n\t.4byte ScrCmd_warpspinenter                  @ 0xd1\n\t.4byte ScrCmd_setmonmetlocation              @ 0xd2\n\t.4byte ScrCmd_getbraillestringwidth          @ 0xd3\n\t.4byte ScrCmd_bufferitemnameplural           @ 0xd4\n\t.4byte ScrCmd_fadescreenswapbuffers          @ 0xd5\n\t.4byte ScrCmd_setobjectmovementtypeinstant   @ 0xd6\n\t.4byte ScrCmd_resetobjectmovementtype        @ 0xd7\n\ngScriptCmdTableEnd::\n\t.4byte ScrCmd_nop\n"
  },
  {
    "path": "data/scripts/aide.inc",
    "content": "Aide_EventScript_HaventCaughtEnough::\n\tmsgbox Aide_Text_HaventCaughtEnoughMonsForItem\n\trelease\n\tend\n\nAide_EventScript_NoRoomForItem::\n\tmsgbox Aide_Text_DontHaveAnyRoomForItem\n\trelease\n\tend\n\nAide_EventScript_DeclineCheckMons::\n\tmsgbox Aide_Text_GetEnoughMonsComeBackForItem\n\trelease\n\tend\n"
  },
  {
    "path": "data/scripts/bag_full.inc",
    "content": "EventScript_BagIsFull::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox Text_TooBadBagFull\n\trelease\n\tend\n\n@ Unused\nEventScript_BagIsFullRet::\n\tmsgbox Text_TooBadBagFull\n\treturn\n\n@ Unused\nEventScript_NoRoomForAnotherDecor::\n\tmsgbox Text_NoRoomForAnotherDecor\n\trelease\n\tend\n\n@ Unused\nEventScript_NoRoomForAnotherDecorRet::\n\tmsgbox Text_NoRoomForAnotherDecor\n\treturn\n"
  },
  {
    "path": "data/scripts/cable_club.inc",
    "content": "CableClub_OnTransition::\n\tcall CableClub_EventScript_HideOrShowMysteryGiftMan\n\tend\n\nCableClub_EventScript_HideOrShowMysteryGiftMan::\n\tspecialvar VAR_RESULT, ValidateSavedWonderCard\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_HideMysteryGiftMan\n\tclearflag FLAG_HIDE_MG_DELIVERYMEN\n\treturn\n\nEventScript_HideMysteryGiftMan::\n\tsetflag FLAG_HIDE_MG_DELIVERYMEN\n\treturn\n\nCableClub_EventScript_MysteryGiftMan::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\ttrywondercardscript\n\n@ Unused\nEventScript_MysteryGiftThankYou::\n\tmsgbox Text_ThankYouForAccessingMysteryGift, MSGBOX_NPC\n\tend\n\nCableClub_OnWarp::\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_SINGLE_BATTLE, EventScript_CheckTurnAttendant\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_DOUBLE_BATTLE, EventScript_CheckTurnAttendant\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_MULTI_BATTLE, EventScript_CheckTurnAttendant\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_TRADE_CENTER, EventScript_CheckTurnAttendant\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_UNION_ROOM, EventScript_CheckTurnAttendant\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_BERRY_CRUSH, EventScript_CheckTurnAttendant\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_MINIGAME, EventScript_CheckTurnAttendant\n\t.2byte 0\n\nEventScript_CheckTurnAttendant::\n\tgoto_if_eq VAR_0x8007, 0, EventScript_CheckTurnAttendantEnd\n\tturnobject VAR_0x8007, DIR_WEST\nEventScript_CheckTurnAttendantEnd:\n\tend\n\nCableClub_OnLoad::\n\tgoto_if_eq VAR_CABLE_CLUB_STATE, USING_SINGLE_BATTLE, EventScript_OnLoadFromColosseum\n\tgoto_if_eq VAR_CABLE_CLUB_STATE, USING_DOUBLE_BATTLE, EventScript_OnLoadFromColosseum\n\tgoto_if_eq VAR_CABLE_CLUB_STATE, USING_MULTI_BATTLE, EventScript_OnLoadFromColosseum\n\tgoto_if_eq VAR_CABLE_CLUB_STATE, USING_TRADE_CENTER, EventScript_OnLoadFromTradeCenter\n\tgoto_if_eq VAR_CABLE_CLUB_STATE, USING_UNION_ROOM, EventScript_OnLoadFromUnionRoom\n\tgoto_if_eq VAR_CABLE_CLUB_STATE, USING_BERRY_CRUSH, EventScript_OnLoadFromBerryCrush\n\tgoto_if_eq VAR_CABLE_CLUB_STATE, USING_MINIGAME, EventScript_OnLoadFromGameCorner\n\tend\n\nEventScript_OnLoadFromColosseum::\n\tcall CableClub_EventScript_OpenDirectCornerBarrier\n\tend\n\nEventScript_OnLoadFromTradeCenter::\n\tcall CableClub_EventScript_OpenDirectCornerBarrier\n\tend\n\nEventScript_OnLoadFromUnionRoom::\n\tcall CableClub_EventScript_OpenUnionRoomBarrier\n\tend\n\nEventScript_OnLoadFromBerryCrush::\n\tcall CableClub_EventScript_OpenDirectCornerBarrier\n\tend\n\nEventScript_OnLoadFromGameCorner::\n\tcall CableClub_EventScript_OpenGameCornerBarrier\n\tend\n\nCableClub_OnFrame::\n\tmap_script_2 VAR_MAP_SCENE_POKEMON_CENTER_TEALA, 1, CableClub_EventScript_Tutorial\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_SINGLE_BATTLE, CableClub_EventScript_ExitLinkRoom\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_DOUBLE_BATTLE, CableClub_EventScript_ExitLinkRoom\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_MULTI_BATTLE, CableClub_EventScript_ExitLinkRoom\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_TRADE_CENTER, CableClub_EventScript_ExitTradeCenter\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_UNION_ROOM, CableClub_EventScript_ExitUnionRoom\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_BERRY_CRUSH, CableClub_EventScript_ExitLinkRoom\n\tmap_script_2 VAR_CABLE_CLUB_STATE, USING_MINIGAME, CableClub_EventScript_ExitMinigameRoom\n\t.2byte 0\n\nCableClub_EventScript_ExitLinkRoom::\n\tlockall\n\tclearflag FLAG_SYS_IS_LINKING\n\tcallnative RecalculatePartyStats\n\tcall CableClub_EventScript_CloseLinkAndExitLinkRoom\n\tcall CableClub_EventScript_CloseDirectCornerBarrier\n\tspecial DrawWholeMapView\n\tplayse SE_CLICK\n\terasebox 0, 0, 29, 19\n\treleaseall\n\tend\n\nCableClub_EventScript_ExitMinigameRoom::\n\tlockall\n\tcall CableClub_EventScript_CloseLinkAndExitLinkRoom\n\tcall CableClub_EventScript_CloseGameCornerBarrier\n\tspecial DrawWholeMapView\n\tplayse SE_CLICK\n\terasebox 0, 0, 29, 19\n\treleaseall\n\tend\n\nCableClub_EventScript_CloseLinkAndExitLinkRoom::\n\tspecial CloseLink\n\tspecial HelpSystem_Enable\n\tspecial QuestLog_StartRecordingInputsAfterDeferredEvent\n\tsetvar VAR_CABLE_CLUB_STATE, 0\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tgoto_if_eq VAR_0x8007, 0, CableClub_EventScript_PlayerExitLinkRoom\n\tapplymovement VAR_0x8007, Movement_AttendantFaceLeft\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerExitLinkRoom\n\twaitmovement 0\n\tapplymovement VAR_0x8007, Movement_AttendantFaceDown\n\twaitmovement 0\n\treturn\n\nCableClub_EventScript_ExitTradeCenter::\n\tlockall\n\tclearflag FLAG_SYS_IS_LINKING\n\tcallnative RecalculatePartyStats\n\tcall CableClub_EventScript_PlayerExitTradeCenter\n\tcall CableClub_EventScript_CloseDirectCornerBarrier\n\tspecial DrawWholeMapView\n\tplayse SE_CLICK\n\terasebox 0, 0, 29, 19\n\treleaseall\n\tend\n\nCableClub_EventScript_PlayerExitTradeCenter::\n\tspecial CloseLink\n\tspecial HelpSystem_Enable\n\tspecial QuestLog_StartRecordingInputsAfterDeferredEvent\n\tsetvar VAR_CABLE_CLUB_STATE, 0\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tgoto_if_eq VAR_0x8007, 0, CableClub_EventScript_PlayerExitLinkRoom\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerFaceAttendantRight\n\twaitmovement 0\n\tapplymovement VAR_0x8007, Movement_AttendantFaceLeft\n\twaitmovement 0\n\tcall CableClub_EventScript_TrainerCardDataOverwritten\n\treturn\n\nCableClub_EventScript_ExitUnionRoom::\n\tlockall\n\tclearflag FLAG_SYS_IS_LINKING\n\tcallnative RecalculatePartyStats\n\tcall CableClub_EventScript_PlayerExitUnionRoom\n\tcall CableClub_EventScript_CloseUnionRoomBarrier\n\tspecial DrawWholeMapView\n\tplayse SE_CLICK\n\terasebox 0, 0, 29, 19\n\treleaseall\n\tend\n\nCableClub_EventScript_PlayerExitUnionRoom::\n\tspecial HelpSystem_Enable\n\tspecial QuestLog_StartRecordingInputsAfterDeferredEvent\n\tsetvar VAR_CABLE_CLUB_STATE, 0\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tgoto_if_eq VAR_0x8007, 0, CableClub_EventScript_PlayerExitLinkRoom\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerFaceAttendantRight\n\twaitmovement 0\n\tapplymovement VAR_0x8007, Movement_AttendantFaceLeft\n\twaitmovement 0\n\tcall CableClub_EventScript_TrainerCardDataOverwritten\n\treturn\n\nCableClub_EventScript_TrainerCardDataOverwritten::\n\tmessage CableClub_Text_TrainerCardDataOverwritten\n\twaitmessage\n\tplayse SE_PIN\n\tmessage CableClub_Text_HopeToSeeYouAgain\n\twaitmessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerExitLinkRoom\n\twaitmovement 0\n\tapplymovement VAR_0x8007, Movement_AttendantFaceDown\n\twaitmovement 0\n\treturn\n\nCableClub_EventScript_PlayerExitLinkRoom::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerExitLinkRoom\n\twaitmovement 0\n\treturn\n\nCableClub_EventScript_Tutorial::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tmsgbox CableClub_Text_FirstTimeRightThisWay\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachCounter\n\twaitmovement 0\n\tdelay 30\n\tmsgbox CableClub_Text_ExplainWirelessClubFirstTime\n\tsetvar VAR_MAP_SCENE_POKEMON_CENTER_TEALA, 2\n\treleaseall\n\tend\n\nMovement_PlayerApproachCounter:\n\twalk_up\n\twalk_up\n\tstep_end\n\nCableClub_EventScript_WelcomeToCableClub::\n\tmessage CableClub_Text_WelcomeWhichCableClubService\n\twaitmessage\n\tdelay 15\n\tgoto CableClub_EventScript_SelectCableClubRoom\n\tend\n\nCableClub_EventScript_UnusedWelcomeToCableClub::\n\tmsgbox CableClub_Text_WhichService\n\tgoto CableClub_EventScript_SelectCableClubRoom\n\tend\n\nCableClub_EventScript_SelectCableClubRoom::\n\tsetvar VAR_0x8004, 0\n\tmultichoice 0, 0, MULTICHOICE_TRADE_CENTER_COLOSSEUM, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CableClub_EventScript_TradeCenter\n\tcase 1, CableClub_EventScript_Colosseum\n\tcase 2, CableClub_EventScript_AbortLink\n\tcase SCR_MENU_CANCEL, CableClub_EventScript_AbortLink\n\tend\n\nCableClub_EventScript_Colosseum::\n\tcopyvar VAR_0x8007, VAR_LAST_TALKED\n\tgoto CableClub_EventScript_SelectBattleMode\n\tend\n\nCableClub_EventScript_SelectBattleMode::\n\tmessage CableClub_Text_PlayWhichBattleMode\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_SINGLE_DOUBLE_MULTI_INFO_EXIT, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CableClub_EventScript_SingleBattleMode\n\tcase 1, CableClub_EventScript_DoubleBattleMode\n\tcase 2, CableClub_EventScript_MultiBattleMode\n\tcase 3, CableClub_EventScript_BattleModeInfo\n\tcase 4, CableClub_EventScript_AbortLink\n\tcase SCR_MENU_CANCEL, CableClub_EventScript_AbortLink\n\tend\n\nCableClub_EventScript_BattleModeInfo::\n\tmsgbox CableClub_Text_ExplainBattleModes\n\tgoto CableClub_EventScript_SelectBattleMode\n\tend\n\nCableClub_EventScript_SingleBattleMode::\n\tsetvar VAR_0x8004, USING_SINGLE_BATTLE\n\tgoto CableClub_EventScript_TryEnterColosseum\n\tend\n\nCableClub_EventScript_DoubleBattleMode::\n\tspecial HasEnoughMonsForDoubleBattle\n\tgoto_if_ne VAR_RESULT, PLAYER_HAS_TWO_USABLE_MONS, CableClub_EventScript_NeedTwoMonsForDoubleBattle\n\tsetvar VAR_0x8004, USING_DOUBLE_BATTLE\n\tgoto CableClub_EventScript_TryEnterColosseum\n\tend\n\nCableClub_EventScript_NeedTwoMonsForDoubleBattle::\n\tmsgbox CableClub_Text_NeedTwoMonsForDoubleBattle\n\tgoto CableClub_EventScript_SelectBattleMode\n\tend\n\nCableClub_EventScript_MultiBattleMode::\n\tsetvar VAR_0x8004, USING_MULTI_BATTLE\n\tgoto CableClub_EventScript_TryEnterColosseum\n\tend\n\nCableClub_EventScript_TryEnterColosseum::\n\tcall EventScript_AskSaveGame\n\tgoto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortLink\n\tmessage CableClub_Text_PleaseWaitBCancel\n\twaitmessage\n\tspecial HelpSystem_Disable\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial TryBattleLinkup\n\twaitstate\n\tcall EventScript_RestorePrevTextColor\n\tgoto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterColosseum\n\tgoto_if_eq VAR_RESULT, LINKUP_SOMEONE_NOT_READY, CableClub_EventScript_AbortLinkSomeoneNotReady\n\tgoto_if_eq VAR_RESULT, LINKUP_DIFF_SELECTIONS, CableClub_EventScript_AbortLinkDifferentSelections\n\tgoto_if_eq VAR_RESULT, LINKUP_WRONG_NUM_PLAYERS, CableClub_EventScript_AbortLinkIncorrectNumberOfBattlers\n\tgoto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_AbortLink\n\tgoto_if_eq VAR_RESULT, LINKUP_CONNECTION_ERROR, CableClub_EventScript_AbortLinkConnectionError\n\tend\n\nCableClub_EventScript_EnterColosseum::\n\tsetflag FLAG_SYS_IS_LINKING\n\tcallnative RecalculatePartyStats\n\tspecial HealPlayerParty\n\tspecial SavePlayerParty\n\tspecial LoadPlayerBag\n\tcopyvar VAR_CABLE_CLUB_STATE, VAR_0x8004\n\tmessageautoscroll CableClub_Text_PleaseEnter\n\twaitmessage\n\tcall CableClub_EventScript_OpenDirectCornerBarrier\n\tspecial DrawWholeMapView\n\tplayse SE_CLICK\n\tdelay 60\n\tapplymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft\n\twaitmovement 0\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft\n\twaitmovement 0\n\topendoor 9, 1\n\twaitdooranim\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom\n\twaitmovement 0\n\thideobjectat OBJ_EVENT_ID_PLAYER, 0\n\tclosedoor 9, 1\n\twaitdooranim\n\trelease\n\tgoto_if_eq VAR_0x8004, USING_MULTI_BATTLE, CableClub_EventScript_WarpTo4PColosseum\n\tspecial SetCableClubWarp\n\twarp MAP_BATTLE_COLOSSEUM_2P, 6, 8\n\tspecial DoCableClubWarp\n\twaitstate\n\tend\n\n@ Unused\nCableClub_EventScript_PlayerApproachLinkRoomRight::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomRight\n\twaitmovement 0\n\treturn\n\nCableClub_EventScript_WarpTo4PColosseum::\n\tspecial SetCableClubWarp\n\twarp MAP_BATTLE_COLOSSEUM_4P, 5, 8\n\tspecial DoCableClubWarp\n\twaitstate\n\tend\n\nCableClub_EventScript_AbortLinkIncorrectNumberOfBattlers::\n\tswitch VAR_0x8004\n\tcase USING_SINGLE_BATTLE, CableClub_EventScript_AbortLinkWrongNumberForSingleBattle\n\tcase USING_DOUBLE_BATTLE, CableClub_EventScript_AbortLinkWrongNumberForDoubleBattle\n\tcase USING_MULTI_BATTLE, CableClub_EventScript_AbortLinkNeedFourPlayers\n\tgoto CableClub_EventScript_AbortLinkIncorrectNumberOfParticipants\n\tend\n\nCableClub_EventScript_AbortLinkNeedFourPlayers::\n\tspecial CloseLink\n\tmsgbox CableClub_Text_NeedFourPlayers\n\tgoto CableClub_EventScript_ConfirmNumberAndRestart\n\tend\n\nCableClub_EventScript_AbortLinkWrongNumberForDoubleBattle::\n\tspecial CloseLink\n\tmsgbox CableClub_Text_CantDoubleBattleWithXPlayers\n\tgoto CableClub_EventScript_ConfirmNumberAndRestart\n\tend\n\nCableClub_EventScript_AbortLinkWrongNumberForSingleBattle::\n\tspecial CloseLink\n\tmsgbox CableClub_Text_CantSingleBattleWithXPlayers\n\tgoto CableClub_EventScript_ConfirmNumberAndRestart\n\tend\n\nCableClub_EventScript_ConfirmNumberAndRestart::\n\tspecial CloseLink  @ Redundant\n\tspecial HelpSystem_Enable\n\tmsgbox CableClub_Text_PleaseConfirmNumberAndRestart\n\trelease\n\tend\n\nCableClub_EventScript_TradeCenter::\n\tcopyvar VAR_0x8007, VAR_LAST_TALKED\n\tcall CableClub_EventScript_CheckPartyTradeRequirements\n\tgoto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortLink\n\tcall EventScript_AskSaveGame\n\tgoto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortLink\n\tmessage CableClub_Text_PleaseWaitBCancel\n\twaitmessage\n\tspecial HelpSystem_Disable\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial TryTradeLinkup\n\twaitstate\n\tcall EventScript_RestorePrevTextColor\n\tgoto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterTradeCenter\n\tgoto_if_eq VAR_RESULT, LINKUP_SOMEONE_NOT_READY, CableClub_EventScript_AbortLinkSomeoneNotReady\n\tgoto_if_eq VAR_RESULT, LINKUP_DIFF_SELECTIONS, CableClub_EventScript_AbortLinkDifferentSelections\n\tgoto_if_eq VAR_RESULT, LINKUP_WRONG_NUM_PLAYERS, CableClub_EventScript_AbortLinkIncorrectNumberOfParticipants\n\tgoto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_AbortLink\n\tgoto_if_eq VAR_RESULT, LINKUP_CONNECTION_ERROR, CableClub_EventScript_AbortLinkConnectionError\n\tgoto_if_eq VAR_RESULT, LINKUP_PLAYER_NOT_READY, CableClub_EventScript_AbortLinkPlayerNotReady\n\tgoto_if_eq VAR_RESULT, LINKUP_PARTNER_NOT_READY, CableClub_EventScript_AbortLinkOtherTrainerNotReady\n\tend\n\nCableClub_EventScript_EnterTradeCenter::\n\tsetflag FLAG_SYS_IS_LINKING\n\tcallnative RecalculatePartyStats\n\tsetvar VAR_0x8004, USING_TRADE_CENTER\n\tcopyvar VAR_CABLE_CLUB_STATE, VAR_0x8004\n\tmessageautoscroll CableClub_Text_PleaseEnter\n\twaitmessage\n\tcall CableClub_EventScript_OpenDirectCornerBarrier\n\tspecial DrawWholeMapView\n\tplayse SE_CLICK\n\tdelay 60\n\tapplymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft\n\twaitmovement 0\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft\n\twaitmovement 0\n\topendoor 9, 1\n\twaitdooranim\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom\n\twaitmovement 0\n\thideobjectat OBJ_EVENT_ID_PLAYER, 0\n\tclosedoor 9, 1\n\twaitdooranim\n\trelease\n\tspecial SetCableClubWarp\n\tsetwarp MAP_TRADE_CENTER, 5, 8\n\tspecial DoCableClubWarp\n\twaitstate\n\tend\n\nCableClub_EventScript_CheckPartyTradeRequirements::\n\tspecialvar VAR_RESULT, CalculatePlayerPartyCount\n\tgoto_if_lt VAR_RESULT, 2, CableClub_EventScript_NeedTwoMonsToTrade\n\tspecialvar VAR_RESULT, DoesPartyHaveEnigmaBerry\n\tgoto_if_eq VAR_RESULT, TRUE, CableClub_EventScript_CantTradeEnigmaBerry\n\tsetvar VAR_RESULT, TRUE\n\treturn\n\nCableClub_EventScript_NeedTwoMonsToTrade::\n\tmsgbox CableClub_Text_NeedTwoMonsToTrade\n\tsetvar VAR_RESULT, FALSE\n\treturn\n\nCableClub_EventScript_CantTradeEnigmaBerry::\n\tmsgbox CableClub_Text_CantTradeEnigmaBerry\n\tsetvar VAR_RESULT, FALSE\n\treturn\n\n@ Record Corner is nopped in FRLG\nCableClub_EventScript_RecordCorner::\n\tend\n\nCableClub_EventScript_AbortLinkPlayerNotReady::\n\tspecial CloseLink\n\tspecial HelpSystem_Enable\n\tmsgbox CableClub_Text_NotSetUpForFarAwayRegion\n\trelease\n\tend\n\nCableClub_EventScript_AbortLinkOtherTrainerNotReady::\n\tspecial CloseLink\n\tspecial HelpSystem_Enable\n\tmsgbox CableClub_Text_OtherTrainerNotReady\n\trelease\n\tend\n\nCableClub_EventScript_AbortLinkConnectionError::\n\tspecial CloseLink\n\tspecial HelpSystem_Enable\n\tmsgbox CableClub_Text_LinkErrorPleaseReset\n\trelease\n\tend\n\nCableClub_EventScript_AbortLinkSomeoneNotReady::\n\tspecial CloseLink\n\tspecial HelpSystem_Enable\n\tmsgbox CableClub_Text_SomeoneIsNotReadyToLink\n\trelease\n\tend\n\nCableClub_EventScript_AbortLinkDifferentSelections::\n\tspecial CloseLink\n\tspecial HelpSystem_Enable\n\tmsgbox CableClub_Text_PlayersMadeDifferentSelections\n\trelease\n\tend\n\nCableClub_EventScript_AbortLink::\n\tspecial CloseLink\n\tspecial HelpSystem_Enable\n\tmsgbox CableClub_Text_PleaseVisitAgain\n\trelease\n\tend\n\nCableClub_EventScript_AbortMinigame::\n\tspecial CloseLink\n\tspecial HelpSystem_Enable\n\tmsgbox CableClub_Text_ComeAgain\n\trelease\n\tend\n\n@ Unused\nCableClub_EventScript_CableClubWarp::\n\tspecial SetCableClubWarp\n\tspecial DoCableClubWarp\n\twaitstate\n\tend\n\nCableClub_EventScript_AbortLinkIncorrectNumberOfParticipants::\n\tspecial CloseLink\n\tspecial HelpSystem_Enable\n\tmsgbox CableClub_Text_IncorrectNumberOfParticipants\n\trelease\n\tend\n\nCableClub_EventScript_AbortLinkPlayerHasBadEgg::\n\tspecial CloseLink\n\tspecial HelpSystem_Enable\n\tmsgbox CableClub_Text_YouHaveAMonThatCantBeTaken\n\trelease\n\tend\n\nCableClub_EventScript_WirelessClubAdjustements::\n\tmsgbox Text_WirelessClubUndergoingAdjustments\n\trelease\n\tend\n\nCableClub_EventScript_NotReadyYet::\n\tmsgbox Text_AppearsToBeUndergoingAdjustments\n\treleaseall\n\tend\n\nMovement_AttendantFaceDown::\n\tface_down\n\tstep_end\n\n@ Unused\nMovement_AttendantFaceRight::\n\tface_right\n\tstep_end\n\nMovement_AttendantFaceLeft::\n\tface_left\n\tstep_end\n\nMovement_PlayerExitLinkRoom::\n\twalk_down\n\twalk_down\n\tstep_end\n\nMovement_PlayerApproachLinkRoomRight::\n\twalk_right\n\twalk_up\n\twalk_up\n\tstep_end\n\nMovement_PlayerApproachLinkRoomLeft::\n\twalk_left\n\twalk_up\n\twalk_up\n\tstep_end\n\nMovement_PlayerEnterLinkRoom::\n\twalk_up\n\tstep_end\n\n@ Unused\nMovement_PlayerFaceAttendantLeft::\n\tface_left\n\tstep_end\n\nMovement_PlayerFaceAttendantRight::\n\tface_right\n\tstep_end\n\nMovement_PlayerEnterMinigameRoom::\n\twalk_left\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nCableClub_EventScript_ShowBattleRecords::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlockall\n\tfadescreen FADE_TO_BLACK\n\tsetvar VAR_0x8004, 0\n\tspecial ShowBattleRecords\n\twaitstate\n\treleaseall\n\tend\n\nBattleColosseum_2P_EventScript_PlayerSpot0::\n\tsetvar VAR_0x8005, 0\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial EnterColosseumPlayerSpot\n\twaitstate\n\tend\n\nBattleColosseum_2P_EventScript_PlayerSpot1::\n\tsetvar VAR_0x8005, 1\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial EnterColosseumPlayerSpot\n\twaitstate\n\tend\n\nBattleColosseum_4P_EventScript_PlayerSpot0::\n\tfadescreen FADE_TO_BLACK\n\tspecial ChooseHalfPartyForBattle\n\twaitstate\n\tgoto_if_eq VAR_RESULT, 0, BattleColosseum_4P_EventScript_CancelSpotTrigger\n\tsetvar VAR_0x8005, 0\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial EnterColosseumPlayerSpot\n\twaitstate\n\tend\n\nBattleColosseum_4P_EventScript_PlayerSpot1::\n\tfadescreen FADE_TO_BLACK\n\tspecial ChooseHalfPartyForBattle\n\twaitstate\n\tgoto_if_eq VAR_RESULT, 0, BattleColosseum_4P_EventScript_CancelSpotTrigger\n\tsetvar VAR_0x8005, 1\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial EnterColosseumPlayerSpot\n\twaitstate\n\tend\n\nBattleColosseum_4P_EventScript_PlayerSpot2::\n\tfadescreen FADE_TO_BLACK\n\tspecial ChooseHalfPartyForBattle\n\twaitstate\n\tgoto_if_eq VAR_RESULT, 0, BattleColosseum_4P_EventScript_CancelSpotTrigger\n\tsetvar VAR_0x8005, 2\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial EnterColosseumPlayerSpot\n\twaitstate\n\tend\n\nBattleColosseum_4P_EventScript_PlayerSpot3::\n\tfadescreen FADE_TO_BLACK\n\tspecial ChooseHalfPartyForBattle\n\twaitstate\n\tgoto_if_eq VAR_RESULT, 0, BattleColosseum_4P_EventScript_CancelSpotTrigger\n\tsetvar VAR_0x8005, 3\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial EnterColosseumPlayerSpot\n\twaitstate\n\tend\n\nBattleColosseum_4P_EventScript_CancelSpotTrigger::\n\tend\n\nTradeCenter_EventScript_Chair0::\n\tsetvar VAR_0x8005, 0\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial EnterTradeSeat\n\twaitstate\n\tend\n\nTradeCenter_EventScript_Chair1::\n\tsetvar VAR_0x8005, 1\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial EnterTradeSeat\n\twaitstate\n\tend\n\n@ Unused\nTradeCenter_EventScript_Chair2::\n\tsetvar VAR_0x8005, 2\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial EnterTradeSeat\n\twaitstate\n\tend\n\n@ Unused\nTradeCenter_EventScript_Chair3::\n\tsetvar VAR_0x8005, 3\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial EnterTradeSeat\n\twaitstate\n\tend\n\n@ Nop in FRLG\n@ Separate labels to match GetDirectionForEventScript\nRecordCorner_EventScript_Spot0::\nRecordCorner_EventScript_Spot1::\nRecordCorner_EventScript_Spot2::\nRecordCorner_EventScript_Spot3::\n\tend\n\nCableClub_EventScript_ReadTrainerCard::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox Text_LookedAtPlayersTrainerCard\n\tfadescreen FADE_TO_BLACK\n\tspecial Script_ShowLinkTrainerCard\n\twaitstate\n\tend\n\nCableClub_EventScript_ReadTrainerCardColored::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox Text_LookedAtPlayersTrainerCardColored\n\tfadescreen FADE_TO_BLACK\n\tspecial Script_ShowLinkTrainerCard\n\twaitstate\n\tend\n\nCableClub_EventScript_TooBusyToNotice::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox Text_TrainerTooBusyToNotice\n\tclosemessage\n\tend\n\nBattleColosseum_2P_EventScript_Attendant::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial Script_FacePlayer\n\tmsgbox Text_TakeSeatStartBattle\n\tspecial Script_ClearHeldMovement\n\tclosemessage\n\tend\n\nTradeCenter_EventScript_Attendant::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial Script_FacePlayer\n\tmsgbox Text_TakeSeatStartTrade\n\tspecial Script_ClearHeldMovement\n\tclosemessage\n\tend\n\n@ Nop in FRLG\nRecordCorner_EventScript_Attendant::\n\tend\n\nTradeCenter_ConfirmLeaveRoom::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox Text_TerminateLinkIfYouLeaveRoom, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, TradeCenter_TerminateLink\n\terasebox 0, 0, 29, 19\n\treleaseall\n\tend\n\nTradeCenter_TerminateLink::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmessageautoscroll Text_TerminateLinkConfirmation\n\twaitmessage\n\tspecial ExitLinkRoom\n\tend\n\nCableClub_EventScript_DoLinkRoomExit::\n\tspecial CleanupLinkRoomState\n\tspecial ReturnFromLinkRoom\n\twaitstate\n\tend\n\nCableClub_EventScript_UnionRoomAttendant::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tgoto_if_unset FLAG_SYS_POKEDEX_GET, CableClub_EventScript_WirelessClubAdjustements\n\tspecialvar VAR_RESULT, IsBadEggInParty\n\tgoto_if_eq VAR_RESULT, TRUE, CableClub_EventScript_AbortLinkPlayerHasBadEgg\n\tcopyvar VAR_0x8007, VAR_LAST_TALKED\n\tspecialvar VAR_RESULT, IsWirelessAdapterConnected\n\tgoto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_UnionRoomAdapterNotConnected\n\tmessage CableClub_Text_WelcomeUnionRoomEnter\n\twaitmessage\n\tgoto CableClub_EventScript_AskEnterUnionRoom\n\tend\n\nCableClub_EventScript_AskEnterUnionRoom::\n\tmultichoice 18, 6, MULTICHOICE_YES_NO_INFO, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CableClub_EventScript_EnterUnionRoom\n\tcase 1, CableClub_EventScript_AbortLink\n\tcase 2, CableClub_EventScript_UnionRoomInfo\n\tcase SCR_MENU_CANCEL, CableClub_EventScript_AbortLink\n\tend\n\nCableClub_EventScript_UnionRoomInfo::\n\tmessage CableClub_Text_UnionRoomInfo\n\twaitmessage\n\tgoto CableClub_EventScript_AskEnterUnionRoom\n\tend\n\nCableClub_EventScript_EnterUnionRoom::\n\tcall CableClub_EventScript_CheckPartyUnionRoomRequirements\n\tgoto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_AbortLink\n\tcall EventScript_AskSaveGame\n\tgoto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortLink\n\tmsgbox CableClub_Text_EnjoyUnionRoom\n\tclosemessage\n\tsetflag FLAG_SYS_IS_LINKING\n\tcallnative RecalculatePartyStats\n\tspecial HealPlayerParty\n\tsetvar VAR_0x8004, USING_UNION_ROOM\n\tcopyvar VAR_CABLE_CLUB_STATE, VAR_0x8004\n\tspecial HelpSystem_Disable\n\tcall CableClub_EventScript_OpenUnionRoomBarrier\n\tspecial DrawWholeMapView\n\tplayse SE_CLICK\n\tdelay 60\n\tapplymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft\n\twaitmovement 0\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft\n\twaitmovement 0\n\topendoor 5, 1\n\twaitdooranim\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom\n\twaitmovement 0\n\thideobjectat OBJ_EVENT_ID_PLAYER, 0\n\tclosedoor 5, 1\n\twaitdooranim\n\tspecial Script_ResetUnionRoomTrade\n\tspecial SetCableClubWarp\n\twarpspinenter MAP_UNION_ROOM, 7, 11\n\twaitstate\n\tspecial RunUnionRoom\n\twaitstate\n\tend\n\nCableClub_EventScript_CheckPartyUnionRoomRequirements::\n\tspecialvar VAR_RESULT, CountPartyNonEggMons\n\tgoto_if_lt VAR_RESULT, 2, CableClub_EventScript_NeedTwoMonsForUnionRoom\n\tspecialvar VAR_RESULT, DoesPartyHaveEnigmaBerry\n\tgoto_if_eq VAR_RESULT, TRUE, CableClub_EventScript_NoEnigmaBerryInUnionRoom\n\tsetvar VAR_RESULT, TRUE\n\treturn\n\nCableClub_EventScript_NeedTwoMonsForUnionRoom::\n\tmsgbox CableClub_Text_NeedTwoMonsForUnionRoom\n\tgoto EventScript_SetResultFalse\n\tend\n\nCableClub_EventScript_NoEnigmaBerryInUnionRoom::\n\tmsgbox CableClub_Text_NoEnigmaBerryInUnionRoom\n\tgoto EventScript_SetResultFalse\n\tend\n\nCableClub_EventScript_UnionRoomAdapterNotConnected::\n\tmsgbox CableClub_Text_UnionRoomAdapterNotConnected\n\trelease\n\treturn\n\nCableClub_EventScript_WirelessClubAttendant::\n\tlock\n\tfaceplayer\n\tgoto_if_unset FLAG_SYS_POKEDEX_GET, CableClub_EventScript_WirelessClubAdjustements\n\tmsgbox CableClub_Text_AskAboutLinking, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CableClub_EventScript_DontAskAboutLinking\n\tmsgbox CableClub_Text_ExplainWirelessClub\n\trelease\n\treturn\n\nCableClub_EventScript_DontAskAboutLinking::\n\tmsgbox CableClub_Text_HopeYouEnjoyWirelessSystem\n\trelease\n\treturn\n\nCableClub_EventScript_DirectCornerAttendant::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tgoto_if_unset FLAG_SYS_POKEDEX_GET, CableClub_EventScript_WirelessClubAdjustements\n\tspecialvar VAR_RESULT, IsBadEggInParty\n\tgoto_if_eq VAR_RESULT, TRUE, CableClub_EventScript_AbortLinkPlayerHasBadEgg\n\tspecialvar VAR_RESULT, IsWirelessAdapterConnected\n\tgoto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_WelcomeToCableClub\n\tmessage CableClub_Text_WelcomeWhichDirectCornerRoom\n\twaitmessage\n\tdelay 15\n\tgoto CableClub_EventScript_DirectCornerSelectService\n\tend\n\nCableClub_EventScript_DirectCornerSelectService::\n\tgoto_if_unset FLAG_GOT_POWDER_JAR, CableClub_EventScript_DirectCornerNoBerry\n\tmultichoice 0, 0, MULTICHOICE_TRADE_COLOSSEUM_CRUSH, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CableClub_EventScript_WirelessTrade\n\tcase 1, CableClub_EventScript_WirelessBattleSelect\n\tcase 2, CableClub_EventScript_WirelessBerryCrush\n\tcase 3, CableClub_EventScript_AbortLink\n\tcase SCR_MENU_CANCEL, CableClub_EventScript_AbortLink\n\tend\n\nCableClub_EventScript_DirectCornerNoBerry::\n\tmultichoice 0, 0, MULTICHOICE_TRADE_COLOSSEUM_2, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CableClub_EventScript_WirelessTrade\n\tcase 1, CableClub_EventScript_WirelessBattleSelect\n\tcase 2, CableClub_EventScript_AbortLink\n\tcase SCR_MENU_CANCEL, CableClub_EventScript_AbortLink\n\tend\n\nCableClub_EventScript_WirelessTrade::\n\tmsgbox CableClub_Text_TradePokemon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CableClub_EventScript_AbortLink\n\tcall CableClub_EventScript_CheckPartyTradeRequirements\n\tgoto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_AbortLink\n\tsetvar VAR_0x8004, LINK_GROUP_TRADE\n\tgoto CableClub_EventScript_SaveAndChooseLinkLeader\n\tend\n\nCableClub_EventScript_WirelessBattleSelect::\n\tmessage CableClub_Text_PlayWhichBattleMode\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_SINGLE_DOUBLE_MULTI_INFO_EXIT, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CableClub_EventScript_WirelessSingleBattle\n\tcase 1, CableClub_EventScript_WirelessDoubleBattle\n\tcase 2, CableClub_EventScript_WirelessMultiBattle\n\tcase 3, CableClub_EventScript_WirelessBattleInfo\n\tcase 4, CableClub_EventScript_AbortLink\n\tcase SCR_MENU_CANCEL, CableClub_EventScript_AbortLink\n\tend\n\nCableClub_EventScript_WirelessSingleBattle::\n\tsetvar VAR_0x8004, LINK_GROUP_SINGLE_BATTLE\n\tgoto CableClub_EventScript_SaveAndChooseLinkLeader\n\tend\n\nCableClub_EventScript_WirelessDoubleBattle::\n\tspecial HasEnoughMonsForDoubleBattle\n\tgoto_if_ne VAR_RESULT, PLAYER_HAS_TWO_USABLE_MONS, CableClub_EventScript_TwoMonsNeededForWirelessDoubleBattle\n\tsetvar VAR_0x8004, LINK_GROUP_DOUBLE_BATTLE\n\tgoto CableClub_EventScript_SaveAndChooseLinkLeader\n\tend\n\nCableClub_EventScript_TwoMonsNeededForWirelessDoubleBattle::\n\tmsgbox CableClub_Text_NeedTwoMonsForDoubleBattle\n\tgoto CableClub_EventScript_WirelessBattleSelect\n\tend\n\nCableClub_EventScript_WirelessMultiBattle::\n\tsetvar VAR_0x8004, LINK_GROUP_MULTI_BATTLE\n\tgoto CableClub_EventScript_SaveAndChooseLinkLeader\n\tend\n\nCableClub_EventScript_WirelessBattleInfo::\n\tmsgbox CableClub_Text_ExplainBattleModes\n\tgoto CableClub_EventScript_WirelessBattleSelect\n\tend\n\nCableClub_EventScript_WirelessBerryCrush::\n\tmsgbox CableClub_Text_UseBerryCrush, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CableClub_EventScript_AbortLink\n\tspecial HasAtLeastOneBerry\n\tgoto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_NeedBerryForBerryCrush\n\tsetvar VAR_0x8004, LINK_GROUP_BERRY_CRUSH\n\tgoto CableClub_EventScript_SaveAndChooseLinkLeader\n\tend\n\nCableClub_EventScript_NeedBerryForBerryCrush::\n\tmsgbox CableClub_Text_NeedBerryForBerryCrush\n\tgoto CableClub_EventScript_DirectCornerSelectService\n\tend\n\nCableClub_EventScript_SaveAndChooseLinkLeader::\n\tcall EventScript_AskSaveGame\n\tgoto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortLink\n\tswitch VAR_0x8004\n\tcase LINK_GROUP_TRADE, CableClub_EventScript_ChooseLinkLeaderFrom2\n\tcase LINK_GROUP_SINGLE_BATTLE, CableClub_EventScript_ChooseLinkLeaderFrom2\n\tcase LINK_GROUP_DOUBLE_BATTLE, CableClub_EventScript_ChooseLinkLeaderFrom2\n\tcase LINK_GROUP_MULTI_BATTLE, CableClub_EventScript_ChooseLinkLeaderFrom4\n\tcase LINK_GROUP_BERRY_CRUSH, CableClub_EventScript_ChooseLinkLeader\n\tend\n\nCableClub_EventScript_ChooseLinkLeaderFrom2::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmessage CableClub_Text_ChooseGroupLeaderOfTwo\n\twaitmessage\n\tcall EventScript_RestorePrevTextColor\n\tmultichoice 13, 6, MULTICHOICE_JOIN_OR_LEAD, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CableClub_EventScript_TryJoinGroup2Players\n\tcase 1, CableClub_EventScript_TryLeadGroup2Players\n\tcase 2, CableClub_EventScript_AbortLink\n\tcase SCR_MENU_CANCEL, CableClub_EventScript_AbortLink\n\tend\n\nCableClub_EventScript_TryLeadGroup2Players::\n\tcall CableClub_EventScript_TryBecomeLinkLeader\n\tgoto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom\n\tgoto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderFrom2\n\tgoto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryLeadGroup2Players\n\trelease\n\treturn\n\nCableClub_EventScript_TryJoinGroup2Players::\n\tcall CableClub_EventScript_TryJoinLinkGroup\n\tgoto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom\n\tgoto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderFrom2\n\tgoto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryJoinGroup2Players\n\trelease\n\treturn\n\nCableClub_EventScript_ChooseLinkLeaderFrom4::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmessage CableClub_Text_ChooseGroupLeaderOfFour\n\twaitmessage\n\tcall EventScript_RestorePrevTextColor\n\tmultichoice 13, 6, MULTICHOICE_JOIN_OR_LEAD, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CableClub_EventScript_TryJoinGroup4Players\n\tcase 1, CableClub_EventScript_TryLeadGroup4Players\n\tcase 2, CableClub_EventScript_AbortLink\n\tcase SCR_MENU_CANCEL, CableClub_EventScript_AbortLink\n\tend\n\nCableClub_EventScript_TryLeadGroup4Players::\n\tcall CableClub_EventScript_TryBecomeLinkLeader\n\tgoto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom\n\tgoto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderFrom4\n\tgoto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryLeadGroup4Players\n\trelease\n\treturn\n\nCableClub_EventScript_TryJoinGroup4Players::\n\tcall CableClub_EventScript_TryJoinLinkGroup\n\tgoto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom\n\tgoto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderFrom4\n\tgoto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryJoinGroup4Players\n\trelease\n\treturn\n\nCableClub_EventScript_ChooseLinkLeader::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmessage CableClub_Text_ChooseGroupLeader\n\twaitmessage\n\tcall EventScript_RestorePrevTextColor\n\tmultichoice 13, 6, MULTICHOICE_JOIN_OR_LEAD, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CableClub_EventScript_TryJoinGroupXPlayers\n\tcase 1, CableClub_EventScript_TryLeadGroupXPlayers\n\tcase 2, CableClub_EventScript_AbortLink\n\tcase SCR_MENU_CANCEL, CableClub_EventScript_AbortLink\n\tend\n\nCableClub_EventScript_TryLeadGroupXPlayers::\n\tcall CableClub_EventScript_TryBecomeLinkLeader\n\tgoto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom\n\tgoto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeader\n\tgoto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryLeadGroupXPlayers\n\trelease\n\treturn\n\nCableClub_EventScript_TryJoinGroupXPlayers::\n\tcall CableClub_EventScript_TryJoinLinkGroup\n\tgoto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom\n\tgoto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeader\n\tgoto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryJoinGroupXPlayers\n\trelease\n\treturn\n\nCableClub_EventScript_TryBecomeLinkLeader::\n\tspecial HelpSystem_Disable\n\tspecial TryBecomeLinkLeader\n\twaitstate\n\treturn\n\nCableClub_EventScript_TryJoinLinkGroup::\n\tspecial HelpSystem_Disable\n\tspecial TryJoinLinkGroup\n\twaitstate\n\treturn\n\nCableClub_EventScript_EnterWirelessLinkRoom::\n\tsetflag FLAG_SYS_IS_LINKING\n\tcallnative RecalculatePartyStats\n\tmessageautoscroll CableClub_Text_DirectYouToYourRoom\n\twaitmessage\n\tdelay 60\n\tclosemessage\n\tcopyvar VAR_0x8007, VAR_LAST_TALKED\n\tcall CableClub_EventScript_OpenDirectCornerBarrier\n\tspecial DrawWholeMapView\n\tplayse SE_CLICK\n\tdelay 60\n\tapplymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft\n\twaitmovement 0\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft\n\twaitmovement 0\n\topendoor 9, 1\n\twaitdooranim\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom\n\twaitmovement 0\n\thideobjectat OBJ_EVENT_ID_PLAYER, 0\n\tclosedoor 9, 1\n\twaitdooranim\n\trelease\n\twaitstate\n\tend\n\nCableClub_EventScript_ShowWirelessCommunicationScreen::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlockall\n\tgoto_if_unset FLAG_SYS_POKEDEX_GET, CableClub_EventScript_NotReadyYet\n\tspecialvar VAR_RESULT, IsWirelessAdapterConnected\n\tgoto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_AdapterNotConnected\n\tspecial HelpSystem_Disable\n\tfadescreen FADE_TO_BLACK\n\tspecial ShowWirelessCommunicationScreen\n\twaitstate\n\tmsgbox CableClub_Text_ParticipantsStepUpToCounter\n\tspecial HelpSystem_Enable\n\treleaseall\n\tend\n\nCableClub_EventScript_AdapterNotConnected::\n\tmsgbox CableClub_Text_AdapterNotConnected\n\treleaseall\n\tend\n\nCableClub_EventScript_OpenUnionRoomBarrier::\n\tsetmetatile 5, 3, METATILE_PokemonCenter_Floor_ShadeLeft, 0\n\treturn\n\nCableClub_EventScript_CloseUnionRoomBarrier::\n\tsetmetatile 5, 3, METATILE_PokemonCenter_CounterBarrier, 1\n\treturn\n\nCableClub_EventScript_OpenDirectCornerBarrier::\n\tsetmetatile 9, 3, METATILE_PokemonCenter_Floor_ShadeLeft, 0\n\treturn\n\nCableClub_EventScript_CloseDirectCornerBarrier::\n\tsetmetatile 9, 3, METATILE_PokemonCenter_CounterBarrier, 1\n\treturn\n\nCableClub_EventScript_OpenGameCornerBarrier::\n\tsetmetatile 5, 3, METATILE_GameCorner_CheckeredFloor_ShadeLeft, 0\n\treturn\n\nCableClub_EventScript_CloseGameCornerBarrier::\n\tsetmetatile 5, 3, METATILE_GameCorner_CounterBarrier, 1\n\treturn\n\nJoyfulGameCorner_EventScript_InfoMan2::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tmessage Text_DescribeWhichGame\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_POKEJUMP_DODRIO, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CableClub_EventScript_PokemonJumpInfo\n\tcase 1, CableClub_EventScript_DodrioBerryPickingInfo\n\tcase 2, CableClub_EventScript_MinigameInfoExit\n\tcase SCR_MENU_CANCEL, CableClub_EventScript_MinigameInfoExit\n\tend\n\nCableClub_EventScript_PokemonJumpInfo::\n\tmsgbox Text_PokemonJumpInfo\n\trelease\n\tend\n\nCableClub_EventScript_DodrioBerryPickingInfo::\n\tmsgbox Text_DodrioBerryPickingInfo\n\trelease\n\tend\n\nCableClub_EventScript_MinigameInfoExit::\n\tmsgbox Text_TalkToManToPlay\n\trelease\n\tend\n\nJoyfulGameCorner_EventScript_MinigameAttendant::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tmessage Text_WelcomeCanYouWait\n\twaitmessage\n\tspecialvar VAR_RESULT, IsWirelessAdapterConnected\n\tgoto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_AdapterNotConnectedMinigame\n\tdelay 60\n\tspecial HelpSystem_Disable\n\tmessage Text_PlayWhichGame\n\twaitmessage\n\tmultichoice 0, 0, MULTICHOICE_POKEJUMP_DODRIO, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CableClub_EventScript_PlayPokemonJump\n\tcase 1, CableClub_EventScript_PlayDodrioBerryPicking\n\tcase 2, CableClub_EventScript_AbortMinigame\n\tcase SCR_MENU_CANCEL, CableClub_EventScript_AbortMinigame\n\tend\n\nCableClub_EventScript_PlayPokemonJump::\n\tsetvar VAR_0x8005, 0\n\tspecial IsPokemonJumpSpeciesInParty\n\tgoto_if_eq VAR_RESULT, FALSE, CableClub_EventScript_NoEligiblePkmn\n\tmsgbox Text_EnterWhichPokemon\n\tsetvar VAR_0x8005, 0\n\tspecial ChooseMonForWirelessMinigame\n\twaitstate\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, CableClub_EventScript_AbortMinigame\n\tcall EventScript_AskSaveGame\n\tgoto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortMinigame\n\tsetvar VAR_0x8004, LINK_GROUP_POKEMON_JUMP\n\tgoto CableClub_EventScript_ChooseLinkLeaderMinigame\n\tend\n\nCableClub_EventScript_PlayDodrioBerryPicking::\n\tsetvar VAR_0x8005, 1\n\tspecial IsDodrioInParty\n\tgoto_if_eq VAR_RESULT, 0, CableClub_EventScript_NoEligiblePkmn\n\tmsgbox Text_EnterWhichPokemon\n\tsetvar VAR_0x8005, 1\n\tspecial ChooseMonForWirelessMinigame\n\twaitstate\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, CableClub_EventScript_AbortMinigame\n\tcall EventScript_AskSaveGame\n\tgoto_if_eq VAR_RESULT, 0, CableClub_EventScript_AbortMinigame\n\tsetvar VAR_0x8004, LINK_GROUP_BERRY_PICKING\n\tgoto CableClub_EventScript_ChooseLinkLeaderMinigame\n\tend\n\nCableClub_EventScript_ChooseLinkLeaderMinigame::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmessage CableClub_Text_ChooseGroupLeader\n\twaitmessage\n\tcall EventScript_RestorePrevTextColor\n\tmultichoice 13, 6, MULTICHOICE_JOIN_OR_LEAD, FALSE\n\tswitch VAR_RESULT\n\tcase 0, CableClub_EventScript_TryJoinMinigameLinkGroup\n\tcase 1, CableClub_EventScript_TryBecomeMinigameLinkLeader\n\tcase 2, CableClub_EventScript_AbortMinigame\n\tcase SCR_MENU_CANCEL, CableClub_EventScript_AbortMinigame\n\tend\n\nCableClub_EventScript_TryBecomeMinigameLinkLeader::\n\tcall CableClub_EventScript_TryBecomeLinkLeader\n\tgoto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterMinigame\n\tgoto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderMinigame\n\tgoto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryBecomeMinigameLinkLeader\n\trelease\n\treturn\n\nCableClub_EventScript_TryJoinMinigameLinkGroup::\n\tcall CableClub_EventScript_TryJoinLinkGroup\n\tgoto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterMinigame\n\tgoto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderMinigame\n\tgoto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryJoinMinigameLinkGroup\n\trelease\n\treturn\n\nCableClub_EventScript_EnterMinigame::\n\tmessageautoscroll Text_AllGoodToGo\n\twaitmessage\n\tdelay 120\n\tclosemessage\n\tcopyvar VAR_0x8007, VAR_LAST_TALKED\n\tcall CableClub_EventScript_OpenGameCornerBarrier\n\tspecial DrawWholeMapView\n\tplayse SE_CLICK\n\tdelay 60\n\tapplymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft\n\twaitmovement 0\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterMinigameRoom\n\twaitmovement 0\n\thideobjectat OBJ_EVENT_ID_PLAYER, 0\n\trelease\n\twaitstate\n\tend\n\nCableClub_EventScript_AdapterNotConnectedMinigame::\n\tmsgbox Text_AdapterNotConnectedMinigame\n\trelease\n\tend\n\nCableClub_EventScript_NoEligiblePkmn::\n\tmsgbox EventScript_ExplainPokemonJumpRequirements, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CableClub_EventScript_AbortMinigame\n\tcall_if_eq VAR_0x8005, 0, CableClub_EventScript_ExplainPokemonJumpRequirements\n\tcall_if_eq VAR_0x8005, 1, CableClub_EventScript_ExplainDodrioBerryPickingRequirements\n\tgoto CableClub_EventScript_AbortMinigame\n\tend\n\nCableClub_EventScript_ExplainPokemonJumpRequirements::\n\tmsgbox Text_ShortJumpingPokemonAllowed\n\treturn\n\nCableClub_EventScript_ExplainDodrioBerryPickingRequirements::\n\tmsgbox Text_OnlyDodrioAllowed\n\treturn\n\nTwoIsland_JoyfulGameCorner_EventScript_ShowPokemonJumpRecords::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlockall\n\tspecial ShowPokemonJumpRecords\n\twaitstate\n\treleaseall\n\tend\n\nTwoIsland_JoyfulGameCorner_EventScript_ShowDodrioBerryPickingRecords::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlockall\n\tspecial ShowDodrioBerryPickingRecords\n\twaitstate\n\treleaseall\n\tend\n\nCableClub_Text_WelcomeWhichCableClubService::\n\t.string \"Welcome to the POKéMON CABLE\\n\"\n\t.string \"CLUB.\\p\"\n\t.string \"Which of our services do you wish\\n\"\n\t.string \"to use?$\"\n\nCableClub_Text_WhichService::\n\t.string \"Which of our services do you wish\\n\"\n\t.string \"to use?$\"\n\nCableClub_Text_TradeMonsUsingLinkCable::\n\t.string \"Trade POKéMON with another player\\n\"\n\t.string \"using a GBA Game Link cable.$\"\n\nCableClub_Text_BattleUsingLinkCable::\n\t.string \"You may battle another TRAINER\\n\"\n\t.string \"using a GBA Game Link cable.$\"\n\nCableClub_Text_NeedTwoMonsForDoubleBattle::\n\t.string \"For a DOUBLE BATTLE, you must\\n\"\n\t.string \"have at least two POKéMON.$\"\n\nCableClub_Text_NeedTwoMonsToTrade::\n\t.string \"For trading, you must have at\\n\"\n\t.string \"least two POKéMON with you.$\"\n\nCableClub_Text_CantTradeEnigmaBerry::\n\t.string \"A POKéMON holding the {STR_VAR_1}\\n\"\n\t.string \"BERRY can't be traded.$\"\n\nCableClub_Text_PleaseWaitBCancel::\n\t.string \"Please wait.\\n\"\n\t.string \"… … B Button: Cancel$\"\n\nCableClub_Text_WhenAllPlayersReadyAConfirmBCancel::\n\t.string \"When all players are ready…\\n\"\n\t.string \"A Button: Confirm\\l\"\n\t.string \"B Button: Cancel$\"\n\nCableClub_Text_StartLinkWithXPlayersAConfirmBCancel::\n\t.string \"Start link with {STR_VAR_1} players.\\n\"\n\t.string \"A Button: Confirm\\l\"\n\t.string \"B Button: Cancel$\"\n\nCableClub_Text_AwaitingLinkupBCancel::\n\t.string \"Awaiting linkup…\\n\"\n\t.string \"… … B Button: Cancel$\"\n\nCableClub_Text_PleaseEnter::\n\t.string \"Please enter.$\"\n\nCableClub_Text_DirectYouToYourRoom::\n\t.string \"I'll direct you to your room now.$\"\n\nCableClub_Text_SomeoneIsNotReadyToLink::\n\t.string \"Someone is not ready to link.\\p\"\n\t.string \"Please come back after everyone\\n\"\n\t.string \"has made preparations.$\"\n\nCableClub_Text_LinkErrorPleaseReset::\n\t.string \"Sorry, we have a link error…\\n\"\n\t.string \"Please reset and try again.$\"\n\nCableClub_Text_PlayersMadeDifferentSelections::\n\t.string \"The link partners appear to have\\n\"\n\t.string \"made different selections.$\"\n\nCableClub_Text_PleaseVisitAgain::\n\t.string \"Please do visit again.$\"\n\nCableClub_Text_IncorrectNumberOfParticipants::\n\t.string \"The number of participants is\\n\"\n\t.string \"incorrect.$\"\n\nCableClub_Text_CantSingleBattleWithXPlayers::\n\t.string \"The SINGLE BATTLE Mode can't be\\n\"\n\t.string \"played by {STR_VAR_1} players.$\"\n\nCableClub_Text_CantDoubleBattleWithXPlayers::\n\t.string \"The DOUBLE BATTLE Mode can't be\\n\"\n\t.string \"played by {STR_VAR_1} players.$\"\n\nCableClub_Text_NeedFourPlayers::\n\t.string \"There must be four players to play\\n\"\n\t.string \"this Battle Mode.$\"\n\nCableClub_Text_PleaseConfirmNumberAndRestart::\n\t.string \"Please confirm the number of\\n\"\n\t.string \"players and start again.$\"\n\nText_TerminateLinkIfYouLeaveRoom::\n\t.string \"The link will be terminated if you\\n\"\n\t.string \"leave the room. Is that okay?$\"\n\nText_TerminateLinkConfirmation::\n\t.string \"Terminating link…\\n\"\n\t.string \"You will be escorted out of\\l\"\n\t.string \"the room. Please wait.$\"\n\nText_TrainerTooBusyToNotice::\n\t.string \"This TRAINER is too busy to\\n\"\n\t.string \"notice…$\"\n\nText_LookedAtPlayersTrainerCard::\n\t.string \"Score! Got to look at {STR_VAR_1}'s\\n\"\n\t.string \"TRAINER CARD!$\"\n\nText_LookedAtPlayersTrainerCardColored::\n\t.string \"Score! Got to look at {STR_VAR_1}'s\\n\"\n\t.string \"TRAINER CARD!\\p\"\n\t.string \"It's a {STR_VAR_2} card!$\"\n\nText_TakeSeatStartBattle::\n\t.string \"Please take your seat and start\\n\"\n\t.string \"your battle.$\"\n\nText_TakeSeatStartTrade::\n\t.string \"Please take your seat and start\\n\"\n\t.string \"your trade.$\"\n\nCableClub_Text_TrainerCardDataOverwritten::\n\t.string \"The TRAINER CARD data will\\n\"\n\t.string \"be overwritten.$\"\n\nCableClub_Text_HopeToSeeYouAgain::\n\t.string \"I hope to see you again!$\"\n\nCableClub_Text_NotSetUpForFarAwayRegion::\n\t.string \"I'm awfully sorry.\\p\"\n\t.string \"We're not set up to conduct trades\\n\"\n\t.string \"with TRAINERS far away in another\\l\"\n\t.string \"region yet…$\"\n\nCableClub_Text_OtherTrainerNotReady::\n\t.string \"The other TRAINER is not ready.$\"\n\nCableClub_Text_YouHaveAMonThatCantBeTaken::\n\t.string \"You have at least one POKéMON\\n\"\n\t.string \"that can't be taken.$\"\n\nCableClub_Text_AdapterNotConnected::\n\t.string \"The Wireless Adapter is not\\n\"\n\t.string \"connected properly.$\"\n\nCableClub_Text_ParticipantsStepUpToCounter::\n\t.string \"Participants are asked to step up\\n\"\n\t.string \"to the reception counter.$\"\n\nCableClub_Text_YouMayTradeHere::\n\t.string \"You may trade your POKéMON here\\n\"\n\t.string \"with another TRAINER.$\"\n\nCableClub_Text_YouMayBattleHere::\n\t.string \"You may battle with your friends\\n\"\n\t.string \"here.$\"\n\nCableClub_Text_CanMakeBerryPowder::\n\t.string \"Two to five TRAINERS can make\\n\"\n\t.string \"BERRY POWDER together.$\"\n\nCableClub_Text_CancelSelectedItem::\n\t.string \"Cancels the selected MENU item.$\"\n\nCableClub_Text_NeedBerryForBerryCrush::\n\t.string \"To use the BERRY CRUSH service,\\n\"\n\t.string \"you must have at least one BERRY.$\"\n\nCableClub_Text_NeedTwoMonsForUnionRoom::\n\t.string \"To enter the UNION ROOM, you must\\n\"\n\t.string \"have at least two POKéMON.$\"\n\nCableClub_Text_NoEnigmaBerryInUnionRoom::\n\t.string \"No POKéMON holding the {STR_VAR_1}\\n\"\n\t.string \"BERRY may enter the UNION ROOM.$\"\n\nCableClub_Text_UnionRoomAdapterNotConnected::\n\t.string \"This is the POKéMON WIRELESS CLUB\\n\"\n\t.string \"UNION ROOM.\\p\"\n\t.string \"Unfortunately, your Wireless\\n\"\n\t.string \"Adapter is not connected properly.\\p\"\n\t.string \"Please do come again.$\"\n\nText_PlayerIsPlayingRightNowGoForIt::\n\t.string \"It appears as if {STR_VAR_1} is playing\\n\"\n\t.string \"right now.\\l\"\n\t.string \"Go for it!$\"\n\nText_DescribeWhichGame::\n\t.string \"I can explain game rules to you,\\n\"\n\t.string \"if you'd like.\\p\"\n\t.string \"Which game should I describe?$\"\n\nText_PokemonJumpInfo::\n\t.string \"“POKéMON JUMP”\\p\"\n\t.string \"Make your POKéMON skip the\\n\"\n\t.string \"VINE WHIP rope with the A Button.\\p\"\n\t.string \"Only mini POKéMON around 28 inches\\n\"\n\t.string \"or less may participate.\\p\"\n\t.string \"POKéMON that only swim, burrow, or\\n\"\n\t.string \"fly are not good at jumping.\\p\"\n\t.string \"As a result, those POKéMON may not\\n\"\n\t.string \"participate.\\p\"\n\t.string \"Good things happen if everyone\\n\"\n\t.string \"jumps in time.$\"\n\nText_DodrioBerryPickingInfo::\n\t.string \"“DODRIO BERRY-PICKING”\\p\"\n\t.string \"Command DODRIO's three heads to\\n\"\n\t.string \"catch falling BERRIES.\\p\"\n\t.string \"Press right, up, or left on the\\n\"\n\t.string \"{PLUS} Control Pad to move the heads.\\p\"\n\t.string \"To play this game, you must have\\n\"\n\t.string \"a DODRIO.$\"\n\nText_TalkToManToPlay::\n\t.string \"If you want to play a game,\\n\"\n\t.string \"please tell the man beside me.$\"\n\nText_WelcomeCanYouWait::\n\t.string \"Hi, welcome!\\n\"\n\t.string \"You can play games over the\\l\"\n\t.string \"Wireless Communication System.\\p\"\n\t.string \"Can you wait just a little bit?$\"\n\nCableClub_Text_ComeAgain::\n\t.string \"All right, come again!$\"\n\nText_AdapterNotConnectedMinigame::\n\t.string \"The Wireless Adapter isn't\\n\"\n\t.string \"connected.\\p\"\n\t.string \"Come back when it's hooked up!$\"\n\nText_PlayWhichGame::\n\t.string \"All right, which game did you want\\n\"\n\t.string \"to play?$\"\n\nText_EnterWhichPokemon::\n\t.string \"Which POKéMON would you like to\\n\"\n\t.string \"enter?$\"\n\nText_AllGoodToGo::\n\t.string \"Okay, you're all good to go.\\n\"\n\t.string \"Don't let the others beat you!$\"\n\nEventScript_ExplainPokemonJumpRequirements::\n\t.string \"It doesn't look like you have any\\n\"\n\t.string \"POKéMON that you can enter…\\p\"\n\t.string \"Would you like me to explain what\\n\"\n\t.string \"kinds of POKéMON can enter?$\"\n\nText_ShortJumpingPokemonAllowed::\n\t.string \"“POKéMON JUMP” is open to POKéMON\\n\"\n\t.string \"around 28 inches or less.\\p\"\n\t.string \"What you can't enter are those\\n\"\n\t.string \"POKéMON that can't jump.\\p\"\n\t.string \"You know, like POKéMON that only\\n\"\n\t.string \"swim, burrow, or fly.\\p\"\n\t.string \"That's all you need to know.$\"\n\nText_OnlyDodrioAllowed::\n\t.string \"“DODRIO BERRY-PICKING”…\\n\"\n\t.string \"Well, the name says it all.\\p\"\n\t.string \"You have to have a DODRIO to play\\n\"\n\t.string \"this game.$\"\n\nCableClub_Text_WelcomeWhichDirectCornerRoom::\n\t.string \"Welcome to the POKéMON WIRELESS\\n\"\n\t.string \"CLUB DIRECT CORNER.\\p\"\n\t.string \"You may interact directly with\\n\"\n\t.string \"your friends here.\\p\"\n\t.string \"Which room would you like to\\n\"\n\t.string \"enter?$\"\n\nCableClub_Text_TradePokemon::\n\t.string \"Would you like to trade POKéMON?$\"\n\nCableClub_Text_PlayWhichBattleMode::\n\t.string \"Which Battle Mode would you like\\n\"\n\t.string \"to play?$\"\n\nCableClub_Text_UseBerryCrush::\n\t.string \"Would you like to use the\\n\"\n\t.string \"BERRY CRUSH System?$\"\n\nCableClub_Text_ExplainBattleModes::\n\t.string \"There are three Battle Modes.\\p\"\n\t.string \"SINGLE BATTLE is for two TRAINERS\\n\"\n\t.string \"with one or more POKéMON each.\\p\"\n\t.string \"Each TRAINER can have one POKéMON\\n\"\n\t.string \"in battle at a time.\\p\"\n\t.string \"DOUBLE BATTLE is for two TRAINERS\\n\"\n\t.string \"with two or more POKéMON each.\\p\"\n\t.string \"Each TRAINER will send out two\\n\"\n\t.string \"POKéMON in battle at a time.\\p\"\n\t.string \"MULTI BATTLE is for four TRAINERS\\n\"\n\t.string \"with one or more POKéMON each.\\p\"\n\t.string \"Each TRAINER can have one POKéMON\\n\"\n\t.string \"in battle at a time.$\"\n\nCableClub_Text_ChooseGroupLeaderOfTwo::\n\t.string \"Please decide which of you two\\n\"\n\t.string \"will become the LEADER.\\p\"\n\t.string \"The other player must then choose\\n\"\n\t.string \"“JOIN GROUP.”$\"\n\nCableClub_Text_ChooseGroupLeaderOfFour::\n\t.string \"Please decide which of you four\\n\"\n\t.string \"will become the GROUP LEADER.\\p\"\n\t.string \"The other players must then choose\\n\"\n\t.string \"“JOIN GROUP.”$\"\n\nCableClub_Text_ChooseGroupLeader::\n\t.string \"Please decide which of you will\\n\"\n\t.string \"become the GROUP LEADER.\\p\"\n\t.string \"The other players must then choose\\n\"\n\t.string \"“JOIN GROUP.”$\"\n\nCableClub_Text_WelcomeUnionRoomEnter::\n\t.string \"Welcome to the POKéMON WIRELESS\\n\"\n\t.string \"CLUB UNION ROOM.\\p\"\n\t.string \"You may interact directly with\\n\"\n\t.string \"other TRAINERS here, some of\\l\"\n\t.string \"whom you may not even know.\\p\"\n\t.string \"Would you like to enter the ROOM?$\"\n\nCableClub_Text_UnionRoomInfo::\n\t.string \"The TRAINERS in the UNION ROOM\\n\"\n\t.string \"will be those players around you\\l\"\n\t.string \"who have also entered the ROOM.\\p\"\n\t.string \"You may do all sorts of things\\n\"\n\t.string \"here, such as exchanging greetings.\\p\"\n\t.string \"You may enter two POKéMON up to\\n\"\n\t.string \"Lv. 30 for a one-on-one battle.\\p\"\n\t.string \"You may take part in a chat with\\n\"\n\t.string \"two to five people.\\p\"\n\t.string \"Or, you may register a POKéMON for\\n\"\n\t.string \"trade.\\p\"\n\t.string \"Would you like to enter the ROOM?$\"\n\nCableClub_Text_EnjoyUnionRoom::\n\t.string \"I hope you enjoy your time in\\n\"\n\t.string \"the UNION ROOM.$\"\n\nCableClub_Text_FirstTimeRightThisWay::\n\t.string \"Hello!\\n\"\n\t.string \"My name is TEALA.\\p\"\n\t.string \"This must be your first time\\n\"\n\t.string \"up here.\\p\"\n\t.string \"I'll show you how the Wireless\\n\"\n\t.string \"Communication System works.\\p\"\n\t.string \"First, I need to show you this\\n\"\n\t.string \"floor of our POKéMON CENTER.\\p\"\n\t.string \"Right this way, please.$\"\n\nCableClub_Text_ExplainWirelessClubFirstTime::\n\t.string \"On the top floor, there are two\\n\"\n\t.string \"rooms.\\p\"\n\t.string \"First, the room on the left.\\n\"\n\t.string \"It's the UNION ROOM.\\p\"\n\t.string \"You may link up with TRAINERS\\n\"\n\t.string \"around you who have also entered\\l\"\n\t.string \"the UNION ROOM.\\p\"\n\t.string \"With them, you may do things like\\n\"\n\t.string \"chat, battle, and trade.\\p\"\n\t.string \"Second, the room on the right is\\n\"\n\t.string \"the DIRECT CORNER.\\p\"\n\t.string \"You may trade or battle POKéMON\\n\"\n\t.string \"with your friends in this room.\\p\"\n\t.string \"If the Wireless Adapter isn't\\n\"\n\t.string \"connected, you may still link up\\l\"\n\t.string \"using a GBA Game Link cable.\\p\"\n\t.string \"If that is the case, you must go\\n\"\n\t.string \"to the DIRECT CORNER.\\p\"\n\t.string \"I hope you enjoy the Wireless \\n\"\n\t.string \"Communication System.$\"\n\nCableClub_Text_AskAboutLinking::\n\t.string \"Hello, {PLAYER}!\\p\"\n\t.string \"It's me, TEALA, the POKéMON\\n\"\n\t.string \"CENTER 2F attendant.\\p\"\n\t.string \"Is there something you needed to\\n\"\n\t.string \"ask me about linking?$\"\n\nCableClub_Text_ExplainWirelessClub::\n\t.string \"Let me explain how the POKéMON\\n\"\n\t.string \"WIRELESS CLUB works.\\p\"\n\t.string \"On this, the top floor, there are\\n\"\n\t.string \"two rooms.\\p\"\n\t.string \"First, the room on the left.\\n\"\n\t.string \"It's the UNION ROOM.\\p\"\n\t.string \"You may link up with TRAINERS\\n\"\n\t.string \"around you who have also entered\\l\"\n\t.string \"the UNION ROOM.\\p\"\n\t.string \"With them, you may do things like\\n\"\n\t.string \"chat, battle, and trade.\\p\"\n\t.string \"Second, the room on the right is\\n\"\n\t.string \"the DIRECT CORNER.\\p\"\n\t.string \"You may trade or battle POKéMON\\n\"\n\t.string \"with your friends in this room.\\p\"\n\t.string \"Sometimes, you may not be able to\\n\"\n\t.string \"find your friends in the UNION ROOM\\l\"\n\t.string \"or the DIRECT CORNER.\\p\"\n\t.string \"In that case, please move closer\\n\"\n\t.string \"to your friends.\\p\"\n\t.string \"If the Wireless Adapter isn't\\n\"\n\t.string \"connected, you may still link up\\l\"\n\t.string \"using a GBA Game Link cable.\\p\"\n\t.string \"If that is the case, you must go\\n\"\n\t.string \"to the DIRECT CORNER.\\p\"\n\t.string \"I hope you enjoy the Wireless \\n\"\n\t.string \"Communication System.$\"\n\nCableClub_Text_HopeYouEnjoyWirelessSystem::\n\t.string \"I hope you enjoy the Wireless\\n\"\n\t.string \"Communication System.$\"\n"
  },
  {
    "path": "data/scripts/cave_of_origin.inc",
    "content": "@ All unused / leftover scripts from RS\nCaveOfOrigin_EventScript_Shake1::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tgoto CaveOfOrigin_EventScript_Shake\n\tend\n\nCaveOfOrigin_EventScript_Shake2::\n\tlockall\n\tsetvar VAR_TEMP_2, 1\n\tgoto CaveOfOrigin_EventScript_Shake\n\tend\n\nCaveOfOrigin_EventScript_Shake3::\n\tlockall\n\tsetvar VAR_TEMP_3, 1\n\tgoto CaveOfOrigin_EventScript_Shake\n\tend\n\nCaveOfOrigin_EventScript_Shake::\n\tsetvar VAR_0x8004, 1\n\tsetvar VAR_0x8005, 1\n\tsetvar VAR_0x8006, 8\n\tsetvar VAR_0x8007, 5\n\tspecial ShakeScreen\n\twaitstate\n\treleaseall\n\tend\n\nCaveOfOrigin_EventScript_DisableShakes::\n\tsetvar VAR_TEMP_1, 1\n\tsetvar VAR_TEMP_2, 1\n\tsetvar VAR_TEMP_3, 1\n\tsetvar VAR_TEMP_4, 1\n\tsetvar VAR_TEMP_5, 1\n\treturn\n"
  },
  {
    "path": "data/scripts/day_care.inc",
    "content": "Route5_PokemonDayCare_EventScript_DaycareMan::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlock\n\tfaceplayer\n\tshowmoneybox 0, 0\n\tspecialvar VAR_RESULT, IsThereMonInRoute5Daycare\n\tgoto_if_eq VAR_RESULT, TRUE, Route5_PokemonDayCare_EventScript_CheckOnMon\n\tmsgbox Route5_PokemonDayCare_Text_WantMeToRaiseMon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, Route5_PokemonDayCare_EventScript_TryGiveMon\n\tmsgbox Route5_PokemonDayCare_Text_ComeAgain\n\tgoto Route5_PokemonDayCare_EventScript_CloseMoneyBox\n\tend\n\nRoute5_PokemonDayCare_EventScript_TryGiveMon::\n\tspecialvar VAR_RESULT, CountPartyNonEggMons\n\tgoto_if_eq VAR_RESULT, 1, Route5_PokemonDayCare_EventScript_OnlyOneMonInParty\n\tmsgbox Route5_PokemonDayCare_Text_WhichMonShouldIRaise\n\tfadescreen FADE_TO_BLACK\n\thidemoneybox\n\tspecial ChooseSendDaycareMon\n\twaitstate\n\tshowmoneybox 0, 0\n\tgoto_if_ge VAR_0x8004, PARTY_SIZE, Route5_PokemonDayCare_EventScript_ComeAgain\n\tspecialvar VAR_RESULT, CountPartyAliveNonEggMons_IgnoreVar0x8004Slot\n\tgoto_if_eq VAR_RESULT, 0, Route5_PokemonDayCare_EventScript_OnlyOneAliveMonInParty\n\tspecialvar VAR_0x8005, GetSelectedMonNicknameAndSpecies\n\tmsgbox Route5_PokemonDayCare_Text_LookAfterMonForAWhile\n\twaitse\n\tplaymoncry VAR_0x8005, CRY_MODE_NORMAL\n\tmsgbox Route5_PokemonDayCare_Text_ComeSeeMeInAWhile\n\twaitmoncry\n\tspecial PutMonInRoute5Daycare\n\tincrementgamestat GAME_STAT_USED_DAYCARE\n\tgoto Route5_PokemonDayCare_EventScript_CloseMoneyBox\n\tend\n\nRoute5_PokemonDayCare_EventScript_ComeAgain::\n\tmsgbox Route5_PokemonDayCare_Text_ComeAnytimeYouLike\n\tgoto Route5_PokemonDayCare_EventScript_CloseMoneyBox\n\tend\n\nRoute5_PokemonDayCare_EventScript_OnlyOneMonInParty::\n\tmsgbox Route5_PokemonDayCare_Text_OnlyHaveOneMonWithYou\n\tgoto Route5_PokemonDayCare_EventScript_CloseMoneyBox\n\tend\n\nRoute5_PokemonDayCare_EventScript_OnlyOneAliveMonInParty::\n\tmsgbox Route5_PokemonDayCare_Text_WhatWillYouBattleWith\n\tgoto Route5_PokemonDayCare_EventScript_CloseMoneyBox\n\tend\n\nRoute5_PokemonDayCare_EventScript_CheckOnMon::\n\tsetvar VAR_0x8004, 0\n\tspecialvar VAR_RESULT, GetNumLevelsGainedForRoute5DaycareMon\n\tcall_if_ne VAR_RESULT, 0, Route5_PokemonDayCare_EventScript_MonHasGrownByXLevels\n\tcall_if_eq VAR_RESULT, 0, Route5_PokemonDayCare_EventScript_NotEnoughTime\n\tspecial GetCostToWithdrawRoute5DaycareMon\n\tmsgbox Route5_PokemonDayCare_Text_OweMeXForMonsReturn, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, Route5_PokemonDayCare_EventScript_TryRetrieveMon\n\tgoto Route5_PokemonDayCare_EventScript_ComeAgain\n\tend\n\nRoute5_PokemonDayCare_EventScript_MonHasGrownByXLevels::\n\tcallnative GetStartingLevelOfRoute5DaycareMon\n\tmsgbox Route5_PokemonDayCare_Text_MonHasGrownByXLevels\n\treturn\n\nRoute5_PokemonDayCare_EventScript_NotEnoughTime::\n\tmsgbox Route5_PokemonDayCare_Text_MonNeedsToSpendMoreTime\n\treturn\n\nRoute5_PokemonDayCare_EventScript_TryRetrieveMon::\n\tspecialvar VAR_RESULT, CalculatePlayerPartyCount\n\tgoto_if_eq VAR_RESULT, PARTY_SIZE, Route5_PokemonDayCare_EventScript_NoRoomInParty\nRoute5_PokemonDayCare_EventScript_TryRetrieveMon_Continue::\n\tspecialvar VAR_RESULT, IsEnoughForCostInVar0x8005\n\tgoto_if_eq VAR_RESULT, TRUE, Route5_PokemonDayCare_EventScript_RetrieveMon\n\tmsgbox Route5_PokemonDayCare_Text_DontHaveEnoughMoney\n\tgoto Route5_PokemonDayCare_EventScript_CloseMoneyBox\n\tend\n\nRoute5_PokemonDayCare_EventScript_RetrieveMon::\n\tsetvar VAR_0x8004, 0\n\tspecialvar VAR_RESULT, TakePokemonFromRoute5Daycare\n\tcompare VAR_RESULT, 9999 //boxes full\n\tgoto_if_eq Route5_PokemonDayCare_EventScript_StorageAndPartyFull\n\tspecial SubtractMoneyFromVar0x8005\n\tupdatemoneybox\n\tcopyvar VAR_0x8008, VAR_RESULT\n\tgetpartysize\n\tsubvar VAR_RESULT, 1\n\t@bufferpartymonnick STR_VAR_1, VAR_RESULT @ done by TakePokemonFromRoute5Daycare into STR_VAR_1\n\tcopyvar VAR_RESULT, VAR_0x8008\n\tmsgbox Route5_PokemonDayCare_Text_ThankYouHeresMon\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\twaitse\n\tplaymoncry VAR_RESULT, CRY_MODE_NORMAL\n\tmsgbox Route5_PokemonDayCare_Text_PlayerGotMonBack\n\twaitmoncry\n\tcompare VAR_MON_BOX_ID, 9999 //not sent to box\n\tcall_if_ne Route5_PokemonDayCare_EventScript_SentToBoxNum\n\tcall EventScript_RestorePrevTextColor\n\tgoto Route5_PokemonDayCare_EventScript_CloseMoneyBox\n\tend\n\nRoute5_PokemonDayCare_EventScript_NoRoomInParty::\n\tcallnative CheckDaycareMonsHaveMail\n\tgoto_if_ne VAR_RESULT, TRUE, Route5_PokemonDayCare_EventScript_TryRetrieveMon_Continue @ this mon has mail\nRoute5_PokemonDayCare_EventScript_StorageAndPartyFull::\n\tmsgbox Route5_PokemonDayCare_Text_YouveGotNoRoomForIt\n\tgoto Route5_PokemonDayCare_EventScript_CloseMoneyBox\n\tend\n\nRoute5_PokemonDayCare_EventScript_SentToBoxNum::\n\tcopyvar VAR_TEMP_1, VAR_RESULT\n\tcall EventScript_TransferredToPC_Nickname\n\treturn\n\nEventScript_TransferredToPC_Nickname::\n\tbufferboxname STR_VAR_1, VAR_PC_BOX_TO_SEND_MON\n\tcall_if_unset FLAG_SYS_NOT_SOMEONES_PC, EventScript_TransferredSomeonesPC\n\tcall_if_set FLAG_SYS_NOT_SOMEONES_PC, EventScript_TransferredBillsPC\n\treturn\n\nRoute5_PokemonDayCare_EventScript_CloseMoneyBox::\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_EggHatch::\n\tlockall\n\tmsgbox DayCare_Text_Huh\n\tspecial EggHatch\n\twaitstate\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/scripts/fame_checker.inc",
    "content": "ViridianCity_School_EventScript_PokemonJournal::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_OAK, 3\n\tfamechecker FAMECHECKER_DAISY, 3\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureProfOak\n\trelease\n\tend\n\nEventScript_PokemonJournalUnused1::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_DAISY, 1\n\tfamechecker FAMECHECKER_OAK, 4\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureProfOak\n\trelease\n\tend\n\nEventScript_PokemonJournalUnused2::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_DAISY, 4\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureProfOak\n\trelease\n\tend\n\nFourIsland_PokemonCenter_1F_EventScript_PokemonJournal::\n\tlockall\n\tfamechecker FAMECHECKER_DAISY, 5\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureDaisyOak\n\treleaseall\n\tend\n\nRoute4_EventScript_Boy::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_BROCK, 3\n\tmsgbox Route4_Text_PeopleLikeAndRespectBrock\n\trelease\n\tend\n\nMtMoon_1F_EventScript_BaldingMan::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_BROCK, 4\n\tmsgbox MtMoon_1F_Text_BrockHelpsExcavateFossils\n\trelease\n\tend\n\nPewterCity_Museum_1F_EventScript_PokemonJournalBrock::\n\tlockall\n\tfamechecker FAMECHECKER_BROCK, 5\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureBrock\n\treleaseall\n\tend\n\nRoute20_EventScript_Camper::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_MISTY, 3\n\tmsgbox Route20_Text_MistyTrainsHere\n\trelease\n\tend\n\nRoute25_EventScript_Beauty::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_MISTY, 4\n\tmsgbox Route25_Text_MistyHighHopesAboutThisPlace\n\trelease\n\tend\n\nCeruleanCity_PokemonCenter_1F_EventScript_PokemonJournalMisty::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_MISTY, 5\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureMisty\n\trelease\n\tend\n\nVermilionCity_PokemonCenter_1F_EventScript_PokemonJournalLtSurge::\n\tlockall\n\tfamechecker FAMECHECKER_LTSURGE, 5\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureLtSurge\n\treleaseall\n\tend\n\nCeladonCity_Condominiums_2F_EventScript_PokemonJournalErika::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_ERIKA, 5\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureErika\n\trelease\n\tend\n\nFuchsiaCity_WardensHouse_EventScript_PokemonJournalKoga::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_KOGA, 4\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureKoga\n\trelease\n\tend\n\nSafariZone_North_RestHouse_EventScript_BaldingMan::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_KOGA, 5\n\tmsgbox SafariZone_West_Text_KogaPatrolsSafariEverySoOften\n\trelease\n\tend\n\nSaffronCity_PokemonCenter_1F_EventScript_PokemonJournalSabrina::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_SABRINA, 4\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureSabrina\n\trelease\n\tend\n\nCinnabarIsland_Gym_EventScript_BlaineFujiPhoto::\n\tlockall\n\tfamechecker FAMECHECKER_BLAINE, 4\n\tfamechecker FAMECHECKER_MRFUJI, 4\n\tmsgbox CinnabarIsland_Gym_Text_PhotoOfBlaineAndFuji\n\treleaseall\n\tend\n\nFiveIsland_ResortGorgeous_House_EventScript_PokemonJournal::\n\tlockall\n\tfamechecker FAMECHECKER_BLAINE, 5\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureBlaine\n\treleaseall\n\tend\n\nFourIsland_Mart_EventScript_OldMan::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_LORELEI, 2\n\tmsgbox FourIsland_Mart_Text_LoreleiGrewUpOnThisIsland\n\trelease\n\tend\n\nFiveIsland_PokemonCenter_1F_EventScript_PokemonJournal::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_LORELEI, 3\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureLorelei\n\trelease\n\tend\n\nSaffronCity_PokemonTrainerFanClub_EventScript_PokemonJournalBruno::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_BRUNO, 2\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureBruno\n\trelease\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_BlackBelt::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_BRUNO, 5\n\tmsgbox SevenIsland_SevaultCanyon_Text_BrunoTrainedWithBrawly\n\trelease\n\tend\n\nIndigoPlateau_PokemonCenter_1F_EventScript_BlackBelt::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_AGATHA, 1\n\tfamechecker FAMECHECKER_AGATHA, 2\n\tmsgbox IndigoPlateau_PokemonCenter_1F_Text_AgathaWhuppedUs\n\trelease\n\tend\n\nSevenIsland_PokemonCenter_1F_EventScript_PokemonJournal::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_AGATHA, 3\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureAgatha\n\trelease\n\tend\n\nSixIsland_Mart_EventScript_OldWoman::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_AGATHA, 5\n\tmsgbox SixIsland_Mart_Text_AgathaOldestEverEliteFourMember\n\trelease\n\tend\n\nEventScript_LanceUnused::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_LANCE, 0\n\tmsgbox gFameCheckerFlavorText_Lance0\n\trelease\n\tend\n\nSaffronCity_EventScript_BattleGirlUnused::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_LANCE, 1\n\tmsgbox SaffronCity_Text_HowCanClubNotRecognizeLance\n\trelease\n\tend\n\nSaffronCity_EventScript_BattleGirl::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_LANCE, 2\n\tmsgbox SaffronCity_Text_HowCanClubNotRecognizeLance\n\trelease\n\tend\n\nCeladonCity_DepartmentStore_2F_EventScript_Woman::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_LANCE, 3\n\tmsgbox CeladonCity_DepartmentStore_2F_Text_LanceComesToBuyCapes\n\trelease\n\tend\n\nIndigoPlateau_PokemonCenter_1F_EventScript_PokemonJournal::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_LANCE, 4\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureLance\n\trelease\n\tend\n\nIndigoPlateau_PokemonCenter_1F_EventScript_CooltrainerM::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_LANCE, 5\n\tmsgbox IndigoPlateau_PokemonCenter_1F_Text_LancesCousinGymLeaderFarAway\n\trelease\n\tend\n\nLavenderTown_PokemonCenter_1F_EventScript_BaldingMan::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_MRFUJI, 3\n\tmsgbox LavenderTown_PokemonCenter_1F_Text_HearMrFujiNotFromAroundHere\n\trelease\n\tend\n\nCinnabarIsland_PokemonCenter_1F_EventScript_PokemonJournalMrFuji::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_MRFUJI, 5\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox PokemonJournal_Text_SpecialFeatureMrFuji\n\trelease\n\tend\n\nSilphCo_5F_EventScript_Scientist::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_GIOVANNI, 1\n\tmsgbox SilphCo_5F_Text_RocketBossLookingForStrongMons\n\trelease\n\tend\n\nSilphCo_8F_EventScript_Scientist::\n\tlock\n\tfaceplayer\n\tfamechecker FAMECHECKER_GIOVANNI, 2\n\tmsgbox SilphCo_8F_Text_ToRocketBossMonsAreTools\n\trelease\n\tend\n"
  },
  {
    "path": "data/scripts/field_moves.inc",
    "content": "EventScript_CutTree::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlockall\n\tgoto_if_unset FLAG_BADGE02_GET, EventScript_CantCutTree\n\tcheckpartymove MOVE_CUT\n\tgoto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantCutTree\n\tsetfieldeffectargument 0, VAR_RESULT\n\tbufferpartymonnick STR_VAR_1, VAR_RESULT\n\tbuffermovename STR_VAR_2, MOVE_CUT\n\tmsgbox Text_CutTreeDown, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_DontCutTree\n\tmsgbox Text_MonUsedMove\n\tclosemessage\n\tdofieldeffect FLDEFF_USE_CUT_ON_TREE\n\twaitstate\n\tgoto EventScript_CutTreeDown\n\tend\n\nEventScript_FldEffCut::\n\tlockall\n\tdofieldeffect FLDEFF_USE_CUT_ON_TREE\n\twaitstate\n\tgoto EventScript_CutTreeDown\n\tend\n\nEventScript_CutTreeDown::\n\tapplymovement VAR_LAST_TALKED, Movement_CutTreeDown\n\twaitmovement 0\n\tremoveobject VAR_LAST_TALKED\n\treleaseall\n\tend\n\nMovement_CutTreeDown::\n\tcut_tree\n\tstep_end\n\nEventScript_CantCutTree::\n\tmsgbox Text_TreeCanBeCutDown, MSGBOX_SIGN\n\treleaseall\n\tend\n\nEventScript_DontCutTree::\n\tclosemessage\n\treleaseall\n\tend\n\nText_CutTreeDown::\n\t.string \"This tree looks like it can be CUT\\n\"\n\t.string \"down!\\p\"\n\t.string \"Would you like to CUT it?$\"\n\nText_MonUsedMove::\n\t.string \"{STR_VAR_1} used {STR_VAR_2}!$\"\n\nText_TreeCanBeCutDown::\n\t.string \"This tree looks like it can be CUT\\n\"\n\t.string \"down!$\"\n\nEventScript_RockSmash::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlockall\n\tgoto_if_unset FLAG_BADGE06_GET, EventScript_CantSmashRock\n\tcheckpartymove MOVE_ROCK_SMASH\n\tgoto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantSmashRock\n\tsetfieldeffectargument 0, VAR_RESULT\n\tbufferpartymonnick STR_VAR_1, VAR_RESULT\n\tbuffermovename STR_VAR_2, MOVE_ROCK_SMASH\n\tmsgbox Text_UseRockSmash, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_DontSmashRock\n\tmsgbox Text_MonUsedMove\n\tclosemessage\n\tdofieldeffect FLDEFF_USE_ROCK_SMASH\n\twaitstate\n\tgoto EventScript_UseRockSmash\n\tend\n\nEventScript_FldEffRockSmash::\n\tlockall\n\tdofieldeffect FLDEFF_USE_ROCK_SMASH\n\twaitstate\n\tgoto EventScript_UseRockSmash\n\tend\n\nEventScript_UseRockSmash::\n\tapplymovement VAR_LAST_TALKED, Movement_BreakRock\n\twaitmovement 0\n\tremoveobject VAR_LAST_TALKED\n\tspecial RockSmashWildEncounter\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_RockSmashNoEncounter\n\twaitstate\n\treleaseall\n\tend\n\nEventScript_RockSmashNoEncounter::\n\treleaseall\n\tend\n\nMovement_BreakRock::\n\trock_smash_break\n\tstep_end\n\nEventScript_CantSmashRock::\n\tmsgbox Text_MonMaySmashRock, MSGBOX_SIGN\n\tend\n\nEventScript_DontSmashRock::\n\tclosemessage\n\treleaseall\n\tend\n\nText_UseRockSmash::\n\t.string \"This rock appears to be breakable.\\n\"\n\t.string \"Would you like to use ROCK SMASH?$\"\n\nText_MonMaySmashRock::\n\t.string \"It's a rugged rock, but a POKéMON\\n\"\n\t.string \"may be able to smash it.$\"\n\nEventScript_StrengthBoulder::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlockall\n\tgoto_if_unset FLAG_BADGE04_GET, EventScript_CantMoveBoulder\n\tgoto_if_set FLAG_SYS_USE_STRENGTH, EventScript_AlreadyUsedStrength\n\tcheckpartymove MOVE_STRENGTH\n\tgoto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantMoveBoulder\n\tsetfieldeffectargument 0, VAR_RESULT\n\tmsgbox Text_UseStrength, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_DontUseStrength\n\tclosemessage\n\tdofieldeffect FLDEFF_USE_STRENGTH\n\twaitstate\n\tgoto EventScript_UseStrength\n\tend\n\nEventScript_FldEffStrength::\n\tlockall\n\tdofieldeffect FLDEFF_USE_STRENGTH\n\twaitstate\n\tgoto EventScript_UseStrength\n\tend\n\nEventScript_UseStrength::\n\tsetflag FLAG_SYS_USE_STRENGTH\n\tmsgbox Text_MonUsedStrengthCanMoveBoulders, MSGBOX_SIGN\n\tend\n\nEventScript_CantMoveBoulder::\n\tmsgbox Text_MonMayPushBoulder, MSGBOX_SIGN\n\tend\n\nEventScript_AlreadyUsedStrength::\n\tmsgbox Text_StrengthMadeMovingBouldersPossible, MSGBOX_SIGN\n\tend\n\nEventScript_DontUseStrength::\n\tclosemessage\n\treleaseall\n\tend\n\nText_UseStrength::\n\t.string \"It's a big boulder, but a POKéMON\\n\"\n\t.string \"may be able to push it aside.\\p\"\n\t.string \"Would you like to use STRENGTH?$\"\n\nText_MonUsedStrengthCanMoveBoulders::\n\t.string \"{STR_VAR_1} used STRENGTH!\\p\"\n\t.string \"{STR_VAR_1}'s STRENGTH made it\\n\"\n\t.string \"possible to move boulders around!$\"\n\nText_MonMayPushBoulder::\n\t.string \"It's a big boulder, but a POKéMON\\n\"\n\t.string \"may be able to push it aside.$\"\n\nText_StrengthMadeMovingBouldersPossible::\n\t.string \"STRENGTH made it possible to move\\n\"\n\t.string \"boulders around.$\"\n\nEventScript_Waterfall::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlockall\n\tcheckpartymove MOVE_WATERFALL\n\tgoto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_WaterCrashingDown\n\tbufferpartymonnick STR_VAR_1, VAR_RESULT\n\tsetfieldeffectargument 0, VAR_RESULT\n\tmsgbox Text_UseWaterfall, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_EndWaterfall\n\tmsgbox Text_MonUsedWaterfall\n\tdofieldeffect FLDEFF_USE_WATERFALL\n\tgoto EventScript_EndWaterfall\n\nEventScript_CantUseWaterfall::\n\tlockall\nEventScript_WaterCrashingDown:\n\tmsgbox Text_WallOfWaterCrashingDown\nEventScript_EndWaterfall:\n\treleaseall\n\tend\n\nText_WallOfWaterCrashingDown::\n\t.string \"A wall of water is crashing down\\n\"\n\t.string \"with a mighty roar.$\"\n\nText_UseWaterfall::\n\t.string \"It's a large waterfall.\\n\"\n\t.string \"Would you like to use WATERFALL?$\"\n\nText_MonUsedWaterfall::\n\t.string \"{STR_VAR_1} used WATERFALL.$\"\n\nEventScript_DeepWater::\n\tlockall\n\tcheckpartymove MOVE_DIVE\n\tgoto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_MayGoUnderwater\n\tbufferpartymonnick STR_VAR_1, VAR_RESULT\n\tsetfieldeffectargument 0, VAR_RESULT\n\tsetfieldeffectargument 1, 1\n\tmsgbox Text_SeaIsDeepUseDive, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_EndDive\n\tmsgbox Text_MonUsedDive\n\tdofieldeffect FLDEFF_USE_DIVE\n\tgoto EventScript_EndDive\n\tend\n\nEventScript_CantDive::\n\tlockall\nEventScript_MayGoUnderwater:\n\tmsgbox Text_MonMayGoUnderwater\nEventScript_EndDive:\n\treleaseall\n\tend\n\nEventScript_TrySurface::\n\tlockall\n\tcheckpartymove MOVE_DIVE\n\tgoto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantSurface\n\tbufferpartymonnick STR_VAR_1, VAR_RESULT\n\tsetfieldeffectargument 0, VAR_RESULT\n\tsetfieldeffectargument 1, 1\n\tmsgbox Text_LightFilteringUseDive, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_EndSurface\n\tmsgbox Text_MonUsedDive\n\tdofieldeffect FLDEFF_USE_DIVE\n\tgoto EventScript_EndSurface\n\tend\n\nEventScript_CantSurface::\n\tlockall\n\tmsgbox Text_MonMaySurface, MSGBOX_DEFAULT\n\tgoto EventScript_EndSurface\n\tend\n\nEventScript_ObstacleCantSurface::\n\tlockall\n\tmsgbox Text_DiveCantBeUsedHere\nEventScript_EndSurface:\n\treleaseall\n\tend\n\nText_MonMayGoUnderwater::\n\t.string \"The sea is deep here. A POKéMON\\n\"\n\t.string \"may be able to go underwater.$\"\n\nText_SeaIsDeepUseDive::\n\t.string \"The sea is deep here.\\n\"\n\t.string \"Would you like to use DIVE?$\"\n\nText_MonUsedDive::\n\t.string \"{STR_VAR_1} used DIVE.$\"\n\nText_MonMaySurface::\n\t.string \"Light is filtering down from above.\\n\"\n\t.string \"A POKéMON may be able to surface.$\"\n\nText_LightFilteringUseDive::\n\t.string \"Light is filtering down from above.\\n\"\n\t.string \"Would you like to use DIVE?$\"\n\nText_DiveCantBeUsedHere::\n\t.string \"There is an obstacle above.\\n\"\n\t.string \"DIVE can't be used here.$\"\n\nEventScript_FailSweetScent::\n\tmsgbox Text_LooksLikeNothingHere, MSGBOX_SIGN\n\tend\n\nText_LooksLikeNothingHere::\n\t.string \"Looks like there's nothing here…$\"\n    \nEventScript_EnableAutoRun::\n    msgbox AutoRunEnabled MSGBOX_SIGN\n    end\nAutoRunEnabled:\n    .string \"Pressing R toggles running by default.\\nAuto running is now enabled.$\""
  },
  {
    "path": "data/scripts/flash.inc",
    "content": "EventScript_FldEffFlash::\n\tanimateflash 0\n\tsetflashlevel 0\n\tend\n"
  },
  {
    "path": "data/scripts/flavor_text.inc",
    "content": "@ Flavor text for interacting with various background objects\n\nEventScript_Bookshelf::\n\tmsgbox Text_Bookshelf, MSGBOX_SIGN\n\tend\n\nEventScript_PokeMartShelf::\n\tmsgbox Text_PokeMartShelf, MSGBOX_SIGN\n\tend\n\nEventScript_Food::\n\tmsgbox Text_Food, MSGBOX_SIGN\n\tend\n\nEventScript_VideoGame::\n\tmsgbox Text_VideoGame, MSGBOX_SIGN\n\tend\n\nEventScript_Computer::\n\tmsgbox Text_Computer, MSGBOX_SIGN\n\tend\n\nEventScript_ImpressiveMachine::\n\tmsgbox Text_ImpressiveMachine, MSGBOX_SIGN\n\tend\n\nEventScript_Blueprints::\n\tmsgbox Text_Blueprints, MSGBOX_SIGN\n\tend\n\nEventScript_Burglary::\n\tmsgbox Text_Burglary, MSGBOX_SIGN\n\tend\n\nEventScript_PlayerFacingTVScreen::\n\tmsgbox Text_PlayerFacingTVScreen, MSGBOX_SIGN\n\tend\n\nEventScript_Cabinet::\n\tmsgbox Text_DishesPlatesNeatlyLinedUp, MSGBOX_SIGN\n\tend\n\nEventScript_Kitchen::\n\tmsgbox Text_Kitchen, MSGBOX_SIGN\n\tend\n\nEventScript_Dresser::\n\tmsgbox Text_Dresser, MSGBOX_SIGN\n\tend\n\nEventScript_Snacks::\n\tmsgbox Text_Snacks, MSGBOX_SIGN\n\tend\n\nEventScript_Painting::\n\tmsgbox Text_Painting, MSGBOX_SIGN\n\tend\n\nEventScript_PowerPlantMachine::\n\tmsgbox Text_PowerPlantMachine, MSGBOX_SIGN\n\tend\n\nEventScript_Telephone::\n\tmsgbox Text_Telephone, MSGBOX_SIGN\n\tend\n\nEventScript_AdvertisingPoster::\n\tmsgbox Text_AdvertisingPoster, MSGBOX_SIGN\n\tend\n\nEventScript_TastyFood::\n\tmsgbox Text_TastyFood, MSGBOX_SIGN\n\tend\n\nEventScript_TrashBin::\n\tmsgbox Text_TrashBin, MSGBOX_SIGN\n\tend\n\nEventScript_Cup::\n\tmsgbox Text_Cup, MSGBOX_SIGN\n\tend\n\nEventScript_PolishedWindow::\n\tmsgbox Text_PolishedWindow, MSGBOX_SIGN\n\tend\n\nEventScript_BeautifulSkyWindow::\n\tmsgbox Text_BeautifulSkyWindow, MSGBOX_SIGN\n\tend\n\nEventScript_BlinkingLights::\n\tmsgbox Text_BlinkingLights, MSGBOX_SIGN\n\tend\n\nEventScript_NeatlyLinedUpTools::\n\tmsgbox Text_NeatlyLinedUpTools, MSGBOX_SIGN\n\tend\n\nEventScript_PokemartSign::\n\tmsgbox Text_PokemartSign, MSGBOX_SIGN\n\tend\n\nEventScript_PokecenterSign::\n\tmsgbox Text_PokecenterSign, MSGBOX_SIGN\n\tend\n\nEventScript_Indigo_UltimateGoal::\n\tmsgbox Text_Indigo_UltimateGoal, MSGBOX_SIGN\n\tend\n\nEventScript_Indigo_HighestAuthority::\n\tmsgbox Text_Indigo_HighestAuthority, MSGBOX_SIGN\n\tend\n\nEventScript_SafariZone_ExtensionSign::\n\tmsgbox Text_SafariZone_ExtensionSign, MSGBOX_SIGN\n\tend\n\nText_SafariZone_ExtensionSign::\n\t.string \"The SAFARI ZONE's expansion project\\n\"\n\t.string \"is finally complete!\\p\"\n\t.string \"The new AREA 4 is straight ahead!$\"\n"
  },
  {
    "path": "data/scripts/fuji_event.inc",
    "content": "EventScript_FujiOutside::\n\tlock\n\tfaceplayer\n\tmsgbox EventScript_FujiOutside_Text_0, MSGBOX_YESNO\nEventScript_FujiOutside_2:\n\tcompare VAR_RESULT, NO\n\tgoto_if_eq EventScript_FujiOutside_3\n\tmsgbox EventScript_FujiOutside_Text_2, MSGBOX_DEFAULT\n\tcheckitemspace ITEM_OLD_SEA_MAP, 1\n\tcompare VAR_RESULT, FALSE\n\tgoto_if_eq EventScript_FujiOutside_6\n\tgiveitem_msg EventScript_FujiOutside_Text_3, ITEM_OLD_SEA_MAP, 1, MUS_OBTAIN_KEY_ITEM\n\tsetflag FLAG_RECEIVED_OLD_SEA_MAP\n\tmsgbox EventScript_FujiOutside_Text_4, MSGBOX_NPC\n\tgetplayerxy VAR_RESULT, VAR_0x8003\n\tcompare VAR_RESULT, 9\n\tgoto_if_ne EventScript_FujiOutside_9\n\tapplymovement 4, Movement_FujiToHouseAroundPlayer\n\twaitmovement 0\nEventScript_FujiOutside_8:\n\topendoor 10, 11\n\twaitdooranim\n\tapplymovement 4, PalletTown_Movement_OakEnterLab\n\twaitmovement 0\n\tclosedoor 10, 11\n\twaitdooranim\n\tsetflag FLAG_HIDE_LAVENDER_OUTSIDE_FUJI\n\tclearflag FLAG_HIDE_POKEHOUSE_FUJI\n\trelease\n\tend\n\nEventScript_FujiOutside_3:\n\tmsgbox EventScript_FujiOutside_Text_1, MSGBOX_YESNO\n\tgoto EventScript_FujiOutside_2\n\nEventScript_FujiOutside_6:\n\tmsgbox LavenderTown_VolunteerPokemonHouse_Text_MustMakeRoomForThis, MSGBOX_DEFAULT\n\trelease\n\tend\n\nEventScript_FujiOutside_9:\n\tapplymovement 4, Movement_FujiToHouse\n\twaitmovement 0\n\tgoto EventScript_FujiOutside_8\n\n\nMovement_FujiToHouse:\n\twalk_right\n\twalk_right\n\tface_up\n\tstep_end\n\nMovement_FujiToHouseAroundPlayer:\n\twalk_down\n\twalk_right\n\twalk_right\n\twalk_up\n\tstep_end\n\nEventScript_FujiOutside_Text_0:\n\t.string \"MR. FUJI: {PLAYER}!\\nHow is your quest going?\\pAh, you and your POKéMON are\\nthe POKéMON LEAGUE CHAMPIONS!\\pCongratulations!\\nYour deep love for your POKéMON\\lis obvious to anyone.\\pI have a favor to ask.\\pThere is an island far from KANTO\\nwhere a certain POKéMON lives.\\pThat POKéMON was mistreated by\\nhumans in the past.\\pI was hoping you would befriend\\nthat POKéMON and show it that\\lhumans can be kind and gentle.\\pWill you do this for me?$\"\n\nEventScript_FujiOutside_Text_1:\n\t.string \"Helping this POKéMON is very\\nimportant to me, {PLAYER}.\\pPlease tell me you'll help.$\"\n\nEventScript_FujiOutside_Text_2:\n\t.string \"MR. FUJI: Thank you, {PLAYER}.\\pI have an old map to the island.\\nI'm sure you've befriended a sailor\\lor two during your quest.\\pThey will be able to read this\\nmap and take you there.$\"\n\nEventScript_FujiOutside_Text_3:\n\t.string \"{PLAYER} received an OLD SEA MAP\\nfrom MR. FUJI.$\"\n\nEventScript_FujiOutside_Text_4:\n\t.string \"MR. FUJI: I know you will treat that\\nPOKéMON with love and kindness.\\pThank you, {PLAYER}.$\"\n"
  },
  {
    "path": "data/scripts/fuji_event.pory",
    "content": "script EventScript_FujiOutside{\n    lock\n    faceplayer\n    msgbox(\"MR. FUJI: {PLAYER}!\\nHow is your quest going?\\pAh, you and your POKéMON are\\nthe POKéMON LEAGUE CHAMPIONS!\\pCongratulations!\\nYour deep love for your POKéMON\\lis obvious to anyone.\\pI have a favor to ask.\\pThere is an island far from KANTO\\nwhere a certain POKéMON lives.\\pThat POKéMON was mistreated by\\nhumans in the past.\\pI was hoping you would befriend\\nthat POKéMON and show it that\\lhumans can be kind and gentle.\\pWill you do this for me?\", MSGBOX_YESNO)\n    while(var(VAR_RESULT) == NO)\n    {\n        msgbox(\"Helping this POKéMON is very\\nimportant to me, {PLAYER}.\\pPlease tell me you'll help.\", MSGBOX_YESNO)\n    }\n    msgbox(\"MR. FUJI: Thank you, {PLAYER}.\\pI have an old map to the island.\\nI'm sure you've befriended a sailor\\lor two during your quest.\\pThey will be able to read this\\nmap and take you there.\", MSGBOX_DEFAULT)\n    checkitemspace(ITEM_OLD_SEA_MAP, 1)\n    if(var(VAR_RESULT) == FALSE)\n    {\n        msgbox(LavenderTown_VolunteerPokemonHouse_Text_MustMakeRoomForThis, MSGBOX_DEFAULT)\n        release\n        end\n    }\n    giveitem_msg(\"{PLAYER} received an OLD SEA MAP\\nfrom MR. FUJI.$\", ITEM_OLD_SEA_MAP, 1, MUS_OBTAIN_KEY_ITEM)\n    setflag(FLAG_RECEIVED_OLD_SEA_MAP)\n    msgbox(\"MR. FUJI: I know you will treat that\\nPOKéMON with love and kindness.\\pThank you, {PLAYER}.\", MSGBOX_NPC)\n    getplayerxy(VAR_RESULT, VAR_0x8003)\n    if(var(VAR_RESULT) != 9)\n    {\n        applymovement(4, Movement_FujiToHouse)\n        waitmovement(0)\n    }\n    else\n    {\n        applymovement(4, Movement_FujiToHouseAroundPlayer)\n        waitmovement(0)\n    }\n    opendoor(10, 11)\n    waitdooranim\n    applymovement(4, PalletTown_Movement_OakEnterLab)\n    waitmovement(0)\n    closedoor(10, 11)\n\twaitdooranim\n    setflag(FLAG_HIDE_LAVENDER_OUTSIDE_FUJI)\n    clearflag(FLAG_HIDE_POKEHOUSE_FUJI)\n    release\n    end\n}\n\nmovement Movement_FujiToHouse {\n    walk_right * 2\n    face_up\n}\n\nmovement Movement_FujiToHouseAroundPlayer {\n    walk_down\n    walk_right * 2\n    walk_up\n}"
  },
  {
    "path": "data/scripts/hall_of_fame.inc",
    "content": "EventScript_SetDefeatedEliteFourFlagsVars::\n\tclearflag FLAG_HIDE_MASTER_TRAINERS\n\tclearflag FLAG_HIDE_POSTGAME_GOSSIPERS\n\tcall EventScript_ResetEliteFour\n\tspecial Script_UpdateTrainerFanClubGameClear\n\tcall_if_unset FLAG_SYS_RECEIVED_EXTENDED_DEX, EventScript_SetReadyTryGiveNationalDexScene\n\tcall EventScript_ResetLegendaries\n\treturn\n\nEventScript_SetReadyTryGiveNationalDexScene::\n\tsetvar VAR_MAP_SCENE_PALLET_TOWN_OAK, 2\n\treturn\n\nEventScript_ResetLegendaries::\n\tclearflag FLAG_LUGIA_FLEW_AWAY\n\tclearflag FLAG_HO_OH_FLEW_AWAY\n\tclearflag FLAG_DEOXYS_FLEW_AWAY\n\tclearflag FLAG_MEW_FLEW_AWAY\n\tclearflag FLAG_MEWTWO_FLEW_AWAY\n\tclearflag FLAG_ARTICUNO_FLEW_AWAY\n\tclearflag FLAG_ZAPDOS_FLEW_AWAY\n\tclearflag FLAG_MOLTRES_FLEW_AWAY\n\tclearflag FLAG_ROUTE_12_SNORLAX_RETURNED_TO_MOUNTAINS\n\tclearflag FLAG_ROUTE_16_SNORLAX_RETURNED_TO_MOUNTAINS\n\tclearflag FLAG_DEFEATED_LATIOS\n\tclearflag FLAG_DEFEATED_LATIAS\n\tclearflag FLAG_DEFEATED_SUDOWOODO\n\tspecial InitRoamer\n\treturn\n\nEventScript_ResetEliteFourEnd::\n\tcall EventScript_ResetEliteFour\n\tend\n\nEventScript_ResetEliteFour::\n\tclearflag FLAG_DEFEATED_LORELEI\n\tclearflag FLAG_DEFEATED_BRUNO\n\tclearflag FLAG_DEFEATED_AGATHA\n\tclearflag FLAG_DEFEATED_LANCE\n\tclearflag FLAG_DEFEATED_CHAMP\n\tcleartrainerflag TRAINER_CHAMPION_FIRST_SQUIRTLE\n\tcleartrainerflag TRAINER_CHAMPION_FIRST_BULBASAUR\n\tcleartrainerflag TRAINER_CHAMPION_FIRST_CHARMANDER\n\tcleartrainerflag TRAINER_CHAMPION_REMATCH_SQUIRTLE\n\tcleartrainerflag TRAINER_CHAMPION_REMATCH_BULBASAUR\n\tcleartrainerflag TRAINER_CHAMPION_REMATCH_CHARMANDER\n\tsetvar VAR_MAP_SCENE_POKEMON_LEAGUE, 0\n\treturn\n"
  },
  {
    "path": "data/scripts/hole.inc",
    "content": "@ Unused\nEventScript_CheckFallDownHole::\n\tmap_script_2 VAR_ICE_STEP_COUNT, 0, EventScript_FallDownHole\n\t.2byte 0\n\n@ Unused\nEventScript_FixCrackedGround::\n\tcopyvar VAR_ICE_STEP_COUNT, 1\n\tend\n\nEventScript_FallDownHole::\n\tlockall\n\tdelay 20\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_SetInvisible\n\twaitmovement 0\n\tplayse SE_FALL\n\tdelay 60\n\twarphole MAP_UNDEFINED\n\twaitstate\n\tend\n\n@ Differs from the script above by assuming the warp destination has already been set\nEventScript_DoFallWarp::\n\tlockall\n\tdelay 20\n\tapplymovement OBJ_EVENT_ID_PLAYER, Movement_SetInvisible\n\twaitmovement 0\n\tplayse SE_FALL\n\tdelay 60\n\tspecial DoFallWarp\n\twaitstate\n\tend\n\nMovement_SetInvisible:\n\tset_invisible\n\tstep_end\n"
  },
  {
    "path": "data/scripts/item_ball_scripts.inc",
    "content": "Route2_EventScript_ItemEther::\n\tfinditem ITEM_ETHER\n\tend\n\nRoute2_EventScript_ItemParalyzeHeal::\n\tfinditem ITEM_PARALYZE_HEAL\n\tend\n\nViridianForest_EventScript_ItemPokeBall::\n\tfinditem ITEM_POKE_BALL\n\tend\n\nViridianForest_EventScript_ItemAntidote::\n\tfinditem ITEM_ANTIDOTE\n\tend\n\nViridianForest_EventScript_ItemPotion::\n\tfinditem ITEM_POTION\n\tend\n\nMtMoon_1F_EventScript_ItemParalyzeHeal::\n\tfinditem ITEM_PARALYZE_HEAL\n\tend\n\nMtMoon_1F_EventScript_ItemTM09::\n\tfinditem ITEM_TM09\n\tend\n\nMtMoon_1F_EventScript_ItemPotion::\n\tfinditem ITEM_POTION\n\tend\n\nMtMoon_1F_EventScript_ItemRareCandy::\n\tfinditem ITEM_RARE_CANDY\n\tend\n\nMtMoon_1F_EventScript_ItemEscapeRope::\n\tfinditem ITEM_ESCAPE_ROPE\n\tend\n\nMtMoon_1F_EventScript_ItemMoonStone::\n\tfinditem ITEM_MOON_STONE\n\tend\n\nMtMoon_B2F_EventScript_ItemStarPiece::\n\tfinditem ITEM_STAR_PIECE\n\tend\n\nMtMoon_B2F_EventScript_ItemTM46::\n\tfinditem ITEM_TM46\n\tend\n\nRoute4_EventScript_ItemTM05::\n\tfinditem ITEM_TM05\n\tend\n\nRoute24_EventScript_ItemTM45::\n\tfinditem ITEM_TM45\n\tend\n\nRoute25_EventScript_ItemTM43::\n\tfinditem ITEM_TM43\n\tend\n\nSSAnne_1F_Room2_EventScript_ItemTM31::\n\tfinditem ITEM_TM31\n\tend\n\nSSAnne_2F_Room2_EventScript_ItemStardust::\n\tfinditem ITEM_STARDUST\n\tend\n\nSSAnne_2F_Room4_EventScript_ItemXAttack::\n\tfinditem ITEM_X_ATTACK\n\tend\n\nSSAnne_B1F_Room2_EventScript_ItemTM44::\n\tfinditem ITEM_TM44\n\tend\n\nSSAnne_B1F_Room3_EventScript_ItemEther::\n\tfinditem ITEM_ETHER\n\tend\n\nSSAnne_B1F_Room5_EventScript_ItemSuperPotion::\n\tfinditem ITEM_SUPER_POTION\n\tend\n\nSSAnne_Kitchen_EventScript_ItemGreatBall::\n\tfinditem ITEM_GREAT_BALL\n\tend\n\nRoute9_EventScript_ItemTM40::\n\tfinditem ITEM_TM40\n\tend\n\nRocketHideout_B1F_EventScript_ItemEscapeRope::\n\tfinditem ITEM_ESCAPE_ROPE\n\tend\n\nRocketHideout_B1F_EventScript_ItemHyperPotion::\n\tfinditem ITEM_HYPER_POTION\n\tend\n\nRocketHideout_B2F_EventScript_ItemXSpeed::\n\tfinditem ITEM_X_SPEED\n\tend\n\nRocketHideout_B2F_EventScript_ItemMoonStone::\n\tfinditem ITEM_MOON_STONE\n\tend\n\nRocketHideout_B2F_EventScript_ItemTM12::\n\tfinditem ITEM_TM12\n\tend\n\nRocketHideout_B2F_EventScript_ItemSuperPotion::\n\tfinditem ITEM_SUPER_POTION\n\tend\n\nRocketHideout_B3F_EventScript_ItemRareCandy::\n\tfinditem ITEM_RARE_CANDY\n\tend\n\nRocketHideout_B3F_EventScript_ItemTM21::\n\tfinditem ITEM_TM21\n\tend\n\nRocketHideout_B4F_EventScript_ItemTM49::\n\tfinditem ITEM_TM49\n\tend\n\nRocketHideout_B4F_EventScript_ItemMaxEther::\n\tfinditem ITEM_MAX_ETHER\n\tend\n\nRocketHideout_B4F_EventScript_ItemCalcium::\n\tfinditem ITEM_CALCIUM\n\tend\n\nPokemonTower_3F_EventScript_ItemEscapeRope::\n\tfinditem ITEM_ESCAPE_ROPE\n\tend\n\nPokemonTower_4F_EventScript_ItemElixir::\n\tfinditem ITEM_ELIXIR\n\tend\n\nPokemonTower_4F_EventScript_ItemAwakening::\n\tfinditem ITEM_AWAKENING\n\tend\n\nPokemonTower_4F_EventScript_ItemGreatBall::\n\tfinditem ITEM_GREAT_BALL\n\tend\n\nPokemonTower_5F_EventScript_ItemNugget::\n\tfinditem ITEM_NUGGET\n\tend\n\nPokemonTower_6F_EventScript_ItemRareCandy::\n\tfinditem ITEM_RARE_CANDY\n\tend\n\nPokemonTower_6F_EventScript_ItemXAccuracy::\n\tfinditem ITEM_X_ACCURACY\n\tend\n\nRoute12_EventScript_ItemTM48::\n\tfinditem ITEM_TM48\n\tend\n\nRoute12_EventScript_ItemIron::\n\tfinditem ITEM_IRON\n\tend\n\nRoute15_EventScript_ItemTM18::\n\tfinditem ITEM_TM18\n\tend\n\nSafariZone_Center_EventScript_ItemNugget::\n\tfinditem ITEM_NUGGET\n\tend\n\nSafariZone_East_EventScript_ItemMaxPotion::\n\tfinditem ITEM_MAX_POTION\n\tend\n\nSafariZone_East_EventScript_ItemFullRestore::\n\tfinditem ITEM_FULL_RESTORE\n\tend\n\nSafariZone_East_EventScript_ItemTM11::\n\tfinditem ITEM_TM11\n\tend\n\nSafariZone_East_EventScript_ItemLeafStone::\n\tfinditem ITEM_LEAF_STONE\n\tend\n\nSafariZone_North_EventScript_ItemProtein::\n\tfinditem ITEM_PROTEIN\n\tend\n\nSafariZone_North_EventScript_ItemTM47::\n\tfinditem ITEM_TM47\n\tend\n\nSafariZone_West_EventScript_ItemTM32::\n\tfinditem ITEM_TM32\n\tend\n\nSafariZone_West_EventScript_ItemGoldTeeth::\n\tfinditem ITEM_GOLD_TEETH\n\tend\n\nSafariZone_West_EventScript_ItemMaxPotion::\n\tfinditem ITEM_MAX_POTION\n\tend\n\nSafariZone_West_EventScript_ItemMaxRevive::\n\tfinditem ITEM_MAX_REVIVE\n\tend\n\nSilphCo_3F_EventScript_ItemHyperPotion::\n\tfinditem ITEM_HYPER_POTION\n\tend\n\nSilphCo_4F_EventScript_ItemMaxRevive::\n\tfinditem ITEM_MAX_REVIVE\n\tend\n\nSilphCo_4F_EventScript_ItemEscapeRope::\n\tfinditem ITEM_ESCAPE_ROPE\n\tend\n\nSilphCo_4F_EventScript_ItemFullHeal::\n\tfinditem ITEM_FULL_HEAL\n\tend\n\nSilphCo_5F_EventScript_ItemProtein::\n\tfinditem ITEM_PROTEIN\n\tend\n\nSilphCo_5F_EventScript_ItemTM01::\n\tfinditem ITEM_TM01\n\tend\n\nSilphCo_5F_EventScript_ItemCardKey::\n\tfinditem ITEM_CARD_KEY\n\tend\n\nSilphCo_6F_EventScript_ItemHPUp::\n\tfinditem ITEM_HP_UP\n\tend\n\nSilphCo_6F_EventScript_ItemXSpecial::\n\tfinditem ITEM_X_SPECIAL\n\tend\n\nSilphCo_7F_EventScript_ItemCalcium::\n\tfinditem ITEM_CALCIUM\n\tend\n\nSilphCo_7F_EventScript_ItemTM08::\n\tfinditem ITEM_TM08\n\tend\n\nSilphCo_10F_EventScript_ItemCarbos::\n\tfinditem ITEM_CARBOS\n\tend\n\nSilphCo_10F_EventScript_ItemUltraBall::\n\tfinditem ITEM_ULTRA_BALL\n\tend\n\nSilphCo_10F_EventScript_ItemRareCandy::\n\tfinditem ITEM_RARE_CANDY\n\tend\n\nPowerPlant_EventScript_ItemMaxPotion::\n\tfinditem ITEM_MAX_POTION\n\tend\n\nPowerPlant_EventScript_ItemTM17::\n\tfinditem ITEM_TM17\n\tend\n\nPowerPlant_EventScript_ItemTM25::\n\tfinditem ITEM_TM25\n\tend\n\nPowerPlant_EventScript_ItemThunderStone::\n\tfinditem ITEM_THUNDER_STONE\n\tend\n\nPowerPlant_EventScript_ItemElixir::\n\tfinditem ITEM_ELIXIR\n\tend\n\nPokemonMansion_1F_EventScript_ItemCarbos::\n\tfinditem ITEM_CARBOS\n\tend\n\nPokemonMansion_1F_EventScript_ItemEscapeRope::\n\tfinditem ITEM_ESCAPE_ROPE\n\tend\n\nPokemonMansion_2F_EventScript_ItemCalcium::\n\tfinditem ITEM_CALCIUM\n\tend\n\nPokemonMansion_3F_EventScript_ItemMaxPotion::\n\tfinditem ITEM_MAX_POTION\n\tend\n\nPokemonMansion_3F_EventScript_ItemIron::\n\tfinditem ITEM_IRON\n\tend\n\nPokemonMansion_B1F_EventScript_ItemTM14::\n\tfinditem ITEM_TM14\n\tend\n\nPokemonMansion_B1F_EventScript_ItemFullRestore::\n\tfinditem ITEM_FULL_RESTORE\n\tend\n\nPokemonMansion_B1F_EventScript_ItemTM22::\n\tfinditem ITEM_TM22\n\tend\n\nPokemonMansion_B1F_EventScript_ItemSecretKey::\n\tfinditem ITEM_SECRET_KEY\n\tend\n\nVictoryRoad_1F_EventScript_ItemRareCandy::\n\tfinditem ITEM_RARE_CANDY\n\tend\n\nVictoryRoad_1F_EventScript_ItemTM02::\n\tfinditem ITEM_TM02\n\tend\n\nVictoryRoad_2F_EventScript_ItemGuardSpec::\n\tfinditem ITEM_GUARD_SPEC\n\tend\n\nVictoryRoad_2F_EventScript_ItemTM07::\n\tfinditem ITEM_TM07\n\tend\n\nVictoryRoad_2F_EventScript_ItemFullHeal::\n\tfinditem ITEM_FULL_HEAL\n\tend\n\nVictoryRoad_2F_EventScript_ItemTM37::\n\tfinditem ITEM_TM37\n\tend\n\nVictoryRoad_3F_EventScript_ItemMaxRevive::\n\tfinditem ITEM_MAX_REVIVE\n\tend\n\nVictoryRoad_3F_EventScript_ItemTM50::\n\tfinditem ITEM_TM50\n\tend\n\nCeruleanCave_1F_EventScript_ItemMaxElixir::\n\tfinditem ITEM_MAX_ELIXIR\n\tend\n\nCeruleanCave_1F_EventScript_ItemNugget::\n\tfinditem ITEM_NUGGET\n\tend\n\nCeruleanCave_1F_EventScript_ItemFullRestore::\n\tfinditem ITEM_FULL_RESTORE\n\tend\n\nCeruleanCave_2F_EventScript_ItemFullRestore::\n\tfinditem ITEM_FULL_RESTORE\n\tend\n\nCeruleanCave_2F_EventScript_ItemPPUp::\n\tfinditem ITEM_PP_UP\n\tend\n\nCeruleanCave_2F_EventScript_ItemUltraBall::\n\tfinditem ITEM_ULTRA_BALL\n\tend\n\nCeruleanCave_B1F_EventScript_ItemMaxRevive::\n\tfinditem ITEM_MAX_REVIVE\n\tend\n\nCeruleanCave_B1F_EventScript_ItemUltraBall::\n\tfinditem ITEM_ULTRA_BALL\n\tend\n\nFuchsiaCity_WardensHouse_EventScript_ItemRareCandy::\n\tfinditem ITEM_RARE_CANDY\n\tend\n\nTwoIsland_EventScript_ItemRevive::\n\tfinditem ITEM_REVIVE\n\tend\n\nThreeIsland_EventScript_ItemZinc::\n\tfinditem ITEM_ZINC\n\tend\n\nViridianForest_EventScript_ItemPotion2::\n\tfinditem ITEM_POTION\n\tend\n\nMtMoon_B2F_EventScript_ItemRevive::\n\tfinditem ITEM_REVIVE\n\tend\n\nMtMoon_B2F_EventScript_ItemAntidote::\n\tfinditem ITEM_ANTIDOTE\n\tend\n\nRoute11_EventScript_ItemXDefend::\n\tfinditem ITEM_X_DEFEND\n\tend\n\nRoute9_EventScript_ItemBurnHeal::\n\tfinditem ITEM_BURN_HEAL\n\tend\n\nRockTunnel_1F_EventScript_ItemRepel::\n\tfinditem ITEM_REPEL\n\tend\n\nRockTunnel_1F_EventScript_ItemPearl::\n\tfinditem ITEM_PEARL\n\tend\n\nRockTunnel_1F_EventScript_ItemEscapeRope::\n\tfinditem ITEM_ESCAPE_ROPE\n\tend\n\nRockTunnel_B1F_EventScript_ItemRevive::\n\tfinditem ITEM_REVIVE\n\tend\n\nRockTunnel_B1F_EventScript_ItemMaxEther::\n\tfinditem ITEM_MAX_ETHER\n\tend\n\nSilphCo_8F_EventScript_ItemIron::\n\tfinditem ITEM_IRON\n\tend\n\nSilphCo_11F_EventScript_ItemZinc::\n\tfinditem ITEM_ZINC\n\tend\n\nPokemonMansion_1F_EventScript_ItemProtein::\n\tfinditem ITEM_PROTEIN\n\tend\n\nPokemonMansion_2F_EventScript_ItemZinc::\n\tfinditem ITEM_ZINC\n\tend\n\nPokemonMansion_2F_EventScript_ItemHPUp::\n\tfinditem ITEM_HP_UP\n\tend\n\nViridianCity_EventScript_ItemPotion::\n\tfinditem ITEM_POTION\n\tend\n\nRoute11_EventScript_ItemGreatBall::\n\tfinditem ITEM_GREAT_BALL\n\tend\n\nRoute11_EventScript_ItemAwakening::\n\tfinditem ITEM_AWAKENING\n\tend\n\nPokemonTower_5F_EventScript_ItemCleanseTag::\n\tfinditem ITEM_CLEANSE_TAG\n\tend\n\nCeladonCity_EventScript_ItemEther::\n\tfinditem ITEM_ETHER\n\tend\n\nCeladonCity_EventScript_ItemSunStone::\n\tfinditem ITEM_SUN_STONE\n\tend\n\nRocketHideout_B3F_EventScript_ItemBlackGlasses::\n\tfinditem ITEM_BLACK_GLASSES\n\tend\n\nSafariZone_North_EventScript_ItemQuickClaw::\n\tfinditem ITEM_QUICK_CLAW\n\tend\n\nSeafoamIslands_1F_EventScript_ItemIceHeal::\n\tfinditem ITEM_ICE_HEAL\n\tend\n\nSeafoamIslands_B1F_EventScript_ItemWaterStone::\n\tfinditem ITEM_WATER_STONE\n\tend\n\nSeafoamIslands_B1F_EventScript_ItemRevive::\n\tfinditem ITEM_REVIVE\n\tend\n\nSeafoamIslands_B2F_EventScript_ItemBigPearl::\n\tfinditem ITEM_BIG_PEARL\n\tend\n\nSeafoamIslands_B4F_EventScript_ItemUltraBall::\n\tfinditem ITEM_ULTRA_BALL\n\tend\n\nFourIsland_EventScript_ItemStarPiece::\n\tfinditem ITEM_STAR_PIECE\n\tend\n\nFourIsland_EventScript_ItemStardust::\n\tfinditem ITEM_STARDUST\n\tend\n\nOneIsland_KindleRoad_EventScript_ItemEther::\n\tfinditem ITEM_ETHER\n\tend\n\nOneIsland_KindleRoad_EventScript_ItemMaxRepel::\n\tfinditem ITEM_MAX_REPEL\n\tend\n\nOneIsland_KindleRoad_EventScript_ItemCarbos::\n\tfinditem ITEM_CARBOS\n\tend\n\nFiveIsland_Meadow_EventScript_ItemMaxPotion::\n\tfinditem ITEM_MAX_POTION\n\tend\n\nFiveIsland_Meadow_EventScript_ItemPPUp::\n\tfinditem ITEM_PP_UP\n\tend\n\nFiveIsland_MemorialPillar_EventScript_ItemMetalCoat::\n\tfinditem ITEM_METAL_COAT\n\tend\n\nSixIsland_OutcastIsland_EventScript_ItemPPUp::\n\tfinditem ITEM_PP_UP\n\tend\n\nSixIsland_WaterPath_EventScript_ItemElixir::\n\tfinditem ITEM_ELIXIR\n\tend\n\nSixIsland_WaterPath_EventScript_ItemDragonScale::\n\tfinditem ITEM_DRAGON_SCALE\n\tend\n\nSixIsland_RuinValley_EventScript_ItemFullRestore::\n\tfinditem ITEM_FULL_RESTORE\n\tend\n\nSixIsland_RuinValley_EventScript_ItemHPUp::\n\tfinditem ITEM_HP_UP\n\tend\n\nSixIsland_RuinValley_EventScript_ItemSunStone::\n\tfinditem ITEM_SUN_STONE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_ItemKingsRock::\n\tfinditem ITEM_KINGS_ROCK\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_ItemMaxElixir::\n\tfinditem ITEM_MAX_ELIXIR\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_ItemNugget::\n\tfinditem ITEM_NUGGET\n\tend\n\nThreeIsland_BerryForest_EventScript_ItemMaxEther::\n\tfinditem ITEM_MAX_ETHER\n\tend\n\nThreeIsland_BerryForest_EventScript_ItemFullHeal::\n\tfinditem ITEM_FULL_HEAL\n\tend\n\nThreeIsland_BerryForest_EventScript_ItemMaxElixir::\n\tfinditem ITEM_MAX_ELIXIR\n\tend\n\nMtEmber_Exterior_EventScript_ItemUltraBall::\n\tfinditem ITEM_ULTRA_BALL\n\tend\n\nMtEmber_Exterior_EventScript_ItemFireStone::\n\tfinditem ITEM_FIRE_STONE\n\tend\n\nMtEmber_Exterior_EventScript_ItemDireHit::\n\tfinditem ITEM_DIRE_HIT\n\tend\n\nFourIsland_IcefallCave_1F_EventScript_ItemUltraBall::\n\tfinditem ITEM_ULTRA_BALL\n\tend\n\nFourIsland_IcefallCave_1F_EventScript_ItemHM07::\n\tfinditem ITEM_HM07\n\tend\n\nFourIsland_IcefallCave_B1F_EventScript_ItemFullRestore::\n\tfinditem ITEM_FULL_RESTORE\n\tend\n\nFourIsland_IcefallCave_B1F_EventScript_ItemNeverMeltIce::\n\tfinditem ITEM_NEVER_MELT_ICE\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_ItemBigPearl::\n\tfinditem ITEM_BIG_PEARL\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_ItemTM36::\n\tfinditem ITEM_TM36\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_ItemPearl::\n\tfinditem ITEM_PEARL\n\tend\n\nFiveIsland_RocketWarehouse_EventScript_ItemUpGrade::\n\tfinditem ITEM_UP_GRADE\n\tend\n\nFiveIsland_LostCave_Room10_EventScript_ItemSilkScarf::\n\tfinditem ITEM_SILK_SCARF\n\tend\n\nFiveIsland_LostCave_Room11_EventScript_ItemLaxIncense::\n\tfinditem ITEM_LAX_INCENSE\n\tend\n\nFiveIsland_LostCave_Room12_EventScript_ItemSeaIncense::\n\tfinditem ITEM_SEA_INCENSE\n\tend\n\nFiveIsland_LostCave_Room13_EventScript_ItemMaxRevive::\n\tfinditem ITEM_MAX_REVIVE\n\tend\n\nFiveIsland_LostCave_Room14_EventScript_ItemRareCandy::\n\tfinditem ITEM_RARE_CANDY\n\tend\n\nSevenIsland_SevaultCanyon_House_EventScript_ItemLuckyPunch::\n\tfinditem ITEM_LUCKY_PUNCH\n\tend\n\nSilphCo_4F_EventScript_ItemTM41::\n\tfinditem ITEM_TM41\n\tend\n\nSafariZone_NorthWest_EventScript_ItemKingsRock::\n\tfinditem ITEM_KINGS_ROCK\n\tend\n\nSafariZone_NorthWest_EventScript_ItemSunStone::\n\tfinditem ITEM_SUN_STONE\n\tend\n\nSafariZone_NorthWest_EventScript_ItemPPMax::\n\tfinditem ITEM_PP_MAX\n\tend\n\nSafariZone_NorthWest_EventScript_ItemRareCandy::\n\tfinditem ITEM_RARE_CANDY\n\tend\n\nSafariZone_NorthEast_EventScript_ItemMaxRevive::\n\tfinditem ITEM_MAX_REVIVE\n\tend\n\nSafariZone_NorthEast_EventScript_ItemWhiteHerb::\n\tfinditem ITEM_WHITE_HERB\n\tend\n\nSafariZone_NorthEast_EventScript_ItemGlitterMail::\n\tfinditem ITEM_GLITTER_MAIL\n\tend\n\nArtisanCave_B1F_EventScript_ItemHPUp::\n\tfinditem ITEM_HP_UP\n\tend\n\nArtisanCave_1F_EventScript_ItemCarbos::\n\tfinditem ITEM_CARBOS\n\tend"
  },
  {
    "path": "data/scripts/itemfinder.inc",
    "content": "EventScript_ItemfinderDigUpUnderfootItem::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\twaitse\n\tcall EventScript_TryPickUpHiddenItem\n\tgoto_if_eq VAR_0x8007, TRUE, EventScript_DigUpItemPutInPocket\n\tgoto_if_eq VAR_0x8007, FALSE, EventScript_DigUpItemBagIsFull\n\tend\n\nEventScript_DigUpItemPutInPocket::\n\tmessage Text_DugUpItemFromGround\n\twaitfanfare\n\twaitmessage\n\tdelay 60\n\tmsgbox Text_PutItemAway\n\tspecial SetHiddenItemFlag\n\treleaseall\n\tend\n\nEventScript_DigUpItemBagIsFull::\n\tmsgbox Text_DugUpItemFromGround\n\tmsgbox Text_TooBadBagFull\n\tsetvar VAR_RESULT, 0\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/scripts/master_trainers.inc",
    "content": ".equ BEAUTY, 0\n.equ LASS, 0\n.equ SWIMMER, 0\n.equ BIRD_KEEPER, 1\n.equ COOLTRAINER, 1\n.equ BLACK_BELT, 2\n.equ HIKER, 2\n.equ BUG_CATCHER, 3\n.equ YOUNGSTER, 3\n.equ PSYCHIC, 4\n.equ SCIENTIST, 4\n.equ TRAINER, VAR_0x8009\n.equ CLASS, VAR_0x8006\n.equ HAVE_TITLE, VAR_0x8007\n\nMasterTrainer_EventScript_Bulbasaur::\n    bufferspeciesname STR_VAR_1, SPECIES_BULBASAUR\n    setvar TRAINER, SPECIES_BULBASAUR\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_BULBASAUR, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_BULBASAUR, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_BULBASAUR\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Ivysaur::\n    bufferspeciesname STR_VAR_1, SPECIES_IVYSAUR\n    setvar TRAINER, SPECIES_IVYSAUR\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_IVYSAUR, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_IVYSAUR, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_IVYSAUR\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Venusaur::\n    bufferspeciesname STR_VAR_1, SPECIES_VENUSAUR\n    setvar TRAINER, SPECIES_VENUSAUR\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_VENUSAUR, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_VENUSAUR, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_VENUSAUR\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Charmander::\n    bufferspeciesname STR_VAR_1, SPECIES_CHARMANDER\n    setvar TRAINER, SPECIES_CHARMANDER\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_CHARMANDER, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_CHARMANDER, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_CHARMANDER\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Charmeleon::\n    bufferspeciesname STR_VAR_1, SPECIES_CHARMELEON\n    setvar TRAINER, SPECIES_CHARMELEON\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_CHARMELEON, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_CHARMELEON, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_CHARMELEON\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Charizard::\n    bufferspeciesname STR_VAR_1, SPECIES_CHARIZARD\n    setvar TRAINER, SPECIES_CHARIZARD\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_CHARIZARD, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_CHARIZARD, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_CHARIZARD\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Squirtle::\n    bufferspeciesname STR_VAR_1, SPECIES_SQUIRTLE\n    setvar TRAINER, SPECIES_SQUIRTLE\n    setvar CLASS, BEAUTY\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_SQUIRTLE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_SQUIRTLE, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_SQUIRTLE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Wartortle::\n    bufferspeciesname STR_VAR_1, SPECIES_WARTORTLE\n    setvar TRAINER, SPECIES_WARTORTLE\n    setvar CLASS, SWIMMER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_WARTORTLE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_WARTORTLE, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_WARTORTLE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Blastoise::\n    bufferspeciesname STR_VAR_1, SPECIES_BLASTOISE\n    setvar TRAINER, SPECIES_BLASTOISE\n    setvar CLASS, SWIMMER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_BLASTOISE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_BLASTOISE, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_BLASTOISE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Caterpie::\n    bufferspeciesname STR_VAR_1, SPECIES_CATERPIE\n    setvar TRAINER, SPECIES_CATERPIE\n    setvar CLASS, BUG_CATCHER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_CATERPIE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_CATERPIE, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_CATERPIE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Metapod::\n    bufferspeciesname STR_VAR_1, SPECIES_METAPOD\n    setvar TRAINER, SPECIES_METAPOD\n    setvar CLASS, BUG_CATCHER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_METAPOD, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_METAPOD, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_METAPOD\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Butterfree::\n    bufferspeciesname STR_VAR_1, SPECIES_BUTTERFREE\n    setvar TRAINER, SPECIES_BUTTERFREE\n    setvar CLASS, BUG_CATCHER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_BUTTERFREE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_BUTTERFREE, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_BUTTERFREE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Weedle::\n    bufferspeciesname STR_VAR_1, SPECIES_WEEDLE\n    setvar TRAINER, SPECIES_WEEDLE\n    setvar CLASS, BUG_CATCHER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_WEEDLE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_WEEDLE, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_WEEDLE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Kakuna::\n    bufferspeciesname STR_VAR_1, SPECIES_KAKUNA\n    setvar TRAINER, SPECIES_KAKUNA\n    setvar CLASS, BUG_CATCHER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_KAKUNA, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_KAKUNA, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_KAKUNA\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Beedrill::\n    bufferspeciesname STR_VAR_1, SPECIES_BEEDRILL\n    setvar TRAINER, SPECIES_BEEDRILL\n    setvar CLASS, BUG_CATCHER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_BEEDRILL, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_BEEDRILL, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_BEEDRILL\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Pidgey::\n    bufferspeciesname STR_VAR_1, SPECIES_PIDGEY\n    setvar TRAINER, SPECIES_PIDGEY\n    setvar CLASS, BIRD_KEEPER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_PIDGEY, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_PIDGEY, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_PIDGEY\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Pidgeotto::\n    bufferspeciesname STR_VAR_1, SPECIES_PIDGEOTTO\n    setvar TRAINER, SPECIES_PIDGEOTTO\n    setvar CLASS, BIRD_KEEPER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_PIDGEOTTO, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_PIDGEOTTO, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_PIDGEOTTO\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Pidgeot::\n    bufferspeciesname STR_VAR_1, SPECIES_PIDGEOT\n    setvar TRAINER, SPECIES_PIDGEOT\n    setvar CLASS, BIRD_KEEPER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_PIDGEOT, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_PIDGEOT, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_PIDGEOT\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Rattata::\n    bufferspeciesname STR_VAR_1, SPECIES_RATTATA\n    setvar TRAINER, SPECIES_RATTATA\n    setvar CLASS, YOUNGSTER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_RATTATA, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_RATTATA, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_RATTATA\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Raticate::\n    bufferspeciesname STR_VAR_1, SPECIES_RATICATE\n    setvar TRAINER, SPECIES_RATICATE\n    setvar CLASS, YOUNGSTER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_RATICATE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_RATICATE, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_RATICATE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Spearow::\n    bufferspeciesname STR_VAR_1, SPECIES_SPEAROW\n    setvar TRAINER, SPECIES_SPEAROW\n    setvar CLASS, BIRD_KEEPER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_SPEAROW, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_SPEAROW, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_SPEAROW\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Fearow::\n    bufferspeciesname STR_VAR_1, SPECIES_FEAROW\n    setvar TRAINER, SPECIES_FEAROW\n    setvar CLASS, BIRD_KEEPER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_FEAROW, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_FEAROW, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_FEAROW\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Ekans::\n    bufferspeciesname STR_VAR_1, SPECIES_EKANS\n    setvar TRAINER, SPECIES_EKANS\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_EKANS, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_EKANS, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_EKANS\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Arbok::\n    bufferspeciesname STR_VAR_1, SPECIES_ARBOK\n    setvar TRAINER, SPECIES_ARBOK\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_ARBOK, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_ARBOK, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_ARBOK\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Pikachu::\n    bufferspeciesname STR_VAR_1, SPECIES_PIKACHU\n    setvar TRAINER, SPECIES_PIKACHU\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_PIKACHU, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_PIKACHU, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_PIKACHU\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Raichu::\n    bufferspeciesname STR_VAR_1, SPECIES_RAICHU\n    setvar TRAINER, SPECIES_RAICHU\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_RAICHU, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_RAICHU, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_RAICHU\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Sandshrew::\n    bufferspeciesname STR_VAR_1, SPECIES_SANDSHREW\n    setvar TRAINER, SPECIES_SANDSHREW\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_SANDSHREW, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_SANDSHREW, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_SANDSHREW\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Sandslash::\n    bufferspeciesname STR_VAR_1, SPECIES_SANDSLASH\n    setvar TRAINER, SPECIES_SANDSLASH\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_SANDSLASH, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_SANDSLASH, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_SANDSLASH\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_NidoranF::\n    bufferspeciesname STR_VAR_1, SPECIES_NIDORAN_F\n    setvar TRAINER, SPECIES_NIDORAN_F\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_NIDORAN_F, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_NIDORAN_F, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_NIDORAN_F\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Nidorina::\n    bufferspeciesname STR_VAR_1, SPECIES_NIDORINA\n    setvar TRAINER, SPECIES_NIDORINA\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_NIDORINA, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_NIDORINA, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_NIDORINA\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Nidoqueen::\n    bufferspeciesname STR_VAR_1, SPECIES_NIDOQUEEN\n    setvar TRAINER, SPECIES_NIDOQUEEN\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_NIDOQUEEN, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_NIDOQUEEN, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_NIDOQUEEN\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_NidoranM::\n    bufferspeciesname STR_VAR_1, SPECIES_NIDORAN_M\n    setvar TRAINER, SPECIES_NIDORAN_M\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_NIDORAN_M, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_NIDORAN_M, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_NIDORAN_M\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Nidorino::\n    bufferspeciesname STR_VAR_1, SPECIES_NIDORINO\n    setvar TRAINER, SPECIES_NIDORINO\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_NIDORINO, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_NIDORINO, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_NIDORINO\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Nidoking::\n    bufferspeciesname STR_VAR_1, SPECIES_NIDOKING\n    setvar TRAINER, SPECIES_NIDOKING\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_NIDOKING, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_NIDOKING, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_NIDOKING\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Clefairy::\n    bufferspeciesname STR_VAR_1, SPECIES_CLEFAIRY\n    setvar TRAINER, SPECIES_CLEFAIRY\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_CLEFAIRY, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_CLEFAIRY, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_CLEFAIRY\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Clefable::\n    bufferspeciesname STR_VAR_1, SPECIES_CLEFABLE\n    setvar TRAINER, SPECIES_CLEFABLE\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_CLEFABLE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_CLEFABLE, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_CLEFABLE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Vulpix::\n    bufferspeciesname STR_VAR_1, SPECIES_VULPIX\n    setvar TRAINER, SPECIES_VULPIX\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_VULPIX, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_VULPIX, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_VULPIX\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Ninetales::\n    bufferspeciesname STR_VAR_1, SPECIES_NINETALES\n    setvar TRAINER, SPECIES_NINETALES\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_NINETALES, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_NINETALES, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_NINETALES\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Jigglypuff::\n    bufferspeciesname STR_VAR_1, SPECIES_JIGGLYPUFF\n    setvar TRAINER, SPECIES_JIGGLYPUFF\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_JIGGLYPUFF, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_JIGGLYPUFF, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_JIGGLYPUFF\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Wigglytuff::\n    bufferspeciesname STR_VAR_1, SPECIES_WIGGLYTUFF\n    setvar TRAINER, SPECIES_WIGGLYTUFF\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_WIGGLYTUFF, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_WIGGLYTUFF, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_WIGGLYTUFF\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Zubat::\n    bufferspeciesname STR_VAR_1, SPECIES_ZUBAT\n    setvar TRAINER, SPECIES_ZUBAT\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_ZUBAT, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_ZUBAT, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_ZUBAT\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Golbat::\n    bufferspeciesname STR_VAR_1, SPECIES_GOLBAT\n    setvar TRAINER, SPECIES_GOLBAT\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_GOLBAT, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_GOLBAT, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_GOLBAT\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Oddish::\n    bufferspeciesname STR_VAR_1, SPECIES_ODDISH\n    setvar TRAINER, SPECIES_ODDISH\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_ODDISH, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_ODDISH, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_ODDISH\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Gloom::\n    bufferspeciesname STR_VAR_1, SPECIES_GLOOM\n    setvar TRAINER, SPECIES_GLOOM\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_GLOOM, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_GLOOM, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_GLOOM\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Vileplume::\n    bufferspeciesname STR_VAR_1, SPECIES_VILEPLUME\n    setvar TRAINER, SPECIES_VILEPLUME\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_VILEPLUME, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_VILEPLUME, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_VILEPLUME\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Paras::\n    bufferspeciesname STR_VAR_1, SPECIES_PARAS\n    setvar TRAINER, SPECIES_PARAS\n    setvar CLASS, BUG_CATCHER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_PARAS, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_PARAS, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_PARAS\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Parasect::\n    bufferspeciesname STR_VAR_1, SPECIES_PARASECT\n    setvar TRAINER, SPECIES_PARASECT\n    setvar CLASS, BUG_CATCHER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_PARASECT, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_PARASECT, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_PARASECT\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Venonat::\n    bufferspeciesname STR_VAR_1, SPECIES_VENONAT\n    setvar TRAINER, SPECIES_VENONAT\n    setvar CLASS, BUG_CATCHER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_VENONAT, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_VENONAT, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_VENONAT\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Venomoth::\n    bufferspeciesname STR_VAR_1, SPECIES_VENOMOTH\n    setvar TRAINER, SPECIES_VENOMOTH\n    setvar CLASS, BUG_CATCHER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_VENOMOTH, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_VENOMOTH, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_VENOMOTH\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Diglett::\n    bufferspeciesname STR_VAR_1, SPECIES_DIGLETT\n    setvar TRAINER, SPECIES_DIGLETT\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_DIGLETT, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_DIGLETT, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_DIGLETT\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Dugtrio::\n    bufferspeciesname STR_VAR_1, SPECIES_DUGTRIO\n    setvar TRAINER, SPECIES_DUGTRIO\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_DUGTRIO, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_DUGTRIO, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_DUGTRIO\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Meowth::\n    bufferspeciesname STR_VAR_1, SPECIES_MEOWTH\n    setvar TRAINER, SPECIES_MEOWTH\n    setvar CLASS, YOUNGSTER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MEOWTH, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_MEOWTH, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_MEOWTH\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Persian::\n    bufferspeciesname STR_VAR_1, SPECIES_PERSIAN\n    setvar TRAINER, SPECIES_PERSIAN\n    setvar CLASS, YOUNGSTER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_PERSIAN, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_PERSIAN, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_PERSIAN\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Psyduck::\n    bufferspeciesname STR_VAR_1, SPECIES_PSYDUCK\n    setvar TRAINER, SPECIES_PSYDUCK\n    setvar CLASS, SWIMMER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_PSYDUCK, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_PSYDUCK, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_PSYDUCK\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Golduck::\n    bufferspeciesname STR_VAR_1, SPECIES_GOLDUCK\n    setvar TRAINER, SPECIES_GOLDUCK\n    setvar CLASS, SWIMMER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_GOLDUCK, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_GOLDUCK, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_GOLDUCK\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Mankey::\n    bufferspeciesname STR_VAR_1, SPECIES_MANKEY\n    setvar TRAINER, SPECIES_MANKEY\n    setvar CLASS, BLACK_BELT\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MANKEY, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_MANKEY, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_MANKEY\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Primeape::\n    bufferspeciesname STR_VAR_1, SPECIES_PRIMEAPE\n    setvar TRAINER, SPECIES_PRIMEAPE\n    setvar CLASS, BLACK_BELT\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_PRIMEAPE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_PRIMEAPE, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_PRIMEAPE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Growlithe::\n    bufferspeciesname STR_VAR_1, SPECIES_GROWLITHE\n    setvar TRAINER, SPECIES_GROWLITHE\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_GROWLITHE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_GROWLITHE, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_GROWLITHE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Arcanine::\n    bufferspeciesname STR_VAR_1, SPECIES_ARCANINE\n    setvar TRAINER, SPECIES_ARCANINE\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_ARCANINE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_ARCANINE, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_ARCANINE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Poliwag::\n    bufferspeciesname STR_VAR_1, SPECIES_POLIWAG\n    setvar TRAINER, SPECIES_POLIWAG\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_POLIWAG, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_POLIWAG, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_POLIWAG\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Poliwhirl::\n    bufferspeciesname STR_VAR_1, SPECIES_POLIWHIRL\n    setvar TRAINER, SPECIES_POLIWHIRL\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_POLIWHIRL, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_POLIWHIRL, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_POLIWHIRL\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Poliwrath::\n    bufferspeciesname STR_VAR_1, SPECIES_POLIWRATH\n    setvar TRAINER, SPECIES_POLIWRATH\n    setvar CLASS, BLACK_BELT\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_POLIWRATH, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_POLIWRATH, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_POLIWRATH\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Abra::\n    bufferspeciesname STR_VAR_1, SPECIES_ABRA\n    setvar TRAINER, SPECIES_ABRA\n    setvar CLASS, PSYCHIC\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_ABRA, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_ABRA, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_ABRA\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Kadabra::\n    bufferspeciesname STR_VAR_1, SPECIES_KADABRA\n    setvar TRAINER, SPECIES_KADABRA\n    setvar CLASS, PSYCHIC\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_KADABRA, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_KADABRA, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_KADABRA\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Alakazam::\n    bufferspeciesname STR_VAR_1, SPECIES_ALAKAZAM\n    setvar TRAINER, SPECIES_ALAKAZAM\n    setvar CLASS, PSYCHIC\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_ALAKAZAM, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_ALAKAZAM, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_ALAKAZAM\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Machop::\n    bufferspeciesname STR_VAR_1, SPECIES_MACHOP\n    setvar TRAINER, SPECIES_MACHOP\n    setvar CLASS, BLACK_BELT\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MACHOP, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_MACHOP, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_MACHOP\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Machoke::\n    bufferspeciesname STR_VAR_1, SPECIES_MACHOKE\n    setvar TRAINER, SPECIES_MACHOKE\n    setvar CLASS, BLACK_BELT\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MACHOKE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_MACHOKE, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_MACHOKE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Machamp::\n    bufferspeciesname STR_VAR_1, SPECIES_MACHAMP\n    setvar TRAINER, SPECIES_MACHAMP\n    setvar CLASS, BLACK_BELT\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MACHAMP, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_MACHAMP, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_MACHAMP\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Bellsprout::\n    bufferspeciesname STR_VAR_1, SPECIES_BELLSPROUT\n    setvar TRAINER, SPECIES_BELLSPROUT\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_BELLSPROUT, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_BELLSPROUT, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_BELLSPROUT\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Weepinbell::\n    bufferspeciesname STR_VAR_1, SPECIES_WEEPINBELL\n    setvar TRAINER, SPECIES_WEEPINBELL\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_WEEPINBELL, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_WEEPINBELL, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_WEEPINBELL\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Victreebel::\n    bufferspeciesname STR_VAR_1, SPECIES_VICTREEBEL\n    setvar TRAINER, SPECIES_VICTREEBEL\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_VICTREEBEL, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_VICTREEBEL, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_VICTREEBEL\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Tentacool::\n    bufferspeciesname STR_VAR_1, SPECIES_TENTACOOL\n    setvar TRAINER, SPECIES_TENTACOOL\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_TENTACOOL, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_TENTACOOL, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_TENTACOOL\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Tentacruel::\n    bufferspeciesname STR_VAR_1, SPECIES_TENTACRUEL\n    setvar TRAINER, SPECIES_TENTACRUEL\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_TENTACRUEL, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_TENTACRUEL, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_TENTACRUEL\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Geodude::\n    bufferspeciesname STR_VAR_1, SPECIES_GEODUDE\n    setvar TRAINER, SPECIES_GEODUDE\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_GEODUDE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_GEODUDE, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_GEODUDE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Graveler::\n    bufferspeciesname STR_VAR_1, SPECIES_GRAVELER\n    setvar TRAINER, SPECIES_GRAVELER\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_GRAVELER, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_GRAVELER, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_GRAVELER\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Golem::\n    bufferspeciesname STR_VAR_1, SPECIES_GOLEM\n    setvar TRAINER, SPECIES_GOLEM\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_GOLEM, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_GOLEM, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_GOLEM\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Ponyta::\n    bufferspeciesname STR_VAR_1, SPECIES_PONYTA\n    setvar TRAINER, SPECIES_PONYTA\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_PONYTA, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_PONYTA, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_PONYTA\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Rapidash::\n    bufferspeciesname STR_VAR_1, SPECIES_RAPIDASH\n    setvar TRAINER, SPECIES_RAPIDASH\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_RAPIDASH, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_RAPIDASH, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_RAPIDASH\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Slowpoke::\n    bufferspeciesname STR_VAR_1, SPECIES_SLOWPOKE\n    setvar TRAINER, SPECIES_SLOWPOKE\n    setvar CLASS, BEAUTY\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_SLOWPOKE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_SLOWPOKE, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_SLOWPOKE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Slowbro::\n    bufferspeciesname STR_VAR_1, SPECIES_SLOWBRO\n    setvar TRAINER, SPECIES_SLOWBRO\n    setvar CLASS, BEAUTY\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_SLOWBRO, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_SLOWBRO, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_SLOWBRO\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Magnemite::\n    bufferspeciesname STR_VAR_1, SPECIES_MAGNEMITE\n    setvar TRAINER, SPECIES_MAGNEMITE\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MAGNEMITE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_MAGNEMITE, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_MAGNEMITE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Magneton::\n    bufferspeciesname STR_VAR_1, SPECIES_MAGNETON\n    setvar TRAINER, SPECIES_MAGNETON\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MAGNETON, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_MAGNETON, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_MAGNETON\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Farfetchd::\n    bufferspeciesname STR_VAR_1, SPECIES_FARFETCHD\n    setvar TRAINER, SPECIES_FARFETCHD\n    setvar CLASS, BIRD_KEEPER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_FARFETCHD, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_FARFETCHD, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_FARFETCHD\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Doduo::\n    bufferspeciesname STR_VAR_1, SPECIES_DODUO\n    setvar TRAINER, SPECIES_DODUO\n    setvar CLASS, BIRD_KEEPER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_DODUO, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_DODUO, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_DODUO\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Dodrio::\n    bufferspeciesname STR_VAR_1, SPECIES_DODRIO\n    setvar TRAINER, SPECIES_DODRIO\n    setvar CLASS, BIRD_KEEPER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_DODRIO, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_DODRIO, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_DODRIO\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Seel::\n    bufferspeciesname STR_VAR_1, SPECIES_SEEL\n    setvar TRAINER, SPECIES_SEEL\n    setvar CLASS, BEAUTY\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_SEEL, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_SEEL, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_SEEL\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Dewgong::\n    bufferspeciesname STR_VAR_1, SPECIES_DEWGONG\n    setvar TRAINER, SPECIES_DEWGONG\n    setvar CLASS, BEAUTY\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_DEWGONG, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_DEWGONG, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_DEWGONG\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Grimer::\n    bufferspeciesname STR_VAR_1, SPECIES_GRIMER\n    setvar TRAINER, SPECIES_GRIMER\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_GRIMER, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_GRIMER, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_GRIMER\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Muk::\n    bufferspeciesname STR_VAR_1, SPECIES_MUK\n    setvar TRAINER, SPECIES_MUK\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MUK, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_MUK, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_MUK\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Shellder::\n    bufferspeciesname STR_VAR_1, SPECIES_SHELLDER\n    setvar TRAINER, SPECIES_SHELLDER\n    setvar CLASS, SWIMMER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_SHELLDER, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_SHELLDER, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_SHELLDER\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Cloyster::\n    bufferspeciesname STR_VAR_1, SPECIES_CLOYSTER\n    setvar TRAINER, SPECIES_CLOYSTER\n    setvar CLASS, SWIMMER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_CLOYSTER, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_CLOYSTER, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_CLOYSTER\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Gastly::\n    bufferspeciesname STR_VAR_1, SPECIES_GASTLY\n    setvar TRAINER, SPECIES_GASTLY\n    setvar CLASS, PSYCHIC\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_GASTLY, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_GASTLY, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_GASTLY\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Haunter::\n    bufferspeciesname STR_VAR_1, SPECIES_HAUNTER\n    setvar TRAINER, SPECIES_HAUNTER\n    setvar CLASS, PSYCHIC\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_HAUNTER, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_HAUNTER, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_HAUNTER\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Gengar::\n    bufferspeciesname STR_VAR_1, SPECIES_GENGAR\n    setvar TRAINER, SPECIES_GENGAR\n    setvar CLASS, PSYCHIC\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_GENGAR, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_GENGAR, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_GENGAR\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Onix::\n    bufferspeciesname STR_VAR_1, SPECIES_ONIX\n    setvar TRAINER, SPECIES_ONIX\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_ONIX, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_ONIX, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_ONIX\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Drowzee::\n    bufferspeciesname STR_VAR_1, SPECIES_DROWZEE\n    setvar TRAINER, SPECIES_DROWZEE\n    setvar CLASS, PSYCHIC\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_DROWZEE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_DROWZEE, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_DROWZEE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Hypno::\n    bufferspeciesname STR_VAR_1, SPECIES_HYPNO\n    setvar TRAINER, SPECIES_HYPNO\n    setvar CLASS, PSYCHIC\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_HYPNO, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_HYPNO, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_HYPNO\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Krabby::\n    bufferspeciesname STR_VAR_1, SPECIES_KRABBY\n    setvar TRAINER, SPECIES_KRABBY\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_KRABBY, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_KRABBY, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_KRABBY\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Kingler::\n    bufferspeciesname STR_VAR_1, SPECIES_KINGLER\n    setvar TRAINER, SPECIES_KINGLER\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_KINGLER, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_KINGLER, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_KINGLER\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Voltorb::\n    bufferspeciesname STR_VAR_1, SPECIES_VOLTORB\n    setvar TRAINER, SPECIES_VOLTORB\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_VOLTORB, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_VOLTORB, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_VOLTORB\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Electrode::\n    bufferspeciesname STR_VAR_1, SPECIES_ELECTRODE\n    setvar TRAINER, SPECIES_ELECTRODE\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_ELECTRODE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_ELECTRODE, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_ELECTRODE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Exeggcute::\n    bufferspeciesname STR_VAR_1, SPECIES_EXEGGCUTE\n    setvar TRAINER, SPECIES_EXEGGCUTE\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_EXEGGCUTE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_EXEGGCUTE, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_EXEGGCUTE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Exeggutor::\n    bufferspeciesname STR_VAR_1, SPECIES_EXEGGUTOR\n    setvar TRAINER, SPECIES_EXEGGUTOR\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_EXEGGUTOR, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_EXEGGUTOR, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_EXEGGUTOR\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Cubone::\n    bufferspeciesname STR_VAR_1, SPECIES_CUBONE\n    setvar TRAINER, SPECIES_CUBONE\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_CUBONE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_CUBONE, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_CUBONE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Marowak::\n    bufferspeciesname STR_VAR_1, SPECIES_MAROWAK\n    setvar TRAINER, SPECIES_MAROWAK\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MAROWAK, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_MAROWAK, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_MAROWAK\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Hitmonlee::\n    bufferspeciesname STR_VAR_1, SPECIES_HITMONLEE\n    setvar TRAINER, SPECIES_HITMONLEE\n    setvar CLASS, BLACK_BELT\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_HITMONLEE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_HITMONLEE, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_HITMONLEE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Hitmonchan::\n    bufferspeciesname STR_VAR_1, SPECIES_HITMONCHAN\n    setvar TRAINER, SPECIES_HITMONCHAN\n    setvar CLASS, BLACK_BELT\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_HITMONCHAN, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_HITMONCHAN, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_HITMONCHAN\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Lickitung::\n    bufferspeciesname STR_VAR_1, SPECIES_LICKITUNG\n    setvar TRAINER, SPECIES_LICKITUNG\n    setvar CLASS, YOUNGSTER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_LICKITUNG, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_LICKITUNG, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_LICKITUNG\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Koffing::\n    bufferspeciesname STR_VAR_1, SPECIES_KOFFING\n    setvar TRAINER, SPECIES_KOFFING\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_KOFFING, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_KOFFING, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_KOFFING\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Weezing::\n    bufferspeciesname STR_VAR_1, SPECIES_WEEZING\n    setvar TRAINER, SPECIES_WEEZING\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_WEEZING, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_WEEZING, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_WEEZING\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Rhyhorn::\n    bufferspeciesname STR_VAR_1, SPECIES_RHYHORN\n    setvar TRAINER, SPECIES_RHYHORN\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_RHYHORN, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_RHYHORN, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_RHYHORN\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Rhydon::\n    bufferspeciesname STR_VAR_1, SPECIES_RHYDON\n    setvar TRAINER, SPECIES_RHYDON\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_RHYDON, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_RHYDON, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_RHYDON\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Chansey::\n    bufferspeciesname STR_VAR_1, SPECIES_CHANSEY\n    setvar TRAINER, SPECIES_CHANSEY\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_CHANSEY, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_CHANSEY, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_CHANSEY\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Tangela::\n    bufferspeciesname STR_VAR_1, SPECIES_TANGELA\n    setvar TRAINER, SPECIES_TANGELA\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_TANGELA, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_TANGELA, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_TANGELA\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Kangaskhan::\n    bufferspeciesname STR_VAR_1, SPECIES_KANGASKHAN\n    setvar TRAINER, SPECIES_KANGASKHAN\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_KANGASKHAN, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_KANGASKHAN, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_KANGASKHAN\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Horsea::\n    bufferspeciesname STR_VAR_1, SPECIES_HORSEA\n    setvar TRAINER, SPECIES_HORSEA\n    setvar CLASS, SWIMMER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_HORSEA, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_HORSEA, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_HORSEA\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Seadra::\n    bufferspeciesname STR_VAR_1, SPECIES_SEADRA\n    setvar TRAINER, SPECIES_SEADRA\n    setvar CLASS, SWIMMER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_SEADRA, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_SEADRA, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_SEADRA\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Goldeen::\n    bufferspeciesname STR_VAR_1, SPECIES_GOLDEEN\n    setvar TRAINER, SPECIES_GOLDEEN\n    setvar CLASS, SWIMMER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_GOLDEEN, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_GOLDEEN, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_GOLDEEN\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Seaking::\n    bufferspeciesname STR_VAR_1, SPECIES_SEAKING\n    setvar TRAINER, SPECIES_SEAKING\n    setvar CLASS, SWIMMER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_SEAKING, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_SEAKING, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_SEAKING\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Staryu::\n    bufferspeciesname STR_VAR_1, SPECIES_STARYU\n    setvar TRAINER, SPECIES_STARYU\n    setvar CLASS, BEAUTY\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_STARYU, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_STARYU, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_STARYU\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Starmie::\n    bufferspeciesname STR_VAR_1, SPECIES_STARMIE\n    setvar TRAINER, SPECIES_STARMIE\n    setvar CLASS, PSYCHIC\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_STARMIE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_STARMIE, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_STARMIE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_MrMime::\n    bufferspeciesname STR_VAR_1, SPECIES_MR_MIME\n    setvar TRAINER, SPECIES_MR_MIME\n    setvar CLASS, PSYCHIC\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MR_MIME, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_MR_MIME, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_MR_MIME\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Scyther::\n    bufferspeciesname STR_VAR_1, SPECIES_SCYTHER\n    setvar TRAINER, SPECIES_SCYTHER\n    setvar CLASS, BUG_CATCHER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_SCYTHER, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_SCYTHER, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_SCYTHER\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Jynx::\n    bufferspeciesname STR_VAR_1, SPECIES_JYNX\n    setvar TRAINER, SPECIES_JYNX\n    setvar CLASS, PSYCHIC\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_JYNX, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_JYNX, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_JYNX\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Electabuzz::\n    bufferspeciesname STR_VAR_1, SPECIES_ELECTABUZZ\n    setvar TRAINER, SPECIES_ELECTABUZZ\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_ELECTABUZZ, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_ELECTABUZZ, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_ELECTABUZZ\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Magmar::\n    bufferspeciesname STR_VAR_1, SPECIES_MAGMAR\n    setvar TRAINER, SPECIES_MAGMAR\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MAGMAR, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_MAGMAR, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_MAGMAR\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Pinsir::\n    bufferspeciesname STR_VAR_1, SPECIES_PINSIR\n    setvar TRAINER, SPECIES_PINSIR\n    setvar CLASS, BUG_CATCHER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_PINSIR, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_PINSIR, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_PINSIR\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Tauros::\n    bufferspeciesname STR_VAR_1, SPECIES_TAUROS\n    setvar TRAINER, SPECIES_TAUROS\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_TAUROS, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_TAUROS, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_TAUROS\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Magikarp::\n    bufferspeciesname STR_VAR_1, SPECIES_MAGIKARP\n    setvar TRAINER, SPECIES_MAGIKARP\n    setvar CLASS, YOUNGSTER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MAGIKARP, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_MAGIKARP, Text_BugCatcherYoungster_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_MAGIKARP\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Gyarados::\n    bufferspeciesname STR_VAR_1, SPECIES_GYARADOS\n    setvar TRAINER, SPECIES_GYARADOS\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_GYARADOS, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_GYARADOS, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_GYARADOS\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Lapras::\n    bufferspeciesname STR_VAR_1, SPECIES_LAPRAS\n    setvar TRAINER, SPECIES_LAPRAS\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_LAPRAS, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_LAPRAS, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_LAPRAS\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Ditto::\n    bufferspeciesname STR_VAR_1, SPECIES_DITTO\n    setvar TRAINER, SPECIES_DITTO\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_DITTO, MasterTrainer_EventScript_HaveTitleNoBattle\n    call MasterTrainer_EventScript_NoBattleContinue\n    settrainerflag MASTER_DITTO\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    release\n    end\n\nMasterTrainer_EventScript_Eevee::\n    bufferspeciesname STR_VAR_1, SPECIES_EEVEE\n    setvar TRAINER, SPECIES_EEVEE\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_EEVEE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_EEVEE, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_EEVEE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Vaporeon::\n    bufferspeciesname STR_VAR_1, SPECIES_VAPOREON\n    setvar TRAINER, SPECIES_VAPOREON\n    setvar CLASS, LASS\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_VAPOREON, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_VAPOREON, Text_BeautyLass_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_VAPOREON\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Jolteon::\n    bufferspeciesname STR_VAR_1, SPECIES_JOLTEON\n    setvar TRAINER, SPECIES_JOLTEON\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_JOLTEON, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_JOLTEON, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_JOLTEON\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Flareon::\n    bufferspeciesname STR_VAR_1, SPECIES_FLAREON\n    setvar TRAINER, SPECIES_FLAREON\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_FLAREON, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_FLAREON, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_FLAREON\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Porygon::\n    bufferspeciesname STR_VAR_1, SPECIES_PORYGON\n    setvar TRAINER, SPECIES_PORYGON\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_PORYGON, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_PORYGON, Text_PsychicScientist_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_PORYGON\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Omanyte::\n    bufferspeciesname STR_VAR_1, SPECIES_OMANYTE\n    setvar TRAINER, SPECIES_OMANYTE\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_OMANYTE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_OMANYTE, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_OMANYTE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Omastar::\n    bufferspeciesname STR_VAR_1, SPECIES_OMASTAR\n    setvar TRAINER, SPECIES_OMASTAR\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_OMASTAR, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_OMASTAR, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_OMASTAR\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Kabuto::\n    bufferspeciesname STR_VAR_1, SPECIES_KABUTO\n    setvar TRAINER, SPECIES_KABUTO\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_KABUTO, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_KABUTO, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_KABUTO\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Kabutops::\n    bufferspeciesname STR_VAR_1, SPECIES_KABUTOPS\n    setvar TRAINER, SPECIES_KABUTOPS\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_KABUTOPS, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_KABUTOPS, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_KABUTOPS\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Aerodactyl::\n    bufferspeciesname STR_VAR_1, SPECIES_AERODACTYL\n    setvar TRAINER, SPECIES_AERODACTYL\n    setvar CLASS, HIKER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_AERODACTYL, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_AERODACTYL, Text_BlackBeltHiker_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_AERODACTYL\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Snorlax::\n    bufferspeciesname STR_VAR_1, SPECIES_SNORLAX\n    setvar TRAINER, SPECIES_SNORLAX\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_SNORLAX, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_SNORLAX, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_SNORLAX\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Articuno::\n    bufferspeciesname STR_VAR_1, SPECIES_ARTICUNO\n    setvar TRAINER, SPECIES_ARTICUNO\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_ARTICUNO, MasterTrainer_EventScript_HaveTitleNoBattle\n    call MasterTrainer_EventScript_NoBattleContinue\n    settrainerflag MASTER_ARTICUNO\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    release\n    end\n\nMasterTrainer_EventScript_Zapdos::\n    bufferspeciesname STR_VAR_1, SPECIES_ZAPDOS\n    setvar TRAINER, SPECIES_ZAPDOS\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_ZAPDOS, MasterTrainer_EventScript_HaveTitleNoBattle\n    call MasterTrainer_EventScript_NoBattleContinue\n    settrainerflag MASTER_ZAPDOS\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    release\n    end\n\nMasterTrainer_EventScript_Moltres::\n    bufferspeciesname STR_VAR_1, SPECIES_MOLTRES\n    setvar TRAINER, SPECIES_MOLTRES\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MOLTRES, MasterTrainer_EventScript_HaveTitleNoBattle\n    call MasterTrainer_EventScript_NoBattleContinue\n    settrainerflag MASTER_MOLTRES\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    release\n    end\n\nMasterTrainer_EventScript_Dratini::\n    bufferspeciesname STR_VAR_1, SPECIES_DRATINI\n    setvar TRAINER, SPECIES_DRATINI\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_DRATINI, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_DRATINI, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_DRATINI\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Dragonair::\n    bufferspeciesname STR_VAR_1, SPECIES_DRAGONAIR\n    setvar TRAINER, SPECIES_DRAGONAIR\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_DRAGONAIR, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_DRAGONAIR, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_DRAGONAIR\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Dragonite::\n    bufferspeciesname STR_VAR_1, SPECIES_DRAGONITE\n    setvar TRAINER, SPECIES_DRAGONITE\n    setvar CLASS, COOLTRAINER\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_DRAGONITE, MasterTrainer_EventScript_HaveTitle\n    call MasterTrainer_EventScript_DetermineScript\n    trainerbattle_no_intro MASTER_DRAGONITE, Text_BirdKeeperCooltrainer_BattleLoss\n    bufferspeciesname STR_VAR_1, SPECIES_DRAGONITE\n    goto MasterTrainer_EventScript_DetermineContinueScript\n\nMasterTrainer_EventScript_Mewtwo::\n    bufferspeciesname STR_VAR_1, SPECIES_MEWTWO\n    setvar TRAINER, SPECIES_MEWTWO\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MEWTWO, MasterTrainer_EventScript_HaveTitleNoBattle\n    call MasterTrainer_EventScript_NoBattleContinue\n    settrainerflag MASTER_MEWTWO\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    release\n    end\n\nMasterTrainer_EventScript_Mew::\n    bufferspeciesname STR_VAR_1, SPECIES_MEW\n    setvar TRAINER, SPECIES_MEW\n    setvar CLASS, SCIENTIST\n    setflag FLAG_MASTER_TRAINER_BATTLE\n\tsetvar HAVE_TITLE, FALSE\n    call_if_defeated MASTER_MEW, MasterTrainer_EventScript_HaveTitleNoBattle\n    call MasterTrainer_EventScript_NoBattleContinue\n    settrainerflag MASTER_MEW\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    release\n    end\n\nMasterTrainer_EventScript_HaveTitle:\n    setvar HAVE_TITLE, TRUE\n    return\n\nMasterTrainer_EventScript_HaveTitleNoBattle:\n    msgbox Text_Scientist_HaveTitleNoBattle MSGBOX_NPC\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nText_Scientist_HaveTitleNoBattle:\n    .string \"Oh, good to see you again.\\n\"\n    .string \"How's your {STR_VAR_1} doing?$\"\n\nMasterTrainer_EventScript_DetermineScript:\n    lock\n    switch CLASS\n    case BEAUTY, MasterTrainer_EventScript_BeautyLass\n\tcase BIRD_KEEPER, MasterTrainer_EventScript_BirdKeeperCooltrainer\n\tcase BLACK_BELT, MasterTrainer_EventScript_BlackBeltHiker\n\tcase BUG_CATCHER, MasterTrainer_EventScript_BugCatcherYoungster\n    case PSYCHIC, MasterTrainer_EventScript_PsychicScientist\n    return\n\nMasterTrainer_EventScript_DetermineContinueScript:\n    switch CLASS\n    case BEAUTY, MasterTrainer_EventScript_BeautyLassContinue\n\tcase BIRD_KEEPER, MasterTrainer_EventScript_BirdKeeperCooltrainerContinue\n\tcase BLACK_BELT, MasterTrainer_EventScript_BlackBeltHikerContinue\n\tcase BUG_CATCHER, MasterTrainer_EventScript_BugCatcherYoungsterContinue\n    case PSYCHIC, MasterTrainer_EventScript_PsychicScientistContinue\n    end\n\nMasterTrainer_EventScript_BeautyLass:\n    faceplayer\n    msgbox Text_BeautyLass_Intro, MSGBOX_DEFAULT\n    callnative CheckMasterPokemonInSlot1\n    compare VAR_RESULT, TRUE\n    goto_if_ne MasterTrainer_EventScript_BeautyLass_NoMon\n    compare HAVE_TITLE, TRUE\n    call_if_eq MasterTrainer_EventScript_BeautyLass_HaveTitleAskBattle\n    compare HAVE_TITLE, FALSE\n    call_if_eq MasterTrainer_EventScript_BeautyLass_AskBattle\n    return\n\nMasterTrainer_EventScript_BirdKeeperCooltrainer:\n    faceplayer\n    msgbox Text_BirdKeeperCooltrainer_Intro, MSGBOX_DEFAULT\n    callnative CheckMasterPokemonInSlot1\n    compare VAR_RESULT, TRUE\n    goto_if_ne MasterTrainer_EventScript_BirdKeeperCooltrainer_NoMon\n    compare HAVE_TITLE, TRUE\n    call_if_eq MasterTrainer_EventScript_BirdKeeperCooltrainer_HaveTitleAskBattle\n    compare HAVE_TITLE, FALSE\n    call_if_eq MasterTrainer_EventScript_BirdKeeperCooltrainer_AskBattle\n    return\n\nMasterTrainer_EventScript_BugCatcherYoungster:\n    faceplayer\n    msgbox Text_BugCatcherYoungster_Intro, MSGBOX_DEFAULT\n    callnative CheckMasterPokemonInSlot1\n    compare VAR_RESULT, TRUE\n    goto_if_ne MasterTrainer_EventScript_BugCatcherYoungster_NoMon\n    compare HAVE_TITLE, TRUE\n    call_if_eq MasterTrainer_EventScript_BugCatcherYoungster_HaveTitleAskBattle\n    compare HAVE_TITLE, FALSE\n    call_if_eq MasterTrainer_EventScript_BugCatcherYoungster_AskBattle\n    return\n\nMasterTrainer_EventScript_PsychicScientist:\n    faceplayer\n    msgbox Text_PsychicScientist_Intro, MSGBOX_DEFAULT\n    callnative CheckMasterPokemonInSlot1\n    compare VAR_RESULT, TRUE\n    goto_if_ne MasterTrainer_EventScript_PsychicScientist_NoMon\n    compare HAVE_TITLE, TRUE\n    call_if_eq MasterTrainer_EventScript_PsychicScientist_HaveTitleAskBattle\n    compare HAVE_TITLE, FALSE\n    call_if_eq MasterTrainer_EventScript_PsychicScientist_AskBattle\n    return\n\nMasterTrainer_EventScript_BlackBeltHiker:\n    faceplayer\n    msgbox Text_BlackBeltHiker_Intro, MSGBOX_DEFAULT\n    callnative CheckMasterPokemonInSlot1\n    compare VAR_RESULT, TRUE\n    goto_if_ne MasterTrainer_EventScript_BlackBeltHiker_NoMon\n    compare HAVE_TITLE, TRUE\n    call_if_eq MasterTrainer_EventScript_BlackBeltHiker_HaveTitleAskBattle\n    compare HAVE_TITLE, FALSE\n    call_if_eq MasterTrainer_EventScript_BlackBeltHiker_AskBattle\n    return\n\nMasterTrainer_EventScript_BeautyLassContinue:\n    special LoadPlayerParty\n    specialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_LOST\n    goto_if_eq MasterTrainer_EventScript_BeautyLass_LostBattle\n    compare VAR_RESULT, B_OUTCOME_DREW\n    goto_if_eq MasterTrainer_EventScript_BeautyLass_LostBattle\n    compare HAVE_TITLE, TRUE\n    goto_if_ne MasterTrainer_EventScript_BeautyLass_ConferTitle\n    msgbox Text_BeautyLass_AfterBattleWon, MSGBOX_DEFAULT\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    release\n    end\n\nMasterTrainer_EventScript_BirdKeeperCooltrainerContinue:\n    special LoadPlayerParty\n    specialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_LOST\n    goto_if_eq MasterTrainer_EventScript_BirdKeeperCooltrainer_LostBattle\n    compare VAR_RESULT, B_OUTCOME_DREW\n    goto_if_eq MasterTrainer_EventScript_BirdKeeperCooltrainer_LostBattle\n    compare HAVE_TITLE, TRUE\n    goto_if_ne MasterTrainer_EventScript_BirdKeeperCooltrainer_ConferTitle\n    msgbox Text_BirdKeeperCooltrainer_AfterBattleWon, MSGBOX_DEFAULT\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    release\n    end\n\nMasterTrainer_EventScript_BugCatcherYoungsterContinue:\n    special LoadPlayerParty\n    specialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_LOST\n    goto_if_eq MasterTrainer_EventScript_BugCatcherYoungster_LostBattle\n    compare VAR_RESULT, B_OUTCOME_DREW\n    goto_if_eq MasterTrainer_EventScript_BugCatcherYoungster_LostBattle\n    compare HAVE_TITLE, TRUE\n    goto_if_ne MasterTrainer_EventScript_BugCatcherYoungster_ConferTitle\n    msgbox Text_BugCatcherYoungster_AfterBattleWon, MSGBOX_DEFAULT\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    release\n    end\n\nMasterTrainer_EventScript_PsychicScientistContinue:\n    special LoadPlayerParty\n    specialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_LOST\n    goto_if_eq MasterTrainer_EventScript_PsychicScientist_LostBattle\n    compare VAR_RESULT, B_OUTCOME_DREW\n    goto_if_eq MasterTrainer_EventScript_PsychicScientist_LostBattle\n    compare HAVE_TITLE, TRUE\n    goto_if_ne MasterTrainer_EventScript_PsychicScientist_ConferTitle\n    msgbox Text_PsychicScientist_AfterBattleWon, MSGBOX_DEFAULT\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    release\n    end\n\nMasterTrainer_EventScript_BlackBeltHikerContinue:\n    special LoadPlayerParty\n    specialvar VAR_RESULT, GetBattleOutcome\n\tcompare VAR_RESULT, B_OUTCOME_LOST\n    goto_if_eq MasterTrainer_EventScript_BlackBeltHiker_LostBattle\n    compare VAR_RESULT, B_OUTCOME_DREW\n    goto_if_eq MasterTrainer_EventScript_BlackBeltHiker_LostBattle\n    compare HAVE_TITLE, TRUE\n    goto_if_ne MasterTrainer_EventScript_BlackBeltHiker_ConferTitle\n    msgbox Text_BlackBeltHiker_AfterBattleWon, MSGBOX_DEFAULT\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    release\n    end\n\nMasterTrainer_EventScript_BeautyLass_NoMon:\n    msgbox Text_BeautyLass_NoMon, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_BirdKeeperCooltrainer_NoMon:\n    msgbox Text_BirdKeeperCooltrainer_NoMon, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_BugCatcherYoungster_NoMon:\n    msgbox Text_BugCatcherYoungster_NoMon, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_PsychicScientist_NoMon:\n    msgbox Text_PsychicScientist_NoMon, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_BlackBeltHiker_NoMon:\n    msgbox Text_BlackBeltHiker_NoMon, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_BeautyLass_HaveTitleAskBattle:\n    msgbox Text_BeautyLass_HaveTitleAskBattle, MSGBOX_YESNO\n    compare VAR_RESULT, YES\n    goto_if_ne MasterTrainer_EventScript_BeautyLass_DeclinedBattle\n    msgbox Text_BeautyLass_AcceptedBattle, MSGBOX_DEFAULT\n    special SavePlayerParty\n    callnative ClearAllButFirstPokemon\n    callnative HealPlayerPartyOak\n    return\n\nMasterTrainer_EventScript_BirdKeeperCooltrainer_HaveTitleAskBattle:\n    msgbox Text_BirdKeeperCooltrainer_HaveTitleAskBattle, MSGBOX_YESNO\n    compare VAR_RESULT, YES\n    goto_if_ne MasterTrainer_EventScript_BirdKeeperCooltrainer_DeclinedBattle\n    msgbox Text_BirdKeeperCooltrainer_AcceptedBattle, MSGBOX_DEFAULT\n    special SavePlayerParty\n    callnative ClearAllButFirstPokemon\n    callnative HealPlayerPartyOak\n    return\n\nMasterTrainer_EventScript_BugCatcherYoungster_HaveTitleAskBattle:\n    msgbox Text_BugCatcherYoungster_HaveTitleAskBattle, MSGBOX_YESNO\n    compare VAR_RESULT, YES\n    goto_if_ne MasterTrainer_EventScript_BugCatcherYoungster_DeclinedBattle\n    msgbox Text_BugCatcherYoungster_AcceptedBattle, MSGBOX_DEFAULT\n    special SavePlayerParty\n    callnative ClearAllButFirstPokemon\n    callnative HealPlayerPartyOak\n    return\n\nMasterTrainer_EventScript_PsychicScientist_HaveTitleAskBattle:\n    msgbox Text_PsychicScientist_HaveTitleAskBattle, MSGBOX_YESNO\n    compare VAR_RESULT, YES\n    goto_if_ne MasterTrainer_EventScript_PsychicScientist_DeclinedBattle\n    msgbox Text_PsychicScientist_AcceptedBattle, MSGBOX_DEFAULT\n    special SavePlayerParty\n    callnative ClearAllButFirstPokemon\n    callnative HealPlayerPartyOak\n    return\n\nMasterTrainer_EventScript_BlackBeltHiker_HaveTitleAskBattle:\n    msgbox Text_BlackBeltHiker_HaveTitleAskBattle, MSGBOX_YESNO\n    compare VAR_RESULT, YES\n    goto_if_ne MasterTrainer_EventScript_BlackBeltHiker_DeclinedBattle\n    msgbox Text_BlackBeltHiker_AcceptedBattle, MSGBOX_DEFAULT\n    special SavePlayerParty\n    callnative ClearAllButFirstPokemon\n    callnative HealPlayerPartyOak\n    return\n\nMasterTrainer_EventScript_BeautyLass_AskBattle:\n    msgbox Text_BeautyLass_AskBattle, MSGBOX_YESNO\n    compare VAR_RESULT, YES\n    goto_if_ne MasterTrainer_EventScript_BeautyLass_DeclinedBattle\n    msgbox Text_BeautyLass_AcceptedBattle, MSGBOX_DEFAULT\n    special SavePlayerParty\n    callnative ClearAllButFirstPokemon\n    callnative HealPlayerPartyOak\n    return\n\nMasterTrainer_EventScript_BirdKeeperCooltrainer_AskBattle:\n    msgbox Text_BirdKeeperCooltrainer_AskBattle, MSGBOX_YESNO\n    compare VAR_RESULT, YES\n    goto_if_ne MasterTrainer_EventScript_BirdKeeperCooltrainer_DeclinedBattle\n    msgbox Text_BirdKeeperCooltrainer_AcceptedBattle, MSGBOX_DEFAULT\n    special SavePlayerParty\n    callnative ClearAllButFirstPokemon\n    callnative HealPlayerPartyOak\n    return\n\nMasterTrainer_EventScript_BugCatcherYoungster_AskBattle:\n    msgbox Text_BugCatcherYoungster_AskBattle, MSGBOX_YESNO\n    compare VAR_RESULT, YES\n    goto_if_ne MasterTrainer_EventScript_BugCatcherYoungster_DeclinedBattle\n    msgbox Text_BugCatcherYoungster_AcceptedBattle, MSGBOX_DEFAULT\n    special SavePlayerParty\n    callnative ClearAllButFirstPokemon\n    callnative HealPlayerPartyOak\n    return\n\nMasterTrainer_EventScript_PsychicScientist_AskBattle:\n    msgbox Text_PsychicScientist_AskBattle, MSGBOX_YESNO\n    compare VAR_RESULT, YES\n    goto_if_ne MasterTrainer_EventScript_PsychicScientist_DeclinedBattle\n    msgbox Text_PsychicScientist_AcceptedBattle, MSGBOX_DEFAULT\n    special SavePlayerParty\n    callnative ClearAllButFirstPokemon\n    callnative HealPlayerPartyOak\n    return\n\nMasterTrainer_EventScript_BlackBeltHiker_AskBattle:\n    msgbox Text_BlackBeltHiker_AskBattle, MSGBOX_YESNO\n    compare VAR_RESULT, YES\n    goto_if_ne MasterTrainer_EventScript_BlackBeltHiker_DeclinedBattle\n    msgbox Text_BlackBeltHiker_AcceptedBattle, MSGBOX_DEFAULT\n    special SavePlayerParty\n    callnative ClearAllButFirstPokemon\n    callnative HealPlayerPartyOak\n    return\n\nMasterTrainer_EventScript_BeautyLass_DeclinedBattle:\n    msgbox Text_BeautyLass_DeclinedBattle, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_BirdKeeperCooltrainer_DeclinedBattle:\n    msgbox Text_BirdKeeperCooltrainer_DeclinedBattle, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_BugCatcherYoungster_DeclinedBattle:\n    msgbox Text_BugCatcherYoungster_DeclinedBattle, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_PsychicScientist_DeclinedBattle:\n    msgbox Text_PsychicScientist_DeclinedBattle, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_BlackBeltHiker_DeclinedBattle:\n    msgbox Text_BlackBeltHiker_DeclinedBattle, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_BeautyLass_LostBattle:\n    msgbox Text_BeautyLass_LostBattle, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_BirdKeeperCooltrainer_LostBattle:\n    msgbox Text_BirdKeeperCooltrainer_LostBattle, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_BugCatcherYoungster_LostBattle:\n    msgbox Text_BugCatcherYoungster_LostBattle, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_PsychicScientist_LostBattle:\n    msgbox Text_PsychicScientist_LostBattle, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_BlackBeltHiker_LostBattle:\n    msgbox Text_BlackBeltHiker_LostBattle, MSGBOX_DEFAULT\n    release\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    end\n\nMasterTrainer_EventScript_BeautyLass_ConferTitle:\n    msgbox Text_BeautyLass_GiveTitle, MSGBOX_DEFAULT\n    message Text_MasterTrainer_EarnTitle\n    waitmessage\n    playfanfare MUS_LEVEL_UP\n    waitfanfare\n    waitbuttonpress\n    msgbox Text_BeautyLass_AnotherBattleSometime, MSGBOX_DEFAULT\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    resetobjectmovementtype VAR_LAST_TALKED\n    release\n    end\n\nMasterTrainer_EventScript_BirdKeeperCooltrainer_ConferTitle:\n    msgbox Text_BirdKeeperCooltrainer_GiveTitle, MSGBOX_DEFAULT\n    message Text_MasterTrainer_EarnTitle\n    waitmessage\n    playfanfare MUS_LEVEL_UP\n    waitfanfare\n    waitbuttonpress\n    msgbox Text_BirdKeeperCooltrainer_AnotherBattleSometime, MSGBOX_DEFAULT\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    resetobjectmovementtype VAR_LAST_TALKED\n    release\n    end\n\nMasterTrainer_EventScript_BugCatcherYoungster_ConferTitle:\n    msgbox Text_BugCatcherYoungster_GiveTitle, MSGBOX_DEFAULT\n    message Text_MasterTrainer_EarnTitle\n    waitmessage\n    playfanfare MUS_LEVEL_UP\n    waitfanfare\n    waitbuttonpress\n    msgbox Text_BugCatcherYoungster_AnotherBattleSometime, MSGBOX_DEFAULT\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    resetobjectmovementtype VAR_LAST_TALKED\n    release\n    end\n\nMasterTrainer_EventScript_PsychicScientist_ConferTitle:\n    msgbox Text_PsychicScientist_GiveTitle, MSGBOX_DEFAULT\n    message Text_MasterTrainer_EarnTitle\n    waitmessage\n    playfanfare MUS_LEVEL_UP\n    waitfanfare\n    waitbuttonpress\n    msgbox Text_PsychicScientist_AnotherBattleSometime, MSGBOX_DEFAULT\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    resetobjectmovementtype VAR_LAST_TALKED\n    release\n    end\n\nMasterTrainer_EventScript_BlackBeltHiker_ConferTitle:\n    msgbox Text_BlackBeltHiker_GiveTitle, MSGBOX_DEFAULT\n    message Text_MasterTrainer_EarnTitle\n    waitmessage\n    playfanfare MUS_LEVEL_UP\n    waitfanfare\n    waitbuttonpress\n    msgbox Text_BlackBeltHiker_AnotherBattleSometime, MSGBOX_DEFAULT\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    resetobjectmovementtype VAR_LAST_TALKED\n    release\n    end\n\nMasterTrainer_EventScript_NoBattleContinue:\n    faceplayer\n    msgbox Text_PsychicScientist_Intro, MSGBOX_DEFAULT\n    msgbox Text_Scientist_SeePowerfulMon, MSGBOX_DEFAULT\n    callnative CheckMasterPokemonInSlot1\n    compare VAR_RESULT, FALSE\n    goto_if_eq MasterTrainer_EventScript_ReleaseEndClearFlag\n    callnative CheckSlot1EVTotal\n    compare VAR_RESULT, FALSE\n    goto_if_eq MasterTrainer_EventScript_ReleaseEndClearFlag\n    msgbox Text_Scientist_ShowPowerfulMon, MSGBOX_DEFAULT\n    message Text_MasterTrainer_EarnTitle\n    waitmessage\n    playfanfare MUS_LEVEL_UP\n    waitfanfare\n    waitbuttonpress\n    resetobjectmovementtype VAR_LAST_TALKED\n    return\n\nMasterTrainer_EventScript_ReleaseEndClearFlag:\n    clearflag FLAG_MASTER_TRAINER_BATTLE\n    release\n    end\n\n\nText_Scientist_SeePowerfulMon:\n    .string \"It would be wonderful to see a truly\\n\"\n    .string \"powerful {STR_VAR_1}, even just once.$\"\n\nText_Scientist_ShowPowerfulMon:\n    .string \"What do we have here?\\p\"\n    .string \"That {STR_VAR_1}!\\n\"\n    .string \"It's got a special vibe to it!\\p\"\n    .string \"The way it holds itself, it just\\n\"\n    .string \"radiates strength…\\l\"\n    .string \"Wonderful!\\p\"\n    .string \"I thank you… You showed me a\\n\"\n    .string \"a truly amazing POKéMON.\\p\"\n    .string \"I think you deserve the title of\\n\"\n    .string \"{STR_VAR_1} MASTER!$\"\n\nText_BeautyLass_Intro:\n    .string \"I'm the {STR_VAR_1} MASTER!\\p\"\n    .string \"My goal is to find the ultimate\\n\"\n    .string \"{STR_VAR_1}!$\"\n\nText_BirdKeeperCooltrainer_Intro:\n    .string \"I'm the {STR_VAR_1} MASTER!\\p\"\n    .string \"I aim to find the ultimate\\n\"\n    .string \"{STR_VAR_1}!$\"\n\nText_BugCatcherYoungster_Intro:\n    .string \"I'm the {STR_VAR_1} MASTER!\\n\"\n    .string \"I seek the ultimate {STR_VAR_1}!$\"\n\nText_PsychicScientist_Intro:\n    .string \"I am the {STR_VAR_1} MASTER!\\n\"\n    .string \"I seek the ultimate {STR_VAR_1}.$\"\n\nText_BlackBeltHiker_Intro:\n    .string \"I am the {STR_VAR_1} MASTER!\\p\"\n    .string \"My only desire is to find the\\n\"\n    .string \"ultimate {STR_VAR_1}!$\"\n\nText_BeautyLass_NoMon:\n    .string \"Don't forget to put your {STR_VAR_1}\\n\"\n    .string \"in the top-left position of your\\l\"\n    .string \"party if you want to battle me!$\"\n\nText_BirdKeeperCooltrainer_NoMon:\n    .string \"If you want to battle me, you've\\n\"\n    .string \"got to put your {STR_VAR_1} in the\\l\"\n    .string \"top-left position of your party!$\"\n\nText_BugCatcherYoungster_NoMon:\n    .string \"If you're interested in battling me,\\n\"\n    .string \"you gotta put your {STR_VAR_1} in\\l\"\n    .string \"the top-left position of your party!$\"\n\nText_PsychicScientist_NoMon:\n    .string \"If you wish to battle me, you\\n\"\n    .string \"must put your {STR_VAR_1} in the\\l\"\n    .string \"top-left position of your party!$\"\n\nText_BlackBeltHiker_NoMon:\n    .string \"Set your {STR_VAR_1} in the top\\n\"\n    .string \"left of your party if you wish\\l\"\n    .string \"to face me in battle!$\"\n\nText_BeautyLass_AskBattle:\n    .string \"Hey, your {STR_VAR_1} looks pretty\\n\"\n    .string \"strong!\\p\"\n    .string \"Can I battle it with my {STR_VAR_1}?\\n\"\n    .string \"Pleeeease?$\"\n\nText_BirdKeeperCooltrainer_AskBattle:\n    .string \"What's this? I see you have a\\n\"\n    .string \"strong-looking {STR_VAR_1}!\\p\"\n    .string \"Why don't you have it battle my\\n\"\n    .string \"{STR_VAR_1}?$\"\n\nText_BugCatcherYoungster_AskBattle:\n    .string \"Heeey, you have a powerful\\n\"\n    .string \"{STR_VAR_1}, don't you?\\p\"\n    .string \"C'mon, you should have it battle\\n\"\n    .string \"my own {STR_VAR_1}!$\"\n\nText_PsychicScientist_AskBattle:\n    .string \"Oh? I see you have a very\\n\"\n    .string \"potent-looking {STR_VAR_1}…\\p\"\n    .string \"Would you be interested in battling\\n\"\n    .string \"my {STR_VAR_1}?$\"\n\nText_BlackBeltHiker_AskBattle:\n    .string \"Hmm? Your {STR_VAR_1} seems very\\n\"\n    .string \"strong!\\p\"\n    .string \"Why not have it face off against\\n\"\n    .string \"my {STR_VAR_1}?$\"\n\nText_BeautyLass_HaveTitleAskBattle:\n    .string \"Hey there! Has your {STR_VAR_1}\\n\"\n    .string \"gotten any stronger?\\p\"\n    .string \"Can I battle it with my {STR_VAR_1}?\\n\"\n    .string \"Pleeeease?$\"\n\nText_BirdKeeperCooltrainer_HaveTitleAskBattle:\n    .string \"Oh, hey there! Has your\\n\"\n    .string \"{STR_VAR_1} gotten any stronger?\\p\"\n    .string \"Why don't you have it battle my\\n\"\n    .string \"{STR_VAR_1}?$\"\n\nText_BugCatcherYoungster_HaveTitleAskBattle:\n    .string \"Hey, how's it going? Still training\\n\"\n    .string \"your {STR_VAR_1}, I bet!\\p\"\n    .string \"C'mon, you should have it battle\\n\"\n    .string \"my own {STR_VAR_1}!$\"\n\nText_PsychicScientist_HaveTitleAskBattle:\n    .string \"Oh, good to see you again.\\n\"\n    .string \"How's your {STR_VAR_1} doing?\\p\"\n    .string \"Would you be interested in battling\\n\"\n    .string \"my {STR_VAR_1}?$\"\n\nText_BlackBeltHiker_HaveTitleAskBattle:\n    .string \"Ahoy, you there! How is your\\n\"\n    .string \"{STR_VAR_1} doing these days?\\p\"\n    .string \"Why not have it face off against\\n\"\n    .string \"my {STR_VAR_1}?$\"\n\nText_BeautyLass_DeclinedBattle:\n    .string \"Boo!\\n\"\n    .string \"I wanted to show off my {STR_VAR_1}!$\"\n\nText_BirdKeeperCooltrainer_DeclinedBattle:\n    .string \"Too bad! That means I can't show\\n\"\n    .string \"you how amazing my {STR_VAR_1} is!$\"\n\nText_BugCatcherYoungster_DeclinedBattle:\n    .string \"Tsk! I really would have liked to\\n\"\n    .string \"see your {STR_VAR_1} in action…$\"\n\nText_PsychicScientist_DeclinedBattle:\n    .string \"It is unfortunate I can't show you\\n\"\n    .string \"the power of my {STR_VAR_1}.$\"\n\nText_BlackBeltHiker_DeclinedBattle:\n    .string \"Hmm, perhaps my {STR_VAR_1} is\\n\"\n    .string \"frightening you?$\"\n\nText_BeautyLass_AcceptedBattle:\n    .string \"Let's see which is the stronger\\n\"\n    .string \"{STR_VAR_1}!$\"\n\nText_BirdKeeperCooltrainer_AcceptedBattle: // a/an\n    .string \"All right!\\n\"\n    .string \"It's time for {STR_VAR_3} {STR_VAR_1} battle!$\"\n\nText_BugCatcherYoungster_AcceptedBattle:\n    .string \"Let's find out whose {STR_VAR_1}\\n\"\n    .string \"is the most powerful!$\"\n\nText_PsychicScientist_AcceptedBattle:\n    .string \"Well then, I hope you're ready!\\n\"\n    .string \"Come on, {STR_VAR_1}!$\"\n\nText_BlackBeltHiker_AcceptedBattle:\n    .string \"Let's do this, {STR_VAR_1}!\\n\"\n    .string \"Let's have an honorable battle!$\"\n\nText_BeautyLass_LostBattle:\n    .string \"Hee hee! I knew my {STR_VAR_1}\\n\"\n    .string \"was the best of the best!$\"\n\nText_BirdKeeperCooltrainer_LostBattle:\n    .string \"Hahaha! I knew my {STR_VAR_1}\\n\"\n    .string \"was the best of them all!$\"\n\nText_BugCatcherYoungster_LostBattle:\n    .string \"We did it! I knew my\\n\"\n    .string \"{STR_VAR_1} was the best there is!$\"\n\nText_PsychicScientist_LostBattle:\n    .string \"Heh heh heh… I knew my {STR_VAR_1}\\n\"\n    .string \"was the best, most powerful\\l\"\n    .string \"of them all.$\"\n\nText_BlackBeltHiker_LostBattle:\n    .string \"Bahaha! Of course my {STR_VAR_1}\\n\"\n    .string \"is the best of them all!$\"\n\nText_BeautyLass_BattleLoss:\n    .string \"That strength is the real deal!$\"\n\nText_BirdKeeperCooltrainer_BattleLoss:\n    .string \"That strength is the real thing.$\"\n\nText_BugCatcherYoungster_BattleLoss:\n    .string \"That strength is no joke!$\"\n\nText_PsychicScientist_BattleLoss:\n    .string \"That seems like true strength.$\"\n\nText_BlackBeltHiker_BattleLoss:\n    .string \"That's some real strength!$\"\n\nText_BeautyLass_AfterBattleWon: //already have title\n    .string \"Oh wow… Your {STR_VAR_1} is way\\n\"\n    .string \"stronger than I thought!\\p\"\n    .string \"We should have another battle\\n\"\n    .string \"sometime, since we both love\\l\"\n    .string \"{STR_VAR_1} so much!$\"\n\nText_BirdKeeperCooltrainer_AfterBattleWon: //already have title\n    .string \"I can't believe it… Your\\n\"\n    .string \"{STR_VAR_1}… It's too powerful!\\p\"\n    .string \"We both seem to love {STR_VAR_1},\\n\"\n    .string \"so let's battle again sometime!$\"\n\nText_BugCatcherYoungster_AfterBattleWon: //already have title\n    .string \"Aw, c'mon! Your {STR_VAR_1}\\n\"\n    .string \"is way too strong!\\p\"\n    .string \"I'd love to battle again sometime,\\n\"\n    .string \"as a fellow {STR_VAR_1} fan!$\"\n\nText_PsychicScientist_AfterBattleWon: //already have title\n    .string \"I can't believe this… Your\\n\"\n    .string \"{STR_VAR_1} is too strong!\\p\"\n    .string \"As two {STR_VAR_1} fanatics,\\n\"\n    .string \"we should definitely battle again\\l\"\n    .string \"sometime!$\"\n\nText_BlackBeltHiker_AfterBattleWon: //already have title\n    .string \"B-but how…? Your {STR_VAR_1} is\\n\"\n    .string \"more powerful than any I've seen\\l\"\n    .string \"before!\\p\"\n    .string \"As two {STR_VAR_1} fanatics,\\n\"\n    .string \"we are almost family!\\l\"\n    .string \"We must battle again sometime!$\"\n\nText_BeautyLass_GiveTitle: // a/an\n    .string \"Oh wow… Your {STR_VAR_1} is way\\n\"\n    .string \"stronger than I thought!\\p\"\n    .string \"I think you deserve to be called\\n\"\n    .string \"{STR_VAR_3} {STR_VAR_1} MASTER!$\"\n\nText_BirdKeeperCooltrainer_GiveTitle:\n    .string \"I can't believe it… Your\\n\"\n    .string \"{STR_VAR_1}… It's too powerful!\\p\"\n    .string \"You are the one who deserves the\\n\"\n    .string \"title of {STR_VAR_1} MASTER!$\"\n\nText_BugCatcherYoungster_GiveTitle:\n    .string \"Aw, c'mon! Your {STR_VAR_1}\\n\"\n    .string \"is way too strong!\\p\"\n    .string \"You definitely deserve the title\\n\"\n    .string \"of {STR_VAR_1} MASTER!$\"\n\nText_PsychicScientist_GiveTitle:\n    .string \"I can't believe this… Your\\n\"\n    .string \"{STR_VAR_1} is too strong!\\p\"\n    .string \"I think you deserve the title of\\n\"\n    .string \"{STR_VAR_1} MASTER!$\"\n\nText_BlackBeltHiker_GiveTitle:\n    .string \"B-but how…? Your {STR_VAR_1} is\\n\"\n    .string \"more powerful than any I've seen\\l\"\n    .string \"before!\\p\"\n    .string \"You are truly worthy of the title\\n\"\n    .string \"{STR_VAR_1} MASTER!$\"\n\nText_MasterTrainer_EarnTitle:\n    .string \"{COLOR DARK_GRAY}You have earned the title of\\n\"\n    .string \"{STR_VAR_1} MASTER!$\"\n\nText_BeautyLass_AnotherBattleSometime:\n    .string \"We should have another battle\\n\"\n    .string \"sometime, since we both love\\l\"\n    .string \"{STR_VAR_1} so much!$\"\n\nText_BirdKeeperCooltrainer_AnotherBattleSometime:\n    .string \"We both seem to love {STR_VAR_1},\\n\"\n    .string \"so let's battle again sometime!$\"\n\nText_BugCatcherYoungster_AnotherBattleSometime:\n    .string \"I'd love to battle again sometime,\\n\"\n    .string \"as a fellow {STR_VAR_1} fan!$\"\n\nText_PsychicScientist_AnotherBattleSometime:\n    .string \"As two {STR_VAR_1} fanatics,\\n\"\n    .string \"we should definitely battle again\\l\"\n    .string \"sometime!$\"\n\nText_BlackBeltHiker_AnotherBattleSometime:\n    .string \"As two {STR_VAR_1} fanatics,\\n\"\n    .string \"we are almost family!\\l\"\n    .string \"We must battle again sometime!$\"\n"
  },
  {
    "path": "data/scripts/move_tutors.inc",
    "content": "VictoryRoad_2F_EventScript_DoubleEdgeTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_DOUBLE_EDGE, EventScript_DoubleEdgeReteach\n\tmsgbox Text_DoubleEdgeTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_DoubleEdgeDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_DoubleEdgeDeclined\n\tmsgbox Text_DoubleEdgeWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_DOUBLE_EDGE\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_DoubleEdgeDeclined\n\tsetflag FLAG_TUTOR_DOUBLE_EDGE\n\tgoto EventScript_DoubleEdgeTaught\n\tend\n\nEventScript_DoubleEdgeDeclined::\n\tmsgbox Text_DoubleEdgeDeclined\n\trelease\n\tend\n\nEventScript_DoubleEdgeTaught::\n\tmsgbox Text_DoubleEdgeTaught\n\trelease\n\tend\n\nEventScript_DoubleEdgeReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_DoubleEdgeReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_DoubleEdgeReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_DoubleEdgeDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_DoubleEdgeNotEnoughMoney\n\tmsgbox Text_DoubleEdgeWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_DOUBLE_EDGE\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_DoubleEdgeDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_DoubleEdgeTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_DoubleEdgeNotEnoughMoney::\n\tmsgbox Text_DoubleEdgeNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_DoubleEdgeDeclined2::\n\tmsgbox Text_DoubleEdgeDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_ThunderWaveTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_THUNDER_WAVE, EventScript_ThunderWaveReteach\n\tmsgbox Text_ThunderWaveTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_ThunderWaveDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_ThunderWaveDeclined\n\tmsgbox Text_ThunderWaveWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_THUNDER_WAVE\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_ThunderWaveDeclined\n\tsetflag FLAG_TUTOR_THUNDER_WAVE\n\tgoto EventScript_ThunderWaveTaught\n\tend\n\nEventScript_ThunderWaveDeclined::\n\tmsgbox Text_ThunderWaveDeclined\n\trelease\n\tend\n\nEventScript_ThunderWaveTaught::\n\tmsgbox Text_ThunderWaveTaught\n\trelease\n\tend\n\nEventScript_ThunderWaveReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_ThunderWaveReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_ThunderWaveReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_ThunderWaveDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_ThunderWaveNotEnoughMoney\n\tmsgbox Text_ThunderWaveWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_THUNDER_WAVE\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_ThunderWaveDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_ThunderWaveTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_ThunderWaveNotEnoughMoney::\n\tmsgbox Text_ThunderWaveNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_ThunderWaveDeclined2::\n\tmsgbox Text_ThunderWaveDeclined\n\thidemoneybox\n\trelease\n\tend\n\nRockTunnel_B1F_EventScript_RockSlideTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_ROCK_SLIDE, EventScript_RockSlideReteach\n\tmsgbox Text_RockSlideTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_RockSlideDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_RockSlideDeclined\n\tmsgbox Text_RockSlideWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_ROCK_SLIDE\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_RockSlideDeclined\n\tsetflag FLAG_TUTOR_ROCK_SLIDE\n\tgoto EventScript_RockSlideTaught\n\tend\n\nEventScript_RockSlideDeclined::\n\tmsgbox Text_RockSlideDeclined\n\trelease\n\tend\n\nEventScript_RockSlideTaught::\n\tmsgbox Text_RockSlideTaught\n\trelease\n\tend\n\nEventScript_RockSlideReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_RockSlideReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_RockSlideReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_RockSlideDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_RockSlideNotEnoughMoney\n\tmsgbox Text_RockSlideWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_ROCK_SLIDE\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_RockSlideDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_RockSlideTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_RockSlideNotEnoughMoney::\n\tmsgbox Text_RockSlideNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_RockSlideDeclined2::\n\tmsgbox Text_RockSlideDeclined\n\thidemoneybox\n\trelease\n\tend\n\nMtEmber_Exterior_EventScript_ExplosionTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_EXPLOSION, EventScript_ExplosionReteach\n\tmsgbox Text_ExplosionTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_ExplosionDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_ExplosionDeclined\n\tmsgbox Text_ExplosionWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_EXPLOSION\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_ExplosionDeclined\n\tsetflag FLAG_TUTOR_EXPLOSION\n\tgoto EventScript_ExplosionTaught\n\tend\n\nEventScript_ExplosionDeclined::\n\tmsgbox Text_ExplosionDeclined\n\trelease\n\tend\n\nEventScript_ExplosionTaught::\n\tmsgbox Text_ExplosionTaught\n\trelease\n\tend\n\nEventScript_ExplosionReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_ExplosionReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_ExplosionReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_ExplosionDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_ExplosionNotEnoughMoney\n\tmsgbox Text_ExplosionWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_EXPLOSION\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_ExplosionDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_ExplosionTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_ExplosionDeclined2::\n\tmsgbox Text_ExplosionDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_ExplosionNotEnoughMoney::\n\tmsgbox Text_ExplosionNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nRoute4_EventScript_MegaPunchTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_MEGA_PUNCH, EventScript_MegaPunchReteach\n\tmsgbox Text_MegaPunchTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_MegaPunchDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_MegaPunchDeclined\n\tmsgbox Text_MegaPunchWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_MEGA_PUNCH\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_MegaPunchDeclined\n\tsetflag FLAG_TUTOR_MEGA_PUNCH\n\tgoto EventScript_MegaPunchTaught\n\tend\n\nEventScript_MegaPunchDeclined::\n\tmsgbox Text_MegaPunchDeclined\n\trelease\n\tend\n\nEventScript_MegaPunchTaught::\n\tmsgbox Text_MegaPunchTaught\n\trelease\n\tend\n\nEventScript_MegaPunchReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_MegaPunchReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_MegaPunchReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_MegaPunchDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_MegaPunchNotEnoughMoney\n\tmsgbox Text_MegaPunchWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_MEGA_PUNCH\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_MegaPunchDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_MegaPunchTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_MegaPunchDeclined2::\n\tmsgbox Text_MegaPunchDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_MegaPunchNotEnoughMoney::\n\tmsgbox Text_MegaPunchNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nRoute4_EventScript_MegaKickTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_MEGA_KICK, EventScript_MegaKickReteach\n\tmsgbox Text_MegaKickTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_MegaKickDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_MegaKickDeclined\n\tmsgbox Text_MegaKickWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_MEGA_KICK\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_MegaKickDeclined\n\tsetflag FLAG_TUTOR_MEGA_KICK\n\tgoto EventScript_MegaKickTaught\n\tend\n\nEventScript_MegaKickDeclined::\n\tmsgbox Text_MegaKickDeclined\n\trelease\n\tend\n\nEventScript_MegaKickTaught::\n\tmsgbox Text_MegaKickTaught\n\trelease\n\tend\n\nEventScript_MegaKickReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_MegaKickReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_MegaKickReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_MegaKickDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_MegaKickNotEnoughMoney\n\tmsgbox Text_MegaKickWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_MEGA_KICK\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_MegaKickDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_MegaKickTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_MegaKickDeclined2::\n\tmsgbox Text_MegaKickDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_MegaKickNotEnoughMoney::\n\tmsgbox Text_MegaKickNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_DreamEaterTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_DREAM_EATER, EventScript_DreamEaterReteach\n\tmsgbox Text_DreamEaterTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_DreamEaterDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_DreamEaterDeclined\n\tmsgbox Text_DreamEaterWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_DREAM_EATER\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_DreamEaterDeclined\n\tsetflag FLAG_TUTOR_DREAM_EATER\n\tgoto EventScript_DreamEaterTaught\n\tend\n\nEventScript_DreamEaterDeclined::\n\tmsgbox Text_DreamEaterDeclined\n\trelease\n\tend\n\nEventScript_DreamEaterTaught::\n\tmsgbox Text_DreamEaterTaught\n\trelease\n\tend\n\nEventScript_DreamEaterReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_DreamEaterReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_DreamEaterReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_DreamEaterDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_DreamEaterNotEnoughMoney\n\tmsgbox Text_DreamEaterWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_DREAM_EATER\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_DreamEaterDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_DreamEaterTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_DreamEaterDeclined2::\n\tmsgbox Text_DreamEaterDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_DreamEaterNotEnoughMoney::\n\tmsgbox Text_DreamEaterNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_SoftboiledTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_SOFT_BOILED, EventScript_SoftboiledReteach\n\tmsgbox Text_SoftboiledTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SoftboiledDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SoftboiledDeclined\n\tmsgbox Text_SoftboiledWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_SOFT_BOILED\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SoftboiledDeclined\n\tsetflag FLAG_TUTOR_SOFT_BOILED\n\tgoto EventScript_SoftboiledTaught\n\tend\n\nEventScript_SoftboiledDeclined::\n\tmsgbox Text_SoftboiledDeclined\n\trelease\n\tend\n\nEventScript_SoftboiledTaught::\n\tmsgbox Text_SoftboiledTaught\n\trelease\n\tend\n\nEventScript_SoftboiledReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_SoftboiledReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_SoftboiledReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SoftboiledDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SoftboiledNotEnoughMoney\n\tmsgbox Text_SoftboiledWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_SOFT_BOILED\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SoftboiledDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_SoftboiledTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_SoftboiledDeclined2::\n\tmsgbox Text_SoftboiledDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_SoftboiledNotEnoughMoney::\n\tmsgbox Text_SoftboiledNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nFuchsiaCity_EventScript_SubstituteTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_SUBSTITUTE, EventScript_SubstituteReteach\n\tmsgbox Text_SubstituteTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SubstituteDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SubstituteDeclined\n\tmsgbox Text_SubstituteWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_SUBSTITUTE\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SubstituteDeclined\n\tsetflag FLAG_TUTOR_SUBSTITUTE\n\tgoto EventScript_SubstituteTaught\n\tend\n\nEventScript_SubstituteDeclined::\n\tmsgbox Text_SubstituteDeclined\n\trelease\n\tend\n\nEventScript_SubstituteTaught::\n\tmsgbox Text_SubstituteTaught\n\trelease\n\tend\n\nEventScript_SubstituteReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_SubstituteReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_SubstituteReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SubstituteDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SubstituteNotEnoughMoney\n\tmsgbox Text_SubstituteWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_SUBSTITUTE\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SubstituteDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_SubstituteTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_SubstituteDeclined2::\n\tmsgbox Text_SubstituteDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_SubstituteNotEnoughMoney::\n\tmsgbox Text_SubstituteNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nSevenIsland_EventScript_SwordsDanceTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_SWORDS_DANCE, EventScript_SwordsDanceReteach\n\tmsgbox Text_SwordsDanceTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SwordsDanceDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SwordsDanceDeclined\n\tmsgbox Text_SwordsDanceWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_SWORDS_DANCE\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SwordsDanceDeclined\n\tsetflag FLAG_TUTOR_SWORDS_DANCE\n\tgoto EventScript_SwordsDanceTaught\n\tend\n\nEventScript_SwordsDanceDeclined::\n\tmsgbox Text_SwordsDanceDeclined\n\trelease\n\tend\n\nEventScript_SwordsDanceTaught::\n\tmsgbox Text_SwordsDanceTaught\n\trelease\n\tend\n\nEventScript_SwordsDanceReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_SwordsDanceReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_SwordsDanceReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SwordsDanceDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SwordsDanceNotEnoughMoney\n\tmsgbox Text_SwordsDanceWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_SWORDS_DANCE\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SwordsDanceDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_SwordsDanceTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_SwordsDanceDeclined2::\n\tmsgbox Text_SwordsDanceDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_SwordsDanceNotEnoughMoney::\n\tmsgbox Text_SwordsDanceNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nPewterCity_Museum_1F_EventScript_SeismicTossTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_SEISMIC_TOSS, EventScript_SeismicTossReteach\n\tmsgbox Text_SeismicTossTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SeismicTossDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SeismicTossDeclined\n\tmsgbox Text_SeismicTossWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_SEISMIC_TOSS\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SeismicTossDeclined\n\tsetflag FLAG_TUTOR_SEISMIC_TOSS\n\tgoto EventScript_SeismicTossTaught\n\tend\n\nEventScript_SeismicTossDeclined::\n\tmsgbox Text_SeismicTossDeclined\n\trelease\n\tend\n\nEventScript_SeismicTossTaught::\n\tmsgbox Text_SeismicTossTaught\n\trelease\n\tend\n\nEventScript_SeismicTossReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_SeismicTossReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_SeismicTossReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SeismicTossDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SeismicTossNotEnoughMoney\n\tmsgbox Text_SeismicTossWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_SEISMIC_TOSS\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SeismicTossDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_SeismicTossTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_SeismicTossDeclined2::\n\tmsgbox Text_SeismicTossDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_SeismicTossNotEnoughMoney::\n\tmsgbox Text_SeismicTossNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_CounterTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_COUNTER, EventScript_CounterReteach\n\tmsgbox Text_CounterTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_CounterDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_CounterDeclined\n\tmsgbox Text_CounterWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_COUNTER\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_CounterDeclined\n\tsetflag FLAG_TUTOR_COUNTER\n\tgoto EventScript_CounterTaught\n\tend\n\nEventScript_CounterDeclined::\n\tmsgbox Text_CounterDeclined\n\trelease\n\tend\n\nEventScript_CounterTaught::\n\tmsgbox Text_CounterTaught\n\trelease\n\tend\n\nEventScript_CounterReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_CounterReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_CounterReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_CounterDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_CounterNotEnoughMoney\n\tmsgbox Text_CounterWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_COUNTER\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_CounterDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_CounterTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_CounterDeclined2::\n\tmsgbox Text_CounterDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_CounterNotEnoughMoney::\n\tmsgbox Text_CounterNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_MetronomeTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_METRONOME, EventScript_MetronomeReteach\n\tmsgbox Text_MetronomeTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_MetronomeDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_MetronomeDeclined\n\tmsgbox Text_MetronomeWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_METRONOME\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_MetronomeDeclined\n\tsetflag FLAG_TUTOR_METRONOME\n\tgoto EventScript_MetronomeTaught\n\tend\n\nEventScript_MetronomeDeclined::\n\tmsgbox Text_MetronomeDeclined\n\trelease\n\tend\n\nEventScript_MetronomeTaught::\n\tmsgbox Text_MetronomeTaught\n\trelease\n\tend\n\nEventScript_MetronomeReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_MetronomeReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_MetronomeReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_MetronomeDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_MetronomeNotEnoughMoney\n\tmsgbox Text_MetronomeWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_METRONOME\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_MetronomeDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_MetronomeTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_MetronomeDeclined2::\n\tmsgbox Text_MetronomeDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_MetronomeNotEnoughMoney::\n\tmsgbox Text_MetronomeNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_MimicTutor::\n\tgoto_if_set FLAG_TUTOR_MIMIC, EventScript_MimicReteach\n\tmsgbox Text_MimicTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_MimicDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_MimicDeclined\n\tmsgbox Text_MimicWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_MIMIC\n\tcall EventScript_ChooseMoveTutorMon\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_RESULT, 0, EventScript_MimicDeclined\n\tremoveitem ITEM_POKE_DOLL, 1\n\tsetflag FLAG_TUTOR_MIMIC\n\tgoto EventScript_MimicTaught\n\tend\n\nEventScript_MimicDeclined::\n\tmsgbox Text_MimicDeclined\n\trelease\n\tend\n\nEventScript_MimicTaught::\n\tcheckplayergender\n\tcall_if_eq VAR_RESULT, MALE, EventScript_MimicTaughtMale\n\tcall_if_eq VAR_RESULT, FEMALE, EventScript_MimicTaughtFemale\n\trelease\n\tend\n\nEventScript_MimicTaughtMale::\n\tmsgbox Text_MimicTaughtMale\n\treturn\n\nEventScript_MimicTaughtFemale::\n\tmsgbox Text_MimicTaughtFemale\n\treturn\n\nEventScript_MimicReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_MimicReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_MimicReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_MimicDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_MimicNotEnoughMoney\n\tmsgbox Text_MimicWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_MIMIC\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_MimicDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tgoto EventScript_MimicTaught2\n\tend\n\nEventScript_MimicDeclined2::\n\tmsgbox Text_MimicDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_MimicNotEnoughMoney::\n\tmsgbox Text_MimicNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_MimicTaught2::\n\tcheckplayergender\n\tcall_if_eq VAR_RESULT, MALE, EventScript_MimicTaughtMale2\n\tcall_if_eq VAR_RESULT, FEMALE, EventScript_MimicTaughtFemale2\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_MimicTaughtMale2::\n\tmsgbox Text_MimicTaughtMale2\n\treturn\n\nEventScript_MimicTaughtFemale2::\n\tmsgbox Text_MimicTaughtFemale2\n\treturn\n\nFourIsland_House1_EventScript_BodySlamTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_TUTOR_BODY_SLAM, EventScript_BodySlamReteach\n\tmsgbox Text_BodySlamTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_BodySlamDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, EventScript_BodySlamDeclined\n\tmsgbox Text_BodySlamWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_BODY_SLAM\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_BodySlamDeclined\n\tsetflag FLAG_TUTOR_BODY_SLAM\n\tgoto EventScript_BodySlamTaught\n\tend\n\nEventScript_BodySlamDeclined::\n\tmsgbox Text_BodySlamDeclined\n\trelease\n\tend\n\nEventScript_BodySlamTaught::\n\tmsgbox Text_BodySlamTaught\n\trelease\n\tend\n\nEventScript_BodySlamReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_BodySlamReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_BodySlamReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_BodySlamDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_BodySlamNotEnoughMoney\n\tmsgbox Text_BodySlamWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_BODY_SLAM\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_BodySlamDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox Text_BodySlamTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_BodySlamDeclined2::\n\tmsgbox Text_BodySlamDeclined\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_BodySlamNotEnoughMoney::\n\tmsgbox Text_BodySlamNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\t\n.set LOCALID_CAPE_BRINK_TUTOR, 1\n\nTwoIsland_CapeBrink_House_EventScript_StarterTutor::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_LEARNED_ALL_MOVES_AT_CAPE_BRINK, CapeBrinkTutor_EventScript_TaughtAllMoves\n\tgoto_if_set FLAG_TEMP_2, CapeBrinkTutor_EventScript_MoveJustTaught\n\tbufferleadmonspeciesname STR_VAR_1\n\tmsgbox Text_UltimateMoveThatMon\n\tspecialvar VAR_RESULT, CapeBrinkGetMoveToTeachLeadPokemon\n\tgoto_if_eq VAR_RESULT, FALSE, CapeBrinkTutor_EventScript_NoLeadStarter\n\tcopyvar VAR_0x8009, VAR_0x8005\n\tcall_if_eq VAR_FACING, DIR_NORTH, CapeBrinkTutor_EventScript_JumpInPlaceDown\n\tcall_if_eq VAR_FACING, DIR_SOUTH, CapeBrinkTutor_EventScript_JumpInPlaceUp\n\tcall_if_eq VAR_FACING, DIR_EAST, CapeBrinkTutor_EventScript_JumpInPlaceLeft\n\tcall_if_eq VAR_FACING, DIR_WEST, CapeBrinkTutor_EventScript_JumpInPlaceRight\n\tmsgbox Text_AllowMeToTeachMonUltimateMove, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CapeBrinkTutor_EventScript_DeclineMove\n\tmsgbox Text_LetMeConferUltimateMove\n\tclosemessage\n\tfadescreen FADE_TO_BLACK\n\tgoto CapeBrinkTutor_EventScript_ChooseMon\n\n@ Unused\nCapeBrinkTutor_EventScript_FadeTaughtMove::\n\tfadescreen FADE_FROM_BLACK\n\tgoto CapeBrinkTutor_EventScript_TaughtMove\n\tend\n\nCapeBrinkTutor_EventScript_MoveJustTaught::\n\tmsgbox Text_MakeBestUseOfMove\n\trelease\n\tend\n\nCapeBrinkTutor_EventScript_TaughtAllMoves::\n\tmsgbox Text_FeelRejuvenated\n\tbufferleadmonspeciesname 0\n\tspecialvar VAR_RESULT, CapeBrinkGetMoveToTeachLeadPokemon\n\tgoto_if_eq VAR_RESULT, FALSE, CapeBrinkTutor_EventScript_NoLeadStarter2\n\tcopyvar VAR_0x8009, VAR_0x8005\n\tcall_if_eq VAR_FACING, DIR_NORTH, CapeBrinkTutor_EventScript_JumpInPlaceDown\n\tcall_if_eq VAR_FACING, DIR_SOUTH, CapeBrinkTutor_EventScript_JumpInPlaceUp\n\tcall_if_eq VAR_FACING, DIR_EAST, CapeBrinkTutor_EventScript_JumpInPlaceLeft\n\tcall_if_eq VAR_FACING, DIR_WEST, CapeBrinkTutor_EventScript_JumpInPlaceRight\n\tmsgbox Text_RightPokemon, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CapeBrinkTutor_EventScript_DeclineMove\n\tmsgbox Text_LetMeConferUltimateMove\n\tclosemessage\n\tfadescreen FADE_TO_BLACK\n\tgoto CapeBrinkTutor_EventScript_ChooseMon\n\trelease\n\tend\n\nCapeBrinkTutor_EventScript_NoLeadStarter2::\n\tmsgbox Text_NotTheRightPokemon\n\trelease\n\tend\n\nCapeBrinkTutor_EventScript_TaughtMove::\n\tcopyvar VAR_0x8005, VAR_0x8009\n\tspecialvar VAR_RESULT, HasLearnedAllMovesFromCapeBrinkTutor\n\tgoto_if_eq VAR_RESULT, TRUE, CapeBrinkTutor_EventScript_LearnedAllMoves\n\tmsgbox Text_TaughtMove\n\tsetflag FLAG_TEMP_2\n\trelease\n\tend\n\nCapeBrinkTutor_EventScript_LearnedAllMoves::\n\tmsgbox Text_PassedOnEverythingIKnow\n\tsetflag FLAG_LEARNED_ALL_MOVES_AT_CAPE_BRINK\n\trelease\n\tend\n\nCapeBrinkTutor_EventScript_ChooseMon::\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, CapeBrinkTutor_EventScript_DeclineMove\n\tgoto CapeBrinkTutor_EventScript_TaughtMove\n\tend\n\nCapeBrinkTutor_EventScript_JumpInPlaceDown::\n\tapplymovement LOCALID_CAPE_BRINK_TUTOR, Movement_JumpInPlaceDown\n\twaitmovement 0\n\treturn\n\nCapeBrinkTutor_EventScript_JumpInPlaceUp::\n\tapplymovement LOCALID_CAPE_BRINK_TUTOR, Movement_JumpInPlaceUp\n\twaitmovement 0\n\treturn\n\nCapeBrinkTutor_EventScript_JumpInPlaceLeft::\n\tapplymovement LOCALID_CAPE_BRINK_TUTOR, Movement_JumpInPlaceLeft\n\twaitmovement 0\n\treturn\n\nCapeBrinkTutor_EventScript_JumpInPlaceRight::\n\tapplymovement LOCALID_CAPE_BRINK_TUTOR, Movement_JumpInPlaceRight\n\twaitmovement 0\n\treturn\n\nCapeBrinkTutor_EventScript_DeclineMove::\n\tmsgbox Text_YouRejectIt\n\trelease\n\tend\n\nCapeBrinkTutor_EventScript_NoLeadStarter::\n\tmsgbox Text_JustMistaken\n\trelease\n\tend\n\nEventScript_ChooseMoveTutorMon::\n\tspecial ChooseMonForMoveTutor\n\twaitstate\n\tlock\n\tfaceplayer\n\treturn\n\nEventScript_CanOnlyBeLearnedOnce::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial DisableMsgBoxWalkaway\n\tsignmsg\n\tmsgbox Text_MoveCanOnlyBeLearnedOnce, MSGBOX_YESNO\n\tnormalmsg\n\tcall EventScript_RestorePrevTextColor\n\treturn\n\nMovement_JumpInPlaceDown:\n\tjump_in_place_down\n\tstep_end\n\nMovement_JumpInPlaceUp:\n\tjump_in_place_up\n\tstep_end\n\nMovement_JumpInPlaceLeft:\n\tjump_in_place_left\n\tstep_end\n\nMovement_JumpInPlaceRight:\n\tjump_in_place_right\n\tstep_end\n\nVermilionCity_House2_EventScript_FuryCutterTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER, EventScript_FuryCutterReteach\n\tmsgbox MoveTutor_Text_FuryCutterTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_FuryCutterDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_FuryCutterDeclined\n\tmsgbox MoveTutor_Text_FuryCutterWhichMon, MSGBOX_DEFAULT\n\tsetvar VAR_0x8005, MOVETUTOR_FURY_CUTTER\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_FuryCutterDeclined\n\tsetflag FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER\n\tgoto MoveTutor_EventScript_FuryCutterTaught\n\tend\n\nMoveTutor_EventScript_FuryCutterDeclined::\n\tmsgbox MoveTutor_Text_FuryCutterDeclined, MSGBOX_DEFAULT\n\trelease\n\tend\n\nMoveTutor_EventScript_FuryCutterTaught::\n\tmsgbox MoveTutor_Text_FuryCutterTaught, MSGBOX_DEFAULT\n\trelease\n\tend\n\nEventScript_FuryCutterReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_FuryCutterReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_FuryCutterReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_FuryCutterDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_FuryCutterNotEnoughMoney\n\tmsgbox MoveTutor_Text_FuryCutterWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_FURY_CUTTER\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_FuryCutterDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox MoveTutor_Text_FuryCutterTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_FuryCutterNotEnoughMoney::\n\tmsgbox Text_FuryCutterNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_FuryCutterDeclined2::\n\tmsgbox MoveTutor_Text_FuryCutterDeclined\n\thidemoneybox\n\trelease\n\tend\n\nMoveTutor_Text_FuryCutterTeach:\n\t.string \"There's a move that gets stronger\\n\"\n\t.string \"when you keep using it in a row.\\p\"\n\t.string \"It's a BUG-type move, and it is\\n\"\n\t.string \"wickedly cool.\\p\"\n\t.string \"It's called FURY CUTTER.\\n\"\n\t.string \"Want me to teach it to a POKéMON?$\"\n\nMoveTutor_Text_FuryCutterDeclined:\n\t.string \"We're not on the same wavelength.$\"\n\nMoveTutor_Text_FuryCutterWhichMon:\n\t.string \"Yay!\\n\"\n\t.string \"Show me the POKéMON I should teach.$\"\n\nMoveTutor_Text_FuryCutterTaught:\n\t.string \"I get a thrill watching to see if\\n\"\n\t.string \"the move keeps hitting in succession!$\"\n\nText_FuryCutterReteach::\n\t.string \"You want your POKéMON to learn\\n\"\n\t.string \"FURY CUTTER over and over so they\\l\"\n\t.string \"can keep using it over and over?\\p\"\n\t.string \"I can teach you FURY CUTTER\\n\"\n\t.string \"again if you give me ¥5000.$\"\n\nText_FuryCutterReteach2::\n    .string \"Want me to teach FURY CUTTER\\n\"\n    .string \"to a POKéMON?$\"\n\nText_FuryCutterNotEnoughMoney::\n\t.string \"I can't teach FURY CUTTER over\\n\"\n\t.string \"and over if you can't pay!\\p\"\n\t.string \"Come back with ¥5000 next\\n\"\n\t.string \"time and I'll teach it again.$\"\n\nRoute24_EventScript_RolloutTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT, EventScript_RolloutReteach\n\tmsgbox MoveTutor_Text_RolloutTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_RolloutDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_RolloutDeclined\n\tmsgbox MoveTutor_Text_RolloutWhichMon, MSGBOX_DEFAULT\n\tsetvar VAR_0x8005, MOVETUTOR_ROLLOUT\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_RolloutDeclined\n\tsetflag FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT\n\tgoto MoveTutor_EventScript_RolloutTaught\n\tend\n\nMoveTutor_EventScript_RolloutDeclined::\n\tmsgbox MoveTutor_Text_RolloutDeclined, MSGBOX_DEFAULT\n\trelease\n\tend\n\nMoveTutor_EventScript_RolloutTaught::\n\tmsgbox MoveTutor_Text_RolloutTaught, MSGBOX_DEFAULT\n\trelease\n\tend\n\nEventScript_RolloutReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_RolloutReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_RolloutReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_RolloutDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_RolloutNotEnoughMoney\n\tmsgbox MoveTutor_Text_RolloutWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_ROLLOUT\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_RolloutDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox MoveTutor_Text_RolloutTaught\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_RolloutNotEnoughMoney::\n\tmsgbox Text_RolloutNotEnoughMoney\n\thidemoneybox\n\trelease\n\tend\n\nEventScript_RolloutDeclined2::\n\tmsgbox MoveTutor_Text_RolloutDeclined\n\thidemoneybox\n\trelease\n\tend\n\nMoveTutor_Text_RolloutTeach:\n\t.string \"Did you know that you can go from\\n\"\n\t.string \"here a long way in that direction\\l\"\n\t.string \"without changing direction?\\p\"\n\t.string \"I might even be able to roll\\n\"\n\t.string \"that way.\\p\"\n\t.string \"Do you think your POKéMON will\\n\"\n\t.string \"want to roll, too?\\p\"\n\t.string \"I can teach one the move ROLLOUT\\n\"\n\t.string \"if you'd like.$\"\n\nMoveTutor_Text_RolloutDeclined:\n\t.string \"You don't need to be shy about it.\\n\"\n\t.string \"Let's roll!$\"\n\nMoveTutor_Text_RolloutWhichMon:\n\t.string \"Ehehe, sure thing! It'd be great if\\n\"\n\t.string \"the POKéMON looked like me.$\"\n\nMoveTutor_Text_RolloutTaught:\n\t.string \"Rolling around in the grass makes me\\n\"\n\t.string \"happy. Come on, let's roll!$\"\n\nText_RolloutReteach::\n\t.string \"I wonder if I could roll down\\n\"\n\t.string \"NUGGET BRIDGE to CERULEAN…\\p\"\n\t.string \"Oh, do you want me to teach\\n\"\n\t.string \"ROLLOUT to your POKéMON again?\\p\"\n\t.string \"I can do it, but I have to charge\\n\"\n\t.string \"¥5000 for my services!$\"\n\nText_RolloutReteach2::\n    .string \"Want me to teach ROLLOUT\\n\"\n    .string \"to one of your POKéMON?$\"\n\nText_RolloutNotEnoughMoney::\n\t.string \"Whoa!\\n\"\n\t.string \"Hold on a minute!\\p\"\n\t.string \"How can I teach you ROLLOUT if\\n\"\n\t.string \"you don't have a bankroll to pay\\l\"\n\t.string \"me with?\\p\"\n\t.string \"Come back to me with ¥5000 and\\n\"\n\t.string \"we'll get your POKéMON rolling!$\"\n\nSaffronCity_EventScript_DynamicPunchTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH, EventScript_DynamicPunchReteach\n\tmsgbox MoveTutor_Text_DynamicPunchTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_DynamicPunchDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_DynamicPunchDeclined\n\tmsgbox MoveTutor_Text_DynamicPunchWhichMon, MSGBOX_DEFAULT\n\tsetvar VAR_0x8005, MOVETUTOR_DYNAMIC_PUNCH\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_DynamicPunchDeclined\n\tsetflag FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH\n\tgoto MoveTutor_EventScript_DynamicPunchTaught\n\tturnobject 19, DIR_NORTH\n\tend\n\nMoveTutor_EventScript_DynamicPunchDeclined::\n\tmsgbox MoveTutor_Text_DynamicPunchDeclined, MSGBOX_DEFAULT\n\trelease\n\tturnobject 19, DIR_NORTH\n\tend\n\nMoveTutor_EventScript_DynamicPunchTaught::\n\tmsgbox MoveTutor_Text_DynamicPunchTaught, MSGBOX_DEFAULT\n\trelease\n\tturnobject 19, DIR_NORTH\n\tend\n\nEventScript_DynamicPunchReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_DynamicPunchReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_DynamicPunchReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_DynamicPunchDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_DynamicPunchNotEnoughMoney\n\tmsgbox MoveTutor_Text_DynamicPunchWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_DYNAMIC_PUNCH\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_DynamicPunchDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox MoveTutor_Text_DynamicPunchTaught\n\thidemoneybox\n\trelease\n\tturnobject 19, DIR_NORTH\n\tend\n\nEventScript_DynamicPunchNotEnoughMoney::\n\tmsgbox Text_DynamicPunchNotEnoughMoney\n\thidemoneybox\n\trelease\n\tturnobject 19, DIR_NORTH\n\tend\n\nEventScript_DynamicPunchDeclined2::\n\tmsgbox MoveTutor_Text_DynamicPunchDeclined\n\thidemoneybox\n\trelease\n\tturnobject 19, DIR_NORTH\n\tend\n\nMoveTutor_Text_DynamicPunchTeach:\n\t.string \"I can't do this anymore!\\p\"\n\t.string \"It's utterly hopeless!\\p\"\n\t.string \"I'm a FIGHTING-type TRAINER,\\n\"\n\t.string \"so I can't win at the SAFFRON GYM\\l\"\n\t.string \"no matter how hard I try!\\p\"\n\t.string \"Argh! Punch! Punch! Punch!\\n\"\n\t.string \"Punch! Punch! Punch!\\p\"\n\t.string \"What, don't look at me that way!\\n\"\n\t.string \"I'm only hitting the wall!\\p\"\n\t.string \"Or do you want me to teach your\\n\"\n\t.string \"POKéMON DYNAMICPUNCH?$\"\n\nMoveTutor_Text_DynamicPunchDeclined:\n\t.string \"Darn! You're even making fun of me?\\n\"\n\t.string \"Punch! Punch! Punch!$\"\n\nMoveTutor_Text_DynamicPunchWhichMon:\n\t.string \"What? You do? You're a good person!\\n\"\n\t.string \"Which POKéMON should I teach?$\"\n\nMoveTutor_Text_DynamicPunchTaught:\n\t.string \"I want you to win at the SAFFRON\\n\"\n\t.string \"GYM using that DYNAMICPUNCH!$\"\n\nText_DynamicPunchReteach::\n\t.string \"Argh! Punch! Punch! Punch!\\n\"\n\t.string \"Punch! Punch! Punch!\\p\"\n\t.string \"I'm still so frustrated about\\n\"\n\t.string \"losing in the GYM!\\p\"\n\t.string \"Do you want me to teach your\\n\"\n\t.string \"POKéMON DYNAMICPUNCH again?\\p\"\n\t.string \"I'll do it for ¥5000!\\n\"\n\t.string \"I need to buy REVIVES!$\"\n\nText_DynamicPunchReteach2::\n    .string \"Do you want me to teach your\\n\"\n\t.string \"POKéMON DYNAMICPUNCH?$\"\n\nText_DynamicPunchNotEnoughMoney::\n\t.string \"Are you mocking me for needing\\n\"\n\t.string \"money for POKéMON medicine?\\p\"\n\t.string \"Using items in battle is the only\\n\"\n\t.string \"possible way I can win here!\\p\"\n\t.string \"Let me know when you have ¥5000.\\n\"\n\t.string \"Until then…\\p\"\n\t.string \"Argh! Punch! Punch! Punch!\\n\"\n\t.string \"Punch! Punch! Punch!$\"\n\nSilphCo_9F_EventScript_SleepTalkTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK, EventScript_SleepTalkReteach\n\tmsgbox MoveTutor_Text_SleepTalkTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SleepTalkDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SleepTalkDeclined\n\tmsgbox MoveTutor_Text_SleepTalkWhichMon, MSGBOX_DEFAULT\n\tsetvar VAR_0x8005, MOVETUTOR_SLEEP_TALK\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_SleepTalkDeclined\n\tsetflag FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK\n\tgoto MoveTutor_EventScript_SleepTalkTaught\n\tturnobject 16, DIR_EAST\n\tend\n\nMoveTutor_EventScript_SleepTalkDeclined::\n\tmsgbox MoveTutor_Text_SleepTalkDeclined, MSGBOX_DEFAULT\n\trelease\n\tturnobject 16, DIR_EAST\n\tend\n\nMoveTutor_EventScript_SleepTalkTaught::\n\tmsgbox MoveTutor_Text_SleepTalkTaught, MSGBOX_DEFAULT\n\trelease\n\tturnobject 16, DIR_EAST\n\tend\n\nEventScript_SleepTalkReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_SleepTalkReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_SleepTalkReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SleepTalkDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SleepTalkNotEnoughMoney\n\tmsgbox MoveTutor_Text_SleepTalkWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_SLEEP_TALK\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_SleepTalkDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox MoveTutor_Text_SleepTalkTaught\n\thidemoneybox\n\trelease\n\tturnobject 16, DIR_EAST\n\tend\n\nEventScript_SleepTalkNotEnoughMoney::\n\tmsgbox Text_SleepTalkNotEnoughMoney\n\thidemoneybox\n\trelease\n\tturnobject 16, DIR_EAST\n\tend\n\nEventScript_SleepTalkDeclined2::\n\tmsgbox MoveTutor_Text_SleepTalkDeclined\n\thidemoneybox\n\trelease\n\tturnobject 16, DIR_EAST\n\tend\n\nMoveTutor_Text_SleepTalkTeach:\n\t.string \"…ZZZ…\\n\"\n\t.string \"…Zzz…zzz…\\p\"\n\t.string \"Mrr… mhm…\\n\"\n\t.string \"use… mmm…\\p\"\n\t.string \"Oh!\\n\"\n\t.string \"Was I talking in my sleep?\\p\"\n\t.string \"I was dreaming that I wanted\\n\"\n\t.string \"my POKéMON to use a move,\\l\"\n\t.string \"but it was asleep!\\p\"\n\t.string \"I can teach your POKéMON how\\n\"\n\t.string \"to SLEEP TALK so they can attack\\l\"\n\t.string \"while sleeping if you want.\\p\"\n\t.string \"Are you interested in teaching\\n\"\n\t.string \"your POKéMON SLEEP TALK?$\"\n\nMoveTutor_Text_SleepTalkDeclined:\n\t.string \"Oh, fine, fine.\\p\"\n\t.string \"Then back to my nap, I still have\\n\"\n\t.string \"some time left on my break!$\"\n\nMoveTutor_Text_SleepTalkWhichMon:\n\t.string \"Okay!\\n\"\n\t.string \"Which POKéMON should I teach?$\"\n\nMoveTutor_Text_SleepTalkTaught:\n\t.string \"Now that POKéMON can attack\\n\"\n\t.string \"while sleeping with SLEEP TALK!\\p\"\n\t.string \"I wonder if humans can SLEEP TALK\\n\"\n\t.string \"to nap while working?\\p\"\n\t.string \"Yawn…\\n\"\n\t.string \"…Zzz…zzz…$\"\n\nText_SleepTalkReteach::\n\t.string \"…ZZZ…\\n\"\n\t.string \"…Huh?\\l\"\n\t.string \"…Oh, you're back.\\p\"\n\t.string \"Yawn… Do you want me to teach\\n\"\n\t.string \"your POKéMON SLEEP TALK again?\\p\"\n\t.string \"I lost my bonus by always\\n\"\n\t.string \"oversleeping on my breaks…\\p\"\n\t.string \"I'll do it for some extra money.\\n\"\n\t.string \"How does ¥5000 sound?$\"\n\nText_SleepTalkReteach2::\n    .string \"Are you interested in teaching\\n\"\n\t.string \"your POKéMON SLEEP TALK?$\"\n\nText_SleepTalkNotEnoughMoney::\n\t.string \"Oh, you don't have enough money.\\n\"\n\t.string \"Why don't you think up some way\\l\"\n\t.string \"to make some and come back later?\\p\"\n\t.string \"Now, if you'll excuse me…\\n\"\n\t.string \"…Zzz…zzz…$\"\n\nSilphCo_9F_EventScript_NightmareTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_MOVE_TUTOR_TAUGHT_NIGHTMARE, EventScript_NightmareReteach\n\tmsgbox MoveTutor_Text_NightmareTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_NightmareDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_NightmareDeclined\n\tmsgbox MoveTutor_Text_NightmareWhichMon, MSGBOX_DEFAULT\n\tsetvar VAR_0x8005, MOVETUTOR_NIGHTMARE\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_NightmareDeclined\n\tsetflag FLAG_MOVE_TUTOR_TAUGHT_NIGHTMARE\n\tgoto MoveTutor_EventScript_NightmareTaught\n\tturnobject 17, DIR_SOUTH\n\tend\n\nMoveTutor_EventScript_NightmareDeclined::\n\tmsgbox MoveTutor_Text_NightmareDeclined, MSGBOX_DEFAULT\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nMoveTutor_EventScript_NightmareTaught::\n\tmsgbox MoveTutor_Text_NightmareTaught, MSGBOX_DEFAULT\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nEventScript_NightmareReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_NightmareReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_NightmareReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_NightmareDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_NightmareNotEnoughMoney\n\tmsgbox MoveTutor_Text_NightmareWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_NIGHTMARE\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_NightmareDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox MoveTutor_Text_NightmareTaught\n\thidemoneybox\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nEventScript_NightmareNotEnoughMoney::\n\tmsgbox Text_NightmareNotEnoughMoney\n\thidemoneybox\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nEventScript_NightmareDeclined2::\n\tmsgbox MoveTutor_Text_NightmareDeclined\n\thidemoneybox\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nMoveTutor_Text_NightmareTeach:\n\t.string \"Waaah!\\n\"\n\t.string \"Oh no, not another one…\\p\"\n\t.string \"I keep having nightmares that\\n\"\n\t.string \"TEAM ROCKET comes back and locks\\l\"\n\t.string \"me up again.\\p\"\n\t.string \"I haven't had a good night's sleep\\n\"\n\t.string \"since they took over.\\p\"\n\t.string \"I can teach your POKéMON to give\\n\"\n\t.string \"nightmares just like TEAM ROCKET.$\"\n\t.string \"Do you want your POKéMON\\n\"\n\t.string \"to learn NIGHTMARE?$\"\n\nMoveTutor_Text_NightmareDeclined:\n\t.string \"You don't want to risk it\\n\"\n\t.string \"giving you nightmares too?$\"\n\nMoveTutor_Text_NightmareWhichMon:\n\t.string \"Alright.\\n\"\n\t.string \"Which POKéMON should learn it?$\"\n\nMoveTutor_Text_NightmareTaught:\n\t.string \"Now that POKéMON can inflict\\n\"\n\t.string \"nightmares on sleeping foes.\\p\"\n\t.string \"Now if only I could find some\\n\"\n\t.string \"way of getting rid of my nightmares…$\"\n\nText_NightmareReteach::\n\t.string \"Ahh!\\n\"\n\t.string \"Ugh, again?\\p\"\n\t.string \"I thought that napping at work\\n\"\n\t.string \"where it all happened might cure\\l\"\n\t.string \"my nightmares, but…\\p\"\n\t.string \"Are you back to teach your\\n\"\n\t.string \"POKéMON NIGHTMARE again?\\p\"\n\t.string \"If you have ¥5000, I'll show\\n\"\n\t.string \"one of them how to use it.$\"\n\nText_NightmareReteach2::\n    .string \"Do you want your POKéMON\\n\"\n\t.string \"to learn NIGHTMARE?$\"\n\nText_NightmareNotEnoughMoney::\n\t.string \"You don't have ¥5000?\\p\"\n\t.string \"I don't want to keep reliving\\n\"\n\t.string \"these nightmares for nothing.\\p\"\n\t.string \"Come back when you can pay me\\n\"\n\t.string \"the full amount, okay?$\"\n\nCinnabarIsland_PokemonLab_ExperimentRoom_EventScript_SelfdestructTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_MOVE_TUTOR_TAUGHT_SELFDESTRUCT, EventScript_SelfdestructReteach\n\tmsgbox MoveTutor_Text_SelfdestructTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SelfdestructDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SelfdestructDeclined\n\tmsgbox MoveTutor_Text_SelfdestructWhichMon, MSGBOX_DEFAULT\n\tsetvar VAR_0x8005, MOVETUTOR_SELF_DESTRUCT\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_SelfdestructDeclined\n\tsetflag FLAG_MOVE_TUTOR_TAUGHT_SELFDESTRUCT\n\tgoto MoveTutor_EventScript_SelfdestructTaught\n\tturnobject 17, DIR_SOUTH\n\tend\n\nMoveTutor_EventScript_SelfdestructDeclined::\n\tmsgbox MoveTutor_Text_SelfdestructDeclined, MSGBOX_DEFAULT\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nMoveTutor_EventScript_SelfdestructTaught::\n\tmsgbox MoveTutor_Text_SelfdestructTaught, MSGBOX_DEFAULT\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nEventScript_SelfdestructReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_SelfdestructReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_SelfdestructReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SelfdestructDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SelfdestructNotEnoughMoney\n\tmsgbox MoveTutor_Text_SelfdestructWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_SELF_DESTRUCT\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_SelfdestructDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox MoveTutor_Text_SelfdestructTaught\n\thidemoneybox\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nEventScript_SelfdestructNotEnoughMoney::\n\tmsgbox Text_SelfdestructNotEnoughMoney\n\thidemoneybox\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nEventScript_SelfdestructDeclined2::\n\tmsgbox MoveTutor_Text_SelfdestructDeclined\n\thidemoneybox\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nMoveTutor_Text_SelfdestructTeach:\n\t.string \"There's no doubt about it.\\n\"\n\t.string \"I've run the tests a hundred times.\\p\"\n\t.string \"The volcano that sleeps beneath us\\n\"\n\t.string \"isn't asleep at all!\\p\"\n\t.string \"It'll erupt and destroy this entire\\n\"\n\t.string \"town within three years for sure!\\p\"\n\t.string \"It'll be like the whole island\\n\"\n\t.string \"self-destructed in a fiery inferno!\\p\"\n\t.string \"POKéMON can use a similar move to\\n\"\n\t.string \"explode and deal damage, actually.\\p\"\n\t.string \"Do you want me to teach your\\n\"\n\t.string \"POKéMON how to use SELFDESTRUCT?$\"\n\nMoveTutor_Text_SelfdestructDeclined:\n\t.string \"Is SELFDESTRUCT too risky for\\n\"\n\t.string \"you to use in battle?$\"\n\nMoveTutor_Text_SelfdestructWhichMon:\n\t.string \"So which POKéMON should learn\\n\"\n\t.string \"this high-risk move?$\"\n\nMoveTutor_Text_SelfdestructTaught:\n\t.string \"Now the terrifying power of\\n\"\n\t.string \"SELFDESTRUCT is yours to command!\\p\"\n\t.string \"We won't be able to control the\\n\"\n\t.string \"volcano in the same way, though…\\p\"\n\t.string \"The only thing to do now is start\\n\"\n\t.string \"making evacuation plans.\\p\"\n\t.string \"Let's hope you're standing on some\\n\"\n\t.string \"other rock in three years' time!$\"\n\nText_SelfdestructReteach::\n\t.string \"When the volcano goes, we'll\\n\"\n\t.string \"have to save our equipment…\\l\"\n\t.string \"Oh, hello again!\\p\"\n\t.string \"I'm just planning for the imminent\\n\"\n\t.string \"destruction of everything here.\\p\"\n\t.string \"Do you want to learn SELFDESTRUCT\\n\"\n\t.string \"again before the inevitable occurs?\\p\"\n\t.string \"I'm taking donations for the\\n\"\n\t.string \"evacuation plans.\\p\"\n\t.string \"Donate ¥5000 and I'll teach one of\\n\"\n\t.string \"your POKéMON SELFDESTRUCT.$\"\n\nText_SelfdestructReteach2::\n    .string \"Do you want me to teach your\\n\"\n\t.string \"POKéMON how to use SELFDESTRUCT?$\"\n\nText_SelfdestructNotEnoughMoney::\n\t.string \"We need every bit of financial\\n\"\n\t.string \"support we can get to prepare\\l\"\n\t.string \"for the eruption.\\p\"\n\t.string \"I can't offer you my services\\n\"\n\t.string \"for less than a ¥5000 donation.$\"\n\nMtEmber_Exterior_EventScript_SkyAttackTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_MOVE_TUTOR_TAUGHT_SKY_ATTACK, EventScript_SkyAttackReteach\n\tmsgbox MoveTutor_Text_SkyAttackTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SkyAttackDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SkyAttackDeclined\n\tmsgbox MoveTutor_Text_SkyAttackWhichMon, MSGBOX_DEFAULT\n\tsetvar VAR_0x8005, MOVETUTOR_SKY_ATTACK\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_SkyAttackDeclined\n\tsetflag FLAG_MOVE_TUTOR_TAUGHT_SKY_ATTACK\n\tgoto MoveTutor_EventScript_SkyAttackTaught\n\tturnobject 17, DIR_SOUTH\n\tend\n\nMoveTutor_EventScript_SkyAttackDeclined::\n\tmsgbox MoveTutor_Text_SkyAttackDeclined, MSGBOX_DEFAULT\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nMoveTutor_EventScript_SkyAttackTaught::\n\tmsgbox MoveTutor_Text_SkyAttackTaught, MSGBOX_DEFAULT\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nEventScript_SkyAttackReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_SkyAttackReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_SkyAttackReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SkyAttackDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SkyAttackNotEnoughMoney\n\tmsgbox MoveTutor_Text_SkyAttackWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_SKY_ATTACK\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_SkyAttackDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox MoveTutor_Text_SkyAttackTaught\n\thidemoneybox\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nEventScript_SkyAttackNotEnoughMoney::\n\tmsgbox Text_SkyAttackNotEnoughMoney\n\thidemoneybox\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nEventScript_SkyAttackDeclined2::\n\tmsgbox MoveTutor_Text_SkyAttackDeclined\n\thidemoneybox\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nMoveTutor_Text_SkyAttackTeach:\n\t.string \"We're so high up, it's like we can\\n\"\n\t.string \"touch the sky.\\p\"\n\t.string \"Bird POKéMON must feel like\\n\"\n\t.string \"this all the time…\\p\"\n\t.string \"How, you ask?\\n\"\n\t.string \"Do you not know?\\p\"\n\t.string \"They can learn a move that brings\\n\"\n\t.string \"the sky crashing down on others!\\p\"\n\t.string \"Would you like me to teach your\\n\"\n\t.string \"POKéMON SKY ATTACK?$\"\n\nMoveTutor_Text_SkyAttackDeclined:\n\t.string \"I suppose not everyone wants\\n\"\n\t.string \"to touch the sky.$\"\n\nMoveTutor_Text_SkyAttackWhichMon:\n\t.string \"Who should learn SKY ATTACK?$\"\n\nMoveTutor_Text_SkyAttackTaught:\n\t.string \"SKY ATTACK is the ultimate\\n\"\n\t.string \"FLYING-type move.\\p\"\n\t.string \"Your POKéMON will make good\\n\"\n\t.string \"use of its power, I'm sure.$\"\n\nText_SkyAttackReteach::\n\t.string \"Did you climb all the way back up\\n\"\n\t.string \"here again for the thrill?\\p\"\n\t.string \"Being this close to the sky\\n\"\n\t.string \"feels amazing, right?\\p\"\n\t.string \"If you're interested, I can\\n\"\n\t.string \"teach your POKéMON SKY ATTACK.\\p\"\n\t.string \"This time, though, I'll need ¥5000\\n\"\n\t.string \"to do it!$\"\n\nText_SkyAttackReteach2::\n\t.string \"Would you like me to teach your\\n\"\n\t.string \"POKéMON SKY ATTACK?$\"\n\nText_SkyAttackNotEnoughMoney::\n\t.string \"You don't have enough money,\\n\"\n\t.string \"what a shame.\\p\"\n\t.string \"You'll have to climb back up here\\n\"\n\t.string \"again once you have ¥5000!$\"\n\nRoute10_EventScript_SwaggerTutor::\n\tlock\n\tfaceplayer\n\tgoto_if_set FLAG_MOVE_TUTOR_TAUGHT_SWAGGER, EventScript_SwaggerReteach\n\tmsgbox MoveTutor_Text_SwaggerTeach, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SwaggerDeclined\n\tcall EventScript_CanOnlyBeLearnedOnce\n\tgoto_if_eq VAR_RESULT, NO, MoveTutor_EventScript_SwaggerDeclined\n\tmsgbox MoveTutor_Text_SwaggerWhichMon, MSGBOX_DEFAULT\n\tsetvar VAR_0x8005, MOVETUTOR_SWAGGER\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, 0, MoveTutor_EventScript_SwaggerDeclined\n\tsetflag FLAG_MOVE_TUTOR_TAUGHT_SWAGGER\n\tgoto MoveTutor_EventScript_SwaggerTaught\n\tturnobject 17, DIR_SOUTH\n\tend\n\nMoveTutor_EventScript_SwaggerDeclined::\n\tmsgbox MoveTutor_Text_SwaggerDeclined, MSGBOX_DEFAULT\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nMoveTutor_EventScript_SwaggerTaught::\n\tmsgbox MoveTutor_Text_SwaggerTaught, MSGBOX_DEFAULT\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nEventScript_SwaggerReteach::\n\tlock\n\tfaceplayer\n\tmsgbox Text_SwaggerReteach\n\tshowmoneybox 0, 0\n\tmsgbox Text_SwaggerReteach2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_SwaggerDeclined2\n\tcheckmoney 5000, 0\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_SwaggerNotEnoughMoney\n\tmsgbox MoveTutor_Text_SwaggerWhichMon\n\tsetvar VAR_0x8005, MOVETUTOR_SWAGGER\n\tcall EventScript_ChooseMoveTutorMon\n\tgoto_if_eq VAR_RESULT, FALSE, MoveTutor_EventScript_SwaggerDeclined\n\tshowmoneybox 0, 0\n\tremovemoney 5000\n\tupdatemoneybox\n\tmsgbox MoveTutor_Text_SwaggerTaught\n\thidemoneybox\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nEventScript_SwaggerNotEnoughMoney::\n\tmsgbox Text_SwaggerNotEnoughMoney\n\thidemoneybox\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nEventScript_SwaggerDeclined2::\n\tmsgbox MoveTutor_Text_SwaggerDeclined\n\thidemoneybox\n\trelease\n\tturnobject 17, DIR_SOUTH\n\tend\n\nMoveTutor_Text_SwaggerTeach:\n\t.string \"Heh! My POKéMON totally rules!\\n\"\n\t.string \"It's cooler than any POKéMON!\\p\"\n\t.string \"I was lipping off with a swagger in\\n\"\n\t.string \"my step like that when some guy\\l\"\n\t.string \"named {RIVAL} challenged me.\\p\"\n\t.string \"He beat us without any effort and\\n\"\n\t.string \"took the swagger out of my step.\\p\"\n\t.string \"If you'd like, I'll teach the move\\n\"\n\t.string \"SWAGGER to a POKéMON of yours.$\"\n\nMoveTutor_Text_SwaggerDeclined:\n\t.string \"What, no? Can't you get into\\n\"\n\t.string \"the spirit of things?$\"\n\nMoveTutor_Text_SwaggerWhichMon:\n\t.string \"All right, which POKéMON wants to\\n\"\n\t.string \"learn how to SWAGGER?$\"\n\nMoveTutor_Text_SwaggerTaught:\n\t.string \"I'll just praise my POKéMON from\\n\"\n\t.string \"now on without the swagger.$\"\n\nText_SwaggerReteach::\n\t.string \"I've been humbled by losing\\n\"\n\t.string \"so badly to that {RIVAL} guy.\\p\"\n\t.string \"But I still know how to walk\\n\"\n\t.string \"with a swagger in my step!\\p\"\n\t.string \"I can teach your POKéMON how\\n\"\n\t.string \"to use SWAGGER again.\\p\"\n\t.string \"However, the price of learning how\\n\"\n\t.string \"to swagger like me is a cool ¥5000.$\"\n\nText_SwaggerReteach2::\n\t.string \"Do you want me to teach the move\\n\"\n\t.string \"SWAGGER to a POKéMON of yours?$\"\n\nText_SwaggerNotEnoughMoney::\n\t.string \"No money, no SWAGGER!\\n\"\n\t.string \"Come back with ¥5000 next time!$\"\n"
  },
  {
    "path": "data/scripts/movement.inc",
    "content": "Common_Movement_QuestionMark::\n\temote_question_mark\n\tstep_end\n\nCommon_Movement_ExclamationMark::\n\temote_exclamation_mark\n\tstep_end\n\nCommon_Movement_Delay48::\n\tdelay_16\n\tdelay_16\n\tdelay_16\n\tstep_end\n\nCommon_Movement_FacePlayer::\n\tface_player\n\tstep_end\n\n@ Unused\nCommon_Movement_FaceAwayPlayer::\n\tface_away_player\n\tstep_end\n\nCommon_Movement_FaceOriginalDirection::\n\tface_original_direction\n\tstep_end\n\nCommon_Movement_WalkInPlaceFasterLeft::\n\twalk_in_place_faster_left\n\tstep_end\n\nCommon_Movement_WalkInPlaceFasterUp::\n\twalk_in_place_faster_up\n\tstep_end\n\nCommon_Movement_WalkInPlaceFasterRight::\n\twalk_in_place_faster_right\n\tstep_end\n\nCommon_Movement_WalkInPlaceFasterDown::\n\twalk_in_place_faster_down\n\tstep_end\n\nCommon_Movement_FaceRight::\n\tface_right\n\tstep_end\n\nCommon_Movement_FaceDown::\n\tface_down\n\tstep_end\n\nCommon_Movement_WalkUp5::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\n@ Unused\nCommon_Movement_WalkUp4::\n\twalk_up\n\twalk_up\n\twalk_up\n\twalk_up\n\tstep_end\n\nCommon_Movement_Delay32::\n\tdelay_16\n\tdelay_16\n\tstep_end\n\n@ Unused\nCommon_Movement_WalkUp::\n\twalk_up\n\tstep_end\n\n@ Unused\nCommon_Movement_WalkUp2::\n\twalk_up\n\twalk_up\n\tstep_end\n"
  },
  {
    "path": "data/scripts/mystery_event_club.inc",
    "content": ".equ GAVE_PROFILE,  VAR_TEMP_1\n\nMysteryEventClub_EventScript_Woman::\n\tlock\n\tfaceplayer\n\tgoto_if_eq GAVE_PROFILE, TRUE, EventScript_AlreadyGaveProfile\n\tgoto_if_set FLAG_SYS_SET_TRAINER_CARD_PROFILE, EventScript_GivenProfileBefore\n\tmsgbox Text_IdLoveToHearYourProfile\n\tgoto EventScript_AskForProfile\n\tend\n\nEventScript_AlreadyGaveProfile:\n\tmsgbox Text_TellMoreNextTime\n\trelease\n\tend\n\nEventScript_AskForProfile:\n\tmessage Text_TellMeWhatsYourProfile\n\twaitmessage\n\tmultichoice 18, 6, MULTICHOICE_YES_NO_INFO_2, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_AcceptGiveProfile\n\tcase 1, EventScript_DeclineGiveProfile\n\tcase 2, EventScript_ProfileInfo\n\tcase SCR_MENU_CANCEL, EventScript_DeclineGiveProfile\n\tend\n\nEventScript_ProfileInfo:\n\tmsgbox Text_ExplainProfile\n\tgoto EventScript_AskForProfile\n\tend\n\nEventScript_AcceptGiveProfile:\n\tmsgbox Text_WhatsYourProfile\n\tclosemessage\n\tgoto EventScript_GiveProfile\n\tend\n\nEventScript_CancelGiveProfile:\n\tmsgbox Text_DecidedNotTo\n\trelease\n\tend\n\nEventScript_GaveProfile:\n\tsetvar GAVE_PROFILE, TRUE\n\tsetvar VAR_0x8004, 0\n\tspecial ShowEasyChatMessage\n\twaitmessage\n\tdelay 80\n\tmsgbox Text_ProfileSaysSomethingAboutYou\n\trelease\n\tend\n\nEventScript_DeclineGiveProfile:\n\tmsgbox Text_DontBeLikeThat\n\trelease\n\tend\n\nEventScript_GivenProfileBefore:\n\tmsgbox Text_HiWeMeetAgain\n\tgoto EventScript_AskForNewProfile\n\tend\n\nEventScript_AskForNewProfile:\n\tmessage Text_ChangeYourProfile\n\twaitmessage\n\tmultichoice 18, 6, MULTICHOICE_YES_NO_INFO_2, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_AcceptGiveNewProfile\n\tcase 1, EventScript_DeclineGiveNewProfile\n\tcase 2, EventScript_ProfileInfo2\n\tcase SCR_MENU_CANCEL, EventScript_DeclineGiveNewProfile\n\tend\n\nEventScript_ProfileInfo2:\n\tmsgbox Text_ExplainProfile\n\tgoto EventScript_AskForNewProfile\n\tend\n\nEventScript_AcceptGiveNewProfile:\n\tmsgbox Text_WhatAreYouLikeNow\n\tclosemessage\n\tgoto EventScript_GiveProfile\n\tend\n\nEventScript_DeclineGiveNewProfile:\n\tmsgbox Text_LikeProfileWayItIs\n\trelease\n\tend\n\nEventScript_GaveSpecialProfile:\n\tsetvar GAVE_PROFILE, TRUE\n\tsetvar VAR_0x8004, 0\n\tspecial ShowEasyChatMessage\n\twaitmessage\n\tdelay 80\n\tmsgbox Text_HeardThatBefore\n\trelease\n\tend\n\nEventScript_GiveProfile:\n\tsetvar VAR_0x8004, EASY_CHAT_TYPE_PROFILE\n\tcall Common_ShowEasyChatScreen\n\tlock\n\tfaceplayer\n\tgoto_if_eq VAR_0x8004, 0, EventScript_GaveSpecialProfile\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_CancelGiveProfile\n\tgoto_if_eq VAR_RESULT, TRUE, EventScript_GaveProfile\n\tend\n\nText_IdLoveToHearYourProfile:\n\t.string \"Hi, glad to meet you!\\p\"\n\t.string \"…That's unfriendly of you.\\n\"\n\t.string \"How about saying hi back?\\p\"\n\t.string \"So, come on, tell me about\\n\"\n\t.string \"yourself.\\p\"\n\t.string \"I'd love to hear your profile!$\"\n\nText_TellMeWhatsYourProfile:\n\t.string \"Tell me something good about\\n\"\n\t.string \"yourself. What's your profile?$\"\n\nText_ExplainProfile:\n\t.string \"A profile is written using four\\n\"\n\t.string \"words or phrases.\\p\"\n\t.string \"There're plenty of words to choose\\n\"\n\t.string \"from for your profile.\\p\"\n\t.string \"The words and phrases are placed\\n\"\n\t.string \"in several convenient groups.\\p\"\n\t.string \"First, choose a group, then choose\\n\"\n\t.string \"a word or phrase.\\p\"\n\t.string \"…It's easier than it sounds.\\n\"\n\t.string \"Why don't you try it?$\"\n\nText_WhatsYourProfile:\n\t.string \"What's your profile?$\"\n\nText_DontBeLikeThat:\n\t.string \"Aww… Don't be like that.\\n\"\n\t.string \"You can tell me your profile.$\"\n\nText_DecidedNotTo:\n\t.string \"Oh, you've decided not to?\\n\"\n\t.string \"You're fickle, aren't you?$\"\n\nText_HiWeMeetAgain:\n\t.string \"Hi!\\n\"\n\t.string \"We meet again!$\"\n\nText_ChangeYourProfile:\n\t.string \"Would you like to change your\\n\"\n\t.string \"profile?$\"\n\nText_WhatAreYouLikeNow:\n\t.string \"What are you like now?\\n\"\n\t.string \"I'd really like to know.$\"\n\nText_LikeProfileWayItIs:\n\t.string \"Okay, you like your profile the\\n\"\n\t.string \"way it is.\\p\"\n\t.string \"I think so, too.$\"\n\nText_ProfileSaysSomethingAboutYou:\n\t.string \"Hmhm…\\p\"\n\t.string \"Your profile really says something\\n\"\n\t.string \"about who you are.\\p\"\n\t.string \"Now that I know you better, it \\n\"\n\t.string \"makes us better friends than ever!$\"\n\nText_HeardThatBefore:\n\t.string \"Oh, I've heard that before…\\p\"\n\t.string \"My cousin, who lives far away,\\n\"\n\t.string \"always used to say that, I think.$\"\n\nText_TellMoreNextTime:\n\t.string \"Please tell me more about\\n\"\n\t.string \"yourself next time!$\"\n"
  },
  {
    "path": "data/scripts/national_dex_aide.inc",
    "content": "PokemonCenter_1F_OnLoad::\n\tcallnative ShouldSpawnSoftlockClerk\n\tgoto_if_unset FLAG_SYS_POKEDEX_GET, PokemonCenter_1F_OnLoad_2\n\tcompare VAR_RESULT, 0\n\tgoto_if_eq PokemonCenter_1F_OnLoad_2\nPokemonCenter_1F_OnLoad_1:\n\tgoto_if_set FLAG_SYS_NATIONAL_DEX, PokemonCenter_1F_OnLoad_7\n\tgoto_if_unset FLAG_SYS_RECEIVED_EXTENDED_DEX, PokemonCenter_1F_OnLoad_7\n\tcallnative HasNationalMonToVarResult\n\tcompare VAR_RESULT, 0\n\tgoto_if_eq PokemonCenter_1F_OnLoad_12\n\tspecialvar VAR_RESULT, GetPlayerFacingDirection\n\tcompare VAR_RESULT, DIR_NORTH\n\tgoto_if_ne PokemonCenter_1F_OnLoad_15\n\trelease\n\tend\n\nPokemonCenter_1F_OnLoad_2:\n\tsetflag FLAG_TEMP_8\n\tgoto PokemonCenter_1F_OnLoad_1\n\nPokemonCenter_1F_OnLoad_7:\n\tsetvar VAR_TEMP_0, 1\n\trelease\n\tend\n\nPokemonCenter_1F_OnLoad_12:\n\tsetvar VAR_TEMP_0, 1\n\trelease\n\tend\n\nPokemonCenter_1F_OnLoad_15:\n\tcallnative CoordsOfPMCExitWarpTo80068007\n\tgetplayerxy VAR_0x8008, VAR_0x8009\n\tcompare VAR_0x8008, VAR_0x8006\n\tgoto_if_eq PokemonCenter_1F_OnLoad_19\nPokemonCenter_1F_OnLoad_17:\n\trelease\n\tend\n\nPokemonCenter_1F_OnLoad_18:\n\tgoto PokemonCenter_1F_OnLoad_17\n\nPokemonCenter_1F_OnLoad_19:\n\tcompare VAR_0x8009, VAR_0x8007\n\tgoto_if_eq PokemonCenter_1F_OnLoad_18\n\tgoto PokemonCenter_1F_OnLoad_17\n\nNationalDexAideEvent::\n\tcallnative HasNationalMonToVarResult\n\tcompare VAR_RESULT, 0\n\tgoto_if_eq NationalDexAideEvent_2\n\tgoto_if_set FLAG_SYS_NATIONAL_DEX, NationalDexAideEvent_5\n\tgoto_if_unset FLAG_SYS_RECEIVED_EXTENDED_DEX, NationalDexAideEvent_5\n\tcallnative HideWarpArrowSprite\n\tlockall\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tplayse SE_PIN\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tdelay 60\n\tapplymovement OBJ_EVENT_ID_PLAYER, NationalDexAideEvent_Movement_BackStep\n\twaitmovement 0\n\tplayse SE_EXIT\n\tgetplayerxy VAR_0x8008, VAR_0x8009\n\taddvar VAR_0x8009, 1\n\tsetobjectxyperm 2, VAR_0x8008, VAR_0x8009\n\taddobject 2\n\tapplymovement 2, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\ttextcolor 0\n\tmsgbox NationalDexAideEvent_Text_0\n\tclosemessage\n\ttextcolor 3\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tmsgbox NationalDexAideEvent_Text_1\n\tclosemessage\n\tapplymovement 2, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\ttextcolor 0\n\tmsgbox NationalDexAideEvent_Text_2\n\tapplymovement 2, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tmsgbox NationalDexAideEvent_Text_3\n\tclosemessage\n\tapplymovement 2, Common_Movement_WalkInPlaceFasterUp\n\twaitmovement 0\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\ttextcolor 3\n\tmessage PalletTown_ProfessorOaksLab_Text_PlayersPokedexWasUpgraded\n\twaitmessage\n\twaitfanfare\n\tclosemessage\n\ttextcolor 0\n\tspecial EnableNationalPokedex\n\tmsgbox NationalDexAideEvent_Text_4\n\tclosemessage\n\tdelay 20\n\tplayse SE_EXIT\n\tapplymovement 2, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tdelay 5\n\tremoveobject 2\n\tsetvar VAR_TEMP_0, 1\n\treleaseall\n\tend\n\nNationalDexAideEvent_2:\n\tsetvar VAR_TEMP_0, 1\n\trelease\n\tend\n\nNationalDexAideEvent_5:\n\tsetvar VAR_TEMP_0, 1\n\trelease\n\tend\n\nNationalDexAideEvent_Movement_BackStep:\n\tlock_facing_direction\n\twalk_up\n\tunlock_facing_direction\n\tstep_end\n\nNationalDexAideEvent_Text_0:\n\t.string \"{PLAYER}! Hi!\\nI've been looking for you!\\pRemember me?\\nI'm one of PROF. OAK'S AIDES.\\pPROF. OAK has improved the\\nPOKéDEX again and I'm supposed\\lto upgrade yours.\\pCan I see your POKéDEX?$\"\n\nNationalDexAideEvent_Text_1:\n\t.string \"The AIDE took your POKéDEX\\nunit.$\"\n\nNationalDexAideEvent_Text_2:\n\t.string \"… … …  … … …\\p… … …  … … …$\"\n\nNationalDexAideEvent_Text_3:\n\t.string \"…And that's done!\\pNow this unit can record data on\\na lot more POKéMON.\\pHere you go!$\"\n\nNationalDexAideEvent_Text_4:\n\t.string \"Keep catching POKéMON to fill up\\nyour improved POKéDEX!\\pI better get back to the LAB.\\nSee you, {PLAYER}!$\"\n"
  },
  {
    "path": "data/scripts/national_dex_aide.pory",
    "content": "const LOCALID_AIDE = 2\n\nscript PokemonCenter_1F_OnLoad {\n\tcallnative(ShouldSpawnSoftlockClerk)\n    if(!flag(FLAG_SYS_POKEDEX_GET) || !var(VAR_RESULT))\n    {\n    \tsetflag(FLAG_TEMP_8)\n    }\n\tif(flag(FLAG_SYS_NATIONAL_DEX) || !flag(FLAG_SYS_RECEIVED_EXTENDED_DEX))\n    {\n    \tsetvar(VAR_TEMP_0, 1)\n    \trelease\n    \tend\n    }\n\tcallnative(HasNationalMonToVarResult)\n    if(!var(VAR_RESULT))\n    {\n    \tsetvar(VAR_TEMP_0, 1)\n    \trelease\n    \tend\n    }\n    specialvar(VAR_RESULT, GetPlayerFacingDirection)\n    if(var(VAR_RESULT) != DIR_NORTH)\n    {\n    \tcallnative(CoordsOfPMCExitWarpTo80068007)\n    \tgetplayerxy(VAR_0x8008, VAR_0x8009)\n        if((var(VAR_0x8008) == VAR_0x8006) && (var(VAR_0x8009) == VAR_0x8007))\n        {\n        \t//goto(NationalDexAideEvent)\n        }\n        release\n        end\n    }\n    release\n    end\n}\n\nscript NationalDexAideEvent {\n\tcallnative(HasNationalMonToVarResult)\n    if(!var(VAR_RESULT))\n    {\n    \tsetvar(VAR_TEMP_0, 1)\n    \trelease\n    \tend\n    }\n    if(flag(FLAG_SYS_NATIONAL_DEX) || !flag(FLAG_SYS_RECEIVED_EXTENDED_DEX))\n    {\n    \tsetvar(VAR_TEMP_0, 1)\n    \trelease\n    \tend\n    }\n    callnative(HideWarpArrowSprite)\n    lockall\n    applymovement(OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown)\n    waitmovement(0)\n    playse(SE_PIN)\n    applymovement(OBJ_EVENT_ID_PLAYER, Common_Movement_ExclamationMark)\n    waitmovement(0)\n    delay(60)\n    applymovement(OBJ_EVENT_ID_PLAYER, NationalDexAideEvent_Movement_BackStep)\n    waitmovement(0)\n    playse(SE_EXIT)\n    getplayerxy(VAR_0x8008, VAR_0x8009)\n    addvar(VAR_0x8009, 1)\n    setobjectxyperm(LOCALID_AIDE, VAR_0x8008, VAR_0x8009)\n    addobject(LOCALID_AIDE)\n    applymovement(LOCALID_AIDE, Common_Movement_WalkInPlaceFasterUp)\n    waitmovement(0)\n    textcolor(0)\n    msgbox(\"{PLAYER}! Hi!\\nI've been looking for you!\\pRemember me?\\nI'm one of PROF. OAK'S AIDES.\\pPROF. OAK has improved the\\nPOKéDEX again and I'm supposed\\lto upgrade yours.\\pCan I see your POKéDEX?\")\n    closemessage\n    textcolor(3)\n    applymovement(OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown)\n    waitmovement(0)\n    msgbox(\"The AIDE took your POKéDEX\\nunit.\")\n    closemessage\n    applymovement(LOCALID_AIDE, Common_Movement_WalkInPlaceFasterDown)\n    waitmovement(0)\n    textcolor(0)\n    msgbox(\"… … …  … … …\\p… … …  … … …\")\n    applymovement(LOCALID_AIDE, Common_Movement_WalkInPlaceFasterUp)\n    waitmovement(0)\n    msgbox(\"…And that's done!\\pNow this unit can record data on\\na lot more POKéMON.\\pHere you go!\")\n    closemessage\n    applymovement(LOCALID_AIDE, Common_Movement_WalkInPlaceFasterUp)\n    waitmovement(0)\n    playfanfare(MUS_OBTAIN_KEY_ITEM)\n    textcolor(3)\n\tmessage(PalletTown_ProfessorOaksLab_Text_PlayersPokedexWasUpgraded)\n\twaitmessage\n\twaitfanfare\n    closemessage\n\ttextcolor(0)\n    special(EnableNationalPokedex)\n    msgbox(\"Keep catching POKéMON to fill up\\nyour improved POKéDEX!\\pI better get back to the LAB.\\nSee you, {PLAYER}!\")\n    closemessage\n    delay(20)\n    playse(SE_EXIT)\n    applymovement(LOCALID_AIDE, Common_Movement_WalkInPlaceFasterDown)\n    waitmovement(0)\n\tdelay(5)\n    removeobject(LOCALID_AIDE)\n    setvar(VAR_TEMP_0, 1)\n    releaseall\n    end\n}movement NationalDexAideEvent_Movement_BackStep {\n\tlock_facing_direction\n    walk_up\n    unlock_facing_direction\n}"
  },
  {
    "path": "data/scripts/obtain_item.inc",
    "content": "@ Unused, handled by textcolor script cmd\nEventScript_SaveTextColor::\n\tcopyvar VAR_PREV_TEXT_COLOR, VAR_TEXT_COLOR\n\treturn\n\nEventScript_RestorePrevTextColor::\n\tcopyvar VAR_TEXT_COLOR, VAR_PREV_TEXT_COLOR\n\treturn\n\nStd_ObtainItem::\n\tcopyvar VAR_PREV_TEXT_COLOR, VAR_TEXT_COLOR\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tadditem VAR_0x8000, VAR_0x8001\n\tcopyvar VAR_0x8007, VAR_RESULT\n\tcall EventScript_ObtainItemMessage\n\tcopyvar VAR_TEXT_COLOR, VAR_PREV_TEXT_COLOR\n\treturn\n\nEventScript_ObtainItemMessage::\n\tbufferitemnameplural STR_VAR_2, VAR_0x8000, VAR_0x8001\n\tcheckitemtype VAR_0x8000\n\tcall EventScript_BufferPocketNameTryFanfare\n\tcall_if_eq VAR_0x8007, TRUE, EventScript_ObtainedItem\n\tcall_if_eq VAR_0x8007, FALSE, EventScript_NoRoomForItem\n\treturn\n\nEventScript_BufferPocketNameTryFanfare::\n\tswitch VAR_RESULT\n\tcase POCKET_ITEMS, EventScript_BufferItemsPocket\n\tcase POCKET_KEY_ITEMS, EventScript_BufferKeyItemsPocket\n\tcase POCKET_POKE_BALLS, EventScript_BufferPokeBallsPocket\n\tcase POCKET_TM_CASE, EventScript_BufferTMCase\n\tcase POCKET_BERRY_POUCH, EventScript_BufferBerryPouch\n\tcase POCKET_MEDICINE, EventScript_BufferMedicinePocket\n\tcase POCKET_HELD_ITEMS, EventScript_BufferHeldItemsPocket\n\tend\n\nEventScript_BufferItemsPocket::\n\tbufferstdstring STR_VAR_3, STDSTRING_ITEMS_POCKET\n\tcall_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedItem\n\treturn\n\nEventScript_BufferKeyItemsPocket::\n\tbufferstdstring STR_VAR_3, STDSTRING_KEY_ITEMS_POCKET\n\tcall_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedItem\n\treturn\n\nEventScript_BufferPokeBallsPocket::\n\tbufferstdstring STR_VAR_3, STDSTRING_POKEBALLS_POCKET\n\tcall_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedItem\n\treturn\n\nEventScript_BufferTMCase::\n\tbufferstdstring STR_VAR_3, STDSTRING_TM_CASE\n\tcall_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedTMHM\n\treturn\n\nEventScript_BufferBerryPouch::\n\tbufferstdstring STR_VAR_3, STDSTRING_BERRY_POUCH\n\tcall_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedItem\n\treturn\n\nEventScript_BufferMedicinePocket::\n\tbufferstdstring 2, STDSTRING_MEDICINE_POCKET\n\tcall_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedItem\n\treturn\n\nEventScript_BufferHeldItemsPocket::\n\tbufferstdstring 2, STDSTRING_HELD_ITEMS_POCKET\n\tcall_if_eq VAR_0x8007, TRUE, EventScript_PlayFanfareObtainedItem\n\treturn\n\nEventScript_ObtainedItem::\n\tmessage Text_ObtainedTheX\n\twaitfanfare\n\twaitmessage\n\tmsgbox Text_PutItemAway\n\tsetvar VAR_RESULT, 1\n\treturn\n\nEventScript_NoRoomForItem::\n\tsetvar VAR_RESULT, FALSE\n\treturn\n\nEventScript_PlayFanfareObtainedItem::\n\tplayfanfare MUS_LEVEL_UP\n\treturn\n\nEventScript_PlayFanfareObtainedTMHM::\n\tplayfanfare MUS_LEVEL_UP\n\treturn\n\nStd_ObtainDecoration::\n\tadddecoration VAR_0x8000\n\tcopyvar VAR_0x8007, VAR_RESULT\n\tcall EventScript_ObtainDecorMessage\n\treturn\n\nEventScript_ObtainDecorMessage::\n\tbufferdecorationname STR_VAR_2, VAR_0x8000\n\tcall_if_eq VAR_0x8007, TRUE, EventScript_ObtainedDecor\n\tcall_if_eq VAR_0x8007, FALSE, EventScript_NoRoomForDecor\n\treturn\n\nEventScript_ObtainedDecor::\n\tplayfanfare MUS_OBTAIN_ITEM\n\tmessage Text_ObtainedTheDecor\n\twaitfanfare\n\twaitmessage\n\tmsgbox Text_DecorTransferredToPC\n\tsetvar VAR_RESULT, TRUE\n\treturn\n\nEventScript_NoRoomForDecor::\n\tsetvar VAR_RESULT, FALSE\n\treturn\n\nStd_FindItem::\n\tlock\n\tfaceplayer\n\twaitse\n\tcopyvar VAR_0x8004, VAR_0x8000\n\tcopyvar VAR_0x8005, VAR_0x8001\n\tcheckitemspace VAR_0x8000, VAR_0x8001\n\tcopyvar VAR_0x8007, VAR_RESULT\n\tbufferitemname STR_VAR_2, VAR_0x8000\n\tcheckitemtype VAR_0x8000\n\tcall EventScript_BufferPocketNameTryFanfare\n\tcall_if_eq VAR_0x8007, TRUE, EventScript_PickUpItem\n\tcall_if_eq VAR_0x8007, FALSE, EventScript_NoRoomToPickUpItem\n\trelease\n\treturn\n\nEventScript_PickUpItem::\n\tremoveobject VAR_LAST_TALKED\n\tadditem VAR_0x8004, VAR_0x8005\n\tspecialvar VAR_RESULT, BufferTMHMMoveName\n\tcopyvar VAR_0x8008, VAR_RESULT\n\tcall_if_eq VAR_0x8008, TRUE, EventScript_FoundTMHM\n\tcall_if_eq VAR_0x8008, FALSE, EventScript_FoundItem\n\twaitfanfare\n\twaitmessage\n\tmsgbox Text_PutItemAway\n\treturn\n\nEventScript_FoundTMHM::\n\tmessage Text_FoundTMHMContainsMove\n\treturn\n\nEventScript_FoundItem::\n\tmessage Text_FoundOneItem\n\treturn\n\nEventScript_NoRoomToPickUpItem::\n\tmsgbox Text_ObtainedTheX\n\tmsgbox Text_TooBadBagFull\n\tsetvar VAR_RESULT, FALSE\n\treturn\n\nEventScript_HiddenItemScript::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\twaitse\n\tgoto_if_eq VAR_0x8005, 0, EventScript_TryPickUpHiddenCoins\n\tcall EventScript_TryPickUpHiddenItem\n\tgoto_if_eq VAR_0x8007, TRUE, EventScript_PickedUpHiddenItem\n\tgoto_if_eq VAR_0x8007, FALSE, EventScript_NoRoomForHiddenItem\n\tend\n\nEventScript_TryPickUpHiddenItem::\n\tadditem VAR_0x8005, VAR_0x8006\n\tcopyvar VAR_0x8007, VAR_RESULT\n\tbufferitemname STR_VAR_2, VAR_0x8005\n\tcheckitemtype VAR_0x8005\n\tcall EventScript_BufferPocketNameTryFanfare\n\treturn\n\nEventScript_PickedUpHiddenItem::\n\tcall_if_eq VAR_0x8006, 1, EventScript_FoundSingleItem\n\tcall_if_ne VAR_0x8006, 1, EventScript_FoundMultipleItems\n\twaitfanfare\n\twaitmessage\n\tmsgbox Text_PutItemAway\n\tspecial SetHiddenItemFlag\n\treleaseall\n\tend\n\nEventScript_FoundSingleItem::\n\tmessage Text_FoundOneItem\n\treturn\n\nEventScript_FoundCoins::\n\tbuffernumberstring STR_VAR_1, VAR_0x8006\n\tmessage Text_FoundXCoins\n\treturn\n\nEventScript_FoundMultipleItems::\n\tbuffernumberstring STR_VAR_1, VAR_0x8006\n\tmessage Text_FoundXItems\n\treturn\n\nEventScript_NoRoomForHiddenItem::\n\tmsgbox Text_FoundOneItem\n\tmsgbox Text_TooBadBagFull\n\tsetvar VAR_RESULT, 0\n\treleaseall\n\tend\n\nEventScript_TryPickUpHiddenCoins::\n\tgoto_if_unset FLAG_GOT_COIN_CASE, EventScript_NoCaseForHiddenCoins\n\tcheckcoins VAR_RESULT\n\tspecialvar VAR_RESULT, CheckAddCoins\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_HiddenCoinsButCaseIsFull\n\taddcoins VAR_0x8006\n\tbufferstdstring STR_VAR_2, STDSTRING_COINS\n\tcall EventScript_PlayFanfareObtainedItem\n\tcall EventScript_FoundCoins\n\twaitfanfare\n\twaitmessage\n\tmsgbox Text_PutCoinsAwayInCoinCase\n\tspecial SetHiddenItemFlag\n\treleaseall\n\tend\n\nEventScript_HiddenCoinsButCaseIsFull::\n\tbuffernumberstring STR_VAR_1, VAR_0x8006\n\tbufferstdstring STR_VAR_2, STDSTRING_COINS\n\tmsgbox Text_FoundXCoins\n\tmsgbox Text_CoinCaseIsFull\n\tsetvar VAR_RESULT, 0\n\treleaseall\n\tend\n\nEventScript_NoCaseForHiddenCoins::\n\tbuffernumberstring STR_VAR_1, VAR_0x8006\n\tbufferstdstring STR_VAR_2, STDSTRING_COINS\n\tmsgbox Text_FoundXCoins\n\tmsgbox Text_NothingToPutThemIn\n\tsetvar VAR_RESULT, 0\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/scripts/pc.inc",
    "content": "EventScript_PC::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tlockall\n\tgoto_if_set FLAG_SYS_PC_STORAGE_DISABLED, EventScript_PCDisabled\n\tsetvar VAR_0x8004, HELPCONTEXT_PC\n\tspecial Script_SetHelpContext\n\tsetvar VAR_0x8004, 0\n\tspecial AnimatePcTurnOn\n\tplayse SE_PC_ON\n\tmsgbox Text_BootedUpPC\n\tgoto EventScript_PCMainMenu\n\tend\n\n@ For when the player first arrives on One Island\nEventScript_PCDisabled::\n\tmsgbox OneIsland_PokemonCenter_1F_Text_UsualPCServicesUnavailable\n\treleaseall\n\tend\n\nEventScript_PCMainMenu::\n\tmessage Text_AccessWhichPC\n\twaitmessage\n\tspecial CreatePCMenu\n\twaitstate\n\tgoto EventScript_ChoosePCMenu\n\tend\n\nEventScript_ChoosePCMenu::\n\tswitch VAR_RESULT\n\tcase 0, EventScript_AccessPokemonStorage\n\tcase 1, EventScript_AccessPlayersPC\n\tcase 2, EventScript_AccessProfOaksPC\n\tcase 3, EventScript_AccessHallOfFame\n\tcase 4, EventScript_TurnOffPC\n\tcase SCR_MENU_CANCEL, EventScript_TurnOffPC\n\tend\n\nEventScript_AccessPlayersPC::\n\tplayse SE_PC_LOGIN\n\tmsgbox Text_AccessedPlayersPC\n\tspecial PlayerPC\n\twaitstate\n\tgoto EventScript_PCMainMenu\n\tend\n\nEventScript_AccessPokemonStorage::\n\tplayse SE_PC_LOGIN\n\tcall_if_unset FLAG_SYS_NOT_SOMEONES_PC, EventScript_AccessSomeonesPC\n\tcall_if_set FLAG_SYS_NOT_SOMEONES_PC, EventScript_AccessBillsPC\n\tmsgbox Text_OpenedPkmnStorage\n\tspecial ShowPokemonStorageSystemPC\n\twaitstate\n\tsetvar VAR_0x8004, HELPCONTEXT_PC\n\tspecial Script_SetHelpContext\n\tgoto EventScript_PCMainMenu\n\tend\n\nEventScript_AccessSomeonesPC::\n\tmsgbox Text_AccessedSomeonesPC\n\treturn\n\nEventScript_AccessBillsPC::\n\tmsgbox Text_AccessedBillsPC\n\treturn\n\nEventScript_TurnOffPC::\n\tsetvar VAR_0x8004, 0\n\tplayse SE_PC_OFF\n\tspecial AnimatePcTurnOff\n\tspecial SetHelpContextForMap\n\treleaseall\n\tend\n\nEventScript_AccessHallOfFame::\n\tgoto_if_unset FLAG_SYS_GAME_CLEAR, EventScript_TurnOffPC\n\tplayse SE_PC_LOGIN\n\tsetvar VAR_0x8004, HELPCONTEXT_PC_MISC\n\tspecial BackupHelpContext\n\tspecial Script_SetHelpContext\n\tspecial HallOfFamePCBeginFade\n\twaitstate\n\tspecial RestoreHelpContext\n\tgoto EventScript_ChoosePCMenu\n\tend\n\nEventScript_AccessProfOaksPC::\n\tgoto_if_unset FLAG_SYS_POKEDEX_GET, EventScript_TurnOffPC\n\tplayse SE_PC_LOGIN\n\tmsgbox Text_AccessedProfOaksPC\n\tmsgbox Text_HavePokedexRated, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_ExitOaksPC\n\tsetflag FLAG_OAKS_RATING_IS_VIA_PC\n\tcall PokedexRating_EventScript_Rate\n\tclearflag FLAG_OAKS_RATING_IS_VIA_PC\n\tgoto EventScript_ExitOaksPC\n\tend\n\nEventScript_ExitOaksPC::\n\tmsgbox Text_ClosedLinkToProfOaksPC\n\tgoto EventScript_PCMainMenu\n\tend\n"
  },
  {
    "path": "data/scripts/pc_transfer.inc",
    "content": "EventScript_GetGiftMonPartySlot::\n\tgetpartysize\n\tsubvar VAR_RESULT, 1\n\tcopyvar VAR_0x8004, VAR_RESULT\n\treturn\n\nEventScript_NameReceivedBoxMon::\n\tfadescreen FADE_TO_BLACK\n\tspecial ChangeBoxPokemonNickname\n\twaitstate\n\tlock\n\tfaceplayer\n\treturn\n\nEventScript_TransferredToPC::\n\tbufferboxname STR_VAR_1, VAR_PC_BOX_TO_SEND_MON\n\tbufferspeciesname STR_VAR_2, VAR_TEMP_1\n\tcall_if_unset FLAG_SYS_NOT_SOMEONES_PC, EventScript_TransferredSomeonesPC\n\tcall_if_set FLAG_SYS_NOT_SOMEONES_PC, EventScript_TransferredBillsPC\n\treturn\n\nEventScript_TransferredSomeonesPC::\n\tspecialvar VAR_RESULT, ShouldShowBoxWasFullMessage\n\tgoto_if_eq VAR_RESULT, TRUE, EventScript_TransferredSomeonesPCBoxFull\n\tmsgbox Text_MonSentToBoxInSomeonesPC\n\treturn\n\nEventScript_TransferredSomeonesPCBoxFull::\n\tspecialvar VAR_RESULT, GetPCBoxToSendMon\n\tbufferboxname STR_VAR_3, VAR_RESULT\n\tmsgbox Text_MonSentToBoxSomeonesBoxFull\n\treturn\n\nEventScript_TransferredBillsPC::\n\tspecialvar VAR_RESULT, ShouldShowBoxWasFullMessage\n\tgoto_if_eq VAR_RESULT, TRUE, EventScript_TransferredBillsPCBoxFull\n\tmsgbox Text_MonSentToBoxInBillsPC\n\treturn\n\nEventScript_TransferredBillsPCBoxFull::\n\tspecialvar VAR_RESULT, GetPCBoxToSendMon\n\tbufferboxname STR_VAR_3, VAR_RESULT\n\tmsgbox Text_MonSentToBoxBillsBoxFull\n\treturn\n"
  },
  {
    "path": "data/scripts/pkmn_center_nurse.inc",
    "content": "EventScript_PkmnCenterNurse::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tcallnative CheckTrainerCardStars\n\tcompare VAR_RESULT, 2\n\tgoto_if_ge EventScript_PkmnCenterNurseTrainerCard\n\tmessage Text_WelcomeWantToHealPkmn\n\twaitmessage\n\tmultichoice 19, 8, MULTICHOICE_YES_NO, FALSE | (TRUE << 1)\n\tswitch VAR_RESULT\n\tcase 0, EventScript_PkmnCenterNurse_HealPkmn\n\tcase 1 EventScript_PkmnCenterNurse_Goodbye\n\tcase SCR_MENU_CANCEL, EventScript_PkmnCenterNurse_Goodbye\n\tend\n\nEventScript_PkmnCenterNurse_HealPkmn::\n\tincrementgamestat GAME_STAT_USED_POKECENTER\n\tmessage Text_TakeYourPkmnForFewSeconds\n\twaitmessage\n\tcall EventScript_PkmnCenterNurse_TakeAndHealPkmn\n\tspecial SetUsedPkmnCenterQuestLogEvent\n\tgoto EventScript_PkmnCenterNurse_ReturnPkmn\n\tend\n\nEventScript_PkmnCenterNurse_TakeAndHealPkmn::\n\tapplymovement VAR_LAST_TALKED, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tdofieldeffect FLDEFF_POKECENTER_HEAL\n\tcallnative CableClub_OnResumeFunc\n\twaitfieldeffect FLDEFF_POKECENTER_HEAL\n\tapplymovement VAR_LAST_TALKED, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tspecial HealPlayerParty\n\treturn\n\nEventScript_PkmnCenterNurse_CheckTrainerTowerAndUnionRoom::\n\tspecialvar VAR_RESULT, IsPlayerNotInTrainerTowerLobby\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_PkmnCenterNurse_ReturnPkmn\n\tspecialvar VAR_RESULT, BufferUnionRoomPlayerName\n\tcopyvar VAR_0x8008, VAR_RESULT\n\tgoto_if_eq VAR_0x8008, 0, EventScript_PkmnCenterNurse_ReturnPkmn\n\tgoto_if_eq VAR_0x8008, 1, EventScript_PkmnCenterNurse_PlayerWaitingInUionRoom\n\tend\n\nEventScript_PkmnCenterNurse_ReturnPkmn::\n\tmessage Text_RestoredPkmnToFullHealth\n\twaitmessage\n\tapplymovement VAR_LAST_TALKED, Movement_Bow\n\twaitmovement 0\n\tmsgbox Text_WeHopeToSeeYouAgain\n\treturn\n\nEventScript_PkmnCenterNurse_PlayerWaitingInUionRoom::\n\tgoto_if_set FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER, EventScript_PkmnCenterNurse_ReturnPkmn\n\tmsgbox Text_RestoredPkmnToFullHealth\n\tsetflag FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER\n\tmessage Text_PlayerIsPlayingRightNowGoForIt\n\twaitmessage\n\tapplymovement VAR_LAST_TALKED, Movement_Bow\n\twaitmovement 0\n\tmsgbox Text_WeHopeToSeeYouAgain\n\treturn\n\nEventScript_PkmnCenterNurse_Goodbye::\n\tmsgbox Text_WeHopeToSeeYouAgain\n\treturn\n\nMovement_Bow::\n\tnurse_joy_bow\n\tdelay_4\n\tstep_end\n\nEventScript_PkmnCenterNurseTrainerCard::\n\tgoto_if_unset FLAG_SHOWN_COPPER_CARD_TO_NURSE, EventScript_PkmnCenterNurseTrainerCardFirst\n\tmessage Text_WelcomeTrainerCard\n\twaitmessage\n\tmultichoice 19, 8, MULTICHOICE_YES_NO, FALSE | (TRUE << 1)\n\tswitch VAR_RESULT\n\tcase 0, EventScript_PkmnCenterNurse_HealPkmnTrainerCard\n\tcase 1 EventScript_PkmnCenterNurse_Goodbye\n\tcase SCR_MENU_CANCEL, EventScript_PkmnCenterNurse_Goodbye\n\tend\n\nEventScript_PkmnCenterNurseTrainerCardFirst::\n\tmessage Text_WelcomeTrainerCardFirst\n\twaitmessage\n\tsetflag FLAG_SHOWN_COPPER_CARD_TO_NURSE\n\tmultichoice 19, 8, MULTICHOICE_YES_NO, FALSE | (TRUE << 1)\n\tswitch VAR_RESULT\n\tcase 0, EventScript_PkmnCenterNurse_HealPkmnTrainerCard\n\tcase 1 EventScript_PkmnCenterNurse_Goodbye\n\tcase SCR_MENU_CANCEL, EventScript_PkmnCenterNurse_Goodbye\n\tend\n\nEventScript_PkmnCenterNurse_HealPkmnTrainerCard::\n\tincrementgamestat GAME_STAT_USED_POKECENTER\n\tmessage Text_TakeYourPkmnForFewSecondsTrainerCard\n\twaitmessage\n\tcall EventScript_PkmnCenterNurse_TakeAndHealPkmn\n\tspecial SetUsedPkmnCenterQuestLogEvent\n\tgoto EventScript_PkmnCenterNurse_ReturnPkmnTrainerCard\n\tend\n\nEventScript_PkmnCenterNurse_ReturnPkmnTrainerCard::\n\tapplymovement VAR_LAST_TALKED, Movement_Bow\n\twaitmovement 0\n\tmsgbox Text_WeHopeToSeeYouAgain\n\treturn\n\nText_WelcomeTrainerCardFirst::\n\t.string \"Welcome to our POKéMON CENTER!\\p\"\n\t.string \"Would you like me to…\\n\"\n\t.string \"Th-that TRAINER CARD!\\p\"\n\t.string \"That wonderful shade!\\n\"\n\t.string \"And all those stars!\\p\"\n\t.string \"I've seen several TRAINERS\\n\"\n\t.string \"with BRONZE CARDS up to now…\\p\"\n\t.string \"But you're the first to top them\\n\"\n\t.string \"with that TRAINER CARD.\\p\"\n\t.string \"Please, {PLAYER}, may I have the\\n\"\n\t.string \"honor of healing your POKéMON?$\"\n\nText_TakeYourPkmnForFewSecondsTrainerCard::\n\t.string \"I will be pleased to take your\\n\"\n\t.string \"POKéMON for a few seconds.$\"\n\nText_WelcomeTrainerCard::\n\t.string \"Great to see you, {PLAYER}!\\n\"\n\t.string \"You want the usual, right?$\"\n\nEventScript_SoftlockClerk::\n\tgoto_if_set FLAG_TEMP_7, EventScript_SoftlockClerk_GaveAlready\n\tmsgbox Text_SoftlockClerk_Initial, MSGBOX_NPC\n\ttextcolor 3\n\tcheckitemspace ITEM_POKE_BALL, 5\n\tcompare VAR_RESULT, FALSE\n\tgoto_if_eq EventScript_SoftlockClerk_NoRoom\n\tgiveitem_msg PalletTown_ProfessorOaksLab_Text_ReceivedFivePokeBalls, ITEM_POKE_BALL, 5\n\tsetflag FLAG_TEMP_7\n\trelease\n\tend\n\nEventScript_SoftlockClerk_GaveAlready::\n\tmsgbox Text_SoftlockClerk_GaveAlready, MSGBOX_NPC\n\tend\n\nEventScript_SoftlockClerk_NoRoom::\n\tmsgbox CeladonCity_Restaurant_Text_MakeRoomForThis, MSGBOX_NPC\n\tend\n\nText_SoftlockClerk_Initial::\n\t.string \"Hello, TRAINER!\\p\"\n\t.string \"We've partnered with the POKéMON\\n\"\n\t.string \"CENTER to do a special giveaway!\\p\"\n\t.string \"Congratulations, you're the lucky\\n\"\n\t.string \"winner! Enjoy your prize!$\"\n\nText_SoftlockClerk_GaveAlready::\n\t.string \"Hello, TRAINER!\\n\"\n\t.string \"Put those POKé BALLS to good use!$\"\n"
  },
  {
    "path": "data/scripts/pokedex_rating.inc",
    "content": "PokedexRating_EventScript_RateInPerson::\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tcall_if_set FLAG_OAK_SAW_DEX_COMPLETION, PokedexRating_EventScript_DexCompleteIntro\n\tcall_if_unset FLAG_OAK_SAW_DEX_COMPLETION, PokedexRating_EventScript_NormalIntro\n\tcall PokedexRating_EventScript_Rate\n\treturn\n\nPokedexRating_EventScript_DexCompleteIntro::\n\tmsgbox PokedexRating_Text_LoveSeeingYourPokedex\n\treturn\n\nPokedexRating_EventScript_NormalIntro::\n\tmsgbox PokedexRating_Text_HowIsPokedexComingAlong\n\treturn\n\nPokedexRating_EventScript_ShowRatingMsg::\n\tcopyvar VAR_0x8004, VAR_0x8009\n\tspecial GetProfOaksRatingMessage\n\twaitmessage\n\tcall_if_eq VAR_RESULT, FALSE, PokedexRating_EventScript_NormalFanfare\n\tcall_if_eq VAR_RESULT, TRUE, PokedexRating_EventScript_DexCompleteFanfare\n\twaitfanfare\n\twaitbuttonpress\n\treturn\n\nPokedexRating_EventScript_NormalFanfare::\n\tplayfanfare MUS_DEX_RATING\n\treturn\n\nPokedexRating_EventScript_DexCompleteFanfare::\n\tplayfanfare MUS_EVOLVED\n\treturn\n\nPokedexRating_EventScript_Rate::\n\tsetvar VAR_0x8004, HELPCONTEXT_PC_MISC\n\tspecial BackupHelpContext\n\tspecial Script_SetHelpContext\n\tsetvar VAR_0x8004, 0\n\tspecialvar VAR_RESULT, GetPokedexCount\n\tcopyvar VAR_0x8008, VAR_0x8005\n\tcopyvar VAR_0x8009, VAR_0x8006\n\tcopyvar VAR_0x800A, VAR_RESULT\n\tbuffernumberstring STR_VAR_1, VAR_0x8008 @ Num Kanto Seen\n\tbuffernumberstring STR_VAR_2, VAR_0x8009 @ Num Kanto Caught\n\tmsgbox PokedexRating_Text_SeenXOwnedY\n\tcall_if_unset FLAG_OAKS_RATING_IS_VIA_PC, PokedexRating_EventScript_SetTextColor\n\tcall PokedexRating_EventScript_ShowRatingMsg\n\tgoto_if_eq VAR_0x800A, FALSE, PokedexRating_EventScript_EndRating  @ National Dex not enabled\n\tsetvar VAR_0x8004, 1\n\tspecialvar VAR_RESULT, GetPokedexCount\n\tcopyvar VAR_0x8008, VAR_0x8005\n\tcopyvar VAR_0x8009, VAR_0x8006\n\tbuffernumberstring STR_VAR_1, VAR_0x8008 @ Num National Seen\n\tbuffernumberstring STR_VAR_2, VAR_0x8009 @ Num National Caught\n\tmsgbox PokedexRating_Text_NationalDexSeenXOwnedY\n\tspecialvar VAR_RESULT, HasAllMons\n\tgoto_if_eq VAR_RESULT, FALSE, PokedexRating_EventScript_DexIncomplete\n\tgoto_if_eq VAR_RESULT, TRUE, PokedexRating_EventScript_DexComplete\n\tend\n\nPokedexRating_EventScript_SetTextColor::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\treturn\n\nPokedexRating_EventScript_DexIncomplete::\n\tmsgbox PokedexRating_Text_LookForwardToFilledNationalDex\n\tgoto PokedexRating_EventScript_EndRating\n\tend\n\nPokedexRating_EventScript_DexComplete::\n\tsetflag FLAG_OAK_SAW_DEX_COMPLETION\n\tmsgbox PokedexRating_Text_YouveCompletedDex\n\tgoto PokedexRating_EventScript_EndRating\n\tend\n\nPokedexRating_EventScript_EndRating::\n\tspecial RestoreHelpContext\n\treturn\n"
  },
  {
    "path": "data/scripts/pokemon_league.inc",
    "content": "PokemonLeague_EventScript_OpenDoor::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_Delay32\n\twaitmovement 0\n\tplayse SE_RS_DOOR\n\tcall PokemonLeague_EventScript_SetDoorOpen\n\tspecial DrawWholeMapView\n\tsetflag FLAG_TEMP_4\n\treturn\n\nPokemonLeague_EventScript_EnterRoom::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkUp5\n\twaitmovement 0\n\tsetflag FLAG_TEMP_2\n\tplayse SE_UNLOCK\n\tcall PokemonLeague_EventScript_CloseEntry\n\tspecial DrawWholeMapView\n\treturn\n\nPokemonLeague_EventScript_SetDoorOpen::\n\tsetmetatile 6, 1, METATILE_PokemonLeague_Door_Top_Open, 1\n\tsetmetatile 6, 2, METATILE_PokemonLeague_Door_Mid_Open, 0\n\treturn\n\nPokemonLeague_EventScript_PreventExit::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tmsgbox Text_VoiceRangOutDontRunAway\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, PokemonLeague_Movement_ForcePlayerIn\n\twaitmovement 0\n\treleaseall\n\tend\n\nPokemonLeague_EventScript_OpenDoorLance::\n\tapplymovement OBJ_EVENT_ID_PLAYER, Common_Movement_Delay32\n\twaitmovement 0\n\tplayse SE_RS_DOOR\n\tsetmetatile 6, 4, METATILE_PokemonLeague_Door_Top_Open, 1\n\tsetmetatile 6, 5, METATILE_PokemonLeague_Door_Mid_Open, 0\n\tspecial DrawWholeMapView\n\tsetflag FLAG_TEMP_4\n\treturn\n\nPokemonLeague_EventScript_SetDoorOpenLance::\n\tsetmetatile 6, 4, METATILE_PokemonLeague_Door_Top_Open, 1\n\tsetmetatile 6, 5, METATILE_PokemonLeague_Door_Mid_Open, 0\n\treturn\n\nPokemonLeague_EventScript_CloseEntry::\n\tsetmetatile 5, 11, METATILE_PokemonLeague_Entry_TopLeft_Closed, 1\n\tsetmetatile 6, 11, METATILE_PokemonLeague_Entry_TopMid_Closed, 1\n\tsetmetatile 7, 11, METATILE_PokemonLeague_Entry_TopRight_Closed, 1\n\tsetmetatile 5, 12, METATILE_PokemonLeague_Entry_BottomLeft_Closed, 1\n\tsetmetatile 6, 12, METATILE_PokemonLeague_Entry_BottomMid_Closed, 1\n\tsetmetatile 7, 12, METATILE_PokemonLeague_Entry_BottomRight_Closed, 1\n\treturn\n\nPokemonLeague_Movement_ForcePlayerIn::\n\twalk_up\n\tstep_end\n\nPokemonLeague_EventScript_DoLightingEffect::\n\tspecial DoPokemonLeagueLightingEffect\n\treturn\n"
  },
  {
    "path": "data/scripts/pokemon_mansion.inc",
    "content": "PokemonMansion_EventScript_SecretSwitch::\n\tmsgbox PokemonMansion_Text_PressSecretSwitch, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, PokemonMansion_EventScript_DontPressSwitch\n\tmsgbox PokemonMansion_Text_WhoWouldnt\n\tgoto_if_set FLAG_POKEMON_MANSION_SWITCH_STATE, PokemonMansion_EventScript_ResetSwitch\n\tsetflag FLAG_POKEMON_MANSION_SWITCH_STATE\n\tswitch VAR_0x8004\n\tcase 0, PokemonMansion_EventScript_PressSwitch_1F\n\tcase 1, PokemonMansion_EventScript_PressSwitch_2F\n\tcase 2, PokemonMansion_EventScript_PressSwitch_3F\n\tcase 3, PokemonMansion_EventScript_PressSwitch_B1F\n\tend\n\nPokemonMansion_EventScript_ResetSwitch::\n\tclearflag FLAG_POKEMON_MANSION_SWITCH_STATE\n\tswitch VAR_0x8004\n\tcase 0, PokemonMansion_EventScript_ResetSwitch_1F\n\tcase 1, PokemonMansion_EventScript_ResetSwitch_2F\n\tcase 2, PokemonMansion_EventScript_ResetSwitch_3F\n\tcase 3, PokemonMansion_EventScript_ResetSwitch_B1F\n\tend\n\nPokemonMansion_EventScript_DontPressSwitch::\n\tmsgbox PokemonMansion_Text_NotQuiteYet\n\treleaseall\n\tend\n\nPokemonMansion_EventScript_PressSwitch_1F::\n\tsetmetatile 22, 10, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 23, 10, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 24, 10, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 22, 11, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 23, 11, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 24, 11, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 27, 25, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 28, 25, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 29, 25, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 27, 26, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 28, 26, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 29, 26, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 32, 25, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 33, 25, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 34, 25, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 32, 26, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 33, 26, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 34, 26, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 31, 18, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1\n\tsetmetatile 32, 18, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1\n\tsetmetatile 33, 18, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1\n\tsetmetatile 31, 19, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft, 1\n\tsetmetatile 32, 19, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid, 1\n\tsetmetatile 33, 19, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight, 1\n\tsetmetatile  5,  4, METATILE_PokemonMansion_Statue_RedEyes, 0\n\treturn\n\nPokemonMansion_EventScript_ResetSwitch_1F::\n\tsetmetatile 22, 10, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1\n\tsetmetatile 23, 10, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1\n\tsetmetatile 24, 10, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1\n\tsetmetatile 22, 11, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft, 1\n\tsetmetatile 23, 11, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid, 1\n\tsetmetatile 24, 11, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight, 1\n\tsetmetatile 27, 25, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1\n\tsetmetatile 28, 25, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1\n\tsetmetatile 29, 25, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1\n\tsetmetatile 27, 26, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft, 1\n\tsetmetatile 28, 26, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid, 1\n\tsetmetatile 29, 26, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight, 1\n\tsetmetatile 32, 25, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1\n\tsetmetatile 33, 25, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1\n\tsetmetatile 34, 25, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1\n\tsetmetatile 32, 26, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft, 1\n\tsetmetatile 33, 26, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid, 1\n\tsetmetatile 34, 26, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight, 1\n\tsetmetatile 31, 18, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 32, 18, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 33, 18, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 31, 19, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 32, 19, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 33, 19, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile  5,  4, METATILE_PokemonMansion_Statue_BlackEyes, 0\n\treturn\n\nPokemonMansion_EventScript_PressSwitch_2F::\n\tsetmetatile 24, 14, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 25, 14, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 26, 14, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 24, 15, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 25, 15, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 26, 15, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 10, 28, METATILE_PokemonMansion_Wall_EndPost_Mid, 1\n\tsetmetatile 10, 29, METATILE_PokemonMansion_Wall_EndPost_Bottom, 1\n\tsetmetatile 10, 30, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 10, 31, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 10, 32, METATILE_PokemonMansion_Wall_EndCap, 0\n\tsetmetatile 12,  4, METATILE_PokemonMansion_Barrier_Vertical_TopWall, 1\n\tsetmetatile 12,  5, METATILE_PokemonMansion_Barrier_Vertical_TopBase, 1\n\tsetmetatile 12,  6, METATILE_PokemonMansion_Barrier_Vertical_MidShadow, 1\n\tsetmetatile 12,  7, METATILE_PokemonMansion_Barrier_Vertical_Mid, 1\n\tsetmetatile 12,  8, METATILE_PokemonMansion_Barrier_Vertical_Bottom, 1\n\tsetmetatile  2, 15, METATILE_PokemonMansion_Statue_RedEyes, 0\n\treturn\n\nPokemonMansion_EventScript_ResetSwitch_2F::\n\tsetmetatile 24, 14, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1\n\tsetmetatile 25, 14, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1\n\tsetmetatile 26, 14, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1\n\tsetmetatile 24, 15, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft, 1\n\tsetmetatile 25, 15, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid, 1\n\tsetmetatile 26, 15, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight, 1\n\tsetmetatile 10, 28, METATILE_PokemonMansion_Barrier_Vertical_TopWall, 1\n\tsetmetatile 10, 29, METATILE_PokemonMansion_Barrier_Vertical_TopBase, 1\n\tsetmetatile 10, 30, METATILE_PokemonMansion_Barrier_Vertical_MidShadow, 1\n\tsetmetatile 10, 31, METATILE_PokemonMansion_Barrier_Vertical_Mid, 1\n\tsetmetatile 10, 32, METATILE_PokemonMansion_Barrier_Vertical_Bottom, 1\n\tsetmetatile 12,  4, METATILE_PokemonMansion_Wall_EndPost_Mid, 1\n\tsetmetatile 12,  5, METATILE_PokemonMansion_Wall_EndPost_Bottom, 1\n\tsetmetatile 12,  6, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 12,  7, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 12,  8, METATILE_PokemonMansion_Wall_EndCap, 0\n\tsetmetatile  2, 15, METATILE_PokemonMansion_Statue_BlackEyes, 0\n\treturn\n\nPokemonMansion_EventScript_PressSwitch_3F::\n\tsetmetatile 17, 11, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 18, 11, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 19, 11, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 17, 12, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 18, 12, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 19, 12, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 21,  4, METATILE_PokemonMansion_Barrier_Vertical_TopWall, 1\n\tsetmetatile 21,  5, METATILE_PokemonMansion_Barrier_Vertical_TopBase, 1\n\tsetmetatile 21,  6, METATILE_PokemonMansion_Barrier_Vertical_MidShadow, 1\n\tsetmetatile 21,  7, METATILE_PokemonMansion_Barrier_Vertical_Mid, 1\n\tsetmetatile 21,  8, METATILE_PokemonMansion_Barrier_Vertical_Bottom, 1\n\tsetmetatile 12,  4, METATILE_PokemonMansion_Statue_RedEyes, 0\n\treturn\n\nPokemonMansion_EventScript_ResetSwitch_3F::\n\tsetmetatile 17, 11, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1\n\tsetmetatile 18, 11, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1\n\tsetmetatile 19, 11, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1\n\tsetmetatile 17, 12, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft, 1\n\tsetmetatile 18, 12, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid, 1\n\tsetmetatile 19, 12, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight, 1\n\tsetmetatile 21,  4, METATILE_PokemonMansion_Wall_EndPost_Mid, 1\n\tsetmetatile 21,  5, METATILE_PokemonMansion_Wall_EndPost_Bottom, 1\n\tsetmetatile 21,  6, METATILE_PokemonMansion_Floor_ShadeFull, 0\n\tsetmetatile 21,  7, METATILE_PokemonMansion_Floor, 0\n\tsetmetatile 21,  8, METATILE_PokemonMansion_Wall_EndCap, 0\n\tsetmetatile 12,  4, METATILE_PokemonMansion_Statue_BlackEyes, 0\n\treturn\n\nPokemonMansion_EventScript_PressSwitch_B1F::\n\tsetmetatile 33, 20, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1\n\tsetmetatile 34, 20, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1\n\tsetmetatile 35, 20, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1\n\tsetmetatile 33, 21, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft_Basement, 1\n\tsetmetatile 34, 21, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid_Basement, 1\n\tsetmetatile 35, 21, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight_Basement, 1\n\tsetmetatile 16, 26, METATILE_PokemonMansion_Barrier_Vertical_TopWall, 1\n\tsetmetatile 16, 27, METATILE_PokemonMansion_Barrier_Vertical_TopBase, 1\n\tsetmetatile 16, 28, METATILE_PokemonMansion_Barrier_Vertical_MidShadow_Basement, 1\n\tsetmetatile 16, 29, METATILE_PokemonMansion_Barrier_Vertical_Mid_Basement, 1\n\tsetmetatile 16, 30, METATILE_PokemonMansion_Barrier_Vertical_Bottom_Basement, 1\n\tsetmetatile 12,  8, METATILE_PokemonMansion_Wall_EndPost_Mid, 1\n\tsetmetatile 12,  9, METATILE_PokemonMansion_Wall_EndPost_Bottom, 1\n\tsetmetatile 12, 10, METATILE_PokemonMansion_BasementFloor_ShadeFull, 0\n\tsetmetatile 12, 11, METATILE_PokemonMansion_BasementFloor, 0\n\tsetmetatile 12, 12, METATILE_PokemonMansion_Wall_EndCap_Basement, 0\n\tsetmetatile 20, 22, METATILE_PokemonMansion_BasementFloor_ShadeFull, 0\n\tsetmetatile 21, 22, METATILE_PokemonMansion_BasementFloor, 0\n\tsetmetatile 22, 22, METATILE_PokemonMansion_BasementFloor, 0\n\tsetmetatile 20, 23, METATILE_PokemonMansion_BasementFloor_ShadeFull, 0\n\tsetmetatile 21, 23, METATILE_PokemonMansion_BasementFloor, 0\n\tsetmetatile 22, 23, METATILE_PokemonMansion_BasementFloor, 0\n\tsetmetatile 24, 28, METATILE_PokemonMansion_Statue_RedEyes_Basement, 0\n\tsetmetatile 27,  4, METATILE_PokemonMansion_Statue_RedEyes_Basement, 0\n\treturn\n\nPokemonMansion_EventScript_ResetSwitch_B1F::\n\tsetmetatile 33, 20, METATILE_PokemonMansion_BasementFloor_ShadeFull, 0\n\tsetmetatile 34, 20, METATILE_PokemonMansion_BasementFloor, 0\n\tsetmetatile 35, 20, METATILE_PokemonMansion_BasementFloor, 0\n\tsetmetatile 33, 21, METATILE_PokemonMansion_BasementFloor_ShadeFull, 0\n\tsetmetatile 34, 21, METATILE_PokemonMansion_BasementFloor, 0\n\tsetmetatile 35, 21, METATILE_PokemonMansion_BasementFloor, 0\n\tsetmetatile 16, 26, METATILE_PokemonMansion_Wall_EndPost_Mid, 1\n\tsetmetatile 16, 27, METATILE_PokemonMansion_Wall_EndPost_Bottom, 1\n\tsetmetatile 16, 28, METATILE_PokemonMansion_BasementFloor_ShadeFull, 0\n\tsetmetatile 16, 29, METATILE_PokemonMansion_BasementFloor, 0\n\tsetmetatile 16, 30, METATILE_PokemonMansion_Wall_EndCap_Basement, 0\n\tsetmetatile 12,  8, METATILE_PokemonMansion_Barrier_Vertical_TopWall, 1\n\tsetmetatile 12,  9, METATILE_PokemonMansion_Barrier_Vertical_TopBase, 1\n\tsetmetatile 12, 10, METATILE_PokemonMansion_Barrier_Vertical_MidShadow_Basement, 1\n\tsetmetatile 12, 11, METATILE_PokemonMansion_Barrier_Vertical_Mid_Basement, 1\n\tsetmetatile 12, 12, METATILE_PokemonMansion_Barrier_Vertical_Bottom_Basement, 1\n\tsetmetatile 20, 22, METATILE_PokemonMansion_Barrier_Horizontal_TopLeft, 1\n\tsetmetatile 21, 22, METATILE_PokemonMansion_Barrier_Horizontal_TopMid, 1\n\tsetmetatile 22, 22, METATILE_PokemonMansion_Barrier_Horizontal_TopRight, 1\n\tsetmetatile 20, 23, METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft_Basement, 1\n\tsetmetatile 21, 23, METATILE_PokemonMansion_Barrier_Horizontal_BottomMid_Basement, 1\n\tsetmetatile 22, 23, METATILE_PokemonMansion_Barrier_Horizontal_BottomRight_Basement, 1\n\tsetmetatile 24, 28, METATILE_PokemonMansion_Statue_BlackEyes_Basement, 0\n\tsetmetatile 27,  4, METATILE_PokemonMansion_Statue_BlackEyes_Basement, 0\n\treturn\n"
  },
  {
    "path": "data/scripts/questionnaire.inc",
    "content": "EventScript_Questionnaire::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tmsgbox Text_FillOutQuestionnaire, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_DeclineQuestionnaire\n\tsetvar VAR_0x8004, EASY_CHAT_TYPE_QUESTIONNAIRE\n\tcall Common_ShowEasyChatScreen\n\tlock\n\tfaceplayer\n\tspecialvar VAR_0x8008, GetMartClerkObjectId\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tgoto_if_eq VAR_0x8004, 0, EventScript_EnableMysteryGift\n\tgoto_if_eq VAR_RESULT, 0, EventScript_DeclineQuestionnaire\n\tgoto_if_eq VAR_RESULT, 1, EventScript_TookQuestionnaire\n\tend\n\nEventScript_EnableMysteryGift::\n\tapplymovement VAR_0x8008, Common_Movement_FaceDown\n\twaitmovement 0\n\tplayse SE_PIN\n\tapplymovement VAR_0x8008, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement VAR_0x8008, Common_Movement_Delay48\n\twaitmovement 0\n\tmsgbox Text_YouKnowThoseWords\n\tsetflag FLAG_SYS_MYSTERY_GIFT_ENABLED\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial DisableMsgBoxWalkaway\n\tsignmsg\n\tmsgbox Text_YouCanAccessMysteryGift\n\tnormalmsg\n\treleaseall\n\tend\n\nEventScript_DeclineQuestionnaire::\n\treleaseall\n\tend\n\nEventScript_TookQuestionnaire::\n\tapplymovement VAR_0x8008, Common_Movement_FaceDown\n\twaitmovement 0\n\tmsgbox Text_QuestionnaireThankYou\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/scripts/repel.inc",
    "content": "EventScript_RepelWoreOff::\n\tcheckitem VAR_LAST_REPEL_USED, 1\n\tgoto_if_eq VAR_RESULT, TRUE, EventScript_UseAnother\n\tlock\n\tmsgbox Text_RepelWoreOff, MSGBOX_SIGN\n\trelease\n\tend\n\nEventScript_UseAnother:\n\tlock\n\tmsgbox Text_UseAnother, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_UsedRepel\n\trelease\n\tend\n\nEventScript_UsedRepel:\n\tbufferitemname STR_VAR_1, VAR_LAST_REPEL_USED\n\tplayse SE_REPEL\n\tlock\n\tmsgbox Text_UsedNewRepel, MSGBOX_SIGN\n\tremoveitem VAR_LAST_REPEL_USED, 1\n\twaitse\n\tcallnative HandleUseExpiredRepel\n\trelease\n\tend\n\nText_RepelWoreOff::\n\t.string \"REPEL's effect wore off…$\"\n\nText_UseAnother::\n\t.string \"REPEL's effect wore off!\\n\"\n\t.string \"Use another?$\"\n\nText_UsedNewRepel::\n\t.string \"{PLAYER} used the\\n\"\n\t.string \"{STR_VAR_1}.$\"\n"
  },
  {
    "path": "data/scripts/route23.inc",
    "content": "Route23_EventScript_MissingBoulderBadge::\n\tmsgbox Text_OnlySkilledTrainersAllowedThrough\n\tplayse SE_BOO\n\tmsgbox Text_CantLetYouPass\n\trelease\n\tend\n\nRoute23_EventScript_MissingBadge::\n\tmessage Text_OnlyPassWithBadgeDontHaveYet\n\twaitmessage\n\tplayse SE_BOO\n\twaitbuttonpress\n\tclosemessage\n\twaitse\n\trelease\n\tend\n\nRoute23_EventScript_AlreadyRecognizedBoulderBadge::\n\tmessage Text_OhThatsBadgeGoRightAhead\n\twaitmessage\n\tplayfanfare MUS_LEVEL_UP\n\twaitfanfare\n\twaitbuttonpress\n\trelease\n\tend\n\nRoute23_EventScript_AlreadyRecognizedBadge::\n\tmsgbox Text_OnlyPassWithBadgeOhGoAhead\n\trelease\n\tend\n\n@ Duplicate of the below, only used for Boulder Badge\nRoute22_NorthEntrance_EventScript_BadgeGuard::\n\tgoto_if_ge VAR_MAP_SCENE_ROUTE23, VAR_TEMP_1, Route23_EventScript_AlreadyRecognizedBoulderBadge\n\tswitch VAR_TEMP_1\n\tcase 1, Route23_EventScript_CheckBoulderBadge\n\tcase 2, Route23_EventScript_CheckCascadeBadge\n\tcase 3, Route23_EventScript_CheckThunderBadge\n\tcase 4, Route23_EventScript_CheckRainbowBadge\n\tcase 5, Route23_EventScript_CheckSoulBadge\n\tcase 6, Route23_EventScript_CheckMarshBadge\n\tcase 7, Route23_EventScript_CheckVolcanoBadge\n\tcase 8, Route23_EventScript_CheckEarthBadge\n\tend\n\nRoute23_EventScript_BadgeGuard::\n\tgoto_if_ge VAR_MAP_SCENE_ROUTE23, VAR_TEMP_1, Route23_EventScript_AlreadyRecognizedBadge\n\tswitch VAR_TEMP_1\n\tcase 1, Route23_EventScript_CheckBoulderBadge\n\tcase 2, Route23_EventScript_CheckCascadeBadge\n\tcase 3, Route23_EventScript_CheckThunderBadge\n\tcase 4, Route23_EventScript_CheckRainbowBadge\n\tcase 5, Route23_EventScript_CheckSoulBadge\n\tcase 6, Route23_EventScript_CheckMarshBadge\n\tcase 7, Route23_EventScript_CheckVolcanoBadge\n\tcase 8, Route23_EventScript_CheckEarthBadge\n\tend\n\nRoute23_EventScript_CheckBoulderBadge::\n\tgoto_if_set FLAG_BADGE01_GET, Route23_EventScript_RecognizeBoulderBadge\n\tgoto Route23_EventScript_MissingBoulderBadge\n\tend\n\nRoute23_EventScript_CheckCascadeBadge::\n\tgoto_if_set FLAG_BADGE02_GET, Route23_EventScript_RecognizeBadge\n\tgoto Route23_EventScript_MissingBadge\n\tend\n\nRoute23_EventScript_CheckThunderBadge::\n\tgoto_if_set FLAG_BADGE03_GET, Route23_EventScript_RecognizeBadge\n\tgoto Route23_EventScript_MissingBadge\n\tend\n\nRoute23_EventScript_CheckRainbowBadge::\n\tgoto_if_set FLAG_BADGE04_GET, Route23_EventScript_RecognizeBadge\n\tgoto Route23_EventScript_MissingBadge\n\tend\n\nRoute23_EventScript_CheckSoulBadge::\n\tgoto_if_set FLAG_BADGE05_GET, Route23_EventScript_RecognizeBadge\n\tgoto Route23_EventScript_MissingBadge\n\tend\n\nRoute23_EventScript_CheckMarshBadge::\n\tgoto_if_set FLAG_BADGE06_GET, Route23_EventScript_RecognizeBadge\n\tgoto Route23_EventScript_MissingBadge\n\tend\n\nRoute23_EventScript_CheckVolcanoBadge::\n\tgoto_if_set FLAG_BADGE07_GET, Route23_EventScript_RecognizeBadge\n\tgoto Route23_EventScript_MissingBadge\n\tend\n\nRoute23_EventScript_CheckEarthBadge::\n\tgoto_if_set FLAG_BADGE08_GET, Route23_EventScript_RecognizeBadge\n\tgoto Route23_EventScript_MissingBadge\n\tend\n\nRoute23_EventScript_RecognizeBoulderBadge::\n\tmessage Text_OhThatsBadgeGoRightAhead\n\twaitmessage\n\tplayfanfare MUS_LEVEL_UP\n\twaitfanfare\n\twaitbuttonpress\n\tcopyvar VAR_MAP_SCENE_ROUTE23, VAR_TEMP_1\n\trelease\n\tend\n\nRoute23_EventScript_RecognizeBadge::\n\tmsgbox Text_OnlyPassWithBadgeOhGoAhead\n\tcopyvar VAR_MAP_SCENE_ROUTE23, VAR_TEMP_1\n\trelease\n\tend\n\nRoute23_EventScript_BadgeGuardTrigger::\n\ttextcolor NPC_TEXT_COLOR_MALE\n\tapplymovement VAR_0x8009, Common_Movement_WalkInPlaceFasterLeft\n\twaitmovement 0\n\tswitch VAR_TEMP_1\n\tcase 1, Route23_EventScript_CheckBoulderBadgeTrigger\n\tcase 2, Route23_EventScript_CheckCascadeBadgeTrigger\n\tcase 3, Route23_EventScript_CheckThunderBadgeTrigger\n\tcase 4, Route23_EventScript_CheckRainbowBadgeTrigger\n\tcase 5, Route23_EventScript_CheckSoulBadgeTrigger\n\tcase 6, Route23_EventScript_CheckMarshBadgeTrigger\n\tcase 7, Route23_EventScript_CheckVolcanoBadgeTrigger\n\tcase 8, Route23_EventScript_CheckEarthBadgeTrigger\n\tend\n\nRoute23_EventScript_CheckBoulderBadgeTrigger::\n\tgoto_if_set FLAG_BADGE01_GET, Route23_EventScript_RecognizeBoulderBadgeTrigger\n\tgoto Route23_EventScript_MissingBoulderBadgeTrigger\n\tend\n\nRoute23_EventScript_CheckCascadeBadgeTrigger::\n\tgoto_if_set FLAG_BADGE02_GET, Route23_EventScript_RecognizeBadgeTrigger\n\tgoto Route23_EventScript_MissingBadgeTrigger\n\tend\n\nRoute23_EventScript_CheckThunderBadgeTrigger::\n\tgoto_if_set FLAG_BADGE03_GET, Route23_EventScript_RecognizeBadgeTrigger\n\tgoto Route23_EventScript_MissingBadgeTrigger\n\tend\n\nRoute23_EventScript_CheckRainbowBadgeTrigger::\n\tgoto_if_set FLAG_BADGE04_GET, Route23_EventScript_RecognizeBadgeTrigger\n\tgoto Route23_EventScript_MissingBadgeTrigger\n\tend\n\nRoute23_EventScript_CheckSoulBadgeTrigger::\n\tgoto_if_set FLAG_BADGE05_GET, Route23_EventScript_RecognizeBadgeTrigger\n\tgoto Route23_EventScript_MissingBadgeTrigger\n\tend\n\nRoute23_EventScript_CheckMarshBadgeTrigger::\n\tgoto_if_set FLAG_BADGE06_GET, Route23_EventScript_RecognizeBadgeTrigger\n\tgoto Route23_EventScript_MissingBadgeTrigger\n\tend\n\nRoute23_EventScript_CheckVolcanoBadgeTrigger::\n\tgoto_if_set FLAG_BADGE07_GET, Route23_EventScript_RecognizeBadgeTrigger\n\tgoto Route23_EventScript_MissingBadgeTrigger\n\tend\n\nRoute23_EventScript_CheckEarthBadgeTrigger::\n\tgoto_if_set FLAG_BADGE08_GET, Route23_EventScript_RecognizeBadgeTrigger\n\tgoto Route23_EventScript_MissingBadgeTrigger\n\tend\n\nRoute23_EventScript_MissingBoulderBadgeTrigger::\n\tmsgbox Text_OnlySkilledTrainersAllowedThrough\n\tplayse SE_BOO\n\tmsgbox Text_CantLetYouPass\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route23_Movement_WalkDown\n\tapplymovement VAR_0x8009, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treleaseall\n\tend\n\nRoute23_EventScript_MissingBadgeTrigger::\n\tmessage Text_OnlyPassWithBadgeDontHaveYet\n\twaitmessage\n\tplayse SE_BOO\n\twaitbuttonpress\n\tclosemessage\n\twaitse\n\tapplymovement OBJ_EVENT_ID_PLAYER, Route23_Movement_WalkDown\n\tapplymovement VAR_0x8009, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\treleaseall\n\tend\n\nRoute23_EventScript_RecognizeBoulderBadgeTrigger::\n\tmessage Text_OhThatsBadgeGoRightAhead\n\twaitmessage\n\tplayfanfare MUS_LEVEL_UP\n\twaitfanfare\n\twaitbuttonpress\n\tcopyvar VAR_MAP_SCENE_ROUTE23, VAR_TEMP_1\n\treleaseall\n\tend\n\nRoute23_EventScript_RecognizeBadgeTrigger::\n\tmsgbox Text_OnlyPassWithBadgeOhGoAhead\n\tcopyvar VAR_MAP_SCENE_ROUTE23, VAR_TEMP_1\n\treleaseall\n\tend\n\nRoute23_Movement_WalkDown::\n\twalk_down\n\tstep_end\n"
  },
  {
    "path": "data/scripts/safari_zone.inc",
    "content": "SafariZone_EventScript_OutOfBallsMidBattle::\n\tsetvar VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 3\n\tspecial ExitSafariMode\n\tsetwarp MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 4, 1\n\tend\n\nSafariZone_EventScript_Exit::\n\tsetvar VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 1\n\tspecial ExitSafariMode\n\twarp MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 4, 1\n\twaitstate\n\tend\n\nSafariZone_EventScript_RetirePrompt::\n\tlockall\n\tmsgbox SafariZone_Text_WouldYouLikeToExit, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, SafariZone_EventScript_Retire\n\treleaseall\n\tend\n\nSafariZone_EventScript_Retire::\n\tgoto SafariZone_EventScript_Exit\n\nSafariZone_EventScript_TimesUp::\n\tlockall\n\tplayse SE_DING_DONG\n\tmsgbox SafariZone_Text_TimesUp\n\tgoto SafariZone_EventScript_Exit\n\tend\n\nSafariZone_EventScript_OutOfBalls::\n\tlockall\n\tplayse SE_DING_DONG\n\tmsgbox SafariZone_Text_OutOfBalls\n\tgoto SafariZone_EventScript_Exit\n\tend\n"
  },
  {
    "path": "data/scripts/seagallop.inc",
    "content": "@ Separate selection menus for before the Rainbow Pass is obtained\nEventScript_ChooseDestFromOneIsland::\n\tgoto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, EventScript_SeviiDestinationsPage1\n\tgoto_if_ge VAR_MAP_SCENE_CINNABAR_ISLAND, 4, EventScript_ChooseDestFromOneIslandVermilionAllowed\n\tmultichoice 19, 6, MULTICHOICE_ISLAND_23, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToTwoIsland2\n\tcase 1, EventScript_SailToThreeIsland2\n\tcase 2, EventScript_CancelSail\n\tcase SCR_MENU_CANCEL, EventScript_CancelSail\n\tend\n\nEventScript_ChooseDestFromOneIslandVermilionAllowed::\n\tmultichoice 19, 5, MULTICHOICE_SEAGALLOP_V23, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToVermilion2\n\tcase 1, EventScript_SailToTwoIsland2\n\tcase 2, EventScript_SailToThreeIsland2\n\tcase 3, EventScript_CancelSail\n\tcase SCR_MENU_CANCEL, EventScript_CancelSail\n\tend\n\nEventScript_ChooseDestFromTwoIsland::\n\tgoto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, EventScript_SeviiDestinationsPage1\n\tgoto_if_ge VAR_MAP_SCENE_CINNABAR_ISLAND, 4, EventScript_ChooseDestFromTwoIslandVermilionAllowed\n\tmultichoice 19, 6, MULTICHOICE_ISLAND_13, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToOneIsland2\n\tcase 1, EventScript_SailToThreeIsland2\n\tcase 2, EventScript_CancelSail\n\tcase SCR_MENU_CANCEL, EventScript_CancelSail\n\tend\n\nEventScript_ChooseDestFromTwoIslandVermilionAllowed::\n\tmultichoice 19, 5, MULTICHOICE_SEAGALLOP_V13, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToVermilion2\n\tcase 1, EventScript_SailToOneIsland2\n\tcase 2, EventScript_SailToThreeIsland2\n\tcase 3, EventScript_CancelSail\n\tcase SCR_MENU_CANCEL, EventScript_CancelSail\n\tend\n\nEventScript_SailToVermilion2::\n\tsetvar VAR_0x8006, SEAGALLOP_VERMILION_CITY\n\tgoto EventScript_SailToDest\n\tend\n\nEventScript_SailToOneIsland2::\n\tsetvar VAR_0x8006, SEAGALLOP_ONE_ISLAND\n\tgoto EventScript_SailToDest\n\tend\n\nEventScript_SailToTwoIsland2::\n\tsetvar VAR_0x8006, SEAGALLOP_TWO_ISLAND\n\tgoto EventScript_SailToDest\n\tend\n\nEventScript_SailToThreeIsland2::\n\tsetvar VAR_0x8006, SEAGALLOP_THREE_ISLAND\n\tgoto EventScript_SailToDest\n\tend\n\nEventScript_ChooseDestFromIsland::\n\tgoto_if_ge VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F, 5, EventScript_SeviiDestinationsPage1\n\tgoto_if_ge VAR_MAP_SCENE_CINNABAR_ISLAND, 4, EventScript_ChooseDestFromIslandVermilionAllowed\n\tmultichoice 19, 6, MULTICHOICE_ISLAND_12, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToOneIsland2\n\tcase 1, EventScript_SailToTwoIsland2\n\tcase 2, EventScript_CancelSail\n\tcase SCR_MENU_CANCEL, EventScript_CancelSail\n\tend\n\nEventScript_ChooseDestFromIslandVermilionAllowed::\n\tmultichoice 19, 5, MULTICHOICE_SEAGALLOP_V12, FALSE\n\tswitch VAR_RESULT\n\tcase 0, EventScript_SailToVermilion2\n\tcase 1, EventScript_SailToOneIsland2\n\tcase 2, EventScript_SailToTwoIsland2\n\tcase 3, EventScript_CancelSail\n\tcase SCR_MENU_CANCEL, EventScript_CancelSail\n\tend\n\nEventScript_SailToDest::\n\tspecialvar VAR_RESULT, GetSeagallopNumber\n\tbuffernumberstring STR_VAR_1, VAR_RESULT\n\tgoto_if_eq VAR_0x8004, SEAGALLOP_VERMILION_CITY, EventScript_DepartingVermilion\n\tgoto_if_ne VAR_0x8004, SEAGALLOP_VERMILION_CITY, EventScript_DepartingNotVermilion\n\tend\n\nEventScript_DepartingVermilion::\n\tmsgbox VermilionCity_Text_Seagallop7Departing\n\tgoto EventScript_SetSail\n\tend\n\nEventScript_DepartingNotVermilion::\n\tmsgbox Text_AllAboardSeagallopNum\n\tgoto EventScript_SetSail\n\tend\n\nEventScript_SetSail::\n\tclosemessage\n\tdelay 20\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tfadescreen FADE_TO_BLACK\n\tspecial DoSeagallopFerryScene\n\twaitstate\n\tend\n\nEventScript_CancelSail::\n\tspecialvar VAR_RESULT, IsPlayerLeftOfVermilionSailor\n\tgoto_if_eq VAR_RESULT, TRUE, VermilionCity_EventScript_WalkUpPier\n\trelease\n\tend\n\nVermilionCity_EventScript_WalkUpPier::\n\tclosemessage\n\tapplymovement LOCALID_FERRY_SAILOR, Common_Movement_FaceOriginalDirection\n\tapplymovement OBJ_EVENT_ID_PLAYER, VermilionCity_Movement_WalkUp\n\twaitmovement 0\n\treleaseall\n\tend\n\nVermilionCity_Movement_WalkUp::\n\twalk_up\n\tstep_end\n\nEventScript_SeviiDestinationsPage1::\n\tsetvar VAR_0x8005, 0\n\tspecial DrawSeagallopDestinationMenu\n\twaitstate\n\tspecialvar VAR_0x8006, GetSelectedSeagallopDestination\n\tswitch VAR_0x8006\n\tcase SEAGALLOP_VERMILION_CITY, EventScript_SailToVermilionCity\n\tcase SEAGALLOP_ONE_ISLAND,\t EventScript_SailToOneIsland\n\tcase SEAGALLOP_TWO_ISLAND,\t EventScript_SailToTwoIsland\n\tcase SEAGALLOP_THREE_ISLAND,   EventScript_SailToThreeIsland\n\tcase SEAGALLOP_FOUR_ISLAND,\tEventScript_SailToFourIsland\n\tcase SEAGALLOP_MORE,\t\t   EventScript_SeviiDestinationsPage2\n\tcase SCR_MENU_CANCEL,\t\t  EventScript_CancelSail\n\tend\n\nEventScript_SeviiDestinationsPage2::\n\tsetvar VAR_0x8005, 1\n\tspecial DrawSeagallopDestinationMenu\n\twaitstate\n\tspecialvar VAR_0x8006, GetSelectedSeagallopDestination\n\tswitch VAR_0x8006\n\tcase SEAGALLOP_FOUR_ISLAND,  EventScript_SailToFourIsland\n\tcase SEAGALLOP_FIVE_ISLAND,  EventScript_SailToFiveIsland\n\tcase SEAGALLOP_SIX_ISLAND,   EventScript_SailToSixIsland\n\tcase SEAGALLOP_SEVEN_ISLAND, EventScript_SailToSevenIsland\n\tcase SEAGALLOP_MORE,\t\t EventScript_SeviiDestinationsPage1\n\tcase SCR_MENU_CANCEL,\t\tEventScript_CancelSail\n\tend\n\nEventScript_SailToVermilionCity::\n\tsetvar VAR_0x8006, SEAGALLOP_VERMILION_CITY\n\tgoto EventScript_SailToDest\n\tend\n\nEventScript_SailToOneIsland::\n\tsetvar VAR_0x8006, SEAGALLOP_ONE_ISLAND\n\tgoto EventScript_SailToDest\n\tend\n\nEventScript_SailToTwoIsland::\n\tsetvar VAR_0x8006, SEAGALLOP_TWO_ISLAND\n\tgoto EventScript_SailToDest\n\tend\n\nEventScript_SailToThreeIsland::\n\tsetvar VAR_0x8006, SEAGALLOP_THREE_ISLAND\n\tgoto EventScript_SailToDest\n\tend\n\nEventScript_SailToFourIsland::\n\tsetvar VAR_0x8006, SEAGALLOP_FOUR_ISLAND\n\tgoto EventScript_SailToDest\n\tend\n\nEventScript_SailToFiveIsland::\n\tsetvar VAR_0x8006, SEAGALLOP_FIVE_ISLAND\n\tgoto EventScript_SailToDest\n\tend\n\nEventScript_SailToSixIsland::\n\tsetvar VAR_0x8006, SEAGALLOP_SIX_ISLAND\n\tgoto EventScript_SailToDest\n\tend\n\nEventScript_SailToSevenIsland::\n\tsetvar VAR_0x8006, SEAGALLOP_SEVEN_ISLAND\n\tgoto EventScript_SailToDest\n\tend\n"
  },
  {
    "path": "data/scripts/set_gym_trainers.inc",
    "content": "EventScript_SetGymTrainers::\n\tswitch VAR_0x8008\n\tcase 1, EventScript_SetPewterGymTrainers\n\tcase 2, EventScript_SetCeruleanGymTrainers\n\tcase 3, EventScript_SetVermilionGymTrainers\n\tcase 4, EventScript_SetCeladonGymTrainers\n\tcase 5, EventScript_SetFuchsiaGymTrainers\n\tcase 6, EventScript_SetSaffronGymTrainers\n\tcase 7, EventScript_SetCinnabarGymTrainers\n\tcase 8, EventScript_SetViridianGymTrainers\n\tend\n\nEventScript_SetPewterGymTrainers::\n\tsettrainerflag TRAINER_CAMPER_LIAM\n\treturn\n\nEventScript_SetCeruleanGymTrainers::\n\tsettrainerflag TRAINER_PICNICKER_DIANA\n\tsettrainerflag TRAINER_SWIMMER_MALE_LUIS\n\treturn\n\nEventScript_SetVermilionGymTrainers::\n\tsettrainerflag TRAINER_SAILOR_DWAYNE\n\tsettrainerflag TRAINER_ENGINEER_BAILY\n\tsettrainerflag TRAINER_GENTLEMAN_TUCKER\n\treturn\n\nEventScript_SetCeladonGymTrainers::\n\tsettrainerflag TRAINER_LASS_KAY\n\tsettrainerflag TRAINER_LASS_LISA\n\tsettrainerflag TRAINER_PICNICKER_TINA\n\tsettrainerflag TRAINER_BEAUTY_BRIDGET\n\tsettrainerflag TRAINER_BEAUTY_TAMIA\n\tsettrainerflag TRAINER_BEAUTY_LORI\n\tsettrainerflag TRAINER_COOLTRAINER_MARY\n\treturn\n\nEventScript_SetFuchsiaGymTrainers::\n\tsettrainerflag TRAINER_TAMER_PHIL\n\tsettrainerflag TRAINER_TAMER_EDGAR\n\tsettrainerflag TRAINER_JUGGLER_KIRK\n\tsettrainerflag TRAINER_JUGGLER_SHAWN\n\tsettrainerflag TRAINER_JUGGLER_KAYDEN\n\tsettrainerflag TRAINER_JUGGLER_NATE\n\treturn\n\nEventScript_SetSaffronGymTrainers::\n\tsettrainerflag TRAINER_PSYCHIC_JOHAN\n\tsettrainerflag TRAINER_PSYCHIC_TYRON\n\tsettrainerflag TRAINER_PSYCHIC_CAMERON\n\tsettrainerflag TRAINER_PSYCHIC_PRESTON\n\tsettrainerflag TRAINER_CHANNELER_AMANDA\n\tsettrainerflag TRAINER_CHANNELER_STACY\n\tsettrainerflag TRAINER_CHANNELER_TASHA\n\treturn\n\nEventScript_SetCinnabarGymTrainers::\n\tsettrainerflag TRAINER_SUPER_NERD_ERIK\n\tsettrainerflag TRAINER_SUPER_NERD_AVERY\n\tsettrainerflag TRAINER_SUPER_NERD_DEREK\n\tsettrainerflag TRAINER_SUPER_NERD_ZAC\n\tsettrainerflag TRAINER_BURGLAR_QUINN\n\tsettrainerflag TRAINER_BURGLAR_RAMON\n\tsettrainerflag TRAINER_BURGLAR_DUSTY\n\treturn\n\nEventScript_SetViridianGymTrainers::\n\tsettrainerflag TRAINER_TAMER_JASON\n\tsettrainerflag TRAINER_TAMER_COLE\n\tsettrainerflag TRAINER_BLACK_BELT_ATSUSHI\n\tsettrainerflag TRAINER_BLACK_BELT_KIYO\n\tsettrainerflag TRAINER_BLACK_BELT_TAKASHI\n\tsettrainerflag TRAINER_COOLTRAINER_SAMUEL\n\tsettrainerflag TRAINER_COOLTRAINER_YUJI\n\tsettrainerflag TRAINER_COOLTRAINER_WARREN\n\treturn\n"
  },
  {
    "path": "data/scripts/silphco_doors.inc",
    "content": "EventScript_NeedCardKey::\n\tmsgbox Text_ItNeedsCardKey\n\treleaseall\n\tend\n\nEventScript_DoorUnlocked::\n\tmsgbox Text_TheDoorIsOpen\n\treleaseall\n\tend\n\nEventScript_Close2FDoor1::\n\tsetmetatile 5, 8, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1\n\tsetmetatile 6, 8, METATILE_SilphCo_HorizontalBarrier_TopRight, 1\n\tsetmetatile 5, 9, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1\n\tsetmetatile 6, 9, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1\n\tsetmetatile 6, 10, METATILE_SilphCo_Floor_ShadeFull, 0\n\treturn\n\nEventScript_Close2FDoor2::\n\tsetmetatile 5, 15, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1\n\tsetmetatile 6, 15, METATILE_SilphCo_HorizontalBarrier_TopRight, 1\n\tsetmetatile 5, 16, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1\n\tsetmetatile 6, 16, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1\n\tsetmetatile 6, 17, METATILE_SilphCo_Floor_ShadeFull, 0\n\treturn\n\nEventScript_Close3FDoor1::\n\tsetmetatile 9, 11, METATILE_SilphCo_VerticalBarrier_TopLeft, 1\n\tsetmetatile 10, 11, METATILE_SilphCo_VerticalBarrier_TopRight, 1\n\tsetmetatile 9, 12, METATILE_SilphCo_VerticalBarrier_MidLeft, 1\n\tsetmetatile 10, 12, METATILE_SilphCo_VerticalBarrier_MidRight, 1\n\tsetmetatile 9, 13, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1\n\tsetmetatile 10, 13, METATILE_SilphCo_VerticalBarrier_BottomRight, 1\n\treturn\n\nEventScript_Close3FDoor2::\n\tsetmetatile 20, 11, METATILE_SilphCo_VerticalBarrier_TopLeft, 1\n\tsetmetatile 21, 11, METATILE_SilphCo_VerticalBarrier_TopRight, 1\n\tsetmetatile 20, 12, METATILE_SilphCo_VerticalBarrier_MidLeft, 1\n\tsetmetatile 21, 12, METATILE_SilphCo_VerticalBarrier_MidRight, 1\n\tsetmetatile 20, 13, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1\n\tsetmetatile 21, 13, METATILE_SilphCo_VerticalBarrier_BottomRight, 1\n\treturn\n\nEventScript_Close4FDoor1::\n\tsetmetatile 3, 16, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1\n\tsetmetatile 4, 16, METATILE_SilphCo_HorizontalBarrier_TopRight, 1\n\tsetmetatile 3, 17, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1\n\tsetmetatile 4, 17, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1\n\tsetmetatile 4, 18, METATILE_SilphCo_Floor_ShadeFull, 0\n\treturn\n\nEventScript_Close4FDoor2::\n\tsetmetatile 14, 11, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1\n\tsetmetatile 15, 11, METATILE_SilphCo_HorizontalBarrier_TopRight, 1\n\tsetmetatile 14, 12, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1\n\tsetmetatile 15, 12, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1\n\tsetmetatile 15, 13, METATILE_SilphCo_Floor_ShadeFull, 0\n\treturn\n\nEventScript_Close5FDoor1::\n\tsetmetatile 7, 8, METATILE_SilphCo_VerticalBarrier_TopLeft, 1\n\tsetmetatile 8, 8, METATILE_SilphCo_VerticalBarrier_TopRight, 1\n\tsetmetatile 7, 9, METATILE_SilphCo_VerticalBarrier_MidLeft, 1\n\tsetmetatile 8, 9, METATILE_SilphCo_VerticalBarrier_MidRight, 1\n\tsetmetatile 7, 10, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1\n\tsetmetatile 8, 10, METATILE_SilphCo_VerticalBarrier_BottomRight, 1\n\treturn\n\nEventScript_Close5FDoor2::\n\tsetmetatile 7, 17, METATILE_SilphCo_VerticalBarrier_TopLeft, 1\n\tsetmetatile 8, 17, METATILE_SilphCo_VerticalBarrier_TopRight, 1\n\tsetmetatile 7, 18, METATILE_SilphCo_VerticalBarrier_MidLeft, 1\n\tsetmetatile 8, 18, METATILE_SilphCo_VerticalBarrier_MidRight, 1\n\tsetmetatile 7, 19, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1\n\tsetmetatile 8, 19, METATILE_SilphCo_VerticalBarrier_BottomRight, 1\n\treturn\n\nEventScript_Close5FDoor3::\n\tsetmetatile 18, 12, METATILE_SilphCo_VerticalBarrier_TopLeft, 1\n\tsetmetatile 19, 12, METATILE_SilphCo_VerticalBarrier_TopRight, 1\n\tsetmetatile 18, 13, METATILE_SilphCo_VerticalBarrier_MidLeft, 1\n\tsetmetatile 19, 13, METATILE_SilphCo_VerticalBarrier_MidRight, 1\n\tsetmetatile 18, 14, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1\n\tsetmetatile 19, 14, METATILE_SilphCo_VerticalBarrier_BottomRight, 1\n\treturn\n\nEventScript_Close6FDoor::\n\tsetmetatile 5, 14, METATILE_SilphCo_VerticalBarrier_TopLeft, 1\n\tsetmetatile 6, 14, METATILE_SilphCo_VerticalBarrier_TopRight, 1\n\tsetmetatile 5, 15, METATILE_SilphCo_VerticalBarrier_MidLeft, 1\n\tsetmetatile 6, 15, METATILE_SilphCo_VerticalBarrier_MidRight, 1\n\tsetmetatile 5, 16, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1\n\tsetmetatile 6, 16, METATILE_SilphCo_VerticalBarrier_BottomRight, 1\n\treturn\n\nEventScript_Close7FDoor1::\n\tsetmetatile 11, 8, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1\n\tsetmetatile 12, 8, METATILE_SilphCo_HorizontalBarrier_TopRight, 1\n\tsetmetatile 11, 9, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1\n\tsetmetatile 12, 9, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1\n\tsetmetatile 12, 10, METATILE_SilphCo_Floor_ShadeFull, 0\n\treturn\n\nEventScript_Close7FDoor2::\n\tsetmetatile 24, 7, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1\n\tsetmetatile 25, 7, METATILE_SilphCo_HorizontalBarrier_TopRight, 1\n\tsetmetatile 24, 8, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1\n\tsetmetatile 25, 8, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1\n\tsetmetatile 25, 9, METATILE_SilphCo_Floor_ShadeFull, 0\n\treturn\n\nEventScript_Close7FDoor3::\n\tsetmetatile 25, 13, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1\n\tsetmetatile 26, 13, METATILE_SilphCo_HorizontalBarrier_TopRight, 1\n\tsetmetatile 25, 14, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1\n\tsetmetatile 26, 14, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1\n\tsetmetatile 26, 15, METATILE_SilphCo_Floor_ShadeFull, 0\n\treturn\n\nEventScript_Close8FDoor::\n\tsetmetatile 5, 9, METATILE_SilphCo_VerticalBarrier_TopLeft, 1\n\tsetmetatile 6, 9, METATILE_SilphCo_VerticalBarrier_TopRight, 1\n\tsetmetatile 5, 10, METATILE_SilphCo_VerticalBarrier_MidLeft, 1\n\tsetmetatile 6, 10, METATILE_SilphCo_VerticalBarrier_MidRight, 1\n\tsetmetatile 5, 11, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1\n\tsetmetatile 6, 11, METATILE_SilphCo_VerticalBarrier_BottomRight, 1\n\treturn\n\nEventScript_Close9FDoor1::\n\tsetmetatile 2, 9, METATILE_SilphCo_VerticalBarrier_TopLeft, 1\n\tsetmetatile 3, 9, METATILE_SilphCo_VerticalBarrier_TopRight, 1\n\tsetmetatile 2, 10, METATILE_SilphCo_VerticalBarrier_MidLeft, 1\n\tsetmetatile 3, 10, METATILE_SilphCo_VerticalBarrier_MidRight, 1\n\tsetmetatile 2, 11, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1\n\tsetmetatile 3, 11, METATILE_SilphCo_VerticalBarrier_BottomRight, 1\n\treturn\n\nEventScript_Close9FDoor2::\n\tsetmetatile 12, 15, METATILE_SilphCo_VerticalBarrier_TopLeft, 1\n\tsetmetatile 13, 15, METATILE_SilphCo_VerticalBarrier_TopRight, 1\n\tsetmetatile 12, 16, METATILE_SilphCo_VerticalBarrier_MidLeft, 1\n\tsetmetatile 13, 16, METATILE_SilphCo_VerticalBarrier_MidRight, 1\n\tsetmetatile 12, 17, METATILE_SilphCo_VerticalBarrier_BottomLeft, 1\n\tsetmetatile 13, 17, METATILE_SilphCo_VerticalBarrier_BottomRight, 1\n\treturn\n\nEventScript_Close9FDoor3::\n\tsetmetatile 21, 6, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1\n\tsetmetatile 22, 6, METATILE_SilphCo_HorizontalBarrier_TopRight, 1\n\tsetmetatile 21, 7, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1\n\tsetmetatile 22, 7, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1\n\tsetmetatile 22, 8, METATILE_SilphCo_Floor_ShadeFull, 0\n\treturn\n\nEventScript_Close9FDoor4::\n\tsetmetatile 21, 12, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1\n\tsetmetatile 22, 12, METATILE_SilphCo_HorizontalBarrier_TopRight, 1\n\tsetmetatile 21, 13, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1\n\tsetmetatile 22, 13, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1\n\tsetmetatile 22, 14, METATILE_SilphCo_Floor_ShadeFull, 0\n\treturn\n\nEventScript_Close10FDoor::\n\tsetmetatile 12, 11, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1\n\tsetmetatile 13, 11, METATILE_SilphCo_HorizontalBarrier_TopRight, 1\n\tsetmetatile 12, 12, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1\n\tsetmetatile 13, 12, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1\n\tsetmetatile 13, 13, METATILE_SilphCo_Floor_ShadeFull, 0\n\treturn\n\nEventScript_Close11FDoor::\n\tsetmetatile 5, 16, METATILE_SilphCo_HorizontalBarrier_TopLeft, 1\n\tsetmetatile 6, 16, METATILE_SilphCo_HorizontalBarrier_TopRight, 1\n\tsetmetatile 5, 17, METATILE_SilphCo_HorizontalBarrier_BottomLeft, 1\n\tsetmetatile 6, 17, METATILE_SilphCo_HorizontalBarrier_BottomRight, 1\n\tsetmetatile 6, 18, METATILE_SilphCo_Floor_ShadeFull, 0\n\treturn\n\nEventScript_Open2FDoor1::\n\tsetmetatile 5, 8, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 6, 8, METATILE_SilphCo_Floor, 0\n\tsetmetatile 5, 9, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 6, 9, METATILE_SilphCo_Floor, 0\n\tsetmetatile 6, 10, METATILE_SilphCo_Floor, 0\n\treturn\n\nEventScript_Open2FDoor2::\n\tsetmetatile 5, 15, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 6, 15, METATILE_SilphCo_Floor, 0\n\tsetmetatile 5, 16, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 6, 16, METATILE_SilphCo_Floor, 0\n\tsetmetatile 6, 17, METATILE_SilphCo_Floor, 0\n\treturn\n\nEventScript_Open3FDoor1::\n\tsetmetatile 9, 11, METATILE_SilphCo_Wall_LeftEdge, 1\n\tsetmetatile 10, 11, METATILE_SilphCo_Wall_RightEdge, 1\n\tsetmetatile 9, 12, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 10, 12, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 9, 13, METATILE_SilphCo_Floor_WallLeftCorner, 0\n\tsetmetatile 10, 13, METATILE_SilphCo_Floor_WallRightCorner, 0\n\treturn\n\nEventScript_Open3FDoor2::\n\tsetmetatile 20, 11, METATILE_SilphCo_Wall_LeftEdge, 1\n\tsetmetatile 21, 11, METATILE_SilphCo_Wall_RightEdge, 1\n\tsetmetatile 20, 12, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 21, 12, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 20, 13, METATILE_SilphCo_Floor_WallLeftCorner, 0\n\tsetmetatile 21, 13, METATILE_SilphCo_Floor_WallRightCorner, 0\n\treturn\n\nEventScript_Open4FDoor1::\n\tsetmetatile 3, 16, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 4, 16, METATILE_SilphCo_Floor, 0\n\tsetmetatile 3, 17, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 4, 17, METATILE_SilphCo_Floor, 0\n\tsetmetatile 4, 18, METATILE_SilphCo_Floor, 0\n\treturn\n\nEventScript_Open4FDoor2::\n\tsetmetatile 14, 11, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 15, 11, METATILE_SilphCo_Floor, 0\n\tsetmetatile 14, 12, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 15, 12, METATILE_SilphCo_Floor, 0\n\tsetmetatile 15, 13, METATILE_SilphCo_Floor, 0\n\treturn\n\nEventScript_Open5FDoor1::\n\tsetmetatile 7, 8, METATILE_SilphCo_Wall_LeftEdge, 1\n\tsetmetatile 8, 8, METATILE_SilphCo_Wall_RightEdge, 1\n\tsetmetatile 7, 9, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 8, 9, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 7, 10, METATILE_SilphCo_Floor_WallLeftCorner, 0\n\tsetmetatile 8, 10, METATILE_SilphCo_Floor_WallRightCorner, 0\n\treturn\n\nEventScript_Open5FDoor2::\n\tsetmetatile 7, 17, METATILE_SilphCo_Wall_LeftEdge, 1\n\tsetmetatile 8, 17, METATILE_SilphCo_Wall_RightEdge, 1\n\tsetmetatile 7, 18, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 8, 18, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 7, 19, METATILE_SilphCo_Floor_WallLeftCorner, 0\n\tsetmetatile 8, 19, METATILE_SilphCo_Floor_WallRightCorner, 0\n\treturn\n\nEventScript_Open5FDoor3::\n\tsetmetatile 18, 12, METATILE_SilphCo_Wall_LeftEdge, 1\n\tsetmetatile 19, 12, METATILE_SilphCo_Wall_RightEdge, 1\n\tsetmetatile 18, 13, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 19, 13, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 18, 14, METATILE_SilphCo_Floor_WallLeftCorner, 0\n\tsetmetatile 19, 14, METATILE_SilphCo_Floor_WallRightCorner, 0\n\treturn\n\nEventScript_Open6FDoor::\n\tsetmetatile 5, 14, METATILE_SilphCo_Wall_LeftEdge, 1\n\tsetmetatile 6, 14, METATILE_SilphCo_Wall_RightEdge, 1\n\tsetmetatile 5, 15, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 6, 15, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 5, 16, METATILE_SilphCo_Floor_WallLeftCorner, 0\n\tsetmetatile 6, 16, METATILE_SilphCo_Floor_WallRightCorner, 0\n\treturn\n\nEventScript_Open7FDoor1::\n\tsetmetatile 11, 8, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 12, 8, METATILE_SilphCo_Floor, 0\n\tsetmetatile 11, 9, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 12, 9, METATILE_SilphCo_Floor, 0\n\tsetmetatile 12, 10, METATILE_SilphCo_Floor, 0\n\treturn\n\nEventScript_Open7FDoor2::\n\tsetmetatile 24, 7, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 25, 7, METATILE_SilphCo_Floor, 0\n\tsetmetatile 24, 8, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 25, 8, METATILE_SilphCo_Floor, 0\n\tsetmetatile 25, 9, METATILE_SilphCo_Floor, 0\n\treturn\n\nEventScript_Open7FDoor3::\n\tsetmetatile 25, 13, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 26, 13, METATILE_SilphCo_Floor, 0\n\tsetmetatile 25, 14, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 26, 14, METATILE_SilphCo_Floor, 0\n\tsetmetatile 26, 15, METATILE_SilphCo_Floor, 0\n\treturn\n\nEventScript_Open8FDoor::\n\tsetmetatile 5, 9, METATILE_SilphCo_Wall_LeftEdge, 1\n\tsetmetatile 6, 9, METATILE_SilphCo_Wall_RightEdge, 1\n\tsetmetatile 5, 10, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 6, 10, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 5, 11, METATILE_SilphCo_Floor_WallLeftCorner, 0\n\tsetmetatile 6, 11, METATILE_SilphCo_Floor_WallRightCorner, 0\n\treturn\n\nEventScript_Open9FDoor1::\n\tsetmetatile 2, 9, METATILE_SilphCo_Wall_LeftEdge, 1\n\tsetmetatile 3, 9, METATILE_SilphCo_Wall_RightEdge, 1\n\tsetmetatile 2, 10, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 3, 10, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 2, 11, METATILE_SilphCo_Floor_WallLeftCorner, 0\n\tsetmetatile 3, 11, METATILE_SilphCo_Floor_WallRightCorner, 0\n\treturn\n\nEventScript_Open9FDoor2::\n\tsetmetatile 12, 15, METATILE_SilphCo_Wall_LeftEdge, 1\n\tsetmetatile 13, 15, METATILE_SilphCo_Wall_RightEdge, 1\n\tsetmetatile 12, 16, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 13, 16, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 12, 17, METATILE_SilphCo_Floor_WallLeftCorner, 0\n\tsetmetatile 13, 17, METATILE_SilphCo_Floor_WallRightCorner, 0\n\treturn\n\nEventScript_Open9FDoor3::\n\tsetmetatile 21, 6, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 22, 6, METATILE_SilphCo_Floor, 0\n\tsetmetatile 21, 7, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 22, 7, METATILE_SilphCo_Floor, 0\n\tsetmetatile 22, 8, METATILE_SilphCo_Floor, 0\n\treturn\n\nEventScript_Open9FDoor4::\n\tsetmetatile 21, 12, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 22, 12, METATILE_SilphCo_Floor, 0\n\tsetmetatile 21, 13, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 22, 13, METATILE_SilphCo_Floor, 0\n\tsetmetatile 22, 14, METATILE_SilphCo_Floor, 0\n\treturn\n\nEventScript_Open10FDoor::\n\tsetmetatile 12, 11, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 13, 11, METATILE_SilphCo_Floor, 0\n\tsetmetatile 12, 12, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 13, 12, METATILE_SilphCo_Floor, 0\n\tsetmetatile 13, 13, METATILE_SilphCo_Floor, 0\n\treturn\n\nEventScript_Open11FDoor::\n\tsetmetatile 5, 16, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 6, 16, METATILE_SilphCo_Floor, 0\n\tsetmetatile 5, 17, METATILE_SilphCo_Floor_ShadeFull, 0\n\tsetmetatile 6, 17, METATILE_SilphCo_Floor, 0\n\tsetmetatile 6, 18, METATILE_SilphCo_Floor, 0\n\treturn\n\nSilphCo_2F_EventScript_Door1::\n\tlockall\n\tsetvar VAR_TEMP_1, 1\n\tsetvar VAR_0x8004, FLAG_SILPH_2F_DOOR_1\n\tgoto_if_set FLAG_SILPH_2F_DOOR_1, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_2F_EventScript_Door2::\n\tlockall\n\tsetvar VAR_TEMP_1, 2\n\tsetvar VAR_0x8004, FLAG_SILPH_2F_DOOR_2\n\tgoto_if_set FLAG_SILPH_2F_DOOR_2, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_3F_EventScript_Door1::\n\tlockall\n\tsetvar VAR_TEMP_1, 3\n\tsetvar VAR_0x8004, FLAG_SILPH_3F_DOOR_1\n\tgoto_if_set FLAG_SILPH_3F_DOOR_1, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_3F_EventScript_Door2::\n\tlockall\n\tsetvar VAR_TEMP_1, 4\n\tsetvar VAR_0x8004, FLAG_SILPH_3F_DOOR_2\n\tgoto_if_set FLAG_SILPH_3F_DOOR_2, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_4F_EventScript_Door1::\n\tlockall\n\tsetvar VAR_TEMP_1, 5\n\tsetvar VAR_0x8004, FLAG_SILPH_4F_DOOR_1\n\tgoto_if_set FLAG_SILPH_4F_DOOR_1, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_4F_EventScript_Door2::\n\tlockall\n\tsetvar VAR_TEMP_1, 6\n\tsetvar VAR_0x8004, FLAG_SILPH_4F_DOOR_2\n\tgoto_if_set FLAG_SILPH_4F_DOOR_2, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_5F_EventScript_Door1::\n\tlockall\n\tsetvar VAR_TEMP_1, 7\n\tsetvar VAR_0x8004, FLAG_SILPH_5F_DOOR_1\n\tgoto_if_set FLAG_SILPH_5F_DOOR_1, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_5F_EventScript_Door2::\n\tlockall\n\tsetvar VAR_TEMP_1, 8\n\tsetvar VAR_0x8004, FLAG_SILPH_5F_DOOR_2\n\tgoto_if_set FLAG_SILPH_5F_DOOR_2, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_5F_EventScript_Door3::\n\tlockall\n\tsetvar VAR_TEMP_1, 9\n\tsetvar VAR_0x8004, FLAG_SILPH_5F_DOOR_3\n\tgoto_if_set FLAG_SILPH_5F_DOOR_3, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_6F_EventScript_Door::\n\tlockall\n\tsetvar VAR_TEMP_1, 10\n\tsetvar VAR_0x8004, FLAG_SILPH_6F_DOOR\n\tgoto_if_set FLAG_SILPH_6F_DOOR, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_7F_EventScript_Door1::\n\tlockall\n\tsetvar VAR_TEMP_1, 11\n\tsetvar VAR_0x8004, FLAG_SILPH_7F_DOOR_1\n\tgoto_if_set FLAG_SILPH_7F_DOOR_1, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_7F_EventScript_Door2::\n\tlockall\n\tsetvar VAR_TEMP_1, 12\n\tsetvar VAR_0x8004, FLAG_SILPH_7F_DOOR_2\n\tgoto_if_set FLAG_SILPH_7F_DOOR_2, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_7F_EventScript_Door3::\n\tlockall\n\tsetvar VAR_TEMP_1, 13\n\tsetvar VAR_0x8004, FLAG_SILPH_7F_DOOR_3\n\tgoto_if_set FLAG_SILPH_7F_DOOR_3, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_8F_EventScript_Door::\n\tlockall\n\tsetvar VAR_TEMP_1, 14\n\tsetvar VAR_0x8004, FLAG_SILPH_8F_DOOR\n\tgoto_if_set FLAG_SILPH_8F_DOOR, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_9F_EventScript_Door1::\n\tlockall\n\tsetvar VAR_TEMP_1, 15\n\tsetvar VAR_0x8004, FLAG_SILPH_9F_DOOR_1\n\tgoto_if_set FLAG_SILPH_9F_DOOR_1, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_9F_EventScript_Door2::\n\tlockall\n\tsetvar VAR_TEMP_1, 16\n\tsetvar VAR_0x8004, FLAG_SILPH_9F_DOOR_2\n\tgoto_if_set FLAG_SILPH_9F_DOOR_2, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_9F_EventScript_Door3::\n\tlockall\n\tsetvar VAR_TEMP_1, 17\n\tsetvar VAR_0x8004, FLAG_SILPH_9F_DOOR_3\n\tgoto_if_set FLAG_SILPH_9F_DOOR_3, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_9F_EventScript_Door4::\n\tlockall\n\tsetvar VAR_TEMP_1, 18\n\tsetvar VAR_0x8004, FLAG_SILPH_9F_DOOR_4\n\tgoto_if_set FLAG_SILPH_9F_DOOR_4, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_10F_EventScript_Door::\n\tlockall\n\tsetvar VAR_TEMP_1, 19\n\tsetvar VAR_0x8004, FLAG_SILPH_10F_DOOR\n\tgoto_if_set FLAG_SILPH_10F_DOOR, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nSilphCo_11F_EventScript_Door::\n\tlockall\n\tsetvar VAR_TEMP_1, 20\n\tsetvar VAR_0x8004, FLAG_SILPH_11F_DOOR\n\tgoto_if_set FLAG_SILPH_11F_DOOR, EventScript_DoorUnlocked\n\tgoto EventScript_TryUnlockDoor\n\tend\n\nEventScript_TryUnlockDoor::\n\tgoto_if_set FLAG_HIDE_SILPH_CO_5F_CARD_KEY, EventScript_OpenDoor\n\tgoto EventScript_NeedCardKey\n\tend\n\nEventScript_OpenDoor::\n\tplayfanfare MUS_LEVEL_UP\n\tmsgbox Text_CardKeyOpenedDoor\n\twaitfanfare\n\tcall_if_eq VAR_TEMP_1, 1, EventScript_Open2FDoor1\n\tcall_if_eq VAR_TEMP_1, 2, EventScript_Open2FDoor2\n\tcall_if_eq VAR_TEMP_1, 3, EventScript_Open3FDoor1\n\tcall_if_eq VAR_TEMP_1, 4, EventScript_Open3FDoor2\n\tcall_if_eq VAR_TEMP_1, 5, EventScript_Open4FDoor1\n\tcall_if_eq VAR_TEMP_1, 6, EventScript_Open4FDoor2\n\tcall_if_eq VAR_TEMP_1, 7, EventScript_Open5FDoor1\n\tcall_if_eq VAR_TEMP_1, 8, EventScript_Open5FDoor2\n\tcall_if_eq VAR_TEMP_1, 9, EventScript_Open5FDoor3\n\tcall_if_eq VAR_TEMP_1, 10, EventScript_Open6FDoor\n\tcall_if_eq VAR_TEMP_1, 11, EventScript_Open7FDoor1\n\tcall_if_eq VAR_TEMP_1, 12, EventScript_Open7FDoor2\n\tcall_if_eq VAR_TEMP_1, 13, EventScript_Open7FDoor3\n\tcall_if_eq VAR_TEMP_1, 14, EventScript_Open8FDoor\n\tcall_if_eq VAR_TEMP_1, 15, EventScript_Open9FDoor1\n\tcall_if_eq VAR_TEMP_1, 16, EventScript_Open9FDoor2\n\tcall_if_eq VAR_TEMP_1, 17, EventScript_Open9FDoor3\n\tcall_if_eq VAR_TEMP_1, 18, EventScript_Open9FDoor4\n\tcall_if_eq VAR_TEMP_1, 19, EventScript_Open10FDoor\n\tcall_if_eq VAR_TEMP_1, 20, EventScript_Open11FDoor\n\twaitse\n\tplayse SE_UNLOCK\n\tspecial DrawWholeMapView\n\twaitse\n\tspecial SetHiddenItemFlag\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/scripts/static_pokemon.inc",
    "content": "EventScript_RemoveStaticMon::\n    fadescreenswapbuffers FADE_TO_BLACK\n    removeobject VAR_LAST_TALKED\n    fadescreenswapbuffers FADE_FROM_BLACK\n    release\n    end\n\nEventScript_MonFlewAway::\n    fadescreenswapbuffers FADE_TO_BLACK\n    removeobject VAR_LAST_TALKED\n    fadescreenswapbuffers FADE_FROM_BLACK\n    bufferspeciesname STR_VAR_1, VAR_0x8004\n    msgbox Text_MonFlewAway\n    release\n    end\n\nEventScript_AwakenSnorlax::\n    message Text_PlayedPokeFlute\n    waitmessage\n    playfanfare MUS_POKE_FLUTE\n    waitfanfare\n    msgbox Text_SnorlaxWokeUp\n    return\n"
  },
  {
    "path": "data/scripts/std_msgbox.inc",
    "content": "Std_MsgboxNPC::\n\tlock\n\tfaceplayer\n\tmessage 0x0\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\treturn\n\nStd_MsgboxSign::\n\tlockall\n\tmessage 0x0\n\twaitmessage\n\twaitbuttonpress\n\treleaseall\n\treturn\n\nStd_MsgboxDefault::\n\tmessage 0x0\n\twaitmessage\n\twaitbuttonpress\n\treturn\n\nStd_MsgboxYesNo::\n\tmessage 0x0\n\twaitmessage\n\tyesnobox 20, 8\n\treturn\n\nStd_ReceivedItem::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tcall_if_eq VAR_0x8002, MUS_LEVEL_UP, EventScript_ReceivedItemFanfare1\n\tcall_if_eq VAR_0x8002, MUS_OBTAIN_KEY_ITEM, EventScript_ReceivedItemFanfare2\n\tmessage 0x0\n\twaitmessage\n\twaitfanfare\n\tcall_if_eq VAR_0x8002, MUS_LEVEL_UP, EventScript_ReceivedItemWaitFanfare\n\tputitemaway VAR_0x8000, VAR_0x8001\n\tcall EventScript_RestorePrevTextColor\n\treturn\n\nEventScript_ReceivedItemFanfare1::\n\tplayfanfare MUS_LEVEL_UP\n\treturn\n\nEventScript_ReceivedItemFanfare2::\n\tplayfanfare MUS_OBTAIN_KEY_ITEM\n\treturn\n\nEventScript_ReceivedItemWaitFanfare::\n\tdelay 50\n\treturn\n\nEventScript_UnusedReturn::\n\treturn\n\nEventScript_AskSaveGame::\n\tspecial Field_AskSaveTheGame\n\twaitstate\n\treturn\n"
  },
  {
    "path": "data/scripts/surf.inc",
    "content": "EventScript_UseSurf::\n\tgoto_if_questlog EventScript_UseSurfEnd\n\tcheckpartymove MOVE_SURF\n\tgoto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_UseSurfEnd\n\tbufferpartymonnick STR_VAR_1, VAR_RESULT\n\tsetfieldeffectargument 0, VAR_RESULT\n\tlockall\n\tmsgbox Text_WantToSurf, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, EventScript_UseSurfRelease\n\tmsgbox Text_UsedSurf\n\tdofieldeffect FLDEFF_USE_SURF\nEventScript_UseSurfRelease:\n\treleaseall\nEventScript_UseSurfEnd:\n\tend\n\nEventScript_CurrentTooFast::\n\tlockall\n\tmsgbox Text_CurrentTooFast\n\treleaseall\n\tend\n"
  },
  {
    "path": "data/scripts/trainer_battle.inc",
    "content": "EventScript_DoTrainerBattleFromApproach::\n\tlock\n\tspecial PlayTrainerEncounterMusic\n\tspecial EndTrainerApproach\n\twaitstate\n\tgoto EventScript_DoTrainerBattle\n\nEventScript_TryDoNormalTrainerBattle::\n\tlock\n\tfaceplayer\n\tapplymovement VAR_LAST_TALKED, Movement_RevealTrainer\n\twaitmovement 0\n\tspecialvar VAR_RESULT, Script_HasTrainerBeenFought\n\tgoto_if_ne VAR_RESULT, FALSE, EventScript_NoTrainerBattle\n\tspecial PlayTrainerEncounterMusic\n\tspecial SetUpTrainerMovement\n\tgoto EventScript_DoTrainerBattle\n\nEventScript_NoTrainerBattle::\n\tgotopostbattlescript\n\nEventScript_TryDoDoubleTrainerBattle::\n\tlock\n\tfaceplayer\n\tcall EventScript_RevealTrainer\n\tspecialvar VAR_RESULT, Script_HasTrainerBeenFought\n\tgoto_if_ne VAR_RESULT, FALSE, EventScript_NoDoubleTrainerBattle\n\tspecial HasEnoughMonsForDoubleBattle\n\tgoto_if_ne VAR_RESULT, PLAYER_HAS_TWO_USABLE_MONS, EventScript_NotEnoughMonsForDoubleBattle\n\tspecial PlayTrainerEncounterMusic\n\tspecial SetUpTrainerMovement\n\tgoto EventScript_DoTrainerBattle\n\nEventScript_NotEnoughMonsForDoubleBattle::\n\tspecial ShowTrainerCantBattleSpeech\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nEventScript_NoDoubleTrainerBattle::\n\tgotopostbattlescript\n\nEventScript_DoNoIntroTrainerBattle::\n\tapplymovement VAR_LAST_TALKED, Movement_RevealTrainer\n\twaitmovement 0\n\tspecial PlayTrainerEncounterMusic\n\tgoto_if_questlog EventScript_EndQuestLogBattle\n\tdotrainerbattle\n\tgotopostbattlescript\n\nEventScript_TryDoRematchBattle::\n\tcall EventScript_RevealTrainer\n\tspecialvar VAR_RESULT, IsTrainerReadyForRematch\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_NoRematchBattle\n\tspecial PlayTrainerEncounterMusic\n\tspecial SetUpTrainerMovement\n\tspecial ShowTrainerIntroSpeech\n\twaitmessage\n\twaitbuttonpress\n\tgoto_if_questlog EventScript_EndQuestLogRematch\n\tspecial StartRematchBattle\n\twaitstate\n\treleaseall\n\tend\n\nEventScript_NoRematchBattle::\n\tgotopostbattlescript\n\nEventScript_TryDoDoubleRematchBattle::\n\tspecialvar VAR_RESULT, IsTrainerReadyForRematch\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_NoDoubleRematchBattle\n\tspecial HasEnoughMonsForDoubleBattle\n\tgoto_if_ne VAR_RESULT, PLAYER_HAS_TWO_USABLE_MONS, EventScript_NotEnoughMonsForDoubleRematchBattle\n\tspecial PlayTrainerEncounterMusic\n\tspecial SetUpTrainerMovement\n\tspecial ShowTrainerIntroSpeech\n\twaitmessage\n\twaitbuttonpress\n\tgoto_if_questlog EventScript_EndQuestLogRematch\n\tspecial StartRematchBattle\n\twaitstate\n\treleaseall\n\tend\n\nEventScript_NoDoubleRematchBattle::\n\tgotopostbattlescript\n\nEventScript_NotEnoughMonsForDoubleRematchBattle::\n\tspecial ShowTrainerCantBattleSpeech\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\tend\n\nEventScript_EndQuestLogRematch::\n\treleaseall\n\tend\n\nEventScript_RevealTrainer::\n\tapplymovement VAR_LAST_TALKED, Movement_RevealTrainer\n\twaitmovement 0\n\treturn\n\nMovement_RevealTrainer::\n\treveal_trainer\n\tstep_end\n\nEventScript_DoTrainerBattle::\n\tspecial ShowTrainerIntroSpeech\n\twaitmessage\n\twaitbuttonpress\n\tgoto_if_questlog EventScript_EndQuestLogBattle\n\tdotrainerbattle\n\tspecialvar VAR_RESULT, GetTrainerBattleMode\n\tgoto_if_eq VAR_RESULT, TRAINER_BATTLE_SINGLE, EventScript_EndTrainerBattle\n\tgoto_if_eq VAR_RESULT, TRAINER_BATTLE_CONTINUE_SCRIPT, EventScript_EndTrainerBattleContinueScript\n\tgoto_if_eq VAR_RESULT, TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC, EventScript_EndTrainerBattleContinueScript\n\tgoto_if_eq VAR_RESULT, TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE, EventScript_EndTrainerBattleContinueScript\n\tgoto_if_eq VAR_RESULT, TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC, EventScript_EndTrainerBattleContinueScript\nEventScript_EndTrainerBattle::\n\treleaseall\n\tend\n\nEventScript_EndTrainerBattleContinueScript::\n\tgotobeatenscript\n\nEventScript_EndQuestLogBattle::\n\tspecial SetBattledTrainerFlag\n\treleaseall\n\tend\n\nStd_MsgboxAutoclose::\n\tmessage 0x0\n\twaitmessage\n\twaitbuttonpress\n\trelease\n\treturn\n"
  },
  {
    "path": "data/scripts/trainer_card.inc",
    "content": ".set LOCALID_STICKER_MAN, 1\n\nCeladonCity_GameCorner_EventScript_PhotoPrinter::\n\tlockall\n\tshowmoneybox 0, 0\n\tmsgbox CeladonCity_GameCorner_Text_TryPokemonPrinter, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, NO, CeladonCity_GameCorner_EventScript_DeclinePhoto\n\tcheckmoney 50\n\tgoto_if_eq VAR_RESULT, FALSE, CeladonCity_GameCorner_EventScript_NotEnoughMoneyForPhoto\n\tplayse SE_SHOP\n\tremovemoney 50\n\tupdatemoneybox\n\twaitse\n\tmessage CeladonCity_GameCorner_Text_ChoosePrintType\n\twaitmessage\n\tmultichoice 21, 0, MULTICHOICE_TRAINER_CARD_ICON_TINT, TRUE\n\tswitch VAR_RESULT\n\tcase 0, CeladonCity_GameCorner_EventScript_PrintTypeNormal\n\tcase 1, CeladonCity_GameCorner_EventScript_PrintTypeBlack\n\tcase 2, CeladonCity_GameCorner_EventScript_PrintTypePink\n\tcase 3, CeladonCity_GameCorner_EventScript_PrintTypeSepia\n\tend\n\nCeladonCity_GameCorner_EventScript_PrintTypeNormal::\n\tsetvar VAR_0x8004, MON_ICON_TINT_NORMAL\n\tgoto CeladonCity_GameCorner_EventScript_PrintPhoto\n\tend\n\nCeladonCity_GameCorner_EventScript_PrintTypeBlack::\n\tsetvar VAR_0x8004, MON_ICON_TINT_BLACK\n\tgoto CeladonCity_GameCorner_EventScript_PrintPhoto\n\tend\n\nCeladonCity_GameCorner_EventScript_PrintTypePink::\n\tsetvar VAR_0x8004, MON_ICON_TINT_PINK\n\tgoto CeladonCity_GameCorner_EventScript_PrintPhoto\n\tend\n\nCeladonCity_GameCorner_EventScript_PrintTypeSepia::\n\tsetvar VAR_0x8004, MON_ICON_TINT_SEPIA\n\tgoto CeladonCity_GameCorner_EventScript_PrintPhoto\n\tend\n\nCeladonCity_GameCorner_EventScript_PrintPhoto::\n\tmessage CeladonCity_GameCorner_Text_BigSmileForPhoto\n\twaitmessage\n\tplayse MUS_PHOTO\n\tdofieldeffect FLDEFF_PHOTO_FLASH\n\tdelay 60\n\tspecial UpdateTrainerCardPhotoIcons\n\tmsgbox CeladonCity_GameCorner_Text_PrintIsReadyCheckTrainerCard\n\thidemoneybox\n\treleaseall\n\tend\n\nCeladonCity_GameCorner_EventScript_DeclinePhoto::\n\thidemoneybox\n\treleaseall\n\tend\n\nCeladonCity_GameCorner_EventScript_NotEnoughMoneyForPhoto::\n\tmsgbox CeladonCity_GameCorner_Text_DontHaveEnoughMoney\n\thidemoneybox\n\treleaseall\n\tend\n\nFourIsland_House2_EventScript_StickerMan::\n\tlock\n\tspecialvar VAR_0x8008, StickerManGetBragFlags\n\tgoto_if_unset FLAG_MET_STICKER_MAN, FourIsland_House2_EventScript_MeetStickerMan\n\tgoto_if_set FLAG_MET_STICKER_MAN, FourIsland_House2_EventScript_StickerManAskForBrag\n\tend\n\nFourIsland_House2_EventScript_MeetStickerMan::\n\tsetflag FLAG_MET_STICKER_MAN\n\tmsgbox FourIsland_House2_Text_WishICouldShowOffStickers\n\tapplymovement LOCALID_STICKER_MAN, Common_Movement_FacePlayer\n\twaitmovement 0\n\tplayse SE_PIN\n\tapplymovement LOCALID_STICKER_MAN, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_STICKER_MAN, Common_Movement_Delay48\n\twaitmovement 0\n\tgoto_if_eq VAR_0x8008, 0, FourIsland_House2_EventScript_StickerManNothingToBrag\n\tmessage FourIsland_House2_Text_GiveYouStickerIfYouBrag\n\twaitmessage\n\tgoto FourIsland_House2_EventScript_ChooseBrag\n\tend\n\nFourIsland_House2_EventScript_StickerManAskForBrag::\n\tapplymovement LOCALID_STICKER_MAN, Common_Movement_FacePlayer\n\twaitmovement 0\n\tgoto_if_questlog EventScript_ReleaseEnd\n\tspecial QuestLog_CutRecording\n\tgoto_if_eq VAR_0x8008, 0, FourIsland_House2_EventScript_NothingToBragAbout\n\tmessage FourIsland_House2_Text_BragAboutWhatToday\n\twaitmessage\n\tgoto FourIsland_House2_EventScript_ChooseBrag\n\tend\n\nFourIsland_House2_EventScript_NothingToBragAbout::\n\tmsgbox FourIsland_House2_Text_BragAboutSomethingForMe\n\trelease\n\tend\n\nFourIsland_House2_EventScript_ChooseBrag::\n\tswitch VAR_0x8008\n\tcase 1, FourIsland_House2_EventScript_ChooseBragHoF\n\tcase 2, FourIsland_House2_EventScript_ChooseBragEggs\n\tcase 4, FourIsland_House2_EventScript_ChooseBragLinkWins\n\tcase 3, FourIsland_House2_EventScript_ChooseBragHoFEggs\n\tcase 5, FourIsland_House2_EventScript_ChooseBragHoFLinkWins\n\tcase 6, FourIsland_House2_EventScript_ChooseBragEggsLinkWins\n\tcase 7, FourIsland_House2_EventScript_ChooseBragHofEggsLinkWins\n\tend\n\nFourIsland_House2_EventScript_ChooseBragHoF::\n\tmultichoice 15, 8, MULTICHOICE_HOF_QUIT, FALSE\n\tswitch VAR_RESULT\n\tcase 0, FourIsland_House2_EventScript_BragHoF\n\tcase 1, FourIsland_House2_EventScript_QuitBrag\n\tcase SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag\n\tend\n\nFourIsland_House2_EventScript_ChooseBragEggs::\n\tmultichoice 16, 8, MULTICHOICE_EGGS_QUIT, FALSE\n\tswitch VAR_RESULT\n\tcase 0, FourIsland_House2_EventScript_BragEggs\n\tcase 1, FourIsland_House2_EventScript_QuitBrag\n\tcase SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag\n\tend\n\nFourIsland_House2_EventScript_ChooseBragLinkWins::\n\tmultichoice 15, 8, MULTICHOICE_VICTORIES_QUIT, FALSE\n\tswitch VAR_RESULT\n\tcase 0, FourIsland_House2_EventScript_BragLinkWins\n\tcase 1, FourIsland_House2_EventScript_QuitBrag\n\tcase SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag\n\tend\n\nFourIsland_House2_EventScript_ChooseBragHoFEggs::\n\tmultichoice 15, 6, MULTICHOICE_HOF_EGGS_QUIT, FALSE\n\tswitch VAR_RESULT\n\tcase 0, FourIsland_House2_EventScript_BragHoF\n\tcase 1, FourIsland_House2_EventScript_BragEggs\n\tcase 2, FourIsland_House2_EventScript_QuitBrag\n\tcase SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag\n\tend\n\nFourIsland_House2_EventScript_ChooseBragHoFLinkWins::\n\tmultichoice 15, 6, MULTICHOICE_HOF_VICTORIES_QUIT, FALSE\n\tswitch VAR_RESULT\n\tcase 0, FourIsland_House2_EventScript_BragHoF\n\tcase 1, FourIsland_House2_EventScript_BragLinkWins\n\tcase 2, FourIsland_House2_EventScript_QuitBrag\n\tcase SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag\n\tend\n\nFourIsland_House2_EventScript_ChooseBragEggsLinkWins::\n\tmultichoice 15, 6, MULTICHOICE_EGGS_VICTORIES_QUIT, FALSE\n\tswitch VAR_RESULT\n\tcase 0, FourIsland_House2_EventScript_BragEggs\n\tcase 1, FourIsland_House2_EventScript_BragLinkWins\n\tcase 2, FourIsland_House2_EventScript_QuitBrag\n\tcase SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag\n\tend\n\nFourIsland_House2_EventScript_ChooseBragHofEggsLinkWins::\n\tmultichoice 15, 5, MULTICHOICE_HOF_EGGS_VICTORIES_QUIT, FALSE\n\tswitch VAR_RESULT\n\tcase 0, FourIsland_House2_EventScript_BragHoF\n\tcase 1, FourIsland_House2_EventScript_BragEggs\n\tcase 2, FourIsland_House2_EventScript_BragLinkWins\n\tcase 3, FourIsland_House2_EventScript_QuitBrag\n\tcase SCR_MENU_CANCEL, FourIsland_House2_EventScript_QuitBrag\n\tend\n\nFourIsland_House2_EventScript_StickerManNothingToBrag::\n\tmsgbox FourIsland_House2_Text_GiveYouStickerIfYouBrag\n\trelease\n\tend\n\nFourIsland_House2_EventScript_BragHoF::\n\tgoto_if_le VAR_0x8004, 39, FourIsland_House2_EventScript_BragHoFLowest\n\tgoto_if_le VAR_0x8004, 99, FourIsland_House2_EventScript_BragHoFLow\n\tgoto_if_le VAR_0x8004, 199, FourIsland_House2_EventScript_BragHoFHigh\n\tgoto_if_ge VAR_0x8004, 200, FourIsland_House2_EventScript_BragHoFHighest\n\tend\n\nFourIsland_House2_EventScript_BragHoFLowest::\n\tgoto_if_eq VAR_HOF_BRAG_STATE, 1, FourIsland_House2_EventScript_AlreadyBraggedHoF\n\tsetvar VAR_HOF_BRAG_STATE, 1\n\tmsgbox FourIsland_House2_Text_WowHoFLowest\n\tgoto FourIsland_House2_EventScript_BraggedHoF\n\tend\n\nFourIsland_House2_EventScript_BragHoFLow::\n\tgoto_if_eq VAR_HOF_BRAG_STATE, 2, FourIsland_House2_EventScript_AlreadyBraggedHoF\n\tsetvar VAR_HOF_BRAG_STATE, 2\n\tmsgbox FourIsland_House2_Text_WowHoFLow\n\tgoto FourIsland_House2_EventScript_BraggedHoF\n\tend\n\nFourIsland_House2_EventScript_BragHoFHigh::\n\tgoto_if_eq VAR_HOF_BRAG_STATE, 3, FourIsland_House2_EventScript_AlreadyBraggedHoF\n\tsetvar VAR_HOF_BRAG_STATE, 3\n\tmsgbox FourIsland_House2_Text_WowHoFHigh\n\tgoto FourIsland_House2_EventScript_BraggedHoF\n\tend\n\nFourIsland_House2_EventScript_BragHoFHighest::\n\tgoto_if_eq VAR_HOF_BRAG_STATE, 4, FourIsland_House2_EventScript_AlreadyBraggedHoFMax\n\tsetvar VAR_HOF_BRAG_STATE, 4\n\tmsgbox FourIsland_House2_Text_WowHoFHighest\n\tgoto FourIsland_House2_EventScript_BraggedHoF\n\tend\n\nFourIsland_House2_EventScript_AlreadyBraggedHoF::\n\tmsgbox FourIsland_House2_Text_ComeBackWithBetterStoryHoF\n\trelease\n\tend\n\nFourIsland_House2_EventScript_AlreadyBraggedHoFMax::\n\tmsgbox FourIsland_House2_Text_LivingLegendHoF\n\trelease\n\tend\n\nFourIsland_House2_EventScript_BraggedHoF::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage FourIsland_House2_Text_HoFStickerApplied\n\twaitmessage\n\twaitfanfare\n\tdelay 90\n\trelease\n\tend\n\nFourIsland_House2_EventScript_BragEggs::\n\tgoto_if_le VAR_0x8005, 99, FourIsland_House2_EventScript_BragEggsLowest\n\tgoto_if_le VAR_0x8005, 199, FourIsland_House2_EventScript_BragEggsLow\n\tgoto_if_le VAR_0x8005, 299, FourIsland_House2_EventScript_BragEggsHigh\n\tgoto_if_ge VAR_0x8005, 300, FourIsland_House2_EventScript_BragEggsHighest\n\tend\n\nFourIsland_House2_EventScript_BragEggsLowest::\n\tgoto_if_eq VAR_EGG_BRAG_STATE, 1, FourIsland_House2_EventScript_AlreadyBraggedEggs\n\tsetvar VAR_EGG_BRAG_STATE, 1\n\tmsgbox FourIsland_House2_Text_WowEggsLowest\n\tgoto FourIsland_House2_EventScript_BraggedEggs\n\tend\n\nFourIsland_House2_EventScript_BragEggsLow::\n\tgoto_if_eq VAR_EGG_BRAG_STATE, 2, FourIsland_House2_EventScript_AlreadyBraggedEggs\n\tsetvar VAR_EGG_BRAG_STATE, 2\n\tmsgbox FourIsland_House2_Text_WowEggsLow\n\tgoto FourIsland_House2_EventScript_BraggedEggs\n\tend\n\nFourIsland_House2_EventScript_BragEggsHigh::\n\tgoto_if_eq VAR_EGG_BRAG_STATE, 3, FourIsland_House2_EventScript_AlreadyBraggedEggs\n\tsetvar VAR_EGG_BRAG_STATE, 3\n\tmsgbox FourIsland_House2_Text_WowEggsHigh\n\tgoto FourIsland_House2_EventScript_BraggedEggs\n\tend\n\nFourIsland_House2_EventScript_BragEggsHighest::\n\tgoto_if_eq VAR_EGG_BRAG_STATE, 4, FourIsland_House2_EventScript_AlreadyBraggedEggsMax\n\tsetvar VAR_EGG_BRAG_STATE, 4\n\tmsgbox FourIsland_House2_Text_WowEggsHighest\n\tgoto FourIsland_House2_EventScript_BraggedEggs\n\tend\n\nFourIsland_House2_EventScript_AlreadyBraggedEggs::\n\tmsgbox FourIsland_House2_Text_ComeBackWithBetterStoryEggs\n\trelease\n\tend\n\nFourIsland_House2_EventScript_AlreadyBraggedEggsMax::\n\tmsgbox FourIsland_House2_Text_LivingLegendEggs\n\trelease\n\tend\n\nFourIsland_House2_EventScript_BraggedEggs::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage FourIsland_House2_Text_EggStickerApplied\n\twaitmessage\n\twaitfanfare\n\tdelay 90\n\trelease\n\tend\n\nFourIsland_House2_EventScript_BragLinkWins::\n\tgoto_if_le VAR_0x8006, 19, FourIsland_House2_EventScript_BragLinkWinsLowest\n\tgoto_if_le VAR_0x8006, 49, FourIsland_House2_EventScript_BragLinkWinsLow\n\tgoto_if_le VAR_0x8006, 99, FourIsland_House2_EventScript_BragLinkWinsHigh\n\tgoto_if_ge VAR_0x8006, 100, FourIsland_House2_EventScript_BragLinkWinsHighest\n\tend\n\nFourIsland_House2_EventScript_BragLinkWinsLowest::\n\tgoto_if_eq VAR_LINK_WIN_BRAG_STATE, 1, FourIsland_House2_EventScript_AlreadyBraggedLinkWins\n\tsetvar VAR_LINK_WIN_BRAG_STATE, 1\n\tmsgbox FourIsland_House2_Text_WowLinkWinsLowest\n\tgoto FourIsland_House2_EventScript_BraggedLinkWins\n\tend\n\nFourIsland_House2_EventScript_BragLinkWinsLow::\n\tgoto_if_eq VAR_LINK_WIN_BRAG_STATE, 2, FourIsland_House2_EventScript_AlreadyBraggedLinkWins\n\tsetvar VAR_LINK_WIN_BRAG_STATE, 2\n\tmsgbox FourIsland_House2_Text_WowLinkWinsLow\n\tgoto FourIsland_House2_EventScript_BraggedLinkWins\n\tend\n\nFourIsland_House2_EventScript_BragLinkWinsHigh::\n\tgoto_if_eq VAR_LINK_WIN_BRAG_STATE, 3, FourIsland_House2_EventScript_AlreadyBraggedLinkWins\n\tsetvar VAR_LINK_WIN_BRAG_STATE, 3\n\tmsgbox FourIsland_House2_Text_WowLinkWinsHigh\n\tgoto FourIsland_House2_EventScript_BraggedLinkWins\n\tend\n\nFourIsland_House2_EventScript_BragLinkWinsHighest::\n\tgoto_if_eq VAR_LINK_WIN_BRAG_STATE, 4, FourIsland_House2_EventScript_AlreadyBraggedLinkWinsMax\n\tsetvar VAR_LINK_WIN_BRAG_STATE, 4\n\tmsgbox FourIsland_House2_Text_WowLinkWinsHighest\n\tgoto FourIsland_House2_EventScript_BraggedLinkWins\n\tend\n\nFourIsland_House2_EventScript_AlreadyBraggedLinkWins::\n\tmsgbox FourIsland_House2_Text_ComeBackWithBetterStoryLinkWins\n\trelease\n\tend\n\nFourIsland_House2_EventScript_AlreadyBraggedLinkWinsMax::\n\tmsgbox FourIsland_House2_Text_LivingLegendLinkWins\n\trelease\n\tend\n\nFourIsland_House2_EventScript_BraggedLinkWins::\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage FourIsland_House2_Text_VictoryStickerApplied\n\twaitmessage\n\twaitfanfare\n\tdelay 90\n\trelease\n\tend\n\nFourIsland_House2_EventScript_QuitBrag::\n\trelease\n\tend\n"
  },
  {
    "path": "data/scripts/trainer_tower.inc",
    "content": "@ Local IDs apply to all floors (not lobby or roof)\n.equ LOCALID_TRAINER_DOUBLES1, 2\n.equ LOCALID_TRAINER_SINGLES,  3\n.equ LOCALID_TRAINER_KNOCKOUT, 4\n.equ LOCALID_TRAINER_DOUBLES2, 5\n\n.equ HIDE_TRAINER_DOUBLES1, FLAG_TEMP_2\n.equ HIDE_TRAINER_SINGLES,  FLAG_TEMP_3\n.equ HIDE_TRAINER_KNOCKOUT, FLAG_TEMP_4\n.equ HIDE_TRAINER_DOUBLES2, FLAG_TEMP_5\n.equ HIDE_OWNER,            FLAG_TEMP_6\n\n.equ DISABLE_SINGLES_TRIGGER,  VAR_TEMP_E\n.equ DISABLE_DOUBLES_TRIGGER,  VAR_TEMP_F\n\n\n@@ Map scripts\n\nTrainerTower_OnResume::\n\tsetvar VAR_TEMP_2, 0\n\tttower_resumetimer\n\tend\n\nTrainerTower_OnTransition::\n\tttower_initfloor\n\tswitch VAR_RESULT\n\tcase CHALLENGE_TYPE_SINGLE, TrainerTower_EventScript_SetObjectsSingles\n\tcase CHALLENGE_TYPE_DOUBLE, TrainerTower_EventScript_SetObjectsDoubles\n\tcase CHALLENGE_TYPE_KNOCKOUT, TrainerTower_EventScript_SetObjectsKnockout\n\tsetflag HIDE_TRAINER_DOUBLES1\n\tsetflag HIDE_TRAINER_SINGLES\n\tsetflag HIDE_TRAINER_KNOCKOUT\n\tsetflag HIDE_TRAINER_DOUBLES2\n\tsetvar DISABLE_SINGLES_TRIGGER, TRUE\n\tsetvar DISABLE_DOUBLES_TRIGGER, TRUE\n\tend\n\nTrainerTower_EventScript_SetObjectsSingles::\n\tsetflag HIDE_TRAINER_DOUBLES1\n\tsetflag HIDE_TRAINER_KNOCKOUT\n\tsetflag HIDE_TRAINER_DOUBLES2\n\tsetvar DISABLE_DOUBLES_TRIGGER, TRUE\n\tsetobjectxyperm       LOCALID_TRAINER_SINGLES, 15, 13\n\tsetobjectmovementtype LOCALID_TRAINER_SINGLES, MOVEMENT_TYPE_FACE_LEFT\n\tgoto TrainerTower_EventScript_HideOwner\n\nTrainerTower_EventScript_SetObjectsDoubles::\n\tsetflag HIDE_TRAINER_SINGLES\n\tsetflag HIDE_TRAINER_KNOCKOUT\n\tsetvar DISABLE_SINGLES_TRIGGER, TRUE\n\tttower_isfloorcleared\n\tgoto_if_eq VAR_RESULT, TRUE, TrainerTower_EventScript_SetObjectsDoublesAlreadyBeaten\n\tsetobjectxyperm       LOCALID_TRAINER_DOUBLES1, 10, 12\n\tsetobjectmovementtype LOCALID_TRAINER_DOUBLES1, MOVEMENT_TYPE_FACE_LEFT\n\tsetobjectxyperm       LOCALID_TRAINER_DOUBLES2, 10, 13\n\tsetobjectmovementtype LOCALID_TRAINER_DOUBLES2, MOVEMENT_TYPE_FACE_LEFT\n\tgoto TrainerTower_EventScript_HideOwner\n\nTrainerTower_EventScript_SetObjectsDoublesAlreadyBeaten::\n\tsetobjectxyperm       LOCALID_TRAINER_DOUBLES1, 10, 12\n\tsetobjectmovementtype LOCALID_TRAINER_DOUBLES1, MOVEMENT_TYPE_FACE_DOWN\n\tsetobjectxyperm       LOCALID_TRAINER_DOUBLES2, 11, 12\n\tsetobjectmovementtype LOCALID_TRAINER_DOUBLES2, MOVEMENT_TYPE_FACE_DOWN\n\tgoto TrainerTower_EventScript_HideOwner\n\n@ Knockout challenge re-uses trainer objects\nTrainerTower_EventScript_SetObjectsKnockout::\n\tsetflag HIDE_TRAINER_DOUBLES2\n\tsetvar DISABLE_DOUBLES_TRIGGER, TRUE\n\tsetobjectxyperm       LOCALID_TRAINER_DOUBLES1, 10, 10\n\tsetobjectmovementtype LOCALID_TRAINER_DOUBLES1, MOVEMENT_TYPE_FACE_DOWN\n\tsetobjectxyperm       LOCALID_TRAINER_SINGLES, 14, 13\n\tsetobjectmovementtype LOCALID_TRAINER_SINGLES, MOVEMENT_TYPE_FACE_LEFT\n\tsetobjectxyperm       LOCALID_TRAINER_KNOCKOUT, 10, 16\n\tsetobjectmovementtype LOCALID_TRAINER_KNOCKOUT, MOVEMENT_TYPE_FACE_UP\nTrainerTower_EventScript_HideOwner:\n\tsetflag HIDE_OWNER\n\tend\n\nTrainerTower_OnFrame::\n\tmap_script_2 VAR_TEMP_2, 0, TrainerTower_EventScript_EnterFloor\n\t.2byte 0\n\nTrainerTower_EventScript_EnterFloor::\n\tsetvar VAR_TEMP_2, 1\n\tttower_isfloorcleared\n\tgoto_if_eq VAR_RESULT, FALSE, TrainerTower_EventScript_EndEnterFloor\n\tsetvar DISABLE_SINGLES_TRIGGER, TRUE\n\tsetvar DISABLE_DOUBLES_TRIGGER, TRUE\nTrainerTower_EventScript_EndEnterFloor:\n\tttower_shouldexit\n\tgoto_if_eq VAR_RESULT, TRUE, TrainerTower_EventScript_WarpToLobby\n\tend\n\n@ Never reached\nTrainerTower_EventScript_WarpToLobby::\n\twarp MAP_TRAINER_TOWER_LOBBY, 9, 7\n\twaitstate\n\n\n@@ Battle scripts\n\nTrainerTower_EventScript_TriggerBattle::\n\tttower_getchallengetype\n\tswitch VAR_RESULT\n\tcase CHALLENGE_TYPE_SINGLE, TrainerTower_EventScript_DoSingleBattle\n\tcase CHALLENGE_TYPE_DOUBLE, TrainerTower_EventScript_DoDoubleBattle\n\tcase CHALLENGE_TYPE_KNOCKOUT, TrainerTower_EventScript_DoKnockoutBattle\n\nTrainerTower_EventScript_DoSingleBattle:\n\tttower_encountermusic\n\tapplymovement LOCALID_TRAINER_SINGLES, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_TRAINER_SINGLES, Common_Movement_Delay48\n\twaitmovement 0\n\tsetvar DISABLE_SINGLES_TRIGGER, TRUE\n\tapplymovement LOCALID_TRAINER_SINGLES, TrainerTower_Movement_SingleTrainerApproach\n\twaitmovement 0\n\tttower_getspeech TRAINER_TOWER_TEXT_INTRO, 0\n\tmsgbox gStringVar4\n\tclosemessage\n\tgoto TrainerTower_EventScript_DoBattle\n\nTrainerTower_EventScript_DoDoubleBattle::\n\tttower_getspeech TRAINER_TOWER_TEXT_INTRO, VAR_TEMP_3\n\tmsgbox gStringVar4\n\tsetvar VAR_0x8004, TRAINER_TOWER_FUNC_GET_SPEECH\n\tsetvar VAR_0x8005, TRAINER_TOWER_TEXT_INTRO\n\taddvar VAR_TEMP_3, 1\n\tgoto_if_eq VAR_TEMP_3, 1, TrainerTower_EventScript_DoSecondTrainerIntro\n\tsetvar VAR_TEMP_3, 0\nTrainerTower_EventScript_DoSecondTrainerIntro:\n\tcopyvar VAR_0x8006, VAR_TEMP_3\n\tspecial CallTrainerTowerFunc\n\tmsgbox gStringVar4\n\tclosemessage\n\tgoto TrainerTower_EventScript_DoBattle\n\nTrainerTower_EventScript_DoKnockoutBattle::\n\tswitch VAR_TEMP_1\n\tcase 0, TrainerTower_EventScript_DoKnockoutBattle1\n\tcase 1, TrainerTower_EventScript_DoKnockoutBattle2\n\tcase 2, TrainerTower_EventScript_DoKnockoutBattle3\n\nTrainerTower_EventScript_DoKnockoutBattle1:\n\tttower_encountermusic\n\tapplymovement LOCALID_TRAINER_KNOCKOUT, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_TRAINER_KNOCKOUT, Common_Movement_Delay48\n\twaitmovement 0\n\tapplymovement LOCALID_TRAINER_KNOCKOUT, TrainerTower_Movement_BottomKnockoutTrainerApproach\n\twaitmovement 0\n\tgoto TrainerTower_EventScript_DoKnockoutBattleIntro\n\nTrainerTower_EventScript_DoKnockoutBattle2::\n\tttower_encountermusic\n\tapplymovement LOCALID_TRAINER_DOUBLES1, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_TRAINER_DOUBLES1, Common_Movement_Delay48\n\twaitmovement 0\n\tapplymovement LOCALID_TRAINER_DOUBLES1, TrainerTower_Movement_TopKnockoutTrainerApproach\n\twaitmovement 0\n\tgoto TrainerTower_EventScript_DoKnockoutBattleIntro\n\nTrainerTower_EventScript_DoKnockoutBattle3::\n\tttower_encountermusic\n\tapplymovement LOCALID_TRAINER_SINGLES, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_TRAINER_SINGLES, Common_Movement_Delay48\n\twaitmovement 0\n\tapplymovement LOCALID_TRAINER_SINGLES, TrainerTower_Movement_RightKnockoutTrainerApproach\n\twaitmovement 0\nTrainerTower_EventScript_DoKnockoutBattleIntro:\n\tttower_getspeech TRAINER_TOWER_TEXT_INTRO, VAR_TEMP_1\n\tmsgbox gStringVar4\n\tclosemessage\nTrainerTower_EventScript_DoBattle:\n\tttower_dobattle\n\twaitstate\n\tswitch VAR_RESULT\n\tcase B_OUTCOME_WON, TrainerTower_EventScript_WonBattle\n\tcase B_OUTCOME_LOST, TrainerTower_EventScript_WarpToLobbyLost\n\tcase B_OUTCOME_DREW, TrainerTower_EventScript_WarpToLobbyLost\nTrainerTower_EventScript_WonBattle:\n\tttower_getchallengetype\n\tswitch VAR_RESULT\n\tcase CHALLENGE_TYPE_SINGLE, TrainerTower_EventScript_SetFloorCleared\n\tcase CHALLENGE_TYPE_DOUBLE, TrainerTower_EventScript_MoveDoublesTrainers\n\tcase CHALLENGE_TYPE_KNOCKOUT, TrainerTower_EventScript_CheckNextKnockoutBattle\n\nTrainerTower_EventScript_CheckNextKnockoutBattle:\n\tswitch VAR_TEMP_1\n\tcase 0, TrainerTower_EventScript_DoSecondKnockoutBattle\n\tcase 1, TrainerTower_EventScript_DoThirdKnockoutBattle\n\tcase 2, TrainerTower_EventScript_MoveLastKnockoutTrainer\n\nTrainerTower_EventScript_DoSecondKnockoutBattle:\n\taddvar VAR_TEMP_1, 1\n\tgoto TrainerTower_EventScript_DoKnockoutBattle\n\nTrainerTower_EventScript_DoThirdKnockoutBattle::\n\taddvar VAR_TEMP_1, 1\n\tgoto TrainerTower_EventScript_DoKnockoutBattle\n\nTrainerTower_EventScript_MoveDoublesTrainers::\n\tapplymovement LOCALID_TRAINER_DOUBLES2, TrainerTower_Movement_DoublesTrainer2OutOfWay\n\twaitmovement 0\n\tapplymovement LOCALID_TRAINER_DOUBLES1, TrainerTower_Movement_DoublesTrainer1FaceDown\n\tgoto TrainerTower_EventScript_SetFloorCleared\n\nTrainerTower_EventScript_MoveLastKnockoutTrainer::\n\tapplymovement LOCALID_TRAINER_SINGLES, TrainerTower_Movement_LastKnockoutTrainerOutOfWay\nTrainerTower_EventScript_SetFloorCleared:\n\tttower_clearedfloor\n\tend\n\nTrainerTower_EventScript_WarpToLobbyLost::\n\tspecial HealPlayerParty\n\tttower_setlost\n\twarp MAP_TRAINER_TOWER_LOBBY, 9, 7\n\twaitstate\n\n\n@@ Speaking to trainers after battle\n\nTrainerTower_EventScript_SpeakToDoublesTrainer1::\n\tttower_getchallengetype\n\tswitch VAR_RESULT\n\tcase CHALLENGE_TYPE_SINGLE, TrainerTower_EventScript_DoublesTrainer1PostBattle\n\tcase CHALLENGE_TYPE_DOUBLE, TrainerTower_EventScript_DoublesTrainer1PostBattle\n\tcase CHALLENGE_TYPE_KNOCKOUT, TrainerTower_EventScript_KnockoutTrainer2PostBattle\nTrainerTower_EventScript_DoublesTrainer1PostBattle:\n\tsetvar VAR_0x8006, 0\n\tgoto TrainerTower_EventScript_DoPostBattleText\n\nTrainerTower_EventScript_KnockoutTrainer2PostBattle::\n\tsetvar VAR_0x8006, 1\n\tgoto TrainerTower_EventScript_DoPostBattleText\n\nTrainerTower_EventScript_SpeakToSinglesTrainer::\n\tttower_getchallengetype\n\tswitch VAR_RESULT\n\tcase CHALLENGE_TYPE_SINGLE, TrainerTower_EventScript_SinglesTrainerPostBattle\n\tcase CHALLENGE_TYPE_DOUBLE, TrainerTower_EventScript_SinglesTrainerPostBattle\n\tcase CHALLENGE_TYPE_KNOCKOUT, TrainerTower_EventScript_KnockoutTrainer3PostBattle\nTrainerTower_EventScript_SinglesTrainerPostBattle:\n\tsetvar VAR_0x8006, 0\n\tgoto TrainerTower_EventScript_DoPostBattleText\n\nTrainerTower_EventScript_KnockoutTrainer3PostBattle::\n\tsetvar VAR_0x8006, 2\n\tgoto TrainerTower_EventScript_DoPostBattleText\n\nTrainerTower_EventScript_SpeakToKnockoutTrainer::\n\tsetvar VAR_0x8006, 0\n\tgoto TrainerTower_EventScript_DoPostBattleText\n\nTrainerTower_EventScript_SpeakToDoublesTrainer2::\n\tsetvar VAR_0x8006, 1\nTrainerTower_EventScript_DoPostBattleText:\n\tttower_getspeech TRAINER_TOWER_TEXT_AFTER\n\tlock\n\tfaceplayer\n\tmsgbox gStringVar4\n\trelease\n\treturn\n\n\n@@ Speaking to owner\n\nTrainerTower_EventScript_SpeakToOwner::\n\tlock\n\tfaceplayer\n\tttower_getownerstate\n\tswitch VAR_RESULT\n\tcase 0, TrainerTower_Roof_EventScript_Arrived\n\tcase 1, TrainerTower_Roof_EventScript_GivePrize\n\tcase 2, TrainerTower_Roof_EventScript_OwnerEnd\n\nTrainerTower_Roof_EventScript_Arrived:\n\tmsgbox TrainerTower_Roof_Text_ImOwnerBattledPerfectly\nTrainerTower_Roof_EventScript_GivePrize:\n\tttower_giveprize\n\tswitch VAR_RESULT\n\tcase 0, TrainerTower_Roof_EventScript_ReceivePrize\n\tcase 1, TrainerTower_Roof_EventScript_NoRoomForPrize\n\tcase 2, TrainerTower_Roof_EventScript_CheckFinalTime\n\nTrainerTower_Roof_EventScript_ReceivePrize:\n\tmsgbox TrainerTower_Roof_Text_ThisIsForYou\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tplayfanfare MUS_LEVEL_UP\n\tmessage Text_ObtainedTheX\n\twaitfanfare\n\twaitmessage\n\tbufferstdstring STR_VAR_3, STDSTRING_ITEMS_POCKET\n\tmsgbox Text_PutItemAway\n\tcall EventScript_RestorePrevTextColor\n\tgoto TrainerTower_Roof_EventScript_CheckFinalTime\n\nTrainerTower_Roof_EventScript_NoRoomForPrize::\n\tmsgbox TrainerTower_Roof_Text_ThisIsForYou\n\tmsgbox Text_BagIsFull\n\tgoto TrainerTower_Roof_EventScript_CheckFinalTime\n\nTrainerTower_Roof_EventScript_CheckFinalTime::\n\tttower_checkfinaltime\n\tswitch VAR_RESULT\n\tcase 0, TrainerTower_Roof_EventScript_NewRecord\n\tcase 1, TrainerTower_Roof_EventScript_NoNewRecord\n\tcase 2, TrainerTower_Roof_EventScript_OwnerEnd\n\nTrainerTower_Roof_EventScript_NewRecord:\n\tmsgbox TrainerTower_Roof_Text_DoneItInRecordTime\n\tgoto TrainerTower_Roof_EventScript_OwnerEnd\n\nTrainerTower_Roof_EventScript_NoNewRecord::\n\tmsgbox TrainerTower_Roof_Text_TookSweetTimeGettingHere\nTrainerTower_Roof_EventScript_OwnerEnd:\n\tmsgbox TrainerTower_Roof_Text_IdLikeToSeeBetterTime\n\trelease\n\treturn\n\nTrainerTower_EventScript_ShowTime::\n\tlockall\n\tttower_gettime\n\tmsgbox TrainerTower_Text_XMinYZSec\n\treleaseall\n\tend\n\n\n@@ Battle triggers\n\nTrainerTower_EventScript_SingleBattleTrigger::\n\tgoto TrainerTower_EventScript_TriggerBattle\n\nTrainerTower_EventScript_DoubleBattleTriggerTop::\n\tsetvar VAR_TEMP_3, 0\n\tttower_checkdoubles\n\tgoto_if_ne VAR_RESULT, PLAYER_HAS_TWO_USABLE_MONS, TrainerTower_EventScript_IneligibleForDoubleBattle\n\tttower_encountermusic\n\tapplymovement LOCALID_TRAINER_DOUBLES1, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_TRAINER_DOUBLES1, Common_Movement_Delay48\n\tgoto TrainerTower_EventScript_TriggerDoubleBattle\n\nTrainerTower_EventScript_DoubleBattleTriggerBottom::\n\tsetvar VAR_TEMP_3, 1\n\tttower_checkdoubles\n\tgoto_if_ne VAR_RESULT, PLAYER_HAS_TWO_USABLE_MONS, TrainerTower_EventScript_IneligibleForDoubleBattle\n\tttower_encountermusic\n\tapplymovement LOCALID_TRAINER_DOUBLES2, Common_Movement_ExclamationMark\n\twaitmovement 0\n\tapplymovement LOCALID_TRAINER_DOUBLES2, Common_Movement_Delay48\nTrainerTower_EventScript_TriggerDoubleBattle:\n\twaitmovement 0\n\tsetvar DISABLE_DOUBLES_TRIGGER, TRUE\n\tgoto TrainerTower_EventScript_TriggerBattle\n\nTrainerTower_EventScript_IneligibleForDoubleBattle::\n\tlockall\n\tplayse SE_DING_DONG\n\tmsgbox TrainerTower_Lobby_Text_NeedTwoMonsForDouble\n\tclosemessage\n\tapplymovement OBJ_EVENT_ID_PLAYER, TrainerTower_Movement_PushPlayerBack\n\twaitmovement 0\n\treleaseall\n\tend\n\nTrainerTower_Movement_SingleTrainerApproach:\n\twalk_left\nTrainerTower_Movement_RightKnockoutTrainerApproach::\n\twalk_left\n\twalk_left\nTrainerTower_Movement_PushPlayerBack:\n\twalk_left\n\tstep_end\n\nTrainerTower_Movement_BottomKnockoutTrainerApproach::\n\twalk_up\n\twalk_up\n\tstep_end\n\nTrainerTower_Movement_TopKnockoutTrainerApproach::\n\twalk_down\n\twalk_down\n\tstep_end\n\nTrainerTower_Movement_DoublesTrainer2OutOfWay::\n\twalk_right\nTrainerTower_Movement_LastKnockoutTrainerOutOfWay:\n\twalk_up\n\tface_down\n\tstep_end\n\nTrainerTower_Movement_DoublesTrainer1FaceDown::\n\tface_down\n\tstep_end\n"
  },
  {
    "path": "data/scripts/trainers.inc",
    "content": "Route3_EventScript_Ben::\n\ttrainerbattle_single TRAINER_YOUNGSTER_BEN, Route3_Text_BenIntro, Route3_Text_BenDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route3_EventScript_BenRematch\n\tmsgbox Route3_Text_BenPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_BenRematch::\n\ttrainerbattle_rematch TRAINER_YOUNGSTER_BEN, Route3_Text_BenRematchIntro, Route3_Text_BenDefeat\n\tmsgbox Route3_Text_BenPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_Calvin::\n\ttrainerbattle_single TRAINER_YOUNGSTER_CALVIN, Route3_Text_CalvinIntro, Route3_Text_CalvinDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route3_EventScript_CalvinRematch\n\tmsgbox Route3_Text_CalvinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_CalvinRematch::\n\ttrainerbattle_rematch TRAINER_YOUNGSTER_CALVIN, Route3_Text_CalvinRematchIntro, Route3_Text_CalvinDefeat\n\tmsgbox Route3_Text_CalvinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_Colton::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_COLTON, Route3_Text_ColtonIntro, Route3_Text_ColtonDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route3_EventScript_ColtonRematch\n\tmsgbox Route3_Text_ColtonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_ColtonRematch::\n\ttrainerbattle_rematch TRAINER_BUG_CATCHER_COLTON, Route3_Text_ColtonRematchIntro, Route3_Text_ColtonDefeat\n\tmsgbox Route3_Text_ColtonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_Greg::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_GREG, Route3_Text_GregIntro, Route3_Text_GregDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route3_EventScript_GregRematch\n\tmsgbox Route3_Text_GregPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_GregRematch::\n\ttrainerbattle_rematch TRAINER_BUG_CATCHER_GREG, Route3_Text_GregRematchIntro, Route3_Text_GregDefeat\n\tmsgbox Route3_Text_GregPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_James::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_JAMES, Route3_Text_JamesIntro, Route3_Text_JamesDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route3_EventScript_JamesRematch\n\tmsgbox Route3_Text_JamesPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_JamesRematch::\n\ttrainerbattle_rematch TRAINER_BUG_CATCHER_JAMES, Route3_Text_JamesRematchIntro, Route3_Text_JamesDefeat\n\tmsgbox Route3_Text_JamesPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_Janice::\n\ttrainerbattle_single TRAINER_LASS_JANICE, Route3_Text_JaniceIntro, Route3_Text_JaniceDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route3_EventScript_JaniceRematch\n\tmsgbox Route3_Text_JanicePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_JaniceRematch::\n\ttrainerbattle_rematch TRAINER_LASS_JANICE, Route3_Text_JaniceRematchIntro, Route3_Text_JaniceDefeat\n\tmsgbox Route3_Text_JanicePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_Sally::\n\ttrainerbattle_single TRAINER_LASS_SALLY, Route3_Text_SallyIntro, Route3_Text_SallyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route3_EventScript_SallyRematch\n\tmsgbox Route3_Text_SallyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_SallyRematch::\n\ttrainerbattle_rematch TRAINER_LASS_SALLY, Route3_Text_SallyRematchIntro, Route3_Text_SallyDefeat\n\tmsgbox Route3_Text_SallyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_Robin::\n\ttrainerbattle_single TRAINER_LASS_ROBIN, Route3_Text_RobinIntro, Route3_Text_RobinDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route3_EventScript_RobinRematch\n\tmsgbox Route3_Text_RobinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute3_EventScript_RobinRematch::\n\ttrainerbattle_rematch TRAINER_LASS_ROBIN, Route3_Text_RobinRematchIntro, Route3_Text_RobinDefeat\n\tmsgbox Route3_Text_RobinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute4_EventScript_Crissy::\n\ttrainerbattle_single TRAINER_LASS_CRISSY, Route4_Text_CrissyIntro, Route4_Text_CrissyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route4_EventScript_CrissyRematch\n\tmsgbox Route4_Text_CrissyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute4_EventScript_CrissyRematch::\n\ttrainerbattle_rematch TRAINER_LASS_CRISSY, Route4_Text_CrissyRematchIntro, Route4_Text_CrissyDefeat\n\tmsgbox Route4_Text_CrissyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute24_EventScript_Timmy::\n\ttrainerbattle_single TRAINER_YOUNGSTER_TIMMY, Route24_Text_TimmyIntro, Route24_Text_TimmyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route24_EventScript_TimmyRematch\n\tmsgbox Route24_Text_TimmyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute24_EventScript_TimmyRematch::\n\ttrainerbattle_rematch TRAINER_YOUNGSTER_TIMMY, Route24_Text_TimmyRematchIntro, Route24_Text_TimmyDefeat\n\tmsgbox Route24_Text_TimmyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute24_EventScript_Cale::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_CALE, Route24_Text_CaleIntro, Route24_Text_CaleDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route24_EventScript_CaleRematch\n\tmsgbox Route24_Text_CalePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute24_EventScript_CaleRematch::\n\ttrainerbattle_rematch TRAINER_BUG_CATCHER_CALE, Route24_Text_CaleRematchIntro, Route24_Text_CaleDefeat\n\tmsgbox Route24_Text_CalePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute24_EventScript_Reli::\n\ttrainerbattle_single TRAINER_LASS_RELI, Route24_Text_ReliIntro, Route24_Text_ReliDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route24_EventScript_ReliRematch\n\tmsgbox Route24_Text_ReliPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute24_EventScript_ReliRematch::\n\ttrainerbattle_rematch TRAINER_LASS_RELI, Route24_Text_ReliRematchIntro, Route24_Text_ReliDefeat\n\tmsgbox Route24_Text_ReliPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute24_EventScript_Ali::\n\ttrainerbattle_single TRAINER_LASS_ALI, Route24_Text_AliIntro, Route24_Text_AliDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route24_EventScript_AliRematch\n\tmsgbox Route24_Text_AliPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute24_EventScript_AliRematch::\n\ttrainerbattle_rematch TRAINER_LASS_ALI, Route24_Text_AliRematchIntro, Route24_Text_AliDefeat\n\tmsgbox Route24_Text_AliPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute24_EventScript_Shane::\n\ttrainerbattle_single TRAINER_CAMPER_SHANE, Route24_Text_ShaneIntro, Route24_Text_ShaneDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route24_EventScript_ShaneRematch\n\tmsgbox Route24_Text_ShanePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute24_EventScript_ShaneRematch::\n\ttrainerbattle_rematch TRAINER_CAMPER_SHANE, Route24_Text_ShaneRematchIntro, Route24_Text_ShaneDefeat\n\tmsgbox Route24_Text_ShanePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute24_EventScript_Ethan::\n\ttrainerbattle_single TRAINER_CAMPER_ETHAN, Route24_Text_EthanIntro, Route24_Text_EthanDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route24_EventScript_EthanRematch\n\tmsgbox Route24_Text_EthanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute24_EventScript_EthanRematch::\n\ttrainerbattle_rematch TRAINER_CAMPER_ETHAN, Route24_Text_EthanRematchIntro, Route24_Text_EthanDefeat\n\tmsgbox Route24_Text_EthanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_Joey::\n\ttrainerbattle_single TRAINER_YOUNGSTER_JOEY, Route25_Text_JoeyIntro, Route25_Text_JoeyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route25_EventScript_JoeyRematch\n\tmsgbox Route25_Text_JoeyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_JoeyRematch::\n\ttrainerbattle_rematch TRAINER_YOUNGSTER_JOEY, Route25_Text_JoeyRematchIntro, Route25_Text_JoeyDefeat\n\tmsgbox Route25_Text_JoeyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_Dan::\n\ttrainerbattle_single TRAINER_YOUNGSTER_DAN, Route25_Text_DanIntro, Route25_Text_DanDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route25_EventScript_DanRematch\n\tmsgbox Route25_Text_DanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_DanRematch::\n\ttrainerbattle_rematch TRAINER_YOUNGSTER_DAN, Route25_Text_DanRematchIntro, Route25_Text_DanDefeat\n\tmsgbox Route25_Text_DanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_Chad::\n\ttrainerbattle_single TRAINER_YOUNGSTER_CHAD, Route25_Text_ChadIntro, Route25_Text_ChadDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route25_EventScript_ChadRematch\n\tmsgbox Route25_Text_ChadPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_ChadRematch::\n\ttrainerbattle_rematch TRAINER_YOUNGSTER_CHAD, Route25_Text_ChadRematchIntro, Route25_Text_ChadDefeat\n\tmsgbox Route25_Text_ChadPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_Kelsey::\n\ttrainerbattle_single TRAINER_PICNICKER_KELSEY, Route25_Text_KelseyIntro, Route25_Text_KelseyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route25_EventScript_KelseyRematch\n\tmsgbox Route25_Text_KelseyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_KelseyRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_KELSEY, Route25_Text_KelseyRematchIntro, Route25_Text_KelseyDefeat\n\tmsgbox Route25_Text_KelseyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_Haley::\n\ttrainerbattle_single TRAINER_LASS_HALEY, Route25_Text_HaleyIntro, Route25_Text_HaleyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route25_EventScript_HaleyRematch\n\tmsgbox Route25_Text_HaleyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_HaleyRematch::\n\ttrainerbattle_rematch TRAINER_LASS_HALEY, Route25_Text_HaleyRematchIntro, Route25_Text_HaleyDefeat\n\tmsgbox Route25_Text_HaleyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_Franklin::\n\ttrainerbattle_single TRAINER_HIKER_FRANKLIN, Route25_Text_FranklinIntro, Route25_Text_FranklinDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route25_EventScript_FranklinRematch\n\tmsgbox Route25_Text_FranklinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_FranklinRematch::\n\ttrainerbattle_rematch TRAINER_HIKER_FRANKLIN, Route25_Text_FranklinRematchIntro, Route25_Text_FranklinDefeat\n\tmsgbox Route25_Text_FranklinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_Nob::\n\ttrainerbattle_single TRAINER_HIKER_NOB, Route25_Text_NobIntro, Route25_Text_NobDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route25_EventScript_NobRematch\n\tmsgbox Route25_Text_NobPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_NobRematch::\n\ttrainerbattle_rematch TRAINER_HIKER_NOB, Route25_Text_NobRematchIntro, Route25_Text_NobDefeat\n\tmsgbox Route25_Text_NobPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_Wayne::\n\ttrainerbattle_single TRAINER_HIKER_WAYNE, Route25_Text_WayneIntro, Route25_Text_WayneDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route25_EventScript_WayneRematch\n\tmsgbox Route25_Text_WaynePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_WayneRematch::\n\ttrainerbattle_rematch TRAINER_HIKER_WAYNE, Route25_Text_WayneRematchIntro, Route25_Text_WayneDefeat\n\tmsgbox Route25_Text_WaynePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_Flint::\n\ttrainerbattle_single TRAINER_CAMPER_FLINT, Route25_Text_FlintIntro, Route25_Text_FlintDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route25_EventScript_FlintRematch\n\tmsgbox Route25_Text_FlintPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute25_EventScript_FlintRematch::\n\ttrainerbattle_rematch TRAINER_CAMPER_FLINT, Route25_Text_FlintRematchIntro, Route25_Text_FlintDefeat\n\tmsgbox Route25_Text_FlintPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute6_EventScript_Keigo::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_KEIGO, Route6_Text_KeigoIntro, Route6_Text_KeigoDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route6_EventScript_KeigoRematch\n\tmsgbox Route6_Text_KeigoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute6_EventScript_KeigoRematch::\n\ttrainerbattle_rematch TRAINER_BUG_CATCHER_KEIGO, Route6_Text_KeigoRematchIntro, Route6_Text_KeigoDefeat\n\tmsgbox Route6_Text_KeigoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute6_EventScript_Elijah::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_ELIJAH, Route6_Text_ElijahIntro, Route6_Text_ElijahDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route6_EventScript_ElijahRematch\n\tmsgbox Route6_Text_ElijahPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute6_EventScript_ElijahRematch::\n\ttrainerbattle_rematch TRAINER_BUG_CATCHER_ELIJAH, Route6_Text_ElijahRematchIntro, Route6_Text_ElijahDefeat\n\tmsgbox Route6_Text_ElijahPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute6_EventScript_Ricky::\n\ttrainerbattle_single TRAINER_CAMPER_RICKY, Route6_Text_RickyIntro, Route6_Text_RickyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route6_EventScript_RickyRematch\n\tmsgbox Route6_Text_RickyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute6_EventScript_RickyRematch::\n\ttrainerbattle_rematch TRAINER_CAMPER_RICKY, Route6_Text_RickyRematchIntro, Route6_Text_RickyDefeat\n\tmsgbox Route6_Text_RickyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute6_EventScript_Jeff::\n\ttrainerbattle_single TRAINER_CAMPER_JEFF, Route6_Text_JeffIntro, Route6_Text_JeffDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route6_EventScript_JeffRematch\n\tmsgbox Route6_Text_JeffPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute6_EventScript_JeffRematch::\n\ttrainerbattle_rematch TRAINER_CAMPER_JEFF, Route6_Text_JeffRematchIntro, Route6_Text_JeffDefeat\n\tmsgbox Route6_Text_JeffPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute6_EventScript_Nancy::\n\ttrainerbattle_single TRAINER_PICNICKER_NANCY, Route6_Text_NancyIntro, Route6_Text_NancyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route6_EventScript_NancyRematch\n\tmsgbox Route6_Text_NancyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute6_EventScript_NancyRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_NANCY, Route6_Text_NancyRematchIntro, Route6_Text_NancyDefeat\n\tmsgbox Route6_Text_NancyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute6_EventScript_Isabelle::\n\ttrainerbattle_single TRAINER_PICNICKER_ISABELLE, Route6_Text_IsabelleIntro, Route6_Text_IsabelleDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route6_EventScript_IsabelleRematch\n\tmsgbox Route6_Text_IsabellePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute6_EventScript_IsabelleRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_ISABELLE, Route6_Text_IsabelleRematchIntro, Route6_Text_IsabelleDefeat\n\tmsgbox Route6_Text_IsabellePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_Eddie::\n\ttrainerbattle_single TRAINER_YOUNGSTER_EDDIE, Route11_Text_EddieIntro, Route11_Text_EddieDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route11_EventScript_EddieRematch\n\tmsgbox Route11_Text_EddiePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_EddieRematch::\n\ttrainerbattle_rematch TRAINER_YOUNGSTER_EDDIE, Route11_Text_EddieRematchIntro, Route11_Text_EddieDefeat\n\tmsgbox Route11_Text_EddiePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_Dillon::\n\ttrainerbattle_single TRAINER_YOUNGSTER_DILLON, Route11_Text_DillonIntro, Route11_Text_DillonDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route11_EventScript_DillonRematch\n\tmsgbox Route11_Text_DillonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_DillonRematch::\n\ttrainerbattle_rematch TRAINER_YOUNGSTER_DILLON, Route11_Text_DillonRematchIntro, Route11_Text_DillonDefeat\n\tmsgbox Route11_Text_DillonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_Yasu::\n\ttrainerbattle_single TRAINER_YOUNGSTER_YASU, Route11_Text_YasuIntro, Route11_Text_YasuDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route11_EventScript_YasuRematch\n\tmsgbox Route11_Text_YasuPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_YasuRematch::\n\ttrainerbattle_rematch TRAINER_YOUNGSTER_YASU, Route11_Text_YasuRematchIntro, Route11_Text_YasuDefeat\n\tmsgbox Route11_Text_YasuPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_Dave::\n\ttrainerbattle_single TRAINER_YOUNGSTER_DAVE, Route11_Text_DaveIntro, Route11_Text_DaveDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route11_EventScript_DaveRematch\n\tmsgbox Route11_Text_DavePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_DaveRematch::\n\ttrainerbattle_rematch TRAINER_YOUNGSTER_DAVE, Route11_Text_DaveRematchIntro, Route11_Text_DaveDefeat\n\tmsgbox Route11_Text_DavePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_Braxton::\n\ttrainerbattle_single TRAINER_ENGINEER_BRAXTON, Route11_Text_BraxtonIntro, Route11_Text_BraxtonDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route11_EventScript_BraxtonRematch\n\tmsgbox Route11_Text_BraxtonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_BraxtonRematch::\n\ttrainerbattle_rematch TRAINER_ENGINEER_BRAXTON, Route11_Text_BraxtonRematchIntro, Route11_Text_BraxtonDefeat\n\tmsgbox Route11_Text_BraxtonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_Bernie::\n\ttrainerbattle_single TRAINER_ENGINEER_BERNIE, Route11_Text_BernieIntro, Route11_Text_BernieDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route11_EventScript_BernieRematch\n\tmsgbox Route11_Text_BerniePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_BernieRematch::\n\ttrainerbattle_rematch TRAINER_ENGINEER_BERNIE, Route11_Text_BernieRematchIntro, Route11_Text_BernieDefeat\n\tmsgbox Route11_Text_BerniePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_Hugo::\n\ttrainerbattle_single TRAINER_GAMER_HUGO, Route11_Text_HugoIntro, Route11_Text_HugoDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route11_EventScript_HugoRematch\n\tmsgbox Route11_Text_HugoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_HugoRematch::\n\ttrainerbattle_rematch TRAINER_GAMER_HUGO, Route11_Text_HugoRematchIntro, Route11_Text_HugoDefeat\n\tmsgbox Route11_Text_HugoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_Jasper::\n\ttrainerbattle_single TRAINER_GAMER_JASPER, Route11_Text_JasperIntro, Route11_Text_JasperDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route11_EventScript_JasperRematch\n\tmsgbox Route11_Text_JasperPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_JasperRematch::\n\ttrainerbattle_rematch TRAINER_GAMER_JASPER, Route11_Text_JasperRematchIntro, Route11_Text_JasperDefeat\n\tmsgbox Route11_Text_JasperPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_Dirk::\n\ttrainerbattle_single TRAINER_GAMER_DIRK, Route11_Text_DirkIntro, Route11_Text_DirkDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route11_EventScript_DirkRematch\n\tmsgbox Route11_Text_DirkPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_DirkRematch::\n\ttrainerbattle_rematch TRAINER_GAMER_DIRK, Route11_Text_DirkRematchIntro, Route11_Text_DirkDefeat\n\tmsgbox Route11_Text_DirkPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_Darian::\n\ttrainerbattle_single TRAINER_GAMER_DARIAN, Route11_Text_DarianIntro, Route11_Text_DarianDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route11_EventScript_DarianRematch\n\tmsgbox Route11_Text_DarianPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute11_EventScript_DarianRematch::\n\ttrainerbattle_rematch TRAINER_GAMER_DARIAN, Route11_Text_DarianRematchIntro, Route11_Text_DarianDefeat\n\tmsgbox Route11_Text_DarianPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_Brent::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_BRENT, Route9_Text_BrentIntro, Route9_Text_BrentDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route9_EventScript_BrentRematch\n\tmsgbox Route9_Text_BrentPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_BrentRematch::\n\ttrainerbattle_rematch TRAINER_BUG_CATCHER_BRENT, Route9_Text_BrentRematchIntro, Route9_Text_BrentDefeat\n\tmsgbox Route9_Text_BrentPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_Conner::\n\ttrainerbattle_single TRAINER_BUG_CATCHER_CONNER, Route9_Text_ConnerIntro, Route9_Text_ConnerDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route9_EventScript_ConnerRematch\n\tmsgbox Route9_Text_ConnerPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_ConnerRematch::\n\ttrainerbattle_rematch TRAINER_BUG_CATCHER_CONNER, Route9_Text_ConnerRematchIntro, Route9_Text_ConnerDefeat\n\tmsgbox Route9_Text_ConnerPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_Chris::\n\ttrainerbattle_single TRAINER_CAMPER_CHRIS, Route9_Text_ChrisIntro, Route9_Text_ChrisDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route9_EventScript_ChrisRematch\n\tmsgbox Route9_Text_ChrisPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_ChrisRematch::\n\ttrainerbattle_rematch TRAINER_CAMPER_CHRIS, Route9_Text_ChrisRematchIntro, Route9_Text_ChrisDefeat\n\tmsgbox Route9_Text_ChrisPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_Drew::\n\ttrainerbattle_single TRAINER_CAMPER_DREW, Route9_Text_DrewIntro, Route9_Text_DrewDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route9_EventScript_DrewRematch\n\tmsgbox Route9_Text_DrewPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_DrewRematch::\n\ttrainerbattle_rematch TRAINER_CAMPER_DREW, Route9_Text_DrewRematchIntro, Route9_Text_DrewDefeat\n\tmsgbox Route9_Text_DrewPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_Alicia::\n\ttrainerbattle_single TRAINER_PICNICKER_ALICIA, Route9_Text_AliciaIntro, Route9_Text_AliciaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route9_EventScript_AliciaRematch\n\tmsgbox Route9_Text_AliciaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_AliciaRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_ALICIA, Route9_Text_AliciaRematchIntro, Route9_Text_AliciaDefeat\n\tmsgbox Route9_Text_AliciaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_Caitlin::\n\ttrainerbattle_single TRAINER_PICNICKER_CAITLIN, Route9_Text_CaitlinIntro, Route9_Text_CaitlinDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route9_EventScript_CaitlinRematch\n\tmsgbox Route9_Text_CaitlinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_CaitlinRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_CAITLIN, Route9_Text_CaitlinRematchIntro, Route9_Text_CaitlinDefeat\n\tmsgbox Route9_Text_CaitlinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_Alan::\n\ttrainerbattle_single TRAINER_HIKER_ALAN, Route9_Text_AlanIntro, Route9_Text_AlanDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route9_EventScript_AlanRematch\n\tmsgbox Route9_Text_AlanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_AlanRematch::\n\ttrainerbattle_rematch TRAINER_HIKER_ALAN, Route9_Text_AlanRematchIntro, Route9_Text_AlanDefeat\n\tmsgbox Route9_Text_AlanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_Brice::\n\ttrainerbattle_single TRAINER_HIKER_BRICE, Route9_Text_BriceIntro, Route9_Text_BriceDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route9_EventScript_BriceRematch\n\tmsgbox Route9_Text_BricePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_BriceRematch::\n\ttrainerbattle_rematch TRAINER_HIKER_BRICE, Route9_Text_BriceRematchIntro, Route9_Text_BriceDefeat\n\tmsgbox Route9_Text_BricePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_Jeremy::\n\ttrainerbattle_single TRAINER_HIKER_JEREMY, Route9_Text_JeremyIntro, Route9_Text_JeremyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route9_EventScript_JeremyRematch\n\tmsgbox Route9_Text_JeremyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute9_EventScript_JeremyRematch::\n\ttrainerbattle_rematch TRAINER_HIKER_JEREMY, Route9_Text_JeremyRematchIntro, Route9_Text_JeremyDefeat\n\tmsgbox Route9_Text_JeremyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute10_EventScript_Heidi::\n\ttrainerbattle_single TRAINER_PICNICKER_HEIDI, Route10_Text_HeidiIntro, Route10_Text_HeidiDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route10_EventScript_HeidiRematch\n\tmsgbox Route10_Text_HeidiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute10_EventScript_HeidiRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_HEIDI, Route10_Text_HeidiRematchIntro, Route10_Text_HeidiDefeat\n\tmsgbox Route10_Text_HeidiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute10_EventScript_Carol::\n\ttrainerbattle_single TRAINER_PICNICKER_CAROL, Route10_Text_CarolIntro, Route10_Text_CarolDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route10_EventScript_CarolRematch\n\tmsgbox Route10_Text_CarolPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute10_EventScript_CarolRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_CAROL, Route10_Text_CarolRematchIntro, Route10_Text_CarolDefeat\n\tmsgbox Route10_Text_CarolPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute10_EventScript_Mark::\n\ttrainerbattle_single TRAINER_POKEMANIAC_MARK, Route10_Text_MarkIntro, Route10_Text_MarkDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route10_EventScript_MarkRematch\n\tmsgbox Route10_Text_MarkPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute10_EventScript_MarkRematch::\n\ttrainerbattle_rematch TRAINER_POKEMANIAC_MARK, Route10_Text_MarkRematchIntro, Route10_Text_MarkDefeat\n\tmsgbox Route10_Text_MarkPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute10_EventScript_Herman::\n\ttrainerbattle_single TRAINER_POKEMANIAC_HERMAN, Route10_Text_HermanIntro, Route10_Text_HermanDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route10_EventScript_HermanRematch\n\tmsgbox Route10_Text_HermanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute10_EventScript_HermanRematch::\n\ttrainerbattle_rematch TRAINER_POKEMANIAC_HERMAN, Route10_Text_HermanRematchIntro, Route10_Text_HermanDefeat\n\tmsgbox Route10_Text_HermanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute10_EventScript_Clark::\n\ttrainerbattle_single TRAINER_HIKER_CLARK, Route10_Text_ClarkIntro, Route10_Text_ClarkDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route10_EventScript_ClarkRematch\n\tmsgbox Route10_Text_ClarkPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute10_EventScript_ClarkRematch::\n\ttrainerbattle_rematch TRAINER_HIKER_CLARK, Route10_Text_ClarkRematchIntro, Route10_Text_ClarkDefeat\n\tmsgbox Route10_Text_ClarkPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute10_EventScript_Trent::\n\ttrainerbattle_single TRAINER_HIKER_TRENT, Route10_Text_TrentIntro, Route10_Text_TrentDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route10_EventScript_TrentRematch\n\tmsgbox Route10_Text_TrentPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute10_EventScript_TrentRematch::\n\ttrainerbattle_rematch TRAINER_HIKER_TRENT, Route10_Text_TrentRematchIntro, Route10_Text_TrentDefeat\n\tmsgbox Route10_Text_TrentPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Paige::\n\ttrainerbattle_single TRAINER_LASS_PAIGE, Route8_Text_PaigeIntro, Route8_Text_PaigeDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_PaigeRematch\n\tmsgbox Route8_Text_PaigePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_PaigeRematch::\n\ttrainerbattle_rematch TRAINER_LASS_PAIGE, Route8_Text_PaigeRematchIntro, Route8_Text_PaigeDefeat\n\tmsgbox Route8_Text_PaigePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Andrea::\n\ttrainerbattle_single TRAINER_LASS_ANDREA, Route8_Text_AndreaIntro, Route8_Text_AndreaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_AndreaRematch\n\tmsgbox Route8_Text_AndreaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_AndreaRematch::\n\ttrainerbattle_rematch TRAINER_LASS_ANDREA, Route8_Text_AndreaRematchIntro, Route8_Text_AndreaDefeat\n\tmsgbox Route8_Text_AndreaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Megan::\n\ttrainerbattle_single TRAINER_LASS_MEGAN, Route8_Text_MeganIntro, Route8_Text_MeganDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_MeganRematch\n\tmsgbox Route8_Text_MeganPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_MeganRematch::\n\ttrainerbattle_rematch TRAINER_LASS_MEGAN, Route8_Text_MeganRematchIntro, Route8_Text_MeganDefeat\n\tmsgbox Route8_Text_MeganPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Julia::\n\ttrainerbattle_single TRAINER_LASS_JULIA, Route8_Text_JuliaIntro, Route8_Text_JuliaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_JuliaRematch\n\tmsgbox Route8_Text_JuliaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_JuliaRematch::\n\ttrainerbattle_rematch TRAINER_LASS_JULIA, Route8_Text_JuliaRematchIntro, Route8_Text_JuliaDefeat\n\tmsgbox Route8_Text_JuliaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Aidan::\n\ttrainerbattle_single TRAINER_SUPER_NERD_AIDAN, Route8_Text_AidanIntro, Route8_Text_AidanDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_AidanRematch\n\tmsgbox Route8_Text_AidanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_AidanRematch::\n\ttrainerbattle_rematch TRAINER_SUPER_NERD_AIDAN, Route8_Text_AidanRematchIntro, Route8_Text_AidanDefeat\n\tmsgbox Route8_Text_AidanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Glenn::\n\ttrainerbattle_single TRAINER_SUPER_NERD_GLENN, Route8_Text_GlennIntro, Route8_Text_GlennDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_GlennRematch\n\tmsgbox Route8_Text_GlennPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_GlennRematch::\n\ttrainerbattle_rematch TRAINER_SUPER_NERD_GLENN, Route8_Text_GlennRematchIntro, Route8_Text_GlennDefeat\n\tmsgbox Route8_Text_GlennPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Leslie::\n\ttrainerbattle_single TRAINER_SUPER_NERD_LESLIE, Route8_Text_LeslieIntro, Route8_Text_LeslieDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_LeslieRematch\n\tmsgbox Route8_Text_LesliePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_LeslieRematch::\n\ttrainerbattle_rematch TRAINER_SUPER_NERD_LESLIE, Route8_Text_LeslieRematchIntro, Route8_Text_LeslieDefeat\n\tmsgbox Route8_Text_LesliePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Stan::\n\ttrainerbattle_single TRAINER_GAMER_STAN, Route8_Text_StanIntro, Route8_Text_StanDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_StanRematch\n\tmsgbox Route8_Text_StanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_StanRematch::\n\ttrainerbattle_rematch TRAINER_GAMER_STAN, Route8_Text_StanRematchIntro, Route8_Text_StanDefeat\n\tmsgbox Route8_Text_StanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Rich::\n\ttrainerbattle_single TRAINER_GAMER_RICH, Route8_Text_RichIntro, Route8_Text_RichDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_RichRematch\n\tmsgbox Route8_Text_RichPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_RichRematch::\n\ttrainerbattle_rematch TRAINER_GAMER_RICH, Route8_Text_RichRematchIntro, Route8_Text_RichDefeat\n\tmsgbox Route8_Text_RichPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Eli::\n\ttrainerbattle_double TRAINER_TWINS_ELI_ANNE, Route8_Text_EliIntro, Route8_Text_EliDefeat, Route8_Text_EliNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_EliRematch\n\tmsgbox Route8_Text_EliPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_EliRematch::\n\ttrainerbattle_rematch_double TRAINER_TWINS_ELI_ANNE, Route8_Text_EliRematchIntro, Route8_Text_EliDefeat, Route8_Text_EliNotEnoughMons\n\tmsgbox Route8_Text_EliPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Anne::\n\ttrainerbattle_double TRAINER_TWINS_ELI_ANNE, Route8_Text_AnneIntro, Route8_Text_AnneDefeat, Route8_Text_AnneNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_AnneRematch\n\tmsgbox Route8_Text_AnnePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_AnneRematch::\n\ttrainerbattle_rematch_double TRAINER_TWINS_ELI_ANNE, Route8_Text_AnneRematchIntro, Route8_Text_AnneDefeat, Route8_Text_AnneNotEnoughMons\n\tmsgbox Route8_Text_AnnePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Ricardo::\n\ttrainerbattle_single TRAINER_BIKER_RICARDO, Route8_Text_RicardoIntro, Route8_Text_RicardoDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_RicardoRematch\n\tmsgbox Route8_Text_RicardoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_RicardoRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_RICARDO, Route8_Text_RicardoRematchIntro, Route8_Text_RicardoDefeat\n\tmsgbox Route8_Text_RicardoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_Jaren::\n\ttrainerbattle_single TRAINER_BIKER_JAREN, Route8_Text_JarenIntro, Route8_Text_JarenDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route8_EventScript_JarenRematch\n\tmsgbox Route8_Text_JarenPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute8_EventScript_JarenRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_JAREN, Route8_Text_JarenRematchIntro, Route8_Text_JarenDefeat\n\tmsgbox Route8_Text_JarenPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_Ned::\n\ttrainerbattle_single TRAINER_FISHERMAN_NED, Route12_Text_NedIntro, Route12_Text_NedDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route12_EventScript_NedRematch\n\tmsgbox Route12_Text_NedPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_NedRematch::\n\ttrainerbattle_rematch TRAINER_FISHERMAN_NED, Route12_Text_NedRematchIntro, Route12_Text_NedDefeat\n\tmsgbox Route12_Text_NedPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_Chip::\n\ttrainerbattle_single TRAINER_FISHERMAN_CHIP, Route12_Text_ChipIntro, Route12_Text_ChipDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route12_EventScript_ChipRematch\n\tmsgbox Route12_Text_ChipPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_ChipRematch::\n\ttrainerbattle_rematch TRAINER_FISHERMAN_CHIP, Route12_Text_ChipRematchIntro, Route12_Text_ChipDefeat\n\tmsgbox Route12_Text_ChipPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_Hank::\n\ttrainerbattle_single TRAINER_FISHERMAN_HANK, Route12_Text_HankIntro, Route12_Text_HankDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route12_EventScript_HankRematch\n\tmsgbox Route12_Text_HankPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_HankRematch::\n\ttrainerbattle_rematch TRAINER_FISHERMAN_HANK, Route12_Text_HankRematchIntro, Route12_Text_HankDefeat\n\tmsgbox Route12_Text_HankPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_Elliot::\n\ttrainerbattle_single TRAINER_FISHERMAN_ELLIOT, Route12_Text_ElliotIntro, Route12_Text_ElliotDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route12_EventScript_ElliotRematch\n\tmsgbox Route12_Text_ElliotPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_ElliotRematch::\n\ttrainerbattle_rematch TRAINER_FISHERMAN_ELLIOT, Route12_Text_ElliotRematchIntro, Route12_Text_ElliotDefeat\n\tmsgbox Route12_Text_ElliotPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_Andrew::\n\ttrainerbattle_single TRAINER_FISHERMAN_ANDREW, Route12_Text_AndrewIntro, Route12_Text_AndrewDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route12_EventScript_AndrewRematch\n\tmsgbox Route12_Text_AndrewPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_AndrewRematch::\n\ttrainerbattle_rematch TRAINER_FISHERMAN_ANDREW, Route12_Text_AndrewRematchIntro, Route12_Text_AndrewDefeat\n\tmsgbox Route12_Text_AndrewPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_Luca::\n\ttrainerbattle_single TRAINER_ROCKER_LUCA, Route12_Text_LucaIntro, Route12_Text_LucaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route12_EventScript_LucaRematch\n\tmsgbox Route12_Text_LucaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_LucaRematch::\n\ttrainerbattle_rematch TRAINER_ROCKER_LUCA, Route12_Text_LucaRematchIntro, Route12_Text_LucaDefeat\n\tmsgbox Route12_Text_LucaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_Justin::\n\ttrainerbattle_single TRAINER_CAMPER_JUSTIN, Route12_Text_JustinIntro, Route12_Text_JustinDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route12_EventScript_JustinRematch\n\tmsgbox Route12_Text_JustinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_JustinRematch::\n\ttrainerbattle_rematch TRAINER_CAMPER_JUSTIN, Route12_Text_JustinRematchIntro, Route12_Text_JustinDefeat\n\tmsgbox Route12_Text_JustinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_Jes::\n\ttrainerbattle_double TRAINER_YOUNG_COUPLE_GIA_JES, Route12_Text_JesIntro, Route12_Text_JesDefeat, Route12_Text_JesNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route12_EventScript_JesRematch\n\tmsgbox Route12_Text_JesPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_JesRematch::\n\ttrainerbattle_rematch_double TRAINER_YOUNG_COUPLE_GIA_JES, Route12_Text_JesRematchIntro, Route12_Text_JesDefeat, Route12_Text_JesNotEnoughMons\n\tmsgbox Route12_Text_JesPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_Gia::\n\ttrainerbattle_double TRAINER_YOUNG_COUPLE_GIA_JES, Route12_Text_GiaIntro, Route12_Text_GiaDefeat, Route12_Text_GiaNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route12_EventScript_GiaRematch\n\tmsgbox Route12_Text_GiaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute12_EventScript_GiaRematch::\n\ttrainerbattle_rematch_double TRAINER_YOUNG_COUPLE_GIA_JES, Route12_Text_GiaRematchIntro, Route12_Text_GiaDefeat, Route12_Text_GiaNotEnoughMons\n\tmsgbox Route12_Text_GiaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_Jared::\n\ttrainerbattle_single TRAINER_BIKER_JARED, Route13_Text_JaredIntro, Route13_Text_JaredDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route13_EventScript_JaredRematch\n\tmsgbox Route13_Text_JaredPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_JaredRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_JARED, Route13_Text_JaredRematchIntro, Route13_Text_JaredDefeat\n\tmsgbox Route13_Text_JaredPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_Lola::\n\ttrainerbattle_single TRAINER_BEAUTY_LOLA, Route13_Text_LolaIntro, Route13_Text_LolaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route13_EventScript_LolaRematch\n\tmsgbox Route13_Text_LolaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_LolaRematch::\n\ttrainerbattle_rematch TRAINER_BEAUTY_LOLA, Route13_Text_LolaRematchIntro, Route13_Text_LolaDefeat\n\tmsgbox Route13_Text_LolaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_Sheila::\n\ttrainerbattle_single TRAINER_BEAUTY_SHEILA, Route13_Text_SheilaIntro, Route13_Text_SheilaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route13_EventScript_SheilaRematch\n\tmsgbox Route13_Text_SheilaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_SheilaRematch::\n\ttrainerbattle_rematch TRAINER_BEAUTY_SHEILA, Route13_Text_SheilaRematchIntro, Route13_Text_SheilaDefeat\n\tmsgbox Route13_Text_SheilaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_Sebastian::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_SEBASTIAN, Route13_Text_SebastianIntro, Route13_Text_SebastianDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route13_EventScript_SebastianRematch\n\tmsgbox Route13_Text_SebastianPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_SebastianRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_SEBASTIAN, Route13_Text_SebastianRematchIntro, Route13_Text_SebastianDefeat\n\tmsgbox Route13_Text_SebastianPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_Perry::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_PERRY, Route13_Text_PerryIntro, Route13_Text_PerryDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route13_EventScript_PerryRematch\n\tmsgbox Route13_Text_PerryPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_PerryRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_PERRY, Route13_Text_PerryRematchIntro, Route13_Text_PerryDefeat\n\tmsgbox Route13_Text_PerryPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_Robert::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_ROBERT, Route13_Text_RobertIntro, Route13_Text_RobertDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route13_EventScript_RobertRematch\n\tmsgbox Route13_Text_RobertPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_RobertRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_ROBERT, Route13_Text_RobertRematchIntro, Route13_Text_RobertDefeat\n\tmsgbox Route13_Text_RobertPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_Alma::\n\ttrainerbattle_single TRAINER_PICNICKER_ALMA, Route13_Text_AlmaIntro, Route13_Text_AlmaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route13_EventScript_AlmaRematch\n\tmsgbox Route13_Text_AlmaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_AlmaRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_ALMA, Route13_Text_AlmaRematchIntro, Route13_Text_AlmaDefeat\n\tmsgbox Route13_Text_AlmaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_Susie::\n\ttrainerbattle_single TRAINER_PICNICKER_SUSIE, Route13_Text_SusieIntro, Route13_Text_SusieDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route13_EventScript_SusieRematch\n\tmsgbox Route13_Text_SusiePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_SusieRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_SUSIE, Route13_Text_SusieRematchIntro, Route13_Text_SusieDefeat\n\tmsgbox Route13_Text_SusiePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_Valerie::\n\ttrainerbattle_single TRAINER_PICNICKER_VALERIE, Route13_Text_ValerieIntro, Route13_Text_ValerieDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route13_EventScript_ValerieRematch\n\tmsgbox Route13_Text_ValeriePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_ValerieRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_VALERIE, Route13_Text_ValerieRematchIntro, Route13_Text_ValerieDefeat\n\tmsgbox Route13_Text_ValeriePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_Gwen::\n\ttrainerbattle_single TRAINER_PICNICKER_GWEN, Route13_Text_GwenIntro, Route13_Text_GwenDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route13_EventScript_GwenRematch\n\tmsgbox Route13_Text_GwenPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute13_EventScript_GwenRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_GWEN, Route13_Text_GwenRematchIntro, Route13_Text_GwenDefeat\n\tmsgbox Route13_Text_GwenPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_Malik::\n\ttrainerbattle_single TRAINER_BIKER_MALIK, Route14_Text_MalikIntro, Route14_Text_MalikDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route14_EventScript_MalikRematch\n\tmsgbox Route14_Text_MalikPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_MalikRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_MALIK, Route14_Text_MalikRematchIntro, Route14_Text_MalikDefeat\n\tmsgbox Route14_Text_MalikPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_Lukas::\n\ttrainerbattle_single TRAINER_BIKER_LUKAS, Route14_Text_LukasIntro, Route14_Text_LukasDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route14_EventScript_LukasRematch\n\tmsgbox Route14_Text_LukasPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_LukasRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_LUKAS, Route14_Text_LukasRematchIntro, Route14_Text_LukasDefeat\n\tmsgbox Route14_Text_LukasPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_Isaac::\n\ttrainerbattle_single TRAINER_BIKER_ISAAC, Route14_Text_IsaacIntro, Route14_Text_IsaacDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route14_EventScript_IsaacRematch\n\tmsgbox Route14_Text_IsaacPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_IsaacRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_ISAAC, Route14_Text_IsaacRematchIntro, Route14_Text_IsaacDefeat\n\tmsgbox Route14_Text_IsaacPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_Gerald::\n\ttrainerbattle_single TRAINER_BIKER_GERALD, Route14_Text_GeraldIntro, Route14_Text_GeraldDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route14_EventScript_GeraldRematch\n\tmsgbox Route14_Text_GeraldPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_GeraldRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_GERALD, Route14_Text_GeraldRematchIntro, Route14_Text_GeraldDefeat\n\tmsgbox Route14_Text_GeraldPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_Donald::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_DONALD, Route14_Text_DonaldIntro, Route14_Text_DonaldDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route14_EventScript_DonaldRematch\n\tmsgbox Route14_Text_DonaldPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_DonaldRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_DONALD, Route14_Text_DonaldRematchIntro, Route14_Text_DonaldDefeat\n\tmsgbox Route14_Text_DonaldPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_Benny::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_BENNY, Route14_Text_BennyIntro, Route14_Text_BennyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route14_EventScript_BennyRematch\n\tmsgbox Route14_Text_BennyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_BennyRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_BENNY, Route14_Text_BennyRematchIntro, Route14_Text_BennyDefeat\n\tmsgbox Route14_Text_BennyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_Carter::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_CARTER, Route14_Text_CarterIntro, Route14_Text_CarterDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route14_EventScript_CarterRematch\n\tmsgbox Route14_Text_CarterPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_CarterRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_CARTER, Route14_Text_CarterRematchIntro, Route14_Text_CarterDefeat\n\tmsgbox Route14_Text_CarterPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_Mitch::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_MITCH, Route14_Text_MitchIntro, Route14_Text_MitchDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route14_EventScript_MitchRematch\n\tmsgbox Route14_Text_MitchPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_MitchRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_MITCH, Route14_Text_MitchRematchIntro, Route14_Text_MitchDefeat\n\tmsgbox Route14_Text_MitchPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_Beck::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_BECK, Route14_Text_BeckIntro, Route14_Text_BeckDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route14_EventScript_BeckRematch\n\tmsgbox Route14_Text_BeckPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_BeckRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_BECK, Route14_Text_BeckRematchIntro, Route14_Text_BeckDefeat\n\tmsgbox Route14_Text_BeckPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_Marlon::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_MARLON, Route14_Text_MarlonIntro, Route14_Text_MarlonDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route14_EventScript_MarlonRematch\n\tmsgbox Route14_Text_MarlonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_MarlonRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_MARLON, Route14_Text_MarlonRematchIntro, Route14_Text_MarlonDefeat\n\tmsgbox Route14_Text_MarlonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_Kiri::\n\ttrainerbattle_double TRAINER_TWINS_KIRI_JAN, Route14_Text_KiriIntro, Route14_Text_KiriDefeat, Route14_Text_KiriNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route14_EventScript_KiriRematch\n\tmsgbox Route14_Text_KiriPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_KiriRematch::\n\ttrainerbattle_rematch_double TRAINER_TWINS_KIRI_JAN, Route14_Text_KiriRematchIntro, Route14_Text_KiriDefeat, Route14_Text_KiriNotEnoughMons\n\tmsgbox Route14_Text_KiriPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_Jan::\n\ttrainerbattle_double TRAINER_TWINS_KIRI_JAN, Route14_Text_JanIntro, Route14_Text_JanDefeat, Route14_Text_JanNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route14_EventScript_JanRematch\n\tmsgbox Route14_Text_JanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute14_EventScript_JanRematch::\n\ttrainerbattle_rematch_double TRAINER_TWINS_KIRI_JAN, Route14_Text_JanRematchIntro, Route14_Text_JanDefeat, Route14_Text_JanNotEnoughMons\n\tmsgbox Route14_Text_JanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_Ernest::\n\ttrainerbattle_single TRAINER_BIKER_ERNEST, Route15_Text_ErnestIntro, Route15_Text_ErnestDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route15_EventScript_ErnestRematch\n\tmsgbox Route15_Text_ErnestPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_ErnestRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_ERNEST, Route15_Text_ErnestRematchIntro, Route15_Text_ErnestDefeat\n\tmsgbox Route15_Text_ErnestPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_Alex::\n\ttrainerbattle_single TRAINER_BIKER_ALEX, Route15_Text_AlexIntro, Route15_Text_AlexDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route15_EventScript_AlexRematch\n\tmsgbox Route15_Text_AlexPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_AlexRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_ALEX, Route15_Text_AlexRematchIntro, Route15_Text_AlexDefeat\n\tmsgbox Route15_Text_AlexPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_Grace::\n\ttrainerbattle_single TRAINER_BEAUTY_GRACE, Route15_Text_GraceIntro, Route15_Text_GraceDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route15_EventScript_GraceRematch\n\tmsgbox Route15_Text_GracePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_GraceRematch::\n\ttrainerbattle_rematch TRAINER_BEAUTY_GRACE, Route15_Text_GraceRematchIntro, Route15_Text_GraceDefeat\n\tmsgbox Route15_Text_GracePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_Olivia::\n\ttrainerbattle_single TRAINER_BEAUTY_OLIVIA, Route15_Text_OliviaIntro, Route15_Text_OliviaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route15_EventScript_OliviaRematch\n\tmsgbox Route15_Text_OliviaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_OliviaRematch::\n\ttrainerbattle_rematch TRAINER_BEAUTY_OLIVIA, Route15_Text_OliviaRematchIntro, Route15_Text_OliviaDefeat\n\tmsgbox Route15_Text_OliviaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_Edwin::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_EDWIN, Route15_Text_EdwinIntro, Route15_Text_EdwinDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route15_EventScript_EdwinRematch\n\tmsgbox Route15_Text_EdwinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_EdwinRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_EDWIN, Route15_Text_EdwinRematchIntro, Route15_Text_EdwinDefeat\n\tmsgbox Route15_Text_EdwinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_Chester::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_CHESTER, Route15_Text_ChesterIntro, Route15_Text_ChesterDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route15_EventScript_ChesterRematch\n\tmsgbox Route15_Text_ChesterPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_ChesterRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_CHESTER, Route15_Text_ChesterRematchIntro, Route15_Text_ChesterDefeat\n\tmsgbox Route15_Text_ChesterPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_Yazmin::\n\ttrainerbattle_single TRAINER_PICNICKER_YAZMIN, Route15_Text_YazminIntro, Route15_Text_YazminDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route15_EventScript_YazminRematch\n\tmsgbox Route15_Text_YazminPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_YazminRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_YAZMIN, Route15_Text_YazminRematchIntro, Route15_Text_YazminDefeat\n\tmsgbox Route15_Text_YazminPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_Kindra::\n\ttrainerbattle_single TRAINER_PICNICKER_KINDRA, Route15_Text_KindraIntro, Route15_Text_KindraDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route15_EventScript_KindraRematch\n\tmsgbox Route15_Text_KindraPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_KindraRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_KINDRA, Route15_Text_KindraRematchIntro, Route15_Text_KindraDefeat\n\tmsgbox Route15_Text_KindraPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_Becky::\n\ttrainerbattle_single TRAINER_PICNICKER_BECKY, Route15_Text_BeckyIntro, Route15_Text_BeckyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route15_EventScript_BeckyRematch\n\tmsgbox Route15_Text_BeckyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_BeckyRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_BECKY, Route15_Text_BeckyRematchIntro, Route15_Text_BeckyDefeat\n\tmsgbox Route15_Text_BeckyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_Celia::\n\ttrainerbattle_single TRAINER_PICNICKER_CELIA, Route15_Text_CeliaIntro, Route15_Text_CeliaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route15_EventScript_CeliaRematch\n\tmsgbox Route15_Text_CeliaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_CeliaRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_CELIA, Route15_Text_CeliaRematchIntro, Route15_Text_CeliaDefeat\n\tmsgbox Route15_Text_CeliaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_Mya::\n\ttrainerbattle_double TRAINER_CRUSH_KIN_RON_MYA, Route15_Text_MyaIntro, Route15_Text_MyaDefeat, Route15_Text_MyaNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route15_EventScript_MyaRematch\n\tmsgbox Route15_Text_MyaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_MyaRematch::\n\ttrainerbattle_rematch_double TRAINER_CRUSH_KIN_RON_MYA, Route15_Text_MyaRematchIntro, Route15_Text_MyaDefeat, Route15_Text_MyaNotEnoughMons\n\tmsgbox Route15_Text_MyaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_Ron::\n\ttrainerbattle_double TRAINER_CRUSH_KIN_RON_MYA, Route15_Text_RonIntro, Route15_Text_RonDefeat, Route15_Text_RonNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route15_EventScript_RonRematch\n\tmsgbox Route15_Text_RonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute15_EventScript_RonRematch::\n\ttrainerbattle_rematch_double TRAINER_CRUSH_KIN_RON_MYA, Route15_Text_RonRematchIntro, Route15_Text_RonDefeat, Route15_Text_RonNotEnoughMons\n\tmsgbox Route15_Text_RonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_Lao::\n\ttrainerbattle_single TRAINER_BIKER_LAO, Route16_Text_LaoIntro, Route16_Text_LaoDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route16_EventScript_LaoRematch\n\tmsgbox Route16_Text_LaoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_LaoRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_LAO, Route16_Text_LaoRematchIntro, Route16_Text_LaoDefeat\n\tmsgbox Route16_Text_LaoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_Hideo::\n\ttrainerbattle_single TRAINER_BIKER_HIDEO, Route16_Text_HideoIntro, Route16_Text_HideoDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route16_EventScript_HideoRematch\n\tmsgbox Route16_Text_HideoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_HideoRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_HIDEO, Route16_Text_HideoRematchIntro, Route16_Text_HideoDefeat\n\tmsgbox Route16_Text_HideoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_Ruben::\n\ttrainerbattle_single TRAINER_BIKER_RUBEN, Route16_Text_RubenIntro, Route16_Text_RubenDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route16_EventScript_RubenRematch\n\tmsgbox Route16_Text_RubenPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_RubenRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_RUBEN, Route16_Text_RubenRematchIntro, Route16_Text_RubenDefeat\n\tmsgbox Route16_Text_RubenPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_Koji::\n\ttrainerbattle_single TRAINER_CUE_BALL_KOJI, Route16_Text_KojiIntro, Route16_Text_KojiDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route16_EventScript_KojiRematch\n\tmsgbox Route16_Text_KojiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_KojiRematch::\n\ttrainerbattle_rematch TRAINER_CUE_BALL_KOJI, Route16_Text_KojiRematchIntro, Route16_Text_KojiDefeat\n\tmsgbox Route16_Text_KojiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_Luke::\n\ttrainerbattle_single TRAINER_CUE_BALL_LUKE, Route16_Text_LukeIntro, Route16_Text_LukeDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route16_EventScript_LukeRematch\n\tmsgbox Route16_Text_LukePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_LukeRematch::\n\ttrainerbattle_rematch TRAINER_CUE_BALL_LUKE, Route16_Text_LukeRematchIntro, Route16_Text_LukeDefeat\n\tmsgbox Route16_Text_LukePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_Camron::\n\ttrainerbattle_single TRAINER_CUE_BALL_CAMRON, Route16_Text_CamronIntro, Route16_Text_CamronDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route16_EventScript_CamronRematch\n\tmsgbox Route16_Text_CamronPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_CamronRematch::\n\ttrainerbattle_rematch TRAINER_CUE_BALL_CAMRON, Route16_Text_CamronRematchIntro, Route16_Text_CamronDefeat\n\tmsgbox Route16_Text_CamronPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_Jed::\n\ttrainerbattle_double TRAINER_YOUNG_COUPLE_LEA_JED, Route16_Text_JedIntro, Route16_Text_JedDefeat, Route16_Text_JedNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route16_EventScript_JedRematch\n\tmsgbox Route16_Text_JedPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_JedRematch::\n\ttrainerbattle_rematch_double TRAINER_YOUNG_COUPLE_LEA_JED, Route16_Text_JedRematchIntro, Route16_Text_JedDefeat, Route16_Text_JedNotEnoughMons\n\tmsgbox Route16_Text_JedPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_Lea::\n\ttrainerbattle_double TRAINER_YOUNG_COUPLE_LEA_JED, Route16_Text_LeaIntro, Route16_Text_LeaDefeat, Route16_Text_LeaNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route16_EventScript_LeaRematch\n\tmsgbox Route16_Text_LeaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute16_EventScript_LeaRematch::\n\ttrainerbattle_rematch_double TRAINER_YOUNG_COUPLE_LEA_JED, Route16_Text_LeaRematchIntro, Route16_Text_LeaDefeat, Route16_Text_LeaNotEnoughMons\n\tmsgbox Route16_Text_LeaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_Billy::\n\ttrainerbattle_single TRAINER_BIKER_BILLY, Route17_Text_BillyIntro, Route17_Text_BillyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route17_EventScript_BillyRematch\n\tmsgbox Route17_Text_BillyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_BillyRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_BILLY, Route17_Text_BillyRematchIntro, Route17_Text_BillyDefeat\n\tmsgbox Route17_Text_BillyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_Nikolas::\n\ttrainerbattle_single TRAINER_BIKER_NIKOLAS, Route17_Text_NikolasIntro, Route17_Text_NikolasDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route17_EventScript_NikolasRematch\n\tmsgbox Route17_Text_NikolasPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_NikolasRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_NIKOLAS, Route17_Text_NikolasRematchIntro, Route17_Text_NikolasDefeat\n\tmsgbox Route17_Text_NikolasPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_Jaxon::\n\ttrainerbattle_single TRAINER_BIKER_JAXON, Route17_Text_JaxonIntro, Route17_Text_JaxonDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route17_EventScript_JaxonRematch\n\tmsgbox Route17_Text_JaxonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_JaxonRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_JAXON, Route17_Text_JaxonRematchIntro, Route17_Text_JaxonDefeat\n\tmsgbox Route17_Text_JaxonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_William::\n\ttrainerbattle_single TRAINER_BIKER_WILLIAM, Route17_Text_WilliamIntro, Route17_Text_WilliamDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route17_EventScript_WilliamRematch\n\tmsgbox Route17_Text_WilliamPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_WilliamRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_WILLIAM, Route17_Text_WilliamRematchIntro, Route17_Text_WilliamDefeat\n\tmsgbox Route17_Text_WilliamPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_Raul::\n\ttrainerbattle_single TRAINER_CUE_BALL_RAUL, Route17_Text_RaulIntro, Route17_Text_RaulDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route17_EventScript_RaulRematch\n\tmsgbox Route17_Text_RaulPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_RaulRematch::\n\ttrainerbattle_rematch TRAINER_CUE_BALL_RAUL, Route17_Text_RaulRematchIntro, Route17_Text_RaulDefeat\n\tmsgbox Route17_Text_RaulPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_Isaiah::\n\ttrainerbattle_single TRAINER_CUE_BALL_ISAIAH, Route17_Text_IsaiahIntro, Route17_Text_IsaiahDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route17_EventScript_IsaiahRematch\n\tmsgbox Route17_Text_IsaiahPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_IsaiahRematch::\n\ttrainerbattle_rematch TRAINER_CUE_BALL_ISAIAH, Route17_Text_IsaiahRematchIntro, Route17_Text_IsaiahDefeat\n\tmsgbox Route17_Text_IsaiahPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_Zeek::\n\ttrainerbattle_single TRAINER_CUE_BALL_ZEEK, Route17_Text_ZeekIntro, Route17_Text_ZeekDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route17_EventScript_ZeekRematch\n\tmsgbox Route17_Text_ZeekPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_ZeekRematch::\n\ttrainerbattle_rematch TRAINER_CUE_BALL_ZEEK, Route17_Text_ZeekRematchIntro, Route17_Text_ZeekDefeat\n\tmsgbox Route17_Text_ZeekPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_Jamal::\n\ttrainerbattle_single TRAINER_CUE_BALL_JAMAL, Route17_Text_JamalIntro, Route17_Text_JamalDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route17_EventScript_JamalRematch\n\tmsgbox Route17_Text_JamalPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_JamalRematch::\n\ttrainerbattle_rematch TRAINER_CUE_BALL_JAMAL, Route17_Text_JamalRematchIntro, Route17_Text_JamalDefeat\n\tmsgbox Route17_Text_JamalPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_Corey::\n\ttrainerbattle_single TRAINER_CUE_BALL_COREY, Route17_Text_CoreyIntro, Route17_Text_CoreyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route17_EventScript_CoreyRematch\n\tmsgbox Route17_Text_CoreyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_CoreyRematch::\n\ttrainerbattle_rematch TRAINER_CUE_BALL_COREY, Route17_Text_CoreyRematchIntro, Route17_Text_CoreyDefeat\n\tmsgbox Route17_Text_CoreyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_Virgil::\n\ttrainerbattle_single TRAINER_BIKER_VIRGIL, Route17_Text_VirgilIntro, Route17_Text_VirgilDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route17_EventScript_VirgilRematch\n\tmsgbox Route17_Text_VirgilPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute17_EventScript_VirgilRematch::\n\ttrainerbattle_rematch TRAINER_BIKER_VIRGIL, Route17_Text_VirgilRematchIntro, Route17_Text_VirgilDefeat\n\tmsgbox Route17_Text_VirgilPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute18_EventScript_Wilton::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_WILTON, Route18_Text_WiltonIntro, Route18_Text_WiltonDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route18_EventScript_WiltonRematch\n\tmsgbox Route18_Text_WiltonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute18_EventScript_WiltonRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_WILTON, Route18_Text_WiltonRematchIntro, Route18_Text_WiltonDefeat\n\tmsgbox Route18_Text_WiltonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute18_EventScript_Ramiro::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_RAMIRO, Route18_Text_RamiroIntro, Route18_Text_RamiroDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route18_EventScript_RamiroRematch\n\tmsgbox Route18_Text_RamiroPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute18_EventScript_RamiroRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_RAMIRO, Route18_Text_RamiroRematchIntro, Route18_Text_RamiroDefeat\n\tmsgbox Route18_Text_RamiroPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute18_EventScript_Jacob::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_JACOB, Route18_Text_JacobIntro, Route18_Text_JacobDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route18_EventScript_JacobRematch\n\tmsgbox Route18_Text_JacobPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute18_EventScript_JacobRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_JACOB, Route18_Text_JacobRematchIntro, Route18_Text_JacobDefeat\n\tmsgbox Route18_Text_JacobPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_Richard::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_RICHARD, Route19_Text_RichardIntro, Route19_Text_RichardDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route19_EventScript_RichardRematch\n\tmsgbox Route19_Text_RichardPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_RichardRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_RICHARD, Route19_Text_RichardRematchIntro, Route19_Text_RichardDefeat\n\tmsgbox Route19_Text_RichardPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_Reece::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_REECE, Route19_Text_ReeceIntro, Route19_Text_ReeceDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route19_EventScript_ReeceRematch\n\tmsgbox Route19_Text_ReecePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_ReeceRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_REECE, Route19_Text_ReeceRematchIntro, Route19_Text_ReeceDefeat\n\tmsgbox Route19_Text_ReecePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_Matthew::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_MATTHEW, Route19_Text_MatthewIntro, Route19_Text_MatthewDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route19_EventScript_MatthewRematch\n\tmsgbox Route19_Text_MatthewPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_MatthewRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_MATTHEW, Route19_Text_MatthewRematchIntro, Route19_Text_MatthewDefeat\n\tmsgbox Route19_Text_MatthewPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_Douglas::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_DOUGLAS, Route19_Text_DouglasIntro, Route19_Text_DouglasDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route19_EventScript_DouglasRematch\n\tmsgbox Route19_Text_DouglasPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_DouglasRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_DOUGLAS, Route19_Text_DouglasRematchIntro, Route19_Text_DouglasDefeat\n\tmsgbox Route19_Text_DouglasPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_David::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_DAVID, Route19_Text_DavidIntro, Route19_Text_DavidDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route19_EventScript_DavidRematch\n\tmsgbox Route19_Text_DavidPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_DavidRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_DAVID, Route19_Text_DavidRematchIntro, Route19_Text_DavidDefeat\n\tmsgbox Route19_Text_DavidPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_Tony::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_TONY, Route19_Text_TonyIntro, Route19_Text_TonyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route19_EventScript_TonyRematch\n\tmsgbox Route19_Text_TonyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_TonyRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_TONY, Route19_Text_TonyRematchIntro, Route19_Text_TonyDefeat\n\tmsgbox Route19_Text_TonyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_Axle::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_AXLE, Route19_Text_AxleIntro, Route19_Text_AxleDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route19_EventScript_AxleRematch\n\tmsgbox Route19_Text_AxlePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_AxleRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_AXLE, Route19_Text_AxleRematchIntro, Route19_Text_AxleDefeat\n\tmsgbox Route19_Text_AxlePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_Anya::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_ANYA, Route19_Text_AnyaIntro, Route19_Text_AnyaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route19_EventScript_AnyaRematch\n\tmsgbox Route19_Text_AnyaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_AnyaRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_ANYA, Route19_Text_AnyaRematchIntro, Route19_Text_AnyaDefeat\n\tmsgbox Route19_Text_AnyaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_Alice::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_ALICE, Route19_Text_AliceIntro, Route19_Text_AliceDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route19_EventScript_AliceRematch\n\tmsgbox Route19_Text_AlicePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_AliceRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_ALICE, Route19_Text_AliceRematchIntro, Route19_Text_AliceDefeat\n\tmsgbox Route19_Text_AlicePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_Connie::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_CONNIE, Route19_Text_ConnieIntro, Route19_Text_ConnieDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route19_EventScript_ConnieRematch\n\tmsgbox Route19_Text_ConniePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_ConnieRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_CONNIE, Route19_Text_ConnieRematchIntro, Route19_Text_ConnieDefeat\n\tmsgbox Route19_Text_ConniePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_Lia::\n\ttrainerbattle_double TRAINER_SIS_AND_BRO_LIA_LUC, Route19_Text_LiaIntro, Route19_Text_LiaDefeat, Route19_Text_LiaNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route19_EventScript_LiaRematch\n\tmsgbox Route19_Text_LiaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_LiaRematch::\n\ttrainerbattle_rematch_double TRAINER_SIS_AND_BRO_LIA_LUC, Route19_Text_LiaRematchIntro, Route19_Text_LiaDefeat, Route19_Text_LiaNotEnoughMons\n\tmsgbox Route19_Text_LiaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_Luc::\n\ttrainerbattle_double TRAINER_SIS_AND_BRO_LIA_LUC, Route19_Text_LucIntro, Route19_Text_LucDefeat, Route19_Text_LucNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route19_EventScript_LucRematch\n\tmsgbox Route19_Text_LucPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute19_EventScript_LucRematch::\n\ttrainerbattle_rematch_double TRAINER_SIS_AND_BRO_LIA_LUC, Route19_Text_LucRematchIntro, Route19_Text_LucDefeat, Route19_Text_LucNotEnoughMons\n\tmsgbox Route19_Text_LucPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_Barry::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_BARRY, Route20_Text_BarryIntro, Route20_Text_BarryDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route20_EventScript_BarryRematch\n\tmsgbox Route20_Text_BarryPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_BarryRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_BARRY, Route20_Text_BarryRematchIntro, Route20_Text_BarryDefeat\n\tmsgbox Route20_Text_BarryPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_Dean::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_DEAN, Route20_Text_DeanIntro, Route20_Text_DeanDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route20_EventScript_DeanRematch\n\tmsgbox Route20_Text_DeanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_DeanRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_DEAN, Route20_Text_DeanRematchIntro, Route20_Text_DeanDefeat\n\tmsgbox Route20_Text_DeanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_Darrin::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_DARRIN, Route20_Text_DarrinIntro, Route20_Text_DarrinDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route20_EventScript_DarrinRematch\n\tmsgbox Route20_Text_DarrinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_DarrinRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_DARRIN, Route20_Text_DarrinRematchIntro, Route20_Text_DarrinDefeat\n\tmsgbox Route20_Text_DarrinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_Tiffany::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_TIFFANY, Route20_Text_TiffanyIntro, Route20_Text_TiffanyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route20_EventScript_TiffanyRematch\n\tmsgbox Route20_Text_TiffanyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_TiffanyRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_TIFFANY, Route20_Text_TiffanyRematchIntro, Route20_Text_TiffanyDefeat\n\tmsgbox Route20_Text_TiffanyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_Nora::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_NORA, Route20_Text_NoraIntro, Route20_Text_NoraDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route20_EventScript_NoraRematch\n\tmsgbox Route20_Text_NoraPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_NoraRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_NORA, Route20_Text_NoraRematchIntro, Route20_Text_NoraDefeat\n\tmsgbox Route20_Text_NoraPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_Melissa::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_MELISSA, Route20_Text_MelissaIntro, Route20_Text_MelissaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route20_EventScript_MelissaRematch\n\tmsgbox Route20_Text_MelissaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_MelissaRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_MELISSA, Route20_Text_MelissaRematchIntro, Route20_Text_MelissaDefeat\n\tmsgbox Route20_Text_MelissaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_Shirley::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_SHIRLEY, Route20_Text_ShirleyIntro, Route20_Text_ShirleyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route20_EventScript_ShirleyRematch\n\tmsgbox Route20_Text_ShirleyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_ShirleyRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_SHIRLEY, Route20_Text_ShirleyRematchIntro, Route20_Text_ShirleyDefeat\n\tmsgbox Route20_Text_ShirleyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_Roger::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_ROGER, Route20_Text_RogerIntro, Route20_Text_RogerDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route20_EventScript_RogerRematch\n\tmsgbox Route20_Text_RogerPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_RogerRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_ROGER, Route20_Text_RogerRematchIntro, Route20_Text_RogerDefeat\n\tmsgbox Route20_Text_RogerPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_Missy::\n\ttrainerbattle_single TRAINER_PICNICKER_MISSY, Route20_Text_MissyIntro, Route20_Text_MissyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route20_EventScript_MissyRematch\n\tmsgbox Route20_Text_MissyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_MissyRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_MISSY, Route20_Text_MissyRematchIntro, Route20_Text_MissyDefeat\n\tmsgbox Route20_Text_MissyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_Irene::\n\ttrainerbattle_single TRAINER_PICNICKER_IRENE, Route20_Text_IreneIntro, Route20_Text_IreneDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route20_EventScript_IreneRematch\n\tmsgbox Route20_Text_IrenePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute20_EventScript_IreneRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_IRENE, Route20_Text_IreneRematchIntro, Route20_Text_IreneDefeat\n\tmsgbox Route20_Text_IrenePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_North_EventScript_Ronald::\n\ttrainerbattle_single TRAINER_FISHERMAN_RONALD, Route21_North_Text_RonaldIntro, Route21_North_Text_RonaldDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route21_North_EventScript_RonaldRematch\n\tmsgbox Route21_North_Text_RonaldPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_North_EventScript_RonaldRematch::\n\ttrainerbattle_rematch TRAINER_FISHERMAN_RONALD, Route21_North_Text_RonaldRematchIntro, Route21_North_Text_RonaldDefeat\n\tmsgbox Route21_North_Text_RonaldPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_South_EventScript_Claude::\n\ttrainerbattle_single TRAINER_FISHERMAN_CLAUDE, Route21_South_Text_ClaudeIntro, Route21_South_Text_ClaudeDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route21_South_EventScript_ClaudeRematch\n\tmsgbox Route21_South_Text_ClaudePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_South_EventScript_ClaudeRematch::\n\ttrainerbattle_rematch TRAINER_FISHERMAN_CLAUDE, Route21_South_Text_ClaudeRematchIntro, Route21_South_Text_ClaudeDefeat\n\tmsgbox Route21_South_Text_ClaudePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_North_EventScript_Wade::\n\ttrainerbattle_single TRAINER_FISHERMAN_WADE, Route21_North_Text_WadeIntro, Route21_North_Text_WadeDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route21_North_EventScript_WadeRematch\n\tmsgbox Route21_North_Text_WadePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_North_EventScript_WadeRematch::\n\ttrainerbattle_rematch TRAINER_FISHERMAN_WADE, Route21_North_Text_WadeRematchIntro, Route21_North_Text_WadeDefeat\n\tmsgbox Route21_North_Text_WadePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_South_EventScript_Nolan::\n\ttrainerbattle_single TRAINER_FISHERMAN_NOLAN, Route21_South_Text_NolanIntro, Route21_South_Text_NolanDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route21_South_EventScript_NolanRematch\n\tmsgbox Route21_South_Text_NolanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_South_EventScript_NolanRematch::\n\ttrainerbattle_rematch TRAINER_FISHERMAN_NOLAN, Route21_South_Text_NolanRematchIntro, Route21_South_Text_NolanDefeat\n\tmsgbox Route21_South_Text_NolanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_North_EventScript_Spencer::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_SPENCER, Route21_North_Text_SpencerIntro, Route21_North_Text_SpencerDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route21_North_EventScript_SpencerRematch\n\tmsgbox Route21_North_Text_SpencerPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_North_EventScript_SpencerRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_SPENCER, Route21_North_Text_SpencerRematchIntro, Route21_North_Text_SpencerDefeat\n\tmsgbox Route21_North_Text_SpencerPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_South_EventScript_Jack::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_JACK, Route21_South_Text_JackIntro, Route21_South_Text_JackDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route21_South_EventScript_JackRematch\n\tmsgbox Route21_South_Text_JackPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_South_EventScript_JackRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_JACK, Route21_South_Text_JackRematchIntro, Route21_South_Text_JackDefeat\n\tmsgbox Route21_South_Text_JackPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_South_EventScript_Jerome::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_JEROME, Route21_South_Text_JeromeIntro, Route21_South_Text_JeromeDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route21_South_EventScript_JeromeRematch\n\tmsgbox Route21_South_Text_JeromePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_South_EventScript_JeromeRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_JEROME, Route21_South_Text_JeromeRematchIntro, Route21_South_Text_JeromeDefeat\n\tmsgbox Route21_South_Text_JeromePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_South_EventScript_Roland::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_ROLAND, Route21_South_Text_RolandIntro, Route21_South_Text_RolandDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route21_South_EventScript_RolandRematch\n\tmsgbox Route21_South_Text_RolandPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_South_EventScript_RolandRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_ROLAND, Route21_South_Text_RolandRematchIntro, Route21_South_Text_RolandDefeat\n\tmsgbox Route21_South_Text_RolandPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_North_EventScript_Lil::\n\ttrainerbattle_double TRAINER_SIS_AND_BRO_LIL_IAN, Route21_North_Text_LilIntro, Route21_North_Text_LilDefeat, Route21_North_Text_LilNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route21_North_EventScript_LilRematch\n\tmsgbox Route21_North_Text_LilPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_North_EventScript_LilRematch::\n\ttrainerbattle_rematch_double TRAINER_SIS_AND_BRO_LIL_IAN, Route21_North_Text_LilRematchIntro, Route21_North_Text_LilDefeat, Route21_North_Text_LilNotEnoughMons\n\tmsgbox Route21_North_Text_LilPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_North_EventScript_Ian::\n\ttrainerbattle_double TRAINER_SIS_AND_BRO_LIL_IAN, Route21_North_Text_IanIntro, Route21_North_Text_IanDefeat, Route21_North_Text_IanNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, Route21_North_EventScript_IanRematch\n\tmsgbox Route21_North_Text_IanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nRoute21_North_EventScript_IanRematch::\n\ttrainerbattle_rematch_double TRAINER_SIS_AND_BRO_LIL_IAN, Route21_North_Text_IanRematchIntro, Route21_North_Text_IanDefeat, Route21_North_Text_IanNotEnoughMons\n\tmsgbox Route21_North_Text_IanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Maria::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_MARIA, OneIsland_KindleRoad_Text_MariaIntro, OneIsland_KindleRoad_Text_MariaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_MariaRematch\n\tmsgbox OneIsland_KindleRoad_Text_MariaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_MariaRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_MARIA, OneIsland_KindleRoad_Text_MariaRematchIntro, OneIsland_KindleRoad_Text_MariaDefeat\n\tmsgbox OneIsland_KindleRoad_Text_MariaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Abigail::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_ABIGAIL, OneIsland_KindleRoad_Text_AbigailIntro, OneIsland_KindleRoad_Text_AbigailDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_AbigailRematch\n\tmsgbox OneIsland_KindleRoad_Text_AbigailPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_AbigailRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_ABIGAIL, OneIsland_KindleRoad_Text_AbigailRematchIntro, OneIsland_KindleRoad_Text_AbigailDefeat\n\tmsgbox OneIsland_KindleRoad_Text_AbigailPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Finn::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_FINN, OneIsland_KindleRoad_Text_FinnIntro, OneIsland_KindleRoad_Text_FinnDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_FinnRematch\n\tmsgbox OneIsland_KindleRoad_Text_FinnPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_FinnRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_FINN, OneIsland_KindleRoad_Text_FinnRematchIntro, OneIsland_KindleRoad_Text_FinnDefeat\n\tmsgbox OneIsland_KindleRoad_Text_FinnPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Garrett::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_GARRETT, OneIsland_KindleRoad_Text_GarrettIntro, OneIsland_KindleRoad_Text_GarrettDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_GarrettRematch\n\tmsgbox OneIsland_KindleRoad_Text_GarrettPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_GarrettRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_GARRETT, OneIsland_KindleRoad_Text_GarrettRematchIntro, OneIsland_KindleRoad_Text_GarrettDefeat\n\tmsgbox OneIsland_KindleRoad_Text_GarrettPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Tommy::\n\ttrainerbattle_single TRAINER_FISHERMAN_TOMMY, OneIsland_KindleRoad_Text_TommyIntro, OneIsland_KindleRoad_Text_TommyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_TommyRematch\n\tmsgbox OneIsland_KindleRoad_Text_TommyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_TommyRematch::\n\ttrainerbattle_rematch TRAINER_FISHERMAN_TOMMY, OneIsland_KindleRoad_Text_TommyRematchIntro, OneIsland_KindleRoad_Text_TommyDefeat\n\tmsgbox OneIsland_KindleRoad_Text_TommyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Sharon::\n\ttrainerbattle_single TRAINER_CRUSH_GIRL_SHARON, OneIsland_KindleRoad_Text_SharonIntro, OneIsland_KindleRoad_Text_SharonDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_SharonRematch\n\tmsgbox OneIsland_KindleRoad_Text_SharonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_SharonRematch::\n\ttrainerbattle_rematch TRAINER_CRUSH_GIRL_SHARON, OneIsland_KindleRoad_Text_SharonRematchIntro, OneIsland_KindleRoad_Text_SharonDefeat\n\tmsgbox OneIsland_KindleRoad_Text_SharonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Tanya::\n\ttrainerbattle_single TRAINER_CRUSH_GIRL_TANYA, OneIsland_KindleRoad_Text_TanyaIntro, OneIsland_KindleRoad_Text_TanyaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_TanyaRematch\n\tmsgbox OneIsland_KindleRoad_Text_TanyaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_TanyaRematch::\n\ttrainerbattle_rematch TRAINER_CRUSH_GIRL_TANYA, OneIsland_KindleRoad_Text_TanyaRematchIntro, OneIsland_KindleRoad_Text_TanyaDefeat\n\tmsgbox OneIsland_KindleRoad_Text_TanyaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Shea::\n\ttrainerbattle_single TRAINER_BLACK_BELT_SHEA, OneIsland_KindleRoad_Text_SheaIntro, OneIsland_KindleRoad_Text_SheaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_SheaRematch\n\tmsgbox OneIsland_KindleRoad_Text_SheaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_SheaRematch::\n\ttrainerbattle_rematch TRAINER_BLACK_BELT_SHEA, OneIsland_KindleRoad_Text_SheaRematchIntro, OneIsland_KindleRoad_Text_SheaDefeat\n\tmsgbox OneIsland_KindleRoad_Text_SheaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Hugh::\n\ttrainerbattle_single TRAINER_BLACK_BELT_HUGH, OneIsland_KindleRoad_Text_HughIntro, OneIsland_KindleRoad_Text_HughDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_HughRematch\n\tmsgbox OneIsland_KindleRoad_Text_HughPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_HughRematch::\n\ttrainerbattle_rematch TRAINER_BLACK_BELT_HUGH, OneIsland_KindleRoad_Text_HughRematchIntro, OneIsland_KindleRoad_Text_HughDefeat\n\tmsgbox OneIsland_KindleRoad_Text_HughPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Bryce::\n\ttrainerbattle_single TRAINER_CAMPER_BRYCE, OneIsland_KindleRoad_Text_BryceIntro, OneIsland_KindleRoad_Text_BryceDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_BryceRematch\n\tmsgbox OneIsland_KindleRoad_Text_BrycePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_BryceRematch::\n\ttrainerbattle_rematch TRAINER_CAMPER_BRYCE, OneIsland_KindleRoad_Text_BryceRematchIntro, OneIsland_KindleRoad_Text_BryceDefeat\n\tmsgbox OneIsland_KindleRoad_Text_BrycePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Claire::\n\ttrainerbattle_single TRAINER_PICNICKER_CLAIRE, OneIsland_KindleRoad_Text_ClaireIntro, OneIsland_KindleRoad_Text_ClaireDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_ClaireRematch\n\tmsgbox OneIsland_KindleRoad_Text_ClairePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_ClaireRematch::\n\ttrainerbattle_rematch TRAINER_PICNICKER_CLAIRE, OneIsland_KindleRoad_Text_ClaireRematchIntro, OneIsland_KindleRoad_Text_ClaireDefeat\n\tmsgbox OneIsland_KindleRoad_Text_ClairePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Kia::\n\ttrainerbattle_double TRAINER_CRUSH_KIN_MIK_KIA, OneIsland_KindleRoad_Text_KiaIntro, OneIsland_KindleRoad_Text_KiaDefeat, OneIsland_KindleRoad_Text_KiaNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_KiaRematch\n\tmsgbox OneIsland_KindleRoad_Text_KiaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_KiaRematch::\n\ttrainerbattle_rematch_double TRAINER_CRUSH_KIN_MIK_KIA, OneIsland_KindleRoad_Text_KiaRematchIntro, OneIsland_KindleRoad_Text_KiaDefeat, OneIsland_KindleRoad_Text_KiaNotEnoughMons\n\tmsgbox OneIsland_KindleRoad_Text_KiaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_Mik::\n\ttrainerbattle_double TRAINER_CRUSH_KIN_MIK_KIA, OneIsland_KindleRoad_Text_MikIntro, OneIsland_KindleRoad_Text_MikDefeat, OneIsland_KindleRoad_Text_MikNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_KindleRoad_EventScript_MikRematch\n\tmsgbox OneIsland_KindleRoad_Text_MikPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_KindleRoad_EventScript_MikRematch::\n\ttrainerbattle_rematch_double TRAINER_CRUSH_KIN_MIK_KIA, OneIsland_KindleRoad_Text_MikRematchIntro, OneIsland_KindleRoad_Text_MikDefeat, OneIsland_KindleRoad_Text_MikNotEnoughMons\n\tmsgbox OneIsland_KindleRoad_Text_MikPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_TreasureBeach_EventScript_Amara::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_AMARA, OneIsland_TreasureBeach_Text_AmaraIntro, OneIsland_TreasureBeach_Text_AmaraDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, OneIsland_TreasureBeach_EventScript_AmaraRematch\n\tmsgbox OneIsland_TreasureBeach_Text_AmaraPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nOneIsland_TreasureBeach_EventScript_AmaraRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_AMARA, OneIsland_TreasureBeach_Text_AmaraRematchIntro, OneIsland_TreasureBeach_Text_AmaraDefeat\n\tmsgbox OneIsland_TreasureBeach_Text_AmaraPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_Nikki::\n\ttrainerbattle_single TRAINER_AROMA_LADY_NIKKI, ThreeIsland_BondBridge_Text_NikkiIntro, ThreeIsland_BondBridge_Text_NikkiDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_NikkiRematch\n\tmsgbox ThreeIsland_BondBridge_Text_NikkiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_NikkiRematch::\n\ttrainerbattle_rematch TRAINER_AROMA_LADY_NIKKI, ThreeIsland_BondBridge_Text_NikkiRematchIntro, ThreeIsland_BondBridge_Text_NikkiDefeat\n\tmsgbox ThreeIsland_BondBridge_Text_NikkiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_Violet::\n\ttrainerbattle_single TRAINER_AROMA_LADY_VIOLET, ThreeIsland_BondBridge_Text_VioletIntro, ThreeIsland_BondBridge_Text_VioletDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_VioletRematch\n\tmsgbox ThreeIsland_BondBridge_Text_VioletPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_VioletRematch::\n\ttrainerbattle_rematch TRAINER_AROMA_LADY_VIOLET, ThreeIsland_BondBridge_Text_VioletRematchIntro, ThreeIsland_BondBridge_Text_VioletDefeat\n\tmsgbox ThreeIsland_BondBridge_Text_VioletPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_Amira::\n\ttrainerbattle_single TRAINER_TUBER_AMIRA, ThreeIsland_BondBridge_Text_AmiraIntro, ThreeIsland_BondBridge_Text_AmiraDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_AmiraRematch\n\tmsgbox ThreeIsland_BondBridge_Text_AmiraPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_AmiraRematch::\n\ttrainerbattle_rematch TRAINER_TUBER_AMIRA, ThreeIsland_BondBridge_Text_AmiraRematchIntro, ThreeIsland_BondBridge_Text_AmiraDefeat\n\tmsgbox ThreeIsland_BondBridge_Text_AmiraPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_Alexis::\n\ttrainerbattle_single TRAINER_TUBER_ALEXIS, ThreeIsland_BondBridge_Text_AlexisIntro, ThreeIsland_BondBridge_Text_AlexisDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_AlexisRematch\n\tmsgbox ThreeIsland_BondBridge_Text_AlexisPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_AlexisRematch::\n\ttrainerbattle_rematch TRAINER_TUBER_ALEXIS, ThreeIsland_BondBridge_Text_AlexisRematchIntro, ThreeIsland_BondBridge_Text_AlexisDefeat\n\tmsgbox ThreeIsland_BondBridge_Text_AlexisPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_Tisha::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_TISHA, ThreeIsland_BondBridge_Text_TishaIntro, ThreeIsland_BondBridge_Text_TishaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_TishaRematch\n\tmsgbox ThreeIsland_BondBridge_Text_TishaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_TishaRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_TISHA, ThreeIsland_BondBridge_Text_TishaRematchIntro, ThreeIsland_BondBridge_Text_TishaDefeat\n\tmsgbox ThreeIsland_BondBridge_Text_TishaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_Joy::\n\ttrainerbattle_double TRAINER_TWINS_JOY_MEG, ThreeIsland_BondBridge_Text_JoyIntro, ThreeIsland_BondBridge_Text_JoyDefeat, ThreeIsland_BondBridge_Text_JoyNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_JoyRematch\n\tmsgbox ThreeIsland_BondBridge_Text_JoyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_JoyRematch::\n\ttrainerbattle_rematch_double TRAINER_TWINS_JOY_MEG, ThreeIsland_BondBridge_Text_JoyRematchIntro, ThreeIsland_BondBridge_Text_JoyDefeat, ThreeIsland_BondBridge_Text_JoyNotEnoughMons\n\tmsgbox ThreeIsland_BondBridge_Text_JoyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_Meg::\n\ttrainerbattle_double TRAINER_TWINS_JOY_MEG, ThreeIsland_BondBridge_Text_MegIntro, ThreeIsland_BondBridge_Text_MegDefeat, ThreeIsland_BondBridge_Text_MegNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, ThreeIsland_BondBridge_EventScript_MegRematch\n\tmsgbox ThreeIsland_BondBridge_Text_MegPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nThreeIsland_BondBridge_EventScript_MegRematch::\n\ttrainerbattle_rematch_double TRAINER_TWINS_JOY_MEG, ThreeIsland_BondBridge_Text_MegRematchIntro, ThreeIsland_BondBridge_Text_MegDefeat, ThreeIsland_BondBridge_Text_MegNotEnoughMons\n\tmsgbox ThreeIsland_BondBridge_Text_MegPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_Daisy::\n\ttrainerbattle_single TRAINER_PAINTER_DAISY, FiveIsland_ResortGorgeous_Text_DaisyIntro, FiveIsland_ResortGorgeous_Text_DaisyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_DaisyRematch\n\tmsgbox FiveIsland_ResortGorgeous_Text_DaisyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_DaisyRematch::\n\ttrainerbattle_rematch TRAINER_PAINTER_DAISY, FiveIsland_ResortGorgeous_Text_DaisyRematchIntro, FiveIsland_ResortGorgeous_Text_DaisyDefeat\n\tmsgbox FiveIsland_ResortGorgeous_Text_DaisyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_Celina::\n\ttrainerbattle_single TRAINER_PAINTER_CELINA, FiveIsland_ResortGorgeous_Text_CelinaIntro, FiveIsland_ResortGorgeous_Text_CelinaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_CelinaRematch\n\tmsgbox FiveIsland_ResortGorgeous_Text_CelinaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_CelinaRematch::\n\ttrainerbattle_rematch TRAINER_PAINTER_CELINA, FiveIsland_ResortGorgeous_Text_CelinaRematchIntro, FiveIsland_ResortGorgeous_Text_CelinaDefeat\n\tmsgbox FiveIsland_ResortGorgeous_Text_CelinaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_Rayna::\n\ttrainerbattle_single TRAINER_PAINTER_RAYNA, FiveIsland_ResortGorgeous_Text_RaynaIntro, FiveIsland_ResortGorgeous_Text_RaynaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_RaynaRematch\n\tmsgbox FiveIsland_ResortGorgeous_Text_RaynaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_RaynaRematch::\n\ttrainerbattle_rematch TRAINER_PAINTER_RAYNA, FiveIsland_ResortGorgeous_Text_RaynaRematchIntro, FiveIsland_ResortGorgeous_Text_RaynaDefeat\n\tmsgbox FiveIsland_ResortGorgeous_Text_RaynaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_Jacki::\n\ttrainerbattle_single TRAINER_LADY_JACKI, FiveIsland_ResortGorgeous_Text_JackiIntro, FiveIsland_ResortGorgeous_Text_JackiDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_JackiRematch\n\tmsgbox FiveIsland_ResortGorgeous_Text_JackiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_JackiRematch::\n\ttrainerbattle_rematch TRAINER_LADY_JACKI, FiveIsland_ResortGorgeous_Text_JackiRematchIntro, FiveIsland_ResortGorgeous_Text_JackiDefeat\n\tmsgbox FiveIsland_ResortGorgeous_Text_JackiPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_Gillian::\n\ttrainerbattle_single TRAINER_LADY_GILLIAN, FiveIsland_ResortGorgeous_Text_GillianIntro, FiveIsland_ResortGorgeous_Text_GillianDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_GillianRematch\n\tmsgbox FiveIsland_ResortGorgeous_Text_GillianPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_GillianRematch::\n\ttrainerbattle_rematch TRAINER_LADY_GILLIAN, FiveIsland_ResortGorgeous_Text_GillianRematchIntro, FiveIsland_ResortGorgeous_Text_GillianDefeat\n\tmsgbox FiveIsland_ResortGorgeous_Text_GillianPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_Destin::\n\ttrainerbattle_single TRAINER_YOUNGSTER_DESTIN, FiveIsland_ResortGorgeous_Text_DestinIntro, FiveIsland_ResortGorgeous_Text_DestinDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_DestinRematch\n\tmsgbox FiveIsland_ResortGorgeous_Text_DestinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_DestinRematch::\n\ttrainerbattle_rematch TRAINER_YOUNGSTER_DESTIN, FiveIsland_ResortGorgeous_Text_DestinRematchIntro, FiveIsland_ResortGorgeous_Text_DestinDefeat\n\tmsgbox FiveIsland_ResortGorgeous_Text_DestinPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_Toby::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_TOBY, FiveIsland_ResortGorgeous_Text_TobyIntro, FiveIsland_ResortGorgeous_Text_TobyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_ResortGorgeous_EventScript_TobyRematch\n\tmsgbox FiveIsland_ResortGorgeous_Text_TobyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_ResortGorgeous_EventScript_TobyRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_TOBY, FiveIsland_ResortGorgeous_Text_TobyRematchIntro, FiveIsland_ResortGorgeous_Text_TobyDefeat\n\tmsgbox FiveIsland_ResortGorgeous_Text_TobyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_WaterLabyrinth_EventScript_Alize::\n\ttrainerbattle_single TRAINER_PKMN_BREEDER_ALIZE, FiveIsland_WaterLabyrinth_Text_AlizeIntro, FiveIsland_WaterLabyrinth_Text_AlizeDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_WaterLabyrinth_EventScript_AlizeRematch\n\tmsgbox FiveIsland_WaterLabyrinth_Text_AlizePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_WaterLabyrinth_EventScript_AlizeRematch::\n\ttrainerbattle_rematch TRAINER_PKMN_BREEDER_ALIZE, FiveIsland_WaterLabyrinth_Text_AlizeRematchIntro, FiveIsland_WaterLabyrinth_Text_AlizeDefeat\n\tmsgbox FiveIsland_WaterLabyrinth_Text_AlizePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_MemorialPillar_EventScript_Milo::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_MILO, FiveIsland_MemorialPillar_Text_MiloIntro, FiveIsland_MemorialPillar_Text_MiloDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_MemorialPillar_EventScript_MiloRematch\n\tmsgbox FiveIsland_MemorialPillar_Text_MiloPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_MemorialPillar_EventScript_MiloRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_MILO, FiveIsland_MemorialPillar_Text_MiloRematchIntro, FiveIsland_MemorialPillar_Text_MiloDefeat\n\tmsgbox FiveIsland_MemorialPillar_Text_MiloPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_MemorialPillar_EventScript_Chaz::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_CHAZ, FiveIsland_MemorialPillar_Text_ChazIntro, FiveIsland_MemorialPillar_Text_ChazDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_MemorialPillar_EventScript_ChazRematch\n\tmsgbox FiveIsland_MemorialPillar_Text_ChazPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_MemorialPillar_EventScript_ChazRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_CHAZ, FiveIsland_MemorialPillar_Text_ChazRematchIntro, FiveIsland_MemorialPillar_Text_ChazDefeat\n\tmsgbox FiveIsland_MemorialPillar_Text_ChazPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_MemorialPillar_EventScript_Harold::\n\ttrainerbattle_single TRAINER_BIRD_KEEPER_HAROLD, FiveIsland_MemorialPillar_Text_HaroldIntro, FiveIsland_MemorialPillar_Text_HaroldDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, FiveIsland_MemorialPillar_EventScript_HaroldRematch\n\tmsgbox FiveIsland_MemorialPillar_Text_HaroldPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nFiveIsland_MemorialPillar_EventScript_HaroldRematch::\n\ttrainerbattle_rematch TRAINER_BIRD_KEEPER_HAROLD, FiveIsland_MemorialPillar_Text_HaroldRematchIntro, FiveIsland_MemorialPillar_Text_HaroldDefeat\n\tmsgbox FiveIsland_MemorialPillar_Text_HaroldPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_OutcastIsland_EventScript_Tylor::\n\ttrainerbattle_single TRAINER_FISHERMAN_TYLOR, SixIsland_OutcastIsland_Text_TylorIntro, SixIsland_OutcastIsland_Text_TylorDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_OutcastIsland_EventScript_TylorRematch\n\tmsgbox SixIsland_OutcastIsland_Text_TylorPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_OutcastIsland_EventScript_TylorRematch::\n\ttrainerbattle_rematch TRAINER_FISHERMAN_TYLOR, SixIsland_OutcastIsland_Text_TylorRematchIntro, SixIsland_OutcastIsland_Text_TylorDefeat\n\tmsgbox SixIsland_OutcastIsland_Text_TylorPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_OutcastIsland_EventScript_Mymo::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_MYMO, SixIsland_OutcastIsland_Text_MymoIntro, SixIsland_OutcastIsland_Text_MymoDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_OutcastIsland_EventScript_MymoRematch\n\tmsgbox SixIsland_OutcastIsland_Text_MymoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_OutcastIsland_EventScript_MymoRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_MYMO, SixIsland_OutcastIsland_Text_MymoRematchIntro, SixIsland_OutcastIsland_Text_MymoDefeat\n\tmsgbox SixIsland_OutcastIsland_Text_MymoPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_OutcastIsland_EventScript_Nicole::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_NICOLE, SixIsland_OutcastIsland_Text_NicoleIntro, SixIsland_OutcastIsland_Text_NicoleDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_OutcastIsland_EventScript_NicoleRematch\n\tmsgbox SixIsland_OutcastIsland_Text_NicolePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_OutcastIsland_EventScript_NicoleRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_NICOLE, SixIsland_OutcastIsland_Text_NicoleRematchIntro, SixIsland_OutcastIsland_Text_NicoleDefeat\n\tmsgbox SixIsland_OutcastIsland_Text_NicolePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_OutcastIsland_EventScript_Ava::\n\ttrainerbattle_double TRAINER_SIS_AND_BRO_AVA_GEB, SixIsland_OutcastIsland_Text_AvaIntro, SixIsland_OutcastIsland_Text_AvaDefeat, SixIsland_OutcastIsland_Text_AvaNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_OutcastIsland_EventScript_AvaRematch\n\tmsgbox SixIsland_OutcastIsland_Text_AvaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_OutcastIsland_EventScript_AvaRematch::\n\ttrainerbattle_rematch_double TRAINER_SIS_AND_BRO_AVA_GEB, SixIsland_OutcastIsland_Text_AvaRematchIntro, SixIsland_OutcastIsland_Text_AvaDefeat, SixIsland_OutcastIsland_Text_AvaNotEnoughMons\n\tmsgbox SixIsland_OutcastIsland_Text_AvaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_OutcastIsland_EventScript_Geb::\n\ttrainerbattle_double TRAINER_SIS_AND_BRO_AVA_GEB, SixIsland_OutcastIsland_Text_GebIntro, SixIsland_OutcastIsland_Text_GebDefeat, SixIsland_OutcastIsland_Text_GebNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_OutcastIsland_EventScript_GebRematch\n\tmsgbox SixIsland_OutcastIsland_Text_GebPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_OutcastIsland_EventScript_GebRematch::\n\ttrainerbattle_rematch_double TRAINER_SIS_AND_BRO_AVA_GEB, SixIsland_OutcastIsland_Text_GebRematchIntro, SixIsland_OutcastIsland_Text_GebDefeat, SixIsland_OutcastIsland_Text_GebNotEnoughMons\n\tmsgbox SixIsland_OutcastIsland_Text_GebPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_GreenPath_EventScript_Jaclyn::\n\ttrainerbattle_single TRAINER_PSYCHIC_JACLYN, SixIsland_GreenPath_Text_JaclynIntro, SixIsland_GreenPath_Text_JaclynDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_GreenPath_EventScript_JaclynRematch\n\tmsgbox SixIsland_GreenPath_Text_JaclynPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_GreenPath_EventScript_JaclynRematch::\n\ttrainerbattle_rematch TRAINER_PSYCHIC_JACLYN, SixIsland_GreenPath_Text_JaclynRematchIntro, SixIsland_GreenPath_Text_JaclynDefeat\n\tmsgbox SixIsland_GreenPath_Text_JaclynPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_Rose::\n\ttrainerbattle_single TRAINER_AROMA_LADY_ROSE, SixIsland_WaterPath_Text_RoseIntro, SixIsland_WaterPath_Text_RoseDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_RoseRematch\n\tmsgbox SixIsland_WaterPath_Text_RosePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_RoseRematch::\n\ttrainerbattle_rematch TRAINER_AROMA_LADY_ROSE, SixIsland_WaterPath_Text_RoseRematchIntro, SixIsland_WaterPath_Text_RoseDefeat\n\tmsgbox SixIsland_WaterPath_Text_RosePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_Edward::\n\ttrainerbattle_single TRAINER_JUGGLER_EDWARD, SixIsland_WaterPath_Text_EdwardIntro, SixIsland_WaterPath_Text_EdwardDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_EdwardRematch\n\tmsgbox SixIsland_WaterPath_Text_EdwardPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_EdwardRematch::\n\ttrainerbattle_rematch TRAINER_JUGGLER_EDWARD, SixIsland_WaterPath_Text_EdwardRematchIntro, SixIsland_WaterPath_Text_EdwardDefeat\n\tmsgbox SixIsland_WaterPath_Text_EdwardPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_Samir::\n\ttrainerbattle_single TRAINER_SWIMMER_MALE_SAMIR, SixIsland_WaterPath_Text_SamirIntro, SixIsland_WaterPath_Text_SamirDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_SamirRematch\n\tmsgbox SixIsland_WaterPath_Text_SamirPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_SamirRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_MALE_SAMIR, SixIsland_WaterPath_Text_SamirRematchIntro, SixIsland_WaterPath_Text_SamirDefeat\n\tmsgbox SixIsland_WaterPath_Text_SamirPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_Denise::\n\ttrainerbattle_single TRAINER_SWIMMER_FEMALE_DENISE, SixIsland_WaterPath_Text_DeniseIntro, SixIsland_WaterPath_Text_DeniseDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_DeniseRematch\n\tmsgbox SixIsland_WaterPath_Text_DenisePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_DeniseRematch::\n\ttrainerbattle_rematch TRAINER_SWIMMER_FEMALE_DENISE, SixIsland_WaterPath_Text_DeniseRematchIntro, SixIsland_WaterPath_Text_DeniseDefeat\n\tmsgbox SixIsland_WaterPath_Text_DenisePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_Miu::\n\ttrainerbattle_double TRAINER_TWINS_MIU_MIA, SixIsland_WaterPath_Text_MiuIntro, SixIsland_WaterPath_Text_MiuDefeat, SixIsland_WaterPath_Text_MiuNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_MiuRematch\n\tmsgbox SixIsland_WaterPath_Text_MiuPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_MiuRematch::\n\ttrainerbattle_rematch_double TRAINER_TWINS_MIU_MIA, SixIsland_WaterPath_Text_MiuRematchIntro, SixIsland_WaterPath_Text_MiuDefeat, SixIsland_WaterPath_Text_MiuNotEnoughMons\n\tmsgbox SixIsland_WaterPath_Text_MiuPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_Mia::\n\ttrainerbattle_double TRAINER_TWINS_MIU_MIA, SixIsland_WaterPath_Text_MiaIntro, SixIsland_WaterPath_Text_MiaDefeat, SixIsland_WaterPath_Text_MiaNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_MiaRematch\n\tmsgbox SixIsland_WaterPath_Text_MiaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_MiaRematch::\n\ttrainerbattle_rematch_double TRAINER_TWINS_MIU_MIA, SixIsland_WaterPath_Text_MiaRematchIntro, SixIsland_WaterPath_Text_MiaDefeat, SixIsland_WaterPath_Text_MiaNotEnoughMons\n\tmsgbox SixIsland_WaterPath_Text_MiaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_Earl::\n\ttrainerbattle_single TRAINER_HIKER_EARL, SixIsland_WaterPath_Text_EarlIntro, SixIsland_WaterPath_Text_EarlDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_WaterPath_EventScript_EarlRematch\n\tmsgbox SixIsland_WaterPath_Text_EarlPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_WaterPath_EventScript_EarlRematch::\n\ttrainerbattle_rematch TRAINER_HIKER_EARL, SixIsland_WaterPath_Text_EarlRematchIntro, SixIsland_WaterPath_Text_EarlDefeat\n\tmsgbox SixIsland_WaterPath_Text_EarlPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_RuinValley_EventScript_Stanly::\n\ttrainerbattle_single TRAINER_RUIN_MANIAC_STANLY, SixIsland_RuinValley_Text_StanlyIntro, SixIsland_RuinValley_Text_StanlyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_RuinValley_EventScript_StanlyRematch\n\tmsgbox SixIsland_RuinValley_Text_StanlyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_RuinValley_EventScript_StanlyRematch::\n\ttrainerbattle_rematch TRAINER_RUIN_MANIAC_STANLY, SixIsland_RuinValley_Text_StanlyRematchIntro, SixIsland_RuinValley_Text_StanlyDefeat\n\tmsgbox SixIsland_RuinValley_Text_StanlyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_RuinValley_EventScript_Foster::\n\ttrainerbattle_single TRAINER_RUIN_MANIAC_FOSTER, SixIsland_RuinValley_Text_FosterIntro, SixIsland_RuinValley_Text_FosterDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_RuinValley_EventScript_FosterRematch\n\tmsgbox SixIsland_RuinValley_Text_FosterPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_RuinValley_EventScript_FosterRematch::\n\ttrainerbattle_rematch TRAINER_RUIN_MANIAC_FOSTER, SixIsland_RuinValley_Text_FosterRematchIntro, SixIsland_RuinValley_Text_FosterDefeat\n\tmsgbox SixIsland_RuinValley_Text_FosterPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_RuinValley_EventScript_Larry::\n\ttrainerbattle_single TRAINER_RUIN_MANIAC_LARRY, SixIsland_RuinValley_Text_LarryIntro, SixIsland_RuinValley_Text_LarryDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_RuinValley_EventScript_LarryRematch\n\tmsgbox SixIsland_RuinValley_Text_LarryPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_RuinValley_EventScript_LarryRematch::\n\ttrainerbattle_rematch TRAINER_RUIN_MANIAC_LARRY, SixIsland_RuinValley_Text_LarryRematchIntro, SixIsland_RuinValley_Text_LarryDefeat\n\tmsgbox SixIsland_RuinValley_Text_LarryPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_RuinValley_EventScript_Daryl::\n\ttrainerbattle_single TRAINER_HIKER_DARYL, SixIsland_RuinValley_Text_DarylIntro, SixIsland_RuinValley_Text_DarylDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_RuinValley_EventScript_DarylRematch\n\tmsgbox SixIsland_RuinValley_Text_DarylPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_RuinValley_EventScript_DarylRematch::\n\ttrainerbattle_rematch TRAINER_HIKER_DARYL, SixIsland_RuinValley_Text_DarylRematchIntro, SixIsland_RuinValley_Text_DarylDefeat\n\tmsgbox SixIsland_RuinValley_Text_DarylPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_RuinValley_EventScript_Hector::\n\ttrainerbattle_single TRAINER_POKEMANIAC_HECTOR, SixIsland_RuinValley_Text_HectorIntro, SixIsland_RuinValley_Text_HectorDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SixIsland_RuinValley_EventScript_HectorRematch\n\tmsgbox SixIsland_RuinValley_Text_HectorPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSixIsland_RuinValley_EventScript_HectorRematch::\n\ttrainerbattle_rematch TRAINER_POKEMANIAC_HECTOR, SixIsland_RuinValley_Text_HectorRematchIntro, SixIsland_RuinValley_Text_HectorDefeat\n\tmsgbox SixIsland_RuinValley_Text_HectorPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_TrainerTower_EventScript_Dario::\n\ttrainerbattle_single TRAINER_PSYCHIC_DARIO, SevenIsland_TrainerTower_Text_DarioIntro, SevenIsland_TrainerTower_Text_DarioDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_TrainerTower_EventScript_DarioRematch\n\tmsgbox SevenIsland_TrainerTower_Text_DarioPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_TrainerTower_EventScript_DarioRematch::\n\ttrainerbattle_rematch TRAINER_PSYCHIC_DARIO, SevenIsland_TrainerTower_Text_DarioRematchIntro, SevenIsland_TrainerTower_Text_DarioDefeat\n\tmsgbox SevenIsland_TrainerTower_Text_DarioPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_TrainerTower_EventScript_Rodette::\n\ttrainerbattle_single TRAINER_PSYCHIC_RODETTE, SevenIsland_TrainerTower_Text_RodetteIntro, SevenIsland_TrainerTower_Text_RodetteDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_TrainerTower_EventScript_RodetteRematch\n\tmsgbox SevenIsland_TrainerTower_Text_RodettePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_TrainerTower_EventScript_RodetteRematch::\n\ttrainerbattle_rematch TRAINER_PSYCHIC_RODETTE, SevenIsland_TrainerTower_Text_RodetteRematchIntro, SevenIsland_TrainerTower_Text_RodetteDefeat\n\tmsgbox SevenIsland_TrainerTower_Text_RodettePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_Miah::\n\ttrainerbattle_single TRAINER_AROMA_LADY_MIAH, SevenIsland_SevaultCanyon_Entrance_Text_MiahIntro, SevenIsland_SevaultCanyon_Entrance_Text_MiahDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_Entrance_EventScript_MiahRematch\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_MiahPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_MiahRematch::\n\ttrainerbattle_rematch TRAINER_AROMA_LADY_MIAH, SevenIsland_SevaultCanyon_Entrance_Text_MiahRematchIntro, SevenIsland_SevaultCanyon_Entrance_Text_MiahDefeat\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_MiahPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_Eve::\n\ttrainerbattle_double TRAINER_YOUNG_COUPLE_EVE_JON, SevenIsland_SevaultCanyon_Entrance_Text_EveIntro, SevenIsland_SevaultCanyon_Entrance_Text_EveDefeat, SevenIsland_SevaultCanyon_Entrance_Text_EveNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_Entrance_EventScript_EveRematch\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_EvePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_EveRematch::\n\ttrainerbattle_rematch_double TRAINER_YOUNG_COUPLE_EVE_JON, SevenIsland_SevaultCanyon_Entrance_Text_EveRematchIntro, SevenIsland_SevaultCanyon_Entrance_Text_EveDefeat, SevenIsland_SevaultCanyon_Entrance_Text_EveNotEnoughMons\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_EvePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_Jon::\n\ttrainerbattle_double TRAINER_YOUNG_COUPLE_EVE_JON, SevenIsland_SevaultCanyon_Entrance_Text_JonIntro, SevenIsland_SevaultCanyon_Entrance_Text_JonDefeat, SevenIsland_SevaultCanyon_Entrance_Text_JonNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_Entrance_EventScript_JonRematch\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_JonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_JonRematch::\n\ttrainerbattle_rematch_double TRAINER_YOUNG_COUPLE_EVE_JON, SevenIsland_SevaultCanyon_Entrance_Text_JonRematchIntro, SevenIsland_SevaultCanyon_Entrance_Text_JonDefeat, SevenIsland_SevaultCanyon_Entrance_Text_JonNotEnoughMons\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_JonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_Mason::\n\ttrainerbattle_single TRAINER_JUGGLER_MASON, SevenIsland_SevaultCanyon_Entrance_Text_MasonIntro, SevenIsland_SevaultCanyon_Entrance_Text_MasonDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_Entrance_EventScript_MasonRematch\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_MasonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_MasonRematch::\n\ttrainerbattle_rematch TRAINER_JUGGLER_MASON, SevenIsland_SevaultCanyon_Entrance_Text_MasonRematchIntro, SevenIsland_SevaultCanyon_Entrance_Text_MasonDefeat\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_MasonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_Nicolas::\n\ttrainerbattle_single TRAINER_PKMN_RANGER_NICOLAS, SevenIsland_SevaultCanyon_Entrance_Text_NicolasIntro, SevenIsland_SevaultCanyon_Entrance_Text_NicolasDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_Entrance_EventScript_NicolasRematch\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_NicolasPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_NicolasRematch::\n\ttrainerbattle_rematch TRAINER_PKMN_RANGER_NICOLAS, SevenIsland_SevaultCanyon_Entrance_Text_NicolasRematchIntro, SevenIsland_SevaultCanyon_Entrance_Text_NicolasDefeat\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_NicolasPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_Madeline::\n\ttrainerbattle_single TRAINER_PKMN_RANGER_MADELINE, SevenIsland_SevaultCanyon_Entrance_Text_MadelineIntro, SevenIsland_SevaultCanyon_Entrance_Text_MadelineDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_Entrance_EventScript_MadelineRematch\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_MadelinePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_Entrance_EventScript_MadelineRematch::\n\ttrainerbattle_rematch TRAINER_PKMN_RANGER_MADELINE, SevenIsland_SevaultCanyon_Entrance_Text_MadelineRematchIntro, SevenIsland_SevaultCanyon_Entrance_Text_MadelineDefeat\n\tmsgbox SevenIsland_SevaultCanyon_Entrance_Text_MadelinePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_Cyndy::\n\ttrainerbattle_single TRAINER_CRUSH_GIRL_CYNDY, SevenIsland_SevaultCanyon_Text_CyndyIntro, SevenIsland_SevaultCanyon_Text_CyndyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_CyndyRematch\n\tmsgbox SevenIsland_SevaultCanyon_Text_CyndyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_CyndyRematch::\n\ttrainerbattle_rematch TRAINER_CRUSH_GIRL_CYNDY, SevenIsland_SevaultCanyon_Text_CyndyRematchIntro, SevenIsland_SevaultCanyon_Text_CyndyDefeat\n\tmsgbox SevenIsland_SevaultCanyon_Text_CyndyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_Evan::\n\ttrainerbattle_single TRAINER_TAMER_EVAN, SevenIsland_SevaultCanyon_Text_EvanIntro, SevenIsland_SevaultCanyon_Text_EvanDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_EvanRematch\n\tmsgbox SevenIsland_SevaultCanyon_Text_EvanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_EvanRematch::\n\ttrainerbattle_rematch TRAINER_TAMER_EVAN, SevenIsland_SevaultCanyon_Text_EvanRematchIntro, SevenIsland_SevaultCanyon_Text_EvanDefeat\n\tmsgbox SevenIsland_SevaultCanyon_Text_EvanPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_Jackson::\n\ttrainerbattle_single TRAINER_PKMN_RANGER_JACKSON, SevenIsland_SevaultCanyon_Text_JacksonIntro, SevenIsland_SevaultCanyon_Text_JacksonDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_JacksonRematch\n\tmsgbox SevenIsland_SevaultCanyon_Text_JacksonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_JacksonRematch::\n\ttrainerbattle_rematch TRAINER_PKMN_RANGER_JACKSON, SevenIsland_SevaultCanyon_Text_JacksonRematchIntro, SevenIsland_SevaultCanyon_Text_JacksonDefeat\n\tmsgbox SevenIsland_SevaultCanyon_Text_JacksonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_Katelyn::\n\ttrainerbattle_single TRAINER_PKMN_RANGER_KATELYN, SevenIsland_SevaultCanyon_Text_KatelynIntro, SevenIsland_SevaultCanyon_Text_KatelynDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_KatelynRematch\n\tmsgbox SevenIsland_SevaultCanyon_Text_KatelynPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_KatelynRematch::\n\ttrainerbattle_rematch TRAINER_PKMN_RANGER_KATELYN, SevenIsland_SevaultCanyon_Text_KatelynRematchIntro, SevenIsland_SevaultCanyon_Text_KatelynDefeat\n\tmsgbox SevenIsland_SevaultCanyon_Text_KatelynPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_Leroy::\n\ttrainerbattle_single TRAINER_COOLTRAINER_LEROY, SevenIsland_SevaultCanyon_Text_LeroyIntro, SevenIsland_SevaultCanyon_Text_LeroyDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_LeroyRematch\n\tmsgbox SevenIsland_SevaultCanyon_Text_LeroyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_LeroyRematch::\n\ttrainerbattle_rematch TRAINER_COOLTRAINER_LEROY, SevenIsland_SevaultCanyon_Text_LeroyRematchIntro, SevenIsland_SevaultCanyon_Text_LeroyDefeat\n\tmsgbox SevenIsland_SevaultCanyon_Text_LeroyPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_Michelle::\n\ttrainerbattle_single TRAINER_COOLTRAINER_MICHELLE, SevenIsland_SevaultCanyon_Text_MichelleIntro, SevenIsland_SevaultCanyon_Text_MichelleDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_MichelleRematch\n\tmsgbox SevenIsland_SevaultCanyon_Text_MichellePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_MichelleRematch::\n\ttrainerbattle_rematch TRAINER_COOLTRAINER_MICHELLE, SevenIsland_SevaultCanyon_Text_MichelleRematchIntro, SevenIsland_SevaultCanyon_Text_MichelleDefeat\n\tmsgbox SevenIsland_SevaultCanyon_Text_MichellePostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_Lex::\n\ttrainerbattle_double TRAINER_COOL_COUPLE_LEX_NYA, SevenIsland_SevaultCanyon_Text_LexIntro, SevenIsland_SevaultCanyon_Text_LexDefeat, SevenIsland_SevaultCanyon_Text_LexNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_LexRematch\n\tmsgbox SevenIsland_SevaultCanyon_Text_LexPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_LexRematch::\n\ttrainerbattle_rematch_double TRAINER_COOL_COUPLE_LEX_NYA, SevenIsland_SevaultCanyon_Text_LexRematchIntro, SevenIsland_SevaultCanyon_Text_LexDefeat, SevenIsland_SevaultCanyon_Text_LexNotEnoughMons\n\tmsgbox SevenIsland_SevaultCanyon_Text_LexPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_Nya::\n\ttrainerbattle_double TRAINER_COOL_COUPLE_LEX_NYA, SevenIsland_SevaultCanyon_Text_NyaIntro, SevenIsland_SevaultCanyon_Text_NyaDefeat, SevenIsland_SevaultCanyon_Text_NyaNotEnoughMons\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_SevaultCanyon_EventScript_NyaRematch\n\tmsgbox SevenIsland_SevaultCanyon_Text_NyaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_SevaultCanyon_EventScript_NyaRematch::\n\ttrainerbattle_rematch_double TRAINER_COOL_COUPLE_LEX_NYA, SevenIsland_SevaultCanyon_Text_NyaRematchIntro, SevenIsland_SevaultCanyon_Text_NyaDefeat, SevenIsland_SevaultCanyon_Text_NyaNotEnoughMons\n\tmsgbox SevenIsland_SevaultCanyon_Text_NyaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_TanobyRuins_EventScript_Brandon::\n\ttrainerbattle_single TRAINER_RUIN_MANIAC_BRANDON, SevenIsland_TanobyRuins_Text_BrandonIntro, SevenIsland_TanobyRuins_Text_BrandonDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_TanobyRuins_EventScript_BrandonRematch\n\tmsgbox SevenIsland_TanobyRuins_Text_BrandonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_TanobyRuins_EventScript_BrandonRematch::\n\ttrainerbattle_rematch TRAINER_RUIN_MANIAC_BRANDON, SevenIsland_TanobyRuins_Text_BrandonRematchIntro, SevenIsland_TanobyRuins_Text_BrandonDefeat\n\tmsgbox SevenIsland_TanobyRuins_Text_BrandonPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_TanobyRuins_EventScript_Benjamin::\n\ttrainerbattle_single TRAINER_RUIN_MANIAC_BENJAMIN, SevenIsland_TanobyRuins_Text_BenjaminIntro, SevenIsland_TanobyRuins_Text_BenjaminDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_TanobyRuins_EventScript_BenjaminRematch\n\tmsgbox SevenIsland_TanobyRuins_Text_BenjaminPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_TanobyRuins_EventScript_BenjaminRematch::\n\ttrainerbattle_rematch TRAINER_RUIN_MANIAC_BENJAMIN, SevenIsland_TanobyRuins_Text_BenjaminRematchIntro, SevenIsland_TanobyRuins_Text_BenjaminDefeat\n\tmsgbox SevenIsland_TanobyRuins_Text_BenjaminPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_TanobyRuins_EventScript_Edna::\n\ttrainerbattle_single TRAINER_PAINTER_EDNA, SevenIsland_TanobyRuins_Text_EdnaIntro, SevenIsland_TanobyRuins_Text_EdnaDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_TanobyRuins_EventScript_EdnaRematch\n\tmsgbox SevenIsland_TanobyRuins_Text_EdnaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_TanobyRuins_EventScript_EdnaRematch::\n\ttrainerbattle_rematch TRAINER_PAINTER_EDNA, SevenIsland_TanobyRuins_Text_EdnaRematchIntro, SevenIsland_TanobyRuins_Text_EdnaDefeat\n\tmsgbox SevenIsland_TanobyRuins_Text_EdnaPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_TanobyRuins_EventScript_Clifford::\n\ttrainerbattle_single TRAINER_GENTLEMAN_CLIFFORD, SevenIsland_TanobyRuins_Text_CliffordIntro, SevenIsland_TanobyRuins_Text_CliffordDefeat\n\tspecialvar VAR_RESULT, ShouldTryRematchBattle\n\tgoto_if_eq VAR_RESULT, TRUE, SevenIsland_TanobyRuins_EventScript_CliffordRematch\n\tmsgbox SevenIsland_TanobyRuins_Text_CliffordPostBattle, MSGBOX_AUTOCLOSE\n\tend\n\nSevenIsland_TanobyRuins_EventScript_CliffordRematch::\n\ttrainerbattle_rematch TRAINER_GENTLEMAN_CLIFFORD, SevenIsland_TanobyRuins_Text_CliffordRematchIntro, SevenIsland_TanobyRuins_Text_CliffordDefeat\n\tmsgbox SevenIsland_TanobyRuins_Text_CliffordPostBattle, MSGBOX_AUTOCLOSE\n\tend\n"
  },
  {
    "path": "data/scripts/white_out.inc",
    "content": "EventScript_AfterWhiteOutHeal::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tmsgbox Text_FirstShouldRestoreMonsHealth\n\tcall EventScript_PkmnCenterNurse_TakeAndHealPkmn\n\tcall_if_unset FLAG_DEFEATED_BROCK, EventScript_AfterWhiteOutHealMsgPreBrock\n\tcall_if_set FLAG_DEFEATED_BROCK, EventScript_AfterWhiteOutHealMsg\n\tapplymovement VAR_LAST_TALKED, Movement_Bow\n\twaitmovement 0\n\tfadedefaultbgm\n\treleaseall\n\tend\n\nEventScript_NuzlockeHaveMons_Nurse::\n\tlockall\n\ttextcolor 1\n\tmsgbox Text_SwappedForYou_NuzlockeOnly\n\tapplymovement VAR_LAST_TALKED, Movement_Bow\n\twaitmovement 0\n\tfadedefaultbgm\n\treleaseall\n\tend\n\nEventScript_NoPMCHaveMons_Nurse::\n\tlockall\n\ttextcolor 1\n\tmsgbox Text_SwappedForYou_NoPMCOnly\n\tapplymovement VAR_LAST_TALKED, Movement_Bow\n\twaitmovement 0\n\tfadedefaultbgm\n\treleaseall\n\tend\n\nText_SwappedForYou_NuzlockeOnly::\n\t.string \"I've swapped a POKéMON from your\\n\"\n\t.string \"BOX with a POKéMON in your party.\\p\"\n\t.string \"If your POKéMON's energy, HP, is\\n\"\n\t.string \"low, come see us before they faint.\\p\"\n\t.string \"If you're planning to go far in the\\n\"\n\t.string \"field, you should buy some POTIONS\\l\"\n\t.string \"at the POKéMON MART.\\p\"\n\t.string \"We hope you excel!$\"\n\nText_SwappedForYou_NoPMCOnly::\n\t.string \"I've swapped a POKéMON from your\\n\"\n\t.string \"BOX with a POKéMON in your party.\\p\"\n\t.string \"If you're planning to go far in the\\n\"\n\t.string \"field, you should buy some POTIONS\\l\"\n\t.string \"at the POKéMON MART.\\p\"\n\t.string \"We hope you excel!$\"\n\nEventScript_AfterWhiteOutHealMsgPreBrock::\n\ttextcolor 1\n\tmsgbox Text_MonsHealedShouldBuyPotions\n\treturn\n\nEventScript_AfterWhiteOutHealMsg::\n\ttextcolor 1\n\tmsgbox Text_MonsHealed\n\treturn\n\n@ LOCALID_MOM set by PalletTown_PlayersHouse_1F\n\nEventScript_AfterWhiteOutMomHeal::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_FEMALE\n\tapplymovement LOCALID_MOM, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tmsgbox Text_HadQuiteAnExperienceTakeRest\n\tcall EventScript_OutOfCenterPartyHeal\n\ttextcolor 1\n\tmsgbox Text_MomExplainHPGetPotions\n\tfadedefaultbgm\n\treleaseall\n\tend\n\nEventScript_NuzlockeGameOver::\n\tlockall\n\ttextcolor 3\n\tsignmsg\n\tmsgbox Text_NuzlockeGameOver\n\tmsgbox EventScript_NuzlockeGameOver_Text_0, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_1\n\tmsgbox EventScript_NuzlockeGameOver_Text_3, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_7\n\tsetvar VAR_TEMP_9, 2\n\tgoto EventScript_NuzlockeGameOver_Loop\n\treturn\n\nEventScript_NuzlockeGameOver_1:\n\tmsgbox EventScript_NuzlockeGameOver_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_4\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_NuzlockeGameOver_Loop\n\treturn\n\nEventScript_NuzlockeGameOver_4:\n\tmsgbox EventScript_NuzlockeGameOver_Text_2\n\tcallnative DoSoftReset\n\treturn\n\nEventScript_NuzlockeGameOver_7:\n\tmsgbox EventScript_NuzlockeGameOver_Text_4\n\tnormalmsg\n\tcallnative TurnOffNuzlockeMode\n\tcallnative ResetTintFilter\n\tgoto EventScript_AfterWhiteOutHeal\n\treturn\n\nEventScript_NuzlockeGameOver_Loop::\n\tswitch VAR_TEMP_9\n\tcase 1, EventScript_NuzlockeGameOver_Loop_2\n\tcase 2, EventScript_NuzlockeGameOver_Loop_3\n\treturn\n\nEventScript_NuzlockeGameOver_Loop_2:\n\tmsgbox EventScript_NuzlockeGameOver_Text_3, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Loop_4\n\tsetvar VAR_TEMP_9, 2\n\tgoto EventScript_NuzlockeGameOver_Loop\n\treturn\n\nEventScript_NuzlockeGameOver_Loop_3:\n\tmsgbox EventScript_NuzlockeGameOver_Text_0, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Loop_7\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_NuzlockeGameOver_Loop\n\treturn\n\nEventScript_NuzlockeGameOver_Loop_4:\n\tmsgbox EventScript_NuzlockeGameOver_Text_4\n\tnormalmsg\n\tcallnative TurnOffNuzlockeMode\n\tcallnative ResetTintFilter\n\tgoto EventScript_AfterWhiteOutHeal\n\treturn\n\nEventScript_NuzlockeGameOver_Loop_7:\n\tmsgbox EventScript_NuzlockeGameOver_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Loop_10\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_NuzlockeGameOver_Loop\n\treturn\n\nEventScript_NuzlockeGameOver_Loop_10:\n\tmsgbox EventScript_NuzlockeGameOver_Text_2\n\tcallnative DoSoftReset\n\treturn\n\nEventScript_NuzlockeGameOver_Text_0:\n\t.string \"Would you like to reset to the\\nlast save point?$\"\n\nEventScript_NuzlockeGameOver_Text_1:\n\t.string \"Are you sure?\\pYou will lose all progress since\\nyou last saved.$\"\n\nEventScript_NuzlockeGameOver_Text_2:\n\t.string \"The game will now reset.$\"\n\nEventScript_NuzlockeGameOver_Text_3:\n\t.string \"Would you like to turn off\\nNUZLOCKE MODE and heal your party?$\"\n\nEventScript_NuzlockeGameOver_Text_4:\n\t.string \"NUZLOCKE MODE has been turned off.$\"\n\nEventScript_NuzlockeGameOver_Mom::\n\tlockall\n\ttextcolor 3\n\tsignmsg\n\tmsgbox Text_NuzlockeGameOver\n\tmsgbox EventScript_NuzlockeGameOver_Text_0, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Mom_1\n\tmsgbox EventScript_NuzlockeGameOver_Text_3, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Mom_7\n\tsetvar VAR_TEMP_9, 2\n\tgoto EventScript_NuzlockeGameOver_Loop_Mom\n\treturn\n\nEventScript_NuzlockeGameOver_Mom_1:\n\tmsgbox EventScript_NuzlockeGameOver_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Mom_4\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_NuzlockeGameOver_Loop_Mom\n\treturn\n\nEventScript_NuzlockeGameOver_Mom_4:\n\tmsgbox EventScript_NuzlockeGameOver_Text_2\n\tcallnative DoSoftReset\n\treturn\n\nEventScript_NuzlockeGameOver_Mom_7:\n\tmsgbox EventScript_NuzlockeGameOver_Text_4\n\tnormalmsg\n\tcallnative TurnOffNuzlockeMode\n\tcallnative ResetTintFilter\n\tgoto EventScript_AfterWhiteOutMomHeal\n\treturn\n\n\nEventScript_NuzlockeGameOver_Loop_Mom::\n\tswitch VAR_TEMP_9\n\tcase 1, EventScript_NuzlockeGameOver_Loop_Mom_2\n\tcase 2, EventScript_NuzlockeGameOver_Loop_Mom_3\n\treturn\n\nEventScript_NuzlockeGameOver_Loop_Mom_2:\n\tmsgbox EventScript_NuzlockeGameOver_Text_3, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Loop_Mom_4\n\tsetvar VAR_TEMP_9, 2\n\tgoto EventScript_NuzlockeGameOver_Loop_Mom\n\treturn\n\nEventScript_NuzlockeGameOver_Loop_Mom_3:\n\tmsgbox EventScript_NuzlockeGameOver_Text_0, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Loop_Mom_7\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_NuzlockeGameOver_Loop_Mom\n\treturn\n\nEventScript_NuzlockeGameOver_Loop_Mom_4:\n\tmsgbox EventScript_NuzlockeGameOver_Text_4\n\tnormalmsg\n\tcallnative TurnOffNuzlockeMode\n\tcallnative ResetTintFilter\n\tgoto EventScript_AfterWhiteOutMomHeal\n\treturn\n\nEventScript_NuzlockeGameOver_Loop_Mom_7:\n\tmsgbox EventScript_NuzlockeGameOver_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NuzlockeGameOver_Loop_Mom_10\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_NuzlockeGameOver_Loop_Mom\n\treturn\n\nEventScript_NuzlockeGameOver_Loop_Mom_10:\n\tmsgbox EventScript_NuzlockeGameOver_Text_2\n\tcallnative DoSoftReset\n\treturn\n\nText_NuzlockeGameOver::\n\t.string \"You have no more POKéMON that can\\n\"\n\t.string \"battle in your POKéMON PC.\\p\"\n\t.string \"You can either reset to the last\\n\"\n\t.string \"time you saved, or turn off\\l\"\n\t.string \"NUZLOCKE MODE and heal your party.$\"\n\nEventScript_NuzlockeHaveMons_Mom::\n\tlockall\n\ttextcolor 1\n\tapplymovement 1, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tmsgbox Text_SwappedForYou_NuzlockeOnly_Mom\n\tfadedefaultbgm\n\treleaseall\n\tend\n\nEventScript_NoPMCHaveMons_Mom::\n\tlockall\n\ttextcolor 1\n\tapplymovement 1, Common_Movement_WalkInPlaceFasterDown\n\twaitmovement 0\n\tmsgbox Text_SwappedForYou_NoPMCOnly_Mom\n\tfadedefaultbgm\n\treleaseall\n\tend\n\nText_SwappedForYou_NuzlockeOnly_Mom::\n\t.string \"MOM: {PLAYER}!\\n\"\n\t.string \"Welcome home.\\p\"\n\t.string \"It sounds like you had quite\\n\"\n\t.string \"an experience.\\p\"\n\t.string \"I've swapped a POKéMON from your\\n\"\n\t.string \"BOX with a POKéMON in your party.\\p\"\n\t.string \"I just heard from PROF. OAK.\\p\"\n\t.string \"He said that POKéMON's energy is\\n\"\n\t.string \"measured in HP.\\p\"\n\t.string \"If your POKéMON lose their HP,\\n\"\n\t.string \"you can restore them at any\\l\"\n\t.string \"POKéMON CENTER before they faint.\\p\"\n\t.string \"If you're going to travel far away,\\n\"\n\t.string \"the smart TRAINER stocks up on\\l\"\n\t.string \"POTIONS at the POKéMON MART.\\p\"\n\t.string \"Make me proud, honey!\\p\"\n\t.string \"Take care!$\"\n\nText_SwappedForYou_NoPMCOnly_Mom::\n\t.string \"MOM: {PLAYER}!\\n\"\n\t.string \"Welcome home.\\p\"\n\t.string \"It sounds like you had quite\\n\"\n\t.string \"an experience.\\p\"\n\t.string \"I've swapped a POKéMON from your\\n\"\n\t.string \"BOX with a POKéMON in your party.\\p\"\n\t.string \"I just heard from PROF. OAK.\\p\"\n\t.string \"He said that POKéMON's energy is\\n\"\n\t.string \"measured in HP.\\p\"\n\t.string \"If you're going to travel far away,\\n\"\n\t.string \"the smart TRAINER stocks up on\\l\"\n\t.string \"POTIONS at the POKéMON MART to\\l\"\n\t.string \"restore their POKéMON's HP.\\p\"\n\t.string \"Make me proud, honey!\\p\"\n\t.string \"Take care!$\"\n\nEventScript_FieldPoison::\n\tlockall\n\ttextcolor NPC_TEXT_COLOR_NEUTRAL\n\tspecial TryFieldPoisonWhiteOut\n\twaitstate\n\tgoto_if_eq VAR_RESULT, TRUE, EventScript_FieldWhiteOut\n\treleaseall\n\tend\n\nEventScript_FieldWhiteOut::\n\tcheckmoney 1\n\tgoto_if_eq VAR_RESULT, FALSE, EventScript_FieldWhiteOutNoMoney\n\tgoto_if_eq VAR_RESULT, TRUE, EventScript_FieldWhiteOutHasMoney\n\tend\n\nEventScript_FieldWhiteOutNoMoney::\n\tmsgbox Text_WhitedOut\n\tgoto EventScript_FieldWhiteOutFade\n\tend\n\nEventScript_FieldWhiteOutHasMoney::\n\tspecial OverworldWhiteOutGetMoneyLoss\n\tmsgbox Text_WhitedOutLostMoney\n\tgoto EventScript_FieldWhiteOutFade\n\tend\n\nEventScript_FieldWhiteOutFade::\n\tspecial Script_FadeOutMapMusic\n\twaitstate\n\tfadescreen FADE_TO_BLACK\n\tspecial SetCB2WhiteOut\n\twaitstate\n\tend\n\nEventScript_BothGameOver::\n\tlockall\n\ttextcolor 3\n\tsignmsg\n\tmsgbox EventScript_BothGameOver_Text_0\n\tmsgbox EventScript_BothGameOver_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_1\n\tmsgbox EventScript_BothGameOver_Text_4, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_7\n\tsetvar VAR_TEMP_9, 2\n\tgoto EventScript_BothGameOver_Loop\n\treturn\n\nEventScript_BothGameOver_1:\n\tmsgbox EventScript_BothGameOver_Text_2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_4\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_BothGameOver_Loop\n\treturn\n\nEventScript_BothGameOver_4:\n\tmsgbox EventScript_BothGameOver_Text_3\n\tcallnative DoSoftReset\n\treturn\n\nEventScript_BothGameOver_7:\n\tmsgbox EventScript_BothGameOver_Text_5\n\tnormalmsg\n\tcallnative TurnOffNuzlockeMode\n\tcallnative TurnOffNoPMC\n\tcallnative ResetTintFilter\n\tgoto EventScript_AfterWhiteOutHeal\n\treturn\n\n\nEventScript_BothGameOver_Loop::\n\tswitch VAR_TEMP_9\n\tcase 1, EventScript_BothGameOver_Loop_2\n\tcase 2, EventScript_BothGameOver_Loop_3\n\treturn\n\nEventScript_BothGameOver_Loop_2:\n\tmsgbox EventScript_BothGameOver_Text_4, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Loop_4\n\tsetvar VAR_TEMP_9, 2\n\tgoto EventScript_BothGameOver_Loop\n\treturn\n\nEventScript_BothGameOver_Loop_3:\n\tmsgbox EventScript_BothGameOver_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Loop_7\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_BothGameOver_Loop\n\treturn\n\nEventScript_BothGameOver_Loop_4:\n\tmsgbox EventScript_BothGameOver_Text_5\n\tnormalmsg\n\tcallnative TurnOffNuzlockeMode\n\tcallnative TurnOffNoPMC\n\tcallnative ResetTintFilter\n\tgoto EventScript_AfterWhiteOutHeal\n\treturn\n\nEventScript_BothGameOver_Loop_7:\n\tmsgbox EventScript_BothGameOver_Text_2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Loop_10\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_BothGameOver_Loop\n\treturn\n\nEventScript_BothGameOver_Loop_10:\n\tmsgbox EventScript_BothGameOver_Text_3\n\tcallnative DoSoftReset\n\treturn\n\nEventScript_BothGameOver_Text_0:\n\t.string \"You have no more POKéMON that can\\nbattle in your POKéMON PC.\\pYou can either reset to the last\\ntime you saved, or turn off\\lNUZLOCKE MODE and NO FREE HEALS\\land heal your party.$\"\n\nEventScript_BothGameOver_Text_1:\n\t.string \"Would you like to reset to the\\nlast save point?$\"\n\nEventScript_BothGameOver_Text_2:\n\t.string \"Are you sure?\\pYou will lose all progress since\\nyou last saved.$\"\n\nEventScript_BothGameOver_Text_3:\n\t.string \"The game will now reset.$\"\n\nEventScript_BothGameOver_Text_4:\n\t.string \"Would you like to turn off NUZLOCKE\\nMODE and NO FREE HEALS and heal\\lyour party?$\"\n\nEventScript_BothGameOver_Text_5:\n\t.string \"NUZLOCKE MODE and NO FREE HEALS\\nhave been turned off.$\"\n\nEventScript_BothGameOver_Mom::\n\tlockall\n\ttextcolor 3\n\tsignmsg\n\tmsgbox EventScript_BothGameOver_Mom_Text_0\n\tmsgbox EventScript_BothGameOver_Mom_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Mom_1\n\tmsgbox EventScript_BothGameOver_Mom_Text_4, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Mom_7\n\tsetvar VAR_TEMP_9, 2\n\tgoto EventScript_BothGameOver_Loop_Mom\n\treturn\n\nEventScript_BothGameOver_Mom_1:\n\tmsgbox EventScript_BothGameOver_Mom_Text_2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Mom_4\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_BothGameOver_Loop_Mom\n\treturn\n\nEventScript_BothGameOver_Mom_4:\n\tmsgbox EventScript_BothGameOver_Mom_Text_3\n\tcallnative DoSoftReset\n\treturn\n\nEventScript_BothGameOver_Mom_7:\n\tmsgbox EventScript_BothGameOver_Mom_Text_5\n\tnormalmsg\n\tcallnative TurnOffNuzlockeMode\n\tcallnative TurnOffNoPMC\n\tcallnative ResetTintFilter\n\tgoto EventScript_AfterWhiteOutMomHeal\n\treturn\n\n\nEventScript_BothGameOver_Loop_Mom::\n\tswitch VAR_TEMP_9\n\tcase 1, EventScript_BothGameOver_Loop_Mom_2\n\tcase 2, EventScript_BothGameOver_Loop_Mom_3\n\treturn\n\nEventScript_BothGameOver_Loop_Mom_2:\n\tmsgbox EventScript_BothGameOver_Mom_Text_4, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Loop_Mom_4\n\tsetvar VAR_TEMP_9, 2\n\tgoto EventScript_BothGameOver_Loop_Mom\n\treturn\n\nEventScript_BothGameOver_Loop_Mom_3:\n\tmsgbox EventScript_BothGameOver_Mom_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Loop_Mom_7\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_BothGameOver_Loop_Mom\n\treturn\n\nEventScript_BothGameOver_Loop_Mom_4:\n\tmsgbox EventScript_BothGameOver_Mom_Text_5\n\tnormalmsg\n\tcallnative TurnOffNuzlockeMode\n\tcallnative TurnOffNoPMC\n\tcallnative ResetTintFilter\n\tgoto EventScript_AfterWhiteOutMomHeal\n\treturn\n\nEventScript_BothGameOver_Loop_Mom_7:\n\tmsgbox EventScript_BothGameOver_Mom_Text_2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_BothGameOver_Loop_Mom_10\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_BothGameOver_Loop_Mom\n\treturn\n\nEventScript_BothGameOver_Loop_Mom_10:\n\tmsgbox EventScript_BothGameOver_Mom_Text_3\n\tcallnative DoSoftReset\n\treturn\n\nEventScript_BothGameOver_Mom_Text_0:\n\t.string \"You have no more POKéMON that can\\nbattle in your POKéMON PC.\\pYou can either reset to the last\\ntime you saved, or turn off\\lNUZLOCKE MODE and NO FREE HEALS\\land heal your party.$\"\n\nEventScript_BothGameOver_Mom_Text_1:\n\t.string \"Would you like to reset to the\\nlast save point?$\"\n\nEventScript_BothGameOver_Mom_Text_2:\n\t.string \"Are you sure?\\pYou will lose all progress since\\nyou last saved.$\"\n\nEventScript_BothGameOver_Mom_Text_3:\n\t.string \"The game will now reset.$\"\n\nEventScript_BothGameOver_Mom_Text_4:\n\t.string \"Would you like to turn off NUZLOCKE\\nMODE and NO FREE HEALS and heal\\lyour party?$\"\n\nEventScript_BothGameOver_Mom_Text_5:\n\t.string \"NUZLOCKE MODE and NO FREE HEALS\\nhave been turned off.$\"\n\nEventScript_NoPMCGameOver_Mom::\n\tlockall\n\ttextcolor 3\n\tsignmsg\n\tmsgbox EventScript_NoPMCGameOver_Mom_Text_0\n\tmsgbox EventScript_NoPMCGameOver_Mom_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Mom_1\n\tmsgbox EventScript_NoPMCGameOver_Mom_Text_4, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Mom_7\n\tsetvar VAR_TEMP_9, 2\n\tgoto EventScript_NoPMCGameOver_Loop_Mom\n\treturn\n\nEventScript_NoPMCGameOver_Mom_1:\n\tmsgbox EventScript_NoPMCGameOver_Mom_Text_2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Mom_4\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_NoPMCGameOver_Loop_Mom\n\treturn\n\nEventScript_NoPMCGameOver_Mom_4:\n\tmsgbox EventScript_NoPMCGameOver_Mom_Text_3\n\tcallnative DoSoftReset\n\treturn\n\nEventScript_NoPMCGameOver_Mom_7:\n\tmsgbox EventScript_NoPMCGameOver_Mom_Text_5\n\tnormalmsg\n\tcallnative TurnOffNoPMC\n\tcallnative ResetTintFilter\n\tgoto EventScript_AfterWhiteOutMomHeal\n\treturn\n\n\nEventScript_NoPMCGameOver_Loop_Mom::\n\tswitch VAR_TEMP_9\n\tcase 1, EventScript_NoPMCGameOver_Loop_Mom_2\n\tcase 2, EventScript_NoPMCGameOver_Loop_Mom_3\n\treturn\n\nEventScript_NoPMCGameOver_Loop_Mom_2:\n\tmsgbox EventScript_NoPMCGameOver_Mom_Text_4, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Loop_Mom_4\n\tsetvar VAR_TEMP_9, 2\n\tgoto EventScript_NoPMCGameOver_Loop_Mom\n\treturn\n\nEventScript_NoPMCGameOver_Loop_Mom_3:\n\tmsgbox EventScript_NoPMCGameOver_Mom_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Loop_Mom_7\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_NoPMCGameOver_Loop_Mom\n\treturn\n\nEventScript_NoPMCGameOver_Loop_Mom_4:\n\tmsgbox EventScript_NoPMCGameOver_Mom_Text_5\n\tnormalmsg\n\tcallnative TurnOffNoPMC\n\tcallnative ResetTintFilter\n\tgoto EventScript_AfterWhiteOutMomHeal\n\treturn\n\nEventScript_NoPMCGameOver_Loop_Mom_7:\n\tmsgbox EventScript_NoPMCGameOver_Mom_Text_2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Loop_Mom_10\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_NoPMCGameOver_Loop_Mom\n\treturn\n\nEventScript_NoPMCGameOver_Loop_Mom_10:\n\tmsgbox EventScript_NoPMCGameOver_Mom_Text_3\n\tcallnative DoSoftReset\n\treturn\n\nEventScript_NoPMCGameOver_Mom_Text_0:\n\t.string \"You have no more POKéMON that can\\nbattle in your POKéMON PC.\\pYou can either reset to the last\\ntime you saved, or turn off\\lNO FREE HEALS and heal your party.$\"\n\nEventScript_NoPMCGameOver_Mom_Text_1:\n\t.string \"Would you like to reset to the\\nlast save point?$\"\n\nEventScript_NoPMCGameOver_Mom_Text_2:\n\t.string \"Are you sure?\\pYou will lose all progress since\\nyou last saved.$\"\n\nEventScript_NoPMCGameOver_Mom_Text_3:\n\t.string \"The game will now reset.$\"\n\nEventScript_NoPMCGameOver_Mom_Text_4:\n\t.string \"Would you like to turn off\\nNO FREE HEALS and heal your party?$\"\n\nEventScript_NoPMCGameOver_Mom_Text_5:\n\t.string \"NO FREE HEALS has been turned off.$\"\n\nEventScript_NoPMCGameOver::\n\tlockall\n\ttextcolor 3\n\tsignmsg\n\tmsgbox EventScript_NoPMCGameOver_Text_0\n\tmsgbox EventScript_NoPMCGameOver_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_1\n\tmsgbox EventScript_NoPMCGameOver_Text_4, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_7\n\tsetvar VAR_TEMP_9, 2\n\tgoto EventScript_NoPMCGameOver_Loop\n\treturn\n\nEventScript_NoPMCGameOver_1:\n\tmsgbox EventScript_NoPMCGameOver_Text_2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_4\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_NoPMCGameOver_Loop\n\treturn\n\nEventScript_NoPMCGameOver_4:\n\tmsgbox EventScript_NoPMCGameOver_Text_3\n\tcallnative DoSoftReset\n\treturn\n\nEventScript_NoPMCGameOver_7:\n\tmsgbox EventScript_NoPMCGameOver_Text_5\n\tnormalmsg\n\tcallnative TurnOffNoPMC\n\tcallnative ResetTintFilter\n\tgoto EventScript_AfterWhiteOutHeal\n\treturn\n\n\nEventScript_NoPMCGameOver_Loop::\n\tswitch VAR_TEMP_9\n\tcase 1, EventScript_NoPMCGameOver_Loop_2\n\tcase 2, EventScript_NoPMCGameOver_Loop_3\n\treturn\n\nEventScript_NoPMCGameOver_Loop_2:\n\tmsgbox EventScript_NoPMCGameOver_Text_4, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Loop_4\n\tsetvar VAR_TEMP_9, 2\n\tgoto EventScript_NoPMCGameOver_Loop\n\treturn\n\nEventScript_NoPMCGameOver_Loop_3:\n\tmsgbox EventScript_NoPMCGameOver_Text_1, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Loop_7\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_NoPMCGameOver_Loop\n\treturn\n\nEventScript_NoPMCGameOver_Loop_4:\n\tmsgbox EventScript_NoPMCGameOver_Text_5\n\tnormalmsg\n\tcallnative TurnOffNoPMC\n\tcallnative ResetTintFilter\n\tgoto EventScript_AfterWhiteOutHeal\n\treturn\n\nEventScript_NoPMCGameOver_Loop_7:\n\tmsgbox EventScript_NoPMCGameOver_Text_2, MSGBOX_YESNO\n\tgoto_if_eq VAR_RESULT, YES, EventScript_NoPMCGameOver_Loop_10\n\tsetvar VAR_TEMP_9, 1\n\tgoto EventScript_NoPMCGameOver_Loop\n\treturn\n\nEventScript_NoPMCGameOver_Loop_10:\n\tmsgbox EventScript_NoPMCGameOver_Text_3\n\tcallnative DoSoftReset\n\treturn\n\nEventScript_NoPMCGameOver_Text_0:\n\t.string \"You have no more POKéMON that can\\nbattle in your POKéMON PC.\\pYou can either reset to the last\\ntime you saved, or turn off\\lNO FREE HEALS and heal your party.$\"\n\nEventScript_NoPMCGameOver_Text_1:\n\t.string \"Would you like to reset to the\\nlast save point?$\"\n\nEventScript_NoPMCGameOver_Text_2:\n\t.string \"Are you sure?\\pYou will lose all progress since\\nyou last saved.$\"\n\nEventScript_NoPMCGameOver_Text_3:\n\t.string \"The game will now reset.$\"\n\nEventScript_NoPMCGameOver_Text_4:\n\t.string \"Would you like to turn off\\nNO FREE HEALS and heal your party?$\"\n\nEventScript_NoPMCGameOver_Text_5:\n\t.string \"NO FREE HEALS has been turned off.$\"\n"
  },
  {
    "path": "data/sound_data.s",
    "content": "\t.section .rodata\n\n\t.include \"asm/macros/m4a.inc\"\n\t.include \"asm/macros/music_voice.inc\"\n\n\t.include \"sound/voice_groups.inc\"\n\t.include \"sound/keysplit_tables.inc\"\n\t.include \"sound/programmable_wave_data.inc\"\n\t.include \"sound/music_player_table.inc\"\n\t.include \"sound/song_table.inc\"\n\t.include \"sound/direct_sound_data.inc\"\n\n\t.align 2\n"
  },
  {
    "path": "data/specials.inc",
    "content": ".macro def_special ptr\n.global SPECIAL_\\ptr\n.set SPECIAL_\\ptr, __special__\n.set __special__, __special__ + 1\n\t.4byte \\ptr\n\t.endm\n\n.set __special__, 0\n\t.align 2\ngSpecials::\n\tdef_special HealPlayerParty\n\tdef_special SetCableClubWarp\n\tdef_special DoCableClubWarp\n\tdef_special ReturnFromLinkRoom\n\tdef_special CleanupLinkRoomState\n\tdef_special ExitLinkRoom\n\tdef_special NullFieldSpecial  @ Secret Base specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special TryBattleLinkup\n\tdef_special TryTradeLinkup\n\tdef_special TryRecordMixLinkup\n\tdef_special CloseLink\n\tdef_special EnterColosseumPlayerSpot\n\tdef_special EnterTradeSeat\n\tdef_special StartWiredCableClubTrade\n\tdef_special CableClub_AskSaveTheGame\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special SavePlayerParty\n\tdef_special LoadPlayerParty\n\tdef_special ChooseHalfPartyForBattle\n\tdef_special Script_ShowLinkTrainerCard\n\tdef_special NullFieldSpecial  @ Berry Tree specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special IsEnigmaBerryValid\n\tdef_special GetTrainerBattleMode\n\tdef_special ShowTrainerIntroSpeech\n\tdef_special ShowTrainerCantBattleSpeech\n\tdef_special Script_HasTrainerBeenFought\n\tdef_special EndTrainerApproach\n\tdef_special PlayTrainerEncounterMusic\n\tdef_special ShouldTryRematchBattle\n\tdef_special IsTrainerReadyForRematch\n\tdef_special StartRematchBattle\n\tdef_special ShowPokemonStorageSystemPC\n\tdef_special HasEnoughMonsForDoubleBattle\n\tdef_special NullFieldSpecial  @ Hoenn TV specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special HasLeadMonBeenRenamed\n\tdef_special NullFieldSpecial  @ Contest specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special TryContestLinkup\n\tdef_special Field_AskSaveTheGame\n\tdef_special DoWateringBerryTreeAnim\n\tdef_special ShowEasyChatScreen\n\tdef_special ShowEasyChatMessage\n\tdef_special NullFieldSpecial  @ Mauville Man specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special GetHeracrossSizeRecordInfo\n\tdef_special CompareHeracrossSize\n\tdef_special GetMagikarpSizeRecordInfo\n\tdef_special CompareMagikarpSize\n\tdef_special NameRaterWasNicknameChanged\n\tdef_special BufferMonNickname\n\tdef_special IsMonOTIDNotPlayers\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special BufferRandomHobbyOrLifestyleString\n\tdef_special NullFieldSpecial\n\tdef_special RegisteredItemHandleBikeSwap\n\tdef_special CalculatePlayerPartyCount\n\tdef_special CountPartyNonEggMons\n\tdef_special CountPartyAliveNonEggMons_IgnoreVar0x8004Slot\n\tdef_special NullFieldSpecial  @ Contest specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial  @ Mauville Gym specials\n\tdef_special NullFieldSpecial\n\tdef_special ShowFieldMessageStringVar4\n\tdef_special DrawWholeMapView\n\tdef_special GetPlayerXY\n\tdef_special SetMewAboveGrass\n\tdef_special DestroyMewEmergingGrassSprite\n\tdef_special NullFieldSpecial\n\tdef_special GetPlayerTrainerIdOnesDigit\n\tdef_special BufferBigGuyOrBigGirlString\n\tdef_special BufferSonOrDaughterString\n\tdef_special SetHiddenItemFlag\n\tdef_special NullFieldSpecial  @ Cable Car specials\n\tdef_special NullFieldSpecial\n\tdef_special Overworld_PlaySpecialMapMusic\n\tdef_special NullFieldSpecial  @ Wall Clock specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special StartOldManTutorialBattle\n\tdef_special ChangePokemonNickname\n\tdef_special ChoosePartyMon\n\tdef_special NullFieldSpecial  @ Berry Blender/Roulette specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special Script_IsFanClubMemberFanOfPlayer\n\tdef_special Script_GetNumFansOfPlayerInTrainerFanClub\n\tdef_special Script_BufferFanClubTrainerName\n\tdef_special Script_TryLoseFansFromPlayTimeAfterLinkBattle\n\tdef_special Script_TryLoseFansFromPlayTime\n\tdef_special Script_SetPlayerGotFirstFans\n\tdef_special Script_UpdateTrainerFanClubGameClear\n\tdef_special Script_TryGainNewFanFromCounter\n\tdef_special RockSmashWildEncounter\n\tdef_special NullFieldSpecial  @ Gabby and Ty specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special GetBattleOutcome\n\tdef_special GetDaycareMonNicknames\n\tdef_special GetDaycareState\n\tdef_special RejectEggFromDayCare\n\tdef_special GiveEggFromDaycare\n\tdef_special SetDaycareCompatibilityString\n\tdef_special GetSelectedMonNicknameAndSpecies\n\tdef_special StoreSelectedPokemonInDaycare\n\tdef_special ChooseSendDaycareMon\n\tdef_special ShowDaycareLevelMenu\n\tdef_special GetNumLevelsGainedFromDaycare\n\tdef_special GetDaycareCost\n\tdef_special TakePokemonFromDaycare\n\tdef_special ScriptHatchMon\n\tdef_special EggHatch\n\tdef_special DaycareMonReceivedMail\n\tdef_special ShowBattleRecords\n\tdef_special IsEnoughForCostInVar0x8005\n\tdef_special SubtractMoneyFromVar0x8005\n\tdef_special TryFieldPoisonWhiteOut\n\tdef_special SetCB2WhiteOut\n\tdef_special NullFieldSpecial  @ Rotating gate puzzle specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial  @ SS Tidal specials\n\tdef_special NullFieldSpecial\n\tdef_special EnterSafariMode\n\tdef_special ExitSafariMode\n\tdef_special NullFieldSpecial  @ Misc Hoenn specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special GetPokedexCount\n\tdef_special GetProfOaksRatingMessage\n\tdef_special AnimatePcTurnOn\n\tdef_special AnimatePcTurnOff\n\tdef_special GetElevatorFloor\n\tdef_special NullFieldSpecial  @ Lottery Corner specials\n\tdef_special NullFieldSpecial\n\tdef_special SelectMoveTutorMon\n\tdef_special SelectMoveDeleterMove\n\tdef_special MoveDeleterForgetMove\n\tdef_special BufferMoveDeleterNicknameAndMove\n\tdef_special GetNumMovesSelectedMonHas\n\tdef_special DisplayMoveTutorMenu\n\tdef_special NullFieldSpecial  @ Hoenn Cycling Road specials\n\tdef_special NullFieldSpecial\n\tdef_special GetPlayerAvatarBike\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special GetLeadMonFriendship\n\tdef_special BattleTowerMapScript2\n\tdef_special ChooseNextBattleTowerTrainer\n\tdef_special CheckPartyBattleTowerBanlist\n\tdef_special PrintBattleTowerTrainerGreeting\n\tdef_special BufferEReaderTrainerGreeting\n\tdef_special StartSpecialBattle\n\tdef_special SetBattleTowerProperty\n\tdef_special BattleTowerUtil\n\tdef_special SetBattleTowerParty\n\tdef_special SaveBattleTowerProgress\n\tdef_special BattleTower_SoftReset\n\tdef_special DetermineBattleTowerPrize\n\tdef_special GiveBattleTowerPrize\n\tdef_special AwardBattleTowerRibbons\n\tdef_special ChooseBattleTowerPlayerParty\n\tdef_special ValidateEReaderTrainer\n\tdef_special NullFieldSpecial\n\tdef_special ReducePlayerPartyToThree\n\tdef_special BedroomPC\n\tdef_special PlayerPC\n\tdef_special ShowTownMap\n\tdef_special GetInGameTradeSpeciesInfo\n\tdef_special CreateInGameTradePokemon\n\tdef_special DoInGameTradeScene\n\tdef_special GetTradeSpecies\n\tdef_special NullFieldSpecial  @ Misc Hoenn specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special CreatePCMenu\n\tdef_special HallOfFamePCBeginFade\n\tdef_special ShowDiploma\n\tdef_special NullFieldSpecial  @ Check lead mon Contest strength specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special LookThroughPorthole\n\tdef_special DoSoftReset\n\tdef_special EnterHallOfFame\n\tdef_special AnimateElevator\n\tdef_special NullFieldSpecial  @ ShowGlassWorkshopMenu\n\tdef_special SpawnCameraObject\n\tdef_special RemoveCameraObject\n\tdef_special NullFieldSpecial  @ Misc Hoenn specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special BufferEReaderTrainerName\n\tdef_special GetRandomSlotMachineId\n\tdef_special GetPlayerFacingDirection\n\tdef_special NullFieldSpecial  @ Abandoned Ship room key specials\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special LeadMonHasEffortRibbon\n\tdef_special GiveLeadMonEffortRibbon\n\tdef_special AreLeadMonEVsMaxedOut\n\tdef_special Script_FacePlayer\n\tdef_special Script_ClearHeldMovement\n\tdef_special InitRoamer\n\tdef_special NullFieldSpecial\n\tdef_special PlayerHasGrassPokemonInParty\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special IsStarterFirstStageInParty\n\tdef_special NullFieldSpecial\n\tdef_special IsThereRoomInAnyBoxForMorePokemon\n\tdef_special NullFieldSpecial\n\tdef_special DrawElevatorCurrentFloorWindow\n\tdef_special NullFieldSpecial\n\tdef_special IsPokerusInParty\n\tdef_special SetIcefallCaveCrackedIceMetatiles\n\tdef_special ShakeScreen\n\tdef_special StartGroudonKyogreBattle\n\tdef_special StartLegendaryBattle\n\tdef_special StartRegiBattle\n\tdef_special SetUpTrainerMovement\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special StartDroughtWeatherBlend\n\tdef_special DoDiveWarp\n\tdef_special DoFallWarp\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special SetEReaderTrainerGfxId\n\tdef_special StartSouthernIslandBattle\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special GetPartyMonSpecies\n\tdef_special IsSelectedMonEgg\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special LoadPlayerBag\n\tdef_special Script_FadeOutMapMusic\n\tdef_special NullFieldSpecial\n\tdef_special NullFieldSpecial\n\tdef_special HasAllKantoMons\n\tdef_special IsMonOTNameNotPlayers\n\tdef_special NullFieldSpecial\n\tdef_special Dummy_TryEnableBravoTrainerBattleTower\n\tdef_special DoesPartyHaveEnigmaBerry\n\tdef_special NullFieldSpecial\n\tdef_special SetPostgameFlags\n\tdef_special StartMarowakBattle\n\tdef_special ForcePlayerOntoBike\n\tdef_special ListMenu\n\tdef_special ReturnToListMenu\n\tdef_special DoPicboxCancel\n\tdef_special SetVermilionTrashCans\n\tdef_special SeafoamIslandsB4F_CurrentDumpsPlayerOnLand\n\tdef_special SampleResortGorgeousMonAndReward\n\tdef_special CheckAddCoins\n\tdef_special GetDaycarePokemonCount\n\tdef_special CloseElevatorCurrentFloorWindow\n\tdef_special ForcePlayerToStartSurfing\n\tdef_special GetStarterSpecies\n\tdef_special SetSeenMon\n\tdef_special VsSeekerResetObjectMovementAfterChargeComplete\n\tdef_special ShouldShowBoxWasFullMessage\n\tdef_special ChangeBoxPokemonNickname\n\tdef_special UpdateTrainerCardPhotoIcons\n\tdef_special StickerManGetBragFlags\n\tdef_special SetUsedPkmnCenterQuestLogEvent\n\tdef_special IsWirelessAdapterConnected\n\tdef_special TryBecomeLinkLeader\n\tdef_special TryJoinLinkGroup\n\tdef_special RunUnionRoom\n\tdef_special ShowWirelessCommunicationScreen\n\tdef_special EnableNationalPokedex\n\tdef_special SetWalkingIntoSignVars\n\tdef_special DisableMsgBoxWalkaway\n\tdef_special VsSeekerFreezeObjectsAfterChargeComplete\n\tdef_special SetFlavorTextFlagFromSpecialVars\n\tdef_special UpdatePickStateFromSpecialVar8005\n\tdef_special OverworldWhiteOutGetMoneyLoss\n\tdef_special PutMonInRoute5Daycare\n\tdef_special GetCostToWithdrawRoute5DaycareMon\n\tdef_special IsThereMonInRoute5Daycare\n\tdef_special GetNumLevelsGainedForRoute5DaycareMon\n\tdef_special TakePokemonFromRoute5Daycare\n\tdef_special DoSeagallopFerryScene\n\tdef_special DoesPlayerPartyContainSpecies\n\tdef_special Script_SetHelpContext\n\tdef_special BackupHelpContext\n\tdef_special RestoreHelpContext\n\tdef_special ValidateSavedWonderCard\n\tdef_special SetUnlockedPokedexFlags\n\tdef_special InitUnionRoom\n\tdef_special BufferUnionRoomPlayerName\n\tdef_special QuestLog_StartRecordingInputsAfterDeferredEvent\n\tdef_special GetMartClerkObjectId\n\tdef_special GetMysteryGiftCardStat\n\tdef_special GetQuestLogState\n\tdef_special QuestLog_CutRecording\n\tdef_special WonderNews_GetRewardInfo\n\tdef_special GetPCBoxToSendMon\n\tdef_special OpenMuseumFossilPic\n\tdef_special CloseMuseumFossilPic\n\tdef_special ChooseMonForMoveTutor\n\tdef_special ChooseMonForWirelessMinigame\n\tdef_special SetBattledTrainerFlag\n\tdef_special SetHelpContextForMap\n\tdef_special DoSSAnneDepartureCutscene\n\tdef_special IsPokemonJumpSpeciesInParty\n\tdef_special IsNationalPokedexEnabled\n\tdef_special CallTrainerTowerFunc\n\tdef_special ShowPokemonJumpRecords\n\tdef_special BufferTMHMMoveName\n\tdef_special DaisyMassageServices\n\tdef_special HelpSystem_Disable\n\tdef_special HelpSystem_Enable\n\tdef_special SetPostgameFlags\n\tdef_special HasAtLeastOneBerry\n\tdef_special DisplayBerryPowderVendorMenu\n\tdef_special RemoveBerryPowderVendorMenu\n\tdef_special Script_HasEnoughBerryPowder\n\tdef_special Script_TakeBerryPowder\n\tdef_special PrintPlayerBerryPowderAmount\n\tdef_special DoPokemonLeagueLightingEffect\n\tdef_special ShowBerryCrushRankings\n\tdef_special CapeBrinkGetMoveToTeachLeadPokemon\n\tdef_special HasLearnedAllMovesFromCapeBrinkTutor\n\tdef_special DoCredits\n\tdef_special ShowDodrioBerryPickingRecords\n\tdef_special DrawSeagallopDestinationMenu\n\tdef_special GetSelectedSeagallopDestination\n\tdef_special GetSeagallopNumber\n\tdef_special GetPlayerFacingDirection\n\tdef_special DoDeoxysTriangleInteraction\n\tdef_special SetDeoxysTrianglePalette\n\tdef_special IsPlayerLeftOfVermilionSailor\n\tdef_special IsBadEggInParty\n\tdef_special ReadTrainerTowerAndValidate\n\tdef_special HasAllMons\n\tdef_special IsPlayerNotInTrainerTowerLobby\n\tdef_special BrailleCursorToggle\n\tdef_special Script_ResetUnionRoomTrade\n\tdef_special PlayerPartyContainsSpeciesWithPlayerID\n\tdef_special AnimateTeleporterHousing\n\tdef_special IsDodrioInParty\n\tdef_special AnimateTeleporterCable\n\tdef_special InitElevatorFloorSelectMenuPos\n\tdef_special UpdateLoreleiDollCollection\n\tdef_special LoopWingFlapSound\n\tdef_special CreateEnemyEventMon\ngSpecialsEnd::\n"
  },
  {
    "path": "data/text/aide.inc",
    "content": "Aide_Text_HaventCaughtEnoughMonsForItem::\n\t.string \"Let's see…\\n\"\n\t.string \"Uh-oh! You have caught only\\l\"\n\t.string \"{STR_VAR_3} kinds of POKéMON!\\p\"\n\t.string \"You need {STR_VAR_1} kinds\\n\"\n\t.string \"if you want the {STR_VAR_2}.$\"\n\nAide_Text_GetEnoughMonsComeBackForItem::\n\t.string \"…Oh. I see.\\p\"\n\t.string \"When you get {STR_VAR_1} kinds of POKéMON,\\n\"\n\t.string \"come back for the {STR_VAR_2}.$\"\n\nAide_Text_DontHaveAnyRoomForItem::\n\t.string \"Oh! I see you don't have any\\n\"\n\t.string \"room for the {STR_VAR_2}.$\"\n"
  },
  {
    "path": "data/text/braille.inc",
    "content": "Braille_Text_Up::\n\t.braille \"UP$\"\n\nBraille_Text_Down::\n\t.braille \"DOWN$\"\n\nBraille_Text_Right::\n\t.braille \"RIGHT$\"\n\nBraille_Text_Left::\n\t.braille \"LEFT$\"\n\nBraille_Text_Cut::\n\t.braille \"CUT$\"\n\nBraille_Text_ABC::\n\t.braille \"ABC$\"\n\nBraille_Text_GHI::\n\t.braille \"GHI$\"\n\nBraille_Text_MNO::\n\t.braille \"MNO$\"\n\nBraille_Text_TUV::\n\t.braille \"TUV$\"\n\nBraille_Text_DEF::\n\t.braille \"DEF$\"\n\nBraille_Text_JKL::\n\t.braille \"JKL$\"\n\nBraille_Text_PQRS::\n\t.braille \"PQRS$\"\n\nBraille_Text_WXYZ::\n\t.braille \"WXYZ$\"\n\nBraille_Text_Period::\n\t.braille \".$\"\n\nBraille_Text_Comma::\n\t.braille \",$\"\n\nBraille_Text_Everything::\n\t.braille \"EVERYTHING$\"\n\nBraille_Text_HasMeaning1::\n\t.braille \"HAS MEANING$\"\n\nBraille_Text_Existence::\n\t.braille \"EXISTENCE$\"\n\nBraille_Text_HasMeaning2::\n\t.braille \"HAS MEANING$\"\n\nBraille_Text_BeingAlive::\n\t.braille \"BEING ALIVE$\"\n\nBraille_Text_HasMeaning3::\n\t.braille \"HAS MEANING$\"\n\nBraille_Text_HaveDreams::\n\t.braille \"HAVE DREAMS$\"\n\nBraille_Text_UsePower::\n\t.braille \"USE POWER.$\"\n\nBraille_Text_LetTheTwo::\n\t.braille \"LET THE TWO$\"\n\nBraille_Text_Glittering::\n\t.braille \"GLITTERING$\"\n\nBraille_Text_Stones::\n\t.braille \"STONES$\"\n\nBraille_Text_OneInRed::\n\t.braille \"ONE IN RED$\"\n\nBraille_Text_OneInBlue::\n\t.braille \"ONE IN BLUE$\"\n\nBraille_Text_ConnectThe::\n\t.braille \"CONNECT THE$\"\n\nBraille_Text_Past::\n\t.braille \"PAST.$\"\n\nBraille_Text_TwoFriends::\n\t.braille \"TWO FRIENDS$\"\n\nBraille_Text_Sharing::\n\t.braille \"SHARING$\"\n\nBraille_Text_PowerOpen::\n\t.braille \"POWER OPEN$\"\n\nBraille_Text_AWindowTo::\n\t.braille \"A WINDOW TO$\"\n\nBraille_Text_ANewWorld::\n\t.braille \"A NEW WORLD$\"\n\nBraille_Text_ThatGlows::\n\t.braille \"THAT GLOWS.$\"\n\nBraille_Text_TheNext::\n\t.braille \"THE NEXT$\"\n\nBraille_Text_WorldWaits::\n\t.braille \"WORLD WAITS$\"\n\nBraille_Text_ForYou::\n\t.braille \"FOR YOU.$\"\n"
  },
  {
    "path": "data/text/day_care.inc",
    "content": "@ Same as Hoenn's day-care text, used by the Four Island Day-Care. Unused text translated in Emerald\n\nDayCare_Text_ImDaycareManSpeakToMyWife::\n\t.string \"I'm the DAY-CARE MAN.\\p\"\n\t.string \"I help take care of the precious\\n\"\n\t.string \"POKéMON of TRAINERS.\\p\"\n\t.string \"If you'd like me to raise your\\n\"\n\t.string \"POKéMON, have a word with my wife.$\"\n\nDayCare_Text_DoYouWantEgg::\n\t.string \"Ah, it's you!\\p\"\n\t.string \"We were raising your POKéMON, and\\n\"\n\t.string \"my goodness, were we surprised!\\p\"\n\t.string \"Your POKéMON had an EGG!\\p\"\n\t.string \"We don't know how it got there,\\n\"\n\t.string \"but your POKéMON had it.\\p\"\n\t.string \"You do want it, yes?$\"\n\nDayCare_Text_YourMonIsDoingFine::\n\t.string \"Ah, it's you! Good to see you.\\n\"\n\t.string \"Your {STR_VAR_1}'s doing fine.$\"\n\nDayCare_Text_IllKeepIt::\n\t.string \"Well then, I'll keep it.\\n\"\n\t.string \"Thanks!$\"\n\nDayCare_Text_YouHaveNoRoomForIt::\n\t.string \"You have no room for it…\\n\"\n\t.string \"Come back when you've made room.$\"\n\nDayCare_Text_ReceivedEgg::\n\t.string \"{PLAYER} received the EGG from\\n\"\n\t.string \"the DAY-CARE MAN.$\"\n\nDayCare_Text_TakeGoodCareOfIt::\n\t.string \"Take good care of it.$\"\n\nDayCare_Text_YourMonsAreDoingFine::\n\t.string \"Ah, it's you! Your {STR_VAR_1} and\\n\"\n\t.string \"{STR_VAR_2} are doing fine.$\"\n\nDayCare_Text_IWillKeepDoYouWantIt::\n\t.string \"I really will keep it.\\n\"\n\t.string \"You do want this, yes?$\"\n\nDayCare_Text_WouldYouLikeUsToRaiseMon::\n\t.string \"I'm the DAY-CARE LADY.\\p\"\n\t.string \"We can raise POKéMON for you.\\p\"\n\t.string \"Would you like us to raise one?$\"\n\nDayCare_Text_WhichMonShouldWeRaise::\n\t.string \"Which POKéMON should we raise for\\n\"\n\t.string \"you?$\"\n\nDayCare_Text_WellRaiseYourMon::\n\t.string \"Fine, we'll raise your {STR_VAR_1}\\n\"\n\t.string \"for a while.\\p\"\n\t.string \"Come back for it later.$\"\n\nDayCare_Text_WeCanRaiseOneMore::\n\t.string \"We can raise two of your POKéMON.\\p\"\n\t.string \"Would you like us to raise one\\n\"\n\t.string \"more POKéMON for you?$\"\n\nDayCare_Text_HusbandWasLookingForYou::\n\t.string \"My husband was looking for you.$\"\n\nDayCare_Text_FineThenComeAgain::\n\t.string \"Oh, fine, then.\\n\"\n\t.string \"Come again.$\"\n\nDayCare_Text_NotEnoughMoney::\n\t.string \"You don't have enough money…$\"\n\nDayCare_Text_TakeOtherOneBackToo::\n\t.string \"Will you take back the other one,\\n\"\n\t.string \"too?$\"\n\nDayCare_Text_ComeAgain::\n\t.string \"Fine.\\n\"\n\t.string \"Come again.$\"\n\nDayCare_Text_GoodToSeeYou::\n\t.string \"Ah, it's you!\\n\"\n\t.string \"Good to see you.\\p\"\n\t.string \"Your POKéMON can only be doing\\n\"\n\t.string \"good!$\"\n\nDayCare_Text_YourMonHasGrownXLevels::\n\t.string \"By level, your {STR_VAR_1} has\\n\"\n\t.string \"grown by {STR_VAR_2}.$\"\n\nDayCare_Text_YourPartyIsFull::\n\t.string \"Your POKéMON party is full.\\n\"\n\t.string \"Make room, then come see me.$\"\n\nDayCare_Text_ItWillCostX::\n\t.string \"If you want your {STR_VAR_1} back,\\n\"\n\t.string \"it will cost ¥{STR_VAR_2}.$\"\n\nDayCare_Text_HeresYourMon::\n\t.string \"Perfect!\\n\"\n\t.string \"Here's your POKéMON.$\"\n\nDayCare_Text_TookBackMon::\n\t.string \"{PLAYER} took back {STR_VAR_2} from\\n\"\n\t.string \"the DAY-CARE LADY.$\"\n\nDayCare_Text_YouHaveJustOneMon::\n\t.string \"Oh? But you have just one\\n\"\n\t.string \"POKéMON.\\p\"\n\t.string \"Come back another time.$\"\n\nDayCare_Text_TakeYourMonBack::\n\t.string \"Will you take your POKéMON back?$\"\n\nDayCare_Text_WhatWillYouBattleWith::\n\t.string \"If you leave me that POKéMON,\\n\"\n\t.string \"what will you battle with?\\p\"\n\t.string \"Come back another time.$\"\n\nDayCare_Text_Huh::\n\t.string \"Huh?$\"\n"
  },
  {
    "path": "data/text/fame_checker.inc",
    "content": "gFameCheckerFlavorText_ProfOak0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}OAK POKéMON RESEARCH LAB$\"\n\ngFameCheckerFlavorText_ProfOak1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}To make a complete guide on all\\n\"\n\t.string \"the POKéMON in the world…\\p\"\n\t.string \"That was my dream!$\"\n\ngFameCheckerFlavorText_ProfOak2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}PROF. OAK may not look like much,\\n\"\n\t.string \"but he's the authority on POKéMON.\\p\"\n\t.string \"Many POKéMON TRAINERS hold him in\\n\"\n\t.string \"high regard.$\"\n\ngFameCheckerFlavorText_ProfOak3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}PROF. OAK reportedly lives with his\\n\"\n\t.string \"grandchildren, DAISY and {RIVAL}.$\"\n\ngFameCheckerFlavorText_ProfOak4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I hear OAK's taken a lot of\\n\"\n\t.string \"interest in you, child.\\p\"\n\t.string \"That old duff was once tough and\\n\"\n\t.string \"handsome.\\p\"\n\t.string \"But that was decades ago.\\n\"\n\t.string \"He's a shadow of his former self.$\"\n\ngFameCheckerFlavorText_ProfOak5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}PROF. OAK is going to have his own\\n\"\n\t.string \"radio show soon.\\p\"\n\t.string \"The program will be called PROF.\\n\"\n\t.string \"OAK'S POKéMON SEMINAR.$\"\n\ngFameCheckerFlavorText_Daisy0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}If you show DAISY your POKéMON,\\n\"\n\t.string \"she can tell how much it likes you.\\p\"\n\t.string \"Occasionally, she will even groom\\n\"\n\t.string \"a POKéMON for you.$\"\n\ngFameCheckerFlavorText_Daisy1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}But the person who is most liked by\\n\"\n\t.string \"POKéMON is DAISY, I think.$\"\n\ngFameCheckerFlavorText_Daisy2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}She was gently grooming POKéMON…\\n\"\n\t.string \"She was a little angel.\\p\"\n\t.string \"That little girl's name…\\n\"\n\t.string \"I think it was DAISY.$\"\n\ngFameCheckerFlavorText_Daisy3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}PROF. OAK reportedly lives with his\\n\"\n\t.string \"grandchildren, DAISY and {RIVAL}.$\"\n\ngFameCheckerFlavorText_Daisy4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}A girl from PALLET TOWN, DAISY,\\n\"\n\t.string \"she enjoys TEA every day.\\p\"\n\t.string \"She visits the CELADON DEPT. STORE\\n\"\n\t.string \"to buy some TEA.$\"\n\ngFameCheckerFlavorText_Daisy5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}The Spring POKéMON CONTEST's\\n\"\n\t.string \"Grand Champion is DAISY OAK of\\l\"\n\t.string \"PALLET TOWN!$\"\n\ngFameCheckerFlavorText_Brock0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}PEWTER CITY POKéMON GYM\\n\"\n\t.string \"LEADER: BROCK\\l\"\n\t.string \"The Rock-Solid POKéMON TRAINER!$\"\n\ngFameCheckerFlavorText_Brock1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}My rock-hard willpower is evident\\n\"\n\t.string \"in even my POKéMON.\\p\"\n\t.string \"My POKéMON are all rock hard and\\n\"\n\t.string \"have true-grit determination.\\p\"\n\t.string \"That's right - my POKéMON are all\\n\"\n\t.string \"the ROCK type!$\"\n\ngFameCheckerFlavorText_Brock2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}There aren't many serious POKéMON\\n\"\n\t.string \"TRAINERS here.\\p\"\n\t.string \"They're all like BUG CATCHERS,\\n\"\n\t.string \"you know, just hobbyists.\\p\"\n\t.string \"But PEWTER GYM's BROCK isn't like\\n\"\n\t.string \"that, not one bit.$\"\n\ngFameCheckerFlavorText_Brock3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BROCK is cool. He's not just tough.\\n\"\n\t.string \"People like and respect him.\\p\"\n\t.string \"I want to become a GYM LEADER\\n\"\n\t.string \"like him.$\"\n\ngFameCheckerFlavorText_Brock4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Hi, I'm excavating for fossils here\\n\"\n\t.string \"under MT. MOON.\\p\"\n\t.string \"Sometimes, BROCK of PEWTER GYM\\n\"\n\t.string \"lends me a hand.$\"\n\ngFameCheckerFlavorText_Brock5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BROCK rarely laughs, but is said to\\n\"\n\t.string \"be unable to stop if he starts.$\"\n\ngFameCheckerFlavorText_Misty0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}CERULEAN CITY POKéMON GYM\\n\"\n\t.string \"LEADER: MISTY\\l\"\n\t.string \"The Tomboyish Mermaid!$\"\n\ngFameCheckerFlavorText_Misty1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}My policy is an all-out offensive\\n\"\n\t.string \"with WATER-type POKéMON!$\"\n\ngFameCheckerFlavorText_Misty2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}MISTY is a TRAINER who's going to\\n\"\n\t.string \"keep improving.\\p\"\n\t.string \"She won't lose to someone like you!$\"\n\ngFameCheckerFlavorText_Misty3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Strong TRAINERS and WATER POKéMON\\n\"\n\t.string \"are common sights in these parts.\\p\"\n\t.string \"They say that MISTY of the\\n\"\n\t.string \"CERULEAN GYM trains here.$\"\n\ngFameCheckerFlavorText_Misty4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}This cape is a famous date spot.\\p\"\n\t.string \"MISTY, the GYM LEADER, has high\\n\"\n\t.string \"hopes about this place.$\"\n\ngFameCheckerFlavorText_Misty5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}MISTY is said to worship LORELEI\\n\"\n\t.string \"of the ELITE FOUR.$\"\n\ngFameCheckerFlavorText_LtSurge0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}VERMILION CITY POKéMON GYM\\n\"\n\t.string \"LEADER: LT. SURGE\\l\"\n\t.string \"The Lightning American!$\"\n\ngFameCheckerFlavorText_LtSurge1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I tell you, kid, electric POKéMON\\n\"\n\t.string \"saved me during the war!$\"\n\ngFameCheckerFlavorText_LtSurge2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}When I was in the Army, LT. SURGE\\n\"\n\t.string \"was my strict CO.\\p\"\n\t.string \"He was a hard taskmaster.$\"\n\ngFameCheckerFlavorText_LtSurge3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}LT. SURGE was always famous for\\n\"\n\t.string \"his cautious nature in the Army.$\"\n\ngFameCheckerFlavorText_LtSurge4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}LT. SURGE installed the traps in\\n\"\n\t.string \"the GYM himself.\\p\"\n\t.string \"He set up double locks everywhere.$\"\n\ngFameCheckerFlavorText_LtSurge5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}LT. SURGE is rumored to have been\\n\"\n\t.string \"a pilot while home in America.\\p\"\n\t.string \"He used the electricity generated\\n\"\n\t.string \"by POKéMON to power his plane.$\"\n\ngFameCheckerFlavorText_Erika0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}CELADON CITY POKéMON GYM\\n\"\n\t.string \"LEADER: ERIKA\\l\"\n\t.string \"The Nature-Loving Princess!$\"\n\ngFameCheckerFlavorText_Erika1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I am a student of the art of\\n\"\n\t.string \"flower arranging.\\p\"\n\t.string \"My POKéMON are solely of the\\n\"\n\t.string \"GRASS type.$\"\n\ngFameCheckerFlavorText_Erika2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Our LEADER ERIKA might be quiet,\\n\"\n\t.string \"but she's famous around here.$\"\n\ngFameCheckerFlavorText_Erika3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}We only use GRASS-type POKéMON at\\n\"\n\t.string \"our GYM.\\p\"\n\t.string \"Why? We also use them for making\\n\"\n\t.string \"flower arrangements!$\"\n\ngFameCheckerFlavorText_Erika4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I would never collect POKéMON if\\n\"\n\t.string \"they were unattractive.$\"\n\ngFameCheckerFlavorText_Erika5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Rumor has it that if you peek into\\n\"\n\t.string \"CELADON GYM, you can often\\l\"\n\t.string \"see ERIKA snoozing.$\"\n\ngFameCheckerFlavorText_Koga0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}FUCHSIA CITY POKéMON GYM\\n\"\n\t.string \"LEADER: KOGA\\l\"\n\t.string \"The Poisonous Ninja Master$\"\n\ngFameCheckerFlavorText_Koga1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Despair to the creeping horror of\\n\"\n\t.string \"POISON-type POKéMON!$\"\n\ngFameCheckerFlavorText_Koga2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Even though I've lost, I will keep\\n\"\n\t.string \"training according to the teachings\\l\"\n\t.string \"of KOGA, my ninja master.$\"\n\ngFameCheckerFlavorText_Koga3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}My father is the GYM LEADER of\\n\"\n\t.string \"this town.\\p\"\n\t.string \"I'm training to use POISON POKéMON\\n\"\n\t.string \"as well as my father.$\"\n\ngFameCheckerFlavorText_Koga4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}KOGA is said to have a thorough\\n\"\n\t.string \"knowledge of medicine.\\p\"\n\t.string \"He even concocts medicine to nurse\\n\"\n\t.string \"his POKéMON to health.$\"\n\ngFameCheckerFlavorText_Koga5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}The SAFARI ZONE's huge, wouldn't\\n\"\n\t.string \"you say?\\p\"\n\t.string \"FUCHSIA's GYM LEADER, KOGA, \\n\"\n\t.string \"patrols the grounds every so often.\\p\"\n\t.string \"Thanks to him, we can play here\\n\"\n\t.string \"knowing that we're safe.$\"\n\ngFameCheckerFlavorText_Sabrina0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}SAFFRON CITY POKéMON GYM\\n\"\n\t.string \"LEADER: SABRINA\\l\"\n\t.string \"The Master of PSYCHIC POKéMON!$\"\n\ngFameCheckerFlavorText_Sabrina1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}You know about a girl GYM LEADER\\n\"\n\t.string \"in SAFFRON CITY?\\p\"\n\t.string \"She uses PSYCHIC-type POKéMON,\\n\"\n\t.string \"right?$\"\n\ngFameCheckerFlavorText_Sabrina2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I have had psychic powers since\\n\"\n\t.string \"I was a child.\\p\"\n\t.string \"It started when a spoon I\\n\"\n\t.string \"carelessly tossed, bent.$\"\n\ngFameCheckerFlavorText_Sabrina3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I dislike battling, but if you wish,\\n\"\n\t.string \"I will show you my powers!$\"\n\ngFameCheckerFlavorText_Sabrina4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}People say that SABRINA can\\n\"\n\t.string \"communicate with her POKéMON\\l\"\n\t.string \"during battle without speaking.$\"\n\ngFameCheckerFlavorText_Sabrina5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}SABRINA just wiped out the KARATE\\n\"\n\t.string \"MASTER next door.$\"\n\ngFameCheckerFlavorText_Blaine0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}CINNABAR ISLAND POKéMON GYM\\n\"\n\t.string \"LEADER: BLAINE\\l\"\n\t.string \"The Hotheaded Quiz Master!$\"\n\ngFameCheckerFlavorText_Blaine1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}My fiery POKéMON are all rough\\n\"\n\t.string \"and ready with intense heat!\\p\"\n\t.string \"They incinerate all challengers!$\"\n\ngFameCheckerFlavorText_Blaine2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Our LEADER, BLAINE, became lost\\n\"\n\t.string \"in the mountains but good.\\p\"\n\t.string \"Night fell when a fiery bird\\n\"\n\t.string \"POKéMON appeared.\\p\"\n\t.string \"Its light allowed BLAINE to find\\n\"\n\t.string \"his way down safely.$\"\n\ngFameCheckerFlavorText_Blaine3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}CINNABAR GYM's BLAINE is quite the\\n\"\n\t.string \"odd fellow.\\p\"\n\t.string \"He's lived on the island since way\\n\"\n\t.string \"before the LAB was built.$\"\n\ngFameCheckerFlavorText_Blaine4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}It's a photo of BLAINE and\\n\"\n\t.string \"MR. FUJI.\\p\"\n\t.string \"They're standing shoulder to\\n\"\n\t.string \"shoulder with big grins.$\"\n\ngFameCheckerFlavorText_Blaine5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BLAINE is said to remove his dark\\n\"\n\t.string \"shades only when he is thinking up\\l\"\n\t.string \"new quiz questions.$\"\n\ngFameCheckerFlavorText_Lorelei0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I am LORELEI of the ELITE FOUR.$\"\n\ngFameCheckerFlavorText_Lorelei1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}No one can best me when it comes\\n\"\n\t.string \"to icy POKéMON.$\"\n\ngFameCheckerFlavorText_Lorelei2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Where was this person born?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}We've had a great and powerful\\n\"\n\t.string \"TRAINER grow up on this island.\\p\"\n\t.string \"I bet even you'd know her.\\n\"\n\t.string \"It's LORELEI of the ELITE FOUR!$\"\n\ngFameCheckerFlavorText_Lorelei3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Known for her logical, calculated,\\n\"\n\t.string \"and cool battling style, LORELEI\\l\"\n\t.string \"has a surprising secret!$\"\n\ngFameCheckerFlavorText_Lorelei4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Did you know that LORELEI has lots\\n\"\n\t.string \"and lots of stuffed dolls?\\p\"\n\t.string \"Every time she comes back to\\n\"\n\t.string \"FOUR ISLAND, her collection grows!$\"\n\ngFameCheckerFlavorText_Lorelei5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}The LAPRAS she has, I imagine it\\n\"\n\t.string \"to be the one she met as a child.\\p\"\n\t.string \"I believe it was in ICEFALL CAVE\\n\"\n\t.string \"that she caught it.\\p\"\n\t.string \"Perhaps that POKéMON has been with\\n\"\n\t.string \"her ever since.$\"\n\ngFameCheckerFlavorText_Bruno0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I am BRUNO of the ELITE FOUR!$\"\n\ngFameCheckerFlavorText_Bruno1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I've lived and trained with my\\n\"\n\t.string \"fighting POKéMON!$\"\n\ngFameCheckerFlavorText_Bruno2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BRUNO apparently joined the ELITE\\n\"\n\t.string \"FOUR out of his burning ambition to\\l\"\n\t.string \"battle the best TRAINERS.$\"\n\ngFameCheckerFlavorText_Bruno3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BRUNO, who's a senior ahead of me,\\n\"\n\t.string \"visits the SPA on occasion.\\p\"\n\t.string \"He comes to rehab injuries, both\\n\"\n\t.string \"his own and his POKéMON's.$\"\n\ngFameCheckerFlavorText_Bruno4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}He's one of the ELITE FOUR.\\n\"\n\t.string \"His name is BRUNO.\\p\"\n\t.string \"He went away disappointed when he\\n\"\n\t.string \"found out that they were all sold\\l\"\n\t.string \"out of Rage Candybars.$\"\n\ngFameCheckerFlavorText_Bruno5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Even BRUNO…\\n\"\n\t.string \"He trained with a fellow by the\\l\"\n\t.string \"name of BRAWLY before.$\"\n\ngFameCheckerFlavorText_Agatha0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I am AGATHA of the ELITE FOUR.$\"\n\ngFameCheckerFlavorText_Agatha1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}AGATHA's GHOST-type POKéMON are\\n\"\n\t.string \"horrifically terrifying in toughness.$\"\n\ngFameCheckerFlavorText_Agatha2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}That old lady's also got a really\\n\"\n\t.string \"short fuse, too.\\p\"\n\t.string \"It doesn't take anything to get\\n\"\n\t.string \"that scary lady hollering.$\"\n\ngFameCheckerFlavorText_Agatha3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}In her youth, AGATHA and PROF.\\n\"\n\t.string \"OAK were rivals who vied for\\l\"\n\t.string \"supremacy as TRAINERS.$\"\n\ngFameCheckerFlavorText_Agatha4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I hear OAK's taken a lot of\\n\"\n\t.string \"interest in you, child.\\p\"\n\t.string \"That old duff was once tough and\\n\"\n\t.string \"handsome.\\p\"\n\t.string \"But that was decades ago.\\n\"\n\t.string \"He's a shadow of his former self.$\"\n\ngFameCheckerFlavorText_Agatha5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Take AGATHA, for example.\\p\"\n\t.string \"She set a record for being the\\n\"\n\t.string \"oldest-ever ELITE FOUR member.$\"\n\ngFameCheckerFlavorText_Lance0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I lead the ELITE FOUR.\\p\"\n\t.string \"You can call me LANCE the dragon\\n\"\n\t.string \"TRAINER.$\"\n\ngFameCheckerFlavorText_Lance1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}You know that dragons are\\n\"\n\t.string \"mythical POKéMON.\\p\"\n\t.string \"They're hard to catch and raise,\\n\"\n\t.string \"but their powers are superior.\\p\"\n\t.string \"They're virtually indestructible.\\n\"\n\t.string \"There's no being clever with them.$\"\n\ngFameCheckerFlavorText_Lance2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}He stands for justice!\\n\"\n\t.string \"He's cool, and yet passionate!\\l\"\n\t.string \"He's the greatest, LANCE!$\"\n\ngFameCheckerFlavorText_Lance3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}We have a customer, LANCE, who\\n\"\n\t.string \"occasionally comes.\\p\"\n\t.string \"He always buys capes.\\p\"\n\t.string \"I wonder… Does he have many\\n\"\n\t.string \"identical capes at home?$\"\n\ngFameCheckerFlavorText_Lance4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}LANCE's grandfather is thought to\\n\"\n\t.string \"be the elder of a famous clan of\\l\"\n\t.string \"dragon masters.$\"\n\ngFameCheckerFlavorText_Lance5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}From what I've heard, LANCE has\\n\"\n\t.string \"a cousin who's a GYM LEADER\\l\"\n\t.string \"somewhere far away.$\"\n\ngFameCheckerFlavorText_Bill0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}After all, BILL's world-famous as a\\n\"\n\t.string \"POKéMANIAC.\\p\"\n\t.string \"He invented the POKéMON Storage\\n\"\n\t.string \"System on PC, too.$\"\n\ngFameCheckerFlavorText_Bill1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BILL has lots of POKéMON!\\n\"\n\t.string \"He collects rare ones, too!$\"\n\ngFameCheckerFlavorText_Bill2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}He's my grandson!\\p\"\n\t.string \"He always liked collecting things,\\n\"\n\t.string \"even as a child!$\"\n\ngFameCheckerFlavorText_Bill3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BILL is a POKéMANIAC, so he loves\\n\"\n\t.string \"every kind.\\p\"\n\t.string \"Apparently, the first one he caught\\n\"\n\t.string \"was an ABRA.$\"\n\ngFameCheckerFlavorText_Bill4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BILL's hometown is GOLDENROD CITY,\\n\"\n\t.string \"where his folks still live.\\p\"\n\t.string \"I've heard that it's quite the\\n\"\n\t.string \"festive, bustling city.$\"\n\ngFameCheckerFlavorText_Bill5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Apparently, BILL simply can't\\n\"\n\t.string \"stomach milk at all.$\"\n\ngFameCheckerFlavorText_MrFuji0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}He's really kind.\\p\"\n\t.string \"He looks after abandoned and\\n\"\n\t.string \"orphaned POKéMON.$\"\n\ngFameCheckerFlavorText_MrFuji1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}This old guy marched right up to\\n\"\n\t.string \"our HIDEOUT.\\p\"\n\t.string \"Then, he starts ranting about how\\n\"\n\t.string \"TEAM ROCKET's abusing POKéMON.\\p\"\n\t.string \"So, we're just talking it over as\\n\"\n\t.string \"adults.$\"\n\ngFameCheckerFlavorText_MrFuji2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}POKéMON FAN MAGAZINE\\n\"\n\t.string \"Monthly Grand Prize Drawing!\\p\"\n\t.string \"The application form is…\\p\"\n\t.string \"Gone! It's been clipped out.\\n\"\n\t.string \"Someone must have applied already.$\"\n\ngFameCheckerFlavorText_MrFuji3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}There's a rumor…\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I hear that MR. FUJI's not from\\n\"\n\t.string \"these parts originally, either.$\"\n\ngFameCheckerFlavorText_MrFuji4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}It's a photo of BLAINE and\\n\"\n\t.string \"MR. FUJI.\\p\"\n\t.string \"They're standing shoulder to\\n\"\n\t.string \"shoulder with big grins.$\"\n\ngFameCheckerFlavorText_MrFuji5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Editor: The shy MR. FUJI turned\\n\"\n\t.string \"down our interview requests.\\p\"\n\t.string \"He is a kindly man who is adored\\n\"\n\t.string \"and respected in LAVENDER TOWN.$\"\n\ngFameCheckerFlavorText_Giovanni0::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}TEAM ROCKET captures POKéMON from\\n\"\n\t.string \"around the world.\\p\"\n\t.string \"They're important tools for keeping\\n\"\n\t.string \"our criminal enterprise going.\\p\"\n\t.string \"I am the leader, GIOVANNI!$\"\n\ngFameCheckerFlavorText_Giovanni1::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Favorite kind of POKéMON?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Those thugs that took over our\\n\"\n\t.string \"building…\\p\"\n\t.string \"Their BOSS said he was looking for\\n\"\n\t.string \"strong POKéMON.$\"\n\ngFameCheckerFlavorText_Giovanni2::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What is this person like?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}TEAM ROCKET's BOSS is terribly\\n\"\n\t.string \"cruel!\\p\"\n\t.string \"To him, POKéMON are just tools to\\n\"\n\t.string \"be used.$\"\n\ngFameCheckerFlavorText_Giovanni3::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Welcome to my hideout!\\p\"\n\t.string \"It shall be so until I can restore\\n\"\n\t.string \"TEAM ROCKET to its former glory.$\"\n\ngFameCheckerFlavorText_Giovanni4::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}What does this person do?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Blow me away! GIOVANNI was the\\n\"\n\t.string \"GYM LEADER of VIRIDIAN?$\"\n\ngFameCheckerFlavorText_Giovanni5::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}Family and friends?\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}You… You're not GIOVANNI's kid,\\n\"\n\t.string \"are you?\\p\"\n\t.string \"No, that can't be right.\\n\"\n\t.string \"GIOVANNI's kid has red hair.$\"\n\n\ngFameCheckerPersonName_ProfOak::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}PROF. OAK$\"\n\ngFameCheckerPersonQuote_ProfOak::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: PROF. OAK\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Why do POKéMON compete and battle\\n\"\n\t.string \"so hard for you?\\p\"\n\t.string \"They do so because they can see\\n\"\n\t.string \"the love and trust you have\\l\"\n\t.string \"towards POKéMON.\\p\"\n\t.string \"Never forget that.$\"\n\ngFameCheckerPersonName_Daisy::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}DAISY$\"\n\ngFameCheckerPersonQuote_Daisy::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: DAISY\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}While I was comfortably enjoying\\n\"\n\t.string \"my tea breaks, you've grown very\\l\"\n\t.string \"skilled and powerful.\\p\"\n\t.string \"I hope you'll remain a good rival\\n\"\n\t.string \"to my little brother.$\"\n\ngFameCheckerPersonName_Brock::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}BROCK$\"\n\ngFameCheckerPersonQuote_Brock::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: BROCK\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}In this big world of ours, there\\n\"\n\t.string \"must be many tough TRAINERS.\\p\"\n\t.string \"Let's both keep training and\\n\"\n\t.string \"making ourselves stronger!$\"\n\ngFameCheckerPersonName_Misty::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}MISTY$\"\n\ngFameCheckerPersonQuote_Misty::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: MISTY\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I'm going to keep training here at\\n\"\n\t.string \"this GYM.\\p\"\n\t.string \"When I get better, I'd love to hit\\n\"\n\t.string \"the road and travel.$\"\n\ngFameCheckerPersonName_LtSurge::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}LT. SURGE$\"\n\ngFameCheckerPersonQuote_LtSurge::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: LT. SURGE\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Hey, kid!\\n\"\n\t.string \"You electrified me in our battle!\\p\"\n\t.string \"I didn't know that there were\\n\"\n\t.string \"gutsy TRAINERS like you.\\p\"\n\t.string \"It made me change my mind about\\n\"\n\t.string \"you!$\"\n\ngFameCheckerPersonName_Erika::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}ERIKA$\"\n\ngFameCheckerPersonQuote_Erika::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: ERIKA\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I am so glad that there are strong\\n\"\n\t.string \"TRAINERS like you.\\p\"\n\t.string \"That awareness alone inspires and\\n\"\n\t.string \"motivates me to try harder.\\p\"\n\t.string \"Please visit me again.\\n\"\n\t.string \"Zzz…$\"\n\ngFameCheckerPersonName_Koga::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}KOGA$\"\n\ngFameCheckerPersonQuote_Koga::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: KOGA\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}You and I, we must both set our\\n\"\n\t.string \"sights higher and work towards\\l\"\n\t.string \"meeting our challenges.\\p\"\n\t.string \"Now, I must go train my daughter.$\"\n\ngFameCheckerPersonName_Sabrina::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}SABRINA$\"\n\ngFameCheckerPersonQuote_Sabrina::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: SABRINA\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}The love you have towards your\\n\"\n\t.string \"POKéMON…\\p\"\n\t.string \"It was a power that was never\\n\"\n\t.string \"bested by my psychic power.$\"\n\ngFameCheckerPersonName_Blaine::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}BLAINE$\"\n\ngFameCheckerPersonQuote_Blaine::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: BLAINE\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}My fire POKéMON!\\n\"\n\t.string \"They'll become even more powerful!\\p\"\n\t.string \"And now, a quiz. How many kinds of\\n\"\n\t.string \"FIRE-type POKéMON are there?$\"\n\ngFameCheckerPersonName_Lorelei::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}LORELEI$\"\n\ngFameCheckerPersonQuote_Lorelei::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: LORELEI\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I needed to thank you for your\\n\"\n\t.string \"help.\\p\"\n\t.string \"But that has nothing to do with our\\n\"\n\t.string \"battles.\\p\"\n\t.string \"You'd better watch out next time!$\"\n\ngFameCheckerPersonName_Bruno::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}BRUNO$\"\n\ngFameCheckerPersonQuote_Bruno::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: BRUNO\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}The super power of your POKéMON\\n\"\n\t.string \"and you I've experienced myself.\\p\"\n\t.string \"Next time, maybe I should show you\\n\"\n\t.string \"how to train yourself.$\"\n\ngFameCheckerPersonName_Agatha::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}AGATHA$\"\n\ngFameCheckerPersonQuote_Agatha::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: AGATHA\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_FEMALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}When you grow older, don't you\\n\"\n\t.string \"dare go soft like that coot OAK!\\p\"\n\t.string \"Be like me and keep battling on!$\"\n\ngFameCheckerPersonName_Lance::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}LANCE$\"\n\ngFameCheckerPersonQuote_Lance::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: LANCE\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}I'm considering going back to my\\n\"\n\t.string \"hometown.\\p\"\n\t.string \"I want to retrain my DRAGON-type\\n\"\n\t.string \"POKéMON and strengthen them.\\p\"\n\t.string \"I'd like to invite you to my\\n\"\n\t.string \"hometown one day.$\"\n\ngFameCheckerPersonName_Bill::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}BILL$\"\n\ngFameCheckerPersonQuote_Bill::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: BILL\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Hey, there! CELIO had nothing but\\n\"\n\t.string \"praise for you.\\p\"\n\t.string \"Hearing that makes me happy.\\p\"\n\t.string \"When you catch some rare POKéMON,\\n\"\n\t.string \"come show me, okay? Promise!$\"\n\ngFameCheckerPersonName_MrFuji::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}MR. FUJI$\"\n\ngFameCheckerPersonQuote_MrFuji::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: MR. FUJI\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}Instead of hoping for the happiness\\n\"\n\t.string \"of just your POKéMON…\\p\"\n\t.string \"…Can I get you to wish for the\\n\"\n\t.string \"happiness of all POKéMON?$\"\n\ngFameCheckerPersonName_Giovanni::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}GIOVANNI$\"\n\ngFameCheckerPersonQuote_Giovanni::\n\t.string \"{COLOR BLUE}{SHADOW LIGHT_BLUE}From: GIOVANNI\\n\"\n\t.string \"To: {PLAYER}\\p\"\n\t.string \"{FONT_MALE}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}There is nothing that I wish to say\\n\"\n\t.string \"to you.\\p\"\n\t.string \"I will concentrate solely on\\n\"\n\t.string \"bettering myself, and none other.$\"\n\ngFameCheckerFlavorTextOriginLocation_ProfOak0::\n\t.string \"PALLET TOWN$\"\n\ngFameCheckerFlavorTextOriginLocation_ProfOak1::\n\t.string \"RESEARCH LAB$\"\n\ngFameCheckerFlavorTextOriginLocation_ProfOak2::\n\t.string \"RESEARCH LAB$\"\n\ngFameCheckerFlavorTextOriginLocation_ProfOak3::\n\t.string \"VIRIDIAN CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_ProfOak4::\n\t.string \"POKéMON LEAGUE$\"\n\ngFameCheckerFlavorTextOriginLocation_ProfOak5::\n\t.string \"RESEARCH LAB$\"\n\ngFameCheckerFlavorTextOriginLocation_Daisy0::\n\t.string \"RESEARCH LAB$\"\n\ngFameCheckerFlavorTextOriginLocation_Daisy1::\n\t.string \"VERMILION CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Daisy2::\n\t.string \"WATER LABYRINTH$\"\n\ngFameCheckerFlavorTextOriginLocation_Daisy3::\n\t.string \"VIRIDIAN CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Daisy4::\n\t.string \"CELADON MANSION$\"\n\ngFameCheckerFlavorTextOriginLocation_Daisy5::\n\t.string \"FOUR ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Brock0::\n\t.string \"PEWTER CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Brock1::\n\t.string \"PEWTER GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Brock2::\n\t.string \"PEWTER CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Brock3::\n\t.string \"ROUTE 4$\"\n\ngFameCheckerFlavorTextOriginLocation_Brock4::\n\t.string \"MT. MOON$\"\n\ngFameCheckerFlavorTextOriginLocation_Brock5::\n\t.string \"PEWTER MUSEUM$\"\n\ngFameCheckerFlavorTextOriginLocation_Misty0::\n\t.string \"CERULEAN CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Misty1::\n\t.string \"CERULEAN GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Misty2::\n\t.string \"CERULEAN GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Misty3::\n\t.string \"SEAFOAM ISLANDS$\"\n\ngFameCheckerFlavorTextOriginLocation_Misty4::\n\t.string \"CERULEAN CAPE$\"\n\ngFameCheckerFlavorTextOriginLocation_Misty5::\n\t.string \"CERULEAN CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_LtSurge0::\n\t.string \"VERMILION CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_LtSurge1::\n\t.string \"VERMILION GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_LtSurge2::\n\t.string \"VERMILION GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_LtSurge3::\n\t.string \"VERMILION GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_LtSurge4::\n\t.string \"VERMILION GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_LtSurge5::\n\t.string \"VERMILION CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Erika0::\n\t.string \"CELADON CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Erika1::\n\t.string \"CELADON GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Erika2::\n\t.string \"CELADON GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Erika3::\n\t.string \"CELADON GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Erika4::\n\t.string \"CELADON GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Erika5::\n\t.string \"CELADON MANSION$\"\n\ngFameCheckerFlavorTextOriginLocation_Koga0::\n\t.string \"FUCHSIA CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Koga1::\n\t.string \"FUCHSIA GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Koga2::\n\t.string \"FUCHSIA GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Koga3::\n\t.string \"FUCHSIA CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Koga4::\n\t.string \"FUCHSIA CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Koga5::\n\t.string \"SAFARI ZONE$\"\n\ngFameCheckerFlavorTextOriginLocation_Sabrina0::\n\t.string \"SAFFRON CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Sabrina1::\n\t.string \"THREE ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Sabrina2::\n\t.string \"SAFFRON GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Sabrina3::\n\t.string \"SAFFRON GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Sabrina4::\n\t.string \"SAFFRON CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Sabrina5::\n\t.string \"SAFFRON GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Blaine0::\n\t.string \"CINNABAR ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Blaine1::\n\t.string \"CINNABAR GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Blaine2::\n\t.string \"CINNABAR GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Blaine3::\n\t.string \"CINNABAR ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Blaine4::\n\t.string \"CINNABAR GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Blaine5::\n\t.string \"RESORT GORGEOUS$\"\n\ngFameCheckerFlavorTextOriginLocation_Lorelei0::\n\t.string \"POKéMON LEAGUE$\"\n\ngFameCheckerFlavorTextOriginLocation_Lorelei1::\n\t.string \"POKéMON LEAGUE$\"\n\ngFameCheckerFlavorTextOriginLocation_Lorelei2::\n\t.string \"FOUR ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Lorelei3::\n\t.string \"FIVE ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Lorelei4::\n\t.string \"FOUR ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Lorelei5::\n\t.string \"FOUR ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Bruno0::\n\t.string \"POKéMON LEAGUE$\"\n\ngFameCheckerFlavorTextOriginLocation_Bruno1::\n\t.string \"POKéMON LEAGUE$\"\n\ngFameCheckerFlavorTextOriginLocation_Bruno2::\n\t.string \"SAFFRON CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Bruno3::\n\t.string \"EMBER SPA$\"\n\ngFameCheckerFlavorTextOriginLocation_Bruno4::\n\t.string \"TWO ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Bruno5::\n\t.string \"SEVAULT CANYON$\"\n\ngFameCheckerFlavorTextOriginLocation_Agatha0::\n\t.string \"POKéMON LEAGUE$\"\n\ngFameCheckerFlavorTextOriginLocation_Agatha1::\n\t.string \"INDIGO PLATEAU$\"\n\ngFameCheckerFlavorTextOriginLocation_Agatha2::\n\t.string \"INDIGO PLATEAU$\"\n\ngFameCheckerFlavorTextOriginLocation_Agatha3::\n\t.string \"SEVEN ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Agatha4::\n\t.string \"POKéMON LEAGUE$\"\n\ngFameCheckerFlavorTextOriginLocation_Agatha5::\n\t.string \"SIX ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Lance0::\n\t.string \"POKéMON LEAGUE$\"\n\ngFameCheckerFlavorTextOriginLocation_Lance1::\n\t.string \"POKéMON LEAGUE$\"\n\ngFameCheckerFlavorTextOriginLocation_Lance2::\n\t.string \"SAFFRON CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Lance3::\n\t.string \"CELADON DEPT.$\"\n\ngFameCheckerFlavorTextOriginLocation_Lance4::\n\t.string \"INDIGO PLATEAU$\"\n\ngFameCheckerFlavorTextOriginLocation_Lance5::\n\t.string \"INDIGO PLATEAU$\"\n\ngFameCheckerFlavorTextOriginLocation_Bill0::\n\t.string \"CERULEAN CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Bill1::\n\t.string \"CERULEAN CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Bill2::\n\t.string \"FUCHSIA CITY$\"\n\ngFameCheckerFlavorTextOriginLocation_Bill3::\n\t.string \"ONE ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Bill4::\n\t.string \"ONE ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Bill5::\n\t.string \"ONE ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_MrFuji0::\n\t.string \"LAVENDER TOWN$\"\n\ngFameCheckerFlavorTextOriginLocation_MrFuji1::\n\t.string \"POKéMON TOWER$\"\n\ngFameCheckerFlavorTextOriginLocation_MrFuji2::\n\t.string \"LAVENDER TOWN$\"\n\ngFameCheckerFlavorTextOriginLocation_MrFuji3::\n\t.string \"LAVENDER TOWN$\"\n\ngFameCheckerFlavorTextOriginLocation_MrFuji4::\n\t.string \"CINNABAR GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_MrFuji5::\n\t.string \"CINNABAR ISLAND$\"\n\ngFameCheckerFlavorTextOriginLocation_Giovanni0::\n\t.string \"ROCKET HIDEOUT$\"\n\ngFameCheckerFlavorTextOriginLocation_Giovanni1::\n\t.string \"SILPH CO.$\"\n\ngFameCheckerFlavorTextOriginLocation_Giovanni2::\n\t.string \"SILPH CO.$\"\n\ngFameCheckerFlavorTextOriginLocation_Giovanni3::\n\t.string \"VIRIDIAN GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Giovanni4::\n\t.string \"VIRIDIAN GYM$\"\n\ngFameCheckerFlavorTextOriginLocation_Giovanni5::\n\t.string \"ROCKET WAREHOUSE$\"\n\ngFameCheckerFlavorTextOriginObjectName_ProfOak0::\n\t.string \"SIGN$\"\n\ngFameCheckerFlavorTextOriginObjectName_ProfOak1::\n\t.string \"PROF. OAK$\"\n\ngFameCheckerFlavorTextOriginObjectName_ProfOak2::\n\t.string \"AIDE$\"\n\ngFameCheckerFlavorTextOriginObjectName_ProfOak3::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_ProfOak4::\n\t.string \"AGATHA$\"\n\ngFameCheckerFlavorTextOriginObjectName_ProfOak5::\n\t.string \"AIDE$\"\n\ngFameCheckerFlavorTextOriginObjectName_Daisy0::\n\t.string \"AIDE$\"\n\ngFameCheckerFlavorTextOriginObjectName_Daisy1::\n\t.string \"WOMAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Daisy2::\n\t.string \"MAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Daisy3::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Daisy4::\n\t.string \"OLD LADY$\"\n\ngFameCheckerFlavorTextOriginObjectName_Daisy5::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Brock0::\n\t.string \"SIGN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Brock1::\n\t.string \"BROCK$\"\n\ngFameCheckerFlavorTextOriginObjectName_Brock2::\n\t.string \"YOUNG MAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Brock3::\n\t.string \"BOY$\"\n\ngFameCheckerFlavorTextOriginObjectName_Brock4::\n\t.string \"MAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Brock5::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Misty0::\n\t.string \"SIGN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Misty1::\n\t.string \"MISTY$\"\n\ngFameCheckerFlavorTextOriginObjectName_Misty2::\n\t.string \"LUIS$\"\n\ngFameCheckerFlavorTextOriginObjectName_Misty3::\n\t.string \"YOUNG MAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Misty4::\n\t.string \"DAME$\"\n\ngFameCheckerFlavorTextOriginObjectName_Misty5::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_LtSurge0::\n\t.string \"SIGN$\"\n\ngFameCheckerFlavorTextOriginObjectName_LtSurge1::\n\t.string \"LT. SURGE$\"\n\ngFameCheckerFlavorTextOriginObjectName_LtSurge2::\n\t.string \"TUCKER$\"\n\ngFameCheckerFlavorTextOriginObjectName_LtSurge3::\n\t.string \"TUCKER$\"\n\ngFameCheckerFlavorTextOriginObjectName_LtSurge4::\n\t.string \"DWAYNE$\"\n\ngFameCheckerFlavorTextOriginObjectName_LtSurge5::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Erika0::\n\t.string \"SIGN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Erika1::\n\t.string \"ERIKA$\"\n\ngFameCheckerFlavorTextOriginObjectName_Erika2::\n\t.string \"LOLA$\"\n\ngFameCheckerFlavorTextOriginObjectName_Erika3::\n\t.string \"TAMIA$\"\n\ngFameCheckerFlavorTextOriginObjectName_Erika4::\n\t.string \"ERIKA$\"\n\ngFameCheckerFlavorTextOriginObjectName_Erika5::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Koga0::\n\t.string \"SIGN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Koga1::\n\t.string \"KOGA$\"\n\ngFameCheckerFlavorTextOriginObjectName_Koga2::\n\t.string \"KIRK$\"\n\ngFameCheckerFlavorTextOriginObjectName_Koga3::\n\t.string \"JANINE$\"\n\ngFameCheckerFlavorTextOriginObjectName_Koga4::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Koga5::\n\t.string \"MAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Sabrina0::\n\t.string \"SIGN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Sabrina1::\n\t.string \"YOUNG MAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Sabrina2::\n\t.string \"SABRINA$\"\n\ngFameCheckerFlavorTextOriginObjectName_Sabrina3::\n\t.string \"SABRINA$\"\n\ngFameCheckerFlavorTextOriginObjectName_Sabrina4::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Sabrina5::\n\t.string \"TYRON$\"\n\ngFameCheckerFlavorTextOriginObjectName_Blaine0::\n\t.string \"SIGN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Blaine1::\n\t.string \"BLAINE$\"\n\ngFameCheckerFlavorTextOriginObjectName_Blaine2::\n\t.string \"DEREK$\"\n\ngFameCheckerFlavorTextOriginObjectName_Blaine3::\n\t.string \"WOMAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Blaine4::\n\t.string \"PHOTO$\"\n\ngFameCheckerFlavorTextOriginObjectName_Blaine5::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Lorelei0::\n\t.string \"LORELEI$\"\n\ngFameCheckerFlavorTextOriginObjectName_Lorelei1::\n\t.string \"LORELEI$\"\n\ngFameCheckerFlavorTextOriginObjectName_Lorelei2::\n\t.string \"OLD MAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Lorelei3::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Lorelei4::\n\t.string \"LITTLE GIRL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Lorelei5::\n\t.string \"OLD LADY$\"\n\ngFameCheckerFlavorTextOriginObjectName_Bruno0::\n\t.string \"BRUNO$\"\n\ngFameCheckerFlavorTextOriginObjectName_Bruno1::\n\t.string \"BRUNO$\"\n\ngFameCheckerFlavorTextOriginObjectName_Bruno2::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Bruno3::\n\t.string \"CRUSHER$\"\n\ngFameCheckerFlavorTextOriginObjectName_Bruno4::\n\t.string \"WOMAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Bruno5::\n\t.string \"CRUSHER$\"\n\ngFameCheckerFlavorTextOriginObjectName_Agatha0::\n\t.string \"AGATHA$\"\n\ngFameCheckerFlavorTextOriginObjectName_Agatha1::\n\t.string \"CRUSHER$\"\n\ngFameCheckerFlavorTextOriginObjectName_Agatha2::\n\t.string \"CRUSHER$\"\n\ngFameCheckerFlavorTextOriginObjectName_Agatha3::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Agatha4::\n\t.string \"AGATHA$\"\n\ngFameCheckerFlavorTextOriginObjectName_Agatha5::\n\t.string \"OLD LADY$\"\n\ngFameCheckerFlavorTextOriginObjectName_Lance0::\n\t.string \"LANCE$\"\n\ngFameCheckerFlavorTextOriginObjectName_Lance1::\n\t.string \"LANCE$\"\n\ngFameCheckerFlavorTextOriginObjectName_Lance2::\n\t.string \"WOMAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Lance3::\n\t.string \"LITTLE GIRL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Lance4::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Lance5::\n\t.string \"YOUNG MAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Bill0::\n\t.string \"{RIVAL}$\"\n\ngFameCheckerFlavorTextOriginObjectName_Bill1::\n\t.string \"LITTLE BOY$\"\n\ngFameCheckerFlavorTextOriginObjectName_Bill2::\n\t.string \"OLD MAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Bill3::\n\t.string \"CELIO$\"\n\ngFameCheckerFlavorTextOriginObjectName_Bill4::\n\t.string \"CELIO$\"\n\ngFameCheckerFlavorTextOriginObjectName_Bill5::\n\t.string \"CELIO$\"\n\ngFameCheckerFlavorTextOriginObjectName_MrFuji0::\n\t.string \"LITTLE GIRL$\"\n\ngFameCheckerFlavorTextOriginObjectName_MrFuji1::\n\t.string \"TEAM ROCKET$\"\n\ngFameCheckerFlavorTextOriginObjectName_MrFuji2::\n\t.string \"MAGAZINE$\"\n\ngFameCheckerFlavorTextOriginObjectName_MrFuji3::\n\t.string \"MAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_MrFuji4::\n\t.string \"PHOTO$\"\n\ngFameCheckerFlavorTextOriginObjectName_MrFuji5::\n\t.string \"POKéMON JOURNAL$\"\n\ngFameCheckerFlavorTextOriginObjectName_Giovanni0::\n\t.string \"GIOVANNI$\"\n\ngFameCheckerFlavorTextOriginObjectName_Giovanni1::\n\t.string \"SCIENTIST$\"\n\ngFameCheckerFlavorTextOriginObjectName_Giovanni2::\n\t.string \"SCIENTIST$\"\n\ngFameCheckerFlavorTextOriginObjectName_Giovanni3::\n\t.string \"GIOVANNI$\"\n\ngFameCheckerFlavorTextOriginObjectName_Giovanni4::\n\t.string \"MAN$\"\n\ngFameCheckerFlavorTextOriginObjectName_Giovanni5::\n\t.string \"GIDEON$\"\n\nPokemonJournal_Text_SpecialFeatureBrock::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature: PEWTER GYM\\n\"\n\t.string \"LEADER BROCK!\\p\"\n\t.string \"BROCK rarely laughs, but is said to\\n\"\n\t.string \"be unable to stop if he starts.$\"\n\nPokemonJournal_Text_SpecialFeatureMisty::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature: CERULEAN GYM\\n\"\n\t.string \"LEADER MISTY!\\p\"\n\t.string \"MISTY is said to worship LORELEI\\n\"\n\t.string \"of the ELITE FOUR.$\"\n\nPokemonJournal_Text_SpecialFeatureLtSurge::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature: VERMILION GYM\\n\"\n\t.string \"LEADER LT. SURGE!\\p\"\n\t.string \"LT. SURGE is rumored to have been\\n\"\n\t.string \"a pilot while home in America.\\p\"\n\t.string \"He used the electricity generated\\n\"\n\t.string \"by POKéMON to power his plane.$\"\n\nPokemonJournal_Text_SpecialFeatureErika::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature: CELADON GYM\\n\"\n\t.string \"LEADER ERIKA!\\p\"\n\t.string \"Rumor has it that if you peek into\\n\"\n\t.string \"CELADON GYM, you can often\\l\"\n\t.string \"see ERIKA snoozing.$\"\n\nPokemonJournal_Text_SpecialFeatureKoga::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature: FUCHSIA GYM\\n\"\n\t.string \"LEADER KOGA!\\p\"\n\t.string \"KOGA is said to have a thorough\\n\"\n\t.string \"knowledge of medicine.\\p\"\n\t.string \"He even concocts medicine to nurse\\n\"\n\t.string \"his POKéMON to health.$\"\n\nPokemonJournal_Text_SpecialFeatureSabrina::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature: SAFFRON GYM\\n\"\n\t.string \"LEADER SABRINA!\\p\"\n\t.string \"People say that SABRINA can\\n\"\n\t.string \"communicate with her POKéMON\\l\"\n\t.string \"during battle without speaking.$\"\n\nPokemonJournal_Text_SpecialFeatureBlaine::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature: CINNABAR GYM\\n\"\n\t.string \"LEADER BLAINE!\\p\"\n\t.string \"BLAINE is said to remove his dark\\n\"\n\t.string \"shades only when he is thinking up\\l\"\n\t.string \"new quiz questions.$\"\n\nPokemonJournal_Text_SpecialFeatureLorelei::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature:\\n\"\n\t.string \"ELITE FOUR's LORELEI!\\p\"\n\t.string \"Known for her logical, calculated,\\n\"\n\t.string \"and cool battling style, LORELEI\\l\"\n\t.string \"has a surprising secret!$\"\n\nPokemonJournal_Text_SpecialFeatureBruno::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature:\\n\"\n\t.string \"ELITE FOUR's BRUNO!\\p\"\n\t.string \"BRUNO apparently joined the ELITE\\n\"\n\t.string \"FOUR out of his burning ambition to\\l\"\n\t.string \"battle the best TRAINERS.$\"\n\nPokemonJournal_Text_SpecialFeatureAgatha::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature:\\n\"\n\t.string \"ELITE FOUR's AGATHA!\\p\"\n\t.string \"In her youth, AGATHA and PROF.\\n\"\n\t.string \"OAK were rivals who vied for\\l\"\n\t.string \"supremacy as TRAINERS.$\"\n\nPokemonJournal_Text_SpecialFeatureLance::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature:\\n\"\n\t.string \"ELITE FOUR's LANCE!\\p\"\n\t.string \"LANCE's grandfather is thought to\\n\"\n\t.string \"be the elder of a famous clan of\\l\"\n\t.string \"dragon masters.$\"\n\nPokemonJournal_Text_SpecialFeatureProfOak::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature: PROF. OAK,\\n\"\n\t.string \"the POKéMON Researcher!\\p\"\n\t.string \"PROF. OAK reportedly lives with his\\n\"\n\t.string \"grandchildren DAISY and {RIVAL}.$\"\n\nPokemonJournal_Text_SpecialFeatureDaisyOak::\n\t.string \"This is a POKéMON JOURNAL from\\n\"\n\t.string \"years ago…\\p\"\n\t.string \"POKéMON JOURNAL\\n\"\n\t.string \"CONTEST Special!\\p\"\n\t.string \"The Spring POKéMON CONTEST's\\n\"\n\t.string \"Grand Champion is DAISY OAK of\\l\"\n\t.string \"PALLET TOWN!$\"\n\nPokemonJournal_Text_SpecialFeatureMrFuji::\n\t.string \"POKéMON JOURNAL\\p\"\n\t.string \"Special Feature:\\n\"\n\t.string \"MR. FUJI of POKéMON HOUSE!\\p\"\n\t.string \"Editor: The shy MR. FUJI turned\\n\"\n\t.string \"down our interview requests.\\p\"\n\t.string \"He is a kindly man who is adored\\n\"\n\t.string \"and respected in LAVENDER TOWN.$\"\n"
  },
  {
    "path": "data/text/flavor_text.inc",
    "content": "@ Flavor text for interacting with various background objects\n\nText_Bookshelf::\n\t.string \"It's crammed full of POKéMON\\n\"\n\t.string \"books.$\"\n\nText_ATownMap::\n\t.string \"A TOWN MAP.$\"\n\nText_PokeMartShelf::\n\t.string \"Wow!\\n\"\n\t.string \"Tons of POKéMON stuff!$\"\n\nText_DishesPlatesNeatlyLinedUp::\n\t.string \"Dishes and plates are neatly\\n\"\n\t.string \"lined up.$\"\n\nText_Kitchen::\n\t.string \"It smells delicious!\\n\"\n\t.string \"Somebody's been cooking here.$\"\n\nText_Dresser::\n\t.string \"It's a nicely made dresser.\\n\"\n\t.string \"It will hold a lot of stuff.$\"\n\nText_Snacks::\n\t.string \"There's a pile of snacks here.$\"\n\nText_PokemartSign::\n\t.string \"All your item needs fulfilled!\\n\"\n\t.string \"POKéMON MART$\"\n\nText_PokecenterSign::\n\t.string \"Heal Your POKéMON!\\n\"\n\t.string \"POKéMON CENTER$\"\n\nText_Indigo_UltimateGoal::\n\t.string \"INDIGO PLATEAU\\p\"\n\t.string \"The ultimate goal of TRAINERS!\\n\"\n\t.string \"POKéMON LEAGUE HQ$\"\n\nText_Indigo_HighestAuthority::\n\t.string \"INDIGO PLATEAU\\p\"\n\t.string \"The highest POKéMON authority!\\n\"\n\t.string \"POKéMON LEAGUE HQ$\"\n\nText_Food::\n\t.string \"It should be packed with all kinds\\n\"\n\t.string \"of delicious things to eat.$\"\n\nText_Blueprints::\n\t.string \"It's a blueprint of some sort.\\n\"\n\t.string \"It's filled with diagrams and text.$\"\n\nText_Painting::\n\t.string \"It's a pretty picture of a POKéMON.\\n\"\n\t.string \"It looks like it's feeling good.$\"\n\nText_PowerPlantMachine::\n\t.string \"What could this machine be?\\n\"\n\t.string \"Better not mess around with it!$\"\n\nText_Telephone::\n\t.string \"It's a telephone.\\n\"\n\t.string \"Better not use it.$\"\n\nText_Computer::\n\t.string \"It's all complicated words and\\n\"\n\t.string \"numbers that make no sense…$\"\n\nText_AdvertisingPoster::\n\t.string \"It's an advertising poster about\\n\"\n\t.string \"all kinds of products.$\"\n\nText_TastyFood::\n\t.string \"Oh, that smells tasty!\\n\"\n\t.string \"It might get the stomach growling!$\"\n\nText_TrashBin::\n\t.string \"Inside this…\\n\"\n\t.string \"……\\p\"\n\t.string \"There's nothing here!$\"\n\nText_Cup::\n\t.string \"It's a cup with a POKéMON mark\\n\"\n\t.string \"on it.$\"\n\nText_PolishedWindow::\n\t.string \"The window is very well polished.$\"\n\nText_BeautifulSkyWindow::\n\t.string \"Outside the window…\\p\"\n\t.string \"The sky looks fantastically\\n\"\n\t.string \"beautiful.$\"\n\nText_BlinkingLights::\n\t.string \"Lights in different colors are\\n\"\n\t.string \"flashing on and off.$\"\n\nText_NeatlyLinedUpTools::\n\t.string \"All sorts of tools are lined up\\n\"\n\t.string \"neatly.$\"\n\nText_ImpressiveMachine::\n\t.string \"It's a machine of some sort.\\n\"\n\t.string \"It sure is impressive.$\"\n\nText_VideoGame::\n\t.string \"It's the latest video game!\\n\"\n\t.string \"It sure looks fun!$\"\n\nText_Burglary::\n\t.string \"There are obvious signs of burglary\\n\"\n\t.string \"here…$\"\n\nText_PlayerFacingTVScreen::\n\t.string \"There's a POKéMON on TV!\\n\"\n\t.string \"It looks like it's having fun.$\"\n"
  },
  {
    "path": "data/text/help_system.inc",
    "content": "Help_Text_WhatShouldIDo::\n\t.string \"What should I do in this situation?$\"\n\nHelp_Text_HowDoIDoThis::\n\t.string \"How do I do this?$\"\n\nHelp_Text_WhatDoesThisTermMean::\n\t.string \"What does this term mean?$\"\n\nHelp_Text_AboutThisGame::\n\t.string \"About this game$\"\n\nHelp_Text_TypeMatchupList::\n\t.string \"Type Matchup List$\"\n\nHelp_Text_Exit::\n\t.string \"EXIT$\"\n\nHelp_Text_Cancel::\n\t.string \"CANCEL$\"\n\nHelp_Text_DescWhatShouldIDo::\n\t.string \"Select to obtain hints for getting\\n\"\n\t.string \"over challenging situations.$\"\n\nHelp_Text_DescHowDoIDoThis::\n\t.string \"Detailed instructions are given for\\n\"\n\t.string \"various operations.$\"\n\nHelp_Text_DescWhatDoesThisTermMean::\n\t.string \"Detailed descriptions are given for\\n\"\n\t.string \"terms that appear in the game.$\"\n\nHelp_Text_DescAboutThisGame::\n\t.string \"Detailed descriptions are given\\n\"\n\t.string \"about this game.$\"\n\nHelp_Text_DescTypeMatchupList::\n\t.string \"The matchups of  POKéMON types\\n\"\n\t.string \"and moves are listed.$\"\n\nHelp_Text_DescExit::\n\t.string \"Select to exit the HELP System.$\"\n\nHelp_Text_Greetings::\n\t.string \"Greetings! This is the HELP System.\\n\"\n\t.string \"Call me up whenever and wherever you\\l\"\n\t.string \"need by pressing the L Button.\\l\"\n\t.string \"The help messages change to suit the\\l\"\n\t.string \"situation, so check them often, please.$\"\n\nHelp_Text_PlayingForFirstTime::\n\t.string \"I'm playing for the first time. Help!$\"\n\nHelp_Text_WhatShouldIBeDoing::\n\t.string \"What should I be doing?$\"\n\nHelp_Text_CantGetOutOfRoom::\n\t.string \"I can't get out of a room!$\"\n\nHelp_Text_CantFindPersonIWant::\n\t.string \"I can't find the person I want.$\"\n\nHelp_Text_TalkedToEveryoneNowWhat::\n\t.string \"I've talked to everyone. Now what?$\"\n\nHelp_Text_SomeoneBlockingMyWay::\n\t.string \"There's someone blocking my way!$\"\n\nHelp_Text_ICantGoOn::\n\t.string \"I can't go on!$\"\n\nHelp_Text_OutOfThingsToDo::\n\t.string \"I'm out of things to do.$\"\n\nHelp_Text_WhatHappenedToItemIGot::\n\t.string \"What happened to the item I got?$\"\n\nHelp_Text_WhatAreMyAdventureBasics::\n\t.string \"What are the basics of my adventure?$\"\n\nHelp_Text_HowAreRoadsForestsDifferent::\n\t.string \"How are roads and forests different?$\"\n\nHelp_Text_HowAreCavesDifferent::\n\t.string \"How are caves different?$\"\n\nHelp_Text_HowDoIProgress::\n\t.string \"How do I progress?$\"\n\nHelp_Text_WhenCanIUseItem::\n\t.string \"When can I use items?$\"\n\nHelp_Text_WhatsABattle::\n\t.string \"What's a battle?$\"\n\nHelp_Text_HowDoIPrepareForBattle::\n\t.string \"How do I prepare for battle?$\"\n\nHelp_Text_WhatIsAMonsVitality::\n\t.string \"What is a POKéMON's vitality?$\"\n\nHelp_Text_MyMonsAreHurt::\n\t.string \"My POKéMON are hurt!$\"\n\nHelp_Text_WhatIsStatusProblem::\n\t.string \"What is a status problem?$\"\n\nHelp_Text_WhatHappensIfAllMyMonsFaint::\n\t.string \"What happens if all my POKéMON faint?$\"\n\nHelp_Text_CantCatchMons::\n\t.string \"I can't catch POKéMON!$\"\n\nHelp_Text_RanOutOfPotions::\n\t.string \"I ran out of POTIONS.$\"\n\nHelp_Text_CanIBuyPokeBalls::\n\t.string \"Can I buy POKé BALLS?$\"\n\nHelp_Text_WhatsATrainer::\n\t.string \"What's a TRAINER?$\"\n\nHelp_Text_HowDoIWinAgainstTrainer::\n\t.string \"How do I win against a TRAINER?$\"\n\nHelp_Text_WhereDoMonsAppear::\n\t.string \"Where do POKéMON appear?$\"\n\nHelp_Text_WhatAreMoves::\n\t.string \"What are POKéMON moves?$\"\n\nHelp_Text_WhatAreHiddenMoves::\n\t.string \"What are HIDDEN moves?$\"\n\nHelp_Text_WhatMovesShouldIUse::\n\t.string \"What moves should I use?$\"\n\nHelp_Text_WantToAddMoreMoves::\n\t.string \"I want to add more moves.$\"\n\nHelp_Text_WantToMakeMonStronger::\n\t.string \"I want to make my POKéMON stronger.$\"\n\nHelp_Text_FoeMonsTooStrong::\n\t.string \"The foe POKéMON are too strong!$\"\n\nHelp_Text_WhatDoIDoInCave::\n\t.string \"What do I do in a cave?$\"\n\nHelp_Text_NothingIWantToKnow::\n\t.string \"There's nothing that I want to know!$\"\n\nHelp_Text_WhatsPokemonCenter::\n\t.string \"What's a POKéMON CENTER?$\"\n\nHelp_Text_WhatsPokemonMart::\n\t.string \"What's a POKéMON MART?$\"\n\nHelp_Text_WantToEndGame::\n\t.string \"I want to end the game.$\"\n\nHelp_Text_WhatsAMon::\n\t.string \"What's a POKéMON?$\"\n\nHelp_Text_WhatIsThatPersonLike::\n\t.string \"What is that person like?$\"\n\nHelp_Text_WhatDoesHiddenMoveDo::\n\t.string \"What does a HIDDEN move do?$\"\n\nHelp_Text_WhatDoIDoInSafari::\n\t.string \"What do I do in a SAFARI GAME?$\"\n\nHelp_Text_WhatAreSafariRules::\n\t.string \"What are the SAFARI GAME rules?$\"\n\nHelp_Text_WantToEndSafari::\n\t.string \"I want to end this SAFARI GAME!$\"\n\nHelp_Text_WhatIsAGym::\n\t.string \"What is a GYM?$\"\n\nHelp_Text_AnswerPlayingForFirstTime::\n\t.string \"You become the main character,\\n\"\n\t.string \"exploring the world of POKéMON.\\l\"\n\t.string \"By talking to people and solving\\l\"\n\t.string \"mysteries, new paths will open to you.\\l\"\n\t.string \"Strive for the goal together with your\\l\"\n\t.string \"wonderful POKéMON.$\"\n\nHelp_Text_AnswerWhatShouldIBeDoing::\n\t.string \"When you come across another person,\\n\"\n\t.string \"go up to them and press the A Button.\\l\"\n\t.string \"That will get them to talk and interact\\l\"\n\t.string \"with your character. You may also\\l\"\n\t.string \"examine various items and objects in\\l\"\n\t.string \"the same way. Talk to people and check\\l\"\n\t.string \"things often to obtain information.$\"\n\nHelp_Text_AnswerCantGetOutOfRoom::\n\t.string \"On the stairs or the exits of a\\n\"\n\t.string \"building is a red mat. Move your\\l\"\n\t.string \"character to stand on top of the\\l\"\n\t.string \"red mat. Press the {PLUS} Control Pad \\l\"\n\t.string \"toward the stairs or the exit to\\l\"\n\t.string \"advance.$\"\n\nHelp_Text_AnswerCantFindPersonIWant::\n\t.string \"This isn't something you should worry\\n\"\n\t.string \"about too much.\\l\"\n\t.string \"Talk to other people, check signs,\\l\"\n\t.string \"check things, and so on.\\l\"\n\t.string \"Sometimes, you may need to just move\\l\"\n\t.string \"to a new town or place.$\"\n\nHelp_Text_AnswerTalkedToEveryoneNowWhat::\n\t.string \"Try moving on to a new road, town, or\\n\"\n\t.string \"place.$\"\n\nHelp_Text_AnswerSomeoneBlockingMyWay::\n\t.string \"There could be something in the town\\n\"\n\t.string \"or inside a building that is the cause.\\l\"\n\t.string \"Try talking to the people in the area\\l\"\n\t.string \"again. If there is a problem that they\\l\"\n\t.string \"need solved, you may have to help.\\l\"\n\t.string \"Afterwards, try talking to the person\\l\"\n\t.string \"blocking your way again.$\"\n\nHelp_Text_AnswerICantGoOn::\n\t.string \"Try talking to people by going up to\\n\"\n\t.string \"them and pressing the A Button.\\l\"\n\t.string \"Also, try checking things like odd trees\\l\"\n\t.string \"and strange rocks with the A Button.\\l\"\n\t.string \"Press the {PLUS} Control Pad and try going\\l\"\n\t.string \"to places that look impassable, too.$\"\n\nHelp_Text_AnswerOutOfThingsToDo::\n\t.string \"Try going to places where you \\n\"\n\t.string \"haven't visited yet.\\l\"\n\t.string \"Also, check everything that looks\\l\"\n\t.string \"suspicious by pressing the A Button.$\"\n\nHelp_Text_AnswerWhatHappenedToItemIGot::\n\t.string \"Any item that you are given by another\\n\"\n\t.string \"character goes in your BAG.\\l\"\n\t.string \"The item is automatically sorted and\\l\"\n\t.string \"placed in one of five pockets.\\l\"\n\t.string \"For instructions on the BAG's use,\\l\"\n\t.string \"please refer to the HELP System's\\l\"\n\t.string \"“How do I do this?” heading.$\"\n\nHelp_Text_AnswerWhatAreMyAdventureBasics::\n\t.string \"If POKéMON are hurt in battle,\\n\"\n\t.string \"take them to a POKéMON CENTER and\\l\"\n\t.string \"have them healed by the staff.\\l\"\n\t.string \"Get in the habit of saving your\\l\"\n\t.string \"game and recording your progress.\\l\"\n\t.string \"Stock up on healing items at\\l\"\n\t.string \"POKéMON MARTS before traveling far.$\"\n\nHelp_Text_AnswerHowAreRoadsForestsDifferent::\n\t.string \"Forests are basically the same as\\n\"\n\t.string \"roads but they can be like mazes.\\l\"\n\t.string \"All forests have a way out, so don't\\l\"\n\t.string \"give up if you get lost.$\"\n\nHelp_Text_AnswerHowAreCavesDifferent::\n\t.string \"Caves are dark and dangerous. Wild\\n\"\n\t.string \"POKéMON can appear anywhere in them.\\l\"\n\t.string \"If there is an emergency, rush to a\\l\"\n\t.string \"POKéMON CENTER or use items.\\l\"\n\t.string \"New towns await discovery beyond some\\l\"\n\t.string \"caves, so don't give up.$\"\n\nHelp_Text_AnswerHowDoIProgress::\n\t.string \"The object of the game is to train\\n\"\n\t.string \"your POKéMON and move forward.\\l\"\n\t.string \"You must collect info and solve\\l\"\n\t.string \"problems. For example, what do you\\l\"\n\t.string \"need to get around an obstacle?\\l\"\n\t.string \"What would get that impeding\\l\"\n\t.string \"person out of the way?$\"\n\nHelp_Text_AnswerWhenCanIUseItem::\n\t.string \"There are several kinds of items.\\n\"\n\t.string \"Some can be used only on the field.\\l\"\n\t.string \"Some are only for use during battle.\\l\"\n\t.string \"Some can be used anytime.\\l\"\n\t.string \"Try using an item - if it can't be used,\\l\"\n\t.string \"you will be alerted.$\"\n\nHelp_Text_AnswerWhatsABattle::\n\t.string \"In a battle, POKéMON try to reduce\\n\"\n\t.string \"one another's vitality, expressed as\\l\"\n\t.string \"HP. If a POKéMON's HP falls to zero,\\l\"\n\t.string \"it faints, and the other POKéMON\\l\"\n\t.string \"wins. By winning a battle, POKéMON\\l\"\n\t.string \"earn EXP. Points, which help them\\l\"\n\t.string \"level up (grow stronger).$\"\n\nHelp_Text_AnswerHowDoIPrepareForBattle::\n\t.string \"First, fully heal the POKéMON in your\\n\"\n\t.string \"party (the POKéMON with you) at any\\l\"\n\t.string \"POKéMON CENTER.\\l\"\n\t.string \"You should also buy healing items for\\l\"\n\t.string \"emergencies at a POKéMON MART.$\"\n\nHelp_Text_AnswerWhatIsAMonsVitality::\n\t.string \"A POKéMON's vitality is expressed in HP.\\n\"\n\t.string \"If a POKéMON is hurt in battle, HP is\\l\"\n\t.string \"subtracted. If its HP drops to zero,\\l\"\n\t.string \"the POKéMON faints.\\l\"\n\t.string \"Heal hurt or fainted POKéMON at a\\l\"\n\t.string \"POKéMON CENTER or by using items.$\"\n\nHelp_Text_AnswerMyMonsAreHurt::\n\t.string \"A POKéMON CENTER is like an inn for\\n\"\n\t.string \"POKéMON. It will fully heal POKéMON of\\l\"\n\t.string \"any status problems and fully restore\\l\"\n\t.string \"their HP using a special machine.\\l\"\n\t.string \"This service is free, so get in the\\l\"\n\t.string \"habit of healing your POKéMON often.$\"\n\nHelp_Text_AnswerWhatIsStatusProblem::\n\t.string \"A status problem refers to an ailment\\n\"\n\t.string \"that is inflicted on a POKéMON by its\\l\"\n\t.string \"foe's attack. These include burns,\\l\"\n\t.string \"paralysis, poisoning, sleep, and\\l\"\n\t.string \"freezing. These can be healed by\\l\"\n\t.string \"visiting a POKéMON CENTER or using\\l\"\n\t.string \"the appropriate item.$\"\n\nHelp_Text_AnswerWhatHappensIfAllMyMonsFaint::\n\t.string \"If all the POKéMON in your party\\n\"\n\t.string \"(all the POKéMON with you) faint, you\\l\"\n\t.string \"lose some MONEY, and you are\\l\"\n\t.string \"returned home or to a POKéMON\\l\"\n\t.string \"CENTER. To reduce that chance, visit\\l\"\n\t.string \"POKéMON CENTERS often. Also, get\\l\"\n\t.string \"in the habit of saving often.$\"\n\nHelp_Text_AnswerCantCatchMons::\n\t.string \"If a wild POKéMON escapes from a POKé\\n\"\n\t.string \"BALL, it's obviously still feisty.\\l\"\n\t.string \"Try reducing its HP some more, and\\l\"\n\t.string \"try to weaken it with paralysis or sleep\\l\"\n\t.string \"before trying to catch it.\\l\"\n\t.string \"If the POKé BALL rocks for a while,\\l\"\n\t.string \"the quarry is close to being caught!$\"\n\nHelp_Text_AnswerRanOutOfPotions::\n\t.string \"There are shops, known as POKéMON\\n\"\n\t.string \"MARTS, that sell items.\\l\"\n\t.string \"You will not find POKéMON MARTS on\\l\"\n\t.string \"roads, in forests, or in caves.\\l\"\n\t.string \"Stock up on needed items while you are\\l\"\n\t.string \"visiting a town with a POKéMON MART.$\"\n\nHelp_Text_AnswerCanIBuyPokeBalls::\n\t.string \"You may buy POKé BALLS at any\\n\"\n\t.string \"POKéMON MART in any town.\\l\"\n\t.string \"You will not find POKéMON MARTS on\\l\"\n\t.string \"roads, in forests, or in caves.\\l\"\n\t.string \"Stock up on POKé BALLS while you are\\l\"\n\t.string \"visiting a town with a POKéMON MART.$\"\n\nHelp_Text_AnswerWhatsATrainer::\n\t.string \"A TRAINER is a person who raises\\n\"\n\t.string \"POKéMON through battling.\\l\"\n\t.string \"TRAINERS will challenge you \\l\"\n\t.string \"wherever they are - it could be on\\l\"\n\t.string \"a road, in forests, caves, anywhere.\\l\"\n\t.string \"If your eyes meet, you have to accept\\l\"\n\t.string \"their challenge. So be careful!$\"\n\nHelp_Text_AnswerHowDoIWinAgainstTrainer::\n\t.string \"To beat a TRAINER in battle, use\\n\"\n\t.string \"POKéMON that have type advantages\\l\"\n\t.string \"over the foe's POKéMON. You may also\\l\"\n\t.string \"use highly trained POKéMON with\\l\"\n\t.string \"overwhelming power. Outnumbering the\\l\"\n\t.string \"foe's POKéMON is another obvious\\l\"\n\t.string \"tactic.$\"\n\nHelp_Text_AnswerWhereDoMonsAppear::\n\t.string \"Wild POKéMON will appear in tall grass,\\n\"\n\t.string \"on roads, and in forests. They will\\l\"\n\t.string \"appear anywhere in dark caves.\\l\"\n\t.string \"There are no wild POKéMON or TRAINERS\\l\"\n\t.string \"in towns, so they are safe places.$\"\n\nHelp_Text_AnswerWhatAreMoves::\n\t.string \"POKéMON may learn up to four different\\n\"\n\t.string \"techniques, or moves. There is a great\\l\"\n\t.string \"variety of moves including attacks and\\l\"\n\t.string \"those with special effects. The kinds\\l\"\n\t.string \"of moves that can be learned vary\\l\"\n\t.string \"for each POKéMON. Some moves\\l\"\n\t.string \"can be learned from machines.$\"\n\nHelp_Text_AnswerWhatAreHiddenMoves::\n\t.string \"HIDDEN moves are those that are\\n\"\n\t.string \"especially important for your\\l\"\n\t.string \"adventure. To use such a move outside\\l\"\n\t.string \"of battle, open the “POKéMON” MENU\\l\"\n\t.string \"and make the POKéMON that knows the\\l\"\n\t.string \"move use it. A fainted POKéMON may use\\l\"\n\t.string \"a HIDDEN move outside of battle.$\"\n\nHelp_Text_AnswerWhatMovesShouldIUse::\n\t.string \"Select “FIGHT,” and the MENU of moves\\n\"\n\t.string \"will appear. Consider the type\\l\"\n\t.string \"matchups, and use the most effective\\l\"\n\t.string \"moves. You can check the effects of\\l\"\n\t.string \"moves by opening “POKéMON,”\\l\"\n\t.string \"picking a POKéMON, opening “SUMMARY,”\\l\"\n\t.string \"then opening “POKéMON SKILLS.”$\"\n\nHelp_Text_AnswerWantToAddMoreMoves::\n\t.string \"The most a POKéMON can learn is four\\n\"\n\t.string \"moves. They are learned as the\\l\"\n\t.string \"POKéMON levels up. It can also be\\l\"\n\t.string \"taught a move using a TM (Technical\\l\"\n\t.string \"Machine) or HM (Hidden Machine).\\l\"\n\t.string \"There are also people who teach moves.$\"\n\nHelp_Text_AnswerWantToMakeMonStronger::\n\t.string \"The key to making your POKéMON\\n\"\n\t.string \"strong is to battle and win often.\\l\"\n\t.string \"The EXP. (Experience) Points earned\\l\"\n\t.string \"by winning battles accumulate to\\l\"\n\t.string \"level up POKéMON that participated in\\l\"\n\t.string \"them. Battle wild POKéMON often to\\l\"\n\t.string \"level up your party.$\"\n\nHelp_Text_AnswerFoeMonsTooStrong::\n\t.string \"If your foes are too strong, try\\n\"\n\t.string \"leveling up your POKéMON some more.\\l\"\n\t.string \"Go back the way you came and battle\\l\"\n\t.string \"wild POKéMON to level up your party.\\l\"\n\t.string \"You may also battle TRAINERS whom you\\l\"\n\t.string \"have not battled before.$\"\n\nHelp_Text_AnswerWhatDoIDoInCave::\n\t.string \"Unlike roads and forests, wild POKéMON\\n\"\n\t.string \"can appear anywhere in caves.\\l\"\n\t.string \"If your POKéMON are hurt in a cave,\\l\"\n\t.string \"rush to a POKéMON CENTER or use items\\l\"\n\t.string \"to heal them right away. It is very\\l\"\n\t.string \"dangerous to force your luck in caves.$\"\n\nHelp_Text_AnswerNothingIWantToKnow::\n\t.string \"Trust your own knowledge and power.\\n\"\n\t.string \"Believe in yourself and find your way!$\"\n\nHelp_Text_AnswerWhatsPokemonCenter::\n\t.string \"A POKéMON CENTER is identified by its\\n\"\n\t.string \"red roof and a “P.C” sign. Every\\l\"\n\t.string \"POKéMON CENTER offers such services as\\l\"\n\t.string \"fully healing POKéMON and free PC use,\\l\"\n\t.string \"making it essential for your travels.\\l\"\n\t.string \"On the upper floor are facilities for\\l\"\n\t.string \"linking with friends and others.$\"\n\nHelp_Text_AnswerWhatsPokemonMart::\n\t.string \"A POKéMON MART is identified by its\\n\"\n\t.string \"blue roof and a “MART” sign.\\l\"\n\t.string \"Items can be bought and sold at any\\l\"\n\t.string \"POKéMON MART. Some MARTS carry items\\l\"\n\t.string \"that are available only in their towns.$\"\n\nHelp_Text_AnswerWantToEndGame::\n\t.string \"You can safely end your game by\\n\"\n\t.string \"selecting “SAVE” on the MENU.\\l\"\n\t.string \"Once you have saved, the game can be\\l\"\n\t.string \"safely turned off. When the game is\\l\"\n\t.string \"turned back on, you can resume from\\l\"\n\t.string \"where you last saved.$\"\n\nHelp_Text_AnswerWhatsAMon::\n\t.string \"POKéMON are living beings about which\\n\"\n\t.string \"many mysteries still remain. You may\\l\"\n\t.string \"see them in grass, the sea, and caves.\\l\"\n\t.string \"They appear to obey the wishes of the\\l\"\n\t.string \"TRAINERS that caught them.$\"\n\nHelp_Text_AnswerWhatIsThatPersonLike::\n\t.string \"Use the FAME CHECKER among the\\n\"\n\t.string \"KEY ITEMS in your BAG.\\l\"\n\t.string \"It may give you a hint, so try it out.$\"\n\nHelp_Text_AnswerWhatDoesHiddenMoveDo::\n\t.string \"A HIDDEN move is taught to a POKéMON\\n\"\n\t.string \"using an HM (Hidden Machine).\\l\"\n\t.string \"A HIDDEN move is important for helping\\l\"\n\t.string \"your adventure. For example, one is\\l\"\n\t.string \"used to light up dark caves. Another\\l\"\n\t.string \"cuts down small trees. There is one\\l\"\n\t.string \"for traveling on water, and so on.$\"\n\nHelp_Text_AnswerWhatDoIDoInSafari::\n\t.string \"Try to catch wild POKéMON by throwing\\n\"\n\t.string \"the special SAFARI BALLS.\\l\"\n\t.string \"You may keep any item you find, too.$\"\n\nHelp_Text_AnswerWhatAreSafariRules::\n\t.string \"Your SAFARI GAME ends once you have\\n\"\n\t.string \"traveled a certain distance or thrown\\l\"\n\t.string \"all your SAFARI BALLS.\\l\"\n\t.string \"Open the MENU to check the remaining\\l\"\n\t.string \"number of steps and SAFARI BALLS.$\"\n\nHelp_Text_AnswerWantToEndSafari::\n\t.string \"If you would like to cut your SAFARI\\n\"\n\t.string \"GAME short, open the MENU and select\\l\"\n\t.string \"“RETIRE” at the top of the list.$\"\n\nHelp_Text_AnswerWhatIsAGym::\n\t.string \"POKéMON GYMS are operated by the\\n\"\n\t.string \"POKéMON LEAGUE and are training\\l\"\n\t.string \"facilities for TRAINERS. They are all\\l\"\n\t.string \"across the land in cities and towns.\\l\"\n\t.string \"Each one is headed by a LEADER, who\\l\"\n\t.string \"is a very skilled TRAINER. Beat the\\l\"\n\t.string \"LEADER to collect a BADGE.$\"\n\nHelp_Text_UsingPokedex::\n\t.string \" Using “POKéDEX”$\"\n\nHelp_Text_UsingPokemon::\n\t.string \" Using “POKéMON”$\"\n\nHelp_Text_UsingSummary::\n\t.string \"  Using “SUMMARY”$\"\n\nHelp_Text_UsingSwitch::\n\t.string \"  Using “SWITCH”$\"\n\nHelp_Text_UsingItem::\n\t.string \"  Using “ITEM”$\"\n\nHelp_Text_UsingBag::\n\t.string \" Using “BAG”$\"\n\nHelp_Text_UsingAnItem::\n\t.string \"  Using an item$\"\n\nHelp_Text_UsingKeyItem::\n\t.string \"  Using a key item$\"\n\nHelp_Text_UsingPokeBall::\n\t.string \"  Using a POKé BALL$\"\n\nHelp_Text_UsingPlayer::\n\t.string \" Using “{PLAYER}”$\"\n\nHelp_Text_UsingSave::\n\t.string \" Using “SAVE”$\"\n\nHelp_Text_UsingOption::\n\t.string \" Using “OPTION”$\"\n\nHelp_Text_UsingPotion::\n\t.string \"    Using a POTION$\"\n\nHelp_Text_UsingTownMap::\n\t.string \"    Using the TOWN MAP$\"\n\nHelp_Text_UsingTM::\n\t.string \"    Using a TM$\"\n\nHelp_Text_UsingHM::\n\t.string \"    Using an HM$\"\n\nHelp_Text_UsingMoveOutsideOfBattle::\n\t.string \"Using a move outside of battle$\"\n\nHelp_Text_RidingBicycle::\n\t.string \"    Riding the BICYCLE$\"\n\nHelp_Text_EnteringName::\n\t.string \"Entering a name$\"\n\nHelp_Text_UsingPC::\n\t.string \"Using a PC$\"\n\nHelp_Text_UsingBillsPC::\n\t.string \" Using “{STR_VAR_1}'S PC”$\"\n\nHelp_Text_UsingWithdraw::\n\t.string \"  Using “WITHDRAW”$\"\n\nHelp_Text_UsingDeposit::\n\t.string \"  Using “DEPOSIT”$\"\n\nHelp_Text_UsingMove::\n\t.string \"  Using “MOVE”$\"\n\nHelp_Text_MovingItems::\n\t.string \"  Moving items$\"\n\nHelp_Text_UsingPlayersPC::\n\t.string \" Using “{PLAYER}'s PC”$\"\n\nHelp_Text_UsingWithdrawItem::\n\t.string \"  Using “WITHDRAW ITEM”$\"\n\nHelp_Text_UsingDepositItem::\n\t.string \"  Using “DEPOSIT ITEM”$\"\n\nHelp_Text_UsingMailbox::\n\t.string \"  Using “MAILBOX”$\"\n\nHelp_Text_UsingProfOaksPC::\n\t.string \" Using “PROF. OAK'S PC”$\"\n\nHelp_Text_OpeningMenu::\n\t.string \"Opening the MENU$\"\n\nHelp_Text_UsingFight::\n\t.string \" Using “FIGHT”$\"\n\nHelp_Text_UsingPokemon2::\n\t.string \" Using “POKéMON”$\"\n\nHelp_Text_UsingShift::\n\t.string \"  Using “SHIFT”$\"\n\nHelp_Text_UsingSummary2::\n\t.string \"  Using “SUMMARY”$\"\n\nHelp_Text_UsingBag2::\n\t.string \" Using “BAG”$\"\n\nHelp_Text_ReadingPokedex::\n\t.string \" Reading the “POKéDEX”$\"\n\nHelp_Text_UsingHomePC::\n\t.string \"Using the PC at home$\"\n\nHelp_Text_UsingItemStorage::\n\t.string \"Using the Item Storage System$\"\n\nHelp_Text_UsingWithdrawItem2::\n\t.string \"  Using “WITHDRAW ITEM”$\"\n\nHelp_Text_UsingDepositItem2::\n\t.string \"  Using “DEPOSIT ITEM”$\"\n\nHelp_Text_UsingMailbox2::\n\t.string \"Using the MAILBOX$\"\n\nHelp_Text_UsingRun::\n\t.string \" Using “RUN”$\"\n\nHelp_Text_RegisterKeyItem::\n\t.string \"  “REGISTER” a key item$\"\n\nHelp_Text_UsingBall::\n\t.string \" Using “BALL”$\"\n\nHelp_Text_UsingBait::\n\t.string \" Using “BAIT”$\"\n\nHelp_Text_UsingRock::\n\t.string \" Using “ROCK”$\"\n\nHelp_Text_UsingHallOfFame::\n\t.string \" Using “HALL OF FAME”$\"\n\nHelp_Text_UsingKeySystem::\n\t.string \" Using “KEY SYSTEM SETTINGS”$\"\n\nHelp_Text_SortingBag::\n\t.string \"  Sorting the BAG$\"\n\nHelp_Text_HowToUsePokedex::\n\t.string \"{CIRCLE_1} Select “POKéDEX” on the MENU.\\n\"\n\t.string \"{CIRCLE_2} Choose POKéMON using commands such\\n\"\n\t.string \"   as “POKéMON LIST,”\\n\"\n\t.string \"   “HABITATS OF POKéMON,” and\\n\"\n\t.string \"   “SEARCH.”\\n\"\n\t.string \"{CIRCLE_3} Select a POKéMON to obtain detailed\\n\"\n\t.string \"   information.$\"\n\nHelp_Text_HowToUsePokemon::\n\t.string \"{CIRCLE_1} Select “POKéMON” on the MENU.\\n\"\n\t.string \"{CIRCLE_2} Choose a POKéMON in your party.\\n\"\n\t.string \"{CIRCLE_3} Select “SUMMARY,” “SWITCH,”\\n\"\n\t.string \"   or “ITEM.”$\"\n\nHelp_Text_HowToUseSummary::\n\t.string \"{CIRCLE_1} Select “SUMMARY.”\\n\"\n\t.string \"{CIRCLE_2} Press left or right on the {PLUS} Control\\n\"\n\t.string \"   Pad to check the information:\\n\"\n\t.string \"   “POKéMON INFO”\\n\"\n\t.string \"   “POKéMON SKILLS”\\n\"\n\t.string \"   “KNOWN MOVES”$\"\n\nHelp_Text_HowToUseSwitch::\n\t.string \"{CIRCLE_1} Choose the POKéMON you want to\\n\"\n\t.string \"   switch around.\\n\"\n\t.string \"{CIRCLE_2} Select “SWITCH.”\\n\"\n\t.string \"{CIRCLE_3} Select the POKéMON to switch with\\n\"\n\t.string \"   the first one.\\n\"\n\t.string \"The POKéMON at the left of the screen\\n\"\n\t.string \"will be the first one out in a battle.$\"\n\nHelp_Text_HowToUseItem::\n\t.string \"{CIRCLE_1} Select “ITEM.”\\n\"\n\t.string \"{CIRCLE_2} Select whether you want to “GIVE”\\n\"\n\t.string \"   an item to the POKéMON to hold,\\n\"\n\t.string \"   or “TAKE” an item it is holding.\\n\"\n\t.string \"A POKéMON can hold no more than one\\n\"\n\t.string \"item!$\"\n\nHelp_Text_HowToUseBag::\n\t.string \"{CIRCLE_1} Select “BAG” on the MENU.\\n\"\n\t.string \"{CIRCLE_2} Press left or right on the {PLUS} Control\\n\"\n\t.string \"   Pad to check the data headings:\\n\"\n\t.string \"   “ITEMS”          “MEDICINE”\\n\"\n\t.string \"   “KEY ITEMS”     “HELD ITEMS”\\n\"\n\t.string \"   “POKé BALLS”\\n\"\n\t.string \"   Press up or down to select an item.$\"\n\nHelp_Text_HowToUseAnItem::\n\t.string \"{CIRCLE_1} Select the “ITEMS” POCKET.\\n\"\n\t.string \"{CIRCLE_2} Press up or down on the {PLUS} Control\\n\"\n\t.string \"   Pad to select an item.\\n\"\n\t.string \"{CIRCLE_3} Select “USE” to use the selected\\n\"\n\t.string \"   item.\\n\"\n\t.string \"Some items may not be used depending\\n\"\n\t.string \"on the place and/or situation.$\"\n\nHelp_Text_HowToUseKeyItem::\n\t.string \"{CIRCLE_1} Select the “KEY ITEMS” POCKET.\\n\"\n\t.string \"{CIRCLE_2} Press up or down on the {PLUS} Control\\n\"\n\t.string \"   Pad to select a key item.\\n\"\n\t.string \"{CIRCLE_3} Select “USE” to use the selected\\n\"\n\t.string \"   key item.$\"\n\nHelp_Text_HowToUsePokeBall::\n\t.string \"{CIRCLE_1} While battling a wild POKéMON,\\n\"\n\t.string \"   select the BAG's “POKé BALLS”\\n\"\n\t.string \"   POCKET.\\n\"\n\t.string \"{CIRCLE_2} Press up or down on the {PLUS} Control\\n\"\n\t.string \"   Pad to select a POKé BALL.\\n\"\n\t.string \"{CIRCLE_3} Select “USE” to throw the selected\\n\"\n\t.string \"   POKé BALL.$\"\n\nHelp_Text_HowToUsePlayer::\n\t.string \"{CIRCLE_1} Select “{PLAYER}” on the MENU.\\n\"\n\t.string \"{CIRCLE_2} Your TRAINER CARD is displayed face\\n\"\n\t.string \"   up with basic information. Press the\\n\"\n\t.string \"   A Button to turn the CARD over.\\n\"\n\t.string \"{CIRCLE_3} A variety of data can be found on\\n\"\n\t.string \"   the reverse side of the CARD.$\"\n\nHelp_Text_HowToUseSave::\n\t.string \"{CIRCLE_1} Select “SAVE” on the MENU.\\n\"\n\t.string \"{CIRCLE_2} Select “YES” and your progress is\\n\"\n\t.string \"   recorded in the save file.\\n\"\n\t.string \"Once the game is saved, you may turn\\n\"\n\t.string \"off the game. Your game can be resumed\\n\"\n\t.string \"from where you saved.$\"\n\nHelp_Text_HowToUseOption::\n\t.string \"{CIRCLE_1} Select “OPTION” on the MENU.\\n\"\n\t.string \"{CIRCLE_2} Press up or down on the {PLUS} Control\\n\"\n\t.string \"   Pad to select an optional item, then\\n\"\n\t.string \"   press left or right to alter the\\n\"\n\t.string \"   settings.\\n\"\n\t.string \"{CIRCLE_3} Press the B Button after making\\n\"\n\t.string \"   changes to save them.$\"\n\nHelp_Text_HowToUsePotion::\n\t.string \"{CIRCLE_1} Open the MENU.\\n\"\n\t.string \"{CIRCLE_2} Press up or down on the {PLUS} Control\\n\"\n\t.string \"   Pad and select “BAG.”\\n\"\n\t.string \"{CIRCLE_3} Select “POTION” in the “MEDICINE”\\n\"\n\t.string \"   POCKET.\\n\"\n\t.string \"{CIRCLE_4} Select “USE.”\\n\"\n\t.string \"{CIRCLE_5} Select the POKéMON to be healed.$\"\n\nHelp_Text_HowToUseTownMap::\n\t.string \"{CIRCLE_1} Open the MENU.\\n\"\n\t.string \"{CIRCLE_2} Press up or down on the {PLUS} Control\\n\"\n\t.string \"   Pad and select “BAG.”\\n\"\n\t.string \"{CIRCLE_3} Press left or right to open the\\n\"\n\t.string \"   “KEY ITEMS” POCKET, then press\\n\"\n\t.string \"   up or down to select “TOWN MAP.” \\n\"\n\t.string \"{CIRCLE_4} Select “USE” to open the TOWN MAP.$\"\n\nHelp_Text_HowToUseTM::\n\t.string \"{CIRCLE_1} Open the MENU.\\n\"\n\t.string \"{CIRCLE_2} Open the “KEY ITEMS” POCKET in the\\n\"\n\t.string \"   “BAG.”\\n\"\n\t.string \"{CIRCLE_3} “OPEN” the TM CASE.\\n\"\n\t.string \"{CIRCLE_4} Select and “USE” a TM.\\n\"\n\t.string \"{CIRCLE_5} Select a POKéMON that can learn the\\n\"\n\t.string \"   move in the TM.$\"\n\nHelp_Text_HowToUseHM::\n\t.string \"{CIRCLE_1} Open the MENU.\\n\"\n\t.string \"{CIRCLE_2} Open the “KEY ITEMS” POCKET in the\\n\"\n\t.string \"   “BAG.”\\n\"\n\t.string \"{CIRCLE_3} “OPEN” the TM CASE.\\n\"\n\t.string \"{CIRCLE_4} Select and “USE” an HM.\\n\"\n\t.string \"{CIRCLE_5} Select a POKéMON that can learn it.\\n\"\n\t.string \"HMs are hard to remove, so be careful!$\"\n\nHelp_Text_HowToUseMoveOutsideOfBattle::\n\t.string \"{CIRCLE_1} Open the MENU.\\n\"\n\t.string \"{CIRCLE_2} Select “POKéMON.”\\n\"\n\t.string \"{CIRCLE_3} Select a POKéMON that knows an\\n\"\n\t.string \"   HM move. The usable HM move(s)\\n\"\n\t.string \"   will be shown in blue. Select and\\n\"\n\t.string \"   use the desired move to destroy an\\n\"\n\t.string \"   obstacle, fly, surf, etc.$\"\n\nHelp_Text_HowToRideBicycle::\n\t.string \"{CIRCLE_1} Open the MENU. Open the\\n\"\n\t.string \"   “KEY ITEMS” POCKET in the “BAG”\\n\"\n\t.string \"   and select the “BICYCLE.”\\n\"\n\t.string \"{CIRCLE_2} The BICYCLE can be ridden by\\n\"\n\t.string \"   selecting “USE.” You may also\\n\"\n\t.string \"   “REGISTER” it for instant use by\\n\"\n\t.string \"   pressing SELECT.$\"\n\nHelp_Text_HowToEnterName::\n\t.string \"{CIRCLE_1} Move the cursor to the letter you\\n\"\n\t.string \"   want with the {PLUS} Control Pad, then\\n\"\n\t.string \"   press the A Button to enter it.\\n\"\n\t.string \"{CIRCLE_2} Press the B Button to back up.\\n\"\n\t.string \"{CIRCLE_3} Press SELECT to switch between\\n\"\n\t.string \"   uppercase and lowercase letters.\\n\"\n\t.string \"{CIRCLE_4} Press the A Button on “OK.”$\"\n\nHelp_Text_HowToUsePC::\n\t.string \"{CIRCLE_1} Go to any POKéMON CENTER, go up\\n\"\n\t.string \"   to the PC, then press the A Button.$\"\n\nHelp_Text_HowToUseBillsPC::\n\t.string \"{CIRCLE_1} Select “{STR_VAR_1}'S PC” on the PC.\\n\"\n\t.string \"{CIRCLE_2} Select from one of the top three\\n\"\n\t.string \"   MENU items to access the POKéMON\\n\"\n\t.string \"   Storage System.\\n\"\n\t.string \"If you catch a POKéMON when you have\\n\"\n\t.string \"six in your party, the POKéMON is sent\\n\"\n\t.string \"automatically to a BOX in the System!$\"\n\nHelp_Text_HowToUseWithdraw::\n\t.string \"{CIRCLE_1} Select a POKéMON in the open BOX\\n\"\n\t.string \"   with the {PLUS} Control Pad.\\n\"\n\t.string \"{CIRCLE_2} Select “WITHDRAW” to remove the\\n\"\n\t.string \"   POKéMON from the BOX and add it to\\n\"\n\t.string \"   your party.\\n\"\n\t.string \"You may not withdraw a POKéMON if you\\n\"\n\t.string \"already have six POKéMON with you!$\"\n\nHelp_Text_HowToUseDeposit::\n\t.string \"{CIRCLE_1} Select a POKéMON in your party with\\n\"\n\t.string \"   the {PLUS} Control Pad.\\n\"\n\t.string \"{CIRCLE_2} Select “DEPOSIT.”\\n\"\n\t.string \"{CIRCLE_3} Select the BOX, then press the\\n\"\n\t.string \"   A Button to store the POKéMON.\\n\"\n\t.string \"If you have only one POKéMON with you,\\n\"\n\t.string \"it may not be stored!$\"\n\nHelp_Text_HowToUseMove::\n\t.string \"{CIRCLE_1} Select a POKéMON in the open BOX.\\n\"\n\t.string \"{CIRCLE_2} Pick up the POKéMON by selecting\\n\"\n\t.string \"   “MOVE” and move it anywhere with\\n\"\n\t.string \"   the {PLUS} Control Pad.\\n\"\n\t.string \"{CIRCLE_3} Move the POKéMON to the BOX name\\n\"\n\t.string \"   and press left or right to move it\\n\"\n\t.string \"   to another BOX.$\"\n\nHelp_Text_HowToMoveItems::\n\t.string \"{CIRCLE_1} Faintly shown POKéMON can be made\\n\"\n\t.string \"   to hold an item by selecting it and\\n\"\n\t.string \"   pressing the A Button.\\n\"\n\t.string \"{CIRCLE_2} Clearly shown POKéMON can be made\\n\"\n\t.string \"   to give the item they are holding to\\n\"\n\t.string \"   another POKéMON, or return the item\\n\"\n\t.string \"   to the BAG with the A Button.$\"\n\nHelp_Text_HowToUsePlayersPC::\n\t.string \"{CIRCLE_1} Select “{PLAYER}'s PC” on the PC.\\n\"\n\t.string \"{CIRCLE_2} Select either “ITEM STORAGE” or\\n\"\n\t.string \"   “MAILBOX.”\\n\"\n\t.string \"You may store things in your own PC\\n\"\n\t.string \"if your BAG is full. You may also\\n\"\n\t.string \"withdraw items stored in your PC.$\"\n\nHelp_Text_HowToUseWithdrawItem::\n\t.string \"{CIRCLE_1} Select “WITHDRAW ITEM.”\\n\"\n\t.string \"{CIRCLE_2} Select the item to be withdrawn.\\n\"\n\t.string \"{CIRCLE_3} The item can be withdrawn and\\n\"\n\t.string \"   placed in the BAG's ITEMS POCKET.\\n\"\n\t.string \"   It may also be directly given to a\\n\"\n\t.string \"   POKéMON to hold.$\"\n\nHelp_Text_HowToUseDepositItem::\n\t.string \"{CIRCLE_1} Select “DEPOSIT ITEM.”\\n\"\n\t.string \"{CIRCLE_2} Select the item in the BAG to be\\n\"\n\t.string \"   deposited using the {PLUS} Control Pad.\\n\"\n\t.string \"{CIRCLE_3} If there is more than one \\n\"\n\t.string \"   item to be deposited, enter the\\n\"\n\t.string \"   quantity with the {PLUS} Control Pad,\\n\"\n\t.string \"   then press the A Button.$\"\n\nHelp_Text_HowToUseMailbox::\n\t.string \"When MAIL is taken from a POKéMON,\\n\"\n\t.string \"it is moved to the MAILBOX. If it has\\n\"\n\t.string \"no MAIL, the MAILBOX can't be used.\\n\"\n\t.string \"{CIRCLE_1} Select “{PLAYER}'S PC” on the PC.\\n\"\n\t.string \"{CIRCLE_2} Select “MAILBOX” to read MAIL or\\n\"\n\t.string \"   make a POKéMON hold MAIL.$\"\n\nHelp_Text_HowToUseProfOaksPC::\n\t.string \"{CIRCLE_1} Select “PROF. OAK'S PC” on the PC.\\n\"\n\t.string \"{CIRCLE_2} PROF. OAK will evaluate your\\n\"\n\t.string \"   POKéDEX.\\n\"\n\t.string \"His evaluations should give you hints\\n\"\n\t.string \"for catching more POKéMON!$\"\n\nHelp_Text_HowToOpenMenu::\n\t.string \"{CIRCLE_1} Press START.\\n\"\n\t.string \"{CIRCLE_2} The MENU will open on the right.\\n\"\n\t.string \"{CIRCLE_3} Depending on the situation, the MENU\\n\"\n\t.string \"   may feature different headings.\\n\"\n\t.string \"The MENU will not open in certain\\n\"\n\t.string \"situations such as when talking, doing\\n\"\n\t.string \"something, battling, etc.$\"\n\nHelp_Text_HowToUseFight::\n\t.string \"{CIRCLE_1} Select “FIGHT.”\\n\"\n\t.string \"{CIRCLE_2} Select one of the moves shown,\\n\"\n\t.string \"and that move will be used!$\"\n\nHelp_Text_HowToUsePokemon2::\n\t.string \"{CIRCLE_1} Select “POKéMON.”\\n\"\n\t.string \"{CIRCLE_2} Select the POKéMON in your party\\n\"\n\t.string \"   that you want to use.\\n\"\n\t.string \"{CIRCLE_3} If you have two or more POKéMON\\n\"\n\t.string \"   with you, they may be switched by\\n\"\n\t.string \"   selecting “SHIFT.” Check POKéMON\\n\"\n\t.string \"   data by selecting “SUMMARY.”$\"\n\nHelp_Text_HowToUseShift::\n\t.string \"This command switches the POKéMON in\\n\"\n\t.string \"battle with another one in your party.\\n\"\n\t.string \"{CIRCLE_1} Select the POKéMON to be sent out.\\n\"\n\t.string \"{CIRCLE_2} Select “SHIFT.”\\n\"\n\t.string \"{CIRCLE_3} The selected POKéMON will switch\\n\"\n\t.string \"   places with the POKéMON in battle!$\"\n\nHelp_Text_HowToUseSummary2::\n\t.string \"{CIRCLE_1} Select “SUMMARY.”\\n\"\n\t.string \"{CIRCLE_2} Press left or right on the {PLUS} Control\\n\"\n\t.string \"   Pad to check the information:\\n\"\n\t.string \"   “POKéMON INFO”\\n\"\n\t.string \"   “POKéMON SKILLS”\\n\"\n\t.string \"   “KNOWN MOVES”$\"\n\nHelp_Text_HowToUseBag2::\n\t.string \"{CIRCLE_1} Select “BAG.”\\n\"\n\t.string \"{CIRCLE_2} Press left or right on the {PLUS} Control\\n\"\n\t.string \"   Pad to check the data headings:\\n\"\n\t.string \"   “ITEMS”\\n\"\n\t.string \"   “KEY ITEMS”\\n\"\n\t.string \"   “POKé BALLS”\\n\"\n\t.string \"   Press up or down to select an item.$\"\n\nHelp_Text_HowToReadPokedex::\n\t.string \"{CIRCLE_1} POKéMON that you have caught are\\n\"\n\t.string \"   identified by a POKé BALL mark on\\n\"\n\t.string \"   the POKéDEX list.\\n\"\n\t.string \"{CIRCLE_2} A caught POKéMON will provide a\\n\"\n\t.string \"   large amount of data.\\n\"\n\t.string \"{CIRCLE_3} Select “NEXT DATA” to display the\\n\"\n\t.string \"   TOWN MAP with its habitat(s).$\"\n\nHelp_Text_HowToUseHomePC::\n\t.string \"{CIRCLE_1} Go up to the PC at home, then press\\n\"\n\t.string \"   the A Button.\\n\"\n\t.string \"{CIRCLE_2} The PC will turn on.\\n\"\n\t.string \"{CIRCLE_3} Select either “ITEM STORAGE” or\\n\"\n\t.string \"   “MAILBOX.”$\"\n\nHelp_Text_HowToUseItemStorage::\n\t.string \"{CIRCLE_1} Select “WITHDRAW ITEM” to withdraw\\n\"\n\t.string \"   an item stored on your PC.\\n\"\n\t.string \"{CIRCLE_2} Select “DEPOSIT ITEM” to put \\n\"\n\t.string \"   an item from your BAG into your PC.$\"\n\nHelp_Text_HowToUseWithdrawItem2::\n\t.string \"{CIRCLE_1} Select “WITHDRAW ITEM.”\\n\"\n\t.string \"{CIRCLE_2} Select the item to be withdrawn.\\n\"\n\t.string \"{CIRCLE_3} The item can be withdrawn and\\n\"\n\t.string \"   placed in the BAG's ITEMS POCKET.\\n\"\n\t.string \"   It may also be directly given to a\\n\"\n\t.string \"   POKéMON to hold.$\"\n\nHelp_Text_HowToUseDepositItem2::\n\t.string \"{CIRCLE_1} Select “DEPOSIT ITEM.”\\n\"\n\t.string \"{CIRCLE_2} Select the item in the BAG to be\\n\"\n\t.string \"   deposited using the {PLUS} Control Pad.\\n\"\n\t.string \"{CIRCLE_3} If there is nothing in the BAG, this\\n\"\n\t.string \"   command can't be used!$\"\n\nHelp_Text_HowToUseMailbox2::\n\t.string \"When MAIL is taken from a POKéMON,\\n\"\n\t.string \"it is moved to the MAILBOX. If it has\\n\"\n\t.string \"no MAIL, the MAILBOX can't be used.\\n\"\n\t.string \"{CIRCLE_1} Select MAIL by name to read it or\\n\"\n\t.string \"   make a POKéMON hold it.$\"\n\nHelp_Text_HowToUseRun::\n\t.string \"You may not “RUN” from a TRAINER\\n\"\n\t.string \"battle!\\n\"\n\t.string \"{CIRCLE_1} You may “RUN” from a wild POKéMON.\\n\"\n\t.string \"{CIRCLE_2} Your chance of escape is improved\\n\"\n\t.string \"   if your POKéMON in battle is fast.$\"\n\nHelp_Text_HowToRegisterKeyItem::\n\t.string \"You may “REGISTER” certain key items\\n\"\n\t.string \"for instant use by pressing SELECT!\\n\"\n\t.string \"{CIRCLE_1} Open the “KEY ITEMS” POCKET.\\n\"\n\t.string \"{CIRCLE_2} Select the key item, then select\\n\"\n\t.string \"   “REGISTER.”\\n\"\n\t.string \"{CIRCLE_3} Only items that have a use in the\\n\"\n\t.string \"   field can be registered.$\"\n\nHelp_Text_HowToUseBall::\n\t.string \"{CIRCLE_1} Select to throw the special POKé\\n\"\n\t.string \"   BALL used only in the SAFARI ZONE.\\n\"\n\t.string \"When wild POKéMON appear, throw lots\\n\"\n\t.string \"of SAFARI BALLS to catch them!$\"\n\nHelp_Text_HowToUseBait::\n\t.string \"{CIRCLE_1} Select to throw the special food\\n\"\n\t.string \"   used only in the SAFARI ZONE.\\n\"\n\t.string \"It is POKéMON food rolled up into\\n\"\n\t.string \"a ball for easy eating. When BAIT is\\n\"\n\t.string \"thrown, the wild POKéMON may get\\n\"\n\t.string \"attracted by it, and may not flee!$\"\n\nHelp_Text_HowToUseRock::\n\t.string \"{CIRCLE_1} Select to throw a rock lying on\\n\"\n\t.string \"   the ground in the SAFARI ZONE.\\n\"\n\t.string \"Throwing a rock at a POKéMON may \\n\"\n\t.string \"make it run away, but it becomes easier\\n\"\n\t.string \"to catch!$\"\n\nHelp_Text_HowToUseHallOfFame::\n\t.string \"{CIRCLE_1} Select “HALL OF FAME” on the PC.\\n\"\n\t.string \"{CIRCLE_2} The POKéMON that have entered the\\n\"\n\t.string \"   HALL OF FAME can be examined.$\"\n\nHelp_Text_HowToUseKeySystemSettings::\n\t.string \"{CIRCLE_1} Select “KEY SYSTEM SETTINGS” on\\n\"\n\t.string \"   the MENU.\\n\"\n\t.string \"{CIRCLE_2} Press up or down on the {PLUS} Control\\n\"\n\t.string \"   Pad to select a key, then press left\\n\"\n\t.string \"   or right to alter the settings.\\n\"\n\t.string \"{CIRCLE_3} Press the A or B Button after\\n\"\n\t.string \"   making changes to save them.$\"\n\nHelp_Text_HowToSortBag::\n\t.string \"{CIRCLE_1} Press START while in the BAG menu.\\n\"\n\t.string \"{CIRCLE_2} Press up or down on the {PLUS} Control\\n\"\n\t.string \"   Pad to select a sorting scheme.\\n\"\n\t.string \"Depending on the POCKET, items can be\\n\"\n\t.string \"sorted by NAME, TYPE, AMOUNT, and\\n\"\n\t.string \"NUMBER.$\"\n\nHelp_Text_HP::\n\t.string \"HP$\"\n\nHelp_Text_EXP::\n\t.string \"EXP. {LEFT_PAREN}EXP. Points{RIGHT_PAREN}$\"\n\nHelp_Text_Moves::\n\t.string \"MOVES$\"\n\nHelp_Text_Attack::\n\t.string \"ATTACK$\"\n\nHelp_Text_Defense::\n\t.string \"DEFENSE$\"\n\nHelp_Text_SpAtk::\n\t.string \"SP. ATK$\"\n\nHelp_Text_SpDef::\n\t.string \"SP. DEF$\"\n\nHelp_Text_Speed::\n\t.string \"SPEED$\"\n\nHelp_Text_Level::\n\t.string \"Lv. {LEFT_PAREN}Level{RIGHT_PAREN}$\"\n\nHelp_Text_Type::\n\t.string \"TYPE$\"\n\nHelp_Text_OT::\n\t.string \"OT$\"\n\nHelp_Text_Item::\n\t.string \"ITEM$\"\n\nHelp_Text_Ability::\n\t.string \"ABILITY$\"\n\nHelp_Text_Money::\n\t.string \"MONEY$\"\n\nHelp_Text_MoveType::\n\t.string \"MOVE TYPE$\"\n\nHelp_Text_Nature::\n\t.string \"NATURE$\"\n\nHelp_Text_IDNo::\n\t.string \"ID No.$\"\n\nHelp_Text_PP::\n\t.string \"PP$\"\n\nHelp_Text_Power::\n\t.string \"POWER$\"\n\nHelp_Text_Accuracy::\n\t.string \"ACCURACY$\"\n\nHelp_Text_FNT::\n\t.string \"FNT$\"\n\nHelp_Text_Items::\n\t.string \"ITEMS$\"\n\nHelp_Text_KeyItems::\n\t.string \"KEY ITEMS$\"\n\nHelp_Text_PokeBalls::\n\t.string \"POKé BALLS$\"\n\nHelp_Text_Pokedex::\n\t.string \"POKéDEX$\"\n\nHelp_Text_PlayTime::\n\t.string \"PLAY TIME$\"\n\nHelp_Text_Badges::\n\t.string \"BADGES$\"\n\nHelp_Text_TextSpeed::\n\t.string \"TEXT SPEED$\"\n\nHelp_Text_BattleScene::\n\t.string \"BATTLE SCENE$\"\n\nHelp_Text_BattleStyle::\n\t.string \"BATTLE STYLE$\"\n\nHelp_Text_Sound::\n\t.string \"SOUND$\"\n\nHelp_Text_ButtonMode::\n\t.string \"BUTTON MODE$\"\n\nHelp_Text_Frame::\n\t.string \"FRAME$\"\n\nHelp_Text_Cancel2::\n\t.string \"SAVE AND EXIT$\"\n\nHelp_Text_TM::\n\t.string \"TM$\"\n\nHelp_Text_HM::\n\t.string \"HM$\"\n\nHelp_Text_HMMove::\n\t.string \"HM MOVE$\"\n\nHelp_Text_Evolution::\n\t.string \"EVOLUTION$\"\n\nHelp_Text_StatusProblem::\n\t.string \"STATUS PROBLEM$\"\n\nHelp_Text_Pokemon::\n\t.string \"POKéMON$\"\n\nHelp_Text_IDNo2::\n\t.string \"ID No.$\"\n\nHelp_Text_Money2::\n\t.string \"MONEY$\"\n\nHelp_Text_Badges2::\n\t.string \"BADGES$\"\n\nHelp_Text_Version::\n\t.string \"VERSION$\"\n\nHelp_Text_Difficulty::\n\t.string \"DIFFICULTY$\"\n\nHelp_Text_Nuzlocke::\n\t.string \"NUZLOCKE$\"\n\nHelp_Text_Nuzlocke_Catching::\n\t.string \"  Catching POKéMON in NUZLOCKE MODE$\"\n\nHelp_Text_NuzlockeLosing::\n\t.string \"  Losing battles in NUZLOCKE MODE$\"\n\nHelp_Text_IvCalc::\n\t.string \"IV CALCULATION$\"\n\nHelp_Text_EvCalc::\n\t.string \"EV CALCULATION$\"\n\nHelp_Text_NoFreeHeals::\n\t.string \"NO FREE HEALS$\"\n\nHelp_Text_DefineHP::\n\t.string \"HP indicates a POKéMON's vitality.\\n\"\n\t.string \"If a POKéMON's HP drops to zero, it\\l\"\n\t.string \"faints and is unable to battle.\\l\"\n\t.string \"So, the key in battle is to try to\\l\"\n\t.string \"reduce the foe's HP to zero.\\l\"\n\t.string \"If your POKéMON are hurt, restore their\\l\"\n\t.string \"HP at a POKéMON CENTER or use items.$\"\n\nHelp_Text_DefineEXP::\n\t.string \"EXP. Points stands for “Experience\\n\"\n\t.string \"Points.” POKéMON gain EXP. Points by\\l\"\n\t.string \"participating in winning battles.\\l\"\n\t.string \"When a POKéMON accumulates sufficient\\l\"\n\t.string \"EXP. Points, it levels up. The EXP. Bar\\l\"\n\t.string \"indicates accumulated EXP. Points.\\l\"\n\t.string \"It returns to zero upon leveling up.$\"\n\nHelp_Text_DefineMoves::\n\t.string \"POKéMON may learn up to four different\\n\"\n\t.string \"moves. There are many kinds of moves\\l\"\n\t.string \"including attacks and those with\\l\"\n\t.string \"special effects. The kinds of moves\\l\"\n\t.string \"that can be learned vary for each\\l\"\n\t.string \"POKéMON. Some moves can be learned\\l\"\n\t.string \"from items.$\"\n\nHelp_Text_DefineAttack::\n\t.string \"ATTACK indicates the power of an\\n\"\n\t.string \"offensive move. The higher this stat,\\l\"\n\t.string \"the more powerful the move.\\l\"\n\t.string \"It is applied for the following move\\l\"\n\t.string \"types: NORMAL, POISON, GROUND,\\l\"\n\t.string \"FLYING, BUG, FIGHTING, ROCK, GHOST,\\l\"\n\t.string \"and STEEL.$\"\n\nHelp_Text_DefineDefense::\n\t.string \"DEFENSE indicates the resistance a\\n\"\n\t.string \"POKéMON has against physical attacks.\\l\"\n\t.string \"The higher this stat, the less damage\\l\"\n\t.string \"sustained from a foe's physical hit.$\"\n\nHelp_Text_DefineSpAtk::\n\t.string \"SP. ATK (Special Attack) indicates the\\n\"\n\t.string \"power of a special attack move.\\l\"\n\t.string \"The higher this stat, the more powerful\\l\"\n\t.string \"the special attack move.\\l\"\n\t.string \"It is applied for the following move\\l\"\n\t.string \"types: FIRE, WATER, ELECTRIC, GRASS,\\l\"\n\t.string \"ICE, PSYCHIC, DRAGON, and DARK.$\"\n\nHelp_Text_DefineSpDef::\n\t.string \"SP. DEF (Special Defense) indicates\\n\"\n\t.string \"the resistance a POKéMON has against\\l\"\n\t.string \"special attacks.\\l\"\n\t.string \"The higher this stat, the less damage\\l\"\n\t.string \"sustained from a foe's special attack.$\"\n\nHelp_Text_DefineSpeed::\n\t.string \"SPEED indicates the agility of a\\n\"\n\t.string \"POKéMON. If this stat exceeds the foe's\\l\"\n\t.string \"in battle, the POKéMON can make a move\\l\"\n\t.string \"before its slower opponent.$\"\n\nHelp_Text_DefineLevel::\n\t.string \"Lv. (Level) indicates the growth and\\n\"\n\t.string \"strength of a POKéMON.\\l\"\n\t.string \"In general, when a POKéMON levels up,\\l\"\n\t.string \"its stats such as HP, ATTACK, and\\l\"\n\t.string \"DEFENSE rise, making it stronger.\\l\"\n\t.string \"POKéMON may learn a new move upon\\l\"\n\t.string \"leveling up.$\"\n\nHelp_Text_DefineType::\n\t.string \"POKéMON and moves are classified by\\n\"\n\t.string \"type. Every type has advantageous and\\l\"\n\t.string \"disadvantageous matchups against\\l\"\n\t.string \"other types. For example, like a rock-\\l\"\n\t.string \"paper-scissors game, the WATER type is\\l\"\n\t.string \"strong against the FIRE type and weak\\l\"\n\t.string \"against the GRASS type.$\"\n\nHelp_Text_DefineOT::\n\t.string \"OT stands for “Original TRAINER,”\\n\"\n\t.string \"the first TRAINER to have caught the\\l\"\n\t.string \"selected POKéMON.\\l\"\n\t.string \"Even if the POKéMON is traded, the OT\\l\"\n\t.string \"name will remain unchanged.$\"\n\nHelp_Text_DefineItem::\n\t.string \"All POKéMON can be made to hold one\\n\"\n\t.string \"item each. Some items will be used by\\l\"\n\t.string \"the POKéMON automatically in certain\\l\"\n\t.string \"situations. To make a POKéMON hold an\\l\"\n\t.string \"item, select the item from the BAG and\\l\"\n\t.string \"“GIVE” it to the POKéMON.$\"\n\nHelp_Text_DefineAbility::\n\t.string \"All POKéMON have a special ABILITY.\\n\"\n\t.string \"There are many different kinds of these\\l\"\n\t.string \"abilities, some used in battle, some\\l\"\n\t.string \"elsewhere. The abilities differ from\\l\"\n\t.string \"species to species. Some species may\\l\"\n\t.string \"have more than one kind of ability.$\"\n\nHelp_Text_DefineMoney::\n\t.string \"Whenever you win a battle against a\\n\"\n\t.string \"TRAINER, you are given prize money.\\l\"\n\t.string \"Save up your prize money so you can\\l\"\n\t.string \"enjoy shopping at POKéMON MARTS!$\"\n\nHelp_Text_DefineMoveType::\n\t.string \"Moves are also classified by types.\\n\"\n\t.string \"If a POKéMON of a certain type uses\\l\"\n\t.string \"a move of the same type, the move's\\l\"\n\t.string \"power is boosted. If the move's type\\l\"\n\t.string \"has a matchup advantage against the\\l\"\n\t.string \"target, its effectiveness is also\\l\"\n\t.string \"boosted.$\"\n\nHelp_Text_DefineNature::\n\t.string \"All POKéMON have a personality,\\n\"\n\t.string \"or “NATURE.” The POKéMON's\\l\"\n\t.string \"nature appears to affect how the\\l\"\n\t.string \"POKéMON will grow upon leveling up.$\"\n\nHelp_Text_DefineIDNo::\n\t.string \"The ID No. is a special number assigned\\n\"\n\t.string \"specifically to you as a TRAINER.\\l\"\n\t.string \"Together with the OT name, the ID No.\\l\"\n\t.string \"is used to precisely identify the\\l\"\n\t.string \"Original TRAINER.\\l\"\n\t.string \"The ID No. does not change even if the\\l\"\n\t.string \"POKéMON is traded.$\"\n\nHelp_Text_DefinePP::\n\t.string \"PP stands for “Power Points.”\\n\"\n\t.string \"It indicates the number of times a\\l\"\n\t.string \"certain move can be used in battle.\\l\"\n\t.string \"Like HP, PP can be restored by visiting\\l\"\n\t.string \"a POKéMON CENTER or using certain\\l\"\n\t.string \"items.$\"\n\nHelp_Text_DefinePower::\n\t.string \"POWER indicates the strength of an\\n\"\n\t.string \"attack. The higher this number, the\\l\"\n\t.string \"greater the damage that can be\\l\"\n\t.string \"inflicted on the foe!$\"\n\nHelp_Text_DefineAccuracy::\n\t.string \"ACCURACY indicates the probability of\\n\"\n\t.string \"the move hitting the foe.\\l\"\n\t.string \"The higher this number, the more likely\\l\"\n\t.string \"the move will strike the target.$\"\n\nHelp_Text_DefineFNT::\n\t.string \"FNT stands for “fainted.”\\n\"\n\t.string \"A POKéMON faints if its HP is reduced\\l\"\n\t.string \"to zero. It becomes incapable of taking\\l\"\n\t.string \"part in battle.\\l\"\n\t.string \"Restore a fainted POKéMON at a POKéMON\\l\"\n\t.string \"CENTER, or use an item.$\"\n\nHelp_Text_DefineItems::\n\t.string \"Ordinary items bought at any POKéMON\\n\"\n\t.string \"MART are placed in the ITEMS POCKET.\\l\"\n\t.string \"Items may be used, given to a POKéMON\\l\"\n\t.string \"to hold, or tossed out as garbage.$\"\n\nHelp_Text_DefineKeyItems::\n\t.string \"Important items that you find or\\n\"\n\t.string \"receive from people are placed in the\\l\"\n\t.string \"KEY ITEMS POCKET. Key items may be\\l\"\n\t.string \"used, and some may be registered\\l\"\n\t.string \"for use instantly with SELECT. Once\\l\"\n\t.string \"registered, the item can be used\\l\"\n\t.string \"without opening the MENU and BAG.$\"\n\nHelp_Text_DefinePokeBalls::\n\t.string \"POKé BALLS, which are used for\\n\"\n\t.string \"catching wild POKéMON, are placed in\\l\"\n\t.string \"the POKé BALLS POCKET.\\l\"\n\t.string \"POKé BALLS may be bought at POKéMON\\l\"\n\t.string \"MARTS. They may be used, given to a\\l\"\n\t.string \"POKéMON to hold, or tossed out as\\l\"\n\t.string \"garbage.$\"\n\nHelp_Text_DefinePokedex::\n\t.string \"This indicates the number of species of\\n\"\n\t.string \"POKéMON you have caught and/or\\l\"\n\t.string \"evolved to fill the POKéDEX.\\l\"\n\t.string \"Try hard to catch all sorts of\\l\"\n\t.string \"POKéMON!$\"\n\nHelp_Text_DefinePlayTime::\n\t.string \"This is the total amount of time that\\n\"\n\t.string \"you have played this game.$\"\n\nHelp_Text_DefineBadges::\n\t.string \"The POKéMON LEAGUE BADGES that you\\n\"\n\t.string \"have won are registered and shown.\\l\"\n\t.string \"Earn BADGES by defeating GYM LEADERS\\l\"\n\t.string \"in various cities and towns.$\"\n\nHelp_Text_DefineTextSpeed::\n\t.string \"You can adjust how quickly the text is\\n\"\n\t.string \"displayed. Choose one: SLOW, MID,\\l\"\n\t.string \"FAST, or INSTANT.$\"\n\nHelp_Text_DefineBattleScene::\n\t.string \"Press the A Button to go to a submenu\\n\"\n\t.string \"with options to change battle-related\\n\"\n\t.string \"animations and delays.$\"\n\nHelp_Text_DefineBattleStyle::\n\t.string \"You can choose whether or not you can\\n\"\n\t.string \"switch POKéMON after a foe faints.\\l\"\n\t.string \"Set to “SWITCH” if you would like the\\l\"\n\t.string \"chance to switch POKéMON after a foe\\l\"\n\t.string \"faints. Set to “PREDICT” to be told\\l\"\n\t.string \"what the foe's next POKéMON will be\\l\"\n\t.string \"beforehand. “SET” turns this off.$\"\n\nHelp_Text_DefineSound::\n\t.string \"You can choose between MONO and\\n\"\n\t.string \"STEREO sound output.$\"\n\nHelp_Text_DefineButtonMode::\n\t.string \"Set to “HELP” to display help messages\\n\"\n\t.string \"by pressing the L Button.\\l\"\n\t.string \"Set to “LR” to enable the switching\\l\"\n\t.string \"of the POKéDEX pages and BAG POCKETS\\l\"\n\t.string \"using the L and R Buttons.\\l\"\n\t.string \"Set to “L=A” to make the L Button\\l\"\n\t.string \"work the same as the A Button.$\"\n\nHelp_Text_DefineFrame::\n\t.string \"You may choose the design of the frame\\n\"\n\t.string \"around certain menus. Try them out and\\l\"\n\t.string \"see what you like.$\"\n\nHelp_Text_DefineCancel2::\n\t.string \"The settings will be changed to the\\n\"\n\t.string \"selections shown in red, and you will\\l\"\n\t.string \"return to the MENU.$\"\n\nHelp_Text_DefineTM::\n\t.string \"A TM (Technical Machine) is a device\\n\"\n\t.string \"used to teach a move to a POKéMON.\\l\"\n\t.string \"There are many different kinds.\\l\"\n\t.string \"Moves can be taught only to those\\l\"\n\t.string \"POKéMON capable of using them.\\l\"\n\t.string \"A TM breaks after a single use.$\"\n\nHelp_Text_DefineHM::\n\t.string \"An HM (Hidden Machine) is a device used\\n\"\n\t.string \"to teach a HIDDEN move to a POKéMON.\\l\"\n\t.string \"A HIDDEN move can be taught only to\\l\"\n\t.string \"those POKéMON capable of using it.\\l\"\n\t.string \"Unlike a TM, an HM can be used over\\l\"\n\t.string \"and over. A HIDDEN move can be tough\\l\"\n\t.string \"for a POKéMON to forget.$\"\n\nHelp_Text_DefineHMMove::\n\t.string \"HIDDEN moves are those that are\\n\"\n\t.string \"especially important for your\\l\"\n\t.string \"adventure. To use such a move outside\\l\"\n\t.string \"of battle, open the “POKéMON” MENU\\l\"\n\t.string \"and make the POKéMON that knows the\\l\"\n\t.string \"move use it. A fainted POKéMON may use\\l\"\n\t.string \"a HIDDEN move outside of battle.$\"\n\nHelp_Text_DefineEvolution::\n\t.string \"Among POKéMON, there are some that\\n\"\n\t.string \"undergo major changes (evolution) upon\\l\"\n\t.string \"growing to certain levels. Evolution\\l\"\n\t.string \"causes a POKéMON to alter form, change\\l\"\n\t.string \"its name, and perhaps change the moves\\l\"\n\t.string \"it may learn. Some POKéMON evolve\\l\"\n\t.string \"due to reasons other than leveling up.$\"\n\nHelp_Text_DefineStatusProblem::\n\t.string \"Status problems include:\\n\"\n\t.string \"Sleep: Can't use moves.\\l\"\n\t.string \"Poison: Causes steady HP loss.\\l\"\n\t.string \"Paralysis: May prevent moves.\\l\"\n\t.string \"Burn: HP loss and lowers ATTACK.\\l\"\n\t.string \"Freeze: Can't use moves.\\l\"\n\t.string \"These can be healed with items, etc.$\"\n\nHelp_Text_DefinePokemon::\n\t.string \"POKéMON is a name given to describe\\n\"\n\t.string \"wondrous creatures that inhabit all\\l\"\n\t.string \"corners of this world.\\l\"\n\t.string \"People raise POKéMON to be their pets,\\l\"\n\t.string \"use them for battling, and so on.$\"\n\nHelp_Text_DefineIDNo2::\n\t.string \"The ID No. is a special number assigned\\n\"\n\t.string \"specifically to you as a TRAINER.\\l\"\n\t.string \"Together with the OT name, the ID No.\\l\"\n\t.string \"is used to precisely identify the\\l\"\n\t.string \"Original TRAINER.\\l\"\n\t.string \"The ID No. does not change even if the\\l\"\n\t.string \"POKéMON is traded.$\"\n\nHelp_Text_DefineMoney2::\n\t.string \"Whenever you win a battle against a\\n\"\n\t.string \"TRAINER, you are given prize money.\\l\"\n\t.string \"Save up your prize money so you can\\l\"\n\t.string \"enjoy shopping at POKéMON MARTS!$\"\n\nHelp_Text_DefineBadges2::\n\t.string \"This indicates the number of POKéMON\\n\"\n\t.string \"LEAGUE BADGES that you have won.\\l\"\n\t.string \"Earn BADGES by defeating GYM LEADERS\\l\"\n\t.string \"in various cities and towns.$\"\n\nHelp_Text_DefineVersion::\n\t.string \"You can change your game version\\n\"\n\t.string \"between FIRERED VERSION and\\l\"\n\t.string \"LEAFGREEN VERSION. Your game version\\l\"\n\t.string \"determines what POKéMON are available,\\l\"\n\t.string \"themes graphics for some interfaces,\\l\"\n\t.string \"what the titlescreen looks like, and the\\l\"\n\t.string \"text entries of your POKéDEX data.$\"\n\nHelp_Text_DefineDifficulty::\n\t.string \"You can adjust the game's difficulty.\\n\"\n\t.string \"In EASY MODE, POKéMON battles with\\l\"\n\t.string \"TRAINERS are easier than normal.\\l\"\n\t.string \"In CHALLENGE MODE, POKéMON battles\\l\"\n\t.string \"with TRAINERS are more difficult than\\l\"\n\t.string \"normal and BADGE boosts are disabled.\\l\"\n\t.string \"NORMAL MODE is the standard difficulty.$\"\n\nHelp_Text_DefineNuzlocke::\n\t.string \"Turning on the NUZLOCKE key imposes\\n\"\n\t.string \"additional rules on your journey to\\l\"\n\t.string \"increase the difficulty. POKéMON that\\l\"\n\t.string \"have fainted can't be healed, and only\\l\"\n\t.string \"the first wild POKéMON seen in an area\\l\"\n\t.string \"is usable in battle. If you run out of\\l\"\n\t.string \"POKéMON, this key can be turned off.$\"\n\nHelp_Text_DefineNuzlocke_Catching::\n\t.string \"Only the first POKéMON encountered in\\n\"\n\t.string \"an area will be usable in battle.\\l\"\n\t.string \"Further POKéMON caught in the area will\\l\"\n\t.string \"be fainted upon capture. If the first\\l\"\n\t.string \"encounter is a POKéMON that was caught\\l\"\n\t.string \"previously and wasn't fainted, it won't\\l\"\n\t.string \"count as the first if not caught.$\"\n\nHelp_Text_DefineNuzlockeLosing::\n\t.string \"If you lose a battle and white out in\\n\"\n\t.string \"NUZLOCKE MODE, a non-fainted POKéMON\\l\"\n\t.string \"will be withdrawn from the PC STORAGE\\l\"\n\t.string \"SYSTEM. If you don't have any POKéMON\\l\"\n\t.string \"left that can battle, you will be given\\l\"\n\t.string \"the choice to soft reset or to turn off\\l\"\n\t.string \"NUZLOCKE MODE and heal your party.$\"\n\nHelp_Text_DefineIvCalc::\n\t.string \"You can alter how your POKéMON's\\n\"\n\t.string \"potential, or INDIVIDUAL VALUES,\\l\"\n\t.string \"affect their stats. ALL ZERO calculates\\l\"\n\t.string \"stats as if there is no potential, ALL\\l\"\n\t.string \"PERFECT with the best potential, and\\l\"\n\t.string \"STANDARD with actual IVs. This only\\l\"\n\t.string \"alters calculation, not actual IVs.$\"\n\nHelp_Text_DefineEvCalc::\n\t.string \"You can adjust how your POKéMON's\\n\"\n\t.string \"growth from defeating other POKéMON,\\l\"\n\t.string \"or EFFORT VALUES, affect their stats.\\l\"\n\t.string \"ALL ZERO makes stats not affected by\\l\"\n\t.string \"EFFORT VALUES. STANDARD is the normal\\l\"\n\t.string \"way. This only alters stat calculation,\\l\"\n\t.string \"POKéMON will still gain EFFORT VALUES.$\"\n\nHelp_Text_DefineNoFreeHeals::\n\t.string \"You can disable free POKéMON party\\n\"\n\t.string \"heals by switching NO FREE HEALS to ON.\\l\"\n\t.string \"This will disable several full party\\l\"\n\t.string \"heals, most notably from POKéMON\\l\"\n\t.string \"CENTERS. Additionally, the PC STORAGE\\l\"\n\t.string \"SYSTEM will not heal POKéMON sent to\\l\"\n\t.string \"it when ON. To heal, use items instead.$\"\n\nHelp_Text_TheHelpSystem::\n\t.string \"The HELP System$\"\n\nHelp_Text_TheGame::\n\t.string \"The game$\"\n\nHelp_Text_WirelessAdapter::\n\t.string \"Wireless Adapter$\"\n\nHelp_Text_GameFundamentals1::\n\t.string \"Game fundamentals 1$\"\n\nHelp_Text_GameFundamentals2::\n\t.string \"Game fundamentals 2$\"\n\nHelp_Text_GameFundamentals3::\n\t.string \"Game fundamentals 3$\"\n\nHelp_Text_WhatArePokemon::\n\t.string \"What are POKéMON?$\"\n\nHelp_Text_DescTheHelpSystem::\n\t.string \"The help messages change depending on\\n\"\n\t.string \"how much you have progressed in the\\l\"\n\t.string \"game. They are designed to support you\\l\"\n\t.string \"when you need them. If there is\\l\"\n\t.string \"anything that you don't understand,\\l\"\n\t.string \"please look up the HELP System!$\"\n\nHelp_Text_DescTheGame::\n\t.string \"You become the main character to\\n\"\n\t.string \"explore the world of POKéMON!\\l\"\n\t.string \"By talking to people and solving\\l\"\n\t.string \"mysteries, new paths will open to you.\\l\"\n\t.string \"Strive for the goal together with your\\l\"\n\t.string \"wonderful POKéMON!$\"\n\nHelp_Text_DescWirelessAdapter::\n\t.string \"This game communicates over a wireless\\n\"\n\t.string \"link using the Wireless Adapter.\\p\"\n\t.string \"Go wireless anywhere, anytime, and\\n\"\n\t.string \"with anybody!\\p\"\n\t.string \"Try playing with the Wireless Adapter\\n\"\n\t.string \"always attached!$\"\n\nHelp_Text_DescGameFundamentals1::\n\t.string \"Visit every city and town, travel every\\n\"\n\t.string \"road, explore every cave, and face\\l\"\n\t.string \"every challenge as you strive to\\l\"\n\t.string \"become the greatest TRAINER of\\l\"\n\t.string \"POKéMON!$\"\n\nHelp_Text_DescGameFundamentals2::\n\t.string \"On your adventure, you will be faced\\n\"\n\t.string \"with many obstacles. Every obstacle\\l\"\n\t.string \"can be overcome by doing something\\l\"\n\t.string \"or by solving mysteries. Some obstacles\\l\"\n\t.string \"are affected by something that happens\\l\"\n\t.string \"far away.$\"\n\nHelp_Text_DescGameFundamentals3::\n\t.string \"Some of the obstacles in your way can\\n\"\n\t.string \"be removed once your POKéMON learn\\l\"\n\t.string \"specific moves.$\"\n\nHelp_Text_DescWhatArePokemon::\n\t.string \"POKéMON are wondrous creatures that\\n\"\n\t.string \"are shrouded in mystery. You may meet\\l\"\n\t.string \"them all over the world…in tall\\l\"\n\t.string \"grass, caves, the sea, and more.\\l\"\n\t.string \"They appear to grow obedient to the\\l\"\n\t.string \"TRAINERS that caught them.$\"\n\nHelp_Text_UsingTypeMatchupList::\n\t.string \"Using the Type Matchup List$\"\n\nHelp_Text_OwnMoveDark::\n\t.string \"Own move type: DARK$\"\n\nHelp_Text_OwnPokemonDark::\n\t.string \"Own POKéMON type: DARK$\"\n\nHelp_Text_OwnMoveRock::\n\t.string \"Own move type: ROCK$\"\n\nHelp_Text_OwnPokemonRock::\n\t.string \"Own POKéMON type: ROCK$\"\n\nHelp_Text_OwnMovePsychic::\n\t.string \"Own move type: PSYCHIC$\"\n\nHelp_Text_OwnPokemonPsychic::\n\t.string \"Own POKéMON type: PSYCHIC$\"\n\nHelp_Text_OwnMoveFighting::\n\t.string \"Own move type: FIGHTING$\"\n\nHelp_Text_OwnPokemonFighting::\n\t.string \"Own POKéMON type: FIGHTING$\"\n\nHelp_Text_OwnMoveGrass::\n\t.string \"Own move type: GRASS$\"\n\nHelp_Text_OwnPokemonGrass::\n\t.string \"Own POKéMON type: GRASS$\"\n\nHelp_Text_OwnMoveGhost::\n\t.string \"Own move type: GHOST$\"\n\nHelp_Text_OwnPokemonGhost::\n\t.string \"Own POKéMON type: GHOST$\"\n\nHelp_Text_OwnMoveIce::\n\t.string \"Own move type: ICE$\"\n\nHelp_Text_OwnPokemonIce::\n\t.string \"Own POKéMON type: ICE$\"\n\nHelp_Text_OwnMoveGround::\n\t.string \"Own move type: GROUND$\"\n\nHelp_Text_OwnPokemonGround::\n\t.string \"Own POKéMON type: GROUND$\"\n\nHelp_Text_OwnMoveElectric::\n\t.string \"Own move type: ELECTRIC$\"\n\nHelp_Text_OwnPokemonElectric::\n\t.string \"Own POKéMON type: ELECTRIC$\"\n\nHelp_Text_OwnMovePoison::\n\t.string \"Own move type: POISON$\"\n\nHelp_Text_OwnPokemonPoison::\n\t.string \"Own POKéMON type: POISON$\"\n\nHelp_Text_OwnMoveDragon::\n\t.string \"Own move type: DRAGON$\"\n\nHelp_Text_OwnPokemonDragon::\n\t.string \"Own POKéMON type: DRAGON$\"\n\nHelp_Text_OwnMoveNormal::\n\t.string \"Own move type: NORMAL$\"\n\nHelp_Text_OwnPokemonNormal::\n\t.string \"Own POKéMON type: NORMAL$\"\n\nHelp_Text_OwnMoveSteel::\n\t.string \"Own move type: STEEL$\"\n\nHelp_Text_OwnPokemonSteel::\n\t.string \"Own POKéMON type: STEEL$\"\n\nHelp_Text_OwnMoveFlying::\n\t.string \"Own move type: FLYING$\"\n\nHelp_Text_OwnPokemonFlying::\n\t.string \"Own POKéMON type: FLYING$\"\n\nHelp_Text_OwnMoveFire::\n\t.string \"Own move type: FIRE$\"\n\nHelp_Text_OwnPokemonFire::\n\t.string \"Own POKéMON type: FIRE$\"\n\nHelp_Text_OwnMoveWater::\n\t.string \"Own move type: WATER$\"\n\nHelp_Text_OwnPokemonWater::\n\t.string \"Own POKéMON type: WATER$\"\n\nHelp_Text_OwnMoveBug::\n\t.string \"Own move type: BUG$\"\n\nHelp_Text_OwnPokemonBug::\n\t.string \"Own POKéMON type: BUG$\"\n\nHelp_Text_HowToUseTypeMatchupList::\n\t.string \"Depending on the matchup of the\\n\"\n\t.string \"move type and the target POKéMON's\\l\"\n\t.string \"type, the move's effectiveness varies:\\l\"\n\t.string \"{CIRCLE_DOT}: Super effective!\\l\"\n\t.string \"{TRIANGLE}: Not very effective\\l\"\n\t.string \"{BIG_MULT_X}: Not effective at all\\l\"\n\t.string \"(No changes for other matchups.)$\"\n\nHelp_Text_TypeMatchupOwnMoveDark::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: PSYCHIC, GHOST\\p\"\n\t.string \"   {TRIANGLE}: FIGHTING, DARK, STEEL$\"\n\nHelp_Text_TypeMatchupOwnPokemonDark::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: FIGHTING, BUG\\p\"\n\t.string \"   {TRIANGLE}: GHOST, DARK\\p\"\n\t.string \"   {BIG_MULT_X}: PSYCHIC$\"\n\nHelp_Text_TypeMatchupOwnMoveRock::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: FIRE, ICE, FLYING, BUG\\p\"\n\t.string \"   {TRIANGLE}: FIGHTING, GROUND, STEEL$\"\n\nHelp_Text_TypeMatchupOwnPokemonRock::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: WATER, GRASS, FIGHTING,\\n\"\n\t.string \"       GROUND, STEEL\\p\"\n\t.string \"   {TRIANGLE}: NORMAL, FIRE, POISON, FLYING$\"\n\nHelp_Text_TypeMatchupOwnMovePsychic::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: FIGHTING, POISON\\p\"\n\t.string \"   {TRIANGLE}: PSYCHIC, STEEL\\p\"\n\t.string \"   {BIG_MULT_X}: DARK$\"\n\nHelp_Text_TypeMatchupOwnPokemonPsychic::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: BUG, GHOST, DARK\\p\"\n\t.string \"   {TRIANGLE}: FIGHTING, PSYCHIC$\"\n\nHelp_Text_TypeMatchupOwnMoveFighting::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: NORMAL, ICE, ROCK, DARK, STEEL\\p\"\n\t.string \"   {TRIANGLE}: POISON, FLYING, PSYCHIC, BUG\\p\"\n\t.string \"   {BIG_MULT_X}: GHOST$\"\n\nHelp_Text_TypeMatchupOwnPokemonFighting::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: FLYING, PSYCHIC\\p\"\n\t.string \"   {TRIANGLE}: BUG, ROCK, DARK$\"\n\nHelp_Text_TypeMatchupOwnMoveGrass::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: WATER, GROUND, ROCK\\p\"\n\t.string \"   {TRIANGLE}: FIRE, GRASS, POISON, FLYING,\\n\"\n\t.string \"       BUG, DRAGON, STEEL$\"\n\nHelp_Text_TypeMatchupOwnPokemonGrass::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: FIRE, ICE, POISON, FLYING, BUG\\p\"\n\t.string \"   {TRIANGLE}: WATER, ELECTRIC, GRASS, GROUND$\"\n\nHelp_Text_TypeMatchupOwnMoveGhost::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: PSYCHIC, GHOST\\p\"\n\t.string \"   {TRIANGLE}: DARK, STEEL\\p\"\n\t.string \"   {BIG_MULT_X}: NORMAL$\"\n\nHelp_Text_TypeMatchupOwnPokemonGhost::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: GHOST, DARK\\p\"\n\t.string \"   {TRIANGLE}: POISON, BUG\\p\"\n\t.string \"   {BIG_MULT_X}: NORMAL, FIGHTING$\"\n\nHelp_Text_TypeMatchupOwnMoveIce::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: GRASS, GROUND, FLYING, DRAGON\\p\"\n\t.string \"   {TRIANGLE}: FIRE, WATER, ICE, STEEL$\"\n\nHelp_Text_TypeMatchupOwnPokemonIce::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: FIRE, FIGHTING, ROCK, STEEL\\p\"\n\t.string \"   {TRIANGLE}: ICE$\"\n\nHelp_Text_TypeMatchupOwnMoveGround::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: FIRE, ELECTRIC, POISON, ROCK,\\n\"\n\t.string \"       STEEL\\p\"\n\t.string \"   {TRIANGLE}: GRASS, BUG\\n\"\n\t.string \"   {BIG_MULT_X}: FLYING$\"\n\nHelp_Text_TypeMatchupOwnPokemonGround::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: WATER, GRASS, ICE\\p\"\n\t.string \"   {TRIANGLE}: POISON, ROCK\\p\"\n\t.string \"   {BIG_MULT_X}: ELECTRIC$\"\n\nHelp_Text_TypeMatchupOwnMoveElectric::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: WATER, FLYING\\p\"\n\t.string \"   {TRIANGLE}: ELECTRIC, GRASS, DRAGON\\p\"\n\t.string \"   {BIG_MULT_X}: GROUND$\"\n\nHelp_Text_TypeMatchupOwnPokemonElectric::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: GROUND\\p\"\n\t.string \"   {TRIANGLE}: ELECTRIC, FLYING, STEEL$\"\n\nHelp_Text_TypeMatchupOwnMovePoison::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: GRASS\\p\"\n\t.string \"   {TRIANGLE}: POISON, GROUND, ROCK, GHOST\\p\"\n\t.string \"   {BIG_MULT_X}: STEEL$\"\n\nHelp_Text_TypeMatchupOwnPokemonPoison::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: GROUND, PSYCHIC\\p\"\n\t.string \"   {TRIANGLE}: GRASS, FIGHTING, POISON, BUG$\"\n\nHelp_Text_TypeMatchupOwnMoveDragon::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: DRAGON\\p\"\n\t.string \"   {TRIANGLE}: STEEL$\"\n\nHelp_Text_TypeMatchupOwnPokemonDragon::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: ICE, DRAGON\\p\"\n\t.string \"   {TRIANGLE}: FIRE, WATER, ELECTRIC, GRASS$\"\n\nHelp_Text_TypeMatchupOwnMoveNormal::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {TRIANGLE}: ROCK, STEEL\\p\"\n\t.string \"   {BIG_MULT_X}: GHOST$\"\n\nHelp_Text_TypeMatchupOwnPokemonNormal::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: FIGHTING\\p\"\n\t.string \"   {BIG_MULT_X}: GHOST$\"\n\nHelp_Text_TypeMatchupOwnMoveSteel::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: ICE, ROCK\\p\"\n\t.string \"   {TRIANGLE}: FIRE, WATER, ELECTRIC, STEEL$\"\n\nHelp_Text_TypeMatchupOwnPokemonSteel::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: FIRE, FIGHTING, GROUND\\n\"\n\t.string \"   {TRIANGLE}: NORMAL, GRASS, ICE, FLYING,\\l\"\n\t.string \"       PSYCHIC, BUG, ROCK, GHOST,\\l\"\n\t.string \"       DRAGON, DARK, STEEL\\l\"\n\t.string \"   {BIG_MULT_X}: POISON$\"\n\nHelp_Text_TypeMatchupOwnMoveFlying::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: GRASS, FIGHTING, BUG\\p\"\n\t.string \"   {TRIANGLE}: ELECTRIC, ROCK, STEEL$\"\n\nHelp_Text_TypeMatchupOwnPokemonFlying::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: ELECTRIC, ICE, ROCK\\p\"\n\t.string \"   {TRIANGLE}: GRASS, FIGHTING, BUG\\p\"\n\t.string \"   {BIG_MULT_X}: GROUND$\"\n\nHelp_Text_TypeMatchupOwnMoveFire::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: GRASS, ICE, BUG, STEEL\\p\"\n\t.string \"   {TRIANGLE}: FIRE, WATER, ROCK, DRAGON$\"\n\nHelp_Text_TypeMatchupOwnPokemonFire::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: WATER, GROUND, ROCK\\p\"\n\t.string \"   {TRIANGLE}: FIRE, GRASS, ICE, BUG, STEEL$\"\n\nHelp_Text_TypeMatchupOwnMoveWater::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: FIRE, GROUND, ROCK\\p\"\n\t.string \"   {TRIANGLE}: WATER, GRASS, DRAGON$\"\n\nHelp_Text_TypeMatchupOwnPokemonWater::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: ELECTRIC, GRASS\\p\"\n\t.string \"   {TRIANGLE}: FIRE, WATER, ICE, STEEL$\"\n\nHelp_Text_TypeMatchupOwnMoveBug::\n\t.string \"Effect on the opposing POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: GRASS, PSYCHIC, DARK\\p\"\n\t.string \"   {TRIANGLE}: FIRE, FIGHTING, POISON,\\n\"\n\t.string \"       FLYING, GHOST, STEEL$\"\n\nHelp_Text_TypeMatchupOwnPokemonBug::\n\t.string \"Effect of foe's move on own POKéMON:\\p\"\n\t.string \"   {CIRCLE_DOT}: FIRE, FLYING, ROCK\\p\"\n\t.string \"   {TRIANGLE}: GRASS, FIGHTING, GROUND$\"\n\nHelp_Text_UsingOptionsSubmenu::\n\t.string \" Using “BATTLE SCENE”$\"\n\nHelp_Text_HowToUseOptionSubmenu::\n\t.string \"{CIRCLE_1} Select “BATTLE SCENE” on the MENU.\\n\"\n\t.string \"{CIRCLE_2} Press up or down on the {PLUS} Control\\n\"\n\t.string \"   Pad to select an optional item, then\\n\"\n\t.string \"   press left or right to alter the\\n\"\n\t.string \"   settings.\\n\"\n\t.string \"{CIRCLE_3} Press the A or B Button after\\n\"\n\t.string \"   making changes to go back.$\"\n\nHelp_Text_DefineBattleTransitions::\n\t.string \"Set this option to OFF to skip the\\n\"\n\t.string \"animations that play while transitioning\\n\"\n\t.string \"from the field to a battle.\\n\"\n\t.string \"When set to OFF, the screen cuts to\\n\"\n\t.string \"black and then instantly moves to the\\n\"\n\t.string \"battlefield. This does not skip some\\n\"\n\t.string \"special TRAINER battle transitions.$\"\n\nHelp_Text_DefineBattleIntroAnims::\n\t.string \"Set this option to OFF to skip the\\n\"\n\t.string \"sliding animations that happen at the\\n\"\n\t.string \"start of every battle.$\"\n\nHelp_Text_DefineMoveAnimations::\n\t.string \"Set this option to OFF to disable\\n\"\n\t.string \"POKéMON move animations in battle.\\n\"\n\t.string \"\\n\"\n\t.string \"Additionally, pressing the A or B\\n\"\n\t.string \"Buttons will skip in-battle text\\n\"\n\t.string \"delays when this is set to OFF.$\"\n\nHelp_Text_DefineHpBarAnimSpeed::\n\t.string \"You can adjust how quickly the health\\n\"\n\t.string \"bars animate. Choose one: STANDARD,\\n\"\n\t.string \"FAST, FASTER, INSTANT.$\"\n\nHelp_Text_DefineExpBarAnimSpeed::\n\t.string \"You can adjust how quickly the\\n\"\n\t.string \"Experience bar animates. Choose\\n\"\n\t.string \"either STANDARD or INSTANT.$\"\n\nHelp_Text_DefineBack::\n\t.string \"The settings will be changed to the\\n\"\n\t.string \"selections shown in red, and you will\\n\"\n\t.string \"return to the OPTION MENU.$\"\n\nHelp_Text_BattleTransitions::\n\t.string \"BATTLE TRANSITIONS$\"\n\nHelp_Text_BattleIntroAnim::\n\t.string \"BATTLE INTRO ANIM$\"\n\nHelp_Text_MoveAnimations::\n\t.string \"MOVE ANIMATIONS$\"\n\nHelp_Text_HpBarAnimSpeed::\n\t.string \"HP BAR ANIM SPEED$\"\n\nHelp_Text_ExpBarAnimSpeed::\n\t.string \"EXP. BAR ANIM SPEED$\"\n\nHelp_Text_Back::\n\t.string \"BACK$\"\n\nHelp_Text_AdvancedKeys::\n\t.string \"ADVANCED KEYS$\"\n\nHelp_Text_DefineAdvancedKeys::\n\t.string \"Press the A Button to go to a submenu\\n\"\n\t.string \"with options to modify the difficulty\\n\"\n\t.string \"by changing experience gain or adding\\n\"\n\t.string \"additional rules onto the gameplay\\n\"\n\t.string \"experience.$\"\n\nHelp_Text_DefineAdvancedKeysBack::\n\t.string \"The settings will be changed to the\\n\"\n\t.string \"selections shown in red, and you will\\n\"\n\t.string \"return to the KEY SYSTEM MENU.$\"\n\nHelp_Text_UsingKeySystemSubmenu::\n\t.string \" Using “ADVANCED KEYS”$\"\n\nHelp_Text_HowToUseKeySystemSubmenu::\n\t.string \"{CIRCLE_1} Select “ADVANCED KEYS” on the MENU.\\n\"\n\t.string \"{CIRCLE_2} Press up or down on the {PLUS} Control\\n\"\n\t.string \"   Pad to select an optional item, then\\n\"\n\t.string \"   press left or right to alter the\\n\"\n\t.string \"   settings.\\n\"\n\t.string \"{CIRCLE_3} Press the A or B Button after\\n\"\n\t.string \"   making changes to go back.$\"\n\nHelp_Text_ExpMod::\n\t.string \"EXP. MODIFIER$\"\n\nHelp_Text_DefineExpMod::\n\t.string \"This option allows you to modify the\\n\"\n\t.string \"amount of Experience Points your\\l\"\n\t.string \"POKéMON earn from battle.\\l\"\n\t.string \"0× disables Experience Point gains.\\l\"\n\t.string \"1/2× halves given Experience Points.\\l\"\n\t.string \"1× is the standard modifier.\\l\"\n\t.string \"2× doubles given Experience Points.$\"\n\nHelp_Text_FRExclusives::\n\t.string \"  POKéMON exclusive to FIRERED$\"\n\nHelp_Text_LGExclusives::\n\t.string \"  POKéMON exclusive to LEAFGREEN$\"\n\nHelp_Text_DefineFRExclusives::\n\t.string \"The POKéMON exclusive to FIRERED\\n\"\n\t.string \"VERSION are EKANS, ODDISH, PSYDUCK,\\l\"\n\t.string \"GROWLITHE, SHELLDER, SCYTHER,\\l\"\n\t.string \"ELECTABUZZ, WOOPER, MURKROW,\\l\"\n\t.string \"QWILFISH, DELIBIRD, SKARMORY,\\l\"\n\t.string \"LATIOS, and their evolutionary\\l\"\n\t.string \"relatives.$\"\n\nHelp_Text_DefineLGExclusives::\n\t.string \"The POKéMON exclusive to LEAFGREEN\\n\"\n\t.string \"VERSION are SANDSHREW, VULPIX,\\l\"\n\t.string \"BELLSPROUT, SLOWPOKE, STARYU,\\l\"\n\t.string \"MAGMAR, PINSIR, MARILL,\\l\"\n\t.string \"MISDREAVUS, SNEASEL, REMORAID,\\l\"\n\t.string \"MANTINE, LATIAS, and their\\l\"\n\t.string \"evolutionary relatives.$\""
  },
  {
    "path": "data/text/ingame_trade.inc",
    "content": "Trade_Text_LookingForMonWannaTradeForMon::\n\t.string \"I'm looking for the POKéMON\\n\"\n\t.string \"{STR_VAR_1}!\\p\"\n\t.string \"Wanna trade one for my\\n\"\n\t.string \"{STR_VAR_2}?$\"\n\nTrade_Text_AwwOhWell::\n\t.string \"Awww!\\n\"\n\t.string \"Oh, well…$\"\n\nTrade_Text_WhatThatsNoMon::\n\t.string \"What?\\n\"\n\t.string \"That's no {STR_VAR_1}!$\"\n\nTrade_Text_HeyThanks::\n\t.string \"Hey, thanks!$\"\n\nTrade_Text_IsntMyOldMonGreat::\n\t.string \"Isn't my old {STR_VAR_2} great?$\"\n\nTrade_Text_DoYouHaveMonWouldYouTradeForMon::\n\t.string \"Hello, there! Do you happen to\\n\"\n\t.string \"have a {STR_VAR_1}?\\p\"\n\t.string \"Would you agree to a trade for\\n\"\n\t.string \"my {STR_VAR_2}?$\"\n\nTrade_Text_WellIfYouDontWantTo::\n\t.string \"Well, if you don't want to…$\"\n\nTrade_Text_ThisIsntMon::\n\t.string \"Hmmm?\\n\"\n\t.string \"This isn't a {STR_VAR_1}.\\p\"\n\t.string \"Think of me if you get one.$\"\n\nTrade_Text_Thanks::\n\t.string \"Thanks!$\"\n\nTrade_Text_HasTradedMonGrownStronger::\n\t.string \"The {STR_VAR_2} that I traded you,\\n\"\n\t.string \"has it grown stronger?$\"\n\nTrade_Text_DoYouHaveMonWantToTradeForMon::\n\t.string \"Hi!\\n\"\n\t.string \"Do you have a {STR_VAR_1}?\\p\"\n\t.string \"Want to trade it for my\\n\"\n\t.string \"{STR_VAR_2}?$\"\n\nTrade_Text_ThatsTooBad::\n\t.string \"That's too bad.$\"\n\nTrade_Text_ThisIsNoMon::\n\t.string \"…This is no {STR_VAR_1}.\\p\"\n\t.string \"If you get one, trade it with me.$\"\n\nTrade_Text_ThanksYoureAPal::\n\t.string \"Thanks, you're a pal!$\"\n\nTrade_Text_HowIsMyOldMon::\n\t.string \"How is my old {STR_VAR_2}?\\n\"\n\t.string \"My {STR_VAR_1} is doing great!$\"\n"
  },
  {
    "path": "data/text/itemfinder.inc",
    "content": "Text_DugUpItemFromGround::\n\t.string \"{PLAYER} dug up one {STR_VAR_2}\\n\"\n\t.string \"from deep in the ground.$\"\n"
  },
  {
    "path": "data/text/new_game_intro.inc",
    "content": "gOtherText_NewName::\n    .string \"NEW NAME$\"\n\ngNameChoice_Green::\n    .string \"GREEN$\"\n\ngNameChoice_Red::\n    .string \"RED$\"\n\ngNameChoice_Leaf::\n    .string \"LEAF$\"\n\ngNameChoice_Fire::\n    .string \"FIRE$\"\n\ngNameChoice_Gary::\n    .string \"GARY$\"\n\ngNameChoice_Kaz::\n    .string \"KAZ$\"\n\ngNameChoice_Toru::\n    .string \"TORU$\"\n\ngNameChoice_Ash::\n    .string \"ASH$\"\n\ngNameChoice_Kene::\n    .string \"KENE$\"\n\ngNameChoice_Geki::\n    .string \"GEKI$\"\n\ngNameChoice_Jak::\n    .string \"JAK$\"\n\ngNameChoice_Janne::\n    .string \"JANNE$\"\n\ngNameChoice_Jonn::\n    .string \"JONN$\"\n\ngNameChoice_Kamon::\n    .string \"KAMON$\"\n\ngNameChoice_Karl::\n    .string \"KARL$\"\n\ngNameChoice_Taylor::\n    .string \"TAYLOR$\"\n\ngNameChoice_Oscar::\n    .string \"OSCAR$\"\n\ngNameChoice_Hiro::\n    .string \"HIRO$\"\n\ngNameChoice_Max::\n    .string \"MAX$\"\n\ngNameChoice_Jon::\n    .string \"JON$\"\n\ngNameChoice_Ralph::\n    .string \"RALPH$\"\n\ngNameChoice_Kay::\n    .string \"KAY$\"\n\ngNameChoice_Tosh::\n    .string \"TOSH$\"\n\ngNameChoice_Roak::\n    .string \"ROAK$\"\n\ngNameChoice_Omi::\n    .string \"OMI$\"\n\ngNameChoice_Jodi::\n    .string \"JODI$\"\n\ngNameChoice_Amanda::\n    .string \"AMANDA$\"\n\ngNameChoice_Hillary::\n    .string \"HILLARY$\"\n\ngNameChoice_Makey::\n    .string \"MAKEY$\"\n\ngNameChoice_Michi::\n    .string \"MICHI$\"\n\ngNameChoice_Paula::\n    .string \"PAULA$\"\n\ngNameChoice_June::\n    .string \"JUNE$\"\n\ngNameChoice_Cassie::\n    .string \"CASSIE$\"\n\ngNameChoice_Rey::\n    .string \"REY$\"\n\ngNameChoice_Seda::\n    .string \"SEDA$\"\n\ngNameChoice_Kiko::\n    .string \"KIKO$\"\n\ngNameChoice_Mina::\n    .string \"MINA$\"\n\ngNameChoice_Norie::\n    .string \"NORIE$\"\n\ngNameChoice_Sai::\n    .string \"SAI$\"\n\ngNameChoice_Momo::\n    .string \"MOMO$\"\n\ngNameChoice_Suzi::\n    .string \"SUZI$\"\n\ngControlsGuide_Text_Intro::\n    .string \"The various buttons will be explained in\\n\"\n    .string \"the order of their importance.$\"\n\ngControlsGuide_Text_DPad::\n    .string \"Moves the main character.\\n\"\n    .string \"Also used to choose various data\\n\"\n    .string \"headings.$\"\n\ngControlsGuide_Text_AButton::\n    .string \"Used to confirm a choice, check\\n\"\n    .string \"things, chat, and scroll text.$\"\n\ngControlsGuide_Text_BButton::\n    .string \"Used to exit, cancel a choice,\\n\"\n    .string \"and cancel a mode.$\"\n\ngControlsGuide_Text_StartButton::\n    .string \"Press this button to open the\\n\"\n    .string \"MENU.$\"\n\ngControlsGuide_Text_SelectButton::\n    .string \"Used to shift items and to use\\n\"\n    .string \"a registered item.$\"\n\ngControlsGuide_Text_LRButtons::\n    .string \"If you need help playing the\\n\"\n    .string \"game, or on how to do things,\\n\"\n    .string \"press the L Button.$\"\n\ngOakSpeech_Text_AskPlayerGender::\n    .string \"Now tell me. Are you a boy?\\n\"\n    .string \"Or are you a girl?$\"\n\ngPikachuIntro_Text_Page1::\n    .string \"In the world which you are about to\\n\"\n    .string \"enter, you will embark on a grand\\n\"\n    .string \"adventure with you as the hero.\\n\"\n    .string \"\\n\"\n    .string \"Speak to people and check things\\n\"\n    .string \"wherever you go, be it towns, roads,\\n\"\n    .string \"or caves. Gather information and\\n\"\n    .string \"hints from every source.$\"\n\ngPikachuIntro_Text_Page2::\n    .string \"New paths will open to you by helping\\n\"\n    .string \"people in need, overcoming challenges,\\n\"\n    .string \"and solving mysteries.\\n\"\n    .string \"\\n\"\n    .string \"At times, you will be challenged by\\n\"\n    .string \"others and attacked by wild creatures.\\n\"\n    .string \"Be brave and keep pushing on.$\"\n\ngPikachuIntro_Text_Page3::\n    .string \"Through your adventure, we hope\\n\"\n    .string \"that you will interact with all sorts\\n\"\n    .string \"of people and achieve personal growth.\\n\"\n    .string \"That is our biggest objective.\\n\"\n    .string \"\\n\"\n    .string \"Press the A Button, and let your\\n\"\n    .string \"adventure begin!$\"\n\ngOakSpeech_Text_WelcomeToTheWorld::\n    .string \"Hello, there!\\n\"\n    .string \"Glad to meet you!\\p\"\n    .string \"Welcome to the world of POKéMON!\\p\"\n    .string \"My name is OAK.\\p\"\n    .string \"People affectionately refer to me\\n\"\n    .string \"as the POKéMON PROFESSOR.\\p$\"\n\ngOakSpeech_Text_ThisWorld::\n    .string \"This world…$\"\n\ngOakSpeech_Text_IsInhabitedFarAndWide::\n    .string \"…is inhabited far and wide by\\n\"\n    .string \"creatures called POKéMON.\\p$\"\n\ngOakSpeech_Text_IStudyPokemon::\n    .string \"For some people, POKéMON are pets.\\n\"\n    .string \"Others use them for battling.\\p\"\n    .string \"As for myself…\\p\"\n    .string \"I study POKéMON as a profession.\\p$\"\n\ngOakSpeech_Text_TellMeALittleAboutYourself::\n    .string \"But first, tell me a little about\\n\"\n    .string \"yourself.\\p$\"\n\ngOakSpeech_Text_YourNameWhatIsIt::\n    .string \"Let's begin with your name.\\n\"\n    .string \"What is it?\\p$\"\n\ngOakSpeech_Text_SoYourNameIsPlayer::\n    .string \"Right…\\n\"\n    .string \"So your name is {PLAYER}.$\"\n\ngOakSpeech_Text_WhatWasHisName::\n    .string \"This is my grandson.\\p\"\n    .string \"He's been your rival since you both\\n\"\n    .string \"were babies.\\p\"\n    .string \"…Erm, what was his name now?$\"\n\ngOakSpeech_Text_YourRivalsNameWhatWasIt::\n    .string \"Your rival's name, what was it now?$\"\n\ngOakSpeech_Text_ConfirmRivalName::\n    .string \"…Er, was it {RIVAL}?$\"\n\ngOakSpeech_Text_RememberRivalsName::\n    .string \"That's right! I remember now!\\n\"\n    .string \"His name is {RIVAL}!\\p$\"\n\ngOakSpeech_Text_LetsGo::\n    .string \"{PLAYER}!\\p\"\n    .string \"Your very own POKéMON legend is\\n\"\n    .string \"about to unfold!\\p\"\n    .string \"A world of dreams and adventures\\n\"\n    .string \"with POKéMON awaits! Let's go!$\"\n"
  },
  {
    "path": "data/text/obtain_item.inc",
    "content": "Text_ObtainedTheX::\n\t.string \"Obtained the {STR_VAR_2}!$\"\n\nText_BagIsFull::\n\t.string \"The BAG is full…$\"\n\nText_PutItemAway::\n\t.string \"{PLAYER} put the {STR_VAR_2}\\n\"\n\t.string \"in the {STR_VAR_3}.$\"\n\nText_FoundOneItem::\n\t.string \"{PLAYER} found one {STR_VAR_2}!$\"\n\nText_TooBadBagFull::\n\t.string \"Too bad!\\n\"\n\t.string \"The BAG is full…$\"\n\nText_FoundXCoins::\n\t.string \"{PLAYER} found\\n\"\n\t.string \"{STR_VAR_1} {STR_VAR_2}!$\"\n\nText_PutCoinsAwayInCoinCase::\n\t.string \"{PLAYER} put the COINS away in\\n\"\n\t.string \"the COIN CASE.$\"\n\nText_CoinCaseIsFull::\n\t.string \"Too bad!\\n\"\n\t.string \"The COIN CASE is full…$\"\n\nText_NothingToPutThemIn::\n\t.string \"Too bad!\\n\"\n\t.string \"There's nothing to put them in…$\"\n\nText_FoundXItems::\n\t.string \"{PLAYER} found\\n\"\n\t.string \"{STR_VAR_1} {STR_VAR_2}(s)!$\"\n\nText_ObtainedTheDecor::\n\t.string \"Obtained the {STR_VAR_2}!$\"\n\nText_NoRoomForAnotherDecor::\n\t.string \"Too bad! There's no room left for\\n\"\n\t.string \"another {STR_VAR_2}…$\"\n\nText_DecorTransferredToPC::\n\t.string \"The {STR_VAR_2} was transferred\\n\"\n\t.string \"to the PC.$\"\n"
  },
  {
    "path": "data/text/pc.inc",
    "content": "Text_BootedUpPC::\n\t.string \"{PLAYER} booted up the PC.$\"\n\nText_AccessWhichPC::\n\t.string \"Which PC should be accessed?$\"\n\nText_AccessedSomeonesPC::\n\t.string \"Accessed Someone's PC.$\"\n\nText_OpenedPkmnStorage::\n\t.string \"POKéMON Storage System opened.$\"\n\nText_AccessedPlayersPC::\n\t.string \"Accessed {PLAYER}'s PC.$\"\n\nText_AccessedBillsPC::\n\t.string \"Accessed BILL's PC.$\"\n"
  },
  {
    "path": "data/text/pc_transfer.inc",
    "content": "Text_MonSentToBoxInSomeonesPC::\n    .string \"{STR_VAR_2} was transferred to\\n\"\n    .string \"Someone's PC.\\p\"\n    .string \"It was placed in \\n\"\n    .string \"BOX “{STR_VAR_1}.”$\"\n\nText_MonSentToBoxInBillsPC::\n    .string \"{STR_VAR_2} was transferred to\\n\"\n    .string \"BILL'S PC.\\p\"\n    .string \"It was placed in \\n\"\n    .string \"BOX “{STR_VAR_1}.”$\"\n\nText_MonSentToBoxSomeonesBoxFull::\n    .string \"BOX “{STR_VAR_3}” on\\n\"\n    .string \"Someone's PC was full.\\p\"\n    .string \"{STR_VAR_2} was transferred to\\n\"\n    .string \"BOX “{STR_VAR_1}.”$\"\n\nText_MonSentToBoxBillsBoxFull::\n    .string \"BOX “{STR_VAR_3}” on\\n\"\n    .string \"BILL'S PC was full.\\p\"\n    .string \"{STR_VAR_2} was transferred to\\n\"\n    .string \"BOX “{STR_VAR_1}.”$\"\n\nText_PlayerObtainedTheMon::\n    .string \"{PLAYER} obtained\\n\"\n    .string \"the {STR_VAR_1}!$\"\n\nText_NoMoreRoomForPokemon::\n    .string \"There's no more room for POKéMON!\\p\"\n    .string \"The POKéMON BOXES are full and\\n\"\n    .string \"can't accept any more!$\"\n"
  },
  {
    "path": "data/text/poke_mart.inc",
    "content": "Text_MayIHelpYou::\n\t.string \"Hi, there!\\n\"\n\t.string \"May I help you?$\"\n\nText_FillOutQuestionnaire::\n\t.string \"There is a questionnaire.\\n\"\n\t.string \"Would you like to fill it out?$\"\n\nText_QuestionnaireThankYou::\n\t.string \"Thank you for taking the time to\\n\"\n\t.string \"fill out our questionnaire.\\p\"\n\t.string \"Your feedback will be used for\\n\"\n\t.string \"future reference.$\"\n\nText_YouKnowThoseWords::\n\t.string \"Oh, hello!\\n\"\n\t.string \"You know those words?\\p\"\n\t.string \"That means you must know about\\n\"\n\t.string \"the MYSTERY GIFT.\\p\"\n\t.string \"From now on, you should be\\n\"\n\t.string \"receiving MYSTERY GIFTS!$\"\n\nText_YouCanAccessMysteryGift::\n\t.string \"Once you save your game, you can\\n\"\n\t.string \"access the MYSTERY GIFT.$\"\n\nText_ThankYouForAccessingMysteryGift::\n\t.string \"Thank you for accessing the\\n\"\n\t.string \"MYSTERY GIFT System.$\"\n"
  },
  {
    "path": "data/text/pokedex_rating.inc",
    "content": "PokedexRating_Text_HowIsPokedexComingAlong::\n\t.string \"OAK: Good to see you!\\n\"\n\t.string \"How is your POKéDEX coming along?\\p\"\n\t.string \"Here, let me take a look.$\"\n\nPokedexRating_Text_SeenXOwnedY::\n\t.string \"The amount of progress you've made\\n\"\n\t.string \"on your POKéDEX is:\\p\"\n\t.string \"{STR_VAR_1} POKéMON seen and\\n\"\n\t.string \"{STR_VAR_2} POKéMON owned.\\p\"\n\t.string \"{FONT_NORMAL}PROF. OAK's rating:$\"\n\nPokedexRating_Text_LessThan10::\n\t.string \"You still have lots to do.\\p\"\n\t.string \"Go into every patch of grass you\\n\"\n\t.string \"see and look for POKéMON!$\"\n\nPokedexRating_Text_LessThan20::\n\t.string \"It looks as if you're getting on\\n\"\n\t.string \"the right track!\\p\"\n\t.string \"I've given one of my AIDES a FLASH\\n\"\n\t.string \"HM. Make sure you go get it!$\"\n\nPokedexRating_Text_LessThan30::\n\t.string \"Your POKéDEX could use a bit more\\n\"\n\t.string \"volume still!\\p\"\n\t.string \"Try to catch other species of\\n\"\n\t.string \"POKéMON!$\"\n\nPokedexRating_Text_LessThan40::\n\t.string \"Good, it's apparent that you're\\n\"\n\t.string \"trying hard!\\p\"\n\t.string \"I've given one of my AIDES an\\n\"\n\t.string \"ITEMFINDER. Be sure to collect it!$\"\n\nPokedexRating_Text_LessThan50::\n\t.string \"Your POKéDEX is coming along quite\\n\"\n\t.string \"well!\\p\"\n\t.string \"I've given one of my AIDES an\\n\"\n\t.string \"AMULET COIN. Be sure to get it!$\"\n\nPokedexRating_Text_LessThan60::\n\t.string \"Ah, you've finally topped 50\\n\"\n\t.string \"species!\\p\"\n\t.string \"I've given one of my AIDES an EXP.\\n\"\n\t.string \"SHARE. Be sure to go get it!$\"\n\nPokedexRating_Text_LessThan70::\n\t.string \"Hoho! This is turning into quite the\\n\"\n\t.string \"respectable POKéDEX!$\"\n\nPokedexRating_Text_LessThan80::\n\t.string \"Very good!\\p\"\n\t.string \"I think you'll collect even more\\n\"\n\t.string \"POKéMON by going fishing!$\"\n\nPokedexRating_Text_LessThan90::\n\t.string \"Wonderful! Let me guess… You\\n\"\n\t.string \"like to collect things, don't you?$\"\n\nPokedexRating_Text_LessThan100::\n\t.string \"I'm impressed!\\n\"\n\t.string \"It must have been difficult to do!$\"\n\nPokedexRating_Text_LessThan110::\n\t.string \"You've finally hit 100 species!\\n\"\n\t.string \"I can't believe how good you are!$\"\n\nPokedexRating_Text_LessThan120::\n\t.string \"You even have the evolved forms\\n\"\n\t.string \"of POKéMON! Super!$\"\n\nPokedexRating_Text_LessThan130::\n\t.string \"Excellent! Trade with friends to\\n\"\n\t.string \"get some more!$\"\n\nPokedexRating_Text_LessThan140::\n\t.string \"Outstanding!\\n\"\n\t.string \"You've become a real pro at this!$\"\n\nPokedexRating_Text_LessThan150::\n\t.string \"I have nothing left to say!\\n\"\n\t.string \"You're the POKéMON PROFESSOR now!$\"\n\nPokedexRating_Text_Complete::\n\t.string \"Your POKéDEX is entirely complete!\\n\"\n\t.string \"Congratulations!!$\"\n\nPokedexRating_Text_NationalDexSeenXOwnedY::\n\t.string \"And your NATIONAL POKéDEX is:\\p\"\n\t.string \"{STR_VAR_1} POKéMON seen and\\n\"\n\t.string \"{STR_VAR_2} POKéMON owned.$\"\n\nPokedexRating_Text_LookForwardToFilledNationalDex::\n\t.string \"I'll be looking forward to seeing\\n\"\n\t.string \"you fill the NATIONAL POKéDEX!$\"\n\nPokedexRating_Text_YouveCompletedDex::\n\t.string \"Finally…\\p\"\n\t.string \"You've finally completed the\\n\"\n\t.string \"POKéDEX!\\p\"\n\t.string \"It's magnificent!\\n\"\n\t.string \"Truly, this is a fantastic feat!$\"\n\nPokedexRating_Text_Wroooaaarrr::\n\t.string \"Wroooooooaaaaaarrrr!$\"\n\nPokedexRating_Text_ThankYouMadeDreamReality::\n\t.string \"Thank you, {PLAYER}!\\n\"\n\t.string \"Sincerely, thank you!\\l\"\n\t.string \"You've made my dream a reality!$\"\n\nPokedexRating_Text_LoveSeeingYourPokedex::\n\t.string \"OAK: Ah, welcome!\\p\"\n\t.string \"Tell me, how is your POKéDEX\\n\"\n\t.string \"coming along?\\p\"\n\t.string \"Wahaha!\\p\"\n\t.string \"Actually, I know how it is, but I\\n\"\n\t.string \"love seeing it anyway!\\p\"\n\t.string \"Let's see…$\"\n"
  },
  {
    "path": "data/text/pokedude.inc",
    "content": "Pokedude_Text_SpeedierBattlerGoesFirst::\n\t.string \"POKé DUDE: The speedier of the\\n\"\n\t.string \"battlers gets to attack first.$\"\n\nPokedude_Text_MyRattataFasterThanPidgey::\n\t.string \"It looks like my RATTATA was\\n\"\n\t.string \"faster than the PIDGEY.$\"\n\nPokedude_Text_BattlersTakeTurnsAttacking::\n\t.string \"The battlers take turns attacking\\n\"\n\t.string \"and reducing each other's HP.$\"\n\nPokedude_Text_MyRattataWonGetsEXP::\n\t.string \"My RATTATA reduced the foe's HP\\n\"\n\t.string \"to zero, so it wins!\\p\"\n\t.string \"The POKéMON that took part in the\\n\"\n\t.string \"battle get EXP. Points.\\p\"\n\t.string \"When a POKéMON collects enough\\n\"\n\t.string \"EXP. Points, it levels up.\\p\"\n\t.string \"Leveling up makes your POKéMON\\n\"\n\t.string \"stronger than before.$\"\n\nPokedude_Text_UhOhRattataPoisoned::\n\t.string \"POKé DUDE: Uh-oh…\\n\"\n\t.string \"My RATTATA has been poisoned…\\p\"\n\t.string \"If a POKéMON is poisoned, it loses\\n\"\n\t.string \"HP steadily.$\"\n\nPokedude_Text_HealStatusRightAway::\n\t.string \"If a POKéMON develops a status\\n\"\n\t.string \"problem, heal it right away.$\"\n\nPokedude_Text_UsingItemTakesTurn::\n\t.string \"Using an item on a POKéMON uses\\n\"\n\t.string \"up one turn, though.\\p\"\n\t.string \"Now, it's the opponent's turn!$\"\n\nPokedude_Text_YayWeManagedToWin::\n\t.string \"Yay!\\n\"\n\t.string \"We managed to win!$\"\n\nPokedude_Text_WaterNotVeryEffectiveAgainstGrass::\n\t.string \"POKé DUDE: The move BUBBLE is\\n\"\n\t.string \"a WATER-type attack.\\p\"\n\t.string \"The targeted ODDISH is a\\n\"\n\t.string \"GRASS/POISON-type POKéMON.\\p\"\n\t.string \"The WATER-type attack is absorbed\\n\"\n\t.string \"by the GRASS-type POKéMON…\\p\"\n\t.string \"As a result, the move becomes not\\n\"\n\t.string \"very effective, and inflicts only\\l\"\n\t.string \"half the usual damage.$\"\n\nPokedude_Text_GrassEffectiveAgainstWater::\n\t.string \"Uh-oh, this is not good!\\p\"\n\t.string \"The ABSORB attack you just saw\\n\"\n\t.string \"is a GRASS-type move.\\p\"\n\t.string \"POLIWAG is a WATER-type POKéMON.\\p\"\n\t.string \"So, ABSORB becomes super\\n\"\n\t.string \"effective, doubling the damage.$\"\n\nPokedude_Text_LetsTryShiftingMons::\n\t.string \"It's not going to be easy to win\\n\"\n\t.string \"with this matchup…\\p\"\n\t.string \"Let's try shifting POKéMON!$\"\n\nPokedude_Text_ShiftingUsesTurn::\n\t.string \"Shifting POKéMON in and out uses\\n\"\n\t.string \"up one turn.\\p\"\n\t.string \"Now, it's the opponent's turn.$\"\n\nPokedude_Text_ButterfreeDoubleResistsGrass::\n\t.string \"BUTTERFREE is a BUG/FLYING-type\\n\"\n\t.string \"POKéMON.\\p\"\n\t.string \"Against this POKéMON, a GRASS-\\n\"\n\t.string \"type attack…\\p\"\n\t.string \"…inflicts only half the usual\\n\"\n\t.string \"damage on a BUG-type POKéMON…\\p\"\n\t.string \"…And, it also causes only half the\\n\"\n\t.string \"damage on a FLYING-type POKéMON.\\p\"\n\t.string \"Therefore, BUTTERFREE, being a\\n\"\n\t.string \"BUG/FLYING POKéMON, only takes\\l\"\n\t.string \"one quarter of the usual damage.$\"\n\nPokedude_Text_ButterfreeGoodAgainstOddish::\n\t.string \"ODDISH is a GRASS/POISON-type\\n\"\n\t.string \"POKéMON.\\p\"\n\t.string \"A FLYING- or PSYCHIC-type attack\\n\"\n\t.string \"is super effective against it.\\p\"\n\t.string \"One of those types of attacks will\\n\"\n\t.string \"inflict double the usual damage.\\p\"\n\t.string \"Okay, here we go!$\"\n\nPokedude_Text_YeahWeWon::\n\t.string \"Yeah!\\n\"\n\t.string \"We won!$\"\n\nPokedude_Text_WeakenMonBeforeCatching::\n\t.string \"POKé DUDE: When you're trying to\\n\"\n\t.string \"catch a POKéMON, don't throw any\\l\"\n\t.string \"POKé BALLS right away.\\p\"\n\t.string \"First, you need to weaken it by\\n\"\n\t.string \"reducing its HP.$\"\n\nPokedude_Text_BestIfTargetStatused::\n\t.string \"Okay, that should be good enough.\\p\"\n\t.string \"But, if it's possible, it would be\\n\"\n\t.string \"best if the target has a status\\l\"\n\t.string \"problem.\\p\"\n\t.string \"For instance, it would be easier\\n\"\n\t.string \"to catch if it were asleep or\\l\"\n\t.string \"paralyzed.$\"\n\nPokedude_Text_CantDoubleUpOnStatus::\n\t.string \"This will make the POKéMON a lot\\n\"\n\t.string \"easier to catch!\\p\"\n\t.string \"Oh, yes. If you paralyze a\\n\"\n\t.string \"POKéMON, you can't make it fall\\l\"\n\t.string \"asleep on top of paralysis.\\p\"\n\t.string \"In other words, you can't double\\n\"\n\t.string \"up status problems, okay?$\"\n\nPokedude_Text_LetMeThrowBall::\n\t.string \"Okay!\\n\"\n\t.string \"Let me throw my POKé BALL!$\"\n\nPokedude_Text_PickBestKindOfBall::\n\t.string \"Before you throw a POKé BALL,\\n\"\n\t.string \"consider the condition and the\\l\"\n\t.string \"type of POKéMON, and pick the kind\\l\"\n\t.string \"of BALL that would work best.$\"\n"
  },
  {
    "path": "data/text/route23.inc",
    "content": "Text_OnlySkilledTrainersAllowedThrough::\n\t.string \"Only truly skilled TRAINERS are\\n\"\n\t.string \"allowed through.\\p\"\n\t.string \"You don't have the {STR_VAR_1}\\n\"\n\t.string \"yet!$\"\n\nText_CantLetYouPass::\n\t.string \"Rules are rules.\\n\"\n\t.string \"I can't let you pass.$\"\n\nText_OhThatsBadgeGoRightAhead::\n\t.string \"Oh! That is the {STR_VAR_1}!\\n\"\n\t.string \"Go right ahead.$\"\n\nText_OnlyPassWithBadgeDontHaveYet::\n\t.string \"You can pass here only if you have\\n\"\n\t.string \"the {STR_VAR_1}.\\p\"\n\t.string \"You don't have the {STR_VAR_1}\\n\"\n\t.string \"yet.\\p\"\n\t.string \"You have to have it to get to\\n\"\n\t.string \"the POKéMON LEAGUE.$\"\n\nText_OnlyPassWithBadgeOhGoAhead::\n\t.string \"You can pass here only if you have\\n\"\n\t.string \"the {STR_VAR_1}.\\p\"\n\t.string \"Oh! That is the {STR_VAR_1}!{PAUSE_MUSIC}{PLAY_BGM}{MUS_LEVEL_UP}{PAUSE 0x60}{RESUME_MUSIC}\\p\"\n\t.string \"Okay, then.\\n\"\n\t.string \"Please, go right ahead.$\"\n"
  },
  {
    "path": "data/text/safari_zone.inc",
    "content": "@ The text here is a copy/paste from Hoenn's Safari Zone, and any unused text was left untranslated\n\nSafariZone_Text_WouldYouLikeToExit::\n\t.string \"Would you like to exit the SAFARI\\n\"\n\t.string \"ZONE right now?$\"\n\nSafariZone_Text_TimesUp::\n\t.string \"PA: Ding-dong!\\p\"\n\t.string \"Time's up!\\p\"\n\t.string \"PA: Your SAFARI GAME is over!$\"\n\nSafariZone_Text_OutOfBalls::\n\t.string \"PA: Ding-dong!\\p\"\n\t.string \"You are out of SAFARI BALLS!\\p\"\n\t.string \"PA: Your SAFARI GAME is over!$\"\n\nSafariZone_Text_ExcuseMeYourPCBoxIsFull::\n\t.string \"Excuse me!\\n\"\n\t.string \"Your PC BOX is full.$\"\n\n"
  },
  {
    "path": "data/text/save.inc",
    "content": "gText_WouldYouLikeToSaveTheGame::\n\t.string \"Would you like to save the game?$\"\n\ngText_AlreadySaveFile_WouldLikeToOverwrite::\n\t.string \"There is already a saved file.\\n\"\n\t.string \"Is it okay to overwrite it?$\"\n\ngText_SavingDontTurnOffThePower::\n\t.string \"SAVING…\\n\"\n\t.string \"DON'T TURN OFF THE POWER.$\"\n\ngText_PlayerSavedTheGame::\n\t.string \"{PLAYER} saved the game.$\"\n\ngText_DifferentGameFile::\n\t.string \"WARNING!\\p\"\n\t.string \"There is a different game file that\\n\"\n\t.string \"is already saved.\\p\"\n\t.string \"If you save now, the other file's\\n\"\n\t.string \"adventure, including items and\\l\"\n\t.string \"POKéMON, will be entirely lost.\\p\"\n\t.string \"Are you sure you want to save now\\n\"\n\t.string \"and overwrite the other save file?$\"\n"
  },
  {
    "path": "data/text/seagallop.inc",
    "content": "Text_AllAboardSeagallopNum::\n\t.string \"All right!\\n\"\n\t.string \"All aboard SEAGALLOP HI-SPEED {STR_VAR_1}!$\"\n"
  },
  {
    "path": "data/text/sign_lady.inc",
    "content": "@ For the NPC in Pallet Town that talks about the Trainer Tips sign\n\nPalletTown_Text_HmmIsThatRight::\n\t.string \"Hmm…\\n\"\n\t.string \"Is that right…$\"\n\nPalletTown_Text_OhLookLook::\n\t.string \"Oh!\\n\"\n\t.string \"Look, look!$\"\n\nPalletTown_Text_ReadItReadIt::\n\t.string \"Read it, read it!$\"\n\n@ Used by sign\nPalletTown_Text_PressStartToOpenMenu::\n\t.string \"TRAINER TIPS\\p\"\n\t.string \"Press START to open the MENU!$\"\n\nPalletTown_Text_SignsAreUsefulArentThey::\n\t.string \"Signs are useful, aren't they?$\"\n\nPalletTown_Text_LookCopiedTrainerTipsSign::\n\t.string \"Look, look!\\p\"\n\t.string \"I copied what it said on one of\\n\"\n\t.string \"those TRAINER TIPS signs!$\"\n\n@ Used by NPC\nPalletTown_Text_PressStartToOpenMenuCopy::\n\t.string \"TRAINER TIPS!\\p\"\n\t.string \"Press START to open the MENU!$\"\n"
  },
  {
    "path": "data/text/surf.inc",
    "content": "Text_WantToSurf::\n\t.string \"The water is dyed a deep blue…\\n\"\n\t.string \"Would you like to SURF?$\"\n\nText_UsedSurf::\n\t.string \"{STR_VAR_1} used SURF!$\"\n\nText_CurrentTooFast::\n\t.string \"The current is much too fast!\\n\"\n\t.string \"SURF can't be used here…$\"\n"
  },
  {
    "path": "data/text/trainer_card.inc",
    "content": "CeladonCity_GameCorner_Text_TryPokemonPrinter::\n\t.string \"It's a POKéMON PRINTER!\\p\"\n\t.string \"It can put a print of your POKéMON\\n\"\n\t.string \"on the back of your TRAINER CARD.\\p\"\n\t.string \"It costs only ¥50.\\n\"\n\t.string \"Would you like to try it?$\"\n\nCeladonCity_GameCorner_Text_DontHaveEnoughMoney::\n\t.string \"You don't have enough money.$\"\n\nCeladonCity_GameCorner_Text_ChoosePrintType::\n\t.string \"Please choose the print type.$\"\n\nCeladonCity_GameCorner_Text_BigSmileForPhoto::\n\t.string \"A big smile for the photo, please!\\n\"\n\t.string \"Three… Two… One…\\p\"\n\t.string \"Flash!$\"\n\nCeladonCity_GameCorner_Text_PrintIsReadyCheckTrainerCard::\n\t.string \"Your POKéMON print is ready!\\n\"\n\t.string \"Check your TRAINER CARD.$\"\n\nFourIsland_House2_Text_WishICouldShowOffStickers::\n\t.string \"Giggle…\\n\"\n\t.string \"I collected a ton of STICKERS.\\l\"\n\t.string \"I wish I could show them off…$\"\n\nFourIsland_House2_Text_GiveYouStickerIfYouBrag::\n\t.string \"Oh, excellent!\\n\"\n\t.string \"You've come to the right place!\\p\"\n\t.string \"Look, look! See? See?\\n\"\n\t.string \"These are my STICKERS!\\l\"\n\t.string \"Look how many I got!\\p\"\n\t.string \"I bet you want some.\\n\"\n\t.string \"I bet you do!\\p\"\n\t.string \"I'll give a STICKER if you can tell\\n\"\n\t.string \"me something awesome about\\l\"\n\t.string \"yourself.\\p\"\n\t.string \"What will you brag about?$\"\n\nFourIsland_House2_Text_BragAboutSomethingForMe::\n\t.string \"Brag about something for me.\\n\"\n\t.string \"I'll give you a STICKER.$\"\n\nFourIsland_House2_Text_BragAboutWhatToday::\n\t.string \"Oh, hi!\\n\"\n\t.string \"Here comes the braggart.\\p\"\n\t.string \"What are you going to brag about\\n\"\n\t.string \"today?$\"\n\nFourIsland_House2_Text_WowHoFLowest::\n\t.string \"Oh, wow, you made it into the\\n\"\n\t.string \"HALL OF FAME.\\p\"\n\t.string \"That's pretty good, yup!\\n\"\n\t.string \"I'll give you one of these.$\"\n\nFourIsland_House2_Text_WowHoFLow::\n\t.string \"Oh, wow, you've entered the\\n\"\n\t.string \"HALL OF FAME often!\\p\"\n\t.string \"That's impressive, yup!\\n\"\n\t.string \"I'll give you one of these.$\"\n\nFourIsland_House2_Text_WowHoFHigh::\n\t.string \"Whoa! You've made it into the\\n\"\n\t.string \"HALL OF FAME that often?\\l\"\n\t.string \"That's seriously incredible, yup!\\p\"\n\t.string \"You own the POKéMON LEAGUE!\\n\"\n\t.string \"I'll give you one of these.$\"\n\nFourIsland_House2_Text_WowHoFHighest::\n\t.string \"No way! You've gone into the\\n\"\n\t.string \"HALL OF FAME that many times?\\p\"\n\t.string \"You're beyond incredible, yup!\\n\"\n\t.string \"That's it, I have to give you this.$\"\n\nFourIsland_House2_Text_HoFStickerApplied::\n\t.string \"The HALL OF FAME STICKER was\\n\"\n\t.string \"applied to the TRAINER CARD.$\"\n\nFourIsland_House2_Text_ComeBackWithBetterStoryHoF::\n\t.string \"Hmm…\\p\"\n\t.string \"Come back with a better story next\\n\"\n\t.string \"time, okay?$\"\n\nFourIsland_House2_Text_LivingLegendHoF::\n\t.string \"Oh, no, no can do.\\p\"\n\t.string \"You're practically a living legend.\\n\"\n\t.string \"I have no SITCKERS left to give.$\"\n\nFourIsland_House2_Text_WowEggsLowest::\n\t.string \"Oh, wow, there are POKéMON EGGS?\\n\"\n\t.string \"I didn't know that!\\p\"\n\t.string \"That's pretty good, yup!\\n\"\n\t.string \"I'll give you one of these.$\"\n\nFourIsland_House2_Text_WowEggsLow::\n\t.string \"You've hatched that many EGGS?\\n\"\n\t.string \"You really must like them!\\p\"\n\t.string \"That's impressive, yup!\\n\"\n\t.string \"I'll give you one of these.$\"\n\nFourIsland_House2_Text_WowEggsHigh::\n\t.string \"Whoa! You've hatched a whole\\n\"\n\t.string \"bunch of EGGS!\\p\"\n\t.string \"You're an EGG-hatching machine!\\n\"\n\t.string \"I'll give you one of these.$\"\n\nFourIsland_House2_Text_WowEggsHighest::\n\t.string \"Wh… You hatched that many EGGS?\\p\"\n\t.string \"What's behind your love of EGGS?\\n\"\n\t.string \"It's beyond incredible, yup!\\p\"\n\t.string \"You're too awesome, I tell you.\\n\"\n\t.string \"That's it, I have to give you this.$\"\n\nFourIsland_House2_Text_EggStickerApplied::\n\t.string \"The EGG STICKER was applied\\n\"\n\t.string \"to the TRAINER CARD.$\"\n\nFourIsland_House2_Text_ComeBackWithBetterStoryEggs::\n\t.string \"Hmm…\\p\"\n\t.string \"Come back with a better story next\\n\"\n\t.string \"time, okay?$\"\n\nFourIsland_House2_Text_LivingLegendEggs::\n\t.string \"Oh, no, no can do.\\p\"\n\t.string \"You're practically a living legend.\\n\"\n\t.string \"I have no SITCKERS left to give.$\"\n\nFourIsland_House2_Text_WowLinkWinsLowest::\n\t.string \"Oh, wow, you've had success\\n\"\n\t.string \"link battling?\\p\"\n\t.string \"You're pretty strong, yup!\\n\"\n\t.string \"I'll give you one of these.$\"\n\nFourIsland_House2_Text_WowLinkWinsLow::\n\t.string \"You've beaten your friends a lot\\n\"\n\t.string \"link battling, huh?\\p\"\n\t.string \"You're impressively strong, yup!\\n\"\n\t.string \"I'll give you one of these.$\"\n\nFourIsland_House2_Text_WowLinkWinsHigh::\n\t.string \"Whoa! You've beaten your friends\\n\"\n\t.string \"a frightful number of times.\\p\"\n\t.string \"Have you lost friends over this?\\n\"\n\t.string \"I'll give you one of these.$\"\n\nFourIsland_House2_Text_WowLinkWinsHighest::\n\t.string \"Wh… Wickedly whoa!\\n\"\n\t.string \"You've won mind-blowingly often!\\p\"\n\t.string \"It just knocks me out thinking\\n\"\n\t.string \"about how tough you are.\\p\"\n\t.string \"You're the stuff of nightmares!\\n\"\n\t.string \"That's it, I have to give you this.$\"\n\nFourIsland_House2_Text_VictoryStickerApplied::\n\t.string \"The VICTORY STICKER was applied\\n\"\n\t.string \"to the TRAINER CARD.$\"\n\nFourIsland_House2_Text_ComeBackWithBetterStoryLinkWins::\n\t.string \"Hmm…\\p\"\n\t.string \"Come back with a better story next\\n\"\n\t.string \"time, okay?$\"\n\nFourIsland_House2_Text_LivingLegendLinkWins::\n\t.string \"Oh, no, no can do.\\p\"\n\t.string \"You're practically a living legend.\\n\"\n\t.string \"I have no SITCKERS left to give.$\"\n"
  },
  {
    "path": "data/text/trainers.inc",
    "content": "VSSeeker_Text_BatteryNotChargedNeedXSteps::\n\t.string \"The battery isn't charged enough.\\p\"\n\t.string \"No. of steps required to fully\\n\"\n\t.string \"charge the battery: {STR_VAR_1}{PAUSE_UNTIL_PRESS}$\"\n\nVSSeeker_Text_NoTrainersWithinRange::\n\t.string \"There are no TRAINERS within range\\n\"\n\t.string \"who can battle…\\p\"\n\t.string \"The VS SEEKER was turned off.{PAUSE_UNTIL_PRESS}$\"\n\nVSSeeker_Text_TrainersNotReady::\n\t.string \"The other TRAINERS don't appear\\n\"\n\t.string \"to be ready for battle.\\p\"\n\t.string \"Let's wait till later.{PAUSE_UNTIL_PRESS}$\"\n\nRoute3_Text_ColtonRematchIntro::\n\t.string \"Hey!\\n\"\n\t.string \"I saw you in VIRIDIAN FOREST!$\"\n\nRoute3_Text_BenRematchIntro::\n\t.string \"Hi! I like shorts!\\n\"\n\t.string \"They're comfy and easy to wear!\\p\"\n\t.string \"You should be wearing shorts, too!$\"\n\nRoute3_Text_JaniceRematchIntro::\n\t.string \"Excuse me!\\n\"\n\t.string \"You keep looking at me, don't you?$\"\n\nRoute3_Text_GregRematchIntro::\n\t.string \"You're a TRAINER, aren't you?\\n\"\n\t.string \"Let's get with it right away!$\"\n\nRoute3_Text_SallyRematchIntro::\n\t.string \"That look you give me…\\n\"\n\t.string \"It intrigues me so!$\"\n\nRoute3_Text_CalvinRematchIntro::\n\t.string \"Hey! What's wrong with you?\\n\"\n\t.string \"You're still not wearing shorts!$\"\n\nRoute3_Text_JamesRematchIntro::\n\t.string \"I'll battle you with the POKéMON\\n\"\n\t.string \"I started raising.$\"\n\nRoute3_Text_RobinRematchIntro::\n\t.string \"Eek!\\n\"\n\t.string \"Did you push me?$\"\n\nRoute4_Text_CrissyRematchIntro::\n\t.string \"I always catch mushroom POKéMON\\n\"\n\t.string \"on MT. MOON.$\"\n\nRoute6_Text_RickyRematchIntro::\n\t.string \"Oh! You're that nosy kid who\\n\"\n\t.string \"eavesdropped on us!$\"\n\nRoute6_Text_NancyRematchIntro::\n\t.string \"Excuse me! Didn't I tell you that\\n\"\n\t.string \"this is a private conversation?\\p\"\n\t.string \"You shouldn't be listening in,\\n\"\n\t.string \"you uncouth person!$\"\n\nRoute6_Text_KeigoRematchIntro::\n\t.string \"I'm trying to find something good\\n\"\n\t.string \"that's not a BUG POKéMON, but…$\"\n\nRoute6_Text_JeffRematchIntro::\n\t.string \"Huh?\\n\"\n\t.string \"You want to go with me again?$\"\n\nRoute6_Text_IsabelleRematchIntro::\n\t.string \"Me?\\n\"\n\t.string \"Well, okay. I'll play this once.$\"\n\nRoute6_Text_ElijahRematchIntro::\n\t.string \"Hey, long time!\\n\"\n\t.string \"Have you gotten better?$\"\n\nRoute8_Text_AidanRematchIntro::\n\t.string \"You are good at POKéMON, but how\\n\"\n\t.string \"is your chemistry grade?$\"\n\nRoute8_Text_StanRematchIntro::\n\t.string \"All right!\\n\"\n\t.string \"Let's play another game!$\"\n\nRoute8_Text_GlennRematchIntro::\n\t.string \"You need strategy to win at\\n\"\n\t.string \"battling.\\p\"\n\t.string \"Are you following my advice?$\"\n\nRoute8_Text_PaigeRematchIntro::\n\t.string \"I've collected many NIDORAN.\\n\"\n\t.string \"I don't want them to evolve, but…$\"\n\nRoute8_Text_LeslieRematchIntro::\n\t.string \"School is fun, but I still think\\n\"\n\t.string \"POKéMON are fun, too.$\"\n\nRoute8_Text_AndreaRematchIntro::\n\t.string \"MEOWTH and PERSIAN are so cute,\\n\"\n\t.string \"meow, meow, meow!$\"\n\nRoute8_Text_MeganRematchIntro::\n\t.string \"We may look silly standing here\\n\"\n\t.string \"like this, but I can still battle.$\"\n\nRoute8_Text_RichRematchIntro::\n\t.string \"I'm a rambling, gambling dude!\\n\"\n\t.string \"I'm on a winning streak!$\"\n\nRoute8_Text_JuliaRematchIntro::\n\t.string \"What's a cute, round, and fluffy\\n\"\n\t.string \"POKéMON?\\p\"\n\t.string \"You already know, don't you?$\"\n\nRoute8_Text_RicardoRematchIntro::\n\t.string \"My bike's still acting up, man.$\"\n\nRoute8_Text_JarenRematchIntro::\n\t.string \"Okay, kid!\\n\"\n\t.string \"Don't expect mercy this time!$\"\n\nRoute8_Text_EliRematchIntro::\n\t.string \"ELI: Our twin power became even\\n\"\n\t.string \"better!$\"\n\nRoute8_Text_AnneRematchIntro::\n\t.string \"ANNE: Our twin power powered up!$\"\n\nRoute9_Text_AliciaRematchIntro::\n\t.string \"We're to battle again?\\n\"\n\t.string \"This time, you're mine!$\"\n\nRoute9_Text_ChrisRematchIntro::\n\t.string \"I haven't forgotten you were with\\n\"\n\t.string \"those good-looking POKéMON.$\"\n\nRoute9_Text_DrewRematchIntro::\n\t.string \"I'm taking ROCK TUNNEL to go to\\n\"\n\t.string \"LAVENDER…\\p\"\n\t.string \"But I keep getting stopped by\\n\"\n\t.string \"everyone along the way…$\"\n\nRoute9_Text_CaitlinRematchIntro::\n\t.string \"Don't you dare patronize me today!\\n\"\n\t.string \"We're playing for keeps!$\"\n\nRoute9_Text_JeremyRematchIntro::\n\t.string \"Bwahaha!\\n\"\n\t.string \"Great! I was bored again, eh!$\"\n\nRoute9_Text_BriceRematchIntro::\n\t.string \"Hahaha!\\n\"\n\t.string \"A little toughie, as always!$\"\n\nRoute9_Text_BrentRematchIntro::\n\t.string \"I got up early every day to train\\n\"\n\t.string \"my POKéMON from cocoons!$\"\n\nRoute9_Text_AlanRematchIntro::\n\t.string \"Hahahaha!\\n\"\n\t.string \"I'll win this time!$\"\n\nRoute9_Text_ConnerRematchIntro::\n\t.string \"Go win, my super BUG POKéMON!$\"\n\nRoute10_Text_MarkRematchIntro::\n\t.string \"Wow, you came here again?\\n\"\n\t.string \"Maybe you're a POKéMANIAC, too?\\l\"\n\t.string \"Want to see my collection?$\"\n\nRoute10_Text_ClarkRematchIntro::\n\t.string \"Ha-hahah-ah-ha!\\n\"\n\t.string \"I can't stop sneezing!$\"\n\nRoute10_Text_HermanRematchIntro::\n\t.string \"Hi, kid!\\n\"\n\t.string \"Did I show you my POKéMON?$\"\n\nRoute10_Text_HeidiRematchIntro::\n\t.string \"I went out to a POKéMON GYM again.\\p\"\n\t.string \"…But I lost as usual.$\"\n\nRoute10_Text_TrentRematchIntro::\n\t.string \"Ah!\\n\"\n\t.string \"This mountain air is delicious!\\l\"\n\t.string \"It's so good, I can't leave!$\"\n\nRoute10_Text_CarolRematchIntro::\n\t.string \"My head is starting to spin.\\n\"\n\t.string \"I've been hiking for too long…$\"\n\nRoute11_Text_HugoRematchIntro::\n\t.string \"Win, lose, or draw!\\n\"\n\t.string \"Now for our rematch!$\"\n\nRoute11_Text_JasperRematchIntro::\n\t.string \"Competing is the ultimate thrill.\\n\"\n\t.string \"I still can't get enough!$\"\n\nRoute11_Text_EddieRematchIntro::\n\t.string \"You know, right?\\n\"\n\t.string \"Let's go, but don't cheat!$\"\n\nRoute11_Text_BraxtonRematchIntro::\n\t.string \"Hi, there!\\p\"\n\t.string \"But be careful!\\n\"\n\t.string \"I'm still laying down some cables!$\"\n\nRoute11_Text_DillonRematchIntro::\n\t.string \"I became a TRAINER a while ago.\\n\"\n\t.string \"But, I think I can win.$\"\n\nRoute11_Text_DirkRematchIntro::\n\t.string \"Fwahaha!\\n\"\n\t.string \"I have never lost!\\p\"\n\t.string \"…And if I did, I've forgotten all\\n\"\n\t.string \"about it!$\"\n\nRoute11_Text_DarianRematchIntro::\n\t.string \"I have never won before…\\p\"\n\t.string \"Perhaps I am destined to remain\\n\"\n\t.string \"that way…$\"\n\nRoute11_Text_YasuRematchIntro::\n\t.string \"I'm the best in my class.\\n\"\n\t.string \"I train every morning and night!$\"\n\nRoute11_Text_BernieRematchIntro::\n\t.string \"Keep your eyes out for live wires!$\"\n\nRoute11_Text_DaveRematchIntro::\n\t.string \"I raised my POKéMON carefully.\\n\"\n\t.string \"They should be ready by now.\\l\"\n\t.string \"This time, they should win, too.$\"\n\nRoute12_Text_NedRematchIntro::\n\t.string \"Yeah!\\n\"\n\t.string \"I got a bite, here!\\l\"\n\t.string \"Th-this might be the real thing!$\"\n\nRoute12_Text_ChipRematchIntro::\n\t.string \"You're finally here.\\n\"\n\t.string \"Fishing is a waiting game.$\"\n\nRoute12_Text_JustinRematchIntro::\n\t.string \"Still can't find a MOON STONE…\\n\"\n\t.string \"Have you found one?$\"\n\nRoute12_Text_LucaRematchIntro::\n\t.string \"Electricity has always been my\\n\"\n\t.string \"specialty.\\p\"\n\t.string \"I don't know a thing about POKéMON\\n\"\n\t.string \"of the sea, though.$\"\n\nRoute12_Text_HankRematchIntro::\n\t.string \"The FISHING FOOL vs. POKéMON KID!\\n\"\n\t.string \"Another round, fight!$\"\n\nRoute12_Text_ElliotRematchIntro::\n\t.string \"I love fishing, don't get me wrong.\\n\"\n\t.string \"But, I wish I had more work…\\l\"\n\t.string \"…It's hard to give up fishing!$\"\n\nRoute12_Text_AndrewRematchIntro::\n\t.string \"What's catching?\\p\"\n\t.string \"You'll never know unless you beat\\n\"\n\t.string \"me!$\"\n\nRoute12_Text_JesRematchIntro::\n\t.string \"JES: I'll win here today and\\n\"\n\t.string \"propose to my GIA.$\"\n\nRoute12_Text_GiaRematchIntro::\n\t.string \"GIA: Hey, JES…\\n\"\n\t.string \"I've been waiting a long time now.\\p\"\n\t.string \"If we win today, I'll marry you!$\"\n\nRoute13_Text_SebastianRematchIntro::\n\t.string \"My bird POKéMON remember you!$\"\n\nRoute13_Text_SusieRematchIntro::\n\t.string \"I want to be the best TRAINER \\n\"\n\t.string \"while I'm a kid!$\"\n\nRoute13_Text_ValerieRematchIntro::\n\t.string \"Wow!\\n\"\n\t.string \"You got more cool BADGES!$\"\n\nRoute13_Text_GwenRematchIntro::\n\t.string \"My cutely grown POKéMON wish to\\n\"\n\t.string \"become reacquainted with you.$\"\n\nRoute13_Text_AlmaRematchIntro::\n\t.string \"I cleaned out my savings and\\n\"\n\t.string \"bought more CARBOS.$\"\n\nRoute13_Text_PerryRematchIntro::\n\t.string \"I'm not going to lose this time.\\n\"\n\t.string \"The wind's blowing my way!$\"\n\nRoute13_Text_LolaRematchIntro::\n\t.string \"Oh, you're back?\\p\"\n\t.string \"Sure, I'll play again with you,\\n\"\n\t.string \"sweetie.$\"\n\nRoute13_Text_SheilaRematchIntro::\n\t.string \"Can't you forget that you battled\\n\"\n\t.string \"with me?$\"\n\nRoute13_Text_JaredRematchIntro::\n\t.string \"What're you starin' at?$\"\n\nRoute13_Text_RobertRematchIntro::\n\t.string \"I always go with bird POKéMON.\\n\"\n\t.string \"I've dedicated myself to them.$\"\n\nRoute14_Text_CarterRematchIntro::\n\t.string \"I used TMs to teach good moves\\n\"\n\t.string \"to my POKéMON.$\"\n\nRoute14_Text_MitchRematchIntro::\n\t.string \"My bird POKéMON should be ready\\n\"\n\t.string \"for battle this time.$\"\n\nRoute14_Text_BeckRematchIntro::\n\t.string \"Are you using TMs on POKéMON?\\n\"\n\t.string \"Just holding them is useless.$\"\n\nRoute14_Text_MarlonRematchIntro::\n\t.string \"Have you taught your bird POKéMON\\n\"\n\t.string \"how to FLY?\\p\"\n\t.string \"You'll be able to soar with it into\\n\"\n\t.string \"the sky! Give it a try.$\"\n\nRoute14_Text_DonaldRematchIntro::\n\t.string \"The legend of the winged mirages…\\n\"\n\t.string \"You've heard it, right?$\"\n\nRoute14_Text_BennyRematchIntro::\n\t.string \"I'm really not into it, but okay.\\n\"\n\t.string \"Let's go!$\"\n\nRoute14_Text_LukasRematchIntro::\n\t.string \"Hey!\\n\"\n\t.string \"I remember you!\\p\"\n\t.string \"C'mon, c'mon.\\n\"\n\t.string \"Let's go, let's go, let's go!$\"\n\nRoute14_Text_IsaacRematchIntro::\n\t.string \"You're here again, huh?\\n\"\n\t.string \"Shut up and battle.$\"\n\nRoute14_Text_GeraldRematchIntro::\n\t.string \"We've been riding here because of\\n\"\n\t.string \"the wide-open spaces.$\"\n\nRoute14_Text_MalikRematchIntro::\n\t.string \"POKéMON battle, right?\\n\"\n\t.string \"Cool! Rumble!$\"\n\nRoute14_Text_KiriRematchIntro::\n\t.string \"KIRI: JAN, I hope we win today.$\"\n\nRoute14_Text_JanRematchIntro::\n\t.string \"JAN: KIRI, here we go!\\n\"\n\t.string \"Let's win for sure this time!$\"\n\nRoute15_Text_KindraRematchIntro::\n\t.string \"I'm going to keep battling with the\\n\"\n\t.string \"POKéMON I got in trades.$\"\n\nRoute15_Text_BeckyRematchIntro::\n\t.string \"You look gentle, so I think I can\\n\"\n\t.string \"beat you.\\p\"\n\t.string \"I'll give it one more go!$\"\n\nRoute15_Text_EdwinRematchIntro::\n\t.string \"When I whistle, bird POKéMON\\n\"\n\t.string \"gather around.\\p\"\n\t.string \"They're amazingly cute!$\"\n\nRoute15_Text_ChesterRematchIntro::\n\t.string \"Hmm? My birds are shivering!\\n\"\n\t.string \"Wait, aren't you that TRAINER…$\"\n\nRoute15_Text_GraceRematchIntro::\n\t.string \"Oh, you're a little cutie!\\n\"\n\t.string \"So like a darling POKéMON!\\l\"\n\t.string \"I remember you now!$\"\n\nRoute15_Text_OliviaRematchIntro::\n\t.string \"I raise POKéMON for protection\\n\"\n\t.string \"because I live alone.\\p\"\n\t.string \"That hasn't changed.$\"\n\nRoute15_Text_ErnestRematchIntro::\n\t.string \"Hey, kid! C'mon!\\n\"\n\t.string \"I got these off some loser!$\"\n\nRoute15_Text_AlexRematchIntro::\n\t.string \"Fork over all your cash when you\\n\"\n\t.string \"lose to me, kid!$\"\n\nRoute15_Text_CeliaRematchIntro::\n\t.string \"What's cool and happening?\\n\"\n\t.string \"Trading POKéMON, of course.$\"\n\nRoute15_Text_YazminRematchIntro::\n\t.string \"Want to play with my POKéMON\\n\"\n\t.string \"again?$\"\n\nRoute15_Text_MyaRematchIntro::\n\t.string \"MYA: Hi, we keep meeting,\\n\"\n\t.string \"don't we?\\p\"\n\t.string \"Help me train my little brother\\n\"\n\t.string \"again?$\"\n\nRoute15_Text_RonRematchIntro::\n\t.string \"RON: My sister's gotten more\\n\"\n\t.string \"powerful…$\"\n\nRoute16_Text_LaoRematchIntro::\n\t.string \"What do you want?$\"\n\nRoute16_Text_KojiRematchIntro::\n\t.string \"Nice BIKE!\\n\"\n\t.string \"Hand it over quick!$\"\n\nRoute16_Text_LukeRematchIntro::\n\t.string \"Come out and play, little mouse.\\n\"\n\t.string \"I'll treat you right!$\"\n\nRoute16_Text_HideoRematchIntro::\n\t.string \"Hey, wait a second!\\n\"\n\t.string \"Don't call me and then run away!$\"\n\nRoute16_Text_CamronRematchIntro::\n\t.string \"I'm feeling hungry and mean!\\n\"\n\t.string \"I really need a punching bag!$\"\n\nRoute16_Text_RubenRematchIntro::\n\t.string \"Hey, there!\\n\"\n\t.string \"We'll have ourselves a good time!$\"\n\nRoute16_Text_JedRematchIntro::\n\t.string \"JED: Are you here to see our\\n\"\n\t.string \"love, which knows no bounds?$\"\n\nRoute16_Text_LeaRematchIntro::\n\t.string \"LEA: Sometimes, the intensity of\\n\"\n\t.string \"our love scares me.$\"\n\nRoute17_Text_RaulRematchIntro::\n\t.string \"I told you, there's no getting rich\\n\"\n\t.string \"quick in battling kids.$\"\n\nRoute17_Text_IsaiahRematchIntro::\n\t.string \"I'm mighty proud of my bod, kiddo.\\n\"\n\t.string \"Come on!$\"\n\nRoute17_Text_VirgilRematchIntro::\n\t.string \"You out for a stroll?$\"\n\nRoute17_Text_BillyRematchIntro::\n\t.string \"We're BIKERS!\\n\"\n\t.string \"We rule the roads, man!$\"\n\nRoute17_Text_NikolasRematchIntro::\n\t.string \"VOLTORB's going to seriously\\n\"\n\t.string \"electrify you today!$\"\n\nRoute17_Text_ZeekRematchIntro::\n\t.string \"I leveled up my POKéMON, but it\\n\"\n\t.string \"absolutely won't evolve. Why?$\"\n\nRoute17_Text_JamalRematchIntro::\n\t.string \"Gaah! I really need to exercise\\n\"\n\t.string \"and seriously trim some flab!$\"\n\nRoute17_Text_CoreyRematchIntro::\n\t.string \"Be a rebel!$\"\n\nRoute17_Text_JaxonRematchIntro::\n\t.string \"Yep, that's a nice BIKE!\\n\"\n\t.string \"How's it handle?$\"\n\nRoute17_Text_WilliamRematchIntro::\n\t.string \"Get lost, kid!\\n\"\n\t.string \"I'm bushed!$\"\n\nRoute18_Text_WiltonRematchIntro::\n\t.string \"I've been checking every grassy\\n\"\n\t.string \"area for new POKéMON.\\p\"\n\t.string \"But it's not always easy…$\"\n\nRoute18_Text_RamiroRematchIntro::\n\t.string \"Koorukukukoo!\\n\"\n\t.string \"Is my birdcall getting better?$\"\n\nRoute18_Text_JacobRematchIntro::\n\t.string \"I warned you before, this is my\\n\"\n\t.string \"turf!\\p\"\n\t.string \"I don't want you coming around.$\"\n\nRoute19_Text_RichardRematchIntro::\n\t.string \"I'm almost warmed up to go\\n\"\n\t.string \"out for a swim.$\"\n\nRoute19_Text_ReeceRematchIntro::\n\t.string \"Wait! Slow down!\\n\"\n\t.string \"What if you have a heart attack?$\"\n\nRoute19_Text_MatthewRematchIntro::\n\t.string \"I love swimming!\\n\"\n\t.string \"I guess you're the surfing type.$\"\n\nRoute19_Text_DouglasRematchIntro::\n\t.string \"What's beyond the horizon?\\n\"\n\t.string \"Have you seen?$\"\n\nRoute19_Text_DavidRematchIntro::\n\t.string \"I tried diving for POKéMON again,\\n\"\n\t.string \"but it was a no-go like before.$\"\n\nRoute19_Text_TonyRematchIntro::\n\t.string \"I look at the sea to forget all\\n\"\n\t.string \"the bad things that happened.\\p\"\n\t.string \"…Like losing to you the last time!$\"\n\nRoute19_Text_AnyaRematchIntro::\n\t.string \"You always get to ride your\\n\"\n\t.string \"POKéMON…\\p\"\n\t.string \"It looks so relaxing.\\n\"\n\t.string \"Can I have it if I win?$\"\n\nRoute19_Text_AliceRematchIntro::\n\t.string \"Swimming's great!\\n\"\n\t.string \"Sunburns aren't!$\"\n\nRoute19_Text_AxleRematchIntro::\n\t.string \"These waters are treacherous!\\n\"\n\t.string \"You shouldn't come back here!$\"\n\nRoute19_Text_ConnieRematchIntro::\n\t.string \"I swam here with my friends…\\n\"\n\t.string \"I'm tired…\\l\"\n\t.string \"Must we really battle again?$\"\n\nRoute19_Text_LiaRematchIntro::\n\t.string \"LIA: You know my brother just\\n\"\n\t.string \"became a TRAINER, right?\\p\"\n\t.string \"I want to make him better, so I\\n\"\n\t.string \"need your help again.$\"\n\nRoute19_Text_LucRematchIntro::\n\t.string \"LUC: My big sis taught me all\\n\"\n\t.string \"about POKéMON.\\p\"\n\t.string \"I wonder if I'm better?$\"\n\nRoute20_Text_BarryRematchIntro::\n\t.string \"The water is shallow here.\\n\"\n\t.string \"There are many people swimming.$\"\n\nRoute20_Text_ShirleyRematchIntro::\n\t.string \"Are you jealous that I'm\\n\"\n\t.string \"vacationing on SEAFOAM?$\"\n\nRoute20_Text_TiffanyRematchIntro::\n\t.string \"I love floating with the fishes\\n\"\n\t.string \"here among the waves.$\"\n\nRoute20_Text_IreneRematchIntro::\n\t.string \"Were you on vacation, too?$\"\n\nRoute20_Text_DeanRematchIntro::\n\t.string \"Check out my physique!\\p\"\n\t.string \"It's even more buff than ever\\n\"\n\t.string \"before!$\"\n\nRoute20_Text_DarrinRematchIntro::\n\t.string \"Why are you riding a POKéMON?\\n\"\n\t.string \"Haven't you learned to swim yet?$\"\n\nRoute20_Text_RogerRematchIntro::\n\t.string \"I rode my bird POKéMON here.$\"\n\nRoute20_Text_NoraRematchIntro::\n\t.string \"My boyfriend gave me big pearls.\\n\"\n\t.string \"And, they've grown bigger!$\"\n\nRoute20_Text_MissyRematchIntro::\n\t.string \"I swam here from CINNABAR ISLAND.\\n\"\n\t.string \"It wasn't easy, like I said.$\"\n\nRoute20_Text_MelissaRematchIntro::\n\t.string \"CINNABAR, in the west, has a LAB\\n\"\n\t.string \"for POKéMON.\\p\"\n\t.string \"My daddy works there.$\"\n\nRoute21_North_Text_RonaldRematchIntro::\n\t.string \"You want to know if the fish are\\n\"\n\t.string \"biting?$\"\n\nRoute21_North_Text_WadeRematchIntro::\n\t.string \"I got a big haul again!\\n\"\n\t.string \"Wanna go for it once more?$\"\n\nRoute21_North_Text_SpencerRematchIntro::\n\t.string \"The sea cleanses my body and soul!$\"\n\nRoute21_South_Text_JackRematchIntro::\n\t.string \"I caught my POKéMON at sea.\\n\"\n\t.string \"And that's where I train them.$\"\n\nRoute21_South_Text_JeromeRematchIntro::\n\t.string \"Right now, I'm in another triathlon\\n\"\n\t.string \"meet!$\"\n\nRoute21_South_Text_RolandRematchIntro::\n\t.string \"Ahh!\\n\"\n\t.string \"Feel the sun and the wind!$\"\n\nRoute21_South_Text_ClaudeRematchIntro::\n\t.string \"Hey, cut it out already.\\n\"\n\t.string \"You always scare away the fish!$\"\n\nRoute21_South_Text_NolanRematchIntro::\n\t.string \"Keep me company till I get a hit.$\"\n\nRoute21_North_Text_LilRematchIntro::\n\t.string \"LIL: Huh? A battle again?\\n\"\n\t.string \"IAN, can't you do it alone?$\"\n\nRoute21_North_Text_IanRematchIntro::\n\t.string \"IAN: My sis is still a slob.\\n\"\n\t.string \"Help me get her into shape!$\"\n\nRoute25_Text_JoeyRematchIntro::\n\t.string \"I won't lose while I'm here!$\"\n\nRoute25_Text_DanRematchIntro::\n\t.string \"Dad took me to a great party on\\n\"\n\t.string \"the S.S. ANNE at VERMILION CITY.$\"\n\nRoute25_Text_FlintRematchIntro::\n\t.string \"I'm a cool guy.\\n\"\n\t.string \"I've got a girlfriend!\\p\"\n\t.string \"I'll show her how cool I am for\\n\"\n\t.string \"sure this time!$\"\n\nRoute25_Text_KelseyRematchIntro::\n\t.string \"Hi!\\n\"\n\t.string \"My boyfriend is cool!\\l\"\n\t.string \"My conditioning's good today!$\"\n\nRoute25_Text_ChadRematchIntro::\n\t.string \"I had this feeling…\\n\"\n\t.string \"I knew I had to battle you again!$\"\n\nRoute25_Text_HaleyRematchIntro::\n\t.string \"My friend has many cute POKéMON.\\n\"\n\t.string \"I'm so jealous!$\"\n\nRoute25_Text_FranklinRematchIntro::\n\t.string \"I just trained up on MT. MOON,\\n\"\n\t.string \"but I've still got gas in the tank!$\"\n\nRoute25_Text_NobRematchIntro::\n\t.string \"A POKéMANIAC lives on the cape.\\n\"\n\t.string \"Have you seen his collection?$\"\n\nRoute25_Text_WayneRematchIntro::\n\t.string \"You're going to see BILL again?\\n\"\n\t.string \"First, we battle!$\"\n\nRoute24_Text_ShaneRematchIntro::\n\t.string \"I saw your feat from the grass!$\"\n\nRoute24_Text_EthanRematchIntro::\n\t.string \"Okay!\\n\"\n\t.string \"I'll stomp you!$\"\n\nRoute24_Text_ReliRematchIntro::\n\t.string \"You always look so busy…\\n\"\n\t.string \"Aren't you getting tired?$\"\n\nRoute24_Text_TimmyRematchIntro::\n\t.string \"You really must love coming to\\n\"\n\t.string \"NUGGET BRIDGE.$\"\n\nRoute24_Text_AliRematchIntro::\n\t.string \"The time we battled…\\p\"\n\t.string \"Even though I was the second in\\n\"\n\t.string \"line, I was the best, wasn't I?$\"\n\nRoute24_Text_CaleRematchIntro::\n\t.string \"People call this the NUGGET\\n\"\n\t.string \"BRIDGE!\\p\"\n\t.string \"You've already beaten us, so you're\\n\"\n\t.string \"not allowed to take the challenge…\\p\"\n\t.string \"…But, you're welcome to battle with\\n\"\n\t.string \"us again.$\"\n\nOneIsland_TreasureBeach_Text_AmaraRematchIntro::\n\t.string \"Lying back, rocked by the waves…\\n\"\n\t.string \"I don't notice time slipping by…$\"\n\nOneIsland_KindleRoad_Text_MariaRematchIntro::\n\t.string \"The weather's gorgeous!\\n\"\n\t.string \"I'll try not to spoil it.$\"\n\nOneIsland_KindleRoad_Text_AbigailRematchIntro::\n\t.string \"My sunburn is starting to hurt…$\"\n\nOneIsland_KindleRoad_Text_FinnRematchIntro::\n\t.string \"The fire bird's mountain casts\\n\"\n\t.string \"a huge shadow…$\"\n\nOneIsland_KindleRoad_Text_GarrettRematchIntro::\n\t.string \"I have this strong feeling that\\n\"\n\t.string \"I can win this time!$\"\n\nOneIsland_KindleRoad_Text_TommyRematchIntro::\n\t.string \"Wait! Wait a second!\\n\"\n\t.string \"I'm sure I've hooked a big one!$\"\n\nOneIsland_KindleRoad_Text_SharonRematchIntro::\n\t.string \"You'll help me out with my\\n\"\n\t.string \"training again?$\"\n\nOneIsland_KindleRoad_Text_TanyaRematchIntro::\n\t.string \"We haven't missed a single day of\\n\"\n\t.string \"training yet!$\"\n\nOneIsland_KindleRoad_Text_SheaRematchIntro::\n\t.string \"Every morning, before breakfast,\\n\"\n\t.string \"I swim around this island…\\l\"\n\t.string \"Three times!$\"\n\nOneIsland_KindleRoad_Text_HughRematchIntro::\n\t.string \"Dress appropriately for battle!\\n\"\n\t.string \"Lose that frivolous outfit, I said!$\"\n\nOneIsland_KindleRoad_Text_BryceRematchIntro::\n\t.string \"You know, everything tastes great\\n\"\n\t.string \"when you're out in the wild.$\"\n\nOneIsland_KindleRoad_Text_ClaireRematchIntro::\n\t.string \"I ate too much again, so will you\\n\"\n\t.string \"battle us for some exercise?$\"\n\nOneIsland_KindleRoad_Text_KiaRematchIntro::\n\t.string \"KIA: My big brother and I make\\n\"\n\t.string \"an awesome combination!\\p\"\n\t.string \"We won't lose this time!$\"\n\nOneIsland_KindleRoad_Text_MikRematchIntro::\n\t.string \"MIK: Together with KIA, we're\\n\"\n\t.string \"afraid of nothing!\\p\"\n\t.string \"We'll prove it to you this time!$\"\n\nThreeIsland_BondBridge_Text_NikkiRematchIntro::\n\t.string \"Are we to battle again?$\"\n\nThreeIsland_BondBridge_Text_VioletRematchIntro::\n\t.string \"From where have you come, and\\n\"\n\t.string \"where are you bound?$\"\n\nThreeIsland_BondBridge_Text_AmiraRematchIntro::\n\t.string \"I want to swim without my float\\n\"\n\t.string \"ring soon.$\"\n\nThreeIsland_BondBridge_Text_AlexisRematchIntro::\n\t.string \"Yay, yay!\\n\"\n\t.string \"POKéMON!$\"\n\nThreeIsland_BondBridge_Text_TishaRematchIntro::\n\t.string \"Oh, no, didn't I tell you already?\\n\"\n\t.string \"Please, stay away from me!$\"\n\nThreeIsland_BondBridge_Text_JoyRematchIntro::\n\t.string \"JOY: We've gotten stronger!\\n\"\n\t.string \"Lots and lots!$\"\n\nThreeIsland_BondBridge_Text_MegRematchIntro::\n\t.string \"MEG: You can't beat us today!$\"\n\nFiveIsland_WaterLabyrinth_Text_AlizeRematchIntro::\n\t.string \"Oh, hello!\\p\"\n\t.string \"Are you raising your POKéMON in a\\n\"\n\t.string \"good environment?$\"\n\nFiveIsland_ResortGorgeous_Text_DaisyRematchIntro::\n\t.string \"With these hands, I will create\\n\"\n\t.string \"my victory today.$\"\n\nFiveIsland_ResortGorgeous_Text_CelinaRematchIntro::\n\t.string \"Must I repeat myself?\\n\"\n\t.string \"I'm trying to paint.\\l\"\n\t.string \"Please keep out of my sight!$\"\n\nFiveIsland_ResortGorgeous_Text_RaynaRematchIntro::\n\t.string \"I haven't made any progress…\\n\"\n\t.string \"I still can't get the right angle…$\"\n\nFiveIsland_ResortGorgeous_Text_JackiRematchIntro::\n\t.string \"Oh, you will give me another\\n\"\n\t.string \"opportunity to match wits with you?$\"\n\nFiveIsland_ResortGorgeous_Text_GillianRematchIntro::\n\t.string \"They're almost finished making the\\n\"\n\t.string \"pool for my POKéMON.\\p\"\n\t.string \"You must drop in for a visit.$\"\n\nFiveIsland_ResortGorgeous_Text_DestinRematchIntro::\n\t.string \"I'm a good runner.\\n\"\n\t.string \"I've gotten even faster!$\"\n\nFiveIsland_ResortGorgeous_Text_TobyRematchIntro::\n\t.string \"I say, friend!\\n\"\n\t.string \"Let us enjoy our time together!$\"\n\nFiveIsland_MemorialPillar_Text_MiloRematchIntro::\n\t.string \"I'm the eldest of the BIRD\\n\"\n\t.string \"BROTHERS. Remember me?\\p\"\n\t.string \"That's right, I'm the one who loves\\n\"\n\t.string \"birds for their beaks!$\"\n\nFiveIsland_MemorialPillar_Text_ChazRematchIntro::\n\t.string \"I'm the middle kid of the BIRD\\n\"\n\t.string \"BROTHERS.\\p\"\n\t.string \"I'm the one that loves wings.\\n\"\n\t.string \"Let's battle again!$\"\n\nFiveIsland_MemorialPillar_Text_HaroldRematchIntro::\n\t.string \"I'm the youngest of the BIRD\\n\"\n\t.string \"BROTHERS.\\p\"\n\t.string \"I love birds for their down.\\n\"\n\t.string \"I didn't think I'd see you again!$\"\n\nSixIsland_OutcastIsland_Text_TylorRematchIntro::\n\t.string \"I'm still having no luck at all.\\n\"\n\t.string \"A battle'd be a change of pace!$\"\n\nSixIsland_OutcastIsland_Text_MymoRematchIntro::\n\t.string \"Gasp… Gasp…\\p\"\n\t.string \"I swam here from SIX ISLAND's port\\n\"\n\t.string \"in one go again.$\"\n\nSixIsland_OutcastIsland_Text_NicoleRematchIntro::\n\t.string \"You always come along while I'm\\n\"\n\t.string \"swimming.$\"\n\nSixIsland_OutcastIsland_Text_AvaRematchIntro::\n\t.string \"AVA: Let's have another\\n\"\n\t.string \"two-on-two marine battle today!$\"\n\nSixIsland_OutcastIsland_Text_GebRematchIntro::\n\t.string \"GEB: My big sister and I are way\\n\"\n\t.string \"tougher than before!$\"\n\nSixIsland_GreenPath_Text_JaclynRematchIntro::\n\t.string \"…Huh?\\p\"\n\t.string \"I envision my house, but TELEPORT\\n\"\n\t.string \"always brings me here!$\"\n\nSixIsland_WaterPath_Text_RoseRematchIntro::\n\t.string \"Oh, hello.\\n\"\n\t.string \"A pleasant breeze is blowing again.$\"\n\nSixIsland_WaterPath_Text_EdwardRematchIntro::\n\t.string \"Hehehe, I'm practicing in secret\\n\"\n\t.string \"again.$\"\n\nSixIsland_WaterPath_Text_SamirRematchIntro::\n\t.string \"What, you're sick of seeing\\n\"\n\t.string \"SWIMMERS like me?\\p\"\n\t.string \"Aww, don't be hatin'!\\n\"\n\t.string \"Battle with me again.$\"\n\nSixIsland_WaterPath_Text_DeniseRematchIntro::\n\t.string \"Sigh…\\n\"\n\t.string \"My boyfriend's busy again…$\"\n\nSixIsland_WaterPath_Text_EarlRematchIntro::\n\t.string \"Come on, tell me, where are the\\n\"\n\t.string \"mountains around these parts?$\"\n\nSixIsland_WaterPath_Text_MiuRematchIntro::\n\t.string \"MIU: Hello, POKéMON!\\n\"\n\t.string \"It's time to play again!$\"\n\nSixIsland_WaterPath_Text_MiaRematchIntro::\n\t.string \"MIA: Hello, POKéMON!\\n\"\n\t.string \"It's time to battle again!$\"\n\nSixIsland_RuinValley_Text_StanlyRematchIntro::\n\t.string \"There appear to be many secrets\\n\"\n\t.string \"still unsolved in this world.$\"\n\nSixIsland_RuinValley_Text_FosterRematchIntro::\n\t.string \"Hi, didn't we meet before?\\n\"\n\t.string \"What compelled you to come back?$\"\n\nSixIsland_RuinValley_Text_LarryRematchIntro::\n\t.string \"It's been said that there are\\n\"\n\t.string \"mysterious stones on this island.\\p\"\n\t.string \"Have you discovered anything since\\n\"\n\t.string \"we last met?$\"\n\nSixIsland_RuinValley_Text_DarylRematchIntro::\n\t.string \"A rematch with you, so high up!$\"\n\nSixIsland_RuinValley_Text_HectorRematchIntro::\n\t.string \"I'm pretty familiar with the land\\n\"\n\t.string \"around these parts.$\"\n\nSevenIsland_TrainerTower_Text_DarioRematchIntro::\n\t.string \"I sensed your approach.$\"\n\nSevenIsland_TrainerTower_Text_RodetteRematchIntro::\n\t.string \"Somewhere on this island, peculiar\\n\"\n\t.string \"POKéMON are sleeping.$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_MiahRematchIntro::\n\t.string \"Kyahaha!\\p\"\n\t.string \"Coming back won't change a thing.\\n\"\n\t.string \"I'll flick you away effortlessly!$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_MasonRematchIntro::\n\t.string \"Howdy! You're a member of my\\n\"\n\t.string \"fan club, isn't that right?$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_NicolasRematchIntro::\n\t.string \"This island is too spread out…\\n\"\n\t.string \"Patrolling the place is a drag…$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_MadelineRematchIntro::\n\t.string \"I don't forgive people who abuse\\n\"\n\t.string \"POKéMON!$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_EveRematchIntro::\n\t.string \"EVE: I'll team up with JON and\\n\"\n\t.string \"battle together again.$\"\n\nSevenIsland_SevaultCanyon_Entrance_Text_JonRematchIntro::\n\t.string \"JON: When I'm with EVE, it feels\\n\"\n\t.string \"like we could never lose, not ever.$\"\n\nSevenIsland_SevaultCanyon_Text_CyndyRematchIntro::\n\t.string \"Let's have another battle.\\n\"\n\t.string \"My conditioning's in top form!$\"\n\nSevenIsland_SevaultCanyon_Text_EvanRematchIntro::\n\t.string \"It doesn't matter if you happen to\\n\"\n\t.string \"have the strongest POKéMON…\\p\"\n\t.string \"It doesn't mean a thing if you don't\\n\"\n\t.string \"know how to use them properly!$\"\n\nSevenIsland_SevaultCanyon_Text_JacksonRematchIntro::\n\t.string \"I work to protect the environment.\\n\"\n\t.string \"In turn, nature protects me!$\"\n\nSevenIsland_SevaultCanyon_Text_KatelynRematchIntro::\n\t.string \"Every time we meet, you have those\\n\"\n\t.string \"snazzy shoes on.$\"\n\nSevenIsland_SevaultCanyon_Text_LeroyRematchIntro::\n\t.string \"You must have gotten tougher.\\n\"\n\t.string \"Let me battle you, please!$\"\n\nSevenIsland_SevaultCanyon_Text_MichelleRematchIntro::\n\t.string \"I was given the best possible\\n\"\n\t.string \"education to become this strong.\\p\"\n\t.string \"I won't lose this time.\\n\"\n\t.string \"Absolutely not!$\"\n\nSevenIsland_SevaultCanyon_Text_LexRematchIntro::\n\t.string \"LEX: My darling NYA, together\\n\"\n\t.string \"we will win for certain!$\"\n\nSevenIsland_SevaultCanyon_Text_NyaRematchIntro::\n\t.string \"NYA: I won't drag down my mentor\\n\"\n\t.string \"LEX! We're going to win!$\"\n\nSevenIsland_TanobyRuins_Text_BrandonRematchIntro::\n\t.string \"Have you discovered anything about\\n\"\n\t.string \"this stone chamber?$\"\n\nSevenIsland_TanobyRuins_Text_BenjaminRematchIntro::\n\t.string \"A mystic POKéMON is said to sleep\\n\"\n\t.string \"inside here.$\"\n\nSevenIsland_TanobyRuins_Text_EdnaRematchIntro::\n\t.string \"My teacher is showing me how to\\n\"\n\t.string \"paint some more.$\"\n\nSevenIsland_TanobyRuins_Text_CliffordRematchIntro::\n\t.string \"Today, in addition to our lesson,\\n\"\n\t.string \"we came to see the chamber again.$\"\n"
  },
  {
    "path": "data/text/white_out.inc",
    "content": "Text_FirstShouldRestoreMonsHealth::\n\t.string \"First, you should restore your\\n\"\n\t.string \"POKéMON to full health.$\"\n\nText_MonsHealedShouldBuyPotions::\n\t.string \"Your POKéMON have been healed\\n\"\n\t.string \"to perfect health.\\p\"\n\t.string \"If your POKéMON's energy, HP,\\n\"\n\t.string \"is down, please come see us.\\p\"\n\t.string \"If you're planning to go far in the\\n\"\n\t.string \"field, you should buy some POTIONS\\l\"\n\t.string \"at the POKéMON MART.\\p\"\n\t.string \"We hope you excel!$\"\n\nText_MonsHealed::\n\t.string \"Your POKéMON have been healed\\n\"\n\t.string \"to perfect health.\\p\"\n\t.string \"We hope you excel!$\"\n\nText_HadQuiteAnExperienceTakeRest::\n\t.string \"MOM: {PLAYER}!\\n\"\n\t.string \"Welcome home.\\p\"\n\t.string \"It sounds like you had quite\\n\"\n\t.string \"an experience.\\p\"\n\t.string \"Maybe you should take a quick\\n\"\n\t.string \"rest.$\"\n\nText_MomExplainHPGetPotions::\n\t.string \"MOM: Oh, good! You and your\\n\"\n\t.string \"POKéMON are looking great.\\p\"\n\t.string \"I just heard from PROF. OAK.\\p\"\n\t.string \"He said that POKéMON's energy is\\n\"\n\t.string \"measured in HP.\\p\"\n\t.string \"If your POKéMON lose their HP,\\n\"\n\t.string \"you can restore them at any\\l\"\n\t.string \"POKéMON CENTER.\\p\"\n\t.string \"If you're going to travel far away,\\n\"\n\t.string \"the smart TRAINER stocks up on\\l\"\n\t.string \"POTIONS at the POKéMON MART.\\p\"\n\t.string \"Make me proud, honey!\\p\"\n\t.string \"Take care!$\"\n\nText_WhitedOutLostMoney::\n\t.string \"{PLAYER} is out of usable\\n\"\n\t.string \"POKéMON!\\p\"\n\t.string \"{PLAYER} panicked and lost ¥{STR_VAR_1}…\\p\"\n\t.string \"… … … …\\p\"\n\t.string \"{PLAYER} whited out!$\"\n\nText_WhitedOut::\n\t.string \"{PLAYER} is out of usable\\n\"\n\t.string \"POKéMON!\\p\"\n\t.string \"{PLAYER} whited out!$\"\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n156 213 255\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n139 180 222\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n90 90 115\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n65 98 156\r\n90 123 180\r\n115 156 197\r\n222 213 131\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n106 172 115\r\n156 205 139\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 238 246\r\n172 197 180\r\n197 222 205\r\n90 189 172\r\n246 238 156\r\n205 189 131\r\n189 164 123\r\n148 131 106\r\n106 106 106\r\n213 222 230\r\n238 180 115\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n213 222 222\r\n164 180 189\r\n255 0 255\r\n131 115 74\r\n213 213 148\r\n197 189 139\r\n172 156 115\r\n148 131 90\r\n197 197 205\r\n205 82 65\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 255 255\r\n213 222 246\r\n164 172 222\r\n98 98 123\r\n65 74 106\r\n238 213 205\r\n222 172 164\r\n205 131 123\r\n189 98 82\r\n222 222 222\r\n172 180 189\r\n139 148 164\r\n106 123 123\r\n222 74 0\r\n213 213 57\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/building/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n184 248 136\r\n128 208 96\r\n56 144 48\r\n56 88 16\r\n112 96 96\r\n64 56 48\r\n64 72 104\r\n136 216 184\r\n248 192 112\r\n232 128 104\r\n192 48 64\r\n160 224 192\r\n112 200 160\r\n64 176 136\r\n24 160 104\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n123 123 131\r\n32 49 57\r\n230 238 238\r\n90 189 139\r\n90 90 115\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n123 74 74\r\n90 57 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 0\r\n230 246 255\r\n189 222 255\r\n139 164 255\r\n106 164 230\r\n74 148 222\r\n74 123 222\r\n82 156 230\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 197\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n216 224 232\r\n168 184 200\r\n120 120 128\r\n88 88 112\r\n64 72 104\r\n224 216 160\r\n208 192 128\r\n192 168 104\r\n168 144 72\r\n232 224 136\r\n216 192 136\r\n208 184 104\r\n184 224 160\r\n168 216 160\r\n112 200 160\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 0\r\n205 230 246\r\n180 213 255\r\n123 156 238\r\n98 139 213\r\n65 123 189\r\n49 98 180\r\n82 123 205\r\n238 246 246\r\n205 222 238\r\n49 115 197\r\n139 189 255\r\n115 164 255\r\n65 139 222\r\n57 115 222\r\n82 148 230\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/primary/general/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n148 148 164\r\n205 189 197\r\n255 255 255\r\n222 213 230\r\n255 255 156\r\n0 238 139\r\n0 189 139\r\n115 115 131\r\n90 106 180\r\n115 139 197\r\n189 41 16\r\n222 74 32\r\n255 98 49\r\n255 222 131\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n148 148 164\r\n205 189 197\r\n255 255 255\r\n189 148 49\r\n156 115 90\r\n197 238 148\r\n156 197 74\r\n106 164 41\r\n115 222 255\r\n0 180 255\r\n0 115 255\r\n0 82 222\r\n0 57 180\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n148 148 164\r\n205 189 197\r\n255 255 255\r\n222 213 230\r\n189 172 180\r\n255 0 255\r\n255 0 255\r\n115 115 131\r\n90 106 180\r\n115 139 197\r\n172 82 49\r\n205 115 82\r\n139 255 255\r\n255 115 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n148 148 164\r\n205 189 197\r\n255 255 255\r\n255 213 115\r\n189 148 49\r\n139 98 74\r\n90 106 180\r\n255 205 139\r\n230 172 90\r\n230 148 65\r\n180 98 24\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n148 148 164\r\n205 189 197\r\n255 255 255\r\n115 115 131\r\n205 57 16\r\n255 98 49\r\n0 115 255\r\n255 0 255\r\n82 255 255\r\n255 255 172\r\n255 213 115\r\n213 180 106\r\n164 131 74\r\n222 213 230\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontier/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n255 0 255\r\n115 189 246\r\n98 172 238\r\n115 189 246\r\n98 164 222\r\n82 139 197\r\n74 115 172\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n115 189 246\r\n98 172 238\r\n255 189 131\r\n238 148 115\r\n222 106 98\r\n205 65 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n180 255 131\r\n131 197 98\r\n57 139 49\r\n57 82 0\r\n222 148 115\r\n106 90 90\r\n164 98 90\r\n65 57 49\r\n255 197 148\r\n222 106 98\r\n205 65 82\r\n164 213 197\r\n115 197 164\r\n65 180 131\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n213 213 213\r\n189 189 189\r\n164 164 164\r\n131 131 139\r\n255 0 255\r\n255 0 255\r\n65 49 65\r\n238 213 205\r\n222 180 164\r\n189 148 139\r\n156 115 115\r\n131 90 90\r\n98 65 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n82 106 213\r\n65 90 189\r\n57 82 164\r\n49 74 148\r\n172 197 230\r\n139 164 222\r\n106 131 213\r\n82 106 213\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n115 189 246\r\n98 172 238\r\n238 230 164\r\n222 205 131\r\n213 180 106\r\n205 156 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n115 189 246\r\n98 172 238\r\n197 139 205\r\n172 115 180\r\n148 90 156\r\n106 57 115\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n115 189 246\r\n98 172 238\r\n238 230 164\r\n222 205 131\r\n213 180 106\r\n205 156 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 205 131\r\n180 255 131\r\n131 197 98\r\n57 139 49\r\n57 82 0\r\n222 148 115\r\n106 90 90\r\n164 98 90\r\n65 57 49\r\n255 197 148\r\n222 106 98\r\n205 65 82\r\n164 213 197\r\n222 205 115\r\n189 172 82\r\n156 139 49\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n115 189 246\r\n98 172 238\r\n255 189 131\r\n238 148 115\r\n222 106 98\r\n205 65 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n205 205 197\r\n180 180 164\r\n123 213 164\r\n139 139 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n180 213 255\r\n148 164 238\r\n255 213 49\r\n0 0 0\r\n205 115 82\r\n168 80 64\r\n128 72 64\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 197 0\r\n164 98 90\r\n255 255 255\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n255 213 49\r\n156 139 49\r\n238 148 115\r\n205 65 82\r\n197 139 205\r\n172 115 180\r\n98 197 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsideeast/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n255 238 148\r\n255 230 41\r\n205 180 41\r\n156 139 49\r\n230 213 197\r\n197 164 148\r\n164 123 98\r\n115 82 57\r\n106 90 49\r\n255 180 131\r\n222 131 90\r\n189 82 57\r\n164 32 24\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n255 0 255\r\n115 189 246\r\n98 172 238\r\n115 189 246\r\n98 164 222\r\n82 139 197\r\n74 115 172\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n115 189 246\r\n98 172 238\r\n255 189 131\r\n238 148 115\r\n222 106 98\r\n205 65 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n180 255 131\r\n131 197 98\r\n57 139 49\r\n57 82 0\r\n222 148 115\r\n106 90 90\r\n164 98 90\r\n65 57 49\r\n255 197 148\r\n222 106 98\r\n205 65 82\r\n164 213 197\r\n115 197 164\r\n65 180 131\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n213 213 213\r\n189 189 189\r\n164 164 164\r\n131 131 139\r\n255 0 255\r\n255 0 255\r\n65 49 65\r\n238 213 205\r\n222 180 164\r\n189 148 139\r\n156 115 115\r\n131 90 90\r\n98 65 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n82 106 213\r\n65 90 189\r\n57 82 164\r\n49 74 148\r\n172 197 230\r\n139 164 222\r\n106 131 213\r\n82 106 213\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n115 189 246\r\n98 172 238\r\n238 230 164\r\n222 205 131\r\n213 180 106\r\n205 156 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n115 189 246\r\n98 172 238\r\n197 139 205\r\n172 115 180\r\n148 90 156\r\n106 57 115\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 205 115\r\n189 172 82\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n115 189 246\r\n98 172 238\r\n164 189 98\r\n131 156 65\r\n98 123 32\r\n65 90 0\r\n156 139 49\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 205 131\r\n180 255 131\r\n131 197 98\r\n57 139 49\r\n57 82 0\r\n222 148 115\r\n106 90 90\r\n164 98 90\r\n65 57 49\r\n255 197 148\r\n222 106 98\r\n205 65 82\r\n164 213 197\r\n222 205 115\r\n189 172 82\r\n156 139 49\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n255 255 148\r\n197 197 115\r\n213 238 255\r\n139 139 148\r\n98 98 123\r\n65 74 106\r\n213 205 222\r\n180 213 255\r\n148 164 238\r\n131 148 197\r\n238 148 16\r\n205 115 82\r\n172 82 65\r\n131 74 65\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n205 205 197\r\n180 180 164\r\n123 213 164\r\n139 139 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n180 213 255\r\n148 164 238\r\n255 213 49\r\n0 0 0\r\n205 115 82\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 197 0\r\n164 98 90\r\n255 255 255\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n255 213 49\r\n156 139 49\r\n238 148 115\r\n205 65 82\r\n197 139 205\r\n172 115 180\r\n98 197 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontieroutsidewest/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n255 238 148\r\n255 230 41\r\n205 180 41\r\n156 139 49\r\n230 213 197\r\n197 164 148\r\n164 123 98\r\n115 82 57\r\n106 90 49\r\n255 180 131\r\n222 131 90\r\n189 82 57\r\n164 32 24\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 255 255\r\n213 222 246\r\n164 172 222\r\n98 98 123\r\n65 74 106\r\n123 197 246\r\n74 180 213\r\n65 123 164\r\n49 106 123\r\n189 238 180\r\n106 222 115\r\n74 180 98\r\n57 131 82\r\n131 197 230\r\n98 156 172\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n156 164 148\r\n189 197 205\r\n213 213 222\r\n230 238 238\r\n246 255 255\r\n246 32 222\r\n131 131 106\r\n246 32 222\r\n222 189 172\r\n197 139 131\r\n189 106 90\r\n139 115 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/battlefrontierrankinghall/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 82 0\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 189 164\r\n189 148 139\r\n156 115 115\r\n123 82 82\r\n90 57 74\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 131\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n222 205 131\r\n205 180 106\r\n180 139 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 82 0\r\n57 115 24\r\n98 65 74\r\n131 106 82\r\n65 57 49\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n213 230 189\r\n57 172 131\r\n222 230 246\r\n230 172 123\r\n106 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n152 144 72\r\n120 112 56\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n222 230 238\r\n184 168 104\r\n168 152 120\r\n255 222 255\r\n248 168 200\r\n240 128 192\r\n240 112 184\r\n184 88 120\r\n238 213 156\r\n205 189 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 148\r\n222 213 98\r\n57 148 49\r\n57 82 0\r\n57 115 24\r\n98 65 74\r\n131 106 82\r\n65 57 49\r\n164 164 49\r\n115 106 49\r\n255 0 255\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 148\r\n222 213 98\r\n57 148 49\r\n56 88 16\r\n56 144 48\r\n98 65 74\r\n131 106 82\r\n65 57 49\r\n164 164 49\r\n115 106 49\r\n255 0 255\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/berry_forest/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 156 156\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 156 156\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 156 156\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 156 156\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n82 82 106\r\n131 131 139\r\n172 172 139\r\n205 205 180\r\n238 238 222\r\n131 148 139\r\n172 189 172\r\n205 205 205\r\n213 222 213\r\n255 255 255\r\n164 123 74\r\n189 148 98\r\n222 172 123\r\n172 180 106\r\n197 205 131\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n65 74 106\r\n139 139 131\r\n197 197 197\r\n255 255 255\r\n0 0 0\r\n246 197 197\r\n74 74 213\r\n123 123 246\r\n180 180 0\r\n213 197 65\r\n246 246 32\r\n148 82 74\r\n205 49 41\r\n255 123 74\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/bike_shop/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n139 180 222\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n90 90 115\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n65 98 156\r\n90 123 180\r\n115 156 197\r\n222 213 131\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n106 172 115\r\n156 205 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 238 246\r\n172 197 180\r\n197 222 205\r\n90 189 172\r\n246 238 156\r\n205 189 131\r\n189 164 123\r\n148 131 106\r\n106 106 106\r\n213 222 230\r\n238 180 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n213 222 222\r\n164 180 189\r\n255 0 255\r\n131 115 74\r\n213 213 148\r\n197 189 139\r\n172 156 115\r\n148 131 90\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/burgled_house/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n255 213 131\r\n246 180 82\r\n213 148 41\r\n180 172 148\r\n148 139 123\r\n255 255 222\r\n230 230 197\r\n180 74 24\r\n213 98 49\r\n90 156 139\r\n131 197 180\r\n172 230 205\r\n156 222 115\r\n148 189 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n230 238 255\r\n213 205 246\r\n164 164 180\r\n156 197 156\r\n106 156 139\r\n246 255 255\r\n0 0 0\r\n180 74 24\r\n213 98 49\r\n123 106 164\r\n156 156 197\r\n197 197 230\r\n156 222 115\r\n148 189 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n238 255 255\r\n213 222 238\r\n189 205 197\r\n156 164 172\r\n0 0 0\r\n189 139 90\r\n222 172 106\r\n246 189 115\r\n82 156 164\r\n115 197 222\r\n213 98 82\r\n246 148 131\r\n148 205 90\r\n49 131 24\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n123 123 148\r\n246 255 255\r\n205 213 213\r\n0 0 0\r\n255 123 123\r\n172 123 115\r\n139 230 98\r\n115 189 57\r\n246 230 24\r\n189 180 49\r\n148 148 246\r\n123 123 180\r\n222 222 255\r\n180 172 213\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n49 57 74\r\n172 164 255\r\n131 123 230\r\n106 98 172\r\n82 74 180\r\n82 74 98\r\n246 255 255\r\n115 172 65\r\n123 189 74\r\n148 205 90\r\n98 90 148\r\n139 156 213\r\n57 57 106\r\n148 205 90\r\n0 255 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n197 238 255\r\n172 205 213\r\n131 164 180\r\n123 156 180\r\n98 139 148\r\n246 255 255\r\n164 123 115\r\n180 74 24\r\n213 98 49\r\n98 139 148\r\n172 205 213\r\n197 238 255\r\n156 222 115\r\n148 189 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cable_club/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n123 123 131\r\n32 49 57\r\n230 238 238\r\n90 189 139\r\n90 90 115\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n123 74 74\r\n90 57 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n123 197 255\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n230 246 255\r\n189 222 255\r\n139 189 255\r\n115 164 255\r\n65 139 222\r\n57 115 205\r\n82 148 230\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 197\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n205 230 246\r\n180 213 255\r\n123 180 246\r\n98 148 230\r\n65 123 189\r\n49 98 180\r\n82 131 222\r\n213 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n238 246 246\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n189 189 156\r\n172 172 139\r\n148 139 115\r\n123 115 90\r\n32 49 57\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n222 197 189\r\n205 180 156\r\n189 148 139\r\n148 115 106\r\n115 65 74\r\n82 49 65\r\n90 90 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 222 213\r\n189 189 156\r\n172 172 139\r\n148 139 115\r\n123 115 90\r\n255 238 164\r\n230 197 139\r\n205 172 123\r\n164 123 90\r\n148 115 74\r\n106 65 41\r\n74 74 57\r\n0 0 0\r\n98 139 197\r\n74 115 172\r\n57 98 156\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n255 238 164\r\n230 197 139\r\n205 172 123\r\n172 139 106\r\n213 197 189\r\n205 180 156\r\n189 148 139\r\n148 115 106\r\n115 65 74\r\n82 49 65\r\n90 90 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n189 189 156\r\n172 172 139\r\n148 139 115\r\n123 115 90\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n238 222 148\r\n222 205 115\r\n205 180 98\r\n189 172 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cave/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 82 0\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 189 164\r\n189 148 139\r\n156 115 115\r\n123 82 82\r\n90 57 74\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n222 205 131\r\n205 180 106\r\n180 139 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 255 255\r\n222 222 230\r\n123 123 131\r\n82 82 106\r\n197 238 255\r\n172 213 255\r\n123 164 222\r\n98 139 189\r\n246 230 139\r\n197 180 115\r\n172 156 90\r\n123 164 189\r\n148 189 238\r\n255 205 139\r\n230 131 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 255 255\r\n222 222 230\r\n123 123 131\r\n82 82 106\r\n197 197 205\r\n255 213 164\r\n222 123 82\r\n189 90 57\r\n189 230 222\r\n131 189 164\r\n106 148 139\r\n246 238 189\r\n222 213 156\r\n213 189 123\r\n197 180 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 255 255\r\n222 222 230\r\n123 123 131\r\n82 82 106\r\n238 230 255\r\n222 197 255\r\n180 148 222\r\n131 106 172\r\n255 0 255\r\n115 189 246\r\n74 148 205\r\n41 115 172\r\n148 164 180\r\n246 238 148\r\n213 172 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n180 205 213\r\n148 164 180\r\n123 123 131\r\n82 82 106\r\n205 222 238\r\n197 213 222\r\n164 180 197\r\n222 180 82\r\n230 238 238\r\n255 205 139\r\n222 106 98\r\n197 74 65\r\n98 189 148\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n213 222 164\r\n180 189 131\r\n139 148 90\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n180 148 222\r\n131 106 172\r\n189 230 222\r\n148 205 180\r\n115 172 148\r\n106 148 139\r\n74 115 106\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_city/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n180 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n238 246 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n213 131 82\r\n156 205 246\r\n98 156 238\r\n57 123 222\r\n222 139 106\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n148 148 148\r\n180 180 180\r\n255 255 255\r\n238 246 238\r\n222 238 222\r\n197 205 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n139 139 148\r\n74 156 90\r\n65 139 139\r\n115 205 90\r\n148 238 74\r\n189 255 98\r\n156 131 82\r\n197 115 123\r\n255 164 123\r\n238 238 172\r\n82 115 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n139 139 148\r\n222 213 246\r\n238 238 255\r\n123 156 246\r\n106 197 255\r\n131 222 255\r\n156 230 255\r\n115 90 98\r\n189 115 131\r\n246 189 115\r\n222 189 246\r\n255 230 115\r\n90 98 213\r\n255 172 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n156 131 57\r\n213 197 106\r\n246 238 148\r\n213 222 238\r\n222 230 255\r\n41 106 82\r\n57 131 115\r\n172 131 115\r\n197 156 148\r\n238 180 164\r\n180 139 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n41 123 123\r\n41 156 156\r\n49 189 172\r\n65 230 189\r\n65 246 230\r\n106 90 74\r\n131 106 74\r\n156 131 65\r\n172 156 74\r\n172 156 106\r\n205 180 106\r\n222 205 98\r\n230 222 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/celadon_gym/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n197 205 222\r\n172 180 197\r\n156 164 180\r\n115 123 139\r\n148 156 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n205 246 172\r\n172 213 148\r\n139 180 131\r\n115 156 106\r\n82 123 90\r\n57 98 74\r\n65 65 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 205 222\r\n197 205 222\r\n172 180 197\r\n156 164 180\r\n115 123 139\r\n255 246 164\r\n205 189 106\r\n156 131 57\r\n82 74 32\r\n90 106 115\r\n255 0 255\r\n65 65 74\r\n16 16 24\r\n98 139 197\r\n74 115 172\r\n57 98 156\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n255 238 180\r\n230 205 164\r\n189 180 164\r\n172 164 156\r\n205 246 172\r\n172 213 148\r\n139 180 131\r\n115 156 106\r\n82 123 90\r\n57 98 74\r\n65 65 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n197 205 222\r\n172 180 197\r\n156 164 180\r\n115 123 139\r\n148 156 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n123 189 156\r\n106 156 139\r\n98 123 123\r\n90 98 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 205 222\r\n197 205 222\r\n172 180 197\r\n156 164 180\r\n115 123 139\r\n238 238 164\r\n205 205 106\r\n172 172 90\r\n123 131 74\r\n115 123 139\r\n82 90 32\r\n65 65 74\r\n16 16 24\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_cave/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n213 238 255\r\n172 205 255\r\n139 180 238\r\n106 156 230\r\n74 139 189\r\n65 123 189\r\n82 139 205\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 172\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n213 238 255\r\n172 205 255\r\n139 180 238\r\n106 156 230\r\n65 123 172\r\n41 98 156\r\n74 115 197\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 172\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n90 139 164\r\n115 164 189\r\n139 189 213\r\n172 222 238\r\n139 197 98\r\n156 222 106\r\n189 230 139\r\n222 205 172\r\n246 230 189\r\n255 246 213\r\n164 164 180\r\n82 82 106\r\n123 123 139\r\n205 205 222\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n180 106 90\r\n222 180 65\r\n238 164 156\r\n246 238 131\r\n230 205 98\r\n205 131 123\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n164 164 180\r\n82 82 106\r\n123 123 139\r\n205 205 222\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n255 238 197\r\n222 205 172\r\n180 164 123\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n123 180 222\r\n180 222 255\r\n255 213 164\r\n230 189 82\r\n213 164 57\r\n205 139 32\r\n172 90 16\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n255 238 197\r\n222 205 172\r\n180 164 123\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 131\r\n189 180 82\r\n180 230 172\r\n139 213 131\r\n106 180 106\r\n90 164 90\r\n57 131 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n238 222 180\r\n205 189 156\r\n180 164 123\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n139 197 98\r\n106 164 65\r\n172 222 238\r\n148 197 213\r\n115 164 189\r\n90 139 164\r\n74 123 148\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_city/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 156 156\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 156 156\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 156 156\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 156 156\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n156 205 246\r\n98 156 238\r\n0 0 0\r\n0 0 0\r\n123 164 172\r\n148 189 197\r\n172 205 213\r\n205 222 230\r\n98 123 148\r\n123 148 172\r\n148 172 197\r\n98 98 123\r\n148 139 131\r\n222 205 213\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n123 164 172\r\n222 189 172\r\n246 213 189\r\n246 230 180\r\n255 246 213\r\n164 189 213\r\n189 205 230\r\n222 230 246\r\n98 123 148\r\n123 148 172\r\n148 172 197\r\n98 98 123\r\n148 139 131\r\n205 189 197\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cerulean_gym/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n180 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n238 246 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n213 131 82\r\n156 205 246\r\n98 156 238\r\n57 123 222\r\n222 139 106\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n148 148 148\r\n180 180 180\r\n255 255 255\r\n238 246 238\r\n222 238 222\r\n197 205 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n139 139 148\r\n180 156 172\r\n205 189 189\r\n230 222 189\r\n90 115 90\r\n131 197 115\r\n205 238 115\r\n123 82 74\r\n180 98 98\r\n255 139 74\r\n238 246 172\r\n255 230 74\r\n106 90 82\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n139 139 148\r\n205 189 189\r\n246 246 255\r\n148 131 180\r\n205 189 230\r\n123 98 255\r\n82 172 148\r\n255 98 98\r\n90 115 90\r\n131 197 115\r\n205 238 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n106 90 82\r\n148 115 82\r\n172 131 90\r\n213 172 90\r\n230 180 90\r\n164 90 172\r\n197 115 205\r\n230 148 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_gym/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 82 0\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 189 164\r\n189 148 139\r\n156 115 115\r\n123 82 82\r\n90 57 74\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n222 205 131\r\n205 180 106\r\n180 139 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n139 82 57\r\n164 106 82\r\n205 148 123\r\n222 164 139\r\n172 189 238\r\n213 222 246\r\n156 131 90\r\n189 164 115\r\n222 205 156\r\n255 238 189\r\n164 164 180\r\n82 82 106\r\n123 123 139\r\n205 205 222\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 255 246\r\n230 230 189\r\n197 197 156\r\n172 172 131\r\n123 123 82\r\n65 74 106\r\n123 123 131\r\n123 123 131\r\n98 164 222\r\n74 131 197\r\n139 222 189\r\n106 189 156\r\n106 189 156\r\n74 156 123\r\n90 90 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/cinnabar_island/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n156 213 255\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n139 180 222\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n90 90 115\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n65 98 156\r\n90 123 180\r\n115 156 197\r\n222 213 131\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n106 172 115\r\n156 205 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 238 246\r\n172 197 180\r\n197 222 205\r\n90 189 172\r\n246 238 156\r\n205 189 131\r\n189 164 123\r\n148 131 106\r\n106 106 106\r\n213 222 230\r\n238 180 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n213 222 222\r\n164 180 189\r\n255 0 255\r\n131 115 74\r\n213 213 148\r\n197 189 139\r\n172 156 115\r\n148 131 90\r\n197 197 205\r\n205 82 65\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n139 139 148\r\n180 180 164\r\n255 255 255\r\n205 197 106\r\n246 238 148\r\n255 255 222\r\n98 98 123\r\n238 238 238\r\n82 222 123\r\n131 255 164\r\n82 164 57\r\n230 139 98\r\n189 98 74\r\n213 213 213\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n148 148 164\r\n180 180 164\r\n255 255 255\r\n213 213 213\r\n106 156 164\r\n131 189 197\r\n172 222 230\r\n238 180 222\r\n180 115 164\r\n213 213 180\r\n255 0 255\r\n156 205 246\r\n98 156 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n148 148 164\r\n180 180 164\r\n255 255 255\r\n213 213 213\r\n148 205 180\r\n115 172 148\r\n106 148 139\r\n197 238 255\r\n172 213 255\r\n123 164 222\r\n98 139 189\r\n123 164 189\r\n148 189 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n148 148 164\r\n205 189 197\r\n255 255 255\r\n255 213 115\r\n189 148 49\r\n139 98 74\r\n90 106 180\r\n255 205 139\r\n230 172 90\r\n230 148 65\r\n180 98 24\r\n238 213 172\r\n222 156 139\r\n123 123 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n115 115 115\r\n180 180 164\r\n238 238 238\r\n213 222 164\r\n115 156 148\r\n230 213 115\r\n180 172 90\r\n139 148 90\r\n98 123 180\r\n148 156 156\r\n189 197 197\r\n246 230 164\r\n180 189 131\r\n205 213 213\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n131 131 82\r\n164 164 98\r\n197 197 156\r\n106 164 172\r\n197 205 213\r\n205 156 32\r\n172 148 197\r\n205 164 230\r\n230 197 255\r\n205 197 106\r\n230 230 230\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/condominiums/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n213 222 164\r\n180 189 131\r\n139 148 90\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 222 156\r\n82 82 106\r\n115 123 131\r\n98 90 65\r\n139 123 82\r\n197 172 90\r\n230 230 238\r\n205 115 74\r\n238 172 82\r\n238 213 82\r\n131 189 57\r\n164 222 82\r\n156 139 172\r\n205 172 222\r\n213 205 230\r\n246 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 222 156\r\n82 82 106\r\n131 131 131\r\n172 123 82\r\n205 131 65\r\n213 148 65\r\n205 148 82\r\n238 164 82\r\n238 180 82\r\n148 106 74\r\n189 197 213\r\n222 230 230\r\n156 172 172\r\n90 131 238\r\n106 164 255\r\n156 189 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 222 156\r\n82 82 106\r\n131 131 131\r\n57 106 82\r\n41 156 98\r\n90 205 115\r\n197 172 90\r\n156 131 82\r\n213 205 106\r\n230 197 238\r\n180 189 164\r\n213 222 189\r\n156 172 172\r\n205 180 213\r\n189 197 213\r\n230 246 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/department_store/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n197 172 123\r\n172 139 90\r\n148 106 65\r\n123 74 41\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n222 222 156\r\n189 189 123\r\n148 148 106\r\n115 106 90\r\n82 74 65\r\n57 49 41\r\n65 65 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n197 172 123\r\n172 139 90\r\n148 106 65\r\n123 74 41\r\n164 180 230\r\n139 156 222\r\n98 106 139\r\n65 65 57\r\n255 0 255\r\n255 0 255\r\n65 65 74\r\n0 0 0\r\n98 139 197\r\n74 115 172\r\n57 98 156\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n255 238 180\r\n222 205 148\r\n197 172 123\r\n172 139 90\r\n222 222 156\r\n189 189 123\r\n148 148 106\r\n115 106 90\r\n82 74 65\r\n57 49 41\r\n65 65 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n197 172 123\r\n172 139 90\r\n148 106 65\r\n123 74 41\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n180 180 98\r\n164 164 74\r\n139 139 49\r\n123 115 41\r\n255 238 180\r\n222 205 148\r\n197 172 123\r\n172 139 90\r\n222 222 156\r\n189 189 123\r\n148 148 82\r\n115 106 49\r\n90 82 41\r\n57 49 41\r\n65 65 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/digletts_cave/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n246 246 255\r\n205 197 213\r\n156 156 164\r\n222 230 255\r\n172 205 213\r\n156 189 172\r\n189 230 148\r\n139 205 123\r\n106 131 98\r\n238 131 106\r\n205 106 106\r\n255 246 41\r\n255 205 148\r\n189 197 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n172 172 189\r\n222 213 205\r\n238 238 238\r\n123 139 74\r\n148 205 98\r\n205 246 123\r\n255 238 230\r\n222 222 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n156 156 139\r\n164 148 65\r\n213 164 106\r\n230 213 131\r\n246 238 205\r\n0 0 0\r\n197 189 123\r\n222 213 139\r\n246 238 180\r\n238 205 172\r\n205 205 213\r\n255 148 131\r\n255 255 115\r\n156 197 230\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_1/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n189 189 131\r\n115 189 246\r\n98 172 238\r\n115 189 246\r\n98 164 222\r\n82 139 197\r\n74 115 172\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n115 189 246\r\n98 172 238\r\n255 189 131\r\n238 148 115\r\n222 106 98\r\n205 65 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n180 255 131\r\n131 197 98\r\n57 139 49\r\n57 82 0\r\n222 148 115\r\n106 90 90\r\n164 98 90\r\n65 57 49\r\n255 197 148\r\n222 106 98\r\n205 65 82\r\n164 213 197\r\n115 197 164\r\n65 180 131\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n213 213 213\r\n189 189 189\r\n164 164 164\r\n131 131 139\r\n65 180 131\r\n164 213 197\r\n65 49 65\r\n238 213 205\r\n222 180 164\r\n189 148 139\r\n156 115 115\r\n131 90 90\r\n98 65 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n156 164 189\r\n82 106 213\r\n65 90 189\r\n57 82 156\r\n41 65 139\r\n172 197 230\r\n139 164 222\r\n106 131 213\r\n82 106 213\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n131 197 246\r\n106 180 222\r\n238 230 164\r\n222 205 131\r\n213 180 106\r\n205 156 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 255 255\r\n238 222 172\r\n230 156 98\r\n197 90 65\r\n65 74 106\r\n106 106 123\r\n131 90 49\r\n90 65 49\r\n57 57 57\r\n222 222 197\r\n172 180 148\r\n131 148 115\r\n106 123 65\r\n156 205 230\r\n156 156 156\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 255 255\r\n213 222 246\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n164 205 189\r\n139 180 172\r\n115 156 139\r\n98 139 131\r\n189 172 180\r\n156 139 148\r\n230 106 57\r\n205 49 24\r\n148 57 24\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 255 255\r\n213 222 246\r\n164 172 222\r\n98 98 123\r\n65 74 106\r\n98 98 123\r\n65 74 106\r\n115 123 164\r\n49 49 74\r\n189 238 180\r\n106 222 115\r\n74 180 98\r\n57 131 82\r\n131 197 230\r\n98 156 172\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n82 82 106\r\n148 148 164\r\n205 189 197\r\n255 255 255\r\n222 213 230\r\n189 172 180\r\n255 205 106\r\n230 189 106\r\n205 156 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n57 139 49\r\n106 106 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n74 74 98\r\n106 106 115\r\n0 0 0\r\n0 0 0\r\n148 106 57\r\n189 139 57\r\n213 189 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 255 255\r\n213 222 246\r\n164 172 222\r\n98 98 123\r\n65 74 106\r\n238 213 205\r\n222 172 164\r\n205 131 123\r\n189 98 82\r\n222 222 222\r\n172 180 189\r\n139 148 164\r\n106 123 123\r\n222 74 0\r\n213 213 57\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_2/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n189 189 156\r\n172 172 139\r\n148 139 115\r\n123 115 90\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n222 197 189\r\n205 180 156\r\n189 148 139\r\n148 115 106\r\n115 65 74\r\n82 49 65\r\n90 90 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 222 213\r\n189 189 156\r\n172 172 139\r\n148 139 115\r\n123 115 90\r\n255 238 164\r\n230 197 139\r\n205 172 123\r\n164 123 90\r\n148 115 74\r\n106 65 41\r\n74 74 57\r\n0 0 0\r\n98 139 197\r\n74 115 172\r\n57 98 156\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n255 238 164\r\n230 197 139\r\n205 172 123\r\n172 139 106\r\n213 197 189\r\n205 180 156\r\n189 148 139\r\n148 115 106\r\n115 65 74\r\n82 49 65\r\n90 90 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n189 189 156\r\n172 172 139\r\n148 139 115\r\n123 115 90\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n238 222 148\r\n222 205 115\r\n205 180 98\r\n189 172 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_3/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n189 189 156\r\n172 172 139\r\n148 139 115\r\n123 115 90\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n222 197 189\r\n205 180 156\r\n189 148 139\r\n148 115 106\r\n115 65 74\r\n82 49 65\r\n90 90 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 222 213\r\n189 189 156\r\n172 172 139\r\n148 139 115\r\n123 115 90\r\n255 238 164\r\n230 197 139\r\n205 172 123\r\n164 123 90\r\n148 115 74\r\n106 65 41\r\n74 74 57\r\n0 0 0\r\n98 139 197\r\n74 115 172\r\n57 98 156\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n255 238 164\r\n230 197 139\r\n205 172 123\r\n172 139 106\r\n213 197 189\r\n205 180 156\r\n189 148 139\r\n148 115 106\r\n115 65 74\r\n82 49 65\r\n90 90 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n189 189 156\r\n172 172 139\r\n148 139 115\r\n123 115 90\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n238 222 148\r\n222 205 115\r\n205 180 98\r\n189 172 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/dummy_4/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 197\r\n82 82 106\r\n131 131 131\r\n131 115 90\r\n189 131 90\r\n205 156 90\r\n238 180 90\r\n172 172 131\r\n222 222 172\r\n172 180 205\r\n238 230 172\r\n255 255 246\r\n255 255 246\r\n197 205 222\r\n205 213 230\r\n230 230 246\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 197\r\n82 82 106\r\n131 131 131\r\n246 246 189\r\n180 180 139\r\n205 156 90\r\n230 230 131\r\n222 213 131\r\n205 205 115\r\n197 180 115\r\n255 0 255\r\n123 123 98\r\n156 156 98\r\n205 148 197\r\n90 164 205\r\n90 189 246\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 197\r\n82 82 106\r\n131 131 131\r\n123 189 222\r\n123 156 189\r\n164 222 246\r\n189 238 238\r\n74 139 98\r\n106 172 106\r\n123 205 123\r\n90 148 115\r\n139 197 131\r\n197 238 123\r\n197 172 74\r\n255 0 255\r\n230 230 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fan_club_daycare/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n189 255 139\r\n131 213 98\r\n57 139 49\r\n57 82 0\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 189 164\r\n189 148 139\r\n156 115 115\r\n123 82 82\r\n90 57 74\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 131\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n222 205 131\r\n205 180 106\r\n180 139 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n65 74 106\r\n123 123 131\r\n98 90 82\r\n115 106 98\r\n148 131 131\r\n180 156 131\r\n189 172 98\r\n213 205 131\r\n238 222 139\r\n90 106 164\r\n98 139 230\r\n115 205 255\r\n255 0 255\r\n255 0 255\r\n98 106 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n65 74 106\r\n123 123 131\r\n139 90 82\r\n189 123 115\r\n222 148 131\r\n255 197 156\r\n156 156 172\r\n189 197 213\r\n230 238 238\r\n49 98 90\r\n74 148 131\r\n82 197 148\r\n106 230 172\r\n164 238 172\r\n98 106 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n65 74 106\r\n123 123 131\r\n180 164 90\r\n0 0 255\r\n255 238 197\r\n238 238 205\r\n189 180 172\r\n172 172 156\r\n205 205 172\r\n139 123 49\r\n164 148 74\r\n205 197 123\r\n230 213 139\r\n106 172 123\r\n123 197 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 197\r\n180 238 82\r\n139 213 82\r\n90 164 49\r\n57 90 90\r\n74 123 74\r\n90 98 49\r\n139 131 49\r\n65 57 49\r\n57 139 98\r\n123 197 49\r\n123 197 82\r\n57 139 49\r\n115 205 164\r\n57 172 156\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 131\r\n205 180 106\r\n238 180 139\r\n222 148 131\r\n189 123 115\r\n139 90 82\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_city/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n156 131 57\r\n213 197 106\r\n246 238 148\r\n213 222 238\r\n222 230 255\r\n41 106 82\r\n57 131 115\r\n172 131 115\r\n197 156 148\r\n238 180 164\r\n180 139 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n156 131 57\r\n213 197 106\r\n246 238 148\r\n156 205 246\r\n115 172 222\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n131 131 131\r\n180 180 164\r\n255 255 255\r\n172 131 115\r\n197 156 148\r\n238 180 164\r\n255 222 197\r\n255 238 238\r\n230 164 98\r\n255 197 98\r\n205 164 156\r\n180 139 123\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/fuchsia_gym/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n131 131 131\r\n180 180 164\r\n255 255 255\r\n255 164 115\r\n255 222 189\r\n123 164 238\r\n172 205 238\r\n213 230 238\r\n164 255 180\r\n238 164 0\r\n139 90 197\r\n213 156 255\r\n255 255 148\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 255 0\r\n82 82 106\r\n131 131 131\r\n180 180 164\r\n255 255 255\r\n255 255 123\r\n205 180 98\r\n246 230 172\r\n74 131 197\r\n139 197 255\r\n164 255 180\r\n238 246 246\r\n164 74 32\r\n213 115 57\r\n238 148 98\r\n255 189 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n255 0 255\r\n255 0 255\r\n255 255 255\r\n255 0 255\r\n131 172 238\r\n246 230 172\r\n82 180 172\r\n32 115 123\r\n255 148 115\r\n230 106 90\r\n90 213 156\r\n255 189 82\r\n16 123 255\r\n131 189 246\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n230 230 230\r\n172 148 197\r\n205 164 230\r\n230 197 255\r\n238 230 123\r\n189 172 98\r\n255 255 148\r\n131 255 255\r\n74 131 197\r\n230 189 164\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n172 172 156\r\n230 230 205\r\n197 197 172\r\n172 172 164\r\n189 189 164\r\n255 0 255\r\n131 172 238\r\n106 197 106\r\n197 180 74\r\n255 0 255\r\n222 222 222\r\n213 139 57\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n222 238 255\r\n255 0 255\r\n255 0 255\r\n32 156 222\r\n139 197 255\r\n180 98 0\r\n197 123 0\r\n205 139 0\r\n213 164 0\r\n230 180 0\r\n230 197 65\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/game_corner/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n230 230 205\r\n205 205 180\r\n172 172 148\r\n222 222 222\r\n156 115 197\r\n131 172 238\r\n106 197 106\r\n197 180 74\r\n0 0 0\r\n213 139 57\r\n238 222 131\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n180 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n238 246 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n255 0 255\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n164 164 164\r\n180 189 189\r\n255 255 255\r\n238 246 238\r\n213 230 222\r\n197 205 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 222 156\r\n82 82 106\r\n115 123 131\r\n98 90 65\r\n139 123 82\r\n197 172 90\r\n230 230 238\r\n205 115 74\r\n238 172 82\r\n238 213 82\r\n131 189 57\r\n164 222 82\r\n156 139 172\r\n205 172 222\r\n213 205 230\r\n246 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_1/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n148 172 139\r\n180 197 164\r\n213 222 197\r\n238 255 213\r\n115 156 180\r\n197 222 238\r\n123 197 189\r\n156 222 213\r\n213 255 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n230 222 156\r\n189 98 74\r\n230 156 98\r\n213 205 156\r\n115 156 180\r\n246 238 189\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n156 213 255\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n131 131 131\r\n180 180 164\r\n255 255 255\r\n189 164 82\r\n222 197 106\r\n230 222 156\r\n123 197 189\r\n156 222 213\r\n213 255 246\r\n255 0 255\r\n255 0 255\r\n213 131 65\r\n222 230 222\r\n246 238 189\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/generic_building_2/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n139 180 222\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n90 90 115\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n65 98 156\r\n90 123 180\r\n115 156 197\r\n222 213 131\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n106 172 115\r\n156 205 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 238 246\r\n172 197 180\r\n197 222 205\r\n90 189 172\r\n246 238 156\r\n205 189 131\r\n189 164 123\r\n148 131 106\r\n106 106 106\r\n213 222 230\r\n238 180 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n213 222 222\r\n164 180 189\r\n255 0 255\r\n131 115 74\r\n213 213 148\r\n197 189 139\r\n172 156 115\r\n148 131 90\r\n197 197 205\r\n205 82 65\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n156 189 255\r\n82 123 197\r\n49 90 156\r\n106 164 148\r\n82 139 123\r\n106 164 222\r\n222 230 148\r\n189 197 115\r\n90 148 197\r\n222 164 32\r\n189 230 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n213 222 222\r\n180 197 213\r\n156 172 197\r\n230 106 90\r\n189 65 49\r\n255 131 115\r\n139 41 24\r\n197 255 205\r\n238 197 106\r\n255 255 213\r\n255 246 172\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n139 222 148\r\n156 238 164\r\n197 255 205\r\n172 246 180\r\n238 238 197\r\n255 0 255\r\n255 0 255\r\n0 255 156\r\n189 65 49\r\n255 222 123\r\n246 197 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n238 230 156\r\n230 189 131\r\n131 189 172\r\n205 82 65\r\n255 148 0\r\n106 164 148\r\n82 139 123\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n156 213 197\r\n164 172 139\r\n90 0 255\r\n90 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n148 148 164\r\n205 189 197\r\n255 255 255\r\n115 115 131\r\n255 0 255\r\n0 255 156\r\n106 164 148\r\n82 139 123\r\n255 0 255\r\n255 255 172\r\n255 213 115\r\n213 180 106\r\n164 131 74\r\n222 213 230\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hall_of_fame/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n139 139 139\r\n189 189 164\r\n255 255 255\r\n230 222 246\r\n255 238 213\r\n255 0 0\r\n115 115 164\r\n131 139 230\r\n164 164 255\r\n156 106 16\r\n115 115 139\r\n213 213 172\r\n222 172 82\r\n189 139 49\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n139 139 148\r\n180 180 164\r\n255 255 255\r\n255 0 0\r\n255 0 0\r\n255 0 0\r\n255 0 0\r\n172 90 49\r\n205 98 57\r\n246 139 98\r\n255 205 139\r\n255 0 0\r\n255 0 0\r\n255 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n139 139 139\r\n189 189 164\r\n255 255 255\r\n230 222 246\r\n148 148 197\r\n189 189 246\r\n205 106 49\r\n246 180 49\r\n255 246 131\r\n255 0 0\r\n189 172 82\r\n213 205 98\r\n148 115 41\r\n172 139 57\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n123 123 131\r\n189 189 164\r\n255 255 255\r\n213 197 74\r\n213 180 131\r\n148 115 41\r\n172 139 57\r\n213 213 180\r\n106 139 49\r\n131 172 74\r\n164 205 106\r\n197 255 172\r\n115 90 57\r\n255 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n139 139 139\r\n189 189 164\r\n255 255 255\r\n222 197 74\r\n230 230 106\r\n230 222 246\r\n148 98 123\r\n197 131 156\r\n197 164 189\r\n123 164 189\r\n131 197 98\r\n172 238 139\r\n90 156 57\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 74 106\r\n139 139 139\r\n180 180 164\r\n255 255 255\r\n189 180 49\r\n222 213 82\r\n123 115 49\r\n156 148 16\r\n213 213 180\r\n98 156 139\r\n123 180 189\r\n172 222 230\r\n255 205 139\r\n246 246 164\r\n222 131 90\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/hoenn_building/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n222 230 255\r\n197 213 255\r\n164 197 238\r\n123 172 230\r\n90 148 197\r\n65 123 180\r\n90 164 205\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n32 98 139\r\n238 230 139\r\n222 197 139\r\n205 180 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n222 230 255\r\n197 213 255\r\n164 197 238\r\n123 172 230\r\n41 82 164\r\n41 57 131\r\n74 123 197\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n32 98 139\r\n238 230 139\r\n222 197 139\r\n205 180 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 205 65\r\n222 172 65\r\n180 98 0\r\n213 213 139\r\n189 189 115\r\n148 148 82\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n213 230 197\r\n156 172 139\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n222 172 65\r\n180 98 0\r\n131 65 0\r\n205 205 123\r\n164 164 57\r\n115 189 246\r\n74 148 213\r\n49 115 180\r\n189 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n255 255 255\r\n213 213 222\r\n180 180 164\r\n148 148 139\r\n123 123 131\r\n82 82 106\r\n197 222 205\r\n148 172 156\r\n98 131 106\r\n230 139 24\r\n197 98 0\r\n172 65 0\r\n230 213 139\r\n205 180 106\r\n172 148 82\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n148 148 139\r\n222 222 230\r\n205 205 213\r\n180 180 164\r\n255 0 255\r\n222 222 205\r\n205 205 189\r\n172 172 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n230 213 139\r\n205 180 106\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/indigo_plateau/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n123 123 131\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n90 90 115\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n230 246 255\r\n189 222 255\r\n139 189 255\r\n115 164 255\r\n65 139 222\r\n57 115 222\r\n82 148 230\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 197\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n205 230 246\r\n180 213 255\r\n123 180 246\r\n98 148 230\r\n65 123 189\r\n49 98 180\r\n82 131 222\r\n213 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n238 246 246\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n205 213 213\r\n180 189 189\r\n148 156 156\r\n106 115 115\r\n197 246 230\r\n106 205 164\r\n57 156 115\r\n222 106 98\r\n222 213 123\r\n255 180 148\r\n197 189 98\r\n238 246 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n65 123 180\r\n238 246 255\r\n222 230 238\r\n189 205 230\r\n156 164 189\r\n139 139 156\r\n98 98 123\r\n57 57 106\r\n197 98 98\r\n172 65 106\r\n32 74 156\r\n197 148 0\r\n246 213 24\r\n222 238 255\r\n255 255 255\r\n74 106 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n148 148 164\r\n205 189 197\r\n255 255 255\r\n255 213 115\r\n189 148 49\r\n139 98 74\r\n90 106 180\r\n255 205 139\r\n230 172 90\r\n230 148 65\r\n180 98 24\r\n238 213 172\r\n222 156 139\r\n123 123 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n148 148 164\r\n172 172 164\r\n164 222 255\r\n115 180 205\r\n65 139 164\r\n41 106 148\r\n205 213 213\r\n238 230 139\r\n189 180 98\r\n139 131 65\r\n0 0 0\r\n255 255 255\r\n230 172 90\r\n189 246 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 255 255\r\n224 224 200\r\n104 120 64\r\n128 144 112\r\n65 74 106\r\n98 98 123\r\n232 152 96\r\n176 176 144\r\n160 168 216\r\n189 238 180\r\n106 222 115\r\n74 180 98\r\n57 131 82\r\n128 192 224\r\n96 152 168\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/island_harbor/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n238 238 246\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n139 180 222\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n90 90 115\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n65 98 156\r\n90 123 180\r\n115 156 197\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n106 172 115\r\n156 205 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n139 131 148\r\n180 172 180\r\n189 197 213\r\n255 255 255\r\n255 205 139\r\n230 164 98\r\n197 131 65\r\n172 90 24\r\n82 148 197\r\n131 189 222\r\n189 230 255\r\n123 123 123\r\n197 180 74\r\n246 238 148\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n139 131 148\r\n180 172 180\r\n189 197 213\r\n255 255 255\r\n222 222 180\r\n197 197 148\r\n156 156 106\r\n230 164 98\r\n172 90 24\r\n172 164 65\r\n139 123 24\r\n246 238 148\r\n0 0 0\r\n246 238 148\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n238 238 246\r\n82 82 106\r\n139 131 148\r\n180 172 180\r\n189 197 213\r\n255 255 255\r\n139 197 139\r\n156 205 246\r\n98 156 238\r\n90 123 180\r\n222 205 106\r\n213 230 246\r\n255 189 180\r\n230 106 65\r\n255 131 115\r\n246 238 148\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/lab/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 255 255\r\n172 222 255\r\n148 189 238\r\n106 156 230\r\n57 148 197\r\n32 131 172\r\n82 148 213\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n230 213 148\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n222 255 255\r\n172 222 255\r\n148 189 238\r\n106 156 230\r\n41 90 172\r\n41 57 148\r\n74 123 197\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n230 213 148\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n115 205 164\r\n148 164 180\r\n123 123 131\r\n65 74 106\r\n205 82 74\r\n172 32 41\r\n255 246 189\r\n238 230 156\r\n222 205 131\r\n189 164 90\r\n148 131 49\r\n123 90 24\r\n123 123 131\r\n65 74 106\r\n205 222 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n255 255 255\r\n230 246 238\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n172 172 106\r\n213 213 148\r\n180 205 180\r\n148 180 148\r\n131 164 131\r\n106 139 106\r\n197 222 197\r\n139 172 139\r\n90 115 90\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n255 255 255\r\n213 230 222\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n82 82 106\r\n213 238 255\r\n164 189 222\r\n123 148 180\r\n255 238 139\r\n222 180 65\r\n255 255 189\r\n164 98 98\r\n213 148 148\r\n197 123 131\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n255 255 255\r\n255 0 255\r\n255 0 255\r\n123 123 131\r\n255 0 255\r\n82 82 106\r\n213 238 255\r\n164 189 222\r\n123 148 180\r\n255 238 139\r\n222 180 65\r\n255 255 189\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n246 246 255\r\n222 205 246\r\n205 172 255\r\n172 139 213\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 131\r\n213 189 98\r\n222 197 255\r\n172 139 213\r\n148 115 189\r\n139 106 180\r\n255 246 164\r\n172 148 82\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/lavender_town/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n246 230 172\r\n246 213 180\r\n222 189 164\r\n180 148 123\r\n139 98 90\r\n90 57 74\r\n123 123 131\r\n65 74 106\r\n205 222 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n238 246 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n164 172 164\r\n180 189 189\r\n238 246 246\r\n238 246 238\r\n213 230 222\r\n197 205 197\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n115 189 139\r\n172 230 172\r\n205 246 205\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n164 172 164\r\n180 189 189\r\n238 246 246\r\n238 246 238\r\n213 230 222\r\n197 205 197\r\n255 0 255\r\n255 0 255\r\n156 205 255\r\n106 164 238\r\n74 139 230\r\n57 131 205\r\n41 98 189\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mart/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n123 123 131\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n90 90 115\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n213 238 255\r\n172 205 255\r\n139 180 238\r\n106 156 230\r\n74 139 189\r\n65 123 189\r\n82 139 205\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 172\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n213 238 255\r\n172 205 255\r\n139 180 238\r\n106 156 230\r\n65 123 172\r\n41 98 156\r\n74 115 197\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 172\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n172 123 123\r\n139 98 98\r\n115 74 74\r\n90 49 49\r\n65 24 24\r\n41 0 0\r\n41 41 49\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n197 197 180\r\n172 172 156\r\n148 148 123\r\n123 123 106\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n213 172 172\r\n197 156 148\r\n172 123 123\r\n131 82 74\r\n115 49 49\r\n90 24 24\r\n90 90 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n197 197 180\r\n172 172 156\r\n148 148 123\r\n123 123 106\r\n255 238 164\r\n230 197 139\r\n205 172 123\r\n164 123 90\r\n148 115 74\r\n106 65 41\r\n74 74 57\r\n0 0 0\r\n98 139 197\r\n74 115 172\r\n57 98 156\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n255 238 164\r\n230 197 139\r\n205 172 123\r\n172 139 106\r\n213 172 172\r\n197 156 148\r\n172 123 123\r\n131 82 74\r\n115 49 49\r\n90 24 24\r\n90 90 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n197 197 180\r\n172 172 156\r\n148 148 123\r\n123 123 106\r\n164 172 172\r\n255 230 65\r\n123 123 106\r\n255 255 255\r\n74 65 74\r\n238 238 230\r\n189 189 180\r\n230 230 205\r\n205 205 180\r\n180 180 164\r\n164 164 148\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n139 205 246\r\n98 172 197\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n139 90 90\r\n106 65 65\r\n82 49 49\r\n49 32 32\r\n24 16 16\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/mt_ember/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n180 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n238 246 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n213 131 82\r\n156 205 246\r\n98 156 238\r\n57 123 222\r\n222 139 106\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n148 148 148\r\n180 180 180\r\n255 255 255\r\n238 246 238\r\n222 238 222\r\n197 205 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n90 90 90\r\n115 106 98\r\n148 123 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n106 98 74\r\n139 123 74\r\n164 139 74\r\n222 205 74\r\n123 123 123\r\n189 197 205\r\n238 246 238\r\n98 90 98\r\n156 131 106\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n98 98 74\r\n164 139 82\r\n222 205 74\r\n255 0 255\r\n255 0 255\r\n213 213 156\r\n222 230 172\r\n246 246 238\r\n90 90 98\r\n115 115 106\r\n156 131 106\r\n205 131 82\r\n238 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n98 98 74\r\n164 139 82\r\n222 205 74\r\n65 123 164\r\n82 139 197\r\n98 189 213\r\n148 213 213\r\n180 238 230\r\n189 197 205\r\n238 246 238\r\n222 222 172\r\n205 131 82\r\n246 172 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/museum/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n255 0 255\r\n197 213 205\r\n180 197 189\r\n164 172 172\r\n131 148 139\r\n255 0 255\r\n246 205 74\r\n255 0 255\r\n180 189 197\r\n180 189 197\r\n189 197 197\r\n164 172 172\r\n131 139 139\r\n106 106 106\r\n90 90 82\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n255 0 255\r\n197 213 205\r\n180 197 189\r\n164 172 172\r\n131 148 139\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 255 255\r\n255 255 255\r\n246 246 238\r\n222 222 213\r\n189 189 180\r\n156 156 139\r\n98 98 90\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n238 238 164\r\n197 213 205\r\n180 197 189\r\n164 172 172\r\n205 205 106\r\n205 205 197\r\n172 172 90\r\n123 131 74\r\n82 90 32\r\n106 106 82\r\n74 74 74\r\n0 0 0\r\n98 139 197\r\n74 115 172\r\n57 98 156\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n238 238 230\r\n172 172 164\r\n74 74 74\r\n0 0 0\r\n255 246 180\r\n238 222 123\r\n197 205 123\r\n197 213 205\r\n255 255 255\r\n255 255 255\r\n246 246 238\r\n222 222 213\r\n189 189 180\r\n156 156 139\r\n98 98 90\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n230 197 65\r\n197 213 205\r\n180 197 189\r\n164 172 172\r\n205 205 197\r\n255 230 65\r\n123 123 131\r\n255 255 255\r\n74 65 74\r\n238 238 230\r\n189 189 180\r\n238 238 230\r\n222 222 213\r\n205 205 197\r\n156 156 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n197 213 205\r\n180 197 189\r\n164 172 172\r\n131 148 139\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n139 156 180\r\n139 139 164\r\n131 139 148\r\n115 115 131\r\n90 90 106\r\n82 82 82\r\n57 65 65\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/navel_rock/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 139 49\r\n57 82 0\r\n115 98 98\r\n65 57 49\r\n255 255 255\r\n139 213 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 189 139\r\n24 172 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n238 238 238\r\n222 222 230\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n139 230 189\r\n74 205 131\r\n65 172 115\r\n238 213 197\r\n222 189 164\r\n189 148 139\r\n156 115 115\r\n123 82 82\r\n90 57 74\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n115 82 74\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n197 172 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 238 246\r\n189 139 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n172 32 41\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n222 230 238\r\n230 213 164\r\n205 197 148\r\n222 180 164\r\n156 164 189\r\n82 106 213\r\n65 90 189\r\n57 82 156\r\n41 65 139\r\n172 197 230\r\n139 164 222\r\n106 131 213\r\n82 106 213\r\n189 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n238 222 164\r\n222 205 131\r\n205 180 106\r\n180 139 74\r\n238 230 172\r\n246 238 205\r\n222 205 131\r\n255 0 255\r\n65 189 139\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n246 246 255\r\n222 230 246\r\n189 197 222\r\n156 172 189\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 205 246\r\n98 156 238\r\n57 123 222\r\n255 205 180\r\n246 164 131\r\n222 139 106\r\n189 98 74\r\n123 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n246 246 255\r\n222 230 246\r\n189 197 222\r\n156 172 189\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 205 246\r\n98 156 238\r\n57 123 222\r\n246 238 197\r\n230 222 148\r\n213 189 106\r\n197 148 74\r\n222 205 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 205 148\r\n246 246 255\r\n189 197 222\r\n156 172 189\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 205 246\r\n98 156 238\r\n98 156 238\r\n205 139 148\r\n189 123 131\r\n164 90 106\r\n139 65 82\r\n32 172 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n238 255 255\r\n156 230 197\r\n148 222 189\r\n139 213 189\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 238 213\r\n115 205 164\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n156 230 197\r\n148 222 189\r\n139 213 189\r\n238 213 197\r\n222 189 164\r\n189 148 139\r\n156 115 115\r\n123 82 82\r\n90 57 74\r\n189 238 213\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pallet_town/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 139 49\r\n57 82 0\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n255 0 255\r\n255 0 255\r\n238 213 197\r\n222 189 164\r\n189 148 139\r\n156 115 115\r\n123 82 82\r\n90 57 74\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 131\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n222 205 131\r\n205 180 106\r\n180 139 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n246 246 255\r\n230 238 255\r\n197 205 222\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 205 246\r\n98 156 238\r\n57 123 222\r\n222 106 98\r\n205 82 74\r\n222 230 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 205 246\r\n98 156 238\r\n57 123 222\r\n222 197 139\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n230 238 255\r\n180 197 213\r\n131 148 164\r\n123 123 131\r\n90 90 115\r\n57 65 98\r\n255 246 238\r\n213 197 189\r\n172 156 148\r\n131 123 115\r\n246 213 246\r\n238 189 213\r\n197 115 180\r\n172 106 131\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n123 123 131\r\n230 238 255\r\n197 205 222\r\n164 180 197\r\n156 205 246\r\n98 156 238\r\n57 65 98\r\n255 246 238\r\n213 197 189\r\n172 156 148\r\n131 123 115\r\n57 123 222\r\n238 238 246\r\n213 222 222\r\n197 197 213\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_city/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n139 180 222\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n90 90 115\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n65 98 156\r\n90 123 180\r\n115 156 197\r\n222 213 131\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n106 172 115\r\n156 205 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 238 246\r\n172 197 180\r\n197 222 205\r\n90 189 172\r\n246 238 156\r\n205 189 131\r\n189 164 123\r\n148 131 106\r\n106 106 106\r\n213 222 230\r\n238 180 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n213 222 222\r\n164 180 189\r\n255 0 255\r\n131 115 74\r\n213 213 148\r\n197 189 139\r\n172 156 115\r\n148 131 90\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 131 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n82 82 106\r\n123 123 139\r\n205 205 197\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n222 213 139\r\n180 172 98\r\n156 148 82\r\n213 255 197\r\n164 230 148\r\n123 172 148\r\n148 213 164\r\n156 74 41\r\n180 90 65\r\n213 131 106\r\n238 164 139\r\n246 238 205\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n156 189 131\r\n222 205 115\r\n156 148 82\r\n123 106 57\r\n74 131 164\r\n98 172 205\r\n49 139 49\r\n106 205 164\r\n156 148 82\r\n115 164 106\r\n205 230 197\r\n238 255 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 131 131\r\n98 74 49\r\n131 106 82\r\n164 139 115\r\n197 189 139\r\n148 148 156\r\n172 172 172\r\n172 189 115\r\n205 222 148\r\n98 131 131\r\n131 164 164\r\n164 197 197\r\n82 82 106\r\n123 123 139\r\n205 205 197\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pewter_gym/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 222 205\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n131 205 139\r\n230 189 115\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 255 0\r\n82 82 106\r\n148 148 164\r\n205 189 197\r\n255 255 255\r\n189 148 49\r\n156 115 90\r\n197 238 148\r\n156 197 74\r\n106 164 41\r\n197 222 205\r\n139 180 172\r\n172 205 180\r\n123 123 139\r\n255 98 49\r\n238 222 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n189 98 74\r\n255 131 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n189 230 255\r\n189 230 255\r\n156 189 213\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 222 156\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n222 230 230\r\n180 213 230\r\n131 180 205\r\n98 156 164\r\n57 115 139\r\n255 65 0\r\n205 49 0\r\n8 90 255\r\n0 57 197\r\n255 180 0\r\n0 230 115\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n164 172 164\r\n180 189 189\r\n255 255 255\r\n115 115 123\r\n213 205 156\r\n238 238 172\r\n197 180 139\r\n230 222 156\r\n246 246 205\r\n0 82 123\r\n57 139 180\r\n115 197 238\r\n222 230 222\r\n131 131 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_center/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n139 180 222\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n90 90 115\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n65 98 156\r\n90 123 180\r\n115 156 197\r\n222 213 131\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n106 172 115\r\n156 205 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 238 246\r\n172 197 180\r\n197 222 205\r\n90 189 172\r\n246 238 156\r\n205 189 131\r\n189 164 123\r\n148 131 106\r\n106 106 106\r\n213 222 230\r\n238 180 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n213 222 222\r\n164 180 189\r\n222 164 115\r\n131 115 74\r\n213 213 148\r\n197 189 139\r\n172 156 115\r\n148 131 90\r\n197 197 205\r\n205 82 65\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n255 255 255\r\n222 222 222\r\n106 115 115\r\n189 230 255\r\n123 205 255\r\n98 180 246\r\n49 139 213\r\n180 180 164\r\n172 213 222\r\n156 197 205\r\n180 156 222\r\n156 131 205\r\n139 197 230\r\n131 172 222\r\n98 148 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n255 255 255\r\n222 222 222\r\n106 115 115\r\n222 230 238\r\n180 197 205\r\n148 164 180\r\n131 139 139\r\n238 238 238\r\n230 230 230\r\n213 213 213\r\n139 213 156\r\n123 189 139\r\n230 222 123\r\n213 205 106\r\n189 180 90\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n255 255 255\r\n222 222 222\r\n106 115 115\r\n230 197 246\r\n180 82 205\r\n148 57 180\r\n230 222 123\r\n189 180 82\r\n230 230 172\r\n222 213 139\r\n222 164 164\r\n205 139 139\r\n205 180 238\r\n189 148 230\r\n164 131 205\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n82 164 164\r\n255 255 255\r\n230 230 230\r\n123 123 123\r\n189 189 197\r\n148 148 156\r\n213 213 222\r\n98 98 106\r\n180 180 164\r\n230 172 164\r\n197 131 131\r\n180 82 205\r\n148 57 180\r\n106 189 189\r\n82 164 164\r\n57 139 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n74 90 98\r\n98 123 139\r\n164 197 197\r\n222 238 238\r\n255 255 255\r\n123 123 123\r\n180 82 205\r\n131 49 164\r\n131 164 164\r\n230 213 156\r\n255 0 255\r\n213 131 222\r\n255 246 156\r\n90 16 131\r\n41 49 57\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_league/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n131 230 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 148 148\r\n82 131 106\r\n131 180 156\r\n180 230 205\r\n180 0 0\r\n255 0 0\r\n148 148 156\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n82 82 106\r\n123 123 139\r\n205 205 197\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 148 148\r\n164 98 74\r\n222 148 123\r\n255 189 164\r\n139 82 57\r\n172 197 230\r\n213 222 238\r\n0 0 0\r\n0 0 0\r\n189 164 115\r\n0 0 0\r\n255 238 189\r\n82 82 106\r\n123 123 139\r\n205 205 197\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 148 148\r\n164 98 74\r\n222 148 123\r\n255 189 164\r\n139 82 57\r\n189 131 156\r\n246 205 238\r\n139 115 49\r\n156 131 90\r\n189 164 115\r\n222 205 156\r\n255 238 189\r\n82 82 106\r\n123 123 139\r\n205 205 197\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_mansion/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n115 115 115\r\n180 180 164\r\n238 238 246\r\n82 123 82\r\n90 131 90\r\n106 156 106\r\n131 172 131\r\n180 156 222\r\n106 82 156\r\n139 115 189\r\n213 189 255\r\n255 0 255\r\n65 106 65\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n115 115 115\r\n180 180 164\r\n238 238 246\r\n98 139 98\r\n106 156 106\r\n131 172 131\r\n148 189 148\r\n180 156 222\r\n205 139 32\r\n222 172 57\r\n246 238 164\r\n255 0 255\r\n82 123 82\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n115 115 115\r\n180 180 164\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n172 123 32\r\n238 189 74\r\n74 205 205\r\n164 255 255\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n131 106 189\r\n156 123 205\r\n230 230 255\r\n115 115 123\r\n106 156 106\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n106 82 156\r\n156 131 205\r\n205 172 246\r\n189 164 230\r\n115 115 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/pokemon_tower/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 156\r\n156 65 65\r\n57 106 16\r\n0 0 139\r\n98 123 156\r\n131 156 180\r\n164 189 213\r\n197 197 148\r\n213 205 172\r\n230 222 197\r\n164 156 164\r\n205 197 189\r\n82 82 106\r\n123 123 139\r\n246 238 222\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 156\r\n180 180 90\r\n222 222 148\r\n246 246 180\r\n156 65 65\r\n222 131 131\r\n189 98 98\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 156 164\r\n205 197 189\r\n82 82 106\r\n123 123 139\r\n246 238 222\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 156\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 156\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 156\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/power_plant/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n255 205 90\r\n82 148 197\r\n189 230 255\r\n139 98 41\r\n156 123 65\r\n180 148 90\r\n205 172 115\r\n246 213 172\r\n205 106 90\r\n255 148 131\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n82 82 106\r\n131 131 139\r\n230 222 246\r\n255 255 255\r\n255 205 98\r\n255 255 148\r\n189 230 255\r\n180 148 90\r\n255 139 180\r\n197 180 131\r\n213 213 164\r\n238 238 213\r\n106 197 106\r\n205 106 90\r\n131 115 16\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/restaurant_hotel/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n205 189 115\r\n172 172 115\r\n156 156 115\r\n131 131 115\r\n98 106 90\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n197 230 230\r\n180 213 213\r\n172 189 197\r\n131 156 156\r\n90 115 115\r\n74 82 82\r\n49 57 57\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n205 189 115\r\n172 172 115\r\n156 156 115\r\n131 131 115\r\n238 222 123\r\n255 0 255\r\n222 180 57\r\n189 148 57\r\n148 115 74\r\n106 106 82\r\n74 74 74\r\n0 0 0\r\n98 139 197\r\n74 115 172\r\n57 98 156\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n238 238 180\r\n230 213 123\r\n205 180 98\r\n156 156 115\r\n197 230 230\r\n180 213 213\r\n172 189 197\r\n131 156 156\r\n90 115 115\r\n74 82 82\r\n49 57 57\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n205 189 115\r\n172 172 115\r\n156 156 115\r\n131 131 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 156 98\r\n148 139 98\r\n115 123 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/rock_tunnel/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 139 49\r\n57 82 0\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n139 180 222\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n115 82 74\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n197 172 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 238 246\r\n189 139 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n172 32 41\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n222 205 131\r\n205 180 106\r\n180 139 74\r\n238 238 164\r\n255 0 255\r\n255 0 255\r\n180 222 164\r\n131 213 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 197 180\r\n74 74 90\r\n123 123 131\r\n189 197 189\r\n255 0 255\r\n205 222 222\r\n90 90 65\r\n131 115 74\r\n148 148 115\r\n189 189 131\r\n238 238 139\r\n238 238 246\r\n74 98 65\r\n74 156 65\r\n115 197 98\r\n156 230 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 197 180\r\n74 74 90\r\n123 123 131\r\n205 213 213\r\n205 156 115\r\n238 172 115\r\n106 123 74\r\n156 148 98\r\n197 172 115\r\n222 205 139\r\n230 222 156\r\n90 90 49\r\n213 180 230\r\n164 139 197\r\n148 115 172\r\n123 98 131\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n238 172 115\r\n205 156 115\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n156 148 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/safari_zone_building/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 82 0\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 189 164\r\n189 148 139\r\n156 115 115\r\n123 82 82\r\n90 57 74\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n222 205 131\r\n205 180 106\r\n180 139 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n197 197 197\r\n222 222 230\r\n148 164 180\r\n123 123 131\r\n65 74 106\r\n246 246 255\r\n205 164 255\r\n164 131 205\r\n123 90 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 131 205\r\n205 164 255\r\n90 90 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n255 255 255\r\n205 205 213\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 238 246\r\n255 238 139\r\n230 189 82\r\n238 148 115\r\n222 246 255\r\n172 230 255\r\n123 205 213\r\n197 106 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 255 82\r\n238 238 238\r\n222 222 230\r\n123 123 131\r\n172 189 205\r\n65 74 106\r\n222 222 205\r\n205 205 189\r\n180 180 164\r\n213 213 164\r\n189 189 139\r\n148 148 98\r\n32 82 164\r\n156 205 246\r\n82 164 205\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n197 197 205\r\n49 98 164\r\n172 222 180\r\n139 189 148\r\n106 156 115\r\n82 131 90\r\n65 115 74\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 255 255\r\n222 222 230\r\n139 156 172\r\n123 123 131\r\n82 82 106\r\n213 205 32\r\n246 238 74\r\n164 131 205\r\n164 156 16\r\n205 197 106\r\n255 255 148\r\n139 189 148\r\n74 131 197\r\n197 197 205\r\n115 189 246\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_city/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n230 222 164\r\n222 205 131\r\n205 180 106\r\n213 213 197\r\n197 197 180\r\n164 164 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n238 246 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n255 0 255\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n164 164 164\r\n180 189 189\r\n255 255 255\r\n238 246 238\r\n213 230 222\r\n197 205 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 131\r\n197 189 213\r\n255 255 255\r\n180 123 148\r\n230 139 230\r\n255 222 255\r\n213 213 222\r\n213 98 65\r\n246 139 106\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n205 246 255\r\n98 197 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 131\r\n197 189 213\r\n255 255 255\r\n148 148 156\r\n180 139 222\r\n205 172 246\r\n222 205 255\r\n106 123 172\r\n131 148 197\r\n156 172 230\r\n65 205 82\r\n180 255 197\r\n246 164 115\r\n255 230 148\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/saffron_gym/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n172 148 90\r\n213 189 131\r\n255 230 172\r\n255 255 98\r\n255 197 197\r\n98 156 74\r\n148 205 123\r\n98 156 172\r\n123 180 197\r\n156 205 222\r\n189 230 246\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n123 131 82\r\n139 148 82\r\n156 164 90\r\n172 180 106\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/school/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 205 172\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 82 0\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 205 172\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 189 164\r\n189 148 139\r\n156 115 115\r\n123 82 82\r\n90 57 74\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 205 172\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 205 172\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 205 172\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 205 172\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n222 205 131\r\n205 180 106\r\n180 139 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 205 172\r\n82 82 106\r\n131 131 131\r\n139 164 164\r\n164 189 189\r\n205 222 222\r\n205 238 238\r\n90 139 115\r\n139 148 115\r\n106 189 197\r\n82 180 106\r\n115 222 148\r\n148 246 180\r\n131 123 57\r\n197 106 74\r\n238 148 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 205 172\r\n82 82 106\r\n131 131 131\r\n98 106 148\r\n115 131 197\r\n139 164 230\r\n164 213 246\r\n197 197 197\r\n238 230 205\r\n255 0 255\r\n106 98 90\r\n131 115 90\r\n156 139 90\r\n131 139 90\r\n164 156 90\r\n189 172 90\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 205 172\r\n82 82 106\r\n131 131 131\r\n139 164 164\r\n164 189 189\r\n205 222 222\r\n205 238 238\r\n90 139 115\r\n0 0 0\r\n0 0 0\r\n82 180 106\r\n115 222 148\r\n205 197 57\r\n230 230 139\r\n238 131 74\r\n255 180 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 205 172\r\n82 82 106\r\n131 131 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n205 238 238\r\n222 255 255\r\n0 0 0\r\n106 189 197\r\n106 246 230\r\n164 255 238\r\n0 0 0\r\n131 123 57\r\n197 106 74\r\n238 148 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 205 172\r\n82 82 106\r\n131 131 131\r\n255 255 255\r\n90 230 255\r\n213 255 255\r\n148 238 255\r\n90 139 115\r\n0 0 0\r\n0 0 0\r\n82 180 106\r\n115 222 148\r\n148 246 180\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sea_cottage/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n189 213 230\r\n189 197 230\r\n172 180 213\r\n148 156 172\r\n156 238 255\r\n164 246 255\r\n213 255 255\r\n205 230 238\r\n238 238 246\r\n180 205 238\r\n123 180 230\r\n90 156 197\r\n98 123 172\r\n82 98 131\r\n65 74 82\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n189 213 230\r\n189 197 230\r\n172 180 213\r\n148 156 172\r\n255 238 164\r\n238 230 139\r\n230 205 90\r\n197 172 74\r\n156 123 57\r\n106 82 115\r\n65 57 74\r\n0 0 0\r\n98 139 197\r\n74 115 172\r\n57 98 156\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n238 238 180\r\n238 222 148\r\n189 222 156\r\n205 230 238\r\n238 238 246\r\n180 205 238\r\n123 180 230\r\n90 156 197\r\n98 123 172\r\n82 98 131\r\n65 74 82\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n189 213 230\r\n189 197 230\r\n172 180 213\r\n148 156 172\r\n156 238 255\r\n164 246 255\r\n213 255 255\r\n106 230 255\r\n41 205 255\r\n32 131 255\r\n32 82 197\r\n32 74 131\r\n205 230 172\r\n189 213 172\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seafoam_islands/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n123 123 131\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n90 90 115\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n213 238 255\r\n172 205 255\r\n139 180 238\r\n106 156 230\r\n74 139 189\r\n65 123 189\r\n82 139 205\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 172\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n213 238 255\r\n172 205 255\r\n139 180 238\r\n106 156 230\r\n65 123 172\r\n41 98 156\r\n74 115 197\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 172\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 0\r\n230 246 255\r\n189 222 255\r\n139 164 255\r\n106 164 230\r\n74 148 222\r\n74 123 222\r\n82 156 230\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 197\r\n144 136 136\r\n120 112 112\r\n104 96 104\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n248 0 0\r\n128 192 160\r\n96 160 128\r\n120 120 128\r\n88 88 112\r\n64 72 104\r\n216 224 232\r\n192 208 224\r\n160 176 192\r\n200 208 232\r\n168 184 240\r\n112 144 208\r\n88 112 184\r\n80 72 184\r\n232 208 152\r\n200 184 120\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 248\r\n112 184 240\r\n96 160 216\r\n120 120 128\r\n88 88 112\r\n64 72 104\r\n240 240 208\r\n224 224 184\r\n184 184 144\r\n168 168 128\r\n152 152 112\r\n224 216 112\r\n240 152 112\r\n216 112 96\r\n128 224 176\r\n48 160 120\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n205 222 238\r\n156 172 189\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n255 255 180\r\n255 238 123\r\n156 115 65\r\n238 197 246\r\n213 156 213\r\n189 106 172\r\n238 230 74\r\n238 189 0\r\n222 156 0\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n238 238 246\r\n197 205 222\r\n172 172 197\r\n139 156 172\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n123 139 222\r\n115 189 246\r\n255 230 156\r\n255 189 65\r\n238 164 41\r\n213 131 16\r\n180 82 0\r\n255 205 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n248 0 248\r\n144 136 136\r\n120 112 112\r\n104 96 104\r\n120 120 128\r\n144 128 96\r\n128 168 144\r\n112 176 104\r\n176 168 144\r\n224 224 216\r\n213 213 197\r\n180 180 164\r\n148 148 131\r\n123 123 90\r\n98 98 74\r\n96 152 120\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_123/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n213 238 255\r\n172 205 255\r\n139 180 238\r\n106 156 230\r\n74 139 189\r\n65 123 189\r\n82 139 205\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 172\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n213 238 255\r\n172 205 255\r\n139 180 238\r\n106 156 230\r\n65 123 172\r\n41 98 156\r\n74 115 197\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 172\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 49 255\r\n238 180 139\r\n230 148 82\r\n197 131 74\r\n172 98 49\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n131 156 197\r\n148 180 222\r\n246 238 238\r\n230 222 222\r\n197 197 148\r\n180 172 115\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n131 197 164\r\n98 164 131\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n222 230 238\r\n197 213 230\r\n164 180 197\r\n255 222 255\r\n222 172 230\r\n172 123 189\r\n148 98 164\r\n115 65 131\r\n238 213 156\r\n205 189 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n156 156 222\r\n255 238 189\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n222 230 238\r\n197 213 230\r\n164 180 197\r\n255 222 139\r\n230 172 98\r\n213 139 74\r\n197 115 49\r\n156 90 16\r\n115 189 246\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n205 222 230\r\n164 180 197\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n205 197 148\r\n180 172 123\r\n156 148 106\r\n230 156 106\r\n197 115 74\r\n172 98 49\r\n148 82 32\r\n205 222 230\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n240 144 56\r\n72 40 48\r\n144 104 104\r\n120 144 176\r\n56 80 96\r\n112 200 160\r\n168 192 224\r\n48 56 88\r\n120 120 128\r\n216 192 160\r\n192 216 224\r\n120 72 72\r\n184 144 136\r\n48 56 64\r\n224 224 232\r\n160 224 192\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 49 255\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n197 197 172\r\n148 148 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n139 205 246\r\n115 189 238\r\n255 230 139\r\n222 189 98\r\n180 156 74\r\n139 123 32\r\n115 82 41\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_45/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n123 123 131\r\n32 49 57\r\n230 238 238\r\n90 189 139\r\n90 90 115\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n123 74 74\r\n90 57 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n230 246 255\r\n189 222 255\r\n139 189 255\r\n115 164 255\r\n65 139 222\r\n57 115 222\r\n82 148 230\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 197\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n205 230 246\r\n180 213 255\r\n123 180 246\r\n98 148 230\r\n65 123 189\r\n49 98 180\r\n82 131 222\r\n213 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n238 246 246\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 248\r\n144 152 80\r\n120 128 64\r\n120 120 128\r\n88 88 112\r\n64 72 104\r\n216 224 232\r\n216 224 160\r\n176 192 112\r\n248 200 80\r\n224 152 48\r\n208 120 32\r\n216 120 32\r\n152 96 40\r\n232 208 152\r\n200 184 120\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n238 246 255\r\n197 213 222\r\n139 156 172\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n115 172 246\r\n65 123 172\r\n49 90 139\r\n32 74 123\r\n189 230 164\r\n115 156 90\r\n148 131 74\r\n156 213 255\r\n98 164 230\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n197 255 156\r\n156 189 98\r\n115 131 49\r\n57 57 0\r\n238 230 164\r\n197 180 115\r\n156 131 65\r\n57 32 8\r\n238 156 106\r\n213 131 82\r\n189 106 57\r\n148 82 24\r\n90 49 16\r\n131 90 90\r\n98 65 82\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 255 255\r\n213 213 189\r\n180 180 148\r\n156 156 123\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n205 213 230\r\n139 180 213\r\n238 230 189\r\n222 213 172\r\n189 172 106\r\n172 148 98\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n131 197 164\r\n98 164 131\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n222 230 238\r\n197 213 230\r\n164 180 197\r\n255 222 255\r\n222 172 230\r\n172 123 189\r\n148 98 164\r\n115 65 131\r\n238 213 156\r\n205 189 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/sevii_islands_67/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n213 238 255\r\n172 205 255\r\n139 180 238\r\n106 156 230\r\n74 139 189\r\n65 123 189\r\n82 139 205\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 172\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n213 238 255\r\n172 205 255\r\n139 180 238\r\n106 156 230\r\n65 123 172\r\n41 98 156\r\n74 115 197\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 172\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n248 0 0\r\n224 240 248\r\n184 216 248\r\n136 160 248\r\n104 160 224\r\n72 144 216\r\n72 120 216\r\n80 152 224\r\n200 216 232\r\n168 184 200\r\n112 136 136\r\n144 136 136\r\n48 112 192\r\n56 80 0\r\n104 88 88\r\n64 56 48\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 248\r\n192 144 120\r\n152 120 112\r\n120 120 128\r\n88 88 112\r\n64 72 104\r\n216 224 232\r\n208 224 240\r\n176 192 208\r\n248 232 224\r\n224 160 136\r\n184 136 112\r\n160 104 80\r\n136 80 56\r\n232 208 152\r\n200 184 120\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n156 156 222\r\n255 238 189\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n222 230 238\r\n197 213 230\r\n164 180 197\r\n255 222 139\r\n230 172 98\r\n213 139 74\r\n197 115 49\r\n156 90 16\r\n115 189 246\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n205 222 230\r\n164 180 197\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n205 197 148\r\n180 172 123\r\n156 148 106\r\n230 156 106\r\n197 115 74\r\n172 98 49\r\n148 82 32\r\n205 222 230\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n248 0 248\r\n180 255 131\r\n131 197 98\r\n57 139 49\r\n57 82 0\r\n222 148 115\r\n106 90 90\r\n164 98 90\r\n65 57 49\r\n255 197 148\r\n232 224 136\r\n216 192 136\r\n115 139 139\r\n148 139 139\r\n208 184 104\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 49 255\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n197 197 172\r\n148 148 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n139 205 246\r\n115 189 238\r\n255 230 139\r\n222 189 98\r\n180 156 74\r\n139 123 32\r\n115 82 41\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands5/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n123 123 131\r\n32 49 57\r\n230 238 238\r\n90 189 139\r\n90 90 115\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n123 74 74\r\n90 57 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n230 246 255\r\n189 222 255\r\n139 189 255\r\n115 164 255\r\n65 139 222\r\n57 115 222\r\n82 148 230\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 197\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n205 230 246\r\n180 213 255\r\n123 180 246\r\n98 148 230\r\n65 123 189\r\n49 98 180\r\n82 131 222\r\n213 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n238 246 246\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 248\r\n168 152 144\r\n128 120 112\r\n120 120 128\r\n88 88 112\r\n64 72 104\r\n216 224 232\r\n192 208 224\r\n160 176 192\r\n224 232 248\r\n192 200 216\r\n120 120 128\r\n88 88 112\r\n64 72 104\r\n232 208 152\r\n200 184 120\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 82 0\r\n57 115 24\r\n98 65 74\r\n131 106 82\r\n65 57 49\r\n208 224 184\r\n56 168 128\r\n216 224 240\r\n224 168 120\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n238 246 255\r\n197 213 222\r\n172 189 197\r\n139 156 172\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n255 0 255\r\n131 172 148\r\n189 180 164\r\n172 164 156\r\n148 139 139\r\n123 115 115\r\n106 98 106\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n0 0 0\r\n0 0 0\r\n189 148 139\r\n184 184 168\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n246 246 246\r\n246 246 238\r\n222 222 213\r\n205 205 189\r\n172 172 156\r\n148 148 123\r\n112 200 160\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 255 255\r\n213 213 189\r\n180 180 148\r\n156 156 123\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n205 213 230\r\n139 180 213\r\n238 230 189\r\n222 213 172\r\n189 172 106\r\n172 148 98\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/seviiislands6/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n222 255 255\r\n172 222 255\r\n148 189 238\r\n106 156 230\r\n57 148 197\r\n32 131 172\r\n82 148 213\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n230 213 148\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n222 255 255\r\n172 222 255\r\n148 189 238\r\n106 156 230\r\n41 90 172\r\n41 57 148\r\n74 123 197\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n230 213 148\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 156\r\n82 82 106\r\n115 115 139\r\n148 148 172\r\n189 189 205\r\n222 222 230\r\n255 255 255\r\n180 180 74\r\n205 205 98\r\n255 255 98\r\n98 98 172\r\n131 131 213\r\n164 164 255\r\n131 98 41\r\n164 139 82\r\n205 180 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 156\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n90 156 57\r\n131 180 49\r\n172 205 49\r\n197 230 98\r\n222 255 148\r\n222 172 98\r\n255 197 98\r\n255 222 156\r\n131 98 41\r\n164 139 82\r\n205 180 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 156\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n255 0 255\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n131 98 41\r\n164 139 82\r\n205 180 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 156\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 156\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/ss_anne/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 172 82\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n139 180 222\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n90 90 115\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n65 98 156\r\n90 123 180\r\n115 156 197\r\n222 213 131\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n106 172 115\r\n156 205 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 238 246\r\n172 197 180\r\n197 222 205\r\n90 189 172\r\n246 238 156\r\n205 189 131\r\n189 164 123\r\n148 131 106\r\n106 106 106\r\n213 222 230\r\n238 180 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n213 222 222\r\n164 180 189\r\n255 0 255\r\n131 115 74\r\n213 213 148\r\n197 189 139\r\n172 156 115\r\n148 131 90\r\n197 197 205\r\n205 82 65\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 172 82\r\n82 82 106\r\n131 131 131\r\n98 131 131\r\n139 172 172\r\n164 205 189\r\n98 106 131\r\n90 98 106\r\n98 156 197\r\n164 172 139\r\n139 156 139\r\n115 123 123\r\n205 213 156\r\n180 197 156\r\n164 172 156\r\n90 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 172 82\r\n82 82 106\r\n230 222 164\r\n156 148 90\r\n123 115 115\r\n205 197 106\r\n164 156 90\r\n189 172 90\r\n246 246 222\r\n238 238 164\r\n98 106 90\r\n205 213 156\r\n139 148 106\r\n98 98 106\r\n205 139 189\r\n213 148 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 172 82\r\n82 82 106\r\n230 222 164\r\n156 148 90\r\n123 115 115\r\n205 197 106\r\n164 156 90\r\n189 172 90\r\n246 246 222\r\n238 238 164\r\n98 106 90\r\n205 213 156\r\n139 148 106\r\n98 98 106\r\n131 205 82\r\n230 213 82\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 172 82\r\n82 82 106\r\n230 222 164\r\n156 148 90\r\n123 115 115\r\n205 197 106\r\n164 156 90\r\n189 172 90\r\n246 246 222\r\n238 238 164\r\n98 106 90\r\n205 213 156\r\n139 148 106\r\n98 98 106\r\n90 0 255\r\n222 222 230\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 172 82\r\n82 82 106\r\n230 222 164\r\n156 148 90\r\n123 115 115\r\n205 197 106\r\n164 156 90\r\n189 172 90\r\n246 246 222\r\n238 238 164\r\n98 106 90\r\n205 213 156\r\n139 148 106\r\n98 98 106\r\n90 0 255\r\n139 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 172 82\r\n82 82 106\r\n230 222 164\r\n156 148 90\r\n123 115 115\r\n205 197 106\r\n164 156 90\r\n189 172 90\r\n246 246 222\r\n238 238 164\r\n98 106 90\r\n205 213 156\r\n139 148 106\r\n98 98 106\r\n90 0 255\r\n156 197 213\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/tanoby_ruins/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n139 180 222\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n90 90 115\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n65 98 156\r\n90 123 180\r\n115 156 197\r\n222 213 131\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n106 172 115\r\n156 205 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 238 246\r\n172 197 180\r\n197 222 205\r\n90 189 172\r\n246 238 156\r\n205 189 131\r\n189 164 123\r\n148 131 106\r\n106 106 106\r\n213 222 230\r\n238 180 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n213 222 222\r\n164 180 189\r\n255 0 255\r\n131 115 74\r\n213 213 148\r\n197 189 139\r\n172 156 115\r\n148 131 90\r\n197 197 205\r\n205 82 65\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n238 246 255\r\n197 213 222\r\n139 156 172\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n115 172 246\r\n65 123 172\r\n49 90 139\r\n32 74 123\r\n189 230 164\r\n115 156 90\r\n148 131 74\r\n156 213 255\r\n98 164 230\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n123 74 148\r\n148 106 180\r\n230 213 246\r\n205 172 213\r\n222 213 90\r\n197 189 65\r\n189 180 49\r\n172 164 32\r\n213 205 90\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n255 0 255\r\n255 131 115\r\n106 197 106\r\n164 255 180\r\n238 197 115\r\n213 131 74\r\n189 213 230\r\n123 156 180\r\n90 123 156\r\n156 180 205\r\n222 230 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n172 213 255\r\n139 189 246\r\n123 172 222\r\n98 180 230\r\n106 148 213\r\n255 0 255\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n189 230 255\r\n189 230 255\r\n156 189 213\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n148 148 148\r\n123 123 123\r\n98 98 98\r\n82 82 106\r\n255 213 90\r\n230 164 74\r\n255 0 255\r\n222 230 238\r\n197 205 156\r\n205 139 115\r\n172 172 172\r\n222 230 189\r\n230 172 139\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n205 205 205\r\n255 131 65\r\n222 98 32\r\n255 0 255\r\n222 213 90\r\n197 189 65\r\n189 180 49\r\n172 164 32\r\n213 205 90\r\n148 148 148\r\n230 230 230\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/trainer_tower/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n172 222 172\r\n189 238 197\r\n139 189 139\r\n205 246 213\r\n172 222 172\r\n74 106 156\r\n90 131 180\r\n213 222 222\r\n156 189 213\r\n238 139 98\r\n189 98 74\r\n156 65 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n139 180 222\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n246 238 148\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n197 189 213\r\n255 255 255\r\n106 197 106\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n90 90 115\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 180 74\r\n255 246 131\r\n65 98 156\r\n90 123 180\r\n115 156 197\r\n222 213 131\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n106 172 115\r\n156 205 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n230 238 246\r\n172 197 180\r\n197 222 205\r\n90 189 172\r\n246 238 156\r\n205 189 131\r\n189 164 123\r\n148 131 106\r\n106 106 106\r\n213 222 230\r\n238 180 115\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n213 222 222\r\n164 180 189\r\n255 0 255\r\n131 115 74\r\n213 213 148\r\n197 189 139\r\n172 156 115\r\n148 131 90\r\n255 0 255\r\n255 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n148 148 156\r\n205 205 197\r\n148 139 90\r\n172 164 106\r\n197 189 131\r\n82 139 148\r\n115 164 172\r\n156 189 197\r\n180 90 74\r\n205 115 90\r\n238 156 123\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n82 82 106\r\n123 123 123\r\n172 172 164\r\n255 255 255\r\n255 255 156\r\n197 197 156\r\n172 172 139\r\n148 148 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 189 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/underground_path/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n255 0 255\r\n115 189 246\r\n98 172 238\r\n115 189 246\r\n98 164 222\r\n82 139 197\r\n74 115 172\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n115 189 246\r\n98 172 238\r\n255 189 131\r\n238 148 115\r\n222 106 98\r\n205 65 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n180 255 131\r\n131 197 98\r\n57 139 49\r\n57 82 0\r\n222 148 115\r\n106 90 90\r\n164 98 90\r\n65 57 49\r\n255 197 148\r\n222 106 98\r\n205 65 82\r\n164 213 197\r\n115 197 164\r\n65 180 131\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n213 213 213\r\n189 189 189\r\n164 164 164\r\n131 131 139\r\n255 0 255\r\n255 0 255\r\n65 49 65\r\n238 213 205\r\n222 180 164\r\n189 148 139\r\n156 115 115\r\n131 90 90\r\n98 65 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n82 106 213\r\n65 90 189\r\n57 82 164\r\n49 74 148\r\n172 197 230\r\n139 164 222\r\n106 131 213\r\n82 106 213\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n24 41 82\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n115 189 246\r\n98 172 238\r\n238 230 164\r\n222 205 131\r\n213 180 106\r\n205 156 82\r\n115 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n115 148 189\r\n82 115 156\r\n57 82 131\r\n32 49 106\r\n197 164 255\r\n148 115 222\r\n90 49 180\r\n41 49 90\r\n255 0 255\r\n213 213 255\r\n98 57 189\r\n74 32 156\r\n41 8 139\r\n16 0 123\r\n41 41 41\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n115 148 189\r\n82 115 156\r\n57 82 131\r\n32 49 106\r\n197 164 255\r\n148 115 222\r\n90 49 180\r\n41 49 90\r\n255 0 255\r\n213 213 255\r\n88 48 176\r\n74 32 156\r\n41 8 139\r\n16 0 123\r\n41 41 41\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n131 164 205\r\n98 131 172\r\n74 98 148\r\n49 65 123\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n41 49 90\r\n255 0 255\r\n255 0 255\r\n115 74 213\r\n82 41 189\r\n57 16 164\r\n32 0 139\r\n41 123 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n8 8 139\r\n255 0 255\r\n255 0 255\r\n0 0 74\r\n57 41 139\r\n49 8 139\r\n24 0 123\r\n16 8 115\r\n8 8 82\r\n8 8 65\r\n41 24 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n24 24 180\r\n255 0 255\r\n255 0 255\r\n0 0 106\r\n82 74 156\r\n82 49 164\r\n65 24 164\r\n49 8 156\r\n24 0 131\r\n0 0 123\r\n41 123 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n213 213 255\r\n156 156 255\r\n131 131 255\r\n106 106 246\r\n74 74 222\r\n180 0 255\r\n180 0 255\r\n0 0 139\r\n197 164 255\r\n180 148 255\r\n148 115 222\r\n115 74 205\r\n90 49 180\r\n57 16 164\r\n41 123 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/underwater/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 213 180\r\n255 197 148\r\n222 148 115\r\n123 65 65\r\n57 74 123\r\n41 57 98\r\n24 41 82\r\n16 32 57\r\n222 230 238\r\n255 197 90\r\n189 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n131 131 131\r\n180 180 164\r\n255 255 255\r\n189 164 82\r\n222 197 106\r\n230 222 156\r\n123 197 189\r\n156 222 213\r\n213 255 246\r\n255 0 255\r\n255 0 255\r\n213 131 65\r\n222 230 222\r\n246 238 189\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n148 172 139\r\n180 197 164\r\n213 222 197\r\n238 255 213\r\n115 156 180\r\n197 222 238\r\n123 197 189\r\n156 222 213\r\n213 255 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n230 222 156\r\n189 98 74\r\n230 156 98\r\n213 205 156\r\n115 156 180\r\n246 238 189\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_1/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n131 131 131\r\n180 180 164\r\n255 255 255\r\n189 164 82\r\n222 197 106\r\n230 222 156\r\n123 197 189\r\n156 222 213\r\n213 255 246\r\n255 0 255\r\n255 0 255\r\n213 131 65\r\n222 230 222\r\n246 238 189\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n148 172 139\r\n180 197 164\r\n213 222 197\r\n238 255 213\r\n115 156 180\r\n197 222 238\r\n123 197 189\r\n156 222 213\r\n213 255 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n230 222 156\r\n189 98 74\r\n230 156 98\r\n213 205 156\r\n115 156 180\r\n246 238 189\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/unused_gatehouse_2/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n123 123 131\r\n32 49 57\r\n230 238 238\r\n90 189 139\r\n90 90 115\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n123 74 74\r\n90 57 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n230 246 255\r\n189 222 255\r\n139 189 255\r\n115 164 255\r\n65 139 222\r\n57 115 222\r\n82 148 230\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n49 115 197\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n205 230 246\r\n180 213 255\r\n123 180 246\r\n98 148 230\r\n65 123 189\r\n49 98 180\r\n82 131 222\r\n213 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n238 246 246\r\n238 230 139\r\n230 213 139\r\n213 197 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 246 172\r\n255 189 32\r\n222 156 0\r\n189 106 57\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n255 255 255\r\n205 205 222\r\n255 230 131\r\n238 205 123\r\n197 164 90\r\n131 164 197\r\n255 0 255\r\n180 156 49\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n74 123 180\r\n90 164 213\r\n57 90 148\r\n213 148 49\r\n238 180 82\r\n205 205 222\r\n115 189 246\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n115 82 41\r\n255 189 32\r\n222 156 0\r\n189 106 57\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n189 255 139\r\n131 213 98\r\n106 180 98\r\n255 230 131\r\n238 205 123\r\n197 164 90\r\n131 164 197\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 238 189\r\n222 205 131\r\n205 180 106\r\n180 139 74\r\n246 246 255\r\n172 189 205\r\n222 106 98\r\n213 164 156\r\n213 148 49\r\n65 74 106\r\n123 123 131\r\n16 123 74\r\n49 148 106\r\n98 189 148\r\n164 230 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_city/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n246 222 90\r\n246 197 65\r\n238 164 57\r\n172 189 205\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n90 131 180\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n246 238 164\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n172 172 164\r\n255 255 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 172\r\n205 205 213\r\n238 238 246\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n32 180 230\r\n172 255 230\r\n189 189 115\r\n238 222 164\r\n255 255 180\r\n205 82 65\r\n255 131 115\r\n189 180 106\r\n205 197 123\r\n222 222 148\r\n164 164 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n65 74 106\r\n90 90 115\r\n123 123 131\r\n148 164 180\r\n172 189 205\r\n205 222 238\r\n246 246 255\r\n255 0 255\r\n255 0 255\r\n205 82 65\r\n255 131 115\r\n230 172 57\r\n222 213 0\r\n222 180 65\r\n255 222 98\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n131 131 131\r\n180 180 164\r\n255 255 255\r\n222 180 65\r\n238 197 82\r\n189 148 49\r\n246 238 164\r\n213 213 222\r\n156 156 205\r\n180 180 246\r\n82 106 156\r\n123 148 197\r\n189 197 255\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/vermilion_gym/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 90 16\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 197 164\r\n189 148 139\r\n148 106 106\r\n115 65 74\r\n82 49 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n222 230 255\r\n197 213 255\r\n164 197 238\r\n123 172 230\r\n90 148 197\r\n65 123 180\r\n90 164 205\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n32 98 139\r\n238 230 139\r\n222 197 139\r\n205 180 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n213 197 131\r\n197 172 106\r\n172 148 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n222 230 255\r\n197 213 255\r\n164 197 238\r\n123 172 230\r\n41 82 164\r\n41 57 131\r\n74 123 197\r\n205 222 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n32 98 139\r\n238 230 139\r\n222 197 139\r\n205 180 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n65 65 82\r\n74 74 90\r\n123 123 131\r\n106 139 205\r\n115 197 238\r\n164 230 238\r\n131 115 57\r\n180 172 65\r\n222 205 65\r\n246 246 205\r\n213 205 205\r\n90 90 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 205 65\r\n222 172 65\r\n180 98 0\r\n213 213 139\r\n189 189 115\r\n148 148 82\r\n255 0 255\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n65 65 82\r\n74 74 90\r\n123 123 131\r\n106 139 205\r\n172 213 230\r\n115 98 65\r\n148 123 65\r\n238 172 65\r\n230 213 74\r\n65 123 123\r\n65 156 131\r\n65 205 156\r\n74 123 65\r\n90 172 74\r\n123 213 98\r\n172 238 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n246 246 205\r\n213 213 213\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n246 230 131\r\n222 205 65\r\n172 238 106\r\n123 213 98\r\n106 197 82\r\n90 172 74\r\n74 123 65\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n246 246 255\r\n213 230 197\r\n156 172 139\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n222 172 65\r\n180 98 0\r\n131 65 0\r\n205 205 123\r\n164 164 57\r\n115 189 246\r\n74 148 213\r\n49 115 180\r\n189 197 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_city/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 82 0\r\n115 98 98\r\n65 57 49\r\n255 0 255\r\n139 222 189\r\n255 197 115\r\n238 131 106\r\n197 49 65\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 230\r\n197 205 213\r\n172 189 205\r\n131 131 139\r\n65 49 65\r\n230 238 238\r\n90 189 139\r\n255 0 255\r\n238 213 197\r\n222 189 164\r\n189 148 139\r\n156 115 115\r\n123 82 82\r\n90 57 74\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n156 123 98\r\n197 172 139\r\n255 205 139\r\n238 148 115\r\n222 106 98\r\n205 82 74\r\n172 32 41\r\n74 131 197\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n205 222 238\r\n172 189 205\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 131\r\n205 180 106\r\n156 213 255\r\n115 189 246\r\n98 164 222\r\n74 131 197\r\n49 98 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 172\r\n189 189 139\r\n156 156 106\r\n115 115 65\r\n255 255 213\r\n255 238 180\r\n238 222 156\r\n172 197 197\r\n148 189 189\r\n123 180 180\r\n230 246 255\r\n189 222 222\r\n172 213 222\r\n148 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 230 238\r\n172 189 205\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n230 222 164\r\n222 205 131\r\n205 180 106\r\n180 139 74\r\n238 230 139\r\n222 197 139\r\n213 189 106\r\n189 230 164\r\n172 222 164\r\n115 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n189 255 139\r\n131 213 98\r\n57 148 49\r\n57 82 0\r\n57 115 24\r\n98 65 74\r\n131 106 82\r\n65 57 49\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n213 230 189\r\n57 172 131\r\n222 230 246\r\n230 172 123\r\n106 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n222 230 246\r\n189 197 222\r\n148 164 180\r\n123 123 131\r\n90 90 115\r\n65 74 106\r\n49 139 49\r\n57 82 0\r\n49 180 98\r\n238 230 164\r\n222 205 131\r\n213 180 106\r\n205 156 82\r\n106 205 164\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_forest/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 32 57\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n172 148 65\r\n213 197 106\r\n246 238 148\r\n82 148 197\r\n172 205 246\r\n222 230 230\r\n106 197 106\r\n164 255 180\r\n205 82 65\r\n255 131 115\r\n148 148 139\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n255 255 255\r\n197 197 148\r\n213 213 172\r\n189 230 255\r\n156 189 213\r\n131 115 16\r\n164 148 49\r\n197 180 74\r\n222 205 106\r\n255 230 156\r\n222 213 230\r\n238 246 238\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n255 255 255\r\n139 197 139\r\n230 213 123\r\n255 205 90\r\n255 238 197\r\n115 115 123\r\n230 238 246\r\n156 205 246\r\n98 156 238\r\n255 0 255\r\n230 139 98\r\n189 98 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n82 82 106\r\n164 164 164\r\n180 189 189\r\n255 255 255\r\n238 246 238\r\n213 230 222\r\n197 205 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n139 139 148\r\n197 189 213\r\n255 255 255\r\n205 197 106\r\n246 238 148\r\n255 255 222\r\n98 98 123\r\n238 238 238\r\n82 222 123\r\n131 255 164\r\n82 164 57\r\n255 0 255\r\n255 0 255\r\n172 106 74\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n139 139 148\r\n197 189 213\r\n255 255 255\r\n222 222 238\r\n230 205 131\r\n189 197 82\r\n222 230 115\r\n238 230 148\r\n74 123 180\r\n131 131 139\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 255\r\n82 82 106\r\n123 123 123\r\n180 180 164\r\n230 230 230\r\n255 255 255\r\n180 115 82\r\n213 156 123\r\n123 123 123\r\n106 156 148\r\n139 189 180\r\n180 222 213\r\n255 0 255\r\n213 213 213\r\n230 189 123\r\n246 197 156\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/14.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "data/tilesets/secondary/viridian_gym/palettes/15.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n90 0 255\r\n0 0 0\r\n"
  },
  {
    "path": "docs/bugs_and_glitches.md",
    "content": "\n# Bugs and Glitches\n\nThese are known bugs and glitches in the original Pokémon FireRed game: code that clearly does not work as intended, or that only works in limited circumstances but has the possibility to fail or crash. Defining the `BUGFIX` and `UBFIX` preprocessor variables will fix some of these automatically. `UBFIX` will already be defined for MODERN builds.\n\nFixes are written in the `diff` format. If you've used Git before, this should look familiar:\n\n```diff\n this is some code\n-delete red - lines\n+add green + lines\n```\n\n## Contents\n\n<!--- TODO: Migrate from the wiki --->\n- [Bug 1](#bug-1)\n\n\n## Bug 1\n\nA brief description of the bug and how to reproduce it in the vanilla game\n\n**Fix:**\n\nCode to edit, in which routines, or data to edit, using the above mentioned diff syntax.\n"
  },
  {
    "path": "docs/legacy_WSL1_INSTALL.md",
    "content": "### Setting up WSL1 (Legacy Portion)\n\n1. Certain packages are required to build pokefirered. Install these packages by running the following command:\n\n    ```bash\n    sudo apt install build-essential git libpng-dev gdebi-core\n    ```\n    > Note: If the above command does not work, try the above command but replacing `apt` with `apt-get`.\n\n2. Once the packages have finished installing, download the devkitPro pacman package [here](https://github.com/devkitPro/pacman/releases). The file to download is `devkitpro-pacman.amd64.deb`.\n\n3. WSL has its own file system that's not accessible from Windows, but Windows files *are* accessible from WSL. To install the devkitPro package, you'll need to change to the **current working directory** where the package file was saved.\n\n    For example, if the package file was saved to **C:\\Users\\\\_\\<user>_\\Downloads** (the Downloads location for most users), enter this command, where *\\<user>* is your **Windows** username:\n\n    ```bash\n    cd /mnt/c/Users/<user>/Downloads\n    ```\n\n    > Note 1: The Windows C:\\ drive is called /mnt/c/ in WSL.  \n    > Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd     \"/mnt/c/users/<user>/Downloads folder\"`.  \n    > Note 3: Windows path names are case-insensitive so adhering to capitalization isn't needed\n\n4. Once the directory has been changed to the folder containing the devkitPro pacman package, run the following commands to install devkitARM.\n\n    ```bash\n    sudo gdebi devkitpro-pacman.amd64.deb\n    sudo dkp-pacman -Sy\n    sudo dkp-pacman -S gba-dev\n    ```\n\n    The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation.\n\n    > Note: `devkitpro-pacman.amd64.deb` is the expected filename of the devkitPro package downloaded (for the first command). If the downloaded package filename differs, then use that filename instead.\n\n5. Run the following command to set devkitPro related environment variables (alternatively, close and re-open WSL):\n    ```bash\n    source /etc/profile.d/devkit-env.sh\n    ```\n\nProceed to [Choosing where to store pokefirered (WSL1) of the current INSTALL.md](/INSTALL.md#choosing-where-to-store-pokefirered-WSL1).\n"
  },
  {
    "path": "firered.sha1",
    "content": "41cb23d8dccc8ebd7c649cd8fbb58eeace6e2fdc  pokefirered.gba\n"
  },
  {
    "path": "firered_rev1.sha1",
    "content": "dd5945db9b930750cb39d00c84da8571feebf417  pokefirered_rev1.gba\n"
  },
  {
    "path": "graphics/battle_anims/backgrounds/bug.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n131 123 74\r\n139 139 90\r\n156 156 115\r\n172 172 139\r\n189 189 164\r\n205 205 180\r\n222 222 205\r\n238 238 230\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/backgrounds/sky.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n106 205 197\r\n222 0 0\r\n189 0 0\r\n156 0 0\r\n123 0 0\r\n98 0 0\r\n0 0 0\r\n255 255 255\r\n230 246 238\r\n205 238 230\r\n180 230 222\r\n156 222 213\r\n131 213 205\r\n106 205 197\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/backgrounds/solarbeam.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 197 74\r\n255 205 98\r\n255 213 123\r\n255 222 148\r\n255 230 172\r\n255 238 197\r\n255 246 222\r\n255 255 255\r\n255 189 74\r\n255 238 180\r\n255 230 139\r\n255 222 106\r\n255 213 74\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/backgrounds/water_muddy.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n131 49 0\r\n148 74 32\r\n164 106 65\r\n180 131 106\r\n197 164 139\r\n213 189 180\r\n230 222 213\r\n255 255 255\r\n148 74 32\r\n164 106 65\r\n197 164 139\r\n230 222 213\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/masks/stat1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n222 255 205\r\n189 255 164\r\n156 255 123\r\n115 222 90\r\n74 197 57\r\n32 172 24\r\n0 148 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/masks/stat2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n255 255 189\r\n255 255 123\r\n255 255 57\r\n255 189 41\r\n255 131 32\r\n255 65 16\r\n255 8 8\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/masks/stat3.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n238 222 246\r\n222 189 246\r\n205 156 246\r\n197 123 246\r\n197 123 246\r\n164 90 213\r\n131 57 180\r\n106 24 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/masks/stat4.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n189 255 255\r\n123 255 255\r\n57 255 255\r\n57 205 238\r\n57 156 230\r\n57 106 213\r\n65 57 205\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/masks/stat5.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n230 230 230\r\n205 205 205\r\n180 180 189\r\n164 164 164\r\n139 139 148\r\n115 115 123\r\n98 98 106\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/masks/stat6.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n205 246 230\r\n156 246 213\r\n106 246 197\r\n57 246 180\r\n32 213 148\r\n16 180 123\r\n0 148 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/masks/stat7.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 8 8\r\n255 65 16\r\n255 131 32\r\n255 189 41\r\n255 255 57\r\n255 255 123\r\n255 255 189\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/masks/stat8.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 148 0\r\n32 172 24\r\n74 197 57\r\n115 222 90\r\n156 255 123\r\n189 255 164\r\n222 255 205\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/black_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 98\r\n156 205 98\r\n156 205 98\r\n131 205 131\r\n156 205 0\r\n24 0 106\r\n156 8 98\r\n0 213 131\r\n24 197 0\r\n164 8 106\r\n156 8 98\r\n164 8 106\r\n156 205 131\r\n24 213 98\r\n156 8 106\r\n164 205 98\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/blue_light_wall.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 148 139\r\n98 90 255\r\n115 106 255\r\n139 131 255\r\n164 156 255\r\n180 180 255\r\n205 205 255\r\n230 230 255\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n164 156 255\r\n180 180 255\r\n205 205 255\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/blue_orb.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n139 222 255\r\n65 148 255\r\n0 74 255\r\n0 57 205\r\n0 49 156\r\n0 41 106\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/blue_ring.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 148 139\r\n0 0 0\r\n49 148 255\r\n0 230 255\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/blue_ring_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 148 139\r\n0 0 0\r\n255 255 255\r\n230 255 230\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/brown_orb.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n131 49 0\r\n148 74 32\r\n164 106 65\r\n180 131 106\r\n197 164 139\r\n213 189 180\r\n230 222 213\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/flower.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 148 139\r\n255 139 0\r\n255 156 8\r\n255 172 24\r\n255 197 41\r\n255 213 57\r\n255 230 74\r\n255 255 90\r\n255 255 255\r\n255 74 106\r\n255 115 148\r\n255 164 197\r\n255 205 238\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/glowy_blue_orb.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n197 246 246\r\n148 180 246\r\n98 123 246\r\n49 65 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/glowy_green_orb.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n205 246 197\r\n106 246 98\r\n8 246 0\r\n8 172 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/gray_light_wall.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 148 139\r\n123 123 123\r\n139 139 139\r\n156 156 156\r\n172 172 172\r\n197 197 197\r\n213 213 213\r\n230 230 230\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n197 197 197\r\n213 213 213\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/hit_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n205 255 255\r\n156 255 255\r\n106 255 255\r\n57 255 255\r\n8 255 255\r\n8 205 255\r\n8 156 255\r\n8 106 255\r\n8 57 255\r\n8 8 255\r\n8 8 106\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/ice_crystals.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 148 139\r\n98 90 255\r\n115 106 255\r\n139 131 255\r\n164 156 255\r\n180 180 255\r\n205 205 255\r\n230 230 255\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n180 180 255\r\n205 205 255\r\n230 230 255\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/ice_cube.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 148 139\r\n98 90 255\r\n115 106 255\r\n139 131 255\r\n164 156 255\r\n180 180 255\r\n205 205 255\r\n230 230 255\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n180 180 255\r\n205 205 255\r\n230 230 255\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/mud_sand.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 148 139\r\n115 106 98\r\n82 82 82\r\n164 164 164\r\n255 255 255\r\n197 180 115\r\n164 148 82\r\n131 115 57\r\n98 82 24\r\n74 57 0\r\n205 205 197\r\n131 131 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/music_notes_2.pal",
    "content": "JASC-PAL\r\n0100\r\n80\r\n0 0 0\r\n255 255 255\r\n255 189 189\r\n255 123 123\r\n255 57 57\r\n255 0 0\r\n213 0 0\r\n0 0 0\r\n197 148 197\r\n238 246 246\r\n238 222 180\r\n246 205 123\r\n246 189 57\r\n255 172 0\r\n213 148 0\r\n0 0 0\r\n0 0 0\r\n238 246 246\r\n238 246 180\r\n246 246 123\r\n246 246 57\r\n255 246 0\r\n213 205 0\r\n0 0 0\r\n197 148 197\r\n238 246 246\r\n189 246 180\r\n139 246 123\r\n90 246 57\r\n41 255 0\r\n41 213 0\r\n0 0 0\r\n0 0 0\r\n238 246 246\r\n172 238 230\r\n115 238 222\r\n57 230 205\r\n0 230 197\r\n0 189 156\r\n0 0 0\r\n197 148 197\r\n238 246 246\r\n172 205 246\r\n115 164 246\r\n57 123 246\r\n0 82 255\r\n0 57 205\r\n0 0 0\r\n0 0 0\r\n238 246 246\r\n222 180 246\r\n205 123 246\r\n189 57 246\r\n172 0 255\r\n148 0 205\r\n0 0 0\r\n197 148 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n238 246 246\r\n164 222 246\r\n98 197 246\r\n82 164 205\r\n65 139 172\r\n49 106 139\r\n0 0 0\r\n197 148 197\r\n255 255 255\r\n230 222 213\r\n205 189 180\r\n180 156 139\r\n164 131 106\r\n123 98 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/orange_light_wall.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 148 139\r\n255 205 32\r\n255 205 57\r\n255 213 90\r\n255 222 123\r\n255 230 156\r\n255 238 189\r\n255 246 222\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 222 123\r\n255 230 156\r\n255 238 189\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/pink_heart.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n255 180 255\r\n238 115 222\r\n230 57 189\r\n222 0 156\r\n189 8 131\r\n156 24 115\r\n123 32 90\r\n90 49 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/purple_gas_cloud.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 148 139\r\n98 90 255\r\n115 106 255\r\n139 131 255\r\n164 156 255\r\n180 180 255\r\n205 205 255\r\n230 230 255\r\n213 0 213\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n180 180 255\r\n205 205 255\r\n230 230 255\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/purple_ring.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 148 139\r\n0 0 0\r\n156 24 255\r\n180 49 255\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/red_heart.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 238 205\r\n255 189 164\r\n255 139 131\r\n255 90 90\r\n255 41 57\r\n213 41 57\r\n180 41 57\r\n139 41 57\r\n106 41 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/red_light_wall.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 148 139\r\n255 74 106\r\n255 98 123\r\n255 123 148\r\n255 148 164\r\n255 172 189\r\n255 197 205\r\n255 222 230\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 148 164\r\n255 172 189\r\n255 197 205\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/red_orb_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 172 74\r\n255 90 41\r\n255 8 8\r\n213 8 8\r\n172 8 8\r\n139 8 8\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/sap_drip_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 246 197\r\n255 255 255\r\n255 255 205\r\n238 205 164\r\n222 164 131\r\n222 115 106\r\n230 65 82\r\n180 32 90\r\n131 0 106\r\n90 0 82\r\n57 0 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/slash_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n230 238 255\r\n205 230 255\r\n180 222 255\r\n156 205 255\r\n131 197 255\r\n106 189 255\r\n90 164 230\r\n82 148 213\r\n74 123 189\r\n65 106 172\r\n57 90 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/sleep_powder.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 197 246\r\n255 255 255\r\n230 246 189\r\n213 246 123\r\n197 246 57\r\n180 246 0\r\n156 222 24\r\n131 197 49\r\n106 172 74\r\n82 148 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/spark.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 148 139\r\n255 139 0\r\n255 156 8\r\n255 172 24\r\n255 197 41\r\n255 213 57\r\n255 230 74\r\n255 255 90\r\n255 255 255\r\n255 74 106\r\n255 115 148\r\n255 164 197\r\n255 205 238\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/sparkle_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n255 255 148\r\n255 230 74\r\n255 205 0\r\n230 156 0\r\n205 106 0\r\n189 57 0\r\n255 148 24\r\n255 98 16\r\n255 49 8\r\n255 0 0\r\n156 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/stun_spore.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 197 246\r\n255 255 255\r\n255 246 164\r\n255 246 82\r\n255 246 0\r\n255 246 0\r\n246 213 0\r\n238 180 0\r\n230 148 0\r\n230 115 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/whip_hit.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 197 197\r\n255 255 255\r\n222 246 230\r\n189 246 205\r\n156 246 180\r\n123 238 156\r\n90 238 131\r\n57 238 115\r\n57 238 115\r\n65 205 90\r\n74 180 74\r\n82 148 57\r\n90 123 41\r\n106 98 24\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/sprites/white_circle_of_light.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 255 246\r\n222 238 230\r\n197 230 213\r\n172 213 197\r\n156 205 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/unused/flying.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 148 139\r\n148 148 255\r\n189 197 255\r\n222 222 255\r\n238 238 255\r\n238 246 255\r\n255 255 255\r\n238 246 255\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n205 213 255\r\n205 205 255\r\n230 230 255\r\n"
  },
  {
    "path": "graphics/battle_anims/unused/line_sketch_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 255\r\n0 255 255\r\n148 255 255\r\n148 205 255\r\n148 156 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 0 8\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/battle_anims/unused/spinning_ball_2.pal",
    "content": "JASC-PAL\r\n0100\r\n32\r\n98 156 131\r\n57 57 57\r\n156 156 156\r\n255 255 255\r\n255 205 0\r\n255 255 98\r\n213 98 24\r\n255 123 32\r\n106 65 172\r\n65 24 172\r\n255 205 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n98 156 131\r\n57 57 57\r\n156 156 156\r\n255 255 255\r\n57 123 0\r\n90 189 0\r\n123 255 8\r\n230 106 148\r\n255 139 255\r\n255 205 0\r\n255 255 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_anims/unused/unknown.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 0 49\r\n131 131 41\r\n156 197 32\r\n172 0 32\r\n189 0 24\r\n180 197 8\r\n156 0 8\r\n131 65 0\r\n90 0 0\r\n49 65 0\r\n32 0 8\r\n8 197 8\r\n0 0 24\r\n16 65 32\r\n32 197 32\r\n65 131 41\r\n"
  },
  {
    "path": "graphics/battle_interface/healthbar.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n57 57 57\r\n255 255 255\r\n213 205 189\r\n131 131 139\r\n74 65 90\r\n82 106 90\r\n255 213 82\r\n255 180 65\r\n222 106 90\r\n115 255 172\r\n90 213 131\r\n255 230 57\r\n205 172 8\r\n255 90 57\r\n172 65 74\r\n"
  },
  {
    "path": "graphics/battle_interface/healthbox.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 65 65\r\n255 255 222\r\n222 213 180\r\n197 189 115\r\n123 148 131\r\n82 106 98\r\n32 57 0\r\n57 82 65\r\n255 230 0\r\n255 156 148\r\n65 205 255\r\n0 0 255\r\n0 255 0\r\n255 0 0\r\n106 148 255\r\n"
  },
  {
    "path": "graphics/battle_interface/textbox1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n255 0 0\r\n82 98 156\r\n106 139 189\r\n255 255 255\r\n106 90 115\r\n213 205 213\r\n65 74 123\r\n41 49 49\r\n255 0 255\r\n230 222 230\r\n255 0 255\r\n156 123 24\r\n205 172 74\r\n41 82 106\r\n"
  },
  {
    "path": "graphics/battle_interface/textbox2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n74 57 115\r\n82 98 156\r\n106 139 189\r\n41 49 49\r\n255 255 255\r\n106 90 115\r\n222 213 222\r\n90 82 82\r\n180 189 180\r\n139 156 213\r\n90 74 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/building/terrain.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n246 255 255\r\n255 255 255\r\n230 230 230\r\n230 230 230\r\n246 246 246\r\n230 238 238\r\n238 238 238\r\n238 238 238\r\n246 255 255\r\n255 255 255\r\n255 255 180\r\n255 255 197\r\n255 255 222\r\n255 255 238\r\n246 246 246\r\n0 0 0\r\n246 255 255\r\n255 255 255\r\n213 213 213\r\n230 230 230\r\n238 238 238\r\n230 238 238\r\n222 230 222\r\n238 238 238\r\n246 255 255\r\n255 255 255\r\n255 255 180\r\n255 255 197\r\n255 255 222\r\n255 255 238\r\n246 246 246\r\n0 0 0\r\n164 213 255\r\n238 255 255\r\n180 230 255\r\n205 238 255\r\n222 246 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/cave/terrain.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n197 172 106\r\n205 197 90\r\n156 131 98\r\n180 148 106\r\n180 164 106\r\n197 180 106\r\n255 0 255\r\n213 197 115\r\n230 222 106\r\n164 139 82\r\n205 180 106\r\n189 164 106\r\n180 156 98\r\n172 148 90\r\n189 156 106\r\n0 0 0\r\n197 172 106\r\n205 197 90\r\n148 123 82\r\n164 131 90\r\n172 156 90\r\n189 180 90\r\n255 0 255\r\n213 197 115\r\n230 222 106\r\n164 139 82\r\n197 172 106\r\n189 164 106\r\n180 156 98\r\n172 148 90\r\n189 156 106\r\n0 0 0\r\n106 74 65\r\n148 115 82\r\n180 139 90\r\n213 180 131\r\n230 213 156\r\n0 0 0\r\n180 139 90\r\n180 139 90\r\n180 139 90\r\n213 180 131\r\n106 74 65\r\n148 115 82\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/grass/terrain.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n230 255 230\r\n164 246 123\r\n131 230 123\r\n197 255 148\r\n230 255 189\r\n156 238 115\r\n197 246 189\r\n172 238 164\r\n255 0 255\r\n238 246 246\r\n189 222 246\r\n205 230 246\r\n213 230 246\r\n222 238 246\r\n222 246 222\r\n0 0 0\r\n230 255 230\r\n148 230 106\r\n115 213 106\r\n172 246 115\r\n189 255 148\r\n139 222 98\r\n189 238 180\r\n164 230 156\r\n255 0 255\r\n238 246 246\r\n189 222 246\r\n205 230 246\r\n213 230 246\r\n222 238 246\r\n222 246 222\r\n0 0 0\r\n123 205 115\r\n164 222 148\r\n82 164 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/indoor/1.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n238 238 238\r\n255 255 255\r\n213 213 213\r\n222 222 230\r\n238 238 246\r\n222 230 230\r\n222 230 222\r\n230 230 238\r\n246 246 255\r\n238 238 238\r\n205 172 205\r\n213 189 213\r\n222 205 222\r\n238 222 238\r\n230 230 230\r\n0 0 0\r\n230 238 238\r\n255 255 255\r\n205 205 205\r\n213 213 222\r\n230 238 238\r\n222 230 230\r\n222 230 222\r\n230 230 238\r\n246 246 255\r\n238 238 238\r\n189 189 189\r\n197 197 197\r\n205 205 205\r\n222 222 222\r\n230 230 230\r\n0 0 0\r\n115 180 255\r\n197 246 255\r\n148 213 255\r\n172 222 255\r\n180 238 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/indoor/2.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n238 238 238\r\n255 255 255\r\n213 213 213\r\n222 222 230\r\n238 238 246\r\n222 230 230\r\n222 230 222\r\n230 230 238\r\n246 246 255\r\n238 238 238\r\n189 189 189\r\n197 197 197\r\n205 205 205\r\n222 222 222\r\n230 230 230\r\n0 0 0\r\n230 238 238\r\n255 255 255\r\n205 205 205\r\n213 213 222\r\n230 238 238\r\n222 230 230\r\n222 230 222\r\n230 230 238\r\n246 246 255\r\n238 238 238\r\n189 189 189\r\n197 197 197\r\n205 205 205\r\n222 222 222\r\n230 230 230\r\n0 0 0\r\n115 180 255\r\n197 246 255\r\n148 213 255\r\n172 222 255\r\n180 238 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/indoor/agatha.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n255 238 255\r\n238 230 246\r\n205 156 222\r\n213 172 230\r\n222 189 238\r\n222 197 238\r\n213 172 230\r\n230 213 246\r\n230 213 238\r\n246 246 255\r\n222 197 148\r\n230 213 180\r\n238 230 205\r\n246 238 230\r\n238 230 255\r\n0 0 0\r\n255 238 255\r\n230 222 246\r\n189 139 205\r\n213 172 230\r\n213 180 230\r\n222 189 238\r\n197 156 213\r\n230 205 246\r\n222 197 238\r\n246 246 255\r\n222 197 148\r\n230 213 180\r\n238 230 205\r\n246 238 230\r\n238 230 255\r\n0 0 0\r\n255 213 106\r\n255 255 230\r\n255 230 148\r\n255 238 164\r\n255 255 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/indoor/bruno.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n246 246 246\r\n246 246 238\r\n213 205 156\r\n222 213 164\r\n238 230 197\r\n230 222 189\r\n222 213 172\r\n238 230 213\r\n238 238 205\r\n246 246 255\r\n222 197 148\r\n230 213 180\r\n238 230 205\r\n246 238 230\r\n238 238 238\r\n0 0 0\r\n246 246 246\r\n238 238 230\r\n197 189 139\r\n205 197 164\r\n230 222 189\r\n213 213 189\r\n213 205 164\r\n222 222 213\r\n230 230 205\r\n246 246 255\r\n222 197 148\r\n230 213 180\r\n238 230 205\r\n246 238 230\r\n238 238 238\r\n0 0 0\r\n82 238 164\r\n222 255 230\r\n148 238 164\r\n172 246 189\r\n197 246 205\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/indoor/champion.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n246 246 255\r\n246 255 255\r\n213 205 205\r\n213 213 213\r\n238 238 238\r\n230 222 230\r\n230 222 222\r\n238 230 238\r\n238 246 246\r\n255 255 255\r\n197 172 230\r\n222 197 238\r\n238 222 246\r\n246 230 255\r\n238 238 238\r\n0 0 0\r\n246 246 255\r\n246 255 255\r\n213 205 205\r\n213 205 213\r\n238 238 238\r\n230 222 230\r\n230 222 222\r\n238 230 238\r\n238 246 246\r\n255 255 255\r\n197 172 230\r\n222 197 238\r\n238 222 246\r\n246 230 255\r\n238 238 238\r\n0 0 0\r\n131 197 255\r\n213 255 255\r\n164 222 255\r\n189 230 255\r\n197 246 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/indoor/gym.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n246 255 255\r\n255 255 255\r\n230 230 230\r\n230 230 230\r\n246 246 246\r\n230 238 238\r\n238 238 238\r\n238 238 238\r\n246 255 255\r\n255 255 255\r\n222 222 189\r\n230 230 205\r\n238 238 222\r\n246 246 238\r\n246 246 246\r\n0 0 0\r\n246 255 255\r\n255 255 255\r\n213 213 213\r\n230 230 230\r\n238 238 246\r\n230 238 238\r\n222 230 222\r\n238 238 238\r\n246 255 255\r\n255 255 255\r\n213 213 213\r\n230 230 230\r\n238 238 238\r\n246 246 246\r\n246 246 246\r\n0 0 0\r\n131 197 255\r\n213 255 255\r\n164 222 255\r\n189 230 255\r\n197 246 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/indoor/lance.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n238 246 238\r\n222 238 246\r\n123 197 172\r\n148 205 189\r\n189 230 213\r\n180 222 205\r\n148 213 189\r\n205 230 222\r\n205 230 230\r\n246 246 255\r\n222 197 148\r\n230 213 180\r\n238 230 205\r\n246 238 230\r\n222 238 246\r\n0 0 0\r\n238 246 238\r\n213 230 246\r\n106 180 156\r\n148 205 189\r\n180 213 205\r\n180 222 205\r\n139 197 180\r\n205 230 222\r\n197 222 222\r\n246 246 255\r\n222 197 148\r\n230 213 180\r\n238 230 205\r\n246 238 230\r\n222 238 246\r\n0 0 0\r\n131 197 255\r\n213 255 255\r\n164 222 255\r\n189 230 255\r\n197 246 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/indoor/leader.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n246 255 255\r\n255 255 255\r\n230 230 230\r\n230 230 230\r\n246 246 246\r\n230 238 238\r\n238 238 238\r\n238 238 238\r\n246 255 255\r\n255 255 255\r\n222 222 189\r\n230 230 205\r\n238 238 222\r\n246 246 238\r\n246 246 246\r\n0 0 0\r\n246 255 255\r\n255 255 255\r\n213 213 213\r\n230 230 230\r\n238 238 246\r\n230 238 238\r\n222 230 222\r\n238 238 238\r\n246 255 255\r\n255 255 255\r\n213 213 213\r\n230 230 230\r\n238 238 238\r\n246 246 246\r\n246 246 246\r\n0 0 0\r\n255 222 115\r\n255 255 213\r\n255 230 156\r\n255 238 172\r\n255 246 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/indoor/link.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n246 255 255\r\n255 255 255\r\n230 230 230\r\n230 230 230\r\n246 246 246\r\n230 238 238\r\n238 238 238\r\n238 238 238\r\n246 255 255\r\n255 255 255\r\n213 213 213\r\n230 230 230\r\n238 238 238\r\n246 246 246\r\n246 246 246\r\n0 0 0\r\n246 255 255\r\n255 255 255\r\n213 213 213\r\n230 230 230\r\n238 238 246\r\n230 238 238\r\n222 230 222\r\n238 238 238\r\n238 246 246\r\n255 255 255\r\n213 213 213\r\n230 230 230\r\n238 238 238\r\n246 246 246\r\n246 246 246\r\n0 0 0\r\n164 213 255\r\n238 255 255\r\n180 230 255\r\n205 238 255\r\n222 246 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/indoor/lorelei.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n238 255 255\r\n230 246 255\r\n156 189 230\r\n172 197 230\r\n205 230 238\r\n189 213 238\r\n189 222 230\r\n222 238 246\r\n213 238 246\r\n246 246 255\r\n222 197 148\r\n230 213 180\r\n238 230 205\r\n246 238 230\r\n230 246 246\r\n0 0 0\r\n238 255 255\r\n230 246 255\r\n139 172 213\r\n172 197 230\r\n197 222 230\r\n189 213 238\r\n164 197 222\r\n222 238 246\r\n213 230 238\r\n246 246 255\r\n222 197 148\r\n230 213 180\r\n238 230 205\r\n246 238 230\r\n230 246 246\r\n0 0 0\r\n115 205 255\r\n230 255 255\r\n148 213 255\r\n164 222 255\r\n205 238 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/indoor/plain.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n230 255 230\r\n197 255 148\r\n238 238 172\r\n230 238 180\r\n180 238 131\r\n230 246 197\r\n205 238 148\r\n230 246 213\r\n189 246 139\r\n238 246 246\r\n189 222 246\r\n205 230 246\r\n213 230 246\r\n222 238 246\r\n222 246 222\r\n0 0 0\r\n230 255 230\r\n197 255 148\r\n238 238 172\r\n230 238 180\r\n180 238 131\r\n230 246 197\r\n205 238 148\r\n230 246 213\r\n189 246 139\r\n238 246 246\r\n189 222 246\r\n205 230 246\r\n213 230 246\r\n222 238 246\r\n222 246 222\r\n0 0 0\r\n156 213 255\r\n238 255 255\r\n180 230 255\r\n205 238 255\r\n222 246 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/longgrass/terrain.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n205 255 189\r\n148 230 106\r\n115 213 106\r\n180 238 131\r\n222 246 172\r\n139 222 98\r\n180 230 172\r\n156 222 148\r\n255 0 255\r\n197 255 180\r\n106 197 74\r\n131 213 98\r\n156 230 123\r\n172 238 148\r\n180 246 172\r\n0 0 0\r\n205 255 189\r\n139 222 98\r\n98 197 98\r\n164 230 131\r\n222 246 172\r\n123 213 90\r\n180 230 172\r\n156 222 148\r\n255 0 255\r\n197 255 180\r\n106 197 74\r\n123 205 98\r\n148 222 123\r\n172 238 148\r\n172 246 172\r\n0 0 0\r\n115 213 82\r\n98 180 90\r\n90 148 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/mountain/terrain.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n255 255 255\r\n222 222 180\r\n197 189 148\r\n205 197 164\r\n246 246 213\r\n230 230 197\r\n230 230 230\r\n205 197 172\r\n222 222 213\r\n255 255 255\r\n222 230 230\r\n230 230 238\r\n230 238 238\r\n238 246 246\r\n246 246 255\r\n0 0 0\r\n255 255 255\r\n213 213 172\r\n189 172 139\r\n197 189 156\r\n238 238 205\r\n222 222 189\r\n230 230 230\r\n205 197 172\r\n222 222 213\r\n255 255 255\r\n222 230 230\r\n230 230 238\r\n230 238 238\r\n238 246 246\r\n246 246 255\r\n0 0 0\r\n131 98 90\r\n164 131 98\r\n197 156 106\r\n213 180 131\r\n230 213 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/pond/terrain.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n255 255 255\r\n115 189 246\r\n189 255 115\r\n205 255 156\r\n131 205 255\r\n222 255 205\r\n164 238 164\r\n246 255 238\r\n156 230 255\r\n255 255 255\r\n205 230 246\r\n213 230 246\r\n230 238 246\r\n238 246 255\r\n246 246 246\r\n0 0 0\r\n255 255 255\r\n98 164 230\r\n164 246 98\r\n197 255 139\r\n115 189 238\r\n205 255 197\r\n148 230 156\r\n230 255 222\r\n139 213 255\r\n255 255 255\r\n205 230 246\r\n213 230 246\r\n222 238 246\r\n230 238 246\r\n246 246 246\r\n0 0 0\r\n205 246 255\r\n148 213 238\r\n123 189 230\r\n90 148 222\r\n49 106 189\r\n16 74 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/sand/terrain.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n255 255 238\r\n246 246 148\r\n238 230 123\r\n230 222 98\r\n238 238 156\r\n246 246 189\r\n255 255 246\r\n255 255 197\r\n230 230 131\r\n255 255 255\r\n189 222 246\r\n205 230 246\r\n222 238 246\r\n230 246 246\r\n246 246 222\r\n0 0 0\r\n255 255 238\r\n238 238 139\r\n230 222 139\r\n222 213 90\r\n238 230 156\r\n238 238 189\r\n255 255 246\r\n255 246 197\r\n230 222 106\r\n255 255 255\r\n189 222 246\r\n205 230 246\r\n222 238 246\r\n230 246 246\r\n246 246 222\r\n0 0 0\r\n197 197 74\r\n164 156 32\r\n222 222 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/underwater/terrain.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n197 230 255\r\n139 156 213\r\n148 197 246\r\n172 205 255\r\n139 180 222\r\n189 213 255\r\n148 189 230\r\n205 222 255\r\n197 230 255\r\n205 230 255\r\n148 164 238\r\n156 189 238\r\n172 205 238\r\n189 213 246\r\n197 222 255\r\n0 0 0\r\n197 230 255\r\n131 139 197\r\n148 197 246\r\n172 205 255\r\n131 164 213\r\n189 213 255\r\n148 180 222\r\n205 222 255\r\n197 230 255\r\n205 230 255\r\n148 164 238\r\n156 189 238\r\n172 205 238\r\n189 213 246\r\n197 222 255\r\n0 0 0\r\n98 164 230\r\n131 197 255\r\n172 238 255\r\n255 255 255\r\n205 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n98 98 172\r\n131 131 230\r\n172 172 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/building/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n255 255 255\r\n222 197 164\r\n238 222 180\r\n238 230 205\r\n230 205 164\r\n246 238 230\r\n222 213 180\r\n230 213 172\r\n0 0 0\r\n0 0 0\r\n246 246 156\r\n246 246 180\r\n246 246 205\r\n246 246 230\r\n246 246 246\r\n0 0 0\r\n255 255 255\r\n222 197 164\r\n238 222 180\r\n238 230 205\r\n230 205 164\r\n246 238 230\r\n222 213 180\r\n246 246 205\r\n0 0 0\r\n0 0 0\r\n246 246 156\r\n246 246 180\r\n246 246 205\r\n246 246 230\r\n246 246 246\r\n0 0 0\r\n246 205 139\r\n255 238 164\r\n246 222 156\r\n255 238 172\r\n255 246 180\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/building/palette2.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n255 255 255\r\n205 189 148\r\n222 213 172\r\n238 230 197\r\n205 197 156\r\n246 238 222\r\n213 205 164\r\n222 213 156\r\n0 0 0\r\n0 0 0\r\n213 189 148\r\n230 213 180\r\n238 230 213\r\n246 238 230\r\n246 246 246\r\n0 0 0\r\n255 255 255\r\n205 189 148\r\n222 213 172\r\n238 230 197\r\n205 197 156\r\n246 238 222\r\n213 205 164\r\n222 213 156\r\n0 0 0\r\n0 0 0\r\n213 189 148\r\n230 213 180\r\n238 230 213\r\n246 238 230\r\n246 246 246\r\n0 0 0\r\n164 197 246\r\n205 246 255\r\n180 222 255\r\n189 230 255\r\n197 238 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/building/palette3.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n255 255 255\r\n205 189 148\r\n222 213 172\r\n238 230 197\r\n205 197 156\r\n246 238 222\r\n213 205 164\r\n222 213 156\r\n0 0 0\r\n0 0 0\r\n213 189 148\r\n230 213 180\r\n238 230 213\r\n246 238 230\r\n246 246 246\r\n0 0 0\r\n255 255 255\r\n205 189 148\r\n222 213 172\r\n238 230 197\r\n205 197 156\r\n246 238 222\r\n213 205 164\r\n222 213 156\r\n0 0 0\r\n0 0 0\r\n213 189 148\r\n230 213 180\r\n238 230 213\r\n246 238 230\r\n246 246 246\r\n0 0 0\r\n255 222 65\r\n255 255 180\r\n255 238 74\r\n255 246 115\r\n255 255 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/groudon.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n246 246 189\r\n222 213 106\r\n180 156 106\r\n197 172 123\r\n205 189 115\r\n213 197 148\r\n197 172 106\r\n230 222 172\r\n255 189 49\r\n238 230 123\r\n213 115 32\r\n222 172 106\r\n230 197 139\r\n230 213 156\r\n238 230 180\r\n0 0 0\r\n246 246 189\r\n222 213 106\r\n180 156 106\r\n197 172 123\r\n205 189 115\r\n213 197 148\r\n197 172 106\r\n230 222 172\r\n255 189 49\r\n238 230 123\r\n82 106 172\r\n148 156 164\r\n197 189 164\r\n230 213 180\r\n238 230 180\r\n0 0 0\r\n106 74 65\r\n148 115 82\r\n180 139 90\r\n213 180 131\r\n230 213 156\r\n0 0 0\r\n205 148 74\r\n230 156 57\r\n255 172 49\r\n255 189 49\r\n205 148 74\r\n205 148 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/kyogre.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n246 246 189\r\n90 148 222\r\n148 213 238\r\n180 222 222\r\n106 172 230\r\n172 213 213\r\n123 189 230\r\n205 222 197\r\n0 0 0\r\n0 0 0\r\n172 139 82\r\n189 156 106\r\n213 197 148\r\n230 213 164\r\n238 230 180\r\n0 0 0\r\n246 246 189\r\n90 148 222\r\n148 213 238\r\n180 222 222\r\n106 172 230\r\n172 213 213\r\n123 189 230\r\n205 222 197\r\n0 0 0\r\n0 0 0\r\n172 139 82\r\n189 156 106\r\n213 197 148\r\n230 213 164\r\n238 230 180\r\n0 0 0\r\n98 164 230\r\n131 197 255\r\n172 238 255\r\n255 255 255\r\n205 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/plain.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n238 255 230\r\n156 230 156\r\n230 230 148\r\n230 238 164\r\n189 230 148\r\n230 246 180\r\n205 230 172\r\n172 238 172\r\n0 0 0\r\n0 0 0\r\n164 222 246\r\n180 230 230\r\n197 238 222\r\n213 246 213\r\n230 255 205\r\n0 0 0\r\n238 255 230\r\n156 230 156\r\n230 230 148\r\n230 238 164\r\n189 230 148\r\n230 246 180\r\n205 230 172\r\n172 238 172\r\n0 0 0\r\n0 0 0\r\n164 222 246\r\n180 230 230\r\n197 238 222\r\n213 246 213\r\n230 255 205\r\n0 0 0\r\n74 189 65\r\n172 230 172\r\n106 205 90\r\n131 213 115\r\n156 213 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/stadium/battle_frontier.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n255 255 255\r\n189 189 156\r\n213 213 197\r\n230 230 213\r\n197 197 180\r\n238 238 222\r\n205 205 189\r\n197 197 180\r\n0 0 0\r\n0 0 0\r\n222 230 230\r\n230 230 238\r\n230 238 238\r\n238 246 246\r\n246 246 255\r\n0 0 0\r\n255 255 255\r\n189 189 156\r\n213 213 197\r\n230 230 213\r\n197 197 180\r\n238 238 222\r\n205 205 189\r\n197 197 180\r\n0 0 0\r\n0 0 0\r\n222 230 230\r\n230 230 238\r\n230 238 238\r\n238 246 246\r\n246 246 255\r\n0 0 0\r\n172 189 213\r\n238 238 246\r\n180 197 222\r\n205 222 238\r\n222 230 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/stadium/palette1.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n230 246 255\r\n65 131 213\r\n131 197 255\r\n148 205 246\r\n82 148 222\r\n172 213 246\r\n106 172 238\r\n98 164 246\r\n82 148 230\r\n98 164 246\r\n65 164 213\r\n106 189 230\r\n139 205 238\r\n180 230 238\r\n205 238 246\r\n0 0 0\r\n255 255 255\r\n189 189 156\r\n213 213 197\r\n230 230 213\r\n197 197 180\r\n238 238 222\r\n205 205 189\r\n197 197 180\r\n0 0 0\r\n0 0 0\r\n222 230 230\r\n230 230 238\r\n230 238 238\r\n238 246 246\r\n246 246 255\r\n0 0 0\r\n255 213 65\r\n255 246 197\r\n255 213 82\r\n255 230 115\r\n255 246 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/stadium/palette2.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n222 222 222\r\n222 106 0\r\n156 148 156\r\n172 164 172\r\n197 106 49\r\n189 180 189\r\n172 123 98\r\n238 131 0\r\n230 115 0\r\n246 131 0\r\n139 139 139\r\n156 148 156\r\n180 172 180\r\n197 189 197\r\n205 197 213\r\n0 0 0\r\n255 255 255\r\n189 189 156\r\n213 213 197\r\n230 230 213\r\n197 197 180\r\n238 238 222\r\n205 205 189\r\n197 197 180\r\n0 0 0\r\n0 0 0\r\n222 230 230\r\n230 230 238\r\n230 238 238\r\n238 246 246\r\n246 246 255\r\n0 0 0\r\n123 205 164\r\n189 255 230\r\n139 222 180\r\n156 238 197\r\n172 255 213\r\n0 0 0\r\n213 49 0\r\n255 222 139\r\n213 106 57\r\n246 180 16\r\n255 197 90\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/stadium/palette3.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n230 246 230\r\n222 197 148\r\n246 222 172\r\n230 222 189\r\n230 205 156\r\n213 230 205\r\n238 213 164\r\n246 222 172\r\n238 205 164\r\n230 213 164\r\n65 172 156\r\n98 197 180\r\n139 213 213\r\n164 230 222\r\n197 238 230\r\n0 0 0\r\n230 246 230\r\n205 172 131\r\n238 213 164\r\n238 222 189\r\n213 180 139\r\n238 230 222\r\n222 197 148\r\n230 205 156\r\n222 189 148\r\n230 213 164\r\n65 172 156\r\n98 197 180\r\n139 213 213\r\n164 230 222\r\n197 238 230\r\n0 0 0\r\n255 213 65\r\n255 246 197\r\n255 213 82\r\n255 230 115\r\n255 246 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/stadium/palette4.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n230 246 230\r\n197 156 205\r\n230 205 238\r\n205 222 230\r\n205 172 213\r\n213 213 230\r\n213 189 222\r\n213 156 238\r\n205 164 222\r\n230 180 238\r\n65 172 156\r\n98 197 180\r\n139 213 213\r\n164 230 222\r\n197 238 230\r\n0 0 0\r\n230 246 230\r\n197 139 205\r\n230 205 238\r\n205 222 230\r\n205 156 213\r\n213 213 230\r\n213 180 222\r\n213 156 238\r\n205 156 213\r\n230 180 238\r\n65 172 156\r\n98 197 180\r\n139 213 213\r\n164 230 222\r\n197 238 230\r\n0 0 0\r\n189 90 230\r\n230 213 246\r\n189 115 230\r\n197 139 230\r\n213 189 230\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/stadium/palette5.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n230 246 230\r\n139 172 238\r\n180 213 255\r\n180 213 255\r\n148 180 238\r\n189 222 255\r\n164 197 246\r\n164 197 255\r\n148 180 246\r\n180 213 255\r\n65 172 156\r\n98 197 180\r\n139 213 213\r\n164 230 222\r\n197 238 230\r\n0 0 0\r\n230 246 230\r\n131 164 230\r\n180 213 255\r\n180 213 255\r\n148 180 238\r\n189 222 255\r\n164 197 246\r\n164 197 255\r\n148 180 246\r\n180 213 255\r\n65 172 156\r\n98 197 180\r\n139 213 213\r\n164 230 222\r\n197 238 230\r\n0 0 0\r\n90 148 238\r\n172 238 255\r\n106 172 238\r\n123 189 246\r\n164 222 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/stadium/palette6.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n230 246 230\r\n246 156 90\r\n197 197 197\r\n197 205 205\r\n230 164 123\r\n197 222 213\r\n213 180 156\r\n255 189 90\r\n255 172 90\r\n255 172 32\r\n65 172 156\r\n98 197 180\r\n139 213 213\r\n164 230 222\r\n197 238 230\r\n0 0 0\r\n230 246 230\r\n230 115 32\r\n164 164 164\r\n172 189 180\r\n205 131 74\r\n180 213 205\r\n180 148 115\r\n255 148 32\r\n246 131 32\r\n255 172 32\r\n65 172 156\r\n98 197 180\r\n139 213 213\r\n164 230 222\r\n197 238 230\r\n0 0 0\r\n238 189 49\r\n255 255 131\r\n238 197 57\r\n246 222 74\r\n255 246 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/unused/stadium/palette7.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n246 238 246\r\n197 115 205\r\n246 180 246\r\n238 205 238\r\n205 131 213\r\n238 213 238\r\n222 164 230\r\n222 148 230\r\n213 131 222\r\n238 156 246\r\n172 106 172\r\n205 148 205\r\n230 189 230\r\n238 213 238\r\n238 230 238\r\n0 0 0\r\n246 238 246\r\n197 115 205\r\n246 180 246\r\n238 205 238\r\n205 131 213\r\n238 213 238\r\n222 164 230\r\n222 148 230\r\n213 131 222\r\n238 156 246\r\n172 106 172\r\n205 148 205\r\n230 189 230\r\n238 213 238\r\n238 230 238\r\n0 0 0\r\n246 172 0\r\n255 238 131\r\n255 180 16\r\n255 197 41\r\n255 238 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_terrain/water/terrain.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n246 255 255\r\n131 180 238\r\n123 164 238\r\n139 205 246\r\n205 230 246\r\n230 246 255\r\n180 222 246\r\n156 213 255\r\n255 0 255\r\n255 255 255\r\n205 222 238\r\n222 238 238\r\n230 246 246\r\n246 246 255\r\n246 246 255\r\n0 0 0\r\n246 255 255\r\n106 189 238\r\n106 156 230\r\n131 197 238\r\n205 230 246\r\n230 246 255\r\n180 222 246\r\n156 213 255\r\n255 0 255\r\n255 255 255\r\n205 222 230\r\n213 230 238\r\n230 238 246\r\n246 255 255\r\n246 246 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n246 255 255\r\n180 230 255\r\n139 205 246\r\n106 172 238\r\n49 148 197\r\n16 98 180\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_transitions/agatha_bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 49 49\r\n115 115 115\r\n148 148 148\r\n180 180 180\r\n213 213 213\r\n255 82 172\r\n255 98 189\r\n255 115 205\r\n255 131 222\r\n255 148 238\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_transitions/blue_bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 49 49\r\n115 115 115\r\n148 148 148\r\n180 180 180\r\n213 213 213\r\n197 197 65\r\n213 213 82\r\n230 230 98\r\n246 246 115\r\n255 255 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_transitions/bruno_bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 49 49\r\n115 115 115\r\n148 148 148\r\n180 180 180\r\n213 213 213\r\n8 213 8\r\n32 238 32\r\n49 246 49\r\n74 255 74\r\n123 255 123\r\n230 123 139\r\n246 139 156\r\n255 156 172\r\n255 172 189\r\n255 189 205\r\n230 123 139\r\n"
  },
  {
    "path": "graphics/battle_transitions/green_bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 123 139\r\n246 139 156\r\n255 156 172\r\n255 172 189\r\n255 189 205\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_transitions/lance_bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 49 49\r\n115 115 115\r\n148 148 148\r\n180 180 180\r\n213 213 213\r\n0 0 131\r\n16 16 148\r\n32 32 164\r\n49 49 180\r\n65 65 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_transitions/lorelei_bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 49 49\r\n115 115 115\r\n148 148 148\r\n180 180 180\r\n213 213 213\r\n189 0 189\r\n205 16 205\r\n222 32 222\r\n238 49 238\r\n255 65 255\r\n106 180 213\r\n123 197 230\r\n139 213 246\r\n156 230 255\r\n172 246 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/battle_transitions/red_bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 180 213\r\n123 197 230\r\n139 213 246\r\n156 230 255\r\n172 246 255\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_transitions/sliding_pokeball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 172 238\r\n246 8 0\r\n238 213 180\r\n222 180 148\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n98 156 180\r\n148 0 0\r\n197 197 197\r\n238 230 164\r\n222 205 131\r\n213 180 106\r\n205 156 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/battle_transitions/unused_trainer.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 164 148\r\n205 131 115\r\n123 90 82\r\n57 74 123\r\n41 57 98\r\n24 41 82\r\n16 32 57\r\n222 230 238\r\n255 197 90\r\n189 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/berry_pouch/background_female.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 65 90\r\n255 0 255\r\n41 57 82\r\n213 139 115\r\n255 0 255\r\n255 0 255\r\n255 172 148\r\n164 205 238\r\n189 238 255\r\n255 255 205\r\n180 189 180\r\n148 148 148\r\n238 230 172\r\n106 106 106\r\n106 156 238\r\n0 90 131\r\n"
  },
  {
    "path": "graphics/cable_car/bg.pal",
    "content": "JASC-PAL\r\n0100\r\n64\r\n0 0 0\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n255 230 139\r\n238 205 123\r\n222 189 115\r\n205 172 106\r\n189 156 98\r\n180 139 90\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n0 0 0\r\n189 255 148\r\n156 222 98\r\n131 197 74\r\n106 164 49\r\n82 115 24\r\n57 82 0\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n0 0 0\r\n213 238 255\r\n189 230 255\r\n164 222 255\r\n139 213 255\r\n115 205 255\r\n98 205 255\r\n197 205 222\r\n189 189 197\r\n180 164 164\r\n156 131 131\r\n131 90 90\r\n123 65 65\r\n230 106 189\r\n230 106 189\r\n230 106 189\r\n0 0 0\r\n197 205 246\r\n172 189 238\r\n156 172 238\r\n131 156 230\r\n115 139 230\r\n98 123 230\r\n65 74 106\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/cave_transition/black.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/cave_transition/enter.pal",
    "content": "JASC-PAL\r\n0100\r\n8\r\n148 197 172\r\n16 16 16\r\n32 32 32\r\n49 49 49\r\n65 65 65\r\n82 82 82\r\n98 98 98\r\n115 115 115\r\n"
  },
  {
    "path": "graphics/cave_transition/exit.pal",
    "content": "JASC-PAL\r\n0100\r\n8\r\n131 131 131\r\n148 148 148\r\n164 164 164\r\n180 180 180\r\n197 197 197\r\n213 213 213\r\n230 230 230\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/cave_transition/white.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/contest/interface.pal",
    "content": "JASC-PAL\r\n0100\r\n256\r\n0 0 0\r\n255 255 255\r\n230 230 230\r\n197 197 197\r\n148 148 148\r\n74 65 82\r\n0 255 0\r\n0 255 0\r\n65 74 123\r\n139 123 131\r\n82 82 197\r\n189 82 74\r\n131 74 98\r\n74 74 131\r\n131 139 222\r\n106 164 164\r\n0 0 0\r\n115 123 156\r\n90 65 57\r\n148 197 106\r\n123 98 65\r\n131 123 49\r\n222 189 148\r\n164 131 106\r\n115 164 82\r\n164 148 57\r\n90 106 139\r\n180 172 82\r\n82 139 49\r\n255 230 189\r\n222 131 41\r\n246 246 222\r\n205 148 115\r\n255 106 115\r\n255 57 57\r\n156 0 0\r\n164 222 255\r\n106 148 255\r\n49 82 255\r\n255 255 115\r\n246 222 65\r\n230 106 0\r\n255 255 255\r\n189 189 197\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n0 0 0\r\n255 255 115\r\n246 222 90\r\n238 189 65\r\n238 164 41\r\n230 131 16\r\n230 106 0\r\n255 41 0\r\n255 148 82\r\n255 255 164\r\n255 255 255\r\n189 189 197\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n0 0 0\r\n255 131 106\r\n197 24 16\r\n164 222 255\r\n106 148 255\r\n49 82 255\r\n255 197 255\r\n255 139 255\r\n213 0 139\r\n148 255 164\r\n65 205 57\r\n246 222 65\r\n230 106 0\r\n255 255 255\r\n65 74 106\r\n65 74 106\r\n197 255 255\r\n246 246 90\r\n205 205 65\r\n255 255 180\r\n180 180 24\r\n74 65 82\r\n255 255 255\r\n156 156 156\r\n255 156 156\r\n0 0 0\r\n255 255 255\r\n255 148 148\r\n255 123 98\r\n255 0 0\r\n148 148 148\r\n0 0 0\r\n197 255 255\r\n246 246 90\r\n205 205 65\r\n255 255 180\r\n180 180 24\r\n74 65 82\r\n255 255 255\r\n156 156 156\r\n255 156 156\r\n0 0 0\r\n255 255 255\r\n255 148 148\r\n255 123 98\r\n255 0 0\r\n148 148 148\r\n0 0 0\r\n197 255 255\r\n246 246 90\r\n205 205 65\r\n255 255 180\r\n180 180 24\r\n74 65 82\r\n255 255 255\r\n156 156 156\r\n255 156 156\r\n0 0 0\r\n255 255 255\r\n255 148 148\r\n255 123 98\r\n255 0 0\r\n148 148 148\r\n0 0 0\r\n197 255 255\r\n213 255 213\r\n156 222 148\r\n222 255 230\r\n123 189 115\r\n74 65 82\r\n255 255 255\r\n156 156 156\r\n255 156 156\r\n0 0 0\r\n255 255 255\r\n255 148 148\r\n255 123 98\r\n255 0 0\r\n148 148 148\r\n0 0 0\r\n0 172 255\r\n0 0 0\r\n255 255 255\r\n230 230 213\r\n0 0 0\r\n197 197 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n197 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n65 0 0\r\n123 0 0\r\n189 0 0\r\n255 8 0\r\n255 65 0\r\n255 123 0\r\n255 189 0\r\n255 255 0\r\n255 255 123\r\n255 255 255\r\n189 189 197\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/contest/japanese/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n256\r\n0 0 0\r\n255 255 255\r\n230 230 230\r\n197 197 197\r\n148 148 148\r\n74 65 82\r\n0 255 0\r\n0 255 0\r\n65 74 123\r\n139 123 131\r\n82 82 197\r\n189 82 74\r\n131 74 98\r\n74 74 131\r\n131 139 222\r\n106 164 164\r\n0 0 0\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n222 230 230\r\n230 230 238\r\n230 238 238\r\n238 246 246\r\n246 246 255\r\n0 0 0\r\n255 255 255\r\n172 172 148\r\n213 213 189\r\n230 230 213\r\n189 189 172\r\n238 238 222\r\n197 197 180\r\n0 0 0\r\n156 156 131\r\n197 197 189\r\n139 139 131\r\n98 98 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n115 106 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n148 148 156\r\n131 139 156\r\n123 131 156\r\n131 123 164\r\n123 115 164\r\n0 0 0\r\n115 106 156\r\n255 255 255\r\n205 156 255\r\n172 148 197\r\n230 222 246\r\n139 131 172\r\n213 189 238\r\n0 0 0\r\n238 238 230\r\n189 172 197\r\n222 213 213\r\n189 172 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 164 131\r\n213 131 90\r\n255 189 172\r\n197 98 74\r\n74 65 82\r\n255 255 255\r\n156 156 156\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n148 148 148\r\n255 123 98\r\n131 246 90\r\n255 246 74\r\n131 148 255\r\n0 0 0\r\n164 238 98\r\n131 205 90\r\n213 255 148\r\n98 197 49\r\n74 65 82\r\n255 255 255\r\n156 156 156\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n148 148 148\r\n255 123 98\r\n131 246 90\r\n255 246 74\r\n131 148 255\r\n0 0 0\r\n246 246 90\r\n205 205 65\r\n255 255 180\r\n180 180 24\r\n74 65 82\r\n255 255 255\r\n156 156 156\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n148 148 148\r\n255 123 98\r\n131 246 90\r\n255 246 74\r\n131 148 255\r\n0 0 0\r\n115 205 255\r\n115 180 205\r\n156 238 255\r\n49 98 148\r\n74 65 82\r\n255 255 255\r\n156 156 156\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n148 148 148\r\n255 123 98\r\n131 246 90\r\n255 246 74\r\n131 148 255\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n230 230 213\r\n0 0 0\r\n197 197 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n230 230 213\r\n0 0 0\r\n197 197 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n230 230 213\r\n0 0 0\r\n197 197 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n230 230 213\r\n0 0 0\r\n197 197 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n74 65 82\r\n255 255 255\r\n222 222 222\r\n172 172 197\r\n255 0 0\r\n0 0 255\r\n255 255 0\r\n0 197 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 164 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/contest/results.pal",
    "content": "JASC-PAL\r\n0100\r\n256\r\n0 0 0\r\n255 255 255\r\n189 189 197\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n255 106 115\r\n255 57 57\r\n205 32 0\r\n246 213 0\r\n255 123 98\r\n156 180 90\r\n164 148 57\r\n90 106 139\r\n180 172 82\r\n0 0 0\r\n255 255 255\r\n189 189 197\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n164 222 255\r\n106 148 255\r\n24 57 205\r\n246 213 0\r\n255 123 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 197\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n255 197 255\r\n255 139 255\r\n213 0 139\r\n246 213 0\r\n255 123 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 197\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n180 255 197\r\n148 255 164\r\n65 172 57\r\n246 213 0\r\n255 123 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 197\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n255 255 164\r\n246 213 0\r\n230 106 0\r\n246 213 0\r\n255 123 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n197 255 255\r\n255 255 255\r\n213 213 213\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n164 222 255\r\n106 148 255\r\n49 82 255\r\n180 255 197\r\n148 255 164\r\n65 172 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n197 255 255\r\n255 255 255\r\n213 213 213\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n255 139 230\r\n255 139 230\r\n255 49 156\r\n255 255 0\r\n255 255 0\r\n189 172 0\r\n41 49 90\r\n41 49 90\r\n0 0 0\r\n197 123 131\r\n255 255 255\r\n230 246 255\r\n205 238 255\r\n180 238 255\r\n156 230 255\r\n139 230 255\r\n255 205 230\r\n255 255 139\r\n255 230 255\r\n255 255 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n197 255 255\r\n255 255 255\r\n213 213 213\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n255 172 197\r\n255 172 172\r\n255 180 148\r\n255 189 123\r\n255 197 98\r\n255 205 82\r\n156 156 156\r\n156 156 156\r\n156 156 156\r\n197 255 255\r\n255 255 255\r\n213 213 213\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n164 222 255\r\n106 148 255\r\n49 82 255\r\n180 255 197\r\n148 255 164\r\n65 172 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n164 222 255\r\n106 230 222\r\n49 238 189\r\n0 255 156\r\n0 255 156\r\n82 255 98\r\n164 255 49\r\n255 255 0\r\n255 172 16\r\n255 90 32\r\n255 8 57\r\n230 57 106\r\n205 115 156\r\n180 164 205\r\n164 222 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/credits/pokeball_blastoise.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n148 197 246\r\n131 180 246\r\n106 164 246\r\n90 148 255\r\n57 98 164\r\n24 49 82\r\n172 222 246\r\n131 172 197\r\n98 131 148\r\n65 82 98\r\n32 41 49\r\n16 98 255\r\n8 65 164\r\n0 32 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/credits/pokeball_charizard.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n230 98 90\r\n213 65 82\r\n189 32 74\r\n172 0 74\r\n115 0 49\r\n57 0 24\r\n255 131 98\r\n197 98 74\r\n148 74 57\r\n98 49 32\r\n49 24 16\r\n255 0 8\r\n164 0 0\r\n82 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/credits/pokeball_pikachu.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 230 57\r\n255 213 41\r\n255 189 16\r\n255 172 0\r\n164 115 0\r\n82 57 0\r\n255 255 82\r\n213 213 65\r\n180 180 57\r\n148 148 41\r\n106 106 32\r\n255 90 0\r\n164 57 0\r\n82 24 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/credits/pokeball_venusaur.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n131 205 131\r\n90 164 115\r\n49 115 98\r\n16 115 123\r\n8 74 82\r\n0 32 41\r\n172 255 156\r\n131 197 123\r\n98 148 90\r\n65 98 57\r\n32 49 24\r\n16 180 0\r\n8 115 0\r\n0 57 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/credits/white_circle.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/dodrio_berry_picking/bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 246 255\r\n82 180 172\r\n82 205 189\r\n156 156 131\r\n106 156 148\r\n123 123 98\r\n189 172 98\r\n189 189 139\r\n74 172 156\r\n172 172 131\r\n74 156 123\r\n115 115 82\r\n139 139 106\r\n164 164 115\r\n197 197 148\r\n230 246 255\r\n"
  },
  {
    "path": "graphics/dodrio_berry_picking/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n238 255 238\r\n41 41 41\r\n213 222 90\r\n172 180 49\r\n90 98 16\r\n246 131 164\r\n197 82 82\r\n255 255 156\r\n255 205 98\r\n139 106 16\r\n148 148 148\r\n82 82 82\r\n255 205 230\r\n131 139 16\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/dodrio_berry_picking/tree_border.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 246 255\r\n246 246 222\r\n230 230 180\r\n139 238 139\r\n246 246 189\r\n197 246 164\r\n246 230 197\r\n230 246 255\r\n230 213 180\r\n205 197 164\r\n148 222 148\r\n222 238 255\r\n139 205 139\r\n213 238 246\r\n222 246 255\r\n213 205 164\r\n"
  },
  {
    "path": "graphics/easy_chat/text.pal",
    "content": "JASC-PAL\r\n0100\r\n5\r\n0 0 0\r\n255 255 255\r\n98 98 98\r\n222 213 222\r\n65 139 74\r\n"
  },
  {
    "path": "graphics/easy_chat/text_input_frame_green.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n189 255 139\r\n156 230 106\r\n123 180 90\r\n180 213 255\r\n139 180 230\r\n115 139 172\r\n0 0 0\r\n255 131 131\r\n238 82 82\r\n255 238 180\r\n255 255 213\r\n115 115 115\r\n180 189 180\r\n222 213 222\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/easy_chat/text_input_frame_orange.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 189 115\r\n255 139 57\r\n205 98 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 238 180\r\n255 255 213\r\n115 115 115\r\n180 189 180\r\n222 213 222\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/easy_chat/title_text.pal",
    "content": "JASC-PAL\r\n0100\r\n4\r\n0 0 0\r\n0 0 0\r\n57 205 255\r\n172 172 238\r\n"
  },
  {
    "path": "graphics/evolution_scene/gray_transition_intro.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/evolution_scene/transition.pal",
    "content": "JASC-PAL\r\n0100\r\n32\r\n0 0 0\r\n16 16 16\r\n24 32 32\r\n41 49 49\r\n49 65 74\r\n65 82 90\r\n74 98 115\r\n90 115 131\r\n106 131 148\r\n115 148 172\r\n131 164 189\r\n139 180 213\r\n156 197 230\r\n172 213 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n65 90 106\r\n74 98 115\r\n82 106 131\r\n90 115 139\r\n98 131 156\r\n106 139 164\r\n115 148 180\r\n123 156 189\r\n131 172 205\r\n139 180 213\r\n148 189 230\r\n156 197 238\r\n172 213 255\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/evolution_scene/unused.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n90 90 90\r\n98 106 106\r\n115 123 123\r\n131 131 131\r\n148 148 148\r\n156 164 164\r\n172 172 172\r\n189 189 189\r\n197 205 205\r\n213 213 213\r\n230 230 230\r\n246 246 246\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/fame_checker/silhouette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/fame_checker/unk.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_effects/palettes/ash.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n98 98 98\r\n213 213 139\r\n172 172 90\r\n139 139 65\r\n230 246 205\r\n189 238 180\r\n131 222 180\r\n98 172 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_effects/palettes/general_0.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 238\r\n246 230 197\r\n238 213 180\r\n222 180 148\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n98 156 180\r\n0 0 0\r\n0 0 0\r\n238 230 164\r\n222 213 139\r\n213 189 115\r\n197 180 90\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_effects/palettes/general_1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 238\r\n189 255 139\r\n131 213 98\r\n57 139 49\r\n57 82 0\r\n49 65 0\r\n98 172 238\r\n98 172 197\r\n139 205 246\r\n148 230 255\r\n148 131 98\r\n180 172 148\r\n164 230 197\r\n115 205 164\r\n65 180 139\r\n24 164 106\r\n"
  },
  {
    "path": "graphics/field_effects/palettes/small_sparkle.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 172 74\r\n255 255 255\r\n205 246 255\r\n156 213 255\r\n74 197 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/field_specials/champion_room_lighting_0.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n"
  },
  {
    "path": "graphics/field_specials/champion_room_lighting_1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 172 230\r\n41 115 205\r\n"
  },
  {
    "path": "graphics/field_specials/champion_room_lighting_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n82 82 106\r\n82 82 106\r\n82 172 230\r\n41 115 205\r\n131 238 255\r\n82 172 230\r\n"
  },
  {
    "path": "graphics/field_specials/champion_room_lighting_3.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n82 172 230\r\n41 115 205\r\n131 238 255\r\n82 172 230\r\n82 172 230\r\n41 115 205\r\n"
  },
  {
    "path": "graphics/field_specials/champion_room_lighting_4.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n131 238 255\r\n82 172 230\r\n82 172 230\r\n41 115 205\r\n41 115 205\r\n0 65 189\r\n"
  },
  {
    "path": "graphics/field_specials/champion_room_lighting_5.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n82 172 230\r\n41 115 205\r\n41 115 205\r\n0 65 189\r\n0 65 189\r\n82 82 106\r\n"
  },
  {
    "path": "graphics/field_specials/champion_room_lighting_6.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n41 115 205\r\n0 65 189\r\n0 65 189\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n"
  },
  {
    "path": "graphics/field_specials/champion_room_lighting_7.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n0 65 189\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n"
  },
  {
    "path": "graphics/field_specials/champion_room_lighting_8.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n131 238 255\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n172 172 98\r\n148 148 74\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n"
  },
  {
    "path": "graphics/field_specials/deoxys_rock_0.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 156 197\r\n32 32 32\r\n82 82 82\r\n139 139 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_specials/deoxys_rock_1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 156 197\r\n41 32 32\r\n82 82 82\r\n139 139 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_specials/deoxys_rock_10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 156 197\r\n205 32 32\r\n255 82 82\r\n255 205 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_specials/deoxys_rock_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n49 32 32\r\n90 82 82\r\n148 148 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_specials/deoxys_rock_3.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n65 32 32\r\n115 82 82\r\n156 148 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_specials/deoxys_rock_4.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n74 32 32\r\n123 82 82\r\n164 156 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_specials/deoxys_rock_5.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n98 32 32\r\n139 82 82\r\n172 156 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_specials/deoxys_rock_6.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n98 32 32\r\n148 82 82\r\n180 164 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_specials/deoxys_rock_7.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n106 32 32\r\n156 82 82\r\n189 164 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_specials/deoxys_rock_8.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n123 32 32\r\n172 82 82\r\n197 172 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_specials/deoxys_rock_9.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n131 32 32\r\n180 82 82\r\n205 172 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/field_specials/elite_four_lighting_0.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n"
  },
  {
    "path": "graphics/field_specials/elite_four_lighting_1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n41 115 205\r\n82 82 106\r\n"
  },
  {
    "path": "graphics/field_specials/elite_four_lighting_10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n0 41 156\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n0 41 156\r\n"
  },
  {
    "path": "graphics/field_specials/elite_four_lighting_11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n131 238 255\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n172 172 98\r\n148 148 74\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n"
  },
  {
    "path": "graphics/field_specials/elite_four_lighting_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n41 115 205\r\n131 238 255\r\n0 41 156\r\n"
  },
  {
    "path": "graphics/field_specials/elite_four_lighting_3.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n82 82 106\r\n82 82 106\r\n41 115 205\r\n131 238 255\r\n82 172 230\r\n0 65 189\r\n"
  },
  {
    "path": "graphics/field_specials/elite_four_lighting_4.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n82 82 106\r\n41 115 205\r\n131 238 255\r\n82 172 230\r\n41 115 205\r\n41 115 205\r\n"
  },
  {
    "path": "graphics/field_specials/elite_four_lighting_5.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n41 115 205\r\n131 238 255\r\n82 172 230\r\n41 115 205\r\n0 65 189\r\n82 172 230\r\n"
  },
  {
    "path": "graphics/field_specials/elite_four_lighting_6.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n131 238 255\r\n82 172 230\r\n41 115 205\r\n0 65 189\r\n0 41 156\r\n131 238 255\r\n"
  },
  {
    "path": "graphics/field_specials/elite_four_lighting_7.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n82 172 230\r\n41 115 205\r\n0 65 189\r\n0 41 156\r\n82 82 106\r\n90 180 238\r\n"
  },
  {
    "path": "graphics/field_specials/elite_four_lighting_8.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n41 115 205\r\n0 65 189\r\n0 41 156\r\n82 82 106\r\n82 82 106\r\n41 115 205\r\n"
  },
  {
    "path": "graphics/field_specials/elite_four_lighting_9.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 106\r\n123 123 123\r\n255 74 0\r\n255 213 131\r\n230 164 98\r\n197 115 74\r\n164 82 65\r\n255 255 180\r\n189 189 115\r\n0 65 189\r\n0 41 156\r\n82 82 106\r\n82 82 106\r\n82 82 106\r\n0 65 189\r\n"
  },
  {
    "path": "graphics/interface/bag.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n82 205 180\r\n255 246 180\r\n255 230 123\r\n238 205 98\r\n213 172 98\r\n65 74 106\r\n123 123 123\r\n90 90 90\r\n172 172 172\r\n164 123 65\r\n255 255 255\r\n222 106 0\r\n189 74 0\r\n131 41 0\r\n213 222 230\r\n230 238 246\r\n"
  },
  {
    "path": "graphics/interface/blank.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n189 189 197\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n148 255 164\r\n139 246 115\r\n65 205 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n213 213 205\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/interface/dex_caught_pokeball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 156 131\r\n238 238 238\r\n0 0 0\r\n213 213 189\r\n172 164 123\r\n255 131 123\r\n238 49 0\r\n222 49 16\r\n197 49 41\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/interface/pokemon_types.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 156 131\r\n238 49 0\r\n246 131 49\r\n255 180 16\r\n222 230 49\r\n123 205 82\r\n156 222 222\r\n106 148 246\r\n164 65 164\r\n172 172 123\r\n222 222 197\r\n189 164 57\r\n255 90 139\r\n82 123 139\r\n65 65 65\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/interface/red_arrow.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 164 197\r\n255 82 0\r\n131 32 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/interface/save_failed_screen.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n16 115 230\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n0 0 0\r\n74 205 238\r\n49 164 238\r\n0 90 131\r\n24 98 197\r\n16 115 230\r\n"
  },
  {
    "path": "graphics/interface/std_menu.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/interface/text_pp.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n238 222 0\r\n255 246 139\r\n255 148 0\r\n255 238 115\r\n238 0 0\r\n246 222 156\r\n32 32 32\r\n222 222 222\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/intro/copyright.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 32 32\r\n24 57 57\r\n49 82 82\r\n82 106 106\r\n106 131 131\r\n139 156 156\r\n164 180 180\r\n197 205 205\r\n222 230 230\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/intro/game_freak/bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n24 41 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n82 82 82\r\n180 180 180\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/intro/game_freak/sparkles.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 32\r\n0 0 74\r\n0 0 115\r\n24 24 123\r\n49 49 139\r\n82 82 156\r\n106 106 172\r\n139 139 189\r\n164 164 205\r\n197 197 222\r\n222 222 238\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/intro/gengar.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 222 205\r\n255 255 255\r\n222 222 222\r\n123 123 123\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n65 41 74\r\n255 180 123\r\n238 98 74\r\n205 57 32\r\n197 131 180\r\n164 98 148\r\n131 65 123\r\n90 57 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/intro/nidorino.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 222 205\r\n255 106 82\r\n222 65 41\r\n180 24 0\r\n57 238 189\r\n82 205 156\r\n0 164 115\r\n255 255 255\r\n255 0 255\r\n222 180 205\r\n189 131 189\r\n139 90 148\r\n106 57 98\r\n205 205 222\r\n131 131 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/intro/scene_2/bg.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n131 238 115\r\n82 189 74\r\n57 164 57\r\n115 213 98\r\n16 123 16\r\n164 255 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 148 0\r\n164 222 98\r\n0 0 0\r\n82 98 115\r\n98 189 123\r\n139 156 172\r\n65 139 98\r\n238 246 246\r\n106 172 57\r\n189 189 213\r\n148 213 82\r\n106 180 41\r\n164 131 41\r\n115 98 49\r\n82 74 57\r\n222 222 230\r\n32 65 90\r\n24 115 65\r\n0 0 0\r\n156 230 156\r\n131 205 148\r\n106 180 131\r\n65 139 98\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/intro/scene_2/nidorino_close.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 123 41\r\n65 148 90\r\n49 115 74\r\n106 57 98\r\n49 115 98\r\n82 205 156\r\n49 164 115\r\n255 255 255\r\n106 189 115\r\n90 41 82\r\n222 180 205\r\n189 131 189\r\n139 90 148\r\n205 205 222\r\n131 131 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/intro/scene_3/bg.pal",
    "content": "JASC-PAL\r\n0100\r\n32\r\n0 0 0\r\n82 98 115\r\n98 189 123\r\n139 156 172\r\n65 139 98\r\n238 246 246\r\n106 172 57\r\n189 189 213\r\n148 213 82\r\n106 180 41\r\n164 131 41\r\n115 98 49\r\n82 74 57\r\n222 222 230\r\n32 65 90\r\n24 115 65\r\n0 0 0\r\n164 238 139\r\n57 148 57\r\n131 213 115\r\n156 230 156\r\n131 205 148\r\n106 180 131\r\n65 139 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 0 0\r\n"
  },
  {
    "path": "graphics/item_menu/bag_window_pal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 156 148\r\n255 255 255\r\n189 90 82\r\n"
  },
  {
    "path": "graphics/item_menu/bg_female.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 65 90\r\n255 0 255\r\n41 57 82\r\n213 139 115\r\n255 0 255\r\n255 0 255\r\n255 172 148\r\n246 205 115\r\n238 230 172\r\n255 255 205\r\n222 139 74\r\n148 148 148\r\n238 230 172\r\n106 106 106\r\n213 180 82\r\n205 65 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/acro_bike.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n164 90 57\r\n246 246 246\r\n172 189 172\r\n98 98 98\r\n197 180 65\r\n230 164 123\r\n106 57 32\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/aguav_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n115 213 74\r\n106 189 74\r\n82 148 65\r\n74 98 74\r\n139 238 74\r\n230 238 106\r\n189 213 82\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/amulet_coin.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 246\r\n255 205 32\r\n180 156 41\r\n230 180 16\r\n255 238 65\r\n205 180 32\r\n246 246 180\r\n41 82 41\r\n115 90 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/antidote.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n205 205 205\r\n156 156 156\r\n255 238 98\r\n255 180 41\r\n255 213 74\r\n246 197 57\r\n255 255 180\r\n90 90 90\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/apicot_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n148 172 230\r\n189 222 106\r\n238 238 123\r\n57 74 131\r\n139 180 74\r\n106 131 189\r\n82 106 164\r\n115 156 49\r\n197 213 238\r\n90 131 32\r\n123 98 24\r\n205 205 98\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/aspear_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n205 180 74\r\n246 230 82\r\n255 255 106\r\n131 148 131\r\n172 197 180\r\n230 213 90\r\n131 115 65\r\n180 222 205\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/aurora_ticket.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 164 123\r\n49 49 49\r\n238 238 123\r\n65 205 238\r\n57 156 222\r\n90 74 164\r\n57 57 82\r\n98 238 246\r\n180 255 255\r\n57 123 189\r\n123 148 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/awakening.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n205 205 205\r\n156 156 156\r\n131 238 255\r\n74 180 197\r\n106 213 230\r\n90 197 213\r\n213 255 255\r\n90 90 90\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/bead_mail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 106 131\r\n131 164 189\r\n238 156 90\r\n230 98 82\r\n246 213 123\r\n172 205 230\r\n65 98 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/belue_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n156 123 230\r\n123 90 197\r\n156 222 115\r\n205 172 255\r\n238 230 172\r\n189 180 123\r\n82 156 49\r\n49 115 32\r\n82 57 156\r\n172 156 106\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/berry_juice.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n205 189 131\r\n205 222 131\r\n172 189 98\r\n238 189 115\r\n164 148 90\r\n131 148 57\r\n230 213 156\r\n98 82 32\r\n90 106 16\r\n139 123 65\r\n205 131 74\r\n238 255 255\r\n230 255 213\r\n180 213 164\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/berry_pouch.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 222 106\r\n49 49 49\r\n98 106 98\r\n238 213 82\r\n222 115 57\r\n246 246 246\r\n172 156 65\r\n255 205 57\r\n57 98 0\r\n90 82 57\r\n139 106 57\r\n197 172 82\r\n246 238 139\r\n230 172 57\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/bicycle.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n180 98 98\r\n246 246 246\r\n172 189 172\r\n98 98 98\r\n197 180 65\r\n246 172 172\r\n115 65 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/bike_voucher.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n205 205 49\r\n230 238 238\r\n238 156 156\r\n238 238 82\r\n156 164 164\r\n172 156 156\r\n82 90 90\r\n180 189 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/black_flute.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n115 115 115\r\n49 49 49\r\n148 148 148\r\n82 82 82\r\n222 222 98\r\n222 222 139\r\n238 238 189\r\n180 180 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/black_type_enhancing_item.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n205 205 205\r\n74 65 74\r\n98 90 98\r\n131 123 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/blue_flute.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n139 172 246\r\n74 106 172\r\n172 205 255\r\n106 139 222\r\n205 74 65\r\n205 115 106\r\n222 164 148\r\n164 74 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/blue_orb.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n106 115 230\r\n156 156 222\r\n74 82 197\r\n57 65 148\r\n205 205 255\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/blue_scarf.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n90 90 197\r\n131 131 246\r\n82 82 148\r\n106 106 213\r\n180 172 255\r\n123 123 230\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/blue_shard.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n172 180 255\r\n115 90 197\r\n32 8 90\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/bluk_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n57 65 98\r\n180 115 238\r\n115 82 189\r\n230 148 255\r\n57 65 123\r\n131 90 205\r\n123 205 65\r\n65 156 65\r\n65 115 65\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/bright_powder.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n131 172 131\r\n74 115 74\r\n57 98 57\r\n156 213 156\r\n213 255 213\r\n172 230 172\r\n246 255 246\r\n131 189 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/burn_heal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n205 205 205\r\n156 156 156\r\n139 246 139\r\n82 189 82\r\n115 222 115\r\n106 213 106\r\n222 255 222\r\n90 90 90\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/calcium.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 255 246\r\n148 90 57\r\n213 131 74\r\n255 205 164\r\n180 106 49\r\n189 148 41\r\n255 197 115\r\n197 222 197\r\n230 246 230\r\n172 197 172\r\n246 65 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/carbos.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 255 246\r\n148 90 57\r\n90 189 189\r\n164 246 246\r\n65 139 139\r\n189 148 41\r\n255 197 115\r\n197 222 197\r\n230 246 230\r\n172 197 172\r\n41 164 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/card_key.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n90 74 74\r\n222 230 230\r\n230 106 106\r\n189 197 197\r\n156 164 164\r\n139 123 90\r\n230 246 246\r\n246 156 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/charcoal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n98 98 98\r\n139 139 139\r\n189 189 189\r\n230 230 230\r\n255 255 255\r\n65 65 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/cheri_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n164 230 115\r\n238 98 82\r\n205 90 65\r\n255 222 189\r\n123 189 74\r\n213 246 123\r\n41 106 8\r\n131 65 49\r\n255 156 139\r\n222 106 82\r\n189 74 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/chesto_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n148 115 230\r\n98 90 172\r\n205 148 255\r\n57 65 123\r\n238 213 106\r\n172 172 106\r\n123 90 74\r\n131 90 205\r\n197 180 106\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/choice_band.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n180 180 197\r\n238 238 255\r\n98 98 106\r\n213 213 238\r\n222 222 238\r\n115 115 197\r\n222 115 115\r\n156 156 238\r\n82 82 164\r\n180 180 255\r\n246 246 255\r\n230 139 139\r\n246 205 205\r\n222 90 90\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/cleanse_tag.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n222 115 115\r\n82 82 82\r\n255 255 255\r\n222 222 222\r\n180 180 180\r\n148 148 148\r\n164 57 57\r\n189 82 82\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/coin_case.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n205 90 90\r\n172 57 57\r\n123 16 16\r\n65 65 65\r\n123 123 123\r\n238 238 123\r\n197 172 57\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/contest_pass.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n238 230 106\r\n230 98 74\r\n222 222 255\r\n189 189 222\r\n189 180 106\r\n197 98 74\r\n148 148 180\r\n230 172 139\r\n222 213 139\r\n238 238 246\r\n246 238 156\r\n222 123 98\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/cornn_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n230 164 230\r\n156 115 82\r\n123 106 164\r\n189 139 213\r\n98 82 131\r\n82 65 106\r\n156 148 98\r\n98 180 82\r\n49 148 82\r\n123 213 82\r\n49 98 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/dark_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n205 230 230\r\n189 213 213\r\n164 205 205\r\n139 189 197\r\n123 180 180\r\n98 164 172\r\n82 156 164\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n238 246 246\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/deep_sea_scale.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 189 230\r\n255 246 255\r\n255 222 255\r\n238 164 213\r\n255 197 246\r\n255 238 255\r\n180 82 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/deep_sea_tooth.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n205 197 255\r\n246 238 255\r\n230 230 255\r\n172 172 230\r\n246 246 230\r\n222 222 205\r\n230 230 164\r\n106 115 172\r\n197 197 131\r\n131 123 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/devon_goods.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n123 139 123\r\n246 246 246\r\n230 230 230\r\n189 205 189\r\n164 180 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/devon_scope.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n197 238 255\r\n156 197 213\r\n106 148 164\r\n65 115 139\r\n255 238 139\r\n197 156 74\r\n205 230 156\r\n98 98 98\r\n115 172 65\r\n148 148 148\r\n255 255 255\r\n74 74 74\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/dire_hit.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n230 189 90\r\n180 131 49\r\n255 213 131\r\n255 255 255\r\n164 148 148\r\n238 213 189\r\n123 57 8\r\n255 230 205\r\n205 148 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/dive_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 82 82\r\n123 123 131\r\n164 164 197\r\n222 205 246\r\n255 255 255\r\n41 115 213\r\n65 139 230\r\n90 164 255\r\n139 205 255\r\n148 238 246\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/dragon_fang.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 238 230\r\n180 172 164\r\n189 164 156\r\n131 106 98\r\n230 205 197\r\n255 255 255\r\n222 213 205\r\n148 139 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/dragon_scale.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n148 213 238\r\n172 238 255\r\n106 172 205\r\n65 123 156\r\n156 222 255\r\n172 238 222\r\n213 238 189\r\n246 246 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/dragon_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n205 230 255\r\n180 213 255\r\n156 197 255\r\n139 189 255\r\n172 180 213\r\n213 180 172\r\n255 180 131\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n230 246 255\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/dream_mail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 197 255\r\n246 172 238\r\n205 156 222\r\n172 123 189\r\n148 98 164\r\n123 74 139\r\n98 49 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/durin_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n115 180 65\r\n197 246 156\r\n57 115 16\r\n164 230 98\r\n197 172 90\r\n74 156 49\r\n139 106 41\r\n49 90 24\r\n246 205 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/electric_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n255 255 189\r\n255 238 156\r\n255 230 123\r\n255 222 90\r\n255 205 57\r\n255 197 24\r\n255 197 0\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n255 255 222\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/elixir.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n238 238 164\r\n255 189 156\r\n230 164 131\r\n205 205 131\r\n180 106 65\r\n164 164 90\r\n246 246 164\r\n255 222 213\r\n106 49 65\r\n197 131 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/energy_powder.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 246\r\n238 164 164\r\n148 148 82\r\n197 115 115\r\n222 222 156\r\n238 238 189\r\n115 65 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/energy_root.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n230 205 131\r\n213 164 90\r\n255 230 164\r\n139 90 16\r\n205 156 82\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/enigma_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 246 230\r\n74 74 74\r\n230 222 197\r\n205 189 164\r\n131 131 131\r\n180 180 180\r\n180 164 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/eon_ticket.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n238 246 246\r\n65 139 156\r\n82 205 205\r\n139 205 238\r\n139 189 98\r\n90 156 49\r\n213 180 139\r\n164 115 57\r\n246 115 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/escape_rope.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n148 123 41\r\n189 164 82\r\n123 98 16\r\n98 74 8\r\n213 82 49\r\n222 222 230\r\n189 189 197\r\n156 156 164\r\n172 41 8\r\n222 197 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/ether.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n213 230 230\r\n222 172 230\r\n189 139 197\r\n164 197 197\r\n131 82 139\r\n123 156 164\r\n230 255 255\r\n246 213 255\r\n74 41 98\r\n156 106 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/everstone.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n148 172 189\r\n180 205 213\r\n222 246 255\r\n106 139 156\r\n205 230 238\r\n65 98 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/exp_share.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n131 148 131\r\n172 189 172\r\n65 82 65\r\n255 255 148\r\n222 222 115\r\n230 230 255\r\n197 197 222\r\n164 164 189\r\n189 205 189\r\n106 123 106\r\n131 131 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/fab_mail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n238 246 255\r\n222 180 197\r\n246 213 222\r\n255 255 255\r\n172 115 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/fame_checker.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 197 57\r\n49 49 49\r\n98 106 98\r\n238 123 41\r\n74 74 57\r\n98 156 148\r\n115 205 189\r\n0 0 0\r\n0 0 0\r\n255 172 65\r\n197 197 205\r\n213 246 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/fighting_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n246 213 189\r\n238 197 156\r\n238 180 123\r\n238 164 90\r\n230 148 57\r\n230 131 24\r\n230 115 0\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n255 238 230\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/figy_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 213\r\n246 238 139\r\n230 213 148\r\n205 189 123\r\n238 148 49\r\n189 106 65\r\n213 230 123\r\n139 148 74\r\n0 0 0\r\n156 123 57\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/fire_stone.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 238 49\r\n246 148 49\r\n222 205 16\r\n222 115 16\r\n255 255 238\r\n197 197 106\r\n230 230 123\r\n123 123 32\r\n255 238 156\r\n255 255 139\r\n164 164 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/fire_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n255 230 189\r\n255 222 156\r\n255 205 131\r\n255 197 98\r\n255 189 65\r\n255 180 41\r\n238 172 32\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n255 238 222\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/fluffy_tail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 246 139\r\n222 222 90\r\n197 139 82\r\n238 172 115\r\n255 222 164\r\n131 74 16\r\n246 230 246\r\n180 148 172\r\n139 98 131\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/flying_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n213 246 255\r\n189 238 255\r\n172 238 255\r\n156 238 255\r\n172 222 238\r\n180 205 222\r\n197 197 197\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n246 246 255\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/focus_band.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n189 82 82\r\n238 123 123\r\n139 74 74\r\n205 98 98\r\n238 238 189\r\n213 213 164\r\n189 189 131\r\n255 222 123\r\n230 172 49\r\n197 139 16\r\n255 164 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/fresh_water.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n172 189 246\r\n213 255 255\r\n197 213 213\r\n156 172 172\r\n98 115 172\r\n65 82 139\r\n65 131 49\r\n115 180 98\r\n148 164 222\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/full_heal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 205\r\n238 230 0\r\n197 189 0\r\n255 246 65\r\n222 213 0\r\n180 172 0\r\n213 115 32\r\n255 123 0\r\n123 123 0\r\n246 255 65\r\n156 172 0\r\n222 238 0\r\n172 189 0\r\n197 213 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/full_restore.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n156 230 65\r\n172 255 148\r\n123 197 32\r\n90 123 49\r\n213 213 164\r\n148 148 98\r\n255 255 213\r\n255 255 230\r\n180 180 131\r\n238 238 180\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/ganlon_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n156 148 205\r\n222 213 131\r\n197 189 246\r\n115 106 164\r\n74 65 115\r\n164 148 90\r\n213 213 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/ghost_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n238 222 246\r\n230 205 246\r\n230 189 246\r\n222 172 246\r\n213 148 246\r\n197 123 238\r\n180 98 222\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n255 238 255\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/glitter_mail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n238 238 148\r\n238 238 115\r\n230 205 106\r\n246 164 115\r\n139 123 90\r\n164 148 115\r\n222 222 106\r\n230 156 106\r\n197 189 148\r\n255 255 238\r\n180 180 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/go_goggles.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 230 139\r\n255 255 246\r\n222 180 49\r\n222 131 0\r\n139 139 139\r\n90 90 90\r\n189 189 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/gold_teeth.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n230 230 57\r\n222 106 106\r\n255 189 189\r\n189 90 90\r\n246 172 172\r\n255 255 230\r\n148 148 8\r\n197 197 57\r\n148 49 49\r\n123 123 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/good_rod.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n222 246 98\r\n180 205 65\r\n82 82 139\r\n123 123 180\r\n115 139 41\r\n197 222 230\r\n156 180 189\r\n106 131 139\r\n205 90 57\r\n246 131 98\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/grass_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n213 246 230\r\n197 246 213\r\n180 246 205\r\n156 238 197\r\n139 238 180\r\n123 238 172\r\n106 238 164\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n238 246 246\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/great_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 82 82\r\n123 123 131\r\n164 164 197\r\n222 205 246\r\n255 255 255\r\n49 65 148\r\n0 0 0\r\n49 82 213\r\n57 148 255\r\n57 213 255\r\n189 49 49\r\n246 74 74\r\n255 172 172\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/green_scarf.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n115 197 115\r\n156 238 156\r\n82 148 82\r\n123 213 123\r\n180 255 180\r\n139 230 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/green_shard.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n148 246 139\r\n90 197 115\r\n8 90 32\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/grepa_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 230 57\r\n222 189 74\r\n238 197 74\r\n156 139 74\r\n255 255 115\r\n90 164 32\r\n139 213 32\r\n0 0 0\r\n49 98 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/ground_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n255 255 189\r\n255 255 156\r\n255 255 123\r\n255 255 90\r\n246 238 90\r\n230 213 82\r\n222 197 65\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n255 255 222\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/guard_spec.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n106 213 115\r\n74 164 74\r\n172 238 156\r\n255 255 255\r\n148 156 148\r\n213 230 213\r\n32 115 32\r\n222 255 230\r\n90 172 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/harbor_mail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n106 148 172\r\n139 205 222\r\n238 255 255\r\n246 246 197\r\n205 238 238\r\n230 230 180\r\n115 106 65\r\n139 131 90\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/hard_stone.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 246 246\r\n123 115 115\r\n156 148 148\r\n90 82 82\r\n205 197 205\r\n82 74 74\r\n238 230 230\r\n98 90 90\r\n74 65 65\r\n180 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/heal_powder.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n205 230 205\r\n238 238 98\r\n57 123 57\r\n197 197 98\r\n90 172 90\r\n139 205 139\r\n115 115 32\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/heart_scale.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n238 205 205\r\n197 230 197\r\n205 205 238\r\n205 238 238\r\n238 238 238\r\n123 123 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/hoenn_fossil.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n189 180 82\r\n74 65 0\r\n139 131 32\r\n98 90 0\r\n222 213 115\r\n139 90 0\r\n0 0 0\r\n213 213 131\r\n98 98 41\r\n164 164 82\r\n123 123 41\r\n246 246 164\r\n164 123 41\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/hondew_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 238 74\r\n205 197 74\r\n148 222 74\r\n115 197 74\r\n82 156 74\r\n74 98 74\r\n197 255 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/hp_up.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 255 246\r\n148 90 57\r\n90 189 90\r\n164 246 164\r\n65 139 65\r\n189 148 41\r\n255 197 115\r\n197 222 197\r\n230 246 230\r\n172 197 172\r\n106 164 238\r\n74 131 205\r\n148 205 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/hyper_potion.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 131 205\r\n197 222 238\r\n255 255 255\r\n164 189 205\r\n255 98 172\r\n131 156 172\r\n230 255 255\r\n255 197 255\r\n82 106 123\r\n197 57 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/iapapa_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 213\r\n255 238 123\r\n238 205 148\r\n213 180 123\r\n238 148 49\r\n205 115 65\r\n172 115 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n115 123 49\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/ice_heal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n205 205 205\r\n156 156 156\r\n255 189 180\r\n246 106 106\r\n246 164 164\r\n246 139 139\r\n255 222 222\r\n90 90 90\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/ice_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n230 246 255\r\n213 246 255\r\n197 246 255\r\n172 238 255\r\n156 238 255\r\n139 230 246\r\n131 213 238\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n255 255 255\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/iron.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 255 246\r\n148 90 57\r\n189 189 90\r\n246 246 164\r\n139 139 65\r\n189 148 41\r\n255 197 115\r\n197 222 197\r\n230 246 230\r\n172 197 172\r\n49 164 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/itemfinder.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n238 238 106\r\n255 255 255\r\n74 74 74\r\n213 98 98\r\n98 172 238\r\n123 74 74\r\n255 189 189\r\n65 139 205\r\n139 213 255\r\n189 189 189\r\n106 106 106\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/kanto_fossil.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n164 123 0\r\n189 148 41\r\n197 156 57\r\n222 189 106\r\n123 82 0\r\n106 65 0\r\n65 49 0\r\n238 222 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/kelpsy_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n115 98 230\r\n139 213 255\r\n115 172 255\r\n90 82 98\r\n98 82 156\r\n197 197 123\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/key.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n106 106 106\r\n74 65 74\r\n255 255 255\r\n164 164 164\r\n156 156 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n164 90 90\r\n213 90 90\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/kings_rock.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n230 213 90\r\n246 230 123\r\n197 180 57\r\n164 148 32\r\n131 115 32\r\n74 57 24\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/lansat_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 189 164\r\n222 139 106\r\n139 205 164\r\n197 106 74\r\n49 115 74\r\n246 197 172\r\n98 164 123\r\n131 57 32\r\n164 230 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/lava_cookie_and_letter.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n238 238 255\r\n205 197 230\r\n0 0 0\r\n205 139 65\r\n230 180 24\r\n180 98 41\r\n57 49 16\r\n98 98 57\r\n172 172 131\r\n115 65 24\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/lax_incense.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n230 172 16\r\n172 115 32\r\n255 222 156\r\n222 189 123\r\n156 98 8\r\n205 148 16\r\n255 246 189\r\n246 197 65\r\n49 98 49\r\n197 230 197\r\n98 98 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/leaf_stone.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n106 148 106\r\n90 131 82\r\n139 180 139\r\n156 172 123\r\n123 139 90\r\n90 106 57\r\n74 90 41\r\n57 98 57\r\n197 213 164\r\n123 164 123\r\n74 115 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/leftovers.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n230 82 82\r\n156 139 82\r\n123 148 32\r\n180 90 90\r\n123 74 74\r\n255 255 255\r\n255 139 106\r\n238 255 213\r\n205 230 172\r\n246 98 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/lemonade.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n230 230 255\r\n205 205 230\r\n164 164 189\r\n238 238 164\r\n197 197 131\r\n255 255 205\r\n255 197 156\r\n222 164 123\r\n255 222 180\r\n255 148 115\r\n131 213 180\r\n213 65 65\r\n238 98 98\r\n255 164 172\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/leppa_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n180 164 98\r\n255 148 49\r\n205 74 49\r\n230 115 49\r\n238 230 98\r\n90 213 82\r\n65 156 65\r\n49 115 65\r\n156 82 57\r\n255 222 49\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/liechi_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 246\r\n255 172 74\r\n172 82 16\r\n246 238 197\r\n164 156 131\r\n213 205 148\r\n213 115 49\r\n255 230 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/light_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 156\r\n230 222 41\r\n164 164 16\r\n255 255 255\r\n90 90 0\r\n222 222 139\r\n189 189 0\r\n131 131 0\r\n255 255 197\r\n74 74 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/link_bracelet.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n98 82 205\r\n156 131 255\r\n197 197 255\r\n238 238 255\r\n222 222 255\r\n74 74 180\r\n106 106 222\r\n172 205 246\r\n148 180 222\r\n115 148 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/lucky_egg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n222 238 246\r\n205 213 222\r\n164 172 180\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/lucky_punch.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n222 115 57\r\n255 222 106\r\n255 172 115\r\n172 90 49\r\n115 65 16\r\n255 255 255\r\n139 139 139\r\n230 230 230\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/lum_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n148 222 74\r\n115 197 74\r\n82 164 74\r\n74 98 74\r\n164 255 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/luxury_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 82 82\r\n123 123 131\r\n164 164 197\r\n222 205 246\r\n255 255 255\r\n156 74 57\r\n180 82 57\r\n222 90 57\r\n255 148 57\r\n255 213 57\r\n230 180 106\r\n255 255 148\r\n213 156 49\r\n255 238 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/mach_bike.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n106 123 189\r\n172 189 172\r\n246 255 246\r\n98 98 98\r\n172 172 74\r\n156 164 156\r\n164 180 255\r\n139 49 0\r\n57 74 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/macho_brace.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n222 230 238\r\n74 131 82\r\n106 164 115\r\n139 197 148\r\n180 238 189\r\n197 205 213\r\n156 164 172\r\n213 222 230\r\n74 90 98\r\n238 238 246\r\n255 255 222\r\n156 156 49\r\n57 82 65\r\n49 106 57\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/magma_emblem.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 82 82\r\n123 123 131\r\n164 164 197\r\n222 205 246\r\n255 255 255\r\n164 8 57\r\n222 82 82\r\n230 115 82\r\n238 148 82\r\n246 180 82\r\n255 213 82\r\n255 238 106\r\n255 255 180\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/magnet.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 156 148\r\n115 57 57\r\n148 156 255\r\n57 57 115\r\n90 90 180\r\n148 164 148\r\n74 90 74\r\n172 189 172\r\n172 82 82\r\n255 189 189\r\n197 197 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/mago_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 230 156\r\n255 148 131\r\n255 189 156\r\n230 123 115\r\n172 90 65\r\n255 246 164\r\n222 213 115\r\n197 172 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/magost_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 189 156\r\n230 131 98\r\n172 90 65\r\n255 164 139\r\n49 156 82\r\n98 205 82\r\n49 98 82\r\n255 230 156\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/master_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 82 82\r\n123 123 131\r\n164 164 197\r\n222 205 246\r\n255 255 255\r\n106 49 197\r\n115 49 205\r\n180 57 246\r\n205 65 255\r\n0 0 0\r\n180 0 148\r\n230 32 197\r\n255 197 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/max_elixir.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 246 180\r\n156 255 255\r\n131 230 230\r\n238 238 156\r\n65 180 180\r\n213 213 90\r\n255 255 205\r\n213 255 255\r\n65 106 106\r\n115 197 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/max_ether.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n238 238 255\r\n189 255 156\r\n164 230 131\r\n205 205 222\r\n106 180 65\r\n164 164 180\r\n246 246 255\r\n222 255 213\r\n49 106 65\r\n131 197 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/max_potion.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n65 156 230\r\n148 172 255\r\n32 123 197\r\n49 90 123\r\n180 180 197\r\n115 115 131\r\n230 230 246\r\n246 255 246\r\n148 148 164\r\n205 205 222\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/max_repel.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n213 230 230\r\n180 197 197\r\n123 139 139\r\n0 0 0\r\n0 0 0\r\n213 205 189\r\n139 131 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 246 230\r\n189 172 106\r\n246 230 164\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/mech_mail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 255 246\r\n213 222 213\r\n131 139 131\r\n172 180 172\r\n90 98 90\r\n172 172 106\r\n222 222 180\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/mental_herb.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n222 255 255\r\n148 230 230\r\n123 205 205\r\n164 246 246\r\n172 255 255\r\n156 238 238\r\n57 148 148\r\n106 197 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/metal_coat.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n222 238 238\r\n180 197 197\r\n82 106 106\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n106 131 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/metal_powder.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n213 213 213\r\n156 156 156\r\n90 90 90\r\n238 238 238\r\n205 148 213\r\n156 106 164\r\n238 197 246\r\n115 65 123\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/meteorite.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n131 82 82\r\n90 57 57\r\n205 131 123\r\n180 139 172\r\n213 156 205\r\n230 189 205\r\n156 106 106\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/miracle_seed.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 238\r\n222 222 123\r\n238 238 90\r\n197 197 49\r\n131 131 8\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/moomoo_milk.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 246 230\r\n238 238 213\r\n230 230 180\r\n180 180 115\r\n213 148 213\r\n255 255 255\r\n238 164 238\r\n156 82 156\r\n255 189 255\r\n131 131 57\r\n180 106 180\r\n123 49 139\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/moon_stone.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n205 230 213\r\n172 197 180\r\n131 156 139\r\n90 115 98\r\n222 246 230\r\n106 131 115\r\n74 98 82\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/mushroom.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n213 57 32\r\n255 115 90\r\n255 164 131\r\n238 213 74\r\n246 230 98\r\n238 222 222\r\n222 205 205\r\n180 164 164\r\n139 123 123\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/mystic_ticket.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 164 123\r\n49 49 49\r\n180 222 238\r\n255 255 255\r\n230 164 222\r\n139 74 172\r\n115 74 98\r\n189 115 197\r\n123 148 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/mystic_water.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n90 90 213\r\n156 222 255\r\n197 213 213\r\n172 172 222\r\n255 255 255\r\n74 0 0\r\n74 74 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/nanab_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 180 131\r\n205 106 106\r\n123 90 65\r\n255 222 131\r\n255 238 131\r\n164 156 74\r\n213 197 90\r\n238 148 106\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/nest_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 82 82\r\n123 123 131\r\n164 164 197\r\n222 205 246\r\n255 255 255\r\n82 123 57\r\n57 98 57\r\n98 148 65\r\n123 197 57\r\n180 246 57\r\n255 0 255\r\n246 246 156\r\n172 172 74\r\n230 230 131\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/net_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 82 82\r\n123 123 131\r\n164 164 197\r\n222 205 246\r\n255 255 255\r\n74 106 123\r\n65 65 65\r\n74 123 139\r\n74 180 197\r\n57 230 238\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/never_melt_ice.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 255 255\r\n74 90 98\r\n164 213 230\r\n222 246 255\r\n115 164 197\r\n49 123 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/nomel_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 246 98\r\n197 197 41\r\n98 98 16\r\n255 255 246\r\n230 230 74\r\n164 164 8\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/normal_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n238 238 238\r\n230 230 238\r\n230 230 230\r\n222 222 222\r\n213 213 213\r\n205 205 205\r\n197 197 197\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n255 255 255\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/nugget.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n205 172 74\r\n255 205 74\r\n255 230 98\r\n255 238 139\r\n255 255 255\r\n156 115 16\r\n131 90 0\r\n197 156 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/oaks_parcel.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 222 131\r\n205 180 90\r\n148 123 32\r\n115 90 16\r\n115 115 24\r\n197 197 82\r\n164 164 49\r\n205 82 16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/old_amber.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n197 123 0\r\n230 148 0\r\n246 180 0\r\n246 246 180\r\n156 82 0\r\n180 115 0\r\n255 255 255\r\n255 255 106\r\n238 197 131\r\n255 197 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/old_key.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n230 222 197\r\n205 189 164\r\n148 131 106\r\n98 82 57\r\n255 246 246\r\n0 0 0\r\n189 230 197\r\n164 197 164\r\n106 139 106\r\n57 90 57\r\n213 255 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/old_rod.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n156 106 8\r\n197 156 65\r\n115 65 16\r\n230 189 106\r\n197 222 230\r\n156 180 189\r\n106 131 139\r\n205 90 57\r\n246 131 98\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/old_sea_map.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 197 98\r\n49 49 49\r\n213 180 139\r\n222 205 164\r\n197 172 123\r\n148 131 106\r\n180 148 106\r\n197 123 115\r\n180 90 82\r\n115 90 57\r\n0 0 0\r\n0 0 0\r\n65 49 24\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/oran_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n82 164 246\r\n106 106 189\r\n90 213 255\r\n82 82 131\r\n189 197 255\r\n230 238 255\r\n156 164 189\r\n82 123 205\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/orange_mail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 205 139\r\n164 222 131\r\n246 246 164\r\n123 98 82\r\n189 164 115\r\n172 148 115\r\n255 255 238\r\n164 164 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/pamtre_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n139 123 189\r\n115 180 98\r\n238 222 180\r\n90 74 139\r\n115 98 164\r\n180 164 230\r\n156 213 139\r\n49 115 49\r\n115 106 74\r\n205 189 148\r\n164 148 106\r\n82 74 41\r\n65 49 115\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/paralyze_heal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n205 205 205\r\n156 156 156\r\n255 255 148\r\n197 197 57\r\n238 238 98\r\n222 222 90\r\n255 255 213\r\n90 90 90\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/pearl.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n238 197 197\r\n180 230 222\r\n189 189 189\r\n238 238 189\r\n255 255 255\r\n230 230 230\r\n148 164 164\r\n74 74 74\r\n213 172 172\r\n156 205 197\r\n164 164 164\r\n123 139 139\r\n255 255 205\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/pecha_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 197 156\r\n238 148 115\r\n172 90 65\r\n255 246 213\r\n98 205 82\r\n90 189 65\r\n49 115 65\r\n255 230 156\r\n255 180 115\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/persim_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 205 156\r\n230 156 115\r\n189 115 82\r\n98 106 65\r\n115 222 82\r\n74 172 65\r\n49 98 65\r\n255 238 164\r\n255 189 131\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/petaya_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 164 123\r\n139 74 49\r\n197 123 82\r\n255 213 197\r\n213 189 148\r\n197 238 139\r\n164 139 98\r\n98 49 16\r\n131 189 106\r\n106 164 82\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/pinap_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n189 180 98\r\n246 230 74\r\n222 205 82\r\n205 180 82\r\n148 139 90\r\n123 222 90\r\n82 189 90\r\n74 106 65\r\n255 246 148\r\n106 106 65\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/pink_scarf.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n213 131 156\r\n255 172 205\r\n164 98 131\r\n230 139 180\r\n255 197 230\r\n246 156 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/poison_barb.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n197 148 197\r\n238 189 238\r\n98 98 98\r\n213 213 213\r\n255 230 255\r\n148 98 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/poison_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n255 222 197\r\n255 205 172\r\n255 189 148\r\n255 180 123\r\n230 148 156\r\n205 123 189\r\n180 98 222\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n255 238 230\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/poke_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 82 82\r\n123 123 131\r\n164 164 197\r\n222 205 246\r\n255 255 255\r\n156 74 57\r\n180 82 57\r\n222 90 57\r\n255 148 57\r\n255 213 57\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/poke_doll.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n98 65 0\r\n255 213 222\r\n246 180 213\r\n213 148 180\r\n164 98 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/poke_flute.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n213 82 57\r\n164 32 8\r\n238 238 246\r\n123 123 131\r\n197 172 49\r\n238 213 98\r\n255 246 131\r\n246 115 90\r\n205 205 213\r\n189 57 32\r\n148 98 41\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/pokeblock_case.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n197 115 106\r\n230 222 246\r\n197 180 205\r\n189 230 255\r\n82 123 164\r\n246 197 189\r\n131 230 148\r\n139 180 238\r\n123 106 131\r\n123 74 65\r\n230 156 148\r\n49 90 131\r\n255 255 255\r\n238 180 172\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/pomeg_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 148 49\r\n205 74 49\r\n131 57 49\r\n230 115 49\r\n255 222 82\r\n0 0 0\r\n90 180 82\r\n0 0 0\r\n49 98 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/potion.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n164 131 205\r\n197 238 222\r\n255 255 255\r\n164 205 189\r\n131 98 172\r\n131 172 156\r\n230 255 255\r\n230 197 255\r\n82 123 106\r\n90 57 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/powder_jar.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n139 131 49\r\n213 172 49\r\n255 238 74\r\n131 98 49\r\n230 205 57\r\n115 246 115\r\n74 189 82\r\n98 74 49\r\n255 180 49\r\n238 189 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/pp_max.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 246 246\r\n90 148 57\r\n255 230 90\r\n255 255 230\r\n139 139 8\r\n148 189 41\r\n197 255 115\r\n222 197 197\r\n246 230 230\r\n197 172 172\r\n197 123 197\r\n172 82 172\r\n238 148 238\r\n230 205 74\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/pp_up.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 255 246\r\n148 90 57\r\n189 90 189\r\n246 164 246\r\n139 65 139\r\n189 148 41\r\n255 197 115\r\n197 222 197\r\n230 246 230\r\n172 197 172\r\n98 189 189\r\n74 164 164\r\n49 139 139\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/protein.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 255 246\r\n148 90 57\r\n197 98 98\r\n246 164 164\r\n139 65 65\r\n189 148 41\r\n255 197 115\r\n197 222 197\r\n230 246 230\r\n172 197 172\r\n246 164 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/psychic_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n255 230 230\r\n255 222 213\r\n255 213 205\r\n255 197 197\r\n255 189 180\r\n255 180 172\r\n255 172 164\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n255 246 246\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/qualot_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 213 131\r\n238 156 115\r\n246 189 123\r\n255 246 131\r\n0 0 0\r\n156 139 74\r\n189 180 98\r\n222 213 115\r\n238 246 123\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/question_mark.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 164 98\r\n0 0 0\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/quick_claw.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n197 197 197\r\n255 255 255\r\n222 197 106\r\n255 222 213\r\n205 156 82\r\n172 123 57\r\n123 123 123\r\n246 246 205\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/rabuta_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n139 213 115\r\n246 238 205\r\n197 189 131\r\n148 139 82\r\n49 98 24\r\n65 139 41\r\n115 189 90\r\n82 82 32\r\n172 238 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/rainbow_pass.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 164 123\r\n49 49 49\r\n65 82 180\r\n74 148 255\r\n238 156 98\r\n255 246 90\r\n74 115 205\r\n205 115 148\r\n139 230 255\r\n98 205 255\r\n255 189 164\r\n0 0 0\r\n255 255 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/rare_candy.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n156 189 255\r\n98 115 213\r\n123 148 238\r\n41 57 156\r\n82 98 197\r\n213 238 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/rawst_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n98 90 123\r\n131 148 172\r\n148 213 213\r\n139 180 213\r\n148 230 230\r\n90 213 82\r\n65 156 65\r\n49 106 65\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/razz_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 172 41\r\n222 90 49\r\n246 139 41\r\n156 65 41\r\n131 238 65\r\n65 172 65\r\n41 90 57\r\n255 230 65\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/red_flute.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n246 172 139\r\n172 106 74\r\n255 205 172\r\n222 139 106\r\n65 74 205\r\n106 115 205\r\n148 164 222\r\n65 74 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/red_orb.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n230 115 106\r\n222 156 156\r\n197 82 74\r\n148 65 57\r\n255 205 205\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/red_scarf.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n189 82 82\r\n238 123 123\r\n139 74 74\r\n205 98 98\r\n255 164 172\r\n222 115 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/red_shard.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 148 139\r\n197 90 115\r\n90 8 32\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/repeat_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 82 82\r\n123 123 131\r\n164 164 197\r\n222 205 246\r\n255 255 255\r\n156 74 57\r\n180 82 57\r\n222 90 57\r\n255 148 57\r\n255 213 57\r\n246 246 139\r\n180 164 57\r\n222 205 57\r\n246 238 57\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/repel.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n213 230 230\r\n180 197 197\r\n123 139 139\r\n0 0 0\r\n0 0 0\r\n230 90 57\r\n189 49 16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n139 230 139\r\n49 123 49\r\n82 180 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/retro_mail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 139 74\r\n123 205 65\r\n98 156 230\r\n246 172 172\r\n205 148 90\r\n172 98 65\r\n65 98 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/return_to_field_arrow.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n57 57 57\r\n172 172 189\r\n205 205 222\r\n255 255 255\r\n131 131 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/revival_herb.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n180 230 115\r\n115 164 82\r\n222 197 123\r\n65 82 41\r\n148 148 115\r\n49 123 16\r\n65 65 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/revive.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 246 197\r\n230 230 123\r\n164 164 57\r\n255 255 255\r\n74 74 0\r\n222 238 238\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/rock_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n246 238 222\r\n238 230 197\r\n238 222 172\r\n230 213 148\r\n222 197 115\r\n222 189 90\r\n213 180 65\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n255 255 255\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/ruby.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n123 49 65\r\n197 82 90\r\n222 123 123\r\n238 148 148\r\n255 172 172\r\n255 197 197\r\n255 222 222\r\n255 238 238\r\n230 156 156\r\n255 205 205\r\n139 65 82\r\n255 213 213\r\n255 180 180\r\n164 74 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/sacred_ash.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n222 222 106\r\n172 172 41\r\n98 98 24\r\n246 246 164\r\n156 156 156\r\n115 115 115\r\n205 205 205\r\n82 82 82\r\n222 222 222\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/safari_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 82 82\r\n123 123 131\r\n164 164 197\r\n222 205 246\r\n255 255 255\r\n74 98 0\r\n98 123 24\r\n156 180 82\r\n115 98 0\r\n197 180 57\r\n222 213 123\r\n16 90 49\r\n74 148 98\r\n106 180 139\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/salac_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n123 189 115\r\n49 115 41\r\n164 213 131\r\n213 246 180\r\n74 139 74\r\n230 246 123\r\n205 222 106\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/sapphire.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n65 49 123\r\n90 82 197\r\n123 123 222\r\n148 148 238\r\n172 172 255\r\n197 197 255\r\n222 222 255\r\n238 238 255\r\n156 156 230\r\n205 205 255\r\n82 65 139\r\n213 213 255\r\n180 180 255\r\n82 74 164\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/scanner.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 148 0\r\n0 230 0\r\n82 106 164\r\n156 180 238\r\n197 222 255\r\n98 90 41\r\n222 213 65\r\n41 65 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n82 82 106\r\n238 238 255\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/scope_lens.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n164 180 197\r\n106 123 139\r\n213 90 74\r\n123 156 213\r\n197 213 230\r\n65 82 98\r\n82 115 172\r\n148 164 180\r\n246 238 82\r\n238 197 74\r\n148 115 41\r\n238 246 255\r\n115 82 8\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/sea_incense.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n98 164 246\r\n74 115 197\r\n197 222 246\r\n172 197 222\r\n49 90 156\r\n131 197 255\r\n180 164 115\r\n164 148 98\r\n115 98 49\r\n238 230 197\r\n74 98 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/secret_key.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n148 148 49\r\n115 106 16\r\n255 255 238\r\n189 197 41\r\n197 197 98\r\n90 90 90\r\n205 213 205\r\n156 164 156\r\n238 246 238\r\n115 115 115\r\n0 0 0\r\n255 115 115\r\n197 74 74\r\n230 90 90\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/shadow_mail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n197 172 164\r\n98 74 65\r\n74 57 57\r\n255 98 98\r\n255 238 238\r\n197 82 82\r\n139 115 106\r\n156 131 123\r\n156 164 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/sharp_beak.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 222 90\r\n213 172 57\r\n139 98 32\r\n255 246 189\r\n255 230 156\r\n106 65 24\r\n189 148 57\r\n49 74 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/shell.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n238 213 213\r\n213 246 238\r\n205 205 197\r\n255 255 222\r\n255 255 255\r\n230 230 230\r\n164 180 180\r\n74 74 74\r\n213 172 172\r\n156 205 197\r\n164 164 164\r\n123 139 139\r\n255 255 205\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/shoal_salt.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n238 205 131\r\n131 131 131\r\n197 164 82\r\n205 205 205\r\n238 238 238\r\n115 90 32\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/silk_scarf.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n230 255 255\r\n222 230 230\r\n197 205 205\r\n106 123 115\r\n255 255 255\r\n238 246 246\r\n82 98 90\r\n172 180 180\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/silph_scope.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n246 139 139\r\n106 164 222\r\n189 65 65\r\n255 189 189\r\n148 205 255\r\n74 98 156\r\n197 213 197\r\n139 164 139\r\n65 90 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/silver_powder.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n139 213 139\r\n115 115 115\r\n106 189 106\r\n156 156 156\r\n197 197 197\r\n65 115 65\r\n238 238 238\r\n213 213 213\r\n189 230 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/sitrus_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 238 106\r\n213 180 74\r\n139 115 57\r\n230 180 65\r\n238 213 90\r\n106 213 90\r\n0 0 0\r\n82 131 74\r\n172 115 49\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/smoke_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n222 189 230\r\n213 164 230\r\n148 123 205\r\n255 246 255\r\n115 115 115\r\n246 222 246\r\n230 205 246\r\n148 98 164\r\n197 148 213\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/soda_pop.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n49 74 74\r\n90 123 123\r\n139 189 197\r\n189 238 246\r\n82 156 205\r\n131 205 255\r\n255 255 255\r\n238 230 230\r\n197 180 180\r\n57 131 180\r\n189 213 255\r\n156 205 238\r\n106 189 230\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/soft_sand.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n213 156 213\r\n156 98 156\r\n115 57 115\r\n238 180 238\r\n246 230 156\r\n205 172 115\r\n255 246 213\r\n148 106 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/soot_sack.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n238 238 255\r\n246 197 156\r\n148 139 172\r\n74 74 106\r\n213 205 238\r\n230 230 246\r\n180 172 205\r\n238 238 255\r\n222 172 123\r\n189 139 90\r\n156 106 65\r\n131 123 156\r\n98 65 49\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/soothe_bell.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n230 230 230\r\n82 82 82\r\n123 123 123\r\n164 164 164\r\n205 205 205\r\n213 115 106\r\n131 49 49\r\n164 90 82\r\n255 189 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/soul_dew.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n65 90 180\r\n98 123 213\r\n205 222 255\r\n222 197 246\r\n172 148 213\r\n41 65 156\r\n222 238 238\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/spell_tag.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 148 148\r\n82 82 82\r\n255 255 255\r\n205 205 205\r\n156 156 156\r\n148 148 148\r\n197 98 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/spelon_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 123 115\r\n255 230 156\r\n205 90 82\r\n172 90 74\r\n255 197 115\r\n255 189 172\r\n230 106 98\r\n131 65 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/ss_ticket.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n213 222 222\r\n49 106 139\r\n82 164 222\r\n98 180 238\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/star.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n98 156 213\r\n41 98 156\r\n24 57 115\r\n123 180 238\r\n246 164 164\r\n222 115 115\r\n255 222 222\r\n156 74 74\r\n255 255 255\r\n131 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/starf_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n164 230 106\r\n123 189 65\r\n213 255 197\r\n98 148 213\r\n238 222 65\r\n238 90 65\r\n82 148 57\r\n222 172 57\r\n189 238 156\r\n65 106 41\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/steel_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n222 222 222\r\n213 213 213\r\n197 197 197\r\n189 189 189\r\n148 172 180\r\n115 164 172\r\n82 156 164\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n238 246 246\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/stick.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n123 189 8\r\n180 213 74\r\n74 148 0\r\n32 98 0\r\n197 213 180\r\n230 230 197\r\n180 180 139\r\n98 98 57\r\n255 255 246\r\n205 238 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/sun_stone.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n197 98 41\r\n255 172 115\r\n131 74 41\r\n230 115 57\r\n255 238 205\r\n246 131 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/super_potion.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n222 131 131\r\n255 222 131\r\n255 255 238\r\n230 189 106\r\n197 98 90\r\n180 139 65\r\n255 246 180\r\n255 172 148\r\n148 106 49\r\n148 82 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/super_repel.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n213 230 230\r\n180 197 197\r\n123 139 139\r\n0 0 0\r\n0 0 0\r\n213 189 189\r\n139 115 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n246 246 255\r\n148 148 172\r\n205 205 230\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/super_rod.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n205 197 197\r\n148 131 131\r\n82 82 139\r\n123 123 180\r\n90 82 82\r\n197 222 230\r\n156 180 189\r\n106 131 139\r\n205 90 57\r\n246 131 98\r\n255 255 255\r\n82 238 82\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/tamato_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 148 49\r\n205 74 49\r\n131 57 49\r\n230 115 49\r\n255 213 49\r\n0 0 0\r\n49 164 82\r\n115 222 82\r\n49 98 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/tea.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n180 172 156\r\n238 230 230\r\n131 115 106\r\n205 255 156\r\n246 230 222\r\n197 180 156\r\n131 255 32\r\n98 82 65\r\n205 189 172\r\n148 230 24\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/teachy_tv.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 164 123\r\n49 49 49\r\n98 106 98\r\n255 205 74\r\n74 74 57\r\n98 156 148\r\n115 205 189\r\n148 131 74\r\n205 164 74\r\n255 230 74\r\n213 205 172\r\n156 139 115\r\n222 180 74\r\n82 98 98\r\n115 115 115\r\n246 246 238\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/thick_club.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n230 238 205\r\n189 197 164\r\n156 156 131\r\n213 213 172\r\n131 131 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/thunder_stone.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 255 246\r\n139 213 139\r\n74 148 74\r\n213 238 123\r\n106 180 106\r\n41 115 41\r\n180 205 90\r\n172 246 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/tm_case.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n32 148 57\r\n49 49 49\r\n74 74 82\r\n123 148 131\r\n180 205 238\r\n246 230 41\r\n82 98 123\r\n230 189 41\r\n90 115 98\r\n82 148 197\r\n180 148 41\r\n0 0 0\r\n106 98 41\r\n205 230 246\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/town_map.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 222 106\r\n49 49 49\r\n148 98 41\r\n238 139 41\r\n57 90 139\r\n246 230 41\r\n90 82 74\r\n148 131 156\r\n205 222 238\r\n156 164 189\r\n197 180 41\r\n131 123 41\r\n238 246 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/tri_pass.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 164 123\r\n49 49 49\r\n57 98 189\r\n82 156 255\r\n57 148 65\r\n74 172 65\r\n41 172 106\r\n98 205 255\r\n106 222 255\r\n41 197 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/tropic_mail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n205 246 172\r\n172 238 139\r\n106 172 74\r\n246 172 131\r\n197 123 82\r\n238 222 139\r\n230 156 115\r\n90 131 74\r\n156 222 123\r\n230 246 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/twisted_spoon.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 255 255\r\n106 131 131\r\n230 246 246\r\n156 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/ultra_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 82 82\r\n123 123 131\r\n164 164 197\r\n222 205 246\r\n255 255 255\r\n57 74 90\r\n82 98 106\r\n115 131 148\r\n164 180 197\r\n213 172 16\r\n255 213 57\r\n255 246 90\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/up_grade.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n213 213 180\r\n131 131 106\r\n238 255 213\r\n98 98 74\r\n255 246 222\r\n172 172 148\r\n238 238 197\r\n230 189 189\r\n230 148 0\r\n238 238 213\r\n197 197 197\r\n131 131 131\r\n255 222 0\r\n164 213 164\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/vs_seeker.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 222 106\r\n49 49 49\r\n222 238 238\r\n180 197 197\r\n49 82 148\r\n255 255 255\r\n65 131 230\r\n115 205 255\r\n148 156 180\r\n74 90 106\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/wailmer_pail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n180 180 213\r\n139 139 197\r\n90 90 148\r\n246 246 238\r\n222 222 213\r\n189 189 180\r\n222 222 255\r\n131 131 123\r\n57 57 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/water_stone.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n98 82 205\r\n156 131 255\r\n197 197 255\r\n238 238 255\r\n222 222 255\r\n74 74 180\r\n106 106 222\r\n172 205 246\r\n148 180 222\r\n115 148 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/water_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n74 74 98\r\n205 230 246\r\n180 213 246\r\n164 205 246\r\n139 197 238\r\n115 180 238\r\n90 172 238\r\n74 164 238\r\n123 123 148\r\n123 123 123\r\n98 98 123\r\n255 255 255\r\n238 246 246\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/watmel_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 197 172\r\n156 213 90\r\n90 148 57\r\n222 148 123\r\n246 172 148\r\n139 197 74\r\n115 172 49\r\n255 222 205\r\n180 238 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/wave_mail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n148 222 246\r\n98 131 230\r\n238 255 255\r\n255 246 230\r\n238 222 172\r\n123 156 246\r\n65 98 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/wepear_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n148 222 74\r\n115 197 74\r\n90 164 74\r\n74 98 74\r\n180 246 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/white_flute.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n230 230 230\r\n164 164 164\r\n230 230 230\r\n197 197 197\r\n222 98 222\r\n222 139 222\r\n238 189 238\r\n180 98 180\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/white_herb.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n230 213 230\r\n213 189 213\r\n246 230 246\r\n255 238 255\r\n238 222 238\r\n148 123 148\r\n197 172 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/wiki_berry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n148 115 230\r\n98 90 172\r\n205 164 255\r\n57 65 123\r\n131 90 205\r\n90 213 82\r\n65 156 65\r\n74 98 65\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/wood_mail.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n222 205 148\r\n213 148 106\r\n172 131 74\r\n255 246 222\r\n148 106 49\r\n230 205 197\r\n189 123 82\r\n238 172 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/x_accuracy.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n205 115 189\r\n164 82 148\r\n238 180 222\r\n255 255 255\r\n156 148 156\r\n230 213 230\r\n115 49 98\r\n255 230 246\r\n172 98 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/x_attack.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n230 131 123\r\n164 74 74\r\n238 156 172\r\n255 255 255\r\n156 148 148\r\n230 213 213\r\n131 49 49\r\n255 230 222\r\n197 98 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/x_defend.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n123 131 230\r\n74 74 164\r\n172 156 238\r\n255 255 255\r\n148 148 156\r\n213 213 230\r\n57 57 139\r\n222 230 255\r\n115 98 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/x_special.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n205 205 106\r\n156 156 74\r\n230 230 172\r\n255 255 255\r\n156 156 148\r\n230 230 213\r\n106 106 32\r\n255 255 222\r\n164 164 90\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/x_speed.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n106 205 205\r\n74 156 156\r\n172 230 230\r\n255 255 255\r\n148 156 156\r\n213 230 230\r\n32 106 106\r\n222 255 255\r\n90 164 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/yellow_flute.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 255 255\r\n230 230 115\r\n139 139 74\r\n238 238 172\r\n205 205 90\r\n74 205 65\r\n115 205 106\r\n164 222 148\r\n74 172 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/yellow_scarf.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n197 197 74\r\n238 238 115\r\n148 148 41\r\n213 213 82\r\n255 255 139\r\n230 230 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/yellow_shard.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n255 230 90\r\n197 172 65\r\n90 65 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/items/icon_palettes/zinc.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 180 180\r\n49 49 49\r\n246 255 246\r\n148 90 57\r\n189 131 49\r\n238 205 106\r\n123 106 0\r\n189 148 41\r\n255 197 115\r\n197 222 197\r\n230 246 230\r\n172 197 172\r\n131 222 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/mail/bead/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 164 189\r\n65 90 123\r\n98 123 156\r\n213 230 238\r\n238 255 255\r\n139 189 164\r\n255 148 131\r\n213 106 90\r\n164 156 189\r\n255 197 82\r\n98 197 197\r\n57 148 148\r\n82 82 82\r\n139 139 139\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/mail/dream/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 164 189\r\n255 189 205\r\n222 164 197\r\n197 148 189\r\n172 131 189\r\n255 213 230\r\n0 0 0\r\n205 255 213\r\n230 255 230\r\n0 0 0\r\n98 197 197\r\n57 148 148\r\n82 82 82\r\n139 139 139\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/mail/fab/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 164 189\r\n238 205 222\r\n255 230 238\r\n213 230 238\r\n238 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n98 197 197\r\n57 148 148\r\n82 82 82\r\n139 139 139\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/mail/glitter/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 164 189\r\n255 255 172\r\n255 238 123\r\n255 238 0\r\n255 41 41\r\n255 238 230\r\n255 189 41\r\n238 180 0\r\n0 0 0\r\n0 0 0\r\n98 197 197\r\n57 148 148\r\n82 82 82\r\n139 139 139\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/mail/harbor/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 164 189\r\n24 172 255\r\n255 255 148\r\n115 205 255\r\n74 172 255\r\n16 57 230\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n98 197 197\r\n57 148 148\r\n82 82 82\r\n139 139 139\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/mail/mech/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 164 189\r\n230 230 230\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n230 230 189\r\n197 189 139\r\n172 164 115\r\n98 197 197\r\n57 148 148\r\n82 82 82\r\n139 139 139\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/mail/orange/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 164 189\r\n246 213 148\r\n238 180 74\r\n205 139 65\r\n189 246 222\r\n148 222 197\r\n131 189 164\r\n255 255 148\r\n189 180 123\r\n139 123 65\r\n98 197 197\r\n57 148 148\r\n82 82 82\r\n139 139 139\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/mail/retro/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 164 189\r\n246 106 41\r\n255 246 156\r\n255 205 65\r\n148 238 82\r\n172 106 49\r\n189 164 57\r\n123 213 246\r\n0 0 0\r\n255 230 90\r\n98 197 197\r\n57 148 148\r\n82 82 82\r\n139 139 139\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/mail/shadow/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 164 189\r\n139 139 164\r\n123 123 139\r\n106 106 123\r\n90 90 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n213 65 16\r\n148 49 0\r\n98 197 197\r\n57 148 148\r\n82 82 82\r\n139 139 139\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/mail/tropic/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 164 189\r\n230 255 98\r\n197 246 131\r\n189 246 65\r\n123 213 41\r\n255 180 98\r\n255 255 148\r\n123 180 24\r\n197 238 65\r\n205 156 90\r\n98 197 197\r\n57 148 148\r\n82 82 82\r\n139 139 139\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/mail/wave/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 164 189\r\n0 172 246\r\n65 90 156\r\n106 131 197\r\n197 222 255\r\n82 156 197\r\n230 246 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n98 197 197\r\n57 148 148\r\n82 82 82\r\n139 139 139\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/mail/wood/palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 164 189\r\n139 131 74\r\n164 180 82\r\n189 180 106\r\n222 205 106\r\n180 156 65\r\n246 213 156\r\n189 164 90\r\n222 164 123\r\n255 205 180\r\n98 197 197\r\n57 148 148\r\n82 82 82\r\n139 139 139\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/main_menu/bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 148 255\r\n255 255 255\r\n49 57 82\r\n90 98 115\r\n8 8 16\r\n148 156 172\r\n205 222 238\r\n180 180 189\r\n189 205 222\r\n32 32 49\r\n123 131 139\r\n49 82 123\r\n41 123 197\r\n57 139 213\r\n90 164 230\r\n139 197 246\r\n"
  },
  {
    "path": "graphics/main_menu/textbox.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/misc/option_menu.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n255 255 255\r\n99 99 99\r\n214 214 206\r\n230 8 8\r\n255 189 115\r\n33 156 8\r\n148 247 148\r\n49 82 206\r\n165 197 247\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/naming_screen/buttons.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 156 213\r\n255 255 255\r\n57 57 57\r\n139 139 131\r\n197 189 180\r\n230 222 213\r\n74 115 139\r\n123 172 197\r\n172 115 74\r\n213 156 115\r\n98 156 57\r\n148 189 106\r\n189 164 32\r\n230 222 90\r\n57 57 57\r\n57 57 57\r\n"
  },
  {
    "path": "graphics/naming_screen/cursor.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 156 213\r\n255 8 8\r\n222 57 74\r\n180 65 82\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n230 222 213\r\n0 0 0\r\n230 222 213\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/naming_screen/keyboard.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n123 172 197\r\n213 156 115\r\n148 189 106\r\n"
  },
  {
    "path": "graphics/naming_screen/menu.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 156 213\r\n255 255 255\r\n115 115 115\r\n139 139 131\r\n172 172 164\r\n197 189 180\r\n230 222 213\r\n197 230 156\r\n213 238 189\r\n230 246 222\r\n0 0 0\r\n0 0 0\r\n213 205 82\r\n230 222 90\r\n238 230 139\r\n246 238 197\r\n"
  },
  {
    "path": "graphics/naming_screen/page_swap_lower.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 156 213\r\n255 255 255\r\n57 57 57\r\n115 115 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n172 115 74\r\n189 131 90\r\n213 156 115\r\n246 205 164\r\n255 230 197\r\n"
  },
  {
    "path": "graphics/naming_screen/page_swap_others.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 156 213\r\n255 255 255\r\n57 57 57\r\n115 115 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n98 156 57\r\n123 172 82\r\n148 189 106\r\n197 230 156\r\n213 238 189\r\n"
  },
  {
    "path": "graphics/naming_screen/page_swap_upper.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 156 213\r\n255 255 255\r\n57 57 57\r\n115 115 115\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n0 0 255\r\n74 115 139\r\n98 139 164\r\n123 172 197\r\n156 205 230\r\n180 222 246\r\n"
  },
  {
    "path": "graphics/naming_screen/rival.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 213 180\r\n255 197 148\r\n222 148 115\r\n123 65 65\r\n213 172 65\r\n156 106 32\r\n106 74 32\r\n115 189 0\r\n65 123 0\r\n32 65 16\r\n213 115 164\r\n164 65 115\r\n82 32 65\r\n230 230 49\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/oak_speech/leaf/pal.pal",
    "content": "JASC-PAL\r\n0100\r\n32\r\n115 197 164\r\n255 238 205\r\n246 205 180\r\n213 164 148\r\n172 131 106\r\n106 74 65\r\n205 164 139\r\n164 123 98\r\n115 74 49\r\n74 41 16\r\n222 222 222\r\n180 180 180\r\n131 131 131\r\n82 82 90\r\n41 41 49\r\n255 255 255\r\n0 0 0\r\n131 189 213\r\n106 156 180\r\n82 131 156\r\n49 90 115\r\n32 65 90\r\n0 0 255\r\n255 255 189\r\n222 222 82\r\n172 172 57\r\n98 98 0\r\n213 131 123\r\n189 106 98\r\n164 82 74\r\n139 57 49\r\n98 24 16\r\n"
  },
  {
    "path": "graphics/oak_speech/oak/pal.pal",
    "content": "JASC-PAL\r\n0100\r\n32\r\n115 197 164\r\n255 230 205\r\n222 189 156\r\n197 148 115\r\n106 74 65\r\n238 222 148\r\n205 189 115\r\n172 156 90\r\n139 123 65\r\n98 90 49\r\n255 0 255\r\n205 205 222\r\n123 131 156\r\n57 74 106\r\n255 255 255\r\n0 0 0\r\n0 0 255\r\n172 148 222\r\n131 115 172\r\n82 65 115\r\n230 222 180\r\n205 197 156\r\n180 172 139\r\n164 156 123\r\n123 115 90\r\n82 57 49\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/oak_speech/pikachu_intro/pikachu.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 180\r\n255 255 255\r\n255 246 106\r\n246 213 0\r\n238 172 0\r\n197 139 0\r\n131 82 0\r\n255 0 255\r\n255 0 255\r\n180 180 180\r\n255 74 74\r\n230 0 0\r\n180 0 0\r\n106 106 106\r\n16 16 16\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/oak_speech/platform.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 189 164\r\n65 139 131\r\n82 148 139\r\n106 164 156\r\n131 180 172\r\n156 197 189\r\n180 213 205\r\n205 230 222\r\n230 246 238\r\n0 0 0\r\n255 0 255\r\n139 189 164\r\n156 205 172\r\n180 222 197\r\n205 238 222\r\n115 172 156\r\n"
  },
  {
    "path": "graphics/oak_speech/red/pal.pal",
    "content": "JASC-PAL\r\n0100\r\n32\r\n115 197 164\r\n255 230 205\r\n222 189 156\r\n197 148 131\r\n148 106 90\r\n106 74 65\r\n205 164 139\r\n164 123 98\r\n115 74 49\r\n82 65 32\r\n222 222 222\r\n180 180 180\r\n131 131 131\r\n82 82 90\r\n57 57 65\r\n255 255 255\r\n0 0 0\r\n131 189 213\r\n106 156 180\r\n82 131 156\r\n49 90 115\r\n32 65 90\r\n0 0 255\r\n238 238 74\r\n205 205 49\r\n164 164 32\r\n98 98 0\r\n213 131 123\r\n189 106 98\r\n164 82 74\r\n139 57 49\r\n98 24 16\r\n"
  },
  {
    "path": "graphics/oak_speech/rival/pal.pal",
    "content": "JASC-PAL\r\n0100\r\n32\r\n115 197 164\r\n255 230 205\r\n222 189 156\r\n197 148 115\r\n106 74 65\r\n238 189 74\r\n213 156 57\r\n189 123 41\r\n139 82 41\r\n164 123 106\r\n222 222 222\r\n197 197 197\r\n139 139 139\r\n98 98 98\r\n65 65 65\r\n255 255 255\r\n0 0 0\r\n180 148 180\r\n139 106 139\r\n106 74 106\r\n82 49 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n246 131 131\r\n205 82 82\r\n"
  },
  {
    "path": "graphics/object_events/palettes/22.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 213 180\r\n255 197 148\r\n222 148 115\r\n123 65 65\r\n57 74 123\r\n41 57 98\r\n24 41 82\r\n16 32 57\r\n222 230 238\r\n115 205 115\r\n74 148 82\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/23.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 164 148\r\n205 131 115\r\n123 90 82\r\n98 98 115\r\n41 57 65\r\n164 106 82\r\n74 49 57\r\n205 205 222\r\n106 213 65\r\n65 172 32\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/839C588.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n98 98 98\r\n213 213 139\r\n172 172 90\r\n139 139 65\r\n230 246 205\r\n189 238 180\r\n131 222 180\r\n98 172 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/839D3A8.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 172 74\r\n255 255 255\r\n205 246 255\r\n156 213 255\r\n74 197 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/object_events/palettes/black_sand_footprints.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 238\r\n246 230 197\r\n238 213 180\r\n222 180 148\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n98 156 180\r\n0 0 0\r\n0 0 0\r\n238 230 164\r\n222 213 139\r\n120 112 112\r\n104 96 104\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/bridge_reflection.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n74 115 172\r\n"
  },
  {
    "path": "graphics/object_events/palettes/cable_car.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n164 222 222\r\n98 139 139\r\n139 180 180\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n139 205 246\r\n98 172 238\r\n255 255 148\r\n238 213 82\r\n213 172 16\r\n180 106 0\r\n139 65 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/lady.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 213 180\r\n246 189 148\r\n222 148 115\r\n123 65 65\r\n222 131 57\r\n189 106 41\r\n123 65 24\r\n148 197 238\r\n98 131 205\r\n57 98 156\r\n197 197 213\r\n139 139 148\r\n74 74 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/meteorite.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 156 197\r\n32 32 32\r\n82 82 82\r\n139 139 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/npc_blue.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 213 180\r\n246 189 148\r\n222 148 115\r\n123 65 65\r\n255 222 74\r\n213 172 32\r\n131 98 0\r\n164 139 238\r\n106 82 189\r\n65 57 98\r\n238 115 65\r\n172 65 57\r\n74 49 49\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/npc_blue_reflection.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 172 238\r\n255 255 255\r\n255 255 230\r\n255 230 197\r\n205 148 148\r\n255 255 139\r\n246 230 65\r\n238 197 32\r\n197 222 238\r\n156 180 230\r\n131 148 205\r\n255 197 139\r\n246 156 106\r\n205 115 90\r\n255 255 255\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/object_events/palettes/npc_green.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 213 180\r\n246 189 148\r\n222 148 115\r\n123 65 65\r\n222 189 65\r\n164 131 32\r\n82 82 32\r\n131 205 49\r\n57 139 0\r\n32 65 16\r\n222 148 189\r\n164 74 131\r\n82 32 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/npc_green_reflection.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 172 238\r\n255 255 255\r\n255 255 230\r\n255 230 197\r\n205 148 148\r\n238 222 98\r\n222 197 74\r\n197 172 65\r\n164 238 148\r\n131 205 123\r\n106 172 74\r\n246 156 213\r\n213 131 189\r\n189 115 148\r\n255 255 255\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/object_events/palettes/npc_pink.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 213 180\r\n246 189 148\r\n222 148 115\r\n123 65 65\r\n255 164 180\r\n213 106 123\r\n139 65 82\r\n148 197 238\r\n98 131 205\r\n57 57 74\r\n197 197 213\r\n139 139 148\r\n74 74 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/npc_pink_reflection.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 172 238\r\n255 255 255\r\n255 255 230\r\n255 230 197\r\n205 148 148\r\n255 222 238\r\n255 180 205\r\n238 164 172\r\n205 255 255\r\n180 230 255\r\n123 164 213\r\n222 222 230\r\n180 180 180\r\n139 139 148\r\n255 255 255\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/object_events/palettes/npc_white.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 213 180\r\n246 189 148\r\n222 148 115\r\n123 65 65\r\n205 172 98\r\n123 115 65\r\n57 57 24\r\n230 106 74\r\n148 57 41\r\n82 16 0\r\n197 197 213\r\n139 139 148\r\n74 74 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/npc_white_reflection.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 172 238\r\n255 255 255\r\n255 255 230\r\n255 230 197\r\n205 148 148\r\n230 205 131\r\n205 180 106\r\n164 139 65\r\n255 197 139\r\n246 156 106\r\n205 115 90\r\n222 222 230\r\n180 180 180\r\n139 139 148\r\n255 255 255\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/object_events/palettes/player.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 123 164\r\n172 123 65\r\n255 197 148\r\n222 148 115\r\n123 65 65\r\n65 65 213\r\n57 57 123\r\n115 164 197\r\n106 41 41\r\n238 238 255\r\n180 180 213\r\n255 106 74\r\n197 57 57\r\n255 222 90\r\n189 156 57\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/player_reflection.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 255 246\r\n238 189 180\r\n255 255 230\r\n255 230 197\r\n205 148 148\r\n123 164 238\r\n115 131 197\r\n172 213 255\r\n172 123 98\r\n255 255 255\r\n222 222 255\r\n255 230 172\r\n255 172 172\r\n255 255 172\r\n230 205 115\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/object_events/palettes/player_unused.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n172 123 65\r\n255 197 148\r\n222 148 115\r\n123 65 65\r\n65 65 213\r\n57 57 123\r\n115 164 197\r\n106 41 41\r\n238 238 255\r\n180 180 213\r\n255 106 74\r\n197 57 57\r\n255 222 90\r\n189 156 57\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/rs_quinty_plump.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n41 41 32\r\n41 41 41\r\n90 90 82\r\n139 139 115\r\n180 180 164\r\n213 156 16\r\n238 197 16\r\n255 222 98\r\n0 90 197\r\n0 131 238\r\n156 180 205\r\n213 230 238\r\n255 255 255\r\n0 139 0\r\n0 205 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/rs_quinty_plump_reflection.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n139 139 131\r\n139 139 139\r\n189 189 180\r\n238 238 213\r\n255 255 255\r\n255 255 115\r\n255 255 115\r\n255 255 197\r\n98 189 255\r\n98 230 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n98 238 98\r\n98 255 98\r\n"
  },
  {
    "path": "graphics/object_events/palettes/seagallop.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n65 123 180\r\n238 246 255\r\n222 230 238\r\n189 205 230\r\n156 164 189\r\n139 139 156\r\n98 98 123\r\n57 57 106\r\n197 98 98\r\n172 65 106\r\n32 74 156\r\n197 148 0\r\n246 213 24\r\n222 238 255\r\n255 255 255\r\n74 106 139\r\n"
  },
  {
    "path": "graphics/object_events/palettes/snow_footprints.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 0 238\r\n246 230 197\r\n238 213 180\r\n222 180 148\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n98 156 180\r\n0 0 0\r\n0 0 0\r\n238 230 164\r\n222 213 139\r\n192 216 224\r\n186 207 235\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/ss_anne.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n57 115 180\r\n49 131 197\r\n65 65 82\r\n139 106 57\r\n32 82 139\r\n189 90 32\r\n222 156 49\r\n246 205 74\r\n172 148 90\r\n82 82 106\r\n213 213 238\r\n106 106 139\r\n131 139 172\r\n205 180 123\r\n255 255 255\r\n16 16 24\r\n"
  },
  {
    "path": "graphics/object_events/palettes/three_island_grass.pal",
    "content": "JASC-PAL\r\n0100\r\n32\r\n255 0 238\r\n189 255 139\r\n131 213 98\r\n160 160 48\r\n112 104 48\r\n49 65 0\r\n98 172 238\r\n98 172 197\r\n139 205 246\r\n148 230 255\r\n148 131 98\r\n180 172 148\r\n248 248 144\r\n216 208 96\r\n216 208 96\r\n160 160 48\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/object_events/palettes/underwater_sprites.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 164 148\r\n205 131 115\r\n123 90 82\r\n98 123 156\r\n74 90 131\r\n49 65 106\r\n24 41 82\r\n131 164 197\r\n255 197 90\r\n189 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokedex/area_markers/marker.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 197 115\r\n255 139 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokedex/kanto_dex_bgpals.pal",
    "content": "JASC-PAL\r\n0100\r\n256\r\n156 156 189\r\n0 0 0\r\n197 180 139\r\n230 222 197\r\n246 246 238\r\n255 255 255\r\n123 98 57\r\n164 148 98\r\n213 197 164\r\n255 246 238\r\n238 238 230\r\n213 213 213\r\n156 156 156\r\n255 255 0\r\n205 65 57\r\n255 139 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n156 156 189\r\n0 0 0\r\n197 180 139\r\n230 222 197\r\n246 246 238\r\n255 255 255\r\n123 98 57\r\n164 148 98\r\n213 197 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 0\r\n205 65 57\r\n255 139 57\r\n156 156 189\r\n0 0 0\r\n197 180 139\r\n230 222 197\r\n246 246 238\r\n255 255 255\r\n123 98 57\r\n164 148 98\r\n213 197 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 0\r\n205 65 57\r\n255 139 57\r\n156 156 189\r\n0 0 0\r\n197 180 139\r\n230 222 197\r\n246 246 238\r\n255 255 255\r\n123 98 57\r\n164 148 98\r\n213 197 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 0\r\n205 65 57\r\n255 139 57\r\n156 156 189\r\n0 0 0\r\n197 180 139\r\n230 222 197\r\n246 246 238\r\n255 255 255\r\n123 98 57\r\n164 148 98\r\n213 197 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 0\r\n205 65 57\r\n255 139 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n156 156 189\r\n0 0 0\r\n197 180 139\r\n230 222 197\r\n246 246 238\r\n255 255 255\r\n123 98 57\r\n164 148 98\r\n213 197 164\r\n255 246 238\r\n238 238 230\r\n213 213 213\r\n156 156 156\r\n255 255 0\r\n205 65 57\r\n255 139 57\r\n255 255 255\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n197 180 139\r\n"
  },
  {
    "path": "graphics/pokedex/national_dex_bgpals.pal",
    "content": "JASC-PAL\r\n0100\r\n256\r\n156 156 189\r\n0 0 0\r\n197 180 139\r\n230 222 197\r\n238 246 246\r\n255 255 255\r\n123 98 57\r\n164 148 98\r\n213 197 164\r\n255 246 238\r\n238 238 230\r\n213 213 213\r\n156 156 156\r\n255 255 0\r\n205 65 57\r\n255 139 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n156 156 189\r\n0 0 0\r\n197 180 139\r\n230 222 197\r\n238 246 246\r\n255 255 255\r\n123 98 57\r\n164 148 98\r\n213 197 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 0\r\n205 65 57\r\n255 139 57\r\n156 156 189\r\n0 0 0\r\n197 180 139\r\n230 222 197\r\n238 246 246\r\n255 255 255\r\n123 98 57\r\n164 148 98\r\n213 197 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 0\r\n205 65 57\r\n255 139 57\r\n156 156 189\r\n0 0 0\r\n197 180 139\r\n230 222 197\r\n238 246 246\r\n255 255 255\r\n123 98 57\r\n164 148 98\r\n213 197 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 0\r\n205 65 57\r\n255 139 57\r\n156 156 189\r\n0 0 0\r\n197 180 139\r\n230 222 197\r\n238 246 246\r\n255 255 255\r\n123 98 57\r\n164 148 98\r\n213 197 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 0\r\n205 65 57\r\n255 139 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n156 156 189\r\n0 0 0\r\n197 180 139\r\n230 222 197\r\n238 246 246\r\n255 255 255\r\n123 98 57\r\n164 148 98\r\n213 197 164\r\n255 246 238\r\n238 238 230\r\n213 213 213\r\n156 156 156\r\n255 255 0\r\n205 65 57\r\n255 139 57\r\n255 255 255\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 197 24\r\n"
  },
  {
    "path": "graphics/pokedex/silhouette_sprite_pal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/pokemon/abra/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n246 246 246\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n213 180 82\r\n172 131 41\r\n148 106 16\r\n98 49 0\r\n255 0 255\r\n255 0 255\r\n246 246 164\r\n255 238 41\r\n222 205 32\r\n131 90 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/abra/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 148\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n230 139 164\r\n205 115 148\r\n131 82 98\r\n98 65 82\r\n255 0 255\r\n255 0 255\r\n255 246 115\r\n255 222 90\r\n238 180 49\r\n115 74 49\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/absol/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 156 180\r\n255 255 255\r\n222 222 238\r\n197 197 213\r\n148 148 172\r\n255 123 115\r\n205 41 32\r\n123 41 49\r\n172 172 205\r\n131 131 172\r\n90 90 131\r\n41 57 57\r\n148 164 164\r\n115 131 131\r\n82 98 98\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/absol/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 156 180\r\n255 255 255\r\n238 222 230\r\n222 189 213\r\n197 156 189\r\n49 180 255\r\n0 115 189\r\n123 41 49\r\n172 172 205\r\n131 131 172\r\n90 90 131\r\n41 57 57\r\n205 115 98\r\n172 82 65\r\n131 41 24\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/aerodactyl/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 213 180\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 131 197\r\n148 98 180\r\n98 74 148\r\n74 49 98\r\n222 98 98\r\n139 49 49\r\n16 16 16\r\n230 222 238\r\n205 205 222\r\n148 172 180\r\n74 98 82\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/aerodactyl/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n98 148 255\r\n65 115 230\r\n16 82 180\r\n24 24 106\r\n222 98 98\r\n139 49 49\r\n16 16 16\r\n246 197 238\r\n230 164 222\r\n180 123 180\r\n123 57 131\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/aggron/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 172 156\r\n74 74 65\r\n106 106 106\r\n139 139 139\r\n172 172 172\r\n57 57 65\r\n123 106 106\r\n156 139 139\r\n189 172 172\r\n222 205 205\r\n255 255 255\r\n172 57 74\r\n222 106 106\r\n255 131 131\r\n106 189 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/aggron/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 172 156\r\n32 90 90\r\n65 123 115\r\n90 156 148\r\n148 197 205\r\n74 41 24\r\n123 123 90\r\n156 156 123\r\n189 189 156\r\n222 222 197\r\n255 255 255\r\n172 57 74\r\n222 106 106\r\n255 131 131\r\n255 123 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/aipom/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n213 131 255\r\n180 98 230\r\n139 57 180\r\n82 32 106\r\n255 246 197\r\n255 238 164\r\n238 197 90\r\n197 156 82\r\n139 106 65\r\n255 0 255\r\n213 213 213\r\n123 123 123\r\n90 90 90\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/aipom/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 131 164\r\n230 98 139\r\n189 57 106\r\n115 32 65\r\n255 238 230\r\n255 222 213\r\n238 189 180\r\n222 123 131\r\n189 82 90\r\n255 0 255\r\n213 213 213\r\n123 123 123\r\n90 90 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/alakazam/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n222 222 222\r\n180 180 180\r\n90 90 90\r\n213 180 82\r\n180 131 41\r\n131 90 8\r\n82 49 8\r\n255 0 255\r\n255 0 255\r\n255 246 172\r\n255 238 41\r\n222 197 24\r\n123 106 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/alakazam/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n222 222 222\r\n180 180 180\r\n90 90 90\r\n230 123 189\r\n189 82 148\r\n131 41 106\r\n82 0 41\r\n255 0 255\r\n255 0 255\r\n255 205 74\r\n213 172 0\r\n172 115 0\r\n123 32 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/altaria/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 139\r\n255 255 255\r\n131 131 148\r\n197 197 213\r\n255 164 131\r\n255 98 65\r\n131 32 8\r\n172 213 255\r\n115 180 238\r\n98 139 197\r\n65 106 156\r\n238 246 255\r\n222 222 238\r\n172 180 197\r\n41 57 90\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/altaria/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 139\r\n255 255 255\r\n131 131 148\r\n197 197 213\r\n255 164 131\r\n255 98 65\r\n131 32 8\r\n255 238 131\r\n255 205 98\r\n222 172 65\r\n156 106 0\r\n238 246 255\r\n222 222 238\r\n172 180 197\r\n123 74 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/ampharos/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 238 74\r\n255 197 16\r\n213 148 0\r\n148 74 0\r\n255 0 255\r\n230 230 230\r\n172 172 172\r\n98 106 106\r\n16 16 16\r\n255 98 0\r\n197 65 0\r\n139 32 0\r\n90 0 0\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/ampharos/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n246 180 213\r\n213 148 180\r\n189 115 156\r\n139 82 106\r\n255 0 255\r\n230 230 230\r\n172 172 172\r\n98 106 106\r\n16 16 16\r\n131 205 246\r\n65 106 205\r\n32 65 156\r\n49 74 139\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/anorith/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n172 205 172\r\n139 172 139\r\n115 139 115\r\n90 115 90\r\n246 238 197\r\n230 205 148\r\n197 164 98\r\n148 82 74\r\n255 123 82\r\n222 82 32\r\n222 222 222\r\n180 180 189\r\n106 106 123\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/anorith/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 213 172\r\n230 180 139\r\n197 148 106\r\n164 115 74\r\n246 238 197\r\n230 205 148\r\n197 164 98\r\n131 90 32\r\n255 82 74\r\n222 82 32\r\n222 222 222\r\n180 180 189\r\n106 106 123\r\n41 41 57\r\n"
  },
  {
    "path": "graphics/pokemon/arbok/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 230 16\r\n230 197 24\r\n222 156 65\r\n255 172 131\r\n230 106 65\r\n197 65 24\r\n156 32 65\r\n16 16 16\r\n222 164 197\r\n189 131 172\r\n148 90 131\r\n98 57 90\r\n255 0 255\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/arbok/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 74\r\n238 222 24\r\n189 172 16\r\n180 197 230\r\n148 164 197\r\n106 123 156\r\n49 65 98\r\n16 16 16\r\n222 180 65\r\n180 139 24\r\n139 98 24\r\n98 57 0\r\n255 0 255\r\n205 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/arcanine/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 246\r\n222 222 213\r\n131 106 98\r\n255 98 65\r\n197 49 32\r\n82 16 16\r\n255 255 197\r\n255 246 148\r\n238 197 115\r\n172 98 32\r\n255 156 106\r\n238 115 49\r\n197 82 74\r\n98 16 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/arcanine/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 246\r\n222 222 213\r\n90 90 90\r\n255 98 65\r\n197 49 32\r\n82 16 16\r\n255 246 238\r\n255 238 197\r\n230 197 156\r\n148 115 82\r\n255 230 115\r\n222 189 74\r\n180 148 32\r\n115 82 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ariados/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 172 57\r\n255 123 41\r\n205 82 0\r\n139 32 0\r\n74 0 0\r\n255 238 90\r\n222 180 74\r\n148 115 49\r\n189 148 255\r\n148 90 238\r\n106 49 172\r\n189 189 189\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ariados/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 139 189\r\n205 106 164\r\n139 65 123\r\n115 16 82\r\n82 8 49\r\n255 238 90\r\n222 180 74\r\n148 115 49\r\n148 213 255\r\n98 164 230\r\n32 82 180\r\n189 189 189\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/armaldo/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n189 189 222\r\n139 139 189\r\n115 115 172\r\n90 90 139\r\n246 238 197\r\n255 222 106\r\n222 180 98\r\n57 65 82\r\n255 98 74\r\n189 57 0\r\n222 222 222\r\n180 180 189\r\n106 106 123\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/armaldo/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n246 197 189\r\n213 164 156\r\n180 131 123\r\n148 98 90\r\n246 238 197\r\n255 222 106\r\n222 180 98\r\n115 65 57\r\n255 98 74\r\n189 57 0\r\n222 222 222\r\n222 98 82\r\n180 57 41\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/aron/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 172 156\r\n74 74 65\r\n106 106 106\r\n139 139 139\r\n172 172 172\r\n57 57 65\r\n123 106 106\r\n156 139 139\r\n189 172 172\r\n222 205 205\r\n255 255 255\r\n172 57 74\r\n222 106 106\r\n255 131 131\r\n106 189 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/aron/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 172 156\r\n32 90 90\r\n65 123 115\r\n90 156 148\r\n148 197 205\r\n74 41 24\r\n123 123 90\r\n156 156 123\r\n189 189 156\r\n222 222 197\r\n255 255 255\r\n172 57 74\r\n222 106 106\r\n255 131 131\r\n255 123 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/articuno/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n213 238 255\r\n197 205 255\r\n139 180 230\r\n98 148 205\r\n57 106 164\r\n74 74 106\r\n255 0 255\r\n255 0 255\r\n156 172 197\r\n123 139 164\r\n98 115 131\r\n189 41 57\r\n230 98 115\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/articuno/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n238 246 255\r\n205 230 255\r\n156 189 246\r\n98 148 213\r\n82 106 156\r\n255 0 255\r\n255 0 255\r\n139 164 213\r\n90 115 164\r\n74 74 106\r\n189 41 57\r\n230 98 115\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/azumarill/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n205 205 205\r\n156 156 156\r\n106 106 106\r\n16 16 16\r\n131 205 255\r\n90 172 230\r\n49 131 197\r\n74 74 131\r\n255 0 255\r\n255 0 255\r\n230 82 0\r\n197 41 0\r\n123 0 0\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/azumarill/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n205 205 205\r\n156 156 156\r\n106 106 106\r\n16 16 16\r\n255 238 82\r\n255 213 57\r\n213 172 24\r\n131 90 41\r\n255 0 255\r\n255 0 255\r\n238 74 65\r\n197 24 57\r\n123 0 0\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/azurill/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n49 65 90\r\n106 148 255\r\n74 115 255\r\n156 189 255\r\n123 123 148\r\n238 123 115\r\n189 74 65\r\n57 90 189\r\n222 98 90\r\n222 238 255\r\n90 131 246\r\n57 90 148\r\n255 255 255\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/azurill/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 189 255\r\n32 106 82\r\n148 230 148\r\n90 180 123\r\n205 255 172\r\n255 0 255\r\n222 98 49\r\n180 65 49\r\n65 156 98\r\n222 98 90\r\n222 238 255\r\n123 205 131\r\n255 0 255\r\n255 255 255\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/bagon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 98\r\n74 74 98\r\n123 115 148\r\n123 123 222\r\n172 172 255\r\n197 131 98\r\n255 148 98\r\n255 148 98\r\n131 148 148\r\n172 164 189\r\n222 213 238\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/bagon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 98\r\n16 98 32\r\n98 156 106\r\n98 197 98\r\n148 230 148\r\n197 131 98\r\n255 148 98\r\n255 148 98\r\n131 148 148\r\n172 164 189\r\n222 213 238\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/baltoy/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n98 82 82\r\n131 131 98\r\n255 255 255\r\n156 164 65\r\n197 197 98\r\n230 230 172\r\n222 65 98\r\n246 148 82\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 255 0\r\n"
  },
  {
    "path": "graphics/pokemon/baltoy/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n98 82 82\r\n131 131 98\r\n255 255 255\r\n205 180 57\r\n246 222 98\r\n230 230 172\r\n90 172 106\r\n115 189 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 255 0\r\n"
  },
  {
    "path": "graphics/pokemon/banette/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 230 213\r\n255 255 255\r\n255 255 49\r\n230 164 24\r\n255 189 49\r\n230 49 49\r\n222 123 49\r\n189 90 16\r\n131 65 41\r\n255 255 49\r\n255 255 49\r\n189 189 205\r\n148 148 172\r\n115 115 139\r\n74 74 98\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/banette/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 230 213\r\n255 255 255\r\n255 255 49\r\n230 164 24\r\n255 189 49\r\n230 49 49\r\n222 123 49\r\n189 90 16\r\n131 65 41\r\n255 255 49\r\n255 255 49\r\n189 205 238\r\n139 172 205\r\n90 148 172\r\n32 82 123\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/barboach/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 156 90\r\n57 65 82\r\n115 115 131\r\n164 164 172\r\n189 189 197\r\n213 213 222\r\n238 246 246\r\n0 0 0\r\n197 222 238\r\n255 189 41\r\n74 90 156\r\n90 106 180\r\n90 115 205\r\n139 164 222\r\n164 197 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/barboach/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 156 90\r\n57 65 82\r\n115 115 131\r\n164 164 172\r\n189 189 197\r\n213 213 222\r\n238 246 246\r\n0 0 0\r\n255 246 123\r\n255 189 41\r\n131 82 0\r\n164 115 0\r\n197 148 24\r\n230 180 57\r\n255 213 90\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/bayleef/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 255 172\r\n246 238 106\r\n222 189 41\r\n164 131 24\r\n106 82 0\r\n106 197 49\r\n74 164 16\r\n49 123 8\r\n16 82 16\r\n197 197 197\r\n98 98 98\r\n16 16 16\r\n213 139 82\r\n172 49 0\r\n"
  },
  {
    "path": "graphics/pokemon/bayleef/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 238 197\r\n255 213 180\r\n230 156 123\r\n189 98 65\r\n123 74 57\r\n230 189 49\r\n189 148 24\r\n123 98 8\r\n82 65 16\r\n197 197 197\r\n98 98 98\r\n16 16 16\r\n222 156 115\r\n172 57 57\r\n"
  },
  {
    "path": "graphics/pokemon/beautifly/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 246\r\n90 90 82\r\n139 139 123\r\n255 255 255\r\n172 172 106\r\n230 222 115\r\n255 255 49\r\n255 255 197\r\n156 156 115\r\n197 197 115\r\n238 238 180\r\n255 255 238\r\n0 0 0\r\n255 148 41\r\n156 131 255\r\n24 24 0\r\n"
  },
  {
    "path": "graphics/pokemon/beautifly/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 246\r\n90 24 65\r\n156 65 131\r\n255 255 255\r\n172 148 106\r\n246 238 148\r\n255 255 213\r\n255 255 197\r\n197 156 115\r\n230 197 115\r\n255 238 180\r\n255 255 238\r\n0 0 0\r\n255 148 41\r\n156 131 255\r\n24 24 0\r\n"
  },
  {
    "path": "graphics/pokemon/beedrill/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 246 164\r\n255 222 74\r\n222 180 57\r\n139 115 0\r\n238 230 255\r\n222 205 246\r\n189 172 197\r\n164 148 172\r\n255 148 106\r\n205 49 82\r\n156 0 8\r\n98 98 98\r\n24 24 24\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/beedrill/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n230 246 106\r\n189 205 65\r\n148 164 24\r\n74 90 0\r\n238 230 255\r\n222 205 246\r\n189 172 197\r\n164 148 172\r\n90 139 222\r\n49 98 180\r\n0 0 115\r\n98 98 98\r\n24 24 24\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/beldum/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n205 205 205\r\n172 172 172\r\n148 139 148\r\n115 106 115\r\n222 222 222\r\n131 74 74\r\n255 106 106\r\n213 74 82\r\n131 205 255\r\n255 255 255\r\n90 164 255\r\n74 131 213\r\n57 98 180\r\n49 57 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/beldum/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n238 172 82\r\n205 139 49\r\n172 106 16\r\n139 74 0\r\n255 205 115\r\n156 65 65\r\n255 106 106\r\n255 74 82\r\n238 238 246\r\n255 255 255\r\n213 213 222\r\n164 164 172\r\n115 106 115\r\n82 74 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/bellossom/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n156 213 74\r\n115 172 49\r\n82 98 41\r\n230 230 106\r\n180 180 57\r\n131 131 24\r\n82 197 49\r\n57 139 0\r\n16 90 16\r\n246 106 0\r\n213 32 0\r\n131 0 0\r\n164 164 164\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/bellossom/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 156 255\r\n189 123 230\r\n123 65 180\r\n213 246 90\r\n164 197 41\r\n98 139 8\r\n90 205 131\r\n49 148 98\r\n32 82 74\r\n255 131 172\r\n205 49 106\r\n148 24 82\r\n164 164 164\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/bellsprout/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n246 255 189\r\n82 98 41\r\n255 172 131\r\n238 115 65\r\n189 65 32\r\n255 238 115\r\n222 197 115\r\n197 148 41\r\n189 238 131\r\n156 213 74\r\n115 172 49\r\n205 156 41\r\n156 115 32\r\n106 65 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/bellsprout/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n82 98 41\r\n222 189 189\r\n180 148 148\r\n139 106 106\r\n255 246 98\r\n222 205 57\r\n180 164 16\r\n246 213 82\r\n205 172 41\r\n164 131 0\r\n205 156 41\r\n156 115 32\r\n106 65 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/blastoise/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 205 164\r\n255 255 255\r\n222 213 213\r\n148 164 164\r\n106 74 49\r\n172 49 57\r\n222 164 115\r\n255 213 106\r\n238 172 65\r\n189 139 57\r\n156 115 65\r\n156 197 238\r\n115 148 230\r\n74 131 148\r\n74 74 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/blastoise/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n213 205 205\r\n148 164 164\r\n32 65 32\r\n172 49 57\r\n180 172 65\r\n213 189 57\r\n238 205 74\r\n115 139 8\r\n65 90 8\r\n222 205 246\r\n213 180 255\r\n156 148 197\r\n57 57 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/blaziken/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n255 246 246\r\n205 180 180\r\n172 148 148\r\n148 115 123\r\n255 123 82\r\n222 98 49\r\n180 65 49\r\n74 41 65\r\n238 213 172\r\n205 180 156\r\n148 123 90\r\n255 230 156\r\n255 213 106\r\n230 172 90\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/blaziken/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n255 246 246\r\n205 180 180\r\n172 148 148\r\n148 115 123\r\n197 82 49\r\n131 49 32\r\n106 24 8\r\n74 0 0\r\n238 230 222\r\n222 213 205\r\n180 65 49\r\n255 255 255\r\n255 180 82\r\n222 123 49\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/blissey/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 222 222\r\n180 180 180\r\n106 106 106\r\n0 255 0\r\n255 213 222\r\n255 172 197\r\n238 123 156\r\n213 74 98\r\n189 32 49\r\n0 255 0\r\n0 255 0\r\n213 74 98\r\n172 16 32\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/blissey/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 238 255\r\n180 197 222\r\n90 106 131\r\n0 255 0\r\n255 238 246\r\n255 213 230\r\n246 172 197\r\n222 115 139\r\n180 74 82\r\n0 255 0\r\n238 123 156\r\n222 90 98\r\n172 49 65\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/breloom/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n238 238 238\r\n255 255 255\r\n255 238 156\r\n246 213 123\r\n213 172 106\r\n82 24 16\r\n98 74 57\r\n57 82 24\r\n164 131 82\r\n172 213 98\r\n148 189 74\r\n115 148 49\r\n238 123 74\r\n172 49 16\r\n0 0 0\r\n222 74 41\r\n"
  },
  {
    "path": "graphics/pokemon/breloom/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 148 139\r\n255 255 255\r\n255 238 180\r\n255 230 148\r\n230 189 106\r\n82 24 16\r\n98 74 57\r\n57 82 24\r\n189 148 82\r\n255 115 74\r\n222 98 49\r\n180 65 49\r\n255 222 139\r\n238 139 49\r\n0 0 0\r\n255 180 90\r\n"
  },
  {
    "path": "graphics/pokemon/bulbasaur/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n131 238 197\r\n98 213 164\r\n98 148 156\r\n41 90 98\r\n255 106 98\r\n222 74 65\r\n189 41 32\r\n205 205 205\r\n16 16 16\r\n189 255 115\r\n156 213 74\r\n123 172 65\r\n90 115 65\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/bulbasaur/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n205 255 41\r\n164 230 0\r\n106 172 0\r\n24 90 0\r\n255 106 98\r\n222 74 65\r\n189 41 32\r\n205 205 205\r\n16 16 16\r\n57 197 90\r\n16 156 49\r\n0 115 8\r\n0 57 0\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/butterfree/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n16 16 16\r\n255 0 255\r\n180 180 197\r\n123 123 156\r\n82 82 115\r\n65 65 90\r\n255 189 180\r\n255 123 82\r\n205 98 106\r\n148 32 16\r\n230 230 230\r\n197 197 197\r\n156 205 197\r\n90 180 139\r\n"
  },
  {
    "path": "graphics/pokemon/butterfree/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 246 213\r\n16 16 16\r\n255 0 255\r\n189 189 205\r\n123 123 156\r\n106 90 131\r\n98 65 98\r\n98 246 106\r\n82 222 106\r\n65 180 90\r\n41 98 82\r\n255 222 180\r\n246 180 156\r\n246 180 123\r\n213 131 123\r\n"
  },
  {
    "path": "graphics/pokemon/cacnea/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 172 98\r\n205 238 115\r\n172 205 98\r\n139 172 82\r\n106 139 65\r\n230 255 156\r\n123 205 106\r\n74 156 57\r\n65 115 41\r\n131 131 131\r\n49 82 41\r\n255 238 255\r\n255 213 74\r\n189 156 65\r\n255 238 148\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/cacnea/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 172 98\r\n238 189 90\r\n205 156 57\r\n172 123 24\r\n139 90 0\r\n255 222 123\r\n205 106 57\r\n172 74 24\r\n139 41 0\r\n131 131 131\r\n74 24 0\r\n255 238 255\r\n255 213 74\r\n189 156 65\r\n255 238 148\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/cacturne/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 172 98\r\n180 213 115\r\n156 189 98\r\n131 164 82\r\n106 139 65\r\n98 197 106\r\n82 172 98\r\n65 164 90\r\n49 131 74\r\n98 115 74\r\n57 82 41\r\n205 238 115\r\n255 230 74\r\n139 115 115\r\n82 82 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/cacturne/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 172 98\r\n238 189 90\r\n205 156 57\r\n172 123 24\r\n139 90 0\r\n205 106 57\r\n172 74 24\r\n139 41 0\r\n106 8 0\r\n106 57 0\r\n74 24 0\r\n255 222 123\r\n255 230 74\r\n139 115 115\r\n82 82 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/camerupt/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 106 156\r\n24 24 24\r\n82 49 24\r\n189 82 41\r\n230 106 24\r\n238 172 74\r\n74 74 139\r\n131 131 189\r\n189 180 189\r\n0 0 0\r\n189 123 106\r\n238 238 205\r\n213 213 131\r\n172 172 90\r\n74 74 32\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/camerupt/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 106 156\r\n41 41 24\r\n41 41 57\r\n57 65 82\r\n115 106 123\r\n148 139 156\r\n222 172 74\r\n255 246 115\r\n222 213 222\r\n0 0 0\r\n197 139 57\r\n255 255 255\r\n238 189 156\r\n197 148 115\r\n115 74 49\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/carvanha/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 131 213\r\n41 41 90\r\n172 197 255\r\n98 74 57\r\n49 74 156\r\n65 123 189\r\n98 164 222\r\n189 57 57\r\n246 57 57\r\n255 131 131\r\n205 148 41\r\n238 189 41\r\n255 205 82\r\n123 57 57\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/carvanha/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 131 213\r\n41 41 90\r\n172 197 255\r\n98 74 57\r\n123 156 24\r\n156 189 57\r\n189 222 90\r\n49 148 131\r\n82 180 164\r\n115 213 197\r\n205 148 41\r\n238 189 41\r\n255 205 82\r\n0 98 82\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/cascoon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 246 197\r\n106 98 115\r\n139 139 148\r\n172 172 180\r\n0 0 0\r\n172 156 189\r\n222 180 230\r\n238 213 230\r\n238 230 255\r\n115 0 0\r\n246 197 0\r\n189 49 0\r\n148 148 0\r\n246 255 197\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/cascoon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 246 197\r\n49 98 16\r\n82 148 24\r\n115 180 57\r\n0 0 0\r\n139 205 74\r\n172 230 98\r\n213 255 148\r\n238 255 172\r\n115 0 0\r\n246 197 0\r\n189 49 0\r\n148 148 0\r\n246 255 197\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/castform/normal/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 148\r\n90 82 82\r\n205 189 189\r\n230 222 222\r\n246 246 238\r\n0 0 0\r\n255 255 255\r\n222 222 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n148 148 148\r\n74 82 74\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/castform/normal/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 148\r\n98 90 90\r\n205 164 189\r\n230 197 222\r\n255 222 255\r\n0 0 0\r\n255 246 65\r\n230 180 32\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n148 148 148\r\n74 82 74\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/castform/rainy/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 148\r\n57 65 90\r\n98 115 189\r\n115 139 213\r\n148 180 205\r\n0 0 0\r\n205 238 246\r\n180 197 222\r\n139 205 222\r\n131 180 197\r\n82 98 131\r\n197 197 197\r\n148 139 148\r\n90 90 82\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/castform/rainy/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 148\r\n57 65 90\r\n98 115 189\r\n115 139 213\r\n148 180 205\r\n0 0 0\r\n205 238 246\r\n180 197 222\r\n139 205 222\r\n131 180 197\r\n82 98 131\r\n197 197 197\r\n148 139 148\r\n90 90 82\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/castform/snowy/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 148\r\n41 82 57\r\n123 82 189\r\n139 115 213\r\n148 180 205\r\n0 0 0\r\n197 180 255\r\n156 156 197\r\n139 205 172\r\n115 164 139\r\n98 74 115\r\n189 230 230\r\n82 115 106\r\n74 82 74\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/castform/snowy/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 148\r\n41 82 57\r\n123 82 189\r\n139 115 213\r\n148 180 205\r\n0 0 0\r\n197 180 255\r\n156 156 197\r\n139 205 172\r\n115 164 139\r\n98 74 115\r\n189 230 230\r\n82 115 106\r\n74 82 74\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/castform/sunny/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 148\r\n98 49 41\r\n205 90 74\r\n238 123 74\r\n255 156 65\r\n0 0 0\r\n255 246 106\r\n230 213 106\r\n255 156 98\r\n213 131 74\r\n148 90 65\r\n213 205 230\r\n0 0 0\r\n90 90 82\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/castform/sunny/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 148\r\n98 49 41\r\n205 90 74\r\n238 123 74\r\n255 156 65\r\n0 0 0\r\n255 246 106\r\n230 213 106\r\n255 156 98\r\n213 131 74\r\n148 90 65\r\n213 205 230\r\n0 0 0\r\n90 90 82\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/caterpie/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 222 255\r\n238 238 123\r\n213 205 98\r\n255 172 115\r\n238 123 49\r\n197 65 65\r\n123 98 57\r\n189 255 115\r\n156 213 74\r\n123 156 98\r\n82 98 41\r\n255 0 255\r\n115 115 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/caterpie/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n246 238 115\r\n230 238 123\r\n213 205 98\r\n255 172 115\r\n238 123 49\r\n197 98 98\r\n172 98 57\r\n255 255 123\r\n246 222 115\r\n222 180 57\r\n139 106 41\r\n255 0 255\r\n131 131 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/celebi/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 255 213\r\n197 238 164\r\n123 213 115\r\n65 189 65\r\n32 139 32\r\n255 255 255\r\n172 238 255\r\n115 189 230\r\n57 139 205\r\n0 98 180\r\n255 0 255\r\n180 180 189\r\n106 115 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/celebi/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 230\r\n255 238 230\r\n255 205 197\r\n238 164 156\r\n222 106 131\r\n172 57 65\r\n255 255 255\r\n189 222 238\r\n106 213 90\r\n74 180 65\r\n41 148 41\r\n222 32 222\r\n180 180 189\r\n106 115 131\r\n49 49 49\r\n"
  },
  {
    "path": "graphics/pokemon/chansey/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n246 238 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 172 172\r\n255 131 90\r\n230 82 49\r\n255 230 230\r\n255 213 213\r\n238 172 189\r\n246 115 115\r\n164 57 41\r\n"
  },
  {
    "path": "graphics/pokemon/chansey/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n246 238 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n180 238 106\r\n148 213 82\r\n106 189 49\r\n255 255 230\r\n255 238 205\r\n246 205 139\r\n230 172 98\r\n123 90 16\r\n"
  },
  {
    "path": "graphics/pokemon/charizard/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 213 156\r\n246 106 65\r\n222 197 131\r\n41 172 189\r\n32 123 148\r\n24 82 115\r\n255 230 156\r\n246 213 139\r\n246 189 32\r\n16 16 16\r\n255 197 98\r\n255 148 65\r\n213 106 82\r\n172 65 0\r\n213 213 213\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/charizard/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n230 98 49\r\n189 189 106\r\n230 98 106\r\n197 65 74\r\n156 32 41\r\n0 0 0\r\n222 213 131\r\n255 164 82\r\n16 16 16\r\n131 164 156\r\n98 131 131\r\n65 90 90\r\n32 57 57\r\n213 213 213\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/charmander/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n180 180 180\r\n255 255 255\r\n255 230 156\r\n255 213 106\r\n230 172 90\r\n246 98 0\r\n255 164 8\r\n255 197 98\r\n255 148 65\r\n222 74 74\r\n156 65 24\r\n24 74 49\r\n65 164 123\r\n148 205 222\r\n"
  },
  {
    "path": "graphics/pokemon/charmander/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n180 180 180\r\n255 255 255\r\n255 255 180\r\n255 230 148\r\n246 197 115\r\n213 82 8\r\n246 123 8\r\n255 246 90\r\n255 213 49\r\n222 164 8\r\n131 82 16\r\n24 74 49\r\n65 164 123\r\n148 205 222\r\n"
  },
  {
    "path": "graphics/pokemon/charmeleon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n131 131 131\r\n8 98 197\r\n255 230 156\r\n255 213 106\r\n230 172 90\r\n246 115 0\r\n255 164 24\r\n255 197 74\r\n255 172 115\r\n255 106 74\r\n213 74 74\r\n148 49 16\r\n197 205 205\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/charmeleon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n106 106 106\r\n8 98 197\r\n255 246 180\r\n246 230 139\r\n222 197 106\r\n222 74 49\r\n238 115 49\r\n255 172 57\r\n255 238 82\r\n255 213 74\r\n230 156 16\r\n148 82 24\r\n197 205 205\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/chikorita/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 255 131\r\n205 238 98\r\n156 197 8\r\n74 115 0\r\n98 172 74\r\n57 131 41\r\n0 90 0\r\n0 57 0\r\n205 205 205\r\n156 156 156\r\n98 98 98\r\n16 16 16\r\n213 131 82\r\n148 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/chikorita/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 255 148\r\n246 238 90\r\n205 197 57\r\n131 106 16\r\n246 189 106\r\n213 156 74\r\n164 98 24\r\n90 65 41\r\n205 205 205\r\n156 156 156\r\n156 131 74\r\n16 16 16\r\n222 156 115\r\n172 57 57\r\n"
  },
  {
    "path": "graphics/pokemon/chimecho/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n0 0 0\r\n255 123 148\r\n156 197 230\r\n197 230 255\r\n115 148 180\r\n255 255 255\r\n164 164 164\r\n255 230 148\r\n255 213 90\r\n65 74 106\r\n197 74 98\r\n123 41 65\r\n246 90 115\r\n246 189 90\r\n172 115 74\r\n"
  },
  {
    "path": "graphics/pokemon/chimecho/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n0 0 0\r\n255 189 90\r\n148 230 148\r\n205 255 172\r\n98 189 98\r\n255 255 255\r\n164 164 164\r\n255 230 148\r\n255 213 90\r\n49 123 74\r\n197 106 24\r\n148 74 0\r\n255 148 24\r\n246 189 90\r\n172 115 74\r\n"
  },
  {
    "path": "graphics/pokemon/chinchou/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n205 230 255\r\n164 205 255\r\n139 156 255\r\n98 123 213\r\n65 90 172\r\n0 57 115\r\n255 246 172\r\n255 222 123\r\n213 180 90\r\n180 139 57\r\n106 57 0\r\n139 98 24\r\n164 0 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/chinchou/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n148 238 255\r\n123 222 255\r\n82 180 255\r\n41 139 222\r\n8 90 180\r\n24 57 131\r\n213 255 115\r\n164 246 65\r\n123 205 74\r\n90 172 49\r\n57 139 24\r\n32 82 24\r\n148 57 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/clamperl/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 246 156\r\n255 255 255\r\n205 213 213\r\n139 164 148\r\n197 213 246\r\n139 189 205\r\n74 139 131\r\n41 65 131\r\n98 139 246\r\n49 90 205\r\n0 41 82\r\n123 189 255\r\n0 0 0\r\n255 123 213\r\n213 115 131\r\n115 74 90\r\n"
  },
  {
    "path": "graphics/pokemon/clamperl/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 246 156\r\n255 255 255\r\n205 213 213\r\n139 164 148\r\n197 213 246\r\n139 189 205\r\n74 139 131\r\n41 65 131\r\n197 65 180\r\n148 8 123\r\n0 41 82\r\n222 131 205\r\n0 0 0\r\n255 230 156\r\n230 172 90\r\n115 74 90\r\n"
  },
  {
    "path": "graphics/pokemon/claydol/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n82 82 41\r\n106 106 65\r\n148 156 123\r\n98 98 24\r\n156 148 189\r\n197 197 213\r\n255 255 255\r\n255 197 164\r\n246 123 90\r\n172 90 0\r\n255 213 115\r\n180 164 123\r\n255 255 255\r\n255 255 255\r\n106 255 106\r\n"
  },
  {
    "path": "graphics/pokemon/claydol/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n82 82 41\r\n106 106 65\r\n148 156 123\r\n98 98 24\r\n156 148 189\r\n197 197 213\r\n255 255 255\r\n246 238 90\r\n246 205 57\r\n197 156 16\r\n255 213 115\r\n180 164 123\r\n255 255 255\r\n255 255 255\r\n106 255 106\r\n"
  },
  {
    "path": "graphics/pokemon/clefable/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n197 197 197\r\n148 148 148\r\n255 172 172\r\n255 197 180\r\n238 148 148\r\n222 98 98\r\n156 90 90\r\n16 16 16\r\n255 106 41\r\n222 57 90\r\n123 106 98\r\n82 65 57\r\n74 65 65\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/clefable/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n197 197 197\r\n148 148 148\r\n255 213 189\r\n255 222 246\r\n246 189 180\r\n230 156 131\r\n172 106 98\r\n16 16 16\r\n255 106 41\r\n222 32 16\r\n123 222 90\r\n82 180 49\r\n41 139 8\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/clefairy/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n197 197 197\r\n131 131 131\r\n238 90 74\r\n180 57 41\r\n205 131 82\r\n172 98 49\r\n156 82 32\r\n115 41 8\r\n255 0 255\r\n255 197 164\r\n255 156 131\r\n230 131 123\r\n156 90 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/clefairy/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n197 197 197\r\n148 148 148\r\n238 90 74\r\n180 57 41\r\n123 222 90\r\n82 180 49\r\n41 139 8\r\n0 98 0\r\n255 0 255\r\n255 222 246\r\n246 189 180\r\n230 156 131\r\n172 106 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/cleffa/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 205 156\r\n255 164 131\r\n222 115 65\r\n197 74 0\r\n98 49 32\r\n213 164 41\r\n164 106 0\r\n123 74 0\r\n90 49 0\r\n255 0 255\r\n205 0 0\r\n156 0 0\r\n82 82 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/cleffa/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 222 222\r\n255 189 197\r\n238 123 148\r\n180 82 82\r\n32 98 0\r\n123 222 90\r\n82 180 49\r\n41 139 8\r\n0 98 0\r\n255 0 255\r\n205 0 0\r\n156 0 0\r\n82 82 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/cloyster/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 0 255\r\n213 172 230\r\n172 123 189\r\n98 123 115\r\n74 32 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n213 222 197\r\n180 189 156\r\n131 139 106\r\n74 82 65\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/cloyster/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 0 255\r\n115 164 213\r\n74 123 172\r\n32 82 131\r\n0 41 90\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n197 197 197\r\n148 148 148\r\n98 98 98\r\n65 65 65\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/combusken/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 222 156\r\n213 189 148\r\n180 148 123\r\n156 123 57\r\n255 213 98\r\n246 180 82\r\n197 148 57\r\n123 106 90\r\n139 57 49\r\n255 255 255\r\n255 164 57\r\n255 106 57\r\n213 90 57\r\n90 57 49\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/combusken/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 255 255\r\n222 180 131\r\n172 123 90\r\n123 90 74\r\n255 238 172\r\n255 213 98\r\n238 156 49\r\n123 106 90\r\n106 41 32\r\n255 255 255\r\n230 106 49\r\n197 74 49\r\n139 57 49\r\n90 57 49\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/corphish/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 123 16\r\n213 90 8\r\n172 82 8\r\n98 65 49\r\n246 238 197\r\n230 205 148\r\n205 172 106\r\n148 115 65\r\n255 213 90\r\n238 180 65\r\n255 197 65\r\n205 205 205\r\n131 131 131\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/corphish/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 148 148\r\n213 106 106\r\n180 74 74\r\n139 41 41\r\n255 255 238\r\n255 222 148\r\n255 189 90\r\n213 148 65\r\n255 213 90\r\n255 205 205\r\n255 197 197\r\n205 205 205\r\n131 131 131\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/corsola/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 222 222\r\n172 172 172\r\n131 131 139\r\n90 90 98\r\n255 213 222\r\n255 172 197\r\n230 106 139\r\n189 57 90\r\n139 16 16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 57 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/corsola/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n205 230 255\r\n164 189 222\r\n123 148 189\r\n74 98 156\r\n156 238 255\r\n123 205 255\r\n74 156 230\r\n41 106 197\r\n8 65 148\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n238 98 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/cradily/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n148 230 123\r\n115 180 106\r\n82 131 90\r\n57 90 74\r\n255 213 172\r\n255 172 115\r\n246 106 32\r\n255 246 123\r\n255 222 41\r\n230 172 0\r\n213 213 213\r\n172 172 180\r\n180 82 74\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/cradily/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 180 189\r\n222 123 156\r\n189 90 123\r\n139 65 65\r\n255 213 172\r\n255 172 115\r\n246 106 32\r\n255 246 156\r\n255 230 41\r\n230 172 0\r\n213 213 213\r\n172 172 180\r\n180 82 74\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/crawdaunt/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n230 106 0\r\n189 65 0\r\n139 57 32\r\n246 238 197\r\n230 205 148\r\n197 164 98\r\n148 115 65\r\n255 230 90\r\n246 172 49\r\n82 156 246\r\n65 115 172\r\n197 197 230\r\n24 65 106\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/crawdaunt/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 148 0\r\n205 106 0\r\n156 74 32\r\n238 238 238\r\n222 222 222\r\n180 189 180\r\n131 139 131\r\n255 238 139\r\n246 197 41\r\n222 156 238\r\n164 90 189\r\n222 156 238\r\n123 65 139\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/crobat/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n230 139 246\r\n197 90 205\r\n156 57 180\r\n115 24 148\r\n255 0 255\r\n255 0 255\r\n74 156 189\r\n32 106 148\r\n16 74 115\r\n255 213 0\r\n213 148 0\r\n164 164 164\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/crobat/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 213 238\r\n246 180 197\r\n222 131 148\r\n164 74 106\r\n255 0 255\r\n255 0 255\r\n139 189 32\r\n74 139 0\r\n41 82 0\r\n255 213 0\r\n213 148 0\r\n164 164 164\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/croconaw/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n131 205 255\r\n90 172 230\r\n49 131 197\r\n74 74 131\r\n230 65 32\r\n123 0 0\r\n255 172 90\r\n255 90 32\r\n205 41 24\r\n123 0 0\r\n255 230 98\r\n230 180 82\r\n156 115 8\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/croconaw/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n164 246 222\r\n115 213 205\r\n74 164 180\r\n49 106 139\r\n230 65 32\r\n123 0 0\r\n98 180 230\r\n57 98 197\r\n49 90 156\r\n32 65 106\r\n255 230 98\r\n230 180 82\r\n156 115 8\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/cubone/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 205 139\r\n222 189 106\r\n197 156 74\r\n148 106 49\r\n82 49 24\r\n238 238 238\r\n205 205 180\r\n139 139 106\r\n90 90 49\r\n246 230 205\r\n255 213 164\r\n230 180 139\r\n255 0 255\r\n255 0 255\r\n41 41 41\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/cubone/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n172 180 115\r\n131 131 74\r\n74 82 24\r\n49 57 0\r\n230 230 213\r\n197 197 172\r\n139 139 106\r\n90 90 49\r\n255 238 197\r\n238 213 148\r\n205 164 90\r\n255 0 255\r\n255 0 255\r\n41 41 41\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/cyndaquil/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n98 131 189\r\n65 82 139\r\n41 65 98\r\n24 41 82\r\n255 238 164\r\n230 205 106\r\n180 156 82\r\n139 98 32\r\n255 222 0\r\n255 156 0\r\n255 98 0\r\n238 0 0\r\n139 139 139\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/cyndaquil/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n230 156 106\r\n189 98 65\r\n139 65 57\r\n98 57 41\r\n255 230 115\r\n222 197 82\r\n172 139 49\r\n139 82 24\r\n255 222 0\r\n255 156 0\r\n255 98 0\r\n238 0 0\r\n139 139 139\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/delcatty/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 205 139\r\n255 255 255\r\n255 255 156\r\n255 222 98\r\n255 189 65\r\n222 156 65\r\n115 74 82\r\n246 180 197\r\n189 131 90\r\n106 74 156\r\n74 41 123\r\n0 0 0\r\n222 148 164\r\n197 123 139\r\n164 90 106\r\n131 57 74\r\n"
  },
  {
    "path": "graphics/pokemon/delcatty/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 205 139\r\n255 255 255\r\n255 255 189\r\n255 255 156\r\n255 222 98\r\n246 172 65\r\n139 82 65\r\n255 180 98\r\n205 123 57\r\n139 106 172\r\n98 65 156\r\n0 0 0\r\n255 123 82\r\n238 82 49\r\n189 65 32\r\n164 49 32\r\n"
  },
  {
    "path": "graphics/pokemon/delibird/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 189 106\r\n255 115 16\r\n213 65 0\r\n148 49 0\r\n255 0 255\r\n255 246 139\r\n255 205 65\r\n205 139 41\r\n123 65 0\r\n90 90 90\r\n213 213 213\r\n172 172 180\r\n131 131 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/delibird/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 131 197\r\n205 90 164\r\n148 65 115\r\n90 41 82\r\n255 0 255\r\n255 246 139\r\n255 205 65\r\n205 139 41\r\n123 65 0\r\n139 123 82\r\n238 238 197\r\n213 205 139\r\n148 139 90\r\n49 49 49\r\n"
  },
  {
    "path": "graphics/pokemon/deoxys/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 255\r\n115 74 49\r\n213 106 106\r\n255 131 74\r\n255 172 131\r\n115 213 172\r\n131 164 156\r\n57 98 90\r\n82 74 65\r\n156 156 131\r\n139 8 205\r\n222 106 230\r\n123 115 82\r\n197 197 213\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/deoxys/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 255\r\n106 90 24\r\n197 189 65\r\n255 222 57\r\n255 246 139\r\n115 213 172\r\n82 172 123\r\n57 98 90\r\n82 74 65\r\n156 156 131\r\n106 8 156\r\n0 98 230\r\n115 115 106\r\n197 197 213\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/dewgong/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n230 246 238\r\n197 205 238\r\n172 180 205\r\n65 82 131\r\n238 90 57\r\n197 57 65\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n213 205 205\r\n123 115 115\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/dewgong/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n238 238 213\r\n213 205 189\r\n180 172 156\r\n139 131 115\r\n238 90 57\r\n197 57 65\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n213 205 205\r\n131 123 123\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/diglett/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n255 172 148\r\n255 106 90\r\n213 57 74\r\n230 230 180\r\n180 172 115\r\n131 123 74\r\n90 82 32\r\n123 123 123\r\n16 16 16\r\n222 156 90\r\n197 123 65\r\n164 90 65\r\n106 32 0\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/diglett/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n123 156 197\r\n82 115 156\r\n41 74 115\r\n230 230 180\r\n180 172 115\r\n131 123 74\r\n90 82 32\r\n123 123 123\r\n16 16 16\r\n230 164 98\r\n197 123 65\r\n164 90 32\r\n106 32 0\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/ditto/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n0 255 255\r\n0 255 255\r\n0 255 255\r\n0 255 255\r\n246 197 238\r\n238 156 213\r\n213 115 164\r\n180 82 131\r\n115 41 90\r\n0 255 255\r\n0 255 255\r\n0 255 255\r\n0 255 255\r\n49 49 49\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/ditto/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n0 255 255\r\n0 255 255\r\n0 255 255\r\n0 255 255\r\n139 230 255\r\n106 205 246\r\n74 164 230\r\n32 123 197\r\n24 74 139\r\n0 255 255\r\n0 255 255\r\n0 255 255\r\n0 255 255\r\n49 49 49\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/dodrio/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 197\r\n238 180 98\r\n213 148 57\r\n164 123 74\r\n98 74 49\r\n238 222 172\r\n197 180 131\r\n98 90 65\r\n255 205 230\r\n246 131 164\r\n156 57 57\r\n213 205 205\r\n131 131 131\r\n90 82 74\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/dodrio/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 197\r\n197 205 74\r\n156 164 32\r\n115 123 0\r\n74 82 0\r\n255 246 139\r\n238 189 82\r\n123 90 0\r\n255 213 230\r\n246 131 164\r\n180 65 65\r\n213 205 205\r\n131 131 131\r\n65 65 65\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/doduo/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 205\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n213 164 106\r\n189 139 82\r\n148 98 65\r\n90 65 32\r\n238 222 172\r\n205 180 131\r\n115 106 49\r\n255 0 255\r\n98 98 98\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/doduo/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 205\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n197 205 74\r\n156 164 32\r\n115 123 0\r\n74 82 0\r\n255 246 164\r\n230 205 123\r\n131 106 24\r\n255 0 255\r\n98 98 98\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/donphan/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 205\r\n255 255 255\r\n164 197 197\r\n123 156 156\r\n82 115 115\r\n49 82 82\r\n230 222 213\r\n213 205 205\r\n172 164 164\r\n131 123 123\r\n197 123 90\r\n148 57 41\r\n222 222 222\r\n189 189 189\r\n90 90 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/donphan/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 205\r\n255 255 255\r\n246 189 106\r\n213 148 82\r\n156 82 57\r\n106 74 49\r\n222 222 180\r\n205 205 156\r\n156 156 115\r\n115 115 82\r\n197 123 90\r\n148 57 41\r\n222 222 222\r\n189 189 189\r\n90 90 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/dragonair/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 222 131\r\n255 255 255\r\n230 246 246\r\n213 213 230\r\n106 106 123\r\n123 197 246\r\n82 131 205\r\n32 65 139\r\n24 49 90\r\n16 16 16\r\n123 49 123\r\n123 189 246\r\n82 164 213\r\n98 131 164\r\n32 74 115\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/dragonair/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n222 222 230\r\n180 180 197\r\n106 106 123\r\n255 246 164\r\n246 189 74\r\n213 139 16\r\n131 82 41\r\n16 16 16\r\n123 49 123\r\n230 148 213\r\n205 115 197\r\n156 65 156\r\n90 57 98\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/dragonite/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 189 213\r\n172 148 82\r\n255 230 123\r\n255 205 82\r\n213 180 90\r\n115 98 57\r\n123 197 197\r\n82 164 164\r\n49 115 106\r\n255 246 205\r\n213 213 164\r\n156 156 106\r\n213 213 222\r\n115 115 115\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/dragonite/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n98 115 82\r\n156 180 123\r\n123 156 98\r\n90 106 65\r\n49 57 49\r\n222 156 213\r\n180 115 180\r\n115 74 123\r\n255 246 205\r\n213 213 164\r\n156 156 106\r\n213 213 222\r\n115 115 115\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/dratini/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n238 238 197\r\n205 205 156\r\n123 123 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n139 115 172\r\n139 16 180\r\n197 164 230\r\n164 131 197\r\n115 82 148\r\n57 24 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/dratini/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n238 238 197\r\n197 197 156\r\n123 123 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 90 131\r\n139 16 180\r\n238 148 197\r\n205 106 164\r\n164 65 131\r\n123 32 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/drowzee/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 213\r\n255 255 255\r\n222 205 238\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 139 82\r\n148 106 65\r\n106 82 41\r\n74 49 16\r\n255 238 148\r\n255 222 65\r\n222 189 41\r\n148 106 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/drowzee/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 205\r\n255 255 255\r\n222 205 238\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 98 106\r\n148 57 65\r\n106 16 24\r\n65 0 8\r\n246 222 213\r\n230 189 205\r\n189 148 164\r\n123 82 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/dugtrio/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n255 189 172\r\n255 106 90\r\n222 74 98\r\n230 230 180\r\n180 172 115\r\n131 123 74\r\n90 82 32\r\n106 106 106\r\n16 16 16\r\n230 164 98\r\n197 123 65\r\n164 82 65\r\n106 65 24\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/dugtrio/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n123 156 197\r\n82 115 156\r\n41 74 115\r\n230 230 180\r\n180 172 115\r\n131 123 74\r\n90 82 32\r\n123 123 123\r\n16 16 16\r\n230 164 98\r\n197 123 65\r\n164 90 32\r\n106 32 0\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/dunsparce/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n255 0 255\r\n32 82 139\r\n74 172 189\r\n131 205 213\r\n189 222 230\r\n90 90 90\r\n139 139 139\r\n197 205 213\r\n106 90 41\r\n189 139 32\r\n222 189 57\r\n230 230 131\r\n246 246 197\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/dunsparce/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n255 0 255\r\n164 65 74\r\n222 106 123\r\n238 164 164\r\n238 213 197\r\n90 90 90\r\n139 139 139\r\n238 213 197\r\n106 90 41\r\n189 139 32\r\n222 189 57\r\n230 230 131\r\n246 246 197\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/dusclops/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n82 57 49\r\n90 90 106\r\n255 255 255\r\n106 98 90\r\n139 139 115\r\n180 180 164\r\n148 131 123\r\n213 197 180\r\n172 172 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 0\r\n255 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/dusclops/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n90 65 57\r\n139 32 0\r\n255 255 255\r\n156 41 16\r\n189 74 49\r\n222 106 82\r\n148 131 123\r\n213 197 180\r\n172 172 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 0\r\n255 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/duskull/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 164 172\r\n57 57 49\r\n106 106 90\r\n139 139 123\r\n180 180 148\r\n238 230 189\r\n222 213 172\r\n255 255 230\r\n74 65 65\r\n172 164 123\r\n255 164 172\r\n90 90 82\r\n0 0 0\r\n139 74 90\r\n238 82 24\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/duskull/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 164 172\r\n90 0 0\r\n156 41 16\r\n189 74 49\r\n222 106 82\r\n238 230 189\r\n222 213 172\r\n255 255 230\r\n74 65 65\r\n172 164 123\r\n255 164 172\r\n123 8 0\r\n0 0 0\r\n139 74 90\r\n238 82 24\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/dustox/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 148 255\r\n90 74 74\r\n131 148 131\r\n156 180 156\r\n0 0 0\r\n180 106 148\r\n213 148 197\r\n230 197 213\r\n180 213 115\r\n197 255 148\r\n189 148 82\r\n238 238 49\r\n205 197 49\r\n246 82 49\r\n197 82 49\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/dustox/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 148 255\r\n90 74 74\r\n148 98 65\r\n172 123 90\r\n0 0 0\r\n180 106 148\r\n213 148 197\r\n230 197 213\r\n230 172 90\r\n255 230 156\r\n189 148 82\r\n238 238 49\r\n205 197 49\r\n246 82 49\r\n197 82 49\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/eevee/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 205 164\r\n255 255 255\r\n255 246 205\r\n213 205 156\r\n189 172 106\r\n131 115 74\r\n230 0 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n230 180 115\r\n213 156 90\r\n164 115 49\r\n90 74 32\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/eevee/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n246 255 255\r\n222 230 246\r\n172 180 213\r\n106 123 148\r\n230 98 41\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n238 238 213\r\n222 222 205\r\n172 172 172\r\n82 82 82\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/egg/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 255 148\r\n65 74 74\r\n148 156 156\r\n246 246 213\r\n238 230 164\r\n205 197 131\r\n123 205 74\r\n106 148 82\r\n230 0 0\r\n230 0 0\r\n230 0 0\r\n230 0 0\r\n230 0 0\r\n230 0 0\r\n230 0 0\r\n131 230 230\r\n"
  },
  {
    "path": "graphics/pokemon/ekans/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 189\r\n255 255 255\r\n246 115 74\r\n197 65 24\r\n156 41 41\r\n255 0 255\r\n255 230 156\r\n255 213 106\r\n230 164 115\r\n131 82 16\r\n255 0 255\r\n16 16 16\r\n222 164 197\r\n189 115 164\r\n156 74 131\r\n106 32 90\r\n"
  },
  {
    "path": "graphics/pokemon/ekans/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 189\r\n255 255 255\r\n246 115 74\r\n197 65 24\r\n156 16 0\r\n255 0 255\r\n255 230 156\r\n255 213 106\r\n230 172 90\r\n131 82 16\r\n255 0 255\r\n16 16 16\r\n213 197 98\r\n172 156 57\r\n131 115 16\r\n90 74 0\r\n"
  },
  {
    "path": "graphics/pokemon/electabuzz/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n222 222 222\r\n115 106 90\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 172 123\r\n255 82 32\r\n189 49 8\r\n255 0 255\r\n255 255 213\r\n255 255 172\r\n255 230 57\r\n222 189 82\r\n115 90 16\r\n"
  },
  {
    "path": "graphics/pokemon/electabuzz/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n222 222 222\r\n115 115 115\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 172 123\r\n255 82 32\r\n189 49 8\r\n255 0 255\r\n255 230 148\r\n255 205 41\r\n238 131 0\r\n205 98 0\r\n164 41 0\r\n"
  },
  {
    "path": "graphics/pokemon/electrike/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 246\r\n65 82 65\r\n82 139 90\r\n106 180 123\r\n156 222 131\r\n255 238 32\r\n213 213 24\r\n172 197 65\r\n148 49 57\r\n213 57 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n197 205 222\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/electrike/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 246\r\n74 74 131\r\n49 123 189\r\n90 156 213\r\n123 197 255\r\n255 238 32\r\n197 213 98\r\n172 197 65\r\n148 49 57\r\n213 57 49\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n197 205 222\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/electrode/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 189 230\r\n255 255 255\r\n238 238 238\r\n205 205 205\r\n164 156 156\r\n90 82 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 180 156\r\n255 123 74\r\n230 65 0\r\n180 49 0\r\n131 16 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/electrode/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n238 238 238\r\n222 222 230\r\n180 172 172\r\n90 82 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n115 197 255\r\n74 156 213\r\n32 115 172\r\n32 74 131\r\n32 32 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/elekid/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 205 172\r\n255 255 255\r\n255 230 156\r\n246 197 74\r\n230 172 0\r\n180 106 0\r\n123 82 0\r\n246 148 16\r\n156 49 0\r\n115 16 0\r\n255 0 255\r\n205 205 205\r\n164 164 164\r\n106 106 106\r\n49 49 65\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/elekid/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 230 82\r\n238 205 65\r\n189 156 24\r\n148 115 0\r\n123 82 0\r\n246 148 16\r\n156 49 0\r\n115 16 0\r\n255 0 255\r\n205 205 205\r\n164 164 164\r\n115 98 49\r\n57 49 32\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/entei/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 189 98\r\n180 148 74\r\n131 98 32\r\n82 57 0\r\n255 123 41\r\n230 41 0\r\n156 0 0\r\n255 230 148\r\n255 205 0\r\n213 148 0\r\n213 213 213\r\n172 172 172\r\n98 98 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/entei/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 164 115\r\n213 123 82\r\n156 74 49\r\n115 49 41\r\n164 172 189\r\n115 123 139\r\n65 65 74\r\n255 213 172\r\n255 205 0\r\n213 148 0\r\n213 213 213\r\n172 172 172\r\n98 98 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/espeon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n131 57 65\r\n213 57 65\r\n49 49 49\r\n82 57 106\r\n123 82 180\r\n180 115 230\r\n213 172 230\r\n238 222 238\r\n16 16 16\r\n0 24 148\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/espeon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n131 90 0\r\n255 164 65\r\n49 49 49\r\n41 98 41\r\n74 156 65\r\n106 205 74\r\n164 230 90\r\n213 255 156\r\n16 16 16\r\n82 41 90\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/exeggcute/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n222 222 222\r\n255 205 74\r\n230 156 0\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 222 197\r\n255 189 164\r\n238 156 131\r\n197 131 98\r\n148 49 16\r\n"
  },
  {
    "path": "graphics/pokemon/exeggcute/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n222 222 222\r\n255 205 74\r\n230 156 0\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 255 164\r\n246 238 98\r\n230 197 65\r\n213 164 57\r\n123 90 41\r\n"
  },
  {
    "path": "graphics/pokemon/exeggutor/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 238 164\r\n255 222 106\r\n230 172 90\r\n131 82 24\r\n180 156 74\r\n139 115 65\r\n90 57 8\r\n189 255 115\r\n156 213 74\r\n115 172 49\r\n82 98 41\r\n222 222 222\r\n98 98 98\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/exeggutor/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 238 164\r\n255 222 106\r\n230 172 90\r\n164 106 32\r\n222 189 82\r\n180 148 32\r\n106 82 0\r\n255 189 123\r\n222 148 82\r\n180 106 41\r\n115 41 0\r\n222 222 222\r\n98 98 98\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/exploud/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n189 189 238\r\n164 156 222\r\n123 115 180\r\n82 74 139\r\n255 222 90\r\n222 180 74\r\n156 115 24\r\n255 115 82\r\n213 74 49\r\n156 57 24\r\n106 49 24\r\n213 222 255\r\n131 131 131\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/exploud/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n213 172 189\r\n189 156 164\r\n139 106 123\r\n115 82 90\r\n255 238 172\r\n246 197 82\r\n238 172 24\r\n255 139 82\r\n213 82 49\r\n164 49 24\r\n115 74 0\r\n222 197 222\r\n131 131 131\r\n57 49 74\r\n"
  },
  {
    "path": "graphics/pokemon/farfetchd/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n213 213 213\r\n230 230 164\r\n197 197 131\r\n255 222 90\r\n230 172 90\r\n156 115 41\r\n205 255 139\r\n123 205 65\r\n74 131 24\r\n205 189 123\r\n180 148 82\r\n139 90 41\r\n98 65 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/farfetchd/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n213 213 213\r\n230 230 164\r\n197 197 131\r\n255 230 106\r\n230 172 90\r\n189 106 41\r\n205 255 139\r\n139 189 57\r\n98 148 16\r\n246 189 180\r\n213 148 139\r\n172 106 98\r\n131 65 57\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/fearow/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 0 255\r\n238 213 172\r\n197 189 164\r\n98 82 49\r\n16 16 16\r\n255 139 148\r\n246 90 90\r\n205 57 74\r\n255 205 123\r\n246 180 90\r\n213 156 57\r\n172 115 82\r\n123 65 0\r\n246 180 90\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/fearow/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 0 255\r\n222 205 164\r\n197 180 139\r\n98 82 49\r\n16 16 16\r\n255 205 74\r\n255 164 0\r\n197 123 0\r\n255 246 131\r\n255 230 90\r\n213 197 49\r\n180 164 8\r\n115 98 0\r\n246 180 90\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/feebas/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 148 98\r\n90 74 57\r\n180 164 115\r\n213 213 131\r\n238 238 156\r\n115 164 41\r\n164 205 98\r\n148 131 82\r\n180 106 106\r\n230 123 98\r\n82 82 115\r\n164 172 197\r\n205 222 255\r\n230 222 230\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/feebas/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 148 98\r\n98 65 74\r\n172 139 148\r\n205 172 180\r\n238 205 213\r\n115 164 41\r\n164 205 98\r\n139 106 115\r\n180 106 106\r\n230 123 98\r\n82 82 115\r\n164 172 197\r\n205 222 255\r\n230 222 230\r\n255 255 255\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/feraligatr/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n131 205 255\r\n90 172 230\r\n49 131 197\r\n74 74 131\r\n197 197 197\r\n255 172 90\r\n255 90 32\r\n205 41 24\r\n123 0 0\r\n255 255 156\r\n255 213 82\r\n205 172 65\r\n156 115 8\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/feraligatr/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n115 238 222\r\n82 205 197\r\n74 156 164\r\n41 98 123\r\n197 197 197\r\n106 156 246\r\n49 98 213\r\n41 65 156\r\n0 49 90\r\n255 255 156\r\n246 222 115\r\n213 180 74\r\n156 115 8\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/flaaffy/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n205 205 222\r\n156 156 180\r\n115 115 139\r\n74 74 74\r\n255 197 164\r\n255 148 123\r\n238 90 65\r\n205 57 24\r\n172 0 0\r\n131 197 255\r\n82 131 197\r\n41 65 139\r\n255 0 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/flaaffy/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n230 222 205\r\n189 180 148\r\n148 131 82\r\n106 82 49\r\n255 222 238\r\n255 197 213\r\n230 139 156\r\n180 98 106\r\n148 65 74\r\n98 230 16\r\n49 180 0\r\n32 106 0\r\n255 0 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/flareon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n255 238 106\r\n255 230 41\r\n222 197 32\r\n148 115 8\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n115 115 123\r\n16 16 16\r\n255 0 255\r\n255 172 49\r\n255 123 0\r\n230 65 0\r\n131 32 32\r\n"
  },
  {
    "path": "graphics/pokemon/flareon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n255 255 197\r\n255 255 57\r\n238 205 8\r\n164 106 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n115 115 123\r\n16 16 16\r\n255 0 255\r\n246 189 65\r\n222 164 41\r\n172 115 8\r\n98 57 24\r\n"
  },
  {
    "path": "graphics/pokemon/flygon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n74 106 24\r\n156 49 49\r\n123 156 65\r\n49 90 90\r\n213 255 131\r\n172 222 115\r\n156 189 98\r\n148 213 156\r\n106 164 115\r\n90 131 90\r\n255 180 180\r\n230 115 115\r\n205 49 49\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/flygon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n74 106 24\r\n139 82 0\r\n123 156 65\r\n8 90 139\r\n213 255 131\r\n172 222 115\r\n156 189 98\r\n106 189 238\r\n74 156 205\r\n41 123 172\r\n255 197 82\r\n222 164 49\r\n189 131 16\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/forretress/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n255 0 255\r\n98 41 90\r\n172 74 139\r\n197 131 189\r\n230 180 230\r\n246 222 238\r\n255 0 255\r\n255 0 255\r\n131 16 49\r\n189 41 65\r\n246 98 115\r\n255 189 205\r\n255 0 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/forretress/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n255 0 255\r\n115 82 49\r\n180 156 74\r\n222 197 106\r\n246 230 139\r\n255 246 156\r\n255 0 255\r\n255 0 255\r\n82 65 32\r\n106 74 49\r\n180 139 65\r\n222 197 98\r\n255 0 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/furret/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n255 255 197\r\n255 238 148\r\n230 197 74\r\n197 156 65\r\n172 131 41\r\n156 98 74\r\n123 65 57\r\n74 24 24\r\n197 49 24\r\n156 0 0\r\n255 148 98\r\n115 115 115\r\n65 65 65\r\n32 32 41\r\n"
  },
  {
    "path": "graphics/pokemon/furret/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 246 230\r\n255 230 222\r\n222 189 172\r\n230 98 139\r\n148 123 90\r\n197 65 115\r\n164 32 90\r\n131 0 65\r\n197 49 24\r\n156 0 0\r\n255 148 98\r\n115 115 115\r\n65 65 65\r\n32 32 41\r\n"
  },
  {
    "path": "graphics/pokemon/gardevoir/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 164 82\r\n238 238 255\r\n197 205 222\r\n164 180 205\r\n131 148 180\r\n123 82 82\r\n115 41 57\r\n255 156 131\r\n230 82 57\r\n131 205 255\r\n255 255 255\r\n205 255 172\r\n148 230 148\r\n115 189 115\r\n49 123 74\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/gardevoir/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 164 82\r\n238 238 255\r\n213 189 222\r\n180 164 205\r\n156 131 180\r\n123 82 82\r\n115 41 57\r\n255 197 90\r\n230 131 32\r\n131 205 255\r\n197 238 246\r\n189 230 255\r\n123 197 238\r\n82 172 213\r\n32 115 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/gastly/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n255 255 255\r\n222 222 222\r\n222 82 57\r\n180 41 16\r\n255 0 255\r\n189 148 180\r\n139 98 131\r\n115 74 106\r\n82 49 90\r\n213 172 205\r\n189 148 180\r\n139 98 131\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/gastly/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n255 255 255\r\n222 222 222\r\n222 82 57\r\n180 41 16\r\n255 0 255\r\n172 131 230\r\n148 115 197\r\n90 57 148\r\n82 41 98\r\n156 222 255\r\n115 180 213\r\n74 139 172\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/gengar/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n222 222 222\r\n123 123 123\r\n255 180 123\r\n238 98 74\r\n205 57 32\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n197 131 180\r\n156 106 131\r\n106 90 98\r\n90 49 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/gengar/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n222 222 222\r\n123 123 123\r\n255 172 213\r\n238 131 172\r\n197 90 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n164 164 189\r\n123 123 148\r\n82 82 106\r\n41 41 65\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/geodude/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n205 205 205\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n205 213 131\r\n172 180 98\r\n123 131 90\r\n65 74 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/geodude/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n205 205 205\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n238 189 49\r\n205 164 24\r\n164 123 0\r\n106 65 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/girafarig/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n65 49 32\r\n90 82 57\r\n123 106 57\r\n164 148 82\r\n213 205 139\r\n189 139 16\r\n238 180 49\r\n255 222 65\r\n255 246 123\r\n16 16 16\r\n238 106 115\r\n255 172 189\r\n180 213 230\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/girafarig/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n65 49 32\r\n90 65 41\r\n123 90 49\r\n156 123 65\r\n205 172 106\r\n189 139 16\r\n230 156 41\r\n246 197 57\r\n255 230 82\r\n16 16 16\r\n82 164 230\r\n164 213 255\r\n180 213 230\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/glalie/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n230 230 246\r\n205 205 222\r\n164 164 189\r\n123 123 148\r\n82 82 106\r\n164 205 255\r\n123 164 230\r\n74 139 197\r\n255 0 255\r\n205 205 213\r\n164 164 172\r\n123 123 131\r\n82 82 90\r\n41 41 57\r\n"
  },
  {
    "path": "graphics/pokemon/glalie/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 246 255\r\n213 230 238\r\n180 197 205\r\n148 164 172\r\n74 98 106\r\n255 148 90\r\n230 74 65\r\n205 8 41\r\n255 0 255\r\n205 205 213\r\n164 164 172\r\n123 123 131\r\n82 82 90\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/gligar/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n90 90 90\r\n148 148 148\r\n90 65 123\r\n115 90 164\r\n180 131 213\r\n222 189 255\r\n246 222 255\r\n24 49 115\r\n16 90 148\r\n74 139 189\r\n98 197 238\r\n213 90 57\r\n255 148 106\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/gligar/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n90 90 90\r\n148 148 148\r\n57 65 123\r\n82 98 172\r\n131 156 213\r\n180 197 255\r\n222 238 246\r\n24 49 98\r\n32 65 139\r\n65 90 180\r\n82 156 222\r\n213 90 57\r\n255 148 106\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/gloom/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n246 238 189\r\n255 189 65\r\n255 115 0\r\n197 106 41\r\n180 90 197\r\n213 205 180\r\n205 115 74\r\n172 82 57\r\n131 57 24\r\n98 49 0\r\n156 164 205\r\n123 131 164\r\n74 90 123\r\n16 49 74\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/gloom/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n246 246 246\r\n255 213 131\r\n255 172 90\r\n213 131 49\r\n156 49 0\r\n213 213 213\r\n238 180 98\r\n197 139 57\r\n156 98 16\r\n115 57 16\r\n180 189 131\r\n139 148 90\r\n98 106 49\r\n57 65 8\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/golbat/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n213 213 213\r\n98 98 98\r\n0 0 0\r\n172 205 255\r\n139 180 238\r\n98 131 205\r\n57 57 123\r\n205 106 180\r\n172 82 156\r\n148 57 123\r\n98 16 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/golbat/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n213 213 213\r\n98 98 98\r\n0 0 0\r\n164 189 57\r\n123 148 0\r\n82 106 0\r\n41 65 0\r\n255 180 172\r\n238 139 131\r\n197 98 90\r\n139 41 32\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/goldeen/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n222 222 230\r\n189 189 197\r\n139 139 148\r\n98 98 106\r\n255 197 123\r\n238 123 65\r\n213 65 16\r\n180 49 0\r\n131 16 0\r\n238 123 65\r\n213 65 16\r\n65 172 164\r\n0 106 98\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/goldeen/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n222 222 230\r\n189 189 197\r\n139 139 148\r\n98 98 106\r\n255 222 24\r\n255 156 8\r\n213 115 0\r\n172 74 0\r\n131 32 0\r\n255 180 139\r\n213 139 98\r\n65 172 164\r\n0 106 98\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/golduck/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 213 131\r\n255 255 255\r\n213 213 213\r\n255 172 172\r\n222 24 24\r\n139 0 0\r\n255 255 164\r\n213 213 106\r\n164 164 57\r\n115 115 16\r\n255 0 255\r\n164 197 255\r\n139 172 213\r\n123 123 180\r\n49 82 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/golduck/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n238 238 238\r\n255 255 255\r\n197 197 197\r\n238 49 74\r\n222 24 24\r\n139 0 0\r\n246 189 197\r\n222 123 148\r\n189 98 106\r\n123 74 90\r\n255 0 255\r\n115 205 255\r\n74 164 230\r\n32 123 189\r\n0 49 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/golem/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 255 255\r\n222 222 222\r\n180 0 0\r\n255 82 82\r\n180 189 98\r\n148 164 98\r\n106 123 65\r\n74 82 16\r\n238 205 115\r\n213 180 90\r\n156 139 57\r\n82 65 8\r\n255 0 255\r\n115 115 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/golem/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n205 205 205\r\n180 0 0\r\n255 82 82\r\n213 148 82\r\n172 106 41\r\n131 65 0\r\n98 32 0\r\n255 213 180\r\n230 172 139\r\n189 131 98\r\n131 74 41\r\n255 0 255\r\n131 131 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/gorebyss/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 197\r\n255 255 255\r\n230 222 213\r\n205 189 172\r\n255 205 205\r\n246 172 189\r\n238 131 172\r\n213 98 148\r\n148 74 90\r\n131 90 131\r\n98 57 106\r\n123 106 98\r\n0 0 0\r\n205 115 255\r\n172 106 213\r\n148 90 172\r\n"
  },
  {
    "path": "graphics/pokemon/gorebyss/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 197\r\n255 255 255\r\n230 222 213\r\n205 189 172\r\n255 246 180\r\n255 222 98\r\n246 189 74\r\n213 156 41\r\n148 106 32\r\n131 90 131\r\n98 57 106\r\n123 106 98\r\n0 0 0\r\n205 115 255\r\n172 106 213\r\n148 90 172\r\n"
  },
  {
    "path": "graphics/pokemon/granbull/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 0 255\r\n255 0 255\r\n90 57 82\r\n156 98 148\r\n213 115 213\r\n230 156 238\r\n238 189 255\r\n255 0 255\r\n131 57 0\r\n230 197 131\r\n16 16 16\r\n49 57 65\r\n82 90 90\r\n164 164 156\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/granbull/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 0 255\r\n255 0 255\r\n98 82 65\r\n148 115 90\r\n205 172 131\r\n230 205 172\r\n246 222 189\r\n255 0 255\r\n90 82 0\r\n205 189 106\r\n16 16 16\r\n49 57 65\r\n82 90 90\r\n164 164 156\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/graveler/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n205 205 205\r\n148 148 148\r\n16 16 16\r\n238 49 49\r\n189 32 57\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n197 213 131\r\n164 180 115\r\n115 131 82\r\n82 74 16\r\n"
  },
  {
    "path": "graphics/pokemon/graveler/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n205 205 205\r\n148 148 148\r\n16 16 16\r\n238 49 49\r\n189 32 57\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n205 148 41\r\n164 106 0\r\n123 65 0\r\n82 24 0\r\n"
  },
  {
    "path": "graphics/pokemon/grimer/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n238 238 238\r\n213 213 222\r\n172 180 189\r\n131 139 156\r\n65 74 90\r\n230 189 222\r\n197 156 180\r\n148 106 156\r\n90 49 115\r\n238 222 238\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/grimer/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n238 238 238\r\n213 213 222\r\n172 180 189\r\n131 139 156\r\n65 74 90\r\n197 238 156\r\n180 213 139\r\n139 172 98\r\n82 115 41\r\n222 246 180\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/groudon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n205 57 74\r\n172 148 164\r\n156 123 139\r\n123 90 98\r\n255 123 131\r\n123 32 41\r\n255 32 41\r\n172 41 57\r\n255 205 49\r\n197 197 205\r\n255 255 255\r\n255 189 189\r\n156 106 49\r\n57 57 57\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/groudon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n131 131 8\r\n172 148 164\r\n156 123 139\r\n123 90 98\r\n230 230 106\r\n98 98 0\r\n197 197 74\r\n164 164 41\r\n255 205 49\r\n197 197 205\r\n255 255 255\r\n255 255 139\r\n156 106 49\r\n57 57 57\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/grovyle/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 148 131\r\n16 82 74\r\n90 180 106\r\n139 230 148\r\n189 255 180\r\n57 131 65\r\n131 41 49\r\n230 65 41\r\n255 115 82\r\n255 222 82\r\n57 131 148\r\n189 65 65\r\n213 139 82\r\n82 164 189\r\n0 0 0\r\n255 238 255\r\n"
  },
  {
    "path": "graphics/pokemon/grovyle/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 148 131\r\n148 74 49\r\n74 164 148\r\n148 205 213\r\n180 230 238\r\n65 123 115\r\n205 156 123\r\n238 189 156\r\n255 238 197\r\n255 222 82\r\n213 82 57\r\n180 131 98\r\n213 139 82\r\n255 106 82\r\n0 0 0\r\n255 238 255\r\n"
  },
  {
    "path": "graphics/pokemon/growlithe/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 246\r\n222 222 213\r\n106 106 106\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 246 180\r\n230 213 148\r\n205 180 115\r\n115 98 32\r\n255 197 82\r\n238 139 74\r\n197 82 32\r\n115 57 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/growlithe/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 246\r\n222 222 213\r\n82 82 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 246 180\r\n230 213 148\r\n180 164 106\r\n115 98 32\r\n255 238 82\r\n230 197 41\r\n189 156 0\r\n123 90 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/grumpig/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n148 148 148\r\n123 123 123\r\n98 98 98\r\n74 74 74\r\n255 180 213\r\n238 139 172\r\n213 106 131\r\n230 172 238\r\n205 139 213\r\n180 115 189\r\n123 82 139\r\n156 74 98\r\n246 205 255\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/grumpig/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n172 172 172\r\n131 131 131\r\n82 82 82\r\n57 57 57\r\n255 180 213\r\n238 139 172\r\n213 106 131\r\n246 222 106\r\n213 189 65\r\n189 164 41\r\n131 123 0\r\n156 74 98\r\n255 238 172\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/gulpin/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 189 131\r\n74 106 57\r\n131 164 115\r\n164 222 148\r\n197 238 180\r\n156 189 139\r\n65 65 65\r\n106 106 106\r\n156 156 156\r\n172 148 74\r\n205 172 16\r\n246 222 90\r\n255 238 164\r\n255 148 123\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/gulpin/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 189 131\r\n74 106 57\r\n98 123 164\r\n131 180 238\r\n156 213 255\r\n98 148 197\r\n65 65 65\r\n106 106 106\r\n156 156 156\r\n164 49 32\r\n180 65 49\r\n222 98 49\r\n255 139 82\r\n255 148 123\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/gyarados/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 213 180\r\n222 230 246\r\n172 180 197\r\n106 123 148\r\n139 189 255\r\n115 156 230\r\n123 131 164\r\n57 57 98\r\n255 230 156\r\n197 197 123\r\n98 106 57\r\n255 131 123\r\n205 49 49\r\n148 32 0\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/gyarados/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n222 230 246\r\n172 180 197\r\n106 123 148\r\n255 197 90\r\n255 139 65\r\n213 90 49\r\n123 57 57\r\n255 255 148\r\n205 205 131\r\n106 106 90\r\n255 98 57\r\n205 49 49\r\n148 32 0\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/hariyama/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 164 115\r\n246 230 197\r\n230 213 164\r\n197 172 115\r\n139 106 82\r\n238 164 106\r\n213 131 90\r\n172 98 65\r\n131 74 49\r\n98 98 148\r\n49 49 98\r\n246 213 115\r\n238 189 82\r\n205 156 65\r\n24 24 24\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/hariyama/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 164 115\r\n255 238 172\r\n246 205 131\r\n246 189 82\r\n205 139 57\r\n222 189 197\r\n189 156 164\r\n156 106 131\r\n115 82 90\r\n98 98 148\r\n49 49 98\r\n255 90 74\r\n205 82 65\r\n156 82 65\r\n24 24 24\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/haunter/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n197 148 222\r\n148 106 180\r\n98 82 131\r\n90 57 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n222 49 49\r\n180 24 24\r\n98 16 16\r\n222 222 222\r\n115 115 115\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/haunter/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n213 164 222\r\n197 131 205\r\n131 90 164\r\n82 49 98\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n74 156 197\r\n32 115 156\r\n0 65 106\r\n213 213 213\r\n115 115 115\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/heracross/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n156 180 255\r\n123 139 222\r\n98 106 180\r\n49 57 98\r\n255 0 255\r\n255 255 139\r\n255 222 90\r\n197 164 41\r\n139 106 0\r\n255 0 255\r\n213 213 213\r\n156 156 156\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/heracross/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 156 213\r\n205 123 189\r\n164 82 156\r\n98 57 98\r\n255 0 255\r\n255 255 139\r\n255 222 90\r\n197 164 41\r\n139 106 0\r\n255 0 255\r\n213 213 213\r\n156 156 156\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/hitmonchan/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n222 205 222\r\n197 180 197\r\n164 148 164\r\n115 98 115\r\n255 148 90\r\n230 98 57\r\n189 49 16\r\n139 32 0\r\n255 0 255\r\n238 213 156\r\n205 180 123\r\n164 139 82\r\n106 82 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/hitmonchan/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n222 205 222\r\n197 180 197\r\n164 148 164\r\n115 98 115\r\n90 148 213\r\n49 106 172\r\n8 65 131\r\n0 24 90\r\n255 0 255\r\n238 230 139\r\n197 189 98\r\n156 148 57\r\n98 90 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/hitmonlee/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n230 180 148\r\n205 164 131\r\n164 123 90\r\n131 90 57\r\n98 57 24\r\n255 0 255\r\n255 0 255\r\n230 230 189\r\n197 189 164\r\n115 98 98\r\n255 238 139\r\n238 205 115\r\n115 123 32\r\n41 41 41\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/hitmonlee/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n172 180 74\r\n131 139 32\r\n90 98 0\r\n49 57 0\r\n32 41 0\r\n255 0 255\r\n255 0 255\r\n189 164 139\r\n148 123 98\r\n106 82 57\r\n238 255 148\r\n197 205 115\r\n115 123 32\r\n41 41 41\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/hitmontop/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 238 156\r\n230 205 123\r\n189 164 82\r\n131 98 16\r\n255 0 255\r\n139 213 255\r\n98 172 238\r\n74 131 205\r\n82 90 148\r\n255 0 255\r\n205 205 205\r\n148 148 156\r\n98 98 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/hitmontop/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 246 205\r\n230 222 180\r\n180 172 148\r\n131 90 65\r\n255 0 255\r\n246 148 222\r\n205 106 189\r\n172 74 164\r\n115 49 123\r\n255 0 255\r\n205 205 205\r\n148 148 156\r\n98 98 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ho_oh/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 164\r\n255 255 255\r\n255 172 0\r\n255 90 0\r\n205 65 0\r\n156 16 0\r\n255 238 131\r\n255 230 0\r\n230 172 0\r\n164 106 0\r\n156 246 172\r\n65 213 82\r\n16 148 16\r\n197 197 197\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ho_oh/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 164\r\n255 255 255\r\n255 230 57\r\n255 172 24\r\n205 123 24\r\n148 74 49\r\n238 238 238\r\n222 222 222\r\n180 180 189\r\n123 123 139\r\n255 172 0\r\n255 74 0\r\n156 41 24\r\n213 213 222\r\n123 106 65\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/hoothoot/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n246 255 189\r\n230 246 164\r\n222 213 90\r\n205 189 41\r\n172 156 32\r\n148 131 24\r\n123 106 16\r\n90 74 0\r\n255 230 172\r\n255 180 106\r\n230 123 41\r\n123 123 123\r\n82 82 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/hoothoot/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 255 189\r\n238 238 106\r\n255 238 115\r\n246 222 57\r\n230 189 49\r\n213 148 41\r\n197 131 32\r\n139 82 32\r\n255 230 172\r\n255 180 106\r\n230 123 41\r\n123 123 123\r\n82 82 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/hoppip/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n255 156 115\r\n255 98 82\r\n213 65 16\r\n164 16 0\r\n255 0 255\r\n131 230 57\r\n98 205 57\r\n65 164 32\r\n32 98 16\r\n255 0 255\r\n255 255 82\r\n246 197 0\r\n255 0 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/hoppip/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n148 205 32\r\n106 180 8\r\n90 139 41\r\n57 90 16\r\n255 0 255\r\n189 246 57\r\n131 222 57\r\n82 172 24\r\n32 98 16\r\n255 0 255\r\n255 255 82\r\n246 197 0\r\n255 0 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/horsea/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 0 255\r\n255 0 255\r\n98 82 41\r\n156 131 74\r\n189 222 255\r\n164 197 238\r\n131 148 180\r\n57 82 98\r\n255 255 172\r\n230 205 74\r\n255 115 115\r\n197 41 41\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/horsea/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 0 255\r\n255 0 255\r\n123 82 41\r\n172 123 82\r\n115 205 213\r\n74 164 172\r\n32 123 131\r\n16 74 82\r\n255 197 172\r\n238 172 139\r\n255 115 115\r\n197 41 41\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/houndoom/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n139 123 123\r\n82 74 74\r\n57 49 49\r\n41 32 32\r\n255 213 139\r\n238 164 82\r\n189 123 57\r\n148 82 24\r\n255 106 49\r\n180 49 8\r\n255 0 255\r\n255 0 255\r\n180 164 164\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/houndoom/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n123 156 230\r\n74 98 180\r\n49 65 139\r\n65 74 90\r\n255 230 197\r\n213 172 148\r\n172 131 90\r\n123 82 65\r\n255 106 49\r\n180 49 8\r\n255 0 255\r\n255 0 255\r\n222 197 213\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/houndour/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n139 123 123\r\n82 74 74\r\n57 49 49\r\n41 32 32\r\n255 213 139\r\n238 164 82\r\n189 123 57\r\n148 82 24\r\n255 106 49\r\n180 49 8\r\n255 0 255\r\n255 0 255\r\n180 164 164\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/houndour/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n123 164 197\r\n82 123 164\r\n57 82 115\r\n49 65 82\r\n255 230 197\r\n213 172 148\r\n172 131 90\r\n123 82 65\r\n255 106 49\r\n180 49 8\r\n255 0 255\r\n255 0 255\r\n222 189 197\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/huntail/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 106 189\r\n255 255 255\r\n238 180 98\r\n222 148 0\r\n156 106 65\r\n180 238 238\r\n156 222 246\r\n123 197 222\r\n74 156 180\r\n49 98 123\r\n0 0 0\r\n255 131 148\r\n205 115 148\r\n148 57 90\r\n213 197 213\r\n164 131 148\r\n"
  },
  {
    "path": "graphics/pokemon/huntail/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 106 189\r\n255 255 255\r\n255 222 115\r\n230 156 0\r\n164 115 65\r\n172 255 172\r\n148 230 148\r\n115 197 115\r\n57 148 82\r\n32 106 57\r\n0 0 0\r\n255 131 148\r\n205 115 148\r\n148 57 90\r\n213 197 213\r\n164 131 148\r\n"
  },
  {
    "path": "graphics/pokemon/hypno/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 238 156\r\n255 222 98\r\n205 180 106\r\n98 74 32\r\n189 156 82\r\n213 197 222\r\n115 106 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n156 156 156\r\n98 98 98\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/hypno/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 180 213\r\n238 139 172\r\n197 98 131\r\n123 57 57\r\n172 98 106\r\n213 213 222\r\n115 106 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n156 156 156\r\n98 98 98\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/icon_palettes/icon_palette_0.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 156 131\r\n131 131 115\r\n189 189 189\r\n255 255 255\r\n189 164 65\r\n246 246 41\r\n213 98 65\r\n246 148 41\r\n139 123 255\r\n98 74 205\r\n238 115 156\r\n255 180 164\r\n164 197 255\r\n106 172 156\r\n98 98 90\r\n65 65 65\r\n"
  },
  {
    "path": "graphics/pokemon/icon_palettes/icon_palette_1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 156 131\r\n115 115 115\r\n189 189 189\r\n255 255 255\r\n123 156 74\r\n156 205 74\r\n148 246 74\r\n238 115 156\r\n246 148 246\r\n189 164 90\r\n246 230 41\r\n246 246 172\r\n213 213 106\r\n230 74 41\r\n98 98 90\r\n65 65 65\r\n"
  },
  {
    "path": "graphics/pokemon/icon_palettes/icon_palette_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 156 131\r\n123 123 123\r\n189 189 180\r\n255 255 255\r\n115 115 205\r\n164 172 246\r\n180 131 90\r\n238 197 139\r\n197 172 41\r\n246 246 41\r\n246 98 82\r\n148 123 205\r\n197 164 205\r\n189 41 156\r\n98 98 90\r\n65 65 65\r\n"
  },
  {
    "path": "graphics/pokemon/igglybuff/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 205 156\r\n255 148 115\r\n222 115 65\r\n197 74 0\r\n148 32 16\r\n255 230 180\r\n255 0 255\r\n205 0 0\r\n156 0 0\r\n205 0 0\r\n156 0 0\r\n98 0 0\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/igglybuff/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 213 238\r\n246 172 197\r\n222 115 139\r\n180 57 90\r\n156 24 49\r\n255 238 238\r\n255 0 255\r\n205 0 0\r\n156 0 0\r\n90 197 24\r\n74 172 24\r\n41 82 0\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/illumise/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n0 90 213\r\n123 123 123\r\n74 74 74\r\n0 0 0\r\n205 139 222\r\n180 98 205\r\n139 82 156\r\n49 41 49\r\n255 230 115\r\n230 180 74\r\n156 131 82\r\n172 197 238\r\n139 172 205\r\n90 106 139\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/illumise/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n0 90 213\r\n123 123 123\r\n74 74 74\r\n0 0 0\r\n255 230 115\r\n230 180 74\r\n189 139 82\r\n49 41 49\r\n255 148 82\r\n222 90 32\r\n164 49 32\r\n131 205 255\r\n90 172 230\r\n32 115 189\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/ivysaur/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n98 139 49\r\n255 189 180\r\n255 123 123\r\n213 90 139\r\n139 230 222\r\n123 205 189\r\n131 230 90\r\n115 189 41\r\n82 139 148\r\n16 16 16\r\n24 90 82\r\n205 123 57\r\n139 90 57\r\n189 41 65\r\n"
  },
  {
    "path": "graphics/pokemon/ivysaur/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n90 139 49\r\n255 255 82\r\n255 222 8\r\n222 180 0\r\n205 238 65\r\n164 213 49\r\n123 222 32\r\n82 180 0\r\n123 172 8\r\n16 16 16\r\n74 90 24\r\n222 139 65\r\n180 131 16\r\n139 115 16\r\n"
  },
  {
    "path": "graphics/pokemon/jigglypuff/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n205 189 255\r\n148 131 255\r\n115 98 222\r\n65 49 156\r\n156 106 32\r\n115 65 24\r\n230 230 230\r\n164 49 0\r\n213 57 49\r\n16 16 16\r\n255 205 197\r\n255 172 164\r\n230 115 115\r\n164 74 74\r\n"
  },
  {
    "path": "graphics/pokemon/jigglypuff/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n164 230 148\r\n98 230 131\r\n90 197 106\r\n57 156 65\r\n156 106 32\r\n115 65 24\r\n230 230 230\r\n164 49 0\r\n213 57 49\r\n16 16 16\r\n255 222 238\r\n246 189 230\r\n222 156 189\r\n131 82 106\r\n"
  },
  {
    "path": "graphics/pokemon/jirachi/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n205 213 222\r\n156 164 172\r\n41 65 115\r\n230 238 246\r\n82 115 255\r\n131 164 255\r\n106 115 115\r\n197 0 0\r\n238 82 82\r\n180 139 49\r\n230 197 82\r\n255 230 90\r\n255 246 148\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/jirachi/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 180 164\r\n156 164 172\r\n41 65 115\r\n255 230 230\r\n230 74 49\r\n255 123 106\r\n123 98 90\r\n197 0 0\r\n238 82 82\r\n180 139 49\r\n230 197 82\r\n255 230 90\r\n255 246 148\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/jolteon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n246 238 115\r\n255 222 49\r\n213 189 49\r\n156 139 57\r\n106 82 32\r\n255 0 255\r\n189 49 49\r\n106 0 0\r\n255 0 255\r\n255 0 255\r\n222 230 222\r\n139 148 164\r\n98 98 98\r\n41 41 41\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/jolteon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n222 255 131\r\n197 238 32\r\n156 197 0\r\n123 164 0\r\n74 115 0\r\n255 0 255\r\n189 49 49\r\n106 0 0\r\n255 0 255\r\n255 0 255\r\n222 222 230\r\n139 148 164\r\n98 98 98\r\n41 41 41\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/jumpluff/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n98 65 8\r\n123 164 255\r\n90 131 213\r\n65 106 197\r\n57 82 148\r\n16 16 16\r\n255 255 222\r\n246 238 180\r\n238 222 148\r\n205 189 115\r\n156 139 82\r\n255 139 41\r\n213 65 0\r\n65 230 57\r\n49 156 49\r\n"
  },
  {
    "path": "graphics/pokemon/jumpluff/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n115 57 98\r\n255 205 172\r\n246 164 164\r\n222 123 156\r\n164 74 106\r\n16 16 16\r\n255 238 246\r\n246 213 238\r\n222 172 213\r\n205 139 172\r\n164 98 164\r\n255 139 41\r\n213 65 0\r\n65 230 57\r\n49 156 49\r\n"
  },
  {
    "path": "graphics/pokemon/jynx/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n213 213 213\r\n98 98 115\r\n213 139 238\r\n172 106 197\r\n148 74 172\r\n255 164 156\r\n238 65 65\r\n180 74 74\r\n106 8 0\r\n255 246 172\r\n255 238 82\r\n213 197 57\r\n123 106 24\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/jynx/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n213 213 213\r\n98 98 115\r\n213 139 238\r\n172 106 197\r\n148 74 172\r\n255 172 230\r\n255 131 189\r\n213 90 148\r\n148 24 82\r\n255 230 222\r\n213 189 180\r\n172 148 139\r\n115 90 82\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/kabuto/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n180 180 180\r\n255 197 197\r\n238 74 65\r\n255 0 255\r\n255 255 139\r\n255 213 49\r\n222 180 41\r\n164 106 0\r\n255 0 255\r\n230 172 65\r\n189 139 41\r\n156 98 24\r\n106 57 8\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/kabuto/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n180 180 180\r\n255 172 164\r\n238 74 65\r\n255 0 255\r\n255 255 139\r\n255 213 49\r\n238 180 32\r\n164 106 0\r\n255 0 255\r\n180 230 74\r\n156 205 57\r\n115 164 32\r\n82 123 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/kabutops/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n230 222 197\r\n189 189 180\r\n156 156 148\r\n106 106 106\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n246 222 148\r\n222 189 115\r\n172 148 90\r\n90 74 24\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/kabutops/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n222 222 213\r\n189 189 180\r\n156 156 148\r\n106 106 106\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n222 255 90\r\n189 222 74\r\n148 180 41\r\n82 115 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/kadabra/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n90 90 90\r\n246 139 139\r\n230 57 41\r\n213 180 82\r\n172 131 41\r\n139 82 16\r\n106 65 8\r\n222 222 222\r\n180 180 180\r\n255 255 189\r\n255 238 41\r\n222 189 16\r\n131 106 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/kadabra/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n106 205 148\r\n255 255 255\r\n90 90 90\r\n246 139 139\r\n246 65 49\r\n230 164 180\r\n205 123 172\r\n156 82 115\r\n90 49 49\r\n222 222 222\r\n180 180 180\r\n255 255 197\r\n255 238 139\r\n246 189 82\r\n123 98 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/kakuna/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n255 230 156\r\n246 222 90\r\n205 189 82\r\n164 139 24\r\n139 123 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n115 115 115\r\n57 57 57\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/kakuna/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 238 90\r\n197 230 49\r\n156 189 8\r\n115 148 0\r\n74 106 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n106 106 106\r\n57 57 57\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/kangaskhan/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n213 213 213\r\n255 246 139\r\n222 213 106\r\n189 24 24\r\n16 16 16\r\n222 180 213\r\n164 115 156\r\n180 189 131\r\n139 148 98\r\n106 106 82\r\n213 189 131\r\n189 164 106\r\n156 115 90\r\n82 65 16\r\n"
  },
  {
    "path": "graphics/pokemon/kangaskhan/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n213 213 213\r\n255 255 148\r\n238 205 106\r\n189 24 24\r\n16 16 16\r\n238 205 180\r\n189 156 139\r\n139 156 82\r\n98 115 41\r\n57 74 0\r\n238 222 180\r\n213 205 156\r\n172 164 115\r\n98 90 49\r\n"
  },
  {
    "path": "graphics/pokemon/kecleon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 255 255\r\n65 98 65\r\n82 139 90\r\n98 180 131\r\n123 213 139\r\n164 238 156\r\n255 255 255\r\n139 74 57\r\n189 90 65\r\n238 106 74\r\n197 172 74\r\n222 197 90\r\n246 238 123\r\n139 123 90\r\n172 197 123\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/kecleon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 255 255\r\n65 98 65\r\n82 139 90\r\n98 180 131\r\n123 213 139\r\n164 238 156\r\n255 255 255\r\n49 131 197\r\n90 172 230\r\n123 197 255\r\n238 156 74\r\n255 180 74\r\n255 255 180\r\n139 123 90\r\n172 197 123\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/kingdra/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n189 222 246\r\n156 189 246\r\n74 156 189\r\n74 74 131\r\n255 0 255\r\n246 106 82\r\n189 57 49\r\n255 255 156\r\n246 230 74\r\n230 172 57\r\n172 106 0\r\n213 213 213\r\n123 123 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/kingdra/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 197 238\r\n213 172 230\r\n156 115 180\r\n106 65 123\r\n255 0 255\r\n131 205 24\r\n82 156 24\r\n255 255 156\r\n246 230 74\r\n230 172 57\r\n172 106 0\r\n213 213 213\r\n123 123 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/kingler/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 156 98\r\n238 106 41\r\n180 98 57\r\n139 49 32\r\n246 213 156\r\n230 189 139\r\n189 139 82\r\n98 74 16\r\n213 164 106\r\n255 16 255\r\n255 16 255\r\n255 16 255\r\n222 222 246\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/kingler/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n180 189 123\r\n139 148 82\r\n98 106 41\r\n57 65 41\r\n222 230 65\r\n197 189 32\r\n156 148 0\r\n115 106 0\r\n180 164 16\r\n255 16 255\r\n255 16 255\r\n255 16 255\r\n222 222 246\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/kirlia/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 164 82\r\n238 238 255\r\n197 205 222\r\n164 180 205\r\n131 148 180\r\n123 82 82\r\n115 41 57\r\n255 156 131\r\n230 82 57\r\n106 123 148\r\n255 255 255\r\n205 255 172\r\n148 230 148\r\n115 189 115\r\n49 123 74\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/kirlia/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 164 82\r\n238 238 255\r\n213 189 222\r\n180 164 205\r\n156 131 180\r\n123 82 82\r\n115 41 57\r\n255 197 90\r\n230 131 32\r\n106 123 148\r\n197 238 246\r\n189 230 255\r\n123 197 238\r\n82 172 213\r\n32 115 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/koffing/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 205 197\r\n255 255 255\r\n222 222 222\r\n246 238 148\r\n213 205 106\r\n238 65 65\r\n197 24 32\r\n255 0 255\r\n255 0 255\r\n238 213 106\r\n197 180 41\r\n222 139 213\r\n189 123 180\r\n156 82 148\r\n106 49 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/koffing/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n222 222 222\r\n246 238 148\r\n213 205 106\r\n255 98 74\r\n213 57 32\r\n255 0 255\r\n255 0 255\r\n205 139 164\r\n148 82 123\r\n164 222 205\r\n148 189 189\r\n106 148 148\r\n41 82 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/krabby/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 197\r\n255 255 255\r\n222 222 222\r\n255 0 255\r\n238 205 148\r\n230 189 123\r\n180 148 65\r\n115 82 16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 156 115\r\n238 82 32\r\n189 82 24\r\n139 32 24\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/krabby/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 197\r\n255 255 255\r\n222 222 222\r\n255 0 255\r\n255 246 205\r\n222 205 164\r\n180 164 123\r\n115 98 57\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 222 74\r\n213 180 32\r\n172 139 0\r\n131 98 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/kyogre/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 205 49\r\n205 189 205\r\n156 139 148\r\n90 82 106\r\n41 82 148\r\n115 41 57\r\n255 8 16\r\n189 32 41\r\n131 205 255\r\n222 222 222\r\n90 164 255\r\n74 131 213\r\n57 98 180\r\n49 57 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/kyogre/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 205 49\r\n222 205 222\r\n156 139 148\r\n90 82 106\r\n164 24 156\r\n115 41 57\r\n255 8 16\r\n189 32 41\r\n255 156 255\r\n246 246 246\r\n255 123 255\r\n230 90 222\r\n197 57 189\r\n131 0 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/lairon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 172 156\r\n74 74 65\r\n106 106 106\r\n139 139 139\r\n172 172 172\r\n57 57 65\r\n123 106 106\r\n156 139 139\r\n189 172 172\r\n222 205 205\r\n255 255 255\r\n172 57 74\r\n222 106 106\r\n255 131 131\r\n106 189 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/lairon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 172 156\r\n32 90 90\r\n65 123 115\r\n90 156 148\r\n148 197 205\r\n74 41 24\r\n123 123 90\r\n156 156 123\r\n189 189 156\r\n222 222 197\r\n255 255 255\r\n172 57 74\r\n222 106 106\r\n255 131 131\r\n255 123 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/lanturn/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n172 172 172\r\n164 205 255\r\n139 172 255\r\n98 139 230\r\n57 106 205\r\n0 82 139\r\n255 238 123\r\n255 230 82\r\n213 180 90\r\n180 139 57\r\n131 82 8\r\n16 16 16\r\n255 115 0\r\n180 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/lanturn/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n172 172 172\r\n230 156 255\r\n205 131 246\r\n164 98 222\r\n131 65 197\r\n106 41 139\r\n255 255 106\r\n238 238 65\r\n180 180 41\r\n139 139 8\r\n90 90 8\r\n16 16 16\r\n255 115 0\r\n205 49 0\r\n"
  },
  {
    "path": "graphics/pokemon/lapras/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 213 172\r\n255 255 255\r\n230 90 41\r\n164 0 0\r\n255 238 148\r\n230 197 106\r\n131 106 49\r\n238 222 213\r\n213 197 189\r\n164 148 139\r\n98 82 90\r\n156 205 246\r\n115 180 230\r\n115 139 197\r\n49 74 106\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/lapras/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n230 90 41\r\n164 0 0\r\n238 205 213\r\n222 172 180\r\n139 82 106\r\n238 222 213\r\n213 197 189\r\n164 148 139\r\n98 82 90\r\n205 189 246\r\n172 156 230\r\n131 98 189\r\n82 65 139\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/larvitar/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n197 238 197\r\n180 222 180\r\n123 172 123\r\n74 98 74\r\n255 0 255\r\n255 164 90\r\n238 82 41\r\n189 57 32\r\n106 32 0\r\n255 0 255\r\n255 0 255\r\n197 197 197\r\n98 98 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/larvitar/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n230 246 82\r\n205 222 74\r\n156 172 41\r\n90 115 0\r\n255 0 255\r\n230 156 172\r\n189 98 131\r\n148 57 98\r\n90 41 65\r\n255 0 255\r\n255 0 255\r\n197 197 197\r\n98 98 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/latias/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n238 238 255\r\n213 213 238\r\n172 164 205\r\n123 115 148\r\n255 205 90\r\n205 164 74\r\n115 172 238\r\n90 106 180\r\n255 164 115\r\n255 255 255\r\n255 106 106\r\n222 90 90\r\n205 74 82\r\n139 49 65\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/latias/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n238 238 255\r\n213 213 238\r\n172 164 205\r\n123 115 148\r\n131 246 65\r\n49 123 24\r\n115 189 255\r\n90 139 180\r\n255 255 90\r\n255 255 255\r\n255 205 41\r\n238 172 0\r\n238 131 0\r\n189 57 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/latios/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n205 205 205\r\n172 172 172\r\n148 139 148\r\n115 106 115\r\n222 222 222\r\n131 74 74\r\n255 106 106\r\n213 74 82\r\n156 205 255\r\n255 255 255\r\n90 164 255\r\n74 131 213\r\n57 98 180\r\n49 57 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/latios/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n246 246 246\r\n213 213 213\r\n180 172 172\r\n148 139 148\r\n246 246 246\r\n180 82 0\r\n230 123 41\r\n255 164 65\r\n189 255 255\r\n255 255 255\r\n172 238 222\r\n74 205 164\r\n32 164 123\r\n0 98 65\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ledian/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 197 131\r\n255 90 32\r\n197 57 16\r\n131 49 16\r\n255 255 189\r\n246 230 115\r\n205 180 57\r\n164 123 0\r\n0 74 164\r\n0 24 115\r\n213 213 213\r\n180 180 180\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ledian/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 222 41\r\n255 164 0\r\n205 123 0\r\n131 74 16\r\n255 255 205\r\n246 238 131\r\n205 189 74\r\n164 131 16\r\n0 74 164\r\n0 24 115\r\n213 213 213\r\n180 180 180\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ledyba/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n246 156 49\r\n238 82 24\r\n180 65 41\r\n123 49 24\r\n255 255 189\r\n246 230 115\r\n205 180 57\r\n164 123 0\r\n0 74 164\r\n0 24 115\r\n205 205 205\r\n180 180 180\r\n115 115 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ledyba/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 222 41\r\n255 164 0\r\n205 123 0\r\n131 74 16\r\n255 255 205\r\n246 238 131\r\n205 189 74\r\n164 131 16\r\n0 74 164\r\n0 24 115\r\n213 213 213\r\n180 180 180\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/lickitung/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n255 255 164\r\n230 213 115\r\n131 123 32\r\n255 164 148\r\n255 131 82\r\n230 74 24\r\n197 32 16\r\n255 0 255\r\n255 205 180\r\n255 164 131\r\n238 106 82\r\n205 82 49\r\n148 16 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/lickitung/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n255 255 164\r\n230 213 115\r\n131 123 32\r\n255 222 148\r\n255 123 131\r\n213 82 90\r\n172 41 49\r\n255 0 255\r\n255 238 123\r\n246 222 106\r\n205 180 65\r\n172 139 24\r\n131 90 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/lileep/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 213 139\r\n230 164 222\r\n180 115 172\r\n139 65 123\r\n98 24 74\r\n255 172 106\r\n238 123 57\r\n189 98 16\r\n255 246 123\r\n255 222 41\r\n230 172 0\r\n213 213 213\r\n172 172 180\r\n115 115 115\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/lileep/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 213 139\r\n148 238 205\r\n115 205 172\r\n82 172 139\r\n32 123 90\r\n255 172 106\r\n238 123 57\r\n189 98 16\r\n255 246 123\r\n255 222 41\r\n230 172 0\r\n213 213 213\r\n172 172 180\r\n115 115 115\r\n41 41 57\r\n"
  },
  {
    "path": "graphics/pokemon/linoone/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 172 115\r\n65 57 32\r\n139 98 65\r\n172 139 115\r\n205 172 139\r\n230 213 197\r\n0 0 0\r\n131 115 90\r\n197 180 148\r\n222 213 180\r\n255 246 246\r\n57 82 131\r\n123 139 222\r\n255 172 180\r\n255 197 205\r\n255 238 255\r\n"
  },
  {
    "path": "graphics/pokemon/linoone/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 172 115\r\n65 57 32\r\n197 98 65\r\n222 131 74\r\n238 164 74\r\n255 238 197\r\n0 0 0\r\n131 115 90\r\n197 180 148\r\n222 213 180\r\n255 246 246\r\n189 139 49\r\n255 205 106\r\n255 172 180\r\n255 197 205\r\n255 238 255\r\n"
  },
  {
    "path": "graphics/pokemon/lombre/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n98 106 65\r\n90 148 106\r\n148 74 57\r\n131 197 148\r\n189 230 180\r\n222 255 197\r\n205 74 49\r\n131 148 65\r\n139 180 49\r\n172 213 57\r\n255 115 65\r\n205 246 82\r\n255 255 255\r\n197 197 205\r\n255 8 57\r\n"
  },
  {
    "path": "graphics/pokemon/lombre/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 205\r\n98 106 65\r\n90 148 106\r\n172 90 41\r\n172 213 57\r\n205 246 82\r\n222 255 197\r\n213 106 57\r\n65 131 139\r\n90 156 164\r\n106 172 180\r\n255 172 90\r\n148 197 205\r\n255 255 255\r\n197 197 205\r\n255 8 57\r\n"
  },
  {
    "path": "graphics/pokemon/lotad/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 213 74\r\n213 172 57\r\n139 115 49\r\n49 65 90\r\n123 213 74\r\n98 189 49\r\n74 172 41\r\n74 139 41\r\n49 74 32\r\n172 255 123\r\n148 180 222\r\n82 139 205\r\n49 115 148\r\n255 255 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/lotad/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 213 74\r\n213 172 57\r\n139 115 49\r\n49 65 90\r\n148 197 205\r\n106 172 180\r\n90 156 164\r\n65 131 139\r\n24 82 98\r\n172 255 123\r\n213 139 156\r\n180 106 123\r\n148 74 90\r\n255 255 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/loudred/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n164 156 222\r\n123 115 180\r\n90 82 139\r\n57 57 106\r\n255 222 90\r\n213 164 24\r\n156 115 24\r\n255 115 82\r\n213 74 49\r\n156 57 24\r\n106 49 24\r\n205 205 205\r\n115 115 115\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/loudred/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 180 197\r\n189 131 164\r\n156 90 139\r\n131 65 106\r\n255 246 131\r\n255 197 49\r\n213 131 16\r\n255 115 82\r\n197 65 49\r\n156 41 24\r\n123 57 0\r\n238 205 213\r\n115 115 115\r\n49 49 65\r\n"
  },
  {
    "path": "graphics/pokemon/ludicolo/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 148 197\r\n74 106 74\r\n106 139 90\r\n156 197 98\r\n164 238 90\r\n205 255 139\r\n246 246 148\r\n213 213 123\r\n180 180 115\r\n255 255 255\r\n205 205 222\r\n197 131 115\r\n246 164 98\r\n139 106 82\r\n213 180 74\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/ludicolo/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 148 197\r\n49 115 106\r\n82 139 131\r\n90 156 148\r\n148 197 205\r\n164 222 222\r\n255 230 156\r\n255 213 106\r\n230 172 90\r\n255 255 255\r\n205 205 222\r\n197 131 115\r\n246 164 98\r\n164 106 82\r\n213 180 74\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/lugia/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 197\r\n255 255 255\r\n222 222 230\r\n189 189 197\r\n156 156 180\r\n98 98 98\r\n123 164 246\r\n90 115 255\r\n0 98 189\r\n0 65 131\r\n238 90 0\r\n156 65 0\r\n156 156 180\r\n98 98 98\r\n16 16 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/lugia/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 197\r\n255 255 255\r\n213 230 255\r\n172 197 230\r\n131 156 197\r\n74 90 139\r\n255 139 172\r\n246 106 148\r\n205 74 123\r\n106 65 82\r\n238 90 0\r\n156 65 0\r\n246 139 139\r\n222 90 98\r\n148 32 41\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/lunatone/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 238 164\r\n230 213 148\r\n213 197 131\r\n197 172 123\r\n172 156 106\r\n156 131 98\r\n139 115 82\r\n123 98 74\r\n98 74 57\r\n82 57 41\r\n238 90 90\r\n213 74 82\r\n189 57 74\r\n164 49 74\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/lunatone/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 238 164\r\n230 213 148\r\n213 197 131\r\n197 172 123\r\n172 156 106\r\n156 131 98\r\n139 115 82\r\n123 98 74\r\n98 74 57\r\n82 57 41\r\n98 148 255\r\n65 115 222\r\n32 82 189\r\n0 49 156\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/luvdisc/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 205 148\r\n115 57 49\r\n164 106 82\r\n255 255 255\r\n222 205 230\r\n230 156 131\r\n205 148 148\r\n255 164 123\r\n246 213 148\r\n90 98 189\r\n90 98 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/luvdisc/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 205 148\r\n115 57 49\r\n164 106 82\r\n255 255 255\r\n222 205 230\r\n246 197 49\r\n246 172 16\r\n255 230 82\r\n255 255 131\r\n90 98 189\r\n90 98 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/machamp/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n238 246 115\r\n205 213 74\r\n164 172 41\r\n115 98 0\r\n255 57 57\r\n189 49 65\r\n82 82 82\r\n255 0 255\r\n230 230 230\r\n197 238 205\r\n172 213 180\r\n131 172 131\r\n57 90 65\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/machamp/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n238 246 115\r\n197 205 74\r\n164 172 41\r\n115 98 0\r\n255 57 57\r\n156 0 0\r\n82 82 82\r\n255 0 255\r\n213 213 213\r\n180 197 131\r\n139 156 90\r\n98 115 49\r\n57 74 8\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/machoke/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n238 246 115\r\n205 189 74\r\n180 164 65\r\n98 74 8\r\n255 0 255\r\n238 49 49\r\n197 0 0\r\n156 0 0\r\n222 222 222\r\n205 197 246\r\n172 164 213\r\n131 123 156\r\n65 65 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/machoke/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n238 246 115\r\n197 205 74\r\n164 172 41\r\n115 98 0\r\n255 0 255\r\n115 156 222\r\n74 115 180\r\n16 57 123\r\n222 230 172\r\n180 189 131\r\n139 148 90\r\n98 106 49\r\n57 65 8\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/machop/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n230 197 115\r\n197 180 57\r\n189 172 57\r\n98 106 16\r\n255 0 255\r\n255 57 57\r\n197 0 0\r\n156 0 0\r\n213 213 213\r\n189 222 197\r\n164 197 172\r\n123 148 131\r\n49 74 57\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/machop/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n238 246 115\r\n197 205 74\r\n164 172 41\r\n98 106 16\r\n255 0 255\r\n255 57 57\r\n197 0 0\r\n156 0 0\r\n255 246 189\r\n222 205 148\r\n180 164 106\r\n139 123 65\r\n98 82 24\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/magby/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 197 131\r\n255 123 98\r\n213 82 57\r\n148 49 32\r\n255 0 255\r\n255 255 180\r\n246 213 57\r\n213 172 0\r\n172 131 0\r\n255 0 255\r\n255 0 255\r\n197 197 197\r\n115 115 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/magby/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 246 115\r\n255 213 41\r\n230 131 49\r\n148 65 32\r\n255 0 255\r\n255 255 238\r\n255 246 148\r\n238 205 90\r\n197 123 65\r\n255 0 255\r\n255 0 255\r\n197 197 197\r\n115 115 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/magcargo/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 189 106\r\n255 131 74\r\n222 90 32\r\n148 32 0\r\n255 213 115\r\n255 238 156\r\n255 213 115\r\n255 197 0\r\n164 106 90\r\n172 172 172\r\n131 131 131\r\n98 98 98\r\n65 65 65\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/magcargo/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 180 238\r\n205 148 197\r\n172 98 172\r\n106 65 139\r\n255 180 238\r\n255 230 255\r\n255 180 238\r\n255 180 238\r\n139 74 106\r\n213 98 74\r\n156 82 57\r\n106 49 41\r\n74 41 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/magikarp/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 123 197\r\n255 255 255\r\n222 222 230\r\n172 172 189\r\n115 115 139\r\n16 16 16\r\n238 255 131\r\n238 213 98\r\n131 106 16\r\n255 180 148\r\n255 123 90\r\n197 49 49\r\n255 172 115\r\n255 106 32\r\n222 74 74\r\n139 8 0\r\n"
  },
  {
    "path": "graphics/pokemon/magikarp/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n222 222 230\r\n172 172 189\r\n115 115 139\r\n16 16 16\r\n238 255 131\r\n222 197 90\r\n131 106 16\r\n255 255 172\r\n255 230 49\r\n246 189 82\r\n255 255 98\r\n255 222 32\r\n230 164 41\r\n156 82 41\r\n"
  },
  {
    "path": "graphics/pokemon/magmar/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n213 213 213\r\n106 106 106\r\n41 41 41\r\n255 0 255\r\n255 0 255\r\n255 246 98\r\n255 213 0\r\n222 164 32\r\n139 98 8\r\n255 164 65\r\n255 74 8\r\n205 41 65\r\n139 8 0\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/magmar/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n213 213 213\r\n106 106 106\r\n41 41 41\r\n255 0 255\r\n255 0 255\r\n255 238 255\r\n255 197 213\r\n205 156 172\r\n123 74 90\r\n255 164 172\r\n238 123 131\r\n213 82 90\r\n164 41 49\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/magnemite/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n230 230 230\r\n255 98 65\r\n205 49 49\r\n82 205 246\r\n41 131 172\r\n180 180 180\r\n139 139 139\r\n98 82 82\r\n57 49 49\r\n213 246 222\r\n180 213 189\r\n148 189 156\r\n90 131 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/magnemite/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n213 213 213\r\n82 74 74\r\n57 49 49\r\n82 74 74\r\n57 49 49\r\n180 180 180\r\n139 139 139\r\n82 74 74\r\n57 49 49\r\n238 238 189\r\n197 197 148\r\n156 156 106\r\n115 115 65\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/magneton/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n222 222 222\r\n255 98 57\r\n213 41 49\r\n82 205 246\r\n57 148 172\r\n180 180 180\r\n139 139 139\r\n82 74 74\r\n57 49 49\r\n213 246 222\r\n180 213 189\r\n148 189 156\r\n90 131 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/magneton/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n213 213 213\r\n106 98 98\r\n57 49 49\r\n106 98 98\r\n57 49 49\r\n180 180 180\r\n139 139 139\r\n82 74 74\r\n57 49 49\r\n255 246 230\r\n238 222 197\r\n197 180 156\r\n156 139 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/makuhita/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n156 156 164\r\n131 131 148\r\n90 90 115\r\n49 57 90\r\n255 213 82\r\n238 189 49\r\n205 156 82\r\n255 90 74\r\n205 82 65\r\n156 82 65\r\n0 0 0\r\n255 230 123\r\n123 90 57\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/makuhita/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n255 90 74\r\n205 82 65\r\n156 82 65\r\n123 49 32\r\n255 230 156\r\n255 205 98\r\n230 164 82\r\n255 90 74\r\n205 82 65\r\n156 82 65\r\n0 0 0\r\n255 246 189\r\n123 90 57\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/manectric/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 197\r\n57 65 74\r\n82 90 131\r\n115 131 197\r\n139 172 238\r\n255 255 74\r\n222 230 106\r\n180 197 106\r\n139 123 65\r\n172 32 16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n197 197 230\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/manectric/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 197\r\n41 41 57\r\n57 65 82\r\n115 106 123\r\n148 139 156\r\n255 222 131\r\n230 197 98\r\n197 156 90\r\n164 123 57\r\n82 106 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n197 197 230\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/mankey/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n222 222 222\r\n255 230 189\r\n238 180 139\r\n238 115 98\r\n189 74 49\r\n16 16 16\r\n255 197 131\r\n222 164 115\r\n197 123 74\r\n115 65 0\r\n255 246 205\r\n246 222 180\r\n213 189 156\r\n106 74 41\r\n"
  },
  {
    "path": "graphics/pokemon/mankey/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n222 222 222\r\n255 230 189\r\n238 180 139\r\n230 139 98\r\n189 74 49\r\n16 16 16\r\n238 197 139\r\n197 156 98\r\n156 115 57\r\n98 57 0\r\n213 230 148\r\n180 197 115\r\n139 156 74\r\n82 98 16\r\n"
  },
  {
    "path": "graphics/pokemon/mantine/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n148 164 213\r\n90 106 139\r\n41 65 98\r\n24 41 74\r\n255 0 255\r\n205 230 255\r\n180 205 255\r\n156 164 197\r\n246 230 246\r\n230 205 230\r\n213 189 205\r\n164 148 164\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/mantine/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n164 205 238\r\n123 156 238\r\n74 98 197\r\n16 49 148\r\n255 0 255\r\n205 230 255\r\n180 205 255\r\n156 189 213\r\n230 246 255\r\n205 230 255\r\n172 205 238\r\n139 164 205\r\n74 82 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/mareep/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 238 131\r\n230 197 98\r\n197 148 41\r\n139 90 24\r\n74 180 230\r\n32 148 189\r\n0 74 148\r\n0 32 106\r\n255 222 0\r\n230 172 0\r\n180 123 0\r\n164 164 164\r\n82 82 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/mareep/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 213 205\r\n238 148 180\r\n222 90 131\r\n172 65 90\r\n74 180 230\r\n32 148 189\r\n0 74 148\r\n0 32 106\r\n255 222 0\r\n230 172 0\r\n180 123 0\r\n164 164 164\r\n82 82 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/marill/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n222 230 222\r\n156 156 156\r\n98 98 98\r\n16 16 16\r\n156 189 255\r\n106 148 255\r\n74 115 255\r\n49 65 90\r\n57 90 189\r\n255 0 255\r\n246 131 0\r\n213 74 0\r\n148 24 0\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/marill/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n222 230 222\r\n156 156 156\r\n98 98 98\r\n16 16 16\r\n156 255 156\r\n123 230 131\r\n90 205 106\r\n49 123 65\r\n49 164 74\r\n255 0 255\r\n255 115 148\r\n213 74 115\r\n164 41 57\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/marowak/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n230 230 213\r\n197 197 172\r\n139 139 106\r\n82 82 57\r\n16 16 16\r\n197 57 16\r\n255 222 180\r\n246 197 148\r\n238 164 106\r\n164 106 65\r\n222 189 106\r\n197 156 74\r\n164 115 49\r\n98 57 24\r\n"
  },
  {
    "path": "graphics/pokemon/marowak/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n230 230 213\r\n197 197 172\r\n139 139 106\r\n82 82 57\r\n16 16 16\r\n197 57 16\r\n255 222 180\r\n246 197 148\r\n230 148 82\r\n189 115 57\r\n213 222 139\r\n172 180 98\r\n131 139 57\r\n65 74 0\r\n"
  },
  {
    "path": "graphics/pokemon/marshtomp/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n222 222 255\r\n197 197 238\r\n172 172 213\r\n131 131 156\r\n255 164 82\r\n246 123 57\r\n205 98 32\r\n164 123 90\r\n255 255 255\r\n172 238 238\r\n148 213 213\r\n106 189 189\r\n98 148 156\r\n90 90 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/marshtomp/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n238 238 255\r\n213 213 238\r\n189 189 213\r\n148 148 156\r\n255 230 156\r\n255 180 65\r\n205 131 24\r\n164 123 90\r\n255 255 255\r\n246 205 246\r\n230 172 246\r\n205 123 230\r\n156 106 172\r\n106 49 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/masquerain/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n65 65 90\r\n148 164 197\r\n180 205 238\r\n197 238 238\r\n106 74 32\r\n205 139 49\r\n255 156 74\r\n222 222 205\r\n255 255 255\r\n90 16 8\r\n131 65 32\r\n172 16 8\r\n222 57 32\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/masquerain/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n49 123 74\r\n98 180 98\r\n148 230 148\r\n205 255 172\r\n82 74 32\r\n106 106 49\r\n164 148 115\r\n222 222 41\r\n255 255 41\r\n90 16 8\r\n131 65 32\r\n172 16 8\r\n222 57 32\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/mawile/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n205 205 205\r\n213 131 172\r\n189 98 139\r\n156 74 106\r\n0 0 0\r\n255 222 139\r\n255 197 90\r\n213 156 74\r\n156 123 57\r\n0 0 0\r\n197 197 197\r\n164 164 164\r\n131 131 131\r\n82 82 82\r\n"
  },
  {
    "path": "graphics/pokemon/mawile/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n205 205 205\r\n255 123 82\r\n222 98 49\r\n180 65 49\r\n0 0 0\r\n255 222 139\r\n255 197 90\r\n213 156 74\r\n156 123 57\r\n0 0 0\r\n238 156 197\r\n205 123 164\r\n164 90 131\r\n131 49 90\r\n"
  },
  {
    "path": "graphics/pokemon/medicham/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 213 139\r\n255 255 255\r\n255 156 148\r\n230 123 123\r\n205 90 82\r\n123 82 74\r\n0 0 0\r\n164 139 106\r\n164 164 164\r\n131 131 131\r\n255 230 131\r\n255 205 90\r\n238 238 213\r\n213 213 197\r\n189 189 172\r\n139 139 123\r\n"
  },
  {
    "path": "graphics/pokemon/medicham/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 213 139\r\n255 255 255\r\n139 189 246\r\n98 148 205\r\n74 115 172\r\n74 90 115\r\n0 0 0\r\n164 139 106\r\n164 164 164\r\n131 131 131\r\n255 230 131\r\n255 205 90\r\n238 205 164\r\n230 172 139\r\n205 148 115\r\n123 90 74\r\n"
  },
  {
    "path": "graphics/pokemon/meditite/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 189 139\r\n255 255 255\r\n238 230 230\r\n205 197 197\r\n148 123 123\r\n255 131 106\r\n230 90 57\r\n180 65 49\r\n180 57 90\r\n115 41 65\r\n0 0 0\r\n197 222 255\r\n139 189 246\r\n98 148 205\r\n74 115 172\r\n74 90 115\r\n"
  },
  {
    "path": "graphics/pokemon/meditite/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 189 139\r\n255 255 255\r\n246 230 238\r\n213 189 205\r\n164 115 123\r\n255 131 106\r\n255 139 57\r\n180 65 49\r\n180 57 90\r\n115 41 65\r\n0 0 0\r\n255 131 106\r\n230 90 57\r\n180 65 49\r\n180 57 90\r\n115 41 65\r\n"
  },
  {
    "path": "graphics/pokemon/meganium/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n189 255 123\r\n156 230 82\r\n106 189 49\r\n32 139 16\r\n98 74 0\r\n246 164 156\r\n255 57 90\r\n205 32 57\r\n123 16 57\r\n205 205 205\r\n106 106 106\r\n16 16 16\r\n255 222 32\r\n230 172 0\r\n"
  },
  {
    "path": "graphics/pokemon/meganium/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 255 98\r\n246 230 41\r\n213 197 16\r\n131 115 8\r\n74 57 0\r\n255 180 65\r\n255 123 16\r\n205 74 0\r\n139 74 0\r\n205 205 205\r\n106 106 106\r\n16 16 16\r\n255 222 32\r\n230 172 0\r\n"
  },
  {
    "path": "graphics/pokemon/meowth/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 255 148\r\n255 213 0\r\n205 164 0\r\n255 115 82\r\n213 90 57\r\n16 16 16\r\n230 230 230\r\n238 156 49\r\n205 123 16\r\n148 65 0\r\n255 255 180\r\n255 230 131\r\n230 180 65\r\n156 106 0\r\n"
  },
  {
    "path": "graphics/pokemon/meowth/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 255 148\r\n255 213 0\r\n205 164 0\r\n255 115 82\r\n213 90 57\r\n16 16 16\r\n230 230 230\r\n255 123 139\r\n222 82 98\r\n139 41 57\r\n255 238 148\r\n255 197 106\r\n213 156 65\r\n131 74 0\r\n"
  },
  {
    "path": "graphics/pokemon/metagross/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n205 205 205\r\n172 172 172\r\n148 139 148\r\n115 106 115\r\n222 222 222\r\n131 74 74\r\n255 106 106\r\n213 74 82\r\n131 205 255\r\n197 222 255\r\n90 164 255\r\n74 131 213\r\n57 98 180\r\n49 57 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/metagross/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n238 172 82\r\n205 139 49\r\n172 106 16\r\n139 74 0\r\n255 205 115\r\n131 74 74\r\n255 106 106\r\n213 74 82\r\n238 238 246\r\n255 255 255\r\n213 213 222\r\n172 172 180\r\n139 131 139\r\n98 90 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/metang/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n205 205 205\r\n172 172 172\r\n148 139 148\r\n115 106 115\r\n222 222 222\r\n131 74 74\r\n255 106 106\r\n213 74 82\r\n131 205 255\r\n255 255 255\r\n90 164 255\r\n74 131 213\r\n57 98 180\r\n49 57 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/metang/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n238 172 82\r\n205 139 49\r\n172 106 16\r\n139 74 0\r\n255 205 115\r\n156 65 65\r\n255 106 106\r\n255 74 82\r\n238 238 246\r\n255 255 255\r\n213 213 222\r\n172 172 180\r\n123 115 123\r\n82 74 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/metapod/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n189 255 115\r\n156 213 74\r\n115 172 49\r\n82 98 41\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n197 197 197\r\n16 16 16\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/metapod/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 197 139\r\n255 148 106\r\n230 98 74\r\n131 65 32\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n197 197 197\r\n16 16 16\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/mew/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n213 213 213\r\n24 90 164\r\n82 180 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n222 148 131\r\n246 213 230\r\n255 197 205\r\n255 164 148\r\n213 74 82\r\n156 57 57\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/mew/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n213 213 213\r\n24 90 164\r\n74 148 213\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n139 180 246\r\n230 246 255\r\n197 238 255\r\n164 213 246\r\n82 139 205\r\n74 115 180\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/mewtwo/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 213 213\r\n230 230 246\r\n189 189 213\r\n139 139 180\r\n82 82 106\r\n230 180 255\r\n180 131 213\r\n139 90 172\r\n115 49 148\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/mewtwo/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 213 213\r\n230 230 230\r\n180 180 180\r\n148 148 148\r\n74 74 57\r\n189 238 90\r\n148 205 65\r\n90 148 32\r\n65 90 41\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/mightyena/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n57 164 164\r\n0 0 0\r\n0 0 0\r\n172 172 180\r\n148 139 156\r\n74 82 106\r\n49 49 65\r\n32 32 41\r\n222 230 238\r\n197 205 213\r\n255 197 90\r\n172 123 90\r\n222 57 57\r\n164 16 16\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/mightyena/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n57 164 164\r\n0 0 0\r\n0 0 0\r\n255 205 106\r\n213 172 74\r\n164 123 82\r\n131 90 57\r\n98 57 16\r\n255 238 172\r\n255 222 123\r\n255 255 255\r\n172 123 90\r\n74 98 172\r\n49 57 115\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/milotic/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n246 246 148\r\n115 57 49\r\n164 106 82\r\n222 189 156\r\n255 213 180\r\n255 230 213\r\n148 172 197\r\n139 197 255\r\n213 98 65\r\n238 131 90\r\n180 82 65\r\n230 131 139\r\n255 164 131\r\n106 98 123\r\n246 246 238\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/milotic/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n246 246 148\r\n115 57 49\r\n164 106 82\r\n222 189 156\r\n255 213 180\r\n255 238 222\r\n222 197 0\r\n255 230 32\r\n148 156 205\r\n180 189 238\r\n90 98 148\r\n230 131 139\r\n255 164 131\r\n106 98 123\r\n246 246 238\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/miltank/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 213 222\r\n255 172 164\r\n213 123 115\r\n139 74 74\r\n255 230 156\r\n238 197 123\r\n197 156 82\r\n148 106 32\r\n0 82 255\r\n164 164 164\r\n90 90 90\r\n49 49 49\r\n24 24 32\r\n180 57 98\r\n"
  },
  {
    "path": "graphics/pokemon/miltank/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n246 246 238\r\n230 238 238\r\n156 172 189\r\n90 98 131\r\n255 255 255\r\n222 213 197\r\n172 156 115\r\n139 106 74\r\n0 82 255\r\n213 74 49\r\n139 57 32\r\n90 24 16\r\n41 24 24\r\n238 106 115\r\n"
  },
  {
    "path": "graphics/pokemon/minun/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 246 222\r\n255 238 197\r\n238 213 131\r\n189 172 131\r\n123 115 82\r\n98 156 255\r\n90 123 230\r\n49 90 131\r\n238 82 57\r\n41 49 65\r\n98 98 115\r\n65 65 98\r\n148 148 148\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/minun/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 246 222\r\n255 238 164\r\n255 213 106\r\n205 148 82\r\n139 82 16\r\n148 197 205\r\n82 139 131\r\n49 115 106\r\n238 82 57\r\n41 49 65\r\n98 98 115\r\n65 65 98\r\n148 148 148\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/misdreavus/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n16 16 16\r\n41 74 65\r\n74 106 115\r\n115 156 148\r\n148 189 180\r\n255 0 246\r\n255 246 82\r\n172 16 74\r\n238 90 148\r\n255 213 197\r\n123 32 0\r\n189 32 24\r\n255 90 41\r\n255 148 189\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/misdreavus/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n16 16 16\r\n98 82 16\r\n156 139 49\r\n213 197 98\r\n246 230 123\r\n255 0 255\r\n255 246 82\r\n82 65 32\r\n230 189 65\r\n255 230 106\r\n123 41 8\r\n172 57 24\r\n255 90 41\r\n255 197 49\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/moltres/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n222 222 222\r\n180 0 0\r\n255 213 156\r\n255 148 74\r\n255 98 0\r\n238 0 0\r\n238 172 74\r\n205 123 32\r\n131 49 0\r\n255 246 65\r\n255 222 16\r\n255 172 0\r\n189 82 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/moltres/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n222 222 222\r\n180 0 0\r\n255 213 156\r\n255 148 74\r\n255 98 0\r\n189 49 41\r\n255 115 90\r\n205 49 32\r\n164 16 32\r\n255 222 205\r\n255 172 164\r\n230 115 106\r\n172 57 57\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/mr_mime/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 180\r\n205 213 222\r\n131 131 172\r\n65 74 123\r\n41 49 74\r\n255 148 139\r\n238 74 57\r\n189 74 57\r\n123 41 41\r\n255 230 222\r\n255 205 197\r\n230 164 156\r\n106 65 57\r\n189 123 106\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/mr_mime/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 180\r\n205 213 222\r\n131 131 172\r\n65 74 123\r\n41 49 74\r\n180 230 82\r\n139 189 41\r\n98 148 0\r\n41 90 0\r\n255 238 238\r\n255 205 205\r\n230 172 172\r\n139 90 82\r\n189 123 106\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/mudkip/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n180 189 246\r\n156 172 222\r\n139 156 180\r\n123 115 123\r\n255 180 82\r\n246 156 65\r\n205 131 65\r\n164 123 90\r\n197 205 255\r\n255 255 255\r\n123 197 255\r\n90 172 230\r\n49 131 197\r\n74 74 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/mudkip/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 238 156\r\n255 205 106\r\n230 172 90\r\n213 156 74\r\n255 180 82\r\n246 156 65\r\n205 131 65\r\n164 123 90\r\n255 246 197\r\n255 255 255\r\n222 156 238\r\n197 115 222\r\n139 82 156\r\n106 49 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/muk/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 238 222\r\n238 222 238\r\n230 189 222\r\n197 156 180\r\n148 106 156\r\n90 49 115\r\n213 213 222\r\n172 180 189\r\n131 139 156\r\n65 74 90\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/muk/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n238 238 238\r\n197 246 156\r\n180 230 148\r\n139 189 106\r\n98 148 65\r\n57 106 24\r\n213 213 222\r\n172 180 189\r\n131 139 156\r\n65 74 90\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/murkrow/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 172 139\r\n238 57 65\r\n172 16 32\r\n41 65 65\r\n57 82 82\r\n82 106 106\r\n139 164 164\r\n255 0 255\r\n106 74 16\r\n156 123 32\r\n213 180 41\r\n255 255 82\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/murkrow/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 172 139\r\n238 57 65\r\n172 16 32\r\n98 41 90\r\n156 57 139\r\n197 90 164\r\n238 131 197\r\n255 0 255\r\n106 74 16\r\n156 123 32\r\n213 180 41\r\n255 255 82\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/natu/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n156 230 74\r\n82 197 74\r\n74 148 65\r\n49 98 41\r\n255 222 65\r\n205 172 57\r\n131 98 32\r\n255 74 0\r\n205 57 0\r\n131 41 0\r\n205 205 205\r\n148 148 148\r\n82 82 82\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/natu/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n189 255 65\r\n164 230 49\r\n115 189 8\r\n65 106 0\r\n255 222 65\r\n189 148 32\r\n139 90 0\r\n255 164 57\r\n213 106 16\r\n115 74 0\r\n205 205 205\r\n148 148 148\r\n82 82 82\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/nidoking/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 180 213\r\n255 255 255\r\n230 230 213\r\n197 197 164\r\n115 115 90\r\n255 0 255\r\n255 0 255\r\n197 115 189\r\n65 197 180\r\n41 148 123\r\n0 98 74\r\n230 180 238\r\n213 123 230\r\n164 90 156\r\n106 49 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/nidoking/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 164 115\r\n255 255 255\r\n230 230 213\r\n197 197 164\r\n115 115 90\r\n255 0 255\r\n255 0 255\r\n74 164 222\r\n189 139 172\r\n123 98 115\r\n74 49 65\r\n139 222 255\r\n98 180 255\r\n57 123 213\r\n57 82 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/nidoqueen/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n213 213 213\r\n238 230 164\r\n230 205 139\r\n189 172 90\r\n115 90 41\r\n255 156 139\r\n230 65 49\r\n172 16 0\r\n222 255 255\r\n156 213 222\r\n90 180 205\r\n106 139 172\r\n57 82 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/nidoqueen/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n213 213 213\r\n255 213 230\r\n238 180 205\r\n197 148 172\r\n139 98 115\r\n255 156 139\r\n238 74 57\r\n172 16 0\r\n205 205 139\r\n172 172 106\r\n139 139 74\r\n106 98 41\r\n65 57 8\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/nidoran_f/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 189\r\n222 255 255\r\n197 230 238\r\n148 205 189\r\n90 164 148\r\n74 98 98\r\n255 82 65\r\n189 49 74\r\n65 139 230\r\n82 139 180\r\n57 106 148\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 255 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/nidoran_f/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 189\r\n246 213 255\r\n213 180 238\r\n180 148 205\r\n148 115 172\r\n98 65 123\r\n238 74 57\r\n197 32 16\r\n98 139 65\r\n65 106 32\r\n32 74 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 255 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/nidoran_m/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n16 16 16\r\n255 106 82\r\n222 65 41\r\n180 24 0\r\n24 205 156\r\n0 164 115\r\n0 98 65\r\n255 0 255\r\n238 189 238\r\n230 156 213\r\n189 98 189\r\n98 65 106\r\n205 205 205\r\n131 131 131\r\n"
  },
  {
    "path": "graphics/pokemon/nidoran_m/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n16 16 16\r\n255 106 82\r\n222 65 41\r\n180 24 0\r\n180 131 131\r\n148 90 98\r\n106 49 57\r\n255 0 255\r\n172 222 255\r\n164 189 255\r\n115 156 213\r\n57 90 156\r\n197 197 197\r\n131 131 131\r\n"
  },
  {
    "path": "graphics/pokemon/nidorina/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n213 213 213\r\n131 131 131\r\n74 131 246\r\n16 98 180\r\n24 57 115\r\n255 156 139\r\n238 74 57\r\n197 32 16\r\n222 255 255\r\n197 230 238\r\n139 197 205\r\n90 148 180\r\n57 90 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/nidorina/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n197 197 197\r\n131 131 131\r\n115 139 90\r\n82 106 57\r\n41 65 16\r\n255 156 139\r\n238 74 57\r\n197 32 16\r\n255 213 255\r\n246 180 238\r\n213 148 205\r\n164 90 131\r\n106 49 74\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/nidorino/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n255 106 82\r\n222 65 41\r\n180 24 0\r\n57 238 189\r\n74 205 164\r\n0 164 115\r\n255 0 255\r\n16 16 16\r\n230 172 238\r\n222 148 205\r\n172 123 189\r\n106 65 123\r\n197 197 197\r\n131 131 131\r\n"
  },
  {
    "path": "graphics/pokemon/nidorino/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n255 106 82\r\n222 65 41\r\n180 24 0\r\n180 131 131\r\n148 90 98\r\n106 49 57\r\n255 0 255\r\n16 16 16\r\n172 222 255\r\n164 189 255\r\n115 156 213\r\n57 90 156\r\n197 197 197\r\n131 131 131\r\n"
  },
  {
    "path": "graphics/pokemon/nincada/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 180 115\r\n230 213 213\r\n205 164 106\r\n172 139 98\r\n156 115 82\r\n131 197 106\r\n98 164 106\r\n115 74 57\r\n246 238 230\r\n74 123 90\r\n205 189 180\r\n180 172 148\r\n156 139 123\r\n123 115 98\r\n90 82 82\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/nincada/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 180 115\r\n255 238 164\r\n205 164 106\r\n172 139 98\r\n156 115 82\r\n156 213 74\r\n115 172 49\r\n115 74 57\r\n246 238 230\r\n82 98 41\r\n255 213 106\r\n230 172 90\r\n205 148 65\r\n180 123 41\r\n131 90 8\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/ninetales/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n255 106 41\r\n222 32 16\r\n180 16 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n238 222 115\r\n205 156 98\r\n255 238 180\r\n246 230 115\r\n230 197 106\r\n131 106 41\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ninetales/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n255 106 41\r\n222 32 16\r\n180 16 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n205 180 180\r\n156 131 123\r\n246 230 222\r\n230 205 213\r\n189 164 172\r\n131 106 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ninjask/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 180 115\r\n255 255 255\r\n246 213 82\r\n222 172 82\r\n139 106 65\r\n246 106 16\r\n180 57 32\r\n131 57 57\r\n222 74 16\r\n213 213 205\r\n172 180 180\r\n139 148 148\r\n123 123 123\r\n90 90 123\r\n65 65 90\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/ninjask/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 180 115\r\n255 255 255\r\n246 213 82\r\n222 172 82\r\n139 106 65\r\n246 106 16\r\n180 57 32\r\n131 57 57\r\n222 74 16\r\n255 213 106\r\n255 213 106\r\n230 172 90\r\n205 148 65\r\n180 123 41\r\n131 90 8\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/noctowl/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 255 172\r\n230 205 98\r\n205 164 65\r\n156 115 57\r\n156 123 106\r\n123 90 74\r\n98 65 49\r\n74 41 24\r\n197 49 24\r\n156 0 0\r\n197 197 197\r\n115 115 115\r\n255 238 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/noctowl/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n246 255 172\r\n213 222 90\r\n189 189 57\r\n156 148 32\r\n213 164 74\r\n180 115 0\r\n123 82 0\r\n82 57 0\r\n197 49 24\r\n156 0 0\r\n197 197 197\r\n115 115 115\r\n238 246 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/nosepass/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n57 57 82\r\n197 197 197\r\n98 115 123\r\n131 148 164\r\n148 189 180\r\n189 213 222\r\n139 57 24\r\n205 90 24\r\n246 139 41\r\n255 197 164\r\n255 255 255\r\n74 82 82\r\n0 0 0\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/nosepass/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 172 213\r\n106 74 57\r\n197 197 197\r\n106 82 49\r\n172 139 65\r\n222 180 74\r\n246 213 115\r\n189 57 24\r\n230 90 24\r\n246 139 41\r\n255 197 164\r\n255 255 255\r\n82 57 24\r\n0 0 0\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/numel/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 148 246\r\n106 98 32\r\n246 222 0\r\n205 180 57\r\n222 205 32\r\n246 246 164\r\n213 213 148\r\n255 238 106\r\n148 222 24\r\n180 246 49\r\n115 164 57\r\n90 115 106\r\n148 148 82\r\n230 222 238\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/numel/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 197 180\r\n131 98 74\r\n238 197 156\r\n197 156 98\r\n205 164 123\r\n246 246 213\r\n213 213 172\r\n255 222 172\r\n90 172 230\r\n123 197 255\r\n49 131 197\r\n74 98 90\r\n131 131 65\r\n230 222 238\r\n255 255 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/nuzleaf/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 148 246\r\n74 57 65\r\n205 205 238\r\n255 255 255\r\n123 148 82\r\n180 205 131\r\n230 238 180\r\n156 123 156\r\n205 156 98\r\n230 197 148\r\n98 197 131\r\n148 238 131\r\n65 115 57\r\n106 82 98\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/nuzleaf/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n180 213 156\r\n74 57 65\r\n205 205 238\r\n255 255 255\r\n180 65 49\r\n222 98 49\r\n255 123 82\r\n115 90 90\r\n156 123 123\r\n189 164 156\r\n98 197 131\r\n148 238 131\r\n65 115 57\r\n106 82 98\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/octillery/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 180 106\r\n246 106 49\r\n213 57 16\r\n131 0 0\r\n255 0 255\r\n255 255 172\r\n255 213 82\r\n213 156 41\r\n148 90 0\r\n213 213 213\r\n172 172 180\r\n123 123 131\r\n90 90 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/octillery/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n230 189 90\r\n197 156 65\r\n148 106 24\r\n82 65 49\r\n255 0 255\r\n230 255 172\r\n205 230 82\r\n164 172 41\r\n98 98 0\r\n213 213 213\r\n172 172 180\r\n123 123 131\r\n90 90 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/oddish/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n180 41 49\r\n230 74 65\r\n197 230 123\r\n156 213 74\r\n115 172 49\r\n74 90 32\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n148 180 197\r\n115 148 164\r\n74 106 131\r\n41 57 74\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/oddish/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n180 41 49\r\n230 74 65\r\n197 238 16\r\n172 222 16\r\n156 189 16\r\n98 131 49\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n139 222 57\r\n115 197 32\r\n65 164 32\r\n0 74 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/omanyte/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 189\r\n255 255 255\r\n230 230 230\r\n255 0 255\r\n255 0 255\r\n98 98 98\r\n16 16 16\r\n255 255 172\r\n238 230 139\r\n205 197 106\r\n172 164 74\r\n98 90 16\r\n131 205 197\r\n98 172 164\r\n57 131 123\r\n16 90 82\r\n"
  },
  {
    "path": "graphics/pokemon/omanyte/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 189\r\n255 255 255\r\n230 230 230\r\n255 0 255\r\n255 0 255\r\n98 98 98\r\n16 16 16\r\n255 246 156\r\n246 222 139\r\n213 189 115\r\n172 148 82\r\n123 98 41\r\n213 156 238\r\n172 115 205\r\n131 74 172\r\n90 41 148\r\n"
  },
  {
    "path": "graphics/pokemon/omastar/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 197\r\n255 238 180\r\n246 213 98\r\n180 156 65\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 255 172\r\n238 230 139\r\n205 197 106\r\n172 164 74\r\n106 98 16\r\n156 230 222\r\n131 205 197\r\n98 172 164\r\n16 98 90\r\n"
  },
  {
    "path": "graphics/pokemon/omastar/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 197\r\n255 238 180\r\n246 213 98\r\n180 156 65\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 255 222\r\n238 246 90\r\n213 222 74\r\n172 180 57\r\n98 106 24\r\n222 172 255\r\n189 139 238\r\n148 98 205\r\n98 49 164\r\n"
  },
  {
    "path": "graphics/pokemon/onix/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 222 205\r\n255 255 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n238 230 230\r\n222 213 213\r\n189 180 180\r\n123 131 106\r\n82 74 74\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/onix/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n230 230 156\r\n205 205 131\r\n164 164 90\r\n123 123 49\r\n82 82 8\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/paras/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 246 255\r\n230 230 230\r\n164 164 164\r\n255 246 90\r\n222 213 57\r\n255 123 123\r\n230 57 57\r\n180 8 8\r\n255 0 255\r\n255 172 98\r\n238 139 49\r\n189 131 49\r\n131 82 32\r\n255 0 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/paras/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 246 255\r\n230 230 230\r\n164 164 164\r\n255 255 205\r\n246 238 115\r\n255 213 65\r\n238 156 49\r\n139 115 16\r\n255 0 255\r\n230 139 32\r\n197 106 32\r\n148 74 32\r\n106 41 0\r\n255 0 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/parasect/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 246 255\r\n213 213 213\r\n156 139 164\r\n255 213 82\r\n213 205 49\r\n255 106 106\r\n238 49 49\r\n197 49 57\r\n139 8 8\r\n255 0 255\r\n255 131 82\r\n222 106 49\r\n180 65 49\r\n106 24 8\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/parasect/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 246 255\r\n230 230 230\r\n164 164 164\r\n255 246 90\r\n213 205 49\r\n255 213 90\r\n255 172 49\r\n213 131 8\r\n156 74 0\r\n255 0 255\r\n255 189 82\r\n213 148 41\r\n172 106 0\r\n131 65 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/pelipper/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 189 139\r\n131 90 65\r\n230 172 90\r\n255 213 98\r\n255 238 156\r\n82 82 90\r\n148 213 230\r\n57 156 180\r\n115 189 213\r\n222 222 238\r\n246 246 255\r\n139 65 90\r\n189 139 57\r\n0 0 0\r\n156 156 172\r\n32 98 123\r\n"
  },
  {
    "path": "graphics/pokemon/pelipper/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 189 139\r\n131 90 65\r\n238 189 90\r\n255 230 106\r\n255 238 189\r\n82 82 90\r\n156 238 123\r\n90 156 57\r\n123 205 90\r\n230 205 255\r\n246 246 255\r\n139 65 90\r\n189 139 57\r\n0 0 0\r\n156 156 172\r\n32 98 123\r\n"
  },
  {
    "path": "graphics/pokemon/persian/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n222 222 222\r\n16 16 16\r\n255 189 156\r\n246 82 65\r\n164 16 0\r\n189 164 74\r\n148 123 32\r\n115 90 16\r\n255 0 255\r\n255 0 255\r\n255 255 172\r\n255 230 131\r\n222 180 82\r\n131 82 0\r\n"
  },
  {
    "path": "graphics/pokemon/persian/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n222 222 222\r\n16 16 16\r\n255 123 82\r\n222 98 49\r\n180 65 49\r\n255 189 205\r\n230 123 180\r\n148 57 98\r\n255 0 255\r\n255 0 255\r\n255 255 238\r\n255 246 197\r\n222 213 131\r\n164 131 41\r\n"
  },
  {
    "path": "graphics/pokemon/phanpy/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n172 213 238\r\n156 189 238\r\n98 148 197\r\n82 82 148\r\n255 0 255\r\n255 172 139\r\n246 106 82\r\n189 57 49\r\n131 0 0\r\n255 0 255\r\n255 0 255\r\n213 213 213\r\n139 139 139\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/phanpy/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 246 255\r\n189 230 255\r\n106 180 230\r\n65 98 180\r\n255 0 255\r\n255 164 123\r\n255 82 65\r\n197 49 57\r\n131 0 0\r\n255 0 255\r\n255 0 255\r\n213 213 213\r\n139 139 139\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/pichu/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 255 197\r\n255 238 131\r\n230 180 65\r\n197 139 0\r\n131 82 0\r\n255 0 255\r\n255 0 255\r\n255 115 74\r\n197 65 41\r\n115 32 8\r\n205 205 205\r\n115 115 115\r\n82 82 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/pichu/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 255 90\r\n255 222 41\r\n222 180 0\r\n172 131 0\r\n131 82 0\r\n255 0 255\r\n255 0 255\r\n255 82 0\r\n197 0 0\r\n115 0 0\r\n205 205 205\r\n115 115 115\r\n82 82 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/pidgeot/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 222 213\r\n255 255 255\r\n213 197 213\r\n255 246 189\r\n246 238 156\r\n213 205 115\r\n255 172 115\r\n238 98 65\r\n197 65 65\r\n255 213 180\r\n255 230 49\r\n205 156 123\r\n172 123 90\r\n123 90 74\r\n98 65 49\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/pidgeot/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 197 172\r\n255 255 255\r\n164 164 164\r\n255 255 148\r\n255 230 115\r\n246 205 90\r\n255 205 24\r\n246 172 8\r\n238 156 0\r\n255 238 49\r\n238 205 16\r\n205 172 16\r\n180 131 0\r\n148 90 0\r\n98 41 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/pidgeotto/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 197 172\r\n255 255 255\r\n205 189 213\r\n246 246 164\r\n246 230 106\r\n230 197 106\r\n255 172 115\r\n238 98 65\r\n197 65 65\r\n205 156 123\r\n172 123 90\r\n123 90 74\r\n90 57 41\r\n255 0 255\r\n32 32 32\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/pidgeotto/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 197 172\r\n255 255 255\r\n164 164 164\r\n255 255 205\r\n246 238 172\r\n222 197 131\r\n255 255 65\r\n255 213 24\r\n246 172 0\r\n197 180 123\r\n164 148 90\r\n131 115 57\r\n82 65 16\r\n255 0 255\r\n32 32 32\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/pidgey/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n197 197 197\r\n255 246 189\r\n255 230 139\r\n222 197 98\r\n255 180 172\r\n230 123 115\r\n180 74 65\r\n205 139 98\r\n172 98 57\r\n123 90 74\r\n90 57 41\r\n255 0 255\r\n16 16 16\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/pidgey/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n189 189 189\r\n255 255 197\r\n255 255 139\r\n213 213 90\r\n255 255 32\r\n255 197 0\r\n189 148 65\r\n230 222 0\r\n189 180 0\r\n148 139 0\r\n106 98 0\r\n255 0 255\r\n16 16 16\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/pikachu/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 180\r\n255 255 255\r\n255 255 123\r\n255 238 0\r\n238 189 0\r\n197 139 0\r\n131 82 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 74 74\r\n230 0 0\r\n180 0 0\r\n106 106 106\r\n16 16 16\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/pikachu/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 180\r\n255 255 255\r\n255 230 49\r\n246 205 32\r\n238 156 0\r\n205 98 0\r\n131 82 24\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 49 0\r\n205 57 0\r\n180 32 0\r\n106 106 106\r\n16 16 16\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/piloswine/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 197 115\r\n197 164 82\r\n164 131 57\r\n123 98 24\r\n82 57 0\r\n255 0 255\r\n255 189 131\r\n222 139 82\r\n180 98 41\r\n255 0 255\r\n222 222 222\r\n180 180 189\r\n123 123 139\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/piloswine/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n246 238 156\r\n222 213 115\r\n189 180 90\r\n148 139 57\r\n82 57 0\r\n255 0 255\r\n255 189 131\r\n222 139 82\r\n180 98 41\r\n255 0 255\r\n222 222 222\r\n180 180 189\r\n123 123 139\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/pineco/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n41 74 123\r\n57 115 164\r\n82 172 180\r\n131 213 213\r\n180 238 246\r\n156 164 164\r\n255 74 57\r\n255 0 255\r\n255 0 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/pineco/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n90 65 65\r\n148 90 82\r\n172 139 82\r\n230 197 106\r\n255 230 131\r\n156 164 164\r\n255 74 57\r\n255 0 255\r\n255 0 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/pinsir/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n238 238 205\r\n213 213 180\r\n172 172 131\r\n90 90 74\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n172 139 115\r\n230 197 156\r\n205 164 131\r\n139 115 90\r\n90 65 41\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/pinsir/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n255 238 189\r\n230 197 156\r\n180 156 106\r\n98 74 57\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n82 82 148\r\n123 139 222\r\n98 106 180\r\n57 65 106\r\n32 41 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/plusle/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 246 222\r\n255 238 197\r\n238 213 131\r\n189 172 131\r\n123 115 82\r\n238 156 115\r\n222 98 74\r\n139 90 49\r\n238 82 57\r\n41 49 65\r\n98 98 115\r\n65 65 98\r\n148 148 148\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/plusle/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 246 222\r\n255 238 164\r\n255 213 106\r\n205 148 82\r\n139 82 16\r\n238 90 49\r\n205 49 8\r\n148 16 0\r\n164 32 16\r\n41 49 65\r\n98 98 115\r\n65 65 98\r\n148 148 148\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/politoed/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 255 164\r\n255 230 82\r\n230 180 41\r\n156 98 0\r\n205 255 131\r\n156 238 49\r\n123 189 24\r\n49 123 0\r\n255 180 106\r\n230 106 49\r\n180 57 0\r\n205 205 205\r\n131 131 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/politoed/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 230 238\r\n246 205 238\r\n213 164 205\r\n123 82 123\r\n156 230 255\r\n115 197 255\r\n74 148 205\r\n49 90 148\r\n255 172 90\r\n230 106 49\r\n164 57 32\r\n205 205 205\r\n131 131 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/poliwag/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n222 222 222\r\n180 172 189\r\n98 98 98\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 189 172\r\n255 139 123\r\n238 90 74\r\n172 180 222\r\n131 139 180\r\n82 90 148\r\n41 57 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/poliwag/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n222 222 222\r\n189 189 189\r\n98 98 98\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 189 172\r\n255 139 123\r\n238 90 74\r\n123 205 255\r\n82 164 222\r\n41 123 180\r\n0 65 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/poliwhirl/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n222 222 222\r\n189 189 189\r\n164 164 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n123 123 123\r\n82 82 82\r\n255 0 255\r\n180 189 230\r\n131 148 197\r\n98 106 148\r\n32 57 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/poliwhirl/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n222 222 222\r\n189 189 189\r\n164 164 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n123 123 123\r\n82 82 82\r\n255 0 255\r\n106 213 255\r\n65 172 222\r\n24 131 180\r\n0 65 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/poliwrath/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n230 230 230\r\n189 189 189\r\n164 164 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n123 123 123\r\n82 82 82\r\n16 16 16\r\n156 189 213\r\n131 156 172\r\n82 106 148\r\n49 49 106\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/poliwrath/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n222 222 222\r\n189 189 189\r\n164 164 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n123 123 123\r\n82 82 82\r\n16 16 16\r\n148 189 131\r\n106 148 90\r\n65 106 49\r\n24 65 8\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/ponyta/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n255 246 180\r\n255 238 123\r\n238 205 106\r\n139 82 24\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 230 32\r\n255 172 16\r\n255 98 0\r\n213 0 0\r\n172 172 172\r\n90 90 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ponyta/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n255 255 222\r\n255 246 189\r\n246 213 156\r\n131 98 41\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n139 230 255\r\n98 197 255\r\n57 131 255\r\n49 90 197\r\n156 156 156\r\n90 90 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/poochyena/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n213 205 222\r\n255 230 131\r\n255 164 123\r\n123 90 82\r\n164 156 172\r\n131 123 139\r\n74 82 98\r\n49 49 65\r\n197 189 205\r\n255 213 90\r\n180 139 90\r\n222 74 65\r\n172 57 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/poochyena/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 180\r\n139 197 213\r\n255 164 123\r\n123 90 82\r\n213 172 74\r\n148 106 65\r\n115 74 41\r\n82 41 0\r\n255 205 106\r\n123 172 238\r\n57 74 131\r\n222 74 65\r\n172 57 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/porygon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n115 213 255\r\n57 189 213\r\n41 156 139\r\n8 90 106\r\n255 197 164\r\n255 148 139\r\n222 98 82\r\n148 16 24\r\n222 222 230\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n41 41 41\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/porygon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 238 238\r\n238 205 238\r\n205 172 205\r\n98 65 115\r\n131 189 255\r\n57 115 246\r\n24 82 205\r\n0 49 156\r\n222 222 230\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n41 41 41\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/porygon2/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 213 172\r\n255 148 139\r\n222 98 82\r\n180 32 16\r\n255 0 255\r\n148 238 255\r\n106 205 255\r\n65 164 222\r\n32 123 197\r\n0 49 156\r\n213 213 213\r\n180 180 189\r\n106 106 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/porygon2/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n123 180 255\r\n65 123 246\r\n24 82 205\r\n0 49 156\r\n255 0 255\r\n255 238 238\r\n238 205 238\r\n197 164 197\r\n139 106 148\r\n98 65 115\r\n213 213 213\r\n180 180 189\r\n106 106 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/primeape/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n222 222 222\r\n123 123 123\r\n65 65 65\r\n255 148 90\r\n189 74 49\r\n230 180 139\r\n205 139 90\r\n156 106 65\r\n90 49 0\r\n0 0 0\r\n255 255 213\r\n255 230 180\r\n230 189 139\r\n123 90 41\r\n"
  },
  {
    "path": "graphics/pokemon/primeape/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n222 222 222\r\n123 123 123\r\n65 65 65\r\n255 148 90\r\n189 74 49\r\n205 197 106\r\n164 156 65\r\n123 115 24\r\n82 74 8\r\n0 0 0\r\n255 222 156\r\n238 180 115\r\n197 139 74\r\n115 49 0\r\n"
  },
  {
    "path": "graphics/pokemon/psyduck/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n238 238 238\r\n255 238 189\r\n246 222 139\r\n222 180 82\r\n131 90 0\r\n255 255 255\r\n222 222 222\r\n148 148 148\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 230 164\r\n255 213 74\r\n230 164 49\r\n148 90 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/psyduck/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n238 238 238\r\n238 255 255\r\n213 246 246\r\n172 205 205\r\n49 82 82\r\n255 255 255\r\n222 222 222\r\n148 148 148\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n156 238 238\r\n148 213 222\r\n106 172 180\r\n24 98 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/pupitar/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n189 230 255\r\n139 197 238\r\n115 156 197\r\n41 90 131\r\n255 0 255\r\n180 65 0\r\n205 205 213\r\n172 172 172\r\n123 123 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n65 65 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/pupitar/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n246 189 255\r\n213 156 230\r\n156 106 189\r\n98 65 115\r\n255 0 255\r\n180 65 0\r\n205 205 213\r\n172 172 172\r\n123 123 131\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n65 65 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/quagsire/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 49 65\r\n32 65 98\r\n57 90 156\r\n255 0 255\r\n74 139 205\r\n98 164 230\r\n172 205 238\r\n197 238 246\r\n255 0 255\r\n255 0 255\r\n98 82 123\r\n148 98 148\r\n255 115 180\r\n255 0 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/quagsire/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n74 57 65\r\n98 74 98\r\n90 65 90\r\n255 0 255\r\n148 98 164\r\n189 123 205\r\n230 164 230\r\n255 189 238\r\n255 0 255\r\n255 0 255\r\n98 82 123\r\n148 98 148\r\n255 115 180\r\n255 0 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/question_mark/circled/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 205\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n205 205 205\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/question_mark/circled/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 172 172\r\n32 32 32\r\n32 32 32\r\n32 32 32\r\n32 32 32\r\n32 32 32\r\n32 32 32\r\n32 32 32\r\n32 32 32\r\n32 32 32\r\n32 32 32\r\n32 32 32\r\n172 172 172\r\n139 139 139\r\n222 222 222\r\n32 32 32\r\n"
  },
  {
    "path": "graphics/pokemon/question_mark/double/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 255 0\r\n255 255 255\r\n0 0 0\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/question_mark/double/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 255 0\r\n255 255 255\r\n0 0 0\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/quilava/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n98 131 189\r\n65 82 139\r\n41 65 98\r\n24 41 82\r\n255 238 164\r\n230 205 106\r\n180 156 82\r\n139 98 32\r\n255 222 0\r\n255 156 0\r\n255 98 0\r\n238 0 0\r\n180 180 180\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/quilava/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n230 156 106\r\n189 98 65\r\n139 65 57\r\n98 57 41\r\n255 230 115\r\n222 197 82\r\n172 139 49\r\n139 82 24\r\n255 222 0\r\n255 156 0\r\n255 98 0\r\n238 0 0\r\n180 180 180\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/qwilfish/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n148 0 0\r\n57 74 98\r\n74 90 164\r\n90 131 197\r\n115 172 238\r\n106 82 49\r\n197 180 82\r\n230 222 115\r\n238 255 164\r\n213 82 98\r\n255 164 148\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/qwilfish/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n148 0 0\r\n98 57 90\r\n148 41 131\r\n189 82 164\r\n222 115 189\r\n115 65 98\r\n189 139 180\r\n230 189 222\r\n255 222 246\r\n213 82 98\r\n255 164 148\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/raichu/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n255 222 123\r\n255 197 32\r\n222 164 90\r\n156 106 49\r\n246 230 205\r\n255 222 41\r\n222 205 82\r\n189 131 65\r\n148 98 49\r\n139 82 49\r\n98 65 24\r\n106 106 106\r\n16 16 16\r\n205 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/raichu/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n255 189 57\r\n255 148 41\r\n230 115 24\r\n123 57 32\r\n222 222 156\r\n205 180 115\r\n164 139 74\r\n172 115 49\r\n131 82 49\r\n123 65 32\r\n115 74 8\r\n106 106 106\r\n16 16 16\r\n230 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/raikou/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 238 148\r\n255 205 65\r\n213 156 41\r\n139 98 16\r\n213 180 255\r\n180 115 255\r\n123 41 222\r\n65 16 148\r\n197 0 0\r\n255 0 255\r\n213 213 213\r\n164 164 164\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/raikou/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 213 82\r\n246 156 49\r\n197 106 8\r\n82 74 16\r\n255 255 148\r\n238 230 74\r\n189 180 41\r\n106 98 0\r\n197 0 0\r\n255 0 255\r\n222 222 197\r\n180 189 164\r\n123 131 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ralts/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 164 82\r\n238 238 255\r\n197 205 222\r\n164 180 205\r\n131 148 180\r\n123 82 82\r\n115 41 57\r\n255 156 131\r\n230 82 57\r\n131 205 255\r\n255 255 255\r\n205 255 172\r\n148 230 148\r\n115 189 115\r\n49 123 74\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ralts/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 164 82\r\n238 238 255\r\n213 189 222\r\n180 164 205\r\n156 131 180\r\n123 82 82\r\n115 41 57\r\n255 197 90\r\n230 131 32\r\n131 205 255\r\n197 238 246\r\n189 230 255\r\n123 197 238\r\n82 172 213\r\n32 115 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/rapidash/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n255 246 180\r\n255 238 123\r\n230 205 82\r\n197 164 49\r\n148 106 24\r\n255 0 255\r\n255 0 255\r\n255 230 32\r\n255 197 16\r\n255 98 0\r\n205 0 0\r\n156 156 156\r\n90 90 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/rapidash/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n246 246 197\r\n238 230 189\r\n205 197 156\r\n156 148 65\r\n123 106 32\r\n255 0 255\r\n255 0 255\r\n197 205 230\r\n156 164 189\r\n115 123 148\r\n74 82 106\r\n156 156 156\r\n90 90 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/raticate/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n246 197 148\r\n222 131 98\r\n246 246 164\r\n238 222 139\r\n213 189 131\r\n180 156 115\r\n222 189 82\r\n197 156 65\r\n164 123 49\r\n115 74 0\r\n213 213 213\r\n180 180 180\r\n115 115 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/raticate/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 205 156\r\n222 131 98\r\n255 255 197\r\n230 230 156\r\n205 205 131\r\n131 131 49\r\n246 156 106\r\n230 106 65\r\n189 90 49\r\n131 74 49\r\n213 213 213\r\n180 180 180\r\n115 115 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/rattata/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n0 0 0\r\n230 205 115\r\n205 172 148\r\n238 74 90\r\n164 24 57\r\n213 148 213\r\n180 115 180\r\n131 98 139\r\n98 49 82\r\n222 222 197\r\n205 205 180\r\n180 180 148\r\n90 98 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/rattata/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n0 0 0\r\n238 156 115\r\n205 131 98\r\n189 115 180\r\n123 82 131\r\n238 222 156\r\n205 189 123\r\n172 156 90\r\n115 106 49\r\n222 222 222\r\n197 197 197\r\n164 164 164\r\n90 98 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/rayquaza/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 156 255\r\n57 82 57\r\n65 131 65\r\n74 131 115\r\n90 189 139\r\n148 222 180\r\n0 0 0\r\n49 82 172\r\n74 156 189\r\n246 98 98\r\n197 148 98\r\n222 213 238\r\n255 255 255\r\n222 205 0\r\n255 238 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/rayquaza/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 156 255\r\n57 57 57\r\n57 57 57\r\n82 82 82\r\n123 123 123\r\n164 164 164\r\n0 0 0\r\n49 82 148\r\n74 156 172\r\n246 98 98\r\n197 148 98\r\n230 222 255\r\n255 255 255\r\n222 205 0\r\n255 238 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/regice/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 246 148\r\n49 57 90\r\n90 98 123\r\n156 164 222\r\n189 213 238\r\n222 255 255\r\n131 115 180\r\n255 255 255\r\n238 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n205 180 32\r\n255 255 172\r\n255 230 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/regice/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 246 148\r\n0 98 197\r\n0 148 189\r\n74 213 255\r\n172 238 255\r\n230 255 255\r\n65 164 255\r\n255 255 255\r\n213 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n180 123 32\r\n255 230 98\r\n255 189 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/regirock/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 197 148\r\n82 74 41\r\n148 139 115\r\n205 197 172\r\n230 222 172\r\n238 230 222\r\n180 172 148\r\n139 90 57\r\n189 131 57\r\n238 131 57\r\n238 172 106\r\n0 0 0\r\n0 0 0\r\n180 65 0\r\n238 115 57\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/regirock/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 197 148\r\n98 24 0\r\n148 74 32\r\n180 106 65\r\n205 139 98\r\n238 164 131\r\n131 65 24\r\n139 90 57\r\n189 131 57\r\n238 131 57\r\n238 172 106\r\n0 0 0\r\n0 0 0\r\n180 65 0\r\n238 115 57\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/registeel/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 98\r\n90 82 82\r\n131 131 123\r\n189 189 180\r\n222 213 230\r\n238 238 238\r\n115 115 90\r\n139 131 106\r\n172 172 123\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n213 106 131\r\n255 180 164\r\n246 90 172\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/registeel/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 98\r\n90 82 82\r\n90 123 106\r\n115 180 164\r\n172 222 197\r\n213 238 238\r\n115 115 90\r\n139 131 106\r\n172 172 123\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n180 65 49\r\n255 123 82\r\n222 98 49\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/relicanth/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 246 255\r\n246 222 180\r\n213 189 148\r\n180 148 106\r\n139 115 74\r\n106 82 65\r\n189 164 164\r\n0 0 0\r\n164 139 131\r\n139 115 106\r\n123 98 90\r\n82 65 57\r\n246 90 65\r\n205 65 49\r\n255 246 222\r\n139 123 82\r\n"
  },
  {
    "path": "graphics/pokemon/relicanth/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 246 255\r\n246 222 180\r\n213 189 148\r\n180 148 106\r\n139 115 74\r\n106 82 65\r\n172 230 246\r\n0 0 0\r\n139 197 213\r\n106 164 180\r\n74 131 148\r\n24 82 98\r\n246 90 65\r\n205 65 49\r\n255 246 222\r\n139 123 82\r\n"
  },
  {
    "path": "graphics/pokemon/remoraid/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n213 246 246\r\n180 222 213\r\n139 172 189\r\n98 139 164\r\n57 74 123\r\n139 0 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n213 213 213\r\n172 172 180\r\n123 123 131\r\n90 90 90\r\n41 41 57\r\n"
  },
  {
    "path": "graphics/pokemon/remoraid/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n246 213 246\r\n222 180 230\r\n172 123 180\r\n131 82 139\r\n98 57 106\r\n139 0 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n213 213 213\r\n172 172 180\r\n123 123 131\r\n90 90 90\r\n41 41 57\r\n"
  },
  {
    "path": "graphics/pokemon/rhydon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 213 213\r\n255 255 255\r\n255 238 197\r\n230 213 172\r\n180 164 115\r\n123 106 57\r\n230 82 57\r\n164 49 16\r\n115 32 16\r\n255 0 255\r\n255 0 255\r\n222 222 213\r\n197 197 189\r\n139 139 148\r\n90 90 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/rhydon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n255 238 197\r\n230 213 172\r\n180 164 115\r\n123 106 57\r\n230 82 57\r\n164 49 16\r\n115 32 16\r\n255 0 255\r\n255 0 255\r\n255 238 197\r\n230 213 180\r\n189 172 139\r\n131 115 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/rhyhorn/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n230 230 238\r\n189 189 205\r\n131 131 172\r\n90 90 123\r\n65 65 90\r\n172 57 41\r\n90 8 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/rhyhorn/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n238 180 156\r\n197 139 115\r\n156 98 74\r\n115 57 32\r\n74 16 0\r\n172 57 41\r\n90 8 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/roselia/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n0 0 0\r\n180 238 115\r\n246 213 74\r\n205 222 213\r\n65 98 49\r\n131 156 164\r\n98 148 74\r\n123 205 98\r\n172 197 197\r\n164 49 74\r\n246 90 131\r\n255 164 189\r\n41 90 148\r\n82 148 213\r\n98 180 255\r\n"
  },
  {
    "path": "graphics/pokemon/roselia/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n0 0 0\r\n189 255 115\r\n246 213 74\r\n255 238 172\r\n82 98 41\r\n213 172 90\r\n115 172 49\r\n156 213 74\r\n255 213 106\r\n123 65 139\r\n180 98 205\r\n205 139 222\r\n41 49 65\r\n115 106 123\r\n148 139 156\r\n"
  },
  {
    "path": "graphics/pokemon/sableye/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 205 205\r\n74 49 74\r\n139 98 139\r\n197 123 189\r\n213 148 213\r\n148 131 213\r\n197 222 255\r\n255 255 255\r\n197 41 32\r\n106 74 115\r\n172 180 205\r\n82 205 65\r\n32 222 255\r\n164 115 164\r\n0 0 0\r\n255 82 74\r\n"
  },
  {
    "path": "graphics/pokemon/sableye/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 205 205\r\n115 82 65\r\n131 82 57\r\n213 164 123\r\n246 197 164\r\n230 148 90\r\n255 230 156\r\n255 255 255\r\n82 213 74\r\n106 74 57\r\n230 164 90\r\n32 222 255\r\n255 230 106\r\n180 123 90\r\n0 0 0\r\n148 255 148\r\n"
  },
  {
    "path": "graphics/pokemon/salamence/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 222 98\r\n57 65 98\r\n82 98 148\r\n123 123 222\r\n172 172 255\r\n123 74 49\r\n189 115 74\r\n222 123 82\r\n255 148 98\r\n131 148 148\r\n172 164 189\r\n222 213 238\r\n255 255 255\r\n0 0 0\r\n255 255 41\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/salamence/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 222 98\r\n16 98 32\r\n98 156 106\r\n106 197 106\r\n148 230 148\r\n123 74 49\r\n189 115 74\r\n222 123 82\r\n255 148 98\r\n131 148 148\r\n172 164 189\r\n222 213 238\r\n255 255 255\r\n0 0 0\r\n255 255 41\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/sandshrew/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n255 0 255\r\n230 222 16\r\n205 180 0\r\n172 131 16\r\n115 74 24\r\n131 98 16\r\n255 0 255\r\n255 0 255\r\n205 189 180\r\n230 213 197\r\n238 238 222\r\n131 131 131\r\n82 82 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/sandshrew/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n255 0 255\r\n213 222 98\r\n172 197 82\r\n131 156 41\r\n65 90 0\r\n98 115 41\r\n255 0 255\r\n255 0 255\r\n180 180 164\r\n205 205 189\r\n238 238 222\r\n139 139 139\r\n82 82 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/sandslash/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n246 230 213\r\n238 222 106\r\n222 197 32\r\n197 164 57\r\n131 98 0\r\n255 255 255\r\n222 213 180\r\n139 139 139\r\n82 82 82\r\n205 164 74\r\n172 131 49\r\n139 98 24\r\n90 65 16\r\n16 16 16\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/sandslash/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n246 238 156\r\n222 197 115\r\n189 164 74\r\n164 148 65\r\n98 82 0\r\n238 238 222\r\n205 205 189\r\n139 139 139\r\n74 74 74\r\n246 98 98\r\n213 90 74\r\n180 74 49\r\n106 82 32\r\n65 49 32\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/sceptile/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 106 156\r\n255 230 106\r\n255 197 82\r\n197 131 57\r\n255 238 180\r\n255 106 82\r\n213 82 57\r\n164 74 49\r\n57 98 32\r\n123 98 90\r\n255 255 255\r\n189 255 115\r\n156 213 74\r\n115 172 49\r\n90 123 32\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/sceptile/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 106 156\r\n255 106 82\r\n213 82 57\r\n164 74 49\r\n255 238 180\r\n255 230 106\r\n255 180 82\r\n197 131 57\r\n57 98 32\r\n123 98 90\r\n255 255 255\r\n189 246 255\r\n164 222 230\r\n90 180 164\r\n82 139 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/scizor/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 197 115\r\n255 98 16\r\n205 57 0\r\n123 32 0\r\n255 0 255\r\n255 205 16\r\n255 139 41\r\n189 139 41\r\n255 0 255\r\n255 0 255\r\n197 197 205\r\n148 148 156\r\n90 90 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/scizor/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 230 98\r\n180 189 65\r\n106 115 65\r\n74 82 16\r\n255 0 255\r\n255 205 16\r\n255 139 41\r\n189 139 41\r\n255 0 255\r\n255 0 255\r\n197 197 205\r\n98 197 82\r\n49 123 32\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/scyther/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 197\r\n255 255 255\r\n222 222 222\r\n189 189 189\r\n115 115 115\r\n246 230 123\r\n205 197 90\r\n255 255 172\r\n246 230 123\r\n205 57 57\r\n156 139 49\r\n189 255 115\r\n156 222 74\r\n115 172 65\r\n65 98 32\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/scyther/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 197\r\n255 255 255\r\n222 222 222\r\n189 189 189\r\n115 115 115\r\n255 123 90\r\n205 123 90\r\n255 255 189\r\n238 238 148\r\n205 57 57\r\n156 139 49\r\n139 222 49\r\n98 189 49\r\n65 148 8\r\n57 90 8\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/seadra/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n213 238 197\r\n164 222 230\r\n131 189 205\r\n106 131 156\r\n74 106 131\r\n32 65 90\r\n255 255 172\r\n222 197 82\r\n148 123 65\r\n106 82 41\r\n255 0 255\r\n222 222 222\r\n156 156 156\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/seadra/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n106 180 172\r\n106 164 205\r\n65 115 164\r\n57 82 123\r\n49 41 65\r\n0 0 82\r\n255 213 148\r\n238 180 131\r\n172 82 123\r\n106 82 41\r\n255 0 255\r\n222 222 222\r\n156 156 156\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/seaking/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n213 213 222\r\n172 180 189\r\n131 139 156\r\n90 90 98\r\n255 197 205\r\n246 123 90\r\n164 57 65\r\n255 0 255\r\n255 164 123\r\n246 123 90\r\n222 65 32\r\n164 49 32\r\n82 82 82\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/seaking/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n230 246 164\r\n213 246 139\r\n131 164 57\r\n90 115 8\r\n255 197 205\r\n246 123 90\r\n164 57 65\r\n255 0 255\r\n255 246 131\r\n255 205 90\r\n213 164 49\r\n156 106 0\r\n82 82 82\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/sealeo/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n82 139 82\r\n57 82 115\r\n65 106 164\r\n106 148 213\r\n139 172 255\r\n0 0 0\r\n156 156 180\r\n189 189 213\r\n222 222 255\r\n189 156 123\r\n213 180 148\r\n238 205 172\r\n90 123 148\r\n189 205 255\r\n255 230 189\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/sealeo/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n82 139 82\r\n90 49 139\r\n180 98 205\r\n213 148 238\r\n246 197 255\r\n0 0 0\r\n156 156 180\r\n189 189 213\r\n222 222 255\r\n189 148 82\r\n230 189 106\r\n255 222 164\r\n156 74 180\r\n255 238 255\r\n255 246 197\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/seedot/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n82 82 32\r\n131 123 115\r\n255 255 255\r\n156 90 49\r\n213 148 49\r\n213 180 82\r\n123 148 82\r\n180 205 131\r\n230 238 180\r\n246 197 98\r\n255 238 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n246 57 0\r\n"
  },
  {
    "path": "graphics/pokemon/seedot/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n82 82 32\r\n131 123 115\r\n255 255 255\r\n197 57 41\r\n230 82 32\r\n255 139 82\r\n148 139 139\r\n180 172 172\r\n222 213 213\r\n246 197 98\r\n255 238 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n246 57 0\r\n"
  },
  {
    "path": "graphics/pokemon/seel/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 213 148\r\n230 230 246\r\n197 197 230\r\n156 164 189\r\n82 82 106\r\n255 230 180\r\n205 189 139\r\n131 106 65\r\n255 123 106\r\n197 115 123\r\n148 65 24\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/seel/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n238 238 213\r\n213 205 189\r\n180 172 156\r\n139 131 115\r\n255 255 197\r\n213 180 131\r\n115 106 49\r\n255 156 123\r\n238 115 82\r\n148 57 41\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/sentret/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n238 222 139\r\n230 197 82\r\n205 164 65\r\n180 139 57\r\n148 106 32\r\n115 65 16\r\n90 41 8\r\n57 8 0\r\n222 65 24\r\n180 32 16\r\n255 131 115\r\n115 115 115\r\n65 65 65\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/sentret/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 246 172\r\n238 222 123\r\n205 164 65\r\n205 172 74\r\n197 82 115\r\n148 41 82\r\n82 16 65\r\n57 8 0\r\n222 65 24\r\n180 32 16\r\n255 131 115\r\n115 115 115\r\n65 65 65\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/seviper/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 197\r\n255 255 255\r\n57 49 49\r\n255 230 90\r\n222 189 65\r\n139 41 180\r\n255 189 172\r\n238 90 82\r\n205 65 57\r\n131 123 65\r\n41 32 32\r\n139 123 123\r\n82 74 74\r\n0 0 0\r\n164 49 255\r\n90 49 65\r\n"
  },
  {
    "path": "graphics/pokemon/seviper/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 197\r\n255 255 255\r\n57 49 49\r\n205 255 115\r\n172 222 82\r\n180 49 106\r\n255 189 172\r\n90 131 180\r\n57 90 139\r\n82 123 16\r\n41 32 32\r\n139 123 123\r\n82 74 74\r\n0 0 0\r\n213 82 139\r\n90 49 65\r\n"
  },
  {
    "path": "graphics/pokemon/sharpedo/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 255 156\r\n57 65 74\r\n65 98 123\r\n65 139 148\r\n148 189 189\r\n213 123 131\r\n222 189 65\r\n255 222 98\r\n172 156 180\r\n222 205 246\r\n238 230 255\r\n156 74 90\r\n238 49 24\r\n255 255 255\r\n0 0 0\r\n106 57 74\r\n"
  },
  {
    "path": "graphics/pokemon/sharpedo/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 255 156\r\n98 0 82\r\n131 0 115\r\n164 16 148\r\n197 49 180\r\n213 123 131\r\n222 189 65\r\n255 222 98\r\n172 156 180\r\n222 205 246\r\n238 230 255\r\n156 74 90\r\n238 49 24\r\n255 255 255\r\n0 0 0\r\n106 57 74\r\n"
  },
  {
    "path": "graphics/pokemon/shedinja/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n213 197 65\r\n180 164 57\r\n164 131 49\r\n139 115 41\r\n82 74 41\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n115 90 41\r\n246 230 98\r\n255 255 255\r\n222 222 222\r\n189 189 189\r\n123 123 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/shedinja/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 230 189\r\n246 197 156\r\n213 164 123\r\n180 131 90\r\n139 106 74\r\n0 0 0\r\n255 0 255\r\n255 0 255\r\n123 82 57\r\n255 246 230\r\n255 255 255\r\n238 222 238\r\n213 180 197\r\n131 106 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/shelgon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 246 148\r\n74 65 57\r\n98 90 74\r\n123 123 98\r\n0 0 0\r\n106 57 57\r\n189 90 32\r\n246 115 74\r\n82 82 115\r\n148 139 180\r\n205 205 205\r\n238 238 205\r\n246 246 0\r\n197 197 0\r\n180 180 189\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/shelgon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 246 148\r\n57 49 41\r\n82 74 57\r\n106 106 82\r\n0 0 0\r\n106 57 57\r\n172 32 0\r\n246 82 32\r\n0 115 65\r\n74 148 57\r\n189 205 180\r\n222 238 205\r\n246 246 0\r\n197 197 0\r\n156 180 164\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/shellder/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n222 205 238\r\n213 180 230\r\n180 139 189\r\n115 123 139\r\n90 57 98\r\n255 98 41\r\n197 65 74\r\n123 32 16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n106 106 106\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/shellder/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n213 213 238\r\n255 180 65\r\n255 139 24\r\n213 98 0\r\n148 32 0\r\n255 98 41\r\n197 65 74\r\n123 32 16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n106 106 106\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/shiftry/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 148 197\r\n82 49 49\r\n131 131 115\r\n255 255 255\r\n115 65 74\r\n156 90 98\r\n222 123 82\r\n246 197 131\r\n230 222 255\r\n189 180 197\r\n0 0 0\r\n74 123 41\r\n98 172 98\r\n131 213 98\r\n255 213 98\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/shiftry/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 148 197\r\n82 49 49\r\n172 106 82\r\n255 255 255\r\n115 16 0\r\n180 49 32\r\n222 98 49\r\n255 139 98\r\n255 238 156\r\n222 172 74\r\n0 0 0\r\n90 131 49\r\n139 205 82\r\n189 255 115\r\n255 156 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/shroomish/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 148 139\r\n98 74 49\r\n148 106 49\r\n213 164 90\r\n238 197 139\r\n255 230 172\r\n255 255 213\r\n90 131 74\r\n123 172 106\r\n139 197 131\r\n164 213 148\r\n65 82 49\r\n172 197 131\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/shroomish/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 148 139\r\n123 98 74\r\n172 123 65\r\n222 189 123\r\n246 213 164\r\n255 238 189\r\n255 255 230\r\n180 65 49\r\n222 98 49\r\n255 115 74\r\n255 189 106\r\n164 49 32\r\n255 172 98\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/shuckle/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n148 131 115\r\n115 82 16\r\n189 139 41\r\n238 197 74\r\n255 255 90\r\n255 0 255\r\n230 156 131\r\n246 205 180\r\n255 0 255\r\n131 32 0\r\n197 57 16\r\n246 115 57\r\n255 180 123\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/shuckle/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n148 131 115\r\n115 82 16\r\n189 139 41\r\n238 197 74\r\n255 255 90\r\n255 0 255\r\n164 189 189\r\n189 213 213\r\n255 0 255\r\n24 65 115\r\n49 98 189\r\n65 156 238\r\n139 205 246\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/shuppet/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 197 197\r\n74 65 74\r\n148 131 139\r\n164 164 172\r\n172 189 197\r\n123 115 123\r\n106 213 246\r\n82 189 213\r\n246 213 49\r\n189 180 0\r\n123 180 65\r\n106 148 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/shuppet/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 197 197\r\n49 74 82\r\n57 123 131\r\n98 172 180\r\n139 205 213\r\n49 115 123\r\n106 213 246\r\n82 189 213\r\n246 213 49\r\n189 180 0\r\n123 180 65\r\n106 148 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/silcoon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 246 197\r\n106 106 115\r\n139 139 148\r\n172 172 180\r\n0 0 0\r\n189 189 205\r\n222 213 230\r\n238 238 230\r\n255 255 255\r\n16 16 24\r\n246 164 0\r\n197 123 0\r\n0 0 0\r\n246 255 197\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/silcoon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 246 197\r\n164 106 24\r\n205 148 65\r\n230 164 90\r\n0 0 0\r\n255 189 90\r\n255 222 148\r\n255 246 197\r\n255 255 255\r\n16 16 24\r\n90 131 189\r\n65 90 139\r\n0 0 0\r\n246 255 197\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/skarmory/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n230 230 238\r\n197 197 205\r\n164 164 172\r\n123 123 131\r\n82 82 82\r\n255 156 123\r\n246 98 82\r\n197 57 49\r\n148 32 0\r\n255 222 0\r\n205 148 0\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/skarmory/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 230 197\r\n197 189 164\r\n148 139 123\r\n115 115 98\r\n82 90 74\r\n115 213 74\r\n74 172 41\r\n41 106 32\r\n49 74 32\r\n255 222 0\r\n205 148 0\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/skiploom/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n139 238 57\r\n98 205 57\r\n65 172 32\r\n24 98 0\r\n255 0 255\r\n255 238 115\r\n255 213 0\r\n246 164 0\r\n172 90 0\r\n255 0 255\r\n255 0 255\r\n213 213 213\r\n164 164 164\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/skiploom/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 148 213\r\n222 106 189\r\n172 90 148\r\n98 49 82\r\n255 0 255\r\n255 238 115\r\n255 213 0\r\n238 156 16\r\n156 90 16\r\n255 0 255\r\n255 0 255\r\n213 213 213\r\n164 164 164\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/skitty/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n255 246 148\r\n255 205 98\r\n205 156 65\r\n131 106 65\r\n0 0 0\r\n0 0 0\r\n255 205 189\r\n197 106 180\r\n123 0 106\r\n0 0 0\r\n255 172 148\r\n255 131 106\r\n197 82 57\r\n131 41 49\r\n"
  },
  {
    "path": "graphics/pokemon/skitty/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n255 246 164\r\n255 222 115\r\n213 164 65\r\n131 106 65\r\n0 0 0\r\n0 0 0\r\n255 180 98\r\n255 106 74\r\n115 24 32\r\n0 0 0\r\n255 123 82\r\n238 82 49\r\n189 65 32\r\n164 49 32\r\n"
  },
  {
    "path": "graphics/pokemon/slaking/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 156 164\r\n90 65 49\r\n139 106 82\r\n172 139 106\r\n197 172 148\r\n213 205 180\r\n246 238 213\r\n90 98 123\r\n205 205 238\r\n238 238 255\r\n255 255 255\r\n139 49 65\r\n197 82 115\r\n222 131 148\r\n16 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/slaking/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 156 164\r\n74 65 49\r\n106 98 74\r\n139 123 106\r\n197 172 148\r\n213 205 180\r\n246 238 213\r\n189 131 65\r\n255 197 106\r\n255 238 148\r\n255 255 255\r\n164 49 32\r\n213 82 41\r\n255 123 82\r\n16 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/slakoth/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 148 205\r\n0 0 0\r\n82 57 41\r\n115 82 41\r\n139 106 65\r\n65 65 65\r\n156 156 156\r\n205 205 205\r\n255 255 255\r\n139 49 65\r\n189 90 74\r\n213 123 106\r\n255 164 139\r\n180 148 106\r\n205 180 139\r\n230 205 164\r\n"
  },
  {
    "path": "graphics/pokemon/slakoth/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 148 205\r\n41 32 32\r\n57 49 49\r\n82 74 74\r\n156 106 139\r\n65 65 65\r\n156 156 156\r\n205 205 205\r\n255 255 255\r\n156 41 24\r\n180 65 49\r\n222 98 49\r\n255 123 82\r\n156 90 131\r\n197 123 172\r\n230 189 205\r\n"
  },
  {
    "path": "graphics/pokemon/slowbro/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 213 213\r\n255 255 255\r\n255 238 156\r\n255 222 123\r\n222 189 90\r\n139 98 24\r\n230 246 189\r\n197 213 156\r\n156 172 98\r\n82 98 49\r\n230 82 41\r\n255 189 148\r\n255 139 106\r\n230 106 106\r\n148 57 57\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/slowbro/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 205\r\n255 255 255\r\n255 238 156\r\n255 205 98\r\n230 172 90\r\n164 115 32\r\n230 197 106\r\n189 156 65\r\n148 115 24\r\n98 65 0\r\n230 82 41\r\n197 180 222\r\n164 156 213\r\n123 115 172\r\n74 65 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/slowking/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n255 123 57\r\n205 74 32\r\n156 32 0\r\n205 74 32\r\n230 106 49\r\n255 180 115\r\n148 106 0\r\n255 189 49\r\n255 255 139\r\n82 82 65\r\n148 148 123\r\n180 180 172\r\n222 222 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/slowking/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n98 164 246\r\n49 90 189\r\n131 32 74\r\n180 90 115\r\n213 123 148\r\n255 180 197\r\n148 106 0\r\n238 189 65\r\n255 255 139\r\n82 82 65\r\n148 148 123\r\n180 180 172\r\n222 222 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/slowpoke/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n222 213 213\r\n255 255 189\r\n255 246 131\r\n230 197 90\r\n131 82 8\r\n255 0 255\r\n246 65 32\r\n180 41 41\r\n106 98 98\r\n255 180 148\r\n255 131 98\r\n230 90 106\r\n156 49 49\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/slowpoke/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n213 205 205\r\n255 255 189\r\n255 255 148\r\n238 213 106\r\n156 74 32\r\n255 0 255\r\n246 65 32\r\n139 32 32\r\n106 98 98\r\n255 205 205\r\n238 180 197\r\n197 139 156\r\n139 74 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/slugma/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 189 106\r\n255 131 74\r\n222 90 32\r\n148 32 0\r\n255 213 115\r\n255 238 156\r\n255 213 115\r\n246 164 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/slugma/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n213 213 213\r\n180 180 180\r\n123 123 123\r\n74 74 74\r\n230 230 230\r\n255 238 156\r\n255 213 115\r\n246 164 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/smeargle/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 213 213\r\n255 255 255\r\n24 156 0\r\n222 222 189\r\n172 172 139\r\n139 131 82\r\n246 131 0\r\n180 0 0\r\n106 90 49\r\n74 57 16\r\n106 222 65\r\n65 197 24\r\n0 98 0\r\n197 197 197\r\n148 148 156\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/smeargle/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 213 213\r\n255 255 255\r\n197 74 65\r\n238 222 156\r\n205 172 98\r\n180 115 74\r\n246 131 0\r\n180 0 0\r\n106 65 32\r\n74 57 16\r\n255 156 131\r\n238 106 82\r\n172 49 41\r\n197 197 197\r\n148 148 156\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/smoochum/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n189 172 41\r\n255 148 164\r\n222 74 123\r\n139 16 90\r\n255 230 82\r\n222 205 49\r\n148 131 24\r\n255 197 164\r\n246 230 172\r\n222 197 131\r\n139 131 74\r\n213 213 213\r\n180 180 180\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/smoochum/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n213 189 24\r\n255 189 213\r\n230 139 123\r\n164 65 57\r\n255 255 172\r\n255 230 74\r\n172 148 16\r\n255 222 230\r\n246 246 205\r\n213 197 139\r\n139 131 74\r\n197 197 197\r\n131 131 131\r\n41 41 57\r\n"
  },
  {
    "path": "graphics/pokemon/sneasel/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n139 172 156\r\n82 123 106\r\n57 90 74\r\n41 57 41\r\n255 205 213\r\n255 115 106\r\n197 74 74\r\n131 16 32\r\n230 74 74\r\n106 98 123\r\n189 180 197\r\n255 230 90\r\n205 131 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/sneasel/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 172 205\r\n238 139 180\r\n197 98 131\r\n90 49 65\r\n255 255 164\r\n255 230 74\r\n222 180 98\r\n156 98 57\r\n230 74 74\r\n106 98 123\r\n189 180 197\r\n255 255 255\r\n205 222 238\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/snorlax/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n123 164 148\r\n98 131 115\r\n57 98 82\r\n57 82 65\r\n255 255 197\r\n246 246 156\r\n238 222 156\r\n139 139 74\r\n213 164 106\r\n197 139 82\r\n189 24 24\r\n213 213 222\r\n106 106 115\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/snorlax/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n74 156 205\r\n65 115 189\r\n41 90 131\r\n41 90 98\r\n246 238 189\r\n246 230 180\r\n238 213 164\r\n156 156 82\r\n222 156 98\r\n180 123 57\r\n148 90 24\r\n213 213 222\r\n106 106 115\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/snorunt/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n222 222 222\r\n255 123 82\r\n180 65 49\r\n180 115 49\r\n255 238 164\r\n255 213 106\r\n230 172 90\r\n139 213 255\r\n156 139 139\r\n65 148 213\r\n139 123 123\r\n82 74 74\r\n57 49 49\r\n41 32 32\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/snorunt/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n222 222 222\r\n255 205 82\r\n180 131 49\r\n148 98 16\r\n172 246 255\r\n139 213 255\r\n106 180 222\r\n255 197 180\r\n156 139 139\r\n255 57 41\r\n139 123 123\r\n82 74 74\r\n57 49 49\r\n41 32 32\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/snubbull/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n164 41 41\r\n255 0 255\r\n148 41 57\r\n230 98 106\r\n238 180 164\r\n255 205 197\r\n255 131 41\r\n16 16 16\r\n65 65 82\r\n98 115 115\r\n148 164 164\r\n65 139 172\r\n172 222 246\r\n222 222 222\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/snubbull/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n197 49 65\r\n255 0 255\r\n90 90 139\r\n148 156 164\r\n197 205 197\r\n222 222 222\r\n255 148 74\r\n16 16 16\r\n123 49 65\r\n156 74 98\r\n205 106 139\r\n65 139 172\r\n255 197 180\r\n238 213 197\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/solrock/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 238 164\r\n238 213 115\r\n222 180 74\r\n180 148 82\r\n238 148 57\r\n205 123 49\r\n172 98 41\r\n139 82 32\r\n123 98 74\r\n57 41 24\r\n255 172 98\r\n213 74 82\r\n139 115 115\r\n82 82 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/solrock/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 238 164\r\n238 213 115\r\n222 180 74\r\n180 148 82\r\n255 115 106\r\n255 65 57\r\n222 32 24\r\n189 0 0\r\n123 98 74\r\n57 41 24\r\n255 172 98\r\n0 205 255\r\n139 115 115\r\n82 82 90\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/spearow/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 222 197\r\n213 197 156\r\n172 156 115\r\n106 98 82\r\n255 131 115\r\n246 82 90\r\n197 65 82\r\n123 24 0\r\n246 180 90\r\n213 156 57\r\n172 115 16\r\n123 65 0\r\n255 213 172\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/spearow/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 222 172\r\n213 197 156\r\n172 156 115\r\n106 98 82\r\n255 255 82\r\n255 222 0\r\n238 164 0\r\n131 57 0\r\n238 222 115\r\n197 180 74\r\n156 139 32\r\n98 82 0\r\n255 255 148\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/spheal/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 197 98\r\n16 16 57\r\n74 82 139\r\n106 123 213\r\n156 164 255\r\n197 197 255\r\n255 255 255\r\n106 90 49\r\n164 148 106\r\n213 197 148\r\n230 213 172\r\n246 230 189\r\n222 222 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/spheal/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 197 98\r\n16 16 57\r\n90 49 139\r\n180 98 205\r\n213 148 238\r\n246 197 255\r\n255 255 255\r\n106 90 49\r\n164 148 106\r\n230 205 148\r\n238 222 172\r\n255 238 189\r\n255 222 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/spinarak/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n205 255 115\r\n148 230 65\r\n98 189 32\r\n82 123 41\r\n49 82 16\r\n255 255 90\r\n180 164 49\r\n148 123 49\r\n255 156 82\r\n238 49 0\r\n148 49 0\r\n189 189 189\r\n123 123 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/spinarak/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n180 213 222\r\n139 172 189\r\n82 106 156\r\n57 74 90\r\n32 49 74\r\n230 172 205\r\n172 90 123\r\n106 65 82\r\n255 156 82\r\n238 49 0\r\n148 49 0\r\n189 189 189\r\n123 123 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/spinda/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n246 230 172\r\n230 213 164\r\n197 180 131\r\n172 148 106\r\n222 139 74\r\n222 106 57\r\n180 90 41\r\n156 57 24\r\n115 65 16\r\n172 65 90\r\n255 255 0\r\n255 255 0\r\n123 98 74\r\n90 65 49\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/spinda/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n246 230 172\r\n230 213 164\r\n197 180 131\r\n172 148 106\r\n180 197 90\r\n148 164 57\r\n115 131 24\r\n82 98 0\r\n49 65 0\r\n172 65 90\r\n255 255 0\r\n255 255 0\r\n123 98 74\r\n90 65 49\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/spoink/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 255 255\r\n172 172 164\r\n139 139 148\r\n106 115 123\r\n49 49 41\r\n255 230 255\r\n255 205 189\r\n230 172 131\r\n148 74 74\r\n197 139 90\r\n24 24 24\r\n0 0 0\r\n74 74 74\r\n255 255 255\r\n98 82 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/spoink/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 255 255\r\n255 205 172\r\n246 180 139\r\n205 164 123\r\n98 74 57\r\n172 172 172\r\n139 139 139\r\n82 82 82\r\n49 49 49\r\n106 106 106\r\n0 0 0\r\n0 0 0\r\n172 123 106\r\n255 255 255\r\n98 82 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/squirtle/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n213 148 82\r\n189 106 0\r\n98 41 0\r\n213 205 205\r\n255 230 156\r\n255 213 106\r\n230 172 90\r\n213 131 57\r\n205 49 24\r\n180 222 238\r\n139 197 213\r\n131 148 172\r\n65 115 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/squirtle/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n148 205 41\r\n106 156 24\r\n74 115 32\r\n213 205 205\r\n255 230 156\r\n255 213 106\r\n230 172 90\r\n213 131 57\r\n148 32 0\r\n189 238 246\r\n148 230 246\r\n82 197 213\r\n65 106 139\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/stantler/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 213 115\r\n230 180 90\r\n180 131 49\r\n123 65 0\r\n255 0 255\r\n255 255 172\r\n255 222 131\r\n255 222 82\r\n230 164 32\r\n213 0 255\r\n180 180 180\r\n123 123 123\r\n74 74 74\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/stantler/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n222 255 106\r\n197 230 90\r\n148 180 49\r\n65 90 0\r\n255 0 255\r\n255 255 172\r\n230 230 139\r\n255 222 82\r\n197 148 65\r\n213 0 255\r\n255 189 106\r\n230 115 41\r\n131 65 41\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/starmie/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n189 148 205\r\n148 98 164\r\n131 65 131\r\n82 32 98\r\n255 246 148\r\n246 213 82\r\n197 164 16\r\n106 82 0\r\n255 0 255\r\n255 189 164\r\n246 65 82\r\n205 49 90\r\n123 16 0\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/starmie/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n148 205 246\r\n106 164 213\r\n65 123 172\r\n0 57 106\r\n255 139 156\r\n255 98 115\r\n197 57 74\r\n131 16 32\r\n255 0 255\r\n115 189 246\r\n74 148 205\r\n8 82 139\r\n8 41 98\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/staryu/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n16 16 16\r\n255 255 180\r\n246 213 82\r\n197 172 16\r\n115 90 0\r\n238 213 172\r\n213 180 115\r\n164 115 49\r\n106 65 32\r\n255 213 213\r\n238 156 139\r\n230 98 65\r\n172 65 32\r\n197 156 82\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/staryu/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n16 16 16\r\n255 255 180\r\n246 213 82\r\n197 172 16\r\n115 90 0\r\n230 230 205\r\n189 189 164\r\n148 148 123\r\n98 98 74\r\n156 255 255\r\n106 213 255\r\n65 172 222\r\n8 115 164\r\n172 164 139\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/steelix/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n57 57 82\r\n74 90 123\r\n131 156 172\r\n189 205 197\r\n222 230 222\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n213 82 65\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/steelix/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n98 82 57\r\n139 106 82\r\n189 156 90\r\n230 197 115\r\n255 230 139\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n213 82 65\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/sudowoodo/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n230 197 106\r\n189 156 82\r\n148 115 49\r\n98 74 16\r\n255 0 255\r\n139 255 139\r\n41 222 49\r\n41 172 49\r\n24 106 32\r\n255 205 0\r\n222 148 0\r\n156 106 0\r\n180 180 180\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/sudowoodo/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 222 57\r\n180 189 24\r\n123 139 24\r\n82 90 24\r\n255 0 255\r\n255 205 172\r\n255 115 74\r\n205 74 49\r\n131 57 41\r\n255 205 0\r\n222 148 0\r\n156 106 0\r\n180 180 180\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/suicune/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 180\r\n255 255 255\r\n189 238 255\r\n123 189 255\r\n90 115 213\r\n57 74 148\r\n213 180 255\r\n172 106 255\r\n139 49 230\r\n82 57 139\r\n164 0 0\r\n213 213 213\r\n180 180 180\r\n148 148 148\r\n106 106 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/suicune/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 180\r\n255 255 255\r\n238 255 255\r\n197 230 255\r\n106 164 230\r\n49 82 156\r\n106 189 255\r\n57 139 222\r\n8 90 180\r\n32 57 98\r\n164 0 0\r\n213 205 230\r\n189 172 197\r\n139 123 148\r\n98 82 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/sunflora/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n255 0 255\r\n131 90 16\r\n197 123 32\r\n222 164 24\r\n238 205 8\r\n230 222 90\r\n255 255 164\r\n255 246 16\r\n222 57 0\r\n255 0 255\r\n82 98 41\r\n115 172 49\r\n156 213 74\r\n189 255 115\r\n"
  },
  {
    "path": "graphics/pokemon/sunflora/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 16 16\r\n255 0 255\r\n98 82 0\r\n148 123 0\r\n205 172 32\r\n238 222 82\r\n230 222 90\r\n255 255 164\r\n255 255 164\r\n222 57 0\r\n255 0 255\r\n82 74 0\r\n123 115 0\r\n180 172 41\r\n230 222 74\r\n"
  },
  {
    "path": "graphics/pokemon/sunkern/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n74 57 41\r\n82 74 41\r\n106 98 49\r\n180 164 49\r\n180 164 57\r\n213 205 49\r\n255 255 0\r\n255 0 255\r\n32 98 16\r\n82 164 57\r\n115 213 41\r\n164 246 57\r\n16 16 16\r\n115 115 139\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/sunkern/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n74 57 41\r\n82 57 41\r\n106 74 49\r\n164 106 32\r\n172 115 49\r\n213 164 49\r\n255 213 90\r\n255 0 255\r\n32 98 16\r\n82 164 57\r\n156 230 49\r\n205 255 98\r\n16 16 16\r\n115 115 139\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/surskit/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n49 90 90\r\n90 164 213\r\n90 139 180\r\n123 197 213\r\n255 213 90\r\n205 172 49\r\n123 106 16\r\n255 255 255\r\n238 123 139\r\n230 106 90\r\n172 139 16\r\n32 115 148\r\n255 255 255\r\n255 255 255\r\n205 255 156\r\n"
  },
  {
    "path": "graphics/pokemon/surskit/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 205 255\r\n41 49 65\r\n115 106 123\r\n74 82 98\r\n148 139 156\r\n255 213 90\r\n205 172 49\r\n123 106 16\r\n255 255 255\r\n255 180 82\r\n255 115 24\r\n172 139 16\r\n74 82 98\r\n255 255 255\r\n255 255 255\r\n205 255 156\r\n"
  },
  {
    "path": "graphics/pokemon/swablu/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 172 123\r\n180 180 222\r\n131 131 148\r\n90 90 115\r\n57 106 131\r\n213 213 230\r\n0 0 0\r\n156 156 197\r\n123 205 255\r\n98 172 230\r\n90 148 205\r\n213 255 255\r\n148 197 197\r\n172 230 255\r\n238 238 246\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/swablu/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 172 123\r\n180 180 222\r\n131 131 148\r\n90 90 115\r\n156 106 0\r\n213 213 230\r\n0 0 0\r\n156 156 197\r\n255 238 131\r\n255 205 98\r\n222 172 65\r\n213 255 255\r\n148 197 197\r\n255 238 131\r\n238 238 246\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/swalot/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n65 156 123\r\n115 90 148\r\n156 106 213\r\n189 139 255\r\n213 172 255\r\n255 255 255\r\n49 49 49\r\n82 82 82\r\n106 106 106\r\n205 205 205\r\n131 123 65\r\n255 213 90\r\n255 41 0\r\n255 238 148\r\n90 57 106\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/swalot/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 189 131\r\n65 74 115\r\n90 115 156\r\n98 148 197\r\n131 180 238\r\n255 255 255\r\n49 49 49\r\n82 82 82\r\n106 106 106\r\n205 205 205\r\n180 65 49\r\n222 98 49\r\n255 139 82\r\n255 148 123\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/swampert/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n197 230 255\r\n172 189 230\r\n131 164 197\r\n41 49 98\r\n255 213 74\r\n246 156 65\r\n205 131 65\r\n139 98 74\r\n156 74 90\r\n57 82 131\r\n139 205 255\r\n90 172 230\r\n49 131 197\r\n82 106 164\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/swampert/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n230 246 255\r\n205 213 230\r\n180 139 230\r\n74 65 106\r\n255 197 74\r\n246 106 82\r\n222 98 49\r\n180 65 49\r\n139 65 24\r\n106 49 123\r\n246 205 246\r\n230 172 246\r\n197 115 222\r\n139 82 156\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/swellow/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 172 98\r\n41 49 90\r\n65 82 123\r\n90 106 172\r\n123 139 205\r\n123 90 90\r\n148 148 148\r\n205 213 213\r\n255 255 255\r\n197 49 49\r\n230 106 98\r\n255 148 139\r\n230 172 74\r\n255 238 82\r\n131 57 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/swellow/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 172 98\r\n16 82 57\r\n49 148 98\r\n90 172 148\r\n148 213 205\r\n123 90 90\r\n148 148 148\r\n205 213 213\r\n255 255 255\r\n213 123 16\r\n246 180 57\r\n255 197 115\r\n230 189 74\r\n255 238 82\r\n131 57 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/swinub/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 197 115\r\n197 164 82\r\n164 131 57\r\n123 98 24\r\n90 65 0\r\n57 41 0\r\n255 189 131\r\n222 139 82\r\n180 98 41\r\n255 0 255\r\n222 222 222\r\n180 180 189\r\n123 123 139\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/swinub/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 230 230\r\n189 205 197\r\n148 164 164\r\n106 123 131\r\n57 65 90\r\n49 49 57\r\n246 213 131\r\n222 164 65\r\n205 123 32\r\n255 0 255\r\n222 222 222\r\n180 180 189\r\n123 123 139\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/taillow/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 172 98\r\n41 49 90\r\n74 90 148\r\n90 106 172\r\n123 139 205\r\n123 90 90\r\n148 148 148\r\n205 213 213\r\n255 255 255\r\n197 49 49\r\n230 106 98\r\n255 148 139\r\n230 189 74\r\n255 238 82\r\n131 57 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/taillow/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 172 98\r\n16 82 57\r\n49 148 98\r\n90 172 148\r\n148 213 205\r\n123 90 90\r\n148 148 148\r\n205 213 213\r\n255 255 255\r\n213 123 16\r\n246 180 57\r\n255 197 115\r\n230 189 74\r\n255 238 82\r\n131 57 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/tangela/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n172 222 246\r\n131 189 213\r\n65 123 148\r\n32 65 82\r\n255 131 131\r\n213 65 82\r\n148 41 41\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n180 180 180\r\n82 82 82\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/tangela/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n123 222 57\r\n82 180 16\r\n41 139 0\r\n0 74 0\r\n255 131 131\r\n222 90 90\r\n148 41 41\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n180 180 180\r\n82 82 82\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/tauros/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 213 172\r\n255 255 255\r\n230 230 238\r\n205 197 255\r\n148 180 172\r\n90 82 106\r\n255 0 255\r\n189 156 82\r\n156 131 65\r\n115 90 32\r\n74 49 0\r\n246 197 98\r\n230 164 74\r\n189 123 49\r\n115 82 24\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/tauros/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n238 222 255\r\n205 197 255\r\n164 148 205\r\n90 74 106\r\n255 0 255\r\n123 205 49\r\n82 180 24\r\n24 123 0\r\n49 74 24\r\n255 255 98\r\n255 230 82\r\n213 189 57\r\n131 106 49\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/teddiursa/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 180 106\r\n213 156 90\r\n164 131 57\r\n123 98 24\r\n90 65 0\r\n255 246 164\r\n238 213 156\r\n213 172 82\r\n255 0 255\r\n255 0 255\r\n222 222 222\r\n180 180 189\r\n106 106 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/teddiursa/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n189 246 123\r\n164 222 106\r\n123 180 74\r\n90 148 49\r\n57 98 32\r\n255 246 164\r\n238 222 123\r\n172 197 90\r\n255 0 255\r\n255 0 255\r\n222 222 222\r\n180 180 189\r\n106 106 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/tentacool/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n255 197 189\r\n255 82 74\r\n180 41 32\r\n131 16 16\r\n213 197 148\r\n180 172 115\r\n131 131 65\r\n82 82 32\r\n213 213 213\r\n148 213 246\r\n106 180 230\r\n65 164 148\r\n32 82 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/tentacool/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n115 197 139\r\n74 156 98\r\n32 115 57\r\n16 74 16\r\n213 197 148\r\n180 172 115\r\n131 131 65\r\n82 82 32\r\n213 213 213\r\n213 213 255\r\n172 172 230\r\n131 131 189\r\n74 74 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/tentacruel/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 213 197\r\n255 255 255\r\n255 197 189\r\n255 82 74\r\n180 41 32\r\n131 16 16\r\n222 205 156\r\n180 172 115\r\n139 139 65\r\n90 90 32\r\n213 213 213\r\n148 205 246\r\n106 180 230\r\n65 164 156\r\n32 82 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/tentacruel/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n148 189 82\r\n106 148 41\r\n65 106 0\r\n8 49 0\r\n230 213 164\r\n180 172 115\r\n131 131 65\r\n82 82 32\r\n222 255 255\r\n180 222 255\r\n139 180 213\r\n98 139 172\r\n24 65 98\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/togepi/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n246 246 255\r\n180 180 197\r\n106 106 123\r\n16 16 16\r\n197 24 0\r\n255 255 205\r\n255 246 172\r\n222 197 115\r\n172 148 74\r\n106 57 0\r\n222 115 115\r\n197 24 0\r\n106 131 222\r\n0 74 213\r\n205 205 205\r\n"
  },
  {
    "path": "graphics/pokemon/togepi/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n246 246 255\r\n180 180 197\r\n106 106 123\r\n16 16 16\r\n197 24 0\r\n255 255 205\r\n255 230 172\r\n213 180 115\r\n172 131 57\r\n106 57 0\r\n106 131 222\r\n0 74 213\r\n222 115 115\r\n197 24 0\r\n205 205 205\r\n"
  },
  {
    "path": "graphics/pokemon/togetic/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 197 139\r\n230 230 238\r\n205 205 205\r\n172 172 189\r\n131 131 148\r\n90 90 115\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n139 0 0\r\n222 115 115\r\n180 0 0\r\n106 131 222\r\n0 41 197\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/togetic/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 246\r\n230 222 172\r\n189 180 139\r\n148 139 32\r\n106 90 57\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n139 0 0\r\n106 131 222\r\n0 41 197\r\n222 115 115\r\n180 0 0\r\n255 255 230\r\n"
  },
  {
    "path": "graphics/pokemon/torchic/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n255 222 148\r\n213 189 148\r\n180 148 123\r\n123 115 123\r\n255 213 98\r\n255 197 82\r\n213 156 57\r\n139 123 90\r\n156 205 255\r\n255 255 255\r\n255 164 57\r\n255 106 57\r\n213 90 57\r\n90 57 49\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/torchic/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n49 164 82\r\n222 180 131\r\n172 123 90\r\n123 90 74\r\n123 115 123\r\n255 164 57\r\n238 90 41\r\n189 57 24\r\n123 90 74\r\n156 205 255\r\n255 255 255\r\n255 238 172\r\n255 222 115\r\n230 164 74\r\n90 57 49\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/torkoal/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 197\r\n238 222 213\r\n213 205 197\r\n189 172 164\r\n255 156 106\r\n230 123 74\r\n197 82 57\r\n148 74 49\r\n131 131 131\r\n90 90 90\r\n49 49 49\r\n255 156 0\r\n197 131 8\r\n255 57 0\r\n90 49 57\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/torkoal/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 197\r\n255 238 230\r\n222 213 205\r\n205 189 180\r\n255 230 156\r\n255 213 106\r\n222 156 74\r\n148 90 0\r\n213 123 123\r\n180 90 90\r\n123 32 32\r\n255 156 0\r\n197 131 8\r\n255 57 0\r\n82 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/totodile/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 197 164\r\n255 255 255\r\n148 213 255\r\n106 180 230\r\n49 131 197\r\n74 74 131\r\n180 180 180\r\n255 197 115\r\n255 90 32\r\n205 41 16\r\n123 0 0\r\n255 90 32\r\n205 41 16\r\n255 197 82\r\n172 131 41\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/totodile/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 197 164\r\n255 255 255\r\n156 246 189\r\n106 222 180\r\n65 172 148\r\n32 106 90\r\n180 180 180\r\n131 180 255\r\n74 106 197\r\n49 74 164\r\n49 65 106\r\n255 123 74\r\n197 74 57\r\n255 197 82\r\n172 131 41\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/trapinch/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 205 156\r\n115 65 65\r\n205 123 115\r\n238 156 74\r\n255 189 123\r\n197 74 49\r\n172 197 98\r\n222 246 115\r\n123 148 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n65 65 49\r\n255 255 255\r\n0 0 0\r\n32 32 32\r\n"
  },
  {
    "path": "graphics/pokemon/trapinch/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 205 156\r\n24 49 41\r\n90 131 123\r\n123 164 156\r\n156 197 189\r\n197 74 49\r\n172 197 98\r\n222 246 115\r\n123 148 74\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n65 65 49\r\n255 255 255\r\n0 0 0\r\n32 32 32\r\n"
  },
  {
    "path": "graphics/pokemon/treecko/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 106 156\r\n255 213 123\r\n255 197 82\r\n230 156 74\r\n74 189 131\r\n255 106 82\r\n213 82 57\r\n164 74 49\r\n24 65 57\r\n74 139 90\r\n255 255 255\r\n189 255 115\r\n156 213 74\r\n115 172 49\r\n82 98 41\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/treecko/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n123 106 156\r\n255 213 123\r\n255 197 82\r\n230 156 74\r\n255 106 82\r\n255 238 197\r\n238 189 156\r\n205 156 123\r\n156 65 41\r\n213 82 57\r\n255 255 255\r\n172 230 238\r\n148 205 213\r\n74 164 148\r\n82 139 131\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/tropius/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n16 123 189\r\n32 98 32\r\n57 172 65\r\n123 222 139\r\n189 246 156\r\n106 74 41\r\n164 115 49\r\n189 139 82\r\n205 164 106\r\n238 189 57\r\n255 255 106\r\n255 255 255\r\n0 0 0\r\n230 106 139\r\n164 82 106\r\n82 197 90\r\n"
  },
  {
    "path": "graphics/pokemon/tropius/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n16 123 189\r\n49 90 0\r\n106 148 0\r\n172 213 32\r\n205 246 65\r\n106 74 41\r\n222 156 8\r\n246 189 41\r\n255 222 74\r\n238 189 57\r\n255 255 106\r\n255 255 255\r\n0 0 0\r\n230 106 139\r\n164 82 106\r\n139 180 0\r\n"
  },
  {
    "path": "graphics/pokemon/typhlosion/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n98 139 180\r\n65 82 123\r\n41 57 98\r\n0 8 74\r\n255 238 148\r\n213 197 106\r\n164 139 74\r\n98 74 16\r\n255 222 0\r\n255 156 0\r\n255 98 0\r\n238 8 0\r\n16 16 16\r\n255 255 197\r\n"
  },
  {
    "path": "graphics/pokemon/typhlosion/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n213 106 90\r\n172 65 74\r\n131 41 65\r\n106 32 41\r\n255 230 115\r\n222 197 82\r\n172 139 49\r\n139 82 24\r\n255 222 0\r\n255 156 0\r\n255 98 0\r\n238 0 0\r\n16 16 16\r\n255 246 156\r\n"
  },
  {
    "path": "graphics/pokemon/tyranitar/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n197 238 197\r\n164 213 164\r\n115 164 115\r\n57 82 57\r\n255 0 255\r\n98 180 255\r\n74 156 230\r\n32 123 189\r\n0 74 139\r\n213 82 0\r\n148 41 0\r\n197 197 197\r\n115 115 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/tyranitar/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n246 213 148\r\n222 189 123\r\n172 139 82\r\n106 74 41\r\n255 0 255\r\n238 172 213\r\n213 148 197\r\n164 98 156\r\n106 49 98\r\n213 82 0\r\n148 41 0\r\n197 197 197\r\n115 115 115\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/tyrogue/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 222 255\r\n238 172 255\r\n205 131 205\r\n172 98 156\r\n131 49 90\r\n230 139 65\r\n205 98 41\r\n180 49 0\r\n115 0 0\r\n230 139 65\r\n180 49 0\r\n213 213 213\r\n172 172 172\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/tyrogue/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n238 230 205\r\n205 197 172\r\n156 148 131\r\n106 98 90\r\n90 82 65\r\n82 180 255\r\n65 139 230\r\n49 82 180\r\n32 65 131\r\n230 139 65\r\n180 49 0\r\n213 213 213\r\n172 172 172\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/umbreon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 0 255\r\n255 0 255\r\n49 41 41\r\n65 57 57\r\n90 82 82\r\n148 131 131\r\n180 164 164\r\n139 98 0\r\n205 148 41\r\n255 197 0\r\n255 238 139\r\n255 0 255\r\n16 16 16\r\n255 90 57\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/umbreon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 0 255\r\n255 0 255\r\n49 41 41\r\n65 57 57\r\n90 82 82\r\n148 131 131\r\n180 164 164\r\n32 74 148\r\n41 106 230\r\n98 180 255\r\n148 230 255\r\n255 0 255\r\n16 16 16\r\n255 213 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/unown/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n222 222 222\r\n255 255 255\r\n16 16 16\r\n164 164 164\r\n115 115 115\r\n82 82 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/unown/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n98 205 255\r\n255 255 255\r\n16 16 16\r\n41 115 255\r\n32 65 156\r\n49 57 106\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/ursaring/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n222 197 115\r\n197 164 82\r\n164 131 57\r\n123 98 24\r\n74 49 0\r\n255 246 164\r\n255 213 123\r\n213 172 82\r\n180 131 41\r\n255 0 255\r\n222 222 222\r\n180 180 189\r\n123 123 139\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/ursaring/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n164 230 65\r\n131 205 41\r\n98 172 16\r\n65 139 0\r\n57 82 0\r\n255 246 164\r\n255 213 123\r\n213 172 82\r\n180 131 41\r\n255 0 255\r\n222 222 222\r\n180 180 189\r\n123 123 139\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/vaporeon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n230 230 230\r\n172 172 205\r\n255 238 123\r\n230 189 74\r\n139 123 41\r\n115 139 180\r\n90 115 156\r\n49 65 123\r\n90 90 115\r\n131 238 213\r\n98 205 180\r\n57 164 139\r\n16 106 82\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/vaporeon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n255 255 255\r\n230 230 230\r\n172 172 205\r\n255 255 156\r\n230 197 74\r\n139 139 16\r\n172 90 115\r\n180 115 156\r\n131 57 90\r\n90 90 115\r\n255 197 246\r\n230 172 230\r\n189 131 197\r\n123 65 139\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/venomoth/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 205 139\r\n255 255 255\r\n230 230 230\r\n172 197 197\r\n230 213 172\r\n197 172 139\r\n164 131 106\r\n98 82 57\r\n238 230 98\r\n246 213 82\r\n16 16 16\r\n246 222 255\r\n238 197 255\r\n213 172 222\r\n172 139 205\r\n98 74 115\r\n"
  },
  {
    "path": "graphics/pokemon/venomoth/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 148\r\n255 255 255\r\n230 230 230\r\n172 197 197\r\n230 213 172\r\n197 172 139\r\n164 131 106\r\n98 82 57\r\n238 230 98\r\n246 213 82\r\n16 16 16\r\n156 213 255\r\n139 189 238\r\n139 172 230\r\n98 131 197\r\n49 74 115\r\n"
  },
  {
    "path": "graphics/pokemon/venonat/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 213 156\r\n255 255 255\r\n148 115 164\r\n213 213 213\r\n123 123 123\r\n255 180 172\r\n255 123 82\r\n197 82 32\r\n238 189 156\r\n189 139 106\r\n131 82 49\r\n164 139 189\r\n139 106 156\r\n106 82 115\r\n65 57 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/venonat/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n148 115 164\r\n213 213 213\r\n131 131 131\r\n156 230 255\r\n106 180 255\r\n57 131 197\r\n238 189 156\r\n189 139 106\r\n139 90 57\r\n180 123 197\r\n148 82 164\r\n106 65 115\r\n65 16 82\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/venusaur/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n238 238 238\r\n32 98 49\r\n98 156 115\r\n90 205 148\r\n139 238 189\r\n139 57 0\r\n189 106 49\r\n16 16 16\r\n230 74 65\r\n255 131 115\r\n156 246 139\r\n222 205 49\r\n255 238 82\r\n65 164 24\r\n106 205 65\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/venusaur/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n16 82 32\r\n131 164 0\r\n180 213 16\r\n213 246 49\r\n131 49 0\r\n189 106 49\r\n16 16 16\r\n246 123 0\r\n255 197 41\r\n156 246 139\r\n255 238 82\r\n255 255 255\r\n41 164 16\r\n82 205 57\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/vibrava/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n139 238 180\r\n98 197 148\r\n49 139 98\r\n255 255 164\r\n230 213 139\r\n189 180 123\r\n222 222 255\r\n189 189 222\r\n205 205 205\r\n123 115 57\r\n0 0 0\r\n164 164 164\r\n131 131 131\r\n82 82 82\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/vibrava/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n255 180 123\r\n246 123 74\r\n197 82 24\r\n255 255 164\r\n230 213 139\r\n189 180 123\r\n222 222 255\r\n189 189 222\r\n205 205 205\r\n123 115 57\r\n0 0 0\r\n164 164 164\r\n131 131 131\r\n106 106 106\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/victreebel/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n180 131 41\r\n213 213 213\r\n255 164 115\r\n213 74 32\r\n255 230 156\r\n255 213 106\r\n230 172 90\r\n189 255 115\r\n156 213 74\r\n115 172 49\r\n82 98 41\r\n180 123 49\r\n106 65 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/victreebel/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n131 148 8\r\n213 213 213\r\n90 156 222\r\n49 115 180\r\n255 255 156\r\n230 255 106\r\n189 213 65\r\n238 213 115\r\n197 172 74\r\n156 131 32\r\n106 82 16\r\n180 123 49\r\n106 65 0\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/vigoroth/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 123 164\r\n82 65 32\r\n115 49 49\r\n115 82 41\r\n139 106 65\r\n65 65 65\r\n131 131 131\r\n205 205 205\r\n255 255 255\r\n139 65 90\r\n213 57 49\r\n255 98 98\r\n230 230 230\r\n172 131 98\r\n90 90 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/vigoroth/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n74 123 164\r\n82 65 32\r\n115 49 49\r\n115 82 41\r\n139 106 65\r\n65 65 65\r\n205 148 82\r\n246 213 115\r\n255 255 255\r\n172 74 0\r\n230 82 24\r\n255 164 98\r\n255 238 156\r\n172 131 98\r\n90 90 82\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/vileplume/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n255 164 41\r\n197 156 41\r\n180 106 32\r\n255 98 98\r\n238 49 49\r\n197 65 82\r\n139 32 24\r\n255 205 213\r\n246 172 180\r\n115 131 164\r\n90 98 131\r\n65 74 98\r\n24 41 74\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/vileplume/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 255 255\r\n255 230 156\r\n230 172 90\r\n189 131 49\r\n255 238 123\r\n246 205 90\r\n230 164 41\r\n172 90 24\r\n255 255 238\r\n255 246 205\r\n98 180 74\r\n90 148 74\r\n74 115 65\r\n32 74 24\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/volbeat/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n222 222 222\r\n139 139 148\r\n74 74 82\r\n0 0 0\r\n246 131 115\r\n230 82 98\r\n205 57 82\r\n139 49 74\r\n255 230 82\r\n222 189 82\r\n98 74 49\r\n164 180 197\r\n123 139 164\r\n74 82 106\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/volbeat/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 148\r\n222 222 222\r\n139 139 148\r\n74 74 82\r\n0 0 0\r\n123 197 255\r\n90 172 230\r\n49 131 197\r\n74 74 131\r\n255 230 82\r\n222 189 82\r\n98 74 49\r\n205 139 222\r\n164 82 189\r\n65 32 82\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/voltorb/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n222 213 213\r\n180 172 172\r\n90 82 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 131 131\r\n255 172 156\r\n255 82 32\r\n230 65 0\r\n205 65 65\r\n131 16 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/voltorb/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n222 213 213\r\n180 172 172\r\n90 82 82\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n49 90 205\r\n82 106 238\r\n41 65 197\r\n0 24 156\r\n0 0 115\r\n0 0 74\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/vulpix/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n255 230 180\r\n255 222 148\r\n16 16 16\r\n238 156 74\r\n205 123 41\r\n172 90 8\r\n255 131 74\r\n222 106 41\r\n189 65 41\r\n148 49 0\r\n246 189 123\r\n230 148 106\r\n197 115 74\r\n131 57 0\r\n"
  },
  {
    "path": "graphics/pokemon/vulpix/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 180\r\n255 255 255\r\n246 255 230\r\n213 222 189\r\n16 16 16\r\n197 180 41\r\n156 139 0\r\n115 98 0\r\n246 205 8\r\n222 180 0\r\n180 139 0\r\n123 82 0\r\n246 238 82\r\n222 213 0\r\n197 180 0\r\n90 74 0\r\n"
  },
  {
    "path": "graphics/pokemon/wailmer/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 172 90\r\n32 49 74\r\n49 106 156\r\n74 131 180\r\n98 156 205\r\n255 238 205\r\n238 213 164\r\n205 180 131\r\n0 0 0\r\n156 139 98\r\n148 197 238\r\n57 82 123\r\n106 98 74\r\n131 139 156\r\n180 189 197\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/wailmer/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 172 90\r\n82 41 123\r\n148 106 189\r\n180 139 222\r\n213 172 255\r\n255 238 205\r\n238 213 164\r\n205 180 131\r\n0 0 0\r\n156 139 98\r\n246 205 255\r\n115 74 156\r\n106 98 74\r\n131 139 156\r\n180 189 197\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/wailord/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 197\r\n238 230 255\r\n213 205 222\r\n180 172 180\r\n180 156 172\r\n131 115 131\r\n148 172 255\r\n82 131 255\r\n49 98 255\r\n41 82 197\r\n49 57 90\r\n123 106 98\r\n82 74 74\r\n0 0 0\r\n180 205 255\r\n41 82 123\r\n"
  },
  {
    "path": "graphics/pokemon/wailord/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 197\r\n238 230 255\r\n213 205 222\r\n180 172 180\r\n180 156 172\r\n131 115 131\r\n230 197 255\r\n213 172 255\r\n172 131 213\r\n131 90 172\r\n82 41 123\r\n123 106 98\r\n82 74 74\r\n0 0 0\r\n246 222 255\r\n115 74 156\r\n"
  },
  {
    "path": "graphics/pokemon/walrein/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 115 148\r\n49 82 123\r\n57 115 172\r\n90 139 197\r\n131 180 230\r\n164 131 90\r\n255 197 98\r\n255 222 131\r\n255 255 164\r\n197 49 49\r\n238 131 131\r\n123 180 255\r\n197 205 222\r\n0 0 0\r\n222 230 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/walrein/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 115 148\r\n82 74 123\r\n164 90 189\r\n197 131 222\r\n230 180 238\r\n164 131 90\r\n255 197 98\r\n255 222 131\r\n255 255 164\r\n197 49 49\r\n238 131 131\r\n123 180 255\r\n197 205 222\r\n0 0 0\r\n222 230 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/wartortle/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 238 230\r\n255 255 255\r\n230 238 230\r\n197 213 222\r\n197 49 0\r\n205 131 32\r\n148 98 98\r\n106 74 24\r\n246 238 139\r\n222 197 139\r\n189 139 57\r\n213 189 255\r\n172 139 238\r\n123 106 197\r\n82 65 123\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/wartortle/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n197 238 197\r\n156 213 164\r\n197 49 0\r\n164 148 65\r\n98 115 32\r\n65 82 0\r\n255 222 115\r\n230 172 90\r\n189 139 57\r\n230 205 238\r\n205 172 230\r\n164 139 180\r\n82 65 106\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/weedle/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n205 205 205\r\n131 131 148\r\n255 205 115\r\n238 172 65\r\n213 139 106\r\n139 41 16\r\n255 205 180\r\n230 106 106\r\n205 41 0\r\n139 41 16\r\n255 238 180\r\n238 172 115\r\n255 0 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/weedle/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n205 205 205\r\n131 131 148\r\n255 246 106\r\n255 222 65\r\n230 180 49\r\n156 98 24\r\n246 197 213\r\n230 164 205\r\n180 115 148\r\n115 65 98\r\n255 238 180\r\n213 197 106\r\n255 0 255\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/weepinbell/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n246 246 246\r\n255 255 255\r\n180 131 41\r\n255 164 115\r\n238 115 65\r\n189 65 16\r\n255 230 156\r\n255 213 106\r\n238 180 0\r\n189 255 115\r\n156 213 74\r\n115 172 49\r\n82 98 41\r\n172 123 41\r\n115 82 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/weepinbell/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n246 246 246\r\n255 255 255\r\n106 139 16\r\n197 172 180\r\n156 131 139\r\n115 90 98\r\n255 255 115\r\n222 230 74\r\n180 189 32\r\n246 255 123\r\n205 238 82\r\n164 197 41\r\n74 106 0\r\n172 123 41\r\n115 82 16\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/weezing/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 205 156\r\n255 255 255\r\n230 230 230\r\n230 205 57\r\n255 230 0\r\n222 98 32\r\n164 32 0\r\n255 255 123\r\n230 213 115\r\n197 180 41\r\n238 172 197\r\n213 148 172\r\n180 106 139\r\n139 65 98\r\n98 41 65\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/weezing/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 205\r\n255 255 255\r\n222 222 222\r\n172 90 156\r\n205 123 172\r\n222 98 32\r\n164 32 0\r\n213 139 197\r\n180 106 164\r\n139 65 123\r\n172 222 213\r\n148 189 189\r\n106 148 148\r\n41 82 82\r\n8 49 49\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/pokemon/whiscash/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 156 90\r\n0 0 0\r\n82 98 148\r\n98 115 164\r\n115 139 180\r\n148 180 222\r\n222 164 57\r\n255 213 74\r\n172 238 255\r\n57 74 115\r\n139 106 49\r\n131 148 172\r\n131 197 230\r\n106 189 222\r\n131 222 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/whiscash/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n164 156 90\r\n0 0 0\r\n57 65 82\r\n74 82 98\r\n115 106 123\r\n148 139 156\r\n222 98 49\r\n255 123 82\r\n172 238 255\r\n57 74 115\r\n180 65 49\r\n131 148 172\r\n131 197 230\r\n106 189 222\r\n131 222 255\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/whismur/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 164 238\r\n238 148 213\r\n222 106 189\r\n189 82 139\r\n139 57 98\r\n115 8 24\r\n255 213 123\r\n246 172 57\r\n213 156 0\r\n164 115 24\r\n213 213 222\r\n156 156 164\r\n90 90 106\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/whismur/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n255 205 205\r\n255 172 197\r\n238 123 156\r\n222 90 115\r\n189 49 65\r\n115 8 24\r\n205 255 172\r\n148 230 148\r\n115 189 115\r\n65 139 90\r\n213 213 222\r\n156 156 164\r\n90 90 106\r\n41 41 57\r\n"
  },
  {
    "path": "graphics/pokemon/wigglytuff/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n148 222 205\r\n230 49 49\r\n82 164 139\r\n32 90 98\r\n156 106 32\r\n115 65 24\r\n230 230 230\r\n205 205 205\r\n16 16 16\r\n255 222 205\r\n255 197 172\r\n246 148 148\r\n205 106 98\r\n156 74 74\r\n"
  },
  {
    "path": "graphics/pokemon/wigglytuff/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n98 230 131\r\n230 49 49\r\n90 197 106\r\n57 156 65\r\n156 106 32\r\n115 65 24\r\n230 230 230\r\n205 205 205\r\n16 16 16\r\n255 222 238\r\n246 197 230\r\n230 172 213\r\n180 115 164\r\n74 24 74\r\n"
  },
  {
    "path": "graphics/pokemon/wingull/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 255\r\n57 57 57\r\n139 139 139\r\n222 213 255\r\n197 189 230\r\n246 238 255\r\n49 82 139\r\n222 131 0\r\n255 172 49\r\n139 90 16\r\n82 115 230\r\n115 164 255\r\n98 98 98\r\n0 0 0\r\n0 0 0\r\n255 205 106\r\n"
  },
  {
    "path": "graphics/pokemon/wingull/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 205 255\r\n57 57 57\r\n131 156 164\r\n222 197 246\r\n205 172 230\r\n246 238 255\r\n41 106 41\r\n222 131 0\r\n255 172 49\r\n139 90 16\r\n90 156 57\r\n123 205 90\r\n98 98 98\r\n0 0 0\r\n0 0 0\r\n255 205 106\r\n"
  },
  {
    "path": "graphics/pokemon/wobbuffet/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 0 255\r\n164 16 0\r\n197 57 0\r\n222 82 0\r\n255 139 0\r\n41 74 82\r\n32 115 148\r\n74 156 189\r\n106 189 222\r\n156 213 238\r\n255 0 255\r\n16 16 16\r\n82 82 82\r\n131 131 131\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/wobbuffet/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n255 0 255\r\n164 16 0\r\n197 57 0\r\n222 82 0\r\n255 139 0\r\n106 57 90\r\n156 65 139\r\n205 90 189\r\n238 123 205\r\n255 164 213\r\n255 0 255\r\n16 16 16\r\n82 82 82\r\n131 131 131\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/wooper/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n148 131 164\r\n16 41 115\r\n49 74 131\r\n74 156 213\r\n139 197 246\r\n197 230 230\r\n238 172 255\r\n197 123 197\r\n148 98 164\r\n98 57 106\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/wooper/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n180 90 98\r\n123 57 49\r\n156 90 90\r\n213 156 164\r\n246 197 205\r\n255 230 213\r\n255 213 172\r\n230 148 98\r\n197 98 82\r\n131 74 74\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n16 16 16\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon/wurmple/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 197\r\n98 82 82\r\n180 164 156\r\n255 255 255\r\n230 213 238\r\n205 82 90\r\n246 123 98\r\n246 189 139\r\n230 213 238\r\n222 213 164\r\n255 255 213\r\n148 148 0\r\n246 246 0\r\n197 197 90\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/wurmple/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 197 197\r\n98 82 82\r\n180 164 156\r\n255 255 255\r\n230 213 238\r\n164 82 139\r\n189 131 164\r\n222 164 197\r\n230 213 238\r\n222 213 164\r\n255 255 213\r\n148 148 0\r\n246 246 0\r\n197 197 90\r\n0 0 0\r\n24 24 24\r\n"
  },
  {
    "path": "graphics/pokemon/wynaut/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 148 98\r\n41 74 82\r\n74 156 189\r\n106 189 222\r\n156 213 238\r\n164 49 65\r\n222 90 98\r\n65 57 57\r\n131 123 123\r\n106 98 98\r\n205 205 197\r\n255 255 255\r\n57 123 164\r\n123 41 57\r\n0 0 0\r\n205 246 164\r\n"
  },
  {
    "path": "graphics/pokemon/wynaut/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n197 148 98\r\n106 57 90\r\n197 82 189\r\n238 123 205\r\n255 164 213\r\n164 49 65\r\n222 90 98\r\n65 57 57\r\n131 123 123\r\n106 98 98\r\n205 205 197\r\n255 255 255\r\n180 115 90\r\n123 41 57\r\n0 0 0\r\n205 246 164\r\n"
  },
  {
    "path": "graphics/pokemon/xatu/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n156 230 74\r\n82 205 74\r\n74 148 65\r\n49 98 41\r\n255 222 65\r\n189 148 32\r\n139 90 0\r\n238 57 0\r\n180 49 0\r\n131 41 0\r\n205 205 205\r\n148 148 148\r\n82 82 82\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/xatu/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n255 255 255\r\n189 255 65\r\n164 230 49\r\n115 189 8\r\n65 106 0\r\n255 222 65\r\n189 148 32\r\n139 90 0\r\n255 164 57\r\n213 106 16\r\n115 74 0\r\n205 205 205\r\n148 148 148\r\n82 82 82\r\n41 41 41\r\n"
  },
  {
    "path": "graphics/pokemon/yanma/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n148 49 0\r\n255 0 255\r\n213 65 0\r\n255 123 65\r\n255 222 148\r\n16 16 16\r\n49 106 0\r\n82 180 32\r\n131 238 32\r\n74 74 82\r\n255 0 255\r\n115 131 139\r\n164 180 213\r\n230 255 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/yanma/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n205 205 172\r\n0 65 148\r\n255 0 255\r\n41 115 230\r\n74 180 255\r\n115 230 255\r\n16 16 16\r\n49 106 0\r\n82 180 32\r\n131 238 32\r\n74 74 82\r\n255 0 255\r\n115 131 139\r\n164 180 213\r\n230 255 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/zangoose/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 197\r\n255 255 255\r\n230 222 230\r\n189 172 180\r\n148 131 139\r\n106 90 98\r\n255 98 106\r\n205 90 106\r\n139 65 82\r\n255 164 148\r\n213 139 230\r\n123 106 98\r\n213 197 205\r\n0 0 0\r\n180 98 205\r\n123 57 131\r\n"
  },
  {
    "path": "graphics/pokemon/zangoose/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 197 197\r\n255 255 255\r\n230 222 230\r\n189 172 180\r\n148 131 139\r\n106 90 98\r\n49 131 197\r\n74 74 131\r\n57 57 115\r\n90 172 230\r\n255 123 82\r\n123 106 98\r\n213 197 205\r\n0 0 0\r\n222 98 49\r\n180 49 32\r\n"
  },
  {
    "path": "graphics/pokemon/zapdos/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 213 123\r\n255 255 255\r\n222 222 222\r\n156 156 156\r\n65 65 65\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 189 57\r\n222 164 49\r\n148 90 32\r\n255 255 139\r\n255 238 0\r\n230 205 16\r\n172 139 65\r\n123 90 41\r\n"
  },
  {
    "path": "graphics/pokemon/zapdos/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 189\r\n255 255 255\r\n222 222 222\r\n156 156 156\r\n90 90 90\r\n16 16 16\r\n255 0 255\r\n255 0 255\r\n255 106 65\r\n213 65 32\r\n156 57 41\r\n255 238 32\r\n255 197 0\r\n205 148 0\r\n156 98 0\r\n115 57 0\r\n"
  },
  {
    "path": "graphics/pokemon/zigzagoon/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 189 131\r\n74 65 41\r\n172 123 90\r\n205 156 123\r\n238 189 156\r\n255 238 197\r\n65 57 49\r\n106 90 74\r\n197 172 139\r\n230 213 172\r\n255 255 255\r\n164 32 0\r\n205 57 32\r\n164 148 123\r\n123 90 74\r\n16 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/zigzagoon/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 189 131\r\n74 65 41\r\n197 98 65\r\n222 131 74\r\n238 164 74\r\n255 238 197\r\n49 49 41\r\n98 57 41\r\n197 172 139\r\n230 213 172\r\n255 255 255\r\n164 32 0\r\n205 57 32\r\n164 148 123\r\n131 82 57\r\n16 0 0\r\n"
  },
  {
    "path": "graphics/pokemon/zubat/normal.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n213 213 213\r\n98 98 98\r\n16 16 16\r\n255 0 255\r\n189 205 255\r\n139 180 238\r\n106 139 189\r\n74 65 123\r\n246 131 222\r\n213 115 189\r\n180 82 156\r\n115 32 90\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon/zubat/shiny.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n230 230 230\r\n255 255 255\r\n213 213 213\r\n98 98 98\r\n16 16 16\r\n255 0 255\r\n148 180 98\r\n106 139 57\r\n65 98 16\r\n24 57 0\r\n238 222 213\r\n205 180 172\r\n164 139 131\r\n106 82 74\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon_jump/bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 156 197\r\n106 222 156\r\n106 230 230\r\n139 230 255\r\n156 238 255\r\n197 246 255\r\n189 213 131\r\n230 213 115\r\n238 230 131\r\n246 246 156\r\n222 222 172\r\n106 230 172\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/pokemon_jump/bonuses.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 156 197\r\n148 197 115\r\n172 222 123\r\n213 180 57\r\n238 205 65\r\n230 164 131\r\n246 189 172\r\n98 98 82\r\n164 148 90\r\n205 189 82\r\n255 238 74\r\n156 164 230\r\n90 90 106\r\n172 148 106\r\n230 205 123\r\n180 189 246\r\n"
  },
  {
    "path": "graphics/pokemon_jump/interface.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n0 0 0\r\n222 222 213\r\n255 156 24\r\n255 222 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon_jump/pal1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 156 197\r\n65 148 74\r\n82 180 74\r\n106 205 74\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n98 98 82\r\n205 189 82\r\n255 246 82\r\n255 255 255\r\n238 172 131\r\n238 230 131\r\n"
  },
  {
    "path": "graphics/pokemon_jump/pal2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n49 123 57\r\n65 139 57\r\n82 164 57\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon_jump/venusaur.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 213 213\r\n32 98 49\r\n98 156 115\r\n90 205 148\r\n139 238 189\r\n139 57 0\r\n189 106 49\r\n16 16 16\r\n230 74 65\r\n255 131 115\r\n156 246 139\r\n222 205 49\r\n255 238 82\r\n65 164 24\r\n106 205 65\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/pokemon_special_anim/bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 222 205\r\n255 222 189\r\n255 222 180\r\n255 213 180\r\n255 205 180\r\n255 205 164\r\n255 205 156\r\n255 205 139\r\n0 0 0\r\n255 197 139\r\n255 172 131\r\n255 213 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon_special_anim/bg_tm_hm.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 238 255\r\n213 238 255\r\n213 230 255\r\n213 230 255\r\n205 230 255\r\n205 222 255\r\n205 222 255\r\n197 222 255\r\n0 0 0\r\n189 222 255\r\n172 213 255\r\n205 230 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon_storage/interface.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n148 148 172\r\n115 115 123\r\n82 82 90\r\n148 148 172\r\n246 172 82\r\n164 164 180\r\n0 0 0\r\n164 205 246\r\n123 180 213\r\n255 222 148\r\n213 230 255\r\n180 213 246\r\n156 205 238\r\n255 255 255\r\n90 255 238\r\n"
  },
  {
    "path": "graphics/pokemon_storage/interface_no_display_mon.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 246 148\r\n148 148 172\r\n115 115 123\r\n82 82 90\r\n139 139 164\r\n164 123 0\r\n164 164 180\r\n0 0 0\r\n164 205 246\r\n123 180 213\r\n197 189 24\r\n213 230 255\r\n180 213 246\r\n156 205 238\r\n180 180 180\r\n90 255 238\r\n"
  },
  {
    "path": "graphics/pokemon_storage/menu.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 90 57\r\n148 148 172\r\n255 255 255\r\n0 0 0\r\n222 222 246\r\n90 189 238\r\n164 164 180\r\n98 98 115\r\n0 0 0\r\n82 82 90\r\n189 238 98\r\n164 222 74\r\n164 230 74\r\n180 230 115\r\n148 205 57\r\n148 148 172\r\n"
  },
  {
    "path": "graphics/pokemon_storage/misc1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 197 255\r\n148 148 172\r\n82 82 90\r\n255 230 90\r\n246 222 115\r\n246 230 180\r\n205 123 0\r\n123 74 0\r\n255 255 255\r\n255 255 255\r\n255 255 255\r\n255 180 106\r\n255 164 0\r\n255 255 255\r\n222 222 222\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon_storage/misc2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n148 148 172\r\n82 82 90\r\n255 255 255\r\n205 255 255\r\n90 189 238\r\n90 164 205\r\n82 131 164\r\n82 106 123\r\n82 82 90\r\n0 0 0\r\n222 222 246\r\n164 164 180\r\n148 148 172\r\n115 115 123\r\n82 82 90\r\n"
  },
  {
    "path": "graphics/pokemon_storage/party_menu.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n131 172 180\r\n41 106 98\r\n82 98 115\r\n74 172 164\r\n57 139 139\r\n164 213 246\r\n115 189 98\r\n255 255 255\r\n123 189 255\r\n0 123 255\r\n41 90 164\r\n123 205 180\r\n8 74 65\r\n164 238 148\r\n65 82 90\r\n"
  },
  {
    "path": "graphics/pokemon_storage/scrolling_bg_move_items.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n148 148 172\r\n255 255 255\r\n0 0 0\r\n123 189 255\r\n0 123 255\r\n255 131 131\r\n172 24 24\r\n230 246 255\r\n222 238 246\r\n213 238 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/pokemon_storage/unused.pal",
    "content": "JASC-PAL\r\n0100\r\n32\r\n0 0 0\r\n65 205 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 139 189\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n148 148 172\r\n0 0 0\r\n255 156 148\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n189 90 82\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n148 148 172\r\n"
  },
  {
    "path": "graphics/pokemon_storage/unused_choose_box_menu.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n246 222 115\r\n246 230 180\r\n205 123 0\r\n123 74 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/region_map/cursor.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 156 0\r\n255 255 255\r\n255 255 255\r\n230 230 246\r\n205 205 230\r\n180 180 222\r\n156 156 205\r\n131 131 197\r\n98 98 180\r\n74 74 164\r\n49 49 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/region_map/misc_icon.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 148 172\r\n255 255 255\r\n205 205 205\r\n148 148 148\r\n98 98 98\r\n139 205 255\r\n90 131 246\r\n90 106 180\r\n255 255 24\r\n189 156 65\r\n90 74 49\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/region_map/player_icon_leaf.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n172 123 65\r\n255 197 148\r\n222 148 115\r\n123 65 65\r\n65 65 213\r\n57 57 123\r\n115 164 197\r\n106 41 41\r\n238 238 255\r\n180 180 213\r\n255 106 74\r\n197 57 57\r\n255 222 90\r\n189 156 57\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/region_map/player_icon_red.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n172 123 65\r\n255 197 148\r\n222 148 115\r\n123 65 65\r\n65 65 213\r\n57 57 123\r\n115 164 197\r\n106 41 41\r\n238 238 255\r\n180 180 213\r\n255 106 74\r\n197 57 57\r\n255 222 90\r\n189 156 57\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/region_map/region_map.pal",
    "content": "JASC-PAL\r\n0100\r\n80\r\n0 0 0\r\n24 131 8\r\n57 172 8\r\n82 205 8\r\n115 230 32\r\n172 246 57\r\n230 164 0\r\n238 189 57\r\n246 213 82\r\n238 230 115\r\n230 222 164\r\n205 205 148\r\n82 148 213\r\n90 172 230\r\n156 213 255\r\n164 180 255\r\n0 0 0\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n246 238 139\r\n148 0 0\r\n255 57 16\r\n255 172 16\r\n98 98 98\r\n205 205 205\r\n255 255 255\r\n230 164 0\r\n238 189 57\r\n246 213 82\r\n238 230 115\r\n0 0 0\r\n139 74 49\r\n180 82 49\r\n230 115 49\r\n246 205 49\r\n189 156 41\r\n57 164 49\r\n82 213 49\r\n222 189 49\r\n255 0 255\r\n255 0 255\r\n164 164 164\r\n230 230 238\r\n65 65 74\r\n115 115 115\r\n255 255 255\r\n0 0 0\r\n189 156 41\r\n255 222 49\r\n246 246 238\r\n98 98 98\r\n115 115 98\r\n164 172 172\r\n255 57 16\r\n222 156 57\r\n90 131 172\r\n106 65 65\r\n49 49 49\r\n205 123 74\r\n255 0 255\r\n156 213 255\r\n164 180 255\r\n0 0 0\r\n255 255 255\r\n205 205 205\r\n148 148 148\r\n98 98 98\r\n139 205 255\r\n90 131 246\r\n90 106 180\r\n255 255 24\r\n189 156 65\r\n90 74 49\r\n189 189 180\r\n205 205 189\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/region_map/region_map_hoenn.pal",
    "content": "JASC-PAL\r\n0100\r\n32\r\n0 0 0\r\n156 213 255\r\n164 180 255\r\n123 180 213\r\n74 156 230\r\n41 131 230\r\n65 106 205\r\n0 115 172\r\n32 74 197\r\n0 57 139\r\n213 255 123\r\n172 238 49\r\n98 213 0\r\n57 172 8\r\n0 115 0\r\n205 205 148\r\n0 0 0\r\n255 255 255\r\n238 230 172\r\n238 230 115\r\n238 189 57\r\n246 213 82\r\n230 164 0\r\n255 172 16\r\n255 57 16\r\n246 0 0\r\n148 0 0\r\n205 205 205\r\n98 98 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/region_map/switch_map_cursor.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 139 139\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/region_map/top_bar.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n255 164 74\r\n230 222 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n16 115 230\r\n"
  },
  {
    "path": "graphics/seagallop/ferry_and_wake.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n65 123 180\r\n238 246 255\r\n222 230 238\r\n189 205 230\r\n156 164 189\r\n139 139 156\r\n98 98 123\r\n57 57 106\r\n197 98 98\r\n172 65 106\r\n32 74 156\r\n197 148 0\r\n246 213 24\r\n222 238 255\r\n255 255 255\r\n74 106 139\r\n"
  },
  {
    "path": "graphics/slot_machine/firered/match_lines.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n213 57 0\r\n205 90 0\r\n255 255 255\r\n238 172 0\r\n0 164 238\r\n238 131 0\r\n238 131 0\r\n0 222 0\r\n0 222 0\r\n139 255 255\r\n255 238 106\r\n255 238 106\r\n148 255 148\r\n148 255 148\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/slot_machine/firered/payout_lights.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n222 222 222\r\n255 255 255\r\n238 172 0\r\n255 255 131\r\n255 180 65\r\n255 255 255\r\n255 255 131\r\n255 255 131\r\n255 180 65\r\n255 180 65\r\n255 90 0\r\n255 90 0\r\n222 41 0\r\n255 205 32\r\n156 0 0\r\n0 0 0\r\n222 222 222\r\n255 255 255\r\n238 172 0\r\n255 180 65\r\n255 90 0\r\n255 255 131\r\n255 180 65\r\n255 255 255\r\n255 255 131\r\n255 255 131\r\n255 180 65\r\n255 180 65\r\n255 90 0\r\n255 205 32\r\n156 0 0\r\n0 0 0\r\n222 222 222\r\n255 255 255\r\n238 172 0\r\n255 90 0\r\n222 41 0\r\n255 180 65\r\n255 90 0\r\n255 255 131\r\n255 180 65\r\n255 255 255\r\n255 255 131\r\n255 255 131\r\n255 180 65\r\n255 205 32\r\n156 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/slot_machine/leafgreen/match_lines.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n222 222 222\r\n65 156 41\r\n90 164 57\r\n255 255 255\r\n139 222 82\r\n0 180 255\r\n255 148 0\r\n255 148 0\r\n0 238 0\r\n0 238 0\r\n139 255 255\r\n255 238 106\r\n255 238 106\r\n148 255 148\r\n148 255 148\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/slot_machine/leafgreen/payout_lights.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n222 222 222\r\n255 255 255\r\n139 222 82\r\n255 255 131\r\n255 180 65\r\n255 255 255\r\n255 255 131\r\n255 255 131\r\n255 180 65\r\n255 180 65\r\n255 90 0\r\n255 90 0\r\n222 41 0\r\n197 246 139\r\n156 0 0\r\n0 0 0\r\n222 222 222\r\n255 255 255\r\n139 222 82\r\n255 180 65\r\n255 90 0\r\n255 255 131\r\n255 180 65\r\n255 255 255\r\n255 255 131\r\n255 255 131\r\n255 180 65\r\n255 180 65\r\n255 90 0\r\n197 246 139\r\n156 0 0\r\n0 0 0\r\n222 222 222\r\n255 255 255\r\n139 222 82\r\n255 90 0\r\n222 41 0\r\n255 180 65\r\n255 90 0\r\n255 255 131\r\n255 180 65\r\n255 255 255\r\n255 255 131\r\n255 255 131\r\n255 180 65\r\n197 246 139\r\n156 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/summary_screen/hp_bar_red.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 189 148\r\n255 90 57\r\n172 65 74\r\n123 131 148\r\n98 106 123\r\n255 213 82\r\n255 180 65\r\n139 205 255\r\n82 164 238\r\n0 0 0\r\n0 0 0\r\n180 172 139\r\n156 148 115\r\n131 139 156\r\n98 106 123\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/summary_screen/hp_bar_yellow.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 189 148\r\n255 230 57\r\n205 172 8\r\n123 131 148\r\n98 106 123\r\n255 213 82\r\n255 180 65\r\n139 205 255\r\n82 164 238\r\n0 0 0\r\n0 0 0\r\n180 172 139\r\n156 148 115\r\n131 139 156\r\n98 106 123\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/summary_screen/marking.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n222 222 222\r\n238 230 238\r\n255 139 8\r\n246 189 123\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/summary_screen/move_selection_cursor.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n230 57 0\r\n0 90 213\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/summary_screen/text_header.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n238 222 0\r\n255 246 139\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n16 115 230\r\n"
  },
  {
    "path": "graphics/summary_screen/text_moves.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n238 222 0\r\n255 246 139\r\n255 148 0\r\n255 238 115\r\n238 0 0\r\n246 222 156\r\n32 32 32\r\n222 222 222\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/teachy_tv/palettes.pal",
    "content": "JASC-PAL\r\n0100\r\n64\r\n115 205 164\r\n255 255 255\r\n98 98 98\r\n255 230 90\r\n246 180 0\r\n189 115 0\r\n123 123 255\r\n74 65 74\r\n49 49 57\r\n98 106 106\r\n131 139 139\r\n255 0 255\r\n255 0 255\r\n255 255 180\r\n246 205 41\r\n213 156 16\r\n115 205 164\r\n255 255 255\r\n230 230 238\r\n205 213 222\r\n180 197 205\r\n164 180 189\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n115 205 164\r\n156 255 255\r\n255 255 255\r\n255 222 32\r\n246 230 164\r\n255 74 24\r\n255 148 139\r\n255 156 24\r\n131 230 222\r\n24 32 32\r\n156 189 213\r\n74 131 189\r\n90 222 164\r\n205 238 139\r\n255 0 255\r\n255 0 255\r\n115 205 164\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n255 0 255\r\n255 0 255\r\n74 65 74\r\n164 164 164\r\n197 197 205\r\n230 230 238\r\n"
  },
  {
    "path": "graphics/text_window/stdpal_0.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n255 255 255\r\n213 230 246\r\n164 213 230\r\n230 246 255\r\n115 164 197\r\n74 115 164\r\n"
  },
  {
    "path": "graphics/text_window/stdpal_1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n255 255 255\r\n205 205 222\r\n205 205 222\r\n230 246 255\r\n205 205 222\r\n106 115 123\r\n"
  },
  {
    "path": "graphics/text_window/stdpal_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n255 255 255\r\n74 205 238\r\n16 172 222\r\n0 82 115\r\n0 115 139\r\n0 123 197\r\n"
  },
  {
    "path": "graphics/text_window/stdpal_3.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n255 0 255\r\n205 213 213\r\n156 205 222\r\n98 115 123\r\n65 172 230\r\n131 164 180\r\n"
  },
  {
    "path": "graphics/text_window/stdpal_4.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 205 164\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n57 98 115\r\n131 131 131\r\n164 164 164\r\n197 197 205\r\n230 230 238\r\n65 90 106\r\n"
  },
  {
    "path": "graphics/title_screen/firered/background.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 139\r\n0 0 0\r\n123 123 123\r\n197 197 197\r\n222 222 222\r\n255 255 255\r\n0 0 0\r\n123 123 123\r\n197 197 197\r\n222 222 222\r\n255 255 255\r\n65 180 164\r\n139 0 0\r\n172 24 0\r\n213 57 0\r\n255 90 0\r\n"
  },
  {
    "path": "graphics/title_screen/firered/box_art_mon.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 255\r\n0 0 0\r\n82 205 180\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n32 0 0\r\n49 0 0\r\n65 0 0\r\n90 0 0\r\n123 32 0\r\n156 32 0\r\n180 49 0\r\n205 65 0\r\n222 90 0\r\n230 123 0\r\n"
  },
  {
    "path": "graphics/title_screen/firered/game_title_logo.pal",
    "content": "JASC-PAL\r\n0100\r\n256\r\n0 255 41\r\n0 0 0\r\n255 238 16\r\n246 222 41\r\n246 238 246\r\n255 246 24\r\n246 246 41\r\n246 246 246\r\n246 255 255\r\n255 246 255\r\n32 0 255\r\n106 65 156\r\n32 0 238\r\n246 222 24\r\n246 222 32\r\n255 238 41\r\n255 238 49\r\n255 255 16\r\n255 255 24\r\n255 255 246\r\n255 255 255\r\n123 106 156\r\n24 41 32\r\n32 32 74\r\n32 0 230\r\n115 82 164\r\n16 0 246\r\n106 82 172\r\n246 238 32\r\n255 230 24\r\n246 230 41\r\n246 238 41\r\n246 230 49\r\n246 238 49\r\n255 246 32\r\n255 246 41\r\n255 255 32\r\n255 255 41\r\n32 24 32\r\n32 32 41\r\n197 156 41\r\n197 164 41\r\n156 156 156\r\n164 164 156\r\n172 172 172\r\n180 189 180\r\n41 0 230\r\n189 189 189\r\n197 189 189\r\n197 197 197\r\n205 205 213\r\n8 8 197\r\n246 230 24\r\n246 230 32\r\n255 238 24\r\n255 238 32\r\n32 32 32\r\n32 41 32\r\n41 32 32\r\n41 41 32\r\n49 32 32\r\n49 41 32\r\n41 32 41\r\n49 32 41\r\n24 41 41\r\n32 32 90\r\n16 24 106\r\n24 32 98\r\n41 32 82\r\n41 32 98\r\n41 41 82\r\n41 41 98\r\n0 0 115\r\n8 8 131\r\n32 24 115\r\n32 24 131\r\n32 41 115\r\n41 41 115\r\n32 41 131\r\n41 41 131\r\n57 41 41\r\n57 41 49\r\n57 49 41\r\n57 57 57\r\n65 41 41\r\n74 41 41\r\n65 57 57\r\n74 57 57\r\n57 74 74\r\n65 65 74\r\n82 74 82\r\n82 57 131\r\n82 90 82\r\n90 90 90\r\n90 98 98\r\n98 98 106\r\n115 106 106\r\n131 98 115\r\n139 98 106\r\n139 115 98\r\n180 139 57\r\n172 131 65\r\n156 115 90\r\n156 131 82\r\n115 82 139\r\n123 82 131\r\n115 98 131\r\n131 98 123\r\n115 123 123\r\n123 123 131\r\n139 131 139\r\n148 123 131\r\n205 172 24\r\n213 172 16\r\n205 164 32\r\n213 172 32\r\n222 189 24\r\n230 189 16\r\n213 189 32\r\n222 189 32\r\n230 205 24\r\n230 205 32\r\n230 213 32\r\n238 222 32\r\n180 148 57\r\n189 156 49\r\n180 148 74\r\n180 172 90\r\n156 148 123\r\n139 148 139\r\n164 148 115\r\n172 156 106\r\n197 156 49\r\n205 180 49\r\n197 172 90\r\n205 189 82\r\n222 205 49\r\n230 222 49\r\n205 205 74\r\n222 213 65\r\n49 0 230\r\n213 213 213\r\n222 230 230\r\n222 230 230\r\n255 0 246\r\n255 0 255\r\n16 8 197\r\n16 16 189\r\n32 16 164\r\n41 16 164\r\n32 16 180\r\n41 16 189\r\n8 8 205\r\n8 16 205\r\n24 8 213\r\n24 16 205\r\n41 8 213\r\n41 16 213\r\n49 8 213\r\n57 16 213\r\n16 8 230\r\n24 8 230\r\n24 16 230\r\n24 24 230\r\n8 8 246\r\n8 16 246\r\n16 8 246\r\n16 16 246\r\n32 8 230\r\n32 16 230\r\n32 8 238\r\n32 8 246\r\n41 8 230\r\n41 16 230\r\n49 16 230\r\n49 8 238\r\n32 32 156\r\n24 32 172\r\n41 41 156\r\n41 32 164\r\n74 49 180\r\n82 49 172\r\n82 65 164\r\n90 74 164\r\n24 32 189\r\n57 41 189\r\n41 32 213\r\n57 32 213\r\n74 41 189\r\n90 57 189\r\n74 49 197\r\n74 41 205\r\n49 49 49\r\n197 197 197\r\n189 189 189\r\n156 156 156\r\n172 172 172\r\n139 139 139\r\n115 115 115\r\n255 255 255\r\n16 16 16\r\n98 98 98\r\n246 246 246\r\n82 82 82\r\n230 230 230\r\n213 213 213\r\n0 0 0\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/title_screen/firered/slash.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n82 205 180\r\n189 197 205\r\n164 164 172\r\n123 131 131\r\n213 213 222\r\n255 246 74\r\n255 213 32\r\n164 131 24\r\n246 164 24\r\n131 90 16\r\n106 98 90\r\n65 57 41\r\n230 82 16\r\n205 41 0\r\n139 8 8\r\n246 246 246\r\n"
  },
  {
    "path": "graphics/title_screen/leafgreen/background.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 90\r\n0 0 0\r\n123 123 123\r\n197 197 197\r\n222 222 222\r\n255 255 255\r\n0 0 0\r\n123 123 123\r\n197 197 197\r\n222 222 222\r\n255 255 255\r\n230 123 90\r\n0 123 0\r\n16 148 32\r\n41 180 65\r\n65 213 98\r\n"
  },
  {
    "path": "graphics/title_screen/leafgreen/box_art_mon.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n246 148 98\r\n0 0 0\r\n246 148 98\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n0 32 32\r\n0 49 41\r\n0 65 49\r\n0 82 57\r\n16 98 74\r\n24 115 90\r\n41 148 115\r\n74 180 139\r\n98 205 156\r\n131 230 172\r\n"
  },
  {
    "path": "graphics/title_screen/leafgreen/game_title_logo.pal",
    "content": "JASC-PAL\r\n0100\r\n256\r\n0 255 41\r\n0 0 0\r\n255 238 16\r\n246 222 41\r\n246 238 246\r\n255 246 24\r\n246 246 41\r\n246 246 246\r\n246 255 255\r\n255 246 255\r\n32 0 255\r\n106 65 156\r\n32 0 238\r\n246 222 24\r\n246 222 32\r\n255 238 41\r\n255 238 49\r\n255 255 16\r\n255 255 24\r\n255 255 246\r\n255 255 255\r\n123 106 156\r\n24 41 32\r\n32 32 74\r\n32 0 230\r\n115 82 164\r\n16 0 246\r\n106 82 172\r\n246 238 32\r\n255 230 24\r\n246 230 41\r\n246 238 41\r\n246 230 49\r\n246 238 49\r\n255 246 32\r\n255 246 41\r\n255 255 32\r\n255 255 41\r\n32 24 32\r\n32 32 41\r\n197 156 41\r\n197 164 41\r\n156 156 156\r\n164 164 156\r\n172 172 172\r\n180 189 180\r\n41 0 230\r\n189 189 189\r\n197 189 189\r\n197 197 197\r\n205 205 213\r\n8 8 197\r\n246 230 24\r\n246 230 32\r\n255 238 24\r\n255 238 32\r\n32 32 32\r\n32 41 32\r\n41 32 32\r\n41 41 32\r\n49 32 32\r\n49 41 32\r\n41 32 41\r\n49 32 41\r\n24 41 41\r\n32 32 90\r\n16 24 106\r\n24 32 98\r\n41 32 82\r\n41 32 98\r\n41 41 82\r\n41 41 98\r\n0 0 115\r\n8 8 131\r\n32 24 115\r\n32 24 131\r\n32 41 115\r\n41 41 115\r\n32 41 131\r\n41 41 131\r\n57 41 41\r\n57 41 49\r\n57 49 41\r\n57 57 57\r\n65 41 41\r\n74 41 41\r\n65 57 57\r\n74 57 57\r\n57 74 74\r\n65 65 74\r\n82 74 82\r\n82 57 131\r\n82 90 82\r\n90 90 90\r\n90 98 98\r\n98 98 106\r\n115 106 106\r\n131 98 115\r\n139 98 106\r\n139 115 98\r\n180 139 57\r\n172 131 65\r\n156 115 90\r\n156 131 82\r\n115 82 139\r\n123 82 131\r\n115 98 131\r\n131 98 123\r\n115 123 123\r\n123 123 131\r\n139 131 139\r\n148 123 131\r\n205 172 24\r\n213 172 16\r\n205 164 32\r\n213 172 32\r\n222 189 24\r\n230 189 16\r\n213 189 32\r\n222 189 32\r\n230 205 24\r\n230 205 32\r\n230 213 32\r\n238 222 32\r\n180 148 57\r\n189 156 49\r\n180 148 74\r\n180 172 90\r\n156 148 123\r\n139 148 139\r\n164 148 115\r\n172 156 106\r\n197 156 49\r\n205 180 49\r\n197 172 90\r\n205 189 82\r\n222 205 49\r\n230 222 49\r\n205 205 74\r\n222 213 65\r\n49 0 230\r\n213 213 213\r\n222 230 230\r\n222 230 230\r\n255 0 246\r\n255 0 255\r\n16 8 197\r\n16 16 189\r\n32 16 164\r\n41 16 164\r\n32 16 180\r\n41 16 189\r\n8 8 205\r\n8 16 205\r\n24 8 213\r\n24 16 205\r\n41 8 213\r\n41 16 213\r\n49 8 213\r\n57 16 213\r\n16 8 230\r\n24 8 230\r\n24 16 230\r\n24 24 230\r\n8 8 246\r\n8 16 246\r\n16 8 246\r\n16 16 246\r\n32 8 230\r\n32 16 230\r\n32 8 238\r\n32 8 246\r\n41 8 230\r\n41 16 230\r\n49 16 230\r\n49 8 238\r\n32 32 156\r\n24 32 172\r\n41 41 156\r\n41 32 164\r\n74 49 180\r\n82 49 172\r\n82 65 164\r\n90 74 164\r\n24 32 189\r\n57 41 189\r\n41 32 213\r\n57 32 213\r\n74 41 189\r\n90 57 189\r\n74 49 197\r\n74 41 205\r\n205 205 205\r\n41 41 41\r\n189 189 189\r\n172 172 172\r\n246 246 246\r\n123 123 123\r\n156 156 156\r\n139 139 139\r\n238 238 238\r\n16 16 16\r\n98 98 98\r\n82 82 82\r\n222 222 222\r\n57 57 57\r\n0 0 0\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/title_screen/leafgreen/slash.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 213\r\n172 180 197\r\n49 57 65\r\n115 123 131\r\n246 246 246\r\n57 82 82\r\n90 115 115\r\n123 131 123\r\n49 74 57\r\n16 32 24\r\n0 82 0\r\n32 82 24\r\n16 98 0\r\n57 164 16\r\n90 222 24\r\n189 255 8\r\n"
  },
  {
    "path": "graphics/tm_case/disc_types_1.pal",
    "content": "JASC-PAL\r\n0100\r\n256\r\n205 164 238\r\n74 74 98\r\n238 238 238\r\n230 230 238\r\n230 230 230\r\n222 222 222\r\n213 213 213\r\n205 205 205\r\n197 197 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n255 255 255\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n255 230 189\r\n255 222 156\r\n255 205 131\r\n255 197 98\r\n255 189 65\r\n255 180 41\r\n238 172 32\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n255 238 222\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n205 230 246\r\n180 213 246\r\n164 205 246\r\n139 197 238\r\n115 180 238\r\n90 172 238\r\n74 164 238\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n205 205 205\r\n238 246 246\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n213 246 230\r\n197 246 213\r\n180 246 205\r\n156 238 197\r\n139 238 180\r\n123 238 172\r\n106 238 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n238 246 246\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n255 255 189\r\n255 238 156\r\n255 230 123\r\n255 222 90\r\n255 205 57\r\n255 197 24\r\n255 197 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n255 255 222\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n246 238 222\r\n238 230 197\r\n238 222 172\r\n230 213 148\r\n222 197 115\r\n222 189 90\r\n213 180 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n255 255 255\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n255 255 189\r\n255 255 156\r\n255 255 123\r\n255 255 90\r\n246 238 90\r\n230 213 82\r\n222 197 65\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n255 255 222\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n230 246 255\r\n213 246 255\r\n197 246 255\r\n172 238 255\r\n156 238 255\r\n139 230 246\r\n131 213 238\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n205 205 205\r\n255 255 255\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n213 246 255\r\n189 238 255\r\n172 238 255\r\n156 238 255\r\n172 222 238\r\n180 205 222\r\n197 197 197\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n246 246 255\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n246 213 189\r\n238 197 156\r\n238 180 123\r\n238 164 90\r\n230 148 57\r\n230 131 24\r\n230 115 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n255 238 230\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n238 222 246\r\n230 205 246\r\n230 189 246\r\n222 172 246\r\n213 148 246\r\n197 123 238\r\n180 98 222\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n255 238 255\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n255 255 189\r\n255 255 156\r\n255 255 123\r\n255 255 90\r\n255 238 57\r\n255 238 24\r\n255 222 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n255 255 222\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n255 222 197\r\n255 205 172\r\n255 189 148\r\n255 180 123\r\n230 148 156\r\n205 123 189\r\n180 98 222\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n255 238 230\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n255 230 230\r\n255 222 213\r\n255 213 205\r\n255 197 197\r\n255 189 180\r\n255 180 172\r\n255 172 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n255 246 246\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n222 222 222\r\n213 213 213\r\n197 197 197\r\n189 189 189\r\n148 172 180\r\n115 164 172\r\n82 156 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n238 246 246\r\n205 164 238\r\n0 0 0\r\n74 74 98\r\n205 230 230\r\n189 213 213\r\n164 205 205\r\n139 189 197\r\n123 180 180\r\n98 164 172\r\n82 156 164\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n238 246 246\r\n205 164 238\r\n"
  },
  {
    "path": "graphics/tm_case/disc_types_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n74 74 98\r\n205 230 255\r\n180 213 255\r\n156 197 255\r\n139 189 255\r\n172 180 213\r\n213 180 172\r\n255 180 131\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n189 189 189\r\n230 246 255\r\n205 164 238\r\n"
  },
  {
    "path": "graphics/tm_case/menu_female.pal",
    "content": "JASC-PAL\r\n0100\r\n64\r\n0 65 90\r\n255 0 255\r\n41 57 82\r\n213 139 115\r\n255 0 255\r\n255 0 255\r\n255 172 148\r\n197 230 205\r\n238 230 172\r\n255 255 197\r\n180 180 180\r\n230 255 238\r\n139 106 172\r\n115 115 115\r\n164 205 172\r\n148 180 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n189 213 213\r\n238 255 255\r\n222 246 255\r\n255 255 255\r\n164 222 255\r\n16 172 222\r\n0 82 115\r\n0 115 139\r\n0 123 197\r\n205 164 238\r\n106 164 222\r\n82 123 197\r\n164 172 131\r\n255 172 148\r\n238 238 238\r\n90 90 65\r\n115 115 90\r\n189 189 164\r\n213 139 115\r\n222 156 0\r\n238 180 16\r\n246 213 57\r\n255 246 123\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n189 213 213\r\n238 255 255\r\n222 246 255\r\n255 255 255\r\n164 222 255\r\n24 82 180\r\n0 90 131\r\n24 82 180\r\n24 82 180\r\n"
  },
  {
    "path": "graphics/tm_case/menu_male.pal",
    "content": "JASC-PAL\r\n0100\r\n64\r\n0 65 90\r\n255 0 255\r\n41 57 82\r\n65 180 164\r\n255 0 255\r\n255 0 255\r\n106 205 197\r\n197 230 205\r\n238 230 172\r\n255 255 197\r\n180 180 180\r\n230 255 238\r\n139 106 172\r\n115 115 115\r\n164 205 172\r\n148 180 156\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n189 213 213\r\n238 255 255\r\n222 246 255\r\n255 255 255\r\n164 222 255\r\n16 172 222\r\n0 82 115\r\n0 115 139\r\n0 123 197\r\n205 164 238\r\n106 164 222\r\n82 123 197\r\n164 172 131\r\n106 205 197\r\n238 238 238\r\n90 90 65\r\n115 115 90\r\n189 189 164\r\n65 180 164\r\n222 156 0\r\n238 180 16\r\n246 213 57\r\n255 246 123\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n189 213 213\r\n238 255 255\r\n222 246 255\r\n255 255 255\r\n164 222 255\r\n24 82 180\r\n0 90 131\r\n24 82 180\r\n24 82 180\r\n"
  },
  {
    "path": "graphics/trade/black.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trade/cursor.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n123 131 222\r\n98 98 180\r\n123 106 222\r\n106 172 238\r\n82 148 205\r\n180 189 230\r\n148 156 189\r\n205 106 0\r\n255 189 49\r\n246 148 0\r\n255 213 115\r\n205 74 90\r\n255 98 32\r\n205 205 222\r\n255 98 32\r\n"
  },
  {
    "path": "graphics/trade/gba.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n230 230 230\r\n205 205 205\r\n180 180 180\r\n156 156 156\r\n213 180 106\r\n205 156 82\r\n49 255 106\r\n"
  },
  {
    "path": "graphics/trade/gba_pal2.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n255 57 8\r\n255 90 8\r\n255 131 8\r\n255 172 8\r\n255 213 8\r\n255 255 8\r\n255 255 131\r\n255 255 255\r\n255 255 0\r\n65 0 0\r\n115 16 0\r\n172 32 0\r\n230 57 8\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n131 131 139\r\n98 98 123\r\n65 74 106\r\n41 49 90\r\n230 230 230\r\n205 205 205\r\n180 180 180\r\n156 156 156\r\n213 180 106\r\n205 156 82\r\n49 255 106\r\n0 0 0\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n0 16 172\r\n32 32 106\r\n16 16 90\r\n0 0 74\r\n255 255 189\r\n230 230 164\r\n205 205 148\r\n189 180 115\r\n139 139 90\r\n74 74 57\r\n8 32 32\r\n"
  },
  {
    "path": "graphics/trade/link_mon.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 156 123\r\n164 123 197\r\n41 255 115\r\n0 139 255\r\n255 255 74\r\n255 255 255\r\n106 106 106\r\n255 156 123\r\n255 156 123\r\n255 156 123\r\n255 156 123\r\n255 156 123\r\n255 156 123\r\n255 156 123\r\n255 156 123\r\n"
  },
  {
    "path": "graphics/trade/menu.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n0 0 0\r\n57 57 172\r\n98 98 180\r\n123 106 222\r\n82 90 213\r\n82 148 205\r\n131 115 230\r\n148 156 189\r\n205 106 0\r\n246 148 0\r\n49 49 90\r\n255 213 115\r\n205 74 90\r\n255 98 32\r\n205 205 222\r\n255 255 213\r\n0 0 0\r\n0 8 16\r\n0 16 32\r\n0 24 49\r\n0 41 65\r\n0 49 82\r\n0 57 98\r\n0 65 115\r\n0 82 131\r\n0 90 148\r\n0 98 164\r\n0 106 180\r\n0 123 197\r\n0 131 213\r\n0 139 230\r\n0 156 255\r\n0 0 0\r\n0 8 16\r\n0 16 32\r\n0 24 49\r\n0 41 65\r\n0 49 82\r\n0 57 98\r\n0 65 115\r\n0 82 131\r\n0 90 148\r\n0 98 164\r\n0 106 180\r\n0 123 197\r\n0 131 213\r\n0 139 230\r\n0 156 255\r\n"
  },
  {
    "path": "graphics/trade/shadow.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n222 230 238\r\n189 205 230\r\n156 180 222\r\n0 16 172\r\n32 32 106\r\n16 16 90\r\n0 0 74\r\n255 255 189\r\n230 230 164\r\n205 205 148\r\n189 180 115\r\n139 139 90\r\n74 74 57\r\n32 32 32\r\n"
  },
  {
    "path": "graphics/trade/text.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n74 74 74\r\n255 0 0\r\n0 255 0\r\n0 0 255\r\n255 255 0\r\n0 255 255\r\n255 0 255\r\n213 213 205\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n0 0 0\r\n115 115 115\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/trade/unused1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 57 8\r\n255 90 8\r\n255 131 8\r\n255 172 8\r\n255 213 8\r\n255 255 8\r\n255 255 131\r\n255 255 255\r\n255 255 0\r\n65 0 0\r\n115 16 0\r\n172 32 0\r\n230 57 8\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trade/wireless_signal_receive.pal",
    "content": "JASC-PAL\r\n0100\r\n256\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/trade/wireless_signal_send.pal",
    "content": "JASC-PAL\r\n0100\r\n256\r\n0 0 0\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n255 255 255\r\n0 0 0\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n172 172 172\r\n"
  },
  {
    "path": "graphics/trainer_card/blue.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n139 98 115\r\n230 246 246\r\n222 238 255\r\n213 230 246\r\n197 213 230\r\n246 205 148\r\n164 164 164\r\n98 98 115\r\n246 213 139\r\n180 205 148\r\n106 164 222\r\n90 156 205\r\n57 115 156\r\n255 246 189\r\n255 255 255\r\n131 189 230\r\n139 98 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 148 16\r\n255 213 82\r\n82 205 180\r\n49 156 148\r\n197 197 197\r\n90 90 90\r\n139 98 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 148 16\r\n255 213 82\r\n230 148 82\r\n213 98 41\r\n197 197 197\r\n90 90 90\r\n"
  },
  {
    "path": "graphics/trainer_card/bronze.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n139 98 115\r\n246 246 205\r\n246 238 197\r\n238 230 189\r\n230 222 156\r\n246 205 148\r\n164 164 164\r\n98 98 115\r\n246 238 139\r\n222 197 139\r\n213 189 139\r\n197 180 123\r\n164 123 82\r\n255 255 205\r\n255 255 255\r\n230 205 156\r\n139 98 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 148 16\r\n255 213 82\r\n82 205 180\r\n65 172 164\r\n197 197 197\r\n90 90 90\r\n0 0 0\r\n32 65 123\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/female_bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 98 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 148 16\r\n255 213 82\r\n230 148 82\r\n213 98 41\r\n197 197 197\r\n90 90 90\r\n"
  },
  {
    "path": "graphics/trainer_card/gold.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n139 98 115\r\n255 246 230\r\n246 238 213\r\n246 246 197\r\n246 238 180\r\n246 222 106\r\n164 164 164\r\n98 98 115\r\n255 255 148\r\n246 222 49\r\n246 205 8\r\n238 189 0\r\n189 148 57\r\n255 255 197\r\n255 255 255\r\n246 230 82\r\n139 98 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 148 16\r\n255 213 82\r\n82 205 180\r\n65 172 164\r\n197 197 197\r\n90 90 90\r\n0 0 0\r\n32 65 123\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/green.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n139 98 115\r\n222 255 230\r\n205 246 222\r\n197 238 213\r\n189 230 205\r\n246 205 148\r\n164 164 164\r\n98 98 115\r\n246 213 139\r\n180 205 148\r\n131 180 172\r\n115 156 156\r\n82 131 123\r\n255 246 189\r\n255 255 255\r\n156 205 197\r\n139 98 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 148 16\r\n255 213 82\r\n82 205 180\r\n65 172 164\r\n197 197 197\r\n90 90 90\r\n0 0 0\r\n32 65 123\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/rse/bronze.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n139 98 115\r\n238 255 246\r\n213 238 230\r\n164 164 164\r\n123 123 123\r\n98 98 115\r\n41 57 65\r\n57 106 139\r\n65 139 197\r\n189 213 205\r\n148 180 164\r\n106 148 123\r\n65 115 90\r\n106 189 255\r\n205 205 205\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n106 180 213\r\n41 123 164\r\n0 0 0\r\n0 0 0\r\n98 98 115\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n106 189 255\r\n205 205 205\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/rse/copper.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n139 98 115\r\n255 246 230\r\n246 230 213\r\n205 156 90\r\n180 131 65\r\n98 98 115\r\n41 57 65\r\n57 106 139\r\n65 139 197\r\n230 189 139\r\n205 156 115\r\n180 131 82\r\n156 106 41\r\n106 189 255\r\n205 205 205\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n106 180 213\r\n41 123 164\r\n0 0 0\r\n0 0 0\r\n98 98 115\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n106 189 255\r\n205 205 205\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/rse/female_bg.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n230 123 139\r\n164 49 115\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/rse/gold.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n139 98 115\r\n246 246 222\r\n246 238 172\r\n164 164 164\r\n123 123 123\r\n98 98 115\r\n41 57 65\r\n57 106 139\r\n65 139 197\r\n246 230 139\r\n230 213 49\r\n213 197 57\r\n156 115 57\r\n106 189 255\r\n205 205 205\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n106 180 213\r\n41 123 164\r\n0 0 0\r\n0 0 0\r\n98 98 115\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n106 189 255\r\n205 205 205\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/rse/green.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n139 98 115\r\n255 255 255\r\n230 255 222\r\n164 164 164\r\n123 123 123\r\n98 98 115\r\n41 57 65\r\n57 106 139\r\n65 139 197\r\n180 230 156\r\n148 238 131\r\n131 222 115\r\n82 172 74\r\n106 189 255\r\n205 205 205\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n106 180 213\r\n41 123 164\r\n0 0 0\r\n0 0 0\r\n98 98 115\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n106 189 255\r\n205 205 205\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/rse/silver.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n139 98 115\r\n246 246 255\r\n230 230 238\r\n189 189 197\r\n156 156 156\r\n156 106 41\r\n41 57 65\r\n57 106 139\r\n65 139 197\r\n230 230 238\r\n189 189 197\r\n156 156 156\r\n123 123 123\r\n106 189 255\r\n205 205 205\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n106 180 213\r\n41 123 164\r\n0 0 0\r\n0 0 0\r\n98 98 115\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n255 255 255\r\n230 230 238\r\n164 164 164\r\n123 123 123\r\n106 189 255\r\n205 205 205\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/silver.pal",
    "content": "JASC-PAL\r\n0100\r\n48\r\n139 98 115\r\n238 246 246\r\n238 246 246\r\n238 238 238\r\n230 230 230\r\n246 205 148\r\n164 164 164\r\n98 98 115\r\n255 238 131\r\n205 205 164\r\n197 205 205\r\n172 180 172\r\n131 139 156\r\n246 246 197\r\n255 255 255\r\n213 222 222\r\n139 98 115\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n189 148 16\r\n255 213 82\r\n82 205 180\r\n65 172 164\r\n197 197 197\r\n90 90 90\r\n0 0 0\r\n32 65 123\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/star.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 98 115\r\n246 197 0\r\n205 164 0\r\n246 197 0\r\n246 197 0\r\n246 197 0\r\n246 197 0\r\n246 197 0\r\n0 0 0\r\n0 0 0\r\n189 148 16\r\n255 213 82\r\n0 0 0\r\n0 0 0\r\n189 148 16\r\n246 197 0\r\n"
  },
  {
    "path": "graphics/trainer_card/stickers1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 246 189\r\n255 255 255\r\n255 197 164\r\n238 246 246\r\n222 222 230\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/stickers2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 246 189\r\n255 255 255\r\n98 197 238\r\n238 246 246\r\n222 222 230\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/stickers3.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 246 189\r\n255 255 255\r\n246 230 74\r\n238 246 246\r\n222 222 230\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/stickers4.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 246 189\r\n255 255 255\r\n106 131 148\r\n238 246 246\r\n222 222 230\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainer_card/unused.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n255 255 255\r\n98 98 98\r\n213 213 205\r\n230 8 8\r\n255 189 115\r\n32 156 8\r\n148 246 148\r\n49 82 205\r\n164 197 246\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/aqua_admin_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n139 172 213\r\n90 131 189\r\n65 90 139\r\n57 57 57\r\n213 222 230\r\n255 131 41\r\n189 156 90\r\n238 98 41\r\n180 65 41\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/aqua_admin_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n139 172 213\r\n90 131 189\r\n65 90 139\r\n57 57 57\r\n213 222 230\r\n255 131 41\r\n189 156 90\r\n222 82 24\r\n164 49 24\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/aqua_grunt_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n139 172 213\r\n90 131 189\r\n65 90 139\r\n57 57 57\r\n213 222 230\r\n164 74 65\r\n189 156 90\r\n255 106 98\r\n205 82 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/aqua_grunt_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n139 172 213\r\n90 131 189\r\n65 90 139\r\n57 57 57\r\n213 222 230\r\n255 164 197\r\n189 156 90\r\n255 115 148\r\n213 82 115\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/aqua_leader_archie.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n131 156 180\r\n106 123 148\r\n82 90 115\r\n57 65 98\r\n213 213 222\r\n82 90 156\r\n24 32 49\r\n148 156 222\r\n106 115 213\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/aroma_lady.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 230 148\r\n16 16 16\r\n255 230 205\r\n238 189 148\r\n197 148 106\r\n106 74 74\r\n246 189 197\r\n222 131 148\r\n189 106 131\r\n246 246 255\r\n230 230 255\r\n197 197 230\r\n156 148 180\r\n98 90 123\r\n148 106 106\r\n156 197 197\r\n"
  },
  {
    "path": "graphics/trainers/palettes/battle_girl.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n90 131 189\r\n65 90 139\r\n41 65 98\r\n49 41 65\r\n205 213 222\r\n255 164 82\r\n230 106 0\r\n197 65 65\r\n156 106 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/beauty.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n230 222 148\r\n197 180 98\r\n139 123 57\r\n230 123 115\r\n213 74 65\r\n74 74 90\r\n131 131 197\r\n156 156 222\r\n213 222 246\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/biker.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n205 139 115\r\n123 90 82\r\n222 222 230\r\n180 197 213\r\n139 156 172\r\n74 98 123\r\n49 65 82\r\n156 131 82\r\n82 57 41\r\n230 106 90\r\n180 115 106\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/bird_keeper.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n205 148 115\r\n123 90 82\r\n49 90 139\r\n106 164 222\r\n74 131 180\r\n32 74 82\r\n246 131 115\r\n222 98 98\r\n222 189 131\r\n172 139 106\r\n205 222 255\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/black_belt.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n246 205 189\r\n222 172 148\r\n172 131 106\r\n90 65 49\r\n148 131 123\r\n106 90 82\r\n82 90 115\r\n49 57 82\r\n205 189 189\r\n189 164 164\r\n156 139 139\r\n255 98 90\r\n197 65 65\r\n246 230 230\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/bug_catcher.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n189 49 57\r\n238 222 148\r\n189 172 115\r\n65 82 131\r\n98 164 222\r\n49 123 156\r\n131 139 164\r\n180 189 213\r\n213 222 230\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/bug_maniac.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n49 123 156\r\n49 65 131\r\n65 74 74\r\n222 222 164\r\n197 197 139\r\n205 213 213\r\n156 139 74\r\n98 164 222\r\n106 115 115\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/burglar.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 230 156\r\n16 16 16\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 90 90\r\n230 230 246\r\n205 205 230\r\n180 180 213\r\n131 131 164\r\n65 82 98\r\n189 172 98\r\n156 139 90\r\n197 197 156\r\n156 156 115\r\n115 115 74\r\n"
  },
  {
    "path": "graphics/trainers/palettes/camper.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n164 238 156\r\n139 205 106\r\n106 164 65\r\n32 82 32\r\n205 205 213\r\n115 115 148\r\n41 57 90\r\n230 106 139\r\n189 65 57\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/champion_rival.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n222 164 74\r\n197 123 8\r\n49 65 82\r\n205 139 255\r\n115 82 131\r\n156 106 172\r\n106 123 131\r\n197 205 180\r\n213 82 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/champion_steven.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 180 148\r\n189 148 115\r\n123 90 82\r\n189 115 205\r\n164 82 172\r\n82 82 90\r\n49 49 57\r\n213 222 238\r\n172 189 213\r\n123 148 164\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/channeler.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n98 131 123\r\n49 82 74\r\n222 205 238\r\n115 115 148\r\n41 57 90\r\n180 172 205\r\n197 65 82\r\n148 32 49\r\n98 0 16\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/collector.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n197 139 115\r\n123 90 82\r\n106 139 189\r\n65 98 148\r\n32 74 123\r\n255 98 90\r\n197 65 65\r\n213 222 230\r\n131 74 65\r\n115 123 131\r\n164 172 180\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/cool_couple.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n205 139 115\r\n123 90 82\r\n222 222 230\r\n164 180 189\r\n74 98 123\r\n205 164 255\r\n156 115 205\r\n115 74 164\r\n238 131 98\r\n205 57 82\r\n172 32 57\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/cool_trainer_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n205 139 115\r\n123 90 82\r\n222 222 230\r\n164 180 189\r\n74 98 123\r\n205 164 255\r\n156 115 205\r\n115 74 164\r\n238 131 98\r\n205 57 82\r\n172 32 57\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/cool_trainer_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n205 139 115\r\n123 90 82\r\n222 222 230\r\n164 180 189\r\n74 98 123\r\n205 164 255\r\n156 115 205\r\n115 74 164\r\n238 131 98\r\n205 57 82\r\n172 32 57\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/crush_girl.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n115 164 106\r\n57 90 65\r\n90 123 156\r\n65 74 98\r\n205 189 189\r\n148 197 131\r\n255 164 82\r\n230 106 0\r\n180 57 57\r\n246 230 230\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/crush_kin.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n148 131 123\r\n106 90 82\r\n90 123 156\r\n65 74 98\r\n205 189 189\r\n189 164 164\r\n255 164 82\r\n230 106 0\r\n180 57 57\r\n246 230 230\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/cue_ball.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n205 139 115\r\n148 98 82\r\n222 222 230\r\n180 197 213\r\n139 172 213\r\n98 139 180\r\n57 82 115\r\n205 180 180\r\n98 82 65\r\n180 156 156\r\n148 115 106\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/cycling_triathlete_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n57 41 57\r\n57 74 106\r\n131 131 156\r\n139 156 238\r\n115 131 205\r\n98 106 172\r\n205 197 255\r\n230 90 65\r\n189 74 41\r\n139 74 82\r\n255 255 255\r\n0 0 24\r\n"
  },
  {
    "path": "graphics/trainers/palettes/cycling_triathlete_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n238 189 139\r\n189 148 115\r\n139 106 82\r\n57 41 57\r\n115 90 106\r\n156 131 156\r\n156 213 255\r\n106 164 222\r\n82 131 197\r\n205 197 255\r\n230 90 65\r\n189 74 41\r\n139 74 82\r\n255 255 255\r\n0 0 24\r\n"
  },
  {
    "path": "graphics/trainers/palettes/dragon_tamer.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n74 57 49\r\n164 57 246\r\n123 49 172\r\n131 139 148\r\n255 98 90\r\n197 65 65\r\n213 222 230\r\n74 74 65\r\n255 205 106\r\n213 172 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/elite_four_agatha.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 222 238\r\n246 230 205\r\n230 189 156\r\n189 148 123\r\n115 90 82\r\n115 65 82\r\n164 74 90\r\n213 106 131\r\n90 82 65\r\n139 123 90\r\n189 197 139\r\n230 230 189\r\n156 164 156\r\n205 205 222\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/elite_four_bruno.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n238 213 189\r\n213 172 148\r\n164 131 106\r\n90 65 49\r\n115 123 139\r\n106 90 82\r\n82 90 115\r\n49 57 82\r\n205 189 189\r\n180 164 164\r\n139 131 131\r\n255 139 90\r\n197 65 65\r\n246 230 230\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/elite_four_drake.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 172 148\r\n164 131 106\r\n98 57 65\r\n139 131 164\r\n106 98 123\r\n41 49 57\r\n57 65 82\r\n197 197 213\r\n255 222 106\r\n189 156 90\r\n106 131 238\r\n65 106 172\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/elite_four_glacia.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n115 82 65\r\n148 148 164\r\n148 90 164\r\n115 65 123\r\n82 41 82\r\n255 255 164\r\n213 197 90\r\n156 148 90\r\n222 230 238\r\n189 197 205\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/elite_four_lance.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 222 238\r\n255 230 205\r\n230 189 148\r\n205 156 123\r\n106 74 74\r\n57 57 90\r\n90 90 131\r\n123 123 164\r\n172 74 65\r\n197 90 74\r\n230 106 90\r\n139 106 90\r\n246 148 123\r\n172 172 180\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/elite_four_lorelei.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n205 139 115\r\n123 90 82\r\n213 213 222\r\n65 74 82\r\n205 164 255\r\n156 115 205\r\n238 172 90\r\n148 148 164\r\n90 98 115\r\n230 115 90\r\n180 41 57\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/elite_four_phoebe.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n115 82 65\r\n57 131 255\r\n32 106 230\r\n16 82 205\r\n41 49 123\r\n164 205 255\r\n115 98 106\r\n74 57 65\r\n255 82 156\r\n197 65 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/elite_four_sidney.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 180 148\r\n189 139 106\r\n98 57 65\r\n131 106 74\r\n106 98 123\r\n41 49 57\r\n57 65 82\r\n197 197 213\r\n238 213 139\r\n197 164 106\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/emerald_brendan.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 164 148\r\n205 131 115\r\n123 90 82\r\n98 123 156\r\n74 90 131\r\n49 65 106\r\n24 41 82\r\n222 230 238\r\n139 222 115\r\n98 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/emerald_may.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 164 148\r\n205 131 115\r\n123 90 82\r\n98 98 115\r\n41 57 65\r\n164 106 82\r\n74 49 57\r\n205 205 222\r\n139 222 115\r\n98 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/engineer.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 238 164\r\n16 16 16\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n74 74 115\r\n255 255 255\r\n172 180 197\r\n115 123 172\r\n197 148 65\r\n230 98 98\r\n197 57 57\r\n255 222 82\r\n222 180 74\r\n139 115 57\r\n"
  },
  {
    "path": "graphics/trainers/palettes/expert_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n180 180 172\r\n90 131 189\r\n65 90 139\r\n57 57 57\r\n213 222 230\r\n139 139 131\r\n189 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/expert_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n180 180 172\r\n90 131 189\r\n65 90 139\r\n57 57 57\r\n213 222 230\r\n139 139 131\r\n189 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/fisherman.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n65 65 106\r\n98 98 131\r\n213 172 82\r\n172 131 74\r\n205 205 222\r\n164 164 189\r\n49 49 74\r\n246 123 49\r\n189 106 49\r\n238 238 255\r\n0 0 24\r\n"
  },
  {
    "path": "graphics/trainers/palettes/gamer.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 180 148\r\n189 139 106\r\n98 57 65\r\n156 172 230\r\n123 139 205\r\n82 98 164\r\n49 65 98\r\n230 213 131\r\n189 172 106\r\n156 131 82\r\n131 123 148\r\n205 205 222\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/gentleman.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n189 139 106\r\n98 65 57\r\n164 148 131\r\n123 106 98\r\n82 74 65\r\n41 41 32\r\n213 213 205\r\n180 180 172\r\n148 148 139\r\n197 156 49\r\n139 115 24\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/guitarist.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n172 172 164\r\n139 131 131\r\n106 98 98\r\n65 57 57\r\n255 238 156\r\n255 197 90\r\n205 180 148\r\n255 98 90\r\n189 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/hex_maniac.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n164 123 156\r\n139 90 131\r\n106 65 106\r\n74 41 74\r\n213 222 230\r\n189 205 213\r\n205 57 82\r\n115 41 65\r\n180 49 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/hiker.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n148 148 148\r\n98 98 98\r\n131 197 205\r\n98 164 172\r\n172 131 49\r\n131 98 41\r\n131 123 82\r\n205 189 123\r\n172 164 115\r\n213 205 213\r\n0 0 24\r\n"
  },
  {
    "path": "graphics/trainers/palettes/interviewer.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n148 148 172\r\n65 90 139\r\n41 65 98\r\n49 41 65\r\n205 213 222\r\n98 197 255\r\n90 156 189\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/juggler.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 222 238\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n74 74 98\r\n106 90 164\r\n156 123 205\r\n98 123 57\r\n123 180 90\r\n172 213 90\r\n205 106 65\r\n123 123 148\r\n189 197 205\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/kindler.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n115 82 65\r\n246 246 230\r\n222 222 189\r\n180 180 139\r\n123 115 74\r\n172 213 246\r\n115 180 205\r\n57 123 139\r\n255 82 57\r\n255 156 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/lady.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 222\r\n238 197 180\r\n172 115 115\r\n98 90 74\r\n74 82 131\r\n213 222 230\r\n246 180 74\r\n205 131 74\r\n222 98 123\r\n148 164 180\r\n131 197 238\r\n82 164 205\r\n74 131 189\r\n255 255 255\r\n0 0 24\r\n"
  },
  {
    "path": "graphics/trainers/palettes/lass.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 222 238\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n123 90 82\r\n205 98 82\r\n65 74 115\r\n65 106 164\r\n65 172 213\r\n90 65 57\r\n156 98 57\r\n213 139 74\r\n172 180 197\r\n213 222 238\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_blaine.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n139 189 106\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n82 74 74\r\n148 139 74\r\n205 189 65\r\n213 106 74\r\n255 156 106\r\n74 74 90\r\n115 123 156\r\n156 164 189\r\n213 213 238\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_brawly.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n139 172 213\r\n90 131 189\r\n65 90 139\r\n49 49 74\r\n213 213 222\r\n255 164 197\r\n115 115 115\r\n255 139 65\r\n213 98 24\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_brock.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n213 148 115\r\n123 90 82\r\n123 156 98\r\n90 115 74\r\n230 164 82\r\n172 106 24\r\n197 148 115\r\n172 197 139\r\n74 74 82\r\n213 213 222\r\n123 131 131\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_erika.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n238 189 156\r\n197 148 123\r\n106 74 74\r\n255 255 197\r\n222 222 115\r\n189 197 205\r\n115 131 156\r\n82 82 82\r\n156 156 49\r\n180 90 90\r\n246 123 115\r\n205 106 98\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_flannery.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n180 197 230\r\n90 156 213\r\n65 115 164\r\n49 49 74\r\n213 213 222\r\n131 74 16\r\n115 115 115\r\n255 139 65\r\n197 98 32\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_giovanni.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n246 222 205\r\n205 180 148\r\n172 131 98\r\n123 90 82\r\n205 115 205\r\n164 82 115\r\n222 172 90\r\n213 213 222\r\n49 57 57\r\n164 180 189\r\n98 115 123\r\n74 82 82\r\n148 164 172\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_koga.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n205 139 115\r\n123 90 82\r\n180 197 230\r\n115 131 115\r\n74 90 65\r\n139 156 172\r\n74 98 123\r\n49 65 57\r\n255 156 106\r\n230 115 90\r\n180 41 57\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_lt_surge.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n255 213 123\r\n197 164 90\r\n164 222 106\r\n106 164 49\r\n65 123 8\r\n16 74 0\r\n82 106 156\r\n131 131 131\r\n82 82 82\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_misty.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n213 222 238\r\n255 222 205\r\n238 180 148\r\n213 148 115\r\n123 90 82\r\n164 106 82\r\n205 115 82\r\n255 189 115\r\n74 82 156\r\n98 115 246\r\n74 65 106\r\n222 222 246\r\n255 0 255\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_norman.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n180 197 230\r\n139 156 172\r\n74 98 123\r\n49 65 82\r\n213 213 222\r\n131 16 41\r\n115 115 115\r\n213 82 90\r\n180 41 57\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_roxanne.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n139 172 213\r\n90 131 189\r\n65 90 139\r\n57 57 57\r\n213 222 230\r\n255 164 197\r\n189 156 90\r\n255 115 148\r\n213 82 115\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_sabrina.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n148 189 156\r\n16 16 16\r\n255 255 255\r\n238 164 156\r\n205 106 98\r\n172 65 57\r\n156 180 205\r\n123 139 180\r\n82 98 139\r\n205 205 205\r\n255 222 205\r\n123 90 82\r\n222 148 115\r\n213 180 131\r\n238 180 148\r\n255 230 131\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_tate_and_liza.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 172 65\r\n255 222 205\r\n238 180 148\r\n180 131 106\r\n106 74 74\r\n189 189 197\r\n123 123 131\r\n74 82 98\r\n41 49 65\r\n255 98 90\r\n164 49 57\r\n255 197 90\r\n106 189 255\r\n90 139 197\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_wallace.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 180 148\r\n189 139 106\r\n98 57 65\r\n189 131 255\r\n148 106 172\r\n115 131 255\r\n82 106 180\r\n197 197 213\r\n57 74 115\r\n139 139 164\r\n57 41 57\r\n98 57 98\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_wattson.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n123 90 82\r\n164 139 90\r\n131 106 74\r\n139 131 106\r\n82 65 74\r\n213 213 222\r\n255 197 90\r\n189 156 90\r\n57 41 49\r\n222 115 131\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leader_winona.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n172 189 213\r\n139 156 205\r\n74 98 148\r\n49 65 82\r\n205 213 222\r\n115 57 123\r\n255 197 90\r\n189 123 222\r\n148 90 172\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leaf.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 180\r\n230 189 156\r\n205 148 115\r\n123 90 82\r\n123 189 222\r\n82 139 180\r\n49 106 139\r\n24 41 82\r\n213 213 222\r\n255 197 90\r\n189 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/leaf_back_pic.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 123 164\r\n180 131 65\r\n255 230 180\r\n222 189 156\r\n139 98 74\r\n90 98 189\r\n57 57 123\r\n115 164 197\r\n90 65 41\r\n238 238 255\r\n197 197 222\r\n255 115 90\r\n205 98 74\r\n255 222 106\r\n222 180 106\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/magma_admin_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n123 123 123\r\n90 90 90\r\n82 98 148\r\n57 57 65\r\n65 74 115\r\n139 49 65\r\n189 189 180\r\n222 82 98\r\n189 57 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/magma_admin_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n123 123 123\r\n90 90 90\r\n82 98 148\r\n57 57 65\r\n65 74 115\r\n139 49 65\r\n189 189 180\r\n222 82 98\r\n189 57 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/magma_grunt_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n123 123 123\r\n90 90 90\r\n82 98 148\r\n57 57 65\r\n65 74 115\r\n139 49 65\r\n189 189 180\r\n222 82 98\r\n189 57 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/magma_grunt_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n123 123 123\r\n90 90 90\r\n82 98 148\r\n57 57 65\r\n65 74 115\r\n139 49 65\r\n189 189 180\r\n222 82 98\r\n189 57 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/magma_leader_maxie.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n164 180 197\r\n115 123 139\r\n74 82 98\r\n49 57 82\r\n213 213 222\r\n131 16 41\r\n24 32 49\r\n213 82 90\r\n180 41 57\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/master_beauty.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n230 222 148\r\n197 180 98\r\n139 123 57\r\n230 123 115\r\n213 74 65\r\n74 74 90\r\n205 57 82\r\n238 131 98\r\n213 222 246\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/master_bird_keeper.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 222 205\r\n230 180 148\r\n205 148 115\r\n123 90 82\r\n156 32 16\r\n238 131 98\r\n205 57 82\r\n172 32 57\r\n106 164 222\r\n74 131 180\r\n222 189 131\r\n172 139 106\r\n49 90 139\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/master_black_belt.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 205 189\r\n222 172 148\r\n172 131 106\r\n90 65 49\r\n172 32 57\r\n106 90 82\r\n82 90 115\r\n49 57 82\r\n205 57 82\r\n189 164 164\r\n156 139 139\r\n156 32 16\r\n246 230 230\r\n238 131 98\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/master_bug_catcher.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n189 49 57\r\n238 222 148\r\n189 172 115\r\n172 32 57\r\n238 131 98\r\n205 57 82\r\n131 139 164\r\n180 189 213\r\n213 222 230\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/master_cool_trainer_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 222 205\r\n238 180 148\r\n205 139 115\r\n123 90 82\r\n205 57 82\r\n172 32 57\r\n255 255 255\r\n205 164 255\r\n156 115 205\r\n115 74 164\r\n246 205 123\r\n205 172 82\r\n180 148 90\r\n238 131 98\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/master_hiker.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n148 148 148\r\n98 98 98\r\n238 131 98\r\n205 57 82\r\n172 131 49\r\n131 98 41\r\n131 123 82\r\n205 189 123\r\n172 164 115\r\n213 205 213\r\n0 0 24\r\n"
  },
  {
    "path": "graphics/trainers/palettes/master_lass.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n123 90 82\r\n205 98 82\r\n172 32 57\r\n205 57 82\r\n255 255 255\r\n90 65 57\r\n156 98 57\r\n213 139 74\r\n172 41 57\r\n189 57 74\r\n222 82 98\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/master_psychic_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 222 205\r\n230 189 172\r\n197 148 131\r\n123 90 82\r\n172 32 57\r\n205 57 82\r\n238 131 98\r\n106 57 115\r\n156 98 148\r\n205 139 180\r\n205 172 98\r\n238 213 90\r\n255 172 213\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/master_scientist.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n238 82 57\r\n131 139 172\r\n90 98 139\r\n255 255 255\r\n213 222 213\r\n57 65 98\r\n156 32 16\r\n172 32 57\r\n205 57 82\r\n238 131 98\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/master_swimmer.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 180 148\r\n189 139 106\r\n98 57 65\r\n168 224 136\r\n136 176 56\r\n72 88 32\r\n232 128 96\r\n200 56 80\r\n168 32 56\r\n205 205 255\r\n56 72 16\r\n106 106 205\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/master_youngster.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 222 205\r\n230 197 156\r\n197 148 115\r\n123 90 82\r\n213 213 222\r\n238 131 98\r\n205 57 82\r\n230 98 90\r\n172 74 57\r\n172 32 57\r\n246 205 123\r\n205 172 82\r\n180 148 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/ninja_boy.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n213 148 115\r\n123 90 82\r\n164 180 197\r\n131 139 156\r\n82 98 115\r\n49 57 82\r\n213 213 222\r\n131 16 41\r\n255 172 32\r\n213 82 90\r\n180 41 57\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/old_couple.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n180 180 172\r\n90 131 189\r\n65 90 139\r\n57 57 57\r\n213 222 230\r\n139 139 131\r\n189 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/old_man_back_pic.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 238 213\r\n230 197 164\r\n189 148 115\r\n106 90 65\r\n222 213 238\r\n156 148 172\r\n115 106 131\r\n189 180 205\r\n197 139 57\r\n148 106 32\r\n156 131 106\r\n222 205 156\r\n189 172 139\r\n238 230 246\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/painter.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n205 148 115\r\n123 90 82\r\n164 172 197\r\n90 98 148\r\n49 57 82\r\n41 57 98\r\n222 230 238\r\n255 164 123\r\n106 197 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/parasol_lady.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n123 82 65\r\n90 131 189\r\n65 90 139\r\n41 65 98\r\n255 98 90\r\n197 65 65\r\n255 156 106\r\n131 74 65\r\n255 205 106\r\n213 172 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/picnicker.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n197 139 106\r\n106 74 74\r\n164 238 156\r\n139 205 106\r\n106 164 65\r\n32 82 32\r\n205 205 213\r\n115 115 148\r\n41 57 90\r\n230 106 139\r\n189 65 57\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/pokedude_back_pic.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n246 222 197\r\n213 180 156\r\n189 148 123\r\n123 98 82\r\n222 213 238\r\n156 148 172\r\n115 106 131\r\n189 180 205\r\n106 148 205\r\n65 115 164\r\n41 57 123\r\n82 74 98\r\n172 106 98\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/pokefan_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n90 172 189\r\n65 123 180\r\n255 0 255\r\n32 57 82\r\n197 205 213\r\n180 139 90\r\n131 90 41\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/pokefan_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n222 189 148\r\n197 156 115\r\n156 123 82\r\n49 57 49\r\n230 90 41\r\n131 172 222\r\n172 49 32\r\n82 123 172\r\n255 238 74\r\n213 189 41\r\n205 205 213\r\n98 98 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/pokemaniac.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n246 213 197\r\n222 172 139\r\n197 139 115\r\n123 90 82\r\n222 222 230\r\n180 197 213\r\n139 156 172\r\n74 98 123\r\n49 65 90\r\n106 49 24\r\n255 180 106\r\n238 131 65\r\n180 106 49\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/pokemon_breeder.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 189 148\r\n189 148 106\r\n123 98 82\r\n123 205 106\r\n32 98 65\r\n197 90 74\r\n131 148 172\r\n213 222 230\r\n74 164 82\r\n238 172 82\r\n222 148 123\r\n189 148 57\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/pokemon_ranger_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n230 189 148\r\n189 139 106\r\n139 106 82\r\n82 49 49\r\n131 139 172\r\n98 106 131\r\n49 57 82\r\n189 189 197\r\n255 205 65\r\n246 148 82\r\n205 106 74\r\n131 74 49\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/pokemon_ranger_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n230 189 148\r\n189 139 106\r\n139 106 82\r\n82 49 49\r\n131 139 172\r\n98 106 131\r\n49 57 82\r\n189 189 197\r\n255 205 65\r\n246 148 82\r\n205 106 74\r\n131 74 49\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/professor_oak.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n139 156 164\r\n205 164 205\r\n164 123 164\r\n82 82 57\r\n213 213 222\r\n123 123 82\r\n115 115 115\r\n197 189 131\r\n156 156 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/psychic_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 189 172\r\n197 148 131\r\n123 90 82\r\n57 82 106\r\n57 123 164\r\n98 172 205\r\n106 57 115\r\n156 98 148\r\n205 139 180\r\n205 172 98\r\n238 213 90\r\n255 172 213\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/psychic_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 189 172\r\n197 148 131\r\n123 90 82\r\n57 82 106\r\n57 123 164\r\n98 172 205\r\n106 57 115\r\n156 98 148\r\n205 139 180\r\n205 172 98\r\n238 213 90\r\n255 172 213\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/red.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 180\r\n230 189 156\r\n205 148 115\r\n123 90 82\r\n123 189 222\r\n82 139 180\r\n49 106 139\r\n24 41 82\r\n213 213 222\r\n255 197 90\r\n189 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/red_back_pic.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n131 123 164\r\n180 131 65\r\n255 230 180\r\n222 189 156\r\n139 98 74\r\n90 98 189\r\n57 57 123\r\n115 164 197\r\n90 65 41\r\n238 238 255\r\n197 197 222\r\n255 115 90\r\n205 98 74\r\n255 222 106\r\n222 180 106\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rich_boy.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n90 131 189\r\n65 90 139\r\n41 65 98\r\n49 41 65\r\n213 222 230\r\n255 230 98\r\n222 180 90\r\n156 123 115\r\n115 82 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rival_early.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n222 164 74\r\n197 123 8\r\n49 65 82\r\n205 139 255\r\n115 82 131\r\n156 106 172\r\n106 123 131\r\n197 205 180\r\n213 82 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rival_late.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n222 164 74\r\n197 123 8\r\n49 65 82\r\n205 139 255\r\n115 82 131\r\n156 106 172\r\n106 123 131\r\n197 205 180\r\n213 82 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rocker.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n230 197 156\r\n197 156 115\r\n123 98 82\r\n123 164 189\r\n82 123 148\r\n205 222 205\r\n139 65 49\r\n172 172 197\r\n65 82 90\r\n189 213 255\r\n255 131 98\r\n197 131 82\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rocket_grunt_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 222\r\n230 180 164\r\n197 148 139\r\n115 90 74\r\n205 205 222\r\n156 156 172\r\n123 123 148\r\n164 74 65\r\n213 98 90\r\n246 106 98\r\n0 0 0\r\n57 57 74\r\n82 82 106\r\n180 180 197\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rocket_grunt_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 222\r\n230 180 164\r\n197 148 139\r\n115 90 74\r\n205 205 222\r\n156 156 172\r\n123 123 148\r\n164 74 65\r\n213 98 90\r\n246 106 98\r\n0 0 0\r\n57 57 74\r\n82 82 106\r\n180 180 197\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_aroma_lady.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 213 172\r\n238 197 148\r\n205 156 115\r\n115 82 65\r\n238 230 255\r\n205 197 213\r\n156 164 205\r\n106 98 148\r\n74 222 148\r\n172 115 41\r\n115 65 24\r\n238 90 131\r\n189 65 90\r\n106 255 156\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_beauty.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 172 131\r\n205 131 115\r\n123 82 74\r\n148 131 139\r\n255 205 106\r\n213 172 74\r\n164 123 82\r\n115 90 115\r\n74 49 74\r\n255 82 57\r\n180 82 74\r\n131 74 65\r\n255 255 255\r\n0 0 24\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_bird_keeper.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n164 180 197\r\n131 139 156\r\n90 98 115\r\n57 65 82\r\n213 213 222\r\n131 16 41\r\n24 32 49\r\n213 82 90\r\n180 41 57\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_black_belt.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n246 205 189\r\n222 172 148\r\n172 131 106\r\n90 65 49\r\n148 131 123\r\n106 90 82\r\n82 90 115\r\n49 57 82\r\n205 189 189\r\n189 164 164\r\n156 139 139\r\n255 98 90\r\n197 65 65\r\n246 230 230\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_bug_catcher.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n213 148 115\r\n123 90 82\r\n222 222 164\r\n197 197 139\r\n156 139 74\r\n41 57 98\r\n197 197 238\r\n246 238 213\r\n189 49 57\r\n98 164 222\r\n49 123 156\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_camper.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n230 189 156\r\n205 156 115\r\n115 82 65\r\n131 213 205\r\n82 164 148\r\n180 189 222\r\n57 90 74\r\n24 49 90\r\n98 115 230\r\n57 82 131\r\n255 98 41\r\n189 74 41\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_cool_trainer_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n238 197 156\r\n205 156 115\r\n115 82 65\r\n238 156 115\r\n205 90 74\r\n0 189 222\r\n123 41 24\r\n180 230 139\r\n139 180 57\r\n74 90 32\r\n255 246 189\r\n213 205 131\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_cool_trainer_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n246 205 156\r\n205 156 115\r\n115 82 65\r\n238 156 115\r\n230 98 82\r\n180 90 74\r\n131 49 32\r\n57 90 41\r\n164 180 106\r\n98 123 57\r\n255 246 189\r\n213 205 131\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_fisherman.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 213 189\r\n222 172 148\r\n180 131 115\r\n82 57 57\r\n123 98 106\r\n82 82 123\r\n213 172 82\r\n180 139 82\r\n205 205 222\r\n123 82 49\r\n49 49 74\r\n246 123 49\r\n189 106 49\r\n238 238 255\r\n0 0 24\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_gentleman.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n180 148 115\r\n148 115 82\r\n123 90 57\r\n65 49 41\r\n255 238 156\r\n213 213 205\r\n180 180 172\r\n90 106 172\r\n57 74 123\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_hiker.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 164 148\r\n205 131 115\r\n74 65 57\r\n123 189 90\r\n115 148 90\r\n213 180 98\r\n172 148 98\r\n205 205 222\r\n148 148 148\r\n123 115 74\r\n230 98 90\r\n164 74 74\r\n255 255 255\r\n0 0 24\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_lady.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 222\r\n238 180 180\r\n156 123 106\r\n172 106 74\r\n82 82 32\r\n213 222 230\r\n255 230 106\r\n213 172 90\r\n222 98 123\r\n148 164 180\r\n180 238 106\r\n148 213 82\r\n123 189 65\r\n255 255 255\r\n0 0 24\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_lass.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n222 148 115\r\n123 90 82\r\n164 172 197\r\n90 98 148\r\n49 57 82\r\n41 57 98\r\n222 230 238\r\n255 197 90\r\n189 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_picnicker.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n246 205 156\r\n205 156 115\r\n115 82 65\r\n131 213 205\r\n82 164 148\r\n180 189 222\r\n57 90 74\r\n24 49 90\r\n98 115 230\r\n57 82 131\r\n255 98 41\r\n189 74 41\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_pokemaniac.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n246 205 156\r\n205 156 115\r\n115 82 65\r\n246 189 115\r\n213 123 74\r\n180 82 74\r\n139 57 41\r\n74 74 49\r\n255 230 57\r\n98 123 106\r\n230 82 24\r\n213 205 230\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_pokemon_breeder_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n255 98 90\r\n164 49 65\r\n255 148 131\r\n49 49 74\r\n213 222 230\r\n205 74 74\r\n115 148 197\r\n49 74 123\r\n57 115 164\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_pokemon_breeder_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n131 90 74\r\n255 98 90\r\n156 65 74\r\n255 148 131\r\n49 49 74\r\n213 222 230\r\n205 74 74\r\n115 148 197\r\n49 74 123\r\n57 115 164\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_pokemon_ranger_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n131 90 65\r\n82 49 49\r\n131 139 156\r\n82 90 115\r\n49 57 82\r\n213 213 222\r\n255 205 65\r\n255 131 74\r\n205 98 74\r\n156 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_pokemon_ranger_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n139 106 82\r\n82 49 49\r\n131 139 156\r\n90 98 115\r\n49 57 82\r\n213 213 222\r\n255 205 65\r\n238 139 82\r\n197 82 74\r\n115 57 49\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_psychic_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n246 205 156\r\n205 156 115\r\n115 82 65\r\n98 123 180\r\n32 98 131\r\n255 0 246\r\n41 57 90\r\n213 131 255\r\n156 115 180\r\n115 82 148\r\n246 139 90\r\n197 90 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_psychic_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n230 189 148\r\n205 156 115\r\n115 82 65\r\n98 123 180\r\n32 98 131\r\n0 255 0\r\n41 57 90\r\n213 131 255\r\n131 106 172\r\n90 74 131\r\n246 139 90\r\n197 90 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_ruin_maniac.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n255 238 106\r\n246 246 230\r\n222 222 189\r\n180 180 139\r\n115 106 65\r\n222 213 246\r\n115 131 205\r\n222 189 8\r\n213 115 139\r\n172 74 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_sailor.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n180 180 172\r\n90 131 189\r\n65 90 139\r\n57 57 57\r\n213 222 230\r\n139 139 131\r\n131 180 230\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_sis_and_bro.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n246 205 189\r\n222 164 148\r\n164 123 98\r\n74 57 49\r\n255 139 90\r\n230 82 74\r\n180 65 65\r\n90 65 82\r\n197 65 65\r\n213 222 230\r\n255 230 205\r\n139 172 213\r\n90 131 189\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_swimmer_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n246 205 189\r\n222 164 148\r\n164 123 98\r\n74 57 49\r\n255 139 90\r\n230 82 74\r\n180 65 65\r\n90 65 82\r\n197 65 65\r\n213 222 230\r\n255 230 205\r\n139 172 213\r\n90 131 189\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_swimmer_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n230 197 172\r\n213 172 148\r\n172 123 106\r\n115 82 65\r\n90 131 189\r\n65 90 139\r\n41 65 98\r\n49 41 65\r\n205 213 222\r\n172 172 180\r\n139 65 65\r\n222 238 238\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_tuber_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n139 172 213\r\n90 131 189\r\n65 90 139\r\n57 57 57\r\n213 222 230\r\n255 230 74\r\n205 57 82\r\n238 180 57\r\n189 131 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_twins.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n139 172 213\r\n90 131 189\r\n65 90 139\r\n57 57 57\r\n213 222 230\r\n255 230 74\r\n180 82 98\r\n238 180 57\r\n189 131 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_young_couple.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n148 164 172\r\n82 123 164\r\n57 82 106\r\n32 49 74\r\n205 213 222\r\n123 197 156\r\n90 164 131\r\n255 98 90\r\n197 65 65\r\n106 106 139\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/rs_youngster.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n213 148 115\r\n123 90 82\r\n139 197 222\r\n65 90 148\r\n49 57 82\r\n41 57 98\r\n197 197 238\r\n255 222 65\r\n222 172 90\r\n98 164 222\r\n49 123 156\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/ruby_sapphire_brendan.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 164 148\r\n205 131 115\r\n123 90 82\r\n98 123 156\r\n74 90 131\r\n49 65 106\r\n24 41 82\r\n222 230 238\r\n255 197 90\r\n189 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/ruby_sapphire_may.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 164 148\r\n205 131 115\r\n123 90 82\r\n98 98 115\r\n41 57 65\r\n164 106 82\r\n74 49 57\r\n205 205 222\r\n255 197 90\r\n189 156 90\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/ruin_maniac.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n213 213 148\r\n180 180 98\r\n139 131 49\r\n90 82 16\r\n180 172 131\r\n156 156 156\r\n205 205 205\r\n139 131 106\r\n82 65 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/running_triathlete_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n90 131 189\r\n65 90 139\r\n41 65 98\r\n49 41 65\r\n205 213 222\r\n180 139 90\r\n139 65 65\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/running_triathlete_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n246 205 180\r\n230 180 148\r\n180 139 106\r\n115 82 65\r\n90 131 189\r\n65 90 139\r\n41 65 98\r\n49 41 65\r\n205 213 222\r\n180 139 90\r\n139 65 65\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/sailor.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 180 106\r\n0 0 0\r\n246 246 255\r\n230 230 255\r\n197 197 230\r\n123 123 156\r\n106 123 172\r\n65 82 123\r\n41 57 82\r\n65 65 16\r\n222 123 74\r\n172 74 57\r\n123 90 82\r\n189 139 106\r\n222 180 148\r\n246 222 205\r\n"
  },
  {
    "path": "graphics/trainers/palettes/school_kid_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n238 189 156\r\n205 148 115\r\n106 74 57\r\n255 139 164\r\n213 82 131\r\n131 139 255\r\n98 115 180\r\n57 74 131\r\n246 189 123\r\n197 131 65\r\n230 82 41\r\n139 90 32\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/school_kid_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 180 148\r\n213 148 115\r\n123 90 82\r\n172 164 115\r\n65 90 148\r\n49 57 82\r\n131 123 82\r\n197 197 238\r\n255 222 65\r\n205 189 123\r\n98 164 222\r\n49 123 156\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/scientist.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n238 82 57\r\n131 139 172\r\n90 98 139\r\n230 172 222\r\n172 123 172\r\n57 65 98\r\n131 139 148\r\n180 189 197\r\n213 222 213\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/sis_and_bro.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 180 148\r\n189 139 106\r\n98 57 65\r\n255 230 131\r\n213 180 90\r\n172 106 49\r\n255 164 164\r\n222 106 115\r\n172 74 74\r\n189 197 230\r\n123 148 205\r\n65 74 115\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/sr_and_jr.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n90 131 189\r\n65 90 139\r\n41 65 98\r\n49 41 65\r\n205 213 222\r\n180 139 90\r\n131 90 41\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/super_nerd.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 230 205\r\n222 189 148\r\n197 148 115\r\n106 74 65\r\n255 98 90\r\n197 65 65\r\n123 123 148\r\n82 82 98\r\n205 205 222\r\n164 164 180\r\n189 156 90\r\n49 49 65\r\n74 49 24\r\n255 255 255\r\n0 0 24\r\n"
  },
  {
    "path": "graphics/trainers/palettes/swimmer_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n222 180 148\r\n189 139 106\r\n98 57 65\r\n255 230 131\r\n213 180 90\r\n172 106 49\r\n255 164 164\r\n222 106 115\r\n172 74 74\r\n205 205 255\r\n164 172 238\r\n106 106 205\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/swimmer_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n238 205 189\r\n213 164 131\r\n180 115 98\r\n115 82 74\r\n164 189 238\r\n98 164 222\r\n49 115 172\r\n139 156 172\r\n222 222 230\r\n106 123 139\r\n180 205 255\r\n213 82 90\r\n238 238 246\r\n255 255 255\r\n16 16 16\r\n"
  },
  {
    "path": "graphics/trainers/palettes/swimming_triathlete_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n90 131 189\r\n65 90 139\r\n41 65 98\r\n49 41 65\r\n205 213 222\r\n180 139 90\r\n139 65 65\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/swimming_triathlete_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n90 131 189\r\n65 90 139\r\n41 65 98\r\n49 41 65\r\n205 213 222\r\n180 139 90\r\n139 65 65\r\n255 98 90\r\n197 65 65\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/tamer.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n172 213 172\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n90 90 98\r\n115 123 139\r\n139 148 164\r\n156 172 180\r\n74 49 41\r\n180 123 65\r\n156 65 65\r\n238 148 90\r\n197 205 213\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/tuber_f.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 189\r\n222 189 148\r\n180 148 106\r\n98 57 65\r\n230 164 98\r\n197 131 57\r\n148 90 57\r\n255 139 156\r\n213 74 90\r\n139 41 57\r\n205 205 255\r\n164 172 238\r\n106 106 205\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/tuber_m.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n139 172 213\r\n90 131 189\r\n65 90 139\r\n57 57 57\r\n213 222 230\r\n255 230 74\r\n205 57 82\r\n238 180 57\r\n189 131 74\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/twins.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n106 74 74\r\n238 164 82\r\n205 115 65\r\n139 57 65\r\n57 41 41\r\n213 222 230\r\n156 189 246\r\n180 82 98\r\n90 139 189\r\n65 90 131\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/wally.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 238 213\r\n222 180 164\r\n189 148 115\r\n123 90 82\r\n156 148 172\r\n115 106 131\r\n189 205 98\r\n148 172 74\r\n222 222 230\r\n98 148 49\r\n65 106 24\r\n98 156 222\r\n180 180 205\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/young_couple.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n238 180 148\r\n197 139 106\r\n98 65 57\r\n255 255 255\r\n139 180 230\r\n106 131 180\r\n82 74 115\r\n0 0 24\r\n255 115 90\r\n197 82 65\r\n222 230 238\r\n189 197 213\r\n123 131 148\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/trainers/palettes/youngster.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n115 197 164\r\n255 222 205\r\n230 197 156\r\n197 148 115\r\n123 90 82\r\n213 213 222\r\n98 164 222\r\n49 123 156\r\n230 98 90\r\n172 74 57\r\n41 90 131\r\n246 205 123\r\n205 172 82\r\n180 148 90\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/union_room_chat/messages.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n246 246 255\r\n0 0 0\r\n205 205 230\r\n49 213 0\r\n222 230 213\r\n0 0 255\r\n205 213 222\r\n255 0 0\r\n222 213 197\r\n255 189 0\r\n230 230 222\r\n197 197 197\r\n41 32 32\r\n0 0 0\r\n57 57 57\r\n"
  },
  {
    "path": "graphics/union_room_chat/objects.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n156 197 98\r\n255 49 49\r\n156 49 49\r\n49 98 255\r\n0 0 98\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n230 230 255\r\n213 213 255\r\n172 172 172\r\n115 115 115\r\n255 255 255\r\n65 65 65\r\n"
  },
  {
    "path": "graphics/union_room_chat/text_entry.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n213 205 205\r\n255 255 255\r\n255 255 255\r\n41 41 41\r\n255 156 82\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/union_room_chat/unused.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n255 255 255\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/unused/battle_anim_023.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 230 255\r\n115 230 255\r\n213 230 255\r\n0 0 0\r\n255 255 172\r\n255 255 115\r\n0 0 0\r\n98 139 98\r\n0 0 0\r\n0 0 0\r\n131 131 131\r\n164 164 164\r\n213 205 205\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/unused/gray_palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n255 255 255\r\n230 230 238\r\n205 213 222\r\n180 197 205\r\n164 180 189\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/unused/old_pal1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n16 139 0\r\n0 0 0\r\n148 65 65\r\n0 0 0\r\n148 65 32\r\n16 0 0\r\n148 65 32\r\n8 8 0\r\n148 65 32\r\n148 8 8\r\n148 65 65\r\n24 16 0\r\n16 139 98\r\n32 0 0\r\n0 16 139\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/unused/old_pal2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n16 139 0\r\n0 0 0\r\n148 65 65\r\n0 0 0\r\n148 65 32\r\n16 0 0\r\n148 65 32\r\n8 8 0\r\n148 65 32\r\n16 0 0\r\n148 65 65\r\n0 0 0\r\n16 139 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/unused/old_pal3.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n0 0 0\r\n0 16 139\r\n0 0 0\r\n0 213 98\r\n32 0 0\r\n0 213 98\r\n24 16 0\r\n0 213 98\r\n156 8 8\r\n0 213 98\r\n24 16 0\r\n0 213 98\r\n32 0 0\r\n0 16 139\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/unused/old_pal4.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 255\r\n41 41 57\r\n90 90 106\r\n172 172 180\r\n197 197 205\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/unused/old_pal5.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 156 131\r\n115 115 115\r\n189 189 189\r\n255 255 255\r\n189 164 41\r\n246 246 41\r\n222 106 32\r\n246 131 41\r\n115 98 246\r\n98 74 205\r\n238 115 156\r\n246 148 246\r\n115 172 246\r\n8 8 8\r\n90 90 90\r\n65 65 65\r\n"
  },
  {
    "path": "graphics/unused/old_pal6.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 156 131\r\n115 115 115\r\n189 189 189\r\n255 255 255\r\n115 148 74\r\n156 205 74\r\n148 246 74\r\n238 115 156\r\n246 148 246\r\n189 164 41\r\n246 246 41\r\n8 8 8\r\n8 8 8\r\n8 8 8\r\n90 90 90\r\n65 65 65\r\n"
  },
  {
    "path": "graphics/unused/old_pal7.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n98 156 131\r\n115 115 115\r\n156 156 156\r\n255 255 255\r\n98 115 246\r\n115 172 246\r\n164 98 41\r\n230 172 139\r\n189 164 41\r\n246 246 41\r\n246 98 82\r\n148 123 205\r\n197 164 205\r\n213 41 156\r\n90 90 90\r\n65 65 65\r\n"
  },
  {
    "path": "graphics/unused/red_palette.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n255 255 148\r\n255 0 0\r\n255 0 0\r\n255 32 32\r\n255 57 57\r\n255 74 74\r\n255 90 90\r\n255 115 115\r\n255 131 131\r\n255 156 156\r\n255 172 172\r\n255 189 189\r\n255 213 213\r\n255 230 230\r\n255 255 255\r\n0 0 0\r\n"
  },
  {
    "path": "graphics/weather/default.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n172 230 255\r\n115 205 255\r\n74 180 255\r\n148 148 148\r\n197 197 197\r\n213 213 213\r\n222 222 222\r\n164 164 164\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n180 180 180\r\n230 230 230\r\n246 246 246\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_00.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n74 246 255\r\n57 57 57\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_01.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n74 246 255\r\n57 213 230\r\n57 57 57\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_02.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n74 246 255\r\n57 213 230\r\n49 180 205\r\n0 32 98\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_03.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n74 246 255\r\n57 213 230\r\n49 180 205\r\n41 148 180\r\n0 32 98\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_04.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n90 90 90\r\n90 90 90\r\n74 246 255\r\n57 213 230\r\n49 180 205\r\n41 148 180\r\n24 123 164\r\n0 32 98\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_05.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n90 90 90\r\n74 246 255\r\n57 213 230\r\n49 180 205\r\n41 148 180\r\n24 123 164\r\n16 90 139\r\n0 32 98\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_06.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n74 246 255\r\n57 213 230\r\n49 180 205\r\n41 148 180\r\n24 123 164\r\n16 90 139\r\n8 57 115\r\n0 32 98\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_07.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n57 213 230\r\n49 180 205\r\n41 148 180\r\n24 123 164\r\n16 90 139\r\n8 57 115\r\n8 57 115\r\n57 57 57\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_08.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n49 180 205\r\n41 148 180\r\n24 123 164\r\n16 90 139\r\n8 57 115\r\n8 57 115\r\n90 90 90\r\n57 57 57\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_09.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n41 148 180\r\n24 123 164\r\n16 90 139\r\n8 57 115\r\n8 57 115\r\n90 90 90\r\n90 90 90\r\n57 57 57\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_10.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n24 123 164\r\n16 90 139\r\n8 57 115\r\n8 57 115\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n57 57 57\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_11.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n16 90 139\r\n8 57 115\r\n8 57 115\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n57 57 57\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_12.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n8 57 115\r\n8 57 115\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n57 57 57\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/anim_13.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n57 57 57\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wireless_status_screen/default.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n0 0 0\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n90 90 90\r\n57 57 57\r\n172 123 0\r\n90 90 90\r\n57 57 57\r\n164 164 164\r\n255 180 0\r\n106 106 106\r\n74 74 74\r\n"
  },
  {
    "path": "graphics/wonder_card/bg0.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n213 213 213\r\n74 74 74\r\n98 106 106\r\n213 189 74\r\n238 213 82\r\n246 246 213\r\n255 255 255\r\n230 230 213\r\n238 238 213\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/wonder_card/bg1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n82 82 106\r\n131 131 139\r\n197 189 213\r\n205 230 255\r\n115 139 197\r\n49 74 82\r\n0 0 0\r\n0 0 0\r\n222 255 246\r\n197 255 222\r\n222 238 255\r\n156 180 222\r\n156 106 115\r\n172 139 164\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/wonder_card/bg2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n82 82 106\r\n131 131 139\r\n164 156 172\r\n197 189 213\r\n246 238 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 230 230\r\n255 197 197\r\n255 164 164\r\n246 139 139\r\n238 90 90\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/wonder_card/bg3.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n82 82 106\r\n131 131 139\r\n164 156 172\r\n197 189 213\r\n246 238 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n238 255 230\r\n213 255 189\r\n189 230 156\r\n164 213 131\r\n148 197 106\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/wonder_card/bg4.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n82 82 106\r\n131 131 139\r\n164 156 172\r\n197 189 213\r\n246 238 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n238 246 255\r\n205 238 246\r\n180 222 246\r\n156 197 238\r\n115 156 197\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/wonder_card/bg5.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n82 82 106\r\n131 131 139\r\n164 156 172\r\n197 189 213\r\n246 238 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n238 238 197\r\n230 230 139\r\n222 222 115\r\n213 213 90\r\n189 189 57\r\n255 255 255\r\n"
  },
  {
    "path": "graphics/wonder_card/bg6.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 123 148\r\n213 213 213\r\n74 74 74\r\n115 123 123\r\n164 156 90\r\n164 148 90\r\n197 197 90\r\n213 205 90\r\n222 213 90\r\n213 213 106\r\n238 246 98\r\n230 222 98\r\n213 205 98\r\n197 180 98\r\n238 230 98\r\n246 238 106\r\n"
  },
  {
    "path": "graphics/wonder_card/bg7.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 123 148\r\n213 213 213\r\n74 74 74\r\n115 123 123\r\n156 156 156\r\n139 139 148\r\n180 180 197\r\n197 189 205\r\n205 205 222\r\n189 189 189\r\n197 230 222\r\n189 213 213\r\n180 197 197\r\n156 164 172\r\n222 222 230\r\n230 230 238\r\n"
  },
  {
    "path": "graphics/wonder_card/stamp_shadow_0.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n189 189 164\r\n205 205 172\r\n213 213 189\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/wonder_card/stamp_shadow_1.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n82 82 106\r\n164 156 180\r\n246 238 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/wonder_card/stamp_shadow_2.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n246 139 139\r\n246 180 180\r\n255 230 230\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/wonder_card/stamp_shadow_3.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n164 213 131\r\n197 230 180\r\n238 255 230\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/wonder_card/stamp_shadow_4.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n156 197 238\r\n197 222 246\r\n238 246 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/wonder_card/stamp_shadow_5.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n213 213 90\r\n222 222 139\r\n238 238 197\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/wonder_card/stamp_shadow_6.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n205 189 98\r\n222 205 115\r\n230 222 98\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/wonder_card/stamp_shadow_7.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n197 197 197\r\n205 205 205\r\n213 213 213\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/wonder_news/bg0.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n90 197 148\r\n213 213 213\r\n74 74 74\r\n98 106 106\r\n213 189 74\r\n238 213 82\r\n246 246 213\r\n255 255 255\r\n230 230 213\r\n238 238 213\r\n246 246 238\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n255 0 255\r\n"
  },
  {
    "path": "graphics/wonder_news/bg6.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 123 148\r\n213 213 213\r\n74 74 74\r\n115 123 123\r\n164 156 90\r\n164 148 90\r\n197 197 90\r\n213 205 90\r\n222 213 90\r\n213 213 106\r\n238 246 98\r\n230 222 98\r\n213 205 98\r\n197 180 98\r\n238 230 98\r\n246 238 106\r\n"
  },
  {
    "path": "graphics/wonder_news/bg7.pal",
    "content": "JASC-PAL\r\n0100\r\n16\r\n189 123 148\r\n213 213 213\r\n74 74 74\r\n115 123 123\r\n156 156 156\r\n139 139 148\r\n180 180 197\r\n197 189 205\r\n205 205 222\r\n189 189 189\r\n197 230 222\r\n189 213 213\r\n180 197 197\r\n156 164 172\r\n222 222 230\r\n230 230 238\r\n"
  },
  {
    "path": "graphics_file_rules.mk",
    "content": "TILESETGFXDIR := data/tilesets\nFONTGFXDIR := graphics/fonts\nFAMECHECKERGFXDIR := graphics/fame_checker\nINTERFACEGFXDIR := graphics/interface\nPARTYMENUGFXDIR := graphics/party_menu\nBTLANMSPRGFXDIR := graphics/battle_anims/sprites\nUNUSEDGFXDIR := graphics/unused\nUNKNOWNGFXDIR := graphics/unknown\nBATINTGFXDIR := graphics/battle_interface\nMASKSGFXDIR := graphics/battle_anims/masks\nBATTRANSGFXDIR := graphics/battle_transitions\nTYPESGFXDIR := graphics/types\nRAYQUAZAGFXDIR := graphics/rayquaza_scene\nROULETTEGFXDIR := graphics/roulette\nSLOTMACHINEGFXDIR := graphics/slot_machine\nPSSGFXDIR := graphics/pokemon_storage\nEVENTOBJGFXDIR := graphics/object_events\nFIELDEFFECTSGFXDIR := graphics/field_effects\nMISCGFXDIR := graphics/misc\nTEXTWINDOWGFXDIR := graphics/text_window\nTEACHYTVGFXDIR := graphics/teachy_tv\nSSANNEGFXDIR := graphics/ss_anne\nITEMPCGFXDIR := graphics/item_pc\nTITLESCREENGFXDIR := graphics/title_screen\nCREDITSGFXDIR := graphics/credits\nITEMMENUGFXDIR := graphics/item_menu\nINTROGFXDIR := graphics/intro\nBATTLETERRAINGFXDIR := graphics/battle_terrain\nBERRYPOUCHGFXDIR := graphics/berry_pouch\nHALLOFFAMEGFXDIR := graphics/hall_of_fame\nMAPPREVIEWGFXDIR := graphics/map_preview\nNAMINGGFXDIR := graphics/naming_screen\nWALLPAPERGFXDIR := graphics/pokemon_storage/wallpapers\nJPCONTESTGFXDIR := graphics/contest/japanese\n\ntypes := normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark\ncontest_types := cool beauty cute smart tough\n\nCASTFORMGFXDIR := graphics/pokemon/castform\n$(CASTFORMGFXDIR)/front.4bpp: $(CASTFORMGFXDIR)/normal/front.4bpp \\\n\t\t\t\t\t\t\t\t\t\t\t$(CASTFORMGFXDIR)/sunny/front.4bpp \\\n\t\t\t\t\t\t\t\t\t\t\t$(CASTFORMGFXDIR)/rainy/front.4bpp \\\n\t\t\t\t\t\t\t\t\t\t\t$(CASTFORMGFXDIR)/snowy/front.4bpp\n\t@cat $^ >$@\n\n$(CASTFORMGFXDIR)/back.4bpp: $(CASTFORMGFXDIR)/normal/back.4bpp \\\n\t\t\t\t\t\t\t\t\t $(CASTFORMGFXDIR)/sunny/back.4bpp \\\n\t\t\t\t\t\t\t\t\t $(CASTFORMGFXDIR)/rainy/back.4bpp \\\n\t\t\t\t\t\t\t\t\t $(CASTFORMGFXDIR)/snowy/back.4bpp\n\t@cat $^ >$@\n\n$(CASTFORMGFXDIR)/normal.gbapal: $(CASTFORMGFXDIR)/normal/normal.gbapal \\\n\t\t\t\t\t\t\t\t\t $(CASTFORMGFXDIR)/sunny/normal.gbapal \\\n\t\t\t\t\t\t\t\t\t $(CASTFORMGFXDIR)/rainy/normal.gbapal \\\n\t\t\t\t\t\t\t\t\t $(CASTFORMGFXDIR)/snowy/normal.gbapal\n\t@cat $^ >$@\n\n$(CASTFORMGFXDIR)/shiny.gbapal: $(CASTFORMGFXDIR)/normal/shiny.gbapal \\\n\t\t\t\t\t\t\t\t\t$(CASTFORMGFXDIR)/sunny/shiny.gbapal \\\n\t\t\t\t\t\t\t\t\t$(CASTFORMGFXDIR)/rainy/shiny.gbapal \\\n\t\t\t\t\t\t\t\t\t$(CASTFORMGFXDIR)/snowy/shiny.gbapal\n\t@cat $^ >$@\n\n$(FONTGFXDIR)/latin_small.latfont: $(FONTGFXDIR)/latin_small.png\n\t$(GFX) $< $@\n\n$(FONTGFXDIR)/japanese_small.fwjpnfont: $(FONTGFXDIR)/japanese_small.png\n\t$(GFX) $< $@\n\n$(FONTGFXDIR)/japanese_tall.fwjpnfont: $(FONTGFXDIR)/japanese_tall.png\n\t$(GFX) $< $@\n\n$(FONTGFXDIR)/latin_normal.latfont: $(FONTGFXDIR)/latin_normal.png\n\t$(GFX) $< $@\n\n$(FONTGFXDIR)/japanese_normal.fwjpnfont: $(FONTGFXDIR)/japanese_normal.png\n\t$(GFX) $< $@\n\n$(FONTGFXDIR)/latin_male.latfont: $(FONTGFXDIR)/latin_male.png\n\t$(GFX) $< $@\n\n$(FONTGFXDIR)/japanese_male.fwjpnfont: $(FONTGFXDIR)/japanese_male.png\n\t$(GFX) $< $@\n\n$(FONTGFXDIR)/latin_female.latfont: $(FONTGFXDIR)/latin_female.png\n\t$(GFX) $< $@\n\n$(FONTGFXDIR)/japanese_female.fwjpnfont: $(FONTGFXDIR)/japanese_female.png\n\t$(GFX) $< $@\n\n$(FONTGFXDIR)/braille.fwjpnfont: $(FONTGFXDIR)/braille.png\n\t$(GFX) $< $@\n\n$(FONTGFXDIR)/japanese_bold.fwjpnfont: $(FONTGFXDIR)/japanese_bold.png\n\t$(GFX) $< $@\n\ngraphics/title_screen/pokemon_logo.gbapal: %.gbapal: %.pal\n\t$(GFX) $< $@ -num_colors 224\n\ngraphics/pokemon_jump/bg.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 63 -Wnum_tiles\n\n$(MISCGFXDIR)/japanese_hof.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 29 -Wnum_tiles\n\n$(MISCGFXDIR)/markings2.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 25 -Wnum_tiles\n\n$(INTERFACEGFXDIR)/menu.gbapal: $(INTERFACEGFXDIR)/menu_0.gbapal \\\n\t\t\t\t\t\t$(INTERFACEGFXDIR)/menu_1.gbapal\n\t@cat $^ >$@\n\n$(BTLANMSPRGFXDIR)/ice_cube.4bpp: $(BTLANMSPRGFXDIR)/ice_cube_0.4bpp \\\n\t\t\t\t\t\t  $(BTLANMSPRGFXDIR)/ice_cube_1.4bpp \\\n\t\t\t\t\t\t  $(BTLANMSPRGFXDIR)/ice_cube_2.4bpp \\\n\t\t\t\t\t\t  $(BTLANMSPRGFXDIR)/ice_cube_3.4bpp\n\t@cat $^ >$@\n\n$(UNUSEDGFXDIR)/obi_palpak1.gbapal: $(UNUSEDGFXDIR)/old_pal1.gbapal \\\n\t\t\t\t\t\t\t\t\t$(UNUSEDGFXDIR)/old_pal2.gbapal \\\n\t\t\t\t\t\t\t\t\t$(UNUSEDGFXDIR)/old_pal3.gbapal\n\t@cat $^ >$@\n\n$(UNUSEDGFXDIR)/obi_palpak3.gbapal: $(UNUSEDGFXDIR)/old_pal5.gbapal \\\n\t\t\t\t\t\t\t\t\t$(UNUSEDGFXDIR)/old_pal6.gbapal \\\n\t\t\t\t\t\t\t\t\t$(UNUSEDGFXDIR)/old_pal7.gbapal\n\t@cat $^ >$@\n\n$(UNUSEDGFXDIR)/obi1.4bpp: $(UNUSEDGFXDIR)/old_bulbasaur.4bpp \\\n\t\t\t\t\t\t   $(UNUSEDGFXDIR)/old_charizard.4bpp\n\t@cat $^ >$@\n\n$(UNUSEDGFXDIR)/obi2.4bpp: $(UNUSEDGFXDIR)/old_bulbasaur2.4bpp \\\n\t\t\t\t\t\t   $(UNUSEDGFXDIR)/old_battle_interface_1.4bpp \\\n\t\t\t\t\t\t   $(UNUSEDGFXDIR)/old_battle_interface_2.4bpp \\\n\t\t\t\t\t\t   $(UNUSEDGFXDIR)/old_battle_interface_3.4bpp\n\t@cat $^ >$@\n\n$(INTERFACEGFXDIR)/hp_numbers.4bpp: $(INTERFACEGFXDIR)/hp_bar_anim.4bpp \\\n\t\t\t\t\t\t\t$(INTERFACEGFXDIR)/numbers1.4bpp \\\n\t\t\t\t\t\t\t$(INTERFACEGFXDIR)/numbers2.4bpp\n\t@cat $^ >$@\n\n$(UNUSEDGFXDIR)/redyellowgreen_frame.bin: $(UNUSEDGFXDIR)/red_frame.bin \\\n\t\t\t\t\t\t\t\t\t\t  $(UNUSEDGFXDIR)/yellow_frame.bin \\\n\t\t\t\t\t\t\t\t\t\t  $(UNUSEDGFXDIR)/green_frame.bin \\\n\t\t\t\t\t\t\t\t\t\t  $(UNUSEDGFXDIR)/blank_frame.bin\n\t@cat $^ >$@\n\n$(UNUSEDGFXDIR)/color_frames.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 353 -Wnum_tiles\n\n$(BATINTGFXDIR)/unused_window2bar.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 5 -Wnum_tiles\n\n$(BATINTGFXDIR)/level_up_banner.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 36 -Wnum_tiles\n\n$(BATINTGFXDIR)/textbox.gbapal: $(BATINTGFXDIR)/textbox1.gbapal $(BATINTGFXDIR)/textbox2.gbapal\n\tcat $^ > $@\n\n$(JPCONTESTGFXDIR)/composite_1.4bpp: $(JPCONTESTGFXDIR)/frame_1.4bpp \\\n\t\t\t\t\t\t\t\t  $(JPCONTESTGFXDIR)/floor.4bpp \\\n\t\t\t\t\t\t\t\t  $(JPCONTESTGFXDIR)/frame_2.4bpp \\\n\t\t\t\t\t\t\t\t  $(JPCONTESTGFXDIR)/symbols.4bpp \\\n\t\t\t\t\t\t\t\t  $(JPCONTESTGFXDIR)/meter.4bpp \\\n\t\t\t\t\t\t\t\t  $(JPCONTESTGFXDIR)/classes.4bpp \\\n\t\t\t\t\t\t\t\t  $(JPCONTESTGFXDIR)/numbers_2.4bpp\n\t@cat $^ >$@\n\n$(JPCONTESTGFXDIR)/composite_2.4bpp: $(JPCONTESTGFXDIR)/interface.4bpp \\\n\t\t\t\t\t\t\t\t\t$(JPCONTESTGFXDIR)/audience.4bpp\n\t@cat $^ >$@\n\n$(JPCONTESTGFXDIR)/voltage.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 36 -Wnum_tiles\n\n$(BTLANMSPRGFXDIR)/ice_crystals.4bpp: $(BTLANMSPRGFXDIR)/ice_crystals_0.4bpp \\\n\t\t\t\t\t\t  $(BTLANMSPRGFXDIR)/ice_crystals_1.4bpp \\\n\t\t\t\t\t\t  $(BTLANMSPRGFXDIR)/ice_crystals_2.4bpp \\\n\t\t\t\t\t\t  $(BTLANMSPRGFXDIR)/ice_crystals_3.4bpp \\\n\t\t\t\t\t\t  $(BTLANMSPRGFXDIR)/ice_crystals_4.4bpp\n\t@cat $^ >$@\n\n$(BTLANMSPRGFXDIR)/mud_sand.4bpp: $(BTLANMSPRGFXDIR)/mud_sand_0.4bpp \\\n\t\t\t\t\t\t  $(BTLANMSPRGFXDIR)/mud_sand_1.4bpp\n\t@cat $^ >$@\n\n$(BTLANMSPRGFXDIR)/flower.4bpp: $(BTLANMSPRGFXDIR)/flower_0.4bpp \\\n\t\t\t\t\t\t  $(BTLANMSPRGFXDIR)/flower_1.4bpp\n\t@cat $^ >$@\n\n$(BTLANMSPRGFXDIR)/spark.4bpp: $(BTLANMSPRGFXDIR)/spark_0.4bpp \\\n\t\t\t\t\t\t  $(BTLANMSPRGFXDIR)/spark_1.4bpp\n\t@cat $^ >$@\n\n$(MASKSGFXDIR)/unused_level_up.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 14 -Wnum_tiles\n\n$(BATTRANSGFXDIR)/vs_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 16 -Wnum_tiles\n\n$(PARTYMENUGFXDIR)/bg.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 62 -Wnum_tiles\n\n$(TYPESGFXDIR)/move_types.4bpp: $(types:%=$(TYPESGFXDIR)/%.4bpp) $(contest_types:%=$(TYPESGFXDIR)/contest_%.4bpp)\n\t@cat $^ >$@\n\n$(TYPESGFXDIR)/move_types.gbapal: $(TYPESGFXDIR)/move_types_1.gbapal \\\n\t\t\t\t\t\t\t   $(TYPESGFXDIR)/move_types_2.gbapal \\\n\t\t\t\t\t\t\t   $(TYPESGFXDIR)/move_types_3.gbapal\n\t@cat $^ >$@\n\n$(INTERFACEGFXDIR)/bag_screen.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 53 -Wnum_tiles\n\n$(RAYQUAZAGFXDIR)/rayquaza.8bpp: %.8bpp: %.png\n\t$(GFX) $< $@ -num_tiles 227 -Wnum_tiles\n\n$(RAYQUAZAGFXDIR)/overcast.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 313 -Wnum_tiles\n\n$(RAYQUAZAGFXDIR)/rayquaza_fly1.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 124 -Wnum_tiles\n\n$(RAYQUAZAGFXDIR)/rayquaza_tail_fix.4bpp: $(RAYQUAZAGFXDIR)/rayquaza_tail.4bpp\n\tcp $< $@\n\thead -c 12 /dev/zero >> $@\n\n$(RAYQUAZAGFXDIR)/chase_streaks.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 19 -Wnum_tiles\n\n$(RAYQUAZAGFXDIR)/rayquaza_chase.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 155 -Wnum_tiles\n\ngraphics/picture_frame/frame5.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 86 -Wnum_tiles\n\n$(ROULETTEGFXDIR)/roulette_tilt.4bpp: $(ROULETTEGFXDIR)/shroomish.4bpp \\\n\t\t\t\t\t\t\t\t\t  $(ROULETTEGFXDIR)/tailow.4bpp\n\t@cat $^ >$@\n\n$(ROULETTEGFXDIR)/poke_icons2.4bpp: $(ROULETTEGFXDIR)/wynaut.4bpp \\\n\t\t\t\t\t\t\t\t\t$(ROULETTEGFXDIR)/azurill.4bpp \\\n\t\t\t\t\t\t\t\t\t$(ROULETTEGFXDIR)/skitty.4bpp \\\n\t\t\t\t\t\t\t\t\t$(ROULETTEGFXDIR)/makuhita.4bpp\n\t@cat $^ >$@\n\n$(UNUSEDGFXDIR)/intro_birch_beauty.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 822 -Wnum_tiles\n\n$(PSSGFXDIR)/forest_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 55 -Wnum_tiles\n\n$(PSSGFXDIR)/forest.4bpp: $(PSSGFXDIR)/forest_frame.4bpp $(PSSGFXDIR)/forest_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/city_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 52 -Wnum_tiles\n\n$(PSSGFXDIR)/city.4bpp: $(PSSGFXDIR)/city_frame.4bpp $(PSSGFXDIR)/city_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/desert.4bpp: $(PSSGFXDIR)/desert_frame.4bpp $(PSSGFXDIR)/desert_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/savanna_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 45 -Wnum_tiles\n\n$(PSSGFXDIR)/savanna_bg.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 23 -Wnum_tiles\n\n$(PSSGFXDIR)/savanna.4bpp: $(PSSGFXDIR)/savanna_frame.4bpp $(PSSGFXDIR)/savanna_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/crag_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 49 -Wnum_tiles\n\n$(PSSGFXDIR)/crag.4bpp: $(PSSGFXDIR)/crag_frame.4bpp $(PSSGFXDIR)/crag_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/volcano_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 56 -Wnum_tiles\n\n$(PSSGFXDIR)/volcano.4bpp: $(PSSGFXDIR)/volcano_frame.4bpp $(PSSGFXDIR)/volcano_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/snow_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 57 -Wnum_tiles\n\n$(PSSGFXDIR)/snow.4bpp: $(PSSGFXDIR)/snow_frame.4bpp $(PSSGFXDIR)/snow_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/cave_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 55 -Wnum_tiles\n\n$(PSSGFXDIR)/cave.4bpp: $(PSSGFXDIR)/cave_frame.4bpp $(PSSGFXDIR)/cave_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/beach_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 46 -Wnum_tiles\n\n$(PSSGFXDIR)/beach_bg.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 23 -Wnum_tiles\n\n$(PSSGFXDIR)/beach.4bpp: $(PSSGFXDIR)/beach_frame.4bpp $(PSSGFXDIR)/beach_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/seafloor_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 54 -Wnum_tiles\n\n$(PSSGFXDIR)/seafloor.4bpp: $(PSSGFXDIR)/seafloor_frame.4bpp $(PSSGFXDIR)/seafloor_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/river_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 51 -Wnum_tiles\n\n$(PSSGFXDIR)/river_bg.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 11 -Wnum_tiles\n\n$(PSSGFXDIR)/river.4bpp: $(PSSGFXDIR)/river_frame.4bpp $(PSSGFXDIR)/river_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/sky_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 45 -Wnum_tiles\n\n$(PSSGFXDIR)/sky.4bpp: $(PSSGFXDIR)/sky_frame.4bpp $(PSSGFXDIR)/sky_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/polkadot_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 54 -Wnum_tiles\n\n$(PSSGFXDIR)/polkadot.4bpp: $(PSSGFXDIR)/polkadot_frame.4bpp $(PSSGFXDIR)/polkadot_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/pokecenter_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 35 -Wnum_tiles\n\n$(PSSGFXDIR)/pokecenter.4bpp: $(PSSGFXDIR)/pokecenter_frame.4bpp $(PSSGFXDIR)/pokecenter_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/machine_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 33 -Wnum_tiles\n\n$(PSSGFXDIR)/machine.4bpp: $(PSSGFXDIR)/machine_frame.4bpp $(PSSGFXDIR)/machine_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/plain_frame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 18 -Wnum_tiles\n\n$(PSSGFXDIR)/plain.4bpp: $(PSSGFXDIR)/plain_frame.4bpp $(PSSGFXDIR)/plain_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/friends_frame1.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 57 -Wnum_tiles\n\n$(PSSGFXDIR)/friends_frame2.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 57 -Wnum_tiles\n\n$(PSSGFXDIR)/zigzagoon.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/zigzagoon_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/screen.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/screen_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/horizontal.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/horizontal_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/diagonal.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/diagonal_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/block.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/block_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/ribbon.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/ribbon_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/pokecenter2.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/pokecenter2_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/frame.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/frame_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/blank.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/blank_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/circles.4bpp: $(PSSGFXDIR)/friends_frame1.4bpp $(PSSGFXDIR)/circles_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/azumarill.4bpp: $(PSSGFXDIR)/friends_frame2.4bpp $(PSSGFXDIR)/azumarill_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/pikachu.4bpp: $(PSSGFXDIR)/friends_frame2.4bpp $(PSSGFXDIR)/pikachu_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/legendary.4bpp: $(PSSGFXDIR)/friends_frame2.4bpp $(PSSGFXDIR)/legendary_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/dusclops.4bpp: $(PSSGFXDIR)/friends_frame2.4bpp $(PSSGFXDIR)/dusclops_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/ludicolo.4bpp: $(PSSGFXDIR)/friends_frame2.4bpp $(PSSGFXDIR)/ludicolo_bg.4bpp\n\t@cat $^ >$@\n\n$(PSSGFXDIR)/whiscash.4bpp: $(PSSGFXDIR)/friends_frame2.4bpp $(PSSGFXDIR)/whiscash_bg.4bpp\n\t@cat $^ >$@\n\n$(FIELDEFFECTSGFXDIR)/pics/underwater_bubbles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(FIELDEFFECTSGFXDIR)/pics/bike_tire_tracks.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(FIELDEFFECTSGFXDIR)/pics/sand_disguise.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(FIELDEFFECTSGFXDIR)/pics/mountain_disguise.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(FIELDEFFECTSGFXDIR)/pics/tree_disguise.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(INTERFACEGFXDIR)/selector_outline.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 8 -Wnum_tiles\n\ngraphics/tm_case/tm_case.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 91 -Wnum_tiles\n\n$(PKNAVGFXDIR)/header.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 53 -Wnum_tiles\n\n$(PKNAVGFXDIR)/outline.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 53 -Wnum_tiles\n\t\n$(PKNAVGFXDIR)/ui_matchcall.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 13 -Wnum_tiles\n\n$(INTERFACEGFXDIR)/region_map.8bpp: %.8bpp: %.png\n\t$(GFX) $< $@ -num_tiles 232 -Wnum_tiles\n\n$(INTERFACEGFXDIR)/region_map_affine.8bpp: %.8bpp: %.png\n\t$(GFX) $< $@ -num_tiles 233 -Wnum_tiles\n\ngraphics/region_map/region_map_hoenn.8bpp: %.8bpp: %.png\n\t$(GFX) $< $@ -num_tiles 233\n\n$(MISCGFXDIR)/birch_help.4bpp: $(MISCGFXDIR)/birch_bag.4bpp $(MISCGFXDIR)/birch_grass.4bpp\n\t@cat $^ >$@\n\t\n$(FAMECHECKERGFXDIR)/spinning_pokeball.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 15 -Wnum_tiles\n\n$(FAMECHECKERGFXDIR)/bg.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 165 -Wnum_tiles\n\ngraphics/seagallop/water.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 41 -Wnum_tiles\n\ngraphics/link/321start.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(TEXTWINDOWGFXDIR)/signpost.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 19 -Wnum_tiles\n\n$(SLOTMACHINEGFXDIR)/firered/combos_window.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 66 -Wnum_tiles\n\n$(SLOTMACHINEGFXDIR)/firered/bg.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 138 -Wnum_tiles\n\n$(SLOTMACHINEGFXDIR)/leafgreen/bg.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 134 -Wnum_tiles\n\n$(TEACHYTVGFXDIR)/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 233 -Wnum_tiles\n\n$(SSANNEGFXDIR)/smoke.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 17 -Wnum_tiles\n\n$(ITEMPCGFXDIR)/bg.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 82 -Wnum_tiles\n\n$(TITLESCREENGFXDIR)/firered/box_art_mon.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 135 -Wnum_tiles\n\n$(TITLESCREENGFXDIR)/leafgreen/box_art_mon.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 123 -Wnum_tiles\n\nPOKEDEXAREAMARKERSDATADIR := graphics/pokedex/area_markers\n\nPOKEDEXAREAMARKERFILES := \\\n\t$(POKEDEXAREAMARKERSDATADIR)/marker_0.4bpp \\\n\t$(POKEDEXAREAMARKERSDATADIR)/marker_1.4bpp \\\n\t$(POKEDEXAREAMARKERSDATADIR)/marker_2.4bpp \\\n\t$(POKEDEXAREAMARKERSDATADIR)/marker_3.4bpp \\\n\t$(POKEDEXAREAMARKERSDATADIR)/marker_4.4bpp \\\n\t$(POKEDEXAREAMARKERSDATADIR)/marker_5.4bpp \\\n\t$(POKEDEXAREAMARKERSDATADIR)/marker_6.4bpp\n\n$(POKEDEXAREAMARKERSDATADIR)/marker.4bpp: $(POKEDEXAREAMARKERFILES)\n\tcat $^ > $@\n\ngraphics/pokemon/heracross/unk_icon.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\ngraphics/misc/emoticons.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(ITEMMENUGFXDIR)/bg.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 55 -Wnum_tiles\n\n$(INTROGFXDIR)/scene_1/grass.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 397 -Wnum_tiles\n\n$(INTROGFXDIR)/scene_2/plants.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 17 -Wnum_tiles\n\n$(INTROGFXDIR)/scene_2/nidorino_close.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 170 -Wnum_tiles\n\n$(INTROGFXDIR)/scene_2/gengar_close.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 114 -Wnum_tiles\n\n$(INTROGFXDIR)/scene_3/gengar_anim.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 348 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/building/terrain.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 77 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/cave/anim.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 106 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/cave/terrain.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 84 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/grass/terrain.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 98 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/indoor/terrain.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 77 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/longgrass/anim.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 133 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/longgrass/terrain.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 98 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/mountain/anim.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 47 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/pond/anim.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 36 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/pond/terrain.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 75 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/sand/terrain.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 83 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/underwater/anim.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 26 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/underwater/terrain.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 85 -Wnum_tiles\n\n$(BATTLETERRAINGFXDIR)/water/terrain.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 81 -Wnum_tiles\n\n$(BERRYPOUCHGFXDIR)/background.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 52 -Wnum_tiles\n\n$(HALLOFFAMEGFXDIR)/hall_of_fame.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 29 -Wnum_tiles\n\n$(TILESETGFXDIR)/primary/general/anim/water_current_landwatersedge/7.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 47 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/altering_cave/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 391 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/berry_forest/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 395 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/digletts_cave/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 398 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/dotted_hole/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 317 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/icefall_cave/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 399 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/lost_cave/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 404 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/monean_chamber/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 326 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/mt_ember/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 355 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/mt_moon/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 364 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/pokemon_mansion/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 388 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/pokemon_tower/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 290 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/power_plant/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 368 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/rock_tunnel/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 407 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/rocket_hideout/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 194 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/rocket_warehouse/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 234 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/safari_zone/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 330 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/seafoam_islands/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 408 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/silph_co/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 355 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/victory_road/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 375 -Wnum_tiles\n\n$(MAPPREVIEWGFXDIR)/viridian_forest/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 389 -Wnum_tiles\n\n$(NAMINGGFXDIR)/cursor.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 5 -Wnum_tiles\n\n$(NAMINGGFXDIR)/cursor_squished.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 5 -Wnum_tiles\n\n$(NAMINGGFXDIR)/cursor_filled.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 5 -Wnum_tiles\n\n\n$(WALLPAPERGFXDIR)/beach/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 60 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/cave/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 61 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/city/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 40 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/crag/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 54 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/desert/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 52 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/forest/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 53 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/pokecenter/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 57 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/river/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 63 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/savanna/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 45 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/seafloor/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 53 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/simple/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 25 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/sky/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 52 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/snow/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 51 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/stars/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 37 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/tiles/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 31 -Wnum_tiles\n\n$(WALLPAPERGFXDIR)/volcano/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 57 -Wnum_tiles\n"
  },
  {
    "path": "include/AgbRfu_LinkManager.h",
    "content": "#ifndef GUARD_LINKMANAGER_H\n#define GUARD_LINKMANAGER_H\n\n//-----------------------------------------------------------------\n// Constant definition\n//-----------------------------------------------------------------\n\n// Link Manager operation mode (specified by u8 parent_child argument of rfu_LMAN_establishConnection)\n//#define MODE_CHILD                                    0        // Start Link Manager in CHILD mode\n//#define MODE_PARENT                                    1        // Start Link Manager in PARENT mode\n//Note: This value uses the item defined by AgbRFU_LL.h.\n#define MODE_P_C_SWITCH 2        // Start Link Manager in parent-child switching mode.\n\n// Value of lman.p_c_switch_flag\n#define PCSWITCH_1ST_SC_START   0x01\n#define PCSWITCH_1ST_SC         0x02\n#define PCSWITCH_2ND_SP_START   0x03\n#define PCSWITCH_2ND_SP         0x04\n#define PCSWITCH_3RD_SC_START   0x05\n#define PCSWITCH_3RD_SC         0x06\n#define PCSWITCH_CP             0x07\n#define PCSWITCH_SC_LOCK        0x08\n#define PCSWITCH_FORCE_SP_START 0x09\n\n// Period for which parent-child switching search specified\n#define PCSWITCH_ALL_PERIOD                                             180             // Entire cycle 180 frames\n#define PCSWITCH_SP_PERIOD                                               40             // Child period 40 frames\n\n// Error code returned by Link Manager API (rfu_LMAN_...return value of function)\n#define LMAN_ERROR_MANAGER_BUSY                                1    // Link Manager is already running.\n#define LMAN_ERROR_AGB_CLK_SLAVE                            2    // AGB is clock slave so link manager cannot run.\n#define LMAN_ERROR_PID_NOT_FOUND                            3    // Parent device information of the specified PID does not exist in rfuLinkStatus->partner[0-3].\n#define LMAN_ERROR_ILLEGAL_PARAMETER                        4    // Specified argument is unusual.\n#define LMAN_ERROR_NOW_LINK_RECOVERY                        5    // New settings were ignored because link recovery was under way when current link recovery was ON and new settings turned link recovery OFF.\n#define LMAN_ERROR_NOW_COMMUNICATION                        6    // New settings were ignored because currently communicating with NI.\n#define LMAN_ERROR_NOW_SEARCH_PARENT                        7        // Parent search currently under way, so ignore new setting.\n\n// Details of messages and the related parameters returned by the u8 msg, u8 param_count, and lman.param[0-1] arguments of the LMAN callback generated by the operation of the Link Manager.\n//        msg name                                          msg No.    param qty    param[0]                    param[1]        Description\n#define LMAN_MSG_INITIALIZE_COMPLETED                    0x00    //    0            -                            -            Generated when RFU reset and initial settings are completed\n#define LMAN_MSG_NEW_CHILD_CONNECT_DETECTED              0x10    //    1        Bit indicating slot                -            Generated when new child device connection was detected at RFU level.\n//          with detected connection\n#define LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED              0x11    //    1        Bit indicating slot                -            Generated when game identification information from child device connected at RFU level is received and accepted (game serial numbers match).\n//          where connection was accepted\n#define LMAN_MSG_NEW_CHILD_CONNECT_REJECTED              0x12    //    1        Bit indicating slot                -            Generated when the connection from the child device connected at RFU level is rejected (game identification information reception failed or game serial numbers do not match).\n//          where connection was rejected\n#define LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED             0x13    //    0            -                            -            Generated when SearchChild operation time expires.\n#define LMAN_MSG_END_WAIT_CHILD_NAME                     0x14    //    0            -                            -            Generated when reception of game identification information from all child devices completes after the SearchChild operation time expires.\n#define LMAN_MSG_PARENT_FOUND                            0x20    //    1        Bit indicating                     -            Generated when valid (game serial numbers match) parent devices are found during SearchParent.\n//          rfuLinkStatus->partner[x] index number storing the valid parent devices (game serial number matches) from among the discovered parent devices.\n#define LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED            0x21    //    0            -                            -            Generated when SearchParent time expires.\n#define LMAN_MSG_CONNECT_PARENT_SUCCESSED                0x22    //    1        Connected slot number            -            Generated when connection with parent device at RFU level succeeds.\n#define LMAN_MSG_CONNECT_PARENT_FAILED                   0x23    //    1        Connection failure reason        -            Generated when connection with parent device at RFU level fails.\n#define LMAN_MSG_CHILD_NAME_SEND_COMPLETED               0x24    //    0            -                            -            Generated when transmission of the child's game identification information to the parent device succeeds after connection with parent device at RFU level succeeds.\n#define LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED 0x25    //    0        -                            -            Generated when transmission of the child's game identification information to the parent device fails after connection with parent device at RFU level succeeds.\n#define LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED     0x30    //    1        Bit indicating slot                -            Generated when a link cut is detected and that slot disconnects. (Generated only when link recovery is OFF.)\n//         that was disconnected and where link cut was detected but link recover not attempted\n#define LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY   0x31    //    1        Bit indicating slot                -            Generated when a link cut is detected and the link recovery process starts. (Generated only when link recovery is ON.)\n//         where link cut was detected and link recovery was started\n#define LMAN_MSG_LINK_RECOVERY_SUCCESSED                 0x32    //    1        Bit indicating slot                -            Generated when link recovery succeeds. (Generated only when link recovery is ON.)\n//        where link recovery succeeded\n#define LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED   0x33    //    1        Bit indicating slot                -            Generated when link recovery fails and that slot disconnects. (Generated only when link recovery is ON.)\n//        where link recovery failed and that disconnected\n#define LMAN_MSG_LINK_DISCONNECTED_BY_USER               0x40    //    1    Generated on disconnection by execution of rfu_REQ_disconnect by disconnected user.\n//         Slot indicated in bits    *Note: If rfu_REQ_disconnect is used for disconnection during link recovery in the child device, the link recovery is also suspended, but the only message returned is DISCONNECTED_BY_USER.\n#define LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE                  0x41    //    0            -                            -            Generated when the AGB-RFU clock switches to AGB clock slave after a successful connection or link recovery in the child device. (This message is not generated when the AGB switches to a clock slave when an MSC callback completes.)\n#define LMAN_MSG_CHANGE_AGB_CLOCK_MASTER                 0x45    //    0            -                            -            Generated when the AGB-RFU intercommunication clock is switched to the AGB clock master in the child device.\n#define LMAN_MSG_RFU_POWER_DOWN                          0x42    //    0            -                            -            Generated when the RFU enters power conservation mode with rfu_LMAN_powerDownRFU.\n#define LMAN_MSG_MANAGER_STOPPED                         0x43    //    0            -                            -            Generated when the Link Manager is halted by rfu_LMAN_stopLMAN(0). (This message is not generated during SearchChild, SearchParent, ConnectParent, and LinkRecovery. A message (-PERIOD_EXPIRED, -SUCCESSED, -FAILED) corresponding to the operation completion is returned.)\n#define LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET    0x44    //    0            -                            -            Generates when the Link Manager is forcibly halted by rfu_LMAN_stopLMAN(1) and RFU is reset.\n\n#define LMAN_MSG_RECV_DATA_REQ_COMPLETED                 0x50    //    0            -                            -            Generated when the execution of rfu_REQ_recvData completes. (This message is not notification of data reception from a RFU.)\n\n#define LMAN_MSG_REQ_API_ERROR                           0xf0    //    2        REQ_commandID                    REQ_result     REQ-API resulted in error. This message is also generated by an REQ-API executed by either the link manager or the user.\n#define LMAN_MSG_WATCH_DOG_TIMER_ERROR                   0xf1    //     0            -                            -            Generated when a MSC callback does not occur even after 6 seconds pass when the AGB is the clock slave.\n#define LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA      0xf2    //     0            -                            -            Generated when an automatic starting DMA, such as HDMA, is issued at the same time the RFU attempts to send notification and to return the AGB to the clock master while the AGB is the clock slave and the exchange of that information (REQ command) fails.\n#define LMAN_MSG_LMAN_API_ERROR_RETURN                   0xf3    //  1        Return error code                -            Generated when LMAN-API execution returns an error.\n#define LMAN_MSG_RFU_FATAL_ERROR                         0xff    //    0            -                            -            Generated when the Link Manager cannot recongize a RFU because of the execution of rfu_REQBN_softReset_and_checkID.\n\n\n// Value of lman.childClockSlave_flag\n#define RFU_CHILD_CLOCK_SLAVE_OFF     0        // The child device is not operating in AGB clock slave mode. (The child device is in this mode in cases such as when the child has not established a connection or during link recovery.)\n#define RFU_CHILD_CLOCK_SLAVE_ON      1        // The child device is operating in AGB clock slave mode. (Child automatically enters this mode when a connection is established.)\n#define RFU_CHILD_CLOCK_SLAVE_OFF_REQ 2        // The child device has requested that AGB clock slave mode be halted.\n\n// State of Link Manager (values of lman.state, lman.next_state)\n#define LMAN_STATE_READY                    0x00            // Waiting\n#define LMAN_STATE_SOFT_RESET_AND_CHECK_ID  0x01            // Requesting execution of rfu_REQBN_softResetAndCheckID (same as below)\n#define LMAN_STATE_RESET                    0x02            // rfu_REQ_reset\n#define LMAN_STATE_CONFIG_SYSTEM            0x03            // rfu_REQ_configSystem\n#define LMAN_STATE_CONFIG_GAME_DATA         0x04            // rfu_REQ_configGameData\n#define LMAN_STATE_START_SEARCH_CHILD       0x05            // rfu_REQ_startSearchChild\n#define LMAN_STATE_POLL_SEARCH_CHILD        0x06            // rfu_REQ_pollSearchChild\n#define LMAN_STATE_END_SEARCH_CHILD         0x07            // rfu_REQ_endSearchChild\n#define LMAN_STATE_WAIT_RECV_CHILD_NAME     0x08            // Awaiting reception of game name from connected child device.\n#define LMAN_STATE_START_SEARCH_PARENT      0x09            // rfu_REQ_startSearchParent\n#define LMAN_STATE_POLL_SEARCH_PARENT       0x0a            // rfu_REQ_pollSearchParent\n#define LMAN_STATE_END_SEARCH_PARENT        0x0b            // rfu_REQ_endSearchParent\n#define LMAN_STATE_START_CONNECT_PARENT     0x0c            // rfu_REQ_startConnectParent\n#define LMAN_STATE_POLL_CONNECT_PARENT      0x0d            // rfu_REQ_pollConnectParent\n#define LMAN_STATE_END_CONNECT_PARENT       0x0e            // rfu_REQ_endConnectParent\n#define LMAN_STATE_SEND_CHILD_NAME          0x0f            // Sending child game name.\n#define LMAN_STATE_START_LINK_RECOVERY      0x10            // rfu_REQ_CHILD_startConnectRecovery\n#define LMAN_STATE_POLL_LINK_RECOVERY       0x11            // rfu_REQ_CHILD_pollConnectRecovery\n#define LMAN_STATE_END_LINK_RECOVERY        0x12            // rfu_REQ_CHILD_endConnectRecovery\n#define LMAN_STATE_MS_CHANGE                0x13            // rfu_REQ_changeMasterSlave\n#define LMAN_STATE_WAIT_CLOCK_MASTER        0x14            // Waiting for AGB-RFU intercommunication clock to become AGB clock master.\n#define LMAN_STATE_STOP_MODE                0x15            // rfu_REQ_stopMode\n#define LMAN_STATE_BACK_STATE               0x16            // Following the completion of link-recovery processing, return the Link Manager state to the state present before link-recovery processing was initiated.\n#define LMAN_FORCED_STOP_AND_RFU_RESET      0x17            // Attempt to forcibly stop Link Manager using rfu_LMAN_stopLMAN(1).\n#define LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER 0x18            // Attempt to return to AGB clock master after child fails in sending game name.\n\n// Parameter group used in initial setting run of the link manager (rfu_LMAN_initializeRFU)\ntypedef struct InitializeParametersTag {\n    // rfu_REQ_configSystem argument\n    u8 maxMFrame;                            // Maximum number of times to re-transmit of RFU level\n    u8 MC_TimerCount;                        // MC_Timer count (x16.7ms)\n    u16 availSlot_flag;                        // Use RFU-API constant \"AVAIL_SLOT1-4\" to specify the maximum number of child devices (1 - 4) that can be connected to a parent device.\n\n    // rfu_REQB_configGameData argument\n    u8 mboot_flag;                            // Multiplayer boot flag\n    u16 serialNo;                            // Game serial number\n    u8 *gameName;                            // Game name\n    u8 *userName;                            // User name\n\n    // ON/OFF flag for parent fast search operation by child.\n    u8 fastSearchParent_flag;                // Flag indicating whether parent fast search operation to be performed by child.\n\n    // Link recovery settings\n    u8 linkRecovery_enable;                // Determines whether or not to execute the link recovery process when a link cut occurs\n    u16 linkRecovery_period;                // Time to spend on the link recovery process (x 16.7 ms)  Note: Runs for unlimited time when specifying 0.\n\n    // Setting for NI-type data transmit/receive period\n    u16 NI_failCounter_limit;                //  Limit for failCounter during NI type data transmit/receive (x 16.7 ms) Note: Runs for unlimited time when specifying 0.\n}INIT_PARAM;\n\n\n// Timer that counts with the V-Blank cycle\ntypedef struct VblankTimerTag {\n    u8 active;                                // Timer ON/OFF (bits 0 - 3 indicate ON/OFF for each connected slot)\n    u16 count_max;                            // Maximum count value (x16.7ms)\n    u16 count[RFU_CHILD_MAX];                // Current count value (x 16.7 ms) for each connected slot\n}VBL_TIMER;\n\ntypedef struct linkManagerTag\n{\n    /* 0x000 */ u8 acceptSlot_flag;\n    /* 0x001 */ u8 acceptCount;\n    /* 0x002 */ vu8 childClockSlave_flag;\n    /* 0x003 */ vu8 parentAck_flag;\n    /* 0x004 */ u8 state;\n    /* 0x005 */ u8 next_state;\n    /* 0x006 */ u8 parent_child;\n    /* 0x007 */ u8 pcswitch_flag;\n    /* 0x008 */ u8 RFU_powerOn_flag;\n    /* 0x009 */ u8 linkRecovery_enable;\n    /* 0x00a */ u8 linkRecovery_start_flag;\n    /* 0x00b */ u8 fastSearchParent_flag;\n    /* 0x00c */ u8 connectSlot_flag_old;\n    /* 0x00d */ u8 reserveDisconnectSlot_flag;\n    /* 0x00e */ u8 active;\n    /* 0x00f */ u8 msc_exe_flag;\n    /* 0x010 */ u8 child_slot;\n    /* 0x011 */ u8 state_bak[2];\n    /* 0x014 */ u16 param[2];\n    /* 0x018 */ u16 NI_failCounter_limit;\n    /* 0x01a */ u16 connect_period;\n    /* 0x01c */ u16 pcswitch_period_bak;\n    /* 0x01e */ u16 work;\n    /* 0x020 */ u16 *acceptable_serialNo_list;\n    /* 0x024 */ VBL_TIMER nameAcceptTimer;\n    /* 0x030 */ VBL_TIMER linkRecoveryTimer;\n    /* 0x03c */ INIT_PARAM *init_param;\n    /* 0x040 */ void (*LMAN_callback)(u8, u8);\n    /* 0x044 */ void (*MSC_callback)(u16);\n} LINK_MANAGER;\n\nextern struct linkManagerTag lman;\n\nu32 rfu_LMAN_REQBN_softReset_and_checkID(void);\nvoid rfu_LMAN_requestChangeAgbClockMaster(void);\nvoid rfu_LMAN_initializeRFU(INIT_PARAM *init_params);\nu8 rfu_LMAN_establishConnection(u8 parent_child, u16 connect_period, u16 name_accept_period, u16 *acceptable_serialNo_list);\nvoid rfu_LMAN_stopManager(bool8 forced_stop_and_RFU_reset_flag);\nvoid rfu_LMAN_setMSCCallback(void (*MSC_callback_p)(u16));\nvoid rfu_LMAN_REQ_sendData(bool8 clockChangeFlag);\nvoid rfu_LMAN_powerDownRFU(void);\nu8 rfu_LMAN_CHILD_connectParent(u16 parentId, u16 connect_period);\nu8 rfu_LMAN_setLinkRecovery(u8 enable_flag, u16 recovery_period);\nvoid rfu_LMAN_manager_entity(u32 rand);\nvoid rfu_LMAN_syncVBlank(void);\nu8 rfu_LMAN_initializeManager(void (*LMAN_callback_p)(u8, u8), void (*MSC_callback_p)(u16));\nvoid rfu_LMAN_forceChangeSP(void);\n\n#endif //GUARD_LINKMANAGER_H\n"
  },
  {
    "path": "include/bag.h",
    "content": "#ifndef GUARD_BAG_H\n#define GUARD_BAG_H\n\n#include \"menu_helpers.h\"\n\nvoid InitBagWindows(void);\nvoid BagPrintTextOnWindow(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx);\nvoid BagPrintTextOnWin1CenteredColor0(const u8 * str, u8 unused);\nvoid BagDrawDepositItemTextBox(void);\nu8 ShowBagWindow(u8 whichWindow, u8 nItems);\nvoid HideBagWindow(u8 whichWindow);\nu8 OpenBagWindow(u8 whichWindow);\nvoid CloseBagWindow(u8 whichWindow);\nu8 GetBagWindow(u8 whichWindow);\nvoid BagCreateYesNoMenuBottomRight(u8 taskId, const struct YesNoFuncTable * ptrs);\nvoid BagCreateYesNoMenuTopRight(u8 taskId, const struct YesNoFuncTable * ptrs);\nvoid BagPrintMoneyAmount(void);\nvoid BagDrawTextBoxOnWindow(u8 windowId);\n\n#endif //GUARD_BAG_H\n"
  },
  {
    "path": "include/battle.h",
    "content": "#ifndef GUARD_BATTLE_H\n#define GUARD_BATTLE_H\n\n#include <limits.h>\n#include \"global.h\"\n#include \"constants/battle.h\"\n#include \"constants/battle_script_commands.h\"\n#include \"battle_util.h\"\n#include \"battle_script_commands.h\"\n#include \"battle_main.h\"\n#include \"battle_ai_switch_items.h\"\n#include \"battle_gfx_sfx_util.h\"\n#include \"battle_util2.h\"\n#include \"battle_bg.h\"\n\n/*\n    Banks are a name given to what could be called a 'battlerId' or 'monControllerId'.\n    Each bank has a value consisting of two bits.\n    0x1 bit is responsible for the side, 0 = player's side, 1 = opponent's side.\n    0x2 bit is responsible for the id of sent out pokemon. 0 means it's the first sent out pokemon, 1 it's the second one. (Triple battle didn't exist at the time yet.)\n*/\n\n#define GET_BATTLER_POSITION(battler)((gBattlerPositions[battler]))\n#define GET_BATTLER_SIDE(battler)((GetBattlerPosition(battler) & BIT_SIDE))\n#define GET_BATTLER_SIDE2(battler)((GET_BATTLER_POSITION(battler) & BIT_SIDE))\n\n// Used to exclude moves learned temporarily by Transform or Mimic\n#define MOVE_IS_PERMANENT(battler, moveSlot)                        \\\n   (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)           \\\n && !(gDisableStructs[battler].mimickedMoves & gBitTable[moveSlot]))\n\n// Battle Actions\n// These determine what each battler will do in a turn\n#define B_ACTION_USE_MOVE                  0\n#define B_ACTION_USE_ITEM                  1\n#define B_ACTION_SWITCH                    2\n#define B_ACTION_RUN                       3\n#define B_ACTION_SAFARI_WATCH_CAREFULLY    4\n#define B_ACTION_SAFARI_BALL               5\n#define B_ACTION_SAFARI_BAIT               6\n#define B_ACTION_SAFARI_GO_NEAR            7\n#define B_ACTION_SAFARI_RUN                8\n#define B_ACTION_OLDMAN_THROW              9\n#define B_ACTION_EXEC_SCRIPT               10\n#define B_ACTION_TRY_FINISH                11\n#define B_ACTION_FINISHED                  12\n#define B_ACTION_CANCEL_PARTNER            12 // when choosing an action\n#define B_ACTION_NOTHING_FAINTED           13 // when choosing an action\n#define B_ACTION_NONE                      0xFF\n\n#define MAX_TRAINER_ITEMS 4\n\nenum {\n    BATTLER_AFFINE_NORMAL,\n    BATTLER_AFFINE_EMERGE,\n    BATTLER_AFFINE_RETURN,\n};\n\n#define MOVE_TARGET_SELECTED            0\n#define MOVE_TARGET_DEPENDS             (1 << 0)\n#define MOVE_TARGET_USER_OR_SELECTED    (1 << 1)\n#define MOVE_TARGET_RANDOM              (1 << 2)\n#define MOVE_TARGET_BOTH                (1 << 3)\n#define MOVE_TARGET_USER                (1 << 4)\n#define MOVE_TARGET_FOES_AND_ALLY       (1 << 5)\n#define MOVE_TARGET_OPPONENTS_FIELD     (1 << 6)\n\n// For the second argument of GetMoveTarget, when no target override is needed\n#define NO_TARGET_OVERRIDE 0\n\nstruct TrainerMonNoItemDefaultMoves\n{\n    u16 iv;\n    u8 lvl;\n    u16 species;\n};\n\nstruct TrainerMonItemDefaultMoves\n{\n    u16 iv;\n    u8 lvl;\n    u16 species;\n    u16 heldItem;\n};\n\nstruct TrainerMonNoItemCustomMoves\n{\n    u16 iv;\n    u8 lvl;\n    u16 species;\n    u16 moves[MAX_MON_MOVES];\n};\n\nstruct TrainerMonItemCustomMoves\n{\n    u16 iv;\n    u8 lvl;\n    u16 species;\n    u16 heldItem;\n    u8 abilityNum;\n    u16 moves[MAX_MON_MOVES];\n};\n\nstruct TrainerMonItemCustomMovesEVs\n{\n    u16 iv;\n    u8 lvl;\n    u8 evs[NUM_STATS];\n    u8 nature;\n    u16 species;\n    u16 heldItem;\n    u8 abilityNum;\n    u16 moves[MAX_MON_MOVES];\n};\n\n#define NO_ITEM_DEFAULT_MOVES(party) { .NoItemDefaultMoves = party }, .partySize = ARRAY_COUNT(party), .partyFlags = 0\n#define NO_ITEM_CUSTOM_MOVES(party) { .NoItemCustomMoves = party }, .partySize = ARRAY_COUNT(party), .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET\n#define ITEM_DEFAULT_MOVES(party) { .ItemDefaultMoves = party }, .partySize = ARRAY_COUNT(party), .partyFlags = F_TRAINER_PARTY_HELD_ITEM\n#define ITEM_CUSTOM_MOVES(party) { .ItemCustomMoves = party }, .partySize = ARRAY_COUNT(party), .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM\n#define CUSTOM_MOVES_EVS(party) { .ItemCustomMovesEVs = party}, .partySize = ARRAY_COUNT(party), .partyFlags = F_TRAINER_PARTY_EVS\n\nunion TrainerMonPtr\n{\n    const struct TrainerMonNoItemDefaultMoves *NoItemDefaultMoves;\n    const struct TrainerMonNoItemCustomMoves *NoItemCustomMoves;\n    const struct TrainerMonItemDefaultMoves *ItemDefaultMoves;\n    const struct TrainerMonItemCustomMoves *ItemCustomMoves;\n    const struct TrainerMonItemCustomMovesEVs *ItemCustomMovesEVs;\n};\n\nstruct Trainer\n{\n    /*0x00*/ u8 partyFlags;\n    /*0x01*/ u8 trainerClass;\n    /*0x02*/ u8 encounterMusic_gender; // last bit is gender\n    /*0x03*/ u8 trainerPic;\n    /*0x04*/ u8 trainerName[12];\n    /*0x10*/ u16 items[MAX_TRAINER_ITEMS];\n    /*0x18*/ bool8 doubleBattle;\n    /*0x1C*/ u32 aiFlags;\n    /*0x20*/ u8 partySize;\n    /*0x24*/ const union TrainerMonPtr party;\n};\n\nextern const struct Trainer gTrainers[];\nextern const struct Trainer gMasterTrainers[];\n\nstruct ResourceFlags\n{\n    u32 flags[4];\n};\n\n#define RESOURCE_FLAG_FLASH_FIRE 1\n\nstruct DisableStruct\n{\n    /*0x00*/ u32 transformedMonPersonality;\n    /*0x04*/ u16 disabledMove;\n    /*0x06*/ u16 encoredMove;\n    /*0x08*/ u8 protectUses;\n    /*0x09*/ u8 stockpileCounter;\n    /*0x0A*/ u8 substituteHP;\n    /*0x0B*/ u8 disableTimer : 4;\n    /*0x0B*/ u8 disableTimerStartValue : 4;\n    /*0x0C*/ u8 encoredMovePos;\n    /*0x0D*/ u8 unkD;\n    /*0x0E*/ u8 encoreTimer : 4;\n    /*0x0E*/ u8 encoreTimerStartValue : 4;\n    /*0x0F*/ u8 perishSongTimer : 4;\n    /*0x0F*/ u8 perishSongTimerStartValue : 4;\n    /*0x10*/ u8 furyCutterCounter;\n    /*0x11*/ u8 rolloutTimer : 4;\n    /*0x11*/ u8 rolloutTimerStartValue : 4;\n    /*0x12*/ u8 chargeTimer : 4;\n    /*0x12*/ u8 chargeTimerStartValue : 4;\n    /*0x13*/ u8 tauntTimer:4;\n    /*0x13*/ u8 tauntTimer2:4;\n    /*0x14*/ u8 battlerPreventingEscape;\n    /*0x15*/ u8 battlerWithSureHit;\n    /*0x16*/ u8 isFirstTurn;\n    /*0x17*/ u8 unk17;\n    /*0x18*/ u8 truantCounter : 1;\n    /*0x18*/ u8 truantSwitchInHack : 1; // Unused here, but used in pokeemerald\n    /*0x18*/ u8 unk18_a_2 : 2;\n    /*0x18*/ u8 mimickedMoves : 4;\n    /*0x19*/ u8 rechargeTimer;\n    /*0x1A*/ u8 unk1A[2];\n};\n\nextern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT];\n\nstruct ProtectStruct\n{\n    /* field_0 */\n    u32 protected:1;\n    u32 endured:1;\n    u32 noValidMoves:1;\n    u32 helpingHand:1;\n    u32 bounceMove:1;\n    u32 stealMove:1;\n    u32 flag0Unknown:1;\n    u32 prlzImmobility:1;\n    /* field_1 */\n    u32 confusionSelfDmg:1;\n    u32 targetNotAffected:1;\n    u32 chargingTurn:1;\n    u32 fleeType:2; // for RunAway and Smoke Ball\n    u32 usedImprisonedMove:1;\n    u32 loveImmobility:1;\n    u32 usedDisabledMove:1;\n    /* field_2 */\n    u32 usedTauntedMove:1;      // 0x1\n    u32 flag2Unknown:1;         // 0x2\n    u32 flinchImmobility:1;     // 0x4\n    u32 notFirstStrike:1;       // 0x8\n    u32 flag_x10 : 1;           // 0x10\n    u32 flag_x20 : 1;           // 0x20\n    u32 flag_x40 : 1;           // 0x40\n    u32 flag_x80 : 1;           // 0x80\n    u32 field3 : 8;\n\n    u32 physicalDmg;\n    u32 specialDmg;\n    u8 physicalBattlerId;\n    u8 specialBattlerId;\n    u16 fieldE;\n};\n\nextern struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT];\n\nstruct SpecialStatus\n{\n    u8 statLowered:1;             // 0x1\n    u8 lightningRodRedirected:1;  // 0x2\n    u8 restoredBattlerSprite:1;   // 0x4\n    u8 intimidatedMon:1;          // 0x8\n    u8 traced:1;                  // 0x10\n    u8 ppNotAffectedByPressure:1;\n    u8 faintedHasReplacement:1;\n    u8 focusBanded:1;\n    u8 field1[3];\n    s32 dmg;\n    s32 physicalDmg;\n    s32 specialDmg;\n    u8 physicalBattlerId;\n    u8 specialBattlerId;\n    u8 field12;\n    u8 field13;\n};\n\nextern struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT];\n\nstruct SideTimer\n{\n    /*0x00*/ u8 reflectTimer;\n    /*0x01*/ u8 reflectBattlerId;\n    /*0x02*/ u8 lightscreenTimer;\n    /*0x03*/ u8 lightscreenBattlerId;\n    /*0x04*/ u8 mistTimer;\n    /*0x05*/ u8 mistBattlerId;\n    /*0x06*/ u8 safeguardTimer;\n    /*0x07*/ u8 safeguardBattlerId;\n    /*0x08*/ u8 followmeTimer;\n    /*0x09*/ u8 followmeTarget;\n    /*0x0A*/ u8 spikesAmount;\n    /*0x0B*/ u8 fieldB;\n};\n\nextern struct SideTimer gSideTimers[];\n\nstruct WishFutureKnock\n{\n    u8 futureSightCounter[MAX_BATTLERS_COUNT];\n    u8 futureSightAttacker[MAX_BATTLERS_COUNT];\n    s32 futureSightDmg[MAX_BATTLERS_COUNT];\n    u16 futureSightMove[MAX_BATTLERS_COUNT];\n    u8 wishCounter[MAX_BATTLERS_COUNT];\n    u8 wishMonId[MAX_BATTLERS_COUNT];\n    u8 weatherDuration;\n    u8 knockedOffMons[2];\n};\n\nextern struct WishFutureKnock gWishFutureKnock;\n\nstruct AI_ThinkingStruct\n{\n    u8 aiState;\n    u8 movesetIndex;\n    u16 moveConsidered;\n    s8 score[4];\n    u32 funcResult;\n    u32 aiFlags;\n    u8 aiAction;\n    u8 aiLogicId;\n    u8 filler12[6];\n    u8 simulatedRNG[4];\n};\n\nextern u8 gActiveBattler;\nextern u8 gBattlerTarget;\nextern u8 gAbsentBattlerFlags;\n\nextern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT];\n\nstruct UsedMoves\n{\n    u16 moves[MAX_BATTLERS_COUNT];\n    u16 unknown[MAX_BATTLERS_COUNT];\n};\n\nstruct BattleHistory\n{\n    /*0x00*/ u16 usedMoves[2][8]; // 0xFFFF means move not used (confuse self hit, etc)\n    /*0x20*/ u8 abilities[MAX_BATTLERS_COUNT / 2];\n    /*0x22*/ u8 itemEffects[MAX_BATTLERS_COUNT / 2];\n    /*0x24*/ u16 trainerItems[MAX_BATTLERS_COUNT];\n    /*0x2C*/ u8 itemsNo;\n};\n\nstruct BattleScriptsStack\n{\n    const u8 *ptr[8];\n    u8 size;\n};\n\nstruct BattleCallbacksStack\n{\n    void (*function[8])(void);\n    u8 size;\n};\n\nstruct StatsArray\n{\n    u16 stats[NUM_STATS];\n};\n\nstruct BattleResources\n{\n    struct SecretBaseRecord *secretBase;\n    struct ResourceFlags *flags;\n    struct BattleScriptsStack *battleScriptsStack;\n    struct BattleCallbacksStack *battleCallbackStack;\n    struct StatsArray *beforeLvlUp;\n    struct AI_ThinkingStruct *ai;\n    struct BattleHistory *battleHistory;\n    struct BattleScriptsStack *AI_ScriptsStack;\n};\n\nextern struct BattleResources *gBattleResources;\n\nstruct BattleResults\n{\n    u8 playerFaintCounter;    // 0x0\n    u8 opponentFaintCounter;  // 0x1\n    u8 playerSwitchesCounter; // 0x2\n    u8 numHealingItemsUsed;   // 0x3\n    u8 numRevivesUsed;        // 0x4\n    u8 playerMonWasDamaged:1; // 0x5\n    u8 usedMasterBall:1;      // 0x5\n    u8 caughtMonBall:4;       // 0x5\n    u8 shinyWildMon:1;        // 0x5\n    u8 unk5_7:1;              // 0x5\n    u16 playerMon1Species;    // 0x6\n    u8 playerMon1Name[11];    // 0x8\n    u8 battleTurnCounter;     // 0x13\n    u8 playerMon2Name[11];    // 0x14\n    u8 pokeblockThrows;       // 0x1F\n    u16 lastOpponentSpecies;  // 0x20\n    u16 lastUsedMovePlayer;   // 0x22\n    u16 lastUsedMoveOpponent; // 0x24\n    u16 playerMon2Species;    // 0x26\n    u16 caughtMonSpecies;     // 0x28\n    u8 caughtMonNick[10];     // 0x2A\n    u8 filler34[2];\n    u8 catchAttempts[11];     // 0x36\n};\n\nextern struct BattleResults gBattleResults;\n\nstruct LinkBattlerHeader\n{\n    u8 versionSignatureLo;\n    u8 versionSignatureHi;\n    u8 vsScreenHealthFlagsLo;\n    u8 vsScreenHealthFlagsHi;\n    struct BattleEnigmaBerry battleEnigmaBerry;\n};\n\nstruct BattleStruct\n{\n    u8 turnEffectsTracker;\n    u8 turnEffectsBattlerId;\n    u8 filler2; // unused\n    u8 turnCountersTracker;\n    u8 wrappedMove[MAX_BATTLERS_COUNT * 2]; // Leftover from Ruby's ewram access.\n    u8 moveTarget[MAX_BATTLERS_COUNT];\n    u8 expGetterMonId;\n    u8 field_11; // unused\n    u8 wildVictorySong;\n    u8 dynamicMoveType;\n    u8 wrappedBy[MAX_BATTLERS_COUNT];\n    u16 assistPossibleMoves[PARTY_SIZE * MAX_MON_MOVES]; // 6 mons, each of them knowing 4 moves\n    u8 focusPunchBattlerId;\n    u8 battlerPreventingSwitchout;\n    u8 moneyMultiplier;\n    u8 savedTurnActionNumber;\n    u8 switchInAbilitiesCounter;\n    u8 faintedActionsState;\n    u8 faintedActionsBattlerId;\n    // balign 2\n    u16 expValue;\n    u8 scriptPartyIdx; // for printing the nickname\n    u8 sentInPokes;\n    bool8 selectionScriptFinished[MAX_BATTLERS_COUNT];\n    u8 battlerPartyIndexes[MAX_BATTLERS_COUNT];\n    u8 monToSwitchIntoId[MAX_BATTLERS_COUNT];\n    u8 battlerPartyOrders[MAX_BATTLERS_COUNT][3];\n    u8 runTries;\n    u8 caughtMonNick[POKEMON_NAME_LENGTH + 1];\n    u8 field_78; // unused\n    u8 safariRockThrowCounter;\n    u8 safariBaitThrowCounter;\n    u8 safariEscapeFactor;\n    u8 safariCatchFactor;\n    u8 linkBattleVsSpriteId_V;\n    u8 linkBattleVsSpriteId_S;\n    u8 formToChangeInto;\n    u8 chosenMovePositions[MAX_BATTLERS_COUNT];\n    u8 stateIdAfterSelScript[MAX_BATTLERS_COUNT];\n    u8 field_88; // unused\n    u8 field_89; // unused\n    u8 field_8A; // unused\n    u8 playerPartyIdx;\n    u8 field_8C; // unused\n    u8 field_8D; // unused\n    u8 stringMoveType;\n    u8 expGetterBattlerId;\n    u8 field_90; // unused\n    u8 absentBattlerFlags;\n    u8 AI_monToSwitchIntoId[2];\n    u8 simulatedInputState[4];  // used by Oak/Old Man/Pokedude controllers\n    u8 lastTakenMove[MAX_BATTLERS_COUNT * 2 * 2]; // ask gamefreak why they declared it that way\n    u16 hpOnSwitchout[2];\n    u8 abilityPreventingSwitchout;\n    u8 hpScale;\n    u16 savedBattleTypeFlags;\n    void (*savedCallback)(void);\n    u8 synchronizeMoveEffect;\n    u8 multiplayerId;\n    u8 overworldWeatherDone;\n    u8 atkCancellerTracker;\n    u16 usedHeldItems[MAX_BATTLERS_COUNT];\n    u8 chosenItem[4]; // why is this an u8?\n    u8 AI_itemType[2];\n    u8 AI_itemFlags[2];\n    u16 choicedMove[MAX_BATTLERS_COUNT];\n    u16 changedItems[MAX_BATTLERS_COUNT];\n    u8 intimidateBattler;\n    u8 switchInItemsCounter;\n    u8 field_DA; // battle tower related\n    u8 turnSideTracker;\n    u8 fillerDC[0xDF-0xDC];\n    u8 givenExpMons;\n    u8 lastTakenMoveFrom[MAX_BATTLERS_COUNT * MAX_BATTLERS_COUNT * 2];\n    u16 castformPalette[MAX_BATTLERS_COUNT][16];\n    u8 wishPerishSongState;\n    u8 wishPerishSongBattlerId;\n    u8 lastAttackerToFaintOpponent;\n    // align 4\n    union {\n        struct LinkBattlerHeader linkBattlerHeader;\n        struct MultiBattlePokemonTx multiBattleMons[3];\n    } multiBuffer;\n    u8 padding_1E4[0x1C];\n}; // size == 0x200 bytes\n\nextern struct BattleStruct *gBattleStruct;\n\n#define F_DYNAMIC_TYPE_1 (1 << 6)\n#define F_DYNAMIC_TYPE_2 (1 << 7)\n#define DYNAMIC_TYPE_MASK (F_DYNAMIC_TYPE_1 - 1)\n\n#define GET_MOVE_TYPE(move, typeArg)                                  \\\n{                                                                     \\\n    if (gBattleStruct->dynamicMoveType)                               \\\n        typeArg = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; \\\n    else                                                              \\\n        typeArg = gBattleMoves[move].type;                            \\\n}\n\n#define IS_TYPE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY)\n#define IS_TYPE_SPECIAL(moveType)(moveType > TYPE_MYSTERY)\n\n#define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0))\n\n#define IS_BATTLER_OF_TYPE(battlerId, type)((gBattleMons[battlerId].type1 == type || gBattleMons[battlerId].type2 == type))\n#define SET_BATTLER_TYPE(battlerId, type)   \\\n{                                           \\\n    gBattleMons[battlerId].type1 = type;    \\\n    gBattleMons[battlerId].type2 = type;    \\\n}\n\n#define GET_STAT_BUFF_ID(n)((n & 0xF))              // first four bits 0x1, 0x2, 0x4, 0x8\n#define GET_STAT_BUFF_VALUE2(n)((n & 0xF0))\n#define GET_STAT_BUFF_VALUE(n)(((n >> 4) & 7))      // 0x10, 0x20, 0x40\n#define STAT_BUFF_NEGATIVE 0x80                     // 0x80, the sign bit\n\n#define SET_STAT_BUFF_VALUE(n)(((s8)(((s8)(n) << 4)) & 0xF0))\n\n#define SET_STATCHANGER(statId, stage, goesDown)(gBattleScripting.statChanger = (statId) + (stage << 4) + (goesDown << 7))\n\n// NOTE: The members of this struct have hard-coded offsets\n//       in include/constants/battle_script_commands.h\nstruct BattleScripting\n{\n    s32 painSplitHp;\n    s32 bideDmg;\n    u8 multihitString[6];\n    u8 dmgMultiplier;\n    u8 twoTurnsMoveStringId;\n    u8 animArg1;\n    u8 animArg2;\n    u16 tripleKickPower;\n    u8 moveendState;\n    u8 battlerWithAbility;\n    u8 multihitMoveEffect;\n    u8 battler;\n    u8 animTurn;\n    u8 animTargetsHit;\n    u8 statChanger;\n    bool8 statAnimPlayed;\n    u8 getexpState;\n    u8 battleStyle;\n    u8 drawlvlupboxState;\n    u8 learnMoveState;\n    u8 pursuitDoublesAttacker;\n    u8 reshowMainState;\n    u8 reshowHelperState;\n    u8 levelUpHP;\n};\n\nstruct BattleSpriteInfo\n{\n    /*0x0*/ u16 invisible : 1; // 0x1\n            u16 lowHpSong : 1; // 0x2\n            u16 behindSubstitute : 1; // 0x4\n            u16 flag_x8 : 1; // 0x8\n            u16 hpNumbersNoBars : 1; // 0x10\n    /*0x2*/ u16 transformSpecies;\n};\n\nstruct BattleAnimationInfo\n{\n    u16 animArg; // to fill up later\n    u8 field_2;\n    u8 field_3;\n    u8 field_4;\n    u8 field_5;\n    u8 field_6;\n    u8 field_7;\n    u8 ballThrowCaseId;\n    u8 introAnimActive:1;\n    u8 wildMonInvisible:1;\n    u8 field_9_x1C:3;\n    u8 field_9_x20:1;\n    u8 field_9_x40:1;\n    u8 field_9_x80:1;\n    u8 numBallParticles;\n    u8 field_B;\n    s16 ballSubpx;\n    u8 field_E;\n    u8 field_F;\n};\n\nstruct BattleHealthboxInfo\n{\n    u8 partyStatusSummaryShown : 1; // x1\n    u8 healthboxIsBouncing : 1; // x2\n    u8 battlerIsBouncing : 1; // x4\n    u8 ballAnimActive : 1; // 0x8\n    u8 statusAnimActive : 1; // x10\n    u8 animFromTableActive : 1; // x20\n    u8 specialAnimActive : 1; // x40\n    u8 triedShinyMonAnim : 1; // x80\n    u8 finishedShinyMonAnim : 1; // x1\n    u8 opponentDrawPartyStatusSummaryDelay : 5; // x2\n    u8 healthboxBounceSpriteId;\n    u8 battlerBounceSpriteId;\n    u8 animationState;\n    u8 partyStatusDelayTimer;\n    u8 matrixNum;\n    u8 shadowSpriteId;\n    u8 soundTimer;\n    u8 introEndDelay;\n};\n\nstruct BattleBarInfo\n{\n    u8 healthboxSpriteId;\n    s32 maxValue;\n    s32 oldValue;\n    s32 receivedValue; // if positive/negative, fills the bar to the left/right respectively\n    s32 currValue;\n};\n\nstruct BattleSpriteData\n{\n    struct BattleSpriteInfo *battlerData;\n    struct BattleHealthboxInfo *healthBoxesData;\n    struct BattleAnimationInfo *animationData;\n    struct BattleBarInfo *battleBars;\n};\n\nextern struct BattleSpriteData *gBattleSpritesDataPtr;\n\n#define BATTLE_BUFFER_LINK_SIZE 0x1000\n\nextern u8 *gLinkBattleSendBuffer;\nextern u8 *gLinkBattleRecvBuffer;\n\n// Move this somewhere else\n\n#include \"sprite.h\"\n\nstruct MonSpritesGfx\n{\n    void *firstDecompressed; // ptr to the decompressed sprite of the first pokemon\n    void *sprites[MAX_BATTLERS_COUNT];\n    struct SpriteTemplate templates[MAX_BATTLERS_COUNT];\n    struct SpriteFrameImage images[MAX_BATTLERS_COUNT][4];\n    u8 field_F4[0x80]; // unused\n    u8 *barFontGfx;\n    void *field_178; // freed but never allocated\n    u16 *multiUseBuffer;\n};\n\nstruct PokedudeBattlerState\n{\n    u8 action_idx;\n    u8 move_idx;\n    u8 timer;\n    u8 msg_idx;\n    u8 saved_bg0y;\n};\n\nextern u16 gBattle_BG0_X;\nextern u16 gBattle_BG0_Y;\nextern u16 gBattle_BG1_X;\nextern u16 gBattle_BG1_Y;\nextern u16 gBattle_BG2_X;\nextern u16 gBattle_BG2_Y;\nextern u16 gBattle_BG3_X;\nextern u16 gBattle_BG3_Y;\nextern u16 gBattle_WIN0H;\nextern u16 gBattle_WIN0V;\nextern u16 gBattle_WIN1H;\nextern u16 gBattle_WIN1V;\nextern struct BattleSpritesGfx *gMonSpritesGfx;\nextern u8 gBattleOutcome;\nextern u16 gLastUsedItem;\nextern u32 gBattleTypeFlags;\nextern struct MonSpritesGfx *gMonSpritesGfxPtr;\nextern u16 gTrainerBattleOpponent_A;\nextern u16 gMoveToLearn;\nextern u16 gBattleMovePower;\nextern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT];\nextern u16 gCurrentMove;\nextern u16 gChosenMove;\nextern u16 gCalledMove;\nextern u8 gCritMultiplier;\nextern u16 gBattleWeather;\nextern u8 gLastUsedAbility;\nextern u8 gBattlerInMenuId;\nextern u8 gPotentialItemEffectBattler;\nextern u8 gBattlersCount;\nextern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT];\nextern s32 gBattleMoveDamage;\nextern u16 gIntroSlideFlags;\nextern u32 gTransformedPersonalities[MAX_BATTLERS_COUNT];\nextern u8 gBattlerPositions[MAX_BATTLERS_COUNT];\nextern u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT];\nextern u8 gBattleOutcome;\nextern u8 gBattleMonForms[MAX_BATTLERS_COUNT];\nextern void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void);\nextern u32 gBattleControllerExecFlags;\nextern u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200];\nextern u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200];\nextern u8 gActionSelectionCursor[MAX_BATTLERS_COUNT];\nextern void (*gPreBattleCallback1)(void);\nextern bool8 gDoingBattleAnim;\nextern struct PokedudeBattlerState *gPokedudeBattlerStates[MAX_BATTLERS_COUNT];\nextern u8 *gBattleAnimBgTileBuffer;\nextern u8 *gBattleAnimBgTilemapBuffer;\nextern void (*gBattleMainFunc)(void);\nextern u8 gMoveSelectionCursor[MAX_BATTLERS_COUNT];\nextern u32 gUnusedFirstBattleVar1;\nextern u8 gUnusedFirstBattleVar2;\nextern u8 gBattlerAttacker;\nextern u8 gEffectBattler;\nextern u8 gMultiHitCounter;\nextern struct BattleScripting gBattleScripting;\nextern u8 gBattlerFainted;\nextern u32 gStatuses3[MAX_BATTLERS_COUNT];\nextern u8 gSentPokesToOpponent[2];\nextern const u8 *gBattlescriptCurrInstr;\nextern const u8 *gSelectionBattleScripts[MAX_BATTLERS_COUNT];\nextern u16 gLastMoves[MAX_BATTLERS_COUNT];\nextern u8 gBattlerByTurnOrder[MAX_BATTLERS_COUNT];\nextern u8 gBattleCommunication[BATTLE_COMMUNICATION_ENTRIES_COUNT];\nextern u16 gSideStatuses[2];\nextern u32 gHitMarker;\nextern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT];\nextern u8 gMoveResultFlags;\nextern s32 gTakenDmg[MAX_BATTLERS_COUNT];\nextern u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT];\nextern u8 gCurrentActionFuncId;\nextern u8 gCurrMovePos;\nextern u8 gChosenMovePos;\nextern u8 gBattleControllerData[MAX_BATTLERS_COUNT];\nextern u8 gBattlerStatusSummaryTaskId[MAX_BATTLERS_COUNT];\nextern u16 gDynamicBasePower;\nextern u16 gLastLandedMoves[MAX_BATTLERS_COUNT];\nextern u8 gLastHitBy[MAX_BATTLERS_COUNT];\nextern u8 gMultiUsePlayerCursor;\nextern u8 gNumberOfMovesToChoose;\nextern u16 gLastHitByType[MAX_BATTLERS_COUNT];\nextern s32 gHpDealt;\nextern u16 gPauseCounterBattle;\nextern u16 gPaydayMoney;\nextern u16 gLockedMoves[MAX_BATTLERS_COUNT];\nextern u8 gCurrentTurnActionNumber;\nextern u16 gExpShareExp;\nextern u8 gLeveledUpInBattle;\nextern u16 gLastResultingMoves[MAX_BATTLERS_COUNT];\nextern u16 gLastPrintedMoves[MAX_BATTLERS_COUNT];\nextern u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT];\nextern u8 gChosenActionByBattler[MAX_BATTLERS_COUNT];\nextern u8 gBattleTerrain;\nextern struct MultiBattlePokemonTx gMultiPartnerParty[3];\nextern u16 gRandomTurnNumber;\n\n#endif // GUARD_BATTLE_H\n"
  },
  {
    "path": "include/battle_ai_script_commands.h",
    "content": "#ifndef GUARD_BATTLE_AI_SCRIPT_COMMANDS_H\n#define GUARD_BATTLE_AI_SCRIPT_COMMANDS_H\n\n#include \"global.h\"\n\n// return values for BattleAI_ChooseMoveOrAction\n// 0 - 3 are move idx\n#define AI_CHOICE_FLEE 4\n#define AI_CHOICE_WATCH 5\n\nvoid BattleAI_HandleItemUseBeforeAISetup(void);\nvoid BattleAI_SetupAIData(void);\nu8 BattleAI_ChooseMoveOrAction(void);\nvoid ClearBankMoveHistory(u8 bank);\nvoid RecordAbilityBattle(u8 bank, u8 abilityId);\nvoid ClearBankAbilityHistory(u8 bank);\nvoid RecordItemEffectBattle(u8 bank, u8 itemEffect);\nvoid ClearBankItemEffectHistory(u8 bank);\nu8 BattleAI_ChooseMoveOrAction(void);\n\n#endif // GUARD_BATTLE_AI_SCRIPT_COMMANDS_H\n"
  },
  {
    "path": "include/battle_ai_switch_items.h",
    "content": "#ifndef GUARD_BATTLE_AI_SWITCH_ITEMS_H\n#define GUARD_BATTLE_AI_SWITCH_ITEMS_H\n\n#include \"global.h\"\n\nenum {\n    AI_ITEM_FULL_RESTORE = 1,\n    AI_ITEM_HEAL_HP,\n    AI_ITEM_CURE_CONDITION,\n    AI_ITEM_X_STAT,\n    AI_ITEM_GUARD_SPECS,\n    AI_ITEM_NOT_RECOGNIZABLE\n};\n\nenum {\n    AI_HEAL_CONFUSION,\n    AI_HEAL_PARALYSIS,\n    AI_HEAL_FREEZE,\n    AI_HEAL_BURN,\n    AI_HEAL_POISON,\n    AI_HEAL_SLEEP,\n};\n\nvoid AI_TrySwitchOrUseItem(void);\nu8 GetMostSuitableMonToSwitchInto(void);\n\n#endif // GUARD_BATTLE_AI_SWITCH_ITEMS_H\n"
  },
  {
    "path": "include/battle_anim.h",
    "content": "#ifndef GUARD_BATTLE_ANIM_H\n#define GUARD_BATTLE_ANIM_H\n\n#include \"battle.h\"\n#include \"data.h\"\n#include \"task.h\"\n#include \"constants/battle_anim.h\"\n\nenum\n{\n    BG_ANIM_SCREEN_SIZE,\n    BG_ANIM_AREA_OVERFLOW_MODE,\n    BG_ANIM_MOSAIC,\n    BG_ANIM_CHAR_BASE_BLOCK,\n    BG_ANIM_PRIORITY,\n    BG_ANIM_PALETTES_MODE,\n    BG_ANIM_SCREEN_BASE_BLOCK\n};\n\nenum\n{\n    BATTLER_COORD_X,\n    BATTLER_COORD_Y,\n    BATTLER_COORD_X_2,\n    BATTLER_COORD_Y_PIC_OFFSET,\n    BATTLER_COORD_Y_PIC_OFFSET_DEFAULT,\n};\n\nenum\n{\n    BATTLER_COORD_ATTR_HEIGHT,\n    BATTLER_COORD_ATTR_WIDTH,\n    BATTLER_COORD_ATTR_TOP,\n    BATTLER_COORD_ATTR_BOTTOM,\n    BATTLER_COORD_ATTR_LEFT,\n    BATTLER_COORD_ATTR_RIGHT,\n    BATTLER_COORD_ATTR_RAW_BOTTOM,\n};\n\n// battle_anim_status_effects.s\n#define STAT_ANIM_PLUS1  15\n#define STAT_ANIM_PLUS2  39\n#define STAT_ANIM_MINUS1 22\n#define STAT_ANIM_MINUS2 46\n#define STAT_ANIM_MULTIPLE_PLUS1 55\n#define STAT_ANIM_MULTIPLE_PLUS2 56\n#define STAT_ANIM_MULTIPLE_MINUS1 57\n#define STAT_ANIM_MULTIPLE_MINUS2 58\n\nstruct BattleAnimBgData\n{\n    u8 *bgTiles;\n    u16 *bgTilemap;\n    u8 paletteId;\n    u8 bgId;\n    u16 tilesOffset;\n    u16 unused;\n};\n\nstruct BattleAnimBackground\n{\n    const u32 *image;\n    const u32 *palette;\n    const u32 *tilemap;\n};\n\n#define ANIM_ARGS_COUNT 8\n\n// Linear Translation\n#define sTransl_Speed    data[0]\n#define sTransl_Duration data[0] // for Fast\n#define sTransl_InitX    data[1]\n#define sTransl_DestX    data[2]\n#define sTransl_InitY    data[3]\n#define sTransl_DestY    data[4]\n#define sTransl_ArcAmpl  data[5]\n\nextern void (*gAnimScriptCallback)(void);\nextern bool8 gAnimScriptActive;\nextern u8 gAnimVisualTaskCount;\nextern u8 gAnimSoundTaskCount;\nextern struct DisableStruct *gAnimDisableStructPtr;\nextern u16 gAnimMovePower;\nextern u8 gAnimFriendship;\nextern u16 gWeatherMoveAnim;\nextern s16 gBattleAnimArgs[ANIM_ARGS_COUNT];\nextern u8 gAnimMoveTurn;\nextern u8 gBattleAnimAttacker;\nextern u8 gBattleAnimTarget;\nextern u8 gBattlerSpriteIds[MAX_BATTLERS_COUNT];\nextern s32 gAnimMoveDmg;\nextern u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT];\nextern u8 gAnimCustomPanning;\n\nextern const struct OamData gOamData_AffineOff_ObjNormal_8x8;\nextern const struct OamData gOamData_AffineOff_ObjNormal_16x16;\nextern const struct OamData gOamData_AffineOff_ObjNormal_32x32;\nextern const struct OamData gOamData_AffineOff_ObjNormal_64x64;\nextern const struct OamData gOamData_AffineOff_ObjNormal_16x8;\nextern const struct OamData gOamData_AffineOff_ObjNormal_32x8;\nextern const struct OamData gOamData_AffineOff_ObjNormal_32x16;\nextern const struct OamData gOamData_AffineOff_ObjNormal_64x32;\nextern const struct OamData gOamData_AffineOff_ObjNormal_8x16;\nextern const struct OamData gOamData_AffineOff_ObjNormal_8x32;\nextern const struct OamData gOamData_AffineOff_ObjNormal_16x32;\nextern const struct OamData gOamData_AffineOff_ObjNormal_32x64;\nextern const struct OamData gOamData_AffineNormal_ObjNormal_8x8;\nextern const struct OamData gOamData_AffineNormal_ObjNormal_16x16;\nextern const struct OamData gOamData_AffineNormal_ObjNormal_32x32;\nextern const struct OamData gOamData_AffineNormal_ObjNormal_64x64;\nextern const struct OamData gOamData_AffineNormal_ObjNormal_16x8;\nextern const struct OamData gOamData_AffineNormal_ObjNormal_32x8;\nextern const struct OamData gOamData_AffineNormal_ObjNormal_32x16;\nextern const struct OamData gOamData_AffineNormal_ObjNormal_64x32;\nextern const struct OamData gOamData_AffineNormal_ObjNormal_8x16;\nextern const struct OamData gOamData_AffineNormal_ObjNormal_8x32;\nextern const struct OamData gOamData_AffineNormal_ObjNormal_16x32;\nextern const struct OamData gOamData_AffineNormal_ObjNormal_32x64;\nextern const struct OamData gOamData_AffineDouble_ObjNormal_8x8;\nextern const struct OamData gOamData_AffineDouble_ObjNormal_16x16;\nextern const struct OamData gOamData_AffineDouble_ObjNormal_32x32;\nextern const struct OamData gOamData_AffineDouble_ObjNormal_64x64;\nextern const struct OamData gOamData_AffineDouble_ObjNormal_16x8;\nextern const struct OamData gOamData_AffineDouble_ObjNormal_32x8;\nextern const struct OamData gOamData_AffineDouble_ObjNormal_32x16;\nextern const struct OamData gOamData_AffineDouble_ObjNormal_64x32;\nextern const struct OamData gOamData_AffineDouble_ObjNormal_8x16;\nextern const struct OamData gOamData_AffineDouble_ObjNormal_8x32;\nextern const struct OamData gOamData_AffineDouble_ObjNormal_16x32;\nextern const struct OamData gOamData_AffineDouble_ObjNormal_32x64;\nextern const struct OamData gOamData_AffineOff_ObjBlend_8x8;\nextern const struct OamData gOamData_AffineOff_ObjBlend_16x16;\nextern const struct OamData gOamData_AffineOff_ObjBlend_32x32;\nextern const struct OamData gOamData_AffineOff_ObjBlend_64x64;\nextern const struct OamData gOamData_AffineOff_ObjBlend_16x8;\nextern const struct OamData gOamData_AffineOff_ObjBlend_32x8;\nextern const struct OamData gOamData_AffineOff_ObjBlend_32x16;\nextern const struct OamData gOamData_AffineOff_ObjBlend_64x32;\nextern const struct OamData gOamData_AffineOff_ObjBlend_8x16;\nextern const struct OamData gOamData_AffineOff_ObjBlend_8x32;\nextern const struct OamData gOamData_AffineOff_ObjBlend_16x32;\nextern const struct OamData gOamData_AffineOff_ObjBlend_32x64;\nextern const struct OamData gOamData_AffineNormal_ObjBlend_8x8;\nextern const struct OamData gOamData_AffineNormal_ObjBlend_16x16;\nextern const struct OamData gOamData_AffineNormal_ObjBlend_32x32;\nextern const struct OamData gOamData_AffineNormal_ObjBlend_64x64;\nextern const struct OamData gOamData_AffineNormal_ObjBlend_16x8;\nextern const struct OamData gOamData_AffineNormal_ObjBlend_32x8;\nextern const struct OamData gOamData_AffineNormal_ObjBlend_32x16;\nextern const struct OamData gOamData_AffineNormal_ObjBlend_64x32;\nextern const struct OamData gOamData_AffineNormal_ObjBlend_8x16;\nextern const struct OamData gOamData_AffineNormal_ObjBlend_8x32;\nextern const struct OamData gOamData_AffineNormal_ObjBlend_16x32;\nextern const struct OamData gOamData_AffineNormal_ObjBlend_32x64;\nextern const struct OamData gOamData_AffineDouble_ObjBlend_8x8;\nextern const struct OamData gOamData_AffineDouble_ObjBlend_16x16;\nextern const struct OamData gOamData_AffineDouble_ObjBlend_32x32;\nextern const struct OamData gOamData_AffineDouble_ObjBlend_64x64;\nextern const struct OamData gOamData_AffineDouble_ObjBlend_16x8;\nextern const struct OamData gOamData_AffineDouble_ObjBlend_32x8;\nextern const struct OamData gOamData_AffineDouble_ObjBlend_32x16;\nextern const struct OamData gOamData_AffineDouble_ObjBlend_64x32;\nextern const struct OamData gOamData_AffineDouble_ObjBlend_8x16;\nextern const struct OamData gOamData_AffineDouble_ObjBlend_8x32;\nextern const struct OamData gOamData_AffineDouble_ObjBlend_16x32;\nextern const struct OamData gOamData_AffineDouble_ObjBlend_32x64;\nextern const struct MonCoords gCastformFrontSpriteCoords[];\nextern const struct CompressedSpriteSheet gBattleAnimPicTable[];\nextern const struct CompressedSpritePalette gBattleAnimPaletteTable[];\nextern const struct SpriteTemplate gFlashingHitSplatSpriteTemplate;\nextern const struct SpriteTemplate gBasicHitSplatSpriteTemplate;\nextern const struct SpriteTemplate gWaterHitSplatSpriteTemplate;\nextern const struct SpriteTemplate gWishStarSpriteTemplate;\nextern const struct SpriteTemplate gMiniTwinklingStarSpriteTemplate;\nextern const struct SpriteTemplate gThoughtBubbleSpriteTemplate;\nextern const union AffineAnimCmd *const gAffineAnims_Bite[];\nextern const union AffineAnimCmd *const gAffineAnims_Droplet[];\nextern const union AffineAnimCmd *const gGrowingRingAffineAnimTable[];\nextern const union AnimCmd *const gAnims_SmallBubblePair[];\nextern const union AnimCmd *const gAnims_BasicFire[];\nextern const union AnimCmd *const gAnims_WaterMudOrb[];\nextern const union AnimCmd *const gAnims_WaterBubble[];\nextern const union AnimCmd *const gMusicNotesAnimTable[];\nextern const u8 *const gBattleAnims_StatusConditions[];\nextern const u8 *const gBattleAnims_Moves[];\nextern const u16 gMovesWithQuietBGM[];\n\nvoid MoveBattlerSpriteToBG(u8 battlerId, u8);\nvoid ResetBattleAnimBg(u8);\nvoid ClearBattleAnimationVars(void);\nvoid DoMoveAnim(u16 move);\nvoid LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMoveAnim);\nvoid DestroyAnimSprite(struct Sprite *sprite);\nvoid DestroyAnimVisualTask(u8 taskId);\nvoid DestroyAnimSoundTask(u8 taskId);\nbool8 IsContest(void);\ns8 BattleAnimAdjustPanning(s8 pan);\ns8 BattleAnimAdjustPanning2(s8 pan);\ns16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan);\nbool8 IsBattlerSpriteVisible(u8 battlerId);\ns16 KeepPanInRange(s16 a, s32 oldPan);\nvoid RelocateBattleBgPal(u16 paletteNum, u16 *dest, s32 offset, u8 largeScreen);\nvoid SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value);\ns32 GetAnimBgAttribute(u8 bgId, u8 attributeId);\nvoid HandleIntroSlide(u8 terrain);\nvoid BattleIntroSlideEnd(u8 taskId);\nvoid CopyBattlerSpriteToBg(s32 bgId, u8 x, u8 y, u8 battlerPosition, u8 palno, u8 *tilesDest, u16 *tilemapDest, u16 tilesOffset);\nvoid SetSpriteNextToMonHead(u8 battler, struct Sprite* sprite);\nvoid TryShinyAnimation(u8 battler, struct Pokemon *mon);\nu8 ItemIdToBallId(u16 itemId);\nu8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId);\nu8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 battlerId, u32 arg2, u8 ballId);\nvoid DoLoadHealthboxPalsForLevelUp(u8 *, u8 *, u8 battlerId);\nvoid DoFreeHealthboxPalsForLevelUp(u8 batterId);\nvoid LaunchStatusAnimation(u8 battlerId, u8 statusAnimId);\nu8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType);\nu8 GetBattlerSpriteCoord2(u8 battlerId, u8 coordType);\nu8 GetBattlerSpriteDefault_Y(u8 battlerId);\nu8 GetSubstituteSpriteDefault_Y(u8 battlerId);\nu8 GetGhostSpriteDefault_Y(u8 battlerId);\nu8 GetBattlerYCoordWithElevation(u8 battlerId);\nu8 GetAnimBattlerSpriteId(u8 animBattler);\nvoid StoreSpriteCallbackInData6(struct Sprite *sprite, SpriteCallback callback);\nvoid TranslateSpriteInCircle(struct Sprite *sprite);\nvoid TranslateSpriteInGrowingCircle(struct Sprite *sprite);\nvoid TranslateSpriteInEllipse(struct Sprite *sprite);\nvoid WaitAnimForDuration(struct Sprite *sprite);\nvoid ConvertPosDataToTranslateLinearData(struct Sprite *sprite);\nvoid TranslateSpriteLinear(struct Sprite *sprite);\nvoid TranslateSpriteLinearFixedPoint(struct Sprite *sprite);\nvoid TranslateSpriteLinearById(struct Sprite *sprite);\nvoid TranslateSpriteLinearByIdFixedPoint(struct Sprite *sprite);\nvoid TranslateSpriteLinearAndFlicker(struct Sprite *sprite);\nvoid DestroySpriteAndMatrix(struct Sprite *sprite);\nvoid RunStoredCallbackWhenAffineAnimEnds(struct Sprite *sprite);\nvoid RunStoredCallbackWhenAnimEnds(struct Sprite *sprite);\nvoid DestroyAnimSpriteAndDisableBlend(struct Sprite *sprite);\nvoid DestroyAnimVisualTaskAndDisableBlend(u8 taskId);\nvoid SetSpriteCoordsToAnimAttackerCoords(struct Sprite *sprite);\nvoid SetAnimSpriteInitialXOffset(struct Sprite *sprite, s16 xOffset);\nvoid InitAnimArcTranslation(struct Sprite *sprite);\nbool8 TranslateAnimHorizontalArc(struct Sprite *sprite);\nbool8 TranslateAnimVerticalArc(struct Sprite *sprite);\nvoid SetSpritePrimaryCoordsFromSecondaryCoords(struct Sprite *sprite);\nvoid InitSpritePosToAnimTarget(struct Sprite *sprite, bool8 respectMonPicOffsets);\nvoid InitSpritePosToAnimAttacker(struct Sprite *sprite, bool8 respectMonPicOffsets);\nu8 GetBattlerSide(u8 battlerId);\nu8 GetBattlerPosition(u8 battlerId);\nu8 GetBattlerAtPosition(u8 position);\nbool8 IsBattlerSpritePresent(u8 battlerId);\nbool8 IsDoubleBattle(void);\nvoid GetBattleAnimBg1Data(struct BattleAnimBgData *animBgData);\nvoid GetBattleAnimBgData(struct BattleAnimBgData *animBgData, u32 bgId);\nvoid GetBattleAnimBgDataByPriorityRank(struct BattleAnimBgData *animBgData, u8 unused);\nvoid InitBattleAnimBg(u32 bgId);\nvoid AnimLoadCompressedBgGfx(u32 bgId, const u32 *src, u32 tilesOffset);\nvoid InitAnimBgTilemapBuffer(u32 bgId, const void *src);\nvoid AnimLoadCompressedBgTilemap(u32 bgId, const u32 *src);\nu8 GetBattleBgPaletteNum(void);\nvoid ToggleBg3Mode(bool8 arg0);\nvoid Trade_MoveSelectedMonToTarget(struct Sprite *sprite);\nvoid InitSpriteDataForLinearTranslation(struct Sprite *sprite);\nvoid InitAnimLinearTranslation(struct Sprite *sprite);\nvoid StartAnimLinearTranslation(struct Sprite *sprite);\nvoid PlayerThrowBall_StartAnimLinearTranslation(struct Sprite *sprite);\nbool8 AnimTranslateLinear(struct Sprite *sprite);\nvoid AnimTranslateLinear_WithFollowup(struct Sprite *sprite);\nvoid InitAnimLinearTranslationWithSpeed(struct Sprite *sprite);\nvoid InitAnimLinearTranslationWithSpeedAndPos(struct Sprite *sprite);\nvoid InitAndRunAnimFastLinearTranslation(struct Sprite *sprite);\nbool8 AnimFastTranslateLinear(struct Sprite *sprite);\nvoid InitAnimFastLinearTranslationWithSpeed(struct Sprite *sprite);\nvoid InitAnimFastLinearTranslationWithSpeedAndPos(struct Sprite *sprite);\nvoid SetSpriteRotScale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation);\nvoid PrepareBattlerSpriteForRotScale(u8 spriteId, u8 objMode);\nvoid ResetSpriteRotScale(u8 spriteId);\nvoid SetBattlerSpriteYOffsetFromRotation(u8 spriteId);\nvoid TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 xScale, s16 yScale, u16 rotation);\nvoid TryResetSpriteAffineState(struct Sprite *sprite);\nu16 ArcTan2Neg(s16 a, s16 b);\nvoid SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor);\nu32 GetBattlePalettesMask(bool8 battleBackground, bool8 attacker, bool8 target, bool8 attackerPartner, bool8 targetPartner, bool8 a6, bool8 a7);\nu32 GetBattleMonSpritePalettesMask(bool8 playerLeft, bool8 playerRight, bool8 foeLeft, bool8 foeRight);\nu8 GetSpritePalIdxByBattler(u8 a1);\nvoid AnimSpriteOnMonPos(struct Sprite *sprite);\nvoid TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite);\nvoid AnimThrowProjectile(struct Sprite *sprite);\nvoid AnimTravelDiagonally(struct Sprite *sprite);\ns16 CloneBattlerSpriteWithBlend(u8 animBattler);\nvoid DestroySpriteWithActiveSheet(struct Sprite *sprite);\nvoid PrepareAffineAnimInTaskData(struct Task *task, u8 spriteId, const union AffineAnimCmd *affineAnimCmds);\nbool8 RunAffineAnimFromTaskData(struct Task *task);\nvoid SetBattlerSpriteYOffsetFromYScale(u8 spriteId);\nvoid SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId);\nvoid StorePointerInVars(s16 *lo, s16 *hi, const void *ptr);\nvoid *LoadPointerFromVars(s16 lo, s16 hi);\nvoid BattleAnimHelper_SetSpriteSquashParams(struct Task *task, u8 spriteId, s16 xScale0, s16 yScale0, s16 xScale1, s16 yScale1, u16 duration);\nu8 BattleAnimHelper_RunSpriteSquash(struct Task *task);\nvoid InitPrioritiesForVisibleBattlers(void);\nu8 GetBattlerSpriteSubpriority(u8 battlerId);\nu8 GetBattlerSpriteBGPriority(u8 battlerId);\nu8 GetBattlerSpriteBGPriorityRank(u8 battlerId);\nu8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 templateId, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, u32 ignoreDeoxys);\nvoid DestroySpriteAndFreeResources_(struct Sprite *sprite);\ns16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr);\nvoid SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x, s16 *y);\nu8 CreateInvisibleSpriteCopy(s32 battlerId, u8 spriteId, s32 species);\nvoid AnimTranslateLinearAndFlicker_Flipped(struct Sprite *sprite);\nvoid AnimTranslateLinearAndFlicker(struct Sprite *sprite);\nvoid AnimSpinningSparkle(struct Sprite *sprite);\nvoid AnimWeatherBallUp(struct Sprite *sprite);\nvoid AnimWeatherBallDown(struct Sprite *sprite);\nvoid AnimParticleBurst(struct Sprite *);\nvoid AnimMoveTwisterParticle(struct Sprite *);\nu32 UnpackSelectedBattlePalettes(s16 selector);\nvoid AnimTask_HorizontalShake(u8 taskId);\nvoid DestroyAnimSpriteAfterTimer(struct Sprite *sprite);\nvoid AnimWaterPulseRing(struct Sprite *sprite);\nu8 SmokescreenImpact(s16 x, s16 y, u8 a3);\nvoid InitStatsChangeAnimation(u8 taskId);\nvoid StartMonScrollingBgMask(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u32 *gfx, const u32 *tilemap, const u32 *palette);\n\n#endif // GUARD_BATTLE_ANIM_H\n"
  },
  {
    "path": "include/battle_bg.h",
    "content": "#ifndef GUARD_BATTLE_BG_H\n#define GUARD_BATTLE_BG_H\n\n#include \"bg.h\"\n\nextern const struct BgTemplate gBattleBgTemplates[];\n\nvoid InitBattleBgsVideo(void);\nvoid DrawBattleEntryBackground(void);\nvoid InitLinkBattleVsScreen(u8 taskId);\nvoid LoadBattleMenuWindowGfx(void);\nvoid LoadBattleTextboxAndBackground(void);\nvoid BattleInitBgsAndWindows(void);\nvoid DrawMainBattleBackground(void);\n\n#endif // GUARD_BATTLE_BG_H\n"
  },
  {
    "path": "include/battle_controllers.h",
    "content": "#ifndef GUARD_BATTLE_CONTROLLERS_H\n#define GUARD_BATTLE_CONTROLLERS_H\n\n#include \"global.h\"\n#include \"battle.h\"\n\nenum\n{\n    REQUEST_ALL_BATTLE,\n    REQUEST_SPECIES_BATTLE,\n    REQUEST_HELDITEM_BATTLE,\n    REQUEST_MOVES_PP_BATTLE,\n    REQUEST_MOVE1_BATTLE,\n    REQUEST_MOVE2_BATTLE,\n    REQUEST_MOVE3_BATTLE,\n    REQUEST_MOVE4_BATTLE,\n    REQUEST_PP_DATA_BATTLE,\n    REQUEST_PPMOVE1_BATTLE,\n    REQUEST_PPMOVE2_BATTLE,\n    REQUEST_PPMOVE3_BATTLE,\n    REQUEST_PPMOVE4_BATTLE,\n    REQUEST_UNUSED_13_BATTLE,\n    REQUEST_UNUSED_14_BATTLE,\n    REQUEST_UNUSED_15_BATTLE,\n    REQUEST_UNUSED_16_BATTLE,\n    REQUEST_OTID_BATTLE,\n    REQUEST_EXP_BATTLE,\n    REQUEST_HP_EV_BATTLE,\n    REQUEST_ATK_EV_BATTLE,\n    REQUEST_DEF_EV_BATTLE,\n    REQUEST_SPEED_EV_BATTLE,\n    REQUEST_SPATK_EV_BATTLE,\n    REQUEST_SPDEF_EV_BATTLE,\n    REQUEST_FRIENDSHIP_BATTLE,\n    REQUEST_POKERUS_BATTLE,\n    REQUEST_MET_LOCATION_BATTLE,\n    REQUEST_MET_LEVEL_BATTLE,\n    REQUEST_MET_GAME_BATTLE,\n    REQUEST_POKEBALL_BATTLE,\n    REQUEST_ALL_IVS_BATTLE,\n    REQUEST_HP_IV_BATTLE,\n    REQUEST_ATK_IV_BATTLE,\n    REQUEST_DEF_IV_BATTLE,\n    REQUEST_SPEED_IV_BATTLE,\n    REQUEST_SPATK_IV_BATTLE,\n    REQUEST_SPDEF_IV_BATTLE,\n    REQUEST_PERSONALITY_BATTLE,\n    REQUEST_CHECKSUM_BATTLE,\n    REQUEST_STATUS_BATTLE,\n    REQUEST_LEVEL_BATTLE,\n    REQUEST_HP_BATTLE,\n    REQUEST_MAX_HP_BATTLE,\n    REQUEST_ATK_BATTLE,\n    REQUEST_DEF_BATTLE,\n    REQUEST_SPEED_BATTLE,\n    REQUEST_SPATK_BATTLE,\n    REQUEST_SPDEF_BATTLE,\n    REQUEST_COOL_BATTLE,\n    REQUEST_BEAUTY_BATTLE,\n    REQUEST_CUTE_BATTLE,\n    REQUEST_SMART_BATTLE,\n    REQUEST_TOUGH_BATTLE,\n    REQUEST_SHEEN_BATTLE,\n    REQUEST_COOL_RIBBON_BATTLE,\n    REQUEST_BEAUTY_RIBBON_BATTLE,\n    REQUEST_CUTE_RIBBON_BATTLE,\n    REQUEST_SMART_RIBBON_BATTLE,\n    REQUEST_TOUGH_RIBBON_BATTLE,\n};\n\n// Special arguments for Battle Controller functions.\n\nenum { // Values given to the emit functions to choose gBattleBufferA or gBattleBufferB\n    BUFFER_A,\n    BUFFER_B\n};\n\nenum {\n    RESET_ACTION_MOVE_SELECTION,\n    RESET_ACTION_SELECTION,\n    RESET_MOVE_SELECTION,\n};\n\nenum {\n    BALL_NO_SHAKES,\n    BALL_1_SHAKE,\n    BALL_2_SHAKES,\n    BALL_3_SHAKES_FAIL,\n    BALL_3_SHAKES_SUCCESS,\n    BALL_TRAINER_BLOCK,\n    BALL_GHOST_DODGE,\n};\n\nenum {\n    LINK_STANDBY_MSG_STOP_BOUNCE,\n    LINK_STANDBY_STOP_BOUNCE_ONLY,\n    LINK_STANDBY_MSG_ONLY,\n};\n\n#define RET_VALUE_LEVELLED_UP   11\n\n#define INSTANT_HP_BAR_DROP     0x7FFF\n\n#define PARTY_SUMM_SKIP_DRAW_DELAY (1 << 7)\n\n// Special return values in gBattleBufferB from Battle Controller functions.\n#define RET_VALUE_LEVELED_UP   11\n\nstruct UnusedControllerStruct\n{\n    u8 unk:7;\n    u8 flag:1;\n};\n\nstruct HpAndStatus\n{\n    u16 hp;\n    u32 status;\n};\n\nstruct MovePpInfo\n{\n    u16 moves[MAX_MON_MOVES];\n    u8 pp[MAX_MON_MOVES];\n    u8 ppBonuses;\n};\n\nstruct ChooseMoveStruct\n{\n    u16 moves[MAX_MON_MOVES];\n    u8 currentPp[MAX_MON_MOVES];\n    u8 maxPp[MAX_MON_MOVES];\n    u16 species;\n    u8 monType1;\n    u8 monType2;\n};\n\nenum\n{\n    CONTROLLER_GETMONDATA,\n    CONTROLLER_GETRAWMONDATA,\n    CONTROLLER_SETMONDATA,\n    CONTROLLER_SETRAWMONDATA,\n    CONTROLLER_LOADMONSPRITE,\n    CONTROLLER_SWITCHINANIM,\n    CONTROLLER_RETURNMONTOBALL,\n    CONTROLLER_DRAWTRAINERPIC,\n    CONTROLLER_TRAINERSLIDE,\n    CONTROLLER_TRAINERSLIDEBACK,\n    CONTROLLER_FAINTANIMATION,\n    CONTROLLER_PALETTEFADE,\n    CONTROLLER_SUCCESSBALLTHROWANIM,\n    CONTROLLER_BALLTHROWANIM,\n    CONTROLLER_PAUSE,\n    CONTROLLER_MOVEANIMATION,\n    CONTROLLER_PRINTSTRING,\n    CONTROLLER_PRINTSTRINGPLAYERONLY,\n    CONTROLLER_CHOOSEACTION,\n    CONTROLLER_UNKNOWNYESNOBOX,\n    CONTROLLER_CHOOSEMOVE,\n    CONTROLLER_OPENBAG,\n    CONTROLLER_CHOOSEPOKEMON,\n    CONTROLLER_23,\n    CONTROLLER_HEALTHBARUPDATE,\n    CONTROLLER_EXPUPDATE,\n    CONTROLLER_STATUSICONUPDATE,\n    CONTROLLER_STATUSANIMATION,\n    CONTROLLER_STATUSXOR,\n    CONTROLLER_DATATRANSFER,\n    CONTROLLER_DMA3TRANSFER,\n    CONTROLLER_PLAYBGM,\n    CONTROLLER_32,\n    CONTROLLER_TWORETURNVALUES,\n    CONTROLLER_CHOSENMONRETURNVALUE,\n    CONTROLLER_ONERETURNVALUE,\n    CONTROLLER_ONERETURNVALUE_DUPLICATE,\n    CONTROLLER_CLEARUNKVAR,\n    CONTROLLER_SETUNKVAR,\n    CONTROLLER_CLEARUNKFLAG,\n    CONTROLLER_TOGGLEUNKFLAG,\n    CONTROLLER_HITANIMATION,\n    CONTROLLER_CANTSWITCH,\n    CONTROLLER_PLAYSE,\n    CONTROLLER_PLAYFANFARE,\n    CONTROLLER_FAINTINGCRY,\n    CONTROLLER_INTROSLIDE,\n    CONTROLLER_INTROTRAINERBALLTHROW,\n    CONTROLLER_DRAWPARTYSTATUSSUMMARY,\n    CONTROLLER_HIDEPARTYSTATUSSUMMARY,\n    CONTROLLER_ENDBOUNCE,\n    CONTROLLER_SPRITEINVISIBILITY,\n    CONTROLLER_BATTLEANIMATION,\n    CONTROLLER_LINKSTANDBYMSG,\n    CONTROLLER_RESETACTIONMOVESELECTION,\n    CONTROLLER_ENDLINKBATTLE,\n    /*new controllers should go here*/\n    CONTROLLER_TERMINATOR_NOP,\n    CONTROLLER_CMDS_COUNT\n};\n\nextern struct UnusedControllerStruct gUnusedControllerStruct;\n\n// general functions\nvoid HandleLinkBattleSetup(void);\nvoid SetUpBattleVars(void);\nvoid InitBattleControllers(void);\nvoid TryReceiveLinkBattleData(void);\nvoid PrepareBufferDataTransferLink(u8 bufferId, u16 size, u8 *data);\n\n// emitters\nvoid BtlController_EmitGetMonData(u8 bufferId, u8 requestId, u8 monToCheck);\nvoid BtlController_EmitSetMonData(u8 bufferId, u8 requestId, u8 monToCheck, u8 bytes, void *data);\nvoid BtlController_EmitLoadMonSprite(u8 bufferId);\nvoid BtlController_EmitSwitchInAnim(u8 bufferId, u8 partyId, bool8 dontClearSubstituteBit);\nvoid BtlController_EmitReturnMonToBall(u8 bufferId, bool8 skipAnim);\nvoid BtlController_EmitDrawTrainerPic(u8 bufferId);\nvoid BtlController_EmitTrainerSlide(u8 bufferId);\nvoid BtlController_EmitTrainerSlideBack(u8 bufferId);\nvoid BtlController_EmitFaintAnimation(u8 bufferId);\nvoid BtlController_EmitBallThrowAnim(u8 bufferId, u8 caseId);\nvoid BtlController_EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, struct DisableStruct *disableStructPtr);\nvoid BtlController_EmitPrintString(u8 bufferId, u16 stringId);\nvoid BtlController_EmitPrintSelectionString(u8 bufferId, u16 stringId);\nvoid BtlController_EmitChooseAction(u8 bufferId, u8 action, u16 itemId);\nvoid BtlController_EmitChooseMove(u8 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData);\nvoid BtlController_EmitChooseItem(u8 bufferId, u8 *arg1);\nvoid BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 arg2, u8 abilityId, u8 *arg4);\nvoid BtlController_EmitHealthBarUpdate(u8 bufferId, u16 hpValue);\nvoid BtlController_EmitExpUpdate(u8 bufferId, u8 partyId, u16 expPoints);\nvoid BtlController_EmitStatusIconUpdate(u8 bufferId, u32 status1, u32 status2);\nvoid BtlController_EmitStatusAnimation(u8 bufferId, bool8 status2, u32 status);\nvoid BtlController_EmitDataTransfer(u8 bufferId, u16 size, void *data);\nvoid BtlController_EmitTwoReturnValues(u8 bufferId, u8 arg1, u16 arg2);\nvoid BtlController_EmitChosenMonReturnValue(u8 bufferId, u8 b, u8 *c);\nvoid BtlController_EmitOneReturnValue(u8 bufferId, u16 arg1);\nvoid BtlController_EmitOneReturnValue_Duplicate(u8 bufferId, u16 b);\nvoid BtlController_EmitHitAnimation(u8 bufferId);\nvoid BtlController_EmitCantSwitch(u8 bufferId);\nvoid BtlController_EmitPlaySE(u8 bufferId, u16 songId);\nvoid BtlController_EmitPlayFanfare(u8 bufferId, u16 songId);\nvoid BtlController_EmitFaintingCry(u8 bufferId);\nvoid BtlController_EmitIntroSlide(u8 bufferId, u8 terrainId);\nvoid BtlController_EmitIntroTrainerBallThrow(u8 bufferId);\nvoid BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus *hpAndStatus, u8 param);\nvoid BtlController_EmitHidePartyStatusSummary(u8 bufferId);\nvoid BtlController_EmitEndBounceEffect(u8 bufferId);\nvoid BtlController_EmitSpriteInvisibility(u8 bufferId, bool8 isInvisible);\nvoid BtlController_EmitBattleAnimation(u8 bufferId, u8 animationId, u16 argument);\nvoid BtlController_EmitLinkStandbyMsg(u8 bufferId, u8 mode);\nvoid BtlController_EmitResetActionMoveSelection(u8 bufferId, u8 caseId);\nvoid BtlController_EmitEndLinkBattle(u8 bufferId, u8 battleOutcome);\n\n// player controller\nvoid BattleControllerDummy(void);\nvoid SetControllerToPlayer(void);\nvoid PlayerHandleGetRawMonData(void);\nvoid SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite);\nvoid SetCB2ToReshowScreenAfterMenu(void);\nvoid SetCB2ToReshowScreenAfterMenu2(void);\nvoid Task_PlayerController_RestoreBgmAfterCry(u8 taskId);\nvoid ActionSelectionCreateCursorAt(u8 cursorPos, u8 unused);\nvoid ActionSelectionDestroyCursorAt(u8 cursorPos);\nvoid InitMoveSelectionsVarsAndStrings(void);\nvoid SetBattleEndCallbacks(void);\nvoid MoveSelectionCreateCursorAt(u8 cursorPos, u8 arg1);\nvoid MoveSelectionDestroyCursorAt(u8 cursorPos);\nvoid HandleInputChooseMove(void);\n\n// opponent controller\nvoid SetControllerToOpponent(void);\nvoid OpponentBufferExecCompleted(void);\n\n// safari controller\nvoid SetControllerToSafari(void);\n\n// pokedude controller\nvoid SetControllerToPokedude(void);\nvoid InitPokedudePartyAndOpponent(void);\n\n// oak and old man controller\nvoid SetControllerToOakOrOldMan(void);\n\n// These flags are set to signal that the indicated message\n// was already emitted\n\n// Inflicting damage is key\n#define FIRST_BATTLE_MSG_FLAG_INFLICT_DMG    0x1\n// Lowering stats is advantageous\n#define FIRST_BATTLE_MSG_FLAG_STAT_CHG       0x2\n// Keep an eye on your HP\n#define FIRST_BATTLE_MSG_FLAG_HP_RESTORE     0x4\n//\n#define FIRST_BATTLE_MSG_FLAG_PARTY_MENU     0x8\n\nbool8 BtlCtrl_OakOldMan_TestState2Flag(u8 mask);\nvoid BtlCtrl_OakOldMan_SetState2Flag(u8 mask);\nvoid PrintOakText_InflictingDamageIsKey(void);\nvoid PrintOakText_HowDisappointing(void);\nvoid PrintOakText_OakNoRunningFromATrainer(void);\nvoid OakOldManHandleInputChooseMove(void);\nvoid BtlCtrl_DrawVoiceoverMessageFrame(void);\nvoid BtlCtrl_RemoveVoiceoverMessageFrame(void);\n\n// link opponent controller\nvoid SetControllerToLinkOpponent(void);\n\n// link partner controller\nvoid SetControllerToLinkPartner(void);\n\n#endif // GUARD_BATTLE_CONTROLLERS_H\n"
  },
  {
    "path": "include/battle_gfx_sfx_util.h",
    "content": "#ifndef GUARD_BATTLE_GFX_SFX_UTIL_H\n#define GUARD_BATTLE_GFX_SFX_UTIL_H\n\nvoid AllocateBattleSpritesData(void);\nvoid FreeBattleSpritesData(void);\nvoid SpriteCB_WaitForBattlerBallReleaseAnim(struct Sprite *sprite);\nvoid SpriteCB_TrainerSlideIn(struct Sprite *sprite);\nvoid InitAndLaunchChosenStatusAnimation(bool8 isStatus2, u32 status);\nbool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId, u16 argument);\nvoid InitAndLaunchSpecialAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId);\nbool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn);\nbool8 IsBattleSEPlaying(u8 battlerId);\nvoid BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId);\nvoid BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId);\nvoid DecompressGhostFrontPic(struct Pokemon *unused, u8 battlerId);\nvoid DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId);\nvoid DecompressTrainerBackPalette(u16 a1, u8 a2);\nvoid BattleGfxSfxDummy3(u8 gender);\nvoid FreeTrainerFrontPicPaletteAndTile(u16 frontPicId);\nbool8 BattleLoadAllHealthBoxesGfx(u8 state);\nvoid LoadBattleBarGfx(u8 arg0);\nbool8 BattleInitAllSprites(u8 *state, u8 *battlerId);\nvoid ClearSpritesHealthboxAnimData(void);\nvoid CopyAllBattleSpritesInvisibilities(void);\nvoid CopyBattleSpriteInvisibility(u8 battlerId);\nvoid HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 transformType);\nvoid BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite);\nvoid LoadBattleMonGfxAndAnimate(u8 battlerId, bool8 loadMonSprite, u8 spriteId);\nvoid TrySetBehindSubstituteSpriteBit(u8 battlerId, u16 move);\nvoid ClearBehindSubstituteBit(u8 battlerId);\nvoid HandleLowHpMusicChange(struct Pokemon *mon, u8 battlerId);\nvoid BattleStopLowHpSound(void);\nvoid HandleBattleLowHpMusicChange(void);\nvoid SetBattlerSpriteAffineMode(u8 affineMode);\nvoid LoadAndCreateEnemyShadowSprites(void);\nvoid SpriteCB_SetInvisible(struct Sprite *sprite);\nvoid SetBattlerShadowSpriteCallback(u8 battlerId, u16 species);\nvoid HideBattlerShadowSprite(u8 battlerId);\nvoid BattleInterfaceSetWindowPals(void);\nvoid ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute);\nvoid AllocateMonSpritesGfx(void);\nvoid FreeMonSpritesGfx(void);\nbool32 ShouldPlayNormalMonCry(struct Pokemon *mon);\n\n#endif // GUARD_BATTLE_GFX_SFX_UTIL_H\n"
  },
  {
    "path": "include/battle_interface.h",
    "content": "#ifndef GUARD_BATTLE_INTERFACE_H\n#define GUARD_BATTLE_INTERFACE_H\n\n#include \"global.h\"\n#include \"battle_controllers.h\"\n\nenum\n{\n    HP_CURRENT,\n    HP_MAX\n};\n\nenum\n{\n    HEALTH_BAR,\n    EXP_BAR\n};\n\nenum\n{\n    HP_BAR_EMPTY,\n    HP_BAR_RED,\n    HP_BAR_YELLOW,\n    HP_BAR_GREEN,\n    HP_BAR_FULL,\n};\n\n#define TAG_HEALTHBOX_PLAYER1_TILE              55039\n#define TAG_HEALTHBOX_PLAYER2_TILE              55040\n#define TAG_HEALTHBOX_OPPONENT1_TILE            55041\n#define TAG_HEALTHBOX_OPPONENT2_TILE            55042\n\n#define TAG_HEALTHBAR_PLAYER1_TILE              55044\n#define TAG_HEALTHBAR_OPPONENT1_TILE            55045\n#define TAG_HEALTHBAR_PLAYER2_TILE              55046\n#define TAG_HEALTHBAR_OPPONENT2_TILE            55047\n\n#define TAG_HEALTHBOX_PALS_1                    55049\n#define TAG_HEALTHBOX_PALS_2                    55050\n#define TAG_HEALTHBOX_SAFARI_TILE               55051\n#define TAG_PARTY_SUMMARY_BAR_PLAYER_TILE       55052\n#define TAG_PARTY_SUMMARY_BAR_OPPONENT_TILE     55053\n\n#define TAG_PARTY_SUMMARY_BAR_PLAYER_PAL        55056\n#define TAG_PARTY_SUMMARY_BAR_OPPONENT_PAL      55057\n#define TAG_PARTY_SUMMARY_BALL_PLAYER_PAL       55058\n#define TAG_PARTY_SUMMARY_BALL_OPPONENT_PAL     55059\n#define TAG_PARTY_SUMMARY_BALL_PLAYER_TILE      55060\n#define TAG_PARTY_SUMMARY_BALL_OPPONENT_TILE    55061\n\n#define TAG_HEALTHBOX_PAL                       TAG_HEALTHBOX_PLAYER1_TILE\n#define TAG_HEALTHBAR_PAL                       TAG_HEALTHBAR_PLAYER1_TILE\n\nenum\n{\n    HEALTHBOX_ALL,\n    HEALTHBOX_CURRENT_HP,\n    HEALTHBOX_MAX_HP,\n    HEALTHBOX_LEVEL,\n    HEALTHBOX_NICK,\n    HEALTHBOX_HEALTH_BAR,\n    HEALTHBOX_EXP_BAR,\n    HEALTHBOX_UNUSED_7,\n    HEALTHBOX_UNUSED_8,\n    HEALTHBOX_STATUS_ICON,\n    HEALTHBOX_SAFARI_ALL_TEXT,\n    HEALTHBOX_SAFARI_BALLS_TEXT\n};\n\nvoid Task_HidePartyStatusSummary(u8 taskId);\nu8 CreateBattlerHealthboxSprites(u8 battlerId);\nu8 CreateSafariPlayerHealthboxSprites(void);\nvoid SetBattleBarStruct(u8 battlerId, u8 healthboxSpriteId, s32 maxVal, s32 currVal, s32 receivedValue);\nvoid SetHealthboxSpriteInvisible(u8 healthboxSpriteId);\nvoid SetHealthboxSpriteVisible(u8 healthboxSpriteId);\nvoid DestoryHealthboxSprite(u8 healthboxSpriteId);\nvoid DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBankOnly);\nvoid UpdateOamPriorityInAllHealthboxes(u8 priority);\nvoid InitBattlerHealthboxCoords(u8 battlerId);\nvoid UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent);\nvoid SwapHpBarsWithHpText(void);\nu8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, u8 isSwitchingMons, bool8 isBattleStart);\nvoid UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId);\nu8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale);\nu8 GetHPBarLevel(s16 hp, s16 maxhp);\nvoid UpdateNickInHealthbox(u8 spriteId, struct Pokemon *mon);\nvoid TryAddPokeballIconToHealthbox(u8 spriteId, u8);\ns32 MoveBattleBar(u8 battler, u8 healthboxSpriteId, u8 whichBar, u8 arg3);\n\n#endif // GUARD_BATTLE_INTERFACE_H\n"
  },
  {
    "path": "include/battle_main.h",
    "content": "#ifndef GUARD_BATTLE_MAIN_H\n#define GUARD_BATTLE_MAIN_H\n\n#include \"constants/abilities.h\"\n\nstruct TrainerMoney\n{\n    u8 classId;\n    u8 value;\n};\n\nstruct MultiBattlePokemonTx\n{\n    /*0x00*/ u16 species;\n    /*0x02*/ u16 heldItem;\n    /*0x04*/ u8 nickname[POKEMON_NAME_LENGTH + 1];\n    /*0x0F*/ u8 level;\n    /*0x10*/ u16 hp;\n    /*0x12*/ u16 maxhp;\n    /*0x14*/ u32 status;\n    /*0x18*/ u32 personality;\n    /*0x1C*/ u8 gender;\n    /*0x1D*/ u8 language;\n};\n\n#define TYPE_NAME_LENGTH 6\n#define ABILITY_NAME_LENGTH 12\n\n// defines for the u8 array gTypeEffectiveness\n#define TYPE_EFFECT_ATK_TYPE(i)((gTypeEffectiveness[i + 0]))\n#define TYPE_EFFECT_DEF_TYPE(i)((gTypeEffectiveness[i + 1]))\n#define TYPE_EFFECT_MULTIPLIER(i)((gTypeEffectiveness[i + 2]))\n\n// defines for the gTypeEffectiveness multipliers\n#define TYPE_MUL_NO_EFFECT          0\n#define TYPE_MUL_NOT_EFFECTIVE      5\n#define TYPE_MUL_NORMAL             10\n#define TYPE_MUL_SUPER_EFFECTIVE    20\n\n// special type table Ids\n#define TYPE_FORESIGHT  0xFE\n#define TYPE_ENDTABLE   0xFF\n\n// defines for the 'DoBounceEffect' function\n#define BOUNCE_MON          0x0\n#define BOUNCE_HEALTHBOX    0x1\n\nextern const struct SpriteTemplate gUnknownDebugSprite;\nextern const struct OamData gOamData_BattlerOpponent;\nextern const struct OamData gOamData_BattlerPlayer;\nextern const u8 gTypeNames[][TYPE_NAME_LENGTH + 1];\nextern const u8 gStatusConditionString_PoisonJpn[8];\nextern const u8 gStatusConditionString_SleepJpn[8];\nextern const u8 gStatusConditionString_ParalysisJpn[8];\nextern const u8 gStatusConditionString_BurnJpn[8];\nextern const u8 gStatusConditionString_IceJpn[8];\nextern const u8 gStatusConditionString_ConfusionJpn[8];\nextern const u8 gStatusConditionString_LoveJpn[8];\nextern const u8 *const gStatusConditionStringsTable[7][2];\nextern const u8 gTypeEffectiveness[336];\nextern const struct TrainerMoney gTrainerMoneyTable[];\nextern const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT];\nextern const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1];\n\nvoid CB2_InitBattle(void);\nvoid BattleMainCB2(void);\nvoid FreeRestoreBattleData(void);\nvoid VBlankCB_Battle(void);\nvoid SpriteCB_VsLetterDummy(struct Sprite *sprite);\nvoid SpriteCB_VsLetterInit(struct Sprite *sprite);\nvoid CB2_InitEndLinkBattle(void);\nu32 GetBattleBgTemplateData(u8 arrayId, u8 caseId);\nvoid SpriteCB_EnemyMon(struct Sprite *sprite);\nvoid SpriteCallbackDummy_2(struct Sprite *sprite);\nvoid SpriteCB_FaintOpponentMon(struct Sprite *sprite);\nvoid SpriteCB_ShowAsMoveTarget(struct Sprite *sprite);\nvoid SpriteCB_HideAsMoveTarget(struct Sprite *sprite);\nvoid SpriteCB_AllyMon(struct Sprite *sprite);\nvoid SetIdleSpriteCallback(struct Sprite *sprite);\nvoid SpriteCB_FaintSlideAnim(struct Sprite *sprite);\nvoid DoBounceEffect(u8 battler, u8 which, s8 delta, s8 amplitude);\nvoid EndBounceEffect(u8 battler, u8 which);\nvoid SpriteCB_PlayerThrowInit(struct Sprite *sprite);\nvoid UpdatePlayerPosInThrowAnim(struct Sprite *sprite);\nvoid BeginBattleIntroDummy(void);\nvoid BeginBattleIntro(void);\nvoid SwitchInClearSetData(void);\nvoid FaintClearSetData(void);\nvoid BattleTurnPassed(void);\nu8 IsRunningFromBattleImpossible(void);\nvoid UpdatePartyOwnerOnSwitch_NonMulti(u8 battler);\nvoid SwapTurnOrder(u8 id1, u8 id2);\nu8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves);\nvoid RunBattleScriptCommands_PopCallbacksStack(void);\nvoid RunBattleScriptCommands(void);\nbool8 TryRunFromBattle(u8 battler);\n\n#endif // GUARD_BATTLE_MAIN_H\n"
  },
  {
    "path": "include/battle_message.h",
    "content": "#ifndef GUARD_BATTLE_MESSAGE_H\n#define GUARD_BATTLE_MESSAGE_H\n\n#include \"global.h\"\n#include \"constants/battle_string_ids.h\"\n\n// for 0xFD\n\n#define B_TXT_BUFF1 0x0\n#define B_TXT_BUFF2 0x1\n#define B_TXT_COPY_VAR_1 0x2\n#define B_TXT_COPY_VAR_2 0x3\n#define B_TXT_COPY_VAR_3 0x4\n#define B_TXT_PLAYER_MON1_NAME 0x5\n#define B_TXT_OPPONENT_MON1_NAME 0x6\n#define B_TXT_PLAYER_MON2_NAME 0x7\n#define B_TXT_OPPONENT_MON2_NAME 0x8\n#define B_TXT_LINK_PLAYER_MON1_NAME 0x9\n#define B_TXT_LINK_OPPONENT_MON1_NAME 0xA\n#define B_TXT_LINK_PLAYER_MON2_NAME 0xB\n#define B_TXT_LINK_OPPONENT_MON2_NAME 0xC\n#define B_TXT_ATK_NAME_WITH_PREFIX_MON1 0xD\n#define B_TXT_ATK_PARTNER_NAME 0xE\n#define B_TXT_ATK_NAME_WITH_PREFIX 0xF\n#define B_TXT_DEF_NAME_WITH_PREFIX 0x10\n#define B_TXT_EFF_NAME_WITH_PREFIX 0x11 // EFF = short for gEffectBank\n#define B_TXT_ACTIVE_NAME_WITH_PREFIX 0x12\n#define B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX 0x13\n#define B_TXT_CURRENT_MOVE 0x14\n#define B_TXT_LAST_MOVE 0x15\n#define B_TXT_LAST_ITEM 0x16\n#define B_TXT_LAST_ABILITY 0x17\n#define B_TXT_ATK_ABILITY 0x18\n#define B_TXT_DEF_ABILITY 0x19\n#define B_TXT_SCR_ACTIVE_ABILITY 0x1A\n#define B_TXT_EFF_ABILITY 0x1B\n#define B_TXT_TRAINER1_CLASS 0x1C\n#define B_TXT_TRAINER1_NAME 0x1D\n#define B_TXT_LINK_PLAYER_NAME 0x1E\n#define B_TXT_LINK_PARTNER_NAME 0x1F\n#define B_TXT_LINK_OPPONENT1_NAME 0x20\n#define B_TXT_LINK_OPPONENT2_NAME 0x21\n#define B_TXT_LINK_SCR_TRAINER_NAME 0x22\n#define B_TXT_PLAYER_NAME 0x23\n#define B_TXT_TRAINER1_LOSE_TEXT 0x24\n#define B_TXT_TRAINER1_WIN_TEXT 0x25\n#define B_TXT_26 0x26\n#define B_TXT_PC_CREATOR_NAME 0x27\n#define B_TXT_ATK_PREFIX1 0x28\n#define B_TXT_DEF_PREFIX1 0x29\n#define B_TXT_ATK_PREFIX2 0x2A\n#define B_TXT_DEF_PREFIX2 0x2B\n#define B_TXT_ATK_PREFIX3 0x2C\n#define B_TXT_DEF_PREFIX3 0x2D\n#define B_TXT_TRAINER2_LOSE_TEXT 0x2E\n#define B_TXT_TRAINER2_WIN_TEXT 0x2F\n#define B_TXT_BUFF3 0x30\n\n// for B_TXT_BUFF1, B_TXT_BUFF2 and B_TXT_BUFF3\n\n#define B_BUFF_STRING                   0\n#define B_BUFF_NUMBER                   1\n#define B_BUFF_MOVE                     2\n#define B_BUFF_TYPE                     3\n#define B_BUFF_MON_NICK_WITH_PREFIX     4\n#define B_BUFF_STAT                     5\n#define B_BUFF_SPECIES                  6\n#define B_BUFF_MON_NICK                 7\n#define B_BUFF_NEGATIVE_FLAVOR          8\n#define B_BUFF_ABILITY                  9\n#define B_BUFF_ITEM                     10\n\n#define B_BUFF_PLACEHOLDER_BEGIN        0xFD\n#define B_BUFF_EOS                      0xFF\n\n#define PREPARE_FLAVOR_BUFFER(textVar, flavorId)                            \\\n{                                                                           \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                                  \\\n    textVar[1] = B_BUFF_NEGATIVE_FLAVOR;                                    \\\n    textVar[2] = flavorId;                                                  \\\n    textVar[3] = B_BUFF_EOS;                                                \\\n}\n\n#define PREPARE_STAT_BUFFER(textVar, statId)                                \\\n{                                                                           \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                                  \\\n    textVar[1] = B_BUFF_STAT;                                               \\\n    textVar[2] = statId;                                                    \\\n    textVar[3] = B_BUFF_EOS;                                                \\\n}\n\n#define PREPARE_ABILITY_BUFFER(textVar, abilityId)                          \\\n{                                                                           \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                                  \\\n    textVar[1] = B_BUFF_ABILITY;                                            \\\n    textVar[2] = abilityId;                                                 \\\n    textVar[3] = B_BUFF_EOS;                                                \\\n}\n\n#define PREPARE_TYPE_BUFFER(textVar, typeId)                                \\\n{                                                                           \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                                  \\\n    textVar[1] = B_BUFF_TYPE;                                               \\\n    textVar[2] = typeId;                                                    \\\n    textVar[3] = B_BUFF_EOS;                                                \\\n}\n\n#define PREPARE_BYTE_NUMBER_BUFFER(textVar, maxDigits, number)  \\\n{                                                               \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                      \\\n    textVar[1] = B_BUFF_NUMBER;                                 \\\n    textVar[2] = 1;                                             \\\n    textVar[3] = maxDigits;                                     \\\n    textVar[4] = (number);                                      \\\n    textVar[5] = B_BUFF_EOS;                                    \\\n}\n\n#define PREPARE_HWORD_NUMBER_BUFFER(textVar, maxDigits, number)             \\\n{                                                                           \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                                  \\\n    textVar[1] = B_BUFF_NUMBER;                                             \\\n    textVar[2] = 2;                                                         \\\n    textVar[3] = maxDigits;                                                 \\\n    textVar[4] = (number);                                                  \\\n    textVar[5] = (number & 0x0000FF00) >> 8;                                \\\n    textVar[6] = B_BUFF_EOS;                                                \\\n}\n\n#define PREPARE_WORD_NUMBER_BUFFER(textVar, maxDigits, number)  \\\n{                                                               \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                      \\\n    textVar[1] = B_BUFF_NUMBER;                                 \\\n    textVar[2] = 4;                                             \\\n    textVar[3] = maxDigits;                                     \\\n    textVar[4] = (number);                                      \\\n    textVar[5] = (number & 0x0000FF00) >> 8;                    \\\n    textVar[6] = (number & 0x00FF0000) >> 16;                   \\\n    textVar[7] = (number & 0xFF000000) >> 24;                   \\\n    textVar[8] = B_BUFF_EOS;                                    \\\n}\n\n#define PREPARE_STRING_BUFFER(textVar, stringId)                \\\n{                                                               \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                      \\\n    textVar[1] = B_BUFF_STRING;                                 \\\n    textVar[2] = stringId;                                      \\\n    textVar[3] = (stringId & 0xFF00) >> 8;                      \\\n    textVar[4] = B_BUFF_EOS;                                    \\\n}\n\n#define PREPARE_MOVE_BUFFER(textVar, move)                      \\\n{                                                               \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                      \\\n    textVar[1] = B_BUFF_MOVE;                                   \\\n    textVar[2] = move;                                          \\\n    textVar[3] = (move & 0xFF00) >> 8;                          \\\n    textVar[4] = B_BUFF_EOS;                                    \\\n}\n\n#define PREPARE_ITEM_BUFFER(textVar, item)                      \\\n{                                                               \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                      \\\n    textVar[1] = B_BUFF_ITEM;                                   \\\n    textVar[2] = item;                                          \\\n    textVar[3] = (item & 0xFF00) >> 8;                          \\\n    textVar[4] = B_BUFF_EOS;                                    \\\n}\n\n#define PREPARE_SPECIES_BUFFER(textVar, species)                \\\n{                                                               \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                      \\\n    textVar[1] = B_BUFF_SPECIES;                                \\\n    textVar[2] = species;                                       \\\n    textVar[3] = (species & 0xFF00) >> 8;                       \\\n    textVar[4] = B_BUFF_EOS;                                    \\\n}\n\n#define PREPARE_MON_NICK_WITH_PREFIX_BUFFER(textVar, bank, partyId)         \\\n{                                                                           \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                                  \\\n    textVar[1] = B_BUFF_MON_NICK_WITH_PREFIX;                               \\\n    textVar[2] = bank;                                                      \\\n    textVar[3] = partyId;                                                   \\\n    textVar[4] = B_BUFF_EOS;                                                \\\n}\n\n#define PREPARE_MON_NICK_BUFFER(textVar, bank, partyId)         \\\n{                                                               \\\n    textVar[0] = B_BUFF_PLACEHOLDER_BEGIN;                      \\\n    textVar[1] = B_BUFF_MON_NICK;                               \\\n    textVar[2] = bank;                                          \\\n    textVar[3] = partyId;                                       \\\n    textVar[4] = B_BUFF_EOS;                                    \\\n}\n\nstruct BattleMsgData\n{\n    u16 currentMove;\n    u16 originallyUsedMove;\n    u16 lastItem;\n    u8 lastAbility;\n    u8 scrActive;\n    u8 bakScriptPartyIdx;\n    u8 hpScale;\n    u8 itemEffectBattler;\n    u8 moveType;\n    u8 abilities[4];\n    u8 textBuffs[3][0x10];\n};\n\nvoid BufferStringBattle(u16 stringID);\nu32 BattleStringExpandPlaceholdersToDisplayedString(const u8 *src);\nu32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst);\nvoid BattleHandleAddTextPrinter(const u8 *text, u8 arg1);\nvoid SetPpNumbersPaletteInMoveSelection(void);\nu8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp);\nvoid BattlePutTextOnWindow(const u8 *text, u8 windowId_flags);\nbool8 BattleStringShouldBeColored(u16);\n\nextern struct BattleMsgData *gBattleMsgDataPtr;\n\n#define TEXT_BUFF_ARRAY_COUNT   16\n\nextern u8 gDisplayedStringBattle[300];\nextern u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT];\nextern u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT];\nextern u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT];\n\nextern const u8 *const gBattleStringsTable[];\nextern const u8 *const gStatNamesTable[];\nextern const u8 *const gPokeblockWasTooXStringTable[];\nextern const u8 *const gRefereeStringsTable[];\nextern const u8 *const gStatNamesTable2[];\n\nextern const u16 gMissStringIds[];\nextern const u16 gTrappingMoves[];\n\nextern const u8 gText_Sleep[];\nextern const u8 gText_Poison[];\nextern const u8 gText_Burn[];\nextern const u8 gText_Paralysis[];\nextern const u8 gText_Ice[];\nextern const u8 gText_Confusion[];\nextern const u8 gText_Love[];\n\nextern const u8 gText_BattleTowerBan_Space[];\nextern const u8 gText_BattleTowerBan_Newline1[];\nextern const u8 gText_BattleTowerBan_Newline2[];\nextern const u8 gText_BattleTowerBan_Is1[];\nextern const u8 gText_BattleTowerBan_Is2[];\n\nextern const u8 gText_SafariBalls[];\nextern const u8 gText_HighlightRed_Left[];\n\nextern const u8 gText_Win[];\nextern const u8 gText_Loss[];\nextern const u8 gText_Draw[];\n\n#endif // GUARD_BATTLE_MESSAGE_H\n"
  },
  {
    "path": "include/battle_records.h",
    "content": "#ifndef GUARD_BATTLE_RECORDS_H\n#define GUARD_BATTLE_RECORDS_H\n\nvoid ClearPlayerLinkBattleRecords(void);\nvoid UpdatePlayerLinkBattleRecords(s32 battlerId);\n\n#endif // GUARD_BATTLE_RECORDS_H\n"
  },
  {
    "path": "include/battle_script_commands.h",
    "content": "#ifndef GUARD_BATTLE_SCRIPT_COMMANDS_H\n#define GUARD_BATTLE_SCRIPT_COMMANDS_H\n\n#include \"global.h\"\n\n// Arguments for 'flags' in HandleBattleWindow\n#define WINDOW_CLEAR (1 << 0)\n#define WINDOW_BG1   (1 << 7)\n\nvoid AI_CalcDmg(u8 attacker, u8 defender);\nu8 TypeCalc(u16 move, u8 attacker, u8 defender);\nu8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility);\nu8 GetBattlerTurnOrderNum(u8 battlerId);\nvoid SetMoveEffect(bool8 primary, u8 certain);\nbool32 IsMonGettingExpSentOut(void);\nvoid BattleDestroyYesNoCursorAt(void);\nvoid BattleCreateYesNoCursorAt(void);\nvoid BufferMoveToLearnIntoBattleTextBuff2(void);\nvoid HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags);\nbool8 UproarWakeUpCheck(u8 battlerId);\n\nextern void (* const gBattleScriptingCommandsTable[])(void);\nextern const u16 gNaturePowerMoves[];\n\n#endif // GUARD_BATTLE_SCRIPT_COMMANDS_H\n"
  },
  {
    "path": "include/battle_scripts.h",
    "content": "#ifndef GUARD_BATTLE_SCRIPTS_H\n#define GUARD_BATTLE_SCRIPTS_H\n\n#include \"global.h\"\n\nextern const u8 BattleScript_HitFromCritCalc[];\nextern const u8 BattleScript_MoveEnd[];\nextern const u8 BattleScript_MakeMoveMissed[];\nextern const u8 BattleScript_PrintMoveMissed[];\nextern const u8 BattleScript_MoveMissedPause[];\nextern const u8 BattleScript_MoveMissed[];\nextern const u8 BattleScript_ButItFailed[];\nextern const u8 BattleScript_StatUp[];\nextern const u8 BattleScript_StatDown[];\nextern const u8 BattleScript_AlreadyAtFullHp[];\nextern const u8 BattleScript_PresentHealTarget[];\nextern const u8 BattleScript_MoveUsedMustRecharge[];\nextern const u8 BattleScript_FaintAttacker[];\nextern const u8 BattleScript_FaintTarget[];\nextern const u8 BattleScript_GiveExp[];\nextern const u8 BattleScript_HandleFaintedMon[];\nextern const u8 BattleScript_LocalTrainerBattleWon[];\nextern const u8 BattleScript_LocalTwoTrainersDefeated[];\nextern const u8 BattleScript_LocalBattleWonLoseTexts[];\nextern const u8 BattleScript_LocalBattleWonReward[];\nextern const u8 BattleScript_PayDayMoneyAndPickUpItems[];\nextern const u8 BattleScript_LocalBattleLost[];\nextern const u8 BattleScript_LocalBattleLostPrintWhiteOut[];\nextern const u8 BattleScript_LocalBattleLostEnd[];\nextern const u8 BattleScript_EReaderOrSecretBaseTrainerEnd[];\nextern const u8 BattleScript_MasterTrainerBattleWon[];\nextern const u8 BattleScript_CheckDomeDrew[];\nextern const u8 BattleScript_LinkBattleWonOrLost[];\nextern const u8 BattleScript_BattleTowerTrainerBattleWon[];\nextern const u8 BattleScript_SmokeBallEscape[];\nextern const u8 BattleScript_RanAwayUsingMonAbility[];\nextern const u8 BattleScript_GotAwaySafely[];\nextern const u8 BattleScript_WildMonFled[];\nextern const u8 BattleScript_PrintCantRunFromTrainer[];\nextern const u8 BattleScript_PrintFailedToRunString[];\nextern const u8 BattleScript_PrintCantEscapeFromBattle[];\nextern const u8 BattleScript_PrintFullBox[];\nextern const u8 BattleScript_ActionSwitch[];\nextern const u8 BattleScript_Pausex20[];\nextern const u8 BattleScript_LevelUp[];\nextern const u8 BattleScript_RainContinuesOrEnds[];\nextern const u8 BattleScript_DamagingWeatherContinues[];\nextern const u8 BattleScript_SandStormHailEnds[];\nextern const u8 BattleScript_SunlightContinues[];\nextern const u8 BattleScript_SunlightFaded[];\nextern const u8 BattleScript_OverworldWeatherStarts[];\nextern const u8 BattleScript_SideStatusWoreOff[];\nextern const u8 BattleScript_SafeguardProtected[];\nextern const u8 BattleScript_SafeguardEnds[];\nextern const u8 BattleScript_LeechSeedTurnDrain[];\nextern const u8 BattleScript_BideStoringEnergy[];\nextern const u8 BattleScript_BideAttack[];\nextern const u8 BattleScript_BideNoEnergyToAttack[];\nextern const u8 BattleScript_SuccessForceOut[];\nextern const u8 BattleScript_MistProtected[];\nextern const u8 BattleScript_RageIsBuilding[];\nextern const u8 BattleScript_MoveUsedIsDisabled[];\nextern const u8 BattleScript_SelectingDisabledMove[];\nextern const u8 BattleScript_DisabledNoMore[];\nextern const u8 BattleScript_SelectingDisabledMoveInPalace[];\nextern const u8 BattleScript_SelectingUnusableMoveInPalace[];\nextern const u8 BattleScript_EncoredNoMore[];\nextern const u8 BattleScript_DestinyBondTakesLife[];\nextern const u8 BattleScript_SpikesOnAttacker[];\nextern const u8 BattleScript_SpikesOnTarget[];\nextern const u8 BattleScript_SpikesOngBank1[];\nextern const u8 BattleScript_PerishSongTakesLife[];\nextern const u8 BattleScript_PerishSongCountGoesDown[];\nextern const u8 BattleScript_AllStatsUp[];\nextern const u8 BattleScript_RapidSpinAway[];\nextern const u8 BattleScript_WrapFree[];\nextern const u8 BattleScript_LeechSeedFree[];\nextern const u8 BattleScript_SpikesFree[];\nextern const u8 BattleScript_MonTookFutureAttack[];\nextern const u8 BattleScript_NoMovesLeft[];\nextern const u8 BattleScript_SelectingMoveWithNoPP[];\nextern const u8 BattleScript_NoPPForMove[];\nextern const u8 BattleScript_SelectingTormentedMove[];\nextern const u8 BattleScript_MoveUsedIsTormented[];\nextern const u8 BattleScript_SelectingTormentedMoveInPalace[];\nextern const u8 BattleScript_SelectingNotAllowedMoveTaunt[];\nextern const u8 BattleScript_MoveUsedIsTaunted[];\nextern const u8 BattleScript_SelectingNotAllowedMoveTauntInPalace[];\nextern const u8 BattleScript_WishComesTrue[];\nextern const u8 BattleScript_IngrainTurnHeal[];\nextern const u8 BattleScript_AtkDefDown[];\nextern const u8 BattleScript_KnockedOff[];\nextern const u8 BattleScript_MoveUsedIsImprisoned[];\nextern const u8 BattleScript_SelectingImprisonedMove[];\nextern const u8 BattleScript_SelectingImprisonedMoveInPalace[];\nextern const u8 BattleScript_GrudgeTakesPp[];\nextern const u8 BattleScript_MagicCoatBounce[];\nextern const u8 BattleScript_SnatchedMove[];\nextern const u8 BattleScript_EnduredMsg[];\nextern const u8 BattleScript_OneHitKOMsg[];\nextern const u8 BattleScript_SAtkDown2[];\nextern const u8 BattleScript_FocusPunchSetUp[];\nextern const u8 BattleScript_MoveUsedIsAsleep[];\nextern const u8 BattleScript_MoveUsedWokeUp[];\nextern const u8 BattleScript_MonWokeUpInUproar[];\nextern const u8 BattleScript_PoisonTurnDmg[];\nextern const u8 BattleScript_BurnTurnDmg[];\nextern const u8 BattleScript_MoveUsedIsFrozen[];\nextern const u8 BattleScript_MoveUsedUnfroze[];\nextern const u8 BattleScript_DefrostedViaFireMove[];\nextern const u8 BattleScript_MoveUsedIsParalyzed[];\nextern const u8 BattleScript_MoveUsedFlinched[];\nextern const u8 BattleScript_PrintUproarOverTurns[];\nextern const u8 BattleScript_ThrashConfuses[];\nextern const u8 BattleScript_MoveUsedIsConfused[];\nextern const u8 BattleScript_MoveUsedIsConfusedNoMore[];\nextern const u8 BattleScript_PrintPayDayMoneyString[];\nextern const u8 BattleScript_WrapTurnDmg[];\nextern const u8 BattleScript_WrapEnds[];\nextern const u8 BattleScript_MoveUsedIsInLove[];\nextern const u8 BattleScript_MoveUsedIsInLoveCantAttack[];\nextern const u8 BattleScript_MoveUsedIsParalyzedCantAttack[];\nextern const u8 BattleScript_NightmareTurnDmg[];\nextern const u8 BattleScript_CurseTurnDmg[];\nextern const u8 BattleScript_TargetPRLZHeal[];\nextern const u8 BattleScript_MoveEffectSleep[];\nextern const u8 BattleScript_YawnMakesAsleep[];\nextern const u8 BattleScript_MoveEffectPoison[];\nextern const u8 BattleScript_MoveEffectBurn[];\nextern const u8 BattleScript_MoveEffectFreeze[];\nextern const u8 BattleScript_MoveEffectParalysis[];\nextern const u8 BattleScript_MoveEffectUproar[];\nextern const u8 BattleScript_MoveEffectToxic[];\nextern const u8 BattleScript_MoveEffectPayDay[];\nextern const u8 BattleScript_MoveEffectWrap[];\nextern const u8 BattleScript_MoveEffectConfusion[];\nextern const u8 BattleScript_MoveEffectRecoil33[];\nextern const u8 BattleScript_DoRecoil33[];\nextern const u8 BattleScript_Recoil33End[];\nextern const u8 BattleScript_ItemSteal[];\nextern const u8 BattleScript_DrizzleActivates[];\nextern const u8 BattleScript_SpeedBoostActivates[];\nextern const u8 BattleScript_TraceActivates[];\nextern const u8 BattleScript_RainDishActivates[];\nextern const u8 BattleScript_SandstreamActivates[];\nextern const u8 BattleScript_ShedSkinActivates[];\nextern const u8 BattleScript_WeatherFormChanges[];\nextern const u8 BattleScript_WeatherFormChangesLoop[];\nextern const u8 BattleScript_CastformChange[];\nextern const u8 BattleScript_DroughtActivates[];\nextern const u8 BattleScript_TookAttack[];\nextern const u8 BattleScript_SturdyPreventsOHKO[];\nextern const u8 BattleScript_DampStopsExplosion[];\nextern const u8 BattleScript_MoveHPDrain_PPLoss[];\nextern const u8 BattleScript_MoveHPDrain[];\nextern const u8 BattleScript_MonMadeMoveUseless_PPLoss[];\nextern const u8 BattleScript_MonMadeMoveUseless[];\nextern const u8 BattleScript_FlashFireBoost_PPLoss[];\nextern const u8 BattleScript_FlashFireBoost[];\nextern const u8 BattleScript_AbilityNoStatLoss[];\nextern const u8 BattleScript_BRNPrevention[];\nextern const u8 BattleScript_PRLZPrevention[];\nextern const u8 BattleScript_PSNPrevention[];\nextern const u8 BattleScript_ObliviousPreventsAttraction[];\nextern const u8 BattleScript_FlinchPrevention[];\nextern const u8 BattleScript_OwnTempoPrevents[];\nextern const u8 BattleScript_SoundproofProtected[];\nextern const u8 BattleScript_AbilityNoSpecificStatLoss[];\nextern const u8 BattleScript_StickyHoldActivates[];\nextern const u8 BattleScript_ColorChangeActivates[];\nextern const u8 BattleScript_RoughSkinActivates[];\nextern const u8 BattleScript_CuteCharmActivates[];\nextern const u8 BattleScript_ApplySecondaryEffect[];\nextern const u8 BattleScript_SynchronizeActivates[];\nextern const u8 BattleScript_NoItemSteal[];\nextern const u8 BattleScript_AbilityCuredStatus[];\nextern const u8 BattleScript_IgnoresAndUsesRandomMove[];\nextern const u8 BattleScript_MoveUsedLoafingAround[];\nextern const u8 BattleScript_IgnoresAndFallsAsleep[];\nextern const u8 BattleScript_SubstituteFade[];\nextern const u8 BattleScript_BerryCurePrlzEnd2[];\nextern const u8 BattleScript_BerryCureParRet[];\nextern const u8 BattleScript_BerryCurePsnEnd2[];\nextern const u8 BattleScript_BerryCurePsnRet[];\nextern const u8 BattleScript_BerryCureBrnEnd2[];\nextern const u8 BattleScript_BerryCureBrnRet[];\nextern const u8 BattleScript_BerryCureFrzEnd2[];\nextern const u8 BattleScript_BerryCureFrzRet[];\nextern const u8 BattleScript_BerryCureSlpEnd2[];\nextern const u8 BattleScript_BerryCureSlpRet[];\nextern const u8 BattleScript_BerryCureConfusionEnd2[];\nextern const u8 BattleScript_BerryCureConfusionRet[];\nextern const u8 BattleScript_BerryCureChosenStatusEnd2[];\nextern const u8 BattleScript_BerryCureChosenStatusRet[];\nextern const u8 BattleScript_WhiteHerbEnd2[];\nextern const u8 BattleScript_WhiteHerbRet[];\nextern const u8 BattleScript_ItemHealHP_RemoveItem[];\nextern const u8 BattleScript_BerryPPHealEnd2[];\nextern const u8 BattleScript_ItemHealHP_End2[];\nextern const u8 BattleScript_ItemHealHP_Ret[];\nextern const u8 BattleScript_SelectingNotAllowedMoveChoiceItem[];\nextern const u8 BattleScript_FocusBandActivates[];\nextern const u8 BattleScript_BerryConfuseHealEnd2[];\nextern const u8 BattleScript_BerryStatRaiseEnd2[];\nextern const u8 BattleScript_BerryFocusEnergyEnd2[];\nextern const u8 BattleScript_ActionSelectionItemsCantBeUsed[];\nextern const u8 BattleScript_AskIfWantsToForfeitMatch[];\nextern const u8 BattleScript_PrintPlayerForfeited[];\nextern const u8 BattleScript_PrintPlayerForfeitedLinkBattle[];\nextern const u8 BattleScript_BallThrow[];\nextern const u8 BattleScript_BallThrowByWally[];\nextern const u8 BattleScript_SafariBallThrow[];\nextern const u8 BattleScript_SuccessBallThrow[];\nextern const u8 BattleScript_SuccessBallThrowForceNick[];\nextern const u8 BattleScript_WallyBallThrow[];\nextern const u8 BattleScript_ShakeBallThrow[];\nextern const u8 BattleScript_TrainerBallBlock[];\nextern const u8 BattleScript_RunByUsingItem[];\nextern const u8 BattleScript_ActionWatchesCarefully[];\nextern const u8 BattleScript_ActionGetNear[];\nextern const u8 BattleScript_ActionThrowPokeblock[];\nextern const u8 BattleScript_GhostGetOutGetOut[];\nextern const u8 BattleScript_TooScaredToMove[];\nextern const u8 BattleScript_IntimidateActivates[];\nextern const u8 BattleScript_IntimidateActivatesEnd3[];\nextern const u8 BattleScript_IgnoresWhileAsleep[];\nextern const u8 BattleScript_IgnoresAndHitsItself[];\nextern const u8 BattleScript_MoveEffectRecoil[];\nextern const u8 BattleScript_FlushMessageBox[];\nextern const u8 BattleScript_SpikesOnFaintedBattler[];\nextern const u8 BattleScript_GhostBallDodge[];\nextern const u8 BattleScript_OldMan_Pokedude_CaughtMessage[];\nextern const u8 BattleScript_SilphScopeUnveiled[];\nextern const u8 BattleScript_BattleTowerTrainerBattleWon[];\nextern const u8 BattleScript_PickedUpItem[];\nextern const u8 BattleScript_PickedUpItemSolo[];\n\nextern const u8 *const gBattleScriptsForMoveEffects[];\nextern const u8 *const gBattlescriptsForBallThrow[];\nextern const u8 *const gBattlescriptsForRunningByItem[];\nextern const u8 *const gBattlescriptsForUsingItem[];\nextern const u8 *const gBattlescriptsForSafariActions[];\n\n#endif // GUARD_BATTLE_SCRIPTS_H\n"
  },
  {
    "path": "include/battle_setup.h",
    "content": "#ifndef GUARD_BATTLE_SETUP_H\n#define GUARD_BATTLE_SETUP_H\n\n#include \"global.h\"\n\nvoid StartWildBattle(void);\nvoid StartRoamerBattle(void);\nvoid StartOldManTutorialBattle(void);\nvoid StartScriptedWildBattle(void);\nvoid StartMarowakBattle(void);\nvoid StartSouthernIslandBattle(void);\nvoid StartLegendaryBattle(void);\nvoid StartGroudonKyogreBattle(void);\nvoid StartRegiBattle(void);\nu8 BattleSetup_GetTerrainId(void);\nu8 BattleSetup_GetBattleTowerBattleTransition(void);\nconst u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data);\nvoid ConfigureAndSetUpOneTrainerBattle(u8 trainerEventObjId, const u8 *trainerScript);\nbool32 GetTrainerFlagFromScriptPointer(const u8 *data);\nvoid SetUpTrainerMovement(void);\nu8 GetTrainerBattleMode(void);\nu16 GetRivalBattleFlags(void);\nvoid SetBattledTrainerFlag(void);\nbool8 HasTrainerBeenFought(u16 trainerId);\nvoid SetTrainerFlag(u16 trainerId);\nvoid ClearTrainerFlag(u16 trainerId);\nvoid StartTrainerBattle(void);\nvoid StartRematchBattle(void);\nvoid ShowTrainerIntroSpeech(void);\nconst u8 *BattleSetup_GetScriptAddrAfterBattle(void);\nconst u8 *BattleSetup_GetTrainerPostBattleScript(void);\nvoid ShowTrainerCantBattleSpeech(void);\nvoid PlayTrainerEncounterMusic(void);\nconst u8 *GetTrainerALoseText(void);\nconst u8 *GetTrainerWonSpeech(void);\ns8 GetScaledLevel(void);\nbool8 IsWildMonNuzlockeDupe(u16 species);\nbool8 CheckNuzlockeDupeFlags(u16 species);\nvoid SetNuzlockeDupeFlags(u16 species);\n\n#endif // GUARD_BATTLE_SETUP_H\n"
  },
  {
    "path": "include/battle_tower.h",
    "content": "#ifndef GUARD_BATTLE_TOWER_H\n#define GUARD_BATTLE_TOWER_H\n\n#include \"global.h\"\n#include \"constants/battle_tower.h\"\n\n#define BATTLE_TOWER_EREADER_TRAINER_ID 200\n#define BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID 100\n\nstruct BattleTowerTrainer\n{\n    u8 trainerClass;\n    u8 name[8];\n    u8 teamFlags;\n    u16 greeting[6];\n};\n\nstruct BattleTowerPokemonTemplate\n{\n    u16 species;\n    u8 heldItem;\n    u8 teamFlags;\n    u16 moves[4];\n    u8 evSpread;\n    u8 nature;\n};\n\nextern const u16 gBattleTowerBannedSpecies[];\n\nvoid ClearEReaderTrainer(struct BattleTowerEReaderTrainer *);\nvoid ValidateEReaderTrainer(void);\nu8 GetBattleTowerTrainerFrontSpriteId(void);\nu8 GetEreaderTrainerFrontSpriteId(void);\nvoid CopyEReaderTrainerName5(u8 *dest);\nvoid GetBattleTowerTrainerName(u8 *text);\nu8 GetEreaderTrainerClassId(void);\nu8 GetBattleTowerTrainerClassNameId(void);\ns32 GetHighestLevelInPlayerParty(void);\n\n#endif //GUARD_BATTLE_TOWER_H\n"
  },
  {
    "path": "include/battle_transition.h",
    "content": "#ifndef GUARD_BATTLE_TRANSITION_H\n#define GUARD_BATTLE_TRANSITION_H\n\n#include \"global.h\"\n\nenum\n{\n    MUGSHOT_LORELEI,\n    MUGSHOT_BRUNO,\n    MUGSHOT_AGATHA,\n    MUGSHOT_LANCE,\n    MUGSHOT_BLUE,\n    MUGSHOT_OAK,\n    MUGSHOTS_COUNT\n};\n\nenum {\n    B_TRANSITION_BLUR,\n    B_TRANSITION_SWIRL,\n    B_TRANSITION_SHUFFLE,\n    B_TRANSITION_BIG_POKEBALL,\n    B_TRANSITION_POKEBALLS_TRAIL,\n    B_TRANSITION_CLOCKWISE_WIPE,\n    B_TRANSITION_RIPPLE,\n    B_TRANSITION_WAVE,\n    B_TRANSITION_SLICE, \n    B_TRANSITION_WHITE_BARS_FADE,\n    B_TRANSITION_GRID_SQUARES,\n    B_TRANSITION_ANGLED_WIPES,\n    B_TRANSITION_LORELEI,\n    B_TRANSITION_BRUNO,\n    B_TRANSITION_AGATHA,\n    B_TRANSITION_LANCE,\n    B_TRANSITION_BLUE,\n    B_TRANSITION_SPIRAL,\n    B_TRANSITION_OAK,\n    B_TRANSITION_COUNT\n};\n\nextern const struct SpritePalette gSpritePalette_Pokeball;\n\nbool8 IsBattleTransitionDone(void);\nvoid BattleTransition_StartOnField(u8 transitionId);\nbool8 FldEff_PokeballTrail(void);\n\n#endif // GUARD_BATTLE_TRANSITION_H\n"
  },
  {
    "path": "include/battle_util.h",
    "content": "#ifndef GUARD_BATTLE_UTIL_H\n#define GUARD_BATTLE_UTIL_H\n\n#include \"global.h\"\n\n#define MOVE_LIMITATION_ZEROMOVE                (1 << 0)\n#define MOVE_LIMITATION_PP                      (1 << 1)\n#define MOVE_LIMITATION_DISABLED                (1 << 2)\n#define MOVE_LIMITATION_TORMENTED               (1 << 3)\n#define MOVE_LIMITATION_TAUNT                   (1 << 4)\n#define MOVE_LIMITATION_IMPRISON                (1 << 5)\n#define MOVE_LIMITATIONS_ALL                    0xFF\n\n#define ABILITYEFFECT_ON_SWITCHIN                0\n#define ABILITYEFFECT_ENDTURN                    1\n#define ABILITYEFFECT_MOVES_BLOCK                2\n#define ABILITYEFFECT_ABSORBING                  3\n#define ABILITYEFFECT_ON_DAMAGE                  4\n#define ABILITYEFFECT_IMMUNITY                   5\n#define ABILITYEFFECT_FORECAST                   6\n#define ABILITYEFFECT_SYNCHRONIZE                7\n#define ABILITYEFFECT_ATK_SYNCHRONIZE            8\n#define ABILITYEFFECT_INTIMIDATE1                9\n#define ABILITYEFFECT_INTIMIDATE2                10\n#define ABILITYEFFECT_TRACE                      11\n#define ABILITYEFFECT_CHECK_OTHER_SIDE           12\n#define ABILITYEFFECT_CHECK_BATTLER_SIDE         13\n#define ABILITYEFFECT_FIELD_SPORT                14\n#define ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER 15\n#define ABILITYEFFECT_COUNT_OTHER_SIDE           16\n#define ABILITYEFFECT_COUNT_BATTLER_SIDE         17\n#define ABILITYEFFECT_COUNT_ON_FIELD             18\n#define ABILITYEFFECT_CHECK_ON_FIELD             19\n#define ABILITYEFFECT_MUD_SPORT                  253\n#define ABILITYEFFECT_WATER_SPORT                254\n#define ABILITYEFFECT_SWITCH_IN_WEATHER          255\n\n#define ABILITY_ON_OPPOSING_FIELD(battlerId, abilityId)(AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, battlerId, abilityId, 0, 0))\n#define ABILITY_ON_FIELD(abilityId)(AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, abilityId, 0, 0))\n#define ABILITY_ON_FIELD2(abilityId)(AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, abilityId, 0, 0))\n\n// For the first argument of ItemBattleEffects, to deteremine which block of item effects to try\n#define ITEMEFFECT_ON_SWITCH_IN                 0\n#define ITEMEFFECT_NORMAL                       1\n#define ITEMEFFECT_DUMMY                        2 // Unused, empty\n#define ITEMEFFECT_MOVE_END                     3\n#define ITEMEFFECT_KINGSROCK_SHELLBELL          4\n\n#define WEATHER_HAS_EFFECT ((!AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_AIR_LOCK, 0, 0)))\n#define WEATHER_HAS_EFFECT2 ((!AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_AIR_LOCK, 0, 0)))\n\n#define BS_GET_TARGET                   0\n#define BS_GET_ATTACKER                 1\n#define BS_GET_EFFECT_BANK              2\n#define BS_GET_SCRIPTING_BANK           10\n#define BS_GET_PLAYER1                  11\n#define BS_GET_OPPONENT1                12\n#define BS_GET_PLAYER2                  13\n#define BS_GET_OPPONENT2                14\n\nu8 GetBattlerForBattleScript(u8 caseId);\nvoid PressurePPLose(u8 target, u8 attacker, u16 move);\nvoid PressurePPLoseOnUsingImprison(u8 attacker);\nvoid PressurePPLoseOnUsingPerishSong(u8 attacker);\nvoid MarkBattlerForControllerExec(u8 battlerId);\nvoid MarkBattlerReceivedLinkData(u8 battlerId);\nvoid CancelMultiTurnMoves(u8 battler);\nbool8 WasUnableToUseMove(u8 battler);\nvoid PrepareStringBattle(u16 stringId, u8 battler);\nvoid ResetSentPokesToOpponentValue(void);\nvoid OpponentSwitchInResetSentPokesToOpponentValue(u8 battler);\nvoid UpdateSentPokesToOpponentValue(u8 battler);\nvoid BattleScriptPush(const u8 *bsPtr);\nvoid BattleScriptPushCursor(void);\nvoid BattleScriptPop(void);\nu8 TrySetCantSelectMoveBattleScript(void);\nu8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check);\nbool8 AreAllMovesUnusable(void);\nu8 GetImprisonedMovesCount(u8 battlerId, u16 move);\nu8 DoFieldEndTurnEffects(void);\nu8 DoBattlerEndTurnEffects(void);\nbool8 HandleWishPerishSongOnTurnEnd(void);\nbool8 HandleFaintedMonActions(void);\nvoid TryClearRageStatuses(void);\nu8 AtkCanceller_UnableToUseMove(void);\nbool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2);\nu8 CastformDataTypeChange(u8 battler);\nu8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg);\nvoid BattleScriptExecute(const u8 *BS_ptr);\nvoid BattleScriptPushCursorAndCallback(const u8 *BS_ptr);\nu8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn);\nvoid ClearFuryCutterDestinyBondGrudge(u8 battlerId);\nvoid HandleAction_RunBattleScript(void);\nu8 GetMoveTarget(u16 move, u8 setTarget);\nu8 IsMonDisobedient(void);\n\n#endif // GUARD_BATTLE_UTIL_H\n"
  },
  {
    "path": "include/battle_util2.h",
    "content": "#ifndef GUARD_BATTLE_UTIL2_H\n#define GUARD_BATTLE_UTIL2_H\n\n#include \"global.h\"\n\nvoid AllocateBattleResources(void);\nvoid FreeBattleResources(void);\nvoid AdjustFriendshipOnBattleFaint(u8 bank);\n\n#endif // GUARD_BATTLE_UTIL_H\n"
  },
  {
    "path": "include/berry.h",
    "content": "#ifndef GUARD_BERRY_H\n#define GUARD_BERRY_H\n\n#include \"global.h\"\n\nenum\n{\n    BERRY_FIRMNESS_UNKNOWN,\n    BERRY_FIRMNESS_VERY_SOFT,\n    BERRY_FIRMNESS_SOFT,\n    BERRY_FIRMNESS_HARD,\n    BERRY_FIRMNESS_VERY_HARD,\n    BERRY_FIRMNESS_SUPER_HARD,\n};\n\nenum\n{\n    FLAVOR_SPICY,\n    FLAVOR_DRY,\n    FLAVOR_SWEET,\n    FLAVOR_BITTER,\n    FLAVOR_SOUR,\n    FLAVOR_COUNT\n};\n\n#define NUM_BERRIES 44\n\nvoid ClearEnigmaBerries(void);\nvoid SetEnigmaBerry(u8 *src);\nbool32 IsEnigmaBerryValid(void);\nconst struct Berry *GetBerryInfo(u8 berry);\nu8 ItemIdToBerryType(u16 item);\nvoid GetBerryNameByBerryType(u8 berry, u8 *string);\n\nextern const struct Berry gBerries[];\n\nstruct BerryCrushStats {\n    u8 difficulty;\n    u16 powder;\n};\n\nextern const struct BerryCrushStats gBerryCrush_BerryData[];\n\n#endif // GUARD_BERRY_H\n"
  },
  {
    "path": "include/berry_crush.h",
    "content": "#ifndef GUARD_BERRY_CRUSH_H\n#define GUARD_BERRY_CRUSH_H\n\n#include \"main.h\"\n\nvoid StartBerryCrush(MainCallback callback);\nvoid ShowBerryCrushRankings(void);\n\n#endif // GUARD_BERRY_CRUSH_H\n"
  },
  {
    "path": "include/berry_fix_program.h",
    "content": "#ifndef GUARD_BERRY_FIX_PROGRAM_H\n#define GUARD_BERRY_FIX_PROGRAM_H\n\nvoid CB2_InitBerryFixProgram(void);\n\n#endif //GUARD_BERRY_FIX_PROGRAM_H\n"
  },
  {
    "path": "include/berry_pouch.h",
    "content": "#ifndef GUARD_BERRY_POUCH_H\n#define GUARD_BERRY_POUCH_H\n\n#include \"task.h\"\n\nenum BerryPouchType\n{\n    BERRYPOUCH_FROMFIELD,\n    BERRYPOUCH_FROMPARTYGIVE,\n    BERRYPOUCH_FROMMARTSELL,\n    BERRYPOUCH_FROMPOKEMONSTORAGEPC,\n    BERRYPOUCH_FROMBATTLE,\n    BERRYPOUCH_FROMBERRYCRUSH,\n    BERRYPOUCH_NA\n};\n\nvoid BerryPouch_StartFadeToExitCallback(u8 taskId);\nvoid BerryPouch_SetExitCallback(void (*exitCallback)(void));\nvoid InitBerryPouch(u8 type, void (*savedCallback)(void), u8 allowSelect);\nvoid DisplayItemMessageInBerryPouch(u8 taskId, u8 fontId, const u8 * str, TaskFunc followUpFunc);\nvoid Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu(u8 taskId);\nvoid BerryPouch_CursorResetToTop(void);\n\n#endif //GUARD_BERRY_POUCH_H\n"
  },
  {
    "path": "include/berry_powder.h",
    "content": "#ifndef GUARD_BERRY_POWDER_H\n#define GUARD_BERRY_POWDER_H\n\nu32 GetBerryPowder(void);\nvoid SetBerryPowder(u32 *powder, u32 amount);\nvoid ApplyNewEncryptionKeyToBerryPowder(u32 newKey);\nbool8 GiveBerryPowder(u32 amountToAdd);\n\n#endif //GUARD_BERRY_POWDER_H\n"
  },
  {
    "path": "include/bg.h",
    "content": "#ifndef GUARD_BG_H\n#define GUARD_BG_H\n\n#include \"global.h\"\n\nstruct BGCntrlBitfield // for the I/O registers\n{\n    volatile u16 priority:2;\n    volatile u16 charBaseBlock:2;\n    volatile u16 field_0_2:4;\n    volatile u16 field_1_0:5;\n    volatile u16 areaOverflowMode:1;\n    volatile u16 screenSize:2;\n};\n\nenum\n{\n    BG_CTRL_ATTR_VISIBLE = 1,\n    BG_CTRL_ATTR_CHARBASEINDEX = 2,\n    BG_CTRL_ATTR_MAPBASEINDEX = 3,\n    BG_CTRL_ATTR_SCREENSIZE = 4,\n    BG_CTRL_ATTR_PALETTEMODE = 5,\n    BG_CTRL_ATTR_PRIORITY = 6,\n    BG_CTRL_ATTR_MOSAIC = 7,\n    BG_CTRL_ATTR_WRAPAROUND = 8,\n};\n\nenum\n{\n    BG_ATTR_CHARBASEINDEX = 1,\n    BG_ATTR_MAPBASEINDEX = 2,\n    BG_ATTR_SCREENSIZE = 3,\n    BG_ATTR_PALETTEMODE = 4,\n    BG_ATTR_MOSAIC = 5,\n    BG_ATTR_WRAPAROUND = 6,\n    BG_ATTR_PRIORITY = 7,\n    BG_ATTR_MAPSIZE = 8,\n    BG_ATTR_BGTYPE = 9,\n    BG_ATTR_BASETILE = 10\n};\n\n// Modes for ChangeBgX / ChangeBgY\nenum {\n    BG_COORD_SET,\n    BG_COORD_ADD,\n    BG_COORD_SUB,\n};\n\nenum AdjustBgMosaicMode\n{\n    BG_MOSAIC_SET,\n    BG_MOSAIC_SET_H,\n    BG_MOSAIC_INC_H,\n    BG_MOSAIC_DEC_H,\n    BG_MOSAIC_SET_V,\n    BG_MOSAIC_INC_V,\n    BG_MOSAIC_DEC_V,\n};\n\nenum BgTileAllocMode\n{\n    BG_TILE_FIND_FREE_SPACE,\n    BG_TILE_ALLOC,\n    BG_TILE_FREE,\n};\n\nstruct BgTemplate\n{\n    u16 bg:2;                   // 0x1, 0x2 -> 0x3\n    u16 charBaseIndex:2;        // 0x4, 0x8 -> 0xC\n    u16 mapBaseIndex:5;         // 0x10, 0x20, 0x40, 0x80, 0x100 -> 0x1F0\n    u16 screenSize:2;           // 0x200, 0x400 -> 0x600\n    u16 paletteMode:1;          // 0x800\n    u16 priority:2;             // 0x1000, 0x2000 > 0x3000\n    u16 baseTile:10;\n};\n\nvoid ResetBgs(void);\nu8 GetBgMode(void);\nvoid ResetBgControlStructs(void);\nvoid Unused_ResetBgControlStruct(u8 bg);\nvoid SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound);\nu16 GetBgControlAttribute(u8 bg, u8 attributeId);\nu8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode);\nvoid SetTextModeAndHideBgs(void);\nbool8 IsInvalidBg(u8 bg);\nint BgTileAllocOp(int bg, int offset, int count, int mode);\nvoid ResetBgsAndClearDma3BusyFlags(bool32 enableWindowTileAutoAlloc);\nvoid InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates);\nvoid InitBgFromTemplate(const struct BgTemplate *template);\nvoid SetBgMode(u8 bgMode);\nu16 LoadBgTiles(u8 bg, const void *src, u16 size, u16 destOffset);\nu16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset);\nu16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset);\nbool8 IsDma3ManagerBusyWithBgCopy(void);\nvoid ShowBg(u8 bg);\nvoid HideBg(u8 bg);\nvoid SetBgAttribute(u8 bg, u8 attributeId, u8 value);\nu16 GetBgAttribute(u8 bg, u8 attributeId);\nu32 ChangeBgX(u8 bg, u32 value, u8 op);\nu32 GetBgX(u8 bg);\nu32 ChangeBgY(u8 bg, u32 value, u8 op);\nu32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op);\nu32 GetBgY(u8 bg);\nvoid SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle);\nu8 AdjustBgMosaic(u8 value, u8 mode);\nvoid SetBgTilemapBuffer(u8 bg, void *tilemap);\nvoid UnsetBgTilemapBuffer(u8 bg);\nvoid *GetBgTilemapBuffer(u8 bg);\nvoid CopyToBgTilemapBuffer(u8 bg, const void *src, u16 mode, u16 destOffset);\nvoid CopyBgTilemapBufferToVram(u8 bg);\nvoid CopyToBgTilemapBufferRect(u8 bg, const void *src, u8 destX, u8 destY, u8 width, u8 height);\nvoid CopyToBgTilemapBufferRect_ChangePalette(u8 bg, const void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette);\nvoid CopyRectToBgTilemapBufferRect(u8 bg, const void *src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, s16 tileOffset, s16 palette2);\nvoid FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height);\nvoid FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette);\nvoid WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta);\nu16 GetBgMetricTextMode(u8 bg, u8 whichMetric);\nu32 GetBgMetricAffineMode(u8 bg, u8 whichMetric);\nu32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32 screenHeight);\nvoid CopyTileMapEntry(const u16 *src, u16 *dest, s32 palette1, s32 tileOffset, s32 palette2);\nu32 GetBgType(u8 bg);\nbool32 IsInvalidBg32(u8 bg);\nbool32 IsTileMapOutsideWram(u8 bg);\n\nextern bool32 gWindowTileAutoAllocEnabled;\n\n#endif // GUARD_BG_H\n"
  },
  {
    "path": "include/bg_regs.h",
    "content": "#ifndef GUARD_BG_REGS_H\n#define GUARD_BG_REGS_H\n\nextern const u8 gBGControlRegOffsets[];\nextern const u16 gOverworldBackgroundLayerFlags[];\n\n#endif //GUARD_BG_REGS_H\n"
  },
  {
    "path": "include/bike.h",
    "content": "#ifndef GUARD_BIKE_H\n#define GUARD_BIKE_H\n\n// TODO: Do the constants make sense in FRLG? \n\n// Player speeds\nenum\n{\n    PLAYER_SPEED_STANDING,\n    PLAYER_SPEED_NORMAL,\n    PLAYER_SPEED_FAST,\n    PLAYER_SPEED_FASTER,\n    PLAYER_SPEED_FASTEST,\n};\n\nenum {\n    BIKE_TRANS_FACE_DIRECTION,\n    BIKE_TRANS_TURNING,\n    BIKE_TRANS_MOVE,\n    BIKE_TRANS_DOWNHILL,\n    BIKE_TRANS_UPHILL\n};\n\nenum {\n    BIKE_STATE_NORMAL,\n    BIKE_STATE_TURNING,\n    BIKE_STATE_SLOPE\n};\n\n// Acro bike states\nenum\n{\n    ACRO_STATE_NORMAL,\n    ACRO_STATE_TURNING,\n    ACRO_STATE_WHEELIE_STANDING,\n    ACRO_STATE_BUNNY_HOP,\n    ACRO_STATE_WHEELIE_MOVING,\n    ACRO_STATE_SIDE_JUMP,\n    ACRO_STATE_TURN_JUMP,\n};\n\nvoid BikeClearState(u32 directionHistory, u32 abStartSelectHistory);\nbool8 IsBikingDisallowedByPlayer(void);\nvoid GetOnOffBike(u8 flags);\ns16 GetPlayerSpeed(void);\nbool8 RS_IsRunningDisallowed(u8 r0);\nvoid MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys);\nbool32 IsRunningDisallowed(u8 metatileBehavior);\nvoid Bike_HandleBumpySlopeJump(void);\nvoid Bike_UpdateBikeCounterSpeed(u8 counter);\nbool8 IsPlayerNotUsingAcroBikeOnBumpySlope(void);\n\n#endif //GUARD_BIKE_H\n"
  },
  {
    "path": "include/blend_palette.h",
    "content": "#ifndef GUARD_BLEND_PALETTE_H\n#define GUARD_BLEND_PALETTE_H\n\n#include \"global.h\"\n\n// Exported type declarations\n\n// Exported RAM declarations\n\n// Exported ROM declarations\n\nvoid BlendPalette(u16, u16, u8, u16);\nvoid BlendPalettesAt(u16 * palbuff, u16 blend_pal, u32 coefficient, s32 size);\n\n#endif //GUARD_BLEND_PALETTE_H\n"
  },
  {
    "path": "include/blit.h",
    "content": "#ifndef GUARD_BLIT_H\n#define GUARD_BLIT_H\n\nstruct Bitmap\n{\n    u8 *pixels;\n    u32 width:16;\n    u32 height:16;\n};\n\nvoid BlitBitmapRect4BitWithoutColorKey(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height);\nvoid BlitBitmapRect4Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey);\nvoid FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);\nvoid BlitBitmapRect4BitTo8Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey, u8 paletteOffset);\nvoid FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);\n\n#endif // GUARD_BLIT_H\n"
  },
  {
    "path": "include/cable_club.h",
    "content": "#ifndef GUARD_CABLE_CLUB_H\n#define GUARD_CABLE_CLUB_H\n\nvoid Task_WaitForLinkPlayerConnection(u8 taskId);\nu8 CreateTask_ReestablishCableClubLink(void);\nvoid CB2_ReturnFromCableClubBattle(void);\nbool32 GetSeeingLinkPlayerCardMsg(u8 who);\n\n#endif //GUARD_CABLE_CLUB_H\n"
  },
  {
    "path": "include/calculate_base_damage.h",
    "content": "#ifndef GUARD_CALCULATE_BASE_DAMAGE_H\n#define GUARD_CALCULATE_BASE_DAMAGE_H\n\n#include \"global.h\"\n\ns32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 bankAtk, u8 bankDef);\n\n#endif // GUARD_CALCULATE_BASE_DAMAGE_H\n"
  },
  {
    "path": "include/cereader_tool.h",
    "content": "#ifndef GUARD_CEREADER_TOOL_H\n#define GUARD_CEREADER_TOOL_H\n\n#include \"global.h\"\n#include \"constants/trainer_tower.h\"\n\nstruct TrainerTowerTrainer\n{\n    /* 0x000 */ u8 name[11];\n    /* 0x00B */ u8 facilityClass;\n    /* 0x00C */ u8 textColor;\n    /* 0x00E */ u16 speechBefore[6];\n    /* 0x01A */ u16 speechWin[6];\n    /* 0x026 */ u16 speechLose[6];\n    /* 0x032 */ u16 speechAfter[6];\n    /* 0x040 */ struct BattleTowerPokemon mons[PARTY_SIZE];\n}; // size: 328\n\nstruct TrainerTowerFloor\n{\n    /* 0x000 */ u8 id;\n    /* 0x001 */ u8 floorIdx;\n    /* 0x002 */ u8 challengeType;\n    /* 0x003 */ u8 prize;\n    /* 0x004 */ struct TrainerTowerTrainer trainers[MAX_TRAINERS_PER_FLOOR];\n    /* 0x3DC */ u32 checksum;\n};\n\nstruct EReaderTrainerTowerSetSubstruct\n{\n    u8 numFloors;\n    u8 id;\n    u16 dummy;\n    u32 checksum;\n};\n\nstruct EReaderTrainerTowerSet\n{\n    u8 numFloors;\n    u8 id;\n    u16 dummy;\n    u32 checksum;\n    struct TrainerTowerFloor floors[MAX_TRAINER_TOWER_FLOORS];\n};\n\nbool32 ValidateTrainerTowerData(struct EReaderTrainerTowerSet * ttdata);\nbool32 CEReaderTool_SaveTrainerTower(struct EReaderTrainerTowerSet * ttdata);\nbool32 CEReaderTool_LoadTrainerTower(struct EReaderTrainerTowerSet * ttdata);\nbool32 ReadTrainerTowerAndValidate(void);\n\n#endif //GUARD_CEREADER_TOOL_H\n"
  },
  {
    "path": "include/characters.h",
    "content": "#ifndef GUARD_CHARACTERS_H\n#define GUARD_CHARACTERS_H\n\n#define CHAR_SPACE             0x00\n#define CHAR_A_GRAVE           0x01\n#define CHAR_A_ACUTE           0x02\n#define CHAR_A_CIRCUMFLEX      0x03\n#define CHAR_C_CEDILLA         0x04\n#define CHAR_E_GRAVE           0x05\n#define CHAR_E_ACUTE           0x06\n#define CHAR_E_CIRCUMFLEX      0x07\n#define CHAR_E_DIAERESIS       0x08\n#define CHAR_I_GRAVE           0x09\n//#define CHAR_I_ACUTE         0x0A // Is 0x5A instead\n#define CHAR_I_CIRCUMFLEX      0x0B\n#define CHAR_I_DIAERESIS       0x0C\n#define CHAR_O_GRAVE           0x0D\n#define CHAR_O_ACUTE           0x0E\n#define CHAR_O_CIRCUMFLEX      0x0F\n#define CHAR_OE                0x10\n#define CHAR_U_GRAVE           0x11\n#define CHAR_U_ACUTE           0x12\n#define CHAR_U_CIRCUMFLEX      0x13\n#define CHAR_N_TILDE           0x14\n#define CHAR_ESZETT            0x15\n#define CHAR_a_GRAVE           0x16\n#define CHAR_a_ACUTE           0x17\n//#define CHAR_a_CIRCUMFLEX    0x18 // Is 0x68 instead\n#define CHAR_c_CEDILLA         0x19\n#define CHAR_e_GRAVE           0x1A\n#define CHAR_e_ACUTE           0x1B\n#define CHAR_e_CIRCUMFLEX      0x1C\n#define CHAR_e_DIAERESIS       0x1D\n#define CHAR_i_GRAVE           0x1E\n//#define CHAR_i_ACUTE         0x1F // Is 0x6F instead\n#define CHAR_i_CIRCUMFLEX      0x20\n#define CHAR_i_DIAERESIS       0x21\n#define CHAR_o_GRAVE           0x22\n#define CHAR_o_ACUTE           0x23\n#define CHAR_o_CIRCUMFLEX      0x24\n#define CHAR_oe                0x25\n#define CHAR_u_GRAVE           0x26\n#define CHAR_u_ACUTE           0x27\n#define CHAR_u_CIRCUMFLEX      0x28\n#define CHAR_n_TILDE           0x29\n#define CHAR_MASCULINE_ORDINAL 0x2A\n#define CHAR_FEMININE_ORDINAL  0x2B\n#define CHAR_SUPER_ER          0x2C\n#define CHAR_AMPERSAND         0x2D\n#define CHAR_PLUS              0x2E\n//\n#define CHAR_LV                0x34\n#define CHAR_EQUALS            0x35\n#define CHAR_SEMICOLON         0x36\n#define CHAR_BARD_WORD_DELIMIT 0x37 // Empty space to separate words in Bard's song\n//\n#define CHAR_EMPTY_RECT        0x50\n#define CHAR_INV_QUESTION_MARK 0x51\n#define CHAR_INV_EXCL_MARK     0x52\n#define CHAR_PK                0x53\n#define CHAR_MN                0x54\n#define CHAR_PO                0x55\n#define CHAR_KE                0x56\n#define CHAR_BLOCK_1           0x57 // Each of these 3\n#define CHAR_BLOCK_2           0x58 // chars contains 1/3\n#define CHAR_BLOCK_3           0x59 // of the word BLOCK\n#define CHAR_I_ACUTE           0x5A\n#define CHAR_PERCENT           0x5B\n#define CHAR_LEFT_PAREN        0x5C\n#define CHAR_RIGHT_PAREN       0x5D\n//\n#define CHAR_a_CIRCUMFLEX      0x68\n//\n#define CHAR_i_ACUTE           0x6F\n//\n#define CHAR_SPACER            0x77 // Empty space\n//\n#define CHAR_UP_ARROW          0x79\n#define CHAR_DOWN_ARROW        0x7A\n#define CHAR_LEFT_ARROW        0x7B\n#define CHAR_RIGHT_ARROW       0x7C\n#define CHAR_FONT_A_BUTTON     0x7D\n//\n#define CHAR_SUPER_E           0x84\n#define CHAR_LESS_THAN         0x85\n#define CHAR_GREATER_THAN      0x86\n//\n#define CHAR_SUPER_RE          0xA0\n#define CHAR_0                 0xA1\n#define CHAR_1                 0xA2\n#define CHAR_2                 0xA3\n#define CHAR_3                 0xA4\n#define CHAR_4                 0xA5\n#define CHAR_5                 0xA6\n#define CHAR_6                 0xA7\n#define CHAR_7                 0xA8\n#define CHAR_8                 0xA9\n#define CHAR_9                 0xAA\n#define CHAR_EXCL_MARK         0xAB\n#define CHAR_QUESTION_MARK     0xAC\n#define CHAR_PERIOD            0xAD\n#define CHAR_HYPHEN            0xAE\n#define CHAR_BULLET            0xAF\n#define CHAR_ELLIPSIS          0xB0\n#define CHAR_DBL_QUOTE_LEFT    0xB1\n#define CHAR_DBL_QUOTE_RIGHT   0xB2\n#define CHAR_SGL_QUOTE_LEFT    0xB3\n#define CHAR_SGL_QUOTE_RIGHT   0xB4\n#define CHAR_MALE              0xB5\n#define CHAR_FEMALE            0xB6\n#define CHAR_CURRENCY          0xB7\n#define CHAR_COMMA             0xB8\n#define CHAR_MULT_SIGN         0xB9\n#define CHAR_SLASH             0xBA\n#define CHAR_A                 0xBB\n#define CHAR_B                 0xBC\n#define CHAR_C                 0xBD\n#define CHAR_D                 0xBE\n#define CHAR_E                 0xBF\n#define CHAR_F                 0xC0\n#define CHAR_G                 0xC1\n#define CHAR_H                 0xC2\n#define CHAR_I                 0xC3\n#define CHAR_J                 0xC4\n#define CHAR_K                 0xC5\n#define CHAR_L                 0xC6\n#define CHAR_M                 0xC7\n#define CHAR_N                 0xC8\n#define CHAR_O                 0xC9\n#define CHAR_P                 0xCA\n#define CHAR_Q                 0xCB\n#define CHAR_R                 0xCC\n#define CHAR_S                 0xCD\n#define CHAR_T                 0xCE\n#define CHAR_U                 0xCF\n#define CHAR_V                 0xD0\n#define CHAR_W                 0xD1\n#define CHAR_X                 0xD2\n#define CHAR_Y                 0xD3\n#define CHAR_Z                 0xD4\n#define CHAR_a                 0xD5\n#define CHAR_b                 0xD6\n#define CHAR_c                 0xD7\n#define CHAR_d                 0xD8\n#define CHAR_e                 0xD9\n#define CHAR_f                 0xDA\n#define CHAR_g                 0xDB\n#define CHAR_h                 0xDC\n#define CHAR_i                 0xDD\n#define CHAR_j                 0xDE\n#define CHAR_k                 0xDF\n#define CHAR_l                 0xE0\n#define CHAR_m                 0xE1\n#define CHAR_n                 0xE2\n#define CHAR_o                 0xE3\n#define CHAR_p                 0xE4\n#define CHAR_q                 0xE5\n#define CHAR_r                 0xE6\n#define CHAR_s                 0xE7\n#define CHAR_t                 0xE8\n#define CHAR_u                 0xE9\n#define CHAR_v                 0xEA\n#define CHAR_w                 0xEB\n#define CHAR_x                 0xEC\n#define CHAR_y                 0xED\n#define CHAR_z                 0xEE\n#define CHAR_BLACK_TRIANGLE    0xEF\n#define CHAR_COLON             0xF0\n#define CHAR_A_DIAERESIS       0xF1\n#define CHAR_O_DIAERESIS       0xF2\n#define CHAR_U_DIAERESIS       0xF3\n#define CHAR_a_DIAERESIS       0xF4\n#define CHAR_o_DIAERESIS       0xF5\n#define CHAR_u_DIAERESIS       0xF6\n#define CHAR_DYNAMIC           0xF7\n#define CHAR_KEYPAD_ICON       0xF8\n#define CHAR_EXTRA_SYMBOL      0xF9\n#define CHAR_PROMPT_SCROLL     0xFA // waits for button press and scrolls dialog\n#define CHAR_PROMPT_CLEAR      0xFB // waits for button press and clears dialog\n#define EXT_CTRL_CODE_BEGIN    0xFC // extended control code\n#define PLACEHOLDER_BEGIN      0xFD // string placeholder\n#define CHAR_NEWLINE           0xFE\n#define EOS                    0xFF // end of string\n\n// CHAR_KEYPAD_ICON chars\n#define CHAR_A_BUTTON       0x00\n#define CHAR_B_BUTTON       0x01\n#define CHAR_L_BUTTON       0x02\n#define CHAR_R_BUTTON       0x03\n#define CHAR_START_BUTTON   0x04\n#define CHAR_SELECT_BUTTON  0x05\n#define CHAR_DPAD_UP        0x06\n#define CHAR_DPAD_DOWN      0x07\n#define CHAR_DPAD_LEFT      0x08\n#define CHAR_DPAD_RIGHT     0x09\n#define CHAR_DPAD_UPDOWN    0x0A\n#define CHAR_DPAD_LEFTRIGHT 0x0B\n#define CHAR_DPAD_NONE      0x0C\n\n// CHAR_EXTRA_SYMBOL chars\n#define CHAR_UP_ARROW_2        0x00\n#define CHAR_DOWN_ARROW_2      0x01\n#define CHAR_LEFT_ARROW_2      0x02\n#define CHAR_RIGHT_ARROW_2     0x03\n#define CHAR_PLUS_2            0x04\n#define CHAR_LV_2              0x05\n#define CHAR_PP                0x06\n#define CHAR_ID                0x07\n#define CHAR_NO                0x08\n#define CHAR_UNDERSCORE        0x09\n#define CHAR_CIRCLED_1         0x0A\n#define CHAR_CIRCLED_2         0x0B\n#define CHAR_CIRCLED_3         0x0C\n#define CHAR_CIRCLED_4         0x0D\n#define CHAR_CIRCLED_5         0x0E\n#define CHAR_CIRCLED_6         0x0F\n#define CHAR_CIRCLED_7         0x10\n#define CHAR_CIRCLED_8         0x11\n#define CHAR_CIRCLED_9         0x12\n#define CHAR_LEFT_PAREN_SMALL  0x13\n#define CHAR_RIGHT_PAREN_SMALL 0x14\n#define CHAR_BULLSEYE          0x15\n#define CHAR_TRIANGLE          0x16\n#define CHAR_CROSS_X           0x17\n\n#define EXT_CTRL_CODE_COLOR                  0x01\n#define EXT_CTRL_CODE_HIGHLIGHT              0x02\n#define EXT_CTRL_CODE_SHADOW                 0x03\n#define EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW 0x04\n#define EXT_CTRL_CODE_PALETTE                0x05\n#define EXT_CTRL_CODE_FONT                   0x06\n#define EXT_CTRL_CODE_RESET_FONT             0x07\n#define EXT_CTRL_CODE_PAUSE                  0x08\n#define EXT_CTRL_CODE_PAUSE_UNTIL_PRESS      0x09\n#define EXT_CTRL_CODE_WAIT_SE                0x0A\n#define EXT_CTRL_CODE_PLAY_BGM               0x0B\n#define EXT_CTRL_CODE_ESCAPE                 0x0C\n#define EXT_CTRL_CODE_SHIFT_RIGHT            0x0D\n#define EXT_CTRL_CODE_SHIFT_DOWN             0x0E\n#define EXT_CTRL_CODE_FILL_WINDOW            0x0F\n#define EXT_CTRL_CODE_PLAY_SE                0x10\n#define EXT_CTRL_CODE_CLEAR                  0x11\n#define EXT_CTRL_CODE_SKIP                   0x12\n#define EXT_CTRL_CODE_CLEAR_TO               0x13\n#define EXT_CTRL_CODE_MIN_LETTER_SPACING     0x14\n#define EXT_CTRL_CODE_JPN                    0x15\n#define EXT_CTRL_CODE_ENG                    0x16\n#define EXT_CTRL_CODE_PAUSE_MUSIC            0x17\n#define EXT_CTRL_CODE_RESUME_MUSIC           0x18\n\n#define TEXT_COLOR_TRANSPARENT  0x0\n#define TEXT_COLOR_WHITE        0x1\n#define TEXT_COLOR_DARK_GRAY    0x2\n#define TEXT_COLOR_LIGHT_GRAY   0x3\n#define TEXT_COLOR_RED          0x4\n#define TEXT_COLOR_LIGHT_RED    0x5\n#define TEXT_COLOR_GREEN        0x6\n#define TEXT_COLOR_LIGHT_GREEN  0x7\n#define TEXT_COLOR_BLUE         0x8\n#define TEXT_COLOR_LIGHT_BLUE   0x9\n#define TEXT_DYNAMIC_COLOR_1    0xA // Usually white\n#define TEXT_DYNAMIC_COLOR_2    0xB // Usually white w/ tinge of green\n#define TEXT_DYNAMIC_COLOR_3    0xC // Usually white\n#define TEXT_DYNAMIC_COLOR_4    0xD // Usually aquamarine\n#define TEXT_DYNAMIC_COLOR_5    0xE // Usually blue-green\n#define TEXT_DYNAMIC_COLOR_6    0xF // Usually cerulean\n\n#define PLACEHOLDER_ID_UNKNOWN       0x0\n#define PLACEHOLDER_ID_PLAYER        0x1\n#define PLACEHOLDER_ID_STRING_VAR_1  0x2\n#define PLACEHOLDER_ID_STRING_VAR_2  0x3\n#define PLACEHOLDER_ID_STRING_VAR_3  0x4\n#define PLACEHOLDER_ID_KUN           0x5\n#define PLACEHOLDER_ID_RIVAL         0x6\n#define PLACEHOLDER_ID_VERSION       0x7\n#define PLACEHOLDER_ID_MAGMA         0x8\n#define PLACEHOLDER_ID_AQUA          0x9\n#define PLACEHOLDER_ID_MAXIE         0xA\n#define PLACEHOLDER_ID_ARCHIE        0xB\n#define PLACEHOLDER_ID_GROUDON       0xC\n#define PLACEHOLDER_ID_KYOGRE        0xD\n\n#endif // GUARD_CHARACTERS_H\n"
  },
  {
    "path": "include/clear_save_data_screen.h",
    "content": "#ifndef GUARD_CLEAR_SAVE_DATA_SCREEN_H\n#define GUARD_CLEAR_SAVE_DATA_SCREEN_H\n\nvoid CB2_SaveClearScreen_Init(void);\n\n#endif //GUARD_CLEAR_SAVE_DATA_SCREEN_H\n"
  },
  {
    "path": "include/coins.h",
    "content": "#ifndef GUARD_COINS_H\n#define GUARD_COINS_H\n\n#include \"global.h\"\n\nvoid PrintCoinsString(u32 coinAmount);\nvoid ShowCoinsWindow(u32 coinAmount, u8 x, u8 y);\nvoid HideCoinsWindow(void);\nu16 GetCoins(void);\nvoid SetCoins(u16 coinAmount);\nbool8 AddCoins(u16 toAdd);\nbool8 RemoveCoins(u16 toSub);\n\n#endif // GUARD_COINS_H\n"
  },
  {
    "path": "include/config.h",
    "content": "#ifndef GUARD_CONFIG_H\n#define GUARD_CONFIG_H\n\n#include \"global.h\"\n\n// In the Generation 3 games, Asserts were used in various debug builds.\n// Ruby/Sapphire and Emerald do not have these asserts while Fire Red\n// still has them in the ROM. This is because the developers forgot\n// to define NDEBUG before release, however this has been changed as\n// Ruby's actual debug build does not use the AGBPrint features.\n// #define NDEBUG\n\n// Fire Red likely forgot to define NDEBUG/NOAGBPRN before release, leading\n// to the inclusion of asserts in the retail ROM.\n\n#ifndef NDEBUG\n#define PRETTY_PRINT_OFF (0)\n#define PRETTY_PRINT_MINI_PRINTF (1)\n#define PRETTY_PRINT_LIBC (2)\n\n#define LOG_HANDLER_AGB_PRINT (0)\n#define LOG_HANDLER_NOCASH_PRINT (1)\n#define LOG_HANDLER_MGBA_PRINT (2)\n\n// Use this switch to choose a handler for pretty printing.\n// NOTE: mini_printf supports a custom pretty printing formatter to display preproc encoded strings. (%S)\n//       some libc distributions (especially dkp arm-libc) will fail to link pretty printing.\n#define PRETTY_PRINT_HANDLER (PRETTY_PRINT_OFF)\n\n// Use this switch to choose a handler for printf output.\n// NOTE: These will only work on the respective emulators and should not be used in a productive environment.\n//       Some emulators or real hardware might (and is allowed to) crash if they are used.\n//       AGB_PRINT is supported on respective debug units.\n\n#define LOG_HANDLER (LOG_HANDLER_AGB_PRINT)\n#endif // NDEBUG\n\n// Define the game version for use elsewhere\n#define GAME_VERSION VERSION_FIRE_RED\n\n// rev1 renamed the source folder for reasons\n#define CODE_ROOT \"C:/WORK/POKeFRLG/Src/pm_lgfr_ose/source/\"\n\n#define ABSPATH(x) (CODE_ROOT x)\n\n#ifdef ENGLISH\n#define UNITS_IMPERIAL\n#else\n#define UNITS_METRIC\n#endif // ENGLISH\n\n// Crashes may occur due to section reordering in the modern build,\n// so we force BUGFIX here.\n#if MODERN\n#ifndef BUGFIX\n#define BUGFIX\n#endif // BUGFIX\n#ifndef UBFIX\n#define UBFIX\n#endif // UBFIX\n#endif // MODERN\n\n#endif // GUARD_CONFIG_H\n"
  },
  {
    "path": "include/constants/abilities.h",
    "content": "#ifndef GUARD_CONSTANTS_ABILITIES_H\n#define GUARD_CONSTANTS_ABILITIES_H\n\n#define ABILITY_NONE 0\n#define ABILITY_STENCH 1\n#define ABILITY_DRIZZLE 2\n#define ABILITY_SPEED_BOOST 3\n#define ABILITY_BATTLE_ARMOR 4\n#define ABILITY_STURDY 5\n#define ABILITY_DAMP 6\n#define ABILITY_LIMBER 7\n#define ABILITY_SAND_VEIL 8\n#define ABILITY_STATIC 9\n#define ABILITY_VOLT_ABSORB 10\n#define ABILITY_WATER_ABSORB 11\n#define ABILITY_OBLIVIOUS 12\n#define ABILITY_CLOUD_NINE 13\n#define ABILITY_COMPOUND_EYES 14\n#define ABILITY_INSOMNIA 15\n#define ABILITY_COLOR_CHANGE 16\n#define ABILITY_IMMUNITY 17\n#define ABILITY_FLASH_FIRE 18\n#define ABILITY_SHIELD_DUST 19\n#define ABILITY_OWN_TEMPO 20\n#define ABILITY_SUCTION_CUPS 21\n#define ABILITY_INTIMIDATE 22\n#define ABILITY_SHADOW_TAG 23\n#define ABILITY_ROUGH_SKIN 24\n#define ABILITY_WONDER_GUARD 25\n#define ABILITY_LEVITATE 26\n#define ABILITY_EFFECT_SPORE 27\n#define ABILITY_SYNCHRONIZE 28\n#define ABILITY_CLEAR_BODY 29\n#define ABILITY_NATURAL_CURE 30\n#define ABILITY_LIGHTNING_ROD 31\n#define ABILITY_SERENE_GRACE 32\n#define ABILITY_SWIFT_SWIM 33\n#define ABILITY_CHLOROPHYLL 34\n#define ABILITY_ILLUMINATE 35\n#define ABILITY_TRACE 36\n#define ABILITY_HUGE_POWER 37\n#define ABILITY_POISON_POINT 38\n#define ABILITY_INNER_FOCUS 39\n#define ABILITY_MAGMA_ARMOR 40\n#define ABILITY_WATER_VEIL 41\n#define ABILITY_MAGNET_PULL 42\n#define ABILITY_SOUNDPROOF 43\n#define ABILITY_RAIN_DISH 44\n#define ABILITY_SAND_STREAM 45\n#define ABILITY_PRESSURE 46\n#define ABILITY_THICK_FAT 47\n#define ABILITY_EARLY_BIRD 48\n#define ABILITY_FLAME_BODY 49\n#define ABILITY_RUN_AWAY 50\n#define ABILITY_KEEN_EYE 51\n#define ABILITY_HYPER_CUTTER 52\n#define ABILITY_PICKUP 53\n#define ABILITY_TRUANT 54\n#define ABILITY_HUSTLE 55\n#define ABILITY_CUTE_CHARM 56\n#define ABILITY_PLUS 57\n#define ABILITY_MINUS 58\n#define ABILITY_FORECAST 59\n#define ABILITY_STICKY_HOLD 60\n#define ABILITY_SHED_SKIN 61\n#define ABILITY_GUTS 62\n#define ABILITY_MARVEL_SCALE 63\n#define ABILITY_LIQUID_OOZE 64\n#define ABILITY_OVERGROW 65\n#define ABILITY_BLAZE 66\n#define ABILITY_TORRENT 67\n#define ABILITY_SWARM 68\n#define ABILITY_ROCK_HEAD 69\n#define ABILITY_DROUGHT 70\n#define ABILITY_ARENA_TRAP 71\n#define ABILITY_VITAL_SPIRIT 72\n#define ABILITY_WHITE_SMOKE 73\n#define ABILITY_PURE_POWER 74\n#define ABILITY_SHELL_ARMOR 75\n#define ABILITY_CACOPHONY 76\n#define ABILITY_AIR_LOCK 77\n\n#define ABILITIES_COUNT 78\n\n#endif  // GUARD_CONSTANTS_ABILITIES_H\n"
  },
  {
    "path": "include/constants/battle.h",
    "content": "#ifndef GUARD_CONSTANTS_BATTLE_H\n#define GUARD_CONSTANTS_BATTLE_H\n\n/*\n * A battler may be in one of four positions on the field. The first bit determines\n * what side the battler is on, either the player's side or the opponent's side.\n * The second bit determines what flank the battler is on, either the left or right.\n * Note that the opponent's flanks are drawn corresponding to their perspective, so\n * their right mon appears on the left, and their left mon appears on the right.\n * The battler ID is usually the same as the position, except in the case of link battles.\n *\n *   + ------------------------- +\n *   |           Opponent's side |\n *   |            Right    Left  |\n *   |              3       1    |\n *   |                           |\n *   | Player's side             |\n *   |  Left   Right             |\n *   |   0       2               |\n *   ----------------------------+\n *   |                           |\n *   |                           |\n *   +---------------------------+\n */\n\n#define MAX_BATTLERS_COUNT  4\n\n#define B_POSITION_PLAYER_LEFT        0\n#define B_POSITION_OPPONENT_LEFT      1\n#define B_POSITION_PLAYER_RIGHT       2\n#define B_POSITION_OPPONENT_RIGHT     3\n\n// These macros can be used with either battler ID or positions to get the partner or the opposite mon\n#define BATTLE_OPPOSITE(id) ((id) ^ 1)\n#define BATTLE_PARTNER(id) ((id) ^ 2)\n\n#define B_SIDE_PLAYER     0\n#define B_SIDE_OPPONENT   1\n\n#define B_FLANK_LEFT 0\n#define B_FLANK_RIGHT 1\n\n#define BIT_SIDE        1\n#define BIT_FLANK       2\n\n// Battle Type Flags\n#define BATTLE_TYPE_DOUBLE             (1 << 0)\n#define BATTLE_TYPE_LINK               (1 << 1)\n#define BATTLE_TYPE_IS_MASTER          (1 << 2) // In not-link battles, it's always set.\n#define BATTLE_TYPE_TRAINER            (1 << 3)\n#define BATTLE_TYPE_FIRST_BATTLE       (1 << 4)\n#define BATTLE_TYPE_LINK_IN_BATTLE     (1 << 5) // Set on battle entry, cleared on exit. Checked rarely\n#define BATTLE_TYPE_MULTI              (1 << 6)\n#define BATTLE_TYPE_SAFARI             (1 << 7)\n#define BATTLE_TYPE_BATTLE_TOWER       (1 << 8)\n#define BATTLE_TYPE_OLD_MAN_TUTORIAL   (1 << 9) // Used in pokeemerald as BATTLE_TYPE_WALLY_TUTORIAL.\n#define BATTLE_TYPE_ROAMER             (1 << 10)\n#define BATTLE_TYPE_EREADER_TRAINER    (1 << 11)\n#define BATTLE_TYPE_KYOGRE_GROUDON     (1 << 12)\n#define BATTLE_TYPE_LEGENDARY          (1 << 13)\n#define BATTLE_TYPE_GHOST_UNVEILED     (1 << 13) // Re-use of BATTLE_TYPE_LEGENDARY, when combined with BATTLE_TYPE_GHOST\n#define BATTLE_TYPE_REGI               (1 << 14)\n#define BATTLE_TYPE_GHOST              (1 << 15) // Used in pokeemerald as BATTLE_TYPE_TWO_OPPONENTS.\n#define BATTLE_TYPE_POKEDUDE           (1 << 16) // Used in pokeemerald as BATTLE_TYPE_DOME.\n#define BATTLE_TYPE_WILD_SCRIPTED      (1 << 17) // Used in pokeemerald as BATTLE_TYPE_PALACE.\n#define BATTLE_TYPE_LEGENDARY_FRLG     (1 << 18) // Used in pokeemerald as BATTLE_TYPE_ARENA.\n#define BATTLE_TYPE_TRAINER_TOWER      (1 << 19) // Used in pokeemerald as BATTLE_TYPE_FACTORY.\n\n#define IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(flags) ((flags) & BATTLE_TYPE_GHOST && !((flags) & BATTLE_TYPE_GHOST_UNVEILED))\n#define IS_BATTLE_TYPE_GHOST_WITH_SCOPE(flags) ((flags) & BATTLE_TYPE_GHOST && (flags) & BATTLE_TYPE_GHOST_UNVEILED)\n\n#define RIVAL_BATTLE_HEAL_AFTER  1\n#define RIVAL_BATTLE_TUTORIAL    3\n\n// Battle Outcome defines\n#define B_OUTCOME_WON                  1\n#define B_OUTCOME_LOST                 2\n#define B_OUTCOME_DREW                 3\n#define B_OUTCOME_RAN                  4\n#define B_OUTCOME_PLAYER_TELEPORTED    5\n#define B_OUTCOME_MON_FLED             6\n#define B_OUTCOME_CAUGHT               7\n#define B_OUTCOME_NO_SAFARI_BALLS      8\n#define B_OUTCOME_FORFEITED            9\n#define B_OUTCOME_MON_TELEPORTED       10\n#define B_OUTCOME_LINK_BATTLE_RAN      (1 << 7) // 128\n\n// Non-volatile status conditions\n// These persist remain outside of battle and after switching out\n#define STATUS1_NONE             0\n#define STATUS1_SLEEP            (1 << 0 | 1 << 1 | 1 << 2) // First 3 bits (Number of turns to sleep)\n#define STATUS1_SLEEP_TURN(num)  ((num) << 0) // Just for readability (or if rearranging statuses)\n#define STATUS1_POISON           (1 << 3)\n#define STATUS1_BURN             (1 << 4)\n#define STATUS1_FREEZE           (1 << 5)\n#define STATUS1_PARALYSIS        (1 << 6)\n#define STATUS1_TOXIC_POISON     (1 << 7)\n#define STATUS1_TOXIC_COUNTER    (1 << 8 | 1 << 9 | 1 << 10 | 1 << 11)\n#define STATUS1_TOXIC_TURN(num)  ((num) << 8)\n#define STATUS1_PSN_ANY          (STATUS1_POISON | STATUS1_TOXIC_POISON)\n#define STATUS1_ANY              (STATUS1_SLEEP | STATUS1_POISON | STATUS1_BURN | STATUS1_FREEZE | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON)\n\n// Volatile status ailments\n// These are removed after exiting the battle or switching out\n#define STATUS2_CONFUSION             (1 << 0 | 1 << 1 | 1 << 2)\n#define STATUS2_CONFUSION_TURN(num)   ((num) << 0)\n#define STATUS2_FLINCHED              (1 << 3)\n#define STATUS2_UPROAR                (1 << 4 | 1 << 5 | 1 << 6)\n#define STATUS2_UPROAR_TURN(num)      ((num) << 4)\n#define STATUS2_UNUSED                (1 << 7)\n#define STATUS2_BIDE                  (1 << 8 | 1 << 9)\n#define STATUS2_BIDE_TURN(num)        (((num) << 8) & STATUS2_BIDE)\n#define STATUS2_LOCK_CONFUSE          (1 << 10 | 1 << 11) // e.g. Thrash\n#define STATUS2_LOCK_CONFUSE_TURN(num)((num) << 10)\n#define STATUS2_MULTIPLETURNS         (1 << 12)\n#define STATUS2_WRAPPED               (1 << 13 | 1 << 14 | 1 << 15)\n#define STATUS2_WRAPPED_TURN(num)     ((num) << 13)\n#define STATUS2_INFATUATION           (1 << 16 | 1 << 17 | 1 << 18 | 1 << 19)  // 4 bits, one for every battler\n#define STATUS2_INFATUATED_WITH(battler) (gBitTable[battler] << 16)\n#define STATUS2_FOCUS_ENERGY          (1 << 20)\n#define STATUS2_TRANSFORMED           (1 << 21)\n#define STATUS2_RECHARGE              (1 << 22)\n#define STATUS2_RAGE                  (1 << 23)\n#define STATUS2_SUBSTITUTE            (1 << 24)\n#define STATUS2_DESTINY_BOND          (1 << 25)\n#define STATUS2_ESCAPE_PREVENTION     (1 << 26)\n#define STATUS2_NIGHTMARE             (1 << 27)\n#define STATUS2_CURSED                (1 << 28)\n#define STATUS2_FORESIGHT             (1 << 29)\n#define STATUS2_DEFENSE_CURL          (1 << 30)\n#define STATUS2_TORMENT               (1 << 31)\n\n// Seems like per-battler statuses. Not quite sure how to categorize these\n#define STATUS3_LEECHSEED_BATTLER       (1 << 0 | 1 << 1) // The battler to receive HP from Leech Seed\n#define STATUS3_LEECHSEED               (1 << 2)\n#define STATUS3_ALWAYS_HITS             (1 << 3 | 1 << 4)\n#define STATUS3_ALWAYS_HITS_TURN(num)   (((num) << 3) & STATUS3_ALWAYS_HITS) // \"Always Hits\" is set as a 2 turn timer, i.e. next turn is the last turn when it's active\n#define STATUS3_PERISH_SONG             (1 << 5)\n#define STATUS3_ON_AIR                  (1 << 6)\n#define STATUS3_UNDERGROUND             (1 << 7)\n#define STATUS3_MINIMIZED               (1 << 8)\n#define STATUS3_CHARGED_UP              (1 << 9)\n#define STATUS3_ROOTED                  (1 << 10)\n#define STATUS3_YAWN                    (1 << 11 | 1 << 12) // Number of turns to sleep\n#define STATUS3_YAWN_TURN(num)          (((num) << 11) & STATUS3_YAWN)\n#define STATUS3_IMPRISONED_OTHERS       (1 << 13)\n#define STATUS3_GRUDGE                  (1 << 14)\n#define STATUS3_CANT_SCORE_A_CRIT       (1 << 15)\n#define STATUS3_MUDSPORT                (1 << 16)\n#define STATUS3_WATERSPORT              (1 << 17)\n#define STATUS3_UNDERWATER              (1 << 18)\n#define STATUS3_INTIMIDATE_POKES        (1 << 19)\n#define STATUS3_TRACE                   (1 << 20)\n#define STATUS3_SEMI_INVULNERABLE       (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER)\n\n// Not really sure what a \"hitmarker\" is.\n#define HITMARKER_WAKE_UP_CLEAR         (1 << 4) // Cleared when waking up. Never set or checked.\n#define HITMARKER_SKIP_DMG_TRACK        (1 << 5)\n#define HITMARKER_DESTINYBOND           (1 << 6)\n#define HITMARKER_NO_ANIMATIONS         (1 << 7)\n#define HITMARKER_IGNORE_SUBSTITUTE     (1 << 8)\n#define HITMARKER_NO_ATTACKSTRING       (1 << 9)\n#define HITMARKER_ATTACKSTRING_PRINTED  (1 << 10)\n#define HITMARKER_NO_PPDEDUCT           (1 << 11)\n#define HITMARKER_SWAP_ATTACKER_TARGET  (1 << 12)\n#define HITMARKER_STATUS_ABILITY_EFFECT (1 << 13)\n#define HITMARKER_SYNCHRONISE_EFFECT    (1 << 14)\n#define HITMARKER_RUN                   (1 << 15)\n#define HITMARKER_IGNORE_ON_AIR         (1 << 16)\n#define HITMARKER_IGNORE_UNDERGROUND    (1 << 17)\n#define HITMARKER_IGNORE_UNDERWATER     (1 << 18)\n#define HITMARKER_UNABLE_TO_USE_MOVE    (1 << 19)\n#define HITMARKER_PASSIVE_DAMAGE        (1 << 20)\n#define HITMARKER_DISOBEDIENT_MOVE      (1 << 21)\n#define HITMARKER_PLAYER_FAINTED        (1 << 22)\n#define HITMARKER_ALLOW_NO_PP           (1 << 23)\n#define HITMARKER_GRUDGE                (1 << 24)\n#define HITMARKER_OBEYS                 (1 << 25)\n#define HITMARKER_NEVER_SET             (1 << 26) // Cleared as part of a large group. Never set or checked\n#define HITMARKER_CHARGING              (1 << 27)\n#define HITMARKER_FAINTED(battler)      (gBitTable[battler] << 28)\n#define HITMARKER_FAINTED2(battler)     ((1 << 28) << battler)\n\n// Per-side statuses that affect an entire party\n#define SIDE_STATUS_REFLECT          (1 << 0)\n#define SIDE_STATUS_LIGHTSCREEN      (1 << 1)\n#define SIDE_STATUS_X4               (1 << 2)\n#define SIDE_STATUS_SPIKES           (1 << 4)\n#define SIDE_STATUS_SAFEGUARD        (1 << 5)\n#define SIDE_STATUS_FUTUREATTACK     (1 << 6)\n#define SIDE_STATUS_MIST             (1 << 8)\n#define SIDE_STATUS_SPIKES_DAMAGED   (1 << 9)\n\n// Flags describing move's result\n#define MOVE_RESULT_MISSED             (1 << 0)\n#define MOVE_RESULT_SUPER_EFFECTIVE    (1 << 1)\n#define MOVE_RESULT_NOT_VERY_EFFECTIVE (1 << 2)\n#define MOVE_RESULT_DOESNT_AFFECT_FOE  (1 << 3)\n#define MOVE_RESULT_ONE_HIT_KO         (1 << 4)\n#define MOVE_RESULT_FAILED             (1 << 5)\n#define MOVE_RESULT_FOE_ENDURED        (1 << 6)\n#define MOVE_RESULT_FOE_HUNG_ON        (1 << 7)\n#define MOVE_RESULT_NO_EFFECT          (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED)\n\n// Battle Weather flags\n#define B_WEATHER_RAIN_TEMPORARY      (1 << 0)\n#define B_WEATHER_RAIN_DOWNPOUR       (1 << 1)  // unused\n#define B_WEATHER_RAIN_PERMANENT      (1 << 2)\n#define B_WEATHER_RAIN                (B_WEATHER_RAIN_TEMPORARY | B_WEATHER_RAIN_DOWNPOUR | B_WEATHER_RAIN_PERMANENT)\n#define B_WEATHER_SANDSTORM_TEMPORARY (1 << 3)\n#define B_WEATHER_SANDSTORM_PERMANENT (1 << 4)\n#define B_WEATHER_SANDSTORM           (B_WEATHER_SANDSTORM_TEMPORARY | B_WEATHER_SANDSTORM_PERMANENT)\n#define B_WEATHER_SUN_TEMPORARY       (1 << 5)\n#define B_WEATHER_SUN_PERMANENT       (1 << 6)\n#define B_WEATHER_SUN                 (B_WEATHER_SUN_TEMPORARY | B_WEATHER_SUN_PERMANENT)\n#define B_WEATHER_HAIL_TEMPORARY      (1 << 7)\n#define B_WEATHER_HAIL                (B_WEATHER_HAIL_TEMPORARY)\n#define B_WEATHER_ANY                 (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL)\n\n// Move Effects\n#define MOVE_EFFECT_SLEEP               1\n#define MOVE_EFFECT_POISON              2\n#define MOVE_EFFECT_BURN                3\n#define MOVE_EFFECT_FREEZE              4\n#define MOVE_EFFECT_PARALYSIS           5\n#define MOVE_EFFECT_TOXIC               6\n#define PRIMARY_STATUS_MOVE_EFFECT      MOVE_EFFECT_TOXIC // All above move effects apply primary status\n#define MOVE_EFFECT_CONFUSION           7\n#define MOVE_EFFECT_FLINCH              8\n#define MOVE_EFFECT_TRI_ATTACK          9\n#define MOVE_EFFECT_UPROAR              10\n#define MOVE_EFFECT_PAYDAY              11\n#define MOVE_EFFECT_CHARGING            12\n#define MOVE_EFFECT_WRAP                13\n#define MOVE_EFFECT_RECOIL_25           14\n#define MOVE_EFFECT_ATK_PLUS_1          15\n#define MOVE_EFFECT_DEF_PLUS_1          16\n#define MOVE_EFFECT_SPD_PLUS_1          17\n#define MOVE_EFFECT_SP_ATK_PLUS_1       18\n#define MOVE_EFFECT_SP_DEF_PLUS_1       19\n#define MOVE_EFFECT_ACC_PLUS_1          20\n#define MOVE_EFFECT_EVS_PLUS_1          21\n#define MOVE_EFFECT_ATK_MINUS_1         22\n#define MOVE_EFFECT_DEF_MINUS_1         23\n#define MOVE_EFFECT_SPD_MINUS_1         24\n#define MOVE_EFFECT_SP_ATK_MINUS_1      25\n#define MOVE_EFFECT_SP_DEF_MINUS_1      26\n#define MOVE_EFFECT_ACC_MINUS_1         27\n#define MOVE_EFFECT_EVS_MINUS_1         28\n#define MOVE_EFFECT_RECHARGE            29\n#define MOVE_EFFECT_RAGE                30\n#define MOVE_EFFECT_STEAL_ITEM          31\n#define MOVE_EFFECT_PREVENT_ESCAPE      32\n#define MOVE_EFFECT_NIGHTMARE           33\n#define MOVE_EFFECT_ALL_STATS_UP        34\n#define MOVE_EFFECT_RAPIDSPIN           35\n#define MOVE_EFFECT_REMOVE_PARALYSIS    36\n#define MOVE_EFFECT_ATK_DEF_DOWN        37\n#define MOVE_EFFECT_RECOIL_33           38\n#define MOVE_EFFECT_ATK_PLUS_2          39\n#define MOVE_EFFECT_DEF_PLUS_2          40\n#define MOVE_EFFECT_SPD_PLUS_2          41\n#define MOVE_EFFECT_SP_ATK_PLUS_2       42\n#define MOVE_EFFECT_SP_DEF_PLUS_2       43\n#define MOVE_EFFECT_ACC_PLUS_2          44\n#define MOVE_EFFECT_EVS_PLUS_2          45\n#define MOVE_EFFECT_ATK_MINUS_2         46\n#define MOVE_EFFECT_DEF_MINUS_2         47\n#define MOVE_EFFECT_SPD_MINUS_2         48\n#define MOVE_EFFECT_SP_ATK_MINUS_2      49\n#define MOVE_EFFECT_SP_DEF_MINUS_2      50\n#define MOVE_EFFECT_ACC_MINUS_2         51\n#define MOVE_EFFECT_EVS_MINUS_2         52\n#define MOVE_EFFECT_THRASH              53\n#define MOVE_EFFECT_KNOCK_OFF           54\n#define MOVE_EFFECT_NOTHING_37          55\n#define MOVE_EFFECT_NOTHING_38          56\n#define MOVE_EFFECT_NOTHING_39          57\n#define MOVE_EFFECT_NOTHING_3A          58\n#define MOVE_EFFECT_SP_ATK_TWO_DOWN     59\n#define NUM_MOVE_EFFECTS                60\n\n#define MOVE_EFFECT_AFFECTS_USER        (1 << 6) // 64\n#define MOVE_EFFECT_CERTAIN             (1 << 7) // 128\n\n// Battle terrain defines for gBattleTerrain.\n#define BATTLE_TERRAIN_GRASS        0\n#define BATTLE_TERRAIN_LONG_GRASS   1\n#define BATTLE_TERRAIN_SAND         2\n#define BATTLE_TERRAIN_UNDERWATER   3\n#define BATTLE_TERRAIN_WATER        4\n#define BATTLE_TERRAIN_POND         5\n#define BATTLE_TERRAIN_MOUNTAIN     6\n#define BATTLE_TERRAIN_CAVE         7\n#define BATTLE_TERRAIN_BUILDING     8\n#define BATTLE_TERRAIN_PLAIN        9\n#define BATTLE_TERRAIN_LINK        10\n#define BATTLE_TERRAIN_GYM         11\n#define BATTLE_TERRAIN_LEADER      12\n#define BATTLE_TERRAIN_INDOOR_2    13\n#define BATTLE_TERRAIN_INDOOR_1    14\n#define BATTLE_TERRAIN_LORELEI     15\n#define BATTLE_TERRAIN_BRUNO       16\n#define BATTLE_TERRAIN_AGATHA      17\n#define BATTLE_TERRAIN_LANCE       18\n#define BATTLE_TERRAIN_CHAMPION    19\n\n#define B_WAIT_TIME_LONG  64\n#define B_WAIT_TIME_MED   48\n#define B_WAIT_TIME_SHORT 32\n#define B_WAIT_TIME_SHORT_UNSKIPPABLE 33\n\n#define CASTFORM_NORMAL     0\n#define CASTFORM_FIRE       1\n#define CASTFORM_WATER      2\n#define CASTFORM_ICE        3\n#define NUM_CASTFORM_FORMS  4\n#define CASTFORM_SUBSTITUTE (1 << 7)\n\n#define FLEE_ITEM    1\n#define FLEE_ABILITY 2\n\n// Return value for IsRunningFromBattleImpossible.\n#define BATTLE_RUN_SUCCESS        0\n#define BATTLE_RUN_FORBIDDEN      1\n#define BATTLE_RUN_FAILURE        2\n\n// Window Ids for sTextOnWindowsInfo_Normal\n#define B_WIN_MSG                 0\n#define B_WIN_ACTION_PROMPT       1 // \"What will {x} do?\"\n#define B_WIN_ACTION_MENU         2 // \"Fight/Pokémon/Bag/Run\" menu\n#define B_WIN_MOVE_NAME_1         3 // Top left\n#define B_WIN_MOVE_NAME_2         4 // Top right\n#define B_WIN_MOVE_NAME_3         5 // Bottom left\n#define B_WIN_MOVE_NAME_4         6 // Bottom right\n#define B_WIN_PP                  7\n#define B_WIN_MOVE_TYPE           8\n#define B_WIN_PP_REMAINING        9\n#define B_WIN_DUMMY              10\n#define B_WIN_SWITCH_PROMPT      11 // \"Switch which?\"\n#define B_WIN_LEVEL_UP_BOX       12\n#define B_WIN_LEVEL_UP_BANNER    13\n#define B_WIN_YESNO              14\n#define B_WIN_VS_PLAYER          15\n#define B_WIN_VS_OPPONENT        16\n#define B_WIN_VS_MULTI_PLAYER_1  17\n#define B_WIN_VS_MULTI_PLAYER_2  18\n#define B_WIN_VS_MULTI_PLAYER_3  19\n#define B_WIN_VS_MULTI_PLAYER_4  20\n#define B_WIN_VS_OUTCOME_DRAW    21\n#define B_WIN_VS_OUTCOME_LEFT    22\n#define B_WIN_VS_OUTCOME_RIGHT   23\n#define B_WIN_OAK_OLD_MAN        24\n\n#define B_TEXT_FLAG_NPC_CONTEXT_FONT    (1 << 6)\n#define B_TEXT_FLAG_WINDOW_CLEAR        (1 << 7)\n\n// Indicator for the party summary bar to display an empty slot.\n#define HP_EMPTY_SLOT 0xFFFF\n\n#endif // GUARD_CONSTANTS_BATTLE_H\n"
  },
  {
    "path": "include/constants/battle_ai.h",
    "content": "#ifndef GUARD_CONSTANTS_BATTLE_AI_H\n#define GUARD_CONSTANTS_BATTLE_AI_H\n\n// battlers\n#define AI_TARGET 0\n#define AI_USER 1\n#define AI_TARGET_PARTNER 2\n#define AI_USER_PARTNER 3\n\n// get_type command\n#define AI_TYPE1_TARGET 0\n#define AI_TYPE1_USER 1\n#define AI_TYPE2_TARGET 2\n#define AI_TYPE2_USER 3\n#define AI_TYPE_MOVE 4\n\n// type effectiveness\n#define AI_EFFECTIVENESS_x4     160\n#define AI_EFFECTIVENESS_x2     80\n#define AI_EFFECTIVENESS_x1     40\n#define AI_EFFECTIVENESS_x0_5   20\n#define AI_EFFECTIVENESS_x0_25  10\n#define AI_EFFECTIVENESS_x0     0\n\n// ai weather\n#define AI_WEATHER_SUN       0\n#define AI_WEATHER_RAIN      1\n#define AI_WEATHER_SANDSTORM 2\n#define AI_WEATHER_HAIL      3\n\n// get_how_powerful_move_is\n#define MOVE_POWER_DISCOURAGED  0\n#define MOVE_NOT_MOST_POWERFUL  1\n#define MOVE_MOST_POWERFUL      2\n\n// script's table id to bit\n#define AI_SCRIPT_CHECK_BAD_MOVE (1 << 0)\n#define AI_SCRIPT_CHECK_VIABILITY (1 << 1)\n#define AI_SCRIPT_TRY_TO_FAINT (1 << 2)\n#define AI_SCRIPT_SETUP_FIRST_TURN (1 << 3)\n#define AI_SCRIPT_RISKY (1 << 4)\n#define AI_SCRIPT_PREFER_STRONGEST_MOVE (1 << 5)\n#define AI_SCRIPT_PREFER_BATON_PASS (1 << 6)\n#define AI_SCRIPT_DOUBLE_BATTLE (1 << 7)\n#define AI_SCRIPT_HP_AWARE (1 << 8)\n#define AI_SCRIPT_UNKNOWN (1 << 9)\n// 10 - 28 are not used\n#define AI_SCRIPT_ROAMING (1 << 29)\n#define AI_SCRIPT_SAFARI (1 << 30)\n#define AI_SCRIPT_FIRST_BATTLE (1 << 31)\n\n#endif // GUARD_CONSTANTS_BATTLE_AI_H\n"
  },
  {
    "path": "include/constants/battle_anim.h",
    "content": "#ifndef GUARD_CONSTANTS_BATTLE_ANIM_H\n#define GUARD_CONSTANTS_BATTLE_ANIM_H\n\n// Sprites start at 10000 and thus must be subtracted of 10000 to account for the true index.\n#define GET_TRUE_SPRITE_INDEX(i) ((i - ANIM_SPRITES_START))\n\n// Particle ids.\n#define ANIM_SPRITES_START 10000\n\n#define ANIM_TAG_BONE                       (ANIM_SPRITES_START + 0)\n#define ANIM_TAG_SPARK                      (ANIM_SPRITES_START + 1)\n#define ANIM_TAG_PENCIL                     (ANIM_SPRITES_START + 2)\n#define ANIM_TAG_AIR_WAVE                   (ANIM_SPRITES_START + 3)\n#define ANIM_TAG_ORB                        (ANIM_SPRITES_START + 4)\n#define ANIM_TAG_SWORD                      (ANIM_SPRITES_START + 5)\n#define ANIM_TAG_SEED                       (ANIM_SPRITES_START + 6)\n#define ANIM_TAG_EXPLOSION_6                (ANIM_SPRITES_START + 7)\n#define ANIM_TAG_PINK_ORB                   (ANIM_SPRITES_START + 8) // unused\n#define ANIM_TAG_GUST                       (ANIM_SPRITES_START + 9)\n#define ANIM_TAG_ICE_CUBE                   (ANIM_SPRITES_START + 10)\n#define ANIM_TAG_SPARK_2                    (ANIM_SPRITES_START + 11)\n#define ANIM_TAG_ORANGE                     (ANIM_SPRITES_START + 12) // unused\n#define ANIM_TAG_YELLOW_BALL                (ANIM_SPRITES_START + 13)\n#define ANIM_TAG_LOCK_ON                    (ANIM_SPRITES_START + 14)\n#define ANIM_TAG_TIED_BAG                   (ANIM_SPRITES_START + 15)\n#define ANIM_TAG_BLACK_SMOKE                (ANIM_SPRITES_START + 16)\n#define ANIM_TAG_BLACK_BALL                 (ANIM_SPRITES_START + 17)\n#define ANIM_TAG_CONVERSION                 (ANIM_SPRITES_START + 18)\n#define ANIM_TAG_GLASS                      (ANIM_SPRITES_START + 19) // unused\n#define ANIM_TAG_HORN_HIT                   (ANIM_SPRITES_START + 20)\n#define ANIM_TAG_HIT                        (ANIM_SPRITES_START + 21)\n#define ANIM_TAG_HIT_2                      (ANIM_SPRITES_START + 22)\n#define ANIM_TAG_BLUE_SHARDS                (ANIM_SPRITES_START + 23) // unused\n#define ANIM_TAG_CLOSING_EYE                (ANIM_SPRITES_START + 24) // unused\n#define ANIM_TAG_WAVING_HAND                (ANIM_SPRITES_START + 25) // unused\n#define ANIM_TAG_HIT_DUPLICATE              (ANIM_SPRITES_START + 26) // unused\n#define ANIM_TAG_LEER                       (ANIM_SPRITES_START + 27)\n#define ANIM_TAG_BLUE_BURST                 (ANIM_SPRITES_START + 28) // unused\n#define ANIM_TAG_SMALL_EMBER                (ANIM_SPRITES_START + 29)\n#define ANIM_TAG_GRAY_SMOKE                 (ANIM_SPRITES_START + 30)\n#define ANIM_TAG_BLUE_STAR                  (ANIM_SPRITES_START + 31)\n#define ANIM_TAG_BUBBLE_BURST               (ANIM_SPRITES_START + 32)\n#define ANIM_TAG_FIRE                       (ANIM_SPRITES_START + 33)\n#define ANIM_TAG_SPINNING_FIRE              (ANIM_SPRITES_START + 34) // unused\n#define ANIM_TAG_FIRE_PLUME                 (ANIM_SPRITES_START + 35)\n#define ANIM_TAG_LIGHTNING_2                (ANIM_SPRITES_START + 36) // unused\n#define ANIM_TAG_LIGHTNING                  (ANIM_SPRITES_START + 37)\n#define ANIM_TAG_CLAW_SLASH_2               (ANIM_SPRITES_START + 38) // unused\n#define ANIM_TAG_CLAW_SLASH                 (ANIM_SPRITES_START + 39)\n#define ANIM_TAG_SCRATCH_3                  (ANIM_SPRITES_START + 40) // unused\n#define ANIM_TAG_SCRATCH_2                  (ANIM_SPRITES_START + 41) // unused\n#define ANIM_TAG_BUBBLE_BURST_2             (ANIM_SPRITES_START + 42) // unused\n#define ANIM_TAG_ICE_CHUNK                  (ANIM_SPRITES_START + 43)\n#define ANIM_TAG_GLASS_2                    (ANIM_SPRITES_START + 44) // unused\n#define ANIM_TAG_PINK_HEART_2               (ANIM_SPRITES_START + 45) // unused\n#define ANIM_TAG_SAP_DRIP                   (ANIM_SPRITES_START + 46) // unused\n#define ANIM_TAG_SAP_DRIP_2                 (ANIM_SPRITES_START + 47) // unused\n#define ANIM_TAG_SPARKLE_1                  (ANIM_SPRITES_START + 48)\n#define ANIM_TAG_SPARKLE_2                  (ANIM_SPRITES_START + 49)\n#define ANIM_TAG_HUMANOID_FOOT              (ANIM_SPRITES_START + 50)\n#define ANIM_TAG_MONSTER_FOOT               (ANIM_SPRITES_START + 51)\n#define ANIM_TAG_HUMANOID_HAND              (ANIM_SPRITES_START + 52) // unused\n#define ANIM_TAG_NOISE_LINE                 (ANIM_SPRITES_START + 53)\n#define ANIM_TAG_YELLOW_UNK                 (ANIM_SPRITES_START + 54) // unused\n#define ANIM_TAG_RED_FIST                   (ANIM_SPRITES_START + 55) // unused\n#define ANIM_TAG_SLAM_HIT                   (ANIM_SPRITES_START + 56)\n#define ANIM_TAG_RING                       (ANIM_SPRITES_START + 57) // unused\n#define ANIM_TAG_ROCKS                      (ANIM_SPRITES_START + 58)\n#define ANIM_TAG_Z                          (ANIM_SPRITES_START + 59) // unused\n#define ANIM_TAG_YELLOW_UNK_2               (ANIM_SPRITES_START + 60) // unused\n#define ANIM_TAG_AIR_SLASH                  (ANIM_SPRITES_START + 61) // unused\n#define ANIM_TAG_SPINNING_GREEN_ORBS        (ANIM_SPRITES_START + 62) // unused\n#define ANIM_TAG_LEAF                       (ANIM_SPRITES_START + 63)\n#define ANIM_TAG_FINGER                     (ANIM_SPRITES_START + 64)\n#define ANIM_TAG_POISON_POWDER              (ANIM_SPRITES_START + 65)\n#define ANIM_TAG_BROWN_TRIANGLE             (ANIM_SPRITES_START + 66) // unused\n#define ANIM_TAG_SLEEP_POWDER               (ANIM_SPRITES_START + 67)\n#define ANIM_TAG_STUN_SPORE                 (ANIM_SPRITES_START + 68)\n#define ANIM_TAG_POWDER                     (ANIM_SPRITES_START + 69) // unused\n#define ANIM_TAG_SPARKLE_3                  (ANIM_SPRITES_START + 70)\n#define ANIM_TAG_SPARKLE_4                  (ANIM_SPRITES_START + 71)\n#define ANIM_TAG_MUSIC_NOTES                (ANIM_SPRITES_START + 72)\n#define ANIM_TAG_DUCK                       (ANIM_SPRITES_START + 73)\n#define ANIM_TAG_MUD_SAND                   (ANIM_SPRITES_START + 74)\n#define ANIM_TAG_ALERT                      (ANIM_SPRITES_START + 75)\n#define ANIM_TAG_BLUE_FLAMES                (ANIM_SPRITES_START + 76) // unused\n#define ANIM_TAG_BLUE_FLAMES_2              (ANIM_SPRITES_START + 77) // unused\n#define ANIM_TAG_SHOCK_4                    (ANIM_SPRITES_START + 78) // unused\n#define ANIM_TAG_SHOCK                      (ANIM_SPRITES_START + 79)\n#define ANIM_TAG_BELL_2                     (ANIM_SPRITES_START + 80) // unused\n#define ANIM_TAG_PINK_GLOVE                 (ANIM_SPRITES_START + 81) // unused\n#define ANIM_TAG_BLUE_LINES                 (ANIM_SPRITES_START + 82) // unused\n#define ANIM_TAG_IMPACT_3                   (ANIM_SPRITES_START + 83) // unused\n#define ANIM_TAG_IMPACT_2                   (ANIM_SPRITES_START + 84) // unused\n#define ANIM_TAG_RETICLE                    (ANIM_SPRITES_START + 85) // unused\n#define ANIM_TAG_BREATH                     (ANIM_SPRITES_START + 86)\n#define ANIM_TAG_ANGER                      (ANIM_SPRITES_START + 87)\n#define ANIM_TAG_SNOWBALL                   (ANIM_SPRITES_START + 88) // unused\n#define ANIM_TAG_VINE                       (ANIM_SPRITES_START + 89) // unused\n#define ANIM_TAG_SWORD_2                    (ANIM_SPRITES_START + 90) // unused\n#define ANIM_TAG_CLAPPING                   (ANIM_SPRITES_START + 91) // unused\n#define ANIM_TAG_RED_TUBE                   (ANIM_SPRITES_START + 92) // unused\n#define ANIM_TAG_AMNESIA                    (ANIM_SPRITES_START + 93)\n#define ANIM_TAG_STRING_2                   (ANIM_SPRITES_START + 94) // unused\n#define ANIM_TAG_PENCIL_2                   (ANIM_SPRITES_START + 95) // unused\n#define ANIM_TAG_PETAL                      (ANIM_SPRITES_START + 96) // unused\n#define ANIM_TAG_BENT_SPOON                 (ANIM_SPRITES_START + 97)\n#define ANIM_TAG_WEB                        (ANIM_SPRITES_START + 98) // unused\n#define ANIM_TAG_MILK_BOTTLE                (ANIM_SPRITES_START + 99)\n#define ANIM_TAG_COIN                       (ANIM_SPRITES_START + 100)\n#define ANIM_TAG_CRACKED_EGG                (ANIM_SPRITES_START + 101) // unused\n#define ANIM_TAG_HATCHED_EGG                (ANIM_SPRITES_START + 102) // unused\n#define ANIM_TAG_FRESH_EGG                  (ANIM_SPRITES_START + 103) // unused\n#define ANIM_TAG_FANGS                      (ANIM_SPRITES_START + 104) // unused\n#define ANIM_TAG_EXPLOSION_2                (ANIM_SPRITES_START + 105) // unused\n#define ANIM_TAG_EXPLOSION_3                (ANIM_SPRITES_START + 106) // unused\n#define ANIM_TAG_WATER_DROPLET              (ANIM_SPRITES_START + 107) // unused\n#define ANIM_TAG_WATER_DROPLET_2            (ANIM_SPRITES_START + 108) // unused\n#define ANIM_TAG_SEED_2                     (ANIM_SPRITES_START + 109) // unused\n#define ANIM_TAG_SPROUT                     (ANIM_SPRITES_START + 110) // unused\n#define ANIM_TAG_RED_WAND                   (ANIM_SPRITES_START + 111) // unused\n#define ANIM_TAG_PURPLE_GREEN_UNK           (ANIM_SPRITES_START + 112) // unused\n#define ANIM_TAG_WATER_COLUMN               (ANIM_SPRITES_START + 113) // unused\n#define ANIM_TAG_MUD_UNK                    (ANIM_SPRITES_START + 114) // unused\n#define ANIM_TAG_RAIN_DROPS                 (ANIM_SPRITES_START + 115)\n#define ANIM_TAG_FURY_SWIPES                (ANIM_SPRITES_START + 116) // unused\n#define ANIM_TAG_VINE_2                     (ANIM_SPRITES_START + 117) // unused\n#define ANIM_TAG_TEETH                      (ANIM_SPRITES_START + 118) // unused\n#define ANIM_TAG_BONE_2                     (ANIM_SPRITES_START + 119) // unused\n#define ANIM_TAG_WHITE_BAG                  (ANIM_SPRITES_START + 120) // unused\n#define ANIM_TAG_UNKNOWN                    (ANIM_SPRITES_START + 121) // unused\n#define ANIM_TAG_PURPLE_CORAL               (ANIM_SPRITES_START + 122) // unused\n#define ANIM_TAG_PURPLE_DROPLET             (ANIM_SPRITES_START + 123) // unused\n#define ANIM_TAG_SHOCK_2                    (ANIM_SPRITES_START + 124) // unused\n#define ANIM_TAG_CLOSING_EYE_2              (ANIM_SPRITES_START + 125) // unused\n#define ANIM_TAG_METAL_BALL                 (ANIM_SPRITES_START + 126) // unused\n#define ANIM_TAG_MONSTER_DOLL               (ANIM_SPRITES_START + 127) // unused\n#define ANIM_TAG_WHIRLWIND                  (ANIM_SPRITES_START + 128) // unused\n#define ANIM_TAG_WHIRLWIND_2                (ANIM_SPRITES_START + 129) // unused\n#define ANIM_TAG_EXPLOSION_4                (ANIM_SPRITES_START + 130) // unused\n#define ANIM_TAG_EXPLOSION_5                (ANIM_SPRITES_START + 131) // unused\n#define ANIM_TAG_TONGUE                     (ANIM_SPRITES_START + 132) // unused\n#define ANIM_TAG_SMOKE                      (ANIM_SPRITES_START + 133) // unused\n#define ANIM_TAG_SMOKE_2                    (ANIM_SPRITES_START + 134) // unused\n#define ANIM_TAG_IMPACT                     (ANIM_SPRITES_START + 135)\n#define ANIM_TAG_CIRCLE_IMPACT              (ANIM_SPRITES_START + 136)\n#define ANIM_TAG_SCRATCH                    (ANIM_SPRITES_START + 137)\n#define ANIM_TAG_CUT                        (ANIM_SPRITES_START + 138)\n#define ANIM_TAG_SHARP_TEETH                (ANIM_SPRITES_START + 139)\n#define ANIM_TAG_RAINBOW_RINGS              (ANIM_SPRITES_START + 140)\n#define ANIM_TAG_ICE_CRYSTALS               (ANIM_SPRITES_START + 141)\n#define ANIM_TAG_ICE_SPIKES                 (ANIM_SPRITES_START + 142)\n#define ANIM_TAG_HANDS_AND_FEET             (ANIM_SPRITES_START + 143)\n#define ANIM_TAG_MIST_CLOUD                 (ANIM_SPRITES_START + 144)\n#define ANIM_TAG_CLAMP                      (ANIM_SPRITES_START + 145)\n#define ANIM_TAG_BUBBLE                     (ANIM_SPRITES_START + 146)\n#define ANIM_TAG_ORBS                       (ANIM_SPRITES_START + 147)\n#define ANIM_TAG_WATER_IMPACT               (ANIM_SPRITES_START + 148)\n#define ANIM_TAG_WATER_ORB                  (ANIM_SPRITES_START + 149)\n#define ANIM_TAG_POISON_BUBBLE              (ANIM_SPRITES_START + 150)\n#define ANIM_TAG_TOXIC_BUBBLE               (ANIM_SPRITES_START + 151)\n#define ANIM_TAG_SPIKES                     (ANIM_SPRITES_START + 152)\n#define ANIM_TAG_HORN_HIT_2                 (ANIM_SPRITES_START + 153)\n#define ANIM_TAG_AIR_WAVE_2                 (ANIM_SPRITES_START + 154)\n#define ANIM_TAG_SMALL_BUBBLES              (ANIM_SPRITES_START + 155)\n#define ANIM_TAG_ROUND_SHADOW               (ANIM_SPRITES_START + 156)\n#define ANIM_TAG_SUNLIGHT                   (ANIM_SPRITES_START + 157)\n#define ANIM_TAG_SPORE                      (ANIM_SPRITES_START + 158)\n#define ANIM_TAG_FLOWER                     (ANIM_SPRITES_START + 159)\n#define ANIM_TAG_RAZOR_LEAF                 (ANIM_SPRITES_START + 160)\n#define ANIM_TAG_NEEDLE                     (ANIM_SPRITES_START + 161)\n#define ANIM_TAG_WHIRLWIND_LINES            (ANIM_SPRITES_START + 162)\n#define ANIM_TAG_GOLD_RING                  (ANIM_SPRITES_START + 163)\n#define ANIM_TAG_PURPLE_RING                (ANIM_SPRITES_START + 164)\n#define ANIM_TAG_BLUE_RING                  (ANIM_SPRITES_START + 165)\n#define ANIM_TAG_GREEN_LIGHT_WALL           (ANIM_SPRITES_START + 166)\n#define ANIM_TAG_BLUE_LIGHT_WALL            (ANIM_SPRITES_START + 167)\n#define ANIM_TAG_RED_LIGHT_WALL             (ANIM_SPRITES_START + 168)\n#define ANIM_TAG_GRAY_LIGHT_WALL            (ANIM_SPRITES_START + 169)\n#define ANIM_TAG_ORANGE_LIGHT_WALL          (ANIM_SPRITES_START + 170)\n#define ANIM_TAG_BLACK_BALL_2               (ANIM_SPRITES_START + 171)\n#define ANIM_TAG_PURPLE_GAS_CLOUD           (ANIM_SPRITES_START + 172)\n#define ANIM_TAG_SPARK_H                    (ANIM_SPRITES_START + 173)\n#define ANIM_TAG_YELLOW_STAR                (ANIM_SPRITES_START + 174)\n#define ANIM_TAG_LARGE_FRESH_EGG            (ANIM_SPRITES_START + 175)\n#define ANIM_TAG_SHADOW_BALL                (ANIM_SPRITES_START + 176)\n#define ANIM_TAG_LICK                       (ANIM_SPRITES_START + 177)\n#define ANIM_TAG_VOID_LINES                 (ANIM_SPRITES_START + 178)\n#define ANIM_TAG_STRING                     (ANIM_SPRITES_START + 179)\n#define ANIM_TAG_WEB_THREAD                 (ANIM_SPRITES_START + 180)\n#define ANIM_TAG_SPIDER_WEB                 (ANIM_SPRITES_START + 181)\n#define ANIM_TAG_LIGHTBULB                  (ANIM_SPRITES_START + 182) // unused\n#define ANIM_TAG_SLASH                      (ANIM_SPRITES_START + 183)\n#define ANIM_TAG_FOCUS_ENERGY               (ANIM_SPRITES_START + 184)\n#define ANIM_TAG_SPHERE_TO_CUBE             (ANIM_SPRITES_START + 185)\n#define ANIM_TAG_TENDRILS                   (ANIM_SPRITES_START + 186)\n#define ANIM_TAG_EYE                        (ANIM_SPRITES_START + 187)\n#define ANIM_TAG_WHITE_SHADOW               (ANIM_SPRITES_START + 188)\n#define ANIM_TAG_TEAL_ALERT                 (ANIM_SPRITES_START + 189)\n#define ANIM_TAG_OPENING_EYE                (ANIM_SPRITES_START + 190)\n#define ANIM_TAG_ROUND_WHITE_HALO           (ANIM_SPRITES_START + 191)\n#define ANIM_TAG_FANG_ATTACK                (ANIM_SPRITES_START + 192)\n#define ANIM_TAG_PURPLE_HAND_OUTLINE        (ANIM_SPRITES_START + 193)\n#define ANIM_TAG_MOON                       (ANIM_SPRITES_START + 194)\n#define ANIM_TAG_GREEN_SPARKLE              (ANIM_SPRITES_START + 195)\n#define ANIM_TAG_SPIRAL                     (ANIM_SPRITES_START + 196)\n#define ANIM_TAG_SNORE_Z                    (ANIM_SPRITES_START + 197)\n#define ANIM_TAG_EXPLOSION                  (ANIM_SPRITES_START + 198)\n#define ANIM_TAG_NAIL                       (ANIM_SPRITES_START + 199)\n#define ANIM_TAG_GHOSTLY_SPIRIT             (ANIM_SPRITES_START + 200)\n#define ANIM_TAG_WARM_ROCK                  (ANIM_SPRITES_START + 201)\n#define ANIM_TAG_BREAKING_EGG               (ANIM_SPRITES_START + 202)\n#define ANIM_TAG_THIN_RING                  (ANIM_SPRITES_START + 203)\n#define ANIM_TAG_PUNCH_IMPACT               (ANIM_SPRITES_START + 204) // unused\n#define ANIM_TAG_BELL                       (ANIM_SPRITES_START + 205)\n#define ANIM_TAG_MUSIC_NOTES_2              (ANIM_SPRITES_START + 206)\n#define ANIM_TAG_SPEED_DUST                 (ANIM_SPRITES_START + 207)\n#define ANIM_TAG_TORN_METAL                 (ANIM_SPRITES_START + 208)\n#define ANIM_TAG_THOUGHT_BUBBLE             (ANIM_SPRITES_START + 209)\n#define ANIM_TAG_MAGENTA_HEART              (ANIM_SPRITES_START + 210)\n#define ANIM_TAG_ELECTRIC_ORBS              (ANIM_SPRITES_START + 211)\n#define ANIM_TAG_CIRCLE_OF_LIGHT            (ANIM_SPRITES_START + 212)\n#define ANIM_TAG_ELECTRICITY                (ANIM_SPRITES_START + 213)\n#define ANIM_TAG_FINGER_2                   (ANIM_SPRITES_START + 214)\n#define ANIM_TAG_MOVEMENT_WAVES             (ANIM_SPRITES_START + 215)\n#define ANIM_TAG_RED_HEART                  (ANIM_SPRITES_START + 216)\n#define ANIM_TAG_RED_ORB                    (ANIM_SPRITES_START + 217)\n#define ANIM_TAG_EYE_SPARKLE                (ANIM_SPRITES_START + 218)\n#define ANIM_TAG_PINK_HEART                 (ANIM_SPRITES_START + 219)\n#define ANIM_TAG_ANGEL                      (ANIM_SPRITES_START + 220)\n#define ANIM_TAG_DEVIL                      (ANIM_SPRITES_START + 221)\n#define ANIM_TAG_SWIPE                      (ANIM_SPRITES_START + 222)\n#define ANIM_TAG_ROOTS                      (ANIM_SPRITES_START + 223)\n#define ANIM_TAG_ITEM_BAG                   (ANIM_SPRITES_START + 224)\n#define ANIM_TAG_JAGGED_MUSIC_NOTE          (ANIM_SPRITES_START + 225)\n#define ANIM_TAG_POKEBALL                   (ANIM_SPRITES_START + 226)\n#define ANIM_TAG_SPOTLIGHT                  (ANIM_SPRITES_START + 227)\n#define ANIM_TAG_LETTER_Z                   (ANIM_SPRITES_START + 228)\n#define ANIM_TAG_RAPID_SPIN                 (ANIM_SPRITES_START + 229)\n#define ANIM_TAG_TRI_ATTACK_TRIANGLE        (ANIM_SPRITES_START + 230)\n#define ANIM_TAG_WISP_ORB                   (ANIM_SPRITES_START + 231)\n#define ANIM_TAG_WISP_FIRE                  (ANIM_SPRITES_START + 232)\n#define ANIM_TAG_GOLD_STARS                 (ANIM_SPRITES_START + 233)\n#define ANIM_TAG_ECLIPSING_ORB              (ANIM_SPRITES_START + 234)\n#define ANIM_TAG_GRAY_ORB                   (ANIM_SPRITES_START + 235)\n#define ANIM_TAG_BLUE_ORB                   (ANIM_SPRITES_START + 236)\n#define ANIM_TAG_RED_ORB_2                  (ANIM_SPRITES_START + 237)\n#define ANIM_TAG_PINK_PETAL                 (ANIM_SPRITES_START + 238)\n#define ANIM_TAG_PAIN_SPLIT                 (ANIM_SPRITES_START + 239)\n#define ANIM_TAG_CONFETTI                   (ANIM_SPRITES_START + 240)\n#define ANIM_TAG_GREEN_STAR                 (ANIM_SPRITES_START + 241)\n#define ANIM_TAG_PINK_CLOUD                 (ANIM_SPRITES_START + 242)\n#define ANIM_TAG_SWEAT_DROP                 (ANIM_SPRITES_START + 243)\n#define ANIM_TAG_GUARD_RING                 (ANIM_SPRITES_START + 244)\n#define ANIM_TAG_PURPLE_SCRATCH             (ANIM_SPRITES_START + 245)\n#define ANIM_TAG_PURPLE_SWIPE               (ANIM_SPRITES_START + 246)\n#define ANIM_TAG_TAG_HAND                   (ANIM_SPRITES_START + 247)\n#define ANIM_TAG_SMALL_RED_EYE              (ANIM_SPRITES_START + 248)\n#define ANIM_TAG_HOLLOW_ORB                 (ANIM_SPRITES_START + 249)\n#define ANIM_TAG_X_SIGN                     (ANIM_SPRITES_START + 250)\n#define ANIM_TAG_BLUEGREEN_ORB              (ANIM_SPRITES_START + 251)\n#define ANIM_TAG_PAW_PRINT                  (ANIM_SPRITES_START + 252)\n#define ANIM_TAG_PURPLE_FLAME               (ANIM_SPRITES_START + 253)\n#define ANIM_TAG_RED_BALL                   (ANIM_SPRITES_START + 254)\n#define ANIM_TAG_SMELLINGSALT_EFFECT        (ANIM_SPRITES_START + 255)\n#define ANIM_TAG_METEOR                     (ANIM_SPRITES_START + 256)\n#define ANIM_TAG_FLAT_ROCK                  (ANIM_SPRITES_START + 257)\n#define ANIM_TAG_MAGNIFYING_GLASS           (ANIM_SPRITES_START + 258)\n#define ANIM_TAG_BROWN_ORB                  (ANIM_SPRITES_START + 259)\n#define ANIM_TAG_METAL_SOUND_WAVES          (ANIM_SPRITES_START + 260)\n#define ANIM_TAG_FLYING_DIRT                (ANIM_SPRITES_START + 261)\n#define ANIM_TAG_ICICLE_SPEAR               (ANIM_SPRITES_START + 262)\n#define ANIM_TAG_HAIL                       (ANIM_SPRITES_START + 263)\n#define ANIM_TAG_GLOWY_RED_ORB              (ANIM_SPRITES_START + 264)\n#define ANIM_TAG_GLOWY_GREEN_ORB            (ANIM_SPRITES_START + 265)\n#define ANIM_TAG_GREEN_SPIKE                (ANIM_SPRITES_START + 266)\n#define ANIM_TAG_WHITE_CIRCLE_OF_LIGHT      (ANIM_SPRITES_START + 267)\n#define ANIM_TAG_GLOWY_BLUE_ORB             (ANIM_SPRITES_START + 268)\n#define ANIM_TAG_SAFARI_BAIT                (ANIM_SPRITES_START + 269)\n#define ANIM_TAG_WHITE_FEATHER              (ANIM_SPRITES_START + 270)\n#define ANIM_TAG_SPARKLE_6                  (ANIM_SPRITES_START + 271)\n#define ANIM_TAG_SPLASH                     (ANIM_SPRITES_START + 272)\n#define ANIM_TAG_SWEAT_BEAD                 (ANIM_SPRITES_START + 273)\n#define ANIM_TAG_GEM_1                      (ANIM_SPRITES_START + 274) // unused\n#define ANIM_TAG_GEM_2                      (ANIM_SPRITES_START + 275) // unused\n#define ANIM_TAG_GEM_3                      (ANIM_SPRITES_START + 276) // unused\n#define ANIM_TAG_SLAM_HIT_2                 (ANIM_SPRITES_START + 277)\n#define ANIM_TAG_RECYCLE                    (ANIM_SPRITES_START + 278)\n#define ANIM_TAG_RED_PARTICLES              (ANIM_SPRITES_START + 279) // unused\n#define ANIM_TAG_PROTECT                    (ANIM_SPRITES_START + 280)\n#define ANIM_TAG_DIRT_MOUND                 (ANIM_SPRITES_START + 281)\n#define ANIM_TAG_SHOCK_3                    (ANIM_SPRITES_START + 282)\n#define ANIM_TAG_WEATHER_BALL               (ANIM_SPRITES_START + 283)\n#define ANIM_TAG_BIRD                       (ANIM_SPRITES_START + 284)\n#define ANIM_TAG_CROSS_IMPACT               (ANIM_SPRITES_START + 285)\n#define ANIM_TAG_SLASH_2                    (ANIM_SPRITES_START + 286)\n#define ANIM_TAG_WHIP_HIT                   (ANIM_SPRITES_START + 287)\n#define ANIM_TAG_BLUE_RING_2                (ANIM_SPRITES_START + 288)\n\n// battlers\n#define ANIM_ATTACKER    0\n#define ANIM_TARGET      1\n#define ANIM_ATK_PARTNER 2\n#define ANIM_DEF_PARTNER 3\n\n// stereo panning constants [0-255]\n//\n//          0\n//         .  .\n//      .        .\n// 192 .          . 63\n//     .          .\n//      .        .\n//         .  .\n//          127\n//\n#define SOUND_PAN_ATTACKER -64\n#define SOUND_PAN_TARGET    63\n\n// move background ids\n#define BG_NONE 0 // the same as BG_DARK\n#define BG_DARK 1\n#define BG_GHOST 2\n#define BG_PSYCHIC 3\n#define BG_IMPACT_OPPONENT 4\n#define BG_IMPACT_PLAYER 5\n#define BG_IMPACT_CONTESTS 6\n#define BG_DRILL 7\n#define BG_DRILL_CONTESTS 8\n#define BG_HIGHSPEED_OPPONENT 9\n#define BG_HIGHSPEED_PLAYER 10\n#define BG_THUNDER 11\n#define BG_GUILLOTINE_OPPONENT 12\n#define BG_GUILLOTINE_PLAYER 13\n#define BG_GUILLOTINE_CONTESTS 14\n#define BG_ICE 15\n#define BG_COSMIC 16\n#define BG_IN_AIR 17\n#define BG_SKY 18\n#define BG_SKY_CONTESTS 19\n#define BG_AURORA 20\n#define BG_FISSURE 21\n#define BG_BUG_OPPONENT 22\n#define BG_BUG_PLAYER 23\n#define BG_SOLAR_BEAM_OPPONENT 24\n#define BG_SOLAR_BEAM_PLAYER 25\n#define BG_SOLAR_BEAM_CONTESTS 26\n\n// table ids for general animations (gBattleAnims_General)\n#define B_ANIM_CASTFORM_CHANGE          0\n#define B_ANIM_STATS_CHANGE             1\n#define B_ANIM_SUBSTITUTE_FADE          2\n#define B_ANIM_SUBSTITUTE_APPEAR        3\n#define B_ANIM_BAIT_THROW               4\n#define B_ANIM_ITEM_KNOCKOFF            5\n#define B_ANIM_TURN_TRAP                6\n#define B_ANIM_HELD_ITEM_EFFECT         7\n#define B_ANIM_SMOKEBALL_ESCAPE         8\n#define B_ANIM_FOCUS_BAND               9\n#define B_ANIM_RAIN_CONTINUES           10\n#define B_ANIM_SUN_CONTINUES            11\n#define B_ANIM_SANDSTORM_CONTINUES      12\n#define B_ANIM_HAIL_CONTINUES           13\n#define B_ANIM_LEECH_SEED_DRAIN         14\n#define B_ANIM_MON_HIT                  15\n#define B_ANIM_ITEM_STEAL               16\n#define B_ANIM_SNATCH_MOVE              17\n#define B_ANIM_FUTURE_SIGHT_HIT         18\n#define B_ANIM_DOOM_DESIRE_HIT          19\n#define B_ANIM_FOCUS_PUNCH_SETUP        20\n#define B_ANIM_INGRAIN_HEAL             21\n#define B_ANIM_WISH_HEAL                22\n#define B_ANIM_MON_SCARED               23\n#define B_ANIM_GHOST_GET_OUT            24\n#define B_ANIM_SILPH_SCOPED             25\n#define B_ANIM_ROCK_THROW               26\n#define B_ANIM_SAFARI_REACTION          27\n\n// special animations table (gBattleAnims_Special)\n#define B_ANIM_LVL_UP                   0\n#define B_ANIM_SWITCH_OUT_PLAYER_MON    1\n#define B_ANIM_SWITCH_OUT_OPPONENT_MON  2\n#define B_ANIM_BALL_THROW               3\n#define B_ANIM_BALL_THROW_WITH_TRAINER  4\n#define B_ANIM_SUBSTITUTE_TO_MON        5\n#define B_ANIM_MON_TO_SUBSTITUTE        6\n\n// status animation table (gBattleAnims_StatusConditions)\n#define B_ANIM_STATUS_PSN               0\n#define B_ANIM_STATUS_CONFUSION         1\n#define B_ANIM_STATUS_BRN               2\n#define B_ANIM_STATUS_INFATUATION       3\n#define B_ANIM_STATUS_SLP               4\n#define B_ANIM_STATUS_PRZ               5\n#define B_ANIM_STATUS_FRZ               6\n#define B_ANIM_STATUS_CURSED            7\n#define B_ANIM_STATUS_NIGHTMARE         8\n#define B_ANIM_STATUS_WRAPPED           9 // does not actually exist\n\n// Most tasks return a value to gBattleAnimArgs[7].\n#define ARG_RET_ID 7\n\n// For createsprite macro to use internally\n#define ANIMSPRITE_IS_TARGET (1 << 7)\n\n// Trapping Wrap-like moves end turn animation.\n#define TRAP_ANIM_BIND 0\n#define TRAP_ANIM_WRAP 0\n#define TRAP_ANIM_FIRE_SPIN 1\n#define TRAP_ANIM_WHIRLPOOL 2\n#define TRAP_ANIM_CLAMP 3\n#define TRAP_ANIM_SAND_TOMB 4\n\n// Weather defines for battle animation scripts.\n#define ANIM_WEATHER_NONE 0\n#define ANIM_WEATHER_SUN 1\n#define ANIM_WEATHER_RAIN 2\n#define ANIM_WEATHER_SANDSTORM 3\n#define ANIM_WEATHER_HAIL 4\n\n// Flags given to various functions to indicate which palettes to consider.\n// Handled by UnpackSelectedBattlePalettes\n#define F_PAL_BG          (1 << 0)\n#define F_PAL_ATTACKER    (1 << 1)\n#define F_PAL_TARGET      (1 << 2)\n#define F_PAL_ATK_PARTNER (1 << 3)\n#define F_PAL_DEF_PARTNER (1 << 4)\n#define F_PAL_ANIM_1      (1 << 5) // Palette set for GetBattleAnimBg1Data/GetBattleAnimBgDataByPriorityRank. Only used (ineffectually?) by Aromatherapy.\n#define F_PAL_ANIM_2      (1 << 6) // Palette set for GetBattleAnimBgData/GetBattleAnimBgDataByPriorityRank. Unused.\n#define F_PAL_ATK_SIDE    (F_PAL_ATTACKER | F_PAL_ATK_PARTNER)\n#define F_PAL_DEF_SIDE    (F_PAL_TARGET | F_PAL_DEF_PARTNER)\n#define F_PAL_BATTLERS    (F_PAL_ATK_SIDE | F_PAL_DEF_SIDE)\n// The below are only used by AnimTask_BlendBattleAnimPal to get battler sprite palettes by position rather than by role.\n// It's redundant with F_PAL_BATTLERS, because they're only ever used together to refer to all the battlers at once.\n#define F_PAL_BATTLERS_2  (1 << 7 | 1 << 8 | 1 << 9 | 1 << 10)\n\n// Battle mon back animations.\n#define BACK_ANIM_NONE                         0x00\n#define BACK_ANIM_H_SLIDE_QUICK                0x01\n#define BACK_ANIM_H_SLIDE                      0x02\n#define BACK_ANIM_H_SLIDE_WITH_V_COMPRESS_1    0x03\n#define BACK_ANIM_H_SLIDE_WITH_V_COMPRESS_2    0x04\n#define BACK_ANIM_SHRINK_GROW_1                0x05\n#define BACK_ANIM_GROW_1                       0x06\n#define BACK_ANIM_CIRCLE_MOVE_COUNTERCLOCKWISE 0x07\n#define BACK_ANIM_HORIZONTAL_SHAKE             0x08\n#define BACK_ANIM_VERTICAL_SHAKE               0x09\n#define BACK_ANIM_V_SHAKE_WITH_H_SLIDE         0x0a\n#define BACK_ANIM_VERTICAL_STRETCH             0x0b\n#define BACK_ANIM_HORIZONTAL_STRETCH           0x0c\n#define BACK_ANIM_GROW_2                       0x0d\n#define BACK_ANIM_V_SHAKE_WITH_PAUSE           0x0e\n#define BACK_ANIM_CIRCLE_MOVE_CLOCKWISE        0x0f\n#define BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL  0x10\n#define BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE  0x11\n#define BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE    0x12\n#define BACK_ANIM_DIP_RIGHT_SIDE               0x13\n#define BACK_ANIM_SHRINK_GROW_2                0x14\n#define BACK_ANIM_JOLT_RIGHT                   0x15\n#define BACK_ANIM_FLASH_YELLOW_WITH_SHAKE      0x16\n#define BACK_ANIM_FADE_RED_WITH_SHAKE          0x17\n#define BACK_ANIM_FADE_GREEN_WITH_SHAKE        0x18\n#define BACK_ANIM_FADE_BLUE_WITH_SHAKE         0x19\n\n\n#endif // GUARD_CONSTANTS_BATTLE_ANIM_H\n"
  },
  {
    "path": "include/constants/battle_move_effects.h",
    "content": "#ifndef GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H\n#define GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H\n\n#define EFFECT_HIT 0\n#define EFFECT_SLEEP 1\n#define EFFECT_POISON_HIT 2\n#define EFFECT_ABSORB 3\n#define EFFECT_BURN_HIT 4\n#define EFFECT_FREEZE_HIT 5\n#define EFFECT_PARALYZE_HIT 6\n#define EFFECT_EXPLOSION 7\n#define EFFECT_DREAM_EATER 8\n#define EFFECT_MIRROR_MOVE 9\n#define EFFECT_ATTACK_UP 10\n#define EFFECT_DEFENSE_UP 11\n#define EFFECT_SPEED_UP 12\n#define EFFECT_SPECIAL_ATTACK_UP 13\n#define EFFECT_SPECIAL_DEFENSE_UP 14\n#define EFFECT_ACCURACY_UP 15\n#define EFFECT_EVASION_UP 16\n#define EFFECT_ALWAYS_HIT 17\n#define EFFECT_ATTACK_DOWN 18\n#define EFFECT_DEFENSE_DOWN 19\n#define EFFECT_SPEED_DOWN 20\n#define EFFECT_SPECIAL_ATTACK_DOWN 21  // unused\n#define EFFECT_SPECIAL_DEFENSE_DOWN 22  // unused\n#define EFFECT_ACCURACY_DOWN 23\n#define EFFECT_EVASION_DOWN 24\n#define EFFECT_HAZE 25\n#define EFFECT_BIDE 26\n#define EFFECT_RAMPAGE 27\n#define EFFECT_ROAR 28\n#define EFFECT_MULTI_HIT 29\n#define EFFECT_CONVERSION 30\n#define EFFECT_FLINCH_HIT 31\n#define EFFECT_RESTORE_HP 32\n#define EFFECT_TOXIC 33\n#define EFFECT_PAY_DAY 34\n#define EFFECT_LIGHT_SCREEN 35\n#define EFFECT_TRI_ATTACK 36\n#define EFFECT_REST 37\n#define EFFECT_OHKO 38\n#define EFFECT_RAZOR_WIND 39\n#define EFFECT_SUPER_FANG 40\n#define EFFECT_DRAGON_RAGE 41\n#define EFFECT_TRAP 42\n#define EFFECT_HIGH_CRITICAL 43\n#define EFFECT_DOUBLE_HIT 44\n#define EFFECT_RECOIL_IF_MISS 45\n#define EFFECT_MIST 46\n#define EFFECT_FOCUS_ENERGY 47\n#define EFFECT_RECOIL 48\n#define EFFECT_CONFUSE 49\n#define EFFECT_ATTACK_UP_2 50\n#define EFFECT_DEFENSE_UP_2 51\n#define EFFECT_SPEED_UP_2 52\n#define EFFECT_SPECIAL_ATTACK_UP_2 53\n#define EFFECT_SPECIAL_DEFENSE_UP_2 54\n#define EFFECT_ACCURACY_UP_2 55\n#define EFFECT_EVASION_UP_2 56\n#define EFFECT_TRANSFORM 57\n#define EFFECT_ATTACK_DOWN_2 58\n#define EFFECT_DEFENSE_DOWN_2 59\n#define EFFECT_SPEED_DOWN_2 60\n#define EFFECT_SPECIAL_ATTACK_DOWN_2 61\n#define EFFECT_SPECIAL_DEFENSE_DOWN_2 62\n#define EFFECT_ACCURACY_DOWN_2 63\n#define EFFECT_EVASION_DOWN_2 64\n#define EFFECT_REFLECT 65\n#define EFFECT_POISON 66\n#define EFFECT_PARALYZE 67\n#define EFFECT_ATTACK_DOWN_HIT 68\n#define EFFECT_DEFENSE_DOWN_HIT 69\n#define EFFECT_SPEED_DOWN_HIT 70\n#define EFFECT_SPECIAL_ATTACK_DOWN_HIT 71\n#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 72\n#define EFFECT_ACCURACY_DOWN_HIT 73\n#define EFFECT_EVASION_DOWN_HIT 74\n#define EFFECT_SKY_ATTACK 75\n#define EFFECT_CONFUSE_HIT 76\n#define EFFECT_TWINEEDLE 77\n#define EFFECT_VITAL_THROW 78\n#define EFFECT_SUBSTITUTE 79\n#define EFFECT_RECHARGE 80\n#define EFFECT_RAGE 81\n#define EFFECT_MIMIC 82\n#define EFFECT_METRONOME 83\n#define EFFECT_LEECH_SEED 84\n#define EFFECT_SPLASH 85\n#define EFFECT_DISABLE 86\n#define EFFECT_LEVEL_DAMAGE 87\n#define EFFECT_PSYWAVE 88\n#define EFFECT_COUNTER 89\n#define EFFECT_ENCORE 90\n#define EFFECT_PAIN_SPLIT 91\n#define EFFECT_SNORE 92\n#define EFFECT_CONVERSION_2 93\n#define EFFECT_LOCK_ON 94\n#define EFFECT_SKETCH 95\n#define EFFECT_UNUSED_60 96  // thaw\n#define EFFECT_SLEEP_TALK 97\n#define EFFECT_DESTINY_BOND 98\n#define EFFECT_FLAIL 99\n#define EFFECT_SPITE 100\n#define EFFECT_FALSE_SWIPE 101\n#define EFFECT_HEAL_BELL 102\n#define EFFECT_QUICK_ATTACK 103\n#define EFFECT_TRIPLE_KICK 104\n#define EFFECT_THIEF 105\n#define EFFECT_MEAN_LOOK 106\n#define EFFECT_NIGHTMARE 107\n#define EFFECT_MINIMIZE 108\n#define EFFECT_CURSE 109\n#define EFFECT_UNUSED_6E 110\n#define EFFECT_PROTECT 111\n#define EFFECT_SPIKES 112\n#define EFFECT_FORESIGHT 113\n#define EFFECT_PERISH_SONG 114\n#define EFFECT_SANDSTORM 115\n#define EFFECT_ENDURE 116\n#define EFFECT_ROLLOUT 117\n#define EFFECT_SWAGGER 118\n#define EFFECT_FURY_CUTTER 119\n#define EFFECT_ATTRACT 120\n#define EFFECT_RETURN 121\n#define EFFECT_PRESENT 122\n#define EFFECT_FRUSTRATION 123\n#define EFFECT_SAFEGUARD 124\n#define EFFECT_THAW_HIT 125\n#define EFFECT_MAGNITUDE 126\n#define EFFECT_BATON_PASS 127\n#define EFFECT_PURSUIT 128\n#define EFFECT_RAPID_SPIN 129\n#define EFFECT_SONICBOOM 130\n#define EFFECT_UNUSED_83 131\n#define EFFECT_MORNING_SUN 132\n#define EFFECT_SYNTHESIS 133\n#define EFFECT_MOONLIGHT 134\n#define EFFECT_HIDDEN_POWER 135\n#define EFFECT_RAIN_DANCE 136\n#define EFFECT_SUNNY_DAY 137\n#define EFFECT_DEFENSE_UP_HIT 138\n#define EFFECT_ATTACK_UP_HIT 139\n#define EFFECT_ALL_STATS_UP_HIT 140\n#define EFFECT_UNUSED_8D 141  // incomplete fake out in gen 2\n#define EFFECT_BELLY_DRUM 142\n#define EFFECT_PSYCH_UP 143\n#define EFFECT_MIRROR_COAT 144\n#define EFFECT_SKULL_BASH 145\n#define EFFECT_TWISTER 146\n#define EFFECT_EARTHQUAKE 147\n#define EFFECT_FUTURE_SIGHT 148\n#define EFFECT_GUST 149\n#define EFFECT_FLINCH_MINIMIZE_HIT 150  // STOMP ASTONISH EXTRASENSORY NEEDLE_ARM\n#define EFFECT_SOLAR_BEAM 151\n#define EFFECT_THUNDER 152\n#define EFFECT_TELEPORT 153\n#define EFFECT_BEAT_UP 154\n#define EFFECT_SEMI_INVULNERABLE 155\n#define EFFECT_DEFENSE_CURL 156\n#define EFFECT_SOFTBOILED 157\n#define EFFECT_FAKE_OUT 158\n#define EFFECT_UPROAR 159\n#define EFFECT_STOCKPILE 160\n#define EFFECT_SPIT_UP 161\n#define EFFECT_SWALLOW 162\n#define EFFECT_UNUSED_A3 163\n#define EFFECT_HAIL 164\n#define EFFECT_TORMENT 165\n#define EFFECT_FLATTER 166\n#define EFFECT_WILL_O_WISP 167\n#define EFFECT_MEMENTO 168\n#define EFFECT_FACADE 169\n#define EFFECT_FOCUS_PUNCH 170\n#define EFFECT_SMELLINGSALT 171\n#define EFFECT_FOLLOW_ME 172\n#define EFFECT_NATURE_POWER 173\n#define EFFECT_CHARGE 174\n#define EFFECT_TAUNT 175\n#define EFFECT_HELPING_HAND 176\n#define EFFECT_TRICK 177\n#define EFFECT_ROLE_PLAY 178\n#define EFFECT_WISH 179\n#define EFFECT_ASSIST 180\n#define EFFECT_INGRAIN 181\n#define EFFECT_SUPERPOWER 182\n#define EFFECT_MAGIC_COAT 183\n#define EFFECT_RECYCLE 184\n#define EFFECT_REVENGE 185\n#define EFFECT_BRICK_BREAK 186\n#define EFFECT_YAWN 187\n#define EFFECT_KNOCK_OFF 188\n#define EFFECT_ENDEAVOR 189\n#define EFFECT_ERUPTION 190\n#define EFFECT_SKILL_SWAP 191\n#define EFFECT_IMPRISON 192\n#define EFFECT_REFRESH 193\n#define EFFECT_GRUDGE 194\n#define EFFECT_SNATCH 195\n#define EFFECT_LOW_KICK 196\n#define EFFECT_SECRET_POWER 197\n#define EFFECT_DOUBLE_EDGE 198\n#define EFFECT_TEETER_DANCE 199\n#define EFFECT_BLAZE_KICK 200\n#define EFFECT_MUD_SPORT 201\n#define EFFECT_POISON_FANG 202\n#define EFFECT_WEATHER_BALL 203\n#define EFFECT_OVERHEAT 204\n#define EFFECT_TICKLE 205\n#define EFFECT_COSMIC_POWER 206\n#define EFFECT_SKY_UPPERCUT 207\n#define EFFECT_BULK_UP 208\n#define EFFECT_POISON_TAIL 209\n#define EFFECT_WATER_SPORT 210\n#define EFFECT_CALM_MIND 211\n#define EFFECT_DRAGON_DANCE 212\n#define EFFECT_CAMOUFLAGE 213\n\n#endif  // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H\n"
  },
  {
    "path": "include/constants/battle_script_commands.h",
    "content": "#ifndef GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H\n#define GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H\n\n// The following correspond to the struct members of BattleScripting by adding their offset\n#define sPAINSPLIT_HP                gBattleScripting + 0x00 // painSplitHp\n#define sBIDE_DMG                    gBattleScripting + 0x04 // bideDmg\n#define sMULTIHIT_STRING             gBattleScripting + 0x08 // multihitString\n#define sDMG_MULTIPLIER              gBattleScripting + 0x0E // dmgMultiplier\n#define sTWOTURN_STRINGID            gBattleScripting + 0x0F // twoTurnsMoveStringId\n#define sB_ANIM_ARG1                 gBattleScripting + 0x10 // animArg1\n#define sB_ANIM_ARG2                 gBattleScripting + 0x11 // animArg2\n#define sTRIPLE_KICK_POWER           gBattleScripting + 0x12 // tripleKickPower\n#define sMOVEEND_STATE               gBattleScripting + 0x14 // moveendState\n#define sBATTLER_WITH_ABILITY        gBattleScripting + 0x15 // battlerWithAbility\n#define sMULTIHIT_EFFECT             gBattleScripting + 0x16 // multihitMoveEffect\n#define sBATTLER                     gBattleScripting + 0x17 // battler\n#define sB_ANIM_TURN                 gBattleScripting + 0x18 // animTurn\n#define sB_ANIM_TARGETS_HIT          gBattleScripting + 0x19 // animTargetsHit\n#define sSTATCHANGER                 gBattleScripting + 0x1A // statChanger\n#define sSTAT_ANIM_PLAYED            gBattleScripting + 0x1B // statAnimPlayed\n#define sGIVEEXP_STATE               gBattleScripting + 0x1C // getexpState\n#define sBATTLE_STYLE                gBattleScripting + 0x1D // battleStyle\n#define sLVLBOX_STATE                gBattleScripting + 0x1E // drawlvlupboxState\n#define sLEARNMOVE_STATE             gBattleScripting + 0x1F // learnMoveState\n#define sPURSUIT_DOUBLES_ATTACKER    gBattleScripting + 0x20 // pursuitDoublesAttacker\n#define sRESHOW_MAIN_STATE           gBattleScripting + 0x21 // reshowMainState\n#define sRESHOW_HELPER_STATE         gBattleScripting + 0x22 // reshowHelperState\n#define sLVLUP_HP                    gBattleScripting + 0x23 // levelUpHP\n\n// Array entries for battle communication\n#define MULTIUSE_STATE          0\n#define CURSOR_POSITION         1\n#define TASK_ID                 1 // task Id and cursor position share the same field\n#define SPRITES_INIT_STATE1     1 // shares the Id as well\n#define SPRITES_INIT_STATE2     2\n#define MOVE_EFFECT_BYTE        3\n#define ACTIONS_CONFIRMED_COUNT 4\n#define MULTISTRING_CHOOSER     5\n#define MISS_TYPE               6\n#define MSG_DISPLAY             7\n#define BATTLE_COMMUNICATION_ENTRIES_COUNT  8\n\n#define cEFFECT_CHOOSER      (gBattleCommunication + MOVE_EFFECT_BYTE)\n#define cMULTISTRING_CHOOSER (gBattleCommunication + MULTISTRING_CHOOSER)\n#define cMISS_TYPE           (gBattleCommunication + MISS_TYPE)\n\n// Battle Script defines for getting the wanted battler\n#define BS_TARGET                   0\n#define BS_ATTACKER                 1\n#define BS_EFFECT_BATTLER           2\n#define BS_FAINTED                  3\n#define BS_ATTACKER_WITH_PARTNER    4 // for Cmd_updatestatusicon\n#define BS_FAINTED_LINK_MULTIPLE_1  5 // for openpartyscreen\n#define BS_FAINTED_LINK_MULTIPLE_2  6 // for openpartyscreen\n#define BS_BATTLER_0                7\n#define BS_ATTACKER_SIDE            8 // for Cmd_jumpifability\n#define BS_NOT_ATTACKER_SIDE        9 // for Cmd_jumpifability\n#define BS_SCRIPTING                10\n#define BS_PLAYER1                  11\n#define BS_OPPONENT1                12\n#define BS_PLAYER2                  13 // for Cmd_updatestatusicon\n#define BS_OPPONENT2                14\n\n// atk 01, accuracy calc\n#define NO_ACC_CALC 0xFFFE\n#define NO_ACC_CALC_CHECK_LOCK_ON 0xFFFF\n#define ACC_CURR_MOVE 0\n\n// compare operands\n#define CMP_EQUAL               0x0\n#define CMP_NOT_EQUAL           0x1\n#define CMP_GREATER_THAN        0x2\n#define CMP_LESS_THAN           0x3\n#define CMP_COMMON_BITS         0x4\n#define CMP_NO_COMMON_BITS      0x5\n\n// TODO: documentation\n// atk76, various\n#define VARIOUS_CANCEL_MULTI_TURN_MOVES         0\n#define VARIOUS_SET_MAGIC_COAT_TARGET           1\n#define VARIOUS_IS_RUNNING_IMPOSSIBLE           2\n#define VARIOUS_GET_MOVE_TARGET                 3\n#define VARIOUS_GET_BATTLER_FAINTED             4\n#define VARIOUS_RESET_INTIMIDATE_TRACE_BITS     5\n#define VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP    6\n#define VARIOUS_RESET_PLAYER_FAINTED            7\n#define VARIOUS_GET_BATTLERS_FOR_RECALL         8\n#define VARIOUS_RETURN_OPPONENT_MON1            9\n#define VARIOUS_RETURN_OPPONENT_MON2            10\n#define VARIOUS_CHECK_POKEFLUTE                 11\n#define VARIOUS_WAIT_FANFARE                    12\n\n// Cmd_manipulatedmg\n#define DMG_CHANGE_SIGN            0\n#define DMG_RECOIL_FROM_MISS       1\n#define DMG_DOUBLED                2\n\n// Cmd_jumpifcantswitch\n#define SWITCH_IGNORE_ESCAPE_PREVENTION   (1 << 7)\n\n// Cmd_statbuffchange\n#define STAT_CHANGE_ALLOW_PTR               (1 << 0)   // If set, allow use of jumpptr. Set in every use of statbuffchange\n#define STAT_CHANGE_NOT_PROTECT_AFFECTED    (1 << 5)\n\n// stat change flags for Cmd_playstatchangeanimation\n#define STAT_CHANGE_NEGATIVE             (1 << 0)\n#define STAT_CHANGE_BY_TWO               (1 << 1)\n#define STAT_CHANGE_MULTIPLE_STATS       (1 << 2)\n#define STAT_CHANGE_CANT_PREVENT         (1 << 3)\n\n// stat flags for Cmd_playstatchangeanimation\n#define BIT_HP                      (1 << 0)\n#define BIT_ATK                     (1 << 1)\n#define BIT_DEF                     (1 << 2)\n#define BIT_SPEED                   (1 << 3)\n#define BIT_SPATK                   (1 << 4)\n#define BIT_SPDEF                   (1 << 5)\n#define BIT_ACC                     (1 << 6)\n#define BIT_EVASION                 (1 << 7)\n\n#define PARTY_SCREEN_OPTIONAL (1 << 7) // Flag for first argument to openpartyscreen\n\n// cases for Cmd_moveend\n#define MOVEEND_RAGE                            0\n#define MOVEEND_DEFROST                         1\n#define MOVEEND_SYNCHRONIZE_TARGET              2\n#define MOVEEND_ON_DAMAGE_ABILITIES             3\n#define MOVEEND_IMMUNITY_ABILITIES              4\n#define MOVEEND_SYNCHRONIZE_ATTACKER            5\n#define MOVEEND_CHOICE_MOVE                     6\n#define MOVEEND_CHANGED_ITEMS                   7\n#define MOVEEND_ATTACKER_INVISIBLE              8\n#define MOVEEND_ATTACKER_VISIBLE                9\n#define MOVEEND_TARGET_VISIBLE                  10\n#define MOVEEND_ITEM_EFFECTS_ALL                11\n#define MOVEEND_KINGSROCK_SHELLBELL             12\n#define MOVEEND_SUBSTITUTE                      13\n#define MOVEEND_UPDATE_LAST_MOVES               14\n#define MOVEEND_MIRROR_MOVE                     15\n#define MOVEEND_NEXT_TARGET                     16\n#define MOVEEND_COUNT                           17\n\n#endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H\n"
  },
  {
    "path": "include/constants/battle_setup.h",
    "content": "#ifndef GUARD_CONSTANTS_BATTLE_SETUP_H\n#define GUARD_CONSTANTS_BATTLE_SETUP_H\n\n#define TRAINER_BATTLE_SINGLE                           0\n#define TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC         1\n#define TRAINER_BATTLE_CONTINUE_SCRIPT                  2\n#define TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT             3\n#define TRAINER_BATTLE_DOUBLE                           4\n#define TRAINER_BATTLE_REMATCH                          5\n#define TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE           6\n#define TRAINER_BATTLE_REMATCH_DOUBLE                   7\n#define TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC  8\n#define TRAINER_BATTLE_EARLY_RIVAL                      9\n\n#endif // GUARD_CONSTANTS_BATTLE_SETUP_H\n"
  },
  {
    "path": "include/constants/battle_string_ids.h",
    "content": "#ifndef GUARD_BATTLE_STRING_IDS_H\n#define GUARD_BATTLE_STRING_IDS_H\n\n#define STRINGID_INTROMSG   0\n#define STRINGID_INTROSENDOUT   1\n#define STRINGID_RETURNMON  2\n#define STRINGID_SWITCHINMON    3\n#define STRINGID_USEDMOVE   4\n#define STRINGID_BATTLEEND  5\n\n\n// todo: make some of those names less vague: attacker/target vs pkmn, etc.\n#define STRINGID_TRAINER1LOSETEXT 12\n#define STRINGID_PKMNGAINEDEXP 13\n#define STRINGID_PKMNGREWTOLV 14\n#define STRINGID_PKMNLEARNEDMOVE 15\n#define STRINGID_TRYTOLEARNMOVE1 16\n#define STRINGID_TRYTOLEARNMOVE2 17\n#define STRINGID_TRYTOLEARNMOVE3 18\n#define STRINGID_PKMNFORGOTMOVE 19\n#define STRINGID_STOPLEARNINGMOVE 20\n#define STRINGID_DIDNOTLEARNMOVE 21\n#define STRINGID_PKMNLEARNEDMOVE2 22\n#define STRINGID_ATTACKMISSED 23\n#define STRINGID_PKMNPROTECTEDITSELF 24\n#define STRINGID_STATSWONTINCREASE2 25\n#define STRINGID_AVOIDEDDAMAGE 26\n#define STRINGID_ITDOESNTAFFECT 27\n#define STRINGID_ATTACKERFAINTED 28\n#define STRINGID_TARGETFAINTED 29\n#define STRINGID_PLAYERGOTMONEY 30\n#define STRINGID_PLAYERWHITEOUT 31\n#define STRINGID_PLAYERWHITEOUT2 32\n#define STRINGID_PREVENTSESCAPE 33\n#define STRINGID_HITXTIMES 34\n#define STRINGID_PKMNFELLASLEEP 35\n#define STRINGID_PKMNMADESLEEP 36\n#define STRINGID_PKMNALREADYASLEEP 37\n#define STRINGID_PKMNALREADYASLEEP2 38\n#define STRINGID_PKMNWASNTAFFECTED 39\n#define STRINGID_PKMNWASPOISONED 40\n#define STRINGID_PKMNPOISONEDBY 41\n#define STRINGID_PKMNHURTBYPOISON 42\n#define STRINGID_PKMNALREADYPOISONED 43\n#define STRINGID_PKMNBADLYPOISONED 44\n#define STRINGID_PKMNENERGYDRAINED 45\n#define STRINGID_PKMNWASBURNED 46\n#define STRINGID_PKMNBURNEDBY 47\n#define STRINGID_PKMNHURTBYBURN 48\n#define STRINGID_PKMNWASFROZEN 49\n#define STRINGID_PKMNFROZENBY 50\n#define STRINGID_PKMNISFROZEN 51\n#define STRINGID_PKMNWASDEFROSTED 52\n#define STRINGID_PKMNWASDEFROSTED2 53\n#define STRINGID_PKMNWASDEFROSTEDBY 54\n#define STRINGID_PKMNWASPARALYZED 55\n#define STRINGID_PKMNWASPARALYZEDBY 56\n#define STRINGID_PKMNISPARALYZED 57\n#define STRINGID_PKMNISALREADYPARALYZED 58\n#define STRINGID_PKMNHEALEDPARALYSIS 59\n#define STRINGID_PKMNDREAMEATEN 60\n#define STRINGID_STATSWONTINCREASE 61\n#define STRINGID_STATSWONTDECREASE 62\n#define STRINGID_TEAMSTOPPEDWORKING 63\n#define STRINGID_FOESTOPPEDWORKING 64\n#define STRINGID_PKMNISCONFUSED 65\n#define STRINGID_PKMNHEALEDCONFUSION 66\n#define STRINGID_PKMNWASCONFUSED 67\n#define STRINGID_PKMNALREADYCONFUSED 68\n#define STRINGID_PKMNFELLINLOVE 69\n#define STRINGID_PKMNINLOVE 70\n#define STRINGID_PKMNIMMOBILIZEDBYLOVE 71\n#define STRINGID_PKMNBLOWNAWAY 72\n#define STRINGID_PKMNCHANGEDTYPE 73\n#define STRINGID_PKMNFLINCHED 74\n#define STRINGID_PKMNREGAINEDHEALTH 75\n#define STRINGID_PKMNHPFULL 76\n#define STRINGID_PKMNRAISEDSPDEF 77\n#define STRINGID_PKMNRAISEDDEF 78\n#define STRINGID_PKMNCOVEREDBYVEIL 79\n#define STRINGID_PKMNUSEDSAFEGUARD 80\n#define STRINGID_PKMNSAFEGUARDEXPIRED 81\n#define STRINGID_PKMNWENTTOSLEEP 82\n#define STRINGID_PKMNSLEPTHEALTHY 83\n#define STRINGID_PKMNWHIPPEDWHIRLWIND 84\n#define STRINGID_PKMNTOOKSUNLIGHT 85\n#define STRINGID_PKMNLOWEREDHEAD 86\n#define STRINGID_PKMNISGLOWING 87\n#define STRINGID_PKMNFLEWHIGH 88\n#define STRINGID_PKMNDUGHOLE 89\n#define STRINGID_PKMNSQUEEZEDBYBIND 90\n#define STRINGID_PKMNTRAPPEDINVORTEX 91\n#define STRINGID_PKMNWRAPPEDBY 92\n#define STRINGID_PKMNCLAMPED 93\n#define STRINGID_PKMNHURTBY 94\n#define STRINGID_PKMNFREEDFROM 95\n#define STRINGID_PKMNCRASHED 96\n#define STRINGID_PKMNSHROUDEDINMIST 97\n#define STRINGID_PKMNPROTECTEDBYMIST 98\n#define STRINGID_PKMNGETTINGPUMPED 99\n#define STRINGID_PKMNHITWITHRECOIL 100\n#define STRINGID_PKMNPROTECTEDITSELF2 101\n#define STRINGID_PKMNBUFFETEDBYSANDSTORM 102\n#define STRINGID_PKMNPELTEDBYHAIL 103\n#define STRINGID_PKMNSEEDED 104\n#define STRINGID_PKMNEVADEDATTACK 105\n#define STRINGID_PKMNSAPPEDBYLEECHSEED 106\n#define STRINGID_PKMNFASTASLEEP 107\n#define STRINGID_PKMNWOKEUP 108\n#define STRINGID_PKMNUPROARKEPTAWAKE 109\n#define STRINGID_PKMNWOKEUPINUPROAR 110\n#define STRINGID_PKMNCAUSEDUPROAR 111\n#define STRINGID_PKMNMAKINGUPROAR 112\n#define STRINGID_PKMNCALMEDDOWN 113\n#define STRINGID_PKMNCANTSLEEPINUPROAR 114\n#define STRINGID_PKMNSTOCKPILED 115\n#define STRINGID_PKMNCANTSTOCKPILE 116\n#define STRINGID_PKMNCANTSLEEPINUPROAR2 117\n#define STRINGID_UPROARKEPTPKMNAWAKE 118\n#define STRINGID_PKMNSTAYEDAWAKEUSING 119\n#define STRINGID_PKMNSTORINGENERGY 120\n#define STRINGID_PKMNUNLEASHEDENERGY 121\n#define STRINGID_PKMNFATIGUECONFUSION 122\n#define STRINGID_PLAYERPICKEDUPMONEY 123\n#define STRINGID_PKMNUNAFFECTED 124\n#define STRINGID_PKMNTRANSFORMEDINTO 125\n#define STRINGID_PKMNMADESUBSTITUTE 126\n#define STRINGID_PKMNHASSUBSTITUTE 127\n#define STRINGID_SUBSTITUTEDAMAGED 128\n#define STRINGID_PKMNSUBSTITUTEFADED 129\n#define STRINGID_PKMNMUSTRECHARGE 130\n#define STRINGID_PKMNRAGEBUILDING 131\n#define STRINGID_PKMNMOVEWASDISABLED 132\n#define STRINGID_PKMNMOVEISDISABLED 133\n#define STRINGID_PKMNMOVEDISABLEDNOMORE 134\n#define STRINGID_PKMNGOTENCORE 135\n#define STRINGID_PKMNENCOREENDED 136\n#define STRINGID_PKMNTOOKAIM 137\n#define STRINGID_PKMNSKETCHEDMOVE 138\n#define STRINGID_PKMNTRYINGTOTAKEFOE 139\n#define STRINGID_PKMNTOOKFOE 140\n#define STRINGID_PKMNREDUCEDPP 141\n#define STRINGID_PKMNSTOLEITEM 142\n#define STRINGID_TARGETCANTESCAPENOW 143\n#define STRINGID_PKMNFELLINTONIGHTMARE 144\n#define STRINGID_PKMNLOCKEDINNIGHTMARE 145\n#define STRINGID_PKMNLAIDCURSE 146\n#define STRINGID_PKMNAFFLICTEDBYCURSE 147\n#define STRINGID_SPIKESSCATTERED 148\n#define STRINGID_PKMNHURTBYSPIKES 149\n#define STRINGID_PKMNIDENTIFIED 150\n#define STRINGID_PKMNPERISHCOUNTFELL 151\n#define STRINGID_PKMNBRACEDITSELF 152\n#define STRINGID_PKMNENDUREDHIT 153\n#define STRINGID_MAGNITUDESTRENGTH 154\n#define STRINGID_PKMNCUTHPMAXEDATTACK 155\n#define STRINGID_PKMNCOPIEDSTATCHANGES 156\n#define STRINGID_PKMNGOTFREE 157\n#define STRINGID_PKMNSHEDLEECHSEED 158\n#define STRINGID_PKMNBLEWAWAYSPIKES 159\n#define STRINGID_PKMNFLEDFROMBATTLE 160\n#define STRINGID_PKMNFORESAWATTACK 161\n#define STRINGID_PKMNTOOKATTACK 162\n#define STRINGID_PKMNATTACK 163\n#define STRINGID_PKMNCENTERATTENTION 164\n#define STRINGID_PKMNCHARGINGPOWER 165\n#define STRINGID_NATUREPOWERTURNEDINTO 166\n#define STRINGID_PKMNSTATUSNORMAL 167\n#define STRINGID_PKMNHASNOMOVESLEFT 168\n#define STRINGID_PKMNSUBJECTEDTOTORMENT 169\n#define STRINGID_PKMNCANTUSEMOVETORMENT 170\n#define STRINGID_PKMNTIGHTENINGFOCUS 171\n#define STRINGID_PKMNFELLFORTAUNT 172\n#define STRINGID_PKMNCANTUSEMOVETAUNT 173\n#define STRINGID_PKMNREADYTOHELP 174\n#define STRINGID_PKMNSWITCHEDITEMS 175\n#define STRINGID_PKMNCOPIEDFOE 176\n#define STRINGID_PKMNMADEWISH 177\n#define STRINGID_PKMNWISHCAMETRUE 178\n#define STRINGID_PKMNPLANTEDROOTS 179\n#define STRINGID_PKMNABSORBEDNUTRIENTS 180\n#define STRINGID_PKMNANCHOREDITSELF 181\n#define STRINGID_PKMNWASMADEDROWSY 182\n#define STRINGID_PKMNKNOCKEDOFF 183\n#define STRINGID_PKMNSWAPPEDABILITIES 184\n#define STRINGID_PKMNSEALEDOPPONENTMOVE 185\n#define STRINGID_PKMNCANTUSEMOVESEALED 186\n#define STRINGID_PKMNWANTSGRUDGE 187\n#define STRINGID_PKMNLOSTPPGRUDGE 188\n#define STRINGID_PKMNSHROUDEDITSELF 189\n#define STRINGID_PKMNMOVEBOUNCED 190\n#define STRINGID_PKMNWAITSFORTARGET 191\n#define STRINGID_PKMNSNATCHEDMOVE 192\n#define STRINGID_PKMNMADEITRAIN 193\n#define STRINGID_PKMNRAISEDSPEED 194\n#define STRINGID_PKMNPROTECTEDBY 195\n#define STRINGID_PKMNPREVENTSUSAGE 196\n#define STRINGID_PKMNRESTOREDHPUSING 197\n#define STRINGID_PKMNCHANGEDTYPEWITH 198\n#define STRINGID_PKMNPREVENTSPARALYSISWITH 199\n#define STRINGID_PKMNPREVENTSROMANCEWITH 200\n#define STRINGID_PKMNPREVENTSPOISONINGWITH 201\n#define STRINGID_PKMNPREVENTSCONFUSIONWITH 202\n#define STRINGID_PKMNRAISEDFIREPOWERWITH 203\n#define STRINGID_PKMNANCHORSITSELFWITH 204\n#define STRINGID_PKMNCUTSATTACKWITH 205\n#define STRINGID_PKMNPREVENTSSTATLOSSWITH 206\n#define STRINGID_PKMNHURTSWITH 207\n#define STRINGID_PKMNTRACED 208\n#define STRINGID_STATSHARPLY 209\n#define STRINGID_STATROSE 210\n#define STRINGID_STATHARSHLY 211\n#define STRINGID_STATFELL 212\n#define STRINGID_ATTACKERSSTATROSE 213\n#define STRINGID_DEFENDERSSTATROSE 214\n#define STRINGID_ATTACKERSSTATFELL 215\n#define STRINGID_DEFENDERSSTATFELL 216\n#define STRINGID_CRITICALHIT 217\n#define STRINGID_ONEHITKO 218\n#define STRINGID_123POOF 219\n#define STRINGID_ANDELLIPSIS 220\n#define STRINGID_NOTVERYEFFECTIVE 221\n#define STRINGID_SUPEREFFECTIVE 222\n#define STRINGID_GOTAWAYSAFELY 223\n#define STRINGID_WILDPKMNFLED 224\n#define STRINGID_NORUNNINGFROMTRAINERS 225\n#define STRINGID_CANTESCAPE 226\n#define STRINGID_DONTLEAVEBIRCH 227\n#define STRINGID_BUTNOTHINGHAPPENED 228\n#define STRINGID_BUTITFAILED 229\n#define STRINGID_ITHURTCONFUSION 230\n#define STRINGID_MIRRORMOVEFAILED 231\n#define STRINGID_STARTEDTORAIN 232\n#define STRINGID_DOWNPOURSTARTED 233\n#define STRINGID_RAINCONTINUES 234\n#define STRINGID_DOWNPOURCONTINUES 235\n#define STRINGID_RAINSTOPPED 236\n#define STRINGID_SANDSTORMBREWED 237\n#define STRINGID_SANDSTORMRAGES 238\n#define STRINGID_SANDSTORMSUBSIDED 239\n#define STRINGID_SUNLIGHTGOTBRIGHT 240\n#define STRINGID_SUNLIGHTSTRONG 241\n#define STRINGID_SUNLIGHTFADED 242\n#define STRINGID_STARTEDHAIL 243\n#define STRINGID_HAILCONTINUES 244\n#define STRINGID_HAILSTOPPED 245\n#define STRINGID_FAILEDTOSPITUP 246\n#define STRINGID_FAILEDTOSWALLOW 247\n#define STRINGID_WINDBECAMEHEATWAVE 248\n#define STRINGID_STATCHANGESGONE 249\n#define STRINGID_COINSSCATTERED 250\n#define STRINGID_TOOWEAKFORSUBSTITUTE 251\n#define STRINGID_SHAREDPAIN 252\n#define STRINGID_BELLCHIMED 253\n#define STRINGID_FAINTINTHREE 254\n#define STRINGID_NOPPLEFT 255\n#define STRINGID_BUTNOPPLEFT 256\n#define STRINGID_PLAYERUSEDITEM 257\n#define STRINGID_OLDMANUSEDITEM 258\n#define STRINGID_TRAINERBLOCKEDBALL 259\n#define STRINGID_DONTBEATHIEF 260\n#define STRINGID_ITDODGEDBALL 261\n#define STRINGID_YOUMISSEDPKMN 262\n#define STRINGID_PKMNBROKEFREE 263\n#define STRINGID_ITAPPEAREDCAUGHT 264\n#define STRINGID_AARGHALMOSTHADIT 265\n#define STRINGID_SHOOTSOCLOSE 266\n#define STRINGID_GOTCHAPKMNCAUGHT 267\n#define STRINGID_GOTCHAPKMNCAUGHT2 268\n#define STRINGID_GIVENICKNAMECAPTURED 269\n#define STRINGID_PKMNSENTTOPC 270\n#define STRINGID_PKMNDATAADDEDTODEX 271\n#define STRINGID_ITISRAINING 272\n#define STRINGID_SANDSTORMISRAGING 273\n#define STRINGID_CANTESCAPE2 274\n#define STRINGID_PKMNIGNORESASLEEP 275\n#define STRINGID_PKMNIGNOREDORDERS 276\n#define STRINGID_PKMNBEGANTONAP 277\n#define STRINGID_PKMNLOAFING 278\n#define STRINGID_PKMNWONTOBEY 279\n#define STRINGID_PKMNTURNEDAWAY 280\n#define STRINGID_PKMNPRETENDNOTNOTICE 281\n#define STRINGID_ENEMYABOUTTOSWITCHPKMN 282\n#define STRINGID_THREWROCK 283\n#define STRINGID_THREWBAIT 284\n#define STRINGID_PKMNWATCHINGCAREFULLY 285\n#define STRINGID_PKMNANGRY 286\n#define STRINGID_PKMNEATING 287\n#define STRINGID_DUMMY288 288\n#define STRINGID_DUMMY289 289\n#define STRINGID_OUTOFSAFARIBALLS 290\n#define STRINGID_PKMNSITEMCUREDPARALYSIS 291\n#define STRINGID_PKMNSITEMCUREDPOISON 292\n#define STRINGID_PKMNSITEMHEALEDBURN 293\n#define STRINGID_PKMNSITEMDEFROSTEDIT 294\n#define STRINGID_PKMNSITEMWOKEIT 295\n#define STRINGID_PKMNSITEMSNAPPEDOUT 296\n#define STRINGID_PKMNSITEMCUREDPROBLEM 297\n#define STRINGID_PKMNSITEMRESTOREDHEALTH 298\n#define STRINGID_PKMNSITEMRESTOREDPP 299\n#define STRINGID_PKMNSITEMRESTOREDSTATUS 300\n#define STRINGID_PKMNSITEMRESTOREDHPALITTLE 301\n#define STRINGID_ITEMALLOWSONLYYMOVE 302\n#define STRINGID_PKMNHUNGONWITHX 303\n#define STRINGID_EMPTYSTRING3 304\n#define STRINGID_PKMNSXPREVENTSBURNS 305\n#define STRINGID_PKMNSXBLOCKSY 306\n#define STRINGID_PKMNSXRESTOREDHPALITTLE2 307\n#define STRINGID_PKMNSXWHIPPEDUPSANDSTORM 308\n#define STRINGID_PKMNSXPREVENTSYLOSS 309\n#define STRINGID_PKMNSXINFATUATEDY 310\n#define STRINGID_PKMNSXMADEYINEFFECTIVE 311\n#define STRINGID_PKMNSXCUREDYPROBLEM 312\n#define STRINGID_ITSUCKEDLIQUIDOOZE 313\n#define STRINGID_PKMNTRANSFORMED 314\n#define STRINGID_ELECTRICITYWEAKENED 315\n#define STRINGID_FIREWEAKENED 316\n#define STRINGID_PKMNHIDUNDERWATER 317\n#define STRINGID_PKMNSPRANGUP 318\n#define STRINGID_HMMOVESCANTBEFORGOTTEN 319\n#define STRINGID_XFOUNDONEY 320\n#define STRINGID_PLAYERDEFEATEDTRAINER1 321\n#define STRINGID_SOOTHINGAROMA 322\n#define STRINGID_ITEMSCANTBEUSEDNOW 323\n#define STRINGID_FORXCOMMAYZ 324\n#define STRINGID_USINGITEMSTATOFPKMNROSE 325\n#define STRINGID_PKMNUSEDXTOGETPUMPED 326\n#define STRINGID_PKMNSXMADEYUSELESS 327\n#define STRINGID_PKMNTRAPPEDBYSANDTOMB 328\n#define STRINGID_EMPTYSTRING4 329\n#define STRINGID_ABOOSTED 330\n#define STRINGID_PKMNSXINTENSIFIEDSUN 331\n#define STRINGID_PKMNMAKESGROUNDMISS 332\n#define STRINGID_YOUTHROWABALLNOWRIGHT 333\n#define STRINGID_PKMNSXTOOKATTACK 334\n#define STRINGID_PKMNCHOSEXASDESTINY 335\n#define STRINGID_PKMNLOSTFOCUS 336\n#define STRINGID_USENEXTPKMN 337\n#define STRINGID_PKMNFLEDUSINGITS 338\n#define STRINGID_PKMNFLEDUSING 339\n#define STRINGID_PKMNWASDRAGGEDOUT 340\n#define STRINGID_PREVENTEDFROMWORKING 341\n#define STRINGID_PKMNSITEMNORMALIZEDSTATUS 342\n#define STRINGID_TRAINER1USEDITEM 343\n#define STRINGID_BOXISFULL 344\n#define STRINGID_PKMNAVOIDEDATTACK 345\n#define STRINGID_PKMNSXMADEITINEFFECTIVE 346\n#define STRINGID_PKMNSXPREVENTSFLINCHING 347\n#define STRINGID_PKMNALREADYHASBURN 348\n#define STRINGID_STATSWONTDECREASE2 349\n#define STRINGID_PKMNSXBLOCKSY2 350\n#define STRINGID_PKMNSXWOREOFF 351\n#define STRINGID_PKMNRAISEDDEFALITTLE 352\n#define STRINGID_PKMNRAISEDSPDEFALITTLE 353\n#define STRINGID_THEWALLSHATTERED 354\n#define STRINGID_PKMNSXPREVENTSYSZ 355\n#define STRINGID_PKMNSXCUREDITSYPROBLEM 356\n#define STRINGID_ATTACKERCANTESCAPE 357\n#define STRINGID_PKMNOBTAINEDX 358\n#define STRINGID_PKMNOBTAINEDX2 359\n#define STRINGID_PKMNOBTAINEDXYOBTAINEDZ 360\n#define STRINGID_BUTNOEFFECT 361\n#define STRINGID_PKMNSXHADNOEFFECTONY 362\n#define STRINGID_OAKPLAYERWON 363\n#define STRINGID_OAKPLAYERLOST 364\n#define STRINGID_PLAYERLOSTAGAINSTENEMYTRAINER 365\n#define STRINGID_PLAYERPAIDPRIZEMONEY 366\n#define STRINGID_PKMNTRANSFERREDSOMEONESPC 367\n#define STRINGID_PKMNTRANSFERREDBILLSPC 368\n#define STRINGID_PKMNBOXSOMEONESPCFULL 369\n#define STRINGID_PKMNBOXBILLSPCFULL 370\n#define STRINGID_POKEDUDEUSED 371\n#define STRINGID_POKEFLUTECATCHY 372\n#define STRINGID_POKEFLUTE 373\n#define STRINGID_MONHEARINGFLUTEAWOKE 374\n#define STRINGID_TRAINER2LOSETEXT 375\n#define STRINGID_TRAINER2WINTEXT 376\n#define STRINGID_PLAYERWHITEDOUT 377\n#define STRINGID_MONTOOSCAREDTOMOVE 378\n#define STRINGID_GHOSTGETOUTGETOUT 379\n#define STRINGID_SILPHSCOPEUNVEILED 380\n#define STRINGID_GHOSTWASMAROWAK 381\n#define STRINGID_TRAINER1MON1COMEBACK 382\n#define STRINGID_TRAINER1WINTEXT 383\n#define STRINGID_TRAINER1MON2COMEBACK 384\n#define STRINGID_TRAINER1MON1AND2COMEBACK 385\n#define STRINGID_ENEMYABOUTTOSWITCHPKMNNOPREDICT 386\n#define STRINGID_PICKUP 387\n#define STRINGID_PICKUPSOLO 388\n\n#define BATTLESTRINGS_COUNT     389\n\n// This is the string id that gBattleStringsTable starts with.\n// String ids before this (e.g. STRINGID_INTROMSG) are not in the table,\n// and are instead handled explicitly by BufferStringBattle.\n#define BATTLESTRINGS_TABLE_START  STRINGID_TRAINER1LOSETEXT\n\n// The below IDs are all indexes into battle message tables,\n// used to determine which of a set of messages to print.\n// They are assigned to the MULTISTRING_CHOOSER byte of gBattleCommunication\n// and read when e.g. the command printfromtable is used.\n\n// gStatUpStringIds\n#define B_MSG_ATTACKER_STAT_ROSE 0\n#define B_MSG_DEFENDER_STAT_ROSE 1\n#define B_MSG_STAT_WONT_INCREASE 2\n#define B_MSG_STAT_ROSE_EMPTY    3\n#define B_MSG_STAT_ROSE_ITEM     4\n#define B_MSG_USED_DIRE_HIT      5\n\n// gStatDownStringIds\n#define B_MSG_ATTACKER_STAT_FELL 0\n#define B_MSG_DEFENDER_STAT_FELL 1\n#define B_MSG_STAT_WONT_DECREASE 2\n#define B_MSG_STAT_FELL_EMPTY    3\n\n// gMissStringIds\n#define B_MSG_MISSED       0\n#define B_MSG_PROTECTED    1\n#define B_MSG_AVOIDED_ATK  2\n#define B_MSG_AVOIDED_DMG  3\n#define B_MSG_GROUND_MISS  4\n\n// gAbsorbDrainStringIds\n#define B_MSG_ABSORB      0\n#define B_MSG_ABSORB_OOZE 1\n\n// gLeechSeedStringIds\n#define B_MSG_LEECH_SEED_SET   0\n#define B_MSG_LEECH_SEED_MISS  1\n#define B_MSG_LEECH_SEED_FAIL  2\n#define B_MSG_LEECH_SEED_DRAIN 3\n#define B_MSG_LEECH_SEED_OOZE  4\n\n// gFirstTurnOfTwoStringIds\n#define B_MSG_TURN1_RAZOR_WIND  0\n#define B_MSG_TURN1_SOLAR_BEAM  1\n#define B_MSG_TURN1_SKULL_BASH  2\n#define B_MSG_TURN1_SKY_ATTACK  3\n#define B_MSG_TURN1_FLY         4\n#define B_MSG_TURN1_DIG         5\n#define B_MSG_TURN1_DIVE        6\n#define B_MSG_TURN1_BOUNCE      7\n\n// gMoveWeatherChangeStringIds\n#define B_MSG_STARTED_RAIN      0\n#define B_MSG_STARTED_DOWNPOUR  1\n#define B_MSG_WEATHER_FAILED    2\n#define B_MSG_STARTED_SANDSTORM 3\n#define B_MSG_STARTED_SUNLIGHT  4\n#define B_MSG_STARTED_HAIL      5\n\n// gRainContinuesStringIds\n#define B_MSG_RAIN_CONTINUES     0\n#define B_MSG_DOWNPOUR_CONTINUES 1\n#define B_MSG_RAIN_STOPPED       2\n\n// gSandStormHailContinuesStringIds / gSandStormHailDmgStringIds/ gSandStormHailEndStringIds\n#define B_MSG_SANDSTORM  0\n#define B_MSG_HAIL       1\n\n// gReflectLightScreenSafeguardStringIds\n#define B_MSG_SIDE_STATUS_FAILED     0\n#define B_MSG_SET_REFLECT_SINGLE     1\n#define B_MSG_SET_REFLECT_DOUBLE     2\n#define B_MSG_SET_LIGHTSCREEN_SINGLE 3\n#define B_MSG_SET_LIGHTSCREEN_DOUBLE 4\n#define B_MSG_SET_SAFEGUARD          5\n\n// gProtectLikeUsedStringIds\n#define B_MSG_PROTECTED_ITSELF 0\n#define B_MSG_BRACED_ITSELF    1\n#define B_MSG_PROTECT_FAILED   2\n\n// gRestUsedStringIds\n#define B_MSG_REST           0\n#define B_MSG_REST_STATUSED  1\n\n// gWokeUpStringIds\n#define B_MSG_WOKE_UP        0\n#define B_MSG_WOKE_UP_UPROAR 1\n\n// gUproarAwakeStringIds\n#define B_MSG_CANT_SLEEP_UPROAR  0\n#define B_MSG_UPROAR_KEPT_AWAKE  1\n#define B_MSG_STAYED_AWAKE_USING 2\n\n// gUproarOverTurnStringIds\n#define B_MSG_UPROAR_CONTINUES  0\n#define B_MSG_UPROAR_ENDS       1\n\n// gStockpileUsedStringIds\n#define B_MSG_STOCKPILED     0\n#define B_MSG_CANT_STOCKPILE 1\n\n// gSwallowFailStringIds\n#define B_MSG_SWALLOW_FAILED  0\n#define B_MSG_SWALLOW_FULL_HP 1\n\n// gKOFailedStringIds\n#define B_MSG_KO_MISS       0\n#define B_MSG_KO_UNAFFECTED 1\n\n// gMistUsedStringIds\n#define B_MSG_SET_MIST    0\n#define B_MSG_MIST_FAILED 1\n\n// gFocusEnergyUsedStringIds\n#define B_MSG_GETTING_PUMPED      0\n#define B_MSG_FOCUS_ENERGY_FAILED 1\n\n// gTransformUsedStringIds\n#define B_MSG_TRANSFORMED      0\n#define B_MSG_TRANSFORM_FAILED 1\n\n// gSubstituteUsedStringIds\n#define B_MSG_SET_SUBSTITUTE    0\n#define B_MSG_SUBSTITUTE_FAILED 1\n\n// gPartyStatusHealStringIds\n#define B_MSG_BELL                     0\n#define B_MSG_BELL_SOUNDPROOF_ATTACKER 1\n#define B_MSG_BELL_SOUNDPROOF_PARTNER  2\n#define B_MSG_BELL_BOTH_SOUNDPROOF     3\n#define B_MSG_SOOTHING_AROMA           4\n\n// gFutureMoveUsedStringIds\n#define B_MSG_FUTURE_SIGHT 0\n#define B_MSG_DOOM_DESIRE  1\n\n// gItemSwapStringIds\n#define B_MSG_ITEM_SWAP_TAKEN 0\n#define B_MSG_ITEM_SWAP_GIVEN 1\n#define B_MSG_ITEM_SWAP_BOTH  2\n\n// gSportsUsedStringIds\n#define B_MSG_WEAKEN_ELECTRIC 0\n#define B_MSG_WEAKEN_FIRE     1\n\n// gCaughtMonStringIds\n#define B_MSG_SENT_SOMEONES_PC  0\n#define B_MSG_SENT_BILLS_PC     1\n#define B_MSG_SOMEONES_BOX_FULL 2\n#define B_MSG_BILLS_BOX_FULL    3\n\n// gInobedientStringIds\n#define B_MSG_LOAFING            0\n#define B_MSG_WONT_OBEY          1\n#define B_MSG_TURNED_AWAY        2\n#define B_MSG_PRETEND_NOT_NOTICE 3\n#define NUM_LOAF_STRINGS         4 // For randomly selecting a disobey string\n\n// gSafariGetNearStringIds\n#define B_MSG_CREPT_CLOSER    0\n#define B_MSG_CANT_GET_CLOSER 1\n\n// gSafariReactionStringIds\n#define B_MSG_MON_WATCHING   0\n#define B_MSG_MON_ANGRY      1\n#define B_MSG_MON_EATING     2\n#define NUM_SAFARI_REACTIONS 3\n\n// gFlashFireStringIds\n#define B_MSG_FLASH_FIRE_BOOST    0\n#define B_MSG_FLASH_FIRE_NO_BOOST 1\n\n// gBerryEffectStringIds\n#define B_MSG_CURED_PROBLEM     0\n#define B_MSG_NORMALIZED_STATUS 1\n\n// gNoEscapeStringIds\n#define B_MSG_CANT_ESCAPE          0\n#define B_MSG_DONT_LEAVE_BIRCH     1\n#define B_MSG_PREVENTS_ESCAPE      2\n#define B_MSG_CANT_ESCAPE_2        3\n#define B_MSG_ATTACKER_CANT_ESCAPE 4\n\n// gGotPoisonedStringIds / gGotParalyzedStringIds / gFellAsleepStringIds\n// gGotBurnedStringIds / gGotFrozenStringIds / gAttractUsedStringIds\n#define B_MSG_STATUSED            0\n#define B_MSG_STATUSED_BY_ABILITY 1\n\n// gBRNPreventionStringIds / gPRLZPreventionStringIds / gPSNPreventionStringIds\n#define B_MSG_ABILITY_PREVENTS_MOVE_STATUS    0\n#define B_MSG_ABILITY_PREVENTS_ABILITY_STATUS 1\n#define B_MSG_STATUS_HAD_NO_EFFECT            2\n\n// gGotDefrostedStringIds\n#define B_MSG_DEFROSTED         0\n#define B_MSG_DEFROSTED_BY_MOVE 1\n\n#define NUM_TRAPPING_MOVES 6\n\n#endif // GUARD_BATTLE_STRING_IDS_H\n"
  },
  {
    "path": "include/constants/battle_tower.h",
    "content": "#ifndef GUARD_CONSTANTS_BATTLE_TOWER_H\n#define GUARD_CONSTANTS_BATTLE_TOWER_H\n\n#define F_EV_SPREAD_HP         1 << 0\n#define F_EV_SPREAD_ATTACK     1 << 1\n#define F_EV_SPREAD_DEFENSE    1 << 2\n#define F_EV_SPREAD_SPEED      1 << 3\n#define F_EV_SPREAD_SP_ATTACK  1 << 4\n#define F_EV_SPREAD_SP_DEFENSE 1 << 5\n\n#define BATTLE_TOWER_ITEM_NONE           0\n#define BATTLE_TOWER_ITEM_KINGS_ROCK     1\n#define BATTLE_TOWER_ITEM_SITRUS_BERRY   2\n#define BATTLE_TOWER_ITEM_ORAN_BERRY     3\n#define BATTLE_TOWER_ITEM_CHESTO_BERRY   4\n#define BATTLE_TOWER_ITEM_HARD_STONE     5\n#define BATTLE_TOWER_ITEM_FOCUS_BAND     6\n#define BATTLE_TOWER_ITEM_PERSIM_BERRY   7\n#define BATTLE_TOWER_ITEM_MIRACLE_SEED   8\n#define BATTLE_TOWER_ITEM_BERRY_JUICE    9\n#define BATTLE_TOWER_ITEM_MACHO_BRACE    10\n#define BATTLE_TOWER_ITEM_SILVER_POWDER  11\n#define BATTLE_TOWER_ITEM_CHERI_BERRY    12\n#define BATTLE_TOWER_ITEM_BLACK_GLASSES  13\n#define BATTLE_TOWER_ITEM_BLACK_BELT     14\n#define BATTLE_TOWER_ITEM_SOUL_DEW       15\n#define BATTLE_TOWER_ITEM_CHOICE_BAND    16\n#define BATTLE_TOWER_ITEM_MAGNET         17\n#define BATTLE_TOWER_ITEM_SILK_SCARF     18\n#define BATTLE_TOWER_ITEM_WHITE_HERB     19\n#define BATTLE_TOWER_ITEM_DEEP_SEA_SCALE 20\n#define BATTLE_TOWER_ITEM_DEEP_SEA_TOOTH 21\n#define BATTLE_TOWER_ITEM_MYSTIC_WATER   22\n#define BATTLE_TOWER_ITEM_SHARP_BEAK     23\n#define BATTLE_TOWER_ITEM_QUICK_CLAW     24\n#define BATTLE_TOWER_ITEM_LEFTOVERS      25\n#define BATTLE_TOWER_ITEM_RAWST_BERRY    26\n#define BATTLE_TOWER_ITEM_LIGHT_BALL     27\n#define BATTLE_TOWER_ITEM_POISON_BARB    28\n#define BATTLE_TOWER_ITEM_NEVER_MELT_ICE 29\n#define BATTLE_TOWER_ITEM_ASPEAR_BERRY   30\n#define BATTLE_TOWER_ITEM_SPELL_TAG      31\n#define BATTLE_TOWER_ITEM_BRIGHT_POWDER  32\n#define BATTLE_TOWER_ITEM_LEPPA_BERRY    33\n#define BATTLE_TOWER_ITEM_SCOPE_LENS     34\n#define BATTLE_TOWER_ITEM_TWISTED_SPOON  35\n#define BATTLE_TOWER_ITEM_METAL_COAT     36\n#define BATTLE_TOWER_ITEM_MENTAL_HERB    37\n#define BATTLE_TOWER_ITEM_CHARCOAL       38\n#define BATTLE_TOWER_ITEM_PECHA_BERRY    39\n#define BATTLE_TOWER_ITEM_SOFT_SAND      40\n#define BATTLE_TOWER_ITEM_LUM_BERRY      41\n#define BATTLE_TOWER_ITEM_DRAGON_SCALE   42\n#define BATTLE_TOWER_ITEM_DRAGON_FANG    43\n#define BATTLE_TOWER_ITEM_IAPAPA_BERRY   44\n#define BATTLE_TOWER_ITEM_WIKI_BERRY     45\n#define BATTLE_TOWER_ITEM_SEA_INCENSE    46\n#define BATTLE_TOWER_ITEM_SHELL_BELL     47\n#define BATTLE_TOWER_ITEM_SALAC_BERRY    48\n#define BATTLE_TOWER_ITEM_LANSAT_BERRY   49\n#define BATTLE_TOWER_ITEM_APICOT_BERRY   50\n#define BATTLE_TOWER_ITEM_STARF_BERRY    51\n#define BATTLE_TOWER_ITEM_LIECHI_BERRY   52\n#define BATTLE_TOWER_ITEM_STICK          53\n#define BATTLE_TOWER_ITEM_LAX_INCENSE    54\n#define BATTLE_TOWER_ITEM_AGUAV_BERRY    55\n#define BATTLE_TOWER_ITEM_FIGY_BERRY     56\n#define BATTLE_TOWER_ITEM_THICK_CLUB     57\n#define BATTLE_TOWER_ITEM_MAGO_BERRY     58\n#define BATTLE_TOWER_ITEM_METAL_POWDER   59\n#define BATTLE_TOWER_ITEM_PETAYA_BERRY   60\n#define BATTLE_TOWER_ITEM_LUCKY_PUNCH    61\n#define BATTLE_TOWER_ITEM_GANLON_BERRY   62\n\n#define BTSPECIAL_TEST             0\n#define BTSPECIAL_RESULT_SAVE_SCUM 1\n#define BTSPECIAL_RESULT_WON7      2\n#define BTSPECIAL_RESULT_LOST      3\n#define BTSPECIAL_RESULT_QUICKSAVE 4\n#define BTSPECIAL_RESULT_INACTIVE  5\n\n#endif //GUARD_CONSTANTS_BATTLE_TOWER_H\n"
  },
  {
    "path": "include/constants/cable_club.h",
    "content": "#ifndef GUARD_CONSTANTS_CABLE_CLUB_H\n#define GUARD_CONSTANTS_CABLE_CLUB_H\n\n// States for VAR_CABLE_CLUB_STATE\n#define USING_SINGLE_BATTLE  1\n#define USING_DOUBLE_BATTLE  2\n#define USING_TRADE_CENTER   3\n#define USING_RECORD_CORNER  4\n#define USING_MULTI_BATTLE   5\n#define USING_UNION_ROOM     6\n#define USING_BERRY_CRUSH    7\n#define USING_MINIGAME       8\n#define USING_BATTLE_TOWER   9\n\n// Return states for the group of specials that use CreateLinkupTask\n// A few also used by TryBecomeLinkLeader and TryJoinLinkGroup\n#define LINKUP_ONGOING              0\n#define LINKUP_SUCCESS              1\n#define LINKUP_SOMEONE_NOT_READY    2\n#define LINKUP_DIFF_SELECTIONS      3\n#define LINKUP_WRONG_NUM_PLAYERS    4\n#define LINKUP_FAILED               5\n#define LINKUP_CONNECTION_ERROR     6\n#define LINKUP_PLAYER_NOT_READY     7\n#define LINKUP_RETRY_ROLE_ASSIGN    8\n#define LINKUP_PARTNER_NOT_READY    9\n\n#define CABLE_SEAT_WAITING 0\n#define CABLE_SEAT_SUCCESS 1\n#define CABLE_SEAT_FAILED  2\n\n#endif //GUARD_CONSTANTS_CABLE_CLUB_H\n"
  },
  {
    "path": "include/constants/coins.h",
    "content": "#ifndef GUARD_CONSTANTS_COINS_H\n#define GUARD_CONSTANTS_COINS_H\n\n#define MAX_COINS 9999\n\n#endif // GUARD_CONSTANTS_COINS_H\n"
  },
  {
    "path": "include/constants/daycare.h",
    "content": "#ifndef GUARD_DAYCARE_CONSTANTS_H\n#define GUARD_DAYCARE_CONSTANTS_H\n\n// Parent compatibility scores\n#define PARENTS_INCOMPATIBLE       0\n#define PARENTS_LOW_COMPATIBILITY  20\n#define PARENTS_MED_COMPATIBILITY  50\n#define PARENTS_MAX_COMPATIBILITY  70\n\n// Daycare state\n#define DAYCARE_NO_MONS     0\n#define DAYCARE_EGG_WAITING 1\n#define DAYCARE_ONE_MON     2\n#define DAYCARE_TWO_MONS    3\n\n#define INHERITED_IV_COUNT 3\n#define EGG_HATCH_LEVEL 5\n#define EGG_GENDER_MALE 0x8000  // used to create a male egg from a female-only parent species (e.g. Nidoran)\n\n#define DAYCARE_LEVEL_MENU_EXIT 5\n#define DAYCARE_EXITED_LEVEL_MENU 2 // would be redundant with above if GF had used the same value\n\n// Array buffers\n#define EGG_MOVES_ARRAY_COUNT           10\n#define EGG_LVL_UP_MOVES_ARRAY_COUNT    50\n\n#endif //GUARD_DAYCARE_CONSTANTS_H\n"
  },
  {
    "path": "include/constants/decorations.h",
    "content": "#ifndef GUARD_CONSTANTS_DECORATIONS_H\n#define GUARD_CONSTANTS_DECORATIONS_H\n\n#define DECOR_NONE             0\n#define DECOR_SMALL_DESK       1\n#define DECOR_POKEMON_DESK     2\n#define DECOR_HEAVY_DESK       3\n#define DECOR_RAGGED_DESK      4\n#define DECOR_COMFORT_DESK     5\n#define DECOR_PRETTY_DESK      6\n#define DECOR_BRICK_DESK       7\n#define DECOR_CAMP_DESK        8\n#define DECOR_HARD_DESK        9\n#define DECOR_SMALL_CHAIR      10\n#define DECOR_POKEMON_CHAIR    11\n#define DECOR_HEAVY_CHAIR      12\n#define DECOR_PRETTY_CHAIR     13\n#define DECOR_COMFORT_CHAIR    14\n#define DECOR_RAGGED_CHAIR     15\n#define DECOR_BRICK_CHAIR      16\n#define DECOR_CAMP_CHAIR       17\n#define DECOR_HARD_CHAIR       18\n#define DECOR_RED_PLANT        19\n#define DECOR_TROPICAL_PLANT   20\n#define DECOR_PRETTY_FLOWERS   21\n#define DECOR_COLORFUL_PLANT   22\n#define DECOR_BIG_PLANT        23\n#define DECOR_GORGEOUS_PLANT   24\n#define DECOR_RED_BRICK        25\n#define DECOR_YELLOW_BRICK     26\n#define DECOR_BLUE_BRICK       27\n#define DECOR_RED_BALLOON      28\n#define DECOR_BLUE_BALLOON     29\n#define DECOR_YELLOW_BALLOON   30\n#define DECOR_RED_TENT         31\n#define DECOR_BLUE_TENT        32\n#define DECOR_SOLID_BOARD      33\n#define DECOR_SLIDE            34\n#define DECOR_FENCE_LENGTH     35\n#define DECOR_FENCE_WIDTH      36\n#define DECOR_TIRE             37\n#define DECOR_STAND            38\n#define DECOR_MUD_BALL         39\n#define DECOR_BREAKABLE_DOOR   40\n#define DECOR_SAND_ORNAMENT    41\n#define DECOR_SILVER_SHIELD    42\n#define DECOR_GOLD_SHIELD      43\n#define DECOR_GLASS_ORNAMENT   44\n#define DECOR_TV               45\n#define DECOR_ROUND_TV         46\n#define DECOR_CUTE_TV          47\n#define DECOR_GLITTER_MAT      48\n#define DECOR_JUMP_MAT         49\n#define DECOR_SPIN_MAT         50\n#define DECOR_C_LOW_NOTE_MAT   51\n#define DECOR_D_NOTE_MAT       52\n#define DECOR_E_NOTE_MAT       53\n#define DECOR_F_NOTE_MAT       54\n#define DECOR_G_NOTE_MAT       55\n#define DECOR_A_NOTE_MAT       56\n#define DECOR_B_NOTE_MAT       57\n#define DECOR_C_HIGH_NOTE_MAT  58\n#define DECOR_SURF_MAT         59\n#define DECOR_THUNDER_MAT      60\n#define DECOR_FIRE_BLAST_MAT   61\n#define DECOR_POWDER_SNOW_MAT  62\n#define DECOR_ATTRACT_MAT      63\n#define DECOR_FISSURE_MAT      64\n#define DECOR_SPIKES_MAT       65\n#define DECOR_BALL_POSTER      66\n#define DECOR_GREEN_POSTER     67\n#define DECOR_RED_POSTER       68\n#define DECOR_BLUE_POSTER      69\n#define DECOR_CUTE_POSTER      70\n#define DECOR_PIKA_POSTER      71\n#define DECOR_LONG_POSTER      72\n#define DECOR_SEA_POSTER       73\n#define DECOR_SKY_POSTER       74\n#define DECOR_KISS_POSTER      75\n#define DECOR_PICHU_DOLL       76\n#define DECOR_PIKACHU_DOLL     77\n#define DECOR_MARILL_DOLL      78\n#define DECOR_TOGEPI_DOLL      79\n#define DECOR_CYNDAQUIL_DOLL   80\n#define DECOR_CHIKORITA_DOLL   81\n#define DECOR_TOTODILE_DOLL    82\n#define DECOR_JIGGLYPUFF_DOLL  83\n#define DECOR_MEOWTH_DOLL      84\n#define DECOR_CLEFAIRY_DOLL    85\n#define DECOR_DITTO_DOLL       86\n#define DECOR_SMOOCHUM_DOLL    87\n#define DECOR_TREECKO_DOLL     88\n#define DECOR_TORCHIC_DOLL     89\n#define DECOR_MUDKIP_DOLL      90\n#define DECOR_DUSKULL_DOLL     91\n#define DECOR_WYNAUT_DOLL      92\n#define DECOR_BALTOY_DOLL      93\n#define DECOR_KECLEON_DOLL     94\n#define DECOR_AZURILL_DOLL     95\n#define DECOR_SKITTY_DOLL      96\n#define DECOR_SWABLU_DOLL      97\n#define DECOR_GULPIN_DOLL      98\n#define DECOR_LOTAD_DOLL       99\n#define DECOR_SEEDOT_DOLL      100\n#define DECOR_PIKA_CUSHION     101\n#define DECOR_ROUND_CUSHION    102\n#define DECOR_KISS_CUSHION     103\n#define DECOR_ZIGZAG_CUSHION   104\n#define DECOR_SPIN_CUSHION     105\n#define DECOR_DIAMOND_CUSHION  106\n#define DECOR_BALL_CUSHION     107\n#define DECOR_GRASS_CUSHION    108\n#define DECOR_FIRE_CUSHION     109\n#define DECOR_WATER_CUSHION    110\n#define DECOR_SNORLAX_DOLL     111\n#define DECOR_RHYDON_DOLL      112\n#define DECOR_LAPRAS_DOLL      113\n#define DECOR_VENUSAUR_DOLL    114\n#define DECOR_CHARIZARD_DOLL   115\n#define DECOR_BLASTOISE_DOLL   116\n#define DECOR_WAILMER_DOLL     117\n#define DECOR_REGIROCK_DOLL    118\n#define DECOR_REGICE_DOLL      119\n#define DECOR_REGISTEEL_DOLL   120\n\n#endif  // GUARD_CONSTANTS_DECORATIONS_H\n"
  },
  {
    "path": "include/constants/easy_chat.h",
    "content": "#ifndef GUARD_CONSTANTS_EASY_CHAT_H\n#define GUARD_CONSTANTS_EASY_CHAT_H\n\n#define EASY_CHAT_TYPE_PROFILE                 0\n#define EASY_CHAT_TYPE_BATTLE_START            1\n#define EASY_CHAT_TYPE_BATTLE_WON              2\n#define EASY_CHAT_TYPE_BATTLE_LOST             3\n#define EASY_CHAT_TYPE_MAIL                    4\n#define EASY_CHAT_TYPE_MAIL_NO_CONFIRM         5\n#define EASY_CHAT_TYPE_BARD_SONG               6\n#define EASY_CHAT_TYPE_INTERVIEW               7\n#define EASY_CHAT_TYPE_TRENDY_PHRASE           9\n#define EASY_CHAT_TYPE_QUESTIONNAIRE           14\n\n#define EC_GROUP_POKEMON_2      0x0\n#define EC_GROUP_TRAINER        0x1\n#define EC_GROUP_STATUS         0x2\n#define EC_GROUP_BATTLE         0x3\n#define EC_GROUP_GREETINGS      0x4\n#define EC_GROUP_PEOPLE         0x5\n#define EC_GROUP_VOICES         0x6\n#define EC_GROUP_SPEECH         0x7\n#define EC_GROUP_ENDINGS        0x8\n#define EC_GROUP_FEELINGS       0x9\n#define EC_GROUP_CONDITIONS     0xa\n#define EC_GROUP_ACTIONS        0xb\n#define EC_GROUP_LIFESTYLE      0xc\n#define EC_GROUP_HOBBIES        0xd\n#define EC_GROUP_TIME           0xe\n#define EC_GROUP_MISC           0xf\n#define EC_GROUP_ADJECTIVES     0x10\n#define EC_GROUP_EVENTS         0x11\n#define EC_GROUP_MOVE_1         0x12\n#define EC_GROUP_MOVE_2         0x13\n#define EC_GROUP_TRENDY_SAYING  0x14\n#define EC_GROUP_POKEMON        0x15\n#define EC_NUM_GROUPS           0x16\n\n// TRAINER\n#define EC_WORD_I_CHOOSE_YOU  (EC_GROUP_TRAINER << 9) | 0x0\n#define EC_WORD_GOTCHA        (EC_GROUP_TRAINER << 9) | 0x1\n#define EC_WORD_TRADE         (EC_GROUP_TRAINER << 9) | 0x2\n#define EC_WORD_SAPPHIRE      (EC_GROUP_TRAINER << 9) | 0x3\n#define EC_WORD_EVOLVE        (EC_GROUP_TRAINER << 9) | 0x4\n#define EC_WORD_ENCYCLOPEDIA  (EC_GROUP_TRAINER << 9) | 0x5\n#define EC_WORD_NATURE        (EC_GROUP_TRAINER << 9) | 0x6\n#define EC_WORD_CENTER        (EC_GROUP_TRAINER << 9) | 0x7\n#define EC_WORD_EGG           (EC_GROUP_TRAINER << 9) | 0x8\n#define EC_WORD_LINK          (EC_GROUP_TRAINER << 9) | 0x9\n#define EC_WORD_SP_ABILITY    (EC_GROUP_TRAINER << 9) | 0xa\n#define EC_WORD_TRAINER       (EC_GROUP_TRAINER << 9) | 0xb\n#define EC_WORD_VERSION       (EC_GROUP_TRAINER << 9) | 0xc\n#define EC_WORD_POKENAV       (EC_GROUP_TRAINER << 9) | 0xd\n#define EC_WORD_POKEMON       (EC_GROUP_TRAINER << 9) | 0xe\n#define EC_WORD_GET           (EC_GROUP_TRAINER << 9) | 0xf\n#define EC_WORD_POKEDEX       (EC_GROUP_TRAINER << 9) | 0x10\n#define EC_WORD_RUBY          (EC_GROUP_TRAINER << 9) | 0x11\n#define EC_WORD_LEVEL         (EC_GROUP_TRAINER << 9) | 0x12\n#define EC_WORD_RED           (EC_GROUP_TRAINER << 9) | 0x13\n#define EC_WORD_GREEN         (EC_GROUP_TRAINER << 9) | 0x14\n#define EC_WORD_BAG           (EC_GROUP_TRAINER << 9) | 0x15\n#define EC_WORD_FLAME         (EC_GROUP_TRAINER << 9) | 0x16\n#define EC_WORD_GOLD          (EC_GROUP_TRAINER << 9) | 0x17\n#define EC_WORD_LEAF          (EC_GROUP_TRAINER << 9) | 0x18\n#define EC_WORD_SILVER        (EC_GROUP_TRAINER << 9) | 0x19\n\n// STATUS\n#define EC_WORD_DARK          (EC_GROUP_STATUS << 9) | 0x0\n#define EC_WORD_STENCH        (EC_GROUP_STATUS << 9) | 0x1\n#define EC_WORD_THICK_FAT     (EC_GROUP_STATUS << 9) | 0x2\n#define EC_WORD_RAIN_DISH     (EC_GROUP_STATUS << 9) | 0x3\n#define EC_WORD_DRIZZLE       (EC_GROUP_STATUS << 9) | 0x4\n#define EC_WORD_ARENA_TRAP    (EC_GROUP_STATUS << 9) | 0x5\n#define EC_WORD_INTIMIDATE    (EC_GROUP_STATUS << 9) | 0x6\n#define EC_WORD_ROCK_HEAD     (EC_GROUP_STATUS << 9) | 0x7\n#define EC_WORD_COLOR         (EC_GROUP_STATUS << 9) | 0x8\n#define EC_WORD_ALT_COLOR     (EC_GROUP_STATUS << 9) | 0x9\n#define EC_WORD_ROCK          (EC_GROUP_STATUS << 9) | 0xa\n#define EC_WORD_BEAUTIFUL     (EC_GROUP_STATUS << 9) | 0xb\n#define EC_WORD_BEAUTY        (EC_GROUP_STATUS << 9) | 0xc\n#define EC_WORD_AIR_LOCK      (EC_GROUP_STATUS << 9) | 0xd\n#define EC_WORD_PSYCHIC       (EC_GROUP_STATUS << 9) | 0xe\n#define EC_WORD_HYPER_CUTTER  (EC_GROUP_STATUS << 9) | 0xf\n#define EC_WORD_FIGHTING      (EC_GROUP_STATUS << 9) | 0x10\n#define EC_WORD_SHADOW_TAG    (EC_GROUP_STATUS << 9) | 0x11\n#define EC_WORD_SMART         (EC_GROUP_STATUS << 9) | 0x12\n#define EC_WORD_SMARTNESS     (EC_GROUP_STATUS << 9) | 0x13\n#define EC_WORD_SPEED_BOOST   (EC_GROUP_STATUS << 9) | 0x14\n#define EC_WORD_COOL          (EC_GROUP_STATUS << 9) | 0x15\n#define EC_WORD_COOLNESS      (EC_GROUP_STATUS << 9) | 0x16\n#define EC_WORD_BATTLE_ARMOR  (EC_GROUP_STATUS << 9) | 0x17\n#define EC_WORD_CUTE          (EC_GROUP_STATUS << 9) | 0x18\n#define EC_WORD_CUTENESS      (EC_GROUP_STATUS << 9) | 0x19\n#define EC_WORD_STURDY        (EC_GROUP_STATUS << 9) | 0x1a\n#define EC_WORD_SUCTION_CUPS  (EC_GROUP_STATUS << 9) | 0x1b\n#define EC_WORD_GRASS         (EC_GROUP_STATUS << 9) | 0x1c\n#define EC_WORD_CLEAR_BODY    (EC_GROUP_STATUS << 9) | 0x1d\n#define EC_WORD_TORRENT       (EC_GROUP_STATUS << 9) | 0x1e\n#define EC_WORD_GHOST         (EC_GROUP_STATUS << 9) | 0x1f\n#define EC_WORD_ICE           (EC_GROUP_STATUS << 9) | 0x20\n#define EC_WORD_GUTS          (EC_GROUP_STATUS << 9) | 0x21\n#define EC_WORD_ROUGH_SKIN    (EC_GROUP_STATUS << 9) | 0x22\n#define EC_WORD_SHELL_ARMOR   (EC_GROUP_STATUS << 9) | 0x23\n#define EC_WORD_NATURAL_CURE  (EC_GROUP_STATUS << 9) | 0x24\n#define EC_WORD_DAMP          (EC_GROUP_STATUS << 9) | 0x25\n#define EC_WORD_GROUND        (EC_GROUP_STATUS << 9) | 0x26\n#define EC_WORD_LIMBER        (EC_GROUP_STATUS << 9) | 0x27\n#define EC_WORD_MAGNET_PULL   (EC_GROUP_STATUS << 9) | 0x28\n#define EC_WORD_WHITE_SMOKE   (EC_GROUP_STATUS << 9) | 0x29\n#define EC_WORD_SYNCHRONIZE   (EC_GROUP_STATUS << 9) | 0x2a\n#define EC_WORD_OVERGROW      (EC_GROUP_STATUS << 9) | 0x2b\n#define EC_WORD_SWIFT_SWIM    (EC_GROUP_STATUS << 9) | 0x2c\n#define EC_WORD_SAND_STREAM   (EC_GROUP_STATUS << 9) | 0x2d\n#define EC_WORD_SAND_VEIL     (EC_GROUP_STATUS << 9) | 0x2e\n#define EC_WORD_KEEN_EYE      (EC_GROUP_STATUS << 9) | 0x2f\n#define EC_WORD_INNER_FOCUS   (EC_GROUP_STATUS << 9) | 0x30\n#define EC_WORD_STATIC        (EC_GROUP_STATUS << 9) | 0x31\n#define EC_WORD_TYPE          (EC_GROUP_STATUS << 9) | 0x32\n#define EC_WORD_TOUGH         (EC_GROUP_STATUS << 9) | 0x33\n#define EC_WORD_TOUGHNESS     (EC_GROUP_STATUS << 9) | 0x34\n#define EC_WORD_SHED_SKIN     (EC_GROUP_STATUS << 9) | 0x35\n#define EC_WORD_HUGE_POWER    (EC_GROUP_STATUS << 9) | 0x36\n#define EC_WORD_VOLT_ABSORB   (EC_GROUP_STATUS << 9) | 0x37\n#define EC_WORD_WATER_ABSORB  (EC_GROUP_STATUS << 9) | 0x38\n#define EC_WORD_ELECTRIC      (EC_GROUP_STATUS << 9) | 0x39\n#define EC_WORD_FORECAST      (EC_GROUP_STATUS << 9) | 0x3a\n#define EC_WORD_SERENE_GRACE  (EC_GROUP_STATUS << 9) | 0x3b\n#define EC_WORD_POISON        (EC_GROUP_STATUS << 9) | 0x3c\n#define EC_WORD_POISON_POINT  (EC_GROUP_STATUS << 9) | 0x3d\n#define EC_WORD_DRAGON        (EC_GROUP_STATUS << 9) | 0x3e\n#define EC_WORD_TRACE         (EC_GROUP_STATUS << 9) | 0x3f\n#define EC_WORD_OBLIVIOUS     (EC_GROUP_STATUS << 9) | 0x40\n#define EC_WORD_TRUANT        (EC_GROUP_STATUS << 9) | 0x41\n#define EC_WORD_RUN_AWAY      (EC_GROUP_STATUS << 9) | 0x42\n#define EC_WORD_STICKY_HOLD   (EC_GROUP_STATUS << 9) | 0x43\n#define EC_WORD_CLOUD_NINE    (EC_GROUP_STATUS << 9) | 0x44\n#define EC_WORD_NORMAL        (EC_GROUP_STATUS << 9) | 0x45\n#define EC_WORD_STEEL         (EC_GROUP_STATUS << 9) | 0x46\n#define EC_WORD_ILLUMINATE    (EC_GROUP_STATUS << 9) | 0x47\n#define EC_WORD_EARLY_BIRD    (EC_GROUP_STATUS << 9) | 0x48\n#define EC_WORD_HUSTLE        (EC_GROUP_STATUS << 9) | 0x49\n#define EC_WORD_SHINE         (EC_GROUP_STATUS << 9) | 0x4a\n#define EC_WORD_FLYING        (EC_GROUP_STATUS << 9) | 0x4b\n#define EC_WORD_DROUGHT       (EC_GROUP_STATUS << 9) | 0x4c\n#define EC_WORD_LIGHTNINGROD  (EC_GROUP_STATUS << 9) | 0x4d\n#define EC_WORD_COMPOUNDEYES  (EC_GROUP_STATUS << 9) | 0x4e\n#define EC_WORD_MARVEL_SCALE  (EC_GROUP_STATUS << 9) | 0x4f\n#define EC_WORD_WONDER_GUARD  (EC_GROUP_STATUS << 9) | 0x50\n#define EC_WORD_INSOMNIA      (EC_GROUP_STATUS << 9) | 0x51\n#define EC_WORD_LEVITATE      (EC_GROUP_STATUS << 9) | 0x52\n#define EC_WORD_PLUS          (EC_GROUP_STATUS << 9) | 0x53\n#define EC_WORD_PRESSURE      (EC_GROUP_STATUS << 9) | 0x54\n#define EC_WORD_LIQUID_OOZE   (EC_GROUP_STATUS << 9) | 0x55\n#define EC_WORD_COLOR_CHANGE  (EC_GROUP_STATUS << 9) | 0x56\n#define EC_WORD_SOUNDPROOF    (EC_GROUP_STATUS << 9) | 0x57\n#define EC_WORD_EFFECT_SPORE  (EC_GROUP_STATUS << 9) | 0x58\n#define EC_WORD_PKRS          (EC_GROUP_STATUS << 9) | 0x59\n#define EC_WORD_FIRE          (EC_GROUP_STATUS << 9) | 0x5a\n#define EC_WORD_FLAME_BODY    (EC_GROUP_STATUS << 9) | 0x5b\n#define EC_WORD_MINUS         (EC_GROUP_STATUS << 9) | 0x5c\n#define EC_WORD_OWN_TEMPO     (EC_GROUP_STATUS << 9) | 0x5d\n#define EC_WORD_MAGMA_ARMOR   (EC_GROUP_STATUS << 9) | 0x5e\n#define EC_WORD_WATER         (EC_GROUP_STATUS << 9) | 0x5f\n#define EC_WORD_WATER_VEIL    (EC_GROUP_STATUS << 9) | 0x60\n#define EC_WORD_BUG           (EC_GROUP_STATUS << 9) | 0x61\n#define EC_WORD_SWARM         (EC_GROUP_STATUS << 9) | 0x62\n#define EC_WORD_CUTE_CHARM    (EC_GROUP_STATUS << 9) | 0x63\n#define EC_WORD_IMMUNITY      (EC_GROUP_STATUS << 9) | 0x64\n#define EC_WORD_BLAZE         (EC_GROUP_STATUS << 9) | 0x65\n#define EC_WORD_PICKUP        (EC_GROUP_STATUS << 9) | 0x66\n#define EC_WORD_PATTERN       (EC_GROUP_STATUS << 9) | 0x67\n#define EC_WORD_FLASH_FIRE    (EC_GROUP_STATUS << 9) | 0x68\n#define EC_WORD_VITAL_SPIRIT  (EC_GROUP_STATUS << 9) | 0x69\n#define EC_WORD_CHLOROPHYLL   (EC_GROUP_STATUS << 9) | 0x6a\n#define EC_WORD_PURE_POWER    (EC_GROUP_STATUS << 9) | 0x6b\n#define EC_WORD_SHIELD_DUST   (EC_GROUP_STATUS << 9) | 0x6c\n\n// BATTLE\n#define EC_WORD_MATCH_UP     (EC_GROUP_BATTLE << 9) | 0x0\n#define EC_WORD_GO           (EC_GROUP_BATTLE << 9) | 0x1\n#define EC_WORD_NO_1         (EC_GROUP_BATTLE << 9) | 0x2\n#define EC_WORD_DECIDE       (EC_GROUP_BATTLE << 9) | 0x3\n#define EC_WORD_LET_ME_WIN   (EC_GROUP_BATTLE << 9) | 0x4\n#define EC_WORD_WINS         (EC_GROUP_BATTLE << 9) | 0x5\n#define EC_WORD_WIN          (EC_GROUP_BATTLE << 9) | 0x6\n#define EC_WORD_WON          (EC_GROUP_BATTLE << 9) | 0x7\n#define EC_WORD_IF_I_WIN     (EC_GROUP_BATTLE << 9) | 0x8\n#define EC_WORD_WHEN_I_WIN   (EC_GROUP_BATTLE << 9) | 0x9\n#define EC_WORD_CAN_T_WIN    (EC_GROUP_BATTLE << 9) | 0xa\n#define EC_WORD_CAN_WIN      (EC_GROUP_BATTLE << 9) | 0xb\n#define EC_WORD_NO_MATCH     (EC_GROUP_BATTLE << 9) | 0xc\n#define EC_WORD_SPIRIT       (EC_GROUP_BATTLE << 9) | 0xd\n#define EC_WORD_DECIDED      (EC_GROUP_BATTLE << 9) | 0xe\n#define EC_WORD_TRUMP_CARD   (EC_GROUP_BATTLE << 9) | 0xf\n#define EC_WORD_TAKE_THAT    (EC_GROUP_BATTLE << 9) | 0x10\n#define EC_WORD_COME_ON      (EC_GROUP_BATTLE << 9) | 0x11\n#define EC_WORD_ATTACK       (EC_GROUP_BATTLE << 9) | 0x12\n#define EC_WORD_SURRENDER    (EC_GROUP_BATTLE << 9) | 0x13\n#define EC_WORD_GUTSY        (EC_GROUP_BATTLE << 9) | 0x14\n#define EC_WORD_TALENT       (EC_GROUP_BATTLE << 9) | 0x15\n#define EC_WORD_STRATEGY     (EC_GROUP_BATTLE << 9) | 0x16\n#define EC_WORD_SMITE        (EC_GROUP_BATTLE << 9) | 0x17\n#define EC_WORD_MATCH        (EC_GROUP_BATTLE << 9) | 0x18\n#define EC_WORD_VICTORY      (EC_GROUP_BATTLE << 9) | 0x19\n#define EC_WORD_OFFENSIVE    (EC_GROUP_BATTLE << 9) | 0x1a\n#define EC_WORD_SENSE        (EC_GROUP_BATTLE << 9) | 0x1b\n#define EC_WORD_VERSUS       (EC_GROUP_BATTLE << 9) | 0x1c\n#define EC_WORD_FIGHTS       (EC_GROUP_BATTLE << 9) | 0x1d\n#define EC_WORD_POWER        (EC_GROUP_BATTLE << 9) | 0x1e\n#define EC_WORD_CHALLENGE    (EC_GROUP_BATTLE << 9) | 0x1f\n#define EC_WORD_STRONG       (EC_GROUP_BATTLE << 9) | 0x20\n#define EC_WORD_TOO_STRONG   (EC_GROUP_BATTLE << 9) | 0x21\n#define EC_WORD_GO_EASY      (EC_GROUP_BATTLE << 9) | 0x22\n#define EC_WORD_FOE          (EC_GROUP_BATTLE << 9) | 0x23\n#define EC_WORD_GENIUS       (EC_GROUP_BATTLE << 9) | 0x24\n#define EC_WORD_LEGEND       (EC_GROUP_BATTLE << 9) | 0x25\n#define EC_WORD_ESCAPE       (EC_GROUP_BATTLE << 9) | 0x26\n#define EC_WORD_AIM          (EC_GROUP_BATTLE << 9) | 0x27\n#define EC_WORD_BATTLE       (EC_GROUP_BATTLE << 9) | 0x28\n#define EC_WORD_FIGHT        (EC_GROUP_BATTLE << 9) | 0x29\n#define EC_WORD_RESUSCITATE  (EC_GROUP_BATTLE << 9) | 0x2a\n#define EC_WORD_POINTS       (EC_GROUP_BATTLE << 9) | 0x2b\n#define EC_WORD_SERIOUS      (EC_GROUP_BATTLE << 9) | 0x2c\n#define EC_WORD_GIVE_UP      (EC_GROUP_BATTLE << 9) | 0x2d\n#define EC_WORD_LOSS         (EC_GROUP_BATTLE << 9) | 0x2e\n#define EC_WORD_IF_I_LOSE    (EC_GROUP_BATTLE << 9) | 0x2f\n#define EC_WORD_LOST         (EC_GROUP_BATTLE << 9) | 0x30\n#define EC_WORD_LOSE         (EC_GROUP_BATTLE << 9) | 0x31\n#define EC_WORD_GUARD        (EC_GROUP_BATTLE << 9) | 0x32\n#define EC_WORD_PARTNER      (EC_GROUP_BATTLE << 9) | 0x33\n#define EC_WORD_REJECT       (EC_GROUP_BATTLE << 9) | 0x34\n#define EC_WORD_ACCEPT       (EC_GROUP_BATTLE << 9) | 0x35\n#define EC_WORD_INVINCIBLE   (EC_GROUP_BATTLE << 9) | 0x36\n#define EC_WORD_RECEIVED     (EC_GROUP_BATTLE << 9) | 0x37\n#define EC_WORD_EASY         (EC_GROUP_BATTLE << 9) | 0x38\n#define EC_WORD_WEAK         (EC_GROUP_BATTLE << 9) | 0x39\n#define EC_WORD_TOO_WEAK     (EC_GROUP_BATTLE << 9) | 0x3a\n#define EC_WORD_PUSHOVER     (EC_GROUP_BATTLE << 9) | 0x3b\n#define EC_WORD_LEADER       (EC_GROUP_BATTLE << 9) | 0x3c\n#define EC_WORD_RULE         (EC_GROUP_BATTLE << 9) | 0x3d\n#define EC_WORD_MOVE         (EC_GROUP_BATTLE << 9) | 0x3e\n\n// GREETINGS\n#define EC_WORD_THANKS          (EC_GROUP_GREETINGS << 9) | 0x0\n#define EC_WORD_YES             (EC_GROUP_GREETINGS << 9) | 0x1\n#define EC_WORD_HERE_GOES       (EC_GROUP_GREETINGS << 9) | 0x2\n#define EC_WORD_HERE_I_COME     (EC_GROUP_GREETINGS << 9) | 0x3\n#define EC_WORD_HERE_IT_IS      (EC_GROUP_GREETINGS << 9) | 0x4\n#define EC_WORD_YEAH            (EC_GROUP_GREETINGS << 9) | 0x5\n#define EC_WORD_WELCOME         (EC_GROUP_GREETINGS << 9) | 0x6\n#define EC_WORD_OI              (EC_GROUP_GREETINGS << 9) | 0x7\n#define EC_WORD_HOW_DO          (EC_GROUP_GREETINGS << 9) | 0x8\n#define EC_WORD_CONGRATS        (EC_GROUP_GREETINGS << 9) | 0x9\n#define EC_WORD_GIVE_ME         (EC_GROUP_GREETINGS << 9) | 0xa\n#define EC_WORD_SORRY           (EC_GROUP_GREETINGS << 9) | 0xb\n#define EC_WORD_APOLOGIZE       (EC_GROUP_GREETINGS << 9) | 0xc\n#define EC_WORD_FORGIVE         (EC_GROUP_GREETINGS << 9) | 0xd\n#define EC_WORD_HEY_THERE       (EC_GROUP_GREETINGS << 9) | 0xe\n#define EC_WORD_HELLO           (EC_GROUP_GREETINGS << 9) | 0xf\n#define EC_WORD_GOOD_BYE        (EC_GROUP_GREETINGS << 9) | 0x10\n#define EC_WORD_THANK_YOU       (EC_GROUP_GREETINGS << 9) | 0x11\n#define EC_WORD_I_VE_ARRIVED    (EC_GROUP_GREETINGS << 9) | 0x12\n#define EC_WORD_PARDON          (EC_GROUP_GREETINGS << 9) | 0x13\n#define EC_WORD_EXCUSE          (EC_GROUP_GREETINGS << 9) | 0x14\n#define EC_WORD_SEE_YA          (EC_GROUP_GREETINGS << 9) | 0x15\n#define EC_WORD_EXCUSE_ME       (EC_GROUP_GREETINGS << 9) | 0x16\n#define EC_WORD_WELL_THEN       (EC_GROUP_GREETINGS << 9) | 0x17\n#define EC_WORD_GO_AHEAD        (EC_GROUP_GREETINGS << 9) | 0x18\n#define EC_WORD_APPRECIATE      (EC_GROUP_GREETINGS << 9) | 0x19\n#define EC_WORD_HEY_QUES        (EC_GROUP_GREETINGS << 9) | 0x1a\n#define EC_WORD_WHAT_S_UP_QUES  (EC_GROUP_GREETINGS << 9) | 0x1b\n#define EC_WORD_HUH_QUES        (EC_GROUP_GREETINGS << 9) | 0x1c\n#define EC_WORD_NO              (EC_GROUP_GREETINGS << 9) | 0x1d\n#define EC_WORD_HI              (EC_GROUP_GREETINGS << 9) | 0x1e\n#define EC_WORD_YEAH_YEAH       (EC_GROUP_GREETINGS << 9) | 0x1f\n#define EC_WORD_BYE_BYE         (EC_GROUP_GREETINGS << 9) | 0x20\n#define EC_WORD_MEET_YOU        (EC_GROUP_GREETINGS << 9) | 0x21\n#define EC_WORD_HEY             (EC_GROUP_GREETINGS << 9) | 0x22\n#define EC_WORD_SMELL           (EC_GROUP_GREETINGS << 9) | 0x23\n#define EC_WORD_LISTENING       (EC_GROUP_GREETINGS << 9) | 0x24\n#define EC_WORD_HOO_HAH         (EC_GROUP_GREETINGS << 9) | 0x25\n#define EC_WORD_YAHOO           (EC_GROUP_GREETINGS << 9) | 0x26\n#define EC_WORD_YO              (EC_GROUP_GREETINGS << 9) | 0x27\n#define EC_WORD_COME_OVER       (EC_GROUP_GREETINGS << 9) | 0x28\n#define EC_WORD_COUNT_ON        (EC_GROUP_GREETINGS << 9) | 0x29\n\n// PEOPLE\n#define EC_WORD_OPPONENT     (EC_GROUP_PEOPLE << 9) | 0x0\n#define EC_WORD_I            (EC_GROUP_PEOPLE << 9) | 0x1\n#define EC_WORD_YOU          (EC_GROUP_PEOPLE << 9) | 0x2\n#define EC_WORD_YOURS        (EC_GROUP_PEOPLE << 9) | 0x3\n#define EC_WORD_SON          (EC_GROUP_PEOPLE << 9) | 0x4\n#define EC_WORD_YOUR         (EC_GROUP_PEOPLE << 9) | 0x5\n#define EC_WORD_YOU_RE       (EC_GROUP_PEOPLE << 9) | 0x6\n#define EC_WORD_YOU_VE       (EC_GROUP_PEOPLE << 9) | 0x7\n#define EC_WORD_MOTHER       (EC_GROUP_PEOPLE << 9) | 0x8\n#define EC_WORD_GRANDFATHER  (EC_GROUP_PEOPLE << 9) | 0x9\n#define EC_WORD_UNCLE        (EC_GROUP_PEOPLE << 9) | 0xa\n#define EC_WORD_FATHER       (EC_GROUP_PEOPLE << 9) | 0xb\n#define EC_WORD_BOY          (EC_GROUP_PEOPLE << 9) | 0xc\n#define EC_WORD_ADULT        (EC_GROUP_PEOPLE << 9) | 0xd\n#define EC_WORD_BROTHER      (EC_GROUP_PEOPLE << 9) | 0xe\n#define EC_WORD_SISTER       (EC_GROUP_PEOPLE << 9) | 0xf\n#define EC_WORD_GRANDMOTHER  (EC_GROUP_PEOPLE << 9) | 0x10\n#define EC_WORD_AUNT         (EC_GROUP_PEOPLE << 9) | 0x11\n#define EC_WORD_PARENT       (EC_GROUP_PEOPLE << 9) | 0x12\n#define EC_WORD_MAN          (EC_GROUP_PEOPLE << 9) | 0x13\n#define EC_WORD_ME           (EC_GROUP_PEOPLE << 9) | 0x14\n#define EC_WORD_GIRL         (EC_GROUP_PEOPLE << 9) | 0x15\n#define EC_WORD_BABE         (EC_GROUP_PEOPLE << 9) | 0x16\n#define EC_WORD_FAMILY       (EC_GROUP_PEOPLE << 9) | 0x17\n#define EC_WORD_HER          (EC_GROUP_PEOPLE << 9) | 0x18\n#define EC_WORD_HIM          (EC_GROUP_PEOPLE << 9) | 0x19\n#define EC_WORD_HE           (EC_GROUP_PEOPLE << 9) | 0x1a\n#define EC_WORD_PLACE        (EC_GROUP_PEOPLE << 9) | 0x1b\n#define EC_WORD_DAUGHTER     (EC_GROUP_PEOPLE << 9) | 0x1c\n#define EC_WORD_HIS          (EC_GROUP_PEOPLE << 9) | 0x1d\n#define EC_WORD_HE_S         (EC_GROUP_PEOPLE << 9) | 0x1e\n#define EC_WORD_AREN_T       (EC_GROUP_PEOPLE << 9) | 0x1f\n#define EC_WORD_SIBLINGS     (EC_GROUP_PEOPLE << 9) | 0x20\n#define EC_WORD_KID          (EC_GROUP_PEOPLE << 9) | 0x21\n#define EC_WORD_CHILDREN     (EC_GROUP_PEOPLE << 9) | 0x22\n#define EC_WORD_MR           (EC_GROUP_PEOPLE << 9) | 0x23\n#define EC_WORD_MRS          (EC_GROUP_PEOPLE << 9) | 0x24\n#define EC_WORD_MYSELF       (EC_GROUP_PEOPLE << 9) | 0x25\n#define EC_WORD_I_WAS        (EC_GROUP_PEOPLE << 9) | 0x26\n#define EC_WORD_TO_ME        (EC_GROUP_PEOPLE << 9) | 0x27\n#define EC_WORD_MY           (EC_GROUP_PEOPLE << 9) | 0x28\n#define EC_WORD_I_AM         (EC_GROUP_PEOPLE << 9) | 0x29\n#define EC_WORD_I_VE         (EC_GROUP_PEOPLE << 9) | 0x2a\n#define EC_WORD_WHO          (EC_GROUP_PEOPLE << 9) | 0x2b\n#define EC_WORD_SOMEONE      (EC_GROUP_PEOPLE << 9) | 0x2c\n#define EC_WORD_WHO_WAS      (EC_GROUP_PEOPLE << 9) | 0x2d\n#define EC_WORD_TO_WHOM      (EC_GROUP_PEOPLE << 9) | 0x2e\n#define EC_WORD_WHOSE        (EC_GROUP_PEOPLE << 9) | 0x2f\n#define EC_WORD_WHO_IS       (EC_GROUP_PEOPLE << 9) | 0x30\n#define EC_WORD_IT_S         (EC_GROUP_PEOPLE << 9) | 0x31\n#define EC_WORD_LADY         (EC_GROUP_PEOPLE << 9) | 0x32\n#define EC_WORD_FRIEND       (EC_GROUP_PEOPLE << 9) | 0x33\n#define EC_WORD_ALLY         (EC_GROUP_PEOPLE << 9) | 0x34\n#define EC_WORD_PERSON       (EC_GROUP_PEOPLE << 9) | 0x35\n#define EC_WORD_DUDE         (EC_GROUP_PEOPLE << 9) | 0x36\n#define EC_WORD_THEY         (EC_GROUP_PEOPLE << 9) | 0x37\n#define EC_WORD_THEY_WERE    (EC_GROUP_PEOPLE << 9) | 0x38\n#define EC_WORD_TO_THEM      (EC_GROUP_PEOPLE << 9) | 0x39\n#define EC_WORD_THEIR        (EC_GROUP_PEOPLE << 9) | 0x3a\n#define EC_WORD_THEY_RE      (EC_GROUP_PEOPLE << 9) | 0x3b\n#define EC_WORD_THEY_VE      (EC_GROUP_PEOPLE << 9) | 0x3c\n#define EC_WORD_WE           (EC_GROUP_PEOPLE << 9) | 0x3d\n#define EC_WORD_BEEN         (EC_GROUP_PEOPLE << 9) | 0x3e\n#define EC_WORD_TO_US        (EC_GROUP_PEOPLE << 9) | 0x3f\n#define EC_WORD_OUR          (EC_GROUP_PEOPLE << 9) | 0x40\n#define EC_WORD_WE_RE        (EC_GROUP_PEOPLE << 9) | 0x41\n#define EC_WORD_RIVAL        (EC_GROUP_PEOPLE << 9) | 0x42\n#define EC_WORD_WE_VE        (EC_GROUP_PEOPLE << 9) | 0x43\n#define EC_WORD_WOMAN        (EC_GROUP_PEOPLE << 9) | 0x44\n#define EC_WORD_SHE          (EC_GROUP_PEOPLE << 9) | 0x45\n#define EC_WORD_SHE_WAS      (EC_GROUP_PEOPLE << 9) | 0x46\n#define EC_WORD_TO_HER       (EC_GROUP_PEOPLE << 9) | 0x47\n#define EC_WORD_HERS         (EC_GROUP_PEOPLE << 9) | 0x48\n#define EC_WORD_SHE_IS       (EC_GROUP_PEOPLE << 9) | 0x49\n#define EC_WORD_SOME         (EC_GROUP_PEOPLE << 9) | 0x4a\n\n// VOICES\n#define EC_WORD_EXCL                        (EC_GROUP_VOICES << 9) | 0x0\n#define EC_WORD_EXCL_EXCL                   (EC_GROUP_VOICES << 9) | 0x1\n#define EC_WORD_QUES_EXCL                   (EC_GROUP_VOICES << 9) | 0x2\n#define EC_WORD_QUES                        (EC_GROUP_VOICES << 9) | 0x3\n#define EC_WORD_ELLIPSIS                    (EC_GROUP_VOICES << 9) | 0x4\n#define EC_WORD_ELLIPSIS_EXCL               (EC_GROUP_VOICES << 9) | 0x5\n#define EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS  (EC_GROUP_VOICES << 9) | 0x6\n#define EC_WORD_DASH                        (EC_GROUP_VOICES << 9) | 0x7\n#define EC_WORD_DASH_DASH_DASH              (EC_GROUP_VOICES << 9) | 0x8\n#define EC_WORD_UH_OH                       (EC_GROUP_VOICES << 9) | 0x9\n#define EC_WORD_WAAAH                       (EC_GROUP_VOICES << 9) | 0xa\n#define EC_WORD_AHAHA                       (EC_GROUP_VOICES << 9) | 0xb\n#define EC_WORD_OH_QUES                     (EC_GROUP_VOICES << 9) | 0xc\n#define EC_WORD_NOPE                        (EC_GROUP_VOICES << 9) | 0xd\n#define EC_WORD_URGH                        (EC_GROUP_VOICES << 9) | 0xe\n#define EC_WORD_HMM                         (EC_GROUP_VOICES << 9) | 0xf\n#define EC_WORD_WHOAH                       (EC_GROUP_VOICES << 9) | 0x10\n#define EC_WORD_WROOOAAR_EXCL               (EC_GROUP_VOICES << 9) | 0x11\n#define EC_WORD_WOW                         (EC_GROUP_VOICES << 9) | 0x12\n#define EC_WORD_GIGGLE                      (EC_GROUP_VOICES << 9) | 0x13\n#define EC_WORD_SIGH                        (EC_GROUP_VOICES << 9) | 0x14\n#define EC_WORD_UNBELIEVABLE                (EC_GROUP_VOICES << 9) | 0x15\n#define EC_WORD_CRIES                       (EC_GROUP_VOICES << 9) | 0x16\n#define EC_WORD_AGREE                       (EC_GROUP_VOICES << 9) | 0x17\n#define EC_WORD_EH_QUES                     (EC_GROUP_VOICES << 9) | 0x18\n#define EC_WORD_CRY                         (EC_GROUP_VOICES << 9) | 0x19\n#define EC_WORD_EHEHE                       (EC_GROUP_VOICES << 9) | 0x1a\n#define EC_WORD_OI_OI_OI                    (EC_GROUP_VOICES << 9) | 0x1b\n#define EC_WORD_OH_YEAH                     (EC_GROUP_VOICES << 9) | 0x1c\n#define EC_WORD_OH                          (EC_GROUP_VOICES << 9) | 0x1d\n#define EC_WORD_OOPS                        (EC_GROUP_VOICES << 9) | 0x1e\n#define EC_WORD_SHOCKED                     (EC_GROUP_VOICES << 9) | 0x1f\n#define EC_WORD_EEK                         (EC_GROUP_VOICES << 9) | 0x20\n#define EC_WORD_GRAAAH                      (EC_GROUP_VOICES << 9) | 0x21\n#define EC_WORD_GWAHAHAHA                   (EC_GROUP_VOICES << 9) | 0x22\n#define EC_WORD_WAY                         (EC_GROUP_VOICES << 9) | 0x23\n#define EC_WORD_TCH                         (EC_GROUP_VOICES << 9) | 0x24\n#define EC_WORD_HEHE                        (EC_GROUP_VOICES << 9) | 0x25\n#define EC_WORD_HAH                         (EC_GROUP_VOICES << 9) | 0x26\n#define EC_WORD_YUP                         (EC_GROUP_VOICES << 9) | 0x27\n#define EC_WORD_HAHAHA                      (EC_GROUP_VOICES << 9) | 0x28\n#define EC_WORD_AIYEEH                      (EC_GROUP_VOICES << 9) | 0x29\n#define EC_WORD_HIYAH                       (EC_GROUP_VOICES << 9) | 0x2a\n#define EC_WORD_FUFUFU                      (EC_GROUP_VOICES << 9) | 0x2b\n#define EC_WORD_LOL                         (EC_GROUP_VOICES << 9) | 0x2c\n#define EC_WORD_SNORT                       (EC_GROUP_VOICES << 9) | 0x2d\n#define EC_WORD_HUMPH                       (EC_GROUP_VOICES << 9) | 0x2e\n#define EC_WORD_HEHEHE                      (EC_GROUP_VOICES << 9) | 0x2f\n#define EC_WORD_HEH                         (EC_GROUP_VOICES << 9) | 0x30\n#define EC_WORD_HOHOHO                      (EC_GROUP_VOICES << 9) | 0x31\n#define EC_WORD_UH_HUH                      (EC_GROUP_VOICES << 9) | 0x32\n#define EC_WORD_OH_DEAR                     (EC_GROUP_VOICES << 9) | 0x33\n#define EC_WORD_ARRGH                       (EC_GROUP_VOICES << 9) | 0x34\n#define EC_WORD_MUFUFU                      (EC_GROUP_VOICES << 9) | 0x35\n#define EC_WORD_MMM                         (EC_GROUP_VOICES << 9) | 0x36\n#define EC_WORD_OH_KAY                      (EC_GROUP_VOICES << 9) | 0x37\n#define EC_WORD_OKAY                        (EC_GROUP_VOICES << 9) | 0x38\n#define EC_WORD_LALALA                      (EC_GROUP_VOICES << 9) | 0x39\n#define EC_WORD_YAY                         (EC_GROUP_VOICES << 9) | 0x3a\n#define EC_WORD_AWW                         (EC_GROUP_VOICES << 9) | 0x3b\n#define EC_WORD_WOWEE                       (EC_GROUP_VOICES << 9) | 0x3c\n#define EC_WORD_GWAH                        (EC_GROUP_VOICES << 9) | 0x3d\n#define EC_WORD_WAHAHAHA                    (EC_GROUP_VOICES << 9) | 0x3e\n\n// SPEECH\n#define EC_WORD_LISTEN      (EC_GROUP_SPEECH << 9) | 0x0\n#define EC_WORD_NOT_VERY    (EC_GROUP_SPEECH << 9) | 0x1\n#define EC_WORD_MEAN        (EC_GROUP_SPEECH << 9) | 0x2\n#define EC_WORD_LIE         (EC_GROUP_SPEECH << 9) | 0x3\n#define EC_WORD_LAY         (EC_GROUP_SPEECH << 9) | 0x4\n#define EC_WORD_RECOMMEND   (EC_GROUP_SPEECH << 9) | 0x5\n#define EC_WORD_NITWIT      (EC_GROUP_SPEECH << 9) | 0x6\n#define EC_WORD_QUITE       (EC_GROUP_SPEECH << 9) | 0x7\n#define EC_WORD_FROM        (EC_GROUP_SPEECH << 9) | 0x8\n#define EC_WORD_FEELING     (EC_GROUP_SPEECH << 9) | 0x9\n#define EC_WORD_BUT         (EC_GROUP_SPEECH << 9) | 0xa\n#define EC_WORD_HOWEVER     (EC_GROUP_SPEECH << 9) | 0xb\n#define EC_WORD_CASE        (EC_GROUP_SPEECH << 9) | 0xc\n#define EC_WORD_THE         (EC_GROUP_SPEECH << 9) | 0xd\n#define EC_WORD_MISS        (EC_GROUP_SPEECH << 9) | 0xe\n#define EC_WORD_HOW         (EC_GROUP_SPEECH << 9) | 0xf\n#define EC_WORD_HIT         (EC_GROUP_SPEECH << 9) | 0x10\n#define EC_WORD_ENOUGH      (EC_GROUP_SPEECH << 9) | 0x11\n#define EC_WORD_A_LOT       (EC_GROUP_SPEECH << 9) | 0x12\n#define EC_WORD_A_LITTLE    (EC_GROUP_SPEECH << 9) | 0x13\n#define EC_WORD_ABSOLUTELY  (EC_GROUP_SPEECH << 9) | 0x14\n#define EC_WORD_AND         (EC_GROUP_SPEECH << 9) | 0x15\n#define EC_WORD_ONLY        (EC_GROUP_SPEECH << 9) | 0x16\n#define EC_WORD_AROUND      (EC_GROUP_SPEECH << 9) | 0x17\n#define EC_WORD_PROBABLY    (EC_GROUP_SPEECH << 9) | 0x18\n#define EC_WORD_IF          (EC_GROUP_SPEECH << 9) | 0x19\n#define EC_WORD_VERY        (EC_GROUP_SPEECH << 9) | 0x1a\n#define EC_WORD_A_TINY_BIT  (EC_GROUP_SPEECH << 9) | 0x1b\n#define EC_WORD_WILD        (EC_GROUP_SPEECH << 9) | 0x1c\n#define EC_WORD_THAT_S      (EC_GROUP_SPEECH << 9) | 0x1d\n#define EC_WORD_JUST        (EC_GROUP_SPEECH << 9) | 0x1e\n#define EC_WORD_EVEN_SO     (EC_GROUP_SPEECH << 9) | 0x1f\n#define EC_WORD_MUST_BE     (EC_GROUP_SPEECH << 9) | 0x20\n#define EC_WORD_NATURALLY   (EC_GROUP_SPEECH << 9) | 0x21\n#define EC_WORD_FOR_NOW     (EC_GROUP_SPEECH << 9) | 0x22\n#define EC_WORD_UNDERSTOOD  (EC_GROUP_SPEECH << 9) | 0x23\n#define EC_WORD_JOKING      (EC_GROUP_SPEECH << 9) | 0x24\n#define EC_WORD_READY       (EC_GROUP_SPEECH << 9) | 0x25\n#define EC_WORD_SOMETHING   (EC_GROUP_SPEECH << 9) | 0x26\n#define EC_WORD_SOMEHOW     (EC_GROUP_SPEECH << 9) | 0x27\n#define EC_WORD_ALTHOUGH    (EC_GROUP_SPEECH << 9) | 0x28\n#define EC_WORD_ALSO        (EC_GROUP_SPEECH << 9) | 0x29\n#define EC_WORD_PERFECT     (EC_GROUP_SPEECH << 9) | 0x2a\n#define EC_WORD_AS_MUCH_AS  (EC_GROUP_SPEECH << 9) | 0x2b\n#define EC_WORD_REALLY      (EC_GROUP_SPEECH << 9) | 0x2c\n#define EC_WORD_TRULY       (EC_GROUP_SPEECH << 9) | 0x2d\n#define EC_WORD_SERIOUSLY   (EC_GROUP_SPEECH << 9) | 0x2e\n#define EC_WORD_TOTALLY     (EC_GROUP_SPEECH << 9) | 0x2f\n#define EC_WORD_UNTIL       (EC_GROUP_SPEECH << 9) | 0x30\n#define EC_WORD_AS_IF       (EC_GROUP_SPEECH << 9) | 0x31\n#define EC_WORD_MOOD        (EC_GROUP_SPEECH << 9) | 0x32\n#define EC_WORD_RATHER      (EC_GROUP_SPEECH << 9) | 0x33\n#define EC_WORD_AWFULLY     (EC_GROUP_SPEECH << 9) | 0x34\n#define EC_WORD_MODE        (EC_GROUP_SPEECH << 9) | 0x35\n#define EC_WORD_MORE        (EC_GROUP_SPEECH << 9) | 0x36\n#define EC_WORD_TOO_LATE    (EC_GROUP_SPEECH << 9) | 0x37\n#define EC_WORD_FINALLY     (EC_GROUP_SPEECH << 9) | 0x38\n#define EC_WORD_ANY         (EC_GROUP_SPEECH << 9) | 0x39\n#define EC_WORD_INSTEAD     (EC_GROUP_SPEECH << 9) | 0x3a\n#define EC_WORD_FANTASTIC   (EC_GROUP_SPEECH << 9) | 0x3b\n\n// ENDINGS\n#define EC_WORD_WILL           (EC_GROUP_ENDINGS << 9) | 0x0\n#define EC_WORD_WILL_BE_HERE   (EC_GROUP_ENDINGS << 9) | 0x1\n#define EC_WORD_OR             (EC_GROUP_ENDINGS << 9) | 0x2\n#define EC_WORD_TIMES          (EC_GROUP_ENDINGS << 9) | 0x3\n#define EC_WORD_WONDER         (EC_GROUP_ENDINGS << 9) | 0x4\n#define EC_WORD_IS_IT_QUES     (EC_GROUP_ENDINGS << 9) | 0x5\n#define EC_WORD_BE             (EC_GROUP_ENDINGS << 9) | 0x6\n#define EC_WORD_GIMME          (EC_GROUP_ENDINGS << 9) | 0x7\n#define EC_WORD_COULD          (EC_GROUP_ENDINGS << 9) | 0x8\n#define EC_WORD_LIKELY_TO      (EC_GROUP_ENDINGS << 9) | 0x9\n#define EC_WORD_WOULD          (EC_GROUP_ENDINGS << 9) | 0xa\n#define EC_WORD_IS             (EC_GROUP_ENDINGS << 9) | 0xb\n#define EC_WORD_ISN_T_IT_QUES  (EC_GROUP_ENDINGS << 9) | 0xc\n#define EC_WORD_LET_S          (EC_GROUP_ENDINGS << 9) | 0xd\n#define EC_WORD_OTHER          (EC_GROUP_ENDINGS << 9) | 0xe\n#define EC_WORD_ARE            (EC_GROUP_ENDINGS << 9) | 0xf\n#define EC_WORD_WAS            (EC_GROUP_ENDINGS << 9) | 0x10\n#define EC_WORD_WERE           (EC_GROUP_ENDINGS << 9) | 0x11\n#define EC_WORD_THOSE          (EC_GROUP_ENDINGS << 9) | 0x12\n#define EC_WORD_ISN_T          (EC_GROUP_ENDINGS << 9) | 0x13\n#define EC_WORD_WON_T          (EC_GROUP_ENDINGS << 9) | 0x14\n#define EC_WORD_CAN_T          (EC_GROUP_ENDINGS << 9) | 0x15\n#define EC_WORD_CAN            (EC_GROUP_ENDINGS << 9) | 0x16\n#define EC_WORD_DON_T          (EC_GROUP_ENDINGS << 9) | 0x17\n#define EC_WORD_DO             (EC_GROUP_ENDINGS << 9) | 0x18\n#define EC_WORD_DOES           (EC_GROUP_ENDINGS << 9) | 0x19\n#define EC_WORD_WHOM           (EC_GROUP_ENDINGS << 9) | 0x1a\n#define EC_WORD_WHICH          (EC_GROUP_ENDINGS << 9) | 0x1b\n#define EC_WORD_WASN_T         (EC_GROUP_ENDINGS << 9) | 0x1c\n#define EC_WORD_WEREN_T        (EC_GROUP_ENDINGS << 9) | 0x1d\n#define EC_WORD_HAVE           (EC_GROUP_ENDINGS << 9) | 0x1e\n#define EC_WORD_HAVEN_T        (EC_GROUP_ENDINGS << 9) | 0x1f\n#define EC_WORD_A              (EC_GROUP_ENDINGS << 9) | 0x20\n#define EC_WORD_AN             (EC_GROUP_ENDINGS << 9) | 0x21\n#define EC_WORD_NOT            (EC_GROUP_ENDINGS << 9) | 0x22\n#define EC_WORD_THERE          (EC_GROUP_ENDINGS << 9) | 0x23\n#define EC_WORD_OK_QUES        (EC_GROUP_ENDINGS << 9) | 0x24\n#define EC_WORD_SO             (EC_GROUP_ENDINGS << 9) | 0x25\n#define EC_WORD_MAYBE          (EC_GROUP_ENDINGS << 9) | 0x26\n#define EC_WORD_ABOUT          (EC_GROUP_ENDINGS << 9) | 0x27\n#define EC_WORD_OVER           (EC_GROUP_ENDINGS << 9) | 0x28\n#define EC_WORD_IT             (EC_GROUP_ENDINGS << 9) | 0x29\n#define EC_WORD_ALL            (EC_GROUP_ENDINGS << 9) | 0x2a\n#define EC_WORD_FOR            (EC_GROUP_ENDINGS << 9) | 0x2b\n#define EC_WORD_ON             (EC_GROUP_ENDINGS << 9) | 0x2c\n#define EC_WORD_OFF            (EC_GROUP_ENDINGS << 9) | 0x2d\n#define EC_WORD_AS             (EC_GROUP_ENDINGS << 9) | 0x2e\n#define EC_WORD_TO             (EC_GROUP_ENDINGS << 9) | 0x2f\n#define EC_WORD_WITH           (EC_GROUP_ENDINGS << 9) | 0x30\n#define EC_WORD_BETTER         (EC_GROUP_ENDINGS << 9) | 0x31\n#define EC_WORD_EVER           (EC_GROUP_ENDINGS << 9) | 0x32\n#define EC_WORD_SINCE          (EC_GROUP_ENDINGS << 9) | 0x33\n#define EC_WORD_OF             (EC_GROUP_ENDINGS << 9) | 0x34\n#define EC_WORD_BELONGS_TO     (EC_GROUP_ENDINGS << 9) | 0x35\n#define EC_WORD_AT             (EC_GROUP_ENDINGS << 9) | 0x36\n#define EC_WORD_IN             (EC_GROUP_ENDINGS << 9) | 0x37\n#define EC_WORD_OUT            (EC_GROUP_ENDINGS << 9) | 0x38\n#define EC_WORD_TOO            (EC_GROUP_ENDINGS << 9) | 0x39\n#define EC_WORD_LIKE           (EC_GROUP_ENDINGS << 9) | 0x3a\n#define EC_WORD_DID            (EC_GROUP_ENDINGS << 9) | 0x3b\n#define EC_WORD_DIDN_T         (EC_GROUP_ENDINGS << 9) | 0x3c\n#define EC_WORD_DOESN_T        (EC_GROUP_ENDINGS << 9) | 0x3d\n#define EC_WORD_WITHOUT        (EC_GROUP_ENDINGS << 9) | 0x3e\n#define EC_WORD_AFTER          (EC_GROUP_ENDINGS << 9) | 0x3f\n#define EC_WORD_BEFORE         (EC_GROUP_ENDINGS << 9) | 0x40\n#define EC_WORD_WHILE          (EC_GROUP_ENDINGS << 9) | 0x41\n#define EC_WORD_THAN           (EC_GROUP_ENDINGS << 9) | 0x42\n#define EC_WORD_ONCE           (EC_GROUP_ENDINGS << 9) | 0x43\n#define EC_WORD_ANYWHERE       (EC_GROUP_ENDINGS << 9) | 0x44\n\n// FEELINGS\n#define EC_WORD_MEET          (EC_GROUP_FEELINGS << 9) | 0x0\n#define EC_WORD_PLAY          (EC_GROUP_FEELINGS << 9) | 0x1\n#define EC_WORD_HURRIED       (EC_GROUP_FEELINGS << 9) | 0x2\n#define EC_WORD_GOES          (EC_GROUP_FEELINGS << 9) | 0x3\n#define EC_WORD_GIDDY         (EC_GROUP_FEELINGS << 9) | 0x4\n#define EC_WORD_HAPPY         (EC_GROUP_FEELINGS << 9) | 0x5\n#define EC_WORD_HAPPINESS     (EC_GROUP_FEELINGS << 9) | 0x6\n#define EC_WORD_EXCITE        (EC_GROUP_FEELINGS << 9) | 0x7\n#define EC_WORD_IMPORTANT     (EC_GROUP_FEELINGS << 9) | 0x8\n#define EC_WORD_FUNNY         (EC_GROUP_FEELINGS << 9) | 0x9\n#define EC_WORD_GOT           (EC_GROUP_FEELINGS << 9) | 0xa\n#define EC_WORD_GO_HOME       (EC_GROUP_FEELINGS << 9) | 0xb\n#define EC_WORD_DISAPPOINTED  (EC_GROUP_FEELINGS << 9) | 0xc\n#define EC_WORD_DISAPPOINTS   (EC_GROUP_FEELINGS << 9) | 0xd\n#define EC_WORD_SAD           (EC_GROUP_FEELINGS << 9) | 0xe\n#define EC_WORD_TRY           (EC_GROUP_FEELINGS << 9) | 0xf\n#define EC_WORD_TRIES         (EC_GROUP_FEELINGS << 9) | 0x10\n#define EC_WORD_HEARS         (EC_GROUP_FEELINGS << 9) | 0x11\n#define EC_WORD_THINK         (EC_GROUP_FEELINGS << 9) | 0x12\n#define EC_WORD_HEAR          (EC_GROUP_FEELINGS << 9) | 0x13\n#define EC_WORD_WANTS         (EC_GROUP_FEELINGS << 9) | 0x14\n#define EC_WORD_MISHEARD      (EC_GROUP_FEELINGS << 9) | 0x15\n#define EC_WORD_DISLIKE       (EC_GROUP_FEELINGS << 9) | 0x16\n#define EC_WORD_ANGRY         (EC_GROUP_FEELINGS << 9) | 0x17\n#define EC_WORD_ANGER         (EC_GROUP_FEELINGS << 9) | 0x18\n#define EC_WORD_SCARY         (EC_GROUP_FEELINGS << 9) | 0x19\n#define EC_WORD_LONESOME      (EC_GROUP_FEELINGS << 9) | 0x1a\n#define EC_WORD_DISAPPOINT    (EC_GROUP_FEELINGS << 9) | 0x1b\n#define EC_WORD_JOY           (EC_GROUP_FEELINGS << 9) | 0x1c\n#define EC_WORD_GETS          (EC_GROUP_FEELINGS << 9) | 0x1d\n#define EC_WORD_NEVER         (EC_GROUP_FEELINGS << 9) | 0x1e\n#define EC_WORD_DARN          (EC_GROUP_FEELINGS << 9) | 0x1f\n#define EC_WORD_DOWNCAST      (EC_GROUP_FEELINGS << 9) | 0x20\n#define EC_WORD_INCREDIBLE    (EC_GROUP_FEELINGS << 9) | 0x21\n#define EC_WORD_LIKES         (EC_GROUP_FEELINGS << 9) | 0x22\n#define EC_WORD_DISLIKES      (EC_GROUP_FEELINGS << 9) | 0x23\n#define EC_WORD_BORING        (EC_GROUP_FEELINGS << 9) | 0x24\n#define EC_WORD_CARE          (EC_GROUP_FEELINGS << 9) | 0x25\n#define EC_WORD_CARES         (EC_GROUP_FEELINGS << 9) | 0x26\n#define EC_WORD_ALL_RIGHT     (EC_GROUP_FEELINGS << 9) | 0x27\n#define EC_WORD_ADORE         (EC_GROUP_FEELINGS << 9) | 0x28\n#define EC_WORD_DISASTER      (EC_GROUP_FEELINGS << 9) | 0x29\n#define EC_WORD_ENJOY         (EC_GROUP_FEELINGS << 9) | 0x2a\n#define EC_WORD_ENJOYS        (EC_GROUP_FEELINGS << 9) | 0x2b\n#define EC_WORD_EAT           (EC_GROUP_FEELINGS << 9) | 0x2c\n#define EC_WORD_LACKING       (EC_GROUP_FEELINGS << 9) | 0x2d\n#define EC_WORD_BAD           (EC_GROUP_FEELINGS << 9) | 0x2e\n#define EC_WORD_HARD          (EC_GROUP_FEELINGS << 9) | 0x2f\n#define EC_WORD_TERRIBLE      (EC_GROUP_FEELINGS << 9) | 0x30\n#define EC_WORD_SHOULD        (EC_GROUP_FEELINGS << 9) | 0x31\n#define EC_WORD_NICE          (EC_GROUP_FEELINGS << 9) | 0x32\n#define EC_WORD_DRINK         (EC_GROUP_FEELINGS << 9) | 0x33\n#define EC_WORD_SURPRISE      (EC_GROUP_FEELINGS << 9) | 0x34\n#define EC_WORD_FEAR          (EC_GROUP_FEELINGS << 9) | 0x35\n#define EC_WORD_WANT          (EC_GROUP_FEELINGS << 9) | 0x36\n#define EC_WORD_WAIT          (EC_GROUP_FEELINGS << 9) | 0x37\n#define EC_WORD_SATISFIED     (EC_GROUP_FEELINGS << 9) | 0x38\n#define EC_WORD_SEE           (EC_GROUP_FEELINGS << 9) | 0x39\n#define EC_WORD_RARE          (EC_GROUP_FEELINGS << 9) | 0x3a\n#define EC_WORD_NEGATIVE      (EC_GROUP_FEELINGS << 9) | 0x3b\n#define EC_WORD_DONE          (EC_GROUP_FEELINGS << 9) | 0x3c\n#define EC_WORD_DANGER        (EC_GROUP_FEELINGS << 9) | 0x3d\n#define EC_WORD_DEFEATED      (EC_GROUP_FEELINGS << 9) | 0x3e\n#define EC_WORD_BEAT          (EC_GROUP_FEELINGS << 9) | 0x3f\n#define EC_WORD_GREAT         (EC_GROUP_FEELINGS << 9) | 0x40\n#define EC_WORD_ROMANTIC      (EC_GROUP_FEELINGS << 9) | 0x41\n#define EC_WORD_QUESTION      (EC_GROUP_FEELINGS << 9) | 0x42\n#define EC_WORD_UNDERSTAND    (EC_GROUP_FEELINGS << 9) | 0x43\n#define EC_WORD_UNDERSTANDS   (EC_GROUP_FEELINGS << 9) | 0x44\n\n// CONDITIONS\n#define EC_WORD_HOT           (EC_GROUP_CONDITIONS << 9) | 0x0\n#define EC_WORD_EXISTS        (EC_GROUP_CONDITIONS << 9) | 0x1\n#define EC_WORD_EXCESS        (EC_GROUP_CONDITIONS << 9) | 0x2\n#define EC_WORD_APPROVED      (EC_GROUP_CONDITIONS << 9) | 0x3\n#define EC_WORD_HAS           (EC_GROUP_CONDITIONS << 9) | 0x4\n#define EC_WORD_GOOD          (EC_GROUP_CONDITIONS << 9) | 0x5\n#define EC_WORD_LESS          (EC_GROUP_CONDITIONS << 9) | 0x6\n#define EC_WORD_MOMENTUM      (EC_GROUP_CONDITIONS << 9) | 0x7\n#define EC_WORD_GOING         (EC_GROUP_CONDITIONS << 9) | 0x8\n#define EC_WORD_WEIRD         (EC_GROUP_CONDITIONS << 9) | 0x9\n#define EC_WORD_BUSY          (EC_GROUP_CONDITIONS << 9) | 0xa\n#define EC_WORD_TOGETHER      (EC_GROUP_CONDITIONS << 9) | 0xb\n#define EC_WORD_FULL          (EC_GROUP_CONDITIONS << 9) | 0xc\n#define EC_WORD_ABSENT        (EC_GROUP_CONDITIONS << 9) | 0xd\n#define EC_WORD_BEING         (EC_GROUP_CONDITIONS << 9) | 0xe\n#define EC_WORD_NEED          (EC_GROUP_CONDITIONS << 9) | 0xf\n#define EC_WORD_TASTY         (EC_GROUP_CONDITIONS << 9) | 0x10\n#define EC_WORD_SKILLED       (EC_GROUP_CONDITIONS << 9) | 0x11\n#define EC_WORD_NOISY         (EC_GROUP_CONDITIONS << 9) | 0x12\n#define EC_WORD_BIG           (EC_GROUP_CONDITIONS << 9) | 0x13\n#define EC_WORD_LATE          (EC_GROUP_CONDITIONS << 9) | 0x14\n#define EC_WORD_CLOSE         (EC_GROUP_CONDITIONS << 9) | 0x15\n#define EC_WORD_DOCILE        (EC_GROUP_CONDITIONS << 9) | 0x16\n#define EC_WORD_AMUSING       (EC_GROUP_CONDITIONS << 9) | 0x17\n#define EC_WORD_ENTERTAINING  (EC_GROUP_CONDITIONS << 9) | 0x18\n#define EC_WORD_PERFECTION    (EC_GROUP_CONDITIONS << 9) | 0x19\n#define EC_WORD_PRETTY        (EC_GROUP_CONDITIONS << 9) | 0x1a\n#define EC_WORD_HEALTHY       (EC_GROUP_CONDITIONS << 9) | 0x1b\n#define EC_WORD_EXCELLENT     (EC_GROUP_CONDITIONS << 9) | 0x1c\n#define EC_WORD_UPSIDE_DOWN   (EC_GROUP_CONDITIONS << 9) | 0x1d\n#define EC_WORD_COLD          (EC_GROUP_CONDITIONS << 9) | 0x1e\n#define EC_WORD_REFRESHING    (EC_GROUP_CONDITIONS << 9) | 0x1f\n#define EC_WORD_UNAVOIDABLE   (EC_GROUP_CONDITIONS << 9) | 0x20\n#define EC_WORD_MUCH          (EC_GROUP_CONDITIONS << 9) | 0x21\n#define EC_WORD_OVERWHELMING  (EC_GROUP_CONDITIONS << 9) | 0x22\n#define EC_WORD_FABULOUS      (EC_GROUP_CONDITIONS << 9) | 0x23\n#define EC_WORD_ELSE          (EC_GROUP_CONDITIONS << 9) | 0x24\n#define EC_WORD_EXPENSIVE     (EC_GROUP_CONDITIONS << 9) | 0x25\n#define EC_WORD_CORRECT       (EC_GROUP_CONDITIONS << 9) | 0x26\n#define EC_WORD_IMPOSSIBLE    (EC_GROUP_CONDITIONS << 9) | 0x27\n#define EC_WORD_SMALL         (EC_GROUP_CONDITIONS << 9) | 0x28\n#define EC_WORD_DIFFERENT     (EC_GROUP_CONDITIONS << 9) | 0x29\n#define EC_WORD_TIRED         (EC_GROUP_CONDITIONS << 9) | 0x2a\n#define EC_WORD_SKILL         (EC_GROUP_CONDITIONS << 9) | 0x2b\n#define EC_WORD_TOP           (EC_GROUP_CONDITIONS << 9) | 0x2c\n#define EC_WORD_NON_STOP      (EC_GROUP_CONDITIONS << 9) | 0x2d\n#define EC_WORD_PREPOSTEROUS  (EC_GROUP_CONDITIONS << 9) | 0x2e\n#define EC_WORD_NONE          (EC_GROUP_CONDITIONS << 9) | 0x2f\n#define EC_WORD_NOTHING       (EC_GROUP_CONDITIONS << 9) | 0x30\n#define EC_WORD_NATURAL       (EC_GROUP_CONDITIONS << 9) | 0x31\n#define EC_WORD_BECOMES       (EC_GROUP_CONDITIONS << 9) | 0x32\n#define EC_WORD_LUKEWARM      (EC_GROUP_CONDITIONS << 9) | 0x33\n#define EC_WORD_FAST          (EC_GROUP_CONDITIONS << 9) | 0x34\n#define EC_WORD_LOW           (EC_GROUP_CONDITIONS << 9) | 0x35\n#define EC_WORD_AWFUL         (EC_GROUP_CONDITIONS << 9) | 0x36\n#define EC_WORD_ALONE         (EC_GROUP_CONDITIONS << 9) | 0x37\n#define EC_WORD_BORED         (EC_GROUP_CONDITIONS << 9) | 0x38\n#define EC_WORD_SECRET        (EC_GROUP_CONDITIONS << 9) | 0x39\n#define EC_WORD_MYSTERY       (EC_GROUP_CONDITIONS << 9) | 0x3a\n#define EC_WORD_LACKS         (EC_GROUP_CONDITIONS << 9) | 0x3b\n#define EC_WORD_BEST          (EC_GROUP_CONDITIONS << 9) | 0x3c\n#define EC_WORD_LOUSY         (EC_GROUP_CONDITIONS << 9) | 0x3d\n#define EC_WORD_MISTAKE       (EC_GROUP_CONDITIONS << 9) | 0x3e\n#define EC_WORD_KIND          (EC_GROUP_CONDITIONS << 9) | 0x3f\n#define EC_WORD_WELL          (EC_GROUP_CONDITIONS << 9) | 0x40\n#define EC_WORD_WEAKENED      (EC_GROUP_CONDITIONS << 9) | 0x41\n#define EC_WORD_SIMPLE        (EC_GROUP_CONDITIONS << 9) | 0x42\n#define EC_WORD_SEEMS         (EC_GROUP_CONDITIONS << 9) | 0x43\n#define EC_WORD_BADLY         (EC_GROUP_CONDITIONS << 9) | 0x44\n\n// ACTIONS\n#define EC_WORD_MEETS      (EC_GROUP_ACTIONS << 9) | 0x0\n#define EC_WORD_CONCEDE    (EC_GROUP_ACTIONS << 9) | 0x1\n#define EC_WORD_GIVE       (EC_GROUP_ACTIONS << 9) | 0x2\n#define EC_WORD_GIVES      (EC_GROUP_ACTIONS << 9) | 0x3\n#define EC_WORD_PLAYED     (EC_GROUP_ACTIONS << 9) | 0x4\n#define EC_WORD_PLAYS      (EC_GROUP_ACTIONS << 9) | 0x5\n#define EC_WORD_COLLECT    (EC_GROUP_ACTIONS << 9) | 0x6\n#define EC_WORD_WALKING    (EC_GROUP_ACTIONS << 9) | 0x7\n#define EC_WORD_WALKS      (EC_GROUP_ACTIONS << 9) | 0x8\n#define EC_WORD_SAYS       (EC_GROUP_ACTIONS << 9) | 0x9\n#define EC_WORD_WENT       (EC_GROUP_ACTIONS << 9) | 0xa\n#define EC_WORD_SAID       (EC_GROUP_ACTIONS << 9) | 0xb\n#define EC_WORD_WAKE_UP    (EC_GROUP_ACTIONS << 9) | 0xc\n#define EC_WORD_WAKES_UP   (EC_GROUP_ACTIONS << 9) | 0xd\n#define EC_WORD_ANGERS     (EC_GROUP_ACTIONS << 9) | 0xe\n#define EC_WORD_TEACH      (EC_GROUP_ACTIONS << 9) | 0xf\n#define EC_WORD_TEACHES    (EC_GROUP_ACTIONS << 9) | 0x10\n#define EC_WORD_PLEASE     (EC_GROUP_ACTIONS << 9) | 0x11\n#define EC_WORD_LEARN      (EC_GROUP_ACTIONS << 9) | 0x12\n#define EC_WORD_CHANGE     (EC_GROUP_ACTIONS << 9) | 0x13\n#define EC_WORD_STORY      (EC_GROUP_ACTIONS << 9) | 0x14\n#define EC_WORD_TRUST      (EC_GROUP_ACTIONS << 9) | 0x15\n#define EC_WORD_LAVISH     (EC_GROUP_ACTIONS << 9) | 0x16\n#define EC_WORD_LISTENS    (EC_GROUP_ACTIONS << 9) | 0x17\n#define EC_WORD_HEARING    (EC_GROUP_ACTIONS << 9) | 0x18\n#define EC_WORD_TRAINS     (EC_GROUP_ACTIONS << 9) | 0x19\n#define EC_WORD_CHOOSE     (EC_GROUP_ACTIONS << 9) | 0x1a\n#define EC_WORD_COME       (EC_GROUP_ACTIONS << 9) | 0x1b\n#define EC_WORD_CAME       (EC_GROUP_ACTIONS << 9) | 0x1c\n#define EC_WORD_SEARCH     (EC_GROUP_ACTIONS << 9) | 0x1d\n#define EC_WORD_MAKE       (EC_GROUP_ACTIONS << 9) | 0x1e\n#define EC_WORD_CAUSE      (EC_GROUP_ACTIONS << 9) | 0x1f\n#define EC_WORD_KNOW       (EC_GROUP_ACTIONS << 9) | 0x20\n#define EC_WORD_KNOWS      (EC_GROUP_ACTIONS << 9) | 0x21\n#define EC_WORD_REFUSE     (EC_GROUP_ACTIONS << 9) | 0x22\n#define EC_WORD_STORES     (EC_GROUP_ACTIONS << 9) | 0x23\n#define EC_WORD_BRAG       (EC_GROUP_ACTIONS << 9) | 0x24\n#define EC_WORD_IGNORANT   (EC_GROUP_ACTIONS << 9) | 0x25\n#define EC_WORD_THINKS     (EC_GROUP_ACTIONS << 9) | 0x26\n#define EC_WORD_BELIEVE    (EC_GROUP_ACTIONS << 9) | 0x27\n#define EC_WORD_SLIDE      (EC_GROUP_ACTIONS << 9) | 0x28\n#define EC_WORD_EATS       (EC_GROUP_ACTIONS << 9) | 0x29\n#define EC_WORD_USE        (EC_GROUP_ACTIONS << 9) | 0x2a\n#define EC_WORD_USES       (EC_GROUP_ACTIONS << 9) | 0x2b\n#define EC_WORD_USING      (EC_GROUP_ACTIONS << 9) | 0x2c\n#define EC_WORD_COULDN_T   (EC_GROUP_ACTIONS << 9) | 0x2d\n#define EC_WORD_CAPABLE    (EC_GROUP_ACTIONS << 9) | 0x2e\n#define EC_WORD_DISAPPEAR  (EC_GROUP_ACTIONS << 9) | 0x2f\n#define EC_WORD_APPEAR     (EC_GROUP_ACTIONS << 9) | 0x30\n#define EC_WORD_THROW      (EC_GROUP_ACTIONS << 9) | 0x31\n#define EC_WORD_WORRY      (EC_GROUP_ACTIONS << 9) | 0x32\n#define EC_WORD_SLEPT      (EC_GROUP_ACTIONS << 9) | 0x33\n#define EC_WORD_SLEEP      (EC_GROUP_ACTIONS << 9) | 0x34\n#define EC_WORD_RELEASE    (EC_GROUP_ACTIONS << 9) | 0x35\n#define EC_WORD_DRINKS     (EC_GROUP_ACTIONS << 9) | 0x36\n#define EC_WORD_RUNS       (EC_GROUP_ACTIONS << 9) | 0x37\n#define EC_WORD_RUN        (EC_GROUP_ACTIONS << 9) | 0x38\n#define EC_WORD_WORKS      (EC_GROUP_ACTIONS << 9) | 0x39\n#define EC_WORD_WORKING    (EC_GROUP_ACTIONS << 9) | 0x3a\n#define EC_WORD_TALKING    (EC_GROUP_ACTIONS << 9) | 0x3b\n#define EC_WORD_TALK       (EC_GROUP_ACTIONS << 9) | 0x3c\n#define EC_WORD_SINK       (EC_GROUP_ACTIONS << 9) | 0x3d\n#define EC_WORD_SMACK      (EC_GROUP_ACTIONS << 9) | 0x3e\n#define EC_WORD_PRETEND    (EC_GROUP_ACTIONS << 9) | 0x3f\n#define EC_WORD_PRAISE     (EC_GROUP_ACTIONS << 9) | 0x40\n#define EC_WORD_OVERDO     (EC_GROUP_ACTIONS << 9) | 0x41\n#define EC_WORD_SHOW       (EC_GROUP_ACTIONS << 9) | 0x42\n#define EC_WORD_LOOKS      (EC_GROUP_ACTIONS << 9) | 0x43\n#define EC_WORD_SEES       (EC_GROUP_ACTIONS << 9) | 0x44\n#define EC_WORD_SEEK       (EC_GROUP_ACTIONS << 9) | 0x45\n#define EC_WORD_OWN        (EC_GROUP_ACTIONS << 9) | 0x46\n#define EC_WORD_TAKE       (EC_GROUP_ACTIONS << 9) | 0x47\n#define EC_WORD_ALLOW      (EC_GROUP_ACTIONS << 9) | 0x48\n#define EC_WORD_FORGET     (EC_GROUP_ACTIONS << 9) | 0x49\n#define EC_WORD_FORGETS    (EC_GROUP_ACTIONS << 9) | 0x4a\n#define EC_WORD_APPEARS    (EC_GROUP_ACTIONS << 9) | 0x4b\n#define EC_WORD_FAINT      (EC_GROUP_ACTIONS << 9) | 0x4c\n#define EC_WORD_FAINTED    (EC_GROUP_ACTIONS << 9) | 0x4d\n\n// LIFESTYLE\n#define EC_WORD_CHORES        (EC_GROUP_LIFESTYLE << 9) | 0x0\n#define EC_WORD_HOME          (EC_GROUP_LIFESTYLE << 9) | 0x1\n#define EC_WORD_MONEY         (EC_GROUP_LIFESTYLE << 9) | 0x2\n#define EC_WORD_ALLOWANCE     (EC_GROUP_LIFESTYLE << 9) | 0x3\n#define EC_WORD_BATH          (EC_GROUP_LIFESTYLE << 9) | 0x4\n#define EC_WORD_CONVERSATION  (EC_GROUP_LIFESTYLE << 9) | 0x5\n#define EC_WORD_SCHOOL        (EC_GROUP_LIFESTYLE << 9) | 0x6\n#define EC_WORD_COMMEMORATE   (EC_GROUP_LIFESTYLE << 9) | 0x7\n#define EC_WORD_HABIT         (EC_GROUP_LIFESTYLE << 9) | 0x8\n#define EC_WORD_GROUP         (EC_GROUP_LIFESTYLE << 9) | 0x9\n#define EC_WORD_WORD          (EC_GROUP_LIFESTYLE << 9) | 0xa\n#define EC_WORD_STORE         (EC_GROUP_LIFESTYLE << 9) | 0xb\n#define EC_WORD_SERVICE       (EC_GROUP_LIFESTYLE << 9) | 0xc\n#define EC_WORD_WORK          (EC_GROUP_LIFESTYLE << 9) | 0xd\n#define EC_WORD_SYSTEM        (EC_GROUP_LIFESTYLE << 9) | 0xe\n#define EC_WORD_TRAIN         (EC_GROUP_LIFESTYLE << 9) | 0xf\n#define EC_WORD_CLASS         (EC_GROUP_LIFESTYLE << 9) | 0x10\n#define EC_WORD_LESSONS       (EC_GROUP_LIFESTYLE << 9) | 0x11\n#define EC_WORD_INFORMATION   (EC_GROUP_LIFESTYLE << 9) | 0x12\n#define EC_WORD_LIVING        (EC_GROUP_LIFESTYLE << 9) | 0x13\n#define EC_WORD_TEACHER       (EC_GROUP_LIFESTYLE << 9) | 0x14\n#define EC_WORD_TOURNAMENT    (EC_GROUP_LIFESTYLE << 9) | 0x15\n#define EC_WORD_LETTER        (EC_GROUP_LIFESTYLE << 9) | 0x16\n#define EC_WORD_EVENT         (EC_GROUP_LIFESTYLE << 9) | 0x17\n#define EC_WORD_DIGITAL       (EC_GROUP_LIFESTYLE << 9) | 0x18\n#define EC_WORD_TEST          (EC_GROUP_LIFESTYLE << 9) | 0x19\n#define EC_WORD_DEPT_STORE    (EC_GROUP_LIFESTYLE << 9) | 0x1a\n#define EC_WORD_TELEVISION    (EC_GROUP_LIFESTYLE << 9) | 0x1b\n#define EC_WORD_PHONE         (EC_GROUP_LIFESTYLE << 9) | 0x1c\n#define EC_WORD_ITEM          (EC_GROUP_LIFESTYLE << 9) | 0x1d\n#define EC_WORD_NAME          (EC_GROUP_LIFESTYLE << 9) | 0x1e\n#define EC_WORD_NEWS          (EC_GROUP_LIFESTYLE << 9) | 0x1f\n#define EC_WORD_POPULAR       (EC_GROUP_LIFESTYLE << 9) | 0x20\n#define EC_WORD_PARTY         (EC_GROUP_LIFESTYLE << 9) | 0x21\n#define EC_WORD_STUDY         (EC_GROUP_LIFESTYLE << 9) | 0x22\n#define EC_WORD_MACHINE       (EC_GROUP_LIFESTYLE << 9) | 0x23\n#define EC_WORD_MAIL          (EC_GROUP_LIFESTYLE << 9) | 0x24\n#define EC_WORD_MESSAGE       (EC_GROUP_LIFESTYLE << 9) | 0x25\n#define EC_WORD_PROMISE       (EC_GROUP_LIFESTYLE << 9) | 0x26\n#define EC_WORD_DREAM         (EC_GROUP_LIFESTYLE << 9) | 0x27\n#define EC_WORD_KINDERGARTEN  (EC_GROUP_LIFESTYLE << 9) | 0x28\n#define EC_WORD_LIFE          (EC_GROUP_LIFESTYLE << 9) | 0x29\n#define EC_WORD_RADIO         (EC_GROUP_LIFESTYLE << 9) | 0x2a\n#define EC_WORD_RENTAL        (EC_GROUP_LIFESTYLE << 9) | 0x2b\n#define EC_WORD_WORLD         (EC_GROUP_LIFESTYLE << 9) | 0x2c\n\n// HOBBIES\n#define EC_WORD_IDOL          (EC_GROUP_HOBBIES << 9) | 0x0\n#define EC_WORD_ANIME         (EC_GROUP_HOBBIES << 9) | 0x1\n#define EC_WORD_SONG          (EC_GROUP_HOBBIES << 9) | 0x2\n#define EC_WORD_MOVIE         (EC_GROUP_HOBBIES << 9) | 0x3\n#define EC_WORD_SWEETS        (EC_GROUP_HOBBIES << 9) | 0x4\n#define EC_WORD_CHAT          (EC_GROUP_HOBBIES << 9) | 0x5\n#define EC_WORD_CHILD_S_PLAY  (EC_GROUP_HOBBIES << 9) | 0x6\n#define EC_WORD_TOYS          (EC_GROUP_HOBBIES << 9) | 0x7\n#define EC_WORD_MUSIC         (EC_GROUP_HOBBIES << 9) | 0x8\n#define EC_WORD_CARDS         (EC_GROUP_HOBBIES << 9) | 0x9\n#define EC_WORD_SHOPPING      (EC_GROUP_HOBBIES << 9) | 0xa\n#define EC_WORD_CAMERA        (EC_GROUP_HOBBIES << 9) | 0xb\n#define EC_WORD_VIEWING       (EC_GROUP_HOBBIES << 9) | 0xc\n#define EC_WORD_SPECTATOR     (EC_GROUP_HOBBIES << 9) | 0xd\n#define EC_WORD_GOURMET       (EC_GROUP_HOBBIES << 9) | 0xe\n#define EC_WORD_GAME          (EC_GROUP_HOBBIES << 9) | 0xf\n#define EC_WORD_RPG           (EC_GROUP_HOBBIES << 9) | 0x10\n#define EC_WORD_COLLECTION    (EC_GROUP_HOBBIES << 9) | 0x11\n#define EC_WORD_COMPLETE      (EC_GROUP_HOBBIES << 9) | 0x12\n#define EC_WORD_MAGAZINE      (EC_GROUP_HOBBIES << 9) | 0x13\n#define EC_WORD_WALK          (EC_GROUP_HOBBIES << 9) | 0x14\n#define EC_WORD_BIKE          (EC_GROUP_HOBBIES << 9) | 0x15\n#define EC_WORD_HOBBY         (EC_GROUP_HOBBIES << 9) | 0x16\n#define EC_WORD_SPORTS        (EC_GROUP_HOBBIES << 9) | 0x17\n#define EC_WORD_SOFTWARE      (EC_GROUP_HOBBIES << 9) | 0x18\n#define EC_WORD_SONGS         (EC_GROUP_HOBBIES << 9) | 0x19\n#define EC_WORD_DIET          (EC_GROUP_HOBBIES << 9) | 0x1a\n#define EC_WORD_TREASURE      (EC_GROUP_HOBBIES << 9) | 0x1b\n#define EC_WORD_TRAVEL        (EC_GROUP_HOBBIES << 9) | 0x1c\n#define EC_WORD_DANCE         (EC_GROUP_HOBBIES << 9) | 0x1d\n#define EC_WORD_CHANNEL       (EC_GROUP_HOBBIES << 9) | 0x1e\n#define EC_WORD_MAKING        (EC_GROUP_HOBBIES << 9) | 0x1f\n#define EC_WORD_FISHING       (EC_GROUP_HOBBIES << 9) | 0x20\n#define EC_WORD_DATE          (EC_GROUP_HOBBIES << 9) | 0x21\n#define EC_WORD_DESIGN        (EC_GROUP_HOBBIES << 9) | 0x22\n#define EC_WORD_LOCOMOTIVE    (EC_GROUP_HOBBIES << 9) | 0x23\n#define EC_WORD_PLUSH_DOLL    (EC_GROUP_HOBBIES << 9) | 0x24\n#define EC_WORD_PC            (EC_GROUP_HOBBIES << 9) | 0x25\n#define EC_WORD_FLOWERS       (EC_GROUP_HOBBIES << 9) | 0x26\n#define EC_WORD_HERO          (EC_GROUP_HOBBIES << 9) | 0x27\n#define EC_WORD_NAP           (EC_GROUP_HOBBIES << 9) | 0x28\n#define EC_WORD_HEROINE       (EC_GROUP_HOBBIES << 9) | 0x29\n#define EC_WORD_FASHION       (EC_GROUP_HOBBIES << 9) | 0x2a\n#define EC_WORD_ADVENTURE     (EC_GROUP_HOBBIES << 9) | 0x2b\n#define EC_WORD_BOARD         (EC_GROUP_HOBBIES << 9) | 0x2c\n#define EC_WORD_BALL          (EC_GROUP_HOBBIES << 9) | 0x2d\n#define EC_WORD_BOOK          (EC_GROUP_HOBBIES << 9) | 0x2e\n#define EC_WORD_FESTIVAL      (EC_GROUP_HOBBIES << 9) | 0x2f\n#define EC_WORD_COMICS        (EC_GROUP_HOBBIES << 9) | 0x30\n#define EC_WORD_HOLIDAY       (EC_GROUP_HOBBIES << 9) | 0x31\n#define EC_WORD_PLANS         (EC_GROUP_HOBBIES << 9) | 0x32\n#define EC_WORD_TRENDY        (EC_GROUP_HOBBIES << 9) | 0x33\n#define EC_WORD_VACATION      (EC_GROUP_HOBBIES << 9) | 0x34\n#define EC_WORD_LOOK          (EC_GROUP_HOBBIES << 9) | 0x35\n\n// TIME\n#define EC_WORD_FALL       (EC_GROUP_TIME << 9) | 0x0\n#define EC_WORD_MORNING    (EC_GROUP_TIME << 9) | 0x1\n#define EC_WORD_TOMORROW   (EC_GROUP_TIME << 9) | 0x2\n#define EC_WORD_LAST       (EC_GROUP_TIME << 9) | 0x3\n#define EC_WORD_DAY        (EC_GROUP_TIME << 9) | 0x4\n#define EC_WORD_SOMETIME   (EC_GROUP_TIME << 9) | 0x5\n#define EC_WORD_ALWAYS     (EC_GROUP_TIME << 9) | 0x6\n#define EC_WORD_CURRENT    (EC_GROUP_TIME << 9) | 0x7\n#define EC_WORD_FOREVER    (EC_GROUP_TIME << 9) | 0x8\n#define EC_WORD_DAYS       (EC_GROUP_TIME << 9) | 0x9\n#define EC_WORD_END        (EC_GROUP_TIME << 9) | 0xa\n#define EC_WORD_TUESDAY    (EC_GROUP_TIME << 9) | 0xb\n#define EC_WORD_YESTERDAY  (EC_GROUP_TIME << 9) | 0xc\n#define EC_WORD_TODAY      (EC_GROUP_TIME << 9) | 0xd\n#define EC_WORD_FRIDAY     (EC_GROUP_TIME << 9) | 0xe\n#define EC_WORD_MONDAY     (EC_GROUP_TIME << 9) | 0xf\n#define EC_WORD_LATER      (EC_GROUP_TIME << 9) | 0x10\n#define EC_WORD_EARLIER    (EC_GROUP_TIME << 9) | 0x11\n#define EC_WORD_ANOTHER    (EC_GROUP_TIME << 9) | 0x12\n#define EC_WORD_TIME       (EC_GROUP_TIME << 9) | 0x13\n#define EC_WORD_FINISH     (EC_GROUP_TIME << 9) | 0x14\n#define EC_WORD_WEDNESDAY  (EC_GROUP_TIME << 9) | 0x15\n#define EC_WORD_SOON       (EC_GROUP_TIME << 9) | 0x16\n#define EC_WORD_START      (EC_GROUP_TIME << 9) | 0x17\n#define EC_WORD_MONTH      (EC_GROUP_TIME << 9) | 0x18\n#define EC_WORD_STOP       (EC_GROUP_TIME << 9) | 0x19\n#define EC_WORD_NOW        (EC_GROUP_TIME << 9) | 0x1a\n#define EC_WORD_FINAL      (EC_GROUP_TIME << 9) | 0x1b\n#define EC_WORD_NEXT       (EC_GROUP_TIME << 9) | 0x1c\n#define EC_WORD_AGE        (EC_GROUP_TIME << 9) | 0x1d\n#define EC_WORD_SATURDAY   (EC_GROUP_TIME << 9) | 0x1e\n#define EC_WORD_SUMMER     (EC_GROUP_TIME << 9) | 0x1f\n#define EC_WORD_SUNDAY     (EC_GROUP_TIME << 9) | 0x20\n#define EC_WORD_BEGINNING  (EC_GROUP_TIME << 9) | 0x21\n#define EC_WORD_SPRING     (EC_GROUP_TIME << 9) | 0x22\n#define EC_WORD_DAYTIME    (EC_GROUP_TIME << 9) | 0x23\n#define EC_WORD_WINTER     (EC_GROUP_TIME << 9) | 0x24\n#define EC_WORD_DAILY      (EC_GROUP_TIME << 9) | 0x25\n#define EC_WORD_OLDEN      (EC_GROUP_TIME << 9) | 0x26\n#define EC_WORD_ALMOST     (EC_GROUP_TIME << 9) | 0x27\n#define EC_WORD_NEARLY     (EC_GROUP_TIME << 9) | 0x28\n#define EC_WORD_THURSDAY   (EC_GROUP_TIME << 9) | 0x29\n#define EC_WORD_NIGHTTIME  (EC_GROUP_TIME << 9) | 0x2a\n#define EC_WORD_NIGHT      (EC_GROUP_TIME << 9) | 0x2b\n#define EC_WORD_WEEK       (EC_GROUP_TIME << 9) | 0x2c\n\n// MISC\n#define EC_WORD_HIGHS            (EC_GROUP_MISC << 9) | 0x0\n#define EC_WORD_LOWS             (EC_GROUP_MISC << 9) | 0x1\n#define EC_WORD_UM               (EC_GROUP_MISC << 9) | 0x2\n#define EC_WORD_REAR             (EC_GROUP_MISC << 9) | 0x3\n#define EC_WORD_THINGS           (EC_GROUP_MISC << 9) | 0x4\n#define EC_WORD_THING            (EC_GROUP_MISC << 9) | 0x5\n#define EC_WORD_BELOW            (EC_GROUP_MISC << 9) | 0x6\n#define EC_WORD_ABOVE            (EC_GROUP_MISC << 9) | 0x7\n#define EC_WORD_BACK             (EC_GROUP_MISC << 9) | 0x8\n#define EC_WORD_HIGH             (EC_GROUP_MISC << 9) | 0x9\n#define EC_WORD_HERE             (EC_GROUP_MISC << 9) | 0xa\n#define EC_WORD_INSIDE           (EC_GROUP_MISC << 9) | 0xb\n#define EC_WORD_OUTSIDE          (EC_GROUP_MISC << 9) | 0xc\n#define EC_WORD_BESIDE           (EC_GROUP_MISC << 9) | 0xd\n#define EC_WORD_THIS_IS_IT_EXCL  (EC_GROUP_MISC << 9) | 0xe\n#define EC_WORD_THIS             (EC_GROUP_MISC << 9) | 0xf\n#define EC_WORD_EVERY            (EC_GROUP_MISC << 9) | 0x10\n#define EC_WORD_THESE            (EC_GROUP_MISC << 9) | 0x11\n#define EC_WORD_THESE_WERE       (EC_GROUP_MISC << 9) | 0x12\n#define EC_WORD_DOWN             (EC_GROUP_MISC << 9) | 0x13\n#define EC_WORD_THAT             (EC_GROUP_MISC << 9) | 0x14\n#define EC_WORD_THOSE_ARE        (EC_GROUP_MISC << 9) | 0x15\n#define EC_WORD_THOSE_WERE       (EC_GROUP_MISC << 9) | 0x16\n#define EC_WORD_THAT_S_IT_EXCL   (EC_GROUP_MISC << 9) | 0x17\n#define EC_WORD_AM               (EC_GROUP_MISC << 9) | 0x18\n#define EC_WORD_THAT_WAS         (EC_GROUP_MISC << 9) | 0x19\n#define EC_WORD_FRONT            (EC_GROUP_MISC << 9) | 0x1a\n#define EC_WORD_UP               (EC_GROUP_MISC << 9) | 0x1b\n#define EC_WORD_CHOICE           (EC_GROUP_MISC << 9) | 0x1c\n#define EC_WORD_FAR              (EC_GROUP_MISC << 9) | 0x1d\n#define EC_WORD_AWAY             (EC_GROUP_MISC << 9) | 0x1e\n#define EC_WORD_NEAR             (EC_GROUP_MISC << 9) | 0x1f\n#define EC_WORD_WHERE            (EC_GROUP_MISC << 9) | 0x20\n#define EC_WORD_WHEN             (EC_GROUP_MISC << 9) | 0x21\n#define EC_WORD_WHAT             (EC_GROUP_MISC << 9) | 0x22\n#define EC_WORD_DEEP             (EC_GROUP_MISC << 9) | 0x23\n#define EC_WORD_SHALLOW          (EC_GROUP_MISC << 9) | 0x24\n#define EC_WORD_WHY              (EC_GROUP_MISC << 9) | 0x25\n#define EC_WORD_CONFUSED         (EC_GROUP_MISC << 9) | 0x26\n#define EC_WORD_OPPOSITE         (EC_GROUP_MISC << 9) | 0x27\n#define EC_WORD_LEFT             (EC_GROUP_MISC << 9) | 0x28\n#define EC_WORD_RIGHT            (EC_GROUP_MISC << 9) | 0x29\n\n// ADJECTIVES\n#define EC_WORD_WANDERING     (EC_GROUP_ADJECTIVES << 9) | 0x0\n#define EC_WORD_RICKETY       (EC_GROUP_ADJECTIVES << 9) | 0x1\n#define EC_WORD_ROCK_SOLID    (EC_GROUP_ADJECTIVES << 9) | 0x2\n#define EC_WORD_HUNGRY        (EC_GROUP_ADJECTIVES << 9) | 0x3\n#define EC_WORD_TIGHT         (EC_GROUP_ADJECTIVES << 9) | 0x4\n#define EC_WORD_TICKLISH      (EC_GROUP_ADJECTIVES << 9) | 0x5\n#define EC_WORD_TWIRLING      (EC_GROUP_ADJECTIVES << 9) | 0x6\n#define EC_WORD_SPIRALING     (EC_GROUP_ADJECTIVES << 9) | 0x7\n#define EC_WORD_THIRSTY       (EC_GROUP_ADJECTIVES << 9) | 0x8\n#define EC_WORD_LOLLING       (EC_GROUP_ADJECTIVES << 9) | 0x9\n#define EC_WORD_SILKY         (EC_GROUP_ADJECTIVES << 9) | 0xa\n#define EC_WORD_SADLY         (EC_GROUP_ADJECTIVES << 9) | 0xb\n#define EC_WORD_HOPELESS      (EC_GROUP_ADJECTIVES << 9) | 0xc\n#define EC_WORD_USELESS       (EC_GROUP_ADJECTIVES << 9) | 0xd\n#define EC_WORD_DROOLING      (EC_GROUP_ADJECTIVES << 9) | 0xe\n#define EC_WORD_EXCITING      (EC_GROUP_ADJECTIVES << 9) | 0xf\n#define EC_WORD_THICK         (EC_GROUP_ADJECTIVES << 9) | 0x10\n#define EC_WORD_SMOOTH        (EC_GROUP_ADJECTIVES << 9) | 0x11\n#define EC_WORD_SLIMY         (EC_GROUP_ADJECTIVES << 9) | 0x12\n#define EC_WORD_THIN          (EC_GROUP_ADJECTIVES << 9) | 0x13\n#define EC_WORD_BREAK         (EC_GROUP_ADJECTIVES << 9) | 0x14\n#define EC_WORD_VORACIOUS     (EC_GROUP_ADJECTIVES << 9) | 0x15\n#define EC_WORD_SCATTER       (EC_GROUP_ADJECTIVES << 9) | 0x16\n#define EC_WORD_AWESOME       (EC_GROUP_ADJECTIVES << 9) | 0x17\n#define EC_WORD_WIMPY         (EC_GROUP_ADJECTIVES << 9) | 0x18\n#define EC_WORD_WOBBLY        (EC_GROUP_ADJECTIVES << 9) | 0x19\n#define EC_WORD_SHAKY         (EC_GROUP_ADJECTIVES << 9) | 0x1a\n#define EC_WORD_RIPPED        (EC_GROUP_ADJECTIVES << 9) | 0x1b\n#define EC_WORD_SHREDDED      (EC_GROUP_ADJECTIVES << 9) | 0x1c\n#define EC_WORD_INCREASING    (EC_GROUP_ADJECTIVES << 9) | 0x1d\n#define EC_WORD_YET           (EC_GROUP_ADJECTIVES << 9) | 0x1e\n#define EC_WORD_DESTROYED     (EC_GROUP_ADJECTIVES << 9) | 0x1f\n#define EC_WORD_FIERY         (EC_GROUP_ADJECTIVES << 9) | 0x20\n#define EC_WORD_LOVEY_DOVEY   (EC_GROUP_ADJECTIVES << 9) | 0x21\n#define EC_WORD_HAPPILY       (EC_GROUP_ADJECTIVES << 9) | 0x22\n#define EC_WORD_ANTICIPATION  (EC_GROUP_ADJECTIVES << 9) | 0x23\n\n// EVENTS\n#define EC_WORD_APPEAL        (EC_GROUP_EVENTS << 9) | 0x0\n#define EC_WORD_EVENTS        (EC_GROUP_EVENTS << 9) | 0x1\n#define EC_WORD_STAY_AT_HOME  (EC_GROUP_EVENTS << 9) | 0x2\n#define EC_WORD_BERRY         (EC_GROUP_EVENTS << 9) | 0x3\n#define EC_WORD_CONTEST       (EC_GROUP_EVENTS << 9) | 0x4\n#define EC_WORD_MC            (EC_GROUP_EVENTS << 9) | 0x5\n#define EC_WORD_JUDGE         (EC_GROUP_EVENTS << 9) | 0x6\n#define EC_WORD_SUPER         (EC_GROUP_EVENTS << 9) | 0x7\n#define EC_WORD_STAGE         (EC_GROUP_EVENTS << 9) | 0x8\n#define EC_WORD_HALL_OF_FAME  (EC_GROUP_EVENTS << 9) | 0x9\n#define EC_WORD_EVOLUTION     (EC_GROUP_EVENTS << 9) | 0xa\n#define EC_WORD_HYPER         (EC_GROUP_EVENTS << 9) | 0xb\n#define EC_WORD_BATTLE_TOWER  (EC_GROUP_EVENTS << 9) | 0xc\n#define EC_WORD_LEADERS       (EC_GROUP_EVENTS << 9) | 0xd\n#define EC_WORD_BATTLE_ROOM   (EC_GROUP_EVENTS << 9) | 0xe\n#define EC_WORD_HIDDEN        (EC_GROUP_EVENTS << 9) | 0xf\n#define EC_WORD_SECRET_BASE   (EC_GROUP_EVENTS << 9) | 0x10\n#define EC_WORD_BLEND         (EC_GROUP_EVENTS << 9) | 0x11\n#define EC_WORD_POKEBLOCK     (EC_GROUP_EVENTS << 9) | 0x12\n#define EC_WORD_MASTER        (EC_GROUP_EVENTS << 9) | 0x13\n#define EC_WORD_RANK          (EC_GROUP_EVENTS << 9) | 0x14\n#define EC_WORD_RIBBON        (EC_GROUP_EVENTS << 9) | 0x15\n#define EC_WORD_CRUSH         (EC_GROUP_EVENTS << 9) | 0x16\n#define EC_WORD_DIRECT        (EC_GROUP_EVENTS << 9) | 0x17\n#define EC_WORD_TOWER         (EC_GROUP_EVENTS << 9) | 0x18\n#define EC_WORD_UNION         (EC_GROUP_EVENTS << 9) | 0x19\n#define EC_WORD_ROOM          (EC_GROUP_EVENTS << 9) | 0x1a\n#define EC_WORD_WIRELESS      (EC_GROUP_EVENTS << 9) | 0x1b\n\n// TRENDY_SAYING\n#define EC_WORD_KTHX_BYE       (EC_GROUP_TRENDY_SAYING << 9) | 0x0\n#define EC_WORD_YES_SIR_EXCL   (EC_GROUP_TRENDY_SAYING << 9) | 0x1\n#define EC_WORD_AVANT_GARDE    (EC_GROUP_TRENDY_SAYING << 9) | 0x2\n#define EC_WORD_COUPLE         (EC_GROUP_TRENDY_SAYING << 9) | 0x3\n#define EC_WORD_MUCH_OBLIGED   (EC_GROUP_TRENDY_SAYING << 9) | 0x4\n#define EC_WORD_YEEHAW_EXCL    (EC_GROUP_TRENDY_SAYING << 9) | 0x5\n#define EC_WORD_MEGA           (EC_GROUP_TRENDY_SAYING << 9) | 0x6\n#define EC_WORD_1_HIT_KO_EXCL  (EC_GROUP_TRENDY_SAYING << 9) | 0x7\n#define EC_WORD_DESTINY        (EC_GROUP_TRENDY_SAYING << 9) | 0x8\n#define EC_WORD_CANCEL         (EC_GROUP_TRENDY_SAYING << 9) | 0x9\n#define EC_WORD_NEW            (EC_GROUP_TRENDY_SAYING << 9) | 0xa\n#define EC_WORD_FLATTEN        (EC_GROUP_TRENDY_SAYING << 9) | 0xb\n#define EC_WORD_KIDDING        (EC_GROUP_TRENDY_SAYING << 9) | 0xc\n#define EC_WORD_LOSER          (EC_GROUP_TRENDY_SAYING << 9) | 0xd\n#define EC_WORD_LOSING         (EC_GROUP_TRENDY_SAYING << 9) | 0xe\n#define EC_WORD_HAPPENING      (EC_GROUP_TRENDY_SAYING << 9) | 0xf\n#define EC_WORD_HIP_AND        (EC_GROUP_TRENDY_SAYING << 9) | 0x10\n#define EC_WORD_SHAKE          (EC_GROUP_TRENDY_SAYING << 9) | 0x11\n#define EC_WORD_SHADY          (EC_GROUP_TRENDY_SAYING << 9) | 0x12\n#define EC_WORD_UPBEAT         (EC_GROUP_TRENDY_SAYING << 9) | 0x13\n#define EC_WORD_MODERN         (EC_GROUP_TRENDY_SAYING << 9) | 0x14\n#define EC_WORD_SMELL_YA       (EC_GROUP_TRENDY_SAYING << 9) | 0x15\n#define EC_WORD_BANG           (EC_GROUP_TRENDY_SAYING << 9) | 0x16\n#define EC_WORD_KNOCKOUT       (EC_GROUP_TRENDY_SAYING << 9) | 0x17\n#define EC_WORD_HASSLE         (EC_GROUP_TRENDY_SAYING << 9) | 0x18\n#define EC_WORD_WINNER         (EC_GROUP_TRENDY_SAYING << 9) | 0x19\n#define EC_WORD_FEVER          (EC_GROUP_TRENDY_SAYING << 9) | 0x1a\n#define EC_WORD_WANNABE        (EC_GROUP_TRENDY_SAYING << 9) | 0x1b\n#define EC_WORD_BABY           (EC_GROUP_TRENDY_SAYING << 9) | 0x1c\n#define EC_WORD_HEART          (EC_GROUP_TRENDY_SAYING << 9) | 0x1d\n#define EC_WORD_OLD            (EC_GROUP_TRENDY_SAYING << 9) | 0x1e\n#define EC_WORD_YOUNG          (EC_GROUP_TRENDY_SAYING << 9) | 0x1f\n#define EC_WORD_UGLY           (EC_GROUP_TRENDY_SAYING << 9) | 0x20\n#define NUM_ADDITIONAL_PHRASES  33\n\n#define EC_POKEMON(mon) ((EC_GROUP_POKEMON << 9) | SPECIES_##mon)\n#define EC_POKEMON2(mon) ((EC_GROUP_POKEMON_2 << 9) | SPECIES_##mon)\n#define EC_MOVE(move) ((EC_GROUP_MOVE_1 << 9) | MOVE_##move)\n#define EC_MOVE2(move) ((EC_GROUP_MOVE_2 << 9) | MOVE_##move)\n\n#define EC_GROUP(word) ((word) >> 9)\n#define EC_INDEX(word) ((word) & 0x1FF)\n#define EC_WORD(groupId, index) ((((groupId) & 0x7F) << 9) | ((index) & 0x1FF))\n\n#define EC_WORD_UNDEFINED (0xFFFF)\n\n#endif  // GUARD_CONSTANTS_EASY_CHAT_H\n"
  },
  {
    "path": "include/constants/event_bg.h",
    "content": "#ifndef GUARD_CONSTANTS_EVENT_BG_H\n#define GUARD_CONSTANTS_EVENT_BG_H\n\n#define BG_EVENT_PLAYER_FACING_ANY   0\n#define BG_EVENT_PLAYER_FACING_NORTH 1\n#define BG_EVENT_PLAYER_FACING_SOUTH 2\n#define BG_EVENT_PLAYER_FACING_EAST  3\n#define BG_EVENT_PLAYER_FACING_WEST  4\n\n#define BG_EVENT_HIDDEN_ITEM         7\n#define BG_EVENT_SECRET_BASE         8\n\n#endif // GUARD_CONSTANTS_EVENT_BG_H\n"
  },
  {
    "path": "include/constants/event_object_movement.h",
    "content": "#ifndef GUARD_CONSTANTS_EVENT_OBJECT_MOVEMENT_H\n#define GUARD_CONSTANTS_EVENT_OBJECT_MOVEMENT_H\n\n// FIXME: Different in FRLG\n#define MOVEMENT_TYPE_NONE                             0x0\n#define MOVEMENT_TYPE_LOOK_AROUND                      0x1\n#define MOVEMENT_TYPE_WANDER_AROUND                    0x2\n#define MOVEMENT_TYPE_WANDER_UP_AND_DOWN               0x3\n#define MOVEMENT_TYPE_WANDER_DOWN_AND_UP               0x4\n#define MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT            0x5\n#define MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT            0x6\n#define MOVEMENT_TYPE_FACE_UP                          0x7\n#define MOVEMENT_TYPE_FACE_DOWN                        0x8\n#define MOVEMENT_TYPE_FACE_LEFT                        0x9\n#define MOVEMENT_TYPE_FACE_RIGHT                       0xA\n#define MOVEMENT_TYPE_PLAYER                           0xB\n#define MOVEMENT_TYPE_BERRY_TREE_GROWTH                0xC\n#define MOVEMENT_TYPE_FACE_DOWN_AND_UP                 0xD\n#define MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT              0xE\n#define MOVEMENT_TYPE_FACE_UP_AND_LEFT                 0xF\n#define MOVEMENT_TYPE_FACE_UP_AND_RIGHT                0x10\n#define MOVEMENT_TYPE_FACE_DOWN_AND_LEFT               0x11\n#define MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT              0x12\n#define MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT            0x13\n#define MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT           0x14\n#define MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT           0x15\n#define MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT         0x16\n#define MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE          0x17\n#define MOVEMENT_TYPE_ROTATE_CLOCKWISE                 0x18\n#define MOVEMENT_TYPE_WALK_UP_AND_DOWN                 0x19\n#define MOVEMENT_TYPE_WALK_DOWN_AND_UP                 0x1A\n#define MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT              0x1B\n#define MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT              0x1C\n#define MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN 0x1D\n#define MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP 0x1E\n#define MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT 0x1F\n#define MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT 0x20\n#define MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN 0x21\n#define MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP 0x22\n#define MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT 0x23\n#define MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT 0x24\n#define MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT 0x25\n#define MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT 0x26\n#define MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN 0x27\n#define MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP 0x28\n#define MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT 0x29\n#define MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT 0x2A\n#define MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN 0x2B\n#define MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP 0x2C\n#define MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT 0x2D\n#define MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT 0x2E\n#define MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP 0x2F\n#define MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN 0x30\n#define MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT 0x31\n#define MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT 0x32\n#define MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN 0x33\n#define MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP 0x34\n#define MOVEMENT_TYPE_COPY_PLAYER                      0x35\n#define MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE             0x36\n#define MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE     0x37\n#define MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE            0x38\n#define MOVEMENT_TYPE_TREE_DISGUISE                    0x39\n#define MOVEMENT_TYPE_MOUNTAIN_DISGUISE                0x3A\n#define MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS             0x3B\n#define MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS    0x3C\n#define MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS 0x3D\n#define MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS   0x3E\n#define MOVEMENT_TYPE_BURIED                           0x3F\n#define MOVEMENT_TYPE_WALK_IN_PLACE_DOWN               0x40\n#define MOVEMENT_TYPE_WALK_IN_PLACE_UP                 0x41\n#define MOVEMENT_TYPE_WALK_IN_PLACE_LEFT               0x42\n#define MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT              0x43\n#define MOVEMENT_TYPE_WALK_IN_PLACE_FAST_DOWN          0x44\n#define MOVEMENT_TYPE_WALK_IN_PLACE_FAST_UP            0x45\n#define MOVEMENT_TYPE_WALK_IN_PLACE_FAST_LEFT          0x46\n#define MOVEMENT_TYPE_WALK_IN_PLACE_FAST_RIGHT         0x47\n#define MOVEMENT_TYPE_JOG_IN_PLACE_DOWN                0x48\n#define MOVEMENT_TYPE_JOG_IN_PLACE_UP                  0x49\n#define MOVEMENT_TYPE_JOG_IN_PLACE_LEFT                0x4A\n#define MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT               0x4B\n#define MOVEMENT_TYPE_INVISIBLE                        0x4C\n#define MOVEMENT_TYPE_RAISE_HAND_AND_STOP              0x4D\n#define MOVEMENT_TYPE_RAISE_HAND_AND_JUMP              0x4E\n#define MOVEMENT_TYPE_RAISE_HAND_AND_SWIM              0x4F\n#define MOVEMENT_TYPE_WANDER_AROUND_SLOWER             0x50\n#define MOVEMENT_TYPES_COUNT                           0x51\n\n#define MOVEMENT_ACTION_FACE_DOWN                       0x0\n#define MOVEMENT_ACTION_FACE_UP                         0x1\n#define MOVEMENT_ACTION_FACE_LEFT                       0x2\n#define MOVEMENT_ACTION_FACE_RIGHT                      0x3\n#define MOVEMENT_ACTION_FACE_DOWN_FAST                  0x4\n#define MOVEMENT_ACTION_FACE_UP_FAST                    0x5\n#define MOVEMENT_ACTION_FACE_LEFT_FAST                  0x6\n#define MOVEMENT_ACTION_FACE_RIGHT_FAST                 0x7\n#define MOVEMENT_ACTION_WALK_SLOWER_DOWN                0x8\n#define MOVEMENT_ACTION_WALK_SLOWER_UP                  0x9\n#define MOVEMENT_ACTION_WALK_SLOWER_LEFT                0xA\n#define MOVEMENT_ACTION_WALK_SLOWER_RIGHT               0xB\n#define MOVEMENT_ACTION_WALK_SLOW_DOWN                  0xC\n#define MOVEMENT_ACTION_WALK_SLOW_UP                    0xD\n#define MOVEMENT_ACTION_WALK_SLOW_LEFT                  0xE\n#define MOVEMENT_ACTION_WALK_SLOW_RIGHT                 0xF\n#define MOVEMENT_ACTION_WALK_NORMAL_DOWN                0x10\n#define MOVEMENT_ACTION_WALK_NORMAL_UP                  0x11\n#define MOVEMENT_ACTION_WALK_NORMAL_LEFT                0x12\n#define MOVEMENT_ACTION_WALK_NORMAL_RIGHT               0x13\n#define MOVEMENT_ACTION_JUMP_2_DOWN                     0x14\n#define MOVEMENT_ACTION_JUMP_2_UP                       0x15\n#define MOVEMENT_ACTION_JUMP_2_LEFT                     0x16\n#define MOVEMENT_ACTION_JUMP_2_RIGHT                    0x17\n#define MOVEMENT_ACTION_DELAY_1                         0x18\n#define MOVEMENT_ACTION_DELAY_2                         0x19\n#define MOVEMENT_ACTION_DELAY_4                         0x1A\n#define MOVEMENT_ACTION_DELAY_8                         0x1B\n#define MOVEMENT_ACTION_DELAY_16                        0x1C\n#define MOVEMENT_ACTION_WALK_FAST_DOWN                  0x1D\n#define MOVEMENT_ACTION_WALK_FAST_UP                    0x1E\n#define MOVEMENT_ACTION_WALK_FAST_LEFT                  0x1F\n#define MOVEMENT_ACTION_WALK_FAST_RIGHT                 0x20\n#define MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN         0x21\n#define MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP           0x22\n#define MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT         0x23\n#define MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT        0x24\n#define MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN       0x25\n#define MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP         0x26\n#define MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT       0x27\n#define MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT      0x28\n#define MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN         0x29\n#define MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP           0x2A\n#define MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT         0x2B\n#define MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT        0x2C\n#define MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN       0x2D\n#define MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_UP         0x2E\n#define MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT       0x2F\n#define MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT      0x30\n#define MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN         0x31\n#define MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP           0x32\n#define MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT         0x33\n#define MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT        0x34\n#define MOVEMENT_ACTION_WALK_FASTER_DOWN                0x35\n#define MOVEMENT_ACTION_WALK_FASTER_UP                  0x36\n#define MOVEMENT_ACTION_WALK_FASTER_LEFT                0x37\n#define MOVEMENT_ACTION_WALK_FASTER_RIGHT               0x38\n#define MOVEMENT_ACTION_SLIDE_DOWN                      0x39\n#define MOVEMENT_ACTION_SLIDE_UP                        0x3A\n#define MOVEMENT_ACTION_SLIDE_LEFT                      0x3B\n#define MOVEMENT_ACTION_SLIDE_RIGHT                     0x3C\n#define MOVEMENT_ACTION_PLAYER_RUN_DOWN                 0x3D\n#define MOVEMENT_ACTION_PLAYER_RUN_UP                   0x3E\n#define MOVEMENT_ACTION_PLAYER_RUN_LEFT                 0x3F\n#define MOVEMENT_ACTION_PLAYER_RUN_RIGHT                0x40\n#define MOVEMENT_ACTION_PLAYER_RUN_DOWN_SLOW            0x41\n#define MOVEMENT_ACTION_PLAYER_RUN_UP_SLOW              0x42\n#define MOVEMENT_ACTION_PLAYER_RUN_LEFT_SLOW            0x43\n#define MOVEMENT_ACTION_PLAYER_RUN_RIGHT_SLOW           0x44\n#define MOVEMENT_ACTION_START_ANIM_IN_DIRECTION         0x45\n#define MOVEMENT_ACTION_JUMP_SPECIAL_DOWN               0x46\n#define MOVEMENT_ACTION_JUMP_SPECIAL_UP                 0x47\n#define MOVEMENT_ACTION_JUMP_SPECIAL_LEFT               0x48\n#define MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT              0x49\n#define MOVEMENT_ACTION_FACE_PLAYER                     0x4A\n#define MOVEMENT_ACTION_FACE_AWAY_PLAYER                0x4B\n#define MOVEMENT_ACTION_LOCK_FACING_DIRECTION           0x4C\n#define MOVEMENT_ACTION_UNLOCK_FACING_DIRECTION         0x4D\n#define MOVEMENT_ACTION_JUMP_DOWN                       0x4E\n#define MOVEMENT_ACTION_JUMP_UP                         0x4F\n#define MOVEMENT_ACTION_JUMP_LEFT                       0x50\n#define MOVEMENT_ACTION_JUMP_RIGHT                      0x51\n#define MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN              0x52\n#define MOVEMENT_ACTION_JUMP_IN_PLACE_UP                0x53\n#define MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT              0x54\n#define MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT             0x55\n#define MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP           0x56\n#define MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN           0x57\n#define MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT        0x58\n#define MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT        0x59\n#define MOVEMENT_ACTION_FACE_ORIGINAL_DIRECTION         0x5A\n#define MOVEMENT_ACTION_NURSE_JOY_BOW_DOWN              0x5B\n#define MOVEMENT_ACTION_ENABLE_JUMP_LANDING_GROUND_EFFECT 0x5C\n#define MOVEMENT_ACTION_DISABLE_JUMP_LANDING_GROUND_EFFECT 0x5D\n#define MOVEMENT_ACTION_DISABLE_ANIMATION               0x5E\n#define MOVEMENT_ACTION_RESTORE_ANIMATION               0x5F\n#define MOVEMENT_ACTION_SET_INVISIBLE                   0x60\n#define MOVEMENT_ACTION_SET_VISIBLE                     0x61\n#define MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK          0x62\n#define MOVEMENT_ACTION_EMOTE_QUESTION_MARK             0x63\n#define MOVEMENT_ACTION_EMOTE_X                         0x64\n#define MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK          0x65\n#define MOVEMENT_ACTION_EMOTE_SMILE                     0x66\n#define MOVEMENT_ACTION_REVEAL_TRAINER                  0x67\n#define MOVEMENT_ACTION_ROCK_SMASH_BREAK                0x68\n#define MOVEMENT_ACTION_CUT_TREE                        0x69\n#define MOVEMENT_ACTION_SET_FIXED_PRIORITY              0x6A\n#define MOVEMENT_ACTION_CLEAR_FIXED_PRIORITY            0x6B\n#define MOVEMENT_ACTION_INIT_AFFINE_ANIM                0x6C\n#define MOVEMENT_ACTION_CLEAR_AFFINE_ANIM               0x6D\n\n// These still exist in FRLG for some reason. They're not used by anything obvious.\n#define MOVEMENT_ACTION_WALK_DOWN_START_AFFINE          0x6E\n#define MOVEMENT_ACTION_WALK_DOWN_AFFINE                0x6F\n#define MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN          0x70\n#define MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP            0x71\n#define MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT          0x72\n#define MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT         0x73\n#define MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN           0x74\n#define MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP             0x75\n#define MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT           0x76\n#define MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT          0x77\n#define MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN      0x78\n#define MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP        0x79\n#define MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT      0x7A\n#define MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT     0x7B\n#define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN      0x7C\n#define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP        0x7D\n#define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT      0x7E\n#define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT     0x7F\n#define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN           0x80\n#define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP             0x81\n#define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT           0x82\n#define MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT          0x83\n#define MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN          0x84\n#define MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP            0x85\n#define MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT          0x86\n#define MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT         0x87\n#define MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN      0x88\n#define MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP        0x89\n#define MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT      0x8A\n#define MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT     0x8B\n#define MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN      0x8C\n#define MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP        0x8D\n#define MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT      0x8E\n#define MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT     0x8F\n#define MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN          0x90\n#define MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP            0x91\n#define MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT          0x92\n#define MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT         0x93\n\n#define MOVEMENT_ACTION_SPIN_DOWN                       0x94\n#define MOVEMENT_ACTION_SPIN_UP                         0x95\n#define MOVEMENT_ACTION_SPIN_LEFT                       0x96\n#define MOVEMENT_ACTION_SPIN_RIGHT                      0x97\n#define MOVEMENT_ACTION_RAISE_HAND_AND_STOP             0x98\n#define MOVEMENT_ACTION_RAISE_HAND_AND_JUMP             0x99\n#define MOVEMENT_ACTION_RAISE_HAND_AND_SWIM             0x9A\n#define MOVEMENT_ACTION_WALK_SLOWEST_DOWN               0x9B\n#define MOVEMENT_ACTION_WALK_SLOWEST_UP                 0x9C\n#define MOVEMENT_ACTION_WALK_SLOWEST_LEFT               0x9D\n#define MOVEMENT_ACTION_WALK_SLOWEST_RIGHT              0x9E\n#define MOVEMENT_ACTION_SHAKE_HEAD_OR_WALK_IN_PLACE     0x9F\n#define MOVEMENT_ACTION_GLIDE_DOWN                      0xA0\n#define MOVEMENT_ACTION_GLIDE_UP                        0xA1\n#define MOVEMENT_ACTION_GLIDE_LEFT                      0xA2\n#define MOVEMENT_ACTION_GLIDE_RIGHT                     0xA3\n#define MOVEMENT_ACTION_FLY_UP                          0xA4\n#define MOVEMENT_ACTION_FLY_DOWN                        0xA5\n#define MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_DOWN   0xA6\n#define MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_UP     0xA7\n#define MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_LEFT   0xA8\n#define MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_RIGHT  0xA9\n\n#define MOVEMENT_ACTION_STEP_END 0xFE\n#define MOVEMENT_ACTION_NONE     0xFF\n\n#define ANIM_STD_FACE_SOUTH       0\n#define ANIM_STD_FACE_NORTH       1\n#define ANIM_STD_FACE_WEST        2\n#define ANIM_STD_FACE_EAST        3\n#define ANIM_STD_GO_SOUTH         4\n#define ANIM_STD_GO_NORTH         5\n#define ANIM_STD_GO_WEST          6\n#define ANIM_STD_GO_EAST          7\n#define ANIM_STD_GO_FAST_SOUTH    8\n#define ANIM_STD_GO_FAST_NORTH    9\n#define ANIM_STD_GO_FAST_WEST     10\n#define ANIM_STD_GO_FAST_EAST     11\n#define ANIM_STD_GO_FASTER_SOUTH  12\n#define ANIM_STD_GO_FASTER_NORTH  13\n#define ANIM_STD_GO_FASTER_WEST   14\n#define ANIM_STD_GO_FASTER_EAST   15\n#define ANIM_STD_GO_FASTEST_SOUTH 16\n#define ANIM_STD_GO_FASTEST_NORTH 17\n#define ANIM_STD_GO_FASTEST_WEST  18\n#define ANIM_STD_GO_FASTEST_EAST  19\n#define ANIM_STD_COUNT            20\n\n#define ANIM_RUN_SOUTH                   (ANIM_STD_COUNT + 0)\n#define ANIM_RUN_NORTH                   (ANIM_STD_COUNT + 1)\n#define ANIM_RUN_WEST                    (ANIM_STD_COUNT + 2)\n#define ANIM_RUN_EAST                    (ANIM_STD_COUNT + 3)\n#define ANIM_SPIN_SOUTH                  (ANIM_STD_COUNT + 4)\n#define ANIM_SPIN_NORTH                  (ANIM_STD_COUNT + 5)\n#define ANIM_SPIN_WEST                   (ANIM_STD_COUNT + 6)\n#define ANIM_SPIN_EAST                   (ANIM_STD_COUNT + 7)\n#define ANIM_SHAKE_HEAD_OR_WALK_IN_PLACE (ANIM_STD_COUNT + 8)\n\n#define ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH         (ANIM_STD_COUNT + 0)\n#define ANIM_BUNNY_HOP_BACK_WHEEL_NORTH         (ANIM_STD_COUNT + 1)\n#define ANIM_BUNNY_HOP_BACK_WHEEL_WEST          (ANIM_STD_COUNT + 2)\n#define ANIM_BUNNY_HOP_BACK_WHEEL_EAST          (ANIM_STD_COUNT + 3)\n#define ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH        (ANIM_STD_COUNT + 4)\n#define ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH        (ANIM_STD_COUNT + 5)\n#define ANIM_BUNNY_HOP_FRONT_WHEEL_WEST         (ANIM_STD_COUNT + 6)\n#define ANIM_BUNNY_HOP_FRONT_WHEEL_EAST         (ANIM_STD_COUNT + 7)\n#define ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH  (ANIM_STD_COUNT + 8)\n#define ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH  (ANIM_STD_COUNT + 9)\n#define ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST   (ANIM_STD_COUNT + 10)\n#define ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST   (ANIM_STD_COUNT + 11)\n#define ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH (ANIM_STD_COUNT + 12)\n#define ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH (ANIM_STD_COUNT + 13)\n#define ANIM_STANDING_WHEELIE_FRONT_WHEEL_WEST  (ANIM_STD_COUNT + 14)\n#define ANIM_STANDING_WHEELIE_FRONT_WHEEL_EAST  (ANIM_STD_COUNT + 15)\n#define ANIM_MOVING_WHEELIE_SOUTH               (ANIM_STD_COUNT + 16)\n#define ANIM_MOVING_WHEELIE_NORTH               (ANIM_STD_COUNT + 17)\n#define ANIM_MOVING_WHEELIE_WEST                (ANIM_STD_COUNT + 18)\n#define ANIM_MOVING_WHEELIE_EAST                (ANIM_STD_COUNT + 19)\n\n#define ANIM_GET_ON_OFF_POKEMON_SOUTH (ANIM_STD_COUNT + 0)\n#define ANIM_GET_ON_OFF_POKEMON_NORTH (ANIM_STD_COUNT + 1)\n#define ANIM_GET_ON_OFF_POKEMON_WEST  (ANIM_STD_COUNT + 2)\n#define ANIM_GET_ON_OFF_POKEMON_EAST  (ANIM_STD_COUNT + 3)\n\n#define ANIM_NURSE_BOW (ANIM_STD_COUNT + 0)\n\n#define ANIM_RAISE_HAND (ANIM_STD_COUNT + 0)\n\n#define ANIM_FIELD_MOVE 0\n\n#define ANIM_VS_SEEKER  0\n\n#define ANIM_STAY_STILL      0\n#define ANIM_REMOVE_OBSTACLE 1\n\n#define ANIM_TAKE_OUT_ROD_SOUTH   0\n#define ANIM_TAKE_OUT_ROD_NORTH   1\n#define ANIM_TAKE_OUT_ROD_WEST    2\n#define ANIM_TAKE_OUT_ROD_EAST    3\n#define ANIM_PUT_AWAY_ROD_SOUTH   4\n#define ANIM_PUT_AWAY_ROD_NORTH   5\n#define ANIM_PUT_AWAY_ROD_WEST    6\n#define ANIM_PUT_AWAY_ROD_EAST    7\n#define ANIM_HOOKED_POKEMON_SOUTH 8\n#define ANIM_HOOKED_POKEMON_NORTH 9\n#define ANIM_HOOKED_POKEMON_WEST  10\n#define ANIM_HOOKED_POKEMON_EAST  11\n\n#endif // GUARD_CONSTANTS_EVENT_OBJECT_MOVEMENT_H\n"
  },
  {
    "path": "include/constants/event_objects.h",
    "content": "#ifndef GUARD_CONSTANTS_EVENT_OBJECTS_H\n#define GUARD_CONSTANTS_EVENT_OBJECTS_H\n\n#define OBJ_EVENT_GFX_RED_NORMAL 0\n#define OBJ_EVENT_GFX_RED_BIKE 1\n#define OBJ_EVENT_GFX_RED_SURF 2\n#define OBJ_EVENT_GFX_RED_FIELD_MOVE 3\n#define OBJ_EVENT_GFX_RED_FISH 4\n#define OBJ_EVENT_GFX_RED_VS_SEEKER 5\n#define OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE 6\n#define OBJ_EVENT_GFX_GREEN_NORMAL 7\n#define OBJ_EVENT_GFX_GREEN_BIKE 8\n#define OBJ_EVENT_GFX_GREEN_SURF 9\n#define OBJ_EVENT_GFX_GREEN_FIELD_MOVE 10\n#define OBJ_EVENT_GFX_GREEN_FISH 11\n#define OBJ_EVENT_GFX_GREEN_VS_SEEKER 12\n#define OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE 13\n#define OBJ_EVENT_GFX_RS_BRENDAN 14\n#define OBJ_EVENT_GFX_RS_MAY 15\n#define OBJ_EVENT_GFX_LITTLE_BOY 16\n#define OBJ_EVENT_GFX_LITTLE_GIRL 17\n#define OBJ_EVENT_GFX_YOUNGSTER 18\n#define OBJ_EVENT_GFX_BOY 19\n#define OBJ_EVENT_GFX_BUG_CATCHER 20\n#define OBJ_EVENT_GFX_SITTING_BOY 21\n#define OBJ_EVENT_GFX_LASS 22\n#define OBJ_EVENT_GFX_WOMAN_1 23\n#define OBJ_EVENT_GFX_BATTLE_GIRL 24\n#define OBJ_EVENT_GFX_MAN 25\n#define OBJ_EVENT_GFX_ROCKER 26\n#define OBJ_EVENT_GFX_FAT_MAN 27\n#define OBJ_EVENT_GFX_WOMAN_2 28\n#define OBJ_EVENT_GFX_BEAUTY 29\n#define OBJ_EVENT_GFX_BALDING_MAN 30\n#define OBJ_EVENT_GFX_WOMAN_3 31\n#define OBJ_EVENT_GFX_OLD_MAN_1 32\n#define OBJ_EVENT_GFX_OLD_MAN_2 33\n#define OBJ_EVENT_GFX_OLD_MAN_LYING_DOWN 34\n#define OBJ_EVENT_GFX_OLD_WOMAN 35\n#define OBJ_EVENT_GFX_TUBER_M_WATER 36\n#define OBJ_EVENT_GFX_TUBER_F 37\n#define OBJ_EVENT_GFX_TUBER_M_LAND 38\n#define OBJ_EVENT_GFX_CAMPER 39\n#define OBJ_EVENT_GFX_PICNICKER 40\n#define OBJ_EVENT_GFX_COOLTRAINER_M 41\n#define OBJ_EVENT_GFX_COOLTRAINER_F 42\n#define OBJ_EVENT_GFX_SWIMMER_M_WATER 43\n#define OBJ_EVENT_GFX_SWIMMER_F_WATER 44\n#define OBJ_EVENT_GFX_SWIMMER_M_LAND 45\n#define OBJ_EVENT_GFX_SWIMMER_F_LAND 46\n#define OBJ_EVENT_GFX_WORKER_M 47\n#define OBJ_EVENT_GFX_WORKER_F 48\n#define OBJ_EVENT_GFX_ROCKET_M 49\n#define OBJ_EVENT_GFX_ROCKET_F 50\n#define OBJ_EVENT_GFX_GBA_KID 51\n#define OBJ_EVENT_GFX_SUPER_NERD 52\n#define OBJ_EVENT_GFX_BIKER 53\n#define OBJ_EVENT_GFX_BLACKBELT 54\n#define OBJ_EVENT_GFX_SCIENTIST 55\n#define OBJ_EVENT_GFX_HIKER 56\n#define OBJ_EVENT_GFX_FISHER 57\n#define OBJ_EVENT_GFX_CHANNELER 58\n#define OBJ_EVENT_GFX_CHEF 59\n#define OBJ_EVENT_GFX_POLICEMAN 60\n#define OBJ_EVENT_GFX_GENTLEMAN 61\n#define OBJ_EVENT_GFX_SAILOR 62\n#define OBJ_EVENT_GFX_CAPTAIN 63\n#define OBJ_EVENT_GFX_NURSE 64\n#define OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST 65\n#define OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST 66\n#define OBJ_EVENT_GFX_UNUSED_MALE_RECEPTIONIST 67\n#define OBJ_EVENT_GFX_CLERK 68\n#define OBJ_EVENT_GFX_MG_DELIVERYMAN 69\n#define OBJ_EVENT_GFX_TRAINER_TOWER_DUDE 70\n#define OBJ_EVENT_GFX_PROF_OAK 71\n#define OBJ_EVENT_GFX_BLUE 72\n#define OBJ_EVENT_GFX_BILL 73\n#define OBJ_EVENT_GFX_LANCE 74\n#define OBJ_EVENT_GFX_AGATHA 75\n#define OBJ_EVENT_GFX_DAISY 76\n#define OBJ_EVENT_GFX_LORELEI 77\n#define OBJ_EVENT_GFX_MR_FUJI 78\n#define OBJ_EVENT_GFX_BRUNO 79\n#define OBJ_EVENT_GFX_BROCK 80\n#define OBJ_EVENT_GFX_MISTY 81\n#define OBJ_EVENT_GFX_LT_SURGE 82\n#define OBJ_EVENT_GFX_ERIKA 83\n#define OBJ_EVENT_GFX_KOGA 84\n#define OBJ_EVENT_GFX_SABRINA 85\n#define OBJ_EVENT_GFX_BLAINE 86\n#define OBJ_EVENT_GFX_GIOVANNI 87\n#define OBJ_EVENT_GFX_MOM 88\n#define OBJ_EVENT_GFX_CELIO 89\n#define OBJ_EVENT_GFX_TEACHY_TV_HOST 90\n#define OBJ_EVENT_GFX_GYM_GUY 91\n#define OBJ_EVENT_GFX_ITEM_BALL 92\n#define OBJ_EVENT_GFX_TOWN_MAP 93\n#define OBJ_EVENT_GFX_POKEDEX 94\n#define OBJ_EVENT_GFX_CUT_TREE 95\n#define OBJ_EVENT_GFX_ROCK_SMASH_ROCK 96\n#define OBJ_EVENT_GFX_PUSHABLE_BOULDER 97\n#define OBJ_EVENT_GFX_FOSSIL 98\n#define OBJ_EVENT_GFX_RUBY 99\n#define OBJ_EVENT_GFX_SAPPHIRE 100\n#define OBJ_EVENT_GFX_OLD_AMBER 101\n#define OBJ_EVENT_GFX_GYM_SIGN 102\n#define OBJ_EVENT_GFX_SIGN 103\n#define OBJ_EVENT_GFX_TRAINER_TIPS 104\n#define OBJ_EVENT_GFX_CLIPBOARD 105\n#define OBJ_EVENT_GFX_METEORITE 106\n#define OBJ_EVENT_GFX_LAPRAS_DOLL 107\n#define OBJ_EVENT_GFX_SEAGALLOP 108\n#define OBJ_EVENT_GFX_SNORLAX 109\n#define OBJ_EVENT_GFX_SPEAROW 110\n#define OBJ_EVENT_GFX_CUBONE 111\n#define OBJ_EVENT_GFX_POLIWRATH 112\n#define OBJ_EVENT_GFX_CLEFAIRY 113\n#define OBJ_EVENT_GFX_PIDGEOT 114\n#define OBJ_EVENT_GFX_JIGGLYPUFF 115\n#define OBJ_EVENT_GFX_PIDGEY 116\n#define OBJ_EVENT_GFX_CHANSEY 117\n#define OBJ_EVENT_GFX_OMANYTE 118\n#define OBJ_EVENT_GFX_KANGASKHAN 119\n#define OBJ_EVENT_GFX_PIKACHU 120\n#define OBJ_EVENT_GFX_PSYDUCK 121\n#define OBJ_EVENT_GFX_NIDORAN_F 122\n#define OBJ_EVENT_GFX_NIDORAN_M 123\n#define OBJ_EVENT_GFX_NIDORINO 124\n#define OBJ_EVENT_GFX_MEOWTH 125\n#define OBJ_EVENT_GFX_SEEL 126\n#define OBJ_EVENT_GFX_VOLTORB 127\n#define OBJ_EVENT_GFX_SLOWPOKE 128\n#define OBJ_EVENT_GFX_SLOWBRO 129\n#define OBJ_EVENT_GFX_MACHOP 130\n#define OBJ_EVENT_GFX_WIGGLYTUFF 131\n#define OBJ_EVENT_GFX_DODUO 132\n#define OBJ_EVENT_GFX_FEAROW 133\n#define OBJ_EVENT_GFX_MACHOKE 134\n#define OBJ_EVENT_GFX_LAPRAS 135\n#define OBJ_EVENT_GFX_ZAPDOS 136\n#define OBJ_EVENT_GFX_MOLTRES 137\n#define OBJ_EVENT_GFX_ARTICUNO 138\n#define OBJ_EVENT_GFX_MEWTWO 139\n#define OBJ_EVENT_GFX_MEW 140\n#define OBJ_EVENT_GFX_ENTEI 141\n#define OBJ_EVENT_GFX_SUICUNE 142\n#define OBJ_EVENT_GFX_RAIKOU 143\n#define OBJ_EVENT_GFX_LUGIA 144\n#define OBJ_EVENT_GFX_HO_OH 145\n#define OBJ_EVENT_GFX_CELEBI 146\n#define OBJ_EVENT_GFX_KABUTO 147\n#define OBJ_EVENT_GFX_DEOXYS_D 148\n#define OBJ_EVENT_GFX_DEOXYS_A 149\n#define OBJ_EVENT_GFX_DEOXYS_N 150\n#define OBJ_EVENT_GFX_SS_ANNE 151\n#define OBJ_EVENT_GFX_CUE_BALL 152\n#define OBJ_EVENT_GFX_PAINTER 153\n#define OBJ_EVENT_GFX_BIRD_KEEPER 154\n#define OBJ_EVENT_GFX_BURGLAR 155\n#define OBJ_EVENT_GFX_POKEMON_RANGER_F 156\n#define OBJ_EVENT_GFX_POKEMON_RANGER_M 157\n#define OBJ_EVENT_GFX_RUIN_MANIAC 158\n#define OBJ_EVENT_GFX_POKE_MANIAC 159\n#define OBJ_EVENT_GFX_PSYCHIC_M 160\n#define OBJ_EVENT_GFX_PSYCHIC_F 161\n#define OBJ_EVENT_GFX_AROMA_LADY 162\n#define OBJ_EVENT_GFX_TWIN 163\n#define OBJ_EVENT_GFX_YOUNG_COUPLE_M 164\n#define OBJ_EVENT_GFX_YOUNG_COUPLE_F 165\n#define OBJ_EVENT_GFX_ENGINEER 166\n#define OBJ_EVENT_GFX_JUGGLER 167\n#define OBJ_EVENT_GFX_TAMER 168\n#define OBJ_EVENT_GFX_POKEMON_BREEDER 169\n#define OBJ_EVENT_GFX_RED_UNDERWATER 170\n#define OBJ_EVENT_GFX_GREEN_UNDERWATER 171\n#define OBJ_EVENT_GFX_SCOTT 172\n#define OBJ_EVENT_GFX_BULBASAUR 173\n#define OBJ_EVENT_GFX_CHARMANDER 174\n#define OBJ_EVENT_GFX_SQUIRTLE 175\n#define OBJ_EVENT_GFX_LATIAS 176\n#define OBJ_EVENT_GFX_LATIOS 177\n#define OBJ_EVENT_GFX_EM_BRENDAN 178\n#define OBJ_EVENT_GFX_EM_MAY 179\n#define OBJ_EVENT_GFX_CABLE_CAR 180\n#define OBJ_EVENT_GFX_SUDOWOODO 181\n#define OBJ_EVENT_GFX_ABRA 182\n#define OBJ_EVENT_GFX_SWIMMER_F_WATER_2 183\n#define OBJ_EVENT_GFX_MASTER_BEAUTY 184\n#define OBJ_EVENT_GFX_MASTER_BIRD_KEEPER 185\n#define OBJ_EVENT_GFX_MASTER_BLACK_BELT 186\n#define OBJ_EVENT_GFX_MASTER_BUG_CATCHER 187\n#define OBJ_EVENT_GFX_MASTER_COOLTRAINER_M 188\n#define OBJ_EVENT_GFX_MASTER_HIKER 189\n#define OBJ_EVENT_GFX_MASTER_LASS 190\n#define OBJ_EVENT_GFX_MASTER_PSYCHIC_M 191\n#define OBJ_EVENT_GFX_MASTER_SCIENTIST 192\n#define OBJ_EVENT_GFX_MASTER_YOUNGSTER 193\n#define OBJ_EVENT_GFX_LADY 194\n#define OBJ_EVENT_GFX_ROCKER_2 195\n#define OBJ_EVENT_GFX_ANABEL 196\n#define OBJ_EVENT_GFX_TUCKER 197\n#define OBJ_EVENT_GFX_GRETA 198\n#define OBJ_EVENT_GFX_SPENSER 199\n#define OBJ_EVENT_GFX_NOLAND 200\n#define OBJ_EVENT_GFX_LUCY 201\n#define OBJ_EVENT_GFX_BRANDON 202\n\n#define NUM_OBJ_EVENT_GFX     203\n\n// These are dynamic object gfx ids.\n// They correspond with the values of the VAR_OBJ_GFX_ID_X vars.\n// More info about them in include/constants/vars.h\n#define OBJ_EVENT_GFX_VARS   240\n#define OBJ_EVENT_GFX_VAR_0  (OBJ_EVENT_GFX_VARS + 0x0) // 240\n#define OBJ_EVENT_GFX_VAR_1  (OBJ_EVENT_GFX_VARS + 0x1)\n#define OBJ_EVENT_GFX_VAR_2  (OBJ_EVENT_GFX_VARS + 0x2)\n#define OBJ_EVENT_GFX_VAR_3  (OBJ_EVENT_GFX_VARS + 0x3)\n#define OBJ_EVENT_GFX_VAR_4  (OBJ_EVENT_GFX_VARS + 0x4)\n#define OBJ_EVENT_GFX_VAR_5  (OBJ_EVENT_GFX_VARS + 0x5)\n#define OBJ_EVENT_GFX_VAR_6  (OBJ_EVENT_GFX_VARS + 0x6)\n#define OBJ_EVENT_GFX_VAR_7  (OBJ_EVENT_GFX_VARS + 0x7)\n#define OBJ_EVENT_GFX_VAR_8  (OBJ_EVENT_GFX_VARS + 0x8)\n#define OBJ_EVENT_GFX_VAR_9  (OBJ_EVENT_GFX_VARS + 0x9)\n#define OBJ_EVENT_GFX_VAR_A  (OBJ_EVENT_GFX_VARS + 0xA)\n#define OBJ_EVENT_GFX_VAR_B  (OBJ_EVENT_GFX_VARS + 0xB)\n#define OBJ_EVENT_GFX_VAR_C  (OBJ_EVENT_GFX_VARS + 0xC)\n#define OBJ_EVENT_GFX_VAR_D  (OBJ_EVENT_GFX_VARS + 0xD)\n#define OBJ_EVENT_GFX_VAR_E  (OBJ_EVENT_GFX_VARS + 0xE)\n#define OBJ_EVENT_GFX_VAR_F  (OBJ_EVENT_GFX_VARS + 0xF) // 255\n\n#define SHADOW_SIZE_S   0\n#define SHADOW_SIZE_M   1\n#define SHADOW_SIZE_L   2\n#define SHADOW_SIZE_XL  3\n\n#define F_INANIMATE                        (1 << 6)\n#define F_DISABLE_REFLECTION_PALETTE_LOAD  (1 << 7)\n\n#define TRACKS_NONE       0\n#define TRACKS_FOOT       1\n#define TRACKS_BIKE_TIRE  2\n\n#define OBJ_KIND_NORMAL 0\n#define OBJ_KIND_CLONE  255\n\n// Special object event local ids\n#define OBJ_EVENT_ID_PLAYER  0xFF\n#define OBJ_EVENT_ID_CAMERA  0x7F\n\n// Object event local ids referenced in C files\n#define LOCALID_UNION_ROOM_PLAYER_4 2\n#define LOCALID_UNION_ROOM_PLAYER_8 3\n#define LOCALID_UNION_ROOM_PLAYER_7 4\n#define LOCALID_UNION_ROOM_PLAYER_6 5\n#define LOCALID_UNION_ROOM_PLAYER_5 6\n#define LOCALID_UNION_ROOM_PLAYER_3 7\n#define LOCALID_UNION_ROOM_PLAYER_2 8\n#define LOCALID_UNION_ROOM_PLAYER_1 9\n\n#endif // GUARD_CONSTANTS_EVENT_OBJECTS_H\n"
  },
  {
    "path": "include/constants/fame_checker.h",
    "content": "#ifndef GUARD_CONSTANTS_FAME_CHECKER_H\n#define GUARD_CONSTANTS_FAME_CHECKER_H\n\n#define FAMECHECKER_OAK          0\n#define FAMECHECKER_DAISY        1\n#define FAMECHECKER_BROCK        2\n#define FAMECHECKER_MISTY        3\n#define FAMECHECKER_LTSURGE      4\n#define FAMECHECKER_ERIKA        5\n#define FAMECHECKER_KOGA         6\n#define FAMECHECKER_SABRINA      7\n#define FAMECHECKER_BLAINE       8\n#define FAMECHECKER_LORELEI      9\n#define FAMECHECKER_BRUNO       10\n#define FAMECHECKER_AGATHA      11\n#define FAMECHECKER_LANCE       12\n#define FAMECHECKER_BILL        13\n#define FAMECHECKER_MRFUJI      14\n#define FAMECHECKER_GIOVANNI    15\n#define NUM_FAMECHECKER_PERSONS 16\n\n#define FCPICKSTATE_NO_DRAW    0\n#define FCPICKSTATE_SILHOUETTE 1\n#define FCPICKSTATE_COLORED    2\n\n#endif //GUARD_CONSTANTS_FAME_CHECKER_H\n"
  },
  {
    "path": "include/constants/field_effects.h",
    "content": "#ifndef GUARD_CONSTANTS_FIELD_EFFECTS_H \n#define GUARD_CONSTANTS_FIELD_EFFECTS_H \n\n#define FLDEFF_EXCLAMATION_MARK_ICON      0\n#define FLDEFF_USE_CUT_ON_GRASS           1\n#define FLDEFF_USE_CUT_ON_TREE            2\n#define FLDEFF_SHADOW                     3\n#define FLDEFF_TALL_GRASS                 4\n#define FLDEFF_RIPPLE                     5\n#define FLDEFF_FIELD_MOVE_SHOW_MON        6\n#define FLDEFF_ASH                        7\n#define FLDEFF_SURF_BLOB                  8\n#define FLDEFF_USE_SURF                   9\n#define FLDEFF_DUST                      10\n#define FLDEFF_USE_SECRET_POWER_CAVE     11\n#define FLDEFF_JUMP_TALL_GRASS           12\n#define FLDEFF_SAND_FOOTPRINTS           13\n#define FLDEFF_JUMP_BIG_SPLASH           14\n#define FLDEFF_SPLASH                    15\n#define FLDEFF_JUMP_SMALL_SPLASH         16\n#define FLDEFF_LONG_GRASS                17\n#define FLDEFF_JUMP_LONG_GRASS           18\n#define FLDEFF_UNUSED_GRASS              19\n#define FLDEFF_UNUSED_GRASS_2            20\n#define FLDEFF_UNUSED_SAND               21\n#define FLDEFF_UNUSED_WATER_SURFACING    22\n#define FLDEFF_BERRY_TREE_GROWTH_SPARKLE 23\n#define FLDEFF_DEEP_SAND_FOOTPRINTS      24\n#define FLDEFF_POKECENTER_HEAL           25\n#define FLDEFF_USE_SECRET_POWER_TREE     26\n#define FLDEFF_USE_SECRET_POWER_SHRUB    27\n#define FLDEFF_TREE_DISGUISE             28\n#define FLDEFF_MOUNTAIN_DISGUISE         29\n#define FLDEFF_NPCFLY_OUT                30\n#define FLDEFF_FLY_OUT                   31\n#define FLDEFF_FLY_IN                    32\n#define FLDEFF_QUESTION_MARK_ICON        33\n#define FLDEFF_FEET_IN_FLOWING_WATER     34\n#define FLDEFF_BIKE_TIRE_TRACKS          35\n#define FLDEFF_SAND_DISGUISE             36\n#define FLDEFF_USE_ROCK_SMASH            37\n#define FLDEFF_USE_DIG                   38\n#define FLDEFF_SAND_PILE                 39\n#define FLDEFF_USE_STRENGTH              40\n#define FLDEFF_SHORT_GRASS               41\n#define FLDEFF_HOT_SPRINGS_WATER         42\n#define FLDEFF_USE_WATERFALL             43\n#define FLDEFF_USE_DIVE                  44\n#define FLDEFF_POKEBALL                  45\n#define FLDEFF_X_ICON                    46\n#define FLDEFF_NOP_47                    47\n#define FLDEFF_NOP_48                    48\n#define FLDEFF_POP_OUT_OF_ASH            49\n#define FLDEFF_LAVARIDGE_GYM_WARP        50\n#define FLDEFF_SWEET_SCENT               51\n#define FLDEFF_SAND_PILLAR               52\n#define FLDEFF_BUBBLES                   53\n#define FLDEFF_SPARKLE                   54\n#define FLDEFF_SECRET_POWER_CAVE         55\n#define FLDEFF_SECRET_POWER_TREE         56\n#define FLDEFF_SECRET_POWER_SHRUB        57\n#define FLDEFF_CUT_GRASS                 58\n#define FLDEFF_FIELD_MOVE_SHOW_MON_INIT  59\n#define FLDEFF_USE_FLY_ANCIENT_TOMB      60\n#define FLDEFF_PCTURN_ON                 61\n#define FLDEFF_HALL_OF_FAME_RECORD       62\n#define FLDEFF_USE_TELEPORT              63\n#define FLDEFF_SMILEY_FACE_ICON          64\n#define FLDEFF_USE_VS_SEEKER             65\n#define FLDEFF_DOUBLE_EXCL_MARK_ICON     66\n#define FLDEFF_MOVE_DEOXYS_ROCK          67\n#define FLDEFF_DESTROY_DEOXYS_ROCK       68\n#define FLDEFF_PHOTO_FLASH               69\n\n#define FLDEFF_PAL_TAG_GENERAL_0          0x1004\n#define FLDEFF_PAL_TAG_GENERAL_1          0x1005\n#define FLDEFF_PAL_TAG_POKEBALL_TRAIL     0x1009\n#define FLDEFF_PAL_TAG_ASH                0x100D\n#define FLDEFF_PAL_TAG_SMALL_SPARKLE      0x100F\n\n#define FLDEFFOBJ_SHADOW_S                  0\n#define FLDEFFOBJ_SHADOW_M                  1\n#define FLDEFFOBJ_SHADOW_L                  2\n#define FLDEFFOBJ_SHADOW_XL                 3\n#define FLDEFFOBJ_TALL_GRASS                4\n#define FLDEFFOBJ_RIPPLE                    5\n#define FLDEFFOBJ_ASH                       6\n#define FLDEFFOBJ_SURF_BLOB                 7\n#define FLDEFFOBJ_ARROW                     8\n#define FLDEFFOBJ_GROUND_IMPACT_DUST        9\n#define FLDEFFOBJ_JUMP_TALL_GRASS          10\n#define FLDEFFOBJ_SAND_FOOTPRINTS          11\n#define FLDEFFOBJ_JUMP_BIG_SPLASH          12\n#define FLDEFFOBJ_SPLASH                   13\n#define FLDEFFOBJ_JUMP_SMALL_SPLASH        14\n#define FLDEFFOBJ_LONG_GRASS               15\n#define FLDEFFOBJ_JUMP_LONG_GRASS          16\n#define FLDEFFOBJ_UNUSED_GRASS             17\n#define FLDEFFOBJ_UNUSED_GRASS_2           18\n#define FLDEFFOBJ_UNUSED_SAND              19\n#define FLDEFFOBJ_WATER_SURFACING          20\n#define FLDEFFOBJ_REFLECTION_DISTORTION    21\n#define FLDEFFOBJ_SPARKLE                  22\n#define FLDEFFOBJ_DEEP_SAND_FOOTPRINTS     23\n#define FLDEFFOBJ_TREE_DISGUISE            24\n#define FLDEFFOBJ_MOUNTAIN_DISGUISE        25\n#define FLDEFFOBJ_BIRD                     26\n#define FLDEFFOBJ_BIKE_TIRE_TRACKS         27\n#define FLDEFFOBJ_SAND_DISGUISE            28\n#define FLDEFFOBJ_SAND_PILE                29\n#define FLDEFFOBJ_SHORT_GRASS              30\n#define FLDEFFOBJ_HOT_SPRINGS_WATER        31\n#define FLDEFFOBJ_ASH_PUFF                 32\n#define FLDEFFOBJ_ASH_LAUNCH               33\n#define FLDEFFOBJ_BUBBLES                  34\n#define FLDEFFOBJ_SMALL_SPARKLE            35\n\n#endif // GUARD_CONSTANTS_FIELD_EFFECTS_H\n"
  },
  {
    "path": "include/constants/field_tasks.h",
    "content": "#ifndef GUARD_CONSTANTS_FIELD_TASKS_H\n#define GUARD_CONSTANTS_FIELD_TASKS_H\n\n#define STEP_CB_DUMMY               0\n#define STEP_CB_ASH                 1 // Unused\n#define STEP_CB_FORTREE_BRIDGE      2 // Unused, dummied\n#define STEP_CB_PACIFIDLOG_BRIDGE   3 // Unused, dummied\n#define STEP_CB_ICE                 4\n#define STEP_CB_TRUCK               5 // Unused, dummied\n#define STEP_CB_SECRET_BASE         6 // Unused, dummied\n#define STEP_CB_CRACKED_FLOOR       7 // Unused\n\n#endif // GUARD_CONSTANTS_FIELD_TASKS_H\n"
  },
  {
    "path": "include/constants/field_weather.h",
    "content": "#ifndef GUARD_CONSTANTS_FIELD_WEATHER_H\n#define GUARD_CONSTANTS_FIELD_WEATHER_H\n\n#define MAX_RAIN_SPRITES             24\n#define NUM_CLOUD_SPRITES            3\n#define NUM_FOG_HORIZONTAL_SPRITES   20\n#define NUM_ASH_SPRITES              20\n#define NUM_FOG_DIAGONAL_SPRITES     20\n#define NUM_SANDSTORM_SPRITES        20\n#define NUM_SWIRL_SANDSTORM_SPRITES  5\n\n// Controls how the weather should be changing the screen palettes.\n#define WEATHER_PAL_STATE_CHANGING_WEATHER   0\n#define WEATHER_PAL_STATE_SCREEN_FADING_IN   1\n#define WEATHER_PAL_STATE_SCREEN_FADING_OUT  2\n#define WEATHER_PAL_STATE_IDLE               3\n\n// Modes for FadeScreen\n#define FADE_FROM_BLACK  0\n#define FADE_TO_BLACK    1\n#define FADE_FROM_WHITE  2\n#define FADE_TO_WHITE    3\n\n#endif // GUARD_CONSTANTS_FIELD_WEATHER_H\n"
  },
  {
    "path": "include/constants/flags.h",
    "content": "#ifndef GUARD_CONSTANTS_FLAGS_H\n#define GUARD_CONSTANTS_FLAGS_H\n\n#include \"constants/trainers.h\"\n\n// Temporary Flags\n// These temporary flags are are cleared every time a map is loaded. They are used\n// for things like shortening an NPCs introduction text if the player already spoke\n// to them once.\n#define TEMP_FLAGS_START 0x0\n#define FLAG_TEMP_1      (TEMP_FLAGS_START + 0x01)\n#define FLAG_TEMP_2      (TEMP_FLAGS_START + 0x02)\n#define FLAG_TEMP_3      (TEMP_FLAGS_START + 0x03)\n#define FLAG_TEMP_4      (TEMP_FLAGS_START + 0x04)\n#define FLAG_TEMP_5      (TEMP_FLAGS_START + 0x05)\n#define FLAG_TEMP_6      (TEMP_FLAGS_START + 0x06)\n#define FLAG_TEMP_7      (TEMP_FLAGS_START + 0x07)\n#define FLAG_TEMP_8      (TEMP_FLAGS_START + 0x08)\n#define FLAG_TEMP_9      (TEMP_FLAGS_START + 0x09)\n#define FLAG_TEMP_A      (TEMP_FLAGS_START + 0x0A)\n#define FLAG_TEMP_B      (TEMP_FLAGS_START + 0x0B)\n#define FLAG_TEMP_C      (TEMP_FLAGS_START + 0x0C)\n#define FLAG_TEMP_D      (TEMP_FLAGS_START + 0x0D)\n#define FLAG_TEMP_E      (TEMP_FLAGS_START + 0x0E)\n#define FLAG_TEMP_F      (TEMP_FLAGS_START + 0x0F)\n#define FLAG_TEMP_10     (TEMP_FLAGS_START + 0x10)\n\n// Used for obstacles (e.g. cut trees and rock smash rocks)\n#define FLAG_TEMP_11     (TEMP_FLAGS_START + 0x11)\n#define FLAG_TEMP_12     (TEMP_FLAGS_START + 0x12)\n#define FLAG_TEMP_13     (TEMP_FLAGS_START + 0x13)\n#define FLAG_TEMP_14     (TEMP_FLAGS_START + 0x14)\n#define FLAG_TEMP_15     (TEMP_FLAGS_START + 0x15)\n#define FLAG_TEMP_16     (TEMP_FLAGS_START + 0x16)\n#define FLAG_TEMP_17     (TEMP_FLAGS_START + 0x17)\n#define FLAG_TEMP_18     (TEMP_FLAGS_START + 0x18)\n#define FLAG_TEMP_19     (TEMP_FLAGS_START + 0x19)\n#define FLAG_TEMP_1A     (TEMP_FLAGS_START + 0x1A)\n#define FLAG_TEMP_1B     (TEMP_FLAGS_START + 0x1B)\n#define FLAG_TEMP_1C     (TEMP_FLAGS_START + 0x1C)\n#define FLAG_TEMP_1D     (TEMP_FLAGS_START + 0x1D)\n#define FLAG_TEMP_1E     (TEMP_FLAGS_START + 0x1E)\n#define FLAG_TEMP_1F     (TEMP_FLAGS_START + 0x1F)\n#define TEMP_FLAGS_END   FLAG_TEMP_1F\n\n#define FLAG_0x020               0x020\n#define FLAG_0x021               0x021\n#define FLAG_0x022               0x022\n#define FLAG_0x023               0x023\n#define FLAG_0x024               0x024\n#define FLAG_0x025               0x025\n#define FLAG_0x026               0x026\n\n// Hide/show flags\n#define FLAG_HIDE_AWARD_SCOTT_BATTLE_TOWER                 0x027\n#define FLAG_HIDE_BULBASAUR_BALL                           0x028\n#define FLAG_HIDE_SQUIRTLE_BALL                            0x029\n#define FLAG_HIDE_CHARMANDER_BALL                          0x02A\n#define FLAG_HIDE_OAK_IN_HIS_LAB                           0x02B\n#define FLAG_HIDE_OAK_IN_PALLET_TOWN                       0x02C\n#define FLAG_HIDE_RIVAL_IN_LAB                             0x02D\n#define FLAG_HIDE_PEWTER_CITY_GYM_GUIDE                    0x02E\n#define FLAG_HIDE_DOME_FOSSIL                              0x02F\n#define FLAG_HIDE_HELIX_FOSSIL                             0x030\n#define FLAG_HIDE_NUGGET_BRIDGE_ROCKET                     0x031\n#define FLAG_HIDE_BILL_CLEFAIRY                            0x032\n#define FLAG_HIDE_BILL_HUMAN_SEA_COTTAGE                   0x033\n#define FLAG_HIDE_TOWER_FUJI                               0x034\n#define FLAG_HIDE_POKEHOUSE_FUJI                           0x035\n#define FLAG_HIDE_LIFT_KEY                                 0x036\n#define FLAG_HIDE_SILPH_SCOPE                              0x037\n#define FLAG_HIDE_HIDEOUT_GIOVANNI                         0x038\n#define FLAG_HIDE_TOWN_MAP                                 0x039\n#define FLAG_HIDE_POKEDEX                                  0x03A\n#define FLAG_HIDE_CERULEAN_ROCKET                          0x03B\n#define FLAG_HIDE_CERULEAN_RIVAL                           0x03C\n#define FLAG_HIDE_SS_ANNE_RIVAL                            0x03D\n#define FLAG_HIDE_SAFFRON_ROCKETS                          0x03E\n#define FLAG_HIDE_SAFFRON_CIVILIANS                        0x03F\n#define FLAG_HIDE_SEAFOAM_1F_BOULDER_1                     0x040\n#define FLAG_HIDE_SEAFOAM_1F_BOULDER_2                     0x041\n#define FLAG_HIDE_SEAFOAM_B1F_BOULDER_1                    0x042\n#define FLAG_HIDE_SEAFOAM_B1F_BOULDER_2                    0x043\n#define FLAG_HIDE_SEAFOAM_B2F_BOULDER_1                    0x044\n#define FLAG_HIDE_SEAFOAM_B2F_BOULDER_2                    0x045\n#define FLAG_HIDE_SEAFOAM_B3F_BOULDER_1                    0x046\n#define FLAG_HIDE_SEAFOAM_B3F_BOULDER_2                    0x047\n#define FLAG_HIDE_SEAFOAM_B3F_BOULDER_3                    0x048\n#define FLAG_HIDE_SEAFOAM_B3F_BOULDER_4                    0x049\n#define FLAG_HIDE_SEAFOAM_B3F_BOULDER_5                    0x04A\n#define FLAG_HIDE_SEAFOAM_B3F_BOULDER_6                    0x04B\n#define FLAG_HIDE_SEAFOAM_B4F_BOULDER_1                    0x04C\n#define FLAG_HIDE_SEAFOAM_B4F_BOULDER_2                    0x04D\n#define FLAG_HIDE_SILPH_RIVAL                              0x04E\n#define FLAG_HIDE_ROUTE_22_RIVAL                           0x04F\n#define FLAG_HIDE_PEWTER_MUSEUM_GUIDE                      0x050\n#define FLAG_HIDE_TOWER_RIVAL                              0x051\n#define FLAG_HIDE_MOLTRES                                  0x052\n#define FLAG_HIDE_SILPH_ROCKETS                            0x053\n#define FLAG_HIDE_ROUTE_12_SNORLAX                         0x054\n#define FLAG_HIDE_VIRIDIAN_GIOVANNI                        0x055\n#define FLAG_HIDE_OLD_AMBER                                0x056\n#define FLAG_HIDE_EEVEE_BALL                               0x057\n#define FLAG_HIDE_VICTORY_ROAD_2F_BOULDER                  0x058\n#define FLAG_HIDE_VICTORY_ROAD_3F_BOULDER                  0x059\n#define FLAG_HIDE_OAK_IN_CHAMP_ROOM                        0x05A\n#define FLAG_HIDE_GAME_CORNER_ROCKET                       0x05B\n#define FLAG_HIDE_CERULEAN_CAVE_GUARD                      0x05C\n#define FLAG_HIDE_ZAPDOS                                   0x05D\n#define FLAG_HIDE_TOWER_ROCKET_1                           0x05E\n#define FLAG_HIDE_CELADON_ROCKETS                          0x05F\n#define FLAG_HIDE_DOJO_HITMONLEE_BALL                      0x060\n#define FLAG_HIDE_DOJO_HITMONCHAN_BALL                     0x061\n#define FLAG_HIDE_CINNABAR_BILL                            0x062\n#define FLAG_HIDE_UNION_ROOM_PLAYER_1                      0x063\n#define FLAG_HIDE_UNION_ROOM_PLAYER_2                      0x064\n#define FLAG_HIDE_UNION_ROOM_PLAYER_3                      0x065\n#define FLAG_HIDE_UNION_ROOM_PLAYER_4                      0x066\n#define FLAG_HIDE_UNION_ROOM_PLAYER_5                      0x067\n#define FLAG_HIDE_UNION_ROOM_PLAYER_6                      0x068\n#define FLAG_HIDE_UNION_ROOM_PLAYER_7                      0x069\n#define FLAG_HIDE_UNION_ROOM_PLAYER_8                      0x06A\n#define FLAG_HIDE_CINNABAR_SEAGALLOP                       0x06B\n#define FLAG_HIDE_SAFFRON_FAN_CLUB_BLACKBELT               0x06C\n#define FLAG_HIDE_SAFFRON_FAN_CLUB_ROCKER                  0x06D\n#define FLAG_HIDE_SAFFRON_FAN_CLUB_WOMAN                   0x06E\n#define FLAG_HIDE_SAFFRON_FAN_CLUB_BEAUTY                  0x06F\n#define FLAG_HIDE_MG_DELIVERYMEN                           0x070\n#define FLAG_HIDE_ONE_ISLAND_BILL                          0x071\n#define FLAG_HIDE_ONE_ISLAND_POKECENTER_BILL               0x072\n#define FLAG_HIDE_ONE_ISLAND_POKECENTER_CELIO              0x073\n#define FLAG_HIDE_TWO_ISLAND_GAME_CORNER_BIKER             0x074\n#define FLAG_HIDE_TWO_ISLAND_GAME_CORNER_LOSTELLE          0x075\n#define FLAG_HIDE_LOSTELLE_IN_HER_HOME                     0x076\n#define FLAG_HIDE_LAVENDER_OUTSIDE_FUJI                    0x077\n#define FLAG_HIDE_BATTLE_TOWER_OPPONENT                    0x078\n#define FLAG_HIDE_THREE_ISLAND_BIKERS                      0x079\n#define FLAG_HIDE_LOSTELLE_IN_BERRY_FOREST                 0x07A\n#define FLAG_HIDE_TWO_ISLAND_WOMAN                         0x07B\n#define FLAG_HIDE_TWO_ISLAND_BEAUTY                        0x07C\n#define FLAG_HIDE_TWO_ISLAND_SUPER_NERD                    0x07D\n#define FLAG_HIDE_THREE_ISLAND_ANTIBIKERS                  0x07E\n#define FLAG_HIDE_SCOTT                                    0x07F\n#define FLAG_HIDE_ROUTE_16_SNORLAX                         0x080\n#define FLAG_HIDE_MEWTWO                                   0x081\n#define FLAG_HIDE_ARTICUNO                                 0x082\n#define FLAG_HIDE_TOWER_ROCKET_2                           0x083\n#define FLAG_HIDE_TOWER_ROCKET_3                           0x084\n#define FLAG_HIDE_POWER_PLANT_ELECTRODE_1                  0x085\n#define FLAG_HIDE_POWER_PLANT_ELECTRODE_2                  0x086\n#define FLAG_HIDE_SS_ANNE                                  0x087\n#define FLAG_HIDE_FIVE_ISLAND_ROCKETS                      0x088\n#define FLAG_HIDE_MT_EMBER_EXTERIOR_ROCKETS                0x089\n#define FLAG_HIDE_RUBY                                     0x08A\n#define FLAG_HIDE_ICEFALL_CAVE_LORELEI                     0x08B\n#define FLAG_HIDE_LORELEI_IN_HER_HOUSE                     0x08C\n#define FLAG_HIDE_ICEFALL_CAVE_ROCKETS                     0x08D\n#define FLAG_HIDE_RUIN_VALLEY_SCIENTIST                    0x08E\n#define FLAG_HIDE_SAPPHIRE                                 0x08F\n#define FLAG_HIDE_DOTTED_HOLE_SCIENTIST                    0x090\n#define FLAG_HIDE_THREE_ISLAND_LONE_BIKER                  0x091\n#define FLAG_HIDE_PEWTER_CITY_RUNNING_SHOES_GUY            0x092\n#define FLAG_HIDE_LOST_CAVE_SELPHY                         0x093\n#define FLAG_HIDE_RESORT_GORGEOUS_SELPHY                   0x094\n#define FLAG_HIDE_RESORT_GORGEOUS_INSIDE_SELPHY            0x095\n#define FLAG_HIDE_SELPHYS_BUTLER                           0x096\n#define FLAG_HIDE_FOUR_ISLAND_RIVAL                        0x097\n#define FLAG_HIDE_SIX_ISLAND_POKECENTER_RIVAL              0x098\n#define FLAG_HIDE_DEOXYS                                   0x099\n#define FLAG_HIDE_BIRTH_ISLAND_METEORITE                   0x09A\n#define FLAG_HIDE_LUGIA                                    0x09B\n#define FLAG_HIDE_HO_OH                                    0x09C\n#define FLAG_HIDE_POSTGAME_GOSSIPERS                       0x09D\n#define FLAG_HIDE_FAME_CHECKER_ERIKA_JOURNALS              0x09E\n#define FLAG_HIDE_FAME_CHECKER_KOGA_JOURNAL                0x09F\n#define FLAG_HIDE_FAME_CHECKER_LT_SURGE_JOURNAL            0x0A0\n#define FLAG_HIDE_VERMILION_CITY_OAKS_AIDE                 0x0A1\n#define FLAG_HIDE_CINNABAR_POKECENTER_BILL                 0x0A2\n#define FLAG_HIDE_CREDITS_RIVAL                            0x0A3\n#define FLAG_HIDE_CREDITS_OAK                              0x0A4\n#define FLAG_HIDE_LORELEI_HOUSE_MEOWTH_DOLL                0x0A5\n#define FLAG_HIDE_LORELEI_HOUSE_CHANSEY_DOLL               0x0A6\n#define FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_F_DOLL            0x0A7\n#define FLAG_HIDE_LORELEI_HOUSE_JIGGLYPUFF_DOLL            0x0A8\n#define FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_M_DOLL            0x0A9\n#define FLAG_HIDE_LORELEIS_HOUSE_FEAROW_DOLL               0x0AA\n#define FLAG_HIDE_LORELEIS_HOUSE_PIDGEOT_DOLL              0x0AB\n#define FLAG_HIDE_LORELEIS_HOUSE_LAPRAS_DOLL               0x0AC\n#define FLAG_HIDE_MISC_KANTO_ROCKETS                       0x0AD\n#define FLAG_HIDE_SAFFRON_CITY_POKECENTER_SABRINA_JOURNALS 0x0AE\n\n// Cut Trees\n#define FLAG_VIRIDIAN_CITY_NORTH_CUT_TREE     0x0AF\n#define FLAG_VIRIDIAN_CITY_SOUTH_CUT_TREE     0x0B0\n#define FLAG_ROUTE_2_CUT_TREE_1               0x0B1\n#define FLAG_ROUTE_2_CUT_TREE_2               0x0B2\n#define FLAG_ROUTE_2_CUT_TREE_3               0x0B3\n#define FLAG_ROUTE_2_CUT_TREE_4               0x0B4\n#define FLAG_PEWTER_CITY_CUT_TREE             0x0B5\n#define FLAG_CERULEAN_CITY_CUT_TREE           0x0B6\n#define FLAG_ROUTE_25_CUT_TREE                0x0B7\n#define FLAG_VERMILION_CITY_CUT_TREE          0x0B8\n#define FLAG_ROUTE_10_CUT_TREE_1              0x0B9\n#define FLAG_ROUTE_10_CUT_TREE_2              0x0BA\n#define FLAG_ROUTE_10_CUT_TREE_3              0x0BB\n#define FLAG_ROUTE_10_CUT_TREE_4              0x0BC\n#define FLAG_ROUTE_8_CUT_TREE_1               0x0BD\n#define FLAG_ROUTE_8_CUT_TREE_2               0x0BE\n#define FLAG_CELADON_CITY_NORTH_CUT_TREE      0x0BF\n#define FLAG_CELADON_CITY_SOUTH_CUT_TREE      0x0C0\n#define FLAG_ROUTE_16_CUT_TREE                0x0C1\n#define FLAG_ROUTE_12_CUT_TREE_1              0x0C2\n#define FLAG_ROUTE_12_CUT_TREE_2              0x0C3\n#define FLAG_ROUTE_13_CUT_TREE                0x0C4\n#define FLAG_ROUTE_14_CUT_TREE_1              0x0C5\n#define FLAG_ROUTE_14_CUT_TREE_2              0x0C6\n#define FLAG_ROUTE_14_CUT_TREE_3              0x0C7\n#define FLAG_FUCHSIA_CITY_CUT_TREE_1          0x0C8\n#define FLAG_FUCHSIA_CITY_CUT_TREE_2          0x0C9\n#define FLAG_FUCHSIA_CITY_CUT_TREE_3          0x0CA\n#define FLAG_FUCHSIA_CITY_CUT_TREE_4          0x0CB\n#define FLAG_TWO_ISLAND_CUT_TREE              0x0CC\n#define FLAG_THREE_ISLAND_CUT_TREE            0x0CD\n#define FLAG_BOND_BRIDGE_CUT_TREE_1           0x0CE\n#define FLAG_BOND_BRIDGE_CUT_TREE_2           0x0CF\n#define FLAG_FIVE_ISLE_MEADOW_CUT_TREE_1      0x0D0\n#define FLAG_FIVE_ISLE_MEADOW_CUT_TREE_2      0x0D1\n#define FLAG_BERRY_FOREST_CUT_TREE_1          0x0D2\n#define FLAG_BERRY_FOREST_CUT_TREE_2          0x0D3\n#define FLAG_BERRY_FOREST_CUT_TREE_3          0x0D4\n#define FLAG_BERRY_FOREST_CUT_TREE_4          0x0D5\n#define FLAG_BERRY_FOREST_CUT_TREE_5          0x0D6\n#define FLAG_BERRY_FOREST_CUT_TREE_6          0x0D7\n#define FLAG_BERRY_FOREST_CUT_TREE_7          0x0D8\n#define FLAG_BERRY_FOREST_CUT_TREE_8          0x0D9\n#define FLAG_BERRY_FOREST_CUT_TREE_9          0x0DA\n#define FLAG_BERRY_FOREST_CUT_TREE_10         0x0DB\n#define FLAG_ROUTE_9_CUT_TREE                 0x0DC //forgot this one\n#define FLAG_AUTO_RUN_TOGGLED                 0x0DD\n#define FLAG_AUTO_RUN_EXPLAINED               0x0DE\n#define FLAG_DONT_ADD_TMS                     0x0DF //Needed so the Teachy TV doesn't add TMs\n#define FLAG_CELADON_GYM_LEFT_CUT_TREE        0x0E0 //forgot these...\n#define FLAG_CELADON_GYM_BOTTOM_CUT_TREE      0x0E1 // ^\n#define FLAG_CELADON_GYM_RIGHT_CUT_TREE       0x0E2 // ^\n#define FLAG_BIKE_GEAR                        0x0E3 // Swaps between FRLG bike speed and Mach Bike speed\n\n// Unused?\n#define FLAG_HIDE_NATIONAL_DEX_AIDE           0x0E4\n#define FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO   0x0E5\n#define FLAG_DEFEATED_SUDOWOODO               0x0E6\n#define FLAG_CAUGHT_SUDOWOODO                 0x0E7\n#define FLAG_GIVEN_CORSOLA_EGG                0x0E8\n#define FLAG_MASTER_TRAINER_BATTLE            0x0E9\n#define FLAG_HIDE_MASTER_TRAINERS             0x0EA\n#define FLAG_0x0EB               0x0EB\n#define FLAG_0x0EC               0x0EC\n#define FLAG_0x0ED               0x0ED\n#define FLAG_0x0EE               0x0EE\n#define FLAG_0x0EF               0x0EF\n#define FLAG_0x0F0               0x0F0\n#define FLAG_0x0F1               0x0F1\n#define FLAG_0x0F2               0x0F2\n#define FLAG_0x0F3               0x0F3\n#define FLAG_0x0F4               0x0F4\n#define FLAG_0x0F5               0x0F5\n#define FLAG_0x0F6               0x0F6\n#define FLAG_0x0F7               0x0F7\n#define FLAG_0x0F8               0x0F8\n#define FLAG_0x0F9               0x0F9\n#define FLAG_0x0FA               0x0FA\n#define FLAG_0x0FB               0x0FB\n#define FLAG_0x0FC               0x0FC\n#define FLAG_0x0FD               0x0FD\n#define FLAG_0x0FE               0x0FE\n#define FLAG_0x0FF               0x0FF\n#define FLAG_0x100               0x100\n#define FLAG_0x101               0x101\n#define FLAG_0x102               0x102\n#define FLAG_0x103               0x103\n#define FLAG_0x104               0x104\n#define FLAG_0x105               0x105\n#define FLAG_0x106               0x106\n#define FLAG_0x107               0x107\n#define FLAG_0x108               0x108\n#define FLAG_0x109               0x109\n#define FLAG_0x10A               0x10A\n#define FLAG_0x10B               0x10B\n#define FLAG_0x10C               0x10C\n#define FLAG_0x10D               0x10D\n#define FLAG_0x10E               0x10E\n#define FLAG_0x10F               0x10F\n#define FLAG_0x110               0x110\n#define FLAG_0x111               0x111\n#define FLAG_0x112               0x112\n#define FLAG_0x113               0x113\n#define FLAG_0x114               0x114\n#define FLAG_0x115               0x115\n#define FLAG_0x116               0x116\n#define FLAG_0x117               0x117\n#define FLAG_0x118               0x118\n#define FLAG_0x119               0x119\n#define FLAG_0x11A               0x11A\n#define FLAG_0x11B               0x11B\n#define FLAG_0x11C               0x11C\n#define FLAG_0x11D               0x11D\n#define FLAG_0x11E               0x11E\n#define FLAG_0x11F               0x11F\n#define FLAG_0x120               0x120\n#define FLAG_0x121               0x121\n#define FLAG_0x122               0x122\n#define FLAG_0x123               0x123\n#define FLAG_0x124               0x124\n#define FLAG_0x125               0x125\n#define FLAG_0x126               0x126\n#define FLAG_0x127               0x127\n#define FLAG_0x128               0x128\n#define FLAG_0x129               0x129\n#define FLAG_0x12A               0x12A\n#define FLAG_0x12B               0x12B\n#define FLAG_0x12C               0x12C\n#define FLAG_0x12D               0x12D\n#define FLAG_0x12E               0x12E\n#define FLAG_0x12F               0x12F\n#define FLAG_0x130               0x130\n#define FLAG_0x131               0x131\n#define FLAG_0x132               0x132\n#define FLAG_0x133               0x133\n#define FLAG_0x134               0x134\n#define FLAG_0x135               0x135\n#define FLAG_0x136               0x136\n#define FLAG_0x137               0x137\n#define FLAG_0x138               0x138\n#define FLAG_0x139               0x139\n#define FLAG_0x13A               0x13A\n#define FLAG_0x13B               0x13B\n#define FLAG_0x13C               0x13C\n#define FLAG_0x13D               0x13D\n#define FLAG_0x13E               0x13E\n#define FLAG_0x13F               0x13F\n#define FLAG_0x140               0x140\n#define FLAG_0x141               0x141\n#define FLAG_0x142               0x142\n#define FLAG_0x143               0x143\n#define FLAG_0x144               0x144\n#define FLAG_0x145               0x145\n#define FLAG_0x146               0x146\n#define FLAG_0x147               0x147\n#define FLAG_0x148               0x148\n#define FLAG_0x149               0x149\n#define FLAG_0x14A               0x14A\n#define FLAG_0x14B               0x14B\n#define FLAG_0x14C               0x14C\n#define FLAG_0x14D               0x14D\n#define FLAG_0x14E               0x14E\n#define FLAG_0x14F               0x14F\n#define FLAG_0x150               0x150\n#define FLAG_0x151               0x151\n#define FLAG_0x152               0x152\n#define FLAG_0x153               0x153\n\n// Item ball hide/show\n#define FLAG_HIDE_ROUTE2_ETHER                                  0x154\n#define FLAG_HIDE_ROUTE2_PARALYZE_HEAL                          0x155\n#define FLAG_HIDE_VIRIDIAN_FOREST_POKE_BALL                     0x156\n#define FLAG_HIDE_VIRIDIAN_FOREST_ANTIDOTE                      0x157\n#define FLAG_HIDE_VIRIDIAN_FOREST_POTION                        0x158\n#define FLAG_HIDE_MT_MOON_1F_PARALYZE_HEAL                      0x159\n#define FLAG_HIDE_MT_MOON_1F_TM09                               0x15A\n#define FLAG_HIDE_MT_MOON_1F_POTION                             0x15B\n#define FLAG_HIDE_MT_MOON_1F_RARE_CANDY                         0x15C\n#define FLAG_HIDE_MT_MOON_1F_ESCAPE_ROPE                        0x15D\n#define FLAG_HIDE_MT_MOON_1F_MOON_STONE                         0x15E\n#define FLAG_HIDE_MT_MOON_B2F_STAR_PIECE                        0x15F\n#define FLAG_HIDE_MT_MOON_B2F_TM46                              0x160\n#define FLAG_HIDE_ROUTE4_TM05                                   0x161\n#define FLAG_HIDE_ROUTE24_TM45                                  0x162\n#define FLAG_HIDE_ROUTE25_TM43                                  0x163\n#define FLAG_HIDE_SSANNE_1F_ROOM2_TM31                          0x164\n#define FLAG_HIDE_SSANNE_2F_ROOM2_STARDUST                      0x165\n#define FLAG_HIDE_SSANNE_2F_ROOM4_X_ATTACK                      0x166\n#define FLAG_HIDE_SSANNE_B1F_ROOM2_TM44                         0x167\n#define FLAG_HIDE_SSANNE_B1F_ROOM3_ETHER                        0x168\n#define FLAG_HIDE_SSANNE_B1F_ROOM5_SUPER_POTION                 0x169\n#define FLAG_HIDE_SSANNE_KITCHEN_GREAT_BALL                     0x16A\n#define FLAG_HIDE_ROUTE9_TM40                                   0x16B\n#define FLAG_HIDE_ROCKET_HIDEOUT_B1F_ESCAPE_ROPE                0x16C\n#define FLAG_HIDE_ROCKET_HIDEOUT_B1F_HYPER_POTION               0x16D\n#define FLAG_HIDE_ROCKET_HIDEOUT_B2F_X_SPEED                    0x16E\n#define FLAG_HIDE_ROCKET_HIDEOUT_B2F_MOON_STONE                 0x16F\n#define FLAG_HIDE_ROCKET_HIDEOUT_B2F_TM12                       0x170\n#define FLAG_HIDE_ROCKET_HIDEOUT_B2F_SUPER_POTION               0x171\n#define FLAG_HIDE_ROCKET_HIDEOUT_B3F_RARE_CANDY                 0x172\n#define FLAG_HIDE_ROCKET_HIDEOUT_B3F_TM21                       0x173\n#define FLAG_HIDE_ROCKET_HIDEOUT_B4F_TM49                       0x174\n#define FLAG_HIDE_ROCKET_HIDEOUT_B4F_MAX_ETHER                  0x175\n#define FLAG_HIDE_ROCKET_HIDEOUT_B4F_CALCIUM                    0x176\n#define FLAG_HIDE_POKEMON_TOWER_3F_ESCAPE_ROPE                  0x177\n#define FLAG_HIDE_POKEMON_TOWER_4F_ELIXIR                       0x178\n#define FLAG_HIDE_POKEMON_TOWER_4F_AWAKENING                    0x179\n#define FLAG_HIDE_POKEMON_TOWER_4F_GREAT_BALL                   0x17A\n#define FLAG_HIDE_POKEMON_TOWER_5F_NUGGET                       0x17B\n#define FLAG_HIDE_POKEMON_TOWER_6F_RARE_CANDY                   0x17C\n#define FLAG_HIDE_POKEMON_TOWER_6F_X_ACCURACY                   0x17D\n#define FLAG_HIDE_ROUTE12_TM48                                  0x17E\n#define FLAG_HIDE_ROUTE12_IRON                                  0x17F\n#define FLAG_HIDE_ROUTE15_TM18                                  0x180\n#define FLAG_HIDE_SAFARI_ZONE_CENTER_NUGGET                     0x181\n#define FLAG_HIDE_SAFARI_ZONE_EAST_MAX_POTION                   0x182\n#define FLAG_HIDE_SAFARI_ZONE_EAST_FULL_RESTORE                 0x183\n#define FLAG_HIDE_SAFARI_ZONE_EAST_TM11                         0x184\n#define FLAG_HIDE_SAFARI_ZONE_EAST_LEAF_STONE                   0x185\n#define FLAG_HIDE_SAFARI_ZONE_NORTH_PROTEIN                     0x186\n#define FLAG_HIDE_SAFARI_ZONE_NORTH_TM47                        0x187\n#define FLAG_HIDE_SAFARI_ZONE_WEST_TM32                         0x188\n#define FLAG_HIDE_SAFARI_ZONE_WEST_GOLD_TEETH                   0x189\n#define FLAG_HIDE_SAFARI_ZONE_WEST_MAX_POTION                   0x18A\n#define FLAG_HIDE_SAFARI_ZONE_WEST_MAX_REVIVE                   0x18B\n#define FLAG_HIDE_SILPH_CO_3F_HYPER_POTION                      0x18C\n#define FLAG_HIDE_SILPH_CO_4F_MAX_REVIVE                        0x18D\n#define FLAG_HIDE_SILPH_CO_4F_ESCAPE_ROPE                       0x18E\n#define FLAG_HIDE_SILPH_CO_4F_FULL_HEAL                         0x18F\n#define FLAG_HIDE_SILPH_CO_5F_PROTEIN                           0x190\n#define FLAG_HIDE_SILPH_CO_5F_TM01                              0x191\n#define FLAG_HIDE_SILPH_CO_5F_CARD_KEY                          0x192\n#define FLAG_HIDE_SILPH_CO_6F_HP_UP                             0x193\n#define FLAG_HIDE_SILPH_CO_6F_X_SPECIAL                         0x194\n#define FLAG_HIDE_SILPH_CO_7F_CALCIUM                           0x195\n#define FLAG_HIDE_SILPH_CO_7F_TM08                              0x196\n#define FLAG_HIDE_SILPH_CO_10F_CARBOS                           0x197\n#define FLAG_HIDE_SILPH_CO_10F_ULTRA_BALL                       0x198\n#define FLAG_HIDE_SILPH_CO_10F_RARE_CANDY                       0x199\n#define FLAG_HIDE_POWER_PLANT_MAX_POTION                        0x19A\n#define FLAG_HIDE_POWER_PLANT_TM17                              0x19B\n#define FLAG_HIDE_POWER_PLANT_TM25                              0x19C\n#define FLAG_HIDE_POWER_PLANT_THUNDER_STONE                     0x19D\n#define FLAG_HIDE_POWER_PLANT_ELIXIR                            0x19E\n#define FLAG_HIDE_POKEMON_MANSION_1F_CARBOS                     0x19F\n#define FLAG_HIDE_POKEMON_MANSION_1F_ESCAPE_ROPE                0x1A0\n#define FLAG_HIDE_POKEMON_MANSION_2F_CALCIUM                    0x1A1\n#define FLAG_HIDE_POKEMON_MANSION_3F_MAX_POTION                 0x1A2\n#define FLAG_HIDE_POKEMON_MANSION_3F_IRON                       0x1A3\n#define FLAG_HIDE_POKEMON_MANSION_B1F_TM14                      0x1A4\n#define FLAG_HIDE_POKEMON_MANSION_B1F_FULL_RESTORE              0x1A5\n#define FLAG_HIDE_SAFARI_ZONE_NORTHWEST_SUN_STONE               0x1A6 //New\n#define FLAG_HIDE_POKEMON_MANSION_B1F_TM22                      0x1A7\n#define FLAG_HIDE_POKEMON_MANSION_B1F_SECRET_KEY                0x1A8\n#define FLAG_HIDE_VICTORY_ROAD_1F_RARE_CANDY                    0x1A9\n#define FLAG_HIDE_VICTORY_ROAD_1F_TM02                          0x1AA\n#define FLAG_HIDE_VICTORY_ROAD_2F_GUARD_SPEC                    0x1AB\n#define FLAG_HIDE_VICTORY_ROAD_2F_TM07                          0x1AC\n#define FLAG_HIDE_VICTORY_ROAD_2F_FULL_HEAL                     0x1AD\n#define FLAG_HIDE_VICTORY_ROAD_2F_TM37                          0x1AE\n#define FLAG_HIDE_VICTORY_ROAD_3F_MAX_REVIVE                    0x1AF\n#define FLAG_HIDE_VICTORY_ROAD_3F_TM50                          0x1B0\n#define FLAG_HIDE_CERULEAN_CAVE_1F_MAX_ELIXIR                   0x1B1\n#define FLAG_HIDE_CERULEAN_CAVE_1F_NUGGET                       0x1B2\n#define FLAG_HIDE_CERULEAN_CAVE_1F_FULL_RESTORE                 0x1B3\n#define FLAG_HIDE_CERULEAN_CAVE_2F_FULL_RESTORE                 0x1B4\n#define FLAG_HIDE_CERULEAN_CAVE_2F_PP_UP                        0x1B5\n#define FLAG_HIDE_CERULEAN_CAVE_2F_ULTRA_BALL                   0x1B6\n#define FLAG_HIDE_CERULEAN_CAVE_B1F_MAX_REVIVE                  0x1B7\n#define FLAG_HIDE_CERULEAN_CAVE_B1F_ULTRA_BALL                  0x1B8\n#define FLAG_HIDE_FUCHSIA_CITY_WARDENS_HOUSE_RARE_CANDY         0x1B9\n#define FLAG_HIDE_TWO_ISLAND_REVIVE                             0x1BA\n#define FLAG_HIDE_THREE_ISLAND_ZINC                             0x1BB\n#define FLAG_HIDE_SAFARI_ZONE_NORTHWEST_RARE_CANDY              0x1BC //New\n#define FLAG_HIDE_SAFARI_ZONE_NORTHWEST_KINGS_ROCK              0x1BD //New\n#define FLAG_HIDE_VIRIDIAN_FOREST_POTION_2                      0x1BE\n#define FLAG_HIDE_MT_MOON_B2F_REVIVE                            0x1BF\n#define FLAG_HIDE_MT_MOON_B2F_ANTIDOTE                          0x1C0\n#define FLAG_HIDE_ROUTE11_X_DEFEND                              0x1C1\n#define FLAG_HIDE_ROUTE9_BURN_HEAL                              0x1C2\n#define FLAG_HIDE_ROCK_TUNNEL_1F_REPEL                          0x1C3\n#define FLAG_HIDE_ROCK_TUNNEL_1F_PEARL                          0x1C4\n#define FLAG_HIDE_ROCK_TUNNEL_1F_ESCAPE_ROPE                    0x1C5\n#define FLAG_HIDE_ROCK_TUNNEL_B1F_REVIVE                        0x1C6\n#define FLAG_HIDE_ROCK_TUNNEL_B1F_MAX_ETHER                     0x1C7\n#define FLAG_HIDE_SILPH_CO_8F_IRON                              0x1C8\n#define FLAG_HIDE_SILPH_CO_11F_ZINC                             0x1C9\n#define FLAG_HIDE_POKEMON_MANSION_1F_PROTEIN                    0x1CA\n#define FLAG_HIDE_POKEMON_MANSION_2F_ZINC                       0x1CB\n#define FLAG_HIDE_POKEMON_MANSION_2F_HP_UP                      0x1CC\n#define FLAG_HIDE_VIRIDIAN_CITY_POTION                          0x1CD\n#define FLAG_HIDE_ROUTE11_GREAT_BALL                            0x1CE\n#define FLAG_HIDE_ROUTE11_AWAKENING                             0x1CF\n#define FLAG_HIDE_POKEMON_TOWER_5F_CLEANSE_TAG                  0x1D0\n#define FLAG_HIDE_CELADON_CITY_ETHER                            0x1D1\n#define FLAG_HIDE_ROCKET_HIDEOUT_B3F_BLACK_GLASSES              0x1D2\n#define FLAG_HIDE_SAFARI_ZONE_NORTH_QUICK_CLAW                  0x1D3\n#define FLAG_HIDE_SEAFOAM_ISLANDS_1F_ICE_HEAL                   0x1D4\n#define FLAG_HIDE_SEAFOAM_ISLANDS_B1F_WATER_STONE               0x1D5\n#define FLAG_HIDE_SEAFOAM_ISLANDS_B1F_REVIVE                    0x1D6\n#define FLAG_HIDE_SEAFOAM_ISLANDS_B2F_BIG_PEARL                 0x1D7\n#define FLAG_HIDE_SEAFOAM_ISLANDS_B4F_ULTRA_BALL                0x1D8\n#define FLAG_HIDE_FOUR_ISLAND_STAR_PIECE                        0x1D9\n#define FLAG_HIDE_FOUR_ISLAND_STARDUST                          0x1DA\n#define FLAG_HIDE_ONE_ISLAND_KINDLE_ROAD_ETHER                  0x1DB\n#define FLAG_HIDE_ONE_ISLAND_KINDLE_ROAD_MAX_REPEL              0x1DC\n#define FLAG_HIDE_ONE_ISLAND_KINDLE_ROAD_CARBOS                 0x1DD\n#define FLAG_HIDE_FIVE_ISLAND_MEADOW_MAX_POTION                 0x1DE\n#define FLAG_HIDE_FIVE_ISLAND_MEADOW_PP_UP                      0x1DF\n#define FLAG_HIDE_FIVE_ISLAND_MEMORIAL_PILLAR_METAL_COAT        0x1E0\n#define FLAG_HIDE_SIX_ISLAND_OUTCAST_ISLAND_PP_UP               0x1E1\n#define FLAG_HIDE_SIX_ISLAND_WATER_PATH_ELIXIR                  0x1E2\n#define FLAG_HIDE_SIX_ISLAND_WATER_PATH_DRAGON_SCALE            0x1E3\n#define FLAG_HIDE_SIX_ISLAND_RUIN_VALLEY_FULL_RESTORE           0x1E4\n#define FLAG_HIDE_SIX_ISLAND_RUIN_VALLEY_HP_UP                  0x1E5\n#define FLAG_HIDE_SIX_ISLAND_RUIN_VALLEY_SUN_STONE              0x1E6\n#define FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_KINGS_ROCK        0x1E7\n#define FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_MAX_ELIXIR        0x1E8\n#define FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_NUGGET            0x1E9\n#define FLAG_HIDE_THREE_ISLAND_BERRY_FOREST_MAX_ETHER           0x1EA\n#define FLAG_HIDE_THREE_ISLAND_BERRY_FOREST_FULL_HEAL           0x1EB\n#define FLAG_HIDE_THREE_ISLAND_BERRY_FOREST_MAX_ELIXIR          0x1EC\n#define FLAG_HIDE_MT_EMBER_EXTERIOR_ULTRA_BALL                  0x1ED\n#define FLAG_HIDE_MT_EMBER_EXTERIOR_FIRE_STONE                  0x1EE\n#define FLAG_HIDE_MT_EMBER_EXTERIOR_DIRE_HIT                    0x1EF\n#define FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_ULTRA_BALL        0x1F0\n#define FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_HM07              0x1F1\n#define FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_B1F_FULL_RESTORE     0x1F2\n#define FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_B1F_NEVER_MELT_ICE   0x1F3\n#define FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_BIG_PEARL        0x1F4\n#define FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_TM36             0x1F5\n#define FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_PEARL            0x1F6\n#define FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_UP_GRADE         0x1F7\n#define FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM10_SILK_SCARF       0x1F8\n#define FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM11_LAX_INCENSE      0x1F9\n#define FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM12_SEA_INCENSE      0x1FA\n#define FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM13_MAX_REVIVE       0x1FB\n#define FLAG_HIDE_FIVE_ISLAND_LOST_CAVE_ROOM14_RARE_CANDY       0x1FC\n#define FLAG_HIDE_SEVEN_ISLAND_SEVAULT_CANYON_HOUSE_LUCKY_PUNCH 0x1FD\n#define FLAG_HIDE_SILPH_CO_4F_TM41                              0x1FE\n#define FLAG_HIDE_SAFARI_ZONE_NORTHWEST_PP_MAX                  0x1FF //New\n#define FLAG_HIDE_SAFARI_ZONE_NORTHEAST_MAX_REVIVE              0x200 //New\n#define FLAG_HIDE_SAFARI_ZONE_NORTHEAST_WHITE_HERB              0x201 //New\n#define FLAG_HIDE_SAFARI_ZONE_NORTHEAST_GLITTER_MAIL            0x202 //New\n#define FLAG_HIDE_ARTISAN_CAVE_B1F_HP_UP                        0x203 //New\n#define FLAG_HIDE_ARTISAN_CAVE_B1F_CARBOS                       0x204 //New\n#define FLAG_HIDE_CELADON_CITY_SUN_STONE                        0x205 //New\n\n// Unused?\n#define FLAG_0x206               0x206\n#define FLAG_0x207               0x207\n#define FLAG_0x208               0x208\n#define FLAG_0x209               0x209\n#define FLAG_0x20A               0x20A\n#define FLAG_0x20B               0x20B\n#define FLAG_0x20C               0x20C\n#define FLAG_0x20D               0x20D\n#define FLAG_0x20E               0x20E\n#define FLAG_0x20F               0x20F\n#define FLAG_0x210               0x210\n#define FLAG_0x211               0x211\n#define FLAG_0x212               0x212\n#define FLAG_0x213               0x213\n#define FLAG_0x214               0x214\n#define FLAG_0x215               0x215\n#define FLAG_0x216               0x216\n#define FLAG_0x217               0x217\n#define FLAG_0x218               0x218\n#define FLAG_0x219               0x219\n#define FLAG_0x21A               0x21A\n#define FLAG_0x21B               0x21B\n#define FLAG_0x21C               0x21C\n#define FLAG_0x21D               0x21D\n#define FLAG_0x21E               0x21E\n#define FLAG_0x21F               0x21F\n#define FLAG_0x220               0x220\n#define FLAG_0x221               0x221\n#define FLAG_0x222               0x222\n#define FLAG_0x223               0x223\n#define FLAG_0x224               0x224\n#define FLAG_0x225               0x225\n#define FLAG_0x226               0x226\n#define FLAG_0x227               0x227\n#define FLAG_0x228               0x228\n#define FLAG_0x229               0x229\n\n#define FLAG_HIDE_LATI                                   0x22A\n#define FLAG_SHOWN_EON_TICKET                            0x22B\n#define FLAG_DEFEATED_LATIAS                             0x22C\n#define FLAG_DEFEATED_LATIOS                             0x22D\n#define FLAG_CAUGHT_LATIAS                               0x22E\n#define FLAG_CAUGHT_LATIOS                               0x22F\n\n// Story flags\n#define STORY_FLAGS_START 0x230\n#define FLAG_GOT_POTION_ON_ROUTE_1                       0x230\n#define FLAG_GOT_TM34_FROM_SURGE                         0x231\n#define FLAG_GOT_FOSSIL_FROM_MT_MOON                     0x232\n#define FLAG_HELPED_BILL_IN_SEA_COTTAGE                  0x233\n#define FLAG_GOT_SS_TICKET                               0x234\n#define FLAG_GOT_SS_TICKET_DUP                           0x235\n#define FLAG_GOT_TM42_AT_MEMORIAL_PILLAR                 0x236\n#define FLAG_GOT_HM01                                    0x237\n#define FLAG_GOT_HM02                                    0x238\n#define FLAG_GOT_HM03                                    0x239\n#define FLAG_GOT_HM04                                    0x23A\n#define FLAG_GOT_HM05                                    0x23B\n#define FLAG_RESCUED_MR_FUJI                             0x23C\n#define FLAG_GOT_POKE_FLUTE                              0x23D\n#define FLAG_MET_DEVON_SPY                               0x23E\n#define FLAG_GOT_TM28_FROM_ROCKET                        0x23F\n#define FLAG_GOT_OLD_ROD                                 0x240\n#define FLAG_GOT_BIKE_VOUCHER                            0x241\n#define FLAG_DID_NINO_TRADE                              0x242\n#define FLAG_GOT_COIN_CASE                               0x243\n#define FLAG_GOT_GOOD_ROD                                0x244\n#define FLAG_GOT_TM29_FROM_MR_PSYCHIC                    0x245\n#define FLAG_GOT_LAPRAS_FROM_SILPH                       0x246\n#define FLAG_GOT_POKEBALLS_FROM_OAK_AFTER_22_RIVAL       0x247\n#define FLAG_DID_MIMIEN_TRADE                            0x248\n#define FLAG_BOUGHT_MAGIKARP                             0x249\n#define FLAG_DID_ZYNX_TRADE                              0x24A\n#define FLAG_DID_MS_NIDO_TRADE                           0x24B\n#define FLAG_DID_MR_NIDO_TRADE                           0x24C\n#define FLAG_DID_CH_DING_TRADE                           0x24D\n#define FLAG_GOT_TM38_FROM_BLAINE                        0x24E\n#define FLAG_OAK_SKIP_22_RIVAL_CHECK                     0x24F\n#define FLAG_GOT_MASTER_BALL_FROM_SILPH                  0x250\n#define FLAG_DID_NINA_TRADE                              0x251\n#define FLAG_GOT_ITEMFINDER                              0x252\n#define FLAG_WOKE_UP_ROUTE_12_SNORLAX                    0x253\n#define FLAG_GOT_TM39_FROM_BROCK                         0x254\n#define FLAG_GOT_SUPER_ROD                               0x255\n#define FLAG_GOT_EXP_SHARE_FROM_OAKS_AIDE                0x256\n#define FLAG_DID_MARC_TRADE                              0x257\n#define FLAG_BEAT_RIVAL_IN_OAKS_LAB                      0x258\n#define FLAG_GOT_TM06_FROM_KOGA                          0x259\n#define FLAG_WOKE_UP_ROUTE_16_SNORLAX                    0x25A //New\n#define FLAG_GOT_TM27                                    0x25B\n#define FLAG_ROUTE_12_SNORLAX_RETURNED_TO_MOUNTAINS      0x25C //New\n#define FLAG_ROUTE_16_SNORLAX_RETURNED_TO_MOUNTAINS      0x25D //New\n#define FLAG_GOT_OLD_AMBER                               0x25E\n#define FLAG_MEWTWO_FLEW_AWAY                            0x25F //New\n#define FLAG_ARTICUNO_FLEW_AWAY                          0x260 //New\n#define FLAG_ZAPDOS_FLEW_AWAY                            0x261 //New\n#define FLAG_MOLTRES_FLEW_AWAY                           0x262 //New\n#define FLAG_GOT_EEVEE                                   0x263\n#define FLAG_FOUND_BOTH_VERMILION_GYM_SWITCHES           0x264\n#define FLAG_CINNABAR_GYM_QUIZ_1                         0x265\n#define FLAG_PENDING_DAYCARE_EGG                         0x266\n#define FLAG_CINNABAR_GYM_QUIZ_2                         0x267\n#define FLAG_CINNABAR_GYM_QUIZ_3                         0x268\n#define FLAG_CINNABAR_GYM_QUIZ_4                         0x269\n#define FLAG_CINNABAR_GYM_QUIZ_5                         0x26A\n#define FLAG_CINNABAR_GYM_QUIZ_6                         0x26B\n#define FLAG_POKEMON_MANSION_SWITCH_STATE                0x26C\n#define FLAG_OPENED_ROCKET_HIDEOUT                       0x26D\n#define FLAG_GOT_10_COINS_FROM_GAMBLER                   0x26E\n#define FLAG_GOT_20_COINS_FROM_GAMBLER                   0x26F\n#define FLAG_GOT_20_COINS_FROM_GAMBLER_2                 0x270\n#define FLAG_GOT_BICYCLE                                 0x271\n#define FLAG_GOT_DOME_FOSSIL                             0x272\n#define FLAG_GOT_HELIX_FOSSIL                            0x273\n#define FLAG_DID_ESPHERE_TRADE                           0x274\n#define FLAG_DID_TANGENY_TRADE                           0x275\n#define FLAG_DID_SEELOR_TRADE                            0x276\n#define FLAG_MT_EMBER_BOULDER_SHORTCUTS                  0x277\n#define FLAG_GOT_HITMON_FROM_DOJO                        0x278\n#define FLAG_SHOWN_COPPER_CARD_TO_NURSE                  0x279\n#define FLAG_SILPH_2F_DOOR_1                             0x27A\n#define FLAG_SILPH_2F_DOOR_2                             0x27B\n#define FLAG_SILPH_3F_DOOR_1                             0x27C\n#define FLAG_SILPH_3F_DOOR_2                             0x27D\n#define FLAG_SILPH_4F_DOOR_1                             0x27E\n#define FLAG_SILPH_4F_DOOR_2                             0x27F\n#define FLAG_SILPH_5F_DOOR_1                             0x280\n#define FLAG_SILPH_5F_DOOR_2                             0x281\n#define FLAG_SILPH_5F_DOOR_3                             0x282\n#define FLAG_SILPH_6F_DOOR                               0x283\n#define FLAG_SILPH_7F_DOOR_1                             0x284\n#define FLAG_SILPH_7F_DOOR_2                             0x285\n#define FLAG_SILPH_7F_DOOR_3                             0x286\n#define FLAG_SILPH_8F_DOOR                               0x287\n#define FLAG_SILPH_9F_DOOR_1                             0x288\n#define FLAG_SILPH_9F_DOOR_2                             0x289\n#define FLAG_SILPH_9F_DOOR_3                             0x28A\n#define FLAG_SILPH_9F_DOOR_4                             0x28B\n#define FLAG_SILPH_10F_DOOR                              0x28C\n#define FLAG_SILPH_11F_DOOR                              0x28D\n#define FLAG_GOT_DAISY_STARTER                           0x28E\n#define FLAG_SHOWN_OLD_SEA_MAP                           0x28F\n#define FLAG_MET_STICKER_MAN                             0x290\n#define FLAG_PALLET_LADY_NOT_BLOCKING_SIGN               0x291\n#define FLAG_GOT_VS_SEEKER                               0x292\n#define FLAG_GOT_TM19_FROM_ERIKA                         0x293\n#define FLAG_GOT_TM33_FROM_THIRSTY_GIRL                  0x294\n#define FLAG_GOT_TM20_FROM_THIRSTY_GIRL                  0x295\n#define FLAG_GOT_TM16_FROM_THIRSTY_GIRL                  0x296\n#define FLAG_GOT_TM03_FROM_MISTY                         0x297\n#define FLAG_GOT_TM26_FROM_GIOVANNI                      0x298\n#define FLAG_GOT_RIVAL_STARTER_EGG                       0x299\n#define FLAG_GOT_TM04_FROM_SABRINA                       0x29A\n#define FLAG_GOT_FAME_CHECKER                            0x29B\n#define FLAG_GOT_RECORD_SETTING_MAGIKARP                 0x29C\n#define FLAG_TWO_ISLAND_SHOP_INTRODUCED                  0x29D\n#define FLAG_TWO_ISLAND_SHOP_EXPANDED_1                  0x29E\n#define FLAG_TWO_ISLAND_SHOP_EXPANDED_2                  0x29F\n#define FLAG_TWO_ISLAND_SHOP_EXPANDED_3                  0x2A0\n#define FLAG_SEVII_DETOUR_FINISHED                       0x2A1\n#define FLAG_VISITED_TWO_ISLAND                          0x2A2\n#define FLAG_RESCUED_LOSTELLE                            0x2A3\n#define FLAG_FOUGHT_MEW                                  0x2A4\n#define FLAG_CAN_USE_ROCKET_HIDEOUT_LIFT                 0x2A5\n#define FLAG_GOT_TEA                                     0x2A6\n\n#define FLAG_RECEIVED_AURORA_TICKET                      0x2A7\n#define FLAG_RECEIVED_MYSTIC_TICKET                      0x2A8\n#define FLAG_RECEIVED_OLD_SEA_MAP                        0x2A9\n#define FLAG_WONDER_CARD_UNUSED_1                        0x2AA\n#define FLAG_WONDER_CARD_UNUSED_2                        0x2AB\n#define FLAG_WONDER_CARD_UNUSED_3                        0x2AC\n#define FLAG_WONDER_CARD_UNUSED_4                        0x2AD\n#define FLAG_WONDER_CARD_UNUSED_5                        0x2AE\n#define FLAG_WONDER_CARD_UNUSED_6                        0x2AF\n#define FLAG_WONDER_CARD_UNUSED_7                        0x2B0\n#define FLAG_WONDER_CARD_UNUSED_8                        0x2B1\n#define FLAG_WONDER_CARD_UNUSED_9                        0x2B2\n#define FLAG_WONDER_CARD_UNUSED_10                       0x2B3\n#define FLAG_WONDER_CARD_UNUSED_11                       0x2B4\n#define FLAG_WONDER_CARD_UNUSED_12                       0x2B5\n#define FLAG_WONDER_CARD_UNUSED_13                       0x2B6\n#define FLAG_WONDER_CARD_UNUSED_14                       0x2B7\n#define FLAG_WONDER_CARD_UNUSED_15                       0x2B8\n#define FLAG_WONDER_CARD_UNUSED_16                       0x2B9\n#define FLAG_WONDER_CARD_UNUSED_17                       0x2BA\n#define NUM_WONDER_CARD_FLAGS                            (1 + FLAG_WONDER_CARD_UNUSED_17 - FLAG_RECEIVED_AURORA_TICKET)\n\n#define FLAG_GOT_POWDER_JAR                              0x2BB\n#define FLAG_FOUGHT_MEWTWO                               0x2BC\n#define FLAG_FOUGHT_MOLTRES                              0x2BD\n#define FLAG_FOUGHT_ARTICUNO                             0x2BE\n#define FLAG_FOUGHT_ZAPDOS                               0x2BF\n#define FLAG_TUTOR_DOUBLE_EDGE                           0x2C0\n#define FLAG_TUTOR_THUNDER_WAVE                          0x2C1\n#define FLAG_TUTOR_ROCK_SLIDE                            0x2C2\n#define FLAG_TUTOR_EXPLOSION                             0x2C3\n#define FLAG_TUTOR_MEGA_PUNCH                            0x2C4\n#define FLAG_TUTOR_MEGA_KICK                             0x2C5\n#define FLAG_TUTOR_DREAM_EATER                           0x2C6\n#define FLAG_TUTOR_SOFT_BOILED                           0x2C7\n#define FLAG_TUTOR_SUBSTITUTE                            0x2C8\n#define FLAG_TUTOR_SWORDS_DANCE                          0x2C9\n#define FLAG_TUTOR_SEISMIC_TOSS                          0x2CA\n#define FLAG_TUTOR_COUNTER                               0x2CB\n#define FLAG_TUTOR_METRONOME                             0x2CC\n#define FLAG_TUTOR_MIMIC                                 0x2CD\n#define FLAG_TUTOR_BODY_SLAM                             0x2CE\n#define FLAG_VISITED_OAKS_LAB                            0x2CF\n#define FLAG_FOUGHT_POWER_PLANT_ELECTRODE_1              0x2D0\n#define FLAG_FOUGHT_POWER_PLANT_ELECTRODE_2              0x2D1\n#define FLAG_STOPPED_SEAFOAM_B3F_CURRENT                 0x2D2\n#define FLAG_STOPPED_SEAFOAM_B4F_CURRENT                 0x2D3\n#define FLAG_TALKED_TO_LORELEI_AFTER_WAREHOUSE           0x2D4\n#define FLAG_DEFEATED_ROCKETS_IN_WAREHOUSE               0x2D5\n#define FLAG_UNLOCKED_ROCKET_WAREHOUSE                   0x2D6\n#define FLAG_NO_ROOM_FOR_TM42_AT_MEMORIAL_PILLAR         0x2D7\n#define FLAG_LEARNED_YES_NAH_CHANSEY                     0x2D8\n#define FLAG_GOT_NEST_BALL_FROM_WATER_PATH_HOUSE_1       0x2D9\n#define FLAG_GOT_TOGEPI_EGG                              0x2DA\n#define FLAG_NO_ROOM_FOR_TOGEPI_EGG                      0x2DB\n#define FLAG_RECOVERED_SAPPHIRE                          0x2DC\n#define FLAG_GOT_RUBY                                    0x2DD\n#define FLAG_TUTOR_FRENZY_PLANT                          0x2DE\n#define FLAG_TUTOR_BLAST_BURN                            0x2DF\n#define FLAG_TUTOR_HYDRO_CANNON                          0x2E0\n#define FLAG_LEARNED_ALL_MOVES_AT_CAPE_BRINK             0x2E1\n#define FLAG_GOT_NUGGET_FROM_DUNSPARCE_TUNNEL            0x2E2\n#define FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE             0x2E3\n#define FLAG_FOUGHT_DEOXYS                               0x2E4\n#define FLAG_DEFEATED_MEW                                0x2E5\n#define FLAG_MEW_FLEW_AWAY                               0x2E6\n#define FLAG_HIDE_MEW                                    0x2E7\n#define FLAG_CAUGHT_MEW                                  0x2E8\n#define FLAG_CAUGHT_RAIKOU                               0x2E9\n#define FLAG_CAUGHT_ENTEI                                0x2EA\n#define FLAG_CAUGHT_SUICUNE                              0x2EB\n#define FLAG_REVIVED_DOME                                0x2EC\n#define FLAG_REVIVED_HELIX                               0x2ED\n#define FLAG_REVIVED_AMBER                               0x2EE\n#define FLAG_GOT_HM06                                    0x2EF\n#define FLAG_SHOWN_MYSTIC_TICKET                         0x2F0\n#define FLAG_SHOWN_AURORA_TICKET                         0x2F1\n#define FLAG_FOUGHT_LUGIA                                0x2F2\n#define FLAG_FOUGHT_HO_OH                                0x2F3\n#define FLAG_OAK_SAW_DEX_COMPLETION                      0x2F4\n#define FLAG_LUGIA_FLEW_AWAY                             0x2F5\n#define FLAG_HO_OH_FLEW_AWAY                             0x2F6\n#define FLAG_DEOXYS_FLEW_AWAY                            0x2F7\n#define FLAG_TALKED_TO_TEA_LADY_AFTER_HOF                0x2F8\n#define FLAG_TALKED_TO_OAKS_AIDE_IN_VERMILION            0x2F9\n#define FLAG_GOT_EVERSTONE_FROM_OAKS_AIDE                0x2FA\n#define FLAG_GOT_MOON_STONE_FROM_JOYFUL_GAME_CORNER      0x2FB\n#define FLAG_GOT_FULL_RESTORE_FROM_THREE_ISLAND_DEFENDER 0x2FC\n#define FLAG_GOT_AMULET_COIN_FROM_OAKS_AIDE              0x2FD\n#define FLAG_NO_ROOM_FOR_JOYFUL_GAME_CORNER_MOON_STONE   0x2FE\n#define FLAG_OAKS_RATING_IS_VIA_PC                       0x2FF\n\n// Nuzlocke Flags\n#define NUZLOCKE_FLAGS_START 0x300\n\n#define FLAG_NUZLOCKE_PALLET           0x300\n#define FLAG_NUZLOCKE_VIRIDIAN         0x301\n#define FLAG_NUZLOCKE_CERULEAN         0x302\n#define FLAG_NUZLOCKE_VERMILION        0x303\n#define FLAG_NUZLOCKE_CELADON          0x304\n#define FLAG_NUZLOCKE_FUCHSIA          0x305\n#define FLAG_NUZLOCKE_CINNABAR         0x306\n#define FLAG_NUZLOCKE_R1               0x307\n#define FLAG_NUZLOCKE_R2               0x308\n#define FLAG_NUZLOCKE_R3               0x309\n#define FLAG_NUZLOCKE_R4               0x30A\n#define FLAG_NUZLOCKE_R5               0x30B\n#define FLAG_NUZLOCKE_R6               0x30C\n#define FLAG_NUZLOCKE_R7               0x30D\n#define FLAG_NUZLOCKE_R8               0x30E\n#define FLAG_NUZLOCKE_R9               0x30F\n#define FLAG_NUZLOCKE_R10              0x310\n#define FLAG_NUZLOCKE_R11              0x311\n#define FLAG_NUZLOCKE_R12              0x312\n#define FLAG_NUZLOCKE_R13              0x313\n#define FLAG_NUZLOCKE_R14              0x314\n#define FLAG_NUZLOCKE_R15              0x315\n#define FLAG_NUZLOCKE_R16              0x316\n#define FLAG_NUZLOCKE_R17              0x317\n#define FLAG_NUZLOCKE_R18              0x318\n#define FLAG_NUZLOCKE_R19              0x319\n#define FLAG_NUZLOCKE_R20              0x31A\n#define FLAG_NUZLOCKE_R21              0x31B\n#define FLAG_NUZLOCKE_R22              0x31C\n#define FLAG_NUZLOCKE_R23              0x31D\n#define FLAG_NUZLOCKE_R24              0x31E\n#define FLAG_NUZLOCKE_R25              0x31F\n#define FLAG_NUZLOCKE_VIRIDIAN_FOREST  0x320\n#define FLAG_NUZLOCKE_MT_MOON          0x321\n#define FLAG_NUZLOCKE_SS_ANNE          0x322\n#define FLAG_NUZLOCKE_DIGLETTS_CAVE    0x323\n#define FLAG_NUZLOCKE_VICTORY_ROAD     0x324\n#define FLAG_NUZLOCKE_POKEMON_MANSION  0x325\n#define FLAG_NUZLOCKE_SAFARI_CENTER    0x326\n#define FLAG_NUZLOCKE_ROCK_TUNNEL      0x327\n#define FLAG_NUZLOCKE_SEAFOAM_ISLANDS  0x328\n#define FLAG_NUZLOCKE_POKEMON_TOWER    0x329\n#define FLAG_NUZLOCKE_CERULEAN_CAVE    0x32A\n#define FLAG_NUZLOCKE_POWER_PLANT      0x32B\n#define FLAG_NUZLOCKE_ONE_ISLAND       0x32C\n#define FLAG_NUZLOCKE_FOUR_ISLAND      0x32D\n#define FLAG_NUZLOCKE_FIVE_ISLAND      0x32E\n#define FLAG_NUZLOCKE_KINDLE_ROAD      0x32F\n#define FLAG_NUZLOCKE_TREASURE_BEACH   0x330\n#define FLAG_NUZLOCKE_CAPE_BRINK       0x331\n#define FLAG_NUZLOCKE_BOND_BRIDGE      0x332\n#define FLAG_NUZLOCKE_THREE_ISLE_PORT  0x333\n#define FLAG_NUZLOCKE_RESORT_GORGEOUS  0x334\n#define FLAG_NUZLOCKE_WATER_LABYRINTH  0x335\n#define FLAG_NUZLOCKE_FIVE_ISLE_MEADOW 0x336\n#define FLAG_NUZLOCKE_MEMORIAL_PILLAR  0x337\n#define FLAG_NUZLOCKE_OUTCAST_ISLAND   0x338\n#define FLAG_NUZLOCKE_GREEN_PATH       0x339\n#define FLAG_NUZLOCKE_WATER_PATH       0x33A\n#define FLAG_NUZLOCKE_RUIN_VALLEY      0x33B\n#define FLAG_NUZLOCKE_TRAINER_TOWER    0x33C\n#define FLAG_NUZLOCKE_CANYON_ENTRANCE  0x33D\n#define FLAG_NUZLOCKE_SEVAULT_CANYON   0x33E\n#define FLAG_NUZLOCKE_TANOBY_RUINS     0x33F\n#define FLAG_NUZLOCKE_NAVEL_ROCK       0x340\n#define FLAG_NUZLOCKE_MT_EMBER         0x341\n#define FLAG_NUZLOCKE_BERRY_FOREST     0x342\n#define FLAG_NUZLOCKE_ICEFALL_CAVE     0x343\n#define FLAG_NUZLOCKE_LOST_CAVE        0x344\n#define FLAG_NUZLOCKE_PATTERN_BUSH     0x345\n#define FLAG_NUZLOCKE_ALTERING_CAVE    0x346\n#define FLAG_NUZLOCKE_MONEAN_CHAMBER   0x347\n#define FLAG_NUZLOCKE_LIPTOO_CHAMBER   0x348\n#define FLAG_NUZLOCKE_WEEPTH_CHAMBER   0x349\n#define FLAG_NUZLOCKE_DILFORD_CHAMBER  0x34A\n#define FLAG_NUZLOCKE_SCUFIB_CHAMBER   0x34B\n#define FLAG_NUZLOCKE_RIXY_CHAMBER     0x34C\n#define FLAG_NUZLOCKE_VIAPOIS_CHAMBER  0x34D\n#define FLAG_NUZLOCKE_SAFARI_EAST      0x34E\n#define FLAG_NUZLOCKE_SAFARI_NORTH     0x34F\n#define FLAG_NUZLOCKE_SAFARI_WEST      0x350\n#define FLAG_NUZLOCKE_SAFARI_NORTH_WEST 0x351\n#define FLAG_NUZLOCKE_SAFARI_NORTH_EAST 0x352\n#define FLAG_NUZLOCKE_ARTISAN_CAVE     0x353\n#define FLAG_NUZLOCKE_SOUTHERN_ISLAND  0x354\n#define FLAG_NUZLOCKE_BATTLE_FRONTIER  0x355\n\n// Unused?\n#define FLAG_0x356               0x356\n#define FLAG_0x357               0x357\n#define FLAG_0x358               0x358\n#define FLAG_0x359               0x359\n\n#define FLAG_TOLD_SAFARI_EXPANSION     0x35A\n#define FLAG_FOUR_ISLAND_SNOW          0x35B\n\n// Unused?\n#define FLAG_0x35C               0x35C\n#define FLAG_0x35D               0x35D\n#define FLAG_0x35E               0x35E\n#define FLAG_0x35F               0x35F\n#define FLAG_0x360               0x360\n#define FLAG_0x361               0x361\n#define FLAG_0x362               0x362\n#define FLAG_0x363               0x363\n#define FLAG_0x364               0x364\n#define FLAG_0x365               0x365\n#define FLAG_0x366               0x366\n#define FLAG_0x367               0x367\n#define FLAG_0x368               0x368\n#define FLAG_0x369               0x369\n#define FLAG_0x36A               0x36A\n#define FLAG_0x36B               0x36B\n#define FLAG_0x36C               0x36C\n#define FLAG_0x36D               0x36D\n#define FLAG_0x36E               0x36E\n#define FLAG_0x36F               0x36F\n#define FLAG_0x370               0x370\n#define FLAG_0x371               0x371\n#define FLAG_0x372               0x372\n#define FLAG_0x373               0x373\n#define FLAG_0x374               0x374\n#define FLAG_0x375               0x375\n#define FLAG_0x376               0x376\n#define FLAG_0x377               0x377\n#define FLAG_0x378               0x378\n#define FLAG_0x379               0x379\n#define FLAG_0x37A               0x37A\n#define FLAG_0x37B               0x37B\n#define FLAG_0x37C               0x37C\n#define FLAG_0x37D               0x37D\n#define FLAG_0x37E               0x37E\n#define FLAG_0x37F               0x37F\n#define FLAG_0x380               0x380\n#define FLAG_0x381               0x381\n#define FLAG_0x382               0x382\n#define FLAG_0x383               0x383\n#define FLAG_0x384               0x384\n#define FLAG_0x385               0x385\n#define FLAG_0x386               0x386\n#define FLAG_0x387               0x387\n#define FLAG_0x388               0x388\n#define FLAG_0x389               0x389\n#define FLAG_0x38A               0x38A\n#define FLAG_0x38B               0x38B\n#define FLAG_0x38C               0x38C\n#define FLAG_0x38D               0x38D\n#define FLAG_0x38E               0x38E\n#define FLAG_0x38F               0x38F\n#define FLAG_0x390               0x390\n#define FLAG_0x391               0x391\n#define FLAG_0x392               0x392\n#define FLAG_0x393               0x393\n#define FLAG_0x394               0x394\n#define FLAG_0x395               0x395\n#define FLAG_0x396               0x396\n#define FLAG_0x397               0x397\n#define FLAG_0x398               0x398\n#define FLAG_0x399               0x399\n#define FLAG_0x39A               0x39A\n#define FLAG_0x39B               0x39B\n#define FLAG_0x39C               0x39C\n#define FLAG_0x39D               0x39D\n#define FLAG_0x39E               0x39E\n#define FLAG_0x39F               0x39F\n#define FLAG_0x3A0               0x3A0\n#define FLAG_0x3A1               0x3A1\n#define FLAG_0x3A2               0x3A2\n#define FLAG_0x3A3               0x3A3\n#define FLAG_0x3A4               0x3A4\n#define FLAG_0x3A5               0x3A5\n#define FLAG_0x3A6               0x3A6\n#define FLAG_0x3A7               0x3A7\n#define FLAG_0x3A8               0x3A8\n#define FLAG_0x3A9               0x3A9\n#define FLAG_0x3AA               0x3AA\n#define FLAG_0x3AB               0x3AB\n#define FLAG_0x3AC               0x3AC\n#define FLAG_0x3AD               0x3AD\n#define FLAG_0x3AE               0x3AE\n#define FLAG_0x3AF               0x3AF\n#define FLAG_0x3B0               0x3B0\n#define FLAG_0x3B1               0x3B1\n#define FLAG_0x3B2               0x3B2\n#define FLAG_0x3B3               0x3B3\n#define FLAG_0x3B4               0x3B4\n#define FLAG_0x3B5               0x3B5\n#define FLAG_0x3B6               0x3B6\n#define FLAG_0x3B7               0x3B7\n#define FLAG_0x3B8               0x3B8\n#define FLAG_0x3B9               0x3B9\n#define FLAG_0x3BA               0x3BA\n#define FLAG_0x3BB               0x3BB\n#define FLAG_0x3BC               0x3BC\n#define FLAG_0x3BD               0x3BD\n#define FLAG_0x3BE               0x3BE\n#define FLAG_0x3BF               0x3BF\n#define FLAG_0x3C0               0x3C0\n#define FLAG_0x3C1               0x3C1\n#define FLAG_0x3C2               0x3C2\n#define FLAG_0x3C3               0x3C3\n#define FLAG_0x3C4               0x3C4\n#define FLAG_0x3C5               0x3C5\n#define FLAG_0x3C6               0x3C6\n#define FLAG_0x3C7               0x3C7\n#define FLAG_0x3C8               0x3C8\n#define FLAG_0x3C9               0x3C9\n#define FLAG_0x3CA               0x3CA\n#define FLAG_0x3CB               0x3CB\n#define FLAG_0x3CC               0x3CC\n#define FLAG_0x3CD               0x3CD\n#define FLAG_0x3CE               0x3CE\n#define FLAG_0x3CF               0x3CF\n//New move tutors\n#define FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER  0x3D0\n#define FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT      0x3D1\n#define FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH 0x3D2\n#define FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK   0x3D3\n#define FLAG_MOVE_TUTOR_TAUGHT_NIGHTMARE    0x3D4\n#define FLAG_MOVE_TUTOR_TAUGHT_SELFDESTRUCT 0x3D5\n#define FLAG_MOVE_TUTOR_TAUGHT_SKY_ATTACK   0x3D6\n#define FLAG_MOVE_TUTOR_TAUGHT_SWAGGER      0x3D7\n#define FLAG_MYSTERY_GIFT_DONE   0x3D8\n#define FLAG_MYSTERY_GIFT_1      0x3D9\n#define FLAG_MYSTERY_GIFT_2      0x3DA\n#define FLAG_MYSTERY_GIFT_3      0x3DB\n#define FLAG_MYSTERY_GIFT_4      0x3DC\n#define FLAG_MYSTERY_GIFT_5      0x3DD\n#define FLAG_MYSTERY_GIFT_6      0x3DE\n#define FLAG_MYSTERY_GIFT_7      0x3DF\n#define FLAG_MYSTERY_GIFT_8      0x3E0\n#define FLAG_MYSTERY_GIFT_9      0x3E1\n#define FLAG_MYSTERY_GIFT_10     0x3E2\n#define FLAG_MYSTERY_GIFT_11     0x3E3\n#define FLAG_MYSTERY_GIFT_12     0x3E4\n#define FLAG_MYSTERY_GIFT_13     0x3E5\n#define FLAG_MYSTERY_GIFT_14     0x3E6\n#define FLAG_MYSTERY_GIFT_15     0x3E7\n\n#define FLAG_HIDDEN_ITEMS_START 1000 // 0x3E8\n\n#define FLAG_HIDDEN_ITEM_VIRIDIAN_FOREST_POTION                            (FLAG_HIDDEN_ITEMS_START +   0)\n#define FLAG_HIDDEN_ITEM_VIRIDIAN_FOREST_ANTIDOTE                          (FLAG_HIDDEN_ITEMS_START +   1)\n#define FLAG_HIDDEN_ITEM_MT_MOON_B2F_MOON_STONE                            (FLAG_HIDDEN_ITEMS_START +   2)\n#define FLAG_HIDDEN_ITEM_MT_MOON_B2F_ETHER                                 (FLAG_HIDDEN_ITEMS_START +   3)\n#define FLAG_HIDDEN_ITEM_ROUTE25_ELIXIR                                    (FLAG_HIDDEN_ITEMS_START +   4)\n#define FLAG_HIDDEN_ITEM_ROUTE25_ETHER                                     (FLAG_HIDDEN_ITEMS_START +   5)\n#define FLAG_HIDDEN_ITEM_ROUTE9_ETHER                                      (FLAG_HIDDEN_ITEMS_START +   6)\n#define FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHWEST_SHELL_BELL                  (FLAG_HIDDEN_ITEMS_START +   7) // New\n#define FLAG_HIDDEN_ITEM_SSANNE_B1F_CORRIDOR_HYPER_POTION                  (FLAG_HIDDEN_ITEMS_START +   8)\n#define FLAG_HIDDEN_ITEM_ROUTE10_SUPER_POTION                              (FLAG_HIDDEN_ITEMS_START +   9)\n#define FLAG_HIDDEN_ITEM_ROUTE10_MAX_ETHER                                 (FLAG_HIDDEN_ITEMS_START +  10)\n#define FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B1F_PP_UP                          (FLAG_HIDDEN_ITEMS_START +  11)\n#define FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B3F_NUGGET                         (FLAG_HIDDEN_ITEMS_START +  12)\n#define FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B4F_NEST_BALL                      (FLAG_HIDDEN_ITEMS_START +  13)\n#define FLAG_HIDDEN_ITEM_POKEMON_TOWER_5F_BIG_MUSHROOM                     (FLAG_HIDDEN_ITEMS_START +  14)\n#define FLAG_HIDDEN_ITEM_ROUTE13_PP_UP                                     (FLAG_HIDDEN_ITEMS_START +  15)\n#define FLAG_HIDDEN_ITEM_ROUTE20_UNDERWATER_BIG_PEARL                      (FLAG_HIDDEN_ITEMS_START +  16) // New\n#define FLAG_HIDDEN_ITEM_ROUTE17_RARE_CANDY                                (FLAG_HIDDEN_ITEMS_START +  17)\n#define FLAG_HIDDEN_ITEM_ROUTE17_FULL_RESTORE                              (FLAG_HIDDEN_ITEMS_START +  18)\n#define FLAG_HIDDEN_ITEM_ROUTE17_PP_UP                                     (FLAG_HIDDEN_ITEMS_START +  19)\n#define FLAG_HIDDEN_ITEM_ROUTE17_MAX_REVIVE                                (FLAG_HIDDEN_ITEMS_START +  20)\n#define FLAG_HIDDEN_ITEM_ROUTE17_MAX_ELIXIR                                (FLAG_HIDDEN_ITEMS_START +  21)\n#define FLAG_HIDDEN_ITEM_SAFARI_ZONE_CENTER_LEAF_STONE                     (FLAG_HIDDEN_ITEMS_START +  22)\n#define FLAG_HIDDEN_ITEM_SAFARI_ZONE_WEST_REVIVE                           (FLAG_HIDDEN_ITEMS_START +  23)\n#define FLAG_HIDDEN_ITEM_SILPH_CO_5F_ELIXIR                                (FLAG_HIDDEN_ITEMS_START +  24)\n#define FLAG_HIDDEN_ITEM_SILPH_CO_9F_MAX_POTION                            (FLAG_HIDDEN_ITEMS_START +  25)\n#define FLAG_HIDDEN_ITEM_SAFFRON_CITY_COPYCATS_HOUSE_2F_NUGGET             (FLAG_HIDDEN_ITEMS_START +  26)\n#define FLAG_HIDDEN_ITEM_POWER_PLANT_MAX_ELIXIR                            (FLAG_HIDDEN_ITEMS_START +  27)\n#define FLAG_HIDDEN_ITEM_POWER_PLANT_THUNDER_STONE                         (FLAG_HIDDEN_ITEMS_START +  28)\n#define FLAG_HIDDEN_ITEM_SEAFOAM_ISLANDS_B3F_NUGGET                        (FLAG_HIDDEN_ITEMS_START +  29)\n#define FLAG_HIDDEN_ITEM_SEAFOAM_ISLANDS_B4F_WATER_STONE                   (FLAG_HIDDEN_ITEMS_START +  30)\n#define FLAG_HIDDEN_ITEM_POKEMON_MANSION_1F_MOON_STONE                     (FLAG_HIDDEN_ITEMS_START +  31)\n#define FLAG_HIDDEN_ITEM_POKEMON_MANSION_3F_RARE_CANDY                     (FLAG_HIDDEN_ITEMS_START +  32)\n#define FLAG_HIDDEN_ITEM_POKEMON_MANSION_B1F_ELIXIR                        (FLAG_HIDDEN_ITEMS_START +  33)\n#define FLAG_HIDDEN_ITEM_ROUTE23_FULL_RESTORE                              (FLAG_HIDDEN_ITEMS_START +  34)\n#define FLAG_HIDDEN_ITEM_ROUTE23_ULTRA_BALL                                (FLAG_HIDDEN_ITEMS_START +  35)\n#define FLAG_HIDDEN_ITEM_ROUTE23_MAX_ETHER                                 (FLAG_HIDDEN_ITEMS_START +  36)\n#define FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL                        (FLAG_HIDDEN_ITEMS_START +  37)\n#define FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_FULL_RESTORE                      (FLAG_HIDDEN_ITEMS_START +  38)\n#define FLAG_HIDDEN_ITEM_CERULEAN_CAVE_1F_ULTRA_BALL                       (FLAG_HIDDEN_ITEMS_START +  39)\n#define FLAG_HIDDEN_ITEM_ROUTE11_TAMATO_BERRY                              (FLAG_HIDDEN_ITEMS_START +  40) // New\n#define FLAG_HIDDEN_ITEM_ROUTE11_ESCAPE_ROPE                               (FLAG_HIDDEN_ITEMS_START +  41)\n#define FLAG_HIDDEN_ITEM_ROUTE12_HYPER_POTION                              (FLAG_HIDDEN_ITEMS_START +  42)\n#define FLAG_HIDDEN_ITEM_CAPE_BRINK_GREPA_BERRY                            (FLAG_HIDDEN_ITEMS_START +  43) // New\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_PORT_TAMATO_BERRY                    (FLAG_HIDDEN_ITEMS_START +  44) // New\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_SITRUS_BERRY            (FLAG_HIDDEN_ITEMS_START +  45) // New\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_TAMATO_BERRY            (FLAG_HIDDEN_ITEMS_START +  46) // New\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_PP_UP                                (FLAG_HIDDEN_ITEMS_START +  47)\n#define FLAG_HIDDEN_ITEM_VERMILION_CITY_MAX_ETHER                          (FLAG_HIDDEN_ITEMS_START +  48)\n#define FLAG_HIDDEN_ITEM_CERULEAN_CITY_RARE_CANDY                          (FLAG_HIDDEN_ITEMS_START +  49)\n#define FLAG_HIDDEN_ITEM_ROUTE4_GREAT_BALL                                 (FLAG_HIDDEN_ITEMS_START +  50)\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS                    (FLAG_HIDDEN_ITEMS_START +  51)\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_2                  (FLAG_HIDDEN_ITEMS_START +  52)\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_3                  (FLAG_HIDDEN_ITEMS_START +  53)\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_4                  (FLAG_HIDDEN_ITEMS_START +  54)\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_5                  (FLAG_HIDDEN_ITEMS_START +  55)\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_6                  (FLAG_HIDDEN_ITEMS_START +  56)\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_7                  (FLAG_HIDDEN_ITEMS_START +  57)\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_8                  (FLAG_HIDDEN_ITEMS_START +  58)\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_9                  (FLAG_HIDDEN_ITEMS_START +  59)\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_10                 (FLAG_HIDDEN_ITEMS_START +  60)\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_11                 (FLAG_HIDDEN_ITEMS_START +  61)\n#define FLAG_HIDDEN_ITEM_CELADON_CITY_GAME_CORNER_COINS_12                 (FLAG_HIDDEN_ITEMS_START +  62)\n#define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_SEVAULT_CANYON_CHERI_BERRY           (FLAG_HIDDEN_ITEMS_START +  63)\n#define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_4           (FLAG_HIDDEN_ITEMS_START +  64)\n#define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE             (FLAG_HIDDEN_ITEMS_START +  65)\n#define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_2           (FLAG_HIDDEN_ITEMS_START +  66)\n#define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_3           (FLAG_HIDDEN_ITEMS_START +  67)\n#define FLAG_HIDDEN_ITEM_FIVE_ISLAND_ROCKET_WAREHOUSE_NEST_BALL            (FLAG_HIDDEN_ITEMS_START +  68)\n#define FLAG_HIDDEN_ITEM_FIVE_ISLAND_ROCKET_WAREHOUSE_NET_BALL             (FLAG_HIDDEN_ITEMS_START +  69)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_POTION        (FLAG_HIDDEN_ITEMS_START +  70)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ANTIDOTE      (FLAG_HIDDEN_ITEMS_START +  71)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_PARALYZE_HEAL (FLAG_HIDDEN_ITEMS_START +  72)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_AWAKENING     (FLAG_HIDDEN_ITEMS_START +  73)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_BURN_HEAL     (FLAG_HIDDEN_ITEMS_START +  74)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ICE_HEAL      (FLAG_HIDDEN_ITEMS_START +  75)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ETHER         (FLAG_HIDDEN_ITEMS_START +  76)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_POTION          (FLAG_HIDDEN_ITEMS_START +  77)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ANTIDOTE        (FLAG_HIDDEN_ITEMS_START +  78)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_PARALYZE_HEAL   (FLAG_HIDDEN_ITEMS_START +  79)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_AWAKENING       (FLAG_HIDDEN_ITEMS_START +  80)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_BURN_HEAL       (FLAG_HIDDEN_ITEMS_START +  81)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ICE_HEAL        (FLAG_HIDDEN_ITEMS_START +  82)\n#define FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ETHER           (FLAG_HIDDEN_ITEMS_START +  83)\n#define FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM                         (FLAG_HIDDEN_ITEMS_START +  84)\n#define FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_2                       (FLAG_HIDDEN_ITEMS_START +  85)\n#define FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_3                       (FLAG_HIDDEN_ITEMS_START +  86)\n#define FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM                          (FLAG_HIDDEN_ITEMS_START +  87)\n#define FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM_2                        (FLAG_HIDDEN_ITEMS_START +  88)\n#define FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM_3                        (FLAG_HIDDEN_ITEMS_START +  89)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_POMEG_BERRY             (FLAG_HIDDEN_ITEMS_START +  90) // Changed from Razz\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_KELPSY_BERRY            (FLAG_HIDDEN_ITEMS_START +  91) // Changed from Bluk\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_QUALOT_BERRY            (FLAG_HIDDEN_ITEMS_START +  92) // Changed from Nanab\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_HONDEW_BERRY            (FLAG_HIDDEN_ITEMS_START +  93) // Changed from Wepear\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ORAN_BERRY              (FLAG_HIDDEN_ITEMS_START +  94)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHERI_BERRY             (FLAG_HIDDEN_ITEMS_START +  95)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHESTO_BERRY            (FLAG_HIDDEN_ITEMS_START +  96)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PECHA_BERRY             (FLAG_HIDDEN_ITEMS_START +  97)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_RAWST_BERRY             (FLAG_HIDDEN_ITEMS_START +  98)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ASPEAR_BERRY            (FLAG_HIDDEN_ITEMS_START +  99)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PERSIM_BERRY            (FLAG_HIDDEN_ITEMS_START + 100)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_GREPA_BERRY             (FLAG_HIDDEN_ITEMS_START + 101) // Changed from Pinap\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_LUM_BERRY               (FLAG_HIDDEN_ITEMS_START + 102)\n#define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STARDUST                (FLAG_HIDDEN_ITEMS_START + 103)\n#define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STARDUST_2              (FLAG_HIDDEN_ITEMS_START + 104)\n#define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_PEARL                   (FLAG_HIDDEN_ITEMS_START + 105)\n#define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_PEARL_2                 (FLAG_HIDDEN_ITEMS_START + 106)\n#define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL              (FLAG_HIDDEN_ITEMS_START + 107)\n#define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL_2            (FLAG_HIDDEN_ITEMS_START + 108)\n#define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STAR_PIECE              (FLAG_HIDDEN_ITEMS_START + 109)\n#define FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_BIG_PEARL               (FLAG_HIDDEN_ITEMS_START + 110)\n#define FLAG_HIDDEN_ITEM_TWO_ISLAND_CAPE_BRINK_RARE_CANDY                  (FLAG_HIDDEN_ITEMS_START + 111)\n#define FLAG_HIDDEN_ITEM_PEWTER_CITY_POKE_BALL                             (FLAG_HIDDEN_ITEMS_START + 112)\n#define FLAG_HIDDEN_ITEM_ROUTE3_ORAN_BERRY                                 (FLAG_HIDDEN_ITEMS_START + 113)\n#define FLAG_HIDDEN_ITEM_ROUTE4_PERSIM_BERRY                               (FLAG_HIDDEN_ITEMS_START + 114)\n#define FLAG_HIDDEN_ITEM_ROUTE24_PECHA_BERRY                               (FLAG_HIDDEN_ITEMS_START + 115)\n#define FLAG_HIDDEN_ITEM_ROUTE25_ORAN_BERRY                                (FLAG_HIDDEN_ITEMS_START + 116)\n#define FLAG_HIDDEN_ITEM_ROUTE25_POMEG_BERRY                               (FLAG_HIDDEN_ITEMS_START + 117) // Changed from Bluk\n#define FLAG_HIDDEN_ITEM_ROUTE6_SITRUS_BERRY                               (FLAG_HIDDEN_ITEMS_START + 118)\n#define FLAG_HIDDEN_ITEM_ROUTE6_RARE_CANDY                                 (FLAG_HIDDEN_ITEMS_START + 119)\n#define FLAG_HIDDEN_ITEM_SSANNE_KITCHEN_PECHA_BERRY                        (FLAG_HIDDEN_ITEMS_START + 120)\n#define FLAG_HIDDEN_ITEM_SSANNE_KITCHEN_CHERI_BERRY                        (FLAG_HIDDEN_ITEMS_START + 121)\n#define FLAG_HIDDEN_ITEM_SSANNE_KITCHEN_CHESTO_BERRY                       (FLAG_HIDDEN_ITEMS_START + 122)\n#define FLAG_HIDDEN_ITEM_ROUTE9_RARE_CANDY                                 (FLAG_HIDDEN_ITEMS_START + 123)\n#define FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHWEST_LIECHI_BERRY                (FLAG_HIDDEN_ITEMS_START + 124) // New\n#define FLAG_HIDDEN_ITEM_ROUTE10_PERSIM_BERRY                              (FLAG_HIDDEN_ITEMS_START + 125)\n#define FLAG_HIDDEN_ITEM_ROUTE10_CHERI_BERRY                               (FLAG_HIDDEN_ITEMS_START + 126)\n#define FLAG_HIDDEN_ITEM_ROUTE8_RAWST_BERRY                                (FLAG_HIDDEN_ITEMS_START + 127)\n#define FLAG_HIDDEN_ITEM_ROUTE8_LUM_BERRY                                  (FLAG_HIDDEN_ITEMS_START + 128)\n#define FLAG_HIDDEN_ITEM_ROUTE8_LEPPA_BERRY                                (FLAG_HIDDEN_ITEMS_START + 129)\n#define FLAG_HIDDEN_ITEM_ROUTE12_RARE_CANDY                                (FLAG_HIDDEN_ITEMS_START + 130)\n#define FLAG_HIDDEN_ITEM_ROUTE12_LEFTOVERS                                 (FLAG_HIDDEN_ITEMS_START + 131)\n#define FLAG_HIDDEN_ITEM_ROUTE16_LEFTOVERS                                 (FLAG_HIDDEN_ITEMS_START + 132)\n#define FLAG_HIDDEN_ITEM_FUCHSIA_CITY_MAX_REVIVE                           (FLAG_HIDDEN_ITEMS_START + 133)\n#define FLAG_HIDDEN_ITEM_ROCKET_HIDEOUT_B4F_NET_BALL                       (FLAG_HIDDEN_ITEMS_START + 134)\n#define FLAG_HIDDEN_ITEM_SILPH_CO_2F_ULTRA_BALL                            (FLAG_HIDDEN_ITEMS_START + 135)\n#define FLAG_HIDDEN_ITEM_SILPH_CO_3F_PROTEIN                               (FLAG_HIDDEN_ITEMS_START + 136)\n#define FLAG_HIDDEN_ITEM_SILPH_CO_4F_IRON                                  (FLAG_HIDDEN_ITEMS_START + 137)\n#define FLAG_HIDDEN_ITEM_SILPH_CO_5F_PP_UP                                 (FLAG_HIDDEN_ITEMS_START + 138)\n#define FLAG_HIDDEN_ITEM_SILPH_CO_6F_CARBOS                                (FLAG_HIDDEN_ITEMS_START + 139)\n#define FLAG_HIDDEN_ITEM_SILPH_CO_7F_ZINC                                  (FLAG_HIDDEN_ITEMS_START + 140)\n#define FLAG_HIDDEN_ITEM_SILPH_CO_8F_NUGGET                                (FLAG_HIDDEN_ITEMS_START + 141)\n#define FLAG_HIDDEN_ITEM_SILPH_CO_9F_CALCIUM                               (FLAG_HIDDEN_ITEMS_START + 142)\n#define FLAG_HIDDEN_ITEM_SILPH_CO_10F_HP_UP                                (FLAG_HIDDEN_ITEMS_START + 143)\n#define FLAG_HIDDEN_ITEM_SILPH_CO_11F_REVIVE                               (FLAG_HIDDEN_ITEMS_START + 144)\n#define FLAG_HIDDEN_ITEM_ROUTE23_LUM_BERRY                                 (FLAG_HIDDEN_ITEMS_START + 145)\n#define FLAG_HIDDEN_ITEM_ROUTE23_SITRUS_BERRY                              (FLAG_HIDDEN_ITEMS_START + 146)\n#define FLAG_HIDDEN_ITEM_ROUTE23_ASPEAR_BERRY                              (FLAG_HIDDEN_ITEMS_START + 147)\n#define FLAG_HIDDEN_ITEM_ROUTE23_LEPPA_BERRY                               (FLAG_HIDDEN_ITEMS_START + 148)\n#define FLAG_HIDDEN_ITEM_ROUTE14_ZINC                                      (FLAG_HIDDEN_ITEMS_START + 149)\n#define FLAG_HIDDEN_ITEM_ROUTE9_CHESTO_BERRY                               (FLAG_HIDDEN_ITEMS_START + 150)\n#define FLAG_HIDDEN_ITEM_ROUTE10_KELPSY_BERRY                              (FLAG_HIDDEN_ITEMS_START + 151) // Changed from Nanab\n#define FLAG_HIDDEN_ITEM_ROUTE7_QUALOT_BERRY                               (FLAG_HIDDEN_ITEMS_START + 152) // Changed from Wepear\n#define FLAG_HIDDEN_ITEM_ROUTE20_STARDUST                                  (FLAG_HIDDEN_ITEMS_START + 153)\n#define FLAG_HIDDEN_ITEM_ROUTE21_NORTH_PEARL                               (FLAG_HIDDEN_ITEMS_START + 154)\n#define FLAG_HIDDEN_ITEM_ROUTE23_MAX_ELIXIR                                (FLAG_HIDDEN_ITEMS_START + 155)\n#define FLAG_HIDDEN_ITEM_ROUTE4_HONDEW_BERRY                               (FLAG_HIDDEN_ITEMS_START + 156) // Changed from Razz\n#define FLAG_HIDDEN_ITEM_ROUTE14_GREPA_BERRY                               (FLAG_HIDDEN_ITEMS_START + 157) // Changed from Pinap\n#define FLAG_HIDDEN_ITEM_MT_EMBER_EXTERIOR_FIRE_STONE                      (FLAG_HIDDEN_ITEMS_START + 158)\n#define FLAG_HIDDEN_ITEM_POKEMON_TOWER_7F_SOOTHE_BELL                      (FLAG_HIDDEN_ITEMS_START + 159)\n#define FLAG_HIDDEN_ITEM_NAVEL_ROCK_SUMMIT_SACRED_ASH                      (FLAG_HIDDEN_ITEMS_START + 160)\n#define FLAG_HIDDEN_ITEM_TWO_ISLAND_CAPE_BRINK_PP_MAX                      (FLAG_HIDDEN_ITEMS_START + 161)\n#define FLAG_HIDDEN_ITEM_MT_EMBER_EXTERIOR_ULTRA_BALL                      (FLAG_HIDDEN_ITEMS_START + 162)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_DUNSPARCE_TUNNEL_NUGGET              (FLAG_HIDDEN_ITEMS_START + 163)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_PP_UP                                (FLAG_HIDDEN_ITEMS_START + 164)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_MAX_REPEL                (FLAG_HIDDEN_ITEMS_START + 165)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_PEARL                    (FLAG_HIDDEN_ITEMS_START + 166)\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_STARDUST                 (FLAG_HIDDEN_ITEMS_START + 167)\n#define FLAG_HIDDEN_ITEM_FOUR_ISLAND_PEARL                                 (FLAG_HIDDEN_ITEMS_START + 168)\n#define FLAG_HIDDEN_ITEM_FOUR_ISLAND_ULTRA_BALL                            (FLAG_HIDDEN_ITEMS_START + 169)\n#define FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_BIG_PEARL             (FLAG_HIDDEN_ITEMS_START + 170)\n#define FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_POMEG_BERRY           (FLAG_HIDDEN_ITEMS_START + 171) // Changed from Razz\n#define FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_SITRUS_BERRY          (FLAG_HIDDEN_ITEMS_START + 172)\n#define FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_KELPSY_BERRY          (FLAG_HIDDEN_ITEMS_START + 173) // Changed from Bluk\n#define FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_NEST_BALL             (FLAG_HIDDEN_ITEMS_START + 174)\n#define FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STARDUST              (FLAG_HIDDEN_ITEMS_START + 175)\n#define FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STAR_PIECE            (FLAG_HIDDEN_ITEMS_START + 176)\n#define FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STARDUST_2            (FLAG_HIDDEN_ITEMS_START + 177)\n#define FLAG_HIDDEN_ITEM_SIX_ISLAND_OUTCAST_ISLAND_STAR_PIECE              (FLAG_HIDDEN_ITEMS_START + 178)\n#define FLAG_HIDDEN_ITEM_SIX_ISLAND_OUTCAST_ISLAND_NET_BALL                (FLAG_HIDDEN_ITEMS_START + 179)\n#define FLAG_HIDDEN_ITEM_SIX_ISLAND_GREEN_PATH_ULTRA_BALL                  (FLAG_HIDDEN_ITEMS_START + 180)\n#define FLAG_HIDDEN_ITEM_SIX_ISLAND_WATER_PATH_ASPEAR_BERRY                (FLAG_HIDDEN_ITEMS_START + 181)\n#define FLAG_HIDDEN_ITEM_SIX_ISLAND_WATER_PATH_ORAN_BERRY                  (FLAG_HIDDEN_ITEMS_START + 182)\n#define FLAG_HIDDEN_ITEM_SIX_ISLAND_WATER_PATH_QUALOT_BERRY                (FLAG_HIDDEN_ITEMS_START + 183) // Changed from Pinap\n#define FLAG_HIDDEN_ITEM_SIX_ISLAND_LEPPA_BERRY                            (FLAG_HIDDEN_ITEMS_START + 184)\n#define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_BIG_PEARL              (FLAG_HIDDEN_ITEMS_START + 185)\n#define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_PEARL                  (FLAG_HIDDEN_ITEMS_START + 186)\n#define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_HONDEW_BERRY           (FLAG_HIDDEN_ITEMS_START + 187) // Changed from Nanab\n#define FLAG_HIDDEN_ITEM_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE_RAWST_BERRY  (FLAG_HIDDEN_ITEMS_START + 188)\n#define FLAG_HIDDEN_ITEM_VIRIDIAN_CITY_GYM_MACHO_BRACE                     (FLAG_HIDDEN_ITEMS_START + 189)\n#define FLAG_HIDDEN_ITEM_SSANNE_EXTERIOR_LAVA_COOKIE                       (FLAG_HIDDEN_ITEMS_START + 190)\n#define FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHWEST_SITRUS_BERRY                (FLAG_HIDDEN_ITEMS_START + 191) // New\n#define FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHEAST_SALAC_BERRY                 (FLAG_HIDDEN_ITEMS_START + 192) // New\n#define FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTHEAST_BRIGHTPOWDER                (FLAG_HIDDEN_ITEMS_START + 193) // New\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_UNDERWATER_DIVE_BALL     (FLAG_HIDDEN_ITEMS_START + 194) // New\n#define FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_UNDERWATER_HEART_SCALE   (FLAG_HIDDEN_ITEMS_START + 195) // New\n#define FLAG_HIDDEN_ITEM_ARTISAN_CAVE_ZINC                                 (FLAG_HIDDEN_ITEMS_START + 196)\n#define FLAG_HIDDEN_ITEM_ARTISAN_CAVE_CALCIUM                              (FLAG_HIDDEN_ITEMS_START + 197)\n#define FLAG_HIDDEN_ITEM_ARTISAN_CAVE_PROTEIN                              (FLAG_HIDDEN_ITEMS_START + 198)\n#define FLAG_HIDDEN_ITEM_ARTISAN_CAVE_IRON                                 (FLAG_HIDDEN_ITEMS_START + 199)\n\n// Boss clear flags, 1200\n#define FLAG_DEFEATED_BROCK           0x4B0\n#define FLAG_DEFEATED_MISTY           0x4B1\n#define FLAG_DEFEATED_LT_SURGE        0x4B2\n#define FLAG_DEFEATED_ERIKA           0x4B3\n#define FLAG_DEFEATED_KOGA            0x4B4\n#define FLAG_DEFEATED_SABRINA         0x4B5\n#define FLAG_DEFEATED_BLAINE          0x4B6\n#define FLAG_DEFEATED_LEADER_GIOVANNI 0x4B7\n#define FLAG_DEFEATED_LORELEI         0x4B8\n#define FLAG_DEFEATED_BRUNO           0x4B9\n#define FLAG_DEFEATED_AGATHA          0x4BA\n#define FLAG_DEFEATED_LANCE           0x4BB\n#define FLAG_DEFEATED_CHAMP           0x4BC\n\n// Unused?\n#define FLAG_HIDDEN_ITEM_CAPE_BRINK_BIG_PEARL                              (FLAG_HIDDEN_ITEMS_START + 213) // continued from above numbering because of how these are set by GetHiddenItemAttr\n#define FLAG_0x4BE               0x4BE\n#define FLAG_0x4BF               0x4BF\n#define FLAG_0x4C0               0x4C0\n#define FLAG_0x4C1               0x4C1\n#define FLAG_0x4C2               0x4C2\n#define FLAG_0x4C3               0x4C3\n#define FLAG_0x4C4               0x4C4\n#define FLAG_0x4C5               0x4C5\n#define FLAG_0x4C6               0x4C6\n#define FLAG_0x4C7               0x4C7\n#define FLAG_0x4C8               0x4C8\n#define FLAG_0x4C9               0x4C9\n#define FLAG_0x4CA               0x4CA\n#define FLAG_0x4CB               0x4CB\n#define FLAG_0x4CC               0x4CC\n#define FLAG_0x4CD               0x4CD\n#define FLAG_0x4CE               0x4CE\n#define FLAG_0x4CF               0x4CF\n#define FLAG_0x4D0               0x4D0\n#define FLAG_0x4D1               0x4D1\n#define FLAG_0x4D2               0x4D2\n#define FLAG_0x4D3               0x4D3\n#define FLAG_0x4D4               0x4D4\n#define FLAG_0x4D5               0x4D5\n#define FLAG_0x4D6               0x4D6\n#define FLAG_0x4D7               0x4D7\n#define FLAG_0x4D8               0x4D8\n#define FLAG_0x4D9               0x4D9\n#define FLAG_0x4DA               0x4DA\n#define FLAG_0x4DB               0x4DB\n#define FLAG_0x4DC               0x4DC\n#define FLAG_0x4DD               0x4DD\n#define FLAG_0x4DE               0x4DE\n#define FLAG_0x4DF               0x4DF\n#define FLAG_0x4E0               0x4E0\n#define FLAG_0x4E1               0x4E1\n#define FLAG_0x4E2               0x4E2\n#define FLAG_0x4E3               0x4E3\n#define FLAG_0x4E4               0x4E4\n#define FLAG_0x4E5               0x4E5\n#define FLAG_0x4E6               0x4E6\n#define FLAG_0x4E7               0x4E7\n#define FLAG_0x4E8               0x4E8\n#define FLAG_0x4E9               0x4E9\n#define FLAG_0x4EA               0x4EA\n#define FLAG_0x4EB               0x4EB\n#define FLAG_0x4EC               0x4EC\n#define FLAG_0x4ED               0x4ED\n#define FLAG_0x4EE               0x4EE\n#define FLAG_0x4EF               0x4EF\n#define FLAG_0x4F0               0x4F0\n#define FLAG_0x4F1               0x4F1\n#define FLAG_0x4F2               0x4F2\n#define FLAG_0x4F3               0x4F3\n#define FLAG_0x4F4               0x4F4\n#define FLAG_0x4F5               0x4F5\n#define FLAG_0x4F6               0x4F6\n#define FLAG_0x4F7               0x4F7\n#define FLAG_0x4F8               0x4F8\n#define FLAG_0x4F9               0x4F9\n#define FLAG_0x4FA               0x4FA\n#define FLAG_0x4FB               0x4FB\n#define FLAG_0x4FC               0x4FC\n#define FLAG_0x4FD               0x4FD\n#define FLAG_0x4FE               0x4FE\n#define FLAG_0x4FF               0x4FF\n\n#define TRAINER_FLAGS_START      (FLAG_0x4FF + 1)\n#define TRAINER_FLAGS_END        (TRAINER_FLAGS_START + MAX_TRAINERS_COUNT - 1) // 0x7FF\n\n// SYSTEM FLAGS\n\n#define SYS_FLAGS (TRAINER_FLAGS_END + 1) // 0x800\n\n// Temporary system flags\n#define FLAG_SYS_SAFARI_MODE                                        (SYS_FLAGS + 0x0)\n#define FLAG_SYS_VS_SEEKER_CHARGING                                 (SYS_FLAGS + 0x1)\n#define FLAG_SYS_CRUISE_MODE                                        (SYS_FLAGS + 0x2)\n#define FLAG_SYS_WHITE_FLUTE_ACTIVE                                 (SYS_FLAGS + 0x3)\n#define FLAG_SYS_BLACK_FLUTE_ACTIVE                                 (SYS_FLAGS + 0x4)\n#define FLAG_SYS_USE_STRENGTH                                       (SYS_FLAGS + 0x5)\n#define FLAG_SYS_FLASH_ACTIVE                                       (SYS_FLAGS + 0x6)\n#define FLAG_SYS_SPECIAL_WILD_BATTLE                                (SYS_FLAGS + 0x7)\n\n#define FLAG_SYS_QL_DEPARTED                                        (SYS_FLAGS + 0x8)\n#define FLAG_SYS_IN_OPTIONS_MENU                                    (SYS_FLAGS + 0x9)\n#define FLAG_0x80A                                                  (SYS_FLAGS + 0xA)\n#define FLAG_0x80B                                                  (SYS_FLAGS + 0xB)\n#define FLAG_0x80C                                                  (SYS_FLAGS + 0xC)\n#define FLAG_0x80D                                                  (SYS_FLAGS + 0xD)\n#define FLAG_0x80E                                                  (SYS_FLAGS + 0xE)\n#define FLAG_0x80F                                                  (SYS_FLAGS + 0xF)\n#define FLAG_0x810                                                  (SYS_FLAGS + 0x10)\n#define FLAG_0x811                                                  (SYS_FLAGS + 0x11)\n#define FLAG_0x812                                                  (SYS_FLAGS + 0x12)\n#define FLAG_0x813                                                  (SYS_FLAGS + 0x13)\n#define FLAG_0x814                                                  (SYS_FLAGS + 0x14)\n#define FLAG_0x815                                                  (SYS_FLAGS + 0x15)\n#define FLAG_0x816                                                  (SYS_FLAGS + 0x16)\n#define FLAG_0x817                                                  (SYS_FLAGS + 0x17)\n#define FLAG_0x818                                                  (SYS_FLAGS + 0x18)\n#define FLAG_0x819                                                  (SYS_FLAGS + 0x19)\n#define FLAG_0x81A                                                  (SYS_FLAGS + 0x1A)\n#define FLAG_0x81B                                                  (SYS_FLAGS + 0x1B)\n#define FLAG_0x81C                                                  (SYS_FLAGS + 0x1C)\n#define FLAG_0x81D                                                  (SYS_FLAGS + 0x1D)\n#define FLAG_0x81E                                                  (SYS_FLAGS + 0x1E)\n#define FLAG_0x81F                                                  (SYS_FLAGS + 0x1F)\n\n// Permanent system flags\n#define PERMA_SYS_FLAGS_START                                       (FLAG_0x81F + 1)\n\n#define FLAG_BADGE01_GET                                            (SYS_FLAGS + 0x20)\n#define FLAG_BADGE02_GET                                            (SYS_FLAGS + 0x21)\n#define FLAG_BADGE03_GET                                            (SYS_FLAGS + 0x22)\n#define FLAG_BADGE04_GET                                            (SYS_FLAGS + 0x23)\n#define FLAG_BADGE05_GET                                            (SYS_FLAGS + 0x24)\n#define FLAG_BADGE06_GET                                            (SYS_FLAGS + 0x25)\n#define FLAG_BADGE07_GET                                            (SYS_FLAGS + 0x26)\n#define FLAG_BADGE08_GET                                            (SYS_FLAGS + 0x27)\n#define NUM_BADGES                                                  (1 + FLAG_BADGE08_GET - FLAG_BADGE01_GET)\n\n#define FLAG_SYS_POKEMON_GET                                        (SYS_FLAGS + 0x28)\n#define FLAG_SYS_POKEDEX_GET                                        (SYS_FLAGS + 0x29)\n#define FLAG_SYS_CTRL_OBJ_DELETE                                    (SYS_FLAGS + 0x2A)\n#define FLAG_SYS_IS_LINKING                                         (SYS_FLAGS + 0x2B)\n#define FLAG_SYS_GAME_CLEAR_OLD                                     (SYS_FLAGS + 0x2C)  // Needs to be set to link with XD. New FLAG_SYS_GAME_CLEAR (now used in scripts) is at the bottom.\n#define FLAG_SYS_SET_TRAINER_CARD_PROFILE                           (SYS_FLAGS + 0x2D)\n#define FLAG_0x82E                                                  (SYS_FLAGS + 0x2E)\n#define FLAG_SYS_B_DASH                                             (SYS_FLAGS + 0x2F)\n#define FLAG_SYS_ON_CYCLING_ROAD                                    (SYS_FLAGS + 0x30)\n#define FLAG_SYS_RECEIVED_EXTENDED_DEX                              (SYS_FLAGS + 0x31)\n#define FLAG_SYS_EXTENDED_DEX_TOGGLE                                (SYS_FLAGS + 0x32)\n#define FLAG_SYS_ON_RESUME                                          (SYS_FLAGS + 0x33) // Cleared when an OnResume map script could fire\n#define FLAG_SYS_NOT_SOMEONES_PC                                    (SYS_FLAGS + 0x34)\n#define FLAG_0x835                                                  (SYS_FLAGS + 0x35)\n#define FLAG_0x836                                                  (SYS_FLAGS + 0x36)\n#define FLAG_SYS_RESET_RTC_ENABLE                                   (SYS_FLAGS + 0x37)\n#define FLAG_0x838                                                  (SYS_FLAGS + 0x38) // Set, never read\n#define FLAG_SYS_MYSTERY_GIFT_ENABLED                               (SYS_FLAGS + 0x39)\n#define FLAG_0x83A                                                  (SYS_FLAGS + 0x3A)\n#define FLAG_SYS_RIBBON_GET                                         (SYS_FLAGS + 0x3B)\n#define FLAG_SYS_SAW_HELP_SYSTEM_INTRO                              (SYS_FLAGS + 0x3C)\n#define FLAG_0x83D                                                  (SYS_FLAGS + 0x3D)\n#define FLAG_OPENED_START_MENU                                      (SYS_FLAGS + 0x3E)\n#define FLAG_0x83F                                                  (SYS_FLAGS + 0x3F)\n#define FLAG_SYS_NATIONAL_DEX                                       (SYS_FLAGS + 0x40)\n#define FLAG_SYS_PC_STORAGE_DISABLED                                (SYS_FLAGS + 0x41)\n#define FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER                  (SYS_FLAGS + 0x42)\n#define FLAG_SHOWN_BOX_WAS_FULL_MESSAGE                             (SYS_FLAGS + 0x43)\n#define FLAG_SYS_CAN_LINK_WITH_RS                                   (SYS_FLAGS + 0x44)\n#define FLAG_SYS_SEVII_MAP_123                                      (SYS_FLAGS + 0x45)\n#define FLAG_SYS_SEVII_MAP_4567                                     (SYS_FLAGS + 0x46)\n#define FLAG_SYS_GOT_BERRY_POUCH                                    (SYS_FLAGS + 0x47)\n#define FLAG_SYS_DEOXYS_AWAKENED                                    (SYS_FLAGS + 0x48)\n#define FLAG_SYS_UNLOCKED_TANOBY_RUINS                              (SYS_FLAGS + 0x49)\n#define FLAG_ENABLE_SHIP_NAVEL_ROCK                                 (SYS_FLAGS + 0x4A)\n#define FLAG_ENABLE_SHIP_BIRTH_ISLAND                               (SYS_FLAGS + 0x4B)\n\n// World Map Flags\n#define FLAG_WORLD_MAP_PALLET_TOWN                                  (SYS_FLAGS + 0x90)\n#define FLAG_WORLD_MAP_VIRIDIAN_CITY                                (SYS_FLAGS + 0x91)\n#define FLAG_WORLD_MAP_PEWTER_CITY                                  (SYS_FLAGS + 0x92)\n#define FLAG_WORLD_MAP_CERULEAN_CITY                                (SYS_FLAGS + 0x93)\n#define FLAG_WORLD_MAP_LAVENDER_TOWN                                (SYS_FLAGS + 0x94)\n#define FLAG_WORLD_MAP_VERMILION_CITY                               (SYS_FLAGS + 0x95)\n#define FLAG_WORLD_MAP_CELADON_CITY                                 (SYS_FLAGS + 0x96)\n#define FLAG_WORLD_MAP_FUCHSIA_CITY                                 (SYS_FLAGS + 0x97)\n#define FLAG_WORLD_MAP_CINNABAR_ISLAND                              (SYS_FLAGS + 0x98)\n#define FLAG_WORLD_MAP_INDIGO_PLATEAU_EXTERIOR                      (SYS_FLAGS + 0x99)\n#define FLAG_WORLD_MAP_SAFFRON_CITY                                 (SYS_FLAGS + 0x9A)\n#define FLAG_WORLD_MAP_ONE_ISLAND                                   (SYS_FLAGS + 0x9B)\n#define FLAG_WORLD_MAP_TWO_ISLAND                                   (SYS_FLAGS + 0x9C)\n#define FLAG_WORLD_MAP_THREE_ISLAND                                 (SYS_FLAGS + 0x9D)\n#define FLAG_WORLD_MAP_FOUR_ISLAND                                  (SYS_FLAGS + 0x9E)\n#define FLAG_WORLD_MAP_FIVE_ISLAND                                  (SYS_FLAGS + 0x9F)\n#define FLAG_WORLD_MAP_SEVEN_ISLAND                                 (SYS_FLAGS + 0xA0)\n#define FLAG_WORLD_MAP_SIX_ISLAND                                   (SYS_FLAGS + 0xA1)\n#define FLAG_WORLD_MAP_ROUTE4_POKEMON_CENTER_1F                     (SYS_FLAGS + 0xA2)\n#define FLAG_WORLD_MAP_ROUTE10_POKEMON_CENTER_1F                    (SYS_FLAGS + 0xA3)\n#define FLAG_WORLD_MAP_VIRIDIAN_FOREST                              (SYS_FLAGS + 0xA4)\n#define FLAG_WORLD_MAP_MT_MOON_1F                                   (SYS_FLAGS + 0xA5)\n#define FLAG_WORLD_MAP_SSANNE_EXTERIOR                              (SYS_FLAGS + 0xA6)\n#define FLAG_WORLD_MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL          (SYS_FLAGS + 0xA7)\n#define FLAG_WORLD_MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL            (SYS_FLAGS + 0xA8)\n#define FLAG_WORLD_MAP_DIGLETTS_CAVE_B1F                            (SYS_FLAGS + 0xA9)\n#define FLAG_WORLD_MAP_VICTORY_ROAD_1F                              (SYS_FLAGS + 0xAA)\n#define FLAG_WORLD_MAP_ROCKET_HIDEOUT_B1F                           (SYS_FLAGS + 0xAB)\n#define FLAG_WORLD_MAP_SILPH_CO_1F                                  (SYS_FLAGS + 0xAC)\n#define FLAG_WORLD_MAP_POKEMON_MANSION_1F                           (SYS_FLAGS + 0xAD)\n#define FLAG_WORLD_MAP_SAFARI_ZONE_CENTER                           (SYS_FLAGS + 0xAE)\n#define FLAG_WORLD_MAP_POKEMON_LEAGUE_LORELEIS_ROOM                 (SYS_FLAGS + 0xAF)\n#define FLAG_WORLD_MAP_ROCK_TUNNEL_1F                               (SYS_FLAGS + 0xB0)\n#define FLAG_WORLD_MAP_SEAFOAM_ISLANDS_1F                           (SYS_FLAGS + 0xB1)\n#define FLAG_WORLD_MAP_POKEMON_TOWER_1F                             (SYS_FLAGS + 0xB2)\n#define FLAG_WORLD_MAP_CERULEAN_CAVE_1F                             (SYS_FLAGS + 0xB3)\n#define FLAG_WORLD_MAP_POWER_PLANT                                  (SYS_FLAGS + 0xB4)\n#define FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR                          (SYS_FLAGS + 0xB5)\n#define FLAG_WORLD_MAP_MT_EMBER_EXTERIOR                            (SYS_FLAGS + 0xB6)\n#define FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST                    (SYS_FLAGS + 0xB7)\n#define FLAG_WORLD_MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE            (SYS_FLAGS + 0xB8)\n#define FLAG_WORLD_MAP_FIVE_ISLAND_ROCKET_WAREHOUSE                 (SYS_FLAGS + 0xB9)\n#define FLAG_WORLD_MAP_TRAINER_TOWER_LOBBY                          (SYS_FLAGS + 0xBA)\n#define FLAG_WORLD_MAP_SIX_ISLAND_DOTTED_HOLE_1F                    (SYS_FLAGS + 0xBB)\n#define FLAG_WORLD_MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE               (SYS_FLAGS + 0xBC)\n#define FLAG_WORLD_MAP_SIX_ISLAND_PATTERN_BUSH                      (SYS_FLAGS + 0xBD)\n#define FLAG_WORLD_MAP_SIX_ISLAND_ALTERING_CAVE                     (SYS_FLAGS + 0xBE)\n#define FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER     (SYS_FLAGS + 0xBF)\n#define FLAG_WORLD_MAP_THREE_ISLAND_DUNSPARCE_TUNNEL                (SYS_FLAGS + 0xC0)\n#define FLAG_WORLD_MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY       (SYS_FLAGS + 0xC1)\n#define FLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIOR                        (SYS_FLAGS + 0xC2)\n\n#define FLAG_0x8C3                                                  (SYS_FLAGS + 0xC3)\n#define FLAG_0x8C4                                                  (SYS_FLAGS + 0xC4)\n#define FLAG_0x8C5                                                  (SYS_FLAGS + 0xC5)\n#define FLAG_0x8C6                                                  (SYS_FLAGS + 0xC6)\n#define FLAG_0x8C7                                                  (SYS_FLAGS + 0xC7)\n#define FLAG_0x8C8                                                  (SYS_FLAGS + 0xC8)\n#define FLAG_0x8C9                                                  (SYS_FLAGS + 0xC9)\n#define FLAG_0x8CA                                                  (SYS_FLAGS + 0xCA)\n#define FLAG_0x8CB                                                  (SYS_FLAGS + 0xCB)\n#define FLAG_0x8CC                                                  (SYS_FLAGS + 0xCC)\n#define FLAG_0x8CD                                                  (SYS_FLAGS + 0xCD)\n#define FLAG_0x8CE                                                  (SYS_FLAGS + 0xCE)\n#define FLAG_0x8CF                                                  (SYS_FLAGS + 0xCF)\n#define FLAG_0x8D0                                                  (SYS_FLAGS + 0xD0)\n#define FLAG_0x8D1                                                  (SYS_FLAGS + 0xD1)\n#define FLAG_0x8D2                                                  (SYS_FLAGS + 0xD2)\n#define FLAG_0x8D3                                                  (SYS_FLAGS + 0xD3)\n#define FLAG_0x8D4                                                  (SYS_FLAGS + 0xD4)\n#define FLAG_SYS_GAME_CLEAR                                         (SYS_FLAGS + 0xD5)\n#define FLAG_0x8D6                                                  (SYS_FLAGS + 0xD6)\n#define FLAG_0x8D7                                                  (SYS_FLAGS + 0xD7)\n#define FLAG_0x8D8                                                  (SYS_FLAGS + 0xD8)\n#define FLAG_0x8D9                                                  (SYS_FLAGS + 0xD9)\n#define FLAG_0x8DA                                                  (SYS_FLAGS + 0xDA)\n#define FLAG_0x8DB                                                  (SYS_FLAGS + 0xDB)\n#define FLAG_0x8DC                                                  (SYS_FLAGS + 0xDC)\n#define FLAG_0x8DD                                                  (SYS_FLAGS + 0xDD)\n#define FLAG_0x8DE                                                  (SYS_FLAGS + 0xDE)\n#define FLAG_0x8DF                                                  (SYS_FLAGS + 0xDF)\n#define FLAG_0x8E0                                                  (SYS_FLAGS + 0xE0)\n#define FLAG_0x8E1                                                  (SYS_FLAGS + 0xE1)\n#define FLAG_0x8E2                                                  (SYS_FLAGS + 0xE2)\n#define FLAG_0x8E3                                                  (SYS_FLAGS + 0xE3)\n#define FLAG_0x8E4                                                  (SYS_FLAGS + 0xE4)\n#define FLAG_0x8E5                                                  (SYS_FLAGS + 0xE5)\n#define FLAG_0x8E6                                                  (SYS_FLAGS + 0xE6)\n#define FLAG_0x8E7                                                  (SYS_FLAGS + 0xE7)\n#define FLAG_0x8E8                                                  (SYS_FLAGS + 0xE8)\n#define FLAG_0x8E9                                                  (SYS_FLAGS + 0xE9)\n#define FLAG_0x8EA                                                  (SYS_FLAGS + 0xEA)\n#define FLAG_0x8EB                                                  (SYS_FLAGS + 0xEB)\n#define FLAG_0x8EC                                                  (SYS_FLAGS + 0xEC)\n#define FLAG_0x8ED                                                  (SYS_FLAGS + 0xED)\n#define FLAG_0x8EE                                                  (SYS_FLAGS + 0xEE)\n#define FLAG_0x8EF                                                  (SYS_FLAGS + 0xEF)\n#define FLAG_0x8F0                                                  (SYS_FLAGS + 0xF0)\n#define FLAG_0x8F1                                                  (SYS_FLAGS + 0xF1)\n#define FLAG_0x8F2                                                  (SYS_FLAGS + 0xF2)\n#define FLAG_0x8F3                                                  (SYS_FLAGS + 0xF3)\n#define FLAG_0x8F4                                                  (SYS_FLAGS + 0xF4)\n#define FLAG_0x8F5                                                  (SYS_FLAGS + 0xF5)\n#define FLAG_0x8F6                                                  (SYS_FLAGS + 0xF6)\n#define FLAG_0x8F7                                                  (SYS_FLAGS + 0xF7)\n#define FLAG_0x8F8                                                  (SYS_FLAGS + 0xF8)\n#define FLAG_0x8F9                                                  (SYS_FLAGS + 0xF9)\n#define FLAG_0x8FA                                                  (SYS_FLAGS + 0xFA)\n#define FLAG_0x8FB                                                  (SYS_FLAGS + 0xFB)\n#define FLAG_0x8FC                                                  (SYS_FLAGS + 0xFC)\n#define FLAG_0x8FD                                                  (SYS_FLAGS + 0xFD)\n#define FLAG_0x8FE                                                  (SYS_FLAGS + 0xFE)\n#define FLAG_0x8FF                                                  (SYS_FLAGS + 0xFF)\n\n#define FLAGS_COUNT (FLAG_0x8FF + 1)\n\n// Special Flags (Stored in EWRAM (sSpecialFlags, not in the SaveBlock)\n#define SPECIAL_FLAGS_START           0x4000\n#define FLAG_DONT_SHOW_MAP_NAME_POPUP (SPECIAL_FLAGS_START + 0x0)\n#define FLAG_DONT_TRANSITION_MUSIC    (SPECIAL_FLAGS_START + 0x1)\n// FLAG_SPECIAL_FLAG_0x4002 - 0x407F also exist and are unused\n#define SPECIAL_FLAGS_END             (SPECIAL_FLAGS_START + 0x7F)\n\n#endif // GUARD_CONSTANTS_FLAGS_H\n"
  },
  {
    "path": "include/constants/game_stat.h",
    "content": "#ifndef GUARD_CONSTANTS_GAME_STAT_H\n#define GUARD_CONSTANTS_GAME_STAT_H\n\n#define GAME_STAT_SAVED_GAME                 0\n#define GAME_STAT_FIRST_HOF_PLAY_TIME        1\n#define GAME_STAT_STARTED_TRENDS             2\n#define GAME_STAT_PLANTED_BERRIES            3\n#define GAME_STAT_TRADED_BIKES               4\n#define GAME_STAT_STEPS                      5\n#define GAME_STAT_GOT_INTERVIEWED            6\n#define GAME_STAT_TOTAL_BATTLES              7\n#define GAME_STAT_WILD_BATTLES               8\n#define GAME_STAT_TRAINER_BATTLES            9\n#define GAME_STAT_ENTERED_HOF               10\n#define GAME_STAT_POKEMON_CAPTURES          11\n#define GAME_STAT_FISHING_CAPTURES          12\n#define GAME_STAT_HATCHED_EGGS              13\n#define GAME_STAT_EVOLVED_POKEMON           14\n#define GAME_STAT_USED_POKECENTER           15\n#define GAME_STAT_RESTED_AT_HOME            16\n#define GAME_STAT_ENTERED_SAFARI_ZONE       17\n#define GAME_STAT_USED_CUT                  18\n#define GAME_STAT_USED_ROCK_SMASH           19\n#define GAME_STAT_MOVED_SECRET_BASE         20\n#define GAME_STAT_POKEMON_TRADES            21\n#define GAME_STAT_UNKNOWN_22                22\n#define GAME_STAT_LINK_BATTLE_WINS          23\n#define GAME_STAT_LINK_BATTLE_LOSSES        24\n#define GAME_STAT_LINK_BATTLE_DRAWS         25\n#define GAME_STAT_USED_SPLASH               26\n#define GAME_STAT_USED_STRUGGLE             27\n#define GAME_STAT_SLOT_JACKPOTS             28\n#define GAME_STAT_CONSECUTIVE_ROULETTE_WINS 29\n#define GAME_STAT_ENTERED_BATTLE_TOWER      30\n#define GAME_STAT_UNKNOWN_31                31\n#define GAME_STAT_BATTLE_TOWER_BEST_STREAK  32\n#define GAME_STAT_POKEBLOCKS                33\n#define GAME_STAT_POKEBLOCKS_WITH_FRIENDS   34\n#define GAME_STAT_WON_LINK_CONTEST          35\n#define GAME_STAT_ENTERED_CONTEST           36\n#define GAME_STAT_WON_CONTEST               37\n#define GAME_STAT_SHOPPED                   38\n#define GAME_STAT_USED_ITEMFINDER           39\n#define GAME_STAT_GOT_RAINED_ON             40\n#define GAME_STAT_CHECKED_POKEDEX           41\n#define GAME_STAT_RECEIVED_RIBBONS          42\n#define GAME_STAT_JUMPED_DOWN_LEDGES        43\n#define GAME_STAT_WATCHED_TV                44\n#define GAME_STAT_CHECKED_CLOCK             45\n#define GAME_STAT_WON_POKEMON_LOTTERY       46\n#define GAME_STAT_USED_DAYCARE              47\n#define GAME_STAT_RODE_CABLE_CAR            48\n#define GAME_STAT_ENTERED_HOT_SPRINGS       49\n#define GAME_STAT_NUM_UNION_ROOM_BATTLES    50\n#define GAME_STAT_BERRY_CRUSH_POINTS        51\n\n#define NUM_USED_GAME_STATS                 52\n#define NUM_GAME_STATS                      64\n\n#endif // GUARD_CONSTANTS_GAME_STAT_H\n"
  },
  {
    "path": "include/constants/global.h",
    "content": "#ifndef GUARD_CONSTANTS_GLOBAL_H\n#define GUARD_CONSTANTS_GLOBAL_H\n// Invalid Versions show as \"----------\" in Gen 4 and Gen 5's summary screen.\n// In Gens 6 and 7, invalid versions instead show \"a distant land\" in the summary screen.\n// In Gen 4 only, migrated Pokemon with Diamond, Pearl, or Platinum's ID show as \"----------\".\n// Gen 5 and up read Diamond, Pearl, or Platinum's ID as \"Sinnoh\".\n// In Gen 4 and up, migrated Pokemon with HeartGold or SoulSilver's ID show the otherwise unused \"Johto\" string.\n#define VERSION_SAPPHIRE 1\n#define VERSION_RUBY 2\n#define VERSION_EMERALD 3\n#define VERSION_FIRE_RED 4\n#define VERSION_LEAF_GREEN 5\n#define VERSION_HEART_GOLD 7\n#define VERSION_SOUL_SILVER 8\n#define VERSION_DIAMOND 10\n#define VERSION_PEARL 11\n#define VERSION_PLATINUM 12\n#define VERSION_GAMECUBE 15\n\n#define LANGUAGE_JAPANESE 1\n#define LANGUAGE_ENGLISH  2\n#define LANGUAGE_FRENCH   3\n#define LANGUAGE_ITALIAN  4\n#define LANGUAGE_GERMAN   5\n#define LANGUAGE_KOREAN   6 // 6 goes unused but the theory is it was meant to be Korean\n#define LANGUAGE_SPANISH  7\n#define NUM_LANGUAGES     7\n\n#define GAME_LANGUAGE (LANGUAGE_ENGLISH)\n\n// capacities of various saveblock objects\n#define DAYCARE_MON_COUNT   2\n#define PC_ITEMS_COUNT      30\n#define BAG_ITEMS_COUNT     47\n#define BAG_KEYITEMS_COUNT  36\n#define BAG_POKEBALLS_COUNT 13\n#define BAG_TMHM_COUNT      58\n#define BAG_BERRIES_COUNT   43\n#define BAG_MEDICINE_COUNT  40\n#define BAG_HELD_ITEMS_COUNT 52\n#define OBJECT_EVENTS_COUNT 16\n#define OBJECT_EVENT_TEMPLATES_COUNT 64\n#define MAIL_COUNT         (PARTY_SIZE + 10)\n#define PC_MAIL_NUM(i)     (PARTY_SIZE + (i))\n#define DECOR_MAX_SECRET_BASE 16\n#define MAX_REMATCH_ENTRIES 100\n#define UNION_ROOM_KB_ROW_COUNT 10\n#define GIFT_RIBBONS_COUNT 11\n\n#define POCKET_ITEMS        1\n#define POCKET_MEDICINE     2\n#define POCKET_KEY_ITEMS    3\n#define POCKET_HELD_ITEMS   4\n#define POCKET_POKE_BALLS   5\n#define POCKET_TM_CASE      6\n#define POCKET_BERRY_POUCH  7\n#define NUM_BAG_POCKETS 7\n\n// Contests\n#define CONTEST_CATEGORIES_COUNT  5\n\n// string lengths\n#define ITEM_NAME_LENGTH 14\n#define POKEMON_NAME_LENGTH 10\n#define PLAYER_NAME_LENGTH   7\n#define MAIL_WORDS_COUNT 9\n#define EASY_CHAT_BATTLE_WORDS_COUNT 6\n#define MOVE_NAME_LENGTH 12\n#define NUM_QUESTIONNAIRE_WORDS 4\n#define WONDER_CARD_TEXT_LENGTH 40\n#define WONDER_NEWS_TEXT_LENGTH 40\n#define WONDER_CARD_BODY_TEXT_LINES 4\n#define WONDER_NEWS_BODY_TEXT_LINES 10\n\n#define MAX_STAMP_CARD_STAMPS 7\n\n#define TRAINER_ID_LENGTH 4\n#define MAX_MON_MOVES 4\n#define PARTY_SIZE 6\n#define MULTI_PARTY_SIZE (PARTY_SIZE / 2)\n\n#define QUEST_LOG_SCENE_COUNT 4\n\n#define NUM_TOWER_CHALLENGE_TYPES 4\n\n#define MALE   0\n#define FEMALE 1\n#define GENDER_COUNT 2\n\n#define BARD_SONG_LENGTH       6\n#define NUM_STORYTELLER_TALES  4\n#define NUM_TRADER_ITEMS       4\n#define GIDDY_MAX_TALES       10\n#define GIDDY_MAX_QUESTIONS    8\n\n#define OPTIONS_BUTTON_MODE_HELP         0\n#define OPTIONS_BUTTON_MODE_LR           1\n#define OPTIONS_BUTTON_MODE_L_EQUALS_A   2\n\n#define OPTIONS_TEXT_SPEED_SLOW  0\n#define OPTIONS_TEXT_SPEED_MID   1\n#define OPTIONS_TEXT_SPEED_FAST  2\n#define OPTIONS_TEXT_SPEED_INSTANT  3\n\n#define OPTIONS_SOUND_MONO    0\n#define OPTIONS_SOUND_STEREO  1\n\n#define OPTIONS_BATTLE_STYLE_PREDICT  0\n#define OPTIONS_BATTLE_STYLE_SHIFT  1\n#define OPTIONS_BATTLE_STYLE_SET    2\n\n#define DIR_NONE        0\n#define DIR_SOUTH       1\n#define DIR_NORTH       2\n#define DIR_WEST        3\n#define DIR_EAST        4\n#define DIR_SOUTHWEST   5\n#define DIR_SOUTHEAST   6\n#define DIR_NORTHWEST   7\n#define DIR_NORTHEAST   8\n\n#define DIFFICULTY_NORMAL    0\n#define DIFFICULTY_CHALLENGE 1\n#define DIFFICULTY_EASY      2\n\n#define IV_CALC_NORMAL 0\n#define IV_CALC_PERFECT 1\n#define IV_CALC_ZERO 2\n\n#define EV_CALC_NORMAL 0\n#define EV_CALC_ZERO 1\n\n#define CONNECTION_INVALID -1\n#define CONNECTION_NONE     0\n#define CONNECTION_SOUTH    1\n#define CONNECTION_NORTH    2\n#define CONNECTION_WEST     3\n#define CONNECTION_EAST     4\n#define CONNECTION_DIVE     5\n#define CONNECTION_EMERGE   6\n\n#endif //GUARD_CONSTANTS_GLOBAL_H\n"
  },
  {
    "path": "include/constants/heal_locations.h",
    "content": "#ifndef GUARD_CONSTANTS_HEAL_LOCATIONS_H\n#define GUARD_CONSTANTS_HEAL_LOCATIONS_H\n\n#define SPAWN_PALLET_TOWN 1\n#define SPAWN_VIRIDIAN_CITY 2\n#define SPAWN_PEWTER_CITY 3\n#define SPAWN_CERULEAN_CITY 4\n#define SPAWN_LAVENDER_TOWN 5\n#define SPAWN_VERMILION_CITY 6\n#define SPAWN_CELADON_CITY 7\n#define SPAWN_FUCHSIA_CITY 8\n#define SPAWN_CINNABAR_ISLAND 9\n#define SPAWN_INDIGO_PLATEAU 10\n#define SPAWN_SAFFRON_CITY 11\n#define SPAWN_ROUTE4 12\n#define SPAWN_ROUTE10 13\n#define SPAWN_ONE_ISLAND 14\n#define SPAWN_TWO_ISLAND 15\n#define SPAWN_THREE_ISLAND 16\n#define SPAWN_FOUR_ISLAND 17\n#define SPAWN_FIVE_ISLAND 18\n#define SPAWN_SEVEN_ISLAND 19\n#define SPAWN_SIX_ISLAND 20\n#define SPAWN_BATTLE_FRONTIER 21\n\n#endif // GUARD_CONSTANTS_HEAL_LOCATIONS_H\n"
  },
  {
    "path": "include/constants/help_system.h",
    "content": "#ifndef GUARD_CONSTANTS_HELP_SYSTEM_H\n#define GUARD_CONSTANTS_HELP_SYSTEM_H\n\n#define HELPCONTEXT_NONE                   0\n#define HELPCONTEXT_TITLE_SCREEN           1\n#define HELPCONTEXT_NEW_GAME               2\n#define HELPCONTEXT_NAMING_SCREEN          3\n#define HELPCONTEXT_POKEDEX                4\n#define HELPCONTEXT_PARTY_MENU             5\n#define HELPCONTEXT_POKEMON_INFO           6\n#define HELPCONTEXT_POKEMON_SKILLS         7\n#define HELPCONTEXT_POKEMON_MOVES          8\n#define HELPCONTEXT_BAG                    9\n#define HELPCONTEXT_TRAINER_CARD_FRONT     10\n#define HELPCONTEXT_TRAINER_CARD_BACK      11\n#define HELPCONTEXT_SAVE                   12\n#define HELPCONTEXT_OPTIONS                13\n#define HELPCONTEXT_PLAYERS_HOUSE          14\n#define HELPCONTEXT_OAKS_LAB               15\n#define HELPCONTEXT_POKECENTER             16\n#define HELPCONTEXT_MART                   17\n#define HELPCONTEXT_GYM                    18\n#define HELPCONTEXT_INDOORS                19\n#define HELPCONTEXT_OVERWORLD              20\n#define HELPCONTEXT_DUNGEON                21 // Caves and Forests\n#define HELPCONTEXT_SURFING                22\n#define HELPCONTEXT_WILD_BATTLE            23\n#define HELPCONTEXT_TRAINER_BATTLE_SINGLE  24\n#define HELPCONTEXT_TRAINER_BATTLE_DOUBLE  25\n#define HELPCONTEXT_SAFARI_BATTLE          26\n#define HELPCONTEXT_PC                     27\n#define HELPCONTEXT_BILLS_PC               28\n#define HELPCONTEXT_PLAYERS_PC_ITEMS       29\n#define HELPCONTEXT_PLAYERS_PC_MAILBOX     30\n#define HELPCONTEXT_PC_MISC                31 // Prof Oaks PC and the HoF PC\n#define HELPCONTEXT_BEDROOM_PC             32\n#define HELPCONTEXT_BEDROOM_PC_ITEMS       33\n#define HELPCONTEXT_BEDROOM_PC_MAILBOX     34\n#define HELPCONTEXT_KEY_SYSTEM             35\n#define HELPCONTEXT_OPTIONS_SUBMENU        36\n#define HELPCONTEXT_KEY_SYSTEM_SUBMENU     37\n#define HELPCONTEXT_COUNT                  38\n\n#endif //GUARD_CONSTANTS_HELP_SYSTEM_H\n"
  },
  {
    "path": "include/constants/hoenn_cries.h",
    "content": "#ifndef GUARD_CONSTANTS_HOENN_CRIES_H\n#define GUARD_CONSTANTS_HOENN_CRIES_H\n\nenum\n{\n    CRY_KECLEON = 251,\n    CRY_ROSELIA = 252,\n    CRY_TORKOAL = 253,\n    CRY_ELECTRIKE = 254,\n    CRY_MANECTRIC = 255,\n    CRY_DUSKULL = 256,\n    CRY_LATIAS = 257,\n    CRY_WYNAUT = 258,\n    CRY_SEVIPER = 259,\n    CRY_SHARPEDO = 260,\n    CRY_ZANGOOSE = 261,\n    CRY_AZURILL = 262,\n    CRY_SWABLU = 263,\n    CRY_ALTARIA = 264,\n    CRY_TAILLOW = 266,\n    CRY_SWELLOW = 267,\n    CRY_SPINDA = 269,\n    CRY_TORCHIC = 270,\n    CRY_COMBUSKEN = 271,\n    CRY_BLAZIKEN = 272,\n    CRY_TREECKO = 273,\n    CRY_GROVYLE = 274,\n    CRY_SCEPTILE = 275,\n    CRY_MUDKIP = 276,\n    CRY_MARSHTOMP = 277,\n    CRY_SWAMPERT = 278,\n    CRY_PELIPPER = 279,\n    CRY_WINGULL = 280,\n    CRY_BANETTE = 281,\n    CRY_SHUPPET = 282,\n    CRY_LOTAD = 283,\n    CRY_LOMBRE = 284,\n    CRY_LUDICOLO = 285,\n    CRY_SEEDOT = 286,\n    CRY_NUZLEAF = 287,\n    CRY_SHIFTRY = 288,\n    CRY_CARVANHA = 289,\n    CRY_WURMPLE = 290,\n    CRY_SILCOON = 291,\n    CRY_BEAUTIFLY = 292,\n    CRY_CASCOON = 293,\n    CRY_DUSTOX = 294,\n    CRY_RALTS = 295,\n    CRY_KIRLIA = 296,\n    CRY_GARDEVOIR = 297,\n    CRY_SLAKOTH = 298,\n    CRY_VIGOROTH = 299,\n    CRY_SLAKING = 300,\n    CRY_NINCADA = 301,\n    CRY_NINJASK = 302,\n    CRY_SHEDINJA = 303,\n    CRY_MAKUHITA = 304,\n    CRY_HARIYAMA = 305,\n    CRY_NOSEPASS = 306,\n    CRY_GLALIE = 307,\n    CRY_PLUSLE = 308,\n    CRY_MINUN = 309,\n    CRY_SURSKIT = 310,\n    CRY_MASQUERAIN = 311,\n    CRY_SKITTY = 312,\n    CRY_DELCATTY = 313,\n    CRY_GULPIN = 314,\n    CRY_SWALOT = 315,\n    CRY_NUMEL = 316,\n    CRY_CAMERUPT = 317,\n    CRY_BARBOACH = 318,\n    CRY_WHISCASH = 319,\n    CRY_CORPHISH = 320,\n    CRY_CRAWDAUNT = 321,\n    CRY_SPOINK = 322,\n    CRY_GRUMPIG = 323,\n    CRY_TRAPINCH = 324,\n    CRY_VIBRAVA = 325,\n    CRY_FLYGON = 326,\n    CRY_CACNEA = 327,\n    CRY_CACTURNE = 328,\n    CRY_BALTOY = 329,\n    CRY_CLAYDOL = 330,\n    CRY_LUNATONE = 331,\n    CRY_SOLROCK = 332,\n    CRY_FEEBAS = 333,\n    CRY_MILOTIC = 334,\n    CRY_ABSOL = 335,\n    CRY_MEDITITE = 336,\n    CRY_MEDICHAM = 337,\n    CRY_SPHEAL = 338,\n    CRY_SEALEO = 339,\n    CRY_WALREIN = 340,\n    CRY_CLAMPERL = 341,\n    CRY_HUNTAIL = 342,\n    CRY_GOREBYSS = 343,\n    CRY_LILEEP = 344,\n    CRY_CRADILY = 345,\n    CRY_ANORITH = 346,\n    CRY_ARMALDO = 347,\n    CRY_BELDUM = 348,\n    CRY_METANG = 349,\n    CRY_METAGROSS = 350,\n    CRY_BAGON = 351,\n    CRY_SHELGON = 352,\n    CRY_REGIROCK = 353,\n    CRY_REGICE = 354,\n    CRY_REGISTEEL = 355,\n    CRY_CASTFORM = 356,\n    CRY_VOLBEAT = 357,\n    CRY_ILLUMISE = 358,\n    CRY_POOCHYENA = 359,\n    CRY_MIGHTYENA = 360,\n    CRY_DUSCLOPS = 361,\n    CRY_SABLEYE = 362,\n    CRY_MAWILE = 363,\n    CRY_ARON = 364,\n    CRY_LAIRON = 365,\n    CRY_AGGRON = 366,\n    CRY_RELICANTH = 367,\n    CRY_LUVDISC = 368,\n    CRY_GROUDON = 369,\n    CRY_KYOGRE = 370,\n    CRY_RAYQUAZA = 371,\n    CRY_SALAMENCE = 372,\n    CRY_BRELOOM = 373,\n    CRY_SHROOMISH = 374,\n    CRY_LINOONE = 375,\n    CRY_TROPIUS = 376,\n    CRY_WAILMER = 377,\n    CRY_ZIGZAGOON = 378,\n    CRY_EXPLOUD = 379,\n    CRY_LOUDRED = 380,\n    CRY_WAILORD = 381,\n    CRY_WHISMUR = 382,\n    CRY_SNORUNT = 383,\n    CRY_LATIOS = 384,\n    CRY_JIRACHI = 385,\n    CRY_DEOXYS = 386,\n    CRY_CHIMECHO = 387,\n};\n\n#endif\n"
  },
  {
    "path": "include/constants/hold_effects.h",
    "content": "#ifndef GUARD_HOLD_EFFECTS_H\n#define GUARD_HOLD_EFFECTS_H\n\n#define HOLD_EFFECT_NONE            0\n#define HOLD_EFFECT_RESTORE_HP      1\n#define HOLD_EFFECT_CURE_PAR        2\n#define HOLD_EFFECT_CURE_SLP        3\n#define HOLD_EFFECT_CURE_PSN        4\n#define HOLD_EFFECT_CURE_BRN        5\n#define HOLD_EFFECT_CURE_FRZ        6\n#define HOLD_EFFECT_RESTORE_PP      7\n#define HOLD_EFFECT_CURE_CONFUSION  8\n#define HOLD_EFFECT_CURE_STATUS     9\n#define HOLD_EFFECT_CONFUSE_SPICY  10\n#define HOLD_EFFECT_CONFUSE_DRY    11\n#define HOLD_EFFECT_CONFUSE_SWEET  12\n#define HOLD_EFFECT_CONFUSE_BITTER 13\n#define HOLD_EFFECT_CONFUSE_SOUR   14\n#define HOLD_EFFECT_ATTACK_UP      15\n#define HOLD_EFFECT_DEFENSE_UP     16\n#define HOLD_EFFECT_SPEED_UP       17\n#define HOLD_EFFECT_SP_ATTACK_UP   18\n#define HOLD_EFFECT_SP_DEFENSE_UP  19\n#define HOLD_EFFECT_CRITICAL_UP    20\n#define HOLD_EFFECT_RANDOM_STAT_UP 21\n#define HOLD_EFFECT_EVASION_UP     22\n#define HOLD_EFFECT_RESTORE_STATS  23\n#define HOLD_EFFECT_MACHO_BRACE    24\n#define HOLD_EFFECT_EXP_SHARE      25\n#define HOLD_EFFECT_QUICK_CLAW     26\n#define HOLD_EFFECT_FRIENDSHIP_UP  27\n#define HOLD_EFFECT_CURE_ATTRACT   28\n#define HOLD_EFFECT_CHOICE_BAND    29\n#define HOLD_EFFECT_FLINCH         30\n#define HOLD_EFFECT_BUG_POWER      31\n#define HOLD_EFFECT_DOUBLE_PRIZE   32\n#define HOLD_EFFECT_REPEL          33\n#define HOLD_EFFECT_SOUL_DEW       34\n#define HOLD_EFFECT_DEEP_SEA_TOOTH 35\n#define HOLD_EFFECT_DEEP_SEA_SCALE 36\n#define HOLD_EFFECT_CAN_ALWAYS_RUN 37\n#define HOLD_EFFECT_PREVENT_EVOLVE 38\n#define HOLD_EFFECT_FOCUS_BAND     39\n#define HOLD_EFFECT_LUCKY_EGG      40\n#define HOLD_EFFECT_SCOPE_LENS     41\n#define HOLD_EFFECT_STEEL_POWER    42\n#define HOLD_EFFECT_LEFTOVERS      43\n#define HOLD_EFFECT_DRAGON_SCALE   44\n#define HOLD_EFFECT_LIGHT_BALL     45\n#define HOLD_EFFECT_GROUND_POWER   46\n#define HOLD_EFFECT_ROCK_POWER     47\n#define HOLD_EFFECT_GRASS_POWER    48\n#define HOLD_EFFECT_DARK_POWER     49\n#define HOLD_EFFECT_FIGHTING_POWER 50\n#define HOLD_EFFECT_ELECTRIC_POWER 51\n#define HOLD_EFFECT_WATER_POWER    52\n#define HOLD_EFFECT_FLYING_POWER   53\n#define HOLD_EFFECT_POISON_POWER   54\n#define HOLD_EFFECT_ICE_POWER      55\n#define HOLD_EFFECT_GHOST_POWER    56\n#define HOLD_EFFECT_PSYCHIC_POWER  57\n#define HOLD_EFFECT_FIRE_POWER     58\n#define HOLD_EFFECT_DRAGON_POWER   59\n#define HOLD_EFFECT_NORMAL_POWER   60\n#define HOLD_EFFECT_UP_GRADE       61\n#define HOLD_EFFECT_SHELL_BELL     62\n#define HOLD_EFFECT_LUCKY_PUNCH    63\n#define HOLD_EFFECT_METAL_POWDER   64\n#define HOLD_EFFECT_THICK_CLUB     65\n#define HOLD_EFFECT_STICK          66\n\n#endif // GUARD_HOLD_EFFECTS_H\n"
  },
  {
    "path": "include/constants/item_effects.h",
    "content": "#ifndef GUARD_CONSTANTS_ITEM_EFFECTS_H\n#define GUARD_CONSTANTS_ITEM_EFFECTS_H\n\n// field 0 masks\n#define ITEM0_X_ATTACK          0x0F\n#define ITEM0_DIRE_HIT          0x30 // Works the same way as move Focus Energy.\n#define ITEM0_SACRED_ASH        0x40\n#define ITEM0_INFATUATION       0x80\n\n// field 1 masks\n#define ITEM1_X_SPEED           0x0F\n#define ITEM1_X_DEFEND          0xF0\n\n// field 2 masks\n#define ITEM2_X_SPATK           0x0F\n#define ITEM2_X_ACCURACY        0xF0\n\n// field 3 masks\n#define ITEM3_CONFUSION         0x1\n#define ITEM3_PARALYSIS         0x2\n#define ITEM3_FREEZE            0x4\n#define ITEM3_BURN              0x8\n#define ITEM3_POISON            0x10\n#define ITEM3_SLEEP             0x20\n#define ITEM3_LEVEL_UP          0x40\n#define ITEM3_GUARD_SPEC        0x80 // Works the same way as the move Mist.\n\n#define ITEM3_STATUS_ALL        (ITEM3_CONFUSION | ITEM3_PARALYSIS | ITEM3_FREEZE | ITEM3_BURN | ITEM3_POISON | ITEM3_SLEEP)\n\n// field 4 masks\n#define ITEM4_EV_HP             0x1\n#define ITEM4_EV_ATK            0x2\n#define ITEM4_HEAL_HP           0x4\n#define ITEM4_HEAL_PP_ALL       0x8\n#define ITEM4_HEAL_PP_ONE       0x10\n#define ITEM4_PP_UP             0x20\n#define ITEM4_REVIVE            0x40\n#define ITEM4_EVO_STONE         0x80\n\n// field 5 masks\n#define ITEM5_EV_DEF            0x1\n#define ITEM5_EV_SPEED          0x2\n#define ITEM5_EV_SPDEF          0x4\n#define ITEM5_EV_SPATK          0x8\n#define ITEM5_PP_MAX            0x10\n#define ITEM5_FRIENDSHIP_LOW    0x20\n#define ITEM5_FRIENDSHIP_MID    0x40\n#define ITEM5_FRIENDSHIP_HIGH   0x80\n\n#define ITEM5_FRIENDSHIP_ALL    (ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID | ITEM5_FRIENDSHIP_HIGH)\n\n// fields 6 and onwards are item-specific arguments\n#define ITEM_EFFECT_ARG_START 6\n\n// Special HP recovery amounts for ITEM4_HEAL_HP\n#define ITEM6_HEAL_HP_FULL   ((u8) -1)\n#define ITEM6_HEAL_HP_HALF   ((u8) -2)\n#define ITEM6_HEAL_HP_LVL_UP ((u8) -3)\n\n// Special PP recovery amounts for ITEM4_HEAL_PP\n#define ITEM6_HEAL_PP_FULL   0x7F\n\n// Amount of EV modified by ITEM4_EV_HP, ITEM4_EV_ATK, ITEM5_EV_DEF, ITEM5_EV_SPEED, ITEM5_EV_SPDEF and ITEM5_EV_SPATK\n#define ITEM6_ADD_EV       10\n#define ITEM6_SUBTRACT_EV -10\n\n// Used for GetItemEffectType.\n#define ITEM_EFFECT_X_ITEM 0\n#define ITEM_EFFECT_RAISE_LEVEL 1\n#define ITEM_EFFECT_HEAL_HP 2\n#define ITEM_EFFECT_CURE_POISON 3\n#define ITEM_EFFECT_CURE_SLEEP 4\n#define ITEM_EFFECT_CURE_BURN 5\n#define ITEM_EFFECT_CURE_FREEZE 6\n#define ITEM_EFFECT_CURE_PARALYSIS 7\n#define ITEM_EFFECT_CURE_CONFUSION 8\n#define ITEM_EFFECT_CURE_INFATUATION 9\n#define ITEM_EFFECT_SACRED_ASH 10\n#define ITEM_EFFECT_CURE_ALL_STATUS 11\n#define ITEM_EFFECT_ATK_EV 12\n#define ITEM_EFFECT_HP_EV 13\n#define ITEM_EFFECT_SPATK_EV 14\n#define ITEM_EFFECT_SPDEF_EV 15\n#define ITEM_EFFECT_SPEED_EV 16\n#define ITEM_EFFECT_DEF_EV 17\n#define ITEM_EFFECT_EVO_STONE 18\n#define ITEM_EFFECT_PP_UP 19\n#define ITEM_EFFECT_PP_MAX 20\n#define ITEM_EFFECT_HEAL_PP 21\n#define ITEM_EFFECT_NONE 22\n\n#endif // GUARD_CONSTANTS_ITEM_EFFECTS_H\n"
  },
  {
    "path": "include/constants/item_menu.h",
    "content": "#ifndef GUARD_CONSTANTS_ITEM_MENU_H\n#define GUARD_CONSTANTS_ITEM_MENU_H\n\n#define OPEN_BAG_ITEMS     0\n#define OPEN_BAG_KEYITEMS  1\n#define OPEN_BAG_POKEBALLS 2\n#define OPEN_BAG_LAST      3\n\n#define ITEMMENULOCATION_FIELD            0\n#define ITEMMENULOCATION_PARTY            1\n#define ITEMMENULOCATION_SHOP             2\n#define ITEMMENULOCATION_ITEMPC           3\n#define ITEMMENULOCATION_PCBOX            4\n#define ITEMMENULOCATION_BATTLE           5\n#define ITEMMENULOCATION_OLD_MAN          6\n#define ITEMMENULOCATION_TTVSCR_STATUS    7\n#define ITEMMENULOCATION_TTVSCR_CATCHING  8\n#define ITEMMENULOCATION_TTVSCR_REGISTER  9\n#define ITEMMENULOCATION_TTVSCR_TMS      10\n#define ITEMMENULOCATION_LAST            11\n\n#define ITEMMENUACTION_USE           0\n#define ITEMMENUACTION_TOSS          1\n#define ITEMMENUACTION_REGISTER      2\n#define ITEMMENUACTION_GIVE          3\n#define ITEMMENUACTION_CANCEL        4\n#define ITEMMENUACTION_BATTLE_USE    5\n#define ITEMMENUACTION_CHECK         6\n#define ITEMMENUACTION_OPEN          7\n#define ITEMMENUACTION_OPEN_BERRIES  8\n#define ITEMMENUACTION_WALK          9\n#define ITEMMENUACTION_DESELECT     10\n#define ITEMMENUACTION_BY_NAME      11\n#define ITEMMENUACTION_BY_TYPE      12\n#define ITEMMENUACTION_BY_AMOUNT    13\n#define ITEMMENUACTION_BY_NUMBER    14\n#define ITEMMENUACTION_DUMMY        15\n\n#endif //GUARD_CONSTANTS_ITEM_MENU_H\n"
  },
  {
    "path": "include/constants/items.h",
    "content": "#ifndef GUARD_CONSTANTS_ITEMS_H\n#define GUARD_CONSTANTS_ITEMS_H\n\n#define ITEM_NONE 0\n#define ITEM_MASTER_BALL 1\n#define ITEM_ULTRA_BALL 2\n#define ITEM_GREAT_BALL 3\n#define ITEM_POKE_BALL 4\n#define ITEM_SAFARI_BALL 5\n#define ITEM_NET_BALL 6\n#define ITEM_DIVE_BALL 7\n#define ITEM_NEST_BALL 8\n#define ITEM_REPEAT_BALL 9\n#define ITEM_TIMER_BALL 10\n#define ITEM_LUXURY_BALL 11\n#define ITEM_PREMIER_BALL 12\n#define ITEM_POTION 13\n#define ITEM_ANTIDOTE 14\n#define ITEM_BURN_HEAL 15\n#define ITEM_ICE_HEAL 16\n#define ITEM_AWAKENING 17\n#define ITEM_PARALYZE_HEAL 18\n#define ITEM_FULL_RESTORE 19\n#define ITEM_MAX_POTION 20\n#define ITEM_HYPER_POTION 21\n#define ITEM_SUPER_POTION 22\n#define ITEM_FULL_HEAL 23\n#define ITEM_REVIVE 24\n#define ITEM_MAX_REVIVE 25\n#define ITEM_FRESH_WATER 26\n#define ITEM_SODA_POP 27\n#define ITEM_LEMONADE 28\n#define ITEM_MOOMOO_MILK 29\n#define ITEM_ENERGY_POWDER 30\n#define ITEM_ENERGY_ROOT 31\n#define ITEM_HEAL_POWDER 32\n#define ITEM_REVIVAL_HERB 33\n#define ITEM_ETHER 34\n#define ITEM_MAX_ETHER 35\n#define ITEM_ELIXIR 36\n#define ITEM_MAX_ELIXIR 37\n#define ITEM_LAVA_COOKIE 38\n#define ITEM_BLUE_FLUTE 39\n#define ITEM_YELLOW_FLUTE 40\n#define ITEM_RED_FLUTE 41\n#define ITEM_BLACK_FLUTE 42\n#define ITEM_WHITE_FLUTE 43\n#define ITEM_BERRY_JUICE 44\n#define ITEM_SACRED_ASH 45\n#define ITEM_SHOAL_SALT 46\n#define ITEM_SHOAL_SHELL 47\n#define ITEM_RED_SHARD 48\n#define ITEM_BLUE_SHARD 49\n#define ITEM_YELLOW_SHARD 50\n#define ITEM_GREEN_SHARD 51\n#define ITEM_034 52\n#define ITEM_035 53\n#define ITEM_036 54\n#define ITEM_037 55\n#define ITEM_038 56\n#define ITEM_039 57\n#define ITEM_03A 58\n#define ITEM_03B 59\n#define ITEM_03C 60\n#define ITEM_03D 61\n#define ITEM_03E 62\n#define ITEM_HP_UP 63\n#define ITEM_PROTEIN 64\n#define ITEM_IRON 65\n#define ITEM_CARBOS 66\n#define ITEM_CALCIUM 67\n#define ITEM_RARE_CANDY 68\n#define ITEM_PP_UP 69\n#define ITEM_ZINC 70\n#define ITEM_PP_MAX 71\n#define ITEM_048 72\n#define ITEM_GUARD_SPEC 73\n#define ITEM_DIRE_HIT 74\n#define ITEM_X_ATTACK 75\n#define ITEM_X_DEFEND 76\n#define ITEM_X_SPEED 77\n#define ITEM_X_ACCURACY 78\n#define ITEM_X_SPECIAL 79\n#define ITEM_POKE_DOLL 80\n#define ITEM_FLUFFY_TAIL 81\n#define ITEM_052 82\n#define ITEM_SUPER_REPEL 83\n#define ITEM_MAX_REPEL 84\n#define ITEM_ESCAPE_ROPE 85\n#define ITEM_REPEL 86\n#define ITEM_057 87\n#define ITEM_058 88\n#define ITEM_059 89\n#define ITEM_05A 90\n#define ITEM_05B 91\n#define ITEM_05C 92\n#define ITEM_SUN_STONE 93\n#define ITEM_MOON_STONE 94\n#define ITEM_FIRE_STONE 95\n#define ITEM_THUNDER_STONE 96\n#define ITEM_WATER_STONE 97\n#define ITEM_LEAF_STONE 98\n#define ITEM_063 99\n#define ITEM_064 100\n#define ITEM_065 101\n#define ITEM_066 102\n#define ITEM_TINY_MUSHROOM 103\n#define ITEM_BIG_MUSHROOM 104\n#define ITEM_069 105\n#define ITEM_PEARL 106\n#define ITEM_BIG_PEARL 107\n#define ITEM_STARDUST 108\n#define ITEM_STAR_PIECE 109\n#define ITEM_NUGGET 110\n#define ITEM_HEART_SCALE 111\n#define ITEM_LINK_BRACELET 112\n#define ITEM_071 113\n#define ITEM_072 114\n#define ITEM_073 115\n#define ITEM_074 116\n#define ITEM_075 117\n#define ITEM_076 118\n#define ITEM_077 119\n#define ITEM_078 120\n#define ITEM_ORANGE_MAIL 121\n#define ITEM_HARBOR_MAIL 122\n#define ITEM_GLITTER_MAIL 123\n#define ITEM_MECH_MAIL 124\n#define ITEM_WOOD_MAIL 125\n#define ITEM_WAVE_MAIL 126\n#define ITEM_BEAD_MAIL 127\n#define ITEM_SHADOW_MAIL 128\n#define ITEM_TROPIC_MAIL 129\n#define ITEM_DREAM_MAIL 130\n#define ITEM_FAB_MAIL 131\n#define ITEM_RETRO_MAIL 132\n#define ITEM_CHERI_BERRY 133\n#define ITEM_CHESTO_BERRY 134\n#define ITEM_PECHA_BERRY 135\n#define ITEM_RAWST_BERRY 136\n#define ITEM_ASPEAR_BERRY 137\n#define ITEM_LEPPA_BERRY 138\n#define ITEM_ORAN_BERRY 139\n#define ITEM_PERSIM_BERRY 140\n#define ITEM_LUM_BERRY 141\n#define ITEM_SITRUS_BERRY 142\n#define ITEM_FIGY_BERRY 143\n#define ITEM_WIKI_BERRY 144\n#define ITEM_MAGO_BERRY 145\n#define ITEM_AGUAV_BERRY 146\n#define ITEM_IAPAPA_BERRY 147\n#define ITEM_RAZZ_BERRY 148\n#define ITEM_BLUK_BERRY 149\n#define ITEM_NANAB_BERRY 150\n#define ITEM_WEPEAR_BERRY 151\n#define ITEM_PINAP_BERRY 152\n#define ITEM_POMEG_BERRY 153\n#define ITEM_KELPSY_BERRY 154\n#define ITEM_QUALOT_BERRY 155\n#define ITEM_HONDEW_BERRY 156\n#define ITEM_GREPA_BERRY 157\n#define ITEM_TAMATO_BERRY 158\n#define ITEM_CORNN_BERRY 159\n#define ITEM_MAGOST_BERRY 160\n#define ITEM_RABUTA_BERRY 161\n#define ITEM_NOMEL_BERRY 162\n#define ITEM_SPELON_BERRY 163\n#define ITEM_PAMTRE_BERRY 164\n#define ITEM_WATMEL_BERRY 165\n#define ITEM_DURIN_BERRY 166\n#define ITEM_BELUE_BERRY 167\n#define ITEM_LIECHI_BERRY 168\n#define ITEM_GANLON_BERRY 169\n#define ITEM_SALAC_BERRY 170\n#define ITEM_PETAYA_BERRY 171\n#define ITEM_APICOT_BERRY 172\n#define ITEM_LANSAT_BERRY 173\n#define ITEM_STARF_BERRY 174\n#define ITEM_ENIGMA_BERRY 175\n\n#define FIRST_BERRY_INDEX ITEM_CHERI_BERRY\n#define LAST_BERRY_INDEX  ITEM_ENIGMA_BERRY\n\n#define ITEM_UNUSED_BERRY_1 176\n#define ITEM_UNUSED_BERRY_2 177\n#define ITEM_UNUSED_BERRY_3 178\n\n#define MAX_BERRY_INDEX ITEM_UNUSED_BERRY_3\n\n#define ITEM_BRIGHT_POWDER 179\n#define ITEM_WHITE_HERB 180\n#define ITEM_MACHO_BRACE 181\n#define ITEM_EXP_SHARE 182\n#define ITEM_QUICK_CLAW 183\n#define ITEM_SOOTHE_BELL 184\n#define ITEM_MENTAL_HERB 185\n#define ITEM_CHOICE_BAND 186\n#define ITEM_KINGS_ROCK 187\n#define ITEM_SILVER_POWDER 188\n#define ITEM_AMULET_COIN 189\n#define ITEM_CLEANSE_TAG 190\n#define ITEM_SOUL_DEW 191\n#define ITEM_DEEP_SEA_TOOTH 192\n#define ITEM_DEEP_SEA_SCALE 193\n#define ITEM_SMOKE_BALL 194\n#define ITEM_EVERSTONE 195\n#define ITEM_FOCUS_BAND 196\n#define ITEM_LUCKY_EGG 197\n#define ITEM_SCOPE_LENS 198\n#define ITEM_METAL_COAT 199\n#define ITEM_LEFTOVERS 200\n#define ITEM_DRAGON_SCALE 201\n#define ITEM_LIGHT_BALL 202\n#define ITEM_SOFT_SAND 203\n#define ITEM_HARD_STONE 204\n#define ITEM_MIRACLE_SEED 205\n#define ITEM_BLACK_GLASSES 206\n#define ITEM_BLACK_BELT 207\n#define ITEM_MAGNET 208\n#define ITEM_MYSTIC_WATER 209\n#define ITEM_SHARP_BEAK 210\n#define ITEM_POISON_BARB 211\n#define ITEM_NEVER_MELT_ICE 212\n#define ITEM_SPELL_TAG 213\n#define ITEM_TWISTED_SPOON 214\n#define ITEM_CHARCOAL 215\n#define ITEM_DRAGON_FANG 216\n#define ITEM_SILK_SCARF 217\n#define ITEM_UP_GRADE 218\n#define ITEM_SHELL_BELL 219\n#define ITEM_SEA_INCENSE 220\n#define ITEM_LAX_INCENSE 221\n#define ITEM_LUCKY_PUNCH 222\n#define ITEM_METAL_POWDER 223\n#define ITEM_THICK_CLUB 224\n#define ITEM_STICK 225\n#define ITEM_0E2 226\n#define ITEM_0E3 227\n#define ITEM_0E4 228\n#define ITEM_0E5 229\n#define ITEM_0E6 230\n#define ITEM_0E7 231\n#define ITEM_0E8 232\n#define ITEM_0E9 233\n#define ITEM_0EA 234\n#define ITEM_0EB 235\n#define ITEM_0EC 236\n#define ITEM_0ED 237\n#define ITEM_0EE 238\n#define ITEM_0EF 239\n#define ITEM_0F0 240\n#define ITEM_0F1 241\n#define ITEM_0F2 242\n#define ITEM_0F3 243\n#define ITEM_0F4 244\n#define ITEM_0F5 245\n#define ITEM_0F6 246\n#define ITEM_0F7 247\n#define ITEM_0F8 248\n#define ITEM_0F9 249\n#define ITEM_0FA 250\n#define ITEM_0FB 251\n#define ITEM_0FC 252\n#define ITEM_0FD 253\n#define ITEM_RED_SCARF 254\n#define ITEM_BLUE_SCARF 255\n#define ITEM_PINK_SCARF 256\n#define ITEM_GREEN_SCARF 257\n#define ITEM_YELLOW_SCARF 258\n#define ITEM_MACH_BIKE 259\n#define ITEM_COIN_CASE 260\n#define ITEM_ITEMFINDER 261\n#define ITEM_OLD_ROD 262\n#define ITEM_GOOD_ROD 263\n#define ITEM_SUPER_ROD 264\n#define ITEM_SS_TICKET 265\n#define ITEM_CONTEST_PASS 266\n#define ITEM_10B 267\n#define ITEM_WAILMER_PAIL 268\n#define ITEM_DEVON_GOODS 269\n#define ITEM_SOOT_SACK 270\n#define ITEM_BASEMENT_KEY 271\n#define ITEM_ACRO_BIKE 272\n#define ITEM_POKEBLOCK_CASE 273\n#define ITEM_LETTER 274\n#define ITEM_EON_TICKET 275\n#define ITEM_RED_ORB 276\n#define ITEM_BLUE_ORB 277\n#define ITEM_SCANNER 278\n#define ITEM_GO_GOGGLES 279\n#define ITEM_METEORITE 280\n#define ITEM_ROOM_1_KEY 281\n#define ITEM_ROOM_2_KEY 282\n#define ITEM_ROOM_4_KEY 283\n#define ITEM_ROOM_6_KEY 284\n#define ITEM_STORAGE_KEY 285\n#define ITEM_ROOT_FOSSIL 286\n#define ITEM_CLAW_FOSSIL 287\n#define ITEM_DEVON_SCOPE 288\n#define ITEM_TM01 289\n#define ITEM_TM02 290\n#define ITEM_TM03 291\n#define ITEM_TM04 292\n#define ITEM_TM05 293\n#define ITEM_TM06 294\n#define ITEM_TM07 295\n#define ITEM_TM08 296\n#define ITEM_TM09 297\n#define ITEM_TM10 298\n#define ITEM_TM11 299\n#define ITEM_TM12 300\n#define ITEM_TM13 301\n#define ITEM_TM14 302\n#define ITEM_TM15 303\n#define ITEM_TM16 304\n#define ITEM_TM17 305\n#define ITEM_TM18 306\n#define ITEM_TM19 307\n#define ITEM_TM20 308\n#define ITEM_TM21 309\n#define ITEM_TM22 310\n#define ITEM_TM23 311\n#define ITEM_TM24 312\n#define ITEM_TM25 313\n#define ITEM_TM26 314\n#define ITEM_TM27 315\n#define ITEM_TM28 316\n#define ITEM_TM29 317\n#define ITEM_TM30 318\n#define ITEM_TM31 319\n#define ITEM_TM32 320\n#define ITEM_TM33 321\n#define ITEM_TM34 322\n#define ITEM_TM35 323\n#define ITEM_TM36 324\n#define ITEM_TM37 325\n#define ITEM_TM38 326\n#define ITEM_TM39 327\n#define ITEM_TM40 328\n#define ITEM_TM41 329\n#define ITEM_TM42 330\n#define ITEM_TM43 331\n#define ITEM_TM44 332\n#define ITEM_TM45 333\n#define ITEM_TM46 334\n#define ITEM_TM47 335\n#define ITEM_TM48 336\n#define ITEM_TM49 337\n#define ITEM_TM50 338\n#define ITEM_HM01 339\n#define ITEM_HM02 340\n#define ITEM_HM03 341\n#define ITEM_HM04 342\n#define ITEM_HM05 343\n#define ITEM_HM06 344\n#define ITEM_HM07 345\n#define ITEM_HM08 346\n#define ITEM_15B 347\n#define ITEM_15C 348\n\n#define ITEM_TM01_FOCUS_PUNCH ITEM_TM01\n#define ITEM_TM02_DRAGON_CLAW ITEM_TM02\n#define ITEM_TM03_WATER_PULSE ITEM_TM03\n#define ITEM_TM04_CALM_MIND ITEM_TM04\n#define ITEM_TM05_ROAR ITEM_TM05\n#define ITEM_TM06_TOXIC ITEM_TM06\n#define ITEM_TM07_HAIL ITEM_TM07\n#define ITEM_TM08_BULK_UP ITEM_TM08\n#define ITEM_TM09_BULLET_SEED ITEM_TM09\n#define ITEM_TM10_HIDDEN_POWER ITEM_TM10\n#define ITEM_TM11_SUNNY_DAY ITEM_TM11\n#define ITEM_TM12_TAUNT ITEM_TM12\n#define ITEM_TM13_ICE_BEAM ITEM_TM13\n#define ITEM_TM14_BLIZZARD ITEM_TM14\n#define ITEM_TM15_HYPER_BEAM ITEM_TM15\n#define ITEM_TM16_LIGHT_SCREEN ITEM_TM16\n#define ITEM_TM17_PROTECT ITEM_TM17\n#define ITEM_TM18_RAIN_DANCE ITEM_TM18\n#define ITEM_TM19_GIGA_DRAIN ITEM_TM19\n#define ITEM_TM20_SAFEGUARD ITEM_TM20\n#define ITEM_TM21_FRUSTRATION ITEM_TM21\n#define ITEM_TM22_SOLAR_BEAM ITEM_TM22\n#define ITEM_TM23_IRON_TAIL ITEM_TM23\n#define ITEM_TM24_THUNDERBOLT ITEM_TM24\n#define ITEM_TM25_THUNDER ITEM_TM25\n#define ITEM_TM26_EARTHQUAKE ITEM_TM26\n#define ITEM_TM27_RETURN ITEM_TM27\n#define ITEM_TM28_DIG ITEM_TM28\n#define ITEM_TM29_PSYCHIC ITEM_TM29\n#define ITEM_TM30_SHADOW_BALL ITEM_TM30\n#define ITEM_TM31_BRICK_BREAK ITEM_TM31\n#define ITEM_TM32_DOUBLE_TEAM ITEM_TM32\n#define ITEM_TM33_REFLECT ITEM_TM33\n#define ITEM_TM34_SHOCK_WAVE ITEM_TM34\n#define ITEM_TM35_FLAMETHROWER ITEM_TM35\n#define ITEM_TM36_SLUDGE_BOMB ITEM_TM36\n#define ITEM_TM37_SANDSTORM ITEM_TM37\n#define ITEM_TM38_FIRE_BLAST ITEM_TM38\n#define ITEM_TM39_ROCK_TOMB ITEM_TM39\n#define ITEM_TM40_AERIAL_ACE ITEM_TM40\n#define ITEM_TM41_TORMENT ITEM_TM41\n#define ITEM_TM42_FACADE ITEM_TM42\n#define ITEM_TM43_SECRET_POWER ITEM_TM43\n#define ITEM_TM44_REST ITEM_TM44\n#define ITEM_TM45_ATTRACT ITEM_TM45\n#define ITEM_TM46_THIEF ITEM_TM46\n#define ITEM_TM47_STEEL_WING ITEM_TM47\n#define ITEM_TM48_SKILL_SWAP ITEM_TM48\n#define ITEM_TM49_SNATCH ITEM_TM49\n#define ITEM_TM50_OVERHEAT ITEM_TM50\n#define ITEM_HM01_CUT ITEM_HM01\n#define ITEM_HM02_FLY ITEM_HM02\n#define ITEM_HM03_SURF ITEM_HM03\n#define ITEM_HM04_STRENGTH ITEM_HM04\n#define ITEM_HM05_FLASH ITEM_HM05\n#define ITEM_HM06_ROCK_SMASH ITEM_HM06\n#define ITEM_HM07_WATERFALL ITEM_HM07\n#define ITEM_HM08_DIVE ITEM_HM08\n\n// FireRed/LeafGreen\n#define ITEM_OAKS_PARCEL 349\n#define ITEM_POKE_FLUTE 350\n#define ITEM_SECRET_KEY 351\n#define ITEM_BIKE_VOUCHER 352\n#define ITEM_GOLD_TEETH 353\n#define ITEM_OLD_AMBER 354\n#define ITEM_CARD_KEY 355\n#define ITEM_LIFT_KEY 356\n#define ITEM_HELIX_FOSSIL 357\n#define ITEM_DOME_FOSSIL 358\n#define ITEM_SILPH_SCOPE 359\n#define ITEM_BICYCLE 360\n#define ITEM_TOWN_MAP 361\n#define ITEM_VS_SEEKER 362\n#define ITEM_FAME_CHECKER 363\n#define ITEM_TM_CASE 364\n#define ITEM_BERRY_POUCH 365\n#define ITEM_TEACHY_TV 366\n#define ITEM_TRI_PASS 367\n#define ITEM_RAINBOW_PASS 368\n#define ITEM_TEA 369\n#define ITEM_MYSTIC_TICKET 370\n#define ITEM_AURORA_TICKET 371\n#define ITEM_POWDER_JAR 372\n#define ITEM_RUBY 373\n#define ITEM_SAPPHIRE 374\n\n// Emerald\n#define ITEM_MAGMA_EMBLEM 375\n#define ITEM_OLD_SEA_MAP 376\n\n#define ITEMS_COUNT 377\n\n#define ITEM_TO_BERRY(itemId)(((itemId - FIRST_BERRY_INDEX) + 1))\n#define MAIL_NONE 0xFF\n\n#define NUM_TECHNICAL_MACHINES 50\n#define NUM_HIDDEN_MACHINES     8\n\n// Secondary IDs for rods\n#define OLD_ROD   0\n#define GOOD_ROD  1\n#define SUPER_ROD 2\n\n// Check if the item is one that can be used on a Pokemon.\n#define IS_POKEMON_ITEM(item) ((item) >= ITEM_POTION && (item) <= MAX_BERRY_INDEX)\n\n#endif  // GUARD_CONSTANTS_ITEMS_H\n"
  },
  {
    "path": "include/constants/layouts.h",
    "content": "#ifndef GUARD_CONSTANTS_LAYOUTS_H\n#define GUARD_CONSTANTS_LAYOUTS_H\n\n//\n// DO NOT MODIFY THIS FILE! It is auto-generated from data/layouts/layouts.json\n//\n\n#define LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_1F 1\n#define LAYOUT_PALLET_TOWN_PLAYERS_HOUSE_2F 2\n#define LAYOUT_PALLET_TOWN_RIVALS_HOUSE 3\n#define LAYOUT_LITTLEROOT_TOWN_MAYS_HOUSE_2F 4\n#define LAYOUT_PALLET_TOWN_PROFESSOR_OAKS_LAB 5\n#define LAYOUT_HOUSE1 6\n#define LAYOUT_HOUSE2 7\n#define LAYOUT_POKEMON_CENTER_1F 8\n#define LAYOUT_POKEMON_CENTER_2F 9\n#define LAYOUT_MART 10\n#define LAYOUT_HOUSE3 11\n#define LAYOUT_CERULEAN_CITY_GYM 12\n#define LAYOUT_HOUSE4 13\n#define LAYOUT_LAVARIDGE_TOWN_HERB_SHOP 14\n#define LAYOUT_CELADON_CITY_GYM 15\n#define LAYOUT_RS_POKEMON_CENTER_1F 16\n#define LAYOUT_FIVE_ISLAND_RESORT_GORGEOUS_HOUSE 17\n#define LAYOUT_PACIFIDLOG_TOWN_HOUSE1 18\n#define LAYOUT_PACIFIDLOG_TOWN_HOUSE2 19\n#define LAYOUT_FUCHSIA_CITY_GYM 20\n#define LAYOUT_HOUSE5 21\n#define LAYOUT_UNUSED1 22\n#define LAYOUT_VERMILION_CITY_GYM 23\n#define LAYOUT_CERULEAN_CITY_BIKE_SHOP 24\n#define LAYOUT_CELADON_CITY_GAME_CORNER 25\n#define LAYOUT_PEWTER_CITY_GYM 26\n#define LAYOUT_FOUR_ISLAND_LORELEIS_HOUSE 27\n#define LAYOUT_THREE_ISLAND_HOUSE1 28\n#define LAYOUT_RUSTBORO_CITY_CUTTERS_HOUSE 29\n#define LAYOUT_FORTREE_CITY_HOUSE1 30\n#define LAYOUT_SAFFRON_CITY_GYM 31\n#define LAYOUT_FORTREE_CITY_HOUSE2 32\n#define LAYOUT_CINNABAR_ISLAND_GYM 33\n#define LAYOUT_VIRIDIAN_CITY_GYM 34\n#define LAYOUT_RS_SAFARI_ZONE_ENTRANCE 35\n#define LAYOUT_BATTLE_COLOSSEUM_2P 36\n#define LAYOUT_TRADE_CENTER 37\n#define LAYOUT_RECORD_CORNER 38\n#define LAYOUT_BATTLE_COLOSSEUM_4P 39\n#define LAYOUT_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE 40\n#define LAYOUT_RS_SAFARI_ZONE_NORTHEAST 41\n#define LAYOUT_RS_SAFARI_ZONE_SOUTHWEST 42\n#define LAYOUT_RS_SAFARI_ZONE_SOUTHEAST 43\n#define LAYOUT_FORTREE_CITY_DECORATION_SHOP 44\n#define LAYOUT_RS_BATTLE_TOWER 45\n#define LAYOUT_SS_TIDAL_CORRIDOR 46\n#define LAYOUT_SS_TIDAL_LOWER_DECK 47\n#define LAYOUT_SS_TIDAL_ROOMS 48\n#define LAYOUT_RUSTBORO_CITY_FLAT2_1F 49\n#define LAYOUT_RUSTBORO_CITY_FLAT2_2F 50\n#define LAYOUT_RUSTBORO_CITY_FLAT2_3F 51\n#define LAYOUT_EVER_GRANDE_CITY_HALL_OF_FAME 52\n#define LAYOUT_MOSSDEEP_CITY_EREADER_TRAINER_HOUSE_1F 53\n#define LAYOUT_MOSSDEEP_CITY_EREADER_TRAINER_HOUSE_2F 54\n#define LAYOUT_SOOTOPOLIS_CITY_HOUSE1 55\n#define LAYOUT_SOOTOPOLIS_CITY_HOUSE2 56\n#define LAYOUT_SOOTOPOLIS_CITY_HOUSE3 57\n#define LAYOUT_RUSTBORO_CITY_FLAT1_1F 58\n#define LAYOUT_RUSTBORO_CITY_FLAT1_2F 59\n#define LAYOUT_RS_SAFARI_ZONE_REST_HOUSE 60\n#define LAYOUT_PALLET_TOWN 61\n#define LAYOUT_VIRIDIAN_CITY 62\n#define LAYOUT_PEWTER_CITY 63\n#define LAYOUT_CERULEAN_CITY 64\n#define LAYOUT_LAVENDER_TOWN 65\n#define LAYOUT_VERMILION_CITY 66\n#define LAYOUT_CELADON_CITY 67\n#define LAYOUT_FUCHSIA_CITY 68\n#define LAYOUT_CINNABAR_ISLAND 69\n#define LAYOUT_INDIGO_PLATEAU_EXTERIOR 70\n#define LAYOUT_SAFFRON_CITY_CONNECTION 71\n#define LAYOUT_ROUTE1 72\n#define LAYOUT_ROUTE2 73\n#define LAYOUT_ROUTE3 74\n#define LAYOUT_ROUTE4 75\n#define LAYOUT_ROUTE5 76\n#define LAYOUT_ROUTE6 77\n#define LAYOUT_ROUTE7 78\n#define LAYOUT_ROUTE8 79\n#define LAYOUT_ROUTE9 80\n#define LAYOUT_ROUTE10 81\n#define LAYOUT_ROUTE11 82\n#define LAYOUT_ROUTE12 83\n#define LAYOUT_ROUTE13 84\n#define LAYOUT_ROUTE14 85\n#define LAYOUT_ROUTE15 86\n#define LAYOUT_ROUTE16 87\n#define LAYOUT_ROUTE17 88\n#define LAYOUT_ROUTE18 89\n#define LAYOUT_ROUTE19 90\n#define LAYOUT_ROUTE20 91\n#define LAYOUT_ROUTE21_NORTH 92\n#define LAYOUT_ROUTE22 93\n#define LAYOUT_ROUTE23 94\n#define LAYOUT_ROUTE24 95\n#define LAYOUT_ROUTE25 96\n#define LAYOUT_MT_MOON_1F 97\n#define LAYOUT_MT_MOON_B1F 98\n#define LAYOUT_MT_MOON_B2F 99\n#define LAYOUT_VIRIDIAN_FOREST 100\n#define LAYOUT_SSANNE_EXTERIOR 101\n#define LAYOUT_SSANNE_1F_CORRIDOR 102\n#define LAYOUT_SSANNE_2F_CORRIDOR 103\n#define LAYOUT_SSANNE_3F_CORRIDOR 104\n#define LAYOUT_SSANNE_B1F_CORRIDOR 105\n#define LAYOUT_SSANNE_DECK 106\n#define LAYOUT_DIGLETTS_CAVE_B1F 107\n#define LAYOUT_VICTORY_ROAD_1F 108\n#define LAYOUT_VICTORY_ROAD_2F 109\n#define LAYOUT_VICTORY_ROAD_3F 110\n#define LAYOUT_ROCKET_HIDEOUT_B1F 111\n#define LAYOUT_ROCKET_HIDEOUT_B2F 112\n#define LAYOUT_ROCKET_HIDEOUT_B3F 113\n#define LAYOUT_ROCKET_HIDEOUT_B4F 114\n#define LAYOUT_SILPH_CO_1F 115\n#define LAYOUT_SILPH_CO_2F 116\n#define LAYOUT_SILPH_CO_3F 117\n#define LAYOUT_SILPH_CO_4F 118\n#define LAYOUT_SILPH_CO_5F 119\n#define LAYOUT_SILPH_CO_6F 120\n#define LAYOUT_SILPH_CO_7F 121\n#define LAYOUT_SILPH_CO_8F 122\n#define LAYOUT_SILPH_CO_9F 123\n#define LAYOUT_SILPH_CO_10F 124\n#define LAYOUT_SILPH_CO_11F 125\n#define LAYOUT_POKEMON_MANSION_1F 126\n#define LAYOUT_POKEMON_MANSION_2F 127\n#define LAYOUT_POKEMON_MANSION_3F 128\n#define LAYOUT_POKEMON_MANSION_B1F 129\n#define LAYOUT_SAFARI_ZONE_CENTER 130\n#define LAYOUT_SAFARI_ZONE_EAST 131\n#define LAYOUT_SAFARI_ZONE_NORTH 132\n#define LAYOUT_SAFARI_ZONE_WEST 133\n#define LAYOUT_CERULEAN_CAVE_1F 134\n#define LAYOUT_CERULEAN_CAVE_2F 135\n#define LAYOUT_CERULEAN_CAVE_B1F 136\n#define LAYOUT_ROCK_TUNNEL_1F 137\n#define LAYOUT_ROCK_TUNNEL_B1F 138\n#define LAYOUT_SEAFOAM_ISLANDS_1F 139\n#define LAYOUT_SEAFOAM_ISLANDS_B1F 140\n#define LAYOUT_SEAFOAM_ISLANDS_B2F 141\n#define LAYOUT_SEAFOAM_ISLANDS_B3F 142\n#define LAYOUT_SEAFOAM_ISLANDS_B4F 143\n#define LAYOUT_POKEMON_TOWER_1F 144\n#define LAYOUT_POKEMON_TOWER_2F 145\n#define LAYOUT_POKEMON_TOWER_3F 146\n#define LAYOUT_POKEMON_TOWER_4F 147\n#define LAYOUT_POKEMON_TOWER_5F 148\n#define LAYOUT_POKEMON_TOWER_6F 149\n#define LAYOUT_POKEMON_TOWER_7F 150\n#define LAYOUT_POWER_PLANT 151\n#define LAYOUT_ROUTE25_SEA_COTTAGE 152\n#define LAYOUT_SSANNE_KITCHEN 153\n#define LAYOUT_SSANNE_CAPTAINS_OFFICE 154\n#define LAYOUT_UNDERGROUND_PATH_ENTRANCE 155\n#define LAYOUT_UNDERGROUND_PATH_EAST_WEST_TUNNEL 156\n#define LAYOUT_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL 157\n#define LAYOUT_ROUTE12_NORTH_ENTRANCE_1F 158\n#define LAYOUT_SSANNE_ROOM1 159\n#define LAYOUT_SSANNE_ROOM2 160\n#define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR 161\n#define LAYOUT_PEWTER_CITY_MUSEUM_1F 162\n#define LAYOUT_PEWTER_CITY_MUSEUM_2F 163\n#define LAYOUT_CERULEAN_CITY_HOUSE2 164\n#define LAYOUT_CERULEAN_CITY_HOUSE1 165\n#define LAYOUT_CELADON_CITY_CONDOMINIUMS_1F 166\n#define LAYOUT_CELADON_CITY_CONDOMINIUMS_2F 167\n#define LAYOUT_CELADON_CITY_CONDOMINIUMS_3F 168\n#define LAYOUT_CELADON_CITY_CONDOMINIUMS_ROOF 169\n#define LAYOUT_CELADON_CITY_CONDOMINIUMS_ROOF_ROOM 170\n#define LAYOUT_CELADON_CITY_GAME_CORNER_PRIZE_ROOM 171\n#define LAYOUT_CELADON_CITY_RESTAURANT 172\n#define LAYOUT_CELADON_CITY_HOTEL 173\n#define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_1F 174\n#define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_2F 175\n#define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_3F 176\n#define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_4F 177\n#define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_5F 178\n#define LAYOUT_CELADON_CITY_DEPARTMENT_STORE_ROOF 179\n#define LAYOUT_SAFARI_ZONE_REST_HOUSE 180\n#define LAYOUT_SAFARI_ZONE_SECRET_HOUSE 181\n#define LAYOUT_FUCHSIA_CITY_SAFARI_ZONE_OFFICE 182\n#define LAYOUT_FUCHSIA_CITY_WARDENS_HOUSE 183\n#define LAYOUT_FUCHSIA_CITY_HOUSE2 184\n#define LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE 185\n#define LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_LOUNGE 186\n#define LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_RESEARCH_ROOM 187\n#define LAYOUT_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM 188\n#define LAYOUT_SAFFRON_CITY 189\n#define LAYOUT_SAFFRON_CITY_NORTH_SOUTH_ENTRANCE 190\n#define LAYOUT_SAFFRON_CITY_EAST_WEST_ENTRANCE 191\n#define LAYOUT_DIGLETTS_CAVE_NORTH_ENTRANCE 192\n#define LAYOUT_DIGLETTS_CAVE_SOUTH_ENTRANCE 193\n#define LAYOUT_INDIGO_PLATEAU_POKEMON_CENTER_1F 194\n#define LAYOUT_POKEMON_LEAGUE_LORELEIS_ROOM 195\n#define LAYOUT_POKEMON_LEAGUE_BRUNOS_ROOM 196\n#define LAYOUT_POKEMON_LEAGUE_AGATHAS_ROOM 197\n#define LAYOUT_POKEMON_LEAGUE_LANCES_ROOM 198\n#define LAYOUT_POKEMON_LEAGUE_CHAMPIONS_ROOM 199\n#define LAYOUT_POKEMON_LEAGUE_HALL_OF_FAME 200\n#define LAYOUT_ROUTE21_SOUTH 201\n#define LAYOUT_ENTRANCE_2F 202\n#define LAYOUT_ROUTE2_ENTRANCE 203\n#define LAYOUT_ROUTE22_NORTH_ENTRANCE 204\n#define LAYOUT_ROUTE16_NORTH_ENTRANCE_1F 205\n#define LAYOUT_ENTRANCE_1F 206\n#define LAYOUT_ROCKET_HIDEOUT_ELEVATOR 207\n#define LAYOUT_SAFFRON_CITY_COPYCATS_HOUSE_1F 208\n#define LAYOUT_SAFFRON_CITY_COPYCATS_HOUSE_2F 209\n#define LAYOUT_SAFFRON_CITY_DOJO 210\n#define LAYOUT_SILPH_CO_ELEVATOR 211\n#define LAYOUT_ONE_ISLAND 212\n#define LAYOUT_TWO_ISLAND 213\n#define LAYOUT_THREE_ISLAND 214\n#define LAYOUT_FOUR_ISLAND 215\n#define LAYOUT_FIVE_ISLAND 216\n#define LAYOUT_SEVEN_ISLAND 217\n#define LAYOUT_SIX_ISLAND 218\n#define LAYOUT_ONE_ISLAND_KINDLE_ROAD 219\n#define LAYOUT_ONE_ISLAND_TREASURE_BEACH 220\n#define LAYOUT_TWO_ISLAND_CAPE_BRINK 221\n#define LAYOUT_THREE_ISLAND_BOND_BRIDGE 222\n#define LAYOUT_THREE_ISLAND_PORT 223\n#define LAYOUT_PROTOTYPE_SEVII_ISLE_6 224\n#define LAYOUT_PROTOTYPE_SEVII_ISLE_7 225\n#define LAYOUT_PROTOTYPE_SEVII_ISLE_8 226\n#define LAYOUT_PROTOTYPE_SEVII_ISLE_9 227\n#define LAYOUT_FIVE_ISLAND_RESORT_GORGEOUS 228\n#define LAYOUT_FIVE_ISLAND_WATER_LABYRINTH 229\n#define LAYOUT_FIVE_ISLAND_MEADOW 230\n#define LAYOUT_FIVE_ISLAND_MEMORIAL_PILLAR 231\n#define LAYOUT_SIX_ISLAND_OUTCAST_ISLAND 232\n#define LAYOUT_SIX_ISLAND_GREEN_PATH 233\n#define LAYOUT_SIX_ISLAND_WATER_PATH 234\n#define LAYOUT_SIX_ISLAND_RUIN_VALLEY 235\n#define LAYOUT_SEVEN_ISLAND_TRAINER_TOWER 236\n#define LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE 237\n#define LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON 238\n#define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS 239\n#define LAYOUT_PROTOTYPE_SEVII_ISLE_22 240\n#define LAYOUT_PROTOTYPE_SEVII_ISLE_23_EAST 241\n#define LAYOUT_PROTOTYPE_SEVII_ISLE_23_WEST 242\n#define LAYOUT_PROTOTYPE_SEVII_ISLE_24 243\n#define LAYOUT_UNION_ROOM 244\n#define LAYOUT_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB 245\n#define LAYOUT_SEVEN_ISLAND_HOUSE_ROOM1_DOOR_OPEN 246\n#define LAYOUT_SEVEN_ISLAND_HOUSE_ROOM2 247\n#define LAYOUT_VIRIDIAN_CITY_SCHOOL 248\n#define LAYOUT_CELADON_CITY_RESTAURANT_DUPLICATE 249\n#define LAYOUT_CELADON_CITY_HOTEL_DUPLICATE 250\n#define LAYOUT_MT_EMBER_RUBY_PATH_B4F 251\n#define LAYOUT_THREE_ISLAND_BERRY_FOREST 252\n#define LAYOUT_ONE_ISLAND_POKEMON_CENTER_1F 253\n#define LAYOUT_TWO_ISLAND_JOYFUL_GAME_CORNER 254\n#define LAYOUT_VERMILION_CITY_POKEMON_FAN_CLUB 255\n#define LAYOUT_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE 256\n#define LAYOUT_ROUTE5_POKEMON_DAY_CARE 257\n#define LAYOUT_VIRIDIAN_CITY_HOUSE 258\n#define LAYOUT_FOUR_ISLAND_POKEMON_DAY_CARE 259\n#define LAYOUT_SEAFOAM_ISLANDS_B3F_CURRENT_STOPPED 260\n#define LAYOUT_SEAFOAM_ISLANDS_B4F_CURRENT_STOPPED 261\n#define LAYOUT_MT_EMBER_EXTERIOR 262\n#define LAYOUT_MT_EMBER_SUMMIT 263\n#define LAYOUT_MT_EMBER_SUMMIT_PATH_1F 264\n#define LAYOUT_MT_EMBER_SUMMIT_PATH_2F 265\n#define LAYOUT_MT_EMBER_SUMMIT_PATH_3F 266\n#define LAYOUT_MT_EMBER_RUBY_PATH_1F 267\n#define LAYOUT_MT_EMBER_RUBY_PATH_B1F 268\n#define LAYOUT_MT_EMBER_RUBY_PATH_B2F 269\n#define LAYOUT_MT_EMBER_RUBY_PATH_B3F 270\n#define LAYOUT_MT_EMBER_RUBY_PATH_B1F_STAIRS 271\n#define LAYOUT_MT_EMBER_RUBY_PATH_B2F_STAIRS 272\n#define LAYOUT_MT_EMBER_RUBY_PATH_B5F 273\n#define LAYOUT_FIVE_ISLAND_ROCKET_WAREHOUSE 274\n#define LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE 275\n#define LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_1F 276\n#define LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_B1F 277\n#define LAYOUT_FOUR_ISLAND_ICEFALL_CAVE_BACK 278\n#define LAYOUT_TRAINER_TOWER_LOBBY 279\n#define LAYOUT_TRAINER_TOWER_1F 280\n#define LAYOUT_TRAINER_TOWER_2F 281\n#define LAYOUT_TRAINER_TOWER_3F 282\n#define LAYOUT_TRAINER_TOWER_4F 283\n#define LAYOUT_TRAINER_TOWER_5F 284\n#define LAYOUT_TRAINER_TOWER_6F 285\n#define LAYOUT_TRAINER_TOWER_7F 286\n#define LAYOUT_TRAINER_TOWER_8F 287\n#define LAYOUT_TRAINER_TOWER_ROOF 288\n#define LAYOUT_TRAINER_TOWER_ELEVATOR 289\n#define LAYOUT_CERULEAN_CITY_HOUSE5 290\n#define LAYOUT_SIX_ISLAND_DOTTED_HOLE_1F 291\n#define LAYOUT_SIX_ISLAND_DOTTED_HOLE_B1F 292\n#define LAYOUT_SIX_ISLAND_DOTTED_HOLE_B2F 293\n#define LAYOUT_SIX_ISLAND_DOTTED_HOLE_B3F 294\n#define LAYOUT_SIX_ISLAND_DOTTED_HOLE_B4F 295\n#define LAYOUT_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM 296\n#define LAYOUT_ISLAND_HARBOR 297\n#define LAYOUT_ONE_ISLAND_POKEMON_CENTER_2F 298\n#define LAYOUT_SIX_ISLAND_PATTERN_BUSH 299\n#define LAYOUT_THREE_ISLAND_DUNSPARCE_TUNNEL 300\n#define LAYOUT_THREE_ISLAND_DUNSPARCE_TUNNEL_DUG_OUT 301\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ENTRANCE 302\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM1 303\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM2 304\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM3 305\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM4 306\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM5 307\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM6 308\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM7 309\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM8 310\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM9 311\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM10 312\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM11 313\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM12 314\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM13 315\n#define LAYOUT_FIVE_ISLAND_LOST_CAVE_ROOM14 316\n#define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER 317\n#define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER 318\n#define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER 319\n#define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER 320\n#define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER 321\n#define LAYOUT_SIX_ISLAND_ALTERING_CAVE 322\n#define LAYOUT_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY 323\n#define LAYOUT_BIRTH_ISLAND_EXTERIOR 324\n#define LAYOUT_NAVEL_ROCK_EXTERIOR 325\n#define LAYOUT_NAVEL_ROCK_1F 326\n#define LAYOUT_NAVEL_ROCK_SUMMIT 327\n#define LAYOUT_NAVEL_ROCK_BASE 328\n#define LAYOUT_NAVEL_ROCK_SUMMIT_PATH_2F 329\n#define LAYOUT_NAVEL_ROCK_SUMMIT_PATH_3F 330\n#define LAYOUT_NAVEL_ROCK_SUMMIT_PATH_4F 331\n#define LAYOUT_NAVEL_ROCK_SUMMIT_PATH_5F 332\n#define LAYOUT_NAVEL_ROCK_BASE_PATH_B1F 333\n#define LAYOUT_NAVEL_ROCK_BASE_PATH_B2F 334\n#define LAYOUT_NAVEL_ROCK_BASE_PATH_B3F 335\n#define LAYOUT_NAVEL_ROCK_BASE_PATH_B4F 336\n#define LAYOUT_NAVEL_ROCK_BASE_PATH_B5F 337\n#define LAYOUT_NAVEL_ROCK_BASE_PATH_B6F 338\n#define LAYOUT_NAVEL_ROCK_BASE_PATH_B7F 339\n#define LAYOUT_NAVEL_ROCK_BASE_PATH_B8F 340\n#define LAYOUT_NAVEL_ROCK_BASE_PATH_B9F 341\n#define LAYOUT_NAVEL_ROCK_BASE_PATH_B10F 342\n#define LAYOUT_NAVEL_ROCK_BASE_PATH_B11F 343\n#define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER 344\n#define LAYOUT_SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER 345\n#define LAYOUT_NAVEL_ROCK_B1F 346\n#define LAYOUT_NAVEL_ROCK_FORK 347\n#define LAYOUT_TRAINER_TOWER_1F_DOUBLES 348\n#define LAYOUT_TRAINER_TOWER_2F_DOUBLES 349\n#define LAYOUT_TRAINER_TOWER_3F_DOUBLES 350\n#define LAYOUT_TRAINER_TOWER_4F_DOUBLES 351\n#define LAYOUT_TRAINER_TOWER_5F_DOUBLES 352\n#define LAYOUT_TRAINER_TOWER_6F_DOUBLES 353\n#define LAYOUT_TRAINER_TOWER_7F_DOUBLES 354\n#define LAYOUT_TRAINER_TOWER_8F_DOUBLES 355\n#define LAYOUT_TRAINER_TOWER_1F_KNOCKOUT 356\n#define LAYOUT_TRAINER_TOWER_2F_KNOCKOUT 357\n#define LAYOUT_TRAINER_TOWER_3F_KNOCKOUT 358\n#define LAYOUT_TRAINER_TOWER_4F_KNOCKOUT 359\n#define LAYOUT_TRAINER_TOWER_5F_KNOCKOUT 360\n#define LAYOUT_TRAINER_TOWER_6F_KNOCKOUT 361\n#define LAYOUT_TRAINER_TOWER_7F_KNOCKOUT 362\n#define LAYOUT_TRAINER_TOWER_8F_KNOCKOUT 363\n#define LAYOUT_SEVEN_ISLAND_HOUSE_ROOM1 364\n#define LAYOUT_ONE_ISLAND_KINDLE_ROAD_EMBER_SPA 365\n#define LAYOUT_FARAWAY_ISLAND_EXTERIOR 366\n#define LAYOUT_FARAWAY_ISLAND_INTERIOR 367\n#define LAYOUT_ONE_ISLAND_KINDLE_ROAD_GLASS_WORKSHOP 368\n#define LAYOUT_ROUTE20_UNDERWATER 369\n#define LAYOUT_BATTLE_FRONTIER_OUTSIDE_WEST 370\n#define LAYOUT_BATTLE_FRONTIER_OUTSIDE_EAST 371\n#define LAYOUT_RS_BATTLE_TOWER_LOBBY 372\n#define LAYOUT_RS_BATTLE_TOWER_ELEVATOR 373\n#define LAYOUT_RS_BATTLE_TOWER_CORRIDOR 374\n#define LAYOUT_RS_BATTLE_TOWER_BATTLE_ROOM 375\n#define LAYOUT_SAFARI_ZONE_NORTH_WEST 376\n#define LAYOUT_SAFARI_ZONE_NORTH_EAST 377\n#define LAYOUT_THREE_ISLAND_BOND_BRIDGE_UNDERWATER 378\n#define LAYOUT_ARTISAN_CAVE_B1F 379\n#define LAYOUT_ARTISAN_CAVE_1F 380\n#define LAYOUT_SOUTHERN_ISLAND_EXTERIOR 381\n#define LAYOUT_SOUTHERN_ISLAND_INTERIOR 382\n#define LAYOUT_CERULEAN_CAVE_1F_BLUE 383\n#define LAYOUT_CERULEAN_CAVE_2F_BLUE 384\n#define LAYOUT_CERULEAN_CAVE_B1F_BLUE 385\n#define LAYOUT_CERULEAN_CAVE_1F_YELLOW 386\n#define LAYOUT_CERULEAN_CAVE_2F_YELLOW 387\n#define LAYOUT_CERULEAN_CAVE_B1F_YELLOW 388\n#define LAYOUT_FOUR_ISLAND_BASE 389\n#define LAYOUT_FOUR_ISLAND_BASE_CABLE_CAR_STATION 390\n#define LAYOUT_FOUR_ISLAND_CABLE_CAR_STATION 391\n#define LAYOUT_BATTLE_FRONTIER_LOUNGE2 392\n#define LAYOUT_BATTLE_FRONTIER_LOUNGE1 393\n#define LAYOUT_BATTLE_FRONTIER_RECEPTION_GATE 394\n#define LAYOUT_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER 395\n#define LAYOUT_BATTLE_FRONTIER_SCOTTS_HOUSE 396\n#define LAYOUT_BATTLE_FRONTIER_RANKING_HALL 397\n\n#endif // GUARD_CONSTANTS_LAYOUTS_H\n"
  },
  {
    "path": "include/constants/map_groups.h",
    "content": "#ifndef GUARD_CONSTANTS_MAP_GROUPS_H\n#define GUARD_CONSTANTS_MAP_GROUPS_H\n\n//\n// DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json\n//\n\n// gMapGroup_Link\n#define MAP_BATTLE_COLOSSEUM_2P (0 | (0 << 8))\n#define MAP_TRADE_CENTER        (1 | (0 << 8))\n#define MAP_RECORD_CORNER       (2 | (0 << 8))\n#define MAP_BATTLE_COLOSSEUM_4P (3 | (0 << 8))\n#define MAP_UNION_ROOM          (4 | (0 << 8))\n\n// gMapGroup_Dungeons\n#define MAP_VIRIDIAN_FOREST                      (0 | (1 << 8))\n#define MAP_MT_MOON_1F                           (1 | (1 << 8))\n#define MAP_MT_MOON_B1F                          (2 | (1 << 8))\n#define MAP_MT_MOON_B2F                          (3 | (1 << 8))\n#define MAP_SSANNE_EXTERIOR                      (4 | (1 << 8))\n#define MAP_SSANNE_1F_CORRIDOR                   (5 | (1 << 8))\n#define MAP_SSANNE_2F_CORRIDOR                   (6 | (1 << 8))\n#define MAP_SSANNE_3F_CORRIDOR                   (7 | (1 << 8))\n#define MAP_SSANNE_B1F_CORRIDOR                  (8 | (1 << 8))\n#define MAP_SSANNE_DECK                          (9 | (1 << 8))\n#define MAP_SSANNE_KITCHEN                       (10 | (1 << 8))\n#define MAP_SSANNE_CAPTAINS_OFFICE               (11 | (1 << 8))\n#define MAP_SSANNE_1F_ROOM1                      (12 | (1 << 8))\n#define MAP_SSANNE_1F_ROOM2                      (13 | (1 << 8))\n#define MAP_SSANNE_1F_ROOM3                      (14 | (1 << 8))\n#define MAP_SSANNE_1F_ROOM4                      (15 | (1 << 8))\n#define MAP_SSANNE_1F_ROOM5                      (16 | (1 << 8))\n#define MAP_SSANNE_1F_ROOM7                      (17 | (1 << 8))\n#define MAP_SSANNE_2F_ROOM1                      (18 | (1 << 8))\n#define MAP_SSANNE_2F_ROOM2                      (19 | (1 << 8))\n#define MAP_SSANNE_2F_ROOM3                      (20 | (1 << 8))\n#define MAP_SSANNE_2F_ROOM4                      (21 | (1 << 8))\n#define MAP_SSANNE_2F_ROOM5                      (22 | (1 << 8))\n#define MAP_SSANNE_2F_ROOM6                      (23 | (1 << 8))\n#define MAP_SSANNE_B1F_ROOM1                     (24 | (1 << 8))\n#define MAP_SSANNE_B1F_ROOM2                     (25 | (1 << 8))\n#define MAP_SSANNE_B1F_ROOM3                     (26 | (1 << 8))\n#define MAP_SSANNE_B1F_ROOM4                     (27 | (1 << 8))\n#define MAP_SSANNE_B1F_ROOM5                     (28 | (1 << 8))\n#define MAP_SSANNE_1F_ROOM6                      (29 | (1 << 8))\n#define MAP_UNDERGROUND_PATH_NORTH_ENTRANCE      (30 | (1 << 8))\n#define MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL  (31 | (1 << 8))\n#define MAP_UNDERGROUND_PATH_SOUTH_ENTRANCE      (32 | (1 << 8))\n#define MAP_UNDERGROUND_PATH_WEST_ENTRANCE       (33 | (1 << 8))\n#define MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL    (34 | (1 << 8))\n#define MAP_UNDERGROUND_PATH_EAST_ENTRANCE       (35 | (1 << 8))\n#define MAP_DIGLETTS_CAVE_NORTH_ENTRANCE         (36 | (1 << 8))\n#define MAP_DIGLETTS_CAVE_B1F                    (37 | (1 << 8))\n#define MAP_DIGLETTS_CAVE_SOUTH_ENTRANCE         (38 | (1 << 8))\n#define MAP_VICTORY_ROAD_1F                      (39 | (1 << 8))\n#define MAP_VICTORY_ROAD_2F                      (40 | (1 << 8))\n#define MAP_VICTORY_ROAD_3F                      (41 | (1 << 8))\n#define MAP_ROCKET_HIDEOUT_B1F                   (42 | (1 << 8))\n#define MAP_ROCKET_HIDEOUT_B2F                   (43 | (1 << 8))\n#define MAP_ROCKET_HIDEOUT_B3F                   (44 | (1 << 8))\n#define MAP_ROCKET_HIDEOUT_B4F                   (45 | (1 << 8))\n#define MAP_ROCKET_HIDEOUT_ELEVATOR              (46 | (1 << 8))\n#define MAP_SILPH_CO_1F                          (47 | (1 << 8))\n#define MAP_SILPH_CO_2F                          (48 | (1 << 8))\n#define MAP_SILPH_CO_3F                          (49 | (1 << 8))\n#define MAP_SILPH_CO_4F                          (50 | (1 << 8))\n#define MAP_SILPH_CO_5F                          (51 | (1 << 8))\n#define MAP_SILPH_CO_6F                          (52 | (1 << 8))\n#define MAP_SILPH_CO_7F                          (53 | (1 << 8))\n#define MAP_SILPH_CO_8F                          (54 | (1 << 8))\n#define MAP_SILPH_CO_9F                          (55 | (1 << 8))\n#define MAP_SILPH_CO_10F                         (56 | (1 << 8))\n#define MAP_SILPH_CO_11F                         (57 | (1 << 8))\n#define MAP_SILPH_CO_ELEVATOR                    (58 | (1 << 8))\n#define MAP_POKEMON_MANSION_1F                   (59 | (1 << 8))\n#define MAP_POKEMON_MANSION_2F                   (60 | (1 << 8))\n#define MAP_POKEMON_MANSION_3F                   (61 | (1 << 8))\n#define MAP_POKEMON_MANSION_B1F                  (62 | (1 << 8))\n#define MAP_SAFARI_ZONE_CENTER                   (63 | (1 << 8))\n#define MAP_SAFARI_ZONE_EAST                     (64 | (1 << 8))\n#define MAP_SAFARI_ZONE_NORTH                    (65 | (1 << 8))\n#define MAP_SAFARI_ZONE_WEST                     (66 | (1 << 8))\n#define MAP_SAFARI_ZONE_CENTER_REST_HOUSE        (67 | (1 << 8))\n#define MAP_SAFARI_ZONE_EAST_REST_HOUSE          (68 | (1 << 8))\n#define MAP_SAFARI_ZONE_NORTH_REST_HOUSE         (69 | (1 << 8))\n#define MAP_SAFARI_ZONE_WEST_REST_HOUSE          (70 | (1 << 8))\n#define MAP_SAFARI_ZONE_SECRET_HOUSE             (71 | (1 << 8))\n#define MAP_SAFARI_ZONE_NORTH_WEST               (72 | (1 << 8))\n#define MAP_SAFARI_ZONE_NORTH_EAST               (73 | (1 << 8))\n#define MAP_SAFARI_ZONE_NORTH_WEST_REST_HOUSE    (74 | (1 << 8))\n#define MAP_CERULEAN_CAVE_1F                     (75 | (1 << 8))\n#define MAP_CERULEAN_CAVE_2F                     (76 | (1 << 8))\n#define MAP_CERULEAN_CAVE_B1F                    (77 | (1 << 8))\n#define MAP_POKEMON_LEAGUE_LORELEIS_ROOM         (78 | (1 << 8))\n#define MAP_POKEMON_LEAGUE_BRUNOS_ROOM           (79 | (1 << 8))\n#define MAP_POKEMON_LEAGUE_AGATHAS_ROOM          (80 | (1 << 8))\n#define MAP_POKEMON_LEAGUE_LANCES_ROOM           (81 | (1 << 8))\n#define MAP_POKEMON_LEAGUE_CHAMPIONS_ROOM        (82 | (1 << 8))\n#define MAP_POKEMON_LEAGUE_HALL_OF_FAME          (83 | (1 << 8))\n#define MAP_ROCK_TUNNEL_1F                       (84 | (1 << 8))\n#define MAP_ROCK_TUNNEL_B1F                      (85 | (1 << 8))\n#define MAP_SEAFOAM_ISLANDS_1F                   (86 | (1 << 8))\n#define MAP_SEAFOAM_ISLANDS_B1F                  (87 | (1 << 8))\n#define MAP_SEAFOAM_ISLANDS_B2F                  (88 | (1 << 8))\n#define MAP_SEAFOAM_ISLANDS_B3F                  (89 | (1 << 8))\n#define MAP_SEAFOAM_ISLANDS_B4F                  (90 | (1 << 8))\n#define MAP_POKEMON_TOWER_1F                     (91 | (1 << 8))\n#define MAP_POKEMON_TOWER_2F                     (92 | (1 << 8))\n#define MAP_POKEMON_TOWER_3F                     (93 | (1 << 8))\n#define MAP_POKEMON_TOWER_4F                     (94 | (1 << 8))\n#define MAP_POKEMON_TOWER_5F                     (95 | (1 << 8))\n#define MAP_POKEMON_TOWER_6F                     (96 | (1 << 8))\n#define MAP_POKEMON_TOWER_7F                     (97 | (1 << 8))\n#define MAP_POWER_PLANT                          (98 | (1 << 8))\n#define MAP_MT_EMBER_RUBY_PATH_B4F               (99 | (1 << 8))\n#define MAP_MT_EMBER_EXTERIOR                    (100 | (1 << 8))\n#define MAP_MT_EMBER_SUMMIT_PATH_1F              (101 | (1 << 8))\n#define MAP_MT_EMBER_SUMMIT_PATH_2F              (102 | (1 << 8))\n#define MAP_MT_EMBER_SUMMIT_PATH_3F              (103 | (1 << 8))\n#define MAP_MT_EMBER_SUMMIT                      (104 | (1 << 8))\n#define MAP_MT_EMBER_RUBY_PATH_B5F               (105 | (1 << 8))\n#define MAP_MT_EMBER_RUBY_PATH_1F                (106 | (1 << 8))\n#define MAP_MT_EMBER_RUBY_PATH_B1F               (107 | (1 << 8))\n#define MAP_MT_EMBER_RUBY_PATH_B2F               (108 | (1 << 8))\n#define MAP_MT_EMBER_RUBY_PATH_B3F               (109 | (1 << 8))\n#define MAP_MT_EMBER_RUBY_PATH_B1F_STAIRS        (110 | (1 << 8))\n#define MAP_MT_EMBER_RUBY_PATH_B2F_STAIRS        (111 | (1 << 8))\n#define MAP_THREE_ISLAND_BERRY_FOREST            (112 | (1 << 8))\n#define MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE    (113 | (1 << 8))\n#define MAP_FOUR_ISLAND_ICEFALL_CAVE_1F          (114 | (1 << 8))\n#define MAP_FOUR_ISLAND_ICEFALL_CAVE_B1F         (115 | (1 << 8))\n#define MAP_FOUR_ISLAND_ICEFALL_CAVE_BACK        (116 | (1 << 8))\n#define MAP_FIVE_ISLAND_ROCKET_WAREHOUSE         (117 | (1 << 8))\n#define MAP_SIX_ISLAND_DOTTED_HOLE_1F            (118 | (1 << 8))\n#define MAP_SIX_ISLAND_DOTTED_HOLE_B1F           (119 | (1 << 8))\n#define MAP_SIX_ISLAND_DOTTED_HOLE_B2F           (120 | (1 << 8))\n#define MAP_SIX_ISLAND_DOTTED_HOLE_B3F           (121 | (1 << 8))\n#define MAP_SIX_ISLAND_DOTTED_HOLE_B4F           (122 | (1 << 8))\n#define MAP_SIX_ISLAND_DOTTED_HOLE_SAPPHIRE_ROOM (123 | (1 << 8))\n#define MAP_SIX_ISLAND_PATTERN_BUSH              (124 | (1 << 8))\n#define MAP_SIX_ISLAND_ALTERING_CAVE             (125 | (1 << 8))\n\n// gMapGroup_SpecialArea\n#define MAP_NAVEL_ROCK_EXTERIOR                       (0 | (2 << 8))\n#define MAP_TRAINER_TOWER_1F                          (1 | (2 << 8))\n#define MAP_TRAINER_TOWER_2F                          (2 | (2 << 8))\n#define MAP_TRAINER_TOWER_3F                          (3 | (2 << 8))\n#define MAP_TRAINER_TOWER_4F                          (4 | (2 << 8))\n#define MAP_TRAINER_TOWER_5F                          (5 | (2 << 8))\n#define MAP_TRAINER_TOWER_6F                          (6 | (2 << 8))\n#define MAP_TRAINER_TOWER_7F                          (7 | (2 << 8))\n#define MAP_TRAINER_TOWER_8F                          (8 | (2 << 8))\n#define MAP_TRAINER_TOWER_ROOF                        (9 | (2 << 8))\n#define MAP_TRAINER_TOWER_LOBBY                       (10 | (2 << 8))\n#define MAP_TRAINER_TOWER_ELEVATOR                    (11 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE            (12 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM1               (13 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM2               (14 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM3               (15 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM4               (16 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM5               (17 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM6               (18 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM7               (19 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM8               (20 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM9               (21 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM10              (22 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM11              (23 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM12              (24 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM13              (25 | (2 << 8))\n#define MAP_FIVE_ISLAND_LOST_CAVE_ROOM14              (26 | (2 << 8))\n#define MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER  (27 | (2 << 8))\n#define MAP_SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER  (28 | (2 << 8))\n#define MAP_SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER  (29 | (2 << 8))\n#define MAP_SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER (30 | (2 << 8))\n#define MAP_SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER  (31 | (2 << 8))\n#define MAP_SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER    (32 | (2 << 8))\n#define MAP_SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER (33 | (2 << 8))\n#define MAP_THREE_ISLAND_DUNSPARCE_TUNNEL             (34 | (2 << 8))\n#define MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY    (35 | (2 << 8))\n#define MAP_NAVEL_ROCK_1F                             (36 | (2 << 8))\n#define MAP_NAVEL_ROCK_SUMMIT                         (37 | (2 << 8))\n#define MAP_NAVEL_ROCK_BASE                           (38 | (2 << 8))\n#define MAP_NAVEL_ROCK_SUMMIT_PATH_2F                 (39 | (2 << 8))\n#define MAP_NAVEL_ROCK_SUMMIT_PATH_3F                 (40 | (2 << 8))\n#define MAP_NAVEL_ROCK_SUMMIT_PATH_4F                 (41 | (2 << 8))\n#define MAP_NAVEL_ROCK_SUMMIT_PATH_5F                 (42 | (2 << 8))\n#define MAP_NAVEL_ROCK_BASE_PATH_B1F                  (43 | (2 << 8))\n#define MAP_NAVEL_ROCK_BASE_PATH_B2F                  (44 | (2 << 8))\n#define MAP_NAVEL_ROCK_BASE_PATH_B3F                  (45 | (2 << 8))\n#define MAP_NAVEL_ROCK_BASE_PATH_B4F                  (46 | (2 << 8))\n#define MAP_NAVEL_ROCK_BASE_PATH_B5F                  (47 | (2 << 8))\n#define MAP_NAVEL_ROCK_BASE_PATH_B6F                  (48 | (2 << 8))\n#define MAP_NAVEL_ROCK_BASE_PATH_B7F                  (49 | (2 << 8))\n#define MAP_NAVEL_ROCK_BASE_PATH_B8F                  (50 | (2 << 8))\n#define MAP_NAVEL_ROCK_BASE_PATH_B9F                  (51 | (2 << 8))\n#define MAP_NAVEL_ROCK_BASE_PATH_B10F                 (52 | (2 << 8))\n#define MAP_NAVEL_ROCK_BASE_PATH_B11F                 (53 | (2 << 8))\n#define MAP_NAVEL_ROCK_B1F                            (54 | (2 << 8))\n#define MAP_NAVEL_ROCK_FORK                           (55 | (2 << 8))\n#define MAP_BIRTH_ISLAND_EXTERIOR                     (56 | (2 << 8))\n#define MAP_ONE_ISLAND_KINDLE_ROAD_EMBER_SPA          (57 | (2 << 8))\n#define MAP_BIRTH_ISLAND_HARBOR                       (58 | (2 << 8))\n#define MAP_NAVEL_ROCK_HARBOR                         (59 | (2 << 8))\n#define MAP_FARAWAY_ISLAND_EXTERIOR                   (60 | (2 << 8))\n#define MAP_FARAWAY_ISLAND_INTERIOR                   (61 | (2 << 8))\n#define MAP_ARTISAN_CAVE_B1F                          (62 | (2 << 8))\n#define MAP_ARTISAN_CAVE_1F                           (63 | (2 << 8))\n#define MAP_SOUTHERN_ISLAND_EXTERIOR                  (64 | (2 << 8))\n#define MAP_SOUTHERN_ISLAND_INTERIOR                  (65 | (2 << 8))\n#define MAP_CERULEAN_CAVE_1F_BLUE                     (66 | (2 << 8))\n#define MAP_CERULEAN_CAVE_2F_BLUE                     (67 | (2 << 8))\n#define MAP_CERULEAN_CAVE_B1F_BLUE                    (68 | (2 << 8))\n#define MAP_CERULEAN_CAVE_1F_YELLOW                   (69 | (2 << 8))\n#define MAP_CERULEAN_CAVE_2F_YELLOW                   (70 | (2 << 8))\n#define MAP_CERULEAN_CAVE_B1F_YELLOW                  (71 | (2 << 8))\n\n// gMapGroup_TownsAndRoutes\n#define MAP_PALLET_TOWN                          (0 | (3 << 8))\n#define MAP_VIRIDIAN_CITY                        (1 | (3 << 8))\n#define MAP_PEWTER_CITY                          (2 | (3 << 8))\n#define MAP_CERULEAN_CITY                        (3 | (3 << 8))\n#define MAP_LAVENDER_TOWN                        (4 | (3 << 8))\n#define MAP_VERMILION_CITY                       (5 | (3 << 8))\n#define MAP_CELADON_CITY                         (6 | (3 << 8))\n#define MAP_FUCHSIA_CITY                         (7 | (3 << 8))\n#define MAP_CINNABAR_ISLAND                      (8 | (3 << 8))\n#define MAP_INDIGO_PLATEAU_EXTERIOR              (9 | (3 << 8))\n#define MAP_SAFFRON_CITY                         (10 | (3 << 8))\n#define MAP_SAFFRON_CITY_CONNECTION              (11 | (3 << 8))\n#define MAP_ONE_ISLAND                           (12 | (3 << 8))\n#define MAP_TWO_ISLAND                           (13 | (3 << 8))\n#define MAP_THREE_ISLAND                         (14 | (3 << 8))\n#define MAP_FOUR_ISLAND                          (15 | (3 << 8))\n#define MAP_FIVE_ISLAND                          (16 | (3 << 8))\n#define MAP_SEVEN_ISLAND                         (17 | (3 << 8))\n#define MAP_SIX_ISLAND                           (18 | (3 << 8))\n#define MAP_ROUTE1                               (19 | (3 << 8))\n#define MAP_ROUTE2                               (20 | (3 << 8))\n#define MAP_ROUTE3                               (21 | (3 << 8))\n#define MAP_ROUTE4                               (22 | (3 << 8))\n#define MAP_ROUTE5                               (23 | (3 << 8))\n#define MAP_ROUTE6                               (24 | (3 << 8))\n#define MAP_ROUTE7                               (25 | (3 << 8))\n#define MAP_ROUTE8                               (26 | (3 << 8))\n#define MAP_ROUTE9                               (27 | (3 << 8))\n#define MAP_ROUTE10                              (28 | (3 << 8))\n#define MAP_ROUTE11                              (29 | (3 << 8))\n#define MAP_ROUTE12                              (30 | (3 << 8))\n#define MAP_ROUTE13                              (31 | (3 << 8))\n#define MAP_ROUTE14                              (32 | (3 << 8))\n#define MAP_ROUTE15                              (33 | (3 << 8))\n#define MAP_ROUTE16                              (34 | (3 << 8))\n#define MAP_ROUTE17                              (35 | (3 << 8))\n#define MAP_ROUTE18                              (36 | (3 << 8))\n#define MAP_ROUTE19                              (37 | (3 << 8))\n#define MAP_ROUTE20                              (38 | (3 << 8))\n#define MAP_ROUTE21_NORTH                        (39 | (3 << 8))\n#define MAP_ROUTE21_SOUTH                        (40 | (3 << 8))\n#define MAP_ROUTE22                              (41 | (3 << 8))\n#define MAP_ROUTE23                              (42 | (3 << 8))\n#define MAP_ROUTE24                              (43 | (3 << 8))\n#define MAP_ROUTE25                              (44 | (3 << 8))\n#define MAP_ONE_ISLAND_KINDLE_ROAD               (45 | (3 << 8))\n#define MAP_ONE_ISLAND_TREASURE_BEACH            (46 | (3 << 8))\n#define MAP_TWO_ISLAND_CAPE_BRINK                (47 | (3 << 8))\n#define MAP_THREE_ISLAND_BOND_BRIDGE             (48 | (3 << 8))\n#define MAP_THREE_ISLAND_PORT                    (49 | (3 << 8))\n#define MAP_PROTOTYPE_SEVII_ISLE_6               (50 | (3 << 8))\n#define MAP_PROTOTYPE_SEVII_ISLE_7               (51 | (3 << 8))\n#define MAP_PROTOTYPE_SEVII_ISLE_8               (52 | (3 << 8))\n#define MAP_PROTOTYPE_SEVII_ISLE_9               (53 | (3 << 8))\n#define MAP_FIVE_ISLAND_RESORT_GORGEOUS          (54 | (3 << 8))\n#define MAP_FIVE_ISLAND_WATER_LABYRINTH          (55 | (3 << 8))\n#define MAP_FIVE_ISLAND_MEADOW                   (56 | (3 << 8))\n#define MAP_FIVE_ISLAND_MEMORIAL_PILLAR          (57 | (3 << 8))\n#define MAP_SIX_ISLAND_OUTCAST_ISLAND            (58 | (3 << 8))\n#define MAP_SIX_ISLAND_GREEN_PATH                (59 | (3 << 8))\n#define MAP_SIX_ISLAND_WATER_PATH                (60 | (3 << 8))\n#define MAP_SIX_ISLAND_RUIN_VALLEY               (61 | (3 << 8))\n#define MAP_SEVEN_ISLAND_TRAINER_TOWER           (62 | (3 << 8))\n#define MAP_SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE (63 | (3 << 8))\n#define MAP_SEVEN_ISLAND_SEVAULT_CANYON          (64 | (3 << 8))\n#define MAP_SEVEN_ISLAND_TANOBY_RUINS            (65 | (3 << 8))\n#define MAP_ROUTE20_UNDERWATER                   (66 | (3 << 8))\n#define MAP_THREE_ISLAND_BOND_BRIDGE_UNDERWATER  (67 | (3 << 8))\n#define MAP_FOUR_ISLAND_BASE                     (68 | (3 << 8))\n\n// gMapGroup_IndoorPallet\n#define MAP_PALLET_TOWN_PLAYERS_HOUSE_1F   (0 | (4 << 8))\n#define MAP_PALLET_TOWN_PLAYERS_HOUSE_2F   (1 | (4 << 8))\n#define MAP_PALLET_TOWN_RIVALS_HOUSE       (2 | (4 << 8))\n#define MAP_PALLET_TOWN_PROFESSOR_OAKS_LAB (3 | (4 << 8))\n\n// gMapGroup_IndoorViridian\n#define MAP_VIRIDIAN_CITY_HOUSE             (0 | (5 << 8))\n#define MAP_VIRIDIAN_CITY_GYM               (1 | (5 << 8))\n#define MAP_VIRIDIAN_CITY_SCHOOL            (2 | (5 << 8))\n#define MAP_VIRIDIAN_CITY_MART              (3 | (5 << 8))\n#define MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F (4 | (5 << 8))\n#define MAP_VIRIDIAN_CITY_POKEMON_CENTER_2F (5 | (5 << 8))\n\n// gMapGroup_IndoorPewter\n#define MAP_PEWTER_CITY_MUSEUM_1F         (0 | (6 << 8))\n#define MAP_PEWTER_CITY_MUSEUM_2F         (1 | (6 << 8))\n#define MAP_PEWTER_CITY_GYM               (2 | (6 << 8))\n#define MAP_PEWTER_CITY_MART              (3 | (6 << 8))\n#define MAP_PEWTER_CITY_HOUSE1            (4 | (6 << 8))\n#define MAP_PEWTER_CITY_POKEMON_CENTER_1F (5 | (6 << 8))\n#define MAP_PEWTER_CITY_POKEMON_CENTER_2F (6 | (6 << 8))\n#define MAP_PEWTER_CITY_HOUSE2            (7 | (6 << 8))\n\n// gMapGroup_IndoorCerulean\n#define MAP_CERULEAN_CITY_HOUSE1            (0 | (7 << 8))\n#define MAP_CERULEAN_CITY_HOUSE2            (1 | (7 << 8))\n#define MAP_CERULEAN_CITY_HOUSE3            (2 | (7 << 8))\n#define MAP_CERULEAN_CITY_POKEMON_CENTER_1F (3 | (7 << 8))\n#define MAP_CERULEAN_CITY_POKEMON_CENTER_2F (4 | (7 << 8))\n#define MAP_CERULEAN_CITY_GYM               (5 | (7 << 8))\n#define MAP_CERULEAN_CITY_BIKE_SHOP         (6 | (7 << 8))\n#define MAP_CERULEAN_CITY_MART              (7 | (7 << 8))\n#define MAP_CERULEAN_CITY_HOUSE4            (8 | (7 << 8))\n#define MAP_CERULEAN_CITY_HOUSE5            (9 | (7 << 8))\n\n// gMapGroup_IndoorLavender\n#define MAP_LAVENDER_TOWN_POKEMON_CENTER_1F       (0 | (8 << 8))\n#define MAP_LAVENDER_TOWN_POKEMON_CENTER_2F       (1 | (8 << 8))\n#define MAP_LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE (2 | (8 << 8))\n#define MAP_LAVENDER_TOWN_HOUSE1                  (3 | (8 << 8))\n#define MAP_LAVENDER_TOWN_HOUSE2                  (4 | (8 << 8))\n#define MAP_LAVENDER_TOWN_MART                    (5 | (8 << 8))\n\n// gMapGroup_IndoorVermilion\n#define MAP_VERMILION_CITY_HOUSE1            (0 | (9 << 8))\n#define MAP_VERMILION_CITY_POKEMON_CENTER_1F (1 | (9 << 8))\n#define MAP_VERMILION_CITY_POKEMON_CENTER_2F (2 | (9 << 8))\n#define MAP_VERMILION_CITY_POKEMON_FAN_CLUB  (3 | (9 << 8))\n#define MAP_VERMILION_CITY_HOUSE2            (4 | (9 << 8))\n#define MAP_VERMILION_CITY_MART              (5 | (9 << 8))\n#define MAP_VERMILION_CITY_GYM               (6 | (9 << 8))\n#define MAP_VERMILION_CITY_HOUSE3            (7 | (9 << 8))\n\n// gMapGroup_IndoorCeladon\n#define MAP_CELADON_CITY_DEPARTMENT_STORE_1F       (0 | (10 << 8))\n#define MAP_CELADON_CITY_DEPARTMENT_STORE_2F       (1 | (10 << 8))\n#define MAP_CELADON_CITY_DEPARTMENT_STORE_3F       (2 | (10 << 8))\n#define MAP_CELADON_CITY_DEPARTMENT_STORE_4F       (3 | (10 << 8))\n#define MAP_CELADON_CITY_DEPARTMENT_STORE_5F       (4 | (10 << 8))\n#define MAP_CELADON_CITY_DEPARTMENT_STORE_ROOF     (5 | (10 << 8))\n#define MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR (6 | (10 << 8))\n#define MAP_CELADON_CITY_CONDOMINIUMS_1F           (7 | (10 << 8))\n#define MAP_CELADON_CITY_CONDOMINIUMS_2F           (8 | (10 << 8))\n#define MAP_CELADON_CITY_CONDOMINIUMS_3F           (9 | (10 << 8))\n#define MAP_CELADON_CITY_CONDOMINIUMS_ROOF         (10 | (10 << 8))\n#define MAP_CELADON_CITY_CONDOMINIUMS_ROOF_ROOM    (11 | (10 << 8))\n#define MAP_CELADON_CITY_POKEMON_CENTER_1F         (12 | (10 << 8))\n#define MAP_CELADON_CITY_POKEMON_CENTER_2F         (13 | (10 << 8))\n#define MAP_CELADON_CITY_GAME_CORNER               (14 | (10 << 8))\n#define MAP_CELADON_CITY_GAME_CORNER_PRIZE_ROOM    (15 | (10 << 8))\n#define MAP_CELADON_CITY_GYM                       (16 | (10 << 8))\n#define MAP_CELADON_CITY_RESTAURANT                (17 | (10 << 8))\n#define MAP_CELADON_CITY_HOUSE1                    (18 | (10 << 8))\n#define MAP_CELADON_CITY_HOTEL                     (19 | (10 << 8))\n\n// gMapGroup_IndoorFuchsia\n#define MAP_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE (0 | (11 << 8))\n#define MAP_FUCHSIA_CITY_MART                 (1 | (11 << 8))\n#define MAP_FUCHSIA_CITY_SAFARI_ZONE_OFFICE   (2 | (11 << 8))\n#define MAP_FUCHSIA_CITY_GYM                  (3 | (11 << 8))\n#define MAP_FUCHSIA_CITY_HOUSE1               (4 | (11 << 8))\n#define MAP_FUCHSIA_CITY_POKEMON_CENTER_1F    (5 | (11 << 8))\n#define MAP_FUCHSIA_CITY_POKEMON_CENTER_2F    (6 | (11 << 8))\n#define MAP_FUCHSIA_CITY_WARDENS_HOUSE        (7 | (11 << 8))\n#define MAP_FUCHSIA_CITY_HOUSE2               (8 | (11 << 8))\n#define MAP_FUCHSIA_CITY_HOUSE3               (9 | (11 << 8))\n\n// gMapGroup_IndoorCinnabar\n#define MAP_CINNABAR_ISLAND_GYM                         (0 | (12 << 8))\n#define MAP_CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE        (1 | (12 << 8))\n#define MAP_CINNABAR_ISLAND_POKEMON_LAB_LOUNGE          (2 | (12 << 8))\n#define MAP_CINNABAR_ISLAND_POKEMON_LAB_RESEARCH_ROOM   (3 | (12 << 8))\n#define MAP_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM (4 | (12 << 8))\n#define MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F           (5 | (12 << 8))\n#define MAP_CINNABAR_ISLAND_POKEMON_CENTER_2F           (6 | (12 << 8))\n#define MAP_CINNABAR_ISLAND_MART                        (7 | (12 << 8))\n\n// gMapGroup_IndoorIndigoPlateau\n#define MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F (0 | (13 << 8))\n#define MAP_INDIGO_PLATEAU_POKEMON_CENTER_2F (1 | (13 << 8))\n\n// gMapGroup_IndoorSaffron\n#define MAP_SAFFRON_CITY_COPYCATS_HOUSE_1F        (0 | (14 << 8))\n#define MAP_SAFFRON_CITY_COPYCATS_HOUSE_2F        (1 | (14 << 8))\n#define MAP_SAFFRON_CITY_DOJO                     (2 | (14 << 8))\n#define MAP_SAFFRON_CITY_GYM                      (3 | (14 << 8))\n#define MAP_SAFFRON_CITY_HOUSE                    (4 | (14 << 8))\n#define MAP_SAFFRON_CITY_MART                     (5 | (14 << 8))\n#define MAP_SAFFRON_CITY_POKEMON_CENTER_1F        (6 | (14 << 8))\n#define MAP_SAFFRON_CITY_POKEMON_CENTER_2F        (7 | (14 << 8))\n#define MAP_SAFFRON_CITY_MR_PSYCHICS_HOUSE        (8 | (14 << 8))\n#define MAP_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB (9 | (14 << 8))\n\n// gMapGroup_IndoorRoute2\n#define MAP_ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE (0 | (15 << 8))\n#define MAP_ROUTE2_HOUSE                          (1 | (15 << 8))\n#define MAP_ROUTE2_EAST_BUILDING                  (2 | (15 << 8))\n#define MAP_ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE (3 | (15 << 8))\n\n// gMapGroup_IndoorRoute4\n#define MAP_ROUTE4_POKEMON_CENTER_1F (0 | (16 << 8))\n#define MAP_ROUTE4_POKEMON_CENTER_2F (1 | (16 << 8))\n\n// gMapGroup_IndoorRoute5\n#define MAP_ROUTE5_POKEMON_DAY_CARE (0 | (17 << 8))\n#define MAP_ROUTE5_SOUTH_ENTRANCE   (1 | (17 << 8))\n\n// gMapGroup_IndoorRoute6\n#define MAP_ROUTE6_NORTH_ENTRANCE (0 | (18 << 8))\n#define MAP_ROUTE6_UNUSED_HOUSE   (1 | (18 << 8))\n\n// gMapGroup_IndoorRoute7\n#define MAP_ROUTE7_EAST_ENTRANCE (0 | (19 << 8))\n\n// gMapGroup_IndoorRoute8\n#define MAP_ROUTE8_WEST_ENTRANCE (0 | (20 << 8))\n\n// gMapGroup_IndoorRoute10\n#define MAP_ROUTE10_POKEMON_CENTER_1F (0 | (21 << 8))\n#define MAP_ROUTE10_POKEMON_CENTER_2F (1 | (21 << 8))\n\n// gMapGroup_IndoorRoute11\n#define MAP_ROUTE11_EAST_ENTRANCE_1F (0 | (22 << 8))\n#define MAP_ROUTE11_EAST_ENTRANCE_2F (1 | (22 << 8))\n\n// gMapGroup_IndoorRoute12\n#define MAP_ROUTE12_NORTH_ENTRANCE_1F (0 | (23 << 8))\n#define MAP_ROUTE12_NORTH_ENTRANCE_2F (1 | (23 << 8))\n#define MAP_ROUTE12_FISHING_HOUSE     (2 | (23 << 8))\n\n// gMapGroup_IndoorRoute15\n#define MAP_ROUTE15_WEST_ENTRANCE_1F (0 | (24 << 8))\n#define MAP_ROUTE15_WEST_ENTRANCE_2F (1 | (24 << 8))\n\n// gMapGroup_IndoorRoute16\n#define MAP_ROUTE16_HOUSE             (0 | (25 << 8))\n#define MAP_ROUTE16_NORTH_ENTRANCE_1F (1 | (25 << 8))\n#define MAP_ROUTE16_NORTH_ENTRANCE_2F (2 | (25 << 8))\n\n// gMapGroup_IndoorRoute18\n#define MAP_ROUTE18_EAST_ENTRANCE_1F (0 | (26 << 8))\n#define MAP_ROUTE18_EAST_ENTRANCE_2F (1 | (26 << 8))\n\n// gMapGroup_IndoorRoute19\n#define MAP_ROUTE19_UNUSED_HOUSE (0 | (27 << 8))\n\n// gMapGroup_IndoorRoute22\n#define MAP_ROUTE22_NORTH_ENTRANCE (0 | (28 << 8))\n\n// gMapGroup_IndoorRoute23\n#define MAP_ROUTE23_UNUSED_HOUSE (0 | (29 << 8))\n\n// gMapGroup_IndoorRoute25\n#define MAP_ROUTE25_SEA_COTTAGE (0 | (30 << 8))\n\n// gMapGroup_IndoorSevenIsland\n#define MAP_SEVEN_ISLAND_HOUSE_ROOM1       (0 | (31 << 8))\n#define MAP_SEVEN_ISLAND_HOUSE_ROOM2       (1 | (31 << 8))\n#define MAP_SEVEN_ISLAND_MART              (2 | (31 << 8))\n#define MAP_SEVEN_ISLAND_POKEMON_CENTER_1F (3 | (31 << 8))\n#define MAP_SEVEN_ISLAND_POKEMON_CENTER_2F (4 | (31 << 8))\n#define MAP_SEVEN_ISLAND_UNUSED_HOUSE      (5 | (31 << 8))\n#define MAP_SEVEN_ISLAND_HARBOR            (6 | (31 << 8))\n\n// gMapGroup_IndoorOneIsland\n#define MAP_ONE_ISLAND_POKEMON_CENTER_1F          (0 | (32 << 8))\n#define MAP_ONE_ISLAND_POKEMON_CENTER_2F          (1 | (32 << 8))\n#define MAP_ONE_ISLAND_HOUSE1                     (2 | (32 << 8))\n#define MAP_ONE_ISLAND_HOUSE2                     (3 | (32 << 8))\n#define MAP_ONE_ISLAND_HARBOR                     (4 | (32 << 8))\n#define MAP_ONE_ISLAND_KINDLE_ROAD_GLASS_WORKSHOP (5 | (32 << 8))\n\n// gMapGroup_IndoorTwoIsland\n#define MAP_TWO_ISLAND_JOYFUL_GAME_CORNER (0 | (33 << 8))\n#define MAP_TWO_ISLAND_HOUSE              (1 | (33 << 8))\n#define MAP_TWO_ISLAND_POKEMON_CENTER_1F  (2 | (33 << 8))\n#define MAP_TWO_ISLAND_POKEMON_CENTER_2F  (3 | (33 << 8))\n#define MAP_TWO_ISLAND_HARBOR             (4 | (33 << 8))\n\n// gMapGroup_IndoorThreeIsland\n#define MAP_THREE_ISLAND_HOUSE1            (0 | (34 << 8))\n#define MAP_THREE_ISLAND_POKEMON_CENTER_1F (1 | (34 << 8))\n#define MAP_THREE_ISLAND_POKEMON_CENTER_2F (2 | (34 << 8))\n#define MAP_THREE_ISLAND_MART              (3 | (34 << 8))\n#define MAP_THREE_ISLAND_HOUSE2            (4 | (34 << 8))\n#define MAP_THREE_ISLAND_HOUSE3            (5 | (34 << 8))\n#define MAP_THREE_ISLAND_HOUSE4            (6 | (34 << 8))\n#define MAP_THREE_ISLAND_HOUSE5            (7 | (34 << 8))\n\n// gMapGroup_IndoorFourIsland\n#define MAP_FOUR_ISLAND_POKEMON_DAY_CARE       (0 | (35 << 8))\n#define MAP_FOUR_ISLAND_POKEMON_CENTER_1F      (1 | (35 << 8))\n#define MAP_FOUR_ISLAND_POKEMON_CENTER_2F      (2 | (35 << 8))\n#define MAP_FOUR_ISLAND_HOUSE1                 (3 | (35 << 8))\n#define MAP_FOUR_ISLAND_LORELEIS_HOUSE         (4 | (35 << 8))\n#define MAP_FOUR_ISLAND_HARBOR                 (5 | (35 << 8))\n#define MAP_FOUR_ISLAND_HOUSE2                 (6 | (35 << 8))\n#define MAP_FOUR_ISLAND_MART                   (7 | (35 << 8))\n#define MAP_FOUR_ISLAND_BASE_CABLE_CAR_STATION (8 | (35 << 8))\n#define MAP_FOUR_ISLAND_CABLE_CAR_STATION      (9 | (35 << 8))\n\n// gMapGroup_IndoorFiveIsland\n#define MAP_FIVE_ISLAND_POKEMON_CENTER_1F (0 | (36 << 8))\n#define MAP_FIVE_ISLAND_POKEMON_CENTER_2F (1 | (36 << 8))\n#define MAP_FIVE_ISLAND_HARBOR            (2 | (36 << 8))\n#define MAP_FIVE_ISLAND_HOUSE1            (3 | (36 << 8))\n#define MAP_FIVE_ISLAND_HOUSE2            (4 | (36 << 8))\n\n// gMapGroup_IndoorSixIsland\n#define MAP_SIX_ISLAND_POKEMON_CENTER_1F (0 | (37 << 8))\n#define MAP_SIX_ISLAND_POKEMON_CENTER_2F (1 | (37 << 8))\n#define MAP_SIX_ISLAND_HARBOR            (2 | (37 << 8))\n#define MAP_SIX_ISLAND_HOUSE             (3 | (37 << 8))\n#define MAP_SIX_ISLAND_MART              (4 | (37 << 8))\n\n// gMapGroup_IndoorThreeIslandRoute\n#define MAP_THREE_ISLAND_HARBOR (0 | (38 << 8))\n\n// gMapGroup_IndoorFiveIslandRoute\n#define MAP_FIVE_ISLAND_RESORT_GORGEOUS_HOUSE (0 | (39 << 8))\n\n// gMapGroup_IndoorTwoIslandRoute\n#define MAP_TWO_ISLAND_CAPE_BRINK_HOUSE (0 | (40 << 8))\n\n// gMapGroup_IndoorSixIslandRoute\n#define MAP_SIX_ISLAND_WATER_PATH_HOUSE1 (0 | (41 << 8))\n#define MAP_SIX_ISLAND_WATER_PATH_HOUSE2 (1 | (41 << 8))\n\n// gMapGroup_IndoorSevenIslandRoute\n#define MAP_SEVEN_ISLAND_SEVAULT_CANYON_HOUSE (0 | (42 << 8))\n\n// gMapGroup_RSE\n#define MAP_RS_BATTLE_TOWER                         (0 | (43 << 8))\n#define MAP_RS_BATTLE_TOWER_LOBBY                   (1 | (43 << 8))\n#define MAP_RS_BATTLE_TOWER_ELEVATOR                (2 | (43 << 8))\n#define MAP_RS_BATTLE_TOWER_CORRIDOR                (3 | (43 << 8))\n#define MAP_RS_BATTLE_TOWER_BATTLE_ROOM             (4 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_OUTSIDE_WEST            (5 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_OUTSIDE_EAST            (6 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_RECEPTION_GATE          (7 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F       (8 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F       (9 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_MART                    (10 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER (11 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_RANKING_HALL            (12 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_SCOTTS_HOUSE            (13 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_LOUNGE1                 (14 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_LOUNGE2                 (15 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_LOUNGE3                 (16 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_LOUNGE4                 (17 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_LOUNGE5                 (18 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_LOUNGE6                 (19 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_LOUNGE7                 (20 | (43 << 8))\n#define MAP_BATTLE_FRONTIER_LOUNGE8                 (21 | (43 << 8))\n\n#define MAP_GROUPS_COUNT 44\n\n#endif // GUARD_CONSTANTS_MAP_GROUPS_H\n"
  },
  {
    "path": "include/constants/map_scripts.h",
    "content": "#ifndef GUARD_CONSTANTS_MAP_SCRIPTS_H\n#define GUARD_CONSTANTS_MAP_SCRIPTS_H\n\n#define MAP_SCRIPT_ON_LOAD                 1\n#define MAP_SCRIPT_ON_FRAME_TABLE          2\n#define MAP_SCRIPT_ON_TRANSITION           3\n#define MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE  4\n#define MAP_SCRIPT_ON_RESUME               5\n#define MAP_SCRIPT_ON_DIVE_WARP            6\n#define MAP_SCRIPT_ON_RETURN_TO_FIELD      7\n\n#endif // GUARD_CONSTANTS_MAP_SCRIPTS_H\n"
  },
  {
    "path": "include/constants/map_types.h",
    "content": "#ifndef GUARD_CONSTANTS_MAP_TYPES_H\n#define GUARD_CONSTANTS_MAP_TYPES_H\n\n#define MAP_TYPE_NONE        0\n#define MAP_TYPE_TOWN        1\n#define MAP_TYPE_CITY        2 // Not used by any map. RSE use this map type to distinguish Town and City. FRLG make no distinction\n#define MAP_TYPE_ROUTE       3\n#define MAP_TYPE_UNDERGROUND 4\n#define MAP_TYPE_UNDERWATER  5 // Not used by any map.\n#define MAP_TYPE_OCEAN_ROUTE 6 // Not used by any map.\n#define MAP_TYPE_UNKNOWN     7 // Not used by any map.\n#define MAP_TYPE_INDOOR      8\n#define MAP_TYPE_SECRET_BASE 9 // Not used by any map.\n\n#define MAP_BATTLE_SCENE_NORMAL   0\n#define MAP_BATTLE_SCENE_GYM      1\n#define MAP_BATTLE_SCENE_INDOOR_1 2 // Pokemon Tower, Tanoby ruins\n#define MAP_BATTLE_SCENE_INDOOR_2 3 // Pokemon Mansion, Power Plant, Rocket Hideout/Warehouse\n#define MAP_BATTLE_SCENE_LORELEI  4\n#define MAP_BATTLE_SCENE_BRUNO    5\n#define MAP_BATTLE_SCENE_AGATHA   6\n#define MAP_BATTLE_SCENE_LANCE    7\n#define MAP_BATTLE_SCENE_LINK     8\n\n#endif  // GUARD_CONSTANTS_MAP_TYPES_H\n"
  },
  {
    "path": "include/constants/maps.h",
    "content": "#ifndef GUARD_CONSTANTS_MAPS_H\n#define GUARD_CONSTANTS_MAPS_H\n\n#include \"constants/map_groups.h\"\n#include \"constants/map_types.h\"\n\n// Warps using this map will instead use the warp data stored in gSaveBlock1Ptr->dynamicWarp.\n// Used for warps that need to change destinations, e.g. when stepping off an elevator.\n#define MAP_DYNAMIC (0x7F | (0x7F << 8))\n\n#define MAP_UNDEFINED (0xFF | (0xFF << 8))\n\n#define MAP_GROUP(map) (MAP_##map >> 8)\n#define MAP_NUM(map) (MAP_##map & 0xFF)\n\n#define MAP(map) MAP_GROUP(map), MAP_NUM(map)\n\n// ID for dynamic warps. Used in the dest_warp_id field for warp events, but it's never\n// read in practice. A dest_map of MAP_DYNAMIC is used to indicate that a dynamic warp\n// should be used, at which point the warp id is ignored. It can be passed to SetDynamicWarp\n// or SetDynamicWarpWithCoords as the first argument, but this argument is unused.\n#define WARP_ID_DYNAMIC     0x7F\n\n// Used to indicate an invalid warp id, for dummy warps or when a warp should\n// use the given coordinates rather than the coordinates of a target warp.\n#define WARP_ID_NONE (-1)\n\n#endif  // GUARD_CONSTANTS_MAPS_H\n"
  },
  {
    "path": "include/constants/master_opponents.h",
    "content": "#ifndef GUARD_CONSTANTS_MASTER_OPPONENTS_H\n#define GUARD_CONSTANTS_MASTER_OPPONENTS_H\n\n#define MASTER_NONE 0\n#define MASTER_BULBASAUR 1\n#define MASTER_IVYSAUR 2\n#define MASTER_VENUSAUR 3\n#define MASTER_CHARMANDER 4\n#define MASTER_CHARMELEON 5\n#define MASTER_CHARIZARD 6\n#define MASTER_SQUIRTLE 7\n#define MASTER_WARTORTLE 8\n#define MASTER_BLASTOISE 9\n#define MASTER_CATERPIE 10\n#define MASTER_METAPOD 11\n#define MASTER_BUTTERFREE 12\n#define MASTER_WEEDLE 13\n#define MASTER_KAKUNA 14\n#define MASTER_BEEDRILL 15\n#define MASTER_PIDGEY 16\n#define MASTER_PIDGEOTTO 17\n#define MASTER_PIDGEOT 18\n#define MASTER_RATTATA 19\n#define MASTER_RATICATE 20\n#define MASTER_SPEAROW 21\n#define MASTER_FEAROW 22\n#define MASTER_EKANS 23\n#define MASTER_ARBOK 24\n#define MASTER_PIKACHU 25\n#define MASTER_RAICHU 26\n#define MASTER_SANDSHREW 27\n#define MASTER_SANDSLASH 28\n#define MASTER_NIDORAN_F 29\n#define MASTER_NIDORINA 30\n#define MASTER_NIDOQUEEN 31\n#define MASTER_NIDORAN_M 32\n#define MASTER_NIDORINO 33\n#define MASTER_NIDOKING 34\n#define MASTER_CLEFAIRY 35\n#define MASTER_CLEFABLE 36\n#define MASTER_VULPIX 37\n#define MASTER_NINETALES 38\n#define MASTER_JIGGLYPUFF 39\n#define MASTER_WIGGLYTUFF 40\n#define MASTER_ZUBAT 41\n#define MASTER_GOLBAT 42\n#define MASTER_ODDISH 43\n#define MASTER_GLOOM 44\n#define MASTER_VILEPLUME 45\n#define MASTER_PARAS 46\n#define MASTER_PARASECT 47\n#define MASTER_VENONAT 48\n#define MASTER_VENOMOTH 49\n#define MASTER_DIGLETT 50\n#define MASTER_DUGTRIO 51\n#define MASTER_MEOWTH 52\n#define MASTER_PERSIAN 53\n#define MASTER_PSYDUCK 54\n#define MASTER_GOLDUCK 55\n#define MASTER_MANKEY 56\n#define MASTER_PRIMEAPE 57\n#define MASTER_GROWLITHE 58\n#define MASTER_ARCANINE 59\n#define MASTER_POLIWAG 60\n#define MASTER_POLIWHIRL 61\n#define MASTER_POLIWRATH 62\n#define MASTER_ABRA 63\n#define MASTER_KADABRA 64\n#define MASTER_ALAKAZAM 65\n#define MASTER_MACHOP 66\n#define MASTER_MACHOKE 67\n#define MASTER_MACHAMP 68\n#define MASTER_BELLSPROUT 69\n#define MASTER_WEEPINBELL 70\n#define MASTER_VICTREEBEL 71\n#define MASTER_TENTACOOL 72\n#define MASTER_TENTACRUEL 73\n#define MASTER_GEODUDE 74\n#define MASTER_GRAVELER 75\n#define MASTER_GOLEM 76\n#define MASTER_PONYTA 77\n#define MASTER_RAPIDASH 78\n#define MASTER_SLOWPOKE 79\n#define MASTER_SLOWBRO 80\n#define MASTER_MAGNEMITE 81\n#define MASTER_MAGNETON 82\n#define MASTER_FARFETCHD 83\n#define MASTER_DODUO 84\n#define MASTER_DODRIO 85\n#define MASTER_SEEL 86\n#define MASTER_DEWGONG 87\n#define MASTER_GRIMER 88\n#define MASTER_MUK 89\n#define MASTER_SHELLDER 90\n#define MASTER_CLOYSTER 91\n#define MASTER_GASTLY 92\n#define MASTER_HAUNTER 93\n#define MASTER_GENGAR 94\n#define MASTER_ONIX 95\n#define MASTER_DROWZEE 96\n#define MASTER_HYPNO 97\n#define MASTER_KRABBY 98\n#define MASTER_KINGLER 99\n#define MASTER_VOLTORB 100\n#define MASTER_ELECTRODE 101\n#define MASTER_EXEGGCUTE 102\n#define MASTER_EXEGGUTOR 103\n#define MASTER_CUBONE 104\n#define MASTER_MAROWAK 105\n#define MASTER_HITMONLEE 106\n#define MASTER_HITMONCHAN 107\n#define MASTER_LICKITUNG 108\n#define MASTER_KOFFING 109\n#define MASTER_WEEZING 110\n#define MASTER_RHYHORN 111\n#define MASTER_RHYDON 112\n#define MASTER_CHANSEY 113\n#define MASTER_TANGELA 114\n#define MASTER_KANGASKHAN 115\n#define MASTER_HORSEA 116\n#define MASTER_SEADRA 117\n#define MASTER_GOLDEEN 118\n#define MASTER_SEAKING 119\n#define MASTER_STARYU 120\n#define MASTER_STARMIE 121\n#define MASTER_MR_MIME 122\n#define MASTER_SCYTHER 123\n#define MASTER_JYNX 124\n#define MASTER_ELECTABUZZ 125\n#define MASTER_MAGMAR 126\n#define MASTER_PINSIR 127\n#define MASTER_TAUROS 128\n#define MASTER_MAGIKARP 129\n#define MASTER_GYARADOS 130\n#define MASTER_LAPRAS 131\n#define MASTER_DITTO 132\n#define MASTER_EEVEE 133\n#define MASTER_VAPOREON 134\n#define MASTER_JOLTEON 135\n#define MASTER_FLAREON 136\n#define MASTER_PORYGON 137\n#define MASTER_OMANYTE 138\n#define MASTER_OMASTAR 139\n#define MASTER_KABUTO 140\n#define MASTER_KABUTOPS 141\n#define MASTER_AERODACTYL 142\n#define MASTER_SNORLAX 143\n#define MASTER_ARTICUNO 144\n#define MASTER_ZAPDOS 145\n#define MASTER_MOLTRES 146\n#define MASTER_DRATINI 147\n#define MASTER_DRAGONAIR 148\n#define MASTER_DRAGONITE 149\n#define MASTER_MEWTWO 150\n#define MASTER_MEW 151\n\n#endif  // GUARD_CONSTANTS_MASTER_OPPONENTS_H"
  },
  {
    "path": "include/constants/menu.h",
    "content": "#ifndef GUARD_CONSTANTS_MENU_H\n#define GUARD_CONSTANTS_MENU_H\n\n#define SCR_MENU_CANCEL 127\n#define SCR_MENU_UNSET  255\n\n#define MULTICHOICE_YES_NO                                      0\n#define MULTICHOICE_EEVEELUTIONS                                1\n#define MULTICHOICE_TRAINER_CARD_ICON_TINT                      2\n#define MULTICHOICE_HOF_QUIT                                    3\n#define MULTICHOICE_EGGS_QUIT                                   4\n#define MULTICHOICE_VICTORIES_QUIT                              5\n#define MULTICHOICE_HOF_EGGS_QUIT                               6\n#define MULTICHOICE_HOF_VICTORIES_QUIT                          7\n#define MULTICHOICE_EGGS_VICTORIES_QUIT                         8\n#define MULTICHOICE_HOF_EGGS_VICTORIES_QUIT                     9\n#define MULTICHOICE_EXIT                                       10\n#define MULTICHOICE_EXIT_2                                     11\n#define MULTICHOICE_EXIT_3                                     12\n#define MULTICHOICE_BIKE_SHOP                                  13\n#define MULTICHOICE_GAME_CORNER_POKEMON_PRIZES_FR              14\n#define MULTICHOICE_TRAINER_SCHOOL_WHITEBOARD                  15\n#define MULTICHOICE_YES_NO_INFO                                16\n#define MULTICHOICE_SINGLE_DOUBLE_MULTI_INFO_EXIT              17\n#define MULTICHOICE_YES_NO_INFO_2                              18\n#define MULTICHOICE_CHALLENGE_INFO_EXIT                        19\n#define MULTICHOICE_ROOFTOP_B1F                                20\n#define MULTICHOICE_HELIX                                      21\n#define MULTICHOICE_DOME                                       22\n#define MULTICHOICE_AMBER                                      23\n#define MULTICHOICE_HELIX_AMBER                                24\n#define MULTICHOICE_DOME_AMBER                                 25\n#define MULTICHOICE_CELADON_VENDING_MACHINE                    26\n#define MULTICHOICE_GAME_CORNER_COIN_PURCHASE_COUNTER          27\n#define MULTICHOICE_EXCELLENT_NOT_SO_BAD                       28\n#define MULTICHOICE_RIGHT_LEFT                                 29\n#define MULTICHOICE_GAME_CORNER_TMPRIZES                       30\n#define MULTICHOICE_DEPT_STORE_ELEVATOR                        31\n#define MULTICHOICE_THIRSTY_GIRL_FRESH_WATER                   32\n#define MULTICHOICE_THIRSTY_GIRL_SODA_POP                      33\n#define MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_SODA_POP          34\n#define MULTICHOICE_THIRSTY_GIRL_LEMONADE                      35\n#define MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_LEMONADE          36\n#define MULTICHOICE_THIRSTY_GIRL_SODA_POP_LEMONADE             37\n#define MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_SODA_POP_LEMONADE 38\n#define MULTICHOICE_TRADE_CENTER_COLOSSEUM                     39\n#define MULTICHOICE_LINK_WIRELESS                              40\n#define MULTICHOICE_GAME_CORNER_BATTLE_ITEM_PRIZES             41\n#define MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR                    42\n#define MULTICHOICE_LINKED_DIRECT_UNION                        43\n#define MULTICHOICE_ISLAND_23                                  44\n#define MULTICHOICE_ISLAND_13                                  45\n#define MULTICHOICE_ISLAND_12                                  46\n#define MULTICHOICE_TRADE_COLOSSEUM_CRUSH                      47\n#define MULTICHOICE_GLASS_WORKSHOP_VENDOR                      48\n#define MULTICHOICE_POKEJUMP_DODRIO                            49\n#define MULTICHOICE_TRADE_COLOSSEUM_2                          50\n#define MULTICHOICE_MUSHROOMS                                  51\n#define MULTICHOICE_TRADE_COLOSSEUM_BLANK_CRUSH                52\n#define MULTICHOICE_TRADE_COLOSSEUM_BLANK                      53\n#define MULTICHOICE_FARAWAY                                    54\n#define MULTICHOICE_NAVEL                                      55\n#define MULTICHOICE_NAVEL_FARAWAY                              56\n#define MULTICHOICE_SEAGALLOP_123                              57\n#define MULTICHOICE_SEAGALLOP_V23                              58\n#define MULTICHOICE_SEAGALLOP_V13                              59\n#define MULTICHOICE_SEAGALLOP_V12                              60\n#define MULTICHOICE_SEAGALLOP_VERMILION                        61\n#define MULTICHOICE_GAME_CORNER_POKEMON_PRIZES_LG              62\n#define MULTICHOICE_JOIN_OR_LEAD                               63\n#define MULTICHOICE_TRAINER_TOWER_MODE                         64\n#define MULTICHOICE_BATTLE_TOWER_LEVELS                        65\n#define MULTICHOICE_HELIX_DOME                                 66\n#define MULTICHOICE_HELIX_DOME_AMBER                           67\n#define MULTICHOICE_SEVII_OTHER                                68\n#define MULTICHOICE_SEVII_BATTLE_TOWER                         69\n#define MULTICHOICE_SEVII_BATTLE_TOWER_OTHER                   70\n#define MULTICHOICE_BIRTH                                      71\n#define MULTICHOICE_BIRTH_FARAWAY                              72\n#define MULTICHOICE_BIRTH_NAVEL                                73\n#define MULTICHOICE_BIRTH_NAVEL_FARAWAY                        74\n#define MULTICHOICE_SOUTHERN                                   75\n#define MULTICHOICE_SOUTHERN_FARAWAY                           76\n#define MULTICHOICE_SOUTHERN_NAVEL                             77\n#define MULTICHOICE_SOUTHERN_NAVEL_FARAWAY                     78\n#define MULTICHOICE_SOUTHERN_BIRTH                             79\n#define MULTICHOICE_SOUTHERN_BIRTH_FARAWAY                     80\n#define MULTICHOICE_SOUTHERN_BIRTH_NAVEL                       81\n#define MULTICHOICE_SOUTHERN_BIRTH_NAVEL_FARAWAY               82\n#define MULTICHOICE_MASTER_YOUNGSTER                           83\n\n\n#define MULTICHOICE_NONE                                      255\n\n#define LISTMENU_BADGES                    0\n#define LISTMENU_SILPHCO_FLOORS            1\n#define LISTMENU_ROCKET_HIDEOUT_FLOORS     2\n#define LISTMENU_DEPT_STORE_FLOORS         3\n#define LISTMENU_WIRELESS_LECTURE_HEADERS  4\n#define LISTMENU_BERRY_POWDER              5\n#define LISTMENU_TRAINER_TOWER_FLOORS      6\n#define LISTMENU_GYM_LEADERS               7\n#define LISTMENU_MASTER_TRAINER_TITLES     8\n\n// Std String Ids\n#define STDSTRING_COOL              0\n#define STDSTRING_BEAUTY            1\n#define STDSTRING_CUTE              2\n#define STDSTRING_SMART             3\n#define STDSTRING_TOUGH             4\n#define STDSTRING_COOL2             5\n#define STDSTRING_BEAUTY2           6\n#define STDSTRING_CUTE2             7\n#define STDSTRING_SMART2            8\n#define STDSTRING_TOUGH2            9\n#define STDSTRING_ITEMS             10\n#define STDSTRING_KEY_ITEMS         11\n#define STDSTRING_POKEBALLS         12\n#define STDSTRING_TMHMS             13\n#define STDSTRING_BERRIES           14\n#define STDSTRING_BOULDER_BADGE     15\n#define STDSTRING_CASCADE_BADGE     16\n#define STDSTRING_THUNDER_BADGE     17\n#define STDSTRING_RAINBOW_BADGE     18\n#define STDSTRING_SOUL_BADGE        19\n#define STDSTRING_MARSH_BADGE       20\n#define STDSTRING_VOLCANO_BADGE     21\n#define STDSTRING_EARTH_BADGE       22\n#define STDSTRING_COINS             23\n#define STDSTRING_ITEMS_POCKET      24\n#define STDSTRING_KEY_ITEMS_POCKET  25\n#define STDSTRING_POKEBALLS_POCKET  26\n#define STDSTRING_TM_CASE           27\n#define STDSTRING_BERRY_POUCH       28\n#define STDSTRING_MEDICINE_POCKET   29\n#define STDSTRING_HELD_ITEMS_POCKET 30\n\n#endif //GUARD_CONSTANTS_MENU_H\n"
  },
  {
    "path": "include/constants/metatile_behaviors.h",
    "content": "#ifndef GUARD_METATILE_BEHAVIORS\n#define GUARD_METATILE_BEHAVIORS\n\n#define MB_NORMAL 0x00\n#define MB_UNUSED_01 0x01\n#define MB_TALL_GRASS 0x02\n//\n#define MB_CAVE 0x08\n//\n#define MB_RUNNING_DISALLOWED 0x0A\n#define MB_INDOOR_ENCOUNTER 0x0B\n#define MB_MOUNTAIN_TOP 0x0C\n//\n#define MB_POND_WATER 0x10\n#define MB_FAST_WATER 0x11\n#define MB_DEEP_WATER 0x12\n#define MB_WATERFALL 0x13\n//\n#define MB_OCEAN_WATER 0x15\n#define MB_PUDDLE 0x16\n#define MB_SHALLOW_WATER 0x17\n//\n#define MB_UNDERWATER_BLOCKED_ABOVE 0x19\n#define MB_UNUSED_WATER 0x1A\n#define MB_CYCLING_ROAD_WATER 0x1B\n//\n#define MB_STRENGTH_BUTTON 0x20\n#define MB_SAND 0x21\n#define MB_SEAWEED 0x22\n#define MB_ICE 0x23\n#define MB_ASHGRASS 0x24\n//\n#define MB_THIN_ICE 0x26\n#define MB_CRACKED_ICE 0x27\n#define MB_HOT_SPRINGS 0x28\n//\n#define MB_ROCK_STAIRS 0x2A\n#define MB_SAND_CAVE 0x2B\n//\n#define MB_IMPASSABLE_EAST 0x30\n#define MB_IMPASSABLE_WEST 0x31\n#define MB_IMPASSABLE_NORTH 0x32\n#define MB_IMPASSABLE_SOUTH 0x33\n#define MB_IMPASSABLE_NORTHEAST 0x34\n#define MB_IMPASSABLE_NORTHWEST 0x35\n#define MB_IMPASSABLE_SOUTHEAST 0x36\n#define MB_IMPASSABLE_SOUTHWEST 0x37\n#define MB_JUMP_EAST 0x38\n#define MB_JUMP_WEST 0x39\n#define MB_JUMP_NORTH 0x3A\n#define MB_JUMP_SOUTH 0x3B\n//\n#define MB_WALK_EAST 0x40\n#define MB_WALK_WEST 0x41\n#define MB_WALK_NORTH 0x42\n#define MB_WALK_SOUTH 0x43\n#define MB_SLIDE_EAST 0x44\n#define MB_SLIDE_WEST 0x45\n#define MB_SLIDE_NORTH 0x46\n#define MB_SLIDE_SOUTH 0x47\n#define MB_TRICK_HOUSE_PUZZLE_8_FLOOR 0x48\n//\n#define MB_EASTWARD_CURRENT 0x50\n#define MB_WESTWARD_CURRENT 0x51\n#define MB_NORTHWARD_CURRENT 0x52\n#define MB_SOUTHWARD_CURRENT 0x53\n#define MB_SPIN_RIGHT 0x54\n#define MB_SPIN_LEFT 0x55\n#define MB_SPIN_UP 0x56\n#define MB_SPIN_DOWN 0x57\n#define MB_STOP_SPINNING 0x58\n//\n#define MB_CAVE_DOOR 0x60\n#define MB_LADDER 0x61\n#define MB_EAST_ARROW_WARP 0x62\n#define MB_WEST_ARROW_WARP 0x63\n#define MB_NORTH_ARROW_WARP 0x64\n#define MB_SOUTH_ARROW_WARP 0x65\n#define MB_FALL_WARP 0x66\n#define MB_REGULAR_WARP 0x67\n#define MB_LAVARIDGE_1F_WARP 0x68\n#define MB_WARP_DOOR 0x69\n#define MB_UP_ESCALATOR 0x6A\n#define MB_DOWN_ESCALATOR 0x6B\n#define MB_UP_RIGHT_STAIR_WARP 0x6C\n#define MB_UP_LEFT_STAIR_WARP 0x6D\n#define MB_DOWN_RIGHT_STAIR_WARP 0x6E\n#define MB_DOWN_LEFT_STAIR_WARP 0x6F\n//\n#define MB_UNION_ROOM_WARP 0x71\n//\n#define MB_COUNTER 0x80\n#define MB_BOOKSHELF 0x81\n#define MB_POKEMART_SHELF 0x82\n#define MB_PC 0x83\n#define MB_SIGNPOST 0x84\n#define MB_REGION_MAP 0x85\n#define MB_TELEVISION 0x86\n#define MB_POKEMON_CENTER_SIGN 0x87\n#define MB_POKEMART_SIGN 0x88\n#define MB_CABINET 0x89\n#define MB_KITCHEN 0x8A\n#define MB_DRESSER 0x8B\n#define MB_SNACKS 0x8C\n#define MB_CABLE_CLUB_WIRELESS_MONITOR 0x8D\n#define MB_BATTLE_RECORDS 0x8E\n#define MB_QUESTIONNAIRE 0x8F\n#define MB_FOOD 0x90\n#define MB_INDIGO_PLATEAU_SIGN_1 0x91\n#define MB_INDIGO_PLATEAU_SIGN_2 0x92\n#define MB_BLUEPRINTS 0x93\n#define MB_PAINTING 0x94\n#define MB_POWER_PLANT_MACHINE 0x95\n#define MB_TELEPHONE 0x96\n#define MB_COMPUTER 0x97\n#define MB_ADVERTISING_POSTER 0x98\n#define MB_FOOD_SMELLS_TASTY 0x99\n#define MB_TRASH_BIN 0x9A\n#define MB_CUP 0x9B\n#define MB_PORTHOLE 0x9C\n#define MB_WINDOW 0x9D\n#define MB_BLINKING_LIGHTS 0x9E\n#define MB_NEATLY_LINED_UP_TOOLS 0x9F\n#define MB_IMPRESSIVE_MACHINE 0xA0\n#define MB_VIDEO_GAME 0xA1\n#define MB_BURGLARY 0xA2\n#define MB_TRAINER_TOWER_MONITOR 0xA3\n//\n#define MB_CYCLING_ROAD_PULL_DOWN 0xD0\n#define MB_CYCLING_ROAD_PULL_DOWN_GRASS 0xD1\n#define MB_LONG_GRASS 0xD2\n#define MB_SEAWEED_NO_SURFACING 0xD3\n#define MB_SAFARI_ZONE_EXTENSION_SIGN 0xD4\n#define MB_SHORT_GRASS 0xD5\n//\n#define NUM_METATILE_BEHAVIORS 0xF0\n\n#endif // GUARD_METATILE_BEHAVIORS\n"
  },
  {
    "path": "include/constants/metatile_labels.h",
    "content": "#ifndef GUARD_METATILE_LABELS_H\n#define GUARD_METATILE_LABELS_H\n\n// gTileset_BattleFrontierOutsideEast\n#define METATILE_BattleFrontierOutsideEast_BattleTower  0x330\n\n// gTileset_BattleFrontier\n#define METATILE_BattleFrontier_BattleTowerElevator  0x28E\n\n// gTileset_BerryForest\n#define METATILE_BerryForest_Door               0x2BB\n#define METATILE_BerryForest_ThreeIsland_Grass  0x2BF\n\n// gTileset_Building\n#define METATILE_Building_PCOff  0x062\n#define METATILE_Building_PCOn   0x063\n\n// gTileset_Cave\n#define METATILE_Cave_Floor_Ledge_Bottom  0x2E1\n#define METATILE_Cave_Floor_Ledge_Top     0x2D1\n#define METATILE_Cave_RockBarrier_Bottom  0x317\n#define METATILE_Cave_RockBarrier_Top     0x307\n\n// gTileset_CeladonCity\n#define METATILE_CeladonCity_CyclingRoad_Grass  0x352\n#define METATILE_CeladonCity_CyclingRoad_Mowed  0x33E\n#define METATILE_CeladonCity_DeptStoreDoor      0x294\n\n// gTileset_CeruleanCity\n#define METATILE_CeruleanCity_Door  0x298\n\n// gTileset_CinnabarGym\n#define METATILE_CinnabarGym_Floor                  0x281\n#define METATILE_CinnabarGym_Floor_ShadeDiagonal    0x282\n#define METATILE_CinnabarGym_Floor_ShadeFull        0x289\n#define METATILE_CinnabarGym_Floor_WallLeftCorner   0x2C7\n#define METATILE_CinnabarGym_Floor_WallLeftEdge     0x2CF\n#define METATILE_CinnabarGym_Floor_WallRightCorner  0x2C6\n#define METATILE_CinnabarGym_Floor_WallRightEdge    0x2CE\n#define METATILE_CinnabarGym_Wall_RetractedBarrier  0x2D1\n\n// gTileset_CinnabarIsland\n#define METATILE_CinnabarIsland_LabDoor  0x2AD\n\n// gTileset_DepartmentStore\n#define METATILE_DepartmentStore_ElevatorDoor  0x28D\n\n// gTileset_FuchsiaCity\n#define METATILE_FuchsiaCity_Door                           0x2BF\n#define METATILE_FuchsiaCity_LongGrassBottom_LeftTree       0x35F\n#define METATILE_FuchsiaCity_LongGrassBottom_MiddleTree     0x367\n#define METATILE_FuchsiaCity_LongGrassBottom_MountainLeft   0x345\n#define METATILE_FuchsiaCity_LongGrassBottom_MountainRight  0x346\n#define METATILE_FuchsiaCity_LongGrassBottom_RightTree      0x36F\n#define METATILE_FuchsiaCity_LongGrassTop_LeftTree          0x360\n#define METATILE_FuchsiaCity_LongGrassTop_MiddleTree        0x361\n#define METATILE_FuchsiaCity_LongGrassTop_MountainLeft      0x363\n#define METATILE_FuchsiaCity_LongGrassTop_MountainRight     0x366\n#define METATILE_FuchsiaCity_LongGrassTop_RightTree         0x362\n#define METATILE_FuchsiaCity_SafariMountainTopLeft_Mowed    0x378\n#define METATILE_FuchsiaCity_SafariMountainTopRight_Mowed   0x379\n#define METATILE_FuchsiaCity_SafariZoneDoor                 0x2D2\n#define METATILE_FuchsiaCity_SafariZoneTreeTopLeft_Grass    0x300\n#define METATILE_FuchsiaCity_SafariZoneTreeTopLeft_Mowed    0x310\n#define METATILE_FuchsiaCity_SafariZoneTreeTopMiddle_Grass  0x301\n#define METATILE_FuchsiaCity_SafariZoneTreeTopMiddle_Mowed  0x311\n#define METATILE_FuchsiaCity_SafariZoneTreeTopRight_Grass   0x302\n#define METATILE_FuchsiaCity_SafariZoneTreeTopRight_Mowed   0x312\n\n// gTileset_GameCorner\n#define METATILE_GameCorner_CheckeredFloor_ShadeLeft  0x2E1\n#define METATILE_GameCorner_CounterBarrier            0x2F7\n#define METATILE_GameCorner_Floor_ShadeFull           0x292\n#define METATILE_GameCorner_Floor_StairsTop           0x29D\n#define METATILE_GameCorner_PurpleWall_Floor          0x2CF\n#define METATILE_GameCorner_PurpleWall_StairsTop      0x2A6\n#define METATILE_GameCorner_PurpleWall_stairsBottom   0x2A7\n#define METATILE_GameCorner_StairsBottom              0x29F\n#define METATILE_GameCorner_StairsTop                 0x29E\n\n// gTileset_General\n#define METATILE_General_CalmWater               0x12B\n#define METATILE_General_Door                    0x03D\n#define METATILE_General_EmeraldMowed            0x229\n#define METATILE_General_LongGrass_Bottom        0x23B\n#define METATILE_General_LongGrass_Top           0x233\n#define METATILE_General_MountainCornerTopLeft   0x068\n#define METATILE_General_MountainCornerTopRight  0x06A\n#define METATILE_General_Plain_Grass             0x00D\n#define METATILE_General_Plain_Mowed             0x001\n#define METATILE_General_SlidingDoubleDoor       0x15B\n#define METATILE_General_SlidingSingleDoor       0x062\n#define METATILE_General_ThinTreeTop_Grass       0x00A\n#define METATILE_General_ThinTreeTop_Mowed       0x013\n#define METATILE_General_WideTreeTopLeft_Grass   0x00B\n#define METATILE_General_WideTreeTopLeft_Mowed   0x00E\n#define METATILE_General_WideTreeTopRight_Grass  0x00C\n#define METATILE_General_WideTreeTopRight_Mowed  0x00F\n\n// gTileset_GenericBuilding1\n#define METATILE_GenericBuilding1_PlayersPCOff  0x28F\n#define METATILE_GenericBuilding1_PlayersPCOn   0x28A\n\n// gTileset_LavenderTown\n#define METATILE_LavenderTown_Door  0x2A2\n\n// gTileset_Mart\n#define METATILE_Mart_CounterMid_Bottom  0x2C0\n#define METATILE_Mart_CounterMid_Top     0x2BF\n\n// gTileset_MtEmber\n#define METATILE_MtEmber_CaveEntrance  0x346\n\n// gTileset_PalletTown\n#define METATILE_PalletTown_Door         0x2A3\n#define METATILE_PalletTown_OaksLabDoor  0x2AC\n\n// gTileset_PewterCity\n#define METATILE_PewterCity_Door  0x2CE\n\n// gTileset_PokemonCenter\n#define METATILE_PokemonCenter_CableClubDoor                         0x2DE\n#define METATILE_PokemonCenter_CounterBarrier                        0x2F9\n#define METATILE_PokemonCenter_Escalator_BottomNextRail_Normal       0x2D0\n#define METATILE_PokemonCenter_Escalator_BottomNextRail_Transition1  0x30A\n#define METATILE_PokemonCenter_Escalator_BottomNextRail_Transition2  0x308\n#define METATILE_PokemonCenter_Escalator_BottomNext_Normal           0x2D8\n#define METATILE_PokemonCenter_Escalator_BottomNext_Transition1      0x312\n#define METATILE_PokemonCenter_Escalator_BottomNext_Transition2      0x310\n#define METATILE_PokemonCenter_Escalator_BottomRail_Normal           0x2D1\n#define METATILE_PokemonCenter_Escalator_BottomRail_Transition1      0x30B\n#define METATILE_PokemonCenter_Escalator_BottomRail_Transition2      0x309\n#define METATILE_PokemonCenter_Escalator_Bottom_Normal               0x2D9\n#define METATILE_PokemonCenter_Escalator_Bottom_Transition1          0x313\n#define METATILE_PokemonCenter_Escalator_Bottom_Transition2          0x311\n#define METATILE_PokemonCenter_Escalator_TopNextRail_Normal          0x2EB\n#define METATILE_PokemonCenter_Escalator_TopNextRail_Transition1     0x31E\n#define METATILE_PokemonCenter_Escalator_TopNextRail_Transition2     0x31C\n#define METATILE_PokemonCenter_Escalator_TopNext_Normal              0x2E3\n#define METATILE_PokemonCenter_Escalator_TopNext_Transition1         0x316\n#define METATILE_PokemonCenter_Escalator_TopNext_Transition2         0x314\n#define METATILE_PokemonCenter_Escalator_Top_Normal                  0x2E4\n#define METATILE_PokemonCenter_Escalator_Top_Transition1             0x317\n#define METATILE_PokemonCenter_Escalator_Top_Transition2             0x315\n#define METATILE_PokemonCenter_Floor_ShadeLeft                       0x2C5\n#define METATILE_PokemonCenter_NetworkMachine_Ruby                   0x35D\n#define METATILE_PokemonCenter_NetworkMachine_Sapphire               0x35F\n#define METATILE_PokemonCenter_NetworkMachine_ScreenLeft_On          0x35A\n#define METATILE_PokemonCenter_NetworkMachine_ScreenRight_On         0x35B\n\n// gTileset_PokemonLeague\n#define METATILE_PokemonLeague_Door_Mid_Open             0x296\n#define METATILE_PokemonLeague_Door_Top_Open             0x28E\n#define METATILE_PokemonLeague_Entry_BottomLeft_Closed   0x2A5\n#define METATILE_PokemonLeague_Entry_BottomMid_Closed    0x2A6\n#define METATILE_PokemonLeague_Entry_BottomRight_Closed  0x2A7\n#define METATILE_PokemonLeague_Entry_TopLeft_Closed      0x29D\n#define METATILE_PokemonLeague_Entry_TopMid_Closed       0x29E\n#define METATILE_PokemonLeague_Entry_TopRight_Closed     0x29F\n#define METATILE_PokemonLeague_Floor_ShadeFull_Lance     0x311\n\n// gTileset_PokemonMansion\n#define METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft            0x300\n#define METATILE_PokemonMansion_Barrier_Horizontal_BottomLeft_Basement   0x354\n#define METATILE_PokemonMansion_Barrier_Horizontal_BottomMid             0x301\n#define METATILE_PokemonMansion_Barrier_Horizontal_BottomMid_Basement    0x355\n#define METATILE_PokemonMansion_Barrier_Horizontal_BottomRight           0x302\n#define METATILE_PokemonMansion_Barrier_Horizontal_BottomRight_Basement  0x356\n#define METATILE_PokemonMansion_Barrier_Horizontal_TopLeft               0x2F8\n#define METATILE_PokemonMansion_Barrier_Horizontal_TopMid                0x2F9\n#define METATILE_PokemonMansion_Barrier_Horizontal_TopRight              0x2FA\n#define METATILE_PokemonMansion_Barrier_Vertical_Bottom                  0x370\n#define METATILE_PokemonMansion_Barrier_Vertical_Bottom_Basement         0x372\n#define METATILE_PokemonMansion_Barrier_Vertical_Mid                     0x368\n#define METATILE_PokemonMansion_Barrier_Vertical_MidShadow               0x360\n#define METATILE_PokemonMansion_Barrier_Vertical_MidShadow_Basement      0x362\n#define METATILE_PokemonMansion_Barrier_Vertical_Mid_Basement            0x36A\n#define METATILE_PokemonMansion_Barrier_Vertical_TopBase                 0x358\n#define METATILE_PokemonMansion_Barrier_Vertical_TopWall                 0x350\n#define METATILE_PokemonMansion_BasementFloor                            0x286\n#define METATILE_PokemonMansion_BasementFloor_ShadeFull                  0x287\n#define METATILE_PokemonMansion_Floor                                    0x284\n#define METATILE_PokemonMansion_Floor_ShadeFull                          0x285\n#define METATILE_PokemonMansion_Statue_BlackEyes                         0x314\n#define METATILE_PokemonMansion_Statue_BlackEyes_Basement                0x316\n#define METATILE_PokemonMansion_Statue_BlackEyes_Shade                   0x315\n#define METATILE_PokemonMansion_Statue_RedEyes                           0x34D\n#define METATILE_PokemonMansion_Statue_RedEyes_Basement                  0x34F\n#define METATILE_PokemonMansion_Statue_RedEyes_Shade                     0x34E\n#define METATILE_PokemonMansion_Wall_EndCap                              0x2B5\n#define METATILE_PokemonMansion_Wall_EndCap_Basement                     0x2B0\n#define METATILE_PokemonMansion_Wall_EndPost_Bottom                      0x2AD\n#define METATILE_PokemonMansion_Wall_EndPost_Mid                         0x2A5\n\n// gTileset_SSAnne\n#define METATILE_SSAnne_Door  0x281\n\n// gTileset_SaffronCity\n#define METATILE_SaffronCity_Door         0x284\n#define METATILE_SaffronCity_SilphCoDoor  0x2BC\n\n// gTileset_SeaCottage\n#define METATILE_SeaCottage_Teleporter_CableBall_Bottom  0x2BA\n#define METATILE_SeaCottage_Teleporter_CableBall_Top     0x2B9\n#define METATILE_SeaCottage_Teleporter_Cable_Bottom      0x2B4\n#define METATILE_SeaCottage_Teleporter_Cable_Top         0x285\n#define METATILE_SeaCottage_Teleporter_Door              0x296\n#define METATILE_SeaCottage_Teleporter_Door_FullGlowing  0x2B8\n#define METATILE_SeaCottage_Teleporter_Door_HalfGlowing  0x2B7\n#define METATILE_SeaCottage_Teleporter_Light_Green       0x28A\n#define METATILE_SeaCottage_Teleporter_Light_Red         0x2B6\n#define METATILE_SeaCottage_Teleporter_Light_Yellow      0x2B5\n\n// gTileset_SeafoamIslands\n#define METATILE_SeafoamIslands_CrackedIce    0x35A\n#define METATILE_SeafoamIslands_IceHole       0x35B\n#define METATILE_SeafoamIslands_SlidingIce    0x34B\n#define METATILE_SeafoamIslands_UncrackedIce  0x359\n\n// gTileset_SeviiIslands123\n#define METATILE_SeviiIslands123_Door                0x297\n#define METATILE_SeviiIslands123_GameCornerDoor      0x29B\n#define METATILE_SeviiIslands123_OneIsland_AshGrass  0x3DA\n#define METATILE_SeviiIslands123_OneIsland_Grass     0x3EC\n#define METATILE_SeviiIslands123_OneIsland_Mowed     0x3ED\n#define METATILE_SeviiIslands123_PokeCenterDoor      0x2EB\n\n// gTileset_SeviiIslands45\n#define METATILE_SeviiIslands45_DayCareDoor                   0x2B9\n#define METATILE_SeviiIslands45_Door                          0x29A\n#define METATILE_SeviiIslands45_RocketWarehouseDoor_Locked    0x30B\n#define METATILE_SeviiIslands45_RocketWarehouseDoor_Unlocked  0x2AF\n\n// gTileset_SeviiIslands5\n#define METATILE_SeviiIslands5_MicroWideTreeTopLeft_Grass   0x2B2\n#define METATILE_SeviiIslands5_MicroWideTreeTopLeft_Mowed   0x286\n#define METATILE_SeviiIslands5_MicroWideTreeTopRight_Grass  0x2B3\n#define METATILE_SeviiIslands5_MicroWideTreeTopRight_Mowed  0x287\n#define METATILE_SeviiIslands5_Micro_Grass                  0x28C\n#define METATILE_SeviiIslands5_Micro_Mowed                  0x28B\n\n// gTileset_SeviiIslands67\n#define METATILE_SeviiIslands67_BottomLeftCorner                      0x30E\n#define METATILE_SeviiIslands67_BottomRightCorner                     0x30F\n#define METATILE_SeviiIslands67_Door                                  0x30C\n#define METATILE_SeviiIslands67_DottedHoleDoor_Closed                 0x357\n#define METATILE_SeviiIslands67_DottedHoleDoor_Open                   0x358\n#define METATILE_SeviiIslands67_Down                                  0x308\n#define METATILE_SeviiIslands67_EmeraldMowed                          0x229\n#define METATILE_SeviiIslands67_Grass_BottomLeftCorner                0x2F6\n#define METATILE_SeviiIslands67_Grass_BottomRightCorner               0x2F7\n#define METATILE_SeviiIslands67_Grass_Down                            0x2D7\n#define METATILE_SeviiIslands67_Grass_InnerCornerBottomLeft           0x2DB\n#define METATILE_SeviiIslands67_Grass_InnerCornerBottomRight          0x2DD\n#define METATILE_SeviiIslands67_Grass_InnerCornerTopLeft              0x2DC\n#define METATILE_SeviiIslands67_Grass_InnerCornerTopRight             0x2CF\n#define METATILE_SeviiIslands67_Grass_InnerCornersTopRightBottomLeft  0x2F5\n#define METATILE_SeviiIslands67_Grass_Left                            0x2DE\n#define METATILE_SeviiIslands67_Grass_Plain                           0x2CE\n#define METATILE_SeviiIslands67_Grass_Right                           0x2DF\n#define METATILE_SeviiIslands67_Grass_RightInnerCornerTopLeft         0x33D\n#define METATILE_SeviiIslands67_Grass_TopLeftCorner                   0x2E6\n#define METATILE_SeviiIslands67_Grass_TopRightCorner                  0x2E7\n#define METATILE_SeviiIslands67_Grass_Up                              0x2D6\n#define METATILE_SeviiIslands67_InnerCornerBottomLeft                 0x303\n#define METATILE_SeviiIslands67_InnerCornerBottomRight                0x302\n#define METATILE_SeviiIslands67_InnerCornerTopLeft                    0x30B\n#define METATILE_SeviiIslands67_InnerCornerTopRight                   0x313\n#define METATILE_SeviiIslands67_InnerCornersTopRightBottomLeft        0x359\n#define METATILE_SeviiIslands67_Left                                  0x306\n#define METATILE_SeviiIslands67_LongGrass_Bottom                      0x23B\n#define METATILE_SeviiIslands67_LongGrass_Top                         0x233\n#define METATILE_SeviiIslands67_Plain                                 0x33A\n#define METATILE_SeviiIslands67_Right                                 0x307\n#define METATILE_SeviiIslands67_RightInnerCornerTopLeft               0x390\n#define METATILE_SeviiIslands67_TopLeftCorner                         0x300\n#define METATILE_SeviiIslands67_TopRightCorner                        0x301\n#define METATILE_SeviiIslands67_Up                                    0x332\n\n// gTileset_SeviiIslands6\n#define METATILE_SeviiIslands6_DO_NOT_DELETE                 0x287\n#define METATILE_SeviiIslands6_ForestTreeCorner_Left         0x2B3\n#define METATILE_SeviiIslands6_ForestTreeCorner_Left_Mowed   0x2A0\n#define METATILE_SeviiIslands6_ForestTreeCorner_Right        0x2B4\n#define METATILE_SeviiIslands6_ForestTreeCorner_Right_Mowed  0x2A2\n#define METATILE_SeviiIslands6_ForestTreeTop                 0x2B5\n#define METATILE_SeviiIslands6_ForestTreeTop_Mowed           0x28F\n\n\n// gTileset_ViridianCity\n#define METATILE_ViridianCity_Door  0x299\n\n// gTileset_ViridianForest\n#define METATILE_ViridianForest_HugeTreeTopMiddle_Grass  0x284\n#define METATILE_ViridianForest_HugeTreeTopMiddle_Mowed  0x281\n\n// gTileset_SilphCo\n#define METATILE_SilphCo_Arrow_Down                     0x2A8\n#define METATILE_SilphCo_Arrow_Left                     0x2A1\n#define METATILE_SilphCo_Arrow_Right                    0x2A9\n#define METATILE_SilphCo_Arrow_Up                       0x2A0\n#define METATILE_SilphCo_ElevatorDoor                   0x2E2\n#define METATILE_SilphCo_ElevatorWindow_Bottom0         0x2F8\n#define METATILE_SilphCo_ElevatorWindow_Bottom1         0x2F9\n#define METATILE_SilphCo_ElevatorWindow_Bottom2         0x2FA\n#define METATILE_SilphCo_ElevatorWindow_Mid0            0x2F0\n#define METATILE_SilphCo_ElevatorWindow_Mid1            0x2F1\n#define METATILE_SilphCo_ElevatorWindow_Mid2            0x2F2\n#define METATILE_SilphCo_ElevatorWindow_Top0            0x2E8\n#define METATILE_SilphCo_ElevatorWindow_Top1            0x2E9\n#define METATILE_SilphCo_ElevatorWindow_Top2            0x2EA\n#define METATILE_SilphCo_Floor                          0x334\n#define METATILE_SilphCo_Floor_ShadeFull                0x335\n#define METATILE_SilphCo_Floor_WallLeftCorner           0x339\n#define METATILE_SilphCo_Floor_WallRightCorner          0x33A\n#define METATILE_SilphCo_HideoutBarrier_BottomLeft      0x2D6\n#define METATILE_SilphCo_HideoutBarrier_BottomRight     0x2D7\n#define METATILE_SilphCo_HideoutBarrier_TopLeft_Floor   0x2CE\n#define METATILE_SilphCo_HideoutBarrier_TopLeft_Wall    0x2C6\n#define METATILE_SilphCo_HideoutBarrier_TopRight_Floor  0x2CF\n#define METATILE_SilphCo_HideoutBarrier_TopRight_Wall   0x2C7\n#define METATILE_SilphCo_HideoutElevatorDoor            0x2AB\n#define METATILE_SilphCo_HideoutFloor                   0x281\n#define METATILE_SilphCo_HideoutFloor_ShadeFull         0x282\n#define METATILE_SilphCo_HorizontalBarrier_BottomLeft   0x3B8\n#define METATILE_SilphCo_HorizontalBarrier_BottomRight  0x3B9\n#define METATILE_SilphCo_HorizontalBarrier_TopLeft      0x3B0\n#define METATILE_SilphCo_HorizontalBarrier_TopRight     0x3B1\n#define METATILE_SilphCo_VerticalBarrier_BottomLeft     0x3C4\n#define METATILE_SilphCo_VerticalBarrier_BottomRight    0x3C5\n#define METATILE_SilphCo_VerticalBarrier_MidLeft        0x3C2\n#define METATILE_SilphCo_VerticalBarrier_MidRight       0x3C3\n#define METATILE_SilphCo_VerticalBarrier_TopLeft        0x3C0\n#define METATILE_SilphCo_VerticalBarrier_TopRight       0x3C1\n#define METATILE_SilphCo_Wall_LeftEdge                  0x347\n#define METATILE_SilphCo_Wall_RightEdge                 0x346\n\n// gTileset_TrainerTower\n#define METATILE_TrainerTower_CounterBarrier         0x2B4\n#define METATILE_TrainerTower_Floor_ShadeBottomLeft  0x287\n#define METATILE_TrainerTower_LobbyElevatorDoor      0x2C3\n#define METATILE_TrainerTower_RoofElevatorDoor       0x356\n\n// gTileset_VermilionCity\n#define METATILE_VermilionCity_Door        0x29E\n#define METATILE_VermilionCity_SSAnneWarp  0x2E1\n\n// gTileset_VermilionGym\n#define METATILE_VermilionGym_Beam_MidBottom                     0x28D\n#define METATILE_VermilionGym_Beam_MidBottom_HalfOn              0x2C5\n#define METATILE_VermilionGym_Beam_MidTop                        0x285\n#define METATILE_VermilionGym_Beam_MidTop_HalfOn                 0x2BD\n#define METATILE_VermilionGym_Beam_Node_BottomLeft_Edge_HalfOn   0x2C4\n#define METATILE_VermilionGym_Beam_Node_BottomLeft_Edge_Off      0x29C\n#define METATILE_VermilionGym_Beam_Node_BottomLeft_Edge_On       0x2B2\n#define METATILE_VermilionGym_Beam_Node_BottomLeft_HalfOn        0x2C3\n#define METATILE_VermilionGym_Beam_Node_BottomLeft_Off           0x29B\n#define METATILE_VermilionGym_Beam_Node_BottomLeft_On            0x2B1\n#define METATILE_VermilionGym_Beam_Node_BottomRight_Edge_HalfOn  0x2C6\n#define METATILE_VermilionGym_Beam_Node_BottomRight_Edge_Off     0x29D\n#define METATILE_VermilionGym_Beam_Node_BottomRight_Edge_On      0x2B3\n#define METATILE_VermilionGym_Beam_Node_BottomRight_HalfOn       0x2C7\n#define METATILE_VermilionGym_Beam_Node_BottomRight_Off          0x29E\n#define METATILE_VermilionGym_Beam_Node_BottomRight_On           0x2B4\n#define METATILE_VermilionGym_Beam_Node_TopLeft_Edge_HalfOn      0x2BC\n#define METATILE_VermilionGym_Beam_Node_TopLeft_Edge_Off         0x294\n#define METATILE_VermilionGym_Beam_Node_TopLeft_Edge_On          0x2AA\n#define METATILE_VermilionGym_Beam_Node_TopLeft_HalfOn           0x2BB\n#define METATILE_VermilionGym_Beam_Node_TopLeft_Off              0x293\n#define METATILE_VermilionGym_Beam_Node_TopLeft_On               0x2A9\n#define METATILE_VermilionGym_Beam_Node_TopRight_Edge_HalfOn     0x2BE\n#define METATILE_VermilionGym_Beam_Node_TopRight_Edge_Off        0x295\n#define METATILE_VermilionGym_Beam_Node_TopRight_Edge_On         0x2AB\n#define METATILE_VermilionGym_Beam_Node_TopRight_HalfOn          0x2BF\n#define METATILE_VermilionGym_Beam_Node_TopRight_Off             0x296\n#define METATILE_VermilionGym_Beam_Node_TopRight_On              0x2AC\n#define METATILE_VermilionGym_Floor                              0x281\n\n// gTileset_ViridianCity\n#define METATILE_ViridianCity_Door  0x299\n\n// gTileset_ViridianForest\n#define METATILE_ViridianForest_HugeTreeTopMiddle_Grass  0x284\n#define METATILE_ViridianForest_HugeTreeTopMiddle_Mowed  0x281\n\n// Other\n#define METATILE_Fallarbor_AshGrass                      0x20A\n#define METATILE_Fallarbor_NormalGrass                   0x212\n#define METATILE_Lavaridge_NormalGrass                   0x206\n#define METATILE_Pacifidlog_SkyPillar_CrackedFloor_Hole  0x237\n#define METATILE_RSCave_CrackedFloor                     0x22F\n#define METATILE_RSCave_CrackedFloor_Hole                0x206\n\n#endif // GUARD_METATILE_LABELS_H\n"
  },
  {
    "path": "include/constants/moves.h",
    "content": "#ifndef GUARD_CONSTANTS_MOVES_H\n#define GUARD_CONSTANTS_MOVES_H\n\n#define MOVE_NONE 0\n#define MOVE_POUND 1\n#define MOVE_KARATE_CHOP 2\n#define MOVE_DOUBLE_SLAP 3\n#define MOVE_COMET_PUNCH 4\n#define MOVE_MEGA_PUNCH 5\n#define MOVE_PAY_DAY 6\n#define MOVE_FIRE_PUNCH 7\n#define MOVE_ICE_PUNCH 8\n#define MOVE_THUNDER_PUNCH 9\n#define MOVE_SCRATCH 10\n#define MOVE_VICE_GRIP 11\n#define MOVE_GUILLOTINE 12\n#define MOVE_RAZOR_WIND 13\n#define MOVE_SWORDS_DANCE 14\n#define MOVE_CUT 15\n#define MOVE_GUST 16\n#define MOVE_WING_ATTACK 17\n#define MOVE_WHIRLWIND 18\n#define MOVE_FLY 19\n#define MOVE_BIND 20\n#define MOVE_SLAM 21\n#define MOVE_VINE_WHIP 22\n#define MOVE_STOMP 23\n#define MOVE_DOUBLE_KICK 24\n#define MOVE_MEGA_KICK 25\n#define MOVE_JUMP_KICK 26\n#define MOVE_ROLLING_KICK 27\n#define MOVE_SAND_ATTACK 28\n#define MOVE_HEADBUTT 29\n#define MOVE_HORN_ATTACK 30\n#define MOVE_FURY_ATTACK 31\n#define MOVE_HORN_DRILL 32\n#define MOVE_TACKLE 33\n#define MOVE_BODY_SLAM 34\n#define MOVE_WRAP 35\n#define MOVE_TAKE_DOWN 36\n#define MOVE_THRASH 37\n#define MOVE_DOUBLE_EDGE 38\n#define MOVE_TAIL_WHIP 39\n#define MOVE_POISON_STING 40\n#define MOVE_TWINEEDLE 41\n#define MOVE_PIN_MISSILE 42\n#define MOVE_LEER 43\n#define MOVE_BITE 44\n#define MOVE_GROWL 45\n#define MOVE_ROAR 46\n#define MOVE_SING 47\n#define MOVE_SUPERSONIC 48\n#define MOVE_SONIC_BOOM 49\n#define MOVE_DISABLE 50\n#define MOVE_ACID 51\n#define MOVE_EMBER 52\n#define MOVE_FLAMETHROWER 53\n#define MOVE_MIST 54\n#define MOVE_WATER_GUN 55\n#define MOVE_HYDRO_PUMP 56\n#define MOVE_SURF 57\n#define MOVE_ICE_BEAM 58\n#define MOVE_BLIZZARD 59\n#define MOVE_PSYBEAM 60\n#define MOVE_BUBBLE_BEAM 61\n#define MOVE_AURORA_BEAM 62\n#define MOVE_HYPER_BEAM 63\n#define MOVE_PECK 64\n#define MOVE_DRILL_PECK 65\n#define MOVE_SUBMISSION 66\n#define MOVE_LOW_KICK 67\n#define MOVE_COUNTER 68\n#define MOVE_SEISMIC_TOSS 69\n#define MOVE_STRENGTH 70\n#define MOVE_ABSORB 71\n#define MOVE_MEGA_DRAIN 72\n#define MOVE_LEECH_SEED 73\n#define MOVE_GROWTH 74\n#define MOVE_RAZOR_LEAF 75\n#define MOVE_SOLAR_BEAM 76\n#define MOVE_POISON_POWDER 77\n#define MOVE_STUN_SPORE 78\n#define MOVE_SLEEP_POWDER 79\n#define MOVE_PETAL_DANCE 80\n#define MOVE_STRING_SHOT 81\n#define MOVE_DRAGON_RAGE 82\n#define MOVE_FIRE_SPIN 83\n#define MOVE_THUNDER_SHOCK 84\n#define MOVE_THUNDERBOLT 85\n#define MOVE_THUNDER_WAVE 86\n#define MOVE_THUNDER 87\n#define MOVE_ROCK_THROW 88\n#define MOVE_EARTHQUAKE 89\n#define MOVE_FISSURE 90\n#define MOVE_DIG 91\n#define MOVE_TOXIC 92\n#define MOVE_CONFUSION 93\n#define MOVE_PSYCHIC 94\n#define MOVE_HYPNOSIS 95\n#define MOVE_MEDITATE 96\n#define MOVE_AGILITY 97\n#define MOVE_QUICK_ATTACK 98\n#define MOVE_RAGE 99\n#define MOVE_TELEPORT 100\n#define MOVE_NIGHT_SHADE 101\n#define MOVE_MIMIC 102\n#define MOVE_SCREECH 103\n#define MOVE_DOUBLE_TEAM 104\n#define MOVE_RECOVER 105\n#define MOVE_HARDEN 106\n#define MOVE_MINIMIZE 107\n#define MOVE_SMOKESCREEN 108\n#define MOVE_CONFUSE_RAY 109\n#define MOVE_WITHDRAW 110\n#define MOVE_DEFENSE_CURL 111\n#define MOVE_BARRIER 112\n#define MOVE_LIGHT_SCREEN 113\n#define MOVE_HAZE 114\n#define MOVE_REFLECT 115\n#define MOVE_FOCUS_ENERGY 116\n#define MOVE_BIDE 117\n#define MOVE_METRONOME 118\n#define MOVE_MIRROR_MOVE 119\n#define MOVE_SELF_DESTRUCT 120\n#define MOVE_EGG_BOMB 121\n#define MOVE_LICK 122\n#define MOVE_SMOG 123\n#define MOVE_SLUDGE 124\n#define MOVE_BONE_CLUB 125\n#define MOVE_FIRE_BLAST 126\n#define MOVE_WATERFALL 127\n#define MOVE_CLAMP 128\n#define MOVE_SWIFT 129\n#define MOVE_SKULL_BASH 130\n#define MOVE_SPIKE_CANNON 131\n#define MOVE_CONSTRICT 132\n#define MOVE_AMNESIA 133\n#define MOVE_KINESIS 134\n#define MOVE_SOFT_BOILED 135\n#define MOVE_HI_JUMP_KICK 136\n#define MOVE_GLARE 137\n#define MOVE_DREAM_EATER 138\n#define MOVE_POISON_GAS 139\n#define MOVE_BARRAGE 140\n#define MOVE_LEECH_LIFE 141\n#define MOVE_LOVELY_KISS 142\n#define MOVE_SKY_ATTACK 143\n#define MOVE_TRANSFORM 144\n#define MOVE_BUBBLE 145\n#define MOVE_DIZZY_PUNCH 146\n#define MOVE_SPORE 147\n#define MOVE_FLASH 148\n#define MOVE_PSYWAVE 149\n#define MOVE_SPLASH 150\n#define MOVE_ACID_ARMOR 151\n#define MOVE_CRABHAMMER 152\n#define MOVE_EXPLOSION 153\n#define MOVE_FURY_SWIPES 154\n#define MOVE_BONEMERANG 155\n#define MOVE_REST 156\n#define MOVE_ROCK_SLIDE 157\n#define MOVE_HYPER_FANG 158\n#define MOVE_SHARPEN 159\n#define MOVE_CONVERSION 160\n#define MOVE_TRI_ATTACK 161\n#define MOVE_SUPER_FANG 162\n#define MOVE_SLASH 163\n#define MOVE_SUBSTITUTE 164\n#define MOVE_STRUGGLE 165\n#define MOVE_SKETCH 166\n#define MOVE_TRIPLE_KICK 167\n#define MOVE_THIEF 168\n#define MOVE_SPIDER_WEB 169\n#define MOVE_MIND_READER 170\n#define MOVE_NIGHTMARE 171\n#define MOVE_FLAME_WHEEL 172\n#define MOVE_SNORE 173\n#define MOVE_CURSE 174\n#define MOVE_FLAIL 175\n#define MOVE_CONVERSION_2 176\n#define MOVE_AEROBLAST 177\n#define MOVE_COTTON_SPORE 178\n#define MOVE_REVERSAL 179\n#define MOVE_SPITE 180\n#define MOVE_POWDER_SNOW 181\n#define MOVE_PROTECT 182\n#define MOVE_MACH_PUNCH 183\n#define MOVE_SCARY_FACE 184\n#define MOVE_FAINT_ATTACK 185\n#define MOVE_SWEET_KISS 186\n#define MOVE_BELLY_DRUM 187\n#define MOVE_SLUDGE_BOMB 188\n#define MOVE_MUD_SLAP 189\n#define MOVE_OCTAZOOKA 190\n#define MOVE_SPIKES 191\n#define MOVE_ZAP_CANNON 192\n#define MOVE_FORESIGHT 193\n#define MOVE_DESTINY_BOND 194\n#define MOVE_PERISH_SONG 195\n#define MOVE_ICY_WIND 196\n#define MOVE_DETECT 197\n#define MOVE_BONE_RUSH 198\n#define MOVE_LOCK_ON 199\n#define MOVE_OUTRAGE 200\n#define MOVE_SANDSTORM 201\n#define MOVE_GIGA_DRAIN 202\n#define MOVE_ENDURE 203\n#define MOVE_CHARM 204\n#define MOVE_ROLLOUT 205\n#define MOVE_FALSE_SWIPE 206\n#define MOVE_SWAGGER 207\n#define MOVE_MILK_DRINK 208\n#define MOVE_SPARK 209\n#define MOVE_FURY_CUTTER 210\n#define MOVE_STEEL_WING 211\n#define MOVE_MEAN_LOOK 212\n#define MOVE_ATTRACT 213\n#define MOVE_SLEEP_TALK 214\n#define MOVE_HEAL_BELL 215\n#define MOVE_RETURN 216\n#define MOVE_PRESENT 217\n#define MOVE_FRUSTRATION 218\n#define MOVE_SAFEGUARD 219\n#define MOVE_PAIN_SPLIT 220\n#define MOVE_SACRED_FIRE 221\n#define MOVE_MAGNITUDE 222\n#define MOVE_DYNAMIC_PUNCH 223\n#define MOVE_MEGAHORN 224\n#define MOVE_DRAGON_BREATH 225\n#define MOVE_BATON_PASS 226\n#define MOVE_ENCORE 227\n#define MOVE_PURSUIT 228\n#define MOVE_RAPID_SPIN 229\n#define MOVE_SWEET_SCENT 230\n#define MOVE_IRON_TAIL 231\n#define MOVE_METAL_CLAW 232\n#define MOVE_VITAL_THROW 233\n#define MOVE_MORNING_SUN 234\n#define MOVE_SYNTHESIS 235\n#define MOVE_MOONLIGHT 236\n#define MOVE_HIDDEN_POWER 237\n#define MOVE_CROSS_CHOP 238\n#define MOVE_TWISTER 239\n#define MOVE_RAIN_DANCE 240\n#define MOVE_SUNNY_DAY 241\n#define MOVE_CRUNCH 242\n#define MOVE_MIRROR_COAT 243\n#define MOVE_PSYCH_UP 244\n#define MOVE_EXTREME_SPEED 245\n#define MOVE_ANCIENT_POWER 246\n#define MOVE_SHADOW_BALL 247\n#define MOVE_FUTURE_SIGHT 248\n#define MOVE_ROCK_SMASH 249\n#define MOVE_WHIRLPOOL 250\n#define MOVE_BEAT_UP 251\n#define MOVE_FAKE_OUT 252\n#define MOVE_UPROAR 253\n#define MOVE_STOCKPILE 254\n#define MOVE_SPIT_UP 255\n#define MOVE_SWALLOW 256\n#define MOVE_HEAT_WAVE 257\n#define MOVE_HAIL 258\n#define MOVE_TORMENT 259\n#define MOVE_FLATTER 260\n#define MOVE_WILL_O_WISP 261\n#define MOVE_MEMENTO 262\n#define MOVE_FACADE 263\n#define MOVE_FOCUS_PUNCH 264\n#define MOVE_SMELLING_SALT 265\n#define MOVE_FOLLOW_ME 266\n#define MOVE_NATURE_POWER 267\n#define MOVE_CHARGE 268\n#define MOVE_TAUNT 269\n#define MOVE_HELPING_HAND 270\n#define MOVE_TRICK 271\n#define MOVE_ROLE_PLAY 272\n#define MOVE_WISH 273\n#define MOVE_ASSIST 274\n#define MOVE_INGRAIN 275\n#define MOVE_SUPERPOWER 276\n#define MOVE_MAGIC_COAT 277\n#define MOVE_RECYCLE 278\n#define MOVE_REVENGE 279\n#define MOVE_BRICK_BREAK 280\n#define MOVE_YAWN 281\n#define MOVE_KNOCK_OFF 282\n#define MOVE_ENDEAVOR 283\n#define MOVE_ERUPTION 284\n#define MOVE_SKILL_SWAP 285\n#define MOVE_IMPRISON 286\n#define MOVE_REFRESH 287\n#define MOVE_GRUDGE 288\n#define MOVE_SNATCH 289\n#define MOVE_SECRET_POWER 290\n#define MOVE_DIVE 291\n#define MOVE_ARM_THRUST 292\n#define MOVE_CAMOUFLAGE 293\n#define MOVE_TAIL_GLOW 294\n#define MOVE_LUSTER_PURGE 295\n#define MOVE_MIST_BALL 296\n#define MOVE_FEATHER_DANCE 297\n#define MOVE_TEETER_DANCE 298\n#define MOVE_BLAZE_KICK 299\n#define MOVE_MUD_SPORT 300\n#define MOVE_ICE_BALL 301\n#define MOVE_NEEDLE_ARM 302\n#define MOVE_SLACK_OFF 303\n#define MOVE_HYPER_VOICE 304\n#define MOVE_POISON_FANG 305\n#define MOVE_CRUSH_CLAW 306\n#define MOVE_BLAST_BURN 307\n#define MOVE_HYDRO_CANNON 308\n#define MOVE_METEOR_MASH 309\n#define MOVE_ASTONISH 310\n#define MOVE_WEATHER_BALL 311\n#define MOVE_AROMATHERAPY 312\n#define MOVE_FAKE_TEARS 313\n#define MOVE_AIR_CUTTER 314\n#define MOVE_OVERHEAT 315\n#define MOVE_ODOR_SLEUTH 316\n#define MOVE_ROCK_TOMB 317\n#define MOVE_SILVER_WIND 318\n#define MOVE_METAL_SOUND 319\n#define MOVE_GRASS_WHISTLE 320\n#define MOVE_TICKLE 321\n#define MOVE_COSMIC_POWER 322\n#define MOVE_WATER_SPOUT 323\n#define MOVE_SIGNAL_BEAM 324\n#define MOVE_SHADOW_PUNCH 325\n#define MOVE_EXTRASENSORY 326\n#define MOVE_SKY_UPPERCUT 327\n#define MOVE_SAND_TOMB 328\n#define MOVE_SHEER_COLD 329\n#define MOVE_MUDDY_WATER 330\n#define MOVE_BULLET_SEED 331\n#define MOVE_AERIAL_ACE 332\n#define MOVE_ICICLE_SPEAR 333\n#define MOVE_IRON_DEFENSE 334\n#define MOVE_BLOCK 335\n#define MOVE_HOWL 336\n#define MOVE_DRAGON_CLAW 337\n#define MOVE_FRENZY_PLANT 338\n#define MOVE_BULK_UP 339\n#define MOVE_BOUNCE 340\n#define MOVE_MUD_SHOT 341\n#define MOVE_POISON_TAIL 342\n#define MOVE_COVET 343\n#define MOVE_VOLT_TACKLE 344\n#define MOVE_MAGICAL_LEAF 345\n#define MOVE_WATER_SPORT 346\n#define MOVE_CALM_MIND 347\n#define MOVE_LEAF_BLADE 348\n#define MOVE_DRAGON_DANCE 349\n#define MOVE_ROCK_BLAST 350\n#define MOVE_SHOCK_WAVE 351\n#define MOVE_WATER_PULSE 352\n#define MOVE_DOOM_DESIRE 353\n#define MOVE_PSYCHO_BOOST 354\n\n#define MOVES_COUNT 355\n\n// Used for checks for moves affected by Disable, Mimic, etc.\n#define MOVE_UNAVAILABLE 0xFFFF\n\n#define MOVETUTOR_MEGA_PUNCH     0\n#define MOVETUTOR_SWORDS_DANCE   1\n#define MOVETUTOR_MEGA_KICK      2\n#define MOVETUTOR_BODY_SLAM      3\n#define MOVETUTOR_DOUBLE_EDGE    4\n#define MOVETUTOR_COUNTER        5\n#define MOVETUTOR_SEISMIC_TOSS   6\n#define MOVETUTOR_MIMIC          7\n#define MOVETUTOR_METRONOME      8\n#define MOVETUTOR_SOFT_BOILED    9\n#define MOVETUTOR_DREAM_EATER   10\n#define MOVETUTOR_THUNDER_WAVE  11\n#define MOVETUTOR_EXPLOSION     12\n#define MOVETUTOR_ROCK_SLIDE    13\n#define MOVETUTOR_SUBSTITUTE    14\n#define MOVETUTOR_DYNAMIC_PUNCH 15\n#define MOVETUTOR_ROLLOUT       16\n#define MOVETUTOR_PSYCH_UP      17\n#define MOVETUTOR_SNORE         18\n#define MOVETUTOR_ICY_WIND      19\n#define MOVETUTOR_ENDURE        20\n#define MOVETUTOR_MUD_SLAP      21\n#define MOVETUTOR_ICE_PUNCH     22\n#define MOVETUTOR_SWAGGER       23\n#define MOVETUTOR_SLEEP_TALK    24\n#define MOVETUTOR_SWIFT         25\n#define MOVETUTOR_DEFENSE_CURL  26\n#define MOVETUTOR_THUNDER_PUNCH 27\n#define MOVETUTOR_FIRE_PUNCH    28\n#define MOVETUTOR_FURY_CUTTER   29\n#define MOVETUTOR_NIGHTMARE     30\n#define MOVETUTOR_SELF_DESTRUCT 31\n#define MOVETUTOR_SKY_ATTACK    32\n\n#define MOVETUTOR_FRENZY_PLANT  33\n#define MOVETUTOR_BLAST_BURN    34\n#define MOVETUTOR_HYDRO_CANNON  35\n\n#endif  // GUARD_CONSTANTS_MOVES_H\n"
  },
  {
    "path": "include/constants/mystery_gift.h",
    "content": "#ifndef GUARD_CONSTANTS_MYSTERY_GIFT_H\n#define GUARD_CONSTANTS_MYSTERY_GIFT_H\n\n#define GET_NUM_STAMPS        0\n#define GET_MAX_STAMPS        1\n#define GET_CARD_BATTLES_WON  2\n#define GET_CARD_BATTLES_LOST 3\n#define GET_CARD_NUM_TRADES   4\n\n#define CARD_STAT_BATTLES_WON   0\n#define CARD_STAT_BATTLES_LOST  1\n#define CARD_STAT_NUM_TRADES    2\n#define CARD_STAT_NUM_STAMPS    3\n#define CARD_STAT_MAX_STAMPS    4\n\n// Values for the type field of Wonder Card\n#define CARD_TYPE_GIFT       0 // Normal \"Wonder Card\"\n#define CARD_TYPE_STAMP      1 // \"Stamp Card\"\n#define CARD_TYPE_LINK_STAT  2 // Referred to as the \"Battle Card\", shows battle and trade stats\n#define CARD_TYPE_COUNT      3\n\n// Values for the sendType field of Wonder Card/News\n#define SEND_TYPE_DISALLOWED     0\n#define SEND_TYPE_ALLOWED        1\n#define SEND_TYPE_ALLOWED_ALWAYS 2\n\n// Return values for MysteryGift_CompareCardFlags, handled by gMysteryGiftServerScript_SendWonderCard\n#define HAS_NO_CARD   0\n#define HAS_SAME_CARD 1\n#define HAS_DIFF_CARD 2\n\n// The number of battles needed to be recorded on a Battle Card to win a prize\n#define REQUIRED_CARD_BATTLES 3\n\n// Stamps are 32 bits. The first 16 bits are the species\n// and the second 16 bits are a number (presumably an ID of some kind)\n#define STAMP_SPECIES 0\n#define STAMP_ID      1\n\n// Number of different types/colors of Wonder Card and News backgrounds\n#define NUM_WONDER_BGS 8\n\n#define MAX_WONDER_CARD_STAT 999\n\n#define WONDER_CARD_FLAG_OFFSET 1000\n\n#define NEWS_REWARD_NONE       0\n#define NEWS_REWARD_RECV_SMALL 1\n#define NEWS_REWARD_RECV_BIG   2\n#define NEWS_REWARD_WAITING    3\n#define NEWS_REWARD_SENT_SMALL 4\n#define NEWS_REWARD_SENT_BIG   5\n#define NEWS_REWARD_AT_MAX     6\n\n#endif //GUARD_CONSTANTS_MYSTERY_GIFT_H\n"
  },
  {
    "path": "include/constants/opponents.h",
    "content": "#ifndef GUARD_CONSTANTS_OPPONENTS_H\n#define GUARD_CONSTANTS_OPPONENTS_H\n\n#define TRAINER_NONE                               0\n#define TRAINER_LT_SURGE_REMATCH                   1\n#define TRAINER_LT_SURGE_REMATCH_CHALLENGE         2\n#define TRAINER_ERIKA_REMATCH                      3\n#define TRAINER_ERIKA_REMATCH_CHALLENGE            4\n#define TRAINER_KOGA_REMATCH                       5\n#define TRAINER_KOGA_REMATCH_CHALLENGE             6\n#define TRAINER_SABRINA_REMATCH                    7\n#define TRAINER_SABRINA_REMATCH_CHALLENGE          8\n#define TRAINER_BLAINE_REMATCH                     9\n#define TRAINER_BLAINE_REMATCH_CHALLENGE          10\n#define TRAINER_PKMN_RANGER_HELENA                11\n#define TRAINER_PKMN_RANGER_HELENA_2              12\n#define TRAINER_COOLTRAINER_ATTICUS               13\n#define TRAINER_COOLTRAINER_ATTICUS_2             14\n#define TRAINER_FISHERMAN_DEFOREST                15\n#define TRAINER_FISHERMAN_DEFOREST_2              16\n#define TRAINER_BIRD_KEEPER_SPEDO                 17\n#define TRAINER_BIRD_KEEPER_SPEDO_2               18\n#define TRAINER_COOLTRAINER_CASPARA               19\n#define TRAINER_COOLTRAINER_CASPARA_2             20\n#define TRAINER_SWIMMER_FEMALE_SEDEF              21\n#define TRAINER_SWIMMER_FEMALE_SEDEF_2            22\n#define TRAINER_MASTER_OAK                        23\n#define TRAINER_MISTY_REMATCH_CHALLENGE           24\n#define TRAINER_ELITE_FOUR_SIDNEY                 25\n#define TRAINER_ELITE_FOUR_PHOEBE                 26\n#define TRAINER_LEADER_ROXANNE                    27\n#define TRAINER_LEADER_BRAWLY                     28\n#define TRAINER_LEADER_TATE_LIZA                  29\n#define TRAINER_SCHOOL_KID_M                      30\n#define TRAINER_SCHOOL_KID_F                      31\n#define TRAINER_SR_AND_JR                         32\n#define TRAINER_POKEFAN_M                         33\n#define TRAINER_POKEFAN_F                         34\n#define TRAINER_EXPERT_M                          35\n#define TRAINER_EXPERT_F                          36\n#define TRAINER_RS_YOUNGSTER                      37\n#define TRAINER_RS_CHAMPION                       38\n#define TRAINER_RS_FISHERMAN                      39\n#define TRAINER_CYCLING_TRIATHLETE_M              40\n#define TRAINER_CYCLING_TRIATHLETE_F              41\n#define TRAINER_RUNNING_TRIATHLETE_M              42\n#define TRAINER_RUNNING_TRIATHLETE_F              43\n#define TRAINER_SWIMMING_TRIATHLETE_M             44\n#define TRAINER_SWIMMING_TRIATHLETE_F             45\n#define TRAINER_DRAGON_TAMER                      46\n#define TRAINER_RS_BIRD_KEEPER                    47\n#define TRAINER_NINJA_BOY                         48\n#define TRAINER_BATTLE_GIRL                       49\n#define TRAINER_PARASOL_LADY                      50\n#define TRAINER_RS_SWIMMER_F                      51\n#define TRAINER_RS_PICNICKER                      52\n#define TRAINER_RS_TWINS                          53\n#define TRAINER_RS_SAILOR                         54\n#define TRAINER_BOARDER_M                         55\n#define TRAINER_BOARDER_F                         56\n#define TRAINER_COLLECTOR                         57\n#define TRAINER_WALLY                             58\n#define TRAINER_BRENDAN                           59\n#define TRAINER_BRENDAN_2                         60\n#define TRAINER_BRENDAN_3                         61\n#define TRAINER_MAY                               62\n#define TRAINER_MAY_2                             63\n#define TRAINER_MAY_3                             64\n#define TRAINER_RS_PKMN_BREEDER_M                 65\n#define TRAINER_RS_PKMN_BREEDER_F                 66\n#define TRAINER_RS_PKMN_RANGER_M                  67\n#define TRAINER_RS_PKMN_RANGER_F                  68\n#define TRAINER_MAGMA_LEADER                      69\n#define TRAINER_MAGMA_GRUNT_M                     70\n#define TRAINER_MAMGA_GRUNT_F                     71\n#define TRAINER_RS_LASS                           72\n#define TRAINER_RS_BUG_CATCHER                    73\n#define TRAINER_RS_HIKER                          74\n#define TRAINER_RS_YOUNG_COUPLE                   75\n#define TRAINER_OLD_COUPLE                        76\n#define TRAINER_RS_SIS_AND_BRO                    77\n#define TRAINER_AQUA_ADMIN_MATT                   78\n#define TRAINER_AQUA_ADMIN_SHELLY                 79\n#define TRAINER_MAGMA_ADMIN_TABITHA               80\n#define TRAINER_MAGMA_ADMIN_COURTNEY              81\n#define TRAINER_LEADER_WATTSON                    82\n#define TRAINER_LEADER_FLANNERY                   83\n#define TRAINER_LEADER_NORMAN                     84\n#define TRAINER_LEADER_WINONA                     85\n#define TRAINER_LEADER_WALLACE                    86\n#define TRAINER_ELITE_FOUR_GLACIA                 87\n#define TRAINER_ELITE_FOUR_DRAKE                  88\n// Actual FRLG trainers start here\n#define TRAINER_YOUNGSTER_BEN                     89\n#define TRAINER_YOUNGSTER_CALVIN                  90\n#define TRAINER_YOUNGSTER_JOSH                    91\n#define TRAINER_YOUNGSTER_TIMMY                   92\n#define TRAINER_YOUNGSTER_JOEY                    93\n#define TRAINER_YOUNGSTER_DAN                     94\n#define TRAINER_YOUNGSTER_CHAD                    95\n#define TRAINER_YOUNGSTER_TYLER                   96\n#define TRAINER_YOUNGSTER_EDDIE                   97\n#define TRAINER_YOUNGSTER_DILLON                  98\n#define TRAINER_YOUNGSTER_YASU                    99\n#define TRAINER_YOUNGSTER_DAVE                   100\n#define TRAINER_YOUNGSTER_BEN_2                  101\n#define TRAINER_BUG_CATCHER_RICK                 102\n#define TRAINER_BUG_CATCHER_DOUG                 103\n#define TRAINER_BUG_CATCHER_SAMMY                104\n#define TRAINER_BUG_CATCHER_COLTON               105\n#define TRAINER_BUG_CATCHER_GREG                 106\n#define TRAINER_BUG_CATCHER_JAMES                107\n#define TRAINER_BUG_CATCHER_KENT                 108\n#define TRAINER_BUG_CATCHER_ROBBY                109\n#define TRAINER_BUG_CATCHER_CALE                 110\n#define TRAINER_BUG_CATCHER_KEIGO                111\n#define TRAINER_BUG_CATCHER_ELIJAH               112\n#define TRAINER_BUG_CATCHER_2                    113\n#define TRAINER_BUG_CATCHER_BRENT                114\n#define TRAINER_BUG_CATCHER_CONNER               115\n#define TRAINER_LASS_JANICE                      116\n#define TRAINER_LASS_SALLY                       117\n#define TRAINER_LASS_ROBIN                       118\n#define TRAINER_LASS_CRISSY                      119\n#define TRAINER_LASS_MIRIAM                      120\n#define TRAINER_LASS_IRIS                        121\n#define TRAINER_LASS_RELI                        122\n#define TRAINER_LASS_ALI                         123\n#define TRAINER_LASS_2                           124\n#define TRAINER_LASS_HALEY                       125\n#define TRAINER_LASS_ANN                         126\n#define TRAINER_LASS_DAWN                        127\n#define TRAINER_LASS_PAIGE                       128\n#define TRAINER_LASS_ANDREA                      129\n#define TRAINER_LASS_MEGAN                       130\n#define TRAINER_LASS_JULIA                       131\n#define TRAINER_LASS_KAY                         132\n#define TRAINER_LASS_LISA                        133\n#define TRAINER_SAILOR_EDMOND                    134\n#define TRAINER_SAILOR_TREVOR                    135\n#define TRAINER_SAILOR_LEONARD                   136\n#define TRAINER_SAILOR_DUNCAN                    137\n#define TRAINER_SAILOR_HUEY                      138\n#define TRAINER_SAILOR_DYLAN                     139\n#define TRAINER_SAILOR_PHILLIP                   140\n#define TRAINER_SAILOR_DWAYNE                    141\n#define TRAINER_CAMPER_LIAM                      142\n#define TRAINER_CAMPER_SHANE                     143\n#define TRAINER_CAMPER_ETHAN                     144\n#define TRAINER_CAMPER_RICKY                     145\n#define TRAINER_CAMPER_JEFF                      146\n#define TRAINER_CAMPER_2                         147\n#define TRAINER_CAMPER_CHRIS                     148\n#define TRAINER_CAMPER_DREW                      149\n#define TRAINER_PICNICKER_DIANA                  150\n#define TRAINER_PICNICKER_NANCY                  151\n#define TRAINER_PICNICKER_ISABELLE               152\n#define TRAINER_PICNICKER_KELSEY                 153\n#define TRAINER_PICNICKER_ALICIA                 154\n#define TRAINER_PICNICKER_CAITLIN                155\n#define TRAINER_PICNICKER_HEIDI                  156\n#define TRAINER_PICNICKER_CAROL                  157\n#define TRAINER_PICNICKER_SOFIA                  158\n#define TRAINER_PICNICKER_MARTHA                 159\n#define TRAINER_PICNICKER_TINA                   160\n#define TRAINER_PICNICKER_HANNAH                 161\n#define TRAINER_POKEMANIAC_MARK                  162\n#define TRAINER_POKEMANIAC_HERMAN                163\n#define TRAINER_POKEMANIAC_COOPER                164\n#define TRAINER_POKEMANIAC_STEVE                 165\n#define TRAINER_POKEMANIAC_WINSTON               166\n#define TRAINER_POKEMANIAC_DAWSON                167\n#define TRAINER_POKEMANIAC_ASHTON                168\n#define TRAINER_SUPER_NERD_JOVAN                 169\n#define TRAINER_SUPER_NERD_MIGUEL                170\n#define TRAINER_SUPER_NERD_AIDAN                 171\n#define TRAINER_SUPER_NERD_GLENN                 172\n#define TRAINER_SUPER_NERD_LESLIE                173\n#define TRAINER_SUPER_NERD_1                     174\n#define TRAINER_SUPER_NERD_2                     175\n#define TRAINER_SUPER_NERD_3                     176\n#define TRAINER_SUPER_NERD_ERIK                  177\n#define TRAINER_SUPER_NERD_AVERY                 178\n#define TRAINER_SUPER_NERD_DEREK                 179\n#define TRAINER_SUPER_NERD_ZAC                   180\n#define TRAINER_HIKER_MARCOS                     181\n#define TRAINER_HIKER_FRANKLIN                   182\n#define TRAINER_HIKER_NOB                        183\n#define TRAINER_HIKER_WAYNE                      184\n#define TRAINER_HIKER_ALAN                       185\n#define TRAINER_HIKER_BRICE                      186\n#define TRAINER_HIKER_CLARK                      187\n#define TRAINER_HIKER_TRENT                      188\n#define TRAINER_HIKER_DUDLEY                     189\n#define TRAINER_HIKER_ALLEN                      190\n#define TRAINER_HIKER_ERIC                       191\n#define TRAINER_HIKER_LENNY                      192\n#define TRAINER_HIKER_OLIVER                     193\n#define TRAINER_HIKER_LUCAS                      194\n#define TRAINER_BIKER_JARED                      195\n#define TRAINER_BIKER_MALIK                      196\n#define TRAINER_BIKER_ERNEST                     197\n#define TRAINER_BIKER_ALEX                       198\n#define TRAINER_BIKER_LAO                        199\n#define TRAINER_BIKER_1                          200\n#define TRAINER_BIKER_HIDEO                      201\n#define TRAINER_BIKER_RUBEN                      202\n#define TRAINER_BIKER_BILLY                      203\n#define TRAINER_BIKER_NIKOLAS                    204\n#define TRAINER_BIKER_JAXON                      205\n#define TRAINER_BIKER_WILLIAM                    206\n#define TRAINER_BIKER_LUKAS                      207\n#define TRAINER_BIKER_ISAAC                      208\n#define TRAINER_BIKER_GERALD                     209\n#define TRAINER_BURGLAR_1                        210\n#define TRAINER_BURGLAR_2                        211\n#define TRAINER_BURGLAR_3                        212\n#define TRAINER_BURGLAR_QUINN                    213\n#define TRAINER_BURGLAR_RAMON                    214\n#define TRAINER_BURGLAR_DUSTY                    215\n#define TRAINER_BURGLAR_ARNIE                    216\n#define TRAINER_BURGLAR_4                        217\n#define TRAINER_BURGLAR_SIMON                    218\n#define TRAINER_BURGLAR_LEWIS                    219\n#define TRAINER_ENGINEER_BAILY                   220\n#define TRAINER_ENGINEER_BRAXTON                 221\n#define TRAINER_ENGINEER_BERNIE                  222\n#define TRAINER_FISHERMAN_DALE                   223\n#define TRAINER_FISHERMAN_BARNY                  224\n#define TRAINER_FISHERMAN_NED                    225\n#define TRAINER_FISHERMAN_CHIP                   226\n#define TRAINER_FISHERMAN_HANK                   227\n#define TRAINER_FISHERMAN_ELLIOT                 228\n#define TRAINER_FISHERMAN_RONALD                 229\n#define TRAINER_FISHERMAN_CLAUDE                 230\n#define TRAINER_FISHERMAN_WADE                   231\n#define TRAINER_FISHERMAN_NOLAN                  232\n#define TRAINER_FISHERMAN_ANDREW                 233\n#define TRAINER_SWIMMER_MALE_LUIS                234\n#define TRAINER_SWIMMER_MALE_RICHARD             235\n#define TRAINER_SWIMMER_MALE_REECE               236\n#define TRAINER_SWIMMER_MALE_MATTHEW             237\n#define TRAINER_SWIMMER_MALE_DOUGLAS             238\n#define TRAINER_SWIMMER_MALE_DAVID               239\n#define TRAINER_SWIMMER_MALE_TONY                240\n#define TRAINER_SWIMMER_MALE_AXLE                241\n#define TRAINER_SWIMMER_MALE_BARRY               242\n#define TRAINER_SWIMMER_MALE_DEAN                243\n#define TRAINER_SWIMMER_MALE_DARRIN              244\n#define TRAINER_SWIMMER_MALE_SPENCER             245\n#define TRAINER_SWIMMER_MALE_JACK                246\n#define TRAINER_SWIMMER_MALE_JEROME              247\n#define TRAINER_SWIMMER_MALE_ROLAND              248\n#define TRAINER_CUE_BALL_KOJI                    249\n#define TRAINER_CUE_BALL_LUKE                    250\n#define TRAINER_CUE_BALL_CAMRON                  251\n#define TRAINER_CUE_BALL_RAUL                    252\n#define TRAINER_CUE_BALL_ISAIAH                  253\n#define TRAINER_CUE_BALL_ZEEK                    254\n#define TRAINER_CUE_BALL_JAMAL                   255\n#define TRAINER_CUE_BALL_COREY                   256\n#define TRAINER_CUE_BALL_CHASE                   257\n#define TRAINER_GAMER_HUGO                       258\n#define TRAINER_GAMER_JASPER                     259\n#define TRAINER_GAMER_DIRK                       260\n#define TRAINER_GAMER_DARIAN                     261\n#define TRAINER_GAMER_STAN                       262\n#define TRAINER_GAMER_1                          263\n#define TRAINER_GAMER_RICH                       264\n#define TRAINER_BEAUTY_BRIDGET                   265\n#define TRAINER_BEAUTY_TAMIA                     266\n#define TRAINER_BEAUTY_LORI                      267\n#define TRAINER_BEAUTY_LOLA                      268\n#define TRAINER_BEAUTY_SHEILA                    269\n#define TRAINER_SWIMMER_FEMALE_TIFFANY           270\n#define TRAINER_SWIMMER_FEMALE_NORA              271\n#define TRAINER_SWIMMER_FEMALE_MELISSA           272\n#define TRAINER_BEAUTY_GRACE                     273\n#define TRAINER_BEAUTY_OLIVIA                    274\n#define TRAINER_BEAUTY_LAUREN                    275\n#define TRAINER_SWIMMER_FEMALE_ANYA              276\n#define TRAINER_SWIMMER_FEMALE_ALICE             277\n#define TRAINER_SWIMMER_FEMALE_CONNIE            278\n#define TRAINER_SWIMMER_FEMALE_SHIRLEY           279\n#define TRAINER_PSYCHIC_JOHAN                    280\n#define TRAINER_PSYCHIC_TYRON                    281\n#define TRAINER_PSYCHIC_CAMERON                  282\n#define TRAINER_PSYCHIC_PRESTON                  283\n#define TRAINER_ROCKER_RANDALL                   284\n#define TRAINER_ROCKER_LUCA                      285\n#define TRAINER_JUGGLER_DALTON                   286\n#define TRAINER_JUGGLER_NELSON                   287\n#define TRAINER_JUGGLER_KIRK                     288\n#define TRAINER_JUGGLER_SHAWN                    289\n#define TRAINER_JUGGLER_GREGORY                  290\n#define TRAINER_JUGGLER_EDWARD                   291\n#define TRAINER_JUGGLER_KAYDEN                   292\n#define TRAINER_JUGGLER_NATE                     293\n#define TRAINER_TAMER_PHIL                       294\n#define TRAINER_TAMER_EDGAR                      295\n#define TRAINER_TAMER_JASON                      296\n#define TRAINER_TAMER_COLE                       297\n#define TRAINER_TAMER_VINCENT                    298\n#define TRAINER_TAMER_JOHN                       299\n#define TRAINER_BIRD_KEEPER_SEBASTIAN            300\n#define TRAINER_BIRD_KEEPER_PERRY                301\n#define TRAINER_BIRD_KEEPER_ROBERT               302\n#define TRAINER_BIRD_KEEPER_DONALD               303\n#define TRAINER_BIRD_KEEPER_BENNY                304\n#define TRAINER_BIRD_KEEPER_EDWIN                305\n#define TRAINER_BIRD_KEEPER_CHESTER              306\n#define TRAINER_BIRD_KEEPER_WILTON               307\n#define TRAINER_BIRD_KEEPER_RAMIRO               308\n#define TRAINER_BIRD_KEEPER_JACOB                309\n#define TRAINER_BIRD_KEEPER_ROGER                310\n#define TRAINER_BIRD_KEEPER_REED                 311\n#define TRAINER_BIRD_KEEPER_KEITH                312\n#define TRAINER_BIRD_KEEPER_CARTER               313\n#define TRAINER_BIRD_KEEPER_MITCH                314\n#define TRAINER_BIRD_KEEPER_BECK                 315\n#define TRAINER_BIRD_KEEPER_MARLON               316\n#define TRAINER_BLACK_BELT_KOICHI                317\n#define TRAINER_BLACK_BELT_MIKE                  318\n#define TRAINER_BLACK_BELT_HIDEKI                319\n#define TRAINER_BLACK_BELT_AARON                 320\n#define TRAINER_BLACK_BELT_HITOSHI               321\n#define TRAINER_BLACK_BELT_ATSUSHI               322\n#define TRAINER_BLACK_BELT_KIYO                  323\n#define TRAINER_BLACK_BELT_TAKASHI               324\n#define TRAINER_BLACK_BELT_DAISUKE               325\n#define TRAINER_RIVAL_OAKS_LAB_SQUIRTLE          326\n#define TRAINER_RIVAL_OAKS_LAB_BULBASAUR         327\n#define TRAINER_RIVAL_OAKS_LAB_CHARMANDER        328\n#define TRAINER_RIVAL_ROUTE22_EARLY_SQUIRTLE     329\n#define TRAINER_RIVAL_ROUTE22_EARLY_BULBASAUR    330\n#define TRAINER_RIVAL_ROUTE22_EARLY_CHARMANDER   331\n#define TRAINER_RIVAL_CERULEAN_SQUIRTLE          332\n#define TRAINER_RIVAL_CERULEAN_BULBASAUR         333\n#define TRAINER_RIVAL_CERULEAN_CHARMANDER        334\n#define TRAINER_SCIENTIST_TED                    335\n#define TRAINER_SCIENTIST_CONNOR                 336\n#define TRAINER_SCIENTIST_JERRY                  337\n#define TRAINER_SCIENTIST_JOSE                   338\n#define TRAINER_SCIENTIST_RODNEY                 339\n#define TRAINER_SCIENTIST_BEAU                   340\n#define TRAINER_SCIENTIST_TAYLOR                 341\n#define TRAINER_SCIENTIST_JOSHUA                 342\n#define TRAINER_SCIENTIST_PARKER                 343\n#define TRAINER_SCIENTIST_ED                     344\n#define TRAINER_SCIENTIST_TRAVIS                 345\n#define TRAINER_SCIENTIST_BRAYDON                346\n#define TRAINER_SCIENTIST_IVAN                   347\n#define TRAINER_BOSS_GIOVANNI                    348\n#define TRAINER_BOSS_GIOVANNI_2                  349\n#define TRAINER_LEADER_GIOVANNI                  350\n#define TRAINER_TEAM_ROCKET_GRUNT                351\n#define TRAINER_TEAM_ROCKET_GRUNT_2              352\n#define TRAINER_TEAM_ROCKET_GRUNT_3              353\n#define TRAINER_TEAM_ROCKET_GRUNT_4              354\n#define TRAINER_TEAM_ROCKET_GRUNT_5              355\n#define TRAINER_TEAM_ROCKET_GRUNT_6              356\n#define TRAINER_TEAM_ROCKET_GRUNT_7              357\n#define TRAINER_TEAM_ROCKET_GRUNT_8              358\n#define TRAINER_TEAM_ROCKET_GRUNT_9              359\n#define TRAINER_TEAM_ROCKET_GRUNT_10             360\n#define TRAINER_TEAM_ROCKET_GRUNT_11             361\n#define TRAINER_TEAM_ROCKET_GRUNT_12             362\n#define TRAINER_TEAM_ROCKET_GRUNT_13             363\n#define TRAINER_TEAM_ROCKET_GRUNT_14             364\n#define TRAINER_TEAM_ROCKET_GRUNT_15             365\n#define TRAINER_TEAM_ROCKET_GRUNT_16             366\n#define TRAINER_TEAM_ROCKET_GRUNT_17             367\n#define TRAINER_TEAM_ROCKET_GRUNT_18             368\n#define TRAINER_TEAM_ROCKET_GRUNT_19             369\n#define TRAINER_TEAM_ROCKET_GRUNT_20             370\n#define TRAINER_TEAM_ROCKET_GRUNT_21             371\n#define TRAINER_TEAM_ROCKET_GRUNT_22             372\n#define TRAINER_TEAM_ROCKET_GRUNT_23             373\n#define TRAINER_TEAM_ROCKET_GRUNT_24             374\n#define TRAINER_TEAM_ROCKET_GRUNT_25             375\n#define TRAINER_TEAM_ROCKET_GRUNT_26             376\n#define TRAINER_TEAM_ROCKET_GRUNT_27             377\n#define TRAINER_TEAM_ROCKET_GRUNT_28             378\n#define TRAINER_TEAM_ROCKET_GRUNT_29             379\n#define TRAINER_TEAM_ROCKET_GRUNT_30             380\n#define TRAINER_TEAM_ROCKET_GRUNT_31             381\n#define TRAINER_TEAM_ROCKET_GRUNT_32             382\n#define TRAINER_TEAM_ROCKET_GRUNT_33             383\n#define TRAINER_TEAM_ROCKET_GRUNT_34             384\n#define TRAINER_TEAM_ROCKET_GRUNT_35             385\n#define TRAINER_TEAM_ROCKET_GRUNT_36             386\n#define TRAINER_TEAM_ROCKET_GRUNT_37             387\n#define TRAINER_TEAM_ROCKET_GRUNT_38             388\n#define TRAINER_TEAM_ROCKET_GRUNT_39             389\n#define TRAINER_TEAM_ROCKET_GRUNT_40             390\n#define TRAINER_TEAM_ROCKET_GRUNT_41             391\n#define TRAINER_COOLTRAINER_SAMUEL               392\n#define TRAINER_COOLTRAINER_GEORGE               393\n#define TRAINER_COOLTRAINER_COLBY                394\n#define TRAINER_COOLTRAINER_PAUL                 395\n#define TRAINER_COOLTRAINER_ROLANDO              396\n#define TRAINER_COOLTRAINER_GILBERT              397\n#define TRAINER_COOLTRAINER_OWEN                 398\n#define TRAINER_COOLTRAINER_BERKE                399\n#define TRAINER_COOLTRAINER_YUJI                 400\n#define TRAINER_COOLTRAINER_WARREN               401\n#define TRAINER_COOLTRAINER_MARY                 402\n#define TRAINER_COOLTRAINER_CAROLINE             403\n#define TRAINER_COOLTRAINER_ALEXA                404\n#define TRAINER_COOLTRAINER_SHANNON              405\n#define TRAINER_COOLTRAINER_NAOMI                406\n#define TRAINER_COOLTRAINER_BROOKE               407\n#define TRAINER_COOLTRAINER_AUSTINA              408\n#define TRAINER_COOLTRAINER_JULIE                409\n#define TRAINER_ELITE_FOUR_LORELEI               410\n#define TRAINER_ELITE_FOUR_BRUNO                 411\n#define TRAINER_ELITE_FOUR_AGATHA                412\n#define TRAINER_ELITE_FOUR_LANCE                 413\n#define TRAINER_LEADER_BROCK                     414\n#define TRAINER_LEADER_MISTY                     415\n#define TRAINER_LEADER_LT_SURGE                  416\n#define TRAINER_LEADER_ERIKA                     417\n#define TRAINER_LEADER_KOGA                      418\n#define TRAINER_LEADER_BLAINE                    419\n#define TRAINER_LEADER_SABRINA                   420\n#define TRAINER_GENTLEMAN_THOMAS                 421\n#define TRAINER_GENTLEMAN_ARTHUR                 422\n#define TRAINER_GENTLEMAN_TUCKER                 423\n#define TRAINER_GENTLEMAN_NORTON                 424\n#define TRAINER_GENTLEMAN_WALTER                 425\n#define TRAINER_RIVAL_SS_ANNE_SQUIRTLE           426\n#define TRAINER_RIVAL_SS_ANNE_BULBASAUR          427\n#define TRAINER_RIVAL_SS_ANNE_CHARMANDER         428\n#define TRAINER_RIVAL_POKEMON_TOWER_SQUIRTLE     429\n#define TRAINER_RIVAL_POKEMON_TOWER_BULBASAUR    430\n#define TRAINER_RIVAL_POKEMON_TOWER_CHARMANDER   431\n#define TRAINER_RIVAL_SILPH_SQUIRTLE             432\n#define TRAINER_RIVAL_SILPH_BULBASAUR            433\n#define TRAINER_RIVAL_SILPH_CHARMANDER           434\n#define TRAINER_RIVAL_ROUTE22_LATE_SQUIRTLE      435\n#define TRAINER_RIVAL_ROUTE22_LATE_BULBASAUR     436\n#define TRAINER_RIVAL_ROUTE22_LATE_CHARMANDER    437\n#define TRAINER_CHAMPION_FIRST_SQUIRTLE          438\n#define TRAINER_CHAMPION_FIRST_BULBASAUR         439\n#define TRAINER_CHAMPION_FIRST_CHARMANDER        440\n#define TRAINER_CHANNELER_PATRICIA               441\n#define TRAINER_CHANNELER_CARLY                  442\n#define TRAINER_CHANNELER_HOPE                   443\n#define TRAINER_CHANNELER_PAULA                  444\n#define TRAINER_CHANNELER_LAUREL                 445\n#define TRAINER_CHANNELER_JODY                   446\n#define TRAINER_CHANNELER_TAMMY                  447\n#define TRAINER_CHANNELER_RUTH                   448\n#define TRAINER_CHANNELER_KARINA                 449\n#define TRAINER_CHANNELER_JANAE                  450\n#define TRAINER_CHANNELER_ANGELICA               451\n#define TRAINER_CHANNELER_EMILIA                 452\n#define TRAINER_CHANNELER_JENNIFER               453\n#define TRAINER_CHANNELER_1                      454\n#define TRAINER_CHANNELER_2                      455\n#define TRAINER_CHANNELER_3                      456\n#define TRAINER_CHANNELER_4                      457\n#define TRAINER_CHANNELER_5                      458\n#define TRAINER_CHANNELER_6                      459\n#define TRAINER_CHANNELER_7                      460\n#define TRAINER_CHANNELER_8                      461\n#define TRAINER_CHANNELER_AMANDA                 462\n#define TRAINER_CHANNELER_STACY                  463\n#define TRAINER_CHANNELER_TASHA                  464\n#define TRAINER_HIKER_JEREMY                     465\n#define TRAINER_PICNICKER_ALMA                   466\n#define TRAINER_PICNICKER_SUSIE                  467\n#define TRAINER_PICNICKER_VALERIE                468\n#define TRAINER_PICNICKER_GWEN                   469\n#define TRAINER_BIKER_VIRGIL                     470\n#define TRAINER_CAMPER_FLINT                     471\n#define TRAINER_PICNICKER_MISSY                  472\n#define TRAINER_PICNICKER_IRENE                  473\n#define TRAINER_PICNICKER_DANA                   474\n#define TRAINER_PICNICKER_ARIANA                 475\n#define TRAINER_PICNICKER_LEAH                   476\n#define TRAINER_CAMPER_JUSTIN                    477\n#define TRAINER_PICNICKER_YAZMIN                 478\n#define TRAINER_PICNICKER_KINDRA                 479\n#define TRAINER_PICNICKER_BECKY                  480\n#define TRAINER_PICNICKER_CELIA                  481\n#define TRAINER_GENTLEMAN_BROOKS                 482\n#define TRAINER_GENTLEMAN_LAMAR                  483\n#define TRAINER_TWINS_ELI_ANNE                   484\n#define TRAINER_COOL_COUPLE_RAY_TYRA             485\n#define TRAINER_YOUNG_COUPLE_GIA_JES             486\n#define TRAINER_TWINS_KIRI_JAN                   487\n#define TRAINER_CRUSH_KIN_RON_MYA                488\n#define TRAINER_YOUNG_COUPLE_LEA_JED             489\n#define TRAINER_SIS_AND_BRO_LIA_LUC              490\n#define TRAINER_SIS_AND_BRO_LIL_IAN              491\n#define TRAINER_BUG_CATCHER_3                    492\n#define TRAINER_BUG_CATCHER_4                    493\n#define TRAINER_BUG_CATCHER_5                    494\n#define TRAINER_BUG_CATCHER_6                    495\n#define TRAINER_BUG_CATCHER_7                    496\n#define TRAINER_BUG_CATCHER_8                    497\n#define TRAINER_YOUNGSTER_BEN_3                  498\n#define TRAINER_YOUNGSTER_BEN_4                  499\n#define TRAINER_YOUNGSTER_CHAD_2                 500\n#define TRAINER_LASS_RELI_2                      501\n#define TRAINER_LASS_RELI_3                      502\n#define TRAINER_YOUNGSTER_TIMMY_2                503\n#define TRAINER_YOUNGSTER_TIMMY_3                504\n#define TRAINER_YOUNGSTER_TIMMY_4                505\n#define TRAINER_YOUNGSTER_CHAD_3                 506\n#define TRAINER_LASS_JANICE_2                    507\n#define TRAINER_LASS_JANICE_3                    508\n#define TRAINER_YOUNGSTER_CHAD_4                 509\n#define TRAINER_HIKER_FRANKLIN_2                 510\n#define TRAINER_PKMN_PROF_PROF_OAK               511\n#define TRAINER_PLAYER_BRENDAN                   512\n#define TRAINER_PLAYER_MAY                       513\n#define TRAINER_PLAYER_RED                       514\n#define TRAINER_PLAYER_LEAF                      515\n#define TRAINER_TEAM_ROCKET_GRUNT_42             516\n#define TRAINER_PSYCHIC_JACLYN                   517\n#define TRAINER_CRUSH_GIRL_SHARON                518\n#define TRAINER_TUBER_AMIRA                      519\n#define TRAINER_PKMN_BREEDER_ALIZE               520\n#define TRAINER_PKMN_RANGER_NICOLAS              521\n#define TRAINER_PKMN_RANGER_MADELINE             522\n#define TRAINER_AROMA_LADY_NIKKI                 523\n#define TRAINER_RUIN_MANIAC_STANLY               524\n#define TRAINER_LADY_JACKI                       525\n#define TRAINER_PAINTER_DAISY                    526\n#define TRAINER_BIKER_GOON                       527\n#define TRAINER_BIKER_GOON_2                     528\n#define TRAINER_BIKER_GOON_3                     529\n#define TRAINER_BIKER_2                          530\n#define TRAINER_BUG_CATCHER_ANTHONY              531\n#define TRAINER_BUG_CATCHER_CHARLIE              532\n#define TRAINER_TWINS_ELI_ANNE_2                 533\n#define TRAINER_YOUNGSTER_JOHNSON                534\n#define TRAINER_BIKER_RICARDO                    535\n#define TRAINER_BIKER_JAREN                      536\n#define TRAINER_TEAM_ROCKET_GRUNT_43             537\n#define TRAINER_TEAM_ROCKET_GRUNT_44             538\n#define TRAINER_TEAM_ROCKET_GRUNT_45             539\n#define TRAINER_TEAM_ROCKET_GRUNT_46             540\n#define TRAINER_TEAM_ROCKET_GRUNT_47             541\n#define TRAINER_TEAM_ROCKET_GRUNT_48             542\n#define TRAINER_TEAM_ROCKET_ADMIN                543\n#define TRAINER_TEAM_ROCKET_ADMIN_2              544\n#define TRAINER_SCIENTIST_GIDEON                 545\n#define TRAINER_SWIMMER_FEMALE_AMARA             546\n#define TRAINER_SWIMMER_FEMALE_MARIA             547\n#define TRAINER_SWIMMER_FEMALE_ABIGAIL           548\n#define TRAINER_SWIMMER_MALE_FINN                549\n#define TRAINER_SWIMMER_MALE_GARRETT             550\n#define TRAINER_FISHERMAN_TOMMY                  551\n#define TRAINER_CRUSH_GIRL_TANYA                 552\n#define TRAINER_BLACK_BELT_SHEA                  553\n#define TRAINER_BLACK_BELT_HUGH                  554\n#define TRAINER_CAMPER_BRYCE                     555\n#define TRAINER_PICNICKER_CLAIRE                 556\n#define TRAINER_CRUSH_KIN_MIK_KIA                557\n#define TRAINER_AROMA_LADY_VIOLET                558\n#define TRAINER_TUBER_ALEXIS                     559\n#define TRAINER_TWINS_JOY_MEG                    560\n#define TRAINER_SWIMMER_FEMALE_TISHA             561\n#define TRAINER_PAINTER_CELINA                   562\n#define TRAINER_PAINTER_RAYNA                    563\n#define TRAINER_LADY_GILLIAN                     564\n#define TRAINER_YOUNGSTER_DESTIN                 565\n#define TRAINER_SWIMMER_MALE_TOBY                566\n#define TRAINER_TEAM_ROCKET_GRUNT_49             567\n#define TRAINER_TEAM_ROCKET_GRUNT_50             568\n#define TRAINER_TEAM_ROCKET_GRUNT_51             569\n#define TRAINER_BIRD_KEEPER_MILO                 570\n#define TRAINER_BIRD_KEEPER_CHAZ                 571\n#define TRAINER_BIRD_KEEPER_HAROLD               572\n#define TRAINER_FISHERMAN_TYLOR                  573\n#define TRAINER_SWIMMER_MALE_MYMO                574\n#define TRAINER_SWIMMER_FEMALE_NICOLE            575\n#define TRAINER_SIS_AND_BRO_AVA_GEB              576\n#define TRAINER_AROMA_LADY_ROSE                  577\n#define TRAINER_SWIMMER_MALE_SAMIR               578\n#define TRAINER_SWIMMER_FEMALE_DENISE            579\n#define TRAINER_TWINS_MIU_MIA                    580\n#define TRAINER_HIKER_EARL                       581\n#define TRAINER_RUIN_MANIAC_FOSTER               582\n#define TRAINER_RUIN_MANIAC_LARRY                583\n#define TRAINER_HIKER_DARYL                      584\n#define TRAINER_POKEMANIAC_HECTOR                585\n#define TRAINER_PSYCHIC_DARIO                    586\n#define TRAINER_PSYCHIC_RODETTE                  587\n#define TRAINER_AROMA_LADY_MIAH                  588\n#define TRAINER_YOUNG_COUPLE_EVE_JON             589\n#define TRAINER_JUGGLER_MASON                    590\n#define TRAINER_CRUSH_GIRL_CYNDY                 591\n#define TRAINER_CRUSH_GIRL_JOCELYN               592\n#define TRAINER_TAMER_EVAN                       593\n#define TRAINER_POKEMANIAC_MARK_2                594\n#define TRAINER_PKMN_RANGER_LOGAN                595\n#define TRAINER_PKMN_RANGER_JACKSON              596\n#define TRAINER_PKMN_RANGER_BETH                 597\n#define TRAINER_PKMN_RANGER_KATELYN              598\n#define TRAINER_COOLTRAINER_LEROY                599\n#define TRAINER_COOLTRAINER_MICHELLE             600\n#define TRAINER_COOL_COUPLE_LEX_NYA              601\n#define TRAINER_RUIN_MANIAC_BRANDON              602\n#define TRAINER_RUIN_MANIAC_BENJAMIN             603\n#define TRAINER_PAINTER_EDNA                     604\n#define TRAINER_GENTLEMAN_CLIFFORD               605\n#define TRAINER_LADY_SELPHY                      606\n#define TRAINER_RUIN_MANIAC_LAWSON               607\n#define TRAINER_PSYCHIC_LAURA                    608\n#define TRAINER_PKMN_BREEDER_BETHANY             609\n#define TRAINER_PKMN_BREEDER_ALLISON             610\n#define TRAINER_BUG_CATCHER_GARRET               611\n#define TRAINER_BUG_CATCHER_JONAH                612\n#define TRAINER_BUG_CATCHER_VANCE                613\n#define TRAINER_YOUNGSTER_NASH                   614\n#define TRAINER_YOUNGSTER_CORDELL                615\n#define TRAINER_LASS_DALIA                       616\n#define TRAINER_LASS_JOANA                       617\n#define TRAINER_CAMPER_RILEY                     618\n#define TRAINER_PICNICKER_MARCY                  619\n#define TRAINER_RUIN_MANIAC_LAYTON               620\n#define TRAINER_PICNICKER_KELSEY_2               621\n#define TRAINER_PICNICKER_KELSEY_3               622\n#define TRAINER_PICNICKER_KELSEY_4               623\n#define TRAINER_CAMPER_RICKY_2                   624\n#define TRAINER_CAMPER_RICKY_3                   625\n#define TRAINER_CAMPER_RICKY_4                   626\n#define TRAINER_CAMPER_JEFF_2                    627\n#define TRAINER_CAMPER_JEFF_3                    628\n#define TRAINER_CAMPER_JEFF_4                    629\n#define TRAINER_PICNICKER_ISABELLE_2             630\n#define TRAINER_PICNICKER_ISABELLE_3             631\n#define TRAINER_PICNICKER_ISABELLE_4             632\n#define TRAINER_YOUNGSTER_YASU_2                 633\n#define TRAINER_YOUNGSTER_YASU_3                 634\n#define TRAINER_ENGINEER_BERNIE_2                635\n#define TRAINER_GAMER_DARIAN_2                   636\n#define TRAINER_CAMPER_CHRIS_2                   637\n#define TRAINER_CAMPER_CHRIS_3                   638\n#define TRAINER_CAMPER_CHRIS_4                   639\n#define TRAINER_PICNICKER_ALICIA_2               640\n#define TRAINER_PICNICKER_ALICIA_3               641\n#define TRAINER_PICNICKER_ALICIA_4               642\n#define TRAINER_HIKER_JEREMY_2                   643\n#define TRAINER_POKEMANIAC_MARK_3                644\n#define TRAINER_POKEMANIAC_HERMAN_2              645\n#define TRAINER_POKEMANIAC_HERMAN_3              646\n#define TRAINER_HIKER_TRENT_2                    647\n#define TRAINER_LASS_MEGAN_2                     648\n#define TRAINER_LASS_MEGAN_3                     649\n#define TRAINER_SUPER_NERD_GLENN_2               650\n#define TRAINER_GAMER_RICH_2                     651\n#define TRAINER_BIKER_JAREN_2                    652\n#define TRAINER_FISHERMAN_ELLIOT_2               653\n#define TRAINER_ROCKER_LUCA_2                    654\n#define TRAINER_BEAUTY_SHEILA_2                  655\n#define TRAINER_BIRD_KEEPER_ROBERT_2             656\n#define TRAINER_BIRD_KEEPER_ROBERT_3             657\n#define TRAINER_PICNICKER_SUSIE_2                658\n#define TRAINER_PICNICKER_SUSIE_3                659\n#define TRAINER_PICNICKER_SUSIE_4                660\n#define TRAINER_BIKER_LUKAS_2                    661\n#define TRAINER_BIRD_KEEPER_BENNY_2              662\n#define TRAINER_BIRD_KEEPER_BENNY_3              663\n#define TRAINER_BIRD_KEEPER_MARLON_2             664\n#define TRAINER_BIRD_KEEPER_MARLON_3             665\n#define TRAINER_BEAUTY_GRACE_2                   666\n#define TRAINER_BIRD_KEEPER_CHESTER_2            667\n#define TRAINER_BIRD_KEEPER_CHESTER_3            668\n#define TRAINER_PICNICKER_BECKY_2                669\n#define TRAINER_PICNICKER_BECKY_3                670\n#define TRAINER_PICNICKER_BECKY_4                671\n#define TRAINER_CRUSH_KIN_RON_MYA_2              672\n#define TRAINER_CRUSH_KIN_RON_MYA_3              673\n#define TRAINER_CRUSH_KIN_RON_MYA_4              674\n#define TRAINER_BIKER_RUBEN_2                    675\n#define TRAINER_CUE_BALL_CAMRON_2                676\n#define TRAINER_BIKER_JAXON_2                    677\n#define TRAINER_CUE_BALL_ISAIAH_2                678\n#define TRAINER_CUE_BALL_COREY_2                 679\n#define TRAINER_BIRD_KEEPER_JACOB_2              680\n#define TRAINER_BIRD_KEEPER_JACOB_3              681\n#define TRAINER_SWIMMER_FEMALE_ALICE_2           682\n#define TRAINER_SWIMMER_MALE_DARRIN_2            683\n#define TRAINER_PICNICKER_MISSY_2                684\n#define TRAINER_PICNICKER_MISSY_3                685\n#define TRAINER_FISHERMAN_WADE_2                 686\n#define TRAINER_SWIMMER_MALE_JACK_2              687\n#define TRAINER_SIS_AND_BRO_LIL_IAN_2            688\n#define TRAINER_SIS_AND_BRO_LIL_IAN_3            689\n#define TRAINER_SWIMMER_MALE_FINN_2              690\n#define TRAINER_CRUSH_GIRL_SHARON_2              691\n#define TRAINER_CRUSH_GIRL_SHARON_3              692\n#define TRAINER_CRUSH_GIRL_TANYA_2               693\n#define TRAINER_CRUSH_GIRL_TANYA_3               694\n#define TRAINER_BLACK_BELT_SHEA_2                695\n#define TRAINER_BLACK_BELT_SHEA_3                696\n#define TRAINER_BLACK_BELT_HUGH_2                697\n#define TRAINER_BLACK_BELT_HUGH_3                698\n#define TRAINER_CRUSH_KIN_MIK_KIA_2              699\n#define TRAINER_CRUSH_KIN_MIK_KIA_3              700\n#define TRAINER_TUBER_AMIRA_2                    701\n#define TRAINER_TWINS_JOY_MEG_2                  702\n#define TRAINER_PAINTER_RAYNA_2                  703\n#define TRAINER_YOUNGSTER_DESTIN_2               704\n#define TRAINER_PKMN_BREEDER_ALIZE_2             705\n#define TRAINER_YOUNG_COUPLE_GIA_JES_2           706\n#define TRAINER_YOUNG_COUPLE_GIA_JES_3           707\n#define TRAINER_BIRD_KEEPER_MILO_2               708\n#define TRAINER_BIRD_KEEPER_CHAZ_2               709\n#define TRAINER_BIRD_KEEPER_HAROLD_2             710\n#define TRAINER_SWIMMER_FEMALE_NICOLE_2          711\n#define TRAINER_PSYCHIC_JACLYN_2                 712\n#define TRAINER_SWIMMER_MALE_SAMIR_2             713\n#define TRAINER_HIKER_EARL_2                     714\n#define TRAINER_RUIN_MANIAC_LARRY_2              715\n#define TRAINER_POKEMANIAC_HECTOR_2              716\n#define TRAINER_PSYCHIC_DARIO_2                  717\n#define TRAINER_PSYCHIC_RODETTE_2                718\n#define TRAINER_JUGGLER_MASON_2                  719\n#define TRAINER_PKMN_RANGER_NICOLAS_2            720\n#define TRAINER_PKMN_RANGER_MADELINE_2           721\n#define TRAINER_CRUSH_GIRL_CYNDY_2               722\n#define TRAINER_TAMER_EVAN_2                     723\n#define TRAINER_PKMN_RANGER_JACKSON_2            724\n#define TRAINER_PKMN_RANGER_KATELYN_2            725\n#define TRAINER_COOLTRAINER_LEROY_2              726\n#define TRAINER_COOLTRAINER_MICHELLE_2           727\n#define TRAINER_COOL_COUPLE_LEX_NYA_2            728\n#define TRAINER_BUG_CATCHER_COLTON_2             729\n#define TRAINER_BUG_CATCHER_COLTON_3             730\n#define TRAINER_BUG_CATCHER_COLTON_4             731\n#define TRAINER_SWIMMER_MALE_MATTHEW_2           732\n#define TRAINER_SWIMMER_MALE_TONY_2              733\n#define TRAINER_SWIMMER_FEMALE_MELISSA_2         734\n#define TRAINER_ELITE_FOUR_LORELEI_2             735\n#define TRAINER_ELITE_FOUR_BRUNO_2               736\n#define TRAINER_ELITE_FOUR_AGATHA_2              737\n#define TRAINER_ELITE_FOUR_LANCE_2               738\n#define TRAINER_CHAMPION_REMATCH_SQUIRTLE        739\n#define TRAINER_CHAMPION_REMATCH_BULBASAUR       740\n#define TRAINER_CHAMPION_REMATCH_CHARMANDER      741\n#define TRAINER_CUE_BALL_PAXTON                  742\n#define TRAINER_LEADER_BROCK_CHALLENGE           743\n#define TRAINER_LEADER_MISTY_CHALLENGE           744\n#define TRAINER_LEADER_LT_SURGE_CHALLENGE        745\n#define TRAINER_LEADER_ERIKA_CHALLENGE           746\n#define TRAINER_LEADER_KOGA_CHALLENGE            747\n#define TRAINER_LEADER_SABRINA_CHALLENGE         748\n#define TRAINER_LEADER_BLAINE_CHALLENGE          749\n#define TRAINER_LEADER_GIOVANNI_CHALLENGE        750\n#define TRAINER_ELITE_FOUR_LORELEI_CHALLENGE     751\n#define TRAINER_ELITE_FOUR_BRUNO_CHALLENGE       752\n#define TRAINER_ELITE_FOUR_AGATHA_CHALLENGE      753\n#define TRAINER_ELITE_FOUR_LANCE_CHALLENGE       754\n#define TRAINER_CHAMPION_FIRST_SQUIRTLE_CHALLENGE 755\n#define TRAINER_CHAMPION_FIRST_BULBASAUR_CHALLENGE 756\n#define TRAINER_CHAMPION_FIRST_CHARMANDER_CHALLENGE 757\n#define TRAINER_ELITE_FOUR_LORELEI_CHALLENGE_2   758\n#define TRAINER_ELITE_FOUR_BRUNO_CHALLENGE_2     759\n#define TRAINER_ELITE_FOUR_AGATHA_CHALLENGE_2    760\n#define TRAINER_ELITE_FOUR_LANCE_CHALLENGE_2     761\n#define TRAINER_CHAMPION_REMATCH_SQUIRTLE_CHALLENGE 762\n#define TRAINER_CHAMPION_REMATCH_BULBASAUR_CHALLENGE 763\n#define TRAINER_CHAMPION_REMATCH_CHARMANDER_CHALLENGE 764\n#define TRAINER_BROCK_REMATCH                    765\n#define TRAINER_BROCK_REMATCH_CHALLENGE          766\n#define TRAINER_MISTY_REMATCH                    767\n// NOTE: Because each Trainer uses a flag to determine when they are defeated, there is \n//       only space for 25 additional trainers before trainer flag space overflows.\n//       MAX_TRAINERS_COUNT can be increased but will take up additional saveblock space\n\n#define NUM_TRAINERS                             768\n#define MAX_TRAINERS_COUNT                       768\n\n#endif  // GUARD_CONSTANTS_OPPONENTS_H\n"
  },
  {
    "path": "include/constants/party_menu.h",
    "content": "#ifndef GUARD_CONSTANTS_PARTY_MENU_H\n#define GUARD_CONSTANTS_PARTY_MENU_H\n\n#define AILMENT_NONE  0\n#define AILMENT_PSN   1\n#define AILMENT_PRZ   2\n#define AILMENT_SLP   3\n#define AILMENT_FRZ   4\n#define AILMENT_BRN   5\n#define AILMENT_PKRS  6\n#define AILMENT_FNT   7\n\n#define TUTOR_MOVE_MEGA_PUNCH      0\n#define TUTOR_MOVE_SWORDS_DANCE    1\n#define TUTOR_MOVE_MEGA_KICK       2\n#define TUTOR_MOVE_BODY_SLAM       3\n#define TUTOR_MOVE_DOUBLE_EDGE     4\n#define TUTOR_MOVE_COUNTER         5\n#define TUTOR_MOVE_SEISMIC_TOSS    6\n#define TUTOR_MOVE_MIMIC           7\n#define TUTOR_MOVE_METRONOME       8\n#define TUTOR_MOVE_SOFT_BOILED     9\n#define TUTOR_MOVE_DREAM_EATER     10\n#define TUTOR_MOVE_THUNDER_WAVE    11\n#define TUTOR_MOVE_EXPLOSION       12\n#define TUTOR_MOVE_ROCK_SLIDE      13\n#define TUTOR_MOVE_SUBSTITUTE      14\n#define TUTOR_MOVE_DYNAMIC_PUNCH   15\n#define TUTOR_MOVE_ROLLOUT         16\n#define TUTOR_MOVE_PSYCH_UP        17\n#define TUTOR_MOVE_SNORE           18\n#define TUTOR_MOVE_ICY_WIND        19\n#define TUTOR_MOVE_ENDURE          20\n#define TUTOR_MOVE_MUD_SLAP        21\n#define TUTOR_MOVE_ICE_PUNCH       22\n#define TUTOR_MOVE_SWAGGER         23\n#define TUTOR_MOVE_SLEEP_TALK      24\n#define TUTOR_MOVE_SWIFT           25\n#define TUTOR_MOVE_DEFENSE_CURL    26\n#define TUTOR_MOVE_THUNDER_PUNCH   27\n#define TUTOR_MOVE_FIRE_PUNCH      28\n#define TUTOR_MOVE_FURY_CUTTER     29\n#define TUTOR_MOVE_NIGHTMARE       30\n#define TUTOR_MOVE_SELF_DESTRUCT   31\n#define TUTOR_MOVE_SKY_ATTACK      32\n#define TUTOR_MOVE_COUNT           33 // regular tutor move count\n\n#define TUTOR_MOVE_FRENZY_PLANT    33\n#define TUTOR_MOVE_BLAST_BURN      34\n#define TUTOR_MOVE_HYDRO_CANNON    35\n\n#define FIELD_MOVE_FLASH        0\n#define FIELD_MOVE_CUT          1\n#define FIELD_MOVE_FLY          2\n#define FIELD_MOVE_STRENGTH     3\n#define FIELD_MOVE_SURF         4\n#define FIELD_MOVE_ROCK_SMASH   5\n#define FIELD_MOVE_WATERFALL    6\n#define FIELD_MOVE_TELEPORT     7\n#define FIELD_MOVE_DIG          8\n#define FIELD_MOVE_MILK_DRINK   9\n#define FIELD_MOVE_SOFT_BOILED  10\n#define FIELD_MOVE_SWEET_SCENT  11\n#define FIELD_MOVE_DIVE         12\n#define FIELD_MOVE_END          13\n\n#define PARTY_LAYOUT_SINGLE          0\n#define PARTY_LAYOUT_DOUBLE          1\n#define PARTY_LAYOUT_MULTI           2\n#define PARTY_LAYOUT_MULTI_SHOWCASE  3  // The layout during the screen that appears just before a multi battle\n#define PARTY_LAYOUT_COUNT           4\n#define KEEP_PARTY_LAYOUT            0xFF\n\n#define PARTY_MENU_TYPE_FIELD                     0 \n#define PARTY_MENU_TYPE_IN_BATTLE                 1 \n#define PARTY_MENU_TYPE_CONTEST                   2 \n#define PARTY_MENU_TYPE_CHOOSE_SINGLE_MON         3 \n#define PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS      4  // multi battles, eReader battles, and some battle facilities\n#define PARTY_MENU_TYPE_MULTI_SHOWCASE            5\n#define PARTY_MENU_TYPE_DAYCARE                   6 \n#define PARTY_MENU_TYPE_MOVE_RELEARNER            7 \n#define PARTY_MENU_TYPE_UNION_ROOM_REGISTER       8  // trading board\n#define PARTY_MENU_TYPE_UNION_ROOM_TRADE          9  // trading board\n#define PARTY_MENU_TYPE_SPIN_TRADE                10 // Unused beta for Gen IV's Spin Trade\n#define PARTY_MENU_TYPE_MINIGAME                  11\n\n#define PARTY_ACTION_CHOOSE_MON         0\n#define PARTY_ACTION_SEND_OUT           1\n#define PARTY_ACTION_CANT_SWITCH        2\n#define PARTY_ACTION_USE_ITEM           3\n#define PARTY_ACTION_ABILITY_PREVENTS   4\n#define PARTY_ACTION_GIVE_ITEM          5  \n#define PARTY_ACTION_GIVE_PC_ITEM       6\n#define PARTY_ACTION_GIVE_MAILBOX_MAIL  7\n#define PARTY_ACTION_SWITCH             8\n#define PARTY_ACTION_SWITCHING          9\n#define PARTY_ACTION_SOFTBOILED         10\n#define PARTY_ACTION_CHOOSE_AND_CLOSE   11\n#define PARTY_ACTION_MOVE_TUTOR         12\n#define PARTY_ACTION_MINIGAME           13\n#define PARTY_ACTION_REUSABLE_ITEM      14\n\n// IDs for DisplayPartyMenuStdMessage, to display the message at the bottom of the party menu\n#define PARTY_MSG_CHOOSE_MON                0\n#define PARTY_MSG_CHOOSE_MON_OR_CANCEL      1\n#define PARTY_MSG_CHOOSE_MON_AND_CONFIRM    2\n#define PARTY_MSG_MOVE_TO_WHERE             3 \n#define PARTY_MSG_TEACH_WHICH_MON           4\n#define PARTY_MSG_USE_ON_WHICH_MON          5\n#define PARTY_MSG_GIVE_TO_WHICH_MON         6\n#define PARTY_MSG_NOTHING_TO_CUT            7\n#define PARTY_MSG_CANT_SURF_HERE            8\n#define PARTY_MSG_ALREADY_SURFING           9\n#define PARTY_MSG_CURRENT_TOO_FAST          10\n#define PARTY_MSG_ENJOY_CYCLING             11\n#define PARTY_MSG_ALREADY_IN_USE            12\n#define PARTY_MSG_CANT_USE_HERE             13\n#define PARTY_MSG_NO_MON_FOR_BATTLE         14\n#define PARTY_MSG_CHOOSE_MON_2              15\n#define PARTY_MSG_NOT_ENOUGH_HP             16\n#define PARTY_MSG_THREE_MONS_ARE_NEEDED     17\n#define PARTY_MSG_TWO_MONS_ARE_NEEDED       18\n#define PARTY_MSG_MONS_CANT_BE_SAME         19\n#define PARTY_MSG_NO_SAME_HOLD_ITEMS        20\n#define PARTY_MSG_UNUSED                    21\n#define PARTY_MSG_DO_WHAT_WITH_MON          22\n#define PARTY_MSG_RESTORE_WHICH_MOVE        23\n#define PARTY_MSG_BOOST_PP_WHICH_MOVE       24\n#define PARTY_MSG_DO_WHAT_WITH_ITEM         25\n#define PARTY_MSG_DO_WHAT_WITH_MAIL         26\n#define PARTY_MSG_NONE                      127\n\n// IDs for DisplayPartyPokemonDescriptionText, to display a message in the party pokemon's box\n#define PARTYBOX_DESC_NO_USE      0\n#define PARTYBOX_DESC_ABLE_3      1\n#define PARTYBOX_DESC_FIRST       2\n#define PARTYBOX_DESC_SECOND      3\n#define PARTYBOX_DESC_THIRD       4\n#define PARTYBOX_DESC_ABLE        5\n#define PARTYBOX_DESC_NOT_ABLE    6\n#define PARTYBOX_DESC_ABLE_2      7\n#define PARTYBOX_DESC_NOT_ABLE_2  8\n#define PARTYBOX_DESC_LEARNED     9\n\n#define SELECTWINDOW_ACTIONS  0\n#define SELECTWINDOW_ITEM     1\n#define SELECTWINDOW_MAIL     2\n#define SELECTWINDOW_MOVES    3\n\nenum\n{\n    CHOOSE_MONS_FOR_CABLE_CLUB_BATTLE,\n    CHOOSE_MONS_FOR_BATTLE_TOWER,\n    CHOOSE_MONS_FOR_UNION_ROOM_BATTLE,\n};\n\n#endif // GUARD_CONSTANTS_PARTY_MENU_H\n"
  },
  {
    "path": "include/constants/pokedex.h",
    "content": "#ifndef GUARD_CONSTANTS_POKEDEX_H\n#define GUARD_CONSTANTS_POKEDEX_H\n\n// National Pokedex order\nenum {\n    NATIONAL_DEX_NONE,\n    // Kanto\n    NATIONAL_DEX_BULBASAUR,\n    NATIONAL_DEX_IVYSAUR,\n    NATIONAL_DEX_VENUSAUR,\n    NATIONAL_DEX_CHARMANDER,\n    NATIONAL_DEX_CHARMELEON,\n    NATIONAL_DEX_CHARIZARD,\n    NATIONAL_DEX_SQUIRTLE,\n    NATIONAL_DEX_WARTORTLE,\n    NATIONAL_DEX_BLASTOISE,\n    NATIONAL_DEX_CATERPIE,\n    NATIONAL_DEX_METAPOD,\n    NATIONAL_DEX_BUTTERFREE,\n    NATIONAL_DEX_WEEDLE,\n    NATIONAL_DEX_KAKUNA,\n    NATIONAL_DEX_BEEDRILL,\n    NATIONAL_DEX_PIDGEY,\n    NATIONAL_DEX_PIDGEOTTO,\n    NATIONAL_DEX_PIDGEOT,\n    NATIONAL_DEX_RATTATA,\n    NATIONAL_DEX_RATICATE,\n    NATIONAL_DEX_SPEAROW,\n    NATIONAL_DEX_FEAROW,\n    NATIONAL_DEX_EKANS,\n    NATIONAL_DEX_ARBOK,\n    NATIONAL_DEX_PIKACHU,\n    NATIONAL_DEX_RAICHU,\n    NATIONAL_DEX_SANDSHREW,\n    NATIONAL_DEX_SANDSLASH,\n    NATIONAL_DEX_NIDORAN_F,\n    NATIONAL_DEX_NIDORINA,\n    NATIONAL_DEX_NIDOQUEEN,\n    NATIONAL_DEX_NIDORAN_M,\n    NATIONAL_DEX_NIDORINO,\n    NATIONAL_DEX_NIDOKING,\n    NATIONAL_DEX_CLEFAIRY,\n    NATIONAL_DEX_CLEFABLE,\n    NATIONAL_DEX_VULPIX,\n    NATIONAL_DEX_NINETALES,\n    NATIONAL_DEX_JIGGLYPUFF,\n    NATIONAL_DEX_WIGGLYTUFF,\n    NATIONAL_DEX_ZUBAT,\n    NATIONAL_DEX_GOLBAT,\n    NATIONAL_DEX_ODDISH,\n    NATIONAL_DEX_GLOOM,\n    NATIONAL_DEX_VILEPLUME,\n    NATIONAL_DEX_PARAS,\n    NATIONAL_DEX_PARASECT,\n    NATIONAL_DEX_VENONAT,\n    NATIONAL_DEX_VENOMOTH,\n    NATIONAL_DEX_DIGLETT,\n    NATIONAL_DEX_DUGTRIO,\n    NATIONAL_DEX_MEOWTH,\n    NATIONAL_DEX_PERSIAN,\n    NATIONAL_DEX_PSYDUCK,\n    NATIONAL_DEX_GOLDUCK,\n    NATIONAL_DEX_MANKEY,\n    NATIONAL_DEX_PRIMEAPE,\n    NATIONAL_DEX_GROWLITHE,\n    NATIONAL_DEX_ARCANINE,\n    NATIONAL_DEX_POLIWAG,\n    NATIONAL_DEX_POLIWHIRL,\n    NATIONAL_DEX_POLIWRATH,\n    NATIONAL_DEX_ABRA,\n    NATIONAL_DEX_KADABRA,\n    NATIONAL_DEX_ALAKAZAM,\n    NATIONAL_DEX_MACHOP,\n    NATIONAL_DEX_MACHOKE,\n    NATIONAL_DEX_MACHAMP,\n    NATIONAL_DEX_BELLSPROUT,\n    NATIONAL_DEX_WEEPINBELL,\n    NATIONAL_DEX_VICTREEBEL,\n    NATIONAL_DEX_TENTACOOL,\n    NATIONAL_DEX_TENTACRUEL,\n    NATIONAL_DEX_GEODUDE,\n    NATIONAL_DEX_GRAVELER,\n    NATIONAL_DEX_GOLEM,\n    NATIONAL_DEX_PONYTA,\n    NATIONAL_DEX_RAPIDASH,\n    NATIONAL_DEX_SLOWPOKE,\n    NATIONAL_DEX_SLOWBRO,\n    NATIONAL_DEX_MAGNEMITE,\n    NATIONAL_DEX_MAGNETON,\n    NATIONAL_DEX_FARFETCHD,\n    NATIONAL_DEX_DODUO,\n    NATIONAL_DEX_DODRIO,\n    NATIONAL_DEX_SEEL,\n    NATIONAL_DEX_DEWGONG,\n    NATIONAL_DEX_GRIMER,\n    NATIONAL_DEX_MUK,\n    NATIONAL_DEX_SHELLDER,\n    NATIONAL_DEX_CLOYSTER,\n    NATIONAL_DEX_GASTLY,\n    NATIONAL_DEX_HAUNTER,\n    NATIONAL_DEX_GENGAR,\n    NATIONAL_DEX_ONIX,\n    NATIONAL_DEX_DROWZEE,\n    NATIONAL_DEX_HYPNO,\n    NATIONAL_DEX_KRABBY,\n    NATIONAL_DEX_KINGLER,\n    NATIONAL_DEX_VOLTORB,\n    NATIONAL_DEX_ELECTRODE,\n    NATIONAL_DEX_EXEGGCUTE,\n    NATIONAL_DEX_EXEGGUTOR,\n    NATIONAL_DEX_CUBONE,\n    NATIONAL_DEX_MAROWAK,\n    NATIONAL_DEX_HITMONLEE,\n    NATIONAL_DEX_HITMONCHAN,\n    NATIONAL_DEX_LICKITUNG,\n    NATIONAL_DEX_KOFFING,\n    NATIONAL_DEX_WEEZING,\n    NATIONAL_DEX_RHYHORN,\n    NATIONAL_DEX_RHYDON,\n    NATIONAL_DEX_CHANSEY,\n    NATIONAL_DEX_TANGELA,\n    NATIONAL_DEX_KANGASKHAN,\n    NATIONAL_DEX_HORSEA,\n    NATIONAL_DEX_SEADRA,\n    NATIONAL_DEX_GOLDEEN,\n    NATIONAL_DEX_SEAKING,\n    NATIONAL_DEX_STARYU,\n    NATIONAL_DEX_STARMIE,\n    NATIONAL_DEX_MR_MIME,\n    NATIONAL_DEX_SCYTHER,\n    NATIONAL_DEX_JYNX,\n    NATIONAL_DEX_ELECTABUZZ,\n    NATIONAL_DEX_MAGMAR,\n    NATIONAL_DEX_PINSIR,\n    NATIONAL_DEX_TAUROS,\n    NATIONAL_DEX_MAGIKARP,\n    NATIONAL_DEX_GYARADOS,\n    NATIONAL_DEX_LAPRAS,\n    NATIONAL_DEX_DITTO,\n    NATIONAL_DEX_EEVEE,\n    NATIONAL_DEX_VAPOREON,\n    NATIONAL_DEX_JOLTEON,\n    NATIONAL_DEX_FLAREON,\n    NATIONAL_DEX_PORYGON,\n    NATIONAL_DEX_OMANYTE,\n    NATIONAL_DEX_OMASTAR,\n    NATIONAL_DEX_KABUTO,\n    NATIONAL_DEX_KABUTOPS,\n    NATIONAL_DEX_AERODACTYL,\n    NATIONAL_DEX_SNORLAX,\n    NATIONAL_DEX_ARTICUNO,\n    NATIONAL_DEX_ZAPDOS,\n    NATIONAL_DEX_MOLTRES,\n    NATIONAL_DEX_DRATINI,\n    NATIONAL_DEX_DRAGONAIR,\n    NATIONAL_DEX_DRAGONITE,\n    NATIONAL_DEX_MEWTWO,\n    NATIONAL_DEX_MEW,\n    // Johto\n    NATIONAL_DEX_CHIKORITA,\n    NATIONAL_DEX_BAYLEEF,\n    NATIONAL_DEX_MEGANIUM,\n    NATIONAL_DEX_CYNDAQUIL,\n    NATIONAL_DEX_QUILAVA,\n    NATIONAL_DEX_TYPHLOSION,\n    NATIONAL_DEX_TOTODILE,\n    NATIONAL_DEX_CROCONAW,\n    NATIONAL_DEX_FERALIGATR,\n    NATIONAL_DEX_SENTRET,\n    NATIONAL_DEX_FURRET,\n    NATIONAL_DEX_HOOTHOOT,\n    NATIONAL_DEX_NOCTOWL,\n    NATIONAL_DEX_LEDYBA,\n    NATIONAL_DEX_LEDIAN,\n    NATIONAL_DEX_SPINARAK,\n    NATIONAL_DEX_ARIADOS,\n    NATIONAL_DEX_CROBAT,\n    NATIONAL_DEX_CHINCHOU,\n    NATIONAL_DEX_LANTURN,\n    NATIONAL_DEX_PICHU,\n    NATIONAL_DEX_CLEFFA,\n    NATIONAL_DEX_IGGLYBUFF,\n    NATIONAL_DEX_TOGEPI,\n    NATIONAL_DEX_TOGETIC,\n    NATIONAL_DEX_NATU,\n    NATIONAL_DEX_XATU,\n    NATIONAL_DEX_MAREEP,\n    NATIONAL_DEX_FLAAFFY,\n    NATIONAL_DEX_AMPHAROS,\n    NATIONAL_DEX_BELLOSSOM,\n    NATIONAL_DEX_MARILL,\n    NATIONAL_DEX_AZUMARILL,\n    NATIONAL_DEX_SUDOWOODO,\n    NATIONAL_DEX_POLITOED,\n    NATIONAL_DEX_HOPPIP,\n    NATIONAL_DEX_SKIPLOOM,\n    NATIONAL_DEX_JUMPLUFF,\n    NATIONAL_DEX_AIPOM,\n    NATIONAL_DEX_SUNKERN,\n    NATIONAL_DEX_SUNFLORA,\n    NATIONAL_DEX_YANMA,\n    NATIONAL_DEX_WOOPER,\n    NATIONAL_DEX_QUAGSIRE,\n    NATIONAL_DEX_ESPEON,\n    NATIONAL_DEX_UMBREON,\n    NATIONAL_DEX_MURKROW,\n    NATIONAL_DEX_SLOWKING,\n    NATIONAL_DEX_MISDREAVUS,\n    NATIONAL_DEX_UNOWN,\n    NATIONAL_DEX_WOBBUFFET,\n    NATIONAL_DEX_GIRAFARIG,\n    NATIONAL_DEX_PINECO,\n    NATIONAL_DEX_FORRETRESS,\n    NATIONAL_DEX_DUNSPARCE,\n    NATIONAL_DEX_GLIGAR,\n    NATIONAL_DEX_STEELIX,\n    NATIONAL_DEX_SNUBBULL,\n    NATIONAL_DEX_GRANBULL,\n    NATIONAL_DEX_QWILFISH,\n    NATIONAL_DEX_SCIZOR,\n    NATIONAL_DEX_SHUCKLE,\n    NATIONAL_DEX_HERACROSS,\n    NATIONAL_DEX_SNEASEL,\n    NATIONAL_DEX_TEDDIURSA,\n    NATIONAL_DEX_URSARING,\n    NATIONAL_DEX_SLUGMA,\n    NATIONAL_DEX_MAGCARGO,\n    NATIONAL_DEX_SWINUB,\n    NATIONAL_DEX_PILOSWINE,\n    NATIONAL_DEX_CORSOLA,\n    NATIONAL_DEX_REMORAID,\n    NATIONAL_DEX_OCTILLERY,\n    NATIONAL_DEX_DELIBIRD,\n    NATIONAL_DEX_MANTINE,\n    NATIONAL_DEX_SKARMORY,\n    NATIONAL_DEX_HOUNDOUR,\n    NATIONAL_DEX_HOUNDOOM,\n    NATIONAL_DEX_KINGDRA,\n    NATIONAL_DEX_PHANPY,\n    NATIONAL_DEX_DONPHAN,\n    NATIONAL_DEX_PORYGON2,\n    NATIONAL_DEX_STANTLER,\n    NATIONAL_DEX_SMEARGLE,\n    NATIONAL_DEX_TYROGUE,\n    NATIONAL_DEX_HITMONTOP,\n    NATIONAL_DEX_SMOOCHUM,\n    NATIONAL_DEX_ELEKID,\n    NATIONAL_DEX_MAGBY,\n    NATIONAL_DEX_MILTANK,\n    NATIONAL_DEX_BLISSEY,\n    NATIONAL_DEX_RAIKOU,\n    NATIONAL_DEX_ENTEI,\n    NATIONAL_DEX_SUICUNE,\n    NATIONAL_DEX_LARVITAR,\n    NATIONAL_DEX_PUPITAR,\n    NATIONAL_DEX_TYRANITAR,\n    NATIONAL_DEX_LUGIA,\n    NATIONAL_DEX_HO_OH,\n    NATIONAL_DEX_CELEBI,\n    // Hoenn\n    NATIONAL_DEX_TREECKO,\n    NATIONAL_DEX_GROVYLE,\n    NATIONAL_DEX_SCEPTILE,\n    NATIONAL_DEX_TORCHIC,\n    NATIONAL_DEX_COMBUSKEN,\n    NATIONAL_DEX_BLAZIKEN,\n    NATIONAL_DEX_MUDKIP,\n    NATIONAL_DEX_MARSHTOMP,\n    NATIONAL_DEX_SWAMPERT,\n    NATIONAL_DEX_POOCHYENA,\n    NATIONAL_DEX_MIGHTYENA,\n    NATIONAL_DEX_ZIGZAGOON,\n    NATIONAL_DEX_LINOONE,\n    NATIONAL_DEX_WURMPLE,\n    NATIONAL_DEX_SILCOON,\n    NATIONAL_DEX_BEAUTIFLY,\n    NATIONAL_DEX_CASCOON,\n    NATIONAL_DEX_DUSTOX,\n    NATIONAL_DEX_LOTAD,\n    NATIONAL_DEX_LOMBRE,\n    NATIONAL_DEX_LUDICOLO,\n    NATIONAL_DEX_SEEDOT,\n    NATIONAL_DEX_NUZLEAF,\n    NATIONAL_DEX_SHIFTRY,\n    NATIONAL_DEX_TAILLOW,\n    NATIONAL_DEX_SWELLOW,\n    NATIONAL_DEX_WINGULL,\n    NATIONAL_DEX_PELIPPER,\n    NATIONAL_DEX_RALTS,\n    NATIONAL_DEX_KIRLIA,\n    NATIONAL_DEX_GARDEVOIR,\n    NATIONAL_DEX_SURSKIT,\n    NATIONAL_DEX_MASQUERAIN,\n    NATIONAL_DEX_SHROOMISH,\n    NATIONAL_DEX_BRELOOM,\n    NATIONAL_DEX_SLAKOTH,\n    NATIONAL_DEX_VIGOROTH,\n    NATIONAL_DEX_SLAKING,\n    NATIONAL_DEX_NINCADA,\n    NATIONAL_DEX_NINJASK,\n    NATIONAL_DEX_SHEDINJA,\n    NATIONAL_DEX_WHISMUR,\n    NATIONAL_DEX_LOUDRED,\n    NATIONAL_DEX_EXPLOUD,\n    NATIONAL_DEX_MAKUHITA,\n    NATIONAL_DEX_HARIYAMA,\n    NATIONAL_DEX_AZURILL,\n    NATIONAL_DEX_NOSEPASS,\n    NATIONAL_DEX_SKITTY,\n    NATIONAL_DEX_DELCATTY,\n    NATIONAL_DEX_SABLEYE,\n    NATIONAL_DEX_MAWILE,\n    NATIONAL_DEX_ARON,\n    NATIONAL_DEX_LAIRON,\n    NATIONAL_DEX_AGGRON,\n    NATIONAL_DEX_MEDITITE,\n    NATIONAL_DEX_MEDICHAM,\n    NATIONAL_DEX_ELECTRIKE,\n    NATIONAL_DEX_MANECTRIC,\n    NATIONAL_DEX_PLUSLE,\n    NATIONAL_DEX_MINUN,\n    NATIONAL_DEX_VOLBEAT,\n    NATIONAL_DEX_ILLUMISE,\n    NATIONAL_DEX_ROSELIA,\n    NATIONAL_DEX_GULPIN,\n    NATIONAL_DEX_SWALOT,\n    NATIONAL_DEX_CARVANHA,\n    NATIONAL_DEX_SHARPEDO,\n    NATIONAL_DEX_WAILMER,\n    NATIONAL_DEX_WAILORD,\n    NATIONAL_DEX_NUMEL,\n    NATIONAL_DEX_CAMERUPT,\n    NATIONAL_DEX_TORKOAL,\n    NATIONAL_DEX_SPOINK,\n    NATIONAL_DEX_GRUMPIG,\n    NATIONAL_DEX_SPINDA,\n    NATIONAL_DEX_TRAPINCH,\n    NATIONAL_DEX_VIBRAVA,\n    NATIONAL_DEX_FLYGON,\n    NATIONAL_DEX_CACNEA,\n    NATIONAL_DEX_CACTURNE,\n    NATIONAL_DEX_SWABLU,\n    NATIONAL_DEX_ALTARIA,\n    NATIONAL_DEX_ZANGOOSE,\n    NATIONAL_DEX_SEVIPER,\n    NATIONAL_DEX_LUNATONE,\n    NATIONAL_DEX_SOLROCK,\n    NATIONAL_DEX_BARBOACH,\n    NATIONAL_DEX_WHISCASH,\n    NATIONAL_DEX_CORPHISH,\n    NATIONAL_DEX_CRAWDAUNT,\n    NATIONAL_DEX_BALTOY,\n    NATIONAL_DEX_CLAYDOL,\n    NATIONAL_DEX_LILEEP,\n    NATIONAL_DEX_CRADILY,\n    NATIONAL_DEX_ANORITH,\n    NATIONAL_DEX_ARMALDO,\n    NATIONAL_DEX_FEEBAS,\n    NATIONAL_DEX_MILOTIC,\n    NATIONAL_DEX_CASTFORM,\n    NATIONAL_DEX_KECLEON,\n    NATIONAL_DEX_SHUPPET,\n    NATIONAL_DEX_BANETTE,\n    NATIONAL_DEX_DUSKULL,\n    NATIONAL_DEX_DUSCLOPS,\n    NATIONAL_DEX_TROPIUS,\n    NATIONAL_DEX_CHIMECHO,\n    NATIONAL_DEX_ABSOL,\n    NATIONAL_DEX_WYNAUT,\n    NATIONAL_DEX_SNORUNT,\n    NATIONAL_DEX_GLALIE,\n    NATIONAL_DEX_SPHEAL,\n    NATIONAL_DEX_SEALEO,\n    NATIONAL_DEX_WALREIN,\n    NATIONAL_DEX_CLAMPERL,\n    NATIONAL_DEX_HUNTAIL,\n    NATIONAL_DEX_GOREBYSS,\n    NATIONAL_DEX_RELICANTH,\n    NATIONAL_DEX_LUVDISC,\n    NATIONAL_DEX_BAGON,\n    NATIONAL_DEX_SHELGON,\n    NATIONAL_DEX_SALAMENCE,\n    NATIONAL_DEX_BELDUM,\n    NATIONAL_DEX_METANG,\n    NATIONAL_DEX_METAGROSS,\n    NATIONAL_DEX_REGIROCK,\n    NATIONAL_DEX_REGICE,\n    NATIONAL_DEX_REGISTEEL,\n    NATIONAL_DEX_LATIAS,\n    NATIONAL_DEX_LATIOS,\n    NATIONAL_DEX_KYOGRE,\n    NATIONAL_DEX_GROUDON,\n    NATIONAL_DEX_RAYQUAZA,\n    NATIONAL_DEX_JIRACHI,\n    NATIONAL_DEX_DEOXYS,\n    // Old Unown\n    NATIONAL_DEX_OLD_UNOWN_B,\n    NATIONAL_DEX_OLD_UNOWN_C,\n    NATIONAL_DEX_OLD_UNOWN_D,\n    NATIONAL_DEX_OLD_UNOWN_E,\n    NATIONAL_DEX_OLD_UNOWN_F,\n    NATIONAL_DEX_OLD_UNOWN_G,\n    NATIONAL_DEX_OLD_UNOWN_H,\n    NATIONAL_DEX_OLD_UNOWN_I,\n    NATIONAL_DEX_OLD_UNOWN_J,\n    NATIONAL_DEX_OLD_UNOWN_K,\n    NATIONAL_DEX_OLD_UNOWN_L,\n    NATIONAL_DEX_OLD_UNOWN_M,\n    NATIONAL_DEX_OLD_UNOWN_N,\n    NATIONAL_DEX_OLD_UNOWN_O,\n    NATIONAL_DEX_OLD_UNOWN_P,\n    NATIONAL_DEX_OLD_UNOWN_Q,\n    NATIONAL_DEX_OLD_UNOWN_R,\n    NATIONAL_DEX_OLD_UNOWN_S,\n    NATIONAL_DEX_OLD_UNOWN_T,\n    NATIONAL_DEX_OLD_UNOWN_U,\n    NATIONAL_DEX_OLD_UNOWN_V,\n    NATIONAL_DEX_OLD_UNOWN_W,\n    NATIONAL_DEX_OLD_UNOWN_X,\n    NATIONAL_DEX_OLD_UNOWN_Y,\n    NATIONAL_DEX_OLD_UNOWN_Z,\n};\n\n#define KANTO_DEX_COUNT     NATIONAL_DEX_MEW\n#define JOHTO_DEX_COUNT     NATIONAL_DEX_CELEBI\n#define NATIONAL_DEX_COUNT  NATIONAL_DEX_DEOXYS\n\n\n// Hoenn Pokedex order\nenum {\n    HOENN_DEX_NONE,\n    HOENN_DEX_TREECKO,\n    HOENN_DEX_GROVYLE,\n    HOENN_DEX_SCEPTILE,\n    HOENN_DEX_TORCHIC,\n    HOENN_DEX_COMBUSKEN,\n    HOENN_DEX_BLAZIKEN,\n    HOENN_DEX_MUDKIP,\n    HOENN_DEX_MARSHTOMP,\n    HOENN_DEX_SWAMPERT,\n    HOENN_DEX_POOCHYENA,\n    HOENN_DEX_MIGHTYENA,\n    HOENN_DEX_ZIGZAGOON,\n    HOENN_DEX_LINOONE,\n    HOENN_DEX_WURMPLE,\n    HOENN_DEX_SILCOON,\n    HOENN_DEX_BEAUTIFLY,\n    HOENN_DEX_CASCOON,\n    HOENN_DEX_DUSTOX,\n    HOENN_DEX_LOTAD,\n    HOENN_DEX_LOMBRE,\n    HOENN_DEX_LUDICOLO,\n    HOENN_DEX_SEEDOT,\n    HOENN_DEX_NUZLEAF,\n    HOENN_DEX_SHIFTRY,\n    HOENN_DEX_TAILLOW,\n    HOENN_DEX_SWELLOW,\n    HOENN_DEX_WINGULL,\n    HOENN_DEX_PELIPPER,\n    HOENN_DEX_RALTS,\n    HOENN_DEX_KIRLIA,\n    HOENN_DEX_GARDEVOIR,\n    HOENN_DEX_SURSKIT,\n    HOENN_DEX_MASQUERAIN,\n    HOENN_DEX_SHROOMISH,\n    HOENN_DEX_BRELOOM,\n    HOENN_DEX_SLAKOTH,\n    HOENN_DEX_VIGOROTH,\n    HOENN_DEX_SLAKING,\n    HOENN_DEX_ABRA,\n    HOENN_DEX_KADABRA,\n    HOENN_DEX_ALAKAZAM,\n    HOENN_DEX_NINCADA,\n    HOENN_DEX_NINJASK,\n    HOENN_DEX_SHEDINJA,\n    HOENN_DEX_WHISMUR,\n    HOENN_DEX_LOUDRED,\n    HOENN_DEX_EXPLOUD,\n    HOENN_DEX_MAKUHITA,\n    HOENN_DEX_HARIYAMA,\n    HOENN_DEX_GOLDEEN,\n    HOENN_DEX_SEAKING,\n    HOENN_DEX_MAGIKARP,\n    HOENN_DEX_GYARADOS,\n    HOENN_DEX_AZURILL,\n    HOENN_DEX_MARILL,\n    HOENN_DEX_AZUMARILL,\n    HOENN_DEX_GEODUDE,\n    HOENN_DEX_GRAVELER,\n    HOENN_DEX_GOLEM,\n    HOENN_DEX_NOSEPASS,\n    HOENN_DEX_SKITTY,\n    HOENN_DEX_DELCATTY,\n    HOENN_DEX_ZUBAT,\n    HOENN_DEX_GOLBAT,\n    HOENN_DEX_CROBAT,\n    HOENN_DEX_TENTACOOL,\n    HOENN_DEX_TENTACRUEL,\n    HOENN_DEX_SABLEYE,\n    HOENN_DEX_MAWILE,\n    HOENN_DEX_ARON,\n    HOENN_DEX_LAIRON,\n    HOENN_DEX_AGGRON,\n    HOENN_DEX_MACHOP,\n    HOENN_DEX_MACHOKE,\n    HOENN_DEX_MACHAMP,\n    HOENN_DEX_MEDITITE,\n    HOENN_DEX_MEDICHAM,\n    HOENN_DEX_ELECTRIKE,\n    HOENN_DEX_MANECTRIC,\n    HOENN_DEX_PLUSLE,\n    HOENN_DEX_MINUN,\n    HOENN_DEX_MAGNEMITE,\n    HOENN_DEX_MAGNETON,\n    HOENN_DEX_VOLTORB,\n    HOENN_DEX_ELECTRODE,\n    HOENN_DEX_VOLBEAT,\n    HOENN_DEX_ILLUMISE,\n    HOENN_DEX_ODDISH,\n    HOENN_DEX_GLOOM,\n    HOENN_DEX_VILEPLUME,\n    HOENN_DEX_BELLOSSOM,\n    HOENN_DEX_DODUO,\n    HOENN_DEX_DODRIO,\n    HOENN_DEX_ROSELIA,\n    HOENN_DEX_GULPIN,\n    HOENN_DEX_SWALOT,\n    HOENN_DEX_CARVANHA,\n    HOENN_DEX_SHARPEDO,\n    HOENN_DEX_WAILMER,\n    HOENN_DEX_WAILORD,\n    HOENN_DEX_NUMEL,\n    HOENN_DEX_CAMERUPT,\n    HOENN_DEX_SLUGMA,\n    HOENN_DEX_MAGCARGO,\n    HOENN_DEX_TORKOAL,\n    HOENN_DEX_GRIMER,\n    HOENN_DEX_MUK,\n    HOENN_DEX_KOFFING,\n    HOENN_DEX_WEEZING,\n    HOENN_DEX_SPOINK,\n    HOENN_DEX_GRUMPIG,\n    HOENN_DEX_SANDSHREW,\n    HOENN_DEX_SANDSLASH,\n    HOENN_DEX_SPINDA,\n    HOENN_DEX_SKARMORY,\n    HOENN_DEX_TRAPINCH,\n    HOENN_DEX_VIBRAVA,\n    HOENN_DEX_FLYGON,\n    HOENN_DEX_CACNEA,\n    HOENN_DEX_CACTURNE,\n    HOENN_DEX_SWABLU,\n    HOENN_DEX_ALTARIA,\n    HOENN_DEX_ZANGOOSE,\n    HOENN_DEX_SEVIPER,\n    HOENN_DEX_LUNATONE,\n    HOENN_DEX_SOLROCK,\n    HOENN_DEX_BARBOACH,\n    HOENN_DEX_WHISCASH,\n    HOENN_DEX_CORPHISH,\n    HOENN_DEX_CRAWDAUNT,\n    HOENN_DEX_BALTOY,\n    HOENN_DEX_CLAYDOL,\n    HOENN_DEX_LILEEP,\n    HOENN_DEX_CRADILY,\n    HOENN_DEX_ANORITH,\n    HOENN_DEX_ARMALDO,\n    HOENN_DEX_IGGLYBUFF,\n    HOENN_DEX_JIGGLYPUFF,\n    HOENN_DEX_WIGGLYTUFF,\n    HOENN_DEX_FEEBAS,\n    HOENN_DEX_MILOTIC,\n    HOENN_DEX_CASTFORM,\n    HOENN_DEX_STARYU,\n    HOENN_DEX_STARMIE,\n    HOENN_DEX_KECLEON,\n    HOENN_DEX_SHUPPET,\n    HOENN_DEX_BANETTE,\n    HOENN_DEX_DUSKULL,\n    HOENN_DEX_DUSCLOPS,\n    HOENN_DEX_TROPIUS,\n    HOENN_DEX_CHIMECHO,\n    HOENN_DEX_ABSOL,\n    HOENN_DEX_VULPIX,\n    HOENN_DEX_NINETALES,\n    HOENN_DEX_PICHU,\n    HOENN_DEX_PIKACHU,\n    HOENN_DEX_RAICHU,\n    HOENN_DEX_PSYDUCK,\n    HOENN_DEX_GOLDUCK,\n    HOENN_DEX_WYNAUT,\n    HOENN_DEX_WOBBUFFET,\n    HOENN_DEX_NATU,\n    HOENN_DEX_XATU,\n    HOENN_DEX_GIRAFARIG,\n    HOENN_DEX_PHANPY,\n    HOENN_DEX_DONPHAN,\n    HOENN_DEX_PINSIR,\n    HOENN_DEX_HERACROSS,\n    HOENN_DEX_RHYHORN,\n    HOENN_DEX_RHYDON,\n    HOENN_DEX_SNORUNT,\n    HOENN_DEX_GLALIE,\n    HOENN_DEX_SPHEAL,\n    HOENN_DEX_SEALEO,\n    HOENN_DEX_WALREIN,\n    HOENN_DEX_CLAMPERL,\n    HOENN_DEX_HUNTAIL,\n    HOENN_DEX_GOREBYSS,\n    HOENN_DEX_RELICANTH,\n    HOENN_DEX_CORSOLA,\n    HOENN_DEX_CHINCHOU,\n    HOENN_DEX_LANTURN,\n    HOENN_DEX_LUVDISC,\n    HOENN_DEX_HORSEA,\n    HOENN_DEX_SEADRA,\n    HOENN_DEX_KINGDRA,\n    HOENN_DEX_BAGON,\n    HOENN_DEX_SHELGON,\n    HOENN_DEX_SALAMENCE,\n    HOENN_DEX_BELDUM,\n    HOENN_DEX_METANG,\n    HOENN_DEX_METAGROSS,\n    HOENN_DEX_REGIROCK,\n    HOENN_DEX_REGICE,\n    HOENN_DEX_REGISTEEL,\n    HOENN_DEX_LATIAS,\n    HOENN_DEX_LATIOS,\n    HOENN_DEX_KYOGRE,\n    HOENN_DEX_GROUDON,\n    HOENN_DEX_RAYQUAZA,\n    HOENN_DEX_JIRACHI,\n    HOENN_DEX_DEOXYS,\n    // End of Hoenn Dex (see HOENN_DEX_COUNT)\n    // Here below have values but are excluded from the Pokedex\n    HOENN_DEX_BULBASAUR,\n    HOENN_DEX_IVYSAUR,\n    HOENN_DEX_VENUSAUR,\n    HOENN_DEX_CHARMANDER,\n    HOENN_DEX_CHARMELEON,\n    HOENN_DEX_CHARIZARD,\n    HOENN_DEX_SQUIRTLE,\n    HOENN_DEX_WARTORTLE,\n    HOENN_DEX_BLASTOISE,\n    HOENN_DEX_CATERPIE,\n    HOENN_DEX_METAPOD,\n    HOENN_DEX_BUTTERFREE,\n    HOENN_DEX_WEEDLE,\n    HOENN_DEX_KAKUNA,\n    HOENN_DEX_BEEDRILL,\n    HOENN_DEX_PIDGEY,\n    HOENN_DEX_PIDGEOTTO,\n    HOENN_DEX_PIDGEOT,\n    HOENN_DEX_RATTATA,\n    HOENN_DEX_RATICATE,\n    HOENN_DEX_SPEAROW,\n    HOENN_DEX_FEAROW,\n    HOENN_DEX_EKANS,\n    HOENN_DEX_ARBOK,\n    HOENN_DEX_NIDORAN_F,\n    HOENN_DEX_NIDORINA,\n    HOENN_DEX_NIDOQUEEN,\n    HOENN_DEX_NIDORAN_M,\n    HOENN_DEX_NIDORINO,\n    HOENN_DEX_NIDOKING,\n    HOENN_DEX_CLEFAIRY,\n    HOENN_DEX_CLEFABLE,\n    HOENN_DEX_PARAS,\n    HOENN_DEX_PARASECT,\n    HOENN_DEX_VENONAT,\n    HOENN_DEX_VENOMOTH,\n    HOENN_DEX_DIGLETT,\n    HOENN_DEX_DUGTRIO,\n    HOENN_DEX_MEOWTH,\n    HOENN_DEX_PERSIAN,\n    HOENN_DEX_MANKEY,\n    HOENN_DEX_PRIMEAPE,\n    HOENN_DEX_GROWLITHE,\n    HOENN_DEX_ARCANINE,\n    HOENN_DEX_POLIWAG,\n    HOENN_DEX_POLIWHIRL,\n    HOENN_DEX_POLIWRATH,\n    HOENN_DEX_BELLSPROUT,\n    HOENN_DEX_WEEPINBELL,\n    HOENN_DEX_VICTREEBEL,\n    HOENN_DEX_PONYTA,\n    HOENN_DEX_RAPIDASH,\n    HOENN_DEX_SLOWPOKE,\n    HOENN_DEX_SLOWBRO,\n    HOENN_DEX_FARFETCHD,\n    HOENN_DEX_SEEL,\n    HOENN_DEX_DEWGONG,\n    HOENN_DEX_SHELLDER,\n    HOENN_DEX_CLOYSTER,\n    HOENN_DEX_GASTLY,\n    HOENN_DEX_HAUNTER,\n    HOENN_DEX_GENGAR,\n    HOENN_DEX_ONIX,\n    HOENN_DEX_DROWZEE,\n    HOENN_DEX_HYPNO,\n    HOENN_DEX_KRABBY,\n    HOENN_DEX_KINGLER,\n    HOENN_DEX_EXEGGCUTE,\n    HOENN_DEX_EXEGGUTOR,\n    HOENN_DEX_CUBONE,\n    HOENN_DEX_MAROWAK,\n    HOENN_DEX_HITMONLEE,\n    HOENN_DEX_HITMONCHAN,\n    HOENN_DEX_LICKITUNG,\n    HOENN_DEX_CHANSEY,\n    HOENN_DEX_TANGELA,\n    HOENN_DEX_KANGASKHAN,\n    HOENN_DEX_MR_MIME,\n    HOENN_DEX_SCYTHER,\n    HOENN_DEX_JYNX,\n    HOENN_DEX_ELECTABUZZ,\n    HOENN_DEX_MAGMAR,\n    HOENN_DEX_TAUROS,\n    HOENN_DEX_LAPRAS,\n    HOENN_DEX_DITTO,\n    HOENN_DEX_EEVEE,\n    HOENN_DEX_VAPOREON,\n    HOENN_DEX_JOLTEON,\n    HOENN_DEX_FLAREON,\n    HOENN_DEX_PORYGON,\n    HOENN_DEX_OMANYTE,\n    HOENN_DEX_OMASTAR,\n    HOENN_DEX_KABUTO,\n    HOENN_DEX_KABUTOPS,\n    HOENN_DEX_AERODACTYL,\n    HOENN_DEX_SNORLAX,\n    HOENN_DEX_ARTICUNO,\n    HOENN_DEX_ZAPDOS,\n    HOENN_DEX_MOLTRES,\n    HOENN_DEX_DRATINI,\n    HOENN_DEX_DRAGONAIR,\n    HOENN_DEX_DRAGONITE,\n    HOENN_DEX_MEWTWO,\n    HOENN_DEX_MEW,\n    HOENN_DEX_CHIKORITA,\n    HOENN_DEX_BAYLEEF,\n    HOENN_DEX_MEGANIUM,\n    HOENN_DEX_CYNDAQUIL,\n    HOENN_DEX_QUILAVA,\n    HOENN_DEX_TYPHLOSION,\n    HOENN_DEX_TOTODILE,\n    HOENN_DEX_CROCONAW,\n    HOENN_DEX_FERALIGATR,\n    HOENN_DEX_SENTRET,\n    HOENN_DEX_FURRET,\n    HOENN_DEX_HOOTHOOT,\n    HOENN_DEX_NOCTOWL,\n    HOENN_DEX_LEDYBA,\n    HOENN_DEX_LEDIAN,\n    HOENN_DEX_SPINARAK,\n    HOENN_DEX_ARIADOS,\n    HOENN_DEX_CLEFFA,\n    HOENN_DEX_TOGEPI,\n    HOENN_DEX_TOGETIC,\n    HOENN_DEX_MAREEP,\n    HOENN_DEX_FLAAFFY,\n    HOENN_DEX_AMPHAROS,\n    HOENN_DEX_SUDOWOODO,\n    HOENN_DEX_POLITOED,\n    HOENN_DEX_HOPPIP,\n    HOENN_DEX_SKIPLOOM,\n    HOENN_DEX_JUMPLUFF,\n    HOENN_DEX_AIPOM,\n    HOENN_DEX_SUNKERN,\n    HOENN_DEX_SUNFLORA,\n    HOENN_DEX_YANMA,\n    HOENN_DEX_WOOPER,\n    HOENN_DEX_QUAGSIRE,\n    HOENN_DEX_ESPEON,\n    HOENN_DEX_UMBREON,\n    HOENN_DEX_MURKROW,\n    HOENN_DEX_SLOWKING,\n    HOENN_DEX_MISDREAVUS,\n    HOENN_DEX_UNOWN,\n    HOENN_DEX_PINECO,\n    HOENN_DEX_FORRETRESS,\n    HOENN_DEX_DUNSPARCE,\n    HOENN_DEX_GLIGAR,\n    HOENN_DEX_STEELIX,\n    HOENN_DEX_SNUBBULL,\n    HOENN_DEX_GRANBULL,\n    HOENN_DEX_QWILFISH,\n    HOENN_DEX_SCIZOR,\n    HOENN_DEX_SHUCKLE,\n    HOENN_DEX_SNEASEL,\n    HOENN_DEX_TEDDIURSA,\n    HOENN_DEX_URSARING,\n    HOENN_DEX_SWINUB,\n    HOENN_DEX_PILOSWINE,\n    HOENN_DEX_REMORAID,\n    HOENN_DEX_OCTILLERY,\n    HOENN_DEX_DELIBIRD,\n    HOENN_DEX_MANTINE,\n    HOENN_DEX_HOUNDOUR,\n    HOENN_DEX_HOUNDOOM,\n    HOENN_DEX_PORYGON2,\n    HOENN_DEX_STANTLER,\n    HOENN_DEX_SMEARGLE,\n    HOENN_DEX_TYROGUE,\n    HOENN_DEX_HITMONTOP,\n    HOENN_DEX_SMOOCHUM,\n    HOENN_DEX_ELEKID,\n    HOENN_DEX_MAGBY,\n    HOENN_DEX_MILTANK,\n    HOENN_DEX_BLISSEY,\n    HOENN_DEX_RAIKOU,\n    HOENN_DEX_ENTEI,\n    HOENN_DEX_SUICUNE,\n    HOENN_DEX_LARVITAR,\n    HOENN_DEX_PUPITAR,\n    HOENN_DEX_TYRANITAR,\n    HOENN_DEX_LUGIA,\n    HOENN_DEX_HO_OH,\n    HOENN_DEX_CELEBI,\n    HOENN_DEX_OLD_UNOWN_B,\n    HOENN_DEX_OLD_UNOWN_C,\n    HOENN_DEX_OLD_UNOWN_D,\n    HOENN_DEX_OLD_UNOWN_E,\n    HOENN_DEX_OLD_UNOWN_F,\n    HOENN_DEX_OLD_UNOWN_G,\n    HOENN_DEX_OLD_UNOWN_H,\n    HOENN_DEX_OLD_UNOWN_I,\n    HOENN_DEX_OLD_UNOWN_J,\n    HOENN_DEX_OLD_UNOWN_K,\n    HOENN_DEX_OLD_UNOWN_L,\n    HOENN_DEX_OLD_UNOWN_M,\n    HOENN_DEX_OLD_UNOWN_N,\n    HOENN_DEX_OLD_UNOWN_O,\n    HOENN_DEX_OLD_UNOWN_P,\n    HOENN_DEX_OLD_UNOWN_Q,\n    HOENN_DEX_OLD_UNOWN_R,\n    HOENN_DEX_OLD_UNOWN_S,\n    HOENN_DEX_OLD_UNOWN_T,\n    HOENN_DEX_OLD_UNOWN_U,\n    HOENN_DEX_OLD_UNOWN_V,\n    HOENN_DEX_OLD_UNOWN_W,\n    HOENN_DEX_OLD_UNOWN_X,\n    HOENN_DEX_OLD_UNOWN_Y,\n    HOENN_DEX_OLD_UNOWN_Z,\n};\n\n#define HOENN_DEX_COUNT HOENN_DEX_DEOXYS\n\n// Extended Pokedex order\nenum {\n    EXTENDED_DEX_NONE,\n\tEXTENDED_DEX_BULBASAUR,\n\tEXTENDED_DEX_IVYSAUR,\n\tEXTENDED_DEX_VENUSAUR,\n\tEXTENDED_DEX_CHARMANDER,\n\tEXTENDED_DEX_CHARMELEON,\n\tEXTENDED_DEX_CHARIZARD,\n\tEXTENDED_DEX_SQUIRTLE,\n\tEXTENDED_DEX_WARTORTLE,\n\tEXTENDED_DEX_BLASTOISE,\n\tEXTENDED_DEX_CATERPIE,\n\tEXTENDED_DEX_METAPOD,\n\tEXTENDED_DEX_BUTTERFREE,\n\tEXTENDED_DEX_WEEDLE,\n\tEXTENDED_DEX_KAKUNA,\n\tEXTENDED_DEX_BEEDRILL,\n\tEXTENDED_DEX_PIDGEY,\n\tEXTENDED_DEX_PIDGEOTTO,\n\tEXTENDED_DEX_PIDGEOT,\n\tEXTENDED_DEX_RATTATA,\n\tEXTENDED_DEX_RATICATE,\n\tEXTENDED_DEX_SPEAROW,\n\tEXTENDED_DEX_FEAROW,\n\tEXTENDED_DEX_EKANS,\n\tEXTENDED_DEX_ARBOK,\n\tEXTENDED_DEX_PICHU,\n\tEXTENDED_DEX_PIKACHU,\n\tEXTENDED_DEX_RAICHU,\n\tEXTENDED_DEX_SANDSHREW,\n\tEXTENDED_DEX_SANDSLASH,\n\tEXTENDED_DEX_NIDORAN_F,\n\tEXTENDED_DEX_NIDORINA,\n\tEXTENDED_DEX_NIDOQUEEN,\n\tEXTENDED_DEX_NIDORAN_M,\n\tEXTENDED_DEX_NIDORINO,\n\tEXTENDED_DEX_NIDOKING,\n\tEXTENDED_DEX_CLEFFA,\n\tEXTENDED_DEX_CLEFAIRY,\n\tEXTENDED_DEX_CLEFABLE,\n\tEXTENDED_DEX_VULPIX,\n\tEXTENDED_DEX_NINETALES,\n\tEXTENDED_DEX_IGGLYBUFF,\n\tEXTENDED_DEX_JIGGLYPUFF,\n\tEXTENDED_DEX_WIGGLYTUFF,\n\tEXTENDED_DEX_ZUBAT,\n\tEXTENDED_DEX_GOLBAT,\n\tEXTENDED_DEX_CROBAT,\n\tEXTENDED_DEX_ODDISH,\n\tEXTENDED_DEX_GLOOM,\n\tEXTENDED_DEX_VILEPLUME,\n\tEXTENDED_DEX_BELLOSSOM,\n\tEXTENDED_DEX_PARAS,\n\tEXTENDED_DEX_PARASECT,\n\tEXTENDED_DEX_VENONAT,\n\tEXTENDED_DEX_VENOMOTH,\n\tEXTENDED_DEX_DIGLETT,\n\tEXTENDED_DEX_DUGTRIO,\n\tEXTENDED_DEX_MEOWTH,\n\tEXTENDED_DEX_PERSIAN,\n\tEXTENDED_DEX_PSYDUCK,\n\tEXTENDED_DEX_GOLDUCK,\n\tEXTENDED_DEX_MANKEY,\n\tEXTENDED_DEX_PRIMEAPE,\n\tEXTENDED_DEX_GROWLITHE,\n\tEXTENDED_DEX_ARCANINE,\n\tEXTENDED_DEX_POLIWAG,\n\tEXTENDED_DEX_POLIWHIRL,\n\tEXTENDED_DEX_POLIWRATH,\n\tEXTENDED_DEX_POLITOED,\n\tEXTENDED_DEX_ABRA,\n\tEXTENDED_DEX_KADABRA,\n\tEXTENDED_DEX_ALAKAZAM,\n\tEXTENDED_DEX_MACHOP,\n\tEXTENDED_DEX_MACHOKE,\n\tEXTENDED_DEX_MACHAMP,\n\tEXTENDED_DEX_BELLSPROUT,\n\tEXTENDED_DEX_WEEPINBELL,\n\tEXTENDED_DEX_VICTREEBEL,\n\tEXTENDED_DEX_TENTACOOL,\n\tEXTENDED_DEX_TENTACRUEL,\n\tEXTENDED_DEX_GEODUDE,\n\tEXTENDED_DEX_GRAVELER,\n\tEXTENDED_DEX_GOLEM,\n\tEXTENDED_DEX_PONYTA,\n\tEXTENDED_DEX_RAPIDASH,\n\tEXTENDED_DEX_SLOWPOKE,\n\tEXTENDED_DEX_SLOWBRO,\n\tEXTENDED_DEX_SLOWKING,\n\tEXTENDED_DEX_MAGNEMITE,\n\tEXTENDED_DEX_MAGNETON,\n\tEXTENDED_DEX_FARFETCHD,\n\tEXTENDED_DEX_DODUO,\n\tEXTENDED_DEX_DODRIO,\n\tEXTENDED_DEX_SEEL,\n\tEXTENDED_DEX_DEWGONG,\n\tEXTENDED_DEX_GRIMER,\n\tEXTENDED_DEX_MUK,\n\tEXTENDED_DEX_SHELLDER,\n\tEXTENDED_DEX_CLOYSTER,\n\tEXTENDED_DEX_GASTLY,\n\tEXTENDED_DEX_HAUNTER,\n\tEXTENDED_DEX_GENGAR,\n\tEXTENDED_DEX_ONIX,\n\tEXTENDED_DEX_STEELIX,\n\tEXTENDED_DEX_DROWZEE,\n\tEXTENDED_DEX_HYPNO,\n\tEXTENDED_DEX_KRABBY,\n\tEXTENDED_DEX_KINGLER,\n\tEXTENDED_DEX_VOLTORB,\n\tEXTENDED_DEX_ELECTRODE,\n\tEXTENDED_DEX_EXEGGCUTE,\n\tEXTENDED_DEX_EXEGGUTOR,\n\tEXTENDED_DEX_CUBONE,\n\tEXTENDED_DEX_MAROWAK,\n\tEXTENDED_DEX_TYROGUE,\n\tEXTENDED_DEX_HITMONLEE,\n\tEXTENDED_DEX_HITMONCHAN,\n\tEXTENDED_DEX_HITMONTOP,\n\tEXTENDED_DEX_LICKITUNG,\n\tEXTENDED_DEX_KOFFING,\n\tEXTENDED_DEX_WEEZING,\n\tEXTENDED_DEX_RHYHORN,\n\tEXTENDED_DEX_RHYDON,\n\tEXTENDED_DEX_CHANSEY,\n\tEXTENDED_DEX_BLISSEY,\n\tEXTENDED_DEX_TANGELA,\n\tEXTENDED_DEX_KANGASKHAN,\n\tEXTENDED_DEX_HORSEA,\n\tEXTENDED_DEX_SEADRA,\n\tEXTENDED_DEX_KINGDRA,\n\tEXTENDED_DEX_GOLDEEN,\n\tEXTENDED_DEX_SEAKING,\n\tEXTENDED_DEX_STARYU,\n\tEXTENDED_DEX_STARMIE,\n\tEXTENDED_DEX_MR_MIME,\n\tEXTENDED_DEX_SCYTHER,\n\tEXTENDED_DEX_SCIZOR,\n\tEXTENDED_DEX_SMOOCHUM,\n\tEXTENDED_DEX_JYNX,\n\tEXTENDED_DEX_ELEKID,\n\tEXTENDED_DEX_ELECTABUZZ,\n\tEXTENDED_DEX_MAGBY,\n\tEXTENDED_DEX_MAGMAR,\n\tEXTENDED_DEX_PINSIR,\n\tEXTENDED_DEX_TAUROS,\n\tEXTENDED_DEX_MAGIKARP,\n\tEXTENDED_DEX_GYARADOS,\n\tEXTENDED_DEX_LAPRAS,\n\tEXTENDED_DEX_DITTO,\n\tEXTENDED_DEX_EEVEE,\n\tEXTENDED_DEX_VAPOREON,\n\tEXTENDED_DEX_JOLTEON,\n\tEXTENDED_DEX_FLAREON,\n\tEXTENDED_DEX_ESPEON,\n\tEXTENDED_DEX_UMBREON,\n\tEXTENDED_DEX_PORYGON,\n\tEXTENDED_DEX_PORYGON2,\n\tEXTENDED_DEX_OMANYTE,\n\tEXTENDED_DEX_OMASTAR,\n\tEXTENDED_DEX_KABUTO,\n\tEXTENDED_DEX_KABUTOPS,\n\tEXTENDED_DEX_AERODACTYL,\n\tEXTENDED_DEX_SNORLAX,\n\tEXTENDED_DEX_ARTICUNO,\n\tEXTENDED_DEX_ZAPDOS,\n\tEXTENDED_DEX_MOLTRES,\n\tEXTENDED_DEX_DRATINI,\n\tEXTENDED_DEX_DRAGONAIR,\n\tEXTENDED_DEX_DRAGONITE,\n\tEXTENDED_DEX_MEWTWO,\n\tEXTENDED_DEX_MEW,\n\tEXTENDED_DEX_SENTRET,\n\tEXTENDED_DEX_FURRET,\n\tEXTENDED_DEX_HOOTHOOT,\n\tEXTENDED_DEX_NOCTOWL,\n\tEXTENDED_DEX_LEDYBA,\n\tEXTENDED_DEX_LEDIAN,\n\tEXTENDED_DEX_SPINARAK,\n\tEXTENDED_DEX_ARIADOS,\n\tEXTENDED_DEX_CHINCHOU,\n\tEXTENDED_DEX_LANTURN,\n\tEXTENDED_DEX_TOGEPI,\n\tEXTENDED_DEX_TOGETIC,\n\tEXTENDED_DEX_NATU,\n\tEXTENDED_DEX_XATU,\n\tEXTENDED_DEX_MAREEP,\n\tEXTENDED_DEX_FLAAFFY,\n\tEXTENDED_DEX_AMPHAROS,\n\tEXTENDED_DEX_AZURILL,\n\tEXTENDED_DEX_MARILL,\n\tEXTENDED_DEX_AZUMARILL,\n\tEXTENDED_DEX_SUDOWOODO,\n\tEXTENDED_DEX_HOPPIP,\n\tEXTENDED_DEX_SKIPLOOM,\n\tEXTENDED_DEX_JUMPLUFF,\n\tEXTENDED_DEX_AIPOM,\n\tEXTENDED_DEX_SUNKERN,\n\tEXTENDED_DEX_SUNFLORA,\n\tEXTENDED_DEX_YANMA,\n\tEXTENDED_DEX_WOOPER,\n\tEXTENDED_DEX_QUAGSIRE,\n\tEXTENDED_DEX_MURKROW,\n\tEXTENDED_DEX_MISDREAVUS,\n\tEXTENDED_DEX_UNOWN,\n\tEXTENDED_DEX_WYNAUT,\n\tEXTENDED_DEX_WOBBUFFET,\n\tEXTENDED_DEX_GIRAFARIG,\n\tEXTENDED_DEX_PINECO,\n\tEXTENDED_DEX_FORRETRESS,\n\tEXTENDED_DEX_DUNSPARCE,\n\tEXTENDED_DEX_GLIGAR,\n\tEXTENDED_DEX_SNUBBULL,\n\tEXTENDED_DEX_GRANBULL,\n\tEXTENDED_DEX_QWILFISH,\n\tEXTENDED_DEX_SHUCKLE,\n\tEXTENDED_DEX_HERACROSS,\n\tEXTENDED_DEX_SNEASEL,\n\tEXTENDED_DEX_TEDDIURSA,\n\tEXTENDED_DEX_URSARING,\n\tEXTENDED_DEX_SLUGMA,\n\tEXTENDED_DEX_MAGCARGO,\n\tEXTENDED_DEX_SWINUB,\n\tEXTENDED_DEX_PILOSWINE,\n\tEXTENDED_DEX_CORSOLA,\n\tEXTENDED_DEX_REMORAID,\n\tEXTENDED_DEX_OCTILLERY,\n\tEXTENDED_DEX_DELIBIRD,\n\tEXTENDED_DEX_MANTINE,\n\tEXTENDED_DEX_SKARMORY,\n\tEXTENDED_DEX_HOUNDOUR,\n\tEXTENDED_DEX_HOUNDOOM,\n\tEXTENDED_DEX_PHANPY,\n\tEXTENDED_DEX_DONPHAN,\n\tEXTENDED_DEX_STANTLER,\n\tEXTENDED_DEX_SMEARGLE,\n\tEXTENDED_DEX_MILTANK,\n\tEXTENDED_DEX_RAIKOU,\n\tEXTENDED_DEX_ENTEI,\n\tEXTENDED_DEX_SUICUNE,\n\tEXTENDED_DEX_LARVITAR,\n\tEXTENDED_DEX_PUPITAR,\n\tEXTENDED_DEX_TYRANITAR,\n\tEXTENDED_DEX_LUGIA,\n\tEXTENDED_DEX_HO_OH,\n\tEXTENDED_DEX_LATIAS,\n\tEXTENDED_DEX_LATIOS,\n\tEXTENDED_DEX_DEOXYS,\n    // End of Extended Dex (see EXTENDED_DEX_COUNT)\n    // Here below have values but are excluded from the Pokedex\n\tEXTENDED_DEX_CHIKORITA,\n\tEXTENDED_DEX_BAYLEEF,\n\tEXTENDED_DEX_MEGANIUM,\n\tEXTENDED_DEX_CYNDAQUIL,\n\tEXTENDED_DEX_QUILAVA,\n\tEXTENDED_DEX_TYPHLOSION,\n\tEXTENDED_DEX_TOTODILE,\n\tEXTENDED_DEX_CROCONAW,\n\tEXTENDED_DEX_FERALIGATR,\n\tEXTENDED_DEX_CELEBI,\n\tEXTENDED_DEX_TREECKO,\n\tEXTENDED_DEX_GROVYLE,\n\tEXTENDED_DEX_SCEPTILE,\n\tEXTENDED_DEX_TORCHIC,\n\tEXTENDED_DEX_COMBUSKEN,\n\tEXTENDED_DEX_BLAZIKEN,\n\tEXTENDED_DEX_MUDKIP,\n\tEXTENDED_DEX_MARSHTOMP,\n\tEXTENDED_DEX_SWAMPERT,\n\tEXTENDED_DEX_POOCHYENA,\n\tEXTENDED_DEX_MIGHTYENA,\n\tEXTENDED_DEX_ZIGZAGOON,\n\tEXTENDED_DEX_LINOONE,\n\tEXTENDED_DEX_WURMPLE,\n\tEXTENDED_DEX_SILCOON,\n\tEXTENDED_DEX_BEAUTIFLY,\n\tEXTENDED_DEX_CASCOON,\n\tEXTENDED_DEX_DUSTOX,\n\tEXTENDED_DEX_LOTAD,\n\tEXTENDED_DEX_LOMBRE,\n\tEXTENDED_DEX_LUDICOLO,\n\tEXTENDED_DEX_SEEDOT,\n\tEXTENDED_DEX_NUZLEAF,\n\tEXTENDED_DEX_SHIFTRY,\n\tEXTENDED_DEX_TAILLOW,\n\tEXTENDED_DEX_SWELLOW,\n\tEXTENDED_DEX_WINGULL,\n\tEXTENDED_DEX_PELIPPER,\n\tEXTENDED_DEX_RALTS,\n\tEXTENDED_DEX_KIRLIA,\n\tEXTENDED_DEX_GARDEVOIR,\n\tEXTENDED_DEX_SURSKIT,\n\tEXTENDED_DEX_MASQUERAIN,\n\tEXTENDED_DEX_SHROOMISH,\n\tEXTENDED_DEX_BRELOOM,\n\tEXTENDED_DEX_SLAKOTH,\n\tEXTENDED_DEX_VIGOROTH,\n\tEXTENDED_DEX_SLAKING,\n\tEXTENDED_DEX_NINCADA,\n\tEXTENDED_DEX_NINJASK,\n\tEXTENDED_DEX_SHEDINJA,\n\tEXTENDED_DEX_WHISMUR,\n\tEXTENDED_DEX_LOUDRED,\n\tEXTENDED_DEX_EXPLOUD,\n\tEXTENDED_DEX_MAKUHITA,\n\tEXTENDED_DEX_HARIYAMA,\n\tEXTENDED_DEX_NOSEPASS,\n\tEXTENDED_DEX_SKITTY,\n\tEXTENDED_DEX_DELCATTY,\n\tEXTENDED_DEX_SABLEYE,\n\tEXTENDED_DEX_MAWILE,\n\tEXTENDED_DEX_ARON,\n\tEXTENDED_DEX_LAIRON,\n\tEXTENDED_DEX_AGGRON,\n\tEXTENDED_DEX_MEDITITE,\n\tEXTENDED_DEX_MEDICHAM,\n\tEXTENDED_DEX_ELECTRIKE,\n\tEXTENDED_DEX_MANECTRIC,\n\tEXTENDED_DEX_PLUSLE,\n\tEXTENDED_DEX_MINUN,\n\tEXTENDED_DEX_VOLBEAT,\n\tEXTENDED_DEX_ILLUMISE,\n\tEXTENDED_DEX_ROSELIA,\n\tEXTENDED_DEX_GULPIN,\n\tEXTENDED_DEX_SWALOT,\n\tEXTENDED_DEX_CARVANHA,\n\tEXTENDED_DEX_SHARPEDO,\n\tEXTENDED_DEX_WAILMER,\n\tEXTENDED_DEX_WAILORD,\n\tEXTENDED_DEX_NUMEL,\n\tEXTENDED_DEX_CAMERUPT,\n\tEXTENDED_DEX_TORKOAL,\n\tEXTENDED_DEX_SPOINK,\n\tEXTENDED_DEX_GRUMPIG,\n\tEXTENDED_DEX_SPINDA,\n\tEXTENDED_DEX_TRAPINCH,\n\tEXTENDED_DEX_VIBRAVA,\n\tEXTENDED_DEX_FLYGON,\n\tEXTENDED_DEX_CACNEA,\n\tEXTENDED_DEX_CACTURNE,\n\tEXTENDED_DEX_SWABLU,\n\tEXTENDED_DEX_ALTARIA,\n\tEXTENDED_DEX_ZANGOOSE,\n\tEXTENDED_DEX_SEVIPER,\n\tEXTENDED_DEX_LUNATONE,\n\tEXTENDED_DEX_SOLROCK,\n\tEXTENDED_DEX_BARBOACH,\n\tEXTENDED_DEX_WHISCASH,\n\tEXTENDED_DEX_CORPHISH,\n\tEXTENDED_DEX_CRAWDAUNT,\n\tEXTENDED_DEX_BALTOY,\n\tEXTENDED_DEX_CLAYDOL,\n\tEXTENDED_DEX_LILEEP,\n\tEXTENDED_DEX_CRADILY,\n\tEXTENDED_DEX_ANORITH,\n\tEXTENDED_DEX_ARMALDO,\n\tEXTENDED_DEX_FEEBAS,\n\tEXTENDED_DEX_MILOTIC,\n\tEXTENDED_DEX_CASTFORM,\n\tEXTENDED_DEX_KECLEON,\n\tEXTENDED_DEX_SHUPPET,\n\tEXTENDED_DEX_BANETTE,\n\tEXTENDED_DEX_DUSKULL,\n\tEXTENDED_DEX_DUSCLOPS,\n\tEXTENDED_DEX_TROPIUS,\n\tEXTENDED_DEX_CHIMECHO,\n\tEXTENDED_DEX_ABSOL,\n\tEXTENDED_DEX_SNORUNT,\n\tEXTENDED_DEX_GLALIE,\n\tEXTENDED_DEX_SPHEAL,\n\tEXTENDED_DEX_SEALEO,\n\tEXTENDED_DEX_WALREIN,\n\tEXTENDED_DEX_CLAMPERL,\n\tEXTENDED_DEX_HUNTAIL,\n\tEXTENDED_DEX_GOREBYSS,\n\tEXTENDED_DEX_RELICANTH,\n\tEXTENDED_DEX_LUVDISC,\n\tEXTENDED_DEX_BAGON,\n\tEXTENDED_DEX_SHELGON,\n\tEXTENDED_DEX_SALAMENCE,\n\tEXTENDED_DEX_BELDUM,\n\tEXTENDED_DEX_METANG,\n\tEXTENDED_DEX_METAGROSS,\n\tEXTENDED_DEX_REGIROCK,\n\tEXTENDED_DEX_REGICE,\n\tEXTENDED_DEX_REGISTEEL,\n\tEXTENDED_DEX_KYOGRE,\n\tEXTENDED_DEX_GROUDON,\n\tEXTENDED_DEX_RAYQUAZA,\n\tEXTENDED_DEX_JIRACHI,\n    EXTENDED_DEX_OLD_UNOWN_B,\n    EXTENDED_DEX_OLD_UNOWN_C,\n    EXTENDED_DEX_OLD_UNOWN_D,\n    EXTENDED_DEX_OLD_UNOWN_E,\n    EXTENDED_DEX_OLD_UNOWN_F,\n    EXTENDED_DEX_OLD_UNOWN_G,\n    EXTENDED_DEX_OLD_UNOWN_H,\n    EXTENDED_DEX_OLD_UNOWN_I,\n    EXTENDED_DEX_OLD_UNOWN_J,\n    EXTENDED_DEX_OLD_UNOWN_K,\n    EXTENDED_DEX_OLD_UNOWN_L,\n    EXTENDED_DEX_OLD_UNOWN_M,\n    EXTENDED_DEX_OLD_UNOWN_N,\n    EXTENDED_DEX_OLD_UNOWN_O,\n    EXTENDED_DEX_OLD_UNOWN_P,\n    EXTENDED_DEX_OLD_UNOWN_Q,\n    EXTENDED_DEX_OLD_UNOWN_R,\n    EXTENDED_DEX_OLD_UNOWN_S,\n    EXTENDED_DEX_OLD_UNOWN_T,\n    EXTENDED_DEX_OLD_UNOWN_U,\n    EXTENDED_DEX_OLD_UNOWN_V,\n    EXTENDED_DEX_OLD_UNOWN_W,\n    EXTENDED_DEX_OLD_UNOWN_X,\n    EXTENDED_DEX_OLD_UNOWN_Y,\n    EXTENDED_DEX_OLD_UNOWN_Z,\n};\n\n#define EXTENDED_DEX_COUNT EXTENDED_DEX_DEOXYS\n\n#endif // GUARD_CONSTANTS_POKEDEX_H\n"
  },
  {
    "path": "include/constants/pokemon.h",
    "content": "#ifndef GUARD_CONSTANTS_POKEMON_H\n#define GUARD_CONSTANTS_POKEMON_H\n\n// For (Set|Get)(Box)?MonData\n#define MON_DATA_PERSONALITY               0\n#define MON_DATA_OT_ID                     1\n#define MON_DATA_NICKNAME                  2\n#define MON_DATA_LANGUAGE                  3\n#define MON_DATA_SANITY_IS_BAD_EGG         4\n#define MON_DATA_SANITY_HAS_SPECIES        5\n#define MON_DATA_SANITY_IS_EGG             6\n#define MON_DATA_OT_NAME                   7\n#define MON_DATA_MARKINGS                  8\n#define MON_DATA_CHECKSUM                  9\n#define MON_DATA_ENCRYPT_SEPARATOR        10\n#define MON_DATA_SPECIES                  11\n#define MON_DATA_HELD_ITEM                12\n#define MON_DATA_MOVE1                    13\n#define MON_DATA_MOVE2                    14\n#define MON_DATA_MOVE3                    15\n#define MON_DATA_MOVE4                    16\n#define MON_DATA_PP1                      17\n#define MON_DATA_PP2                      18\n#define MON_DATA_PP3                      19\n#define MON_DATA_PP4                      20\n#define MON_DATA_PP_BONUSES               21\n#define MON_DATA_COOL                     22\n#define MON_DATA_BEAUTY                   23\n#define MON_DATA_CUTE                     24\n#define MON_DATA_EXP                      25\n#define MON_DATA_HP_EV                    26\n#define MON_DATA_ATK_EV                   27\n#define MON_DATA_DEF_EV                   28\n#define MON_DATA_SPEED_EV                 29\n#define MON_DATA_SPATK_EV                 30\n#define MON_DATA_SPDEF_EV                 31\n#define MON_DATA_FRIENDSHIP               32\n#define MON_DATA_SMART                    33\n#define MON_DATA_POKERUS                  34\n#define MON_DATA_MET_LOCATION             35\n#define MON_DATA_MET_LEVEL                36\n#define MON_DATA_MET_GAME                 37\n#define MON_DATA_POKEBALL                 38\n#define MON_DATA_HP_IV                    39\n#define MON_DATA_ATK_IV                   40\n#define MON_DATA_DEF_IV                   41\n#define MON_DATA_SPEED_IV                 42\n#define MON_DATA_SPATK_IV                 43\n#define MON_DATA_SPDEF_IV                 44\n#define MON_DATA_IS_EGG                   45\n#define MON_DATA_ABILITY_NUM              46\n#define MON_DATA_TOUGH                    47\n#define MON_DATA_SHEEN                    48\n#define MON_DATA_OT_GENDER                49\n#define MON_DATA_COOL_RIBBON              50\n#define MON_DATA_BEAUTY_RIBBON            51\n#define MON_DATA_CUTE_RIBBON              52\n#define MON_DATA_SMART_RIBBON             53\n#define MON_DATA_TOUGH_RIBBON             54\n#define MON_DATA_STATUS                   55\n#define MON_DATA_LEVEL                    56\n#define MON_DATA_HP                       57\n#define MON_DATA_MAX_HP                   58\n#define MON_DATA_ATK                      59\n#define MON_DATA_DEF                      60\n#define MON_DATA_SPEED                    61\n#define MON_DATA_SPATK                    62\n#define MON_DATA_SPDEF                    63\n#define MON_DATA_MAIL                     64\n#define MON_DATA_SPECIES_OR_EGG           65\n#define MON_DATA_IVS                      66\n#define MON_DATA_CHAMPION_RIBBON          67\n#define MON_DATA_WINNING_RIBBON           68\n#define MON_DATA_VICTORY_RIBBON           69\n#define MON_DATA_ARTIST_RIBBON            70\n#define MON_DATA_EFFORT_RIBBON            71\n#define MON_DATA_MARINE_RIBBON            72\n#define MON_DATA_LAND_RIBBON              73\n#define MON_DATA_SKY_RIBBON               74\n#define MON_DATA_COUNTRY_RIBBON           75\n#define MON_DATA_NATIONAL_RIBBON          76\n#define MON_DATA_EARTH_RIBBON             77\n#define MON_DATA_WORLD_RIBBON             78\n#define MON_DATA_UNUSED_RIBBONS           79\n#define MON_DATA_MODERN_FATEFUL_ENCOUNTER 80\n#define MON_DATA_KNOWN_MOVES              81\n#define MON_DATA_RIBBON_COUNT             82\n#define MON_DATA_RIBBONS                  83\n#define MON_DATA_ATK2                     84\n#define MON_DATA_DEF2                     85\n#define MON_DATA_SPEED2                   86\n#define MON_DATA_SPATK2                   87\n#define MON_DATA_SPDEF2                   88\n#define MON_DATA_FORME                    89\n#define MON_DATA_BOX_HP                   90\n#define MON_DATA_BOX_STATUS               91\n\n// Pokemon types\n#define TYPE_NONE           255\n#define TYPE_NORMAL         0\n#define TYPE_FIGHTING       1\n#define TYPE_FLYING         2\n#define TYPE_POISON         3\n#define TYPE_GROUND         4\n#define TYPE_ROCK           5\n#define TYPE_BUG            6\n#define TYPE_GHOST          7\n#define TYPE_STEEL          8\n#define TYPE_MYSTERY        9\n#define TYPE_FIRE           10\n#define TYPE_WATER          11\n#define TYPE_GRASS          12\n#define TYPE_ELECTRIC       13\n#define TYPE_PSYCHIC        14\n#define TYPE_ICE            15\n#define TYPE_DRAGON         16\n#define TYPE_DARK           17\n#define NUMBER_OF_MON_TYPES 18\n\n// Pokemon egg groups\n#define EGG_GROUP_NONE         0\n#define EGG_GROUP_MONSTER      1\n#define EGG_GROUP_WATER_1      2\n#define EGG_GROUP_BUG          3\n#define EGG_GROUP_FLYING       4\n#define EGG_GROUP_FIELD        5\n#define EGG_GROUP_FAIRY        6\n#define EGG_GROUP_GRASS        7\n#define EGG_GROUP_HUMAN_LIKE   8\n#define EGG_GROUP_WATER_3      9\n#define EGG_GROUP_MINERAL      10\n#define EGG_GROUP_AMORPHOUS    11\n#define EGG_GROUP_WATER_2      12\n#define EGG_GROUP_DITTO        13\n#define EGG_GROUP_DRAGON       14\n#define EGG_GROUP_UNDISCOVERED 15\n\n#define EGG_GROUPS_PER_MON      2\n\n// Pokemon natures\n#define NATURE_HARDY    0\n#define NATURE_LONELY   1\n#define NATURE_BRAVE    2\n#define NATURE_ADAMANT  3\n#define NATURE_NAUGHTY  4\n#define NATURE_BOLD     5\n#define NATURE_DOCILE   6\n#define NATURE_RELAXED  7\n#define NATURE_IMPISH   8\n#define NATURE_LAX      9\n#define NATURE_TIMID    10\n#define NATURE_HASTY    11\n#define NATURE_SERIOUS  12\n#define NATURE_JOLLY    13\n#define NATURE_NAIVE    14\n#define NATURE_MODEST   15\n#define NATURE_MILD     16\n#define NATURE_QUIET    17\n#define NATURE_BASHFUL  18\n#define NATURE_RASH     19\n#define NATURE_CALM     20\n#define NATURE_GENTLE   21\n#define NATURE_SASSY    22\n#define NATURE_CAREFUL  23\n#define NATURE_QUIRKY   24\n#define NUM_NATURES     25\n\n// Pokemon Stats\n#define STAT_HP      0\n#define STAT_ATK     1\n#define STAT_DEF     2\n#define STAT_SPEED   3\n#define STAT_SPATK   4\n#define STAT_SPDEF   5\n#define NUM_STATS    6\n\n#define STAT_ACC     6 // Only in battles.\n#define STAT_EVASION 7 // Only in battles.\n\n#define NUM_NATURE_STATS (NUM_STATS - 1) // excludes HP\n#define NUM_BATTLE_STATS (NUM_STATS + 2) // includes Accuracy and Evasion\n\n#define MIN_STAT_STAGE     0\n#define DEFAULT_STAT_STAGE 6\n#define MAX_STAT_STAGE    12\n\n// Shiny odds\n#define SHINY_ODDS 8 // Actual probability is SHINY_ODDS/65536\n\n#define MAX_LEVEL 100\n\n#define OT_ID_PLAYER_ID       0\n#define OT_ID_PRESET          1\n#define OT_ID_RANDOM_NO_SHINY 2\n\n#define MON_GIVEN_TO_PARTY 0\n#define MON_GIVEN_TO_PC    1\n#define MON_CANT_GIVE      2\n\n#define PLAYER_HAS_TWO_USABLE_MONS 0\n#define PLAYER_HAS_ONE_MON         1\n#define PLAYER_HAS_ONE_USABLE_MON  2\n\n// Learning moves\n#define MON_ALREADY_KNOWS_MOVE 0xFFFE\n#define MON_HAS_MAX_MOVES      0xFFFF\n\n#define LEVEL_UP_MOVE_ID   0x01FF\n#define LEVEL_UP_MOVE_LV   0xFE00\n#define LEVEL_UP_END       0xFFFF\n\n#define MAX_LEVEL_UP_MOVES       20\n\n#define LEVEL_UP_MOVE_ID   0x01FF\n#define LEVEL_UP_MOVE_LV   0xFE00\n#define LEVEL_UP_END       0xFFFF\n\n#define MON_MALE       0x00\n#define MON_FEMALE     0xFE\n#define MON_GENDERLESS 0xFF\n\n#define FRIENDSHIP_EVENT_GROW_LEVEL           0\n#define FRIENDSHIP_EVENT_VITAMIN              1\n#define FRIENDSHIP_EVENT_BATTLE_ITEM          2\n#define FRIENDSHIP_EVENT_LEAGUE_BATTLE        3\n#define FRIENDSHIP_EVENT_LEARN_TMHM           4\n#define FRIENDSHIP_EVENT_WALKING              5\n#define FRIENDSHIP_EVENT_MASSAGE              6\n#define FRIENDSHIP_EVENT_FAINT_SMALL          7\n#define FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE 8\n#define FRIENDSHIP_EVENT_FAINT_LARGE          9\n\n#define MAX_FRIENDSHIP  255\n#define MAX_SHEEN       255\n#define MAX_CONDITION   255\n\n#define MAX_PER_STAT_IVS 31\n#define MAX_IV_MASK 31\n#define USE_RANDOM_IVS (MAX_PER_STAT_IVS + 1)\n#define MAX_PER_STAT_EVS 255\n#define MAX_TOTAL_EVS 510\n#define EV_ITEM_RAISE_LIMIT 100\n\n// Battle move flags\n#define FLAG_MAKES_CONTACT          (1 << 0)\n#define FLAG_PROTECT_AFFECTED       (1 << 1)\n#define FLAG_MAGIC_COAT_AFFECTED    (1 << 2)\n#define FLAG_SNATCH_AFFECTED        (1 << 3)\n#define FLAG_MIRROR_MOVE_AFFECTED   (1 << 4)\n#define FLAG_KINGS_ROCK_AFFECTED    (1 << 5)\n\n// Growth rates\n#define GROWTH_MEDIUM_FAST  0\n#define GROWTH_ERRATIC      1\n#define GROWTH_FLUCTUATING  2\n#define GROWTH_MEDIUM_SLOW  3\n#define GROWTH_FAST         4\n#define GROWTH_SLOW         5\n\n// Body colors for pokedex search\n#define BODY_COLOR_RED      0\n#define BODY_COLOR_BLUE     1\n#define BODY_COLOR_YELLOW   2\n#define BODY_COLOR_GREEN    3\n#define BODY_COLOR_BLACK    4\n#define BODY_COLOR_BROWN    5\n#define BODY_COLOR_PURPLE   6\n#define BODY_COLOR_GRAY     7\n#define BODY_COLOR_WHITE    8\n#define BODY_COLOR_PINK     9\n\n// Evolution types\n#define EVO_FRIENDSHIP       1  // Pokémon levels up with friendship ≥ 220\n#define EVO_FRIENDSHIP_DAY   2  // Pokémon levels up during the day with friendship ≥ 220\n#define EVO_FRIENDSHIP_NIGHT 3  // Pokémon levels up at night with friendship ≥ 220\n#define EVO_LEVEL            4  // Pokémon reaches the specified level\n#define EVO_TRADE            5  // Pokémon is traded\n#define EVO_TRADE_ITEM       6  // Pokémon is traded while it's holding the specified item\n#define EVO_ITEM             7  // specified item is used on Pokémon\n#define EVO_LEVEL_ATK_GT_DEF 8  // Pokémon reaches the specified level with attack > defense\n#define EVO_LEVEL_ATK_EQ_DEF 9  // Pokémon reaches the specified level with attack = defense\n#define EVO_LEVEL_ATK_LT_DEF 10 // Pokémon reaches the specified level with attack < defense\n#define EVO_LEVEL_SILCOON    11 // Pokémon reaches the specified level with a Silcoon personality value\n#define EVO_LEVEL_CASCOON    12 // Pokémon reaches the specified level with a Cascoon personality value\n#define EVO_LEVEL_NINJASK    13 // Pokémon reaches the specified level (special value for Ninjask)\n#define EVO_LEVEL_SHEDINJA   14 // Pokémon reaches the specified level (special value for Shedinja)\n#define EVO_BEAUTY           15 // Pokémon levels up with beauty ≥ specified value\n#define EVO_STONE_HELD       16 // specified item is used on Pokémon and it's holding the specified item\n\n#define EVOS_PER_MON 5\n#define EVOS_PER_LINE 6\n\n#define EVO_MODE_NORMAL     0\n#define EVO_MODE_TRADE      1\n#define EVO_MODE_ITEM_USE   2\n#define EVO_MODE_ITEM_CHECK 3 // If an Everstone is being held, still want to show that the stone *could* be used on that Pokémon to evolve\n\n#define MON_PIC_WIDTH 64\n#define MON_PIC_HEIGHT 64\n#define MON_PIC_SIZE (MON_PIC_WIDTH * MON_PIC_HEIGHT / 2)\n\n// Most pokemon have 1 frame. There are 2 exceptions:\n// - Castform has 4 frames, 1 for each form\n// - Deoxys has 2 frames, 1 for each form\n#define MAX_MON_PIC_FRAMES 4\n\n// used by ShouldIgnoreDeoxysForm\n#define DEOXYS_CHECK_BATTLE_SPRITE      1\n#define DEOXYS_CHECK_TRADE_MAIN         3\n#define DEOXYS_CHECK_BATTLE_ANIM        5\n\n#endif // GUARD_CONSTANTS_POKEMON_H\n"
  },
  {
    "path": "include/constants/quest_log.h",
    "content": "#ifndef GUARD_CONSTANTS_QUEST_LOG_H\n#define GUARD_CONSTANTS_QUEST_LOG_H\n\n#define QL_STATE_RECORDING     1\n#define QL_STATE_PLAYBACK      2\n#define QL_STATE_PLAYBACK_LAST 3\n\n#define QL_PLAYBACK_STATE_STOPPED            0\n#define QL_PLAYBACK_STATE_RUNNING            1\n#define QL_PLAYBACK_STATE_RECORDING          2\n#define QL_PLAYBACK_STATE_ACTION_END         3\n#define QL_PLAYBACK_STATE_RECORDING_NO_DELAY 4\n\n#define QL_START_NORMAL 1\n#define QL_START_WARP   2\n\n// gGlobalFieldTintMode\n#define QL_TINT_NONE              0\n#define QL_TINT_GRAYSCALE         1\n#define QL_TINT_SEPIA             2\n#define QL_TINT_BACKUP_GRAYSCALE  3\n\n#define QL_IS_PLAYBACK_STATE (gQuestLogState == QL_STATE_PLAYBACK || gQuestLogState == QL_STATE_PLAYBACK_LAST)\n\n#define QL_EVENT_INPUT                          0 // Null\n#define QL_EVENT_GFX_CHANGE                     1 // Null\n#define QL_EVENT_MOVEMENT                       2 // Null\n#define QL_EVENT_SWITCHED_PARTY_ORDER           3\n#define QL_EVENT_USED_ITEM                      4\n#define QL_EVENT_GAVE_HELD_ITEM                 5\n#define QL_EVENT_GAVE_HELD_ITEM_BAG             6\n#define QL_EVENT_GAVE_HELD_ITEM_PC              7\n#define QL_EVENT_TOOK_HELD_ITEM                 8\n#define QL_EVENT_SWAPPED_HELD_ITEM              9\n#define QL_EVENT_SWAPPED_HELD_ITEM_PC           10\n#define QL_EVENT_USED_PKMN_CENTER               11\n#define QL_EVENT_LINK_TRADED                    12\n#define QL_EVENT_LINK_BATTLED_SINGLE            13\n#define QL_EVENT_LINK_BATTLED_DOUBLE            14\n#define QL_EVENT_LINK_BATTLED_MULTI             15\n#define QL_EVENT_USED_UNION_ROOM                16\n#define QL_EVENT_USED_UNION_ROOM_CHAT           17\n#define QL_EVENT_LINK_TRADED_UNION              18\n#define QL_EVENT_LINK_BATTLED_UNION             19\n#define QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES    20\n#define QL_EVENT_SWITCHED_MONS_WITHIN_BOX       21\n#define QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON  22\n#define QL_EVENT_MOVED_MON_BETWEEN_BOXES        23\n#define QL_EVENT_MOVED_MON_WITHIN_BOX           24\n#define QL_EVENT_WITHDREW_MON_PC                25\n#define QL_EVENT_DEPOSITED_MON_PC               26\n#define QL_EVENT_SWITCHED_MULTIPLE_MONS         27\n#define QL_EVENT_DEPOSITED_ITEM_PC              28\n#define QL_EVENT_WITHDREW_ITEM_PC               29\n#define QL_EVENT_DEFEATED_GYM_LEADER            30\n#define QL_EVENT_DEFEATED_WILD_MON              31\n#define QL_EVENT_DEFEATED_E4_MEMBER             32\n#define QL_EVENT_DEFEATED_CHAMPION              33\n#define QL_EVENT_DEFEATED_TRAINER               34\n#define QL_EVENT_DEPARTED                       35\n#define QL_EVENT_USED_FIELD_MOVE                36\n#define QL_EVENT_BOUGHT_ITEM                    37\n#define QL_EVENT_SOLD_ITEM                      38\n#define QL_EVENT_SCENE_END                      39 // Null\n#define QL_EVENT_OBTAINED_STORY_ITEM            40\n#define QL_EVENT_WAIT                           41 // Null\n#define QL_EVENT_ARRIVED                        42\n\n#define QL_EVENT_USED_POKEMART (QL_EVENT_BOUGHT_ITEM - 1) // Used as a start pos for QL_EVENT_BOUGHT_ITEM / QL_EVENT_SOLD_ITEM\n\n#define IS_LINK_QL_EVENT(event)((event) >= QL_EVENT_LINK_TRADED && (event) <= QL_EVENT_LINK_BATTLED_UNION)\n#define IS_VALID_QL_EVENT(event)((event) >= QL_EVENT_SWITCHED_PARTY_ORDER && (event) <= QL_EVENT_ARRIVED)\n\n#define QL_LOCATION_HOME                0\n#define QL_LOCATION_OAKS_LAB            1\n#define QL_LOCATION_VIRIDIAN_GYM        2\n#define QL_LOCATION_LEAGUE_GATE_1       3\n#define QL_LOCATION_LEAGUE_GATE_2       4\n#define QL_LOCATION_VIRIDIAN_FOREST_1   5\n#define QL_LOCATION_VIRIDIAN_FOREST_2   6\n#define QL_LOCATION_PEWTER_MUSEUM       7\n#define QL_LOCATION_PEWTER_GYM          8\n#define QL_LOCATION_MT_MOON_1           9\n#define QL_LOCATION_MT_MOON_2           10\n#define QL_LOCATION_CERULEAN_GYM        11\n#define QL_LOCATION_BIKE_SHOP           12\n#define QL_LOCATION_BILLS_HOUSE         13\n#define QL_LOCATION_DAY_CARE            14\n#define QL_LOCATION_UNDERGROUND_PATH_1  15\n#define QL_LOCATION_UNDERGROUND_PATH_2  16\n#define QL_LOCATION_PKMN_FAN_CLUB       17\n#define QL_LOCATION_VERMILION_GYM       18\n#define QL_LOCATION_SS_ANNE             19\n#define QL_LOCATION_DIGLETTS_CAVE_1     20\n#define QL_LOCATION_DIGLETTS_CAVE_2     21\n#define QL_LOCATION_ROCK_TUNNEL_1       22\n#define QL_LOCATION_ROCK_TUNNEL_2       23\n#define QL_LOCATION_POWER_PLANT         24\n#define QL_LOCATION_PKMN_TOWER          25\n#define QL_LOCATION_VOLUNTEER_HOUSE     26\n#define QL_LOCATION_NAME_RATERS_HOUSE   27\n#define QL_LOCATION_UNDERGROUND_PATH_3  28\n#define QL_LOCATION_UNDERGROUND_PATH_4  29\n#define QL_LOCATION_CELADON_DEPT_STORE  30\n#define QL_LOCATION_CELADON_MANSION     31\n#define QL_LOCATION_GAME_CORNER         32\n#define QL_LOCATION_CELADON_GYM         33\n#define QL_LOCATION_CELADON_RESTAURANT  34\n#define QL_LOCATION_ROCKET_HIDEOUT      35\n#define QL_LOCATION_SAFARI_ZONE         36\n#define QL_LOCATION_FUCHSIA_GYM         37\n#define QL_LOCATION_WARDENS_HOME        38\n#define QL_LOCATION_FIGHTING_DOJO       39\n#define QL_LOCATION_SAFFRON_GYM         40\n#define QL_LOCATION_SILPH_CO            41\n#define QL_LOCATION_SEAFOAM_ISLANDS_1   42\n#define QL_LOCATION_SEAFOAM_ISLANDS_2   43\n#define QL_LOCATION_PKMN_MANSION        44\n#define QL_LOCATION_CINNABAR_GYM        45\n#define QL_LOCATION_CINNABAR_LAB        46\n#define QL_LOCATION_VICTORY_ROAD_1      47\n#define QL_LOCATION_VICTORY_ROAD_2      48\n#define QL_LOCATION_PKMN_LEAGUE         49\n#define QL_LOCATION_CERULEAN_CAVE       50\n\n#define QL_DEPARTED_TOWN_BUILDING    0\n#define QL_DEPARTED_MUSEUM           1\n#define QL_DEPARTED_GAME_CORNER      2\n#define QL_DEPARTED_HOME             3\n#define QL_DEPARTED_OAKS_LAB         4\n#define QL_DEPARTED_GYM              5\n#define QL_DEPARTED_SAFARI_ZONE      6\n#define QL_DEPARTED_CAVE             7\n#define QL_DEPARTED_MISC_BUILDING_1  8\n#define QL_DEPARTED_MISC_BUILDING_2  9\n\n#define QL_INPUT_OFF    0\n#define QL_INPUT_UP     1\n#define QL_INPUT_DOWN   2\n#define QL_INPUT_LEFT   3\n#define QL_INPUT_RIGHT  4\n#define QL_INPUT_L      5\n#define QL_INPUT_R      6\n#define QL_INPUT_START  7\n#define QL_INPUT_SELECT 8\n#define QL_INPUT_A      9\n#define QL_INPUT_B      10\n\n#define QL_ACTION_MOVEMENT     0\n#define QL_ACTION_GFX_CHANGE   1\n#define QL_ACTION_INPUT        2\n#define QL_ACTION_EMPTY        3\n#define QL_ACTION_WAIT       254\n#define QL_ACTION_SCENE_END  255\n\n#endif //GUARD_CONSTANTS_QUEST_LOG_H\n"
  },
  {
    "path": "include/constants/region_map_sections.h",
    "content": "#ifndef GUARD_CONSTANTS_REGION_MAP_SECTIONS_H\n#define GUARD_CONSTANTS_REGION_MAP_SECTIONS_H\n\n#define MAPSEC_LITTLEROOT_TOWN              0x00\n#define MAPSEC_OLDALE_TOWN                  0x01\n#define MAPSEC_DEWFORD_TOWN                 0x02\n#define MAPSEC_LAVARIDGE_TOWN               0x03\n#define MAPSEC_FALLARBOR_TOWN               0x04\n#define MAPSEC_VERDANTURF_TOWN              0x05\n#define MAPSEC_PACIFIDLOG_TOWN              0x06\n#define MAPSEC_PETALBURG_CITY               0x07\n#define MAPSEC_SLATEPORT_CITY               0x08\n#define MAPSEC_MAUVILLE_CITY                0x09\n#define MAPSEC_RUSTBORO_CITY                0x0A\n#define MAPSEC_FORTREE_CITY                 0x0B\n#define MAPSEC_LILYCOVE_CITY                0x0C\n#define MAPSEC_MOSSDEEP_CITY                0x0D\n#define MAPSEC_SOOTOPOLIS_CITY              0x0E\n#define MAPSEC_EVER_GRANDE_CITY             0x0F\n#define MAPSEC_ROUTE_101                    0x10\n#define MAPSEC_ROUTE_102                    0x11\n#define MAPSEC_ROUTE_103                    0x12\n#define MAPSEC_ROUTE_104                    0x13\n#define MAPSEC_ROUTE_105                    0x14\n#define MAPSEC_ROUTE_106                    0x15\n#define MAPSEC_ROUTE_107                    0x16\n#define MAPSEC_ROUTE_108                    0x17\n#define MAPSEC_ROUTE_109                    0x18\n#define MAPSEC_ROUTE_110                    0x19\n#define MAPSEC_ROUTE_111                    0x1A\n#define MAPSEC_ROUTE_112                    0x1B\n#define MAPSEC_ROUTE_113                    0x1C\n#define MAPSEC_ROUTE_114                    0x1D\n#define MAPSEC_ROUTE_115                    0x1E\n#define MAPSEC_ROUTE_116                    0x1F\n#define MAPSEC_ROUTE_117                    0x20\n#define MAPSEC_ROUTE_118                    0x21\n#define MAPSEC_ROUTE_119                    0x22\n#define MAPSEC_ROUTE_120                    0x23\n#define MAPSEC_ROUTE_121                    0x24\n#define MAPSEC_ROUTE_122                    0x25\n#define MAPSEC_ROUTE_123                    0x26\n#define MAPSEC_ROUTE_124                    0x27\n#define MAPSEC_ROUTE_125                    0x28\n#define MAPSEC_ROUTE_126                    0x29\n#define MAPSEC_ROUTE_127                    0x2A\n#define MAPSEC_ROUTE_128                    0x2B\n#define MAPSEC_ROUTE_129                    0x2C\n#define MAPSEC_ROUTE_130                    0x2D\n#define MAPSEC_ROUTE_131                    0x2E\n#define MAPSEC_ROUTE_132                    0x2F\n#define MAPSEC_ROUTE_133                    0x30\n#define MAPSEC_ROUTE_134                    0x31\n#define MAPSEC_UNDERWATER_124               0x32\n#define MAPSEC_UNDERWATER_126               0x33\n#define MAPSEC_UNDERWATER_127               0x34\n#define MAPSEC_UNDERWATER_128               0x35\n#define MAPSEC_UNDERWATER_SOOTOPOLIS        0x36\n#define MAPSEC_GRANITE_CAVE                 0x37\n#define MAPSEC_MT_CHIMNEY                   0x38\n#define MAPSEC_SAFARI_ZONE                  0x39\n#define MAPSEC_BATTLE_FRONTIER              0x3A\n#define MAPSEC_PETALBURG_WOODS              0x3B\n#define MAPSEC_RUSTURF_TUNNEL               0x3C\n#define MAPSEC_ABANDONED_SHIP               0x3D\n#define MAPSEC_NEW_MAUVILLE                 0x3E\n#define MAPSEC_METEOR_FALLS                 0x3F\n#define MAPSEC_METEOR_FALLS2                0x40\n#define MAPSEC_MT_PYRE                      0x41\n#define MAPSEC_AQUA_HIDEOUT_OLD             0x42\n#define MAPSEC_SHOAL_CAVE                   0x43\n#define MAPSEC_SEAFLOOR_CAVERN              0x44\n#define MAPSEC_UNDERWATER_SEAFLOOR_CAVERN   0x45\n#define MAPSEC_VICTORY_ROAD                 0x46\n#define MAPSEC_MIRAGE_ISLAND                0x47\n#define MAPSEC_CAVE_OF_ORIGIN               0x48\n#define MAPSEC_SOUTHERN_ISLAND              0x49\n#define MAPSEC_FIERY_PATH                   0x4A\n#define MAPSEC_FIERY_PATH2                  0x4B\n#define MAPSEC_JAGGED_PASS                  0x4C\n#define MAPSEC_JAGGED_PASS2                 0x4D\n#define MAPSEC_SEALED_CHAMBER               0x4E\n#define MAPSEC_UNDERWATER_SEALED_CHAMBER    0x4F\n#define MAPSEC_SCORCHED_SLAB                0x50\n#define MAPSEC_ISLAND_CAVE                  0x51\n#define MAPSEC_DESERT_RUINS                 0x52\n#define MAPSEC_ANCIENT_TOMB                 0x53\n#define MAPSEC_INSIDE_OF_TRUCK              0x54\n#define MAPSEC_SKY_PILLAR                   0x55\n#define MAPSEC_SECRET_BASE                  0x56\n#define MAPSEC_DYNAMIC                      0x57\n\n#define MAPSECS_KANTO                       0x58\n\n#define MAPSEC_PALLET_TOWN                  0x58\n#define MAPSEC_VIRIDIAN_CITY                0x59\n#define MAPSEC_PEWTER_CITY                  0x5A\n#define MAPSEC_CERULEAN_CITY                0x5B\n#define MAPSEC_LAVENDER_TOWN                0x5C\n#define MAPSEC_VERMILION_CITY               0x5D\n#define MAPSEC_CELADON_CITY                 0x5E\n#define MAPSEC_FUCHSIA_CITY                 0x5F\n#define MAPSEC_CINNABAR_ISLAND              0x60\n#define MAPSEC_INDIGO_PLATEAU               0x61\n#define MAPSEC_SAFFRON_CITY                 0x62\n#define MAPSEC_ROUTE_4_POKECENTER           0x63\n#define MAPSEC_ROUTE_10_POKECENTER          0x64\n#define MAPSEC_ROUTE_1                      0x65\n#define MAPSEC_ROUTE_2                      0x66\n#define MAPSEC_ROUTE_3                      0x67\n#define MAPSEC_ROUTE_4                      0x68\n#define MAPSEC_ROUTE_5                      0x69\n#define MAPSEC_ROUTE_6                      0x6A\n#define MAPSEC_ROUTE_7                      0x6B\n#define MAPSEC_ROUTE_8                      0x6C\n#define MAPSEC_ROUTE_9                      0x6D\n#define MAPSEC_ROUTE_10                     0x6E\n#define MAPSEC_ROUTE_11                     0x6F\n#define MAPSEC_ROUTE_12                     0x70\n#define MAPSEC_ROUTE_13                     0x71\n#define MAPSEC_ROUTE_14                     0x72\n#define MAPSEC_ROUTE_15                     0x73\n#define MAPSEC_ROUTE_16                     0x74\n#define MAPSEC_ROUTE_17                     0x75\n#define MAPSEC_ROUTE_18                     0x76\n#define MAPSEC_ROUTE_19                     0x77\n#define MAPSEC_ROUTE_20                     0x78\n#define MAPSEC_ROUTE_21                     0x79\n#define MAPSEC_ROUTE_22                     0x7A\n#define MAPSEC_ROUTE_23                     0x7B\n#define MAPSEC_ROUTE_24                     0x7C\n#define MAPSEC_ROUTE_25                     0x7D\n#define MAPSEC_VIRIDIAN_FOREST              0x7E\n#define MAPSEC_MT_MOON                      0x7F\n#define MAPSEC_S_S_ANNE                     0x80\n#define MAPSEC_UNDERGROUND_PATH             0x81\n#define MAPSEC_UNDERGROUND_PATH_2           0x82\n#define MAPSEC_DIGLETTS_CAVE                0x83\n#define MAPSEC_KANTO_VICTORY_ROAD           0x84\n#define MAPSEC_ROCKET_HIDEOUT               0x85\n#define MAPSEC_SILPH_CO                     0x86\n#define MAPSEC_POKEMON_MANSION              0x87\n#define MAPSEC_KANTO_SAFARI_ZONE            0x88\n#define MAPSEC_POKEMON_LEAGUE               0x89\n#define MAPSEC_ROCK_TUNNEL                  0x8A\n#define MAPSEC_SEAFOAM_ISLANDS              0x8B\n#define MAPSEC_POKEMON_TOWER                0x8C\n#define MAPSEC_CERULEAN_CAVE                0x8D\n#define MAPSEC_POWER_PLANT                  0x8E\n\n#define MAPSECS_SEVII_123                   0x8F\n\n#define MAPSEC_ONE_ISLAND                   0x8F\n#define MAPSEC_TWO_ISLAND                   0x90\n#define MAPSEC_THREE_ISLAND                 0x91\n#define MAPSEC_FOUR_ISLAND                  0x92\n#define MAPSEC_FIVE_ISLAND                  0x93\n#define MAPSEC_SEVEN_ISLAND                 0x94\n#define MAPSEC_SIX_ISLAND                   0x95\n#define MAPSEC_KINDLE_ROAD                  0x96\n#define MAPSEC_TREASURE_BEACH               0x97\n#define MAPSEC_CAPE_BRINK                   0x98\n#define MAPSEC_BOND_BRIDGE                  0x99\n#define MAPSEC_THREE_ISLE_PORT              0x9A\n#define MAPSEC_SEVII_ISLE_6                 0x9B\n#define MAPSEC_SEVII_ISLE_7                 0x9C\n#define MAPSEC_SEVII_ISLE_8                 0x9D\n#define MAPSEC_SEVII_ISLE_9                 0x9E\n#define MAPSEC_RESORT_GORGEOUS              0x9F\n#define MAPSEC_WATER_LABYRINTH              0xA0\n#define MAPSEC_FIVE_ISLE_MEADOW             0xA1\n#define MAPSEC_MEMORIAL_PILLAR              0xA2\n#define MAPSEC_OUTCAST_ISLAND               0xA3\n#define MAPSEC_GREEN_PATH                   0xA4\n#define MAPSEC_WATER_PATH                   0xA5\n#define MAPSEC_RUIN_VALLEY                  0xA6\n#define MAPSEC_TRAINER_TOWER                0xA7\n#define MAPSEC_CANYON_ENTRANCE              0xA8\n#define MAPSEC_SEVAULT_CANYON               0xA9\n#define MAPSEC_TANOBY_RUINS                 0xAA\n#define MAPSEC_SEVII_ISLE_22                0xAB\n#define MAPSEC_SEVII_ISLE_23                0xAC\n#define MAPSEC_SEVII_ISLE_24                0xAD\n#define MAPSEC_NAVEL_ROCK                   0xAE\n#define MAPSEC_MT_EMBER                     0xAF\n#define MAPSEC_BERRY_FOREST                 0xB0\n#define MAPSEC_ICEFALL_CAVE                 0xB1\n#define MAPSEC_ROCKET_WAREHOUSE             0xB2\n#define MAPSEC_TRAINER_TOWER_2              0xB3\n#define MAPSEC_DOTTED_HOLE                  0xB4\n#define MAPSEC_LOST_CAVE                    0xB5\n#define MAPSEC_PATTERN_BUSH                 0xB6\n#define MAPSEC_ALTERING_CAVE                0xB7\n#define MAPSEC_TANOBY_CHAMBERS              0xB8\n#define MAPSEC_THREE_ISLE_PATH              0xB9\n#define MAPSEC_TANOBY_KEY                   0xBA\n#define MAPSEC_BIRTH_ISLAND                 0xBB\n#define MAPSEC_MONEAN_CHAMBER               0xBC\n#define MAPSEC_LIPTOO_CHAMBER               0xBD\n#define MAPSEC_WEEPTH_CHAMBER               0xBE\n#define MAPSEC_DILFORD_CHAMBER              0xBF\n#define MAPSEC_SCUFIB_CHAMBER               0xC0\n#define MAPSEC_RIXY_CHAMBER                 0xC1\n#define MAPSEC_VIAPOIS_CHAMBER              0xC2\n#define MAPSEC_EMBER_SPA                    0xC3\n#define MAPSEC_SPECIAL_AREA                 0xC4\n#define MAPSEC_AQUA_HIDEOUT                 0xC5\n#define MAPSEC_MAGMA_HIDEOUT                0xC6\n#define MAPSEC_MIRAGE_TOWER                 0xC7\n#define MAPSEC_BIRTH_ISLAND_E               0xC8\n#define MAPSEC_FARAWAY_ISLAND               0xC9\n#define MAPSEC_ARTISAN_CAVE                 0xCA\n#define MAPSEC_MARINE_CAVE                  0xCB\n#define MAPSEC_UNDERWATER_MARINE_CAVE       0xCC\n#define MAPSEC_TERRA_CAVE                   0xCD\n#define MAPSEC_UNDERWATER_105               0xCE\n#define MAPSEC_UNDERWATER_125               0xCF\n#define MAPSEC_UNDERWATER_129               0xD0\n#define MAPSEC_DESERT_UNDERPASS             0xD1\n#define MAPSEC_ALTERING_CAVE_E              0xD2\n#define MAPSEC_NAVEL_ROCK_E                 0xD3\n#define MAPSEC_TRAINER_HILL                 0xD4\n#define MAPSEC_NONE                         0xD5\n#define MAPSEC_COUNT                        0xD6\n\n#define METLOC_SPECIAL_EGG                  0xFD\n#define METLOC_IN_GAME_TRADE                0xFE\n#define METLOC_FATEFUL_ENCOUNTER            0xFF\n\n#endif //GUARD_CONSTANTS_REGION_MAP_SECTIONS_H\n"
  },
  {
    "path": "include/constants/rgb.h",
    "content": "#ifndef GUARD_RGB_H\n#define GUARD_RGB_H\n\n#define GET_R(color) ((color) & 0x1F)\n#define GET_G(color) (((color) >> 5) & 0x1F)\n#define GET_B(color) (((color) >> 10) & 0x1F)\n\n#define RGB(r, g, b)  ((r) | ((g) << 5) | ((b) << 10))\n#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r))\n#define _RGB(r, g, b) ((((b) & 0x1F) << 10) + (((g) & 0x1F) << 5) + ((r) & 0x1F))\n\n#define RGB_ALPHA       (1 << 15)\n#define IS_ALPHA(color) ((color) & RGB_ALPHA)\n\n#define RGB_BLACK      RGB(0, 0, 0)\n#define RGB_WHITE      RGB(31, 31, 31)\n#define RGB_RED        RGB(31, 0, 0)\n#define RGB_GREEN      RGB(0, 31, 0)\n#define RGB_BLUE       RGB(0, 0, 31)\n#define RGB_YELLOW     RGB(31, 31, 0)\n#define RGB_MAGENTA    RGB(31, 0, 31)\n#define RGB_CYAN       RGB(0, 31, 31)\n#define RGB_WHITEALPHA (RGB_WHITE | RGB_ALPHA)\n\n#endif // GUARD_RGB_H\n"
  },
  {
    "path": "include/constants/seagallop.h",
    "content": "#ifndef GUARD_CONSTANTS_SEAGALLOP_H\n#define GUARD_CONSTANTS_SEAGALLOP_H\n\n#define SEAGALLOP_VERMILION_CITY   0\n#define SEAGALLOP_ONE_ISLAND       1\n#define SEAGALLOP_TWO_ISLAND       2\n#define SEAGALLOP_THREE_ISLAND     3\n#define SEAGALLOP_FOUR_ISLAND      4\n#define SEAGALLOP_FIVE_ISLAND      5\n#define SEAGALLOP_SIX_ISLAND       6\n#define SEAGALLOP_SEVEN_ISLAND     7\n#define SEAGALLOP_CINNABAR_ISLAND  8\n#define SEAGALLOP_NAVEL_ROCK       9\n#define SEAGALLOP_BIRTH_ISLAND    10\n#define SEAGALLOP_FARAWAY_ISLAND  11\n#define SEAGALLOP_BATTLE_TOWER    12\n#define SEAGALLOP_SOUTHERN_ISLAND 13\n\n#define SEAGALLOP_MORE           254\n\n#endif //GUARD_CONSTANTS_SEAGALLOP_H\n"
  },
  {
    "path": "include/constants/songs.h",
    "content": "#ifndef GUARD_CONSTANTS_SONGS_H\n#define GUARD_CONSTANTS_SONGS_H\n\n// Original JP names listed on right, along with any additional notes\n\n#define MUS_DUMMY                   0 // MUS_DUMMY\n#define SE_USE_ITEM                 1 // SE_KAIFUKU\n#define SE_PC_LOGIN                 2 // SE_PC_LOGIN\n#define SE_PC_OFF                   3 // SE_PC_OFF\n#define SE_PC_ON                    4 // SE_PC_ON\n#define SE_SELECT                   5 // SE_SELECT\n#define SE_WIN_OPEN                 6 // SE_WIN_OPEN\n#define SE_WALL_HIT                 7 // SE_WALL_HIT\n#define SE_RS_DOOR                     8 // SE_DOOR\n#define SE_EXIT                     9 // SE_KAIDAN\n#define SE_LEDGE                    10 // SE_DANSA\n#define SE_BIKE_BELL                11 // SE_JITENSYA\n#define SE_NOT_EFFECTIVE            12 // SE_KOUKA_L\n#define SE_EFFECTIVE                13 // SE_KOUKA_M\n#define SE_SUPER_EFFECTIVE          14 // SE_KOUKA_H\n#define SE_BALL_OPEN                15 // SE_BOWA2\n#define SE_FAINT                    16 // SE_POKE_DEAD\n#define SE_FLEE                     17 // SE_NIGERU\n#define SE_SLIDING_DOOR             18 // SE_JIDO_DOA\n#define SE_SHIP                     19 // SE_NAMINORI\n#define SE_BANG                     20 // SE_BAN\n#define SE_PIN                      21 // SE_PIN (General \"good\", commonly for \"!\")\n#define SE_BOO                      22 // SE_BOO (General \"bad\")\n#define SE_BALL                     23 // SE_BOWA (Giving Poké Ball to nurse, Poké Ball shake, etc)\n#define SE_CONTEST_PLACE            24 // SE_JYUNI\n#define SE_A                        25 // SE_A (Bard sounds)\n#define SE_I                        26 // SE_I\n#define SE_U                        27 // SE_U\n#define SE_E                        28 // SE_E\n#define SE_O                        29 // SE_O\n#define SE_N                        30 // SE_N\n#define SE_SUCCESS                  31 // SE_SEIKAI\n#define SE_FAILURE                  32 // SE_HAZURE\n#define SE_EXP                      33 // SE_EXP\n#define SE_BIKE_HOP                 34 // SE_JITE_PYOKO\n#define SE_SWITCH                   35 // SE_MU_PACHI\n#define SE_CLICK                    36 // SE_TK_KASYA\n#define SE_FU_ZAKU                  37 // SE_FU_ZAKU (Unknown purpose, unused)\n#define SE_CONTEST_CONDITION_LOSE   38 // SE_FU_ZAKU2\n#define SE_LAVARIDGE_FALL_WARP      39 // SE_FU_ZUZUZU\n#define SE_ICE_STAIRS               40 // SE_RU_GASHIN\n#define SE_ICE_BREAK                41 // SE_RU_GASYAN\n#define SE_ICE_CRACK                42 // SE_RU_BARI\n#define SE_FALL                     43 // SE_RU_HYUU\n#define SE_UNLOCK                   44 // SE_KI_GASYAN\n#define SE_WARP_IN                  45 // SE_TK_WARPIN\n#define SE_WARP_OUT                 46 // SE_TK_WARPOUT\n#define SE_REPEL                    47 // SE_TU_SAA\n#define SE_ROTATING_GATE            48 // SE_HI_TURUN\n#define SE_TRUCK_MOVE               49 // SE_TRACK_MOVE\n#define SE_TRUCK_STOP               50 // SE_TRACK_STOP\n#define SE_TRUCK_UNLOAD             51 // SE_TRACK_HAIKI\n#define SE_TRUCK_DOOR               52 // SE_TRACK_DOOR\n#define SE_BERRY_BLENDER            53 // SE_MOTER\n#define SE_CARD                     54 // SE_CARD (Unused, different from the RS card SE)\n#define SE_SAVE                     55 // SE_SAVE\n#define SE_BALL_BOUNCE_1            56 // SE_KON\n#define SE_BALL_BOUNCE_2            57 // SE_KON2\n#define SE_BALL_BOUNCE_3            58 // SE_KON3\n#define SE_BALL_BOUNCE_4            59 // SE_KON4\n#define SE_BALL_TRADE               60 // SE_SUIKOMU\n#define SE_BALL_THROW               61 // SE_NAGERU\n#define SE_NOTE_C                   62 // SE_TOY_C\n#define SE_NOTE_D                   63 // SE_TOY_D\n#define SE_NOTE_E                   64 // SE_TOY_E\n#define SE_NOTE_F                   65 // SE_TOY_F\n#define SE_NOTE_G                   66 // SE_TOY_G\n#define SE_NOTE_A                   67 // SE_TOY_A\n#define SE_NOTE_B                   68 // SE_TOY_B\n#define SE_NOTE_C_HIGH              69 // SE_TOY_C1\n#define SE_PUDDLE                   70 // SE_MIZU\n#define SE_BRIDGE_WALK              71 // SE_HASHI\n#define SE_ITEMFINDER               72 // SE_DAUGI\n#define SE_DING_DONG                73 // SE_PINPON\n#define SE_BALLOON_RED              74 // SE_FUUSEN1\n#define SE_BALLOON_BLUE             75 // SE_FUUSEN2\n#define SE_BALLOON_YELLOW           76 // SE_FUUSEN3\n#define SE_BREAKABLE_DOOR           77 // SE_TOY_KABE\n#define SE_MUD_BALL                 78 // SE_TOY_DANGO\n#define SE_FIELD_POISON             79 // SE_DOKU\n#define SE_ESCALATOR                80 // SE_ESUKA\n#define SE_THUNDERSTORM             81 // SE_T_AME\n#define SE_THUNDERSTORM_STOP        82 // SE_T_AME_E\n#define SE_DOWNPOUR                 83 // SE_T_OOAME\n#define SE_DOWNPOUR_STOP            84 // SE_T_OOAME_E\n#define SE_RAIN                     85 // SE_T_KOAME\n#define SE_RAIN_STOP                86 // SE_T_KOAME_E\n#define SE_THUNDER                  87 // SE_T_KAMI\n#define SE_THUNDER2                 88 // SE_T_KAMI2\n#define SE_ELEVATOR                 89 // SE_ELEBETA\n#define SE_LOW_HEALTH               90 // SE_HINSI\n#define SE_EXP_MAX                  91 // SE_EXPMAX\n#define SE_ROULETTE_BALL            92 // SE_TAMAKORO\n#define SE_ROULETTE_BALL2           93 // SE_TAMAKORO_E\n#define SE_TAILLOW_WING_FLAP        94 // SE_BASABASA\n#define SE_RS_SHOP                  95 // SE_REGI\n#define SE_CONTEST_HEART            96 // SE_C_GAJI\n#define SE_CONTEST_CURTAIN_RISE     97 // SE_C_MAKU_U\n#define SE_CONTEST_CURTAIN_FALL     98 // SE_C_MAKU_D\n#define SE_CONTEST_ICON_CHANGE      99 // SE_C_PASI\n#define SE_CONTEST_ICON_CLEAR       100 // SE_C_SYU\n#define SE_CONTEST_MONS_TURN        101 // SE_C_PIKON\n#define SE_SHINY                    102 // SE_REAPOKE\n#define SE_INTRO_BLAST              103 // SE_OP_BASYU\n#define SE_MUGSHOT                  104 // SE_BT_START\n#define SE_APPLAUSE                 105 // SE_DENDOU\n#define SE_VEND                     106 // SE_JIHANKI\n#define SE_ORB                      107 // SE_TAMA\n#define SE_DEX_SCROLL               108 // SE_Z_SCROLL\n#define SE_DEX_PAGE                 109 // SE_Z_PAGE\n#define SE_POKENAV_ON               110 // SE_PN_ON\n#define SE_POKENAV_OFF              111 // SE_PN_OFF\n#define SE_DEX_SEARCH               112 // SE_Z_SEARCH\n#define SE_EGG_HATCH                113 // SE_TAMAGO\n#define SE_BALL_TRAY_ENTER          114 // SE_TB_START\n#define SE_BALL_TRAY_BALL           115 // SE_TB_KON\n#define SE_BALL_TRAY_EXIT           116 // SE_TB_KARA\n#define SE_GLASS_FLUTE              117 // SE_BIDORO\n// Move SFX\n#define SE_M_THUNDERBOLT            118 // SE_W085\n#define SE_M_THUNDERBOLT2           119 // SE_W085B\n#define SE_M_HARDEN                 120 // SE_W231\n#define SE_M_NIGHTMARE              121 // SE_W171\n#define SE_M_VITAL_THROW            122 // SE_W233\n#define SE_M_VITAL_THROW2           123 // SE_W233B\n#define SE_M_BUBBLE                 124 // SE_W145\n#define SE_M_BUBBLE2                125 // SE_W145B\n#define SE_M_BUBBLE3                126 // SE_W145C\n#define SE_M_RAIN_DANCE             127 // SE_W240\n#define SE_M_CUT                    128 // SE_W015\n#define SE_M_STRING_SHOT            129 // SE_W081\n#define SE_M_STRING_SHOT2           130 // SE_W081B\n#define SE_M_ROCK_THROW             131 // SE_W088\n#define SE_M_GUST                   132 // SE_W016\n#define SE_M_GUST2                  133 // SE_W016B\n#define SE_M_DOUBLE_SLAP            134 // SE_W003\n#define SE_M_DOUBLE_TEAM            135 // SE_W104\n#define SE_M_RAZOR_WIND             136 // SE_W013\n#define SE_M_ICY_WIND               137 // SE_W196\n#define SE_M_THUNDER_WAVE           138 // SE_W086\n#define SE_M_COMET_PUNCH            139 // SE_W004\n#define SE_M_MEGA_KICK              140 // SE_W025\n#define SE_M_MEGA_KICK2             141 // SE_W025B\n#define SE_M_CRABHAMMER             142 // SE_W152\n#define SE_M_JUMP_KICK              143 // SE_W026\n#define SE_M_FLAME_WHEEL            144 // SE_W172\n#define SE_M_FLAME_WHEEL2           145 // SE_W172B\n#define SE_M_FLAMETHROWER           146 // SE_W053\n#define SE_M_FIRE_PUNCH             147 // SE_W007\n#define SE_M_TOXIC                  148 // SE_W092\n#define SE_M_SACRED_FIRE            149 // SE_W221\n#define SE_M_SACRED_FIRE2           150 // SE_W221B\n#define SE_M_EMBER                  151 // SE_W052\n#define SE_M_TAKE_DOWN              152 // SE_W036\n#define SE_M_BLIZZARD               153 // SE_W059\n#define SE_M_BLIZZARD2              154 // SE_W059B\n#define SE_M_SCRATCH                155 // SE_W010\n#define SE_M_VICEGRIP               156 // SE_W011\n#define SE_M_WING_ATTACK            157 // SE_W017\n#define SE_M_FLY                    158 // SE_W019\n#define SE_M_SAND_ATTACK            159 // SE_W028\n#define SE_M_RAZOR_WIND2            160 // SE_W013B\n#define SE_M_BITE                   161 // SE_W044\n#define SE_M_HEADBUTT               162 // SE_W029\n#define SE_M_SURF                   163 // SE_W057\n#define SE_M_HYDRO_PUMP             164 // SE_W056\n#define SE_M_WHIRLPOOL              165 // SE_W250\n#define SE_M_HORN_ATTACK            166 // SE_W030\n#define SE_M_TAIL_WHIP              167 // SE_W039\n#define SE_M_MIST                   168 // SE_W054\n#define SE_M_POISON_POWDER          169 // SE_W077\n#define SE_M_BIND                   170 // SE_W020\n#define SE_M_DRAGON_RAGE            171 // SE_W082\n#define SE_M_SING                   172 // SE_W047\n#define SE_M_PERISH_SONG            173 // SE_W195\n#define SE_M_PAY_DAY                174 // SE_W006\n#define SE_M_DIG                    175 // SE_W091\n#define SE_M_DIZZY_PUNCH            176 // SE_W146\n#define SE_M_SELF_DESTRUCT          177 // SE_W120\n#define SE_M_EXPLOSION              178 // SE_W153\n#define SE_M_ABSORB_2               179 // SE_W071B\n#define SE_M_ABSORB                 180 // SE_W071\n#define SE_M_SCREECH                181 // SE_W103\n#define SE_M_BUBBLE_BEAM            182 // SE_W062\n#define SE_M_BUBBLE_BEAM2           183 // SE_W062B\n#define SE_M_SUPERSONIC             184 // SE_W048\n#define SE_M_BELLY_DRUM             185 // SE_W187\n#define SE_M_METRONOME              186 // SE_W118\n#define SE_M_BONEMERANG             187 // SE_W155\n#define SE_M_LICK                   188 // SE_W122\n#define SE_M_PSYBEAM                189 // SE_W060\n#define SE_M_FAINT_ATTACK           190 // SE_W185\n#define SE_M_SWORDS_DANCE           191 // SE_W014\n#define SE_M_LEER                   192 // SE_W043\n#define SE_M_SWAGGER                193 // SE_W207\n#define SE_M_SWAGGER2               194 // SE_W207B\n#define SE_M_HEAL_BELL              195 // SE_W215\n#define SE_M_CONFUSE_RAY            196 // SE_W109\n#define SE_M_SNORE                  197 // SE_W173\n#define SE_M_BRICK_BREAK            198 // SE_W280\n#define SE_M_GIGA_DRAIN             199 // SE_W202\n#define SE_M_PSYBEAM2               200 // SE_W060B\n#define SE_M_SOLAR_BEAM             201 // SE_W076\n#define SE_M_PETAL_DANCE            202 // SE_W080\n#define SE_M_TELEPORT               203 // SE_W100\n#define SE_M_MINIMIZE               204 // SE_W107\n#define SE_M_SKETCH                 205 // SE_W166\n#define SE_M_SWIFT                  206 // SE_W129\n#define SE_M_REFLECT                207 // SE_W115\n#define SE_M_BARRIER                208 // SE_W112\n#define SE_M_DETECT                 209 // SE_W197\n#define SE_M_LOCK_ON                210 // SE_W199\n#define SE_M_MOONLIGHT              211 // SE_W236\n#define SE_M_CHARM                  212 // SE_W204\n#define SE_M_CHARGE                 213 // SE_W268\n#define SE_M_STRENGTH               214 // SE_W070\n#define SE_M_HYPER_BEAM             215 // SE_W063\n#define SE_M_WATERFALL              216 // SE_W127\n#define SE_M_REVERSAL               217 // SE_W179\n#define SE_M_ACID_ARMOR             218 // SE_W151\n#define SE_M_SANDSTORM              219 // SE_W201\n#define SE_M_TRI_ATTACK             220 // SE_W161\n#define SE_M_TRI_ATTACK2            221 // SE_W161B\n#define SE_M_ENCORE                 222 // SE_W227\n#define SE_M_ENCORE2                223 // SE_W227B\n#define SE_M_BATON_PASS             224 // SE_W226\n#define SE_M_MILK_DRINK             225 // SE_W208\n#define SE_M_ATTRACT                226 // SE_W213\n#define SE_M_ATTRACT2               227 // SE_W213B\n#define SE_M_MORNING_SUN            228 // SE_W234\n#define SE_M_FLATTER                229 // SE_W260\n#define SE_M_SAND_TOMB              230 // SE_W328\n#define SE_M_GRASSWHISTLE           231 // SE_W320\n#define SE_M_SPIT_UP                232 // SE_W255\n#define SE_M_DIVE                   233 // SE_W291\n#define SE_M_EARTHQUAKE             234 // SE_W089\n#define SE_M_TWISTER                235 // SE_W239\n#define SE_M_SWEET_SCENT            236 // SE_W230\n#define SE_M_YAWN                   237 // SE_W281\n#define SE_M_SKY_UPPERCUT           238 // SE_W327\n#define SE_M_STAT_INCREASE          239 // SE_W287\n#define SE_M_HEAT_WAVE              240 // SE_W257\n#define SE_M_UPROAR                 241 // SE_W253\n#define SE_M_HAIL                   242 // SE_W258\n#define SE_M_COSMIC_POWER           243 // SE_W322\n#define SE_M_TEETER_DANCE           244 // SE_W298\n#define SE_M_STAT_DECREASE          245 // SE_W287B\n#define SE_M_HAZE                   246 // SE_W114\n#define SE_M_HYPER_BEAM2            247 // SE_W063B\n// FRLG SFX\n#define SE_DOOR                  248 // SE_W_DOOR\n#define SE_CARD_FLIP             249 // SE_CARD1\n#define SE_CARD_FLIPPING         250 // SE_CARD2\n#define SE_CARD_OPEN             251 // SE_CARD3\n#define SE_BAG_CURSOR            252 // SE_BAG1\n#define SE_BAG_POCKET            253 // SE_BAG2\n#define SE_BALL_CLICK            254 // SE_GETTING\n#define SE_SHOP                  255 // SE_SHOP\n#define SE_SS_ANNE_HORN          256 // SE_KITEKI\n#define SE_HELP_OPEN             257 // SE_HELP_OP\n#define SE_HELP_CLOSE            258 // SE_HELP_CL\n#define SE_HELP_ERROR            259 // SE_HELP_NG\n#define SE_DEOXYS_MOVE           260 // SE_DEOMOV\n#define SE_POKE_JUMP_SUCCESS     261 // SE_EXCELLENT\n#define SE_POKE_JUMP_FAILURE     262 // SE_NAWAMISS \n// New Emerald SFX\n#define SE_POKENAV_CALL             263 // SE_TOREEYE\n#define SE_POKENAV_HANG_UP          264 // SE_TOREOFF\n#define SE_ARENA_TIMEUP1            265 // SE_HANTEI1\n#define SE_ARENA_TIMEUP2            266 // SE_HANTEI2\n#define SE_PIKE_CURTAIN_CLOSE       267 // SE_CURTAIN\n#define SE_PIKE_CURTAIN_OPEN        268 // SE_CURTAIN1\n#define SE_SUDOWOODO_SHAKE          269 // SE_USSOKI\n\n// Music\n#define MUS_LITTLEROOT_TEST         350 // MUS_TETSUJI\n#define MUS_GSC_ROUTE38             351 // MUS_FIELD13\n#define MUS_RS_CAUGHT                  352 // MUS_KACHI22\n#define MUS_RS_VICTORY_WILD            353 // MUS_KACHI2\n#define MUS_RS_VICTORY_GYM_LEADER      354 // MUS_KACHI3\n#define MUS_VICTORY_LEAGUE          355 // MUS_KACHI5\n#define MUS_C_COMM_CENTER           356 // MUS_PCC\n#define MUS_GSC_PEWTER              357 // MUS_NIBI\n#define MUS_C_VS_LEGEND_BEAST       358 // MUS_SUIKUN\n#define MUS_ROUTE101                359 // MUS_DOORO1\n#define MUS_ROUTE110                360 // MUS_DOORO_X1\n#define MUS_ROUTE120                361 // MUS_DOORO_X3\n#define MUS_PETALBURG               362 // MUS_MACHI_S2\n#define MUS_OLDALE                  363 // MUS_MACHI_S4\n#define MUS_RS_GYM                     364 // MUS_GIM\n#define MUS_RS_SURF                    365 // MUS_NAMINORI\n#define MUS_PETALBURG_WOODS         366 // MUS_DAN01\n#define MUS_LEVEL_UP                367 // MUS_FANFA1\n#define MUS_RS_HEAL                    368 // MUS_ME_ASA\n#define MUS_OBTAIN_BADGE            369 // MUS_ME_BACHI\n#define MUS_OBTAIN_ITEM             370 // MUS_FANFA4\n#define MUS_EVOLVED                 371 // MUS_FANFA5\n#define MUS_OBTAIN_TMHM             372 // MUS_ME_WAZA\n#define MUS_LILYCOVE_MUSEUM         373 // MUS_BIJYUTU\n#define MUS_ROUTE122                374 // MUS_DOORO_X4\n#define MUS_OCEANIC_MUSEUM          375 // MUS_FUNE_KAN\n#define MUS_EVOLUTION_INTRO         376 // MUS_ME_SHINKA\n#define MUS_EVOLUTION               377 // MUS_SHINKA\n#define MUS_MOVE_DELETED            378 // MUS_ME_WASURE\n#define MUS_RS_ENCOUNTER_GIRL          379 // MUS_SYOUJOEYE\n#define MUS_ENCOUNTER_MALE          380 // MUS_BOYEYE\n#define MUS_ABANDONED_SHIP          381 // MUS_DAN02\n#define MUS_FORTREE                 382 // MUS_MACHI_S3\n#define MUS_BIRCH_LAB               383 // MUS_ODAMAKI\n#define MUS_B_TOWER_RS              384 // MUS_B_TOWER\n#define MUS_ENCOUNTER_SWIMMER       385 // MUS_SWIMEYE\n#define MUS_CAVE_OF_ORIGIN          386 // MUS_DAN03\n#define MUS_OBTAIN_BERRY            387 // MUS_ME_KINOMI\n#define MUS_AWAKEN_LEGEND           388 // MUS_ME_TAMA\n#define MUS_SLOTS_JACKPOT           389 // MUS_ME_B_BIG\n#define MUS_SLOTS_WIN               390 // MUS_ME_B_SMALL\n#define MUS_TOO_BAD                 391 // MUS_ME_ZANNEN\n#define MUS_ROULETTE                392 // MUS_BD_TIME\n#define MUS_LINK_CONTEST_P1         393 // MUS_TEST1\n#define MUS_LINK_CONTEST_P2         394 // MUS_TEST2\n#define MUS_LINK_CONTEST_P3         395 // MUS_TEST3\n#define MUS_LINK_CONTEST_P4         396 // MUS_TEST4\n#define MUS_ENCOUNTER_RICH          397 // MUS_TEST\n#define MUS_VERDANTURF              398 // MUS_GOMACHI0\n#define MUS_RUSTBORO                399 // MUS_GOTOWN\n#define MUS_RS_POKE_CENTER             400 // MUS_POKECEN\n#define MUS_ROUTE104                401 // MUS_NEXTROAD\n#define MUS_ROUTE119                402 // MUS_GRANROAD\n#define MUS_RS_CYCLING                 403 // MUS_CYCLING\n#define MUS_POKE_MART               404 // MUS_FRIENDLY\n#define MUS_LITTLEROOT              405 // MUS_MISHIRO\n#define MUS_MT_CHIMNEY              406 // MUS_TOZAN\n#define MUS_ENCOUNTER_FEMALE        407 // MUS_GIRLEYE\n#define MUS_LILYCOVE                408 // MUS_MINAMO\n#define MUS_ROUTE111                409 // MUS_ASHROAD\n#define MUS_HELP                    410 // MUS_EVENT0\n#define MUS_UNDERWATER              411 // MUS_DEEPDEEP\n#define MUS_RS_VICTORY_TRAINER         412 // MUS_KACHI1\n#define MUS_RS_TITLE                   413 // MUS_TITLE3\n#define MUS_INTRO                   414 // MUS_DEMO1\n#define MUS_ENCOUNTER_MAY           415 // MUS_GIRL_SUP\n#define MUS_ENCOUNTER_INTENSE       416 // MUS_HAGESHII\n#define MUS_ENCOUNTER_COOL          417 // MUS_KAKKOII\n#define MUS_ROUTE113                418 // MUS_KAZANBAI\n#define MUS_ENCOUNTER_AQUA          419 // MUS_AQA_0\n#define MUS_RS_FOLLOW_ME               420 // MUS_TSURETEK\n#define MUS_ENCOUNTER_BRENDAN       421 // MUS_BOY_SUP\n#define MUS_EVER_GRANDE             422 // MUS_RAINBOW\n#define MUS_ENCOUNTER_SUSPICIOUS    423 // MUS_AYASII\n#define MUS_VICTORY_AQUA_MAGMA      424 // MUS_KACHI4\n#define MUS_CABLE_CAR               425 // MUS_ROPEWAY\n#define MUS_RS_GAME_CORNER             426 // MUS_CASINO\n#define MUS_DEWFORD                 427 // MUS_HIGHTOWN\n#define MUS_SAFARI_ZONE             428 // MUS_SAFARI\n#define MUS_RS_VICTORY_ROAD            429 // MUS_C_ROAD\n#define MUS_AQUA_MAGMA_HIDEOUT      430 // MUS_AJITO\n#define MUS_SAILING                 431 // MUS_M_BOAT\n#define MUS_MT_PYRE                 432 // MUS_M_DUNGON\n#define MUS_SLATEPORT               433 // MUS_FINECITY\n#define MUS_MT_PYRE_EXTERIOR        434 // MUS_MACHUPI\n#define MUS_SCHOOL                  435 // MUS_P_SCHOOL\n#define MUS_RS_HALL_OF_FAME            436 // MUS_DENDOU\n#define MUS_FALLARBOR               437 // MUS_TONEKUSA\n#define MUS_SEALED_CHAMBER          438 // MUS_MABOROSI\n#define MUS_CONTEST_WINNER          439 // MUS_CON_FAN\n#define MUS_CONTEST                 440 // MUS_CONTEST0\n#define MUS_ENCOUNTER_MAGMA         441 // MUS_MGM0\n#define MUS_INTRO_BATTLE            442 // MUS_T_BATTLE\n#define MUS_ABNORMAL_WEATHER        443 // MUS_OOAME (Replaces MUS_WEATHER_KYOGRE from R/S)\n#define MUS_WEATHER_GROUDON         444 // MUS_HIDERI (Unused, from R/S)\n#define MUS_SOOTOPOLIS              445 // MUS_RUNECITY\n#define MUS_CONTEST_RESULTS         446 // MUS_CON_K\n#define MUS_HALL_OF_FAME_ROOM       447 // MUS_EIKOU_R\n#define MUS_TRICK_HOUSE             448 // MUS_KARAKURI\n#define MUS_ENCOUNTER_TWINS         449 // MUS_HUTAGO\n#define MUS_ENCOUNTER_ELITE_FOUR    450 // MUS_SITENNOU\n#define MUS_ENCOUNTER_HIKER         451 // MUS_YAMA_EYE\n#define MUS_CONTEST_LOBBY           452 // MUS_CONLOBBY\n#define MUS_ENCOUNTER_INTERVIEWER   453 // MUS_INTER_V\n#define MUS_ENCOUNTER_CHAMPION      454 // MUS_DAIGO\n#define MUS_RS_CREDITS                 455 // MUS_THANKFOR\n#define MUS_END                     456 // MUS_END\n#define MUS_B_FRONTIER              457 // MUS_B_FRONTIER\n#define MUS_B_ARENA                 458 // MUS_B_ARENA\n#define MUS_OBTAIN_B_POINTS         459 // MUS_ME_POINTGET\n#define MUS_REGISTER_MATCH_CALL     460 // MUS_ME_TORE_EYE\n#define MUS_B_PYRAMID               461 // MUS_PYRAMID\n#define MUS_B_PYRAMID_TOP           462 // MUS_PYRAMID_TOP\n#define MUS_B_PALACE                463 // MUS_B_PALACE\n#define MUS_RAYQUAZA_APPEARS        464 // MUS_REKKUU_KOURIN\n#define MUS_B_TOWER                 465 // MUS_SATTOWER\n#define MUS_OBTAIN_SYMBOL           466 // MUS_ME_SYMBOLGET\n#define MUS_B_DOME                  467 // MUS_B_DOME\n#define MUS_B_PIKE                  468 // MUS_B_TUBE\n#define MUS_B_FACTORY               469 // MUS_B_FACTORY\n#define MUS_VS_RAYQUAZA             470 // MUS_VS_REKKU (Identical to MUS_VS_KYOGRE_GROUDON)\n#define MUS_VS_FRONTIER_BRAIN       471 // MUS_VS_FRONT\n#define MUS_VS_MEW                  472 // MUS_VS_MEW\n#define MUS_B_DOME_LOBBY            473 // MUS_B_DOME1\n#define MUS_RS_VS_WILD                 474 // MUS_BATTLE27\n#define MUS_VS_AQUA_MAGMA           475 // MUS_BATTLE31\n#define MUS_RS_VS_TRAINER              476 // MUS_BATTLE20\n#define MUS_RS_VS_GYM_LEADER           477 // MUS_BATTLE32\n#define MUS_RS_VS_CHAMPION             478 // MUS_BATTLE33\n#define MUS_VS_REGI                 479 // MUS_BATTLE36\n#define MUS_VS_KYOGRE_GROUDON       480 // MUS_BATTLE34\n#define MUS_VS_RIVAL                481 // MUS_BATTLE35\n#define MUS_VS_ELITE_FOUR           482 // MUS_BATTLE38\n#define MUS_VS_AQUA_MAGMA_LEADER    483 // MUS_BATTLE30\n// FRLG Music\n#define MUS_FOLLOW_ME            484 // MUS_ANNAI\n#define MUS_GAME_CORNER          485 // MUS_SLOT\n#define MUS_ROCKET_HIDEOUT       486 // MUS_AJITO\n#define MUS_GYM                  487 // MUS_GYM\n#define MUS_JIGGLYPUFF           488 // MUS_PURIN\n#define MUS_INTRO_FIGHT          489 // MUS_DEMO\n#define MUS_TITLE                490 // MUS_TITLE\n#define MUS_CINNABAR             491 // MUS_GUREN\n#define MUS_LAVENDER             492 // MUS_SHION\n#define MUS_HEAL                 493 // MUS_KAIHUKU\n#define MUS_CYCLING              494 // MUS_CYCLING\n#define MUS_ENCOUNTER_ROCKET     495 // MUS_ROCKET\n#define MUS_ENCOUNTER_GIRL       496 // MUS_SHOUJO\n#define MUS_ENCOUNTER_BOY        497 // MUS_SHOUNEN\n#define MUS_HALL_OF_FAME         498 // MUS_DENDOU\n#define MUS_VIRIDIAN_FOREST      499 // MUS_T_MORI\n#define MUS_MT_MOON              500 // MUS_OTSUKIMI\n#define MUS_POKE_MANSION         501 // MUS_POKEYASHI\n#define MUS_CREDITS              502 // MUS_ENDING\n#define MUS_ROUTE1               503 // MUS_LOAD01\n#define MUS_ROUTE24              504 // MUS_OPENING\n#define MUS_ROUTE3               505 // MUS_LOAD02\n#define MUS_ROUTE11              506 // MUS_LOAD03\n#define MUS_VICTORY_ROAD         507 // MUS_CHAMP_R\n#define MUS_VS_GYM_LEADER        508 // MUS_VS_GYM\n#define MUS_VS_TRAINER           509 // MUS_VS_TORE\n#define MUS_VS_WILD              510 // MUS_VS_YASEI\n#define MUS_VS_CHAMPION          511 // MUS_VS_LAST\n#define MUS_PALLET               512 // MUS_MASARA\n#define MUS_OAK_LAB              513 // MUS_KENKYU\n#define MUS_OAK                  514 // MUS_OHKIDO\n#define MUS_POKE_CENTER          515 // MUS_POKECEN\n#define MUS_SS_ANNE              516 // MUS_SANTOAN\n#define MUS_SURF                 517 // MUS_NAMINORI\n#define MUS_POKE_TOWER           518 // MUS_P_TOWER\n#define MUS_SILPH                519 // MUS_SHIRUHU\n#define MUS_FUCHSIA              520 // MUS_HANADA\n#define MUS_CELADON              521 // MUS_TAMAMUSI\n#define MUS_VICTORY_TRAINER      522 // MUS_WIN_TRE (Identical to MUS_VICTORY_TRAINER)\n#define MUS_VICTORY_WILD         523 // MUS_WIN_YASEI (Identical to MUS_VICTORY_WILD)\n#define MUS_VICTORY_GYM_LEADER   524 // MUS_WIN_GYM (Identical to MUS_VICTORY_GYM_LEADER)\n#define MUS_VERMILLION           525 // MUS_KUCHIBA\n#define MUS_PEWTER               526 // MUS_NIBI\n#define MUS_ENCOUNTER_RIVAL      527 // MUS_RIVAL1\n#define MUS_RIVAL_EXIT           528 // MUS_RIVAL2\n#define MUS_DEX_RATING           529 // MUS_FAN2\n#define MUS_OBTAIN_KEY_ITEM      530 // MUS_FAN5\n#define MUS_CAUGHT_INTRO         531 // MUS_FAN6\n#define MUS_PHOTO                532 // MUS_ME_PHOTO\n#define MUS_GAME_FREAK           533 // MUS_TITLEROG\n#define MUS_CAUGHT               534 // MUS_GET_YASEI\n#define MUS_NEW_GAME_INSTRUCT    535 // MUS_SOUSA\n#define MUS_NEW_GAME_INTRO       536 // MUS_SEKAIKAN\n#define MUS_NEW_GAME_EXIT        537 // MUS_SEIBETU\n#define MUS_POKE_JUMP            538 // MUS_JUMP\n#define MUS_UNION_ROOM           539 // MUS_UNION\n#define MUS_NET_CENTER           540 // MUS_NETWORK\n#define MUS_MYSTERY_GIFT         541 // MUS_OKURIMONO\n#define MUS_BERRY_PICK           542 // MUS_KINOMIKUI\n#define MUS_SEVII_CAVE           543 // MUS_NANADUNGEON (Identical to MUS_MT_MOON)\n#define MUS_TEACHY_TV_SHOW       544 // MUS_OSHIE_TV (Identical to MUS_FOLLOW_ME)\n#define MUS_SEVII_ROUTE          545 // MUS_NANASHIMA\n#define MUS_SEVII_DUNGEON        546 // MUS_NANAISEKI (Identical to MUS_VIRIDIAN_FOREST)\n#define MUS_SEVII_123            547 // MUS_NANA123 (Identical to MUS_PEWTER)\n#define MUS_SEVII_45             548 // MUS_NANA45\n#define MUS_SEVII_67             549 // MUS_NANA67\n#define MUS_POKE_FLUTE           550 // MUS_POKEFUE\n#define MUS_VS_DEOXYS            551 // MUS_VS_DEO\n#define MUS_VS_MEWTWO            552 // MUS_VS_MYU2\n#define MUS_VS_LEGEND            553 // MUS_VS_DEN\n#define MUS_ENCOUNTER_GYM_LEADER 554 // MUS_EXEYE\n#define MUS_ENCOUNTER_DEOXYS     555 // MUS_DEOEYE\n#define MUS_TRAINER_TOWER        556 // MUS_T_TOWER\n#define MUS_SLOW_PALLET          557 // MUS_SLOWMASARA\n#define MUS_TEACHY_TV_MENU       558 // MUS_TVNOIZE\n\n#define PH_TRAP_BLEND               559\n#define PH_TRAP_HELD                560\n#define PH_TRAP_SOLO                561\n#define PH_FACE_BLEND               562\n#define PH_FACE_HELD                563\n#define PH_FACE_SOLO                564\n#define PH_CLOTH_BLEND              565\n#define PH_CLOTH_HELD               566\n#define PH_CLOTH_SOLO               567\n#define PH_DRESS_BLEND              568\n#define PH_DRESS_HELD               569\n#define PH_DRESS_SOLO               570\n#define PH_FLEECE_BLEND             571\n#define PH_FLEECE_HELD              572\n#define PH_FLEECE_SOLO              573\n#define PH_KIT_BLEND                574\n#define PH_KIT_HELD                 575\n#define PH_KIT_SOLO                 576\n#define PH_PRICE_BLEND              577\n#define PH_PRICE_HELD               578\n#define PH_PRICE_SOLO               579\n#define PH_LOT_BLEND                580\n#define PH_LOT_HELD                 581\n#define PH_LOT_SOLO                 582\n#define PH_GOAT_BLEND               583\n#define PH_GOAT_HELD                584\n#define PH_GOAT_SOLO                585\n#define PH_THOUGHT_BLEND            586\n#define PH_THOUGHT_HELD             587\n#define PH_THOUGHT_SOLO             588\n#define PH_CHOICE_BLEND             589\n#define PH_CHOICE_HELD              590\n#define PH_CHOICE_SOLO              591\n#define PH_MOUTH_BLEND              592\n#define PH_MOUTH_HELD               593\n#define PH_MOUTH_SOLO               594\n#define PH_FOOT_BLEND               595\n#define PH_FOOT_HELD                596\n#define PH_FOOT_SOLO                597\n#define PH_GOOSE_BLEND              598\n#define PH_GOOSE_HELD               599\n#define PH_GOOSE_SOLO               600\n#define PH_STRUT_BLEND              601\n#define PH_STRUT_HELD               602\n#define PH_STRUT_SOLO               603\n#define PH_CURE_BLEND               604\n#define PH_CURE_HELD                605\n#define PH_CURE_SOLO                606\n#define PH_NURSE_BLEND              607\n#define PH_NURSE_HELD               608\n#define PH_NURSE_SOLO               609\n\n#define MUS_ROUTE118                0x7FFF  // Map is split into 2 music sections. controlled by GetCurrLocationDefaultMusic().\n\n#define MUS_NONE                    0xFFFF\n\n#define MUS_NONE                    0xFFFF\n\n#endif  // GUARD_CONSTANTS_SONGS_H\n"
  },
  {
    "path": "include/constants/sound.h",
    "content": "#ifndef GUARD_CONSTANTS_SOUND_H\n#define GUARD_CONSTANTS_SOUND_H\n\n#define FANFARE_LEVEL_UP             0\n#define FANFARE_OBTAIN_ITEM          1\n#define FANFARE_EVOLVED              2\n#define FANFARE_OBTAIN_TMHM          3\n#define FANFARE_HEAL                 4\n#define FANFARE_OBTAIN_BADGE         5\n#define FANFARE_MOVE_DELETED         6\n#define FANFARE_OBTAIN_BERRY         7\n#define FANFARE_SLOTS_JACKPOT        8\n#define FANFARE_SLOTS_WIN            9\n#define FANFARE_TOO_BAD             10\n#define FANFARE_POKE_FLUTE          11\n#define FANFARE_KEY_ITEM            12\n#define FANFARE_DEX_EVAL            13\n\n#define CRY_MODE_NORMAL        0 // Default\n#define CRY_MODE_DOUBLES       1 // Shortened cry for double battles\n#define CRY_MODE_ENCOUNTER     2 // Used when starting a static encounter, or when a Pokémon is \"aggressive\"\n#define CRY_MODE_HIGH_PITCH    3 // Highest pitch mode, used exclusively by the move Howl\n#define CRY_MODE_ECHO_START    4 // For 1st half of cry used by the move Hyper Voice. Played in reverse\n#define CRY_MODE_FAINT         5 // Used when a Pokémon faints\n#define CRY_MODE_ECHO_END      6 // For 2nd half of cry used by the move Hyper Voice\n#define CRY_MODE_ROAR_1        7 // For 1st cry used by the move Roar\n#define CRY_MODE_ROAR_2        8 // For 2nd cry used by the move Roar\n#define CRY_MODE_GROWL_1       9 // For 1st cry used by the move Growl. Played in reverse\n#define CRY_MODE_GROWL_2      10 // For 2nd cry used by the move Growl\n#define CRY_MODE_WEAK         11 // Used when a Pokémon is unhealthy\n#define CRY_MODE_WEAK_DOUBLES 12 // Equivalent to CRY_MODE_DOUBLES for CRY_MODE_WEAK\n\n// Given to SoundTask_PlayDoubleCry to determine which cry mode to use. Values are arbitrary\n#define DOUBLE_CRY_ROAR  2\n#define DOUBLE_CRY_GROWL 255\n\n#define CRY_PRIORITY_NORMAL 10\n#define CRY_PRIORITY_AMBIENT 1\n\n// Cry volume was changed from 125 in R/S to 120 for FRLG/Em, but was (accidentally?) not updated outside of sound.c\n#define CRY_VOLUME    120\n#define CRY_VOLUME_RS 125\n\n#endif //GUARD_CONSTANTS_SOUND_H\n"
  },
  {
    "path": "include/constants/species.h",
    "content": "#ifndef GUARD_CONSTANTS_SPECIES_H\n#define GUARD_CONSTANTS_SPECIES_H\n\n#define SPECIES_NONE 0\n#define SPECIES_BULBASAUR 1\n#define SPECIES_IVYSAUR 2\n#define SPECIES_VENUSAUR 3\n#define SPECIES_CHARMANDER 4\n#define SPECIES_CHARMELEON 5\n#define SPECIES_CHARIZARD 6\n#define SPECIES_SQUIRTLE 7\n#define SPECIES_WARTORTLE 8\n#define SPECIES_BLASTOISE 9\n#define SPECIES_CATERPIE 10\n#define SPECIES_METAPOD 11\n#define SPECIES_BUTTERFREE 12\n#define SPECIES_WEEDLE 13\n#define SPECIES_KAKUNA 14\n#define SPECIES_BEEDRILL 15\n#define SPECIES_PIDGEY 16\n#define SPECIES_PIDGEOTTO 17\n#define SPECIES_PIDGEOT 18\n#define SPECIES_RATTATA 19\n#define SPECIES_RATICATE 20\n#define SPECIES_SPEAROW 21\n#define SPECIES_FEAROW 22\n#define SPECIES_EKANS 23\n#define SPECIES_ARBOK 24\n#define SPECIES_PIKACHU 25\n#define SPECIES_RAICHU 26\n#define SPECIES_SANDSHREW 27\n#define SPECIES_SANDSLASH 28\n#define SPECIES_NIDORAN_F 29\n#define SPECIES_NIDORINA 30\n#define SPECIES_NIDOQUEEN 31\n#define SPECIES_NIDORAN_M 32\n#define SPECIES_NIDORINO 33\n#define SPECIES_NIDOKING 34\n#define SPECIES_CLEFAIRY 35\n#define SPECIES_CLEFABLE 36\n#define SPECIES_VULPIX 37\n#define SPECIES_NINETALES 38\n#define SPECIES_JIGGLYPUFF 39\n#define SPECIES_WIGGLYTUFF 40\n#define SPECIES_ZUBAT 41\n#define SPECIES_GOLBAT 42\n#define SPECIES_ODDISH 43\n#define SPECIES_GLOOM 44\n#define SPECIES_VILEPLUME 45\n#define SPECIES_PARAS 46\n#define SPECIES_PARASECT 47\n#define SPECIES_VENONAT 48\n#define SPECIES_VENOMOTH 49\n#define SPECIES_DIGLETT 50\n#define SPECIES_DUGTRIO 51\n#define SPECIES_MEOWTH 52\n#define SPECIES_PERSIAN 53\n#define SPECIES_PSYDUCK 54\n#define SPECIES_GOLDUCK 55\n#define SPECIES_MANKEY 56\n#define SPECIES_PRIMEAPE 57\n#define SPECIES_GROWLITHE 58\n#define SPECIES_ARCANINE 59\n#define SPECIES_POLIWAG 60\n#define SPECIES_POLIWHIRL 61\n#define SPECIES_POLIWRATH 62\n#define SPECIES_ABRA 63\n#define SPECIES_KADABRA 64\n#define SPECIES_ALAKAZAM 65\n#define SPECIES_MACHOP 66\n#define SPECIES_MACHOKE 67\n#define SPECIES_MACHAMP 68\n#define SPECIES_BELLSPROUT 69\n#define SPECIES_WEEPINBELL 70\n#define SPECIES_VICTREEBEL 71\n#define SPECIES_TENTACOOL 72\n#define SPECIES_TENTACRUEL 73\n#define SPECIES_GEODUDE 74\n#define SPECIES_GRAVELER 75\n#define SPECIES_GOLEM 76\n#define SPECIES_PONYTA 77\n#define SPECIES_RAPIDASH 78\n#define SPECIES_SLOWPOKE 79\n#define SPECIES_SLOWBRO 80\n#define SPECIES_MAGNEMITE 81\n#define SPECIES_MAGNETON 82\n#define SPECIES_FARFETCHD 83\n#define SPECIES_DODUO 84\n#define SPECIES_DODRIO 85\n#define SPECIES_SEEL 86\n#define SPECIES_DEWGONG 87\n#define SPECIES_GRIMER 88\n#define SPECIES_MUK 89\n#define SPECIES_SHELLDER 90\n#define SPECIES_CLOYSTER 91\n#define SPECIES_GASTLY 92\n#define SPECIES_HAUNTER 93\n#define SPECIES_GENGAR 94\n#define SPECIES_ONIX 95\n#define SPECIES_DROWZEE 96\n#define SPECIES_HYPNO 97\n#define SPECIES_KRABBY 98\n#define SPECIES_KINGLER 99\n#define SPECIES_VOLTORB 100\n#define SPECIES_ELECTRODE 101\n#define SPECIES_EXEGGCUTE 102\n#define SPECIES_EXEGGUTOR 103\n#define SPECIES_CUBONE 104\n#define SPECIES_MAROWAK 105\n#define SPECIES_HITMONLEE 106\n#define SPECIES_HITMONCHAN 107\n#define SPECIES_LICKITUNG 108\n#define SPECIES_KOFFING 109\n#define SPECIES_WEEZING 110\n#define SPECIES_RHYHORN 111\n#define SPECIES_RHYDON 112\n#define SPECIES_CHANSEY 113\n#define SPECIES_TANGELA 114\n#define SPECIES_KANGASKHAN 115\n#define SPECIES_HORSEA 116\n#define SPECIES_SEADRA 117\n#define SPECIES_GOLDEEN 118\n#define SPECIES_SEAKING 119\n#define SPECIES_STARYU 120\n#define SPECIES_STARMIE 121\n#define SPECIES_MR_MIME 122\n#define SPECIES_SCYTHER 123\n#define SPECIES_JYNX 124\n#define SPECIES_ELECTABUZZ 125\n#define SPECIES_MAGMAR 126\n#define SPECIES_PINSIR 127\n#define SPECIES_TAUROS 128\n#define SPECIES_MAGIKARP 129\n#define SPECIES_GYARADOS 130\n#define SPECIES_LAPRAS 131\n#define SPECIES_DITTO 132\n#define SPECIES_EEVEE 133\n#define SPECIES_VAPOREON 134\n#define SPECIES_JOLTEON 135\n#define SPECIES_FLAREON 136\n#define SPECIES_PORYGON 137\n#define SPECIES_OMANYTE 138\n#define SPECIES_OMASTAR 139\n#define SPECIES_KABUTO 140\n#define SPECIES_KABUTOPS 141\n#define SPECIES_AERODACTYL 142\n#define SPECIES_SNORLAX 143\n#define SPECIES_ARTICUNO 144\n#define SPECIES_ZAPDOS 145\n#define SPECIES_MOLTRES 146\n#define SPECIES_DRATINI 147\n#define SPECIES_DRAGONAIR 148\n#define SPECIES_DRAGONITE 149\n#define SPECIES_MEWTWO 150\n#define SPECIES_MEW 151\n\n#define KANTO_SPECIES_END SPECIES_MEW\n\n#define SPECIES_CHIKORITA 152\n#define SPECIES_BAYLEEF 153\n#define SPECIES_MEGANIUM 154\n#define SPECIES_CYNDAQUIL 155\n#define SPECIES_QUILAVA 156\n#define SPECIES_TYPHLOSION 157\n#define SPECIES_TOTODILE 158\n#define SPECIES_CROCONAW 159\n#define SPECIES_FERALIGATR 160\n#define SPECIES_SENTRET 161\n#define SPECIES_FURRET 162\n#define SPECIES_HOOTHOOT 163\n#define SPECIES_NOCTOWL 164\n#define SPECIES_LEDYBA 165\n#define SPECIES_LEDIAN 166\n#define SPECIES_SPINARAK 167\n#define SPECIES_ARIADOS 168\n#define SPECIES_CROBAT 169\n#define SPECIES_CHINCHOU 170\n#define SPECIES_LANTURN 171\n#define SPECIES_PICHU 172\n#define SPECIES_CLEFFA 173\n#define SPECIES_IGGLYBUFF 174\n#define SPECIES_TOGEPI 175\n#define SPECIES_TOGETIC 176\n#define SPECIES_NATU 177\n#define SPECIES_XATU 178\n#define SPECIES_MAREEP 179\n#define SPECIES_FLAAFFY 180\n#define SPECIES_AMPHAROS 181\n#define SPECIES_BELLOSSOM 182\n#define SPECIES_MARILL 183\n#define SPECIES_AZUMARILL 184\n#define SPECIES_SUDOWOODO 185\n#define SPECIES_POLITOED 186\n#define SPECIES_HOPPIP 187\n#define SPECIES_SKIPLOOM 188\n#define SPECIES_JUMPLUFF 189\n#define SPECIES_AIPOM 190\n#define SPECIES_SUNKERN 191\n#define SPECIES_SUNFLORA 192\n#define SPECIES_YANMA 193\n#define SPECIES_WOOPER 194\n#define SPECIES_QUAGSIRE 195\n#define SPECIES_ESPEON 196\n#define SPECIES_UMBREON 197\n#define SPECIES_MURKROW 198\n#define SPECIES_SLOWKING 199\n#define SPECIES_MISDREAVUS 200\n#define SPECIES_UNOWN 201\n#define SPECIES_WOBBUFFET 202\n#define SPECIES_GIRAFARIG 203\n#define SPECIES_PINECO 204\n#define SPECIES_FORRETRESS 205\n#define SPECIES_DUNSPARCE 206\n#define SPECIES_GLIGAR 207\n#define SPECIES_STEELIX 208\n#define SPECIES_SNUBBULL 209\n#define SPECIES_GRANBULL 210\n#define SPECIES_QWILFISH 211\n#define SPECIES_SCIZOR 212\n#define SPECIES_SHUCKLE 213\n#define SPECIES_HERACROSS 214\n#define SPECIES_SNEASEL 215\n#define SPECIES_TEDDIURSA 216\n#define SPECIES_URSARING 217\n#define SPECIES_SLUGMA 218\n#define SPECIES_MAGCARGO 219\n#define SPECIES_SWINUB 220\n#define SPECIES_PILOSWINE 221\n#define SPECIES_CORSOLA 222\n#define SPECIES_REMORAID 223\n#define SPECIES_OCTILLERY 224\n#define SPECIES_DELIBIRD 225\n#define SPECIES_MANTINE 226\n#define SPECIES_SKARMORY 227\n#define SPECIES_HOUNDOUR 228\n#define SPECIES_HOUNDOOM 229\n#define SPECIES_KINGDRA 230\n#define SPECIES_PHANPY 231\n#define SPECIES_DONPHAN 232\n#define SPECIES_PORYGON2 233\n#define SPECIES_STANTLER 234\n#define SPECIES_SMEARGLE 235\n#define SPECIES_TYROGUE 236\n#define SPECIES_HITMONTOP 237\n#define SPECIES_SMOOCHUM 238\n#define SPECIES_ELEKID 239\n#define SPECIES_MAGBY 240\n#define SPECIES_MILTANK 241\n#define SPECIES_BLISSEY 242\n#define SPECIES_RAIKOU 243\n#define SPECIES_ENTEI 244\n#define SPECIES_SUICUNE 245\n#define SPECIES_LARVITAR 246\n#define SPECIES_PUPITAR 247\n#define SPECIES_TYRANITAR 248\n#define SPECIES_LUGIA 249\n#define SPECIES_HO_OH 250\n#define SPECIES_CELEBI 251\n\n#define SPECIES_OLD_UNOWN_B 252\n#define SPECIES_OLD_UNOWN_C 253\n#define SPECIES_OLD_UNOWN_D 254\n#define SPECIES_OLD_UNOWN_E 255\n#define SPECIES_OLD_UNOWN_F 256\n#define SPECIES_OLD_UNOWN_G 257\n#define SPECIES_OLD_UNOWN_H 258\n#define SPECIES_OLD_UNOWN_I 259\n#define SPECIES_OLD_UNOWN_J 260\n#define SPECIES_OLD_UNOWN_K 261\n#define SPECIES_OLD_UNOWN_L 262\n#define SPECIES_OLD_UNOWN_M 263\n#define SPECIES_OLD_UNOWN_N 264\n#define SPECIES_OLD_UNOWN_O 265\n#define SPECIES_OLD_UNOWN_P 266\n#define SPECIES_OLD_UNOWN_Q 267\n#define SPECIES_OLD_UNOWN_R 268\n#define SPECIES_OLD_UNOWN_S 269\n#define SPECIES_OLD_UNOWN_T 270\n#define SPECIES_OLD_UNOWN_U 271\n#define SPECIES_OLD_UNOWN_V 272\n#define SPECIES_OLD_UNOWN_W 273\n#define SPECIES_OLD_UNOWN_X 274\n#define SPECIES_OLD_UNOWN_Y 275\n#define SPECIES_OLD_UNOWN_Z 276\n\n#define SPECIES_TREECKO 277\n#define SPECIES_GROVYLE 278\n#define SPECIES_SCEPTILE 279\n#define SPECIES_TORCHIC 280\n#define SPECIES_COMBUSKEN 281\n#define SPECIES_BLAZIKEN 282\n#define SPECIES_MUDKIP 283\n#define SPECIES_MARSHTOMP 284\n#define SPECIES_SWAMPERT 285\n#define SPECIES_POOCHYENA 286\n#define SPECIES_MIGHTYENA 287\n#define SPECIES_ZIGZAGOON 288\n#define SPECIES_LINOONE 289\n#define SPECIES_WURMPLE 290\n#define SPECIES_SILCOON 291\n#define SPECIES_BEAUTIFLY 292\n#define SPECIES_CASCOON 293\n#define SPECIES_DUSTOX 294\n#define SPECIES_LOTAD 295\n#define SPECIES_LOMBRE 296\n#define SPECIES_LUDICOLO 297\n#define SPECIES_SEEDOT 298\n#define SPECIES_NUZLEAF 299\n#define SPECIES_SHIFTRY 300\n#define SPECIES_NINCADA 301\n#define SPECIES_NINJASK 302\n#define SPECIES_SHEDINJA 303\n#define SPECIES_TAILLOW 304\n#define SPECIES_SWELLOW 305\n#define SPECIES_SHROOMISH 306\n#define SPECIES_BRELOOM 307\n#define SPECIES_SPINDA 308\n#define SPECIES_WINGULL 309\n#define SPECIES_PELIPPER 310\n#define SPECIES_SURSKIT 311\n#define SPECIES_MASQUERAIN 312\n#define SPECIES_WAILMER 313\n#define SPECIES_WAILORD 314\n#define SPECIES_SKITTY 315\n#define SPECIES_DELCATTY 316\n#define SPECIES_KECLEON 317\n#define SPECIES_BALTOY 318\n#define SPECIES_CLAYDOL 319\n#define SPECIES_NOSEPASS 320\n#define SPECIES_TORKOAL 321\n#define SPECIES_SABLEYE 322\n#define SPECIES_BARBOACH 323\n#define SPECIES_WHISCASH 324\n#define SPECIES_LUVDISC 325\n#define SPECIES_CORPHISH 326\n#define SPECIES_CRAWDAUNT 327\n#define SPECIES_FEEBAS 328\n#define SPECIES_MILOTIC 329\n#define SPECIES_CARVANHA 330\n#define SPECIES_SHARPEDO 331\n#define SPECIES_TRAPINCH 332\n#define SPECIES_VIBRAVA 333\n#define SPECIES_FLYGON 334\n#define SPECIES_MAKUHITA 335\n#define SPECIES_HARIYAMA 336\n#define SPECIES_ELECTRIKE 337\n#define SPECIES_MANECTRIC 338\n#define SPECIES_NUMEL 339\n#define SPECIES_CAMERUPT 340\n#define SPECIES_SPHEAL 341\n#define SPECIES_SEALEO 342\n#define SPECIES_WALREIN 343\n#define SPECIES_CACNEA 344\n#define SPECIES_CACTURNE 345\n#define SPECIES_SNORUNT 346\n#define SPECIES_GLALIE 347\n#define SPECIES_LUNATONE 348\n#define SPECIES_SOLROCK 349\n#define SPECIES_AZURILL 350\n#define SPECIES_SPOINK 351\n#define SPECIES_GRUMPIG 352\n#define SPECIES_PLUSLE 353\n#define SPECIES_MINUN 354\n#define SPECIES_MAWILE 355\n#define SPECIES_MEDITITE 356\n#define SPECIES_MEDICHAM 357\n#define SPECIES_SWABLU 358\n#define SPECIES_ALTARIA 359\n#define SPECIES_WYNAUT 360\n#define SPECIES_DUSKULL 361\n#define SPECIES_DUSCLOPS 362\n#define SPECIES_ROSELIA 363\n#define SPECIES_SLAKOTH 364\n#define SPECIES_VIGOROTH 365\n#define SPECIES_SLAKING 366\n#define SPECIES_GULPIN 367\n#define SPECIES_SWALOT 368\n#define SPECIES_TROPIUS 369\n#define SPECIES_WHISMUR 370\n#define SPECIES_LOUDRED 371\n#define SPECIES_EXPLOUD 372\n#define SPECIES_CLAMPERL 373\n#define SPECIES_HUNTAIL 374\n#define SPECIES_GOREBYSS 375\n#define SPECIES_ABSOL 376\n#define SPECIES_SHUPPET 377\n#define SPECIES_BANETTE 378\n#define SPECIES_SEVIPER 379\n#define SPECIES_ZANGOOSE 380\n#define SPECIES_RELICANTH 381\n#define SPECIES_ARON 382\n#define SPECIES_LAIRON 383\n#define SPECIES_AGGRON 384\n#define SPECIES_CASTFORM 385\n#define SPECIES_VOLBEAT 386\n#define SPECIES_ILLUMISE 387\n#define SPECIES_LILEEP 388\n#define SPECIES_CRADILY 389\n#define SPECIES_ANORITH 390\n#define SPECIES_ARMALDO 391\n#define SPECIES_RALTS 392\n#define SPECIES_KIRLIA 393\n#define SPECIES_GARDEVOIR 394\n#define SPECIES_BAGON 395\n#define SPECIES_SHELGON 396\n#define SPECIES_SALAMENCE 397\n#define SPECIES_BELDUM 398\n#define SPECIES_METANG 399\n#define SPECIES_METAGROSS 400\n#define SPECIES_REGIROCK 401\n#define SPECIES_REGICE 402\n#define SPECIES_REGISTEEL 403\n#define SPECIES_KYOGRE 404\n#define SPECIES_GROUDON 405\n#define SPECIES_RAYQUAZA 406\n#define SPECIES_LATIAS 407\n#define SPECIES_LATIOS 408\n#define SPECIES_JIRACHI 409\n#define SPECIES_DEOXYS 410\n#define SPECIES_CHIMECHO 411\n#define SPECIES_EGG 412\n\n#define NUM_SPECIES SPECIES_EGG\n\n#define SPECIES_UNOWN_B (NUM_SPECIES + 1)\n#define SPECIES_UNOWN_C (NUM_SPECIES + 2)\n#define SPECIES_UNOWN_D (NUM_SPECIES + 3)\n#define SPECIES_UNOWN_E (NUM_SPECIES + 4)\n#define SPECIES_UNOWN_F (NUM_SPECIES + 5)\n#define SPECIES_UNOWN_G (NUM_SPECIES + 6)\n#define SPECIES_UNOWN_H (NUM_SPECIES + 7)\n#define SPECIES_UNOWN_I (NUM_SPECIES + 8)\n#define SPECIES_UNOWN_J (NUM_SPECIES + 9)\n#define SPECIES_UNOWN_K (NUM_SPECIES + 10)\n#define SPECIES_UNOWN_L (NUM_SPECIES + 11)\n#define SPECIES_UNOWN_M (NUM_SPECIES + 12)\n#define SPECIES_UNOWN_N (NUM_SPECIES + 13)\n#define SPECIES_UNOWN_O (NUM_SPECIES + 14)\n#define SPECIES_UNOWN_P (NUM_SPECIES + 15)\n#define SPECIES_UNOWN_Q (NUM_SPECIES + 16)\n#define SPECIES_UNOWN_R (NUM_SPECIES + 17)\n#define SPECIES_UNOWN_S (NUM_SPECIES + 18)\n#define SPECIES_UNOWN_T (NUM_SPECIES + 19)\n#define SPECIES_UNOWN_U (NUM_SPECIES + 20)\n#define SPECIES_UNOWN_V (NUM_SPECIES + 21)\n#define SPECIES_UNOWN_W (NUM_SPECIES + 22)\n#define SPECIES_UNOWN_X (NUM_SPECIES + 23)\n#define SPECIES_UNOWN_Y (NUM_SPECIES + 24)\n#define SPECIES_UNOWN_Z (NUM_SPECIES + 25)\n#define SPECIES_UNOWN_EMARK (NUM_SPECIES + 26)\n#define SPECIES_UNOWN_QMARK (NUM_SPECIES + 27)\n\n#endif  // GUARD_CONSTANTS_SPECIES_H\n"
  },
  {
    "path": "include/constants/trade.h",
    "content": "#ifndef GUARD_CONSTANTS_TRADE_H\n#define GUARD_CONSTANTS_TRADE_H\n\n// TODO: document trade.c and trade_scene.c with corresponding macros\n// and examine if these are correct\n\n#define TRADE_PLAYER  0\n#define TRADE_PARTNER 1\n\n#define LINK_TRADE_TIMEOUT 300\n\n// In-game Trade IDs\n#define INGAME_TRADE_MR_MIME   0\n#define INGAME_TRADE_JYNX      1\n#define INGAME_TRADE_NIDORAN_F_FR 2  // M or F depending on version\n#define INGAME_TRADE_FARFETCHD 3\n#define INGAME_TRADE_NIDORINA_FR 4  // Nidorino or Nidorina depending on version\n#define INGAME_TRADE_LICKITUNG 5\n#define INGAME_TRADE_ELECTRODE 6\n#define INGAME_TRADE_TANGELA   7\n#define INGAME_TRADE_SEEL      8\n#define INGAME_TRADE_NIDORAN_M_LG 9\n#define INGAME_TRADE_NIDORINO_LG 10\n\n// Return values for CanTradeSelectedMon and CanSpinTradeMon\n#define CAN_TRADE_MON              0\n#define CANT_TRADE_LAST_MON        1\n#define CANT_TRADE_NATIONAL        2\n#define CANT_TRADE_EGG_YET         3\n#define CANT_TRADE_INVALID_MON     4\n#define CANT_TRADE_PARTNER_EGG_YET 5\n\n// Return values for CheckValidityOfTradeMons\n#define PLAYER_MON_INVALID   0\n#define BOTH_MONS_VALID      1\n#define PARTNER_MON_INVALID  2\n\n// Return values for GetGameProgressForLinkTrade\n#define TRADE_BOTH_PLAYERS_READY      0\n#define TRADE_PLAYER_NOT_READY        1\n#define TRADE_PARTNER_NOT_READY       2\n\n// Message indexes for sUnionRoomTradeMessages\n#define UR_TRADE_MSG_NONE                         0\n#define UR_TRADE_MSG_NOT_MON_PARTNER_WANTS        1\n#define UR_TRADE_MSG_NOT_EGG                      2\n#define UR_TRADE_MSG_MON_CANT_BE_TRADED_1         3\n#define UR_TRADE_MSG_MON_CANT_BE_TRADED_2         4\n#define UR_TRADE_MSG_PARTNERS_MON_CANT_BE_TRADED  5\n#define UR_TRADE_MSG_EGG_CANT_BE_TRADED           6\n#define UR_TRADE_MSG_PARTNER_CANT_ACCEPT_MON      7\n#define UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_1    8\n#define UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_2    9\n\n// Return values for CanRegisterMonForTradingBoard\n#define CAN_REGISTER_MON   0\n#define CANT_REGISTER_MON  1\n#define CANT_REGISTER_EGG  2\n\n#endif // GUARD_CONSTANTS_TRADE_H\n"
  },
  {
    "path": "include/constants/trainer_card.h",
    "content": "#ifndef GUARD_CONSTANTS_TRAINER_CARD_H\n#define GUARD_CONSTANTS_TRAINER_CARD_H\n\n#define TRAINER_CARD_PROFILE_LENGTH  4\n#define TRAINER_CARD_STICKER_TYPES   3\n\n#define CARD_TYPE_FRLG     0\n#define CARD_TYPE_RSE      1\n#define CARD_TYPE_EMERALD  2\n\n#define MON_ICON_TINT_NORMAL  0\n#define MON_ICON_TINT_BLACK   1\n#define MON_ICON_TINT_PINK    2\n#define MON_ICON_TINT_SEPIA   3\n\n#define NUM_LINK_TRAINER_CARD_CLASSES 8\n\n#endif // GUARD_CONSTANTS_TRAINER_CARD_H\n"
  },
  {
    "path": "include/constants/trainer_fan_club.h",
    "content": "#ifndef GUARD_CONSTANTS_TRAINER_FAN_CLUB_H\n#define GUARD_CONSTANTS_TRAINER_FAN_CLUB_H\n\n#define FANCLUB_MEMBER1        0\n#define FANCLUB_MEMBER2        1\n#define FANCLUB_MEMBER3        2\n#define FANCLUB_MEMBER4        3\n#define FANCLUB_MEMBER5        4\n#define FANCLUB_MEMBER6        5\n#define FANCLUB_MEMBER7        6\n#define FANCLUB_MEMBER8        7\n\n#define NUM_TRAINER_FAN_CLUB_MEMBERS  8\n\n#endif //GUARD_CONSTANTS_TRAINER_FAN_CLUB_H\n"
  },
  {
    "path": "include/constants/trainer_tower.h",
    "content": "#ifndef GUARD_CONSTANTS_TRAINER_TOWER_H\n#define GUARD_CONSTANTS_TRAINER_TOWER_H\n\n#define CHALLENGE_TYPE_SINGLE     0\n#define CHALLENGE_TYPE_DOUBLE     1\n#define CHALLENGE_TYPE_KNOCKOUT   2\n#define CHALLENGE_TYPE_MIXED      3\n// Mixed challenges use one of the above 3 for each floor\n\n#define CHALLENGE_STATUS_LOST     0\n#define CHALLENGE_STATUS_UNK      1  // Never set, possibly e-Card related\n#define CHALLENGE_STATUS_NORMAL   2  // Not started or ongoing\n\n#define TTPRIZE_HP_UP               0\n#define TTPRIZE_PROTEIN             1\n#define TTPRIZE_IRON                2\n#define TTPRIZE_CARBOS              3\n#define TTPRIZE_CALCIUM             4\n#define TTPRIZE_ZINC                5\n#define TTPRIZE_BRIGHT_POWDER       6\n#define TTPRIZE_WHITE_HERB          7\n#define TTPRIZE_MENTAL_HERB         8\n#define TTPRIZE_CHOICE_BAND         9\n#define TTPRIZE_KINGS_ROCK         10\n#define TTPRIZE_SCOPE_LENS         11\n#define TTPRIZE_METAL_COAT         12\n#define TTPRIZE_DRAGON_SCALE       13\n#define TTPRIZE_UP_GRADE           14\n\n#define MAX_TRAINER_TOWER_FLOORS 8\n\n#define MAX_TRAINERS_PER_FLOOR  3\n\n#define TRAINER_TOWER_FUNC_INIT_FLOOR               0\n#define TRAINER_TOWER_FUNC_GET_SPEECH               1\n#define TRAINER_TOWER_FUNC_DO_BATTLE                2\n#define TRAINER_TOWER_FUNC_GET_CHALLENGE_TYPE       3\n#define TRAINER_TOWER_FUNC_CLEARED_FLOOR            4\n#define TRAINER_TOWER_FUNC_GET_FLOOR_CLEARED        5\n#define TRAINER_TOWER_FUNC_START_CHALLENGE          6\n#define TRAINER_TOWER_FUNC_GET_OWNER_STATE          7\n#define TRAINER_TOWER_FUNC_GIVE_PRIZE               8\n#define TRAINER_TOWER_FUNC_CHECK_FINAL_TIME         9\n#define TRAINER_TOWER_FUNC_RESUME_TIMER             10\n#define TRAINER_TOWER_FUNC_SET_LOST                 11\n#define TRAINER_TOWER_FUNC_GET_CHALLENGE_STATUS     12\n#define TRAINER_TOWER_FUNC_GET_TIME                 13\n#define TRAINER_TOWER_FUNC_SHOW_RESULTS             14\n#define TRAINER_TOWER_FUNC_CLOSE_RESULTS            15\n#define TRAINER_TOWER_FUNC_CHECK_DOUBLES            16\n#define TRAINER_TOWER_FUNC_GET_NUM_FLOORS           17\n#define TRAINER_TOWER_FUNC_SHOULD_WARP_TO_COUNTER   18\n#define TRAINER_TOWER_FUNC_ENCOUNTER_MUSIC          19\n#define TRAINER_TOWER_FUNC_GET_BEAT_CHALLENGE       20\n\n#define TRAINER_TOWER_TEXT_INTRO        2\n#define TRAINER_TOWER_TEXT_PLAYER_LOST  3\n#define TRAINER_TOWER_TEXT_PLAYER_WON   4\n#define TRAINER_TOWER_TEXT_AFTER        5\n\n#define TRAINER_TOWER_MAX_TIME 215999 // 60 * 60 * 60 - 1\n\n#endif //GUARD_CONSTANTS_TRAINER_TOWER_H\n"
  },
  {
    "path": "include/constants/trainer_types.h",
    "content": "#ifndef GUARD_CONSTANTS_TRAINER_TYPES_H\n#define GUARD_CONSTANTS_TRAINER_TYPES_H\n\n#define TRAINER_TYPE_NONE               0\n#define TRAINER_TYPE_NORMAL             1\n#define TRAINER_TYPE_SEE_ALL_DIRECTIONS 2\n#define TRAINER_TYPE_BURIED             3\n\n#endif  // GUARD_CONSTANTS_TRAINER_TYPES_H\n"
  },
  {
    "path": "include/constants/trainers.h",
    "content": "#ifndef GUARD_CONSTANTS_TRAINERS_H\n#define GUARD_CONSTANTS_TRAINERS_H\n\n#include \"constants/opponents.h\"\n#include \"constants/master_opponents.h\"\n\n#define TRAINER_ENCOUNTER_MUSIC_MALE         0 // standard male encounter music\n#define TRAINER_ENCOUNTER_MUSIC_FEMALE       1 // standard female encounter music\n#define TRAINER_ENCOUNTER_MUSIC_GIRL         2 // used for male Tubers and Young Couples too\n#define TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS   3\n#define TRAINER_ENCOUNTER_MUSIC_INTENSE      4\n#define TRAINER_ENCOUNTER_MUSIC_COOL         5\n#define TRAINER_ENCOUNTER_MUSIC_AQUA         6\n#define TRAINER_ENCOUNTER_MUSIC_MAGMA        7\n#define TRAINER_ENCOUNTER_MUSIC_SWIMMER      8\n#define TRAINER_ENCOUNTER_MUSIC_TWINS        9 // used for other trainer classes too\n#define TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR  10\n#define TRAINER_ENCOUNTER_MUSIC_HIKER       11 // used for other trainer classes too\n#define TRAINER_ENCOUNTER_MUSIC_INTERVIEWER 12\n#define TRAINER_ENCOUNTER_MUSIC_RICH        13 // Rich Boys and Gentlemen\n\n#define TRAINER_PIC_AQUA_LEADER_ARCHIE      0\n#define TRAINER_PIC_AQUA_GRUNT_M            1\n#define TRAINER_PIC_AQUA_GRUNT_F            2\n#define TRAINER_PIC_RS_AROMA_LADY           3\n#define TRAINER_PIC_RS_RUIN_MANIAC          4\n#define TRAINER_PIC_INTERVIEWER             5\n#define TRAINER_PIC_RS_TUBER_F              6\n#define TRAINER_PIC_RS_TUBER_M              7\n#define TRAINER_PIC_RS_COOLTRAINER_M        8\n#define TRAINER_PIC_RS_COOLTRAINER_F        9\n#define TRAINER_PIC_HEX_MANIAC             10\n#define TRAINER_PIC_RS_LADY                11\n#define TRAINER_PIC_RS_BEAUTY              12\n#define TRAINER_PIC_RICH_BOY               13\n#define TRAINER_PIC_RS_POKEMANIAC          14\n#define TRAINER_PIC_RS_SWIMMER_M           15\n#define TRAINER_PIC_RS_BLACK_BELT          16\n#define TRAINER_PIC_GUITARIST              17\n#define TRAINER_PIC_KINDLER                18\n#define TRAINER_PIC_RS_CAMPER              19\n#define TRAINER_PIC_BUG_MANIAC             20\n#define TRAINER_PIC_RS_PSYCHIC_M           21\n#define TRAINER_PIC_RS_PSYCHIC_F           22\n#define TRAINER_PIC_RS_GENTLEMAN           23\n#define TRAINER_PIC_ELITE_FOUR_SIDNEY      24\n#define TRAINER_PIC_ELITE_FOUR_PHOEBE      25\n#define TRAINER_PIC_LEADER_ROXANNE         26\n#define TRAINER_PIC_LEADER_BRAWLY          27\n#define TRAINER_PIC_LEADER_TATE_AND_LIZA   28\n#define TRAINER_PIC_SCHOOL_KID_M           29\n#define TRAINER_PIC_SCHOOL_KID_F           30\n#define TRAINER_PIC_SR_AND_JR              31\n#define TRAINER_PIC_POKEFAN_M              32\n#define TRAINER_PIC_POKEFAN_F              33\n#define TRAINER_PIC_EXPERT_M               34\n#define TRAINER_PIC_EXPERT_F               35\n#define TRAINER_PIC_RS_YOUNGSTER           36\n#define TRAINER_PIC_CHAMPION_STEVEN        37\n#define TRAINER_PIC_RS_FISHERMAN           38\n#define TRAINER_PIC_CYCLING_TRIATHLETE_M   39\n#define TRAINER_PIC_CYCLING_TRIATHLETE_F   40\n#define TRAINER_PIC_RUNNING_TRIATHLETE_M   41\n#define TRAINER_PIC_RUNNING_TRIATHLETE_F   42\n#define TRAINER_PIC_SWIMMING_TRIATHLETE_M  43\n#define TRAINER_PIC_SWIMMING_TRIATHLETE_F  44\n#define TRAINER_PIC_DRAGON_TAMER           45\n#define TRAINER_PIC_RS_BIRD_KEEPER         46\n#define TRAINER_PIC_NINJA_BOY              47\n#define TRAINER_PIC_BATTLE_GIRL            48\n#define TRAINER_PIC_PARASOL_LADY           49\n#define TRAINER_PIC_RS_SWIMMER_F           50\n#define TRAINER_PIC_RS_PICNICKER           51\n#define TRAINER_PIC_RS_TWINS               52\n#define TRAINER_PIC_RS_SAILOR              53\n#define TRAINER_PIC_COLLECTOR              54\n#define TRAINER_PIC_WALLY                  55\n#define TRAINER_PIC_RS_BRENDAN_1           56\n#define TRAINER_PIC_RS_MAY_1               57\n#define TRAINER_PIC_RS_POKEMON_BREEDER_M   58\n#define TRAINER_PIC_RS_POKEMON_BREEDER_F   59\n#define TRAINER_PIC_RS_POKEMON_RANGER_M    60\n#define TRAINER_PIC_RS_POKEMON_RANGER_F    61\n#define TRAINER_PIC_MAGMA_LEADER_MAXIE     62\n#define TRAINER_PIC_MAGMA_GRUNT_M          63\n#define TRAINER_PIC_MAGMA_GRUNT_F          64\n#define TRAINER_PIC_RS_LASS                65\n#define TRAINER_PIC_RS_BUG_CATCHER         66\n#define TRAINER_PIC_RS_HIKER               67\n#define TRAINER_PIC_RS_YOUNG_COUPLE        68\n#define TRAINER_PIC_OLD_COUPLE             69\n#define TRAINER_PIC_RS_SIS_AND_BRO         70\n#define TRAINER_PIC_AQUA_ADMIN_M           71\n#define TRAINER_PIC_AQUA_ADMIN_F           72\n#define TRAINER_PIC_MAGMA_ADMIN_M          73\n#define TRAINER_PIC_MAGMA_ADMIN_F          74\n#define TRAINER_PIC_LEADER_WATTSON         75\n#define TRAINER_PIC_LEADER_FLANNERY        76\n#define TRAINER_PIC_LEADER_NORMAN          77\n#define TRAINER_PIC_LEADER_WINONA          78\n#define TRAINER_PIC_LEADER_WALLACE         79\n#define TRAINER_PIC_ELITE_FOUR_GLACIA      80\n#define TRAINER_PIC_ELITE_FOUR_DRAKE       81\n#define TRAINER_PIC_YOUNGSTER              82\n#define TRAINER_PIC_BUG_CATCHER            83\n#define TRAINER_PIC_LASS                   84\n#define TRAINER_PIC_SAILOR                 85\n#define TRAINER_PIC_CAMPER                 86\n#define TRAINER_PIC_PICNICKER              87\n#define TRAINER_PIC_POKEMANIAC             88\n#define TRAINER_PIC_SUPER_NERD             89\n#define TRAINER_PIC_HIKER                  90\n#define TRAINER_PIC_BIKER                  91\n#define TRAINER_PIC_BURGLAR                92\n#define TRAINER_PIC_ENGINEER               93\n#define TRAINER_PIC_FISHERMAN              94\n#define TRAINER_PIC_SWIMMER_M              95\n#define TRAINER_PIC_CUE_BALL               96\n#define TRAINER_PIC_GAMER                  97\n#define TRAINER_PIC_BEAUTY                 98\n#define TRAINER_PIC_SWIMMER_F              99\n#define TRAINER_PIC_PSYCHIC_M             100\n#define TRAINER_PIC_ROCKER                101\n#define TRAINER_PIC_JUGGLER               102\n#define TRAINER_PIC_TAMER                 103\n#define TRAINER_PIC_BIRD_KEEPER           104\n#define TRAINER_PIC_BLACK_BELT            105\n#define TRAINER_PIC_RIVAL_EARLY           106\n#define TRAINER_PIC_SCIENTIST             107\n#define TRAINER_PIC_LEADER_GIOVANNI       108\n#define TRAINER_PIC_ROCKET_GRUNT_M        109\n#define TRAINER_PIC_COOLTRAINER_M         110\n#define TRAINER_PIC_COOLTRAINER_F         111\n#define TRAINER_PIC_ELITE_FOUR_LORELEI    112\n#define TRAINER_PIC_ELITE_FOUR_BRUNO      113\n#define TRAINER_PIC_ELITE_FOUR_AGATHA     114\n#define TRAINER_PIC_ELITE_FOUR_LANCE      115\n#define TRAINER_PIC_LEADER_BROCK          116\n#define TRAINER_PIC_LEADER_MISTY          117\n#define TRAINER_PIC_LEADER_LT_SURGE       118\n#define TRAINER_PIC_LEADER_ERIKA          119\n#define TRAINER_PIC_LEADER_KOGA           120\n#define TRAINER_PIC_LEADER_BLAINE         121\n#define TRAINER_PIC_LEADER_SABRINA        122\n#define TRAINER_PIC_GENTLEMAN             123\n#define TRAINER_PIC_RIVAL_LATE            124\n#define TRAINER_PIC_CHAMPION_RIVAL        125\n#define TRAINER_PIC_CHANNELER             126\n#define TRAINER_PIC_TWINS                 127\n#define TRAINER_PIC_COOL_COUPLE           128\n#define TRAINER_PIC_YOUNG_COUPLE          129\n#define TRAINER_PIC_CRUSH_KIN             130\n#define TRAINER_PIC_SIS_AND_BRO           131\n#define TRAINER_PIC_PROFESSOR_OAK         132\n#define TRAINER_PIC_RS_BRENDAN_2          133\n#define TRAINER_PIC_RS_MAY_2              134\n#define TRAINER_PIC_RED                   135\n#define TRAINER_PIC_LEAF                  136\n#define TRAINER_PIC_ROCKET_GRUNT_F        137\n#define TRAINER_PIC_PSYCHIC_F             138\n#define TRAINER_PIC_CRUSH_GIRL            139\n#define TRAINER_PIC_TUBER_F               140\n#define TRAINER_PIC_POKEMON_BREEDER       141\n#define TRAINER_PIC_POKEMON_RANGER_M      142\n#define TRAINER_PIC_POKEMON_RANGER_F      143\n#define TRAINER_PIC_AROMA_LADY            144\n#define TRAINER_PIC_RUIN_MANIAC           145\n#define TRAINER_PIC_LADY                  146\n#define TRAINER_PIC_PAINTER               147\n#define TRAINER_PIC_EM_BRENDAN            148\n#define TRAINER_PIC_EM_MAY                149\n#define TRAINER_PIC_MASTER_BEAUTY         150\n#define TRAINER_PIC_MASTER_BIRD_KEEPER    151\n#define TRAINER_PIC_MASTER_BLACK_BELT     152\n#define TRAINER_PIC_MASTER_BUG_CATCHER    153\n#define TRAINER_PIC_MASTER_COOLTRAINER_M  154\n#define TRAINER_PIC_MASTER_HIKER          155\n#define TRAINER_PIC_MASTER_LASS           156\n#define TRAINER_PIC_MASTER_PSYCHIC_M      157\n#define TRAINER_PIC_MASTER_SCIENTIST      158\n#define TRAINER_PIC_MASTER_YOUNGSTER      159\n#define TRAINER_PIC_MASTER_SWIMMER        160\n\n// The player back pics are assumed to alternate according to the gender values (MALE/FEMALE)\n#define TRAINER_BACK_PIC_RED                    0\n#define TRAINER_BACK_PIC_LEAF                   1\n#define TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN  2\n#define TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY      3\n#define TRAINER_BACK_PIC_POKEDUDE               4\n#define TRAINER_BACK_PIC_OLD_MAN                5\n#define TRAINER_BACK_PIC_EMERALD_BRENDAN        6\n#define TRAINER_BACK_PIC_EMERALD_MAY            7\n\n// Special Trainer Ids.\n#define TRAINER_UNION_ROOM          0xC00\n#define TRAINER_LINK_OPPONENT       0x800\n#define TRAINER_SECRET_BASE         0x400\n\n#define TRAINER_CLASS_NONE                0\n#define TRAINER_CLASS_PKMN_TRAINER_UNUSED 1\n#define TRAINER_CLASS_AQUA_LEADER         2\n#define TRAINER_CLASS_TEAM_AQUA           3\n#define TRAINER_CLASS_RS_AROMA_LADY       4\n#define TRAINER_CLASS_RS_RUIN_MANIAC      5\n#define TRAINER_CLASS_INTERVIEWER         6\n#define TRAINER_CLASS_RS_TUBER_F          7\n#define TRAINER_CLASS_RS_TUBER_M          8\n#define TRAINER_CLASS_RS_COOLTRAINER      9\n#define TRAINER_CLASS_HEX_MANIAC          10\n#define TRAINER_CLASS_RS_LADY             11\n#define TRAINER_CLASS_RS_BEAUTY           12\n#define TRAINER_CLASS_RICH_BOY            13\n#define TRAINER_CLASS_RS_POKEMANIAC       14\n#define TRAINER_CLASS_RS_SWIMMER_M        15\n#define TRAINER_CLASS_RS_BLACK_BELT       16\n#define TRAINER_CLASS_GUITARIST           17\n#define TRAINER_CLASS_KINDLER             18\n#define TRAINER_CLASS_RS_CAMPER           19\n#define TRAINER_CLASS_BUG_MANIAC          20\n#define TRAINER_CLASS_RS_PSYCHIC          21\n#define TRAINER_CLASS_RS_GENTLEMAN        22\n#define TRAINER_CLASS_RS_ELITE_FOUR       23\n#define TRAINER_CLASS_RS_LEADER           24\n#define TRAINER_CLASS_SCHOOL_KID          25\n#define TRAINER_CLASS_SR_AND_JR           26\n#define TRAINER_CLASS_POKEFAN             27\n#define TRAINER_CLASS_EXPERT              28\n#define TRAINER_CLASS_RS_YOUNGSTER        29\n#define TRAINER_CLASS_RS_CHAMPION         30\n#define TRAINER_CLASS_RS_FISHERMAN        31\n#define TRAINER_CLASS_TRIATHLETE          32\n#define TRAINER_CLASS_DRAGON_TAMER        33\n#define TRAINER_CLASS_RS_BIRD_KEEPER      34\n#define TRAINER_CLASS_NINJA_BOY           35\n#define TRAINER_CLASS_BATTLE_GIRL         36\n#define TRAINER_CLASS_PARASOL_LADY        37\n#define TRAINER_CLASS_RS_SWIMMER_F        38\n#define TRAINER_CLASS_RS_PICNICKER        39\n#define TRAINER_CLASS_RS_TWINS            40\n#define TRAINER_CLASS_RS_SAILOR           41\n#define TRAINER_CLASS_BOARDER             42\n#define TRAINER_CLASS_COLLECTOR           43\n#define TRAINER_CLASS_PKMN_TRAINER        44\n#define TRAINER_CLASS_RS_PKMN_BREEDER     45\n#define TRAINER_CLASS_RS_PKMN_RANGER      46\n#define TRAINER_CLASS_MAGMA_LEADER        47\n#define TRAINER_CLASS_TEAM_MAGMA          48\n#define TRAINER_CLASS_RS_LASS             49\n#define TRAINER_CLASS_RS_BUG_CATCHER      50\n#define TRAINER_CLASS_RS_HIKER            51\n#define TRAINER_CLASS_RS_YOUNG_COUPLE     52\n#define TRAINER_CLASS_OLD_COUPLE          53\n#define TRAINER_CLASS_RS_SIS_AND_BRO      54\n#define TRAINER_CLASS_AQUA_ADMIN          55\n#define TRAINER_CLASS_MAGMA_ADMIN         56\n#define TRAINER_CLASS_YOUNGSTER           57\n#define TRAINER_CLASS_BUG_CATCHER         58\n#define TRAINER_CLASS_LASS                59\n#define TRAINER_CLASS_SAILOR              60\n#define TRAINER_CLASS_CAMPER              61\n#define TRAINER_CLASS_PICNICKER           62\n#define TRAINER_CLASS_POKEMANIAC          63\n#define TRAINER_CLASS_SUPER_NERD          64\n#define TRAINER_CLASS_HIKER               65\n#define TRAINER_CLASS_BIKER               66\n#define TRAINER_CLASS_BURGLAR             67\n#define TRAINER_CLASS_ENGINEER            68\n#define TRAINER_CLASS_FISHERMAN           69\n#define TRAINER_CLASS_SWIMMER_M           70\n#define TRAINER_CLASS_CUE_BALL            71\n#define TRAINER_CLASS_GAMER               72\n#define TRAINER_CLASS_BEAUTY              73\n#define TRAINER_CLASS_SWIMMER_F           74\n#define TRAINER_CLASS_PSYCHIC             75\n#define TRAINER_CLASS_ROCKER              76\n#define TRAINER_CLASS_JUGGLER             77\n#define TRAINER_CLASS_TAMER               78\n#define TRAINER_CLASS_BIRD_KEEPER         79\n#define TRAINER_CLASS_BLACK_BELT          80\n#define TRAINER_CLASS_RIVAL_EARLY         81\n#define TRAINER_CLASS_SCIENTIST           82\n#define TRAINER_CLASS_BOSS                83\n#define TRAINER_CLASS_LEADER              84\n#define TRAINER_CLASS_TEAM_ROCKET         85\n#define TRAINER_CLASS_COOLTRAINER         86\n#define TRAINER_CLASS_ELITE_FOUR          87\n#define TRAINER_CLASS_GENTLEMAN           88\n#define TRAINER_CLASS_RIVAL_LATE          89\n#define TRAINER_CLASS_CHAMPION            90\n#define TRAINER_CLASS_CHANNELER           91\n#define TRAINER_CLASS_TWINS               92\n#define TRAINER_CLASS_COOL_COUPLE         93\n#define TRAINER_CLASS_YOUNG_COUPLE        94\n#define TRAINER_CLASS_CRUSH_KIN           95\n#define TRAINER_CLASS_SIS_AND_BRO         96\n#define TRAINER_CLASS_PKMN_PROF           97\n#define TRAINER_CLASS_PLAYER              98\n#define TRAINER_CLASS_CRUSH_GIRL          99\n#define TRAINER_CLASS_TUBER               100\n#define TRAINER_CLASS_PKMN_BREEDER        101\n#define TRAINER_CLASS_PKMN_RANGER         102\n#define TRAINER_CLASS_AROMA_LADY          103\n#define TRAINER_CLASS_RUIN_MANIAC         104\n#define TRAINER_CLASS_LADY                105\n#define TRAINER_CLASS_PAINTER             106\n\n#define FACILITY_CLASS_AQUA_LEADER_ARCHIE     0\n#define FACILITY_CLASS_AQUA_GRUNT_M           1\n#define FACILITY_CLASS_AQUA_GRUNT_F           2\n#define FACILITY_CLASS_RS_AROMA_LADY          3\n#define FACILITY_CLASS_RS_RUIN_MANIAC         4\n#define FACILITY_CLASS_INTERVIEWER            5\n#define FACILITY_CLASS_RS_TUBER_F             6\n#define FACILITY_CLASS_RS_TUBER_M             7\n#define FACILITY_CLASS_RS_COOLTRAINER_M       8\n#define FACILITY_CLASS_RS_COOLTRAINER_F       9\n#define FACILITY_CLASS_HEX_MANIAC             10\n#define FACILITY_CLASS_RS_LADY                11\n#define FACILITY_CLASS_RS_BEAUTY              12\n#define FACILITY_CLASS_RICH_BOY               13\n#define FACILITY_CLASS_RS_POKEMANIAC          14\n#define FACILITY_CLASS_RS_SWIMMER_M           15\n#define FACILITY_CLASS_RS_BLACK_BELT          16\n#define FACILITY_CLASS_GUITARIST              17\n#define FACILITY_CLASS_KINDLER                18\n#define FACILITY_CLASS_RS_CAMPER              19\n#define FACILITY_CLASS_BUG_MANIAC             20\n#define FACILITY_CLASS_RS_PSYCHIC_M           21\n#define FACILITY_CLASS_RS_PSYCHIC_F           22\n#define FACILITY_CLASS_RS_GENTLEMAN           23\n#define FACILITY_CLASS_ELITE_FOUR_SIDNEY      24\n#define FACILITY_CLASS_ELITE_FOUR_PHOEBE      25\n#define FACILITY_CLASS_LEADER_ROXANNE         26\n#define FACILITY_CLASS_LEADER_BRAWLY          27\n#define FACILITY_CLASS_LEADER_TATE_AND_LIZA   28\n#define FACILITY_CLASS_SCHOOL_KID_M           29\n#define FACILITY_CLASS_SCHOOL_KID_F           30\n#define FACILITY_CLASS_SR_AND_JR              31\n#define FACILITY_CLASS_POKEFAN_M              32\n#define FACILITY_CLASS_POKEFAN_F              33\n#define FACILITY_CLASS_EXPERT_M               34\n#define FACILITY_CLASS_EXPERT_F               35\n#define FACILITY_CLASS_RS_YOUNGSTER           36\n#define FACILITY_CLASS_CHAMPION_STEVEN        37\n#define FACILITY_CLASS_RS_FISHERMAN           38\n#define FACILITY_CLASS_CYCLING_TRIATHLETE_M   39\n#define FACILITY_CLASS_CYCLING_TRIATHLETE_F   40\n#define FACILITY_CLASS_RUNNING_TRIATHLETE_M   41\n#define FACILITY_CLASS_RUNNING_TRIATHLETE_F   42\n#define FACILITY_CLASS_SWIMMING_TRIATHLETE_M  43\n#define FACILITY_CLASS_SWIMMING_TRIATHLETE_F  44\n#define FACILITY_CLASS_DRAGON_TAMER           45\n#define FACILITY_CLASS_RS_BIRD_KEEPER         46\n#define FACILITY_CLASS_NINJA_BOY              47\n#define FACILITY_CLASS_BATTLE_GIRL            48\n#define FACILITY_CLASS_PARASOL_LADY           49\n#define FACILITY_CLASS_RS_SWIMMER_F           50\n#define FACILITY_CLASS_RS_PICNICKER           51\n#define FACILITY_CLASS_RS_TWINS               52\n#define FACILITY_CLASS_RS_SAILOR              53\n#define FACILITY_CLASS_BOARDER_M              54\n#define FACILITY_CLASS_BOARDER_F              55\n#define FACILITY_CLASS_COLLECTOR              56\n#define FACILITY_CLASS_PKMN_TRAINER_WALLY     57\n#define FACILITY_CLASS_PKMN_TRAINER_BRENDAN   58\n#define FACILITY_CLASS_PKMN_TRAINER_BRENDAN_2 59\n#define FACILITY_CLASS_PKMN_TRAINER_BRENDAN_3 60\n#define FACILITY_CLASS_PKMN_TRAINER_MAY       61\n#define FACILITY_CLASS_PKMN_TRAINER_MAY_2     62\n#define FACILITY_CLASS_PKMN_TRAINER_MAY_3     63\n#define FACILITY_CLASS_RS_PKMN_BREEDER_M      64\n#define FACILITY_CLASS_RS_PKMN_BREEDER_F      65\n#define FACILITY_CLASS_RS_PKMN_RANGER_M       66\n#define FACILITY_CLASS_RS_PKMN_RANGER_F       67\n#define FACILITY_CLASS_MAGMA_LEADER_MAXIE     68\n#define FACILITY_CLASS_MAGMA_GRUNT_M          69\n#define FACILITY_CLASS_MAGMA_GRUNT_F          70\n#define FACILITY_CLASS_RS_LASS                71\n#define FACILITY_CLASS_RS_BUG_CATCHER         72\n#define FACILITY_CLASS_RS_HIKER               73\n#define FACILITY_CLASS_RS_YOUNG_COUPLE        74\n#define FACILITY_CLASS_OLD_COUPLE             75\n#define FACILITY_CLASS_RS_SIS_AND_BRO         76\n#define FACILITY_CLASS_AQUA_ADMIN_M           77\n#define FACILITY_CLASS_AQUA_ADMIN_F           78\n#define FACILITY_CLASS_MAGMA_ADMIN_M          79\n#define FACILITY_CLASS_MAGMA_ADMIN_F          80\n#define FACILITY_CLASS_LEADER_WATTSON         81\n#define FACILITY_CLASS_LEADER_FLANNERY        82\n#define FACILITY_CLASS_LEADER_NORMAN          83\n#define FACILITY_CLASS_LEADER_WINONA          84\n#define FACILITY_CLASS_LEADER_WALLACE         85\n#define FACILITY_CLASS_ELITE_FOUR_GLACIA      86\n#define FACILITY_CLASS_ELITE_FOUR_DRAKE       87\n#define FACILITY_CLASS_YOUNGSTER              88\n#define FACILITY_CLASS_BUG_CATCHER            89\n#define FACILITY_CLASS_LASS                   90\n#define FACILITY_CLASS_SAILOR                 91\n#define FACILITY_CLASS_CAMPER                 92\n#define FACILITY_CLASS_PICNICKER              93\n#define FACILITY_CLASS_POKEMANIAC             94\n#define FACILITY_CLASS_SUPER_NERD             95\n#define FACILITY_CLASS_HIKER                  96\n#define FACILITY_CLASS_BIKER                  97\n#define FACILITY_CLASS_BURGLAR                98\n#define FACILITY_CLASS_ENGINEER               99\n#define FACILITY_CLASS_FISHERMAN              100\n#define FACILITY_CLASS_SWIMMER_M              101\n#define FACILITY_CLASS_CUE_BALL               102\n#define FACILITY_CLASS_GAMER                  103\n#define FACILITY_CLASS_BEAUTY                 104\n#define FACILITY_CLASS_SWIMMER_F              105\n#define FACILITY_CLASS_PSYCHIC_M              106\n#define FACILITY_CLASS_ROCKER                 107\n#define FACILITY_CLASS_JUGGLER                108\n#define FACILITY_CLASS_TAMER                  109\n#define FACILITY_CLASS_BIRD_KEEPER            110\n#define FACILITY_CLASS_BLACK_BELT             111\n#define FACILITY_CLASS_RIVAL_EARLY            112\n#define FACILITY_CLASS_SCIENTIST              113\n#define FACILITY_CLASS_BOSS                   114\n#define FACILITY_CLASS_ROCKET_GRUNT_M         115\n#define FACILITY_CLASS_COOLTRAINER_M          116\n#define FACILITY_CLASS_COOLTRAINER_F          117\n#define FACILITY_CLASS_ELITE_FOUR_LORELEI     118\n#define FACILITY_CLASS_ELITE_FOUR_BRUNO       119\n#define FACILITY_CLASS_LEADER_M               120\n#define FACILITY_CLASS_LEADER_F               121\n#define FACILITY_CLASS_GENTLEMAN              122\n#define FACILITY_CLASS_RIVAL_LATE             123\n#define FACILITY_CLASS_CHAMPION_RIVAL         124\n#define FACILITY_CLASS_CHANNELER              125\n#define FACILITY_CLASS_TWINS                  126\n#define FACILITY_CLASS_COOL_COUPLE            127\n#define FACILITY_CLASS_YOUNG_COUPLE           128\n#define FACILITY_CLASS_CRUSH_KIN              129\n#define FACILITY_CLASS_SIS_AND_BRO            130\n#define FACILITY_CLASS_PKMN_PROF              131\n#define FACILITY_CLASS_BRENDAN                132\n#define FACILITY_CLASS_MAY                    133\n#define FACILITY_CLASS_RED                    134\n#define FACILITY_CLASS_LEAF                   135\n#define FACILITY_CLASS_ROCKET_GRUNT_F         136\n#define FACILITY_CLASS_PSYCHIC_F              137\n#define FACILITY_CLASS_CRUSH_GIRL             138\n#define FACILITY_CLASS_TUBER                  139\n#define FACILITY_CLASS_PKMN_BREEDER           140\n#define FACILITY_CLASS_PKMN_RANGER_M          141\n#define FACILITY_CLASS_PKMN_RANGER_F          142\n#define FACILITY_CLASS_AROMA_LADY             143\n#define FACILITY_CLASS_RUIN_MANIAC            144\n#define FACILITY_CLASS_LADY                   145\n#define FACILITY_CLASS_PAINTER                146\n#define FACILITY_CLASS_ELITE_FOUR_AGATHA      147\n#define FACILITY_CLASS_ELITE_FOUR_LANCE       148\n#define FACILITY_CLASS_CHAMPION_RIVAL_2       149\n#define FACILITY_CLASS_EM_BRENDAN             150\n#define FACILITY_CLASS_EM_MAY                 151\n\n#define F_TRAINER_FEMALE (1 << 7)\n\n// All trainer parties specify the IV, level, and species for each Pokémon in the\n// party. Some trainer parties also specify held items and custom moves for each\n// Pokémon.\n#define F_TRAINER_PARTY_CUSTOM_MOVESET (1 << 0)\n#define F_TRAINER_PARTY_HELD_ITEM      (1 << 1)\n#define F_TRAINER_PARTY_EVS            (1 << 2)\n\n#endif  // GUARD_CONSTANTS_TRAINERS_H\n"
  },
  {
    "path": "include/constants/union_room.h",
    "content": "#ifndef GUARD_CONSTANTS_UNION_ROOM_H\n#define GUARD_CONSTANTS_UNION_ROOM_H\n\n// The number of possible group leaders visible in the Union Room.\n// Note that this is different than the number of people actively\n// connected as children via the Wireless Adapter, which cannot\n// exceed RFU_CHILD_MAX (4), for a total of 5 including the player.\n#define MAX_UNION_ROOM_LEADERS 8\n\n#define UNION_ROOM_SPAWN_NONE 0\n#define UNION_ROOM_SPAWN_IN   1\n#define UNION_ROOM_SPAWN_OUT  2\n\n#define UNION_ROOM_MAX_LEVEL 30\n\n// The number of possible trainer classes for a trainer of a given gender in the Union Room.\n// This value is necessarily a power of 2 because of the way it's treated in GetUnionRoomTrainerPic / GetUnionRoomTrainerClass\n#define NUM_UNION_ROOM_CLASSES (1 << 3) // 8\n\n#define ACTIVITY_NONE               0\n#define ACTIVITY_BATTLE_SINGLE      1\n#define ACTIVITY_BATTLE_DOUBLE      2\n#define ACTIVITY_BATTLE_MULTI       3\n#define ACTIVITY_TRADE              4\n#define ACTIVITY_CHAT               5\n#define ACTIVITY_WONDER_CARD_DUP    6 // Duplicates of later WONDER constants\n#define ACTIVITY_WONDER_NEWS_DUP    7 //\n#define ACTIVITY_CARD               8\n#define ACTIVITY_POKEMON_JUMP       9\n#define ACTIVITY_BERRY_CRUSH        10\n#define ACTIVITY_BERRY_PICK         11\n#define ACTIVITY_SEARCH             12\n#define ACTIVITY_SPIN_TRADE         13\n#define ACTIVITY_ITEM_TRADE         14 // Replaced with ACTIVITY_BATTLE_TOWER_OPEN in Emerald\n#define ACTIVITY_RECORD_CORNER      15\n#define ACTIVITY_BERRY_BLENDER      16\n\n// Player response\n#define ACTIVITY_ACCEPT             17\n#define ACTIVITY_DECLINE            18\n\n#define ACTIVITY_NPCTALK            19\n#define ACTIVITY_PLYRTALK           20\n\n#define ACTIVITY_WONDER_CARD        21\n#define ACTIVITY_WONDER_NEWS        22\n\n#define IN_UNION_ROOM               (1 << 6)\n\n#define LINK_GROUP_SINGLE_BATTLE        0\n#define LINK_GROUP_DOUBLE_BATTLE        1\n#define LINK_GROUP_MULTI_BATTLE         2\n#define LINK_GROUP_TRADE                3\n#define LINK_GROUP_POKEMON_JUMP         4\n#define LINK_GROUP_BERRY_CRUSH          5\n#define LINK_GROUP_BERRY_PICKING        6\n#define LINK_GROUP_WONDER_CARD          7\n#define LINK_GROUP_WONDER_NEWS          8\n#define LINK_GROUP_UNION_ROOM_RESUME    9\n#define LINK_GROUP_UNION_ROOM_INIT     10\n#define LINK_GROUP_UNK_11              11\n#define LINK_GROUP_UNK_12              12\n#define NUM_LINK_GROUP_TYPES           13\n\n#define UR_TRADE_MATCH  0\n#define UR_TRADE_NOTYPE 1\n#define UR_TRADE_NOEGG  2\n\n#define UR_TRADE_READY             0\n#define UR_TRADE_PLAYER_NOT_READY  1\n#define UR_TRADE_PARTNER_NOT_READY 2\n\n#define UR_INTERACT_PLAYER_1   1\n#define UR_INTERACT_PLAYER_2   2\n#define UR_INTERACT_PLAYER_3   3\n#define UR_INTERACT_PLAYER_4   4\n#define UR_INTERACT_PLAYER_5   5\n#define UR_INTERACT_PLAYER_6   6\n#define UR_INTERACT_PLAYER_7   7\n#define UR_INTERACT_PLAYER_8   8\n#define UR_INTERACT_ATTENDANT  9\n#define UR_INTERACT_UNUSED     10\n#define UR_INTERACT_START_MENU 11\n\n#endif //GUARD_CONSTANTS_UNION_ROOM_H\n"
  },
  {
    "path": "include/constants/vars.h",
    "content": "#ifndef GUARD_CONSTANTS_VARS_H\n#define GUARD_CONSTANTS_VARS_H\n\n#define VARS_START 0x4000\n\n// Temporary variables. Temp vars are cleared every time a map is loaded.\n#define TEMP_VARS_START            0x4000\n#define VAR_TEMP_0                 (TEMP_VARS_START + 0x0)\n#define VAR_TEMP_1                 (TEMP_VARS_START + 0x1)\n#define VAR_TEMP_2                 (TEMP_VARS_START + 0x2)\n#define VAR_TEMP_3                 (TEMP_VARS_START + 0x3)\n#define VAR_TEMP_4                 (TEMP_VARS_START + 0x4)\n#define VAR_TEMP_5                 (TEMP_VARS_START + 0x5)\n#define VAR_TEMP_6                 (TEMP_VARS_START + 0x6)\n#define VAR_TEMP_7                 (TEMP_VARS_START + 0x7)\n#define VAR_TEMP_8                 (TEMP_VARS_START + 0x8)\n#define VAR_TEMP_9                 (TEMP_VARS_START + 0x9)\n#define VAR_TEMP_A                 (TEMP_VARS_START + 0xA)\n#define VAR_TEMP_B                 (TEMP_VARS_START + 0xB)\n#define VAR_TEMP_C                 (TEMP_VARS_START + 0xC)\n#define VAR_TEMP_D                 (TEMP_VARS_START + 0xD)\n#define VAR_TEMP_E                 (TEMP_VARS_START + 0xE)\n#define VAR_TEMP_F                 (TEMP_VARS_START + 0xF)\n#define TEMP_VARS_END              VAR_TEMP_F\n\n// Object event graphics IDs which can be changed by\n// script commands.\n#define VAR_OBJ_GFX_ID_0                    0x4010\n#define VAR_OBJ_GFX_ID_1                    0x4011\n#define VAR_OBJ_GFX_ID_2                    0x4012\n#define VAR_OBJ_GFX_ID_3                    0x4013\n#define VAR_OBJ_GFX_ID_4                    0x4014\n#define VAR_OBJ_GFX_ID_5                    0x4015\n#define VAR_OBJ_GFX_ID_6                    0x4016\n#define VAR_OBJ_GFX_ID_7                    0x4017\n#define VAR_OBJ_GFX_ID_8                    0x4018\n#define VAR_OBJ_GFX_ID_9                    0x4019\n#define VAR_OBJ_GFX_ID_A                    0x401A\n#define VAR_OBJ_GFX_ID_B                    0x401B\n#define VAR_OBJ_GFX_ID_C                    0x401C\n#define VAR_OBJ_GFX_ID_D                    0x401D\n#define VAR_OBJ_GFX_ID_E                    0x401E\n#define VAR_OBJ_GFX_ID_F                    0x401F\n\n// If nonzero, counts down by one every step.\n// When it hits zero, repel's effect wears off.\n#define VAR_REPEL_STEP_COUNT                0x4020\n\n// Counts up every step. Wraps around at 128.\n// When wraparound occurs, the friendship of\n// every party poke gets a slight boost.\n#define VAR_HAPPINESS_STEP_COUNTER          0x4021\n\n// Counts up every step while a party Pokemon is\n// poisoned. Wraps around at 5. When wraparound\n// occurs, every party Pokemon with the PSN status\n// takes 1 point of damage.\n// This is a deviation from the typical rate in\n// the series, which is 1 damage every 4 steps.\n#define VAR_POISON_STEP_COUNTER             0x4022\n\n// Step counter. Caps at 1500. If you enter a map with\n// renewable hidden items and this counter is capped,\n// the counter resets to 0 and all renewable hidden\n// item flags are resampled.\n#define VAR_RENEWABLE_ITEM_STEP_COUNTER     0x4023\n\n// Determines which wild encounter set to use in the\n// Altering Cave. Incremented by Mystery Event.\n// Wraps around at 10.\n#define VAR_ALTERING_CAVE_WILD_SET          0x4024\n\n// Step counter set to 500 at game start. When you get\n// a massage from Daisy, it resets to 0. Caps at 500.\n#define VAR_MASSAGE_COOLDOWN_STEP_COUNTER   0x4025\n\n// Step counter. Wraps around at 100. Used to\n// determine whether the player has reached the\n// triangle in time.\n#define VAR_DEOXYS_INTERACTION_STEP_COUNTER 0x4026\n\n// Bits 0-11 are the number of mons in all boxes\n// with the species sanity bit set.\n// Bits 12-15 are the same for the player's party.\n// Used by Quest Log.\n#define VAR_QUEST_LOG_MON_COUNTS           0x4027\n#define VAR_WONDER_NEWS_STEP_COUNTER       0x4028\n#define VAR_LAST_REPEL_USED                0x4029\n#define VAR_BATTLE_HOUSE                   0x402A //usage overflows into next var\n#define VAR_BATTLE_HOUSE2                  0x402B \n#define VAR_0x402C                         0x402C\n#define VAR_DAYCARE_MAN_TRIGGERS           0x402D\n\n#define VAR_GLASS_WORKSHOP_STATE           0x402E\n#define VAR_ASH_GATHER_COUNT               0x402F\n\n#define VAR_ICE_STEP_COUNT                 0x4030\n#define VAR_STARTER_MON                    0x4031 // 0: Bulbasaur, 1: Squirtle, 2: Charmander\n#define VAR_RESET_RTC_ENABLE               0x4032\n#define VAR_ENIGMA_BERRY_AVAILABLE         0x4033\n\n#define VAR_CABLE_CAR_STATION_STATE        0x4034\n#define VAR_RESORT_GOREGEOUS_STEP_COUNTER  0x4035\n#define VAR_RESORT_GORGEOUS_REQUESTED_MON  0x4036\n#define VAR_PC_BOX_TO_SEND_MON             0x4037\n#define VAR_FANCLUB_FAN_COUNTER            0x4038\n#define VAR_FANCLUB_LOSE_FAN_TIMER         0x4039\n#define VAR_ELEVATOR_FLOOR                 0x403A\n#define VAR_RESORT_GORGEOUS_REWARD         0x403B\n#define VAR_0x403C                         0x403C // Set to 0x0302, never read\n#define VAR_HERACROSS_SIZE_RECORD          0x403D\n#define VAR_DEOXYS_INTERACTION_NUM         0x403E\n#define VAR_0x403F                         0x403F\n#define VAR_MAGIKARP_SIZE_RECORD           0x4040\n#define VAR_0x4041                         0x4041\n#define VAR_TRAINER_CARD_MON_ICON_TINT_IDX 0x4042\n#define VAR_TRAINER_CARD_MON_ICON_1        0x4043\n#define VAR_TRAINER_CARD_MON_ICON_2        0x4044\n#define VAR_TRAINER_CARD_MON_ICON_3        0x4045\n#define VAR_TRAINER_CARD_MON_ICON_4        0x4046\n#define VAR_TRAINER_CARD_MON_ICON_5        0x4047\n#define VAR_TRAINER_CARD_MON_ICON_6        0x4048\n#define VAR_HOF_BRAG_STATE                 0x4049\n#define VAR_EGG_BRAG_STATE                 0x404A\n#define VAR_LINK_WIN_BRAG_STATE            0x404B\n#define VAR_POKELOT_RND2                   0x404C\n#define VAR_QL_ENTRANCE                    0x404D\n#define VAR_NATIONAL_DEX                   0x404E\n#define VAR_LOTAD_SIZE_RECORD              0x404F\n\n// Map Scene\n#define VAR_MAP_SCENE_PALLET_TOWN_OAK                                          0x4050\n#define VAR_MAP_SCENE_VIRIDIAN_CITY_OLD_MAN                                    0x4051\n#define VAR_MAP_SCENE_CERULEAN_CITY_RIVAL                                      0x4052\n#define VAR_VERMILION_CITY_TICKET_CHECK_TRIGGER                                0x4053\n#define VAR_MAP_SCENE_ROUTE22                                                  0x4054\n#define VAR_MAP_SCENE_PALLET_TOWN_PROFESSOR_OAKS_LAB                           0x4055\n#define VAR_MAP_SCENE_PALLET_TOWN_PLAYERS_HOUSE_2F                             0x4056\n#define VAR_MAP_SCENE_VIRIDIAN_CITY_MART                                       0x4057\n#define VAR_MAP_SCENE_PALLET_TOWN_RIVALS_HOUSE                                 0x4058\n#define VAR_MAP_SCENE_POKEMON_TOWER_6F                                         0x4059\n#define VAR_MAP_SCENE_VIRIDIAN_CITY_GYM_DOOR                                   0x405A\n#define VAR_MAP_SCENE_S_S_ANNE_2F_CORRIDOR                                     0x405B\n#define VAR_MAP_SCENE_SILPH_CO_7F                                              0x405C\n#define VAR_MAP_SCENE_POKEMON_TOWER_2F                                         0x405D\n#define VAR_MAP_SCENE_ROUTE16                                                  0x405E\n#define VAR_MAP_SCENE_ROUTE23                                                  0x405F\n#define VAR_MAP_SCENE_SILPH_CO_11F                                             0x4060\n#define VAR_MAP_SCENE_PEWTER_CITY_MUSEUM_1F                                    0x4061\n#define VAR_MAP_SCENE_ROUTE5_ROUTE6_ROUTE7_ROUTE8_GATES                        0x4062\n#define VAR_MAP_SCENE_SEAFOAM_ISLANDS_B4F                                      0x4063\n#define VAR_MAP_SCENE_VICTORY_ROAD_1F                                          0x4064\n#define VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER1                                 0x4065\n#define VAR_MAP_SCENE_VICTORY_ROAD_2F_BOULDER2                                 0x4066\n#define VAR_MAP_SCENE_VICTORY_ROAD_3F                                          0x4067\n#define VAR_MAP_SCENE_POKEMON_LEAGUE                                           0x4068\n#define VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_WHICH_FOSSIL 0x4069\n#define VAR_MAP_SCENE_CINNABAR_ISLAND_POKEMON_LAB_EXPERIMENT_ROOM_REVIVE_STATE 0x406A\n#define VAR_MAP_SCENE_ROUTE24                                                  0x406B\n#define VAR_MAP_SCENE_PEWTER_CITY                                              0x406C\n#define VAR_0x406D                                                             0x406D\n#define VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE                        0x406E\n#define VAR_CABLE_CLUB_STATE                                                   0x406F\n#define VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY                                    0x4070\n#define VAR_MAP_SCENE_CINNABAR_ISLAND                                          0x4071\n#define VAR_0x4072                                                             0x4072\n#define VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB                    0x4073\n#define VAR_MAP_SCENE_SEVEN_ISLAND_HOUSE_ROOM1                                 0x4074\n#define VAR_MAP_SCENE_ONE_ISLAND_HARBOR                                        0x4075\n#define VAR_MAP_SCENE_ONE_ISLAND_POKEMON_CENTER_1F                             0x4076\n#define VAR_0x4077                                                             0x4077\n#define VAR_MAP_SCENE_TWO_ISLAND                                               0x4078\n#define VAR_MAP_SCENE_TWO_ISLAND_JOYFUL_GAME_CORNER                            0x4079\n#define VAR_0x407A                                                             0x407A\n#define VAR_MAP_SCENE_THREE_ISLAND                                             0x407B\n#define VAR_MAP_SCENE_POKEMON_CENTER_TEALA                                     0x407C\n#define VAR_MAP_SCENE_CERULEAN_CITY_ROCKET                                     0x407D\n#define VAR_MAP_SCENE_VERMILION_CITY                                           0x407E\n#define VAR_MAP_SCENE_MT_EMBER_EXTERIOR                                        0x407F\n#define VAR_MAP_SCENE_ICEFALL_CAVE_BACK                                        0x4080\n#define VAR_MAP_SCENE_SAFFRON_CITY_DOJO                                        0x4081\n#define VAR_MAP_SCENE_TRAINER_TOWER                                            0x4082\n#define VAR_MAP_SCENE_FIVE_ISLAND_LOST_CAVE_ROOM10                             0x4083\n#define VAR_MAP_SCENE_FIVE_ISLAND_RESORT_GORGEOUS                              0x4084\n#define VAR_MAP_SCENE_INDIGO_PLATEAU_EXTERIOR                                  0x4085\n#define VAR_MAP_SCENE_FOUR_ISLAND                                              0x4086\n#define VAR_0x4087                                                             0x4087\n#define VAR_MAP_SCENE_ROCKET_WAREHOUSE                                         0x4088\n#define VAR_MAP_SCENE_SIX_ISLAND_POKEMON_CENTER_1F                             0x4089\n#define VAR_MAP_SCENE_CINNABAR_ISLAND_2                                        0x408A\n#define VAR_MAP_SCENE_MT_MOON_B2F                                              0x408B\n\n\n#define VAR_FARAWAY_ISLAND_STEP_COUNTER  0x408C\n#define VAR_0x408D                 0x408D\n#define VAR_0x408E                 0x408E\n#define VAR_0x408F                 0x408F\n#define VAR_0x4090                 0x4090\n#define VAR_0x4091                 0x4091\n#define VAR_0x4092                 0x4092\n#define VAR_0x4093                 0x4093\n#define VAR_0x4094                 0x4094\n#define VAR_0x4095                 0x4095\n#define VAR_0x4096                 0x4096\n#define VAR_0x4097                 0x4097\n#define VAR_0x4098                 0x4098\n#define VAR_0x4099                 0x4099\n#define VAR_0x409A                 0x409A\n#define VAR_0x409B                 0x409B\n#define VAR_0x409C                 0x409C\n#define VAR_0x409D                 0x409D\n#define VAR_0x409E                 0x409E\n#define VAR_0x409F                 0x409F\n#define VAR_0x40A0                 0x40A0\n#define VAR_0x40A1                 0x40A1\n#define VAR_0x40A2                 0x40A2\n#define VAR_0x40A3                 0x40A3\n#define VAR_0x40A4                 0x40A4\n#define VAR_0x40A5                 0x40A5\n#define VAR_0x40A6                 0x40A6\n#define VAR_0x40A7                 0x40A7\n#define VAR_0x40A8                 0x40A8\n#define VAR_0x40A9                 0x40A9\n\n#define VAR_QLBAK_TRAINER_REMATCHES 0x40AA // array of 4\n#define VAR_QLBAK_MAP_LAYOUT        0x40AE\n\n#define VAR_0x40AF                 0x40AF\n#define VAR_0x40B0                 0x40B0\n#define VAR_0x40B1                 0x40B1\n#define VAR_0x40B2                 0x40B2\n#define VAR_0x40B3                 0x40B3\n#define VAR_PORTHOLE               0x40B4\n#define VAR_EVENT_PICHU_SLOT       0x40B5\n#define VAR_MYSTERY_GIFT_1         0x40B6\n#define VAR_MYSTERY_GIFT_2         0x40B7\n#define VAR_MYSTERY_GIFT_3         0x40B8\n#define VAR_MYSTERY_GIFT_4         0x40B9\n#define VAR_MYSTERY_GIFT_5         0x40BA\n#define VAR_MYSTERY_GIFT_6         0x40BB\n#define VAR_MYSTERY_GIFT_7         0x40BC\n#define VAR_0x40BD                 0x40BD\n#define VAR_0x40BE                 0x40BE\n#define VAR_0x40BF                 0x40BF\n#define VAR_0x40C0                 0x40C0\n#define VAR_0x40C1                 0x40C1\n#define VAR_0x40C2                 0x40C2\n#define VAR_0x40C3                 0x40C3\n#define VAR_0x40C4                 0x40C4\n#define VAR_0x40C5                 0x40C5\n#define VAR_0x40C6                 0x40C6\n#define VAR_0x40C7                 0x40C7\n#define VAR_0x40C8                 0x40C8\n#define VAR_0x40C9                 0x40C9\n#define VAR_0x40CA                 0x40CA\n#define VAR_0x40CB                 0x40CB\n#define VAR_0x40CC                 0x40CC\n#define VAR_0x40CD                 0x40CD\n#define VAR_0x40CE                 0x40CE\n#define VAR_FRONTIER_FACILITY      0x40CF\n#define VAR_0x40D0                 0x40D0\n#define VAR_0x40D1                 0x40D1\n#define VAR_0x40D2                 0x40D2\n#define VAR_0x40D3                 0x40D3\n#define VAR_0x40D4                 0x40D4\n#define VAR_0x40D5                 0x40D5\n#define VAR_0x40D6                 0x40D6\n#define VAR_0x40D7                 0x40D7\n#define VAR_0x40D8                 0x40D8\n#define VAR_0x40D9                 0x40D9\n#define VAR_0x40DA                 0x40DA\n#define VAR_0x40DB                 0x40DB\n#define VAR_0x40DC                 0x40DC\n#define VAR_0x40DD                 0x40DD\n#define VAR_0x40DE                 0x40DE\n#define VAR_0x40DF                 0x40DF\n#define VAR_0x40E0                 0x40E0\n#define VAR_0x40E1                 0x40E1\n#define VAR_0x40E2                 0x40E2\n#define VAR_0x40E3                 0x40E3\n#define VAR_0x40E4                 0x40E4\n#define VAR_0x40E5                 0x40E5\n#define VAR_DAILY_SLOTS            0x40E6\n#define VAR_DAILY_WILDS            0x40E7\n#define VAR_DAILY_BLENDER          0x40E8\n#define VAR_DAILY_PLANTED_BERRIES  0x40E9\n#define VAR_DAILY_PICKED_BERRIES   0x40EA\n#define VAR_DAILY_ROULETTE         0x40EB\n#define VAR_0x40EC                 0x40EC\n#define VAR_0x40ED                 0x40ED\n#define VAR_0x40EE                 0x40EE\n#define VAR_0x40EF                 0x40EF\n#define VAR_0x40F0                 0x40F0\n#define VAR_DAILY_BP               0x40F1\n#define VAR_0x40F2                 0x40F2\n#define VAR_0x40F3                 0x40F3\n#define VAR_0x40F4                 0x40F4\n#define VAR_0x40F5                 0x40F5\n#define VAR_0x40F6                 0x40F6\n#define VAR_0x40F7                 0x40F7\n#define VAR_0x40F8                 0x40F8\n#define VAR_0x40F9                 0x40F9\n#define VAR_0x40FA                 0x40FA\n#define VAR_0x40FB                 0x40FB\n#define VAR_0x40FC                 0x40FC\n#define VAR_0x40FD                 0x40FD\n#define VAR_0x40FE                 0x40FE\n#define VAR_0x40FF                 0x40FF\n\n#define VARS_END                   0x40FF\n#define VARS_COUNT                 (VARS_END - VARS_START + 1)\n\n#define SPECIAL_VARS_START         0x8000\n\n#define VAR_0x8000                 0x8000\n#define VAR_0x8001                 0x8001\n#define VAR_0x8002                 0x8002\n#define VAR_0x8003                 0x8003\n#define VAR_0x8004                 0x8004\n#define VAR_0x8005                 0x8005\n#define VAR_0x8006                 0x8006\n#define VAR_0x8007                 0x8007\n#define VAR_0x8008                 0x8008\n#define VAR_0x8009                 0x8009\n#define VAR_0x800A                 0x800A\n#define VAR_0x800B                 0x800B\n#define VAR_FACING                 0x800C\n#define VAR_RESULT                 0x800D\n#define VAR_ITEM_ID                0x800E\n#define VAR_LAST_TALKED            0x800F\n#define VAR_MON_BOX_ID             0x8010\n#define VAR_MON_BOX_POS            0x8011\n#define VAR_TEXT_COLOR             0x8012\n#define VAR_PREV_TEXT_COLOR        0x8013\n#define VAR_0x8014                 0x8014 // Unknown/unused\n\n#define SPECIAL_VARS_END           0x8014\n\n// Text color ids for VAR_TEXT_COLOR / VAR_PREV_TEXT_COLOR\n#define NPC_TEXT_COLOR_MALE      0 // Blue, for male NPCs\n#define NPC_TEXT_COLOR_FEMALE    1 // Red, for female NPCs\n#define NPC_TEXT_COLOR_MON       2 // Black, for Pokémon\n#define NPC_TEXT_COLOR_NEUTRAL   3 // Black, for inanimate objects and messages from the game\n#define NPC_TEXT_COLOR_DEFAULT 255 // If an NPC is selected, use the color specified by GetColorFromTextColorTable, otherwise use Neutral.\n\n#endif // GUARD_CONSTANTS_VARS_H\n"
  },
  {
    "path": "include/constants/weather.h",
    "content": "#ifndef GUARD_CONSTANTS_WEATHER_H\n#define GUARD_CONSTANTS_WEATHER_H\n\n#define WEATHER_NONE               0\n#define WEATHER_SUNNY_CLOUDS       1   // unused\n#define WEATHER_SUNNY              2\n#define WEATHER_RAIN               3   // unused\n#define WEATHER_SNOW               4   // unused\n#define WEATHER_RAIN_THUNDERSTORM  5   // unused\n#define WEATHER_FOG_HORIZONTAL     6\n#define WEATHER_VOLCANIC_ASH       7   // unused\n#define WEATHER_SANDSTORM          8   // unused\n#define WEATHER_FOG_DIAGONAL       9   // unused\n#define WEATHER_UNDERWATER         10  // unused\n#define WEATHER_SHADE              11\n#define WEATHER_DROUGHT            12  // unused and broken in overworld\n#define WEATHER_DOWNPOUR           13  // unused\n#define WEATHER_UNDERWATER_BUBBLES 14  // unused\n#define WEATHER_ABNORMAL           15  // unused\n#define WEATHER_ROUTE119_CYCLE     20  // unused\n#define WEATHER_ROUTE123_CYCLE     21  // unused\n\n// These are used in maps' coord_weather_event entries.\n// They are not a one-to-one mapping with the engine's\n// internal weather constants above.\n#define COORD_EVENT_WEATHER_SUNNY_CLOUDS        1\n#define COORD_EVENT_WEATHER_SUNNY               2\n#define COORD_EVENT_WEATHER_RAIN                3\n#define COORD_EVENT_WEATHER_SNOW                4\n#define COORD_EVENT_WEATHER_RAIN_THUNDERSTORM   5\n#define COORD_EVENT_WEATHER_FOG_HORIZONTAL      6\n#define COORD_EVENT_WEATHER_FOG_DIAGONAL        7\n#define COORD_EVENT_WEATHER_VOLCANIC_ASH        8\n#define COORD_EVENT_WEATHER_SANDSTORM           9\n#define COORD_EVENT_WEATHER_SHADE               10\n#define COORD_EVENT_WEATHER_DROUGHT             11\n#define COORD_EVENT_WEATHER_ROUTE119_CYCLE      20\n#define COORD_EVENT_WEATHER_ROUTE123_CYCLE      21\n\n#endif  // GUARD_CONSTANTS_WEATHER_H\n"
  },
  {
    "path": "include/coord_event_weather.h",
    "content": "#ifndef GUARD_COORD_EVENT_WEATHER_H\n#define GUARD_COORD_EVENT_WEATHER_H\n\nvoid DoCoordEventWeather(u8 weatherId);\n\n#endif //GUARD_COORD_EVENT_WEATHER_H\n"
  },
  {
    "path": "include/credits.h",
    "content": "#ifndef GUARD_CREDITS_H\n#define GUARD_CREDITS_H\n\nextern bool8 gHasHallOfFameRecords;\n\n#define CREDITSOVWLDCMD_FB 0xFB\n#define CREDITSOVWLDCMD_FC 0xFC\n#define CREDITSOVWLDCMD_END 0xFD\n#define CREDITSOVWLDCMD_LOADMAP 0xFE\n#define CREDITSOVWLDCMD_FF 0xFF\n\n#define CREDITSOVWLDLOADMAP(_map, _x, _y, _delay)           \\\n    { CREDITSOVWLDCMD_LOADMAP, MAP_GROUP(_map), MAP_NUM(_map) }, \\\n    { _x, _y, _delay }\n\n#define CREDITSOVWLDSCROLL(_xspeed, _yspeed, _length) \\\n    { _xspeed, _yspeed, _length }\n\n#define CREDITSOVWLDEND \\\n    { CREDITSOVWLDCMD_END, CREDITSOVWLDCMD_END, CREDITSOVWLDCMD_END }\n\n#endif //GUARD_CREDITS_H\n"
  },
  {
    "path": "include/data.h",
    "content": "#ifndef GUARD_DATA_H\n#define GUARD_DATA_H\n\n#include \"global.h\"\n\n#define SPECIES_SHINY_TAG 500\n#define TRAINER_ENCOUNTER_MUSIC(trainer)((gTrainers[trainer].encounterMusic_gender & 0x7F))\n\nstruct MonCoords\n{\n    // This would use a bitfield, but some function\n    // uses it as a u8 and casting won't match.\n    u8 size; // u8 width:4, height:4;\n    u8 y_offset;\n};\n\n#define MON_COORDS_SIZE(width, height)(DIV_ROUND_UP(width, 8) << 4 | DIV_ROUND_UP(height, 8))\n#define GET_MON_COORDS_WIDTH(size)((size >> 4) * 8)\n#define GET_MON_COORDS_HEIGHT(size)((size & 0xF) * 8)\n\nextern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];\nextern const u8 gMoveNames[][MOVE_NAME_LENGTH + 1];\n\nextern const u8 gTrainerClassNames[][13];\n\nextern const struct MonCoords gMonFrontPicCoords[];\nextern const struct CompressedSpriteSheet gMonFrontPicTable[];\nextern const struct MonCoords gMonBackPicCoords[];\nextern const struct CompressedSpriteSheet gMonBackPicTable[];\nextern const struct CompressedSpritePalette gMonPaletteTable[];\nextern const struct CompressedSpritePalette gMonShinyPaletteTable[];\nextern const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[];\nextern const struct MonCoords gTrainerFrontPicCoords[];\nextern const struct CompressedSpriteSheet gTrainerFrontPicTable[];\nextern const struct CompressedSpriteSheet gTrainerBackPicTable[];\nextern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];\nextern const union AnimCmd *const *const gTrainerBackAnimsPtrTable[];\nextern const struct MonCoords gTrainerBackPicCoords[];\nextern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];\n\nextern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow;\nextern const struct SpriteTemplate gSpriteTemplate_EnemyShadow;\n\nextern const u8 gEnemyMonElevation[NUM_SPECIES];\n\nextern const u8 *const gBattleAnims_General[];\nextern const u8 *const gBattleAnims_Special[];\n\nextern const union AnimCmd *const gAnims_MonPic[];\nextern const union AffineAnimCmd *const gAffineAnims_BattleSpritePlayerSide[];\nextern const union AffineAnimCmd *const gAffineAnims_BattleSpriteOpponentSide[];\nextern const struct SpriteFrameImage gBattlerPicTable_PlayerLeft[];\nextern const struct SpriteFrameImage gBattlerPicTable_OpponentLeft[];\nextern const struct SpriteFrameImage gBattlerPicTable_PlayerRight[];\nextern const struct SpriteFrameImage gBattlerPicTable_OpponentRight[];\nextern const struct SpriteFrameImage gTrainerBackPicTable_Red[];\nextern const struct SpriteFrameImage gTrainerBackPicTable_Leaf[];\nextern const struct SpriteFrameImage gTrainerBackPicTable_Pokedude[];\nextern const struct SpriteFrameImage gTrainerBackPicTable_OldMan[];\nextern const struct SpriteFrameImage gTrainerBackPicTable_RSBrendan[];\nextern const struct SpriteFrameImage gTrainerBackPicTable_RSMay[];\nextern const struct SpriteFrameImage gTrainerBackPicTable_EmBrendan[];\nextern const struct SpriteFrameImage gTrainerBackPicTable_EmMay[];\n\n#endif // GUARD_DATA_H\n"
  },
  {
    "path": "include/daycare.h",
    "content": "#ifndef GUARD_DAYCARE_H\n#define GUARD_DAYCARE_H\n\n#include \"global.h\"\n\nu8 *GetMonNick(struct Pokemon *mon, u8 *dest);\nu8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest);\nu8 CountPokemonInDaycare(struct DayCare *daycare);\nvoid InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDayCareMail *daycareMail);\nvoid StoreSelectedPokemonInDaycare(void);\nu16 TakePokemonFromDaycare(void);\nvoid GetDaycareCost(void);\nu8 GetNumLevelsGainedFromDaycare(void);\nvoid TriggerPendingDaycareEgg(void);\nvoid RejectEggFromDayCare(void);\nvoid CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation);\nvoid GiveEggFromDaycare(void);\nbool8 DoEggActions_CheckHatch(void);\nu16 GetSelectedMonNickAndSpecies(void);\nvoid GetDaycareMonNicknames(void);\nu8 GetDaycareState(void);\nvoid SetDaycareCompatibilityString(void);\nbool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio);\nvoid ShowDaycareLevelMenu(void);\nvoid ChooseSendDaycareMon(void);\nvoid GiveRivalStarterEgg(void);\nvoid CheckDaycareMonsHaveMail(void);\nvoid IsPartyAndBoxesFull(void);\n\nvoid ScriptHatchMon(void);\nvoid EggHatch(void);\nu8 GetEggStepsToSubtract(void);\nbool8 ShouldEggHatch(void);\n\n#endif // GUARD_DAYCARE_H\n"
  },
  {
    "path": "include/decompress.h",
    "content": "#ifndef GUARD_DECOMPRESS_H\n#define GUARD_DECOMPRESS_H\n\n#include \"global.h\"\n\n#include \"sprite.h\"\n\nextern u8 gDecompressionBuffer[0x4000];\n\nvoid LZDecompressWram(const void *src, void *dest);\nvoid LZDecompressVram(const void *src, void *dest);\n\nu16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src);\nvoid LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer);\nbool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet* src);\n\nvoid LoadCompressedSpritePalette(const struct CompressedSpritePalette *src);\nvoid LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer);\nbool8 LoadCompressedSpritePaletteUsingHeap(const struct CompressedSpritePalette *src);\n\nvoid DecompressPicFromTable(const struct CompressedSpriteSheet *src, void *buffer, s32 species);\nvoid DecompressPicFromTable_2(const struct CompressedSpriteSheet *src, void *buffer, s32 species);\nvoid DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *buffer, s32 species);\n\nvoid HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality);\nvoid HandleLoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality);\n\nvoid LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic);\nvoid LoadSpecialPokePic_2(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic);\nvoid LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic);\n\nu32 GetDecompressedDataSize(const u8 *ptr);\n\n#endif // GUARD_DECOMPRESS_H\n"
  },
  {
    "path": "include/decoration.h",
    "content": "#ifndef GUARD_DECORATION_H\n#define GUARD_DECORATION_H\n\nenum DecorationPermission\n{\n    /*\n     * The nomenclature here describes collision and placement permissions, in that order.\n     */\n    DECORPERM_SOLID_FLOOR,\n    DECORPERM_PASS_FLOOR,\n    DECORPERM_BEHIND_FLOOR,\n    DECORPERM_NA_WALL,\n    DECORPERM_SPRITE,\n};\n\nenum DecorationShape\n{\n    DECORSHAPE_1x1,\n    DECORSHAPE_2x1,\n    DECORSHAPE_3x1, // unused\n    DECORSHAPE_4x2,\n    DECORSHAPE_2x2,\n    DECORSHAPE_1x2,\n    DECORSHAPE_1x3, // unused\n    DECORSHAPE_2x4,\n    DECORSHAPE_3x3,\n    DECORSHAPE_3x2,\n};\n\nenum DecorationCategory\n{\n    DECORCAT_DESK,\n    DECORCAT_CHAIR,\n    DECORCAT_PLANT,\n    DECORCAT_ORNAMENT,\n    DECORCAT_MAT,\n    DECORCAT_POSTER,\n    DECORCAT_DOLL,\n    DECORCAT_CUSHION,\n    DECORCAT_COUNT,\n};\n\nstruct Decoration\n{\n    u8 id;\n    u8 name[16];\n    u8 permission;\n    u8 shape;\n    u8 category;\n    u16 price;\n    const u8 *description;\n    const u16 *tiles;\n};\n\nextern const struct Decoration gDecorations[];\n\n#endif //GUARD_DECORATION_H\n"
  },
  {
    "path": "include/digit_obj_util.h",
    "content": "#ifndef GUARD_DIGIT_OBJ_UTIL_H\n#define GUARD_DIGIT_OBJ_UTIL_H\n\nstruct DigitObjUtilTemplate\n{\n    u8 strConvMode:2;\n    u8 shape:2;\n    u8 size:2;\n    u8 priority:2;\n    u8 oamCount;\n    u8 xDelta;\n    s16 x;\n    s16 y;\n    union\n    {\n        const struct SpriteSheet * uncompressed;\n        const struct CompressedSpriteSheet * compressed;\n    } spriteSheet;\n    const struct SpritePalette * spritePal;\n};\n\nextern const u16 gMinigameDigits_Pal[];\nextern const u32 gMinigameDigits_Gfx[];\n\nbool32 DigitObjUtil_Init(u32 count);\nvoid DigitObjUtil_Free(void);\nbool32 DigitObjUtil_CreatePrinter(u32 id, s32 num, const struct DigitObjUtilTemplate *template);\nvoid DigitObjUtil_PrintNumOn(u32 id, s32 num);\nvoid DigitObjUtil_DeletePrinter(u32 id);\nvoid DigitObjUtil_HideOrShow(u32 id, bool32 hide);\n\n#endif //GUARD_DIGIT_OBJ_UTIL_H\n"
  },
  {
    "path": "include/diploma.h",
    "content": "#ifndef GUARD_DIPLOMA_H\n#define GUARD_DIPLOMA_H\n\n#include \"global.h\"\n\nvoid CB2_ShowDiploma(void);\n\n#endif // GUARD_DIPLOMA_H\n"
  },
  {
    "path": "include/dma3.h",
    "content": "#ifndef GUARD_DMA3_H\n#define GUARD_DMA3_H\n\n#include \"global.h\"\n\n// Maximum amount of data we will transfer in one operation\n#define MAX_DMA_BLOCK_SIZE 0x1000\n\n#define DMA_REQUEST_COPY32 1\n#define DMA_REQUEST_FILL32 2\n#define DMA_REQUEST_COPY16 3\n#define DMA_REQUEST_FILL16 4\n\n#define DMA3_16BIT 0\n#define DMA3_32BIT 1\n\n#define Dma3CopyLarge_(src, dest, size, bit)               \\\n{                                                          \\\n    const void *_src = src;                                \\\n    void *_dest = dest;                                    \\\n    u32 _size = size;                                      \\\n    while (1)                                              \\\n    {                                                      \\\n        if (_size <= MAX_DMA_BLOCK_SIZE)                   \\\n        {                                                  \\\n            DmaCopy##bit(3, _src, _dest, _size);           \\\n            break;                                         \\\n        }                                                  \\\n        DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE);  \\\n        _src += MAX_DMA_BLOCK_SIZE;                        \\\n        _dest += MAX_DMA_BLOCK_SIZE;                       \\\n        _size -= MAX_DMA_BLOCK_SIZE;                       \\\n    }                                                      \\\n}\n\n#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16)\n#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32)\n\n#define Dma3FillLarge_(value, dest, size, bit)             \\\n{                                                          \\\n    void *_dest = dest;                                    \\\n    u32 _size = size;                                      \\\n    while (1)                                              \\\n    {                                                      \\\n        if (_size <= MAX_DMA_BLOCK_SIZE)                   \\\n        {                                                  \\\n            DmaFill##bit(3, value, _dest, _size);          \\\n            break;                                         \\\n        }                                                  \\\n        DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \\\n        _dest += MAX_DMA_BLOCK_SIZE;                       \\\n        _size -= MAX_DMA_BLOCK_SIZE;                       \\\n    }                                                      \\\n}\n\n#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)\n#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)\n\n// Cancel pending DMA3 requests\nvoid ClearDma3Requests(void);\n\n// Handle pending DMA3 requests\nvoid ProcessDma3Requests(void);\n\n// Copy size bytes from src to dest.\n// mode takes a DMA3_*BIT macro\n// Returns the request index\ns16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode);\n\n// Fill size bytes at dest with value.\n// mode takes a DMA3_*BIT macro\n// Returns the request index\ns16 RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode);\n\n// index is the return value from RequestDma3*\n// if index = -1, will check if any request is pending\n// otherwise, checks if the specified request is pending\n// Returns -1 if pending, 0 otherwise\ns16 WaitDma3Request(s16 index);\n\n#endif // GUARD_DMA3_H\n"
  },
  {
    "path": "include/dodrio_berry_picking.h",
    "content": "#ifndef GUARD_DODRIO_BERRY_PICKING_H\n#define GUARD_DODRIO_BERRY_PICKING_H\n\n// Berries fall in predefined columns.\n// A total of 10 are available, though fewer will be used with < 5 players\n// The 11th column is a repeat of the 1st column wrapped around, so only\n// the values 0-9 are unique 'valid' columns\n#define NUM_BERRY_COLUMNS 11\n\nstruct DodrioGame_Berries\n{\n    u8 ids[NUM_BERRY_COLUMNS];\n    u8 fallDist[NUM_BERRY_COLUMNS];\n};\n\nstruct DodrioGame_PlayerCommData\n{\n    u8 pickState;\n    bool8 ALIGNED(4) ateBerry;\n    bool8 ALIGNED(4) missedBerry;\n};\n\nstruct DodrioGame_Player\n{\n    u8 name[16];\n    bool32 receivedGameStatePacket; // Never read\n    struct DodrioGame_Berries berries;\n    struct DodrioGame_PlayerCommData comm;\n    u32 unused;\n}; // size = 0x3C\n\n// dodrio_berry_picking.c\nvoid StartDodrioBerryPicking(u16 partyId, MainCallback exitCallback);\nvoid ShowDodrioBerryPickingRecords(void);\nvoid IsDodrioInParty(void);\n\n// dodrio_berry_picking_comm.c\nvoid SendPacket_ReadyToStart(bool32 ready);\nbool8 RecvPacket_ReadyToStart(s32 playerId);\nvoid SendPacket_GameState(struct DodrioGame_Player *player,\n                          struct DodrioGame_PlayerCommData *player1,\n                          struct DodrioGame_PlayerCommData *player2,\n                          struct DodrioGame_PlayerCommData *player3,\n                          struct DodrioGame_PlayerCommData *player4,\n                          struct DodrioGame_PlayerCommData *player5,\n                          u8 numGraySquares,\n                          bool32 berriesFalling,\n                          bool32 allReadyToEnd);\nbool32 RecvPacket_GameState(u32 playerId,\n                            struct DodrioGame_Player *player,\n                            struct DodrioGame_PlayerCommData *player1,\n                            struct DodrioGame_PlayerCommData *player2,\n                            struct DodrioGame_PlayerCommData *player3,\n                            struct DodrioGame_PlayerCommData *player4,\n                            struct DodrioGame_PlayerCommData *player5,\n                            u8 *numGraySquares,\n                            bool32 *berriesFalling,\n                            bool32 *allReadyToEnd);\nvoid SendPacket_PickState(u8 pickState);\nbool32 RecvPacket_PickState(u32 playerId, u8 *pickState);\nvoid SendPacket_ReadyToEnd(bool32 readyToEnd);\nbool32 RecvPacket_ReadyToEnd(u32 playerId);\n\n#endif //GUARD_DODRIO_BERRY_PICKING_H\n"
  },
  {
    "path": "include/dynamic_placeholder_text_util.h",
    "content": "#ifndef GUARD_DYNAMIC_PLACEHOLDER_TEXT_UTIL_H\n#define GUARD_DYNAMIC_PLACEHOLDER_TEXT_UTIL_H\n\n#include \"global.h\"\n\nvoid DynamicPlaceholderTextUtil_Reset(void);\nvoid DynamicPlaceholderTextUtil_SetPlaceholderPtr(u8 idx, const u8 *ptr);\nu8 *DynamicPlaceholderTextUtil_ExpandPlaceholders(u8 *dest, const u8 *src);\nconst u8 *DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 idx);\nu8 GetColorFromTextColorTable(u16 graphicId);\n\n#endif //GUARD_DYNAMIC_PLACEHOLDER_TEXT_UTIL_H\n"
  },
  {
    "path": "include/easy_chat.h",
    "content": "#ifndef GUARD_EASY_CHAT_H\n#define GUARD_EASY_CHAT_H\n\n#include \"global.h\"\n#include \"constants/easy_chat.h\"\n\n#define NUM_ALPHABET_ROWS    4\n#define NUM_ALPHABET_COLUMNS 7\n\nstruct EasyChatWordInfo\n{\n    const u8 *text;\n    int alphabeticalOrder;\n    int enabled;\n};\n\ntypedef union\n{\n    const u16 *valueList;\n    const struct EasyChatWordInfo *words;\n} EasyChatGroupWordData;\n\nstruct EasyChatGroup\n{\n    EasyChatGroupWordData wordData;\n    u16 numWords;\n    u16 numEnabledWords;\n};\n\nstruct EasyChatWordsByLetter\n{\n    const u16 *words;\n    int numWords;\n};\n\nu8 *CopyEasyChatWord(u8 *dest, u16 word);\nu8 *ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows);\nbool8 EC_DoesEasyChatStringFitOnLine(const u16 *easyChatWords, u8 columns, u8 rows, u16 maxLength);\nvoid InitQuestionnaireWords(void);\nvoid InitEasyChatPhrases(void);\nvoid EnableRareWord(u8);\nbool8 InitEasyChatSelection(void);\nvoid DestroyEasyChatSelectionData(void);\nu8 GetSelectedGroupByIndex(u8);\nvoid GetUnlockedECWords(bool32 isAlphabetical, u16 groupId);\nu16 GetDisplayedWordByIndex(u16 index);\nu16 GetNumDisplayedWords(void);\nconst u8 *GetEasyChatWordGroupName(u8);\nu8 *CopyEasyChatWordPadded(u8 *, u16, u16);\nvoid DoEasyChatScreen(u8 type, u16 *words, MainCallback callback);\nu8 GetNumDisplayableGroups(void);\nbool8 InitEasyChatGraphicsWork(void);\nbool8 LoadEasyChatGraphics(void);\nvoid DestroyEasyChatGraphicsResources(void);\nvoid EasyChatInterfaceCommand_Setup(u16 id);\nbool8 EasyChatInterfaceCommand_Run(void);\nu8 GetEasyChatScreenFrameId(void);\nconst u8 *GetTitleText(void);\nu16 *GetEasyChatWordBuffer(void);\nu8 GetNumRows(void);\nu8 GetNumColumns(void);\nu8 GetMainCursorColumn(void);\nu8 GetMainCursorRow(void);\nvoid GetEasyChatInstructionsText(const u8 **str1, const u8 **str2);\nvoid GetEasyChatConfirmText(const u8 **str1, const u8 **str2);\nvoid GetEasyChatConfirmCancelText(const u8 **str1, const u8 **str2);\nvoid GetEasyChatConfirmDeletionText(const u8 **str1, const u8 **str2);\nvoid GetECSelectGroupCursorCoords(u8 *Xp, u8 *Yp);\nbool8 IsEasyChatAlphaMode(void);\nu8 GetECSelectGroupRowsAbove(void);\nvoid GetECSelectWordCursorCoords(s8 *arg0, s8 *arg1);\nu8 GetECSelectWordRowsAbove(void);\nu8 GetECSelectWordNumRows(void);\nbool32 ShouldDrawECUpArrow(void);\nbool32 ShouldDrawECDownArrow(void);\n\n#endif // GUARD_EASY_CHAT_H\n"
  },
  {
    "path": "include/egg_hatch.h",
    "content": "#ifndef GUARD_EGG_HATCH_H\n#define GUARD_EGG_HATCH_H\n\n#include \"global.h\"\n\nvoid ScriptHatchMon(void);\nvoid EggHatch(void);\nu8 GetEggStepsToSubtract(void);\n\n#endif // GUARD_EGG_HATCH_H\n"
  },
  {
    "path": "include/ereader_helpers.h",
    "content": "#ifndef GUARD_EREADER_HELPERS_H\n#define GUARD_EREADER_HELPERS_H\n\nenum {\n    EREADER_XFR_STATE_INIT = 0,\n    EREADER_XFR_STATE_HANDSHAKE,\n    EREADER_XFR_STATE_START,\n    EREADER_XFR_STATE_TRANSFER,\n    EREADER_XFR_STATE_TRANSFER_DONE,\n    EREADER_XFR_STATE_CHECKSUM,\n    EREADER_XFR_STATE_DONE\n};\n\n#define EREADER_XFER_EXE 1\n#define EREADER_XFER_CHK 2\n#define EREADER_XFER_SHIFT 0\n#define EREADER_XFER_MASK  ((EREADER_XFER_EXE | EREADER_XFER_CHK) << EREADER_XFER_SHIFT)\n\n#define EREADER_CANCEL_TIMEOUT 1\n#define EREADER_CANCEL_KEY     2\n#define EREADER_CANCEL_SHIFT 2\n#define EREADER_CANCEL_TIMEOUT_MASK (EREADER_CANCEL_TIMEOUT << EREADER_CANCEL_SHIFT)\n#define EREADER_CANCEL_KEY_MASK     (EREADER_CANCEL_KEY << EREADER_CANCEL_SHIFT)\n#define EREADER_CANCEL_MASK         ((EREADER_CANCEL_TIMEOUT | EREADER_CANCEL_KEY) << EREADER_CANCEL_SHIFT)\n\n#define EREADER_CHECKSUM_OK  1\n#define EREADER_CHECKSUM_ERR 2\n#define EREADER_CHECKSUM_SHIFT 4\n#define EREADER_CHECKSUM_OK_MASK (EREADER_CHECKSUM_OK << EREADER_CHECKSUM_SHIFT)\n#define EREADER_CHECKSUM_MASK    ((EREADER_CHECKSUM_OK | EREADER_CHECKSUM_ERR) << EREADER_CHECKSUM_SHIFT)\n\nvoid EReaderHelper_SerialCallback(void);\nvoid EReaderHelper_Timer3Callback(void);\nvoid EReaderHelper_SaveRegsState(void);\nvoid EReaderHelper_ClearsSendRecvMgr(void);\nvoid EReaderHelper_RestoreRegsState(void);\nu16 EReaderHandleTransfer(u8 mode, size_t size, const void *src, void *dest);\n\n#endif //GUARD_EREADER_HELPERS_H\n"
  },
  {
    "path": "include/event_data.h",
    "content": "#ifndef GUARD_EVENT_DATA_H\n#define GUARD_EVENT_DATA_H\n\n#include \"global.h\"\n\nextern u16 gSpecialVar_0x8000;\nextern u16 gSpecialVar_0x8001;\nextern u16 gSpecialVar_0x8002;\nextern u16 gSpecialVar_0x8003;\nextern u16 gSpecialVar_0x8004;\nextern u16 gSpecialVar_0x8005;\nextern u16 gSpecialVar_0x8006;\nextern u16 gSpecialVar_0x8007;\nextern u16 gSpecialVar_0x8008;\nextern u16 gSpecialVar_0x8009;\nextern u16 gSpecialVar_0x800A;\nextern u16 gSpecialVar_0x800B;\nextern u16 gSpecialVar_Facing;\nextern u16 gSpecialVar_Result;\nextern u16 gSpecialVar_LastTalked;\nextern u16 gSpecialVar_MonBoxId;\nextern u16 gSpecialVar_MonBoxPos;\nextern u16 gSpecialVar_TextColor;\nextern u16 gSpecialVar_PrevTextColor;\n\nvoid InitEventData(void);\nvoid ClearTempFieldEventData(void);\nvoid ClearUpperFlags(void);\nvoid DisableNationalPokedex(void);\nvoid EnableNationalPokedex(void);\nbool32 IsNationalPokedexEnabled(void);\nvoid DisableMysteryEvent(void);\nvoid EnableMysteryEvent(void);\nbool32 IsMysteryEventEnabled(void);\nvoid DisableMysteryGift(void);\nvoid EnableMysteryGift(void);\nbool32 IsMysteryGiftEnabled(void);\nvoid DisableResetRTC(void);\nvoid EnableResetRTC(void);\nbool32 CanResetRTC(void);\nu16 *GetVarPointer(u16 id);\nu16 VarGet(u16 id);\nbool8 VarSet(u16 id, u16 value);\nu8 VarGetObjectEventGraphicsId(u8 id);\nu8 *GetFlagPointer(u16 id);\nu8 FlagSet(u16 id);\nu8 FlagClear(u16 id);\nbool8 FlagGet(u16 id);\nu16 * GetVarPointer(u16 id);\nbool32 IsMysteryGiftEnabled(void);\nvoid ResetSpecialVars(void);\nvoid ClearMysteryGiftFlags(void);\nvoid ClearMysteryGiftVars(void);\nbool32 IsNationalPokedexEnabled(void);\nvoid EnableNationalPokedex_RSE(void);\nvoid ClearTempFieldEventData(void);\nu8 NuzlockeFlagSet(u8 mapsec);\nu8 NuzlockeFlagClear(u8 mapsec);\nu8 NuzlockeFlagGet(u8 mapsec);\nbool8 CheckMasterTrainerFlag(u16 flag);\nbool8 SetMasterTrainerFlag(u16 flag);\nbool8 ClearMasterTrainerFlag(u16 flag);\n\n#endif // GUARD_EVENT_DATA_H\n"
  },
  {
    "path": "include/event_object_lock.h",
    "content": "#ifndef GUARD_EVENT_OBJECT_LOCK_H\n#define GUARD_EVENT_OBJECT_LOCK_H\n\n#include \"global.h\"\n\nbool8 IsFreezePlayerFinished(void);\nvoid FreezeObjects_WaitForPlayer(void);\nbool8 IsFreezeSelectedObjectAndPlayerFinished(void);\nvoid FreezeObjects_WaitForPlayerAndSelected(void);\nvoid ClearPlayerHeldMovementAndUnfreezeObjectEvents(void);\nbool8 walkrun_is_standing_still(void);\nvoid UnionRoom_UnlockPlayerAndChatPartner(void);\n\n#endif // GUARD_EVENT_OBJECT_LOCK_H\n"
  },
  {
    "path": "include/event_object_movement.h",
    "content": "#ifndef GUARD_EVENT_OBJECT_MOVEMENT_H\n#define GUARD_EVENT_OBJECT_MOVEMENT_H\n\n// Palette slots for overworld NPCs.\n// The same standard set of palettes for overworld objects are normally always loaded at the same\n// time while walking around the overworld. The only exceptions are the palettes for the player and\n// the \"special\" NPC, which can be swapped out. This also means that e.g. two \"special\" NPCs\n// with competing palettes cannot be properly loaded at the same time.\nenum {\n    PALSLOT_PLAYER,\n    PALSLOT_PLAYER_REFLECTION,\n    PALSLOT_NPC_1,\n    PALSLOT_NPC_2,\n    PALSLOT_NPC_3,\n    PALSLOT_NPC_4,\n    PALSLOT_NPC_1_REFLECTION,\n    PALSLOT_NPC_2_REFLECTION,\n    PALSLOT_NPC_3_REFLECTION,\n    PALSLOT_NPC_4_REFLECTION,\n    PALSLOT_NPC_SPECIAL,\n    PALSLOT_NPC_SPECIAL_REFLECTION,\n    OBJ_PALSLOT_COUNT\n    // the remaining sprite palette slots (12-15) are used by field effects, the interface, etc.\n};\n\nenum SpinnerRunnerFollowPatterns\n{\n    RUNFOLLOW_ANY,\n    RUNFOLLOW_NORTH_SOUTH,\n    RUNFOLLOW_EAST_WEST,\n    RUNFOLLOW_NORTH_WEST,\n    RUNFOLLOW_NORTH_EAST,\n    RUNFOLLOW_SOUTH_WEST,\n    RUNFOLLOW_SOUTH_EAST,\n    RUNFOLLOW_NORTH_SOUTH_WEST,\n    RUNFOLLOW_NORTH_SOUTH_EAST,\n    RUNFOLLOW_NORTH_EAST_WEST,\n    RUNFOLLOW_SOUTH_EAST_WEST\n};\n\nstruct StepAnimTable\n{\n    const union AnimCmd *const *anims;\n    u8 animPos[4];\n};\n\ntypedef void (*MovementAction)(u8 direction);\n\n#define GROUND_EFFECT_FLAG_TALL_GRASS_ON_SPAWN   (1 << 0)\n#define GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE    (1 << 1)\n#define GROUND_EFFECT_FLAG_LONG_GRASS_ON_SPAWN   (1 << 2)\n#define GROUND_EFFECT_FLAG_LONG_GRASS_ON_MOVE    (1 << 3)\n#define GROUND_EFFECT_FLAG_ICE_REFLECTION        (1 << 4)\n#define GROUND_EFFECT_FLAG_REFLECTION            (1 << 5)\n#define GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER (1 << 6)\n#define GROUND_EFFECT_FLAG_SAND                  (1 << 7)\n#define GROUND_EFFECT_FLAG_DEEP_SAND             (1 << 8)\n#define GROUND_EFFECT_FLAG_RIPPLES               (1 << 9)\n#define GROUND_EFFECT_FLAG_PUDDLE                (1 << 10)\n#define GROUND_EFFECT_FLAG_SAND_PILE             (1 << 11)\n#define GROUND_EFFECT_FLAG_LAND_IN_TALL_GRASS    (1 << 12)\n#define GROUND_EFFECT_FLAG_LAND_IN_LONG_GRASS    (1 << 13)\n#define GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER (1 << 14)\n#define GROUND_EFFECT_FLAG_LAND_IN_DEEP_WATER    (1 << 15)\n#define GROUND_EFFECT_FLAG_LAND_ON_NORMAL_GROUND (1 << 16)\n#define GROUND_EFFECT_FLAG_SHORT_GRASS           (1 << 17)\n#define GROUND_EFFECT_FLAG_HOT_SPRINGS           (1 << 18)\n#define GROUND_EFFECT_FLAG_SEAWEED               (1 << 19)\n\nstruct PairedPalettes\n{\n    u16 tag;\n    const u16 *data;\n};\n\n// Exported RAM declarations\n\n// Exported ROM declarations\n\nu8 GetObjectEventIdByLocalIdAndMap(u8, u8, u8);\nbool8 TryGetObjectEventIdByLocalIdAndMap(u8, u8, u8, u8 *);\nu8 GetObjectEventIdByXY(s16, s16);\nvoid SetObjectEventDirection(struct ObjectEvent *, u8);\nvoid RemoveObjectEventByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup);\nu16 GetBoulderRevealFlagByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup);\nvoid LoadPlayerObjectReflectionPalette(u16, u8);\nvoid LoadSpecialObjectReflectionPalette(u16, u8);\nvoid TryMoveObjectEventToMapCoords(u8, u8, u8, s16, s16);\nvoid PatchObjectPalette(u16, u8);\nvoid SpawnObjectEventsOnReturnToField(s16 x, s16 y);\nvoid GetMapCoordsFromSpritePos(s16, s16, s16 *, s16 *);\nu8 GetFaceDirectionAnimNum(u8);\nvoid SetSpritePosToOffsetMapCoords(s16 *, s16 *, s16, s16);\nvoid ObjectEventClearHeldMovement(struct ObjectEvent *);\nvoid ObjectEventClearHeldMovementIfActive(struct ObjectEvent *);\nu8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevation, u8 direction);\nu8 CreateObjectGraphicsSprite(u16 graphicsId, SpriteCallback callback, s16 x, s16 y, u8 subpriority);\nu8 TrySpawnObjectEvent(u8 localId, u8 mapNum, u8 mapGroup);\nint SpawnSpecialObjectEventParameterized(u8, u8, u8, s16, s16, u8);\nu8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *);\nvoid CameraObjectReset1(void);\nvoid CameraObjectReset2(void);\nvoid ObjectEventSetGraphicsId(struct ObjectEvent *, u8);\nvoid ObjectEventTurn(struct ObjectEvent *, u8);\nvoid ObjectEventTurnByLocalIdAndMap(u8, u8, u8, u8);\nvoid ObjectEventForceSetHeldMovement(struct ObjectEvent *, u8);\nconst struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u8);\nvoid SetObjectInvisibility(u8 localId, u8 mapNum, u8 mapGroup, u8 state);\nvoid FreeAndReserveObjectSpritePalettes(void);\nvoid SetObjectPositionByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y);\nvoid ResetObjectSubpriority(u8 localId, u8 mapNum, u8 mapGroup);\nvoid SetObjectSubpriority(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority);\nvoid ObjectEventGetLocalIdAndMap(struct ObjectEvent *objectEvent, void *localId, void *mapNum, void *mapGroup);\nvoid ShiftObjectEventCoords(struct ObjectEvent *, s16, s16);\nvoid TryOverrideObjectEventTemplateCoords(u8, u8, u8);\nvoid UpdateObjectEventCurrentMovement(struct ObjectEvent *, struct Sprite *, bool8(struct ObjectEvent *, struct Sprite *));\nu8 ObjectEventFaceOppositeDirection(struct ObjectEvent *, u8);\nu8 GetOppositeDirection(u8);\nu8 GetWalkInPlaceFasterMovementAction(u32);\nu8 GetStepInPlaceDelay8AnimId(u32);\nu8 GetWalkInPlaceNormalMovementAction(u32);\nu8 GetWalkInPlaceSlowMovementAction(u32);\nu8 GetWalkInPlaceFastMovementAction(u32);\nu8 GetCollisionAtCoords(struct ObjectEvent *, s16, s16, u32);\nvoid MoveCoords(u8, s16 *, s16 *);\nbool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *);\nu8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *);\nu8 GetObjectEventIdByPosition(u16 x, u16 y, u8 elevation);\nvoid QL_UpdateObjectEventCurrentMovement(struct ObjectEvent *, struct Sprite *);\nbool8 ObjectEventSetHeldMovement(struct ObjectEvent *, u8);\nvoid ShiftStillObjectEventCoords(struct ObjectEvent *);\nvoid OverrideMovementTypeForObjectEvent(const struct ObjectEvent *, u8);\nvoid SetTrainerMovementType(struct ObjectEvent *, u8);\nu8 GetFishingDirectionAnimNum(u8 direction);\nu8 GetFishingNoCatchDirectionAnimNum(u8 a0);\nvoid ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 a1);\nu8 CreateFameCheckerObject(u8 graphicsId, u8 localId, s16 x, s16 y);\nvoid InitObjectEventPalettes(u8 mode);\nbool8 ObjectEventIsMovementOverridden(struct ObjectEvent *objectEvent);\nu8 ObjectEventCheckHeldMovementStatus(struct ObjectEvent *objectEvent);\nu8 GetWalkNormalMovementAction(u32);\nu8 GetWalkFastMovementAction(u32);\nu8 GetWalkFasterMovementAction(u32);\nu8 GetWalkSlowerMovementAction(u32 direction);\nu8 GetTrainerFacingDirectionMovementType(u8 direction);\nu8 GetFaceDirectionMovementAction(u32);\nu8 GetFaceDirectionFastMovementAction(u32);\nvoid CameraObjectSetFollowedObjectId(u8 objectId);\nvoid UnfreezeObjectEvents(void);\nu8 GetSlideMovementAction(u32);\nu8 GetJumpInPlaceMovementAction(u32);\nu8 GetJumpMovementAction(u32);\nu8 GetJump2MovementAction(u32);\nbool8 UpdateWalkSlowerAnim(struct Sprite *sprite);\nvoid SetJumpSpriteData(struct Sprite *, u8, u8, u8);\nu8 DoJumpSpriteMovement(struct Sprite *);\nu8 DoJumpSpecialSpriteMovement(struct Sprite *);\nvoid TurnVirtualObject(u8 virtualObjId, u8 direction);\nconst u8 *GetObjectEventScriptPointerByObjectEventId(u8 objectEventId);\nu8 GetFirstInactiveObjectEventId(void);\nu8 GetCollisionFlagsAtCoords(struct ObjectEvent * objectEvent, s16 x, s16 y, u8 direction);\nvoid OverrideTemplateCoordsForObjectEvent(const struct ObjectEvent *objectEvent);\nvoid CancelPlayerForcedMovement(void);\nvoid FreezeObjectEvents(void);\nbool8 FreezeObjectEvent(struct ObjectEvent *);\nvoid UnfreezeObjectEvent(struct ObjectEvent *);\nvoid FreezeObjectEventsExceptOne(u8 objEventId);\nvoid SetVirtualObjectGraphics(u8 virtualObjId, u8 direction);\nvoid SetVirtualObjectInvisibility(u8 virtualObjId, bool32 invisible);\nbool32 IsVirtualObjectInvisible(u8 virtualObjId);\nvoid SetVirtualObjectSpriteAnim(u8 virtualObjId, u8 animNo);\nbool32 IsVirtualObjectAnimating(u8 virtualObjId);\nu8 GetJumpSpecialMovementAction(u32 direction);\nvoid EnableObjectGroundEffectsByXY(s16 x, s16 y);\nvoid MoveObjectEventToMapCoords(struct ObjectEvent *objectEvent, s16 x, s16 y);\nu8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority);\nu16 GetObjectPaletteTag(u8 paletteIndex);\nvoid SetSpritePosToMapCoords(s16 x, s16 y, s16 *x2, s16 *y2);\nvoid UpdateObjectEventSpriteInvisibility(struct Sprite *sprite, bool8 invisible);\nu8 ElevationToPriority(u8 elevation);\nvoid ObjectEventUpdateElevation(struct ObjectEvent *pObject);\nvoid SetObjectSubpriorityByElevation(u8 elevation, struct Sprite *sprite, u8 offset);\nvoid CopyObjectGraphicsInfoToSpriteTemplate(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables);\nu8 AddCameraObject(u8 trackedSpriteId);\nvoid UpdateObjectEventsForCameraUpdate(s16 x, s16 y);\nvoid SpriteCB_VirtualObject(struct Sprite *);\nvoid SetMovementDelay(struct Sprite *, s16);\nbool8 WaitForMovementDelay(struct Sprite *);\nvoid SetSpriteDataForNormalStep(struct Sprite *, u8, u8);\nbool8 NpcTakeStep(struct Sprite *sprite);\nvoid SetWalkSlowerSpriteData(struct Sprite *, u8);\nvoid SetWalkSlowestSpriteData(struct Sprite *, u8);\nbool8 UpdateWalkSlowestAnim(struct Sprite *sprite);\nvoid SetWalkSlowSpriteData(struct Sprite *, u8);\nbool8 UpdateWalkSlowAnim(struct Sprite *sprite);\nvoid DoShadowFieldEffect(struct ObjectEvent *);\nvoid SetRunSlowSpriteData(struct Sprite *, u8);\nbool8 UpdateRunSlowAnim(struct Sprite *sprite);\nvoid SetAndStartSpriteAnim(struct Sprite *, u8, u8);\nbool8 SpriteAnimEnded(struct Sprite *);\nu8 ObjectEventGetHeldMovementActionId(struct ObjectEvent *objectEvent);\nu8 GetMoveDirectionAnimNum(u8 direction);\nvoid RemoveObjectEvent(struct ObjectEvent *objectEvent);\nu8 Unref_TryInitLocalObjectEvent(u8 localId);\nvoid SetObjectMovementType(u16 localId, u8 movementType);\n\n// Exported data declarations\n\nextern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[];\nextern const struct SpritePalette gSpritePalette_GeneralFieldEffect1;\nextern const struct SpriteTemplate * const gFieldEffectObjectTemplatePointers[];\nextern const struct OamData gObjectEventBaseOam_32x32;\nextern const u16 gFieldEffectObjectPic_CutGrass[];\nextern const u16 gFieldEffectPal_CutGrass[];\nextern const u8 gReflectionEffectPaletteMap[];\nu8 GetLedgeJumpDirection(s16 x, s16 y, u8 direction);\nu8 GetGlideMovementAction(u32 direction);\nu8 GetRideWaterCurrentMovementAction(u32 direction);\nu8 GetPlayerRunMovementAction(u32 direction);\nu8 GetPlayerRunSlowMovementAction(u32 direction);\nu8 GetWalkSlowMovementAction(u32 direction);\nu8 GetSpinMovementAction(u32 direction);\nu8 GetAcroWheelieFaceDirectionMovementAction(u32 direction);\nu8 GetAcroPopWheelieFaceDirectionMovementAction(u32 direction);\nu8 GetAcroEndWheelieFaceDirectionMovementAction(u32 direction);\nu8 GetAcroWheelieHopFaceDirectionMovementAction(u32 direction);\nu8 GetAcroWheelieHopMovementAction(u32 direction);\nu8 GetAcroPopWheelieMoveMovementAction(u32 direction);\nu8 GetAcroWheelieJumpMovementAction(u32 direction);\nu8 GetJumpInPlaceTurnAroundMovementAction(u32 direction);\nu8 GetAcroWheelieInPlaceMovementAction(u32 direction);\nu8 GetAcroPopWheelieMoveMovementAction(u32 direction);\nu8 GetAcroWheelieMoveMovementAction(u32 direction);\nu8 GetJumpSpecialWithEffectMovementAction(u32 direction);\nu8 GetFishingBiteDirectionAnimNum(u8 direction);\nvoid TrySpawnObjectEvents(s16 cameraX, s16 cameraY);\nvoid ResetObjectEvents(void);\n\n#endif // GUARD_EVENT_OBJECT_MOVEMENT_H\n"
  },
  {
    "path": "include/event_scripts.h",
    "content": "//\n// Created by scott on 9/12/2017.\n//\n\n#ifndef GUARD_EVENT_SCRIPTS_H\n#define GUARD_EVENT_SCRIPTS_H\n\n#include \"global.h\"\n\nextern const u8 gTVBravoTrainerText00[];\nextern const u8 gTVBravoTrainerText01[];\nextern const u8 gTVBravoTrainerText02[];\nextern const u8 gTVBravoTrainerText03[];\nextern const u8 gTVBravoTrainerText04[];\nextern const u8 gTVBravoTrainerText05[];\nextern const u8 gTVBravoTrainerText06[];\nextern const u8 gTVBravoTrainerText07[];\nextern const u8 gTVBravoTrainerText08[];\nextern const u8 gTVBravoTrainerBattleTowerText00[];\nextern const u8 gTVBravoTrainerBattleTowerText01[];\nextern const u8 gTVBravoTrainerBattleTowerText02[];\nextern const u8 gTVBravoTrainerBattleTowerText03[];\nextern const u8 gTVBravoTrainerBattleTowerText04[];\nextern const u8 gTVBravoTrainerBattleTowerText05[];\nextern const u8 gTVBravoTrainerBattleTowerText06[];\nextern const u8 gTVBravoTrainerBattleTowerText07[];\nextern const u8 gTVBravoTrainerBattleTowerText08[];\nextern const u8 gTVBravoTrainerBattleTowerText09[];\nextern const u8 gTVBravoTrainerBattleTowerText10[];\nextern const u8 gTVBravoTrainerBattleTowerText11[];\nextern const u8 gTVBravoTrainerBattleTowerText12[];\nextern const u8 gTVBravoTrainerBattleTowerText13[];\nextern const u8 gTVBravoTrainerBattleTowerText14[];\nextern const u8 gTVFanClubOpinionsText00[];\nextern const u8 gTVFanClubOpinionsText01[];\nextern const u8 gTVFanClubOpinionsText02[];\nextern const u8 gTVFanClubOpinionsText03[];\nextern const u8 gTVFanClubOpinionsText04[];\nextern const u8 gTVFanClubText00[];\nextern const u8 gTVFanClubText01[];\nextern const u8 gTVFanClubText02[];\nextern const u8 gTVFanClubText03[];\nextern const u8 gTVFanClubText04[];\nextern const u8 gTVFanClubText05[];\nextern const u8 gTVFanClubText06[];\nextern const u8 gTVFanClubText07[];\nextern const u8 gTVRecentHappeningsText00[];\nextern const u8 gTVRecentHappeningsText01[];\nextern const u8 gTVRecentHappeningsText02[];\nextern const u8 gTVRecentHappeningsText03[];\nextern const u8 gTVRecentHappeningsText04[];\nextern const u8 gTVRecentHappeningsText05[];\nextern const u8 gTVMassOutbreakText00[];\nextern const u8 gTV3CheersForPokeblocksText00[];\nextern const u8 gTV3CheersForPokeblocksText01[];\nextern const u8 gTV3CheersForPokeblocksText02[];\nextern const u8 gTV3CheersForPokeblocksText03[];\nextern const u8 gTV3CheersForPokeblocksText04[];\nextern const u8 gTV3CheersForPokeblocksText05[];\nextern const u8 gTVTrainerFanClubSpecialText00[];\nextern const u8 gTVTrainerFanClubSpecialText01[];\nextern const u8 gTVTrainerFanClubSpecialText02[];\nextern const u8 gTVTrainerFanClubSpecialText03[];\nextern const u8 gTVTrainerFanClubSpecialText04[];\nextern const u8 gTVTrainerFanClubSpecialText05[];\nextern const u8 gTVNameRaterText00[];\nextern const u8 gTVNameRaterText01[];\nextern const u8 gTVNameRaterText02[];\nextern const u8 gTVNameRaterText03[];\nextern const u8 gTVNameRaterText04[];\nextern const u8 gTVNameRaterText05[];\nextern const u8 gTVNameRaterText06[];\nextern const u8 gTVNameRaterText07[];\nextern const u8 gTVNameRaterText08[];\nextern const u8 gTVNameRaterText09[];\nextern const u8 gTVNameRaterText10[];\nextern const u8 gTVNameRaterText11[];\nextern const u8 gTVNameRaterText12[];\nextern const u8 gTVNameRaterText13[];\nextern const u8 gTVNameRaterText14[];\nextern const u8 gTVNameRaterText15[];\nextern const u8 gTVNameRaterText16[];\nextern const u8 gTVNameRaterText17[];\nextern const u8 gTVNameRaterText18[];\nextern const u8 gTVPokemonAnglerText00[];\nextern const u8 gTVPokemonAnglerText01[];\nextern const u8 gTVPokemonTodayFailedText00[];\nextern const u8 gTVPokemonTodayFailedText01[];\nextern const u8 gTVPokemonTodayFailedText02[];\nextern const u8 gTVPokemonTodayFailedText03[];\nextern const u8 gTVPokemonTodayFailedText04[];\nextern const u8 gTVPokemonTodayFailedText05[];\nextern const u8 gTVPokemonTodayFailedText06[];\nextern const u8 gTVPokemonTodaySuccessfulText00[];\nextern const u8 gTVPokemonTodaySuccessfulText01[];\nextern const u8 gTVPokemonTodaySuccessfulText02[];\nextern const u8 gTVPokemonTodaySuccessfulText03[];\nextern const u8 gTVPokemonTodaySuccessfulText04[];\nextern const u8 gTVPokemonTodaySuccessfulText05[];\nextern const u8 gTVPokemonTodaySuccessfulText06[];\nextern const u8 gTVPokemonTodaySuccessfulText07[];\nextern const u8 gTVPokemonTodaySuccessfulText08[];\nextern const u8 gTVPokemonTodaySuccessfulText09[];\nextern const u8 gTVPokemonTodaySuccessfulText10[];\nextern const u8 gTVPokemonTodaySuccessfulText11[];\nextern const u8 gTVTodaysSmartShopperText00[];\nextern const u8 gTVTodaysSmartShopperText01[];\nextern const u8 gTVTodaysSmartShopperText02[];\nextern const u8 gTVTodaysSmartShopperText03[];\nextern const u8 gTVTodaysSmartShopperText04[];\nextern const u8 gTVTodaysSmartShopperText05[];\nextern const u8 gTVTodaysSmartShopperText06[];\nextern const u8 gTVTodaysSmartShopperText07[];\nextern const u8 gTVTodaysSmartShopperText08[];\nextern const u8 gTVTodaysSmartShopperText09[];\nextern const u8 gTVTodaysSmartShopperText10[];\nextern const u8 gTVTodaysSmartShopperText11[];\nextern const u8 gTVTodaysSmartShopperText12[];\nextern const u8 gTVWorldOfMastersText00[];\nextern const u8 gTVWorldOfMastersText01[];\nextern const u8 gTVWorldOfMastersText02[];\nextern const u8 gTVTodaysRivalTrainerText00[];\nextern const u8 gTVTodaysRivalTrainerText07[];\nextern const u8 gTVTodaysRivalTrainerText08[];\nextern const u8 gTVTodaysRivalTrainerText09[];\nextern const u8 gTVTodaysRivalTrainerText10[];\nextern const u8 gTVTodaysRivalTrainerText01[];\nextern const u8 gTVTodaysRivalTrainerText02[];\nextern const u8 gTVTodaysRivalTrainerText03[];\nextern const u8 gTVTodaysRivalTrainerText04[];\nextern const u8 gTVTodaysRivalTrainerText05[];\nextern const u8 gTVTodaysRivalTrainerText06[];\nextern const u8 gTVDewfordTrendWatcherNetworkText00[];\nextern const u8 gTVDewfordTrendWatcherNetworkText01[];\nextern const u8 gTVDewfordTrendWatcherNetworkText02[];\nextern const u8 gTVDewfordTrendWatcherNetworkText03[];\nextern const u8 gTVDewfordTrendWatcherNetworkText04[];\nextern const u8 gTVDewfordTrendWatcherNetworkText05[];\nextern const u8 gTVDewfordTrendWatcherNetworkText06[];\nextern const u8 gTVHoennTreasureInvestigatorsText00[];\nextern const u8 gTVHoennTreasureInvestigatorsText01[];\nextern const u8 gTVHoennTreasureInvestigatorsText02[];\nextern const u8 gTVFindThatGamerText00[];\nextern const u8 gTVFindThatGamerText01[];\nextern const u8 gTVFindThatGamerText02[];\nextern const u8 gTVFindThatGamerText03[];\nextern const u8 gTVBreakingNewsText00[];\nextern const u8 gTVBreakingNewsText01[];\nextern const u8 gTVBreakingNewsText02[];\nextern const u8 gTVBreakingNewsText03[];\nextern const u8 gTVBreakingNewsText04[];\nextern const u8 gTVBreakingNewsText05[];\nextern const u8 gTVBreakingNewsText06[];\nextern const u8 gTVBreakingNewsText07[];\nextern const u8 gTVBreakingNewsText12[];\nextern const u8 gTVBreakingNewsText08[];\nextern const u8 gTVBreakingNewsText09[];\nextern const u8 gTVBreakingNewsText10[];\nextern const u8 gTVBreakingNewsText11[];\nextern const u8 gTVSecretBaseVisitText00[];\nextern const u8 gTVSecretBaseVisitText01[];\nextern const u8 gTVSecretBaseVisitText02[];\nextern const u8 gTVSecretBaseVisitText03[];\nextern const u8 gTVSecretBaseVisitText04[];\nextern const u8 gTVSecretBaseVisitText05[];\nextern const u8 gTVSecretBaseVisitText06[];\nextern const u8 gTVSecretBaseVisitText07[];\nextern const u8 gTVSecretBaseVisitText08[];\nextern const u8 gTVSecretBaseVisitText09[];\nextern const u8 gTVSecretBaseVisitText10[];\nextern const u8 gTVSecretBaseVisitText11[];\nextern const u8 gTVSecretBaseVisitText12[];\nextern const u8 gTVSecretBaseVisitText13[];\nextern const u8 gTVPokemonLotteryWinnerFlashReportText00[];\nextern const u8 gTVThePokemonBattleSeminarText00[];\nextern const u8 gTVThePokemonBattleSeminarText01[];\nextern const u8 gTVThePokemonBattleSeminarText02[];\nextern const u8 gTVThePokemonBattleSeminarText03[];\nextern const u8 gTVThePokemonBattleSeminarText04[];\nextern const u8 gTVThePokemonBattleSeminarText05[];\nextern const u8 gTVThePokemonBattleSeminarText06[];\nextern const u8 gTVTrainerFanClubText00[];\nextern const u8 gTVTrainerFanClubText01[];\nextern const u8 gTVTrainerFanClubText02[];\nextern const u8 gTVTrainerFanClubText03[];\nextern const u8 gTVTrainerFanClubText04[];\nextern const u8 gTVTrainerFanClubText05[];\nextern const u8 gTVTrainerFanClubText06[];\nextern const u8 gTVTrainerFanClubText07[];\nextern const u8 gTVTrainerFanClubText08[];\nextern const u8 gTVTrainerFanClubText09[];\nextern const u8 gTVTrainerFanClubText10[];\nextern const u8 gTVTrainerFanClubText11[];\nextern const u8 gTVCutiesText00[];\nextern const u8 gTVCutiesText01[];\nextern const u8 gTVCutiesText02[];\nextern const u8 gTVCutiesText03[];\nextern const u8 gTVCutiesText04[];\nextern const u8 gTVCutiesText05[];\nextern const u8 gTVCutiesText06[];\nextern const u8 gTVCutiesText07[];\nextern const u8 gTVCutiesText08[];\nextern const u8 gTVCutiesText09[];\nextern const u8 gTVCutiesText10[];\nextern const u8 gTVCutiesText11[];\nextern const u8 gTVCutiesText12[];\nextern const u8 gTVCutiesText13[];\nextern const u8 gTVCutiesText14[];\nextern const u8 gTVCutiesText15[];\nextern const u8 gTVPokemonNewsBattleFrontierText00[];\nextern const u8 gTVPokemonNewsBattleFrontierText01[];\nextern const u8 gTVPokemonNewsBattleFrontierText02[];\nextern const u8 gTVPokemonNewsBattleFrontierText03[];\nextern const u8 gTVPokemonNewsBattleFrontierText04[];\nextern const u8 gTVPokemonNewsBattleFrontierText05[];\nextern const u8 gTVPokemonNewsBattleFrontierText06[];\nextern const u8 gTVPokemonNewsBattleFrontierText07[];\nextern const u8 gTVPokemonNewsBattleFrontierText08[];\nextern const u8 gTVPokemonNewsBattleFrontierText09[];\nextern const u8 gTVPokemonNewsBattleFrontierText10[];\nextern const u8 gTVPokemonNewsBattleFrontierText11[];\nextern const u8 gTVPokemonNewsBattleFrontierText12[];\nextern const u8 gTVPokemonNewsBattleFrontierText13[];\nextern const u8 gTVPokemonNewsBattleFrontierText14[];\nextern const u8 gTVPokemonNewsBattleFrontierText15[];\nextern const u8 gTVPokemonNewsBattleFrontierText16[];\nextern const u8 gTVPokemonNewsBattleFrontierText17[];\nextern const u8 gTVPokemonNewsBattleFrontierText18[];\nextern const u8 gTVWhatsNo1InHoennTodayText00[];\nextern const u8 gTVWhatsNo1InHoennTodayText01[];\nextern const u8 gTVWhatsNo1InHoennTodayText02[];\nextern const u8 gTVWhatsNo1InHoennTodayText03[];\nextern const u8 gTVWhatsNo1InHoennTodayText04[];\nextern const u8 gTVWhatsNo1InHoennTodayText05[];\nextern const u8 gTVWhatsNo1InHoennTodayText06[];\nextern const u8 gTVWhatsNo1InHoennTodayText07[];\nextern const u8 gTVWhatsNo1InHoennTodayText08[];\nextern const u8 gTVSecretBaseSecretsText00[];\nextern const u8 gTVSecretBaseSecretsText01[];\nextern const u8 gTVSecretBaseSecretsText02[];\nextern const u8 gTVSecretBaseSecretsText03[];\nextern const u8 gTVSecretBaseSecretsText04[];\nextern const u8 gTVSecretBaseSecretsText05[];\nextern const u8 gTVSecretBaseSecretsText06[];\nextern const u8 gTVSecretBaseSecretsText07[];\nextern const u8 gTVSecretBaseSecretsText08[];\nextern const u8 gTVSecretBaseSecretsText09[];\nextern const u8 gTVSecretBaseSecretsText10[];\nextern const u8 gTVSecretBaseSecretsText11[];\nextern const u8 gTVSecretBaseSecretsText12[];\nextern const u8 gTVSecretBaseSecretsText13[];\nextern const u8 gTVSecretBaseSecretsText14[];\nextern const u8 gTVSecretBaseSecretsText15[];\nextern const u8 gTVSecretBaseSecretsText16[];\nextern const u8 gTVSecretBaseSecretsText17[];\nextern const u8 gTVSecretBaseSecretsText18[];\nextern const u8 gTVSecretBaseSecretsText19[];\nextern const u8 gTVSecretBaseSecretsText20[];\nextern const u8 gTVSecretBaseSecretsText21[];\nextern const u8 gTVSecretBaseSecretsText22[];\nextern const u8 gTVSecretBaseSecretsText23[];\nextern const u8 gTVSecretBaseSecretsText24[];\nextern const u8 gTVSecretBaseSecretsText25[];\nextern const u8 gTVSecretBaseSecretsText26[];\nextern const u8 gTVSecretBaseSecretsText27[];\nextern const u8 gTVSecretBaseSecretsText28[];\nextern const u8 gTVSecretBaseSecretsText29[];\nextern const u8 gTVSecretBaseSecretsText30[];\nextern const u8 gTVSecretBaseSecretsText31[];\nextern const u8 gTVSecretBaseSecretsText32[];\nextern const u8 gTVSecretBaseSecretsText33[];\nextern const u8 gTVSecretBaseSecretsText34[];\nextern const u8 gTVSecretBaseSecretsText35[];\nextern const u8 gTVSecretBaseSecretsText36[];\nextern const u8 gTVSecretBaseSecretsText37[];\nextern const u8 gTVSecretBaseSecretsText38[];\nextern const u8 gTVSecretBaseSecretsText39[];\nextern const u8 gTVSecretBaseSecretsText40[];\nextern const u8 gTVSecretBaseSecretsText41[];\nextern const u8 gTVSecretBaseSecretsText42[];\nextern const u8 gTVSafariFanClubText00[];\nextern const u8 gTVSafariFanClubText01[];\nextern const u8 gTVSafariFanClubText02[];\nextern const u8 gTVSafariFanClubText03[];\nextern const u8 gTVSafariFanClubText04[];\nextern const u8 gTVSafariFanClubText05[];\nextern const u8 gTVSafariFanClubText06[];\nextern const u8 gTVSafariFanClubText07[];\nextern const u8 gTVSafariFanClubText08[];\nextern const u8 gTVSafariFanClubText09[];\nextern const u8 gTVSafariFanClubText10[];\nextern const u8 gTVContestLiveUpdatesText00[];\nextern const u8 gTVContestLiveUpdatesText01[];\nextern const u8 gTVContestLiveUpdatesText02[];\nextern const u8 gTVContestLiveUpdatesText03[];\nextern const u8 gTVContestLiveUpdatesText04[];\nextern const u8 gTVContestLiveUpdatesText05[];\nextern const u8 gTVContestLiveUpdatesText06[];\nextern const u8 gTVContestLiveUpdatesText07[];\nextern const u8 gTVContestLiveUpdatesText08[];\nextern const u8 gTVContestLiveUpdatesText09[];\nextern const u8 gTVContestLiveUpdatesText10[];\nextern const u8 gTVContestLiveUpdatesText11[];\nextern const u8 gTVContestLiveUpdatesText12[];\nextern const u8 gTVContestLiveUpdatesText13[];\nextern const u8 gTVContestLiveUpdatesText14[];\nextern const u8 gTVContestLiveUpdatesText15[];\nextern const u8 gTVContestLiveUpdatesText16[];\nextern const u8 gTVContestLiveUpdatesText17[];\nextern const u8 gTVContestLiveUpdatesText18[];\nextern const u8 gTVContestLiveUpdatesText19[];\nextern const u8 gTVContestLiveUpdatesText20[];\nextern const u8 gTVContestLiveUpdatesText21[];\nextern const u8 gTVContestLiveUpdatesText22[];\nextern const u8 gTVContestLiveUpdatesText23[];\nextern const u8 gTVContestLiveUpdatesText24[];\nextern const u8 gTVContestLiveUpdatesText25[];\nextern const u8 gTVContestLiveUpdatesText26[];\nextern const u8 gTVContestLiveUpdatesText27[];\nextern const u8 gTVContestLiveUpdatesText28[];\nextern const u8 gTVContestLiveUpdatesText29[];\nextern const u8 gTVContestLiveUpdatesText30[];\nextern const u8 gTVContestLiveUpdatesText31[];\nextern const u8 gTVContestLiveUpdatesText32[];\nextern const u8 gTVPokemonBattleUpdateText00[];\nextern const u8 gTVPokemonBattleUpdateText01[];\nextern const u8 gTVPokemonBattleUpdateText02[];\nextern const u8 gTVPokemonBattleUpdateText03[];\nextern const u8 gTVPokemonBattleUpdateText04[];\nextern const u8 gTVPokemonBattleUpdateText05[];\nextern const u8 gTVPokemonBattleUpdateText06[];\nextern const u8 gTVPokemonBattleUpdateText07[];\nextern const u8 gTVInSearchOfTrainersText00[];\nextern const u8 gTVInSearchOfTrainersText01[];\nextern const u8 gTVInSearchOfTrainersText02[];\nextern const u8 gTVInSearchOfTrainersText03[];\nextern const u8 gTVInSearchOfTrainersText04[];\nextern const u8 gTVInSearchOfTrainersText05[];\nextern const u8 gTVInSearchOfTrainersText06[];\nextern const u8 gTVInSearchOfTrainersText07[];\nextern const u8 gTVInSearchOfTrainersText08[];\nextern const u8 gTVPokemonContestLiveUpdates2Text00[];\nextern const u8 gTVPokemonContestLiveUpdates2Text01[];\nextern const u8 gTVPokemonContestLiveUpdates2Text02[];\nextern const u8 gTVPokemonContestLiveUpdates2Text03[];\nextern const u8 gPokeNewsTextSlateport_Upcoming[];\nextern const u8 gPokeNewsTextSlateport_Ongoing[];\nextern const u8 gPokeNewsTextSlateport_Ending[];\nextern const u8 gPokeNewsTextGameCorner_Upcoming[];\nextern const u8 gPokeNewsTextGameCorner_Ongoing[];\nextern const u8 gPokeNewsTextGameCorner_Ending[];\nextern const u8 gPokeNewsTextLilycove_Upcoming[];\nextern const u8 gPokeNewsTextLilycove_Ongoing[];\nextern const u8 gPokeNewsTextLilycove_Ending[];\nextern const u8 gPokeNewsTextBlendMaster_Upcoming[];\nextern const u8 gPokeNewsTextBlendMaster_Ongoing[];\nextern const u8 gPokeNewsTextBlendMaster_Ending[];\n\nextern const u8 gText_LtSurge[];\nextern const u8 gText_Koga[];\nextern const u8 gText_PokemonCenter[];\n// vs_seeker\nextern const u8 VSSeeker_Text_BatteryNotChargedNeedXSteps[];\nextern const u8 VSSeeker_Text_NoTrainersWithinRange[];\nextern const u8 VSSeeker_Text_TrainersNotReady[];\n\n// fame_checker\n\nextern const u8 gFameCheckerFlavorText_ProfOak0[];\nextern const u8 gFameCheckerFlavorText_ProfOak1[];\nextern const u8 gFameCheckerFlavorText_ProfOak2[];\nextern const u8 gFameCheckerFlavorText_ProfOak3[];\nextern const u8 gFameCheckerFlavorText_ProfOak4[];\nextern const u8 gFameCheckerFlavorText_ProfOak5[];\nextern const u8 gFameCheckerFlavorText_Daisy0[];\nextern const u8 gFameCheckerFlavorText_Daisy1[];\nextern const u8 gFameCheckerFlavorText_Daisy2[];\nextern const u8 gFameCheckerFlavorText_Daisy3[];\nextern const u8 gFameCheckerFlavorText_Daisy4[];\nextern const u8 gFameCheckerFlavorText_Daisy5[];\nextern const u8 gFameCheckerFlavorText_Brock0[];\nextern const u8 gFameCheckerFlavorText_Brock1[];\nextern const u8 gFameCheckerFlavorText_Brock2[];\nextern const u8 gFameCheckerFlavorText_Brock3[];\nextern const u8 gFameCheckerFlavorText_Brock4[];\nextern const u8 gFameCheckerFlavorText_Brock5[];\nextern const u8 gFameCheckerFlavorText_Misty0[];\nextern const u8 gFameCheckerFlavorText_Misty1[];\nextern const u8 gFameCheckerFlavorText_Misty2[];\nextern const u8 gFameCheckerFlavorText_Misty3[];\nextern const u8 gFameCheckerFlavorText_Misty4[];\nextern const u8 gFameCheckerFlavorText_Misty5[];\nextern const u8 gFameCheckerFlavorText_LtSurge0[];\nextern const u8 gFameCheckerFlavorText_LtSurge1[];\nextern const u8 gFameCheckerFlavorText_LtSurge2[];\nextern const u8 gFameCheckerFlavorText_LtSurge3[];\nextern const u8 gFameCheckerFlavorText_LtSurge4[];\nextern const u8 gFameCheckerFlavorText_LtSurge5[];\nextern const u8 gFameCheckerFlavorText_Erika0[];\nextern const u8 gFameCheckerFlavorText_Erika1[];\nextern const u8 gFameCheckerFlavorText_Erika2[];\nextern const u8 gFameCheckerFlavorText_Erika3[];\nextern const u8 gFameCheckerFlavorText_Erika4[];\nextern const u8 gFameCheckerFlavorText_Erika5[];\nextern const u8 gFameCheckerFlavorText_Koga0[];\nextern const u8 gFameCheckerFlavorText_Koga1[];\nextern const u8 gFameCheckerFlavorText_Koga2[];\nextern const u8 gFameCheckerFlavorText_Koga3[];\nextern const u8 gFameCheckerFlavorText_Koga4[];\nextern const u8 gFameCheckerFlavorText_Koga5[];\nextern const u8 gFameCheckerFlavorText_Sabrina0[];\nextern const u8 gFameCheckerFlavorText_Sabrina1[];\nextern const u8 gFameCheckerFlavorText_Sabrina2[];\nextern const u8 gFameCheckerFlavorText_Sabrina3[];\nextern const u8 gFameCheckerFlavorText_Sabrina4[];\nextern const u8 gFameCheckerFlavorText_Sabrina5[];\nextern const u8 gFameCheckerFlavorText_Blaine0[];\nextern const u8 gFameCheckerFlavorText_Blaine1[];\nextern const u8 gFameCheckerFlavorText_Blaine2[];\nextern const u8 gFameCheckerFlavorText_Blaine3[];\nextern const u8 gFameCheckerFlavorText_Blaine4[];\nextern const u8 gFameCheckerFlavorText_Blaine5[];\nextern const u8 gFameCheckerFlavorText_Lorelei0[];\nextern const u8 gFameCheckerFlavorText_Lorelei1[];\nextern const u8 gFameCheckerFlavorText_Lorelei2[];\nextern const u8 gFameCheckerFlavorText_Lorelei3[];\nextern const u8 gFameCheckerFlavorText_Lorelei4[];\nextern const u8 gFameCheckerFlavorText_Lorelei5[];\nextern const u8 gFameCheckerFlavorText_Bruno0[];\nextern const u8 gFameCheckerFlavorText_Bruno1[];\nextern const u8 gFameCheckerFlavorText_Bruno2[];\nextern const u8 gFameCheckerFlavorText_Bruno3[];\nextern const u8 gFameCheckerFlavorText_Bruno4[];\nextern const u8 gFameCheckerFlavorText_Bruno5[];\nextern const u8 gFameCheckerFlavorText_Agatha0[];\nextern const u8 gFameCheckerFlavorText_Agatha1[];\nextern const u8 gFameCheckerFlavorText_Agatha2[];\nextern const u8 gFameCheckerFlavorText_Agatha3[];\nextern const u8 gFameCheckerFlavorText_Agatha4[];\nextern const u8 gFameCheckerFlavorText_Agatha5[];\nextern const u8 gFameCheckerFlavorText_Lance0[];\nextern const u8 gFameCheckerFlavorText_Lance1[];\nextern const u8 gFameCheckerFlavorText_Lance2[];\nextern const u8 gFameCheckerFlavorText_Lance3[];\nextern const u8 gFameCheckerFlavorText_Lance4[];\nextern const u8 gFameCheckerFlavorText_Lance5[];\nextern const u8 gFameCheckerFlavorText_Bill0[];\nextern const u8 gFameCheckerFlavorText_Bill1[];\nextern const u8 gFameCheckerFlavorText_Bill2[];\nextern const u8 gFameCheckerFlavorText_Bill3[];\nextern const u8 gFameCheckerFlavorText_Bill4[];\nextern const u8 gFameCheckerFlavorText_Bill5[];\nextern const u8 gFameCheckerFlavorText_MrFuji0[];\nextern const u8 gFameCheckerFlavorText_MrFuji1[];\nextern const u8 gFameCheckerFlavorText_MrFuji2[];\nextern const u8 gFameCheckerFlavorText_MrFuji3[];\nextern const u8 gFameCheckerFlavorText_MrFuji4[];\nextern const u8 gFameCheckerFlavorText_MrFuji5[];\nextern const u8 gFameCheckerFlavorText_Giovanni0[];\nextern const u8 gFameCheckerFlavorText_Giovanni1[];\nextern const u8 gFameCheckerFlavorText_Giovanni2[];\nextern const u8 gFameCheckerFlavorText_Giovanni3[];\nextern const u8 gFameCheckerFlavorText_Giovanni4[];\nextern const u8 gFameCheckerFlavorText_Giovanni5[];\nextern const u8 gFameCheckerPersonName_ProfOak[];\nextern const u8 gFameCheckerPersonQuote_ProfOak[];\nextern const u8 gFameCheckerPersonName_Daisy[];\nextern const u8 gFameCheckerPersonQuote_Daisy[];\nextern const u8 gFameCheckerPersonName_Brock[];\nextern const u8 gFameCheckerPersonQuote_Brock[];\nextern const u8 gFameCheckerPersonName_Misty[];\nextern const u8 gFameCheckerPersonQuote_Misty[];\nextern const u8 gFameCheckerPersonName_LtSurge[];\nextern const u8 gFameCheckerPersonQuote_LtSurge[];\nextern const u8 gFameCheckerPersonName_Erika[];\nextern const u8 gFameCheckerPersonQuote_Erika[];\nextern const u8 gFameCheckerPersonName_Koga[];\nextern const u8 gFameCheckerPersonQuote_Koga[];\nextern const u8 gFameCheckerPersonName_Sabrina[];\nextern const u8 gFameCheckerPersonQuote_Sabrina[];\nextern const u8 gFameCheckerPersonName_Blaine[];\nextern const u8 gFameCheckerPersonQuote_Blaine[];\nextern const u8 gFameCheckerPersonName_Lorelei[];\nextern const u8 gFameCheckerPersonQuote_Lorelei[];\nextern const u8 gFameCheckerPersonName_Bruno[];\nextern const u8 gFameCheckerPersonQuote_Bruno[];\nextern const u8 gFameCheckerPersonName_Agatha[];\nextern const u8 gFameCheckerPersonQuote_Agatha[];\nextern const u8 gFameCheckerPersonName_Lance[];\nextern const u8 gFameCheckerPersonQuote_Lance[];\nextern const u8 gFameCheckerPersonName_Bill[];\nextern const u8 gFameCheckerPersonQuote_Bill[];\nextern const u8 gFameCheckerPersonName_MrFuji[];\nextern const u8 gFameCheckerPersonQuote_MrFuji[];\nextern const u8 gFameCheckerPersonName_Giovanni[];\nextern const u8 gFameCheckerPersonQuote_Giovanni[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_ProfOak0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_ProfOak1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_ProfOak2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_ProfOak3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_ProfOak4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_ProfOak5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Daisy0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Daisy1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Daisy2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Daisy3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Daisy4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Daisy5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Brock0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Brock1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Brock2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Brock3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Brock4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Brock5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Misty0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Misty1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Misty2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Misty3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Misty4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Misty5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_LtSurge0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_LtSurge1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_LtSurge2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_LtSurge3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_LtSurge4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_LtSurge5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Erika0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Erika1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Erika2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Erika3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Erika4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Erika5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Koga0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Koga1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Koga2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Koga3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Koga4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Koga5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Sabrina0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Sabrina1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Sabrina2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Sabrina3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Sabrina4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Sabrina5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Blaine0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Blaine1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Blaine2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Blaine3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Blaine4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Blaine5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Lorelei0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Lorelei1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Lorelei2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Lorelei3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Lorelei4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Lorelei5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Bruno0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Bruno1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Bruno2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Bruno3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Bruno4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Bruno5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Agatha0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Agatha1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Agatha2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Agatha3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Agatha4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Agatha5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Lance0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Lance1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Lance2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Lance3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Lance4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Lance5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Bill0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Bill1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Bill2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Bill3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Bill4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Bill5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_MrFuji0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_MrFuji1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_MrFuji2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_MrFuji3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_MrFuji4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_MrFuji5[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Giovanni0[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Giovanni1[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Giovanni2[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Giovanni3[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Giovanni4[];\nextern const u8 gFameCheckerFlavorTextOriginLocation_Giovanni5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_ProfOak0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_ProfOak1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_ProfOak2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_ProfOak3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_ProfOak4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_ProfOak5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Daisy0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Daisy1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Daisy2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Daisy3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Daisy4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Daisy5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Brock0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Brock1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Brock2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Brock3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Brock4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Brock5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Misty0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Misty1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Misty2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Misty3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Misty4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Misty5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_LtSurge0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_LtSurge1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_LtSurge2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_LtSurge3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_LtSurge4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_LtSurge5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Erika0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Erika1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Erika2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Erika3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Erika4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Erika5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Koga0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Koga1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Koga2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Koga3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Koga4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Koga5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Sabrina0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Sabrina1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Sabrina2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Sabrina3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Sabrina4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Sabrina5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Blaine0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Blaine1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Blaine2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Blaine3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Blaine4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Blaine5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Lorelei0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Lorelei1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Lorelei2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Lorelei3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Lorelei4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Lorelei5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Bruno0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Bruno1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Bruno2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Bruno3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Bruno4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Bruno5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Agatha0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Agatha1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Agatha2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Agatha3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Agatha4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Agatha5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Lance0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Lance1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Lance2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Lance3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Lance4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Lance5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Bill0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Bill1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Bill2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Bill3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Bill4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Bill5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_MrFuji0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_MrFuji1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_MrFuji2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_MrFuji3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_MrFuji4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_MrFuji5[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Giovanni0[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Giovanni1[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Giovanni2[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Giovanni3[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Giovanni4[];\nextern const u8 gFameCheckerFlavorTextOriginObjectName_Giovanni5[];\n\nextern const u8 gOtherText_NewName[];\nextern const u8 gNameChoice_Green[];\nextern const u8 gNameChoice_Red[];\nextern const u8 gNameChoice_Fire[];\nextern const u8 gNameChoice_Leaf[];\nextern const u8 gNameChoice_Gary[];\nextern const u8 gNameChoice_Kaz[];\nextern const u8 gNameChoice_Toru[];\nextern const u8 gNameChoice_Ash[];\nextern const u8 gNameChoice_Kene[];\nextern const u8 gNameChoice_Geki[];\nextern const u8 gNameChoice_Jak[];\nextern const u8 gNameChoice_Janne[];\nextern const u8 gNameChoice_Jonn[];\nextern const u8 gNameChoice_Kamon[];\nextern const u8 gNameChoice_Karl[];\nextern const u8 gNameChoice_Taylor[];\nextern const u8 gNameChoice_Oscar[];\nextern const u8 gNameChoice_Hiro[];\nextern const u8 gNameChoice_Max[];\nextern const u8 gNameChoice_Jon[];\nextern const u8 gNameChoice_Ralph[];\nextern const u8 gNameChoice_Kay[];\nextern const u8 gNameChoice_Tosh[];\nextern const u8 gNameChoice_Roak[];\nextern const u8 gNameChoice_Omi[];\nextern const u8 gNameChoice_Jodi[];\nextern const u8 gNameChoice_Amanda[];\nextern const u8 gNameChoice_Hillary[];\nextern const u8 gNameChoice_Makey[];\nextern const u8 gNameChoice_Michi[];\nextern const u8 gNameChoice_Paula[];\nextern const u8 gNameChoice_June[];\nextern const u8 gNameChoice_Cassie[];\nextern const u8 gNameChoice_Rey[];\nextern const u8 gNameChoice_Seda[];\nextern const u8 gNameChoice_Kiko[];\nextern const u8 gNameChoice_Mina[];\nextern const u8 gNameChoice_Norie[];\nextern const u8 gNameChoice_Sai[];\nextern const u8 gNameChoice_Momo[];\nextern const u8 gNameChoice_Suzi[];\nextern const u8 gControlsGuide_Text_Intro[];\nextern const u8 gControlsGuide_Text_DPad[];\nextern const u8 gControlsGuide_Text_AButton[];\nextern const u8 gControlsGuide_Text_BButton[];\nextern const u8 gControlsGuide_Text_StartButton[];\nextern const u8 gControlsGuide_Text_SelectButton[];\nextern const u8 gControlsGuide_Text_LRButtons[];\nextern const u8 gOakSpeech_Text_AskPlayerGender[];\nextern const u8 gPikachuIntro_Text_Page1[];\nextern const u8 gPikachuIntro_Text_Page2[];\nextern const u8 gPikachuIntro_Text_Page3[];\nextern const u8 gOakSpeech_Text_WelcomeToTheWorld[];\nextern const u8 gOakSpeech_Text_ThisWorld[];\nextern const u8 gOakSpeech_Text_IsInhabitedFarAndWide[];\nextern const u8 gOakSpeech_Text_IStudyPokemon[];\nextern const u8 gOakSpeech_Text_TellMeALittleAboutYourself[];\nextern const u8 gOakSpeech_Text_YourNameWhatIsIt[];\nextern const u8 gOakSpeech_Text_SoYourNameIsPlayer[];\nextern const u8 gOakSpeech_Text_WhatWasHisName[];\nextern const u8 gOakSpeech_Text_YourRivalsNameWhatWasIt[];\nextern const u8 gOakSpeech_Text_ConfirmRivalName[];\nextern const u8 gOakSpeech_Text_RememberRivalsName[];\nextern const u8 gOakSpeech_Text_LetsGo[];\n\n// Help System\nextern const u8 Help_Text_WhatShouldIDo[];\nextern const u8 Help_Text_HowDoIDoThis[];\nextern const u8 Help_Text_WhatDoesThisTermMean[];\nextern const u8 Help_Text_AboutThisGame[];\nextern const u8 Help_Text_TypeMatchupList[];\nextern const u8 Help_Text_Exit[];\nextern const u8 Help_Text_Cancel[];\nextern const u8 Help_Text_DescWhatShouldIDo[];\nextern const u8 Help_Text_DescHowDoIDoThis[];\nextern const u8 Help_Text_DescWhatDoesThisTermMean[];\nextern const u8 Help_Text_DescAboutThisGame[];\nextern const u8 Help_Text_DescTypeMatchupList[];\nextern const u8 Help_Text_DescExit[];\nextern const u8 Help_Text_Greetings[];\nextern const u8 Help_Text_PlayingForFirstTime[];\nextern const u8 Help_Text_WhatShouldIBeDoing[];\nextern const u8 Help_Text_CantGetOutOfRoom[];\nextern const u8 Help_Text_CantFindPersonIWant[];\nextern const u8 Help_Text_TalkedToEveryoneNowWhat[];\nextern const u8 Help_Text_SomeoneBlockingMyWay[];\nextern const u8 Help_Text_ICantGoOn[];\nextern const u8 Help_Text_OutOfThingsToDo[];\nextern const u8 Help_Text_WhatHappenedToItemIGot[];\nextern const u8 Help_Text_WhatAreMyAdventureBasics[];\nextern const u8 Help_Text_HowAreRoadsForestsDifferent[];\nextern const u8 Help_Text_HowAreCavesDifferent[];\nextern const u8 Help_Text_HowDoIProgress[];\nextern const u8 Help_Text_WhenCanIUseItem[];\nextern const u8 Help_Text_WhatsABattle[];\nextern const u8 Help_Text_HowDoIPrepareForBattle[];\nextern const u8 Help_Text_WhatIsAMonsVitality[];\nextern const u8 Help_Text_MyMonsAreHurt[];\nextern const u8 Help_Text_WhatIsStatusProblem[];\nextern const u8 Help_Text_WhatHappensIfAllMyMonsFaint[];\nextern const u8 Help_Text_CantCatchMons[];\nextern const u8 Help_Text_RanOutOfPotions[];\nextern const u8 Help_Text_CanIBuyPokeBalls[];\nextern const u8 Help_Text_WhatsATrainer[];\nextern const u8 Help_Text_HowDoIWinAgainstTrainer[];\nextern const u8 Help_Text_WhereDoMonsAppear[];\nextern const u8 Help_Text_WhatAreMoves[];\nextern const u8 Help_Text_WhatAreHiddenMoves[];\nextern const u8 Help_Text_WhatMovesShouldIUse[];\nextern const u8 Help_Text_WantToAddMoreMoves[];\nextern const u8 Help_Text_WantToMakeMonStronger[];\nextern const u8 Help_Text_FoeMonsTooStrong[];\nextern const u8 Help_Text_WhatDoIDoInCave[];\nextern const u8 Help_Text_NothingIWantToKnow[];\nextern const u8 Help_Text_WhatsPokemonCenter[];\nextern const u8 Help_Text_WhatsPokemonMart[];\nextern const u8 Help_Text_WantToEndGame[];\nextern const u8 Help_Text_WhatsAMon[];\nextern const u8 Help_Text_WhatIsThatPersonLike[];\nextern const u8 Help_Text_WhatDoesHiddenMoveDo[];\nextern const u8 Help_Text_WhatDoIDoInSafari[];\nextern const u8 Help_Text_WhatAreSafariRules[];\nextern const u8 Help_Text_WantToEndSafari[];\nextern const u8 Help_Text_WhatIsAGym[];\nextern const u8 Help_Text_AnswerPlayingForFirstTime[];\nextern const u8 Help_Text_AnswerWhatShouldIBeDoing[];\nextern const u8 Help_Text_AnswerCantGetOutOfRoom[];\nextern const u8 Help_Text_AnswerCantFindPersonIWant[];\nextern const u8 Help_Text_AnswerTalkedToEveryoneNowWhat[];\nextern const u8 Help_Text_AnswerSomeoneBlockingMyWay[];\nextern const u8 Help_Text_AnswerICantGoOn[];\nextern const u8 Help_Text_AnswerOutOfThingsToDo[];\nextern const u8 Help_Text_AnswerWhatHappenedToItemIGot[];\nextern const u8 Help_Text_AnswerWhatAreMyAdventureBasics[];\nextern const u8 Help_Text_AnswerHowAreRoadsForestsDifferent[];\nextern const u8 Help_Text_AnswerHowAreCavesDifferent[];\nextern const u8 Help_Text_AnswerHowDoIProgress[];\nextern const u8 Help_Text_AnswerWhenCanIUseItem[];\nextern const u8 Help_Text_AnswerWhatsABattle[];\nextern const u8 Help_Text_AnswerHowDoIPrepareForBattle[];\nextern const u8 Help_Text_AnswerWhatIsAMonsVitality[];\nextern const u8 Help_Text_AnswerMyMonsAreHurt[];\nextern const u8 Help_Text_AnswerWhatIsStatusProblem[];\nextern const u8 Help_Text_AnswerWhatHappensIfAllMyMonsFaint[];\nextern const u8 Help_Text_AnswerCantCatchMons[];\nextern const u8 Help_Text_AnswerRanOutOfPotions[];\nextern const u8 Help_Text_AnswerCanIBuyPokeBalls[];\nextern const u8 Help_Text_AnswerWhatsATrainer[];\nextern const u8 Help_Text_AnswerHowDoIWinAgainstTrainer[];\nextern const u8 Help_Text_AnswerWhereDoMonsAppear[];\nextern const u8 Help_Text_AnswerWhatAreMoves[];\nextern const u8 Help_Text_AnswerWhatAreHiddenMoves[];\nextern const u8 Help_Text_AnswerWhatMovesShouldIUse[];\nextern const u8 Help_Text_AnswerWantToAddMoreMoves[];\nextern const u8 Help_Text_AnswerWantToMakeMonStronger[];\nextern const u8 Help_Text_AnswerFoeMonsTooStrong[];\nextern const u8 Help_Text_AnswerWhatDoIDoInCave[];\nextern const u8 Help_Text_AnswerNothingIWantToKnow[];\nextern const u8 Help_Text_AnswerWhatsPokemonCenter[];\nextern const u8 Help_Text_AnswerWhatsPokemonMart[];\nextern const u8 Help_Text_AnswerWantToEndGame[];\nextern const u8 Help_Text_AnswerWhatsAMon[];\nextern const u8 Help_Text_AnswerWhatIsThatPersonLike[];\nextern const u8 Help_Text_AnswerWhatDoesHiddenMoveDo[];\nextern const u8 Help_Text_AnswerWhatDoIDoInSafari[];\nextern const u8 Help_Text_AnswerWhatAreSafariRules[];\nextern const u8 Help_Text_AnswerWantToEndSafari[];\nextern const u8 Help_Text_AnswerWhatIsAGym[];\nextern const u8 Help_Text_UsingPokedex[];\nextern const u8 Help_Text_UsingPokemon[];\nextern const u8 Help_Text_UsingSummary[];\nextern const u8 Help_Text_UsingSwitch[];\nextern const u8 Help_Text_UsingItem[];\nextern const u8 Help_Text_UsingBag[];\nextern const u8 Help_Text_UsingAnItem[];\nextern const u8 Help_Text_UsingKeyItem[];\nextern const u8 Help_Text_UsingPokeBall[];\nextern const u8 Help_Text_UsingPlayer[];\nextern const u8 Help_Text_UsingSave[];\nextern const u8 Help_Text_UsingOption[];\nextern const u8 Help_Text_UsingPotion[];\nextern const u8 Help_Text_UsingTownMap[];\nextern const u8 Help_Text_UsingTM[];\nextern const u8 Help_Text_UsingHM[];\nextern const u8 Help_Text_UsingMoveOutsideOfBattle[];\nextern const u8 Help_Text_RidingBicycle[];\nextern const u8 Help_Text_EnteringName[];\nextern const u8 Help_Text_UsingPC[];\nextern const u8 Help_Text_UsingBillsPC[];\nextern const u8 Help_Text_UsingWithdraw[];\nextern const u8 Help_Text_UsingDeposit[];\nextern const u8 Help_Text_UsingMove[];\nextern const u8 Help_Text_MovingItems[];\nextern const u8 Help_Text_UsingPlayersPC[];\nextern const u8 Help_Text_UsingWithdrawItem[];\nextern const u8 Help_Text_UsingDepositItem[];\nextern const u8 Help_Text_UsingMailbox[];\nextern const u8 Help_Text_UsingProfOaksPC[];\nextern const u8 Help_Text_OpeningMenu[];\nextern const u8 Help_Text_UsingFight[];\nextern const u8 Help_Text_UsingPokemon2[];\nextern const u8 Help_Text_UsingShift[];\nextern const u8 Help_Text_UsingSummary2[];\nextern const u8 Help_Text_UsingBag2[];\nextern const u8 Help_Text_ReadingPokedex[];\nextern const u8 Help_Text_UsingHomePC[];\nextern const u8 Help_Text_UsingItemStorage[];\nextern const u8 Help_Text_UsingWithdrawItem2[];\nextern const u8 Help_Text_UsingDepositItem2[];\nextern const u8 Help_Text_UsingMailbox2[];\nextern const u8 Help_Text_UsingRun[];\nextern const u8 Help_Text_RegisterKeyItem[];\nextern const u8 Help_Text_UsingBall[];\nextern const u8 Help_Text_UsingBait[];\nextern const u8 Help_Text_UsingRock[];\nextern const u8 Help_Text_UsingHallOfFame[];\nextern const u8 Help_Text_UsingKeySystem[];\nextern const u8 Help_Text_SortingBag[];\nextern const u8 Help_Text_HowToUsePokedex[];\nextern const u8 Help_Text_HowToUsePokemon[];\nextern const u8 Help_Text_HowToUseSummary[];\nextern const u8 Help_Text_HowToUseSwitch[];\nextern const u8 Help_Text_HowToUseItem[];\nextern const u8 Help_Text_HowToUseBag[];\nextern const u8 Help_Text_HowToUseAnItem[];\nextern const u8 Help_Text_HowToUseKeyItem[];\nextern const u8 Help_Text_HowToUsePokeBall[];\nextern const u8 Help_Text_HowToUsePlayer[];\nextern const u8 Help_Text_HowToUseSave[];\nextern const u8 Help_Text_HowToUseOption[];\nextern const u8 Help_Text_HowToUsePotion[];\nextern const u8 Help_Text_HowToUseTownMap[];\nextern const u8 Help_Text_HowToUseTM[];\nextern const u8 Help_Text_HowToUseHM[];\nextern const u8 Help_Text_HowToUseMoveOutsideOfBattle[];\nextern const u8 Help_Text_HowToRideBicycle[];\nextern const u8 Help_Text_HowToEnterName[];\nextern const u8 Help_Text_HowToUsePC[];\nextern const u8 Help_Text_HowToUseBillsPC[];\nextern const u8 Help_Text_HowToUseWithdraw[];\nextern const u8 Help_Text_HowToUseDeposit[];\nextern const u8 Help_Text_HowToUseMove[];\nextern const u8 Help_Text_HowToMoveItems[];\nextern const u8 Help_Text_HowToUsePlayersPC[];\nextern const u8 Help_Text_HowToUseWithdrawItem[];\nextern const u8 Help_Text_HowToUseDepositItem[];\nextern const u8 Help_Text_HowToUseMailbox[];\nextern const u8 Help_Text_HowToUseProfOaksPC[];\nextern const u8 Help_Text_HowToOpenMenu[];\nextern const u8 Help_Text_HowToUseFight[];\nextern const u8 Help_Text_HowToUsePokemon2[];\nextern const u8 Help_Text_HowToUseShift[];\nextern const u8 Help_Text_HowToUseSummary2[];\nextern const u8 Help_Text_HowToUseBag2[];\nextern const u8 Help_Text_HowToReadPokedex[];\nextern const u8 Help_Text_HowToUseHomePC[];\nextern const u8 Help_Text_HowToUseItemStorage[];\nextern const u8 Help_Text_HowToUseWithdrawItem2[];\nextern const u8 Help_Text_HowToUseDepositItem2[];\nextern const u8 Help_Text_HowToUseMailbox2[];\nextern const u8 Help_Text_HowToUseRun[];\nextern const u8 Help_Text_HowToRegisterKeyItem[];\nextern const u8 Help_Text_HowToUseBall[];\nextern const u8 Help_Text_HowToUseBait[];\nextern const u8 Help_Text_HowToUseRock[];\nextern const u8 Help_Text_HowToUseHallOfFame[];\nextern const u8 Help_Text_HowToUseKeySystemSettings[];\nextern const u8 Help_Text_HowToSortBag[];\nextern const u8 Help_Text_HP[];\nextern const u8 Help_Text_EXP[];\nextern const u8 Help_Text_Moves[];\nextern const u8 Help_Text_Attack[];\nextern const u8 Help_Text_Defense[];\nextern const u8 Help_Text_SpAtk[];\nextern const u8 Help_Text_SpDef[];\nextern const u8 Help_Text_Speed[];\nextern const u8 Help_Text_Level[];\nextern const u8 Help_Text_Type[];\nextern const u8 Help_Text_OT[];\nextern const u8 Help_Text_Item[];\nextern const u8 Help_Text_Ability[];\nextern const u8 Help_Text_Money[];\nextern const u8 Help_Text_MoveType[];\nextern const u8 Help_Text_Nature[];\nextern const u8 Help_Text_IDNo[];\nextern const u8 Help_Text_PP[];\nextern const u8 Help_Text_Power[];\nextern const u8 Help_Text_Accuracy[];\nextern const u8 Help_Text_FNT[];\nextern const u8 Help_Text_Items[];\nextern const u8 Help_Text_KeyItems[];\nextern const u8 Help_Text_PokeBalls[];\nextern const u8 Help_Text_Pokedex[];\nextern const u8 Help_Text_PlayTime[];\nextern const u8 Help_Text_Badges[];\nextern const u8 Help_Text_TextSpeed[];\nextern const u8 Help_Text_BattleScene[];\nextern const u8 Help_Text_BattleStyle[];\nextern const u8 Help_Text_Sound[];\nextern const u8 Help_Text_ButtonMode[];\nextern const u8 Help_Text_Frame[];\nextern const u8 Help_Text_Cancel2[];\nextern const u8 Help_Text_TM[];\nextern const u8 Help_Text_HM[];\nextern const u8 Help_Text_HMMove[];\nextern const u8 Help_Text_Evolution[];\nextern const u8 Help_Text_StatusProblem[];\nextern const u8 Help_Text_Pokemon[];\nextern const u8 Help_Text_IDNo2[];\nextern const u8 Help_Text_Money2[];\nextern const u8 Help_Text_Badges2[];\nextern const u8 Help_Text_DefineHP[];\nextern const u8 Help_Text_DefineEXP[];\nextern const u8 Help_Text_DefineMoves[];\nextern const u8 Help_Text_DefineAttack[];\nextern const u8 Help_Text_DefineDefense[];\nextern const u8 Help_Text_DefineSpAtk[];\nextern const u8 Help_Text_DefineSpDef[];\nextern const u8 Help_Text_DefineSpeed[];\nextern const u8 Help_Text_DefineLevel[];\nextern const u8 Help_Text_DefineType[];\nextern const u8 Help_Text_DefineOT[];\nextern const u8 Help_Text_DefineItem[];\nextern const u8 Help_Text_DefineAbility[];\nextern const u8 Help_Text_DefineMoney[];\nextern const u8 Help_Text_DefineMoveType[];\nextern const u8 Help_Text_DefineNature[];\nextern const u8 Help_Text_DefineIDNo[];\nextern const u8 Help_Text_DefinePP[];\nextern const u8 Help_Text_DefinePower[];\nextern const u8 Help_Text_DefineAccuracy[];\nextern const u8 Help_Text_DefineFNT[];\nextern const u8 Help_Text_DefineItems[];\nextern const u8 Help_Text_DefineKeyItems[];\nextern const u8 Help_Text_DefinePokeBalls[];\nextern const u8 Help_Text_DefinePokedex[];\nextern const u8 Help_Text_DefinePlayTime[];\nextern const u8 Help_Text_DefineBadges[];\nextern const u8 Help_Text_DefineTextSpeed[];\nextern const u8 Help_Text_DefineBattleScene[];\nextern const u8 Help_Text_DefineBattleStyle[];\nextern const u8 Help_Text_DefineSound[];\nextern const u8 Help_Text_DefineButtonMode[];\nextern const u8 Help_Text_DefineFrame[];\nextern const u8 Help_Text_DefineCancel2[];\nextern const u8 Help_Text_DefineTM[];\nextern const u8 Help_Text_DefineHM[];\nextern const u8 Help_Text_DefineHMMove[];\nextern const u8 Help_Text_DefineEvolution[];\nextern const u8 Help_Text_DefineStatusProblem[];\nextern const u8 Help_Text_DefinePokemon[];\nextern const u8 Help_Text_DefineIDNo2[];\nextern const u8 Help_Text_DefineMoney2[];\nextern const u8 Help_Text_DefineBadges2[];\nextern const u8 Help_Text_TheHelpSystem[];\nextern const u8 Help_Text_TheGame[];\nextern const u8 Help_Text_WirelessAdapter[];\nextern const u8 Help_Text_GameFundamentals1[];\nextern const u8 Help_Text_GameFundamentals2[];\nextern const u8 Help_Text_GameFundamentals3[];\nextern const u8 Help_Text_WhatArePokemon[];\nextern const u8 Help_Text_DescTheHelpSystem[];\nextern const u8 Help_Text_DescTheGame[];\nextern const u8 Help_Text_DescWirelessAdapter[];\nextern const u8 Help_Text_DescGameFundamentals1[];\nextern const u8 Help_Text_DescGameFundamentals2[];\nextern const u8 Help_Text_DescGameFundamentals3[];\nextern const u8 Help_Text_DescWhatArePokemon[];\nextern const u8 Help_Text_UsingTypeMatchupList[];\nextern const u8 Help_Text_OwnMoveDark[];\nextern const u8 Help_Text_OwnPokemonDark[];\nextern const u8 Help_Text_OwnMoveRock[];\nextern const u8 Help_Text_OwnPokemonRock[];\nextern const u8 Help_Text_OwnMovePsychic[];\nextern const u8 Help_Text_OwnPokemonPsychic[];\nextern const u8 Help_Text_OwnMoveFighting[];\nextern const u8 Help_Text_OwnPokemonFighting[];\nextern const u8 Help_Text_OwnMoveGrass[];\nextern const u8 Help_Text_OwnPokemonGrass[];\nextern const u8 Help_Text_OwnMoveGhost[];\nextern const u8 Help_Text_OwnPokemonGhost[];\nextern const u8 Help_Text_OwnMoveIce[];\nextern const u8 Help_Text_OwnPokemonIce[];\nextern const u8 Help_Text_OwnMoveGround[];\nextern const u8 Help_Text_OwnPokemonGround[];\nextern const u8 Help_Text_OwnMoveElectric[];\nextern const u8 Help_Text_OwnPokemonElectric[];\nextern const u8 Help_Text_OwnMovePoison[];\nextern const u8 Help_Text_OwnPokemonPoison[];\nextern const u8 Help_Text_OwnMoveDragon[];\nextern const u8 Help_Text_OwnPokemonDragon[];\nextern const u8 Help_Text_OwnMoveNormal[];\nextern const u8 Help_Text_OwnPokemonNormal[];\nextern const u8 Help_Text_OwnMoveSteel[];\nextern const u8 Help_Text_OwnPokemonSteel[];\nextern const u8 Help_Text_OwnMoveFlying[];\nextern const u8 Help_Text_OwnPokemonFlying[];\nextern const u8 Help_Text_OwnMoveFire[];\nextern const u8 Help_Text_OwnPokemonFire[];\nextern const u8 Help_Text_OwnMoveWater[];\nextern const u8 Help_Text_OwnPokemonWater[];\nextern const u8 Help_Text_OwnMoveBug[];\nextern const u8 Help_Text_OwnPokemonBug[];\nextern const u8 Help_Text_HowToUseTypeMatchupList[];\nextern const u8 Help_Text_TypeMatchupOwnMoveDark[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonDark[];\nextern const u8 Help_Text_TypeMatchupOwnMoveRock[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonRock[];\nextern const u8 Help_Text_TypeMatchupOwnMovePsychic[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonPsychic[];\nextern const u8 Help_Text_TypeMatchupOwnMoveFighting[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonFighting[];\nextern const u8 Help_Text_TypeMatchupOwnMoveGrass[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonGrass[];\nextern const u8 Help_Text_TypeMatchupOwnMoveGhost[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonGhost[];\nextern const u8 Help_Text_TypeMatchupOwnMoveIce[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonIce[];\nextern const u8 Help_Text_TypeMatchupOwnMoveGround[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonGround[];\nextern const u8 Help_Text_TypeMatchupOwnMoveElectric[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonElectric[];\nextern const u8 Help_Text_TypeMatchupOwnMovePoison[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonPoison[];\nextern const u8 Help_Text_TypeMatchupOwnMoveDragon[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonDragon[];\nextern const u8 Help_Text_TypeMatchupOwnMoveNormal[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonNormal[];\nextern const u8 Help_Text_TypeMatchupOwnMoveSteel[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonSteel[];\nextern const u8 Help_Text_TypeMatchupOwnMoveFlying[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonFlying[];\nextern const u8 Help_Text_TypeMatchupOwnMoveFire[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonFire[];\nextern const u8 Help_Text_TypeMatchupOwnMoveWater[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonWater[];\nextern const u8 Help_Text_TypeMatchupOwnMoveBug[];\nextern const u8 Help_Text_TypeMatchupOwnPokemonBug[];\nextern const u8 Help_Text_Version[];\nextern const u8 Help_Text_Difficulty[];\nextern const u8 Help_Text_Nuzlocke[];\nextern const u8 Help_Text_Nuzlocke_Catching[];\nextern const u8 Help_Text_IvCalc[];\nextern const u8 Help_Text_EvCalc[];\nextern const u8 Help_Text_NoFreeHeals[];\nextern const u8 Help_Text_DefineVersion[];\nextern const u8 Help_Text_DefineDifficulty[];\nextern const u8 Help_Text_DefineNuzlocke[];\nextern const u8 Help_Text_DefineIvCalc[];\nextern const u8 Help_Text_DefineEvCalc[];\nextern const u8 Help_Text_DefineNuzlocke_Catching[];\nextern const u8 Help_Text_NuzlockeLosing[];\nextern const u8 Help_Text_DefineNuzlockeLosing[];\nextern const u8 Help_Text_DefineNoFreeHeals[];\n\nextern const u8 EventScript_FldEffStrength[];\nextern const u8 EventScript_FailSweetScent[];\nextern const u8 EventScript_FldEffRockSmash[];\n\nextern const u8 SafariZone_EventScript_TimesUp[];\nextern const u8 SafariZone_EventScript_RetirePrompt[];\nextern const u8 SafariZone_EventScript_OutOfBallsMidBattle[];\nextern const u8 SafariZone_EventScript_OutOfBalls[];\n\nextern const u8 EventScript_ItemfinderDigUpUnderfootItem[];\n\n// battle_setup\nextern const u8 EventScript_DoNoIntroTrainerBattle[];\nextern const u8 EventScript_TryDoDoubleTrainerBattle[];\nextern const u8 EventScript_TryDoNormalTrainerBattle[];\nextern const u8 EventScript_TryDoDoubleRematchBattle[];\nextern const u8 EventScript_TryDoRematchBattle[];\nextern const u8 EventScript_DoTrainerBattleFromApproach[];\n\n// new_game\nextern const u8 EventScript_ResetAllMapFlags[];\n\n// player_pc\nextern const u8 EventScript_PalletTown_PlayersHouse_2F_ShutDownPC[];\n\n// field_screen_effect\nextern const u8 EventScript_AfterWhiteOutMomHeal[];\nextern const u8 EventScript_AfterWhiteOutHeal[];\nextern const u8 EventScript_NuzlockeGameOver[];\nextern const u8 EventScript_NuzlockeHaveMons_Nurse[];\nextern const u8 EventScript_NoPMCHaveMons_Nurse[];\nextern const u8 EventScript_NuzlockeGameOver_Mom[];\nextern const u8 EventScript_NuzlockeHaveMons_Mom[];\nextern const u8 EventScript_NoPMCHaveMons_Mom[];\nextern const u8 EventScript_BothGameOver[];\nextern const u8 EventScript_NoPMCGameOver[];\nextern const u8 EventScript_BothGameOver_Mom[];\nextern const u8 EventScript_NoPMCGameOver_Mom[];\n\n// start_menu\nextern const u8 gText_WouldYouLikeToSaveTheGame[];\nextern const u8 gText_AlreadySaveFile_WouldLikeToOverwrite[];\nextern const u8 gText_SavingDontTurnOffThePower[];\nextern const u8 gText_PlayerSavedTheGame[];\nextern const u8 gText_DifferentGameFile[];\n\n// script_menu\nextern const u8 EventScript_ReleaseEnd[];\nextern const u8 CableClub_Text_TradeMonsUsingLinkCable[];\nextern const u8 CableClub_Text_BattleUsingLinkCable[];\nextern const u8 CableClub_Text_CancelSelectedItem[];\nextern const u8 CableClub_Text_YouMayTradeHere[];\nextern const u8 CableClub_Text_YouMayBattleHere[];\nextern const u8 CableClub_Text_CanMakeBerryPowder[];\nextern const u8 EventScript_PC[];\n\nextern const u8 EventScript_RepelWoreOff[];\n\n// battle_message\nextern const u8 Text_MonSentToBoxInSomeonesPC[];\nextern const u8 Text_MonSentToBoxInBillsPC[];\nextern const u8 Text_MonSentToBoxSomeonesBoxFull[];\nextern const u8 Text_MonSentToBoxBillsBoxFull[];\n\nextern const u8 EventScript_BagItemCanBeRegistered[];\n\n// fldeff_cut\nextern const u8 EventScript_FldEffCut[];\n\n// cable_club\nextern const u8 CableClub_Text_WhenAllPlayersReadyAConfirmBCancel[];\nextern const u8 CableClub_Text_AwaitingLinkupBCancel[];\nextern const u8 CableClub_Text_StartLinkWithXPlayersAConfirmBCancel[];\nextern const u8 CableClub_Text_PleaseWaitBCancel[];\n\n// fldeff_flash\nextern const u8 EventScript_FldEffFlash[];\n\n// field_control_avatar\nextern const u8 EventScript_CancelMessageBox[];\nextern const u8 PalletTown_PlayersHouse_2F_EventScript_PC[];\nextern const u8 EventScript_HiddenItemScript[];\nextern const u8 EventScript_PC[];\nextern const u8 EventScript_WallTownMap[];\nextern const u8 EventScript_Bookshelf[];\nextern const u8 EventScript_PokeMartShelf[];\nextern const u8 EventScript_Food[];\nextern const u8 EventScript_ImpressiveMachine[];\nextern const u8 EventScript_Blueprints[];\nextern const u8 EventScript_VideoGame[];\nextern const u8 EventScript_Burglary[];\nextern const u8 EventScript_Computer[];\nextern const u8 TrainerTower_EventScript_ShowTime[];\nextern const u8 EventScript_PlayerFacingTVScreen[];\nextern const u8 EventScript_Cabinet[];\nextern const u8 EventScript_Kitchen[];\nextern const u8 EventScript_Dresser[];\nextern const u8 EventScript_Snacks[];\nextern const u8 EventScript_Painting[];\nextern const u8 EventScript_PowerPlantMachine[];\nextern const u8 EventScript_Telephone[];\nextern const u8 EventScript_AdvertisingPoster[];\nextern const u8 EventScript_TastyFood[];\nextern const u8 EventScript_TrashBin[];\nextern const u8 EventScript_Cup[];\nextern const u8 EventScript_PolishedWindow[];\nextern const u8 EventScript_BeautifulSkyWindow[];\nextern const u8 EventScript_BlinkingLights[];\nextern const u8 EventScript_NeatlyLinedUpTools[];\nextern const u8 CableClub_EventScript_ShowWirelessCommunicationScreen[];\nextern const u8 EventScript_Questionnaire[];\nextern const u8 CableClub_EventScript_ShowBattleRecords[];\nextern const u8 EventScript_Indigo_UltimateGoal[];\nextern const u8 EventScript_Indigo_HighestAuthority[];\nextern const u8 EventScript_PokemartSign[];\nextern const u8 EventScript_PokecenterSign[];\nextern const u8 EventScript_CurrentTooFast[];\nextern const u8 EventScript_UseSurf[];\nextern const u8 EventScript_Waterfall[];\nextern const u8 EventScript_CantUseWaterfall[];\nextern const u8 EventScript_DeepWater[];\nextern const u8 EventScript_TrySurface[];\nextern const u8 EventScript_VsSeekerChargingDone[];\nextern const u8 EventScript_FieldPoison[];\nextern const u8 EventScript_EggHatch[];\nextern const u8 EventScript_DoFallWarp[];\nextern const u8 EventScript_SafariZone_ExtensionSign[];\n\n// overworld\n\nextern const u8 EventScript_ResetEliteFourEnd[];\nextern const u8 CableClub_EventScript_DoLinkRoomExit[];\nextern const u8 CableClub_EventScript_TooBusyToNotice[];\nextern const u8 CableClub_EventScript_ReadTrainerCard[];\nextern const u8 CableClub_EventScript_ReadTrainerCardColored[];\nextern const u8 BattleColosseum_4P_EventScript_PlayerSpot0[];\nextern const u8 BattleColosseum_4P_EventScript_PlayerSpot1[];\nextern const u8 BattleColosseum_4P_EventScript_PlayerSpot2[];\nextern const u8 BattleColosseum_4P_EventScript_PlayerSpot3[];\nextern const u8 RecordCorner_EventScript_Spot0[];\nextern const u8 RecordCorner_EventScript_Spot1[];\nextern const u8 RecordCorner_EventScript_Spot2[];\nextern const u8 RecordCorner_EventScript_Spot3[];\nextern const u8 BattleColosseum_2P_EventScript_PlayerSpot0[];\nextern const u8 BattleColosseum_2P_EventScript_PlayerSpot1[];\nextern const u8 TradeCenter_EventScript_Chair0[];\nextern const u8 TradeCenter_EventScript_Chair1[];\nextern const u8 TradeCenter_ConfirmLeaveRoom[];\nextern const u8 TradeCenter_TerminateLink[];\n\nextern const u8 Help_Text_UsingOptionsSubmenu[];\nextern const u8 Help_Text_HowToUseOptionSubmenu[];\nextern const u8 Help_Text_DefineBattleTransitions[];\nextern const u8 Help_Text_DefineBattleIntroAnims[];\nextern const u8 Help_Text_DefineMoveAnimations[];\nextern const u8 Help_Text_DefineHpBarAnimSpeed[];\nextern const u8 Help_Text_DefineExpBarAnimSpeed[];\nextern const u8 Help_Text_DefineBack[];\nextern const u8 Help_Text_BattleTransitions[];\nextern const u8 Help_Text_BattleIntroAnim[];\nextern const u8 Help_Text_MoveAnimations[];\nextern const u8 Help_Text_HpBarAnimSpeed[];\nextern const u8 Help_Text_ExpBarAnimSpeed[];\nextern const u8 Help_Text_Back[];\nextern const u8 Help_Text_AdvancedKeys[];\nextern const u8 Help_Text_DefineAdvancedKeys[];\nextern const u8 Help_Text_DefineAdvancedKeysBack[];\nextern const u8 Help_Text_UsingKeySystemSubmenu[];\nextern const u8 Help_Text_HowToUseKeySystemSubmenu[];\nextern const u8 Help_Text_ExpMod[];\nextern const u8 Help_Text_DefineExpMod[];\nextern const u8 Help_Text_FRExclusives[];\nextern const u8 Help_Text_LGExclusives[];\nextern const u8 Help_Text_DefineFRExclusives[];\nextern const u8 Help_Text_DefineLGExclusives[];\n\n#endif //GUARD_EVENT_SCRIPTS_H\n"
  },
  {
    "path": "include/evolution_graphics.h",
    "content": "#ifndef GUARD_EVOLUTION_GRAPHICS_H\n#define GUARD_EVOLUTION_GRAPHICS_H\n\n#include \"global.h\"\n\nvoid LoadEvoSparkleSpriteAndPal(void);\n\nu8 EvolutionSparkles_SpiralUpward(u16 arg0);\nu8 EvolutionSparkles_ArcDown(void);\nu8 EvolutionSparkles_CircleInward(void);\nu8 EvolutionSparkles_SprayAndFlash(u16 species);\nu8 EvolutionSparkles_SprayAndFlash_Trade(u16 species);\nu8 CycleEvolutionMonSprite(u8 preEvoSpriteId, u8 postEvoSpriteId);\n\n#define EvoGraphicsTaskEvoStop  data[8]\n\n#endif // GUARD_EVOLUTION_GRAPHICS_H\n"
  },
  {
    "path": "include/evolution_scene.h",
    "content": "#ifndef GUARD_EVOLUTION_SCENE_H\n#define GUARD_EVOLUTION_SCENE_H\n\n#include \"global.h\"\n\nextern void (*gCB2_AfterEvolution)(void);\n\nvoid BeginEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8, u8 partyId);\nvoid EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8, u8 partyId);\nvoid TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpriteId, u8 partyId);\nvoid IsMovingBackgroundTaskRunning(void);\n\n#endif // GUARD_EVOLUTION_SCENE_H\n"
  },
  {
    "path": "include/fame_checker.h",
    "content": "#ifndef GUARD_FAME_CHECKER_H\n#define GUARD_FAME_CHECKER_H\n\n#include \"main.h\"\n#include \"constants/fame_checker.h\"\n\nenum {\n    FCWINDOWID_LIST,\n    FCWINDOWID_UIHELP,\n    FCWINDOWID_MSGBOX,\n    FCWINDOWID_ICONDESC\n};\n\nextern struct ListMenuTemplate gFameChecker_ListMenuTemplate;\nextern u8 gIconDescriptionBoxIsOpen;\n\nvoid ResetFameChecker(void);\nvoid FullyUnlockFameChecker(void);\nvoid UseFameChecker(MainCallback savedCallback);\nvoid SetFlavorTextFlagFromSpecialVars(void);\nvoid UpdatePickStateFromSpecialVar8005(void);\nvoid CheckFilledFameCheckerFor0x8004(void);\n\n#endif //GUARD_FAME_CHECKER_H\n"
  },
  {
    "path": "include/faraway_island.h",
    "content": "#ifndef GUARD_FARAWAY_ISLAND_H\n#define GUARD_FARAWAY_ISLAND_H\n\nu32 GetMewMoveDirection(void);\nbool8 ShouldMewShakeGrass(struct ObjectEvent*);\nvoid UpdateFarawayIslandStepCounter(void);\nbool8 ObjectEventIsFarawayIslandMew(struct ObjectEvent *);\nbool8 IsMewPlayingHideAndSeek(void);\n\n#endif // GUARD_FARAWAY_ISLAND_H\n"
  },
  {
    "path": "include/field_camera.h",
    "content": "#ifndef GUARD_FIELD_CAMERA_H\n#define GUARD_FIELD_CAMERA_H\n\n#include \"global.h\"\n\n// Exported type declarations\n\nstruct CameraObject\n{\n    void (*callback)(struct CameraObject *);\n    u32 spriteId;\n    s32 movementSpeedX;\n    s32 movementSpeedY;\n    s32 x;\n    s32 y;\n};\n\n// Exported RAM declarations\n\nextern struct CameraObject gFieldCamera;\nextern u16 gTotalCameraPixelOffsetX;\nextern u16 gTotalCameraPixelOffsetY;\nextern bool8 gBikeCameraAheadPanback;\n\n// Exported ROM declarations\n\nvoid DrawWholeMapView(void);\nvoid CurrentMapDrawMetatileAt(int x, int y);\nvoid FieldCameraGetPixelOffsetAtGround(s16 *x, s16 *y);\nvoid SetCameraPanningCallback(void (*cb)(void));\nvoid SetCameraPanning(s16 x, s16 y);\nvoid UpdateCameraPanning(void);\nvoid InstallCameraPanAheadCallback(void);\nvoid DrawDoorMetatileAt(int x, int y, const u16 *data);\nvoid move_tilemap_camera_to_upper_left_corner(void);\nvoid CameraUpdate(void);\nvoid FieldUpdateBgTilemapScroll(void);\nvoid ResetCameraUpdateInfo(void);\nu32 InitCameraUpdateCallback(u8 trackedSpriteId);\nvoid CameraUpdateNoObjectRefresh(void);\n\n#endif //GUARD_FIELD_CAMERA_H\n"
  },
  {
    "path": "include/field_control_avatar.h",
    "content": "#ifndef GUARD_FIELD_CONTROL_AVATAR_H\n#define GUARD_FIELD_CONTROL_AVATAR_H\n\n#include \"global.h\"\n\nstruct FieldInput\n{\n    bool8 pressedAButton:1;\n    bool8 checkStandardWildEncounter:1;\n    bool8 pressedStartButton:1;\n    bool8 pressedSelectButton:1;\n    bool8 heldDirection:1;\n    bool8 heldDirection2:1;\n    bool8 tookStep:1;\n    bool8 pressedBButton:1;\n    bool8 pressedRButton:1;\n    bool8 input_field_1_0:1;\n    bool8 input_field_1_1:1;\n    bool8 input_field_1_2:1;\n    bool8 input_field_1_3:1;\n    u8 dpadDirection;\n};\n\nextern struct FieldInput gFieldInputRecord;\n\nvoid RestartWildEncounterImmunitySteps(void);\nvoid ClearPoisonStepCounter(void);\nint SetCableClubWarp(void);\nvoid HandleBoulderFallThroughHole(struct ObjectEvent *);\nbool8 dive_warp(struct MapPosition * pos, u16 behavior);\nbool8 IsDirectionalStairWarpMetatileBehavior(u16 metatileBehavior, u8 playerDirection);\nconst u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatileBehavior, u8 direction);\nconst u8 *GetCoordEventScriptAtMapPosition(struct MapPosition *position);\nvoid FieldClearPlayerInput(struct FieldInput *input);\nint ProcessPlayerFieldInput(struct FieldInput *input);\nvoid FieldInput_HandleCancelSignpost(struct FieldInput * input);\nvoid FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys);\nvoid HandleBoulderActivateVictoryRoadSwitch(u16 x, u16 y);\nu8 TrySetDiveWarp(void);\n\n#endif //GUARD_FIELD_CONTROL_AVATAR_H\n"
  },
  {
    "path": "include/field_door.h",
    "content": "#ifndef GUARD_FIELDDOOR_H\n#define GUARD_FIELDDOOR_H\n\n#include \"global.h\"\n\nvoid FieldSetDoorOpened(int x, int y);\nvoid FieldSetDoorClosed(int x, int y);\ns8 FieldAnimateDoorClose(int x, int y);\ns8 FieldAnimateDoorOpen(int x, int y);\nbool8 FieldIsDoorAnimationRunning(void);\nu16 GetDoorSoundEffect(int x, int y);\n\n#endif\n"
  },
  {
    "path": "include/field_effect.h",
    "content": "#ifndef GUARD_FIELD_EFFECTS_H\n#define GUARD_FIELD_EFFECTS_H\n\n#include \"global.h\"\n#include \"constants/field_effects.h\"\n\nextern u32 gFieldEffectArguments[8];\nextern void (*gPostMenuFieldCallback)(void);\nextern bool8 (*gFieldCallback2)(void);\n\nu32 FieldEffectStart(u8);\nbool8 FieldEffectActiveListContains(u8 id);\nvoid CreateTeleportFieldEffectTask(void);\nvoid FieldEffectActiveListRemove(u8 id);\nvoid StartEscapeRopeFieldEffect(void);\nvoid FieldEffectStop(struct Sprite *sprite, u8 id);\nu8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer);\nvoid FieldCB_FallWarpExit(void);\nvoid StartEscalatorWarp(u8 metatileBehavior, u8 priority);\nvoid StartLavaridgeGymB1FWarp(u8 a0);\nvoid StartLavaridgeGym1FWarp(u8 a0);\nvoid ApplyGlobalFieldPaletteTint(u8 paletteIdx);\nvoid FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId);\nu8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, bool8 unused);\nvoid ReturnToFieldFromFlyMapSelect(void);\nvoid MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b);\nvoid SpriteCB_PopOutOfAsh(struct Sprite *sprite);\nvoid SpriteCB_AshLaunch(struct Sprite *sprite);\nvoid FieldEffectActiveListClear(void);\n\n#endif //GUARD_FIELD_EFFECTS_H\n"
  },
  {
    "path": "include/field_effect_helpers.h",
    "content": "//\n// Created by scott on 9/7/2017.\n//\n\n#ifndef GUARD_FIELD_EFFECT_HELPERS_H\n#define GUARD_FIELD_EFFECT_HELPERS_H\n\n#include \"global.h\"\n\nenum {\n    BOB_NONE,\n    BOB_PLAYER_AND_MON,\n    BOB_MON_ONLY, // when player has jumped / flown off\n};\n\nu8 CreateWarpArrowSprite(void);\nvoid SetSurfBlob_BobState(u8 spriteId, u8 bobState);\nvoid SetSurfBlob_DontSyncAnim(u8 spriteId, bool8 value);\nvoid StartAshFieldEffect(s16, s16, u16, s16);\nvoid StartRevealDisguise(struct ObjectEvent *);\nbool8 UpdateRevealDisguise(struct ObjectEvent *);\nvoid SetUpReflection(struct ObjectEvent *, struct Sprite *, u8);\nu32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent *);\nu8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y);\nvoid ShowWarpArrowSprite(u8 spriteId, u8 direction, s16 x, s16 y);\nvoid SetSpriteInvisible(u8 spriteId);\nvoid SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset);\nvoid UpdateJumpImpactEffect(struct Sprite *sprite);\nvoid UpdateShadowFieldEffect(struct Sprite *sprite);\nvoid UpdateBubblesFieldEffect(struct Sprite *sprite);\nvoid UpdateSparkleFieldEffect(struct Sprite *sprite);\nvoid UpdateTallGrassFieldEffect(struct Sprite *sprite);\nvoid WaitFieldEffectSpriteAnim(struct Sprite *sprite);\nvoid UpdateAshFieldEffect(struct Sprite *sprite);\nvoid UpdateSurfBlobFieldEffect(struct Sprite *sprite);\nvoid UpdateFootprintsTireTracksFieldEffect(struct Sprite *sprite);\nvoid UpdateSplashFieldEffect(struct Sprite *sprite);\nvoid UpdateShortGrassFieldEffect(struct Sprite *sprite);\nvoid UpdateLongGrassFieldEffect(struct Sprite *sprite);\nvoid UpdateSandPileFieldEffect(struct Sprite *sprite);\nvoid UpdateDisguiseFieldEffect(struct Sprite *sprite);\nvoid UpdateHotSpringsWaterFieldEffect(struct Sprite *sprite);\nu8 StartUnderwaterSurfBlobBobbing(u8 oldSpriteId);\n\n#endif //GUARD_FIELD_EFFECT_HELPERS_H\n"
  },
  {
    "path": "include/field_effect_scripts.h",
    "content": "#ifndef GUARD_FIELD_EFFECT_SCRIPTS_H\n#define GUARD_FIELD_EFFECT_SCRIPTS_H\n\nextern const u8 *const gFieldEffectScriptPointers[];\n\n#endif //GUARD_FIELD_EFFECT_SCRIPTS_H\n"
  },
  {
    "path": "include/field_fadetransition.h",
    "content": "#ifndef GUARD_FIELD_FADETRANSITION_H\n#define GUARD_FIELD_FADETRANSITION_H\n\n#include \"global.h\"\n\nvoid FieldCB_RushInjuredPokemonToCenter(void);\nvoid DoWarp(void);\nvoid DoDiveWarp(void);\nvoid DoDoorWarp(void);\n\nvoid DoFallWarp(void);\nvoid DoTeleportWarp(void);\nvoid DoTeleport2Warp(void);\nvoid FieldCB_DefaultWarpExit(void);\nvoid WarpFadeOutScreen(void);\nvoid FieldCB_ContinueScriptHandleMusic(void);\nvoid FadeInFromBlack(void);\nvoid FadeTransition_FadeInOnReturnToStartMenu(void);\nvoid WarpFadeInScreen(void);\n\nvoid FieldCB_ContinueScriptUnionRoom(void);\n\nbool32 FieldFadeTransitionBackgroundEffectIsFinished(void);\nvoid palette_bg_faded_fill_black(void);\nvoid DoStairWarp(u16 metatileBehavior, u16 delay);\nvoid DoEscalatorWarp(u8 a0);\nvoid DoLavaridgeGymB1FWarp(void);\nvoid DoLavaridgeGym1FWarp(void);\nvoid DoTeleportWarp(void);\nvoid DoUnionRoomWarp(void);\nvoid FieldCB_ReturnToFieldWirelessLink(void);\nvoid FieldCB_ReturnToFieldCableLink(void);\nbool8 FieldCB_ReturnToFieldOpenStartMenu(void);\nvoid FieldCB_ContinueScript(void);\nvoid FieldCB_ContinueScriptHandleMusic(void);\nvoid FieldCB_WarpExitFadeFromBlack(void);\n\n#endif // GUARD_FIELD_FADETRANSITION_H\n"
  },
  {
    "path": "include/field_message_box.h",
    "content": "#ifndef GUARD_FIELD_MESSAGE_BOX_H\n#define GUARD_FIELD_MESSAGE_BOX_H\n\n#include \"global.h\"\n\nenum {\n    FIELD_MESSAGE_BOX_HIDDEN,\n    FIELD_MESSAGE_BOX_UNUSED,\n    FIELD_MESSAGE_BOX_NORMAL,\n    FIELD_MESSAGE_BOX_AUTO_SCROLL,\n};\n\nbool8 ShowFieldMessage(const u8 *message);\nbool8 ShowFieldAutoScrollMessage(const u8 *message);\nvoid HideFieldMessageBox(void);\nbool8 IsFieldMessageBoxHidden(void);\nu8 GetFieldMessageBoxType(void);\nvoid InitFieldMessageBox(void);\n\n#endif // GUARD_FIELD_MESSAGE_BOX_H\n"
  },
  {
    "path": "include/field_player_avatar.h",
    "content": "#ifndef GUARD_FIELD_PLAYER_AVATAR_H\n#define GUARD_FIELD_PLAYER_AVATAR_H\n\n#include \"global.h\"\n\nvoid ClearPlayerAvatarInfo(void);\nvoid SetPlayerAvatarExtraStateTransition(u8, u8);\nu8 GetPlayerAvatarGenderByGraphicsId(u8);\nbool8 TestPlayerAvatarFlags(u8);\nvoid PlayerGetDestCoords(s16 *, s16 *);\nu8 GetPlayerFacingDirection(void);\nu8 GetPlayerMovementDirection(void);\nu8 PlayerGetCopyableMovement(void);\nvoid MovePlayerNotOnBike(u8 direction, u16 heldKeys);\n\nvoid MovementType_Player(struct Sprite *sprite);\nvoid HandleEnforcedLookDirectionOnPlayerStopMoving(void);\nvoid StopPlayerAvatar(void);\nvoid GetXYCoordsOneStepInFrontOfPlayer(s16 *xPtr, s16 *yPtr);\nu8 GetPlayerAvatarGraphicsIdByStateId(u8);\nvoid SetPlayerAvatarStateMask(u8 mask);\nvoid AlignFishingAnimationFrames(struct Sprite *sprite);\nvoid CreateStopSurfingTask_NoMusicChange(u8 direction);\nvoid SavePlayerFacingDirectionForTeleport(u8 direction);\nvoid SetPlayerAvatarTransitionFlags(u16 flags);\nbool8 IsPlayerFacingSurfableFishableWater(void);\nvoid StartFishing(u8 secondaryId);\nu8 GetPlayerAvatarObjectId(void);\nu8 PlayerGetElevation(void);\nu8 GetPlayerAvatarGraphicsIdByCurrentState(void);\nvoid StartPlayerAvatarSummonMonForFieldMoveAnim(void);\nvoid SetPlayerInvisibility(bool8);\nvoid StartTeleportInPlayerAnim(void);\nvoid StartTeleportWarpOutPlayerAnim(void);\nbool32 WaitTeleportWarpOutPlayerAnim(void);\nbool32 WaitTeleportInPlayerAnim(void);\nbool8 PartyHasMonWithSurf(void);\nbool8 IsPlayerSurfingNorth(void);\nu8 player_get_pos_including_state_based_drift(s16 *x, s16 *y);\nvoid StartPlayerAvatarVsSeekerAnim(void);\nu8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender);\nu8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender);\nu8 CheckForObjectEventCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction, u8 metatileBehavior);\nvoid PlayerWalkSlower(u8 direction);\nvoid PlayerWalkSlow(u8 direction);\nvoid PlayerWalkNormal(u8 direction);\nvoid PlayerWalkFast(u8 direction);\nvoid PlayerGlide(u8 direction);\nvoid PlayerRideWaterCurrent(u8 direction);\nvoid PlayerWalkFaster(u8 direction);\nvoid PlayerRun(u8 direction);\nvoid PlayerRunSlow(u8 direction);\nvoid PlayerOnBikeCollide(u8 direction);\nvoid PlayerNotOnBikeCollide(u8 direction);\nvoid PlayerFaceDirection(u8 direction);\nvoid PlayerFaceDirectionFast(u8 direction);\nvoid PlayerTurnInPlace(u8 direction);\nvoid PlayerJumpLedge(u8 direction);\nvoid PlayerShakeHeadOrWalkInPlace(void);\nvoid player_step(u8 direction, u16 newKeys, u16 heldKeys);\nbool32 PlayerIsMovingOnRockStairs(u8 direction);\nvoid UpdatePlayerAvatarTransitionState(void);\nvoid InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender);\nvoid InitDivingPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender);\nvoid PlayerUseAcroBikeOnBumpySlope(u8 direction);\nu8 GetRSAvatarGraphicsIdByGender(u8 gender);\nu8 GetEMAvatarGraphicsIdByGender(u8 gender);\n\n#endif //GUARD_FIELD_PLAYER_AVATAR_H\n"
  },
  {
    "path": "include/field_poison.h",
    "content": "#ifndef GUARD_FIELD_POISON_H\n#define GUARD_FIELD_POISON_H\n\n#include \"global.h\"\n\nenum {\n    FLDPSN_NONE,\n    FLDPSN_PSN,\n    FLDPSN_FNT\n};\n\ns32 DoPoisonFieldEffect(void);\n\n#endif //GUARD_FIELD_POISON_H\n"
  },
  {
    "path": "include/field_screen.h",
    "content": "#ifndef GUARD_FIELD_SCREEN_H\n#define GUARD_FIELD_SCREEN_H\n\n#include \"global.h\"\n\n// Exported type declarations\n\n// Exported RAM declarations\n\n// Exported ROM declarations\nvoid pal_fill_black(void);\nvoid UpdateWeatherPerDay(u16 days);\n\n#endif //GUARD_FIELD_SCREEN_H\n"
  },
  {
    "path": "include/field_screen_effect.h",
    "content": "#ifndef GUARD_FIELD_SCREEN_EFFECT_H\n#define GUARD_FIELD_SCREEN_EFFECT_H\n\n#include \"global.h\"\n\nvoid AnimateFlash(u8);\nvoid FieldCB_SafariZoneRanOutOfBalls(void);\nvoid DoOutwardBarnDoorWipe(void);\nvoid Task_BarnDoorWipe(u8 taskId);\nvoid FieldCB_RushInjuredPokemonToCenter(void);\nvoid WriteFlashScanlineEffectBuffer(u8 flashLevel);\n\nextern const s32 gMaxFlashLevel;\n\n#endif // GUARD_FIELD_SCREEN_EFFECT_H\n"
  },
  {
    "path": "include/field_specials.h",
    "content": "#ifndef GUARD_FIELD_SPECIALS_H\n#define GUARD_FIELD_SPECIALS_H\n\n#include \"global.h\"\n\nu8 GetLeadMonIndex(void);\ns32 CountDigits(s32 number);\nvoid TV_PrintIntToStringVar(u8 varidx, s32 number);\nu16 GetStarterSpecies(void);\nvoid StopPokemonLeagueLightingEffectTask(void);\nvoid FieldCB_ShowPortholeView(void);\nu8 ContextNpcGetTextColor(void);\nvoid SetPCBoxToSendMon(u8);\nu16 GetPCBoxToSendMon(void);\nbool8 IsDestinationBoxFull(void);\nbool8 ShouldShowBoxWasFullMessage(void);\nu16 GetHiddenItemAttr(u32 hiddenItem, u8 attr);\nu8 GetUnlockedSeviiAreas(void);\nu32 GetPlayerTrainerId(void);\nbool8 CutMoveRuinValleyCheck(void);\nvoid CutMoveOpenDottedHoleDoor(void);\nvoid RunMassageCooldownStepCounter(void);\nvoid IncrementResortGorgeousStepCounter(void);\nvoid IncrementBirthIslandRockStepCount(void);\nvoid ResetCyclingRoadChallengeData(void);\nvoid ResetFieldTasksArgs(void);\nbool8 UsedPokemonCenterWarp(void);\nvoid QuestLog_CheckDepartingIndoorsMap(void);\nvoid QuestLog_TryRecordDepartedLocation(void);\n\n#endif // GUARD_FIELD_SPECIALS_H\n"
  },
  {
    "path": "include/field_tasks.h",
    "content": "#ifndef GUARD_FIELD_TASKS_H\n#define GUARD_FIELD_TASKS_H\n\n#include \"global.h\"\n\nvoid ActivatePerStepCallback(u8);\nvoid SetUpFieldTasks(void);\n\n#endif // GUARD_FIELD_TASKS_H\n"
  },
  {
    "path": "include/field_weather.h",
    "content": "#ifndef GUARD_WEATHER_H\n#define GUARD_WEATHER_H\n\n#include \"global.h\"\n#include \"constants/field_weather.h\"\n\n#define TAG_WEATHER_START 0x1200\nenum {\n    GFXTAG_CLOUD = TAG_WEATHER_START,\n    GFXTAG_FOG_H,\n    GFXTAG_ASH,\n    GFXTAG_FOG_D,\n    GFXTAG_SANDSTORM,\n    GFXTAG_BUBBLE,\n    GFXTAG_RAIN,\n};\nenum {\n    PALTAG_WEATHER = TAG_WEATHER_START,\n};\n\nstruct Weather\n{\n    union\n    {\n        struct\n        {\n            struct Sprite *rainSprites[MAX_RAIN_SPRITES];\n            struct Sprite *snowflakeSprites[101];\n            struct Sprite *cloudSprites[NUM_CLOUD_SPRITES];\n        } s1;\n        struct\n        {\n            u8 filler0[0xA0];\n            struct Sprite *fogHSprites[NUM_FOG_HORIZONTAL_SPRITES];\n            struct Sprite *ashSprites[NUM_ASH_SPRITES];\n            struct Sprite *fogDSprites[NUM_FOG_DIAGONAL_SPRITES];\n            struct Sprite *sandstormSprites1[NUM_SANDSTORM_SPRITES];\n            struct Sprite *sandstormSprites2[NUM_SWIRL_SANDSTORM_SPRITES];\n        } s2;\n    } sprites;\n    s8 gammaIndex;\n    s8 gammaTargetIndex;\n    u8 gammaStepDelay;\n    u8 gammaStepFrameCounter;\n    u16 fadeDestColor;\n    u8 palProcessingState;\n    u8 fadeScreenCounter;\n    bool8 readyForInit;\n    u8 taskId;\n    u8 fadeInActive;\n    u8 fadeInCounter;\n    u16 initStep;\n    u16 finishStep;\n    u8 currWeather;\n    u8 nextWeather;\n    u8 weatherGfxLoaded;\n    bool8 weatherChangeComplete;\n    u8 weatherPicSpritePalIndex;\n    u8 altGammaSpritePalIndex;\n    u16 rainSpriteVisibleCounter;\n    u8 curRainSpriteIndex;\n    u8 targetRainSpriteCount;\n    u8 rainSpriteCount;\n    u8 rainSpriteVisibleDelay;\n    u8 isDownpour;\n    u8 rainStrength;\n    bool8 cloudSpritesCreated;\n    u16 snowflakeVisibleCounter;\n    u16 snowflakeTimer;\n    u8 snowflakeSpriteCount;\n    u8 targetSnowflakeSpriteCount;\n    u16 thunderDelay;\n    u16 thunderCounter;\n    bool8 thunderAllowEnd;\n    bool8 thunderSkipShort;\n    u8 thunderShortRetries;\n    bool8 thunderTriggered;\n    u16 fogHScrollPosX;\n    u16 fogHScrollCounter;\n    u16 fogHScrollOffset;\n    u8 lightenedFogSpritePals[6];\n    u8 lightenedFogSpritePalsCount;\n    bool8 fogHSpritesCreated;\n    u16 ashBaseSpritesX;\n    u16 ashUnused;\n    bool8 ashSpritesCreated;\n    u32 sandstormXOffset;\n    u32 sandstormYOffset;\n    u8 filler_70C[2];\n    u16 sandstormBaseSpritesX;\n    u16 sandstormPosY;\n    u16 sandstormWaveIndex;\n    u16 sandstormWaveCounter;\n    bool8 sandstormSpritesCreated;\n    bool8 sandstormSwirlSpritesCreated;\n    u16 fogDBaseSpritesX;\n    u16 fogDPosY;\n    u16 fogDScrollXCounter;\n    u16 fogDScrollYCounter;\n    u16 fogDXOffset;\n    u16 fogDYOffset;\n    bool8 fogDSpritesCreated;\n    u16 bubblesDelayCounter;\n    u16 bubblesDelayIndex;\n    u16 bubblesCoordsIndex;\n    u16 bubblesSpriteCount;\n    bool8 bubblesSpritesCreated;\n    u16 currBlendEVA;\n    u16 currBlendEVB;\n    u16 targetBlendEVA;\n    u16 targetBlendEVB;\n    u8 blendUpdateCounter;\n    u8 blendFrameCounter;\n    u8 blendDelay;\n    s16 droughtBrightnessStage;\n    s16 droughtLastBrightnessStage;\n    s16 droughtTimer;\n    s16 droughtState;\n    u8 filler_744[0xD-4];\n    s8 loadDroughtPalsIndex;\n    u8 loadDroughtPalsOffset;\n};\n\nextern struct Weather *const gWeatherPtr;\n\nvoid FadeScreen(u8 mode, s8 delay);\n\nvoid SetSavedWeather(u32);\nu8 GetSav1Weather(void);\n\nvoid DoCurrentWeather(void);\nvoid SetSavedWeatherFromCurrMapHeader(void);\nvoid SlightlyDarkenPalsInWeather(u16 *, u16 *, u32);\nvoid PlayRainStoppingSoundEffect(void);\nbool8 IsWeatherNotFadingIn(void);\nvoid SetWeatherScreenFadeOut(void);\nvoid WeatherProcessingIdle(void);\nu8 GetCurrentWeather(void);\nvoid delay(u8, u8, u32);\nvoid UpdateSpritePaletteWithWeather(u8 palIdx);\nvoid ResetPreservedPalettesInWeather(void);\nvoid PreservePaletteInWeather(u8 palIdx);\n\nvoid SetNextWeather(u8 weather);\nvoid SetCurrentAndNextWeather(u8 weather);\nvoid SetCurrentAndNextWeatherNoDelay(u8 weather);\nvoid Weather_SetBlendCoeffs(u8 eva, u8 evb);\nvoid Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay);\nbool8 Weather_UpdateBlend(void);\nvoid LoadCustomWeatherSpritePalette(const u16 *palette);\nvoid ResetDroughtWeatherPaletteLoading(void);\nbool8 LoadDroughtWeatherPalettes(void);\nvoid DroughtStateInit(void);\nvoid DroughtStateRun(void);\nvoid SetRainStrengthFromSoundEffect(u16 soundEffect);\nvoid WeatherShiftGammaIfPalStateIdle(s8 gammaIndex);\nvoid WeatherBeginGammaFade(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay);\nvoid ApplyWeatherGammaShiftToPal(u8 paletteIndex);\nvoid StartWeather(void);\nvoid ResumePausedWeather(void);\nvoid FadeSelectedPals(u8 mode, s8 delay, u32 selectedPalettes);\n\nextern const u16 gCloudsWeatherPalette[];\nextern const u16 gSandstormWeatherPalette[];\nextern const u8 gWeatherFogDiagonalTiles[];\nextern const u8 gWeatherFogHorizontalTiles[];\nextern const u8 gWeatherCloudTiles[];\nextern const u8 gWeatherSnow1Tiles[];\nextern const u8 gWeatherSnow2Tiles[];\nextern const u8 gWeatherBubbleTiles[];\nextern const u8 gWeatherAshTiles[];\nextern const u8 gWeatherRainTiles[];\nextern const u8 gWeatherSandstormTiles[];\n\n#endif // GUARD_WEATHER_H\n"
  },
  {
    "path": "include/field_weather_effects.h",
    "content": "#ifndef GUARD_FIELD_WEATHER_EFFECTS_H\n#define GUARD_FIELD_WEATHER_EFFECTS_H\n\nbool8 Ash_Finish(void);\nbool8 Bubbles_Finish(void);\nbool8 Clouds_Finish(void);\nbool8 FogHorizontal_Finish(void);\nbool8 FogDiagonal_Finish(void);\nbool8 Rain_Finish(void);\nbool8 Thunderstorm_Finish(void);\nbool8 Sandstorm_Finish(void);\nbool8 Snow_Finish(void);\nbool8 Sunny_Finish(void);\nbool8 Drought_Finish(void);\nbool8 Shade_Finish(void);\nvoid Ash_InitAll(void);\nvoid Ash_InitVars(void);\nvoid Ash_Main(void);\nvoid Bubbles_InitAll(void);\nvoid Bubbles_InitVars(void);\nvoid Bubbles_Main(void);\nvoid Clouds_InitAll(void);\nvoid Clouds_InitVars(void);\nvoid Clouds_Main(void);\nvoid Drought_InitAll(void);\nvoid Drought_InitVars(void);\nvoid Drought_Main(void);\nvoid FogHorizontal_InitAll(void);\nvoid FogHorizontal_InitVars(void);\nvoid FogHorizontal_Main(void);\nvoid FogDiagonal_InitAll(void);\nvoid FogDiagonal_InitVars(void);\nvoid FogDiagonal_Main(void);\nvoid Rain_InitAll(void);\nvoid Rain_InitVars(void);\nvoid Rain_Main(void);\nvoid Thunderstorm_Main(void);\nvoid Sandstorm_InitAll(void);\nvoid Sandstorm_InitVars(void);\nvoid Sandstorm_Main(void);\nvoid Snow_InitAll(void);\nvoid Snow_InitVars(void);\nvoid Shade_InitAll(void);\nvoid Shade_InitVars(void);\nvoid Sunny_InitAll(void);\nvoid Sunny_InitVars(void);\nvoid Sunny_Main(void);\nvoid Shade_Main(void);\nvoid Snow_Main(void);\nvoid Thunderstorm_InitVars(void);\nvoid Thunderstorm_InitAll(void);\nvoid Downpour_InitVars(void);\nvoid Downpour_InitAll(void);\n\n#endif //GUARD_FIELD_WEATHER_EFFECTS_H\n"
  },
  {
    "path": "include/field_weather_util.h",
    "content": "#ifndef GUARD_FIELD_WEATHER_UTIL_H\n#define GUARD_FIELD_WEATHER_UTIL_H\n\nvoid SetWeather(u8 weather);\n\n#endif //GUARD_FIELD_WEATHER_UTIL_H\n"
  },
  {
    "path": "include/fieldmap.h",
    "content": "#ifndef GUARD_FIELDMAP_H\n#define GUARD_FIELDMAP_H\n\n#include \"global.h\"\n\n#define NUM_TILES_IN_PRIMARY 640\n#define NUM_TILES_TOTAL 1024\n#define NUM_METATILES_IN_PRIMARY 640\n#define NUM_METATILES_TOTAL 1024\n#define NUM_PALS_IN_PRIMARY 7\n#define NUM_PALS_TOTAL 13\n#define MAX_MAP_DATA_SIZE 0x2800\n#define VIRTUAL_MAP_SIZE (MAX_MAP_DATA_SIZE)\n\n// Map coordinates are offset by 7 when using the map\n// buffer because it needs to load sufficient border\n// metatiles to fill the player's view (the player has\n// 7 metatiles of view horizontally in either direction).\n#define MAP_OFFSET 7\n#define MAP_OFFSET_W (MAP_OFFSET * 2 + 1)\n#define MAP_OFFSET_H (MAP_OFFSET * 2)\n\nextern struct BackupMapLayout VMap;\nextern const struct MapLayout Route1_Layout;\n\nu32 MapGridGetMetatileIdAt(s32, s32);\nu32 MapGridGetMetatileBehaviorAt(s16, s16);\nu8 MapGridGetMetatileLayerTypeAt(s16 x, s16 y);\nvoid MapGridSetMetatileIdAt(s32, s32, u16);\nvoid MapGridSetMetatileEntryAt(s32, s32, u16);\nu8 MapGridGetElevationAt(s32 x, s32 y);\nvoid GetCameraCoords(u16 *, u16 *);\nbool8 MapGridGetCollisionAt(s32, s32);\ns32 GetMapBorderIdAt(s32, s32);\nbool32 CanCameraMoveInDirection(s32);\nconst struct MapHeader * GetMapHeaderFromConnection(const struct MapConnection * connection);\nconst struct MapConnection * GetMapConnectionAtPos(s16 x, s16 y);\nvoid ApplyGlobalTintToPaletteSlot(u8 slot, u8 count);\nvoid SaveMapView(void);\nu32 ExtractMetatileAttribute(u32 attributes, u8 attributeType);\nu32 MapGridGetMetatileAttributeAt(s16 x, s16 y, u8 attributeType);\nvoid MapGridSetMetatileImpassabilityAt(s32 x, s32 y, bool32 arg2);\nbool8 CameraMove(s32 x, s32 y);\nvoid CopyMapTilesetsToVram(struct MapLayout const * mapLayout);\nvoid LoadMapTilesetPalettes(struct MapLayout const * mapLayout);\nvoid InitMap(void);\nvoid CopySecondaryTilesetToVramUsingHeap(const struct MapLayout * mapLayout);\nvoid LoadSecondaryTilesetPalette(const struct MapLayout * mapLayout);\nvoid InitMapFromSavedGame(void);\nvoid CopyPrimaryTilesetToVram(const struct MapLayout *mapLayout);\nvoid CopySecondaryTilesetToVram(const struct MapLayout *mapLayout);\nvoid GetCameraFocusCoords(u16 *x, u16 *y);\nvoid SetCameraFocusCoords(u16 x, u16 y);\n\n#endif //GUARD_FIELDMAP_H\n"
  },
  {
    "path": "include/fldeff.h",
    "content": "#ifndef GUARD_FLDEFF_H\n#define GUARD_FLDEFF_H\n\n#define FLDEFF_CALL_FUNC_IN_DATA() ((void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]))();\n\n#define FLDEFF_SET_FUNC_TO_DATA(func)                     \\\ngTasks[taskId].data[8] = (u32)func >> 16;                 \\\ngTasks[taskId].data[9] = (u32)func;\n\nextern struct MapPosition gPlayerFacingPosition;\n\nbool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId);\nu8 CreateFieldEffectShowMon(void);\n\n// flash\nu8 MapTransitionIsExit(u8 lightLevel, u8 mapType);\nu8 MapTransitionIsEnter(u8 mapType1, u8 mapType2);\nbool8 SetUpFieldMove_Flash(void);\nvoid CB2_DoChangeMap(void);\n\n// cut\nbool8 SetUpFieldMove_Cut(void);\n\n// dig\nbool8 SetUpFieldMove_Dig(void);\nbool8 FldEff_UseDig(void);\n\n// rocksmash\nbool8 SetUpFieldMove_RockSmash(void);\nbool8 FldEff_UseRockSmash(void);\n\n// berrytree\nvoid nullsub_56(void);\n\n// poison\nvoid FldEffPoison_Start(void);\nbool32 FldEffPoison_IsActive(void);\n\n// strength\nbool8 SetUpFieldMove_Strength(void);\nbool8 FldEff_UseStrength(void);\n\n// teleport\nbool8 SetUpFieldMove_Teleport(void);\nbool8 FldEff_UseTeleport(void);\n\n// softboiled\nbool8 SetUpFieldMove_SoftBoiled(void);\nvoid ChooseMonForSoftboiled(u8 taskId);\nvoid Task_TryUseSoftboiledOnPartyMon(u8 taskId);\n\n// sweetscent\nbool8 SetUpFieldMove_SweetScent(void);\nbool8 FldEff_SweetScent(void);\n\n#endif // GUARD_FLDEFF_H\n"
  },
  {
    "path": "include/gba/defines.h",
    "content": "#ifndef GUARD_GBA_DEFINES\n#define GUARD_GBA_DEFINES\n\n#include <stddef.h>\n\n#define TRUE  1\n#define FALSE 0\n\n#if defined(__APPLE__)\n#define IWRAM_DATA __attribute__((section(\"__DATA,iwram_data\")))\n#define EWRAM_DATA __attribute__((section(\"__DATA,ewram_data\")))\n#else\n#define IWRAM_DATA __attribute__((section(\"iwram_data\")))\n#define EWRAM_DATA __attribute__((section(\"ewram_data\")))\n#endif\n\n#if MODERN\n#define NOINLINE __attribute__((noinline))\n#else\n#define NOINLINE\n#endif\n\n#define ALIGNED(n) __attribute__((aligned(n)))\n\n#define SOUND_INFO_PTR (*(struct SoundInfo **)0x3007FF0)\n#define INTR_CHECK     (*(u16 *)0x3007FF8)\n#define INTR_VECTOR    (*(void **)0x3007FFC)\n\n#define EWRAM_START 0x02000000\n#define EWRAM_END   (EWRAM_START + 0x40000)\n#define IWRAM_START 0x03000000\n#define IWRAM_END   (IWRAM_START + 0x8000)\n\n#define PLTT          0x5000000\n#define BG_PLTT       PLTT\n#define BG_PLTT_SIZE  0x200\n#define OBJ_PLTT      (PLTT + BG_PLTT_SIZE)\n#define OBJ_PLTT_SIZE 0x200\n#define PLTT_SIZE     (BG_PLTT_SIZE + OBJ_PLTT_SIZE)\n\n#define VRAM      0x6000000\n#define VRAM_SIZE 0x18000\n\n#define BG_VRAM           VRAM\n#define BG_VRAM_SIZE      0x10000\n#define BG_CHAR_SIZE      0x4000\n#define BG_SCREEN_SIZE    0x800\n#define BG_CHAR_ADDR(n)   (void *)(BG_VRAM + (BG_CHAR_SIZE * (n)))\n#define BG_SCREEN_ADDR(n) (void *)(BG_VRAM + (BG_SCREEN_SIZE * (n)))\n#define BG_TILE_ADDR(n)   (void *)(BG_VRAM + (0x80 * (n)))\n\n#define BG_TILE_H_FLIP(n)   (0x400 + (n))\n#define BG_TILE_V_FLIP(n)   (0x800 + (n))\n#define BG_TILE_H_V_FLIP(n) (0xC00 + (n))\n\n// text-mode BG\n#define OBJ_VRAM0      (void *)(VRAM + 0x10000)\n#define OBJ_VRAM0_SIZE 0x8000\n\n// bitmap-mode BG\n#define OBJ_VRAM1      (void *)(VRAM + 0x14000)\n#define OBJ_VRAM1_SIZE 0x4000\n\n#define OAM      0x7000000\n#define OAM_SIZE 0x400\n\n#define ROM_HEADER_SIZE   0xC0\n\n#define DISPLAY_WIDTH  240\n#define DISPLAY_HEIGHT 160\n\n#define TILE_SIZE_4BPP 32\n#define TILE_SIZE_8BPP 64\n\n#define TILE_OFFSET_4BPP(n) ((n) * TILE_SIZE_4BPP)\n#define TILE_OFFSET_8BPP(n) ((n) * TILE_SIZE_8BPP)\n\n#define TOTAL_OBJ_TILE_COUNT 1024\n\n#define PLTT_SIZEOF(n) ((n) * sizeof(u16))\n#define PLTT_SIZE_4BPP PLTT_SIZEOF(16)\n#define PLTT_SIZE_8BPP PLTT_SIZEOF(256)\n\n#define PLTT_OFFSET_4BPP(n) ((n) * PLTT_SIZE_4BPP)\n\n// Some functions are strictly inline asm\n#define NAKED __attribute__((naked))\n#define UNUSED __attribute__((unused))\n\n#endif // GUARD_GBA_DEFINES\n"
  },
  {
    "path": "include/gba/flash_internal.h",
    "content": "#ifndef GUARD_GBA_FLASH_INTERNAL_H\n#define GUARD_GBA_FLASH_INTERNAL_H\n\n#define FLASH_BASE ((u8 *)0xE000000)\n\n#define FLASH_WRITE(addr, data) ((*(vu8 *)(FLASH_BASE + (addr))) = (data))\n\n#define FLASH_ROM_SIZE_1M 131072 // 1 megabit ROM\n\n#define SECTORS_PER_BANK 16\n\nstruct FlashSector\n{\n    u32 size;\n    u8 shift;\n    u16 count;\n    u16 top;\n};\n\nstruct FlashType {\n    u32 romSize;\n    struct FlashSector sector;\n    u16 wait[2]; // game pak bus read/write wait\n\n    // TODO: add support for anonymous unions/structs if possible\n    union {\n        struct {\n        u8 makerId;\n        u8 deviceId;\n        } separate;\n        u16 joined;\n    } ids;\n};\n\nstruct FlashSetupInfo\n{\n    u16 (*programFlashByte)(u16, u32, u8);\n    u16 (*programFlashSector)(u16, void *);\n    u16 (*eraseFlashChip)(void);\n    u16 (*eraseFlashSector)(u16);\n    u16 (*WaitForFlashWrite)(u8, u8 *, u8);\n    const u16 *maxTime;\n    struct FlashType type;\n};\n\nextern u16 gFlashNumRemainingBytes;\n\nextern u16 (*ProgramFlashByte)(u16, u32, u8);\nextern u16 (*ProgramFlashSector)(u16, void *);\nextern u16 (*EraseFlashChip)(void);\nextern u16 (*EraseFlashSector)(u16);\nextern u16 (*WaitForFlashWrite)(u8, u8 *, u8);\nextern const u16 *gFlashMaxTime;\nextern const struct FlashType *gFlash;\n\nextern u8 (*PollFlashStatus)(u8 *);\nextern u8 gFlashTimeoutFlag;\n\nextern const struct FlashSetupInfo MX29L010;\nextern const struct FlashSetupInfo LE26FV10N1TS;\nextern const struct FlashSetupInfo DefaultFlash;\n\nvoid SwitchFlashBank(u8 bankNum);\nu16 ReadFlashId(void);\nvoid StartFlashTimer(u8 phase);\nvoid SetReadFlash1(u16 *dest);\nvoid StopFlashTimer(void);\nu16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void));\nu32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src);\nvoid ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size);\nu32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *dataSrc, u32 n);\n\nu16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData);\n\nu16 EraseFlashChip_MX(void);\nu16 EraseFlashSector_MX(u16 sectorNum);\nu16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data);\nu16 ProgramFlashSector_MX(u16 sectorNum, void *src);\n\n// agb_flash_1m\nu16 IdentifyFlash(void);\n\n#endif // GUARD_GBA_FLASH_INTERNAL_H\n"
  },
  {
    "path": "include/gba/gba.h",
    "content": "#ifndef GUARD_GBA_GBA_H\n#define GUARD_GBA_GBA_H\n\n#include <string.h>\n#include \"defines.h\"\n#include \"io_reg.h\"\n#include \"types.h\"\n#include \"multiboot.h\"\n#include \"syscall.h\"\n#include \"macro.h\"\n#include \"isagbprint.h\"\n\n#endif // GUARD_GBA_GBA_H\n"
  },
  {
    "path": "include/gba/io_reg.h",
    "content": "#ifndef GUARD_GBA_IO_REG_H\n#define GUARD_GBA_IO_REG_H\n\n#define REG_BASE 0x4000000 // I/O register base address\n\n// I/O register offsets\n\n#define REG_OFFSET_DISPCNT     0x0\n#define REG_OFFSET_DISPSTAT    0x4\n#define REG_OFFSET_VCOUNT      0x6\n#define REG_OFFSET_BG0CNT      0x8\n#define REG_OFFSET_BG1CNT      0xa\n#define REG_OFFSET_BG2CNT      0xc\n#define REG_OFFSET_BG3CNT      0xe\n#define REG_OFFSET_BG0HOFS     0x10\n#define REG_OFFSET_BG0VOFS     0x12\n#define REG_OFFSET_BG1HOFS     0x14\n#define REG_OFFSET_BG1VOFS     0x16\n#define REG_OFFSET_BG2HOFS     0x18\n#define REG_OFFSET_BG2VOFS     0x1a\n#define REG_OFFSET_BG3HOFS     0x1c\n#define REG_OFFSET_BG3VOFS     0x1e\n#define REG_OFFSET_BG2PA       0x20\n#define REG_OFFSET_BG2PB       0x22\n#define REG_OFFSET_BG2PC       0x24\n#define REG_OFFSET_BG2PD       0x26\n#define REG_OFFSET_BG2X        0x28\n#define REG_OFFSET_BG2X_L      0x28\n#define REG_OFFSET_BG2X_H      0x2a\n#define REG_OFFSET_BG2Y        0x2c\n#define REG_OFFSET_BG2Y_L      0x2c\n#define REG_OFFSET_BG2Y_H      0x2e\n#define REG_OFFSET_BG3PA       0x30\n#define REG_OFFSET_BG3PB       0x32\n#define REG_OFFSET_BG3PC       0x34\n#define REG_OFFSET_BG3PD       0x36\n#define REG_OFFSET_BG3X        0x38\n#define REG_OFFSET_BG3X_L      0x38\n#define REG_OFFSET_BG3X_H      0x3a\n#define REG_OFFSET_BG3Y        0x3c\n#define REG_OFFSET_BG3Y_L      0x3c\n#define REG_OFFSET_BG3Y_H      0x3e\n#define REG_OFFSET_WIN0H       0x40\n#define REG_OFFSET_WIN1H       0x42\n#define REG_OFFSET_WIN0V       0x44\n#define REG_OFFSET_WIN1V       0x46\n#define REG_OFFSET_WININ       0x48\n#define REG_OFFSET_WINOUT      0x4a\n#define REG_OFFSET_MOSAIC      0x4c\n#define REG_OFFSET_BLDCNT      0x50\n#define REG_OFFSET_BLDALPHA    0x52\n#define REG_OFFSET_BLDY        0x54\n\n#define REG_OFFSET_SOUND1CNT_L 0x60\n#define REG_OFFSET_NR10        0x60\n#define REG_OFFSET_SOUND1CNT_H 0x62\n#define REG_OFFSET_NR11        0x62\n#define REG_OFFSET_NR12        0x63\n#define REG_OFFSET_SOUND1CNT_X 0x64\n#define REG_OFFSET_NR13        0x64\n#define REG_OFFSET_NR14        0x65\n#define REG_OFFSET_SOUND2CNT_L 0x68\n#define REG_OFFSET_NR21        0x68\n#define REG_OFFSET_NR22        0x69\n#define REG_OFFSET_SOUND2CNT_H 0x6c\n#define REG_OFFSET_NR23        0x6c\n#define REG_OFFSET_NR24        0x6d\n#define REG_OFFSET_SOUND3CNT_L 0x70\n#define REG_OFFSET_NR30        0x70\n#define REG_OFFSET_SOUND3CNT_H 0x72\n#define REG_OFFSET_NR31        0x72\n#define REG_OFFSET_NR32        0x73\n#define REG_OFFSET_SOUND3CNT_X 0x74\n#define REG_OFFSET_NR33        0x74\n#define REG_OFFSET_NR34        0x75\n#define REG_OFFSET_SOUND4CNT_L 0x78\n#define REG_OFFSET_NR41        0x78\n#define REG_OFFSET_NR42        0x79\n#define REG_OFFSET_SOUND4CNT_H 0x7c\n#define REG_OFFSET_NR43        0x7c\n#define REG_OFFSET_NR44        0x7d\n#define REG_OFFSET_SOUNDCNT_L  0x80\n#define REG_OFFSET_NR50        0x80\n#define REG_OFFSET_NR51        0x81\n#define REG_OFFSET_SOUNDCNT_H  0x82\n#define REG_OFFSET_SOUNDCNT_X  0x84\n#define REG_OFFSET_NR52        0x84\n#define REG_OFFSET_SOUNDBIAS   0x88\n#define REG_OFFSET_SOUNDBIAS_L 0x88\n#define REG_OFFSET_SOUNDBIAS_H 0x89\n#define REG_OFFSET_WAVE_RAM0   0x90\n#define REG_OFFSET_WAVE_RAM1   0x94\n#define REG_OFFSET_WAVE_RAM2   0x98\n#define REG_OFFSET_WAVE_RAM3   0x9c\n#define REG_OFFSET_FIFO_A      0xa0\n#define REG_OFFSET_FIFO_B      0xa4\n\n#define REG_OFFSET_DMA0        0xb0\n#define REG_OFFSET_DMA0SAD     0xb0\n#define REG_OFFSET_DMA0SAD_L   0xb0\n#define REG_OFFSET_DMA0SAD_H   0xb2\n#define REG_OFFSET_DMA0DAD     0xb4\n#define REG_OFFSET_DMA0DAD_L   0xb4\n#define REG_OFFSET_DMA0DAD_H   0xb6\n#define REG_OFFSET_DMA0CNT     0xb8\n#define REG_OFFSET_DMA0CNT_L   0xb8\n#define REG_OFFSET_DMA0CNT_H   0xba\n#define REG_OFFSET_DMA1        0xbc\n#define REG_OFFSET_DMA1SAD     0xbc\n#define REG_OFFSET_DMA1SAD_L   0xbc\n#define REG_OFFSET_DMA1SAD_H   0xbe\n#define REG_OFFSET_DMA1DAD     0xc0\n#define REG_OFFSET_DMA1DAD_L   0xc0\n#define REG_OFFSET_DMA1DAD_H   0xc2\n#define REG_OFFSET_DMA1CNT     0xc4\n#define REG_OFFSET_DMA1CNT_L   0xc4\n#define REG_OFFSET_DMA1CNT_H   0xc6\n#define REG_OFFSET_DMA2        0xc8\n#define REG_OFFSET_DMA2SAD     0xc8\n#define REG_OFFSET_DMA2SAD_L   0xc8\n#define REG_OFFSET_DMA2SAD_H   0xca\n#define REG_OFFSET_DMA2DAD     0xcc\n#define REG_OFFSET_DMA2DAD_L   0xcc\n#define REG_OFFSET_DMA2DAD_H   0xce\n#define REG_OFFSET_DMA2CNT     0xd0\n#define REG_OFFSET_DMA2CNT_L   0xd0\n#define REG_OFFSET_DMA2CNT_H   0xd2\n#define REG_OFFSET_DMA3        0xd4\n#define REG_OFFSET_DMA3SAD     0xd4\n#define REG_OFFSET_DMA3SAD_L   0xd4\n#define REG_OFFSET_DMA3SAD_H   0xd6\n#define REG_OFFSET_DMA3DAD     0xd8\n#define REG_OFFSET_DMA3DAD_L   0xd8\n#define REG_OFFSET_DMA3DAD_H   0xda\n#define REG_OFFSET_DMA3CNT     0xdc\n#define REG_OFFSET_DMA3CNT_L   0xdc\n#define REG_OFFSET_DMA3CNT_H   0xde\n\n#define REG_OFFSET_TMCNT       0x100\n#define REG_OFFSET_TMCNT_L     0x100\n#define REG_OFFSET_TMCNT_H     0x102\n#define REG_OFFSET_TM0CNT      0x100\n#define REG_OFFSET_TM0CNT_L    0x100\n#define REG_OFFSET_TM0CNT_H    0x102\n#define REG_OFFSET_TM1CNT      0x104\n#define REG_OFFSET_TM1CNT_L    0x104\n#define REG_OFFSET_TM1CNT_H    0x106\n#define REG_OFFSET_TM2CNT      0x108\n#define REG_OFFSET_TM2CNT_L    0x108\n#define REG_OFFSET_TM2CNT_H    0x10a\n#define REG_OFFSET_TM3CNT      0x10c\n#define REG_OFFSET_TM3CNT_L    0x10c\n#define REG_OFFSET_TM3CNT_H    0x10e\n\n#define REG_OFFSET_SIOCNT      0x128\n#define REG_OFFSET_SIODATA8    0x12a\n#define REG_OFFSET_SIODATA32   0x120\n#define REG_OFFSET_SIOMLT_SEND 0x12a\n#define REG_OFFSET_SIOMLT_RECV 0x120\n#define REG_OFFSET_SIOMULTI0   0x120\n#define REG_OFFSET_SIOMULTI1   0x122\n#define REG_OFFSET_SIOMULTI2   0x124\n#define REG_OFFSET_SIOMULTI3   0x126\n\n#define REG_OFFSET_KEYINPUT    0x130\n#define REG_OFFSET_KEYCNT      0x132\n\n#define REG_OFFSET_RCNT        0x134\n\n#define REG_OFFSET_JOYCNT      0x140\n#define REG_OFFSET_JOYSTAT     0x158\n#define REG_OFFSET_JOY_RECV    0x150\n#define REG_OFFSET_JOY_RECV_L  0x150\n#define REG_OFFSET_JOY_RECV_H  0x152\n#define REG_OFFSET_JOY_TRANS   0x154\n#define REG_OFFSET_JOY_TRANS_L 0x154\n#define REG_OFFSET_JOY_TRANS_H 0x156\n\n#define REG_OFFSET_IME         0x208\n#define REG_OFFSET_IE          0x200\n#define REG_OFFSET_IF          0x202\n\n#define REG_OFFSET_WAITCNT     0x204\n\n// I/O register addresses\n\n#define REG_ADDR_DISPCNT     (REG_BASE + REG_OFFSET_DISPCNT)\n#define REG_ADDR_DISPSTAT    (REG_BASE + REG_OFFSET_DISPSTAT)\n#define REG_ADDR_VCOUNT      (REG_BASE + REG_OFFSET_VCOUNT)\n#define REG_ADDR_BG0CNT      (REG_BASE + REG_OFFSET_BG0CNT)\n#define REG_ADDR_BG1CNT      (REG_BASE + REG_OFFSET_BG1CNT)\n#define REG_ADDR_BG2CNT      (REG_BASE + REG_OFFSET_BG2CNT)\n#define REG_ADDR_BG3CNT      (REG_BASE + REG_OFFSET_BG3CNT)\n#define REG_ADDR_BG0HOFS     (REG_BASE + REG_OFFSET_BG0HOFS)\n#define REG_ADDR_BG0VOFS     (REG_BASE + REG_OFFSET_BG0VOFS)\n#define REG_ADDR_BG1HOFS     (REG_BASE + REG_OFFSET_BG1HOFS)\n#define REG_ADDR_BG1VOFS     (REG_BASE + REG_OFFSET_BG1VOFS)\n#define REG_ADDR_BG2HOFS     (REG_BASE + REG_OFFSET_BG2HOFS)\n#define REG_ADDR_BG2VOFS     (REG_BASE + REG_OFFSET_BG2VOFS)\n#define REG_ADDR_BG3HOFS     (REG_BASE + REG_OFFSET_BG3HOFS)\n#define REG_ADDR_BG3VOFS     (REG_BASE + REG_OFFSET_BG3VOFS)\n#define REG_ADDR_BG2PA       (REG_BASE + REG_OFFSET_BG2PA)\n#define REG_ADDR_BG2PB       (REG_BASE + REG_OFFSET_BG2PB)\n#define REG_ADDR_BG2PC       (REG_BASE + REG_OFFSET_BG2PC)\n#define REG_ADDR_BG2PD       (REG_BASE + REG_OFFSET_BG2PD)\n#define REG_ADDR_BG2X        (REG_BASE + REG_OFFSET_BG2X)\n#define REG_ADDR_BG2X_L      (REG_BASE + REG_OFFSET_BG2X_L)\n#define REG_ADDR_BG2X_H      (REG_BASE + REG_OFFSET_BG2X_H)\n#define REG_ADDR_BG2Y        (REG_BASE + REG_OFFSET_BG2Y)\n#define REG_ADDR_BG2Y_L      (REG_BASE + REG_OFFSET_BG2Y_L)\n#define REG_ADDR_BG2Y_H      (REG_BASE + REG_OFFSET_BG2Y_H)\n#define REG_ADDR_BG3PA       (REG_BASE + REG_OFFSET_BG3PA)\n#define REG_ADDR_BG3PB       (REG_BASE + REG_OFFSET_BG3PB)\n#define REG_ADDR_BG3PC       (REG_BASE + REG_OFFSET_BG3PC)\n#define REG_ADDR_BG3PD       (REG_BASE + REG_OFFSET_BG3PD)\n#define REG_ADDR_BG3X        (REG_BASE + REG_OFFSET_BG3X)\n#define REG_ADDR_BG3X_L      (REG_BASE + REG_OFFSET_BG3X_L)\n#define REG_ADDR_BG3X_H      (REG_BASE + REG_OFFSET_BG3X_H)\n#define REG_ADDR_BG3Y        (REG_BASE + REG_OFFSET_BG3Y)\n#define REG_ADDR_BG3Y_L      (REG_BASE + REG_OFFSET_BG3Y_L)\n#define REG_ADDR_BG3Y_H      (REG_BASE + REG_OFFSET_BG3Y_H)\n#define REG_ADDR_WIN0H       (REG_BASE + REG_OFFSET_WIN0H)\n#define REG_ADDR_WIN1H       (REG_BASE + REG_OFFSET_WIN1H)\n#define REG_ADDR_WIN0V       (REG_BASE + REG_OFFSET_WIN0V)\n#define REG_ADDR_WIN1V       (REG_BASE + REG_OFFSET_WIN1V)\n#define REG_ADDR_WININ       (REG_BASE + REG_OFFSET_WININ)\n#define REG_ADDR_WINOUT      (REG_BASE + REG_OFFSET_WINOUT)\n#define REG_ADDR_MOSAIC      (REG_BASE + REG_OFFSET_MOSAIC)\n#define REG_ADDR_BLDCNT      (REG_BASE + REG_OFFSET_BLDCNT)\n#define REG_ADDR_BLDALPHA    (REG_BASE + REG_OFFSET_BLDALPHA)\n#define REG_ADDR_BLDY        (REG_BASE + REG_OFFSET_BLDY)\n\n#define REG_ADDR_SOUND1CNT_L (REG_BASE + REG_OFFSET_SOUND1CNT_L)\n#define REG_ADDR_NR10        (REG_BASE + REG_OFFSET_NR10)\n#define REG_ADDR_SOUND1CNT_H (REG_BASE + REG_OFFSET_SOUND1CNT_H)\n#define REG_ADDR_NR11        (REG_BASE + REG_OFFSET_NR11)\n#define REG_ADDR_NR12        (REG_BASE + REG_OFFSET_NR12)\n#define REG_ADDR_SOUND1CNT_X (REG_BASE + REG_OFFSET_SOUND1CNT_X)\n#define REG_ADDR_NR13        (REG_BASE + REG_OFFSET_NR13)\n#define REG_ADDR_NR14        (REG_BASE + REG_OFFSET_NR14)\n#define REG_ADDR_SOUND2CNT_L (REG_BASE + REG_OFFSET_SOUND2CNT_L)\n#define REG_ADDR_NR21        (REG_BASE + REG_OFFSET_NR21)\n#define REG_ADDR_NR22        (REG_BASE + REG_OFFSET_NR22)\n#define REG_ADDR_SOUND2CNT_H (REG_BASE + REG_OFFSET_SOUND2CNT_H)\n#define REG_ADDR_NR23        (REG_BASE + REG_OFFSET_NR23)\n#define REG_ADDR_NR24        (REG_BASE + REG_OFFSET_NR24)\n#define REG_ADDR_SOUND3CNT_L (REG_BASE + REG_OFFSET_SOUND3CNT_L)\n#define REG_ADDR_NR30        (REG_BASE + REG_OFFSET_NR30)\n#define REG_ADDR_SOUND3CNT_H (REG_BASE + REG_OFFSET_SOUND3CNT_H)\n#define REG_ADDR_NR31        (REG_BASE + REG_OFFSET_NR31)\n#define REG_ADDR_NR32        (REG_BASE + REG_OFFSET_NR32)\n#define REG_ADDR_SOUND3CNT_X (REG_BASE + REG_OFFSET_SOUND3CNT_X)\n#define REG_ADDR_NR33        (REG_BASE + REG_OFFSET_NR33)\n#define REG_ADDR_NR34        (REG_BASE + REG_OFFSET_NR34)\n#define REG_ADDR_SOUND4CNT_L (REG_BASE + REG_OFFSET_SOUND4CNT_L)\n#define REG_ADDR_NR41        (REG_BASE + REG_OFFSET_NR41)\n#define REG_ADDR_NR42        (REG_BASE + REG_OFFSET_NR42)\n#define REG_ADDR_SOUND4CNT_H (REG_BASE + REG_OFFSET_SOUND4CNT_H)\n#define REG_ADDR_NR43        (REG_BASE + REG_OFFSET_NR43)\n#define REG_ADDR_NR44        (REG_BASE + REG_OFFSET_NR44)\n#define REG_ADDR_SOUNDCNT_L  (REG_BASE + REG_OFFSET_SOUNDCNT_L)\n#define REG_ADDR_NR50        (REG_BASE + REG_OFFSET_NR50)\n#define REG_ADDR_NR51        (REG_BASE + REG_OFFSET_NR51)\n#define REG_ADDR_SOUNDCNT_H  (REG_BASE + REG_OFFSET_SOUNDCNT_H)\n#define REG_ADDR_SOUNDCNT_X  (REG_BASE + REG_OFFSET_SOUNDCNT_X)\n#define REG_ADDR_NR52        (REG_BASE + REG_OFFSET_NR52)\n#define REG_ADDR_SOUNDBIAS   (REG_BASE + REG_OFFSET_SOUNDBIAS)\n#define REG_ADDR_SOUNDBIAS_L (REG_BASE + REG_OFFSET_SOUNDBIAS_L)\n#define REG_ADDR_SOUNDBIAS_H (REG_BASE + REG_OFFSET_SOUNDBIAS_H)\n#define REG_ADDR_WAVE_RAM0   (REG_BASE + REG_OFFSET_WAVE_RAM0)\n#define REG_ADDR_WAVE_RAM1   (REG_BASE + REG_OFFSET_WAVE_RAM1)\n#define REG_ADDR_WAVE_RAM2   (REG_BASE + REG_OFFSET_WAVE_RAM2)\n#define REG_ADDR_WAVE_RAM3   (REG_BASE + REG_OFFSET_WAVE_RAM3)\n#define REG_ADDR_FIFO_A      (REG_BASE + REG_OFFSET_FIFO_A)\n#define REG_ADDR_FIFO_B      (REG_BASE + REG_OFFSET_FIFO_B)\n\n#define REG_ADDR_DMA0        (REG_BASE + REG_OFFSET_DMA0)\n#define REG_ADDR_DMA0SAD     (REG_BASE + REG_OFFSET_DMA0SAD)\n#define REG_ADDR_DMA0DAD     (REG_BASE + REG_OFFSET_DMA0DAD)\n#define REG_ADDR_DMA0CNT     (REG_BASE + REG_OFFSET_DMA0CNT)\n#define REG_ADDR_DMA0CNT_L   (REG_BASE + REG_OFFSET_DMA0CNT_L)\n#define REG_ADDR_DMA0CNT_H   (REG_BASE + REG_OFFSET_DMA0CNT_H)\n#define REG_ADDR_DMA1        (REG_BASE + REG_OFFSET_DMA1)\n#define REG_ADDR_DMA1SAD     (REG_BASE + REG_OFFSET_DMA1SAD)\n#define REG_ADDR_DMA1DAD     (REG_BASE + REG_OFFSET_DMA1DAD)\n#define REG_ADDR_DMA1CNT     (REG_BASE + REG_OFFSET_DMA1CNT)\n#define REG_ADDR_DMA1CNT_L   (REG_BASE + REG_OFFSET_DMA1CNT_L)\n#define REG_ADDR_DMA1CNT_H   (REG_BASE + REG_OFFSET_DMA1CNT_H)\n#define REG_ADDR_DMA2        (REG_BASE + REG_OFFSET_DMA2)\n#define REG_ADDR_DMA2SAD     (REG_BASE + REG_OFFSET_DMA2SAD)\n#define REG_ADDR_DMA2DAD     (REG_BASE + REG_OFFSET_DMA2DAD)\n#define REG_ADDR_DMA2CNT     (REG_BASE + REG_OFFSET_DMA2CNT)\n#define REG_ADDR_DMA2CNT_L   (REG_BASE + REG_OFFSET_DMA2CNT_L)\n#define REG_ADDR_DMA2CNT_H   (REG_BASE + REG_OFFSET_DMA2CNT_H)\n#define REG_ADDR_DMA3        (REG_BASE + REG_OFFSET_DMA3)\n#define REG_ADDR_DMA3SAD     (REG_BASE + REG_OFFSET_DMA3SAD)\n#define REG_ADDR_DMA3DAD     (REG_BASE + REG_OFFSET_DMA3DAD)\n#define REG_ADDR_DMA3CNT     (REG_BASE + REG_OFFSET_DMA3CNT)\n#define REG_ADDR_DMA3CNT_L   (REG_BASE + REG_OFFSET_DMA3CNT_L)\n#define REG_ADDR_DMA3CNT_H   (REG_BASE + REG_OFFSET_DMA3CNT_H)\n\n#define REG_ADDR_TMCNT       (REG_BASE + REG_OFFSET_TMCNT)\n#define REG_ADDR_TMCNT_L     (REG_BASE + REG_OFFSET_TMCNT_L)\n#define REG_ADDR_TMCNT_H     (REG_BASE + REG_OFFSET_TMCNT_H)\n#define REG_ADDR_TM0CNT      (REG_BASE + REG_OFFSET_TM0CNT)\n#define REG_ADDR_TM0CNT_L    (REG_BASE + REG_OFFSET_TM0CNT_L)\n#define REG_ADDR_TM0CNT_H    (REG_BASE + REG_OFFSET_TM0CNT_H)\n#define REG_ADDR_TM1CNT      (REG_BASE + REG_OFFSET_TM1CNT)\n#define REG_ADDR_TM1CNT_L    (REG_BASE + REG_OFFSET_TM1CNT_L)\n#define REG_ADDR_TM1CNT_H    (REG_BASE + REG_OFFSET_TM1CNT_H)\n#define REG_ADDR_TM2CNT      (REG_BASE + REG_OFFSET_TM2CNT)\n#define REG_ADDR_TM2CNT_L    (REG_BASE + REG_OFFSET_TM2CNT_L)\n#define REG_ADDR_TM2CNT_H    (REG_BASE + REG_OFFSET_TM2CNT_H)\n#define REG_ADDR_TM3CNT      (REG_BASE + REG_OFFSET_TM3CNT)\n#define REG_ADDR_TM3CNT_L    (REG_BASE + REG_OFFSET_TM3CNT_L)\n#define REG_ADDR_TM3CNT_H    (REG_BASE + REG_OFFSET_TM3CNT_H)\n\n#define REG_ADDR_SIOCNT      (REG_BASE + REG_OFFSET_SIOCNT)\n#define REG_ADDR_SIODATA8    (REG_BASE + REG_OFFSET_SIODATA8)\n#define REG_ADDR_SIODATA32   (REG_BASE + REG_OFFSET_SIODATA32)\n#define REG_ADDR_SIOMLT_SEND (REG_BASE + REG_OFFSET_SIOMLT_SEND)\n#define REG_ADDR_SIOMLT_RECV (REG_BASE + REG_OFFSET_SIOMLT_RECV)\n#define REG_ADDR_SIOMULTI0   (REG_BASE + REG_OFFSET_SIOMULTI0)\n#define REG_ADDR_SIOMULTI1   (REG_BASE + REG_OFFSET_SIOMULTI1)\n#define REG_ADDR_SIOMULTI2   (REG_BASE + REG_OFFSET_SIOMULTI2)\n#define REG_ADDR_SIOMULTI3   (REG_BASE + REG_OFFSET_SIOMULTI3)\n\n#define REG_ADDR_KEYINPUT    (REG_BASE + REG_OFFSET_KEYINPUT)\n#define REG_ADDR_KEYCNT      (REG_BASE + REG_OFFSET_KEYCNT)\n\n#define REG_ADDR_RCNT        (REG_BASE + REG_OFFSET_RCNT)\n\n#define REG_ADDR_JOYCNT      (REG_BASE + REG_OFFSET_JOYCNT)\n#define REG_ADDR_JOYSTAT     (REG_BASE + REG_OFFSET_JOYSTAT)\n#define REG_ADDR_JOY_RECV    (REG_BASE + REG_OFFSET_JOY_RECV)\n#define REG_ADDR_JOY_RECV_L  (REG_BASE + REG_OFFSET_JOY_RECV_L)\n#define REG_ADDR_JOY_RECV_H  (REG_BASE + REG_OFFSET_JOY_RECV_H)\n#define REG_ADDR_JOY_TRANS   (REG_BASE + REG_OFFSET_JOY_TRANS)\n#define REG_ADDR_JOY_TRANS_L (REG_BASE + REG_OFFSET_JOY_TRANS_L)\n#define REG_ADDR_JOY_TRANS_H (REG_BASE + REG_OFFSET_JOY_TRANS_H)\n\n#define REG_ADDR_IME         (REG_BASE + REG_OFFSET_IME)\n#define REG_ADDR_IE          (REG_BASE + REG_OFFSET_IE)\n#define REG_ADDR_IF          (REG_BASE + REG_OFFSET_IF)\n\n#define REG_ADDR_WAITCNT     (REG_BASE + REG_OFFSET_WAITCNT)\n\n// I/O registers\n\n#define REG_DISPCNT     (*(vu16 *)REG_ADDR_DISPCNT)\n#define REG_DISPSTAT    (*(vu16 *)REG_ADDR_DISPSTAT)\n#define REG_VCOUNT      (*(vu16 *)REG_ADDR_VCOUNT)\n#define REG_BG0CNT      (*(vu16 *)REG_ADDR_BG0CNT)\n#define REG_BG1CNT      (*(vu16 *)REG_ADDR_BG1CNT)\n#define REG_BG2CNT      (*(vu16 *)REG_ADDR_BG2CNT)\n#define REG_BG3CNT      (*(vu16 *)REG_ADDR_BG3CNT)\n#define REG_BG0HOFS     (*(vu16 *)REG_ADDR_BG0HOFS)\n#define REG_BG0VOFS     (*(vu16 *)REG_ADDR_BG0VOFS)\n#define REG_BG1HOFS     (*(vu16 *)REG_ADDR_BG1HOFS)\n#define REG_BG1VOFS     (*(vu16 *)REG_ADDR_BG1VOFS)\n#define REG_BG2HOFS     (*(vu16 *)REG_ADDR_BG2HOFS)\n#define REG_BG2VOFS     (*(vu16 *)REG_ADDR_BG2VOFS)\n#define REG_BG3HOFS     (*(vu16 *)REG_ADDR_BG3HOFS)\n#define REG_BG3VOFS     (*(vu16 *)REG_ADDR_BG3VOFS)\n#define REG_BG2PA       (*(vu16 *)REG_ADDR_BG2PA)\n#define REG_BG2PB       (*(vu16 *)REG_ADDR_BG2PB)\n#define REG_BG2PC       (*(vu16 *)REG_ADDR_BG2PC)\n#define REG_BG2PD       (*(vu16 *)REG_ADDR_BG2PD)\n#define REG_BG2X        (*(vu32 *)REG_ADDR_BG2X)\n#define REG_BG2X_L      (*(vu16 *)REG_ADDR_BG2X_L)\n#define REG_BG2X_H      (*(vu16 *)REG_ADDR_BG2X_H)\n#define REG_BG2Y        (*(vu32 *)REG_ADDR_BG2Y)\n#define REG_BG2Y_L      (*(vu16 *)REG_ADDR_BG2Y_L)\n#define REG_BG2Y_H      (*(vu16 *)REG_ADDR_BG2Y_H)\n#define REG_BG3PA       (*(vu16 *)REG_ADDR_BG3PA)\n#define REG_BG3PB       (*(vu16 *)REG_ADDR_BG3PB)\n#define REG_BG3PC       (*(vu16 *)REG_ADDR_BG3PC)\n#define REG_BG3PD       (*(vu16 *)REG_ADDR_BG3PD)\n#define REG_BG3X        (*(vu32 *)REG_ADDR_BG3X)\n#define REG_BG3X_L      (*(vu16 *)REG_ADDR_BG3X_L)\n#define REG_BG3X_H      (*(vu16 *)REG_ADDR_BG3X_H)\n#define REG_BG3Y        (*(vu32 *)REG_ADDR_BG3Y)\n#define REG_BG3Y_L      (*(vu16 *)REG_ADDR_BG3Y_L)\n#define REG_BG3Y_H      (*(vu16 *)REG_ADDR_BG3Y_H)\n#define REG_WIN0H       (*(vu16 *)REG_ADDR_WIN0H)\n#define REG_WIN1H       (*(vu16 *)REG_ADDR_WIN1H)\n#define REG_WIN0V       (*(vu16 *)REG_ADDR_WIN0V)\n#define REG_WIN1V       (*(vu16 *)REG_ADDR_WIN1V)\n#define REG_WININ       (*(vu16 *)REG_ADDR_WININ)\n#define REG_WINOUT      (*(vu16 *)REG_ADDR_WINOUT)\n#define REG_MOSAIC      (*(vu16 *)REG_ADDR_MOSAIC)\n#define REG_BLDCNT      (*(vu16 *)REG_ADDR_BLDCNT)\n#define REG_BLDALPHA    (*(vu16 *)REG_ADDR_BLDALPHA)\n#define REG_BLDY        (*(vu16 *)REG_ADDR_BLDY)\n\n#define REG_SOUND1CNT_L (*(vu16 *)REG_ADDR_SOUND1CNT_L)\n#define REG_NR10        (*(vu8  *)REG_ADDR_NR10)\n#define REG_SOUND1CNT_H (*(vu16 *)REG_ADDR_SOUND1CNT_H)\n#define REG_NR11        (*(vu8  *)REG_ADDR_NR11)\n#define REG_NR12        (*(vu8  *)REG_ADDR_NR12)\n#define REG_SOUND1CNT_X (*(vu16 *)REG_ADDR_SOUND1CNT_X)\n#define REG_NR13        (*(vu8  *)REG_ADDR_NR13)\n#define REG_NR14        (*(vu8  *)REG_ADDR_NR14)\n#define REG_SOUND2CNT_L (*(vu16 *)REG_ADDR_SOUND2CNT_L)\n#define REG_NR21        (*(vu8  *)REG_ADDR_NR21)\n#define REG_NR22        (*(vu8  *)REG_ADDR_NR22)\n#define REG_SOUND2CNT_H (*(vu16 *)REG_ADDR_SOUND2CNT_H)\n#define REG_NR23        (*(vu8  *)REG_ADDR_NR23)\n#define REG_NR24        (*(vu8  *)REG_ADDR_NR24)\n#define REG_SOUND3CNT_L (*(vu16 *)REG_ADDR_SOUND3CNT_L)\n#define REG_NR30        (*(vu8  *)REG_ADDR_NR30)\n#define REG_SOUND3CNT_H (*(vu16 *)REG_ADDR_SOUND3CNT_H)\n#define REG_NR31        (*(vu8  *)REG_ADDR_NR31)\n#define REG_NR32        (*(vu8  *)REG_ADDR_NR32)\n#define REG_SOUND3CNT_X (*(vu16 *)REG_ADDR_SOUND3CNT_X)\n#define REG_NR33        (*(vu8  *)REG_ADDR_NR33)\n#define REG_NR34        (*(vu8  *)REG_ADDR_NR34)\n#define REG_SOUND4CNT_L (*(vu16 *)REG_ADDR_SOUND4CNT_L)\n#define REG_NR41        (*(vu8  *)REG_ADDR_NR41)\n#define REG_NR42        (*(vu8  *)REG_ADDR_NR42)\n#define REG_SOUND4CNT_H (*(vu16 *)REG_ADDR_SOUND4CNT_H)\n#define REG_NR43        (*(vu8  *)REG_ADDR_NR43)\n#define REG_NR44        (*(vu8  *)REG_ADDR_NR44)\n#define REG_SOUNDCNT_L  (*(vu16 *)REG_ADDR_SOUNDCNT_L)\n#define REG_NR50        (*(vu8  *)REG_ADDR_NR50)\n#define REG_NR51        (*(vu8  *)REG_ADDR_NR51)\n#define REG_SOUNDCNT_H  (*(vu16 *)REG_ADDR_SOUNDCNT_H)\n#define REG_SOUNDCNT_X  (*(vu16 *)REG_ADDR_SOUNDCNT_X)\n#define REG_NR52        (*(vu8  *)REG_ADDR_NR52)\n#define REG_SOUNDBIAS   (*(vu16 *)REG_ADDR_SOUNDBIAS)\n#define REG_SOUNDBIAS_L (*(vu8  *)REG_ADDR_SOUNDBIAS_L)\n#define REG_SOUNDBIAS_H (*(vu8  *)REG_ADDR_SOUNDBIAS_H)\n#define REG_WAVE_RAM0   (*(vu32 *)REG_ADDR_WAVE_RAM0)\n#define REG_WAVE_RAM1   (*(vu32 *)REG_ADDR_WAVE_RAM1)\n#define REG_WAVE_RAM2   (*(vu32 *)REG_ADDR_WAVE_RAM2)\n#define REG_WAVE_RAM3   (*(vu32 *)REG_ADDR_WAVE_RAM3)\n#define REG_FIFO_A      (*(vu32 *)REG_ADDR_FIFO_A)\n#define REG_FIFO_B      (*(vu32 *)REG_ADDR_FIFO_B)\n\n#define REG_DMA0SAD     (*(vu32 *)REG_ADDR_DMA0SAD)\n#define REG_DMA0DAD     (*(vu32 *)REG_ADDR_DMA0DAD)\n#define REG_DMA0CNT     (*(vu32 *)REG_ADDR_DMA0CNT)\n#define REG_DMA0CNT_L   (*(vu16 *)REG_ADDR_DMA0CNT_L)\n#define REG_DMA0CNT_H   (*(vu16 *)REG_ADDR_DMA0CNT_H)\n\n#define REG_DMA1SAD     (*(vu32 *)REG_ADDR_DMA1SAD)\n#define REG_DMA1DAD     (*(vu32 *)REG_ADDR_DMA1DAD)\n#define REG_DMA1CNT     (*(vu32 *)REG_ADDR_DMA1CNT)\n#define REG_DMA1CNT_L   (*(vu16 *)REG_ADDR_DMA1CNT_L)\n#define REG_DMA1CNT_H   (*(vu16 *)REG_ADDR_DMA1CNT_H)\n\n#define REG_DMA2SAD     (*(vu32 *)REG_ADDR_DMA2SAD)\n#define REG_DMA2DAD     (*(vu32 *)REG_ADDR_DMA2DAD)\n#define REG_DMA2CNT     (*(vu32 *)REG_ADDR_DMA2CNT)\n#define REG_DMA2CNT_L   (*(vu16 *)REG_ADDR_DMA2CNT_L)\n#define REG_DMA2CNT_H   (*(vu16 *)REG_ADDR_DMA2CNT_H)\n\n#define REG_DMA3SAD     (*(vu32 *)REG_ADDR_DMA3SAD)\n#define REG_DMA3DAD     (*(vu32 *)REG_ADDR_DMA3DAD)\n#define REG_DMA3CNT     (*(vu32 *)REG_ADDR_DMA3CNT)\n#define REG_DMA3CNT_L   (*(vu16 *)REG_ADDR_DMA3CNT_L)\n#define REG_DMA3CNT_H   (*(vu16 *)REG_ADDR_DMA3CNT_H)\n\n#define REG_TMCNT(n)    (*(vu32 *)(REG_ADDR_TMCNT + ((n) * 4)))\n#define REG_TMCNT_L(n)  (*(vu16 *)(REG_ADDR_TMCNT_L + ((n) * 4)))\n#define REG_TMCNT_H(n)  (*(vu16 *)(REG_ADDR_TMCNT_H + ((n) * 4)))\n#define REG_TM0CNT      (*(vu32 *)REG_ADDR_TM0CNT)\n#define REG_TM0CNT_L    (*(vu16 *)REG_ADDR_TM0CNT_L)\n#define REG_TM0CNT_H    (*(vu16 *)REG_ADDR_TM0CNT_H)\n#define REG_TM1CNT      (*(vu32 *)REG_ADDR_TM1CNT)\n#define REG_TM1CNT_L    (*(vu16 *)REG_ADDR_TM1CNT_L)\n#define REG_TM1CNT_H    (*(vu16 *)REG_ADDR_TM1CNT_H)\n#define REG_TM2CNT      (*(vu32 *)REG_ADDR_TM2CNT)\n#define REG_TM2CNT_L    (*(vu16 *)REG_ADDR_TM2CNT_L)\n#define REG_TM2CNT_H    (*(vu16 *)REG_ADDR_TM2CNT_H)\n#define REG_TM3CNT      (*(vu32 *)REG_ADDR_TM3CNT)\n#define REG_TM3CNT_L    (*(vu16 *)REG_ADDR_TM3CNT_L)\n#define REG_TM3CNT_H    (*(vu16 *)REG_ADDR_TM3CNT_H)\n\n#define REG_SIOCNT      (*(vu16 *)REG_ADDR_SIOCNT)\n#define REG_SIODATA8    (*(vu16 *)REG_ADDR_SIODATA8)\n#define REG_SIODATA32   (*(vu32 *)REG_ADDR_SIODATA32)\n#define REG_SIOMLT_SEND (*(vu16 *)REG_ADDR_SIOMLT_SEND)\n#define REG_SIOMLT_RECV (*(vu64 *)REG_ADDR_SIOMLT_RECV)\n#define REG_SIOMULTI0   (*(vu16 *)REG_ADDR_SIOMULTI0)\n#define REG_SIOMULTI1   (*(vu16 *)REG_ADDR_SIOMULTI1)\n#define REG_SIOMULTI2   (*(vu16 *)REG_ADDR_SIOMULTI2)\n#define REG_SIOMULTI3   (*(vu16 *)REG_ADDR_SIOMULTI3)\n\n#define REG_KEYINPUT    (*(vu16 *)REG_ADDR_KEYINPUT)\n#define REG_KEYCNT      (*(vu16 *)REG_ADDR_KEYCNT)\n\n#define REG_RCNT        (*(vu16 *)REG_ADDR_RCNT)\n\n#define REG_IME         (*(vu16 *)REG_ADDR_IME)\n#define REG_IE          (*(vu16 *)REG_ADDR_IE)\n#define REG_IF          (*(vu16 *)REG_ADDR_IF)\n\n#define REG_WAITCNT     (*(vu16 *)REG_ADDR_WAITCNT)\n\n// I/O register fields\n\n// DISPCNT\n#define DISPCNT_MODE_0       0x0000 // BG0: text, BG1: text, BG2: text,   BG3: text\n#define DISPCNT_MODE_1       0x0001 // BG0: text, BG1: text, BG2: affine, BG3: off\n#define DISPCNT_MODE_2       0x0002 // BG0: off,  BG1: off,  BG2: affine, BG3: affine\n#define DISPCNT_MODE_3       0x0003 // Bitmap mode, 240x160, BGR555 color\n#define DISPCNT_MODE_4       0x0004 // Bitmap mode, 240x160, 256 color palette\n#define DISPCNT_MODE_5       0x0005 // Bitmap mode, 160x128, BGR555 color\n#define DISPCNT_OBJ_1D_MAP   0x0040\n#define DISPCNT_FORCED_BLANK 0x0080\n#define DISPCNT_BG0_ON       0x0100\n#define DISPCNT_BG1_ON       0x0200\n#define DISPCNT_BG2_ON       0x0400\n#define DISPCNT_BG3_ON       0x0800\n#define DISPCNT_BG_ALL_ON    0x0F00\n#define DISPCNT_OBJ_ON       0x1000\n#define DISPCNT_WIN0_ON      0x2000\n#define DISPCNT_WIN1_ON      0x4000\n#define DISPCNT_OBJWIN_ON    0x8000\n\n// DISPSTAT\n#define DISPSTAT_VBLANK      0x0001 // in V-Blank\n#define DISPSTAT_HBLANK      0x0002 // in H-Blank\n#define DISPSTAT_VCOUNT      0x0004 // V-Count match\n#define DISPSTAT_VBLANK_INTR 0x0008 // V-Blank interrupt enabled\n#define DISPSTAT_HBLANK_INTR 0x0010 // H-Blank interrupt enabled\n#define DISPSTAT_VCOUNT_INTR 0x0020 // V-Count interrupt enabled\n\n// BGCNT\n#define BGCNT_PRIORITY(n)          (n) // Values 0 - 3. Lower priority BGs will be drawn on top of higher priority BGs.\n#define BGCNT_CHARBASE(n)   ((n) << 2) // Values 0 - 3. Base block for tile pixel data.\n#define BGCNT_MOSAIC            0x0040\n#define BGCNT_16COLOR           0x0000 // 4 bits per pixel\n#define BGCNT_256COLOR          0x0080 // 8 bits per pixel\n#define BGCNT_SCREENBASE(n) ((n) << 8) // Values 0 - 31. Base block for tile map.\n#define BGCNT_WRAP              0x2000 // Only affects affine BGs. Text BGs wrap by default.\n#define BGCNT_TXT256x256        0x0000 // Internal screen size size of text mode BG in pixels.\n#define BGCNT_TXT512x256        0x4000\n#define BGCNT_TXT256x512        0x8000\n#define BGCNT_TXT512x512        0xC000\n#define BGCNT_AFF128x128        0x0000 // Internal screen size size of affine mode BG in pixels.\n#define BGCNT_AFF256x256        0x4000\n#define BGCNT_AFF512x512        0x8000\n#define BGCNT_AFF1024x1024      0xC000\n\n// WININ/OUT\n#define WININ_WIN0_BG0      (1 << 0)\n#define WININ_WIN0_BG1      (1 << 1)\n#define WININ_WIN0_BG2      (1 << 2)\n#define WININ_WIN0_BG3      (1 << 3)\n#define WININ_WIN0_BG_ALL   (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3)\n#define WININ_WIN0_OBJ      (1 << 4)\n#define WININ_WIN0_CLR      (1 << 5)\n#define WININ_WIN0_ALL      (WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR)\n#define WININ_WIN1_BG0      (1 << 8)\n#define WININ_WIN1_BG1      (1 << 9)\n#define WININ_WIN1_BG2      (1 << 10)\n#define WININ_WIN1_BG3      (1 << 11)\n#define WININ_WIN1_BG_ALL   (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3)\n#define WININ_WIN1_OBJ      (1 << 12)\n#define WININ_WIN1_CLR      (1 << 13)\n#define WININ_WIN1_ALL      (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR)\n\n#define WINOUT_WIN01_BG0    (1 << 0)\n#define WINOUT_WIN01_BG1    (1 << 1)\n#define WINOUT_WIN01_BG2    (1 << 2)\n#define WINOUT_WIN01_BG3    (1 << 3)\n#define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3)\n#define WINOUT_WIN01_OBJ    (1 << 4)\n#define WINOUT_WIN01_CLR    (1 << 5)\n#define WINOUT_WIN01_ALL    (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR)\n#define WINOUT_WINOBJ_BG0   (1 << 8)\n#define WINOUT_WINOBJ_BG1   (1 << 9)\n#define WINOUT_WINOBJ_BG2   (1 << 10)\n#define WINOUT_WINOBJ_BG3   (1 << 11)\n#define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3)\n#define WINOUT_WINOBJ_OBJ   (1 << 12)\n#define WINOUT_WINOBJ_CLR   (1 << 13)\n#define WINOUT_WINOBJ_ALL   (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR)\n\n#define WIN_RANGE(a, b) (((a) << 8) | (b))\n#define WIN_RANGE2(a, b) ((b) | ((a) << 8))\n\n// BLDCNT\n// Bits 0-5 select layers for the 1st target\n#define BLDCNT_TGT1_BG0      (1 << 0)\n#define BLDCNT_TGT1_BG1      (1 << 1)\n#define BLDCNT_TGT1_BG2      (1 << 2)\n#define BLDCNT_TGT1_BG3      (1 << 3)\n#define BLDCNT_TGT1_BG_ALL   (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3)\n#define BLDCNT_TGT1_OBJ      (1 << 4)\n#define BLDCNT_TGT1_BD       (1 << 5)\n#define BLDCNT_TGT1_ALL      (BLDCNT_TGT1_BG_ALL | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD)\n// Bits 6-7 select the special effect\n#define BLDCNT_EFFECT_NONE      (0 << 6)   // no special effect\n#define BLDCNT_EFFECT_BLEND     (1 << 6)   // 1st+2nd targets mixed (controlled by BLDALPHA)\n#define BLDCNT_EFFECT_LIGHTEN   (2 << 6)   // 1st target becomes whiter (controlled by BLDY)\n#define BLDCNT_EFFECT_DARKEN    (3 << 6)   // 1st target becomes blacker (controlled by BLDY)\n// Bits 8-13 select layers for the 2nd target\n#define BLDCNT_TGT2_BG0      (1 << 8)\n#define BLDCNT_TGT2_BG1      (1 << 9)\n#define BLDCNT_TGT2_BG2      (1 << 10)\n#define BLDCNT_TGT2_BG3      (1 << 11)\n#define BLDCNT_TGT2_BG_ALL   (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3)\n#define BLDCNT_TGT2_OBJ      (1 << 12)\n#define BLDCNT_TGT2_BD       (1 << 13)\n#define BLDCNT_TGT2_ALL      (BLDCNT_TGT2_BG_ALL | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD)\n\n// BLDALPHA\n#define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1))\n#define BLDALPHA_BLEND2(target1, target2) ((target1) | ((target2) << 8))\n\n// SOUNDCNT_H\n#define SOUND_CGB_MIX_QUARTER 0x0000\n#define SOUND_CGB_MIX_HALF    0x0001\n#define SOUND_CGB_MIX_FULL    0x0002\n#define SOUND_A_MIX_HALF      0x0000\n#define SOUND_A_MIX_FULL      0x0004\n#define SOUND_B_MIX_HALF      0x0000\n#define SOUND_B_MIX_FULL      0x0008\n#define SOUND_ALL_MIX_FULL    0x000E\n#define SOUND_A_RIGHT_OUTPUT  0x0100\n#define SOUND_A_LEFT_OUTPUT   0x0200\n#define SOUND_A_TIMER_0       0x0000\n#define SOUND_A_TIMER_1       0x0400\n#define SOUND_A_FIFO_RESET    0x0800\n#define SOUND_B_RIGHT_OUTPUT  0x1000\n#define SOUND_B_LEFT_OUTPUT   0x2000\n#define SOUND_B_TIMER_0       0x0000\n#define SOUND_B_TIMER_1       0x4000\n#define SOUND_B_FIFO_RESET    0x8000\n\n// SOUNDCNT_X\n#define SOUND_1_ON          0x0001\n#define SOUND_2_ON          0x0002\n#define SOUND_3_ON          0x0004\n#define SOUND_4_ON          0x0008\n#define SOUND_MASTER_ENABLE 0x0080\n\n// DMA\n#define DMA_DEST_INC      0x0000\n#define DMA_DEST_DEC      0x0020\n#define DMA_DEST_FIXED    0x0040\n#define DMA_DEST_RELOAD   0x0060\n#define DMA_SRC_INC       0x0000\n#define DMA_SRC_DEC       0x0080\n#define DMA_SRC_FIXED     0x0100\n#define DMA_REPEAT        0x0200\n#define DMA_16BIT         0x0000\n#define DMA_32BIT         0x0400\n#define DMA_DREQ_ON       0x0800\n#define DMA_START_NOW     0x0000\n#define DMA_START_VBLANK  0x1000\n#define DMA_START_HBLANK  0x2000\n#define DMA_START_SPECIAL 0x3000\n#define DMA_START_MASK    0x3000\n#define DMA_INTR_ENABLE   0x4000\n#define DMA_ENABLE        0x8000\n\n// timer\n#define TIMER_1CLK        0x00\n#define TIMER_64CLK       0x01\n#define TIMER_256CLK      0x02\n#define TIMER_1024CLK     0x03\n#define TIMER_INTR_ENABLE 0x40\n#define TIMER_ENABLE      0x80\n\n// serial\n#define SIO_ID             0x0030 // Communication ID\n\n#define SIO_8BIT_MODE      0x0000 // Normal 8-bit communication mode\n#define SIO_32BIT_MODE     0x1000 // Normal 32-bit communication mode\n#define SIO_MULTI_MODE     0x2000 // Multi-player communication mode\n#define SIO_UART_MODE      0x3000 // UART communication mode\n\n#define SIO_9600_BPS       0x0000 // baud rate   9600 bps\n#define SIO_38400_BPS      0x0001 //            38400 bps\n#define SIO_57600_BPS      0x0002 //            57600 bps\n#define SIO_115200_BPS     0x0003 //           115200 bps\n\n#define SIO_MULTI_SI       0x0004 // Multi-player communication SI terminal\n#define SIO_MULTI_SD       0x0008 //                            SD terminal\n#define SIO_MULTI_BUSY     0x0080\n\n#define SIO_ERROR          0x0040 // Detect error\n#define SIO_START          0x0080 // Start transfer\n#define SIO_ENABLE         0x0080 // Enable SIO\n\n#define SIO_INTR_ENABLE    0x4000\n\n#define SIO_MULTI_SI_SHIFT 2\n#define SIO_MULTI_SI_MASK  0x1\n#define SIO_MULTI_DI_SHIFT 3\n#define SIO_MULTI_DI_MASK  0x1\n\n// keys\n#define A_BUTTON        0x0001\n#define B_BUTTON        0x0002\n#define SELECT_BUTTON   0x0004\n#define START_BUTTON    0x0008\n#define DPAD_RIGHT      0x0010\n#define DPAD_LEFT       0x0020\n#define DPAD_UP         0x0040\n#define DPAD_DOWN       0x0080\n#define R_BUTTON        0x0100\n#define L_BUTTON        0x0200\n#define KEYS_MASK       0x03FF\n#define KEY_INTR_ENABLE 0x4000\n#define KEY_OR_INTR     0x0000\n#define KEY_AND_INTR    0x8000\n#define DPAD_ANY        0x00F0\n#define JOY_EXCL_DPAD   0x030F\n\n// interrupt flags\n#define INTR_FLAG_VBLANK  (1 <<  0)\n#define INTR_FLAG_HBLANK  (1 <<  1)\n#define INTR_FLAG_VCOUNT  (1 <<  2)\n#define INTR_FLAG_TIMER0  (1 <<  3)\n#define INTR_FLAG_TIMER1  (1 <<  4)\n#define INTR_FLAG_TIMER2  (1 <<  5)\n#define INTR_FLAG_TIMER3  (1 <<  6)\n#define INTR_FLAG_SERIAL  (1 <<  7)\n#define INTR_FLAG_DMA0    (1 <<  8)\n#define INTR_FLAG_DMA1    (1 <<  9)\n#define INTR_FLAG_DMA2    (1 << 10)\n#define INTR_FLAG_DMA3    (1 << 11)\n#define INTR_FLAG_KEYPAD  (1 << 12)\n#define INTR_FLAG_GAMEPAK (1 << 13)\n\n// WAITCNT\n#define WAITCNT_SRAM_4          (0 << 0)\n#define WAITCNT_SRAM_3          (1 << 0)\n#define WAITCNT_SRAM_2          (2 << 0)\n#define WAITCNT_SRAM_8          (3 << 0)\n#define WAITCNT_SRAM_MASK       (3 << 0)\n\n#define WAITCNT_WS0_N_4         (0 << 2)\n#define WAITCNT_WS0_N_3         (1 << 2)\n#define WAITCNT_WS0_N_2         (2 << 2)\n#define WAITCNT_WS0_N_8         (3 << 2)\n#define WAITCNT_WS0_N_MASK      (3 << 2)\n\n#define WAITCNT_WS0_S_2         (0 << 4)\n#define WAITCNT_WS0_S_1         (1 << 4)\n\n#define WAITCNT_WS1_N_4         (0 << 5)\n#define WAITCNT_WS1_N_3         (1 << 5)\n#define WAITCNT_WS1_N_2         (2 << 5)\n#define WAITCNT_WS1_N_8         (3 << 5)\n#define WAITCNT_WS1_N_MASK      (3 << 5)\n\n#define WAITCNT_WS1_S_4         (0 << 7)\n#define WAITCNT_WS1_S_1         (1 << 7)\n\n#define WAITCNT_WS2_N_4         (0 << 8)\n#define WAITCNT_WS2_N_3         (1 << 8)\n#define WAITCNT_WS2_N_2         (2 << 8)\n#define WAITCNT_WS2_N_8         (3 << 8)\n#define WAITCNT_WS2_N_MASK      (3 << 8)\n\n#define WAITCNT_WS2_S_8         (0 << 10)\n#define WAITCNT_WS2_S_1         (1 << 10)\n\n#define WAITCNT_PHI_OUT_NONE    (0 << 11)\n#define WAITCNT_PHI_OUT_4MHZ    (1 << 11)\n#define WAITCNT_PHI_OUT_8MHZ    (2 << 11)\n#define WAITCNT_PHI_OUT_16MHZ   (3 << 11)\n#define WAITCNT_PHI_OUT_MASK    (3 << 11)\n\n#define WAITCNT_PREFETCH_ENABLE (1 << 14)\n\n#define WAITCNT_AGB (0 << 15)\n#define WAITCNT_CGB (1 << 15)\n\n#endif // GUARD_GBA_IO_REG_H\n"
  },
  {
    "path": "include/gba/isagbprint.h",
    "content": "#ifndef GUARD_GBA_ISAGBPRINT_H\n#define GUARD_GBA_ISAGBPRINT_H\n\n#include \"gba/types.h\"\n\n#define MGBA_LOG_FATAL  (0)\n#define MGBA_LOG_ERROR  (1)\n#define MGBA_LOG_WARN   (2)\n#define MGBA_LOG_INFO   (3)\n#define MGBA_LOG_DEBUG  (4)\n\n#ifdef NDEBUG\n#define DebugPrintf(pBuf, ...)\n#define DebugPrintfLevel(level, pBuf, ...)\n#define MgbaOpen()\n#define MgbaClose()\n#define AGBPrintInit()\n#define DebugAssert(pFile, nLine, pExpression, nStopProgram)\n#else\n\nbool32 MgbaOpen(void);\nvoid MgbaClose(void);\nvoid MgbaPrintf(s32 level, const char *pBuf, ...);\nvoid MgbaAssert(const char *pFile, s32 nLine, const char *pExpression, bool32 nStopProgram);\nvoid NoCashGBAPrintf(const char *pBuf, ...);\nvoid NoCashGBAAssert(const char *pFile, s32 nLine, const char *pExpression, bool32 nStopProgram);\nvoid AGBPrintf(const char *pBuf, ...);\nvoid AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram);\nvoid AGBPrintInit(void);\n\n#if (LOG_HANDLER == LOG_HANDLER_MGBA_PRINT)\n\n#define DebugPrintf(pBuf, ...) MgbaPrintf(MGBA_LOG_INFO, pBuf, ## __VA_ARGS__)\n#define DebugAssert(pFile, nLine, pExpression, nStopProgram) MgbaAssert(pFile, nLine, pExpression, nStopProgram)\n#define DebugPrintfLevel(level, pBuf, ...) MgbaPrintf(level, pBuf, ## __VA_ARGS__)\n\n#elif (LOG_HANDLER == LOG_HANDLER_NOCASH_PRINT)\n\n#define DebugPrintf(pBuf, ...) NoCashGBAPrintf(pBuf, ## __VA_ARGS__)\n#define DebugAssert(pFile, nLine, pExpression, nStopProgram) NoCashGBAAssert(pFile, nLine, pExpression, nStopProgram)\n#define DebugPrintfLevel(level, pBuf, ...) NoCashGBAPrintf(pBuf, ## __VA_ARGS__)\n\n#else // Default to AGBPrint\n\n#define DebugPrintf(pBuf, ...) AGBPrintf(pBuf, ## __VA_ARGS__)\n#define DebugAssert(pFile, nLine, pExpression, nStopProgram) AGBAssert(pFile, nLine, pExpression, nStopProgram)\n#define DebugPrintfLevel(level, pBuf, ...) AGBPrintf(pBuf, ## __VA_ARGS__)\n\n#endif\n#endif\n\n#ifdef NDEBUG\n\n#define AGB_ASSERT(exp)\n#define AGB_WARNING(exp)\n#define AGB_ASSERT_EX(exp, file, line)\n#define AGB_WARNING_EX(exp, file, line)\n\n#else\n\n#define AGB_ASSERT(exp) (exp) ? ((void*)0) : DebugAssert(__FILE__, __LINE__, #exp, TRUE)\n#define AGB_WARNING(exp) (exp) ? ((void*)0) : DebugAssert(__FILE__, __LINE__, #exp, FALSE)\n\n#define AGB_WARNING_EX(exp, file, line) (exp) ? ((void *)0) : DebugAssert(file, line, #exp, FALSE);\n#define AGB_ASSERT_EX(exp, file, line) (exp) ? ((void *)0) : DebugAssert(file, line, #exp, TRUE);\n\n#endif\n\n#endif // GUARD_GBA_ISAGBPRINT_H\n"
  },
  {
    "path": "include/gba/m4a_internal.h",
    "content": "#ifndef GUARD_GBA_M4A_INTERNAL_H\n#define GUARD_GBA_M4A_INTERNAL_H\n\n#include \"gba/gba.h\"\n\n// ASCII encoding of 'Smsh' in reverse\n// This is presumably short for SMASH, the developer of MKS4AGB.\n#define ID_NUMBER 0x68736D53\n\n#define C_V 0x40 // center value for PAN, BEND, and TUNE\n\n#define SOUND_MODE_REVERB_VAL   0x0000007F\n#define SOUND_MODE_REVERB_SET   0x00000080\n#define SOUND_MODE_MAXCHN       0x00000F00\n#define SOUND_MODE_MAXCHN_SHIFT 8\n#define SOUND_MODE_MASVOL       0x0000F000\n#define SOUND_MODE_MASVOL_SHIFT 12\n#define SOUND_MODE_FREQ_05734   0x00010000\n#define SOUND_MODE_FREQ_07884   0x00020000\n#define SOUND_MODE_FREQ_10512   0x00030000\n#define SOUND_MODE_FREQ_13379   0x00040000\n#define SOUND_MODE_FREQ_15768   0x00050000\n#define SOUND_MODE_FREQ_18157   0x00060000\n#define SOUND_MODE_FREQ_21024   0x00070000\n#define SOUND_MODE_FREQ_26758   0x00080000\n#define SOUND_MODE_FREQ_31536   0x00090000\n#define SOUND_MODE_FREQ_36314   0x000A0000\n#define SOUND_MODE_FREQ_40137   0x000B0000\n#define SOUND_MODE_FREQ_42048   0x000C0000\n#define SOUND_MODE_FREQ         0x000F0000\n#define SOUND_MODE_FREQ_SHIFT   16\n#define SOUND_MODE_DA_BIT_9     0x00800000\n#define SOUND_MODE_DA_BIT_8     0x00900000\n#define SOUND_MODE_DA_BIT_7     0x00A00000\n#define SOUND_MODE_DA_BIT_6     0x00B00000\n#define SOUND_MODE_DA_BIT       0x00B00000\n#define SOUND_MODE_DA_BIT_SHIFT 20\n\nstruct WaveData\n{\n    u16 type;\n    u16 status;\n    u32 freq;\n    u32 loopStart;\n    u32 size; // number of samples\n    s8 data[1]; // samples\n};\n\n#define TONEDATA_TYPE_CGB    0x07\n#define TONEDATA_TYPE_FIX    0x08\n#define TONEDATA_TYPE_SPL    0x40 // key split\n#define TONEDATA_TYPE_RHY    0x80 // rhythm\n\n#define TONEDATA_P_S_PAN    0xc0\n#define TONEDATA_P_S_PAM    TONEDATA_P_S_PAN\n\nstruct ToneData\n{\n    u8 type;\n    u8 key;\n    u8 length; // sound length (compatible sound)\n    u8 pan_sweep; // pan or sweep (compatible sound ch. 1)\n    struct WaveData *wav;\n    u8 attack;\n    u8 decay;\n    u8 sustain;\n    u8 release;\n};\n\n#define SOUND_CHANNEL_SF_START       0x80\n#define SOUND_CHANNEL_SF_STOP        0x40\n#define SOUND_CHANNEL_SF_LOOP        0x10\n#define SOUND_CHANNEL_SF_IEC         0x04\n#define SOUND_CHANNEL_SF_ENV         0x03\n#define SOUND_CHANNEL_SF_ENV_ATTACK  0x03\n#define SOUND_CHANNEL_SF_ENV_DECAY   0x02\n#define SOUND_CHANNEL_SF_ENV_SUSTAIN 0x01\n#define SOUND_CHANNEL_SF_ENV_RELEASE 0x00\n#define SOUND_CHANNEL_SF_ON (SOUND_CHANNEL_SF_START | SOUND_CHANNEL_SF_STOP | SOUND_CHANNEL_SF_IEC | SOUND_CHANNEL_SF_ENV)\n\n#define CGB_CHANNEL_MO_PIT  0x02\n#define CGB_CHANNEL_MO_VOL  0x01\n\n#define CGB_NRx2_ENV_DIR_DEC 0x00\n#define CGB_NRx2_ENV_DIR_INC 0x08\n\nstruct CgbChannel\n{\n    u8 statusFlags;\n    u8 type;\n    u8 rightVolume;\n    u8 leftVolume;\n    u8 attack;\n    u8 decay;\n    u8 sustain;\n    u8 release;\n    u8 key;\n    u8 envelopeVolume;\n    u8 envelopeGoal;\n    u8 envelopeCounter;\n    u8 pseudoEchoVolume;\n    u8 pseudoEchoLength;\n    u8 dummy1;\n    u8 dummy2;\n    u8 gateTime;\n    u8 midiKey;\n    u8 velocity;\n    u8 priority;\n    u8 rhythmPan;\n    u8 dummy3[3];\n    u8 dummy5;\n    u8 sustainGoal;\n    u8 n4;                  // NR[1-4]4 register (initial, length bit)\n    u8 pan;\n    u8 panMask;\n    u8 modify;\n    u8 length;\n    u8 sweep;\n    u32 frequency;\n    u32 *wavePointer;       // instructs CgbMain to load targeted wave\n    u32 *currentPointer;    // stores the currently loaded wave\n    struct MusicPlayerTrack *track;\n    void *prevChannelPointer;\n    void *nextChannelPointer;\n    u8 dummy4[8];\n};\n\nstruct MusicPlayerTrack;\n\nstruct SoundChannel\n{\n    u8 statusFlags;\n    u8 type;\n    u8 rightVolume;\n    u8 leftVolume;\n    u8 attack;\n    u8 decay;\n    u8 sustain;\n    u8 release;\n    u8 key;             // midi key as it was translated into final pitch\n    u8 envelopeVolume;\n    u8 envelopeVolumeRight;\n    u8 envelopeVolumeLeft;\n    u8 pseudoEchoVolume;\n    u8 pseudoEchoLength;\n    u8 dummy1;\n    u8 dummy2;\n    u8 gateTime;\n    u8 midiKey;         // midi key as it was used in the track data\n    u8 velocity;\n    u8 priority;\n    u8 rhythmPan;\n    u8 dummy3[3];\n    u32 count;\n    u32 fw;\n    u32 frequency;\n    struct WaveData *wav;\n    s8 *currentPointer;\n    struct MusicPlayerTrack *track;\n    void *prevChannelPointer;\n    void *nextChannelPointer;\n    u32 dummy4;\n    u16 xpi;\n    u16 xpc;\n};\n\n#define MAX_DIRECTSOUND_CHANNELS 12\n\n#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer\n\nstruct MusicPlayerInfo;\n\ntypedef void (*MPlayFunc)();\ntypedef void (*PlyNoteFunc)(u32, struct MusicPlayerInfo *, struct MusicPlayerTrack *);\ntypedef void (*CgbSoundFunc)(void);\ntypedef void (*CgbOscOffFunc)(u8);\ntypedef u32 (*MidiKeyToCgbFreqFunc)(u8, u8, u8);\ntypedef void (*ExtVolPitFunc)(void);\ntypedef void (*MPlayMainFunc)(struct MusicPlayerInfo *);\n\nstruct SoundInfo\n{\n    // This field is normally equal to ID_NUMBER but it is set to other\n    // values during sensitive operations for locking purposes.\n    // This field should be volatile but isn't. This could potentially cause\n    // race conditions.\n    u32 ident;\n\n    vu8 pcmDmaCounter;\n\n    // Direct Sound\n    u8 reverb;\n    u8 maxChans;\n    u8 masterVolume;\n    u8 freq;\n\n    u8 mode;\n    u8 c15;          // periodically counts from 14 down to 0 (15 states)\n    u8 pcmDmaPeriod; // number of V-blanks per PCM DMA\n    u8 maxLines;\n    u8 gap[3];\n    s32 pcmSamplesPerVBlank;\n    s32 pcmFreq;\n    s32 divFreq;\n    struct CgbChannel *cgbChans;\n    MPlayMainFunc MPlayMainHead;\n    struct MusicPlayerInfo *musicPlayerHead;\n    CgbSoundFunc CgbSound;\n    CgbOscOffFunc CgbOscOff;\n    MidiKeyToCgbFreqFunc MidiKeyToCgbFreq;\n    MPlayFunc *MPlayJumpTable;\n    PlyNoteFunc plynote;\n    ExtVolPitFunc ExtVolPit;\n    u8 gap2[16];\n    struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS];\n    s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2];\n};\n\nstruct SongHeader\n{\n    u8 trackCount;\n    u8 blockCount;\n    u8 priority;\n    u8 reverb;\n    struct ToneData *tone;\n    u8 *part[1];\n};\n\nstruct PokemonCrySong\n{\n    u8 trackCount;\n    u8 blockCount;\n    u8 priority;\n    u8 reverb;\n    struct ToneData *tone;\n    u8 *part[2];\n    u8 gap;\n    u8 part0; // 0x11\n    u8 tuneValue; // 0x12\n    u8 gotoCmd; // 0x13\n    u32 gotoTarget; // 0x14\n    u8 part1; // 0x18\n    u8 tuneValue2; // 0x19\n    u8 cont[2]; // 0x1A\n    u8 volCmd; // 0x1C\n    u8 volumeValue; // 0x1D\n    u8 unkCmd0D[2]; // 0x1E\n    u32 unkCmd0DParam; // 0x20\n    u8 xreleCmd[2]; // 0x24\n    u8 releaseValue; // 0x26\n    u8 panCmd;\n    u8 panValue; // 0x28\n    u8 tieCmd; // 0x29\n    u8 tieKeyValue; // 0x2A\n    u8 tieVelocityValue; // 0x2B\n    u8 unkCmd0C[2]; // 0x2C\n    u16 unkCmd0CParam; // 0x2E\n    u8 end[2]; // 0x30\n};\n\n#define MPT_FLG_VOLSET 0x01\n#define MPT_FLG_VOLCHG 0x03\n#define MPT_FLG_PITSET 0x04\n#define MPT_FLG_PITCHG 0x0C\n#define MPT_FLG_START  0x40\n#define MPT_FLG_EXIST  0x80\n\nstruct MusicPlayerTrack\n{\n    u8 flags;\n    u8 wait;\n    u8 patternLevel;\n    u8 repN;\n    u8 gateTime;\n    u8 key;\n    u8 velocity;\n    u8 runningStatus;\n    u8 keyM;\n    u8 pitM;\n    s8 keyShift;\n    s8 keyShiftX;\n    s8 tune;\n    u8 pitX;\n    s8 bend;\n    u8 bendRange;\n    u8 volMR;\n    u8 volML;\n    u8 vol;\n    u8 volX;\n    s8 pan;\n    s8 panX;\n    s8 modM;\n    u8 mod;\n    u8 modT;\n    u8 lfoSpeed;\n    u8 lfoSpeedC;\n    u8 lfoDelay;\n    u8 lfoDelayC;\n    u8 priority;\n    u8 pseudoEchoVolume;\n    u8 pseudoEchoLength;\n    struct SoundChannel *chan;\n    struct ToneData tone;\n    u8 gap[10];\n    u16 unk_3A;\n    u32 unk_3C;\n    u8 *cmdPtr;\n    u8 *patternStack[3];\n};\n\n#define MUSICPLAYER_STATUS_TRACK 0x0000ffff\n#define MUSICPLAYER_STATUS_PAUSE 0x80000000\n\n#define MAX_MUSICPLAYER_TRACKS 16\n\n#define TRACKS_ALL 0xFFFF\n\n#define TEMPORARY_FADE  0x0001\n#define FADE_IN         0x0002\n#define FADE_VOL_MAX    64\n#define FADE_VOL_SHIFT  2\n\nstruct MusicPlayerInfo\n{\n    struct SongHeader *songHeader;\n    u32 status;\n    u8 trackCount;\n    u8 priority;\n    u8 cmd;\n    u8 unk_B;\n    u32 clock;\n    u8 gap[8];\n    u8 *memAccArea;\n    u16 tempoD;\n    u16 tempoU;\n    u16 tempoI;\n    u16 tempoC;\n    u16 fadeOI;\n    u16 fadeOC;\n    u16 fadeOV;\n    struct MusicPlayerTrack *tracks;\n    struct ToneData *tone;\n    u32 ident;\n    MPlayMainFunc MPlayMainNext;\n    struct MusicPlayerInfo *musicPlayerNext;\n};\n\nstruct MusicPlayer\n{\n    struct MusicPlayerInfo *info;\n    struct MusicPlayerTrack *track;\n    u8 unk_8;\n    u16 unk_A;\n};\n\nstruct Song\n{\n    struct SongHeader *header;\n    u16 ms;\n    u16 me;\n};\n\nextern const struct MusicPlayer gMPlayTable[];\nextern const struct Song gSongTable[];\n\n\n\nextern u8 gMPlayMemAccArea[];\n\n//u8 gPokemonCrySong[52];\n//u8 gPokemonCrySongs[52 * MAX_POKEMON_CRIES];\n\n#define MAX_POKEMON_CRIES 2\n\nextern struct PokemonCrySong gPokemonCrySong;\nextern struct PokemonCrySong gPokemonCrySongs[];\n\nextern struct MusicPlayerInfo gPokemonCryMusicPlayers[];\nextern struct MusicPlayerTrack gPokemonCryTracks[];\n\nextern char SoundMainRAM[];\n\nextern MPlayFunc gMPlayJumpTable[];\n\ntypedef void (*XcmdFunc)(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nextern const XcmdFunc gXcmdTable[];\n\nextern struct CgbChannel gCgbChans[];\n\nextern const u8 gScaleTable[];\nextern const u32 gFreqTable[];\nextern const u16 gPcmSamplesPerVBlankTable[];\n\nextern const u8 gCgbScaleTable[];\nextern const s16 gCgbFreqTable[];\nextern const u8 gNoiseTable[];\n\nextern const struct PokemonCrySong gPokemonCrySongTemplate;\n\nextern const struct ToneData voicegroup000;\n\nextern char gNumMusicPlayers[];\nextern char gMaxLines[];\n\n#define NUM_MUSIC_PLAYERS ((u16)gNumMusicPlayers)\n#define MAX_LINES ((u32)gMaxLines)\n\nu32 umul3232H32(u32 multiplier, u32 multiplicand);\nvoid SoundMain(void);\nvoid SoundMainBTM(void);\nvoid TrackStop(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);\nvoid MPlayMain(struct MusicPlayerInfo *);\nvoid RealClearChain(void *x);\n\nvoid MPlayContinue(struct MusicPlayerInfo *mplayInfo);\nvoid MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader);\nvoid m4aMPlayStop(struct MusicPlayerInfo *mplayInfo);\nvoid FadeOutBody(struct MusicPlayerInfo *mplayInfo);\nvoid TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);\nvoid MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed);\nvoid ClearChain(void *x);\nvoid Clear64byte(void *addr);\nvoid SoundInit(struct SoundInfo *soundInfo);\nvoid MPlayExtender(struct CgbChannel *cgbChans);\nvoid m4aSoundMode(u32 mode);\nvoid MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track, u8 a3);\nvoid CgbSound(void);\nvoid CgbOscOff(u8);\nvoid CgbModVol(struct CgbChannel *chan);\nu32 MidiKeyToCgbFreq(u8, u8, u8);\nvoid DummyFunc(void);\nvoid MPlayJumpTableCopy(MPlayFunc *mplayJumpTable);\nvoid SampleFreqSet(u32 freq);\nvoid m4aSoundVSyncOn(void);\nvoid m4aSoundVSyncOff(void);\n\nvoid m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo);\nvoid m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume);\nvoid m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch);\nvoid m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan);\nvoid ClearModM(struct MusicPlayerTrack *track);\nvoid m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth);\nvoid m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed);\n\nstruct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone);\nvoid SetPokemonCryVolume(u8 val);\nvoid SetPokemonCryPanpot(s8 val);\nvoid SetPokemonCryPitch(s16 val);\nvoid SetPokemonCryLength(u16 val);\nvoid SetPokemonCryRelease(u8 val);\nvoid SetPokemonCryProgress(u32 val);\nbool32 IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo);\nvoid SetPokemonCryChorus(s8 val);\nvoid SetPokemonCryStereo(u32 val);\nvoid SetPokemonCryPriority(u8 val);\n\n// sound command handler functions\nvoid ply_fine(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_goto(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_patt(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_pend(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_rept(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_memacc(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_prio(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_tempo(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_keysh(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_voice(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_vol(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_pan(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_bend(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_bendr(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_lfos(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_lfodl(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_mod(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_modt(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_note(u32 note_cmd, struct MusicPlayerInfo *, struct MusicPlayerTrack *);\n\n// extended sound command handler functions\nvoid ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xwave(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xtype(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xatta(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xdeca(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xsust(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xrele(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xiecv(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xiecl(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xleng(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xswee(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xcmd_0C(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\nvoid ply_xcmd_0D(struct MusicPlayerInfo *, struct MusicPlayerTrack *);\n\n#endif // GUARD_GBA_M4A_INTERNAL_H\n"
  },
  {
    "path": "include/gba/macro.h",
    "content": "#ifndef GUARD_GBA_MACRO_H\n#define GUARD_GBA_MACRO_H\n\n#define CPU_FILL(value, dest, size, bit)                                          \\\n{                                                                                 \\\n    vu##bit tmp = (vu##bit)(value);                                               \\\n    CpuSet((void *)&tmp,                                                          \\\n           dest,                                                                  \\\n           CPU_SET_##bit##BIT | CPU_SET_SRC_FIXED | ((size)/(bit/8) & 0x1FFFFF)); \\\n}\n\n#define CpuFill16(value, dest, size) CPU_FILL(value, dest, size, 16)\n#define CpuFill32(value, dest, size) CPU_FILL(value, dest, size, 32)\n\n#define CPU_COPY(src, dest, size, bit) CpuSet(src, dest, CPU_SET_##bit##BIT | ((size)/(bit/8) & 0x1FFFFF))\n\n#define CpuCopy16(src, dest, size) CPU_COPY(src, dest, size, 16)\n#define CpuCopy32(src, dest, size) CPU_COPY(src, dest, size, 32)\n\n#define CpuFastFill(value, dest, size)                               \\\n{                                                                    \\\n    vu32 tmp = (vu32)(value);                                        \\\n    CpuFastSet((void *)&tmp,                                         \\\n               dest,                                                 \\\n               CPU_FAST_SET_SRC_FIXED | ((size)/(32/8) & 0x1FFFFF)); \\\n}\n\n#define CpuFastFill16(value, dest, size) CpuFastFill(((value) << 16) | (value), (dest), (size))\n\n#define CpuFastFill8(value, dest, size) CpuFastFill(((value) << 24) | ((value) << 16) | ((value) << 8) | (value), (dest), (size))\n\n#define CpuFastCopy(src, dest, size) CpuFastSet(src, dest, ((size)/(32/8) & 0x1FFFFF))\n\n#define DmaSet(dmaNum, src, dest, control)        \\\n{                                                 \\\n    vu32 *dmaRegs = (vu32 *)REG_ADDR_DMA##dmaNum; \\\n    dmaRegs[0] = (vu32)(src);                     \\\n    dmaRegs[1] = (vu32)(dest);                    \\\n    dmaRegs[2] = (vu32)(control);                 \\\n    dmaRegs[2];                                   \\\n}\n\n#define DMA_FILL(dmaNum, value, dest, size, bit)                                              \\\n{                                                                                             \\\n    vu##bit tmp = (vu##bit)(value);                                                           \\\n    DmaSet(dmaNum,                                                                            \\\n           &tmp,                                                                              \\\n           dest,                                                                              \\\n           (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_FIXED | DMA_DEST_INC) << 16 \\\n         | ((size)/(bit/8)));                                                                 \\\n}\n\n#define DmaFill16(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 16)\n#define DmaFill32(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 32)\n\n// Note that the DMA clear macros cause the DMA control value to be calculated\n// at runtime rather than compile time. The size is divided by the DMA transfer\n// unit size (2 or 4 bytes) and then combined with the DMA control flags using a\n// bitwise OR operation.\n\n#define DMA_CLEAR(dmaNum, dest, size, bit)  \\\n{                                           \\\n    vu##bit *_dest = (vu##bit *)(dest);     \\\n    u32 _size = size;                       \\\n    DmaFill##bit(dmaNum, 0, _dest, _size);  \\\n}\n\n#define DmaClear16(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 16)\n#define DmaClear32(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 32)\n\n#define DMA_COPY(dmaNum, src, dest, size, bit)                                              \\\n    DmaSet(dmaNum,                                                                          \\\n           src,                                                                             \\\n           dest,                                                                            \\\n           (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_INC | DMA_DEST_INC) << 16 \\\n         | ((size)/(bit/8)))\n\n#define DmaCopy16(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 16)\n#define DmaCopy32(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 32)\n\n#define DmaStop(dmaNum)                                         \\\n{                                                               \\\n    vu16 *dmaRegs = (vu16 *)REG_ADDR_DMA##dmaNum;               \\\n    dmaRegs[5] &= ~(DMA_START_MASK | DMA_DREQ_ON | DMA_REPEAT); \\\n    dmaRegs[5] &= ~DMA_ENABLE;                                  \\\n    dmaRegs[5];                                                 \\\n}\n\n#define DmaCopyLarge(dmaNum, src, dest, size, block, bit) \\\n{                                                         \\\n    const void *_src = src;                               \\\n    void *_dest = dest;                                   \\\n    u32 _size = size;                                     \\\n    while (1)                                             \\\n    {                                                     \\\n        DmaCopy##bit(dmaNum, _src, _dest, (block));       \\\n        _src += (block);                                  \\\n        _dest += (block);                                 \\\n        _size -= (block);                                 \\\n        if (_size <= (block))                             \\\n        {                                                 \\\n            DmaCopy##bit(dmaNum, _src, _dest, _size);     \\\n            break;                                        \\\n        }                                                 \\\n    }                                                     \\\n}\n\n#define DmaClearLarge(dmaNum, dest, size, block, bit) \\\n{                                                           \\\n    void *_dest = dest;                                     \\\n    u32 _size = size;                                       \\\n    while (1)                                               \\\n    {                                                       \\\n        DmaFill##bit(dmaNum, 0, _dest, (block));       \\\n        _dest += (block);                                   \\\n        _size -= (block);                                   \\\n        if (_size <= (block))                               \\\n        {                                                   \\\n            DmaFill##bit(dmaNum, 0, _dest, _size);     \\\n            break;                                          \\\n        }                                                   \\\n    }                                                       \\\n}\n\n#define DmaFillLarge(dmaNum, value, dest, size, block, bit) \\\n{                                                           \\\n    void *_dest = (void *)dest;                             \\\n    u32 _size = size;                                       \\\n    while (1)                                               \\\n    {                                                       \\\n        DmaFill##bit(dmaNum, value, _dest, (block));        \\\n        _dest += (block);                                   \\\n        _size -= (block);                                   \\\n        if (_size <= (block))                               \\\n        {                                                   \\\n            DmaFill##bit(dmaNum, value, _dest, _size);      \\\n            break;                                          \\\n        }                                                   \\\n    }                                                       \\\n}\n\n#define DmaCopyLarge16(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 16)\n\n#define DmaCopyLarge32(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 32)\n\n#define DmaFillLarge16(dmaNum, value, dest, size, block) DmaFillLarge(dmaNum, value, dest, size, block, 16)\n\n#define DmaFillLarge32(dmaNum, value, dest, size, block) DmaFillLarge(dmaNum, value, dest, size, block, 32)\n\n#define DmaClearLarge16(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 16)\n#define DmaClearLarge32(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 32)\n\n#define DmaCopyDefvars(dmaNum, src, dest, size, bit) \\\n{                                                    \\\n    const void *_src = src;                          \\\n    void *_dest = dest;                              \\\n    u32 _size = size;                                \\\n    DmaCopy##bit(dmaNum, _src, _dest, _size);        \\\n}\n\n#define DmaCopy16Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 16)\n#define DmaCopy32Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 32)\n\n#define DmaFillDefvars(dmaNum, value, dest, size, bit) \\\n{                                                      \\\n    void *_dest = (void *)dest;                        \\\n    u32 _size = size;                                  \\\n    DmaFill##bit(dmaNum, value, _dest, _size);         \\\n}\n\n#define DmaFill16Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 16)\n#define DmaFill32Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 32)\n\n#define DmaClearDefvars(dmaNum, dest, size, bit) \\\n{                                                \\\n    void *_dest = dest;                          \\\n    u32 _size = size;                            \\\n    DmaClear##bit(dmaNum, _dest, _size);         \\\n}\n\n#define DmaClear16Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 16)\n#define DmaClear32Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 32)\n\n#define IntrEnable(flags)                                       \\\n{                                                               \\\n    u16 imeTemp;                                                \\\n                                                                \\\n    imeTemp = REG_IME;                                          \\\n    REG_IME = 0;                                                \\\n    REG_IE |= flags;                                            \\\n    REG_IME = imeTemp;                                          \\\n}\n\n#endif // GUARD_GBA_MACRO_H\n"
  },
  {
    "path": "include/gba/multiboot.h",
    "content": "#ifndef GUARD_GBA_MULTIBOOT_H\n#define GUARD_GBA_MULTIBOOT_H\n\n#define MULTIBOOT_NCHILD        3       // Maximum number of slaves\n#define MULTIBOOT_HEADER_SIZE   0xc0    // Header size\n#define MULTIBOOT_SEND_SIZE_MIN 0x100   // Minimum transmission size\n#define MULTIBOOT_SEND_SIZE_MAX 0x40000 // Maximum transmission size\n\nstruct MultiBootParam\n{\n    u32 system_work[5];\n    u8 handshake_data;\n    u8 padding;\n    u16 handshake_timeout;\n    u8 probe_count;\n    u8 client_data[MULTIBOOT_NCHILD];\n    u8 palette_data;\n    u8 response_bit;\n    u8 client_bit;\n    u8 reserved1;\n    const u8 *boot_srcp;\n    const u8 *boot_endp;\n    const u8 *masterp;\n    u8 *reserved2[MULTIBOOT_NCHILD];\n    u32 system_work2[4];\n    u8 sendflag;\n    u8 probe_target_bit;\n    u8 check_wait;\n    u8 server_type;\n};\n\n#define MULTIBOOT_ERROR_04                0x04\n#define MULTIBOOT_ERROR_08                0x08\n#define MULTIBOOT_ERROR_0c                0x0c\n#define MULTIBOOT_ERROR_40                0x40\n#define MULTIBOOT_ERROR_44                0x44\n#define MULTIBOOT_ERROR_48                0x48\n#define MULTIBOOT_ERROR_4c                0x4c\n#define MULTIBOOT_ERROR_80                0x80\n#define MULTIBOOT_ERROR_84                0x84\n#define MULTIBOOT_ERROR_88                0x88\n#define MULTIBOOT_ERROR_8c                0x8c\n#define MULTIBOOT_ERROR_NO_PROBE_TARGET   0x50\n#define MULTIBOOT_ERROR_NO_DLREADY        0x60\n#define MULTIBOOT_ERROR_BOOT_FAILURE      0x70\n#define MULTIBOOT_ERROR_HANDSHAKE_FAILURE 0x71\n\n#define MULTIBOOT_CONNECTION_CHECK_WAIT 15\n\n#define MULTIBOOT_SERVER_TYPE_NORMAL 0\n#define MULTIBOOT_SERVER_TYPE_QUICK  1\n\n#define MULTIBOOT_HANDSHAKE_TIMEOUT 400\n\n#endif // GUARD_GBA_MULTIBOOT_H\n"
  },
  {
    "path": "include/gba/syscall.h",
    "content": "#ifndef GUARD_GBA_SYSCALL_H\n#define GUARD_GBA_SYSCALL_H\n\n#define RESET_EWRAM      0x01\n#define RESET_IWRAM      0x02\n#define RESET_PALETTE    0x04\n#define RESET_VRAM       0x08\n#define RESET_OAM        0x10\n#define RESET_SIO_REGS   0x20\n#define RESET_SOUND_REGS 0x40\n#define RESET_REGS       0x80\n#define RESET_ALL        0xFF\n\nvoid SoftReset(u32 resetFlags);\n\nvoid RegisterRamReset(u32 resetFlags);\n\nvoid VBlankIntrWait(void);\n\nu16 Sqrt(u32 num);\n\nu16 ArcTan2(s16 x, s16 y);\n\n#define CPU_SET_SRC_FIXED 0x01000000\n#define CPU_SET_16BIT     0x00000000\n#define CPU_SET_32BIT     0x04000000\n\nvoid CpuSet(const void *src, void *dest, u32 control);\n\n#define CPU_FAST_SET_SRC_FIXED 0x01000000\n\nvoid CpuFastSet(const void *src, void *dest, u32 control);\n\nvoid BgAffineSet(struct BgAffineSrcData *src, struct BgAffineDstData *dest, s32 count);\n\nvoid ObjAffineSet(struct ObjAffineSrcData *src, void *dest, s32 count, s32 offset);\n\nvoid LZ77UnCompWram(const void *src, void *dest);\n\nvoid LZ77UnCompVram(const void *src, void *dest);\n\nvoid RLUnCompWram(const void *src, void *dest);\n\nvoid RLUnCompVram(const void *src, void *dest);\n\nint MultiBoot(struct MultiBootParam *mp);\n\ns32 Div(s32 num, s32 denom);\n\n#endif // GUARD_GBA_SYSCALL_H\n"
  },
  {
    "path": "include/gba/types.h",
    "content": "#ifndef GUARD_GBA_TYPES_H\n#define GUARD_GBA_TYPES_H\n\n#include <stdint.h>\n\ntypedef uint8_t   u8;\ntypedef uint16_t u16;\ntypedef uint32_t u32;\ntypedef uint64_t u64;\ntypedef int8_t    s8;\ntypedef int16_t  s16;\ntypedef int32_t  s32;\ntypedef int64_t  s64;\n\ntypedef volatile u8   vu8;\ntypedef volatile u16 vu16;\ntypedef volatile u32 vu32;\ntypedef volatile u64 vu64;\ntypedef volatile s8   vs8;\ntypedef volatile s16 vs16;\ntypedef volatile s32 vs32;\ntypedef volatile s64 vs64;\n\ntypedef float  f32;\ntypedef double f64;\n\ntypedef u8  bool8;\ntypedef u16 bool16;\ntypedef u32 bool32;\ntypedef vu8  vbool8;\ntypedef vu16 vbool16;\ntypedef vu32 vbool32;\n\nstruct BgCnt\n{\n    u16 priority:2;\n    u16 charBaseBlock:2;\n    u16 dummy:2;\n    u16 mosaic:1;\n    u16 palettes:1;\n    u16 screenBaseBlock:5;\n    u16 areaOverflowMode:1;\n    u16 screenSize:2;\n};\ntypedef volatile struct BgCnt vBgCnt;\n\nstruct PlttData\n{\n    u16 r:5; // red\n    u16 g:5; // green\n    u16 b:5; // blue\n    u16 unused_15:1;\n};\n\nstruct OamData\n{\n    /*0x00*/ u32 y:8;\n    /*0x01*/ u32 affineMode:2;  // 0x1, 0x2 -> 0x4\n             u32 objMode:2;     // 0x4, 0x8 -> 0xC\n             u32 mosaic:1;      // 0x10\n             u32 bpp:1;         // 0x20\n             u32 shape:2;       // 0x40, 0x80 -> 0xC0\n\n    /*0x02*/ u32 x:9;\n             u32 matrixNum:5;   // bits 3/4 are h-flip/v-flip if not in affine mode\n             u32 size:2;        // 0x4000, 0x8000 -> 0xC000\n\n    /*0x04*/ u16 tileNum:10;    // 0x3FF\n             u16 priority:2;    // 0x400, 0x800 -> 0xC00\n             u16 paletteNum:4;\n    /*0x06*/ u16 affineParam;\n};\n\n#define ST_OAM_HFLIP     0x08\n#define ST_OAM_VFLIP     0x10\n#define ST_OAM_MNUM_FLIP_MASK 0x18\n\n#define ST_OAM_OBJ_NORMAL 0\n#define ST_OAM_OBJ_BLEND  1\n#define ST_OAM_OBJ_WINDOW 2\n\n#define ST_OAM_AFFINE_OFF    0\n#define ST_OAM_AFFINE_NORMAL 1\n#define ST_OAM_AFFINE_ERASE  2\n#define ST_OAM_AFFINE_DOUBLE 3\n\n#define ST_OAM_AFFINE_ON_MASK     1\n#define ST_OAM_AFFINE_DOUBLE_MASK 2\n\n#define ST_OAM_4BPP 0\n#define ST_OAM_8BPP 1\n\n#define ST_OAM_SQUARE      0\n#define ST_OAM_H_RECTANGLE 1\n#define ST_OAM_V_RECTANGLE 2\n\n#define ST_OAM_SIZE_0   0\n#define ST_OAM_SIZE_1   1\n#define ST_OAM_SIZE_2   2\n#define ST_OAM_SIZE_3   3\n\n#define SPRITE_SIZE_8x8     ((ST_OAM_SIZE_0 << 2) | (ST_OAM_SQUARE))\n#define SPRITE_SIZE_16x16   ((ST_OAM_SIZE_1 << 2) | (ST_OAM_SQUARE))\n#define SPRITE_SIZE_32x32   ((ST_OAM_SIZE_2 << 2) | (ST_OAM_SQUARE))\n#define SPRITE_SIZE_64x64   ((ST_OAM_SIZE_3 << 2) | (ST_OAM_SQUARE))\n\n#define SPRITE_SIZE_16x8    ((ST_OAM_SIZE_0 << 2) | (ST_OAM_H_RECTANGLE))\n#define SPRITE_SIZE_32x8    ((ST_OAM_SIZE_1 << 2) | (ST_OAM_H_RECTANGLE))\n#define SPRITE_SIZE_32x16   ((ST_OAM_SIZE_2 << 2) | (ST_OAM_H_RECTANGLE))\n#define SPRITE_SIZE_64x32   ((ST_OAM_SIZE_3 << 2) | (ST_OAM_H_RECTANGLE))\n\n#define SPRITE_SIZE_8x16    ((ST_OAM_SIZE_0 << 2) | (ST_OAM_V_RECTANGLE))\n#define SPRITE_SIZE_8x32    ((ST_OAM_SIZE_1 << 2) | (ST_OAM_V_RECTANGLE))\n#define SPRITE_SIZE_16x32   ((ST_OAM_SIZE_2 << 2) | (ST_OAM_V_RECTANGLE))\n#define SPRITE_SIZE_32x64   ((ST_OAM_SIZE_3 << 2) | (ST_OAM_V_RECTANGLE))\n\n#define SPRITE_SIZE(dim)  ((SPRITE_SIZE_##dim >> 2) & 0x03)\n#define SPRITE_SHAPE(dim) (SPRITE_SIZE_##dim & 0x03)\n\nstruct BgAffineSrcData\n{\n    s32 texX;\n    s32 texY;\n    s16 scrX;\n    s16 scrY;\n    s16 sx;\n    s16 sy;\n    u16 alpha;\n};\n\nstruct BgAffineDstData\n{\n    s16 pa;\n    s16 pb;\n    s16 pc;\n    s16 pd;\n    s32 dx;\n    s32 dy;\n};\n\nstruct ObjAffineSrcData\n{\n    s16 xScale;\n    s16 yScale;\n    u16 rotation;\n};\n\n// Multi-player SIO Control Structure\nstruct SioMultiCnt\n{\n    u16 baudRate:2;    // baud rate\n    u16 si:1;          // SI terminal\n    u16 sd:1;          // SD terminal\n    u16 id:2;          // ID\n    u16 error:1;       // error flag\n    u16 enable:1;      // SIO enable\n    u16 unused_11_8:4;\n    u16 mode:2;        // communication mode (should equal 2)\n    u16 intrEnable:1;  // IRQ enable\n    u16 unused_15:1;\n    u16 data;          // data\n};\n\n#define ST_SIO_MULTI_MODE 2 // Multi-player communication mode\n\n// baud rate\n#define ST_SIO_9600_BPS   0 //   9600 bps\n#define ST_SIO_38400_BPS  1 //  38400 bps\n#define ST_SIO_57600_BPS  2 //  57600 bps\n#define ST_SIO_115200_BPS 3 // 115200 bps\n\n#endif // GUARD_GBA_TYPES_H\n"
  },
  {
    "path": "include/gflib.h",
    "content": "#ifndef GUARD_GFLIB_H\n#define GUARD_GFLIB_H\n\n#include \"global.h\"\n\n#include \"bg.h\"\n#include \"palette.h\"\n#include \"gpu_regs.h\"\n#include \"dma3.h\"\n#include \"malloc.h\"\n#include \"sound.h\"\n#include \"text.h\"\n#include \"sprite.h\"\n#include \"window.h\"\n#include \"blit.h\"\n#include \"string_util.h\"\n\n#endif //GUARD_GFLIB_H\n"
  },
  {
    "path": "include/global.berry.h",
    "content": "#ifndef GUARD_GLOBAL_BERRY_H\n#define GUARD_GLOBAL_BERRY_H\n\n#define BERRY_NAME_LENGTH 6\n#define BERRY_NAME_COUNT 7\n#define BERRY_ITEM_EFFECT_COUNT 18\n\nstruct Berry\n{\n    const u8 name[BERRY_NAME_COUNT];\n    u8 firmness;\n    u16 size;\n    u8 maxYield;\n    u8 minYield;\n    const u8 *description1;\n    const u8 *description2;\n    u8 stageDuration;\n    u8 spicy;\n    u8 dry;\n    u8 sweet;\n    u8 bitter;\n    u8 sour;\n    u8 smoothness;\n};\n\n// with no const fields\n\nstruct Berry2\n{\n    u8 name[BERRY_NAME_COUNT];\n    u8 firmness;\n    u16 size;\n    u8 maxYield;\n    u8 minYield;\n    u8 *description1;\n    u8 *description2;\n    u8 stageDuration;\n    u8 spicy;\n    u8 dry;\n    u8 sweet;\n    u8 bitter;\n    u8 sour;\n    u8 smoothness;\n};\n\nstruct EnigmaBerry\n{\n    struct Berry2 berry;\n    u8 itemEffect[BERRY_ITEM_EFFECT_COUNT];\n    u8 holdEffect;\n    u8 holdEffectParam;\n    u32 checksum;\n};\n\nstruct BattleEnigmaBerry\n{\n    /*0x00*/ u8 name[BERRY_NAME_COUNT];\n    /*0x07*/ u8 holdEffect;\n    /*0x08*/ u8 itemEffect[BERRY_ITEM_EFFECT_COUNT];\n    /*0x1A*/ u8 holdEffectParam;\n};\n\nstruct BerryTree\n{\n    u8 berry;\n    u8 stage:7;\n    u8 growthSparkle:1;\n    u16 minutesUntilNextStage;\n    u8 berryYield;\n    u8 regrowthCount:4;\n    u8 watered1:1;\n    u8 watered2:1;\n    u8 watered3:1;\n    u8 watered4:1;\n};\n\n#endif // GUARD_GLOBAL_BERRY_H\n"
  },
  {
    "path": "include/global.fieldmap.h",
    "content": "#ifndef GUARD_GLOBAL_FIELDMAP_H\n#define GUARD_GLOBAL_FIELDMAP_H\n\n// Masks/shifts for blocks in the map grid\n// Map grid blocks consist of a 10 bit metatile id, a 2 bit collision value, and a 4 bit elevation value\n// This is the data stored in each data/layouts/*/map.bin file\n#define MAPGRID_METATILE_ID_MASK 0x03FF // Bits 0-9\n#define MAPGRID_COLLISION_MASK   0x0C00 // Bits 10-11\n#define MAPGRID_ELEVATION_MASK   0xF000 // Bits 12-15\n#define MAPGRID_COLLISION_SHIFT  10\n#define MAPGRID_ELEVATION_SHIFT  12\n\n// An undefined map grid block has all metatile id bits set and nothing else\n#define MAPGRID_UNDEFINED   MAPGRID_METATILE_ID_MASK\n\nenum {\n    METATILE_LAYER_TYPE_NORMAL,  // Metatile uses middle and top bg layers\n    METATILE_LAYER_TYPE_COVERED, // Metatile uses bottom and middle bg layers\n    METATILE_LAYER_TYPE_SPLIT,   // Metatile uses bottom and top bg layers\n};\n\n#define METATILE_ID(tileset, name) (METATILE_##tileset##_##name)\n\nenum\n{\n    METATILE_ATTRIBUTE_BEHAVIOR,\n    METATILE_ATTRIBUTE_TERRAIN,\n    METATILE_ATTRIBUTE_2,\n    METATILE_ATTRIBUTE_3,\n    METATILE_ATTRIBUTE_ENCOUNTER_TYPE,\n    METATILE_ATTRIBUTE_5,\n    METATILE_ATTRIBUTE_LAYER_TYPE,\n    METATILE_ATTRIBUTE_7,\n    METATILE_ATTRIBUTE_COUNT,\n    METATILE_ATTRIBUTES_ALL = 255  // Special id to get the full attributes value\n};\n\nenum\n{\n    TILE_ENCOUNTER_NONE,\n    TILE_ENCOUNTER_LAND,\n    TILE_ENCOUNTER_WATER,\n};\n\nenum\n{\n    TILE_TERRAIN_NORMAL,\n    TILE_TERRAIN_GRASS,\n    TILE_TERRAIN_WATER,\n    TILE_TERRAIN_WATERFALL,\n};\n\n// Identifiers for the hidden item data stored in BgEvent's u32 hiddenItem\nenum\n{\n    HIDDEN_ITEM_ITEM,\n    HIDDEN_ITEM_FLAG,\n    HIDDEN_ITEM_QUANTITY,\n    HIDDEN_ITEM_UNDERFOOT\n};\n\n// Masks/shifts to read the data above from the u32 hiddenItem, calculated from size.\n#define HIDDEN_ITEM_ITEM_BITS      16\n#define HIDDEN_ITEM_FLAG_BITS       8\n#define HIDDEN_ITEM_QUANTITY_BITS   7\n#define HIDDEN_ITEM_UNDERFOOT_BITS  1\n\n#define HIDDEN_ITEM_ITEM_SHIFT      0\n#define HIDDEN_ITEM_FLAG_SHIFT      (HIDDEN_ITEM_ITEM_SHIFT + HIDDEN_ITEM_ITEM_BITS)\n#define HIDDEN_ITEM_QUANTITY_SHIFT  (HIDDEN_ITEM_FLAG_SHIFT + HIDDEN_ITEM_FLAG_BITS)\n#define HIDDEN_ITEM_UNDERFOOT_SHIFT (HIDDEN_ITEM_QUANTITY_SHIFT + HIDDEN_ITEM_QUANTITY_BITS)\n\n#define GET_HIDDEN_ITEM_ITEM(raw)     (((raw) >> HIDDEN_ITEM_ITEM_SHIFT)      & ((1 << HIDDEN_ITEM_ITEM_BITS) - 1))\n#define GET_HIDDEN_ITEM_FLAG(raw)     (((raw) >> HIDDEN_ITEM_FLAG_SHIFT)      & ((1 << HIDDEN_ITEM_FLAG_BITS) - 1))\n#define GET_HIDDEN_ITEM_QUANTITY(raw) (((raw) >> HIDDEN_ITEM_QUANTITY_SHIFT)  & ((1 << HIDDEN_ITEM_QUANTITY_BITS) - 1))\n#define GET_HIDDEN_ITEM_UNDERFOOT(raw)(((raw) >> HIDDEN_ITEM_UNDERFOOT_SHIFT) & ((1 << HIDDEN_ITEM_UNDERFOOT_BITS) - 1))\n\ntypedef void (*TilesetCB)(void);\n\nstruct Tileset\n{\n    /*0x00*/ bool8 isCompressed;\n    /*0x01*/ bool8 isSecondary;\n    /*0x04*/ const u32 *tiles;\n    /*0x08*/ const u16 (*palettes)[16];\n    /*0x0c*/ const u16 *metatiles;\n    /*0x10*/ TilesetCB callback;\n    /*0x14*/ const u32 *metatileAttributes;\n};\n\nstruct MapLayout\n{\n    /*0x00*/ s32 width;\n    /*0x04*/ s32 height;\n    /*0x08*/ const u16 *border;\n    /*0x0c*/ const u16 *map;\n    /*0x10*/ const struct Tileset *primaryTileset;\n    /*0x14*/ const struct Tileset *secondaryTileset;\n    /*0x18*/ u8 borderWidth;\n    /*0x19*/ u8 borderHeight;\n};\n\nstruct BackupMapLayout\n{\n    s32 Xsize;\n    s32 Ysize;\n    u16 *map;\n};\n\nstruct ObjectEventTemplate\n{\n    u8 localId;\n    u8 graphicsId;\n    u8 kind; // The \"kind\" field determines how to access objUnion union below.\n    s16 x, y;\n    union {\n        struct {\n            u8 elevation;\n            u8 movementType;\n            u16 movementRangeX:4;\n            u16 movementRangeY:4;\n            u16 trainerType;\n            u16 trainerRange_berryTreeId;\n        } normal;\n        struct {\n            u8 targetLocalId;\n            u8 padding[3];\n            u16 targetMapNum;\n            u16 targetMapGroup;\n        } clone;\n    } objUnion;\n    const u8 *script;\n    u16 flagId;\n};  /*size = 0x18*/\n\nstruct WarpEvent\n{\n    s16 x, y;\n    u8 elevation;\n    u8 warpId;\n    u8 mapNum;\n    u8 mapGroup;\n};\n\nstruct CoordEvent\n{\n    u16 x, y;\n    u8 elevation;\n    u16 trigger;\n    u16 index;\n    const u8 *script;\n};\n\nstruct BgEvent\n{\n    u16 x, y;\n    u8 elevation;\n    u8 kind; // The \"kind\" field determines how to access bgUnion union below.\n    union {\n        const u8 *script;\n        u32 hiddenItem; // Contains all the hidden item data. See GET_HIDDEN_ITEM_* defines further up\n    } bgUnion;\n};\n\nstruct MapEvents\n{\n    u8 objectEventCount;\n    u8 warpCount;\n    u8 coordEventCount;\n    u8 bgEventCount;\n    const struct ObjectEventTemplate *objectEvents;\n    const struct WarpEvent *warps;\n    const struct CoordEvent *coordEvents;\n    const struct BgEvent *bgEvents;\n};\n\nstruct MapConnection\n{\n /*0x00*/ u8 direction;\n /*0x04*/ u32 offset;\n /*0x08*/ u8 mapGroup;\n /*0x09*/ u8 mapNum;\n};\n\nstruct MapConnections\n{\n    s32 count;\n    const struct MapConnection *connections;\n};\n\nstruct MapHeader\n{\n    /* 0x00 */ const struct MapLayout *mapLayout;\n    /* 0x04 */ const struct MapEvents *events;\n    /* 0x08 */ const u8 *mapScripts;\n    /* 0x0C */ const struct MapConnections *connections;\n    /* 0x10 */ u16 music;\n    /* 0x12 */ u16 mapLayoutId;\n    /* 0x14 */ u8 regionMapSectionId;\n    /* 0x15 */ u8 cave;\n    /* 0x16 */ u8 weather;\n    /* 0x17 */ u8 mapType;\n               // fields correspond to the arguments in the map_header_flags macro\n    /* 0x18 */ bool8 bikingAllowed;\n    /* 0x19 */ bool8 allowEscaping:1; // Escape Rope and Dig\n               bool8 allowRunning:1;\n               bool8 showMapName:6; // the last 5 bits are unused\n    /* 0x1A */ s8 floorNum;\n    /* 0x1B */ u8 battleType;\n    /* 0x1C */ u8 levelScaling;\n};\n\nstruct ObjectEvent\n{\n    /*0x00*/ /* 0*/ u32 active:1;\n             /* 1*/ u32 singleMovementActive:1;\n             /* 2*/ u32 triggerGroundEffectsOnMove:1;\n             /* 3*/ u32 triggerGroundEffectsOnStop:1;\n             /* 4*/ u32 disableCoveringGroundEffects:1;\n             /* 5*/ u32 landingJump:1;\n             /* 6*/ u32 heldMovementActive:1;\n             /* 7*/ u32 heldMovementFinished:1;\n    /*0x01*/ /* 8*/ u32 frozen:1;\n             /* 9*/ u32 facingDirectionLocked:1;\n             /*10*/ u32 disableAnim:1;\n             /*11*/ u32 enableAnim:1;\n             /*12*/ u32 inanimate:1;\n             /*13*/ u32 invisible:1;\n             /*14*/ u32 offScreen:1;\n             /*15*/ u32 trackedByCamera:1;\n    /*0x02*/ /*16*/ u32 isPlayer:1;\n             /*17*/ u32 hasReflection:1;\n             /*18*/ u32 inShortGrass:1;\n             /*19*/ u32 inShallowFlowingWater:1;\n             /*20*/ u32 inSandPile:1;\n             /*21*/ u32 inHotSprings:1;\n             /*22*/ u32 hasShadow:1;\n             /*23*/ u32 spriteAnimPausedBackup:1;\n    /*0x03*/ /*24*/ u32 spriteAffineAnimPausedBackup:1;\n             /*25*/ u32 disableJumpLandingGroundEffect:1;\n             /*26*/ u32 fixedPriority:1;\n             /*27*/ u32 hideReflection:1;\n    /*0x04*/        u8 spriteId;\n    /*0x05*/        u8 graphicsId;\n    /*0x06*/        u8 movementType;\n    /*0x07*/        u8 trainerType;\n    /*0x08*/        u8 localId;\n    /*0x09*/        u8 mapNum;\n    /*0x0A*/        u8 mapGroup;\n    /*0x0B*/        u8 currentElevation:4;\n                    u8 previousElevation:4;\n    /*0x0C*/        struct Coords16 initialCoords;\n    /*0x10*/        struct Coords16 currentCoords;\n    /*0x14*/        struct Coords16 previousCoords;\n    /*0x18*/        u8 facingDirection:4;\n                    u8 movementDirection:4;\n                    u16 rangeX:4;\n                    u16 rangeY:4;\n    /*0x1A*/        u8 fieldEffectSpriteId;\n    /*0x1B*/        u8 warpArrowSpriteId;\n    /*0x1C*/        u8 movementActionId;\n    /*0x1D*/        u8 trainerRange_berryTreeId;\n    /*0x1E*/        u8 currentMetatileBehavior;\n    /*0x1F*/        u8 previousMetatileBehavior;\n    /*0x20*/        u8 previousMovementDirection;\n    /*0x21*/        u8 directionSequenceIndex;\n    /*0x22*/        u8 playerCopyableMovement;\n    /*size = 0x24*/\n};\n\nstruct ObjectEventGraphicsInfo\n{\n    /*0x00*/ u16 tileTag;\n    /*0x02*/ u16 paletteTag;\n    /*0x04*/ u16 reflectionPaletteTag;\n    /*0x06*/ u16 size;\n    /*0x08*/ s16 width;\n    /*0x0A*/ s16 height;\n    /*0x0C*/ u8 paletteSlot:4;\n             u8 shadowSize:2;\n             u8 inanimate:1;\n             u8 disableReflectionPaletteLoad:1;\n    /*0x0D*/ u8 tracks;\n    /*0x10*/ const struct OamData *oam;\n    /*0x14*/ const struct SubspriteTable *subspriteTables;\n    /*0x18*/ const union AnimCmd *const *anims;\n    /*0x1C*/ const struct SpriteFrameImage *images;\n    /*0x20*/ const union AffineAnimCmd *const *affineAnims;\n};\n\nenum {\n    PLAYER_AVATAR_STATE_NORMAL,\n    PLAYER_AVATAR_STATE_MACH_BIKE,\n    PLAYER_AVATAR_STATE_ACRO_BIKE,\n    PLAYER_AVATAR_STATE_SURFING,\n    PLAYER_AVATAR_STATE_UNDERWATER,\n    PLAYER_AVATAR_STATE_CONTROLLABLE,\n    PLAYER_AVATAR_STATE_FORCED,\n    PLAYER_AVATAR_STATE_DASH,\n};\n#define PLAYER_AVATAR_STATE_VS_SEEKER       PLAYER_AVATAR_STATE_WATERING        //not a real state. This is defined to make sPlayerAvatarGfxIds consistent\n\n\n#define PLAYER_AVATAR_FLAG_ON_FOOT      (1 << PLAYER_AVATAR_STATE_NORMAL)\n#define PLAYER_AVATAR_FLAG_MACH_BIKE    (1 << PLAYER_AVATAR_STATE_MACH_BIKE)\n#define PLAYER_AVATAR_FLAG_ACRO_BIKE    (1 << PLAYER_AVATAR_STATE_ACRO_BIKE)\n#define PLAYER_AVATAR_FLAG_SURFING      (1 << PLAYER_AVATAR_STATE_SURFING)\n#define PLAYER_AVATAR_FLAG_UNDERWATER   (1 << PLAYER_AVATAR_STATE_UNDERWATER)\n#define PLAYER_AVATAR_FLAG_CONTROLLABLE (1 << PLAYER_AVATAR_STATE_CONTROLLABLE)\n#define PLAYER_AVATAR_FLAG_FORCED       (1 << PLAYER_AVATAR_STATE_FORCED)\n#define PLAYER_AVATAR_FLAG_DASH         (1 << PLAYER_AVATAR_STATE_DASH)\n\nenum {\n    PLAYER_AVATAR_GFX_NORMAL,\n    PLAYER_AVATAR_GFX_BIKE,\n    PLAYER_AVATAR_GFX_RIDE,\n    PLAYER_AVATAR_GFX_FIELD_MOVE,\n    PLAYER_AVATAR_GFX_FISH,\n    PLAYER_AVATAR_GFX_VSSEEKER,\n    PLAYER_AVATAR_GFX_UNDERWATER,\n};\n\nenum\n{\n    ACRO_BIKE_NORMAL,\n    ACRO_BIKE_TURNING,\n    ACRO_BIKE_WHEELIE_STANDING,\n    ACRO_BIKE_BUNNY_HOP,\n    ACRO_BIKE_WHEELIE_MOVING,\n    ACRO_BIKE_STATE5,\n    ACRO_BIKE_STATE6,\n};\n\nenum\n{\n    COLLISION_NONE,\n    COLLISION_OUTSIDE_RANGE,\n    COLLISION_IMPASSABLE,\n    COLLISION_ELEVATION_MISMATCH,\n    COLLISION_OBJECT_EVENT,\n    COLLISION_STOP_SURFING,\n    COLLISION_LEDGE_JUMP,\n    COLLISION_PUSHED_BOULDER,\n    COLLISION_DIRECTIONAL_STAIR_WARP,\n    COLLISION_WHEELIE_HOP,\n    COLLISION_ISOLATED_VERTICAL_RAIL,\n    COLLISION_ISOLATED_HORIZONTAL_RAIL,\n    COLLISION_VERTICAL_RAIL,\n    COLLISION_HORIZONTAL_RAIL,\n    COLLISION_COUNT\n};\n\n// player running states\nenum\n{\n    NOT_MOVING,\n    TURN_DIRECTION, // not the same as turning! turns your avatar without moving. also known as a turn frame in some circles\n    MOVING,\n};\n\n// player tile transition states\nenum\n{\n    T_NOT_MOVING,\n    T_TILE_TRANSITION,\n    T_TILE_CENTER, // player is on a frame in which they are centered on a tile during which the player either stops or keeps their momentum and keeps going, changing direction if necessary.\n};\n\nstruct PlayerAvatar\n{\n    /*0x00*/ u8 flags;\n    /*0x01*/ u8 transitionFlags; // used to be bike, but it's not that in Emerald and probably isn't here either. maybe transition flags?\n    /*0x02*/ u8 runningState; // this is a static running state. 00 is not moving, 01 is turn direction, 02 is moving.\n    /*0x03*/ u8 tileTransitionState; // this is a transition running state: 00 is not moving, 01 is transition between tiles, 02 means you are on the frame in which you have centered on a tile but are about to keep moving, even if changing directions. 2 is also used for a ledge hop, since you are transitioning.\n    /*0x04*/ u8 spriteId;\n    /*0x05*/ u8 objectEventId;\n    /*0x06*/ bool8 preventStep;\n    /*0x07*/ u8 gender;\n    // These are not used in FRLG\n    u8 acroBikeState;\n    u8 newDirBackup;\n    u8 bikeFrameCounter;\n    u8 bikeSpeed;\n    u32 directionHistory;\n    u32 abStartSelectHistory;\n    u8 dirTimerHistory[8];\n    // For the Rocket mazes\n    u16 lastSpinTile;\n};\n\nstruct Camera\n{\n    bool8 active:1;\n    s32 x;\n    s32 y;\n};\n\nextern struct ObjectEvent gObjectEvents[OBJECT_EVENTS_COUNT];\nextern u8 gSelectedObjectEvent;\nextern struct MapHeader gMapHeader;\nextern struct PlayerAvatar gPlayerAvatar;\nextern struct Camera gCamera;\n\n#endif // GUARD_GLOBAL_FIELDMAP_H\n"
  },
  {
    "path": "include/global.h",
    "content": "#ifndef GUARD_GLOBAL_H\n#define GUARD_GLOBAL_H\n\n#include \"config.h\"\n#include \"gba/gba.h\"\n#include <string.h>\n#include \"constants/global.h\"\n#include \"constants/flags.h\"\n#include \"constants/vars.h\"\n#include \"constants/species.h\"\n#include \"constants/pokedex.h\"\n#include \"constants/easy_chat.h\"\n#include \"constants/rgb.h\"\n\n// Prevent cross-jump optimization.\n#define BLOCK_CROSS_JUMP asm(\"\");\n\n// to help in decompiling\n#define asm_comment(x) asm volatile(\"@ -- \" x \" -- \")\n#define asm_unified(x) asm(\".syntax unified\\n\" x \"\\n.syntax divided\")\n\n// IDE support\n#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__INTELLISENSE__)\n// We define these when using certain IDEs to fool preproc\n#define _(x)        (x)\n#define __(x)       (x)\n#define INCBIN(...) {0}\n#define INCBIN_U8   INCBIN\n#define INCBIN_U16  INCBIN\n#define INCBIN_U32  INCBIN\n#define INCBIN_S8   INCBIN\n#define INCBIN_S16  INCBIN\n#define INCBIN_S32  INCBIN\n#endif // IDE support\n\n#define ARRAY_COUNT(array) (sizeof(array) / sizeof((array)[0]))\n\n// Alias of ARRAY_COUNT using GameFreak's name from AgbAssert calls.\n#define NELEMS(array) ARRAY_COUNT(array)\n\n#define SWAP(a, b, temp)    \\\n{                           \\\n    temp = a;               \\\n    a = b;                  \\\n    b = temp;               \\\n}\n\n// useful math macros\n\n// Converts a number to Q8.8 fixed-point format\n#define Q_8_8(n) ((s16)((n) * 256))\n\n// Converts a number from Q8.8 fixed-point format\n#define Q_8_8_TO_INT(n) ((s16)((n) >> 8))\n\n// Converts a number to Q4.12 fixed-point format\n#define Q_4_12(n)  ((s16)((n) * 4096))\n\n// Converts a number from Q4.12 fixed-point format\n#define Q_4_12_TO_INT(n) ((s16)((n) >> 12))\n\n// Converts a number to QN.S fixed-point format (16-bits)\n#define Q_N_S(s, n) ((s16)((n) * (1 << (s))))\n\n// converts a number from QN.S fixed-point format (16-bits)\n#define Q_N_S_TO_INT(s, n) ((s16)((n) >> (s)))\n\n// Converts a number to Q24.8 fixed-point format\n#define Q_24_8(n) ((s32)((n) << 8))\n\n// Converts a number from Q24.8 fixed-point format\n#define Q_24_8_TO_INT(n) ((s32)((n) >> 8))\n\n#define min(a, b) ((a) < (b) ? (a) : (b))\n#define max(a, b) ((a) >= (b) ? (a) : (b))\n\n#if MODERN\n#define abs(x) (((x) < 0) ? -(x) : (x))\n#endif\n\n// Used in cases where division by 0 can occur in the retail version.\n// Avoids invalid opcodes on some emulators, and the otherwise UB.\n#ifdef UBFIX\n#define SAFE_DIV(a, b) ((b) ? (a) / (b) : 0)\n#else\n#define SAFE_DIV(a, b) ((a) / (b))\n#endif\n\n// Extracts the upper 16 bits of a 32-bit number\n#define HIHALF(n) (((n) & 0xFFFF0000) >> 16)\n\n// Extracts the lower 16 bits of a 32-bit number\n#define LOHALF(n) ((n) & 0xFFFF)\n\n// There are many quirks in the source code which have overarching behavioral differences from\n// a number of other files. For example, diploma.c seems to declare rodata before each use while\n// other files declare out of order and must be at the beginning. There are also a number of\n// macros which differ from one file to the next due to the method of obtaining the result, such\n// as these below. Because of this, there is a theory (Two Team Theory) that states that these\n// programming projects had more than 1 \"programming team\" which utilized different macros for\n// each of the files that were worked on.\n#define T1_READ_8(ptr)  ((ptr)[0])\n#define T1_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8))\n#define T1_READ_32(ptr) ((ptr)[0] | ((ptr)[1] << 8) | ((ptr)[2] << 16) | ((ptr)[3] << 24))\n#define T1_READ_PTR(ptr) (u8 *) T1_READ_32(ptr)\n\n// T2_READ_8 is a duplicate to remain consistent with each group.\n#define T2_READ_8(ptr)  ((ptr)[0])\n#define T2_READ_16(ptr) ((ptr)[0] + ((ptr)[1] << 8))\n#define T2_READ_32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24))\n#define T2_READ_PTR(ptr) (void *) T2_READ_32(ptr)\n\n// This macro is required to prevent the compiler from optimizing\n// a dpad up/down check in sub_812CAD8 (fame_checker.c).\n#define TEST_BUTTON(field, button) ({(field) & (button);})\n#define JOY_NEW(button)      TEST_BUTTON(gMain.newKeys,  button)\n#define JOY_HELD(button)     TEST_BUTTON(gMain.heldKeys, button)\n#define JOY_HELD_RAW(button) TEST_BUTTON(gMain.heldKeysRaw, button)\n#define JOY_REPT(button)     TEST_BUTTON(gMain.newAndRepeatedKeys, button)\n\n#define S16TOPOSFLOAT(val)   \\\n({                           \\\n    s16 v = (val);           \\\n    float f = (float)v;      \\\n    if(v < 0) f += 65536.0f; \\\n    f;                       \\\n})\n\nextern u8 gStringVar1[];\nextern u8 gStringVar2[];\nextern u8 gStringVar3[];\nextern u8 gStringVar4[];\n\n#define DIV_ROUND_UP(val, roundBy)(((val) / (roundBy)) + (((val) % (roundBy)) ? 1 : 0))\n\n#define ROUND_BITS_TO_BYTES(numBits) DIV_ROUND_UP(numBits, 8)\n\n#define DEX_FLAGS_NO ROUND_BITS_TO_BYTES(NUM_SPECIES)\n#define NUM_FLAG_BYTES ROUND_BITS_TO_BYTES(FLAGS_COUNT)\n#define NUM_ADDITIONAL_PHRASE_BYTES ROUND_BITS_TO_BYTES(NUM_ADDITIONAL_PHRASES)\n\n// This produces an error at compile-time if expr is zero.\n// It looks like file.c:line: size of array `id' is negative\n#define STATIC_ASSERT(expr, id) typedef char id[(expr) ? 1 : -1];\n\nstruct Coords8\n{\n    s8 x;\n    s8 y;\n};\n\nstruct UCoords8\n{\n    u8 x;\n    u8 y;\n};\n\nstruct Coords16\n{\n    s16 x;\n    s16 y;\n};\n\nstruct UCoords16\n{\n    u16 x;\n    u16 y;\n};\n\nstruct Coords32\n{\n    s32 x;\n    s32 y;\n};\n\nstruct UCoords32\n{\n    u32 x;\n    u32 y;\n};\n\nstruct Time\n{\n    /*0x00*/ s16 days;\n    /*0x02*/ s8 hours;\n    /*0x03*/ s8 minutes;\n    /*0x04*/ s8 seconds;\n};\n\nstruct Pokedex\n{\n    /*0x00*/ u8 order;\n    /*0x01*/ u8 mode;\n    /*0x02*/ u8 unused; // set to 0xDA, never read\n    /*0x03*/ u8 nationalMagic; // set to 0xB9 when national dex is first enabled\n    /*0x04*/ u32 unownPersonality; // set when you first see Unown\n    /*0x08*/ u32 spindaPersonality; // set when you first see Spinda\n    /*0x0C*/ u32 unknown3;\n    /*0x10*/ u8 owned[DEX_FLAGS_NO];\n    /*0x44*/ u8 seen[DEX_FLAGS_NO];\n};\n\nstruct PokemonJumpRecords\n{\n    u16 jumpsInRow;\n    u16 unused1; // Set to 0, never read\n    u16 excellentsInRow;\n    u16 gamesWithMaxPlayers;\n    u32 unused2; // Set to 0, never read\n    u32 bestJumpScore;\n};\n\nstruct BerryPickingResults // possibly used in the game itself? Size may be wrong as well\n{\n    u32 bestScore;\n    u16 berriesPicked;\n    u16 berriesPickedInRow;\n    u8 field_8;\n    u8 field_9;\n    u8 field_A;\n    u8 field_B;\n    u8 field_C;\n    u8 field_D;\n    u8 field_E;\n    u8 field_F;\n};\n\nstruct BerryCrush\n{\n    u16 pressingSpeeds[4]; // For the record with each possible group size, 2-5 players\n    u32 berryPowderAmount;\n    u32 unk;\n};\n\n#define LINK_B_RECORDS_COUNT 5\n\nstruct LinkBattleRecord\n{\n    u8 name[PLAYER_NAME_LENGTH + 1];\n    u16 trainerId;\n    u16 wins;\n    u16 losses;\n    u16 draws;\n};\n\nstruct LinkBattleRecords\n{\n    struct LinkBattleRecord entries[LINK_B_RECORDS_COUNT];\n    u8 languages[LINK_B_RECORDS_COUNT];\n};\n\nstruct RecordMixingGiftData\n{\n    u8 unk0;\n    u8 quantity;\n    u16 itemId;\n    u8 filler4[8];\n};\n\nstruct RecordMixingGift\n{\n    int checksum;\n    struct RecordMixingGiftData data;\n};\n\n#include \"constants/game_stat.h\"\n#include \"global.fieldmap.h\"\n#include \"global.berry.h\"\n#include \"pokemon.h\"\n\nstruct BattleTowerRecord // record mixing\n{\n    /*0x00*/ u8 battleTowerLevelType; // 0 = level 50, 1 = level 100\n    /*0x01*/ u8 trainerClass;\n    /*0x02*/ u16 winStreak;\n    /*0x04*/ u8 name[PLAYER_NAME_LENGTH + 1];\n    /*0x0C*/ u8 trainerId[TRAINER_ID_LENGTH];\n    /*0x10*/ u16 greeting[EASY_CHAT_BATTLE_WORDS_COUNT];\n    /*0x1C*/ struct BattleTowerPokemon party[3];\n    /*0xA0*/ u32 checksum;\n};\n\nstruct BattleTowerEReaderTrainer\n{\n    /*0x4A0 0x3F0 0x00*/ u8 unk0;\n    /*0x4A1 0x3F1 0x01*/ u8 trainerClass;\n    /*0x4A2 0x3F2 0x02*/ u16 winStreak;\n    /*0x4A4 0x3F4 0x04*/ u8 name[8];\n    /*0x4AC 0x3FC 0x0C*/ u8 trainerId[4];\n    /*0x4B0 0x400 0x10*/ u16 greeting[6];\n    /*0x4BC 0x40C 0x1C*/ u16 farewellPlayerLost[6];\n    /*0x4C8 0x418 0x28*/ u16 farewellPlayerWon[6];\n    /*0x4D4 0x424 0x34*/ struct BattleTowerPokemon party[3];\n    /*0x558 0x4A8 0xB8*/ u32 checksum;\n};\n\nstruct BattleTowerData // Leftover from R/S\n{\n    /*0x0000, 0x00B0*/ struct BattleTowerRecord playerRecord;\n    /*0x00A4, 0x0154*/ struct BattleTowerRecord records[5]; // from record mixing\n    /*0x03D8, 0x0488*/ u16 firstMonSpecies; // species of the first pokemon in the player's battle tower party\n    /*0x03DA, 0x048A*/ u16 defeatedBySpecies; // species of the pokemon that defated the player\n    /*0x03DC, 0x048C*/ u8 defeatedByTrainerName[8];\n    /*0x03E4, 0x0494*/ u8 firstMonNickname[POKEMON_NAME_LENGTH]; // nickname of the first pokemon in the player's battle tower party\n    /*0x03F0, 0x04A0*/ struct BattleTowerEReaderTrainer ereaderTrainer;\n    /*0x04AC, 0x055C*/ u8 battleTowerLevelType:1; // 0 = level 50; 1 = level 100\n    /*0x04AC, 0x055C*/ u8 unk_554:1;\n    /*0x04AD, 0x055D*/ u8 battleOutcome;\n    /*0x04AE, 0x055E*/ u8 var_4AE[2];\n    /*0x04B0, 0x0560*/ u16 curChallengeBattleNum[2]; // 1-based index of battle in the current challenge. (challenges consist of 7 battles)\n    /*0x04B4, 0x0564*/ u16 curStreakChallengesNum[2]; // 1-based index of the current challenge in the current streak.\n    /*0x04B8, 0x0568*/ u16 recordWinStreaks[2];\n    /*0x04BC, 0x056C*/ u8 battleTowerTrainerId; // index for gBattleTowerTrainers table\n    /*0x04BD, 0x056D*/ u8 selectedPartyMons[0x3]; // indices of the 3 selected player party mons.\n    /*0x04C0, 0x0570*/ u16 prizeItem;\n    /*0x04C2, 0x0572*/ u8 battledTrainerIds[6];\n    /*0x04C8, 0x0578*/ u16 totalBattleTowerWins;\n    /*0x04CA, 0x057A*/ u16 bestBattleTowerWinStreak;\n    /*0x04CC, 0x057C*/ u16 currentWinStreaks[2];\n    /*0x04D0, 0x0580*/ u8 lastStreakLevelType; // 0 = level 50, 1 = level 100.  level type of the last streak. Used by tv to report the level mode.\n    /*0x04D1, 0x0581*/ u8 filler_4D1[0x317];\n}; /* size = 0x7E8 */\n\nstruct SaveBlock2\n{\n    /*0x000*/ u8 playerName[PLAYER_NAME_LENGTH + 1];\n    /*0x008*/ u8 playerGender; // MALE, FEMALE\n    /*0x009*/ u8 specialSaveWarpFlags;\n    /*0x00A*/ u8 playerTrainerId[TRAINER_ID_LENGTH];\n    /*0x00E*/ u16 playTimeHours;\n    /*0x010*/ u8 playTimeMinutes;\n    /*0x011*/ u8 playTimeSeconds;\n    /*0x012*/ u8 playTimeVBlanks;\n    /*0x013*/ u8 optionsButtonMode:2;  // OPTIONS_BUTTON_MODE_[NORMAL/LR/L_EQUALS_A]\n              u8 optionsHpBarAnimSpeed:2; //speed at which health bar animates\n              u8 optionsPadding:4;\n    /*0x014*/ u16 optionsTextSpeed:3; // OPTIONS_TEXT_SPEED_[SLOW/MID/FAST/INSTANT]\n              u16 optionsWindowFrameType:5; // Specifies one of the 20 decorative borders for text boxes\n    /*0x15*/  u16 optionsSound:1; // OPTIONS_SOUND_[MONO/STEREO]\n              u16 optionsBattleStyle:2; // OPTIONS_BATTLE_STYLE_[PREDICT/SHIFT/SET]\n              u16 optionsBattleSceneOff:1; // whether battle animations are disabled\n              u16 optionsBattleTransitions:1; // whether battle transitions are disabled\n              u16 optionsBattleIntroAnim:1; // whether battle intro slide is disabled\n              u16 optionsExpBarAnimSpeed:1;  // whether exp bar animates instantly\n    /*0x018*/ struct Pokedex pokedex;\n    /*0x090*/ u8 filler_90[0x8];\n    /*0x098*/ struct Time localTimeOffset;\n    /*0x0A0*/ struct Time lastBerryTreeUpdate;\n    /*0x0A8*/ u32 gcnLinkFlags; // Read by Pokemon Colosseum/XD\n    /*0x0AC*/ bool8 unkFlag1; // Set TRUE, never read\n    /*0x0AD*/ bool8 unkFlag2; // Set FALSE, never read\n    /*0x0B0*/ struct BattleTowerData battleTower;\n    /*0x898*/ u16 mapView[0x100];\n    /*0xA98*/ struct LinkBattleRecords linkBattleRecords;\n    /*0xAF0*/ struct BerryCrush berryCrush;\n    /*0xB00*/ struct PokemonJumpRecords pokeJump;\n    /*0xB10*/ struct BerryPickingResults berryPick;\n    /*0xB20*/ u8 filler_B20[0x400];\n    /*0xF20*/ u32 encryptionKey;\n}; // size: 0xF24\n\nextern struct SaveBlock2 *gSaveBlock2Ptr;\n\nstruct SecretBaseParty\n{\n    u32 personality[PARTY_SIZE];\n    u16 moves[PARTY_SIZE * MAX_MON_MOVES];\n    u16 species[PARTY_SIZE];\n    u16 heldItems[PARTY_SIZE];\n    u8 levels[PARTY_SIZE];\n    u8 EVs[PARTY_SIZE];\n};\n\n// Leftover from R/S, still referenced in the unused function CreateSecretBaseEnemyParty\nstruct SecretBaseRecord\n{\n    /*0x1A9C*/ u8 secretBaseId;\n    /*0x1A9D*/ u8 toRegister:4;\n    /*0x1A9D*/ u8 gender:1;\n    /*0x1A9D*/ u8 battledOwnerToday:1;\n    /*0x1A9D*/ u8 registryStatus:2;\n    /*0x1A9E*/ u8 trainerName[PLAYER_NAME_LENGTH];\n    /*0x1AA5*/ u8 trainerId[TRAINER_ID_LENGTH]; // byte 0 is used for determining trainer class\n    /*0x1AA9*/ u8 language;\n    /*0x1AAA*/ u16 numSecretBasesReceived;\n    /*0x1AAC*/ u8 numTimesEntered;\n    /*0x1AAD*/ u8 unused;\n    /*0x1AAE*/ u8 decorations[DECOR_MAX_SECRET_BASE];\n    /*0x1ABE*/ u8 decorationPos[DECOR_MAX_SECRET_BASE];\n    /*0x1AD0*/ struct SecretBaseParty party;\n};\n\nstruct WarpData\n{\n    s8 mapGroup;\n    s8 mapNum;\n    s8 warpId;\n    s16 x, y;\n};\n\nstruct ItemSlot\n{\n    u16 itemId;\n    u16 quantity;\n};\n\nstruct Pokeblock\n{\n    u8 color;\n    u8 spicy;\n    u8 dry;\n    u8 sweet;\n    u8 bitter;\n    u8 sour;\n    u8 feel;\n};\n\nstruct Roamer\n{\n    /*0x00*/ u32 ivs;\n    /*0x04*/ u32 personality;\n    /*0x08*/ u16 species;\n    /*0x0A*/ u16 hp;\n    /*0x0C*/ u8 level;\n    /*0x0D*/ u8 status;\n    /*0x0E*/ u8 cool;\n    /*0x0F*/ u8 beauty;\n    /*0x10*/ u8 cute;\n    /*0x11*/ u8 smart;\n    /*0x12*/ u8 tough;\n    /*0x13*/ bool8 active;\n    /*0x14*/ u8 filler[0x8];\n};\n\nstruct RamScriptData\n{\n    u8 magic;\n    u8 mapGroup;\n    u8 mapNum;\n    u8 objectId;\n    u8 script[995];\n};\n\nstruct RamScript\n{\n    u32 checksum;\n    struct RamScriptData data;\n};\n\n// Leftover from R/S\nstruct DewfordTrend\n{\n    u16 trendiness:7;\n    u16 maxTrendiness:7;\n    u16 gainingTrendiness:1;\n    u16 rand;\n    u16 words[2];\n}; /*size = 0x8*/\n\nstruct MauvilleManCommon\n{\n    u8 id;\n};\n\nstruct MauvilleManBard\n{\n    /*0x00*/ u8 id;\n    /*0x02*/ u16 songLyrics[BARD_SONG_LENGTH];\n    /*0x0E*/ u16 temporaryLyrics[BARD_SONG_LENGTH];\n    /*0x1A*/ u8 playerName[PLAYER_NAME_LENGTH + 1];\n    /*0x22*/ u8 filler_2DB6[0x3];\n    /*0x25*/ u8 playerTrainerId[TRAINER_ID_LENGTH];\n    /*0x29*/ bool8 hasChangedSong;\n    /*0x2A*/ u8 language;\n}; /*size = 0x2C*/\n\nstruct MauvilleManStoryteller\n{\n    u8 id;\n    bool8 alreadyRecorded;\n    u8 filler2[2];\n    u8 gameStatIDs[NUM_STORYTELLER_TALES];\n    u8 trainerNames[NUM_STORYTELLER_TALES][PLAYER_NAME_LENGTH];\n    u8 statValues[NUM_STORYTELLER_TALES][4];\n    u8 language[NUM_STORYTELLER_TALES];\n};\n\nstruct MauvilleManGiddy\n{\n    /*0x00*/ u8 id;\n    /*0x01*/ u8 taleCounter;\n    /*0x02*/ u8 questionNum;\n    /*0x04*/ u16 randomWords[GIDDY_MAX_TALES];\n    /*0x18*/ u8 questionList[GIDDY_MAX_QUESTIONS];\n    /*0x20*/ u8 language;\n}; /*size = 0x2C*/\n\nstruct MauvilleManHipster\n{\n    u8 id;\n    bool8 alreadySpoken;\n    u8 language;\n};\n\nstruct MauvilleOldManTrader\n{\n    u8 id;\n    u8 decorIds[NUM_TRADER_ITEMS];\n    u8 playerNames[NUM_TRADER_ITEMS][11];\n    u8 alreadyTraded;\n    u8 language[NUM_TRADER_ITEMS];\n};\n\ntypedef union OldMan\n{\n    struct MauvilleManCommon common;\n    struct MauvilleManBard bard;\n    struct MauvilleManGiddy giddy;\n    struct MauvilleManHipster hipster;\n    struct MauvilleOldManTrader trader;\n    struct MauvilleManStoryteller storyteller;\n    u8 filler[0x40];\n} OldMan;\n\nstruct Mail\n{\n    /*0x00*/ u16 words[MAIL_WORDS_COUNT];\n    /*0x12*/ u8 playerName[PLAYER_NAME_LENGTH + 1];\n    /*0x1A*/ u8 trainerId[TRAINER_ID_LENGTH];\n    /*0x1E*/ u16 species;\n    /*0x20*/ u16 itemId;\n};\n\nstruct DayCareMail\n{\n    struct Mail message;\n    u8 OT_name[PLAYER_NAME_LENGTH + 1];\n    u8 monName[POKEMON_NAME_LENGTH + 1];\n    u8 gameLanguage:4;\n    u8 monLanguage:4;\n};\n\nstruct DaycareMon\n{\n    struct BoxPokemon mon;\n    struct DayCareMail mail;\n    u32 steps;\n};\n\nstruct DayCare\n{\n    struct DaycareMon mons[DAYCARE_MON_COUNT];\n    u32 offspringPersonality;\n    u8 stepCounter;\n};\n\n// Leftover from R/S, referenced in unused function InitDaycareMailRecordMixing\nstruct RecordMixingDayCareMail\n{\n    struct DayCareMail mail[DAYCARE_MON_COUNT];\n    u32 numDaycareMons;\n    bool16 holdsItem[DAYCARE_MON_COUNT];\n};\n\nstruct QuestLogObjectEventTemplate\n{\n    u32 x:8;\n    u32 negx:1;\n    u32 y:8;\n    u32 negy:1;\n    u32 elevation:6;\n    u32 movementType:8;\n};\n\nstruct QuestLogObjectEvent\n{\n    /*0x00*/ u8 active:1;\n    /*0x00*/ u8 triggerGroundEffectsOnStop:1;\n    /*0x00*/ u8 disableCoveringGroundEffects:1;\n    /*0x00*/ u8 landingJump:1;\n    /*0x00*/ u8 frozen:1;\n    /*0x00*/ u8 facingDirectionLocked:1;\n    /*0x00*/ u8 disableAnim:1;\n    /*0x00*/ u8 enableAnim:1;\n    /*0x01*/ u8 inanimate:1;\n    /*0x01*/ u8 invisible:1;\n    /*0x01*/ u8 offScreen:1;\n    /*0x01*/ u8 trackedByCamera:1;\n    /*0x01*/ u8 isPlayer:1;\n    /*0x01*/ u8 spriteAnimPausedBackup:1;\n    /*0x01*/ u8 spriteAffineAnimPausedBackup:1;\n    /*0x01*/ u8 disableJumpLandingGroundEffect:1;\n    /*0x02*/ u8 fixedPriority:1;\n    /*0x02*/ u8 facingDirection:4;\n    /*0x02*/ u8 unused:3;\n    /*0x03*/ u8 currentElevation:4;\n    /*0x03*/ u8 previousElevation:4;\n    /*0x04*/ u8 graphicsId;\n    /*0x05*/ u8 movementType;\n    /*0x06*/ u8 trainerType;\n    /*0x07*/ u8 localId;\n    /*0x08*/ u8 mapNum;\n    /*0x09*/ u8 mapGroup;\n    /*0x0a*/ s16 x;\n    /*0x0c*/ s16 y;\n    /*0x0e*/ u8 trainerRange_berryTreeId;\n    /*0x0f*/ u8 previousMetatileBehavior;\n    /*0x10*/ u8 directionSequenceIndex;\n    /*0x11*/ u8 animId;\n};\n\n// This represents all the data needed to display a single scene for the \"Quest Log\" when the player resumes playing.\n//\nstruct QuestLogScene\n{\n    /*0x0000*/ u8 startType; // QL_START_NORMAL / QL_START_WARP\n    /*0x0001*/ u8 mapGroup;\n    /*0x0002*/ u8 mapNum;\n    /*0x0003*/ u8 warpId;\n    /*0x0004*/ s16 x;\n    /*0x0006*/ s16 y;\n    /*0x0008*/ struct QuestLogObjectEvent objectEvents[OBJECT_EVENTS_COUNT];\n    /*0x0148*/ u8 flags[NUM_FLAG_BYTES];\n    /*0x02c8*/ u16 vars[VARS_COUNT];\n    /*0x0468*/ struct QuestLogObjectEventTemplate objectEventTemplates[OBJECT_EVENT_TEMPLATES_COUNT];\n    /*0x0568*/ u16 script[128];\n    /*0x0668*/ u16 end[0];\n};\n\n#include \"fame_checker.h\"\n\nstruct FameCheckerSaveData\n{\n    /*3a54*/ u16 pickState:2;\n    u16 flavorTextFlags:12;\n    u16 unk_0_E:2;\n};\n\nstruct WonderNewsMetadata\n{\n    u8 newsType:2;\n    u8 sentRewardCounter:3;\n    u8 rewardCounter:3;\n    u8 berry;\n};\n\nstruct WonderNews\n{\n    u16 id;\n    u8 sendType; // SEND_TYPE_*\n    u8 bgType;\n    u8 titleText[WONDER_NEWS_TEXT_LENGTH];\n    u8 bodyText[WONDER_NEWS_BODY_TEXT_LINES][WONDER_NEWS_TEXT_LENGTH];\n};\n\nstruct WonderCard\n{\n    u16 flagId; // Event flag (sReceivedGiftFlags) + WONDER_CARD_FLAG_OFFSET\n    u16 iconSpecies;\n    u32 idNumber;\n    u8 type:2; // CARD_TYPE_*\n    u8 bgType:4;\n    u8 sendType:2; // SEND_TYPE_*\n    u8 maxStamps;\n    u8 titleText[WONDER_CARD_TEXT_LENGTH];\n    u8 subtitleText[WONDER_CARD_TEXT_LENGTH];\n    u8 bodyText[WONDER_CARD_BODY_TEXT_LINES][WONDER_CARD_TEXT_LENGTH];\n    u8 footerLine1Text[WONDER_CARD_TEXT_LENGTH];\n    u8 footerLine2Text[WONDER_CARD_TEXT_LENGTH];\n};\n\nstruct WonderCardMetadata\n{\n    u16 battlesWon;\n    u16 battlesLost;\n    u16 numTrades;\n    u16 iconSpecies;\n    u16 stampData[2][MAX_STAMP_CARD_STAMPS]; // First element is STAMP_SPECIES, second is STAMP_ID\n};\n\nstruct MysteryGiftSave\n{\n    u32 newsCrc;\n    struct WonderNews news;\n    u32 cardCrc;\n    struct WonderCard card;\n    u32 cardMetadataCrc;\n    struct WonderCardMetadata cardMetadata;\n    u16 questionnaireWords[NUM_QUESTIONNAIRE_WORDS];\n    struct WonderNewsMetadata newsMetadata;\n    u32 trainerIds[2][5]; // Saved ids for 10 trainers, 5 each for battles and trades \n}; // 0x36C 0x348C\n\nstruct TrainerTower\n{\n    u32 timer;\n    u32 bestTime;\n    u8 floorsCleared;\n    u8 unk9;\n    bool8 receivedPrize:1;\n    bool8 checkedFinalTime:1;\n    bool8 spokeToOwner:1;\n    bool8 hasLost:1;\n    bool8 unkA_4:1;\n    bool8 validated:1;\n};\n\nstruct TrainerNameRecord\n{\n    u32 trainerId;\n    u8 trainerName[PLAYER_NAME_LENGTH + 1];\n};\n\nstruct KeySystemFlags\n{\n    u16 difficulty:2;   //0 for normal, 1 for challenge, 2 for easy, 3 for maybe another mode?\n    u16 version:1;      //0 for FR, 1 for LG\n    u16 nuzlocke:1;     //0 for normal, 1 for Nuzlocke mode\n    u16 ivCalcMode:2;   //0 for normal, 1 for all 31, 2 for all zero\n    u16 evCalcMode:1;   //0 for normal, 1 for all zero\n    u16 noPMC:1;        //0 for normal, 1 for no Pokemon Center healing.\n    u16 expMod:2;       //0 for 0x, 1 for 1/2x, 2 for 1x, 3 for 2x \n    u16 padding:4;\n    u16 changedCalcMode:1; //set if calc mode is changed to recalc party on save load\n    u16 inKeySystemMenu:1; //Needed for Help Menu regardless of Button Mode\n    u16 padding2;\n};\n\n// For external event data storage. The majority of these may have never been used.\n// In FRLG, the only known used fields are the PokeCoupon and BoxRS ones, but hacking the distribution discs allows FRLG to receive events and set the others\nstruct ExternalEventData\n{\n    u8 unknownExternalDataFields1[7]; // if actually used, may be broken up into different fields.\n    u32 unknownExternalDataFields2:8;\n    u32 currentPokeCoupons:24; // PokéCoupons stored by Pokémon Colosseum and XD from Mt. Battle runs. Earned PokéCoupons are also added to totalEarnedPokeCoupons. Colosseum/XD caps this at 9,999,999, but will read up to 16,777,215.\n    u32 gotGoldPokeCouponTitleReward:1; // Master Ball from JP Colosseum Bonus Disc; for reaching 30,000 totalEarnedPokeCoupons\n    u32 gotSilverPokeCouponTitleReward:1; // Light Ball Pikachu from JP Colosseum Bonus Disc; for reaching 5000 totalEarnedPokeCoupons\n    u32 gotBronzePokeCouponTitleReward:1; // PP Max from JP Colosseum Bonus Disc; for reaching 2500 totalEarnedPokeCoupons\n    u32 receivedAgetoCelebi:1; // from JP Colosseum Bonus Disc\n    u32 unknownExternalDataFields3:4;\n    u32 totalEarnedPokeCoupons:24; // Used by the JP Colosseum bonus disc. Determines PokéCoupon rank to distribute rewards. Unread in International games. Colosseum/XD caps this at 9,999,999.\n    u8 unknownExternalDataFields4[5]; // if actually used, may be broken up into different fields.\n} __attribute__((packed)); /*size = 0x14*/\n\n// For external event flags. The majority of these may have never been used.\n// In FRLG, Jirachi cannot normally be received, but hacking the distribution discs allows FRLG to receive Jirachi and set the flag\nstruct ExternalEventFlags\n{\n    u8 usedBoxRS:1; // Set by Pokémon Box: Ruby & Sapphire; denotes whether this save has connected to it and triggered the free False Swipe Swablu Egg giveaway.\n    u8 boxRSEggsUnlocked:2; // Set by Pokémon Box: Ruby & Sapphire; denotes the number of Eggs unlocked from deposits; 1 for ExtremeSpeed Zigzagoon (at 100 deposited), 2 for Pay Day Skitty (at 500 deposited), 3 for Surf Pichu (at 1499 deposited)\n    u8 padding:5;\n    u8 unknownFlag1;\n    u8 receivedGCNJirachi; // Both the US Colosseum Bonus Disc and PAL/AUS Pokémon Channel use this field. One cannot receive a WISHMKR Jirachi and CHANNEL Jirachi with the same savefile.\n    u8 unknownFlag3;\n    u8 unknownFlag4;\n    u8 unknownFlag5;\n    u8 unknownFlag6;\n    u8 unknownFlag7;\n    u8 unknownFlag8;\n    u8 unknownFlag9;\n    u8 unknownFlag10;\n    u8 unknownFlag11;\n    u8 unknownFlag12;\n    u8 unknownFlag13;\n    u8 unknownFlag14;\n    u8 unknownFlag15;\n    u8 unknownFlag16;\n    u8 unknownFlag17;\n    u8 unknownFlag18;\n    u8 unknownFlag19;\n    u8 unknownFlag20;\n\n} __attribute__((packed));/*size = 0x15*/\n\nstruct SaveBlock1\n{\n    /*0x0000*/ struct Coords16 pos;\n    /*0x0004*/ struct WarpData location;\n    /*0x000C*/ struct WarpData continueGameWarp;\n    /*0x0014*/ struct WarpData dynamicWarp;\n    /*0x001C*/ struct WarpData lastHealLocation;\n    /*0x0024*/ struct WarpData escapeWarp;\n    /*0x002C*/ u16 savedMusic;\n    /*0x002E*/ u8 weather;\n    /*0x002F*/ u8 weatherCycleStage;\n    /*0x0030*/ u8 flashLevel;\n    /*0x0032*/ u16 mapLayoutId;\n    /*0x0034*/ u8 playerPartyCount;\n    /*0x0038*/ struct Pokemon playerParty[PARTY_SIZE];\n    /*0x0290*/ u32 money;\n    /*0x0294*/ u16 coins;\n    /*0x0296*/ u16 registeredItem; // registered for use with SELECT button, could probably be stripped to less than a byte as an index into a table of only registerable items\n    /*0x0298*/ struct ItemSlot pcItems[PC_ITEMS_COUNT];\n    /*0x0310*/ struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT]; //now holds 47 items\n    /*0x053C*/ struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT];\n               u8 bagPocket_TMHM[8]; // 8 bytes fills all TMs/HMs\n               u8 bagPocket_KeyItems[BAG_KEYITEMS_COUNT]; // stripped to one byte indices, 36 slots now for all legal FRLG Key Items at once + 2 more for cheaters/alignment.\n               struct ItemSlot bagPocket_Medicine[BAG_MEDICINE_COUNT];\n               struct ItemSlot bagPocket_HoldItems[BAG_HELD_ITEMS_COUNT];\n               u8 leftoverItemSlots[92]; //padding to prevent shifting the saveblock, Berry Pocket was moved elsewhere\n    /*0x05F8*/ u8 seen1[52]; //made unreferenced & can be gotten rid of, though PKHeX presumably will still set this\n    /*0x062C*/ u8 filler_062C[5]; // unused; was berryBlenderRecords which was obviously unused\n               u8 masterTrainerTitle; // 0 is none, 152 is Grandmaster, 1-151 is {Kanto species} Master\n    /*0x0632*/ u16 lastViewedPokedexEntry; // For easier viewing of roamers\n               struct KeySystemFlags keyFlags; //Key System flags\n    /*0x0638*/ u16 trainerRematchStepCounter;\n    /*0x063A*/ u8 ALIGNED(2) trainerRematches[MAX_REMATCH_ENTRIES];\n    /*0x06A0*/ struct ObjectEvent objectEvents[OBJECT_EVENTS_COUNT];\n    /*0x08E0*/ struct ObjectEventTemplate objectEventTemplates[OBJECT_EVENT_TEMPLATES_COUNT];\n    /*0x0EE0*/ u8 flags[NUM_FLAG_BYTES];\n    /*0x1000*/ u16 vars[VARS_COUNT];\n    /*0x1200*/ u32 gameStats[NUM_GAME_STATS];\n    /*0x1300*/ struct QuestLogScene questLog[QUEST_LOG_SCENE_COUNT];\n    /*0x2CA0*/ u16 easyChatProfile[EASY_CHAT_BATTLE_WORDS_COUNT];\n    /*0x2CAC*/ u16 easyChatBattleStart[EASY_CHAT_BATTLE_WORDS_COUNT]; //referred to, but functionally unused\n    /*0x2CB8*/ u16 easyChatBattleWon[EASY_CHAT_BATTLE_WORDS_COUNT]; //referred to, but functionally unused\n    /*0x2CC4*/ u16 easyChatBattleLost[EASY_CHAT_BATTLE_WORDS_COUNT]; //referred to, but functionally unused\n    /*0x2CD0*/ struct Mail mail[MAIL_COUNT];\n    /*0x2F10*/ u8 additionalPhrases[NUM_ADDITIONAL_PHRASE_BYTES];\n    /*0x2F18*/ u8 filler_oldMan[64]; // unused, was struct OldMan oldMan\n    /*0x2F54*/ u8 filler_EasyChatPairs[36]; // unused, was struct DewfordTrend dewfordTrends[5], which was 40 bytes, but I had to add 2 bytes to the Daycare struct (which got padded to 4).\n    /*0x2F80*/ struct DayCare daycare;\n    /*0x309C*/ u8 giftRibbons[GIFT_RIBBONS_COUNT];\n    /*0x30A7*/ struct ExternalEventData externalEventData;\n    /*0x30BB*/ struct ExternalEventFlags externalEventFlags;\n    /*0x30D0*/ struct Roamer roamer;\n    /*0x30EC*/ struct EnigmaBerry enigmaBerry;\n    /*0x3120*/ struct MysteryGiftSave mysteryGift; //0x36C in length\n    /*0x348C*/ u8 unused_348C[176];\n    //^^^this & the mysteryEventBuffers field are labeled \"FreeWork\" & combined in the source, though 0x36C of FreeWork is set aside for MEventBuffers in mevent.c,\n    //^^^which is likely where the above field was documented from. The rest of FreeWork is unreferenced in the source, so this field is likely unused.\n               u8 nuzlockeDupeFlags[52]; //taken from filler_348c field, which was originally 400 bytes. Used to prevent hijacking the dupe clause in Nuzlocke by catching fainted Pokemon.\n               struct ItemSlot bagPocket_Berries[BAG_BERRIES_COUNT]; //taken from filler_348C field, which was originally 400 bytes\n    /*0x361C*/ struct RamScript ramScript;\n    /*0x3A08*/ u8 filler3A08[16]; //RecordMixingGift recordMixingGift. Unused.\n    /*0x3A18*/ u8 seen2[52]; //made unreferenced & can be gotten rid of, though PKHeX presumably will still set this\n    /*0x3A4C*/ u8 rivalName[PLAYER_NAME_LENGTH + 1];\n    /*0x3A54*/ struct FameCheckerSaveData fameChecker[NUM_FAMECHECKER_PERSONS];\n    /*0x3A94*/ u8 unused_3A94[44]; //max fame checker people is actually 32, so this is the unused 16 entries\n               u8 masterTrainerFlags[20]; //taken from above unused_3A94 field, which was originally 64 bytes long. 1 byte longer than necessary for alignment.\n    /*0x3AD4*/ u8 registeredTexts[UNION_ROOM_KB_ROW_COUNT][21];\n    /*0x3BA8*/ struct TrainerNameRecord trainerNameRecords[20];\n    /*0x3C98*/ struct DaycareMon route5DayCareMon;\n    /*0x3D24*/ u8 unused_3D24[16]; //some sort of win/loss/draw records that are never referred to. An RFU thing. Mystery Event?\n    /*0x3D34*/ u32 towerChallengeId;\n    /*0x3D38*/ struct TrainerTower trainerTower[NUM_TOWER_CHALLENGE_TYPES];\n}; // size: 0x3D68\n\nstruct MapPosition\n{\n    s16 x;\n    s16 y;\n    s8 elevation;\n};\n\nextern struct SaveBlock1* gSaveBlock1Ptr;\nextern u8 gReservedSpritePaletteCount;\n\n#endif // GUARD_GLOBAL_H\n"
  },
  {
    "path": "include/gpu_regs.h",
    "content": "#ifndef GUARD_GPU_REGS_H\n#define GUARD_GPU_REGS_H\n\n#include \"global.h\"\n\n// Exported type declarations\n\n// Exported RAM declarations\n\n// Exported ROM declarations\nvoid InitGpuRegManager(void);\nvoid CopyBufferedValuesToGpuRegs(void);\nvoid SetGpuReg(u8 regOffset, u16 value);\nvoid SetGpuReg_ForcedBlank(u8 regOffset, u16 value);\nu16 GetGpuReg(u8 regOffset);\nvoid SetGpuRegBits(u8 regOffset, u16 mask);\nvoid ClearGpuRegBits(u8 regOffset, u16 mask);\nvoid EnableInterrupts(u16 mask);\nvoid DisableInterrupts(u16 mask);\n\n#endif //GUARD_GPU_REGS_H\n"
  },
  {
    "path": "include/graphics.h",
    "content": "#ifndef GUARD_GRAPHICS_H\n#define GUARD_GRAPHICS_H\n\n#include \"global.h\"\n\nextern const u32 gBallGfx_Poke[];\nextern const u32 gBallPal_Poke[];\nextern const u32 gBallGfx_Great[];\nextern const u32 gBallPal_Great[];\nextern const u32 gBallGfx_Safari[];\nextern const u32 gBallPal_Safari[];\nextern const u32 gBallGfx_Ultra[];\nextern const u32 gBallPal_Ultra[];\nextern const u32 gBallGfx_Master[];\nextern const u32 gBallPal_Master[];\nextern const u32 gBallGfx_Net[];\nextern const u32 gBallPal_Net[];\nextern const u32 gBallGfx_Dive[];\nextern const u32 gBallPal_Dive[];\nextern const u32 gBallGfx_Nest[];\nextern const u32 gBallPal_Nest[];\nextern const u32 gBallGfx_Repeat[];\nextern const u32 gBallPal_Repeat[];\nextern const u32 gBallGfx_Timer[];\nextern const u32 gBallPal_Timer[];\nextern const u32 gBallGfx_Luxury[];\nextern const u32 gBallPal_Luxury[];\nextern const u32 gBallGfx_Premier[];\nextern const u32 gBallPal_Premier[];\nextern const u32 gOpenPokeballGfx[];\n\n// pokemon gfx\nextern const u32 gMonFrontPic_Bulbasaur[];\nextern const u32 gMonPalette_Bulbasaur[];\nextern const u32 gMonBackPic_Bulbasaur[];\nextern const u32 gMonShinyPalette_Bulbasaur[];\nextern const u8 gMonIcon_Bulbasaur[];\nextern const u8 gMonFootprint_Bulbasaur[];\nextern const u32 gMonFrontPic_Ivysaur[];\nextern const u32 gMonPalette_Ivysaur[];\nextern const u32 gMonBackPic_Ivysaur[];\nextern const u32 gMonShinyPalette_Ivysaur[];\nextern const u8 gMonIcon_Ivysaur[];\nextern const u8 gMonFootprint_Ivysaur[];\nextern const u32 gMonFrontPic_Venusaur[];\nextern const u32 gMonPalette_Venusaur[];\nextern const u32 gMonBackPic_Venusaur[];\nextern const u32 gMonShinyPalette_Venusaur[];\nextern const u8 gMonIcon_Venusaur[];\nextern const u8 gMonFootprint_Venusaur[];\nextern const u32 gMonFrontPic_Charmander[];\nextern const u32 gMonPalette_Charmander[];\nextern const u32 gMonBackPic_Charmander[];\nextern const u32 gMonShinyPalette_Charmander[];\nextern const u8 gMonIcon_Charmander[];\nextern const u8 gMonFootprint_Charmander[];\nextern const u32 gMonFrontPic_Charmeleon[];\nextern const u32 gMonPalette_Charmeleon[];\nextern const u32 gMonBackPic_Charmeleon[];\nextern const u32 gMonShinyPalette_Charmeleon[];\nextern const u8 gMonIcon_Charmeleon[];\nextern const u8 gMonFootprint_Charmeleon[];\nextern const u32 gMonFrontPic_Charizard[];\nextern const u32 gMonPalette_Charizard[];\nextern const u32 gMonBackPic_Charizard[];\nextern const u32 gMonShinyPalette_Charizard[];\nextern const u8 gMonIcon_Charizard[];\nextern const u8 gMonFootprint_Charizard[];\nextern const u32 gMonFrontPic_Squirtle[];\nextern const u32 gMonPalette_Squirtle[];\nextern const u32 gMonBackPic_Squirtle[];\nextern const u32 gMonShinyPalette_Squirtle[];\nextern const u8 gMonIcon_Squirtle[];\nextern const u8 gMonFootprint_Squirtle[];\nextern const u32 gMonFrontPic_Wartortle[];\nextern const u32 gMonPalette_Wartortle[];\nextern const u32 gMonBackPic_Wartortle[];\nextern const u32 gMonShinyPalette_Wartortle[];\nextern const u8 gMonIcon_Wartortle[];\nextern const u8 gMonFootprint_Wartortle[];\nextern const u32 gMonFrontPic_Blastoise[];\nextern const u32 gMonPalette_Blastoise[];\nextern const u32 gMonBackPic_Blastoise[];\nextern const u32 gMonShinyPalette_Blastoise[];\nextern const u8 gMonIcon_Blastoise[];\nextern const u8 gMonFootprint_Blastoise[];\nextern const u32 gMonFrontPic_Caterpie[];\nextern const u32 gMonPalette_Caterpie[];\nextern const u32 gMonBackPic_Caterpie[];\nextern const u32 gMonShinyPalette_Caterpie[];\nextern const u8 gMonIcon_Caterpie[];\nextern const u8 gMonFootprint_Caterpie[];\nextern const u32 gMonFrontPic_Metapod[];\nextern const u32 gMonPalette_Metapod[];\nextern const u32 gMonBackPic_Metapod[];\nextern const u32 gMonShinyPalette_Metapod[];\nextern const u8 gMonIcon_Metapod[];\nextern const u8 gMonFootprint_Metapod[];\nextern const u32 gMonFrontPic_Butterfree[];\nextern const u32 gMonPalette_Butterfree[];\nextern const u32 gMonBackPic_Butterfree[];\nextern const u32 gMonShinyPalette_Butterfree[];\nextern const u8 gMonIcon_Butterfree[];\nextern const u8 gMonFootprint_Butterfree[];\nextern const u32 gMonFrontPic_Weedle[];\nextern const u32 gMonPalette_Weedle[];\nextern const u32 gMonBackPic_Weedle[];\nextern const u32 gMonShinyPalette_Weedle[];\nextern const u8 gMonIcon_Weedle[];\nextern const u8 gMonFootprint_Weedle[];\nextern const u32 gMonFrontPic_Kakuna[];\nextern const u32 gMonPalette_Kakuna[];\nextern const u32 gMonBackPic_Kakuna[];\nextern const u32 gMonShinyPalette_Kakuna[];\nextern const u8 gMonIcon_Kakuna[];\nextern const u8 gMonFootprint_Kakuna[];\nextern const u32 gMonFrontPic_Beedrill[];\nextern const u32 gMonPalette_Beedrill[];\nextern const u32 gMonBackPic_Beedrill[];\nextern const u32 gMonShinyPalette_Beedrill[];\nextern const u8 gMonIcon_Beedrill[];\nextern const u8 gMonFootprint_Beedrill[];\nextern const u32 gMonFrontPic_Pidgey[];\nextern const u32 gMonPalette_Pidgey[];\nextern const u32 gMonBackPic_Pidgey[];\nextern const u32 gMonShinyPalette_Pidgey[];\nextern const u8 gMonIcon_Pidgey[];\nextern const u8 gMonFootprint_Pidgey[];\nextern const u32 gMonFrontPic_Pidgeotto[];\nextern const u32 gMonPalette_Pidgeotto[];\nextern const u32 gMonBackPic_Pidgeotto[];\nextern const u32 gMonShinyPalette_Pidgeotto[];\nextern const u8 gMonIcon_Pidgeotto[];\nextern const u8 gMonFootprint_Pidgeotto[];\nextern const u32 gMonFrontPic_Pidgeot[];\nextern const u32 gMonPalette_Pidgeot[];\nextern const u32 gMonBackPic_Pidgeot[];\nextern const u32 gMonShinyPalette_Pidgeot[];\nextern const u8 gMonIcon_Pidgeot[];\nextern const u8 gMonFootprint_Pidgeot[];\nextern const u32 gMonFrontPic_Rattata[];\nextern const u32 gMonPalette_Rattata[];\nextern const u32 gMonBackPic_Rattata[];\nextern const u32 gMonShinyPalette_Rattata[];\nextern const u8 gMonIcon_Rattata[];\nextern const u8 gMonFootprint_Rattata[];\nextern const u32 gMonFrontPic_Raticate[];\nextern const u32 gMonPalette_Raticate[];\nextern const u32 gMonBackPic_Raticate[];\nextern const u32 gMonShinyPalette_Raticate[];\nextern const u8 gMonIcon_Raticate[];\nextern const u8 gMonFootprint_Raticate[];\nextern const u32 gMonFrontPic_Spearow[];\nextern const u32 gMonPalette_Spearow[];\nextern const u32 gMonBackPic_Spearow[];\nextern const u32 gMonShinyPalette_Spearow[];\nextern const u8 gMonIcon_Spearow[];\nextern const u8 gMonFootprint_Spearow[];\nextern const u32 gMonFrontPic_Fearow[];\nextern const u32 gMonPalette_Fearow[];\nextern const u32 gMonBackPic_Fearow[];\nextern const u32 gMonShinyPalette_Fearow[];\nextern const u8 gMonIcon_Fearow[];\nextern const u8 gMonFootprint_Fearow[];\nextern const u32 gMonFrontPic_Ekans[];\nextern const u32 gMonPalette_Ekans[];\nextern const u32 gMonBackPic_Ekans[];\nextern const u32 gMonShinyPalette_Ekans[];\nextern const u8 gMonIcon_Ekans[];\nextern const u8 gMonFootprint_Ekans[];\nextern const u32 gMonFrontPic_Arbok[];\nextern const u32 gMonPalette_Arbok[];\nextern const u32 gMonBackPic_Arbok[];\nextern const u32 gMonShinyPalette_Arbok[];\nextern const u8 gMonIcon_Arbok[];\nextern const u8 gMonFootprint_Arbok[];\nextern const u32 gMonFrontPic_Pikachu[];\nextern const u32 gMonPalette_Pikachu[];\nextern const u32 gMonBackPic_Pikachu[];\nextern const u32 gMonShinyPalette_Pikachu[];\nextern const u8 gMonIcon_Pikachu[];\nextern const u8 gMonFootprint_Pikachu[];\nextern const u32 gMonFrontPic_Raichu[];\nextern const u32 gMonPalette_Raichu[];\nextern const u32 gMonBackPic_Raichu[];\nextern const u32 gMonShinyPalette_Raichu[];\nextern const u8 gMonIcon_Raichu[];\nextern const u8 gMonFootprint_Raichu[];\nextern const u32 gMonFrontPic_Sandshrew[];\nextern const u32 gMonPalette_Sandshrew[];\nextern const u32 gMonBackPic_Sandshrew[];\nextern const u32 gMonShinyPalette_Sandshrew[];\nextern const u8 gMonIcon_Sandshrew[];\nextern const u8 gMonFootprint_Sandshrew[];\nextern const u32 gMonFrontPic_Sandslash[];\nextern const u32 gMonPalette_Sandslash[];\nextern const u32 gMonBackPic_Sandslash[];\nextern const u32 gMonShinyPalette_Sandslash[];\nextern const u8 gMonIcon_Sandslash[];\nextern const u8 gMonFootprint_Sandslash[];\nextern const u32 gMonFrontPic_NidoranF[];\nextern const u32 gMonPalette_NidoranF[];\nextern const u32 gMonBackPic_NidoranF[];\nextern const u32 gMonShinyPalette_NidoranF[];\nextern const u8 gMonIcon_NidoranF[];\nextern const u8 gMonFootprint_NidoranF[];\nextern const u32 gMonFrontPic_Nidorina[];\nextern const u32 gMonPalette_Nidorina[];\nextern const u32 gMonBackPic_Nidorina[];\nextern const u32 gMonShinyPalette_Nidorina[];\nextern const u8 gMonIcon_Nidorina[];\nextern const u8 gMonFootprint_Nidorina[];\nextern const u32 gMonFrontPic_Nidoqueen[];\nextern const u32 gMonPalette_Nidoqueen[];\nextern const u32 gMonBackPic_Nidoqueen[];\nextern const u32 gMonShinyPalette_Nidoqueen[];\nextern const u8 gMonIcon_Nidoqueen[];\nextern const u8 gMonFootprint_Nidoqueen[];\nextern const u32 gMonFrontPic_NidoranM[];\nextern const u32 gMonPalette_NidoranM[];\nextern const u32 gMonBackPic_NidoranM[];\nextern const u32 gMonShinyPalette_NidoranM[];\nextern const u8 gMonIcon_NidoranM[];\nextern const u8 gMonFootprint_NidoranM[];\nextern const u32 gMonFrontPic_Nidorino[];\nextern const u32 gMonPalette_Nidorino[];\nextern const u32 gMonBackPic_Nidorino[];\nextern const u32 gMonShinyPalette_Nidorino[];\nextern const u8 gMonIcon_Nidorino[];\nextern const u8 gMonFootprint_Nidorino[];\nextern const u32 gMonFrontPic_Nidoking[];\nextern const u32 gMonPalette_Nidoking[];\nextern const u32 gMonBackPic_Nidoking[];\nextern const u32 gMonShinyPalette_Nidoking[];\nextern const u8 gMonIcon_Nidoking[];\nextern const u8 gMonFootprint_Nidoking[];\nextern const u32 gMonFrontPic_Clefairy[];\nextern const u32 gMonPalette_Clefairy[];\nextern const u32 gMonBackPic_Clefairy[];\nextern const u32 gMonShinyPalette_Clefairy[];\nextern const u8 gMonIcon_Clefairy[];\nextern const u8 gMonFootprint_Clefairy[];\nextern const u32 gMonFrontPic_Clefable[];\nextern const u32 gMonPalette_Clefable[];\nextern const u32 gMonBackPic_Clefable[];\nextern const u32 gMonShinyPalette_Clefable[];\nextern const u8 gMonIcon_Clefable[];\nextern const u8 gMonFootprint_Clefable[];\nextern const u32 gMonFrontPic_Vulpix[];\nextern const u32 gMonPalette_Vulpix[];\nextern const u32 gMonBackPic_Vulpix[];\nextern const u32 gMonShinyPalette_Vulpix[];\nextern const u8 gMonIcon_Vulpix[];\nextern const u8 gMonFootprint_Vulpix[];\nextern const u32 gMonFrontPic_Ninetales[];\nextern const u32 gMonPalette_Ninetales[];\nextern const u32 gMonBackPic_Ninetales[];\nextern const u32 gMonShinyPalette_Ninetales[];\nextern const u8 gMonIcon_Ninetales[];\nextern const u8 gMonFootprint_Ninetales[];\nextern const u32 gMonFrontPic_Jigglypuff[];\nextern const u32 gMonPalette_Jigglypuff[];\nextern const u32 gMonBackPic_Jigglypuff[];\nextern const u32 gMonShinyPalette_Jigglypuff[];\nextern const u8 gMonIcon_Jigglypuff[];\nextern const u8 gMonFootprint_Jigglypuff[];\nextern const u32 gMonFrontPic_Wigglytuff[];\nextern const u32 gMonPalette_Wigglytuff[];\nextern const u32 gMonBackPic_Wigglytuff[];\nextern const u32 gMonShinyPalette_Wigglytuff[];\nextern const u8 gMonIcon_Wigglytuff[];\nextern const u8 gMonFootprint_Wigglytuff[];\nextern const u32 gMonFrontPic_Zubat[];\nextern const u32 gMonPalette_Zubat[];\nextern const u32 gMonBackPic_Zubat[];\nextern const u32 gMonShinyPalette_Zubat[];\nextern const u8 gMonIcon_Zubat[];\nextern const u8 gMonFootprint_Zubat[];\nextern const u32 gMonFrontPic_Golbat[];\nextern const u32 gMonPalette_Golbat[];\nextern const u32 gMonBackPic_Golbat[];\nextern const u32 gMonShinyPalette_Golbat[];\nextern const u8 gMonIcon_Golbat[];\nextern const u8 gMonFootprint_Golbat[];\nextern const u32 gMonFrontPic_Oddish[];\nextern const u32 gMonPalette_Oddish[];\nextern const u32 gMonBackPic_Oddish[];\nextern const u32 gMonShinyPalette_Oddish[];\nextern const u8 gMonIcon_Oddish[];\nextern const u8 gMonFootprint_Oddish[];\nextern const u32 gMonFrontPic_Gloom[];\nextern const u32 gMonPalette_Gloom[];\nextern const u32 gMonBackPic_Gloom[];\nextern const u32 gMonShinyPalette_Gloom[];\nextern const u8 gMonIcon_Gloom[];\nextern const u8 gMonFootprint_Gloom[];\nextern const u32 gMonFrontPic_Vileplume[];\nextern const u32 gMonPalette_Vileplume[];\nextern const u32 gMonBackPic_Vileplume[];\nextern const u32 gMonShinyPalette_Vileplume[];\nextern const u8 gMonIcon_Vileplume[];\nextern const u8 gMonFootprint_Vileplume[];\nextern const u32 gMonFrontPic_Paras[];\nextern const u32 gMonPalette_Paras[];\nextern const u32 gMonBackPic_Paras[];\nextern const u32 gMonShinyPalette_Paras[];\nextern const u8 gMonIcon_Paras[];\nextern const u8 gMonFootprint_Paras[];\nextern const u32 gMonFrontPic_Parasect[];\nextern const u32 gMonPalette_Parasect[];\nextern const u32 gMonBackPic_Parasect[];\nextern const u32 gMonShinyPalette_Parasect[];\nextern const u8 gMonIcon_Parasect[];\nextern const u8 gMonFootprint_Parasect[];\nextern const u32 gMonFrontPic_Venonat[];\nextern const u32 gMonPalette_Venonat[];\nextern const u32 gMonBackPic_Venonat[];\nextern const u32 gMonShinyPalette_Venonat[];\nextern const u8 gMonIcon_Venonat[];\nextern const u8 gMonFootprint_Venonat[];\nextern const u32 gMonFrontPic_Venomoth[];\nextern const u32 gMonPalette_Venomoth[];\nextern const u32 gMonBackPic_Venomoth[];\nextern const u32 gMonShinyPalette_Venomoth[];\nextern const u8 gMonIcon_Venomoth[];\nextern const u8 gMonFootprint_Venomoth[];\nextern const u32 gMonFrontPic_Diglett[];\nextern const u32 gMonPalette_Diglett[];\nextern const u32 gMonBackPic_Diglett[];\nextern const u32 gMonShinyPalette_Diglett[];\nextern const u8 gMonIcon_Diglett[];\nextern const u8 gMonFootprint_Diglett[];\nextern const u32 gMonFrontPic_Dugtrio[];\nextern const u32 gMonPalette_Dugtrio[];\nextern const u32 gMonBackPic_Dugtrio[];\nextern const u32 gMonShinyPalette_Dugtrio[];\nextern const u8 gMonIcon_Dugtrio[];\nextern const u8 gMonFootprint_Dugtrio[];\nextern const u32 gMonFrontPic_Meowth[];\nextern const u32 gMonPalette_Meowth[];\nextern const u32 gMonBackPic_Meowth[];\nextern const u32 gMonShinyPalette_Meowth[];\nextern const u8 gMonIcon_Meowth[];\nextern const u8 gMonFootprint_Meowth[];\nextern const u32 gMonFrontPic_Persian[];\nextern const u32 gMonPalette_Persian[];\nextern const u32 gMonBackPic_Persian[];\nextern const u32 gMonShinyPalette_Persian[];\nextern const u8 gMonIcon_Persian[];\nextern const u8 gMonFootprint_Persian[];\nextern const u32 gMonFrontPic_Psyduck[];\nextern const u32 gMonPalette_Psyduck[];\nextern const u32 gMonBackPic_Psyduck[];\nextern const u32 gMonShinyPalette_Psyduck[];\nextern const u8 gMonIcon_Psyduck[];\nextern const u8 gMonFootprint_Psyduck[];\nextern const u32 gMonFrontPic_Golduck[];\nextern const u32 gMonPalette_Golduck[];\nextern const u32 gMonBackPic_Golduck[];\nextern const u32 gMonShinyPalette_Golduck[];\nextern const u8 gMonIcon_Golduck[];\nextern const u8 gMonFootprint_Golduck[];\nextern const u32 gMonFrontPic_Mankey[];\nextern const u32 gMonPalette_Mankey[];\nextern const u32 gMonBackPic_Mankey[];\nextern const u32 gMonShinyPalette_Mankey[];\nextern const u8 gMonIcon_Mankey[];\nextern const u8 gMonFootprint_Mankey[];\nextern const u32 gMonFrontPic_Primeape[];\nextern const u32 gMonPalette_Primeape[];\nextern const u32 gMonBackPic_Primeape[];\nextern const u32 gMonShinyPalette_Primeape[];\nextern const u8 gMonIcon_Primeape[];\nextern const u8 gMonFootprint_Primeape[];\nextern const u32 gMonFrontPic_Growlithe[];\nextern const u32 gMonPalette_Growlithe[];\nextern const u32 gMonBackPic_Growlithe[];\nextern const u32 gMonShinyPalette_Growlithe[];\nextern const u8 gMonIcon_Growlithe[];\nextern const u8 gMonFootprint_Growlithe[];\nextern const u32 gMonFrontPic_Arcanine[];\nextern const u32 gMonPalette_Arcanine[];\nextern const u32 gMonBackPic_Arcanine[];\nextern const u32 gMonShinyPalette_Arcanine[];\nextern const u8 gMonIcon_Arcanine[];\nextern const u8 gMonFootprint_Arcanine[];\nextern const u32 gMonFrontPic_Poliwag[];\nextern const u32 gMonPalette_Poliwag[];\nextern const u32 gMonBackPic_Poliwag[];\nextern const u32 gMonShinyPalette_Poliwag[];\nextern const u8 gMonIcon_Poliwag[];\nextern const u8 gMonFootprint_Poliwag[];\nextern const u32 gMonFrontPic_Poliwhirl[];\nextern const u32 gMonPalette_Poliwhirl[];\nextern const u32 gMonBackPic_Poliwhirl[];\nextern const u32 gMonShinyPalette_Poliwhirl[];\nextern const u8 gMonIcon_Poliwhirl[];\nextern const u8 gMonFootprint_Poliwhirl[];\nextern const u32 gMonFrontPic_Poliwrath[];\nextern const u32 gMonPalette_Poliwrath[];\nextern const u32 gMonBackPic_Poliwrath[];\nextern const u32 gMonShinyPalette_Poliwrath[];\nextern const u8 gMonIcon_Poliwrath[];\nextern const u8 gMonFootprint_Poliwrath[];\nextern const u32 gMonFrontPic_Abra[];\nextern const u32 gMonPalette_Abra[];\nextern const u32 gMonBackPic_Abra[];\nextern const u32 gMonShinyPalette_Abra[];\nextern const u8 gMonIcon_Abra[];\nextern const u8 gMonFootprint_Abra[];\nextern const u32 gMonFrontPic_Kadabra[];\nextern const u32 gMonPalette_Kadabra[];\nextern const u32 gMonBackPic_Kadabra[];\nextern const u32 gMonShinyPalette_Kadabra[];\nextern const u8 gMonIcon_Kadabra[];\nextern const u8 gMonFootprint_Kadabra[];\nextern const u32 gMonFrontPic_Alakazam[];\nextern const u32 gMonPalette_Alakazam[];\nextern const u32 gMonBackPic_Alakazam[];\nextern const u32 gMonShinyPalette_Alakazam[];\nextern const u8 gMonIcon_Alakazam[];\nextern const u8 gMonFootprint_Alakazam[];\nextern const u32 gMonFrontPic_Machop[];\nextern const u32 gMonPalette_Machop[];\nextern const u32 gMonBackPic_Machop[];\nextern const u32 gMonShinyPalette_Machop[];\nextern const u8 gMonIcon_Machop[];\nextern const u8 gMonFootprint_Machop[];\nextern const u32 gMonFrontPic_Machoke[];\nextern const u32 gMonPalette_Machoke[];\nextern const u32 gMonBackPic_Machoke[];\nextern const u32 gMonShinyPalette_Machoke[];\nextern const u8 gMonIcon_Machoke[];\nextern const u8 gMonFootprint_Machoke[];\nextern const u32 gMonFrontPic_Machamp[];\nextern const u32 gMonPalette_Machamp[];\nextern const u32 gMonBackPic_Machamp[];\nextern const u32 gMonShinyPalette_Machamp[];\nextern const u8 gMonIcon_Machamp[];\nextern const u8 gMonFootprint_Machamp[];\nextern const u32 gMonFrontPic_Bellsprout[];\nextern const u32 gMonPalette_Bellsprout[];\nextern const u32 gMonBackPic_Bellsprout[];\nextern const u32 gMonShinyPalette_Bellsprout[];\nextern const u8 gMonIcon_Bellsprout[];\nextern const u8 gMonFootprint_Bellsprout[];\nextern const u32 gMonFrontPic_Weepinbell[];\nextern const u32 gMonPalette_Weepinbell[];\nextern const u32 gMonBackPic_Weepinbell[];\nextern const u32 gMonShinyPalette_Weepinbell[];\nextern const u8 gMonIcon_Weepinbell[];\nextern const u8 gMonFootprint_Weepinbell[];\nextern const u32 gMonFrontPic_Victreebel[];\nextern const u32 gMonPalette_Victreebel[];\nextern const u32 gMonBackPic_Victreebel[];\nextern const u32 gMonShinyPalette_Victreebel[];\nextern const u8 gMonIcon_Victreebel[];\nextern const u8 gMonFootprint_Victreebel[];\nextern const u32 gMonFrontPic_Tentacool[];\nextern const u32 gMonPalette_Tentacool[];\nextern const u32 gMonBackPic_Tentacool[];\nextern const u32 gMonShinyPalette_Tentacool[];\nextern const u8 gMonIcon_Tentacool[];\nextern const u8 gMonFootprint_Tentacool[];\nextern const u32 gMonFrontPic_Tentacruel[];\nextern const u32 gMonPalette_Tentacruel[];\nextern const u32 gMonBackPic_Tentacruel[];\nextern const u32 gMonShinyPalette_Tentacruel[];\nextern const u8 gMonIcon_Tentacruel[];\nextern const u8 gMonFootprint_Tentacruel[];\nextern const u32 gMonFrontPic_Geodude[];\nextern const u32 gMonPalette_Geodude[];\nextern const u32 gMonBackPic_Geodude[];\nextern const u32 gMonShinyPalette_Geodude[];\nextern const u8 gMonIcon_Geodude[];\nextern const u8 gMonFootprint_Geodude[];\nextern const u32 gMonFrontPic_Graveler[];\nextern const u32 gMonPalette_Graveler[];\nextern const u32 gMonBackPic_Graveler[];\nextern const u32 gMonShinyPalette_Graveler[];\nextern const u8 gMonIcon_Graveler[];\nextern const u8 gMonFootprint_Graveler[];\nextern const u32 gMonFrontPic_Golem[];\nextern const u32 gMonPalette_Golem[];\nextern const u32 gMonBackPic_Golem[];\nextern const u32 gMonShinyPalette_Golem[];\nextern const u8 gMonIcon_Golem[];\nextern const u8 gMonFootprint_Golem[];\nextern const u32 gMonFrontPic_Ponyta[];\nextern const u32 gMonPalette_Ponyta[];\nextern const u32 gMonBackPic_Ponyta[];\nextern const u32 gMonShinyPalette_Ponyta[];\nextern const u8 gMonIcon_Ponyta[];\nextern const u8 gMonFootprint_Ponyta[];\nextern const u32 gMonFrontPic_Rapidash[];\nextern const u32 gMonPalette_Rapidash[];\nextern const u32 gMonBackPic_Rapidash[];\nextern const u32 gMonShinyPalette_Rapidash[];\nextern const u8 gMonIcon_Rapidash[];\nextern const u8 gMonFootprint_Rapidash[];\nextern const u32 gMonFrontPic_Slowpoke[];\nextern const u32 gMonPalette_Slowpoke[];\nextern const u32 gMonBackPic_Slowpoke[];\nextern const u32 gMonShinyPalette_Slowpoke[];\nextern const u8 gMonIcon_Slowpoke[];\nextern const u8 gMonFootprint_Slowpoke[];\nextern const u32 gMonFrontPic_Slowbro[];\nextern const u32 gMonPalette_Slowbro[];\nextern const u32 gMonBackPic_Slowbro[];\nextern const u32 gMonShinyPalette_Slowbro[];\nextern const u8 gMonIcon_Slowbro[];\nextern const u8 gMonFootprint_Slowbro[];\nextern const u32 gMonFrontPic_Magnemite[];\nextern const u32 gMonPalette_Magnemite[];\nextern const u32 gMonBackPic_Magnemite[];\nextern const u32 gMonShinyPalette_Magnemite[];\nextern const u8 gMonIcon_Magnemite[];\nextern const u8 gMonFootprint_Magnemite[];\nextern const u32 gMonFrontPic_Magneton[];\nextern const u32 gMonPalette_Magneton[];\nextern const u32 gMonBackPic_Magneton[];\nextern const u32 gMonShinyPalette_Magneton[];\nextern const u8 gMonIcon_Magneton[];\nextern const u8 gMonFootprint_Magneton[];\nextern const u32 gMonFrontPic_Farfetchd[];\nextern const u32 gMonPalette_Farfetchd[];\nextern const u32 gMonBackPic_Farfetchd[];\nextern const u32 gMonShinyPalette_Farfetchd[];\nextern const u8 gMonIcon_Farfetchd[];\nextern const u8 gMonFootprint_Farfetchd[];\nextern const u32 gMonFrontPic_Doduo[];\nextern const u32 gMonPalette_Doduo[];\nextern const u32 gMonBackPic_Doduo[];\nextern const u32 gMonShinyPalette_Doduo[];\nextern const u8 gMonIcon_Doduo[];\nextern const u8 gMonFootprint_Doduo[];\nextern const u32 gMonFrontPic_Dodrio[];\nextern const u32 gMonPalette_Dodrio[];\nextern const u32 gMonBackPic_Dodrio[];\nextern const u32 gMonShinyPalette_Dodrio[];\nextern const u8 gMonIcon_Dodrio[];\nextern const u8 gMonFootprint_Dodrio[];\nextern const u32 gMonFrontPic_Seel[];\nextern const u32 gMonPalette_Seel[];\nextern const u32 gMonBackPic_Seel[];\nextern const u32 gMonShinyPalette_Seel[];\nextern const u8 gMonIcon_Seel[];\nextern const u8 gMonFootprint_Seel[];\nextern const u32 gMonFrontPic_Dewgong[];\nextern const u32 gMonPalette_Dewgong[];\nextern const u32 gMonBackPic_Dewgong[];\nextern const u32 gMonShinyPalette_Dewgong[];\nextern const u8 gMonIcon_Dewgong[];\nextern const u8 gMonFootprint_Dewgong[];\nextern const u32 gMonFrontPic_Grimer[];\nextern const u32 gMonPalette_Grimer[];\nextern const u32 gMonBackPic_Grimer[];\nextern const u32 gMonShinyPalette_Grimer[];\nextern const u8 gMonIcon_Grimer[];\nextern const u8 gMonFootprint_Grimer[];\nextern const u32 gMonFrontPic_Muk[];\nextern const u32 gMonPalette_Muk[];\nextern const u32 gMonBackPic_Muk[];\nextern const u32 gMonShinyPalette_Muk[];\nextern const u8 gMonIcon_Muk[];\nextern const u8 gMonFootprint_Muk[];\nextern const u32 gMonFrontPic_Shellder[];\nextern const u32 gMonPalette_Shellder[];\nextern const u32 gMonBackPic_Shellder[];\nextern const u32 gMonShinyPalette_Shellder[];\nextern const u8 gMonIcon_Shellder[];\nextern const u8 gMonFootprint_Shellder[];\nextern const u32 gMonFrontPic_Cloyster[];\nextern const u32 gMonPalette_Cloyster[];\nextern const u32 gMonBackPic_Cloyster[];\nextern const u32 gMonShinyPalette_Cloyster[];\nextern const u8 gMonIcon_Cloyster[];\nextern const u8 gMonFootprint_Cloyster[];\nextern const u32 gMonFrontPic_Gastly[];\nextern const u32 gMonPalette_Gastly[];\nextern const u32 gMonBackPic_Gastly[];\nextern const u32 gMonShinyPalette_Gastly[];\nextern const u8 gMonIcon_Gastly[];\nextern const u8 gMonFootprint_Gastly[];\nextern const u32 gMonFrontPic_Haunter[];\nextern const u32 gMonPalette_Haunter[];\nextern const u32 gMonBackPic_Haunter[];\nextern const u32 gMonShinyPalette_Haunter[];\nextern const u8 gMonIcon_Haunter[];\nextern const u8 gMonFootprint_Haunter[];\nextern const u32 gMonFrontPic_Gengar[];\nextern const u32 gMonPalette_Gengar[];\nextern const u32 gMonBackPic_Gengar[];\nextern const u32 gMonShinyPalette_Gengar[];\nextern const u8 gMonIcon_Gengar[];\nextern const u8 gMonFootprint_Gengar[];\nextern const u32 gMonFrontPic_Onix[];\nextern const u32 gMonPalette_Onix[];\nextern const u32 gMonBackPic_Onix[];\nextern const u32 gMonShinyPalette_Onix[];\nextern const u8 gMonIcon_Onix[];\nextern const u8 gMonFootprint_Onix[];\nextern const u32 gMonFrontPic_Drowzee[];\nextern const u32 gMonPalette_Drowzee[];\nextern const u32 gMonBackPic_Drowzee[];\nextern const u32 gMonShinyPalette_Drowzee[];\nextern const u8 gMonIcon_Drowzee[];\nextern const u8 gMonFootprint_Drowzee[];\nextern const u32 gMonFrontPic_Hypno[];\nextern const u32 gMonPalette_Hypno[];\nextern const u32 gMonBackPic_Hypno[];\nextern const u32 gMonShinyPalette_Hypno[];\nextern const u8 gMonIcon_Hypno[];\nextern const u8 gMonFootprint_Hypno[];\nextern const u32 gMonFrontPic_Krabby[];\nextern const u32 gMonPalette_Krabby[];\nextern const u32 gMonBackPic_Krabby[];\nextern const u32 gMonShinyPalette_Krabby[];\nextern const u8 gMonIcon_Krabby[];\nextern const u8 gMonFootprint_Krabby[];\nextern const u32 gMonFrontPic_Kingler[];\nextern const u32 gMonPalette_Kingler[];\nextern const u32 gMonBackPic_Kingler[];\nextern const u32 gMonShinyPalette_Kingler[];\nextern const u8 gMonIcon_Kingler[];\nextern const u8 gMonFootprint_Kingler[];\nextern const u32 gMonFrontPic_Voltorb[];\nextern const u32 gMonPalette_Voltorb[];\nextern const u32 gMonBackPic_Voltorb[];\nextern const u32 gMonShinyPalette_Voltorb[];\nextern const u8 gMonIcon_Voltorb[];\nextern const u8 gMonFootprint_Voltorb[];\nextern const u32 gMonFrontPic_Electrode[];\nextern const u32 gMonPalette_Electrode[];\nextern const u32 gMonBackPic_Electrode[];\nextern const u32 gMonShinyPalette_Electrode[];\nextern const u8 gMonIcon_Electrode[];\nextern const u8 gMonFootprint_Electrode[];\nextern const u32 gMonFrontPic_Exeggcute[];\nextern const u32 gMonPalette_Exeggcute[];\nextern const u32 gMonBackPic_Exeggcute[];\nextern const u32 gMonShinyPalette_Exeggcute[];\nextern const u8 gMonIcon_Exeggcute[];\nextern const u8 gMonFootprint_Exeggcute[];\nextern const u32 gMonFrontPic_Exeggutor[];\nextern const u32 gMonPalette_Exeggutor[];\nextern const u32 gMonBackPic_Exeggutor[];\nextern const u32 gMonShinyPalette_Exeggutor[];\nextern const u8 gMonIcon_Exeggutor[];\nextern const u8 gMonFootprint_Exeggutor[];\nextern const u32 gMonFrontPic_Cubone[];\nextern const u32 gMonPalette_Cubone[];\nextern const u32 gMonBackPic_Cubone[];\nextern const u32 gMonShinyPalette_Cubone[];\nextern const u8 gMonIcon_Cubone[];\nextern const u8 gMonFootprint_Cubone[];\nextern const u32 gMonFrontPic_Marowak[];\nextern const u32 gMonPalette_Marowak[];\nextern const u32 gMonBackPic_Marowak[];\nextern const u32 gMonShinyPalette_Marowak[];\nextern const u8 gMonIcon_Marowak[];\nextern const u8 gMonFootprint_Marowak[];\nextern const u32 gMonFrontPic_Hitmonlee[];\nextern const u32 gMonPalette_Hitmonlee[];\nextern const u32 gMonBackPic_Hitmonlee[];\nextern const u32 gMonShinyPalette_Hitmonlee[];\nextern const u8 gMonIcon_Hitmonlee[];\nextern const u8 gMonFootprint_Hitmonlee[];\nextern const u32 gMonFrontPic_Hitmonchan[];\nextern const u32 gMonPalette_Hitmonchan[];\nextern const u32 gMonBackPic_Hitmonchan[];\nextern const u32 gMonShinyPalette_Hitmonchan[];\nextern const u8 gMonIcon_Hitmonchan[];\nextern const u8 gMonFootprint_Hitmonchan[];\nextern const u32 gMonFrontPic_Lickitung[];\nextern const u32 gMonPalette_Lickitung[];\nextern const u32 gMonBackPic_Lickitung[];\nextern const u32 gMonShinyPalette_Lickitung[];\nextern const u8 gMonIcon_Lickitung[];\nextern const u8 gMonFootprint_Lickitung[];\nextern const u32 gMonFrontPic_Koffing[];\nextern const u32 gMonPalette_Koffing[];\nextern const u32 gMonBackPic_Koffing[];\nextern const u32 gMonShinyPalette_Koffing[];\nextern const u8 gMonIcon_Koffing[];\nextern const u8 gMonFootprint_Koffing[];\nextern const u32 gMonFrontPic_Weezing[];\nextern const u32 gMonPalette_Weezing[];\nextern const u32 gMonBackPic_Weezing[];\nextern const u32 gMonShinyPalette_Weezing[];\nextern const u8 gMonIcon_Weezing[];\nextern const u8 gMonFootprint_Weezing[];\nextern const u32 gMonFrontPic_Rhyhorn[];\nextern const u32 gMonPalette_Rhyhorn[];\nextern const u32 gMonBackPic_Rhyhorn[];\nextern const u32 gMonShinyPalette_Rhyhorn[];\nextern const u8 gMonIcon_Rhyhorn[];\nextern const u8 gMonFootprint_Rhyhorn[];\nextern const u32 gMonFrontPic_Rhydon[];\nextern const u32 gMonPalette_Rhydon[];\nextern const u32 gMonBackPic_Rhydon[];\nextern const u32 gMonShinyPalette_Rhydon[];\nextern const u8 gMonIcon_Rhydon[];\nextern const u8 gMonFootprint_Rhydon[];\nextern const u32 gMonFrontPic_Chansey[];\nextern const u32 gMonPalette_Chansey[];\nextern const u32 gMonBackPic_Chansey[];\nextern const u32 gMonShinyPalette_Chansey[];\nextern const u8 gMonIcon_Chansey[];\nextern const u8 gMonFootprint_Chansey[];\nextern const u32 gMonFrontPic_Tangela[];\nextern const u32 gMonPalette_Tangela[];\nextern const u32 gMonBackPic_Tangela[];\nextern const u32 gMonShinyPalette_Tangela[];\nextern const u8 gMonIcon_Tangela[];\nextern const u8 gMonFootprint_Tangela[];\nextern const u32 gMonFrontPic_Kangaskhan[];\nextern const u32 gMonPalette_Kangaskhan[];\nextern const u32 gMonBackPic_Kangaskhan[];\nextern const u32 gMonShinyPalette_Kangaskhan[];\nextern const u8 gMonIcon_Kangaskhan[];\nextern const u8 gMonFootprint_Kangaskhan[];\nextern const u32 gMonFrontPic_Horsea[];\nextern const u32 gMonPalette_Horsea[];\nextern const u32 gMonBackPic_Horsea[];\nextern const u32 gMonShinyPalette_Horsea[];\nextern const u8 gMonIcon_Horsea[];\nextern const u8 gMonFootprint_Horsea[];\nextern const u32 gMonFrontPic_Seadra[];\nextern const u32 gMonPalette_Seadra[];\nextern const u32 gMonBackPic_Seadra[];\nextern const u32 gMonShinyPalette_Seadra[];\nextern const u8 gMonIcon_Seadra[];\nextern const u8 gMonFootprint_Seadra[];\nextern const u32 gMonFrontPic_Goldeen[];\nextern const u32 gMonPalette_Goldeen[];\nextern const u32 gMonBackPic_Goldeen[];\nextern const u32 gMonShinyPalette_Goldeen[];\nextern const u8 gMonIcon_Goldeen[];\nextern const u8 gMonFootprint_Goldeen[];\nextern const u32 gMonFrontPic_Seaking[];\nextern const u32 gMonPalette_Seaking[];\nextern const u32 gMonBackPic_Seaking[];\nextern const u32 gMonShinyPalette_Seaking[];\nextern const u8 gMonIcon_Seaking[];\nextern const u8 gMonFootprint_Seaking[];\nextern const u32 gMonFrontPic_Staryu[];\nextern const u32 gMonPalette_Staryu[];\nextern const u32 gMonBackPic_Staryu[];\nextern const u32 gMonShinyPalette_Staryu[];\nextern const u8 gMonIcon_Staryu[];\nextern const u8 gMonFootprint_Staryu[];\nextern const u32 gMonFrontPic_Starmie[];\nextern const u32 gMonPalette_Starmie[];\nextern const u32 gMonBackPic_Starmie[];\nextern const u32 gMonShinyPalette_Starmie[];\nextern const u8 gMonIcon_Starmie[];\nextern const u8 gMonFootprint_Starmie[];\nextern const u32 gMonFrontPic_Mrmime[];\nextern const u32 gMonPalette_Mrmime[];\nextern const u32 gMonBackPic_Mrmime[];\nextern const u32 gMonShinyPalette_Mrmime[];\nextern const u8 gMonIcon_Mrmime[];\nextern const u8 gMonFootprint_Mrmime[];\nextern const u32 gMonFrontPic_Scyther[];\nextern const u32 gMonPalette_Scyther[];\nextern const u32 gMonBackPic_Scyther[];\nextern const u32 gMonShinyPalette_Scyther[];\nextern const u8 gMonIcon_Scyther[];\nextern const u8 gMonFootprint_Scyther[];\nextern const u32 gMonFrontPic_Jynx[];\nextern const u32 gMonPalette_Jynx[];\nextern const u32 gMonBackPic_Jynx[];\nextern const u32 gMonShinyPalette_Jynx[];\nextern const u8 gMonIcon_Jynx[];\nextern const u8 gMonFootprint_Jynx[];\nextern const u32 gMonFrontPic_Electabuzz[];\nextern const u32 gMonPalette_Electabuzz[];\nextern const u32 gMonBackPic_Electabuzz[];\nextern const u32 gMonShinyPalette_Electabuzz[];\nextern const u8 gMonIcon_Electabuzz[];\nextern const u8 gMonFootprint_Electabuzz[];\nextern const u32 gMonFrontPic_Magmar[];\nextern const u32 gMonPalette_Magmar[];\nextern const u32 gMonBackPic_Magmar[];\nextern const u32 gMonShinyPalette_Magmar[];\nextern const u8 gMonIcon_Magmar[];\nextern const u8 gMonFootprint_Magmar[];\nextern const u32 gMonFrontPic_Pinsir[];\nextern const u32 gMonPalette_Pinsir[];\nextern const u32 gMonBackPic_Pinsir[];\nextern const u32 gMonShinyPalette_Pinsir[];\nextern const u8 gMonIcon_Pinsir[];\nextern const u8 gMonFootprint_Pinsir[];\nextern const u32 gMonFrontPic_Tauros[];\nextern const u32 gMonPalette_Tauros[];\nextern const u32 gMonBackPic_Tauros[];\nextern const u32 gMonShinyPalette_Tauros[];\nextern const u8 gMonIcon_Tauros[];\nextern const u8 gMonFootprint_Tauros[];\nextern const u32 gMonFrontPic_Magikarp[];\nextern const u32 gMonPalette_Magikarp[];\nextern const u32 gMonBackPic_Magikarp[];\nextern const u32 gMonShinyPalette_Magikarp[];\nextern const u8 gMonIcon_Magikarp[];\nextern const u8 gMonFootprint_Magikarp[];\nextern const u32 gMonFrontPic_Gyarados[];\nextern const u32 gMonPalette_Gyarados[];\nextern const u32 gMonBackPic_Gyarados[];\nextern const u32 gMonShinyPalette_Gyarados[];\nextern const u8 gMonIcon_Gyarados[];\nextern const u8 gMonFootprint_Gyarados[];\nextern const u32 gMonFrontPic_Lapras[];\nextern const u32 gMonPalette_Lapras[];\nextern const u32 gMonBackPic_Lapras[];\nextern const u32 gMonShinyPalette_Lapras[];\nextern const u8 gMonIcon_Lapras[];\nextern const u8 gMonFootprint_Lapras[];\nextern const u32 gMonFrontPic_Ditto[];\nextern const u32 gMonPalette_Ditto[];\nextern const u32 gMonBackPic_Ditto[];\nextern const u32 gMonShinyPalette_Ditto[];\nextern const u8 gMonIcon_Ditto[];\nextern const u8 gMonFootprint_Ditto[];\nextern const u32 gMonFrontPic_Eevee[];\nextern const u32 gMonPalette_Eevee[];\nextern const u32 gMonBackPic_Eevee[];\nextern const u32 gMonShinyPalette_Eevee[];\nextern const u8 gMonIcon_Eevee[];\nextern const u8 gMonFootprint_Eevee[];\nextern const u32 gMonFrontPic_Vaporeon[];\nextern const u32 gMonPalette_Vaporeon[];\nextern const u32 gMonBackPic_Vaporeon[];\nextern const u32 gMonShinyPalette_Vaporeon[];\nextern const u8 gMonIcon_Vaporeon[];\nextern const u8 gMonFootprint_Vaporeon[];\nextern const u32 gMonFrontPic_Jolteon[];\nextern const u32 gMonPalette_Jolteon[];\nextern const u32 gMonBackPic_Jolteon[];\nextern const u32 gMonShinyPalette_Jolteon[];\nextern const u8 gMonIcon_Jolteon[];\nextern const u8 gMonFootprint_Jolteon[];\nextern const u32 gMonFrontPic_Flareon[];\nextern const u32 gMonPalette_Flareon[];\nextern const u32 gMonBackPic_Flareon[];\nextern const u32 gMonShinyPalette_Flareon[];\nextern const u8 gMonIcon_Flareon[];\nextern const u8 gMonFootprint_Flareon[];\nextern const u32 gMonFrontPic_Porygon[];\nextern const u32 gMonPalette_Porygon[];\nextern const u32 gMonBackPic_Porygon[];\nextern const u32 gMonShinyPalette_Porygon[];\nextern const u8 gMonIcon_Porygon[];\nextern const u8 gMonFootprint_Porygon[];\nextern const u32 gMonFrontPic_Omanyte[];\nextern const u32 gMonPalette_Omanyte[];\nextern const u32 gMonBackPic_Omanyte[];\nextern const u32 gMonShinyPalette_Omanyte[];\nextern const u8 gMonIcon_Omanyte[];\nextern const u8 gMonFootprint_Omanyte[];\nextern const u32 gMonFrontPic_Omastar[];\nextern const u32 gMonPalette_Omastar[];\nextern const u32 gMonBackPic_Omastar[];\nextern const u32 gMonShinyPalette_Omastar[];\nextern const u8 gMonIcon_Omastar[];\nextern const u8 gMonFootprint_Omastar[];\nextern const u32 gMonFrontPic_Kabuto[];\nextern const u32 gMonPalette_Kabuto[];\nextern const u32 gMonBackPic_Kabuto[];\nextern const u32 gMonShinyPalette_Kabuto[];\nextern const u8 gMonIcon_Kabuto[];\nextern const u8 gMonFootprint_Kabuto[];\nextern const u32 gMonFrontPic_Kabutops[];\nextern const u32 gMonPalette_Kabutops[];\nextern const u32 gMonBackPic_Kabutops[];\nextern const u32 gMonShinyPalette_Kabutops[];\nextern const u8 gMonIcon_Kabutops[];\nextern const u8 gMonFootprint_Kabutops[];\nextern const u32 gMonFrontPic_Aerodactyl[];\nextern const u32 gMonPalette_Aerodactyl[];\nextern const u32 gMonBackPic_Aerodactyl[];\nextern const u32 gMonShinyPalette_Aerodactyl[];\nextern const u8 gMonIcon_Aerodactyl[];\nextern const u8 gMonFootprint_Aerodactyl[];\nextern const u32 gMonFrontPic_Snorlax[];\nextern const u32 gMonPalette_Snorlax[];\nextern const u32 gMonBackPic_Snorlax[];\nextern const u32 gMonShinyPalette_Snorlax[];\nextern const u8 gMonIcon_Snorlax[];\nextern const u8 gMonFootprint_Snorlax[];\nextern const u32 gMonFrontPic_Articuno[];\nextern const u32 gMonPalette_Articuno[];\nextern const u32 gMonBackPic_Articuno[];\nextern const u32 gMonShinyPalette_Articuno[];\nextern const u8 gMonIcon_Articuno[];\nextern const u8 gMonFootprint_Articuno[];\nextern const u32 gMonFrontPic_Zapdos[];\nextern const u32 gMonPalette_Zapdos[];\nextern const u32 gMonBackPic_Zapdos[];\nextern const u32 gMonShinyPalette_Zapdos[];\nextern const u8 gMonIcon_Zapdos[];\nextern const u8 gMonFootprint_Zapdos[];\nextern const u32 gMonFrontPic_Moltres[];\nextern const u32 gMonPalette_Moltres[];\nextern const u32 gMonBackPic_Moltres[];\nextern const u32 gMonShinyPalette_Moltres[];\nextern const u8 gMonIcon_Moltres[];\nextern const u8 gMonFootprint_Moltres[];\nextern const u32 gMonFrontPic_Dratini[];\nextern const u32 gMonPalette_Dratini[];\nextern const u32 gMonBackPic_Dratini[];\nextern const u32 gMonShinyPalette_Dratini[];\nextern const u8 gMonIcon_Dratini[];\nextern const u8 gMonFootprint_Dratini[];\nextern const u32 gMonFrontPic_Dragonair[];\nextern const u32 gMonPalette_Dragonair[];\nextern const u32 gMonBackPic_Dragonair[];\nextern const u32 gMonShinyPalette_Dragonair[];\nextern const u8 gMonIcon_Dragonair[];\nextern const u8 gMonFootprint_Dragonair[];\nextern const u32 gMonFrontPic_Dragonite[];\nextern const u32 gMonPalette_Dragonite[];\nextern const u32 gMonBackPic_Dragonite[];\nextern const u32 gMonShinyPalette_Dragonite[];\nextern const u8 gMonIcon_Dragonite[];\nextern const u8 gMonFootprint_Dragonite[];\nextern const u32 gMonFrontPic_Mewtwo[];\nextern const u32 gMonPalette_Mewtwo[];\nextern const u32 gMonBackPic_Mewtwo[];\nextern const u32 gMonShinyPalette_Mewtwo[];\nextern const u8 gMonIcon_Mewtwo[];\nextern const u8 gMonFootprint_Mewtwo[];\nextern const u32 gMonFrontPic_Mew[];\nextern const u32 gMonPalette_Mew[];\nextern const u32 gMonBackPic_Mew[];\nextern const u32 gMonShinyPalette_Mew[];\nextern const u8 gMonIcon_Mew[];\nextern const u8 gMonFootprint_Mew[];\nextern const u32 gMonFrontPic_Chikorita[];\nextern const u32 gMonPalette_Chikorita[];\nextern const u32 gMonBackPic_Chikorita[];\nextern const u32 gMonShinyPalette_Chikorita[];\nextern const u8 gMonIcon_Chikorita[];\nextern const u8 gMonFootprint_Chikorita[];\nextern const u32 gMonFrontPic_Bayleef[];\nextern const u32 gMonPalette_Bayleef[];\nextern const u32 gMonBackPic_Bayleef[];\nextern const u32 gMonShinyPalette_Bayleef[];\nextern const u8 gMonIcon_Bayleef[];\nextern const u8 gMonFootprint_Bayleef[];\nextern const u32 gMonFrontPic_Meganium[];\nextern const u32 gMonPalette_Meganium[];\nextern const u32 gMonBackPic_Meganium[];\nextern const u32 gMonShinyPalette_Meganium[];\nextern const u8 gMonIcon_Meganium[];\nextern const u8 gMonFootprint_Meganium[];\nextern const u32 gMonFrontPic_Cyndaquil[];\nextern const u32 gMonPalette_Cyndaquil[];\nextern const u32 gMonBackPic_Cyndaquil[];\nextern const u32 gMonShinyPalette_Cyndaquil[];\nextern const u8 gMonIcon_Cyndaquil[];\nextern const u8 gMonFootprint_Cyndaquil[];\nextern const u32 gMonFrontPic_Quilava[];\nextern const u32 gMonPalette_Quilava[];\nextern const u32 gMonBackPic_Quilava[];\nextern const u32 gMonShinyPalette_Quilava[];\nextern const u8 gMonIcon_Quilava[];\nextern const u8 gMonFootprint_Quilava[];\nextern const u32 gMonFrontPic_Typhlosion[];\nextern const u32 gMonPalette_Typhlosion[];\nextern const u32 gMonBackPic_Typhlosion[];\nextern const u32 gMonShinyPalette_Typhlosion[];\nextern const u8 gMonIcon_Typhlosion[];\nextern const u8 gMonFootprint_Typhlosion[];\nextern const u32 gMonFrontPic_Totodile[];\nextern const u32 gMonPalette_Totodile[];\nextern const u32 gMonBackPic_Totodile[];\nextern const u32 gMonShinyPalette_Totodile[];\nextern const u8 gMonIcon_Totodile[];\nextern const u8 gMonFootprint_Totodile[];\nextern const u32 gMonFrontPic_Croconaw[];\nextern const u32 gMonPalette_Croconaw[];\nextern const u32 gMonBackPic_Croconaw[];\nextern const u32 gMonShinyPalette_Croconaw[];\nextern const u8 gMonIcon_Croconaw[];\nextern const u8 gMonFootprint_Croconaw[];\nextern const u32 gMonFrontPic_Feraligatr[];\nextern const u32 gMonPalette_Feraligatr[];\nextern const u32 gMonBackPic_Feraligatr[];\nextern const u32 gMonShinyPalette_Feraligatr[];\nextern const u8 gMonIcon_Feraligatr[];\nextern const u8 gMonFootprint_Feraligatr[];\nextern const u32 gMonFrontPic_Sentret[];\nextern const u32 gMonPalette_Sentret[];\nextern const u32 gMonBackPic_Sentret[];\nextern const u32 gMonShinyPalette_Sentret[];\nextern const u8 gMonIcon_Sentret[];\nextern const u8 gMonFootprint_Sentret[];\nextern const u32 gMonFrontPic_Furret[];\nextern const u32 gMonPalette_Furret[];\nextern const u32 gMonBackPic_Furret[];\nextern const u32 gMonShinyPalette_Furret[];\nextern const u8 gMonIcon_Furret[];\nextern const u8 gMonFootprint_Furret[];\nextern const u32 gMonFrontPic_Hoothoot[];\nextern const u32 gMonPalette_Hoothoot[];\nextern const u32 gMonBackPic_Hoothoot[];\nextern const u32 gMonShinyPalette_Hoothoot[];\nextern const u8 gMonIcon_Hoothoot[];\nextern const u8 gMonFootprint_Hoothoot[];\nextern const u32 gMonFrontPic_Noctowl[];\nextern const u32 gMonPalette_Noctowl[];\nextern const u32 gMonBackPic_Noctowl[];\nextern const u32 gMonShinyPalette_Noctowl[];\nextern const u8 gMonIcon_Noctowl[];\nextern const u8 gMonFootprint_Noctowl[];\nextern const u32 gMonFrontPic_Ledyba[];\nextern const u32 gMonPalette_Ledyba[];\nextern const u32 gMonBackPic_Ledyba[];\nextern const u32 gMonShinyPalette_Ledyba[];\nextern const u8 gMonIcon_Ledyba[];\nextern const u8 gMonFootprint_Ledyba[];\nextern const u32 gMonFrontPic_Ledian[];\nextern const u32 gMonPalette_Ledian[];\nextern const u32 gMonBackPic_Ledian[];\nextern const u32 gMonShinyPalette_Ledian[];\nextern const u8 gMonIcon_Ledian[];\nextern const u8 gMonFootprint_Ledian[];\nextern const u32 gMonFrontPic_Spinarak[];\nextern const u32 gMonPalette_Spinarak[];\nextern const u32 gMonBackPic_Spinarak[];\nextern const u32 gMonShinyPalette_Spinarak[];\nextern const u8 gMonIcon_Spinarak[];\nextern const u8 gMonFootprint_Spinarak[];\nextern const u32 gMonFrontPic_Ariados[];\nextern const u32 gMonPalette_Ariados[];\nextern const u32 gMonBackPic_Ariados[];\nextern const u32 gMonShinyPalette_Ariados[];\nextern const u8 gMonIcon_Ariados[];\nextern const u8 gMonFootprint_Ariados[];\nextern const u32 gMonFrontPic_Crobat[];\nextern const u32 gMonPalette_Crobat[];\nextern const u32 gMonBackPic_Crobat[];\nextern const u32 gMonShinyPalette_Crobat[];\nextern const u8 gMonIcon_Crobat[];\nextern const u8 gMonFootprint_Crobat[];\nextern const u32 gMonFrontPic_Chinchou[];\nextern const u32 gMonPalette_Chinchou[];\nextern const u32 gMonBackPic_Chinchou[];\nextern const u32 gMonShinyPalette_Chinchou[];\nextern const u8 gMonIcon_Chinchou[];\nextern const u8 gMonFootprint_Chinchou[];\nextern const u32 gMonFrontPic_Lanturn[];\nextern const u32 gMonPalette_Lanturn[];\nextern const u32 gMonBackPic_Lanturn[];\nextern const u32 gMonShinyPalette_Lanturn[];\nextern const u8 gMonIcon_Lanturn[];\nextern const u8 gMonFootprint_Lanturn[];\nextern const u32 gMonFrontPic_Pichu[];\nextern const u32 gMonPalette_Pichu[];\nextern const u32 gMonBackPic_Pichu[];\nextern const u32 gMonShinyPalette_Pichu[];\nextern const u8 gMonIcon_Pichu[];\nextern const u8 gMonFootprint_Pichu[];\nextern const u32 gMonFrontPic_Cleffa[];\nextern const u32 gMonPalette_Cleffa[];\nextern const u32 gMonBackPic_Cleffa[];\nextern const u32 gMonShinyPalette_Cleffa[];\nextern const u8 gMonIcon_Cleffa[];\nextern const u8 gMonFootprint_Cleffa[];\nextern const u32 gMonFrontPic_Igglybuff[];\nextern const u32 gMonPalette_Igglybuff[];\nextern const u32 gMonBackPic_Igglybuff[];\nextern const u32 gMonShinyPalette_Igglybuff[];\nextern const u8 gMonIcon_Igglybuff[];\nextern const u8 gMonFootprint_Igglybuff[];\nextern const u32 gMonFrontPic_Togepi[];\nextern const u32 gMonPalette_Togepi[];\nextern const u32 gMonBackPic_Togepi[];\nextern const u32 gMonShinyPalette_Togepi[];\nextern const u8 gMonIcon_Togepi[];\nextern const u8 gMonFootprint_Togepi[];\nextern const u32 gMonFrontPic_Togetic[];\nextern const u32 gMonPalette_Togetic[];\nextern const u32 gMonBackPic_Togetic[];\nextern const u32 gMonShinyPalette_Togetic[];\nextern const u8 gMonIcon_Togetic[];\nextern const u8 gMonFootprint_Togetic[];\nextern const u32 gMonFrontPic_Natu[];\nextern const u32 gMonPalette_Natu[];\nextern const u32 gMonBackPic_Natu[];\nextern const u32 gMonShinyPalette_Natu[];\nextern const u8 gMonIcon_Natu[];\nextern const u8 gMonFootprint_Natu[];\nextern const u32 gMonFrontPic_Xatu[];\nextern const u32 gMonPalette_Xatu[];\nextern const u32 gMonBackPic_Xatu[];\nextern const u32 gMonShinyPalette_Xatu[];\nextern const u8 gMonIcon_Xatu[];\nextern const u8 gMonFootprint_Xatu[];\nextern const u32 gMonFrontPic_Mareep[];\nextern const u32 gMonPalette_Mareep[];\nextern const u32 gMonBackPic_Mareep[];\nextern const u32 gMonShinyPalette_Mareep[];\nextern const u8 gMonIcon_Mareep[];\nextern const u8 gMonFootprint_Mareep[];\nextern const u32 gMonFrontPic_Flaaffy[];\nextern const u32 gMonPalette_Flaaffy[];\nextern const u32 gMonBackPic_Flaaffy[];\nextern const u32 gMonShinyPalette_Flaaffy[];\nextern const u8 gMonIcon_Flaaffy[];\nextern const u8 gMonFootprint_Flaaffy[];\nextern const u32 gMonFrontPic_Ampharos[];\nextern const u32 gMonPalette_Ampharos[];\nextern const u32 gMonBackPic_Ampharos[];\nextern const u32 gMonShinyPalette_Ampharos[];\nextern const u8 gMonIcon_Ampharos[];\nextern const u8 gMonFootprint_Ampharos[];\nextern const u32 gMonFrontPic_Bellossom[];\nextern const u32 gMonPalette_Bellossom[];\nextern const u32 gMonBackPic_Bellossom[];\nextern const u32 gMonShinyPalette_Bellossom[];\nextern const u8 gMonIcon_Bellossom[];\nextern const u8 gMonFootprint_Bellossom[];\nextern const u32 gMonFrontPic_Marill[];\nextern const u32 gMonPalette_Marill[];\nextern const u32 gMonBackPic_Marill[];\nextern const u32 gMonShinyPalette_Marill[];\nextern const u8 gMonIcon_Marill[];\nextern const u8 gMonFootprint_Marill[];\nextern const u32 gMonFrontPic_Azumarill[];\nextern const u32 gMonPalette_Azumarill[];\nextern const u32 gMonBackPic_Azumarill[];\nextern const u32 gMonShinyPalette_Azumarill[];\nextern const u8 gMonIcon_Azumarill[];\nextern const u8 gMonFootprint_Azumarill[];\nextern const u32 gMonFrontPic_Sudowoodo[];\nextern const u32 gMonPalette_Sudowoodo[];\nextern const u32 gMonBackPic_Sudowoodo[];\nextern const u32 gMonShinyPalette_Sudowoodo[];\nextern const u8 gMonIcon_Sudowoodo[];\nextern const u8 gMonFootprint_Sudowoodo[];\nextern const u32 gMonFrontPic_Politoed[];\nextern const u32 gMonPalette_Politoed[];\nextern const u32 gMonBackPic_Politoed[];\nextern const u32 gMonShinyPalette_Politoed[];\nextern const u8 gMonIcon_Politoed[];\nextern const u8 gMonFootprint_Politoed[];\nextern const u32 gMonFrontPic_Hoppip[];\nextern const u32 gMonPalette_Hoppip[];\nextern const u32 gMonBackPic_Hoppip[];\nextern const u32 gMonShinyPalette_Hoppip[];\nextern const u8 gMonIcon_Hoppip[];\nextern const u8 gMonFootprint_Hoppip[];\nextern const u32 gMonFrontPic_Skiploom[];\nextern const u32 gMonPalette_Skiploom[];\nextern const u32 gMonBackPic_Skiploom[];\nextern const u32 gMonShinyPalette_Skiploom[];\nextern const u8 gMonIcon_Skiploom[];\nextern const u8 gMonFootprint_Skiploom[];\nextern const u32 gMonFrontPic_Jumpluff[];\nextern const u32 gMonPalette_Jumpluff[];\nextern const u32 gMonBackPic_Jumpluff[];\nextern const u32 gMonShinyPalette_Jumpluff[];\nextern const u8 gMonIcon_Jumpluff[];\nextern const u8 gMonFootprint_Jumpluff[];\nextern const u32 gMonFrontPic_Aipom[];\nextern const u32 gMonPalette_Aipom[];\nextern const u32 gMonBackPic_Aipom[];\nextern const u32 gMonShinyPalette_Aipom[];\nextern const u8 gMonIcon_Aipom[];\nextern const u8 gMonFootprint_Aipom[];\nextern const u32 gMonFrontPic_Sunkern[];\nextern const u32 gMonPalette_Sunkern[];\nextern const u32 gMonBackPic_Sunkern[];\nextern const u32 gMonShinyPalette_Sunkern[];\nextern const u8 gMonIcon_Sunkern[];\nextern const u8 gMonFootprint_Sunkern[];\nextern const u32 gMonFrontPic_Sunflora[];\nextern const u32 gMonPalette_Sunflora[];\nextern const u32 gMonBackPic_Sunflora[];\nextern const u32 gMonShinyPalette_Sunflora[];\nextern const u8 gMonIcon_Sunflora[];\nextern const u8 gMonFootprint_Sunflora[];\nextern const u32 gMonFrontPic_Yanma[];\nextern const u32 gMonPalette_Yanma[];\nextern const u32 gMonBackPic_Yanma[];\nextern const u32 gMonShinyPalette_Yanma[];\nextern const u8 gMonIcon_Yanma[];\nextern const u8 gMonFootprint_Yanma[];\nextern const u32 gMonFrontPic_Wooper[];\nextern const u32 gMonPalette_Wooper[];\nextern const u32 gMonBackPic_Wooper[];\nextern const u32 gMonShinyPalette_Wooper[];\nextern const u8 gMonIcon_Wooper[];\nextern const u8 gMonFootprint_Wooper[];\nextern const u32 gMonFrontPic_Quagsire[];\nextern const u32 gMonPalette_Quagsire[];\nextern const u32 gMonBackPic_Quagsire[];\nextern const u32 gMonShinyPalette_Quagsire[];\nextern const u8 gMonIcon_Quagsire[];\nextern const u8 gMonFootprint_Quagsire[];\nextern const u32 gMonFrontPic_Espeon[];\nextern const u32 gMonPalette_Espeon[];\nextern const u32 gMonBackPic_Espeon[];\nextern const u32 gMonShinyPalette_Espeon[];\nextern const u8 gMonIcon_Espeon[];\nextern const u8 gMonFootprint_Espeon[];\nextern const u32 gMonFrontPic_Umbreon[];\nextern const u32 gMonPalette_Umbreon[];\nextern const u32 gMonBackPic_Umbreon[];\nextern const u32 gMonShinyPalette_Umbreon[];\nextern const u8 gMonIcon_Umbreon[];\nextern const u8 gMonFootprint_Umbreon[];\nextern const u32 gMonFrontPic_Murkrow[];\nextern const u32 gMonPalette_Murkrow[];\nextern const u32 gMonBackPic_Murkrow[];\nextern const u32 gMonShinyPalette_Murkrow[];\nextern const u8 gMonIcon_Murkrow[];\nextern const u8 gMonFootprint_Murkrow[];\nextern const u32 gMonFrontPic_Slowking[];\nextern const u32 gMonPalette_Slowking[];\nextern const u32 gMonBackPic_Slowking[];\nextern const u32 gMonShinyPalette_Slowking[];\nextern const u8 gMonIcon_Slowking[];\nextern const u8 gMonFootprint_Slowking[];\nextern const u32 gMonFrontPic_Misdreavus[];\nextern const u32 gMonPalette_Misdreavus[];\nextern const u32 gMonBackPic_Misdreavus[];\nextern const u32 gMonShinyPalette_Misdreavus[];\nextern const u8 gMonIcon_Misdreavus[];\nextern const u8 gMonFootprint_Misdreavus[];\nextern const u32 gMonFrontPic_UnownA[];\nextern const u32 gMonPalette_Unown[];\nextern const u32 gMonBackPic_UnownA[];\nextern const u32 gMonShinyPalette_Unown[];\nextern const u8 gMonIcon_UnownA[];\nextern const u8 gMonFootprint_Unown[];\nextern const u32 gMonFrontPic_Wobbuffet[];\nextern const u32 gMonPalette_Wobbuffet[];\nextern const u32 gMonBackPic_Wobbuffet[];\nextern const u32 gMonShinyPalette_Wobbuffet[];\nextern const u8 gMonIcon_Wobbuffet[];\nextern const u8 gMonFootprint_Wobbuffet[];\nextern const u32 gMonFrontPic_Girafarig[];\nextern const u32 gMonPalette_Girafarig[];\nextern const u32 gMonBackPic_Girafarig[];\nextern const u32 gMonShinyPalette_Girafarig[];\nextern const u8 gMonIcon_Girafarig[];\nextern const u8 gMonFootprint_Girafarig[];\nextern const u32 gMonFrontPic_Pineco[];\nextern const u32 gMonPalette_Pineco[];\nextern const u32 gMonBackPic_Pineco[];\nextern const u32 gMonShinyPalette_Pineco[];\nextern const u8 gMonIcon_Pineco[];\nextern const u8 gMonFootprint_Pineco[];\nextern const u32 gMonFrontPic_Forretress[];\nextern const u32 gMonPalette_Forretress[];\nextern const u32 gMonBackPic_Forretress[];\nextern const u32 gMonShinyPalette_Forretress[];\nextern const u8 gMonIcon_Forretress[];\nextern const u8 gMonFootprint_Forretress[];\nextern const u32 gMonFrontPic_Dunsparce[];\nextern const u32 gMonPalette_Dunsparce[];\nextern const u32 gMonBackPic_Dunsparce[];\nextern const u32 gMonShinyPalette_Dunsparce[];\nextern const u8 gMonIcon_Dunsparce[];\nextern const u8 gMonFootprint_Dunsparce[];\nextern const u32 gMonFrontPic_Gligar[];\nextern const u32 gMonPalette_Gligar[];\nextern const u32 gMonBackPic_Gligar[];\nextern const u32 gMonShinyPalette_Gligar[];\nextern const u8 gMonIcon_Gligar[];\nextern const u8 gMonFootprint_Gligar[];\nextern const u32 gMonFrontPic_Steelix[];\nextern const u32 gMonPalette_Steelix[];\nextern const u32 gMonBackPic_Steelix[];\nextern const u32 gMonShinyPalette_Steelix[];\nextern const u8 gMonIcon_Steelix[];\nextern const u8 gMonFootprint_Steelix[];\nextern const u32 gMonFrontPic_Snubbull[];\nextern const u32 gMonPalette_Snubbull[];\nextern const u32 gMonBackPic_Snubbull[];\nextern const u32 gMonShinyPalette_Snubbull[];\nextern const u8 gMonIcon_Snubbull[];\nextern const u8 gMonFootprint_Snubbull[];\nextern const u32 gMonFrontPic_Granbull[];\nextern const u32 gMonPalette_Granbull[];\nextern const u32 gMonBackPic_Granbull[];\nextern const u32 gMonShinyPalette_Granbull[];\nextern const u8 gMonIcon_Granbull[];\nextern const u8 gMonFootprint_Granbull[];\nextern const u32 gMonFrontPic_Qwilfish[];\nextern const u32 gMonPalette_Qwilfish[];\nextern const u32 gMonBackPic_Qwilfish[];\nextern const u32 gMonShinyPalette_Qwilfish[];\nextern const u8 gMonIcon_Qwilfish[];\nextern const u8 gMonFootprint_Qwilfish[];\nextern const u32 gMonFrontPic_Scizor[];\nextern const u32 gMonPalette_Scizor[];\nextern const u32 gMonBackPic_Scizor[];\nextern const u32 gMonShinyPalette_Scizor[];\nextern const u8 gMonIcon_Scizor[];\nextern const u8 gMonFootprint_Scizor[];\nextern const u32 gMonFrontPic_Shuckle[];\nextern const u32 gMonPalette_Shuckle[];\nextern const u32 gMonBackPic_Shuckle[];\nextern const u32 gMonShinyPalette_Shuckle[];\nextern const u8 gMonIcon_Shuckle[];\nextern const u8 gMonFootprint_Shuckle[];\nextern const u32 gMonFrontPic_Heracross[];\nextern const u32 gMonPalette_Heracross[];\nextern const u32 gMonBackPic_Heracross[];\nextern const u32 gMonShinyPalette_Heracross[];\nextern const u8 gMonIcon_Heracross[];\nextern const u8 gMonFootprint_Heracross[];\nextern const u32 gMonFrontPic_Sneasel[];\nextern const u32 gMonPalette_Sneasel[];\nextern const u32 gMonBackPic_Sneasel[];\nextern const u32 gMonShinyPalette_Sneasel[];\nextern const u8 gMonIcon_Sneasel[];\nextern const u8 gMonFootprint_Sneasel[];\nextern const u32 gMonFrontPic_Teddiursa[];\nextern const u32 gMonPalette_Teddiursa[];\nextern const u32 gMonBackPic_Teddiursa[];\nextern const u32 gMonShinyPalette_Teddiursa[];\nextern const u8 gMonIcon_Teddiursa[];\nextern const u8 gMonFootprint_Teddiursa[];\nextern const u32 gMonFrontPic_Ursaring[];\nextern const u32 gMonPalette_Ursaring[];\nextern const u32 gMonBackPic_Ursaring[];\nextern const u32 gMonShinyPalette_Ursaring[];\nextern const u8 gMonIcon_Ursaring[];\nextern const u8 gMonFootprint_Ursaring[];\nextern const u32 gMonFrontPic_Slugma[];\nextern const u32 gMonPalette_Slugma[];\nextern const u32 gMonBackPic_Slugma[];\nextern const u32 gMonShinyPalette_Slugma[];\nextern const u8 gMonIcon_Slugma[];\nextern const u8 gMonFootprint_Slugma[];\nextern const u32 gMonFrontPic_Magcargo[];\nextern const u32 gMonPalette_Magcargo[];\nextern const u32 gMonBackPic_Magcargo[];\nextern const u32 gMonShinyPalette_Magcargo[];\nextern const u8 gMonIcon_Magcargo[];\nextern const u8 gMonFootprint_Magcargo[];\nextern const u32 gMonFrontPic_Swinub[];\nextern const u32 gMonPalette_Swinub[];\nextern const u32 gMonBackPic_Swinub[];\nextern const u32 gMonShinyPalette_Swinub[];\nextern const u8 gMonIcon_Swinub[];\nextern const u8 gMonFootprint_Swinub[];\nextern const u32 gMonFrontPic_Piloswine[];\nextern const u32 gMonPalette_Piloswine[];\nextern const u32 gMonBackPic_Piloswine[];\nextern const u32 gMonShinyPalette_Piloswine[];\nextern const u8 gMonIcon_Piloswine[];\nextern const u8 gMonFootprint_Piloswine[];\nextern const u32 gMonFrontPic_Corsola[];\nextern const u32 gMonPalette_Corsola[];\nextern const u32 gMonBackPic_Corsola[];\nextern const u32 gMonShinyPalette_Corsola[];\nextern const u8 gMonIcon_Corsola[];\nextern const u8 gMonFootprint_Corsola[];\nextern const u32 gMonFrontPic_Remoraid[];\nextern const u32 gMonPalette_Remoraid[];\nextern const u32 gMonBackPic_Remoraid[];\nextern const u32 gMonShinyPalette_Remoraid[];\nextern const u8 gMonIcon_Remoraid[];\nextern const u8 gMonFootprint_Remoraid[];\nextern const u32 gMonFrontPic_Octillery[];\nextern const u32 gMonPalette_Octillery[];\nextern const u32 gMonBackPic_Octillery[];\nextern const u32 gMonShinyPalette_Octillery[];\nextern const u8 gMonIcon_Octillery[];\nextern const u8 gMonFootprint_Octillery[];\nextern const u32 gMonFrontPic_Delibird[];\nextern const u32 gMonPalette_Delibird[];\nextern const u32 gMonBackPic_Delibird[];\nextern const u32 gMonShinyPalette_Delibird[];\nextern const u8 gMonIcon_Delibird[];\nextern const u8 gMonFootprint_Delibird[];\nextern const u32 gMonFrontPic_Mantine[];\nextern const u32 gMonPalette_Mantine[];\nextern const u32 gMonBackPic_Mantine[];\nextern const u32 gMonShinyPalette_Mantine[];\nextern const u8 gMonIcon_Mantine[];\nextern const u8 gMonFootprint_Mantine[];\nextern const u32 gMonFrontPic_Skarmory[];\nextern const u32 gMonPalette_Skarmory[];\nextern const u32 gMonBackPic_Skarmory[];\nextern const u32 gMonShinyPalette_Skarmory[];\nextern const u8 gMonIcon_Skarmory[];\nextern const u8 gMonFootprint_Skarmory[];\nextern const u32 gMonFrontPic_Houndour[];\nextern const u32 gMonPalette_Houndour[];\nextern const u32 gMonBackPic_Houndour[];\nextern const u32 gMonShinyPalette_Houndour[];\nextern const u8 gMonIcon_Houndour[];\nextern const u8 gMonFootprint_Houndour[];\nextern const u32 gMonFrontPic_Houndoom[];\nextern const u32 gMonPalette_Houndoom[];\nextern const u32 gMonBackPic_Houndoom[];\nextern const u32 gMonShinyPalette_Houndoom[];\nextern const u8 gMonIcon_Houndoom[];\nextern const u8 gMonFootprint_Houndoom[];\nextern const u32 gMonFrontPic_Kingdra[];\nextern const u32 gMonPalette_Kingdra[];\nextern const u32 gMonBackPic_Kingdra[];\nextern const u32 gMonShinyPalette_Kingdra[];\nextern const u8 gMonIcon_Kingdra[];\nextern const u8 gMonFootprint_Kingdra[];\nextern const u32 gMonFrontPic_Phanpy[];\nextern const u32 gMonPalette_Phanpy[];\nextern const u32 gMonBackPic_Phanpy[];\nextern const u32 gMonShinyPalette_Phanpy[];\nextern const u8 gMonIcon_Phanpy[];\nextern const u8 gMonFootprint_Phanpy[];\nextern const u32 gMonFrontPic_Donphan[];\nextern const u32 gMonPalette_Donphan[];\nextern const u32 gMonBackPic_Donphan[];\nextern const u32 gMonShinyPalette_Donphan[];\nextern const u8 gMonIcon_Donphan[];\nextern const u8 gMonFootprint_Donphan[];\nextern const u32 gMonFrontPic_Porygon2[];\nextern const u32 gMonPalette_Porygon2[];\nextern const u32 gMonBackPic_Porygon2[];\nextern const u32 gMonShinyPalette_Porygon2[];\nextern const u8 gMonIcon_Porygon2[];\nextern const u8 gMonFootprint_Porygon2[];\nextern const u32 gMonFrontPic_Stantler[];\nextern const u32 gMonPalette_Stantler[];\nextern const u32 gMonBackPic_Stantler[];\nextern const u32 gMonShinyPalette_Stantler[];\nextern const u8 gMonIcon_Stantler[];\nextern const u8 gMonFootprint_Stantler[];\nextern const u32 gMonFrontPic_Smeargle[];\nextern const u32 gMonPalette_Smeargle[];\nextern const u32 gMonBackPic_Smeargle[];\nextern const u32 gMonShinyPalette_Smeargle[];\nextern const u8 gMonIcon_Smeargle[];\nextern const u8 gMonFootprint_Smeargle[];\nextern const u32 gMonFrontPic_Tyrogue[];\nextern const u32 gMonPalette_Tyrogue[];\nextern const u32 gMonBackPic_Tyrogue[];\nextern const u32 gMonShinyPalette_Tyrogue[];\nextern const u8 gMonIcon_Tyrogue[];\nextern const u8 gMonFootprint_Tyrogue[];\nextern const u32 gMonFrontPic_Hitmontop[];\nextern const u32 gMonPalette_Hitmontop[];\nextern const u32 gMonBackPic_Hitmontop[];\nextern const u32 gMonShinyPalette_Hitmontop[];\nextern const u8 gMonIcon_Hitmontop[];\nextern const u8 gMonFootprint_Hitmontop[];\nextern const u32 gMonFrontPic_Smoochum[];\nextern const u32 gMonPalette_Smoochum[];\nextern const u32 gMonBackPic_Smoochum[];\nextern const u32 gMonShinyPalette_Smoochum[];\nextern const u8 gMonIcon_Smoochum[];\nextern const u8 gMonFootprint_Smoochum[];\nextern const u32 gMonFrontPic_Elekid[];\nextern const u32 gMonPalette_Elekid[];\nextern const u32 gMonBackPic_Elekid[];\nextern const u32 gMonShinyPalette_Elekid[];\nextern const u8 gMonIcon_Elekid[];\nextern const u8 gMonFootprint_Elekid[];\nextern const u32 gMonFrontPic_Magby[];\nextern const u32 gMonPalette_Magby[];\nextern const u32 gMonBackPic_Magby[];\nextern const u32 gMonShinyPalette_Magby[];\nextern const u8 gMonIcon_Magby[];\nextern const u8 gMonFootprint_Magby[];\nextern const u32 gMonFrontPic_Miltank[];\nextern const u32 gMonPalette_Miltank[];\nextern const u32 gMonBackPic_Miltank[];\nextern const u32 gMonShinyPalette_Miltank[];\nextern const u8 gMonIcon_Miltank[];\nextern const u8 gMonFootprint_Miltank[];\nextern const u32 gMonFrontPic_Blissey[];\nextern const u32 gMonPalette_Blissey[];\nextern const u32 gMonBackPic_Blissey[];\nextern const u32 gMonShinyPalette_Blissey[];\nextern const u8 gMonIcon_Blissey[];\nextern const u8 gMonFootprint_Blissey[];\nextern const u32 gMonFrontPic_Raikou[];\nextern const u32 gMonPalette_Raikou[];\nextern const u32 gMonBackPic_Raikou[];\nextern const u32 gMonShinyPalette_Raikou[];\nextern const u8 gMonIcon_Raikou[];\nextern const u8 gMonFootprint_Raikou[];\nextern const u32 gMonFrontPic_Entei[];\nextern const u32 gMonPalette_Entei[];\nextern const u32 gMonBackPic_Entei[];\nextern const u32 gMonShinyPalette_Entei[];\nextern const u8 gMonIcon_Entei[];\nextern const u8 gMonFootprint_Entei[];\nextern const u32 gMonFrontPic_Suicune[];\nextern const u32 gMonPalette_Suicune[];\nextern const u32 gMonBackPic_Suicune[];\nextern const u32 gMonShinyPalette_Suicune[];\nextern const u8 gMonIcon_Suicune[];\nextern const u8 gMonFootprint_Suicune[];\nextern const u32 gMonFrontPic_Larvitar[];\nextern const u32 gMonPalette_Larvitar[];\nextern const u32 gMonBackPic_Larvitar[];\nextern const u32 gMonShinyPalette_Larvitar[];\nextern const u8 gMonIcon_Larvitar[];\nextern const u8 gMonFootprint_Larvitar[];\nextern const u32 gMonFrontPic_Pupitar[];\nextern const u32 gMonPalette_Pupitar[];\nextern const u32 gMonBackPic_Pupitar[];\nextern const u32 gMonShinyPalette_Pupitar[];\nextern const u8 gMonIcon_Pupitar[];\nextern const u8 gMonFootprint_Pupitar[];\nextern const u32 gMonFrontPic_Tyranitar[];\nextern const u32 gMonPalette_Tyranitar[];\nextern const u32 gMonBackPic_Tyranitar[];\nextern const u32 gMonShinyPalette_Tyranitar[];\nextern const u8 gMonIcon_Tyranitar[];\nextern const u8 gMonFootprint_Tyranitar[];\nextern const u32 gMonFrontPic_Lugia[];\nextern const u32 gMonPalette_Lugia[];\nextern const u32 gMonBackPic_Lugia[];\nextern const u32 gMonShinyPalette_Lugia[];\nextern const u8 gMonIcon_Lugia[];\nextern const u8 gMonFootprint_Lugia[];\nextern const u32 gMonFrontPic_HoOh[];\nextern const u32 gMonPalette_HoOh[];\nextern const u32 gMonBackPic_HoOh[];\nextern const u32 gMonShinyPalette_HoOh[];\nextern const u8 gMonIcon_HoOh[];\nextern const u8 gMonFootprint_HoOh[];\nextern const u32 gMonFrontPic_Celebi[];\nextern const u32 gMonPalette_Celebi[];\nextern const u32 gMonBackPic_Celebi[];\nextern const u32 gMonShinyPalette_Celebi[];\nextern const u8 gMonIcon_Celebi[];\nextern const u8 gMonFootprint_Celebi[];\nextern const u32 gMonFrontPic_Treecko[];\nextern const u32 gMonPalette_Treecko[];\nextern const u32 gMonBackPic_Treecko[];\nextern const u32 gMonShinyPalette_Treecko[];\nextern const u8 gMonIcon_Treecko[];\nextern const u8 gMonFootprint_Treecko[];\nextern const u32 gMonFrontPic_Grovyle[];\nextern const u32 gMonPalette_Grovyle[];\nextern const u32 gMonBackPic_Grovyle[];\nextern const u32 gMonShinyPalette_Grovyle[];\nextern const u8 gMonIcon_Grovyle[];\nextern const u8 gMonFootprint_Grovyle[];\nextern const u32 gMonFrontPic_Sceptile[];\nextern const u32 gMonPalette_Sceptile[];\nextern const u32 gMonBackPic_Sceptile[];\nextern const u32 gMonShinyPalette_Sceptile[];\nextern const u8 gMonIcon_Sceptile[];\nextern const u8 gMonFootprint_Sceptile[];\nextern const u32 gMonFrontPic_Torchic[];\nextern const u32 gMonPalette_Torchic[];\nextern const u32 gMonBackPic_Torchic[];\nextern const u32 gMonShinyPalette_Torchic[];\nextern const u8 gMonIcon_Torchic[];\nextern const u8 gMonFootprint_Torchic[];\nextern const u32 gMonFrontPic_Combusken[];\nextern const u32 gMonPalette_Combusken[];\nextern const u32 gMonBackPic_Combusken[];\nextern const u32 gMonShinyPalette_Combusken[];\nextern const u8 gMonIcon_Combusken[];\nextern const u8 gMonFootprint_Combusken[];\nextern const u32 gMonFrontPic_Blaziken[];\nextern const u32 gMonPalette_Blaziken[];\nextern const u32 gMonBackPic_Blaziken[];\nextern const u32 gMonShinyPalette_Blaziken[];\nextern const u8 gMonIcon_Blaziken[];\nextern const u8 gMonFootprint_Blaziken[];\nextern const u32 gMonFrontPic_Mudkip[];\nextern const u32 gMonPalette_Mudkip[];\nextern const u32 gMonBackPic_Mudkip[];\nextern const u32 gMonShinyPalette_Mudkip[];\nextern const u8 gMonIcon_Mudkip[];\nextern const u8 gMonFootprint_Mudkip[];\nextern const u32 gMonFrontPic_Marshtomp[];\nextern const u32 gMonPalette_Marshtomp[];\nextern const u32 gMonBackPic_Marshtomp[];\nextern const u32 gMonShinyPalette_Marshtomp[];\nextern const u8 gMonIcon_Marshtomp[];\nextern const u8 gMonFootprint_Marshtomp[];\nextern const u32 gMonFrontPic_Swampert[];\nextern const u32 gMonPalette_Swampert[];\nextern const u32 gMonBackPic_Swampert[];\nextern const u32 gMonShinyPalette_Swampert[];\nextern const u8 gMonIcon_Swampert[];\nextern const u8 gMonFootprint_Swampert[];\nextern const u32 gMonFrontPic_Poochyena[];\nextern const u32 gMonPalette_Poochyena[];\nextern const u32 gMonBackPic_Poochyena[];\nextern const u32 gMonShinyPalette_Poochyena[];\nextern const u8 gMonIcon_Poochyena[];\nextern const u8 gMonFootprint_Poochyena[];\nextern const u32 gMonFrontPic_Mightyena[];\nextern const u32 gMonPalette_Mightyena[];\nextern const u32 gMonBackPic_Mightyena[];\nextern const u32 gMonShinyPalette_Mightyena[];\nextern const u8 gMonIcon_Mightyena[];\nextern const u8 gMonFootprint_Mightyena[];\nextern const u32 gMonFrontPic_Zigzagoon[];\nextern const u32 gMonPalette_Zigzagoon[];\nextern const u32 gMonBackPic_Zigzagoon[];\nextern const u32 gMonShinyPalette_Zigzagoon[];\nextern const u8 gMonIcon_Zigzagoon[];\nextern const u8 gMonFootprint_Zigzagoon[];\nextern const u32 gMonFrontPic_Linoone[];\nextern const u32 gMonPalette_Linoone[];\nextern const u32 gMonBackPic_Linoone[];\nextern const u32 gMonShinyPalette_Linoone[];\nextern const u8 gMonIcon_Linoone[];\nextern const u8 gMonFootprint_Linoone[];\nextern const u32 gMonFrontPic_Wurmple[];\nextern const u32 gMonPalette_Wurmple[];\nextern const u32 gMonBackPic_Wurmple[];\nextern const u32 gMonShinyPalette_Wurmple[];\nextern const u8 gMonIcon_Wurmple[];\nextern const u8 gMonFootprint_Wurmple[];\nextern const u32 gMonFrontPic_Silcoon[];\nextern const u32 gMonPalette_Silcoon[];\nextern const u32 gMonBackPic_Silcoon[];\nextern const u32 gMonShinyPalette_Silcoon[];\nextern const u8 gMonIcon_Silcoon[];\nextern const u8 gMonFootprint_Silcoon[];\nextern const u32 gMonFrontPic_Beautifly[];\nextern const u32 gMonPalette_Beautifly[];\nextern const u32 gMonBackPic_Beautifly[];\nextern const u32 gMonShinyPalette_Beautifly[];\nextern const u8 gMonIcon_Beautifly[];\nextern const u8 gMonFootprint_Beautifly[];\nextern const u32 gMonFrontPic_Cascoon[];\nextern const u32 gMonPalette_Cascoon[];\nextern const u32 gMonBackPic_Cascoon[];\nextern const u32 gMonShinyPalette_Cascoon[];\nextern const u8 gMonIcon_Cascoon[];\nextern const u8 gMonFootprint_Cascoon[];\nextern const u32 gMonFrontPic_Dustox[];\nextern const u32 gMonPalette_Dustox[];\nextern const u32 gMonBackPic_Dustox[];\nextern const u32 gMonShinyPalette_Dustox[];\nextern const u8 gMonIcon_Dustox[];\nextern const u8 gMonFootprint_Dustox[];\nextern const u32 gMonFrontPic_Lotad[];\nextern const u32 gMonPalette_Lotad[];\nextern const u32 gMonBackPic_Lotad[];\nextern const u32 gMonShinyPalette_Lotad[];\nextern const u8 gMonIcon_Lotad[];\nextern const u8 gMonFootprint_Lotad[];\nextern const u32 gMonFrontPic_Lombre[];\nextern const u32 gMonPalette_Lombre[];\nextern const u32 gMonBackPic_Lombre[];\nextern const u32 gMonShinyPalette_Lombre[];\nextern const u8 gMonIcon_Lombre[];\nextern const u8 gMonFootprint_Lombre[];\nextern const u32 gMonFrontPic_Ludicolo[];\nextern const u32 gMonPalette_Ludicolo[];\nextern const u32 gMonBackPic_Ludicolo[];\nextern const u32 gMonShinyPalette_Ludicolo[];\nextern const u8 gMonIcon_Ludicolo[];\nextern const u8 gMonFootprint_Ludicolo[];\nextern const u32 gMonFrontPic_Seedot[];\nextern const u32 gMonPalette_Seedot[];\nextern const u32 gMonBackPic_Seedot[];\nextern const u32 gMonShinyPalette_Seedot[];\nextern const u8 gMonIcon_Seedot[];\nextern const u8 gMonFootprint_Seedot[];\nextern const u32 gMonFrontPic_Nuzleaf[];\nextern const u32 gMonPalette_Nuzleaf[];\nextern const u32 gMonBackPic_Nuzleaf[];\nextern const u32 gMonShinyPalette_Nuzleaf[];\nextern const u8 gMonIcon_Nuzleaf[];\nextern const u8 gMonFootprint_Nuzleaf[];\nextern const u32 gMonFrontPic_Shiftry[];\nextern const u32 gMonPalette_Shiftry[];\nextern const u32 gMonBackPic_Shiftry[];\nextern const u32 gMonShinyPalette_Shiftry[];\nextern const u8 gMonIcon_Shiftry[];\nextern const u8 gMonFootprint_Shiftry[];\nextern const u32 gMonFrontPic_Nincada[];\nextern const u32 gMonPalette_Nincada[];\nextern const u32 gMonBackPic_Nincada[];\nextern const u32 gMonShinyPalette_Nincada[];\nextern const u8 gMonIcon_Nincada[];\nextern const u8 gMonFootprint_Nincada[];\nextern const u32 gMonFrontPic_Ninjask[];\nextern const u32 gMonPalette_Ninjask[];\nextern const u32 gMonBackPic_Ninjask[];\nextern const u32 gMonShinyPalette_Ninjask[];\nextern const u8 gMonIcon_Ninjask[];\nextern const u8 gMonFootprint_Ninjask[];\nextern const u32 gMonFrontPic_Shedinja[];\nextern const u32 gMonPalette_Shedinja[];\nextern const u32 gMonBackPic_Shedinja[];\nextern const u32 gMonShinyPalette_Shedinja[];\nextern const u8 gMonIcon_Shedinja[];\nextern const u8 gMonFootprint_Shedinja[];\nextern const u32 gMonFrontPic_Taillow[];\nextern const u32 gMonPalette_Taillow[];\nextern const u32 gMonBackPic_Taillow[];\nextern const u32 gMonShinyPalette_Taillow[];\nextern const u8 gMonIcon_Taillow[];\nextern const u8 gMonFootprint_Taillow[];\nextern const u32 gMonFrontPic_Swellow[];\nextern const u32 gMonPalette_Swellow[];\nextern const u32 gMonBackPic_Swellow[];\nextern const u32 gMonShinyPalette_Swellow[];\nextern const u8 gMonIcon_Swellow[];\nextern const u8 gMonFootprint_Swellow[];\nextern const u32 gMonFrontPic_Shroomish[];\nextern const u32 gMonPalette_Shroomish[];\nextern const u32 gMonBackPic_Shroomish[];\nextern const u32 gMonShinyPalette_Shroomish[];\nextern const u8 gMonIcon_Shroomish[];\nextern const u8 gMonFootprint_Shroomish[];\nextern const u32 gMonFrontPic_Breloom[];\nextern const u32 gMonPalette_Breloom[];\nextern const u32 gMonBackPic_Breloom[];\nextern const u32 gMonShinyPalette_Breloom[];\nextern const u8 gMonIcon_Breloom[];\nextern const u8 gMonFootprint_Breloom[];\nextern const u32 gMonFrontPic_Spinda[];\nextern const u32 gMonPalette_Spinda[];\nextern const u32 gMonBackPic_Spinda[];\nextern const u32 gMonShinyPalette_Spinda[];\nextern const u8 gMonIcon_Spinda[];\nextern const u8 gMonFootprint_Spinda[];\nextern const u32 gMonFrontPic_Wingull[];\nextern const u32 gMonPalette_Wingull[];\nextern const u32 gMonBackPic_Wingull[];\nextern const u32 gMonShinyPalette_Wingull[];\nextern const u8 gMonIcon_Wingull[];\nextern const u8 gMonFootprint_Wingull[];\nextern const u32 gMonFrontPic_Pelipper[];\nextern const u32 gMonPalette_Pelipper[];\nextern const u32 gMonBackPic_Pelipper[];\nextern const u32 gMonShinyPalette_Pelipper[];\nextern const u8 gMonIcon_Pelipper[];\nextern const u8 gMonFootprint_Pelipper[];\nextern const u32 gMonFrontPic_Surskit[];\nextern const u32 gMonPalette_Surskit[];\nextern const u32 gMonBackPic_Surskit[];\nextern const u32 gMonShinyPalette_Surskit[];\nextern const u8 gMonIcon_Surskit[];\nextern const u8 gMonFootprint_Surskit[];\nextern const u32 gMonFrontPic_Masquerain[];\nextern const u32 gMonPalette_Masquerain[];\nextern const u32 gMonBackPic_Masquerain[];\nextern const u32 gMonShinyPalette_Masquerain[];\nextern const u8 gMonIcon_Masquerain[];\nextern const u8 gMonFootprint_Masquerain[];\nextern const u32 gMonFrontPic_Wailmer[];\nextern const u32 gMonPalette_Wailmer[];\nextern const u32 gMonBackPic_Wailmer[];\nextern const u32 gMonShinyPalette_Wailmer[];\nextern const u8 gMonIcon_Wailmer[];\nextern const u8 gMonFootprint_Wailmer[];\nextern const u32 gMonFrontPic_Wailord[];\nextern const u32 gMonPalette_Wailord[];\nextern const u32 gMonBackPic_Wailord[];\nextern const u32 gMonShinyPalette_Wailord[];\nextern const u8 gMonIcon_Wailord[];\nextern const u8 gMonFootprint_Wailord[];\nextern const u32 gMonFrontPic_Skitty[];\nextern const u32 gMonPalette_Skitty[];\nextern const u32 gMonBackPic_Skitty[];\nextern const u32 gMonShinyPalette_Skitty[];\nextern const u8 gMonIcon_Skitty[];\nextern const u8 gMonFootprint_Skitty[];\nextern const u32 gMonFrontPic_Delcatty[];\nextern const u32 gMonPalette_Delcatty[];\nextern const u32 gMonBackPic_Delcatty[];\nextern const u32 gMonShinyPalette_Delcatty[];\nextern const u8 gMonIcon_Delcatty[];\nextern const u8 gMonFootprint_Delcatty[];\nextern const u32 gMonFrontPic_Kecleon[];\nextern const u32 gMonPalette_Kecleon[];\nextern const u32 gMonBackPic_Kecleon[];\nextern const u32 gMonShinyPalette_Kecleon[];\nextern const u8 gMonIcon_Kecleon[];\nextern const u8 gMonFootprint_Kecleon[];\nextern const u32 gMonFrontPic_Baltoy[];\nextern const u32 gMonPalette_Baltoy[];\nextern const u32 gMonBackPic_Baltoy[];\nextern const u32 gMonShinyPalette_Baltoy[];\nextern const u8 gMonIcon_Baltoy[];\nextern const u8 gMonFootprint_Baltoy[];\nextern const u32 gMonFrontPic_Claydol[];\nextern const u32 gMonPalette_Claydol[];\nextern const u32 gMonBackPic_Claydol[];\nextern const u32 gMonShinyPalette_Claydol[];\nextern const u8 gMonIcon_Claydol[];\nextern const u8 gMonFootprint_Claydol[];\nextern const u32 gMonFrontPic_Nosepass[];\nextern const u32 gMonPalette_Nosepass[];\nextern const u32 gMonBackPic_Nosepass[];\nextern const u32 gMonShinyPalette_Nosepass[];\nextern const u8 gMonIcon_Nosepass[];\nextern const u8 gMonFootprint_Nosepass[];\nextern const u32 gMonFrontPic_Torkoal[];\nextern const u32 gMonPalette_Torkoal[];\nextern const u32 gMonBackPic_Torkoal[];\nextern const u32 gMonShinyPalette_Torkoal[];\nextern const u8 gMonIcon_Torkoal[];\nextern const u8 gMonFootprint_Torkoal[];\nextern const u32 gMonFrontPic_Sableye[];\nextern const u32 gMonPalette_Sableye[];\nextern const u32 gMonBackPic_Sableye[];\nextern const u32 gMonShinyPalette_Sableye[];\nextern const u8 gMonIcon_Sableye[];\nextern const u8 gMonFootprint_Sableye[];\nextern const u32 gMonFrontPic_Barboach[];\nextern const u32 gMonPalette_Barboach[];\nextern const u32 gMonBackPic_Barboach[];\nextern const u32 gMonShinyPalette_Barboach[];\nextern const u8 gMonIcon_Barboach[];\nextern const u8 gMonFootprint_Barboach[];\nextern const u32 gMonFrontPic_Whiscash[];\nextern const u32 gMonPalette_Whiscash[];\nextern const u32 gMonBackPic_Whiscash[];\nextern const u32 gMonShinyPalette_Whiscash[];\nextern const u8 gMonIcon_Whiscash[];\nextern const u8 gMonFootprint_Whiscash[];\nextern const u32 gMonFrontPic_Luvdisc[];\nextern const u32 gMonPalette_Luvdisc[];\nextern const u32 gMonBackPic_Luvdisc[];\nextern const u32 gMonShinyPalette_Luvdisc[];\nextern const u8 gMonIcon_Luvdisc[];\nextern const u8 gMonFootprint_Luvdisc[];\nextern const u32 gMonFrontPic_Corphish[];\nextern const u32 gMonPalette_Corphish[];\nextern const u32 gMonBackPic_Corphish[];\nextern const u32 gMonShinyPalette_Corphish[];\nextern const u8 gMonIcon_Corphish[];\nextern const u8 gMonFootprint_Corphish[];\nextern const u32 gMonFrontPic_Crawdaunt[];\nextern const u32 gMonPalette_Crawdaunt[];\nextern const u32 gMonBackPic_Crawdaunt[];\nextern const u32 gMonShinyPalette_Crawdaunt[];\nextern const u8 gMonIcon_Crawdaunt[];\nextern const u8 gMonFootprint_Crawdaunt[];\nextern const u32 gMonFrontPic_Feebas[];\nextern const u32 gMonPalette_Feebas[];\nextern const u32 gMonBackPic_Feebas[];\nextern const u32 gMonShinyPalette_Feebas[];\nextern const u8 gMonIcon_Feebas[];\nextern const u8 gMonFootprint_Feebas[];\nextern const u32 gMonFrontPic_Milotic[];\nextern const u32 gMonPalette_Milotic[];\nextern const u32 gMonBackPic_Milotic[];\nextern const u32 gMonShinyPalette_Milotic[];\nextern const u8 gMonIcon_Milotic[];\nextern const u8 gMonFootprint_Milotic[];\nextern const u32 gMonFrontPic_Carvanha[];\nextern const u32 gMonPalette_Carvanha[];\nextern const u32 gMonBackPic_Carvanha[];\nextern const u32 gMonShinyPalette_Carvanha[];\nextern const u8 gMonIcon_Carvanha[];\nextern const u8 gMonFootprint_Carvanha[];\nextern const u32 gMonFrontPic_Sharpedo[];\nextern const u32 gMonPalette_Sharpedo[];\nextern const u32 gMonBackPic_Sharpedo[];\nextern const u32 gMonShinyPalette_Sharpedo[];\nextern const u8 gMonIcon_Sharpedo[];\nextern const u8 gMonFootprint_Sharpedo[];\nextern const u32 gMonFrontPic_Trapinch[];\nextern const u32 gMonPalette_Trapinch[];\nextern const u32 gMonBackPic_Trapinch[];\nextern const u32 gMonShinyPalette_Trapinch[];\nextern const u8 gMonIcon_Trapinch[];\nextern const u8 gMonFootprint_Trapinch[];\nextern const u32 gMonFrontPic_Vibrava[];\nextern const u32 gMonPalette_Vibrava[];\nextern const u32 gMonBackPic_Vibrava[];\nextern const u32 gMonShinyPalette_Vibrava[];\nextern const u8 gMonIcon_Vibrava[];\nextern const u8 gMonFootprint_Vibrava[];\nextern const u32 gMonFrontPic_Flygon[];\nextern const u32 gMonPalette_Flygon[];\nextern const u32 gMonBackPic_Flygon[];\nextern const u32 gMonShinyPalette_Flygon[];\nextern const u8 gMonIcon_Flygon[];\nextern const u8 gMonFootprint_Flygon[];\nextern const u32 gMonFrontPic_Makuhita[];\nextern const u32 gMonPalette_Makuhita[];\nextern const u32 gMonBackPic_Makuhita[];\nextern const u32 gMonShinyPalette_Makuhita[];\nextern const u8 gMonIcon_Makuhita[];\nextern const u8 gMonFootprint_Makuhita[];\nextern const u32 gMonFrontPic_Hariyama[];\nextern const u32 gMonPalette_Hariyama[];\nextern const u32 gMonBackPic_Hariyama[];\nextern const u32 gMonShinyPalette_Hariyama[];\nextern const u8 gMonIcon_Hariyama[];\nextern const u8 gMonFootprint_Hariyama[];\nextern const u32 gMonFrontPic_Electrike[];\nextern const u32 gMonPalette_Electrike[];\nextern const u32 gMonBackPic_Electrike[];\nextern const u32 gMonShinyPalette_Electrike[];\nextern const u8 gMonIcon_Electrike[];\nextern const u8 gMonFootprint_Electrike[];\nextern const u32 gMonFrontPic_Manectric[];\nextern const u32 gMonPalette_Manectric[];\nextern const u32 gMonBackPic_Manectric[];\nextern const u32 gMonShinyPalette_Manectric[];\nextern const u8 gMonIcon_Manectric[];\nextern const u8 gMonFootprint_Manectric[];\nextern const u32 gMonFrontPic_Numel[];\nextern const u32 gMonPalette_Numel[];\nextern const u32 gMonBackPic_Numel[];\nextern const u32 gMonShinyPalette_Numel[];\nextern const u8 gMonIcon_Numel[];\nextern const u8 gMonFootprint_Numel[];\nextern const u32 gMonFrontPic_Camerupt[];\nextern const u32 gMonPalette_Camerupt[];\nextern const u32 gMonBackPic_Camerupt[];\nextern const u32 gMonShinyPalette_Camerupt[];\nextern const u8 gMonIcon_Camerupt[];\nextern const u8 gMonFootprint_Camerupt[];\nextern const u32 gMonFrontPic_Spheal[];\nextern const u32 gMonPalette_Spheal[];\nextern const u32 gMonBackPic_Spheal[];\nextern const u32 gMonShinyPalette_Spheal[];\nextern const u8 gMonIcon_Spheal[];\nextern const u8 gMonFootprint_Spheal[];\nextern const u32 gMonFrontPic_Sealeo[];\nextern const u32 gMonPalette_Sealeo[];\nextern const u32 gMonBackPic_Sealeo[];\nextern const u32 gMonShinyPalette_Sealeo[];\nextern const u8 gMonIcon_Sealeo[];\nextern const u8 gMonFootprint_Sealeo[];\nextern const u32 gMonFrontPic_Walrein[];\nextern const u32 gMonPalette_Walrein[];\nextern const u32 gMonBackPic_Walrein[];\nextern const u32 gMonShinyPalette_Walrein[];\nextern const u8 gMonIcon_Walrein[];\nextern const u8 gMonFootprint_Walrein[];\nextern const u32 gMonFrontPic_Cacnea[];\nextern const u32 gMonPalette_Cacnea[];\nextern const u32 gMonBackPic_Cacnea[];\nextern const u32 gMonShinyPalette_Cacnea[];\nextern const u8 gMonIcon_Cacnea[];\nextern const u8 gMonFootprint_Cacnea[];\nextern const u32 gMonFrontPic_Cacturne[];\nextern const u32 gMonPalette_Cacturne[];\nextern const u32 gMonBackPic_Cacturne[];\nextern const u32 gMonShinyPalette_Cacturne[];\nextern const u8 gMonIcon_Cacturne[];\nextern const u8 gMonFootprint_Cacturne[];\nextern const u32 gMonFrontPic_Snorunt[];\nextern const u32 gMonPalette_Snorunt[];\nextern const u32 gMonBackPic_Snorunt[];\nextern const u32 gMonShinyPalette_Snorunt[];\nextern const u8 gMonIcon_Snorunt[];\nextern const u8 gMonFootprint_Snorunt[];\nextern const u32 gMonFrontPic_Glalie[];\nextern const u32 gMonPalette_Glalie[];\nextern const u32 gMonBackPic_Glalie[];\nextern const u32 gMonShinyPalette_Glalie[];\nextern const u8 gMonIcon_Glalie[];\nextern const u8 gMonFootprint_Glalie[];\nextern const u32 gMonFrontPic_Lunatone[];\nextern const u32 gMonPalette_Lunatone[];\nextern const u32 gMonBackPic_Lunatone[];\nextern const u32 gMonShinyPalette_Lunatone[];\nextern const u8 gMonIcon_Lunatone[];\nextern const u8 gMonFootprint_Lunatone[];\nextern const u32 gMonFrontPic_Solrock[];\nextern const u32 gMonPalette_Solrock[];\nextern const u32 gMonBackPic_Solrock[];\nextern const u32 gMonShinyPalette_Solrock[];\nextern const u8 gMonIcon_Solrock[];\nextern const u8 gMonFootprint_Solrock[];\nextern const u32 gMonFrontPic_Azurill[];\nextern const u32 gMonPalette_Azurill[];\nextern const u32 gMonBackPic_Azurill[];\nextern const u32 gMonShinyPalette_Azurill[];\nextern const u8 gMonIcon_Azurill[];\nextern const u8 gMonFootprint_Azurill[];\nextern const u32 gMonFrontPic_Spoink[];\nextern const u32 gMonPalette_Spoink[];\nextern const u32 gMonBackPic_Spoink[];\nextern const u32 gMonShinyPalette_Spoink[];\nextern const u8 gMonIcon_Spoink[];\nextern const u8 gMonFootprint_Spoink[];\nextern const u32 gMonFrontPic_Grumpig[];\nextern const u32 gMonPalette_Grumpig[];\nextern const u32 gMonBackPic_Grumpig[];\nextern const u32 gMonShinyPalette_Grumpig[];\nextern const u8 gMonIcon_Grumpig[];\nextern const u8 gMonFootprint_Grumpig[];\nextern const u32 gMonFrontPic_Plusle[];\nextern const u32 gMonPalette_Plusle[];\nextern const u32 gMonBackPic_Plusle[];\nextern const u32 gMonShinyPalette_Plusle[];\nextern const u8 gMonIcon_Plusle[];\nextern const u8 gMonFootprint_Plusle[];\nextern const u32 gMonFrontPic_Minun[];\nextern const u32 gMonPalette_Minun[];\nextern const u32 gMonBackPic_Minun[];\nextern const u32 gMonShinyPalette_Minun[];\nextern const u8 gMonIcon_Minun[];\nextern const u8 gMonFootprint_Minun[];\nextern const u32 gMonFrontPic_Mawile[];\nextern const u32 gMonPalette_Mawile[];\nextern const u32 gMonBackPic_Mawile[];\nextern const u32 gMonShinyPalette_Mawile[];\nextern const u8 gMonIcon_Mawile[];\nextern const u8 gMonFootprint_Mawile[];\nextern const u32 gMonFrontPic_Meditite[];\nextern const u32 gMonPalette_Meditite[];\nextern const u32 gMonBackPic_Meditite[];\nextern const u32 gMonShinyPalette_Meditite[];\nextern const u8 gMonIcon_Meditite[];\nextern const u8 gMonFootprint_Meditite[];\nextern const u32 gMonFrontPic_Medicham[];\nextern const u32 gMonPalette_Medicham[];\nextern const u32 gMonBackPic_Medicham[];\nextern const u32 gMonShinyPalette_Medicham[];\nextern const u8 gMonIcon_Medicham[];\nextern const u8 gMonFootprint_Medicham[];\nextern const u32 gMonFrontPic_Swablu[];\nextern const u32 gMonPalette_Swablu[];\nextern const u32 gMonBackPic_Swablu[];\nextern const u32 gMonShinyPalette_Swablu[];\nextern const u8 gMonIcon_Swablu[];\nextern const u8 gMonFootprint_Swablu[];\nextern const u32 gMonFrontPic_Altaria[];\nextern const u32 gMonPalette_Altaria[];\nextern const u32 gMonBackPic_Altaria[];\nextern const u32 gMonShinyPalette_Altaria[];\nextern const u8 gMonIcon_Altaria[];\nextern const u8 gMonFootprint_Altaria[];\nextern const u32 gMonFrontPic_Wynaut[];\nextern const u32 gMonPalette_Wynaut[];\nextern const u32 gMonBackPic_Wynaut[];\nextern const u32 gMonShinyPalette_Wynaut[];\nextern const u8 gMonIcon_Wynaut[];\nextern const u8 gMonFootprint_Wynaut[];\nextern const u32 gMonFrontPic_Duskull[];\nextern const u32 gMonPalette_Duskull[];\nextern const u32 gMonBackPic_Duskull[];\nextern const u32 gMonShinyPalette_Duskull[];\nextern const u8 gMonIcon_Duskull[];\nextern const u8 gMonFootprint_Duskull[];\nextern const u32 gMonFrontPic_Dusclops[];\nextern const u32 gMonPalette_Dusclops[];\nextern const u32 gMonBackPic_Dusclops[];\nextern const u32 gMonShinyPalette_Dusclops[];\nextern const u8 gMonIcon_Dusclops[];\nextern const u8 gMonFootprint_Dusclops[];\nextern const u32 gMonFrontPic_Roselia[];\nextern const u32 gMonPalette_Roselia[];\nextern const u32 gMonBackPic_Roselia[];\nextern const u32 gMonShinyPalette_Roselia[];\nextern const u8 gMonIcon_Roselia[];\nextern const u8 gMonFootprint_Roselia[];\nextern const u32 gMonFrontPic_Slakoth[];\nextern const u32 gMonPalette_Slakoth[];\nextern const u32 gMonBackPic_Slakoth[];\nextern const u32 gMonShinyPalette_Slakoth[];\nextern const u8 gMonIcon_Slakoth[];\nextern const u8 gMonFootprint_Slakoth[];\nextern const u32 gMonFrontPic_Vigoroth[];\nextern const u32 gMonPalette_Vigoroth[];\nextern const u32 gMonBackPic_Vigoroth[];\nextern const u32 gMonShinyPalette_Vigoroth[];\nextern const u8 gMonIcon_Vigoroth[];\nextern const u8 gMonFootprint_Vigoroth[];\nextern const u32 gMonFrontPic_Slaking[];\nextern const u32 gMonPalette_Slaking[];\nextern const u32 gMonBackPic_Slaking[];\nextern const u32 gMonShinyPalette_Slaking[];\nextern const u8 gMonIcon_Slaking[];\nextern const u8 gMonFootprint_Slaking[];\nextern const u32 gMonFrontPic_Gulpin[];\nextern const u32 gMonPalette_Gulpin[];\nextern const u32 gMonBackPic_Gulpin[];\nextern const u32 gMonShinyPalette_Gulpin[];\nextern const u8 gMonIcon_Gulpin[];\nextern const u8 gMonFootprint_Gulpin[];\nextern const u32 gMonFrontPic_Swalot[];\nextern const u32 gMonPalette_Swalot[];\nextern const u32 gMonBackPic_Swalot[];\nextern const u32 gMonShinyPalette_Swalot[];\nextern const u8 gMonIcon_Swalot[];\nextern const u8 gMonFootprint_Swalot[];\nextern const u32 gMonFrontPic_Tropius[];\nextern const u32 gMonPalette_Tropius[];\nextern const u32 gMonBackPic_Tropius[];\nextern const u32 gMonShinyPalette_Tropius[];\nextern const u8 gMonIcon_Tropius[];\nextern const u8 gMonFootprint_Tropius[];\nextern const u32 gMonFrontPic_Whismur[];\nextern const u32 gMonPalette_Whismur[];\nextern const u32 gMonBackPic_Whismur[];\nextern const u32 gMonShinyPalette_Whismur[];\nextern const u8 gMonIcon_Whismur[];\nextern const u8 gMonFootprint_Whismur[];\nextern const u32 gMonFrontPic_Loudred[];\nextern const u32 gMonPalette_Loudred[];\nextern const u32 gMonBackPic_Loudred[];\nextern const u32 gMonShinyPalette_Loudred[];\nextern const u8 gMonIcon_Loudred[];\nextern const u8 gMonFootprint_Loudred[];\nextern const u32 gMonFrontPic_Exploud[];\nextern const u32 gMonPalette_Exploud[];\nextern const u32 gMonBackPic_Exploud[];\nextern const u32 gMonShinyPalette_Exploud[];\nextern const u8 gMonIcon_Exploud[];\nextern const u8 gMonFootprint_Exploud[];\nextern const u32 gMonFrontPic_Clamperl[];\nextern const u32 gMonPalette_Clamperl[];\nextern const u32 gMonBackPic_Clamperl[];\nextern const u32 gMonShinyPalette_Clamperl[];\nextern const u8 gMonIcon_Clamperl[];\nextern const u8 gMonFootprint_Clamperl[];\nextern const u32 gMonFrontPic_Huntail[];\nextern const u32 gMonPalette_Huntail[];\nextern const u32 gMonBackPic_Huntail[];\nextern const u32 gMonShinyPalette_Huntail[];\nextern const u8 gMonIcon_Huntail[];\nextern const u8 gMonFootprint_Huntail[];\nextern const u32 gMonFrontPic_Gorebyss[];\nextern const u32 gMonPalette_Gorebyss[];\nextern const u32 gMonBackPic_Gorebyss[];\nextern const u32 gMonShinyPalette_Gorebyss[];\nextern const u8 gMonIcon_Gorebyss[];\nextern const u8 gMonFootprint_Gorebyss[];\nextern const u32 gMonFrontPic_Absol[];\nextern const u32 gMonPalette_Absol[];\nextern const u32 gMonBackPic_Absol[];\nextern const u32 gMonShinyPalette_Absol[];\nextern const u8 gMonIcon_Absol[];\nextern const u8 gMonFootprint_Absol[];\nextern const u32 gMonFrontPic_Shuppet[];\nextern const u32 gMonPalette_Shuppet[];\nextern const u32 gMonBackPic_Shuppet[];\nextern const u32 gMonShinyPalette_Shuppet[];\nextern const u8 gMonIcon_Shuppet[];\nextern const u8 gMonFootprint_Shuppet[];\nextern const u32 gMonFrontPic_Banette[];\nextern const u32 gMonPalette_Banette[];\nextern const u32 gMonBackPic_Banette[];\nextern const u32 gMonShinyPalette_Banette[];\nextern const u8 gMonIcon_Banette[];\nextern const u8 gMonFootprint_Banette[];\nextern const u32 gMonFrontPic_Seviper[];\nextern const u32 gMonPalette_Seviper[];\nextern const u32 gMonBackPic_Seviper[];\nextern const u32 gMonShinyPalette_Seviper[];\nextern const u8 gMonIcon_Seviper[];\nextern const u8 gMonFootprint_Seviper[];\nextern const u32 gMonFrontPic_Zangoose[];\nextern const u32 gMonPalette_Zangoose[];\nextern const u32 gMonBackPic_Zangoose[];\nextern const u32 gMonShinyPalette_Zangoose[];\nextern const u8 gMonIcon_Zangoose[];\nextern const u8 gMonFootprint_Zangoose[];\nextern const u32 gMonFrontPic_Relicanth[];\nextern const u32 gMonPalette_Relicanth[];\nextern const u32 gMonBackPic_Relicanth[];\nextern const u32 gMonShinyPalette_Relicanth[];\nextern const u8 gMonIcon_Relicanth[];\nextern const u8 gMonFootprint_Relicanth[];\nextern const u32 gMonFrontPic_Aron[];\nextern const u32 gMonPalette_Aron[];\nextern const u32 gMonBackPic_Aron[];\nextern const u32 gMonShinyPalette_Aron[];\nextern const u8 gMonIcon_Aron[];\nextern const u8 gMonFootprint_Aron[];\nextern const u32 gMonFrontPic_Lairon[];\nextern const u32 gMonPalette_Lairon[];\nextern const u32 gMonBackPic_Lairon[];\nextern const u32 gMonShinyPalette_Lairon[];\nextern const u8 gMonIcon_Lairon[];\nextern const u8 gMonFootprint_Lairon[];\nextern const u32 gMonFrontPic_Aggron[];\nextern const u32 gMonPalette_Aggron[];\nextern const u32 gMonBackPic_Aggron[];\nextern const u32 gMonShinyPalette_Aggron[];\nextern const u8 gMonIcon_Aggron[];\nextern const u8 gMonFootprint_Aggron[];\nextern const u32 gMonFrontPic_Castform[];\nextern const u32 gMonPalette_Castform[];\nextern const u32 gMonBackPic_Castform[];\nextern const u32 gMonShinyPalette_Castform[];\nextern const u8 gMonIcon_Castform[];\nextern const u8 gMonFootprint_Castform[];\nextern const u32 gMonFrontPic_Volbeat[];\nextern const u32 gMonPalette_Volbeat[];\nextern const u32 gMonBackPic_Volbeat[];\nextern const u32 gMonShinyPalette_Volbeat[];\nextern const u8 gMonIcon_Volbeat[];\nextern const u8 gMonFootprint_Volbeat[];\nextern const u32 gMonFrontPic_Illumise[];\nextern const u32 gMonPalette_Illumise[];\nextern const u32 gMonBackPic_Illumise[];\nextern const u32 gMonShinyPalette_Illumise[];\nextern const u8 gMonIcon_Illumise[];\nextern const u8 gMonFootprint_Illumise[];\nextern const u32 gMonFrontPic_Lileep[];\nextern const u32 gMonPalette_Lileep[];\nextern const u32 gMonBackPic_Lileep[];\nextern const u32 gMonShinyPalette_Lileep[];\nextern const u8 gMonIcon_Lileep[];\nextern const u8 gMonFootprint_Lileep[];\nextern const u32 gMonFrontPic_Cradily[];\nextern const u32 gMonPalette_Cradily[];\nextern const u32 gMonBackPic_Cradily[];\nextern const u32 gMonShinyPalette_Cradily[];\nextern const u8 gMonIcon_Cradily[];\nextern const u8 gMonFootprint_Cradily[];\nextern const u32 gMonFrontPic_Anorith[];\nextern const u32 gMonPalette_Anorith[];\nextern const u32 gMonBackPic_Anorith[];\nextern const u32 gMonShinyPalette_Anorith[];\nextern const u8 gMonIcon_Anorith[];\nextern const u8 gMonFootprint_Anorith[];\nextern const u32 gMonFrontPic_Armaldo[];\nextern const u32 gMonPalette_Armaldo[];\nextern const u32 gMonBackPic_Armaldo[];\nextern const u32 gMonShinyPalette_Armaldo[];\nextern const u8 gMonIcon_Armaldo[];\nextern const u8 gMonFootprint_Armaldo[];\nextern const u32 gMonFrontPic_Ralts[];\nextern const u32 gMonPalette_Ralts[];\nextern const u32 gMonBackPic_Ralts[];\nextern const u32 gMonShinyPalette_Ralts[];\nextern const u8 gMonIcon_Ralts[];\nextern const u8 gMonFootprint_Ralts[];\nextern const u32 gMonFrontPic_Kirlia[];\nextern const u32 gMonPalette_Kirlia[];\nextern const u32 gMonBackPic_Kirlia[];\nextern const u32 gMonShinyPalette_Kirlia[];\nextern const u8 gMonIcon_Kirlia[];\nextern const u8 gMonFootprint_Kirlia[];\nextern const u32 gMonFrontPic_Gardevoir[];\nextern const u32 gMonPalette_Gardevoir[];\nextern const u32 gMonBackPic_Gardevoir[];\nextern const u32 gMonShinyPalette_Gardevoir[];\nextern const u8 gMonIcon_Gardevoir[];\nextern const u8 gMonFootprint_Gardevoir[];\nextern const u32 gMonFrontPic_Bagon[];\nextern const u32 gMonPalette_Bagon[];\nextern const u32 gMonBackPic_Bagon[];\nextern const u32 gMonShinyPalette_Bagon[];\nextern const u8 gMonIcon_Bagon[];\nextern const u8 gMonFootprint_Bagon[];\nextern const u32 gMonFrontPic_Shelgon[];\nextern const u32 gMonPalette_Shelgon[];\nextern const u32 gMonBackPic_Shelgon[];\nextern const u32 gMonShinyPalette_Shelgon[];\nextern const u8 gMonIcon_Shelgon[];\nextern const u8 gMonFootprint_Shelgon[];\nextern const u32 gMonFrontPic_Salamence[];\nextern const u32 gMonPalette_Salamence[];\nextern const u32 gMonBackPic_Salamence[];\nextern const u32 gMonShinyPalette_Salamence[];\nextern const u8 gMonIcon_Salamence[];\nextern const u8 gMonFootprint_Salamence[];\nextern const u32 gMonFrontPic_Beldum[];\nextern const u32 gMonPalette_Beldum[];\nextern const u32 gMonBackPic_Beldum[];\nextern const u32 gMonShinyPalette_Beldum[];\nextern const u8 gMonIcon_Beldum[];\nextern const u8 gMonFootprint_Beldum[];\nextern const u32 gMonFrontPic_Metang[];\nextern const u32 gMonPalette_Metang[];\nextern const u32 gMonBackPic_Metang[];\nextern const u32 gMonShinyPalette_Metang[];\nextern const u8 gMonIcon_Metang[];\nextern const u8 gMonFootprint_Metang[];\nextern const u32 gMonFrontPic_Metagross[];\nextern const u32 gMonPalette_Metagross[];\nextern const u32 gMonBackPic_Metagross[];\nextern const u32 gMonShinyPalette_Metagross[];\nextern const u8 gMonIcon_Metagross[];\nextern const u8 gMonFootprint_Metagross[];\nextern const u32 gMonFrontPic_Regirock[];\nextern const u32 gMonPalette_Regirock[];\nextern const u32 gMonBackPic_Regirock[];\nextern const u32 gMonShinyPalette_Regirock[];\nextern const u8 gMonIcon_Regirock[];\nextern const u8 gMonFootprint_Regirock[];\nextern const u32 gMonFrontPic_Regice[];\nextern const u32 gMonPalette_Regice[];\nextern const u32 gMonBackPic_Regice[];\nextern const u32 gMonShinyPalette_Regice[];\nextern const u8 gMonIcon_Regice[];\nextern const u8 gMonFootprint_Regice[];\nextern const u32 gMonFrontPic_Registeel[];\nextern const u32 gMonPalette_Registeel[];\nextern const u32 gMonBackPic_Registeel[];\nextern const u32 gMonShinyPalette_Registeel[];\nextern const u8 gMonIcon_Registeel[];\nextern const u8 gMonFootprint_Registeel[];\nextern const u32 gMonFrontPic_Kyogre[];\nextern const u32 gMonPalette_Kyogre[];\nextern const u32 gMonBackPic_Kyogre[];\nextern const u32 gMonShinyPalette_Kyogre[];\nextern const u8 gMonIcon_Kyogre[];\nextern const u8 gMonFootprint_Kyogre[];\nextern const u32 gMonFrontPic_Groudon[];\nextern const u32 gMonPalette_Groudon[];\nextern const u32 gMonBackPic_Groudon[];\nextern const u32 gMonShinyPalette_Groudon[];\nextern const u8 gMonIcon_Groudon[];\nextern const u8 gMonFootprint_Groudon[];\nextern const u32 gMonFrontPic_Rayquaza[];\nextern const u32 gMonPalette_Rayquaza[];\nextern const u32 gMonBackPic_Rayquaza[];\nextern const u32 gMonShinyPalette_Rayquaza[];\nextern const u8 gMonIcon_Rayquaza[];\nextern const u8 gMonFootprint_Rayquaza[];\nextern const u32 gMonFrontPic_Latias[];\nextern const u32 gMonPalette_Latias[];\nextern const u32 gMonBackPic_Latias[];\nextern const u32 gMonShinyPalette_Latias[];\nextern const u8 gMonIcon_Latias[];\nextern const u8 gMonFootprint_Latias[];\nextern const u32 gMonFrontPic_Latios[];\nextern const u32 gMonPalette_Latios[];\nextern const u32 gMonBackPic_Latios[];\nextern const u32 gMonShinyPalette_Latios[];\nextern const u8 gMonIcon_Latios[];\nextern const u8 gMonFootprint_Latios[];\nextern const u32 gMonFrontPic_Jirachi[];\nextern const u32 gMonPalette_Jirachi[];\nextern const u32 gMonBackPic_Jirachi[];\nextern const u32 gMonShinyPalette_Jirachi[];\nextern const u8 gMonIcon_Jirachi[];\nextern const u8 gMonFootprint_Jirachi[];\nextern const u32 gMonFrontPic_Deoxys[];\nextern const u32 gMonPalette_Deoxys[];\nextern const u32 gMonBackPic_Deoxys[];\nextern const u32 gMonShinyPalette_Deoxys[];\nextern const u8 gMonIcon_Deoxys[];\nextern const u8 gMonFootprint_Deoxys[];\nextern const u32 gMonFrontPic_Chimecho[];\nextern const u32 gMonPalette_Chimecho[];\nextern const u32 gMonBackPic_Chimecho[];\nextern const u32 gMonShinyPalette_Chimecho[];\nextern const u8 gMonIcon_Chimecho[];\nextern const u8 gMonFootprint_Chimecho[];\nextern const u32 gMonFrontPic_Egg[];\nextern const u32 gMonPalette_Egg[];\nextern const u8 gMonIcon_Egg[];\nextern const u32 gMonFrontPic_UnownB[];\nextern const u32 gMonBackPic_UnownB[];\nextern const u8 gMonIcon_UnownB[];\nextern const u32 gMonFrontPic_UnownC[];\nextern const u32 gMonBackPic_UnownC[];\nextern const u8 gMonIcon_UnownC[];\nextern const u32 gMonFrontPic_UnownD[];\nextern const u32 gMonBackPic_UnownD[];\nextern const u8 gMonIcon_UnownD[];\nextern const u32 gMonFrontPic_UnownE[];\nextern const u32 gMonBackPic_UnownE[];\nextern const u8 gMonIcon_UnownE[];\nextern const u32 gMonFrontPic_UnownF[];\nextern const u32 gMonBackPic_UnownF[];\nextern const u8 gMonIcon_UnownF[];\nextern const u32 gMonFrontPic_UnownG[];\nextern const u32 gMonBackPic_UnownG[];\nextern const u8 gMonIcon_UnownG[];\nextern const u32 gMonFrontPic_UnownH[];\nextern const u32 gMonBackPic_UnownH[];\nextern const u8 gMonIcon_UnownH[];\nextern const u32 gMonFrontPic_UnownI[];\nextern const u32 gMonBackPic_UnownI[];\nextern const u8 gMonIcon_UnownI[];\nextern const u32 gMonFrontPic_UnownJ[];\nextern const u32 gMonBackPic_UnownJ[];\nextern const u8 gMonIcon_UnownJ[];\nextern const u32 gMonFrontPic_UnownK[];\nextern const u32 gMonBackPic_UnownK[];\nextern const u8 gMonIcon_UnownK[];\nextern const u32 gMonFrontPic_UnownL[];\nextern const u32 gMonBackPic_UnownL[];\nextern const u8 gMonIcon_UnownL[];\nextern const u32 gMonFrontPic_UnownM[];\nextern const u32 gMonBackPic_UnownM[];\nextern const u8 gMonIcon_UnownM[];\nextern const u32 gMonFrontPic_UnownN[];\nextern const u32 gMonBackPic_UnownN[];\nextern const u8 gMonIcon_UnownN[];\nextern const u32 gMonFrontPic_UnownO[];\nextern const u32 gMonBackPic_UnownO[];\nextern const u8 gMonIcon_UnownO[];\nextern const u32 gMonFrontPic_UnownP[];\nextern const u32 gMonBackPic_UnownP[];\nextern const u8 gMonIcon_UnownP[];\nextern const u32 gMonFrontPic_UnownQ[];\nextern const u32 gMonBackPic_UnownQ[];\nextern const u8 gMonIcon_UnownQ[];\nextern const u32 gMonFrontPic_UnownR[];\nextern const u32 gMonBackPic_UnownR[];\nextern const u8 gMonIcon_UnownR[];\nextern const u32 gMonFrontPic_UnownS[];\nextern const u32 gMonBackPic_UnownS[];\nextern const u8 gMonIcon_UnownS[];\nextern const u32 gMonFrontPic_UnownT[];\nextern const u32 gMonBackPic_UnownT[];\nextern const u8 gMonIcon_UnownT[];\nextern const u32 gMonFrontPic_UnownU[];\nextern const u32 gMonBackPic_UnownU[];\nextern const u8 gMonIcon_UnownU[];\nextern const u32 gMonFrontPic_UnownV[];\nextern const u32 gMonBackPic_UnownV[];\nextern const u8 gMonIcon_UnownV[];\nextern const u32 gMonFrontPic_UnownW[];\nextern const u32 gMonBackPic_UnownW[];\nextern const u8 gMonIcon_UnownW[];\nextern const u32 gMonFrontPic_UnownX[];\nextern const u32 gMonBackPic_UnownX[];\nextern const u8 gMonIcon_UnownX[];\nextern const u32 gMonFrontPic_UnownY[];\nextern const u32 gMonBackPic_UnownY[];\nextern const u8 gMonIcon_UnownY[];\nextern const u32 gMonFrontPic_UnownZ[];\nextern const u32 gMonBackPic_UnownZ[];\nextern const u8 gMonIcon_UnownZ[];\nextern const u32 gMonFrontPic_UnownExclamationMark[];\nextern const u32 gMonBackPic_UnownExclamationMark[];\nextern const u8 gMonIcon_UnownExclamationMark[];\nextern const u32 gMonFrontPic_UnownQuestionMark[];\nextern const u32 gMonBackPic_UnownQuestionMark[];\nextern const u8 gMonIcon_UnownQuestionMark[];\n\nextern const u32 gMonFrontPic_CircledQuestionMark[];\nextern const u32 gMonBackPic_CircledQuestionMark[];\nextern const u32 gMonPalette_CircledQuestionMark[];\nextern const u32 gMonShinyPalette_CircledQuestionMark[];\nextern const u8 gMonIcon_QuestionMark[];\nextern const u8 gMonFootprint_QuestionMark[];\nextern const u32 gMonFrontPic_DoubleQuestionMark[];\nextern const u32 gMonBackPic_DoubleQuestionMark[];\nextern const u32 gMonPalette_DoubleQuestionMark[];\nextern const u32 gMonShinyPalette_DoubleQuestionMark[];\n\n// trainer sprites\nextern const u32 gTrainerFrontPic_AquaLeaderArchie[];\nextern const u32 gTrainerFrontPic_AquaGruntM[];\nextern const u32 gTrainerFrontPic_AquaGruntF[];\nextern const u32 gTrainerFrontPic_RSAromaLady[];\nextern const u32 gTrainerFrontPic_RSRuinManiac[];\nextern const u32 gTrainerFrontPic_Interviewer[];\nextern const u32 gTrainerFrontPic_RSTuberF[];\nextern const u32 gTrainerFrontPic_TuberM[];\nextern const u32 gTrainerFrontPic_RSCooltrainerM[];\nextern const u32 gTrainerFrontPic_RSCooltrainerF[];\nextern const u32 gTrainerFrontPic_HexManiac[];\nextern const u32 gTrainerFrontPic_RSLady[];\nextern const u32 gTrainerFrontPic_RSBeauty[];\nextern const u32 gTrainerFrontPic_RichBoy[];\nextern const u32 gTrainerFrontPic_RSPokeManiac[];\nextern const u32 gTrainerFrontPic_RSSwimmerM[];\nextern const u32 gTrainerFrontPic_RSBlackBelt[];\nextern const u32 gTrainerFrontPic_Guitarist[];\nextern const u32 gTrainerFrontPic_Kindler[];\nextern const u32 gTrainerFrontPic_RSCamper[];\nextern const u32 gTrainerFrontPic_BugManiac[];\nextern const u32 gTrainerFrontPic_RSPsychicM[];\nextern const u32 gTrainerFrontPic_RSPsychicF[];\nextern const u32 gTrainerFrontPic_RSGentleman[];\nextern const u32 gTrainerFrontPic_EliteFourSidney[];\nextern const u32 gTrainerFrontPic_EliteFourPhoebe[];\nextern const u32 gTrainerFrontPic_LeaderRoxanne[];\nextern const u32 gTrainerFrontPic_LeaderBrawly[];\nextern const u32 gTrainerFrontPic_LeaderTateAndLiza[];\nextern const u32 gTrainerFrontPic_SchoolKidM[];\nextern const u32 gTrainerFrontPic_SchoolKidF[];\nextern const u32 gTrainerFrontPic_SrAndJr[];\nextern const u32 gTrainerFrontPic_PokefanM[];\nextern const u32 gTrainerFrontPic_PokefanF[];\nextern const u32 gTrainerFrontPic_ExpertM[];\nextern const u32 gTrainerFrontPic_ExpertF[];\nextern const u32 gTrainerFrontPic_RSYoungster[];\nextern const u32 gTrainerFrontPic_ChampionSteven[];\nextern const u32 gTrainerFrontPic_RSFisherman[];\nextern const u32 gTrainerFrontPic_CyclingTriathleteM[];\nextern const u32 gTrainerFrontPic_CyclingTriathleteF[];\nextern const u32 gTrainerFrontPic_RunningTriathleteM[];\nextern const u32 gTrainerFrontPic_RunningTriathleteF[];\nextern const u32 gTrainerFrontPic_SwimmingTriathleteM[];\nextern const u32 gTrainerFrontPic_SwimmingTriathleteF[];\nextern const u32 gTrainerFrontPic_DragonTamer[];\nextern const u32 gTrainerFrontPic_RSBirdKeeper[];\nextern const u32 gTrainerFrontPic_NinjaBoy[];\nextern const u32 gTrainerFrontPic_BattleGirl[];\nextern const u32 gTrainerFrontPic_ParasolLady[];\nextern const u32 gTrainerFrontPic_RSSwimmerF[];\nextern const u32 gTrainerFrontPic_RSPicnicker[];\nextern const u32 gTrainerFrontPic_RSTwins[];\nextern const u32 gTrainerFrontPic_RSSailor[];\nextern const u32 gTrainerFrontPic_Collector[];\nextern const u32 gTrainerFrontPic_Wally[];\nextern const u32 gTrainerFrontPic_RSBrendan1[];\nextern const u32 gTrainerFrontPic_RSMay1[];\nextern const u32 gTrainerFrontPic_RSPokemonBreederM[];\nextern const u32 gTrainerFrontPic_RSPokemonBreederF[];\nextern const u32 gTrainerFrontPic_RSPokemonRangerM[];\nextern const u32 gTrainerFrontPic_RSPokemonRangerF[];\nextern const u32 gTrainerFrontPic_MagmaLeaderMaxie[];\nextern const u32 gTrainerFrontPic_MagmaGruntM[];\nextern const u32 gTrainerFrontPic_MagmaGruntF[];\nextern const u32 gTrainerFrontPic_RSLass[];\nextern const u32 gTrainerFrontPic_RSBugCatcher[];\nextern const u32 gTrainerFrontPic_RSHiker[];\nextern const u32 gTrainerFrontPic_RSYoungCouple[];\nextern const u32 gTrainerFrontPic_OldCouple[];\nextern const u32 gTrainerFrontPic_RSSisAndBro[];\nextern const u32 gTrainerFrontPic_AquaAdminM[];\nextern const u32 gTrainerFrontPic_AquaAdminF[];\nextern const u32 gTrainerFrontPic_MagmaAdminM[];\nextern const u32 gTrainerFrontPic_MagmaAdminF[];\nextern const u32 gTrainerFrontPic_LeaderWattson[];\nextern const u32 gTrainerFrontPic_LeaderFlannery[];\nextern const u32 gTrainerFrontPic_LeaderNorman[];\nextern const u32 gTrainerFrontPic_LeaderWinona[];\nextern const u32 gTrainerFrontPic_LeaderWallace[];\nextern const u32 gTrainerFrontPic_EliteFourGlacia[];\nextern const u32 gTrainerFrontPic_EliteFourDrake[];\nextern const u32 gTrainerFrontPic_Youngster[];\nextern const u32 gTrainerFrontPic_BugCatcher[];\nextern const u32 gTrainerFrontPic_Lass[];\nextern const u32 gTrainerFrontPic_Sailor[];\nextern const u32 gTrainerFrontPic_Camper[];\nextern const u32 gTrainerFrontPic_Picnicker[];\nextern const u32 gTrainerFrontPic_PokeManiac[];\nextern const u32 gTrainerFrontPic_SuperNerd[];\nextern const u32 gTrainerFrontPic_Hiker[];\nextern const u32 gTrainerFrontPic_Biker[];\nextern const u32 gTrainerFrontPic_Burglar[];\nextern const u32 gTrainerFrontPic_Engineer[];\nextern const u32 gTrainerFrontPic_Fisherman[];\nextern const u32 gTrainerFrontPic_SwimmerM[];\nextern const u32 gTrainerFrontPic_CueBall[];\nextern const u32 gTrainerFrontPic_Gamer[];\nextern const u32 gTrainerFrontPic_Beauty[];\nextern const u32 gTrainerFrontPic_SwimmerF[];\nextern const u32 gTrainerFrontPic_PsychicM[];\nextern const u32 gTrainerFrontPic_Rocker[];\nextern const u32 gTrainerFrontPic_Juggler[];\nextern const u32 gTrainerFrontPic_Tamer[];\nextern const u32 gTrainerFrontPic_BirdKeeper[];\nextern const u32 gTrainerFrontPic_BlackBelt[];\nextern const u32 gTrainerFrontPic_RivalEarly[];\nextern const u32 gTrainerFrontPic_Scientist[];\nextern const u32 gTrainerFrontPic_LeaderGiovanni[];\nextern const u32 gTrainerFrontPic_RocketGruntM[];\nextern const u32 gTrainerFrontPic_CooltrainerM[];\nextern const u32 gTrainerFrontPic_CooltrainerF[];\nextern const u32 gTrainerFrontPic_EliteFourLorelei[];\nextern const u32 gTrainerFrontPic_EliteFourBruno[];\nextern const u32 gTrainerFrontPic_EliteFourAgatha[];\nextern const u32 gTrainerFrontPic_EliteFourLance[];\nextern const u32 gTrainerFrontPic_LeaderBrock[];\nextern const u32 gTrainerFrontPic_LeaderMisty[];\nextern const u32 gTrainerFrontPic_LeaderLtSurge[];\nextern const u32 gTrainerFrontPic_LeaderErika[];\nextern const u32 gTrainerFrontPic_LeaderKoga[];\nextern const u32 gTrainerFrontPic_LeaderBlaine[];\nextern const u32 gTrainerFrontPic_LeaderSabrina[];\nextern const u32 gTrainerFrontPic_Gentleman[];\nextern const u32 gTrainerFrontPic_RivalLate[];\nextern const u32 gTrainerFrontPic_ChampionRival[];\nextern const u32 gTrainerFrontPic_Channeler[];\nextern const u32 gTrainerFrontPic_Twins[];\nextern const u32 gTrainerFrontPic_CoolCouple[];\nextern const u32 gTrainerFrontPic_YoungCouple[];\nextern const u32 gTrainerFrontPic_CrushKin[];\nextern const u32 gTrainerFrontPic_SisAndBro[];\nextern const u32 gTrainerFrontPic_ProfessorOak[];\nextern const u32 gTrainerFrontPic_RSBrendan2[];\nextern const u32 gTrainerFrontPic_RSMay2[];\nextern const u32 gTrainerFrontPic_Red[];\nextern const u32 gTrainerFrontPic_Leaf[];\nextern const u32 gTrainerFrontPic_RocketGruntF[];\nextern const u32 gTrainerFrontPic_PsychicF[];\nextern const u32 gTrainerFrontPic_CrushGirl[];\nextern const u32 gTrainerFrontPic_TuberF[];\nextern const u32 gTrainerFrontPic_PokemonBreeder[];\nextern const u32 gTrainerFrontPic_PokemonRangerM[];\nextern const u32 gTrainerFrontPic_PokemonRangerF[];\nextern const u32 gTrainerFrontPic_AromaLady[];\nextern const u32 gTrainerFrontPic_RuinManiac[];\nextern const u32 gTrainerFrontPic_Lady[];\nextern const u32 gTrainerFrontPic_Painter[];\nextern const u32 gTrainerFrontPic_EmBrendan[];\nextern const u32 gTrainerFrontPic_EmMay[];\nextern const u32 gTrainerFrontPic_MasterBeauty[];\nextern const u32 gTrainerFrontPic_MasterBirdKeeper[];\nextern const u32 gTrainerFrontPic_MasterBlackBelt[];\nextern const u32 gTrainerFrontPic_MasterBugCatcher[];\nextern const u32 gTrainerFrontPic_MasterCooltrainerM[];\nextern const u32 gTrainerFrontPic_MasterHiker[];\nextern const u32 gTrainerFrontPic_MasterLass[];\nextern const u32 gTrainerFrontPic_MasterPsychicM[];\nextern const u32 gTrainerFrontPic_MasterScientist[];\nextern const u32 gTrainerFrontPic_MasterYoungster[];\nextern const u32 gTrainerFrontPic_MasterSwimmer[];\n\nextern const u32 gTrainerPalette_AquaLeaderArchie[];\nextern const u32 gTrainerPalette_AquaGruntM[];\nextern const u32 gTrainerPalette_AquaGruntF[];\nextern const u32 gTrainerPalette_RSAromaLady[];\nextern const u32 gTrainerPalette_RSRuinManiac[];\nextern const u32 gTrainerPalette_Interviewer[];\nextern const u32 gTrainerPalette_RSTuberF[];\nextern const u32 gTrainerPalette_TuberM[];\nextern const u32 gTrainerPalette_RSCooltrainerM[];\nextern const u32 gTrainerPalette_RSCooltrainerF[];\nextern const u32 gTrainerPalette_HexManiac[];\nextern const u32 gTrainerPalette_RSLady[];\nextern const u32 gTrainerPalette_RSBeauty[];\nextern const u32 gTrainerPalette_RichBoy[];\nextern const u32 gTrainerPalette_RSPokeManiac[];\nextern const u32 gTrainerPalette_RSSwimmerM[];\nextern const u32 gTrainerPalette_RSBlackBelt[];\nextern const u32 gTrainerPalette_Guitarist[];\nextern const u32 gTrainerPalette_Kindler[];\nextern const u32 gTrainerPalette_RSCamper[];\nextern const u32 gTrainerPalette_BugManiac[];\nextern const u32 gTrainerPalette_RSPsychicM[];\nextern const u32 gTrainerPalette_RSPsychicF[];\nextern const u32 gTrainerPalette_RSGentleman[];\nextern const u32 gTrainerPalette_EliteFourSidney[];\nextern const u32 gTrainerPalette_EliteFourPhoebe[];\nextern const u32 gTrainerPalette_LeaderRoxanne[];\nextern const u32 gTrainerPalette_LeaderBrawly[];\nextern const u32 gTrainerPalette_LeaderTateAndLiza[];\nextern const u32 gTrainerPalette_SchoolKidM[];\nextern const u32 gTrainerPalette_SchoolKidF[];\nextern const u32 gTrainerPalette_SrAndJr[];\nextern const u32 gTrainerPalette_PokefanM[];\nextern const u32 gTrainerPalette_PokefanF[];\nextern const u32 gTrainerPalette_ExpertM[];\nextern const u32 gTrainerPalette_ExpertF[];\nextern const u32 gTrainerPalette_RSYoungster[];\nextern const u32 gTrainerPalette_ChampionSteven[];\nextern const u32 gTrainerPalette_RSFisherman[];\nextern const u32 gTrainerPalette_CyclingTriathleteM[];\nextern const u32 gTrainerPalette_CyclingTriathleteF[];\nextern const u32 gTrainerPalette_RunningTriathleteM[];\nextern const u32 gTrainerPalette_RunningTriathleteF[];\nextern const u32 gTrainerPalette_SwimmingTriathleteM[];\nextern const u32 gTrainerPalette_SwimmingTriathleteF[];\nextern const u32 gTrainerPalette_DragonTamer[];\nextern const u32 gTrainerPalette_RSBirdKeeper[];\nextern const u32 gTrainerPalette_NinjaBoy[];\nextern const u32 gTrainerPalette_BattleGirl[];\nextern const u32 gTrainerPalette_ParasolLady[];\nextern const u32 gTrainerPalette_RSSwimmerF[];\nextern const u32 gTrainerPalette_RSPicnicker[];\nextern const u32 gTrainerPalette_RSTwins[];\nextern const u32 gTrainerPalette_RSSailor[];\nextern const u32 gTrainerPalette_Collector[];\nextern const u32 gTrainerPalette_Wally[];\nextern const u32 gTrainerPalette_RSBrendan1[];\nextern const u32 gTrainerPalette_RSMay1[];\nextern const u32 gTrainerPalette_LeafBackPic[];\nextern const u32 gTrainerPalette_RedBackPic[];\nextern const u32 gTrainerPalette_PokedudeBackPic[];\nextern const u32 gTrainerPalette_OldManBackPic[];\nextern const u32 gTrainerPalette_RSPokemonBreederM[];\nextern const u32 gTrainerPalette_RSPokemonBreederF[];\nextern const u32 gTrainerPalette_RSPokemonRangerM[];\nextern const u32 gTrainerPalette_RSPokemonRangerF[];\nextern const u32 gTrainerPalette_MagmaLeaderMaxie[];\nextern const u32 gTrainerPalette_MagmaGruntM[];\nextern const u32 gTrainerPalette_MagmaGruntF[];\nextern const u32 gTrainerPalette_RSLass[];\nextern const u32 gTrainerPalette_RSBugCatcher[];\nextern const u32 gTrainerPalette_RSHiker[];\nextern const u32 gTrainerPalette_RSYoungCouple[];\nextern const u32 gTrainerPalette_OldCouple[];\nextern const u32 gTrainerPalette_RSSisAndBro[];\nextern const u32 gTrainerPalette_AquaAdminM[];\nextern const u32 gTrainerPalette_AquaAdminF[];\nextern const u32 gTrainerPalette_MagmaAdminM[];\nextern const u32 gTrainerPalette_MagmaAdminF[];\nextern const u32 gTrainerPalette_LeaderWattson[];\nextern const u32 gTrainerPalette_LeaderFlannery[];\nextern const u32 gTrainerPalette_LeaderNorman[];\nextern const u32 gTrainerPalette_LeaderWinona[];\nextern const u32 gTrainerPalette_LeaderWallace[];\nextern const u32 gTrainerPalette_EliteFourGlacia[];\nextern const u32 gTrainerPalette_EliteFourDrake[];\nextern const u32 gTrainerPalette_Youngster[];\nextern const u32 gTrainerPalette_BugCatcher[];\nextern const u32 gTrainerPalette_Lass[];\nextern const u32 gTrainerPalette_Sailor[];\nextern const u32 gTrainerPalette_Camper[];\nextern const u32 gTrainerPalette_Picnicker[];\nextern const u32 gTrainerPalette_PokeManiac[];\nextern const u32 gTrainerPalette_SuperNerd[];\nextern const u32 gTrainerPalette_Hiker[];\nextern const u32 gTrainerPalette_Biker[];\nextern const u32 gTrainerPalette_Burglar[];\nextern const u32 gTrainerPalette_Engineer[];\nextern const u32 gTrainerPalette_Fisherman[];\nextern const u32 gTrainerPalette_SwimmerM[];\nextern const u32 gTrainerPalette_CueBall[];\nextern const u32 gTrainerPalette_Gamer[];\nextern const u32 gTrainerPalette_Beauty[];\nextern const u32 gTrainerPalette_SwimmerF[];\nextern const u32 gTrainerPalette_PsychicM[];\nextern const u32 gTrainerPalette_Rocker[];\nextern const u32 gTrainerPalette_Juggler[];\nextern const u32 gTrainerPalette_Tamer[];\nextern const u32 gTrainerPalette_BirdKeeper[];\nextern const u32 gTrainerPalette_BlackBelt[];\nextern const u32 gTrainerPalette_RivalEarly[];\nextern const u32 gTrainerPalette_Scientist[];\nextern const u32 gTrainerPalette_LeaderGiovanni[];\nextern const u32 gTrainerPalette_RocketGruntM[];\nextern const u32 gTrainerPalette_CooltrainerM[];\nextern const u32 gTrainerPalette_CooltrainerF[];\nextern const u32 gTrainerPalette_EliteFourLorelei[];\nextern const u32 gTrainerPalette_EliteFourBruno[];\nextern const u32 gTrainerPalette_EliteFourAgatha[];\nextern const u32 gTrainerPalette_EliteFourLance[];\nextern const u32 gTrainerPalette_LeaderBrock[];\nextern const u32 gTrainerPalette_LeaderMisty[];\nextern const u32 gTrainerPalette_LeaderLtSurge[];\nextern const u32 gTrainerPalette_LeaderErika[];\nextern const u32 gTrainerPalette_LeaderKoga[];\nextern const u32 gTrainerPalette_LeaderBlaine[];\nextern const u32 gTrainerPalette_LeaderSabrina[];\nextern const u32 gTrainerPalette_Gentleman[];\nextern const u32 gTrainerPalette_RivalLate[];\nextern const u32 gTrainerPalette_ChampionRival[];\nextern const u32 gTrainerPalette_Channeler[];\nextern const u32 gTrainerPalette_Twins[];\nextern const u32 gTrainerPalette_CoolCouple[];\nextern const u32 gTrainerPalette_YoungCouple[];\nextern const u32 gTrainerPalette_CrushKin[];\nextern const u32 gTrainerPalette_SisAndBro[];\nextern const u32 gTrainerPalette_ProfessorOak[];\nextern const u32 gTrainerPalette_RSBrendan2[];\nextern const u32 gTrainerPalette_RSMay2[];\nextern const u32 gTrainerPalette_Red[];\nextern const u32 gTrainerPalette_Leaf[];\nextern const u32 gTrainerPalette_RocketGruntF[];\nextern const u32 gTrainerPalette_PsychicF[];\nextern const u32 gTrainerPalette_CrushGirl[];\nextern const u32 gTrainerPalette_TuberF[];\nextern const u32 gTrainerPalette_PokemonBreeder[];\nextern const u32 gTrainerPalette_PokemonRangerM[];\nextern const u32 gTrainerPalette_PokemonRangerF[];\nextern const u32 gTrainerPalette_AromaLady[];\nextern const u32 gTrainerPalette_RuinManiac[];\nextern const u32 gTrainerPalette_Lady[];\nextern const u32 gTrainerPalette_Painter[];\nextern const u32 gTrainerPalette_EmMay[];\nextern const u32 gTrainerPalette_EmBrendan[];\nextern const u32 gTrainerPalette_MasterBeauty[];\nextern const u32 gTrainerPalette_MasterBirdKeeper[];\nextern const u32 gTrainerPalette_MasterBlackBelt[];\nextern const u32 gTrainerPalette_MasterBugCatcher[];\nextern const u32 gTrainerPalette_MasterCooltrainerM[];\nextern const u32 gTrainerPalette_MasterHiker[];\nextern const u32 gTrainerPalette_MasterLass[];\nextern const u32 gTrainerPalette_MasterPsychicM[];\nextern const u32 gTrainerPalette_MasterScientist[];\nextern const u32 gTrainerPalette_MasterYoungster[];\nextern const u32 gTrainerPalette_MasterSwimmer[];\n\nextern const u8 gMenuInfoElements_Gfx[];\nextern const u16 gMenuInfoElements1_Pal[];\nextern const u16 gMenuInfoElements2_Pal[];\n\nextern const u32 gItemIcon_QuestionMark[];\nextern const u32 gItemIconPalette_QuestionMark[];\n\n// fame_checker\nextern const u16 gFameCheckerBgPals[][16];\nextern const u16 gFameCheckerBgTiles[0xa50];\nextern const u16 gFameCheckerBg3Tilemap[0x400];\nextern const u16 gFameCheckerBg2Tilemap[0x400];\n\n// tm_case\nextern const u32 gTMCase_Gfx[];\nextern const u32 gTMCaseMenu_Tilemap[];\nextern const u32 gTMCase_Tilemap[];\nextern const u32 gTMCaseMenu_Male_Pal[];\nextern const u32 gTMCaseMenu_Female_Pal[];\nextern const u32 gTMCaseDisc_Gfx[];\nextern const u32 gTMCaseDiscTypes1_Pal[];\nextern const u32 gTMCaseDiscTypes2_Pal[];\nextern const u8 gTMCaseHM_Gfx[];\n\nextern const u16 gStandardMenuPalette[];\n\n// egg_hatch\nextern const u32 gTradeGba2_Pal[];\nextern const u32 gTradeGba_Gfx[];\n\n// teachy_tv\nextern const u8 gTeachyTv_Gfx[];\nextern const u8 gTeachyTvScreen_Tilemap[];\nextern const u8 gTeachyTvTitle_Tilemap[];\nextern const u32 gTeachyTv_Pal[];\n\n// berry_fix_program\nextern const u8 gBerryFixGameboy_Gfx[];\nextern const u8 gBerryFixGameboy_Tilemap[];\nextern const u8 gBerryFixGameboy_Pal[];\nextern const u8 gBerryFixGameboyLogo_Gfx[];\nextern const u8 gBerryFixGameboyLogo_Tilemap[];\nextern const u8 gBerryFixGameboyLogo_Pal[];\nextern const u8 gBerryFixGbaTransfer_Gfx[];\nextern const u8 gBerryFixGbaTransfer_Tilemap[];\nextern const u8 gBerryFixGbaTransfer_Pal[];\nextern const u8 gBerryFixGbaTransferHighlight_Gfx[];\nextern const u8 gBerryFixGbaTransferHighlight_Tilemap[];\nextern const u8 gBerryFixGbaTransferHighlight_Pal[];\nextern const u8 gBerryFixGbaTransferError_Gfx[];\nextern const u8 gBerryFixGbaTransferError_Tilemap[];\nextern const u8 gBerryFixGbaTransferError_Pal[];\nextern const u8 gBerryFixWindow_Gfx[];\nextern const u8 gBerryFixWindow_Tilemap[];\nextern const u8 gBerryFixWindow_Pal[];\n\n// item_pc\nextern const u8 gItemPcTiles[];\nextern const u32 gItemPcBgPals[];\nextern const u8 gItemPcTilemap[];\n\n// item_menu_icons\nextern const u32 gBagMale_Gfx[];\nextern const u32 gBagFemale_Gfx[];\nextern const u32 gBag_Pal[];\nextern const u32 gSwapLine_Gfx[];\nextern const u32 gSwapLine_Pal[];\nextern const u32 gItemIcon_MasterBall[];\nextern const u32 gItemIconPalette_MasterBall[];\nextern const u32 gItemIcon_UltraBall[];\nextern const u32 gItemIconPalette_UltraBall[];\nextern const u32 gItemIcon_GreatBall[];\nextern const u32 gItemIconPalette_GreatBall[];\nextern const u32 gItemIcon_PokeBall[];\nextern const u32 gItemIconPalette_PokeBall[];\nextern const u32 gItemIcon_SafariBall[];\nextern const u32 gItemIconPalette_SafariBall[];\nextern const u32 gItemIcon_NetBall[];\nextern const u32 gItemIconPalette_NetBall[];\nextern const u32 gItemIcon_DiveBall[];\nextern const u32 gItemIconPalette_DiveBall[];\nextern const u32 gItemIcon_NestBall[];\nextern const u32 gItemIconPalette_NestBall[];\nextern const u32 gItemIcon_RepeatBall[];\nextern const u32 gItemIconPalette_RepeatBall[];\nextern const u32 gItemIcon_TimerBall[];\nextern const u32 gItemIcon_LuxuryBall[];\nextern const u32 gItemIconPalette_LuxuryBall[];\nextern const u32 gItemIcon_PremierBall[];\nextern const u32 gItemIcon_Potion[];\nextern const u32 gItemIconPalette_Potion[];\nextern const u32 gItemIcon_Antidote[];\nextern const u32 gItemIconPalette_Antidote[];\nextern const u32 gItemIcon_StatusHeal[];\nextern const u32 gItemIconPalette_BurnHeal[];\nextern const u32 gItemIconPalette_IceHeal[];\nextern const u32 gItemIconPalette_Awakening[];\nextern const u32 gItemIconPalette_ParalyzeHeal[];\nextern const u32 gItemIcon_LargePotion[];\nextern const u32 gItemIconPalette_FullRestore[];\nextern const u32 gItemIconPalette_MaxPotion[];\nextern const u32 gItemIconPalette_HyperPotion[];\nextern const u32 gItemIconPalette_SuperPotion[];\nextern const u32 gItemIcon_FullHeal[];\nextern const u32 gItemIconPalette_FullHeal[];\nextern const u32 gItemIcon_Revive[];\nextern const u32 gItemIconPalette_Revive[];\nextern const u32 gItemIcon_MaxRevive[];\nextern const u32 gItemIcon_FreshWater[];\nextern const u32 gItemIconPalette_FreshWater[];\nextern const u32 gItemIcon_SodaPop[];\nextern const u32 gItemIconPalette_SodaPop[];\nextern const u32 gItemIcon_Lemonade[];\nextern const u32 gItemIconPalette_Lemonade[];\nextern const u32 gItemIcon_MoomooMilk[];\nextern const u32 gItemIconPalette_MoomooMilk[];\nextern const u32 gItemIcon_Powder[];\nextern const u32 gItemIconPalette_EnergyPowder[];\nextern const u32 gItemIcon_EnergyRoot[];\nextern const u32 gItemIconPalette_EnergyRoot[];\nextern const u32 gItemIconPalette_HealPowder[];\nextern const u32 gItemIcon_RevivalHerb[];\nextern const u32 gItemIconPalette_RevivalHerb[];\nextern const u32 gItemIcon_Ether[];\nextern const u32 gItemIconPalette_Ether[];\nextern const u32 gItemIconPalette_MaxEther[];\nextern const u32 gItemIconPalette_Elixir[];\nextern const u32 gItemIconPalette_MaxElixir[];\nextern const u32 gItemIcon_LavaCookie[];\nextern const u32 gItemIconPalette_LavaCookieAndLetter[];\nextern const u32 gItemIcon_Flute[];\nextern const u32 gItemIconPalette_BlueFlute[];\nextern const u32 gItemIconPalette_YellowFlute[];\nextern const u32 gItemIconPalette_RedFlute[];\nextern const u32 gItemIconPalette_BlackFlute[];\nextern const u32 gItemIconPalette_WhiteFlute[];\nextern const u32 gItemIcon_BerryJuice[];\nextern const u32 gItemIconPalette_BerryJuice[];\nextern const u32 gItemIcon_SacredAsh[];\nextern const u32 gItemIconPalette_SacredAsh[];\nextern const u32 gItemIconPalette_ShoalSalt[];\nextern const u32 gItemIcon_ShoalShell[];\nextern const u32 gItemIconPalette_Shell[];\nextern const u32 gItemIcon_Shard[];\nextern const u32 gItemIconPalette_RedShard[];\nextern const u32 gItemIconPalette_BlueShard[];\nextern const u32 gItemIconPalette_YellowShard[];\nextern const u32 gItemIconPalette_GreenShard[];\nextern const u32 gItemIcon_HPUp[];\nextern const u32 gItemIconPalette_HPUp[];\nextern const u32 gItemIcon_Vitamin[];\nextern const u32 gItemIconPalette_Protein[];\nextern const u32 gItemIconPalette_Iron[];\nextern const u32 gItemIconPalette_Carbos[];\nextern const u32 gItemIconPalette_Calcium[];\nextern const u32 gItemIcon_RareCandy[];\nextern const u32 gItemIconPalette_RareCandy[];\nextern const u32 gItemIcon_PPUp[];\nextern const u32 gItemIconPalette_PPUp[];\nextern const u32 gItemIconPalette_Zinc[];\nextern const u32 gItemIcon_PPMax[];\nextern const u32 gItemIconPalette_PPMax[];\nextern const u32 gItemIcon_BattleStatItem[];\nextern const u32 gItemIconPalette_GuardSpec[];\nextern const u32 gItemIconPalette_DireHit[];\nextern const u32 gItemIconPalette_XAttack[];\nextern const u32 gItemIconPalette_XDefend[];\nextern const u32 gItemIconPalette_XSpeed[];\nextern const u32 gItemIconPalette_XAccuracy[];\nextern const u32 gItemIconPalette_XSpecial[];\nextern const u32 gItemIcon_PokeDoll[];\nextern const u32 gItemIconPalette_PokeDoll[];\nextern const u32 gItemIcon_FluffyTail[];\nextern const u32 gItemIconPalette_FluffyTail[];\nextern const u32 gItemIcon_Repel[];\nextern const u32 gItemIconPalette_SuperRepel[];\nextern const u32 gItemIconPalette_MaxRepel[];\nextern const u32 gItemIcon_EscapeRope[];\nextern const u32 gItemIconPalette_EscapeRope[];\nextern const u32 gItemIcon_Repel[];\nextern const u32 gItemIconPalette_Repel[];\nextern const u32 gItemIcon_SunStone[];\nextern const u32 gItemIconPalette_SunStone[];\nextern const u32 gItemIcon_MoonStone[];\nextern const u32 gItemIconPalette_MoonStone[];\nextern const u32 gItemIcon_FireStone[];\nextern const u32 gItemIconPalette_FireStone[];\nextern const u32 gItemIcon_ThunderStone[];\nextern const u32 gItemIconPalette_ThunderStone[];\nextern const u32 gItemIcon_WaterStone[];\nextern const u32 gItemIconPalette_WaterStone[];\nextern const u32 gItemIcon_LeafStone[];\nextern const u32 gItemIconPalette_LeafStone[];\nextern const u32 gItemIcon_TinyMushroom[];\nextern const u32 gItemIconPalette_Mushroom[];\nextern const u32 gItemIcon_BigMushroom[];\nextern const u32 gItemIcon_Pearl[];\nextern const u32 gItemIconPalette_Pearl[];\nextern const u32 gItemIcon_BigPearl[];\nextern const u32 gItemIcon_Stardust[];\nextern const u32 gItemIconPalette_Star[];\nextern const u32 gItemIcon_StarPiece[];\nextern const u32 gItemIcon_Nugget[];\nextern const u32 gItemIconPalette_Nugget[];\nextern const u32 gItemIcon_HeartScale[];\nextern const u32 gItemIconPalette_HeartScale[];\nextern const u32 gItemIcon_OrangeMail[];\nextern const u32 gItemIconPalette_OrangeMail[];\nextern const u32 gItemIcon_HarborMail[];\nextern const u32 gItemIconPalette_HarborMail[];\nextern const u32 gItemIcon_GlitterMail[];\nextern const u32 gItemIconPalette_GlitterMail[];\nextern const u32 gItemIcon_MechMail[];\nextern const u32 gItemIconPalette_MechMail[];\nextern const u32 gItemIcon_WoodMail[];\nextern const u32 gItemIconPalette_WoodMail[];\nextern const u32 gItemIcon_WaveMail[];\nextern const u32 gItemIconPalette_WaveMail[];\nextern const u32 gItemIcon_BeadMail[];\nextern const u32 gItemIconPalette_BeadMail[];\nextern const u32 gItemIcon_ShadowMail[];\nextern const u32 gItemIconPalette_ShadowMail[];\nextern const u32 gItemIcon_TropicMail[];\nextern const u32 gItemIconPalette_TropicMail[];\nextern const u32 gItemIcon_DreamMail[];\nextern const u32 gItemIconPalette_DreamMail[];\nextern const u32 gItemIcon_FabMail[];\nextern const u32 gItemIconPalette_FabMail[];\nextern const u32 gItemIcon_RetroMail[];\nextern const u32 gItemIconPalette_RetroMail[];\nextern const u32 gItemIcon_CheriBerry[];\nextern const u32 gItemIconPalette_CheriBerry[];\nextern const u32 gItemIcon_ChestoBerry[];\nextern const u32 gItemIconPalette_ChestoBerry[];\nextern const u32 gItemIcon_PechaBerry[];\nextern const u32 gItemIconPalette_PechaBerry[];\nextern const u32 gItemIcon_RawstBerry[];\nextern const u32 gItemIconPalette_RawstBerry[];\nextern const u32 gItemIcon_AspearBerry[];\nextern const u32 gItemIconPalette_AspearBerry[];\nextern const u32 gItemIcon_LeppaBerry[];\nextern const u32 gItemIconPalette_LeppaBerry[];\nextern const u32 gItemIcon_OranBerry[];\nextern const u32 gItemIconPalette_OranBerry[];\nextern const u32 gItemIcon_PersimBerry[];\nextern const u32 gItemIconPalette_PersimBerry[];\nextern const u32 gItemIcon_LumBerry[];\nextern const u32 gItemIconPalette_LumBerry[];\nextern const u32 gItemIcon_SitrusBerry[];\nextern const u32 gItemIconPalette_SitrusBerry[];\nextern const u32 gItemIcon_FigyBerry[];\nextern const u32 gItemIconPalette_FigyBerry[];\nextern const u32 gItemIcon_WikiBerry[];\nextern const u32 gItemIconPalette_WikiBerry[];\nextern const u32 gItemIcon_MagoBerry[];\nextern const u32 gItemIconPalette_MagoBerry[];\nextern const u32 gItemIcon_AguavBerry[];\nextern const u32 gItemIconPalette_AguavBerry[];\nextern const u32 gItemIcon_IapapaBerry[];\nextern const u32 gItemIconPalette_IapapaBerry[];\nextern const u32 gItemIcon_RazzBerry[];\nextern const u32 gItemIconPalette_RazzBerry[];\nextern const u32 gItemIcon_BlukBerry[];\nextern const u32 gItemIconPalette_BlukBerry[];\nextern const u32 gItemIcon_NanabBerry[];\nextern const u32 gItemIconPalette_NanabBerry[];\nextern const u32 gItemIcon_WepearBerry[];\nextern const u32 gItemIconPalette_WepearBerry[];\nextern const u32 gItemIcon_PinapBerry[];\nextern const u32 gItemIconPalette_PinapBerry[];\nextern const u32 gItemIcon_PomegBerry[];\nextern const u32 gItemIconPalette_PomegBerry[];\nextern const u32 gItemIcon_KelpsyBerry[];\nextern const u32 gItemIconPalette_KelpsyBerry[];\nextern const u32 gItemIcon_QualotBerry[];\nextern const u32 gItemIconPalette_QualotBerry[];\nextern const u32 gItemIcon_HondewBerry[];\nextern const u32 gItemIconPalette_HondewBerry[];\nextern const u32 gItemIcon_GrepaBerry[];\nextern const u32 gItemIconPalette_GrepaBerry[];\nextern const u32 gItemIcon_TamatoBerry[];\nextern const u32 gItemIconPalette_TamatoBerry[];\nextern const u32 gItemIcon_CornnBerry[];\nextern const u32 gItemIconPalette_CornnBerry[];\nextern const u32 gItemIcon_MagostBerry[];\nextern const u32 gItemIconPalette_MagostBerry[];\nextern const u32 gItemIcon_RabutaBerry[];\nextern const u32 gItemIconPalette_RabutaBerry[];\nextern const u32 gItemIcon_NomelBerry[];\nextern const u32 gItemIconPalette_NomelBerry[];\nextern const u32 gItemIcon_SpelonBerry[];\nextern const u32 gItemIconPalette_SpelonBerry[];\nextern const u32 gItemIcon_PamtreBerry[];\nextern const u32 gItemIconPalette_PamtreBerry[];\nextern const u32 gItemIcon_WatmelBerry[];\nextern const u32 gItemIconPalette_WatmelBerry[];\nextern const u32 gItemIcon_DurinBerry[];\nextern const u32 gItemIconPalette_DurinBerry[];\nextern const u32 gItemIcon_BelueBerry[];\nextern const u32 gItemIconPalette_BelueBerry[];\nextern const u32 gItemIcon_LiechiBerry[];\nextern const u32 gItemIconPalette_LiechiBerry[];\nextern const u32 gItemIcon_GanlonBerry[];\nextern const u32 gItemIconPalette_GanlonBerry[];\nextern const u32 gItemIcon_SalacBerry[];\nextern const u32 gItemIconPalette_SalacBerry[];\nextern const u32 gItemIcon_PetayaBerry[];\nextern const u32 gItemIconPalette_PetayaBerry[];\nextern const u32 gItemIcon_ApicotBerry[];\nextern const u32 gItemIconPalette_ApicotBerry[];\nextern const u32 gItemIcon_LansatBerry[];\nextern const u32 gItemIconPalette_LansatBerry[];\nextern const u32 gItemIcon_StarfBerry[];\nextern const u32 gItemIconPalette_StarfBerry[];\nextern const u32 gItemIcon_EnigmaBerry[];\nextern const u32 gItemIconPalette_EnigmaBerry[];\nextern const u32 gItemIcon_BrightPowder[];\nextern const u32 gItemIconPalette_BrightPowder[];\nextern const u32 gItemIcon_InBattleHerb[];\nextern const u32 gItemIconPalette_WhiteHerb[];\nextern const u32 gItemIcon_MachoBrace[];\nextern const u32 gItemIconPalette_MachoBrace[];\nextern const u32 gItemIcon_ExpShare[];\nextern const u32 gItemIconPalette_ExpShare[];\nextern const u32 gItemIcon_QuickClaw[];\nextern const u32 gItemIconPalette_QuickClaw[];\nextern const u32 gItemIcon_SootheBell[];\nextern const u32 gItemIconPalette_SootheBell[];\nextern const u32 gItemIcon_InBattleHerb[];\nextern const u32 gItemIconPalette_MentalHerb[];\nextern const u32 gItemIcon_ChoiceBand[];\nextern const u32 gItemIconPalette_ChoiceBand[];\nextern const u32 gItemIcon_KingsRock[];\nextern const u32 gItemIconPalette_KingsRock[];\nextern const u32 gItemIcon_SilverPowder[];\nextern const u32 gItemIconPalette_SilverPowder[];\nextern const u32 gItemIcon_AmuletCoin[];\nextern const u32 gItemIconPalette_AmuletCoin[];\nextern const u32 gItemIcon_CleanseTag[];\nextern const u32 gItemIconPalette_CleanseTag[];\nextern const u32 gItemIcon_SoulDew[];\nextern const u32 gItemIconPalette_SoulDew[];\nextern const u32 gItemIcon_DeepSeaTooth[];\nextern const u32 gItemIconPalette_DeepSeaTooth[];\nextern const u32 gItemIcon_DeepSeaScale[];\nextern const u32 gItemIconPalette_DeepSeaScale[];\nextern const u32 gItemIcon_SmokeBall[];\nextern const u32 gItemIconPalette_SmokeBall[];\nextern const u32 gItemIcon_Everstone[];\nextern const u32 gItemIconPalette_Everstone[];\nextern const u32 gItemIcon_FocusBand[];\nextern const u32 gItemIconPalette_FocusBand[];\nextern const u32 gItemIcon_LuckyEgg[];\nextern const u32 gItemIconPalette_LuckyEgg[];\nextern const u32 gItemIcon_ScopeLens[];\nextern const u32 gItemIconPalette_ScopeLens[];\nextern const u32 gItemIcon_MetalCoat[];\nextern const u32 gItemIconPalette_MetalCoat[];\nextern const u32 gItemIcon_Leftovers[];\nextern const u32 gItemIconPalette_Leftovers[];\nextern const u32 gItemIcon_DragonScale[];\nextern const u32 gItemIconPalette_DragonScale[];\nextern const u32 gItemIcon_LightBall[];\nextern const u32 gItemIconPalette_LightBall[];\nextern const u32 gItemIcon_SoftSand[];\nextern const u32 gItemIconPalette_SoftSand[];\nextern const u32 gItemIcon_HardStone[];\nextern const u32 gItemIconPalette_HardStone[];\nextern const u32 gItemIcon_MiracleSeed[];\nextern const u32 gItemIconPalette_MiracleSeed[];\nextern const u32 gItemIcon_BlackGlasses[];\nextern const u32 gItemIconPalette_BlackTypeEnhancingItem[];\nextern const u32 gItemIcon_BlackBelt[];\nextern const u32 gItemIconPalette_BlackTypeEnhancingItem[];\nextern const u32 gItemIcon_Magnet[];\nextern const u32 gItemIconPalette_Magnet[];\nextern const u32 gItemIcon_MysticWater[];\nextern const u32 gItemIconPalette_MysticWater[];\nextern const u32 gItemIcon_SharpBeak[];\nextern const u32 gItemIconPalette_SharpBeak[];\nextern const u32 gItemIcon_PoisonBarb[];\nextern const u32 gItemIconPalette_PoisonBarb[];\nextern const u32 gItemIcon_NeverMeltIce[];\nextern const u32 gItemIconPalette_NeverMeltIce[];\nextern const u32 gItemIcon_SpellTag[];\nextern const u32 gItemIconPalette_SpellTag[];\nextern const u32 gItemIcon_TwistedSpoon[];\nextern const u32 gItemIconPalette_TwistedSpoon[];\nextern const u32 gItemIcon_Charcoal[];\nextern const u32 gItemIconPalette_Charcoal[];\nextern const u32 gItemIcon_DragonFang[];\nextern const u32 gItemIconPalette_DragonFang[];\nextern const u32 gItemIcon_SilkScarf[];\nextern const u32 gItemIconPalette_SilkScarf[];\nextern const u32 gItemIcon_UpGrade[];\nextern const u32 gItemIconPalette_UpGrade[];\nextern const u32 gItemIcon_ShellBell[];\nextern const u32 gItemIconPalette_Shell[];\nextern const u32 gItemIcon_SeaIncense[];\nextern const u32 gItemIconPalette_SeaIncense[];\nextern const u32 gItemIcon_LaxIncense[];\nextern const u32 gItemIconPalette_LaxIncense[];\nextern const u32 gItemIcon_LuckyPunch[];\nextern const u32 gItemIconPalette_LuckyPunch[];\nextern const u32 gItemIcon_MetalPowder[];\nextern const u32 gItemIconPalette_MetalPowder[];\nextern const u32 gItemIcon_ThickClub[];\nextern const u32 gItemIconPalette_ThickClub[];\nextern const u32 gItemIcon_Stick[];\nextern const u32 gItemIconPalette_Stick[];\nextern const u32 gItemIcon_Scarf[];\nextern const u32 gItemIconPalette_RedScarf[];\nextern const u32 gItemIconPalette_BlueScarf[];\nextern const u32 gItemIconPalette_PinkScarf[];\nextern const u32 gItemIconPalette_GreenScarf[];\nextern const u32 gItemIconPalette_YellowScarf[];\nextern const u32 gItemIcon_MachBike[];\nextern const u32 gItemIconPalette_MachBike[];\nextern const u32 gItemIcon_CoinCase[];\nextern const u32 gItemIconPalette_CoinCase[];\nextern const u32 gItemIcon_Itemfinder[];\nextern const u32 gItemIconPalette_Itemfinder[];\nextern const u32 gItemIcon_OldRod[];\nextern const u32 gItemIconPalette_OldRod[];\nextern const u32 gItemIcon_GoodRod[];\nextern const u32 gItemIconPalette_GoodRod[];\nextern const u32 gItemIcon_SuperRod[];\nextern const u32 gItemIconPalette_SuperRod[];\nextern const u32 gItemIcon_SSTicket[];\nextern const u32 gItemIconPalette_SSTicket[];\nextern const u32 gItemIcon_ContestPass[];\nextern const u32 gItemIconPalette_ContestPass[];\nextern const u32 gItemIcon_WailmerPail[];\nextern const u32 gItemIconPalette_WailmerPail[];\nextern const u32 gItemIcon_DevonGoods[];\nextern const u32 gItemIconPalette_DevonGoods[];\nextern const u32 gItemIcon_SootSack[];\nextern const u32 gItemIconPalette_SootSack[];\nextern const u32 gItemIcon_BasementKey[];\nextern const u32 gItemIconPalette_OldKey[];\nextern const u32 gItemIcon_AcroBike[];\nextern const u32 gItemIconPalette_AcroBike[];\nextern const u32 gItemIcon_PokeblockCase[];\nextern const u32 gItemIconPalette_PokeblockCase[];\nextern const u32 gItemIcon_Letter[];\nextern const u32 gItemIcon_EonTicket[];\nextern const u32 gItemIconPalette_EonTicket[];\nextern const u32 gItemIcon_Orb[];\nextern const u32 gItemIconPalette_RedOrb[];\nextern const u32 gItemIconPalette_BlueOrb[];\nextern const u32 gItemIcon_Scanner[];\nextern const u32 gItemIconPalette_Scanner[];\nextern const u32 gItemIcon_GoGoggles[];\nextern const u32 gItemIconPalette_GoGoggles[];\nextern const u32 gItemIcon_Meteorite[];\nextern const u32 gItemIconPalette_Meteorite[];\nextern const u32 gItemIcon_Room1Key[];\nextern const u32 gItemIconPalette_Key[];\nextern const u32 gItemIcon_Room2Key[];\nextern const u32 gItemIcon_Room4Key[];\nextern const u32 gItemIcon_Room6Key[];\nextern const u32 gItemIcon_StorageKey[];\nextern const u32 gItemIcon_RootFossil[];\nextern const u32 gItemIconPalette_HoennFossil[];\nextern const u32 gItemIcon_ClawFossil[];\nextern const u32 gItemIcon_DevonScope[];\nextern const u32 gItemIconPalette_DevonScope[];\nextern const u32 gItemIcon_TMHM[];\nextern const u32 gItemIconPalette_FightingTMHM[];\nextern const u32 gItemIconPalette_DragonTMHM[];\nextern const u32 gItemIconPalette_WaterTMHM[];\nextern const u32 gItemIconPalette_PsychicTMHM[];\nextern const u32 gItemIconPalette_NormalTMHM[];\nextern const u32 gItemIconPalette_PoisonTMHM[];\nextern const u32 gItemIconPalette_IceTMHM[];\nextern const u32 gItemIconPalette_GrassTMHM[];\nextern const u32 gItemIconPalette_FireTMHM[];\nextern const u32 gItemIconPalette_DarkTMHM[];\nextern const u32 gItemIconPalette_SteelTMHM[];\nextern const u32 gItemIconPalette_ElectricTMHM[];\nextern const u32 gItemIconPalette_GroundTMHM[];\nextern const u32 gItemIconPalette_GhostTMHM[];\nextern const u32 gItemIconPalette_RockTMHM[];\nextern const u32 gItemIconPalette_FlyingTMHM[];\n// FireRed/LeafGreen key items\nextern const u32 gItemIcon_OaksParcel[];\nextern const u32 gItemIconPalette_OaksParcel[];\nextern const u32 gItemIcon_PokeFlute[];\nextern const u32 gItemIconPalette_PokeFlute[];\nextern const u32 gItemIcon_SecretKey[];\nextern const u32 gItemIconPalette_SecretKey[];\nextern const u32 gItemIcon_BikeVoucher[];\nextern const u32 gItemIconPalette_BikeVoucher[];\nextern const u32 gItemIcon_GoldTeeth[];\nextern const u32 gItemIconPalette_GoldTeeth[];\nextern const u32 gItemIcon_OldAmber[];\nextern const u32 gItemIconPalette_OldAmber[];\nextern const u32 gItemIcon_CardKey[];\nextern const u32 gItemIconPalette_CardKey[];\nextern const u32 gItemIcon_LiftKey[];\nextern const u32 gItemIconPalette_Key[];\nextern const u32 gItemIcon_HelixFossil[];\nextern const u32 gItemIconPalette_KantoFossil[];\nextern const u32 gItemIcon_DomeFossil[];\nextern const u32 gItemIcon_SilphScope[];\nextern const u32 gItemIconPalette_SilphScope[];\nextern const u32 gItemIcon_Bicycle[];\nextern const u32 gItemIconPalette_Bicycle[];\nextern const u32 gItemIcon_TownMap[];\nextern const u32 gItemIconPalette_TownMap[];\nextern const u32 gItemIcon_VSSeeker[];\nextern const u32 gItemIconPalette_VSSeeker[];\nextern const u32 gItemIcon_FameChecker[];\nextern const u32 gItemIconPalette_FameChecker[];\nextern const u32 gItemIcon_TMCase[];\nextern const u32 gItemIconPalette_TMCase[];\nextern const u32 gItemIcon_BerryPouch[];\nextern const u32 gItemIconPalette_BerryPouch[];\nextern const u32 gItemIcon_TeachyTV[];\nextern const u32 gItemIconPalette_TeachyTV[];\nextern const u32 gItemIcon_TriPass[];\nextern const u32 gItemIconPalette_TriPass[];\nextern const u32 gItemIcon_RainbowPass[];\nextern const u32 gItemIconPalette_RainbowPass[];\nextern const u32 gItemIcon_Tea[];\nextern const u32 gItemIconPalette_Tea[];\nextern const u32 gItemIcon_MysticTicket[];\nextern const u32 gItemIconPalette_MysticTicket[];\nextern const u32 gItemIcon_AuroraTicket[];\nextern const u32 gItemIconPalette_AuroraTicket[];\nextern const u32 gItemIcon_PowderJar[];\nextern const u32 gItemIconPalette_PowderJar[];\nextern const u32 gItemIcon_Gem[];\nextern const u32 gItemIconPalette_Ruby[];\nextern const u32 gItemIconPalette_Sapphire[];\nextern const u32 gItemIcon_MagmaEmblem[];\nextern const u32 gItemIconPalette_MagmaEmblem[];\nextern const u32 gItemIcon_OldSeaMap[];\nextern const u32 gItemIconPalette_OldSeaMap[];\nextern const u32 gItemIcon_LinkBracelet[];\nextern const u32 gItemIconPalette_LinkBracelet[];\nextern const u32 gItemIcon_ReturnToFieldArrow[];\nextern const u32 gItemIconPalette_ReturnToFieldArrow[];\n\n// battle_anim_utility_funcs\nextern const u32 gFile_graphics_battle_anims_masks_curse_sheet[];\nextern const u32 gFile_graphics_battle_anims_masks_curse_tilemap[];\nextern const u32 gBattleStatMask_Gfx[];\nextern const u32 gBattleStatMask1_Pal[];\nextern const u32 gBattleStatMask2_Pal[];\nextern const u32 gBattleStatMask3_Pal[];\nextern const u32 gBattleStatMask4_Pal[];\nextern const u32 gBattleStatMask5_Pal[];\nextern const u32 gBattleStatMask6_Pal[];\nextern const u32 gBattleStatMask7_Pal[];\nextern const u32 gBattleStatMask8_Pal[];\nextern const u32 gBattleStatMask1_Tilemap[];\nextern const u32 gBattleStatMask2_Tilemap[];\n\nextern const u32 gSmokescreenImpactTiles[];\nextern const u32 gSmokescreenImpactPalette[];\nextern const u32 gEnemyMonShadow_Gfx[];\n\n// battle anim particle gfx\nextern const u32 gBattleAnimSpriteGfx_Bone[];\nextern const u32 gBattleAnimSpriteGfx_Spark[];\nextern const u32 gBattleAnimSpriteGfx_Pencil[];\nextern const u32 gBattleAnimSpriteGfx_AirWave[];\nextern const u32 gBattleAnimSpriteGfx_Orb[];\nextern const u32 gBattleAnimSpriteGfx_Sword[];\nextern const u32 gBattleAnimSpriteGfx_Seed[];\nextern const u32 gBattleAnimSpriteGfx_Explosion6[];\nextern const u32 gBattleAnimSpriteGfx_PinkOrb[];\nextern const u32 gBattleAnimSpriteGfx_Gust[];\nextern const u32 gBattleAnimSpriteGfx_IceCube[];\nextern const u32 gBattleAnimSpriteGfx_Spark2[];\nextern const u32 gBattleAnimSpriteGfx_Orange[];\nextern const u32 gBattleAnimSpriteGfx_YellowBall[];\nextern const u32 gBattleAnimSpriteGfx_LockOn[];\nextern const u32 gBattleAnimSpriteGfx_TiedBag[];\nextern const u32 gBattleAnimSpriteGfx_BlackSmoke[];\nextern const u32 gBattleAnimSpriteGfx_BlackBall[];\nextern const u32 gBattleAnimSpriteGfx_Conversion[];\nextern const u32 gBattleAnimSpriteGfx_Glass[];\nextern const u32 gBattleAnimSpriteGfx_HornHit[];\nextern const u32 gBattleAnimSpriteGfx_Hit[];\nextern const u32 gBattleAnimSpriteGfx_BlueShards[];\nextern const u32 gBattleAnimSpriteGfx_ClosingEye[];\nextern const u32 gBattleAnimSpriteGfx_WavingHand[];\nextern const u32 gBattleAnimSpriteGfx_HitDuplicate[];\nextern const u32 gBattleAnimSpriteGfx_Leer[];\nextern const u32 gBattleAnimSpriteGfx_BlueBurst[];\nextern const u32 gBattleAnimSpriteGfx_SmallEmber[];\nextern const u32 gBattleAnimSpriteGfx_GraySmoke[];\nextern const u32 gBattleAnimSpriteGfx_BlueStar[];\nextern const u32 gBattleAnimSpriteGfx_BubbleBurst[];\nextern const u32 gBattleAnimSpriteGfx_Fire[];\nextern const u32 gBattleAnimSpriteGfx_SpinningFire[];\nextern const u32 gBattleAnimSpriteGfx_FirePlume[];\nextern const u32 gBattleAnimSpriteGfx_Lightning2[];\nextern const u32 gBattleAnimSpriteGfx_Lightning[];\nextern const u32 gBattleAnimSpriteGfx_ClawSlash2[];\nextern const u32 gBattleAnimSpriteGfx_ClawSlash[];\nextern const u32 gBattleAnimSpriteGfx_Scratch3[];\nextern const u32 gBattleAnimSpriteGfx_Scratch2[];\nextern const u32 gBattleAnimSpriteGfx_BubbleBurst2[];\nextern const u32 gBattleAnimSpriteGfx_IceChunk[];\nextern const u32 gBattleAnimSpriteGfx_Glass2[];\nextern const u32 gBattleAnimSpriteGfx_PinkHeart2[];\nextern const u32 gBattleAnimSpriteGfx_SapDrip[];\nextern const u32 gBattleAnimSpriteGfx_SapDrip[];\nextern const u32 gBattleAnimSpriteGfx_Sparkle1[];\nextern const u32 gBattleAnimSpriteGfx_Sparkle1[];\nextern const u32 gBattleAnimSpriteGfx_HumanoidFoot[];\nextern const u32 gBattleAnimSpriteGfx_MonsterFoot[];\nextern const u32 gBattleAnimSpriteGfx_HumanoidHand[];\nextern const u32 gBattleAnimSpriteGfx_NoiseLine[];\nextern const u32 gBattleAnimSpriteGfx_YellowUnk[];\nextern const u32 gBattleAnimSpriteGfx_RedFist[];\nextern const u32 gBattleAnimSpriteGfx_SlamHit[];\nextern const u32 gBattleAnimSpriteGfx_Ring[];\nextern const u32 gBattleAnimSpriteGfx_Rocks[];\nextern const u32 gBattleAnimSpriteGfx_Z[];\nextern const u32 gBattleAnimSpriteGfx_YellowUnk2[];\nextern const u32 gBattleAnimSpriteGfx_AirSlash[];\nextern const u32 gBattleAnimSpriteGfx_SpinningGreenOrbs[];\nextern const u32 gBattleAnimSpriteGfx_Leaf[];\nextern const u32 gBattleAnimSpriteGfx_Finger[];\nextern const u32 gBattleAnimSpriteGfx_PoisonPowder[];\nextern const u32 gBattleAnimSpriteGfx_BrownTriangle[];\nextern const u32 gBattleAnimSpriteGfx_Sparkle3[];\nextern const u32 gBattleAnimSpriteGfx_Sparkle4[];\nextern const u32 gBattleAnimSpriteGfx_MusicNotes[];\nextern const u32 gBattleAnimSpriteGfx_Duck[];\nextern const u32 gBattleAnimSpriteGfx_MudSand[];\nextern const u32 gBattleAnimSpriteGfx_Alert[];\nextern const u32 gBattleAnimSpriteGfx_BlueFlames[];\nextern const u32 gBattleAnimSpriteGfx_BlueFlames2[];\nextern const u32 gBattleAnimSpriteGfx_Shock4[];\nextern const u32 gBattleAnimSpriteGfx_Shock[];\nextern const u32 gBattleAnimSpriteGfx_Bell2[];\nextern const u32 gBattleAnimSpriteGfx_PinkGlove[];\nextern const u32 gBattleAnimSpriteGfx_BlueLines[];\nextern const u32 gBattleAnimSpriteGfx_Impact3[];\nextern const u32 gBattleAnimSpriteGfx_Impact2[];\nextern const u32 gBattleAnimSpriteGfx_Reticle[];\nextern const u32 gBattleAnimSpriteGfx_Breath[];\nextern const u32 gBattleAnimSpriteGfx_Anger[];\nextern const u32 gBattleAnimSpriteGfx_Snowball[];\nextern const u32 gBattleAnimSpriteGfx_Vine[];\nextern const u32 gBattleAnimSpriteGfx_Sword2[];\nextern const u32 gBattleAnimSpriteGfx_Clapping[];\nextern const u32 gBattleAnimSpriteGfx_RedTube[];\nextern const u32 gBattleAnimSpriteGfx_Amnesia[];\nextern const u32 gBattleAnimSpriteGfx_String2[];\nextern const u32 gBattleAnimSpriteGfx_Pencil2[];\nextern const u32 gBattleAnimSpriteGfx_Petal[];\nextern const u32 gBattleAnimSpriteGfx_BentSpoon[];\nextern const u32 gBattleAnimSpriteGfx_Web[];\nextern const u32 gBattleAnimSpriteGfx_MilkBottle[];\nextern const u32 gBattleAnimSpriteGfx_Coin[];\nextern const u32 gBattleAnimSpriteGfx_CrackedEgg[];\nextern const u32 gBattleAnimSpriteGfx_HatchedEgg[];\nextern const u32 gBattleAnimSpriteGfx_FreshEgg[];\nextern const u32 gBattleAnimSpriteGfx_Fangs[];\nextern const u32 gBattleAnimSpriteGfx_Explosion2[];\nextern const u32 gBattleAnimSpriteGfx_Explosion3[];\nextern const u32 gBattleAnimSpriteGfx_WaterDroplet[];\nextern const u32 gBattleAnimSpriteGfx_WaterDroplet2[];\nextern const u32 gBattleAnimSpriteGfx_Seed2[];\nextern const u32 gBattleAnimSpriteGfx_Sprout[];\nextern const u32 gBattleAnimSpriteGfx_RedWand[];\nextern const u32 gBattleAnimSpriteGfx_PurpleGreenUnk[];\nextern const u32 gBattleAnimSpriteGfx_WaterColumn[];\nextern const u32 gBattleAnimSpriteGfx_MudUnk[];\nextern const u32 gBattleAnimSpriteGfx_RainDrops[];\nextern const u32 gBattleAnimSpriteGfx_FurySwipes[];\nextern const u32 gBattleAnimSpriteGfx_Vine2[];\nextern const u32 gBattleAnimSpriteGfx_Teeth[];\nextern const u32 gBattleAnimSpriteGfx_Bone2[];\nextern const u32 gBattleAnimSpriteGfx_WhiteBag[];\nextern const u32 gBattleAnimSpriteGfx_Unknown[];\nextern const u32 gBattleAnimSpriteGfx_PurpleCoral[];\nextern const u32 gBattleAnimSpriteGfx_PurpleDroplet[];\nextern const u32 gBattleAnimSpriteGfx_Shock2[];\nextern const u32 gBattleAnimSpriteGfx_ClosingEye2[];\nextern const u32 gBattleAnimSpriteGfx_MetalBall[];\nextern const u32 gBattleAnimSpriteGfx_MonsterDoll[];\nextern const u32 gBattleAnimSpriteGfx_Whirlwind[];\nextern const u32 gBattleAnimSpriteGfx_Whirlwind2[];\nextern const u32 gBattleAnimSpriteGfx_Explosion4[];\nextern const u32 gBattleAnimSpriteGfx_Explosion5[];\nextern const u32 gBattleAnimSpriteGfx_Tongue[];\nextern const u32 gBattleAnimSpriteGfx_Smoke[];\nextern const u32 gBattleAnimSpriteGfx_Smoke2[];\nextern const u32 gBattleAnimSpriteGfx_Impact[];\nextern const u32 gBattleAnimSpriteGfx_Particles[];\nextern const u32 gBattleAnimSpriteGfx_CircleImpact[];\nextern const u32 gBattleAnimSpriteGfx_Scratch[];\nextern const u32 gBattleAnimSpriteGfx_Cut[];\nextern const u32 gBattleAnimSpriteGfx_SharpTeeth[];\nextern const u32 gBattleAnimSpriteGfx_RainbowRings[];\nextern const u32 gBattleAnimSpriteGfx_IceCrystals[];\nextern const u32 gBattleAnimSpriteGfx_IceSpikes[];\nextern const u32 gBattleAnimSpriteGfx_HandsAndFeet[];\nextern const u32 gBattleAnimSpriteGfx_MistCloud[];\nextern const u32 gBattleAnimSpriteGfx_Clamp[];\nextern const u32 gBattleAnimSpriteGfx_Bubble[];\nextern const u32 gBattleAnimSpriteGfx_Orbs[];\nextern const u32 gBattleAnimSpriteGfx_WaterImpact[];\nextern const u32 gBattleAnimSpriteGfx_WaterOrb[];\nextern const u32 gBattleAnimSpriteGfx_PoisonBubble[];\nextern const u32 gBattleAnimSpriteGfx_ToxicBubble[];\nextern const u32 gBattleAnimSpriteGfx_Spikes[];\nextern const u32 gBattleAnimSpriteGfx_HornHit2[];\nextern const u32 gBattleAnimSpriteGfx_AirWave2[];\nextern const u32 gBattleAnimSpriteGfx_SmallBubbles[];\nextern const u32 gBattleAnimSpriteGfx_RoundShadow[];\nextern const u32 gBattleAnimSpriteGfx_Sunlight[];\nextern const u32 gBattleAnimSpriteGfx_Spore[];\nextern const u32 gBattleAnimSpriteGfx_Flower[];\nextern const u32 gBattleAnimSpriteGfx_RazorLeaf[];\nextern const u32 gBattleAnimSpriteGfx_Needle[];\nextern const u32 gBattleAnimSpriteGfx_WhirlwindLines[];\nextern const u32 gBattleAnimSpriteGfx_GoldRing[];\nextern const u32 gBattleAnimSpriteGfx_GreenLightWall[];\nextern const u32 gBattleAnimSpriteGfx_BlackBall2[];\nextern const u32 gBattleAnimSpriteGfx_SparkH[];\nextern const u32 gBattleAnimSpriteGfx_YellowStar[];\nextern const u32 gBattleAnimSpriteGfx_LargeFreshEgg[];\nextern const u32 gBattleAnimSpriteGfx_ShadowBall[];\nextern const u32 gBattleAnimSpriteGfx_Lick[];\nextern const u32 gBattleAnimSpriteGfx_VoidLines[];\nextern const u32 gBattleAnimSpriteGfx_String[];\nextern const u32 gBattleAnimSpriteGfx_WebThread[];\nextern const u32 gBattleAnimSpriteGfx_SpiderWeb[];\nextern const u32 gBattleAnimSpriteGfx_Lightbulb[];\nextern const u32 gBattleAnimSpriteGfx_Slash[];\nextern const u32 gBattleAnimSpriteGfx_FocusEnergy[];\nextern const u32 gBattleAnimSpriteGfx_SphereToCube[];\nextern const u32 gBattleAnimSpriteGfx_Tendrils[];\nextern const u32 gBattleAnimSpriteGfx_Eye[];\nextern const u32 gBattleAnimSpriteGfx_WhiteShadow[];\nextern const u32 gBattleAnimSpriteGfx_TealAlert[];\nextern const u32 gBattleAnimSpriteGfx_OpeningEye[];\nextern const u32 gBattleAnimSpriteGfx_RoundWhiteHalo[];\nextern const u32 gBattleAnimSpriteGfx_FangAttack[];\nextern const u32 gBattleAnimSpriteGfx_PurpleHandOutline[];\nextern const u32 gBattleAnimSpriteGfx_Moon[];\nextern const u32 gBattleAnimSpriteGfx_GreenSparkle[];\nextern const u32 gBattleAnimSpriteGfx_Spiral[];\nextern const u32 gBattleAnimSpriteGfx_SnoreZ[];\nextern const u32 gBattleAnimSpriteGfx_Explosion[];\nextern const u32 gBattleAnimSpriteGfx_Nail[];\nextern const u32 gBattleAnimSpriteGfx_GhostlySpirit[];\nextern const u32 gBattleAnimSpriteGfx_WarmRock[];\nextern const u32 gBattleAnimSpriteGfx_BreakingEgg[];\nextern const u32 gBattleAnimSpriteGfx_ThinRing[];\nextern const u32 gBattleAnimSpriteGfx_PunchImpact[];\nextern const u32 gBattleAnimSpriteGfx_Bell[];\nextern const u32 gBattleAnimSpriteGfx_MusicNotes2[];\nextern const u32 gBattleAnimSpriteGfx_SpeedDust[];\nextern const u32 gBattleAnimSpriteGfx_TornMetal[];\nextern const u32 gBattleAnimSpriteGfx_ThoughtBubble[];\nextern const u32 gBattleAnimSpriteGfx_MagentaHeart[];\nextern const u32 gBattleAnimSpriteGfx_ElectricOrbs[];\nextern const u32 gBattleAnimSpriteGfx_CircleOfLight[];\nextern const u32 gBattleAnimSpriteGfx_Electricity[];\nextern const u32 gBattleAnimSpriteGfx_Finger2[];\nextern const u32 gBattleAnimSpriteGfx_MovementWaves[];\nextern const u32 gBattleAnimSpriteGfx_MagentaHeart[];\nextern const u32 gBattleAnimSpriteGfx_RedOrb[];\nextern const u32 gBattleAnimSpriteGfx_EyeSparkle[];\nextern const u32 gBattleAnimSpriteGfx_MagentaHeart[];\nextern const u32 gBattleAnimSpriteGfx_Angel[];\nextern const u32 gBattleAnimSpriteGfx_Devil[];\nextern const u32 gBattleAnimSpriteGfx_Swipe[];\nextern const u32 gBattleAnimSpriteGfx_Roots[];\nextern const u32 gBattleAnimSpriteGfx_ItemBag[];\nextern const u32 gBattleAnimSpriteGfx_JaggedMusicNote[];\nextern const u32 gBattleAnimSpriteGfx_Pokeball[];\nextern const u32 gBattleAnimSpriteGfx_Spotlight[];\nextern const u32 gBattleAnimSpriteGfx_LetterZ[];\nextern const u32 gBattleAnimSpriteGfx_RapidSpin[];\nextern const u32 gBattleAnimSpriteGfx_TriAttackTriangle[];\nextern const u32 gBattleAnimSpriteGfx_WispOrb[];\nextern const u32 gBattleAnimSpriteGfx_WispFire[];\nextern const u32 gBattleAnimSpriteGfx_GoldStars[];\nextern const u32 gBattleAnimSpriteGfx_EclipsingOrb[];\nextern const u32 gBattleAnimSpriteGfx_GrayOrb[];\nextern const u32 gBattleAnimSpriteGfx_GrayOrb[];\nextern const u32 gBattleAnimSpriteGfx_GrayOrb[];\nextern const u32 gBattleAnimSpriteGfx_PinkPetal[];\nextern const u32 gBattleAnimSpriteGfx_PainSplit[];\nextern const u32 gBattleAnimSpriteGfx_Confetti[];\nextern const u32 gBattleAnimSpriteGfx_GreenStar[];\nextern const u32 gBattleAnimSpriteGfx_PinkCloud[];\nextern const u32 gBattleAnimSpriteGfx_SweatDrop[];\nextern const u32 gBattleAnimSpriteGfx_GuardRing[];\nextern const u32 gBattleAnimSpriteGfx_PurpleScratch[];\nextern const u32 gBattleAnimSpriteGfx_PurpleSwipe[];\nextern const u32 gBattleAnimSpriteGfx_TagHand[];\nextern const u32 gBattleAnimSpriteGfx_SmallRedEye[];\nextern const u32 gBattleAnimSpriteGfx_HollowOrb[];\nextern const u32 gBattleAnimSpriteGfx_XSign[];\nextern const u32 gBattleAnimSpriteGfx_BluegreenOrb[];\nextern const u32 gBattleAnimSpriteGfx_PawPrint[];\nextern const u32 gBattleAnimSpriteGfx_PurpleFlame[];\nextern const u32 gBattleAnimSpriteGfx_RedBall[];\nextern const u32 gBattleAnimSpriteGfx_SmellingsaltEffect[];\nextern const u32 gBattleAnimSpriteGfx_Meteor[];\nextern const u32 gBattleAnimSpriteGfx_FlatRock[];\nextern const u32 gBattleAnimSpriteGfx_MagnifyingGlass[];\nextern const u32 gBattleAnimSpriteGfx_MetalSoundWaves[];\nextern const u32 gBattleAnimSpriteGfx_FlyingDirt[];\nextern const u32 gBattleAnimSpriteGfx_IcicleSpear[];\nextern const u32 gBattleAnimSpriteGfx_Hail[];\nextern const u32 gBattleAnimSpriteGfx_GlowyRedOrb[];\nextern const u32 gBattleAnimSpriteGfx_GreenSpike[];\nextern const u32 gBattleAnimSpriteGfx_SafariBait[];\nextern const u32 gBattleAnimSpriteGfx_WhiteFeather[];\nextern const u32 gBattleAnimSpriteGfx_Sparkle6[];\nextern const u32 gBattleAnimSpriteGfx_Splash[];\nextern const u32 gBattleAnimSpriteGfx_SweatBead[];\nextern const u32 gBattleAnimSpriteGfx_Gem1[];\nextern const u32 gBattleAnimSpriteGfx_Gem2[];\nextern const u32 gBattleAnimSpriteGfx_Gem3[];\nextern const u32 gBattleAnimSpriteGfx_SlamHit2[];\nextern const u32 gBattleAnimSpriteGfx_Recycle[];\nextern const u32 gBattleAnimSpriteGfx_RedParticles[];\nextern const u32 gBattleAnimSpriteGfx_Protect[];\nextern const u32 gBattleAnimSpriteGfx_DirtMound[];\nextern const u32 gBattleAnimSpriteGfx_Shock3[];\nextern const u32 gBattleAnimSpriteGfx_WeatherBall[];\nextern const u32 gBattleAnim_ScaryFaceGfx[];\nextern const u32 gBattleAnim_ScaryFacePal[];\nextern const u32 gBattleAnimBgTilemap_ScaryFacePlayer[];\nextern const u32 gBattleAnimBgTilemap_ScaryFaceOpponent[];\nextern const u32 gBattleAnimBgTilemap_ScaryFaceContest[];\nextern const u32 gBattleAnimSpriteGfx_Bird[];\nextern const u32 gBattleAnimSpriteGfx_CrossImpact[];\n\n// battle anim particle pals\nextern const u32 gBattleAnimSpritePal_Bone[];\nextern const u32 gBattleAnimSpritePal_Spark[];\nextern const u32 gBattleAnimSpritePal_Pencil[];\nextern const u32 gBattleAnimSpritePal_AirWave[];\nextern const u32 gBattleAnimSpritePal_Orb[];\nextern const u32 gBattleAnimSpritePal_Sword[];\nextern const u32 gBattleAnimSpritePal_Seed[];\nextern const u32 gBattleAnimSpritePal_Explosion6[];\nextern const u32 gBattleAnimSpritePal_PinkOrb[];\nextern const u32 gBattleAnimSpritePal_Gust[];\nextern const u32 gBattleAnimSpritePal_IceCube[];\nextern const u32 gBattleAnimSpritePal_Spark2[];\nextern const u32 gBattleAnimSpritePal_Orange[];\nextern const u32 gBattleAnimSpritePal_YellowBall[];\nextern const u32 gBattleAnimSpritePal_LockOn[];\nextern const u32 gBattleAnimSpritePal_TiedBag[];\nextern const u32 gBattleAnimSpritePal_BlackSmoke[];\nextern const u32 gBattleAnimSpritePal_Conversion[];\nextern const u32 gBattleAnimSpritePal_Glass[];\nextern const u32 gBattleAnimSpritePal_HornHit[];\nextern const u32 gBattleAnimSpritePal_Hit[];\nextern const u32 gBattleAnimSpritePal_Hit2[];\nextern const u32 gBattleAnimSpritePal_BlueShards[];\nextern const u32 gBattleAnimSpritePal_ClosingEye[];\nextern const u32 gBattleAnimSpritePal_WavingHand[];\nextern const u32 gBattleAnimSpritePal_HitDuplicate[];\nextern const u32 gBattleAnimSpritePal_Leer[];\nextern const u32 gBattleAnimSpritePal_BlueBurst[];\nextern const u32 gBattleAnimSpritePal_SmallEmber[];\nextern const u32 gBattleAnimSpritePal_GraySmoke[];\nextern const u32 gBattleAnimSpritePal_BlueStar[];\nextern const u32 gBattleAnimSpritePal_BubbleBurst[];\nextern const u32 gBattleAnimSpritePal_Fire[];\nextern const u32 gBattleAnimSpritePal_Lightning2[];\nextern const u32 gBattleAnimSpritePal_ClawSlash2[];\nextern const u32 gBattleAnimSpritePal_ClawSlash[];\nextern const u32 gBattleAnimSpritePal_BubbleBurst2[];\nextern const u32 gBattleAnimSpritePal_IceChunk[];\nextern const u32 gBattleAnimSpritePal_Glass2[];\nextern const u32 gBattleAnimSpritePal_PinkHeart2[];\nextern const u32 gBattleAnimSpritePal_SapDrip[];\nextern const u32 gBattleAnimSpritePal_SapDrip2[];\nextern const u32 gBattleAnimSpritePal_Sparkle1[];\nextern const u32 gBattleAnimSpritePal_Sparkle2[];\nextern const u32 gBattleAnimSpritePal_HumanoidFoot[];\nextern const u32 gBattleAnimSpritePal_HitDuplicate[];\nextern const u32 gBattleAnimSpritePal_YellowUnk[];\nextern const u32 gBattleAnimSpritePal_SlamHit[];\nextern const u32 gBattleAnimSpritePal_Ring[];\nextern const u32 gBattleAnimSpritePal_Rocks[];\nextern const u32 gBattleAnimSpritePal_Z[];\nextern const u32 gBattleAnimSpritePal_YellowUnk2[];\nextern const u32 gBattleAnimSpritePal_AirSlash[];\nextern const u32 gBattleAnimSpritePal_SpinningGreenOrbs[];\nextern const u32 gBattleAnimSpritePal_Leaf[];\nextern const u32 gBattleAnimSpritePal_Finger[];\nextern const u32 gBattleAnimSpritePal_PoisonPowder[];\nextern const u32 gBattleAnimSpritePal_BrownTriangle[];\nextern const u32 gBattleAnimSpritePal_SleepPowder[];\nextern const u32 gBattleAnimSpritePal_StunSpore[];\nextern const u32 gBattleAnimSpritePal_PoisonPowder[];\nextern const u32 gBattleAnimSpritePal_Sparkle3[];\nextern const u32 gBattleAnimSpritePal_MusicNotes[];\nextern const u32 gBattleAnimSpritePal_Duck[];\nextern const u32 gBattleAnimSpritePal_MudSand[];\nextern const u32 gBattleAnimSpritePal_Alert[];\nextern const u32 gBattleAnimSpritePal_BlueFlames[];\nextern const u32 gBattleAnimSpritePal_Shock4[];\nextern const u32 gBattleAnimSpritePal_Bell2[];\nextern const u32 gBattleAnimSpritePal_PinkGlove[];\nextern const u32 gBattleAnimSpritePal_BlueLines[];\nextern const u32 gBattleAnimSpritePal_Impact3[];\nextern const u32 gBattleAnimSpritePal_Impact2[];\nextern const u32 gBattleAnimSpritePal_Reticle[];\nextern const u32 gBattleAnimSpritePal_Breath[];\nextern const u32 gBattleAnimSpritePal_Anger[];\nextern const u32 gBattleAnimSpritePal_Snowball[];\nextern const u32 gBattleAnimSpritePal_Vine[];\nextern const u32 gBattleAnimSpritePal_Sword2[];\nextern const u32 gBattleAnimSpritePal_Clapping[];\nextern const u32 gBattleAnimSpritePal_RedTube[];\nextern const u32 gBattleAnimSpritePal_Amnesia[];\nextern const u32 gBattleAnimSpritePal_String2[];\nextern const u32 gBattleAnimSpritePal_Pencil2[];\nextern const u32 gBattleAnimSpritePal_Petal[];\nextern const u32 gBattleAnimSpritePal_BentSpoon[];\nextern const u32 gBattleAnimSpritePal_MilkBottle[];\nextern const u32 gBattleAnimSpritePal_Coin[];\nextern const u32 gBattleAnimSpritePal_CrackedEgg[];\nextern const u32 gBattleAnimSpritePal_FreshEgg[];\nextern const u32 gBattleAnimSpritePal_Fangs[];\nextern const u32 gBattleAnimSpritePal_Explosion2[];\nextern const u32 gBattleAnimSpritePal_WaterDroplet[];\nextern const u32 gBattleAnimSpritePal_Seed2[];\nextern const u32 gBattleAnimSpritePal_RedWand[];\nextern const u32 gBattleAnimSpritePal_PurpleGreenUnk[];\nextern const u32 gBattleAnimSpritePal_WaterColumn[];\nextern const u32 gBattleAnimSpritePal_MudUnk[];\nextern const u32 gBattleAnimSpritePal_RainDrops[];\nextern const u32 gBattleAnimSpritePal_FurySwipes[];\nextern const u32 gBattleAnimSpritePal_Vine2[];\nextern const u32 gBattleAnimSpritePal_Teeth[];\nextern const u32 gBattleAnimSpritePal_Bone2[];\nextern const u32 gBattleAnimSpritePal_WhiteBag[];\nextern const u32 gBattleAnimSpritePal_Unknown[];\nextern const u32 gBattleAnimSpritePal_PurpleCoral[];\nextern const u32 gBattleAnimSpritePal_Shock2[];\nextern const u32 gBattleAnimSpritePal_ClosingEye2[];\nextern const u32 gBattleAnimSpritePal_MetalBall[];\nextern const u32 gBattleAnimSpritePal_MonsterDoll[];\nextern const u32 gBattleAnimSpritePal_Whirlwind[];\nextern const u32 gBattleAnimSpritePal_Explosion4[];\nextern const u32 gBattleAnimSpritePal_Tongue[];\nextern const u32 gBattleAnimSpritePal_Smoke[];\nextern const u32 gBattleAnimSpritePal_Impact[];\nextern const u32 gBattleAnimSpritePal_CircleImpact[];\nextern const u32 gBattleAnimSpritePal_SharpTeeth[];\nextern const u32 gBattleAnimSpritePal_RainbowRings[];\nextern const u32 gBattleAnimSpritePal_IceCrystals[];\nextern const u32 gBattleAnimSpritePal_HandsAndFeet[];\nextern const u32 gBattleAnimSpritePal_MistCloud[];\nextern const u32 gBattleAnimSpritePal_Orbs[];\nextern const u32 gBattleAnimSpritePal_WaterImpact[];\nextern const u32 gBattleAnimSpritePal_PoisonBubble[];\nextern const u32 gBattleAnimSpritePal_Spikes[];\nextern const u32 gBattleAnimSpritePal_HornHit2[];\nextern const u32 gBattleAnimSpritePal_AirWave2[];\nextern const u32 gBattleAnimSpritePal_SmallBubbles[];\nextern const u32 gBattleAnimSpritePal_RoundShadow[];\nextern const u32 gBattleAnimSpritePal_Sunlight[];\nextern const u32 gBattleAnimSpritePal_Spore[];\nextern const u32 gBattleAnimSpritePal_Flower[];\nextern const u32 gBattleAnimSpritePal_RazorLeaf[];\nextern const u32 gBattleAnimSpritePal_Needle[];\nextern const u32 gBattleAnimSpritePal_WhirlwindLines[];\nextern const u32 gBattleAnimSpritePal_GoldRing[];\nextern const u32 gBattleAnimSpritePal_PurpleRing[];\nextern const u32 gBattleAnimSpritePal_BlueRing[];\nextern const u32 gBattleAnimSpritePal_GreenLightWall[];\nextern const u32 gBattleAnimSpritePal_BlueLightWall[];\nextern const u32 gBattleAnimSpritePal_RedLightWall[];\nextern const u32 gBattleAnimSpritePal_GrayLightWall[];\nextern const u32 gBattleAnimSpritePal_OrangeLightWall[];\nextern const u32 gBattleAnimSpritePal_BlackBall2[];\nextern const u32 gBattleAnimSpritePal_PurpleGasCloud[];\nextern const u32 gBattleAnimSpritePal_YellowStar[];\nextern const u32 gBattleAnimSpritePal_LargeFreshEgg[];\nextern const u32 gBattleAnimSpritePal_ShadowBall[];\nextern const u32 gBattleAnimSpritePal_Lick[];\nextern const u32 gBattleAnimSpritePal_VoidLines[];\nextern const u32 gBattleAnimSpritePal_String[];\nextern const u32 gBattleAnimSpritePal_Lightbulb[];\nextern const u32 gBattleAnimSpritePal_Slash[];\nextern const u32 gBattleAnimSpritePal_FocusEnergy[];\nextern const u32 gBattleAnimSpritePal_SphereToCube[];\nextern const u32 gBattleAnimSpritePal_Tendrils[];\nextern const u32 gBattleAnimSpritePal_Eye[];\nextern const u32 gBattleAnimSpritePal_WhiteShadow[];\nextern const u32 gBattleAnimSpritePal_TealAlert[];\nextern const u32 gBattleAnimSpritePal_OpeningEye[];\nextern const u32 gBattleAnimSpritePal_RoundWhiteHalo[];\nextern const u32 gBattleAnimSpritePal_FangAttack[];\nextern const u32 gBattleAnimSpritePal_PurpleHandOutline[];\nextern const u32 gBattleAnimSpritePal_Moon[];\nextern const u32 gBattleAnimSpritePal_GreenSparkle[];\nextern const u32 gBattleAnimSpritePal_Spiral[];\nextern const u32 gBattleAnimSpritePal_SnoreZ[];\nextern const u32 gBattleAnimSpritePal_Explosion[];\nextern const u32 gBattleAnimSpritePal_Nail[];\nextern const u32 gBattleAnimSpritePal_GhostlySpirit[];\nextern const u32 gBattleAnimSpritePal_WarmRock[];\nextern const u32 gBattleAnimSpritePal_BreakingEgg[];\nextern const u32 gBattleAnimSpritePal_ThinRing[];\nextern const u32 gBattleAnimSpritePal_PunchImpact[];\nextern const u32 gBattleAnimSpritePal_Bell[];\nextern const u32 gBattleAnimSpritePal_MusicNotes2[];\nextern const u32 gBattleAnimSpritePal_SpeedDust[];\nextern const u32 gBattleAnimSpritePal_ThoughtBubble[];\nextern const u32 gBattleAnimSpritePal_MagentaHeart[];\nextern const u32 gBattleAnimSpritePal_ElectricOrbs[];\nextern const u32 gBattleAnimSpritePal_MovementWaves[];\nextern const u32 gBattleAnimSpritePal_RedHeart[];\nextern const u32 gBattleAnimSpritePal_RedOrb[];\nextern const u32 gBattleAnimSpritePal_EyeSparkle[];\nextern const u32 gBattleAnimSpritePal_PinkHeart[];\nextern const u32 gBattleAnimSpritePal_Angel[];\nextern const u32 gBattleAnimSpritePal_Devil[];\nextern const u32 gBattleAnimSpritePal_Swipe[];\nextern const u32 gBattleAnimSpritePal_Roots[];\nextern const u32 gBattleAnimSpritePal_ItemBag[];\nextern const u32 gBattleAnimSpritePal_JaggedMusicNote[];\nextern const u32 gBattleAnimSpritePal_Pokeball[];\nextern const u32 gBattleAnimSpritePal_LetterZ[];\nextern const u32 gBattleAnimSpritePal_RapidSpin[];\nextern const u32 gBattleAnimSpritePal_TriAttackTriangle[];\nextern const u32 gBattleAnimSpritePal_WispOrb[];\nextern const u32 gBattleAnimSpritePal_GoldStars[];\nextern const u32 gBattleAnimSpritePal_EclipsingOrb[];\nextern const u32 gBattleAnimSpritePal_GrayOrb[];\nextern const u32 gBattleAnimSpritePal_BlueOrb[];\nextern const u32 gBattleAnimSpritePal_RedOrb2[];\nextern const u32 gBattleAnimSpritePal_PinkPetal[];\nextern const u32 gBattleAnimSpritePal_PainSplit[];\nextern const u32 gBattleAnimSpritePal_Confetti[];\nextern const u32 gBattleAnimSpritePal_GreenStar[];\nextern const u32 gBattleAnimSpritePal_PinkCloud[];\nextern const u32 gBattleAnimSpritePal_SweatDrop[];\nextern const u32 gBattleAnimSpritePal_GuardRing[];\nextern const u32 gBattleAnimSpritePal_PurpleScratch[];\nextern const u32 gBattleAnimSpritePal_SmallRedEye[];\nextern const u32 gBattleAnimSpritePal_HollowOrb[];\nextern const u32 gBattleAnimSpritePal_BluegreenOrb[];\nextern const u32 gBattleAnimSpritePal_PawPrint[];\nextern const u32 gBattleAnimSpritePal_PurpleFlame[];\nextern const u32 gBattleAnimSpritePal_RedBall[];\nextern const u32 gBattleAnimSpritePal_SmellingsaltEffect[];\nextern const u32 gBattleAnimSpritePal_Meteor[];\nextern const u32 gBattleAnimSpritePal_FlatRock[];\nextern const u32 gBattleAnimSpritePal_MagnifyingGlass[];\nextern const u32 gBattleAnimSpritePal_BrownOrb[];\nextern const u32 gBattleAnimSpritePal_MetalSoundWaves[];\nextern const u32 gBattleAnimSpritePal_FlyingDirt[];\nextern const u32 gBattleAnimSpritePal_IcicleSpear[];\nextern const u32 gBattleAnimSpritePal_Hail[];\nextern const u32 gBattleAnimSpritePal_GlowyRedOrb[];\nextern const u32 gBattleAnimSpritePal_GlowyGreenOrb[];\nextern const u32 gBattleAnimSpritePal_GreenSpike[];\nextern const u32 gBattleAnimSpritePal_WhiteCircleOfLight[];\nextern const u32 gBattleAnimSpritePal_GlowyBlueOrb[];\nextern const u32 gBattleAnimSpritePal_SafariBait[];\nextern const u32 gBattleAnimSpritePal_WhiteFeather[];\nextern const u32 gBattleAnimSpritePal_Sparkle6[];\nextern const u32 gBattleAnimSpritePal_Splash[];\nextern const u32 gBattleAnimSpritePal_Gem1[];\nextern const u32 gBattleAnimSpritePal_SlamHit2[];\nextern const u32 gBattleAnimSpritePal_Recycle[];\nextern const u32 gBattleAnimSpritePal_RedParticles[];\nextern const u32 gBattleAnimSpritePal_Protect[];\nextern const u32 gBattleAnimSpritePal_DirtMound[];\nextern const u32 gBattleAnimSpritePal_Shock3[];\nextern const u32 gBattleAnimSpritePal_WeatherBall[];\nextern const u32 gBattleAnimSpritePal_Bird[];\nextern const u32 gBattleAnimSpritePal_CrossImpact[];\nextern const u32 gBattleAnimSpritePal_Slash2[];\nextern const u32 gBattleAnimSpritePal_WhipHit[];\nextern const u32 gBattleAnimSpritePal_BlueRing2[];\n\n// battle anim task\nextern const u32 gUnusedLevelupAnimationGfx[];\nextern const u32 gUnusedLevelupAnimationTilemap[];\nextern const u32 gCureBubblesGfx[];\nextern const u32 gCureBubblesPal[];\nextern const u32 gCureBubblesTilemap[];\nextern const u32 gBattleAnimBg_AttractGfx[];\nextern const u32 gBattleAnimBg_AttractTilemap[];\nextern const u32 gBattleAnimBg_AttractPal[];\nextern const u32 gBattleAnim_MorningSunGfx[];\nextern const u32 gBattleAnim_MorningSunTilemap[];\nextern const u32 gBattleAnim_MorningSunPal[];\n\n// battle bg\nextern const u32 gBattleAnimBgImage_Dark[];\nextern const u32 gBattleAnimBgImage_Ghost[];\nextern const u32 gBattleAnimBgImage_Psychic[];\nextern const u32 gBattleAnimBgImage_Impact[];\nextern const u32 gBattleAnimBgImage_Drill[];\nextern const u32 gBattleAnimBgImage_Highspeed[];\nextern const u32 gBattleAnimBgImage_Thunder[];\nextern const u32 gBattleAnimBgImage_Guillotine[];\nextern const u32 gBattleAnimBgImage_Ice[];\nextern const u32 gBattleAnimBgImage_Cosmic[];\nextern const u32 gBattleAnimBgImage_InAir[];\nextern const u32 gBattleAnimBgImage_Aurora[];\nextern const u32 gBattleAnimBgImage_Fissure[];\nextern const u32 gBattleAnimBgImage_Surf[];\nextern const u32 gBattleAnimBgPalette_Dark[];\nextern const u32 gBattleAnimBgPalette_Ghost[];\nextern const u32 gBattleAnimBgPalette_Psychic[];\nextern const u32 gBattleAnimBgPalette_Impact[];\nextern const u32 gBattleAnimBgPalette_Drill[];\nextern const u32 gBattleAnimBgPalette_Highspeed[];\nextern const u32 gBattleAnimBgPalette_Thunder[];\nextern const u32 gBattleAnimBgPalette_Guillotine[];\nextern const u32 gBattleAnimBgPalette_Ice[];\nextern const u32 gBattleAnimBgPalette_Cosmic[];\nextern const u32 gBattleAnimBgPalette_InAir[];\nextern const u32 gBattleAnimBgPalette_MuddyWater[];\nextern const u32 gBattleAnimBgPalette_Sky[];\nextern const u32 gBattleAnimBgPalette_Aurora[];\nextern const u32 gBattleAnimBgPalette_Fissure[];\nextern const u32 gBattleAnimBgPalette_Bug[];\nextern const u32 gBattleAnimBgPalette_SolarBeam[];\nextern const u32 gBattleAnimBgPalette_Surf[];\nextern const u32 gBattleAnimBgTilemap_Dark[];\nextern const u32 gBattleAnimBgTilemap_Ghost[];\nextern const u32 gBattleAnimBgTilemap_Psychic[];\nextern const u32 gBattleAnimBgTilemap_ImpactOpponent[];\nextern const u32 gBattleAnimBgTilemap_ImpactPlayer[];\nextern const u32 gBattleAnimBgTilemap_ImpactContests[];\nextern const u32 gBattleAnimBgTilemap_Drill[];\nextern const u32 gBattleAnimBgTilemap_DrillContests[];\nextern const u32 gBattleAnimBgTilemap_HighspeedOpponent[];\nextern const u32 gBattleAnimBgTilemap_HighspeedPlayer[];\nextern const u32 gBattleAnimBgTilemap_Thunder[];\nextern const u32 gBattleAnimBgTilemap_GuillotineOpponent[];\nextern const u32 gBattleAnimBgTilemap_GuillotinePlayer[];\nextern const u32 gBattleAnimBgTilemap_GuillotineContests[];\nextern const u32 gBattleAnimBgTilemap_Ice[];\nextern const u32 gBattleAnimBgTilemap_Cosmic[];\nextern const u32 gBattleAnimBgTilemap_InAir[];\nextern const u32 gBattleAnimBgTilemap_Aurora[];\nextern const u32 gBattleAnimBgTilemap_Fissure[];\nextern const u32 gBattleAnimBgTilemap_SurfOpponent[];\nextern const u32 gBattleAnimBgTilemap_SurfPlayer[];\nextern const u32 gBattleAnimBgTilemap_SurfContest[];\n\n// dark\nextern const u32 gMetalShineGfx[];\nextern const u32 gMetalShinePalette[];\nextern const u32 gMetalShineTilemap[];\n\n// ghost\nextern const u32 gFile_graphics_battle_anims_backgrounds_scary_face_sheet[];\nextern const u32 gFile_graphics_battle_anims_backgrounds_scary_face_palette[];\nextern const u32 gFile_graphics_battle_anims_backgrounds_scary_face_player_tilemap[];\n\n// rock\nextern const u32 gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap[];\nextern const u32 gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet[];\nextern const u32 gBattleAnimSpritePal_FlyingDirt[];\n\n// title_screen\nextern const u16 gGraphics_TitleScreen_GameTitleLogoPals_FR[];\nextern const u16 gGraphics_TitleScreen_GameTitleLogoPals_LG[];\nextern const u8 gGraphics_TitleScreen_GameTitleLogoTiles_FR[];\nextern const u8 gGraphics_TitleScreen_GameTitleLogoTiles_LG[];\nextern const u8 gGraphics_TitleScreen_GameTitleLogoMap_FR[];\nextern const u8 gGraphics_TitleScreen_GameTitleLogoMap_LG[];\nextern const u16 gGraphics_TitleScreen_BoxArtMonPals_FR[];\nextern const u16 gGraphics_TitleScreen_BoxArtMonPals_LG[];\nextern const u8 gGraphics_TitleScreen_BoxArtMonTiles_FR[];\nextern const u8 gGraphics_TitleScreen_BoxArtMonTiles_LG[];\nextern const u8 gGraphics_TitleScreen_BoxArtMonMap_FR[];\nextern const u8 gGraphics_TitleScreen_BoxArtMonMap_LG[];\nextern u16 gGraphics_TitleScreen_BackgroundPals_FR[]; // If this is const, title_screen.c does not match\nextern u16 gGraphics_TitleScreen_BackgroundPals_LG[]; // If this is const, title_screen.c does not match\nextern const u8 gGraphics_TitleScreen_CopyrightPressStartTiles[];\nextern const u8 gGraphics_TitleScreen_CopyrightPressStartMap[];\nextern const u16 gTitleScreen_Slash_Pal_FR[];\nextern const u16 gTitleScreen_Slash_Pal_LG[];\nextern const u32 gTitleScreen_BlankSprite_Tiles[];\n\n// battle_gfx_sfx_util\nextern const u32 gHealthboxSinglesPlayerGfx[];\nextern const u32 gHealthboxSinglesOpponentGfx[];\nextern const u32 gHealthboxDoublesPlayerGfx[];\nextern const u32 gHealthboxDoublesOpponentGfx[];\nextern const u32 gHealthboxSafariGfx[];\nextern const u32 gBlankGfxCompressed[];\nextern const u32 gInterfaceGfx_HPNumbers[];\nextern const u32 gGhostFrontPic[];\nextern const u32 gGhostPalette[];\nextern const u32 gSubstituteDollGfx[];\nextern const u32 gSubstituteDollTilemap[];\nextern const u32 gSubstituteDollPal[];\n\n// ice\nextern const u8 gWeatherFogHorizontalTiles[];\nextern const u32 gBattleAnimFogTilemap[];\nextern const u16 gDefaultWeatherSpritePalette[];\n\n// party_menu\nextern const u32 gPartyMenuPokeball_Gfx[];\nextern const u32 gPartyMenuPokeball_Pal[];\nextern const u32 gPartyMenuPokeballSmall_Gfx[];\nextern const u32 gStatusGfx_Icons[];\nextern const u32 gStatusPal_Icons[];\nextern const u32 gPartyMenuBg_Gfx[];\nextern const u32 gPartyMenuBg_Tilemap[];\nextern const u32 gPartyMenuBg_Pal[];\n\n// credits\nextern const u32 gCreditsMonPokeball_Tiles[];\nextern const u32 gCreditsMonPokeball_Tilemap[];\nextern const u16 gCreditsMonPokeball_Pals[][16];\nextern const u16 gCreditsCopyright_Pal[];\nextern const u8 gCreditsCopyright_Tiles[];\nextern const u8 gCreditsCopyright_Tilemap[];\n\n// berry_pouch\nextern const u32 gBerryPouchSpriteTiles[];\nextern const u8 gBerryPouchBgGfx[];\nextern const u32 gBerryPouchBgPals[];\nextern const u32 gBerryPouchBgPal0FemaleOverride[];\nextern const u32 gBerryPouchSpritePalette[];\nextern const u8 gBerryPouchBg1Tilemap[];\n\nextern const u8 gTrainerBackPic_Red[];\nextern const u8 gTrainerBackPic_Leaf[];\nextern const u8 gTrainerBackPic_Pokedude[];\nextern const u8 gTrainerBackPic_OldMan[];\nextern const u8 gTrainerBackPic_RSBrendan[];\nextern const u8 gTrainerBackPic_RSMay[];\nextern const u8 gTrainerBackPic_EmBrendan[];\nextern const u8 gTrainerBackPic_EmMay[];\n\n// mail\nextern const u16 gFile_graphics_mail_orange_palette_pal[];\nextern const u16 gFile_graphics_mail_harbor_palette_pal[];\nextern const u16 gFile_graphics_mail_glitter_palette_pal[];\nextern const u16 gFile_graphics_mail_mech_palette_pal[];\nextern const u16 gFile_graphics_mail_wood_palette_pal[];\nextern const u16 gFile_graphics_mail_wave_palette_pal[];\nextern const u16 gFile_graphics_mail_bead_palette_pal[];\nextern const u16 gFile_graphics_mail_shadow_palette_pal[];\nextern const u16 gFile_graphics_mail_tropic_palette_pal[];\nextern const u16 gFile_graphics_mail_dream_palette_pal[];\nextern const u16 gFile_graphics_mail_fab_palette_pal[];\nextern const u16 gFile_graphics_mail_retro_palette_pal[];\nextern const u32 gFile_graphics_mail_orange_tiles_sheet[];\nextern const u32 gFile_graphics_mail_harbor_tiles_sheet[];\nextern const u32 gFile_graphics_mail_glitter_tiles_sheet[];\nextern const u32 gFile_graphics_mail_mech_tiles_sheet[];\nextern const u32 gFile_graphics_mail_wood_tiles_sheet[];\nextern const u32 gFile_graphics_mail_wave_tiles_sheet[];\nextern const u32 gFile_graphics_mail_bead_tiles_sheet[];\nextern const u32 gFile_graphics_mail_shadow_tiles_sheet[];\nextern const u32 gFile_graphics_mail_tropic_tiles_sheet[];\nextern const u32 gFile_graphics_mail_dream_tiles_sheet[];\nextern const u32 gFile_graphics_mail_fab_tiles_sheet[];\nextern const u32 gFile_graphics_mail_retro_tiles_sheet[];\nextern const u32 gFile_graphics_mail_orange_map_tilemap[];\nextern const u32 gFile_graphics_mail_harbor_map_tilemap[];\nextern const u32 gFile_graphics_mail_glitter_map_tilemap[];\nextern const u32 gFile_graphics_mail_mech_map_tilemap[];\nextern const u32 gFile_graphics_mail_wood_map_tilemap[];\nextern const u32 gFile_graphics_mail_wave_map_tilemap[];\nextern const u32 gFile_graphics_mail_bead_map_tilemap[];\nextern const u32 gFile_graphics_mail_shadow_map_tilemap[];\nextern const u32 gFile_graphics_mail_tropic_map_tilemap[];\nextern const u32 gFile_graphics_mail_dream_map_tilemap[];\nextern const u32 gFile_graphics_mail_fab_map_tilemap[];\nextern const u32 gFile_graphics_mail_retro_map_tilemap[];\n\n// pokemon_icons\nextern const u8 gMonIcon_Bulbasaur[];\nextern const u8 gMonIcon_Ivysaur[];\nextern const u8 gMonIcon_Venusaur[];\nextern const u8 gMonIcon_Charmander[];\nextern const u8 gMonIcon_Charmeleon[];\nextern const u8 gMonIcon_Charizard[];\nextern const u8 gMonIcon_Squirtle[];\nextern const u8 gMonIcon_Wartortle[];\nextern const u8 gMonIcon_Blastoise[];\nextern const u8 gMonIcon_Caterpie[];\nextern const u8 gMonIcon_Metapod[];\nextern const u8 gMonIcon_Butterfree[];\nextern const u8 gMonIcon_Weedle[];\nextern const u8 gMonIcon_Kakuna[];\nextern const u8 gMonIcon_Beedrill[];\nextern const u8 gMonIcon_Pidgey[];\nextern const u8 gMonIcon_Pidgeotto[];\nextern const u8 gMonIcon_Pidgeot[];\nextern const u8 gMonIcon_Rattata[];\nextern const u8 gMonIcon_Raticate[];\nextern const u8 gMonIcon_Spearow[];\nextern const u8 gMonIcon_Fearow[];\nextern const u8 gMonIcon_Ekans[];\nextern const u8 gMonIcon_Arbok[];\nextern const u8 gMonIcon_Pikachu[];\nextern const u8 gMonIcon_Raichu[];\nextern const u8 gMonIcon_Sandshrew[];\nextern const u8 gMonIcon_Sandslash[];\nextern const u8 gMonIcon_Nidoran_f[];\nextern const u8 gMonIcon_Nidorina[];\nextern const u8 gMonIcon_Nidoqueen[];\nextern const u8 gMonIcon_Nidoran_m[];\nextern const u8 gMonIcon_Nidorino[];\nextern const u8 gMonIcon_Nidoking[];\nextern const u8 gMonIcon_Clefairy[];\nextern const u8 gMonIcon_Clefable[];\nextern const u8 gMonIcon_Vulpix[];\nextern const u8 gMonIcon_Ninetales[];\nextern const u8 gMonIcon_Jigglypuff[];\nextern const u8 gMonIcon_Wigglytuff[];\nextern const u8 gMonIcon_Zubat[];\nextern const u8 gMonIcon_Golbat[];\nextern const u8 gMonIcon_Oddish[];\nextern const u8 gMonIcon_Gloom[];\nextern const u8 gMonIcon_Vileplume[];\nextern const u8 gMonIcon_Paras[];\nextern const u8 gMonIcon_Parasect[];\nextern const u8 gMonIcon_Venonat[];\nextern const u8 gMonIcon_Venomoth[];\nextern const u8 gMonIcon_Diglett[];\nextern const u8 gMonIcon_Dugtrio[];\nextern const u8 gMonIcon_Meowth[];\nextern const u8 gMonIcon_Persian[];\nextern const u8 gMonIcon_Psyduck[];\nextern const u8 gMonIcon_Golduck[];\nextern const u8 gMonIcon_Mankey[];\nextern const u8 gMonIcon_Primeape[];\nextern const u8 gMonIcon_Growlithe[];\nextern const u8 gMonIcon_Arcanine[];\nextern const u8 gMonIcon_Poliwag[];\nextern const u8 gMonIcon_Poliwhirl[];\nextern const u8 gMonIcon_Poliwrath[];\nextern const u8 gMonIcon_Abra[];\nextern const u8 gMonIcon_Kadabra[];\nextern const u8 gMonIcon_Alakazam[];\nextern const u8 gMonIcon_Machop[];\nextern const u8 gMonIcon_Machoke[];\nextern const u8 gMonIcon_Machamp[];\nextern const u8 gMonIcon_Bellsprout[];\nextern const u8 gMonIcon_Weepinbell[];\nextern const u8 gMonIcon_Victreebel[];\nextern const u8 gMonIcon_Tentacool[];\nextern const u8 gMonIcon_Tentacruel[];\nextern const u8 gMonIcon_Geodude[];\nextern const u8 gMonIcon_Graveler[];\nextern const u8 gMonIcon_Golem[];\nextern const u8 gMonIcon_Ponyta[];\nextern const u8 gMonIcon_Rapidash[];\nextern const u8 gMonIcon_Slowpoke[];\nextern const u8 gMonIcon_Slowbro[];\nextern const u8 gMonIcon_Magnemite[];\nextern const u8 gMonIcon_Magneton[];\nextern const u8 gMonIcon_Farfetchd[];\nextern const u8 gMonIcon_Doduo[];\nextern const u8 gMonIcon_Dodrio[];\nextern const u8 gMonIcon_Seel[];\nextern const u8 gMonIcon_Dewgong[];\nextern const u8 gMonIcon_Grimer[];\nextern const u8 gMonIcon_Muk[];\nextern const u8 gMonIcon_Shellder[];\nextern const u8 gMonIcon_Cloyster[];\nextern const u8 gMonIcon_Gastly[];\nextern const u8 gMonIcon_Haunter[];\nextern const u8 gMonIcon_Gengar[];\nextern const u8 gMonIcon_Onix[];\nextern const u8 gMonIcon_Drowzee[];\nextern const u8 gMonIcon_Hypno[];\nextern const u8 gMonIcon_Krabby[];\nextern const u8 gMonIcon_Kingler[];\nextern const u8 gMonIcon_Voltorb[];\nextern const u8 gMonIcon_Electrode[];\nextern const u8 gMonIcon_Exeggcute[];\nextern const u8 gMonIcon_Exeggutor[];\nextern const u8 gMonIcon_Cubone[];\nextern const u8 gMonIcon_Marowak[];\nextern const u8 gMonIcon_Hitmonlee[];\nextern const u8 gMonIcon_Hitmonchan[];\nextern const u8 gMonIcon_Lickitung[];\nextern const u8 gMonIcon_Koffing[];\nextern const u8 gMonIcon_Weezing[];\nextern const u8 gMonIcon_Rhyhorn[];\nextern const u8 gMonIcon_Rhydon[];\nextern const u8 gMonIcon_Chansey[];\nextern const u8 gMonIcon_Tangela[];\nextern const u8 gMonIcon_Kangaskhan[];\nextern const u8 gMonIcon_Horsea[];\nextern const u8 gMonIcon_Seadra[];\nextern const u8 gMonIcon_Goldeen[];\nextern const u8 gMonIcon_Seaking[];\nextern const u8 gMonIcon_Staryu[];\nextern const u8 gMonIcon_Starmie[];\nextern const u8 gMonIcon_Mr_Mime[];\nextern const u8 gMonIcon_Scyther[];\nextern const u8 gMonIcon_Jynx[];\nextern const u8 gMonIcon_Electabuzz[];\nextern const u8 gMonIcon_Magmar[];\nextern const u8 gMonIcon_Pinsir[];\nextern const u8 gMonIcon_Tauros[];\nextern const u8 gMonIcon_Magikarp[];\nextern const u8 gMonIcon_Gyarados[];\nextern const u8 gMonIcon_Lapras[];\nextern const u8 gMonIcon_Ditto[];\nextern const u8 gMonIcon_Eevee[];\nextern const u8 gMonIcon_Vaporeon[];\nextern const u8 gMonIcon_Jolteon[];\nextern const u8 gMonIcon_Flareon[];\nextern const u8 gMonIcon_Porygon[];\nextern const u8 gMonIcon_Omanyte[];\nextern const u8 gMonIcon_Omastar[];\nextern const u8 gMonIcon_Kabuto[];\nextern const u8 gMonIcon_Kabutops[];\nextern const u8 gMonIcon_Aerodactyl[];\nextern const u8 gMonIcon_Snorlax[];\nextern const u8 gMonIcon_Articuno[];\nextern const u8 gMonIcon_Zapdos[];\nextern const u8 gMonIcon_Moltres[];\nextern const u8 gMonIcon_Dratini[];\nextern const u8 gMonIcon_Dragonair[];\nextern const u8 gMonIcon_Dragonite[];\nextern const u8 gMonIcon_Mewtwo[];\nextern const u8 gMonIcon_Mew[];\nextern const u8 gMonIcon_Chikorita[];\nextern const u8 gMonIcon_Bayleef[];\nextern const u8 gMonIcon_Meganium[];\nextern const u8 gMonIcon_Cyndaquil[];\nextern const u8 gMonIcon_Quilava[];\nextern const u8 gMonIcon_Typhlosion[];\nextern const u8 gMonIcon_Totodile[];\nextern const u8 gMonIcon_Croconaw[];\nextern const u8 gMonIcon_Feraligatr[];\nextern const u8 gMonIcon_Sentret[];\nextern const u8 gMonIcon_Furret[];\nextern const u8 gMonIcon_Hoothoot[];\nextern const u8 gMonIcon_Noctowl[];\nextern const u8 gMonIcon_Ledyba[];\nextern const u8 gMonIcon_Ledian[];\nextern const u8 gMonIcon_Spinarak[];\nextern const u8 gMonIcon_Ariados[];\nextern const u8 gMonIcon_Crobat[];\nextern const u8 gMonIcon_Chinchou[];\nextern const u8 gMonIcon_Lanturn[];\nextern const u8 gMonIcon_Pichu[];\nextern const u8 gMonIcon_Cleffa[];\nextern const u8 gMonIcon_Igglybuff[];\nextern const u8 gMonIcon_Togepi[];\nextern const u8 gMonIcon_Togetic[];\nextern const u8 gMonIcon_Natu[];\nextern const u8 gMonIcon_Xatu[];\nextern const u8 gMonIcon_Mareep[];\nextern const u8 gMonIcon_Flaaffy[];\nextern const u8 gMonIcon_Ampharos[];\nextern const u8 gMonIcon_Bellossom[];\nextern const u8 gMonIcon_Marill[];\nextern const u8 gMonIcon_Azumarill[];\nextern const u8 gMonIcon_Sudowoodo[];\nextern const u8 gMonIcon_Politoed[];\nextern const u8 gMonIcon_Hoppip[];\nextern const u8 gMonIcon_Skiploom[];\nextern const u8 gMonIcon_Jumpluff[];\nextern const u8 gMonIcon_Aipom[];\nextern const u8 gMonIcon_Sunkern[];\nextern const u8 gMonIcon_Sunflora[];\nextern const u8 gMonIcon_Yanma[];\nextern const u8 gMonIcon_Wooper[];\nextern const u8 gMonIcon_Quagsire[];\nextern const u8 gMonIcon_Espeon[];\nextern const u8 gMonIcon_Umbreon[];\nextern const u8 gMonIcon_Murkrow[];\nextern const u8 gMonIcon_Slowking[];\nextern const u8 gMonIcon_Misdreavus[];\nextern const u8 gMonIcon_Unown_A[];\nextern const u8 gMonIcon_Wobbuffet[];\nextern const u8 gMonIcon_Girafarig[];\nextern const u8 gMonIcon_Pineco[];\nextern const u8 gMonIcon_Forretress[];\nextern const u8 gMonIcon_Dunsparce[];\nextern const u8 gMonIcon_Gligar[];\nextern const u8 gMonIcon_Steelix[];\nextern const u8 gMonIcon_Snubbull[];\nextern const u8 gMonIcon_Granbull[];\nextern const u8 gMonIcon_Qwilfish[];\nextern const u8 gMonIcon_Scizor[];\nextern const u8 gMonIcon_Shuckle[];\nextern const u8 gMonIcon_Heracross[];\nextern const u8 gMonIcon_Sneasel[];\nextern const u8 gMonIcon_Teddiursa[];\nextern const u8 gMonIcon_Ursaring[];\nextern const u8 gMonIcon_Slugma[];\nextern const u8 gMonIcon_Magcargo[];\nextern const u8 gMonIcon_Swinub[];\nextern const u8 gMonIcon_Piloswine[];\nextern const u8 gMonIcon_Corsola[];\nextern const u8 gMonIcon_Remoraid[];\nextern const u8 gMonIcon_Octillery[];\nextern const u8 gMonIcon_Delibird[];\nextern const u8 gMonIcon_Mantine[];\nextern const u8 gMonIcon_Skarmory[];\nextern const u8 gMonIcon_Houndour[];\nextern const u8 gMonIcon_Houndoom[];\nextern const u8 gMonIcon_Kingdra[];\nextern const u8 gMonIcon_Phanpy[];\nextern const u8 gMonIcon_Donphan[];\nextern const u8 gMonIcon_Porygon2[];\nextern const u8 gMonIcon_Stantler[];\nextern const u8 gMonIcon_Smeargle[];\nextern const u8 gMonIcon_Tyrogue[];\nextern const u8 gMonIcon_Hitmontop[];\nextern const u8 gMonIcon_Smoochum[];\nextern const u8 gMonIcon_Elekid[];\nextern const u8 gMonIcon_Magby[];\nextern const u8 gMonIcon_Miltank[];\nextern const u8 gMonIcon_Blissey[];\nextern const u8 gMonIcon_Raikou[];\nextern const u8 gMonIcon_Entei[];\nextern const u8 gMonIcon_Suicune[];\nextern const u8 gMonIcon_Larvitar[];\nextern const u8 gMonIcon_Pupitar[];\nextern const u8 gMonIcon_Tyranitar[];\nextern const u8 gMonIcon_Lugia[];\nextern const u8 gMonIcon_Ho_Oh[];\nextern const u8 gMonIcon_Celebi[];\nextern const u8 gMonIcon_Treecko[];\nextern const u8 gMonIcon_Grovyle[];\nextern const u8 gMonIcon_Sceptile[];\nextern const u8 gMonIcon_Torchic[];\nextern const u8 gMonIcon_Combusken[];\nextern const u8 gMonIcon_Blaziken[];\nextern const u8 gMonIcon_Mudkip[];\nextern const u8 gMonIcon_Marshtomp[];\nextern const u8 gMonIcon_Swampert[];\nextern const u8 gMonIcon_Poochyena[];\nextern const u8 gMonIcon_Mightyena[];\nextern const u8 gMonIcon_Zigzagoon[];\nextern const u8 gMonIcon_Linoone[];\nextern const u8 gMonIcon_Wurmple[];\nextern const u8 gMonIcon_Silcoon[];\nextern const u8 gMonIcon_Beautifly[];\nextern const u8 gMonIcon_Cascoon[];\nextern const u8 gMonIcon_Dustox[];\nextern const u8 gMonIcon_Lotad[];\nextern const u8 gMonIcon_Lombre[];\nextern const u8 gMonIcon_Ludicolo[];\nextern const u8 gMonIcon_Seedot[];\nextern const u8 gMonIcon_Nuzleaf[];\nextern const u8 gMonIcon_Shiftry[];\nextern const u8 gMonIcon_Nincada[];\nextern const u8 gMonIcon_Ninjask[];\nextern const u8 gMonIcon_Shedinja[];\nextern const u8 gMonIcon_Taillow[];\nextern const u8 gMonIcon_Swellow[];\nextern const u8 gMonIcon_Shroomish[];\nextern const u8 gMonIcon_Breloom[];\nextern const u8 gMonIcon_Spinda[];\nextern const u8 gMonIcon_Wingull[];\nextern const u8 gMonIcon_Pelipper[];\nextern const u8 gMonIcon_Surskit[];\nextern const u8 gMonIcon_Masquerain[];\nextern const u8 gMonIcon_Wailmer[];\nextern const u8 gMonIcon_Wailord[];\nextern const u8 gMonIcon_Skitty[];\nextern const u8 gMonIcon_Delcatty[];\nextern const u8 gMonIcon_Kecleon[];\nextern const u8 gMonIcon_Baltoy[];\nextern const u8 gMonIcon_Claydol[];\nextern const u8 gMonIcon_Nosepass[];\nextern const u8 gMonIcon_Torkoal[];\nextern const u8 gMonIcon_Sableye[];\nextern const u8 gMonIcon_Barboach[];\nextern const u8 gMonIcon_Whiscash[];\nextern const u8 gMonIcon_Luvdisc[];\nextern const u8 gMonIcon_Corphish[];\nextern const u8 gMonIcon_Crawdaunt[];\nextern const u8 gMonIcon_Feebas[];\nextern const u8 gMonIcon_Milotic[];\nextern const u8 gMonIcon_Carvanha[];\nextern const u8 gMonIcon_Sharpedo[];\nextern const u8 gMonIcon_Trapinch[];\nextern const u8 gMonIcon_Vibrava[];\nextern const u8 gMonIcon_Flygon[];\nextern const u8 gMonIcon_Makuhita[];\nextern const u8 gMonIcon_Hariyama[];\nextern const u8 gMonIcon_Electrike[];\nextern const u8 gMonIcon_Manectric[];\nextern const u8 gMonIcon_Numel[];\nextern const u8 gMonIcon_Camerupt[];\nextern const u8 gMonIcon_Spheal[];\nextern const u8 gMonIcon_Sealeo[];\nextern const u8 gMonIcon_Walrein[];\nextern const u8 gMonIcon_Cacnea[];\nextern const u8 gMonIcon_Cacturne[];\nextern const u8 gMonIcon_Snorunt[];\nextern const u8 gMonIcon_Glalie[];\nextern const u8 gMonIcon_Lunatone[];\nextern const u8 gMonIcon_Solrock[];\nextern const u8 gMonIcon_Azurill[];\nextern const u8 gMonIcon_Spoink[];\nextern const u8 gMonIcon_Grumpig[];\nextern const u8 gMonIcon_Plusle[];\nextern const u8 gMonIcon_Minun[];\nextern const u8 gMonIcon_Mawile[];\nextern const u8 gMonIcon_Meditite[];\nextern const u8 gMonIcon_Medicham[];\nextern const u8 gMonIcon_Swablu[];\nextern const u8 gMonIcon_Altaria[];\nextern const u8 gMonIcon_Wynaut[];\nextern const u8 gMonIcon_Duskull[];\nextern const u8 gMonIcon_Dusclops[];\nextern const u8 gMonIcon_Roselia[];\nextern const u8 gMonIcon_Slakoth[];\nextern const u8 gMonIcon_Vigoroth[];\nextern const u8 gMonIcon_Slaking[];\nextern const u8 gMonIcon_Gulpin[];\nextern const u8 gMonIcon_Swalot[];\nextern const u8 gMonIcon_Tropius[];\nextern const u8 gMonIcon_Whismur[];\nextern const u8 gMonIcon_Loudred[];\nextern const u8 gMonIcon_Exploud[];\nextern const u8 gMonIcon_Clamperl[];\nextern const u8 gMonIcon_Huntail[];\nextern const u8 gMonIcon_Gorebyss[];\nextern const u8 gMonIcon_Absol[];\nextern const u8 gMonIcon_Shuppet[];\nextern const u8 gMonIcon_Banette[];\nextern const u8 gMonIcon_Seviper[];\nextern const u8 gMonIcon_Zangoose[];\nextern const u8 gMonIcon_Relicanth[];\nextern const u8 gMonIcon_Aron[];\nextern const u8 gMonIcon_Lairon[];\nextern const u8 gMonIcon_Aggron[];\nextern const u8 gMonIcon_Castform[];\nextern const u8 gMonIcon_Volbeat[];\nextern const u8 gMonIcon_Illumise[];\nextern const u8 gMonIcon_Lileep[];\nextern const u8 gMonIcon_Cradily[];\nextern const u8 gMonIcon_Anorith[];\nextern const u8 gMonIcon_Armaldo[];\nextern const u8 gMonIcon_Ralts[];\nextern const u8 gMonIcon_Kirlia[];\nextern const u8 gMonIcon_Gardevoir[];\nextern const u8 gMonIcon_Bagon[];\nextern const u8 gMonIcon_Shelgon[];\nextern const u8 gMonIcon_Salamence[];\nextern const u8 gMonIcon_Beldum[];\nextern const u8 gMonIcon_Metang[];\nextern const u8 gMonIcon_Metagross[];\nextern const u8 gMonIcon_Regirock[];\nextern const u8 gMonIcon_Regice[];\nextern const u8 gMonIcon_Registeel[];\nextern const u8 gMonIcon_Kyogre[];\nextern const u8 gMonIcon_Groudon[];\nextern const u8 gMonIcon_Rayquaza[];\nextern const u8 gMonIcon_Latias[];\nextern const u8 gMonIcon_Latios[];\nextern const u8 gMonIcon_Jirachi[];\nextern const u8 gMonIcon_Deoxys[];\nextern const u8 gMonIcon_Chimecho[];\nextern const u8 gMonIcon_Egg[];\nextern const u8 gMonIcon_Unown_B[];\nextern const u8 gMonIcon_Unown_C[];\nextern const u8 gMonIcon_Unown_D[];\nextern const u8 gMonIcon_Unown_E[];\nextern const u8 gMonIcon_Unown_F[];\nextern const u8 gMonIcon_Unown_G[];\nextern const u8 gMonIcon_Unown_H[];\nextern const u8 gMonIcon_Unown_I[];\nextern const u8 gMonIcon_Unown_J[];\nextern const u8 gMonIcon_Unown_K[];\nextern const u8 gMonIcon_Unown_L[];\nextern const u8 gMonIcon_Unown_M[];\nextern const u8 gMonIcon_Unown_N[];\nextern const u8 gMonIcon_Unown_O[];\nextern const u8 gMonIcon_Unown_P[];\nextern const u8 gMonIcon_Unown_Q[];\nextern const u8 gMonIcon_Unown_R[];\nextern const u8 gMonIcon_Unown_S[];\nextern const u8 gMonIcon_Unown_T[];\nextern const u8 gMonIcon_Unown_U[];\nextern const u8 gMonIcon_Unown_V[];\nextern const u8 gMonIcon_Unown_W[];\nextern const u8 gMonIcon_Unown_X[];\nextern const u8 gMonIcon_Unown_Y[];\nextern const u8 gMonIcon_Unown_Z[];\nextern const u8 gMonIcon_Unown_ExclamationMark[];\nextern const u8 gMonIcon_Unown_QuestionMark[];\nextern const u8 gMonIcon_QuestionMark[];\n\n// trade\nextern const u16 gTradeMenu_Pal[];\nextern const u16 gTradeCursor_Pal[];\nextern const u16 gTradeMenu_Gfx[];\nextern const u16 gTradeMenu_Tilemap[];\nextern const u16 gTradeCursor_Gfx[];\nextern const u16 gTradeMenuMonBox_Tilemap[];\n\n// mon_markings\nextern const u16 gMonMarkingsMenu_Gfx[];\nextern const u16 gMonMarkingsMenu_Pal[];\n\n// hall_of_fame\nextern const u32 gFile_graphics_misc_confetti_sheet[];\nextern const u32 gFile_graphics_misc_confetti_palette[];\n\n// learn_move\nextern const u16 gMoveRelearner_Pal[];\nextern const u32 gMoveRelearner_Gfx[];\nextern const u32 gMoveRelearner_Tilemap[];\n\n// shop menu\nextern const u32 gBuyMenuFrame_Gfx[];\nextern const u32 gBuyMenuFrame_Tilemap[];\nextern const u32 gBuyMenuFrame_TmHmTilemap[];\nextern const u32 gBuyMenuFrame_Pal[];\n\n// battle_message\nextern const u16 gPPTextPalette[];\n\n// trainer card\nextern const u16 gKantoTrainerCardBlue_Pal[];\nextern const u32 gKantoTrainerCard_Gfx[];\nextern const u16 gHoennTrainerCardGreen_Pal[];\nextern const u32 gHoennTrainerCard_Gfx[];\n\n// battle_interface\nextern const u32 gBattleInterface_Textbox_Gfx[];\nextern const u32 gBattleInterface_Textbox_Pal[];\nextern const u32 gBattleInterface_Textbox_Tilemap[];\nextern const u32 gBattleInterface_PartySummaryBar_Gfx[];\nextern const u8 gBattleInterface_Gfx[][32];\nextern const u16 gBattleInterface_Healthbox_Pal[];\nextern const u16 gBattleInterface_Healthbar_Pal[];\nextern const u8 gNuzlockeFirstEncounterIndicator[];\n\n// item_menu\nextern const u32 gBagBg_Gfx[];\nextern const u32 gBagBg_Tilemap[];\nextern const u32 gBagBg_ItemPC_Tilemap[];\nextern const u32 gBagBgPalette[];\nextern const u32 gBagBgPalette_FemaleOverride[];\n\n// union_room_chat_display\nextern const u16 gUnionRoomChat_Panel_Pal[];\nextern const u32 gUnionRoomChat_Panel_Gfx[];\nextern const u32 gUnionRoomChat_Panel_Tilemap[];\nextern const u16 gUnionRoomChat_Bg_Pal[];\nextern const u32 gUnionRoomChat_Bg_Gfx[];\nextern const u32 gUnionRoomChat_Bg_Tilemap[];\n\n// union_room_chat_objects\nextern const u32 gUnionRoomChat_Icons_Gfx[];\n\n// battle_bg\nextern const u32 gFile_graphics_battle_transitions_vs_frame_sheet[];\nextern const u32 gVsLettersGfx[];\nextern const u32 gFile_graphics_battle_transitions_vs_frame_palette[];\nextern const u32 gFile_graphics_battle_transitions_vs_frame_tilemap[];\n\n// berry_crush\nextern const u16 gBerryCrush_Crusher_Pal[];\nextern const u32 gBerryCrush_Crusher_Gfx[];\nextern const u32 gBerryCrush_TextWindows_Tilemap[];\n\n// easy_chat_3\nextern const u32 gEasyChatWindow_Gfx[];\nextern const u32 gEasyChatWindow_Tilemap[];\nextern const u32 gEasyChatWindow_Pal[];\nextern const u16 gEasyChatButtonWindow_Pal[];\nextern const u32 gEasyChatRectangleCursor_Gfx[];\nextern const u32 gEasyChatButtonWindow_Gfx[];\nextern const u32 gEasyChatMode_Gfx[];\n\n// naming_screen\nextern const u32 gNamingScreenBackground_Tilemap[];\nextern const u32 gNamingScreenKeyboardLower_Tilemap[];\nextern const u32 gNamingScreenKeyboardUpper_Tilemap[];\nextern const u32 gNamingScreenKeyboardSymbols_Tilemap[];\nextern const u32 gNamingScreenMenu_Gfx[];\nextern const u16 gNamingScreenRival_Pal[];\nextern const u16 gNamingScreenKeyboard_Pal[];\nextern const u16 gNamingScreenMenu_Pal[6][16];\nextern const u16 gNamingScreenBackButton_Gfx[];\nextern const u16 gNamingScreenOKButton_Gfx[];\nextern const u16 gNamingScreenPageSwapFrame_Gfx[];\nextern const u16 gNamingScreenPageSwapButton_Gfx[];\nextern const u16 gNamingScreenPageSwapUpper_Gfx[];\nextern const u16 gNamingScreenPageSwapLower_Gfx[];\nextern const u16 gNamingScreenPageSwapOthers_Gfx[];\nextern const u16 gNamingScreenCursor_Gfx[];\nextern const u16 gNamingScreenCursorSquished_Gfx[];\nextern const u16 gNamingScreenCursorFilled_Gfx[];\nextern const u16 gNamingScreenInputArrow_Gfx[];\nextern const u16 gNamingScreenUnderscore_Gfx[];\n\n// pokemon_storage_system\nextern const u32 gPokeStorageMenu_Gfx[];\nextern const u32 gPokeStoragePartyMenu_Tilemap[];\nextern const u16 gPokeStoragePartyMenu_Pal[];\nextern const u16 gPokeStorageInterface_Pal[];\nextern const u16 gPokeStorageInterface_NoDisplayMon_Pal[];\n\n// pokedex_screen\nextern const u16 gDexScreen_TopMenuIconPals_AtoZ[];\nextern const u32 gDexScreen_TopMenuIconTiles_AtoZ[];\n\n// Cable Car\nextern const u32 gCableCarBg_Gfx[];\nextern const u16 gCableCarBg_Pal[];\nextern const u32 gCableCar_Gfx[];\nextern const u32 gCableCarDoor_Gfx[];\nextern const u32 gCableCarCable_Gfx[];\nextern const u16 gCableCar_Pal[];\n\n#endif //GUARD_GRAPHICS_H\n"
  },
  {
    "path": "include/hall_of_fame.h",
    "content": "#ifndef GUARD_HALL_OF_FAME_H\n#define GUARD_HALL_OF_FAME_H\n\n#include \"global.h\"\n\nvoid CB2_DoHallOfFameScreen(void);\nvoid CB2_DoHallOfFameScreenDontSaveData(void);\nvoid CB2_DoHallOfFamePC(void);\nvoid CB2_InitHofPC(void);\nvoid HallOfFamePCBeginFade(void);\nvoid ReturnFromHallOfFamePC(void);\n\n#endif // GUARD_HALL_OF_FAME_H\n"
  },
  {
    "path": "include/heal_location.h",
    "content": "#ifndef GUARD_HEAL_LOCATION_H\n#define GUARD_HEAL_LOCATION_H\n\n#include \"global.h\"\n\nstruct HealLocation\n{\n    s8 group;\n    s8 map;\n    s16 x;\n    s16 y;\n};\n\nconst struct HealLocation *GetHealLocation(u32 loc);\nvoid SetWhiteoutRespawnWarpAndHealerNpc(struct WarpData * warp);\n\n#endif // GUARD_HEAL_LOCATION_H\n"
  },
  {
    "path": "include/help_message.h",
    "content": "#ifndef GUARD_HELP_MESSAGE_H\n#define GUARD_HELP_MESSAGE_H\n\nextern const u8 gHelpMessageWindow_Gfx[];\n\nvoid DestroyHelpMessageWindow(u8 a0);\nu8 CreateHelpMessageWindow(void);\nvoid PrintTextOnHelpMessageWindow(const u8 * text, u8 mode);\nvoid MapNamePopupWindowIdSetDummy(void);\nvoid DrawHelpMessageWindowTilesById(u8 windowId);\n\n#endif //GUARD_HELP_MESSAGE_H\n"
  },
  {
    "path": "include/help_system.h",
    "content": "#ifndef GUARD_HELP_SYSTEM_H\n#define GUARD_HELP_SYSTEM_H\n\n#include \"global.h\"\n#include \"list_menu.h\"\n#include \"blit.h\"\n#include \"constants/help_system.h\"\n\nstruct HelpSystemListMenu_sub\n{\n    struct ListMenuItem * items;\n    u16 totalItems;\n    u16 maxShowed;\n    u8 left;\n    u8 top;\n};\n\nstruct HelpSystemListMenu\n{\n    struct HelpSystemListMenu_sub sub;\n    u8 itemsAbove;\n    u8 cursorPos;\n    u8 state;\n    u8 filler_10[0xC];\n};\n\nextern struct HelpSystemListMenu gHelpSystemListMenu;\nextern struct ListMenuItem gHelpSystemListMenuItems[];\nextern bool8 gHelpSystemEnabled;\nextern bool8 gHelpSystemToggleWithRButtonDisabled;\n\n// help_system_812B1E0\nvoid SetHelpContextDontCheckBattle(u8);\nvoid SetHelpContextForMap(void);\nvoid SetHelpContext(u8);\nbool8 HelpSystem_UpdateHasntSeenIntro(void);\nbool8 HelpSystem_IsSinglePlayer(void);\nvoid HelpSystem_Disable(void);\nvoid HelpSystem_Enable(void);\nvoid HelpSystem_EnableToggleWithRButton(void);\nbool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);\nbool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);\nbool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);\nbool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);\nbool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);\nbool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);\nbool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);\nbool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);\nvoid HelpSystem_PrintTopicLabel(void);\nbool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);\nbool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);\nbool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);\nbool8 GetHelpSystemMenuLevel(void);\n\n// help_system\nbool8 RunHelpSystemCallback(void);\nvoid SaveCallbacks(void);\nvoid SaveMapGPURegs(void);\nvoid SaveMapTiles(void);\nvoid SaveMapTextColors(void);\nvoid RestoreCallbacks(void);\nvoid RestoreGPURegs(void);\nvoid RestoreMapTiles(void);\nvoid RestoreMapTextColors(void);\nvoid CommitTilemap(void);\nvoid HS_BufferFillMapWithTile1FF(void);\nvoid HS_ShowOrHideWordHELPinTopLeft(u8 mode);\nvoid HS_ShowOrHideControlsGuideInTopRight(u8 mode);\nvoid HS_ShowOrHideMainWindowText(u8 mode);\nvoid HS_SetMainWindowBgBrightness(u8 mode);\nvoid HS_ShowOrHideToplevelTooltipWindow(u8 mode);\nvoid HS_ShowOrHideHeaderAndFooterLines_Lighter(u8 mode);\nvoid HS_ShowOrHideHeaderAndFooterLines_Darker(u8 mode);\nvoid HS_ShowOrHideVerticalBlackBarsAlongSides(u8 mode);\nvoid HS_ShowOrHideHeaderLine_Darker_FooterStyle(u8 mode);\nvoid HS_ShowOrHideScrollArrows(u8 which, u8 mode);\nvoid HelpSystem_PrintTextRightAlign_Row52(const u8 *str);\nvoid HelpSystem_PrintTextAt(const u8 *, u8, u8);\nvoid HelpSystem_PrintQuestionAndAnswerPair(const u8 *a0, const u8 *a1);\nvoid HelpSystem_PrintTopicMouseoverDescription(const u8 *str);\nvoid HelpSystem_FillPanel2(void);\nvoid HelpSystem_FillPanel1(void);\nvoid HelpSystem_InitListMenuController(struct HelpSystemListMenu *, u8, u8);\nvoid HelpSystem_SetInputDelay(u8);\ns32 HelpSystem_GetMenuInput(void);\nvoid HS_UpdateMenuScrollArrows(void);\n\nvoid DecompressAndRenderGlyph(u8 fontId, u16 glyph, struct Bitmap *srcBlit, struct Bitmap *destBlit, u8 *destBuffer, u8 x, u8 y, u8 width, u8 height);\nvoid HelpSystem_PrintTextInTopLeftCorner(const u8 * str);\nvoid HelpSystem_FillPanel3(void);\nvoid PrintListMenuItems(void);\nvoid PlaceListMenuCursor(void);\nbool8 MoveCursor(u8 by, u8 dirn);\nvoid BackupHelpContext(void);\nvoid RestoreHelpContext(void);\nvoid HelpSystemRenderText(u8 fontId, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height);\nvoid HelpSystem_DisableToggleWithRButton(void);\n\n#endif //GUARD_HELP_SYSTEM_H\n"
  },
  {
    "path": "include/image_processing_effects.h",
    "content": "#ifndef GUARD_IMAGE_PROCESSING_EFFECTS_H\n#define GUARD_IMAGE_PROCESSING_EFFECTS_H\n\nenum\n{\n    IMAGE_EFFECT_POINTILLISM = 2,\n    IMAGE_EFFECT_GRAYSCALE_LIGHT = 6,\n    IMAGE_EFFECT_BLUR = 8,\n    IMAGE_EFFECT_OUTLINE_COLORED = 9,\n    IMAGE_EFFECT_INVERT_BLACK_WHITE = 10,\n    IMAGE_EFFECT_THICK_BLACK_WHITE = 11,\n    IMAGE_EFFECT_SHIMMER = 13,\n    IMAGE_EFFECT_OUTLINE = 30,\n    IMAGE_EFFECT_INVERT = 31,\n    IMAGE_EFFECT_BLUR_RIGHT = 32,\n    IMAGE_EFFECT_BLUR_DOWN = 33,\n    IMAGE_EFFECT_CHARCOAL = 36,\n};\n\nenum\n{\n    QUANTIZE_EFFECT_STANDARD,\n    QUANTIZE_EFFECT_STANDARD_LIMITED_COLORS,\n    QUANTIZE_EFFECT_PRIMARY_COLORS,\n    QUANTIZE_EFFECT_GRAYSCALE,\n    QUANTIZE_EFFECT_GRAYSCALE_SMALL,\n    QUANTIZE_EFFECT_BLACK_WHITE,\n};\n\nstruct ImageProcessingContext\n{\n    u8 effect;\n    void *canvasPixels;\n    u16 *canvasPalette;\n    u8 fillerC[0x4];\n    void *dest;\n    u16 quantizeEffect;\n    u16 var_16;\n    u8 paletteStart;\n    u8 columnStart;\n    u8 rowStart;\n    u8 columnEnd;\n    u8 rowEnd;\n    u8 canvasWidth;\n    u8 canvasHeight;\n    u8 personality;\n};\n\nvoid ApplyImageProcessingEffects(struct ImageProcessingContext *);\nvoid ApplyImageProcessingQuantization(struct ImageProcessingContext *);\nvoid ConvertImageProcessingToGBA(struct ImageProcessingContext *);\n\n#endif\n"
  },
  {
    "path": "include/intro.h",
    "content": "#ifndef GUARD_INTRO_H\n#define GUARD_INTRO_H\n\nvoid CB2_InitCopyrightScreenAfterTitleScreen(void);\nvoid CB2_InitCopyrightScreenAfterBootup(void);\n\n#endif //GUARD_INTRO_H\n"
  },
  {
    "path": "include/item.h",
    "content": "#ifndef GUARD_ITEM_H\n#define GUARD_ITEM_H\n\n#include \"global.h\"\n\ntypedef void (*ItemUseFunc)(u8);\n\nstruct Item\n{\n    u8 name[ITEM_NAME_LENGTH];\n    u16 itemId;\n    u16 price;\n    u8 holdEffect;\n    u8 holdEffectParam;\n    const u8 *description;\n    u8 importance;\n    u8 registrability;\n    u8 pocket;\n    u8 type; // unused for balls\n    ItemUseFunc fieldUseFunc;\n    u8 battleUsage;\n    ItemUseFunc battleUseFunc;\n    u8 secondaryId; // only used for fishing rods\n};\n\nstruct BagPocket\n{\n    struct ItemSlot *itemSlots;\n    u8 capacity;\n};\n\n// Item type IDs (used to determine the exit callback)\nenum {\n    ITEM_TYPE_MAIL,\n    ITEM_TYPE_PARTY_MENU,\n    ITEM_TYPE_FIELD,\n    ITEM_TYPE_UNUSED, // Used for Pokeblock case in RSE\n    ITEM_TYPE_BAG_MENU, // No exit callback, stays in bag menu\n};\n\nextern const struct Item gItems[];\nextern struct BagPocket gBagPockets[];\nextern struct ItemSlot gTmHmItemSlots[BAG_TMHM_COUNT];\nextern struct ItemSlot gKeyItemSlots[BAG_KEYITEMS_COUNT];\n\nvoid GetBerryCountString(u8 *dst, const u8 *berryName, u32 quantity);\nu16 GetBagItemQuantity(u16 *quantity);\nvoid CopyItemName(u16 itemId, u8 *string);\nvoid CopyItemNameHandlePlural(u16 itemId, u8 *string, u32 quantity);\nbool8 IsBagPocketNonEmpty(u8 pocket);\nbool8 CheckBagHasItem(u16 itemId, u16 count);\nbool8 CheckBagHasSpace(u16 itemId, u16 count);\nbool8 RemoveBagItem(u16 itemId, u16 count);\nu8 GetPocketByItemId(u16 itemId);\nvoid ClearItemSlots(struct ItemSlot *itemSlots, u8 b);\nu8 CountUsedPCItemSlots(void);\nbool8 CheckPCHasItem(u16 itemId, u16 count);\nbool8 AddPCItem(u16 itemId, u16 count);\nvoid SwapRegisteredBike(void);\nconst u8 *ItemId_GetName(u16 itemId);\nu16 ItemId_GetId(u16 itemId);\nu16 ItemId_GetPrice(u16 itemId);\nu8 ItemId_GetHoldEffect(u16 itemId);\nu8 ItemId_GetHoldEffectParam(u16 itemId);\nconst u8 *ItemId_GetDescription(u16 itemId);\nbool32 ItemId_CopyDescription(u8 *a, u32 itemId, u32 c);\nu8 ItemId_GetImportance(u16 itemId);\nu8 ItemId_GetUnknownValue(u16 itemId);\nu8 ItemId_GetPocket(u16 itemId);\nu8 ItemId_GetType(u16 itemId);\nItemUseFunc ItemId_GetFieldFunc(u16 itemId);\nu8 ItemId_GetBattleUsage(u16 itemId);\nItemUseFunc ItemId_GetBattleFunc(u16 itemId);\nu8 ItemId_GetSecondaryId(u16 itemId);\nu16 ItemId_GetPrice(u16 itemId);\nvoid ClearBag(void);\nvoid ClearPCItemSlots(void);\nvoid TrySetObtainedItemQuestLogEvent(u16 itemId);\nbool8 AddBagItem(u16 itemId, u16 amount);\n\nvoid SortPocketAndPlaceHMsFirst(struct BagPocket * pocket);\nu16 BagGetItemIdByPocketPosition(u8 pocketId, u16 itemId);\nu16 BagGetQuantityByPocketPosition(u8 pocketId, u16 itemId);\nu16 BagGetQuantityByItemId(u16 item);\nu8 ItemId_GetImportance(u16 itemId);\nvoid BagPocketCompaction(struct ItemSlot * slots, u8 capacity);\nu16 GetPcItemQuantity(u16 *);\nvoid SetBagPocketsPointers(void);\n\nvoid ItemPcCompaction(void);\nvoid RemovePCItem(u16 itemId, u16 quantity);\nvoid SortAndCompactBagPocket(struct BagPocket * pocket);\nu8 CountItemsInPC(void);\nvoid ApplyNewEncryptionKeyToBagItems_(u32 newKey);\nbool8 HasAtLeastOneBerry(void);\nvoid DeserializeTmHmItemSlots(void);\nvoid DeserializeKeyItemSlots(void);\nu16 GetBagItemQuantity(u16 * ptr);\nbool8 CheckAssetsForSoftlock(void);\n\n#endif // GUARD_ITEM_H\n"
  },
  {
    "path": "include/item_menu.h",
    "content": "#ifndef GUARD_ITEM_MENU_H\n#define GUARD_ITEM_MENU_H\n\n#include \"global.h\"\n#include \"task.h\"\n#include \"constants/item_menu.h\"\n\n// Exported type declarations\n\n// Exported RAM declarations\n\nstruct BagStruct\n{\n    MainCallback bagCallback;\n    u8 location;\n    bool8 bagOpen;\n    u16 pocket;\n    u16 itemsAbove[5];\n    u16 cursorPos[5];\n};\n\nextern struct BagStruct gBagMenuState;\n\nextern u16 gSpecialVar_ItemId;\n\n// Exported ROM declarations\nvoid CB2_SetUpReshowBattleScreenAfterMenu(void);\nvoid ResetBagCursorPositions(void);\nvoid InitPokedudeBag(u8);\nvoid CB2_BagMenuFromStartMenu(void);\nvoid MoveItemSlotInList(struct ItemSlot * itemSlots_, u32 from, u32 to_);\nvoid ItemMenu_StartFadeToExitCallback(u8 taskId);\nvoid Bag_BeginCloseWin0Animation(void);\nvoid ItemMenu_SetExitCallback(void (*)(void));\nvoid DisplayItemMessageInBag(u8 taskId, u8 fontId, const u8 * string, TaskFunc followUpFunc);\nvoid Task_ReturnToBagFromContextMenu(u8 taskId);\nvoid CB2_BagMenuFromBattle(void);\nvoid InitOldManBag(void);\nvoid Pocket_CalculateNItemsAndMaxShowed(u8 pocketId);\nvoid PocketCalculateInitialCursorPosAndItemsAbove(u8 pocketId);\nvoid GoToBagMenu(u8 menuType, u8 pocket, MainCallback callback);\nbool8 UseRegisteredKeyItemOnField(void);\n\n#endif //GUARD_ITEM_MENU_H\n"
  },
  {
    "path": "include/item_menu_icons.h",
    "content": "#ifndef GUARD_ITEM_MENU_ICONS\n#define GUARD_ITEM_MENU_ICONS\n\n#include \"global.h\"\n\n// Values for 2nd argument to GetItemIconGfxPtr\nenum {\n    ITEMICON_TILES,\n    ITEMICON_PAL,\n};\n\nextern const struct CompressedSpriteSheet gSpriteSheet_BagMale;\nextern const struct CompressedSpriteSheet gSpriteSheet_BagFemale;\nextern const struct CompressedSpritePalette gSpritePalette_Bag;\n\nextern const struct CompressedSpriteSheet gBagSwapSpriteSheet;\nextern const struct CompressedSpritePalette gBagSwapSpritePalette;\n\nvoid ResetItemMenuIconState(void);\nvoid CreateSwapLine(void);\nvoid DestroyItemMenuIcon(bool8 a0);\nvoid CreateItemMenuIcon(u16 itemId, bool8 a0);\nvoid CopyItemIconPicTo4x4Buffer(const void *src, void *dest);\nu8 AddItemIconObject(u16 tilesTag, u16 paletteTag, u16 itemId);\nu8 AddItemIconObjectWithCustomObjectTemplate(const struct SpriteTemplate * origTemplate, u16 tilesTag, u16 paletteTag, u16 itemId);\nvoid CreateBerryPouchItemIcon(u16 itemId, u8 idx);\nvoid UpdateSwapLinePos(s16 x, u16 y);\nvoid SetSwapLineInvisibility(bool8 invisible);\nvoid SetBagVisualPocketId(u8);\nvoid ShakeBagSprite(void);\nconst u32 *GetItemIconGfxPtr(u16 itemId, u8 ptrId);\nvoid CreateBagSprite(u8 animNum);\n\n#endif // GUARD_ITEM_MENU_ICONS\n"
  },
  {
    "path": "include/item_pc.h",
    "content": "#ifndef GUARD_ITEM_PC_H\n#define GUARD_ITEM_PC_H\n\nvoid ItemPc_Init(u8 kind, MainCallback callback);\nvoid ItemPc_SetInitializedFlag(bool8 flag);\n\n#endif //GUARD_ITEM_PC_H\n"
  },
  {
    "path": "include/item_use.h",
    "content": "#ifndef GUARD_ITEM_USE_H\n#define GUARD_ITEM_USE_H\n\n#include \"global.h\"\n\nvoid Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8);\nvoid ItemUse_SetQuestLogEvent(u8, struct Pokemon *, u16, u16);\n\nvoid FieldUseFunc_Mail(u8 taskId);\nvoid FieldUseFunc_Bike(u8 taskId);\nvoid FieldUseFunc_Rod(u8 taskId);\nvoid FieldUseFunc_CoinCase(u8 taskId);\nvoid FieldUseFunc_PowderJar(u8 taskId);\nvoid FieldUseFunc_SootSack(u8 taskId);\nu16 GetAshCount(void);\nvoid FieldUseFunc_PokeFlute(u8 taskId);\nvoid FieldUseFunc_Medicine(u8 taskId);\nvoid FieldUseFunc_Ether(u8 taskId);\nvoid FieldUseFunc_PpUp(u8 taskId);\nvoid FieldUseFunc_RareCandy(u8 taskId);\nvoid FieldUseFunc_EvoItem(u8 taskId);\nvoid FieldUseFunc_SacredAsh(u8 taskId);\nvoid FieldUseFunc_TmCase(u8 taskId);\nvoid FieldUseFunc_BerryPouch(u8 taskId);\nvoid BattleUseFunc_BerryPouch(u8 taskId);\nvoid FieldUseFunc_TeachyTv(u8 taskId);\nvoid FieldUseFunc_Repel(u8 taskId);\nvoid FieldUseFunc_BlackWhiteFlute(u8 taskId);\nvoid FieldUseFunc_TownMap(u8 taskId);\nvoid FieldUseFunc_FameChecker(u8 taskId);\nvoid FieldUseFunc_VsSeeker(u8 taskId);\nvoid BattleUseFunc_PokeBallEtc(u8 taskId);\nvoid BattleUseFunc_PokeFlute(u8 taskId);\nvoid BattleUseFunc_StatBooster(u8 taskId);\nvoid BattleUseFunc_Medicine(u8 taskId);\nvoid BattleUseFunc_Ether(u8 taskId);\nvoid BattleUseFunc_PokeDoll(u8 taskId);\nvoid FieldUseFunc_OakStopsYou(u8 taskId);\nvoid ItemUseOutOfBattle_EscapeRope(u8 taskId);\nvoid ItemUseOutOfBattle_EnigmaBerry(u8 taskId);\nvoid ItemUseInBattle_EnigmaBerry(u8 taskId);\nvoid ItemUseOutOfBattle_Itemfinder(u8 taskId);\nvoid Task_UseDigEscapeRopeOnField(u8 taskId);\nu8 CanUseEscapeRopeOnCurrMap(void);\nu8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId);\nvoid ItemUseOutOfBattle_ReduceEV(u8 taskId);\n\n#endif //GUARD_ITEM_USE_H\n"
  },
  {
    "path": "include/itemfinder.h",
    "content": "#ifndef GUARD_ITEMFINDER_H\n#define GUARD_ITEMFINDER_H\n\nvoid ItemUseOnFieldCB_Itemfinder(u8 taskId);\n\n#endif //GUARD_ITEMFINDER_H\n"
  },
  {
    "path": "include/keyboard_text.h",
    "content": "#ifndef GUARD_KEYBOARD_TEXT_H\n#define GUARD_KEYBOARD_TEXT_H\n\nextern const u8 gText_UnionRoomChatKeyboard_ABCDE[];\nextern const u8 gText_UnionRoomChatKeyboard_FGHIJ[];\nextern const u8 gText_UnionRoomChatKeyboard_KLMNO[];\nextern const u8 gText_UnionRoomChatKeyboard_PQRST[];\nextern const u8 gText_UnionRoomChatKeyboard_UVWXY[];\nextern const u8 gText_UnionRoomChatKeyboard_Z[];\nextern const u8 gText_UnionRoomChatKeyboard_01234Upper[];\nextern const u8 gText_UnionRoomChatKeyboard_56789Upper[];\nextern const u8 gText_UnionRoomChatKeyboard_PunctuationUpper[];\nextern const u8 gText_UnionRoomChatKeyboard_SymbolsUpper[];\nextern const u8 gText_UnionRoomChatKeyboard_abcde[];\nextern const u8 gText_UnionRoomChatKeyboard_fghij[];\nextern const u8 gText_UnionRoomChatKeyboard_klmno[];\nextern const u8 gText_UnionRoomChatKeyboard_pqrst[];\nextern const u8 gText_UnionRoomChatKeyboard_uvwxy[];\nextern const u8 gText_UnionRoomChatKeyboard_z[];\nextern const u8 gText_UnionRoomChatKeyboard_01234Lower[];\nextern const u8 gText_UnionRoomChatKeyboard_56789Lower[];\nextern const u8 gText_UnionRoomChatKeyboard_PunctuationLower[];\nextern const u8 gText_UnionRoomChatKeyboard_SymbolsLower[];\nextern const u8 gText_UnionRoomChatKeyboard_Emoji1[];\nextern const u8 gText_UnionRoomChatKeyboard_Emoji2[];\nextern const u8 gText_UnionRoomChatKeyboard_Emoji3[];\nextern const u8 gText_UnionRoomChatKeyboard_Emoji4[];\nextern const u8 gText_UnionRoomChatKeyboard_Emoji5[];\nextern const u8 gText_UnionRoomChatKeyboard_Emoji6[];\nextern const u8 gText_UnionRoomChatKeyboard_Emoji7[];\nextern const u8 gText_UnionRoomChatKeyboard_Emoji8[];\nextern const u8 gText_UnionRoomChatKeyboard_Emoji9[];\nextern const u8 gText_UnionRoomChatKeyboard_Emoji10[];\n\nextern const u8 gText_EasyChatKeyboard_ABCDEFothers[];\nextern const u8 gText_EasyChatKeyboard_GHIJKL[];\nextern const u8 gText_EasyChatKeyboard_MNOPQRS[];\nextern const u8 gText_EasyChatKeyboard_TUVWXYZ[];\n\nextern const u8 gText_NamingScreenKeyboard_abcdef[];\nextern const u8 gText_NamingScreenKeyboard_ghijkl[];\nextern const u8 gText_NamingScreenKeyboard_mnopqrs[];\nextern const u8 gText_NamingScreenKeyboard_tuvwxyz[];\nextern const u8 gText_NamingScreenKeyboard_ABCDEF[];\nextern const u8 gText_NamingScreenKeyboard_GHIJKL[];\nextern const u8 gText_NamingScreenKeyboard_MNOPQRS[];\nextern const u8 gText_NamingScreenKeyboard_TUVWXYZ[];\nextern const u8 gText_NamingScreenKeyboard_01234[];\nextern const u8 gText_NamingScreenKeyboard_56789[];\nextern const u8 gText_NamingScreenKeyboard_Symbols1[];\nextern const u8 gText_NamingScreenKeyboard_Symbols2[];\n\n#endif //GUARD_KEYBOARD_TEXT_H\n"
  },
  {
    "path": "include/libgcnmultiboot.h",
    "content": "#ifndef GUARD_LIBGCNMULTIBOOT_H\n#define GUARD_LIBGCNMULTIBOOT_H\n\nstruct GcmbStruct\n{\n    u16 gcmb_field_0;\n    vu8 gcmb_field_2;\n    u8 filler3[0x2C - 0x3];\n};\n\nvoid GameCubeMultiBoot_Main(struct GcmbStruct *pStruct);\nvoid GameCubeMultiBoot_ExecuteProgram(struct GcmbStruct *pStruct);\nvoid GameCubeMultiBoot_Init(struct GcmbStruct *pStruct);\nvoid GameCubeMultiBoot_HandleSerialInterrupt(struct GcmbStruct *pStruct);\nvoid GameCubeMultiBoot_Quit(void);\n\n#endif // GUARD_LIBGCNMULTIBOOT_H\n"
  },
  {
    "path": "include/librfu.h",
    "content": "#ifndef GUARD_LIBRFU_H\n#define GUARD_LIBRFU_H\n\n#include \"global.h\"\n#include \"main.h\"\n\n#define LIBRFU_VERSION 1024\n\n/* TODOs:\n * - documentation\n * - check if any field needs to be volatile\n * - check if field names make sense\n */\n\n// --------------------------------------------------------------------------\n//\n// Restrictions When Using RFU\n//\n// --------------------------------------------------------------------------\n/*\n  The following restrictions apply when using RFU.\n\n  <Restrictions for Direct Sound>\n    (a) The timer for Sound DMA uses only 0\n    (b) The prescaler for the timer count for the Sound DMA uses 59.5 ns.\n    (c) The sound sampling rate is Max36.314KHz.\n\n  <Restrictions for H-DMA or DMA started with V-Blank>\n    These types of DMA can be operated on a maximum CPU cycle of 42 cycles.\n    Calculate the number of the transferable DMA count based on this 42 cycles and the access cycles of the destination and source.\n    For example, if both the CPU internal RAM --> VRAM have a one cycle access, then a 21 count DMA can occur.\n\n  \n  If RFU is used outside of these restrictions, problems, such as the loss of data caused by the failure of the AGB, as a clock slave, \n  to notify that data has been received from the RFU, will occur.\n  When this problem occurs, the REQ callback will send a REQ_commandID=ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ notification.\n   (When using Link Manager, the LMAN call back will send a LMAN_msg=LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA notification.)\n  \n*/\n\n// REQ-COMMAND (STWI) ID CODE LIST\n\n// REQ Command ID returned by the REQ callback\n#define ID_RESET_REQ                                0x0010\n#define ID_LINK_STATUS_REQ                          0x0011\n#define ID_VERSION_STATUS_REQ                       0x0012    // not defined in SDK header\n#define ID_SYSTEM_STATUS_REQ                        0x0013\n#define ID_SLOT_STATUS_REQ                          0x0014    // not defined in SDK header\n#define ID_CONFIG_STATUS_REQ                        0x0015    // not defined in SDK header\n#define ID_GAME_CONFIG_REQ                          0x0016\n#define ID_SYSTEM_CONFIG_REQ                        0x0017\n#define ID_SC_START_REQ                             0x0019\n#define ID_SC_POLL_REQ                              0x001a\n#define ID_SC_END_REQ                               0x001b\n#define ID_SP_START_REQ                             0x001c\n#define ID_SP_POLL_REQ                              0x001d\n#define ID_SP_END_REQ                               0x001e\n#define ID_CP_START_REQ                             0x001f\n#define ID_CP_POLL_REQ                              0x0020\n#define ID_CP_END_REQ                               0x0021\n#define ID_DATA_TX_REQ                              0x0024\n#define ID_DATA_TX_AND_CHANGE_REQ                   0x0025\n#define ID_DATA_RX_REQ                              0x0026\n#define ID_MS_CHANGE_REQ                            0x0027    // When returned by the REQ callback, this ID indicates that execution of rfu_REQ_changeMasterSlave has finished.\n                                                              // This ID is returned by both the REQ callback and the MSC callback.\n                                                              // When returned by the MSC callback, this is notification that after the AGB has been made into the clock slave, the MC_Timer expired and the RFU returned the AGB to be the clock master.\n#define ID_DISCONNECT_REQ                           0x0030\n#define ID_TEST_MODE_REQ                            0x0031    // not defined in SDK header\n#define ID_CPR_START_REQ                            0x0032\n#define ID_CPR_POLL_REQ                             0x0033\n#define ID_CPR_END_REQ                              0x0034\n#define ID_UNK35_REQ                                0x0035    // not defined in SDK header\n#define ID_UNK36_REQ                                0x0036    // not defined in SDK header\n#define ID_RESUME_RETRANSMIT_AND_CHANGE_REQ         0x0037\n#define ID_STOP_MODE_REQ                            0x003d\n#define ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ   0x00ff    // When the AGB is the clock slave, the RFU generates an informational notice, and an automatically started DMA, such as HDMA, is generated at the instant the AGB is being returned as the clock master. This ID is notified by a REQ callback when the exchange of this information (REQ command) fails.\n\n// REQ Command ID returned by the MSC callback\n#define ID_DISCONNECTED_AND_CHANGE_REQ              0x0029\n#define ID_DATA_READY_AND_CHANGE_REQ                0x0028\n#define ID_DRAC_REQ_WITH_ACK_FLAG                   0x0128\n\n// --------------------------------------------------------------------------\n//\n// Data Definitions\n//\n// --------------------------------------------------------------------------\n\n#define RFU_ID                          0x00008001         // ID number of AGB-RFU device: ID returned by execution of rfu_REQBN_softReset_and_checkID.\n\n#define RFU_MBOOT_DOWNLOADER_SERIAL_NO  0x0000             // The game serial number of the multi-boot downloader (programs that boot without a Game Pak)\n\n#define RFU_API_BUFF_SIZE_RAM           0x0e64             // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in RAM)\n#define RFU_API_BUFF_SIZE_ROM           0x0504             // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in ROM)\n\n#define RFU_CHILD_MAX                   4                  // Maximum number of slaves that can be connected to one parent device\n\n#define RFU_GAME_NAME_LENGTH            13                 // Possible length of game name set by rfu_REQB_configGameData\n#define RFU_USER_NAME_LENGTH            8                  // Possible length of user name set by rfu_REQB_configGameData\n\n#define RFU_H_DMA_MAX_CPU_CYCLE         42                 // Maximum number of CPU cycles for H-DMA or DMA that starts with V-Blank that can operate when using RFU\n\n// Value to determine the level of the icon that displays the link strength of the wireless status (value of rfuLinkStatus->strength[0-3])\n#define RFU_LINK_ICON_LEVEL4_MAX        255                // 90% -100%  (If the value is betwen 229 and 255, the icon level is 4)\n#define RFU_LINK_ICON_LEVEL4_MIN        229\n#define RFU_LINK_ICON_LEVEL3_MAX        228                // 50% - 89%  (If the value is betwen 127 and 228, the icon level is 3)\n#define RFU_LINK_ICON_LEVEL3_MIN        127\n#define RFU_LINK_ICON_LEVEL2_MAX        126                // 10% - 49%  (If the value is betwen 25 and 126, the icon level is 2)\n#define RFU_LINK_ICON_LEVEL2_MIN         25\n#define RFU_LINK_ICON_LEVEL1_MAX         24                //  0% -  9%  (If the value is betwen 0 and 24, the icon level is 1)\n#define RFU_LINK_ICON_LEVEL1_MIN          0\n\n\n// *******************************************************\n// Definition Data for Arguments Used in Library Functions\n// *******************************************************\n// Specified by u16 mbootFlag in rfu_REQ_configGameData\n#define RFU_MBOOT_FLAG                  0x01               // Enabling this flag, allows connection to a multi-boot program.\n\n// AvailSlot (number of slots available for connection) used in u16 availSlotFlag in rfu_REQ_configSystem\n#define AVAIL_SLOT4                     0x0000\n#define AVAIL_SLOT3                     0x0001\n#define AVAIL_SLOT2                     0x0002\n#define AVAIL_SLOT1                     0x0003\n\n// u8 connTypeFlag specified by rfu_setRecvBuffer\n#define TYPE_UNI                        0x10               // UNI-type\n#define TYPE_NI                         0x20               // NI-type\n\n// u8 connTypeFlag specified by rfu_clearSlot\n#define TYPE_UNI_SEND                   0x01               // UNI-type send\n#define TYPE_UNI_RECV                   0x02               // UNI-type receive\n#define TYPE_NI_SEND                    0x04               // NI-type send\n#define TYPE_NI_RECV                    0x08               // NI-type receive\n\n// *******************************************************\n// Definition Data Returned by Return Values for Library Functions\n// *******************************************************\n\n// The function doesn't have return value. \n// Value of u8 *status for rfu_REQ_pollConnectParent (Connection Trial Status)\n// #define CP_STATUS_DONE                  0x00               // Connection successful\n// #define CP_STATUS_IN_PROCESS            0x01               // Connecting\n// #define CP_STATUS_SLOT_CLOSED           0x02               // Parent device is not in connection mode with child device\n// #define CP_STATUS_DISCONNECTED          0x03               // Disconnected by parent device while connecting\n// #define CP_STATUS_UNKNOWN               0xff               // Cannot read status due to REQ-API execution error\n\n// The function doesn't exist. \n// Value of u8 *status argument for rfu_REQ_pollRecoveryConnect (Link Restore Status)\n// #define RC_STATUS_DONE                  0x00               // Connection restore successful\n// #define RC_STATUS_FAILED                0x01               // Connection restore failure (meaningless to try anymore)\n// #define RC_STATUS_SEARCHING_PARENT      0x02               // Searching for parent device\n// #define RC_STATUS_UNKNOWN               0xff               // Cannot read status due to REQ-API execution error\n\n// Value of u8 *linkLossReason argument for rfu_REQBN_watchLink (Reason for Link Loss)\n#define REASON_DISCONNECTED             0x00               // State of complete disconnection with rfuLL_disconnect and no possibility of restoring the link (can detect only child device)\n#define REASON_LINK_LOSS                0x01               // State of link loss that allows for the possibility for the link to be restored\n\n\n// *******************************************************\n// Definition Data Returned with Return Values for Library Functions\n// *******************************************************\n\n// Value returned by rfu_getMasterSlave\n#define AGB_CLK_SLAVE                   0                  // AGB clock slave\n#define AGB_CLK_MASTER                  1                  // AGB clock master\n\n// *******************************************************\n// Error Code Group for Library Functions\n// *******************************************************\n\n// Error codes returned by u16 REQ_result with a REQ callback when a REQ-API function is executed\n#define ERR_REQ_CMD                     0x0000\n#define ERR_REQ_CMD_CLOCK_DRIFT        (ERR_REQ_CMD | 0x0001) // Clock drift occurs when a REQ command is sent\n#define ERR_REQ_CMD_SENDING            (ERR_REQ_CMD | 0x0002) // The next command cannot be issued because a REQ command is being sent\n#define ERR_REQ_CMD_ACK_REJECTION      (ERR_REQ_CMD | 0x0003) // The REQ command was refused when issued\n#define ERR_REQ_CMD_CLOCK_SLAVE        (ERR_REQ_CMD | 0x0004) // Issuing the REQ command was attempted but failed because the AGB is the clock slave\n#define ERR_REQ_CMD_IME_DISABLE        (ERR_REQ_CMD | 0x0006) // Issuing the REQ command was attempted but failed because the IME register is 0\n\n#define ERR_PID_NOT_FOUND               0x0100                // The specified PID does not exist in the gRfuLinkStatus->partner[0-3].id list\n\n// Error code returned by the return value of rfu_initializeAPI\n#define ERR_RFU_API_BUFF_SIZE           0x0001\n#define ERR_RFU_API_BUFF_ADR            0x0002\n\n// Error codes returned by return values for rfu_REQBN_softReset_and_checkID\n#define ERR_ID_CHECK_IME_DISABLE        0xffffffff            // ID check could not be executed because REG_IME=0 when executing rfu_REQBN_softReset_and_checkID\n\n// Error codes returned by rfu_getConnectParentStatus and rfu_CHILD_getConnectRecoveryStatus\n#define ERR_REQ_CMD_ID                 (ERR_REQ_CMD | 0x0010) // A required REQ command was not executed within this function execution\n\n// Error codes returned by rfu_NI_setSendData, rfu_UNI_setSendData, and rfu_NI_CHILD_setSendGameName\n#define ERR_MODE                        0x0300\n#define ERR_MODE_NOT_PARENT            (ERR_MODE | 0x0000)    // not in SDK\n#define ERR_MODE_NOT_CONNECTED         (ERR_MODE | 0x0001)    // RFU is not in connection mode (parent or child)\n\n#define ERR_SLOT                        0x0400\n#define ERR_SLOT_NO                    (ERR_SLOT | 0x0000)    // The specified slot number is not right\n#define ERR_SLOT_NOT_CONNECTED         (ERR_SLOT | 0x0001)    // The specified slot is not connected\n#define ERR_SLOT_BUSY                  (ERR_SLOT | 0x0002)    // The specified slot is already communicating\n#define ERR_SLOT_NOT_SENDING           (ERR_SLOT | 0x0003)    // The specified slot is not currently sending (Note: This is returned by rfu_UNI_re_setSendData)\n#define ERR_SLOT_TARGET                (ERR_SLOT | 0x0004)    // The specified target slot is not right\n\n#define ERR_SUBFRAME_SIZE               0x0500                // The specified subframe size is either larger than the remaining communication frame size or smaller than the link layer subframe header size\n\n// Error code returned by rfu_clearSlot, rfu_setRecvBuffer, and rfu_changeSendTarget\n#define ERR_COMM_TYPE                   0x0600                // The specified communication format is not right\n\n// Error code returned by rfu_REQ_recvData (when receiving NI-type or UNI-type data)\n#define ERR_DATA_RECV                   0x0700                // Error notification is issued in the following format.\n                                                              // \"ERR_DATA_RECV | (slot number issuing error with 0x0010<<UNI) | (slot number issuing error with 0x0001<<NI)\"\n                                                              // The actual error code is stored in gRfuSlotStatusNI or gRfuSlotStatusUNI[x]->recv.errorCode.\n\n// Error code during NI-type communication (code entered into gRfuSlotStatusNI[x]->recv.errorCode)\n#define ERR_RECV_BUFF_OVER              (ERR_DATA_RECV | 0x0001)  // The receive data size is larger than the receive buffer (Note: This error is used for both NI and UNI)\n#define ERR_RECV_REPLY_SUBFRAME_SIZE    (ERR_DATA_RECV | 0x0002)  // All frames are already in use by other communications, and a subframe for reception response could not be secured\n\n// Error code during UNI-type communication (code entered into gRfuSlotStatusUNI[x]->recv.errorCode)\n#define ERR_RECV_DATA_OVERWRITED        (ERR_DATA_RECV | 0x0008)  // Received new data when gRfuSlotStatusUNI[x]->recv.newDataFlag=1\n\n// not in SDK header\n#define ERR_RECV_UNK                    (ERR_DATA_RECV | 0x0001 | 0x0008)\n\n// *******************************************************\n// Definition Data Used by Global Variables in the Library\n// *******************************************************\n\n// gRfuLinkStatus-------------------------------------------\n// Connection status (refer to gRfuLinkStatus->parentChild)\n#define MODE_NEUTRAL                    0xff               // Initialization\n#define MODE_CHILD                      0x00               // Child\n#define MODE_PARENT                     0x01               // Parent\n\n\n// gRfuSlotStatusNI,UNI-----------------------------------\n// Definition data for NI-(Numbered Information) and UNI-(Un-Numbered Information) type communication\n\n// Definition data common to NI- and UNI-type communication\n#define LLF_P_SIZE                      87                 // Maximum link layer communication frame size for the Parent (Maximum number of bytes per transmission)\n#define LLF_C_SIZE                      16                 //      \"                                \"     for the Child\n#define LLSF_P_HEADER_SIZE              3                  // Header size used by one link layer subframe (NI or UNI frame) for the Parent\n#define LLSF_C_HEADER_SIZE              2                  //      \"                                \"                       for the Child\n\n// Link Layer Communication Code\n#define LCOM_NULL                       0x0000\n#define LCOM_NI_START                   0x0001\n#define LCOM_NI                         0x0002\n#define LCOM_NI_END                     0x0003\n#define LCOM_UNI                        0x0004\n\n// Flag for Slot Status Data\n#define SLOT_BUSY_FLAG                  0x8000             // Slot in use\n#define SLOT_SEND_FLAG                  0x0020             // Send\n#define SLOT_RECV_FLAG                  0x0040             // Receive\n\n// NI- and UNI-type shared slot stand-by data (same state as gRfuSlotStatusNI[x]->send or ->recv.state or gRfuSlotStatusUNI)\n#define SLOT_STATE_READY                0x0000             // Slot initialization\n\n// Status data for NI-type communication (gRfuSlotStatusNI[x]->send or ->recv.state)\n#define SLOT_STATE_SEND_START           (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NI_START)   // Start transmission\n#define SLOT_STATE_SENDING              (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NI)         // Transmitting\n#define SLOT_STATE_SEND_LAST            (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NI_END)     // Verify transmission end\n#define SLOT_STATE_SEND_NULL            (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NULL)       // Send NULL subframe to notify end of transmission\n#define SLOT_STATE_SEND_SUCCESS         (                 SLOT_SEND_FLAG | 0x006)           // Transmission successful\n#define SLOT_STATE_SEND_FAILED          (                 SLOT_SEND_FLAG | 0x007)           // Transmission failed\n                                                                                            // Distinction of slot where transmission succeeded/failed compares gRfuSlotStatusNI[x]->send.bmSlot and same bmSlot_org\n#define SLOT_STATE_RECV_START           (SLOT_BUSY_FLAG | SLOT_RECV_FLAG | LCOM_NI_START)   // Start reception\n#define SLOT_STATE_RECEIVING            (SLOT_BUSY_FLAG | SLOT_RECV_FLAG | LCOM_NI)         // Receiving\n#define SLOT_STATE_RECV_LAST            (SLOT_BUSY_FLAG | SLOT_RECV_FLAG | LCOM_NI_END)     // Verify reception end\n#define SLOT_STATE_RECV_SUCCESS         (                 SLOT_RECV_FLAG | 0x006)           // Reception successful\n#define SLOT_STATE_RECV_FAILED          (                 SLOT_RECV_FLAG | 0x007)           // Reception failed\n#define SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN     (SLOT_RECV_FLAG | 0x008)           // The data was received successful, but because the end of the communication was incomplete, whether the transmission side status is successful or failed is unknown\n#define SLOT_STATE_RECV_IGNORE          (                 SLOT_RECV_FLAG | 0x009)           // Ignore reception (refer to gRfuSlotStatusNI[x]->recv.errorCode for reason for ignoring)\n\n// Status data for UNI-type communication (refer to gRfuSlotStatusUNI[x]->send.state)\n#define SLOT_STATE_SEND_UNI             (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_UNI)        // Transmitting\n\n// the following structs are not documented in SDK\nstruct RfuPacket8\n{\n    u8 data[0x74];\n};\n\nstruct RfuPacket32\n{\n    u32 command;\n    u32 data[0x1C];\n};\n\nunion RfuPacket\n{\n    struct RfuPacket32 rfuPacket32;\n    struct RfuPacket8 rfuPacket8;\n};\n\nstruct STWIStatus\n{\n    vs32 state;\n    u8 reqLength;\n    u8 reqNext;\n    u8 reqActiveCommand;\n    u8 ackLength;\n    u8 ackNext;\n    u8 ackActiveCommand;\n    u8 timerSelect;\n    u8 unk_b;\n#if LIBRFU_VERSION >= 1026\n    s32 timerState;\n#else\n    u32 timerState;\n#endif\n    vu8 timerActive;\n    u8 unk_11;\n    vu16 error;\n    vu8 msMode;\n    u8 recoveryCount;\n    u8 unk_16;\n    u8 unk_17;\n    void (*callbackM)();\n    void (*callbackS)(u16);\n    void (*callbackID)(void);\n    union RfuPacket *txPacket;\n    union RfuPacket *rxPacket;\n    vu8 sending;\n};\n\n// This struct is used as u8 array in SDK.\nstruct RfuIntrStruct\n{\n    union RfuPacket rxPacketAlloc;\n    union RfuPacket txPacketAlloc;\n    u8 block1[0x960]; // size of librfu_intr.s binary\n    struct STWIStatus block2;\n};\n\n// Data Structure for Transmitting UNI-Type Data\nstruct UNISend\n{\n    u16 state;         // Slot communication state (SLOT_STATE_READY, SLOT_STATE_SEND_UNI)\n    u8 dataReadyFlag;  // Flag indicating transmission data is prepared (0: data sent; 1: transmission data ready)\n                       //   Set with rfu_UNI_re_setSendData or rfu_UNI_readySendData, cleared when data is sent with rfu_REQ_sendData.\n    u8 bmSlot;         // Expresses transmission destination slot as bits\n    u16 payloadSize;   // Payload size of 1 transmission. \"size\" specified by rfu_UNI_setSendData or rfu_UNI_re_setSendData is used.\n    const void *src;   // Beginning address of transmission data\n};\n\n// Data Structure for Receiving UNI Data\nstruct UNIRecv\n{\n    u16 state;         // Slot communication state (SLOT_STATE_READY, SLOT_STATE_RECEIVING, SLOT_STATE_RECV_IGNORE)\n    u16 errorCode;     // Error code during reception\n    u16 dataSize;      // Size of receive data\n    u8 newDataFlag;    // Flag indicating whether receive data has newly arrived (0: no newly arrived data; 1: newly arrived data)\n                       //   The flag is cleared with rfu_UNI_clearRecvNewDataFlag; it is set when data is received with rfu_REQ_recvData.\n    u8 dataBlockFlag;  // Flag for unreferenced receive data overwrite block (default is 0 Note: not used)\n};\n\n// Slot Status Data Structure for UNI-Type Communication\nstruct RfuSlotStatusUNI\n{\n    struct UNISend send;    // Transmission Status\n    struct UNIRecv recv;    // Reception Status\n    void *recvBuffer;       // Reception Buffer Address\n    u32 recvBufferSize;     // Reception Buffer Size\n};\n\n#define WINDOW_COUNT    4\n\nstruct NIComm\n{\n    u16 state;                     // Communication state of slot\n    u16 failCounter;               // Count of failed transmissions/receptions (Count is increased when transmission/reception of data does not succeed within 1PF=16.7 ms)\n    const u8 *now_p[WINDOW_COUNT]; // Address of current send/receive (The data is divided into WINDOW_COUNT blocks and sent in payloadSize units.)\n    u32 remainSize;                // Size of remaining communication data\n    u16 errorCode;                 // Error code\n    u8 bmSlot;                     // Expresses the current communication slot in bits\n                                   //   (When sending from the Master, because multiple slaves can be specified with bmSlot, communications are terminated based on the failCounter for each child device)\n    // Parameters used inside the Library\n    u8 recvAckFlag[WINDOW_COUNT];\n    u8 ack;\n    u8 phase;\n    u8 n[WINDOW_COUNT];\n    // Parameters indicating the current communication content\n    const void *src;               // Start address transmission data (valid only for transmitting device)\n    u8 bmSlotOrg;                  // Expresses the communication source slot at the beginning of the transmission in bits (valid only for transmitting device)\n    u8 dataType;                   // Transmission/reception data type (0: User data; 1: Game identification information)\n    u16 payloadSize;               // Payload size for one transmission\n    u32 dataSize;                  // Size of transmission/reception data\n                                   //   Calculated by subtracting link layer header size from subFrameSize specified by the rfu_NI_setSendData function\n};\n\nstruct RfuSlotStatusNI\n{\n    struct NIComm send;              // Transmission Status\n    struct NIComm recv;              // Reception Status\n    void *recvBuffer;                // Reception Buffer Address\n    u32 recvBufferSize;              // Reception Buffer Size\n};\n\n// Game Identification Information Data Structure\nstruct RfuTgtData\n{\n    u16 id;                                    // ID of parent candidate                                 ID of connection partner\n    u8  slot;                                  // Slot number where parent candidate can enter           Connection slot number\n    u8  mbootFlag;                             // Flag to indicate whether or not the parent candidate   Flag to indicate whether or not the connection partner\n                                               //   is multiboot program for download                      is multiboot program for download\n    u16 serialNo;                              // Game serial number of parent candidate                 Game serial number of connection partner\n    u8  gname[RFU_GAME_NAME_LENGTH + 2];       // Game name of parent candidate                          Game name of connection partner\n    u8  uname[RFU_USER_NAME_LENGTH + 1];       // User name for parent candidate                         User name for connection partner\n};\n\nstruct RfuLinkStatus\n{\n    u8  parentChild;                            // Connection status (0x01:MODE_PARENT  0x00:MODE_CHILD  0xff:MODE_NEUTRAL)\n    u8  connCount;                              // Number of connections\n    u8  connSlotFlag;                           // Flag to indicate in bits the connection slot (0x01<<Connection slot number)\n    u8  linkLossSlotFlag;                       // Flag to indicate in bits the slot where the link loss was generated (\")\n    u8  sendSlotNIFlag;                         // Flag to indicate in bits the slot where NI-type send is occurring (\")\n    u8  recvSlotNIFlag;                         // Flag to indicate in bits the slot where NI-type receive is occurring (\")\n    u8  sendSlotUNIFlag;                        // Flag to indicate in bits the slot where UNI-type send is occurring (\")\n    u8  getNameFlag;                            // Parent: Flag to indicate whether or not game identification information was obtained from the child connected to this slot (\")\n                                                // Child: Flag to indicate whether or not game identification information was sent to the parent connected to this slot (\")\n    u8  findParentCount;                        // Number of parent candidates discovered with rfu_REQ_xxxSearchParent, valid only with a child device\n    u8  watchInterval;                          // Link monitor execution interval (16.7 ms unit AGB picture frame)\n    u8  strength[RFU_CHILD_MAX];                // Link strength value (0x00 - 0xff; 0x00 is link loss. Updates with rfu_REQBN_watchLink)\n    vu8 LLFReadyFlag;                           // Indicates whether the link layer frame to send next has be constructed (Flag is on when calling rfu_constructLLFrame, flag is cleared when sending by rfu_REQ_sendData.)\n    u8  remainLLFrameSizeParent;                // Remaining size of the link layer communication frame for the parent device\n    u8  remainLLFrameSizeChild[RFU_CHILD_MAX];  // Remaining size of the link layer communication frame for each slot for child device\n    struct RfuTgtData partner[RFU_CHILD_MAX];   // Parent, Child: When there is a connection, the matrix element corresponding to the number of the connected slot\n                                                //   stores the game identification information for the connection partner.\n                                                // Child: Stores the game identification information for the parent candidate discovered when executing rfu_REQ_xxxxSearchParent.\n    struct RfuTgtData my;                       // The device's own game identification information (unrelated to the element slot value)\n};\n\n// the following structs are not documented in SDK\nstruct RfuFixed\n{\n    void (*reqCallback)(u16, u16);\n    void (*fastCopyPtr)(const u8 **, u8 **, s32);\n    u16 fastCopyBuffer[24];\n    u32 fastCopyBuffer2[12];\n    u32 LLFBuffer[29];\n    struct RfuIntrStruct *STWIBuffer;\n};\n\nstruct RfuStatic\n{\n    u8 flags;\n    u8 NIEndRecvFlag;\n    u8 recvRenewalFlag;\n    u8 commExistFlag;\n    u8 recvErrorFlag;\n    u8 recoveryBmSlot;\n    u8 nowWatchInterval;\n    u8 nullFrameCount;\n    u8 emberCount;\n    u8 SCStartFlag;\n    u8 linkEmergencyFlag[RFU_CHILD_MAX];\n    u8 lsFixedCount[RFU_CHILD_MAX];\n    u16 cidBak[RFU_CHILD_MAX];\n    u16 linkEmergencyLimit;\n    u16 reqResult;\n    u16 tryPid;\n    u16 watchdogTimer;\n    u32 totalPacketSize;\n};\n\nextern struct STWIStatus *gSTWIStatus;\nextern struct RfuLinkStatus *gRfuLinkStatus;\nextern struct RfuStatic *gRfuStatic;\nextern struct RfuFixed *gRfuFixed;\nextern struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX];\nextern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX];\n\n// librfu_sio32id\ns32 AgbRFU_checkID(u8 maxTries);\n\n// Arguments with \"bm...\" specify slots of the form (0x01 << slot number) that are the object of a function operation. \n\n// librfu_rfu\n// API Initialization and Initial Settings\n    // API Initialization\nu16 rfu_initializeAPI(u32 *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam);\n    // Set Timer Interrupt\nvoid rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p);\n    // Resident Function called from within a V-Blank Interrupt\nu16 rfu_syncVBlank(void);\n    // Specify REQ Callback function\nvoid rfu_setREQCallback(void (*callback)(u16 reqCommandId, u16 reqResult));\n    // REQ-API Execution Completion Wait\nu16 rfu_waitREQComplete(void);\n\n// RFU Initialization and Initial Settings\n    // RFU Startup and ID Check (Forced RFU reset occurs simultaneously)\nu32 rfu_REQBN_softReset_and_checkID(void);\n    // RFU Reset\nvoid rfu_REQ_reset(void);\n    // Set RFU to Stop Mode (Power Down)\nvoid rfu_REQ_stopMode(void);\n    // RFU Hardware Settings\nvoid rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer);\n    // Game Identification Information Configuration\nvoid rfu_REQ_configGameData(u8 mbootFlag, u16 serialNo, const u8 *gname, const u8 *uname);\n\n// RFU Connection Process\n    // Operate as parent device; search for and connect to child device\nvoid rfu_REQ_startSearchChild(void);\nvoid rfu_REQ_pollSearchChild(void);\nvoid rfu_REQ_endSearchChild(void);\n    // Operate as child device; search for parent device\nvoid rfu_REQ_startSearchParent(void);\nvoid rfu_REQ_pollSearchParent(void);\nvoid rfu_REQ_endSearchParent(void);\n    // Operate as child device; connect to specified parent device\nvoid rfu_REQ_startConnectParent(u16 pid);\nvoid rfu_REQ_pollConnectParent(void);\nvoid rfu_REQ_endConnectParent(void);\nu16 rfu_getConnectParentStatus(u8 *status,u8 *connectSlotNo);\n    // Restore link from child device\nvoid rfu_REQ_CHILD_startConnectRecovery(u8 bmRecoverySlot);\nvoid rfu_REQ_CHILD_pollConnectRecovery(void);\nvoid rfu_REQ_CHILD_endConnectRecovery(void);\nu16 rfu_CHILD_getConnectRecoveryStatus(u8 *status);\n\n// RFU Link Management\n    // Link Monitoring\nu16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason, u8 *parentBmLinkRecoverySlot);\n    // Link Disconnect\nvoid rfu_REQ_disconnect(u8 bmDisconnectSlot);\n\n// Relation of clock between AGB and RFU\n    // Switch to AGB clock slave\nvoid rfu_REQ_changeMasterSlave(void);\n    // Acquire either the master or slave clock from the current AGB-RFU\nbool8 rfu_getMasterSlave(void);\n\n// Communication Configuration\n    // MSC Callback Configuration\nvoid rfu_setMSCCallback(void (*callback)(u16 reqCommandId));\n    // Shared by NI- and UNI-type communications\n        // Clear Communication Status\nvoid rfu_clearAllSlot(void);\nu16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex);\n        // Set Receive Buffer\nu16 rfu_setRecvBuffer(u8 connType, u8 slotNo, void *buffer, u32 buffSize);\n\n// Receive/Send Data\n    // UNI-type communication\n        // Set transmission data\nu16 rfu_UNI_setSendData(u8 bmSendSlot, const void *src, u8 size);\n        // Enable transmission data\nvoid rfu_UNI_readySendData(u8 slotStatusIndex);\n        // Change address or size of transmission data and enable transmission data\nu16 rfu_UNI_changeAndReadySendData(u8 slotStatusIndex, const void *src, u8 size);\n        // Used only by parent device. At the beginning of a MSC Callback that received notification that the data transmission completed, an ACK flag is obtained.\nu16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag);\n        // Clear the flag that indicates newly arrived reception data\nvoid rfu_UNI_clearRecvNewDataFlag(u8 slotStatusIndex);\n    // NI-type Communication\n        // Set transmission data\nu16 rfu_NI_setSendData(u8 bmSendSlot, u8 subFrameSize, const void *src, u32 size);\n        // Used only by child device. After establishing connection at the RFU level, configure transmission of child device game identification information in order to authenticate connection\nu16 rfu_NI_CHILD_setSendGameName(u8 slotNo, u8 subFrameSize);\n        // Stop the NI data currently being received\nu16 rfu_NI_stopReceivingData(u8 slotStatusIndex);\n    // Shared by NI- and UNI-type communications\n        // Narrow transmission targets for transmission data.\nu16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot);\n\n    // Functions for sending/receiving data to RFU\n        // Data transmission\nvoid rfu_REQ_sendData(bool8 clockChangeFlag);\n        // Used only by parent device. Resend previous sent data (packet)\nvoid rfu_REQ_PARENT_resumeRetransmitAndChange(void);\n        // Read receive data\nvoid rfu_REQ_recvData(void);\n\n// For Multi-boot\n    // Inherits the information about the link established by the downloader just after the program downloaded with multiboot starts up.\nu16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void);\n\n// For Debug\n    // Obtain address of the SWTI-layer receive buffer\nu8 *rfu_getSTWIRecvBuffer(void);\n    // Obtain RFU state\nvoid rfu_REQ_RFUStatus(void);\nu16 rfu_getRFUStatus(u8 *rfuState);\n    // Using RFU, generate noise (jamming radio waves) for other RFUs\nvoid rfu_REQ_noise(void);\n\n// librfu_intr\nvoid IntrSIO32(void);\n\n// librfu_stwi\nvoid STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam);\nvoid STWI_set_MS_mode(u8 mode);\nvoid STWI_init_Callback_M(void);\nvoid STWI_init_Callback_S(void);\nvoid STWI_set_Callback_M(void *callbackM);\nvoid STWI_set_Callback_S(void (*callbackS)(u16));\nvoid STWI_init_timer(IntrFunc *interrupt, s32 timerSelect);\nvoid AgbRFU_SoftReset(void);\nvoid STWI_set_Callback_ID(void (*func)(void));\nu16 STWI_read_status(u8 index);\nu16 STWI_poll_CommandEnd(void);\nvoid STWI_send_DataRxREQ(void);\nvoid STWI_send_MS_ChangeREQ(void);\nvoid STWI_send_StopModeREQ(void);\nvoid STWI_send_SystemStatusREQ(void);\nvoid STWI_send_GameConfigREQ(const u8 *serial_uname, const u8 *gname);\nvoid STWI_send_ResetREQ(void);\nvoid STWI_send_LinkStatusREQ(void);\nvoid STWI_send_VersionStatusREQ(void);\nvoid STWI_send_SlotStatusREQ(void);\nvoid STWI_send_ConfigStatusREQ(void);\nvoid STWI_send_ResumeRetransmitAndChangeREQ(void);\nvoid STWI_send_SystemConfigREQ(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer);\nvoid STWI_send_SC_StartREQ(void);\nvoid STWI_send_SC_PollingREQ(void);\nvoid STWI_send_SC_EndREQ(void);\nvoid STWI_send_SP_StartREQ(void);\nvoid STWI_send_SP_PollingREQ(void);\nvoid STWI_send_SP_EndREQ(void);\nvoid STWI_send_CP_StartREQ(u16 unk1);\nvoid STWI_send_CP_PollingREQ(void);\nvoid STWI_send_CP_EndREQ(void);\nvoid STWI_send_DataTxREQ(const void *in, u8 size);\nvoid STWI_send_DataTxAndChangeREQ(const void *in, u8 size);\nvoid STWI_send_DataReadyAndChangeREQ(u8 unk);\nvoid STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1);\nvoid STWI_send_DisconnectREQ(u8 unk);\nvoid STWI_send_TestModeREQ(u8 unk0, u8 unk1);\nvoid STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2);\nvoid STWI_send_CPR_PollingREQ(void);\nvoid STWI_send_CPR_EndREQ(void);\n\n#endif // GUARD_LIBRFU_H\n"
  },
  {
    "path": "include/link.h",
    "content": "#ifndef GUARD_LINK_H\n#define GUARD_LINK_H\n\n#include \"global.h\"\n\n#define MAX_LINK_PLAYERS 4\n#define MAX_RFU_PLAYERS 5\n#define CMD_LENGTH 8\n#define QUEUE_CAPACITY 50\n#define OVERWORLD_RECV_QUEUE_MAX 3\n#define BLOCK_BUFFER_SIZE 0x100\n\n#define LINK_SLAVE 0\n#define LINK_MASTER 8\n\n#define LINK_STAT_LOCAL_ID               0x00000003\n#define LINK_STAT_PLAYER_COUNT           0x0000001C\n#define LINK_STAT_PLAYER_COUNT_SHIFT     2\n#define LINK_STAT_MASTER                 0x00000020\n#define LINK_STAT_MASTER_SHIFT           5\n#define LINK_STAT_CONN_ESTABLISHED       0x00000040\n#define LINK_STAT_CONN_ESTABLISHED_SHIFT 6\n#define LINK_STAT_RECEIVED_NOTHING       0x00000100\n#define LINK_STAT_RECEIVED_NOTHING_SHIFT 8\n#define LINK_STAT_UNK_FLAG_9             0x00000200\n#define LINK_STAT_UNK_FLAG_9_SHIFT       9\n#define LINK_STAT_ERRORS                 0x0007F000\n#define LINK_STAT_ERRORS_SHIFT           12\n\n#define LINK_STAT_ERROR_HARDWARE         0x00001000\n#define LINK_STAT_ERROR_HARDWARE_SHIFT   12\n#define LINK_STAT_ERROR_CHECKSUM         0x00002000\n#define LINK_STAT_ERROR_CHECKSUM_SHIFT   13\n#define LINK_STAT_ERROR_QUEUE_FULL       0x00004000\n#define LINK_STAT_ERROR_QUEUE_FULL_SHIFT 14\n#define LINK_STAT_ERROR_LAG_MASTER       0x00010000\n#define LINK_STAT_ERROR_LAG_MASTER_SHIFT 16\n#define LINK_STAT_ERROR_INVALID_ID       0x00020000\n#define LINK_STAT_ERROR_INVALID_ID_SHIFT 17\n#define LINK_STAT_ERROR_LAG_SLAVE        0x00040000\n#define LINK_STAT_ERROR_LAG_SLAVE_SHIFT  18\n\n#define EXTRACT_PLAYER_COUNT(status) \\\n(((status) & LINK_STAT_PLAYER_COUNT) >> LINK_STAT_PLAYER_COUNT_SHIFT)\n#define EXTRACT_MASTER(status) \\\n(((status) >> LINK_STAT_MASTER_SHIFT) & 1)\n#define EXTRACT_CONN_ESTABLISHED(status) \\\n(((status) >> LINK_STAT_CONN_ESTABLISHED_SHIFT) & 1)\n#define EXTRACT_RECEIVED_NOTHING(status) \\\n(((status) >> LINK_STAT_RECEIVED_NOTHING_SHIFT) & 1)\n#define EXTRACT_LINK_ERRORS(status) \\\n(((status) & LINK_STAT_ERRORS) >> LINK_STAT_ERRORS_SHIFT)\n\n#define LINKCMD_BLENDER_STOP            0x1111\n#define LINKCMD_SEND_LINK_TYPE          0x2222\n#define LINKCMD_BLENDER_SCORE_MISS      0x2345\n#define LINKCMD_READY_EXIT_STANDBY      0x2FFE\n#define LINKCMD_SEND_PACKET             0x2FFF\n#define LINKCMD_BLENDER_SEND_KEYS       0x4444\n#define LINKCMD_BLENDER_SCORE_BEST      0x4523\n#define LINKCMD_BLENDER_SCORE_GOOD      0x5432\n#define LINKCMD_DUMMY_1                 0x5555\n#define LINKCMD_DUMMY_2                 0x5566\n#define LINKCMD_READY_CLOSE_LINK        0x5FFF\n#define LINKCMD_SEND_EMPTY              0x6666\n#define LINKCMD_SEND_0xEE               0x7777\n#define LINKCMD_BLENDER_PLAY_AGAIN      0x7779\n#define LINKCMD_COUNTDOWN               0x7FFF\n#define LINKCMD_CONT_BLOCK              0x8888\n#define LINKCMD_BLENDER_NO_BERRIES      0x9999\n#define LINKCMD_BLENDER_NO_PBLOCK_SPACE 0xAAAA\n#define LINKCMD_SEND_ITEM               0xAAAB\n#define LINKCMD_READY_TO_TRADE          0xAABB\n#define LINKCMD_READY_FINISH_TRADE      0xABCD\n#define LINKCMD_INIT_BLOCK              0xBBBB\n#define LINKCMD_READY_CANCEL_TRADE      0xBBCC\n#define LINKCMD_SEND_HELD_KEYS          0xCAFE\n#define LINKCMD_SEND_BLOCK_REQ          0xCCCC\n#define LINKCMD_START_TRADE             0xCCDD\n#define LINKCMD_CONFIRM_FINISH_TRADE    0xDCBA\n#define LINKCMD_SET_MONS_TO_TRADE       0xDDDD\n#define LINKCMD_PLAYER_CANCEL_TRADE     0xDDEE\n#define LINKCMD_REQUEST_CANCEL          0xEEAA\n#define LINKCMD_BOTH_CANCEL_TRADE       0xEEBB\n#define LINKCMD_PARTNER_CANCEL_TRADE    0xEECC\n#define LINKCMD_NONE                    0xEFFF\n\n#define LINKTYPE_TRADE               0x1111\n#define LINKTYPE_TRADE_CONNECTING    0x1122\n#define LINKTYPE_TRADE_SETUP         0x1133\n#define LINKTYPE_TRADE_DISCONNECTED  0x1144\n#define LINKTYPE_BATTLE              0x2211\n#define LINKTYPE_UNUSED_BATTLE       0x2222 // Unused, inferred from gap\n#define LINKTYPE_SINGLE_BATTLE       0x2233\n#define LINKTYPE_DOUBLE_BATTLE       0x2244\n#define LINKTYPE_MULTI_BATTLE        0x2255\n#define LINKTYPE_BATTLE_TOWER_50     0x2266\n#define LINKTYPE_BATTLE_TOWER_OPEN   0x2277\n#define LINKTYPE_BATTLE_TOWER        0x2288\n#define LINKTYPE_RECORD_MIX_BEFORE   0x3311\n#define LINKTYPE_RECORD_MIX_AFTER    0x3322\n#define LINKTYPE_BERRY_BLENDER_SETUP 0x4411\n#define LINKTYPE_BERRY_BLENDER       0x4422\n#define LINKTYPE_MYSTERY_EVENT       0x5501\n#define LINKTYPE_EREADER_FRLG        0x5502\n#define LINKTYPE_EREADER_EM          0x5503\n#define LINKTYPE_CONTEST_GMODE       0x6601\n#define LINKTYPE_CONTEST_EMODE       0x6602\n\nenum {\n    BLOCK_REQ_SIZE_NONE, // Identical to 200\n    BLOCK_REQ_SIZE_200,\n    BLOCK_REQ_SIZE_100,\n    BLOCK_REQ_SIZE_220,\n    BLOCK_REQ_SIZE_40,\n};\n\n#define MASTER_HANDSHAKE  0x8FFF\n#define SLAVE_HANDSHAKE   0xB9A0\n#define EREADER_HANDSHAKE 0xCCD0\n\n#define IsSendCmdComplete()    (gSendCmd[0] == 0)\n\nenum\n{\n    LINK_STATE_START0,\n    LINK_STATE_START1,\n    LINK_STATE_HANDSHAKE,\n    LINK_STATE_INIT_TIMER,\n    LINK_STATE_CONN_ESTABLISHED,\n};\n\nenum\n{\n    EXCHANGE_NOT_STARTED,\n    EXCHANGE_COMPLETE,\n    EXCHANGE_TIMED_OUT,\n    EXCHANGE_DIFF_SELECTIONS,\n    EXCHANGE_PLAYER_NOT_READY,\n    EXCHANGE_PARTNER_NOT_READY,\n    EXCHANGE_WRONG_NUM_PLAYERS,\n};\n\nenum\n{\n    QUEUE_FULL_NONE,\n    QUEUE_FULL_SEND,\n    QUEUE_FULL_RECV,\n};\n\nenum\n{\n    LAG_NONE,\n    LAG_MASTER,\n    LAG_SLAVE,\n};\n\nstruct LinkPlayer\n{\n    /* 0x00 */ u16 version;\n    /* 0x02 */ u16 lp_field_2;\n    /* 0x04 */ u32 trainerId;\n    /* 0x08 */ u8 name[PLAYER_NAME_LENGTH + 1];\n    /* 0x10 */ u8 progressFlags; // (& 0x0F) is hasNationalDex, (& 0xF0) is hasClearedGame\n    /* 0x11 */ u8 neverRead;\n    /* 0x12 */ u8 progressFlagsCopy;\n    /* 0x13 */ u8 gender;\n    /* 0x14 */ u32 linkType;\n    /* 0x18 */ u16 id; // battle bank in battles\n    /* 0x1A */ u16 language;\n};\n\nstruct LinkPlayerBlock\n{\n    u8 magic1[16];\n    struct LinkPlayer linkPlayer;\n    u8 magic2[16];\n};\n\n// circular queues\n\nstruct SendQueue\n{\n    u16 data[CMD_LENGTH][QUEUE_CAPACITY];\n    u8 pos;\n    u8 count;\n};\n\nstruct RecvQueue\n{\n    u16 data[MAX_LINK_PLAYERS][CMD_LENGTH][QUEUE_CAPACITY];\n    u8 pos;\n    u8 count;\n};\n\nstruct Link\n{\n    u8 isMaster; // 0: slave, 8: master\n    u8 state;\n    u8 localId; // local multi-player ID\n    u8 playerCount;\n    u16 tempRecvBuffer[4];\n    bool8 receivedNothing;\n    s8 serialIntrCounter;\n    bool8 handshakeAsMaster;\n    u8 link_field_F;\n\n    // error conditions\n    bool8 hardwareError; // hardware reported an error\n    bool8 badChecksum; // checksum didn't match between devices\n    u8 queueFull; // send or recv queue out of space\n    u8 lag; // connection is lagging\n\n    u16 checksum;\n\n    u8 sendCmdIndex;\n    u8 recvCmdIndex;\n\n    struct SendQueue sendQueue;\n    struct RecvQueue recvQueue;\n};\n\nstruct BlockRequest\n{\n    void *address;\n    u32 size;\n};\n\nextern const struct BlockRequest sBlockRequestLookupTable[5];\n\nextern struct Link gLink;\nextern u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH];\nextern u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE];\nextern u16 gLinkType;\nextern u32 gLinkStatus;\nextern u16 gBlockRecvBuffer[MAX_RFU_PLAYERS][BLOCK_BUFFER_SIZE / 2];\nextern u16 gSendCmd[CMD_LENGTH];\nextern u8 gShouldAdvanceLinkState;\nextern struct LinkPlayer gLinkPlayers[MAX_RFU_PLAYERS];\nextern u16 word_3002910[];\nextern bool8 gReceivedRemoteLinkPlayers;\nextern bool8 gLinkVSyncDisabled;\nextern u8 gWirelessCommType;\nextern struct LinkPlayer gLocalLinkPlayer;\n\nextern u8 gShouldAdvanceLinkState;\nextern u16 gLinkPartnersHeldKeys[6];\n\nvoid Task_DestroySelf(u8);\nvoid OpenLink(void);\nvoid CloseLink(void);\nu16 LinkMain2(const u16 *);\nvoid ClearLinkCallback(void);\nvoid ClearLinkCallback_2(void);\nu8 GetLinkPlayerCount(void);\nvoid OpenLinkTimed(void);\nu8 GetLinkPlayerDataExchangeStatusTimed(int lower, int higher);\nbool8 IsLinkPlayerDataExchangeComplete(void);\nu32 GetLinkPlayerTrainerId(u8);\nvoid ResetLinkPlayers(void);\nu8 GetMultiplayerId(void);\nu8 BitmaskAllOtherLinkPlayers(void);\nbool8 SendBlock(u8, const void *, u16);\nu8 GetBlockReceivedStatus(void);\nvoid ResetBlockReceivedFlags(void);\nvoid ResetBlockReceivedFlag(u8);\nvoid SetLinkDebugValues(u32, u32);\nu8 GetSavedPlayerCount(void);\nu8 GetLinkPlayerCount_2(void);\nbool8 IsLinkMaster(void);\nvoid CB2_LinkError(void);\nu8 GetSioMultiSI(void);\nbool8 IsLinkConnectionEstablished(void);\nvoid SetSuppressLinkErrorMessage(bool8);\nbool8 HasLinkErrorOccurred(void);\nvoid ResetSerial(void);\nu32 LinkMain1(u8 *, u16 *, u16[MAX_RFU_PLAYERS][CMD_LENGTH]);\nvoid RfuVSync(void);\nvoid Timer3Intr(void);\nvoid SerialCB(void);\nu8 GetLinkPlayerCount(void);\nbool32 InUnionRoom(void);\n\nvoid SetLinkStandbyCallback(void);\nvoid SetWirelessCommType1(void);\nvoid SetCloseLinkCallback(void);\nvoid OpenLink(void);\nbool8 IsLinkMaster(void);\nvoid CheckShouldAdvanceLinkState(void);\nvoid SetCloseLinkCallbackAndType(u16 type);\nvoid CloseLink(void);\nbool8 IsLinkTaskFinished(void);\nbool32 IsLinkRecvQueueAtOverworldMax(void);\nvoid ResetSerial(void);\nvoid SetWirelessCommType1(void);\nvoid LoadWirelessStatusIndicatorSpriteGfx(void);\nvoid CreateWirelessStatusIndicatorSprite(u8, u8);\nvoid StartSendingKeysToLink(void);\nvoid ClearLinkCallback_2(void);\nvoid Rfu_SetLinkStandbyCallback(void);\nvoid ConvertLinkPlayerName(struct LinkPlayer * linkPlayer);\nbool32 IsWirelessAdapterConnected(void);\nbool8 SendBlockRequest(u8 blockRequestType);\nvoid LinkVSync(void);\nbool8 HandleLinkConnection(void);\nvoid LocalLinkPlayerToBlock(void);\nvoid LinkPlayerFromBlock(u32 who);\nvoid SetLinkErrorFromRfu(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 isConnectionError);\nu8 GetLinkPlayerCountAsBitFlags(void);\nvoid ResetLinkPlayerCount(void);\nvoid SaveLinkPlayers(u8 numPlayers);\nu8 GetSavedLinkPlayerCountAsBitFlags(void);\nvoid CheckLinkPlayersMatchSaved(void);\nvoid SetLocalLinkPlayerId(u8 playerId);\nbool32 IsSendingKeysToLink(void);\nu32 GetLinkRecvQueueLength(void);\n\n#endif // GUARD_LINK_H\n"
  },
  {
    "path": "include/link_rfu.h",
    "content": "#ifndef GUARD_LINK_RFU_H\n#define GUARD_LINK_RFU_H\n\n#include \"global.h\"\n#include \"librfu.h\"\n#include \"link.h\"\n#include \"AgbRfu_LinkManager.h\"\n\n#define RFUCMD_MASK                0xFF00\n\n#define RFUCMD_SEND_PACKET         0x2F00\n#define RFUCMD_BLENDER_SEND_KEYS   0x4400\n#define RFUCMD_READY_CLOSE_LINK    0x5F00\n#define RFUCMD_READY_EXIT_STANDBY  0x6600\n#define RFUCMD_SEND_PLAYER_IDS     0x7700\n#define RFUCMD_SEND_PLAYER_IDS_NEW 0x7800\n#define RFUCMD_SEND_BLOCK_INIT     0x8800\n#define RFUCMD_SEND_BLOCK          0x8900\n#define RFUCMD_SEND_BLOCK_REQ      0xA100\n#define RFUCMD_SEND_HELD_KEYS      0xBE00\n#define RFUCMD_DISCONNECT          0xED00\n#define RFUCMD_DISCONNECT_PARENT   0xEE00\n\n#define RFU_SERIAL_GAME                0x0002 // Serial number for Pokémon game (FRLG or Emerald)\n#define RFU_SERIAL_WONDER_DISTRIBUTOR  0x7F7D // Serial number for distributing Wonder Cards / News\n#define RFU_SERIAL_END                 0xFFFF\n\n#define COMM_SLOT_LENGTH 14\n#define RECV_QUEUE_NUM_SLOTS 20\n#define SEND_QUEUE_NUM_SLOTS 40\n#define BACKUP_QUEUE_NUM_SLOTS 2\n\n#define RFU_PACKET_SIZE 6\n\n#define RFU_STATUS_OK                   0\n#define RFU_STATUS_FATAL_ERROR          1\n#define RFU_STATUS_CONNECTION_ERROR     2\n#define RFU_STATUS_CHILD_SEND_COMPLETE  3\n#define RFU_STATUS_NEW_CHILD_DETECTED   4\n#define RFU_STATUS_JOIN_GROUP_OK        5\n#define RFU_STATUS_JOIN_GROUP_NO        6\n#define RFU_STATUS_WAIT_ACK_JOIN_GROUP  7\n#define RFU_STATUS_LEAVE_GROUP_NOTICE   8\n#define RFU_STATUS_LEAVE_GROUP          9\n#define RFU_STATUS_CHILD_LEAVE_READY    10\n#define RFU_STATUS_CHILD_LEAVE          11\n#define RFU_STATUS_ACK_JOIN_GROUP       12\n\n// Values for disconnectMode\nenum {\n    RFU_DISCONNECT_NONE,\n    RFU_DISCONNECT_ERROR,\n    RFU_DISCONNECT_NORMAL,\n};\n\n// Values for errorState\nenum {\n    RFU_ERROR_STATE_NONE,\n    RFU_ERROR_STATE_OCCURRED,\n    RFU_ERROR_STATE_PROCESSED,\n    RFU_ERROR_STATE_DISCONNECTING,\n    RFU_ERROR_STATE_IGNORE,\n};\n\n// These error flags are set in errorInfo, and given as\n// the uppermost 16 bits of 'status' for sLinkErrorBuffer.\n// The first 8 bits are reserved for the link manager msg\n// when the error occurred, and the last 8 bits are this\n// sequence of presumably meaningful error flags, but\n// ultimately sLinkErrorBuffer's status is never read.\n#define F_RFU_ERROR_1 (1 << 8)\n#define F_RFU_ERROR_2 (1 << 9)  // Never set\n#define F_RFU_ERROR_3 (1 << 10) // Never set\n#define F_RFU_ERROR_4 (1 << 11) // Never set\n#define F_RFU_ERROR_5 (1 << 12)\n#define F_RFU_ERROR_6 (1 << 13)\n#define F_RFU_ERROR_7 (1 << 14)\n#define F_RFU_ERROR_8 (1 << 15)\n\n// RfuTgtData.gname is read as these structs.\nstruct RfuGameCompatibilityData\n{\n    u16 language:4;\n    u16 hasNews:1;\n    u16 hasCard:1;\n    u16 unknown:1; // Never read\n    u16 canLinkNationally:1;\n    u16 hasNationalDex:1;\n    u16 gameClear:1;\n    u16 version:4;\n    u16 unused:2;\n    u8 playerTrainerId[2];\n};\n\n// This struct is sent via the Wireless Adapter as the game name or \"gname\" data.\n// Gname is only applicable during Wireless Single Game Pak Multiplay, when the\n// adapter needs this data for connection. Per the RFU manual, during \"normal\"\n// wireless play (the kind the Pokémon games use) the gname data can be used for\n// anything the developers want. This struct is what GF decided to use it for.\n// It can be up to 13 bytes in size (RFU_GAME_NAME_LENGTH).\n// The player's name is sent separately as the username (\"uname\"), and does not\n// use a struct (gHostRfuUsername).\nstruct __attribute__((packed, aligned(2))) RfuGameData\n{\n    struct RfuGameCompatibilityData compatibility;\n    u8 partnerInfo[RFU_CHILD_MAX];\n    u16 tradeSpecies:10;\n    u16 tradeType:6;\n    u8 activity:7;\n    u8 startedActivity:1;\n    u8 playerGender:1;\n    u8 tradeLevel:7;\n    u8 padding;\n};\n\n// Constants for getting/setting information in 'partnerInfo' of RfuGameData.\n// This data is used to determine what the link partners look like from\n// the host's perspective.\n// Bits 0-2 are a shortened trainerId\n// Bit 3 is the player's gender\n// Bits 4-6 are unknown/unused\n// Bit 7 is an 'active' flag\n#define PINFO_TID_MASK 0x7\n#define PINFO_GENDER_SHIFT 3\n#define PINFO_ACTIVE_FLAG (1 << 7)\n\nstruct RfuBlockSend\n{\n    /* 0x00 */ u16 next;\n    /* 0x02 */ u16 count; // max 21\n    /* 0x04 */ const u8 *payload;\n    /* 0x08 */ u32 receivedFlags;\n    /* 0x0c */ u32 failedFlags;\n    /* 0x10 */ u8 sending;\n    /* 0x11 */ u8 owner;\n    /* 0x12 */ u8 receiving;\n};\n\nstruct RfuRecvQueue\n{\n    /* 0x000 */ u8 slots[RECV_QUEUE_NUM_SLOTS][COMM_SLOT_LENGTH * MAX_RFU_PLAYERS];\n    /* 0x578 */ vu8 recvSlot;\n    /* 0x579 */ vu8 sendSlot;\n    /* 0x57a */ vu8 count;\n    /* 0x57b */ vu8 full;\n};\n\nstruct RfuSendQueue\n{\n    /* 0x000 */ u8 slots[SEND_QUEUE_NUM_SLOTS][COMM_SLOT_LENGTH];\n    /* 0x230 */ vu8 recvSlot;\n    /* 0x231 */ vu8 sendSlot;\n    /* 0x232 */ vu8 count;\n    /* 0x233 */ vu8 full;\n};\n\nstruct RfuBackupQueue\n{\n    /* 0x00 */ u8 slots[BACKUP_QUEUE_NUM_SLOTS][COMM_SLOT_LENGTH];\n    /* 0x1c */ vu8 recvSlot;\n    /* 0x1d */ vu8 sendSlot;\n    /* 0x1e */ vu8 count;\n};\n\nstruct RfuManager\n{\n    /* 0x000 */ void (*callback)(void);\n    /* 0x004 */ u16 state;\n    /* 0x006 */ u8 unused1[4];\n    /* 0x00a */ u16 errorInfo;\n    /* 0x00c */ u8 parentChild;\n    /* 0x00d */ u8 playerCount;\n    /* 0x00e */ bool8 runParentMain2;\n    /* 0x00f */ u8 unused2;\n    /* 0x010 */ u16 errorParams[2];\n    /* 0x014 */ u8 childRecvBuffer[RFU_CHILD_MAX][COMM_SLOT_LENGTH];\n    /* 0x04c */ u8 childSendBuffer[COMM_SLOT_LENGTH];\n    /* 0x05a */ u8 blockRequestType;\n    /* 0x05b */ u8 sendBlockInitDelay;\n    /* 0x05c */ bool8 blockReceived[MAX_RFU_PLAYERS];\n    /* 0x061 */ u8 numBlocksReceived[MAX_RFU_PLAYERS];\n    /* 0x066 */ u8 idleTaskId;\n    /* 0x067 */ u8 searchTaskId;\n    /* 0x068 */ u8 unused3[4];\n    /* 0x06c */ struct RfuBlockSend sendBlock;\n    /* 0x080 */ struct RfuBlockSend recvBlock[MAX_RFU_PLAYERS];\n    /* 0x0e4 */ bool8 readyCloseLink[MAX_RFU_PLAYERS];\n    /* 0x0e9 */ bool8 readyExitStandby[MAX_RFU_PLAYERS];\n    /* 0x0ee */ vu8 errorState;\n    /* 0x0ef */ bool8 isShuttingDown;\n    /* 0x0f0 */ u8 linkLossRecoveryState;\n    /* 0x0f1 */ u8 status;\n    /* 0x0f2 */ u16 packet[RFU_PACKET_SIZE];\n    /* 0x0fe */ u16 resendExitStandbyTimer;\n    /* 0x100 */ u16 resendExitStandbyCount;\n    /* 0x102 */ u8 childSendCmdId;\n    /* 0x104 */ struct RfuTgtData parent;\n    /* 0x124 */ struct RfuRecvQueue recvQueue;\n    /* 0x6a0 */ struct RfuSendQueue sendQueue;\n    /* 0x8d4 */ struct RfuBackupQueue backupQueue;\n    /* 0x8f4 */ vu8 linkRecovered;\n    /* 0x8f5 */ u8 reconnectParentId;\n    /* 0x8f6 */ vu8 childSlot;\n    /* 0x8f7 */ u8 childRecvQueue[COMM_SLOT_LENGTH * MAX_RFU_PLAYERS];\n    /* 0x93d */ u8 sendStatus;\n    /* 0x93e */ u8 recvStatus;\n    /* 0x93f */ u8 recvCmds[MAX_RFU_PLAYERS][CMD_LENGTH - 1][2];\n    /* 0x985 */ u8 parentId;\n    /* 0x986 */ u8 multiplayerId; // childId\n    /* 0x987 */ u8 connectParentFailures;\n    /* 0x988 */ vu8 childSendCount;\n    /* 0x989 */ u8 partnerSendStatuses[RFU_CHILD_MAX];\n    /* 0x98d */ u8 partnerRecvStatuses[RFU_CHILD_MAX];\n    /* 0x991 */ bool8 stopNewConnections;\n    /* 0x992 */ u8 parentSendSlot;\n    /* 0x993 */ vbool8 parentFinished;\n    /* 0x994 */ vbool8 parentMain2Failed;\n    /* 0x995 */ u8 unused5;\n    /* 0x996 */ u8 linkPlayerIdx[RFU_CHILD_MAX];\n    /* 0x99a */ u8 parentSlots;\n    /* 0x99b */ u8 disconnectSlots;\n    /* 0x99c */ u8 disconnectMode;\n    /* 0x99d */ u8 nextChildBits;\n    /* 0x99e */ u8 newChildQueue;\n    /* 0x99f */ u8 acceptSlot_flag;\n    /* 0x9a0 */ bool8 playerExchangeActive;\n    /* 0x9a1 */ u8 incomingChild;\n    /* 0x9a2 */ u8 numChildRecvErrors[RFU_CHILD_MAX];\n    /* 0x9a6 */ u8 childRecvIds[RFU_CHILD_MAX];\n}; // size: 0x9AC\n\nextern struct RfuGameData gHostRfuGameData;\nextern u8 gHostRfuUsername[];\nextern struct RfuManager gRfu;\n\nvoid LinkRfu_FatalError(void);\nvoid MG_DrawCheckerboardPattern(void);\nvoid Rfu_SetCloseLinkCallback(void);\nbool8 IsLinkRfuTaskFinished(void);\nvoid DestroyWirelessStatusIndicatorSprite(void);\nvoid CreateTask_LinkMysteryGiftWithFriend(u32 activity);\nvoid CreateTask_LinkMysteryGiftOverWireless(u32 activity);\nvoid CreateTask_SendMysteryGift(u32 activity);\nvoid Rfu_SendPacket(void *data);\nu8 CreateTask_ListenToWireless(void);\nvoid DestroyTask_RfuIdle(void);\nvoid InitRFUAPI(void);\nvoid RfuSetIgnoreError(bool32 enable);\nbool32 IsSendingKeysToRfu(void);\nvoid ClearLinkRfuCallback(void);\nu8 Rfu_GetLinkPlayerCount(void);\nvoid StartSendingKeysToRfu(void);\nu8 Rfu_GetMultiplayerId(void);\nbool32 Rfu_InitBlockSend(const u8 * src, size_t size);\nbool8 Rfu_SendBlockRequest(u8 blockRequestType);\nu8 Rfu_GetBlockReceivedStatus(void);\nvoid Rfu_SetBlockReceivedFlag(u8 linkPlayerId);\nvoid Rfu_ResetBlockReceivedFlag(u8 linkPlayerId);\nbool8 Rfu_IsMaster(void);\nvoid ResetLinkRfuGFLayer(void);\nbool32 RfuMain1(void);\nbool32 RfuMain2(void);\nbool32 IsRfuRecvQueueEmpty(void);\nu32 GetRfuRecvQueueLength(void);\nvoid LinkRfu_Shutdown(void);\nvoid CreateTask_RfuIdle(void);\nbool8 Rfu_SetLinkRecovery(bool32 enable);\nvoid SetUsingUnionRoomStartMenu(void);\nstruct RfuGameData *GetHostRfuGameData(void);\nvoid UpdateWirelessStatusIndicatorSprite(void);\nvoid InitRFU(void);\nbool32 RfuHasErrored(void);\n\nvoid RfuRecvQueue_Reset(struct RfuRecvQueue *queue);\nvoid RfuSendQueue_Reset(struct RfuSendQueue *queue);\n\nvoid RfuSetStatus(u8 status, u16 msg);\nu8 RfuGetStatus(void);\nvoid RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *src);\nbool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *dest);\nbool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *dest);\nvoid RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *dest);\nbool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue * queue, u8 *dest);\nvoid RfuSendQueue_Enqueue(struct RfuSendQueue * queue, u8 *src);\nvoid InitHostRfuGameData(struct RfuGameData *data, u8 activity, bool32 started, s32 partnerInfo);\nvoid UpdateGameData_GroupLockedIn(bool8 started);\nbool32 IsRfuSerialNumberValid(u32 serialNo);\nbool8 IsRfuRecoveringFromLinkLoss(void);\nbool8 LmanAcceptSlotFlagIsNotZero(void);\nvoid LinkRfu_StopManagerAndFinalizeSlots(void);\nbool32 RfuTryDisconnectLeavingChildren(void);\nbool32 IsRfuCommunicatingWithAllChildren(void);\nbool32 WaitRfuState(bool32 force);\nbool32 HasTrainerLeftPartnersList(u16 trainerId, const u8 *trainerName);\nvoid SendRfuStatusToPartner(u8 status, u16 trainerId, const u8 *name);\nu32 WaitSendRfuStatusToPartner(u16 trainerId, const u8 *name);\nvoid SetHostRfuGameData(u8 activity, u32 partnerInfo, bool32 startedActivity);\nvoid InitializeRfuLinkManager_LinkLeader(u32 availSlots);\nvoid RequestDisconnectSlotByTrainerNameAndId(const u8 *trainerName, u16 trainerId);\nvoid CopyHostRfuGameDataAndUsername(struct RfuGameData *gameData, u8 *username);\nvoid InitializeRfuLinkManager_JoinGroup(void);\nvoid SendLeaveGroupNotice(void);\nvoid CreateTask_RfuReconnectWithParent(const u8 *src, u16 trainerId);\nvoid UpdateGameData_SetActivity(u8 activity, u32 partnerInfo, u32 startedActivity);\nvoid SaveLinkTrainerNames(void);\nvoid LinkRfu_CreateConnectionAsParent();\nvoid LinkRfu_StopManagerBeforeEnteringChat();\nvoid SetHostRfuWonderFlags(bool32 hasNews, bool32 hasCard);\nvoid ResetHostRfuGameData(void);\nvoid StopUnionRoomLinkManager(void);\nvoid SetTradeBoardRegisteredMonInfo(u32 type, u32 species, u32 level);\nbool32 IsUnionRoomListenTaskActive(void);\nvoid InitializeRfuLinkManager_EnterUnionRoom(void);\nvoid Rfu_DisconnectPlayerById(u32 playerIdx);\nvoid TryConnectToUnionRoomParent(const u8 *name, struct RfuGameData *parent, u8 activity);\nbool32 PlayerHasMetTrainerBefore(u16 id, u8 *name);\nbool8 Rfu_GetCompatiblePlayerData(struct RfuGameData *gameData, u8 *username, u8 idx);\nbool8 Rfu_GetWonderDistributorPlayerData(struct RfuGameData *gameData, u8 *username, u8 idx);\nbool32 Rfu_IsPlayerExchangeActive(void);\nvoid Rfu_StopPartnerSearch(void);\nvoid RfuSetNormalDisconnectMode(void);\nvoid SetUnionRoomChatPlayerData(u32 numPlayers);\nvoid ClearRecvCommands(void);\n\n#include \"mystery_gift_server.h\"\nextern const struct MysteryGiftServerCmd gServerScript_ClientCanceledCard[];\n\n#endif //GUARD_LINK_RFU_H\n"
  },
  {
    "path": "include/list_menu.h",
    "content": "#ifndef GUARD_LIST_MENU_H\n#define GUARD_LIST_MENU_H\n\n#include \"global.h\"\n#include \"window.h\"\n\n#define LIST_NOTHING_CHOSEN -1\n#define LIST_CANCEL -2\n#define LIST_HEADER -3\n\n#define LIST_NO_MULTIPLE_SCROLL     0\n#define LIST_MULTIPLE_SCROLL_DPAD   1\n#define LIST_MULTIPLE_SCROLL_L_R    2\n\nenum\n{\n    SCROLL_ARROW_LEFT,\n    SCROLL_ARROW_RIGHT,\n    SCROLL_ARROW_UP,\n    SCROLL_ARROW_DOWN,\n};\n\nstruct ListMenuItem\n{\n    const u8 *label;\n    u32 index;\n};\n\nstruct ListMenu;\n\n// For ListMenuGet/SetTemplateField\nenum ListMenuFields\n{\n    LISTFIELD_MOVECURSORFUNC = 0,\n    LISTFIELD_MOVECURSORFUNC2,\n    LISTFIELD_TOTALITEMS,\n    LISTFIELD_MAXSHOWED,\n    LISTFIELD_WINDOWID,\n    LISTFIELD_HEADERX,\n    LISTFIELD_ITEMX,\n    LISTFIELD_CURSORX,\n    LISTFIELD_UPTEXTY,\n    LISTFIELD_CURSORPAL,\n    LISTFIELD_FILLVALUE,\n    LISTFIELD_CURSORSHADOWPAL,\n    LISTFIELD_LETTERSPACING,\n    LISTFIELD_ITEMVERTICALPADDING,\n    LISTFIELD_SCROLLMULTIPLE,\n    LISTFIELD_FONTID,\n    LISTFIELD_CURSORKIND,\n};\n\nstruct ListMenuTemplate\n{\n    /*0x00*/ const struct ListMenuItem *items;\n    /*0x04*/ void (* moveCursorFunc)(s32 itemIndex, bool8 onInit, struct ListMenu *list);\n    /*0x08*/ void (* itemPrintFunc)(u8 windowId, u32 itemId, u8 y);\n    /*0x0C*/ u16 totalItems;\n    /*0x0E*/ u16 maxShowed;\n    /*0x10*/ u8 windowId;\n    /*0x11*/ u8 header_X;\n    /*0x12*/ u8 item_X;\n    /*0x13*/ u8 cursor_X;\n    /*0x14*/ u8 upText_Y:4; // x1, x2, x4, x8 = xF\n             u8 cursorPal:4; // x10, x20, x40, x80 = xF0\n    /*0x15*/ u8 fillValue:4; // x1, x2, x4, x8 = xF\n             u8 cursorShadowPal:4; // x10, x20, x40, x80 = xF0\n    /*0x16*/ u8 lettersSpacing:3;\n             u8 itemVerticalPadding:3;\n             u8 scrollMultiple:2; // x40, x80 = xC0\n    /*0x17*/ u8 fontId:6; // x1, x2, x4, x8, x10, x20 = x3F\n             u8 cursorKind:2; // x40, x80\n}; /* size = 0x18 */\n\nstruct ListMenu\n{\n    struct ListMenuTemplate template;\n    u16 cursorPos;\n    u16 itemsAbove;\n    u8 unk_1C;\n    u8 unk_1D;\n    u8 taskId;\n    u8 unk_1F;\n};\n\nstruct ListMenuWindowRect\n{\n    u8 x;\n    u8 y;\n    u8 width;\n    u8 height;\n    u8 palNum;\n};\n\nextern struct ListMenuTemplate gMultiuseListMenuTemplate;\n\nu32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum);\nu8 ListMenuInit(const struct ListMenuTemplate *listMenuTemplate, u16 cursorPos, u16 itemsAbove);\nu8 ListMenuInitInRect(const struct ListMenuTemplate *listMenuTemplate, const struct ListMenuWindowRect *rect, u16 cursorPos, u16 itemsAbove);\ns32 ListMenu_ProcessInput(u8 listTaskId);\nvoid DestroyListMenuTask(u8 listTaskId, u16 *cursorPos, u16 *itemsAbove);\nvoid RedrawListMenu(u8 listTaskId);\nvoid ListMenuGetScrollAndRow(u8 listTaskId, u16 *cursorPos, u16 *itemsAbove);\nu16 ListMenuGetYCoordForPrintingArrowCursor(u8 listTaskId);\nvoid ListMenuOverrideSetColors(u8 cursorPal, u8 fillValue, u8 cursorShadowPal);\nvoid ListMenuDefaultCursorMoveFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list);\nvoid ListMenuSetTemplateField(u8 taskId, u8 field, s32 value);\n\n#endif //GUARD_LIST_MENU_H\n"
  },
  {
    "path": "include/load_save.h",
    "content": "#ifndef GUARD_LOAD_SAVE_H\n#define GUARD_LOAD_SAVE_H\n\n#include \"global.h\"\n\nextern bool32 gFlashMemoryPresent;\nextern struct SaveBlock1 gSaveBlock1;\nextern struct SaveBlock2 gSaveBlock2;\nextern struct PokemonStorage gPokemonStorage;\n\nvoid ClearSav2(void);\nvoid ClearSav1(void);\nvoid CheckForFlashMemory(void);\nvoid MoveSaveBlocks_ResetHeap(void);\nbool32 GetSecretBase2Field_9(void);\nvoid ClearSecretBase2Field_9(void);\nvoid SetSecretBase2Field_9(void);\nvoid SetSecretBase2Field_9_AndHideBG(void);\nvoid ClearSecretBase2Field_9_2(void);\nvoid SavePlayerParty(void);\nvoid LoadPlayerParty(void);\nvoid SaveSerializedGame(void);\nvoid LoadSerializedGame(void);\nvoid LoadPlayerBag(void);\nvoid SavePlayerBag(void);\nvoid SetSaveBlocksPointers(void);\nvoid MoveSaveBlocks_ResetHeap(void);\nvoid ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey);\nvoid ApplyNewEncryptionKeyToBagItems(u32 encryptionKey);\nvoid ApplyNewEncryptionKeyToWord(u32 * word, u32 encryptionKey);\nvoid ApplyNewEncryptionKeyToHword(u16 * hword, u32 encryptionKey);\nvoid ClearContinueGameWarpStatus2(void);\nvoid SetContinueGameWarpStatusToDynamicWarp(void);\nvoid SetContinueGameWarpStatus(void);\nbool32 UseContinueGameWarp(void);\nvoid ClearContinueGameWarpStatus();\nvoid SerializeKeyItemSlots(void);\n\n#endif // GUARD_LOAD_SAVE_H\n"
  },
  {
    "path": "include/m4a.h",
    "content": "#ifndef GUARD_M4A_H\n#define GUARD_M4A_H\n\n#include \"gba/m4a_internal.h\"\n\nvoid m4aSoundVSync(void);\nvoid m4aSoundVSyncOn(void);\n\nvoid m4aSoundInit(void);\nvoid m4aSoundMain(void);\nvoid m4aSongNumStart(u16 n);\nvoid m4aSongNumStartOrChange(u16 n);\nvoid m4aSongNumStop(u16 n);\nvoid m4aMPlayAllStop(void);\nvoid m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);\nvoid m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed);\nvoid m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed);\nvoid m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed);\nvoid m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo);\n\nextern struct MusicPlayerInfo gMPlayInfo_BGM;\nextern struct MusicPlayerInfo gMPlayInfo_SE1;\nextern struct MusicPlayerInfo gMPlayInfo_SE2;\nextern struct MusicPlayerInfo gMPlayInfo_SE3;\nextern struct SoundInfo gSoundInfo;\n\nextern const struct SongHeader mus_victory_gym_leader;\n\n#endif //GUARD_M4A_H\n"
  },
  {
    "path": "include/mail.h",
    "content": "#ifndef GUARD_MAIL_H\n#define GUARD_MAIL_H\n\n#include \"global.h\"\n\n#define MAIL_WORDS_COUNT 9\n\n#define IS_ITEM_MAIL(itemId)((itemId == ITEM_ORANGE_MAIL            \\\n                              || itemId == ITEM_HARBOR_MAIL         \\\n                              || itemId == ITEM_GLITTER_MAIL        \\\n                              || itemId == ITEM_MECH_MAIL           \\\n                              || itemId == ITEM_WOOD_MAIL           \\\n                              || itemId == ITEM_WAVE_MAIL           \\\n                              || itemId == ITEM_BEAD_MAIL           \\\n                              || itemId == ITEM_SHADOW_MAIL         \\\n                              || itemId == ITEM_TROPIC_MAIL         \\\n                              || itemId == ITEM_DREAM_MAIL          \\\n                              || itemId == ITEM_FAB_MAIL            \\\n                              || itemId == ITEM_RETRO_MAIL))\n\n#define FIRST_MAIL_IDX ITEM_ORANGE_MAIL\n\n#define ITEM_TO_MAIL(itemId) (itemId - FIRST_MAIL_IDX)\n\nvoid ReadMail(struct Mail * mail, void (*savedCallback)(void), bool8 messageExists);\n\n#endif // GUARD_MAIL_H\n"
  },
  {
    "path": "include/mail_data.h",
    "content": "#ifndef GUARD_MAIL_DATA_H\n#define GUARD_MAIL_DATA_H\n\n#include \"global.h\"\n\nvoid ClearMailData(void);\nvoid ClearMailStruct(struct Mail *mail);\nbool8 MonHasMail(struct Pokemon *mon);\nu8 GiveMailToMon(struct Pokemon *mon, u16 itemId);\nu16 SpeciesToMailSpecies(u16 species, u32 personality);\nu16 MailSpeciesToSpecies(u16 mailSpecies, u16 *buffer);\nu8 GiveMailToMon2(struct Pokemon *mon, struct Mail *mail);\nvoid TakeMailFromMon(struct Pokemon *mon);\nvoid ClearMailItemId(u8 mailId);\nu8 TakeMailFromMon2(struct Pokemon *mon);\nbool8 ItemIsMail(u16 itemId);\n\n#endif //GUARD_MAIL_DATA_H\n"
  },
  {
    "path": "include/mailbox_pc.h",
    "content": "#ifndef GUARD_MAILBOX_PC_H\n#define GUARD_MAILBOX_PC_H\n\n#include \"player_pc.h\"\n\nbool8 MailboxPC_InitBuffers(u8 num);\nu8 MailboxPC_GetAddWindow(u8 winIdx);\nvoid MailboxPC_RemoveWindow(u8 winIdx);\nu8 MailboxPC_GetWindowId(u8 winIdx);\nu8 MailboxPC_InitListMenu(struct PlayerPCItemPageStruct * playerPcStruct);\nvoid MailboxPC_AddScrollIndicatorArrows(struct PlayerPCItemPageStruct * playerPcStruct);\nvoid MailboxPC_DestroyListMenuBuffer(void);\n\n#endif //GUARD_MAILBOX_PC_H\n"
  },
  {
    "path": "include/main.h",
    "content": "#ifndef GUARD_MAIN_H\n#define GUARD_MAIN_H\n\ntypedef void (*MainCallback)(void);\ntypedef void (*IntrCallback)(void);\ntypedef void (*IntrFunc)(void);\n\n#include \"global.h\"\n\nextern IntrFunc gIntrTable[];\n\nstruct Main\n{\n    /*0x000*/ MainCallback callback1;\n    /*0x004*/ MainCallback callback2;\n\n    /*0x008*/ MainCallback savedCallback;\n\n    /*0x00C*/ IntrCallback vblankCallback;\n    /*0x010*/ IntrCallback hblankCallback;\n    /*0x014*/ IntrCallback vcountCallback;\n    /*0x018*/ IntrCallback serialCallback;\n\n    /*0x01C*/ vu16 intrCheck;\n\n    /*0x020*/ u32 *vblankCounter1;\n    /*0x024*/ u32 vblankCounter2;\n\n    /*0x028*/ u16 heldKeysRaw;           // held keys without L=A remapping\n    /*0x02A*/ u16 newKeysRaw;            // newly pressed keys without L=A remapping\n    /*0x02C*/ u16 heldKeys;              // held keys with L=A remapping\n    /*0x02E*/ u16 newKeys;               // newly pressed keys with L=A remapping\n    /*0x030*/ u16 newAndRepeatedKeys;    // newly pressed keys plus key repeat\n    /*0x032*/ u16 keyRepeatCounter;      // counts down to 0, triggering key repeat\n    /*0x034*/ bool16 watchedKeysPressed; // whether one of the watched keys was pressed\n    /*0x036*/ u16 watchedKeysMask;       // bit mask for watched keys\n\n    /*0x038*/ struct OamData oamBuffer[128];\n\n    /*0x438*/ u8 state;\n\n    /*0x439*/ u8 oamLoadDisabled:1;\n    /*0x439*/ u8 inBattle:1;\n    /*0x439*/ u8 field_439_x4:1;\n};\n\nextern struct Main gMain;\nextern bool8 gSoftResetDisabled;\nextern bool8 gLinkVSyncDisabled;\n\nextern const u8 gGameVersion;\nextern const u8 gGameLanguage;\n\nvoid AgbMain(void);\nvoid SetMainCallback2(MainCallback callback);\nvoid InitKeys(void);\nvoid SetVBlankCallback(IntrCallback callback);\nvoid SetHBlankCallback(IntrCallback callback);\nvoid SetVCountCallback(IntrCallback callback);\nvoid SetSerialCallback(IntrCallback callback);\nvoid InitFlashTimer(void);\nvoid DoSoftReset(void);\nvoid ClearPokemonCrySongs(void);\nvoid RestoreSerialTimer3IntrHandlers(void);\nvoid SetVBlankCounter1Ptr(u32 *ptr);\nvoid DisableVBlankCounter1(void);\nvoid StartTimer1(void);\nvoid SeedRngAndSetTrainerId(void);\nu16 GetGeneratedTrainerIdLower(void);\n\n#define GAME_CODE_LENGTH 4\nextern const char RomHeaderGameCode[GAME_CODE_LENGTH];\nextern const char RomHeaderSoftwareVersion;\n\nextern u8 gLinkTransferringData;\nextern u16 gKeyRepeatStartDelay;\n\n#endif // GUARD_MAIN_H\n"
  },
  {
    "path": "include/main_menu.h",
    "content": "#ifndef GUARD_MAIN_MENU_H\n#define GUARD_MAIN_MENU_H\n\nvoid CB2_InitMainMenu(void);\n\n#endif //GUARD_MAIN_MENU_H\n"
  },
  {
    "path": "include/malloc.h",
    "content": "#ifndef GUARD_MALLOC_H\n#define GUARD_MALLOC_H\n\n#include \"global.h\"\n\n#define HEAP_SIZE 0x1C000\n#define malloc Alloc\n#define calloc(ct, sz) AllocZeroed((ct) * (sz))\n#define free Free\n\n#define FREE_AND_SET_NULL(ptr)          \\\n{                                       \\\n    free(ptr);                          \\\n    ptr = NULL;                         \\\n}\n\n#define TRY_FREE_AND_SET_NULL(ptr) if (ptr != NULL) FREE_AND_SET_NULL(ptr)\n\nextern u8 gHeap[];\nvoid *Alloc(u32 size);\nvoid *AllocZeroed(u32 size);\nvoid Free(void *pointer);\nvoid InitHeap(void *pointer, u32 size);\n\n#endif // GUARD_MALLOC_H\n"
  },
  {
    "path": "include/map_name_popup.h",
    "content": "#ifndef GUARD_MAP_NAME_POPUP_H\n#define GUARD_MAP_NAME_POPUP_H\n\n#include \"global.h\"\n\nvoid ShowMapNamePopup(bool32 palIntoFadedBuffer);\nvoid DismissMapNamePopup(void);\n\n#endif //GUARD_MAP_NAME_POPUP_H\n"
  },
  {
    "path": "include/map_preview_screen.h",
    "content": "#ifndef GUARD_MAP_PREVIEW_SCREEN_H\n#define GUARD_MAP_PREVIEW_SCREEN_H\n\nenum MapPreviewScreenId\n{\n    MPS_VIRIDIAN_FOREST = 0u,\n    MPS_MT_MOON,\n    MPS_DIGLETTS_CAVE,\n    MPS_ROCK_TUNNEL,\n    MPS_POKEMON_TOWER,\n    MPS_SAFARI_ZONE,\n    MPS_SEAFOAM_ISLANDS,\n    MPS_POKEMON_MANSION,\n    MPS_ROCKET_HIDEOUT,\n    MPS_SILPH_CO,\n    MPS_VICTORY_ROAD,\n    MPS_CERULEAN_CAVE,\n    MPS_POWER_PLANT,\n    MPS_MT_EMBER,\n    MPS_ROCKET_WAREHOUSE,\n    MPS_MONEAN_CHAMBER,\n    MPS_DOTTED_HOLE,\n    MPS_BERRY_FOREST,\n    MPS_ICEFALL_CAVE,\n    MPS_LOST_CAVE,\n    MPS_ALTERING_CAVE,\n    MPS_PATTERN_BUSH,\n    MPS_LIPTOO_CHAMBER,\n    MPS_WEEPTH_CHAMBER,\n    MPS_TDILFORD_CHAMBER,\n    MPS_SCUFIB_CHAMBER,\n    MPS_RIXY_CHAMBER,\n    MPS_VIAPOIS_CHAMBER,\n    MPS_COUNT\n};\n\n#define MPS_TYPE_CAVE   0\n#define MPS_TYPE_FOREST 1\n#define MPS_TYPE_ANY    2\n\nstruct MapPreviewScreen\n{\n    u8 mapsec;\n    u8 type;\n    u16 flagId;\n    const void *tilesptr;\n    const void *tilemapptr;\n    const void *palptr;\n};\n\nu16 MapPreview_CreateMapNameWindow(u8 id);\nvoid MapPreview_SetFlag(u16 a0);\nu16 MapPreview_GetDuration(u8 id);\nbool8 MapHasPreviewScreen(u8 mapsec, u8 type);\nbool32 ForestMapPreviewScreenIsRunning(void);\nconst struct MapPreviewScreen * GetDungeonMapPreviewScreenInfo(u8 mapsec);\nbool32 MapHasPreviewScreen_HandleQLState2(u8 mapsec, u8 type);\nvoid MapPreview_InitBgs(void);\nvoid MapPreview_LoadGfx(u8 mapsec);\nbool32 MapPreview_IsGfxLoadFinished(void);\nvoid MapPreview_Unload(s32 windowId);\nvoid MapPreview_StartForestTransition(u8 mapsec);\n\n#endif //GUARD_MAP_PREVIEW_SCREEN_H\n"
  },
  {
    "path": "include/math_util.h",
    "content": "#ifndef GUARD_MATH_UTIL_H\n#define GUARD_MATH_UTIL_H\n\n// Fixed-point arithmetic library.\n\n// x * y\ns16 Q_8_8_mul(s16 x, s16 y);\ns16 Q_N_S_mul(u8 s, s16 x, s16 y);\ns32 Q_24_8_mul(s32 x, s32 y);\n\n// x / y\ns16 Q_8_8_div(s16 x, s16 y);\ns16 Q_N_S_div(u8 s, s16 x, s16 y);\ns32 Q_24_8_div(s32 x, s32 y);\n\n// 1.0 / y\ns16 Q_8_8_inv(s16 y);\ns16 Q_N_S_inv(u8 s, s16 y);\ns32 Q_24_8_inv(s32 y);\n\n#endif //GUARD_MATH_UTIL_H\n"
  },
  {
    "path": "include/menu.h",
    "content": "#ifndef GUARD_MENU_H\n#define GUARD_MENU_H\n\n#include \"global.h\"\n#include \"text.h\"\n#include \"window.h\"\n\n#define MENU_NOTHING_CHOSEN -2\n#define MENU_B_PRESSED -1\n\n#define MENU_INFO_ICON_CAUGHT    0\n#define MENU_INFO_ICON_TYPE      (NUMBER_OF_MON_TYPES + 1)\n#define MENU_INFO_ICON_POWER     (NUMBER_OF_MON_TYPES + 2)\n#define MENU_INFO_ICON_ACCURACY  (NUMBER_OF_MON_TYPES + 3)\n#define MENU_INFO_ICON_PP        (NUMBER_OF_MON_TYPES + 4)\n#define MENU_INFO_ICON_EFFECT    (NUMBER_OF_MON_TYPES + 5)\n\nstruct MenuAction\n{\n    const u8 *text;\n    union {\n        void (*void_u8)(u8);\n        u8 (*u8_void)(void);\n    } func;\n};\n\n// menu2\nvoid AddTextPrinterParameterized3(u8 windowId, u8 fontId, u8 x, u8 y, const u8 * color, s8 speed, const u8 * str);\nvoid AddTextPrinterParameterized4(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, const u8 *color, s8 speed, const u8 *str);\nvoid AddTextPrinterParameterized5(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 letterSpacing, u8 lineSpacing);\nvoid Menu_PrintFormatIntlPlayerName(u8 windowId, const u8 * src, u16 x, u16 y);\nvoid StartBlendTask(u8 eva_start, u8 evb_start, u8 eva_end, u8 evb_end, u8 ev_step, u8 priority);\nbool8 IsBlendTaskActive(void);\nu8 Menu2_GetMonSpriteAnchorCoord(u16 species, u32 personality, u8 a2);\ns8 Menu2_GetMonSpriteAnchorCoordMinusx20(u16 species, u32 personality, u8 a2);\n\n// list_menu\nvoid ListMenu_LoadMonIconPalette(u8 palOffset, u16 speciesId);\nvoid ListMenu_DrawMonIconGraphics(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y);\nvoid ListMenuLoadStdPalAt(u8 palOffset, u8 palId);\nvoid BlitMenuInfoIcon(u8 windowId, u8 iconId, u16 x, u16 y);\n\n// menu\ns8 Menu_ProcessInputGridLayout(void);\nu8 MultichoiceGrid_InitCursor(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 cols, u8 rows, u8 cursorPos);\nvoid MultichoiceGrid_PrintItems(u8 windowId, u8 fontId, u8 itemWidth, u8 itemHeight, u8 cols, u8 rows, const struct MenuAction *strs);\nvoid DestroyYesNoMenu(void);\ns8 Menu_ProcessInputNoWrapClearOnChoose(void);\nvoid CreateYesNoMenu(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos);\nvoid AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *orderArray);\nvoid PrintMenuTable(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs);\nvoid MultichoiceList_PrintItems(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, u8 letterSpacing, u8 lineSpacing);\nvoid PrintTextArray(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs);\ns8 Menu_ProcessInputNoWrapAround_other(void);\ns8 Menu_ProcessInput_other(void);\ns8 Menu_ProcessInputNoWrapAround(void);\ns8 Menu_ProcessInput(void);\nu8 Menu_GetCursorPos(void);\nu8 Menu_MoveCursorNoWrapAround(s8 cursorDelta);\nu8 Menu_MoveCursor(s8 cursorDelta);\nu8 Menu_InitCursor(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos);\nu8 Menu_InitCursorInternal(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos, bool8 APressMuted);\nvoid TopBarWindowPrintTwoStrings(const u8 *string, const u8 *string2, bool8 fgColorChooser, u8 notUsed, bool8 copyToVram);\nvoid TopBarWindowPrintString(const u8 *string, u8 unUsed, bool8 copyToVram);\nvoid ClearTopBarWindow(void);\nvoid DestroyTopBarWindow(void);\nu8 CreateTopBarWindowLoadPalette(u8 bg, u8 width, u8 yPos, u8 palette, u16 baseTile);\nvoid ClearStdWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram);\nvoid DrawStdFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 baseTileNum, u8 paletteNum);\nvoid ClearDialogWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram);\nvoid DrawDialogFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 tileNum, u8 paletteNum);\nstruct WindowTemplate SetWindowTemplateFields(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock);\ns16 Menu_ProcessInputNoWrapAround2(void);\n\n#endif // GUARD_MENU_H\n"
  },
  {
    "path": "include/menu_helpers.h",
    "content": "#ifndef GUARD_MENU_HELPERS_H\n#define GUARD_MENU_HELPERS_H\n\n#include \"global.h\"\n#include \"task.h\"\n#include \"window.h\"\n\n#define MENU_L_PRESSED 1\n#define MENU_R_PRESSED 2\n\nstruct YesNoFuncTable\n{\n    TaskFunc yesFunc;\n    TaskFunc noFunc;\n};\n\nbool16 RunTextPrinters_CheckActive(u8 textPrinterId);\nbool8 IsActiveOverworldLinkBusy(void);\nbool8 MenuHelpers_ShouldWaitForLinkRecv(void);\nbool8 MenuHelpers_IsLinkActive(void);\nvoid SetVBlankHBlankCallbacksToNull(void);\nvoid ResetAllBgsCoordinatesAndBgCntRegs(void);\nu8 GetDialogBoxFontId(void);\nbool8 AdjustQuantityAccordingToDPadInput(s16 *quantity_p, u16 qmax);\nvoid DisplayMessageAndContinueTask(u8 taskId, u8 windowId, u16 tileNum, u8 paletteNum, u8 fontId, u8 textSpeed, const u8 *string, void *taskFunc);\nvoid CreateYesNoMenuWithCallbacks(u8 taskId, const struct WindowTemplate *template, u8 fontId, u8 left, u8 top, u16 tileStart, u8 palette, const struct YesNoFuncTable *yesNo);\nu8 GetLRKeysPressed(void);\nu8 GetLRKeysPressedAndHeld(void);\nbool8 IsHoldingItemAllowed(u16 itemId);\nbool8 IsWritingMailAllowed(u16 itemId);\nvoid ResetVramOamAndBgCntRegs(void);\n\n#endif //GUARD_MENU_HELPERS_H\n"
  },
  {
    "path": "include/menu_indicators.h",
    "content": "#ifndef GUARD_MENU_INDICATORS_H\n#define GUARD_MENU_INDICATORS_H\n\n#include \"global.h\"\n\nstruct ScrollArrowsTemplate\n{\n    u8 firstArrowType;\n    u8 firstX;\n    u8 firstY;\n    u8 secondArrowType;\n    u8 secondX;\n    u8 secondY;\n    u16 fullyUpThreshold;\n    u16 fullyDownThreshold;\n    u16 tileTag;\n    u16 palTag;\n    u8 palNum;\n};\n\nstruct CursorStruct\n{\n    u8 left;\n    u8 top;\n    u16 rowWidth;\n    u16 rowHeight;\n    u16 tileTag;\n    u16 palTag;\n    u8 palNum;\n};\n\nu8 AddScrollIndicatorArrowPairParameterized(u32 arrowType, s32 commonPos, s32 firstPos, s32 secondPos, s32 fullyDownThreshold, s32 tileTag, s32 palTag, u16 *scrollOffset);\nu8 AddScrollIndicatorArrowPair(const struct ScrollArrowsTemplate * template, u16 * a1);\nvoid RemoveScrollIndicatorArrowPair(u8);\nu8 ListMenuAddCursorObjectInternal(const struct CursorStruct *cursor, u32 cursorKind);\nu8 ListMenuAddRedOutlineCursorObject(const struct CursorStruct *cursor);\nvoid ListMenuUpdateRedOutlineCursorObject(u8 taskId, u16 x, u16 y);\nvoid ListMenuRemoveRedOutlineCursorObject(u8 taskId);\nvoid ListMenuRemoveCursorObject(u8 taskId, u32 cursorKind);\nvoid ListMenuUpdateCursorObject(u8 taskId, u16 x, u16 y, u32 cursorKind);\n\n#endif //GUARD_MENU_INDICATORS_H\n"
  },
  {
    "path": "include/metatile_behavior.h",
    "content": "#ifndef GUARD_METATILE_BEHAVIOR\n#define GUARD_METATILE_BEHAVIOR\n\n#include \"global.h\"\n\nbool8 MetatileBehavior_IsATile(u8 metatileBehavior);\nbool8 MetatileBehavior_IsJumpEast(u8 metatileBehavior);\nbool8 MetatileBehavior_IsJumpWest(u8 metatileBehavior);\nbool8 MetatileBehavior_IsJumpNorth(u8 metatileBehavior);\nbool8 MetatileBehavior_IsJumpSouth(u8 metatileBehavior);\nbool8 MetatileBehavior_IsPokeGrass(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSand(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSandOrShallowFlowingWater(u8 metatileBehavior);\nbool8 MetatileBehavior_IsDeepSand(u8 metatileBehavior);\nbool8 MetatileBehavior_IsReflective(u8 metatileBehavior);\nbool8 MetatileBehavior_IsIce(u8 metatileBehavior);\nbool8 MetatileBehavior_IsWarpDoor(u8 metatileBehavior);\nbool8 MetatileBehavior_IsWarpDoor_2(u8 metatileBehavior);\nbool8 MetatileBehavior_IsEscalator(u8 metatileBehavior);\nbool8 MetatileBehavior_IsDirectionalUpRightStairWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsDirectionalUpLeftStairWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsDirectionalDownRightStairWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsDirectionalDownLeftStairWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsDirectionalStairWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsLadder(u8 metatileBehavior);\nbool8 MetatileBehavior_IsNonAnimDoor(u8 metatileBehavior);\nbool8 MetatileBehavior_IsDeepSouthWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSurfable(u8 metatileBehavior);\nbool8 MetatileBehavior_IsFastWater(u8 metatileBehavior);\nbool8 MetatileBehavior_IsEastArrowWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsWestArrowWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsNorthArrowWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSouthArrowWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsForcedMovementTile(u8 metatileBehavior);\nbool8 MetatileBehavior_IsIce_2(u8 metatileBehavior);\nbool8 MetatileBehavior_IsTrickHouseSlipperyFloor(u8 metatileBehavior);\nbool8 MetatileBehavior_IsWalkNorth(u8 metatileBehavior);\nbool8 MetatileBehavior_IsWalkSouth(u8 metatileBehavior);\nbool8 MetatileBehavior_IsWalkWest(u8 metatileBehavior);\nbool8 MetatileBehavior_IsWalkEast(u8 metatileBehavior);\nbool8 MetatileBehavior_IsNorthwardCurrent(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSouthwardCurrent(u8 metatileBehavior);\nbool8 MetatileBehavior_IsWestwardCurrent(u8 metatileBehavior);\nbool8 MetatileBehavior_IsEastwardCurrent(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSlideNorth(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSlideSouth(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSlideWest(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSlideEast(u8 metatileBehavior);\nbool8 MetatileBehavior_IsCounter(u8 metatileBehavior);\nbool8 MetatileBehavior_IsPlayerFacingTVScreen(u8 metatileBehavior, u8 playerDirection);\nbool8 MetatileBehavior_IsPC(u8 metatileBehavior);\nbool8 MetatileBehavior_HasRipples(u8 metatileBehavior);\nbool8 MetatileBehavior_IsPuddle(u8 metatileBehavior);\nbool8 MetatileBehavior_IsTallGrass(u8 metatileBehavior);\nbool8 MetatileBehavior_IsLongGrass(u8 metatileBehavior);\nbool8 MetatileBehavior_IsAshGrass(u8 metatileBehavior);\nbool8 MetatileBehavior_IsFootprints(u8 metatileBehavior);\nbool8 MetatileBehavior_IsBridge(u8 metatileBehavior);\nbool8 MetatileBehavior_GetBridgeType(u8 metatileBehavior);\nbool8 MetatileBehavior_IsIndoorEncounter(u8 metatileBehavior);\nbool8 MetatileBehavior_IsMountain(u8 metatileBehavior);\nbool8 MetatileBehavior_IsDiveable(u8 metatileBehavior);\nbool8 MetatileBehavior_IsUnableToEmerge(u8 metatileBehavior);\nbool8 MetatileBehavior_IsShallowFlowingWater(u8 metatileBehavior);\nbool8 MetatileBehavior_IsThinIce(u8 metatileBehavior);\nbool8 MetatileBehavior_IsCrackedIce(u8 metatileBehavior);\nbool8 MetatileBehavior_IsDeepWaterTerrain(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSurfableAndNotWaterfall(u8 metatileBehavior);\nbool8 MetatileBehavior_IsEastBlocked(u8 metatileBehavior);\nbool8 MetatileBehavior_IsWestBlocked(u8 metatileBehavior);\nbool8 MetatileBehavior_IsNorthBlocked(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSouthBlocked(u8 metatileBehavior);\nbool8 MetatileBehavior_IsShortGrass(u8 metatileBehavior);\nbool8 MetatileBehavior_IsHotSprings(u8 metatileBehavior);\nbool8 MetatileBehavior_IsWaterfall(u8 metatileBehavior);\nbool8 MetatileBehavior_IsFortreeBridge(u8 metatileBehavior);\nbool8 MetatileBehavior_IsPacifidlogLog(u8 metatileBehavior);\nbool8 MetatileBehavior_IsRegionMap(u8 metatileBehavior);\nbool8 MetatileBehavior_IsLavaridgeB1FWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsLavaridge1FWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsWarpPad(u8 metatileBehavior);\nbool8 MetatileBehavior_IsUnionRoomWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsWater(u8 metatileBehavior);\nbool8 MetatileBehavior_IsFallWarp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsCrackedFloor(u8 metatileBehavior);\nbool32 MetatileBehavior_IsCyclingRoadPullDownTile(u8 metatileBehavior);\nbool8 MetatileBehavior_IsCyclingRoadPullDownTileGrass(u8 metatileBehavior);\nbool8 MetatileBehavior_IsBumpySlope(u8 metatileBehavior);\nbool8 MetatileBehavior_IsIsolatedVerticalRail(u8 metatileBehavior);\nbool8 MetatileBehavior_IsIsolatedHorizontalRail(u8 metatileBehavior);\nbool8 MetatileBehavior_IsVerticalRail(u8 metatileBehavior);\nbool8 MetatileBehavior_IsHorizontalRail(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSeaweed(u8 metatileBehavior);\nbool8 MetatileBehavior_IsRunningDisallowed(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSafariExtensionSign(u8 metatileBehavior, u8 playerDirection);\nbool8 MetatileBehavior_IsBookshelf(u8 metatileBehavior);\nbool8 MetatileBehavior_IsPokeMartShelf(u8 metatileBehavior);\nbool8 MetatileBehavior_IsPlayerFacingPokemonCenterSign(u8 metatileBehavior, u8 playerDirection);\nbool8 MetatileBehavior_IsPlayerFacingPokeMartSign(u8 metatileBehavior, u8 playerDirection);\nbool8 TestMetatileAttributeBit(u8 attr, u8 bitmask);\nbool8 MetatileBehavior_IsSpinRight(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSpinLeft(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSpinUp(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSpinDown(u8 metatileBehavior);\nbool8 MetatileBehavior_IsStopSpinning(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSpinTile(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSignpost(u8 metatileBehavior);\nbool8 MetatileBehavior_IsCabinet(u8 metatileBehavior);\nbool8 MetatileBehavior_IsKitchen(u8 metatileBehavior);\nbool8 MetatileBehavior_IsDresser(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSnacks(u8 metatileBehavior);\nbool8 MetatileBehavior_IsStrengthButton(u8 metatileBehavior);\nbool8 MetatileBehavior_IsPlayerFacingCableClubWirelessMonitor(u8 metatileBehavior, u8 playerDirection);\nbool8 MetatileBehavior_IsPlayerFacingBattleRecords(u8 metatileBehavior, u8 playerDirection);\nbool8 MetatileBehavior_IsQuestionnaire(u8 metatileBehavior);\nbool8 MetatileBehavior_IsIndigoPlateauSign1(u8 metatileBehavior);\nbool8 MetatileBehavior_IsIndigoPlateauSign2(u8 metatileBehavior);\nbool8 MetatileBehavior_IsFood(u8 metatileBehavior);\nbool8 MetatileBehavior_IsRockStairs(u8 metatileBehavior);\nbool8 MetatileBehavior_IsBlueprints(u8 metatileBehavior);\nbool8 MetatileBehavior_IsPainting(u8 metatileBehavior);\nbool8 MetatileBehavior_IsPowerPlantMachine(u8 metatileBehavior);\nbool8 MetatileBehavior_IsTelephone(u8 metatileBehavior);\nbool8 MetatileBehavior_IsComputer(u8 metatileBehavior);\nbool8 MetatileBehavior_IsAdvertisingPoster(u8 metatileBehavior);\nbool8 MetatileBehavior_IsTastyFood(u8 metatileBehavior);\nbool8 MetatileBehavior_IsTrashBin(u8 metatileBehavior);\nbool8 MetatileBehavior_IsCup(u8 metatileBehavior);\nbool8 MetatileBehavior_IsPolishedWindow(u8 metatileBehavior);\nbool8 MetatileBehavior_IsBeautifulSkyWindow(u8 metatileBehavior);\nbool8 MetatileBehavior_IsBlinkingLights(u8 metatileBehavior);\nbool8 MetatileBehavior_IsNeatlyLinedUpTools(u8 metatileBehavior);\nbool8 MetatileBehavior_IsImpressiveMachine(u8 metatileBehavior);\nbool8 MetatileBehavior_IsVideoGame(u8 metatileBehavior);\nbool8 MetatileBehavior_IsBurglary(u8 metatileBehavior);\nbool8 MetatileBehavior_IsTrainerTowerMonitor(u8 metatileBehavior);\nbool8 MetatileBehavior_IsAshGrass(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSecretBaseJumpMat(u8 metatileBehavior);\nbool8 MetatileBehavior_IsSecretBaseSpinMat(u8 metatileBehavior);\n\n#endif // GUARD_METATILE_BEHAVIOR\n"
  },
  {
    "path": "include/mini_printf.h",
    "content": "/*\n * The Minimal snprintf() implementation\n *\n * Copyright (c) 2013 Michal Ludvig <michal@logix.cz>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of the auhor nor the names of its contributors\n *       may be used to endorse or promote products derived from this software\n *       without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Courtey of https://github.com/mludvig/mini-printf\n * stripped to reduce file size for agb needs\n */\n\n#ifndef __MINI_PRINTF__\n#define __MINI_PRINTF__\n\n#include <stdarg.h>\n#include \"gba/types.h\"\n\n#ifdef NDEBUG\n\n#define mini_vsnprintf(buffer, buffer_len, fmt, va)\n#define mini_vpprintf(buf, fmt, va)\n\n#else\n\ns32 mini_vsnprintf(char* buffer, u32 buffer_len, const char *fmt, va_list va);\ns32 mini_vpprintf(void* buf, const char *fmt, va_list va);\n\n#endif\n#endif\n"
  },
  {
    "path": "include/minigame_countdown.h",
    "content": "#ifndef GUARD_MINIGAME_COUNTDOWN_H\n#define GUARD_MINIGAME_COUNTDOWN_H\n\nvoid StartMinigameCountdown(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority);\nbool32 IsMinigameCountdownRunning(void);\n\n#endif //GUARD_MINIGAME_COUNTDOWN_H\n"
  },
  {
    "path": "include/mon_markings.h",
    "content": "#ifndef GUARD_MON_MARKINGS_H\n#define GUARD_MON_MARKINGS_H\n\n#define NUM_MON_MARKINGS 4\n\nstruct MonMarkingsMenu\n{\n    /*0x0000*/ u16 baseTileTag;\n    /*0x0002*/ u16 basePaletteTag;\n    /*0x0004*/ u8 markings; // bit flags\n    /*0x0005*/ s8 cursorPos;\n    /*0x0006*/ bool8 markingsArray[NUM_MON_MARKINGS];\n    /*0x000A*/ u8 cursorBaseY;\n    /*0x000B*/ bool8 spriteSheetLoadRequired;\n    /*0x000C*/ struct Sprite *windowSprites[2]; // upper and lower halves of menu window\n    /*0x0014*/ struct Sprite *markingSprites[NUM_MON_MARKINGS];\n    /*0x0024*/ struct Sprite *cursorSprite;\n    /*0x0028*/ struct Sprite *textSprite;\n    /*0x002C*/ const u8 *frameTiles;\n    /*0x0030*/ const u16 *framePalette;\n    /*0x0034*/ u8 windowSpriteTiles[0x1000];\n    /*0x1034*/ u8 unused[0x80];\n    /*0x10B4*/ u8 tileLoadState;\n}; // 10b8\n\nvoid InitMonMarkingsMenu(struct MonMarkingsMenu *ptr);\nvoid BufferMonMarkingsMenuTiles(void);\nvoid OpenMonMarkingsMenu(u8 markings, s16 x, s16 y);\nvoid FreeMonMarkingsMenu(void);\nbool8 HandleMonMarkingsMenuInput(void);\nstruct Sprite *CreateMonMarkingAllCombosSprite(u16 tileTag, u16 paletteTag, const u16 *palette);\nstruct Sprite *CreateMonMarkingComboSprite(u16 tileTag, u16 paletteTag, const u16 *palette);\nvoid UpdateMonMarkingTiles(u8 markings, void *dest);\n\n#endif //GUARD_MON_MARKINGS_H\n"
  },
  {
    "path": "include/money.h",
    "content": "#ifndef GUARD_MONEY_H\n#define GUARD_MONEY_H\n\n#include \"global.h\"\n\nu32 GetMoney(u32 *moneyPtr);\nvoid SetMoney(u32 *moneyPtr, u32 newValue);\nbool8 IsEnoughMoney(u32 *moneyPtr, u32 cost);\nvoid AddMoney(u32 *moneyPtr, u32 toAdd);\nvoid RemoveMoney(u32 *moneyPtr, u32 toSub);\nbool8 IsEnoughForCostInVar0x8005(void);\nvoid SubtractMoneyFromVar0x8005(void);\nvoid PrintMoneyAmountInMoneyBox(u8 windowId, int amount, u8 speed);\nvoid PrintMoneyAmountInMoneyBox(u8 windowId, int amount, u8 speed);\nvoid PrintMoneyAmountInMoneyBoxWithBorder(u8 windowId, u16 tileStart, u8 pallete, int amount);\nvoid ChangeAmountInMoneyBox(int amount);\nvoid DrawMoneyBox(int amount, u8 x, u8 y);\nvoid HideMoneyBox(void);\nvoid AddMoneyLabelObject(u16 x, u16 y);\nvoid RemoveMoneyLabelObject(void);\nvoid PrintMoneyAmount(u8 windowId, u8 x, u8 y, int amount, u8 speed);\n\n#endif // GUARD_MONEY_H\n"
  },
  {
    "path": "include/multiboot.h",
    "content": "#ifndef GUARD_MULTIBOOT_H\n#define GUARD_MULTIBOOT_H\n\n#include \"global.h\"\n\n#define MULTIBOOT_MASTER_INFO            0x62\n#define MULTIBOOT_CLIENT_INFO            0x72\n#define MULTIBOOT_MASTER_START_PROBE     0x61\n#define MULTIBOOT_MASTER_REQUEST_DLREADY 0x63\n#define MULTIBOOT_CLIENT_DLREADY         0x73\n#define MULTIBOOT_MASTER_START_DL        0x64\n#define MULTIBOOT_MASTER_REQUEST_CRC     0x65\n#define MULTIBOOT_CLIENT_CALC_CRC        0x74\n#define MULTIBOOT_CLIENT_CRCREADY        0x75\n#define MULTIBOOT_MASTER_VERIFY_CRC      0x66\n\nvoid MultiBootInit(struct MultiBootParam *mp);\nint MultiBootMain(struct MultiBootParam *mp);\nvoid MultiBootStartProbe(struct MultiBootParam *mp);\nvoid MultiBootStartMaster(struct MultiBootParam *mp, const u8 *srcp, int length, u8 palette_color, s8 palette_speed);\nbool32 MultiBootCheckComplete(struct MultiBootParam *mp);\n\n#endif // GUARD_MULTIBOOT_H\n"
  },
  {
    "path": "include/mystery_event_msg.h",
    "content": "#ifndef GUARD_MYSTERY_EVENT_MSG_H\n#define GUARD_MYSTERY_EVENT_MSG_H\n\n#include \"gba/gba.h\"\n\nextern const u8 gText_MysteryGiftBerry[];\nextern const u8 gText_MysteryGiftBerryTransform[];\nextern const u8 gText_MysteryGiftBerryObtained[];\nextern const u8 gText_MysteryGiftSpecialRibbon[];\nextern const u8 gText_MysteryGiftNationalDex[];\nextern const u8 gText_MysteryGiftRareWord[];\nextern const u8 gText_MysteryGiftSentOver[];\nextern const u8 gText_MysteryGiftFullParty[];\nextern const u8 gText_MysteryGiftNewTrainer[];\nextern const u8 gText_MysteryGiftNewAdversaryInBattleTower[];\nextern const u8 gText_MysteryGiftCantBeUsed[];\n\n#endif // GUARD_MYSTERY_EVENT_MSG_H\n"
  },
  {
    "path": "include/mystery_event_script.h",
    "content": "#ifndef GUARD_MYSTERY_EVENT_SCRIPT_H\n#define GUARD_MYSTERY_EVENT_SCRIPT_H\n\n#include \"global.h\"\n\nu32 RunMysteryEventScript(u8 *);\nvoid SetMysteryEventScriptStatus(u32 val);\n\nvoid MEventScript_InitContext(u8 *);\nbool32 MEventScript_Run(u32 *);\n\n#endif // GUARD_MYSTERY_EVENT_SCRIPT_H\n"
  },
  {
    "path": "include/mystery_gift.h",
    "content": "#ifndef GUARD_MYSTERY_GIFT_H\n#define GUARD_MYSTERY_GIFT_H\n\n#include \"global.h\"\n#include \"main.h\"\n#include \"constants/mystery_gift.h\"\n\n#define CARD_STAT_BATTLES_WON   0\n#define CARD_STAT_BATTLES_LOST  1\n#define CARD_STAT_NUM_TRADES    2\n#define CARD_STAT_NUM_STAMPS    3\n#define CARD_STAT_MAX_STAMPS    4\n\nenum {\n    NEWS_INPUT_A,\n    NEWS_INPUT_B,\n    NEWS_INPUT_SCROLL_UP,\n    NEWS_INPUT_SCROLL_DOWN,\n    NEWS_INPUT_NONE = 0xFF\n};\n\nstruct MysteryGiftLinkGameData\n{\n    u32 unk_00;\n    u16 unk_04;\n    u32 unk_08;\n    u16 unk_0C;\n    u32 unk_10;\n    u16 flagId;\n    u16 questionnaireWords[NUM_QUESTIONNAIRE_WORDS];\n    struct WonderCardMetadata cardMetadata;\n    u8 maxStamps;\n    u8 playerName[PLAYER_NAME_LENGTH];\n    u8 playerTrainerId[TRAINER_ID_LENGTH];\n    u16 easyChatProfile[EASY_CHAT_BATTLE_WORDS_COUNT];\n    u8 gameCode[GAME_CODE_LENGTH];\n    u8 version;\n};\n\nstruct WonderGraphics\n{\n    u8 titleTextPal:4;\n    u8 bodyTextPal:4;\n    u8 footerTextPal:4;\n    u8 stampShadowPal:4;\n    const u8 * tiles;\n    const u8 * map;\n    const u16 * pal;\n};\n\nextern const u16 gCard1Pal[];\nextern const u16 gCard2Pal[];\nextern const u16 gCard3Pal[];\nextern const u16 gCard4Pal[];\nextern const u16 gCard5Pal[];\n\nstruct WonderNews * GetSavedWonderNews(void);\nstruct WonderCard * GetSavedWonderCard(void);\nstruct WonderCardMetadata * GetSavedWonderCardMetadata(void);\nstruct WonderNewsMetadata * GetSavedWonderNewsMetadata(void);\nbool32 SaveWonderNews(const struct WonderNews * news);\nbool32 ValidateSavedWonderNews(void);\nbool32 ValidateSavedWonderCard(void);\nbool32 IsWonderNewsSameAsSaved(const u8 * news);\nbool32 SaveWonderCard(const struct WonderCard * card);\nvoid DisableWonderCardSending(struct WonderCard * card);\nbool32 MysteryGift_TrySaveStamp(const u16 * stamp);\nvoid MysteryGift_LoadLinkGameData(struct MysteryGiftLinkGameData * data);\nbool32 MysteryGift_ValidateLinkGameData(const struct MysteryGiftLinkGameData * data);\nu32 MysteryGift_CompareCardFlags(const u16 * flagId, const struct MysteryGiftLinkGameData * data, const void *unused);\nu32 MysteryGift_CheckStamps(const u16 * stamp, const struct MysteryGiftLinkGameData * data, const void *unused);\nbool32 MysteryGift_DoesQuestionnaireMatch(const struct MysteryGiftLinkGameData * data, const u16 * words);\nu16 MysteryGift_GetCardStatFromLinkData(const struct MysteryGiftLinkGameData * data, u32 stat);\nbool32 WonderCard_Init(struct WonderCard * card, struct WonderCardMetadata * metadata);\nbool32 WonderNews_Init(const struct WonderNews * news);\ns32 WonderCard_Enter(void);\ns32 WonderNews_Enter(void);\nvoid ClearSavedWonderCardAndRelated(void);\nvoid ClearSavedWonderNewsAndRelated(void);\nvoid WonderCard_Destroy(void);\nvoid WonderNews_Destroy(void);\ns32 WonderCard_Exit(bool32 flag);\ns32 WonderNews_Exit(bool32 flag);\nbool32 IsSavedWonderCardGiftNotReceived(void);\nvoid WonderNews_AddScrollIndicatorArrowPair(void);\nvoid WonderNews_RemoveScrollIndicatorArrowPair(void);\nbool32 IsSendingSavedWonderNewsAllowed(void);\nbool32 IsSendingSavedWonderCardAllowed(void);\nu32 WonderNews_GetInput(u16 input);\nvoid ClearMysteryGift(void);\nu16 MysteryGift_GetCardStat(u32 stat);\nvoid MysteryGift_TryIncrementStat(u32 stat, u32 trainerId);\nu16 *GetQuestionnaireWordsPtr(void);\nvoid MysteryGift_DisableStats(void);\nbool32 MysteryGift_TryEnableStatsByFlagId(u16 flagId);\nu16 GetWonderCardFlagId(void);\n\n#endif // GUARD_MYSTERY_GIFT_H\n"
  },
  {
    "path": "include/mystery_gift_client.h",
    "content": "#ifndef GUARD_MYSTERY_GIFT_CLIENT_H\n#define GUARD_MYSTERY_GIFT_CLIENT_H\n\n#include \"mystery_gift_link.h\"\n\n// Return values for client functions called by MysteryGiftClient_Run\nenum {\n    CLI_RET_INIT,\n    CLI_RET_ACTIVE,\n    CLI_RET_YES_NO,\n    CLI_RET_PRINT_MSG,\n    CLI_RET_ASK_TOSS,\n    CLI_RET_COPY_MSG,\n    CLI_RET_END,\n};\n\n// IDs for client script instructions\nenum {\n    CLI_NONE,\n    CLI_RETURN,\n    CLI_RECV,\n    CLI_SEND_LOADED,\n    CLI_COPY_RECV,\n    CLI_YES_NO,\n    CLI_COPY_RECV_IF_N,\n    CLI_COPY_RECV_IF,\n    CLI_LOAD_GAME_DATA,\n    CLI_SAVE_NEWS,\n    CLI_SAVE_CARD,\n    CLI_PRINT_MSG,\n    CLI_COPY_MSG,\n    CLI_ASK_TOSS,\n    CLI_LOAD_TOSS_RESPONSE,\n    CLI_RUN_MEVENT_SCRIPT,\n    CLI_SAVE_STAMP,\n    CLI_SAVE_RAM_SCRIPT,\n    CLI_RECV_EREADER_TRAINER,\n    CLI_SEND_STAT,\n    CLI_SEND_READY_END,\n    CLI_RUN_BUFFER_SCRIPT,\n};\n\n// IDs for client messages when ending a script.\n// Given as the parameter to CLI_RETURN, and resolved to text in GetClientResultMessage\nenum {\n    CLI_MSG_NOTHING_SENT,\n    CLI_MSG_RECORD_UPLOADED,\n    CLI_MSG_CARD_RECEIVED,\n    CLI_MSG_NEWS_RECEIVED,\n    CLI_MSG_STAMP_RECEIVED,\n    CLI_MSG_HAD_CARD,\n    CLI_MSG_HAD_STAMP,\n    CLI_MSG_HAD_NEWS,\n    CLI_MSG_NO_ROOM_STAMPS,\n    CLI_MSG_COMM_CANCELED,\n    CLI_MSG_CANT_ACCEPT,\n    CLI_MSG_COMM_ERROR,\n    CLI_MSG_TRAINER_RECEIVED,\n    CLI_MSG_BUFFER_SUCCESS,\n    CLI_MSG_BUFFER_FAILURE,\n};\n\n#define CLIENT_MAX_MSG_SIZE 64\n\nstruct MysteryGiftClientCmd\n{\n    u32 instr;\n    u32 parameter;\n};\n\nstruct MysteryGiftClient\n{\n    u32 unused;\n    u32 param;\n    u32 funcId;\n    u32 funcState;\n    u32 cmdidx;\n    void *sendBuffer;\n    void *recvBuffer;\n    struct MysteryGiftClientCmd * script;\n    void *msg;\n    struct MysteryGiftLink link;\n};\n\nvoid MysteryGiftClient_Create(void);\nu32 MysteryGiftClient_Run(u16 * endVal);\nvoid MysteryGiftClient_AdvanceState(void);\nvoid * MysteryGiftClient_GetMsg(void);\nvoid MysteryGiftClient_SetParam(u32 value);\n\n#endif //GUARD_MYSTERY_GIFT_CLIENT_H\n"
  },
  {
    "path": "include/mystery_gift_link.h",
    "content": "#ifndef GUARD_MYSTERY_GIFT_LINK_H\n#define GUARD_MYSTERY_GIFT_LINK_H\n\n#define MG_LINK_BUFFER_SIZE 0x400\n\n// Send/receive ids for the Client/Server to make sure\n// they're sending/receiving the same thing\nenum {\n    MG_LINKID_CLIENT_SCRIPT = 16,\n    MG_LINKID_GAME_DATA,\n    MG_LINKID_GAME_STAT,\n    MG_LINKID_RESPONSE,\n    MG_LINKID_READY_END,\n    MG_LINKID_DYNAMIC_MSG,\n    MG_LINKID_CARD,\n    MG_LINKID_NEWS,\n    MG_LINKID_STAMP,\n    MG_LINKID_RAM_SCRIPT,\n    MG_LINKID_EREADER_TRAINER,\n    MG_LINKID_UNK_1,\n    MG_LINKID_UNK_2,\n};\n\nstruct MysteryGiftLink\n{\n    s32 state;\n    u8 sendPlayerId;\n    u8 recvPlayerId;\n    u16 recvIdent;\n    u16 recvCounter;\n    u16 recvCRC;\n    u16 recvSize;\n    u16 sendIdent;\n    u16 sendCounter;\n    u16 sendCRC;\n    u16 sendSize;\n    void * recvBuffer;\n    const void * sendBuffer;\n    u32 (*recvFunc)(struct MysteryGiftLink *);\n    u32 (*sendFunc)(struct MysteryGiftLink *);\n};\n\nvoid MysteryGiftLink_Init(struct MysteryGiftLink * link, u32 sendPlayerId, u32 recvPlayerId);\nvoid MysteryGiftLink_InitSend(struct MysteryGiftLink * link, u32 ident, const void * src, u32 size);\nbool32 MysteryGiftLink_Recv(struct MysteryGiftLink * link);\nbool32 MysteryGiftLink_Send(struct MysteryGiftLink * link);\nvoid MysteryGiftLink_InitRecv(struct MysteryGiftLink * link, u32 ident, void * dest);\n\n#endif //GUARD_MYSTERY_GIFT_LINK_H\n"
  },
  {
    "path": "include/mystery_gift_menu.h",
    "content": "#ifndef GUARD_MYSTERY_GIFT_MENU_H\n#define GUARD_MYSTERY_GIFT_MENU_H\n\nextern bool8 gGiftIsFromEReader;\n\nbool32 PrintMysteryGiftMenuMessage(u8 * cmdPtr, const u8 * src);\nvoid AddTextPrinterToWindow1(const u8 *str);\nvoid MainCB_FreeAllBuffersAndReturnToInitTitleScreen(void);\nvoid PrintMysteryGiftOrEReaderTopMenu(bool8, bool32);\nvoid CB2_InitMysteryGift(void);\nvoid CB2_MysteryGiftEReader(void);\ns8 DoMysteryGiftYesNo(u8 * textState, u16 * windowId, bool8 yesNoBoxPlacement, const u8 * str);\nvoid MG_DrawTextBorder(u8 windowId);\nu16 GetMysteryGiftBaseBlock(void);\n\n#endif //GUARD_MYSTERY_GIFT_MENU_H\n"
  },
  {
    "path": "include/mystery_gift_server.h",
    "content": "#ifndef GUARD_MYSTERY_GIFT_SERVER_H\n#define GUARD_MYSTERY_GIFT_SERVER_H\n\n#include \"global.h\"\n#include \"mystery_gift_link.h\"\n\n// Return values for Server_* functions.\n// Other than SVR_RET_END, effectively useless (not checked for).\nenum {\n    SVR_RET_INIT,\n    SVR_RET_ACTIVE,\n    SVR_RET_UNUSED,\n    SVR_RET_END\n};\n\n// IDs for server script instructions\nenum {\n    SVR_RETURN,\n    SVR_SEND,\n    SVR_RECV,\n    SVR_GOTO,\n    SVR_GOTO_IF_EQ,\n    SVR_COPY_GAME_DATA,\n    SVR_CHECK_GAME_DATA, // In Emerald, this was separated into SVR_CHECK_GAME_DATA_CARD and SVR_CHECK_GAME_DATA_NEWS\n    SVR_CHECK_EXISTING_CARD,\n    SVR_READ_RESPONSE,\n    SVR_CHECK_EXISTING_STAMPS,\n    SVR_GET_CARD_STAT,\n    SVR_CHECK_QUESTIONNAIRE,\n    SVR_COMPARE,\n    SVR_LOAD_CARD,\n    SVR_LOAD_NEWS,\n    SVR_LOAD_RAM_SCRIPT,\n    SVR_LOAD_STAMP,\n    SVR_LOAD_UNK_2,\n    SVR_LOAD_CLIENT_SCRIPT,\n    SVR_LOAD_EREADER_TRAINER,\n    SVR_LOAD_MSG,\n    SVR_COPY_STAMP,\n    SVR_COPY_CARD,\n    SVR_COPY_NEWS,\n    SVR_SET_RAM_SCRIPT,\n    SVR_SET_CLIENT_SCRIPT,\n    SVR_COPY_SAVED_CARD,\n    SVR_COPY_SAVED_NEWS,\n    SVR_COPY_SAVED_RAM_SCRIPT,\n    SVR_LOAD_UNK_1,\n};\n\n// Create arguments for SVR_LOAD_CLIENT_SCRIPT or SVR_LOAD_MSG\n// (a script/text size and pointer to send to the client)\n#define PTR_ARG(pointer) .param = sizeof(pointer), .ptr = pointer\n\n// IDs for server messages when ending a script.\n// Given as the parameter to SVR_RETURN, and resolved to text in GetServerResultMessage\nenum {\n    SVR_MSG_NOTHING_SENT,\n    SVR_MSG_RECORD_UPLOADED,\n    SVR_MSG_CARD_SENT,\n    SVR_MSG_NEWS_SENT,\n    SVR_MSG_STAMP_SENT,\n    SVR_MSG_HAS_CARD,\n    SVR_MSG_HAS_STAMP,\n    SVR_MSG_HAS_NEWS,\n    SVR_MSG_NO_ROOM_STAMPS,\n    SVR_MSG_CLIENT_CANCELED,\n    SVR_MSG_CANT_SEND_GIFT_1,\n    SVR_MSG_COMM_ERROR,\n    SVR_MSG_GIFT_SENT_1,\n    SVR_MSG_GIFT_SENT_2,\n    SVR_MSG_CANT_SEND_GIFT_2,\n};\n\nstruct MysteryGiftServerCmd\n{\n    u32 instr;\n    bool32 param;\n    const void *ptr;\n};\n\nstruct MysteryGiftServer\n{\n    u32 unused;\n    u32 param;\n    u32 funcId;\n    u32 cmdidx;\n    const struct MysteryGiftServerCmd * script;\n    void *recvBuffer;\n    struct WonderCard * card;\n    struct WonderNews * news;\n    struct MysteryGiftLinkGameData * linkGameData;\n    const void *ramScript;\n    u32 ramScriptSize;\n    const void *clientScript;\n    u32 clientScriptSize;\n    u32 stamp;\n    struct MysteryGiftLink manager;\n};\n\nvoid MysterGiftServer_CreateForNews(void);\nvoid MysterGiftServer_CreateForCard(void);\nu32 MysterGiftServer_Run(u16 * endVal);\n\n#endif //GUARD_MYSTERY_GIFT_SERVER_H\n"
  },
  {
    "path": "include/naming_screen.h",
    "content": "#ifndef GUARD_NAMING_SCREEN_H\n#define GUARD_NAMING_SCREEN_H\n\n#include \"global.h\"\n\n#define NAMING_SCREEN_PLAYER        0\n#define NAMING_SCREEN_BOX           1\n#define NAMING_SCREEN_CAUGHT_MON    2\n#define NAMING_SCREEN_NICKNAME      3\n#define NAMING_SCREEN_RIVAL         4\n\nvoid DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGender, u32 monPersonality, MainCallback returnCallback);\n\n#endif // GUARD_NAMING_SCREEN_H\n"
  },
  {
    "path": "include/new_game.h",
    "content": "#ifndef GUARD_NEW_GAME_H\n#define GUARD_NEW_GAME_H\n\n#include \"global.h\"\n\nextern bool8 gDifferentSaveFile;\n\nvoid SetTrainerId(u32 trainerId, u8 *dst);\nvoid CopyTrainerId(u8 *dst, u8 *src);\nvoid NewGameInitData(void);\nvoid ResetMenuAndMonGlobals(void);\nvoid Sav2_ClearSetDefault(void);\n\n#endif // GUARD_NEW_GAME_H\n"
  },
  {
    "path": "include/new_menu_helpers.h",
    "content": "#ifndef GUARD_NEW_MENU_HELPERS_H\n#define GUARD_NEW_MENU_HELPERS_H\n\n#include \"global.h\"\n#include \"text.h\"\n#include \"task.h\"\n\nextern const u16 gMenuMessageWindow_Gfx[];\n\nvoid ClearScheduledBgCopiesToVram(void);\nvoid ScheduleBgCopyTilemapToVram(u8 bgId);\nvoid DoScheduledBgTilemapCopiesToVram(void);\nvoid ResetTempTileDataBuffers(void);\nbool8 FreeTempTileDataBuffersIfPossible(void);\nvoid *DecompressAndCopyTileDataToVram(u8 bgId, const void *src, u32 size, u16 offset, u8 mode);\nvoid *DecompressAndCopyTileDataToVram2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode);\nvoid DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, u32 size, u16 offset, u8 mode);\nvoid DecompressAndLoadBgGfxUsingHeap2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode);\nvoid *MallocAndDecompress(const void *src, u32 * size);\nvoid SetBgTilemapPalette(u8 bgId, u8 left, u8 top, u8 width, u8 height, u8 palette);\nvoid CopyToBufferFromBgTilemap(u8 bgId, u16 *dest, u8 left, u8 top, u8 width, u8 height);\nvoid ResetBgPositions(void);\nvoid InitStandardTextBoxWindows(void);\nvoid FreeAllOverworldWindowBuffers(void);\nvoid InitTextBoxGfxAndPrinters(void);\nu16 RunTextPrinters_CheckPrinter0Active(void);\nu16 AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 fgColor, u8 bgColor, u8 shadowColor);\nvoid AddTextPrinterDiffStyle(bool8 allowSkippingDelayWithButtonPress);\nvoid AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress);\nvoid AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonPress, u8 speed);\nvoid LoadStdWindowFrameGfx(void);\nvoid DrawDialogueFrame(u8 windowId, bool8 transfer);\nvoid DrawStdWindowFrame(u8 windowId, bool8 copyNow);\nvoid ClearDialogWindowAndFrame(u8 windowId, bool8 copyToVram);\nvoid ClearStdWindowAndFrame(u8 windowId, bool8 copyNow);\nvoid EraseFieldMessageBox(bool8 copyToVram);\nvoid SetStdWindowBorderStyle(u8 windowId, bool8 copyToVram);\nvoid LoadMessageBoxAndFrameGfx(u8 windowId, bool8 copyToVram);\nvoid Menu_LoadStdPal(void);\nvoid Menu_LoadStdPalAt(u16 offset);\nvoid DisplayItemMessageOnField(u8 taskId, u8 fontId, const u8 *src, TaskFunc callback);\nvoid DisplayYesNoMenuDefaultYes(void);\nvoid DisplayYesNoMenuDefaultNo(void);\nu8 GetTextSpeedSetting(void);\nu8 CreateStartMenuWindow(u8 height);\nu8 GetStartMenuWindowId(void);\nvoid RemoveStartMenuWindow(void);\nu16 GetStdWindowBaseTileNum(void);\nvoid DrawHelpMessageWindowWithText(const u8 * text);\nvoid DestroyHelpMessageWindow_(void);\nvoid LoadSignpostWindowFrameGfx(void);\nvoid SetDefaultFontsPointer(void);\n\n#endif // GUARD_NEW_MENU_HELPERS_H\n"
  },
  {
    "path": "include/oak_speech.h",
    "content": "#ifndef GUARD_OAK_SPEECH_H\n#define GUARD_OAK_SPEECH_H\n\nvoid StartNewGameScene(void);\n\n#endif //GUARD_OAK_SPEECH_H\n"
  },
  {
    "path": "include/option_menu.h",
    "content": "#ifndef GUARD_OPTION_MENU_H\n#define GUARD_OPTION_MENU_H\n\nvoid CB2_OptionsMenuFromStartMenu(void);\n\n#endif //GUARD_OPTION_MENU_H\n"
  },
  {
    "path": "include/orre_met_location_strings.h",
    "content": "#ifndef GUARD_ORRE_MET_LOCATION_STRINGS_H\n#define GUARD_ORRE_MET_LOCATION_STRINGS_H\n\nextern const u8 gAgate_Village[];\nextern const u8 gDeep_Colosseum[];\nextern const u8 gLaboratory[];\nextern const u8 gMayors_House[];\nextern const u8 gMirors_Hideout[];\nextern const u8 gOutskirt_Stand[];\nextern const u8 gPhenac_City[];\nextern const u8 gPyrite_Bldg[];\nextern const u8 gPyrite_Cave[];\nextern const u8 gPyrite_Town[];\nextern const u8 gRealgam_Tower[];\nextern const u8 gRealgamTwr_Dome[];\nextern const u8 gSnagem_Hideout[];\nextern const u8 gThe_Under[];\nextern const u8 gThe_Under_Subway[];\nextern const u8 gTower_Colosseum[];\nextern const u8 gCave[];\nextern const u8 gCipher_Key_Lair[];\nextern const u8 gCipher_Lab[];\nextern const u8 gCitadark_Isle[];\nextern const u8 gGateon_Port[];\nextern const u8 gMt_Battle[];\nextern const u8 gOasis[];\nextern const u8 gPokemon_HQ_Lab[];\nextern const u8 gRock[];\nextern const u8 gXD_Eevee_Met_Location[];\nextern const u8 gColosseum_Starter_Met_Location[];\nextern const u8 gDukings_Plusle[];\nextern const u8 gXD_Eevee_Met_Location_JP[];\nextern const u8 gColosseum_Starter_Met_Location_JP[];\nextern const u8 gDukings_Plusle_JP[];\nextern const u8 gOtherText_MetDistantLand[];\n\n// Pokemon Box Egg string\nextern const u8 gText_PeculiarEggPokemonBox[];\nextern const u8 gText_Azusa[];\n\n#endif // GUARD_ORRE_MET_LOCATION_STRINGS_H\n"
  },
  {
    "path": "include/overworld.h",
    "content": "#ifndef GUARD_OVERWORLD_H\n#define GUARD_OVERWORLD_H\n\n#include \"global.h\"\n#include \"main.h\"\n\n#define LINK_KEY_CODE_NULL 0x00\n#define LINK_KEY_CODE_EMPTY 0x11\n#define LINK_KEY_CODE_DPAD_DOWN 0x12\n#define LINK_KEY_CODE_DPAD_UP 0x13\n#define LINK_KEY_CODE_DPAD_LEFT 0x14\n#define LINK_KEY_CODE_DPAD_RIGHT 0x15\n#define LINK_KEY_CODE_READY 0x16\n#define LINK_KEY_CODE_EXIT_ROOM 0x17\n#define LINK_KEY_CODE_START_BUTTON 0x18\n#define LINK_KEY_CODE_A_BUTTON 0x19\n#define LINK_KEY_CODE_IDLE 0x1A\n\n// These two are a hack to stop user input until link stuff can be\n// resolved.\n#define LINK_KEY_CODE_HANDLE_RECV_QUEUE 0x1B\n#define LINK_KEY_CODE_HANDLE_SEND_QUEUE 0x1C\n\n#define LINK_KEY_CODE_EXIT_SEAT 0x1D\n\n#define MOVEMENT_MODE_FREE 0\n#define MOVEMENT_MODE_FROZEN 1\n#define MOVEMENT_MODE_SCRIPTED 2\n\nstruct LinkPlayerObjectEvent\n{\n    u8 active;\n    u8 linkPlayerId;\n    u8 objEventId;\n    u8 movementMode;\n};\n\nstruct CreditsOverworldCmd\n{\n    s16 unk_0;\n    s16 unk_2;\n    s16 unk_4;\n};\n\n/* gDisableMapMusicChangeOnMapLoad */\n#define MUSIC_DISABLE_OFF 0\n#define MUSIC_DISABLE_STOP 1\n#define MUSIC_DISABLE_KEEP 2\n\nextern const struct Coords32 gDirectionToVectors[];\n\nextern struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4];\nextern MainCallback gFieldCallback;\n\nextern struct WarpData gLastUsedWarp;\n\nextern u8 gExitStairsMovementDisabled;\nextern u8 gFieldLinkPlayerCount;\nextern u8 gLocalLinkPlayerId;\n\nvoid IncrementGameStat(u8 index);\n\nvoid SetObjEventTemplateCoords(u8, s16, s16);\nvoid SetObjEventTemplateMovementType(u8, u8);\nvoid ResetObjEventTemplateMovementType(u8 localId);\n\nvoid SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y);\n\nvoid SetDynamicWarp(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId);\nvoid SetDynamicWarpWithCoords(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y);\nvoid SetFixedDiveWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y);\nvoid SetFixedHoleWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y);\nvoid SetEscapeWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y);\nvoid Overworld_SetHealLocationWarp(u8);\nvoid SetWarpDestinationToEscapeWarp(void);\nvoid SetWarpDestinationToLastHealLocation(void);\nu8 IsMapTypeOutdoors(u8 mapType);\nvoid Overworld_ClearSavedMusic(void);\nbool32 Overworld_MusicCanOverrideMapMusic(u16 song);\n\nvoid SetFlashLevel(s32 a1);\nu8 Overworld_GetFlashLevel(void);\n\nvoid Overworld_SetSavedMusic(u16);\nvoid Overworld_ChangeMusicToDefault(void);\nvoid Overworld_ChangeMusicTo(u16);\n\nbool32 IsUpdateLinkStateCBActive(void);\n\nvoid ClearLinkPlayerObjectEvents(void);\nconst struct MapHeader *const Overworld_GetMapHeaderByGroupAndId(u16, u16);\nvoid ObjectEventMoveDestCoords(struct ObjectEvent *, u32, s16 *, s16 *);\nvoid CB2_ReturnToField(void);\nvoid CB2_ReturnToFieldContinueScriptPlayMapMusic(void);\nvoid WarpIntoMap(void);\nu8 GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum);\nvoid SetWarpDestinationToMapWarp(s8 mapGroup, s8 mapNum, s8 warpNum);\nvoid SetWarpDestinationToDynamicWarp(u8 unused);\n\nu32 GetGameStat(u8 statId);\nvoid SetGameStat(u8 statId, u32 value);\n\nvoid CB2_ContinueSavedGame(void);\nvoid Overworld_SetWarpDestinationFromWarp(struct WarpData *);\nvoid CB2_SetUpOverworldForQLPlayback(void);\nvoid CB2_SetUpOverworldForQLPlaybackWithWarpExit(void);\nvoid CB2_EnterFieldFromQuestLog(void);\nvoid Overworld_PlaySpecialMapMusic(void);\n\nu8 GetCurrentRegionMapSectionId(void);\n\nvoid SetCurrentMapLayout(u16 mapLayoutId);\nvoid SetWarpDestinationToFixedHoleWarp(s16 x, s16 y);\n\nvoid ResetInitialPlayerAvatarState(void);\nvoid CleanupOverworldWindowsAndTilemaps(void);\nu32 ComputeWhiteOutMoneyLoss(void);\n\nextern u8 gDisableMapMusicChangeOnMapLoad;\nextern u8 gGlobalFieldTintMode;\n\nextern bool8 (* gFieldCallback2)(void);\n\nvoid SetLastHealLocationWarp(u32 healLocaionId);\nvoid LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum);\nvoid CB2_ReturnToFieldFromDiploma(void);\nvoid CB2_OverworldBasic(void);\nvoid CB2_NewGame(void);\nbool8 IsMapTypeOutdoors(u8 mapType);\nbool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType);\nvoid Overworld_ResetStateAfterTeleport(void);\n\nvoid Overworld_FadeOutMapMusic(void);\nvoid CB2_LoadMap(void);\nbool8 BGMusicStopped(void);\nbool8 IsMapTypeIndoors(u8 mapType);\nbool32 Overworld_IsBikingAllowed(void);\nvoid Overworld_ResetStateAfterDigEscRope(void);\nbool32 Overworld_LinkRecvQueueLengthMoreThan2(void);\nu8 GetCurrentMapType(void);\n\nu8 GetLastUsedWarpMapType(void);\nconst struct MapHeader *const GetDestinationWarpMapHeader(void);\nvoid TryFadeOutOldMapMusic(void);\nvoid CB2_ReturnToFieldCableClub(void);\nvoid ResetGameStats(void);\n\nvoid Overworld_CreditsMainCB(void);\nbool32 Overworld_DoScrollSceneForCredits(u8 *, const struct CreditsOverworldCmd *, u8);\n\nbool32 IsSendingKeysOverCable(void);\n\nvoid CB2_ReturnToFieldWithOpenMenu(void);\nvoid CB2_WhiteOut(void);\nvoid CB2_ReturnToFieldFromMultiplayer(void);\nvoid ApplyNewEncryptionKeyToGameStats(u32 newKey);\nvoid SetContinueGameWarpToDynamicWarp(int);\n\nvoid SetContinueGameWarpToHealLocation(u8 loc);\n\nvoid UpdateAmbientCry(s16 *state, u16 *delayCounter);\nvoid SetWarpDestinationToHealLocation(u8 a0);\nbool32 Overworld_SendKeysToLinkIsRunning(void);\nbool32 Overworld_RecvKeysFromLinkIsRunning(void);\nvoid OverworldWhiteOutGetMoneyLoss(void);\nu8 GetCurrentMapBattleScene(void);\nvoid Overworld_ResetStateAfterFly(void);\nbool8 MetatileBehavior_IsSurfableInSeafoamIslands(u16 metatileBehavior);\nvoid Overworld_ResetMapMusic(void);\nu16 QueueExitLinkRoomKey(void);\nu16 SetInCableClubSeat(void);\nu32 GetCableClubPartnersReady(void);\nu16 SetStartedCableClubActivity(void);\nu16 SetLinkWaitingForScript(void);\nvoid SetMainCallback1(MainCallback cb);\nvoid CB1_Overworld(void);\nvoid CB2_ReturnToFieldContinueScript(void);\nu8 GetLastUsedWarpMapSectionId(void);\nvoid StoreInitialPlayerAvatarState(void);\nvoid UpdateEscapeWarp(s16 x, s16 y);\nbool8 SetDiveWarpEmerge(u16 x, u16 y);\nbool8 SetDiveWarpDive(u16 x, u16 y);\nvoid DoMapLoadLoop(u8 *state);\nvoid SetInitialPlayerAvatarStateWithDirection(u8 dirn);\nbool8 CheckNationalDexEligibilityOnSaveLoad(void);\nbool8 DoCoordsMatchPMCExitMat(void);\n\nextern u16 *gBGTilemapBuffers1;\nextern u16 *gBGTilemapBuffers2;\nextern u16 *gBGTilemapBuffers3;\nextern u16 gHeldKeyCodeToSend;\n\n#endif //GUARD_OVERWORLD_H\n"
  },
  {
    "path": "include/palette.h",
    "content": "#ifndef GUARD_PALETTE_H\n#define GUARD_PALETTE_H\n\n#include \"global.h\"\n\n#define gPaletteFade_selectedPalettes (gPaletteFade.multipurpose1) // normal and fast fade\n#define gPaletteFade_blendCnt         (gPaletteFade.multipurpose1) // hardware fade\n#define gPaletteFade_delay            (gPaletteFade.multipurpose2) // normal and hardware fade\n#define gPaletteFade_submode          (gPaletteFade.multipurpose2) // fast fade\n\n#define PLTT_BUFFER_SIZE (PLTT_SIZE / sizeof(u16))\n\n#define PALETTE_FADE_STATUS_DELAY 2\n#define PALETTE_FADE_STATUS_ACTIVE 1\n#define PALETTE_FADE_STATUS_DONE 0\n#define PALETTE_FADE_STATUS_LOADING 0xFF\n\n#define PALETTES_BG      0x0000FFFF\n#define PALETTES_OBJECTS 0xFFFF0000\n#define PALETTES_ALL     (PALETTES_BG | PALETTES_OBJECTS)\n\n#define PLTT_ID(n) ((n) * 16)\n#define BG_PLTT_OFFSET 0x000\n#define OBJ_PLTT_OFFSET 0x100\n#define BG_PLTT_ID(n) (BG_PLTT_OFFSET + PLTT_ID(n))\n#define OBJ_PLTT_ID(n) (OBJ_PLTT_OFFSET + PLTT_ID(n))\n#define OBJ_PLTT_ID2(n) (PLTT_ID((n) + 16))\n\nenum\n{\n    FAST_FADE_IN_FROM_WHITE,\n    FAST_FADE_OUT_TO_WHITE,\n    FAST_FADE_IN_FROM_BLACK,\n    FAST_FADE_OUT_TO_BLACK,\n};\n\nstruct PaletteFadeControl\n{\n    u32 multipurpose1;\n    u8 delayCounter:6;\n    u16 y:5; // blend coefficient\n    u16 targetY:5; // target blend coefficient\n    u16 blendColor:15;\n    u16 active:1;\n    u16 multipurpose2:6;\n    u16 yDec:1; // whether blend coefficient is decreasing\n    u16 bufferTransferDisabled:1;\n    u16 mode:2;\n    u16 shouldResetBlendRegisters:1;\n    u16 hardwareFadeFinishing:1;\n    u16 softwareFadeFinishingCounter:5;\n    u16 softwareFadeFinishing:1;\n    u16 objPaletteToggle:1;\n    u8 deltaY:4; // rate of change of blend coefficient\n    u32 unused;\n};\n\nextern struct PaletteFadeControl gPaletteFade;\nextern u32 gPlttBufferTransferPending;\nextern u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE];\nextern u16 gPlttBufferFaded[PLTT_BUFFER_SIZE];\nextern u8 gPaletteDecompressionBuffer[];\n\nvoid LoadCompressedPalette(const u32 *src, u16 offset, u16 size);\nvoid LoadPalette(const void *src, u16 offset, u16 size);\nvoid FillPalette(u16 value, u16 offset, u16 size);\nvoid TransferPlttBuffer(void);\nu8 UpdatePaletteFade(void);\nvoid ResetPaletteFade(void);\nvoid ReadPlttIntoBuffers(void);\nbool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor);\nvoid ResetPaletteFadeControl(void);\nvoid InvertPlttBuffer(u32 selectedPalettes);\nvoid TintPlttBuffer(u32 selectedPalettes, s8 r, s8 g, s8 b);\nvoid UnfadePlttBuffer(u32 selectedPalettes);\nvoid BeginFastPaletteFade(u8 submode);\nvoid BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters);\nvoid BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color);\nvoid BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color);\nvoid TintPalette_GrayScale(u16 *palette, u16 count);\nvoid TintPalette_GrayScale2(u16 *palette, u16 count);\nvoid TintPalette_SepiaTone(u16 *palette, u16 count);\nvoid TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone);\nvoid PaletteStruct_ResetById(u16 id);\nvoid CopyPaletteInvertedTint(const u16 *src, u16 *dst, u16 count, u8 tone);\nvoid BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id);\nbool32 IsBlendPalettesGraduallyTaskActive(u8 var);\nvoid DestroyBlendPalettesGraduallyTask(void);\n\nstatic inline void SetBackdropFromColor(u16 color)\n{\n  FillPalette(color, 0, PLTT_SIZEOF(1));\n}\n\nstatic inline void SetBackdropFromPalette(const u16 *palette)\n{\n  LoadPalette(palette, 0, PLTT_SIZEOF(1));\n}\n\n#endif // GUARD_PALETTE_H\n"
  },
  {
    "path": "include/palette_util.h",
    "content": "#ifndef GUARD_PALETTE_UTIL_H\n#define GUARD_PALETTE_UTIL_H\n\nstruct PulseBlendSettings\n{\n    u16 blendColor;\n    u16 paletteOffset;\n    u8 numColors;\n    u8 delay;\n    u8 numFadeCycles;\n    s8 maxBlendCoeff:4;\n    s8 fadeType:2;\n    s8 restorePaletteOnUnload:1;\n    s8 unk7_7:1;\n};\n\nstruct PulseBlendPalette\n{\n    u8 paletteSelector;\n    u8 blendCoeff:4;\n    u8 fadeDirection:1;\n    s8 unk1_5:1;\n    s8 available:1;\n    u32 inUse:1;\n    u8 delayCounter;\n    u8 fadeCycleCounter;\n    struct PulseBlendSettings pulseBlendSettings;\n};\n\nstruct PulseBlend\n{\n    u16 usedPulseBlendPalettes;\n    struct PulseBlendPalette pulseBlendPalettes[16];\n};\n\n#define FLASHUTIL_USE_EXISTING_COLOR (1 << 15)\n\nstruct RouletteFlashSettings\n{\n    u16 color;\n    u16 paletteOffset;\n    u8 numColors;\n    u8 delay;\n    u8 unk6;      // Set but never used\n    s8 numFadeCycles:5;\n    s8 unk7_5:2;  // Set but never used\n    s8 colorDeltaDir:1;\n};\n\nstruct RouletteFlashPalette\n{\n    u8 state:7;\n    u8 available:1;\n    u8 delayCounter;\n    s8 fadeCycleCounter;\n    s8 colorDelta;\n    struct RouletteFlashSettings settings;\n};\n\nstruct RouletteFlashUtil\n{\n    u8 enabled;\n    u8 unused;\n    u16 flags;\n    struct RouletteFlashPalette palettes[16];\n};\n\nvoid RouletteFlash_Reset(struct RouletteFlashUtil *);\nu8 RouletteFlash_Add(struct RouletteFlashUtil *, u8, const struct RouletteFlashSettings *);\nvoid RouletteFlash_Run(struct RouletteFlashUtil *);\nvoid RouletteFlash_Enable(struct RouletteFlashUtil *, u16);\nvoid RouletteFlash_Stop(struct RouletteFlashUtil *, u16);\nvoid InitPulseBlend(struct PulseBlend *);\nint InitPulseBlendPaletteSettings(struct PulseBlend *, const struct PulseBlendSettings *);\nstatic void ClearPulseBlendPalettesSettings(struct PulseBlendPalette *);\nvoid UnloadUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);\nvoid MarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);\nvoid UnmarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);\nvoid UpdatePulseBlend(struct PulseBlend *);\nvoid FillTilemapRect(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height);\nvoid SetTilemapRect(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height);\n\n#endif // GUARD_PALETTE_UTIL_H\n"
  },
  {
    "path": "include/party_menu.h",
    "content": "#ifndef GUARD_PARTY_MENU_H\n#define GUARD_PARTY_MENU_H\n\n#include \"main.h\"\n#include \"task.h\"\n#include \"constants/party_menu.h\"\n\nstruct PartyMenu\n{\n    MainCallback exitCallback;\n    TaskFunc task;\n    u8 menuType:4;\n    u8 layout:2;\n    u8 chooseMonsBattleType:2;\n    s8 slotId;\n    s8 slotId2;\n    u8 action;\n    u16 bagItem;\n    s16 data[2];\n};\n\n#define TMHM_COUNT 58\nextern const u16 gTMHMMoves[TMHM_COUNT];\n\nextern struct PartyMenu gPartyMenu;\nextern bool8 gPartyMenuUseExitCallback;\nextern u8 gSelectedMonPartyId;\nextern MainCallback gPostMenuFieldCallback;\nextern u8 gSelectedOrderFromParty[3];\nextern u8 gBattlePartyCurrentOrder[PARTY_SIZE / 2];\n\nextern void (*gItemUseCB)(u8, TaskFunc);\n\nvoid InitPartyMenu(u8 menuType, u8 layout, u8 partyAction, bool8 keepCursorPos, u8 messageId, TaskFunc task, MainCallback callback);\nvoid AnimatePartySlot(u8 slot, u8 animNum);\nbool8 IsMultiBattle(void);\nu8 GetCursorSelectionMonId(void);\nu8 GetPartyMenuType(void);\nvoid Task_HandleChooseMonInput(u8 taskId);\nu8 *GetMonNickname(struct Pokemon *mon, u8 *dest);\nu8 DisplayPartyMenuMessage(const u8 *str, bool8 keepOpen);\nbool8 IsPartyMenuTextPrinterActive(void);\nvoid PartyMenuModifyHP(u8 taskId, u8 slot, s8 hpIncrement, s16 hpDifference, TaskFunc task);\nu8 GetAilmentFromStatus(u32 status);\nu8 GetMonAilment(struct Pokemon *mon);\nvoid DisplayPartyMenuStdMessage(u32 stringId);\nvoid LoadHeldItemIcons(void);\nvoid DrawHeldItemIconsForTrade(u8 *partyCounts, u8 *partySpriteIds, u8 whichParty);\nvoid SpriteCB_BounceConfirmCancelButton(u8 spriteId, u8 spriteId2, u8 animNum);\nvoid CB2_SelectBagItemToGive(void);\nvoid CB2_GiveHoldItem(void);\nbool8 FieldCallback_PrepareFadeInFromMenu(void);\nvoid CB2_ReturnToPartyMenuFromFlyMap(void);\nvoid SetUsedFlyQuestLogEvent(const u8 *healLocCtrlData);\nvoid CB2_ShowPartyMenuForItemUse(void);\nvoid ItemUseCB_Medicine(u8 taskId, TaskFunc func);\nvoid ItemUseCB_MedicineStep(u8 taskId, TaskFunc func);\nvoid ItemUseCB_TryRestorePP(u8 taskId, TaskFunc func);\nvoid ItemUseCB_PPUp(u8 taskId, TaskFunc func);\nu16 ItemIdToBattleMoveId(u16 item);\nbool8 IsMoveHm(u16 move);\nbool8 MonKnowsMove(struct Pokemon *mon, u16 move);\nvoid ItemUseCB_TMHM(u8 taskId, TaskFunc func);\nvoid ItemUseCB_RareCandy(u8 taskId, TaskFunc func);\nvoid ItemUseCB_SacredAsh(u8 taskId, TaskFunc func);\nvoid ItemUseCB_EvolutionStone(u8 taskId, TaskFunc func);\nu8 GetItemEffectType(u16 item);\nvoid CB2_PartyMenuFromStartMenu(void);\nvoid CB2_ChooseMonToGiveItem(void);\nvoid ChooseMonToGiveMailFromMailbox(void);\nvoid InitChooseMonsForBattle(u8 chooseMonsBattleType);\nvoid ClearSelectedPartyOrder(void);\nvoid ChooseMonForTradingBoard(u8 menuType, MainCallback callback);\nvoid ChooseMonForMoveTutor(void);\nvoid ChooseMonForWirelessMinigame(void);\nvoid OpenPartyMenuInTutorialBattle(u8 partyAction);\nvoid Pokedude_OpenPartyMenuInBattle(void);\nvoid Pokedude_ChooseMonForInBattleItem(void);\nvoid EnterPartyFromItemMenuInBattle(void);\nvoid BufferBattlePartyCurrentOrder(void);\nvoid BufferBattlePartyCurrentOrderBySide(u8 battlerId, u8 flankId);\nvoid SwitchPartyOrderLinkMulti(u8 battlerId, u8 slot, u8 slot2);\nvoid SwitchPartyMonSlots(u8 slot, u8 slot2);\nu8 GetPartyIdFromBattlePartyId(u8 battlePartyId);\nvoid ShowPartyMenuToShowcaseMultiBattleParty(void);\nvoid ChooseMonForDaycare(void);\nvoid ChoosePartyMonByMenuType(u8 menuType);\nvoid ItemUseCB_ReduceEV(u8 taskId, TaskFunc task);\nvoid ItemUseCB_ReduceEV2(u8 taskId, TaskFunc task);\n\n#endif // GUARD_PARTY_MENU_H\n"
  },
  {
    "path": "include/pc_screen_effect.h",
    "content": "#ifndef GUARD_PC_SCREEN_EFFECT_H\n#define GUARD_PC_SCREEN_EFFECT_H\n\nvoid BeginPCScreenEffect_TurnOn(u16 xspeed, u16 yspeed, u8 priority);\nvoid BeginPCScreenEffect_TurnOff(u16 xspeed, u16 yspeed, u8 priority);\nbool8 IsPCScreenEffectRunning_TurnOff(void);\nbool8 IsPCScreenEffectRunning_TurnOn(void);\n\n#endif //GUARD_PC_SCREEN_EFFECT_H\n"
  },
  {
    "path": "include/play_time.h",
    "content": "#ifndef GUARD_PLAY_TIME_H\n#define GUARD_PLAY_TIME_H\n\n#include \"global.h\"\n\nvoid PlayTimeCounter_Reset(void);\nvoid PlayTimeCounter_Start(void);\nvoid PlayTimeCounter_Stop(void);\nvoid PlayTimeCounter_Update(void);\nvoid PlayTimeCounter_SetToMax(void);\n\n#endif // GUARD_PLAY_TIME_H\n"
  },
  {
    "path": "include/player_pc.h",
    "content": "#ifndef GUARD_PLAYER_PC_H\n#define GUARD_PLAYER_PC_H\n\n#include \"global.h\"\n#include \"list_menu.h\"\n\n// Exported type declarations\n\nstruct PlayerPCItemPageStruct\n{\n    u16 itemsAbove;\n    u16 cursorPos;\n    u8 pageItems;\n    u8 count;\n    u8 filler_6[3];\n    bool8 notInRoom;\n    u8 scrollIndicatorId;\n    u8 filler_B[5];\n};\n\n// Exported RAM declarations\nextern struct PlayerPCItemPageStruct gPlayerPcMenuManager;\n\n// Exported ROM declarations\n\nvoid NewGameInitPCItems(void);\nvoid Mailbox_ReturnToMailListAfterDeposit(void);\n\n#endif //GUARD_PLAYER_PC_H\n"
  },
  {
    "path": "include/pokeball.h",
    "content": "#ifndef GUARD_POKEBALL_H\n#define GUARD_POKEBALL_H\n\n#include \"global.h\"\n\nenum\n{\n    BALL_POKE,\n    BALL_GREAT,\n    BALL_SAFARI,\n    BALL_ULTRA,\n    BALL_MASTER,\n    BALL_NET,\n    BALL_DIVE,\n    BALL_NEST,\n    BALL_REPEAT,\n    BALL_TIMER,\n    BALL_LUXURY,\n    BALL_PREMIER,\n    POKEBALL_COUNT\n};\n\nenum {\n    BALL_AFFINE_ANIM_0,\n    BALL_ROTATE_RIGHT,\n    BALL_ROTATE_LEFT,\n    BALL_AFFINE_ANIM_3,\n    BALL_AFFINE_ANIM_4\n};\n\nextern const struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT];\nextern const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT];\nextern const struct SpriteTemplate gBallSpriteTemplates[];\n\n#define POKEBALL_PLAYER_SENDOUT     0xFF\n#define POKEBALL_OPPONENT_SENDOUT   0xFE\n\nu8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow);\nvoid CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 delay, u32 fadePalettes);\nu8 CreateTradePokeballSprite(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 delay, u32 fadePalettes);\nvoid DoHitAnimHealthboxEffect(u8 bank);\nvoid LoadBallGfx(u8 ballId);\nvoid FreeBallGfx(u8 ballId);\nvoid StartHealthboxSlideIn(u8 battler);\nvoid DestroySpriteAndFreeResources_Ball(struct Sprite *sprite);\n\n#endif // GUARD_POKEBALL_H\n"
  },
  {
    "path": "include/pokedex.h",
    "content": "#ifndef GUARD_POKEDEX_H\n#define GUARD_POKEDEX_H\n\nenum\n{\n    DEX_MODE_KANTO,\n    DEX_MODE_NATIONAL\n};\n\nenum\n{\n    FLAG_GET_SEEN,\n    FLAG_GET_CAUGHT,\n    FLAG_SET_SEEN,\n    FLAG_SET_CAUGHT\n};\n\n// IDs for the pokedex area markers\nenum {\n    DEX_AREA_NONE,\n    DEX_AREA_PALLET_TOWN,\n    DEX_AREA_VIRIDIAN_CITY,\n    DEX_AREA_PEWTER_CITY,\n    DEX_AREA_CERULEAN_CITY,\n    DEX_AREA_LAVENDER_TOWN,\n    DEX_AREA_VERMILION_CITY,\n    DEX_AREA_CELADON_CITY,\n    DEX_AREA_FUCHSIA_CITY,\n    DEX_AREA_CINNABAR_ISLAND,\n    DEX_AREA_INDIGO_PLATEAU,\n    DEX_AREA_SAFFRON_CITY,\n    DEX_AREA_ROUTE_1,\n    DEX_AREA_ROUTE_2,\n    DEX_AREA_ROUTE_3,\n    DEX_AREA_ROUTE_4,\n    DEX_AREA_ROUTE_5,\n    DEX_AREA_ROUTE_6,\n    DEX_AREA_ROUTE_7,\n    DEX_AREA_ROUTE_8,\n    DEX_AREA_ROUTE_9,\n    DEX_AREA_ROUTE_10,\n    DEX_AREA_ROUTE_11,\n    DEX_AREA_ROUTE_12,\n    DEX_AREA_ROUTE_13,\n    DEX_AREA_ROUTE_14,\n    DEX_AREA_ROUTE_15,\n    DEX_AREA_ROUTE_16,\n    DEX_AREA_ROUTE_17,\n    DEX_AREA_ROUTE_18,\n    DEX_AREA_ROUTE_19,\n    DEX_AREA_ROUTE_20,\n    DEX_AREA_ROUTE_21,\n    DEX_AREA_ROUTE_22,\n    DEX_AREA_ROUTE_23,\n    DEX_AREA_ROUTE_24,\n    DEX_AREA_ROUTE_25,\n    DEX_AREA_VIRIDIAN_FOREST,\n    DEX_AREA_DIGLETTS_CAVE,\n    DEX_AREA_MT_MOON,\n    DEX_AREA_CERULEAN_CAVE,\n    DEX_AREA_ROCK_TUNNEL,\n    DEX_AREA_POWER_PLANT,\n    DEX_AREA_POKEMON_TOWER,\n    DEX_AREA_SAFARI_ZONE,\n    DEX_AREA_SEAFOAM_ISLANDS,\n    DEX_AREA_POKEMON_MANSION,\n    DEX_AREA_VICTORY_ROAD,\n    DEX_AREA_ONE_ISLAND,\n    DEX_AREA_TWO_ISLAND,\n    DEX_AREA_THREE_ISLAND,\n    DEX_AREA_FOUR_ISLAND,\n    DEX_AREA_FIVE_ISLAND,\n    DEX_AREA_SIX_ISLAND, // Not associated with any MAPSEC\n    DEX_AREA_SEVEN_ISLAND, // Not associated with any MAPSEC\n    DEX_AREA_KINDLE_ROAD,\n    DEX_AREA_TREASURE_BEACH,\n    DEX_AREA_CAPE_BRINK,\n    DEX_AREA_BOND_BRIDGE,\n    DEX_AREA_THREE_ISLE_PATH,\n    DEX_AREA_RESORT_GORGEOUS,\n    DEX_AREA_WATER_LABYRINTH,\n    DEX_AREA_FIVE_ISLE_MEADOW,\n    DEX_AREA_MEMORIAL_PILLAR,\n    DEX_AREA_OUTCAST_ISLAND,\n    DEX_AREA_GREEN_PATH,\n    DEX_AREA_WATER_PATH,\n    DEX_AREA_RUIN_VALLEY,\n    DEX_AREA_TRAINER_TOWER,\n    DEX_AREA_CANYON_ENTRANCE,\n    DEX_AREA_SEVAULT_CANYON,\n    DEX_AREA_TANOBY_RUINS,\n    DEX_AREA_MT_EMBER,\n    DEX_AREA_BERRY_FOREST,\n    DEX_AREA_ICEFALL_CAVE,\n    DEX_AREA_LOST_CAVE,\n    DEX_AREA_ALTERING_CAVE,\n    DEX_AREA_PATTERN_BUSH,\n    DEX_AREA_DOTTED_HOLE,\n    DEX_AREA_TANOBY_CHAMBER,\n};\n\nstruct PokedexEntry\n{\n    /*0x00*/ u8 categoryName[12];\n    /*0x0C*/ u16 height; //in decimeters\n    /*0x0E*/ u16 weight; //in hectograms\n    /*0x10*/ const u8 *description_FR;\n    /*0x14*/ const u8 *description_LG;\n    /*0x18*/ u16 unused;\n    /*0x1A*/ u16 pokemonScale;\n    /*0x1C*/ u16 pokemonOffset;\n    /*0x1E*/ u16 trainerScale;\n    /*0x20*/ u16 trainerOffset;\n};  /*size = 0x24*/\n\nvoid ResetPokedex(void);\nvoid CopyMonCategoryText(u16 species, u8 *dst);\nu16 GetPokedexHeightWeight(u16 dexNum, u8 data);\nu16 GetNationalPokedexCount(u8);\nu16 GetKantoPokedexCount(u8);\nbool16 HasAllMons(void);\nu8 CreateDexDisplayMonDataTask(u16 dexNum, u32 trainerId, u32 personality);\ns8 GetSetPokedexFlag(u16 nationalNum, u8 caseId);\nu16 GetNationalPokedexCount(u8);\nu16 GetKantoPokedexCount(u8);\nbool16 HasAllHoennMons(void);\nbool16 HasAllKantoMons(void);\nbool16 HasAllMons(void);\nbool16 HasAllExtendedMons(void);\nu16 GetExtendedPokedexCount(u8 caseID);\nbool16 HasNationalMon(void);\nu8 DexScreen_RegisterMonToPokedex(u16 species);\nbool16 HasAllKantoMonsNew(void);\nbool16 HasAllMonsNew(void);\n\n#endif // GUARD_POKEDEX_H\n"
  },
  {
    "path": "include/pokedex_area_markers.h",
    "content": "#ifndef GUARD_POKEDEX_AREA_MARKERS_H\n#define GUARD_POKEDEX_AREA_MARKERS_H\n\nvoid GetAreaMarkerSubsprite(s32 i, s32 dexArea, struct Subsprite * subsprites);\nvoid DestroyPokedexAreaMarkers(u8 taskId);\nu8 CreatePokedexAreaMarkers(u16 species, u16 tilesTag, u8 palIdx, u8 y);\nu8 GetNumPokedexAreaMarkers(u8 taskId);\n\n#endif //GUARD_POKEDEX_AREA_MARKERS_H\n"
  },
  {
    "path": "include/pokedex_screen.h",
    "content": "#ifndef GUARD_POKEDEX_SCREEN_H\n#define GUARD_POKEDEX_SCREEN_H\n\n#define DEX_CATEGORY_GRASSLAND      0\n#define DEX_CATEGORY_FOREST         1\n#define DEX_CATEGORY_WATERS_EDGE    2\n#define DEX_CATEGORY_SEA            3\n#define DEX_CATEGORY_CAVE           4\n#define DEX_CATEGORY_MOUNTAIN       5\n#define DEX_CATEGORY_ROUGH_TERRAIN  6\n#define DEX_CATEGORY_URBAN          7\n#define DEX_CATEGORY_RARE           8\n#define DEX_CATEGORY_COUNT          9\n\n#define DEX_ORDER_NUMERICAL_KANTO    0\n#define DEX_ORDER_ATOZ               1\n#define DEX_ORDER_TYPE               2\n#define DEX_ORDER_LIGHTEST           3\n#define DEX_ORDER_SMALLEST           4\n#define DEX_ORDER_NUMERICAL_NATIONAL 5\n\n#define DEX_MODE(name) (DEX_CATEGORY_COUNT + DEX_ORDER_##name)\n\n#include \"pokedex.h\"\n\nextern const struct PokedexEntry gPokedexEntries[];\n\nvoid CB2_OpenPokedexFromStartMenu(void);\ns8 DexScreen_GetSetPokedexFlag(u16 nationalDexNo, u8 caseId, bool8 indexIsSpecies);\n\n#endif //GUARD_POKEDEX_SCREEN_H\n"
  },
  {
    "path": "include/pokemon.h",
    "content": "#ifndef GUARD_POKEMON_H\n#define GUARD_POKEMON_H\n\n#include \"global.h\"\n#include \"sprite.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/species.h\"\n\nstruct PokemonSubstruct0\n{\n    u16 species;\n    u16 heldItem;\n    u32 experience;\n    u8 ppBonuses;\n    u8 friendship;\n    u16 boxHP:10;\n    u16 boxStatus:4;\n    u16 forme:2;\n};\n\nstruct PokemonSubstruct1\n{\n    u16 moves[MAX_MON_MOVES];\n    u8 pp[MAX_MON_MOVES];\n};\n\nstruct PokemonSubstruct2\n{\n    u8 hpEV;\n    u8 attackEV;\n    u8 defenseEV;\n    u8 speedEV;\n    u8 spAttackEV;\n    u8 spDefenseEV;\n    u8 cool;\n    u8 beauty;\n    u8 cute;\n    u8 smart;\n    u8 tough;\n    u8 sheen;\n};\n\nstruct PokemonSubstruct3\n{\n /* 0x00 */ u8 pokerus;\n /* 0x01 */ u8 metLocation;\n\n /* 0x02 */ u16 metLevel:7;\n /* 0x02 */ u16 metGame:4;\n /* 0x03 */ u16 pokeball:4;\n /* 0x03 */ u16 otGender:1;\n\n /* 0x04 */ u32 hpIV:5;\n /* 0x04 */ u32 attackIV:5;\n /* 0x05 */ u32 defenseIV:5;\n /* 0x05 */ u32 speedIV:5;\n /* 0x05 */ u32 spAttackIV:5;\n /* 0x06 */ u32 spDefenseIV:5;\n /* 0x07 */ u32 isEgg:1;\n /* 0x07 */ u32 abilityNum:1;\n\n /* 0x08 */ u32 coolRibbon:3;               // Stores the highest contest rank achieved in the Cool category.\n /* 0x08 */ u32 beautyRibbon:3;             // Stores the highest contest rank achieved in the Beauty category.\n /* 0x08 */ u32 cuteRibbon:3;               // Stores the highest contest rank achieved in the Cute category.\n /* 0x09 */ u32 smartRibbon:3;              // Stores the highest contest rank achieved in the Smart category.\n /* 0x09 */ u32 toughRibbon:3;              // Stores the highest contest rank achieved in the Tough category.\n /* 0x09 */ u32 championRibbon:1;           // Given when defeating the Champion. Because both RSE and FRLG use it, later generations don't specify from which region it comes from.\n /* 0x0A */ u32 winningRibbon:1;            // Given at the Battle Tower's Level 50 challenge by winning a set of seven battles that extends the current streak to 56 or more.\n /* 0x0A */ u32 victoryRibbon:1;            // Given at the Battle Tower's Level 100 challenge by winning a set of seven battles that extends the current streak to 56 or more.\n /* 0x0A */ u32 artistRibbon:1;             // Given at the Contest Hall by winning a Master Rank contest with at least 800 points, and agreeing to have the Pokémon's portrait placed in the museum after being offered.\n /* 0x0A */ u32 effortRibbon:1;             // Given at Slateport's market to Pokémon with maximum EVs.\n /* 0x0A */ u32 marineRibbon:1;             // Never distributed.\n /* 0x0A */ u32 landRibbon:1;               // Never distributed.\n /* 0x0A */ u32 skyRibbon:1;                // Never distributed.\n /* 0x0A */ u32 countryRibbon:1;            // Distributed during Pokémon Festa '04 and '05 to tournament winners.\n /* 0x0B */ u32 nationalRibbon:1;           // Given to purified Shadow Pokémon in Colosseum/XD.\n /* 0x0B */ u32 earthRibbon:1;              // Given to teams that have beaten Mt. Battle's 100-battle challenge in Colosseum/XD.\n /* 0x0B */ u32 worldRibbon:1;              // Distributed during Pokémon Festa '04 and '05 to tournament winners.\n /* 0x0B */ u32 unusedRibbons:4;            // Discarded in Gen 4.\n\n // The functionality of this bit changed in FRLG:\n // In RS, this bit does nothing, is never set, & is accidentally unset when hatching Eggs.\n // In FRLG & Emerald, this controls Mew & Deoxys obedience and whether they can be traded.\n // If set, a Pokémon is a fateful encounter in FRLG's summary screen if hatched & for all Pokémon in Gen 4+ summary screens.\n // Set for in-game event island legendaries, events distributed after a certain date, & Pokémon from XD: Gale of Darkness.\n // Not to be confused with METLOC_FATEFUL_ENCOUNTER.\n /* 0x0B */ u32 modernFatefulEncounter:1;\n};\n\n// Number of bytes in the largest Pokémon substruct.\n// They are assumed to be the same size, and will be padded to\n// the largest size by the union.\n// By default they are all 12 bytes.\n#define NUM_SUBSTRUCT_BYTES (max(sizeof(struct PokemonSubstruct0),     \\\n                             max(sizeof(struct PokemonSubstruct1),     \\\n                             max(sizeof(struct PokemonSubstruct2),     \\\n                                 sizeof(struct PokemonSubstruct3)))))\n\nunion PokemonSubstruct\n{\n    struct PokemonSubstruct0 type0;\n    struct PokemonSubstruct1 type1;\n    struct PokemonSubstruct2 type2;\n    struct PokemonSubstruct3 type3;\n    u16 raw[NUM_SUBSTRUCT_BYTES / 2]; // /2 because it's u16, not u8\n};\n\nstruct BoxPokemon\n{\n    u32 personality;\n    u32 otId;\n    u8 nickname[POKEMON_NAME_LENGTH];\n    u8 language;\n    u8 isBadEgg:1;\n    u8 hasSpecies:1;\n    u8 isEgg:1;\n    u8 blockBoxRS:1; // Unused, but Pokémon Box Ruby & Sapphire will refuse to deposit a Pokémon with this flag set\n    u8 unused:4;\n    u8 otName[PLAYER_NAME_LENGTH];\n    u8 markings;\n    u16 checksum;\n    u16 unknown;\n\n    union\n    {\n        u32 raw[(NUM_SUBSTRUCT_BYTES * 4) / 4]; // *4 because there are 4 substructs, /4 because it's u32, not u8\n        union PokemonSubstruct substructs[4];\n    } secure;\n};\n\nstruct Pokemon\n{\n    struct BoxPokemon box;\n    u32 status;\n    u8 level;\n    u8 mail;\n    u16 hp;\n    u16 maxHP;\n    u16 attack;\n    u16 defense;\n    u16 speed;\n    u16 spAttack;\n    u16 spDefense;\n};\n\nstruct BattleTowerPokemon\n{\n    /*0x00*/ u16 species;\n    /*0x02*/ u16 heldItem;\n    /*0x04*/ u16 moves[MAX_MON_MOVES];\n    /*0x0C*/ u8 level;\n    /*0x0D*/ u8 ppBonuses;\n    /*0x0E*/ u8 hpEV;\n    /*0x0F*/ u8 attackEV;\n    /*0x10*/ u8 defenseEV;\n    /*0x11*/ u8 speedEV;\n    /*0x12*/ u8 spAttackEV;\n    /*0x13*/ u8 spDefenseEV;\n    /*0x14*/ u32 otId;\n    /*0x18*/ u32 hpIV:5;\n             u32 attackIV:5;\n             u32 defenseIV:5;\n             u32 speedIV:5;\n             u32 spAttackIV:5;\n             u32 spDefenseIV:5;\n             u32 gap:1;\n             u32 abilityNum:1;\n    /*0x1C*/ u32 personality;\n    /*0x20*/ u8 nickname[POKEMON_NAME_LENGTH + 1];\n    /*0x2B*/ u8 friendship;\n};\n\nstruct BattlePokemon\n{\n    /*0x00*/ u16 species;\n    /*0x02*/ u16 attack;\n    /*0x04*/ u16 defense;\n    /*0x06*/ u16 speed;\n    /*0x08*/ u16 spAttack;\n    /*0x0A*/ u16 spDefense;\n    /*0x0C*/ u16 moves[MAX_MON_MOVES];\n    /*0x14*/ u32 hpIV:5;\n    /*0x14*/ u32 attackIV:5;\n    /*0x15*/ u32 defenseIV:5;\n    /*0x15*/ u32 speedIV:5;\n    /*0x16*/ u32 spAttackIV:5;\n    /*0x17*/ u32 spDefenseIV:5;\n    /*0x17*/ u32 isEgg:1;\n    /*0x17*/ u32 abilityNum:1;\n    /*0x18*/ s8 statStages[NUM_BATTLE_STATS];\n    /*0x20*/ u8 ability;\n    /*0x21*/ u8 type1;\n    /*0x22*/ u8 type2;\n    /*0x23*/ u8 unknown;\n    /*0x24*/ u8 pp[MAX_MON_MOVES];\n    /*0x28*/ u16 hp;\n    /*0x2A*/ u8 level;\n    /*0x2B*/ u8 friendship;\n    /*0x2C*/ u16 maxHP;\n    /*0x2E*/ u16 item;\n    /*0x30*/ u8 nickname[POKEMON_NAME_LENGTH + 1];\n    /*0x3B*/ u8 ppBonuses;\n    /*0x3C*/ u8 otName[PLAYER_NAME_LENGTH + 1];\n    /*0x44*/ u32 experience;\n    /*0x48*/ u32 personality;\n    /*0x4C*/ u32 status1;\n    /*0x50*/ u32 status2;\n    /*0x54*/ u32 otId;\n};\n\nstruct SpeciesInfo\n{\n /* 0x00 */ u8 baseHP;\n /* 0x01 */ u8 baseAttack;\n /* 0x02 */ u8 baseDefense;\n /* 0x03 */ u8 baseSpeed;\n /* 0x04 */ u8 baseSpAttack;\n /* 0x05 */ u8 baseSpDefense;\n /* 0x06 */ u8 types[2];\n /* 0x08 */ u8 catchRate;\n /* 0x09 */ u8 expYield;\n /* 0x0A */ u16 evYield_HP:2;\n /* 0x0A */ u16 evYield_Attack:2;\n /* 0x0A */ u16 evYield_Defense:2;\n /* 0x0A */ u16 evYield_Speed:2;\n /* 0x0B */ u16 evYield_SpAttack:2;\n /* 0x0B */ u16 evYield_SpDefense:2;\n /* 0x0C */ u16 itemCommon;\n /* 0x0E */ u16 itemRare;\n /* 0x10 */ u8 genderRatio;\n /* 0x11 */ u8 eggCycles;\n /* 0x12 */ u8 friendship;\n /* 0x13 */ u8 growthRate;\n /* 0x14 */ u8 eggGroups[2];\n /* 0x16 */ u8 abilities[2];\n /* 0x18 */ u8 safariZoneFleeRate;\n /* 0x19 */ u8 bodyColor : 7;\n            u8 noFlip : 1;\n};\n\nstruct BattleMove\n{\n    u8 effect;\n    u8 power;\n    u8 type;\n    u8 accuracy;\n    u8 pp;\n    u8 secondaryEffectChance;\n    u8 target;\n    s8 priority;\n    u8 flags;\n};\n\n#define SPINDA_SPOT_WIDTH 16\n#define SPINDA_SPOT_HEIGHT 16\n\nstruct SpindaSpot\n{\n    u8 x, y;\n    u16 image[SPINDA_SPOT_HEIGHT];\n};\n\nstruct __attribute__((packed)) LevelUpMove\n{\n    u16 move:9;\n    u16 level:7;\n};\n\nstruct Evolution\n{\n    u16 method;\n    u16 param;\n    u16 targetSpecies;\n    u16 param2;\n};\n\n#define NUM_UNOWN_FORMS 28\n\n#define GET_UNOWN_LETTER(personality) ((   \\\n      (((personality) & 0x03000000) >> 18) \\\n    | (((personality) & 0x00030000) >> 12) \\\n    | (((personality) & 0x00000300) >> 6)  \\\n    | (((personality) & 0x00000003) >> 0)  \\\n) % NUM_UNOWN_FORMS)\n\n#define GET_SHINY_VALUE(otId, personality) (HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality))\n\nextern const struct BattleMove gBattleMoves[];\nextern u8 gPlayerPartyCount;\nextern struct Pokemon gPlayerParty[PARTY_SIZE];\nextern u8 gEnemyPartyCount;\nextern struct Pokemon gEnemyParty[PARTY_SIZE];\nextern const struct SpeciesInfo gSpeciesInfo[];\nextern const u8 *const gItemEffectTable[];\nextern const u8 gStatStageRatios[][2];\nextern struct SpriteTemplate gMultiuseSpriteTemplate;\nextern struct PokemonStorage* gPokemonStoragePtr;\nextern const u32 gExperienceTables[][MAX_LEVEL + 1];\nextern const u16 *const gLevelUpLearnsets[];\nextern const u8 gFacilityClassToPicIndex[];\nextern const u8 gFacilityClassToTrainerClass[];\nextern const struct SpriteTemplate gSpriteTemplates_Battlers[];\nextern const u8 gPPUpGetMask[];\nextern const u16 gEvolutionLines[NUM_SPECIES][EVOS_PER_LINE];\n\nvoid ZeroBoxMonData(struct BoxPokemon *boxMon);\nvoid ZeroMonData(struct Pokemon *mon);\nvoid ZeroPlayerPartyMons(void);\nvoid ZeroEnemyPartyMons(void);\nvoid CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId);\nvoid CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId);\nvoid CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature);\nvoid CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter);\nvoid CreateMaleMon(struct Pokemon *mon, u16 species, u8 level);\nvoid CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality);\nvoid CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread);\nvoid CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src);\nvoid ConvertPokemonToBattleTowerPokemon(struct Pokemon *mon, struct BattleTowerPokemon *dest);\nvoid CalculateMonStats(struct Pokemon *mon, bool8 calcOverride);\nvoid BoxMonToMon(struct BoxPokemon *src, struct Pokemon *dest);\nu8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon);\nu16 GiveMoveToMon(struct Pokemon *mon, u16 move);\nu16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move);\nvoid SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot);\nvoid SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot);\nu16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove);\nvoid DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move);\ns32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 battlerIdAtk, u8 battlerIdDef);\n\n#define BATTLE_ALIVE_EXCEPT_ACTIVE  0\n#define BATTLE_ALIVE_ATK_SIDE       1\n#define BATTLE_ALIVE_DEF_SIDE       2\n\nu8 CountAliveMonsInBattle(u8 caseId);\n\nu8 GetDefaultMoveTarget(u8 battlerId);\nu8 GetMonGender(struct Pokemon *mon);\nu8 GetBoxMonGender(struct BoxPokemon *boxMon);\nu8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality);\nvoid SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition);\nvoid SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition);\n\n// These are full type signatures for GetMonData() and GetBoxMonData(),\n// but they are not used since some code erroneously omits the third arg.\n// u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data);\n// u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data);\n\n#ifdef IS_POKEMON_C\nu32 GetMonData(struct Pokemon *, s32, u8 *);\nu32 GetBoxMonData(struct BoxPokemon *, s32, u8 *);\n#else\nu32 GetMonData();\nu32 GetBoxMonData();\n#endif // IS_POKEMON_C\n\nvoid SetMonData(struct Pokemon *mon, s32 field, const void *dataArg);\nvoid SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg);\nvoid CopyMon(void *dest, void *src, size_t size);\nu8 GiveMonToPlayer(struct Pokemon *mon);\nu8 SendMonToPC(struct Pokemon* mon);\nu8 CalculatePlayerPartyCount(void);\nu8 CalculateEnemyPartyCount(void);\nu8 GetMonsStateToDoubles(void);\nu8 GetAbilityBySpecies(u16 species, bool8 abilityNum);\nu8 GetMonAbility(struct Pokemon *mon);\nu8 GetSecretBaseTrainerPicIndex(void);\nu8 GetSecretBaseTrainerNameIndex(void);\nbool8 IsPlayerPartyAndPokemonStorageFull(void);\nvoid bufferspeciesname(u8 *name, u16 species);\nu8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex);\nvoid RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex);\nvoid RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex);\nbool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex);\nbool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, bool8 usedByAI);\nbool8 PokemonItemUseNoEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex);\nu8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit);\nconst u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId);\nu8 GetNature(struct Pokemon *mon);\nu16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem);\nu16 NationalPokedexNumToSpecies(u16 nationalNum);\nu16 SpeciesToNationalPokedexNum(u16 species);\nu16 HoennToNationalOrder(u16 hoennNum);\nu16 SpeciesToCryId(u16 species);\nvoid DrawSpindaSpots(u16 species, u32 personality, u8 *dest, bool8 isFrontPic);\nvoid EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies);\nbool8 GetPlayerFlankId(void);\nbool16 GetLinkTrainerFlankId(u8 linkPlayerId);\ns32 GetBattlerMultiplayerId(u16 a1);\nu8 GetTrainerEncounterMusicId(u16 trainer);\nvoid AdjustFriendship(struct Pokemon *mon, u8 event);\nvoid MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies);\nu16 GetMonEVCount(struct Pokemon *mon);\nvoid RandomlyGivePartyPokerus(struct Pokemon *party);\nu8 CheckPartyPokerus(struct Pokemon *party, u8 party_bm);\nu8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection);\nvoid PartySpreadPokerus(struct Pokemon *party);\nbool8 TryIncrementMonLevel(struct Pokemon *mon);\nu32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm);\nu8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves);\nu8 GetLevelUpMovesBySpecies(u16 species, u16 *moves);\nu8 GetNumberOfRelearnableMoves(struct Pokemon *mon);\nu16 SpeciesToPokedexNum(u16 species);\nvoid ClearBattleMonForms(void);\nvoid PlayBattleBGM(void);\nvoid PlayMapChosenOrBattleBGM(u16 songId);\nconst u32 *GetMonFrontSpritePal(struct Pokemon *mon);\nconst u32 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality);\nconst struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon);\nconst struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality);\nbool32 IsHMMove2(u16 move);\nbool8 IsMonSpriteNotFlipped(u16 species);\ns8 GetFlavorRelationByPersonality(u32 personality, u8 flavor);\nbool8 IsTradedMon(struct Pokemon *mon);\nbool8 IsOtherTrainer(u32 otId, u8 *otName);\nvoid MonRestorePP(struct Pokemon *mon);\nvoid BoxMonRestorePP(struct BoxPokemon *boxMon);\nvoid SetMonPreventsSwitchingString(void);\nvoid SetWildMonHeldItem(void);\nbool8 IsMonShiny(struct Pokemon *mon);\nu8 *GetTrainerPartnerName(void);\nu8 GetPlayerPartyHighestLevel(void);\nu16 FacilityClassToPicIndex(u16 facilityClass);\nbool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId);\nvoid SetDeoxysStats(void);\nu16 GetUnionRoomTrainerPic(void);\nu16 GetUnionRoomTrainerClass(void);\nvoid CreateEnemyEventMon(void);\nvoid HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality);\nbool8 CheckBattleTypeGhost(struct Pokemon *mon, u8 bank);\nstruct MonSpritesGfxManager *CreateMonSpritesGfxManager(u8 battlePosition, u8 mode);\nvoid DestroyMonSpritesGfxManager(void);\nu8 *MonSpritesGfxManager_GetSpritePtr(u8 bufferId);\nu8 GetNatureFromPersonality(u32 personality);\nvoid CreateMonWithGenderNatureAbility(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 abilityNum);\nvoid CreateEnemyMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 personality);\nu16 ExtendedToNationalOrder(u16 expandedNum);\nu16 ExtendedPokedexNumToSpecies(u16 nationalNum);\nu16 NationalToExtendedOrder(u16 nationalNum);\nu16 SpeciesToExtendedPokedexNum(u16 species);\n\n#endif // GUARD_POKEMON_H\n"
  },
  {
    "path": "include/pokemon_icon.h",
    "content": "#ifndef GUARD_POKEMON_ICON_H\n#define GUARD_POKEMON_ICON_H\n\n#include \"global.h\"\n\nextern const u8 *const gMonIconTable[];\nextern const struct SpritePalette gMonIconPaletteTable[];\nextern const u16 gMonIconPalettes[][16];\nextern const u8 gMonIconPaletteIndices[];\n\nconst u8 *GetMonIconPtr(u16 speciesId, u32 personality, u32 frameNo);\nconst u8 *GetMonIconTiles(u16 iconSpecies, bool32 extra);\nconst u16 *GetValidMonIconPalettePtr(u16 speciesId);\nvoid LoadMonIconPalettes(void);\nvoid FreeMonIconPalettes(void);\nu16 MailSpeciesToIconSpecies(u16);\nu8 CreateMonIcon_HandleDeoxys(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subpriority, bool32 extra);\nvoid DestroyMonIcon(struct Sprite *);\nu16 GetUnownLetterByPersonality(u32 personality);\nvoid SpriteCB_MonIcon(struct Sprite *);\nu8 CreateMonIcon(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subpriority, u32 personality, bool32 extra);\nu8 UpdateMonIconFrame(struct Sprite *sprite);\nvoid LoadMonIconPalette(u16 iconId);\nvoid FreeMonIconPalette(u16 iconId);\nvoid SetPartyHPBarSprite(struct Sprite *sprite, u8 animNum);\nu8 GetMonIconPaletteIndexFromSpecies(u16 species);\nu16 GetIconSpecies(u16 species, u32 personality);\nvoid LoadMonIconPalettesAt(u16 offset);\nu8 GetValidMonIconPalIndex(u16 species);\nvoid SafeLoadMonIconPalette(u16 species);\nvoid SafeFreeMonIconPalette(u16 species);\n\n#endif // GUARD_POKEMON_ICON_H\n"
  },
  {
    "path": "include/pokemon_item_effects.h",
    "content": "#ifndef GUARD_POKEMON_ITEM_EFFECTS\n#define GUARD_POKEMON_ITEM_EFFECTS\n\n#include \"pokemon.h\"\n\n// TODO once pokemon item effects is decompiled\n/*\nstruct PokemonItemEffect\n{\n    //field 0\n    u8 xAtk : 4; // x1, x2, x4, x8 = xF\n    u8 field_0_x10 : 1; // x10\n    u8 critRatioUp : 1; // x20\n    u8 field_0_x40 : 1; // x40\n    u8 cureInfatuation : 1; // x80\n\n    /*field 1\n    u8 xSpeed : 4; // x1, x2, x4, x8 = xF\n    u8 xDefense : 4; // x10, x20, x40, xF0\n\n    /*field 2\n    u8 xSpAtk : 4; // x1, x2, x4, x8 = xF\n    u8 xAccuracy : 4; // x10, x20, x40, xF0\n\n    /*field 3\n    u8 cureConfusion : 1; // x1\n    u8 cureParalysis : 1; // x2\n    u8 cureFreeze : 1; // x4\n    u8 cureBurn : 1; // x8\n    u8 curePoison : 1; // x10\n    u8 cureSleep : 1; // x20\n    u8 field_3_x40 : 1; // x40\n    u8 cantLowerStats : 1; // x80\n\n    /*field 4\n    u8 hpEv : 1; // x1\n    u8 attackEv : 1; // x2\n    u8 healHp : 1; // x4\n    u8 field_4_x8 : 1; // x8\n    u8 field_4_x10 : 1; // x10\n    u8 ppUp : 1; // x20\n    u8 levelUp : 1; // x40\n    u8 evolutionStone : 1; // x80\n\n    /*field 5\n    u8 defEv:  1; // x1\n    u8 speedEv : 1; // x2\n    u8 spDefEv : 1; // x4\n    u8 spAtkEv : 1; // x8\n    u8 ppMax : 1; // x10\n    u8 field_5_x20 : 1; // x20\n    u8 field_5_x40 : 1; // x40\n    u8 field_5_x80 : 1; // x80\n\n    /*field 6\n    u8 value;\n};\n\nbool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 itemId, u8 partyId, u8 monMoveIndex, u8 a5);\n*/\n\n#endif // GUARD_POKEMON_ITEM_EFFECTS\n"
  },
  {
    "path": "include/pokemon_jump.h",
    "content": "#ifndef GUARD_POKEMON_JUMP_H\n#define GUARD_POKEMON_JUMP_H\n\n#include \"main.h\"\n\nvoid ResetPokemonJumpRecords(void);\nbool32 IsSpeciesAllowedInPokemonJump(u16 species);\nvoid StartPokemonJump(u16 species, MainCallback callback);\n\n#endif // GUARD_POKEMON_JUMP_H\n"
  },
  {
    "path": "include/pokemon_size_record.h",
    "content": "#ifndef GUARD_POKEMON_SIZE_RECORD_H\n#define GUARD_POKEMON_SIZE_RECORD_H\n\n#include \"global.h\"\n\nvoid InitSeedotSizeRecord(void);\nvoid GetSeedotSizeRecordInfo(void);\nvoid CompareSeedotSize(void);\n\nvoid InitLotadSizeRecord(void);\nvoid GetLotadSizeRecordInfo(void);\nvoid CompareLotadSize(void);\n\nvoid InitHeracrossSizeRecord(void);\nvoid InitMagikarpSizeRecord(void);\n\nvoid GiveGiftRibbonToParty(u8 index, u8 ribbonId);\n\n#endif // GUARD_POKEMON_SIZE_RECORD_H\n"
  },
  {
    "path": "include/pokemon_special_anim.h",
    "content": "#ifndef GUARD_POKEMON_SPECIAL_ANIM_H\n#define GUARD_POKEMON_SPECIAL_ANIM_H\n\n#include \"global.h\"\n\nvoid CreateLevelUpVerticalSpritesTask(u16 x, u16 y, u16 tileTag, u16 paletteTag, u16 priority, u16 subpriority);\nbool8 LevelUpVerticalSpritesTaskIsRunning(void);\nvoid GetMonLevelUpWindowStats(struct Pokemon *mon, u16 *currStats);\nvoid DrawLevelUpWindowPg1(u16 windowId, u16 *statsBefore, u16 *statsAfter, u8 bgClr, u8 fgClr, u8 shadowClr);\nvoid DrawLevelUpWindowPg2(u16 windowId, u16 *currStats, u8 bgClr, u8 fgClr, u8 shadowClr);\nvoid StartUseItemAnim_Normal(u8 slotId, u16 itemId, MainCallback callback);\nvoid StartUseItemAnim_CantEvolve(u8 slotId, u16 itemId, MainCallback callback);\nbool32 PSA_IsCancelDisabled(void);\nvoid StartUseItemAnim_ForgetMoveAndLearnTMorHM(u8 slotId, u16 itemId, u16 moveId, MainCallback callback);\n\n#endif // GUARD_POKEMON_SPECIAL_ANIM_H\n"
  },
  {
    "path": "include/pokemon_special_anim_internal.h",
    "content": "#ifndef GUARD_POKEMON_SPECIAL_ANIM_INTERNAL_H\n#define GUARD_POKEMON_SPECIAL_ANIM_INTERNAL_H\n\n#include \"pokemon_special_anim.h\"\n\nenum\n{\n    PSA_TEXT_ITEM_USED,\n    PSA_TEXT_LEVEL_ELEVATED,\n    PSA_TEXT_FORGET_1,\n    PSA_TEXT_FORGET_2_AND,\n    PSA_TEXT_FORGET_POOF,\n    PSA_TEXT_FORGET_FORGOT,\n    PSA_TEXT_FORGET_AND,\n    PSA_TEXT_MACHINE_SET,\n    PSA_TEXT_HUH,\n    PSA_TEXT_LEARNED_MOVE\n};\n\nstruct PokemonSpecialAnimScene\n{\n    u16 state;\n    u16 field_0002;\n    u16 field_0004;\n    u16 monSpriteY1;\n    u16 monSpriteY2;\n    u8 lastCloseness;\n    struct Sprite *monSprite;\n    struct Sprite *itemIconSprite;\n    u8 textBuf[0x900];\n    u8 field_0914[BG_SCREEN_SIZE];\n    u8 field_1114[BG_SCREEN_SIZE];\n    u8 field_1914[BG_SCREEN_SIZE];\n    u8 field_2114[0x720];\n}; // size=0x2834\n\nstruct PokemonSpecialAnim\n{\n    /*0x0000*/ u8 filler_0000[0x4];\n    /*0x0004*/ MainCallback savedCallback;\n    /*0x0008*/ struct Pokemon pokemon;\n    /*0x006c*/ u8 nickname[POKEMON_NAME_LENGTH + 1];\n    /*0x0077*/ u8 nameOfMoveForgotten[13];\n    /*0x0084*/ u8 nameOfMoveToTeach[13];\n    /*0x0091*/ bool8 cancelDisabled;\n    /*0x0092*/ u16 state;\n    /*0x0094*/ u16 species;\n    /*0x0096*/ u16 itemId;\n    /*0x0098*/ u16 animType;\n    /*0x009a*/ u16 slotId;\n    /*0x009c*/ u16 closeness;\n    /*0x009e*/ u16 delayTimer;\n    /*0x00a0*/ u32 personality;\n    /*0x00a4*/ u32 field_00a4;\n    /*0x00a8*/ struct PokemonSpecialAnimScene sceneResources;\n}; // size=0x28dc\n\nstruct PokemonSpecialAnim * GetPSAStruct(void);\nstruct Pokemon * PSA_GetPokemon(void);\nstruct PokemonSpecialAnimScene * PSA_GetSceneWork(void);\nu16 PSA_GetItemId(void);\nu8 *PSA_GetNameOfMoveForgotten(void);\nu8 *PSA_GetNameOfMoveToTeach(void);\nu8 *PSA_CopyMonNickname(u8 *dest);\nu8 *PSA_GetMonNickname(void);\nu8 PSA_GetAnimType(void);\nu16 PSA_GetMonSpecies(void);\nu32 PSA_GetMonPersonality(void);\n\nvoid InitPokemonSpecialAnimScene(struct PokemonSpecialAnimScene * buffer, u16 animType);\nbool8 PokemonSpecialAnimSceneInitIsNotFinished(void);\nvoid PSA_FreeWindowBuffers(void);\nvoid PSA_ShowMessageWindow(void);\nvoid PSA_HideMessageWindow(void);\nvoid PSA_PrintMessage(u8 messageId);\nvoid PSA_AfterPoof_ClearMessageWindow(void);\nbool8 PSA_IsMessagePrintTaskActive(void);\nvoid PSA_DarkenMonSprite(void);\nbool8 PSA_RunPoofAnim(void);\nvoid PSA_UseTM_SetUpZoomOutAnim(void);\nvoid PSA_UseTM_CleanUpForCancel(void);\nbool8 PSA_UseTM_RunZoomOutAnim(void);\nvoid PSA_UseTM_SetUpMachineSetWobble(void);\nbool8 PSA_UseTM_RunMachineSetWobble(void);\nbool8 PSA_LevelUpVerticalSpritesTaskIsRunning(void);\nvoid PSA_CreateMonSpriteAtCloseness(u8 closeness);\nvoid PSA_SetUpZoomAnim(u8 closeness);\nbool8 PSA_IsZoomTaskActive(void);\nvoid PSA_SetUpItemUseOnMonAnim(u16 itemId, u8 closeness, bool32 a2);\nvoid CreateItemIconSpriteAtMaxCloseness(u16 itemId);\nbool8 PSA_IsItemUseOnMonAnimActive(void);\nvoid PSA_UseItem_CleanUpForCancel(void);\n\n#endif //GUARD_POKEMON_SPECIAL_ANIM_INTERNAL_H\n"
  },
  {
    "path": "include/pokemon_storage_system.h",
    "content": "#ifndef GUARD_POKEMON_STORAGE_SYSTEM_H\n#define GUARD_POKEMON_STORAGE_SYSTEM_H\n\n#include \"global.h\"\n#include \"pokemon.h\"\n\n#define TOTAL_BOXES_COUNT       14\n#define IN_BOX_ROWS             5 // Number of rows, 6 Pokémon per row\n#define IN_BOX_COLUMNS          6 // Number of columns, 5 Pokémon per column\n#define IN_BOX_COUNT            (IN_BOX_ROWS * IN_BOX_COLUMNS)\n#define BOX_NAME_LENGTH         8\n\n/*\n            COLUMNS\nROWS        0   1   2   3   4   5\n            6   7   8   9   10  11\n            12  13  14  15  16  17\n            18  19  20  21  22  23\n            24  25  26  27  28  29\n*/\n\nenum\n{\n    WALLPAPER_FOREST,\n    WALLPAPER_CITY,\n    WALLPAPER_DESERT,\n    WALLPAPER_SAVANNA,\n    WALLPAPER_CRAG,\n    WALLPAPER_VOLCANO,\n    WALLPAPER_SNOW,\n    WALLPAPER_CAVE,\n    WALLPAPER_BEACH,\n    WALLPAPER_SEAFLOOR,\n    WALLPAPER_RIVER,\n    WALLPAPER_SKY,\n    WALLPAPER_STARS,\n    WALLPAPER_POKECENTER,\n    WALLPAPER_TILES,\n    WALLPAPER_SIMPLE,\n    WALLPAPER_COUNT\n};\n#define MAX_DEFAULT_WALLPAPER WALLPAPER_SAVANNA\n\nstruct PokemonStorage\n{\n    /*0x0000*/ u8 currentBox;\n    /*0x0001*/ struct BoxPokemon boxes[TOTAL_BOXES_COUNT][IN_BOX_COUNT];\n    /*0x8344*/ u8 boxNames[TOTAL_BOXES_COUNT][BOX_NAME_LENGTH + 1];\n    /*0x83C2*/ u8 boxWallpapers[TOTAL_BOXES_COUNT];\n};\n\nu8 *GetBoxNamePtr(u8 boxNumber);\nstruct BoxPokemon *GetBoxedMonPtr(u8 boxId, u8 monPosition);\nvoid SetBoxMonNickAt(u8 boxId, u8 monPosition, const u8 *newNick);\ns16 CompactPartySlots(void);\nu32 GetBoxMonDataAt(u8 boxId, u8 monPosition, s32 request);\nvoid ZeroBoxMonAt(u8 boxId, u8 monPosition);\nvoid CB2_ReturnToPokeStorage(void);\nvoid ResetPokemonStorageSystem(void);\nu8 StorageGetCurrentBox(void);\nvoid DrawTextWindowAndBufferTiles(const u8 *string, void *dst, u8 zero1, u8 zero2, u8 *buffer, s32 bytesToBuffer);\nvoid StoreHPAndStatusInBoxMon(struct Pokemon *mon);\nvoid PopulateBoxHpAndStatusToPartyMon(struct Pokemon *mon);\nu16 GetFirstAliveBoxMon(void);\nvoid SwapFirstAliveBoxPokemon(void);\nvoid SetBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, const void *value);\nu8 CountPartyNonEggMons(void);\nu16 GetDeoxysSpeciesFromForme(u32 forme);\n\n#endif // GUARD_POKEMON_STORAGE_SYSTEM_H\n"
  },
  {
    "path": "include/pokemon_storage_system_internal.h",
    "content": "#ifndef GUARD_POKEMON_STORAGE_SYSTEM_INTERNAL_H\n#define GUARD_POKEMON_STORAGE_SYSTEM_INTERNAL_H\n\n#include \"pokemon_storage_system.h\"\n#include \"mon_markings.h\"\n#include \"quest_log.h\"\n\n// The maximum number of Pokémon icons that can appear on-screen.\n// By default the limit is 40 (though in practice only 37 can be).\n#define MAX_MON_ICONS (IN_BOX_COUNT + PARTY_SIZE + 1 >= 40 ? IN_BOX_COUNT + PARTY_SIZE + 1 : 40)\n\n// The maximum number of item icons that can appear on-screen while\n// moving held items. 1 in the cursor, and 2 more while switching\n// between 2 Pokémon with held items\n#define MAX_ITEM_ICONS 3\n\nenum\n{\n    OPTION_WITHDRAW,\n    OPTION_DEPOSIT,\n    OPTION_MOVE_MONS,\n    OPTION_MOVE_ITEMS,\n    OPTION_EXIT,\n    OPTIONS_COUNT\n};\n\nenum\n{\n    MENU_TEXT_CANCEL,\n    MENU_TEXT_STORE,\n    MENU_TEXT_WITHDRAW,\n    MENU_TEXT_MOVE,\n    MENU_TEXT_SHIFT,\n    MENU_TEXT_PLACE,\n    MENU_TEXT_SUMMARY,\n    MENU_TEXT_RELEASE,\n    MENU_TEXT_MARK,\n    MENU_TEXT_JUMP,\n    MENU_TEXT_WALLPAPER,\n    MENU_TEXT_NAME,\n    MENU_TEXT_TAKE,\n    MENU_TEXT_GIVE,\n    MENU_TEXT_GIVE2,\n    MENU_TEXT_SWITCH,\n    MENU_TEXT_BAG,\n    MENU_TEXT_INFO,\n    MENU_TEXT_SCENERY_1,\n    MENU_TEXT_SCENERY_2,\n    MENU_TEXT_SCENERY_3,\n    MENU_TEXT_ETCETERA,\n    MENU_TEXT_FOREST,\n    MENU_TEXT_CITY,\n    MENU_TEXT_DESERT,\n    MENU_TEXT_SAVANNA,\n    MENU_TEXT_CRAG,\n    MENU_TEXT_VOLCANO,\n    MENU_TEXT_SNOW,\n    MENU_TEXT_CAVE,\n    MENU_TEXT_BEACH,\n    MENU_TEXT_SEAFLOOR,\n    MENU_TEXT_RIVER,\n    MENU_TEXT_SKY,\n    MENU_TEXT_POLKADOT,\n    MENU_TEXT_POKECENTER,\n    MENU_TEXT_MACHINE,\n    MENU_TEXT_SIMPLE,\n};\n\n// Return IDs for input handlers\nenum {\n    INPUT_NONE,\n    INPUT_MOVE_CURSOR,\n    INPUT_2, // Unused\n    INPUT_3, // Unused\n    INPUT_CLOSE_BOX,\n    INPUT_SHOW_PARTY,\n    INPUT_HIDE_PARTY,\n    INPUT_BOX_OPTIONS,\n    INPUT_IN_MENU,\n    INPUT_SCROLL_RIGHT,\n    INPUT_SCROLL_LEFT,\n    INPUT_DEPOSIT,\n    INPUT_WITHDRAW,\n    INPUT_MOVE_MON,\n    INPUT_SHIFT_MON,\n    INPUT_PLACE_MON,\n    INPUT_TAKE_ITEM,\n    INPUT_GIVE_ITEM,\n    INPUT_SWITCH_ITEMS,\n    INPUT_PRESSED_B,\n    INPUT_MULTIMOVE_START,\n    INPUT_MULTIMOVE_CHANGE_SELECTION,\n    INPUT_MULTIMOVE_SINGLE,\n    INPUT_MULTIMOVE_GRAB_SELECTION,\n    INPUT_MULTIMOVE_UNABLE,\n    INPUT_MULTIMOVE_MOVE_MONS,\n    INPUT_MULTIMOVE_PLACE_MONS,\n};\n\nenum\n{\n    RELEASE_MON_NOT_ALLOWED,\n    RELEASE_MON_ALLOWED,\n    RELEASE_MON_UNDETERMINED = -1,\n};\n\nenum\n{\n    MODE_PARTY,\n    MODE_BOX,\n    MODE_MOVE,\n};\n\nenum\n{\n    CURSOR_AREA_IN_BOX,\n    CURSOR_AREA_IN_PARTY,\n    CURSOR_AREA_BOX_TITLE,\n    CURSOR_AREA_BUTTONS, // Party Pokemon and Close Box\n};\n#define CURSOR_AREA_IN_HAND CURSOR_AREA_BOX_TITLE // Alt name for cursor area used by Move Items\n\n// IDs for InitMonPlaceChange\nenum\n{\n    CHANGE_GRAB,\n    CHANGE_PLACE,\n    CHANGE_SHIFT,\n};\n\n// IDs for the main functions for moving multiple Pokémon.\n// Given as arguments to MultiMove_SetFunction\nenum\n{\n    MULTIMOVE_START,\n    MULTIMOVE_SINGLE,\n    MULTIMOVE_CHANGE_SELECTION,\n    MULTIMOVE_GRAB_SELECTION,\n    MULTIMOVE_MOVE_MONS,\n    MULTIMOVE_PLACE_MONS,\n};\n\nenum\n{\n    PALTAG_MON_ICON_0 = 56000,\n    PALTAG_MON_ICON_1, // Used implicitly in CreateMonIconSprite\n    PALTAG_MON_ICON_2, // Used implicitly in CreateMonIconSprite\n    PALTAG_3, // Unused\n    PALTAG_4, // Unused\n    PALTAG_5, // Unused\n    PALTAG_DISPLAY_MON,\n    PALTAG_MISC_1, // Used by cursor in multimove mode, choose box menu popup\n    PALTAG_MARKING_COMBO,\n    PALTAG_BOX_TITLE,\n    PALTAG_MISC_2, // Used by waveforms, cursor in normal mode, cursor shadow, box scroll arrows\n    PALTAG_ITEM_ICON_0,\n    PALTAG_ITEM_ICON_1, // Used implicitly in CreateItemIconSprites\n    PALTAG_ITEM_ICON_2, // Used implicitly in CreateItemIconSprites\n    PALTAG_MARKING_MENU,\n};\n\nenum\n{\n    GFXTAG_CURSOR,\n    GFXTAG_CURSOR_SHADOW,\n    GFXTAG_DISPLAY_MON,\n    GFXTAG_BOX_TITLE,\n    GFXTAG_BOX_TITLE_ALT,\n    GFXTAG_WAVEFORM,\n    GFXTAG_BOX_SCROLL_ARROW,\n    GFXTAG_ITEM_ICON_0,\n    GFXTAG_ITEM_ICON_1, // Used implicitly in CreateItemIconSprites\n    GFXTAG_ITEM_ICON_2, // Used implicitly in CreateItemIconSprites\n    GFXTAG_CHOOSE_BOX_MENU_CENTER,\n    GFXTAG_CHOOSE_BOX_MENU_CORNERS, // Used implicitly in LoadChooseBoxMenuGfx\n    GFXTAG_12, // Unused\n    GFXTAG_MARKING_MENU,\n    GFXTAG_14, // Unused\n    GFXTAG_15, // Unused\n    GFXTAG_MARKING_COMBO,\n    GFXTAG_17, // Unused\n    GFXTAG_MON_ICON,\n};\n\n// Special box ids for the choose box menu\n#define BOXID_NONE_CHOSEN 200\n#define BOXID_CANCELED    201\n\n\nenum {\n    CURSOR_ANIM_BOUNCE,\n    CURSOR_ANIM_STILL,\n    CURSOR_ANIM_OPEN,\n    CURSOR_ANIM_FIST,\n};\n\nenum\n{\n    RELEASE_ANIM_RELEASE,\n    RELEASE_ANIM_COME_BACK,\n};\n\n// IDs for the item icons affine anims\nenum\n{\n    ITEM_ANIM_NONE,\n    ITEM_ANIM_APPEAR,\n    ITEM_ANIM_DISAPPEAR,\n    ITEM_ANIM_PICK_UP,\n    ITEM_ANIM_PUT_DOWN,\n    ITEM_ANIM_PUT_AWAY,\n    ITEM_ANIM_LARGE,\n};\n\nstruct Wallpaper\n{\n    const u32 *tiles;\n    const u32 *tileMap;\n    const u16 *palettes;\n};\n\nstruct StorageMessage\n{\n    const u8 *text;\n    u8 format;\n};\n\nstruct ChooseBoxMenu\n{\n    struct Sprite *menuSprite;\n    struct Sprite *menuCornerSprites[4];\n    u32 unused1[3];\n    struct Sprite *arrowSprites[2];\n    u8 buffer[0x200]; // passed but not used\n    u8 strbuf[20];\n    bool32 loadedPalette;\n    u16 tileTag;\n    u16 paletteTag;\n    u8 curBox;\n    u8 unused3;\n    u8 subpriority;\n};\n\nstruct StorageMenu\n{\n    const u8 *text;\n    int textId;\n};\n\nstruct UnkUtilData\n{\n    const u8 *src;\n    u8 *dest;\n    u16 size;\n    u16 unk;\n    u16 height;\n    void (*func)(struct UnkUtilData *data);\n};\n\nstruct UnkUtil\n{\n    struct UnkUtilData *data;\n    u8 numActive;\n    u8 max;\n};\n\nstruct PokeStorageItemIcon\n{\n    struct Sprite *sprite;\n    u8 *tiles;\n    u16 palIndex;\n    u8 cursorArea;\n    u8 cursorPos;\n    u8 active;\n};\n\nstruct PokemonStorageSystemData\n{\n    u8 state;\n    u8 boxOption;\n    u8 screenChangeType;\n    bool8 isReopening;\n    u8 taskId;\n    struct UnkUtil unkUtil;\n    struct UnkUtilData unkUtilData[8];\n    u16 partyMenuTilemapBuffer[0x108];\n    u16 partyMenuUnused1; // Never read\n    u16 partyMenuY;\n    u8 partyMenuUnused2; // Unused\n    u8 partyMenuMoveTimer;\n    u8 showPartyMenuState;\n    bool8 closeBoxFlashing;\n    u8 closeBoxFlashTimer;\n    bool8 closeBoxFlashState;\n    s16 newCurrBoxId;\n    u16 bg2_X;\n    s16 scrollSpeed;\n    u16 scrollTimer;\n    u8 wallpaperOffset;\n    u8 scrollUnused1; // Never read\n    u8 scrollToBoxIdUnused; // Never read\n    u16 scrollUnused2; // Never read\n    s16 scrollDirectionUnused; // Never read.\n    u16 scrollUnused3; // Never read\n    u16 scrollUnused4; // Never read\n    u16 scrollUnused5; // Never read\n    u16 scrollUnused6; // Never read\n    u8 filler1[22];\n    u8 boxTitleTiles[512];\n    u8 boxTitleUnused[512];\n    u8 boxTitleCycleId;\n    u8 wallpaperLoadState; // Written to, but never read.\n    u8 wallpaperLoadBoxId;\n    s8 wallpaperLoadDir;\n    u16 boxTitlePal[16];\n    u16 boxTitlePalOffset;\n    u16 boxTitleAltPalOffset;\n    struct Sprite *curBoxTitleSprites[2];\n    struct Sprite *nextBoxTitleSprites[2];\n    struct Sprite *arrowSprites[2];\n    u32 wallpaperPalBits;\n    u8 filler2[80]; // Unused\n    u16 unusedField1; // Never read.\n    s16 wallpaperSetId;\n    s16 wallpaperId;\n    u16 wallpaperTilemap[360];\n    u8 wallpaperChangeState;\n    u8 scrollState;\n    u8 scrollToBoxId;\n    s8 scrollDirection;\n    // u8 *wallpaperTiles; // used only in Emerald for Walda\n    struct Sprite *movingMonSprite;\n    struct Sprite *partySprites[PARTY_SIZE];\n    struct Sprite *boxMonsSprites[IN_BOX_COUNT];\n    struct Sprite **shiftMonSpritePtr;\n    struct Sprite **releaseMonSpritePtr;\n    u16 numIconsPerSpecies[MAX_MON_ICONS];\n    u16 iconSpeciesList[MAX_MON_ICONS];\n    u16 boxSpecies[IN_BOX_COUNT];\n    u32 boxPersonalities[IN_BOX_COUNT];\n    u8 incomingBoxId;\n    u8 shiftTimer;\n    u8 numPartySpritesToCompact;\n    u16 iconScrollDistance;\n    s16 iconScrollPos;\n    s16 iconScrollSpeed;\n    u16 iconScrollNumIncoming;\n    u8 iconScrollCurColumn;\n    s8 iconScrollDirection; // Unnecessary duplicate of scrollDirection\n    u8 iconScrollState;\n    u8 iconScrollToBoxId; // Unused duplicate of scrollToBoxId\n    struct WindowTemplate menuWindow;\n    struct StorageMenu menuItems[7];\n    u8 menuItemsCount;\n    u8 menuWidth;\n    u8 menuUnusedField; // Never read.\n    u16 menuWindowId;\n    struct Sprite *cursorSprite;\n    struct Sprite *cursorShadowSprite;\n    s32 cursorNewX;\n    s32 cursorNewY;\n    u32 cursorSpeedX;\n    u32 cursorSpeedY;\n    s16 cursorTargetX;\n    s16 cursorTargetY;\n    u16 cursorMoveSteps;\n    s8 cursorVerticalWrap;\n    s8 cursorHorizontalWrap;\n    u8 newCursorArea;\n    u8 newCursorPosition;\n    u8 cursorPrevPartyPos;\n    u8 cursorFlipTimer;\n    u8 cursorPalNums[2];\n    const u32 *displayMonPalette;\n    u32 displayMonPersonality;\n    u16 displayMonSpecies;\n    u16 displayMonItemId;\n    u16 displayUnusedVar;\n    bool8 setMosaic;\n    u8 displayMonMarkings;\n    u8 displayMonLevel;\n    bool8 displayMonIsEgg;\n    u8 displayMonNickname[POKEMON_NAME_LENGTH + 1];\n    u8 displayMonTexts[4][36]; // nickname, species name, gender and level, item name\n    bool8 (*monPlaceChangeFunc)(void);\n    u8 monPlaceChangeState;\n    u8 shiftBoxId;\n    struct Sprite *markingComboSprite;\n    struct Sprite *waveformSprites[2];\n    u16 *markingComboTilesPtr;\n    struct MonMarkingsMenu markMenu;\n    struct ChooseBoxMenu chooseBoxMenu;\n    struct Pokemon movingMon;\n    struct Pokemon tempMon;\n    s8 releaseMonStatus;\n    bool8 releaseMonStatusResolved;\n    bool8 isSurfMon;\n    bool8 isDiveMon;\n    s8 releaseCheckBoxId;\n    s8 releaseCheckBoxPos;\n    s8 releaseBoxId;\n    s8 releaseBoxPos;\n    u16 releaseCheckState;\n    u16 restrictedMoveList[3];\n    u8 summaryLastIndex;\n    u8 summaryCursorPos;\n    u8 summaryScreenMode;\n    union\n    {\n        struct Pokemon *mon;\n        struct BoxPokemon *box;\n    } summaryMonPtr;\n    u8 actionText[40];\n    u8 boxTitleText[40];\n    u8 releaseMonName[POKEMON_NAME_LENGTH + 1];\n    u8 itemName[20];\n    u8 inBoxMovingMode;\n    u16 multiMoveWindowId;\n    struct PokeStorageItemIcon itemIcons[MAX_ITEM_ICONS];\n    u16 movingItemId;\n    u16 itemInfoWindowOffset;\n    struct QuestLogEvent_MovedBoxMon questLogData;\n    u16 unusedField2;\n    u16 displayMonPalOffset;\n    u16 *displayMonTilePtr;\n    struct Sprite *displayMonSprite;\n    u16 displayMonPalBuffer[0x20];\n    u8 unusedBuffer1[0x40];\n    u8 tileBuffer[0x800];\n    u8 unusedBuffer2[0x1800];\n    u8 itemIconBuffer[0x200];\n    u8 unusedBuffer3[0x600];\n    u8 wallpaperBgTilemapBuffer[0x1000];\n    u8 menuTilemapBuffer[0x800];\n};\n\nextern struct PokemonStorageSystemData *gStorage;\n\nvoid EnterPokeStorage(u8 boxOption);\nu8 GetCurrentBoxOption(void);\nstruct Sprite *CreateChooseBoxArrows(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority);\nvoid SetBoxWallpaper(u8 boxId, u8 wallpaperId);\nvoid SetCurrentBox(u8 boxId);\nvoid BoxMonAtToMon(u8 boxId, u8 boxPosition, struct Pokemon * dst);\nvoid SetBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon * src);\n\nvoid CB2_ExitPokeStorage(void);\nvoid FreeBoxSelectionPopupSpriteGfx(void);\nvoid CreateChooseBoxMenuSprites(u8 curBox);\nvoid DestroyChooseBoxMenuSprites(void);\nu8 HandleBoxChooseSelectionInput(void);\nvoid LoadChooseBoxMenuGfx(struct ChooseBoxMenu *menu, u16 tileTag, u16 palTag, u8 subpriority, bool32 loadPal);\nvoid SetCurrentBoxMonData(u8 boxPosition, s32 request, const void *value);\nu32 GetCurrentBoxMonData(u8 boxPosition, s32 request);\nu32 GetAndCopyBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, void *dst);\n\nvoid InitCursor(void);\nvoid InitCursorOnReopen(void);\nbool8 UpdateCursorPos(void);\nvoid SetCursorInParty(void);\nvoid SetCursorBoxPosition(u8 cursorBoxPosition);\nvoid ClearSavedCursorPos(void);\nvoid SaveCursorPos(void);\nu8 GetSavedCursorPos(void);\nvoid DoTrySetDisplayMonData(void);\nvoid ResetSelectionAfterDeposit(void);\nvoid InitReleaseMon(void);\nbool8 TryHideReleaseMon(void);\nvoid TrySetCursorFistAnim(void);\nvoid SaveMovingMon(void);\nvoid LoadSavedMovingMon(void);\nvoid InitSummaryScreenData(void);\nvoid SetSelectionAfterSummaryScreen(void);\nvoid StartCursorAnim(u8 animNum);\nu8 GetMovingMonOriginalBoxId(void);\nvoid TryHideItemAtCursor(void);\nvoid TryShowItemAtCursor(void);\nbool8 IsMenuLoading(void);\ns16 HandleMenuInput(void);\nvoid RemoveMenu(void);\nbool8 MultiMove_Init(void);\nvoid MultiMove_Free(void);\nvoid MultiMove_SetFunction(u8 funcId);\nbool8 MultiMove_RunFunction(void);\nvoid CreateItemIconSprites(void);\nvoid MoveItemFromCursorToBag(void);\nvoid MoveHeldItemWithPartyMenu(void);\nbool8 IsItemIconAnimActive(void);\nconst u8 *GetMovingItemName(void);\nvoid InitItemInfoWindow(void);\nbool8 UpdateItemInfoWindowSlideIn(void);\nbool8 UpdateItemInfoWindowSlideOut(void);\nvoid UnkUtil_Init(struct UnkUtil *arg0, struct UnkUtilData *arg1, u32 arg2);\nvoid UnkUtil_Run(void);\nvoid AddMenu(void);\nbool8 CanMovePartyMon(void);\nbool8 CanShiftMon(void);\nbool8 DoMonPlaceChange(void);\nbool8 DoWallpaperGfxChange(void);\nu8 GetBoxCursorPosition(void);\nu16 GetMovingItem(void);\nu8 HandleInput(void);\nvoid InitCanReleaseMonVars(void);\nvoid InitMonPlaceChange(u8 type);\nbool8 IsActiveItemMoving(void);\nbool8 IsCursorOnCloseBox(void);\nbool8 IsMonBeingMoved(void);\nvoid Item_FromMonToMoving(u8 cursorArea, u8 cursorPos);\nvoid Item_GiveMovingToMon(u8 cursorArea, u8 cursorPos);\nvoid Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos);\nvoid Item_TakeMons(u8 cursorArea, u8 cursorPos);\nvoid PrintItemDescription(void);\nvoid ReleaseMon(void);\ns8 RunCanReleaseMon(void);\nbool8 ScrollToBox(void);\nvoid SetMonMarkings(u8 markings);\nvoid SetMovingMonPriority(u8 priority);\nvoid SetUpScrollToBox(u8 targetBox);\nvoid SetWallpaperForCurrentBox(u8 wallpaper);\nbool8 TryStorePartyMonInBox(u8 boxId);\nvoid InitMenu(void);\nvoid SetMenuText(u8 textId);\nvoid TryLoadItemIconAtPos(u8 cursorArea, u8 cursorPos);\nvoid InitItemIconInCursor(u16 itemId);\nu8 GetBoxWallpaper(u8 boxId);\nbool8 IsCursorOnBoxTitle(void);\nbool8 IsCursorInBox(void);\n\nvoid InitMonIconFields(void);\nstruct Sprite *CreateMonIconSprite(u16 species, u32 pid, s16 x, s16 y, u8 priority, u8 subpriority);\nvoid CreatePartyMonsSprites(bool8 species);\nvoid CompactPartySprites(void);\nu8 GetNumPartySpritesCompacting(void);\nvoid MovePartySprites(s16 yDelta);\nvoid DestroyAllPartyMonIcons(void);\nvoid DoReleaseMonComeBackAnim(void);\nbool8 ResetReleaseMonSpritePtr(void);\nvoid CreateInitBoxTask(u8 boxId);\nbool8 IsInitBoxActive(void);\nvoid AnimateBoxScrollArrows(bool8 species);\nvoid CreateMovingMonIcon(void);\nvoid SetShiftMonSpritePtr(u8 boxId, u8 position);\nbool8 ShiftMons(void);\nvoid SetMovingMonSprite(u8 cursorArea, u8 cursorPos);\nvoid SetPlacedMonSprite(u8 cursorArea, u8 cursorPos);\nvoid DestroyPartyMonIcon(u8 partyId);\nvoid DestroyMovingMonIcon(void);\ns16 GetFirstFreeBoxSpot(u8 boxId);\nvoid CreateBoxMonIconAtPos(u8 boxPosition);\nvoid DoReleaseMonAnim(u8 mode, u8 position);\nbool8 TryHideReleaseMonSprite(void);\nvoid DestroyReleaseMonIcon(void);\nu8 CountPartyMons(void);\nu8 CountPartyAliveNonEggMonsExcept(u8 slotToIgnore);\n\ns8 GetMenuItemTextId(u8 menuIndex);\nbool8 MultiMove_TryMoveGroup(u8 dir);\nu8 MultiMove_GetOriginPosition(void);\nbool8 MultiMove_CanPlaceSelection(void);\nvoid TryHideItemIconAtPos(u8 cursorArea, u8 cursorPos);\nvoid GetCursorBoxColumnAndRow(u8 *column, u8 *row);\nvoid SetCursorPriorityTo1(void);\nvoid InitMultiMonPlaceChange(bool8 moveCursorUp);\nvoid DestroyBoxMonIconAtPosition(u8 boxPosition);\nvoid SetBoxMonIconObjMode(u8 cursorPos, u8 objMode);\nvoid SetPartyMonIconObjMode(u8 cursorPos, u8 objMode);\n\n#endif //GUARD_POKEMON_STORAGE_SYSTEM_INTERNAL_H\n"
  },
  {
    "path": "include/pokemon_summary_screen.h",
    "content": "#ifndef GUARD_POKEMON_SUMMARY_SCREEN_H\n#define GUARD_POKEMON_SUMMARY_SCREEN_H\n\n#include \"main.h\"\n\nextern const u8 *const gMoveDescriptionPointers[];\nextern const u8 *const gNatureNamePointers[];\n\nvoid ShowSelectMovePokemonSummaryScreen(struct Pokemon *, u8, u8, MainCallback, u16);\nu8 GetMoveSlotToReplace(void);\nvoid SummaryScreen_SetUnknownTaskId(u8 a0);\nvoid SummaryScreen_DestroyUnknownTask(void);\nu8 GetLastViewedMonIndex(void);\nvoid ShowPokemonSummaryScreen(struct Pokemon * party, u8 cursorPos, u8 lastIdx, void (*callback)(void), u8 a4);\nvoid SetPokemonSummaryScreenMode(u8);\nu8 GetHiddenPowerType(struct Pokemon * mon);\nu8 GetWeatherBallType(void);\n\n// The Pokemon Summary Screen can operate in different modes. Certain features,\n// such as move re-ordering, are available in the different modes.\nenum PokemonSummaryScreenMode\n{\n    PSS_MODE_NORMAL,\n    PSS_MODE_UNK1,\n    PSS_MODE_SELECT_MOVE,\n    PSS_MODE_FORGET_MOVE,\n    PSS_MODE_TRADE,\n    PSS_MODE_BOX,\n};\n\nenum PokemonSummaryScreenPage\n{\n    PSS_PAGE_INFO,\n    PSS_PAGE_SKILLS,\n    PSS_PAGE_MOVES,\n    PSS_PAGE_MOVES_INFO,\n    PSS_PAGE_UNK4,\n    PSS_PAGE_MOVE_DELETER,\n};\n\nenum PokemonSummaryScreenState3270\n{\n    PSS_STATE3270_FADEIN,\n    PSS_STATE3270_PLAYCRY,\n    PSS_STATE3270_HANDLEINPUT,\n    PSS_STATE3270_FLIPPAGES,\n    PSS_STATE3270_ATEXIT_FADEOUT,\n    PSS_STATE3270_ATEXIT_WAITLINKDELAY,\n    PSS_STATE3270_ATEXIT_WAITFADE\n};\n\nenum PokemonSummaryScreenStat\n{\n    PSS_STAT_ATK,\n    PSS_STAT_DEF,\n    PSS_STAT_SPA,\n    PSS_STAT_SPD,\n    PSS_STAT_SPE\n};\n\n#define TAG_PSS_UNK_64 0x64\n#define TAG_PSS_UNK_65 0x65\n#define TAG_PSS_UNK_66 0x66\n#define TAG_PSS_UNK_67 0x67\n#define TAG_PSS_UNK_6E 0x6E\n#define TAG_PSS_UNK_78 0x78\n#define TAG_PSS_UNK_82 0x82\n#define TAG_PSS_UNK_8C 0x8C\n#define TAG_PSS_UNK_96 0x96\n#define TAG_PSS_UNK_A0 0xA0\n\n#endif // GUARD_POKEMON_SUMMARY_SCREEN_H\n"
  },
  {
    "path": "include/quest_log.h",
    "content": "#ifndef GUARD_QUEST_LOG_H\n#define GUARD_QUEST_LOG_H\n\n#include \"global.h\"\n#include \"quest_log_battle.h\"\n#include \"field_control_avatar.h\"\n#include \"constants/quest_log.h\"\n#include \"constants/battle.h\"\n\n// Layout of Quest Log script commands\n#define QL_CMD_EVENT_MASK  0x0FFF\n#define QL_CMD_COUNT_SHIFT 12\n#define QL_CMD_COUNT_MASK  (0xF << QL_CMD_COUNT_SHIFT)\n\n// Parameter to QuestLog_OnEscalatorWarp\n#define QL_ESCALATOR_OUT 1\n#define QL_ESCALATOR_IN  2\n\nstruct QuestLogAction\n{\n    union {\n        struct {\n            u8 localId;\n            u8 mapNum;\n            u8 mapGroup;\n            u8 movementActionId;\n        } a; // Data when type == 0\n        struct {\n            u8 localId;\n            u8 mapNum;\n            u8 mapGroup;\n            u8 gfxState;\n        } b; // Data when type == 1\n        u8 fieldInput[4]; // Data when type == 2\n        u8 raw[4];\n    } data;\n    u16 duration;\n    u8 type;\n};\n\nstruct QuestLogRepeatEventTracker\n{\n    u8 id;\n    u8 numRepeats;\n    u16 counter;\n};\n\n// Event data structs\n\n// QL_EVENT_SWITCHED_PARTY_ORDER\nstruct QuestLogEvent_SwitchedPartyOrder\n{\n    u16 species1;\n    u16 species2;\n};\n\n// QL_EVENT_USED_ITEM\n// QL_EVENT_GAVE_HELD_ITEM\n// QL_EVENT_GAVE_HELD_ITEM_BAG\n// QL_EVENT_GAVE_HELD_ITEM_PC\n// QL_EVENT_TOOK_HELD_ITEM\n// QL_EVENT_DEPOSITED_ITEM_PC\n// QL_EVENT_WITHDREW_ITEM_PC\nstruct QuestLogEvent_Item\n{\n    u16 itemId;\n    u16 unused;\n    u16 species;\n    u16 itemParam;\n};\n\n// QL_EVENT_SWAPPED_HELD_ITEM\n// QL_EVENT_SWAPPED_HELD_ITEM_PC\nstruct QuestLogEvent_SwappedHeldItem\n{\n    u16 takenItemId;\n    u16 givenItemId;\n    u16 species;\n};\n\n// QL_EVENT_LINK_TRADED\n// QL_EVENT_LINK_TRADED_UNION\nstruct QuestLogEvent_Traded\n{\n    u16 speciesSent;\n    u16 speciesReceived;\n    u8 partnerName[PLAYER_NAME_LENGTH];\n};\n\n// QL_EVENT_LINK_BATTLED_SINGLE\n// QL_EVENT_LINK_BATTLED_DOUBLE\n// QL_EVENT_LINK_BATTLED_MULTI\n// QL_EVENT_LINK_BATTLED_UNION\nstruct QuestLogEvent_LinkBattle\n{\n    u8 outcome;\n    u8 playerNames[MAX_BATTLERS_COUNT - 1][PLAYER_NAME_LENGTH];\n};\n\n// QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES\n// QL_EVENT_SWITCHED_MONS_WITHIN_BOX\n// QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON\n// QL_EVENT_MOVED_MON_BETWEEN_BOXES\n// QL_EVENT_MOVED_MON_WITHIN_BOX\n// QL_EVENT_WITHDREW_MON_PC\n// QL_EVENT_DEPOSITED_MON_PC\n// QL_EVENT_SWITCHED_MULTIPLE_MONS\nstruct QuestLogEvent_MovedBoxMon\n{\n    u16 species1;\n    u16 species2;\n    u8 box1;\n    u8 box2;\n};\n\n// QL_EVENT_DEFEATED_TRAINER\n// QL_EVENT_DEFEATED_GYM_LEADER\n// QL_EVENT_DEFEATED_E4_MEMBER\n// QL_EVENT_DEFEATED_CHAMPION\nstruct QuestLogEvent_TrainerBattle\n{\n    u16 trainerId;\n    u16 speciesOpponent;\n    u16 speciesPlayer;\n    u8 hpFractionId;\n    u8 mapSec;\n};\n\n// QL_EVENT_DEFEATED_WILD_MON\nstruct QuestLogEvent_WildBattle\n{\n    u16 defeatedSpecies;\n    u16 caughtSpecies;\n    u8 mapSec;\n};\n\n// QL_EVENT_DEPARTED\nstruct QuestLogEvent_Departed\n{\n    u8 mapSec;\n    u8 locationId;\n};\n\n// QL_EVENT_USED_FIELD_MOVE\nstruct QuestLogEvent_FieldMove\n{\n    u16 species;\n    u8 fieldMove;\n    u8 mapSec;\n};\n\n// QL_EVENT_BOUGHT_ITEM\n// QL_EVENT_SOLD_ITEM\nstruct QuestLogEvent_Shop\n{\n    u32 totalMoney; // Total amount of money spent buying or earned selling\n    u16 lastItemId;\n    u16 itemQuantity; // Total number of items bought or sold\n    u8 mapSec;\n    bool8 hasMultipleTransactions;\n    u8 logEventId; // Either 0 (empty), 1 (bought) or 2 (sold)\n};\n\n// QL_EVENT_OBTAINED_STORY_ITEM\nstruct QuestLogEvent_StoryItem\n{\n    u16 itemId;\n    u8 mapSec;\n};\n\nextern u8 gQuestLogState;\nextern u8 gQuestLogPlaybackState;\nextern struct FieldInput gQuestLogFieldInput;\nextern struct QuestLogRepeatEventTracker gQuestLogRepeatEventTracker;\nextern u16 *gQuestLogDefeatedWildMonRecord;\nextern u16 *gQuestLogRecordingPointer;\nextern u16 gQuestLogCurActionIdx;\n\nvoid QuestLogRecordPlayerAvatarGfxTransition(u8);\nvoid SetQuestLogEvent(u16, const u16 *);\nvoid SetQLPlayedTheSlots(void);\nvoid QuestLog_RecordEnteredMap(u16);\nu8 QL_GetPlaybackState(void);\nbool8 QL_AvoidDisplay(void (*func)(void));\nvoid QuestLog_BackUpPalette(u16 offset, u16 size);\nvoid CommitQuestLogWindow1(void);\nvoid QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(void);\nvoid ResetQuestLog(void);\nvoid ResetTrainerFanClub(void);\nvoid TryStartQuestLogPlayback(u8 taskId);\nvoid SaveQuestLogData(void);\nvoid QuestLog_CutRecording(void);\nvoid ResetDeferredLinkEvent(void);\nvoid QL_FinishRecordingScene(void);\nvoid QuestLogEvents_HandleEndTrainerBattle(void);\nvoid *QuestLogGetFlagOrVarPtr(bool8 isFlag, u16 idx);\nvoid QuestLogSetFlagOrVar(bool8 isFlag, u16 idx, u16 value);\nvoid QL_AddASLROffset(void *oldSaveBlockPtr);\nvoid QL_UpdateObject(struct Sprite *sprite);\nvoid QuestLogRecordNPCStep(u8 a0, u8 a1, u8 a2, u8 a3);\nbool8 QL_IsTrainerSightDisabled(void);\nvoid QuestLog_OnEscalatorWarp(u8 direction);\nvoid QuestLogRecordPlayerAvatarGfxTransitionWithDuration(u8 movementActionId, u8 duration);\nvoid Special_UpdateTrainerFansAfterLinkBattle(void);\nvoid QuestLogRecordPlayerStep(u8 movementActionId);\nvoid QuestLogRecordPlayerStepWithDuration(u8 movementActionId, u8 duration);\nvoid QuestLogRecordNPCStepWithDuration(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId, u8 duration);\nvoid QL_AfterRecordFishActionSuccessful(void);\nvoid QL_ResetDefeatedWildMonRecord(void);\nvoid QL_RestoreMapLayoutId(void);\nvoid QL_RecordFieldInput(struct FieldInput * fieldInput);\nvoid QL_TryRunActions(void);\nvoid RunQuestLogCB(void);\nvoid QL_HandleInput(void);\nbool8 QuestLogScenePlaybackIsEnding(void);\nvoid SetQuestLogEvent_Arrived(void);\nbool8 QuestLog_ShouldEndSceneOnMapChange(void);\nvoid QuestLog_AdvancePlayhead_(void);\nvoid QuestLog_InitPalettesBackup(void);\nvoid QL_InitSceneObjectsAndActions(void);\nu8 GetQuestLogStartType(void);\nvoid QL_CopySaveState(void);\nvoid QL_ResetPartyAndPC(void);\nvoid QL_StartRecordingAction(u16 eventId);\nbool8 QL_IsRoomToSaveAction(const void *cursor, size_t size);\nbool8 QL_IsRoomToSaveEvent(const void *cursor, size_t size);\n\nvoid QL_ResetEventStates(void);\nvoid QL_ResetRepeatEventTracker(void);\nu16 *QL_RecordAction_SceneEnd(u16 *);\nu16 *QL_LoadAction_Wait(u16 *, struct QuestLogAction *);\nu16 *QL_RecordAction_Input(u16 *, struct QuestLogAction *);\nu16 *QL_LoadAction_Input(u16 *, struct QuestLogAction *);\nu16 *QL_RecordAction_MovementOrGfxChange(u16 *, struct QuestLogAction *);\nu16 *QL_LoadAction_MovementOrGfxChange(u16 *, struct QuestLogAction *);\nvoid QL_EnableRecordingSteps(void);\nu16 *QL_SkipCommand(u16 *, u16 **);\nvoid QL_UpdateLastDepartedLocation(const u16 *);\nu16 *QL_LoadAction_SceneEnd(u16 *, struct QuestLogAction *);\nbool8 QL_LoadEvent(const u16 *);\nbool8 QL_TryRepeatEvent(const u16 *);\nvoid QL_RecordWait(u16);\n\n#endif //GUARD_QUEST_LOG_H\n"
  },
  {
    "path": "include/quest_log_battle.h",
    "content": "#ifndef GUARD_QUEST_LOG_BATTLE_H\n#define GUARD_QUEST_LOG_BATTLE_H\n\n#include \"global.h\"\n\nvoid TrySetQuestLogBattleEvent(void);\nvoid TrySetQuestLogLinkBattleEvent(void);\n\n#endif // GUARD_QUEST_LOG_BATTLE_H\n"
  },
  {
    "path": "include/quest_log_objects.h",
    "content": "#ifndef GUARD_QUEST_LOG_OBJECTS_H\n#define GUARD_QUEST_LOG_OBJECTS_H\n\n#include \"global.h\"\n\nvoid QL_RecordObjects(struct QuestLogScene *);\nvoid QL_LoadObjects(struct QuestLogScene *, struct ObjectEventTemplate *);\nvoid QL_TryStopSurfing(void);\n\n#endif //GUARD_QUEST_LOG_OBJECTS_H\n"
  },
  {
    "path": "include/quest_log_player.h",
    "content": "#ifndef GUARD_QUEST_LOG_PLAYER_H\n#define GUARD_QUEST_LOG_PLAYER_H\n\n#include \"global.h\"\n\nenum {\n    QL_PLAYER_GFX_NORMAL,\n    QL_PLAYER_GFX_BIKE,\n    QL_PLAYER_GFX_FISH,\n    QL_PLAYER_GFX_SURF,\n    QL_PLAYER_GFX_STOP_SURF_S,\n    QL_PLAYER_GFX_STOP_SURF_N,\n    QL_PLAYER_GFX_STOP_SURF_W,\n    QL_PLAYER_GFX_STOP_SURF_E,\n    QL_PLAYER_GFX_VSSEEKER,\n    QL_PLAYER_GFX_NONE = 0xFF\n};\n\n\nvoid QuestLogUpdatePlayerSprite(u8 state);\nbool32 QuestLogTryRecordPlayerAvatarGfxTransition(u8 state);\nvoid QuestLogCallUpdatePlayerSprite(u8 state);\n\n#endif //GUARD_QUEST_LOG_PLAYER_H\n"
  },
  {
    "path": "include/random.h",
    "content": "#ifndef GUARD_RANDOM_H\n#define GUARD_RANDOM_H\n\n#include \"global.h\"\n\nextern u32 gRngValue;\nextern u32 gRng2Value;\n\n//Returns a 16-bit pseudorandom number\nu16 Random(void);\nu16 Random2(void);\n\n//Returns a 32-bit pseudorandom number\n#define Random32() (Random() | (Random() << 16))\n\n// The number 1103515245 comes from the example implementation of rand and srand\n// in the ISO C standard.\n#define RAND_MULT 1103515245\n#define ISO_RANDOMIZE1(val)(RAND_MULT * (val) + 24691)\n#define ISO_RANDOMIZE2(val)(RAND_MULT * (val) + 12345)\n\n//Sets the initial seed value of the pseudorandom number generator\nvoid SeedRng(u16 seed);\nvoid SeedRng2(u16 seed);\n\n#endif // GUARD_RANDOM_H\n"
  },
  {
    "path": "include/region_map.h",
    "content": "#ifndef GUARD_REGION_MAP_H\n#define GUARD_REGION_MAP_H\n\n#include \"global.h\"\n#include \"bg.h\"\n\nenum {\n    REGIONMAP_TYPE_NORMAL,\n    REGIONMAP_TYPE_WALL,\n    REGIONMAP_TYPE_FLY,\n    REGIONMAP_TYPE_HOENN,\n    REGIONMAP_TYPE_COUNT\n};\n\nu8 *GetMapName(u8 *dest, u16 mapsec, u16 fill);\nu8 *GetMapNameGeneric(u8 *dest, u16 mapsec);\nu8 *GetMapNameGeneric_(u8 *dest, u16 mapsec);\nvoid InitRegionMapWithExitCB(u8 type, void (*callback)(void));\nvoid CB2_OpenFlyMap(void);\n\n#endif // GUARD_REGION_MAP_H\n"
  },
  {
    "path": "include/renewable_hidden_items.h",
    "content": "#ifndef GUARD_RENEWABLE_HIDDEN_ITEMS_H\n#define GUARD_RENEWABLE_HIDDEN_ITEMS_H\n\nvoid IncrementRenewableHiddenItemStepCounter(void);\nvoid TryRegenerateRenewableHiddenItems(void);\nvoid SetAllRenewableItemFlags(void);\n\n#endif //GUARD_RENEWABLE_HIDDEN_ITEMS_H\n"
  },
  {
    "path": "include/reset_save_heap.h",
    "content": "#ifndef GUARD_RESET_SAVE_HEAP_H\n#define GUARD_RESET_SAVE_HEAP_H\n\nvoid ReloadSave(void);\n\n#endif //GUARD_RESET_SAVE_HEAP_H\n\n"
  },
  {
    "path": "include/reshow_battle_screen.h",
    "content": "#ifndef GUARD_RESHOW_BATTLE_SCREEN_H\n#define GUARD_RESHOW_BATTLE_SCREEN_H\n\n#include \"global.h\"\n\nvoid ReshowBattleScreenDummy(void);\nvoid ReshowBattleScreenAfterMenu(void);\n\n#endif // GUARD_RESHOW_BATTLE_SCREEN_H\n"
  },
  {
    "path": "include/roamer.h",
    "content": "#ifndef GUARD_ROAMER_H\n#define GUARD_ROAMER_H\n\n#include \"global.h\"\n\nvoid ClearRoamerData(void);\nu16 GetRoamerSpecies(void);\nvoid ClearRoamerLocationData(void);\nvoid InitRoamer(void);\nvoid UpdateLocationHistoryForRoamer(void);\nvoid RoamerMoveToOtherLocationSet(void);\nvoid RoamerMove(void);\nbool8 IsRoamerAt(u8 mapGroup, u8 mapNum);\nvoid CreateRoamerMonInstance(void);\nu8 TryStartRoamerEncounter(void);\nvoid UpdateRoamerHPStatus(struct Pokemon *mon);\nvoid SetRoamerInactive(void);\nvoid GetRoamerLocation(u8 *mapGroup, u8 *mapNum);\nu16 GetRoamerLocationMapSectionId(void);\n\n#endif // GUARD_ROAMER_H\n"
  },
  {
    "path": "include/safari_zone.h",
    "content": "#ifndef GUARD_SAFARI_ZONE_H\n#define GUARD_SAFARI_ZONE_H\n\n#include \"global.h\"\n\nextern u8 gNumSafariBalls;\nextern u16 gSafariZoneStepCounter;\n\nbool32 GetSafariZoneFlag(void);\nvoid SetSafariZoneFlag(void);\nvoid ResetSafariZoneFlag(void);\n\nvoid EnterSafariMode(void);\nvoid ExitSafariMode(void);\n\nbool8 SafariZoneTakeStep(void);\nvoid SafariZoneRetirePrompt(void);\n\nvoid CB2_EndSafariBattle(void);\n\n#endif // GUARD_SAFARI_ZONE_H\n"
  },
  {
    "path": "include/save.h",
    "content": "#ifndef GUARD_SAVE_H\n#define GUARD_SAVE_H\n\n#include \"global.h\"\n\n// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer.\n// Only 12 bytes of the footer are used.\n#define SECTOR_DATA_SIZE 3968\n#define SECTOR_FOOTER_SIZE 128\n#define SECTOR_SIZE (SECTOR_DATA_SIZE + SECTOR_FOOTER_SIZE)\n\n#define NUM_SAVE_SLOTS 2\n\n// If the sector's signature field is not this value then the sector is either invalid or empty.\n#define SECTOR_SIGNATURE 0x08012025\n\n#define SPECIAL_SECTOR_SENTINEL 0xB39D\n\n#define SECTOR_ID_SAVEBLOCK2          0\n#define SECTOR_ID_SAVEBLOCK1_START    1\n#define SECTOR_ID_SAVEBLOCK1_END      4\n#define SECTOR_ID_PKMN_STORAGE_START  5\n#define SECTOR_ID_PKMN_STORAGE_END   13\n#define NUM_SECTORS_PER_SLOT         14\n// Save Slot 1: 0-13;  Save Slot 2: 14-27\n#define SECTOR_ID_HOF_1              28\n#define SECTOR_ID_HOF_2              29\n#define SECTOR_ID_TRAINER_TOWER_1    30\n#define SECTOR_ID_TRAINER_TOWER_2    31\n#define SECTORS_COUNT                32\n\n#define NUM_HOF_SECTORS 2\n\n#define SAVE_STATUS_EMPTY    0\n#define SAVE_STATUS_OK       1\n#define SAVE_STATUS_INVALID  2\n#define SAVE_STATUS_NO_FLASH 4\n#define SAVE_STATUS_ERROR    0xFF\n\n// Special sector id value for certain save functions\n// to indicate that all sectors should be used\n// instead of a specific sector.\n#define FULL_SAVE_SLOT 0xFFFF\n\nenum\n{\n    SAVE_NORMAL,\n    SAVE_LINK,\n    SAVE_EREADER,\n    SAVE_HALL_OF_FAME,\n    SAVE_OVERWRITE_DIFFERENT_FILE,\n    SAVE_HALL_OF_FAME_ERASE_BEFORE, // unused\n};\n\n// A save sector location holds a pointer to the data for a particular sector\n// and the size of that data. Size cannot be greater than SECTOR_DATA_SIZE.\nstruct SaveSectorLocation\n{\n    u8 *data;\n    u16 size;\n};\n\nstruct SaveSector\n{\n    u8 data[SECTOR_DATA_SIZE];\n    u8 unused[SECTOR_FOOTER_SIZE - 12]; // Unused portion of the footer\n    u16 id;\n    u16 checksum;\n    u32 signature;\n    u32 counter;\n}; // size is SECTOR_SIZE (0x1000)\n\n#define SECTOR_SIGNATURE_OFFSET offsetof(struct SaveSector, signature)\n#define SECTOR_COUNTER_OFFSET   offsetof(struct SaveSector, counter)\n\n// operations for SetDamagedSectorBits\nenum\n{\n    ENABLE,\n    DISABLE,\n    CHECK // unused\n};\n\nextern u32 gDamagedSaveSectors;\nextern struct SaveSector *gSaveDataBufferPtr; // the pointer is in fast IWRAM but points to the slower EWRAM.\nextern u16 gSaveFileStatus;\nextern void (*gGameContinueCallback)(void);\nextern u16 gSaveAttemptStatus;\n\nextern struct SaveSector gSaveDataBuffer;\n\nvoid ClearSaveData(void);\nvoid Save_ResetSaveCounters(void);\nu8 HandleSavingData(u8 saveType);\nu8 TrySavingData(u8 saveType);\nbool8 LinkFullSave_Init(void);\nbool8 LinkFullSave_WriteSector(void);\nbool8 LinkFullSave_ReplaceLastSector(void);\nbool8 LinkFullSave_SetLastSectorSignature(void);\nbool8 WriteSaveBlock2(void);\nbool8 WriteSaveBlock1Sector(void);\nu8 LoadGameSave(u8 saveType);\nu32 TryReadSpecialSaveSector(u8 sector, u8 *dst);\nu32 TryWriteSpecialSaveSector(u8 sector, u8 *src);\nvoid Task_LinkFullSave(u8 taskId);\n\n#endif // GUARD_SAVE_H\n"
  },
  {
    "path": "include/save_failed_screen.h",
    "content": "#ifndef GUARD_SAVE_FAILED_SCREEN_H\n#define GUARD_SAVE_FAILED_SCREEN_H\n\nextern void DoSaveFailedScreen(u8 saveType); // save_failed_screen\nvoid SetNotInSaveFailedScreen(void);\nbool32 RunSaveFailedScreen(void);\n\n#endif //GUARD_SAVE_FAILED_SCREEN_H\n"
  },
  {
    "path": "include/save_location.h",
    "content": "#ifndef GUARD_SAVE_LOCATION_H\n#define GUARD_SAVE_LOCATION_H\n\n// specialSaveWarp flags\n#define CONTINUE_GAME_WARP           (1 << 0)\n#define POKECENTER_SAVEWARP          (1 << 1)\n#define LOBBY_SAVEWARP               (1 << 2)\n#define UNK_SPECIAL_SAVE_WARP_FLAG_3 (1 << 3)\n#define CHAMPION_SAVEWARP            (1 << 7)\n\nvoid TrySetMapSaveWarpStatus(void);\nbool32 IsCurMapPokeCenter(void);\nvoid SetUnlockedPokedexFlags(void);\nvoid SetPostgameFlags(void);\n\n#endif // GUARD_SAVE_LOCATION_H\n"
  },
  {
    "path": "include/save_menu_util.h",
    "content": "#ifndef GUARD_SAVE_MENU_UTIL_H\n#define GUARD_SAVE_MENU_UTIL_H\n\nenum SaveStat\n{\n    SAVE_STAT_NAME = 0,\n    SAVE_STAT_POKEDEX,\n    SAVE_STAT_TIME,\n    SAVE_STAT_LOCATION,\n    SAVE_STAT_BADGES,\n    SAVE_STAT_TIME_HR_RT_ALIGN\n};\n\nvoid SaveStatToString(u8 a0, u8 *a1, u8 a2);\n\n#endif //GUARD_SAVE_MENU_UTIL_H\n"
  },
  {
    "path": "include/scanline_effect.h",
    "content": "#ifndef GUARD_SCANLINE_EFFECT_H\n#define GUARD_SCANLINE_EFFECT_H\n\n// DMA control value to transfer a single 16-bit value at HBlank\n#define SCANLINE_EFFECT_DMACNT_16BIT (((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_INC | DMA_16BIT | DMA_DEST_RELOAD) << 16) | 1)\n#define SCANLINE_EFFECT_DMACNT_32BIT (((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_INC | DMA_32BIT | DMA_DEST_RELOAD) << 16) | 1)\n\n#define SCANLINE_EFFECT_REG_BG0HOFS (REG_ADDR_BG0HOFS - REG_ADDR_BG0HOFS)\n#define SCANLINE_EFFECT_REG_BG0VOFS (REG_ADDR_BG0VOFS - REG_ADDR_BG0HOFS)\n#define SCANLINE_EFFECT_REG_BG1HOFS (REG_ADDR_BG1HOFS - REG_ADDR_BG0HOFS)\n#define SCANLINE_EFFECT_REG_BG1VOFS (REG_ADDR_BG1VOFS - REG_ADDR_BG0HOFS)\n#define SCANLINE_EFFECT_REG_BG2HOFS (REG_ADDR_BG2HOFS - REG_ADDR_BG0HOFS)\n#define SCANLINE_EFFECT_REG_BG2VOFS (REG_ADDR_BG2VOFS - REG_ADDR_BG0HOFS)\n#define SCANLINE_EFFECT_REG_BG3HOFS (REG_ADDR_BG3HOFS - REG_ADDR_BG0HOFS)\n#define SCANLINE_EFFECT_REG_BG3VOFS (REG_ADDR_BG3VOFS - REG_ADDR_BG0HOFS)\n\nstruct ScanlineEffectParams\n{\n    volatile void *dmaDest;\n    u32 dmaControl;\n    u8 initState;\n    u8 unused9;\n};\n\nstruct ScanlineEffect\n{\n    void *dmaSrcBuffers[2];\n    volatile void *dmaDest;\n    u32 dmaControl;\n    void (*setFirstScanlineReg)(void);\n    u8 srcBuffer;\n    u8 state;\n    u8 unused16;\n    u8 unused17;\n    u8 waveTaskId;\n};\n\nextern struct ScanlineEffect gScanlineEffect;\n\nextern u16 gScanlineEffectRegBuffers[2][0x3C0];\n\nvoid ScanlineEffect_Stop(void);\nvoid ScanlineEffect_Clear(void);\nvoid ScanlineEffect_SetParams(struct ScanlineEffectParams);\nvoid ScanlineEffect_InitHBlankDmaTransfer(void);\nu8 ScanlineEffect_InitWave(u8 startLine, u8 endLine, u8 frequency, u8 amplitude, u8 delayInterval, u8 regOffset, bool8 a7);\n\n#endif // GUARD_SCANLINE_EFFECT_H\n"
  },
  {
    "path": "include/script.h",
    "content": "#ifndef GUARD_SCRIPT_H\n#define GUARD_SCRIPT_H\n\n#include \"global.h\"\n\nstruct ScriptContext;\n\ntypedef bool8 (*ScrCmdFunc)(struct ScriptContext *);\ntypedef u8 Script[];\n\nstruct ScriptContext\n{\n    u8 stackDepth;\n    u8 mode;\n    u8 comparisonResult;\n    u8 (*nativePtr)(void);\n    const u8 *scriptPtr;\n    const u8 *stack[20];\n    ScrCmdFunc *cmdTable;\n    ScrCmdFunc *cmdTableEnd;\n    u32 data[4];\n};\n\n#define ScriptReadByte(ctx) (*(ctx->scriptPtr++))\n\nvoid InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd);\nu8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr);\nvoid SetupNativeScript(struct ScriptContext *ctx, bool8 (*ptr)(void));\nvoid StopScript(struct ScriptContext *ctx);\nbool8 RunScriptCommand(struct ScriptContext *ctx);\nvoid ScriptJump(struct ScriptContext *ctx, const u8 *ptr);\nvoid ScriptCall(struct ScriptContext *ctx, const u8 *ptr);\nvoid ScriptReturn(struct ScriptContext *ctx);\nu16 ScriptReadHalfword(struct ScriptContext *ctx);\nu32 ScriptReadWord(struct ScriptContext *ctx);\nvoid LockPlayerFieldControls(void);\nvoid UnlockPlayerFieldControls(void);\nbool8 ArePlayerFieldControlsLocked(void);\nvoid ScriptContext_Init(void);\nbool8 ScriptContext_IsEnabled(void);\nbool8 ScriptContext_RunScript(void);\nvoid ScriptContext_SetupScript(const u8 *ptr);\nvoid ScriptContext_Stop(void);\nvoid ScriptContext_Enable(void);\nvoid RunScriptImmediately(const u8 *ptr);\nvoid RunOnLoadMapScript(void);\nvoid RunOnTransitionMapScript(void);\nvoid RunOnResumeMapScript(void);\nvoid RunOnReturnToFieldMapScript(void);\nvoid RunOnDiveWarpMapScript(void);\nbool8 TryRunOnFrameMapScript(void);\nvoid TryRunOnWarpIntoMapScript(void);\nu32 CalculateRamScriptChecksum(void);\nvoid ClearRamScript(void);\nbool8 InitRamScript(u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 objectId);\nconst u8 *GetRamScript(u8 objectId, const u8 *script);\nbool32 ValidateRamScript(void);\nvoid InitRamScript_NoObjectEvent(u8 * script, u16 scriptSize);\nu8 * GetSavedRamScriptIfValid(void);\nvoid RegisterQuestLogInput(u8 var);\nvoid ClearMsgBoxCancelableState(void);\nvoid SetQuestLogInputIsDpadFlag(void);\nvoid ClearQuestLogInput(void);\nvoid ClearQuestLogInputIsDpadFlag(void);\nvoid MsgSetSignpost(void);\nvoid MsgSetNotSignpost(void);\nbool8 IsMsgSignpost(void);\nbool8 IsQuestLogInputDpad(void);\nu8 GetRegisteredQuestLogInput(void);\nvoid ResetFacingNpcOrSignpostVars(void);\nbool8 CanWalkAwayToCancelMsgBox(void);\nvoid SetWalkingIntoSignVars(void);\nbool8 IsMsgBoxWalkawayDisabled(void);\nvoid UpdateBattleHouseStepCounter(void);\nu8 ReturnBattleHouseLevel(void);\n\nextern const u8 *gRamScriptRetAddr;\nextern u8 gWalkAwayFromSignInhibitTimer;\n\n#endif // GUARD_SCRIPT_H\n"
  },
  {
    "path": "include/script_menu.h",
    "content": "#ifndef GUARD_SCRIPT_MENU_H\n#define GUARD_SCRIPT_MENU_H\n\n#include \"global.h\"\n\nextern const u8 *const gStdStringPtrs[];\n\nbool8 ScriptMenu_Multichoice(u8 left, u8 top, u8 var3, u8 var4);\nbool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 var3, u8 var4, u8 var5);\nbool8 ScriptMenu_YesNo(u8 var1, u8 var2);\nbool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, u8 a4, u8 columnCount);\nbool8 ScriptMenu_ShowPokemonPic(u16 var1, u8 var2, u8 var3);\nbool8 CreatePCMenu(void);\nvoid ScriptMenu_DisplayPCStartupPrompt(void);\n\nbool8 (*ScriptMenu_HidePokemonPic(void))(void);\nvoid QL_DestroyAbortedDisplay(void);\nvoid PicboxCancel(void);\n\n#endif //GUARD_SCRIPT_MENU_H\n"
  },
  {
    "path": "include/script_movement.h",
    "content": "#ifndef GUARD_SCRIPT_MOVEMENT_H\n#define GUARD_SCRIPT_MOVEMENT_H\n\n#include \"global.h\"\n\nbool8 ScriptMovement_StartObjectMovementScript(u8, u8, u8, const u8 *);\nbool8 ScriptMovement_IsObjectMovementFinished(u8, u8, u8);\nvoid ScriptMovement_UnfreezeObjectEvents(void);\n\n#endif // GUARD_SCRIPT_MOVEMENT_H\n"
  },
  {
    "path": "include/script_pokemon_util.h",
    "content": "#ifndef GUARD_SCRIPT_POKEMON_UTIL_H\n#define GUARD_SCRIPT_POKEMON_UTIL_H\n\nbool8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unk1, u32 unk2, u8 unk3);\nbool8 ScriptGiveEgg(u16 species);\nvoid ScriptSetMonMoveSlot(u8 partyIdx, u16 move, u8 slot);\nvoid HealPlayerParty(void);\nvoid ReducePlayerPartyToThree(void);\nvoid CreateScriptedWildMon(u16 species, u8 level, u16 item);\nvoid HealPlayerPartyOak(void);\n\n#endif //GUARD_SCRIPT_POKEMON_UTIL_H\n"
  },
  {
    "path": "include/shop.h",
    "content": "#ifndef GUARD_SHOP_H\n#define GUARD_SHOP_H\n\n#include \"global.h\"\n#include \"menu_helpers.h\"\n\n#define INDEX_CANCEL -2\n\nvoid CreatePokemartMenu(const u16 *itemsForSale);\nvoid CreateDecorationShop1Menu(const u16 *);\nvoid CreateDecorationShop2Menu(const u16 *);\nu8 GetMartFontId(void);\nvoid RecordItemTransaction(u16 itemId, u16 quantity, u8 logEventId);\n\n// buy_menu_helper\nvoid BuyMenuInitWindows(bool32 isSellingTM);\nvoid BuyMenuDrawMoneyBox(void);\nvoid BuyMenuPrint(u8 windowId, u8 font, const u8 *text, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 color);\nvoid BuyMenuDisplayMessage(u8 taskId, const u8 *text, TaskFunc callback);\nvoid BuyMenuQuantityBoxNormalBorder(u8 windowId, bool8 copyToVram);\nvoid BuyMenuQuantityBoxThinBorder(u8 windowId, bool8 copyToVram);\nvoid BuyMenuConfirmPurchase(u8 taskId, const struct YesNoFuncTable *yesNo);\n\n#endif // GUARD_SHOP_H\n"
  },
  {
    "path": "include/slot_machine.h",
    "content": "#ifndef GUARD_SLOT_MACHINE_H\n#define GUARD_SLOT_MACHINE_H\n\n#include \"global.h\"\n\nvoid PlaySlotMachine(u16, void (*)(void));\n\n#endif // GUARD_SLOT_MACHINE_H\n"
  },
  {
    "path": "include/sound.h",
    "content": "#ifndef GUARD_SOUND_H\n#define GUARD_SOUND_H\n\n#include \"global.h\"\n\nvoid InitMapMusic(void);\nvoid MapMusicMain(void);\nvoid ResetMapMusic(void);\nu16 GetCurrentMapMusic(void);\nvoid PlayNewMapMusic(u16 songNum);\nvoid StopMapMusic(void);\nvoid FadeOutMapMusic(u8 speed);\nvoid FadeOutAndPlayNewMapMusic(u16 songNum, u8 speed);\nvoid FadeOutAndFadeInNewMapMusic(u16 songNum, u8 fadeOutSpeed, u8 fadeInSpeed);\nbool8 IsNotWaitingForBGMStop(void);\nvoid PlayFanfareByFanfareNum(u8 fanfareNum);\nbool8 WaitFanfare(bool8 stop);\nvoid StopFanfareByFanfareNum(u8 fanfareNum);\nvoid PlayFanfare(u16 songNum);\nbool8 IsFanfareTaskInactive(void);\nvoid FadeInNewBGM(u16 songNum, u8 speed);\nvoid FadeOutBGMTemporarily(u8 speed);\nbool8 IsBGMPausedOrStopped(void);\nvoid FadeInBGM(u8 speed);\nvoid FadeOutBGM(u8 speed);\nbool8 IsBGMStopped(void);\nvoid PlayCry_Normal(u16 species, s8 pan);\nvoid PlayCry_NormalNoDucking(u16 species, s8 pan, s8 volume, u8 priority);\nvoid PlayCry_ByMode(u16 species, s8 pan, u8 mode);\nvoid PlayCry_ReleaseDouble(u16 species, s8 pan, u8 mode);\nvoid PlayCry_Script(u16 species, u8 mode);\nvoid PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode);\nbool8 IsCryFinished(void);\nvoid StopCryAndClearCrySongs(void);\nvoid StopCry(void);\nbool8 IsCryPlayingOrClearCrySongs(void);\nbool8 IsCryPlaying(void);\nvoid PlayBGM(u16 songNum);\nvoid PlaySE(u16 songNum);\nvoid PlaySE12WithPanning(u16 songNum, s8 pan);\nvoid PlaySE1WithPanning(u16 songNum, s8 pan);\nvoid PlaySE2WithPanning(u16 songNum, s8 pan);\nvoid SE12PanpotControl(s8 pan);\nbool8 IsSEPlaying(void);\nbool8 IsBGMPlaying(void);\nbool8 IsSpecialSEPlaying(void);\nvoid SetBGMVolume_SuppressHelpSystemReduction(u16 volume);\nvoid BGMVolumeMax_EnableHelpSystemReduction(void);\n\n#endif // GUARD_SOUND_H\n"
  },
  {
    "path": "include/special_field_anim.h",
    "content": "#ifndef GUARD_SPECIAL_FIELD_ANIM_H\n#define GUARD_SPECIAL_FIELD_ANIM_H\n\n#include \"global.h\"\n\nvoid StartEscalator(bool8 goingUp);\nvoid StopEscalator(void);\nbool8 IsEscalatorMoving(void);\n\n#endif // GUARD_SPECIAL_FIELD_ANIM_H\n"
  },
  {
    "path": "include/sprite.h",
    "content": "#ifndef GUARD_SPRITE_H\n#define GUARD_SPRITE_H\n\n#include \"global.h\"\n\n#define MAX_SPRITES 64\n#define SPRITE_NONE 0xFF\n#define TAG_NONE 0xFFFF\n\n// Given to SetSpriteMatrixAnchor to skip anchoring one of the coords.\n#define NO_ANCHOR 0x800\n\nstruct SpriteSheet\n{\n    const void *data;  // Raw uncompressed pixel data\n    u16 size;\n    u16 tag;\n};\n\nstruct CompressedSpriteSheet\n{\n    const u32 *data;  // LZ77 compressed pixel data\n    u16 size;        // Uncompressed size of pixel data\n    u16 tag;\n};\n\nstruct SpriteFrameImage\n{\n    const void *data;\n    u16 size;\n};\n\n#define obj_frame_tiles(ptr) {.data = (u8 *)ptr, .size = sizeof ptr}\n#define overworld_frame(ptr, width, height, frame) {.data = (u8 *)ptr + (width * height * frame * 64)/2, .size = (width * height * 64)/2}\n\nstruct SpritePalette\n{\n    const u16 *data;  // Raw uncompressed palette data\n    u16 tag;\n};\n\nstruct CompressedSpritePalette\n{\n    const u32 *data;  // LZ77 compressed palette data\n    u16 tag;\n};\n\nstruct AnimFrameCmd\n{\n    // If the sprite has an array of images, this is the array index.\n    // If the sprite has a sheet, this is the tile offset.\n    u32 imageValue:16;\n\n    u32 duration:6;\n    u32 hFlip:1;\n    u32 vFlip:1;\n};\n\nstruct AnimLoopCmd\n{\n    u32 type:16;\n    u32 count:6;\n};\n\nstruct AnimJumpCmd\n{\n    u32 type:16;\n    u32 target:6;\n};\n\n// The first halfword of this union specifies the type of command.\n// If it -2, then it is a jump command. If it is -1, then it is the end of the script.\n// Otherwise, it is the imageValue for a frame command.\nunion AnimCmd\n{\n    s16 type;\n    struct AnimFrameCmd frame;\n    struct AnimLoopCmd loop;\n    struct AnimJumpCmd jump;\n};\n\n#define ANIMCMD_FRAME(...) \\\n    {.frame = {__VA_ARGS__}}\n#define ANIMCMD_LOOP(_count) \\\n    {.loop = {.type = -3, .count = _count}}\n#define ANIMCMD_JUMP(_target) \\\n    {.jump = {.type = -2, .target = _target}}\n#define ANIMCMD_END \\\n    {.type = -1}\n\nstruct AffineAnimFrameCmd\n{\n    s16 xScale;\n    s16 yScale;\n    u8 rotation;\n    u8 duration;\n};\n\nstruct AffineAnimLoopCmd\n{\n    s16 type;\n    s16 count;\n};\n\nstruct AffineAnimJumpCmd\n{\n    s16 type;\n    u16 target;\n};\n\nstruct AffineAnimEndCmdAlt\n{\n    s16 type;\n    u16 val;\n};\n\nunion AffineAnimCmd\n{\n    s16 type;\n    struct AffineAnimFrameCmd frame;\n    struct AffineAnimLoopCmd loop;\n    struct AffineAnimJumpCmd jump;\n    struct AffineAnimEndCmdAlt end;\n};\n\n#define AFFINEANIMCMDTYPE_LOOP 0x7FFD\n#define AFFINEANIMCMDTYPE_JUMP 0x7FFE\n#define AFFINEANIMCMDTYPE_END  0x7FFF\n\n#define AFFINEANIMCMD_FRAME(_xScale, _yScale, _rotation, _duration) \\\n    {.frame = {.xScale = _xScale, .yScale = _yScale, .rotation = _rotation, .duration = _duration}}\n#define AFFINEANIMCMD_LOOP(_count) \\\n    {.loop = {.type = AFFINEANIMCMDTYPE_LOOP, .count = _count}}\n#define AFFINEANIMCMD_JUMP(_target) \\\n    {.jump = {.type = AFFINEANIMCMDTYPE_JUMP, .target = _target}}\n#define AFFINEANIMCMD_END \\\n    {.type = AFFINEANIMCMDTYPE_END}\n#define AFFINEANIMCMD_LOOP(_count) \\\n    {.loop = {.type = AFFINEANIMCMDTYPE_LOOP, .count = _count}}\n#define AFFINEANIMCMD_JUMP(_target) \\\n    {.jump = {.type = AFFINEANIMCMDTYPE_JUMP, .target = _target}}\n#define AFFINEANIMCMD_END_ALT(_val) \\\n    {.end = {.type = AFFINEANIMCMDTYPE_END, .val = _val}}\n\nstruct AffineAnimState\n{\n    u8 animNum;\n    u8 animCmdIndex;\n    u8 delayCounter;\n    u8 loopCounter;\n    s16 xScale;\n    s16 yScale;\n    u16 rotation;\n};\n\nenum\n{\n    SUBSPRITES_OFF,\n    SUBSPRITES_ON,\n    SUBSPRITES_IGNORE_PRIORITY, // on but priority is ignored\n};\n\nstruct Subsprite\n{\n    s8 x; // was u16 in R/S\n    s8 y; // was u16 in R/S\n    u16 shape:2;\n    u16 size:2;\n    u16 tileOffset:10;\n    u16 priority:2;\n};\n\nstruct SubspriteTable\n{\n    u8 subspriteCount;\n    const struct Subsprite *subsprites;\n};\n\nstruct Sprite;\n\ntypedef void (*SpriteCallback)(struct Sprite *);\n\nstruct SpriteTemplate\n{\n    u16 tileTag;\n    u16 paletteTag;\n    const struct OamData *oam;\n    const union AnimCmd *const *anims;\n    const struct SpriteFrameImage *images;\n    const union AffineAnimCmd *const *affineAnims;\n    SpriteCallback callback;\n};\n\nstruct Sprite\n{\n    /*0x00*/ struct OamData oam;\n    /*0x08*/ const union AnimCmd *const *anims;\n    /*0x0C*/ const struct SpriteFrameImage *images;\n    /*0x10*/ const union AffineAnimCmd *const *affineAnims;\n    /*0x14*/ const struct SpriteTemplate *template;\n    /*0x18*/ const struct SubspriteTable *subspriteTables;\n    /*0x1C*/ SpriteCallback callback;\n\n    /*0x20*/ s16 x, y;\n    /*0x24*/ s16 x2, y2;\n    /*0x28*/ s8 centerToCornerVecX;\n    /*0x29*/ s8 centerToCornerVecY;\n\n    /*0x2A*/ u8 animNum;\n    /*0x2B*/ u8 animCmdIndex;\n    /*0x2C*/ u8 animDelayCounter:6;\n             u8 animPaused:1;\n             u8 affineAnimPaused:1;\n    /*0x2D*/ u8 animLoopCounter;\n\n    // general purpose data fields\n    /*0x2E*/ s16 data[8];\n\n    /*0x3E*/ u16 inUse:1;               //1\n             u16 coordOffsetEnabled:1;  //2\n             u16 invisible:1;           //4\n             u16 flags_3:1;             //8\n             u16 flags_4:1;             //0x10\n             u16 flags_5:1;             //0x20\n             u16 flags_6:1;             //0x40\n             u16 flags_7:1;             //0x80\n    /*0x3F*/ u16 hFlip:1;               //1\n             u16 vFlip:1;               //2\n             u16 animBeginning:1;       //4\n             u16 affineAnimBeginning:1; //8\n             u16 animEnded:1;           //0x10\n             u16 affineAnimEnded:1;     //0x20\n             u16 usingSheet:1;          //0x40\n             u16 anchored:1;            //0x80\n\n    /*0x40*/ u16 sheetTileStart;\n\n    /*0x42*/ u8 subspriteTableNum:6;\n             u8 subspriteMode:2;\n\n    /*0x43*/ u8 subpriority;\n};\n\nstruct OamMatrix\n{\n    s16 a;\n    s16 b;\n    s16 c;\n    s16 d;\n};\n\nextern const struct OamData gDummyOamData;\nextern const union AnimCmd *const gDummySpriteAnimTable[];\nextern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[];\nextern s16 gSpriteCoordOffsetX;\nextern s16 gSpriteCoordOffsetY;\nextern const struct SpriteTemplate gDummySpriteTemplate;\nextern struct Sprite gSprites[];\nextern struct OamMatrix gOamMatrices[];\nextern bool8 gAffineAnimsDisabled;\nextern u16 gReservedSpriteTileCount;\n\nvoid ResetSpriteData(void);\nvoid AnimateSprites(void);\nvoid BuildOamBuffer(void);\nu8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);\nu8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);\nu8 CreateInvisibleSprite(void (*callback)(struct Sprite *));\nu8 CreateSpriteAndAnimate(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);\nvoid DestroySprite(struct Sprite *sprite);\nvoid ResetOamRange(u8 a, u8 b);\nvoid LoadOam(void);\nvoid SetOamMatrix(u8 matrixNum, u16 a, u16 b, u16 c, u16 d);\nvoid CalcCenterToCornerVec(struct Sprite *sprite, u8 shape, u8 size, u8 affineMode);\nvoid SpriteCallbackDummy(struct Sprite *sprite);\nvoid ProcessSpriteCopyRequests(void);\nvoid RequestSpriteCopy(const u8 *src, u8 *dest, u16 size);\nvoid FreeSpriteTiles(struct Sprite *sprite);\nvoid FreeSpritePalette(struct Sprite *sprite);\nvoid FreeSpriteOamMatrix(struct Sprite *sprite);\nvoid DestroySpriteAndFreeResources(struct Sprite *sprite);\nvoid AnimateSprite(struct Sprite *sprite);\nvoid StartSpriteAnim(struct Sprite *sprite, u8 animNum);\nvoid StartSpriteAnimIfDifferent(struct Sprite *sprite, u8 animNum);\nvoid SeekSpriteAnim(struct Sprite *sprite, u8 animCmdIndex);\nvoid StartSpriteAffineAnim(struct Sprite *sprite, u8 animNum);\nvoid StartSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum);\nvoid ChangeSpriteAffineAnim(struct Sprite *sprite, u8 animNum);\nvoid ChangeSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum);\nvoid SetSpriteSheetFrameTileNum(struct Sprite *sprite);\nu8 AllocOamMatrix(void);\nvoid FreeOamMatrix(u8 matrixNum);\nvoid InitSpriteAffineAnim(struct Sprite *sprite);\nvoid SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation);\nu16 LoadSpriteSheet(const struct SpriteSheet *sheet);\nvoid LoadSpriteSheets(const struct SpriteSheet *sheets);\nu16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet);\nvoid AllocTilesForSpriteSheets(struct SpriteSheet *sheets);\nvoid FreeSpriteTilesByTag(u16 tag);\nvoid FreeSpriteTileRanges(void);\nu16 GetSpriteTileStartByTag(u16 tag);\nu16 GetSpriteTileTagByTileStart(u16 start);\nvoid RequestSpriteSheetCopy(const struct SpriteSheet *sheet);\nu16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet);\nvoid FreeAllSpritePalettes(void);\nu8 LoadSpritePalette(const struct SpritePalette *palette);\nvoid LoadSpritePalettes(const struct SpritePalette *palettes);\nu8 AllocSpritePalette(u16 tag);\nu8 IndexOfSpritePaletteTag(u16 tag);\nu16 GetSpritePaletteTagByPaletteNum(u8 paletteNum);\nvoid FreeSpritePaletteByTag(u16 tag);\nvoid SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables);\nbool8 AddSpriteToOamBuffer(struct Sprite *object, u32 *oamIndex);\nbool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u32 *oamIndex);\nvoid CopyToSprites(u8 *src);\nvoid CopyFromSprites(u8 *dest);\nu8 SpriteTileAllocBitmapOp(u16 bit, u8 op);\nvoid ClearSpriteCopyRequests(void);\nvoid ResetAffineAnimData(void);\nvoid FreeSpriteTilesIfNotUsingSheet(struct Sprite *sprite);\ns16 AllocSpriteTiles(u16 tileCount);\nvoid SetSpriteMatrixAnchor(struct Sprite* sprite, s16 xmod, s16 ymod);\n\n#endif //GUARD_SPRITE_H\n"
  },
  {
    "path": "include/start_menu.h",
    "content": "#ifndef GUARD_START_MENU_H\n#define GUARD_START_MENU_H\n\n#include \"global.h\"\n\nvoid AppendToList(u8 *list, u8 *pos, u8 newEntry);\nvoid Task_StartMenuHandleInput(u8 taskId);\nvoid SetUpReturnToStartMenu(void);\nvoid ShowStartMenu(void);\nvoid Field_AskSaveTheGame(void);\nvoid CB2_SetUpSaveAfterLinkBattle(void);\n\n#endif // GUARD_START_MENU_H\n"
  },
  {
    "path": "include/string_util.h",
    "content": "#ifndef GUARD_STRING_UTIL_H\n#define GUARD_STRING_UTIL_H\n\n#include \"global.h\"\n\nenum StringConvertMode\n{\n    STR_CONV_MODE_LEFT_ALIGN,\n    STR_CONV_MODE_RIGHT_ALIGN,\n    STR_CONV_MODE_LEADING_ZEROS\n};\n\nu8 *StringCopy_Nickname(u8 *dest, const u8 *src);\nu8 *StringGet_Nickname(u8 *str);\nu8 *StringCopy_PlayerName(u8 *dest, const u8 *src);\nu8 *StringCopy(u8 *dest, const u8 *src);\nu8 *StringAppend(u8 *dest, const u8 *src);\nu8 *StringCopyN(u8 *dest, const u8 *src, u8 n);\nu8 *StringAppendN(u8 *dest, const u8 *src, u8 n);\nu16 StringLength(const u8 *str);\ns32 StringCompare(const u8 *str1, const u8 *str2);\ns32 StringCompareN(const u8 *str1, const u8 *str2, u32 n);\nbool8 IsStringLengthAtLeast(const u8 *str, s32 n);\nu8 *ConvertIntToDecimalStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n);\nu8 *ConvertUIntToDecimalStringN(u8 *dest, u32 value, enum StringConvertMode mode, u8 n);\nu8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n);\nu8 *StringExpandPlaceholders(u8 *dest, const u8 *src);\nu8 *StringBraille(u8 *dest, const u8 *src);\nu8 *GetExpandedPlaceholder(u32 id);\nu8 *StringFill(u8 *dest, u8 c, u16 n);\nu8 *StringCopyPadded(u8 *dest, const u8 *src, u8 c, u16 n);\nu8 *StringFillWithTerminator(u8 *dest, u16 n);\nu8 *StringCopyN_Multibyte(u8 *dest, const u8 *src, u32 n);\nu32 StringLength_Multibyte(const u8 *str);\nu8 *WriteColorChangeControlCode(u8 *dest, u32 colorType, u8 color);\nbool32 IsStringJapanese(u8 *str);\nu8 GetExtCtrlCodeLength(u8 code);\ns32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2);\nvoid ConvertInternationalString(u8 *s, u8 language);\nvoid StripExtCtrlCodes(u8 *str);\n\n#endif // GUARD_STRING_UTIL_H\n"
  },
  {
    "path": "include/strings.h",
    "content": "#ifndef GUARD_STRINGS_H\n#define GUARD_STRINGS_H\n\n#include \"global.h\"\n\n// Exported type declarations\n\n// Exported RAM declarations\n\n// Exported ROM declarations\n\nextern const u8 gText_FromSpace[];\nextern const u8 gText_Lv50[];\nextern const u8 gText_OpenLevel[];\nextern const u8 gText_Mom[];\nextern const u8 gText_Dad[];\nextern const u8 gText_Cool[];\nextern const u8 gText_Beauty[];\nextern const u8 gText_Cute[];\nextern const u8 gText_Smart[];\nextern const u8 gText_Tough[];\nextern const u8 gText_Single[];\nextern const u8 gText_Double[];\nextern const u8 gText_Spicy2[];\nextern const u8 gText_Dry2[];\nextern const u8 gText_Sweet2[];\nextern const u8 gText_Bitter2[];\nextern const u8 gText_Sour2[];\nextern const u8 gText_Excellent[];\nextern const u8 gText_VeryGood[];\nextern const u8 gText_Good[];\nextern const u8 gText_SoSo[];\nextern const u8 gText_Bad[];\nextern const u8 gText_TheWorst[];\nextern const u8 gText_Slots[];\nextern const u8 gText_Roulette[];\nextern const u8 gText_Jackpot[];\nextern const u8 gText_First[];\nextern const u8 gText_Second[];\nextern const u8 gText_Third[];\nextern const u8 gText_NoDecorations[];\nextern const u8 gText_NoDecorationsInUse[];\nextern const u8 gText_Cancel[];\nextern const u8 gText_Color161Shadow161[];\nextern const u8 gText_GoBackPrevMenu[];\nextern const u8 gText_CantPlaceInRoom[];\nextern const u8 gText_NoMoreDecorations[];\nextern const u8 gText_NoMoreDecorations2[];\nextern const u8 gText_InUseAlready[];\nextern const u8 gText_CancelDecorating[];\nextern const u8 gText_PlaceItHere[];\nextern const u8 gText_CantBePlacedHere[];\nextern const u8 gText_DecorationReturnedToPC[];\nextern const u8 gText_StopPuttingAwayDecorations[];\nextern const u8 gText_ReturnDecorationToPC[];\nextern const u8 gText_NoDecorationHere[];\nextern const u8 gText_DecorationWillBeDiscarded[];\nextern const u8 gText_CantThrowAwayInUse[];\nextern const u8 gText_DecorationThrownAway[];\nextern const u8 gText_Desk[];\nextern const u8 gText_Chair[];\nextern const u8 gText_Plant[];\nextern const u8 gText_Ornament[];\nextern const u8 gText_Mat[];\nextern const u8 gText_Poster[];\nextern const u8 gText_PutOutSelectedDecorItem[];\nextern const u8 gText_StoreChosenDecorInPC[];\nextern const u8 gText_ThrowAwayUnwantedDecors[];\nextern const u8 gText_Doll[];\nextern const u8 gText_Cushion[];\nextern const u8 gText_Decorate[];\nextern const u8 gText_PutAway[];\nextern const u8 gText_Toss2[];\nextern const u8 gText_Hoenn[];\nextern const u8 gText_ApostropheSBase[];\nextern const u8 gText_NoRegistry[];\nextern const u8 gText_OkayToDeleteFromRegistry[];\nextern const u8 gText_RegisteredDataDeleted[];\nextern const u8 gText_Confirm3[];\nextern const u8 gText_Cancel4[];\nextern const u8 gText_IsThisTheCorrectTime[];\nextern const u8 gText_PkmnFainted3[];\nextern const u8 gText_Coins[];\nextern const u8 gText_EggNickname[];\nextern const u8 gText_MenuPokemon[];\n\nextern const u8 gOtherText_Use[];\nextern const u8 gOtherText_Toss[];\nextern const u8 gOtherText_Give[];\nextern const u8 gOtherText_Exit[];\nextern const u8 gText_ThreeHyphens[];\nextern const u8 gText_SevenHyphens[];\nextern const u8 gText_NumberClear01[];\nextern const u8 gText_TimesStrVar1[];\nextern const u8 gText_IsSelected[];\nextern const u8 gText_ThereIsNoPokemon[];\nextern const u8 gText_ItemCantBeHeld[];\nextern const u8 gText_TMCase[];\nextern const u8 gText_Close[];\nextern const u8 gText_TMCaseWillBePutAway[];\nextern const u8 gText_FontSmall[];\nextern const u8 gText_FontNormal[];\nextern const u8 gText_OhNoICantBuyThat[];\nextern const u8 gText_HowManyWouldYouLikeToSell[];\nextern const u8 gText_ICanPayThisMuch_WouldThatBeOkay[];\nextern const u8 gText_TurnedOverItemsWorthYen[];\nextern const u8 gPokedudeText_TMTypes[];\nextern const u8 gPokedudeText_ReadTMDescription[];\nextern const u8 gFameCheckerText_Cancel[];\nextern const u8 gText_SelectorArrow2[];\nextern const u8 gFameCheckerText_FameCheckerWillBeClosed[];\nextern const u8 gFameCheckerText_ClearTextbox[];\nextern const u8 gFameCheckerText_MainScreenUI[]; // \"{DPAD_ANY}PICK {DPAD_UPDOWN}SELECT {A_BUTTON}OK$\"\nextern const u8 gFameCheckerText_PickScreenUI[]; // \"{DPAD_ANY}PICK {DPAD_UPDOWN}SELECT {B_BUTTON}CANCEL$\"\nextern const u8 gFameCheckerText_FlavorTextUI[]; // \"{START_BUTTON}PICK {A_BUTTON}READ {B_BUTTON}CANCEL$\"\nextern const u8 gFameCheckerOakName[]; // \"OAK$\"\nextern const u8 gFameCheckerDaisyName[]; // \"DAISY$\"\nextern const u8 gFameCheckerBillName[]; // \"BILL$\"\nextern const u8 gFameCheckerMrFujiName[]; // \"FUJI$\"\n\n// teachy_tv\nextern const u8 gTeachyTvString_TeachBattle[];\nextern const u8 gTeachyTvString_StatusProblems[];\nextern const u8 gTeachyTvString_TypeMatchups[];\nextern const u8 gTeachyTvString_CatchPkmn[];\nextern const u8 gTeachyTvString_AboutTMs[];\nextern const u8 gTeachyTvString_RegisterItem[];\nextern const u8 gTeachyTvString_Cancel[];\nextern const u8 gTeachyTvText_PokedudeSaysHello[];\nextern const u8 gTeachyTvText_BattleScript1[];\nextern const u8 gTeachyTvText_StatusScript1[];\nextern const u8 gTeachyTvText_MatchupsScript1[];\nextern const u8 gTeachyTvText_CatchingScript1[];\nextern const u8 gTeachyTvText_TMsScript1[];\nextern const u8 gTeachyTvText_RegisterScript1[];\nextern const u8 gTeachyTvText_BattleScript2[];\nextern const u8 gTeachyTvText_StatusScript2[];\nextern const u8 gTeachyTvText_MatchupsScript2[];\nextern const u8 gTeachyTvText_CatchingScript2[];\nextern const u8 gTeachyTvText_TMsScript2[];\nextern const u8 gTeachyTvText_RegisterScript2[];\n\n// help_system_812B1E0\nextern const u8 gText_HelpSystemControls_A_Next[];\nextern const u8 gText_HelpSystemControls_PickOkEnd[];\nextern const u8 gText_HelpSystemControls_AorBtoCancel[];\nextern const u8 gText_HelpSystemControls_PickOkCancel[];\n\n// help_system\nextern const u8 gString_Bill[];\nextern const u8 gString_Someone[];\nextern const u8 gString_Help[];\nextern const u8 gString_HelpSystem_ClearTo8[];\n\nextern const u8 gText_Var1IsSelected[];\nextern const u8 gOtherText_WhereShouldTheStrVar1BePlaced[];\nextern const u8 gOtherText_Powder[];\nextern const u8 gText_NoMoreRoomInBag[];\nextern const u8 gText_WithdrawHowMany[];\nextern const u8 gText_WithdrewQuantItem[];\nextern const u8 gText_WithdrawItem[];\nextern const u8 gText_Withdraw[];\nextern const u8 gText_ReturnToPC[];\n\nextern const u8 gText_OakForbidsUseOfItemHere[];\nextern const u8 gText_CantDismountBike[];\nextern const u8 gText_CoinCase[];\nextern const u8 gText_PlayerUsedVar2[];\nextern const u8 gText_RepelEffectsLingered[];\nextern const u8 gText_UsedVar2WildLured[];\nextern const u8 gText_UsedVar2WildRepelled[];\nextern const u8 gText_BoxFull[];\nextern const u8 gText_PowderQty[];\nextern const u8 gText_PlayedPokeFluteCatchy[];\nextern const u8 gText_PlayedPokeFlute[];\nextern const u8 gText_PokeFluteAwakenedMon[];\nextern const u8 gText_WontHaveEffect[];\nextern const u8 gText_YesNo[];\nextern const u8 gText_Berry[];\nextern const u8 gText_Ghost[];\n\n// pokemon\nextern const u8 gBattleText_Rose[];\nextern const u8 gText_DefendersStatRose[];\nextern const u8 gBattleText_GetPumped[];\nextern const u8 gBattleText_MistShroud[];\nextern const u8 gText_BadEgg[];\nextern const u8 gText_PkmnsXPreventsSwitching[];\nextern const u8 *const gStatNamesTable[];\n\n// diploma\nextern const u8 gText_Diploma_Player[];\nextern const u8 gText_Diploma_ThisDocument[];\nextern const u8 gText_Diploma_GameFreak[];\nextern const u8 gText_Diploma_National[];\nextern const u8 gText_Diploma_Kanto[];\n\n// battle_records\nextern const u8 gString_BattleRecords_PlayersBattleResults[];\nextern const u8 gString_BattleRecords_TotalRecord[];\nextern const u8 gString_BattleRecords_ColumnHeaders[];\nextern const u8 gString_BattleRecords_7Dashes[];\nextern const u8 gString_BattleRecords_4Dashes[];\n\n// slot_machine\nextern const u8 gString_OutOfCoins[];\nextern const u8 gString_QuitPlaying[];\nextern const u8 gString_SlotMachineControls[];\n\n// battle_controller_safari\nextern const u8 gText_EmptyString3[];\nextern const u8 gText_SafariZoneMenu[];\nextern const u8 gText_WhatWillPlayerThrow[];\n\n// battle_controller_player\nextern const u8 gText_BattleSwitchWhich[];\nextern const u8 gText_MoveInterfaceDynamicColors[];\nextern const u8 gText_MoveInterfacePP[];\nextern const u8 gText_MoveInterfaceType[];\nextern const u8 gText_LinkStandby[];\nextern const u8 gText_BattleMenu[];\nextern const u8 gText_WhatWillPkmnDo[];\n\n// battle_script_commands\nextern const u8 gText_BattleYesNoChoice[];\n\n// battle_controller_oak_old_man\nextern const u8 gText_ForPetesSake[];\nextern const u8 gText_TheTrainerThat[];\nextern const u8 gText_TryBattling[];\nextern const u8 gText_InflictingDamageIsKey[];\nextern const u8 gText_LoweringStats[];\nextern const u8 gText_KeepAnEyeOnHP[];\nextern const u8 gText_OakNoRunningFromATrainer[];\nextern const u8 gText_WinEarnsPrizeMoney[];\nextern const u8 gText_HowDissapointing[];\nextern const u8 gText_WhatWillOldManDo[];\n\n// battle_controller_pokedude\nextern const u8 Pokedude_Text_SpeedierBattlerGoesFirst[];\nextern const u8 Pokedude_Text_MyRattataFasterThanPidgey[];\nextern const u8 Pokedude_Text_BattlersTakeTurnsAttacking[];\nextern const u8 Pokedude_Text_MyRattataWonGetsEXP[];\nextern const u8 Pokedude_Text_UhOhRattataPoisoned[];\nextern const u8 Pokedude_Text_HealStatusRightAway[];\nextern const u8 Pokedude_Text_UsingItemTakesTurn[];\nextern const u8 Pokedude_Text_YayWeManagedToWin[];\nextern const u8 Pokedude_Text_WaterNotVeryEffectiveAgainstGrass[];\nextern const u8 Pokedude_Text_GrassEffectiveAgainstWater[];\nextern const u8 Pokedude_Text_LetsTryShiftingMons[];\nextern const u8 Pokedude_Text_ShiftingUsesTurn[];\nextern const u8 Pokedude_Text_ButterfreeDoubleResistsGrass[];\nextern const u8 Pokedude_Text_ButterfreeGoodAgainstOddish[];\nextern const u8 Pokedude_Text_YeahWeWon[];\nextern const u8 Pokedude_Text_WeakenMonBeforeCatching[];\nextern const u8 Pokedude_Text_BestIfTargetStatused[];\nextern const u8 Pokedude_Text_CantDoubleUpOnStatus[];\nextern const u8 Pokedude_Text_LetMeThrowBall[];\nextern const u8 Pokedude_Text_PickBestKindOfBall[];\n\n// party_menu\nextern const u8 gText_ChoosePokemon[];\nextern const u8 gText_ChoosePokemonCancel[];\nextern const u8 gText_ChoosePokemonConfirm[];\nextern const u8 gText_MoveToWhere[];\nextern const u8 gText_TeachWhichPokemon[];\nextern const u8 gText_UseOnWhichPokemon[];\nextern const u8 gText_GiveToWhichPokemon[];\nextern const u8 gText_NothingToCut[];\nextern const u8 gText_CantSurfHere[];\nextern const u8 gText_AlreadySurfing[];\nextern const u8 gText_CurrentIsTooFast[];\nextern const u8 gText_EnjoyCycling[];\nextern const u8 gText_InUseAlready_PM[];\nextern const u8 gText_CantUseHere[];\nextern const u8 gText_NoPokemonForBattle[];\nextern const u8 gText_ChoosePokemon2[];\nextern const u8 gText_NotEnoughHp[];\nextern const u8 gText_ThreePkmnAreNeeded[];\nextern const u8 gText_TwoPokemonAreNeeded[];\nextern const u8 gText_PokemonCantBeSame[];\nextern const u8 gText_NoIdenticalHoldItems[];\nextern const u8 gText_DoWhatWithPokemon[];\nextern const u8 gText_RestoreWhichMove[];\nextern const u8 gText_BoostPp[];\nextern const u8 gText_DoWhatWithItem[];\nextern const u8 gText_DoWhatWithMail[];\nextern const u8 gText_NoUse[];\nextern const u8 gText_Able[];\nextern const u8 gText_First_PM[];\nextern const u8 gText_Second_PM[];\nextern const u8 gText_Third_PM[];\nextern const u8 gText_NotAble[];\nextern const u8 gText_Able3[];\nextern const u8 gText_NotAble2[];\nextern const u8 gText_Learned[];\nextern const u8 gText_Able2[];\nextern const u8 gText_CutATreeOrGrass[];\nextern const u8 gText_FlyToAKnownTown[];\nextern const u8 gText_TravelOnWater[];\nextern const u8 gText_MoveHeavyBoulders[];\nextern const u8 gText_LightUpDarkness[];\nextern const u8 gText_ShatterACrackedRock[];\nextern const u8 gText_ClimbAWaterfall[];\nextern const u8 gText_EscapeFromHere[];\nextern const u8 gText_LureWildPokemon[];\nextern const u8 gText_ShareHp[];\nextern const u8 gText_ReturnToAHealingSpot[];\nextern const u8 gText_DiveUnderwater[];\nextern const u8 gText_Summary5[];\nextern const u8 gText_Switch2[];\nextern const u8 gText_Item[];\nextern const u8 gText_Take[];\nextern const u8 gText_Mail[];\nextern const u8 gText_Take2[];\nextern const u8 gText_Read2[];\nextern const u8 gText_Shift[];\nextern const u8 gText_SendOut[];\nextern const u8 gText_Enter[];\nextern const u8 gText_NoEntry[];\nextern const u8 gText_Store[];\nextern const u8 gText_Trade4[];\nextern const u8 gText_NotPkmnOtherTrainerWants[];\nextern const u8 gText_ThatIsntAnEgg[];\nextern const u8 gText_OtherTrainerCantAcceptPkmn[];\nextern const u8 gText_CantTradeWithTrainer[];\nextern const u8 gText_CancelBattle[];\nextern const u8 gText_PkmnWasGivenItem[];\nextern const u8 gText_ReceivedItemFromPkmn[];\nextern const u8 gText_PkmnAlreadyHoldingItemSwitch[];\nextern const u8 gText_SwitchedPkmnItem[];\nextern const u8 gText_BagFullCouldNotRemoveItem[];\nextern const u8 gText_PkmnCantParticipate[];\nextern const u8 gText_CancelParticipation[];\nextern const u8 gText_OakThisIsListOfPokemon[];\nextern const u8 gText_PartyMenu_OK[];\nextern const u8 gText_MaleSymbol[];\nextern const u8 gText_FemaleSymbol[];\nextern const u8 gText_Slash[];\nextern const u8 gText_OakImportantToGetToKnowPokemonThroughly[];\nextern const u8 gText_PkmnNotHolding[];\nextern const u8 gText_PCMailboxFull[];\nextern const u8 gText_MailSentToPC[];\nextern const u8 gText_MailMessageWillBeLost[];\nextern const u8 gText_SendMailToPC[];\nextern const u8 gText_MailTakenFromPkmn[];\nextern const u8 gText_NoMoreThanTwoMayEnter[];\nextern const u8 gText_NoMoreThanThreeMayEnter[];\nextern const u8 gText_PauseUntilPress[];\nextern const u8 gText_CantUseUntilNewBadge[];\nextern const u8 gText_CantUseUntilNewHM[];\nextern const u8 gText_ReturnToHealingSpot[];\nextern const u8 gText_EscapeFromHereAndReturnTo[];\nextern const u8 gText_PkmnCuredOfPoison[];\nextern const u8 gText_PkmnWokeUp2[];\nextern const u8 gText_PkmnBurnHealed[];\nextern const u8 gText_PkmnThawedOut[];\nextern const u8 gText_PkmnCuredOfParalysis[];\nextern const u8 gText_PkmnSnappedOutOfConfusion[];\nextern const u8 gText_PkmnGotOverInfatuation[];\nextern const u8 gText_PkmnBecameHealthy[];\nextern const u8 gText_ItemEffect_HP[];\nextern const u8 gText_ItemEffect_Attack[];\nextern const u8 gText_ItemEffect_Defense[];\nextern const u8 gText_ItemEffect_Speed[];\nextern const u8 gText_ItemEffect_SpAtk[];\nextern const u8 gText_ItemEffect_SpDef[];\nextern const u8 gText_PkmnBaseVar2StatIncreased[];\nextern const u8 gText_MovesPPIncreased[];\nextern const u8 gText_PPWasRestored[];\nextern const u8 gText_PkmnHPRestoredByVar2[];\nextern const u8 gText_PkmnNeedsToReplaceMove[];\nextern const u8 gText_PkmnCantLearnMove[];\nextern const u8 gText_PkmnAlreadyKnows[];\nextern const u8 gText_PkmnLearnedMove3[];\nextern const u8 gText_WhichMoveToForget[];\nextern const u8 gText_12PoofForgotMove[];\nextern const u8 gText_StopLearningMove2[];\nextern const u8 gText_MoveNotLearned[];\nextern const u8 gText_PkmnElevatedToLvVar2[];\nextern const u8 gText_PkmnHoldingItemCantHoldMail[];\nextern const u8 gText_MailTransferredFromMailbox[];\nextern const u8 gText_RemoveMailBeforeItem[];\nextern const u8 gText_CantSwitchWithAlly[];\nextern const u8 gText_PkmnHasNoEnergy[];\nextern const u8 gText_PkmnAlreadyInBattle[];\nextern const u8 gText_EggCantBattle[];\nextern const u8 gText_PkmnAlreadySelected[];\nextern const u8 gText_PkmnCantSwitchOut[];\n\n// credits\nextern const u8 gString_Dummy[];\nextern const u8 gString_PokemonFireRed_Staff[]; // FR\nextern const u8 gString_PokemonLeafGreen_Staff[]; // LG\nextern const u8 gCreditsString_Director[];\nextern const u8 gCreditsString_Junichi_Masuda[];\nextern const u8 gCreditsString_Art_Director_Battle_Director[];\nextern const u8 gCreditsString_Ken_Sugimori_Shigeki_Morimoto[];\nextern const u8 gCreditsString_Program_Leader_Planning_Leader_Graphic_Design_Leader[];\nextern const u8 gCreditsString_Tetsuya_Watanabe_Koji_Nishino_Takao_Unno[];\nextern const u8 gCreditsString_Programmers[];\nextern const u8 gCreditsString_Hiroyuki_Nakamura_Masao_Taya_Satoshi_Nohara_Miyuki_Iwasawa_Daisuke_Goto[];\nextern const u8 gCreditsString_System_Programmers[];\nextern const u8 gCreditsString_Tetsuya_Watanabe_Akito_Mori_Hisashi_Sogabe_Sousuke_Tamada[];\nextern const u8 gCreditsString_Graphic_Designers[];\nextern const u8 gCreditsString_Takao_Unno_Asuka_Iwashita_Kanako_Eo_Hiroki_Fuchino[];\nextern const u8 gCreditsString_Graphic_Designers_2[];\nextern const u8 gCreditsString_Ken_Sugimori_Hironobu_Yoshida[];\nextern const u8 gCreditsString_Music_Composition[];\nextern const u8 gCreditsString_Go_Ichinose_Junichi_Masuda[];\nextern const u8 gCreditsString_Sound_Effects[];\nextern const u8 gCreditsString_Go_Ichinose[];\nextern const u8 gCreditsString_Game_Designers[];\nextern const u8 gCreditsString_Junichi_Masuda_Koji_Nishino_Tetsuji_Ohta[];\nextern const u8 gCreditsString_Game_Designers_2[];\nextern const u8 gCreditsString_Hitomi_Sato_Shigeru_Ohmori_Tadashi_Takahashi[];\nextern const u8 gCreditsString_Game_Scenario[];\nextern const u8 gCreditsString_Hitomi_Sato_Satoshi_Tajiri[];\nextern const u8 gCreditsString_Script_Designer_Map_Designer[];\nextern const u8 gCreditsString_Satoshi_Nohara_Shigeru_Ohmori[];\nextern const u8 gCreditsString_Parametric_Designers[];\nextern const u8 gCreditsString_Koji_Nishino_Tetsuji_Ohta_Shigeki_Morimoto[];\nextern const u8 gCreditsString_POKeDEX_Text[];\nextern const u8 gCreditsString_Kenji_Matsushima[];\nextern const u8 gCreditsString_POKeMON_Designers[];\nextern const u8 gCreditsString_Ken_Sugimori_Motofumi_Fujiwara_Shigeki_Morimoto_Hironobu_Yoshida[];\nextern const u8 gCreditsString_POKeMON_Designers_2[];\nextern const u8 gCreditsString_Satoshi_Ohta_Asuka_Iwashita_Takao_Unno_Kanako_Eo_Aimi_Tomita[];\nextern const u8 gCreditsString_POKeMON_Designers_3[];\nextern const u8 gCreditsString_Atsuko_Nishida_Muneo_Saito_Rena_Yoshikawa_Jun_Okutani[];\nextern const u8 gCreditsString_Supporting_Programmers[];\nextern const u8 gCreditsString_Teruyuki_Yoshioka_Takao_Nakano_Satoshi_Mitsuhara_Daisuke_Hoshino[];\nextern const u8 gCreditsString_NCL_Product_Testing[];\nextern const u8 gCreditsString_NCL_Super_Mario_Club[];\nextern const u8 gCreditsString_Special_Thanks[];\nextern const u8 gCreditsString_Hiro_Nakamura_Hiroyuki_Uesugi_Teruki_Murakawa_Kazuya_Suyama[];\nextern const u8 gCreditsString_Special_Thanks_2[];\nextern const u8 gCreditsString_Kenji_Tominaga_Kenjiro_Ito_Tomotaka_Komura_Michiko_Takizawa[];\nextern const u8 gCreditsString_Special_Thanks_3[];\nextern const u8 gCreditsString_Makiko_Takada_Mikiko_Ohashi_Shusaku_Egami_Takanao_Kondo_Rui_Kawaguchi[];\nextern const u8 gCreditsString_Braille_Code_Check[];\nextern const u8 gCreditsString_Japan_Braille_Library[];\nextern const u8 gCreditsString_Information_Supervisors[];\nextern const u8 gCreditsString_Hiroki_Enomoto_Kazuyuki_Terada_Yuri_Sakurai_Yumi_Funasaka_Naoko_Yanase[];\nextern const u8 gCreditsString_Coordinators[];\nextern const u8 gCreditsString_Azusa_Tajima_Akira_Kinashi_Kazuki_Yoshihara_Retsuji_Nomoto[];\nextern const u8 gCreditsString_Task_Managers[];\nextern const u8 gCreditsString_Hitoshi_Yamagami_Gakuji_Nomoto[];\nextern const u8 gCreditsString_Producers[];\nextern const u8 gCreditsString_Hiroyuki_Jinnai_Takehiro_Izushi_Hiroaki_Tsuru[];\nextern const u8 gCreditsString_Executive_Director[];\nextern const u8 gCreditsString_Satoshi_Tajiri[];\nextern const u8 gCreditsString_Executive_Producer[];\nextern const u8 gCreditsString_Satoru_Iwata[];\nextern const u8 gCreditsString_Executive_Producer_2[];\nextern const u8 gCreditsString_Tsunekaz_Ishihara[];\nextern const u8 gCreditsString_English_Version_Coordinators[];\nextern const u8 gCreditsString_Hiro_Nakamura_Seth_McMahill[];\nextern const u8 gCreditsString_Translator_Text_Editor[];\nextern const u8 gCreditsString_Nob_Ogasawara_Teresa_Lillygren[];\nextern const u8 gCreditsString_Programmers_2[];\nextern const u8 gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Yuichiro_Ito_Akira_Kinashi[];\nextern const u8 gCreditsString_Environment_Tool_Programmers[];\nextern const u8 gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Kimiko_Nakamichi[];\nextern const u8 gCreditsString_NOA_Product_Testing[];\nextern const u8 gCreditsString_Thomas_Hertzog_Kathy_Huguenard_Mika_Kurosawa[];\nextern const u8 gCreditsString_Braille_Code_Check_2[];\nextern const u8 gCreditsString_National_Federation_of_the_Blind_Patricia_A_Maurer_Japan_Braille_Library_European_Blind_Union[];\nextern const u8 gCreditsString_Braille_Code_Check_3[];\nextern const u8 gCreditsString_National_Information_Library_Service_Margaret_Campion[];\nextern const u8 gCreditsString_Special_Thanks_4[];\nextern const u8 gCreditsString_Takehiro_Izushi_Motoyasu_Tojima_Hitoshi_Yamagami_Hiroyuki_Uesugi[];\nextern const u8 gCreditsString_Special_Thanks_5[];\nextern const u8 gCreditsString_Nicola_Pratt_Barlow_Shellie_Dow_Anthony_Howitt_Naoko_Saeki_Kyoko_Onishi[];\nextern const u8 gCreditsString_Braille_Code_Check_4[];\nextern const u8 gCreditsString_The_Royal_New_Zealand_Foundation_of_the_Blind_Greg_Moran[];\nextern const u8 gCreditsString_Graphic_Designer[];\nextern const u8 gCreditsString_Akira_Kinashi[];\n\n// berry_pouch\nextern const u8 gText_TheStrVar1CantBeHeldHere[];\nextern const u8 gText_TossOutHowManyStrVar1s[];\nextern const u8 gText_ThrewAwayStrVar2StrVar1s[];\nextern const u8 gText_ThrowAwayStrVar2OfThisItemQM[];\nextern const u8 gText_BerryPouch[];\nextern const u8 gText_TheBerryPouchWillBePutAway[];\n\n// itemfinder\nextern const u8 gText_ItemfinderResponding[];\nextern const u8 gText_ItemfinderShakingWildly[];\nextern const u8 gText_NopeTheresNoResponse[];\n\n// link\nextern const u8 gText_CommErrorEllipsis[];\nextern const u8 gText_MoveCloserToLinkPartner[];\nextern const u8 gText_CommErrorCheckConnections[];\nextern const u8 gText_ABtnTitleScreen[];\nextern const u8 gText_ABtnRegistrationCounter[];\n\n// main_menu\nextern const u8 gText_SaveFileCorrupted[];\nextern const u8 gText_SaveFileHasBeenDeleted[];\nextern const u8 gText_1MSubCircuitBoardNotInstalled[];\nextern const u8 gText_NewGame[];\nextern const u8 gText_Continue[];\nextern const u8 gText_MysteryGift[];\nextern const u8 gText_WirelessNotConnected[];\nextern const u8 gText_MysteryGiftCantUse[];\nextern const u8 gText_Player[];\nextern const u8 gText_Time[];\nextern const u8 gText_Colon[];\nextern const u8 gText_Pokedex[];\nextern const u8 gTextJPDummy_Hiki[];\nextern const u8 gText_Badges[];\nextern const u8 gTextJPDummy_Ko[];\nextern const u8 gText_Register[];\n\n// mystery_gift_menu\nextern const u8 gText_PickOKExit[];\nextern const u8 gText_PickOKCancel[];\nextern const u8 gText_MysteryGift2[];\nextern const u8 gJPText_MysteryGift[];\nextern const u8 gJPText_DecideStop[];\nextern const u8 gText_WhatToDoWithCards[];\nextern const u8 gText_WhatToDoWithNews[];\nextern const u8 gText_OkayToDiscardNews[];\nextern const u8 gText_IfThrowAwayCardEventWontHappen[];\nextern const u8 gText_WonderCardThrownAway[];\nextern const u8 gText_WonderNewsThrownAway[];\nextern const u8 gText_DataWillBeSaved[];\nextern const u8 gText_SaveCompletedPressA[];\nextern const u8 gText_WonderCards[];\nextern const u8 gText_WonderNews[];\nextern const u8 gText_Exit3[];\nextern const u8 gText_WirelessCommunication[];\nextern const u8 gText_Friend2[];\nextern const u8 gText_Receive[];\nextern const u8 gText_Send[];\nextern const u8 gText_Toss[];\nextern const u8 gText_VarietyOfEventsImportedWireless[];\nextern const u8 gText_WonderCardsInPossession[];\nextern const u8 gText_ReadNewsThatArrived[];\nextern const u8 gText_ReturnToTitle[];\nextern const u8 gText_NothingSentOver[];\nextern const u8 gText_RecordUploadedViaWireless[];\nextern const u8 gText_WonderCardReceived[];\nextern const u8 gText_WonderCardReceivedFrom[];\nextern const u8 gText_WonderNewsReceived[];\nextern const u8 gText_WonderNewsReceivedFrom[];\nextern const u8 gText_NewStampReceived[];\nextern const u8 gText_AlreadyHadCard[];\nextern const u8 gText_AlreadyHadStamp[];\nextern const u8 gText_AlreadyHadNews[];\nextern const u8 gText_NoMoreRoomForStamps[];\nextern const u8 gText_CommunicationCanceled[];\nextern const u8 gText_CantAcceptCardFromTrainer[];\nextern const u8 gText_CantAcceptNewsFromTrainer[];\nextern const u8 gText_CommunicationError[];\nextern const u8 gText_NewTrainerReceived[];\nextern const u8 gText_WonderCardSentTo[];\nextern const u8 gText_WonderNewsSentTo[];\nextern const u8 gText_StampSentTo[];\nextern const u8 gText_OtherTrainerHasCard[];\nextern const u8 gText_OtherTrainerHasStamp[];\nextern const u8 gText_OtherTrainerHasNews[];\nextern const u8 gText_OtherTrainerCanceled[];\nextern const u8 gText_GiftSentTo[];\nextern const u8 gText_CantSendGiftToTrainer[];\nextern const u8 gText_DontHaveCardNewOneInput[];\nextern const u8 gText_DontHaveNewsNewOneInput[];\nextern const u8 gText_WhereShouldCardBeAccessed[];\nextern const u8 gText_WhereShouldNewsBeAccessed[];\nextern const u8 gText_Communicating[];\nextern const u8 gText_ThrowAwayWonderCard[];\nextern const u8 gText_HaventReceivedCardsGift[];\nextern const u8 gText_CommunicationCompleted[];\nextern const u8 gText_HaventReceivedGiftOkayToDiscard[];\nextern const u8 gText_SendingWonderCard[];\nextern const u8 gText_SendingWonderNews[];\n\n// Dodrio Berry Picking\nextern const u8 gText_BerryPickingRecords[];\nextern const u8 gText_BerriesPicked[];\nextern const u8 gText_BerriesInRowFivePlayers[];\nextern const u8 gText_BestScore[];\nextern const u8 gText_1Colon[];\nextern const u8 gText_2Colon[];\nextern const u8 gText_3Colon[];\nextern const u8 gText_4Colon[];\nextern const u8 gText_5Colon[];\nextern const u8 gText_SpacePoints[];\nextern const u8 gText_10P30P50P50P[];\nextern const u8 gText_AnnouncingPrizes[];\nextern const u8 gText_AnnouncingRankings[];\nextern const u8 gText_FirstPlacePrize[];\nextern const u8 gText_CantHoldAnyMore[];\nextern const u8 gText_FilledStorageSpace[];\nextern const u8 gText_BerryPickingResults[];\nextern const u8 gText_WantToPlayAgain[];\nextern const u8 gText_CommunicationStandby3[];\nextern const u8 gText_SomeoneDroppedOut[];\n\n// player_pc\nextern const u8 gText_WhatWouldYouLikeToDo[];\nextern const u8 gText_TakeOutItemsFromThePC[];\nextern const u8 gText_StoreItemsInThePC[];\nextern const u8 gText_GoBackToThePreviousMenu[];\nextern const u8 gText_ItemStorage[];\nextern const u8 gText_Mailbox[];\nextern const u8 gText_TurnOff[];\nextern const u8 gText_WithdrawItem2[];\nextern const u8 gText_DepositItem2[];\nextern const u8 gOtherText_Read[];\nextern const u8 gOtherText_MoveToBag[];\nextern const u8 gOtherText_Give2[];\nextern const u8 gText_TheresNoMailHere[];\nextern const u8 gText_ThereAreNoItems[];\nextern const u8 gText_WhatWouldYouLikeToDoWithPlayersMail[];\nextern const u8 gText_MessageWillBeLost[];\nextern const u8 gText_BagIsFull[];\nextern const u8 gText_MailReturnedToBagMessageErased[];\n\n// start_menu\nextern const u8 gText_MenuPokedex[];\nextern const u8 gText_MenuBag[];\nextern const u8 gText_MenuPlayer[];\nextern const u8 gText_MenuSave[];\nextern const u8 gText_MenuOption[];\nextern const u8 gText_MenuExit[];\nextern const u8 gText_MenuRetire[];\nextern const u8 gText_MenuSafariStats[];\nextern const u8 gStartMenuDesc_Pokedex[];\nextern const u8 gStartMenuDesc_Pokemon[];\nextern const u8 gStartMenuDesc_Bag[];\nextern const u8 gStartMenuDesc_Save[];\nextern const u8 gStartMenuDesc_Option[];\nextern const u8 gStartMenuDesc_Exit[];\nextern const u8 gStartMenuDesc_Retire[];\nextern const u8 gStartMenuDesc_Player[];\nextern const u8 gText_SaveError_PleaseExchangeBackupMemory[];\nextern const u8 gText_SavingDontTurnOffThePower2[];\nextern const u8 gSaveStatName_Player[];\nextern const u8 gSaveStatName_Badges[];\nextern const u8 gSaveStatName_Pokedex[];\nextern const u8 gSaveStatName_Time[];\n\n// mail\nextern const u8 gText_From[];\n\n// field_specials\nextern const u8 gText_BigGuy[];\nextern const u8 gText_BigGirl[];\nextern const u8 gText_Son[];\nextern const u8 gText_Daughter[];\nextern const u8 gText_NowOn[];\nextern const u8 gText_B4F[];\nextern const u8 gText_B3F[];\nextern const u8 gText_B2F[];\nextern const u8 gText_B1F[];\nextern const u8 gText_1F[];\nextern const u8 gText_2F[];\nextern const u8 gText_3F[];\nextern const u8 gText_4F[];\nextern const u8 gText_5F[];\nextern const u8 gText_6F[];\nextern const u8 gText_7F[];\nextern const u8 gText_8F[];\nextern const u8 gText_9F[];\nextern const u8 gText_10F[];\nextern const u8 gText_11F[];\nextern const u8 gText_Rooftop[];\nextern const u8 gText_BoulderBadge[];\nextern const u8 gText_CascadeBadge[];\nextern const u8 gText_ThunderBadge[];\nextern const u8 gText_RainbowBadge[];\nextern const u8 gText_SoulBadge[];\nextern const u8 gText_MarshBadge[];\nextern const u8 gText_VolcanoBadge[];\nextern const u8 gText_EarthBadge[];\nextern const u8 gText_LinkedGamePlay[];\nextern const u8 gText_DirectCorner[];\nextern const u8 gText_UnionRoom[];\nextern const u8 gOtherText_Quit[];\nextern const u8 gText_Energypowder_50[];\nextern const u8 gText_EnergyRoot_80[];\nextern const u8 gText_HealPowder_50[];\nextern const u8 gText_RevivalHerb_300[];\nextern const u8 gText_Protein_1000[];\nextern const u8 gText_Iron_1000[];\nextern const u8 gText_Carbos_1000[];\nextern const u8 gText_Calcium_1000[];\nextern const u8 gText_Zinc_1000[];\nextern const u8 gText_HpUp_1000[];\nextern const u8 gText_PpUp_3000[];\n\n// script_menu\nextern const u8 Text_AccessWhichPC[];\nextern const u8 gText_SomeoneSPc[];\nextern const u8 gText_BillSPc[];\nextern const u8 gText_SPc[];\nextern const u8 gText_HallOfFame_2[];\nextern const u8 gText_LogOff[];\nextern const u8 gText_ProfOakSPc[];\nextern const u8 gText_Other[];\nextern const u8 gOtherText_Double[];\nextern const u8 gOtherText_Knockout[];\nextern const u8 gOtherText_Mixed[];\nextern const u8 gOtherText_Single[];\nextern const u8 gText_Info[];\nextern const u8 gText_Eggs[];\nextern const u8 gText_HallOfFame[];\nextern const u8 gText_Victories[];\nextern const u8 gText_Quit[];\nextern const u8 gText_Psn[];\nextern const u8 gText_Par[];\nextern const u8 gText_Slp[];\nextern const u8 gText_Brn[];\nextern const u8 gText_Frz[];\nextern const u8 gText_Yes[];\nextern const u8 gText_No[];\nextern const u8 gText_SingleBattle[];\nextern const u8 gText_DoubleBattle[];\nextern const u8 gText_MultiBattle[];\nextern const u8 gText_MakeAChallenge[];\nextern const u8 gText_Lv50[];\nextern const u8 gText_Lv100[];\nextern const u8 gText_OpenLv[];\nextern const u8 gText_Info_2[];\nextern const u8 gOtherText_BattleTowerResults[];\nextern const u8 gOtherText_Current[];\nextern const u8 gOtherText_Prev[];\nextern const u8 gOtherText_Record[];\nextern const u8 gOtherText_WinStreak[];\nextern const u8 gText_FreshWater_200[];\nextern const u8 gText_SodaPop_300[];\nextern const u8 gText_Lemonade_350[];\nextern const u8 gText_50Coins_1000[];\nextern const u8 gText_500Coins_10000[];\nextern const u8 gText_1000Coins_20000[];\nextern const u8 gText_Excellent[];\nextern const u8 gText_NotSoBad[];\nextern const u8 gText_RedShard[];\nextern const u8 gText_YellowShard[];\nextern const u8 gText_BlueShard[];\nextern const u8 gText_GreenShard[];\nextern const u8 gText_Right[];\nextern const u8 gText_Left[];\nextern const u8 gText_Tm13_4000Coins[];\nextern const u8 gText_Tm23_3500Coins[];\nextern const u8 gText_Tm24_4000Coins[];\nextern const u8 gText_Tm30_4500Coins[];\nextern const u8 gText_Tm35_4000Coins[];\nextern const u8 gText_1F_2[];\nextern const u8 gText_2F_2[];\nextern const u8 gText_3F_2[];\nextern const u8 gText_4F_2[];\nextern const u8 gText_5F_2[];\nextern const u8 gText_Normal[];\nextern const u8 gText_Black[];\nextern const u8 gText_Pink[];\nextern const u8 gText_Sepia[];\nextern const u8 gText_Eevee[];\nextern const u8 gText_Flareon[];\nextern const u8 gText_Jolteon[];\nextern const u8 gText_Vaporeon[];\nextern const u8 gText_QuitLooking[];\nextern const u8 gText_FreshWater[];\nextern const u8 gText_SodaPop[];\nextern const u8 gText_Lemonade[];\nextern const u8 gText_Bicycle_Price[];\nextern const u8 gText_NoThanks[];\nextern const u8 gText_Abra_180Coins[];\nextern const u8 gText_Clefairy_500Coins[];\nextern const u8 gText_Dratini_2800Coins[];\nextern const u8 gText_Scyther_5500Coins[];\nextern const u8 gText_Porygon_9999Coins[];\nextern const u8 gText_Abra_120Coins[];\nextern const u8 gText_Clefairy_750Coins[];\nextern const u8 gText_Pinsir_2500Coins[];\nextern const u8 gText_Dratini_4600Coins[];\nextern const u8 gText_Porygon_6500Coins[];\nextern const u8 gText_NoThanks_2[];\nextern const u8 gText_HelixFossil[];\nextern const u8 gText_DomeFossil[];\nextern const u8 gText_OldAmber[];\nextern const u8 gText_TradeCenter[];\nextern const u8 gText_Colosseum[];\nextern const u8 gText_GameLinkCable[];\nextern const u8 gText_Wireless[];\nextern const u8 gText_OneIsland[];\nextern const u8 gText_TwoIsland[];\nextern const u8 gText_ThreeIsland[];\nextern const u8 gText_Vermilion[];\nextern const u8 gText_Colosseum_2[];\nextern const u8 gText_BerryCrush[];\nextern const u8 gText_EmptyLinkService1[];\nextern const u8 gText_EmptyLinkService2[];\nextern const u8 gText_RecordCorner[];\nextern const u8 gText_PokemonJump[];\nextern const u8 gText_DodrioBerryPicking[];\nextern const u8 gText_2Tinymushrooms[];\nextern const u8 gText_1BigMushroom[];\nextern const u8 gText_SeviiIslands[];\nextern const u8 gText_NavelRock[];\nextern const u8 gText_FarawayIsland[];\nextern const u8 gText_BirthIsland[];\nextern const u8 gText_SouthernIsland[];\nextern const u8 gText_MiracleSeed_1000Coins[];\nextern const u8 gText_Charcoal_1000Coins[];\nextern const u8 gText_MysticWater_1000Coins[];\nextern const u8 gText_YellowFlute_1600Coins[];\nextern const u8 gText_SmokeBall_800Coins[];\nextern const u8 gText_BecomeLeader[];\nextern const u8 gText_JoinGroup[];\nextern const u8 gText_Cool_2[];\nextern const u8 gText_Beauty_2[];\nextern const u8 gText_Cute_2[];\nextern const u8 gText_Smart_2[];\nextern const u8 gText_Tough_2[];\nextern const u8 gText_Items[];\nextern const u8 gText_KeyItems[];\nextern const u8 gText_PokeBalls[];\nextern const u8 gText_TMsAndHMs[];\nextern const u8 gText_Berries[];\nextern const u8 gText_Boulderbadge[];\nextern const u8 gText_Cascadebadge[];\nextern const u8 gText_Thunderbadge[];\nextern const u8 gText_Rainbowbadge[];\nextern const u8 gText_Soulbadge[];\nextern const u8 gText_Marshbadge[];\nextern const u8 gText_Volcanobadge[];\nextern const u8 gText_Earthbadge[];\nextern const u8 gText_Coins_2[];\nextern const u8 gText_ItemsPocket[];\nextern const u8 gText_KeyItemsPocket[];\nextern const u8 gText_PokeBallsPocket[];\nextern const u8 gText_TmCase[];\nextern const u8 gText_BerryPouch_2[];\nextern const u8 gText_FourIsland[];\nextern const u8 gText_FiveIsland[];\nextern const u8 gText_SixIsland[];\nextern const u8 gText_SevenIsland[];\n\n// trade\nextern const u8 gText_IsThisTradeOkay[];\nextern const u8 gText_XWillBeSentToY[];\nextern const u8 gText_ByeByeVar1[];\nextern const u8 gText_XSentOverY[];\nextern const u8 gText_TakeGoodCareOfX[];\nextern const u8 gText_CommunicationStandby5[];\nextern const u8 gTradeText_Cancel[];\nextern const u8 gTradeText_ChooseAPokemon[];\nextern const u8 gTradeText_Summary[];\nextern const u8 gTradeText_Trade[];\nextern const u8 gText_CancelTrade[];\nextern const u8 gTradeText_PressBButtonToExit[];\nextern const u8 gText_TradeAction_Summary[];\nextern const u8 gText_TradeAction_Trade[];\nextern const u8 gText_Trade_CommunicationStandby[];\nextern const u8 gText_TradeHasBeenCanceled[];\nextern const u8 gText_Trade_OnlyPkmnForBattle[];\nextern const u8 gText_OnlyPkmnForBattle[];\nextern const u8 gText_WaitingForFriendToFinish[];\nextern const u8 gText_FriendWantsToTrade[];\nextern const u8 gText_PkmnCantBeTradedNow[];\nextern const u8 gText_EggCantBeTradedNow[];\nextern const u8 gText_OtherTrainersPkmnCantBeTraded[];\nextern const u8 gText_4Qmark[];\n\nextern const u8 gEasyChatGroupName_Pokemon[];\nextern const u8 gEasyChatGroupName_Trainer[];\nextern const u8 gEasyChatGroupName_Status[];\nextern const u8 gEasyChatGroupName_Battle[];\nextern const u8 gEasyChatGroupName_Greetings[];\nextern const u8 gEasyChatGroupName_People[];\nextern const u8 gEasyChatGroupName_Voices[];\nextern const u8 gEasyChatGroupName_Speech[];\nextern const u8 gEasyChatGroupName_Endings[];\nextern const u8 gEasyChatGroupName_Feelings[];\nextern const u8 gEasyChatGroupName_Conditions[];\nextern const u8 gEasyChatGroupName_Actions[];\nextern const u8 gEasyChatGroupName_Lifestyle[];\nextern const u8 gEasyChatGroupName_Hobbies[];\nextern const u8 gEasyChatGroupName_Time[];\nextern const u8 gEasyChatGroupName_Misc[];\nextern const u8 gEasyChatGroupName_Adjectives[];\nextern const u8 gEasyChatGroupName_Events[];\nextern const u8 gEasyChatGroupName_Move1[];\nextern const u8 gEasyChatGroupName_Move2[];\nextern const u8 gEasyChatGroupName_TrendySaying[];\nextern const u8 gEasyChatGroupName_Pokemon2[];\nextern const u8 gText_ThreeQuestionMarks[];\n\n// hall_of_fame\nextern const u8 gText_LeagueChamp[];\nextern const u8 gText_HOFNumber[];\nextern const u8 gText_UPDOWNPick_ABUTTONBBUTTONCancel[];\nextern const u8 gText_UPDOWNPick_ABUTTONNext_BBUTTONBack[];\nextern const u8 gText_ABUTTONExit[];\nextern const u8 gText_HOFCorrupted[];\nextern const u8 gText_WelcomeToHOF[];\nextern const u8 gText_Number[];\nextern const u8 gText_Level[];\nextern const u8 gText_IDNumber[];\nextern const u8 gText_Name[];\nextern const u8 gText_MainMenuTime[];\n\n// learn_move\nextern const u8 gText_TeachWhichMoveToMon[];\nextern const u8 gText_MonLearnedMove[];\nextern const u8 gText_MonIsTryingToLearnMove[];\nextern const u8 gText_StopLearningMove[];\nextern const u8 gText_1_2_and_Poof[];\nextern const u8 gText_MonForgotOldMoveAndMonLearnedNewMove[];\nextern const u8 gText_WhichMoveShouldBeForgotten[];\nextern const u8 gText_TeachMoveQues[];\nextern const u8 gText_GiveUpTryingToTeachNewMove[];\n\n// pokemon_size_record\nextern const u8 gText_DecimalPoint[];\n\n// map_name_popup\nextern const u8 gText_Rooftop2[];\n\n// option menu\nextern const u8 gText_TextSpeed[];\nextern const u8 gText_BattleScene[];\nextern const u8 gText_BattleStyle[];\nextern const u8 gText_Sound[];\nextern const u8 gText_ButtonMode[];\nextern const u8 gText_Frame[];\nextern const u8 gText_OptionMenuCancel[];\nextern const u8 gText_OptionMenuSaveAndExit[];\nextern const u8 gText_OptionMenuBattleAnimSpeed[];\nextern const u8 gText_BattleTransitions[];\nextern const u8 gText_BattleIntroAnimation[];\nextern const u8 gText_MoveAnims[];\nextern const u8 gText_HpBarAnimSpeed[];\nextern const u8 gText_ExpBarAnimSpeed[];\nextern const u8 gText_Back[];\nextern const u8 gText_Advanced[];\nextern const u8 gText_TextSpeedSlow[];\nextern const u8 gText_TextSpeedMid[];\nextern const u8 gText_TextSpeedFast[];\nextern const u8 gText_TextSpeedFaster[];\nextern const u8 gText_BattleScenePressA[];\nextern const u8 gText_BattleSceneOn[];\nextern const u8 gText_BattleSceneOff[];\nextern const u8 gText_BattleStylePredict[];\nextern const u8 gText_BattleStyleShift[];\nextern const u8 gText_BattleStyleSet[];\nextern const u8 gText_SoundMono[];\nextern const u8 gText_SoundStereo[];\nextern const u8 gText_ButtonTypeHelp[];\nextern const u8 gText_ButtonTypeLR[];\nextern const u8 gText_ButtonTypeLEqualsA[];\nextern const u8 gText_Option[];\nextern const u8 gText_FrameType[];\nextern const u8 gTextJP_Type[];\nextern const u8 gText_PickSwitchCancelA[];\nextern const u8 gText_PickSwitchCancel[];\nextern const u8 gText_PickSwitchExit[];\nextern const u8 gText_PickSwitchBack[];\nextern const u8 gText_TextSpeedInstant[];\n\n// evolution_scene\nextern const u8 gText_PkmnIsEvolving[];\nextern const u8 gText_CongratsPkmnEvolved[];\nextern const u8 gText_EllipsisQuestionMark[];\nextern const u8 gText_PkmnStoppedEvolving[];\n\n// shop\nextern const u8 gText_ShopBuy[];\nextern const u8 gText_ShopSell[];\nextern const u8 gText_ShopQuit[];\nextern const u8 gText_AnythingElseICanHelp[];\nextern const u8 gText_QuitShopping[];\nextern const u8 gText_PokedollarVar1[];\nextern const u8 gText_YouDontHaveMoney[];\nextern const u8 gText_Var1CertainlyHowMany[];\nextern const u8 gText_InBagVar1[];\nextern const u8 gText_Var1AndYouWantedVar2[];\nextern const u8 gText_HereYouGoThankYou[];\nextern const u8 gText_NoMoreRoomForThis[];\n\n// pokedex_screen\nextern const u8 gText_PokedexTableOfContents[];\nextern const u8 gText_PickOK[];\nextern const u8 gText_Seen[];\nextern const u8 gText_Owned[];\nextern const u8 gText_Kanto[];\nextern const u8 gText_National[];\nextern const u8 gText_PokemonListNoColor[];\nextern const u8 gText_SearchNoColor[];\nextern const u8 gText_5Dashes[];\nextern const u8 gText_PickFlipPageCheckCancel[];\nextern const u8 gText_PokedexNo[];\nextern const u8 gText_Page[];\nextern const u8 gText_DexCategory_GrasslandPkmn[];\nextern const u8 gText_DexCategory_ForestPkmn[];\nextern const u8 gText_DexCategory_WatersEdgePkmn[];\nextern const u8 gText_DexCategory_SeaPkmn[];\nextern const u8 gText_DexCategory_CavePkmn[];\nextern const u8 gText_DexCategory_MountainPkmn[];\nextern const u8 gText_DexCategory_RoughTerrainPkmn[];\nextern const u8 gText_DexCategory_UrbanPkmn[];\nextern const u8 gText_DexCategory_RarePkmn[];\nextern const u8 gText_PokemonList[];\nextern const u8 gText_NumericalMode[];\nextern const u8 gText_PokemonHabitats[];\nextern const u8 gText_Search[];\nextern const u8 gText_AToZMode[];\nextern const u8 gText_TypeMode[];\nextern const u8 gText_LightestMode[];\nextern const u8 gText_SmallestMode[];\nextern const u8 gText_PokedexOther[];\nextern const u8 gText_ClosePokedex[];\nextern const u8 gText_NumericalModeKanto[];\nextern const u8 gText_NumericalModeNational[];\nextern const u8 gText_PokedexPokemon[];\nextern const u8 gText_HT[];\nextern const u8 gText_WT[];\nextern const u8 gText_Lbs[];\nextern const u8 gText_Cry[];\nextern const u8 gText_NextDataCancel[];\nextern const u8 gText_Next[];\nextern const u8 gText_CancelPreviousData[];\nextern const u8 gText_Area[];\nextern const u8 gText_Size[];\nextern const u8 gText_AreaUnknown[];\n\n// daycare\nextern const u8 gText_Lv[];\nextern const u8 gDaycareText_GetAlongVeryWell[];\nextern const u8 gDaycareText_GetAlong[];\nextern const u8 gDaycareText_DontLikeOther[];\nextern const u8 gDaycareText_PlayOther[];\nextern const u8 gExpandedPlaceholder_Empty[];\nextern const u8 gText_HatchedFromEgg[];\nextern const u8 gText_NickHatchPrompt[];\n\n// trainer card\nextern const u8 gText_WaitingTrainerFinishReading[];\nextern const u8 gText_TrainerCardName[];\nextern const u8 gText_TrainerCardIDNo[];\nextern const u8 gText_TrainerCardMoney[];\nextern const u8 gText_TrainerCardYen[];\nextern const u8 gText_TrainerCardPokedex[];\nextern const u8 gText_TrainerCardNull[];\nextern const u8 gText_Colon2[];\nextern const u8 gText_TrainerCardTime[];\nextern const u8 gText_Var1sTrainerCard[];\nextern const u8 gText_HallOfFameDebut[];\nextern const u8 gText_WinLossRatio[];\nextern const u8 gText_PokemonTrades[];\nextern const u8 gText_BerryCrushes[];\nextern const u8 gText_UnionRoomTradesBattles[];\nextern const u8 gText_LinkBattles[];\nextern const u8 gText_LinkCableBattles[];\n\n// region_map\nextern const u8 gText_RegionMap_DPadMove[];\nextern const u8 gText_RegionMap_Space[];\nextern const u8 gText_RegionMap_AButtonGuide[];\nextern const u8 gText_RegionMap_AButtonCancel[];\nextern const u8 gText_RegionMap_AButtonCancel2[];\nextern const u8 gText_RegionMap_AButtonSwitch[];\nextern const u8 gText_RegionMap_AButtonOK[];\nextern const u8 gText_RegionMap_UpDownPick[];\nextern const u8 gText_RegionMap_NoData[];\nextern const u8 gText_RegionMap_AreaDesc_ViridianForest[];\nextern const u8 gText_RegionMap_AreaDesc_MtMoon[];\nextern const u8 gText_RegionMap_AreaDesc_DiglettsCave[];\nextern const u8 gText_RegionMap_AreaDesc_VictoryRoad[];\nextern const u8 gText_RegionMap_AreaDesc_PokemonMansion[];\nextern const u8 gText_RegionMap_AreaDesc_SafariZone[];\nextern const u8 gText_RegionMap_AreaDesc_RockTunnel[];\nextern const u8 gText_RegionMap_AreaDesc_SeafoamIslands[];\nextern const u8 gText_RegionMap_AreaDesc_PokemonTower[];\nextern const u8 gText_RegionMap_AreaDesc_CeruleanCave[];\nextern const u8 gText_RegionMap_AreaDesc_PowerPlant[];\nextern const u8 gText_RegionMap_AreaDesc_MtEmber[];\nextern const u8 gText_RegionMap_AreaDesc_BerryForest[];\nextern const u8 gText_RegionMap_AreaDesc_IcefallCave[];\nextern const u8 gText_RegionMap_AreaDesc_LostCave[];\nextern const u8 gText_RegionMap_AreaDesc_TanobyRuins[];\nextern const u8 gText_RegionMap_AreaDesc_AlteringCave[];\nextern const u8 gText_RegionMap_AreaDesc_PatternBush[];\nextern const u8 gText_RegionMap_AreaDesc_DottedHole[];\n\n// field_screen_effect\nextern const u8 gText_PlayerScurriedToCenter[];\nextern const u8 gText_PlayerScurriedBackHome[];\n\n// save_failed_screen\nextern const u8 gText_SaveFailedCheckingBackup[];\nextern const u8 gText_BackupMemoryDamaged[];\nextern const u8 gText_SaveCompletePressA[];\n\n// bag\nextern const u8 gText_DepositItem[];\n\n// item_menu\nextern const u8 gOtherText_Register[];\nextern const u8 gOtherText_Walk[];\nextern const u8 gOtherText_Check[];\nextern const u8 gOtherText_Open[];\nextern const u8 gOtherText_Deselect[];\nextern const u8 gText_Items2[];\nextern const u8 gText_PokeBalls2[];\nextern const u8 gText_KeyItems2[];\nextern const u8 gText_CloseBag[];\nextern const u8 gText_CantWriteMailHere[];\nextern const u8 gText_DepositHowManyStrVars1[];\nextern const u8 gText_DepositedStrVar2StrVar1s[];\nextern const u8 gText_NoRoomToStoreItems[];\nextern const u8 gText_HeldItems[];\nextern const u8 gText_Medicine[];\n\n// union_room_battle\nextern const u8 gText_CommStandbyAwaitingOtherPlayer[];\nextern const u8 gText_RefusedBattle[];\nextern const u8 gText_BattleWasRefused[];\n\n// union_room_chat\nextern const u8 gText_F700JoinedChat[];\nextern const u8 gText_F700LeftChat[];\nextern const u8 gText_Hello[];\nextern const u8 gText_Pokemon2[];\nextern const u8 gText_Trade[];\nextern const u8 gText_Battle[];\nextern const u8 gText_Lets[];\nextern const u8 gText_Ok[];\nextern const u8 gText_Sorry[];\nextern const u8 gText_YaySmileEmoji[];\nextern const u8 gText_ThankYou[];\nextern const u8 gText_ByeBye[];\n\n// union_room_chat_display\nextern const u8 gText_QuitChatting[];\nextern const u8 gText_RegisterTextWhere[];\nextern const u8 gText_RegisterTextHere[];\nextern const u8 gText_InputText[];\nextern const u8 gText_ExitingTheChat[];\nextern const u8 gText_LeaderHasLeftEndingChat[];\nextern const u8 gText_RegisteredTextChanged_OKtoSave[];\nextern const u8 gText_RegisteredTextChanged_AlreadySavedFile[];\nextern const u8 gText_RegisteredTextChanged_SavingDontTurnOff[];\nextern const u8 gText_RegisteredTextChanged_SavedTheGame[];\nextern const u8 gText_IfLeaderLeavesChatWillEnd[];\nextern const u8 gText_Upper[];\nextern const u8 gText_Lower[];\nextern const u8 gText_Symbols[];\nextern const u8 gText_Register2[];\nextern const u8 gText_Exit[];\n\n// wireless_communication_status_screen\nextern const u8 gText_Dynamic0Players[];\nextern const u8 gText_Dynamic1Players[];\nextern const u8 gText_Dynamic2Players[];\nextern const u8 gText_Dynamic3Players[];\nextern const u8 gText_WirelessCommunicationStatus[];\nextern const u8 gText_PeopleTrading[];\nextern const u8 gText_PeopleBattling[];\nextern const u8 gText_PeopleInUnionRoom[];\nextern const u8 gText_PeopleCommunicating[];\n\n// mystery_gift\nextern const u8 gJPText_ReceiveMysteryGiftWithEReader[];\nextern const u8 gJPText_SelectConnectFromEReaderMenu[];\nextern const u8 gJPText_SelectConnectWithGBA[];\nextern const u8 gJPText_LinkIsIncorrect[];\nextern const u8 gJPText_CardReadingHasBeenHalted[];\nextern const u8 gJPText_Connecting[];\nextern const u8 gJPText_ConnectionErrorCheckLink[];\nextern const u8 gJPText_ConnectionErrorTryAgain[];\nextern const u8 gJPText_AllowEReaderToLoadCard[];\nextern const u8 gJPText_ConnectionComplete[];\nextern const u8 gJPText_NewTrainerHasComeToSevii[];\nextern const u8 gJPText_PleaseWaitAMoment[];\nextern const u8 gJPText_WriteErrorUnableToSaveData[];\n\n// pokemon_jump\nextern const u8 gText_WantToPlayAgain2[];\nextern const u8 gText_SavingDontTurnOffPower[];\nextern const u8 gText_SomeoneDroppedOut2[];\nextern const u8 gText_CommunicationStandby4[];\nextern const u8 gText_AwesomeWonF701F700[];\nextern const u8 gText_FilledStorageSpace2[];\nextern const u8 gText_CantHoldMore[];\nextern const u8 gText_SpacePoints2[];\nextern const u8 gText_SpaceTimes3[];\nextern const u8 gText_JumpsInARow[];\nextern const u8 gText_BestScore2[];\nextern const u8 gText_ExcellentsInARow[];\nextern const u8 gText_PkmnJumpRecords[];\n\n// cable_club\nextern const u8 gText_NumPlayerLink[];\nextern const u8 gText_BronzeCard[];\nextern const u8 gText_CopperCard[];\nextern const u8 gText_SilverCard[];\nextern const u8 gText_GoldCard[];\n\n// berry_crush\nextern const u8 gText_BerryCrush_AreYouReady[];\nextern const u8 gText_BerryCrush_WaitForOthersToChooseBerry[];\nextern const u8 gText_BerryCrush_GainedXUnitsOfPowder[];\nextern const u8 gText_BerryCrush_RecordingGameResults[];\nextern const u8 gText_BerryCrush_WantToPlayAgain[];\nextern const u8 gText_BerryCrush_NoBerries[];\nextern const u8 gText_BerryCrush_MemberDroppedOut[];\nextern const u8 gText_BerryCrush_TimeUp[];\nextern const u8 gText_BerryCrush_CommunicationStandby[];\nextern const u8 gText_1_ClrBluShdwLtBlu_Dynamic0[];\nextern const u8 gText_1_Dynamic0[];\nextern const u8 gText_SpaceTimes2[];\nextern const u8 gText_XDotY[];\nextern const u8 gText_StrVar1Berry[];\nextern const u8 gText_TimeColon[];\nextern const u8 gText_PressingSpeed[];\nextern const u8 gText_Silkiness[];\nextern const u8 gText_StrVar1[];\nextern const u8 gText_SpaceMin[];\nextern const u8 gText_XDotY2[];\nextern const u8 gText_SpaceSec[];\nextern const u8 gText_XDotY3[];\nextern const u8 gText_TimesPerSec[];\nextern const u8 gText_Var1Percent[];\nextern const u8 gText_PressesRankings[];\nextern const u8 gText_CrushingResults[];\nextern const u8 gText_BerryCrush2[];\nextern const u8 gText_PressingSpeedRankings[];\nextern const u8 gText_Var1Players[];\nextern const u8 gText_NeatnessRankings[];\nextern const u8 gText_CooperativeRankings[];\nextern const u8 gText_PressingPowerRankings[];\n\n// quest log\nextern const u8 gText_QuestLog_PreviouslyOnYourQuest[];\nextern const u8 gText_QuestLog_SwitchMon1WithMon2[];\nextern const u8 gText_QuestLog_SwappedHeldItemsOnMon[];\nextern const u8 gText_QuestLog_TookHeldItemFromMon[];\nextern const u8 gText_QuestLog_UsedItemOnMonAtThisLocation[];\nextern const u8 gText_QuestLog_UsedTheItem[];\nextern const u8 gText_QuestLog_UsedTheKeyItem[];\nextern const u8 gText_QuestLog_MonLearnedMoveFromTM[];\nextern const u8 gText_QuestLog_MonReplacedMoveWithTM[];\nextern const u8 gText_QuestLog_MonsWereFullyRestoredAtCenter[];\nextern const u8 gText_QuestLog_PlayerBattledChampionRival[];\nextern const u8 gText_QuestLog_PlayerSentOutMon1RivalSentOutMon2[];\nextern const u8 gText_QuestLog_WonTheMatchAsAResult[];\nextern const u8 gText_QuestLog_StoredItemInPC[];\nextern const u8 gText_QuestLog_WithdrewItemFromPC[];\nextern const u8 gText_QuestLog_TradedMon1ForPersonsMon2[];\nextern const u8 gText_QuestLog_SingleBattleWithPersonResultedInOutcome[];\nextern const u8 gText_QuestLog_DoubleBattleWithPersonResultedInOutcome[];\nextern const u8 gText_QuestLog_MultiBattleWithPeopleResultedInOutcome[];\nextern const u8 gText_QuestLog_Win[];\nextern const u8 gText_QuestLog_Loss[];\nextern const u8 gText_QuestLog_MingledInUnionRoom[];\nextern const u8 gText_QuestLog_DepartedPlaceInTownForNextDestination[];\nextern const u8 gText_QuestLog_SwitchedMonsBetweenBoxes[];\nextern const u8 gText_QuestLog_MovedMonToNewBox[];\nextern const u8 gText_QuestLog_SwitchedMonsWithinBox[];\nextern const u8 gText_QuestLog_MovedMonWithinBox[];\nextern const u8 gText_QuestLog_SwitchedPartyMonForPCMon[];\nextern const u8 gText_QuestLog_WithdrewMonFromPC[];\nextern const u8 gText_QuestLog_DepositedMonInPC[];\nextern const u8 gText_QuestLog_SwitchedMultipleMons[];\nextern const u8 gText_QuestLog_ADifferentSpot[];\nextern const u8 gText_QuestLog_GaveMonHeldItemFromPC[];\nextern const u8 gText_QuestLog_SwappedHeldItemFromPC[];\nextern const u8 gText_QuestLog_ChattedWithManyTrainers[];\nextern const u8 gText_QuestLog_Handily[];\nextern const u8 gText_QuestLog_Tenaciously[];\nextern const u8 gText_QuestLog_Somehow[];\nextern const u8 gText_QuestLog_TradedMon1ForTrainersMon2[];\nextern const u8 gText_QuestLog_BattledTrainerEndedInOutcome[];\nextern const u8 gText_QuestLog_BoughtItem[];\nextern const u8 gText_QuestLog_BoughtItemsIncludingItem[];\nextern const u8 gText_QuestLog_SoldNumOfItem[];\nextern const u8 gText_QuestLog_SoldItemsIncludingItem[];\nextern const u8 gText_QuestLog_JustOne[];\nextern const u8 gText_QuestLog_Num[];\nextern const u8 gText_QuestLog_UsedSoftboiled[];\nextern const u8 gText_QuestLog_UsedMilkDrink[];\nextern const u8 gText_QuestLog_MonLearnedMoveFromHM[];\nextern const u8 gText_QuestLog_MonReplacedMoveWithHM[];\nextern const u8 gText_QuestLog_DefeatedWildMon[];\nextern const u8 gText_QuestLog_DefeatedWildMons[];\nextern const u8 gText_QuestLog_CaughtWildMon[];\nextern const u8 gText_QuestLog_CaughtWildMons[];\nextern const u8 gText_QuestLog_DefeatedWildMonAndCaughtWildMon[];\nextern const u8 gText_QuestLog_DefeatedWildMonAndCaughtWildMons[];\nextern const u8 gText_QuestLog_DefeatedWildMonsAndCaughtWildMon[];\nextern const u8 gText_QuestLog_DefeatedWildMonsAndCaughtWildMons[];\nextern const u8 gText_QuestLog_GaveMonHeldItem[];\nextern const u8 gText_QuestLog_GaveMonHeldItem2[];\nextern const u8 gText_QuestLog_UsedCut[];\nextern const u8 gText_QuestLog_UsedFly[];\nextern const u8 gText_QuestLog_UsedSurf[];\nextern const u8 gText_QuestLog_UsedStrength[];\nextern const u8 gText_QuestLog_UsedFlash[];\nextern const u8 gText_QuestLog_UsedRockSmash[];\nextern const u8 gText_QuestLog_UsedWaterfall[];\nextern const u8 gText_QuestLog_UsedDive[];\nextern const u8 gText_QuestLog_UsedDigInLocation[];\nextern const u8 gText_QuestLog_UsedSweetScent[];\nextern const u8 gText_QuestLog_UsedTeleportToLocation[];\nextern const u8 gText_QuestLog_LeftTownsLocationForNextDestination[];\nextern const u8 gText_QuestLog_PlayedGamesAtGameCorner[];\nextern const u8 gText_QuestLog_RestedAtHome[];\nextern const u8 gText_QuestLog_LeftOaksLab[];\nextern const u8 gText_QuestLog_GymWasFullOfToughTrainers[];\nextern const u8 gText_QuestLog_DepartedGym[];\nextern const u8 gText_QuestLog_HadGreatTimeInSafariZone[];\nextern const u8 gText_QuestLog_ManagedToGetOutOfLocation[];\nextern const u8 gText_QuestLog_TookOnGymLeadersMonWithMonAndWon[];\nextern const u8 gText_QuestLog_TookOnEliteFoursMonWithMonAndWon[];\nextern const u8 gText_QuestLog_TookOnTrainersMonWithMonAndWon[];\nextern const u8 gText_QuestLog_Coolly[];\nextern const u8 gText_QuestLog_Barely[];\nextern const u8 gText_QuestLog_UsedEscapeRope[];\nextern const u8 gText_QuestLog_Draw[];\nextern const u8 gText_QuestLog_DepartedTheLocationForNextDestination[];\nextern const u8 gText_QuestLog_DepartedFromLocationToNextDestination[];\nextern const u8 gText_QuestLog_ObtainedItemInLocation[];\nextern const u8 gText_QuestLog_ArrivedInLocation[];\nextern const u8 gText_QuestLog_SavedGameAtLocation[];\nextern const u8 gText_QuestLog_Home[];\nextern const u8 gText_QuestLog_OakResearchLab[];\nextern const u8 gText_QuestLog_Gym[];\nextern const u8 gText_QuestLog_PokemonLeagueGate[];\nextern const u8 gText_QuestLog_ViridianForest[];\nextern const u8 gText_QuestLog_PewterMuseumOfScience[];\nextern const u8 gText_QuestLog_MtMoon[];\nextern const u8 gText_QuestLog_BikeShop[];\nextern const u8 gText_QuestLog_BillsHouse[];\nextern const u8 gText_QuestLog_DayCare[];\nextern const u8 gText_QuestLog_UndergroundPath[];\nextern const u8 gText_QuestLog_PokemonFanClub[];\nextern const u8 gText_QuestLog_SSAnne[];\nextern const u8 gText_QuestLog_DiglettsCave[];\nextern const u8 gText_QuestLog_RockTunnel[];\nextern const u8 gText_QuestLog_PowerPlant[];\nextern const u8 gText_QuestLog_PokemonTower[];\nextern const u8 gText_QuestLog_VolunteerHouse[];\nextern const u8 gText_QuestLog_NameRatersHouse[];\nextern const u8 gText_QuestLog_CeladonDeptStore[];\nextern const u8 gText_QuestLog_CeladonMansion[];\nextern const u8 gText_QuestLog_RocketGameCorner[];\nextern const u8 gText_QuestLog_Restaurant[];\nextern const u8 gText_QuestLog_RocketHideout[];\nextern const u8 gText_QuestLog_SafariZone[];\nextern const u8 gText_QuestLog_WardensHome[];\nextern const u8 gText_QuestLog_FightingDojo[];\nextern const u8 gText_QuestLog_SilphCo[];\nextern const u8 gText_QuestLog_SeafoamIslands[];\nextern const u8 gText_QuestLog_PokemonMansion[];\nextern const u8 gText_QuestLog_PokemonResearchLab[];\nextern const u8 gText_QuestLog_VictoryRoad[];\nextern const u8 gText_QuestLog_PokemonLeague[];\nextern const u8 gText_QuestLog_CeruleanCave[];\n\n// clear_save_data_screen\nextern const u8 gText_ClearAllSaveData[];\nextern const u8 gText_ClearingData[];\n\n// easy_chat_2\nextern const u8 gText_CombineFourWordsOrPhrases[];\nextern const u8 gText_AndMakeYourProfile[];\nextern const u8 gText_MakeMessageSixPhrases[];\nextern const u8 gText_MaxTwoTwelveLetterPhrases[];\nextern const u8 gText_FindWordsThatDescribeYour[];\nextern const u8 gText_FeelingsRightNow[];\nextern const u8 gText_CombineNineWordsOrPhrases[];\nextern const u8 gText_AndMakeAMessage[];\nextern const u8 gText_ChangeJustOneWordOrPhrase[];\nextern const u8 gText_AndImproveTheBardsSong[];\nextern const u8 gText_AndFillOutTheQuestionnaire[];\nextern const u8 gText_YourProfile[];\nextern const u8 gText_YourFeelingAtTheBattlesStart[];\nextern const u8 gText_WhatYouSayIfYouWin[];\nextern const u8 gText_WhatYouSayIfYouLose[];\nextern const u8 gText_TheAnswer[];\nextern const u8 gText_TheMailMessage[];\nextern const u8 gText_TheNewSong[];\nextern const u8 gText_CombineTwoWordsOrPhrases[];\nextern const u8 gText_AndMakeATrendySaying[];\nextern const u8 gText_TheTrendySaying[];\nextern const u8 gText_IsAsShownOkay[];\nextern const u8 gText_AllTextBeingEditedWill[];\nextern const u8 gText_BeDeletedThatOkay[];\nextern const u8 gText_QuitEditing[];\nextern const u8 gText_StopGivingPkmnMail[];\nextern const u8 gText_Profile[];\nextern const u8 gText_AtTheBattlesStart[];\nextern const u8 gText_UponWinningABattle[];\nextern const u8 gText_UponLosingABattle[];\nextern const u8 gText_TheBardsSong[];\nextern const u8 gText_WhatsHipAndHappening[];\nextern const u8 gText_Interview[];\nextern const u8 gText_Questionnaire[];\nextern const u8 gText_DelAllCancelOk[];\n\n// naming_screen\nextern const u8 gText_MoveOkBack[];\nextern const u8 gText_AlphabetUpperLower[];\nextern const u8 gText_YourName[];\nextern const u8 gText_BoxName[];\nextern const u8 gText_PkmnsNickname[];\nextern const u8 gText_RivalsName[];\n\n// pokemon_storage_system\nextern const u8 gText_WithdrawPokemon[];\nextern const u8 gText_WithdrawMonDescription[];\nextern const u8 gText_DepositPokemon[];\nextern const u8 gText_DepositMonDescription[];\nextern const u8 gText_MovePokemon[];\nextern const u8 gText_MoveMonDescription[];\nextern const u8 gText_MoveItems[];\nextern const u8 gText_MoveItemsDescription[];\nextern const u8 gText_SeeYa[];\nextern const u8 gText_SeeYaDescription[];\nextern const u8 gText_PartyFull[];\nextern const u8 gText_JustOnePkmn[];\nextern const u8 gText_Box[];\nextern const u8 gText_ExitFromBox[];\nextern const u8 gText_WhatDoYouWantToDo[];\nextern const u8 gText_PleasePickATheme[];\nextern const u8 gText_PickTheWallpaper[];\nextern const u8 gText_PkmnIsSelected[];\nextern const u8 gText_JumpToWhichBox[];\nextern const u8 gText_DepositInWhichBox[];\nextern const u8 gText_PkmnWasDeposited[];\nextern const u8 gText_BoxIsFull2[];\nextern const u8 gText_ReleaseThisPokemon[];\nextern const u8 gText_PkmnWasReleased[];\nextern const u8 gText_ByeByePkmn[];\nextern const u8 gText_MarkYourPkmn[];\nextern const u8 gText_ThatsYourLastPkmn[];\nextern const u8 gText_YourPartysFull[];\nextern const u8 gText_YoureHoldingAPkmn[];\nextern const u8 gText_WhichOneWillYouTake[];\nextern const u8 gText_YouCantReleaseAnEgg[];\nextern const u8 gText_ContinueBoxOperations[];\nextern const u8 gText_PkmnCameBack[];\nextern const u8 gText_WasItWorriedAboutYou[];\nextern const u8 gText_FourEllipsesExclamation[];\nextern const u8 gText_PleaseRemoveTheMail[];\nextern const u8 gText_PkmnIsSelected[];\nextern const u8 gText_GiveToAPkmn[];\nextern const u8 gText_PlacedItemInBag[];\nextern const u8 gText_BagIsFull2[];\nextern const u8 gText_PutItemInBag[];\nextern const u8 gText_ItemIsNowHeld[];\nextern const u8 gText_ChangedToNewItem[];\nextern const u8 gText_MailCantBeStored[];\nextern const u8 gPCText_Cancel[];\nextern const u8 gPCText_Store[];\nextern const u8 gPCText_Withdraw[];\nextern const u8 gPCText_Move[];\nextern const u8 gPCText_Shift[];\nextern const u8 gPCText_Place[];\nextern const u8 gPCText_Summary[];\nextern const u8 gPCText_Release[];\nextern const u8 gPCText_Mark[];\nextern const u8 gPCText_Jump[];\nextern const u8 gPCText_Wallpaper[];\nextern const u8 gPCText_Name[];\nextern const u8 gPCText_Take[];\nextern const u8 gPCText_Give[];\nextern const u8 gPCText_Switch[];\nextern const u8 gPCText_Bag[];\nextern const u8 gPCText_Info[];\nextern const u8 gPCText_Scenery1[];\nextern const u8 gPCText_Scenery2[];\nextern const u8 gPCText_Scenery3[];\nextern const u8 gPCText_Etcetera[];\nextern const u8 gPCText_Forest[];\nextern const u8 gPCText_City[];\nextern const u8 gPCText_Desert[];\nextern const u8 gPCText_Savanna[];\nextern const u8 gPCText_Crag[];\nextern const u8 gPCText_Volcano[];\nextern const u8 gPCText_Snow[];\nextern const u8 gPCText_Cave[];\nextern const u8 gPCText_Beach[];\nextern const u8 gPCText_Seafloor[];\nextern const u8 gPCText_River[];\nextern const u8 gPCText_Sky[];\nextern const u8 gPCText_PolkaDot[];\nextern const u8 gPCText_Pokecenter[];\nextern const u8 gPCText_Machine[];\nextern const u8 gPCText_Simple[];\n\n// pokemon_special_anim\nextern const u8 gText_Counting_1[];\nextern const u8 gText_Counting_2And[];\nextern const u8 gText_Poof[];\nextern const u8 gText_WasUsedOn[];\nextern const u8 gText_Period[];\nextern const u8 gText_LevelRoseTo[];\nextern const u8 gText_Period2[];\nextern const u8 gText_MonLearnedTMHM[];\nextern const u8 gText_MonForgotMove[];\nextern const u8 gText_And[];\nextern const u8 gText_MachineSet[];\nextern const u8 gText_Huh[];\nextern const u8 gText_LevelUp_MaxHP[];\nextern const u8 gText_LevelUp_Attack[];\nextern const u8 gText_LevelUp_Defense[];\nextern const u8 gText_LevelUp_SpAtk[];\nextern const u8 gText_LevelUp_SpDef[];\nextern const u8 gText_LevelUp_Speed[];\nextern const u8 gText_LevelUp_Minus[];\nextern const u8 gText_LevelUp_Plus[];\n\n// field_player_avatar\nextern const u8 gText_PokemonOnHook[];\nextern const u8 gText_NotEvenANibble[];\nextern const u8 gText_ItGotAway[];\n\n// pokemon_summary_screen\nextern const u8 gText_PokeSum_PageName_KnownMoves[];\nextern const u8 gText_PokeSum_Controls_PickSwitch[];\nextern const u8 gText_PokeSum_Controls_Pick[];\nextern const u8 gText_PokeSum_NoData[];\nextern const u8 gText_PokeSum_Controls_PageDetail[];\nextern const u8 gText_PokeSum_DexNoUnknown[];\nextern const u8 gText_PokeSum_Item_None[];\nextern const u8 gText_PokeSum_OneHyphen[];\nextern const u8 gText_PokeSum_TwoHyphens[];\nextern const u8 gText_PokeSum_PP[];\nextern const u8 gText_Somewhere[];\nextern const u8 gText_PokeSum_ATrade[];\nextern const u8 gText_PokeSum_FatefulEncounterHatched_BoldGentleGrammar[];\nextern const u8 gText_PokeSum_FatefulEncounterHatched[];\nextern const u8 gText_PokeSum_Hatched_BoldGentleGrammar[];\nextern const u8 gText_PokeSum_Hatched[];\nextern const u8 gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar[];\nextern const u8 gText_PokeSum_FatefulEncounterMet[];\nextern const u8 gText_PokeSum_Met_BoldGentleGrammar[];\nextern const u8 gText_PokeSum_Met[];\nextern const u8 gText_PokeSum_MetInATrade_BoldGentleGrammar[];\nextern const u8 gText_PokeSum_MetInATrade[];\nextern const u8 gText_PokeSum_ApparentlyFatefulEncounterHatched_BoldGentleGrammar[];\nextern const u8 gText_PokeSum_ApparentlyFatefulEncounterHatched[];\nextern const u8 gText_PokeSum_ApparentlyMet[];\nextern const u8 gText_PokeSum_ApparentlyMet_BoldGentleGrammar[];\nextern const u8 gText_PokeSum_ExpPoints[];\nextern const u8 gText_PokeSum_NextLv[];\nextern const u8 gText_PokeSum_PageName_PokemonInfo[];\nextern const u8 gText_PokeSum_Controls_PageCancel[];\nextern const u8 gText_PokeSum_Controls_Cancel[];\nextern const u8 gText_PokeSum_PageName_PokemonSkills[];\nextern const u8 gText_PokeSum_Controls_Page[];\nextern const u8 gText_PokeSum_Controls_PickDelete[];\nextern const u8 gText_PokeSum_HmMovesCantBeForgotten[];\nextern const u8 gText_PokeSum_EggHatch_LongTime[];\nextern const u8 gText_PokeSum_EggHatch_SomeTime[];\nextern const u8 gText_PokeSum_EggHatch_Soon[];\nextern const u8 gText_PokeSum_EggHatch_AlmostReady[];\nextern const u8 gText_PokeSum_EggOrigin_DayCare[];\nextern const u8 gText_PokeSum_EggOrigin_Trade[];\nextern const u8 gText_PokeSum_EggOrigin_TravelingMan[];\nextern const u8 gText_PokeSum_EggOrigin_Trade[];\nextern const u8 gText_PokeSum_EggOrigin_NicePlace[];\nextern const u8 gText_PokeSum_EggOrigin_Spa[];\nextern const u8 gText_PokeSum_EggOrigin_Trade[];\nextern const u8 gSummaryMetLocationTextOrreEeveelutionsDuking[];\nextern const u8 gText_YouAlreadyHaveThisTM[];\nextern const u8 gText_ThrowInPremierBall[];\nextern const u8 gText_ThrowInPremierBalls[];\nextern const u8 gText_PkmnFriendlyBaseVar2Fell[];\nextern const u8 gText_PkmnFriendlyBaseVar2CantFall[];\nextern const u8 gText_PkmnAdoresBaseVar2Fell[];\nextern const u8 gText_HeldItemsPocket[];\nextern const u8 gText_MedicinePocket[];\nextern const u8 gText_Version[];\nextern const u8 gText_FireredVersion[];\nextern const u8 gText_LeafgreenVersion[];\nextern const u8 gText_Difficulty[];\nextern const u8 gText_EasyDifficulty[];\nextern const u8 gText_NormalDifficulty[];\nextern const u8 gText_ChallengeDifficulty[];\nextern const u8 gText_Nuzlocke[];\nextern const u8 gText_Nuzlocke_On[];\nextern const u8 gText_Nuzlocke_Off[];\nextern const u8 gText_IVCalc[];\nextern const u8 gText_IVCalcZero[];\nextern const u8 gText_IVCalcStandard[];\nextern const u8 gText_IVCalcPerfect[];\nextern const u8 gText_EVCalc[];\nextern const u8 gText_EVCalcZero[];\nextern const u8 gText_EVCalcStandard[];\nextern const u8 gText_ExpModZero[];\nextern const u8 gText_ExpModHalf[];\nextern const u8 gText_ExpModNormal[];\nextern const u8 gText_ExpModTwice[];\nextern const u8 gText_KeySystemSettings[];\nextern const u8 gText_HelpPickSwitchCancel[];\nextern const u8 gChooseVersionNewGame[];\nextern const u8 gFRLG_Multichoice[];\nextern const u8 gText_NoPMC[];\nextern const u8 gText_ExpMod[];\nextern const u8 gText_BlueFlute_Ash[];\nextern const u8 gText_YellowFlute_Ash[];\nextern const u8 gText_RedFlute_Ash[];\nextern const u8 gText_WhiteFlute_Ash[];\nextern const u8 gText_BlackFlute_Ash[];\nextern const u8 gText_AshQuantity[];\nextern const u8 gText_SmallExit[];\nextern const u8 gText_BattleTower[];\nextern const u8 gText_BattleFactory[];\nextern const u8 gText_BattleArena[];\nextern const u8 gText_BattleDome[];\nextern const u8 gText_BattlePike[];\nextern const u8 gText_BattlePalace[];\nextern const u8 gText_BattlePyramid[];\nextern const u8 gText_DevonSpyShop[];\nextern const u8 gText_AnythingElseICanHelpF[];\nextern const u8 gText_Brock[];\nextern const u8 gText_Misty[];\nextern const u8 gText_LtSurge[];\nextern const u8 gText_Erika[];\nextern const u8 gText_Koga[];\nextern const u8 gText_Sabrina[];\nextern const u8 gText_Blaine[];\nextern const u8 gText_CommaSpace[];\nextern const u8 gText_NewLine[];\nextern const u8 gText_AndSpace[];\nextern const u8 gText_SwapToKanto[];\nextern const u8 gText_SwapToExtended[];\nextern const u8 gText_Extended[];\nextern const u8 gText_NumericalModeExtended[];\nextern const u8 gText_An[];\nextern const u8 gText_A[];\nextern const u8 gText_WhoAreThey[];\nextern const u8 gText_HowDoIBattleThem[];\nextern const u8 gText_AboutTitles[];\nextern const u8 gText_Nothing[];\n\n#endif //GUARD_STRINGS_H\n"
  },
  {
    "path": "include/task.h",
    "content": "#ifndef GUARD_TASK_H\n#define GUARD_TASK_H\n\n#include \"global.h\"\n\n#define HEAD_SENTINEL 0xFE\n#define TAIL_SENTINEL 0xFF\n#define TASK_NONE TAIL_SENTINEL\n\n#define NUM_TASKS 16\n#define NUM_TASK_DATA 16\n\ntypedef void (*TaskFunc)(u8 taskId);\n\nstruct Task\n{\n    TaskFunc func;\n    bool8 isActive;\n    u8 prev;\n    u8 next;\n    u8 priority;\n    s16 data[NUM_TASK_DATA];\n};\n\nextern struct Task gTasks[];\n\nvoid ResetTasks(void);\nu8 CreateTask(TaskFunc func, u8 priority);\nvoid DestroyTask(u8 taskId);\nvoid RunTasks(void);\nvoid TaskDummy(u8 taskId);\nvoid SetTaskFuncWithFollowupFunc(u8 taskId, TaskFunc func, TaskFunc followupFunc);\nvoid SwitchTaskToFollowupFunc(u8 taskId);\nbool8 FuncIsActiveTask(TaskFunc func);\nu8 FindTaskIdByFunc(TaskFunc func);\nu8 GetTaskCount(void);\nvoid SetWordTaskArg(u8 taskId, u8 dataElem, unsigned long value);\nu32 GetWordTaskArg(u8 taskId, u8 dataElem);\n\n#endif // GUARD_TASK_H\n"
  },
  {
    "path": "include/teachy_tv.h",
    "content": "#ifndef GUARD_TEACHY_TV_H\n#define GUARD_TEACHY_TV_H\n\nenum TeachyTvScript\n{\n    TTVSCR_BATTLE,\n    TTVSCR_STATUS,\n    TTVSCR_MATCHUPS,\n    TTVSCR_CATCHING,\n    TTVSCR_TMS,\n    TTVSCR_REGISTER\n};\n\nvoid InitTeachyTvController(u8 mode, void (*cb)());\nvoid CB2_ReturnToTeachyTV(void);\nvoid SetTeachyTvControllerModeToResume(void);\n\n#endif //GUARD_TEACHY_TV_H\n"
  },
  {
    "path": "include/text.h",
    "content": "#ifndef GUARD_TEXT_H\n#define GUARD_TEXT_H\n\n#include \"global.h\"\n#include \"characters.h\"\n\n#define NUM_TEXT_PRINTERS 32\n\n#define TEXT_SPEED_INSTANT 0\n\n// Given as a text speed when all the text should be\n// loaded at once but not copied to vram yet.\n#define TEXT_SKIP_DRAW 0xFF\n\nenum {\n    FONT_SMALL,\n    FONT_NORMAL_COPY_1,\n    FONT_NORMAL,\n    FONT_NORMAL_COPY_2,\n    FONT_MALE,\n    FONT_FEMALE,\n    FONT_BRAILLE,\n    FONT_BOLD,\n};\n\n// Return values for font functions\nenum {\n    RENDER_PRINT,\n    RENDER_FINISH,\n    RENDER_REPEAT, // Run render function again, if e.g. a control code is encountered.\n    RENDER_UPDATE,\n};\n\n// Text printer states read by RenderText / FontFunc_Braille\nenum {\n    RENDER_STATE_HANDLE_CHAR,\n    RENDER_STATE_WAIT,\n    RENDER_STATE_CLEAR,\n    RENDER_STATE_SCROLL_START,\n    RENDER_STATE_SCROLL,\n    RENDER_STATE_WAIT_SE,\n    RENDER_STATE_PAUSE,\n};\n\nenum\n{\n    FONTATTR_MAX_LETTER_WIDTH,\n    FONTATTR_MAX_LETTER_HEIGHT,\n    FONTATTR_LETTER_SPACING,\n    FONTATTR_LINE_SPACING,\n    FONTATTR_UNKNOWN,   // dunno what this is yet\n    FONTATTR_COLOR_FOREGROUND,\n    FONTATTR_COLOR_BACKGROUND,\n    FONTATTR_COLOR_SHADOW\n};\n\nstruct GlyphInfo\n{\n    u8 pixels[0x80];\n    u8 width;\n    u8 height;\n};\n\nextern struct GlyphInfo gGlyphInfo;\n\nstruct TextPrinterSubStruct\n{\n    u8 glyphId:4;  // 0x14\n    bool8 hasPrintBeenSpedUp:1;\n    u8 font_type_5:3;\n    u8 downArrowDelay:5;\n    u8 downArrowYPosIdx:2;\n    u8 hasGlyphIdBeenSet:1;\n    u8 autoScrollDelay;\n};\n\nstruct TextPrinterTemplate // TODO: Better name\n{\n    const u8 *currentChar;\n    u8 windowId;\n    u8 fontId;\n    u8 x;\n    u8 y;\n    u8 currentX;        // 0x8\n    u8 currentY;\n    u8 letterSpacing;\n    u8 lineSpacing;\n    u8 unk:4;   // 0xC\n    u8 fgColor:4;\n    u8 bgColor:4;\n    u8 shadowColor:4;\n};\n\nstruct TextPrinter\n{\n    struct TextPrinterTemplate printerTemplate;\n    void (*callback)(struct TextPrinterTemplate *, u16); // 0x10\n    union __attribute__((packed)) {\n        struct TextPrinterSubStruct sub;\n        u8 fields[7];\n    } subUnion;\n    u8 active;\n    u8 state;       // 0x1C\n    u8 textSpeed;\n    u8 delayCounter;\n    u8 scrollDistance;\n    u8 minLetterSpacing;  // 0x20\n    u8 japanese;\n};\n\nstruct FontInfo\n{\n    u16 (*fontFunction)(struct TextPrinter *x);\n    u8 maxLetterWidth;\n    u8 maxLetterHeight;\n    u8 letterSpacing;\n    u8 lineSpacing;\n    u8 unk:4;\n    u8 fgColor:4;\n    u8 bgColor:4;\n    u8 shadowColor:4;\n};\n\nextern const struct FontInfo *gFonts;\n\nstruct GlyphWidthFunc\n{\n    u32 fontId;\n    s32 (*func)(u16 glyphId, bool32 isJapanese);\n};\n\ntypedef struct {\n    u8 canABSpeedUpPrint:1;\n    u8 useAlternateDownArrow:1;\n    u8 autoScroll:1;\n    u8 forceMidTextSpeed:1;\n} TextFlags;\n\nextern TextFlags gTextFlags;\n\nextern u8 gStringVar1[];\nextern u8 gStringVar2[];\nextern u8 gStringVar3[];\nextern u8 gStringVar4[];\n\nextern const u8 gKeypadIconTiles[];\n\nvoid SetFontsPointer(const struct FontInfo *fonts);\nvoid DeactivateAllTextPrinters(void);\nu16 AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16));\nbool16 AddTextPrinter(struct TextPrinterTemplate *textSubPrinter, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16));\nvoid RunTextPrinters(void);\nbool16 IsTextPrinterActive(u8 id);\nu32 RenderFont(struct TextPrinter *textPrinter);\nvoid GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor);\nvoid SaveTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor);\nvoid RestoreTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor);\nvoid DecompressGlyphTile(const u16 *src, u16 *dest);\nu8 GetLastTextColor(u8 colorType);\nvoid CopyGlyphToWindow(struct TextPrinter *x);\nvoid ClearTextSpan(struct TextPrinter *textPrinter, u32 width);\n\nu16 FontFunc_Small(struct TextPrinter *textPrinter);\nu16 FontFunc_NormalCopy1(struct TextPrinter *textPrinter);\nu16 FontFunc_Normal(struct TextPrinter *textPrinter);\nu16 FontFunc_NormalCopy2(struct TextPrinter *textPrinter);\nu16 FontFunc_Male(struct TextPrinter *textPrinter);\nu16 FontFunc_Female(struct TextPrinter *textPrinter);\nu16 FontFunc_Braille(struct TextPrinter *textPrinter);\n\nvoid TextPrinterInitDownArrowCounters(struct TextPrinter *textPrinter);\nvoid TextPrinterDrawDownArrow(struct TextPrinter *textPrinter);\nvoid TextPrinterClearDownArrow(struct TextPrinter *textPrinter);\nbool8 TextPrinterWaitAutoMode(struct TextPrinter *textPrinter);\nbool16 TextPrinterWaitWithDownArrow(struct TextPrinter *textPrinter);\nbool16 TextPrinterWait(struct TextPrinter *textPrinter);\nvoid DrawDownArrow(u8 windowId, u16 x, u16 y, u8 bgColor, bool8 drawArrow, u8 *counter, u8 *yCoordIndex);\nu16 RenderText(struct TextPrinter *textPrinter);\ns32 (*GetFontWidthFunc(u8 glyphId))(u16, bool32);\ns32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing);\nu8 RenderTextHandleBold(u8 *pixels, u8 fontId, u8 *str, int a3, int a4, int a5, int a6, int a7);\nu8 DrawKeypadIcon(u8 windowId, u8 keypadIconId, u16 x, u16 y);\nu8 GetKeypadIconTileOffset(u8 keypadIconId);\nu8 GetKeypadIconWidth(u8 keypadIconId);\nu8 GetKeypadIconHeight(u8 keypadIconId);\nu8 GetFontAttribute(u8 fontId, u8 attributeId);\nu8 GetMenuCursorDimensionByFont(u8 fontId, u8 whichDimension);\nvoid DecompressGlyph_Small(u16 glyphId, bool32 isJapanese);\nvoid DecompressGlyph_Normal(u16 glyphId, bool32 isJapanese);\nvoid DecompressGlyph_Female(u16 glyphId, bool32 isJapanese);\ns32 GetGlyphWidth_Braille(u16 font_type, bool32 isJapanese);\nu8 CreateTextCursorSprite(u8 sheetId, u16 x, u16 y, u8 priority, u8 subpriority);\nvoid DestroyTextCursorSprite(u8 spriteId);\ns32 GetGlyphWidth_Braille(u16 font_type, bool32 isJapanese);\nint GetStringCenterAlignXOffset(int fontId, const u8 *str, int totalWidth);\nint GetStringCenterAlignXOffsetWithLetterSpacing(int fontId, const u8 *str, int totalWidth, int letterSpacing);\nint GetStringWidthDifference(int fontId, const u8 *str, int totalWidth, int letterSpacing);\n\n#endif // GUARD_TEXT_H\n"
  },
  {
    "path": "include/text_window.h",
    "content": "#ifndef GUARD_TEXT_WINDOW_H\n#define GUARD_TEXT_WINDOW_H\n\n#include \"global.h\"\n\nstruct TilesPal\n{\n    u32 *tiles;\n    u16 *pal;\n};\n\nvoid rbox_fill_rectangle(u8 windowId);\nconst u16 *GetTextWindowPalette(u8 id);\nconst u16 *GetOverworldTextboxPalettePtr(void);\nvoid LoadMenuMessageWindowGfx(u8 windowId, u16 tileStart, u8 palette);\nvoid LoadStdWindowGfx(u8 windowId, u16 tileStart, u8 palette);\nvoid LoadUserWindowGfx(u8 windowId, u16 tileStart, u8 palette);\nvoid LoadUserWindowGfx2(u8 windowId, u16 tileStart, u8 palette);\nvoid LoadStdWindowGfxOnBg(u8 bgId, u16 tileStart, u8 palette);\nvoid DrawTextBorderOuter(u8 windowId, u16 tileStart, u8 palette);\nvoid DrawTextBorderInner(u8 windowId, u16 tileNum, u8 palNum);\nvoid LoadHelpMessageWindowGfx(u8 windowId, u16 destOffset, u8 palIdx);\nvoid LoadSignpostWindowGfx(u8 windowId, u16 destOffset, u8 palIdx);\nvoid LoadStdWindowTiles(u8 windowId, u16 destOffset);\nvoid LoadQuestLogWindowTiles(u8 windowId, u16 destOffset);\n\n#endif // GUARD_TEXT_WINDOW_H\n"
  },
  {
    "path": "include/text_window_graphics.h",
    "content": "#ifndef GUARD_TEXT_WINDOW_GRAPHICS_H\n#define GUARD_TEXT_WINDOW_GRAPHICS_H\n\nstruct TextWindowGraphics\n{\n    const void *tiles;\n    const void *palette;\n};\n\nextern const u16 gSignpostWindow_Gfx[];\nextern const u16 gStdTextWindow_Gfx[];\nextern const u16 gQuestLogWindow_Gfx[];\nextern const u16 gTextWindowPalettes[][16];\n\nextern const struct TextWindowGraphics gUserFrames[];\n\nconst struct TextWindowGraphics *GetUserWindowGraphics(u8 idx);\n\n#endif //GUARD_TEXT_WINDOW_GRAPHICS_H\n"
  },
  {
    "path": "include/tilemap_util.h",
    "content": "#ifndef GUARD_TILEMAP_UTIL_H\n#define GUARD_TILEMAP_UTIL_H\n\nvoid TilemapUtil_Init(u8 numTilemapIds);\nvoid TilemapUtil_Free(void);\nvoid TilemapUtil_SetTilemap(u8 tilemapId, u8 bg, const void *tilemap, u16 width, u16 height);\nvoid TilemapUtil_SetPos(u8 tilemapId, u16 destX, u16 destY);\nvoid TilemapUtil_SetRect(u8 tilemapId, u16 x, u16 y, u16 width, u16 height);\nvoid TilemapUtil_Move(u8 tilemapId, u8 mode, s8 param);\nvoid TilemapUtil_Update(u8 tilemapId);\n\n#endif //GUARD_TILEMAP_UTIL_H\n"
  },
  {
    "path": "include/tileset_anims.h",
    "content": "#ifndef GUARD_TILESET_ANIMS_H\n#define GUARD_TILESET_ANIMS_H\n\nvoid InitTilesetAnimations(void);\nvoid InitSecondaryTilesetAnimation(void);\nvoid UpdateTilesetAnimations(void);\nvoid TransferTilesetAnimsBuffer(void);\n\nvoid InitTilesetAnim_General(void);\nvoid InitTilesetAnim_CeladonCity(void);\nvoid InitTilesetAnim_VermilionGym(void);\nvoid InitTilesetAnim_CeladonGym(void);\nvoid InitTilesetAnim_SilphCo(void);\nvoid InitTilesetAnim_MtEmber(void);\nvoid InitTilesetAnim_Underwater(void);\nvoid InitTilesetAnim_BattleFrontierOutsideWest(void);\nvoid InitTilesetAnim_BattleFrontierOutsideEast(void);\nvoid InitTilesetAnim_SeviiIslands67(void);\nvoid InitTilesetAnim_SeviiIslands5(void);\n\n#endif // GUARD_TILESET_ANIMS_H\n"
  },
  {
    "path": "include/tilesets.h",
    "content": "#ifndef GUARD_TILESETS_H\n#define GUARD_TILESETS_H\n\nextern const u32 gTilesetTiles_General[];\nextern const u16 gTilesetPalettes_General[][16];\n\nextern const u32 gTilesetTiles_GenericBuilding1[];\nextern const u16 gTilesetPalettes_GenericBuilding1[][16];\n\nextern const u32 gTilesetTiles_DepartmentStore[];\nextern const u16 gTilesetPalettes_DepartmentStore[][16];\n\n#endif // GUARD_TILESETS_H\n"
  },
  {
    "path": "include/title_screen.h",
    "content": "#ifndef GUARD_TITLE_SCREEN_H\n#define GUARD_TITLE_SCREEN_H\n\nvoid CB2_InitTitleScreen(void);\n\n#endif //GUARD_TITLE_SCREEN_H\n"
  },
  {
    "path": "include/tm_case.h",
    "content": "#ifndef GUARD_TM_CASE_H\n#define GUARD_TM_CASE_H\n\n// Values for 'type' argument to InitTMCase\nenum {\n    TMCASE_FIELD,\n    TMCASE_GIVE_PARTY,\n    TMCASE_SELL,\n    TMCASE_GIVE_PC,\n    TMCASE_POKEDUDE,\n    TMCASE_REOPENING,\n};\n\n// Alternative value for 'allowSelectClose' argument to InitTMCase.\n// Indicates that the previous value should be preserved\n#define TMCASE_KEEP_PREV 0xFF\n\nvoid InitTMCase(u8 type, void (* exitCallback)(void), bool8 allowSelectClose);\nvoid ResetTMCaseCursorPos(void);\nvoid Pokedude_InitTMCase(void);\n\n#endif //GUARD_TM_CASE_H\n"
  },
  {
    "path": "include/trade.h",
    "content": "#ifndef GUARD_TRADE_H\n#define GUARD_TRADE_H\n\n#include \"global.h\"\n#include \"link_rfu.h\"\n#include \"constants/trade.h\"\n\nextern struct Mail gLinkPartnerMail[6];\nextern u8 gSelectedTradeMonPositions[2];\n\nextern const u8 gText_MaleSymbol4[];\nextern const u8 gText_FemaleSymbol4[];\nextern const u8 gText_GenderlessSymbol[];\n\nextern const u16 gTradeOrHatchMonShadowTilemap[];\nvoid CB2_StartCreateTradeMenu(void);\ns32 GetGameProgressForLinkTrade(void);\ns32 CanRegisterMonForTradingBoard(struct RfuGameCompatibilityData rfuPlayer, u16 species2, u16 species, u8 isEventLegal);\ns32 GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData rfuPlayer, struct RfuGameCompatibilityData rfuPartner, u16 playerSpecies2, u16 partnerSpecies, u8 requestedType, u16 playerSpecies, u8 isEventLegal);\nvoid CB2_ReturnToTradeMenuFromSummary(void);\n\n#endif //GUARD_TRADE_H\n"
  },
  {
    "path": "include/trade_scene.h",
    "content": "#ifndef GUARD_TRADE_SCENE_H\n#define GUARD_TRADE_SCENE_H\n\nvoid CB2_LinkTrade(void);\nvoid CreateInGameTradePokemon(void);\nvoid DoInGameTradeScene(void);\nvoid DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed);\nu16 GetInGameTradeSpeciesInfo(void);\nu16 GetTradeSpecies(void);\nvoid InitTradeSequenceBgGpuRegs(void);\nvoid LinkTradeDrawWindow(void);\nvoid LoadTradeAnimGfx(void);\n\nextern const u16 gTradeOrHatchMonShadowTilemap[];\nextern const struct WindowTemplate gTradeEvolutionSceneYesNoWindowTemplate;\n\n#endif //GUARD_TRADE_SCENE_H\n"
  },
  {
    "path": "include/trainer_card.h",
    "content": "#ifndef GUARD_TRAINER_CARD_H\n#define GUARD_TRAINER_CARD_H\n\n#include \"constants/trainer_card.h\"\n\nstruct TrainerCardRSE\n{\n    /*0x00*/ u8 gender;\n    /*0x01*/ u8 stars;\n    /*0x02*/ bool8 hasPokedex;\n    /*0x03*/ bool8 caughtAllHoenn;\n    /*0x04*/ bool8 hasAllPaintings;\n    /*0x06*/ u16 hofDebutHours;\n    /*0x08*/ u16 hofDebutMinutes;\n    /*0x0A*/ u16 hofDebutSeconds;\n    /*0x0C*/ u16 caughtMonsCount;\n    /*0x0E*/ u16 trainerId;\n    /*0x10*/ u16 playTimeHours;\n    /*0x12*/ u16 playTimeMinutes;\n    /*0x14*/ u16 linkBattleWins;\n    /*0x16*/ u16 linkBattleLosses;\n    /*0x18*/ u16 battleTowerWins;\n    /*0x1A*/ u16 battleTowerStraightWins;\n    /*0x1C*/ u16 contestsWithFriends;\n    /*0x1E*/ u16 pokeblocksWithFriends;\n    /*0x20*/ u16 pokemonTrades;\n    /*0x24*/ u32 money;\n    /*0x28*/ u16 easyChatProfile[TRAINER_CARD_PROFILE_LENGTH];\n    /*0x30*/ u8 playerName[PLAYER_NAME_LENGTH + 1];\n};\n\nstruct TrainerCard\n{\n    /*0x00*/ struct TrainerCardRSE rse;\n    /*0x38*/ u8 version;\n    /*0x3A*/ bool16 hasAllFrontierSymbols;\n    /*0x3C*/ u32 berryCrushPoints;\n    /*0x40*/ u32 unionRoomNum;\n    /*0x44*/ u32 berriesPicked;\n    /*0x48*/ u32 jumpsInRow;\n    /*0x4C*/ bool8 shouldDrawStickers;\n    /*0x4D*/ bool8 hasAllMons;\n    /*0x4E*/ u8 monIconTint;\n    /*0x4F*/ u8 facilityClass;\n    /*0x50*/ u8 stickers[TRAINER_CARD_STICKER_TYPES];\n    /*0x54*/ u16 monSpecies[PARTY_SIZE];\n};\n\nextern struct TrainerCard gTrainerCards[4];\n\nvoid ShowPlayerTrainerCard(void (*callback)(void));\nvoid ShowTrainerCardInLink(u8 whoseCard, MainCallback callback);\nu8 GetTrainerCardStars(u8 cardId);\nvoid TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard *trainerCard);\n\n#endif //GUARD_TRAINER_CARD_H\n"
  },
  {
    "path": "include/trainer_front_sprites.h",
    "content": "#ifndef GUARD_TRAINER_FRONT_SPRITES_H\n#define GUARD_TRAINER_FRONT_SPRITES_H\n\n#include \"global.h\"\n\nenum\n{\n    TRAINER_FRONT_PIC_HIKER,\n    TRAINER_FRONT_PIC_AQUA_GRUNT_M,\n    TRAINER_FRONT_PIC_PKMN_BREEDER_F,\n    TRAINER_FRONT_PIC_COOLTRAINER_M,\n    TRAINER_FRONT_PIC_BIRD_KEEPER,\n    TRAINER_FRONT_PIC_COLLECTOR,\n    TRAINER_FRONT_PIC_AQUA_GRUNT_F,\n    TRAINER_FRONT_PIC_SWIMMER_M,\n    TRAINER_FRONT_PIC_MAGMA_GRUNT_M,\n    TRAINER_FRONT_PIC_EXPERT_M,\n    TRAINER_FRONT_PIC_AQUA_ADMIN_M,\n    TRAINER_FRONT_PIC_BLACK_BELT,\n    TRAINER_FRONT_PIC_AQUA_ADMIN_F,\n    TRAINER_FRONT_PIC_AQUA_LEADER,\n    TRAINER_FRONT_PIC_HEX_MANIAC,\n    TRAINER_FRONT_PIC_AROMA_LADY,\n    TRAINER_FRONT_PIC_RUIN_MANIAC,\n    TRAINER_FRONT_PIC_INTERVIEWER,\n    TRAINER_FRONT_PIC_TUBER_F,\n    TRAINER_FRONT_PIC_TUBER_M,\n    TRAINER_FRONT_PIC_COOLTRAINER_F,\n    TRAINER_FRONT_PIC_LADY,\n    TRAINER_FRONT_PIC_BEAUTY,\n    TRAINER_FRONT_PIC_RICH_BOY,\n    TRAINER_FRONT_PIC_EXPERT_F,\n    TRAINER_FRONT_PIC_POKE_MANIAC,\n    TRAINER_FRONT_PIC_MAGMA_GRUNT_F,\n    TRAINER_FRONT_PIC_GUITARIST,\n    TRAINER_FRONT_PIC_KINDLER,\n    TRAINER_FRONT_PIC_CAMPER,\n    TRAINER_FRONT_PIC_PICNICKER,\n    TRAINER_FRONT_PIC_BUG_MANIAC,\n    TRAINER_FRONT_PIC_PKMN_BREEDER_M,\n    TRAINER_FRONT_PIC_PSYCHIC_M,\n    TRAINER_FRONT_PIC_PSYCHIC_F,\n    TRAINER_FRONT_PIC_GENTLEMAN,\n    TRAINER_FRONT_PIC_SIDNEY,\n    TRAINER_FRONT_PIC_PHOEBE,\n    TRAINER_FRONT_PIC_GLACIA,\n    TRAINER_FRONT_PIC_DRAKE,\n    TRAINER_FRONT_PIC_ROXANNE,\n    TRAINER_FRONT_PIC_BRAWLY,\n    TRAINER_FRONT_PIC_WATTSON,\n    TRAINER_FRONT_PIC_FLANNERY,\n    TRAINER_FRONT_PIC_NORMAN,\n    TRAINER_FRONT_PIC_WINONA,\n    TRAINER_FRONT_PIC_TATE_LIZA,\n    TRAINER_FRONT_PIC_JUAN,\n    TRAINER_FRONT_PIC_SCHOOL_KID_M,\n    TRAINER_FRONT_PIC_SCHOOL_KID_F,\n    TRAINER_FRONT_PIC_SR_JR,\n    TRAINER_FRONT_PIC_POKéFAN_M,\n    TRAINER_FRONT_PIC_POKéFAN_F,\n    TRAINER_FRONT_PIC_YOUNGSTER,\n    TRAINER_FRONT_PIC_WALLACE,\n    TRAINER_FRONT_PIC_FISHERMAN,\n    TRAINER_FRONT_PIC_TRIATHLETE_BIKER_M,\n    TRAINER_FRONT_PIC_TRIATHLETE_BIKER_F,\n    TRAINER_FRONT_PIC_TRIATHLETE_JOGGER_M,\n    TRAINER_FRONT_PIC_TRIATHLETE_JOGGER_F,\n    TRAINER_FRONT_PIC_TRIATHLETE_SWIMMER_M,\n    TRAINER_FRONT_PIC_TRIATHLETE_SWIMMER_F,\n    TRAINER_FRONT_PIC_DRAGON_TAMER,\n    TRAINER_FRONT_PIC_NINJA_BOY,\n    TRAINER_FRONT_PIC_BATTLE_GIRL,\n    TRAINER_FRONT_PIC_PARASOL_LADY,\n    TRAINER_FRONT_PIC_SWIMMER_F,\n    TRAINER_FRONT_PIC_TWINS,\n    TRAINER_FRONT_PIC_SAILOR,\n    TRAINER_FRONT_PIC_MAGMA_ADMIN_M,\n    TRAINER_FRONT_PIC_WALLY,\n    TRAINER_FRONT_PIC_BRENDAN_E,\n    TRAINER_FRONT_PIC_MAY_E,\n    TRAINER_FRONT_PIC_BUG_CATCHER,\n    TRAINER_FRONT_PIC_PKMN_RANGER_M,\n    TRAINER_FRONT_PIC_PKMN_RANGER_F,\n    TRAINER_FRONT_PIC_MAGMA_LEADER,\n    TRAINER_FRONT_PIC_LASS,\n    TRAINER_FRONT_PIC_YOUNG_COUPLE,\n    TRAINER_FRONT_PIC_OLD_COUPLE,\n    TRAINER_FRONT_PIC_SIS_AND_BRO,\n    TRAINER_FRONT_PIC_STEVEN,\n    TRAINER_FRONT_PIC_ANABEL,\n    TRAINER_FRONT_PIC_TUCKER,\n    TRAINER_FRONT_PIC_SPENSER,\n    TRAINER_FRONT_PIC_GRETA,\n    TRAINER_FRONT_PIC_NOLAND,\n    TRAINER_FRONT_PIC_LUCY,\n    TRAINER_FRONT_PIC_BRANDON,\n    TRAINER_FRONT_PIC_RED,\n    TRAINER_FRONT_PIC_LEAF,\n    TRAINER_FRONT_PIC_BRENDAN_RS,\n    TRAINER_FRONT_PIC_MAY_RS\n};\n\n#endif // GUARD_TRAINER_FRONT_SPRITES_H\n"
  },
  {
    "path": "include/trainer_ids.h",
    "content": "#ifndef GUARD_TRAINER_IDS_H\n#define GUARD_TRAINER_IDS_H\n\n#include \"global.h\"\n\n#define NO_OF_TRAINERS      854\n#define TRAINER_ID_STEVEN   804\n\n#endif // GUARD_TRAINER_IDS_H\n"
  },
  {
    "path": "include/trainer_pokemon_sprites.h",
    "content": "#ifndef GUARD_TRAINER_POKEMON_SPRITES_H\n#define GUARD_TRAINER_POKEMON_SPRITES_H\n\n#include \"global.h\"\n\nu16 CreateTrainerCardTrainerPicSprite(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId);\nbool16 ResetAllPicSprites(void);\nu16 CreateTrainerPicSprite(u16 species, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag);\nu16 FreeAndDestroyMonPicSprite(u16);\nu16 FreeAndDestroyTrainerPicSprite(u16);\nu16 PlayerGenderToFrontTrainerPicId(u8 gender, bool8 getClass);\nu16 CreateMonPicSprite_HandleDeoxys(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag);\nu16 LoadMonPicInWindow(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId);\nu16 CreateMonPicSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 ignoreDeoxys);\nu16 CreateMonPicSprite_HandleDeoxys(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag);\n\n#endif // GUARD_TRAINER_POKEMON_SPRITES_H\n"
  },
  {
    "path": "include/trainer_see.h",
    "content": "#ifndef GUARD_TRAINER_SEE_H\n#define GUARD_TRAINER_SEE_H\n\n#include \"global.h\"\n\nbool8 CheckForTrainersWantingBattle(void);\nvoid MovementAction_RevealTrainer_RunTrainerSeeFuncList(struct ObjectEvent *var);\nu8 FldEff_ExclamationMarkIcon1(void);\nu8 FldEff_DoubleExclMarkIcon(void);\nu8 FldEff_XIcon(void);\nu8 FldEff_SmileyFaceIcon(void);\nu8 FldEff_QuestionMarkIcon(void);\n\n#endif //GUARD_TRAINER_SEE_H\n"
  },
  {
    "path": "include/trainer_tower.h",
    "content": "#ifndef GUARD_TRAINER_TOWER_H\n#define GUARD_TRAINER_TOWER_H\n\nvoid PrintTrainerTowerRecords(void);\nvoid InitTrainerTowerBattleStruct(void);\nvoid FreeTrainerTowerBattleStruct(void);\nu8 GetTrainerTowerTrainerFrontSpriteId(void);\nvoid ResetTrainerTowerResults(void);\nvoid GetTrainerTowerOpponentWinText(u8 *dest, u8 opponentIdx);\nvoid GetTrainerTowerOpponentLoseText(u8 *dest, u8 opponentIdx);\nvoid GetTrainerTowerOpponentName(u8 *text);\nu8 GetTrainerTowerOpponentClass(void);\n\n#endif //GUARD_TRAINER_TOWER_H\n"
  },
  {
    "path": "include/trig.h",
    "content": "#ifndef GUARD_TRIG_H\n#define GUARD_TRIG_H\n\n#include \"global.h\"\n\nextern const s16 gSineTable[];\n\ns16 Sin(s16 index, s16 amplitude);\ns16 Cos(s16 index, s16 amplitude);\ns16 Sin2(u16 angle);\ns16 Cos2(u16 angle);\n\n#endif // GUARD_TRIG_H\n"
  },
  {
    "path": "include/union_room.h",
    "content": "#ifndef GUARD_UNION_ROOM_H\n#define GUARD_UNION_ROOM_H\n\n#include \"global.h\"\n#include \"link_rfu.h\"\n#include \"constants/union_room.h\"\n\n// In the Union Room the player is only ever connected to ≤ 4 other players.\n// However, there can be up to MAX_UNION_ROOM_LEADERS (8) object events to\n// represent leaders of recently discovered link groups, and each of those groups\n// may have up to MAX_RFU_PLAYERS (5) players in it including the leader.\n// These players are represented on-screen by NPC sprites drawn around the leader.\n// Thus there can be 40 sprites of other players on-screen, in 8 groups of 5.\n#define NUM_UNION_ROOM_SPRITES (MAX_UNION_ROOM_LEADERS * MAX_RFU_PLAYERS)\n\n// The maximum number of recently connected players that can be tracked.\n// Note that this is significantly less than NUM_UNION_ROOM_SPRITES, i.e. not\n// every player that can be shown in the Union Room can be tracked at once.\n// Information such as a group member's gender can instead be read from partnerInfo\n// of the leader's RfuGameData by tracking at least all of the group leaders.\n#define MAX_RFU_PLAYER_LIST_SIZE 16\n\nstruct RfuPlayerData\n{\n    struct RfuGameData data;\n    u8 ALIGNED(4) name[RFU_USER_NAME_LENGTH];\n};\n\nstruct RfuPlayer\n{\n    struct RfuPlayerData rfu;\n    u16 timeoutCounter;\n    u8 groupScheduledAnim:2;\n    bool8 useRedText:1; // Never set\n    u8 newPlayerCountdown;\n    u8 unused;\n};\n\nstruct RfuPlayerList\n{\n    struct RfuPlayer players[MAX_RFU_PLAYER_LIST_SIZE];\n};\n\nstruct RfuIncomingPlayer\n{\n    struct RfuPlayerData rfu;\n    u8 active:1;\n};\n\nstruct RfuIncomingPlayerList\n{\n    struct RfuIncomingPlayer players[MAX_RFU_PLAYERS];\n};\n\nstruct WirelessLink_Leader\n{\n    struct RfuPlayerList * playerList;\n    struct RfuIncomingPlayerList * incomingPlayerList;\n    struct RfuPlayerList * playerListBackup;\n    u8 state;\n    u8 textState;\n    u8 delayTimerAfterOk;\n    u8 listWindowId;\n    u8 bButtonCancelWindowId;\n    u8 nPlayerModeWindowId;\n    u8 listTaskId;\n    u8 playerCount;\n    u16 yesNoWindowId;\n    u8 unused;\n    u8 listenTaskId;\n    u8 activity;\n    u8 joinRequestAnswer;\n    u16 memberConfirmTimeout;\n};\n\nstruct WirelessLink_Group\n{\n    struct RfuPlayerList * playerList;\n    struct RfuIncomingPlayerList * incomingPlayerList;\n    u8 state;\n    u8 textState;\n    u8 delayTimerAfterOk; // unused\n    u8 listWindowId;\n    u8 bButtonCancelWindowId;\n    u8 playerNameAndIdWindowId;\n    u8 listTaskId;\n    u8 leaderId;\n    u8 unused;\n    u8 listenTaskId;\n    bool8 isWonderNews;\n    bool8 showListMenu; // referenced but never set\n    u8 refreshTimer;\n    u8 delayBeforePrint;\n};\n\nstruct UnionRoomObject\n{\n    u8 state;\n    u8 gfxId;\n    s8 animState;\n    u8 schedAnim;\n};\n\nstruct WirelessLink_URoom\n{\n    struct RfuPlayerList * playerList;\n    struct RfuIncomingPlayerList * incomingChildList;\n    struct RfuPlayerList * spawnPlayer;\n    struct RfuIncomingPlayerList * incomingParentList;\n    u16 unknown; // Never read\n    u16 unreadPlayerId;\n    u8 state;\n    u8 stateAfterPrint;\n    u8 textState;\n    u8 filler[4];\n    u8 topListMenuWindowId;\n    u8 topListMenuId;\n    u8 tradeBoardMainWindowId;\n    u8 tradeBoardHeaderWindowId;\n    u8 unused1;\n    u8 searchTaskId;\n    u8 spriteIds[NUM_UNION_ROOM_SPRITES];\n    u8 unused2;\n    u8 tradeBoardListMenuId;\n// For communication with potential link partners\n    u16 playerSendBuffer[6];\n    u8 activityRequestStrbufs[4][11];\n    u16 partnerYesNoResponse;\n    u16 recvActivityRequest[3];  // activity[, species, level]\n    struct UnionRoomObject objects[MAX_UNION_ROOM_LEADERS];\n    u8 trainerCardStrBuffer[12][15];\n    u8 trainerCardColorStrBuffer[48];\n    u8 trainerCardMsgStrBuffer[200];\n};\n\nstruct UnionRoomTrade\n{\n    u16 state;\n    u16 type;\n    u32 playerPersonality;\n    u8 offerPlayerId;\n    u16 playerSpecies;\n    u16 playerLevel;\n    u16 species;\n    u16 level;\n    u32 personality;\n};\n\nextern struct RfuGameCompatibilityData gRfuPartnerCompatibilityData;\nextern u16 gUnionRoomOfferedSpecies;\nextern u8 gUnionRoomRequestedMonType;\n\nvoid StartUnionRoomBattle(u16 battleFlags);\nu8 CreateTask_CreateTradeMenu(void);\n\n#endif //GUARD_UNION_ROOM_H\n"
  },
  {
    "path": "include/union_room_battle.h",
    "content": "#ifndef GUARD_UNION_ROOM_BATTLE_H\n#define GUARD_UNION_ROOM_BATTLE_H\n\nvoid CB2_UnionRoomBattle(void);\n\n#endif //GUARD_UNION_ROOM_BATTLE_H\n"
  },
  {
    "path": "include/union_room_chat.h",
    "content": "#ifndef GUARD_UNION_ROOM_CHAT_H\n#define GUARD_UNION_ROOM_CHAT_H\n\nenum\n{\n    UNION_ROOM_KB_PAGE_UPPER,\n    UNION_ROOM_KB_PAGE_LOWER,\n    UNION_ROOM_KB_PAGE_EMOJI,\n    UNION_ROOM_KB_PAGE_COUNT\n};\n\nextern const u8 *const gUnionRoomKeyboardText[UNION_ROOM_KB_PAGE_COUNT][UNION_ROOM_KB_ROW_COUNT];\n\nvoid EnterUnionRoomChat(void);\nu8 *UnionRoomChat_GetWorkRegisteredText(int arg0);\nvoid UnionRoomChat_GetCursorColAndRow(u8 *colp, u8 *rowp);\nu8 *UnionRoomChat_GetMessageEntryBuffer(void);\nint UnionRoomChat_LenMessageEntryBuffer(void);\nvoid UnionRoomChat_GetBufferSelectionRegion(u32 *startp, u32 *diffp);\nu8 *UnionRoomChat_GetEndOfMessageEntryBuffer(void);\nu16 UnionRoomChat_GetNumCharsInMessageEntryBuffer(void);\nu8 *UnionRoomChat_GetLastReceivedMessage(void);\nu16 UnionRoomChat_GetReceivedPlayerIndex(void);\nint UnionRoomChat_GetMessageEntryCursorPosition(void);\nint UnionRoomChat_GetWhetherShouldShowCaseToggleIcon(void);\nu8 *UnionRoomChat_GetNameOfPlayerWhoDisbandedChat(void);\nvoid UnionRoomChat_InitializeRegisteredTexts(void);\nu8 GetCurrentKeyboardPage(void);\n\n#endif // GUARD_UNION_ROOM_CHAT_H\n"
  },
  {
    "path": "include/union_room_chat_display.h",
    "content": "#ifndef GUARD_UNION_ROOM_CHAT_DISPLAY_H\n#define GUARD_UNION_ROOM_CHAT_DISPLAY_H\n\n#define CHATDISPLAYROUTINE_LOADGFX  0\n#define CHATDISPLAYROUTINE_MOVEKBCURSOR  1\n#define CHATDISPLAYROUTINE_CURSORBLINK  2\n#define CHATDISPLAYROUTINE_SHOWKBSWAPMENU  3\n#define CHATDISPLAYROUTINE_HIDEKBSWAPMENU  4\n#define CHATDISPLAYROUTINE_SWITCHPAGES  5\n#define CHATDISPLAYROUTINE_SHOWQUITCHATTINGDIALOG  6\n#define CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO  7\n#define CHATDISPLAYROUTINE_PRINTMSG  8\n#define CHATDISPLAYROUTINE_PRINTREGISTERWHERE  9\n#define CHATDISPLAYROUTINE_CANCELREGISTER 10\n#define CHATDISPLAYROUTINE_RETURNTOKB 11\n#define CHATDISPLAYROUTINE_SCROLLCHAT 12\n#define CHATDISPLAYROUTINE_PRINTINPUTTEXT 13\n#define CHATDISPLAYROUTINE_ASKSAVE 14\n#define CHATDISPLAYROUTINE_ASKOVERWRITESAVE 15\n#define CHATDISPLAYROUTINE_PRINTSAVING 16\n#define CHATDISPLAYROUTINE_PRINTSAVEDTHEGAME 17\n#define CHATDISPLAYROUTINE_PRINTEXITINGCHAT 18\n#define CHATDISPLAYROUTINE_PRINTLEADERLEFT 19\n#define CHATDISPLAYROUTINE_SHOWCONFIRMLEADERLEAVEDIALOG 20\n\nbool8 UnionRoomChat_TryAllocGraphicsWork(void);\nbool32 UnionRoomChat_RunDisplaySubtask0(void);\nvoid UnionRoomChat_FreeGraphicsWork(void);\nvoid UnionRoomChat_RunDisplaySubtasks(void);\nvoid UnionRoomChat_StartDisplaySubtask(u16 a0, u8 a1);\nu8 RunDisplaySubtask(u8 a0);\ns8 UnionRoomChat_ProcessInput(void);\n\n#endif //GUARD_UNION_ROOM_CHAT_DISPLAY_H\n"
  },
  {
    "path": "include/union_room_chat_objects.h",
    "content": "#ifndef GUARD_UNION_ROOM_CHAT_OBJECTS_H\n#define GUARD_UNION_ROOM_CHAT_OBJECTS_H\n\nbool32 UnionRoomChat_TryAllocSpriteWork(void);\nvoid UnionRoomChat_FreeSpriteWork(void);\nvoid UnionRoomChat_CreateSelectorCursorObj(void);\nvoid UnionRoomChat_ToggleSelectorCursorObjVisibility(bool32 invisible);\nvoid UnionRoomChat_MoveSelectorCursorObj(void);\nvoid UnionRoomChat_UpdateObjPalCycle(u32 idx);\nvoid UnionRoomChat_SetSelectorCursorClosedImage(void);\nbool32 UnionRoomChat_AnimateSelectorCursorReopen(void);\nvoid UnionRoomChat_SpawnTextEntryPointerSprites(void);\nvoid CreatePageSwitchUISprites(void);\nvoid UpdateVisibleUnionRoomChatIcon(void);\n\n#endif //GUARD_UNION_ROOM_CHAT_OBJECTS_H\n"
  },
  {
    "path": "include/union_room_message.h",
    "content": "#ifndef GUARD_UNION_ROOM_MESSAGE_H\n#define GUARD_UNION_ROOM_MESSAGE_H\n\n#include \"global.h\"\n\nextern const u8 gText_UR_EmptyString[];\nextern const u8 gText_UR_Colon[];\nextern const u8 gText_UR_ID[];\nextern const u8 gText_UR_PleaseStartOver[];\nextern const u8 gText_UR_WirelessSearchCanceled[];\nextern const u8 gText_UR_AwaitingCommunication[];\nextern const u8 gText_UR_AwaitingLinkPressStart[];\nextern const u8 *const gTexts_UR_PlayersNeededOrMode[][5];\nextern const u8 gText_UR_BButtonCancel[];\nextern const u8 gText_UR_PlayerContactedYouForXAccept[];\nextern const u8 gText_UR_PlayerContactedYouShareX[];\nextern const u8 gText_UR_PlayerContactedYouAddToMembers[];\nextern const u8 gText_UR_AreTheseMembersOK[];\nextern const u8 gText_UR_CancelModeWithTheseMembers[];\nextern const u8 gText_UR_AnOKWasSentToPlayer[];\nextern const u8 *const gTexts_UR_CantTransmitToTrainer[];\nextern const u8 gText_UR_ModeWithTheseMembersWillBeCanceled[];\nextern const u8 *const gTexts_UR_PlayerUnavailable[];\nextern const u8 gText_UR_PlayerSentBackOK[];\nextern const u8 gText_UR_PlayerOKdRegistration[];\nextern const u8 gText_UR_AwaitingOtherMembers[];\nextern const u8 gText_UR_QuitBeingMember[];\nextern const u8 *const gTexts_UR_PlayerDisconnected[];\nextern const u8 gText_UR_WirelessLinkEstablished[];\nextern const u8 gText_UR_WirelessLinkDropped[];\nextern const u8 gText_UR_LinkWithFriendDropped[];\nextern const u8 *const gTexts_UR_LinkDropped[];\nextern const u8 gText_UR_AwaitingPlayersResponseAboutTrade[];\nextern const u8 *const gTexts_UR_CommunicatingWait[];\nextern const u8 *const gTexts_UR_HiDoSomething[][GENDER_COUNT];\nextern const u8 *const gTexts_UR_PlayerContactedYou[];\nextern const u8 *const gTexts_UR_AwaitingResponse[];\nextern const u8 gText_UR_ShowTrainerCard[];\nextern const u8 gText_UR_BattleChallenge[];\nextern const u8 gText_UR_ChatInvitation[];\nextern const u8 gText_UR_OfferToTradeMon[];\nextern const u8 gText_UR_OfferToTradeEgg[];\nextern const u8 gText_UR_ChatDropped[];\nextern const u8 gText_UR_OfferDeclined1[];\nextern const u8 gText_UR_OfferDeclined2[];\nextern const u8 gText_UR_ChatEnded[];\nextern const u8 *const gTexts_UR_JoinChat[][GENDER_COUNT];\nextern const u8 gText_UR_TrainerAppearsBusy[];\nextern const u8 *const gTexts_UR_WaitOrShowCard[GENDER_COUNT][4];\nextern const u8 *const gTexts_UR_StartActivity[][GENDER_COUNT][3];\nextern const u8 *const gTexts_UR_BattleDeclined[GENDER_COUNT];\nextern const u8 *const gTexts_UR_ShowTrainerCardDeclined[GENDER_COUNT];\nextern const u8 *const gTexts_UR_IfYouWantToDoSomething[GENDER_COUNT];\nextern const u8 gText_UR_TrainerBattleBusy[];\nextern const u8 gText_UR_NeedTwoMonsOfLevel30OrLower1[];\nextern const u8 gText_UR_NeedTwoMonsOfLevel30OrLower2[];\nextern const u8 *const gTexts_UR_DeclineChat[GENDER_COUNT];\nextern const u8 *const gTexts_UR_ChatDeclined[GENDER_COUNT];\nextern const u8 *const gTexts_UR_BattleReaction[GENDER_COUNT][4];\nextern const u8 *const gTexts_UR_ChatReaction[GENDER_COUNT][4];\nextern const u8 *const gTexts_UR_TrainerCardReaction[GENDER_COUNT][2];\nextern const u8 *const gTexts_UR_TradeReaction[GENDER_COUNT][4];\nextern const u8 gText_UR_XCheckedTradingBoard[];\nextern const u8 gText_UR_RegisterMonAtTradingBoard[];\nextern const u8 gText_UR_TradingBoardInfo[];\nextern const u8 gText_UR_ChooseRequestedMonType[];\nextern const u8 gText_UR_WhichMonWillYouOffer[];\nextern const u8 gText_UR_RegistrationCanceled[];\nextern const u8 gText_UR_RegistraionCompleted[];\nextern const u8 gText_UR_TradeCanceled[];\nextern const u8 gText_UR_CancelRegistrationOfMon[];\nextern const u8 gText_UR_CancelRegistrationOfEgg[];\nextern const u8 gText_UR_RegistrationCanceled2[];\nextern const u8 gText_UR_AskTrainerToMakeTrade[];\nextern const u8 gText_UR_DontHaveTypeTrainerWants[];\nextern const u8 gText_UR_DontHaveEggTrainerWants[];\nextern const u8 gText_UR_TradeOfferRejected[];\nextern const u8 gText_UR_EggTrade[];\nextern const u8 gText_UR_ChooseJoinCancel[];\nextern const u8 gText_UR_ChooseTrainer[];\nextern const u8 gText_UR_SearchingForWirelessSystemWait[];\nextern const u8 *const gTexts_UR_ChooseTrainer[];\nextern const u8 gText_UR_AwaitingPlayersResponse[];\nextern const u8 gText_UR_PlayerHasBeenAskedToRegisterYouPleaseWait[];\nextern const u8 gText_UR_AwaitingResponseFromWirelessSystem[];\nextern const u8 *const gTexts_UR_NoWonderShared[];\nextern const u8 gText_UR_Battle[];\nextern const u8 gText_UR_Chat2[];\nextern const u8 gText_UR_Greetings[];\nextern const u8 gText_UR_Exit[];\nextern const u8 gText_UR_Exit2[];\nextern const u8 gText_UR_Info[];\nextern const u8 gText_UR_NameWantedOfferLv[];\nextern const u8 gText_UR_SingleBattle[];\nextern const u8 gText_UR_DoubleBattle[];\nextern const u8 gText_UR_MultiBattle[];\nextern const u8 gText_UR_PokemonTrades[];\nextern const u8 gText_UR_Chat[];\nextern const u8 gText_UR_WonderCards[];\nextern const u8 gText_UR_WonderNews[];\nextern const u8 gText_UR_Cards[];\nextern const u8 gText_UR_PokemonJump[];\nextern const u8 gText_UR_BerryCrush[];\nextern const u8 gText_UR_BerryPicking[];\nextern const u8 gText_UR_Search[];\nextern const u8 gText_UR_SpinTrade[];\nextern const u8 gText_UR_ItemTrade[];\nextern const u8 *const gTexts_UR_CardColor[];\nextern const u8 gText_UR_TrainerCardInfoPage1[];\nextern const u8 gText_UR_TrainerCardInfoPage2[];\nextern const u8 *const gTexts_UR_GladToMeetYou[GENDER_COUNT];\nextern const u8 gText_UR_FinishedCheckingPlayersTrainerCard[];\n\n#endif //GUARD_UNION_ROOM_MESSAGE_H\n"
  },
  {
    "path": "include/union_room_player_avatar.h",
    "content": "#ifndef GUARD_UNION_ROOM_PLAYER_AVATAR_H\n#define GUARD_UNION_ROOM_PLAYER_AVATAR_H\n\n#include \"union_room.h\"\n\nu8 InitUnionRoomPlayerObjects(struct UnionRoomObject * players);\nvoid DestroyUnionRoomPlayerObjects(void);\nvoid CreateUnionRoomPlayerSprites(u8 *spriteIds, s32 leaderId);\nvoid DestroyUnionRoomPlayerSprites(u8 *spriteIds);\nvoid MakeGroupAssemblyAreasPassable(void);\nvoid ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom);\nvoid HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom);\nbool32 TryInteractWithUnionRoomMember(struct RfuPlayerList *list, s16 *memberIdPtr, s16 *leaderIdPtr, u8 *spriteIds);\nvoid UpdateUnionRoomMemberFacing(u32 memberId, u32 leaderId, struct RfuPlayerList *list);\n\n#endif //GUARD_UNION_ROOM_PLAYER_AVATAR_H\n"
  },
  {
    "path": "include/util.h",
    "content": "#ifndef GUARD_UTIL_H\n#define GUARD_UTIL_H\n\n#include \"global.h\"\n\n#include \"sprite.h\"\n\nextern const u8 gMiscBlank_Gfx[]; // unused in Emerald\nextern const u32 gBitTable[];\n\nu8 CreateInvisibleSpriteWithCallback(void (*)(struct Sprite *));\nvoid StoreWordInTwoHalfwords(u16 *, unsigned);\nvoid LoadWordFromTwoHalfwords(u16 *, unsigned *);\nint CountTrailingZeroBits(u32 value);\nu16 CalcCRC16(const u8 *data, u32 length);\nu16 CalcCRC16WithTable(const u8 *data, u32 length);\nu32 CalcByteArraySum(const u8 *data, u32 length);\nvoid BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor);\nvoid DoBgAffineSet(struct BgAffineDstData * dest, u32 texX, u32 texY, s16 srcX, s16 srcY, s16 sx, s16 sy, u16 alpha);\n\n#endif // GUARD_UTIL_H\n"
  },
  {
    "path": "include/vs_seeker.h",
    "content": "#ifndef GUARD_VS_SEEKER_H\n#define GUARD_VS_SEEKER_H\n\n#include \"global.h\"\n\nvoid Task_VsSeeker_0(u8 taskId);\nvoid ClearRematchStateByTrainerId(void);\nvoid ClearRematchStateOfLastTalked(void);\nint GetRematchTrainerId(u16 trainerId);\nbool8 UpdateVsSeekerStepCounter(void);\nvoid MapResetTrainerRematches(u16 mapGroup, u16 mapNum);\n\n#endif //GUARD_VS_SEEKER_H\n"
  },
  {
    "path": "include/wild_encounter.h",
    "content": "#ifndef GUARD_WILD_ENCOUNTER_H\n#define GUARD_WILD_ENCOUNTER_H\n\n#include \"global.h\"\n\n#define LAND_WILD_COUNT     12\n#define WATER_WILD_COUNT    5\n#define ROCK_WILD_COUNT     5\n#define FISH_WILD_COUNT     10\n\n#define NUM_ALTERING_CAVE_TABLES 9\n\nstruct WildPokemon\n{\n    u8 minLevel;\n    u8 maxLevel;\n    u16 species;\n};\n\nstruct WildPokemonInfo\n{\n    u8 encounterRate;\n    const struct WildPokemon *wildPokemon;\n};\n\nstruct WildPokemonHeader\n{\n    u8 mapGroup;\n    u8 mapNum;\n    const struct WildPokemonInfo *landMonsInfo_FR;\n    const struct WildPokemonInfo *landMonsInfo_LG;\n    const struct WildPokemonInfo *waterMonsInfo_FR;\n    const struct WildPokemonInfo *waterMonsInfo_LG;\n    const struct WildPokemonInfo *rockSmashMonsInfo_FR;\n    const struct WildPokemonInfo *rockSmashMonsInfo_LG;\n    const struct WildPokemonInfo *fishingMonsInfo_FR;\n    const struct WildPokemonInfo *fishingMonsInfo_LG;\n};\n\nextern const struct WildPokemonHeader gWildMonHeaders[];\n\nvoid DisableWildEncounters(bool8 disabled);\nbool8 StandardWildEncounter(u32 currMetatileAttrs, u16 previousMetaTileBehavior);\nbool8 SweetScentWildEncounter(void);\nbool8 DoesCurrentMapHaveFishingMons(void);\nvoid FishingWildEncounter(u8 rod);\nu16 GetLocalWildMon(bool8 *isWaterMon);\nu16 GetLocalWaterMon(void);\nbool8 UpdateRepelCounter(void);\nvoid DisableWildEncounters(bool8 state);\nu8 GetUnownLetterByPersonalityLoByte(u32 personality);\nbool8 SweetScentWildEncounter(void);\nvoid SeedWildEncounterRng(u16 randVal);\nvoid ResetEncounterRateModifiers(void);\nbool8 TryStandardWildEncounter(u32 currMetatileAttrs);\n\n#endif // GUARD_WILD_ENCOUNTER_H\n"
  },
  {
    "path": "include/wild_pokemon_area.h",
    "content": "#ifndef GUARD_WILD_POKEMON_AREA_H\n#define GUARD_WILD_POKEMON_AREA_H\n\ns32 GetSpeciesPokedexAreaMarkers(u16 species, struct Subsprite * subsprites);\n\n#endif //GUARD_WILD_POKEMON_AREA_H\n"
  },
  {
    "path": "include/window.h",
    "content": "#ifndef GUARD_WINDOW_H\n#define GUARD_WINDOW_H\n\n#include \"global.h\"\n\n#define PIXEL_FILL(num) ((num) | ((num) << 4))\n\nenum\n{\n    WINDOW_BG,\n    WINDOW_TILEMAP_LEFT,\n    WINDOW_TILEMAP_TOP,\n    WINDOW_WIDTH,\n    WINDOW_HEIGHT,\n    WINDOW_PALETTE_NUM,\n    WINDOW_BASE_BLOCK,\n    WINDOW_TILE_DATA\n};\n\n// Mode for CopyWindowToVram, CopyWindowRectToVram and CopyWindowToVram8Bit\nenum {\n    COPYWIN_NONE,\n    COPYWIN_MAP,\n    COPYWIN_GFX,\n    COPYWIN_FULL,\n};\n\nstruct WindowTemplate\n{\n    u8 bg;\n    u8 tilemapLeft;\n    u8 tilemapTop;\n    u8 width;\n    u8 height;\n    u8 paletteNum;\n    u16 baseBlock;\n};\n\n#define WINDOWS_MAX 32\n\n#define DUMMY_WIN_TEMPLATE          \\\n{                                   \\\n    0xFF,                           \\\n    0,                              \\\n    0,                              \\\n    0,                              \\\n    0,                              \\\n    0,                              \\\n    0,                              \\\n}\n\n#define WINDOW_NONE 0xFF\n\nstruct Window\n{\n    struct WindowTemplate window;\n    u8 *tileData;\n};\n\ntypedef void (*WindowFunc)(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);\n\nbool16 InitWindows(const struct WindowTemplate *templates);\nu16 AddWindow(const struct WindowTemplate *template);\nint AddWindowWithoutTileMap(const struct WindowTemplate *template);\nvoid RemoveWindow(u8 windowId);\nvoid FreeAllWindowBuffers(void);\n\nvoid CopyWindowToVram(u8 windowId, u8 mode);\nvoid CopyWindowToVram8Bit(u8 windowId, u8 mode);\n\nvoid PutWindowTilemap(u8 windowId);\nvoid PutWindowRectTilemapOverridePalette(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 palette);\nvoid ClearWindowTilemap(u8 windowId);\nvoid PutWindowRectTilemap(u8 windowId, u8 x, u8 y, u8 width, u8 height);\nvoid BlitBitmapToWindow(u8 windowId, const u8 *pixels, u16 x, u16 y, u16 width, u16 height);\nvoid BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight);\nvoid FillWindowPixelRect(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height);\nvoid CopyToWindowPixelBuffer(u8 windowId, const void *src, u16 size, u16 tileOffset);\nvoid FillWindowPixelBuffer(u8 windowId, u8 fillValue);\nvoid ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue);\nvoid CallWindowFunction(u8 windowId, WindowFunc func);\nbool8 SetWindowAttribute(u8 windowId, u8 attributeId, u32 value);\nu32 GetWindowAttribute(u8 windowId, u8 attributeId);\nu16 AddWindow8Bit(const struct WindowTemplate *template);\nvoid FillWindowPixelBuffer8Bit(u8 windowId, u8 fillValue);\nvoid FillWindowPixelRect8Bit(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height);\nvoid BlitBitmapRectToWindow4BitTo8Bit(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 paletteNum);\n\nextern void *gWindowBgTilemapBuffers[];\nextern struct Window gWindows[];\n\n#endif // GUARD_WINDOW_H\n"
  },
  {
    "path": "include/wonder_news.h",
    "content": "#ifndef GUARD_WONDER_NEWS_H\n#define GUARD_WONDER_NEWS_H\n\n#include \"global.h\"\n\nenum {\n    WONDER_NEWS_NONE,\n    WONDER_NEWS_RECV_FRIEND,\n    WONDER_NEWS_RECV_WIRELESS,\n    WONDER_NEWS_SENT,\n};\n\nvoid WonderNews_SetReward(u32 newsType);\nvoid WonderNews_Reset(void);\nvoid WonderNews_IncrementStepCounter(void);\n\n#endif //GUARD_WONDER_NEWS_H\n"
  },
  {
    "path": "json_data_rules.mk",
    "content": "# JSON files are run through jsonproc, which is a tool that converts JSON data to an output file\n# based on an Inja template. https://github.com/pantor/inja\n\nAUTO_GEN_TARGETS += $(DATA_C_SUBDIR)/items.h\n\n$(DATA_C_SUBDIR)/items.h: $(DATA_C_SUBDIR)/items.json $(DATA_C_SUBDIR)/items.json.txt\n\t$(JSONPROC) $^ $@\n\n$(C_BUILDDIR)/item.o: c_dep += $(DATA_C_SUBDIR)/items.h\n\nAUTO_GEN_TARGETS += $(DATA_C_SUBDIR)/region_map/region_map_entry_strings.h\n$(DATA_C_SUBDIR)/region_map/region_map_entry_strings.h: $(DATA_C_SUBDIR)/region_map/region_map_sections.json $(DATA_C_SUBDIR)/region_map/region_map_sections.strings.json.txt\n\t$(JSONPROC) $^ $@\n\n$(C_BUILDDIR)/region_map.o: c_dep += $(DATA_C_SUBDIR)/region_map/region_map_entry_strings.h\n\nAUTO_GEN_TARGETS += $(DATA_C_SUBDIR)/region_map/region_map_entries.h\n$(DATA_C_SUBDIR)/region_map/region_map_entries.h: $(DATA_C_SUBDIR)/region_map/region_map_sections.json $(DATA_C_SUBDIR)/region_map/region_map_sections.entries.json.txt\n\t$(JSONPROC) $^ $@\n\n$(C_BUILDDIR)/region_map.o: c_dep += $(DATA_C_SUBDIR)/region_map/region_map_entries.h\n"
  },
  {
    "path": "ld_script.ld",
    "content": "gNumMusicPlayers = 4;\ngMaxLines = 0;\n\nSECTIONS {\n    . = 0x2000000;\n\n    ewram (NOLOAD) :\n    ALIGN(4)\n    {\n        gHeap = .;\n\n        . = 0x1C000;\n\n        INCLUDE \"sym_ewram.ld\"\n        src/*.o(ewram_data);\n\n        *libc.a:impure.o(.data);\n        *libc.a:locale.o(.data);\n        *libc.a:mallocr.o(.data);\n        . = 0x40000;\n    }\n\n    . = 0x3000000;\n\n    iwram (NOLOAD) :\n    ALIGN(4)\n    {\n        /* .bss starts at 0x3000000 */\n        INCLUDE \"sym_bss.ld\"\n        src/*.o(.bss);\n        data/*.o(.bss);\n\n        /* .bss.code starts at 0x30028E0 */\n        src/m4a.o(.bss.code);\n\n        /* COMMON starts at 0x30030E0 */\n        INCLUDE \"sym_common.ld\"\n\n        *libc.a:sbrkr.o(COMMON);\n        end = .;\n\n        . = 0x8000;\n    }\n\n    . = 0x8000000;\n\n    .text :\n    ALIGN(4)\n    {\n        src/rom_header.o(.text);\n        src/rom_header_gf.o(.text*);\n        src/crt0.o(.text);\n        src/main.o(.text);\n        src/gpu_regs.o(.text);\n        src/dma3_manager.o(.text);\n        src/bg.o(.text);\n        src/malloc.o(.text);\n        src/text_printer.o(.text);\n        src/window.o(.text);\n        src/blit.o(.text);\n        src/window_8bpp.o(.text);\n        src/text.o(.text);\n        src/sprite.o(.text);\n        src/string_util.o(.text);\n        src/link.o(.text);\n        src/multiboot.o(.text);\n        src/main_menu.o(.text);\n        src/battle_controllers.o(.text);\n        src/decompress.o(.text);\n        src/battle_bg.o(.text);\n        src/battle_main.o(.text);\n        src/battle_util.o(.text);\n        src/battle_script_commands.o(.text);\n        src/battle_util2.o(.text);\n        src/battle_controller_player.o(.text);\n        src/battle_gfx_sfx_util.o(.text);\n        src/battle_controller_opponent.o(.text);\n        src/battle_ai_switch_items.o(.text);\n        src/battle_controller_link_opponent.o(.text);\n        src/pokemon.o(.text);\n        src/trig.o(.text);\n        src/random.o(.text);\n        src/util.o(.text);\n        src/blend_palette.o(.text);\n        src/daycare.o(.text);\n        src/battle_interface.o(.text);\n        src/battle_anim_smokescreen.o(.text);\n        src/pokeball.o(.text);\n        src/load_save.o(.text);\n        src/trade.o(.text);\n        src/trade_scene.o(.text);\n        src/play_time.o(.text);\n        src/new_game.o(.text);\n        src/overworld.o(.text);\n        src/fieldmap.o(.text);\n        src/metatile_behavior.o(.text);\n        src/field_camera.o(.text);\n        src/field_door.o(.text);\n        src/field_player_avatar.o(.text);\n        src/event_object_movement.o(.text);\n        src/field_message_box.o(.text);\n        src/event_object_lock.o(.text);\n        src/text_window_graphics.o(.text);\n        src/script.o(.text);\n        src/scrcmd.o(.text);\n        src/field_control_avatar.o(.text);\n        src/event_data.o(.text);\n        src/coord_event_weather.o(.text);\n        src/field_tasks.o(.text);\n        src/start_menu.o(.text);\n        src/tileset_anims.o(.text);\n        src/palette.o(.text);\n        src/sound.o(.text);\n        src/battle_anim.o(.text);\n        src/battle_anim_mons.o(.text);\n        src/task.o(.text);\n        src/reshow_battle_screen.o(.text);\n        src/battle_anim_status_effects.o(.text);\n        src/title_screen.o(.text);\n        src/reset_save_heap.o(.text);\n        src/field_weather.o(.text);\n        src/field_weather_util.o(.text);\n        src/field_weather_effects.o(.text);\n        src/field_fadetransition.o(.text);\n        src/field_screen_effect.o(.text);\n        src/battle_setup.o(.text);\n        src/cable_club.o(.text);\n        src/trainer_see.o(.text);\n        src/wild_encounter.o(.text);\n        src/field_effect.o(.text);\n        src/scanline_effect.o(.text);\n        src/option_menu.o(.text);\n        src/pokedex.o(.text);\n        src/trainer_card.o(.text);\n        src/pokemon_storage_system.o(.text);\n        src/pokemon_storage_system_menu.o(.text);\n        src/pokemon_storage_system_tasks.o(.text);\n        src/pokemon_storage_system_graphics.o(.text);\n        src/pokemon_storage_system_data.o(.text);\n        src/pokemon_storage_system_misc.o(.text);\n        src/pokemon_icon.o(.text);\n        src/script_movement.o(.text);\n        src/fldeff_cut.o(.text);\n        src/mail_data.o(.text);\n        src/map_name_popup.o(.text);\n        src/item_menu_icons.o(.text);\n        src/battle_anim_mon_movement.o(.text);\n        src/item.o(.text);\n        src/shop.o(.text);\n        src/special_field_anim.o(.text);\n        src/berry.o(.text);\n        src/script_menu.o(.text);\n        src/naming_screen.o(.text);\n        src/money.o(.text);\n        src/script_pokemon_util.o(.text);\n        src/field_poison.o(.text);\n        src/pokemon_size_record.o(.text);\n        src/pc_screen_effect.o(.text);\n        src/fldeff_poison.o(.text);\n        src/fldeff_berrytree.o(.text);\n        src/field_special_scene.o(.text);\n        src/safari_zone.o(.text);\n        src/item_use.o(.text);\n        src/battle_anim_effects_1.o(.text);\n        src/battle_anim_effects_2.o(.text);\n        src/battle_anim_water.o(.text);\n        src/battle_anim_fire.o(.text);\n        src/battle_anim_electric.o(.text);\n        src/battle_anim_ice.o(.text);\n        src/battle_anim_fight.o(.text);\n        src/battle_anim_poison.o(.text);\n        src/battle_anim_flying.o(.text);\n        src/battle_anim_psychic.o(.text);\n        src/battle_anim_bug.o(.text);\n        src/battle_anim_rock.o(.text);\n        src/battle_anim_ghost.o(.text);\n        src/battle_anim_dragon.o(.text);\n        src/battle_anim_dark.o(.text);\n        src/battle_anim_ground.o(.text);\n        src/battle_anim_normal.o(.text);\n        src/battle_anim_utility_funcs.o(.text);\n        src/battle_intro.o(.text);\n        src/bike.o(.text);\n        src/easy_chat.o(.text);\n        src/mon_markings.o(.text);\n        src/mail.o(.text);\n        src/menu_helpers.o(.text);\n        src/party_menu_specials.o(.text);\n        src/heal_location.o(.text);\n        src/region_map.o(.text);\n        src/image_processing_effects.o(.text);\n        src/battle_ai_script_commands.o(.text);\n        src/fldeff_rocksmash.o(.text);\n        src/fldeff_dig.o(.text);\n        src/fldeff_flash.o(.text);\n        src/post_battle_event_funcs.o(.text);\n        src/prof_pc.o(.text);\n        src/hof_pc.o(.text);\n        src/field_specials.o(.text);\n        src/battle_records.o(.text);\n        src/evolution_scene.o(.text);\n        src/coins.o(.text);\n        src/fldeff_strength.o(.text);\n        src/battle_transition.o(.text);\n        src/battle_controller_link_partner.o(.text);\n        src/battle_message.o(.text);\n        src/math_util.o(.text);\n        src/palette_util.o(.text);\n        src/cable_car_util.o(.text);\n        src/save.o(.text);\n        src/mystery_event_script.o(.text);\n        src/field_effect_helpers.o(.text);\n        src/battle_anim_sound_tasks.o(.text);\n        src/battle_controller_safari.o(.text);\n        src/fldeff_sweetscent.o(.text);\n        src/battle_anim_effects_3.o(.text);\n        src/learn_move.o(.text);\n        src/fldeff_softboiled.o(.text);\n        src/battle_tower.o(.text);\n        src/battle_controller_oak_old_man.o(.text);\n        src/player_pc.o(.text);\n        src/intro.o(.text);\n        src/battle_anim_special.o(.text);\n        src/hall_of_fame.o(.text);\n        src/credits.o(.text);\n        src/diploma.o(.text);\n        src/save_failed_screen.o(.text);\n        src/clear_save_data_screen.o(.text);\n        src/evolution_graphics.o(.text);\n        src/fldeff_teleport.o(.text);\n        src/new_menu_helpers.o(.text);\n        src/tilemap_util.o(.text);\n        src/save_menu_util.o(.text);\n        src/map_preview_screen.o(.text);\n        src/link_rfu_2.o(.text);\n        src/link_rfu_3.o(.text);\n        src/AgbRfu_LinkManager.o(.text);\n        src/easy_chat_2.o(.text);\n        src/easy_chat_3.o(.text);\n        src/pokedex_screen.o(.text);\n        src/list_menu.o(.text);\n        src/item_menu.o(.text);\n        src/save_location.o(.text);\n        src/bag.o(.text);\n        src/trainer_pokemon_sprites.o(.text);\n        src/vs_seeker.o(.text);\n        src/item_pc.o(.text);\n        src/mailbox_pc.o(.text);\n        src/menu.o(.text);\n        src/quest_log.o(.text);\n        src/help_message.o(.text);\n        src/trainer_fan_club.o(.text);\n        src/quest_log_events.o(.text);\n        src/union_room.o(.text);\n        src/union_room_player_avatar.o(.text);\n        src/union_room_battle.o(.text);\n        src/pokemon_special_anim.o(.text);\n        src/pokemon_special_anim_scene.o(.text);\n        src/party_menu.o(.text);\n        src/union_room_chat.o(.text);\n        src/union_room_chat_display.o(.text);\n        src/union_room_chat_objects.o(.text);\n        src/help_system.o(.text);\n        src/quest_log_battle.o(.text);\n        src/fame_checker.o(.text);\n        src/menu2.o(.text);\n        src/oak_speech.o(.text);\n        src/tm_case.o(.text);\n        src/menu_indicators.o(.text);\n        src/pokedex_area_markers.o(.text);\n        src/pokemon_summary_screen.o(.text);\n        src/help_system_util.o(.text);\n        src/wild_pokemon_area.o(.text);\n        src/dynamic_placeholder_text_util.o(.text);\n        src/berry_pouch.o(.text);\n        src/itemfinder.o(.text);\n        src/buy_menu_helpers.o(.text);\n        src/slot_machine.o(.text);\n        src/roamer.o(.text);\n        src/mystery_gift_menu.o(.text);\n        src/ereader_screen.o(.text);\n        src/mystery_gift.o(.text);\n        src/mystery_gift_link.o(.text);\n        src/mystery_gift_client.o(.text);\n        src/mystery_gift_server.o(.text);\n        src/mystery_gift_show_card.o(.text);\n        src/mystery_gift_show_news.o(.text);\n        src/wonder_news.o(.text);\n        src/seagallop.o(.text);\n        src/pokemon_jump.o(.text);\n        src/berry_crush.o(.text);\n        src/wireless_communication_status_screen.o(.text);\n        src/braille_text.o(.text);\n        src/text_window.o(.text);\n        src/quest_log_player.o(.text);\n        src/dodrio_berry_picking.o(.text);\n        src/battle_controller_pokedude.o(.text);\n        src/quest_log_objects.o(.text);\n        src/dodrio_berry_picking_comm.o(.text);\n        src/teachy_tv.o(.text);\n        src/ereader_helpers.o(.text);\n        src/digit_obj_util.o(.text);\n        src/ss_anne.o(.text);\n        src/cereader_tool.o(.text);\n        src/renewable_hidden_items.o(.text);\n        src/trainer_tower.o(.text);\n        src/berry_powder.o(.text);\n        src/minigame_countdown.o(.text);\n        src/berry_fix_program.o(.text);\n        src/cable_car.o(.text);\n    } =0\n\n    script_data :\n    ALIGN(4)\n    {\n        data/event_scripts.o(script_data);\n        data/battle_anim_scripts.o(script_data);\n        data/battle_scripts_1.o(script_data);\n        data/field_effect_scripts.o(script_data);\n        data/battle_scripts_2.o(script_data);\n        data/battle_ai_scripts.o(script_data);\n        data/mystery_event_script_cmd_table.o(script_data);\n    } =0\n\n    lib_text :\n    ALIGN(4)\n    {\n        src/libgcnmultiboot.o(.text);\n        src/m4a_1.o(.text);\n        src/m4a.o(.text);\n        src/agb_flash.o(.text);\n        src/agb_flash_1m.o(.text);\n        src/agb_flash_mx.o(.text);\n        src/agb_flash_le.o(.text);\n        src/librfu_stwi.o(.text);\n        src/librfu_intr.o(.text);\n        src/librfu_rfu.o(.text);\n        src/librfu_sio32id.o(.text);\n        src/isagbprn.o(.text);\n        src/libagbsyscall.o(.text);\n        *libgcc.a:_call_via_rX.o(.text);\n        *libgcc.a:_divdi3.o(.text);\n        *libgcc.a:_divsi3.o(.text);\n        *libgcc.a:_dvmd_tls.o(.text);\n        *libgcc.a:_fixunsdfsi.o(.text);\n        *libgcc.a:_modsi3.o(.text);\n        *libgcc.a:_muldi3.o(.text);\n        *libgcc.a:_udivdi3.o(.text);\n        *libgcc.a:_udivsi3.o(.text);\n        *libgcc.a:_umodsi3.o(.text);\n        *libgcc.a:dp-bit.o(.text);\n        *libgcc.a:fp-bit.o(.text);\n        *libgcc.a:_lshrdi3.o(.text);\n        *libgcc.a:_negdi2.o(.text);\n        *libc.a:memcpy.o(.text);\n        *libc.a:memset.o(.text);\n        *libc.a:strcmp.o(.text);\n        *libc.a:strcpy.o(.text);\n        *libc.a:impure.o(.text);\n        *libc.a:vsprintf.o(.text);\n        *libc.a:vfprintf.o(.text);\n        *libc.a:wsetup.o(.text);\n        *libc.a:dtoa.o(.text);\n        *libc.a:fflush.o(.text);\n        *libc.a:findfp.o(.text);\n        *libc.a:freer.o(.text);\n        *libc.a:mtrim.o(.text);\n        *libc.a:fvwrite.o(.text);\n        *libc.a:fwalk.o(.text);\n        *libc.a:locale.o(.text);\n        *libc.a:makebuf.o(.text);\n        *libc.a:mallocr.o(.text);\n        *libc.a:mbtowc_r.o(.text);\n        *libc.a:memchr.o(.text);\n        *libc.a:memmove.o(.text);\n        *libc.a:mlock.o(.text);\n        *libc.a:mprec.o(.text);\n        *libc.a:s_isinf.o(.text);\n        *libc.a:s_isnan.o(.text);\n        *libc.a:sbrkr.o(.text);\n        *libc.a:stdio.o(.text);\n        *libc.a:strlen.o(.text);\n        *libc.a:syscalls.o(.text);\n        *libc.a:writer.o(.text);\n        *libc.a:callocr.o(.text);\n        *libc.a:closer.o(.text);\n        *libc.a:errno.o(.text);\n        *libc.a:fstatr.o(.text);\n        *libc.a:libcfunc.o(.text);\n        *libc.a:lseekr.o(.text);\n        *libc.a:readr.o(.text);\n    } =0\n\n    .rodata :\n    SUBALIGN(4)\n    {\n        src/main.o(.rodata);\n        src/bg.o(.rodata);\n        src/malloc.o(.rodata);\n        src/malloc.o(.rodata.str1.4);\n        src/text_printer.o(.rodata);\n        src/window.o(.rodata);\n        src/text.o(.rodata);\n        src/sprite.o(.rodata);\n        src/bg_regs.o(.rodata);\n        src/string_util.o(.rodata);\n        src/link.o(.rodata);\n        src/main_menu.o(.rodata);\n        src/data.o(.rodata);\n        src/battle_bg.o(.rodata);\n        src/battle_main.o(.rodata);\n        src/battle_util.o(.rodata);\n        src/battle_script_commands.o(.rodata);\n        src/battle_controller_player.o(.rodata);\n        src/battle_anim_smokescreen.o(.rodata);\n        src/battle_controller_opponent.o(.rodata);\n        src/battle_controller_link_opponent.o(.rodata);\n        src/pokemon.o(.rodata);\n        src/trig.o(.rodata);\n        src/util.o(.rodata);\n        src/daycare.o(.rodata);\n        src/battle_gfx_sfx_util.o(.rodata);\n        src/battle_interface.o(.rodata);\n        src/pokeball.o(.rodata);\n        src/trade.o(.rodata);\n        src/trade_scene.o(.rodata);\n        src/overworld.o(.rodata);\n        src/tilesets.o(.rodata);\n        data/maps.o(.rodata);\n        src/fieldmap.o(.rodata);\n        src/metatile_behavior.o(.rodata);\n        src/field_door.o(.rodata);\n        src/field_player_avatar.o(.rodata);\n        src/event_object_movement.o(.rodata);\n        src/scrcmd.o(.rodata);\n        src/coord_event_weather.o(.rodata);\n        src/field_tasks.o(.rodata);\n        src/start_menu.o(.rodata);\n        src/tileset_anims.o(.rodata);\n        src/palette.o(.rodata);\n        src/sound.o(.rodata);\n        src/battle_anim.o(.rodata);\n        src/battle_anim_mons.o(.rodata);\n        data/map_events.o(.rodata);\n        src/battle_anim_status_effects.o(.rodata);\n        src/title_screen.o(.rodata);\n        src/field_weather.o(.rodata);\n        src/field_weather_util.o(.rodata);\n        src/field_weather_effects.o(.rodata);\n        src/field_screen_effect.o(.rodata);\n        src/battle_setup.o(.rodata);\n        src/cable_club.o(.rodata);\n        src/trainer_see.o(.rodata);\n        src/wild_encounter.o(.rodata);\n        src/field_effect.o(.rodata);\n        src/option_menu.o(.rodata);\n        src/trainer_card.o(.rodata);\n        src/pokemon_storage_system_menu.o(.rodata);\n        src/pokemon_storage_system_tasks.o(.rodata);\n        src/pokemon_storage_system_graphics.o(.rodata);\n        src/pokemon_storage_system_data.o(.rodata);\n        src/pokemon_storage_system_misc.o(.rodata);\n        src/pokemon_icon.o(.rodata);\n        src/fldeff_cut.o(.rodata);\n        src/map_name_popup.o(.rodata);\n        src/item_menu_icons.o(.rodata);\n        src/battle_anim_mon_movement.o(.rodata);\n        src/item.o(.rodata);\n        src/shop.o(.rodata);\n        src/special_field_anim.o(.rodata);\n        src/berry.o(.rodata);\n        src/script_menu.o(.rodata);\n        src/naming_screen.o(.rodata);\n        src/pokemon_size_record.o(.rodata);\n        src/item_use.o(.rodata);\n        src/battle_anim_effects_1.o(.rodata);\n        src/battle_anim_effects_2.o(.rodata);\n        src/battle_anim_water.o(.rodata);\n        src/battle_anim_fire.o(.rodata);\n        src/battle_anim_electric.o(.rodata);\n        src/battle_anim_ice.o(.rodata);\n        src/battle_anim_fight.o(.rodata);\n        src/battle_anim_poison.o(.rodata);\n        src/battle_anim_flying.o(.rodata);\n        src/battle_anim_psychic.o(.rodata);\n        src/battle_anim_bug.o(.rodata);\n        src/battle_anim_rock.o(.rodata);\n        src/battle_anim_ghost.o(.rodata);\n        src/battle_anim_dragon.o(.rodata);\n        src/battle_anim_dark.o(.rodata);\n        src/battle_anim_ground.o(.rodata);\n        src/battle_anim_normal.o(.rodata);\n        src/battle_anim_utility_funcs.o(.rodata);\n        src/battle_intro.o(.rodata);\n        src/bike.o(.rodata);\n        src/easy_chat.o(.rodata);\n        src/mon_markings.o(.rodata);\n        src/mail.o(.rodata);\n        src/heal_location.o(.rodata);\n        src/region_map.o(.rodata);\n        src/image_processing_effects.o(.rodata);\n        src/battle_ai_script_commands.o(.rodata);\n        src/fldeff_flash.o(.rodata);\n        src/field_specials.o(.rodata);\n        src/battle_records.o(.rodata);\n        src/evolution_scene.o(.rodata);\n        src/battle_transition.o(.rodata);\n        src/battle_controller_link_partner.o(.rodata);\n        src/battle_message.o(.rodata);\n        src/save.o(.rodata);\n        src/field_effect_helpers.o(.rodata);\n        src/battle_controller_safari.o(.rodata);\n        src/battle_anim_effects_3.o(.rodata);\n        src/learn_move.o(.rodata);\n        src/battle_tower.o(.rodata);\n        src/battle_controller_oak_old_man.o(.rodata);\n        src/player_pc.o(.rodata);\n        src/intro.o(.rodata);\n        src/battle_anim_special.o(.rodata);\n        src/hall_of_fame.o(.rodata);\n        src/credits.o(.rodata);\n        src/diploma.o(.rodata);\n        src/strings.o(.rodata);\n        src/save_failed_screen.o(.rodata);\n        src/clear_save_data_screen.o(.rodata);\n        src/evolution_graphics.o(.rodata);\n        src/new_menu_helpers.o(.rodata);\n        src/tilemap_util.o(.rodata);\n        src/map_preview_screen.o(.rodata);\n        src/link_rfu_2.o(.rodata);\n        src/link_rfu_3.o(.rodata);\n        src/easy_chat_2.o(.rodata);\n        src/easy_chat_3.o(.rodata);\n        src/pokedex_screen.o(.rodata);\n        src/list_menu.o(.rodata);\n        src/item_menu.o(.rodata);\n        src/save_location.o(.rodata);\n        src/bag.o(.rodata);\n        src/trainer_pokemon_sprites.o(.rodata);\n        src/vs_seeker.o(.rodata);\n        src/item_pc.o(.rodata);\n        src/mailbox_pc.o(.rodata);\n        src/decoration.o(.rodata);\n        src/menu.o(.rodata);\n        src/quest_log.o(.rodata);\n        src/help_message.o(.rodata);\n        src/trainer_fan_club.o(.rodata);\n        src/quest_log_events.o(.rodata);\n        src/union_room.o(.rodata);\n        src/union_room_player_avatar.o(.rodata);\n        src/union_room_battle.o(.rodata);\n        src/union_room_message.o(.rodata);\n        src/pokemon_special_anim.o(.rodata);\n        src/pokemon_special_anim_scene.o(.rodata);\n        src/party_menu.o(.rodata);\n        src/union_room_chat.o(.rodata);\n        src/union_room_chat_display.o(.rodata);\n        src/union_room_chat_objects.o(.rodata);\n        src/help_system.o(.rodata);\n        src/fame_checker.o(.rodata);\n        src/menu2.o(.rodata);\n        src/oak_speech.o(.rodata);\n        src/tm_case.o(.rodata);\n        src/menu_indicators.o(.rodata);\n        src/pokedex_area_markers.o(.rodata);\n        src/pokemon_summary_screen.o(.rodata);\n        src/help_system_util.o(.rodata);\n        src/wild_pokemon_area.o(.rodata);\n        src/dynamic_placeholder_text_util.o(.rodata);\n        src/berry_pouch.o(.rodata);\n        src/itemfinder.o(.rodata);\n        src/buy_menu_helpers.o(.rodata);\n        src/slot_machine.o(.rodata);\n        src/roamer.o(.rodata);\n        src/mystery_gift_menu.o(.rodata);\n        src/ereader_screen.o(.rodata);\n        src/mystery_gift.o(.rodata);\n        src/mystery_gift_link.o(.rodata);\n        src/mystery_gift_client.o(.rodata);\n        src/mystery_gift_server.o(.rodata);\n        src/mystery_gift_show_card.o(.rodata);\n        src/mystery_gift_show_news.o(.rodata);\n        src/mystery_gift_scripts.o(.rodata);\n        src/wonder_news.o(.rodata);\n        src/wonder_news.o(.rodata.str1.4);\n        src/seagallop.o(.rodata);\n        src/pokemon_jump.o(.rodata);\n        src/berry_crush.o(.rodata);\n        src/wireless_communication_status_screen.o(.rodata);\n        src/braille_text.o(.rodata);\n        src/text_window_graphics.o(.rodata);\n        src/quest_log_player.o(.rodata);\n        src/dodrio_berry_picking.o(.rodata);\n        src/battle_controller_pokedude.o(.rodata);\n        src/teachy_tv.o(.rodata);\n        src/digit_obj_util.o(.rodata);\n        src/ss_anne.o(.rodata);\n        src/cereader_tool.o(.rodata);\n        src/renewable_hidden_items.o(.rodata);\n        src/trainer_tower.o(.rodata);\n        src/minigame_countdown.o(.rodata);\n        src/berry_fix_program.o(.rodata);\n        src/keyboard_text.o(.rodata);\n        src/trainer_tower_sets.o(.rodata);\n        src/move_descriptions.o(.rodata);\n        src/cable_car.o(.rodata);\n\n        /* These should not be moved to C files */\n        src/mystery_event_msg.o(.rodata);\n        data/mystery_event_msg.o(.rodata);\n        src/m4a_tables.o(.rodata);\n        data/sound_data.o(.rodata);\n    } =0\n\n    song_data :\n    ALIGN(4)\n    {\n        sound/songs/midi/mus_dummy.o(.rodata);\n        sound/songs/midi/se_use_item.o(.rodata);\n        sound/songs/midi/se_pc_login.o(.rodata);\n        sound/songs/midi/se_pc_off.o(.rodata);\n        sound/songs/midi/se_pc_on.o(.rodata);\n        sound/songs/midi/se_select.o(.rodata);\n        sound/songs/se_win_open.o(.rodata);\n        sound/songs/se_wall_hit.o(.rodata);\n        sound/songs/midi/se_door.o(.rodata);\n        sound/songs/midi/se_exit.o(.rodata);\n        sound/songs/midi/se_ledge.o(.rodata);\n        sound/songs/midi/se_bike_bell.o(.rodata);\n        sound/songs/midi/se_not_effective.o(.rodata);\n        sound/songs/midi/se_effective.o(.rodata);\n        sound/songs/midi/se_super_effective.o(.rodata);\n        sound/songs/midi/se_ball_open.o(.rodata);\n        sound/songs/midi/se_faint.o(.rodata);\n        sound/songs/midi/se_flee.o(.rodata);\n        sound/songs/midi/se_sliding_door.o(.rodata);\n        sound/songs/midi/se_ship.o(.rodata);\n        sound/songs/midi/se_bang.o(.rodata);\n        sound/songs/midi/se_pin.o(.rodata);\n        sound/songs/midi/se_boo.o(.rodata);\n        sound/songs/midi/se_ball.o(.rodata);\n        sound/songs/midi/se_contest_place.o(.rodata);\n        sound/songs/midi/se_a.o(.rodata);\n        sound/songs/midi/se_i.o(.rodata);\n        sound/songs/midi/se_u.o(.rodata);\n        sound/songs/midi/se_e.o(.rodata);\n        sound/songs/midi/se_o.o(.rodata);\n        sound/songs/midi/se_n.o(.rodata);\n        sound/songs/midi/se_success.o(.rodata);\n        sound/songs/midi/se_failure.o(.rodata);\n        sound/songs/midi/se_exp.o(.rodata);\n        sound/songs/midi/se_bike_hop.o(.rodata);\n        sound/songs/midi/se_switch.o(.rodata);\n        sound/songs/midi/se_click.o(.rodata);\n        sound/songs/midi/se_fu_zaku.o(.rodata);\n        sound/songs/midi/se_contest_condition_lose.o(.rodata);\n        sound/songs/midi/se_lavaridge_fall_warp.o(.rodata);\n        sound/songs/midi/se_ice_stairs.o(.rodata);\n        sound/songs/midi/se_ice_break.o(.rodata);\n        sound/songs/midi/se_ice_crack.o(.rodata);\n        sound/songs/midi/se_fall.o(.rodata);\n        sound/songs/midi/se_unlock.o(.rodata);\n        sound/songs/midi/se_warp_in.o(.rodata);\n        sound/songs/midi/se_warp_out.o(.rodata);\n        sound/songs/midi/se_repel.o(.rodata);\n        sound/songs/midi/se_rotating_gate.o(.rodata);\n        sound/songs/midi/se_truck_move.o(.rodata);\n        sound/songs/midi/se_truck_stop.o(.rodata);\n        sound/songs/midi/se_truck_unload.o(.rodata);\n        sound/songs/midi/se_truck_door.o(.rodata);\n        sound/songs/midi/se_berry_blender.o(.rodata);\n        sound/songs/midi/se_card.o(.rodata);\n        sound/songs/midi/se_save.o(.rodata);\n        sound/songs/midi/se_ball_bounce_1.o(.rodata);\n        sound/songs/midi/se_ball_bounce_2.o(.rodata);\n        sound/songs/midi/se_ball_bounce_3.o(.rodata);\n        sound/songs/midi/se_ball_bounce_4.o(.rodata);\n        sound/songs/midi/se_ball_trade.o(.rodata);\n        sound/songs/midi/se_ball_throw.o(.rodata);\n        sound/songs/midi/se_note_c.o(.rodata);\n        sound/songs/midi/se_note_d.o(.rodata);\n        sound/songs/midi/se_note_e.o(.rodata);\n        sound/songs/midi/se_note_f.o(.rodata);\n        sound/songs/midi/se_note_g.o(.rodata);\n        sound/songs/midi/se_note_a.o(.rodata);\n        sound/songs/midi/se_note_b.o(.rodata);\n        sound/songs/midi/se_note_c_high.o(.rodata);\n        sound/songs/midi/se_puddle.o(.rodata);\n        sound/songs/midi/se_bridge_walk.o(.rodata);\n        sound/songs/midi/se_itemfinder.o(.rodata);\n        sound/songs/midi/se_ding_dong.o(.rodata);\n        sound/songs/midi/se_balloon_red.o(.rodata);\n        sound/songs/midi/se_balloon_blue.o(.rodata);\n        sound/songs/midi/se_balloon_yellow.o(.rodata);\n        sound/songs/midi/se_breakable_door.o(.rodata);\n        sound/songs/midi/se_mud_ball.o(.rodata);\n        sound/songs/midi/se_field_poison.o(.rodata);\n        sound/songs/midi/se_escalator.o(.rodata);\n        sound/songs/midi/se_thunderstorm.o(.rodata);\n        sound/songs/midi/se_thunderstorm_stop.o(.rodata);\n        sound/songs/midi/se_downpour.o(.rodata);\n        sound/songs/midi/se_downpour_stop.o(.rodata);\n        sound/songs/midi/se_rain.o(.rodata);\n        sound/songs/midi/se_rain_stop.o(.rodata);\n        sound/songs/midi/se_thunder.o(.rodata);\n        sound/songs/midi/se_thunder2.o(.rodata);\n        sound/songs/midi/se_elevator.o(.rodata);\n        sound/songs/midi/se_low_health.o(.rodata);\n        sound/songs/midi/se_exp_max.o(.rodata);\n        sound/songs/midi/se_roulette_ball.o(.rodata);\n        sound/songs/midi/se_roulette_ball2.o(.rodata);\n        sound/songs/midi/se_taillow_wing_flap.o(.rodata);\n        sound/songs/midi/se_shop.o(.rodata);\n        sound/songs/midi/se_contest_heart.o(.rodata);\n        sound/songs/midi/se_contest_curtain_rise.o(.rodata);\n        sound/songs/midi/se_contest_curtain_fall.o(.rodata);\n        sound/songs/midi/se_contest_icon_change.o(.rodata);\n        sound/songs/midi/se_contest_icon_clear.o(.rodata);\n        sound/songs/midi/se_contest_mons_turn.o(.rodata);\n        sound/songs/midi/se_shiny.o(.rodata);\n        sound/songs/midi/se_intro_blast.o(.rodata);\n        sound/songs/midi/se_mugshot.o(.rodata);\n        sound/songs/midi/se_applause.o(.rodata);\n        sound/songs/midi/se_vend.o(.rodata);\n        sound/songs/midi/se_orb.o(.rodata);\n        sound/songs/se_dex_scroll.o(.rodata);\n        sound/songs/se_dex_page.o(.rodata);\n        sound/songs/midi/se_pokenav_on.o(.rodata);\n        sound/songs/midi/se_pokenav_off.o(.rodata);\n        sound/songs/midi/se_dex_search.o(.rodata);\n        sound/songs/midi/se_egg_hatch.o(.rodata);\n        sound/songs/midi/se_ball_tray_enter.o(.rodata);\n        sound/songs/midi/se_ball_tray_ball.o(.rodata);\n        sound/songs/midi/se_ball_tray_exit.o(.rodata);\n        sound/songs/midi/se_glass_flute.o(.rodata);\n        sound/songs/se_m_thunderbolt.o(.rodata);\n        sound/songs/se_m_thunderbolt2.o(.rodata);\n        sound/songs/se_m_harden.o(.rodata);\n        sound/songs/se_m_nightmare.o(.rodata);\n        sound/songs/se_m_vital_throw.o(.rodata);\n        sound/songs/se_m_vital_throw2.o(.rodata);\n        sound/songs/se_m_bubble.o(.rodata);\n        sound/songs/se_m_bubble2.o(.rodata);\n        sound/songs/se_m_bubble3.o(.rodata);\n        sound/songs/se_m_rain_dance.o(.rodata);\n        sound/songs/midi/se_m_cut.o(.rodata);\n        sound/songs/se_m_string_shot.o(.rodata);\n        sound/songs/se_m_string_shot2.o(.rodata);\n        sound/songs/se_m_rock_throw.o(.rodata);\n        sound/songs/midi/se_m_gust.o(.rodata);\n        sound/songs/midi/se_m_gust2.o(.rodata);\n        sound/songs/midi/se_m_double_slap.o(.rodata);\n        sound/songs/se_m_double_team.o(.rodata);\n        sound/songs/midi/se_m_razor_wind.o(.rodata);\n        sound/songs/se_m_icy_wind.o(.rodata);\n        sound/songs/se_m_thunder_wave.o(.rodata);\n        sound/songs/midi/se_m_comet_punch.o(.rodata);\n        sound/songs/midi/se_m_mega_kick.o(.rodata);\n        sound/songs/midi/se_m_mega_kick2.o(.rodata);\n        sound/songs/se_m_crabhammer.o(.rodata);\n        sound/songs/midi/se_m_jump_kick.o(.rodata);\n        sound/songs/se_m_flame_wheel.o(.rodata);\n        sound/songs/se_m_flame_wheel2.o(.rodata);\n        sound/songs/se_m_flamethrower.o(.rodata);\n        sound/songs/midi/se_m_fire_punch.o(.rodata);\n        sound/songs/se_m_toxic.o(.rodata);\n        sound/songs/se_m_sacred_fire.o(.rodata);\n        sound/songs/se_m_sacred_fire2.o(.rodata);\n        sound/songs/se_m_ember.o(.rodata);\n        sound/songs/midi/se_m_take_down.o(.rodata);\n        sound/songs/se_m_blizzard.o(.rodata);\n        sound/songs/se_m_blizzard2.o(.rodata);\n        sound/songs/midi/se_m_scratch.o(.rodata);\n        sound/songs/midi/se_m_vicegrip.o(.rodata);\n        sound/songs/midi/se_m_wing_attack.o(.rodata);\n        sound/songs/midi/se_m_fly.o(.rodata);\n        sound/songs/midi/se_m_sand_attack.o(.rodata);\n        sound/songs/midi/se_m_razor_wind2.o(.rodata);\n        sound/songs/se_m_bite.o(.rodata);\n        sound/songs/midi/se_m_headbutt.o(.rodata);\n        sound/songs/se_m_surf.o(.rodata);\n        sound/songs/se_m_hydro_pump.o(.rodata);\n        sound/songs/se_m_whirlpool.o(.rodata);\n        sound/songs/midi/se_m_horn_attack.o(.rodata);\n        sound/songs/midi/se_m_tail_whip.o(.rodata);\n        sound/songs/se_m_mist.o(.rodata);\n        sound/songs/se_m_poison_powder.o(.rodata);\n        sound/songs/midi/se_m_bind.o(.rodata);\n        sound/songs/se_m_dragon_rage.o(.rodata);\n        sound/songs/se_m_sing.o(.rodata);\n        sound/songs/se_m_perish_song.o(.rodata);\n        sound/songs/midi/se_m_pay_day.o(.rodata);\n        sound/songs/se_m_dig.o(.rodata);\n        sound/songs/se_m_dizzy_punch.o(.rodata);\n        sound/songs/se_m_self_destruct.o(.rodata);\n        sound/songs/se_m_explosion.o(.rodata);\n        sound/songs/se_m_absorb_2.o(.rodata);\n        sound/songs/se_m_absorb.o(.rodata);\n        sound/songs/se_m_screech.o(.rodata);\n        sound/songs/se_m_bubble_beam.o(.rodata);\n        sound/songs/se_m_bubble_beam2.o(.rodata);\n        sound/songs/se_m_supersonic.o(.rodata);\n        sound/songs/se_m_belly_drum.o(.rodata);\n        sound/songs/se_m_metronome.o(.rodata);\n        sound/songs/se_m_bonemerang.o(.rodata);\n        sound/songs/se_m_lick.o(.rodata);\n        sound/songs/se_m_psybeam.o(.rodata);\n        sound/songs/se_m_faint_attack.o(.rodata);\n        sound/songs/midi/se_m_swords_dance.o(.rodata);\n        sound/songs/midi/se_m_leer.o(.rodata);\n        sound/songs/se_m_swagger.o(.rodata);\n        sound/songs/se_m_swagger2.o(.rodata);\n        sound/songs/se_m_heal_bell.o(.rodata);\n        sound/songs/se_m_confuse_ray.o(.rodata);\n        sound/songs/se_m_snore.o(.rodata);\n        sound/songs/se_m_brick_break.o(.rodata);\n        sound/songs/se_m_giga_drain.o(.rodata);\n        sound/songs/se_m_psybeam2.o(.rodata);\n        sound/songs/se_m_solar_beam.o(.rodata);\n        sound/songs/se_m_petal_dance.o(.rodata);\n        sound/songs/se_m_teleport.o(.rodata);\n        sound/songs/se_m_minimize.o(.rodata);\n        sound/songs/se_m_sketch.o(.rodata);\n        sound/songs/se_m_swift.o(.rodata);\n        sound/songs/se_m_reflect.o(.rodata);\n        sound/songs/se_m_barrier.o(.rodata);\n        sound/songs/se_m_detect.o(.rodata);\n        sound/songs/se_m_lock_on.o(.rodata);\n        sound/songs/se_m_moonlight.o(.rodata);\n        sound/songs/se_m_charm.o(.rodata);\n        sound/songs/se_m_charge.o(.rodata);\n        sound/songs/se_m_strength.o(.rodata);\n        sound/songs/se_m_hyper_beam.o(.rodata);\n        sound/songs/se_m_waterfall.o(.rodata);\n        sound/songs/se_m_reversal.o(.rodata);\n        sound/songs/se_m_acid_armor.o(.rodata);\n        sound/songs/se_m_sandstorm.o(.rodata);\n        sound/songs/se_m_tri_attack.o(.rodata);\n        sound/songs/se_m_tri_attack2.o(.rodata);\n        sound/songs/se_m_encore.o(.rodata);\n        sound/songs/se_m_encore2.o(.rodata);\n        sound/songs/se_m_baton_pass.o(.rodata);\n        sound/songs/se_m_milk_drink.o(.rodata);\n        sound/songs/se_m_attract.o(.rodata);\n        sound/songs/se_m_attract2.o(.rodata);\n        sound/songs/se_m_morning_sun.o(.rodata);\n        sound/songs/se_m_flatter.o(.rodata);\n        sound/songs/se_m_sand_tomb.o(.rodata);\n        sound/songs/se_m_grasswhistle.o(.rodata);\n        sound/songs/se_m_spit_up.o(.rodata);\n        sound/songs/se_m_dive.o(.rodata);\n        sound/songs/se_m_earthquake.o(.rodata);\n        sound/songs/se_m_twister.o(.rodata);\n        sound/songs/se_m_sweet_scent.o(.rodata);\n        sound/songs/se_m_yawn.o(.rodata);\n        sound/songs/se_m_sky_uppercut.o(.rodata);\n        sound/songs/se_m_stat_increase.o(.rodata);\n        sound/songs/se_m_heat_wave.o(.rodata);\n        sound/songs/se_m_uproar.o(.rodata);\n        sound/songs/se_m_hail.o(.rodata);\n        sound/songs/se_m_cosmic_power.o(.rodata);\n        sound/songs/se_m_teeter_dance.o(.rodata);\n        sound/songs/se_m_stat_decrease.o(.rodata);\n        sound/songs/se_m_haze.o(.rodata);\n        sound/songs/se_m_hyper_beam2.o(.rodata);\n        sound/songs/midi/se_rg_door.o(.rodata);\n        sound/songs/midi/se_rg_card_flip.o(.rodata);\n        sound/songs/midi/se_rg_card_flipping.o(.rodata);\n        sound/songs/midi/se_rg_card_open.o(.rodata);\n        sound/songs/midi/se_rg_bag_cursor.o(.rodata);\n        sound/songs/se_rg_bag_pocket.o(.rodata);\n        sound/songs/midi/se_rg_ball_click.o(.rodata);\n        sound/songs/midi/se_rg_shop.o(.rodata);\n        sound/songs/midi/se_rg_ss_anne_horn.o(.rodata);\n        sound/songs/midi/se_rg_help_open.o(.rodata);\n        sound/songs/midi/se_rg_help_close.o(.rodata);\n        sound/songs/midi/se_rg_help_error.o(.rodata);\n        sound/songs/midi/se_rg_deoxys_move.o(.rodata);\n        sound/songs/midi/se_rg_poke_jump_success.o(.rodata);\n        sound/songs/midi/se_rg_poke_jump_failure.o(.rodata);\n        sound/songs/midi/se_pokenav_call.o(.rodata);\n        sound/songs/midi/se_pokenav_hang_up.o(.rodata);\n        sound/songs/midi/se_arena_timeup1.o(.rodata);\n        sound/songs/midi/se_arena_timeup2.o(.rodata);\n        sound/songs/midi/se_pike_curtain_close.o(.rodata);\n        sound/songs/midi/se_pike_curtain_open.o(.rodata);\n        sound/songs/midi/se_sudowoodo_shake.o(.rodata);\n        sound/songs/midi/mus_littleroot_test.o(.rodata);\n        sound/songs/midi/mus_gsc_route38.o(.rodata);\n        sound/songs/midi/mus_caught.o(.rodata);\n        sound/songs/midi/mus_victory_wild.o(.rodata);\n        sound/songs/midi/mus_victory_gym_leader.o(.rodata);\n        sound/songs/midi/mus_victory_league.o(.rodata);\n        sound/songs/midi/mus_c_comm_center.o(.rodata);\n        sound/songs/midi/mus_gsc_pewter.o(.rodata);\n        sound/songs/midi/mus_c_vs_legend_beast.o(.rodata);\n        sound/songs/midi/mus_route101.o(.rodata);\n        sound/songs/midi/mus_route110.o(.rodata);\n        sound/songs/midi/mus_route120.o(.rodata);\n        sound/songs/midi/mus_petalburg.o(.rodata);\n        sound/songs/midi/mus_oldale.o(.rodata);\n        sound/songs/midi/mus_gym.o(.rodata);\n        sound/songs/midi/mus_surf.o(.rodata);\n        sound/songs/midi/mus_petalburg_woods.o(.rodata);\n        sound/songs/midi/mus_level_up.o(.rodata);\n        sound/songs/midi/mus_heal.o(.rodata);\n        sound/songs/midi/mus_obtain_badge.o(.rodata);\n        sound/songs/midi/mus_obtain_item.o(.rodata);\n        sound/songs/midi/mus_evolved.o(.rodata);\n        sound/songs/midi/mus_obtain_tmhm.o(.rodata);\n        sound/songs/midi/mus_lilycove_museum.o(.rodata);\n        sound/songs/midi/mus_route122.o(.rodata);\n        sound/songs/midi/mus_oceanic_museum.o(.rodata);\n        sound/songs/midi/mus_evolution_intro.o(.rodata);\n        sound/songs/midi/mus_evolution.o(.rodata);\n        sound/songs/midi/mus_move_deleted.o(.rodata);\n        sound/songs/midi/mus_encounter_girl.o(.rodata);\n        sound/songs/midi/mus_encounter_male.o(.rodata);\n        sound/songs/midi/mus_abandoned_ship.o(.rodata);\n        sound/songs/midi/mus_fortree.o(.rodata);\n        sound/songs/midi/mus_birch_lab.o(.rodata);\n        sound/songs/midi/mus_b_tower_rs.o(.rodata);\n        sound/songs/midi/mus_encounter_swimmer.o(.rodata);\n        sound/songs/midi/mus_cave_of_origin.o(.rodata);\n        sound/songs/midi/mus_obtain_berry.o(.rodata);\n        sound/songs/midi/mus_awaken_legend.o(.rodata);\n        sound/songs/midi/mus_slots_jackpot.o(.rodata);\n        sound/songs/midi/mus_slots_win.o(.rodata);\n        sound/songs/midi/mus_too_bad.o(.rodata);\n        sound/songs/midi/mus_roulette.o(.rodata);\n        sound/songs/midi/mus_link_contest_p1.o(.rodata);\n        sound/songs/midi/mus_link_contest_p2.o(.rodata);\n        sound/songs/midi/mus_link_contest_p3.o(.rodata);\n        sound/songs/midi/mus_link_contest_p4.o(.rodata);\n        sound/songs/midi/mus_encounter_rich.o(.rodata);\n        sound/songs/midi/mus_verdanturf.o(.rodata);\n        sound/songs/midi/mus_rustboro.o(.rodata);\n        sound/songs/midi/mus_poke_center.o(.rodata);\n        sound/songs/midi/mus_route104.o(.rodata);\n        sound/songs/midi/mus_route119.o(.rodata);\n        sound/songs/midi/mus_cycling.o(.rodata);\n        sound/songs/midi/mus_poke_mart.o(.rodata);\n        sound/songs/midi/mus_littleroot.o(.rodata);\n        sound/songs/midi/mus_mt_chimney.o(.rodata);\n        sound/songs/midi/mus_encounter_female.o(.rodata);\n        sound/songs/midi/mus_lilycove.o(.rodata);\n        sound/songs/midi/mus_route111.o(.rodata);\n        sound/songs/midi/mus_help.o(.rodata);\n        sound/songs/midi/mus_underwater.o(.rodata);\n        sound/songs/midi/mus_victory_trainer.o(.rodata);\n        sound/songs/midi/mus_title.o(.rodata);\n        sound/songs/midi/mus_intro.o(.rodata);\n        sound/songs/midi/mus_encounter_may.o(.rodata);\n        sound/songs/midi/mus_encounter_intense.o(.rodata);\n        sound/songs/midi/mus_encounter_cool.o(.rodata);\n        sound/songs/midi/mus_route113.o(.rodata);\n        sound/songs/midi/mus_encounter_aqua.o(.rodata);\n        sound/songs/midi/mus_follow_me.o(.rodata);\n        sound/songs/midi/mus_encounter_brendan.o(.rodata);\n        sound/songs/midi/mus_ever_grande.o(.rodata);\n        sound/songs/midi/mus_encounter_suspicious.o(.rodata);\n        sound/songs/midi/mus_victory_aqua_magma.o(.rodata);\n        sound/songs/midi/mus_cable_car.o(.rodata);\n        sound/songs/midi/mus_game_corner.o(.rodata);\n        sound/songs/midi/mus_dewford.o(.rodata);\n        sound/songs/midi/mus_safari_zone.o(.rodata);\n        sound/songs/midi/mus_victory_road.o(.rodata);\n        sound/songs/midi/mus_aqua_magma_hideout.o(.rodata);\n        sound/songs/midi/mus_sailing.o(.rodata);\n        sound/songs/midi/mus_mt_pyre.o(.rodata);\n        sound/songs/midi/mus_slateport.o(.rodata);\n        sound/songs/midi/mus_mt_pyre_exterior.o(.rodata);\n        sound/songs/midi/mus_school.o(.rodata);\n        sound/songs/midi/mus_hall_of_fame.o(.rodata);\n        sound/songs/midi/mus_fallarbor.o(.rodata);\n        sound/songs/midi/mus_sealed_chamber.o(.rodata);\n        sound/songs/midi/mus_contest_winner.o(.rodata);\n        sound/songs/midi/mus_contest.o(.rodata);\n        sound/songs/midi/mus_encounter_magma.o(.rodata);\n        sound/songs/midi/mus_intro_battle.o(.rodata);\n        sound/songs/midi/mus_abnormal_weather.o(.rodata);\n        sound/songs/midi/mus_weather_groudon.o(.rodata);\n        sound/songs/midi/mus_sootopolis.o(.rodata);\n        sound/songs/midi/mus_contest_results.o(.rodata);\n        sound/songs/midi/mus_hall_of_fame_room.o(.rodata);\n        sound/songs/midi/mus_trick_house.o(.rodata);\n        sound/songs/midi/mus_encounter_twins.o(.rodata);\n        sound/songs/midi/mus_encounter_elite_four.o(.rodata);\n        sound/songs/midi/mus_encounter_hiker.o(.rodata);\n        sound/songs/midi/mus_contest_lobby.o(.rodata);\n        sound/songs/midi/mus_encounter_interviewer.o(.rodata);\n        sound/songs/midi/mus_encounter_champion.o(.rodata);\n        sound/songs/midi/mus_credits.o(.rodata);\n        sound/songs/midi/mus_end.o(.rodata);\n        sound/songs/midi/mus_b_frontier.o(.rodata);\n        sound/songs/midi/mus_b_arena.o(.rodata);\n        sound/songs/midi/mus_obtain_b_points.o(.rodata);\n        sound/songs/midi/mus_register_match_call.o(.rodata);\n        sound/songs/midi/mus_b_pyramid.o(.rodata);\n        sound/songs/midi/mus_b_pyramid_top.o(.rodata);\n        sound/songs/midi/mus_b_palace.o(.rodata);\n        sound/songs/midi/mus_rayquaza_appears.o(.rodata);\n        sound/songs/midi/mus_b_tower.o(.rodata);\n        sound/songs/midi/mus_obtain_symbol.o(.rodata);\n        sound/songs/midi/mus_b_dome.o(.rodata);\n        sound/songs/midi/mus_b_pike.o(.rodata);\n        sound/songs/midi/mus_b_factory.o(.rodata);\n        sound/songs/midi/mus_vs_rayquaza.o(.rodata);\n        sound/songs/midi/mus_vs_frontier_brain.o(.rodata);\n        sound/songs/midi/mus_vs_mew.o(.rodata);\n        sound/songs/midi/mus_b_dome_lobby.o(.rodata);\n        sound/songs/midi/mus_vs_wild.o(.rodata);\n        sound/songs/midi/mus_vs_aqua_magma.o(.rodata);\n        sound/songs/midi/mus_vs_trainer.o(.rodata);\n        sound/songs/midi/mus_vs_gym_leader.o(.rodata);\n        sound/songs/midi/mus_vs_champion.o(.rodata);\n        sound/songs/midi/mus_vs_regi.o(.rodata);\n        sound/songs/midi/mus_vs_kyogre_groudon.o(.rodata);\n        sound/songs/midi/mus_vs_rival.o(.rodata);\n        sound/songs/midi/mus_vs_elite_four.o(.rodata);\n        sound/songs/midi/mus_vs_aqua_magma_leader.o(.rodata);\n        sound/songs/midi/mus_rg_follow_me.o(.rodata);\n        sound/songs/midi/mus_rg_game_corner.o(.rodata);\n        sound/songs/midi/mus_rg_rocket_hideout.o(.rodata);\n        sound/songs/midi/mus_rg_gym.o(.rodata);\n        sound/songs/midi/mus_rg_jigglypuff.o(.rodata);\n        sound/songs/midi/mus_rg_intro_fight.o(.rodata);\n        sound/songs/midi/mus_rg_title.o(.rodata);\n        sound/songs/midi/mus_rg_cinnabar.o(.rodata);\n        sound/songs/midi/mus_rg_lavender.o(.rodata);\n        sound/songs/midi/mus_rg_heal.o(.rodata);\n        sound/songs/midi/mus_rg_cycling.o(.rodata);\n        sound/songs/midi/mus_rg_encounter_rocket.o(.rodata);\n        sound/songs/midi/mus_rg_encounter_girl.o(.rodata);\n        sound/songs/midi/mus_rg_encounter_boy.o(.rodata);\n        sound/songs/midi/mus_rg_hall_of_fame.o(.rodata);\n        sound/songs/midi/mus_rg_viridian_forest.o(.rodata);\n        sound/songs/midi/mus_rg_mt_moon.o(.rodata);\n        sound/songs/midi/mus_rg_poke_mansion.o(.rodata);\n        sound/songs/midi/mus_rg_credits.o(.rodata);\n        sound/songs/midi/mus_rg_route1.o(.rodata);\n        sound/songs/midi/mus_rg_route24.o(.rodata);\n        sound/songs/midi/mus_rg_route3.o(.rodata);\n        sound/songs/midi/mus_rg_route11.o(.rodata);\n        sound/songs/midi/mus_rg_victory_road.o(.rodata);\n        sound/songs/midi/mus_rg_vs_gym_leader.o(.rodata);\n        sound/songs/midi/mus_rg_vs_trainer.o(.rodata);\n        sound/songs/midi/mus_rg_vs_wild.o(.rodata);\n        sound/songs/midi/mus_rg_vs_champion.o(.rodata);\n        sound/songs/midi/mus_rg_pallet.o(.rodata);\n        sound/songs/midi/mus_rg_oak_lab.o(.rodata);\n        sound/songs/midi/mus_rg_oak.o(.rodata);\n        sound/songs/midi/mus_rg_poke_center.o(.rodata);\n        sound/songs/midi/mus_rg_ss_anne.o(.rodata);\n        sound/songs/midi/mus_rg_surf.o(.rodata);\n        sound/songs/midi/mus_rg_poke_tower.o(.rodata);\n        sound/songs/midi/mus_rg_silph.o(.rodata);\n        sound/songs/midi/mus_rg_fuchsia.o(.rodata);\n        sound/songs/midi/mus_rg_celadon.o(.rodata);\n        sound/songs/midi/mus_rg_victory_trainer.o(.rodata);\n        sound/songs/midi/mus_rg_victory_wild.o(.rodata);\n        sound/songs/midi/mus_rg_victory_gym_leader.o(.rodata);\n        sound/songs/midi/mus_rg_vermillion.o(.rodata);\n        sound/songs/midi/mus_rg_pewter.o(.rodata);\n        sound/songs/midi/mus_rg_encounter_rival.o(.rodata);\n        sound/songs/midi/mus_rg_rival_exit.o(.rodata);\n        sound/songs/midi/mus_rg_dex_rating.o(.rodata);\n        sound/songs/midi/mus_rg_obtain_key_item.o(.rodata);\n        sound/songs/midi/mus_rg_caught_intro.o(.rodata);\n        sound/songs/midi/mus_rg_photo.o(.rodata);\n        sound/songs/midi/mus_rg_game_freak.o(.rodata);\n        sound/songs/midi/mus_rg_caught.o(.rodata);\n        sound/songs/midi/mus_rg_new_game_instruct.o(.rodata);\n        sound/songs/midi/mus_rg_new_game_intro.o(.rodata);\n        sound/songs/midi/mus_rg_new_game_exit.o(.rodata);\n        sound/songs/midi/mus_rg_poke_jump.o(.rodata);\n        sound/songs/midi/mus_rg_union_room.o(.rodata);\n        sound/songs/midi/mus_rg_net_center.o(.rodata);\n        sound/songs/midi/mus_rg_mystery_gift.o(.rodata);\n        sound/songs/midi/mus_rg_berry_pick.o(.rodata);\n        sound/songs/midi/mus_rg_sevii_cave.o(.rodata);\n        sound/songs/midi/mus_rg_teachy_tv_show.o(.rodata);\n        sound/songs/midi/mus_rg_sevii_route.o(.rodata);\n        sound/songs/midi/mus_rg_sevii_dungeon.o(.rodata);\n        sound/songs/midi/mus_rg_sevii_123.o(.rodata);\n        sound/songs/midi/mus_rg_sevii_45.o(.rodata);\n        sound/songs/midi/mus_rg_sevii_67.o(.rodata);\n        sound/songs/midi/mus_rg_poke_flute.o(.rodata);\n        sound/songs/midi/mus_rg_vs_deoxys.o(.rodata);\n        sound/songs/midi/mus_rg_vs_mewtwo.o(.rodata);\n        sound/songs/midi/mus_rg_vs_legend.o(.rodata);\n        sound/songs/midi/mus_rg_encounter_gym_leader.o(.rodata);\n        sound/songs/midi/mus_rg_encounter_deoxys.o(.rodata);\n        sound/songs/midi/mus_rg_trainer_tower.o(.rodata);\n        sound/songs/midi/mus_rg_slow_pallet.o(.rodata);\n        sound/songs/midi/mus_rg_teachy_tv_menu.o(.rodata);\n        sound/songs/midi/ph_trap_blend.o(.rodata);\n        sound/songs/midi/ph_trap_held.o(.rodata);\n        sound/songs/midi/ph_trap_solo.o(.rodata);\n        sound/songs/midi/ph_face_blend.o(.rodata);\n        sound/songs/midi/ph_face_held.o(.rodata);\n        sound/songs/midi/ph_face_solo.o(.rodata);\n        sound/songs/midi/ph_cloth_blend.o(.rodata);\n        sound/songs/midi/ph_cloth_held.o(.rodata);\n        sound/songs/midi/ph_cloth_solo.o(.rodata);\n        sound/songs/midi/ph_dress_blend.o(.rodata);\n        sound/songs/midi/ph_dress_held.o(.rodata);\n        sound/songs/midi/ph_dress_solo.o(.rodata);\n        sound/songs/midi/ph_fleece_blend.o(.rodata);\n        sound/songs/midi/ph_fleece_held.o(.rodata);\n        sound/songs/midi/ph_fleece_solo.o(.rodata);\n        sound/songs/midi/ph_kit_blend.o(.rodata);\n        sound/songs/midi/ph_kit_held.o(.rodata);\n        sound/songs/midi/ph_kit_solo.o(.rodata);\n        sound/songs/midi/ph_price_blend.o(.rodata);\n        sound/songs/midi/ph_price_held.o(.rodata);\n        sound/songs/midi/ph_price_solo.o(.rodata);\n        sound/songs/midi/ph_lot_blend.o(.rodata);\n        sound/songs/midi/ph_lot_held.o(.rodata);\n        sound/songs/midi/ph_lot_solo.o(.rodata);\n        sound/songs/midi/ph_goat_blend.o(.rodata);\n        sound/songs/midi/ph_goat_held.o(.rodata);\n        sound/songs/midi/ph_goat_solo.o(.rodata);\n        sound/songs/midi/ph_thought_blend.o(.rodata);\n        sound/songs/midi/ph_thought_held.o(.rodata);\n        sound/songs/midi/ph_thought_solo.o(.rodata);\n        sound/songs/midi/ph_choice_blend.o(.rodata);\n        sound/songs/midi/ph_choice_held.o(.rodata);\n        sound/songs/midi/ph_choice_solo.o(.rodata);\n        sound/songs/midi/ph_mouth_blend.o(.rodata);\n        sound/songs/midi/ph_mouth_held.o(.rodata);\n        sound/songs/midi/ph_mouth_solo.o(.rodata);\n        sound/songs/midi/ph_foot_blend.o(.rodata);\n        sound/songs/midi/ph_foot_held.o(.rodata);\n        sound/songs/midi/ph_foot_solo.o(.rodata);\n        sound/songs/midi/ph_goose_blend.o(.rodata);\n        sound/songs/midi/ph_goose_held.o(.rodata);\n        sound/songs/midi/ph_goose_solo.o(.rodata);\n        sound/songs/midi/ph_strut_blend.o(.rodata);\n        sound/songs/midi/ph_strut_held.o(.rodata);\n        sound/songs/midi/ph_strut_solo.o(.rodata);\n        sound/songs/midi/ph_cure_blend.o(.rodata);\n        sound/songs/midi/ph_cure_held.o(.rodata);\n        sound/songs/midi/ph_cure_solo.o(.rodata);\n        sound/songs/midi/ph_nurse_blend.o(.rodata);\n        sound/songs/midi/ph_nurse_held.o(.rodata);\n        sound/songs/midi/ph_nurse_solo.o(.rodata);\n    } =0\n\n    lib_rodata :\n    SUBALIGN(4)\n    {\n        src/agb_flash.o(.rodata);\n        src/agb_flash_1m.o(.rodata);\n        src/agb_flash_mx.o(.rodata);\n        src/agb_flash_le.o(.rodata);\n        src/librfu_rfu.o(.rodata);\n        src/librfu_sio32id.o(.rodata);\n        src/isagbprn.o(.rodata);\n        *libgcc.a:_divdi3.o(.rodata);\n        *libgcc.a:_udivdi3.o(.rodata);\n        *libc.a:memcpy.o(.rodata);\n        *libc.a:memset.o(.rodata);\n        *libc.a:strcmp.o(.rodata);\n        *libc.a:strcpy.o(.rodata);\n        *libc.a:impure.o(.rodata);\n        *libc.a:vsprintf.o(.rodata);\n        *libc.a:vfprintf.o(.rodata);\n        *libc.a:wsetup.o(.rodata);\n        *libc.a:dtoa.o(.rodata);\n        *libc.a:fflush.o(.rodata);\n        *libc.a:findfp.o(.rodata);\n        *libc.a:freer.o(.rodata);\n        *libc.a:mtrim.o(.rodata);\n        *libc.a:fvwrite.o(.rodata);\n        *libc.a:fwalk.o(.rodata);\n        *libc.a:locale.o(.rodata);\n        *libc.a:makebuf.o(.rodata);\n        *libc.a:mallocr.o(.rodata);\n        *libc.a:mbtowc_r.o(.rodata);\n        *libc.a:memchr.o(.rodata);\n        *libc.a:memmove.o(.rodata);\n        *libc.a:mlock.o(.rodata);\n        *libc.a:mprec.o(.rodata);\n        *libc.a:s_isinf.o(.rodata);\n        *libc.a:s_isnan.o(.rodata);\n        *libc.a:sbrkr.o(.rodata);\n        *libc.a:stdio.o(.rodata);\n        *libc.a:strlen.o(.rodata);\n        *libc.a:syscalls.o(.rodata);\n        *libc.a:writer.o(.rodata);\n        *libc.a:callocr.o(.rodata);\n        *libc.a:closer.o(.rodata);\n        *libc.a:errno.o(.rodata);\n        *libc.a:fstatr.o(.rodata);\n        *libc.a:libcfunc.o(.rodata);\n        *libc.a:lseekr.o(.rodata);\n        *libc.a:readr.o(.rodata);\n\n        . = ALIGN(4);\n    } =0\n\n    multiboot_data :\n    ALIGN(4)\n    {\n        data/multiboot_ereader.o(.rodata);\n        data/multiboot_berry_glitch_fix.o(.rodata);\n        data/multiboot_pokemon_colosseum.o(.rodata);\n    } =0\n\n    . = 0x08D00000;\n    gfx_data :\n    ALIGN(4)\n    {\n        src/graphics.o(.rodata);\n    } =0\n\n    extra :\n    ALIGN(4)\n    {\n        src/*.o(.text);\n        src/*.o(.rodata);\n        data/*.o(.rodata);\n    } = 0\n\n    /* DWARF 2 sections */\n    .debug_aranges  0 : { *(.debug_aranges) }\n    .debug_pubnames 0 : { *(.debug_pubnames) }\n    .debug_info     0 : { *(.debug_info) }\n    .debug_abbrev   0 : { *(.debug_abbrev) }\n    .debug_line     0 : { *(.debug_line) }\n    .debug_frame    0 : { *(.debug_frame) }\n    .debug_str      0 : { *(.debug_str) }\n    .debug_loc      0 : { *(.debug_loc) }\n    .debug_macinfo  0 : { *(.debug_macinfo) }\n\n    /* Discard everything not specifically mentioned above. \n    /DISCARD/ :\n    {\n        *(*);\n    }*/\n}\n"
  },
  {
    "path": "ld_script_modern.ld",
    "content": "gNumMusicPlayers = 4;\ngMaxLines = 0;\n\nSECTIONS {\n    . = 0x2000000;\n\n    ewram (NOLOAD) :\n    ALIGN(4)\n    {\n        gHeap = .;\n\n        . = 0x1C000;\n\n        *(ewram_data);\n\n        . = 0x40000;\n    }\n\n    . = 0x3000000;\n\n    iwram (NOLOAD) :\n    ALIGN(4)\n    {\n        /* .bss starts at 0x3000000 */\n        *(.bss*);\n        /* .bss.code starts at 0x3001AA8 */\n        src/m4a.o(.bss.code);\n\n        /* COMMON starts at 0x30022A8 */\n        *(COMMON);\n        end = .;\n        __end__ = .;\n        . = 0x8000;\n    }\n\n    . = 0x8000000;\n\n    .text :\n    ALIGN(4)\n    {\n        src/rom_header.o(.text*);\n        src/rom_header_gf.o(.text.*);\n        src/crt0.o(.text);\n        src/main.o(.text);\n        *(.text*);\n    } =0\n\n    script_data :\n    ALIGN(4)\n    {\n    \t*(script_data);\n    } =0\n\n    .data :\n    ALIGN(4)\n    {\n    \t*(.data*);\n    } =0\n\n    .rodata :\n    ALIGN(4)\n    {\n    \t*(.rodata*);\n    } =0\n\n    /* DWARF 2 sections */\n    .debug_aranges  0 : { *(.debug_aranges) }\n    .debug_pubnames 0 : { *(.debug_pubnames) }\n    .debug_info     0 : { *(.debug_info) }\n    .debug_abbrev   0 : { *(.debug_abbrev) }\n    .debug_line     0 : { *(.debug_line) }\n    .debug_frame    0 : { *(.debug_frame) }\n    .debug_str      0 : { *(.debug_str) }\n    .debug_loc      0 : { *(.debug_loc) }\n    .debug_macinfo  0 : { *(.debug_macinfo) }\n\n    /* Discard everything not specifically mentioned above. */\n    /DISCARD/ :\n    {\n        *(*);\n    }\n}\n"
  },
  {
    "path": "leafgreen.sha1",
    "content": "574fa542ffebb14be69902d1d36f1ec0a4afd71e  pokeleafgreen.gba\n"
  },
  {
    "path": "leafgreen_rev1.sha1",
    "content": "7862c67bdecbe21d1d69ce082ce34327e1c6ed5e  pokeleafgreen_rev1.gba\n"
  },
  {
    "path": "map_data_rules.mk",
    "content": "# Map JSON data\n\nMAPS_DIR = $(DATA_ASM_SUBDIR)/maps\nLAYOUTS_DIR = $(DATA_ASM_SUBDIR)/layouts\n\nMAP_DIRS := $(dir $(wildcard $(MAPS_DIR)/*/map.json))\nMAP_CONNECTIONS := $(patsubst $(MAPS_DIR)/%/,$(MAPS_DIR)/%/connections.inc,$(MAP_DIRS))\nMAP_EVENTS := $(patsubst $(MAPS_DIR)/%/,$(MAPS_DIR)/%/events.inc,$(MAP_DIRS))\nMAP_HEADERS := $(patsubst $(MAPS_DIR)/%/,$(MAPS_DIR)/%/header.inc,$(MAP_DIRS))\n\n$(MAPS_DIR)/%/header.inc: $(MAPS_DIR)/%/map.json\n\t$(MAPJSON) map firered $< $(LAYOUTS_DIR)/layouts.json\n$(MAPS_DIR)/%/events.inc: $(MAPS_DIR)/%/header.inc ;\n$(MAPS_DIR)/%/connections.inc: $(MAPS_DIR)/%/events.inc ;\n\n$(MAPS_DIR)/groups.inc: $(MAPS_DIR)/map_groups.json\n\t$(MAPJSON) groups firered $<\n$(MAPS_DIR)/connections.inc: $(MAPS_DIR)/groups.inc ;\n$(MAPS_DIR)/events.inc: $(MAPS_DIR)/connections.inc ;\n$(MAPS_DIR)/headers.inc: $(MAPS_DIR)/events.inc ;\ninclude/constants/map_groups.h: $(MAPS_DIR)/headers.inc ;\n\n$(LAYOUTS_DIR)/layouts.inc: $(LAYOUTS_DIR)/layouts.json\n\t$(MAPJSON) layouts firered $<\n$(LAYOUTS_DIR)/layouts_table.inc: $(LAYOUTS_DIR)/layouts.inc ;\ninclude/constants/layouts.h: $(LAYOUTS_DIR)/layouts_table.inc ;\n\n$(DATA_ASM_BUILDDIR)/maps.o: $(DATA_ASM_SUBDIR)/maps.s $(LAYOUTS_DIR)/layouts.inc $(LAYOUTS_DIR)/layouts_table.inc $(MAPS_DIR)/headers.inc $(MAPS_DIR)/groups.inc $(MAPS_DIR)/connections.inc $(MAP_CONNECTIONS) $(MAP_HEADERS)\n\t$(PREPROC) $< charmap.txt | $(CPP) -I include -nostdinc -undef -Wno-unicode - | $(AS) $(ASFLAGS) -o $@\n$(DATA_ASM_BUILDDIR)/map_events.o: $(DATA_ASM_SUBDIR)/map_events.s $(MAPS_DIR)/events.inc $(MAP_EVENTS)\n\t$(PREPROC) $< charmap.txt | $(CPP) -I include -nostdinc -undef -Wno-unicode - | $(AS) $(ASFLAGS) -o $@\n\n"
  },
  {
    "path": "replace.sh",
    "content": "#!/bin/bash\n# $1: phrase to find\n# $2: phrase to replace $1\nif [ \"$1\" = \"\" -o \"$2\" = \"\" ]; then\n\techo \"Usage: replace.sh [PHRASE TO FIND] [PHRASE TO REPLACE PHRASE TO FIND]\"\n\texit 0\nfi\n\nsed -i 's/\\<'\"$1\"'\\>/'\"$2\"'/' $(grep -lwr --include=\"*.s\" --include=\"*.h\" --include=\"*.c\" --include=\"*.inc\" --include=\"*.json\" --include=\"*.txt\" --exclude-dir=\"tools\" --exclude-dir=\".git\" --exclude-dir=\"build\" --exclude-dir=\"berry_fix/build\" --exclude-dir=\"berry_fix/payload/build\" --exclude-dir=\".travis\" \"$1\")\n"
  },
  {
    "path": "songs.mk",
    "content": "STD_REVERB = 50\n\n$(MID_BUILDDIR)/%.o: $(MID_SUBDIR)/%.s\n\t$(AS) $(ASFLAGS) -I sound -o $@ $<\n\n$(MID_SUBDIR)/mus_aqua_magma_hideout.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G076 -V084\n\n$(MID_SUBDIR)/mus_encounter_aqua.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G065 -V086\n\n$(MID_SUBDIR)/mus_route111.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G055 -V076\n\n$(MID_SUBDIR)/mus_encounter_suspicious.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G069 -V078\n\n$(MID_SUBDIR)/mus_b_arena.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G104 -V090\n\n$(MID_SUBDIR)/mus_b_dome.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G111 -V090\n\n$(MID_SUBDIR)/mus_b_dome_lobby.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G111 -V056\n\n$(MID_SUBDIR)/mus_b_factory.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G113 -V100\n\n$(MID_SUBDIR)/mus_b_frontier.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G103 -V094\n\n$(MID_SUBDIR)/mus_b_palace.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G108 -V105\n\n$(MID_SUBDIR)/mus_b_tower_rs.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G035 -V080\n\n$(MID_SUBDIR)/mus_b_pike.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G112 -V092\n\n$(MID_SUBDIR)/mus_vs_trainer.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G119 -V080 -P1\n\n$(MID_SUBDIR)/mus_vs_wild.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G117 -V080 -P1\n\n$(MID_SUBDIR)/mus_vs_aqua_magma_leader.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G126 -V080 -P1\n\n$(MID_SUBDIR)/mus_vs_aqua_magma.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G118 -V080 -P1\n\n$(MID_SUBDIR)/mus_vs_gym_leader.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G120 -V080 -P1\n\n$(MID_SUBDIR)/mus_vs_champion.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G121 -V080 -P1\n\n$(MID_SUBDIR)/mus_vs_kyogre_groudon.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G123 -V080 -P1\n\n$(MID_SUBDIR)/mus_vs_rival.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G124 -V080 -P1\n\n$(MID_SUBDIR)/mus_vs_regi.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G122 -V080 -P1\n\n$(MID_SUBDIR)/mus_vs_elite_four.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G125 -V080 -P1\n\n$(MID_SUBDIR)/mus_roulette.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G038 -V080\n\n$(MID_SUBDIR)/mus_lilycove_museum.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G020 -V080\n\n$(MID_SUBDIR)/mus_encounter_brendan.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G067 -V078\n\n$(MID_SUBDIR)/mus_encounter_male.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G028 -V080\n\n$(MID_SUBDIR)/mus_victory_road.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G075 -V076\n\n$(MID_SUBDIR)/mus_game_corner.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G072 -V072\n\n$(MID_SUBDIR)/mus_contest_winner.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G085 -V100\n\n$(MID_SUBDIR)/mus_contest_results.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G092 -V080\n\n$(MID_SUBDIR)/mus_contest_lobby.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G098 -V060\n\n$(MID_SUBDIR)/mus_contest.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G086 -V088\n\n$(MID_SUBDIR)/mus_cycling.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G049 -V083\n\n$(MID_SUBDIR)/mus_encounter_champion.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G100 -V076\n\n$(MID_SUBDIR)/mus_petalburg_woods.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G018 -V080\n\n$(MID_SUBDIR)/mus_abandoned_ship.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G030 -V080\n\n$(MID_SUBDIR)/mus_cave_of_origin.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G037 -V080\n\n$(MID_SUBDIR)/mus_underwater.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G057 -V094\n\n$(MID_SUBDIR)/mus_intro.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G060 -V090\n\n$(MID_SUBDIR)/mus_hall_of_fame.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G082 -V078\n\n$(MID_SUBDIR)/mus_route110.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G010 -V080\n\n$(MID_SUBDIR)/mus_route120.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G014 -V080\n\n$(MID_SUBDIR)/mus_route122.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G021 -V080\n\n$(MID_SUBDIR)/mus_route101.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G011 -V080\n\n$(MID_SUBDIR)/mus_dummy.s: %.s: %.mid\n\t$(MID) $< $@ -E -R40\n\n$(MID_SUBDIR)/mus_hall_of_fame_room.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G093 -V080\n\n$(MID_SUBDIR)/mus_end.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G102 -V036\n\n$(MID_SUBDIR)/mus_help.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G056 -V078\n\n$(MID_SUBDIR)/mus_level_up.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5\n\n$(MID_SUBDIR)/mus_obtain_item.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5\n\n$(MID_SUBDIR)/mus_evolved.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5\n\n$(MID_SUBDIR)/mus_gsc_route38.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -V080\n\n$(MID_SUBDIR)/mus_slateport.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G079 -V070\n\n$(MID_SUBDIR)/mus_poke_mart.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G050 -V085\n\n$(MID_SUBDIR)/mus_oceanic_museum.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G023 -V080\n\n$(MID_SUBDIR)/mus_gym.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G013 -V080\n\n$(MID_SUBDIR)/mus_encounter_may.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G061 -V078\n\n$(MID_SUBDIR)/mus_encounter_female.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G053 -V072\n\n$(MID_SUBDIR)/mus_verdanturf.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G044 -V090\n\n$(MID_SUBDIR)/mus_rustboro.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G045 -V085\n\n$(MID_SUBDIR)/mus_route119.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G048 -V096\n\n$(MID_SUBDIR)/mus_encounter_intense.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G062 -V078\n\n$(MID_SUBDIR)/mus_weather_groudon.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G090 -V050\n\n$(MID_SUBDIR)/mus_dewford.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G073 -V078\n\n$(MID_SUBDIR)/mus_encounter_twins.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G095 -V075\n\n$(MID_SUBDIR)/mus_encounter_interviewer.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G099 -V062\n\n$(MID_SUBDIR)/mus_victory_trainer.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G058 -V091\n\n$(MID_SUBDIR)/mus_victory_wild.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G025 -V080\n\n$(MID_SUBDIR)/mus_victory_gym_leader.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G024 -V080\n\n$(MID_SUBDIR)/mus_victory_aqua_magma.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G070 -V088\n\n$(MID_SUBDIR)/mus_victory_league.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G029 -V080\n\n$(MID_SUBDIR)/mus_caught.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G025 -V080\n\n$(MID_SUBDIR)/mus_encounter_cool.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G063 -V086\n\n$(MID_SUBDIR)/mus_trick_house.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G094 -V070\n\n$(MID_SUBDIR)/mus_route113.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G064 -V084\n\n$(MID_SUBDIR)/mus_sailing.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G077 -V086\n\n$(MID_SUBDIR)/mus_mt_pyre.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G078 -V088\n\n$(MID_SUBDIR)/mus_sealed_chamber.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G084 -V100\n\n$(MID_SUBDIR)/mus_petalburg.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G015 -V080\n\n$(MID_SUBDIR)/mus_fortree.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G032 -V080\n\n$(MID_SUBDIR)/mus_oldale.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G019 -V080\n\n$(MID_SUBDIR)/mus_mt_pyre_exterior.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G080 -V080\n\n$(MID_SUBDIR)/mus_heal.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5\n\n$(MID_SUBDIR)/mus_slots_jackpot.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5\n\n$(MID_SUBDIR)/mus_slots_win.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5\n\n$(MID_SUBDIR)/mus_obtain_badge.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5\n\n$(MID_SUBDIR)/mus_obtain_berry.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5\n\n$(MID_SUBDIR)/mus_obtain_b_points.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G103 -V090 -P5\n\n$(MID_SUBDIR)/mus_rg_photo.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G180 -V100 -P5\n\n$(MID_SUBDIR)/mus_evolution_intro.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G026 -V080\n\n$(MID_SUBDIR)/mus_obtain_symbol.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G103 -V100 -P5\n\n$(MID_SUBDIR)/mus_awaken_legend.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5\n\n$(MID_SUBDIR)/mus_register_match_call.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G105 -V090 -P5\n\n$(MID_SUBDIR)/mus_move_deleted.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5\n\n$(MID_SUBDIR)/mus_obtain_tmhm.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5\n\n$(MID_SUBDIR)/mus_too_bad.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G012 -V090 -P5\n\n$(MID_SUBDIR)/mus_encounter_magma.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G087 -V072\n\n$(MID_SUBDIR)/mus_lilycove.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G054 -V085\n\n$(MID_SUBDIR)/mus_littleroot.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G051 -V100\n\n$(MID_SUBDIR)/mus_surf.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G017 -V080\n\n$(MID_SUBDIR)/mus_route104.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G047 -V097\n\n$(MID_SUBDIR)/mus_gsc_pewter.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -V080\n\n$(MID_SUBDIR)/mus_birch_lab.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G033 -V080\n\n$(MID_SUBDIR)/mus_abnormal_weather.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G089 -V080\n\n$(MID_SUBDIR)/mus_school.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G081 -V100\n\n$(MID_SUBDIR)/mus_c_comm_center.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -V080\n\n$(MID_SUBDIR)/mus_poke_center.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G046 -V092\n\n$(MID_SUBDIR)/mus_b_pyramid.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G106 -V079\n\n$(MID_SUBDIR)/mus_b_pyramid_top.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G107 -V077\n\n$(MID_SUBDIR)/mus_ever_grande.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G068 -V086\n\n$(MID_SUBDIR)/mus_rayquaza_appears.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G109 -V090\n\n$(MID_SUBDIR)/mus_rg_rocket_hideout.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G133 -V090\n\n$(MID_SUBDIR)/mus_rg_follow_me.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G131 -V068\n\n$(MID_SUBDIR)/mus_rg_victory_road.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G154 -V090\n\n$(MID_SUBDIR)/mus_rg_cycling.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G141 -V090\n\n$(MID_SUBDIR)/mus_rg_intro_fight.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G136 -V090\n\n$(MID_SUBDIR)/mus_rg_hall_of_fame.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G145 -V079\n\n$(MID_SUBDIR)/mus_rg_encounter_deoxys.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G184 -V079\n\n$(MID_SUBDIR)/mus_rg_credits.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G149 -V090\n\n$(MID_SUBDIR)/mus_rg_encounter_gym_leader.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G144 -V090\n\n$(MID_SUBDIR)/mus_rg_dex_rating.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G175 -V070 -P5\n\n$(MID_SUBDIR)/mus_rg_obtain_key_item.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G178 -V077 -P5\n\n$(MID_SUBDIR)/mus_rg_caught_intro.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G179 -V094 -P5\n\n$(MID_SUBDIR)/mus_rg_caught.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G170 -V100\n\n$(MID_SUBDIR)/mus_rg_cinnabar.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G138 -V090\n\n$(MID_SUBDIR)/mus_rg_gym.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G134 -V090\n\n$(MID_SUBDIR)/mus_rg_fuchsia.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G167 -V090\n\n$(MID_SUBDIR)/mus_rg_poke_jump.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G132 -V090\n\n$(MID_SUBDIR)/mus_rg_heal.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G140 -V090\n\n$(MID_SUBDIR)/mus_rg_oak_lab.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G160 -V075\n\n$(MID_SUBDIR)/mus_rg_berry_pick.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G132 -V090\n\n$(MID_SUBDIR)/mus_rg_vermillion.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G172 -V090\n\n$(MID_SUBDIR)/mus_rg_route1.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G150 -V079\n\n$(MID_SUBDIR)/mus_rg_route3.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G152 -V083\n\n$(MID_SUBDIR)/mus_rg_route11.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G153 -V090\n\n$(MID_SUBDIR)/mus_rg_pallet.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G159 -V100\n\n$(MID_SUBDIR)/mus_rg_surf.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G164 -V071\n\n$(MID_SUBDIR)/mus_rg_sevii_45.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G188 -V084\n\n$(MID_SUBDIR)/mus_rg_sevii_67.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G189 -V084\n\n$(MID_SUBDIR)/mus_rg_sevii_123.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G173 -V084\n\n$(MID_SUBDIR)/mus_rg_sevii_cave.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G147 -V090\n\n$(MID_SUBDIR)/mus_rg_sevii_dungeon.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G146 -V090\n\n$(MID_SUBDIR)/mus_rg_sevii_route.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G187 -V080\n\n$(MID_SUBDIR)/mus_rg_net_center.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G162 -V096\n\n$(MID_SUBDIR)/mus_rg_pewter.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G173 -V084\n\n$(MID_SUBDIR)/mus_rg_oak.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G161 -V086\n\n$(MID_SUBDIR)/mus_rg_mystery_gift.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G183 -V100\n\n$(MID_SUBDIR)/mus_rg_route24.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G151 -V086\n\n$(MID_SUBDIR)/mus_rg_teachy_tv_show.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G131 -V068\n\n$(MID_SUBDIR)/mus_rg_mt_moon.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G147 -V090\n\n$(MID_SUBDIR)/mus_rg_poke_tower.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G165 -V090\n\n$(MID_SUBDIR)/mus_rg_poke_center.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G162 -V096\n\n$(MID_SUBDIR)/mus_rg_poke_flute.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G165 -V048 -P5\n\n$(MID_SUBDIR)/mus_rg_poke_mansion.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G148 -V090\n\n$(MID_SUBDIR)/mus_rg_jigglypuff.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G135 -V068 -P5\n\n$(MID_SUBDIR)/mus_rg_encounter_rival.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G174 -V079\n\n$(MID_SUBDIR)/mus_rg_rival_exit.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G174 -V079\n\n$(MID_SUBDIR)/mus_rg_encounter_rocket.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G142 -V096\n\n$(MID_SUBDIR)/mus_rg_ss_anne.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G163 -V090\n\n$(MID_SUBDIR)/mus_rg_new_game_exit.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G182 -V088\n\n$(MID_SUBDIR)/mus_rg_new_game_intro.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G182 -V088\n\n$(MID_SUBDIR)/mus_rg_lavender.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G139 -V090\n\n$(MID_SUBDIR)/mus_rg_silph.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G166 -V076\n\n$(MID_SUBDIR)/mus_rg_encounter_girl.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G143 -V051\n\n$(MID_SUBDIR)/mus_rg_encounter_boy.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G144 -V090\n\n$(MID_SUBDIR)/mus_rg_game_corner.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G132 -V090\n\n$(MID_SUBDIR)/mus_rg_slow_pallet.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G159 -V092\n\n$(MID_SUBDIR)/mus_rg_new_game_instruct.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G182 -V085\n\n$(MID_SUBDIR)/mus_rg_viridian_forest.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G146 -V090\n\n$(MID_SUBDIR)/mus_rg_trainer_tower.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G134 -V090\n\n$(MID_SUBDIR)/mus_rg_celadon.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G168 -V070\n\n$(MID_SUBDIR)/mus_rg_title.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G137 -V090\n\n$(MID_SUBDIR)/mus_rg_game_freak.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G181 -V075\n\n$(MID_SUBDIR)/mus_rg_teachy_tv_menu.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G186 -V059\n\n$(MID_SUBDIR)/mus_rg_union_room.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G132 -V090\n\n$(MID_SUBDIR)/mus_rg_vs_legend.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G157 -V090\n\n$(MID_SUBDIR)/mus_rg_vs_deoxys.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G185 -V080\n\n$(MID_SUBDIR)/mus_rg_vs_gym_leader.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G155 -V090\n\n$(MID_SUBDIR)/mus_rg_vs_champion.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G158 -V090\n\n$(MID_SUBDIR)/mus_rg_vs_mewtwo.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G157 -V090\n\n$(MID_SUBDIR)/mus_rg_vs_trainer.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G156 -V090\n\n$(MID_SUBDIR)/mus_rg_vs_wild.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G157 -V090\n\n$(MID_SUBDIR)/mus_rg_victory_gym_leader.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G171 -V090\n\n$(MID_SUBDIR)/mus_rg_victory_trainer.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G169 -V089\n\n$(MID_SUBDIR)/mus_rg_victory_wild.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G170 -V090\n\n$(MID_SUBDIR)/mus_cable_car.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G071 -V078\n\n$(MID_SUBDIR)/mus_sootopolis.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G091 -V062\n\n$(MID_SUBDIR)/mus_safari_zone.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G074 -V082\n\n$(MID_SUBDIR)/mus_b_tower.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G110 -V100\n\n$(MID_SUBDIR)/mus_evolution.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G026 -V080\n\n$(MID_SUBDIR)/mus_encounter_elite_four.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G096 -V078\n\n$(MID_SUBDIR)/mus_c_vs_legend_beast.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -V080\n\n$(MID_SUBDIR)/mus_encounter_swimmer.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G036 -V080\n\n$(MID_SUBDIR)/mus_encounter_girl.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G027 -V080\n\n$(MID_SUBDIR)/mus_intro_battle.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G088 -V088\n\n$(MID_SUBDIR)/mus_encounter_rich.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G043 -V094\n\n$(MID_SUBDIR)/mus_link_contest_p1.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G039 -V079\n\n$(MID_SUBDIR)/mus_link_contest_p2.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G040 -V090\n\n$(MID_SUBDIR)/mus_link_contest_p3.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G041 -V075\n\n$(MID_SUBDIR)/mus_link_contest_p4.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G042 -V090\n\n$(MID_SUBDIR)/mus_littleroot_test.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G034 -V099\n\n$(MID_SUBDIR)/mus_credits.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G101 -V100\n\n$(MID_SUBDIR)/mus_title.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G059 -V090\n\n$(MID_SUBDIR)/mus_fallarbor.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G083 -V100\n\n$(MID_SUBDIR)/mus_mt_chimney.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G052 -V078\n\n$(MID_SUBDIR)/mus_follow_me.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G066 -V074\n\n$(MID_SUBDIR)/mus_vs_frontier_brain.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G115 -V090 -P1\n\n$(MID_SUBDIR)/mus_vs_mew.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G116 -V090\n\n$(MID_SUBDIR)/mus_vs_rayquaza.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G114 -V080 -P1\n\n$(MID_SUBDIR)/mus_encounter_hiker.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G097 -V076\n\n$(MID_SUBDIR)/ph_choice_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_choice_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_choice_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_cloth_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_cloth_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_cloth_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_cure_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_cure_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_cure_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_dress_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_dress_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_dress_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_face_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_face_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_face_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_fleece_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_fleece_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_fleece_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_foot_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_foot_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_foot_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_goat_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_goat_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_goat_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_goose_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_goose_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_goose_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_kit_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_kit_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_kit_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_lot_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_lot_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_lot_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_mouth_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_mouth_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_mouth_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_nurse_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_nurse_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_nurse_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_price_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_price_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_price_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_strut_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_strut_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_strut_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_thought_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_thought_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_thought_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_trap_blend.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_trap_held.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/ph_trap_solo.s: %.s: %.mid\n\t$(MID) $< $@ -E -G130 -P4\n\n$(MID_SUBDIR)/se_a.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V095 -P4\n\n$(MID_SUBDIR)/se_bang.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_taillow_wing_flap.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P5\n\n$(MID_SUBDIR)/se_glass_flute.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P5\n\n$(MID_SUBDIR)/se_boo.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P4\n\n$(MID_SUBDIR)/se_ball.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V070 -P4\n\n$(MID_SUBDIR)/se_ball_open.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5\n\n$(MID_SUBDIR)/se_mugshot.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P5\n\n$(MID_SUBDIR)/se_contest_heart.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P5\n\n$(MID_SUBDIR)/se_contest_curtain_fall.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V070 -P5\n\n$(MID_SUBDIR)/se_contest_curtain_rise.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V070 -P5\n\n$(MID_SUBDIR)/se_contest_icon_change.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P5\n\n$(MID_SUBDIR)/se_contest_mons_turn.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P5\n\n$(MID_SUBDIR)/se_contest_icon_clear.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P5\n\n$(MID_SUBDIR)/se_card.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P4\n\n$(MID_SUBDIR)/se_pike_curtain_close.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5\n\n$(MID_SUBDIR)/se_pike_curtain_open.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5\n\n$(MID_SUBDIR)/se_ledge.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P4\n\n$(MID_SUBDIR)/se_itemfinder.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P5\n\n$(MID_SUBDIR)/se_applause.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P5\n\n$(MID_SUBDIR)/se_field_poison.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P5\n\n$(MID_SUBDIR)/se_door.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V080 -P5\n\n$(MID_SUBDIR)/se_e.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P4\n\n$(MID_SUBDIR)/se_elevator.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4\n\n$(MID_SUBDIR)/se_escalator.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4\n\n$(MID_SUBDIR)/se_exp.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V080 -P5\n\n$(MID_SUBDIR)/se_exp_max.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V094 -P5\n\n$(MID_SUBDIR)/se_fu_zaku.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V120 -P4\n\n$(MID_SUBDIR)/se_contest_condition_lose.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P4\n\n$(MID_SUBDIR)/se_lavaridge_fall_warp.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -P4\n\n$(MID_SUBDIR)/se_balloon_red.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P4\n\n$(MID_SUBDIR)/se_balloon_blue.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P4\n\n$(MID_SUBDIR)/se_balloon_yellow.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P4\n\n$(MID_SUBDIR)/se_arena_timeup1.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5\n\n$(MID_SUBDIR)/se_arena_timeup2.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5\n\n$(MID_SUBDIR)/se_bridge_walk.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V095 -P4\n\n$(MID_SUBDIR)/se_failure.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V120 -P4\n\n$(MID_SUBDIR)/se_rotating_gate.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P4\n\n$(MID_SUBDIR)/se_low_health.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P3\n\n$(MID_SUBDIR)/se_i.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P4\n\n$(MID_SUBDIR)/se_sliding_door.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V095 -P4\n\n$(MID_SUBDIR)/se_vend.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_bike_hop.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P4\n\n$(MID_SUBDIR)/se_bike_bell.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P4\n\n$(MID_SUBDIR)/se_contest_place.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P4\n\n$(MID_SUBDIR)/se_exit.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V120 -P5\n\n$(MID_SUBDIR)/se_use_item.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5\n\n$(MID_SUBDIR)/se_unlock.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4\n\n$(MID_SUBDIR)/se_ball_bounce_1.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4\n\n$(MID_SUBDIR)/se_ball_bounce_2.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4\n\n$(MID_SUBDIR)/se_ball_bounce_3.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4\n\n$(MID_SUBDIR)/se_ball_bounce_4.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4\n\n$(MID_SUBDIR)/se_super_effective.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P5\n\n$(MID_SUBDIR)/se_not_effective.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P5\n\n$(MID_SUBDIR)/se_effective.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P5\n\n$(MID_SUBDIR)/se_puddle.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V020 -P4\n\n$(MID_SUBDIR)/se_berry_blender.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P4\n\n$(MID_SUBDIR)/se_switch.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P4\n\n$(MID_SUBDIR)/se_n.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -P4\n\n$(MID_SUBDIR)/se_ball_throw.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P5\n\n$(MID_SUBDIR)/se_ship.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V075 -P4\n\n$(MID_SUBDIR)/se_flee.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P5\n\n$(MID_SUBDIR)/se_o.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P4\n\n$(MID_SUBDIR)/se_intro_blast.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5\n\n$(MID_SUBDIR)/se_pc_login.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5\n\n$(MID_SUBDIR)/se_pc_off.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5\n\n$(MID_SUBDIR)/se_pc_on.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5\n\n$(MID_SUBDIR)/se_pin.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V060 -P4\n\n$(MID_SUBDIR)/se_ding_dong.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P5\n\n$(MID_SUBDIR)/se_pokenav_off.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5\n\n$(MID_SUBDIR)/se_pokenav_on.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5\n\n$(MID_SUBDIR)/se_faint.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P5\n\n$(MID_SUBDIR)/se_shiny.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V095 -P5\n\n$(MID_SUBDIR)/se_shop.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P5\n\n$(MID_SUBDIR)/se_rg_bag_cursor.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5\n\n$(MID_SUBDIR)/se_rg_card_flip.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5\n\n$(MID_SUBDIR)/se_rg_card_flipping.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -P5\n\n$(MID_SUBDIR)/se_rg_card_open.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -V112 -P5\n\n$(MID_SUBDIR)/se_rg_deoxys_move.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -V080 -P5\n\n$(MID_SUBDIR)/se_rg_poke_jump_success.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P5\n\n$(MID_SUBDIR)/se_rg_ball_click.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -V100 -P5\n\n$(MID_SUBDIR)/se_rg_help_close.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -V095 -P5\n\n$(MID_SUBDIR)/se_rg_help_error.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -V125 -P5\n\n$(MID_SUBDIR)/se_rg_help_open.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -V096 -P5\n\n$(MID_SUBDIR)/se_rg_ss_anne_horn.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -V096 -P5\n\n$(MID_SUBDIR)/se_rg_poke_jump_failure.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -P5\n\n$(MID_SUBDIR)/se_rg_shop.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -V080 -P5\n\n$(MID_SUBDIR)/se_rg_door.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -V100 -P5\n\n$(MID_SUBDIR)/se_ice_crack.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P4\n\n$(MID_SUBDIR)/se_ice_stairs.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P4\n\n$(MID_SUBDIR)/se_ice_break.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4\n\n$(MID_SUBDIR)/se_fall.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_save.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V080 -P5\n\n$(MID_SUBDIR)/se_success.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V080 -P4\n\n$(MID_SUBDIR)/se_select.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V080 -P5\n\n$(MID_SUBDIR)/se_ball_trade.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5\n\n$(MID_SUBDIR)/se_thunderstorm.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V080 -P2\n\n$(MID_SUBDIR)/se_thunderstorm_stop.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V080 -P2\n\n$(MID_SUBDIR)/se_thunder.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P3\n\n$(MID_SUBDIR)/se_thunder2.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P3\n\n$(MID_SUBDIR)/se_rain.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V080 -P2\n\n$(MID_SUBDIR)/se_rain_stop.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V080 -P2\n\n$(MID_SUBDIR)/se_downpour.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P2\n\n$(MID_SUBDIR)/se_downpour_stop.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P2\n\n$(MID_SUBDIR)/se_orb.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P5\n\n$(MID_SUBDIR)/se_egg_hatch.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P5\n\n$(MID_SUBDIR)/se_roulette_ball.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P2\n\n$(MID_SUBDIR)/se_roulette_ball2.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P2\n\n$(MID_SUBDIR)/se_ball_tray_exit.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V100 -P5\n\n$(MID_SUBDIR)/se_ball_tray_ball.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P5\n\n$(MID_SUBDIR)/se_ball_tray_enter.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P5\n\n$(MID_SUBDIR)/se_click.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V110 -P4\n\n$(MID_SUBDIR)/se_warp_in.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P4\n\n$(MID_SUBDIR)/se_warp_out.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P4\n\n$(MID_SUBDIR)/se_pokenav_call.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -V120 -P5\n\n$(MID_SUBDIR)/se_pokenav_hang_up.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -V110 -P5\n\n$(MID_SUBDIR)/se_note_a.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_note_b.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_note_c.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_note_c_high.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_note_d.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_mud_ball.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_note_e.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_note_f.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_note_g.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_breakable_door.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_truck_door.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_truck_unload.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -P4\n\n$(MID_SUBDIR)/se_truck_move.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -P4\n\n$(MID_SUBDIR)/se_truck_stop.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -P4\n\n$(MID_SUBDIR)/se_repel.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -V090 -P4\n\n$(MID_SUBDIR)/se_u.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -P4\n\n$(MID_SUBDIR)/se_sudowoodo_shake.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G129 -V077 -P5\n\n$(MID_SUBDIR)/se_m_double_slap.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_comet_punch.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P4\n\n$(MID_SUBDIR)/se_m_pay_day.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V095 -P4\n\n$(MID_SUBDIR)/se_m_fire_punch.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_scratch.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_vicegrip.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_razor_wind.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_razor_wind2.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P4\n\n$(MID_SUBDIR)/se_m_swords_dance.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4\n\n$(MID_SUBDIR)/se_m_cut.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V120 -P4\n\n$(MID_SUBDIR)/se_m_gust.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_gust2.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_wing_attack.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P4\n\n$(MID_SUBDIR)/se_m_fly.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_bind.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V100 -P4\n\n$(MID_SUBDIR)/se_m_mega_kick.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V090 -P4\n\n$(MID_SUBDIR)/se_m_mega_kick2.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_jump_kick.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_sand_attack.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_headbutt.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_horn_attack.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_take_down.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V105 -P4\n\n$(MID_SUBDIR)/se_m_tail_whip.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_m_leer.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G128 -V110 -P4\n\n$(MID_SUBDIR)/se_dex_search.s: %.s: %.mid\n\t$(MID) $< $@ -E -R$(STD_REVERB) -G127 -v100 -P5\n"
  },
  {
    "path": "sound/MPlayDef.s",
    "content": "\t.equ\tW00,\t0x80\t\t@ WAIT\n\t.equ\tW01,\tW00+1\t\t@\n\t.equ\tW02,\tW00+2\t\t@\n\t.equ\tW03,\tW00+3\t\t@\n\t.equ\tW04,\tW00+4\t\t@\n\t.equ\tW05,\tW00+5\t\t@\n\t.equ\tW06,\tW00+6\t\t@\n\t.equ\tW07,\tW00+7\t\t@\n\t.equ\tW08,\tW00+8\t\t@\n\t.equ\tW09,\tW00+9\t\t@\n\t.equ\tW10,\tW00+10\t\t@\n\t.equ\tW11,\tW00+11\t\t@\n\t.equ\tW12,\tW00+12\t\t@\n\t.equ\tW13,\tW00+13\t\t@\n\t.equ\tW14,\tW00+14\t\t@\n\t.equ\tW15,\tW00+15\t\t@\n\t.equ\tW16,\tW00+16\t\t@\n\t.equ\tW17,\tW00+17\t\t@\n\t.equ\tW18,\tW00+18\t\t@\n\t.equ\tW19,\tW00+19\t\t@\n\t.equ\tW20,\tW00+20\t\t@\n\t.equ\tW21,\tW00+21\t\t@\n\t.equ\tW22,\tW00+22\t\t@\n\t.equ\tW23,\tW00+23\t\t@\n\t.equ\tW24,\tW00+24\t\t@\n\t.equ\tW28,\tW00+25\t\t@\n\t.equ\tW30,\tW00+26\t\t@\n\t.equ\tW32,\tW00+27\t\t@\n\t.equ\tW36,\tW00+28\t\t@\n\t.equ\tW40,\tW00+29\t\t@\n\t.equ\tW42,\tW00+30\t\t@\n\t.equ\tW44,\tW00+31\t\t@\n\t.equ\tW48,\tW00+32\t\t@\n\t.equ\tW52,\tW00+33\t\t@\n\t.equ\tW54,\tW00+34\t\t@\n\t.equ\tW56,\tW00+35\t\t@\n\t.equ\tW60,\tW00+36\t\t@\n\t.equ\tW64,\tW00+37\t\t@\n\t.equ\tW66,\tW00+38\t\t@\n\t.equ\tW68,\tW00+39\t\t@\n\t.equ\tW72,\tW00+40\t\t@\n\t.equ\tW76,\tW00+41\t\t@\n\t.equ\tW78,\tW00+42\t\t@\n\t.equ\tW80,\tW00+43\t\t@\n\t.equ\tW84,\tW00+44\t\t@\n\t.equ\tW88,\tW00+45\t\t@\n\t.equ\tW90,\tW00+46\t\t@\n\t.equ\tW92,\tW00+47\t\t@\n\t.equ\tW96,\tW00+48\t\t@\n\n\t.equ\tFINE,\t0xb1\t\t@ fine\n\t.equ\tGOTO,\t0xb2\t\t@ goto\n\t.equ\tPATT,\t0xb3\t\t@ pattern play\n\t.equ\tPEND,\t0xb4\t\t@ pattern end\n\t.equ\tREPT,\t0xb5\t\t@ repeat\n\t.equ\tMEMACC,\t0xb9\t\t@ memacc op adr dat ***lib\n\t.equ\tPRIO,\t0xba\t\t@ priority\n\t.equ\tTEMPO,\t0xbb\t\t@ tempo (BPM/2)\n\t.equ\tKEYSH,\t0xbc\t\t@ key shift\n\t.equ\tVOICE,\t0xbd\t\t@ voice #\n\t.equ\tVOL,\t0xbe\t\t@ volume\n\t.equ\tPAN,\t0xbf\t\t@ panpot (c_v+??)\n\t.equ\tBEND,\t0xc0\t\t@ pitch bend (c_v+??)\n\t.equ\tBENDR,\t0xc1\t\t@ bend range\n\t.equ\tLFOS,\t0xc2\t\t@ LFO speed\n\t.equ\tLFODL,\t0xc3\t\t@ LFO delay\n\t.equ\tMOD,\t0xc4\t\t@ modulation depth\n\t.equ\tMODT,\t0xc5\t\t@ modulation type\n\t.equ\tTUNE,\t0xc8\t\t@ micro tuning (c_v+??)\n\n\t.equ\tXCMD,\t0xcd\t\t@ extend command  ***lib\n\t .equ\txIECV,\t0x08\t\t@  imi.echo vol   ***lib\n\t .equ\txIECL,\t0x09\t\t@  imi.echo len   ***lib\n\n\t.equ\tEOT,\t0xce\t\t@ End of Tie\n\t.equ\tTIE,\t0xcf\t\t@\n\t.equ\tN01,\tTIE+1\t\t@ NOTE\n\t.equ\tN02,\tN01+1\t\t@\n\t.equ\tN03,\tN01+2\t\t@\n\t.equ\tN04,\tN01+3\t\t@\n\t.equ\tN05,\tN01+4\t\t@\n\t.equ\tN06,\tN01+5\t\t@\n\t.equ\tN07,\tN01+6\t\t@\n\t.equ\tN08,\tN01+7\t\t@\n\t.equ\tN09,\tN01+8\t\t@\n\t.equ\tN10,\tN01+9\t\t@\n\t.equ\tN11,\tN01+10\t\t@\n\t.equ\tN12,\tN01+11\t\t@\n\t.equ\tN13,\tN01+12\t\t@\n\t.equ\tN14,\tN01+13\t\t@\n\t.equ\tN15,\tN01+14\t\t@\n\t.equ\tN16,\tN01+15\t\t@\n\t.equ\tN17,\tN01+16\t\t@\n\t.equ\tN18,\tN01+17\t\t@\n\t.equ\tN19,\tN01+18\t\t@\n\t.equ\tN20,\tN01+19\t\t@\n\t.equ\tN21,\tN01+20\t\t@\n\t.equ\tN22,\tN01+21\t\t@\n\t.equ\tN23,\tN01+22\t\t@\n\t.equ\tN24,\tN01+23\t\t@\n\t.equ\tN28,\tN01+24\t\t@\n\t.equ\tN30,\tN01+25\t\t@\n\t.equ\tN32,\tN01+26\t\t@\n\t.equ\tN36,\tN01+27\t\t@\n\t.equ\tN40,\tN01+28\t\t@\n\t.equ\tN42,\tN01+29\t\t@\n\t.equ\tN44,\tN01+30\t\t@\n\t.equ\tN48,\tN01+31\t\t@\n\t.equ\tN52,\tN01+32\t\t@\n\t.equ\tN54,\tN01+33\t\t@\n\t.equ\tN56,\tN01+34\t\t@\n\t.equ\tN60,\tN01+35\t\t@\n\t.equ\tN64,\tN01+36\t\t@\n\t.equ\tN66,\tN01+37\t\t@\n\t.equ\tN68,\tN01+38\t\t@\n\t.equ\tN72,\tN01+39\t\t@\n\t.equ\tN76,\tN01+40\t\t@\n\t.equ\tN78,\tN01+41\t\t@\n\t.equ\tN80,\tN01+42\t\t@\n\t.equ\tN84,\tN01+43\t\t@\n\t.equ\tN88,\tN01+44\t\t@\n\t.equ\tN90,\tN01+45\t\t@\n\t.equ\tN92,\tN01+46\t\t@\n\t.equ\tN96,\tN01+47\t\t@\n\n@ maximum value for volume\n\n\t.equ\tmxv,\t0x7F\t\t@\n\n@ center value of PAN, BEND, TUNE\n\n\t.equ\tc_v,\t0x40\t\t@ -64 ~ +63\n\n@ note for N??, TIE, EOT\n\n\t.equ\tCnM2,\t0\t\t@\n\t.equ\tCsM2,\t1\t\t@\n\t.equ\tDnM2,\t2\t\t@\n\t.equ\tDsM2,\t3\t\t@\n\t.equ\tEnM2,\t4\t\t@\n\t.equ\tFnM2,\t5\t\t@\n\t.equ\tFsM2,\t6\t\t@\n\t.equ\tGnM2,\t7\t\t@\n\t.equ\tGsM2,\t8\t\t@\n\t.equ\tAnM2,\t9\t\t@\n\t.equ\tAsM2,\t10\t\t@\n\t.equ\tBnM2,\t11\t\t@\n\t.equ\tCnM1,\t12\t\t@\n\t.equ\tCsM1,\t13\t\t@\n\t.equ\tDnM1,\t14\t\t@\n\t.equ\tDsM1,\t15\t\t@\n\t.equ\tEnM1,\t16\t\t@\n\t.equ\tFnM1,\t17\t\t@\n\t.equ\tFsM1,\t18\t\t@\n\t.equ\tGnM1,\t19\t\t@\n\t.equ\tGsM1,\t20\t\t@\n\t.equ\tAnM1,\t21\t\t@\n\t.equ\tAsM1,\t22\t\t@\n\t.equ\tBnM1,\t23\t\t@\n\t.equ\tCn0,\t24\t\t@\n\t.equ\tCs0,\t25\t\t@\n\t.equ\tDn0,\t26\t\t@\n\t.equ\tDs0,\t27\t\t@\n\t.equ\tEn0,\t28\t\t@\n\t.equ\tFn0,\t29\t\t@\n\t.equ\tFs0,\t30\t\t@\n\t.equ\tGn0,\t31\t\t@\n\t.equ\tGs0,\t32\t\t@\n\t.equ\tAn0,\t33\t\t@\n\t.equ\tAs0,\t34\t\t@\n\t.equ\tBn0,\t35\t\t@\n\t.equ\tCn1,\t36\t\t@\n\t.equ\tCs1,\t37\t\t@\n\t.equ\tDn1,\t38\t\t@\n\t.equ\tDs1,\t39\t\t@\n\t.equ\tEn1,\t40\t\t@\n\t.equ\tFn1,\t41\t\t@\n\t.equ\tFs1,\t42\t\t@\n\t.equ\tGn1,\t43\t\t@\n\t.equ\tGs1,\t44\t\t@\n\t.equ\tAn1,\t45\t\t@\n\t.equ\tAs1,\t46\t\t@\n\t.equ\tBn1,\t47\t\t@\n\t.equ\tCn2,\t48\t\t@\n\t.equ\tCs2,\t49\t\t@\n\t.equ\tDn2,\t50\t\t@\n\t.equ\tDs2,\t51\t\t@\n\t.equ\tEn2,\t52\t\t@\n\t.equ\tFn2,\t53\t\t@\n\t.equ\tFs2,\t54\t\t@\n\t.equ\tGn2,\t55\t\t@\n\t.equ\tGs2,\t56\t\t@\n\t.equ\tAn2,\t57\t\t@\n\t.equ\tAs2,\t58\t\t@\n\t.equ\tBn2,\t59\t\t@\n\t.equ\tCn3,\t60\t\t@\n\t.equ\tCs3,\t61\t\t@\n\t.equ\tDn3,\t62\t\t@\n\t.equ\tDs3,\t63\t\t@\n\t.equ\tEn3,\t64\t\t@\n\t.equ\tFn3,\t65\t\t@\n\t.equ\tFs3,\t66\t\t@\n\t.equ\tGn3,\t67\t\t@\n\t.equ\tGs3,\t68\t\t@\n\t.equ\tAn3,\t69\t\t@ 440Hz\n\t.equ\tAs3,\t70\t\t@\n\t.equ\tBn3,\t71\t\t@\n\t.equ\tCn4,\t72\t\t@\n\t.equ\tCs4,\t73\t\t@\n\t.equ\tDn4,\t74\t\t@\n\t.equ\tDs4,\t75\t\t@\n\t.equ\tEn4,\t76\t\t@\n\t.equ\tFn4,\t77\t\t@\n\t.equ\tFs4,\t78\t\t@\n\t.equ\tGn4,\t79\t\t@\n\t.equ\tGs4,\t80\t\t@\n\t.equ\tAn4,\t81\t\t@\n\t.equ\tAs4,\t82\t\t@\n\t.equ\tBn4,\t83\t\t@\n\t.equ\tCn5,\t84\t\t@\n\t.equ\tCs5,\t85\t\t@\n\t.equ\tDn5,\t86\t\t@\n\t.equ\tDs5,\t87\t\t@\n\t.equ\tEn5,\t88\t\t@\n\t.equ\tFn5,\t89\t\t@\n\t.equ\tFs5,\t90\t\t@\n\t.equ\tGn5,\t91\t\t@\n\t.equ\tGs5,\t92\t\t@\n\t.equ\tAn5,\t93\t\t@\n\t.equ\tAs5,\t94\t\t@\n\t.equ\tBn5,\t95\t\t@\n\t.equ\tCn6,\t96\t\t@\n\t.equ\tCs6,\t97\t\t@\n\t.equ\tDn6,\t98\t\t@\n\t.equ\tDs6,\t99\t\t@\n\t.equ\tEn6,\t100\t\t@\n\t.equ\tFn6,\t101\t\t@\n\t.equ\tFs6,\t102\t\t@\n\t.equ\tGn6,\t103\t\t@\n\t.equ\tGs6,\t104\t\t@\n\t.equ\tAn6,\t105\t\t@\n\t.equ\tAs6,\t106\t\t@\n\t.equ\tBn6,\t107\t\t@\n\t.equ\tCn7,\t108\t\t@\n\t.equ\tCs7,\t109\t\t@\n\t.equ\tDn7,\t110\t\t@\n\t.equ\tDs7,\t111\t\t@\n\t.equ\tEn7,\t112\t\t@\n\t.equ\tFn7,\t113\t\t@\n\t.equ\tFs7,\t114\t\t@\n\t.equ\tGn7,\t115\t\t@\n\t.equ\tGs7,\t116\t\t@\n\t.equ\tAn7,\t117\t\t@\n\t.equ\tAs7,\t118\t\t@\n\t.equ\tBn7,\t119\t\t@\n\t.equ\tCn8,\t120\t\t@\n\t.equ\tCs8,\t121\t\t@\n\t.equ\tDn8,\t122\t\t@\n\t.equ\tDs8,\t123\t\t@\n\t.equ\tEn8,\t124\t\t@\n\t.equ\tFn8,\t125\t\t@\n\t.equ\tFs8,\t126\t\t@\n\t.equ\tGn8,\t127\t\t@\n\n@ velocity\n\n\t.equ\tv000,\t0\t\t@\n\t.equ\tv001,\t1\t\t@\n\t.equ\tv002,\t2\t\t@\n\t.equ\tv003,\t3\t\t@\n\t.equ\tv004,\t4\t\t@\n\t.equ\tv005,\t5\t\t@\n\t.equ\tv006,\t6\t\t@\n\t.equ\tv007,\t7\t\t@\n\t.equ\tv008,\t8\t\t@\n\t.equ\tv009,\t9\t\t@\n\t.equ\tv010,\t10\t\t@\n\t.equ\tv011,\t11\t\t@\n\t.equ\tv012,\t12\t\t@\n\t.equ\tv013,\t13\t\t@\n\t.equ\tv014,\t14\t\t@\n\t.equ\tv015,\t15\t\t@\n\t.equ\tv016,\t16\t\t@\n\t.equ\tv017,\t17\t\t@\n\t.equ\tv018,\t18\t\t@\n\t.equ\tv019,\t19\t\t@\n\t.equ\tv020,\t20\t\t@\n\t.equ\tv021,\t21\t\t@\n\t.equ\tv022,\t22\t\t@\n\t.equ\tv023,\t23\t\t@\n\t.equ\tv024,\t24\t\t@\n\t.equ\tv025,\t25\t\t@\n\t.equ\tv026,\t26\t\t@\n\t.equ\tv027,\t27\t\t@\n\t.equ\tv028,\t28\t\t@\n\t.equ\tv029,\t29\t\t@\n\t.equ\tv030,\t30\t\t@\n\t.equ\tv031,\t31\t\t@\n\t.equ\tv032,\t32\t\t@\n\t.equ\tv033,\t33\t\t@\n\t.equ\tv034,\t34\t\t@\n\t.equ\tv035,\t35\t\t@\n\t.equ\tv036,\t36\t\t@\n\t.equ\tv037,\t37\t\t@\n\t.equ\tv038,\t38\t\t@\n\t.equ\tv039,\t39\t\t@\n\t.equ\tv040,\t40\t\t@\n\t.equ\tv041,\t41\t\t@\n\t.equ\tv042,\t42\t\t@\n\t.equ\tv043,\t43\t\t@\n\t.equ\tv044,\t44\t\t@\n\t.equ\tv045,\t45\t\t@\n\t.equ\tv046,\t46\t\t@\n\t.equ\tv047,\t47\t\t@\n\t.equ\tv048,\t48\t\t@\n\t.equ\tv049,\t49\t\t@\n\t.equ\tv050,\t50\t\t@\n\t.equ\tv051,\t51\t\t@\n\t.equ\tv052,\t52\t\t@\n\t.equ\tv053,\t53\t\t@\n\t.equ\tv054,\t54\t\t@\n\t.equ\tv055,\t55\t\t@\n\t.equ\tv056,\t56\t\t@\n\t.equ\tv057,\t57\t\t@\n\t.equ\tv058,\t58\t\t@\n\t.equ\tv059,\t59\t\t@\n\t.equ\tv060,\t60\t\t@\n\t.equ\tv061,\t61\t\t@\n\t.equ\tv062,\t62\t\t@\n\t.equ\tv063,\t63\t\t@\n\t.equ\tv064,\t64\t\t@\n\t.equ\tv065,\t65\t\t@\n\t.equ\tv066,\t66\t\t@\n\t.equ\tv067,\t67\t\t@\n\t.equ\tv068,\t68\t\t@\n\t.equ\tv069,\t69\t\t@\n\t.equ\tv070,\t70\t\t@\n\t.equ\tv071,\t71\t\t@\n\t.equ\tv072,\t72\t\t@\n\t.equ\tv073,\t73\t\t@\n\t.equ\tv074,\t74\t\t@\n\t.equ\tv075,\t75\t\t@\n\t.equ\tv076,\t76\t\t@\n\t.equ\tv077,\t77\t\t@\n\t.equ\tv078,\t78\t\t@\n\t.equ\tv079,\t79\t\t@\n\t.equ\tv080,\t80\t\t@\n\t.equ\tv081,\t81\t\t@\n\t.equ\tv082,\t82\t\t@\n\t.equ\tv083,\t83\t\t@\n\t.equ\tv084,\t84\t\t@\n\t.equ\tv085,\t85\t\t@\n\t.equ\tv086,\t86\t\t@\n\t.equ\tv087,\t87\t\t@\n\t.equ\tv088,\t88\t\t@\n\t.equ\tv089,\t89\t\t@\n\t.equ\tv090,\t90\t\t@\n\t.equ\tv091,\t91\t\t@\n\t.equ\tv092,\t92\t\t@\n\t.equ\tv093,\t93\t\t@\n\t.equ\tv094,\t94\t\t@\n\t.equ\tv095,\t95\t\t@\n\t.equ\tv096,\t96\t\t@\n\t.equ\tv097,\t97\t\t@\n\t.equ\tv098,\t98\t\t@\n\t.equ\tv099,\t99\t\t@\n\t.equ\tv100,\t100\t\t@\n\t.equ\tv101,\t101\t\t@\n\t.equ\tv102,\t102\t\t@\n\t.equ\tv103,\t103\t\t@\n\t.equ\tv104,\t104\t\t@\n\t.equ\tv105,\t105\t\t@\n\t.equ\tv106,\t106\t\t@\n\t.equ\tv107,\t107\t\t@\n\t.equ\tv108,\t108\t\t@\n\t.equ\tv109,\t109\t\t@\n\t.equ\tv110,\t110\t\t@\n\t.equ\tv111,\t111\t\t@\n\t.equ\tv112,\t112\t\t@\n\t.equ\tv113,\t113\t\t@\n\t.equ\tv114,\t114\t\t@\n\t.equ\tv115,\t115\t\t@\n\t.equ\tv116,\t116\t\t@\n\t.equ\tv117,\t117\t\t@\n\t.equ\tv118,\t118\t\t@\n\t.equ\tv119,\t119\t\t@\n\t.equ\tv120,\t120\t\t@\n\t.equ\tv121,\t121\t\t@\n\t.equ\tv122,\t122\t\t@\n\t.equ\tv123,\t123\t\t@\n\t.equ\tv124,\t124\t\t@\n\t.equ\tv125,\t125\t\t@\n\t.equ\tv126,\t126\t\t@\n\t.equ\tv127,\t127\t\t@\n\n@ exact gate time parameter for N??\n\n\t.equ\tgtp1,\t1\t\t@\n\t.equ\tgtp2,\t2\t\t@\n\t.equ\tgtp3,\t3\t\t@\n\n@ parameter of MODT\n\n\t.equ\tmod_vib,0\t\t@ vibrate\n\t.equ\tmod_tre,1\t\t@ tremolo\n\t.equ\tmod_pan,2\t\t@ auto-panpot\n\n@ parameter of MEMACC\n\n\t.equ\tmem_set,0\t\t@\n\t.equ\tmem_add,1\t\t@\n\t.equ\tmem_sub,2\t\t@\n\t.equ\tmem_mem_set,3\t\t@\n\t.equ\tmem_mem_add,4\t\t@\n\t.equ\tmem_mem_sub,5\t\t@\n\t.equ\tmem_beq,6\t\t@\n\t.equ\tmem_bne,7\t\t@\n\t.equ\tmem_bhi,8\t\t@\n\t.equ\tmem_bhs,9\t\t@\n\t.equ\tmem_bls,10\t\t@\n\t.equ\tmem_blo,11\t\t@\n\t.equ\tmem_mem_beq,12\t\t@\n\t.equ\tmem_mem_bne,13\t\t@\n\t.equ\tmem_mem_bhi,14\t\t@\n\t.equ\tmem_mem_bhs,15\t\t@\n\t.equ\tmem_mem_bls,16\t\t@\n\t.equ\tmem_mem_blo,17\t\t@\n\n\t.equ\treverb_set,0x80\t\t@ SOUND_MODE_REVERB_SET\n\t.equ\tPAM, PAN\t\t@\n"
  },
  {
    "path": "sound/cry_tables.inc",
    "content": "\t.align 2\ngCryTable::\n\tcry Cry_Bulbasaur\n\tcry Cry_Ivysaur\n\tcry Cry_Venusaur\n\tcry Cry_Charmander\n\tcry Cry_Charmeleon\n\tcry Cry_Charizard\n\tcry Cry_Squirtle\n\tcry Cry_Wartortle\n\tcry Cry_Blastoise\n\tcry Cry_Caterpie\n\tcry Cry_Metapod\n\tcry Cry_Butterfree\n\tcry Cry_Weedle\n\tcry Cry_Kakuna\n\tcry Cry_Beedrill\n\tcry Cry_Pidgey\n\tcry Cry_Pidgeotto\n\tcry Cry_Pidgeot\n\tcry Cry_Rattata\n\tcry Cry_Raticate\n\tcry Cry_Spearow\n\tcry Cry_Fearow\n\tcry Cry_Ekans\n\tcry Cry_Arbok\n\tcry Cry_Pikachu\n\tcry Cry_Raichu\n\tcry Cry_Sandshrew\n\tcry Cry_Sandslash\n\tcry Cry_NidoranF\n\tcry Cry_Nidorina\n\tcry Cry_Nidoqueen\n\tcry Cry_NidoranM\n\tcry Cry_Nidorino\n\tcry Cry_Nidoking\n\tcry Cry_Clefairy\n\tcry Cry_Clefable\n\tcry Cry_Vulpix\n\tcry Cry_Ninetales\n\tcry Cry_Jigglypuff\n\tcry Cry_Wigglytuff\n\tcry Cry_Zubat\n\tcry Cry_Golbat\n\tcry Cry_Oddish\n\tcry Cry_Gloom\n\tcry Cry_Vileplume\n\tcry Cry_Paras\n\tcry Cry_Parasect\n\tcry Cry_Venonat\n\tcry Cry_Venomoth\n\tcry Cry_Diglett\n\tcry Cry_Dugtrio\n\tcry Cry_Meowth\n\tcry Cry_Persian\n\tcry Cry_Psyduck\n\tcry Cry_Golduck\n\tcry Cry_Mankey\n\tcry Cry_Primeape\n\tcry Cry_Growlithe\n\tcry Cry_Arcanine\n\tcry Cry_Poliwag\n\tcry Cry_Poliwhirl\n\tcry Cry_Poliwrath\n\tcry Cry_Abra\n\tcry Cry_Kadabra\n\tcry Cry_Alakazam\n\tcry Cry_Machop\n\tcry Cry_Machoke\n\tcry Cry_Machamp\n\tcry Cry_Bellsprout\n\tcry Cry_Weepinbell\n\tcry Cry_Victreebel\n\tcry Cry_Tentacool\n\tcry Cry_Tentacruel\n\tcry Cry_Geodude\n\tcry Cry_Graveler\n\tcry Cry_Golem\n\tcry Cry_Ponyta\n\tcry Cry_Rapidash\n\tcry Cry_Slowpoke\n\tcry Cry_Slowbro\n\tcry Cry_Magnemite\n\tcry Cry_Magneton\n\tcry Cry_Farfetchd\n\tcry Cry_Doduo\n\tcry Cry_Dodrio\n\tcry Cry_Seel\n\tcry Cry_Dewgong\n\tcry Cry_Grimer\n\tcry Cry_Muk\n\tcry Cry_Shellder\n\tcry Cry_Cloyster\n\tcry Cry_Gastly\n\tcry Cry_Haunter\n\tcry Cry_Gengar\n\tcry Cry_Onix\n\tcry Cry_Drowzee\n\tcry Cry_Hypno\n\tcry Cry_Krabby\n\tcry Cry_Kingler\n\tcry Cry_Voltorb\n\tcry Cry_Electrode\n\tcry Cry_Exeggcute\n\tcry Cry_Exeggutor\n\tcry Cry_Cubone\n\tcry Cry_Marowak\n\tcry Cry_Hitmonlee\n\tcry Cry_Hitmonchan\n\tcry Cry_Lickitung\n\tcry Cry_Koffing\n\tcry Cry_Weezing\n\tcry Cry_Rhyhorn\n\tcry Cry_Rhydon\n\tcry Cry_Chansey\n\tcry Cry_Tangela\n\tcry Cry_Kangaskhan\n\tcry Cry_Horsea\n\tcry Cry_Seadra\n\tcry Cry_Goldeen\n\tcry Cry_Seaking\n\tcry Cry_Staryu\n\tcry Cry_Starmie\n\tcry Cry_MrMime\n\tcry Cry_Scyther\n\tcry Cry_Jynx\n\tcry Cry_Electabuzz\n\tcry Cry_Magmar\n\tcry Cry_Pinsir\n\tcry Cry_Tauros\n\tcry Cry_Magikarp\n\tcry Cry_Gyarados\n\tcry Cry_Lapras\n\tcry Cry_Ditto\n\tcry Cry_Eevee\n\tcry Cry_Vaporeon\n\tcry Cry_Jolteon\n\tcry Cry_Flareon\n\tcry Cry_Porygon\n\tcry Cry_Omanyte\n\tcry Cry_Omastar\n\tcry Cry_Kabuto\n\tcry Cry_Kabutops\n\tcry Cry_Aerodactyl\n\tcry Cry_Snorlax\n\tcry Cry_Articuno\n\tcry Cry_Zapdos\n\tcry Cry_Moltres\n\tcry Cry_Dratini\n\tcry Cry_Dragonair\n\tcry Cry_Dragonite\n\tcry Cry_Mewtwo\n\tcry Cry_Mew\n\tcry Cry_Chikorita\n\tcry Cry_Bayleef\n\tcry Cry_Meganium\n\tcry Cry_Cyndaquil\n\tcry Cry_Quilava\n\tcry Cry_Typhlosion\n\tcry Cry_Totodile\n\tcry Cry_Croconaw\n\tcry Cry_Feraligatr\n\tcry Cry_Sentret\n\tcry Cry_Furret\n\tcry Cry_Hoothoot\n\tcry Cry_Noctowl\n\tcry Cry_Ledyba\n\tcry Cry_Ledian\n\tcry Cry_Spinarak\n\tcry Cry_Ariados\n\tcry Cry_Crobat\n\tcry Cry_Chinchou\n\tcry Cry_Lanturn\n\tcry Cry_Pichu\n\tcry Cry_Cleffa\n\tcry Cry_Igglybuff\n\tcry Cry_Togepi\n\tcry Cry_Togetic\n\tcry Cry_Natu\n\tcry Cry_Xatu\n\tcry Cry_Mareep\n\tcry Cry_Flaaffy\n\tcry Cry_Ampharos\n\tcry Cry_Bellossom\n\tcry Cry_Marill\n\tcry Cry_Azumarill\n\tcry Cry_Sudowoodo\n\tcry Cry_Politoed\n\tcry Cry_Hoppip\n\tcry Cry_Skiploom\n\tcry Cry_Jumpluff\n\tcry Cry_Aipom\n\tcry Cry_Sunkern\n\tcry Cry_Sunflora\n\tcry Cry_Yanma\n\tcry Cry_Wooper\n\tcry Cry_Quagsire\n\tcry Cry_Espeon\n\tcry Cry_Umbreon\n\tcry Cry_Murkrow\n\tcry Cry_Slowking\n\tcry Cry_Misdreavus\n\tcry Cry_Unown\n\tcry Cry_Wobbuffet\n\tcry Cry_Girafarig\n\tcry Cry_Pineco\n\tcry Cry_Forretress\n\tcry Cry_Dunsparce\n\tcry Cry_Gligar\n\tcry Cry_Steelix\n\tcry Cry_Snubbull\n\tcry Cry_Granbull\n\tcry Cry_Qwilfish\n\tcry Cry_Scizor\n\tcry Cry_Shuckle\n\tcry Cry_Heracross\n\tcry Cry_Sneasel\n\tcry Cry_Teddiursa\n\tcry Cry_Ursaring\n\tcry Cry_Slugma\n\tcry Cry_Magcargo\n\tcry Cry_Swinub\n\tcry Cry_Piloswine\n\tcry Cry_Corsola\n\tcry Cry_Remoraid\n\tcry Cry_Octillery\n\tcry Cry_Delibird\n\tcry Cry_Mantine\n\tcry Cry_Skarmory\n\tcry Cry_Houndour\n\tcry Cry_Houndoom\n\tcry Cry_Kingdra\n\tcry Cry_Phanpy\n\tcry Cry_Donphan\n\tcry Cry_Porygon2\n\tcry Cry_Stantler\n\tcry Cry_Smeargle\n\tcry Cry_Tyrogue\n\tcry Cry_Hitmontop\n\tcry Cry_Smoochum\n\tcry Cry_Elekid\n\tcry Cry_Magby\n\tcry Cry_Miltank\n\tcry Cry_Blissey\n\tcry Cry_Raikou\n\tcry Cry_Entei\n\tcry Cry_Suicune\n\tcry Cry_Larvitar\n\tcry Cry_Pupitar\n\tcry Cry_Tyranitar\n\tcry Cry_Lugia\n\tcry Cry_HoOh\n\tcry Cry_Celebi\n\tcry Cry_Kecleon\n\tcry Cry_Roselia\n\tcry Cry_Torkoal\n\tcry Cry_Electrike\n\tcry Cry_Manectric\n\tcry Cry_Duskull\n\tcry Cry_Latias\n\tcry Cry_Wynaut\n\tcry Cry_Seviper\n\tcry Cry_Sharpedo\n\tcry Cry_Zangoose\n\tcry Cry_Azurill\n\tcry Cry_Swablu\n\tcry Cry_Altaria\n\tcry Cry_Unused265\n\tcry Cry_Taillow\n\tcry Cry_Swellow\n\tcry Cry_Unused268\n\tcry Cry_Spinda\n\tcry Cry_Torchic\n\tcry Cry_Combusken\n\tcry Cry_Blaziken\n\tcry Cry_Treecko\n\tcry Cry_Grovyle\n\tcry Cry_Sceptile\n\tcry Cry_Mudkip\n\tcry Cry_Marshtomp\n\tcry Cry_Swampert\n\tcry Cry_Pelipper\n\tcry Cry_Wingull\n\tcry Cry_Banette\n\tcry Cry_Shuppet\n\tcry Cry_Lotad\n\tcry Cry_Lombre\n\tcry Cry_Ludicolo\n\tcry Cry_Seedot\n\tcry Cry_Nuzleaf\n\tcry Cry_Shiftry\n\tcry Cry_Carvanha\n\tcry Cry_Wurmple\n\tcry Cry_Silcoon\n\tcry Cry_Beautifly\n\tcry Cry_Cascoon\n\tcry Cry_Dustox\n\tcry Cry_Ralts\n\tcry Cry_Kirlia\n\tcry Cry_Gardevoir\n\tcry Cry_Slakoth\n\tcry Cry_Vigoroth\n\tcry Cry_Slaking\n\tcry Cry_Nincada\n\tcry Cry_Ninjask\n\tcry Cry_Shedinja\n\tcry Cry_Makuhita\n\tcry Cry_Hariyama\n\tcry Cry_Nosepass\n\tcry Cry_Glalie\n\tcry Cry_Plusle\n\tcry Cry_Minun\n\tcry Cry_Surskit\n\tcry Cry_Masquerain\n\tcry Cry_Skitty\n\tcry Cry_Delcatty\n\tcry Cry_Gulpin\n\tcry Cry_Swalot\n\tcry Cry_Numel\n\tcry Cry_Camerupt\n\tcry Cry_Barboach\n\tcry Cry_Whiscash\n\tcry Cry_Corphish\n\tcry Cry_Crawdaunt\n\tcry Cry_Spoink\n\tcry Cry_Grumpig\n\tcry Cry_Trapinch\n\tcry Cry_Vibrava\n\tcry Cry_Flygon\n\tcry Cry_Cacnea\n\tcry Cry_Cacturne\n\tcry Cry_Baltoy\n\tcry Cry_Claydol\n\tcry Cry_Lunatone\n\tcry Cry_Solrock\n\tcry Cry_Feebas\n\tcry Cry_Milotic\n\tcry Cry_Absol\n\tcry Cry_Meditite\n\tcry Cry_Medicham\n\tcry Cry_Spheal\n\tcry Cry_Sealeo\n\tcry Cry_Walrein\n\tcry Cry_Clamperl\n\tcry Cry_Huntail\n\tcry Cry_Gorebyss\n\tcry Cry_Lileep\n\tcry Cry_Cradily\n\tcry Cry_Anorith\n\tcry Cry_Armaldo\n\tcry Cry_Beldum\n\tcry Cry_Metang\n\tcry Cry_Metagross\n\tcry Cry_Bagon\n\tcry Cry_Shelgon\n\tcry Cry_Regirock\n\tcry Cry_Regice\n\tcry Cry_Registeel\n\tcry Cry_Castform\n\tcry Cry_Volbeat\n\tcry Cry_Illumise\n\tcry Cry_Poochyena\n\tcry Cry_Mightyena\n\tcry Cry_Dusclops\n\tcry Cry_Sableye\n\tcry Cry_Mawile\n\tcry Cry_Aron\n\tcry Cry_Lairon\n\tcry Cry_Aggron\n\tcry Cry_Relicanth\n\tcry Cry_Luvdisc\n\tcry Cry_Groudon\n\tcry Cry_Kyogre\n\tcry Cry_Rayquaza\n\tcry Cry_Salamence\n\tcry Cry_Breloom\n\tcry Cry_Shroomish\n\tcry Cry_Linoone\n\tcry Cry_Tropius\n\tcry Cry_Wailmer\n\tcry Cry_Zigzagoon\n\tcry Cry_Exploud\n\tcry Cry_Loudred\n\tcry Cry_Wailord\n\tcry Cry_Whismur\n\tcry Cry_Snorunt\n\tcry Cry_Latios\n\tcry Cry_Jirachi\n\tcry Cry_Deoxys\n\tcry Cry_Chimecho\n\n\t.align 2\ngCryTable_Reverse::\n\tcry_reverse Cry_Bulbasaur\n\tcry_reverse Cry_Ivysaur\n\tcry_reverse Cry_Venusaur\n\tcry_reverse Cry_Charmander\n\tcry_reverse Cry_Charmeleon\n\tcry_reverse Cry_Charizard\n\tcry_reverse Cry_Squirtle\n\tcry_reverse Cry_Wartortle\n\tcry_reverse Cry_Blastoise\n\tcry_reverse Cry_Caterpie\n\tcry_reverse Cry_Metapod\n\tcry_reverse Cry_Butterfree\n\tcry_reverse Cry_Weedle\n\tcry_reverse Cry_Kakuna\n\tcry_reverse Cry_Beedrill\n\tcry_reverse Cry_Pidgey\n\tcry_reverse Cry_Pidgeotto\n\tcry_reverse Cry_Pidgeot\n\tcry_reverse Cry_Rattata\n\tcry_reverse Cry_Raticate\n\tcry_reverse Cry_Spearow\n\tcry_reverse Cry_Fearow\n\tcry_reverse Cry_Ekans\n\tcry_reverse Cry_Arbok\n\tcry_reverse Cry_Pikachu\n\tcry_reverse Cry_Raichu\n\tcry_reverse Cry_Sandshrew\n\tcry_reverse Cry_Sandslash\n\tcry_reverse Cry_NidoranF\n\tcry_reverse Cry_Nidorina\n\tcry_reverse Cry_Nidoqueen\n\tcry_reverse Cry_NidoranM\n\tcry_reverse Cry_Nidorino\n\tcry_reverse Cry_Nidoking\n\tcry_reverse Cry_Clefairy\n\tcry_reverse Cry_Clefable\n\tcry_reverse Cry_Vulpix\n\tcry_reverse Cry_Ninetales\n\tcry_reverse Cry_Jigglypuff\n\tcry_reverse Cry_Wigglytuff\n\tcry_reverse Cry_Zubat\n\tcry_reverse Cry_Golbat\n\tcry_reverse Cry_Oddish\n\tcry_reverse Cry_Gloom\n\tcry_reverse Cry_Vileplume\n\tcry_reverse Cry_Paras\n\tcry_reverse Cry_Parasect\n\tcry_reverse Cry_Venonat\n\tcry_reverse Cry_Venomoth\n\tcry_reverse Cry_Diglett\n\tcry_reverse Cry_Dugtrio\n\tcry_reverse Cry_Meowth\n\tcry_reverse Cry_Persian\n\tcry_reverse Cry_Psyduck\n\tcry_reverse Cry_Golduck\n\tcry_reverse Cry_Mankey\n\tcry_reverse Cry_Primeape\n\tcry_reverse Cry_Growlithe\n\tcry_reverse Cry_Arcanine\n\tcry_reverse Cry_Poliwag\n\tcry_reverse Cry_Poliwhirl\n\tcry_reverse Cry_Poliwrath\n\tcry_reverse Cry_Abra\n\tcry_reverse Cry_Kadabra\n\tcry_reverse Cry_Alakazam\n\tcry_reverse Cry_Machop\n\tcry_reverse Cry_Machoke\n\tcry_reverse Cry_Machamp\n\tcry_reverse Cry_Bellsprout\n\tcry_reverse Cry_Weepinbell\n\tcry_reverse Cry_Victreebel\n\tcry_reverse Cry_Tentacool\n\tcry_reverse Cry_Tentacruel\n\tcry_reverse Cry_Geodude\n\tcry_reverse Cry_Graveler\n\tcry_reverse Cry_Golem\n\tcry_reverse Cry_Ponyta\n\tcry_reverse Cry_Rapidash\n\tcry_reverse Cry_Slowpoke\n\tcry_reverse Cry_Slowbro\n\tcry_reverse Cry_Magnemite\n\tcry_reverse Cry_Magneton\n\tcry_reverse Cry_Farfetchd\n\tcry_reverse Cry_Doduo\n\tcry_reverse Cry_Dodrio\n\tcry_reverse Cry_Seel\n\tcry_reverse Cry_Dewgong\n\tcry_reverse Cry_Grimer\n\tcry_reverse Cry_Muk\n\tcry_reverse Cry_Shellder\n\tcry_reverse Cry_Cloyster\n\tcry_reverse Cry_Gastly\n\tcry_reverse Cry_Haunter\n\tcry_reverse Cry_Gengar\n\tcry_reverse Cry_Onix\n\tcry_reverse Cry_Drowzee\n\tcry_reverse Cry_Hypno\n\tcry_reverse Cry_Krabby\n\tcry_reverse Cry_Kingler\n\tcry_reverse Cry_Voltorb\n\tcry_reverse Cry_Electrode\n\tcry_reverse Cry_Exeggcute\n\tcry_reverse Cry_Exeggutor\n\tcry_reverse Cry_Cubone\n\tcry_reverse Cry_Marowak\n\tcry_reverse Cry_Hitmonlee\n\tcry_reverse Cry_Hitmonchan\n\tcry_reverse Cry_Lickitung\n\tcry_reverse Cry_Koffing\n\tcry_reverse Cry_Weezing\n\tcry_reverse Cry_Rhyhorn\n\tcry_reverse Cry_Rhydon\n\tcry_reverse Cry_Chansey\n\tcry_reverse Cry_Tangela\n\tcry_reverse Cry_Kangaskhan\n\tcry_reverse Cry_Horsea\n\tcry_reverse Cry_Seadra\n\tcry_reverse Cry_Goldeen\n\tcry_reverse Cry_Seaking\n\tcry_reverse Cry_Staryu\n\tcry_reverse Cry_Starmie\n\tcry_reverse Cry_MrMime\n\tcry_reverse Cry_Scyther\n\tcry_reverse Cry_Jynx\n\tcry_reverse Cry_Electabuzz\n\tcry_reverse Cry_Magmar\n\tcry_reverse Cry_Pinsir\n\tcry_reverse Cry_Tauros\n\tcry_reverse Cry_Magikarp\n\tcry_reverse Cry_Gyarados\n\tcry_reverse Cry_Lapras\n\tcry_reverse Cry_Ditto\n\tcry_reverse Cry_Eevee\n\tcry_reverse Cry_Vaporeon\n\tcry_reverse Cry_Jolteon\n\tcry_reverse Cry_Flareon\n\tcry_reverse Cry_Porygon\n\tcry_reverse Cry_Omanyte\n\tcry_reverse Cry_Omastar\n\tcry_reverse Cry_Kabuto\n\tcry_reverse Cry_Kabutops\n\tcry_reverse Cry_Aerodactyl\n\tcry_reverse Cry_Snorlax\n\tcry_reverse Cry_Articuno\n\tcry_reverse Cry_Zapdos\n\tcry_reverse Cry_Moltres\n\tcry_reverse Cry_Dratini\n\tcry_reverse Cry_Dragonair\n\tcry_reverse Cry_Dragonite\n\tcry_reverse Cry_Mewtwo\n\tcry_reverse Cry_Mew\n\tcry_reverse Cry_Chikorita\n\tcry_reverse Cry_Bayleef\n\tcry_reverse Cry_Meganium\n\tcry_reverse Cry_Cyndaquil\n\tcry_reverse Cry_Quilava\n\tcry_reverse Cry_Typhlosion\n\tcry_reverse Cry_Totodile\n\tcry_reverse Cry_Croconaw\n\tcry_reverse Cry_Feraligatr\n\tcry_reverse Cry_Sentret\n\tcry_reverse Cry_Furret\n\tcry_reverse Cry_Hoothoot\n\tcry_reverse Cry_Noctowl\n\tcry_reverse Cry_Ledyba\n\tcry_reverse Cry_Ledian\n\tcry_reverse Cry_Spinarak\n\tcry_reverse Cry_Ariados\n\tcry_reverse Cry_Crobat\n\tcry_reverse Cry_Chinchou\n\tcry_reverse Cry_Lanturn\n\tcry_reverse Cry_Pichu\n\tcry_reverse Cry_Cleffa\n\tcry_reverse Cry_Igglybuff\n\tcry_reverse Cry_Togepi\n\tcry_reverse Cry_Togetic\n\tcry_reverse Cry_Natu\n\tcry_reverse Cry_Xatu\n\tcry_reverse Cry_Mareep\n\tcry_reverse Cry_Flaaffy\n\tcry_reverse Cry_Ampharos\n\tcry_reverse Cry_Bellossom\n\tcry_reverse Cry_Marill\n\tcry_reverse Cry_Azumarill\n\tcry_reverse Cry_Sudowoodo\n\tcry_reverse Cry_Politoed\n\tcry_reverse Cry_Hoppip\n\tcry_reverse Cry_Skiploom\n\tcry_reverse Cry_Jumpluff\n\tcry_reverse Cry_Aipom\n\tcry_reverse Cry_Sunkern\n\tcry_reverse Cry_Sunflora\n\tcry_reverse Cry_Yanma\n\tcry_reverse Cry_Wooper\n\tcry_reverse Cry_Quagsire\n\tcry_reverse Cry_Espeon\n\tcry_reverse Cry_Umbreon\n\tcry_reverse Cry_Murkrow\n\tcry_reverse Cry_Slowking\n\tcry_reverse Cry_Misdreavus\n\tcry_reverse Cry_Unown\n\tcry_reverse Cry_Wobbuffet\n\tcry_reverse Cry_Girafarig\n\tcry_reverse Cry_Pineco\n\tcry_reverse Cry_Forretress\n\tcry_reverse Cry_Dunsparce\n\tcry_reverse Cry_Gligar\n\tcry_reverse Cry_Steelix\n\tcry_reverse Cry_Snubbull\n\tcry_reverse Cry_Granbull\n\tcry_reverse Cry_Qwilfish\n\tcry_reverse Cry_Scizor\n\tcry_reverse Cry_Shuckle\n\tcry_reverse Cry_Heracross\n\tcry_reverse Cry_Sneasel\n\tcry_reverse Cry_Teddiursa\n\tcry_reverse Cry_Ursaring\n\tcry_reverse Cry_Slugma\n\tcry_reverse Cry_Magcargo\n\tcry_reverse Cry_Swinub\n\tcry_reverse Cry_Piloswine\n\tcry_reverse Cry_Corsola\n\tcry_reverse Cry_Remoraid\n\tcry_reverse Cry_Octillery\n\tcry_reverse Cry_Delibird\n\tcry_reverse Cry_Mantine\n\tcry_reverse Cry_Skarmory\n\tcry_reverse Cry_Houndour\n\tcry_reverse Cry_Houndoom\n\tcry_reverse Cry_Kingdra\n\tcry_reverse Cry_Phanpy\n\tcry_reverse Cry_Donphan\n\tcry_reverse Cry_Porygon2\n\tcry_reverse Cry_Stantler\n\tcry_reverse Cry_Smeargle\n\tcry_reverse Cry_Tyrogue\n\tcry_reverse Cry_Hitmontop\n\tcry_reverse Cry_Smoochum\n\tcry_reverse Cry_Elekid\n\tcry_reverse Cry_Magby\n\tcry_reverse Cry_Miltank\n\tcry_reverse Cry_Blissey\n\tcry_reverse Cry_Raikou\n\tcry_reverse Cry_Entei\n\tcry_reverse Cry_Suicune\n\tcry_reverse Cry_Larvitar\n\tcry_reverse Cry_Pupitar\n\tcry_reverse Cry_Tyranitar\n\tcry_reverse Cry_Lugia\n\tcry_reverse Cry_HoOh\n\tcry_reverse Cry_Celebi\n\tcry_reverse Cry_Kecleon\n\tcry_reverse Cry_Roselia\n\tcry_reverse Cry_Torkoal\n\tcry_reverse Cry_Electrike\n\tcry_reverse Cry_Manectric\n\tcry_reverse Cry_Duskull\n\tcry_reverse Cry_Latias\n\tcry_reverse Cry_Wynaut\n\tcry_reverse Cry_Seviper\n\tcry_reverse Cry_Sharpedo\n\tcry_reverse Cry_Zangoose\n\tcry_reverse Cry_Azurill\n\tcry_reverse Cry_Swablu\n\tcry_reverse Cry_Altaria\n\tcry_reverse Cry_Unused265\n\tcry_reverse Cry_Taillow\n\tcry_reverse Cry_Swellow\n\tcry_reverse Cry_Unused268\n\tcry_reverse Cry_Spinda\n\tcry_reverse Cry_Torchic\n\tcry_reverse Cry_Combusken\n\tcry_reverse Cry_Blaziken\n\tcry_reverse Cry_Treecko\n\tcry_reverse Cry_Grovyle\n\tcry_reverse Cry_Sceptile\n\tcry_reverse Cry_Mudkip\n\tcry_reverse Cry_Marshtomp\n\tcry_reverse Cry_Swampert\n\tcry_reverse Cry_Pelipper\n\tcry_reverse Cry_Wingull\n\tcry_reverse Cry_Banette\n\tcry_reverse Cry_Shuppet\n\tcry_reverse Cry_Lotad\n\tcry_reverse Cry_Lombre\n\tcry_reverse Cry_Ludicolo\n\tcry_reverse Cry_Seedot\n\tcry_reverse Cry_Nuzleaf\n\tcry_reverse Cry_Shiftry\n\tcry_reverse Cry_Carvanha\n\tcry_reverse Cry_Wurmple\n\tcry_reverse Cry_Silcoon\n\tcry_reverse Cry_Beautifly\n\tcry_reverse Cry_Cascoon\n\tcry_reverse Cry_Dustox\n\tcry_reverse Cry_Ralts\n\tcry_reverse Cry_Kirlia\n\tcry_reverse Cry_Gardevoir\n\tcry_reverse Cry_Slakoth\n\tcry_reverse Cry_Vigoroth\n\tcry_reverse Cry_Slaking\n\tcry_reverse Cry_Nincada\n\tcry_reverse Cry_Ninjask\n\tcry_reverse Cry_Shedinja\n\tcry_reverse Cry_Makuhita\n\tcry_reverse Cry_Hariyama\n\tcry_reverse Cry_Nosepass\n\tcry_reverse Cry_Glalie\n\tcry_reverse Cry_Plusle\n\tcry_reverse Cry_Minun\n\tcry_reverse Cry_Surskit\n\tcry_reverse Cry_Masquerain\n\tcry_reverse Cry_Skitty\n\tcry_reverse Cry_Delcatty\n\tcry_reverse Cry_Gulpin\n\tcry_reverse Cry_Swalot\n\tcry_reverse Cry_Numel\n\tcry_reverse Cry_Camerupt\n\tcry_reverse Cry_Barboach\n\tcry_reverse Cry_Whiscash\n\tcry_reverse Cry_Corphish\n\tcry_reverse Cry_Crawdaunt\n\tcry_reverse Cry_Spoink\n\tcry_reverse Cry_Grumpig\n\tcry_reverse Cry_Trapinch\n\tcry_reverse Cry_Vibrava\n\tcry_reverse Cry_Flygon\n\tcry_reverse Cry_Cacnea\n\tcry_reverse Cry_Cacturne\n\tcry_reverse Cry_Baltoy\n\tcry_reverse Cry_Claydol\n\tcry_reverse Cry_Lunatone\n\tcry_reverse Cry_Solrock\n\tcry_reverse Cry_Feebas\n\tcry_reverse Cry_Milotic\n\tcry_reverse Cry_Absol\n\tcry_reverse Cry_Meditite\n\tcry_reverse Cry_Medicham\n\tcry_reverse Cry_Spheal\n\tcry_reverse Cry_Sealeo\n\tcry_reverse Cry_Walrein\n\tcry_reverse Cry_Clamperl\n\tcry_reverse Cry_Huntail\n\tcry_reverse Cry_Gorebyss\n\tcry_reverse Cry_Lileep\n\tcry_reverse Cry_Cradily\n\tcry_reverse Cry_Anorith\n\tcry_reverse Cry_Armaldo\n\tcry_reverse Cry_Beldum\n\tcry_reverse Cry_Metang\n\tcry_reverse Cry_Metagross\n\tcry_reverse Cry_Bagon\n\tcry_reverse Cry_Shelgon\n\tcry_reverse Cry_Regirock\n\tcry_reverse Cry_Regice\n\tcry_reverse Cry_Registeel\n\tcry_reverse Cry_Castform\n\tcry_reverse Cry_Volbeat\n\tcry_reverse Cry_Illumise\n\tcry_reverse Cry_Poochyena\n\tcry_reverse Cry_Mightyena\n\tcry_reverse Cry_Dusclops\n\tcry_reverse Cry_Sableye\n\tcry_reverse Cry_Mawile\n\tcry_reverse Cry_Aron\n\tcry_reverse Cry_Lairon\n\tcry_reverse Cry_Aggron\n\tcry_reverse Cry_Relicanth\n\tcry_reverse Cry_Luvdisc\n\tcry_reverse Cry_Groudon\n\tcry_reverse Cry_Kyogre\n\tcry_reverse Cry_Rayquaza\n\tcry_reverse Cry_Salamence\n\tcry_reverse Cry_Breloom\n\tcry_reverse Cry_Shroomish\n\tcry_reverse Cry_Linoone\n\tcry_reverse Cry_Tropius\n\tcry_reverse Cry_Wailmer\n\tcry_reverse Cry_Zigzagoon\n\tcry_reverse Cry_Exploud\n\tcry_reverse Cry_Loudred\n\tcry_reverse Cry_Wailord\n\tcry_reverse Cry_Whismur\n\tcry_reverse Cry_Snorunt\n\tcry_reverse Cry_Latios\n\tcry_reverse Cry_Jirachi\n\tcry_reverse Cry_Deoxys\n\tcry_reverse Cry_Chimecho\n"
  },
  {
    "path": "sound/direct_sound_data.inc",
    "content": "\t.align 2\nDirectSoundWaveData_sc88pro_glockenspiel::\n\t.incbin \"sound/direct_sound_samples/sc88pro_glockenspiel.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_organ2::\n\t.incbin \"sound/direct_sound_samples/sc88pro_organ2.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_fretless_bass::\n\t.incbin \"sound/direct_sound_samples/sc88pro_fretless_bass.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_slap_bass::\n\t.incbin \"sound/direct_sound_samples/sc88pro_slap_bass.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_synth_bass::\n\t.incbin \"sound/direct_sound_samples/sc88pro_synth_bass.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_timpani::\n\t.incbin \"sound/direct_sound_samples/sc88pro_timpani.bin\"\n\n\t.align 2\nDirectSoundWaveData_classical_choir_voice_ahhs::\n\t.incbin \"sound/direct_sound_samples/classical_choir_voice_ahhs.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_classical_oboe::\n\t.incbin \"sound/direct_sound_samples/sd90_classical_oboe.bin\"\n\n\t.align 2\nDirectSoundWaveData_unused_sd90_oboe::\n\t.incbin \"sound/direct_sound_samples/unused_sd90_oboe.bin\"\n\n\t.align 2\nDirectSoundWaveData_unused_guitar_separates_power_chord::\n\t.incbin \"sound/direct_sound_samples/unused_guitar_separates_power_chord.bin\"\n\n\t.align 2\nDirectSoundWaveData_unused_sc88pro_unison_slap::\n\t.incbin \"sound/direct_sound_samples/unused_sc88pro_unison_slap.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_snare::\n\t.incbin \"sound/direct_sound_samples/unknown_snare.bin\"\n\n\t.align 2\nDirectSoundWaveData_ethnic_flavours_ohtsuzumi::\n\t.incbin \"sound/direct_sound_samples/ethnic_flavours_ohtsuzumi.bin\"\n\n\t.align 2\nDirectSoundWaveData_ethnic_flavours_hyoushigi::\n\t.incbin \"sound/direct_sound_samples/ethnic_flavours_hyoushigi.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_rnd_kick::\n\t.incbin \"sound/direct_sound_samples/sc88pro_rnd_kick.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_rnd_snare::\n\t.incbin \"sound/direct_sound_samples/sc88pro_rnd_snare.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_tr909_hand_clap::\n\t.incbin \"sound/direct_sound_samples/sc88pro_tr909_hand_clap.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_orchestra_snare::\n\t.incbin \"sound/direct_sound_samples/sc88pro_orchestra_snare.bin\"\n\n\t.align 2\nDirectSoundWaveData_unused_sc55_tom::\n\t.incbin \"sound/direct_sound_samples/unused_sc55_tom.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_close_hihat::\n\t.incbin \"sound/direct_sound_samples/unknown_close_hihat.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_open_hihat::\n\t.incbin \"sound/direct_sound_samples/unknown_open_hihat.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_bell::\n\t.incbin \"sound/direct_sound_samples/unknown_bell.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_tambourine::\n\t.incbin \"sound/direct_sound_samples/sc88pro_tambourine.bin\"\n\n\t.align 2\nDirectSoundWaveData_trinity_cymbal_crash::\n\t.incbin \"sound/direct_sound_samples/trinity_cymbal_crash.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_orchestra_cymbal_crash::\n\t.incbin \"sound/direct_sound_samples/sc88pro_orchestra_cymbal_crash.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_mute_high_conga::\n\t.incbin \"sound/direct_sound_samples/sc88pro_mute_high_conga.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_open_low_conga::\n\t.incbin \"sound/direct_sound_samples/sc88pro_open_low_conga.bin\"\n\n\t.align 2\nDirectSoundWaveData_drum_and_percussion_kick::\n\t.incbin \"sound/direct_sound_samples/drum_and_percussion_kick.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_solo_snare::\n\t.incbin \"sound/direct_sound_samples/sd90_solo_snare.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_ambient_tom::\n\t.incbin \"sound/direct_sound_samples/sd90_ambient_tom.bin\"\n\n\t.align 2\nDirectSoundWaveData_dance_drums_ride_bell::\n\t.incbin \"sound/direct_sound_samples/dance_drums_ride_bell.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_cowbell::\n\t.incbin \"sound/direct_sound_samples/sd90_cowbell.bin\"\n\n\t.align 2\nDirectSoundWaveData_unused_heart_of_asia_indian_drum::\n\t.incbin \"sound/direct_sound_samples/unused_heart_of_asia_indian_drum.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_open_triangle::\n\t.incbin \"sound/direct_sound_samples/sd90_open_triangle.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_jingle_bell::\n\t.incbin \"sound/direct_sound_samples/sc88pro_jingle_bell.bin\"\n\n\t.align 2\nDirectSoundWaveData_ethnic_flavours_atarigane::\n\t.incbin \"sound/direct_sound_samples/ethnic_flavours_atarigane.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_taiko::\n\t.incbin \"sound/direct_sound_samples/sc88pro_taiko.bin\"\n\n\t.align 2\nDirectSoundWaveData_ethnic_flavours_kotsuzumi::\n\t.incbin \"sound/direct_sound_samples/ethnic_flavours_kotsuzumi.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_piano1_48::\n\t.incbin \"sound/direct_sound_samples/sc88pro_piano1_48.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_piano1_60::\n\t.incbin \"sound/direct_sound_samples/sc88pro_piano1_60.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_piano1_72::\n\t.incbin \"sound/direct_sound_samples/sc88pro_piano1_72.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_piano1_84::\n\t.incbin \"sound/direct_sound_samples/sc88pro_piano1_84.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_string_ensemble_60::\n\t.incbin \"sound/direct_sound_samples/sc88pro_string_ensemble_60.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_string_ensemble_72::\n\t.incbin \"sound/direct_sound_samples/sc88pro_string_ensemble_72.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_string_ensemble_84::\n\t.incbin \"sound/direct_sound_samples/sc88pro_string_ensemble_84.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_trumpet_60::\n\t.incbin \"sound/direct_sound_samples/sc88pro_trumpet_60.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_trumpet_72::\n\t.incbin \"sound/direct_sound_samples/sc88pro_trumpet_72.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_trumpet_84::\n\t.incbin \"sound/direct_sound_samples/sc88pro_trumpet_84.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_tuba_39:: @N.B.: These tuba samples are actually sampled at 36 and 48, then pitched up\n\t.incbin \"sound/direct_sound_samples/sc88pro_tuba_39.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_tuba_51::\n\t.incbin \"sound/direct_sound_samples/sc88pro_tuba_51.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_french_horn_60::\n\t.incbin \"sound/direct_sound_samples/sc88pro_french_horn_60.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_french_horn_72::\n\t.incbin \"sound/direct_sound_samples/sc88pro_french_horn_72.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_flute::\n\t.incbin \"sound/direct_sound_samples/sc88pro_flute.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_fingered_bass::\n\t.incbin \"sound/direct_sound_samples/sc88pro_fingered_bass.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_koto_high::\n\t.incbin \"sound/direct_sound_samples/unknown_koto_high.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_classical_shakuhachi::\n\t.incbin \"sound/direct_sound_samples/sd90_classical_shakuhachi.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_koto_low::\n\t.incbin \"sound/direct_sound_samples/unknown_koto_low.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_classical_overdrive_guitar::\n\t.incbin \"sound/direct_sound_samples/sd90_classical_overdrive_guitar.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_classical_distortion_guitar_high::\n\t.incbin \"sound/direct_sound_samples/sd90_classical_distortion_guitar_high.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_classical_distortion_guitar_low::\n\t.incbin \"sound/direct_sound_samples/sd90_classical_distortion_guitar_low.bin\"\n\n\t.align 2\nDirectSoundWaveData_heart_of_asia_gamelan::\n\t.incbin \"sound/direct_sound_samples/heart_of_asia_gamelan.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_church_organ3_low::\n\t.incbin \"sound/direct_sound_samples/sc88pro_church_organ3_low.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_church_organ3_high::\n\t.incbin \"sound/direct_sound_samples/sc88pro_church_organ3_high.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_female_voice::\n\t.incbin \"sound/direct_sound_samples/unknown_female_voice.bin\"\n\n\t.align 2\nDirectSoundWaveData_unused_unknown_male_voice::\n\t.incbin \"sound/direct_sound_samples/unused_unknown_male_voice.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_classical_detuned_ep1_low::\n\t.incbin \"sound/direct_sound_samples/sd90_classical_detuned_ep1_low.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_classical_detuned_ep1_high::\n\t.incbin \"sound/direct_sound_samples/sd90_classical_detuned_ep1_high.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_timpani_with_snare::\n\t.incbin \"sound/direct_sound_samples/sc88pro_timpani_with_snare.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_synth_snare::\n\t.incbin \"sound/direct_sound_samples/unknown_synth_snare.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_square_wave::\n\t.incbin \"sound/direct_sound_samples/sc88pro_square_wave.bin\"\n\n\t.align 2\nDirectSoundWaveData_bicycle_bell::\n\t.incbin \"sound/direct_sound_samples/bicycle_bell.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_1::\n\t.incbin \"sound/direct_sound_samples/unknown_01.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_pizzicato_strings::\n\t.incbin \"sound/direct_sound_samples/sc88pro_pizzicato_strings.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_2::\n\t.incbin \"sound/direct_sound_samples/unknown_02.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_3::\n\t.incbin \"sound/direct_sound_samples/unknown_03.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_4::\n\t.incbin \"sound/direct_sound_samples/unknown_04.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_wind::\n\t.incbin \"sound/direct_sound_samples/sc88pro_wind.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_bubbles::\n\t.incbin \"sound/direct_sound_samples/sc88pro_bubbles.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_5::\n\t.incbin \"sound/direct_sound_samples/unknown_05.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_6::\n\t.incbin \"sound/direct_sound_samples/unknown_06.bin\"\n\n\t.align 2\nDirectSoundWaveData_trinity_30303_mega_bass::\n\t.incbin \"sound/direct_sound_samples/trinity_30303_mega_bass.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_7::\n\t.incbin \"sound/direct_sound_samples/unknown_07.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_8::\n\t.incbin \"sound/direct_sound_samples/unknown_08.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_tubular_bell::\n\t.incbin \"sound/direct_sound_samples/sc88pro_tubular_bell.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_9::\n\t.incbin \"sound/direct_sound_samples/unknown_09.bin\"\n\n\t.align 2\nDirectSoundWaveData_trinity_big_boned::\n\t.incbin \"sound/direct_sound_samples/trinity_big_boned.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_harp::\n\t.incbin \"sound/direct_sound_samples/sc88pro_harp.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_xylophone::\n\t.incbin \"sound/direct_sound_samples/sc88pro_xylophone.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_10::\n\t.incbin \"sound/direct_sound_samples/unknown_10.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_11::\n\t.incbin \"sound/direct_sound_samples/unknown_11.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_accordion::\n\t.incbin \"sound/direct_sound_samples/sc88pro_accordion.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_12::\n\t.incbin \"sound/direct_sound_samples/unknown_12.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_13::\n\t.incbin \"sound/direct_sound_samples/unknown_13.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_14::\n\t.incbin \"sound/direct_sound_samples/unknown_14.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_15::\n\t.incbin \"sound/direct_sound_samples/unknown_15.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_16::\n\t.incbin \"sound/direct_sound_samples/unknown_16.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_17::\n\t.incbin \"sound/direct_sound_samples/unknown_17.bin\"\n\n\t.align 2\nCry_Bulbasaur::\n\t.incbin \"sound/direct_sound_samples/cries/bulbasaur.bin\"\n\n\t.align 2\nCry_Ivysaur::\n\t.incbin \"sound/direct_sound_samples/cries/ivysaur.bin\"\n\n\t.align 2\nCry_Venusaur::\n\t.incbin \"sound/direct_sound_samples/cries/venusaur.bin\"\n\n\t.align 2\nCry_Charmander::\n\t.incbin \"sound/direct_sound_samples/cries/charmander.bin\"\n\n\t.align 2\nCry_Charmeleon::\n\t.incbin \"sound/direct_sound_samples/cries/charmeleon.bin\"\n\n\t.align 2\nCry_Charizard::\n\t.incbin \"sound/direct_sound_samples/cries/charizard.bin\"\n\n\t.align 2\nCry_Squirtle::\n\t.incbin \"sound/direct_sound_samples/cries/squirtle.bin\"\n\n\t.align 2\nCry_Wartortle::\n\t.incbin \"sound/direct_sound_samples/cries/wartortle.bin\"\n\n\t.align 2\nCry_Blastoise::\n\t.incbin \"sound/direct_sound_samples/cries/blastoise.bin\"\n\n\t.align 2\nCry_Caterpie::\n\t.incbin \"sound/direct_sound_samples/cries/caterpie.bin\"\n\n\t.align 2\nCry_Metapod::\n\t.incbin \"sound/direct_sound_samples/cries/metapod.bin\"\n\n\t.align 2\nCry_Butterfree::\n\t.incbin \"sound/direct_sound_samples/cries/butterfree.bin\"\n\n\t.align 2\nCry_Weedle::\n\t.incbin \"sound/direct_sound_samples/cries/weedle.bin\"\n\n\t.align 2\nCry_Kakuna::\n\t.incbin \"sound/direct_sound_samples/cries/kakuna.bin\"\n\n\t.align 2\nCry_Beedrill::\n\t.incbin \"sound/direct_sound_samples/cries/beedrill.bin\"\n\n\t.align 2\nCry_Pidgey::\n\t.incbin \"sound/direct_sound_samples/cries/pidgey.bin\"\n\n\t.align 2\nCry_Pidgeotto::\n\t.incbin \"sound/direct_sound_samples/cries/pidgeotto.bin\"\n\n\t.align 2\nCry_Pidgeot::\n\t.incbin \"sound/direct_sound_samples/cries/pidgeot.bin\"\n\n\t.align 2\nCry_Rattata::\n\t.incbin \"sound/direct_sound_samples/cries/rattata.bin\"\n\n\t.align 2\nCry_Raticate::\n\t.incbin \"sound/direct_sound_samples/cries/raticate.bin\"\n\n\t.align 2\nCry_Spearow::\n\t.incbin \"sound/direct_sound_samples/cries/spearow.bin\"\n\n\t.align 2\nCry_Fearow::\n\t.incbin \"sound/direct_sound_samples/cries/fearow.bin\"\n\n\t.align 2\nCry_Ekans::\n\t.incbin \"sound/direct_sound_samples/cries/ekans.bin\"\n\n\t.align 2\nCry_Arbok::\n\t.incbin \"sound/direct_sound_samples/cries/arbok.bin\"\n\n\t.align 2\nCry_Pikachu::\n\t.incbin \"sound/direct_sound_samples/cries/pikachu.bin\"\n\n\t.align 2\nCry_Raichu::\n\t.incbin \"sound/direct_sound_samples/cries/raichu.bin\"\n\n\t.align 2\nCry_Sandshrew::\n\t.incbin \"sound/direct_sound_samples/cries/sandshrew.bin\"\n\n\t.align 2\nCry_Sandslash::\n\t.incbin \"sound/direct_sound_samples/cries/sandslash.bin\"\n\n\t.align 2\nCry_NidoranF::\n\t.incbin \"sound/direct_sound_samples/cries/nidoran_f.bin\"\n\n\t.align 2\nCry_Nidorina::\n\t.incbin \"sound/direct_sound_samples/cries/nidorina.bin\"\n\n\t.align 2\nCry_Nidoqueen::\n\t.incbin \"sound/direct_sound_samples/cries/nidoqueen.bin\"\n\n\t.align 2\nCry_NidoranM::\n\t.incbin \"sound/direct_sound_samples/cries/nidoran_m.bin\"\n\n\t.align 2\nCry_Nidorino::\n\t.incbin \"sound/direct_sound_samples/cries/nidorino.bin\"\n\n\t.align 2\nCry_Nidoking::\n\t.incbin \"sound/direct_sound_samples/cries/nidoking.bin\"\n\n\t.align 2\nCry_Clefairy::\n\t.incbin \"sound/direct_sound_samples/cries/clefairy.bin\"\n\n\t.align 2\nCry_Clefable::\n\t.incbin \"sound/direct_sound_samples/cries/clefable.bin\"\n\n\t.align 2\nCry_Vulpix::\n\t.incbin \"sound/direct_sound_samples/cries/vulpix.bin\"\n\n\t.align 2\nCry_Ninetales::\n\t.incbin \"sound/direct_sound_samples/cries/ninetales.bin\"\n\n\t.align 2\nCry_Jigglypuff::\n\t.incbin \"sound/direct_sound_samples/cries/jigglypuff.bin\"\n\n\t.align 2\nCry_Wigglytuff::\n\t.incbin \"sound/direct_sound_samples/cries/wigglytuff.bin\"\n\n\t.align 2\nCry_Zubat::\n\t.incbin \"sound/direct_sound_samples/cries/zubat.bin\"\n\n\t.align 2\nCry_Golbat::\n\t.incbin \"sound/direct_sound_samples/cries/golbat.bin\"\n\n\t.align 2\nCry_Oddish::\n\t.incbin \"sound/direct_sound_samples/cries/oddish.bin\"\n\n\t.align 2\nCry_Gloom::\n\t.incbin \"sound/direct_sound_samples/cries/gloom.bin\"\n\n\t.align 2\nCry_Vileplume::\n\t.incbin \"sound/direct_sound_samples/cries/vileplume.bin\"\n\n\t.align 2\nCry_Paras::\n\t.incbin \"sound/direct_sound_samples/cries/paras.bin\"\n\n\t.align 2\nCry_Parasect::\n\t.incbin \"sound/direct_sound_samples/cries/parasect.bin\"\n\n\t.align 2\nCry_Venonat::\n\t.incbin \"sound/direct_sound_samples/cries/venonat.bin\"\n\n\t.align 2\nCry_Venomoth::\n\t.incbin \"sound/direct_sound_samples/cries/venomoth.bin\"\n\n\t.align 2\nCry_Diglett::\n\t.incbin \"sound/direct_sound_samples/cries/diglett.bin\"\n\n\t.align 2\nCry_Dugtrio::\n\t.incbin \"sound/direct_sound_samples/cries/dugtrio.bin\"\n\n\t.align 2\nCry_Meowth::\n\t.incbin \"sound/direct_sound_samples/cries/meowth.bin\"\n\n\t.align 2\nCry_Persian::\n\t.incbin \"sound/direct_sound_samples/cries/persian.bin\"\n\n\t.align 2\nCry_Psyduck::\n\t.incbin \"sound/direct_sound_samples/cries/psyduck.bin\"\n\n\t.align 2\nCry_Golduck::\n\t.incbin \"sound/direct_sound_samples/cries/golduck.bin\"\n\n\t.align 2\nCry_Mankey::\n\t.incbin \"sound/direct_sound_samples/cries/mankey.bin\"\n\n\t.align 2\nCry_Primeape::\n\t.incbin \"sound/direct_sound_samples/cries/primeape.bin\"\n\n\t.align 2\nCry_Growlithe::\n\t.incbin \"sound/direct_sound_samples/cries/growlithe.bin\"\n\n\t.align 2\nCry_Arcanine::\n\t.incbin \"sound/direct_sound_samples/cries/arcanine.bin\"\n\n\t.align 2\nCry_Poliwag::\n\t.incbin \"sound/direct_sound_samples/cries/poliwag.bin\"\n\n\t.align 2\nCry_Poliwhirl::\n\t.incbin \"sound/direct_sound_samples/cries/poliwhirl.bin\"\n\n\t.align 2\nCry_Poliwrath::\n\t.incbin \"sound/direct_sound_samples/cries/poliwrath.bin\"\n\n\t.align 2\nCry_Abra::\n\t.incbin \"sound/direct_sound_samples/cries/abra.bin\"\n\n\t.align 2\nCry_Kadabra::\n\t.incbin \"sound/direct_sound_samples/cries/kadabra.bin\"\n\n\t.align 2\nCry_Alakazam::\n\t.incbin \"sound/direct_sound_samples/cries/alakazam.bin\"\n\n\t.align 2\nCry_Machop::\n\t.incbin \"sound/direct_sound_samples/cries/machop.bin\"\n\n\t.align 2\nCry_Machoke::\n\t.incbin \"sound/direct_sound_samples/cries/machoke.bin\"\n\n\t.align 2\nCry_Machamp::\n\t.incbin \"sound/direct_sound_samples/cries/machamp.bin\"\n\n\t.align 2\nCry_Bellsprout::\n\t.incbin \"sound/direct_sound_samples/cries/bellsprout.bin\"\n\n\t.align 2\nCry_Weepinbell::\n\t.incbin \"sound/direct_sound_samples/cries/weepinbell.bin\"\n\n\t.align 2\nCry_Victreebel::\n\t.incbin \"sound/direct_sound_samples/cries/victreebel.bin\"\n\n\t.align 2\nCry_Tentacool::\n\t.incbin \"sound/direct_sound_samples/cries/tentacool.bin\"\n\n\t.align 2\nCry_Tentacruel::\n\t.incbin \"sound/direct_sound_samples/cries/tentacruel.bin\"\n\n\t.align 2\nCry_Geodude::\n\t.incbin \"sound/direct_sound_samples/cries/geodude.bin\"\n\n\t.align 2\nCry_Graveler::\n\t.incbin \"sound/direct_sound_samples/cries/graveler.bin\"\n\n\t.align 2\nCry_Golem::\n\t.incbin \"sound/direct_sound_samples/cries/golem.bin\"\n\n\t.align 2\nCry_Ponyta::\n\t.incbin \"sound/direct_sound_samples/cries/ponyta.bin\"\n\n\t.align 2\nCry_Rapidash::\n\t.incbin \"sound/direct_sound_samples/cries/rapidash.bin\"\n\n\t.align 2\nCry_Slowpoke::\n\t.incbin \"sound/direct_sound_samples/cries/slowpoke.bin\"\n\n\t.align 2\nCry_Slowbro::\n\t.incbin \"sound/direct_sound_samples/cries/slowbro.bin\"\n\n\t.align 2\nCry_Magnemite::\n\t.incbin \"sound/direct_sound_samples/cries/magnemite.bin\"\n\n\t.align 2\nCry_Magneton::\n\t.incbin \"sound/direct_sound_samples/cries/magneton.bin\"\n\n\t.align 2\nCry_Farfetchd::\n\t.incbin \"sound/direct_sound_samples/cries/farfetchd.bin\"\n\n\t.align 2\nCry_Doduo::\n\t.incbin \"sound/direct_sound_samples/cries/doduo.bin\"\n\n\t.align 2\nCry_Dodrio::\n\t.incbin \"sound/direct_sound_samples/cries/dodrio.bin\"\n\n\t.align 2\nCry_Seel::\n\t.incbin \"sound/direct_sound_samples/cries/seel.bin\"\n\n\t.align 2\nCry_Dewgong::\n\t.incbin \"sound/direct_sound_samples/cries/dewgong.bin\"\n\n\t.align 2\nCry_Grimer::\n\t.incbin \"sound/direct_sound_samples/cries/grimer.bin\"\n\n\t.align 2\nCry_Muk::\n\t.incbin \"sound/direct_sound_samples/cries/muk.bin\"\n\n\t.align 2\nCry_Shellder::\n\t.incbin \"sound/direct_sound_samples/cries/shellder.bin\"\n\n\t.align 2\nCry_Cloyster::\n\t.incbin \"sound/direct_sound_samples/cries/cloyster.bin\"\n\n\t.align 2\nCry_Gastly::\n\t.incbin \"sound/direct_sound_samples/cries/gastly.bin\"\n\n\t.align 2\nCry_Haunter::\n\t.incbin \"sound/direct_sound_samples/cries/haunter.bin\"\n\n\t.align 2\nCry_Gengar::\n\t.incbin \"sound/direct_sound_samples/cries/gengar.bin\"\n\n\t.align 2\nCry_Onix::\n\t.incbin \"sound/direct_sound_samples/cries/onix.bin\"\n\n\t.align 2\nCry_Drowzee::\n\t.incbin \"sound/direct_sound_samples/cries/drowzee.bin\"\n\n\t.align 2\nCry_Hypno::\n\t.incbin \"sound/direct_sound_samples/cries/hypno.bin\"\n\n\t.align 2\nCry_Krabby::\n\t.incbin \"sound/direct_sound_samples/cries/krabby.bin\"\n\n\t.align 2\nCry_Kingler::\n\t.incbin \"sound/direct_sound_samples/cries/kingler.bin\"\n\n\t.align 2\nCry_Voltorb::\n\t.incbin \"sound/direct_sound_samples/cries/voltorb.bin\"\n\n\t.align 2\nCry_Electrode::\n\t.incbin \"sound/direct_sound_samples/cries/electrode.bin\"\n\n\t.align 2\nCry_Exeggcute::\n\t.incbin \"sound/direct_sound_samples/cries/exeggcute.bin\"\n\n\t.align 2\nCry_Exeggutor::\n\t.incbin \"sound/direct_sound_samples/cries/exeggutor.bin\"\n\n\t.align 2\nCry_Cubone::\n\t.incbin \"sound/direct_sound_samples/cries/cubone.bin\"\n\n\t.align 2\nCry_Marowak::\n\t.incbin \"sound/direct_sound_samples/cries/marowak.bin\"\n\n\t.align 2\nCry_Hitmonlee::\n\t.incbin \"sound/direct_sound_samples/cries/hitmonlee.bin\"\n\n\t.align 2\nCry_Hitmonchan::\n\t.incbin \"sound/direct_sound_samples/cries/hitmonchan.bin\"\n\n\t.align 2\nCry_Lickitung::\n\t.incbin \"sound/direct_sound_samples/cries/lickitung.bin\"\n\n\t.align 2\nCry_Koffing::\n\t.incbin \"sound/direct_sound_samples/cries/koffing.bin\"\n\n\t.align 2\nCry_Weezing::\n\t.incbin \"sound/direct_sound_samples/cries/weezing.bin\"\n\n\t.align 2\nCry_Rhyhorn::\n\t.incbin \"sound/direct_sound_samples/cries/rhyhorn.bin\"\n\n\t.align 2\nCry_Rhydon::\n\t.incbin \"sound/direct_sound_samples/cries/rhydon.bin\"\n\n\t.align 2\nCry_Chansey::\n\t.incbin \"sound/direct_sound_samples/cries/chansey.bin\"\n\n\t.align 2\nCry_Tangela::\n\t.incbin \"sound/direct_sound_samples/cries/tangela.bin\"\n\n\t.align 2\nCry_Kangaskhan::\n\t.incbin \"sound/direct_sound_samples/cries/kangaskhan.bin\"\n\n\t.align 2\nCry_Horsea::\n\t.incbin \"sound/direct_sound_samples/cries/horsea.bin\"\n\n\t.align 2\nCry_Seadra::\n\t.incbin \"sound/direct_sound_samples/cries/seadra.bin\"\n\n\t.align 2\nCry_Goldeen::\n\t.incbin \"sound/direct_sound_samples/cries/goldeen.bin\"\n\n\t.align 2\nCry_Seaking::\n\t.incbin \"sound/direct_sound_samples/cries/seaking.bin\"\n\n\t.align 2\nCry_Staryu::\n\t.incbin \"sound/direct_sound_samples/cries/staryu.bin\"\n\n\t.align 2\nCry_Starmie::\n\t.incbin \"sound/direct_sound_samples/cries/starmie.bin\"\n\n\t.align 2\nCry_MrMime::\n\t.incbin \"sound/direct_sound_samples/cries/mr_mime.bin\"\n\n\t.align 2\nCry_Scyther::\n\t.incbin \"sound/direct_sound_samples/cries/scyther.bin\"\n\n\t.align 2\nCry_Jynx::\n\t.incbin \"sound/direct_sound_samples/cries/jynx.bin\"\n\n\t.align 2\nCry_Electabuzz::\n\t.incbin \"sound/direct_sound_samples/cries/electabuzz.bin\"\n\n\t.align 2\nCry_Magmar::\n\t.incbin \"sound/direct_sound_samples/cries/magmar.bin\"\n\n\t.align 2\nCry_Pinsir::\n\t.incbin \"sound/direct_sound_samples/cries/pinsir.bin\"\n\n\t.align 2\nCry_Tauros::\n\t.incbin \"sound/direct_sound_samples/cries/tauros.bin\"\n\n\t.align 2\nCry_Magikarp::\n\t.incbin \"sound/direct_sound_samples/cries/magikarp.bin\"\n\n\t.align 2\nCry_Gyarados::\n\t.incbin \"sound/direct_sound_samples/cries/gyarados.bin\"\n\n\t.align 2\nCry_Lapras::\n\t.incbin \"sound/direct_sound_samples/cries/lapras.bin\"\n\n\t.align 2\nCry_Ditto::\n\t.incbin \"sound/direct_sound_samples/cries/ditto.bin\"\n\n\t.align 2\nCry_Eevee::\n\t.incbin \"sound/direct_sound_samples/cries/eevee.bin\"\n\n\t.align 2\nCry_Vaporeon::\n\t.incbin \"sound/direct_sound_samples/cries/vaporeon.bin\"\n\n\t.align 2\nCry_Jolteon::\n\t.incbin \"sound/direct_sound_samples/cries/jolteon.bin\"\n\n\t.align 2\nCry_Flareon::\n\t.incbin \"sound/direct_sound_samples/cries/flareon.bin\"\n\n\t.align 2\nCry_Porygon::\n\t.incbin \"sound/direct_sound_samples/cries/porygon.bin\"\n\n\t.align 2\nCry_Omanyte::\n\t.incbin \"sound/direct_sound_samples/cries/omanyte.bin\"\n\n\t.align 2\nCry_Omastar::\n\t.incbin \"sound/direct_sound_samples/cries/omastar.bin\"\n\n\t.align 2\nCry_Kabuto::\n\t.incbin \"sound/direct_sound_samples/cries/kabuto.bin\"\n\n\t.align 2\nCry_Kabutops::\n\t.incbin \"sound/direct_sound_samples/cries/kabutops.bin\"\n\n\t.align 2\nCry_Aerodactyl::\n\t.incbin \"sound/direct_sound_samples/cries/aerodactyl.bin\"\n\n\t.align 2\nCry_Snorlax::\n\t.incbin \"sound/direct_sound_samples/cries/snorlax.bin\"\n\n\t.align 2\nCry_Articuno::\n\t.incbin \"sound/direct_sound_samples/cries/articuno.bin\"\n\n\t.align 2\nCry_Zapdos::\n\t.incbin \"sound/direct_sound_samples/cries/zapdos.bin\"\n\n\t.align 2\nCry_Moltres::\n\t.incbin \"sound/direct_sound_samples/cries/moltres.bin\"\n\n\t.align 2\nCry_Dratini::\n\t.incbin \"sound/direct_sound_samples/cries/dratini.bin\"\n\n\t.align 2\nCry_Dragonair::\n\t.incbin \"sound/direct_sound_samples/cries/dragonair.bin\"\n\n\t.align 2\nCry_Dragonite::\n\t.incbin \"sound/direct_sound_samples/cries/dragonite.bin\"\n\n\t.align 2\nCry_Mewtwo::\n\t.incbin \"sound/direct_sound_samples/cries/mewtwo.bin\"\n\n\t.align 2\nCry_Mew::\n\t.incbin \"sound/direct_sound_samples/cries/mew.bin\"\n\n\t.align 2\nCry_Chikorita::\n\t.incbin \"sound/direct_sound_samples/cries/chikorita.bin\"\n\n\t.align 2\nCry_Bayleef::\n\t.incbin \"sound/direct_sound_samples/cries/bayleef.bin\"\n\n\t.align 2\nCry_Meganium::\n\t.incbin \"sound/direct_sound_samples/cries/meganium.bin\"\n\n\t.align 2\nCry_Cyndaquil::\n\t.incbin \"sound/direct_sound_samples/cries/cyndaquil.bin\"\n\n\t.align 2\nCry_Quilava::\n\t.incbin \"sound/direct_sound_samples/cries/quilava.bin\"\n\n\t.align 2\nCry_Typhlosion::\n\t.incbin \"sound/direct_sound_samples/cries/typhlosion.bin\"\n\n\t.align 2\nCry_Totodile::\n\t.incbin \"sound/direct_sound_samples/cries/totodile.bin\"\n\n\t.align 2\nCry_Croconaw::\n\t.incbin \"sound/direct_sound_samples/cries/croconaw.bin\"\n\n\t.align 2\nCry_Feraligatr::\n\t.incbin \"sound/direct_sound_samples/cries/feraligatr.bin\"\n\n\t.align 2\nCry_Sentret::\n\t.incbin \"sound/direct_sound_samples/cries/sentret.bin\"\n\n\t.align 2\nCry_Furret::\n\t.incbin \"sound/direct_sound_samples/cries/furret.bin\"\n\n\t.align 2\nCry_Hoothoot::\n\t.incbin \"sound/direct_sound_samples/cries/hoothoot.bin\"\n\n\t.align 2\nCry_Noctowl::\n\t.incbin \"sound/direct_sound_samples/cries/noctowl.bin\"\n\n\t.align 2\nCry_Ledyba::\n\t.incbin \"sound/direct_sound_samples/cries/ledyba.bin\"\n\n\t.align 2\nCry_Ledian::\n\t.incbin \"sound/direct_sound_samples/cries/ledian.bin\"\n\n\t.align 2\nCry_Spinarak::\n\t.incbin \"sound/direct_sound_samples/cries/spinarak.bin\"\n\n\t.align 2\nCry_Ariados::\n\t.incbin \"sound/direct_sound_samples/cries/ariados.bin\"\n\n\t.align 2\nCry_Crobat::\n\t.incbin \"sound/direct_sound_samples/cries/crobat.bin\"\n\n\t.align 2\nCry_Chinchou::\n\t.incbin \"sound/direct_sound_samples/cries/chinchou.bin\"\n\n\t.align 2\nCry_Lanturn::\n\t.incbin \"sound/direct_sound_samples/cries/lanturn.bin\"\n\n\t.align 2\nCry_Pichu::\n\t.incbin \"sound/direct_sound_samples/cries/pichu.bin\"\n\n\t.align 2\nCry_Cleffa::\n\t.incbin \"sound/direct_sound_samples/cries/cleffa.bin\"\n\n\t.align 2\nCry_Igglybuff::\n\t.incbin \"sound/direct_sound_samples/cries/igglybuff.bin\"\n\n\t.align 2\nCry_Togepi::\n\t.incbin \"sound/direct_sound_samples/cries/togepi.bin\"\n\n\t.align 2\nCry_Togetic::\n\t.incbin \"sound/direct_sound_samples/cries/togetic.bin\"\n\n\t.align 2\nCry_Natu::\n\t.incbin \"sound/direct_sound_samples/cries/natu.bin\"\n\n\t.align 2\nCry_Xatu::\n\t.incbin \"sound/direct_sound_samples/cries/xatu.bin\"\n\n\t.align 2\nCry_Mareep::\n\t.incbin \"sound/direct_sound_samples/cries/mareep.bin\"\n\n\t.align 2\nCry_Flaaffy::\n\t.incbin \"sound/direct_sound_samples/cries/flaaffy.bin\"\n\n\t.align 2\nCry_Ampharos::\n\t.incbin \"sound/direct_sound_samples/cries/ampharos.bin\"\n\n\t.align 2\nCry_Bellossom::\n\t.incbin \"sound/direct_sound_samples/cries/bellossom.bin\"\n\n\t.align 2\nCry_Marill::\n\t.incbin \"sound/direct_sound_samples/cries/marill.bin\"\n\n\t.align 2\nCry_Azumarill::\n\t.incbin \"sound/direct_sound_samples/cries/azumarill.bin\"\n\n\t.align 2\nCry_Sudowoodo::\n\t.incbin \"sound/direct_sound_samples/cries/sudowoodo.bin\"\n\n\t.align 2\nCry_Politoed::\n\t.incbin \"sound/direct_sound_samples/cries/politoed.bin\"\n\n\t.align 2\nCry_Hoppip::\n\t.incbin \"sound/direct_sound_samples/cries/hoppip.bin\"\n\n\t.align 2\nCry_Skiploom::\n\t.incbin \"sound/direct_sound_samples/cries/skiploom.bin\"\n\n\t.align 2\nCry_Jumpluff::\n\t.incbin \"sound/direct_sound_samples/cries/jumpluff.bin\"\n\n\t.align 2\nCry_Aipom::\n\t.incbin \"sound/direct_sound_samples/cries/aipom.bin\"\n\n\t.align 2\nCry_Sunkern::\n\t.incbin \"sound/direct_sound_samples/cries/sunkern.bin\"\n\n\t.align 2\nCry_Sunflora::\n\t.incbin \"sound/direct_sound_samples/cries/sunflora.bin\"\n\n\t.align 2\nCry_Yanma::\n\t.incbin \"sound/direct_sound_samples/cries/yanma.bin\"\n\n\t.align 2\nCry_Wooper::\n\t.incbin \"sound/direct_sound_samples/cries/wooper.bin\"\n\n\t.align 2\nCry_Quagsire::\n\t.incbin \"sound/direct_sound_samples/cries/quagsire.bin\"\n\n\t.align 2\nCry_Espeon::\n\t.incbin \"sound/direct_sound_samples/cries/espeon.bin\"\n\n\t.align 2\nCry_Umbreon::\n\t.incbin \"sound/direct_sound_samples/cries/umbreon.bin\"\n\n\t.align 2\nCry_Murkrow::\n\t.incbin \"sound/direct_sound_samples/cries/murkrow.bin\"\n\n\t.align 2\nCry_Slowking::\n\t.incbin \"sound/direct_sound_samples/cries/slowking.bin\"\n\n\t.align 2\nCry_Misdreavus::\n\t.incbin \"sound/direct_sound_samples/cries/misdreavus.bin\"\n\n\t.align 2\nCry_Unown::\n\t.incbin \"sound/direct_sound_samples/cries/unown.bin\"\n\n\t.align 2\nCry_Wobbuffet::\n\t.incbin \"sound/direct_sound_samples/cries/wobbuffet.bin\"\n\n\t.align 2\nCry_Girafarig::\n\t.incbin \"sound/direct_sound_samples/cries/girafarig.bin\"\n\n\t.align 2\nCry_Pineco::\n\t.incbin \"sound/direct_sound_samples/cries/pineco.bin\"\n\n\t.align 2\nCry_Forretress::\n\t.incbin \"sound/direct_sound_samples/cries/forretress.bin\"\n\n\t.align 2\nCry_Dunsparce::\n\t.incbin \"sound/direct_sound_samples/cries/dunsparce.bin\"\n\n\t.align 2\nCry_Gligar::\n\t.incbin \"sound/direct_sound_samples/cries/gligar.bin\"\n\n\t.align 2\nCry_Steelix::\n\t.incbin \"sound/direct_sound_samples/cries/steelix.bin\"\n\n\t.align 2\nCry_Snubbull::\n\t.incbin \"sound/direct_sound_samples/cries/snubbull.bin\"\n\n\t.align 2\nCry_Granbull::\n\t.incbin \"sound/direct_sound_samples/cries/granbull.bin\"\n\n\t.align 2\nCry_Qwilfish::\n\t.incbin \"sound/direct_sound_samples/cries/qwilfish.bin\"\n\n\t.align 2\nCry_Scizor::\n\t.incbin \"sound/direct_sound_samples/cries/scizor.bin\"\n\n\t.align 2\nCry_Shuckle::\n\t.incbin \"sound/direct_sound_samples/cries/shuckle.bin\"\n\n\t.align 2\nCry_Heracross::\n\t.incbin \"sound/direct_sound_samples/cries/heracross.bin\"\n\n\t.align 2\nCry_Sneasel::\n\t.incbin \"sound/direct_sound_samples/cries/sneasel.bin\"\n\n\t.align 2\nCry_Teddiursa::\n\t.incbin \"sound/direct_sound_samples/cries/teddiursa.bin\"\n\n\t.align 2\nCry_Ursaring::\n\t.incbin \"sound/direct_sound_samples/cries/ursaring.bin\"\n\n\t.align 2\nCry_Slugma::\n\t.incbin \"sound/direct_sound_samples/cries/slugma.bin\"\n\n\t.align 2\nCry_Magcargo::\n\t.incbin \"sound/direct_sound_samples/cries/magcargo.bin\"\n\n\t.align 2\nCry_Swinub::\n\t.incbin \"sound/direct_sound_samples/cries/swinub.bin\"\n\n\t.align 2\nCry_Piloswine::\n\t.incbin \"sound/direct_sound_samples/cries/piloswine.bin\"\n\n\t.align 2\nCry_Corsola::\n\t.incbin \"sound/direct_sound_samples/cries/corsola.bin\"\n\n\t.align 2\nCry_Remoraid::\n\t.incbin \"sound/direct_sound_samples/cries/remoraid.bin\"\n\n\t.align 2\nCry_Octillery::\n\t.incbin \"sound/direct_sound_samples/cries/octillery.bin\"\n\n\t.align 2\nCry_Delibird::\n\t.incbin \"sound/direct_sound_samples/cries/delibird.bin\"\n\n\t.align 2\nCry_Mantine::\n\t.incbin \"sound/direct_sound_samples/cries/mantine.bin\"\n\n\t.align 2\nCry_Skarmory::\n\t.incbin \"sound/direct_sound_samples/cries/skarmory.bin\"\n\n\t.align 2\nCry_Houndour::\n\t.incbin \"sound/direct_sound_samples/cries/houndour.bin\"\n\n\t.align 2\nCry_Houndoom::\n\t.incbin \"sound/direct_sound_samples/cries/houndoom.bin\"\n\n\t.align 2\nCry_Kingdra::\n\t.incbin \"sound/direct_sound_samples/cries/kingdra.bin\"\n\n\t.align 2\nCry_Phanpy::\n\t.incbin \"sound/direct_sound_samples/cries/phanpy.bin\"\n\n\t.align 2\nCry_Donphan::\n\t.incbin \"sound/direct_sound_samples/cries/donphan.bin\"\n\n\t.align 2\nCry_Porygon2::\n\t.incbin \"sound/direct_sound_samples/cries/porygon2.bin\"\n\n\t.align 2\nCry_Stantler::\n\t.incbin \"sound/direct_sound_samples/cries/stantler.bin\"\n\n\t.align 2\nCry_Smeargle::\n\t.incbin \"sound/direct_sound_samples/cries/smeargle.bin\"\n\n\t.align 2\nCry_Tyrogue::\n\t.incbin \"sound/direct_sound_samples/cries/tyrogue.bin\"\n\n\t.align 2\nCry_Hitmontop::\n\t.incbin \"sound/direct_sound_samples/cries/hitmontop.bin\"\n\n\t.align 2\nCry_Smoochum::\n\t.incbin \"sound/direct_sound_samples/cries/smoochum.bin\"\n\n\t.align 2\nCry_Elekid::\n\t.incbin \"sound/direct_sound_samples/cries/elekid.bin\"\n\n\t.align 2\nCry_Magby::\n\t.incbin \"sound/direct_sound_samples/cries/magby.bin\"\n\n\t.align 2\nCry_Miltank::\n\t.incbin \"sound/direct_sound_samples/cries/miltank.bin\"\n\n\t.align 2\nCry_Blissey::\n\t.incbin \"sound/direct_sound_samples/cries/blissey.bin\"\n\n\t.align 2\nCry_Raikou::\n\t.incbin \"sound/direct_sound_samples/cries/raikou.bin\"\n\n\t.align 2\nCry_Entei::\n\t.incbin \"sound/direct_sound_samples/cries/entei.bin\"\n\n\t.align 2\nCry_Suicune::\n\t.incbin \"sound/direct_sound_samples/cries/suicune.bin\"\n\n\t.align 2\nCry_Larvitar::\n\t.incbin \"sound/direct_sound_samples/cries/larvitar.bin\"\n\n\t.align 2\nCry_Pupitar::\n\t.incbin \"sound/direct_sound_samples/cries/pupitar.bin\"\n\n\t.align 2\nCry_Tyranitar::\n\t.incbin \"sound/direct_sound_samples/cries/tyranitar.bin\"\n\n\t.align 2\nCry_Lugia::\n\t.incbin \"sound/direct_sound_samples/cries/lugia.bin\"\n\n\t.align 2\nCry_HoOh::\n\t.incbin \"sound/direct_sound_samples/cries/ho_oh.bin\"\n\n\t.align 2\nCry_Celebi::\n\t.incbin \"sound/direct_sound_samples/cries/celebi.bin\"\n\n\t.align 2\nCry_Kecleon::\n\t.incbin \"sound/direct_sound_samples/cries/kecleon.bin\"\n\n\t.align 2\nCry_Roselia::\n\t.incbin \"sound/direct_sound_samples/cries/roselia.bin\"\n\n\t.align 2\nCry_Torkoal::\n\t.incbin \"sound/direct_sound_samples/cries/torkoal.bin\"\n\n\t.align 2\nCry_Electrike::\n\t.incbin \"sound/direct_sound_samples/cries/electrike.bin\"\n\n\t.align 2\nCry_Manectric::\n\t.incbin \"sound/direct_sound_samples/cries/manectric.bin\"\n\n\t.align 2\nCry_Duskull::\n\t.incbin \"sound/direct_sound_samples/cries/duskull.bin\"\n\n\t.align 2\nCry_Latias::\n\t.incbin \"sound/direct_sound_samples/cries/latias.bin\"\n\n\t.align 2\nCry_Wynaut::\n\t.incbin \"sound/direct_sound_samples/cries/wynaut.bin\"\n\n\t.align 2\nCry_Seviper::\n\t.incbin \"sound/direct_sound_samples/cries/seviper.bin\"\n\n\t.align 2\nCry_Sharpedo::\n\t.incbin \"sound/direct_sound_samples/cries/sharpedo.bin\"\n\n\t.align 2\nCry_Zangoose::\n\t.incbin \"sound/direct_sound_samples/cries/zangoose.bin\"\n\n\t.align 2\nCry_Azurill::\n\t.incbin \"sound/direct_sound_samples/cries/azurill.bin\"\n\n\t.align 2\nCry_Swablu::\n\t.incbin \"sound/direct_sound_samples/cries/swablu.bin\"\n\n\t.align 2\nCry_Altaria::\n\t.incbin \"sound/direct_sound_samples/cries/altaria.bin\"\n\n\t.align 2\nCry_Unused265::\n\t.incbin \"sound/direct_sound_samples/cries/unused_265.bin\"\n\n\t.align 2\nCry_Taillow::\n\t.incbin \"sound/direct_sound_samples/cries/taillow.bin\"\n\n\t.align 2\nCry_Swellow::\n\t.incbin \"sound/direct_sound_samples/cries/swellow.bin\"\n\n\t.align 2\nCry_Unused268::\n\t.incbin \"sound/direct_sound_samples/cries/unused_268.bin\"\n\n\t.align 2\nCry_Spinda::\n\t.incbin \"sound/direct_sound_samples/cries/spinda.bin\"\n\n\t.align 2\nCry_Torchic::\n\t.incbin \"sound/direct_sound_samples/cries/torchic.bin\"\n\n\t.align 2\nCry_Combusken::\n\t.incbin \"sound/direct_sound_samples/cries/combusken.bin\"\n\n\t.align 2\nCry_Blaziken::\n\t.incbin \"sound/direct_sound_samples/cries/blaziken.bin\"\n\n\t.align 2\nCry_Treecko::\n\t.incbin \"sound/direct_sound_samples/cries/treecko.bin\"\n\n\t.align 2\nCry_Grovyle::\n\t.incbin \"sound/direct_sound_samples/cries/grovyle.bin\"\n\n\t.align 2\nCry_Sceptile::\n\t.incbin \"sound/direct_sound_samples/cries/sceptile.bin\"\n\n\t.align 2\nCry_Mudkip::\n\t.incbin \"sound/direct_sound_samples/cries/mudkip.bin\"\n\n\t.align 2\nCry_Marshtomp::\n\t.incbin \"sound/direct_sound_samples/cries/marshtomp.bin\"\n\n\t.align 2\nCry_Swampert::\n\t.incbin \"sound/direct_sound_samples/cries/swampert.bin\"\n\n\t.align 2\nCry_Pelipper::\n\t.incbin \"sound/direct_sound_samples/cries/pelipper.bin\"\n\n\t.align 2\nCry_Wingull::\n\t.incbin \"sound/direct_sound_samples/cries/wingull.bin\"\n\n\t.align 2\nCry_Banette::\n\t.incbin \"sound/direct_sound_samples/cries/banette.bin\"\n\n\t.align 2\nCry_Shuppet::\n\t.incbin \"sound/direct_sound_samples/cries/shuppet.bin\"\n\n\t.align 2\nCry_Lotad::\n\t.incbin \"sound/direct_sound_samples/cries/lotad.bin\"\n\n\t.align 2\nCry_Lombre::\n\t.incbin \"sound/direct_sound_samples/cries/lombre.bin\"\n\n\t.align 2\nCry_Ludicolo::\n\t.incbin \"sound/direct_sound_samples/cries/ludicolo.bin\"\n\n\t.align 2\nCry_Seedot::\n\t.incbin \"sound/direct_sound_samples/cries/seedot.bin\"\n\n\t.align 2\nCry_Nuzleaf::\n\t.incbin \"sound/direct_sound_samples/cries/nuzleaf.bin\"\n\n\t.align 2\nCry_Shiftry::\n\t.incbin \"sound/direct_sound_samples/cries/shiftry.bin\"\n\n\t.align 2\nCry_Carvanha::\n\t.incbin \"sound/direct_sound_samples/cries/carvanha.bin\"\n\n\t.align 2\nCry_Wurmple::\n\t.incbin \"sound/direct_sound_samples/cries/wurmple.bin\"\n\n\t.align 2\nCry_Silcoon::\n\t.incbin \"sound/direct_sound_samples/cries/silcoon.bin\"\n\n\t.align 2\nCry_Beautifly::\n\t.incbin \"sound/direct_sound_samples/cries/beautifly.bin\"\n\n\t.align 2\nCry_Cascoon::\n\t.incbin \"sound/direct_sound_samples/cries/cascoon.bin\"\n\n\t.align 2\nCry_Dustox::\n\t.incbin \"sound/direct_sound_samples/cries/dustox.bin\"\n\n\t.align 2\nCry_Ralts::\n\t.incbin \"sound/direct_sound_samples/cries/ralts.bin\"\n\n\t.align 2\nCry_Kirlia::\n\t.incbin \"sound/direct_sound_samples/cries/kirlia.bin\"\n\n\t.align 2\nCry_Gardevoir::\n\t.incbin \"sound/direct_sound_samples/cries/gardevoir.bin\"\n\n\t.align 2\nCry_Slakoth::\n\t.incbin \"sound/direct_sound_samples/cries/slakoth.bin\"\n\n\t.align 2\nCry_Vigoroth::\n\t.incbin \"sound/direct_sound_samples/cries/vigoroth.bin\"\n\n\t.align 2\nCry_Slaking::\n\t.incbin \"sound/direct_sound_samples/cries/slaking.bin\"\n\n\t.align 2\nCry_Nincada::\n\t.incbin \"sound/direct_sound_samples/cries/nincada.bin\"\n\n\t.align 2\nCry_Ninjask::\n\t.incbin \"sound/direct_sound_samples/cries/ninjask.bin\"\n\n\t.align 2\nCry_Shedinja::\n\t.incbin \"sound/direct_sound_samples/cries/shedinja.bin\"\n\n\t.align 2\nCry_Makuhita::\n\t.incbin \"sound/direct_sound_samples/cries/makuhita.bin\"\n\n\t.align 2\nCry_Hariyama::\n\t.incbin \"sound/direct_sound_samples/cries/hariyama.bin\"\n\n\t.align 2\nCry_Nosepass::\n\t.incbin \"sound/direct_sound_samples/cries/nosepass.bin\"\n\n\t.align 2\nCry_Glalie::\n\t.incbin \"sound/direct_sound_samples/cries/glalie.bin\"\n\n\t.align 2\nCry_Plusle::\n\t.incbin \"sound/direct_sound_samples/cries/plusle.bin\"\n\n\t.align 2\nCry_Minun::\n\t.incbin \"sound/direct_sound_samples/cries/minun.bin\"\n\n\t.align 2\nCry_Surskit::\n\t.incbin \"sound/direct_sound_samples/cries/surskit.bin\"\n\n\t.align 2\nCry_Masquerain::\n\t.incbin \"sound/direct_sound_samples/cries/masquerain.bin\"\n\n\t.align 2\nCry_Skitty::\n\t.incbin \"sound/direct_sound_samples/cries/skitty.bin\"\n\n\t.align 2\nCry_Delcatty::\n\t.incbin \"sound/direct_sound_samples/cries/delcatty.bin\"\n\n\t.align 2\nCry_Gulpin::\n\t.incbin \"sound/direct_sound_samples/cries/gulpin.bin\"\n\n\t.align 2\nCry_Swalot::\n\t.incbin \"sound/direct_sound_samples/cries/swalot.bin\"\n\n\t.align 2\nCry_Numel::\n\t.incbin \"sound/direct_sound_samples/cries/numel.bin\"\n\n\t.align 2\nCry_Camerupt::\n\t.incbin \"sound/direct_sound_samples/cries/camerupt.bin\"\n\n\t.align 2\nCry_Barboach::\n\t.incbin \"sound/direct_sound_samples/cries/barboach.bin\"\n\n\t.align 2\nCry_Whiscash::\n\t.incbin \"sound/direct_sound_samples/cries/whiscash.bin\"\n\n\t.align 2\nCry_Corphish::\n\t.incbin \"sound/direct_sound_samples/cries/corphish.bin\"\n\n\t.align 2\nCry_Crawdaunt::\n\t.incbin \"sound/direct_sound_samples/cries/crawdaunt.bin\"\n\n\t.align 2\nCry_Spoink::\n\t.incbin \"sound/direct_sound_samples/cries/spoink.bin\"\n\n\t.align 2\nCry_Grumpig::\n\t.incbin \"sound/direct_sound_samples/cries/grumpig.bin\"\n\n\t.align 2\nCry_Trapinch::\n\t.incbin \"sound/direct_sound_samples/cries/trapinch.bin\"\n\n\t.align 2\nCry_Vibrava::\n\t.incbin \"sound/direct_sound_samples/cries/vibrava.bin\"\n\n\t.align 2\nCry_Flygon::\n\t.incbin \"sound/direct_sound_samples/cries/flygon.bin\"\n\n\t.align 2\nCry_Cacnea::\n\t.incbin \"sound/direct_sound_samples/cries/cacnea.bin\"\n\n\t.align 2\nCry_Cacturne::\n\t.incbin \"sound/direct_sound_samples/cries/cacturne.bin\"\n\n\t.align 2\nCry_Baltoy::\n\t.incbin \"sound/direct_sound_samples/cries/baltoy.bin\"\n\n\t.align 2\nCry_Claydol::\n\t.incbin \"sound/direct_sound_samples/cries/claydol.bin\"\n\n\t.align 2\nCry_Lunatone::\n\t.incbin \"sound/direct_sound_samples/cries/lunatone.bin\"\n\n\t.align 2\nCry_Solrock::\n\t.incbin \"sound/direct_sound_samples/cries/solrock.bin\"\n\n\t.align 2\nCry_Feebas::\n\t.incbin \"sound/direct_sound_samples/cries/feebas.bin\"\n\n\t.align 2\nCry_Milotic::\n\t.incbin \"sound/direct_sound_samples/cries/milotic.bin\"\n\n\t.align 2\nCry_Absol::\n\t.incbin \"sound/direct_sound_samples/cries/absol.bin\"\n\n\t.align 2\nCry_Meditite::\n\t.incbin \"sound/direct_sound_samples/cries/meditite.bin\"\n\n\t.align 2\nCry_Medicham::\n\t.incbin \"sound/direct_sound_samples/cries/medicham.bin\"\n\n\t.align 2\nCry_Spheal::\n\t.incbin \"sound/direct_sound_samples/cries/spheal.bin\"\n\n\t.align 2\nCry_Sealeo::\n\t.incbin \"sound/direct_sound_samples/cries/sealeo.bin\"\n\n\t.align 2\nCry_Walrein::\n\t.incbin \"sound/direct_sound_samples/cries/walrein.bin\"\n\n\t.align 2\nCry_Clamperl::\n\t.incbin \"sound/direct_sound_samples/cries/clamperl.bin\"\n\n\t.align 2\nCry_Huntail::\n\t.incbin \"sound/direct_sound_samples/cries/huntail.bin\"\n\n\t.align 2\nCry_Gorebyss::\n\t.incbin \"sound/direct_sound_samples/cries/gorebyss.bin\"\n\n\t.align 2\nCry_Lileep::\n\t.incbin \"sound/direct_sound_samples/cries/lileep.bin\"\n\n\t.align 2\nCry_Cradily::\n\t.incbin \"sound/direct_sound_samples/cries/cradily.bin\"\n\n\t.align 2\nCry_Anorith::\n\t.incbin \"sound/direct_sound_samples/cries/anorith.bin\"\n\n\t.align 2\nCry_Armaldo::\n\t.incbin \"sound/direct_sound_samples/cries/armaldo.bin\"\n\n\t.align 2\nCry_Beldum::\n\t.incbin \"sound/direct_sound_samples/cries/beldum.bin\"\n\n\t.align 2\nCry_Metang::\n\t.incbin \"sound/direct_sound_samples/cries/metang.bin\"\n\n\t.align 2\nCry_Metagross::\n\t.incbin \"sound/direct_sound_samples/cries/metagross.bin\"\n\n\t.align 2\nCry_Bagon::\n\t.incbin \"sound/direct_sound_samples/cries/bagon.bin\"\n\n\t.align 2\nCry_Shelgon::\n\t.incbin \"sound/direct_sound_samples/cries/shelgon.bin\"\n\n\t.align 2\nCry_Regirock::\n\t.incbin \"sound/direct_sound_samples/cries/regirock.bin\"\n\n\t.align 2\nCry_Regice::\n\t.incbin \"sound/direct_sound_samples/cries/regice.bin\"\n\n\t.align 2\nCry_Registeel::\n\t.incbin \"sound/direct_sound_samples/cries/registeel.bin\"\n\n\t.align 2\nCry_Castform::\n\t.incbin \"sound/direct_sound_samples/cries/castform.bin\"\n\n\t.align 2\nCry_Volbeat::\n\t.incbin \"sound/direct_sound_samples/cries/volbeat.bin\"\n\n\t.align 2\nCry_Illumise::\n\t.incbin \"sound/direct_sound_samples/cries/illumise.bin\"\n\n\t.align 2\nCry_Poochyena::\n\t.incbin \"sound/direct_sound_samples/cries/poochyena.bin\"\n\n\t.align 2\nCry_Mightyena::\n\t.incbin \"sound/direct_sound_samples/cries/mightyena.bin\"\n\n\t.align 2\nCry_Dusclops::\n\t.incbin \"sound/direct_sound_samples/cries/dusclops.bin\"\n\n\t.align 2\nCry_Sableye::\n\t.incbin \"sound/direct_sound_samples/cries/sableye.bin\"\n\n\t.align 2\nCry_Mawile::\n\t.incbin \"sound/direct_sound_samples/cries/mawile.bin\"\n\n\t.align 2\nCry_Aron::\n\t.incbin \"sound/direct_sound_samples/cries/aron.bin\"\n\n\t.align 2\nCry_Lairon::\n\t.incbin \"sound/direct_sound_samples/cries/lairon.bin\"\n\n\t.align 2\nCry_Aggron::\n\t.incbin \"sound/direct_sound_samples/cries/aggron.bin\"\n\n\t.align 2\nCry_Relicanth::\n\t.incbin \"sound/direct_sound_samples/cries/relicanth.bin\"\n\n\t.align 2\nCry_Luvdisc::\n\t.incbin \"sound/direct_sound_samples/cries/luvdisc.bin\"\n\n\t.align 2\nCry_Groudon::\n\t.incbin \"sound/direct_sound_samples/cries/groudon.bin\"\n\n\t.align 2\nCry_Kyogre::\n\t.incbin \"sound/direct_sound_samples/cries/kyogre.bin\"\n\n\t.align 2\nCry_Rayquaza::\n\t.incbin \"sound/direct_sound_samples/cries/rayquaza.bin\"\n\n\t.align 2\nCry_Salamence::\n\t.incbin \"sound/direct_sound_samples/cries/salamence.bin\"\n\n\t.align 2\nCry_Breloom::\n\t.incbin \"sound/direct_sound_samples/cries/breloom.bin\"\n\n\t.align 2\nCry_Shroomish::\n\t.incbin \"sound/direct_sound_samples/cries/shroomish.bin\"\n\n\t.align 2\nCry_Linoone::\n\t.incbin \"sound/direct_sound_samples/cries/linoone.bin\"\n\n\t.align 2\nCry_Tropius::\n\t.incbin \"sound/direct_sound_samples/cries/tropius.bin\"\n\n\t.align 2\nCry_Wailmer::\n\t.incbin \"sound/direct_sound_samples/cries/wailmer.bin\"\n\n\t.align 2\nCry_Zigzagoon::\n\t.incbin \"sound/direct_sound_samples/cries/zigzagoon.bin\"\n\n\t.align 2\nCry_Exploud::\n\t.incbin \"sound/direct_sound_samples/cries/exploud.bin\"\n\n\t.align 2\nCry_Loudred::\n\t.incbin \"sound/direct_sound_samples/cries/loudred.bin\"\n\n\t.align 2\nCry_Wailord::\n\t.incbin \"sound/direct_sound_samples/cries/wailord.bin\"\n\n\t.align 2\nCry_Whismur::\n\t.incbin \"sound/direct_sound_samples/cries/whismur.bin\"\n\n\t.align 2\nCry_Snorunt::\n\t.incbin \"sound/direct_sound_samples/cries/snorunt.bin\"\n\n\t.align 2\nCry_Latios::\n\t.incbin \"sound/direct_sound_samples/cries/latios.bin\"\n\n\t.align 2\nCry_Jirachi::\n\t.incbin \"sound/direct_sound_samples/cries/jirachi.bin\"\n\n\t.align 2\nCry_Deoxys::\n\t.incbin \"sound/direct_sound_samples/cries/deoxys.bin\"\n\n\t.align 2\nCry_Chimecho::\n\t.incbin \"sound/direct_sound_samples/cries/chimecho.bin\"\n\n\t.align 2\nDirectSoundWaveData_register_noise::\n\t.incbin \"sound/direct_sound_samples/register_noise.bin\"\n\n\t.align 2\nDirectSoundWaveData_unknown_18::\n\t.incbin \"sound/direct_sound_samples/unknown_18.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_nylon_str_guitar::\n\t.incbin \"sound/direct_sound_samples/sc88pro_nylon_str_guitar.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_special_scream_drive::\n\t.incbin \"sound/direct_sound_samples/sd90_special_scream_drive.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_1::\n\t.incbin \"sound/direct_sound_samples/phonemes/01.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_2::\n\t.incbin \"sound/direct_sound_samples/phonemes/02.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_3::\n\t.incbin \"sound/direct_sound_samples/phonemes/03.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_4::\n\t.incbin \"sound/direct_sound_samples/phonemes/04.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_5::\n\t.incbin \"sound/direct_sound_samples/phonemes/05.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_6::\n\t.incbin \"sound/direct_sound_samples/phonemes/06.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_7::\n\t.incbin \"sound/direct_sound_samples/phonemes/07.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_8::\n\t.incbin \"sound/direct_sound_samples/phonemes/08.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_9::\n\t.incbin \"sound/direct_sound_samples/phonemes/09.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_10::\n\t.incbin \"sound/direct_sound_samples/phonemes/10.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_11::\n\t.incbin \"sound/direct_sound_samples/phonemes/11.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_12::\n\t.incbin \"sound/direct_sound_samples/phonemes/12.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_13::\n\t.incbin \"sound/direct_sound_samples/phonemes/13.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_14::\n\t.incbin \"sound/direct_sound_samples/phonemes/14.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_15::\n\t.incbin \"sound/direct_sound_samples/phonemes/15.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_16::\n\t.incbin \"sound/direct_sound_samples/phonemes/16.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_17::\n\t.incbin \"sound/direct_sound_samples/phonemes/17.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_18::\n\t.incbin \"sound/direct_sound_samples/phonemes/18.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_19::\n\t.incbin \"sound/direct_sound_samples/phonemes/19.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_20::\n\t.incbin \"sound/direct_sound_samples/phonemes/20.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_21::\n\t.incbin \"sound/direct_sound_samples/phonemes/21.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_22::\n\t.incbin \"sound/direct_sound_samples/phonemes/22.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_23::\n\t.incbin \"sound/direct_sound_samples/phonemes/23.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_24::\n\t.incbin \"sound/direct_sound_samples/phonemes/24.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_25::\n\t.incbin \"sound/direct_sound_samples/phonemes/25.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_26::\n\t.incbin \"sound/direct_sound_samples/phonemes/26.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_27::\n\t.incbin \"sound/direct_sound_samples/phonemes/27.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_28::\n\t.incbin \"sound/direct_sound_samples/phonemes/28.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_29::\n\t.incbin \"sound/direct_sound_samples/phonemes/29.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_30::\n\t.incbin \"sound/direct_sound_samples/phonemes/30.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_31::\n\t.incbin \"sound/direct_sound_samples/phonemes/31.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_32::\n\t.incbin \"sound/direct_sound_samples/phonemes/32.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_33::\n\t.incbin \"sound/direct_sound_samples/phonemes/33.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_34::\n\t.incbin \"sound/direct_sound_samples/phonemes/34.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_35::\n\t.incbin \"sound/direct_sound_samples/phonemes/35.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_36::\n\t.incbin \"sound/direct_sound_samples/phonemes/36.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_37::\n\t.incbin \"sound/direct_sound_samples/phonemes/37.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_38::\n\t.incbin \"sound/direct_sound_samples/phonemes/38.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_39::\n\t.incbin \"sound/direct_sound_samples/phonemes/39.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_40::\n\t.incbin \"sound/direct_sound_samples/phonemes/40.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_41::\n\t.incbin \"sound/direct_sound_samples/phonemes/41.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_42::\n\t.incbin \"sound/direct_sound_samples/phonemes/42.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_43::\n\t.incbin \"sound/direct_sound_samples/phonemes/43.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_44::\n\t.incbin \"sound/direct_sound_samples/phonemes/44.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_45::\n\t.incbin \"sound/direct_sound_samples/phonemes/45.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_46::\n\t.incbin \"sound/direct_sound_samples/phonemes/46.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_47::\n\t.incbin \"sound/direct_sound_samples/phonemes/47.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_48::\n\t.incbin \"sound/direct_sound_samples/phonemes/48.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_49::\n\t.incbin \"sound/direct_sound_samples/phonemes/49.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_50::\n\t.incbin \"sound/direct_sound_samples/phonemes/50.bin\"\n\n\t.align 2\nDirectSoundWaveData_Phoneme_51::\n\t.incbin \"sound/direct_sound_samples/phonemes/51.bin\"\n\n\t.align 2\nDirectSoundWaveData_sc88pro_accordion_duplicate::\n\t.incbin \"sound/direct_sound_samples/sc88pro_accordion_duplicate.bin\"\n\n\t.align 2\nDirectSoundWaveData_steinway_b_piano::\n\t.incbin \"sound/direct_sound_samples/steinway_b_piano.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_classical_whistle::\n\t.incbin \"sound/direct_sound_samples/sd90_classical_whistle.bin\"\n\n\t.align 2\nDirectSoundWaveData_sd90_enhanced_delay_shaku::\n\t.incbin \"sound/direct_sound_samples/sd90_enhanced_delay_shaku.bin\"\n\n\t.align 2\nDirectSoundWaveData_wave_54::\n\t.incbin \"sound/direct_sound_samples/wave_54.bin\"\n\n\t.align 2\nDirectSoundWaveData_wave_77::\n\t.incbin \"sound/direct_sound_samples/wave_77.bin\"\n"
  },
  {
    "path": "sound/keysplit_tables.inc",
    "content": "@ Due to the way mks4agb (Nintendo's tool) works, key split table labels can\n@ appear before the actual start of the key split table data. If you look at\n@ the first keysplit table (KeySplitTable1), you'll notice it's offset backwards\n@ by 36 bytes. This is because the key split tables don't map instruments\n@ for the entire note range (0-127)--they only map subsets, and the upper\n@ and lower ranges aren't necessarily 0 or 127.\n@\n@ For example if a key split table maps an note range of 10-20, then the key\n@ split table label will be offset 10 bytes before the actual key split data\n@ begins. Therefore, the notes naturally map to the key split table without\n@ any extra offset calculation.\n\n.set KeySplitTable1, . - 36\n\t.byte 0  @ 36\n\t.byte 0  @ 37\n\t.byte 0  @ 38\n\t.byte 0  @ 39\n\t.byte 0  @ 40\n\t.byte 0  @ 41\n\t.byte 0  @ 42\n\t.byte 0  @ 43\n\t.byte 0  @ 44\n\t.byte 0  @ 45\n\t.byte 0  @ 46\n\t.byte 0  @ 47\n\t.byte 0  @ 48\n\t.byte 0  @ 49\n\t.byte 0  @ 50\n\t.byte 0  @ 51\n\t.byte 0  @ 52\n\t.byte 0  @ 53\n\t.byte 0  @ 54\n\t.byte 1  @ 55\n\t.byte 1  @ 56\n\t.byte 1  @ 57\n\t.byte 1  @ 58\n\t.byte 1  @ 59\n\t.byte 1  @ 60\n\t.byte 1  @ 61\n\t.byte 1  @ 62\n\t.byte 1  @ 63\n\t.byte 1  @ 64\n\t.byte 1  @ 65\n\t.byte 1  @ 66\n\t.byte 1  @ 67\n\t.byte 1  @ 68\n\t.byte 1  @ 69\n\t.byte 2  @ 70\n\t.byte 2  @ 71\n\t.byte 2  @ 72\n\t.byte 2  @ 73\n\t.byte 2  @ 74\n\t.byte 2  @ 75\n\t.byte 2  @ 76\n\t.byte 2  @ 77\n\t.byte 2  @ 78\n\t.byte 2  @ 79\n\t.byte 2  @ 80\n\t.byte 2  @ 81\n\t.byte 2  @ 82\n\t.byte 2  @ 83\n\t.byte 2  @ 84\n\t.byte 2  @ 85\n\t.byte 2  @ 86\n\t.byte 2  @ 87\n\t.byte 2  @ 88\n\t.byte 2  @ 89\n\t.byte 2  @ 90\n\t.byte 3  @ 91\n\t.byte 3  @ 92\n\t.byte 3  @ 93\n\t.byte 3  @ 94\n\t.byte 3  @ 95\n\t.byte 3  @ 96\n\t.byte 3  @ 97\n\t.byte 3  @ 98\n\t.byte 3  @ 99\n\t.byte 3  @ 100\n\t.byte 3  @ 101\n\t.byte 3  @ 102\n\t.byte 3  @ 103\n\t.byte 3  @ 104\n\t.byte 3  @ 105\n\t.byte 3  @ 106\n\t.byte 3  @ 107\n\n.set KeySplitTable2, . - 36\n\t.byte 0  @ 36\n\t.byte 0  @ 37\n\t.byte 0  @ 38\n\t.byte 0  @ 39\n\t.byte 0  @ 40\n\t.byte 0  @ 41\n\t.byte 0  @ 42\n\t.byte 0  @ 43\n\t.byte 0  @ 44\n\t.byte 0  @ 45\n\t.byte 0  @ 46\n\t.byte 0  @ 47\n\t.byte 0  @ 48\n\t.byte 0  @ 49\n\t.byte 0  @ 50\n\t.byte 0  @ 51\n\t.byte 0  @ 52\n\t.byte 0  @ 53\n\t.byte 0  @ 54\n\t.byte 0  @ 55\n\t.byte 0  @ 56\n\t.byte 0  @ 57\n\t.byte 0  @ 58\n\t.byte 0  @ 59\n\t.byte 0  @ 60\n\t.byte 0  @ 61\n\t.byte 0  @ 62\n\t.byte 0  @ 63\n\t.byte 0  @ 64\n\t.byte 0  @ 65\n\t.byte 0  @ 66\n\t.byte 0  @ 67\n\t.byte 0  @ 68\n\t.byte 1  @ 69\n\t.byte 1  @ 70\n\t.byte 1  @ 71\n\t.byte 1  @ 72\n\t.byte 1  @ 73\n\t.byte 1  @ 74\n\t.byte 1  @ 75\n\t.byte 1  @ 76\n\t.byte 1  @ 77\n\t.byte 1  @ 78\n\t.byte 1  @ 79\n\t.byte 1  @ 80\n\t.byte 2  @ 81\n\t.byte 2  @ 82\n\t.byte 2  @ 83\n\t.byte 2  @ 84\n\t.byte 2  @ 85\n\t.byte 2  @ 86\n\t.byte 2  @ 87\n\t.byte 2  @ 88\n\t.byte 2  @ 89\n\t.byte 2  @ 90\n\t.byte 2  @ 91\n\t.byte 2  @ 92\n\t.byte 2  @ 93\n\t.byte 2  @ 94\n\t.byte 2  @ 95\n\t.byte 2  @ 96\n\t.byte 2  @ 97\n\t.byte 2  @ 98\n\t.byte 2  @ 99\n\t.byte 2  @ 100\n\t.byte 2  @ 101\n\t.byte 2  @ 102\n\t.byte 2  @ 103\n\t.byte 2  @ 104\n\t.byte 2  @ 105\n\t.byte 2  @ 106\n\t.byte 2  @ 107\n\n.set KeySplitTable3, . - 36\n\t.byte 0  @ 36\n\t.byte 0  @ 37\n\t.byte 0  @ 38\n\t.byte 0  @ 39\n\t.byte 0  @ 40\n\t.byte 0  @ 41\n\t.byte 0  @ 42\n\t.byte 0  @ 43\n\t.byte 0  @ 44\n\t.byte 0  @ 45\n\t.byte 0  @ 46\n\t.byte 0  @ 47\n\t.byte 0  @ 48\n\t.byte 0  @ 49\n\t.byte 0  @ 50\n\t.byte 0  @ 51\n\t.byte 0  @ 52\n\t.byte 0  @ 53\n\t.byte 0  @ 54\n\t.byte 0  @ 55\n\t.byte 0  @ 56\n\t.byte 0  @ 57\n\t.byte 0  @ 58\n\t.byte 0  @ 59\n\t.byte 0  @ 60\n\t.byte 0  @ 61\n\t.byte 0  @ 62\n\t.byte 0  @ 63\n\t.byte 0  @ 64\n\t.byte 0  @ 65\n\t.byte 1  @ 66\n\t.byte 1  @ 67\n\t.byte 1  @ 68\n\t.byte 1  @ 69\n\t.byte 1  @ 70\n\t.byte 1  @ 71\n\t.byte 1  @ 72\n\t.byte 1  @ 73\n\t.byte 1  @ 74\n\t.byte 1  @ 75\n\t.byte 1  @ 76\n\t.byte 1  @ 77\n\t.byte 1  @ 78\n\t.byte 1  @ 79\n\t.byte 1  @ 80\n\t.byte 1  @ 81\n\t.byte 1  @ 82\n\t.byte 1  @ 83\n\t.byte 2  @ 84\n\t.byte 2  @ 85\n\t.byte 2  @ 86\n\t.byte 2  @ 87\n\t.byte 2  @ 88\n\t.byte 2  @ 89\n\t.byte 2  @ 90\n\t.byte 2  @ 91\n\t.byte 2  @ 92\n\t.byte 2  @ 93\n\t.byte 2  @ 94\n\t.byte 2  @ 95\n\t.byte 2  @ 96\n\t.byte 2  @ 97\n\t.byte 2  @ 98\n\t.byte 2  @ 99\n\t.byte 2  @ 100\n\t.byte 2  @ 101\n\t.byte 2  @ 102\n\t.byte 2  @ 103\n\t.byte 2  @ 104\n\t.byte 2  @ 105\n\t.byte 2  @ 106\n\t.byte 2  @ 107\n\n.set KeySplitTable4, . - 24\n\t.byte 0  @ 24\n\t.byte 0  @ 25\n\t.byte 0  @ 26\n\t.byte 0  @ 27\n\t.byte 0  @ 28\n\t.byte 0  @ 29\n\t.byte 0  @ 30\n\t.byte 0  @ 31\n\t.byte 0  @ 32\n\t.byte 0  @ 33\n\t.byte 0  @ 34\n\t.byte 0  @ 35\n\t.byte 0  @ 36\n\t.byte 0  @ 37\n\t.byte 0  @ 38\n\t.byte 0  @ 39\n\t.byte 0  @ 40\n\t.byte 0  @ 41\n\t.byte 1  @ 42\n\t.byte 1  @ 43\n\t.byte 1  @ 44\n\t.byte 1  @ 45\n\t.byte 1  @ 46\n\t.byte 1  @ 47\n\t.byte 1  @ 48\n\t.byte 1  @ 49\n\t.byte 1  @ 50\n\t.byte 1  @ 51\n\t.byte 1  @ 52\n\t.byte 1  @ 53\n\t.byte 1  @ 54\n\t.byte 1  @ 55\n\t.byte 1  @ 56\n\t.byte 1  @ 57\n\t.byte 1  @ 58\n\t.byte 1  @ 59\n\t.byte 1  @ 60\n\t.byte 1  @ 61\n\t.byte 1  @ 62\n\t.byte 1  @ 63\n\t.byte 1  @ 64\n\t.byte 1  @ 65\n\t.byte 1  @ 66\n\t.byte 1  @ 67\n\t.byte 1  @ 68\n\t.byte 1  @ 69\n\t.byte 1  @ 70\n\t.byte 1  @ 71\n\t.byte 1  @ 72\n\t.byte 1  @ 73\n\t.byte 1  @ 74\n\t.byte 1  @ 75\n\t.byte 1  @ 76\n\t.byte 1  @ 77\n\t.byte 1  @ 78\n\t.byte 1  @ 79\n\t.byte 1  @ 80\n\t.byte 1  @ 81\n\t.byte 1  @ 82\n\t.byte 1  @ 83\n\t.byte 1  @ 84\n\t.byte 1  @ 85\n\t.byte 1  @ 86\n\t.byte 1  @ 87\n\t.byte 1  @ 88\n\t.byte 1  @ 89\n\t.byte 1  @ 90\n\t.byte 1  @ 91\n\t.byte 1  @ 92\n\t.byte 1  @ 93\n\t.byte 1  @ 94\n\t.byte 1  @ 95\n\t.byte 1  @ 96\n\t.byte 1  @ 97\n\t.byte 1  @ 98\n\t.byte 1  @ 99\n\t.byte 1  @ 100\n\t.byte 1  @ 101\n\t.byte 1  @ 102\n\t.byte 1  @ 103\n\t.byte 1  @ 104\n\t.byte 1  @ 105\n\t.byte 1  @ 106\n\t.byte 1  @ 107\n\n.set KeySplitTable5, . - 36\n\t.byte 0  @ 36\n\t.byte 0  @ 37\n\t.byte 0  @ 38\n\t.byte 0  @ 39\n\t.byte 0  @ 40\n\t.byte 0  @ 41\n\t.byte 0  @ 42\n\t.byte 0  @ 43\n\t.byte 0  @ 44\n\t.byte 0  @ 45\n\t.byte 0  @ 46\n\t.byte 0  @ 47\n\t.byte 0  @ 48\n\t.byte 0  @ 49\n\t.byte 0  @ 50\n\t.byte 0  @ 51\n\t.byte 0  @ 52\n\t.byte 0  @ 53\n\t.byte 0  @ 54\n\t.byte 0  @ 55\n\t.byte 0  @ 56\n\t.byte 0  @ 57\n\t.byte 0  @ 58\n\t.byte 0  @ 59\n\t.byte 0  @ 60\n\t.byte 0  @ 61\n\t.byte 0  @ 62\n\t.byte 0  @ 63\n\t.byte 0  @ 64\n\t.byte 0  @ 65\n\t.byte 1  @ 66\n\t.byte 1  @ 67\n\t.byte 1  @ 68\n\t.byte 1  @ 69\n\t.byte 1  @ 70\n\t.byte 1  @ 71\n\t.byte 1  @ 72\n\t.byte 1  @ 73\n\t.byte 1  @ 74\n\t.byte 1  @ 75\n\t.byte 1  @ 76\n\t.byte 1  @ 77\n\t.byte 1  @ 78\n\t.byte 1  @ 79\n\t.byte 1  @ 80\n\t.byte 1  @ 81\n\t.byte 1  @ 82\n\t.byte 1  @ 83\n\t.byte 1  @ 84\n\t.byte 1  @ 85\n\t.byte 1  @ 86\n\t.byte 1  @ 87\n\t.byte 1  @ 88\n\t.byte 1  @ 89\n\t.byte 1  @ 90\n\t.byte 1  @ 91\n\t.byte 1  @ 92\n\t.byte 1  @ 93\n\t.byte 1  @ 94\n\t.byte 1  @ 95\n\t.byte 1  @ 96\n\t.byte 1  @ 97\n\t.byte 1  @ 98\n\t.byte 1  @ 99\n\t.byte 1  @ 100\n\t.byte 1  @ 101\n\t.byte 1  @ 102\n\t.byte 1  @ 103\n\t.byte 1  @ 104\n\t.byte 1  @ 105\n\t.byte 1  @ 106\n\t.byte 1  @ 107\n"
  },
  {
    "path": "sound/music_player_table.inc",
    "content": "\t.equiv TRACK_SIZE, 0x50\n\t.equiv NUM_TRACKS_BGM, 10\n\t.equiv NUM_TRACKS_SE1, 3\n\t.equiv NUM_TRACKS_SE2, 9\n\t.equiv NUM_TRACKS_SE3, 1\n\n    .bss\n\ngMPlayTrack_BGM::\n    .space TRACK_SIZE * NUM_TRACKS_BGM\n    .size gMPlayTrack_BGM, .-gMPlayTrack_BGM\n\ngMPlayTrack_SE1::\n    .space TRACK_SIZE * NUM_TRACKS_SE1\n    .size gMPlayTrack_SE1, .-gMPlayTrack_SE1\n\ngMPlayTrack_SE2::\n    .space TRACK_SIZE * NUM_TRACKS_SE2\n    .size gMPlayTrack_SE2, .-gMPlayTrack_SE2\n\ngMPlayTrack_SE3::\n    .space TRACK_SIZE * NUM_TRACKS_SE3\n    .size gMPlayTrack_SE3, .-gMPlayTrack_SE3\n\n\t.section .rodata\n\n\t.align 2\ngMPlayTable::\n\tmusic_player gMPlayInfo_BGM, gMPlayTrack_BGM, NUM_TRACKS_BGM, 0\n\tmusic_player gMPlayInfo_SE1, gMPlayTrack_SE1, NUM_TRACKS_SE1, 1\n\tmusic_player gMPlayInfo_SE2, gMPlayTrack_SE2, NUM_TRACKS_SE2, 1\n\tmusic_player gMPlayInfo_SE3, gMPlayTrack_SE3, NUM_TRACKS_SE3, 0\n"
  },
  {
    "path": "sound/programmable_wave_data.inc",
    "content": "ProgrammableWaveData_1::\n\t.incbin \"sound/programmable_wave_samples/01.pcm\"\n\nProgrammableWaveData_2::\n\t.incbin \"sound/programmable_wave_samples/02.pcm\"\n\nProgrammableWaveData_3::\n\t.incbin \"sound/programmable_wave_samples/03.pcm\"\n\nProgrammableWaveData_4::\n\t.incbin \"sound/programmable_wave_samples/04.pcm\"\n\nProgrammableWaveData_5::\n\t.incbin \"sound/programmable_wave_samples/05.pcm\"\n\nProgrammableWaveData_6::\n\t.incbin \"sound/programmable_wave_samples/06.pcm\"\n\nProgrammableWaveData_7::\n\t.incbin \"sound/programmable_wave_samples/07.pcm\"\n\nProgrammableWaveData_8::\n\t.incbin \"sound/programmable_wave_samples/08.pcm\"\n\nProgrammableWaveData_9::\n\t.incbin \"sound/programmable_wave_samples/09.pcm\"\n\nProgrammableWaveData_10::\n\t.incbin \"sound/programmable_wave_samples/10.pcm\"\n\nProgrammableWaveData_11::\n\t.incbin \"sound/programmable_wave_samples/11.pcm\"\n\nProgrammableWaveData_12::\n\t.incbin \"sound/programmable_wave_samples/12.pcm\"\n\nProgrammableWaveData_13::\n\t.incbin \"sound/programmable_wave_samples/13.pcm\"\n\nProgrammableWaveData_14::\n\t.incbin \"sound/programmable_wave_samples/14.pcm\"\n\nProgrammableWaveData_15::\n\t.incbin \"sound/programmable_wave_samples/15.pcm\"\n\nProgrammableWaveData_16::\n\t.incbin \"sound/programmable_wave_samples/16.pcm\"\n\n@ Unused\nProgrammableWaveData_17::\n\t.incbin \"sound/programmable_wave_samples/17.pcm\"\n\n@ Unused\nProgrammableWaveData_18::\n\t.incbin \"sound/programmable_wave_samples/18.pcm\"\n\n@ Unused\nProgrammableWaveData_19::\n\t.incbin \"sound/programmable_wave_samples/19.pcm\"\n\n@ Unused\nProgrammableWaveData_20::\n\t.incbin \"sound/programmable_wave_samples/20.pcm\"\n\nProgrammableWaveData_21::\n\t.incbin \"sound/programmable_wave_samples/21.pcm\"\n\nProgrammableWaveData_22::\n\t.incbin \"sound/programmable_wave_samples/22.pcm\"\n\nProgrammableWaveData_23::\n\t.incbin \"sound/programmable_wave_samples/23.pcm\"\n\nProgrammableWaveData_24::\n\t.incbin \"sound/programmable_wave_samples/24.pcm\"\n\nProgrammableWaveData_25::\n\t.incbin \"sound/programmable_wave_samples/25.pcm\"\n"
  },
  {
    "path": "sound/programmable_wave_samples/01.pcm",
    "content": "\u0001%c\u0010\u0001%c\u0010"
  },
  {
    "path": "sound/programmable_wave_samples/02.pcm",
    "content": "\u0002Fu1\u0002Fu1"
  },
  {
    "path": "sound/programmable_wave_samples/03.pcm",
    "content": "ܺvT2\u0010ܺvT2\u0010"
  },
  {
    "path": "sound/programmable_wave_samples/04.pcm",
    "content": "wwe1wwe1"
  },
  {
    "path": "sound/programmable_wave_samples/05.pcm",
    "content": "\u0004ʆC!\u0004ʆC!"
  },
  {
    "path": "sound/programmable_wave_samples/06.pcm",
    "content": "C\u0003FC\u0003F"
  },
  {
    "path": "sound/programmable_wave_samples/10.pcm",
    "content": "fUD3\"\" fUD3\"\" "
  },
  {
    "path": "sound/programmable_wave_samples/11.pcm",
    "content": "fUDDDD@fUDDDD@"
  },
  {
    "path": "sound/programmable_wave_samples/12.pcm",
    "content": "ffffff`ffffff`"
  },
  {
    "path": "sound/programmable_wave_samples/13.pcm",
    "content": ""
  },
  {
    "path": "sound/programmable_wave_samples/14.pcm",
    "content": "gȘVTgȘVT"
  },
  {
    "path": "sound/programmable_wave_samples/16.pcm",
    "content": "\u0004&8J\\ZH6\u0004&8J\\ZH6"
  },
  {
    "path": "sound/programmable_wave_samples/17.pcm",
    "content": "feUDC3\"\u0010feUDC3\"\u0010"
  },
  {
    "path": "sound/programmable_wave_samples/18.pcm",
    "content": "wfUD2\u0010wfUD2\u0010"
  },
  {
    "path": "sound/programmable_wave_samples/19.pcm",
    "content": "̪fUD2\u0010̪fUD2\u0010"
  },
  {
    "path": "sound/programmable_wave_samples/20.pcm",
    "content": "̪vT2\u0010̪vT2\u0010"
  },
  {
    "path": "sound/programmable_wave_samples/21.pcm",
    "content": "wfeUD2wfeUD2"
  },
  {
    "path": "sound/programmable_wave_samples/22.pcm",
    "content": "eT3\"\"\u0010eT3\"\"\u0010"
  },
  {
    "path": "sound/song_table.inc",
    "content": "\t.align 2\n\ngSongTable::\n\tsong mus_dummy, 0, 0\n\tsong se_use_item, 1, 1\n\tsong se_pc_login, 1, 1\n\tsong se_pc_off, 1, 1\n\tsong se_pc_on, 1, 1\n\tsong se_select, 2, 2\n\tsong se_win_open, 1, 1\n\tsong se_wall_hit, 2, 2\n\tsong se_door, 1, 1\n\tsong se_exit, 1, 1\n\tsong se_ledge, 1, 1\n\tsong se_bike_bell, 1, 1\n\tsong se_not_effective, 1, 1\n\tsong se_effective, 1, 1\n\tsong se_super_effective, 1, 1\n\tsong se_ball_open, 1, 1\n\tsong se_faint, 1, 1\n\tsong se_flee, 1, 1\n\tsong se_sliding_door, 1, 1\n\tsong se_ship, 1, 1\n\tsong se_bang, 1, 1\n\tsong se_pin, 1, 1\n\tsong se_boo, 1, 1\n\tsong se_ball, 1, 1\n\tsong se_contest_place, 2, 2\n\tsong se_a, 1, 1\n\tsong se_i, 1, 1\n\tsong se_u, 1, 1\n\tsong se_e, 1, 1\n\tsong se_o, 1, 1\n\tsong se_n, 1, 1\n\tsong se_success, 1, 1\n\tsong se_failure, 1, 1\n\tsong se_exp, 1, 1\n\tsong se_bike_hop, 1, 1\n\tsong se_switch, 1, 1\n\tsong se_click, 1, 1\n\tsong se_fu_zaku, 1, 1\n\tsong se_contest_condition_lose, 1, 1\n\tsong se_lavaridge_fall_warp, 1, 1\n\tsong se_ice_stairs, 1, 1\n\tsong se_ice_break, 1, 1\n\tsong se_ice_crack, 1, 1\n\tsong se_fall, 1, 1\n\tsong se_unlock, 2, 2\n\tsong se_warp_in, 1, 1\n\tsong se_warp_out, 1, 1\n\tsong se_repel, 1, 1\n\tsong se_rotating_gate, 1, 1\n\tsong se_truck_move, 1, 1\n\tsong se_truck_stop, 1, 1\n\tsong se_truck_unload, 2, 2\n\tsong se_truck_door, 1, 1\n\tsong se_berry_blender, 2, 2\n\tsong se_card, 1, 1\n\tsong se_save, 1, 1\n\tsong se_ball_bounce_1, 1, 1\n\tsong se_ball_bounce_2, 1, 1\n\tsong se_ball_bounce_3, 1, 1\n\tsong se_ball_bounce_4, 1, 1\n\tsong se_ball_trade, 2, 2\n\tsong se_ball_throw, 1, 1\n\tsong se_note_c, 2, 2\n\tsong se_note_d, 2, 2\n\tsong se_note_e, 2, 2\n\tsong se_note_f, 2, 2\n\tsong se_note_g, 2, 2\n\tsong se_note_a, 2, 2\n\tsong se_note_b, 2, 2\n\tsong se_note_c_high, 2, 2\n\tsong se_puddle, 2, 2\n\tsong se_bridge_walk, 2, 2\n\tsong se_itemfinder, 1, 1\n\tsong se_ding_dong, 1, 1\n\tsong se_balloon_red, 2, 2\n\tsong se_balloon_blue, 2, 2\n\tsong se_balloon_yellow, 2, 2\n\tsong se_breakable_door, 2, 2\n\tsong se_mud_ball, 2, 2\n\tsong se_field_poison, 1, 1\n\tsong se_escalator, 1, 1\n\tsong se_thunderstorm, 3, 3\n\tsong se_thunderstorm_stop, 3, 3\n\tsong se_downpour, 3, 3\n\tsong se_downpour_stop, 3, 3\n\tsong se_rain, 3, 3\n\tsong se_rain_stop, 3, 3\n\tsong se_thunder, 1, 1\n\tsong se_thunder2, 1, 1\n\tsong se_elevator, 1, 1\n\tsong se_low_health, 3, 3\n\tsong se_exp_max, 1, 1\n\tsong se_roulette_ball, 2, 2\n\tsong se_roulette_ball2, 2, 2\n\tsong se_taillow_wing_flap, 1, 1\n\tsong se_shop, 1, 1\n\tsong se_contest_heart, 1, 1\n\tsong se_contest_curtain_rise, 1, 1\n\tsong se_contest_curtain_fall, 1, 1\n\tsong se_contest_icon_change, 1, 1\n\tsong se_contest_icon_clear, 1, 1\n\tsong se_contest_mons_turn, 1, 1\n\tsong se_shiny, 1, 1\n\tsong se_intro_blast, 1, 1\n\tsong se_mugshot, 1, 1\n\tsong se_applause, 1, 1\n\tsong se_vend, 1, 1\n\tsong se_orb, 1, 1\n\tsong se_dex_scroll, 1, 1\n\tsong se_dex_page, 1, 1\n\tsong se_pokenav_on, 1, 1\n\tsong se_pokenav_off, 1, 1\n\tsong se_dex_search, 1, 1\n\tsong se_egg_hatch, 1, 1\n\tsong se_ball_tray_enter, 1, 1\n\tsong se_ball_tray_ball, 1, 1\n\tsong se_ball_tray_exit, 2, 2\n\tsong se_glass_flute, 1, 1\n\tsong se_m_thunderbolt, 2, 2\n\tsong se_m_thunderbolt2, 1, 1\n\tsong se_m_harden, 1, 1\n\tsong se_m_nightmare, 1, 1\n\tsong se_m_vital_throw, 1, 1\n\tsong se_m_vital_throw2, 1, 1\n\tsong se_m_bubble, 1, 1\n\tsong se_m_bubble2, 1, 1\n\tsong se_m_bubble3, 1, 1\n\tsong se_m_rain_dance, 1, 1\n\tsong se_m_cut, 1, 1\n\tsong se_m_string_shot, 1, 1\n\tsong se_m_string_shot2, 1, 1\n\tsong se_m_rock_throw, 1, 1\n\tsong se_m_gust, 2, 2\n\tsong se_m_gust2, 2, 2\n\tsong se_m_double_slap, 1, 1\n\tsong se_m_double_team, 1, 1\n\tsong se_m_razor_wind, 1, 1\n\tsong se_m_icy_wind, 1, 1\n\tsong se_m_thunder_wave, 1, 1\n\tsong se_m_comet_punch, 1, 1\n\tsong se_m_mega_kick, 1, 1\n\tsong se_m_mega_kick2, 1, 1\n\tsong se_m_crabhammer, 1, 1\n\tsong se_m_jump_kick, 1, 1\n\tsong se_m_flame_wheel, 1, 1\n\tsong se_m_flame_wheel2, 1, 1\n\tsong se_m_flamethrower, 1, 1\n\tsong se_m_fire_punch, 1, 1\n\tsong se_m_toxic, 1, 1\n\tsong se_m_sacred_fire, 1, 1\n\tsong se_m_sacred_fire2, 2, 2\n\tsong se_m_ember, 1, 1\n\tsong se_m_take_down, 2, 2\n\tsong se_m_blizzard, 1, 1\n\tsong se_m_blizzard2, 1, 1\n\tsong se_m_scratch, 1, 1\n\tsong se_m_vicegrip, 1, 1\n\tsong se_m_wing_attack, 1, 1\n\tsong se_m_fly, 1, 1\n\tsong se_m_sand_attack, 1, 1\n\tsong se_m_razor_wind2, 1, 1\n\tsong se_m_bite, 1, 1\n\tsong se_m_headbutt, 1, 1\n\tsong se_m_surf, 1, 1\n\tsong se_m_hydro_pump, 1, 1\n\tsong se_m_whirlpool, 1, 1\n\tsong se_m_horn_attack, 1, 1\n\tsong se_m_tail_whip, 2, 2\n\tsong se_m_mist, 1, 1\n\tsong se_m_poison_powder, 1, 1\n\tsong se_m_bind, 2, 2\n\tsong se_m_dragon_rage, 1, 1\n\tsong se_m_sing, 1, 1\n\tsong se_m_perish_song, 1, 1\n\tsong se_m_pay_day, 1, 1\n\tsong se_m_dig, 1, 1\n\tsong se_m_dizzy_punch, 1, 1\n\tsong se_m_self_destruct, 1, 1\n\tsong se_m_explosion, 1, 1\n\tsong se_m_absorb_2, 1, 1\n\tsong se_m_absorb, 1, 1\n\tsong se_m_screech, 1, 1\n\tsong se_m_bubble_beam, 1, 1\n\tsong se_m_bubble_beam2, 1, 1\n\tsong se_m_supersonic, 1, 1\n\tsong se_m_belly_drum, 1, 1\n\tsong se_m_metronome, 1, 1\n\tsong se_m_bonemerang, 1, 1\n\tsong se_m_lick, 1, 1\n\tsong se_m_psybeam, 1, 1\n\tsong se_m_faint_attack, 1, 1\n\tsong se_m_swords_dance, 1, 1\n\tsong se_m_leer, 1, 1\n\tsong se_m_swagger, 1, 1\n\tsong se_m_swagger2, 1, 1\n\tsong se_m_heal_bell, 1, 1\n\tsong se_m_confuse_ray, 1, 1\n\tsong se_m_snore, 1, 1\n\tsong se_m_brick_break, 1, 1\n\tsong se_m_giga_drain, 1, 1\n\tsong se_m_psybeam2, 1, 1\n\tsong se_m_solar_beam, 2, 2\n\tsong se_m_petal_dance, 1, 1\n\tsong se_m_teleport, 1, 1\n\tsong se_m_minimize, 1, 1\n\tsong se_m_sketch, 1, 1\n\tsong se_m_swift, 1, 1\n\tsong se_m_reflect, 1, 1\n\tsong se_m_barrier, 1, 1\n\tsong se_m_detect, 2, 2\n\tsong se_m_lock_on, 1, 1\n\tsong se_m_moonlight, 1, 1\n\tsong se_m_charm, 1, 1\n\tsong se_m_charge, 1, 1\n\tsong se_m_strength, 1, 1\n\tsong se_m_hyper_beam, 1, 1\n\tsong se_m_waterfall, 1, 1\n\tsong se_m_reversal, 1, 1\n\tsong se_m_acid_armor, 1, 1\n\tsong se_m_sandstorm, 1, 1\n\tsong se_m_tri_attack, 1, 1\n\tsong se_m_tri_attack2, 1, 1\n\tsong se_m_encore, 1, 1\n\tsong se_m_encore2, 2, 2\n\tsong se_m_baton_pass, 1, 1\n\tsong se_m_milk_drink, 1, 1\n\tsong se_m_attract, 1, 1\n\tsong se_m_attract2, 1, 1\n\tsong se_m_morning_sun, 1, 1\n\tsong se_m_flatter, 1, 1\n\tsong se_m_sand_tomb, 1, 1\n\tsong se_m_grasswhistle, 1, 1\n\tsong se_m_spit_up, 1, 1\n\tsong se_m_dive, 1, 1\n\tsong se_m_earthquake, 2, 2\n\tsong se_m_twister, 2, 2\n\tsong se_m_sweet_scent, 1, 1\n\tsong se_m_yawn, 1, 1\n\tsong se_m_sky_uppercut, 2, 2\n\tsong se_m_stat_increase, 1, 1\n\tsong se_m_heat_wave, 1, 1\n\tsong se_m_uproar, 1, 1\n\tsong se_m_hail, 1, 1\n\tsong se_m_cosmic_power, 2, 2\n\tsong se_m_teeter_dance, 1, 1\n\tsong se_m_stat_decrease, 1, 1\n\tsong se_m_haze, 1, 1\n\tsong se_m_hyper_beam2, 1, 1\n\tsong se_rg_door, 1, 1\n\tsong se_rg_card_flip, 1, 1\n\tsong se_rg_card_flipping, 1, 1\n\tsong se_rg_card_open, 1, 1\n\tsong se_rg_bag_cursor, 1, 1\n\tsong se_rg_bag_pocket, 1, 1\n\tsong se_rg_ball_click, 1, 1\n\tsong se_rg_shop, 1, 1\n\tsong se_rg_ss_anne_horn, 1, 1\n\tsong se_rg_help_open, 1, 1\n\tsong se_rg_help_close, 1, 1\n\tsong se_rg_help_error, 1, 1\n\tsong se_rg_deoxys_move, 1, 1\n\tsong se_rg_poke_jump_success, 1, 1\n\tsong se_rg_poke_jump_failure, 1, 1\n\tsong se_pokenav_call, 1, 1\n\tsong se_pokenav_hang_up, 1, 1\n\tsong se_arena_timeup1, 1, 1\n\tsong se_arena_timeup2, 1, 1\n\tsong se_pike_curtain_close, 1, 1\n\tsong se_pike_curtain_open, 1, 1\n\tsong se_sudowoodo_shake, 1, 1\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong dummy_song_header, 0, 0\n\tsong mus_littleroot_test, 0, 0\n\tsong mus_gsc_route38, 0, 0\n\tsong mus_caught, 0, 0\n\tsong mus_victory_wild, 0, 0\n\tsong mus_victory_gym_leader, 0, 0\n\tsong mus_victory_league, 0, 0\n\tsong mus_c_comm_center, 0, 0\n\tsong mus_gsc_pewter, 0, 0\n\tsong mus_c_vs_legend_beast, 0, 0\n\tsong mus_route101, 0, 0\n\tsong mus_route110, 0, 0\n\tsong mus_route120, 0, 0\n\tsong mus_petalburg, 0, 0\n\tsong mus_oldale, 0, 0\n\tsong mus_gym, 0, 0\n\tsong mus_surf, 0, 0\n\tsong mus_petalburg_woods, 0, 0\n\tsong mus_level_up, 2, 2\n\tsong mus_heal, 2, 2\n\tsong mus_obtain_badge, 2, 2\n\tsong mus_obtain_item, 2, 2\n\tsong mus_evolved, 2, 2\n\tsong mus_obtain_tmhm, 2, 2\n\tsong mus_lilycove_museum, 0, 0\n\tsong mus_route122, 0, 0\n\tsong mus_oceanic_museum, 0, 0\n\tsong mus_evolution_intro, 2, 2\n\tsong mus_evolution, 0, 0\n\tsong mus_move_deleted, 2, 2\n\tsong mus_encounter_girl, 0, 0\n\tsong mus_encounter_male, 0, 0\n\tsong mus_abandoned_ship, 0, 0\n\tsong mus_fortree, 0, 0\n\tsong mus_birch_lab, 0, 0\n\tsong mus_b_tower_rs, 0, 0\n\tsong mus_encounter_swimmer, 0, 0\n\tsong mus_cave_of_origin, 0, 0\n\tsong mus_obtain_berry, 2, 2\n\tsong mus_awaken_legend, 2, 2\n\tsong mus_slots_jackpot, 2, 2\n\tsong mus_slots_win, 2, 2\n\tsong mus_too_bad, 2, 2\n\tsong mus_roulette, 0, 0\n\tsong mus_link_contest_p1, 0, 0\n\tsong mus_link_contest_p2, 0, 0\n\tsong mus_link_contest_p3, 0, 0\n\tsong mus_link_contest_p4, 0, 0\n\tsong mus_encounter_rich, 0, 0\n\tsong mus_verdanturf, 0, 0\n\tsong mus_rustboro, 0, 0\n\tsong mus_poke_center, 0, 0\n\tsong mus_route104, 0, 0\n\tsong mus_route119, 0, 0\n\tsong mus_cycling, 0, 0\n\tsong mus_poke_mart, 0, 0\n\tsong mus_littleroot, 0, 0\n\tsong mus_mt_chimney, 0, 0\n\tsong mus_encounter_female, 0, 0\n\tsong mus_lilycove, 0, 0\n\tsong mus_route111, 0, 0\n\tsong mus_help, 0, 0\n\tsong mus_underwater, 0, 0\n\tsong mus_victory_trainer, 0, 0\n\tsong mus_title, 0, 0\n\tsong mus_intro, 0, 0\n\tsong mus_encounter_may, 0, 0\n\tsong mus_encounter_intense, 0, 0\n\tsong mus_encounter_cool, 0, 0\n\tsong mus_route113, 0, 0\n\tsong mus_encounter_aqua, 0, 0\n\tsong mus_follow_me, 0, 0\n\tsong mus_encounter_brendan, 0, 0\n\tsong mus_ever_grande, 0, 0\n\tsong mus_encounter_suspicious, 0, 0\n\tsong mus_victory_aqua_magma, 0, 0\n\tsong mus_cable_car, 0, 0\n\tsong mus_game_corner, 0, 0\n\tsong mus_dewford, 0, 0\n\tsong mus_safari_zone, 0, 0\n\tsong mus_victory_road, 0, 0\n\tsong mus_aqua_magma_hideout, 0, 0\n\tsong mus_sailing, 0, 0\n\tsong mus_mt_pyre, 0, 0\n\tsong mus_slateport, 0, 0\n\tsong mus_mt_pyre_exterior, 0, 0\n\tsong mus_school, 0, 0\n\tsong mus_hall_of_fame, 0, 0\n\tsong mus_fallarbor, 0, 0\n\tsong mus_sealed_chamber, 0, 0\n\tsong mus_contest_winner, 0, 0\n\tsong mus_contest, 0, 0\n\tsong mus_encounter_magma, 0, 0\n\tsong mus_intro_battle, 0, 0\n\tsong mus_abnormal_weather, 0, 0\n\tsong mus_weather_groudon, 0, 0\n\tsong mus_sootopolis, 0, 0\n\tsong mus_contest_results, 0, 0\n\tsong mus_hall_of_fame_room, 0, 0\n\tsong mus_trick_house, 0, 0\n\tsong mus_encounter_twins, 0, 0\n\tsong mus_encounter_elite_four, 0, 0\n\tsong mus_encounter_hiker, 0, 0\n\tsong mus_contest_lobby, 0, 0\n\tsong mus_encounter_interviewer, 0, 0\n\tsong mus_encounter_champion, 0, 0\n\tsong mus_credits, 0, 0\n\tsong mus_end, 0, 0\n\tsong mus_b_frontier, 0, 0\n\tsong mus_b_arena, 0, 0\n\tsong mus_obtain_b_points, 2, 2\n\tsong mus_register_match_call, 2, 2\n\tsong mus_b_pyramid, 0, 0\n\tsong mus_b_pyramid_top, 0, 0\n\tsong mus_b_palace, 0, 0\n\tsong mus_rayquaza_appears, 0, 0\n\tsong mus_b_tower, 0, 0\n\tsong mus_obtain_symbol, 2, 2\n\tsong mus_b_dome, 0, 0\n\tsong mus_b_pike, 0, 0\n\tsong mus_b_factory, 0, 0\n\tsong mus_vs_rayquaza, 0, 0\n\tsong mus_vs_frontier_brain, 0, 0\n\tsong mus_vs_mew, 0, 0\n\tsong mus_b_dome_lobby, 0, 0\n\tsong mus_vs_wild, 0, 0\n\tsong mus_vs_aqua_magma, 0, 0\n\tsong mus_vs_trainer, 0, 0\n\tsong mus_vs_gym_leader, 0, 0\n\tsong mus_vs_champion, 0, 0\n\tsong mus_vs_regi, 0, 0\n\tsong mus_vs_kyogre_groudon, 0, 0\n\tsong mus_vs_rival, 0, 0\n\tsong mus_vs_elite_four, 0, 0\n\tsong mus_vs_aqua_magma_leader, 0, 0\n\tsong mus_rg_follow_me, 0, 0\n\tsong mus_rg_game_corner, 0, 0\n\tsong mus_rg_rocket_hideout, 0, 0\n\tsong mus_rg_gym, 0, 0\n\tsong mus_rg_jigglypuff, 2, 2\n\tsong mus_rg_intro_fight, 0, 0\n\tsong mus_rg_title, 0, 0\n\tsong mus_rg_cinnabar, 0, 0\n\tsong mus_rg_lavender, 0, 0\n\tsong mus_rg_heal, 0, 0\n\tsong mus_rg_cycling, 0, 0\n\tsong mus_rg_encounter_rocket, 0, 0\n\tsong mus_rg_encounter_girl, 0, 0\n\tsong mus_rg_encounter_boy, 0, 0\n\tsong mus_rg_hall_of_fame, 0, 0\n\tsong mus_rg_viridian_forest, 0, 0\n\tsong mus_rg_mt_moon, 0, 0\n\tsong mus_rg_poke_mansion, 0, 0\n\tsong mus_rg_credits, 0, 0\n\tsong mus_rg_route1, 0, 0\n\tsong mus_rg_route24, 0, 0\n\tsong mus_rg_route3, 0, 0\n\tsong mus_rg_route11, 0, 0\n\tsong mus_rg_victory_road, 0, 0\n\tsong mus_rg_vs_gym_leader, 0, 0\n\tsong mus_rg_vs_trainer, 0, 0\n\tsong mus_rg_vs_wild, 0, 0\n\tsong mus_rg_vs_champion, 0, 0\n\tsong mus_rg_pallet, 0, 0\n\tsong mus_rg_oak_lab, 0, 0\n\tsong mus_rg_oak, 0, 0\n\tsong mus_rg_poke_center, 0, 0\n\tsong mus_rg_ss_anne, 0, 0\n\tsong mus_rg_surf, 0, 0\n\tsong mus_rg_poke_tower, 0, 0\n\tsong mus_rg_silph, 0, 0\n\tsong mus_rg_fuchsia, 0, 0\n\tsong mus_rg_celadon, 0, 0\n\tsong mus_rg_victory_trainer, 0, 0\n\tsong mus_rg_victory_wild, 0, 0\n\tsong mus_rg_victory_gym_leader, 0, 0\n\tsong mus_rg_vermillion, 0, 0\n\tsong mus_rg_pewter, 0, 0\n\tsong mus_rg_encounter_rival, 0, 0\n\tsong mus_rg_rival_exit, 0, 0\n\tsong mus_rg_dex_rating, 2, 2\n\tsong mus_rg_obtain_key_item, 2, 2\n\tsong mus_rg_caught_intro, 2, 2\n\tsong mus_rg_photo, 2, 2\n\tsong mus_rg_game_freak, 0, 0\n\tsong mus_rg_caught, 0, 0\n\tsong mus_rg_new_game_instruct, 0, 0\n\tsong mus_rg_new_game_intro, 0, 0\n\tsong mus_rg_new_game_exit, 0, 0\n\tsong mus_rg_poke_jump, 0, 0\n\tsong mus_rg_union_room, 0, 0\n\tsong mus_rg_net_center, 0, 0\n\tsong mus_rg_mystery_gift, 0, 0\n\tsong mus_rg_berry_pick, 0, 0\n\tsong mus_rg_sevii_cave, 0, 0\n\tsong mus_rg_teachy_tv_show, 0, 0\n\tsong mus_rg_sevii_route, 0, 0\n\tsong mus_rg_sevii_dungeon, 0, 0\n\tsong mus_rg_sevii_123, 0, 0\n\tsong mus_rg_sevii_45, 0, 0\n\tsong mus_rg_sevii_67, 0, 0\n\tsong mus_rg_poke_flute, 2, 2\n\tsong mus_rg_vs_deoxys, 0, 0\n\tsong mus_rg_vs_mewtwo, 0, 0\n\tsong mus_rg_vs_legend, 0, 0\n\tsong mus_rg_encounter_gym_leader, 0, 0\n\tsong mus_rg_encounter_deoxys, 0, 0\n\tsong mus_rg_trainer_tower, 0, 0\n\tsong mus_rg_slow_pallet, 0, 0\n\tsong mus_rg_teachy_tv_menu, 0, 0\n\tsong ph_trap_blend, 2, 2\n\tsong ph_trap_held, 2, 2\n\tsong ph_trap_solo, 2, 2\n\tsong ph_face_blend, 2, 2\n\tsong ph_face_held, 2, 2\n\tsong ph_face_solo, 2, 2\n\tsong ph_cloth_blend, 2, 2\n\tsong ph_cloth_held, 2, 2\n\tsong ph_cloth_solo, 2, 2\n\tsong ph_dress_blend, 2, 2\n\tsong ph_dress_held, 2, 2\n\tsong ph_dress_solo, 2, 2\n\tsong ph_fleece_blend, 2, 2\n\tsong ph_fleece_held, 2, 2\n\tsong ph_fleece_solo, 2, 2\n\tsong ph_kit_blend, 2, 2\n\tsong ph_kit_held, 2, 2\n\tsong ph_kit_solo, 2, 2\n\tsong ph_price_blend, 2, 2\n\tsong ph_price_held, 2, 2\n\tsong ph_price_solo, 2, 2\n\tsong ph_lot_blend, 2, 2\n\tsong ph_lot_held, 2, 2\n\tsong ph_lot_solo, 2, 2\n\tsong ph_goat_blend, 2, 2\n\tsong ph_goat_held, 2, 2\n\tsong ph_goat_solo, 2, 2\n\tsong ph_thought_blend, 2, 2\n\tsong ph_thought_held, 2, 2\n\tsong ph_thought_solo, 2, 2\n\tsong ph_choice_blend, 2, 2\n\tsong ph_choice_held, 2, 2\n\tsong ph_choice_solo, 2, 2\n\tsong ph_mouth_blend, 2, 2\n\tsong ph_mouth_held, 2, 2\n\tsong ph_mouth_solo, 2, 2\n\tsong ph_foot_blend, 2, 2\n\tsong ph_foot_held, 2, 2\n\tsong ph_foot_solo, 2, 2\n\tsong ph_goose_blend, 2, 2\n\tsong ph_goose_held, 2, 2\n\tsong ph_goose_solo, 2, 2\n\tsong ph_strut_blend, 2, 2\n\tsong ph_strut_held, 2, 2\n\tsong ph_strut_solo, 2, 2\n\tsong ph_cure_blend, 2, 2\n\tsong ph_cure_held, 2, 2\n\tsong ph_cure_solo, 2, 2\n\tsong ph_nurse_blend, 2, 2\n\tsong ph_nurse_held, 2, 2\n\tsong ph_nurse_solo, 2, 2\n\n\t.align 2\ndummy_song_header:\n\t.byte 0, 0, 0, 0\n"
  },
  {
    "path": "sound/songs/se_dex_page.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_dex_page_grp, voicegroup127\n\t.equ\tse_dex_page_pri, 5\n\t.equ\tse_dex_page_rev, reverb_set+50\n\t.equ\tse_dex_page_mvl, 127\n\t.equ\tse_dex_page_key, 0\n\t.equ\tse_dex_page_tbs, 1\n\t.equ\tse_dex_page_exg, 0\n\t.equ\tse_dex_page_cmp, 1\n\n\t.section .rodata\n\t.global\tse_dex_page\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_dex_page_1:\n\t.byte\tKEYSH , se_dex_page_key+0\n\t.byte\tTEMPO , 100*se_dex_page_tbs/2\n\t.byte\t\tVOICE , 4\n\t.byte\t\tBENDR , 12\n\t.byte\t\tXCMD  , xIECV , 10\n\t.byte\t\t        xIECL , 8\n\t.byte\t\tVOL   , 90*se_dex_page_mvl/mxv\n\t.byte\t\tBEND  , c_v+4\n\t.byte\t\tN01   , Cn5 , v064\n\t.byte\tW01\n\t.byte\t\t        Cn5 , v020\n\t.byte\tW01\n\t.byte\t\t        Cn5 , v064\n\t.byte\tW01\n\t.byte\t\t        Cn5 , v020\n\t.byte\tW01\n\t.byte\t\t        Cn6 , v064\n\t.byte\tW02\n\t.byte\t\t        Cn6 , v020\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_dex_page:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_dex_page_pri\t@ Priority\n\t.byte\tse_dex_page_rev\t@ Reverb.\n\n\t.word\tse_dex_page_grp\n\n\t.word\tse_dex_page_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_dex_scroll.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_dex_scroll_grp, voicegroup127\n\t.equ\tse_dex_scroll_pri, 5\n\t.equ\tse_dex_scroll_rev, reverb_set+50\n\t.equ\tse_dex_scroll_mvl, 127\n\t.equ\tse_dex_scroll_key, 0\n\t.equ\tse_dex_scroll_tbs, 1\n\t.equ\tse_dex_scroll_exg, 0\n\t.equ\tse_dex_scroll_cmp, 1\n\n\t.section .rodata\n\t.global\tse_dex_scroll\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_dex_scroll_1:\n\t.byte\tKEYSH , se_dex_scroll_key+0\n\t.byte\tTEMPO , 100*se_dex_scroll_tbs/2\n\t.byte\t\tVOICE , 4\n\t.byte\t\tBENDR , 12\n\t.byte\t\tXCMD  , xIECV , 10\n\t.byte\t\t        xIECL , 8\n\t.byte\t\tVOL   , 40*se_dex_scroll_mvl/mxv\n\t.byte\t\tBEND  , c_v+4\n\t.byte\t\tN01   , Gn4 , v127\n\t.byte\tW01\n\t.byte\t\t        Gn4 , v020\n\t.byte\tW02\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_dex_scroll:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_dex_scroll_pri\t@ Priority\n\t.byte\tse_dex_scroll_rev\t@ Reverb.\n\n\t.word\tse_dex_scroll_grp\n\n\t.word\tse_dex_scroll_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_absorb.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_absorb_grp, voicegroup128\n\t.equ\tse_m_absorb_pri, 4\n\t.equ\tse_m_absorb_rev, reverb_set+50\n\t.equ\tse_m_absorb_mvl, 127\n\t.equ\tse_m_absorb_key, 0\n\t.equ\tse_m_absorb_tbs, 1\n\t.equ\tse_m_absorb_exg, 0\n\t.equ\tse_m_absorb_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_absorb\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_absorb_1:\n\t.byte\tKEYSH , se_m_absorb_key+0\n\t.byte\tTEMPO , 150*se_m_absorb_tbs/2\n\t.byte\t\tVOICE , 24\n\t.byte\t\tVOL   , 110*se_m_absorb_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Cn6 , v127\n\t.byte\tW01\n\t.byte\t\t        Gn6 , v112\n\t.byte\tW01\n\t.byte\t\tVOICE , 38\n\t.byte\t\tVOL   , 58*se_m_absorb_mvl/mxv\n\t.byte\t\tN08   , Gn4\n\t.byte\tW01\n\t.byte\t\tVOL   , 68*se_m_absorb_mvl/mxv\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tVOL   , 75*se_m_absorb_mvl/mxv\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v-48\n\t.byte\tW02\n\t.byte\t\tVOL   , 83*se_m_absorb_mvl/mxv\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v-18\n\t.byte\tW01\n\t.byte\t\tVOL   , 90*se_m_absorb_mvl/mxv\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v+10\n\t.byte\tW01\n\t.byte\t\tVOL   , 101*se_m_absorb_mvl/mxv\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tBEND  , c_v+39\n\t.byte\tW01\n\t.byte\t\tVOL   , 110*se_m_absorb_mvl/mxv\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v+63\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_absorb:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_absorb_pri\t@ Priority\n\t.byte\tse_m_absorb_rev\t@ Reverb.\n\n\t.word\tse_m_absorb_grp\n\n\t.word\tse_m_absorb_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_absorb_2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_absorb_2_grp, voicegroup128\n\t.equ\tse_m_absorb_2_pri, 4\n\t.equ\tse_m_absorb_2_rev, reverb_set+50\n\t.equ\tse_m_absorb_2_mvl, 127\n\t.equ\tse_m_absorb_2_key, 0\n\t.equ\tse_m_absorb_2_tbs, 1\n\t.equ\tse_m_absorb_2_exg, 0\n\t.equ\tse_m_absorb_2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_absorb_2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_absorb_2_1:\n\t.byte\tKEYSH , se_m_absorb_2_key+0\n\t.byte\tTEMPO , 150*se_m_absorb_2_tbs/2\n\t.byte\t\tVOICE , 46\n\t.byte\t\tVOL   , 110*se_m_absorb_2_mvl/mxv\n\t.byte\t\tBENDR , 2\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+15\n\t.byte\tW01\n\t.byte\t\tN02   , Dn6 , v112\n\t.byte\tW02\n\t.byte\t\t        Cs6\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tN02   , An5\n\t.byte\tW02\n\t.byte\t\t        Fs5\n\t.byte\tW01\n\t.byte\tW01\n\t.byte\t\t        Dn5\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-7\n\t.byte\tW01\n\t.byte\t\tN02   , Dn5 , v104\n\t.byte\tW02\n\t.byte\t\t        Cs5 , v100\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN02   , An4 , v096\n\t.byte\tW02\n\t.byte\t\t        Fs4 , v092\n\t.byte\tW01\n\t.byte\tW01\n\t.byte\t\t        Dn4 , v088\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+15\n\t.byte\tW01\n\t.byte\t\tN02   , Dn6\n\t.byte\tW02\n\t.byte\t\t        Cs6 , v084\n\t.byte\tW03\n\t.byte\t\t        An5 , v080\n\t.byte\tW02\n\t.byte\t\t        Fs5 , v076\n\t.byte\tW01\n\t.byte\tW01\n\t.byte\t\t        Dn5 , v072\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-16\n\t.byte\tW01\n\t.byte\t\tN02   , Dn6 , v068\n\t.byte\tW02\n\t.byte\t\t        Cs6 , v064\n\t.byte\tW03\n\t.byte\t\t        An5 , v060\n\t.byte\tW02\n\t.byte\t\t        Fs5 , v056\n\t.byte\tW01\n\t.byte\tW01\n\t.byte\t\t        Dn5 , v052\n\t.byte\tW02\n\t.byte\tW03\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_absorb_2_2:\n\t.byte\tKEYSH , se_m_absorb_2_key+0\n\t.byte\t\tVOICE , 53\n\t.byte\t\tBENDR , 2\n\t.byte\t\tVOL   , 43*se_m_absorb_2_mvl/mxv\n\t.byte\t\tBEND  , c_v+15\n\t.byte\t\tN02   , An6 , v112\n\t.byte\tW02\n\t.byte\t\t        Fs6\n\t.byte\tW01\n\t.byte\tW01\n\t.byte\t\t        Dn6\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        Cs6\n\t.byte\tW02\n\t.byte\t\t        An5\n\t.byte\tW03\n\t.byte\t\tN02\n\t.byte\tW02\n\t.byte\t\t        Fs5 , v104\n\t.byte\tW01\n\t.byte\tW01\n\t.byte\t\t        Dn5 , v100\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        Cs5 , v096\n\t.byte\tW02\n\t.byte\t\t        An4 , v092\n\t.byte\tW03\n\t.byte\t\t        An6 , v088\n\t.byte\tW02\n\t.byte\t\t        Fs6 , v084\n\t.byte\tW01\n\t.byte\tW01\n\t.byte\t\t        Dn6 , v080\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        Cs6 , v076\n\t.byte\tW02\n\t.byte\t\t        An5 , v072\n\t.byte\tW03\n\t.byte\t\t        An6 , v068\n\t.byte\tW02\n\t.byte\t\t        Fs6 , v064\n\t.byte\tW01\n\t.byte\tW01\n\t.byte\t\t        Dn6 , v060\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        Cs6 , v056\n\t.byte\tW02\n\t.byte\t\t        An5 , v052\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_absorb_2:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_absorb_2_pri\t@ Priority\n\t.byte\tse_m_absorb_2_rev\t@ Reverb.\n\n\t.word\tse_m_absorb_2_grp\n\n\t.word\tse_m_absorb_2_1\n\t.word\tse_m_absorb_2_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_acid_armor.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_acid_armor_grp, voicegroup128\n\t.equ\tse_m_acid_armor_pri, 4\n\t.equ\tse_m_acid_armor_rev, reverb_set+50\n\t.equ\tse_m_acid_armor_mvl, 127\n\t.equ\tse_m_acid_armor_key, 0\n\t.equ\tse_m_acid_armor_tbs, 1\n\t.equ\tse_m_acid_armor_exg, 0\n\t.equ\tse_m_acid_armor_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_acid_armor\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_acid_armor_1:\n\t.byte\tKEYSH , se_m_acid_armor_key+0\n\t.byte\tTEMPO , 150*se_m_acid_armor_tbs/2\n\t.byte\t\tVOICE , 31\n\t.byte\t\tVOL   , 110*se_m_acid_armor_mvl/mxv\n\t.byte\t\tBENDR , 24\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-37\n\t.byte\t\tN06   , Gn0 , v127\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+27\n\t.byte\tW01\n\t.byte\t\t        c_v+46\n\t.byte\tW02\n\t.byte\t\tVOICE , 23\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tN01   , Cn1\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tN01   , Cn2\n\t.byte\tW01\n\t.byte\t\tVOICE , 31\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-37\n\t.byte\t\tN06   , Dn1\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW02\n\t.byte\t\t        c_v+27\n\t.byte\tW01\n\t.byte\t\t        c_v+46\n\t.byte\tW01\n\t.byte\t\tVOICE , 23\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tN01   , Fn1\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tN01   , Fn2\n\t.byte\tW01\n\t.byte\t\tVOICE , 31\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-37\n\t.byte\t\tN02   , Gn0\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v+27\n\t.byte\t\tN02\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+46\n\t.byte\tW01\n\t.byte\t\tVOICE , 23\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tN01   , Cn1\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-9\n\t.byte\t\tN01   , Cn2\n\t.byte\tW01\n\t.byte\t\tVOICE , 31\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-37\n\t.byte\t\tN06   , Dn1\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+27\n\t.byte\tW02\n\t.byte\t\t        c_v+46\n\t.byte\tW01\n\t.byte\t\tVOICE , 23\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tN01   , Cn1\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tN01   , Cn2\n\t.byte\tW01\n\t.byte\t\tVOICE , 31\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-37\n\t.byte\t\tN06   , Gn0 , v112\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+27\n\t.byte\tW01\n\t.byte\t\t        c_v+46\n\t.byte\tW01\n\t.byte\t\tVOICE , 23\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tN01   , Cn1 , v100\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tN01   , Cn2 , v096\n\t.byte\tW02\n\t.byte\t\tVOICE , 31\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-37\n\t.byte\t\tN06   , Dn1\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+27\n\t.byte\tW01\n\t.byte\t\t        c_v+46\n\t.byte\tW02\n\t.byte\t\tVOICE , 23\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tN01   , Fn1 , v084\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tN01   , Fn2\n\t.byte\tW01\n\t.byte\t\tVOICE , 31\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-37\n\t.byte\t\tN02   , Gn0 , v080\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v+27\n\t.byte\t\tN02   , Gn0 , v072\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+46\n\t.byte\tW01\n\t.byte\t\tVOICE , 23\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tN01   , Cn1 , v068\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-9\n\t.byte\t\tN01   , Cn2\n\t.byte\tW01\n\t.byte\t\tVOICE , 31\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-37\n\t.byte\t\tN06   , Dn1 , v064\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+27\n\t.byte\tW01\n\t.byte\t\t        c_v+46\n\t.byte\tW01\n\t.byte\t\tVOICE , 23\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tN01   , Cn1 , v056\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tN01   , Cn2 , v052\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_acid_armor:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_acid_armor_pri\t@ Priority\n\t.byte\tse_m_acid_armor_rev\t@ Reverb.\n\n\t.word\tse_m_acid_armor_grp\n\n\t.word\tse_m_acid_armor_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_attract.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_attract_grp, voicegroup128\n\t.equ\tse_m_attract_pri, 4\n\t.equ\tse_m_attract_rev, reverb_set+50\n\t.equ\tse_m_attract_mvl, 127\n\t.equ\tse_m_attract_key, 0\n\t.equ\tse_m_attract_tbs, 1\n\t.equ\tse_m_attract_exg, 0\n\t.equ\tse_m_attract_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_attract\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_attract_1:\n\t.byte\tKEYSH , se_m_attract_key+0\n\t.byte\tTEMPO , 210*se_m_attract_tbs/2\n\t.byte\t\tVOICE , 46\n\t.byte\t\tVOL   , 95*se_m_attract_mvl/mxv\n\t.byte\t\tBENDR , 2\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+15\n\t.byte\tW03\n\t.byte\t\tN06   , Cn6 , v116\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En6 , v108\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Cs5 , v100\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Gs5 , v088\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tN06   , Cs6 , v080\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , Dn6 , v072\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tN06   , Fs6 , v060\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , Ds5 , v052\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tN06   , As5 , v040\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        c_v+4\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_attract_2:\n\t.byte\tKEYSH , se_m_attract_key+0\n\t.byte\t\tVOICE , 53\n\t.byte\t\tBENDR , 2\n\t.byte\t\tVOL   , 43*se_m_attract_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+15\n\t.byte\t\tN06   , Cn5 , v120\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Gn5 , v112\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Cn6 , v104\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Cs6 , v092\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Fn6 , v084\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Dn5 , v076\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        An5 , v064\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Dn6 , v056\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Ds6 , v048\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Gn6 , v036\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_attract:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_attract_pri\t@ Priority\n\t.byte\tse_m_attract_rev\t@ Reverb.\n\n\t.word\tse_m_attract_grp\n\n\t.word\tse_m_attract_1\n\t.word\tse_m_attract_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_attract2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_attract2_grp, voicegroup128\n\t.equ\tse_m_attract2_pri, 4\n\t.equ\tse_m_attract2_rev, reverb_set+50\n\t.equ\tse_m_attract2_mvl, 127\n\t.equ\tse_m_attract2_key, 0\n\t.equ\tse_m_attract2_tbs, 1\n\t.equ\tse_m_attract2_exg, 0\n\t.equ\tse_m_attract2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_attract2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_attract2_1:\n\t.byte\tKEYSH , se_m_attract2_key+0\n\t.byte\tTEMPO , 150*se_m_attract2_tbs/2\n\t.byte\t\tVOICE , 61\n\t.byte\t\tBENDR , 44\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_attract2_mvl/mxv\n\t.byte\t\tMOD   , 30\n\t.byte\t\tBEND  , c_v+2\n\t.byte\t\tN54   , Dn4 , v080\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW12\n\t.byte\t\t        c_v-10\n\t.byte\tW12\n\t.byte\t\t        c_v-4\n\t.byte\tW12\n\t.byte\t\t        c_v+0\n\t.byte\tW06\n\t.byte\t\tN54   , Cn4\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW12\n\t.byte\t\t        c_v+9\n\t.byte\tW12\n\t.byte\t\t        c_v+5\n\t.byte\tW12\n\t.byte\t\t        c_v+0\n\t.byte\tW12\n\t.byte\t\t        c_v-4\n\t.byte\t\tN54   , Dn4\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW12\n\t.byte\t\t        c_v-4\n\t.byte\tW12\n\t.byte\t\t        c_v+0\n\t.byte\tW12\n\t.byte\t\t        c_v+6\n\t.byte\tW06\n\t.byte\t\tN54   , Cn4\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+9\n\t.byte\tW12\n\t.byte\t\t        c_v+5\n\t.byte\tW12\n\t.byte\t\t        c_v+0\n\t.byte\tW12\n\t.byte\t\t        c_v-4\n\t.byte\tW12\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_attract2_2:\n\t.byte\tKEYSH , se_m_attract2_key+0\n\t.byte\t\tVOICE , 62\n\t.byte\t\tBENDR , 44\n\t.byte\t\tVOL   , 110*se_m_attract2_mvl/mxv\n\t.byte\t\tMOD   , 30\n\t.byte\t\tPAN   , c_v+1\n\t.byte\t\tBEND  , c_v+1\n\t.byte\t\tN24   , Dn4 , v040\n\t.byte\tW24\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+47\n\t.byte\t\tN24   , Dn4 , v032\n\t.byte\tW22\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN24   , Cn4 , v040\n\t.byte\tW18\n\t.byte\tW08\n\t.byte\t\tPAN   , c_v-49\n\t.byte\t\tN24   , Cn4 , v032\n\t.byte\tW16\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v+1\n\t.byte\t\tN24   , Dn4 , v040\n\t.byte\tW12\n\t.byte\tW14\n\t.byte\t\tPAN   , c_v+47\n\t.byte\t\tN24   , Dn4 , v032\n\t.byte\tW10\n\t.byte\tW18\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN24   , Cn4 , v040\n\t.byte\tW06\n\t.byte\tW20\n\t.byte\t\tPAN   , c_v-48\n\t.byte\t\tN24   , Cn4 , v032\n\t.byte\tW04\n\t.byte\tW24\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_attract2:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_attract2_pri\t@ Priority\n\t.byte\tse_m_attract2_rev\t@ Reverb.\n\n\t.word\tse_m_attract2_grp\n\n\t.word\tse_m_attract2_1\n\t.word\tse_m_attract2_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_barrier.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_barrier_grp, voicegroup128\n\t.equ\tse_m_barrier_pri, 4\n\t.equ\tse_m_barrier_rev, reverb_set+50\n\t.equ\tse_m_barrier_mvl, 127\n\t.equ\tse_m_barrier_key, 0\n\t.equ\tse_m_barrier_tbs, 1\n\t.equ\tse_m_barrier_exg, 0\n\t.equ\tse_m_barrier_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_barrier\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_barrier_1:\n\t.byte\tKEYSH , se_m_barrier_key+0\n\t.byte\tTEMPO , 150*se_m_barrier_tbs/2\n\t.byte\t\tVOICE , 19\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 95*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v+3\n\t.byte\t\tN06   , Cn6 , v088\n\t.byte\tW01\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 56*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-17\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 24*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-34\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 11*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-45\n\t.byte\tW02\n\t.byte\t\tVOL   , 95*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , Cn6 , v084\n\t.byte\tW01\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 56*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 24*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-37\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 11*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-47\n\t.byte\tW02\n\t.byte\t\tVOL   , 95*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-1\n\t.byte\t\tN06   , Cn6 , v076\n\t.byte\tW01\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 56*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-21\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 24*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-38\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 11*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-48\n\t.byte\tW02\n\t.byte\t\tVOL   , 95*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-1\n\t.byte\t\tN06   , Cn6 , v064\n\t.byte\tW01\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 56*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-21\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 24*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-38\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 11*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-48\n\t.byte\tW02\n\t.byte\t\tVOL   , 95*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-2\n\t.byte\t\tN06   , Cn6 , v056\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 56*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tVOL   , 24*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-39\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tVOL   , 11*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-49\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 95*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-2\n\t.byte\t\tN06   , Cn6 , v044\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 56*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tVOL   , 24*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-39\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tVOL   , 11*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-49\n\t.byte\tW02\n\t.byte\t\tVOL   , 95*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-2\n\t.byte\t\tN06   , Cn6 , v036\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 56*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tVOL   , 24*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-39\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tVOL   , 11*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-49\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 95*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-2\n\t.byte\t\tN06   , Cn6 , v028\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 56*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tVOL   , 24*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-39\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tVOL   , 11*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-49\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_barrier_2:\n\t.byte\tKEYSH , se_m_barrier_key+0\n\t.byte\t\tVOICE , 53\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 95*se_m_barrier_mvl/mxv\n\t.byte\t\tBEND  , c_v-5\n\t.byte\tW02\n\t.byte\t\tN06   , An5 , v064\n\t.byte\tW02\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        56*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        24*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        95*se_m_barrier_mvl/mxv\n\t.byte\t\tN06   , An5 , v056\n\t.byte\tW02\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\tW02\nse_m_barrier_2_000:\n\t.byte\t\tVOL   , 56*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        24*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        95*se_m_barrier_mvl/mxv\n\t.byte\t\tN06   , An5 , v052\n\t.byte\tW02\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\tW02\n\t.byte\tPEND\n\t.byte\tPATT\n\t .word\tse_m_barrier_2_000\n\t.byte\t\tVOL   , 56*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        24*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        95*se_m_barrier_mvl/mxv\n\t.byte\t\tN06   , An5 , v048\n\t.byte\tW02\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        56*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        24*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        95*se_m_barrier_mvl/mxv\n\t.byte\t\tN06   , An5 , v044\n\t.byte\tW02\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        56*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        24*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        95*se_m_barrier_mvl/mxv\n\t.byte\t\tN06   , An5 , v040\n\t.byte\tW02\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        56*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        24*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        95*se_m_barrier_mvl/mxv\n\t.byte\t\tN06   , An5 , v036\n\t.byte\tW02\n\t.byte\t\tVOL   , 88*se_m_barrier_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        56*se_m_barrier_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        24*se_m_barrier_mvl/mxv\n\t.byte\tW05\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_barrier:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_barrier_pri\t@ Priority\n\t.byte\tse_m_barrier_rev\t@ Reverb.\n\n\t.word\tse_m_barrier_grp\n\n\t.word\tse_m_barrier_1\n\t.word\tse_m_barrier_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_baton_pass.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_baton_pass_grp, voicegroup128\n\t.equ\tse_m_baton_pass_pri, 4\n\t.equ\tse_m_baton_pass_rev, reverb_set+50\n\t.equ\tse_m_baton_pass_mvl, 127\n\t.equ\tse_m_baton_pass_key, 0\n\t.equ\tse_m_baton_pass_tbs, 1\n\t.equ\tse_m_baton_pass_exg, 0\n\t.equ\tse_m_baton_pass_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_baton_pass\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_baton_pass_1:\n\t.byte\tKEYSH , se_m_baton_pass_key+0\n\t.byte\t\tVOICE , 19\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 12*se_m_baton_pass_mvl/mxv\n\t.byte\t\tBEND  , c_v+49\n\t.byte\t\tN06   , Gn4 , v080\n\t.byte\tW01\n\t.byte\t\tVOL   , 44*se_m_baton_pass_mvl/mxv\n\t.byte\t\tBEND  , c_v+22\n\t.byte\tW01\n\t.byte\t\tVOL   , 62*se_m_baton_pass_mvl/mxv\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tVOL   , 75*se_m_baton_pass_mvl/mxv\n\t.byte\t\tBEND  , c_v+20\n\t.byte\tW01\n\t.byte\t\tVOL   , 87*se_m_baton_pass_mvl/mxv\n\t.byte\t\tBEND  , c_v+33\n\t.byte\tW01\n\t.byte\t\tVOL   , 96*se_m_baton_pass_mvl/mxv\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tVOL   , 100*se_m_baton_pass_mvl/mxv\n\t.byte\t\tBEND  , c_v+54\n\t.byte\tW01\n\t.byte\t\t        c_v+63\n\t.byte\tW01\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN04   , Gn4 , v040\n\t.byte\tW01\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tVOICE , 45\n\t.byte\t\tMOD   , 30\n\t.byte\t\tBENDR , 24\n\t.byte\t\tVOL   , 54*se_m_baton_pass_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , Gn3 , v108\n\t.byte\tW01\n\t.byte\t\tVOL   , 70*se_m_baton_pass_mvl/mxv\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 80*se_m_baton_pass_mvl/mxv\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW01\n\t.byte\t\tVOL   , 100*se_m_baton_pass_mvl/mxv\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\t        c_v+24\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+2\n\t.byte\t\tN06   , An3 , v100\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW01\n\t.byte\t\t        c_v+18\n\t.byte\tW01\n\t.byte\t\t        c_v+27\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+4\n\t.byte\t\tN06   , Bn3 , v060\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+14\n\t.byte\tW01\n\t.byte\t\t        c_v+20\n\t.byte\tW01\n\t.byte\t\t        c_v+29\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+6\n\t.byte\t\tN06   , Cn4 , v040\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+15\n\t.byte\tW01\n\t.byte\t\t        c_v+22\n\t.byte\tW01\n\t.byte\t\t        c_v+31\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+9\n\t.byte\t\tN06   , Dn4 , v020\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+14\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v+18\n\t.byte\tW01\n\t.byte\t\t        c_v+25\n\t.byte\tW01\n\t.byte\t\t        c_v+34\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_baton_pass_2:\n\t.byte\tKEYSH , se_m_baton_pass_key+0\n\t.byte\t\tVOICE , 57\n\t.byte\t\tVOL   , 59*se_m_baton_pass_mvl/mxv\n\t.byte\t\tN06   , Gs4 , v052\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_baton_pass_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        90*se_m_baton_pass_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        100*se_m_baton_pass_mvl/mxv\n\t.byte\tW03\n\t.byte\tW02\n\t.byte\t\tN04   , Gs4 , v024\n\t.byte\tW01\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_baton_pass:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_baton_pass_pri\t@ Priority\n\t.byte\tse_m_baton_pass_rev\t@ Reverb.\n\n\t.word\tse_m_baton_pass_grp\n\n\t.word\tse_m_baton_pass_1\n\t.word\tse_m_baton_pass_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_belly_drum.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_belly_drum_grp, voicegroup128\n\t.equ\tse_m_belly_drum_pri, 4\n\t.equ\tse_m_belly_drum_rev, reverb_set+50\n\t.equ\tse_m_belly_drum_mvl, 127\n\t.equ\tse_m_belly_drum_key, 0\n\t.equ\tse_m_belly_drum_tbs, 1\n\t.equ\tse_m_belly_drum_exg, 0\n\t.equ\tse_m_belly_drum_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_belly_drum\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_belly_drum_1:\n\t.byte\tKEYSH , se_m_belly_drum_key+0\n\t.byte\tTEMPO , 150*se_m_belly_drum_tbs/2\n\t.byte\t\tVOICE , 6\n\t.byte\t\tBENDR , 12\n\t.byte\t\tVOL   , 115*se_m_belly_drum_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN19   , An2 , v127\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW01\n\t.byte\t\t        c_v-10\n\t.byte\tW01\n\t.byte\t\t        c_v-14\n\t.byte\tW01\n\t.byte\t\t        c_v-12\n\t.byte\tW02\n\t.byte\t\t        c_v-14\n\t.byte\tW01\n\t.byte\t\t        c_v-18\n\t.byte\tW01\n\t.byte\t\tVOL   , 108*se_m_belly_drum_mvl/mxv\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\t        c_v-22\n\t.byte\tW01\n\t.byte\t\tVOL   , 94*se_m_belly_drum_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        78*se_m_belly_drum_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        62*se_m_belly_drum_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        40*se_m_belly_drum_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        27*se_m_belly_drum_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        12*se_m_belly_drum_mvl/mxv\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_belly_drum:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_belly_drum_pri\t@ Priority\n\t.byte\tse_m_belly_drum_rev\t@ Reverb.\n\n\t.word\tse_m_belly_drum_grp\n\n\t.word\tse_m_belly_drum_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_bite.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_bite_grp, voicegroup128\n\t.equ\tse_m_bite_pri, 4\n\t.equ\tse_m_bite_rev, reverb_set+50\n\t.equ\tse_m_bite_mvl, 127\n\t.equ\tse_m_bite_key, 0\n\t.equ\tse_m_bite_tbs, 1\n\t.equ\tse_m_bite_exg, 0\n\t.equ\tse_m_bite_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_bite\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_bite_1:\n\t.byte\tKEYSH , se_m_bite_key+0\n\t.byte\tTEMPO , 220*se_m_bite_tbs/2\n\t.byte\t\tVOICE , 26\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tVOL   , 110*se_m_bite_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Gn3 , v112\n\t.byte\tW02\n\t.byte\t\t        Gs3\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-7\n\t.byte\tW01\n\t.byte\t\tN02   , An3\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+7\n\t.byte\tW02\n\t.byte\t\t        c_v-8\n\t.byte\tW02\n\t.byte\t\tVOICE , 21\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Cn5 , v116\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tN01   , Cn4 , v108\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tN01   , Gn4 , v104\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Gn3 , v096\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tN01   , Cn4 , v088\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tN01   , Cn3 , v080\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Gn3 , v072\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tN01   , Gn2 , v064\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tN01   , Cn3 , v056\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Gn2 , v048\n\t.byte\tW03\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_bite_2:\n\t.byte\tKEYSH , se_m_bite_key+0\n\t.byte\t\tVOICE , 27\n\t.byte\t\tVOL   , 110*se_m_bite_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW10\n\t.byte\t\tN01   , Gn2 , v040\n\t.byte\tW08\n\t.byte\t\tN01\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_bite:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_bite_pri\t@ Priority\n\t.byte\tse_m_bite_rev\t@ Reverb.\n\n\t.word\tse_m_bite_grp\n\n\t.word\tse_m_bite_1\n\t.word\tse_m_bite_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_blizzard.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_blizzard_grp, voicegroup128\n\t.equ\tse_m_blizzard_pri, 4\n\t.equ\tse_m_blizzard_rev, reverb_set+50\n\t.equ\tse_m_blizzard_mvl, 127\n\t.equ\tse_m_blizzard_key, 0\n\t.equ\tse_m_blizzard_tbs, 1\n\t.equ\tse_m_blizzard_exg, 0\n\t.equ\tse_m_blizzard_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_blizzard\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_blizzard_1:\n\t.byte\tKEYSH , se_m_blizzard_key+0\n\t.byte\tTEMPO , 150*se_m_blizzard_tbs/2\n\t.byte\t\tVOICE , 22\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 64*se_m_blizzard_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN24   , Gn3 , v108\n\t.byte\tW03\n\t.byte\t\tVOL   , 79*se_m_blizzard_mvl/mxv\n\t.byte\t\tBEND  , c_v+22\n\t.byte\tW02\n\t.byte\t\t        c_v+8\n\t.byte\tW01\n\t.byte\t\tVOL   , 84*se_m_blizzard_mvl/mxv\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW03\n\t.byte\t\tVOL   , 91*se_m_blizzard_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\tVOL   , 100*se_m_blizzard_mvl/mxv\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW03\n\t.byte\t\tVOL   , 110*se_m_blizzard_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-12\n\t.byte\tW06\nse_m_blizzard_1_B1:\n\t.byte\t\tPAN   , c_v-17\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN48   , Gn3 , v108\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-9\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW03\n\t.byte\t\t        c_v-20\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-3\n\t.byte\tW03\n\t.byte\t\t        c_v+6\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+10\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+16\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+13\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW03\n\t.byte\t\t        c_v+20\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+8\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-11\n\t.byte\tW03\n\t.byte\tGOTO\n\t .word\tse_m_blizzard_1_B1\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_blizzard:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_blizzard_pri\t@ Priority\n\t.byte\tse_m_blizzard_rev\t@ Reverb.\n\n\t.word\tse_m_blizzard_grp\n\n\t.word\tse_m_blizzard_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_blizzard2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_blizzard2_grp, voicegroup128\n\t.equ\tse_m_blizzard2_pri, 4\n\t.equ\tse_m_blizzard2_rev, reverb_set+50\n\t.equ\tse_m_blizzard2_mvl, 127\n\t.equ\tse_m_blizzard2_key, 0\n\t.equ\tse_m_blizzard2_tbs, 1\n\t.equ\tse_m_blizzard2_exg, 0\n\t.equ\tse_m_blizzard2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_blizzard2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_blizzard2_1:\n\t.byte\tKEYSH , se_m_blizzard2_key+0\n\t.byte\tTEMPO , 150*se_m_blizzard2_tbs/2\n\t.byte\t\tVOICE , 22\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_blizzard2_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN24   , Gn3 , v108\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-19\n\t.byte\tW04\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 97*se_m_blizzard2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+16\n\t.byte\tW01\n\t.byte\t\tVOL   , 84*se_m_blizzard2_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        76*se_m_blizzard2_mvl/mxv\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW02\n\t.byte\t\tVOL   , 55*se_m_blizzard2_mvl/mxv\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW02\n\t.byte\t\tVOL   , 39*se_m_blizzard2_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 25*se_m_blizzard2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\tW01\n\t.byte\t\tVOL   , 13*se_m_blizzard2_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        7*se_m_blizzard2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW24\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_blizzard2:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_blizzard2_pri\t@ Priority\n\t.byte\tse_m_blizzard2_rev\t@ Reverb.\n\n\t.word\tse_m_blizzard2_grp\n\n\t.word\tse_m_blizzard2_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_bonemerang.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_bonemerang_grp, voicegroup128\n\t.equ\tse_m_bonemerang_pri, 4\n\t.equ\tse_m_bonemerang_rev, reverb_set+50\n\t.equ\tse_m_bonemerang_mvl, 127\n\t.equ\tse_m_bonemerang_key, 0\n\t.equ\tse_m_bonemerang_tbs, 1\n\t.equ\tse_m_bonemerang_exg, 0\n\t.equ\tse_m_bonemerang_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_bonemerang\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_bonemerang_1:\n\t.byte\tKEYSH , se_m_bonemerang_key+0\n\t.byte\tTEMPO , 150*se_m_bonemerang_tbs/2\n\t.byte\t\tVOICE , 24\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_bonemerang_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Cn5 , v127\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tN01   , Cn6\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Cn5\n\t.byte\tW04\n\t.byte\t\tN01\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-11\n\t.byte\t\tN01   , Cn6\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Cn5\n\t.byte\tW04\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_bonemerang:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_bonemerang_pri\t@ Priority\n\t.byte\tse_m_bonemerang_rev\t@ Reverb.\n\n\t.word\tse_m_bonemerang_grp\n\n\t.word\tse_m_bonemerang_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_brick_break.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_brick_break_grp, voicegroup128\n\t.equ\tse_m_brick_break_pri, 4\n\t.equ\tse_m_brick_break_rev, reverb_set+50\n\t.equ\tse_m_brick_break_mvl, 127\n\t.equ\tse_m_brick_break_key, 0\n\t.equ\tse_m_brick_break_tbs, 1\n\t.equ\tse_m_brick_break_exg, 0\n\t.equ\tse_m_brick_break_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_brick_break\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_brick_break_1:\n\t.byte\tKEYSH , se_m_brick_break_key+0\n\t.byte\tTEMPO , 150*se_m_brick_break_tbs/2\n\t.byte\t\tVOICE , 41\n\t.byte\t\tVOL   , 110*se_m_brick_break_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Cn4 , v127\n\t.byte\tW01\n\t.byte\t\tN03   , Cn5\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\tW01\n\t.byte\t\t        c_v-6\n\t.byte\tW01\n\t.byte\t\tVOICE , 3\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Gs4 , v112\n\t.byte\tW02\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+7\n\t.byte\t\tN01   , Dn5 , v096\n\t.byte\tW03\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Gs4 , v084\n\t.byte\tW04\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tN01   , Dn5 , v068\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+7\n\t.byte\t\tN01   , Gs4 , v052\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tN01   , Dn5 , v032\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_brick_break_2:\n\t.byte\tKEYSH , se_m_brick_break_key+0\n\t.byte\t\tVOICE , 4\n\t.byte\t\tVOL   , 110*se_m_brick_break_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Cn3 , v064\n\t.byte\tW01\n\t.byte\t\tN03   , Gn3\n\t.byte\tW05\n\t.byte\tW01\n\t.byte\t\tN02   , En4 , v040\n\t.byte\tW05\n\t.byte\t\t        Gn3\n\t.byte\tW04\n\t.byte\t\t        En4 , v032\n\t.byte\tW02\n\t.byte\tW03\n\t.byte\t\t        Gn3\n\t.byte\tW03\n\t.byte\tW02\n\t.byte\t\t        En4 , v020\n\t.byte\tW04\n\t.byte\tW01\n\t.byte\t\t        Gn3\n\t.byte\tW05\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_brick_break:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_brick_break_pri\t@ Priority\n\t.byte\tse_m_brick_break_rev\t@ Reverb.\n\n\t.word\tse_m_brick_break_grp\n\n\t.word\tse_m_brick_break_1\n\t.word\tse_m_brick_break_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_bubble.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_bubble_grp, voicegroup128\n\t.equ\tse_m_bubble_pri, 4\n\t.equ\tse_m_bubble_rev, reverb_set+50\n\t.equ\tse_m_bubble_mvl, 127\n\t.equ\tse_m_bubble_key, 0\n\t.equ\tse_m_bubble_tbs, 1\n\t.equ\tse_m_bubble_exg, 0\n\t.equ\tse_m_bubble_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_bubble\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_bubble_1:\n\t.byte\tKEYSH , se_m_bubble_key+0\n\t.byte\tTEMPO , 220*se_m_bubble_tbs/2\n\t.byte\t\tVOICE , 23\n\t.byte\t\tVOL   , 95*se_m_bubble_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN09   , Cn3 , v127\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW01\n\t.byte\t\t        c_v+16\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tBEND  , c_v+37\n\t.byte\tW01\n\t.byte\t\t        c_v+48\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-1\n\t.byte\t\tN03   , En3\n\t.byte\tW15\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_bubble:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_bubble_pri\t@ Priority\n\t.byte\tse_m_bubble_rev\t@ Reverb.\n\n\t.word\tse_m_bubble_grp\n\n\t.word\tse_m_bubble_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_bubble2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_bubble2_grp, voicegroup128\n\t.equ\tse_m_bubble2_pri, 4\n\t.equ\tse_m_bubble2_rev, reverb_set+50\n\t.equ\tse_m_bubble2_mvl, 127\n\t.equ\tse_m_bubble2_key, 0\n\t.equ\tse_m_bubble2_tbs, 1\n\t.equ\tse_m_bubble2_exg, 0\n\t.equ\tse_m_bubble2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_bubble2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_bubble2_1:\n\t.byte\tKEYSH , se_m_bubble2_key+0\n\t.byte\tTEMPO , 220*se_m_bubble2_tbs/2\n\t.byte\t\tVOICE , 24\n\t.byte\t\tVOL   , 110*se_m_bubble2_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\tN09   , Gn4 , v127\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW02\n\t.byte\t\t        c_v-34\n\t.byte\tW17\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_bubble2_2:\n\t.byte\tKEYSH , se_m_bubble2_key+0\n\t.byte\t\tVOICE , 4\n\t.byte\t\tVOL   , 110*se_m_bubble2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Cn4 , v044\n\t.byte\tW24\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_bubble2:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_bubble2_pri\t@ Priority\n\t.byte\tse_m_bubble2_rev\t@ Reverb.\n\n\t.word\tse_m_bubble2_grp\n\n\t.word\tse_m_bubble2_1\n\t.word\tse_m_bubble2_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_bubble3.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_bubble3_grp, voicegroup128\n\t.equ\tse_m_bubble3_pri, 4\n\t.equ\tse_m_bubble3_rev, reverb_set+50\n\t.equ\tse_m_bubble3_mvl, 127\n\t.equ\tse_m_bubble3_key, 0\n\t.equ\tse_m_bubble3_tbs, 1\n\t.equ\tse_m_bubble3_exg, 0\n\t.equ\tse_m_bubble3_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_bubble3\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_bubble3_1:\n\t.byte\tKEYSH , se_m_bubble3_key+0\n\t.byte\tTEMPO , 220*se_m_bubble3_tbs/2\n\t.byte\t\tVOICE , 23\n\t.byte\t\tVOL   , 95*se_m_bubble3_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN12   , Gn2 , v127\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-17\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW01\n\t.byte\t\t        c_v+16\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tBEND  , c_v+25\n\t.byte\tW01\n\t.byte\t\t        c_v+31\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW03\n\t.byte\t\tN06\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW01\n\t.byte\t\t        c_v+13\n\t.byte\tW05\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_bubble3:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_bubble3_pri\t@ Priority\n\t.byte\tse_m_bubble3_rev\t@ Reverb.\n\n\t.word\tse_m_bubble3_grp\n\n\t.word\tse_m_bubble3_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_bubble_beam.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_bubble_beam_grp, voicegroup128\n\t.equ\tse_m_bubble_beam_pri, 4\n\t.equ\tse_m_bubble_beam_rev, reverb_set+50\n\t.equ\tse_m_bubble_beam_mvl, 127\n\t.equ\tse_m_bubble_beam_key, 0\n\t.equ\tse_m_bubble_beam_tbs, 1\n\t.equ\tse_m_bubble_beam_exg, 0\n\t.equ\tse_m_bubble_beam_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_bubble_beam\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_bubble_beam_1:\n\t.byte\tKEYSH , se_m_bubble_beam_key+0\n\t.byte\tTEMPO , 150*se_m_bubble_beam_tbs/2\n\t.byte\t\tVOICE , 9\n\t.byte\t\tBENDR , 2\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 24*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tBEND  , c_v-17\n\t.byte\t\tN78   , Bn4 , v080\n\t.byte\tW01\n\t.byte\t\tVOL   , 32*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW01\n\t.byte\t\tVOL   , 38*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v-7\n\t.byte\tW01\n\t.byte\t\tVOL   , 48*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v+9\n\t.byte\tW01\n\t.byte\t\tVOL   , 66*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v-13\n\t.byte\tW02\n\t.byte\t\tVOL   , 78*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW01\n\t.byte\t\tVOL   , 94*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\tW01\n\t.byte\t\tVOL   , 110*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+6\n\t.byte\tW01\n\t.byte\t\t        c_v-7\n\t.byte\tW02\nse_m_bubble_beam_1_000:\n\t.byte\t\tPAN   , c_v+9\n\t.byte\tW01\n\t.byte\t\t        c_v-13\n\t.byte\tW01\n\t.byte\t\t        c_v+6\n\t.byte\tW01\n\t.byte\t\t        c_v-6\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW02\n\t.byte\tPEND\nse_m_bubble_beam_1_001:\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW01\n\t.byte\t\t        c_v-7\n\t.byte\tW01\n\t.byte\t\t        c_v+9\n\t.byte\tW01\n\t.byte\t\t        c_v-13\n\t.byte\tW01\n\t.byte\t\t        c_v+6\n\t.byte\tW02\n\t.byte\tPEND\n\t.byte\t\t        c_v-6\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+6\n\t.byte\tW01\n\t.byte\t\t        c_v-7\n\t.byte\tW01\n\t.byte\t\t        c_v+9\n\t.byte\tW02\n\t.byte\t\t        c_v-13\n\t.byte\tW01\n\t.byte\t\t        c_v+6\n\t.byte\tW01\n\t.byte\t\t        c_v-6\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+6\n\t.byte\tW02\n\t.byte\t\t        c_v-7\n\t.byte\tW01\n\t.byte\t\t        c_v+9\n\t.byte\tW01\n\t.byte\t\t        c_v-13\n\t.byte\tW01\n\t.byte\t\t        c_v+6\n\t.byte\tW01\n\t.byte\t\t        c_v-6\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+6\n\t.byte\tW01\n\t.byte\t\t        c_v-7\n\t.byte\tW01\n\t.byte\t\t        c_v+9\n\t.byte\tW01\n\t.byte\t\t        c_v-13\n\t.byte\tW02\n\t.byte\t\t        c_v+6\n\t.byte\tW01\n\t.byte\t\t        c_v-6\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+6\n\t.byte\tW01\n\t.byte\t\t        c_v-7\n\t.byte\tW02\n\t.byte\tPATT\n\t .word\tse_m_bubble_beam_1_000\n\t.byte\tPATT\n\t .word\tse_m_bubble_beam_1_001\n\t.byte\t\tPAN   , c_v-6\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+6\n\t.byte\tW01\n\t.byte\t\tVOL   , 103*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v-7\n\t.byte\tW01\n\t.byte\t\tVOL   , 91*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v+9\n\t.byte\tW02\n\t.byte\t\tVOL   , 72*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v-13\n\t.byte\tW01\n\t.byte\t\tVOL   , 58*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW01\n\t.byte\t\tVOL   , 38*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\tW01\n\t.byte\t\tVOL   , 15*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 7*se_m_bubble_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW02\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_bubble_beam:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_bubble_beam_pri\t@ Priority\n\t.byte\tse_m_bubble_beam_rev\t@ Reverb.\n\n\t.word\tse_m_bubble_beam_grp\n\n\t.word\tse_m_bubble_beam_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_bubble_beam2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_bubble_beam2_grp, voicegroup128\n\t.equ\tse_m_bubble_beam2_pri, 4\n\t.equ\tse_m_bubble_beam2_rev, reverb_set+50\n\t.equ\tse_m_bubble_beam2_mvl, 127\n\t.equ\tse_m_bubble_beam2_key, 0\n\t.equ\tse_m_bubble_beam2_tbs, 1\n\t.equ\tse_m_bubble_beam2_exg, 0\n\t.equ\tse_m_bubble_beam2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_bubble_beam2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_bubble_beam2_1:\n\t.byte\tKEYSH , se_m_bubble_beam2_key+0\n\t.byte\tTEMPO , 150*se_m_bubble_beam2_tbs/2\n\t.byte\t\tVOICE , 9\n\t.byte\t\tBENDR , 2\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 26*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tBEND  , c_v-23\n\t.byte\t\tN09   , Dn5 , v127\n\t.byte\tW01\n\t.byte\t\tVOL   , 34*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tVOL   , 42*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW01\n\t.byte\t\tVOL   , 52*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+9\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-13\n\t.byte\t\tBEND  , c_v-18\n\t.byte\tW02\n\t.byte\t\tVOL   , 85*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-21\n\t.byte\tW01\n\t.byte\t\tVOL   , 102*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v-23\n\t.byte\tW01\n\t.byte\t\tVOL   , 120*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tBEND  , c_v-24\n\t.byte\tW02\n\t.byte\t\tVOL   , 26*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-23\n\t.byte\t\tN09   , Dn5 , v100\n\t.byte\tW02\n\t.byte\t\tVOL   , 34*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tVOL   , 42*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW01\n\t.byte\t\tVOL   , 52*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+9\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-13\n\t.byte\t\tBEND  , c_v-18\n\t.byte\tW01\n\t.byte\t\tVOL   , 85*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-21\n\t.byte\tW02\n\t.byte\t\tVOL   , 102*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v-23\n\t.byte\tW01\n\t.byte\t\tVOL   , 120*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tBEND  , c_v-24\n\t.byte\tW02\n\t.byte\t\tVOL   , 26*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-23\n\t.byte\t\tN09   , Dn5 , v080\n\t.byte\tW01\n\t.byte\t\tVOL   , 34*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW02\n\t.byte\t\tVOL   , 42*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW01\n\t.byte\t\tVOL   , 52*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+9\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-13\n\t.byte\t\tBEND  , c_v-18\n\t.byte\tW01\n\t.byte\t\tVOL   , 85*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-21\n\t.byte\tW01\n\t.byte\t\tVOL   , 102*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v-23\n\t.byte\tW02\n\t.byte\t\tVOL   , 120*se_m_bubble_beam2_mvl/mxv\n\t.byte\t\tBEND  , c_v-24\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_bubble_beam2:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_bubble_beam2_pri\t@ Priority\n\t.byte\tse_m_bubble_beam2_rev\t@ Reverb.\n\n\t.word\tse_m_bubble_beam2_grp\n\n\t.word\tse_m_bubble_beam2_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_charge.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_charge_grp, voicegroup128\n\t.equ\tse_m_charge_pri, 4\n\t.equ\tse_m_charge_rev, reverb_set+50\n\t.equ\tse_m_charge_mvl, 127\n\t.equ\tse_m_charge_key, 0\n\t.equ\tse_m_charge_tbs, 1\n\t.equ\tse_m_charge_exg, 0\n\t.equ\tse_m_charge_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_charge\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_charge_1:\n\t.byte\tKEYSH , se_m_charge_key+0\n\t.byte\tTEMPO , 150*se_m_charge_tbs/2\n\t.byte\t\tVOICE , 18\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 34*se_m_charge_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN66   , Cn5 , v127\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW01\n\t.byte\t\tVOL   , 43*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\t\tBEND  , c_v-2\n\t.byte\tW01\n\t.byte\t\tVOL   , 58*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW02\n\t.byte\t\t        c_v-2\n\t.byte\tW01\n\t.byte\t\tVOL   , 70*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW01\n\t.byte\t\tVOL   , 76*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW02\n\t.byte\t\tVOL   , 90*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-2\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-2\n\t.byte\t\tBEND  , c_v-15\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW02\n\t.byte\t\t        c_v-2\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v-19\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+4\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v-19\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-2\n\t.byte\t\tBEND  , c_v-17\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v-19\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW01\n\t.byte\t\t        c_v-4\n\t.byte\tW01\n\t.byte\t\t        c_v-2\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW02\n\t.byte\t\t        c_v+2\n\t.byte\t\tBEND  , c_v-28\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v-24\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW01\n\t.byte\t\tVOL   , 84*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW02\n\t.byte\t\t        c_v-2\n\t.byte\tW01\n\t.byte\t\tVOL   , 78*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\t\tBEND  , c_v-27\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 70*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW02\n\t.byte\t\t        c_v-4\n\t.byte\tW01\n\t.byte\t\tVOL   , 55*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v-2\n\t.byte\t\tBEND  , c_v-29\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 46*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+4\n\t.byte\t\tBEND  , c_v-31\n\t.byte\tW02\n\t.byte\t\tVOL   , 36*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 24*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-36\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW01\n\t.byte\t\tVOL   , 13*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-42\n\t.byte\tW02\n\t.byte\t\tVOL   , 5*se_m_charge_mvl/mxv\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_charge:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_charge_pri\t@ Priority\n\t.byte\tse_m_charge_rev\t@ Reverb.\n\n\t.word\tse_m_charge_grp\n\n\t.word\tse_m_charge_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_charm.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_charm_grp, voicegroup128\n\t.equ\tse_m_charm_pri, 4\n\t.equ\tse_m_charm_rev, reverb_set+50\n\t.equ\tse_m_charm_mvl, 127\n\t.equ\tse_m_charm_key, 0\n\t.equ\tse_m_charm_tbs, 1\n\t.equ\tse_m_charm_exg, 0\n\t.equ\tse_m_charm_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_charm\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_charm_1:\n\t.byte\tKEYSH , se_m_charm_key+0\n\t.byte\tTEMPO , 150*se_m_charm_tbs/2\n\t.byte\t\tVOICE , 37\n\t.byte\t\tBENDR , 24\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 25*se_m_charm_mvl/mxv\n\t.byte\t\tBEND  , c_v+11\n\t.byte\t\tN02   , Fn4 , v127\n\t.byte\tW01\n\t.byte\t\tVOL   , 42*se_m_charm_mvl/mxv\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW01\n\t.byte\t\tVOL   , 62*se_m_charm_mvl/mxv\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN15\n\t.byte\tW01\n\t.byte\t\tVOL   , 77*se_m_charm_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW01\n\t.byte\t\tVOL   , 84*se_m_charm_mvl/mxv\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW02\n\t.byte\t\tVOL   , 96*se_m_charm_mvl/mxv\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+20\n\t.byte\tW01\n\t.byte\t\tVOL   , 100*se_m_charm_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+25\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+30\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+34\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+40\n\t.byte\tW02\n\t.byte\t\tVOL   , 94*se_m_charm_mvl/mxv\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW01\n\t.byte\t\tVOL   , 85*se_m_charm_mvl/mxv\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+37\n\t.byte\tW01\n\t.byte\t\tVOL   , 66*se_m_charm_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+36\n\t.byte\tW01\n\t.byte\t\tVOL   , 49*se_m_charm_mvl/mxv\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+34\n\t.byte\tW01\n\t.byte\t\tVOL   , 32*se_m_charm_mvl/mxv\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+32\n\t.byte\tW02\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_charm:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_charm_pri\t@ Priority\n\t.byte\tse_m_charm_rev\t@ Reverb.\n\n\t.word\tse_m_charm_grp\n\n\t.word\tse_m_charm_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_confuse_ray.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_confuse_ray_grp, voicegroup128\n\t.equ\tse_m_confuse_ray_pri, 4\n\t.equ\tse_m_confuse_ray_rev, reverb_set+50\n\t.equ\tse_m_confuse_ray_mvl, 127\n\t.equ\tse_m_confuse_ray_key, 0\n\t.equ\tse_m_confuse_ray_tbs, 1\n\t.equ\tse_m_confuse_ray_exg, 0\n\t.equ\tse_m_confuse_ray_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_confuse_ray\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_confuse_ray_1:\n\t.byte\tKEYSH , se_m_confuse_ray_key+0\n\t.byte\tTEMPO , 220*se_m_confuse_ray_tbs/2\n\t.byte\t\tVOICE , 52\n\t.byte\t\tVOL   , 127*se_m_confuse_ray_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , As3 , v120\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\t        c_v-16\n\t.byte\tW01\n\t.byte\t\t        c_v-1\n\t.byte\t\tN12   , As2 , v127\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW01\n\t.byte\t\t        c_v+18\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tBEND  , c_v+28\n\t.byte\tW02\n\t.byte\t\t        c_v+35\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , As3 , v108\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW02\n\t.byte\t\t        c_v-17\n\t.byte\tW01\n\t.byte\t\t        c_v-1\n\t.byte\t\tN12   , As2\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW01\n\t.byte\t\t        c_v+18\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tBEND  , c_v+28\n\t.byte\tW01\n\t.byte\t\t        c_v+35\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , As3 , v072\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\t        c_v-16\n\t.byte\tW01\n\t.byte\t\t        c_v-1\n\t.byte\t\tN12   , As2\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW01\n\t.byte\t\t        c_v+18\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tBEND  , c_v+28\n\t.byte\tW01\n\t.byte\t\t        c_v+35\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW04\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_confuse_ray:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_confuse_ray_pri\t@ Priority\n\t.byte\tse_m_confuse_ray_rev\t@ Reverb.\n\n\t.word\tse_m_confuse_ray_grp\n\n\t.word\tse_m_confuse_ray_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_cosmic_power.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_cosmic_power_grp, voicegroup128\n\t.equ\tse_m_cosmic_power_pri, 4\n\t.equ\tse_m_cosmic_power_rev, reverb_set+50\n\t.equ\tse_m_cosmic_power_mvl, 127\n\t.equ\tse_m_cosmic_power_key, 0\n\t.equ\tse_m_cosmic_power_tbs, 1\n\t.equ\tse_m_cosmic_power_exg, 0\n\t.equ\tse_m_cosmic_power_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_cosmic_power\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_cosmic_power_1:\n\t.byte\tKEYSH , se_m_cosmic_power_key+0\n\t.byte\tTEMPO , 150*se_m_cosmic_power_tbs/2\n\t.byte\t\tVOICE , 46\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_cosmic_power_mvl/mxv\n\t.byte\t\tBEND  , c_v-4\n\t.byte\t\tN09   , As5 , v112\n\t.byte\tW06\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tN08   , Cn5\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-9\n\t.byte\t\tN10   , Gn5\n\t.byte\tW06\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tN09   , Fn6\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN09   , An5\n\t.byte\tW04\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tN09   , As5\n\t.byte\tW06\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tN08   , Cn5 , v108\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tN10   , Gn5 , v104\n\t.byte\tW06\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN09   , Fn6 , v096\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tN09   , An5 , v092\n\t.byte\tW04\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-9\n\t.byte\tW02\n\t.byte\t\tN09   , As5 , v084\n\t.byte\tW06\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tN08   , Cn5 , v080\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\t\tN10   , Gn5 , v072\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW05\n\t.byte\tW04\n\t.byte\t\t        c_v+4\n\t.byte\t\tN09   , Fn6 , v068\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tN09   , An5 , v060\n\t.byte\tW04\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW02\n\t.byte\t\tN09   , As5 , v056\n\t.byte\tW06\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN08   , Cn5 , v052\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\t\tN10   , Gn5 , v044\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW05\n\t.byte\tW03\n\t.byte\t\t        c_v-9\n\t.byte\tW01\n\t.byte\t\tN09   , Fn6 , v040\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tN09   , An5 , v032\n\t.byte\tW04\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW06\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_cosmic_power_2:\n\t.byte\tKEYSH , se_m_cosmic_power_key+0\n\t.byte\t\tVOICE , 53\n\t.byte\t\tXCMD  , xIECV , 9\n\t.byte\t\t        xIECL , 8\n\t.byte\t\tVOL   , 43*se_m_cosmic_power_mvl/mxv\n\t.byte\t\tBEND  , c_v-2\n\t.byte\tW04\n\t.byte\t\tN08   , Fn5 , v112\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tW01\n\t.byte\t\tN10   , Ds5\n\t.byte\tW05\n\t.byte\tW06\n\t.byte\t\tN09   , As6\n\t.byte\tW06\n\t.byte\tW03\n\t.byte\t\t        Cn6\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\t\tN10   , Fn5\n\t.byte\tW06\n\t.byte\tW04\n\t.byte\t\tN08\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tW01\n\t.byte\t\tN10   , Ds5 , v104\n\t.byte\tW05\n\t.byte\tW06\n\t.byte\t\tN09   , As6 , v100\n\t.byte\tW06\n\t.byte\tW03\n\t.byte\t\t        Cn6 , v092\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\t\tN10   , Fn5 , v088\n\t.byte\tW06\n\t.byte\tW04\n\t.byte\t\tN08   , Fn5 , v080\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tW01\n\t.byte\t\tN10   , Ds5 , v076\n\t.byte\tW05\n\t.byte\tW06\n\t.byte\t\tN09   , As6 , v072\n\t.byte\tW06\n\t.byte\tW03\n\t.byte\t\t        Cn6 , v064\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\t\tN10   , Fn5 , v060\n\t.byte\tW06\n\t.byte\tW04\n\t.byte\t\tN08   , Fn5 , v052\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tW01\n\t.byte\t\tN10   , Ds5 , v048\n\t.byte\tW05\n\t.byte\tW06\n\t.byte\t\tN09   , As6 , v040\n\t.byte\tW06\n\t.byte\tW03\n\t.byte\t\t        Cn6 , v036\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\t\tN12   , Fn5 , v032\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_cosmic_power:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_cosmic_power_pri\t@ Priority\n\t.byte\tse_m_cosmic_power_rev\t@ Reverb.\n\n\t.word\tse_m_cosmic_power_grp\n\n\t.word\tse_m_cosmic_power_1\n\t.word\tse_m_cosmic_power_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_crabhammer.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_crabhammer_grp, voicegroup128\n\t.equ\tse_m_crabhammer_pri, 4\n\t.equ\tse_m_crabhammer_rev, reverb_set+50\n\t.equ\tse_m_crabhammer_mvl, 127\n\t.equ\tse_m_crabhammer_key, 0\n\t.equ\tse_m_crabhammer_tbs, 1\n\t.equ\tse_m_crabhammer_exg, 0\n\t.equ\tse_m_crabhammer_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_crabhammer\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_crabhammer_1:\n\t.byte\tKEYSH , se_m_crabhammer_key+0\n\t.byte\tTEMPO , 150*se_m_crabhammer_tbs/2\n\t.byte\t\tVOICE , 23\n\t.byte\t\tVOL   , 100*se_m_crabhammer_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+2\n\t.byte\t\tN02   , Dn3 , v127\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v+6\n\t.byte\t\tN02   , Dn3 , v084\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW02\n\t.byte\t\t        c_v-1\n\t.byte\tW02\n\t.byte\t\t        c_v+32\n\t.byte\t\tN02   , Dn3 , v056\n\t.byte\tW16\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_crabhammer:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_crabhammer_pri\t@ Priority\n\t.byte\tse_m_crabhammer_rev\t@ Reverb.\n\n\t.word\tse_m_crabhammer_grp\n\n\t.word\tse_m_crabhammer_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_detect.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_detect_grp, voicegroup128\n\t.equ\tse_m_detect_pri, 4\n\t.equ\tse_m_detect_rev, reverb_set+50\n\t.equ\tse_m_detect_mvl, 127\n\t.equ\tse_m_detect_key, 0\n\t.equ\tse_m_detect_tbs, 1\n\t.equ\tse_m_detect_exg, 0\n\t.equ\tse_m_detect_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_detect\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_detect_1:\n\t.byte\tKEYSH , se_m_detect_key+0\n\t.byte\tTEMPO , 220*se_m_detect_tbs/2\n\t.byte\t\tVOICE , 54\n\t.byte\t\tVOL   , 100*se_m_detect_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+1\n\t.byte\t\tN03   , As5 , v127\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+2\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+4\n\t.byte\tW01\n\t.byte\t\t        c_v+1\n\t.byte\t\tN06   , Bn5\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW02\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+1\n\t.byte\t\tN03   , As5 , v104\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-2\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW02\n\t.byte\t\t        c_v+4\n\t.byte\tW01\n\t.byte\t\t        c_v+1\n\t.byte\t\tN06   , Bn5\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW04\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+1\n\t.byte\t\tN03   , As5 , v080\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+4\n\t.byte\tW01\n\t.byte\t\t        c_v+1\n\t.byte\t\tN06   , Bn5\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW04\n\t.byte\t\tBEND  , c_v+1\n\t.byte\t\tN03   , As5 , v048\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+4\n\t.byte\tW01\n\t.byte\t\t        c_v+1\n\t.byte\t\tN06   , Bn5\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_detect:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_detect_pri\t@ Priority\n\t.byte\tse_m_detect_rev\t@ Reverb.\n\n\t.word\tse_m_detect_grp\n\n\t.word\tse_m_detect_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_dig.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_dig_grp, voicegroup128\n\t.equ\tse_m_dig_pri, 4\n\t.equ\tse_m_dig_rev, reverb_set+50\n\t.equ\tse_m_dig_mvl, 127\n\t.equ\tse_m_dig_key, 0\n\t.equ\tse_m_dig_tbs, 1\n\t.equ\tse_m_dig_exg, 0\n\t.equ\tse_m_dig_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_dig\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_dig_1:\n\t.byte\tKEYSH , se_m_dig_key+0\n\t.byte\tTEMPO , 150*se_m_dig_tbs/2\n\t.byte\t\tVOICE , 36\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 115*se_m_dig_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Cn2 , v112\n\t.byte\tW01\n\t.byte\t\tVOICE , 26\n\t.byte\t\tN02   , Cn3 , v127\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW01\n\t.byte\t\t        c_v+16\n\t.byte\t\tN03\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v+28\n\t.byte\tW02\n\t.byte\t\t        c_v+45\n\t.byte\tW01\n\t.byte\t\tVOICE , 36\n\t.byte\t\tPAN   , c_v+12\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Cn3 , v056\n\t.byte\tW02\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-12\n\t.byte\t\tN02   , Cn3 , v036\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_dig:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_dig_pri\t@ Priority\n\t.byte\tse_m_dig_rev\t@ Reverb.\n\n\t.word\tse_m_dig_grp\n\n\t.word\tse_m_dig_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_dive.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_dive_grp, voicegroup128\n\t.equ\tse_m_dive_pri, 4\n\t.equ\tse_m_dive_rev, reverb_set+50\n\t.equ\tse_m_dive_mvl, 127\n\t.equ\tse_m_dive_key, 0\n\t.equ\tse_m_dive_tbs, 1\n\t.equ\tse_m_dive_exg, 0\n\t.equ\tse_m_dive_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_dive\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_dive_1:\n\t.byte\tKEYSH , se_m_dive_key+0\n\t.byte\tTEMPO , 150*se_m_dive_tbs/2\n\t.byte\t\tVOICE , 36\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 105*se_m_dive_mvl/mxv\n\t.byte\t\tBEND  , c_v-18\n\t.byte\t\tN06   , Fn2 , v127\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+3\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-14\n\t.byte\t\tN04\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+3\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW02\n\t.byte\t\tN36   , Gn3 , v092\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-3\n\t.byte\t\tBEND  , c_v-5\n\t.byte\tW02\n\t.byte\t\tVOL   , 100*se_m_dive_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v-2\n\t.byte\tW03\n\t.byte\t\tVOL   , 94*se_m_dive_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-3\n\t.byte\t\tBEND  , c_v+1\n\t.byte\tW02\n\t.byte\t\tVOL   , 84*se_m_dive_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+3\n\t.byte\t\tVOL   , 72*se_m_dive_mvl/mxv\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tVOL   , 57*se_m_dive_mvl/mxv\n\t.byte\t\tBEND  , c_v-3\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+3\n\t.byte\t\tVOL   , 37*se_m_dive_mvl/mxv\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW03\n\t.byte\t\tVOL   , 20*se_m_dive_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tVOL   , 7*se_m_dive_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-3\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_dive_2:\n\t.byte\tKEYSH , se_m_dive_key+0\n\t.byte\t\tVOICE , 25\n\t.byte\t\tVOL   , 105*se_m_dive_mvl/mxv\n\t.byte\t\tN06   , An2 , v040\n\t.byte\tW06\n\t.byte\t\t        Gn2\n\t.byte\tW06\n\t.byte\t\t        Gs3 , v044\n\t.byte\tW07\n\t.byte\t\t        Gs3 , v036\n\t.byte\tW05\n\t.byte\tW02\n\t.byte\t\t        Gs3 , v028\n\t.byte\tW07\n\t.byte\t\t        Gs3 , v020\n\t.byte\tW03\n\t.byte\tW04\n\t.byte\t\t        Gs3 , v012\n\t.byte\tW08\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_dive:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_dive_pri\t@ Priority\n\t.byte\tse_m_dive_rev\t@ Reverb.\n\n\t.word\tse_m_dive_grp\n\n\t.word\tse_m_dive_1\n\t.word\tse_m_dive_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_dizzy_punch.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_dizzy_punch_grp, voicegroup128\n\t.equ\tse_m_dizzy_punch_pri, 4\n\t.equ\tse_m_dizzy_punch_rev, reverb_set+50\n\t.equ\tse_m_dizzy_punch_mvl, 127\n\t.equ\tse_m_dizzy_punch_key, 0\n\t.equ\tse_m_dizzy_punch_tbs, 1\n\t.equ\tse_m_dizzy_punch_exg, 0\n\t.equ\tse_m_dizzy_punch_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_dizzy_punch\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_dizzy_punch_1:\n\t.byte\tKEYSH , se_m_dizzy_punch_key+0\n\t.byte\tTEMPO , 150*se_m_dizzy_punch_tbs/2\n\t.byte\t\tVOICE , 19\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 5*se_m_dizzy_punch_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN07   , Bn5 , v080\n\t.byte\tW01\n\t.byte\t\tVOL   , 55*se_m_dizzy_punch_mvl/mxv\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tBEND  , c_v+3\n\t.byte\tW01\n\t.byte\t\tVOL   , 67*se_m_dizzy_punch_mvl/mxv\n\t.byte\t\tPAN   , c_v+22\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 90*se_m_dizzy_punch_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-12\n\t.byte\t\tBEND  , c_v-14\n\t.byte\tW02\n\t.byte\t\tVOL   , 4*se_m_dizzy_punch_mvl/mxv\n\t.byte\t\tPAN   , c_v-22\n\t.byte\t\tBEND  , c_v-23\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-13\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN04   , Cn6\n\t.byte\tW01\n\t.byte\t\tVOL   , 66*se_m_dizzy_punch_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+1\n\t.byte\tW01\n\t.byte\t\tVOL   , 90*se_m_dizzy_punch_mvl/mxv\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tBEND  , c_v+3\n\t.byte\tW01\n\t.byte\t\tVOL   , 4*se_m_dizzy_punch_mvl/mxv\n\t.byte\t\tPAN   , c_v+21\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW14\n\t.byte\t\tVOL   , 90*se_m_dizzy_punch_mvl/mxv\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_dizzy_punch:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_dizzy_punch_pri\t@ Priority\n\t.byte\tse_m_dizzy_punch_rev\t@ Reverb.\n\n\t.word\tse_m_dizzy_punch_grp\n\n\t.word\tse_m_dizzy_punch_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_double_team.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_double_team_grp, voicegroup128\n\t.equ\tse_m_double_team_pri, 4\n\t.equ\tse_m_double_team_rev, reverb_set+50\n\t.equ\tse_m_double_team_mvl, 127\n\t.equ\tse_m_double_team_key, 0\n\t.equ\tse_m_double_team_tbs, 1\n\t.equ\tse_m_double_team_exg, 0\n\t.equ\tse_m_double_team_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_double_team\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_double_team_1:\n\t.byte\tKEYSH , se_m_double_team_key+0\n\t.byte\tTEMPO , 150*se_m_double_team_tbs/2\n\t.byte\t\tVOICE , 22\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_double_team_mvl/mxv\n\t.byte\t\tBEND  , c_v-18\n\t.byte\t\tN19   , Dn3 , v108\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW01\n\t.byte\t\tVOL   , 101*se_m_double_team_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-9\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW02\n\t.byte\t\tVOL   , 84*se_m_double_team_mvl/mxv\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 64*se_m_double_team_mvl/mxv\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\tW02\n\t.byte\t\tVOL   , 45*se_m_double_team_mvl/mxv\n\t.byte\t\tBEND  , c_v-31\n\t.byte\tW02\n\t.byte\t\tVOL   , 32*se_m_double_team_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOICE , 2\n\t.byte\tW01\n\t.byte\t\tVOL   , 13*se_m_double_team_mvl/mxv\n\t.byte\t\tBEND  , c_v-52\n\t.byte\tW08\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_double_team:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_double_team_pri\t@ Priority\n\t.byte\tse_m_double_team_rev\t@ Reverb.\n\n\t.word\tse_m_double_team_grp\n\n\t.word\tse_m_double_team_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_dragon_rage.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_dragon_rage_grp, voicegroup128\n\t.equ\tse_m_dragon_rage_pri, 4\n\t.equ\tse_m_dragon_rage_rev, reverb_set+50\n\t.equ\tse_m_dragon_rage_mvl, 127\n\t.equ\tse_m_dragon_rage_key, 0\n\t.equ\tse_m_dragon_rage_tbs, 1\n\t.equ\tse_m_dragon_rage_exg, 0\n\t.equ\tse_m_dragon_rage_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_dragon_rage\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_dragon_rage_1:\n\t.byte\tKEYSH , se_m_dragon_rage_key+0\n\t.byte\tTEMPO , 150*se_m_dragon_rage_tbs/2\n\t.byte\t\tVOICE , 29\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 21*se_m_dragon_rage_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN10   , An2 , v127\n\t.byte\tW02\n\t.byte\t\tVOL   , 47*se_m_dragon_rage_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 88*se_m_dragon_rage_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW01\n\t.byte\t\tVOL   , 120*se_m_dragon_rage_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 21*se_m_dragon_rage_mvl/mxv\n\t.byte\t\tBEND  , c_v+10\n\t.byte\t\tN10   , Bn2\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+5\n\t.byte\tW01\n\t.byte\t\tVOL   , 47*se_m_dragon_rage_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 88*se_m_dragon_rage_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tVOL   , 120*se_m_dragon_rage_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-2\n\t.byte\t\tVOL   , 21*se_m_dragon_rage_mvl/mxv\n\t.byte\t\tBEND  , c_v+18\n\t.byte\t\tN10   , Cs3\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 47*se_m_dragon_rage_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        88*se_m_dragon_rage_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 120*se_m_dragon_rage_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW02\n\t.byte\t\tVOL   , 20*se_m_dragon_rage_mvl/mxv\n\t.byte\t\tBEND  , c_v+29\n\t.byte\t\tN10   , Dn3\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 47*se_m_dragon_rage_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+5\n\t.byte\tW01\n\t.byte\t\tVOL   , 88*se_m_dragon_rage_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 120*se_m_dragon_rage_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW01\n\t.byte\t\tVOL   , 21*se_m_dragon_rage_mvl/mxv\n\t.byte\t\tBEND  , c_v+37\n\t.byte\t\tN10   , En3\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-2\n\t.byte\t\tVOL   , 46*se_m_dragon_rage_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 102*se_m_dragon_rage_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        120*se_m_dragon_rage_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v-5\n\t.byte\t\tVOL   , 20*se_m_dragon_rage_mvl/mxv\n\t.byte\t\tBEND  , c_v+42\n\t.byte\t\tN20   , Fs3\n\t.byte\tW02\n\t.byte\t\tVOL   , 47*se_m_dragon_rage_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 88*se_m_dragon_rage_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+5\n\t.byte\tW01\n\t.byte\t\tVOL   , 120*se_m_dragon_rage_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 99*se_m_dragon_rage_mvl/mxv\n\t.byte\t\tBEND  , c_v+50\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW01\n\t.byte\t\tVOL   , 74*se_m_dragon_rage_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+56\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-2\n\t.byte\t\tVOL   , 53*se_m_dragon_rage_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        34*se_m_dragon_rage_mvl/mxv\n\t.byte\t\tBEND  , c_v+63\n\t.byte\tW01\n\t.byte\t\tVOL   , 15*se_m_dragon_rage_mvl/mxv\n\t.byte\tW23\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_dragon_rage:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_dragon_rage_pri\t@ Priority\n\t.byte\tse_m_dragon_rage_rev\t@ Reverb.\n\n\t.word\tse_m_dragon_rage_grp\n\n\t.word\tse_m_dragon_rage_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_earthquake.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_earthquake_grp, voicegroup128\n\t.equ\tse_m_earthquake_pri, 4\n\t.equ\tse_m_earthquake_rev, reverb_set+50\n\t.equ\tse_m_earthquake_mvl, 127\n\t.equ\tse_m_earthquake_key, 0\n\t.equ\tse_m_earthquake_tbs, 1\n\t.equ\tse_m_earthquake_exg, 0\n\t.equ\tse_m_earthquake_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_earthquake\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_earthquake_1:\n\t.byte\tKEYSH , se_m_earthquake_key+0\n\t.byte\tTEMPO , 150*se_m_earthquake_tbs/2\n\t.byte\t\tVOICE , 26\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_earthquake_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , Cs2 , v127\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tN03   , Cn2 , v120\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tN03   , Bn1 , v116\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tN03   , Cn2 , v112\n\t.byte\tW02\nse_m_earthquake_1_000:\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-11\n\t.byte\t\tN03   , Cs2 , v108\n\t.byte\tW04\n\t.byte\tPEND\nse_m_earthquake_1_001:\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , Cn2 , v100\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tN03   , Cs2 , v116\n\t.byte\tW03\n\t.byte\tPEND\nse_m_earthquake_1_002:\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tN03   , Cn2 , v112\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tN03   , Cs2 , v108\n\t.byte\tW02\n\t.byte\tPEND\nse_m_earthquake_1_003:\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-11\n\t.byte\t\tN03   , Cn2 , v100\n\t.byte\tW04\n\t.byte\tPEND\nse_m_earthquake_1_004:\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , Cs2 , v116\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tN03   , Cn2 , v112\n\t.byte\tW03\n\t.byte\tPEND\nse_m_earthquake_1_005:\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tN03   , Cs2 , v108\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tN03   , Cn2 , v100\n\t.byte\tW02\n\t.byte\tPEND\nse_m_earthquake_1_006:\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-11\n\t.byte\t\tN03   , Cs2 , v116\n\t.byte\tW04\n\t.byte\tPEND\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , Cn2 , v112\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tN03   , Cs2 , v108\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tN03   , Cn2 , v100\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tN03   , Cs2 , v116\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-11\n\t.byte\t\tN03   , Cn2 , v112\n\t.byte\tW04\nse_m_earthquake_1_007:\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , Cs2 , v108\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tN03   , Cn2 , v100\n\t.byte\tW03\n\t.byte\tPEND\nse_m_earthquake_1_008:\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tN03   , Cs2 , v116\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tN03   , Cn2 , v112\n\t.byte\tW02\n\t.byte\tPEND\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_000\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_001\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_002\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_003\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_007\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_008\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_000\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_001\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_002\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_003\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_004\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_005\n\t.byte\tPATT\n\t .word\tse_m_earthquake_1_006\n\t.byte\t\tVOL   , 106*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , Cn2 , v112\n\t.byte\tW03\n\t.byte\t\tVOL   , 103*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tN03   , Cs2 , v108\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tVOL   , 97*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tN03   , Cn2 , v100\n\t.byte\tW03\n\t.byte\t\tVOL   , 89*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tN03   , Cs2 , v116\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\tVOL   , 85*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v-11\n\t.byte\t\tN03   , Cn2 , v112\n\t.byte\tW04\n\t.byte\t\tVOL   , 78*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , Cs2 , v108\n\t.byte\tW03\n\t.byte\t\tVOL   , 72*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tN03   , Cn2 , v100\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tVOL   , 66*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tN03   , Cs2 , v116\n\t.byte\tW03\n\t.byte\t\tVOL   , 58*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tN03   , Cn2 , v112\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\tVOL   , 46*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v-11\n\t.byte\t\tN03   , Cs2 , v108\n\t.byte\tW04\n\t.byte\t\tVOL   , 30*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , Cn2 , v100\n\t.byte\tW03\n\t.byte\t\tVOL   , 12*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW03\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_earthquake_2:\n\t.byte\tKEYSH , se_m_earthquake_key+0\n\t.byte\t\tVOICE , 5\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_earthquake_mvl/mxv\n\t.byte\t\tN02   , Fn2 , v072\n\t.byte\tW02\n\t.byte\t\tN01\n\t.byte\tW01\n\t.byte\t\tN02   , Gn2\n\t.byte\tW03\n\t.byte\t\tN01   , Gs2 , v060\n\t.byte\tW06\n\t.byte\t\tVOICE , 27\n\t.byte\t\tN06   , Bn1 , v080\n\t.byte\tW06\nse_m_earthquake_2_000:\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , Bn1 , v080\n\t.byte\tW06\n\t.byte\tPEND\n\t.byte\t\tN06\n\t.byte\tW06\n\t.byte\t\tN06\n\t.byte\tW06\n\t.byte\tPATT\n\t .word\tse_m_earthquake_2_000\n\t.byte\t\tN06   , Bn1 , v080\n\t.byte\tW06\n\t.byte\t\tN06\n\t.byte\tW06\n\t.byte\tPATT\n\t .word\tse_m_earthquake_2_000\n\t.byte\t\tN06   , Bn1 , v080\n\t.byte\tW06\n\t.byte\t\tN06\n\t.byte\tW06\n\t.byte\tPATT\n\t .word\tse_m_earthquake_2_000\n\t.byte\t\tN06   , Bn1 , v080\n\t.byte\tW06\n\t.byte\t\tN06\n\t.byte\tW06\n\t.byte\tPATT\n\t .word\tse_m_earthquake_2_000\n\t.byte\t\tN06   , Bn1 , v080\n\t.byte\tW06\n\t.byte\t\tN06\n\t.byte\tW06\n\t.byte\tPATT\n\t .word\tse_m_earthquake_2_000\n\t.byte\t\tN06   , Bn1 , v080\n\t.byte\tW06\n\t.byte\t\tN06\n\t.byte\tW06\n\t.byte\tPATT\n\t .word\tse_m_earthquake_2_000\n\t.byte\t\tN06   , Bn1 , v080\n\t.byte\tW06\n\t.byte\t\tN06\n\t.byte\tW06\n\t.byte\tPATT\n\t .word\tse_m_earthquake_2_000\n\t.byte\t\tN06   , Bn1 , v080\n\t.byte\tW06\n\t.byte\t\tN06\n\t.byte\tW06\n\t.byte\t\tVOL   , 106*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06\n\t.byte\tW03\n\t.byte\t\tVOL   , 103*se_m_earthquake_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tN06\n\t.byte\tW01\n\t.byte\t\tVOL   , 97*se_m_earthquake_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        89*se_m_earthquake_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tN06\n\t.byte\tW02\n\t.byte\t\tVOL   , 85*se_m_earthquake_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        78*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06\n\t.byte\tW03\n\t.byte\t\tVOL   , 72*se_m_earthquake_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tN06\n\t.byte\tW01\n\t.byte\t\tVOL   , 66*se_m_earthquake_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        58*se_m_earthquake_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tN06\n\t.byte\tW02\n\t.byte\t\tVOL   , 46*se_m_earthquake_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        30*se_m_earthquake_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06\n\t.byte\tW03\n\t.byte\t\tVOL   , 12*se_m_earthquake_mvl/mxv\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_earthquake:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_earthquake_pri\t@ Priority\n\t.byte\tse_m_earthquake_rev\t@ Reverb.\n\n\t.word\tse_m_earthquake_grp\n\n\t.word\tse_m_earthquake_1\n\t.word\tse_m_earthquake_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_ember.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_ember_grp, voicegroup128\n\t.equ\tse_m_ember_pri, 4\n\t.equ\tse_m_ember_rev, reverb_set+50\n\t.equ\tse_m_ember_mvl, 127\n\t.equ\tse_m_ember_key, 0\n\t.equ\tse_m_ember_tbs, 1\n\t.equ\tse_m_ember_exg, 0\n\t.equ\tse_m_ember_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_ember\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_ember_1:\n\t.byte\tKEYSH , se_m_ember_key+0\n\t.byte\tTEMPO , 150*se_m_ember_tbs/2\n\t.byte\t\tVOICE , 29\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 61*se_m_ember_mvl/mxv\n\t.byte\t\tBEND  , c_v+8\n\t.byte\t\tN10   , Gn3 , v127\n\t.byte\tW01\n\t.byte\t\tVOL   , 84*se_m_ember_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        97*se_m_ember_mvl/mxv\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\tVOL   , 110*se_m_ember_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW02\n\t.byte\t\t        c_v-12\n\t.byte\tW01\n\t.byte\t\tVOL   , 89*se_m_ember_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        64*se_m_ember_mvl/mxv\n\t.byte\t\tBEND  , c_v-42\n\t.byte\tW01\n\t.byte\t\tVOL   , 34*se_m_ember_mvl/mxv\n\t.byte\tW15\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_ember:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_ember_pri\t@ Priority\n\t.byte\tse_m_ember_rev\t@ Reverb.\n\n\t.word\tse_m_ember_grp\n\n\t.word\tse_m_ember_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_encore.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_encore_grp, voicegroup128\n\t.equ\tse_m_encore_pri, 4\n\t.equ\tse_m_encore_rev, reverb_set+50\n\t.equ\tse_m_encore_mvl, 127\n\t.equ\tse_m_encore_key, 0\n\t.equ\tse_m_encore_tbs, 1\n\t.equ\tse_m_encore_exg, 0\n\t.equ\tse_m_encore_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_encore\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_encore_1:\n\t.byte\tKEYSH , se_m_encore_key+0\n\t.byte\tTEMPO , 150*se_m_encore_tbs/2\n\t.byte\t\tVOICE , 59\n\t.byte\t\tBENDR , 12\n\t.byte\t\tVOL   , 110*se_m_encore_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , En3 , v127\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\tW01\n\t.byte\t\t        c_v-9\n\t.byte\tW01\n\t.byte\t\t        c_v+14\n\t.byte\tW01\n\t.byte\t\t        c_v-10\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\t\tN03   , An3 , v048\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+16\n\t.byte\tW01\n\t.byte\t\t        c_v-16\n\t.byte\tW04\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_encore:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_encore_pri\t@ Priority\n\t.byte\tse_m_encore_rev\t@ Reverb.\n\n\t.word\tse_m_encore_grp\n\n\t.word\tse_m_encore_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_encore2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_encore2_grp, voicegroup128\n\t.equ\tse_m_encore2_pri, 4\n\t.equ\tse_m_encore2_rev, reverb_set+50\n\t.equ\tse_m_encore2_mvl, 127\n\t.equ\tse_m_encore2_key, 0\n\t.equ\tse_m_encore2_tbs, 1\n\t.equ\tse_m_encore2_exg, 0\n\t.equ\tse_m_encore2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_encore2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_encore2_1:\n\t.byte\tKEYSH , se_m_encore2_key+0\n\t.byte\tTEMPO , 150*se_m_encore2_tbs/2\n\t.byte\t\tVOICE , 60\n\t.byte\t\tBENDR , 12\n\t.byte\t\tVOL   , 25*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tTIE   , Cn3 , v127\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+5\n\t.byte\tW01\n\t.byte\t\tVOL   , 34*se_m_encore2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 46*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW01\n\t.byte\t\t        c_v-4\n\t.byte\tW02\n\t.byte\t\tVOL   , 56*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+5\n\t.byte\tW01\n\t.byte\t\tVOL   , 70*se_m_encore2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 80*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW01\n\t.byte\t\t        c_v-4\n\t.byte\tW02\n\t.byte\t\tVOL   , 88*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tVOL   , 96*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v+5\n\t.byte\tW02\n\t.byte\t\t        c_v+2\n\t.byte\tW02\n\t.byte\t\tVOL   , 100*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-2\n\t.byte\tW01\n\t.byte\t\t        c_v-4\n\t.byte\tW02\n\t.byte\t\t        c_v-2\n\t.byte\tW02\nse_m_encore2_1_000:\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+5\n\t.byte\tW02\n\t.byte\t\t        c_v+2\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-2\n\t.byte\tW01\n\t.byte\t\t        c_v-4\n\t.byte\tW02\n\t.byte\t\t        c_v-2\n\t.byte\tW02\n\t.byte\tPEND\n\t.byte\tPATT\n\t .word\tse_m_encore2_1_000\n\t.byte\tPATT\n\t .word\tse_m_encore2_1_000\n\t.byte\tPATT\n\t .word\tse_m_encore2_1_000\n\t.byte\tPATT\n\t .word\tse_m_encore2_1_000\n\t.byte\tPATT\n\t .word\tse_m_encore2_1_000\n\t.byte\tPATT\n\t .word\tse_m_encore2_1_000\n\t.byte\t\tVOL   , 96*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+5\n\t.byte\tW01\n\t.byte\t\tVOL   , 92*se_m_encore2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 84*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW01\n\t.byte\t\t        c_v-4\n\t.byte\tW02\n\t.byte\t\tVOL   , 72*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tVOL   , 63*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v+5\n\t.byte\tW02\n\t.byte\t\tVOL   , 52*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v+2\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 37*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW01\n\t.byte\t\t        c_v-4\n\t.byte\tW01\n\t.byte\t\tVOL   , 22*se_m_encore2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        12*se_m_encore2_mvl/mxv\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW02\n\t.byte\t\tEOT   , Cn3\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_encore2:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_encore2_pri\t@ Priority\n\t.byte\tse_m_encore2_rev\t@ Reverb.\n\n\t.word\tse_m_encore2_grp\n\n\t.word\tse_m_encore2_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_explosion.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_explosion_grp, voicegroup128\n\t.equ\tse_m_explosion_pri, 4\n\t.equ\tse_m_explosion_rev, reverb_set+50\n\t.equ\tse_m_explosion_mvl, 127\n\t.equ\tse_m_explosion_key, 0\n\t.equ\tse_m_explosion_tbs, 1\n\t.equ\tse_m_explosion_exg, 0\n\t.equ\tse_m_explosion_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_explosion\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_explosion_1:\n\t.byte\tKEYSH , se_m_explosion_key+0\n\t.byte\tTEMPO , 150*se_m_explosion_tbs/2\n\t.byte\t\tVOICE , 41\n\t.byte\t\tVOL   , 125*se_m_explosion_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Ds3 , v127\n\t.byte\tW01\n\t.byte\t\t        As2\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tN02   , Gn3\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+7\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\t\tN01   , Ds3\n\t.byte\tW01\n\t.byte\t\t        As2\n\t.byte\tW02\n\t.byte\t\tN54   , Fn3\n\t.byte\tW11\n\t.byte\t\tBEND  , c_v+3\n\t.byte\tW03\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+10\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+20\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+7\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+25\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW04\n\t.byte\t\t        c_v-8\n\t.byte\t\tBEND  , c_v+20\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+10\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+3\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+7\n\t.byte\tW04\n\t.byte\t\t        c_v-8\n\t.byte\tW10\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_explosion_2:\n\t.byte\tKEYSH , se_m_explosion_key+0\n\t.byte\t\tVOICE , 4\n\t.byte\t\tVOL   , 125*se_m_explosion_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+1\n\t.byte\t\tN02   , Cn3 , v052\n\t.byte\tW01\n\t.byte\t\tVOL   , 74*se_m_explosion_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        125*se_m_explosion_mvl/mxv\n\t.byte\t\tN02\n\t.byte\tW01\n\t.byte\t\tVOL   , 74*se_m_explosion_mvl/mxv\n\t.byte\tW16\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_explosion:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_explosion_pri\t@ Priority\n\t.byte\tse_m_explosion_rev\t@ Reverb.\n\n\t.word\tse_m_explosion_grp\n\n\t.word\tse_m_explosion_1\n\t.word\tse_m_explosion_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_faint_attack.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_faint_attack_grp, voicegroup128\n\t.equ\tse_m_faint_attack_pri, 4\n\t.equ\tse_m_faint_attack_rev, reverb_set+50\n\t.equ\tse_m_faint_attack_mvl, 127\n\t.equ\tse_m_faint_attack_key, 0\n\t.equ\tse_m_faint_attack_tbs, 1\n\t.equ\tse_m_faint_attack_exg, 0\n\t.equ\tse_m_faint_attack_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_faint_attack\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_faint_attack_1:\n\t.byte\tKEYSH , se_m_faint_attack_key+0\n\t.byte\tTEMPO , 150*se_m_faint_attack_tbs/2\n\t.byte\t\tVOICE , 45\n\t.byte\t\tVOL   , 100*se_m_faint_attack_mvl/mxv\n\t.byte\t\tBENDR , 2\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-5\n\t.byte\t\tN06   , Cn3 , v112\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+10\n\t.byte\tW01\n\t.byte\t\t        c_v+37\n\t.byte\tW01\n\t.byte\t\t        c_v+55\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-9\n\t.byte\t\tBEND  , c_v-5\n\t.byte\t\tN06   , Cs3 , v096\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+10\n\t.byte\tW01\n\t.byte\t\t        c_v+37\n\t.byte\tW01\n\t.byte\t\t        c_v+55\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+7\n\t.byte\t\tBEND  , c_v-5\n\t.byte\t\tN06   , Dn3 , v080\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+10\n\t.byte\tW01\n\t.byte\t\t        c_v+37\n\t.byte\tW01\n\t.byte\t\t        c_v+55\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-14\n\t.byte\t\tBEND  , c_v-5\n\t.byte\t\tN06   , Ds3 , v060\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+10\n\t.byte\tW01\n\t.byte\t\t        c_v+37\n\t.byte\tW01\n\t.byte\t\t        c_v+55\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+14\n\t.byte\t\tBEND  , c_v-5\n\t.byte\t\tN06   , En3 , v040\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+10\n\t.byte\tW01\n\t.byte\t\t        c_v+37\n\t.byte\tW01\n\t.byte\t\t        c_v+55\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_faint_attack:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_faint_attack_pri\t@ Priority\n\t.byte\tse_m_faint_attack_rev\t@ Reverb.\n\n\t.word\tse_m_faint_attack_grp\n\n\t.word\tse_m_faint_attack_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_flame_wheel.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_flame_wheel_grp, voicegroup128\n\t.equ\tse_m_flame_wheel_pri, 4\n\t.equ\tse_m_flame_wheel_rev, reverb_set+50\n\t.equ\tse_m_flame_wheel_mvl, 127\n\t.equ\tse_m_flame_wheel_key, 0\n\t.equ\tse_m_flame_wheel_tbs, 1\n\t.equ\tse_m_flame_wheel_exg, 0\n\t.equ\tse_m_flame_wheel_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_flame_wheel\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_flame_wheel_1:\n\t.byte\tKEYSH , se_m_flame_wheel_key+0\n\t.byte\tTEMPO , 150*se_m_flame_wheel_tbs/2\n\t.byte\t\tVOICE , 29\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 22*se_m_flame_wheel_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN30   , Dn4 , v127\n\t.byte\tW01\n\t.byte\t\tVOL   , 49*se_m_flame_wheel_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        71*se_m_flame_wheel_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        95*se_m_flame_wheel_mvl/mxv\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW01\n\t.byte\t\tVOL   , 110*se_m_flame_wheel_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\tVOL   , 95*se_m_flame_wheel_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        88*se_m_flame_wheel_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW01\n\t.byte\t\tVOL   , 93*se_m_flame_wheel_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        110*se_m_flame_wheel_mvl/mxv\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW02\n\t.byte\t\tVOL   , 86*se_m_flame_wheel_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-9\n\t.byte\tW01\n\t.byte\t\tVOL   , 63*se_m_flame_wheel_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        37*se_m_flame_wheel_mvl/mxv\n\t.byte\t\tBEND  , c_v-24\n\t.byte\tW03\n\t.byte\t\tVOL   , 13*se_m_flame_wheel_mvl/mxv\n\t.byte\t\tBEND  , c_v-46\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_flame_wheel_2:\n\t.byte\tKEYSH , se_m_flame_wheel_key+0\n\t.byte\t\tVOICE , 27\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 22*se_m_flame_wheel_mvl/mxv\n\t.byte\t\tN30   , Gn2 , v032\n\t.byte\tW01\n\t.byte\t\tVOL   , 49*se_m_flame_wheel_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        71*se_m_flame_wheel_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        95*se_m_flame_wheel_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        110*se_m_flame_wheel_mvl/mxv\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        95*se_m_flame_wheel_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        88*se_m_flame_wheel_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        93*se_m_flame_wheel_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        110*se_m_flame_wheel_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        86*se_m_flame_wheel_mvl/mxv\n\t.byte\tW01\n\t.byte\tW01\n\t.byte\t\t        63*se_m_flame_wheel_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        37*se_m_flame_wheel_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        13*se_m_flame_wheel_mvl/mxv\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_flame_wheel:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_flame_wheel_pri\t@ Priority\n\t.byte\tse_m_flame_wheel_rev\t@ Reverb.\n\n\t.word\tse_m_flame_wheel_grp\n\n\t.word\tse_m_flame_wheel_1\n\t.word\tse_m_flame_wheel_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_flame_wheel2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_flame_wheel2_grp, voicegroup128\n\t.equ\tse_m_flame_wheel2_pri, 4\n\t.equ\tse_m_flame_wheel2_rev, reverb_set+50\n\t.equ\tse_m_flame_wheel2_mvl, 127\n\t.equ\tse_m_flame_wheel2_key, 0\n\t.equ\tse_m_flame_wheel2_tbs, 1\n\t.equ\tse_m_flame_wheel2_exg, 0\n\t.equ\tse_m_flame_wheel2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_flame_wheel2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_flame_wheel2_1:\n\t.byte\tKEYSH , se_m_flame_wheel2_key+0\n\t.byte\tTEMPO , 150*se_m_flame_wheel2_tbs/2\n\t.byte\t\tVOICE , 29\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_flame_wheel2_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN48   , Cn4 , v127\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+10\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW03\n\t.byte\t\tVOL   , 98*se_m_flame_wheel2_mvl/mxv\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+3\n\t.byte\tW03\n\t.byte\t\tVOL   , 88*se_m_flame_wheel2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-5\n\t.byte\tW03\n\t.byte\t\tVOL   , 68*se_m_flame_wheel2_mvl/mxv\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW03\n\t.byte\t\t        c_v+7\n\t.byte\t\tBEND  , c_v-9\n\t.byte\tW03\n\t.byte\t\tVOL   , 44*se_m_flame_wheel2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-15\n\t.byte\tW03\n\t.byte\t\tVOL   , 13*se_m_flame_wheel2_mvl/mxv\n\t.byte\t\tBEND  , c_v-24\n\t.byte\tW03\n\t.byte\t\t        c_v-40\n\t.byte\tW03\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_flame_wheel2_2:\n\t.byte\tKEYSH , se_m_flame_wheel2_key+0\n\t.byte\t\tVOICE , 27\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_flame_wheel2_mvl/mxv\n\t.byte\t\tN48   , Gn2 , v032\n\t.byte\tW18\n\t.byte\t\tVOL   , 98*se_m_flame_wheel2_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        88*se_m_flame_wheel2_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        68*se_m_flame_wheel2_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        44*se_m_flame_wheel2_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        13*se_m_flame_wheel2_mvl/mxv\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_flame_wheel2:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_flame_wheel2_pri\t@ Priority\n\t.byte\tse_m_flame_wheel2_rev\t@ Reverb.\n\n\t.word\tse_m_flame_wheel2_grp\n\n\t.word\tse_m_flame_wheel2_1\n\t.word\tse_m_flame_wheel2_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_flamethrower.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_flamethrower_grp, voicegroup128\n\t.equ\tse_m_flamethrower_pri, 4\n\t.equ\tse_m_flamethrower_rev, reverb_set+50\n\t.equ\tse_m_flamethrower_mvl, 127\n\t.equ\tse_m_flamethrower_key, 0\n\t.equ\tse_m_flamethrower_tbs, 1\n\t.equ\tse_m_flamethrower_exg, 0\n\t.equ\tse_m_flamethrower_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_flamethrower\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_flamethrower_1:\n\t.byte\tKEYSH , se_m_flamethrower_key+0\n\t.byte\tTEMPO , 150*se_m_flamethrower_tbs/2\n\t.byte\t\tVOICE , 29\n\t.byte\t\tBENDR , 12\n\t.byte\t\tVOL   , 110*se_m_flamethrower_mvl/mxv\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+50\n\t.byte\t\tTIE   , Cn3 , v127\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+32\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW02\n\t.byte\t\t        c_v-8\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v-15\n\t.byte\tW02\n\t.byte\t\t        c_v-10\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-9\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tBEND  , c_v+10\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+21\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW04\n\t.byte\t\t        c_v+8\n\t.byte\tW03\n\t.byte\t\t        c_v-9\n\t.byte\tW04\n\t.byte\t\t        c_v+4\n\t.byte\tW04\n\t.byte\t\t        c_v-5\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW03\nse_m_flamethrower_1_000:\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW03\n\t.byte\t\t        c_v-5\n\t.byte\tW04\n\t.byte\t\t        c_v+8\n\t.byte\tW03\n\t.byte\t\t        c_v-9\n\t.byte\tW04\n\t.byte\t\t        c_v+4\n\t.byte\tW04\n\t.byte\t\t        c_v-5\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW03\n\t.byte\tPEND\n\t.byte\tPATT\n\t .word\tse_m_flamethrower_1_000\n\t.byte\tPATT\n\t .word\tse_m_flamethrower_1_000\n\t.byte\tPATT\n\t .word\tse_m_flamethrower_1_000\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW03\n\t.byte\t\t        c_v-5\n\t.byte\tW03\n\t.byte\t\tVOL   , 103*se_m_flamethrower_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\tW03\n\t.byte\t\tVOL   , 96*se_m_flamethrower_mvl/mxv\n\t.byte\t\tPAN   , c_v-9\n\t.byte\tW04\n\t.byte\t\t        c_v+4\n\t.byte\tW02\n\t.byte\t\tVOL   , 88*se_m_flamethrower_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 73*se_m_flamethrower_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW03\n\t.byte\t\tVOL   , 62*se_m_flamethrower_mvl/mxv\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW04\n\t.byte\t\t        c_v+8\n\t.byte\tW01\n\t.byte\t\tVOL   , 47*se_m_flamethrower_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-9\n\t.byte\tW03\n\t.byte\t\tVOL   , 27*se_m_flamethrower_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW04\n\t.byte\t\tVOL   , 10*se_m_flamethrower_mvl/mxv\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW03\n\t.byte\t\tEOT   , Cn3\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_flamethrower_2:\n\t.byte\tKEYSH , se_m_flamethrower_key+0\n\t.byte\t\tVOICE , 27\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_flamethrower_mvl/mxv\n\t.byte\t\tN24   , Fn2 , v060\n\t.byte\tW10\n\t.byte\t\tVOL   , 99*se_m_flamethrower_mvl/mxv\n\t.byte\tW05\n\t.byte\t\t        82*se_m_flamethrower_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        54*se_m_flamethrower_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        25*se_m_flamethrower_mvl/mxv\n\t.byte\tW03\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_flamethrower:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_flamethrower_pri\t@ Priority\n\t.byte\tse_m_flamethrower_rev\t@ Reverb.\n\n\t.word\tse_m_flamethrower_grp\n\n\t.word\tse_m_flamethrower_1\n\t.word\tse_m_flamethrower_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_flatter.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_flatter_grp, voicegroup128\n\t.equ\tse_m_flatter_pri, 4\n\t.equ\tse_m_flatter_rev, reverb_set+50\n\t.equ\tse_m_flatter_mvl, 127\n\t.equ\tse_m_flatter_key, 0\n\t.equ\tse_m_flatter_tbs, 1\n\t.equ\tse_m_flatter_exg, 0\n\t.equ\tse_m_flatter_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_flatter\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_flatter_1:\n\t.byte\tKEYSH , se_m_flatter_key+0\n\t.byte\tTEMPO , 150*se_m_flatter_tbs/2\n\t.byte\t\tVOICE , 41\n\t.byte\t\tVOL   , 100*se_m_flatter_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Dn5 , v127\n\t.byte\tW01\n\t.byte\t\t        Gn4\n\t.byte\tW01\n\t.byte\t\tN09   , En5\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW02\n\t.byte\t\tVOL   , 92*se_m_flatter_mvl/mxv\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW01\n\t.byte\t\tVOL   , 83*se_m_flatter_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW01\n\t.byte\t\tVOL   , 71*se_m_flatter_mvl/mxv\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW01\n\t.byte\t\tVOL   , 46*se_m_flatter_mvl/mxv\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\tVOL   , 22*se_m_flatter_mvl/mxv\n\t.byte\t\tPAN   , c_v-12\n\t.byte\t\tBEND  , c_v-15\n\t.byte\tW02\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_flatter:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_flatter_pri\t@ Priority\n\t.byte\tse_m_flatter_rev\t@ Reverb.\n\n\t.word\tse_m_flatter_grp\n\n\t.word\tse_m_flatter_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_giga_drain.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_giga_drain_grp, voicegroup128\n\t.equ\tse_m_giga_drain_pri, 4\n\t.equ\tse_m_giga_drain_rev, reverb_set+50\n\t.equ\tse_m_giga_drain_mvl, 127\n\t.equ\tse_m_giga_drain_key, 0\n\t.equ\tse_m_giga_drain_tbs, 1\n\t.equ\tse_m_giga_drain_exg, 0\n\t.equ\tse_m_giga_drain_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_giga_drain\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_giga_drain_1:\n\t.byte\tKEYSH , se_m_giga_drain_key+0\n\t.byte\tTEMPO , 150*se_m_giga_drain_tbs/2\n\t.byte\t\tVOICE , 36\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_giga_drain_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , Gn2 , v127\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+3\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW01\n\t.byte\t\tVOICE , 23\n\t.byte\t\tN02   , Cn3 , v104\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-3\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW02\n\t.byte\t\tVOICE , 36\n\t.byte\t\tN02   , Cn2 , v127\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+7\n\t.byte\tW01\n\t.byte\t\tVOICE , 23\n\t.byte\t\tBEND  , c_v+4\n\t.byte\t\tN06   , Cn3 , v104\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-5\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW01\n\t.byte\t\t        c_v-23\n\t.byte\tW01\n\t.byte\t\tVOICE , 36\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , An2 , v100\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tN03   , Bn2 , v076\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tN02   , Cs3 , v040\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_giga_drain:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_giga_drain_pri\t@ Priority\n\t.byte\tse_m_giga_drain_rev\t@ Reverb.\n\n\t.word\tse_m_giga_drain_grp\n\n\t.word\tse_m_giga_drain_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_grasswhistle.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_grasswhistle_grp, voicegroup128\n\t.equ\tse_m_grasswhistle_pri, 4\n\t.equ\tse_m_grasswhistle_rev, reverb_set+50\n\t.equ\tse_m_grasswhistle_mvl, 127\n\t.equ\tse_m_grasswhistle_key, 0\n\t.equ\tse_m_grasswhistle_tbs, 1\n\t.equ\tse_m_grasswhistle_exg, 0\n\t.equ\tse_m_grasswhistle_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_grasswhistle\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_grasswhistle_1:\n\t.byte\tKEYSH , se_m_grasswhistle_key+0\n\t.byte\tTEMPO , 100*se_m_grasswhistle_tbs/2\n\t.byte\t\tVOICE , 64\n\t.byte\t\tBENDR , 2\n\t.byte\t\tLFOS  , 40\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 70*se_m_grasswhistle_mvl/mxv\n\t.byte\t\tBEND  , c_v-16\n\t.byte\t\tN21   , Gn5 , v112\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW03\n\t.byte\t\tMOD   , 10\n\t.byte\tW03\n\t.byte\tW09\n\t.byte\t\t        0\n\t.byte\tW03\n\t.byte\t\tN09   , An5\n\t.byte\tW12\n\t.byte\t\t        En5\n\t.byte\tW12\n\t.byte\t\tBEND  , c_v-14\n\t.byte\t\tN66   , Gn5\n\t.byte\tW06\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW06\n\t.byte\t\t        c_v-4\n\t.byte\tW06\n\t.byte\t\t        c_v+0\n\t.byte\tW06\n\t.byte\t\tMOD   , 10\n\t.byte\tW12\n\t.byte\tW12\n\t.byte\tW06\n\t.byte\t\tVOL   , 61*se_m_grasswhistle_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        51*se_m_grasswhistle_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        36*se_m_grasswhistle_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        18*se_m_grasswhistle_mvl/mxv\n\t.byte\tW12\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_grasswhistle_2:\n\t.byte\tKEYSH , se_m_grasswhistle_key+0\n\t.byte\t\tVOICE , 64\n\t.byte\t\tBENDR , 2\n\t.byte\t\tLFOS  , 40\n\t.byte\t\tVOL   , 70*se_m_grasswhistle_mvl/mxv\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v+12\n\t.byte\t\tBEND  , c_v-16\n\t.byte\t\tN21   , Gn5 , v072\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW03\n\t.byte\t\tMOD   , 10\n\t.byte\tW03\n\t.byte\tW09\n\t.byte\t\t        0\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-12\n\t.byte\t\tN09   , An5\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v+14\n\t.byte\t\tN09   , En5\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v-15\n\t.byte\t\tBEND  , c_v-14\n\t.byte\t\tN66   , Gn5\n\t.byte\tW06\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW06\n\t.byte\t\t        c_v-4\n\t.byte\tW06\n\t.byte\t\t        c_v+0\n\t.byte\tW06\n\t.byte\t\tMOD   , 10\n\t.byte\tW12\n\t.byte\tW06\n\t.byte\t\tVOL   , 61*se_m_grasswhistle_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        51*se_m_grasswhistle_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        36*se_m_grasswhistle_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        18*se_m_grasswhistle_mvl/mxv\n\t.byte\tW12\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_grasswhistle:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_grasswhistle_pri\t@ Priority\n\t.byte\tse_m_grasswhistle_rev\t@ Reverb.\n\n\t.word\tse_m_grasswhistle_grp\n\n\t.word\tse_m_grasswhistle_1\n\t.word\tse_m_grasswhistle_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_hail.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_hail_grp, voicegroup128\n\t.equ\tse_m_hail_pri, 4\n\t.equ\tse_m_hail_rev, reverb_set+50\n\t.equ\tse_m_hail_mvl, 127\n\t.equ\tse_m_hail_key, 0\n\t.equ\tse_m_hail_tbs, 1\n\t.equ\tse_m_hail_exg, 0\n\t.equ\tse_m_hail_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_hail\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_hail_1:\n\t.byte\tKEYSH , se_m_hail_key+0\n\t.byte\tTEMPO , 150*se_m_hail_tbs/2\n\t.byte\t\tVOICE , 3\n\t.byte\t\tVOL   , 100*se_m_hail_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Fn4 , v112\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tN02   , Ds5 , v040\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tN01   , Gn4 , v112\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Ds5\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tN02   , Ds5 , v020\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tN01   , Gn4 , v064\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Ds5\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tN02   , Ds5 , v020\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-13\n\t.byte\t\tN01   , Gn4 , v064\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Ds5\n\t.byte\tW04\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_hail_2:\n\t.byte\tKEYSH , se_m_hail_key+0\n\t.byte\t\tVOICE , 4\n\t.byte\t\tVOL   , 100*se_m_hail_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Dn4 , v040\n\t.byte\tW04\n\t.byte\t\t        Bn3\n\t.byte\tW02\n\t.byte\tW03\n\t.byte\t\t        Dn4\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\t        Bn3 , v032\n\t.byte\tW05\n\t.byte\t\t        Dn4\n\t.byte\tW03\n\t.byte\t\t        Bn3 , v012\n\t.byte\tW03\n\t.byte\tW02\n\t.byte\t\t        Dn4\n\t.byte\tW04\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_hail:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_hail_pri\t@ Priority\n\t.byte\tse_m_hail_rev\t@ Reverb.\n\n\t.word\tse_m_hail_grp\n\n\t.word\tse_m_hail_1\n\t.word\tse_m_hail_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_harden.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_harden_grp, voicegroup128\n\t.equ\tse_m_harden_pri, 4\n\t.equ\tse_m_harden_rev, reverb_set+50\n\t.equ\tse_m_harden_mvl, 127\n\t.equ\tse_m_harden_key, 0\n\t.equ\tse_m_harden_tbs, 1\n\t.equ\tse_m_harden_exg, 0\n\t.equ\tse_m_harden_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_harden\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_harden_1:\n\t.byte\tKEYSH , se_m_harden_key+0\n\t.byte\tTEMPO , 150*se_m_harden_tbs/2\n\t.byte\t\tVOICE , 28\n\t.byte\t\tVOL   , 100*se_m_harden_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+16\n\t.byte\t\tN03   , Gs3 , v080\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+38\n\t.byte\tW01\n\t.byte\t\t        c_v+62\n\t.byte\tW02\n\t.byte\t\tN17   , Gs4 , v096\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v-8\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW02\n\t.byte\t\t        c_v+6\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW05\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_harden_2:\n\t.byte\tKEYSH , se_m_harden_key+0\n\t.byte\t\tVOICE , 4\n\t.byte\t\tVOL   , 100*se_m_harden_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , En4 , v060\n\t.byte\tW04\n\t.byte\t\tN17   , Gs4 , v096\n\t.byte\tW20\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_harden:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_harden_pri\t@ Priority\n\t.byte\tse_m_harden_rev\t@ Reverb.\n\n\t.word\tse_m_harden_grp\n\n\t.word\tse_m_harden_1\n\t.word\tse_m_harden_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_haze.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_haze_grp, voicegroup128\n\t.equ\tse_m_haze_pri, 4\n\t.equ\tse_m_haze_rev, reverb_set+50\n\t.equ\tse_m_haze_mvl, 127\n\t.equ\tse_m_haze_key, 0\n\t.equ\tse_m_haze_tbs, 1\n\t.equ\tse_m_haze_exg, 0\n\t.equ\tse_m_haze_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_haze\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_haze_1:\n\t.byte\tKEYSH , se_m_haze_key+0\n\t.byte\tTEMPO , 190*se_m_haze_tbs/2\n\t.byte\t\tVOICE , 45\n\t.byte\t\tBENDR , 8\n\t.byte\t\tPAN   , c_v-47\n\t.byte\t\tVOL   , 10*se_m_haze_mvl/mxv\n\t.byte\t\tMOD   , 30\n\t.byte\t\tBEND  , c_v+1\n\t.byte\t\tTIE   , As2 , v100\n\t.byte\tW03\n\t.byte\t\tVOL   , 14*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        22*se_m_haze_mvl/mxv\n\t.byte\t\tPAN   , c_v-45\n\t.byte\tW02\n\t.byte\t\tVOL   , 31*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        39*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-43\n\t.byte\tW02\n\t.byte\t\tVOL   , 45*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        50*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-41\n\t.byte\tW01\n\t.byte\t\tVOL   , 61*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        66*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-39\n\t.byte\t\tVOL   , 73*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        78*se_m_haze_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        84*se_m_haze_mvl/mxv\n\t.byte\t\tPAN   , c_v-37\n\t.byte\tW03\n\t.byte\t\tVOL   , 91*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        98*se_m_haze_mvl/mxv\n\t.byte\t\tPAN   , c_v-35\n\t.byte\tW02\n\t.byte\t\tVOL   , 104*se_m_haze_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        110*se_m_haze_mvl/mxv\n\t.byte\t\tPAN   , c_v-32\n\t.byte\tW06\n\t.byte\t\t        c_v-28\n\t.byte\tW06\n\t.byte\t\t        c_v-25\n\t.byte\t\tVOL   , 106*se_m_haze_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        104*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-23\n\t.byte\tW03\n\t.byte\t\tVOL   , 101*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-20\n\t.byte\tW03\n\t.byte\t\tVOL   , 97*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-17\n\t.byte\tW02\n\t.byte\t\tVOL   , 91*se_m_haze_mvl/mxv\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-13\n\t.byte\tW03\n\t.byte\t\tVOL   , 88*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW03\n\t.byte\t\tVOL   , 81*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-7\n\t.byte\tW04\n\t.byte\t\tVOL   , 75*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-3\n\t.byte\tW02\n\t.byte\t\tVOL   , 74*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        76*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 79*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        83*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\t        86*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+2\n\t.byte\t\tVOL   , 90*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        95*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        98*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+7\n\t.byte\t\tVOL   , 102*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        104*se_m_haze_mvl/mxv\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tVOL   , 110*se_m_haze_mvl/mxv\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+14\n\t.byte\tW06\n\t.byte\t\t        c_v+16\n\t.byte\tW02\n\t.byte\t\tVOL   , 106*se_m_haze_mvl/mxv\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+19\n\t.byte\tW01\n\t.byte\t\tVOL   , 100*se_m_haze_mvl/mxv\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+22\n\t.byte\t\tVOL   , 94*se_m_haze_mvl/mxv\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+25\n\t.byte\t\tVOL   , 88*se_m_haze_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        83*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+27\n\t.byte\tW06\n\t.byte\t\t        c_v+29\n\t.byte\t\tVOL   , 75*se_m_haze_mvl/mxv\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+32\n\t.byte\t\tVOL   , 64*se_m_haze_mvl/mxv\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+34\n\t.byte\tW01\n\t.byte\t\tVOL   , 55*se_m_haze_mvl/mxv\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+38\n\t.byte\tW01\n\t.byte\t\tVOL   , 47*se_m_haze_mvl/mxv\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+41\n\t.byte\tW01\n\t.byte\t\tVOL   , 41*se_m_haze_mvl/mxv\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+44\n\t.byte\t\tVOL   , 32*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        25*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+47\n\t.byte\tW01\n\t.byte\t\tVOL   , 12*se_m_haze_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        6*se_m_haze_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tEOT\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_haze_2:\n\t.byte\tKEYSH , se_m_haze_key+0\n\t.byte\t\tVOICE , 70\n\t.byte\t\tBENDR , 8\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_haze_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN24   , Fn4 , v020\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\t        Fs4\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\t        Gn4\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\t        Gs4\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\t        Gn4\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\t        Fs4\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\t        Fn4\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\t        En4\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\tN18   , Ds4\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_haze:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_haze_pri\t@ Priority\n\t.byte\tse_m_haze_rev\t@ Reverb.\n\n\t.word\tse_m_haze_grp\n\n\t.word\tse_m_haze_1\n\t.word\tse_m_haze_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_heal_bell.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_heal_bell_grp, voicegroup128\n\t.equ\tse_m_heal_bell_pri, 4\n\t.equ\tse_m_heal_bell_rev, reverb_set+50\n\t.equ\tse_m_heal_bell_mvl, 127\n\t.equ\tse_m_heal_bell_key, 0\n\t.equ\tse_m_heal_bell_tbs, 1\n\t.equ\tse_m_heal_bell_exg, 0\n\t.equ\tse_m_heal_bell_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_heal_bell\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_heal_bell_1:\n\t.byte\tKEYSH , se_m_heal_bell_key+0\n\t.byte\tTEMPO , 150*se_m_heal_bell_tbs/2\n\t.byte\t\tVOICE , 51\n\t.byte\t\tBENDR , 2\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 90*se_m_heal_bell_mvl/mxv\n\t.byte\t\tBEND  , c_v+4\n\t.byte\t\tN03   , As5 , v100\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-13\n\t.byte\tW01\n\t.byte\t\t        c_v+11\n\t.byte\tW01\n\t.byte\t\t        c_v+1\n\t.byte\t\tN01   , An5\n\t.byte\tW01\n\t.byte\t\tMOD   , 7\n\t.byte\t\tN18   , Bn5\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+11\n\t.byte\tW01\n\t.byte\t\tMOD   , 0\n\t.byte\t\tPAN   , c_v-14\n\t.byte\tW01\n\t.byte\t\t        c_v+11\n\t.byte\tW01\n\t.byte\t\t        c_v-13\n\t.byte\tW01\n\t.byte\t\t        c_v+11\n\t.byte\tW02\n\t.byte\t\t        c_v-14\n\t.byte\tW01\n\t.byte\t\t        c_v+11\n\t.byte\tW01\n\t.byte\t\t        c_v-13\n\t.byte\tW01\n\t.byte\t\t        c_v+11\n\t.byte\tW01\n\t.byte\t\tMOD   , 7\n\t.byte\t\tPAN   , c_v-14\n\t.byte\tW02\n\t.byte\t\t        c_v+11\n\t.byte\tW01\n\t.byte\t\t        c_v-14\n\t.byte\tW01\n\t.byte\t\t        c_v+11\n\t.byte\tW01\n\t.byte\t\t        c_v-13\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_heal_bell:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_heal_bell_pri\t@ Priority\n\t.byte\tse_m_heal_bell_rev\t@ Reverb.\n\n\t.word\tse_m_heal_bell_grp\n\n\t.word\tse_m_heal_bell_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_heat_wave.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_heat_wave_grp, voicegroup128\n\t.equ\tse_m_heat_wave_pri, 4\n\t.equ\tse_m_heat_wave_rev, reverb_set+50\n\t.equ\tse_m_heat_wave_mvl, 127\n\t.equ\tse_m_heat_wave_key, 0\n\t.equ\tse_m_heat_wave_tbs, 1\n\t.equ\tse_m_heat_wave_exg, 0\n\t.equ\tse_m_heat_wave_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_heat_wave\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_heat_wave_1:\n\t.byte\tKEYSH , se_m_heat_wave_key+0\n\t.byte\tTEMPO , 150*se_m_heat_wave_tbs/2\n\t.byte\t\tVOICE , 29\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 23*se_m_heat_wave_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tTIE   , Fn4 , v127\n\t.byte\tW01\n\t.byte\t\tVOL   , 51*se_m_heat_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        75*se_m_heat_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        99*se_m_heat_wave_mvl/mxv\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW01\n\t.byte\t\tVOL   , 115*se_m_heat_wave_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\tVOL   , 99*se_m_heat_wave_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        92*se_m_heat_wave_mvl/mxv\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW01\n\t.byte\t\tVOL   , 97*se_m_heat_wave_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        105*se_m_heat_wave_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\tVOL   , 110*se_m_heat_wave_mvl/mxv\n\t.byte\t\tBEND  , c_v-9\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v-24\n\t.byte\tW03\n\t.byte\t\tVOL   , 115*se_m_heat_wave_mvl/mxv\n\t.byte\t\tBEND  , c_v-38\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-41\n\t.byte\tW04\n\t.byte\t\t        c_v-45\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-39\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-35\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-30\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-26\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-18\n\t.byte\tW04\n\t.byte\t\t        c_v-13\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW06\n\t.byte\t\t        c_v+0\n\t.byte\tW06\n\t.byte\t\t        c_v+6\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW04\n\t.byte\t\tBEND  , c_v-3\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tVOL   , 113*se_m_heat_wave_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        110*se_m_heat_wave_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW02\n\t.byte\t\tVOL   , 105*se_m_heat_wave_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW03\n\t.byte\t\tVOL   , 98*se_m_heat_wave_mvl/mxv\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 91*se_m_heat_wave_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        81*se_m_heat_wave_mvl/mxv\n\t.byte\t\tBEND  , c_v-15\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW02\n\t.byte\t\tVOL   , 74*se_m_heat_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 63*se_m_heat_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-30\n\t.byte\tW01\n\t.byte\t\tVOL   , 50*se_m_heat_wave_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        40*se_m_heat_wave_mvl/mxv\n\t.byte\t\tBEND  , c_v-39\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW01\n\t.byte\t\tVOL   , 28*se_m_heat_wave_mvl/mxv\n\t.byte\t\tBEND  , c_v-52\n\t.byte\tW02\n\t.byte\t\tVOL   , 17*se_m_heat_wave_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tEOT\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_heat_wave_2:\n\t.byte\tKEYSH , se_m_heat_wave_key+0\n\t.byte\t\tVOICE , 27\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 23*se_m_heat_wave_mvl/mxv\n\t.byte\t\tN30   , Gn2 , v032\n\t.byte\tW01\n\t.byte\t\tVOL   , 51*se_m_heat_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        75*se_m_heat_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        99*se_m_heat_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        115*se_m_heat_wave_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        99*se_m_heat_wave_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        92*se_m_heat_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        97*se_m_heat_wave_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        115*se_m_heat_wave_mvl/mxv\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW12\n\t.byte\tW12\n\t.byte\t\t        c_v+0\n\t.byte\tW12\n\t.byte\tW12\n\t.byte\t\t        c_v+0\n\t.byte\tW12\n\t.byte\tW12\n\t.byte\t\t        c_v+0\n\t.byte\tW12\n\t.byte\tW12\n\t.byte\t\t        c_v+0\n\t.byte\tW12\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_heat_wave:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_heat_wave_pri\t@ Priority\n\t.byte\tse_m_heat_wave_rev\t@ Reverb.\n\n\t.word\tse_m_heat_wave_grp\n\n\t.word\tse_m_heat_wave_1\n\t.word\tse_m_heat_wave_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_hydro_pump.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_hydro_pump_grp, voicegroup128\n\t.equ\tse_m_hydro_pump_pri, 4\n\t.equ\tse_m_hydro_pump_rev, reverb_set+50\n\t.equ\tse_m_hydro_pump_mvl, 127\n\t.equ\tse_m_hydro_pump_key, 0\n\t.equ\tse_m_hydro_pump_tbs, 1\n\t.equ\tse_m_hydro_pump_exg, 0\n\t.equ\tse_m_hydro_pump_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_hydro_pump\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_hydro_pump_1:\n\t.byte\tKEYSH , se_m_hydro_pump_key+0\n\t.byte\tTEMPO , 150*se_m_hydro_pump_tbs/2\n\t.byte\t\tVOICE , 36\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 115*se_m_hydro_pump_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tTIE   , Gn2 , v127\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW06\n\t.byte\t\t        c_v-10\n\t.byte\tW06\n\t.byte\t\t        c_v-5\n\t.byte\tW06\n\t.byte\t\t        c_v+0\n\t.byte\tW06\n\t.byte\t\t        c_v+4\n\t.byte\tW06\n\t.byte\t\t        c_v+11\n\t.byte\tW06\n\t.byte\t\t        c_v+4\n\t.byte\tW06\n\t.byte\t\t        c_v+0\n\t.byte\tW06\n\t.byte\t\t        c_v-4\n\t.byte\tW06\n\t.byte\t\t        c_v-10\n\t.byte\tW06\n\t.byte\t\t        c_v-5\n\t.byte\tW06\n\t.byte\t\t        c_v+0\n\t.byte\tW06\n\t.byte\t\t        c_v+4\n\t.byte\tW06\n\t.byte\t\t        c_v+11\n\t.byte\tW02\n\t.byte\t\tVOL   , 103*se_m_hydro_pump_mvl/mxv\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW01\n\t.byte\t\tVOL   , 85*se_m_hydro_pump_mvl/mxv\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 71*se_m_hydro_pump_mvl/mxv\n\t.byte\tW05\n\t.byte\t\t        52*se_m_hydro_pump_mvl/mxv\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW04\n\t.byte\t\tVOL   , 32*se_m_hydro_pump_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW03\n\t.byte\t\tVOL   , 11*se_m_hydro_pump_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW01\n\t.byte\t\tVOL   , 6*se_m_hydro_pump_mvl/mxv\n\t.byte\tW05\n\t.byte\t\tEOT\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_hydro_pump_2:\n\t.byte\tKEYSH , se_m_hydro_pump_key+0\n\t.byte\t\tVOL   , 58*se_m_hydro_pump_mvl/mxv\n\t.byte\t\tN14   , Gn3 , v080\n\t.byte\tW01\n\t.byte\t\tVOICE , 25\n\t.byte\t\tVOL   , 76*se_m_hydro_pump_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        89*se_m_hydro_pump_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        100*se_m_hydro_pump_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        115*se_m_hydro_pump_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        90*se_m_hydro_pump_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        76*se_m_hydro_pump_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        58*se_m_hydro_pump_mvl/mxv\n\t.byte\tW11\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_hydro_pump:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_hydro_pump_pri\t@ Priority\n\t.byte\tse_m_hydro_pump_rev\t@ Reverb.\n\n\t.word\tse_m_hydro_pump_grp\n\n\t.word\tse_m_hydro_pump_1\n\t.word\tse_m_hydro_pump_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_hyper_beam.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_hyper_beam_grp, voicegroup128\n\t.equ\tse_m_hyper_beam_pri, 4\n\t.equ\tse_m_hyper_beam_rev, reverb_set+50\n\t.equ\tse_m_hyper_beam_mvl, 127\n\t.equ\tse_m_hyper_beam_key, 0\n\t.equ\tse_m_hyper_beam_tbs, 1\n\t.equ\tse_m_hyper_beam_exg, 0\n\t.equ\tse_m_hyper_beam_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_hyper_beam\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_hyper_beam_1:\n\t.byte\tKEYSH , se_m_hyper_beam_key+0\n\t.byte\tTEMPO , 150*se_m_hyper_beam_tbs/2\n\t.byte\t\tVOICE , 18\n\t.byte\t\tVOL   , 110*se_m_hyper_beam_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , En3 , v127\n\t.byte\tW03\n\t.byte\t\tN01   , As3\n\t.byte\tW03\n\t.byte\t\tN02   , Gn3\n\t.byte\tW03\n\t.byte\t\tN01   , Cs4\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+7\n\t.byte\t\tN02   , En3 , v072\n\t.byte\tW03\n\t.byte\t\tN01   , As3\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN02   , Gn3 , v040\n\t.byte\tW03\n\t.byte\t\tN01   , Cs4\n\t.byte\tW03\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_hyper_beam_2:\n\t.byte\tKEYSH , se_m_hyper_beam_key+0\n\t.byte\t\tVOICE , 5\n\t.byte\t\tVOL   , 110*se_m_hyper_beam_mvl/mxv\n\t.byte\t\tN01   , Cn3 , v040\n\t.byte\tW02\n\t.byte\t\tN01\n\t.byte\tW04\n\t.byte\t\tN01\n\t.byte\tW02\n\t.byte\t\tN01\n\t.byte\tW04\nse_m_hyper_beam_2_000:\n\t.byte\t\tN01   , Cn3 , v020\n\t.byte\tW02\n\t.byte\t\tN01\n\t.byte\tW04\n\t.byte\tPEND\n\t.byte\tPATT\n\t .word\tse_m_hyper_beam_2_000\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_hyper_beam:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_hyper_beam_pri\t@ Priority\n\t.byte\tse_m_hyper_beam_rev\t@ Reverb.\n\n\t.word\tse_m_hyper_beam_grp\n\n\t.word\tse_m_hyper_beam_1\n\t.word\tse_m_hyper_beam_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_hyper_beam2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_hyper_beam2_grp, voicegroup128\n\t.equ\tse_m_hyper_beam2_pri, 4\n\t.equ\tse_m_hyper_beam2_rev, reverb_set+50\n\t.equ\tse_m_hyper_beam2_mvl, 127\n\t.equ\tse_m_hyper_beam2_key, 0\n\t.equ\tse_m_hyper_beam2_tbs, 1\n\t.equ\tse_m_hyper_beam2_exg, 0\n\t.equ\tse_m_hyper_beam2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_hyper_beam2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_hyper_beam2_1:\n\t.byte\tKEYSH , se_m_hyper_beam2_key+0\n\t.byte\tTEMPO , 150*se_m_hyper_beam2_tbs/2\n\t.byte\t\tVOICE , 45\n\t.byte\t\tVOL   , 110*se_m_hyper_beam2_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , Gn3 , v092\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW01\n\t.byte\t\t        c_v+28\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\t\tN02   , Cs4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+30\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\t\tN03   , As3\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW01\n\t.byte\t\t        c_v+28\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\t\tN02   , En4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+30\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+7\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , Gn3 , v040\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW01\n\t.byte\t\t        c_v+28\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\t\tN02   , Cs4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+30\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , As3 , v016\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW01\n\t.byte\t\t        c_v+28\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\t\tN02   , En4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+30\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_hyper_beam2_2:\n\t.byte\tKEYSH , se_m_hyper_beam2_key+0\n\t.byte\t\tVOICE , 5\n\t.byte\t\tVOL   , 110*se_m_hyper_beam2_mvl/mxv\n\t.byte\t\tN01   , Cn3 , v032\n\t.byte\tW02\n\t.byte\t\tN01\n\t.byte\tW04\n\t.byte\t\tN01\n\t.byte\tW02\n\t.byte\t\tN01\n\t.byte\tW04\nse_m_hyper_beam2_2_000:\n\t.byte\t\tN01   , Cn3 , v020\n\t.byte\tW02\n\t.byte\t\tN01\n\t.byte\tW04\n\t.byte\tPEND\n\t.byte\tPATT\n\t .word\tse_m_hyper_beam2_2_000\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_hyper_beam2:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_hyper_beam2_pri\t@ Priority\n\t.byte\tse_m_hyper_beam2_rev\t@ Reverb.\n\n\t.word\tse_m_hyper_beam2_grp\n\n\t.word\tse_m_hyper_beam2_1\n\t.word\tse_m_hyper_beam2_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_icy_wind.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_icy_wind_grp, voicegroup128\n\t.equ\tse_m_icy_wind_pri, 4\n\t.equ\tse_m_icy_wind_rev, reverb_set+50\n\t.equ\tse_m_icy_wind_mvl, 127\n\t.equ\tse_m_icy_wind_key, 0\n\t.equ\tse_m_icy_wind_tbs, 1\n\t.equ\tse_m_icy_wind_exg, 0\n\t.equ\tse_m_icy_wind_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_icy_wind\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_icy_wind_1:\n\t.byte\tKEYSH , se_m_icy_wind_key+0\n\t.byte\tTEMPO , 150*se_m_icy_wind_tbs/2\n\t.byte\t\tVOICE , 3\n\t.byte\t\tVOL   , 100*se_m_icy_wind_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Ds4 , v112\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tN01   , Bn4 , v040\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tN01   , Ds4 , v112\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Bn4\n\t.byte\tW03\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_icy_wind_2:\n\t.byte\tKEYSH , se_m_icy_wind_key+0\n\t.byte\t\tVOICE , 5\n\t.byte\t\tVOL   , 100*se_m_icy_wind_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Dn4 , v040\n\t.byte\tW04\n\t.byte\t\t        Bn3\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-7\n\t.byte\tW02\n\t.byte\t\t        c_v+9\n\t.byte\tW01\n\t.byte\t\tN01   , Dn4\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-7\n\t.byte\tW02\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_icy_wind:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_icy_wind_pri\t@ Priority\n\t.byte\tse_m_icy_wind_rev\t@ Reverb.\n\n\t.word\tse_m_icy_wind_grp\n\n\t.word\tse_m_icy_wind_1\n\t.word\tse_m_icy_wind_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_lick.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_lick_grp, voicegroup128\n\t.equ\tse_m_lick_pri, 4\n\t.equ\tse_m_lick_rev, reverb_set+50\n\t.equ\tse_m_lick_mvl, 127\n\t.equ\tse_m_lick_key, 0\n\t.equ\tse_m_lick_tbs, 1\n\t.equ\tse_m_lick_exg, 0\n\t.equ\tse_m_lick_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_lick\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_lick_1:\n\t.byte\tKEYSH , se_m_lick_key+0\n\t.byte\tTEMPO , 150*se_m_lick_tbs/2\n\t.byte\t\tVOICE , 31\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_lick_mvl/mxv\n\t.byte\t\tBEND  , c_v-5\n\t.byte\t\tN32   , Cn3 , v127\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v-9\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-25\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v-39\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v-3\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+3\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tVOL   , 102*se_m_lick_mvl/mxv\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tVOL   , 97*se_m_lick_mvl/mxv\n\t.byte\t\tBEND  , c_v+18\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+14\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tVOL   , 92*se_m_lick_mvl/mxv\n\t.byte\t\tBEND  , c_v+18\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tVOL   , 88*se_m_lick_mvl/mxv\n\t.byte\t\tBEND  , c_v+17\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tVOL   , 81*se_m_lick_mvl/mxv\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 64*se_m_lick_mvl/mxv\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tVOL   , 49*se_m_lick_mvl/mxv\n\t.byte\t\tBEND  , c_v+14\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 25*se_m_lick_mvl/mxv\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW05\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_lick:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_lick_pri\t@ Priority\n\t.byte\tse_m_lick_rev\t@ Reverb.\n\n\t.word\tse_m_lick_grp\n\n\t.word\tse_m_lick_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_lock_on.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_lock_on_grp, voicegroup128\n\t.equ\tse_m_lock_on_pri, 4\n\t.equ\tse_m_lock_on_rev, reverb_set+50\n\t.equ\tse_m_lock_on_mvl, 127\n\t.equ\tse_m_lock_on_key, 0\n\t.equ\tse_m_lock_on_tbs, 1\n\t.equ\tse_m_lock_on_exg, 0\n\t.equ\tse_m_lock_on_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_lock_on\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_lock_on_1:\n\t.byte\tKEYSH , se_m_lock_on_key+0\n\t.byte\tTEMPO , 150*se_m_lock_on_tbs/2\n\t.byte\t\tVOICE , 40\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_lock_on_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Cn4 , v100\n\t.byte\tW01\n\t.byte\t\t        Gn3 , v064\n\t.byte\tW01\n\t.byte\t\tN03   , Bn3 , v100\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+6\n\t.byte\t\tN01   , Cn4\n\t.byte\tW01\n\t.byte\t\t        Gn3 , v064\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tBEND  , c_v-6\n\t.byte\t\tN01   , Bn3 , v100\n\t.byte\tW01\n\t.byte\t\t        Gn3 , v064\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , Bn3 , v100\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_lock_on:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_lock_on_pri\t@ Priority\n\t.byte\tse_m_lock_on_rev\t@ Reverb.\n\n\t.word\tse_m_lock_on_grp\n\n\t.word\tse_m_lock_on_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_metronome.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_metronome_grp, voicegroup128\n\t.equ\tse_m_metronome_pri, 4\n\t.equ\tse_m_metronome_rev, reverb_set+50\n\t.equ\tse_m_metronome_mvl, 127\n\t.equ\tse_m_metronome_key, 0\n\t.equ\tse_m_metronome_tbs, 1\n\t.equ\tse_m_metronome_exg, 0\n\t.equ\tse_m_metronome_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_metronome\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_metronome_1:\n\t.byte\tKEYSH , se_m_metronome_key+0\n\t.byte\tTEMPO , 150*se_m_metronome_tbs/2\n\t.byte\t\tVOICE , 37\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 115*se_m_metronome_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN15   , En3 , v127\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-5\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+3\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+14\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+25\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+46\n\t.byte\tW10\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_metronome:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_metronome_pri\t@ Priority\n\t.byte\tse_m_metronome_rev\t@ Reverb.\n\n\t.word\tse_m_metronome_grp\n\n\t.word\tse_m_metronome_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_milk_drink.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_milk_drink_grp, voicegroup128\n\t.equ\tse_m_milk_drink_pri, 4\n\t.equ\tse_m_milk_drink_rev, reverb_set+50\n\t.equ\tse_m_milk_drink_mvl, 127\n\t.equ\tse_m_milk_drink_key, 0\n\t.equ\tse_m_milk_drink_tbs, 1\n\t.equ\tse_m_milk_drink_exg, 0\n\t.equ\tse_m_milk_drink_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_milk_drink\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_milk_drink_1:\n\t.byte\tKEYSH , se_m_milk_drink_key+0\n\t.byte\tTEMPO , 180*se_m_milk_drink_tbs/2\n\t.byte\t\tVOICE , 16\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 100*se_m_milk_drink_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , An6 , v100\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 90*se_m_milk_drink_mvl/mxv\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 77*se_m_milk_drink_mvl/mxv\n\t.byte\t\tBEND  , c_v-37\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 37*se_m_milk_drink_mvl/mxv\n\t.byte\t\tBEND  , c_v-47\n\t.byte\tW02\n\t.byte\t\tN02   , An6 , v056\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\tW01\n\t.byte\t\t        c_v-6\n\t.byte\t\tVOL   , 100*se_m_milk_drink_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , An6 , v100\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tVOL   , 90*se_m_milk_drink_mvl/mxv\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+1\n\t.byte\t\tVOL   , 77*se_m_milk_drink_mvl/mxv\n\t.byte\t\tBEND  , c_v-37\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 37*se_m_milk_drink_mvl/mxv\n\t.byte\t\tBEND  , c_v-47\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tN02   , An6 , v056\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\tW01\n\t.byte\t\t        c_v-10\n\t.byte\t\tVOL   , 100*se_m_milk_drink_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , An6 , v072\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 90*se_m_milk_drink_mvl/mxv\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 77*se_m_milk_drink_mvl/mxv\n\t.byte\t\tBEND  , c_v-37\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tVOL   , 37*se_m_milk_drink_mvl/mxv\n\t.byte\t\tBEND  , c_v-47\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_milk_drink_2:\n\t.byte\tKEYSH , se_m_milk_drink_key+0\n\t.byte\t\tVOICE , 53\n\t.byte\t\tVOL   , 100*se_m_milk_drink_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tN06   , Fs6 , v040\n\t.byte\tW04\n\t.byte\tW04\n\t.byte\t\tN06\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tW01\n\t.byte\t\t        Fs6 , v032\n\t.byte\tW05\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_milk_drink:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_milk_drink_pri\t@ Priority\n\t.byte\tse_m_milk_drink_rev\t@ Reverb.\n\n\t.word\tse_m_milk_drink_grp\n\n\t.word\tse_m_milk_drink_1\n\t.word\tse_m_milk_drink_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_minimize.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_minimize_grp, voicegroup128\n\t.equ\tse_m_minimize_pri, 4\n\t.equ\tse_m_minimize_rev, reverb_set+50\n\t.equ\tse_m_minimize_mvl, 127\n\t.equ\tse_m_minimize_key, 0\n\t.equ\tse_m_minimize_tbs, 1\n\t.equ\tse_m_minimize_exg, 0\n\t.equ\tse_m_minimize_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_minimize\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_minimize_1:\n\t.byte\tKEYSH , se_m_minimize_key+0\n\t.byte\tTEMPO , 150*se_m_minimize_tbs/2\n\t.byte\t\tVOICE , 45\n\t.byte\t\tBENDR , 24\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 32*se_m_minimize_mvl/mxv\n\t.byte\t\tMOD   , 30\n\t.byte\t\tBEND  , c_v+39\n\t.byte\t\tN06   , Dn4 , v127\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\tVOL   , 49*se_m_minimize_mvl/mxv\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v+23\n\t.byte\tW01\n\t.byte\t\t        c_v+15\n\t.byte\tW01\n\t.byte\t\tVOL   , 61*se_m_minimize_mvl/mxv\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+35\n\t.byte\t\tN06   , Cn4 , v116\n\t.byte\tW01\n\t.byte\t\tVOL   , 71*se_m_minimize_mvl/mxv\n\t.byte\t\tBEND  , c_v+27\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+19\n\t.byte\tW01\n\t.byte\t\tVOL   , 81*se_m_minimize_mvl/mxv\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW01\n\t.byte\t\t        c_v+5\n\t.byte\tW02\n\t.byte\t\tVOL   , 95*se_m_minimize_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+32\n\t.byte\t\tN06   , Bn3 , v112\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+24\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\t        c_v+8\n\t.byte\tW01\n\t.byte\t\t        c_v+1\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+28\n\t.byte\t\tN06   , An3\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW01\n\t.byte\t\t        c_v+5\n\t.byte\tW01\n\t.byte\t\t        c_v-2\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+24\n\t.byte\t\tN06   , Gn3 , v108\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW01\n\t.byte\t\t        c_v+1\n\t.byte\tW01\n\t.byte\t\t        c_v-6\n\t.byte\tW02\n\t.byte\t\tVOL   , 82*se_m_minimize_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+21\n\t.byte\t\tN06   , Fn3 , v100\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+13\n\t.byte\tW01\n\t.byte\t\tVOL   , 71*se_m_minimize_mvl/mxv\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW01\n\t.byte\t\t        c_v-2\n\t.byte\tW01\n\t.byte\t\tVOL   , 61*se_m_minimize_mvl/mxv\n\t.byte\t\tBEND  , c_v-10\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+17\n\t.byte\t\tN06   , En3 , v060\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v-6\n\t.byte\tW01\n\t.byte\t\t        c_v-13\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+14\n\t.byte\t\tN06   , Dn3 , v040\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v-2\n\t.byte\tW01\n\t.byte\t\t        c_v-10\n\t.byte\tW01\n\t.byte\t\t        c_v-17\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+12\n\t.byte\t\tN06   , Cn3 , v020\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW01\n\t.byte\t\t        c_v-11\n\t.byte\tW01\n\t.byte\t\t        c_v-18\n\t.byte\tW02\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_minimize:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_minimize_pri\t@ Priority\n\t.byte\tse_m_minimize_rev\t@ Reverb.\n\n\t.word\tse_m_minimize_grp\n\n\t.word\tse_m_minimize_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_mist.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_mist_grp, voicegroup128\n\t.equ\tse_m_mist_pri, 4\n\t.equ\tse_m_mist_rev, reverb_set+50\n\t.equ\tse_m_mist_mvl, 127\n\t.equ\tse_m_mist_key, 0\n\t.equ\tse_m_mist_tbs, 1\n\t.equ\tse_m_mist_exg, 0\n\t.equ\tse_m_mist_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_mist\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_mist_1:\n\t.byte\tKEYSH , se_m_mist_key+0\n\t.byte\tTEMPO , 150*se_m_mist_tbs/2\n\t.byte\t\tVOICE , 36\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 7*se_m_mist_mvl/mxv\n\t.byte\t\tBEND  , c_v+1\n\t.byte\t\tN18   , Cn5 , v052\n\t.byte\tW01\n\t.byte\t\tVOL   , 20*se_m_mist_mvl/mxv\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\tVOL   , 41*se_m_mist_mvl/mxv\n\t.byte\t\tPAN   , c_v-14\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW01\n\t.byte\t\tVOL   , 70*se_m_mist_mvl/mxv\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\tVOL   , 93*se_m_mist_mvl/mxv\n\t.byte\t\tPAN   , c_v-14\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_mist_mvl/mxv\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-14\n\t.byte\tW01\n\t.byte\t\tVOL   , 98*se_m_mist_mvl/mxv\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tBEND  , c_v+10\n\t.byte\tW01\n\t.byte\t\tVOL   , 85*se_m_mist_mvl/mxv\n\t.byte\t\tPAN   , c_v-14\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW02\n\t.byte\t\tVOL   , 69*se_m_mist_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW01\n\t.byte\t\tVOL   , 51*se_m_mist_mvl/mxv\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-14\n\t.byte\t\tVOL   , 38*se_m_mist_mvl/mxv\n\t.byte\t\tBEND  , c_v-28\n\t.byte\tW01\n\t.byte\t\tVOL   , 17*se_m_mist_mvl/mxv\n\t.byte\t\tBEND  , c_v-32\n\t.byte\tW01\n\t.byte\t\tVOL   , 4*se_m_mist_mvl/mxv\n\t.byte\t\tBEND  , c_v-38\n\t.byte\tW08\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_mist:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_mist_pri\t@ Priority\n\t.byte\tse_m_mist_rev\t@ Reverb.\n\n\t.word\tse_m_mist_grp\n\n\t.word\tse_m_mist_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_moonlight.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_moonlight_grp, voicegroup128\n\t.equ\tse_m_moonlight_pri, 4\n\t.equ\tse_m_moonlight_rev, reverb_set+50\n\t.equ\tse_m_moonlight_mvl, 127\n\t.equ\tse_m_moonlight_key, 0\n\t.equ\tse_m_moonlight_tbs, 1\n\t.equ\tse_m_moonlight_exg, 0\n\t.equ\tse_m_moonlight_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_moonlight\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_moonlight_1:\n\t.byte\tKEYSH , se_m_moonlight_key+0\n\t.byte\tTEMPO , 150*se_m_moonlight_tbs/2\n\t.byte\t\tVOICE , 46\n\t.byte\t\tVOL   , 100*se_m_moonlight_mvl/mxv\n\t.byte\t\tBENDR , 4\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tMOD   , 6\n\t.byte\t\tBEND  , c_v+3\n\t.byte\t\tN01   , Ds6 , v092\n\t.byte\tW01\n\t.byte\t\t        Dn6\n\t.byte\tW01\n\t.byte\t\t        Gn5\n\t.byte\tW01\n\t.byte\t\tN20   , Gn6 , v100\n\t.byte\tW21\nse_m_moonlight_1_000:\n\t.byte\t\tN01   , Ds6 , v056\n\t.byte\tW01\n\t.byte\t\t        Dn6\n\t.byte\tW01\n\t.byte\t\t        Gn5\n\t.byte\tW01\n\t.byte\t\tN20   , Gn6 , v064\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW04\n\t.byte\t\t        c_v-4\n\t.byte\tW05\n\t.byte\t\t        c_v+6\n\t.byte\tW05\n\t.byte\t\t        c_v-4\n\t.byte\tW04\n\t.byte\tPEND\nse_m_moonlight_1_001:\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Gs5 , v092\n\t.byte\tW01\n\t.byte\t\t        Gn5\n\t.byte\tW01\n\t.byte\t\t        Cn5\n\t.byte\tW01\n\t.byte\t\tN20   , Cn6 , v100\n\t.byte\tW21\n\t.byte\tPEND\nse_m_moonlight_1_002:\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tN01   , Gs5 , v056\n\t.byte\tW01\n\t.byte\t\t        Gn5\n\t.byte\tW01\n\t.byte\t\t        Cn5\n\t.byte\tW01\n\t.byte\t\tN20   , Cn6 , v064\n\t.byte\tW21\n\t.byte\tPEND\nse_m_moonlight_1_003:\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tN01   , Gs5 , v040\n\t.byte\tW01\n\t.byte\t\t        Gn5\n\t.byte\tW01\n\t.byte\t\t        Cn5\n\t.byte\tW01\n\t.byte\t\tN20   , Cn6\n\t.byte\tW21\n\t.byte\tPEND\nse_m_moonlight_1_004:\n\t.byte\t\tPAN   , c_v+32\n\t.byte\t\tN01   , Gs5 , v020\n\t.byte\tW01\n\t.byte\t\t        Gn5\n\t.byte\tW01\n\t.byte\t\t        Cn5\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-32\n\t.byte\t\tN20   , Cn6\n\t.byte\tW21\n\t.byte\tPEND\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Ds6 , v092\n\t.byte\tW01\n\t.byte\t\t        Dn6\n\t.byte\tW01\n\t.byte\t\t        Gn5\n\t.byte\tW01\n\t.byte\t\tN20   , Gn6 , v100\n\t.byte\tW21\n\t.byte\tPATT\n\t .word\tse_m_moonlight_1_000\n\t.byte\tPATT\n\t .word\tse_m_moonlight_1_001\n\t.byte\tPATT\n\t .word\tse_m_moonlight_1_002\n\t.byte\tPATT\n\t .word\tse_m_moonlight_1_003\n\t.byte\tPATT\n\t .word\tse_m_moonlight_1_004\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_moonlight_2:\n\t.byte\tKEYSH , se_m_moonlight_key+0\n\t.byte\t\tVOICE , 55\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 39*se_m_moonlight_mvl/mxv\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW10\n\t.byte\t\tN01   , Ds6 , v112\n\t.byte\tW02\n\t.byte\t\t        Dn6\n\t.byte\tW01\n\t.byte\t\t        Gn5\n\t.byte\tW01\n\t.byte\t\tN04   , Gn6\n\t.byte\tW05\n\t.byte\t\t        Gn6 , v096\n\t.byte\tW05\nse_m_moonlight_2_000:\n\t.byte\t\tPAN   , c_v+50\n\t.byte\t\tN04   , Gn6 , v080\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-48\n\t.byte\t\tN04   , Gn6 , v064\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+50\n\t.byte\t\tN04   , Gn6 , v048\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v-49\n\t.byte\t\tN04   , Gn6 , v032\n\t.byte\tW10\n\t.byte\tPEND\nse_m_moonlight_2_001:\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW10\n\t.byte\t\tN01   , Gs5 , v112\n\t.byte\tW02\n\t.byte\t\t        Gn5\n\t.byte\tW01\n\t.byte\t\t        Cn5\n\t.byte\tW01\n\t.byte\t\tN04   , Cn6\n\t.byte\tW05\n\t.byte\t\t        Cn6 , v096\n\t.byte\tW05\n\t.byte\tPEND\nse_m_moonlight_2_002:\n\t.byte\t\tPAN   , c_v+50\n\t.byte\t\tN04   , Cn6 , v080\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-48\n\t.byte\t\tN04   , Cn6 , v064\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+50\n\t.byte\t\tN04   , Cn6 , v048\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v-49\n\t.byte\t\tN04   , Cn6 , v032\n\t.byte\tW10\n\t.byte\tPEND\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW10\n\t.byte\t\tN01   , Ds6 , v112\n\t.byte\tW02\n\t.byte\t\t        Dn6\n\t.byte\tW01\n\t.byte\t\t        Gn5\n\t.byte\tW01\n\t.byte\t\tN04   , Gn6\n\t.byte\tW05\n\t.byte\t\t        Gn6 , v096\n\t.byte\tW05\n\t.byte\tPATT\n\t .word\tse_m_moonlight_2_000\n\t.byte\tPATT\n\t .word\tse_m_moonlight_2_001\n\t.byte\tPATT\n\t .word\tse_m_moonlight_2_002\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_moonlight:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_moonlight_pri\t@ Priority\n\t.byte\tse_m_moonlight_rev\t@ Reverb.\n\n\t.word\tse_m_moonlight_grp\n\n\t.word\tse_m_moonlight_1\n\t.word\tse_m_moonlight_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_morning_sun.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_morning_sun_grp, voicegroup128\n\t.equ\tse_m_morning_sun_pri, 5\n\t.equ\tse_m_morning_sun_rev, reverb_set+50\n\t.equ\tse_m_morning_sun_mvl, 127\n\t.equ\tse_m_morning_sun_key, 0\n\t.equ\tse_m_morning_sun_tbs, 1\n\t.equ\tse_m_morning_sun_exg, 0\n\t.equ\tse_m_morning_sun_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_morning_sun\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_morning_sun_1:\n\t.byte\tKEYSH , se_m_morning_sun_key+0\n\t.byte\tTEMPO , 150*se_m_morning_sun_tbs/2\n\t.byte\t\tVOICE , 46\n\t.byte\t\tVOL   , 95*se_m_morning_sun_mvl/mxv\n\t.byte\t\tBENDR , 2\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+15\n\t.byte\tW03\n\t.byte\t\tN06   , Ds6 , v112\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En5 , v104\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Ds6 , v096\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En5 , v088\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tN06   , Ds6 , v080\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , En5 , v072\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tN06   , Ds6 , v064\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , En5 , v056\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tN06   , Ds6 , v044\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , En5 , v036\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tN06   , Ds6 , v028\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , En5 , v020\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_morning_sun_2:\n\t.byte\tKEYSH , se_m_morning_sun_key+0\n\t.byte\t\tVOICE , 53\n\t.byte\t\tBENDR , 2\n\t.byte\t\tVOL   , 43*se_m_morning_sun_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+15\n\t.byte\t\tN06   , Gs6 , v108\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Gs6 , v100\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v092\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Gs6 , v084\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v076\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Gs6 , v068\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v060\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Gs6 , v052\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v040\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Gs6 , v032\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v024\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_morning_sun:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_morning_sun_pri\t@ Priority\n\t.byte\tse_m_morning_sun_rev\t@ Reverb.\n\n\t.word\tse_m_morning_sun_grp\n\n\t.word\tse_m_morning_sun_1\n\t.word\tse_m_morning_sun_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_nightmare.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_nightmare_grp, voicegroup128\n\t.equ\tse_m_nightmare_pri, 4\n\t.equ\tse_m_nightmare_rev, reverb_set+50\n\t.equ\tse_m_nightmare_mvl, 127\n\t.equ\tse_m_nightmare_key, 0\n\t.equ\tse_m_nightmare_tbs, 1\n\t.equ\tse_m_nightmare_exg, 0\n\t.equ\tse_m_nightmare_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_nightmare\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_nightmare_1:\n\t.byte\tKEYSH , se_m_nightmare_key+0\n\t.byte\tTEMPO , 220*se_m_nightmare_tbs/2\n\t.byte\t\tVOICE , 3\n\t.byte\t\tVOL   , 110*se_m_nightmare_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW06\n\t.byte\t\tN03   , Gn2 , v092\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tN03   , Gn2 , v088\n\t.byte\tW09\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tN03   , Fs3 , v104\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tN03   , Fs3 , v088\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , Ds3\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tN03\n\t.byte\tW09\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tN03   , An2 , v096\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+17\n\t.byte\t\tN03   , An2 , v088\n\t.byte\tW09\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tN03   , Gs3 , v104\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tN03   , Gs3 , v088\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tN03   , Fn3\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tN03\n\t.byte\tW15\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_nightmare_2:\n\t.byte\tKEYSH , se_m_nightmare_key+0\n\t.byte\t\tVOICE , 20\n\t.byte\t\tXCMD  , xIECV , 10\n\t.byte\t\t        xIECL , 8\n\t.byte\t\tVOL   , 110*se_m_nightmare_mvl/mxv\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v+55\n\t.byte\t\tN03   , Cn2 , v100\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+36\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v+17\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+2\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v-8\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+12\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v+6\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v-6\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-19\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v-31\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-44\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v-55\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-64\n\t.byte\t\tN03\n\t.byte\tW18\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_nightmare:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_nightmare_pri\t@ Priority\n\t.byte\tse_m_nightmare_rev\t@ Reverb.\n\n\t.word\tse_m_nightmare_grp\n\n\t.word\tse_m_nightmare_1\n\t.word\tse_m_nightmare_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_perish_song.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_perish_song_grp, voicegroup128\n\t.equ\tse_m_perish_song_pri, 4\n\t.equ\tse_m_perish_song_rev, reverb_set+50\n\t.equ\tse_m_perish_song_mvl, 127\n\t.equ\tse_m_perish_song_key, 0\n\t.equ\tse_m_perish_song_tbs, 1\n\t.equ\tse_m_perish_song_exg, 0\n\t.equ\tse_m_perish_song_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_perish_song\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_perish_song_1:\n\t.byte\tKEYSH , se_m_perish_song_key+0\n\t.byte\tTEMPO , 100*se_m_perish_song_tbs/2\n\t.byte\t\tVOICE , 73\n\t.byte\t\tBENDR , 12\n\t.byte\t\tLFOS  , 40\n\t.byte\t\tPAN   , c_v+7\n\t.byte\t\tVOL   , 25*se_m_perish_song_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\tVOL   , 29*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        33*se_m_perish_song_mvl/mxv\n\t.byte\t\tN48   , An3 , v112\n\t.byte\tW03\n\t.byte\t\tVOL   , 40*se_m_perish_song_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW02\nse_m_perish_song_1_000:\n\t.byte\t\tVOL   , 45*se_m_perish_song_mvl/mxv\n\t.byte\t\tMOD   , 8\n\t.byte\tW03\n\t.byte\t\tVOL   , 51*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\tPEND\nse_m_perish_song_1_001:\n\t.byte\t\tVOL   , 56*se_m_perish_song_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\tVOL   , 62*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\tPEND\nse_m_perish_song_1_002:\n\t.byte\t\tVOL   , 72*se_m_perish_song_mvl/mxv\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW03\n\t.byte\t\tVOL   , 81*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\tPEND\nse_m_perish_song_1_003:\n\t.byte\t\tVOL   , 92*se_m_perish_song_mvl/mxv\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW03\n\t.byte\t\tVOL   , 100*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\tPEND\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW06\n\t.byte\t\tVOL   , 82*se_m_perish_song_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\tVOL   , 52*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        25*se_m_perish_song_mvl/mxv\n\t.byte\t\tMOD   , 0\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW03\n\t.byte\t\tVOL   , 29*se_m_perish_song_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+7\n\t.byte\tW02\n\t.byte\t\tVOL   , 33*se_m_perish_song_mvl/mxv\n\t.byte\t\tN72   , Gs3 , v112\n\t.byte\tW03\n\t.byte\t\tVOL   , 40*se_m_perish_song_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW02\n\t.byte\tPATT\n\t .word\tse_m_perish_song_1_000\n\t.byte\tPATT\n\t .word\tse_m_perish_song_1_001\n\t.byte\tPATT\n\t .word\tse_m_perish_song_1_002\n\t.byte\tPATT\n\t .word\tse_m_perish_song_1_003\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW06\n\t.byte\t\t        c_v+0\n\t.byte\tW06\n\t.byte\t\t        c_v+4\n\t.byte\tW03\n\t.byte\t\tVOL   , 87*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        75*se_m_perish_song_mvl/mxv\n\t.byte\t\tPAN   , c_v+7\n\t.byte\tW03\n\t.byte\t\tVOL   , 62*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        48*se_m_perish_song_mvl/mxv\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW03\n\t.byte\t\tVOL   , 33*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        25*se_m_perish_song_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW02\n\t.byte\t\tVOL   , 10*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW05\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_perish_song_2:\n\t.byte\tKEYSH , se_m_perish_song_key+0\n\t.byte\t\tVOICE , 73\n\t.byte\t\tVOL   , 25*se_m_perish_song_mvl/mxv\n\t.byte\t\tPAN   , c_v-17\n\t.byte\t\tN48   , Cn4 , v100\n\t.byte\tW03\n\t.byte\t\tVOL   , 29*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        33*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        40*se_m_perish_song_mvl/mxv\n\t.byte\tW03\nse_m_perish_song_2_000:\n\t.byte\t\tVOL   , 45*se_m_perish_song_mvl/mxv\n\t.byte\t\tMOD   , 8\n\t.byte\tW03\n\t.byte\t\tVOL   , 51*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\tPEND\n\t.byte\t\t        56*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        62*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        72*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        81*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        92*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        100*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\t\t        82*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        52*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        25*se_m_perish_song_mvl/mxv\n\t.byte\t\tMOD   , 0\n\t.byte\t\tN72   , Bn3 , v100\n\t.byte\tW03\n\t.byte\t\tVOL   , 29*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        33*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        40*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\tPATT\n\t .word\tse_m_perish_song_2_000\n\t.byte\t\tVOL   , 56*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        62*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        72*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        81*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        92*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        100*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW03\n\t.byte\t\t        87*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        75*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        62*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        48*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        33*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        25*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        10*se_m_perish_song_mvl/mxv\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_perish_song:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_perish_song_pri\t@ Priority\n\t.byte\tse_m_perish_song_rev\t@ Reverb.\n\n\t.word\tse_m_perish_song_grp\n\n\t.word\tse_m_perish_song_1\n\t.word\tse_m_perish_song_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_petal_dance.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_petal_dance_grp, voicegroup128\n\t.equ\tse_m_petal_dance_pri, 4\n\t.equ\tse_m_petal_dance_rev, reverb_set+50\n\t.equ\tse_m_petal_dance_mvl, 127\n\t.equ\tse_m_petal_dance_key, 0\n\t.equ\tse_m_petal_dance_tbs, 1\n\t.equ\tse_m_petal_dance_exg, 0\n\t.equ\tse_m_petal_dance_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_petal_dance\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_petal_dance_1:\n\t.byte\tKEYSH , se_m_petal_dance_key+0\n\t.byte\tTEMPO , 150*se_m_petal_dance_tbs/2\n\t.byte\t\tVOICE , 46\n\t.byte\t\tVOL   , 95*se_m_petal_dance_mvl/mxv\n\t.byte\t\tBENDR , 2\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+15\n\t.byte\tW03\n\t.byte\t\tN06   , Dn6 , v112\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        An5 , v104\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Dn6 , v100\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        An5\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tN06   , Dn6 , v096\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , An5 , v092\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tN06   , Dn6 , v088\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , An5 , v084\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tN06   , Dn6 , v080\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , An5 , v076\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tN06   , Dn6\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , An5 , v072\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tN06   , Dn6 , v068\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , An5 , v064\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tN06   , Dn6 , v060\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , An5 , v056\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tN06   , Dn6 , v052\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , An5 , v048\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tN06   , Dn6 , v044\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , An5 , v040\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tN06   , Dn6 , v036\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN06   , An5 , v032\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_petal_dance_2:\n\t.byte\tKEYSH , se_m_petal_dance_key+0\n\t.byte\t\tVOICE , 53\n\t.byte\t\tBENDR , 2\n\t.byte\t\tVOL   , 43*se_m_petal_dance_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+15\n\t.byte\t\tN06   , En6 , v108\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v104\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En6 , v100\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v096\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En6 , v092\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v088\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En6\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v084\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En6 , v080\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v076\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En6 , v072\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v068\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En6 , v064\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En6 , v060\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v056\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En6 , v052\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v048\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En6 , v044\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v040\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        En6 , v036\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Bn5 , v032\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_petal_dance:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_petal_dance_pri\t@ Priority\n\t.byte\tse_m_petal_dance_rev\t@ Reverb.\n\n\t.word\tse_m_petal_dance_grp\n\n\t.word\tse_m_petal_dance_1\n\t.word\tse_m_petal_dance_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_poison_powder.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_poison_powder_grp, voicegroup128\n\t.equ\tse_m_poison_powder_pri, 4\n\t.equ\tse_m_poison_powder_rev, reverb_set+50\n\t.equ\tse_m_poison_powder_mvl, 127\n\t.equ\tse_m_poison_powder_key, 0\n\t.equ\tse_m_poison_powder_tbs, 1\n\t.equ\tse_m_poison_powder_exg, 0\n\t.equ\tse_m_poison_powder_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_poison_powder\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_poison_powder_1:\n\t.byte\tKEYSH , se_m_poison_powder_key+0\n\t.byte\tTEMPO , 150*se_m_poison_powder_tbs/2\n\t.byte\t\tVOICE , 18\n\t.byte\t\tBENDR , 12\n\t.byte\t\tVOL   , 55*se_m_poison_powder_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+1\n\t.byte\t\tN01   , Cn6 , v100\n\t.byte\tW01\n\t.byte\t\tVOL   , 110*se_m_poison_powder_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tVOICE , 36\n\t.byte\t\tVOL   , 55*se_m_poison_powder_mvl/mxv\n\t.byte\t\tN02   , Gn6 , v080\n\t.byte\tW01\n\t.byte\t\tVOL   , 110*se_m_poison_powder_mvl/mxv\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+20\n\t.byte\t\tN01   , Gn6 , v024\n\t.byte\tW03\n\t.byte\t\t        Gn6 , v016\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-21\n\t.byte\tW12\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_poison_powder:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_poison_powder_pri\t@ Priority\n\t.byte\tse_m_poison_powder_rev\t@ Reverb.\n\n\t.word\tse_m_poison_powder_grp\n\n\t.word\tse_m_poison_powder_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_psybeam.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_psybeam_grp, voicegroup128\n\t.equ\tse_m_psybeam_pri, 4\n\t.equ\tse_m_psybeam_rev, reverb_set+50\n\t.equ\tse_m_psybeam_mvl, 127\n\t.equ\tse_m_psybeam_key, 0\n\t.equ\tse_m_psybeam_tbs, 1\n\t.equ\tse_m_psybeam_exg, 0\n\t.equ\tse_m_psybeam_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_psybeam\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_psybeam_1:\n\t.byte\tKEYSH , se_m_psybeam_key+0\n\t.byte\tTEMPO , 190*se_m_psybeam_tbs/2\n\t.byte\t\tVOICE , 45\n\t.byte\t\tBENDR , 8\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 38*se_m_psybeam_mvl/mxv\n\t.byte\t\tMOD   , 30\n\t.byte\t\tBEND  , c_v+1\n\t.byte\t\tN42   , As2 , v120\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+3\n\t.byte\tW01\n\t.byte\t\t        c_v+5\n\t.byte\t\tVOL   , 57*se_m_psybeam_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+9\n\t.byte\tW01\n\t.byte\t\tVOL   , 71*se_m_psybeam_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+5\n\t.byte\tW01\n\t.byte\t\t        c_v+1\n\t.byte\t\tVOL   , 82*se_m_psybeam_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-3\n\t.byte\t\tVOL   , 94*se_m_psybeam_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\tW02\n\t.byte\t\t        c_v-10\n\t.byte\t\tVOL   , 110*se_m_psybeam_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-6\n\t.byte\tW01\n\t.byte\t\t        c_v-3\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\t\t        c_v+3\n\t.byte\tW01\n\t.byte\t\t        c_v+5\n\t.byte\tW01\n\t.byte\t\t        c_v+9\n\t.byte\tW02\n\t.byte\t\t        c_v+5\n\t.byte\tW02\n\t.byte\t\t        c_v+1\n\t.byte\t\tVOL   , 95*se_m_psybeam_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-3\n\t.byte\t\tVOL   , 83*se_m_psybeam_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\tW01\n\t.byte\t\t        c_v-10\n\t.byte\t\tVOL   , 71*se_m_psybeam_mvl/mxv\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 56*se_m_psybeam_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-3\n\t.byte\tW01\n\t.byte\t\tVOL   , 38*se_m_psybeam_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_psybeam_2:\n\t.byte\tKEYSH , se_m_psybeam_key+0\n\t.byte\t\tVOICE , 47\n\t.byte\t\tBENDR , 8\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 38*se_m_psybeam_mvl/mxv\n\t.byte\t\tMOD   , 30\n\t.byte\t\tBEND  , c_v+1\n\t.byte\t\tN42   , As1 , v040\n\t.byte\tW02\n\t.byte\t\tVOL   , 57*se_m_psybeam_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        71*se_m_psybeam_mvl/mxv\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        82*se_m_psybeam_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        94*se_m_psybeam_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        110*se_m_psybeam_mvl/mxv\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\t        95*se_m_psybeam_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        83*se_m_psybeam_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        71*se_m_psybeam_mvl/mxv\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        56*se_m_psybeam_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        38*se_m_psybeam_mvl/mxv\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_psybeam:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_psybeam_pri\t@ Priority\n\t.byte\tse_m_psybeam_rev\t@ Reverb.\n\n\t.word\tse_m_psybeam_grp\n\n\t.word\tse_m_psybeam_1\n\t.word\tse_m_psybeam_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_psybeam2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_psybeam2_grp, voicegroup128\n\t.equ\tse_m_psybeam2_pri, 4\n\t.equ\tse_m_psybeam2_rev, reverb_set+50\n\t.equ\tse_m_psybeam2_mvl, 127\n\t.equ\tse_m_psybeam2_key, 0\n\t.equ\tse_m_psybeam2_tbs, 1\n\t.equ\tse_m_psybeam2_exg, 0\n\t.equ\tse_m_psybeam2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_psybeam2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_psybeam2_1:\n\t.byte\tKEYSH , se_m_psybeam2_key+0\n\t.byte\tTEMPO , 190*se_m_psybeam2_tbs/2\n\t.byte\t\tVOICE , 45\n\t.byte\t\tBENDR , 8\n\t.byte\t\tVOL   , 36*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-44\n\t.byte\t\tN12   , Gs2 , v127\n\t.byte\tW01\n\t.byte\t\tVOL   , 52*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tVOL   , 67*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+17\n\t.byte\tW01\n\t.byte\t\tVOL   , 78*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+27\n\t.byte\tW01\n\t.byte\t\tVOL   , 105*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+44\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+63\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+44\n\t.byte\tW01\n\t.byte\t\tVOL   , 86*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+28\n\t.byte\tW01\n\t.byte\t\tVOL   , 55*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+17\n\t.byte\tW01\n\t.byte\t\tVOL   , 33*se_m_psybeam2_mvl/mxv\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW02\n\t.byte\t\tVOICE , 37\n\t.byte\t\tVOL   , 105*se_m_psybeam2_mvl/mxv\n\t.byte\t\tN02   , Gs3 , v080\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\tVOICE , 45\n\t.byte\t\tVOL   , 36*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-44\n\t.byte\t\tN12   , As2 , v127\n\t.byte\tW01\n\t.byte\t\tVOL   , 52*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tVOL   , 67*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+17\n\t.byte\tW02\n\t.byte\t\tVOL   , 78*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+27\n\t.byte\tW01\n\t.byte\t\tVOL   , 105*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tBEND  , c_v+44\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-11\n\t.byte\t\tBEND  , c_v+63\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+44\n\t.byte\tW01\n\t.byte\t\tVOL   , 86*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tBEND  , c_v+28\n\t.byte\tW02\n\t.byte\t\tVOL   , 55*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-11\n\t.byte\t\tBEND  , c_v+17\n\t.byte\tW01\n\t.byte\t\tVOL   , 33*se_m_psybeam2_mvl/mxv\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW01\n\t.byte\t\tVOICE , 37\n\t.byte\t\tVOL   , 105*se_m_psybeam2_mvl/mxv\n\t.byte\t\tN02   , As3 , v056\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\tVOICE , 45\n\t.byte\t\tVOL   , 36*se_m_psybeam2_mvl/mxv\n\t.byte\t\tBEND  , c_v-44\n\t.byte\t\tN12   , Gs2 , v080\n\t.byte\tW02\n\t.byte\t\tVOL   , 52*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tVOL   , 67*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+17\n\t.byte\tW01\n\t.byte\t\tVOL   , 78*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+27\n\t.byte\tW01\n\t.byte\t\tVOL   , 105*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+44\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+63\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+44\n\t.byte\tW01\n\t.byte\t\tVOL   , 86*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+28\n\t.byte\tW01\n\t.byte\t\tVOL   , 55*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+17\n\t.byte\tW01\n\t.byte\t\tVOL   , 33*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW01\n\t.byte\t\tVOICE , 37\n\t.byte\t\tVOL   , 105*se_m_psybeam2_mvl/mxv\n\t.byte\t\tN02   , Gs3 , v024\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\tVOICE , 45\n\t.byte\t\tVOL   , 36*se_m_psybeam2_mvl/mxv\n\t.byte\t\tBEND  , c_v-44\n\t.byte\t\tN12   , As2 , v040\n\t.byte\tW01\n\t.byte\t\tVOL   , 52*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tVOL   , 67*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+17\n\t.byte\tW01\n\t.byte\t\tVOL   , 78*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+27\n\t.byte\tW02\n\t.byte\t\tVOL   , 105*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+44\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tBEND  , c_v+63\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-11\n\t.byte\t\tBEND  , c_v+44\n\t.byte\tW01\n\t.byte\t\tVOL   , 86*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+28\n\t.byte\tW01\n\t.byte\t\tVOL   , 55*se_m_psybeam2_mvl/mxv\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tBEND  , c_v+17\n\t.byte\tW02\n\t.byte\t\tVOL   , 33*se_m_psybeam2_mvl/mxv\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW01\n\t.byte\t\tVOICE , 37\n\t.byte\t\tVOL   , 105*se_m_psybeam2_mvl/mxv\n\t.byte\t\tN02   , As3 , v016\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW04\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_psybeam2:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_psybeam2_pri\t@ Priority\n\t.byte\tse_m_psybeam2_rev\t@ Reverb.\n\n\t.word\tse_m_psybeam2_grp\n\n\t.word\tse_m_psybeam2_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_rain_dance.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_rain_dance_grp, voicegroup128\n\t.equ\tse_m_rain_dance_pri, 4\n\t.equ\tse_m_rain_dance_rev, reverb_set+50\n\t.equ\tse_m_rain_dance_mvl, 127\n\t.equ\tse_m_rain_dance_key, 0\n\t.equ\tse_m_rain_dance_tbs, 1\n\t.equ\tse_m_rain_dance_exg, 0\n\t.equ\tse_m_rain_dance_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_rain_dance\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_rain_dance_1:\n\t.byte\tKEYSH , se_m_rain_dance_key+0\n\t.byte\tTEMPO , 220*se_m_rain_dance_tbs/2\n\t.byte\t\tVOICE , 36\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 20*se_m_rain_dance_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tTIE   , Gn3 , v064\n\t.byte\tW03\n\t.byte\t\tVOL   , 37*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        53*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        60*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        71*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        81*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        93*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        110*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+3\n\t.byte\tW06\n\t.byte\t\t        c_v+11\n\t.byte\tW12\n\t.byte\t\t        c_v+20\n\t.byte\tW06\n\t.byte\t\t        c_v+25\n\t.byte\tW12\n\t.byte\t\t        c_v+14\n\t.byte\tW06\n\t.byte\t\t        c_v+8\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\t        c_v-3\n\t.byte\tW12\n\t.byte\t\t        c_v-16\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\t        c_v-26\n\t.byte\tW12\n\t.byte\t\t        c_v-16\n\t.byte\tW06\n\t.byte\t\tVOL   , 104*se_m_rain_dance_mvl/mxv\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW03\n\t.byte\t\tVOL   , 101*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        98*se_m_rain_dance_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW03\n\t.byte\t\tVOL   , 93*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        90*se_m_rain_dance_mvl/mxv\n\t.byte\t\tPAN   , c_v+14\n\t.byte\tW03\n\t.byte\t\tVOL   , 86*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        83*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        77*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        73*se_m_rain_dance_mvl/mxv\n\t.byte\t\tPAN   , c_v+24\n\t.byte\tW03\n\t.byte\t\tVOL   , 66*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        58*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        44*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        32*se_m_rain_dance_mvl/mxv\n\t.byte\t\tPAN   , c_v+15\n\t.byte\tW03\n\t.byte\t\tVOL   , 16*se_m_rain_dance_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        1*se_m_rain_dance_mvl/mxv\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW06\n\t.byte\t\tEOT\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_rain_dance:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_rain_dance_pri\t@ Priority\n\t.byte\tse_m_rain_dance_rev\t@ Reverb.\n\n\t.word\tse_m_rain_dance_grp\n\n\t.word\tse_m_rain_dance_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_reflect.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_reflect_grp, voicegroup128\n\t.equ\tse_m_reflect_pri, 4\n\t.equ\tse_m_reflect_rev, reverb_set+50\n\t.equ\tse_m_reflect_mvl, 127\n\t.equ\tse_m_reflect_key, 0\n\t.equ\tse_m_reflect_tbs, 1\n\t.equ\tse_m_reflect_exg, 0\n\t.equ\tse_m_reflect_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_reflect\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_reflect_1:\n\t.byte\tKEYSH , se_m_reflect_key+0\n\t.byte\tTEMPO , 150*se_m_reflect_tbs/2\n\t.byte\t\tVOICE , 19\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 90*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v+6\n\t.byte\t\tN06   , Gn6 , v080\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-14\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 60*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-31\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 20*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-41\n\t.byte\tW02\n\t.byte\t\tVOL   , 90*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , Gn6 , v072\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 60*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-37\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 20*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-47\n\t.byte\tW02\n\t.byte\t\tVOL   , 90*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-1\n\t.byte\t\tN06   , Gn6 , v068\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-21\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 60*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-38\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 20*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-48\n\t.byte\tW02\n\t.byte\t\tVOL   , 90*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-1\n\t.byte\t\tN06   , Gn6 , v060\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-21\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 60*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-38\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 20*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-48\n\t.byte\tW02\n\t.byte\t\tVOL   , 90*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-2\n\t.byte\t\tN06   , Gn6 , v052\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tVOL   , 60*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-39\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tVOL   , 20*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-49\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 90*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-2\n\t.byte\t\tN06   , Gn6 , v048\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tVOL   , 60*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-39\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tVOL   , 20*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-49\n\t.byte\tW02\n\t.byte\t\tVOL   , 90*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-2\n\t.byte\t\tN06   , Gn6 , v040\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tVOL   , 60*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-39\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tVOL   , 20*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-49\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 90*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-2\n\t.byte\t\tN06   , Gn6 , v032\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tVOL   , 60*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-39\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tVOL   , 20*se_m_reflect_mvl/mxv\n\t.byte\t\tBEND  , c_v-49\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_reflect_2:\n\t.byte\tKEYSH , se_m_reflect_key+0\n\t.byte\t\tVOICE , 53\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 90*se_m_reflect_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tN06   , En6 , v064\n\t.byte\tW02\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        60*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        20*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        90*se_m_reflect_mvl/mxv\n\t.byte\t\tN06   , En6 , v056\n\t.byte\tW02\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\tW02\nse_m_reflect_2_000:\n\t.byte\t\tVOL   , 60*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        20*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        90*se_m_reflect_mvl/mxv\n\t.byte\t\tN06   , En6 , v052\n\t.byte\tW02\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\tW02\n\t.byte\tPEND\n\t.byte\tPATT\n\t .word\tse_m_reflect_2_000\n\t.byte\t\tVOL   , 60*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        20*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        90*se_m_reflect_mvl/mxv\n\t.byte\t\tN06   , En6 , v048\n\t.byte\tW02\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        60*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        20*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        90*se_m_reflect_mvl/mxv\n\t.byte\t\tN06   , En6 , v044\n\t.byte\tW02\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        60*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        20*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        90*se_m_reflect_mvl/mxv\n\t.byte\t\tN06   , En6 , v040\n\t.byte\tW02\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        60*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        20*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        90*se_m_reflect_mvl/mxv\n\t.byte\t\tN06   , En6 , v036\n\t.byte\tW02\n\t.byte\t\tVOL   , 74*se_m_reflect_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        60*se_m_reflect_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        20*se_m_reflect_mvl/mxv\n\t.byte\tW05\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_reflect:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_reflect_pri\t@ Priority\n\t.byte\tse_m_reflect_rev\t@ Reverb.\n\n\t.word\tse_m_reflect_grp\n\n\t.word\tse_m_reflect_1\n\t.word\tse_m_reflect_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_reversal.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_reversal_grp, voicegroup128\n\t.equ\tse_m_reversal_pri, 4\n\t.equ\tse_m_reversal_rev, reverb_set+50\n\t.equ\tse_m_reversal_mvl, 127\n\t.equ\tse_m_reversal_key, 0\n\t.equ\tse_m_reversal_tbs, 1\n\t.equ\tse_m_reversal_exg, 0\n\t.equ\tse_m_reversal_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_reversal\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_reversal_1:\n\t.byte\tKEYSH , se_m_reversal_key+0\n\t.byte\tTEMPO , 150*se_m_reversal_tbs/2\n\t.byte\t\tVOICE , 19\n\t.byte\t\tBENDR , 24\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tN03   , Cn5 , v092\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_reversal_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        40*se_m_reversal_mvl/mxv\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Gn4 , v127\n\t.byte\tW01\n\t.byte\t\tVOICE , 19\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tBEND  , c_v-33\n\t.byte\t\tN03   , Cs5 , v092\n\t.byte\tW02\n\t.byte\t\tVOL   , 72*se_m_reversal_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        40*se_m_reversal_mvl/mxv\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Gs4 , v127\n\t.byte\tW01\n\t.byte\t\tVOICE , 19\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-33\n\t.byte\t\tN03   , Dn5 , v092\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_reversal_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        40*se_m_reversal_mvl/mxv\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v-14\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , An4 , v127\n\t.byte\tW01\n\t.byte\t\tVOICE , 19\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tBEND  , c_v-33\n\t.byte\t\tN03   , Ds5 , v092\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_reversal_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        40*se_m_reversal_mvl/mxv\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW02\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v+14\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , As4 , v127\n\t.byte\tW01\n\t.byte\t\tVOICE , 19\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-33\n\t.byte\t\tN03   , En5 , v092\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_reversal_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        40*se_m_reversal_mvl/mxv\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v-18\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Bn4 , v127\n\t.byte\tW02\n\t.byte\t\tVOICE , 19\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tBEND  , c_v-33\n\t.byte\t\tN03   , Fn5 , v092\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_reversal_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        40*se_m_reversal_mvl/mxv\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v+18\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Cn5 , v127\n\t.byte\tW01\n\t.byte\t\tVOICE , 19\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-33\n\t.byte\t\tN03   , Fs5 , v092\n\t.byte\tW02\n\t.byte\t\tVOL   , 72*se_m_reversal_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        40*se_m_reversal_mvl/mxv\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v-14\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Cs5 , v127\n\t.byte\tW01\n\t.byte\t\tVOICE , 19\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tBEND  , c_v-33\n\t.byte\t\tN03   , Gn5 , v092\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_reversal_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        40*se_m_reversal_mvl/mxv\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v+14\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Dn5 , v127\n\t.byte\tW01\n\t.byte\t\tVOICE , 19\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-33\n\t.byte\t\tN03   , Gs5 , v092\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_reversal_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        40*se_m_reversal_mvl/mxv\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW02\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Ds5 , v127\n\t.byte\tW01\n\t.byte\t\tVOICE , 19\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tBEND  , c_v-33\n\t.byte\t\tN03   , An5 , v092\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_reversal_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        40*se_m_reversal_mvl/mxv\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , En5 , v127\n\t.byte\tW02\n\t.byte\t\tVOICE , 19\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-33\n\t.byte\t\tN03   , As5 , v092\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_reversal_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        40*se_m_reversal_mvl/mxv\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Fn5 , v127\n\t.byte\tW01\n\t.byte\t\tVOICE , 19\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tBEND  , c_v-33\n\t.byte\t\tN03   , Bn5 , v092\n\t.byte\tW02\n\t.byte\t\tVOL   , 72*se_m_reversal_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        40*se_m_reversal_mvl/mxv\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Fs5 , v127\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-33\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_reversal_2:\n\t.byte\tKEYSH , se_m_reversal_key+0\n\t.byte\t\tVOICE , 17\n\t.byte\t\tVOL   , 100*se_m_reversal_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+31\n\t.byte\t\tN03   , Cn5 , v040\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-33\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        c_v+31\n\t.byte\t\tN03   , Cs5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-33\n\t.byte\tW03\n\t.byte\t\t        c_v+31\n\t.byte\t\tN03   , Dn5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-33\n\t.byte\tW02\n\t.byte\t\t        c_v+31\n\t.byte\t\tN03   , Ds5\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-33\n\t.byte\tW02\n\t.byte\t\t        c_v+31\n\t.byte\t\tN03   , En5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW02\n\t.byte\t\t        c_v-33\n\t.byte\tW02\n\t.byte\t\t        c_v+31\n\t.byte\t\tN03   , Fn5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-33\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        c_v+31\n\t.byte\t\tN03   , Fs5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-33\n\t.byte\tW03\n\t.byte\t\t        c_v+31\n\t.byte\t\tN03   , Gn5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-33\n\t.byte\tW02\n\t.byte\t\t        c_v+31\n\t.byte\t\tN03   , Gs5\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-33\n\t.byte\tW02\n\t.byte\t\t        c_v+31\n\t.byte\t\tN03   , An5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW02\n\t.byte\t\t        c_v-33\n\t.byte\tW02\n\t.byte\t\t        c_v+31\n\t.byte\t\tN03   , As5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-33\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        c_v+31\n\t.byte\t\tN03   , Bn5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-33\n\t.byte\tW03\n\t.byte\t\t        c_v+31\n\t.byte\t\tN03   , Bn5 , v020\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-33\n\t.byte\tW04\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_reversal:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_reversal_pri\t@ Priority\n\t.byte\tse_m_reversal_rev\t@ Reverb.\n\n\t.word\tse_m_reversal_grp\n\n\t.word\tse_m_reversal_1\n\t.word\tse_m_reversal_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_rock_throw.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_rock_throw_grp, voicegroup128\n\t.equ\tse_m_rock_throw_pri, 4\n\t.equ\tse_m_rock_throw_rev, reverb_set+50\n\t.equ\tse_m_rock_throw_mvl, 127\n\t.equ\tse_m_rock_throw_key, 0\n\t.equ\tse_m_rock_throw_tbs, 1\n\t.equ\tse_m_rock_throw_exg, 0\n\t.equ\tse_m_rock_throw_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_rock_throw\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_rock_throw_1:\n\t.byte\tKEYSH , se_m_rock_throw_key+0\n\t.byte\tTEMPO , 150*se_m_rock_throw_tbs/2\n\t.byte\t\tVOICE , 26\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 105*se_m_rock_throw_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , En3 , v127\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v-34\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+7\n\t.byte\t\tN03   , Gn3 , v100\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-15\n\t.byte\t\tBEND  , c_v+4\n\t.byte\t\tN06   , En3 , v127\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , Cn3 , v084\n\t.byte\tW06\n\t.byte\t\tBEND  , c_v-20\n\t.byte\t\tN06   , En3 , v068\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-41\n\t.byte\tW24\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_rock_throw:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_rock_throw_pri\t@ Priority\n\t.byte\tse_m_rock_throw_rev\t@ Reverb.\n\n\t.word\tse_m_rock_throw_grp\n\n\t.word\tse_m_rock_throw_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_sacred_fire.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_sacred_fire_grp, voicegroup128\n\t.equ\tse_m_sacred_fire_pri, 4\n\t.equ\tse_m_sacred_fire_rev, reverb_set+50\n\t.equ\tse_m_sacred_fire_mvl, 127\n\t.equ\tse_m_sacred_fire_key, 0\n\t.equ\tse_m_sacred_fire_tbs, 1\n\t.equ\tse_m_sacred_fire_exg, 0\n\t.equ\tse_m_sacred_fire_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_sacred_fire\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_sacred_fire_1:\n\t.byte\tKEYSH , se_m_sacred_fire_key+0\n\t.byte\tTEMPO , 150*se_m_sacred_fire_tbs/2\n\t.byte\t\tVOICE , 29\n\t.byte\t\tBENDR , 12\n\t.byte\t\tVOL   , 110*se_m_sacred_fire_mvl/mxv\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN04   , Cn3 , v127\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tN18   , Gn4\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW01\n\t.byte\t\tVOL   , 98*se_m_sacred_fire_mvl/mxv\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 83*se_m_sacred_fire_mvl/mxv\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW01\n\t.byte\t\tVOL   , 63*se_m_sacred_fire_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+13\n\t.byte\tW02\n\t.byte\t\tVOL   , 44*se_m_sacred_fire_mvl/mxv\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW02\n\t.byte\t\tVOL   , 28*se_m_sacred_fire_mvl/mxv\n\t.byte\t\tBEND  , c_v+20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW01\n\t.byte\t\tVOL   , 12*se_m_sacred_fire_mvl/mxv\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_sacred_fire_2:\n\t.byte\tKEYSH , se_m_sacred_fire_key+0\n\t.byte\t\tVOICE , 27\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_sacred_fire_mvl/mxv\n\t.byte\t\tN01   , Gn2 , v032\n\t.byte\tW02\n\t.byte\t\tN01\n\t.byte\tW02\n\t.byte\t\tN18\n\t.byte\tW03\n\t.byte\t\tVOL   , 98*se_m_sacred_fire_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        83*se_m_sacred_fire_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        63*se_m_sacred_fire_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        44*se_m_sacred_fire_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        28*se_m_sacred_fire_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        12*se_m_sacred_fire_mvl/mxv\n\t.byte\tW02\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_sacred_fire:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_sacred_fire_pri\t@ Priority\n\t.byte\tse_m_sacred_fire_rev\t@ Reverb.\n\n\t.word\tse_m_sacred_fire_grp\n\n\t.word\tse_m_sacred_fire_1\n\t.word\tse_m_sacred_fire_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_sacred_fire2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_sacred_fire2_grp, voicegroup128\n\t.equ\tse_m_sacred_fire2_pri, 4\n\t.equ\tse_m_sacred_fire2_rev, reverb_set+50\n\t.equ\tse_m_sacred_fire2_mvl, 127\n\t.equ\tse_m_sacred_fire2_key, 0\n\t.equ\tse_m_sacred_fire2_tbs, 1\n\t.equ\tse_m_sacred_fire2_exg, 0\n\t.equ\tse_m_sacred_fire2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_sacred_fire2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_sacred_fire2_1:\n\t.byte\tKEYSH , se_m_sacred_fire2_key+0\n\t.byte\tTEMPO , 150*se_m_sacred_fire2_tbs/2\n\t.byte\t\tVOICE , 29\n\t.byte\t\tBENDR , 12\n\t.byte\t\tVOL   , 22*se_m_sacred_fire2_mvl/mxv\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN96   , Gn3 , v127\n\t.byte\tW01\n\t.byte\t\tVOL   , 49*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        71*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 95*se_m_sacred_fire2_mvl/mxv\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW01\n\t.byte\t\tVOL   , 110*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW03\n\t.byte\t\tVOL   , 97*se_m_sacred_fire2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 84*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-9\n\t.byte\tW03\n\t.byte\t\tVOL   , 76*se_m_sacred_fire2_mvl/mxv\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tBEND  , c_v-24\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-2\n\t.byte\t\tBEND  , c_v-46\n\t.byte\tW03\n\t.byte\t\tVOL   , 84*se_m_sacred_fire2_mvl/mxv\n\t.byte\t\tPAN   , c_v+5\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 92*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-32\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 86*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+5\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-18\n\t.byte\tW01\n\t.byte\t\tVOL   , 78*se_m_sacred_fire2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v-5\n\t.byte\tW02\n\t.byte\t\tVOL   , 71*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW03\n\t.byte\t\t        c_v+5\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\t\tVOL   , 78*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW02\n\t.byte\t\tVOL   , 86*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v+5\n\t.byte\tW02\n\t.byte\t\tVOL   , 90*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v-5\n\t.byte\tW03\n\t.byte\t\t        c_v-2\n\t.byte\tW01\n\t.byte\t\tVOL   , 80*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+5\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 86*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\t\tVOL   , 83*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 63*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        37*se_m_sacred_fire2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v-5\n\t.byte\t\tVOL   , 13*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW03\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_sacred_fire2_2:\n\t.byte\tKEYSH , se_m_sacred_fire2_key+0\n\t.byte\t\tVOICE , 27\n\t.byte\t\tVOL   , 22*se_m_sacred_fire2_mvl/mxv\n\t.byte\t\tN96   , Gn2 , v032\n\t.byte\tW01\n\t.byte\t\tVOL   , 49*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        71*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        95*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        110*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW05\n\t.byte\t\t        97*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW15\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tW09\n\t.byte\t\t        83*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        63*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        37*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        13*se_m_sacred_fire2_mvl/mxv\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_sacred_fire2:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_sacred_fire2_pri\t@ Priority\n\t.byte\tse_m_sacred_fire2_rev\t@ Reverb.\n\n\t.word\tse_m_sacred_fire2_grp\n\n\t.word\tse_m_sacred_fire2_1\n\t.word\tse_m_sacred_fire2_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_sand_tomb.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_sand_tomb_grp, voicegroup128\n\t.equ\tse_m_sand_tomb_pri, 4\n\t.equ\tse_m_sand_tomb_rev, reverb_set+50\n\t.equ\tse_m_sand_tomb_mvl, 127\n\t.equ\tse_m_sand_tomb_key, 0\n\t.equ\tse_m_sand_tomb_tbs, 1\n\t.equ\tse_m_sand_tomb_exg, 0\n\t.equ\tse_m_sand_tomb_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_sand_tomb\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_sand_tomb_1:\n\t.byte\tKEYSH , se_m_sand_tomb_key+0\n\t.byte\tTEMPO , 150*se_m_sand_tomb_tbs/2\n\t.byte\t\tVOICE , 22\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 64*se_m_sand_tomb_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN96   , En2 , v127\n\t.byte\tW03\n\t.byte\t\tVOL   , 79*se_m_sand_tomb_mvl/mxv\n\t.byte\t\tBEND  , c_v+22\n\t.byte\tW02\n\t.byte\t\t        c_v+8\n\t.byte\tW01\n\t.byte\t\tVOL   , 84*se_m_sand_tomb_mvl/mxv\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW03\n\t.byte\t\tVOL   , 91*se_m_sand_tomb_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\tVOL   , 100*se_m_sand_tomb_mvl/mxv\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW03\n\t.byte\t\tVOL   , 110*se_m_sand_tomb_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-12\n\t.byte\tW06\n\t.byte\t\t        c_v-17\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v-7\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-9\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW03\n\t.byte\t\t        c_v-20\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-3\n\t.byte\tW03\n\t.byte\t\t        c_v+6\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+10\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+16\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+13\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW03\n\t.byte\t\t        c_v+20\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+8\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-11\n\t.byte\tW03\n\t.byte\t\t        c_v-17\n\t.byte\t\tVOL   , 98*se_m_sand_tomb_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\tVOL   , 90*se_m_sand_tomb_mvl/mxv\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-9\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW01\n\t.byte\t\tVOL   , 80*se_m_sand_tomb_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tVOL   , 71*se_m_sand_tomb_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-3\n\t.byte\tW02\n\t.byte\t\tVOL   , 58*se_m_sand_tomb_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tVOL   , 45*se_m_sand_tomb_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        27*se_m_sand_tomb_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW01\n\t.byte\t\tVOL   , 11*se_m_sand_tomb_mvl/mxv\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_sand_tomb_2:\n\t.byte\tKEYSH , se_m_sand_tomb_key+0\n\t.byte\t\tVOICE , 57\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_sand_tomb_mvl/mxv\n\t.byte\t\tN03   , Cn3 , v100\n\t.byte\tW03\n\t.byte\t\t        En3 , v080\n\t.byte\tW04\n\t.byte\t\t        Dn3\n\t.byte\tW03\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW04\n\t.byte\t\t        En3 , v080\n\t.byte\tW04\n\t.byte\t\t        Dn3\n\t.byte\tW03\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\t        En3 , v080\n\t.byte\tW03\n\t.byte\t\t        Dn3\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW04\n\t.byte\t\t        En3 , v080\n\t.byte\tW03\n\t.byte\t\t        Dn3\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW03\n\t.byte\t\t        En3 , v080\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\t        Dn3\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW03\n\t.byte\t\t        En3 , v080\n\t.byte\tW04\n\t.byte\t\t        Dn3\n\t.byte\tW03\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW04\n\t.byte\t\t        En3 , v080\n\t.byte\tW04\n\t.byte\t\t        Dn3\n\t.byte\tW03\n\t.byte\t\t        Cn3 , v092\n\t.byte\tW04\n\t.byte\t\t        En3 , v060\n\t.byte\tW03\n\t.byte\t\t        Dn3 , v052\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v060\n\t.byte\tW04\n\t.byte\t\t        En3 , v032\n\t.byte\tW03\n\t.byte\t\tN02   , Dn3 , v020\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_sand_tomb:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_sand_tomb_pri\t@ Priority\n\t.byte\tse_m_sand_tomb_rev\t@ Reverb.\n\n\t.word\tse_m_sand_tomb_grp\n\n\t.word\tse_m_sand_tomb_1\n\t.word\tse_m_sand_tomb_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_sandstorm.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_sandstorm_grp, voicegroup128\n\t.equ\tse_m_sandstorm_pri, 4\n\t.equ\tse_m_sandstorm_rev, reverb_set+50\n\t.equ\tse_m_sandstorm_mvl, 127\n\t.equ\tse_m_sandstorm_key, 0\n\t.equ\tse_m_sandstorm_tbs, 1\n\t.equ\tse_m_sandstorm_exg, 0\n\t.equ\tse_m_sandstorm_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_sandstorm\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_sandstorm_1:\n\t.byte\tKEYSH , se_m_sandstorm_key+0\n\t.byte\tTEMPO , 200*se_m_sandstorm_tbs/2\n\t.byte\t\tVOICE , 2\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v-48\n\t.byte\t\tVOL   , 11*se_m_sandstorm_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tTIE   , En3 , v127\n\t.byte\tW03\n\t.byte\t\tVOL   , 17*se_m_sandstorm_mvl/mxv\n\t.byte\t\tBEND  , c_v+22\n\t.byte\tW02\n\t.byte\t\t        c_v+8\n\t.byte\tW01\n\t.byte\t\tVOL   , 24*se_m_sandstorm_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        32*se_m_sandstorm_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\tVOL   , 52*se_m_sandstorm_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        65*se_m_sandstorm_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        76*se_m_sandstorm_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        88*se_m_sandstorm_mvl/mxv\n\t.byte\t\tPAN   , c_v-43\n\t.byte\tW02\n\t.byte\t\tVOL   , 98*se_m_sandstorm_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW02\n\t.byte\t\tVOL   , 111*se_m_sandstorm_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW01\n\t.byte\t\tVOL   , 127*se_m_sandstorm_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-38\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW06\n\t.byte\t\t        c_v-13\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v-31\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        c_v+6\n\t.byte\tW03\n\t.byte\t\t        c_v+11\n\t.byte\tW03\n\t.byte\t\t        c_v+20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-21\n\t.byte\tW05\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW03\n\t.byte\t\t        c_v+7\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v-7\n\t.byte\tW03\n\t.byte\t\t        c_v-12\n\t.byte\tW03\n\t.byte\t\t        c_v-20\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW06\n\t.byte\t\t        c_v-6\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+2\n\t.byte\t\tBEND  , c_v+22\n\t.byte\tW02\n\t.byte\t\t        c_v+8\n\t.byte\tW04\n\t.byte\t\t        c_v+0\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+10\n\t.byte\tW10\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+16\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW03\n\t.byte\t\t        c_v-12\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+24\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW06\n\t.byte\t\t        c_v-13\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+32\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        c_v+6\n\t.byte\tW03\n\t.byte\t\t        c_v+11\n\t.byte\tW03\n\t.byte\t\t        c_v+20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+40\n\t.byte\tW05\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW03\n\t.byte\t\t        c_v+7\n\t.byte\tW04\n\t.byte\t\tVOL   , 114*se_m_sandstorm_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+48\n\t.byte\tW01\n\t.byte\t\tVOL   , 104*se_m_sandstorm_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW03\n\t.byte\t\tVOL   , 93*se_m_sandstorm_mvl/mxv\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW03\n\t.byte\t\tVOL   , 82*se_m_sandstorm_mvl/mxv\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW04\n\t.byte\t\tVOL   , 67*se_m_sandstorm_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW01\n\t.byte\t\tVOL   , 52*se_m_sandstorm_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        32*se_m_sandstorm_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        13*se_m_sandstorm_mvl/mxv\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW03\n\t.byte\t\tEOT\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_sandstorm_2:\n\t.byte\tKEYSH , se_m_sandstorm_key+0\n\t.byte\t\tVOICE , 57\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 60*se_m_sandstorm_mvl/mxv\n\t.byte\t\tN03   , Cn3 , v100\n\t.byte\tW03\n\t.byte\t\t        En3 , v080\n\t.byte\tW04\n\t.byte\t\t        Dn3\n\t.byte\tW03\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW04\n\t.byte\t\t        En3 , v080\n\t.byte\tW04\n\t.byte\t\t        Dn3\n\t.byte\tW03\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW03\nse_m_sandstorm_2_000:\n\t.byte\tW01\n\t.byte\t\tN03   , En3 , v080\n\t.byte\tW03\n\t.byte\t\t        Dn3\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW04\n\t.byte\t\t        En3 , v080\n\t.byte\tW03\n\t.byte\t\t        Dn3\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW03\n\t.byte\t\t        En3 , v080\n\t.byte\tW02\n\t.byte\tPEND\n\t.byte\tW02\n\t.byte\t\t        Dn3\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW03\n\t.byte\t\t        En3 , v080\n\t.byte\tW04\n\t.byte\t\t        Dn3\n\t.byte\tW03\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW04\n\t.byte\t\t        En3 , v080\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW03\n\t.byte\t\t        En3 , v080\n\t.byte\tW04\n\t.byte\t\t        Dn3\n\t.byte\tW03\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW04\n\t.byte\t\t        En3 , v080\n\t.byte\tW04\n\t.byte\t\t        Dn3\n\t.byte\tW03\n\t.byte\t\t        Cn3 , v100\n\t.byte\tW03\n\t.byte\tPATT\n\t .word\tse_m_sandstorm_2_000\n\t.byte\tW02\n\t.byte\t\tN03   , Cn3 , v076\n\t.byte\tW04\n\t.byte\t\t        En3 , v064\n\t.byte\tW03\n\t.byte\t\t        Dn3 , v060\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v076\n\t.byte\tW03\n\t.byte\t\t        En3 , v052\n\t.byte\tW04\n\t.byte\t\t        Dn3 , v048\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v068\n\t.byte\tW03\n\t.byte\t\t        En3 , v044\n\t.byte\tW04\n\t.byte\t\t        Dn3 , v040\n\t.byte\tW03\n\t.byte\t\t        Cn3 , v056\n\t.byte\tW04\n\t.byte\t\t        En3 , v032\n\t.byte\tW04\n\t.byte\t\t        Dn3\n\t.byte\tW03\n\t.byte\t\t        Cn3 , v048\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\t        En3 , v024\n\t.byte\tW03\n\t.byte\t\t        Dn3 , v020\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v036\n\t.byte\tW04\n\t.byte\t\t        En3 , v016\n\t.byte\tW03\n\t.byte\t\t        Dn3 , v012\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v028\n\t.byte\tW05\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_sandstorm:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_sandstorm_pri\t@ Priority\n\t.byte\tse_m_sandstorm_rev\t@ Reverb.\n\n\t.word\tse_m_sandstorm_grp\n\n\t.word\tse_m_sandstorm_1\n\t.word\tse_m_sandstorm_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_screech.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_screech_grp, voicegroup128\n\t.equ\tse_m_screech_pri, 4\n\t.equ\tse_m_screech_rev, reverb_set+50\n\t.equ\tse_m_screech_mvl, 127\n\t.equ\tse_m_screech_key, 0\n\t.equ\tse_m_screech_tbs, 1\n\t.equ\tse_m_screech_exg, 0\n\t.equ\tse_m_screech_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_screech\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_screech_1:\n\t.byte\t\tVOL   , 110*se_m_screech_mvl/mxv\n\t.byte\tKEYSH , se_m_screech_key+0\n\t.byte\tTEMPO , 150*se_m_screech_tbs/2\n\t.byte\t\tVOICE , 44\n\t.byte\t\tBENDR , 2\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN21   , Fs5 , v112\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW01\n\t.byte\t\t        c_v-10\n\t.byte\t\tVOL   , 15*se_m_screech_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tVOL   , 41*se_m_screech_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 69*se_m_screech_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW01\n\t.byte\t\t        c_v+10\n\t.byte\t\tVOL   , 84*se_m_screech_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW01\n\t.byte\t\tVOL   , 97*se_m_screech_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-5\n\t.byte\tW02\n\t.byte\t\tVOL   , 110*se_m_screech_mvl/mxv\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW01\n\t.byte\t\t        c_v-4\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+4\n\t.byte\tW01\n\t.byte\t\t        c_v+10\n\t.byte\tW02\n\t.byte\t\tVOL   , 100*se_m_screech_mvl/mxv\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW01\n\t.byte\t\tVOL   , 84*se_m_screech_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 55*se_m_screech_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_screech_2:\n\t.byte\t\tVOL   , 110*se_m_screech_mvl/mxv\n\t.byte\tKEYSH , se_m_screech_key+0\n\t.byte\t\tVOICE , 42\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN21   , Fn6 , v064\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW02\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_screech:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_screech_pri\t@ Priority\n\t.byte\tse_m_screech_rev\t@ Reverb.\n\n\t.word\tse_m_screech_grp\n\n\t.word\tse_m_screech_1\n\t.word\tse_m_screech_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_self_destruct.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_self_destruct_grp, voicegroup128\n\t.equ\tse_m_self_destruct_pri, 4\n\t.equ\tse_m_self_destruct_rev, reverb_set+50\n\t.equ\tse_m_self_destruct_mvl, 127\n\t.equ\tse_m_self_destruct_key, 0\n\t.equ\tse_m_self_destruct_tbs, 1\n\t.equ\tse_m_self_destruct_exg, 0\n\t.equ\tse_m_self_destruct_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_self_destruct\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_self_destruct_1:\n\t.byte\tKEYSH , se_m_self_destruct_key+0\n\t.byte\tTEMPO , 150*se_m_self_destruct_tbs/2\n\t.byte\t\tVOICE , 41\n\t.byte\t\tVOL   , 115*se_m_self_destruct_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Gn3 , v127\n\t.byte\tW01\n\t.byte\t\t        Cn3\n\t.byte\tW01\n\t.byte\t\tN24   , An3\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW04\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 102*se_m_self_destruct_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tVOL   , 88*se_m_self_destruct_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        78*se_m_self_destruct_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 67*se_m_self_destruct_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+7\n\t.byte\t\tVOL   , 45*se_m_self_destruct_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\tVOL   , 13*se_m_self_destruct_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-15\n\t.byte\tW22\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_self_destruct:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_self_destruct_pri\t@ Priority\n\t.byte\tse_m_self_destruct_rev\t@ Reverb.\n\n\t.word\tse_m_self_destruct_grp\n\n\t.word\tse_m_self_destruct_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_sing.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_sing_grp, voicegroup128\n\t.equ\tse_m_sing_pri, 4\n\t.equ\tse_m_sing_rev, reverb_set+50\n\t.equ\tse_m_sing_mvl, 127\n\t.equ\tse_m_sing_key, 0\n\t.equ\tse_m_sing_tbs, 1\n\t.equ\tse_m_sing_exg, 0\n\t.equ\tse_m_sing_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_sing\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_sing_1:\n\t.byte\tKEYSH , se_m_sing_key+0\n\t.byte\tTEMPO , 100*se_m_sing_tbs/2\n\t.byte\t\tVOICE , 73\n\t.byte\t\tBENDR , 12\n\t.byte\t\tLFOS  , 40\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 95*se_m_sing_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN44   , Gn4 , v112\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW03\n\t.byte\t\tMOD   , 7\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tVOL   , 83*se_m_sing_mvl/mxv\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        69*se_m_sing_mvl/mxv\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        50*se_m_sing_mvl/mxv\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        24*se_m_sing_mvl/mxv\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tMOD   , 0\n\t.byte\tW03\n\t.byte\t\tVOL   , 95*se_m_sing_mvl/mxv\n\t.byte\t\tN21   , Fn5\n\t.byte\tW06\n\t.byte\tW06\nse_m_sing_1_000:\n\t.byte\t\tVOL   , 86*se_m_sing_mvl/mxv\n\t.byte\t\tMOD   , 7\n\t.byte\tW03\n\t.byte\t\tVOL   , 75*se_m_sing_mvl/mxv\n\t.byte\tW03\n\t.byte\tPEND\nse_m_sing_1_001:\n\t.byte\t\tVOL   , 55*se_m_sing_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        26*se_m_sing_mvl/mxv\n\t.byte\t\tMOD   , 0\n\t.byte\tW03\n\t.byte\tPEND\n\t.byte\t\tVOL   , 95*se_m_sing_mvl/mxv\n\t.byte\t\tN21   , Ds5 , v112\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tPATT\n\t .word\tse_m_sing_1_000\n\t.byte\tPATT\n\t .word\tse_m_sing_1_001\n\t.byte\t\tVOL   , 95*se_m_sing_mvl/mxv\n\t.byte\t\tN66   , Gn4 , v112\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\tMOD   , 7\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\tVOL   , 83*se_m_sing_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        69*se_m_sing_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        50*se_m_sing_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        24*se_m_sing_mvl/mxv\n\t.byte\tW06\n\t.byte\t\tMOD   , 0\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_sing_2:\n\t.byte\tKEYSH , se_m_sing_key+0\n\t.byte\t\tVOICE , 73\n\t.byte\t\tLFOS  , 40\n\t.byte\t\tVOL   , 95*se_m_sing_mvl/mxv\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+12\n\t.byte\t\tN44   , Gn4 , v060\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW03\n\t.byte\t\tMOD   , 7\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tVOL   , 83*se_m_sing_mvl/mxv\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        69*se_m_sing_mvl/mxv\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        50*se_m_sing_mvl/mxv\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        24*se_m_sing_mvl/mxv\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tMOD   , 0\n\t.byte\tW03\n\t.byte\t\tVOL   , 95*se_m_sing_mvl/mxv\n\t.byte\t\tPAN   , c_v-12\n\t.byte\t\tN21   , Fn5\n\t.byte\tW06\n\t.byte\tW06\nse_m_sing_2_000:\n\t.byte\t\tVOL   , 86*se_m_sing_mvl/mxv\n\t.byte\t\tMOD   , 7\n\t.byte\tW03\n\t.byte\t\tVOL   , 75*se_m_sing_mvl/mxv\n\t.byte\tW03\n\t.byte\tPEND\nse_m_sing_2_001:\n\t.byte\t\tVOL   , 55*se_m_sing_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        26*se_m_sing_mvl/mxv\n\t.byte\t\tMOD   , 0\n\t.byte\tW03\n\t.byte\tPEND\n\t.byte\t\tVOL   , 95*se_m_sing_mvl/mxv\n\t.byte\t\tPAN   , c_v+12\n\t.byte\t\tN21   , Ds5 , v060\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tPATT\n\t .word\tse_m_sing_2_000\n\t.byte\tPATT\n\t .word\tse_m_sing_2_001\n\t.byte\t\tVOL   , 95*se_m_sing_mvl/mxv\n\t.byte\t\tPAN   , c_v-12\n\t.byte\t\tN66   , Gn4 , v060\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\tMOD   , 7\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\t\t        c_v+7\n\t.byte\tW06\n\t.byte\t\tVOL   , 83*se_m_sing_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        69*se_m_sing_mvl/mxv\n\t.byte\t\tPAN   , c_v+15\n\t.byte\tW06\n\t.byte\t\tVOL   , 50*se_m_sing_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        24*se_m_sing_mvl/mxv\n\t.byte\t\tPAN   , c_v+8\n\t.byte\tW06\n\t.byte\t\tMOD   , 0\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_sing:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_sing_pri\t@ Priority\n\t.byte\tse_m_sing_rev\t@ Reverb.\n\n\t.word\tse_m_sing_grp\n\n\t.word\tse_m_sing_1\n\t.word\tse_m_sing_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_sketch.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_sketch_grp, voicegroup128\n\t.equ\tse_m_sketch_pri, 4\n\t.equ\tse_m_sketch_rev, reverb_set+50\n\t.equ\tse_m_sketch_mvl, 127\n\t.equ\tse_m_sketch_key, 0\n\t.equ\tse_m_sketch_tbs, 1\n\t.equ\tse_m_sketch_exg, 0\n\t.equ\tse_m_sketch_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_sketch\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_sketch_1:\n\t.byte\tKEYSH , se_m_sketch_key+0\n\t.byte\tTEMPO , 180*se_m_sketch_tbs/2\n\t.byte\t\tVOICE , 38\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_sketch_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Gn4 , v127\n\t.byte\tW01\n\t.byte\t\tVOL   , 74*se_m_sketch_mvl/mxv\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tVOICE , 31\n\t.byte\t\tVOL   , 40*se_m_sketch_mvl/mxv\n\t.byte\t\tBEND  , c_v-1\n\t.byte\t\tN03   , Cs5\n\t.byte\tW01\n\t.byte\t\tVOL   , 64*se_m_sketch_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW01\n\t.byte\t\tVOL   , 86*se_m_sketch_mvl/mxv\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW02\n\t.byte\t\tVOL   , 110*se_m_sketch_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , As5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW01\n\t.byte\t\tVOL   , 0*se_m_sketch_mvl/mxv\n\t.byte\tW04\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_sketch:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_sketch_pri\t@ Priority\n\t.byte\tse_m_sketch_rev\t@ Reverb.\n\n\t.word\tse_m_sketch_grp\n\n\t.word\tse_m_sketch_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_sky_uppercut.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_sky_uppercut_grp, voicegroup128\n\t.equ\tse_m_sky_uppercut_pri, 4\n\t.equ\tse_m_sky_uppercut_rev, reverb_set+50\n\t.equ\tse_m_sky_uppercut_mvl, 127\n\t.equ\tse_m_sky_uppercut_key, 0\n\t.equ\tse_m_sky_uppercut_tbs, 1\n\t.equ\tse_m_sky_uppercut_exg, 0\n\t.equ\tse_m_sky_uppercut_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_sky_uppercut\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_sky_uppercut_1:\n\t.byte\tKEYSH , se_m_sky_uppercut_key+0\n\t.byte\tTEMPO , 220*se_m_sky_uppercut_tbs/2\n\t.byte\t\tVOICE , 41\n\t.byte\t\tVOL   , 110*se_m_sky_uppercut_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Cn4 , v127\n\t.byte\tW03\n\t.byte\t\tVOL   , 104*se_m_sky_uppercut_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        93*se_m_sky_uppercut_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tN02   , Cn5\n\t.byte\tW03\n\t.byte\t\tVOL   , 110*se_m_sky_uppercut_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tVOICE , 22\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN24   , Cn4 , v060\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW04\n\t.byte\t\t        c_v+1\n\t.byte\tW03\n\t.byte\t\t        c_v+1\n\t.byte\tW01\n\t.byte\t\tVOL   , 105*se_m_sky_uppercut_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 103*se_m_sky_uppercut_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        91*se_m_sky_uppercut_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\tVOL   , 77*se_m_sky_uppercut_mvl/mxv\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW02\n\t.byte\t\tVOL   , 61*se_m_sky_uppercut_mvl/mxv\n\t.byte\t\tBEND  , c_v-2\n\t.byte\tW01\n\t.byte\t\tVOL   , 38*se_m_sky_uppercut_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        15*se_m_sky_uppercut_mvl/mxv\n\t.byte\t\tBEND  , c_v-3\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_sky_uppercut_2:\n\t.byte\tKEYSH , se_m_sky_uppercut_key+0\n\t.byte\t\tVOICE , 4\n\t.byte\t\tVOL   , 110*se_m_sky_uppercut_mvl/mxv\n\t.byte\t\tN02   , Cn3 , v060\n\t.byte\tW03\n\t.byte\t\t        Gn2\n\t.byte\tW03\n\t.byte\t\t        Gs4\n\t.byte\tW04\n\t.byte\t\t        Gs4 , v020\n\t.byte\tW02\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_sky_uppercut:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_sky_uppercut_pri\t@ Priority\n\t.byte\tse_m_sky_uppercut_rev\t@ Reverb.\n\n\t.word\tse_m_sky_uppercut_grp\n\n\t.word\tse_m_sky_uppercut_1\n\t.word\tse_m_sky_uppercut_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_snore.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_snore_grp, voicegroup128\n\t.equ\tse_m_snore_pri, 4\n\t.equ\tse_m_snore_rev, reverb_set+50\n\t.equ\tse_m_snore_mvl, 127\n\t.equ\tse_m_snore_key, 0\n\t.equ\tse_m_snore_tbs, 1\n\t.equ\tse_m_snore_exg, 0\n\t.equ\tse_m_snore_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_snore\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_snore_1:\n\t.byte\tKEYSH , se_m_snore_key+0\n\t.byte\tTEMPO , 220*se_m_snore_tbs/2\n\t.byte\t\tVOICE , 38\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 27*se_m_snore_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN10   , An1 , v127\n\t.byte\tW01\n\t.byte\t\tVOL   , 75*se_m_snore_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        120*se_m_snore_mvl/mxv\n\t.byte\tW04\n\t.byte\tW02\n\t.byte\t\t        75*se_m_snore_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        28*se_m_snore_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tVOICE , 36\n\t.byte\t\tVOL   , 83*se_m_snore_mvl/mxv\n\t.byte\t\tN18   , En2 , v112\n\t.byte\tW02\n\t.byte\t\tVOL   , 87*se_m_snore_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        91*se_m_snore_mvl/mxv\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        97*se_m_snore_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        102*se_m_snore_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        109*se_m_snore_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        113*se_m_snore_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        120*se_m_snore_mvl/mxv\n\t.byte\tW05\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_snore_2:\n\t.byte\t\tVOL   , 120*se_m_snore_mvl/mxv\n\t.byte\tKEYSH , se_m_snore_key+0\n\t.byte\t\tVOICE , 27\n\t.byte\t\tN01   , En2 , v052\n\t.byte\tW02\n\t.byte\t\t        Dn2\n\t.byte\tW02\n\t.byte\t\t        En2\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        Dn2\n\t.byte\tW02\n\t.byte\t\t        En2\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\t        En2 , v064\n\t.byte\tW02\n\t.byte\t\t        Gs2\n\t.byte\tW03\n\t.byte\t\t        Dn3\n\t.byte\tW02\n\t.byte\t\t        En2\n\t.byte\tW02\n\t.byte\t\t        Gs2\n\t.byte\tW02\n\t.byte\tW01\n\t.byte\t\t        Dn3\n\t.byte\tW05\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_snore:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_snore_pri\t@ Priority\n\t.byte\tse_m_snore_rev\t@ Reverb.\n\n\t.word\tse_m_snore_grp\n\n\t.word\tse_m_snore_1\n\t.word\tse_m_snore_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_solar_beam.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_solar_beam_grp, voicegroup128\n\t.equ\tse_m_solar_beam_pri, 4\n\t.equ\tse_m_solar_beam_rev, reverb_set+50\n\t.equ\tse_m_solar_beam_mvl, 127\n\t.equ\tse_m_solar_beam_key, 0\n\t.equ\tse_m_solar_beam_tbs, 1\n\t.equ\tse_m_solar_beam_exg, 0\n\t.equ\tse_m_solar_beam_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_solar_beam\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_solar_beam_1:\n\t.byte\tKEYSH , se_m_solar_beam_key+0\n\t.byte\tTEMPO , 150*se_m_solar_beam_tbs/2\n\t.byte\t\tVOICE , 36\n\t.byte\t\tBENDR , 24\n\t.byte\t\tVOL   , 25*se_m_solar_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+63\n\t.byte\t\tTIE   , Cn4 , v112\n\t.byte\tW04\n\t.byte\t\tVOL   , 40*se_m_solar_beam_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+52\n\t.byte\tW03\n\t.byte\t\tVOL   , 55*se_m_solar_beam_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tBEND  , c_v+41\n\t.byte\tW03\n\t.byte\t\tVOL   , 80*se_m_solar_beam_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tBEND  , c_v+30\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+22\n\t.byte\tW01\n\t.byte\t\tVOL   , 100*se_m_solar_beam_mvl/mxv\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+63\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tBEND  , c_v+52\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+41\n\t.byte\tW04\n\t.byte\t\t        c_v+33\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+25\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+22\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW06\n\t.byte\t\t        c_v-5\n\t.byte\t\tBEND  , c_v+17\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+11\n\t.byte\tW06\n\t.byte\t\t        c_v+4\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW06\n\t.byte\t\t        c_v-4\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-3\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW06\n\t.byte\t\t        c_v-5\n\t.byte\tW04\n\t.byte\t\tBEND  , c_v-5\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW06\n\t.byte\t\t        c_v+4\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+11\n\t.byte\tW06\n\t.byte\t\t        c_v+4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-10\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW06\n\t.byte\t\t        c_v-10\n\t.byte\t\tBEND  , c_v-18\n\t.byte\tW03\n\t.byte\t\tVOL   , 89*se_m_solar_beam_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW02\n\t.byte\t\tVOL   , 74*se_m_solar_beam_mvl/mxv\n\t.byte\t\tBEND  , c_v-25\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW02\n\t.byte\t\tVOL   , 62*se_m_solar_beam_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-32\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW01\n\t.byte\t\tVOL   , 45*se_m_solar_beam_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-40\n\t.byte\tW04\n\t.byte\t\tVOL   , 28*se_m_solar_beam_mvl/mxv\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tBEND  , c_v-49\n\t.byte\tW03\n\t.byte\t\t        c_v-64\n\t.byte\tW01\n\t.byte\t\tVOL   , 10*se_m_solar_beam_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW02\n\t.byte\t\tVOL   , 5*se_m_solar_beam_mvl/mxv\n\t.byte\tW04\n\t.byte\t\tEOT\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_solar_beam:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_solar_beam_pri\t@ Priority\n\t.byte\tse_m_solar_beam_rev\t@ Reverb.\n\n\t.word\tse_m_solar_beam_grp\n\n\t.word\tse_m_solar_beam_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_spit_up.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_spit_up_grp, voicegroup128\n\t.equ\tse_m_spit_up_pri, 4\n\t.equ\tse_m_spit_up_rev, reverb_set+50\n\t.equ\tse_m_spit_up_mvl, 127\n\t.equ\tse_m_spit_up_key, 0\n\t.equ\tse_m_spit_up_tbs, 1\n\t.equ\tse_m_spit_up_exg, 0\n\t.equ\tse_m_spit_up_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_spit_up\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_spit_up_1:\n\t.byte\tKEYSH , se_m_spit_up_key+0\n\t.byte\tTEMPO , 150*se_m_spit_up_tbs/2\n\t.byte\t\tVOICE , 65\n\t.byte\t\tBENDR , 12\n\t.byte\t\tVOL   , 110*se_m_spit_up_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , Gn3 , v112\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v-17\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v-36\n\t.byte\tW01\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , Gn4\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v+15\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v+28\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , Gn4 , v064\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v+15\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v+28\n\t.byte\tW03\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_spit_up_2:\n\t.byte\tKEYSH , se_m_spit_up_key+0\n\t.byte\t\tVOICE , 57\n\t.byte\t\tVOL   , 110*se_m_spit_up_mvl/mxv\n\t.byte\t\tN03   , En3 , v052\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tN03\n\t.byte\tW02\n\t.byte\tW03\n\t.byte\t\t        En3 , v032\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_spit_up:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_spit_up_pri\t@ Priority\n\t.byte\tse_m_spit_up_rev\t@ Reverb.\n\n\t.word\tse_m_spit_up_grp\n\n\t.word\tse_m_spit_up_1\n\t.word\tse_m_spit_up_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_stat_decrease.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_stat_decrease_grp, voicegroup128\n\t.equ\tse_m_stat_decrease_pri, 4\n\t.equ\tse_m_stat_decrease_rev, reverb_set+50\n\t.equ\tse_m_stat_decrease_mvl, 127\n\t.equ\tse_m_stat_decrease_key, 0\n\t.equ\tse_m_stat_decrease_tbs, 1\n\t.equ\tse_m_stat_decrease_exg, 0\n\t.equ\tse_m_stat_decrease_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_stat_decrease\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_stat_decrease_1:\n\t.byte\tKEYSH , se_m_stat_decrease_key+0\n\t.byte\tTEMPO , 170*se_m_stat_decrease_tbs/2\n\t.byte\t\tVOICE , 67\n\t.byte\t\tVOL   , 70*se_m_stat_decrease_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+42\n\t.byte\t\tN02   , Cs6 , v076\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\t        c_v+24\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+16\n\t.byte\t\tN02   , Cs5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+8\n\t.byte\t\tN02   , Fs5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Fs4\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+42\n\t.byte\t\tN02   , Cn6\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\t        c_v+24\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+16\n\t.byte\t\tN02   , Cn5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+8\n\t.byte\t\tN02   , Fn5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Fn4\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+42\n\t.byte\t\tN02   , Bn5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\t        c_v+24\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+16\n\t.byte\t\tN02   , Bn4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+8\n\t.byte\t\tN02   , En5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , En4\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+42\n\t.byte\t\tN02   , As5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\t        c_v+24\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+16\n\t.byte\t\tN02   , As4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+8\n\t.byte\t\tN02   , Ds5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Ds4\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+42\n\t.byte\t\tN02   , An5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\t        c_v+24\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+16\n\t.byte\t\tN02   , An4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+8\n\t.byte\t\tN02   , Cs5 , v056\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-12\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Cs4\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+42\n\t.byte\t\tN02   , An5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\t        c_v+24\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+12\n\t.byte\t\tBEND  , c_v+16\n\t.byte\t\tN02   , An4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+8\n\t.byte\t\tN02   , Cs5 , v032\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Cs4\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+42\n\t.byte\t\tN02   , An5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+31\n\t.byte\tW01\n\t.byte\t\t        c_v+24\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tBEND  , c_v+16\n\t.byte\t\tN02   , An4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_stat_decrease_2:\n\t.byte\tKEYSH , se_m_stat_decrease_key+0\n\t.byte\t\tVOICE , 55\n\t.byte\t\tXCMD  , xIECV , 10\n\t.byte\t\t        xIECL , 8\n\t.byte\t\tVOL   , 70*se_m_stat_decrease_mvl/mxv\n\t.byte\t\tN02   , As3 , v052\n\t.byte\tW03\n\t.byte\t\tN02\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\t        An3\n\t.byte\tW03\n\t.byte\t\tN02\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\t        Gs3\n\t.byte\tW04\n\t.byte\t\tN02\n\t.byte\tW03\n\t.byte\t\t        Gn3\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tN02\n\t.byte\tW03\n\t.byte\t\t        Fs3\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\tN02\n\t.byte\tW04\n\t.byte\t\t        Fn3\n\t.byte\tW03\n\t.byte\t\tN02\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\t        En3\n\t.byte\tW03\n\t.byte\t\tN02\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\t        Ds3\n\t.byte\tW04\n\t.byte\t\t        Ds3 , v032\n\t.byte\tW03\n\t.byte\t\t        Dn3\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tN02\n\t.byte\tW03\n\t.byte\t\t        Cs3 , v020\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\tN02\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v012\n\t.byte\tW03\n\t.byte\t\tN02\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_stat_decrease:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_stat_decrease_pri\t@ Priority\n\t.byte\tse_m_stat_decrease_rev\t@ Reverb.\n\n\t.word\tse_m_stat_decrease_grp\n\n\t.word\tse_m_stat_decrease_1\n\t.word\tse_m_stat_decrease_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_stat_increase.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_stat_increase_grp, voicegroup128\n\t.equ\tse_m_stat_increase_pri, 4\n\t.equ\tse_m_stat_increase_rev, reverb_set+50\n\t.equ\tse_m_stat_increase_mvl, 127\n\t.equ\tse_m_stat_increase_key, 0\n\t.equ\tse_m_stat_increase_tbs, 1\n\t.equ\tse_m_stat_increase_exg, 0\n\t.equ\tse_m_stat_increase_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_stat_increase\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_stat_increase_1:\n\t.byte\tKEYSH , se_m_stat_increase_key+0\n\t.byte\tTEMPO , 170*se_m_stat_increase_tbs/2\n\t.byte\t\tVOICE , 67\n\t.byte\t\tVOL   , 70*se_m_stat_increase_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , An5 , v076\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+5\n\t.byte\t\tN02   , An4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+12\n\t.byte\t\tN02   , Dn5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\t        c_v+23\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+32\n\t.byte\t\tN02   , Dn4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+42\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , As5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+5\n\t.byte\t\tN02   , As4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+12\n\t.byte\t\tN02   , Ds5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\t        c_v+23\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+32\n\t.byte\t\tN02   , Ds4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+42\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Bn5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+5\n\t.byte\t\tN02   , Bn4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+12\n\t.byte\t\tN02   , En5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\t        c_v+23\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+32\n\t.byte\t\tN02   , En4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+42\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Cn6\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+5\n\t.byte\t\tN02   , Cn5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+12\n\t.byte\t\tN02   , Fn5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\t        c_v+23\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+32\n\t.byte\t\tN02   , Fn4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+42\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Cs6\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+5\n\t.byte\t\tN02   , Cs5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+12\n\t.byte\t\tN02   , Fn5 , v056\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\t        c_v+23\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-12\n\t.byte\t\tBEND  , c_v+32\n\t.byte\t\tN02   , Fn4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+42\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Cs6\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+12\n\t.byte\t\tBEND  , c_v+5\n\t.byte\t\tN02   , Cs5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+12\n\t.byte\t\tN02   , Fn5 , v032\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\t        c_v+23\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tBEND  , c_v+32\n\t.byte\t\tN02   , Fn4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+42\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Cs6\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tBEND  , c_v+5\n\t.byte\t\tN02   , Cs5\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_stat_increase_2:\n\t.byte\tKEYSH , se_m_stat_increase_key+0\n\t.byte\t\tVOICE , 55\n\t.byte\t\tXCMD  , xIECV , 10\n\t.byte\t\t        xIECL , 8\n\t.byte\t\tVOL   , 70*se_m_stat_increase_mvl/mxv\n\t.byte\t\tN02   , Cn3 , v052\n\t.byte\tW03\n\t.byte\t\tN02\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\t        Cs3\n\t.byte\tW03\n\t.byte\t\tN02\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\t        Dn3\n\t.byte\tW04\n\t.byte\t\tN02\n\t.byte\tW03\n\t.byte\t\t        Ds3\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tN02\n\t.byte\tW03\n\t.byte\t\t        En3\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\tN02\n\t.byte\tW04\n\t.byte\t\t        Fn3\n\t.byte\tW03\n\t.byte\t\tN02\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\t        Fs3\n\t.byte\tW03\n\t.byte\t\tN02\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\t        Gn3\n\t.byte\tW04\n\t.byte\t\t        Gn3 , v032\n\t.byte\tW03\n\t.byte\t\t        Gs3\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tN02\n\t.byte\tW03\n\t.byte\t\t        An3 , v020\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\tN02\n\t.byte\tW04\n\t.byte\t\t        As3 , v012\n\t.byte\tW03\n\t.byte\t\tN02\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_stat_increase:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_stat_increase_pri\t@ Priority\n\t.byte\tse_m_stat_increase_rev\t@ Reverb.\n\n\t.word\tse_m_stat_increase_grp\n\n\t.word\tse_m_stat_increase_1\n\t.word\tse_m_stat_increase_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_strength.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_strength_grp, voicegroup128\n\t.equ\tse_m_strength_pri, 4\n\t.equ\tse_m_strength_rev, reverb_set+50\n\t.equ\tse_m_strength_mvl, 127\n\t.equ\tse_m_strength_key, 0\n\t.equ\tse_m_strength_tbs, 1\n\t.equ\tse_m_strength_exg, 0\n\t.equ\tse_m_strength_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_strength\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_strength_1:\n\t.byte\tKEYSH , se_m_strength_key+0\n\t.byte\tTEMPO , 150*se_m_strength_tbs/2\n\t.byte\t\tVOICE , 26\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_strength_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , Gn2 , v127\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tN03   , Fs2 , v120\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tN03   , Fn2 , v116\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tN03   , En2 , v112\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-11\n\t.byte\t\tN03   , Ds2 , v108\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , Dn2 , v100\n\t.byte\tW06\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_strength_2:\n\t.byte\tKEYSH , se_m_strength_key+0\n\t.byte\t\tVOICE , 5\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_strength_mvl/mxv\n\t.byte\t\tN02   , Fn2 , v072\n\t.byte\tW02\n\t.byte\t\tN01\n\t.byte\tW01\n\t.byte\t\tN02   , Gn2\n\t.byte\tW03\n\t.byte\t\tN01   , Gs2 , v060\n\t.byte\tW01\n\t.byte\t\tN02   , Cn3 , v040\n\t.byte\tW03\n\t.byte\t\t        Cn3 , v032\n\t.byte\tW04\n\t.byte\t\tN01   , Cn3 , v028\n\t.byte\tW04\n\t.byte\t\t        Cn3 , v020\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_strength:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_strength_pri\t@ Priority\n\t.byte\tse_m_strength_rev\t@ Reverb.\n\n\t.word\tse_m_strength_grp\n\n\t.word\tse_m_strength_1\n\t.word\tse_m_strength_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_string_shot.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_string_shot_grp, voicegroup128\n\t.equ\tse_m_string_shot_pri, 4\n\t.equ\tse_m_string_shot_rev, reverb_set+50\n\t.equ\tse_m_string_shot_mvl, 127\n\t.equ\tse_m_string_shot_key, 0\n\t.equ\tse_m_string_shot_tbs, 1\n\t.equ\tse_m_string_shot_exg, 0\n\t.equ\tse_m_string_shot_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_string_shot\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_string_shot_1:\n\t.byte\tKEYSH , se_m_string_shot_key+0\n\t.byte\tTEMPO , 250*se_m_string_shot_tbs/2\n\t.byte\t\tVOICE , 22\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_string_shot_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN48   , Fn4 , v108\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+15\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+21\n\t.byte\tW02\n\t.byte\t\t        c_v+8\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-1\n\t.byte\tW03\n\t.byte\t\t        c_v-9\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-15\n\t.byte\t\tBEND  , c_v-14\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-9\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW06\n\t.byte\t\tVOL   , 90*se_m_string_shot_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        71*se_m_string_shot_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        58*se_m_string_shot_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        41*se_m_string_shot_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        27*se_m_string_shot_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        7*se_m_string_shot_mvl/mxv\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_string_shot:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_string_shot_pri\t@ Priority\n\t.byte\tse_m_string_shot_rev\t@ Reverb.\n\n\t.word\tse_m_string_shot_grp\n\n\t.word\tse_m_string_shot_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_string_shot2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_string_shot2_grp, voicegroup128\n\t.equ\tse_m_string_shot2_pri, 4\n\t.equ\tse_m_string_shot2_rev, reverb_set+50\n\t.equ\tse_m_string_shot2_mvl, 127\n\t.equ\tse_m_string_shot2_key, 0\n\t.equ\tse_m_string_shot2_tbs, 1\n\t.equ\tse_m_string_shot2_exg, 0\n\t.equ\tse_m_string_shot2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_string_shot2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_string_shot2_1:\n\t.byte\tKEYSH , se_m_string_shot2_key+0\n\t.byte\tTEMPO , 250*se_m_string_shot2_tbs/2\n\t.byte\t\tVOICE , 10\n\t.byte\t\tBENDR , 12\n\t.byte\t\tVOL   , 105*se_m_string_shot2_mvl/mxv\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN09   , En4 , v112\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW03\n\t.byte\t\t        c_v+12\n\t.byte\tW05\n\t.byte\t\t        c_v+8\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tN09   , Gn4\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW03\n\t.byte\t\t        c_v-14\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-11\n\t.byte\t\tN09   , En4\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-5\n\t.byte\tW03\n\t.byte\t\t        c_v+1\n\t.byte\tW05\n\t.byte\t\t        c_v-3\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tN09   , Gn4\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-19\n\t.byte\tW03\n\t.byte\t\t        c_v-25\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-19\n\t.byte\t\tN09   , En4\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW03\n\t.byte\t\t        c_v-6\n\t.byte\tW05\n\t.byte\t\t        c_v-10\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tN09   , Gn4 , v096\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-27\n\t.byte\tW03\n\t.byte\t\t        c_v-32\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-32\n\t.byte\t\tN09   , En4 , v084\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-26\n\t.byte\tW03\n\t.byte\t\t        c_v-19\n\t.byte\tW05\n\t.byte\t\t        c_v-23\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tN09   , Gn4 , v060\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-40\n\t.byte\tW03\n\t.byte\t\t        c_v-45\n\t.byte\tW06\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_string_shot2_2:\n\t.byte\tKEYSH , se_m_string_shot2_key+0\n\t.byte\t\tVOICE , 5\n\t.byte\t\tVOL   , 105*se_m_string_shot2_mvl/mxv\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tN09   , Cn3 , v052\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN09   , Gn2\n\t.byte\tW12\nse_m_string_shot2_2_000:\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tN09   , Cn3 , v052\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tN09   , Gn2\n\t.byte\tW12\n\t.byte\tPEND\n\t.byte\tPATT\n\t .word\tse_m_string_shot2_2_000\n\t.byte\tPATT\n\t .word\tse_m_string_shot2_2_000\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_string_shot2:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_string_shot2_pri\t@ Priority\n\t.byte\tse_m_string_shot2_rev\t@ Reverb.\n\n\t.word\tse_m_string_shot2_grp\n\n\t.word\tse_m_string_shot2_1\n\t.word\tse_m_string_shot2_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_supersonic.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_supersonic_grp, voicegroup128\n\t.equ\tse_m_supersonic_pri, 4\n\t.equ\tse_m_supersonic_rev, reverb_set+50\n\t.equ\tse_m_supersonic_mvl, 127\n\t.equ\tse_m_supersonic_key, 0\n\t.equ\tse_m_supersonic_tbs, 1\n\t.equ\tse_m_supersonic_exg, 0\n\t.equ\tse_m_supersonic_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_supersonic\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_supersonic_1:\n\t.byte\tKEYSH , se_m_supersonic_key+0\n\t.byte\tTEMPO , 150*se_m_supersonic_tbs/2\n\t.byte\t\tVOICE , 43\n\t.byte\t\tBENDR , 2\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 61*se_m_supersonic_mvl/mxv\n\t.byte\t\tBEND  , c_v-4\n\t.byte\t\tN07   , Gs4 , v127\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tVOL   , 75*se_m_supersonic_mvl/mxv\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tVOL   , 93*se_m_supersonic_mvl/mxv\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tVOL   , 110*se_m_supersonic_mvl/mxv\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-12\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\tVOL   , 0*se_m_supersonic_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-4\n\t.byte\t\tN32\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tVOL   , 36*se_m_supersonic_mvl/mxv\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tVOL   , 67*se_m_supersonic_mvl/mxv\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-13\n\t.byte\t\tVOL   , 84*se_m_supersonic_mvl/mxv\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 92*se_m_supersonic_mvl/mxv\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tVOL   , 99*se_m_supersonic_mvl/mxv\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW01\n\t.byte\t\tVOL   , 105*se_m_supersonic_mvl/mxv\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW01\n\t.byte\t\tVOL   , 110*se_m_supersonic_mvl/mxv\n\t.byte\t\tPAN   , c_v-13\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW02\n\t.byte\t\tVOL   , 46*se_m_supersonic_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW01\n\t.byte\t\tVOL   , 67*se_m_supersonic_mvl/mxv\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW01\n\t.byte\t\tVOL   , 84*se_m_supersonic_mvl/mxv\n\t.byte\t\tPAN   , c_v-13\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW02\n\t.byte\t\tVOL   , 100*se_m_supersonic_mvl/mxv\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\tVOL   , 110*se_m_supersonic_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW01\n\t.byte\t\tVOL   , 101*se_m_supersonic_mvl/mxv\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW02\n\t.byte\t\tVOL   , 85*se_m_supersonic_mvl/mxv\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW01\n\t.byte\t\tVOL   , 75*se_m_supersonic_mvl/mxv\n\t.byte\t\tPAN   , c_v-13\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW01\n\t.byte\t\tVOL   , 48*se_m_supersonic_mvl/mxv\n\t.byte\t\tPAN   , c_v-1\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW01\n\t.byte\t\tVOL   , 24*se_m_supersonic_mvl/mxv\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\tVOL   , 6*se_m_supersonic_mvl/mxv\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW02\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_supersonic:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_supersonic_pri\t@ Priority\n\t.byte\tse_m_supersonic_rev\t@ Reverb.\n\n\t.word\tse_m_supersonic_grp\n\n\t.word\tse_m_supersonic_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_surf.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_surf_grp, voicegroup128\n\t.equ\tse_m_surf_pri, 4\n\t.equ\tse_m_surf_rev, reverb_set+50\n\t.equ\tse_m_surf_mvl, 127\n\t.equ\tse_m_surf_key, 0\n\t.equ\tse_m_surf_tbs, 1\n\t.equ\tse_m_surf_exg, 0\n\t.equ\tse_m_surf_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_surf\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_surf_1:\n\t.byte\tKEYSH , se_m_surf_key+0\n\t.byte\tTEMPO , 150*se_m_surf_tbs/2\n\t.byte\t\tVOICE , 36\n\t.byte\t\tBENDR , 12\n\t.byte\t\tVOL   , 27*se_m_surf_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN96   , Cn3 , v112\n\t.byte\tW04\n\t.byte\t\tVOL   , 45*se_m_surf_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW01\n\t.byte\t\tVOL   , 60*se_m_surf_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW01\n\t.byte\t\tVOL   , 88*se_m_surf_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+14\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 110*se_m_surf_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+19\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+24\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+11\n\t.byte\tW06\n\t.byte\t\t        c_v+4\n\t.byte\tW06\n\t.byte\t\t        c_v+0\n\t.byte\tW06\n\t.byte\t\t        c_v-4\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+19\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW01\n\t.byte\t\tVOL   , 98*se_m_surf_mvl/mxv\n\t.byte\tW05\n\t.byte\t\t        81*se_m_surf_mvl/mxv\n\t.byte\t\tPAN   , c_v-5\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW06\n\t.byte\t\tVOL   , 68*se_m_surf_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+17\n\t.byte\tW01\n\t.byte\t\tVOL   , 50*se_m_surf_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW03\n\t.byte\t\tVOL   , 31*se_m_surf_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+11\n\t.byte\t\tBEND  , c_v+22\n\t.byte\tW02\n\t.byte\t\tVOL   , 11*se_m_surf_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        6*se_m_surf_mvl/mxv\n\t.byte\t\tPAN   , c_v+4\n\t.byte\t\tBEND  , c_v+30\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_surf:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_surf_pri\t@ Priority\n\t.byte\tse_m_surf_rev\t@ Reverb.\n\n\t.word\tse_m_surf_grp\n\n\t.word\tse_m_surf_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_swagger.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_swagger_grp, voicegroup128\n\t.equ\tse_m_swagger_pri, 4\n\t.equ\tse_m_swagger_rev, reverb_set+50\n\t.equ\tse_m_swagger_mvl, 127\n\t.equ\tse_m_swagger_key, 0\n\t.equ\tse_m_swagger_tbs, 1\n\t.equ\tse_m_swagger_exg, 0\n\t.equ\tse_m_swagger_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_swagger\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_swagger_1:\n\t.byte\tKEYSH , se_m_swagger_key+0\n\t.byte\tTEMPO , 190*se_m_swagger_tbs/2\n\t.byte\t\tVOICE , 2\n\t.byte\t\tBENDR , 8\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 28*se_m_swagger_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN15   , An1 , v127\n\t.byte\tW01\n\t.byte\t\tVOL   , 60*se_m_swagger_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        111*se_m_swagger_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        120*se_m_swagger_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-3\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\tVOL   , 109*se_m_swagger_mvl/mxv\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tBEND  , c_v-10\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-9\n\t.byte\t\tBEND  , c_v-14\n\t.byte\tW01\n\t.byte\t\tVOL   , 95*se_m_swagger_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-19\n\t.byte\tW02\n\t.byte\t\tVOL   , 71*se_m_swagger_mvl/mxv\n\t.byte\t\tBEND  , c_v-29\n\t.byte\tW01\n\t.byte\t\tVOL   , 41*se_m_swagger_mvl/mxv\n\t.byte\t\tBEND  , c_v-38\n\t.byte\tW01\n\t.byte\t\tVOL   , 15*se_m_swagger_mvl/mxv\n\t.byte\t\tBEND  , c_v-52\n\t.byte\tW04\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_swagger:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_swagger_pri\t@ Priority\n\t.byte\tse_m_swagger_rev\t@ Reverb.\n\n\t.word\tse_m_swagger_grp\n\n\t.word\tse_m_swagger_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_swagger2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_swagger2_grp, voicegroup128\n\t.equ\tse_m_swagger2_pri, 4\n\t.equ\tse_m_swagger2_rev, reverb_set+50\n\t.equ\tse_m_swagger2_mvl, 127\n\t.equ\tse_m_swagger2_key, 0\n\t.equ\tse_m_swagger2_tbs, 1\n\t.equ\tse_m_swagger2_exg, 0\n\t.equ\tse_m_swagger2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_swagger2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_swagger2_1:\n\t.byte\tKEYSH , se_m_swagger2_key+0\n\t.byte\tTEMPO , 150*se_m_swagger2_tbs/2\n\t.byte\t\tVOICE , 56\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 65*se_m_swagger2_mvl/mxv\n\t.byte\t\tBEND  , c_v+8\n\t.byte\t\tN01   , Cs6 , v112\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Dn6 , v100\n\t.byte\tW01\n\t.byte\t\t        Dn6 , v060\n\t.byte\tW04\n\t.byte\t\tBEND  , c_v-8\n\t.byte\t\tN01   , Ds6 , v112\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , En6 , v100\n\t.byte\tW01\n\t.byte\t\t        En6 , v060\n\t.byte\tW04\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_swagger2:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_swagger2_pri\t@ Priority\n\t.byte\tse_m_swagger2_rev\t@ Reverb.\n\n\t.word\tse_m_swagger2_grp\n\n\t.word\tse_m_swagger2_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_sweet_scent.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_sweet_scent_grp, voicegroup128\n\t.equ\tse_m_sweet_scent_pri, 4\n\t.equ\tse_m_sweet_scent_rev, reverb_set+50\n\t.equ\tse_m_sweet_scent_mvl, 127\n\t.equ\tse_m_sweet_scent_key, 0\n\t.equ\tse_m_sweet_scent_tbs, 1\n\t.equ\tse_m_sweet_scent_exg, 0\n\t.equ\tse_m_sweet_scent_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_sweet_scent\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_sweet_scent_1:\n\t.byte\tKEYSH , se_m_sweet_scent_key+0\n\t.byte\tTEMPO , 150*se_m_sweet_scent_tbs/2\n\t.byte\t\tVOICE , 61\n\t.byte\t\tBENDR , 44\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_sweet_scent_mvl/mxv\n\t.byte\t\tBEND  , c_v+2\n\t.byte\t\tN36   , En3 , v096\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+5\n\t.byte\t\tN36   , Fn3\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tBEND  , c_v+8\n\t.byte\t\tN36   , En3 , v088\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+10\n\t.byte\t\tN60   , Fs3 , v056\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW12\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW04\n\t.byte\t\tVOL   , 103*se_m_sweet_scent_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        97*se_m_sweet_scent_mvl/mxv\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW01\n\t.byte\t\tVOL   , 91*se_m_sweet_scent_mvl/mxv\n\t.byte\tW05\n\t.byte\t\t        81*se_m_sweet_scent_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        72*se_m_sweet_scent_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+13\n\t.byte\tW01\n\t.byte\t\tVOL   , 62*se_m_sweet_scent_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        51*se_m_sweet_scent_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        39*se_m_sweet_scent_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        24*se_m_sweet_scent_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        12*se_m_sweet_scent_mvl/mxv\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_sweet_scent_2:\n\t.byte\tKEYSH , se_m_sweet_scent_key+0\n\t.byte\t\tVOICE , 22\n\t.byte\t\tBENDR , 44\n\t.byte\t\tPAN   , c_v+1\n\t.byte\t\tVOL   , 38*se_m_sweet_scent_mvl/mxv\n\t.byte\t\tBEND  , c_v+1\n\t.byte\t\tTIE   , Gn3 , v100\n\t.byte\tW03\n\t.byte\t\tVOL   , 50*se_m_sweet_scent_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        62*se_m_sweet_scent_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW01\n\t.byte\t\tVOL   , 65*se_m_sweet_scent_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        74*se_m_sweet_scent_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        78*se_m_sweet_scent_mvl/mxv\n\t.byte\t\tBEND  , c_v-2\n\t.byte\tW03\n\t.byte\t\tVOL   , 86*se_m_sweet_scent_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        95*se_m_sweet_scent_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        105*se_m_sweet_scent_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW03\n\t.byte\t\tVOL   , 110*se_m_sweet_scent_mvl/mxv\n\t.byte\tW13\n\t.byte\t\tBEND  , c_v-2\n\t.byte\tW04\n\t.byte\tW10\n\t.byte\t\t        c_v-1\n\t.byte\tW10\n\t.byte\t\t        c_v+0\n\t.byte\tW04\n\t.byte\tW03\n\t.byte\t\t        c_v+1\n\t.byte\tW10\n\t.byte\t\t        c_v+1\n\t.byte\tW11\n\t.byte\tW02\n\t.byte\t\t        c_v+2\n\t.byte\tW14\n\t.byte\t\t        c_v+3\n\t.byte\tW08\n\t.byte\t\tVOL   , 105*se_m_sweet_scent_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        101*se_m_sweet_scent_mvl/mxv\n\t.byte\tW05\n\t.byte\t\t        96*se_m_sweet_scent_mvl/mxv\n\t.byte\tW04\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW01\n\t.byte\t\tVOL   , 91*se_m_sweet_scent_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        86*se_m_sweet_scent_mvl/mxv\n\t.byte\tW05\n\t.byte\t\t        78*se_m_sweet_scent_mvl/mxv\n\t.byte\tW03\n\t.byte\tW02\n\t.byte\t\t        68*se_m_sweet_scent_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+1\n\t.byte\tW04\n\t.byte\t\tVOL   , 58*se_m_sweet_scent_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        48*se_m_sweet_scent_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        37*se_m_sweet_scent_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW04\n\t.byte\t\tVOL   , 23*se_m_sweet_scent_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW02\n\t.byte\t\tVOL   , 12*se_m_sweet_scent_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tEOT\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_sweet_scent:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_sweet_scent_pri\t@ Priority\n\t.byte\tse_m_sweet_scent_rev\t@ Reverb.\n\n\t.word\tse_m_sweet_scent_grp\n\n\t.word\tse_m_sweet_scent_1\n\t.word\tse_m_sweet_scent_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_swift.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_swift_grp, voicegroup128\n\t.equ\tse_m_swift_pri, 4\n\t.equ\tse_m_swift_rev, reverb_set+50\n\t.equ\tse_m_swift_mvl, 127\n\t.equ\tse_m_swift_key, 0\n\t.equ\tse_m_swift_tbs, 1\n\t.equ\tse_m_swift_exg, 0\n\t.equ\tse_m_swift_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_swift\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_swift_1:\n\t.byte\tKEYSH , se_m_swift_key+0\n\t.byte\tTEMPO , 180*se_m_swift_tbs/2\n\t.byte\t\tVOICE , 16\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 100*se_m_swift_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , Ds6 , v100\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 90*se_m_swift_mvl/mxv\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 77*se_m_swift_mvl/mxv\n\t.byte\t\tBEND  , c_v-37\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 37*se_m_swift_mvl/mxv\n\t.byte\t\tBEND  , c_v-47\n\t.byte\tW02\n\t.byte\t\tVOL   , 100*se_m_swift_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 90*se_m_swift_mvl/mxv\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tVOL   , 77*se_m_swift_mvl/mxv\n\t.byte\t\tBEND  , c_v-37\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tVOL   , 37*se_m_swift_mvl/mxv\n\t.byte\t\tBEND  , c_v-47\n\t.byte\tW02\n\t.byte\t\tVOL   , 100*se_m_swift_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , Ds6 , v056\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tVOL   , 90*se_m_swift_mvl/mxv\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tVOL   , 77*se_m_swift_mvl/mxv\n\t.byte\t\tBEND  , c_v-37\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tVOL   , 37*se_m_swift_mvl/mxv\n\t.byte\t\tBEND  , c_v-47\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_swift_2:\n\t.byte\tKEYSH , se_m_swift_key+0\n\t.byte\t\tVOICE , 53\n\t.byte\t\tVOL   , 100*se_m_swift_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tN06   , Cn6 , v040\n\t.byte\tW04\n\t.byte\tW02\n\t.byte\t\tN04   , Cn6 , v032\n\t.byte\tW04\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_swift:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_swift_pri\t@ Priority\n\t.byte\tse_m_swift_rev\t@ Reverb.\n\n\t.word\tse_m_swift_grp\n\n\t.word\tse_m_swift_1\n\t.word\tse_m_swift_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_teeter_dance.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_teeter_dance_grp, voicegroup128\n\t.equ\tse_m_teeter_dance_pri, 4\n\t.equ\tse_m_teeter_dance_rev, reverb_set+50\n\t.equ\tse_m_teeter_dance_mvl, 127\n\t.equ\tse_m_teeter_dance_key, 0\n\t.equ\tse_m_teeter_dance_tbs, 1\n\t.equ\tse_m_teeter_dance_exg, 0\n\t.equ\tse_m_teeter_dance_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_teeter_dance\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_teeter_dance_1:\n\t.byte\tKEYSH , se_m_teeter_dance_key+0\n\t.byte\tTEMPO , 170*se_m_teeter_dance_tbs/2\n\t.byte\t\tVOICE , 37\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_teeter_dance_mvl/mxv\n\t.byte\t\tBEND  , c_v-4\n\t.byte\t\tN03   , Gn4 , v100\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tN03   , Gn4 , v056\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , An5 , v100\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-15\n\t.byte\t\tN03   , An5 , v056\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , Cn6 , v100\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tN03   , Cn6 , v056\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , Gn4 , v072\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tN03   , Gn4 , v028\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , An5 , v072\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tN03   , An5 , v028\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03   , Cn6 , v072\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tN03   , Cn6 , v028\n\t.byte\tW03\n\t.byte\tW06\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_teeter_dance_2:\n\t.byte\tKEYSH , se_m_teeter_dance_key+0\n\t.byte\t\tVOICE , 47\n\t.byte\t\tXCMD  , xIECV , 10\n\t.byte\t\t        xIECL , 8\n\t.byte\t\tMOD   , 20\n\t.byte\t\tVOL   , 44*se_m_teeter_dance_mvl/mxv\n\t.byte\t\tBEND  , c_v-2\n\t.byte\tW03\n\t.byte\t\tN03   , Gn3 , v112\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Gn3 , v068\n\t.byte\tW03\n\t.byte\t\t        An4 , v112\n\t.byte\tW06\n\t.byte\t\t        An4 , v068\n\t.byte\tW03\n\t.byte\t\t        Cn5 , v112\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        Cn5 , v068\n\t.byte\tW03\n\t.byte\t\t        Gn3 , v080\n\t.byte\tW06\n\t.byte\t\t        Gn3 , v036\n\t.byte\tW03\n\t.byte\t\t        An4 , v080\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\t        An4 , v036\n\t.byte\tW03\n\t.byte\t\t        Cn5 , v080\n\t.byte\tW06\n\t.byte\t\t        Cn5 , v036\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_teeter_dance:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_teeter_dance_pri\t@ Priority\n\t.byte\tse_m_teeter_dance_rev\t@ Reverb.\n\n\t.word\tse_m_teeter_dance_grp\n\n\t.word\tse_m_teeter_dance_1\n\t.word\tse_m_teeter_dance_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_teleport.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_teleport_grp, voicegroup128\n\t.equ\tse_m_teleport_pri, 4\n\t.equ\tse_m_teleport_rev, reverb_set+50\n\t.equ\tse_m_teleport_mvl, 127\n\t.equ\tse_m_teleport_key, 0\n\t.equ\tse_m_teleport_tbs, 1\n\t.equ\tse_m_teleport_exg, 0\n\t.equ\tse_m_teleport_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_teleport\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_teleport_1:\n\t.byte\tKEYSH , se_m_teleport_key+0\n\t.byte\tTEMPO , 150*se_m_teleport_tbs/2\n\t.byte\t\tVOICE , 45\n\t.byte\t\tBENDR , 24\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 32*se_m_teleport_mvl/mxv\n\t.byte\t\tMOD   , 30\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , Cn3 , v127\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW01\n\t.byte\t\tVOL   , 49*se_m_teleport_mvl/mxv\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW01\n\t.byte\t\t        c_v+16\n\t.byte\tW01\n\t.byte\t\tVOL   , 61*se_m_teleport_mvl/mxv\n\t.byte\t\tBEND  , c_v+24\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+2\n\t.byte\t\tN06   , Dn3 , v116\n\t.byte\tW01\n\t.byte\t\tVOL   , 71*se_m_teleport_mvl/mxv\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW01\n\t.byte\t\tVOL   , 81*se_m_teleport_mvl/mxv\n\t.byte\t\tBEND  , c_v+18\n\t.byte\tW01\n\t.byte\t\t        c_v+27\n\t.byte\tW02\n\t.byte\t\tVOL   , 95*se_m_teleport_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+4\n\t.byte\t\tN06   , En3 , v112\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+9\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+14\n\t.byte\tW01\n\t.byte\t\t        c_v+20\n\t.byte\tW01\n\t.byte\t\t        c_v+29\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+6\n\t.byte\t\tN06   , Fn3\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+15\n\t.byte\tW01\n\t.byte\t\t        c_v+22\n\t.byte\tW01\n\t.byte\t\t        c_v+31\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+9\n\t.byte\t\tN06   , Gn3 , v108\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+14\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v+18\n\t.byte\tW01\n\t.byte\t\t        c_v+25\n\t.byte\tW01\n\t.byte\t\t        c_v+34\n\t.byte\tW02\n\t.byte\t\tVOL   , 82*se_m_teleport_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+14\n\t.byte\t\tN06   , An3 , v100\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+18\n\t.byte\tW01\n\t.byte\t\tVOL   , 71*se_m_teleport_mvl/mxv\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v+23\n\t.byte\tW01\n\t.byte\t\t        c_v+30\n\t.byte\tW01\n\t.byte\t\tVOL   , 61*se_m_teleport_mvl/mxv\n\t.byte\t\tBEND  , c_v+38\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+14\n\t.byte\t\tN06   , Bn3 , v060\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+18\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v+23\n\t.byte\tW01\n\t.byte\t\t        c_v+30\n\t.byte\tW01\n\t.byte\t\t        c_v+38\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+14\n\t.byte\t\tN06   , Cn4 , v040\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+18\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v+23\n\t.byte\tW01\n\t.byte\t\t        c_v+30\n\t.byte\tW01\n\t.byte\t\t        c_v+38\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+14\n\t.byte\t\tN06   , Dn4 , v020\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+18\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v+23\n\t.byte\tW01\n\t.byte\t\t        c_v+30\n\t.byte\tW01\n\t.byte\t\t        c_v+38\n\t.byte\tW02\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_teleport:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_teleport_pri\t@ Priority\n\t.byte\tse_m_teleport_rev\t@ Reverb.\n\n\t.word\tse_m_teleport_grp\n\n\t.word\tse_m_teleport_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_thunder_wave.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_thunder_wave_grp, voicegroup128\n\t.equ\tse_m_thunder_wave_pri, 4\n\t.equ\tse_m_thunder_wave_rev, reverb_set+50\n\t.equ\tse_m_thunder_wave_mvl, 127\n\t.equ\tse_m_thunder_wave_key, 0\n\t.equ\tse_m_thunder_wave_tbs, 1\n\t.equ\tse_m_thunder_wave_exg, 0\n\t.equ\tse_m_thunder_wave_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_thunder_wave\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_thunder_wave_1:\n\t.byte\tKEYSH , se_m_thunder_wave_key+0\n\t.byte\tTEMPO , 150*se_m_thunder_wave_tbs/2\n\t.byte\t\tVOICE , 18\n\t.byte\t\tVOL   , 110*se_m_thunder_wave_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+32\n\t.byte\t\tN06   , Gn3 , v127\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+32\n\t.byte\t\tN04   , Cn3\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+9\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN01   , Gn3\n\t.byte\tW02\n\t.byte\t\t        Bn2\n\t.byte\tW02\n\t.byte\t\tN13   , Gn3\n\t.byte\tW02\n\t.byte\t\tVOL   , 96*se_m_thunder_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        85*se_m_thunder_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-23\n\t.byte\tW01\n\t.byte\t\tVOL   , 66*se_m_thunder_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-40\n\t.byte\tW01\n\t.byte\t\tVOL   , 36*se_m_thunder_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-54\n\t.byte\tW02\n\t.byte\t\tVOL   , 12*se_m_thunder_wave_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-64\n\t.byte\tW21\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_thunder_wave_2:\n\t.byte\tKEYSH , se_m_thunder_wave_key+0\n\t.byte\t\tVOICE , 5\n\t.byte\t\tVOL   , 110*se_m_thunder_wave_mvl/mxv\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN02   , En3 , v052\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tN02   , En3 , v044\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN02   , En3 , v036\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tN02   , En3 , v028\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN02   , En3 , v020\n\t.byte\tW08\n\t.byte\tW24\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_thunder_wave:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_thunder_wave_pri\t@ Priority\n\t.byte\tse_m_thunder_wave_rev\t@ Reverb.\n\n\t.word\tse_m_thunder_wave_grp\n\n\t.word\tse_m_thunder_wave_1\n\t.word\tse_m_thunder_wave_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_thunderbolt.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_thunderbolt_grp, voicegroup128\n\t.equ\tse_m_thunderbolt_pri, 4\n\t.equ\tse_m_thunderbolt_rev, reverb_set+50\n\t.equ\tse_m_thunderbolt_mvl, 127\n\t.equ\tse_m_thunderbolt_key, 0\n\t.equ\tse_m_thunderbolt_tbs, 1\n\t.equ\tse_m_thunderbolt_exg, 0\n\t.equ\tse_m_thunderbolt_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_thunderbolt\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_thunderbolt_1:\n\t.byte\tKEYSH , se_m_thunderbolt_key+0\n\t.byte\tTEMPO , 220*se_m_thunderbolt_tbs/2\n\t.byte\t\tVOICE , 18\n\t.byte\t\tVOL   , 120*se_m_thunderbolt_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+32\n\t.byte\t\tN06   , Dn3 , v127\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-16\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v+32\n\t.byte\t\tN06   , Dn2 , v104\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+9\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+16\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN21   , Dn3 , v127\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW03\n\t.byte\t\t        c_v-15\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-7\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-23\n\t.byte\tW02\n\t.byte\t\tVOL   , 100*se_m_thunderbolt_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-40\n\t.byte\tW01\n\t.byte\t\tVOL   , 86*se_m_thunderbolt_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-54\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tVOL   , 68*se_m_thunderbolt_mvl/mxv\n\t.byte\tW02\n\t.byte\t\t        37*se_m_thunderbolt_mvl/mxv\n\t.byte\t\tBEND  , c_v-64\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+16\n\t.byte\tW02\n\t.byte\t\tVOL   , 17*se_m_thunderbolt_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+10\n\t.byte\tW15\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_thunderbolt_2:\n\t.byte\tKEYSH , se_m_thunderbolt_key+0\n\t.byte\t\tVOICE , 5\n\t.byte\t\tVOL   , 120*se_m_thunderbolt_mvl/mxv\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN02   , En3 , v048\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tN02   , En3 , v040\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN02   , En3 , v032\n\t.byte\tW07\n\t.byte\t\tPAN   , c_v+10\n\t.byte\t\tN02   , En3 , v024\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN02   , En3 , v016\n\t.byte\tW24\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_thunderbolt:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_thunderbolt_pri\t@ Priority\n\t.byte\tse_m_thunderbolt_rev\t@ Reverb.\n\n\t.word\tse_m_thunderbolt_grp\n\n\t.word\tse_m_thunderbolt_1\n\t.word\tse_m_thunderbolt_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_thunderbolt2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_thunderbolt2_grp, voicegroup128\n\t.equ\tse_m_thunderbolt2_pri, 4\n\t.equ\tse_m_thunderbolt2_rev, reverb_set+50\n\t.equ\tse_m_thunderbolt2_mvl, 127\n\t.equ\tse_m_thunderbolt2_key, 0\n\t.equ\tse_m_thunderbolt2_tbs, 1\n\t.equ\tse_m_thunderbolt2_exg, 0\n\t.equ\tse_m_thunderbolt2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_thunderbolt2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_thunderbolt2_1:\n\t.byte\tKEYSH , se_m_thunderbolt2_key+0\n\t.byte\tTEMPO , 220*se_m_thunderbolt2_tbs/2\n\t.byte\t\tVOICE , 18\n\t.byte\t\tVOL   , 100*se_m_thunderbolt2_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , Cn4 , v088\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-9\n\t.byte\t\tN03   , Cn4 , v080\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tN03   , Cn4 , v072\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tN03   , Cn4 , v064\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tN03   , Cn4 , v060\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tN03   , Cn4 , v052\n\t.byte\tW18\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_thunderbolt2_2:\n\t.byte\tKEYSH , se_m_thunderbolt2_key+0\n\t.byte\t\tVOICE , 5\n\t.byte\t\tVOL   , 100*se_m_thunderbolt2_mvl/mxv\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tN02   , Gn3 , v072\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN02   , Gn3 , v068\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tN02   , Gn3 , v064\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN02   , Gn3 , v060\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tN02   , Gn3 , v056\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN02   , Gn3 , v048\n\t.byte\tW18\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_thunderbolt2:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_thunderbolt2_pri\t@ Priority\n\t.byte\tse_m_thunderbolt2_rev\t@ Reverb.\n\n\t.word\tse_m_thunderbolt2_grp\n\n\t.word\tse_m_thunderbolt2_1\n\t.word\tse_m_thunderbolt2_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_toxic.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_toxic_grp, voicegroup128\n\t.equ\tse_m_toxic_pri, 4\n\t.equ\tse_m_toxic_rev, reverb_set+50\n\t.equ\tse_m_toxic_mvl, 127\n\t.equ\tse_m_toxic_key, 0\n\t.equ\tse_m_toxic_tbs, 1\n\t.equ\tse_m_toxic_exg, 0\n\t.equ\tse_m_toxic_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_toxic\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_toxic_1:\n\t.byte\tKEYSH , se_m_toxic_key+0\n\t.byte\tTEMPO , 150*se_m_toxic_tbs/2\n\t.byte\t\tVOICE , 31\n\t.byte\t\tVOL   , 110*se_m_toxic_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Dn2 , v127\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+32\n\t.byte\tW01\n\t.byte\t\tVOICE , 23\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Gn1 , v112\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tBEND  , c_v+63\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN02   , Cn2\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\tN01\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tN01   , Cn3\n\t.byte\tW01\n\t.byte\t\tVOICE , 31\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tN01   , Dn2\n\t.byte\tW02\n\t.byte\t\tVOICE , 23\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN01   , Cn2\n\t.byte\tW01\n\t.byte\t\tVOICE , 31\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tN01   , Dn2 , v096\n\t.byte\tW01\n\t.byte\t\tVOICE , 23\n\t.byte\t\tPAN   , c_v-8\n\t.byte\t\tBEND  , c_v+16\n\t.byte\t\tN01   , Cn3\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tN01   , Cn2\n\t.byte\tW08\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_toxic:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_toxic_pri\t@ Priority\n\t.byte\tse_m_toxic_rev\t@ Reverb.\n\n\t.word\tse_m_toxic_grp\n\n\t.word\tse_m_toxic_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_tri_attack.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_tri_attack_grp, voicegroup128\n\t.equ\tse_m_tri_attack_pri, 4\n\t.equ\tse_m_tri_attack_rev, reverb_set+50\n\t.equ\tse_m_tri_attack_mvl, 127\n\t.equ\tse_m_tri_attack_key, 0\n\t.equ\tse_m_tri_attack_tbs, 1\n\t.equ\tse_m_tri_attack_exg, 0\n\t.equ\tse_m_tri_attack_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_tri_attack\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_tri_attack_1:\n\t.byte\tKEYSH , se_m_tri_attack_key+0\n\t.byte\tTEMPO , 220*se_m_tri_attack_tbs/2\n\t.byte\t\tVOICE , 58\n\t.byte\t\tBENDR , 24\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 19*se_m_tri_attack_mvl/mxv\n\t.byte\t\tBEND  , c_v-32\n\t.byte\t\tN16   , Gn1 , v127\n\t.byte\tW01\n\t.byte\t\tVOL   , 43*se_m_tri_attack_mvl/mxv\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tVOL   , 72*se_m_tri_attack_mvl/mxv\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW01\n\t.byte\t\tVOL   , 92*se_m_tri_attack_mvl/mxv\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW01\n\t.byte\t\tVOL   , 109*se_m_tri_attack_mvl/mxv\n\t.byte\t\tBEND  , c_v+19\n\t.byte\tW02\n\t.byte\t\t        c_v+28\n\t.byte\tW01\n\t.byte\t\t        c_v+40\n\t.byte\tW01\n\t.byte\t\t        c_v+28\n\t.byte\tW01\n\t.byte\t\tVOL   , 102*se_m_tri_attack_mvl/mxv\n\t.byte\t\tBEND  , c_v+19\n\t.byte\tW01\n\t.byte\t\tVOL   , 88*se_m_tri_attack_mvl/mxv\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW02\n\t.byte\t\tVOL   , 69*se_m_tri_attack_mvl/mxv\n\t.byte\t\tBEND  , c_v-9\n\t.byte\tW01\n\t.byte\t\tVOL   , 37*se_m_tri_attack_mvl/mxv\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW01\n\t.byte\t\tVOL   , 17*se_m_tri_attack_mvl/mxv\n\t.byte\t\tBEND  , c_v-34\n\t.byte\tW10\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_tri_attack_2:\n\t.byte\tKEYSH , se_m_tri_attack_key+0\n\t.byte\t\tVOICE , 4\n\t.byte\t\tVOL   , 110*se_m_tri_attack_mvl/mxv\n\t.byte\t\tN02   , Gs3 , v032\n\t.byte\tW02\n\t.byte\t\t        Gn3\n\t.byte\tW02\n\t.byte\t\t        Fn3\n\t.byte\tW03\n\t.byte\t\t        En3\n\t.byte\tW02\n\t.byte\t\t        Dn3\n\t.byte\tW03\n\t.byte\t\t        Cn3\n\t.byte\tW02\n\t.byte\t\t        Gs2\n\t.byte\tW10\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_tri_attack:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_tri_attack_pri\t@ Priority\n\t.byte\tse_m_tri_attack_rev\t@ Reverb.\n\n\t.word\tse_m_tri_attack_grp\n\n\t.word\tse_m_tri_attack_1\n\t.word\tse_m_tri_attack_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_tri_attack2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_tri_attack2_grp, voicegroup128\n\t.equ\tse_m_tri_attack2_pri, 4\n\t.equ\tse_m_tri_attack2_rev, reverb_set+50\n\t.equ\tse_m_tri_attack2_mvl, 127\n\t.equ\tse_m_tri_attack2_key, 0\n\t.equ\tse_m_tri_attack2_tbs, 1\n\t.equ\tse_m_tri_attack2_exg, 0\n\t.equ\tse_m_tri_attack2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_tri_attack2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_tri_attack2_1:\n\t.byte\tKEYSH , se_m_tri_attack2_key+0\n\t.byte\tTEMPO , 220*se_m_tri_attack2_tbs/2\n\t.byte\t\tVOICE , 18\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 110*se_m_tri_attack2_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN09   , An3 , v127\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+21\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v+6\n\t.byte\t\tN15   , An3 , v120\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v+2\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+10\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-9\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-9\n\t.byte\t\tBEND  , c_v-29\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN09   , Cn3 , v127\n\t.byte\tW06\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW03\n\t.byte\t\t        c_v-15\n\t.byte\t\tN60   , Cs3 , v124\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-4\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+10\n\t.byte\tW06\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW03\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-9\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-22\n\t.byte\tW06\n\t.byte\t\tVOL   , 103*se_m_tri_attack2_mvl/mxv\n\t.byte\t\tPAN   , c_v+10\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-32\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\tVOL   , 95*se_m_tri_attack2_mvl/mxv\n\t.byte\t\tBEND  , c_v-38\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-9\n\t.byte\tW05\n\t.byte\t\tBEND  , c_v-45\n\t.byte\tW01\n\t.byte\t\tVOL   , 66*se_m_tri_attack2_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW05\n\t.byte\t\t        c_v+10\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-52\n\t.byte\tW03\n\t.byte\t\tVOL   , 21*se_m_tri_attack2_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW04\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_tri_attack2_2:\n\t.byte\tKEYSH , se_m_tri_attack2_key+0\n\t.byte\t\tVOICE , 4\n\t.byte\t\tVOL   , 110*se_m_tri_attack2_mvl/mxv\n\t.byte\t\tN06   , Cn3 , v060\n\t.byte\tW09\n\t.byte\t\tN15\n\t.byte\tW15\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_tri_attack2:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_tri_attack2_pri\t@ Priority\n\t.byte\tse_m_tri_attack2_rev\t@ Reverb.\n\n\t.word\tse_m_tri_attack2_grp\n\n\t.word\tse_m_tri_attack2_1\n\t.word\tse_m_tri_attack2_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_twister.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_twister_grp, voicegroup128\n\t.equ\tse_m_twister_pri, 4\n\t.equ\tse_m_twister_rev, reverb_set+50\n\t.equ\tse_m_twister_mvl, 127\n\t.equ\tse_m_twister_key, 0\n\t.equ\tse_m_twister_tbs, 1\n\t.equ\tse_m_twister_exg, 0\n\t.equ\tse_m_twister_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_twister\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_twister_1:\n\t.byte\tKEYSH , se_m_twister_key+0\n\t.byte\tTEMPO , 150*se_m_twister_tbs/2\n\t.byte\t\tVOICE , 22\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 67*se_m_twister_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tTIE   , Dn2 , v127\n\t.byte\tW03\n\t.byte\t\tVOL   , 83*se_m_twister_mvl/mxv\n\t.byte\t\tBEND  , c_v+22\n\t.byte\tW03\n\t.byte\t\tVOL   , 88*se_m_twister_mvl/mxv\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW03\n\t.byte\t\tVOL   , 95*se_m_twister_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+8\n\t.byte\tW01\n\t.byte\t\tVOL   , 105*se_m_twister_mvl/mxv\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW03\n\t.byte\t\tVOL   , 115*se_m_twister_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-12\n\t.byte\tW06\n\t.byte\t\t        c_v-17\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v-7\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-9\n\t.byte\tW06\n\t.byte\t\t        c_v-3\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW03\n\t.byte\t\t        c_v+10\n\t.byte\tW06\n\t.byte\t\t        c_v+16\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-20\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+13\n\t.byte\tW06\n\t.byte\t\t        c_v+8\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-13\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW03\n\t.byte\t\t        c_v-11\n\t.byte\tW03\n\t.byte\t\t        c_v-17\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-6\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v-9\n\t.byte\tW06\n\t.byte\t\t        c_v-3\n\t.byte\tW03\n\t.byte\t\t        c_v+6\n\t.byte\tW03\n\t.byte\t\t        c_v+10\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+6\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+16\n\t.byte\tW06\n\t.byte\t\t        c_v+13\n\t.byte\tW06\n\t.byte\t\t        c_v+8\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\t\tBEND  , c_v+11\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-8\n\t.byte\tW03\n\t.byte\t\t        c_v-11\n\t.byte\t\tVOL   , 103*se_m_twister_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-17\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+20\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v-9\n\t.byte\tW01\n\t.byte\t\tVOL   , 97*se_m_twister_mvl/mxv\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v-3\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+12\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tVOL   , 88*se_m_twister_mvl/mxv\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+10\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW02\n\t.byte\t\tVOL   , 79*se_m_twister_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+16\n\t.byte\tW04\n\t.byte\t\tVOL   , 62*se_m_twister_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+13\n\t.byte\tW04\n\t.byte\t\tVOL   , 45*se_m_twister_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+8\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-7\n\t.byte\tW01\n\t.byte\t\tVOL   , 33*se_m_twister_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v-8\n\t.byte\tW01\n\t.byte\t\tVOL   , 18*se_m_twister_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-11\n\t.byte\tW03\n\t.byte\t\tEOT\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_twister_2:\n\t.byte\tKEYSH , se_m_twister_key+0\n\t.byte\t\tVOICE , 25\n\t.byte\t\tVOL   , 67*se_m_twister_mvl/mxv\n\t.byte\t\tTIE   , Gs4 , v012\n\t.byte\tW03\n\t.byte\t\tVOL   , 83*se_m_twister_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        88*se_m_twister_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        95*se_m_twister_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        105*se_m_twister_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        115*se_m_twister_mvl/mxv\n\t.byte\tW09\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tW24\n\t.byte\tW21\n\t.byte\t\t        103*se_m_twister_mvl/mxv\n\t.byte\tW03\n\t.byte\tW07\n\t.byte\t\t        97*se_m_twister_mvl/mxv\n\t.byte\tW08\n\t.byte\t\t        88*se_m_twister_mvl/mxv\n\t.byte\tW07\n\t.byte\t\t        79*se_m_twister_mvl/mxv\n\t.byte\tW02\n\t.byte\tW04\n\t.byte\t\t        62*se_m_twister_mvl/mxv\n\t.byte\tW06\n\t.byte\t\t        45*se_m_twister_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        33*se_m_twister_mvl/mxv\n\t.byte\tW05\n\t.byte\t\t        18*se_m_twister_mvl/mxv\n\t.byte\tW05\n\t.byte\t\tEOT\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_twister:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_twister_pri\t@ Priority\n\t.byte\tse_m_twister_rev\t@ Reverb.\n\n\t.word\tse_m_twister_grp\n\n\t.word\tse_m_twister_1\n\t.word\tse_m_twister_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_uproar.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_uproar_grp, voicegroup128\n\t.equ\tse_m_uproar_pri, 4\n\t.equ\tse_m_uproar_rev, reverb_set+50\n\t.equ\tse_m_uproar_mvl, 127\n\t.equ\tse_m_uproar_key, 0\n\t.equ\tse_m_uproar_tbs, 1\n\t.equ\tse_m_uproar_exg, 0\n\t.equ\tse_m_uproar_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_uproar\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_uproar_1:\n\t.byte\tKEYSH , se_m_uproar_key+0\n\t.byte\tTEMPO , 150*se_m_uproar_tbs/2\n\t.byte\t\tVOICE , 60\n\t.byte\t\tBENDR , 12\n\t.byte\t\tVOL   , 25*se_m_uproar_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN24   , Gs2 , v127\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+2\n\t.byte\t\tVOL   , 51*se_m_uproar_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+5\n\t.byte\t\tVOL   , 74*se_m_uproar_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        89*se_m_uproar_mvl/mxv\n\t.byte\t\tBEND  , c_v+1\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+2\n\t.byte\t\tVOL   , 100*se_m_uproar_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-2\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW02\n\t.byte\t\t        c_v-2\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+5\n\t.byte\tW02\n\t.byte\t\t        c_v+2\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 85*se_m_uproar_mvl/mxv\n\t.byte\t\tPAN   , c_v-2\n\t.byte\tW01\n\t.byte\t\t        c_v-4\n\t.byte\t\tVOL   , 62*se_m_uproar_mvl/mxv\n\t.byte\tW01\n\t.byte\t\t        33*se_m_uproar_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-2\n\t.byte\t\tVOL   , 11*se_m_uproar_mvl/mxv\n\t.byte\tW02\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_uproar:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_uproar_pri\t@ Priority\n\t.byte\tse_m_uproar_rev\t@ Reverb.\n\n\t.word\tse_m_uproar_grp\n\n\t.word\tse_m_uproar_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_vital_throw.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_vital_throw_grp, voicegroup128\n\t.equ\tse_m_vital_throw_pri, 4\n\t.equ\tse_m_vital_throw_rev, reverb_set+50\n\t.equ\tse_m_vital_throw_mvl, 127\n\t.equ\tse_m_vital_throw_key, 0\n\t.equ\tse_m_vital_throw_tbs, 1\n\t.equ\tse_m_vital_throw_exg, 0\n\t.equ\tse_m_vital_throw_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_vital_throw\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_vital_throw_1:\n\t.byte\tKEYSH , se_m_vital_throw_key+0\n\t.byte\tTEMPO , 220*se_m_vital_throw_tbs/2\n\t.byte\t\tVOICE , 22\n\t.byte\t\tVOL   , 110*se_m_vital_throw_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tBEND  , c_v+46\n\t.byte\t\tN09   , Cn3 , v127\n\t.byte\tW03\n\t.byte\t\tVOL   , 104*se_m_vital_throw_mvl/mxv\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+23\n\t.byte\tW03\n\t.byte\t\tVOL   , 93*se_m_vital_throw_mvl/mxv\n\t.byte\t\tPAN   , c_v-16\n\t.byte\t\tBEND  , c_v-15\n\t.byte\tW03\n\t.byte\t\tVOICE , 21\n\t.byte\t\tVOL   , 110*se_m_vital_throw_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN03   , Gn4\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tN03   , Cn5\n\t.byte\tW09\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_vital_throw_2:\n\t.byte\tKEYSH , se_m_vital_throw_key+0\n\t.byte\t\tVOICE , 4\n\t.byte\t\tVOL   , 110*se_m_vital_throw_mvl/mxv\n\t.byte\tW09\n\t.byte\t\tPAN   , c_v+8\n\t.byte\t\tN03   , Cn3 , v052\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN03\n\t.byte\tW09\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_vital_throw:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_vital_throw_pri\t@ Priority\n\t.byte\tse_m_vital_throw_rev\t@ Reverb.\n\n\t.word\tse_m_vital_throw_grp\n\n\t.word\tse_m_vital_throw_1\n\t.word\tse_m_vital_throw_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_vital_throw2.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_vital_throw2_grp, voicegroup128\n\t.equ\tse_m_vital_throw2_pri, 4\n\t.equ\tse_m_vital_throw2_rev, reverb_set+50\n\t.equ\tse_m_vital_throw2_mvl, 127\n\t.equ\tse_m_vital_throw2_key, 0\n\t.equ\tse_m_vital_throw2_tbs, 1\n\t.equ\tse_m_vital_throw2_exg, 0\n\t.equ\tse_m_vital_throw2_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_vital_throw2\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_vital_throw2_1:\n\t.byte\tKEYSH , se_m_vital_throw2_key+0\n\t.byte\tTEMPO , 220*se_m_vital_throw2_tbs/2\n\t.byte\t\tVOICE , 6\n\t.byte\t\tVOL   , 110*se_m_vital_throw2_mvl/mxv\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , Cn3 , v127\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-9\n\t.byte\tW01\n\t.byte\t\t        c_v-21\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v-40\n\t.byte\tW01\n\t.byte\t\t        c_v-64\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN06   , En3\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-9\n\t.byte\tW01\n\t.byte\t\t        c_v-21\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+7\n\t.byte\t\tBEND  , c_v-40\n\t.byte\tW01\n\t.byte\t\t        c_v-64\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN09   , An2\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-9\n\t.byte\tW01\n\t.byte\t\t        c_v-19\n\t.byte\tW01\n\t.byte\t\t        c_v-29\n\t.byte\tW01\n\t.byte\t\tVOL   , 86*se_m_vital_throw2_mvl/mxv\n\t.byte\t\tBEND  , c_v-39\n\t.byte\tW02\n\t.byte\t\tVOL   , 69*se_m_vital_throw2_mvl/mxv\n\t.byte\t\tBEND  , c_v-45\n\t.byte\tW01\n\t.byte\t\tVOL   , 53*se_m_vital_throw2_mvl/mxv\n\t.byte\t\tBEND  , c_v-56\n\t.byte\tW01\n\t.byte\t\tVOL   , 20*se_m_vital_throw2_mvl/mxv\n\t.byte\t\tBEND  , c_v-64\n\t.byte\tW04\n\t.byte\t\t        c_v-64\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_vital_throw2_2:\n\t.byte\tKEYSH , se_m_vital_throw2_key+0\n\t.byte\t\tVOICE , 5\n\t.byte\t\tXCMD  , xIECV , 10\n\t.byte\t\t        xIECL , 8\n\t.byte\t\tVOL   , 110*se_m_vital_throw2_mvl/mxv\n\t.byte\t\tPAN   , c_v+9\n\t.byte\t\tN03   , Gs2 , v052\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-7\n\t.byte\t\tN03\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tN03\n\t.byte\tW12\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_vital_throw2:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_vital_throw2_pri\t@ Priority\n\t.byte\tse_m_vital_throw2_rev\t@ Reverb.\n\n\t.word\tse_m_vital_throw2_grp\n\n\t.word\tse_m_vital_throw2_1\n\t.word\tse_m_vital_throw2_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_waterfall.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_waterfall_grp, voicegroup128\n\t.equ\tse_m_waterfall_pri, 4\n\t.equ\tse_m_waterfall_rev, reverb_set+50\n\t.equ\tse_m_waterfall_mvl, 127\n\t.equ\tse_m_waterfall_key, 0\n\t.equ\tse_m_waterfall_tbs, 1\n\t.equ\tse_m_waterfall_exg, 0\n\t.equ\tse_m_waterfall_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_waterfall\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_waterfall_1:\n\t.byte\tKEYSH , se_m_waterfall_key+0\n\t.byte\tTEMPO , 150*se_m_waterfall_tbs/2\n\t.byte\t\tVOICE , 36\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 115*se_m_waterfall_mvl/mxv\n\t.byte\t\tBEND  , c_v-18\n\t.byte\t\tN60   , Gn2 , v127\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+3\n\t.byte\t\tBEND  , c_v-16\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v-14\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+3\n\t.byte\t\tBEND  , c_v-11\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-3\n\t.byte\t\tBEND  , c_v-5\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v-2\n\t.byte\tW03\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v-3\n\t.byte\t\tBEND  , c_v+1\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+4\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+3\n\t.byte\t\tBEND  , c_v+7\n\t.byte\tW02\n\t.byte\t\tVOL   , 109*se_m_waterfall_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v+6\n\t.byte\t\tBEND  , c_v+10\n\t.byte\tW02\n\t.byte\t\tVOL   , 103*se_m_waterfall_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+3\n\t.byte\t\tBEND  , c_v+13\n\t.byte\tW03\n\t.byte\t\tVOL   , 92*se_m_waterfall_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+16\n\t.byte\tW03\n\t.byte\t\tVOL   , 79*se_m_waterfall_mvl/mxv\n\t.byte\t\tPAN   , c_v-3\n\t.byte\t\tBEND  , c_v+18\n\t.byte\tW02\n\t.byte\tW02\n\t.byte\t\tVOL   , 62*se_m_waterfall_mvl/mxv\n\t.byte\t\tPAN   , c_v-6\n\t.byte\t\tBEND  , c_v+21\n\t.byte\tW04\n\t.byte\t\tVOL   , 40*se_m_waterfall_mvl/mxv\n\t.byte\t\tPAN   , c_v-3\n\t.byte\t\tBEND  , c_v+26\n\t.byte\tW02\n\t.byte\t\tVOL   , 22*se_m_waterfall_mvl/mxv\n\t.byte\t\tBEND  , c_v+33\n\t.byte\tW01\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 8*se_m_waterfall_mvl/mxv\n\t.byte\t\tBEND  , c_v+43\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_waterfall_2:\n\t.byte\tKEYSH , se_m_waterfall_key+0\n\t.byte\t\tVOICE , 25\n\t.byte\t\tVOL   , 115*se_m_waterfall_mvl/mxv\n\t.byte\t\tN06   , Cn3 , v040\n\t.byte\tW06\n\t.byte\t\t        Gn2\n\t.byte\tW06\nse_m_waterfall_2_000:\n\t.byte\t\tN06   , Cn3 , v040\n\t.byte\tW06\n\t.byte\t\t        Gn2\n\t.byte\tW06\n\t.byte\tPEND\n\t.byte\tPATT\n\t .word\tse_m_waterfall_2_000\n\t.byte\t\tN06   , Cn3 , v032\n\t.byte\tW06\n\t.byte\t\t        Gn2\n\t.byte\tW06\n\t.byte\t\t        Cn3 , v012\n\t.byte\tW06\n\t.byte\t\t        Gn2\n\t.byte\tW06\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_waterfall:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_waterfall_pri\t@ Priority\n\t.byte\tse_m_waterfall_rev\t@ Reverb.\n\n\t.word\tse_m_waterfall_grp\n\n\t.word\tse_m_waterfall_1\n\t.word\tse_m_waterfall_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_whirlpool.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_whirlpool_grp, voicegroup128\n\t.equ\tse_m_whirlpool_pri, 4\n\t.equ\tse_m_whirlpool_rev, reverb_set+50\n\t.equ\tse_m_whirlpool_mvl, 127\n\t.equ\tse_m_whirlpool_key, 0\n\t.equ\tse_m_whirlpool_tbs, 1\n\t.equ\tse_m_whirlpool_exg, 0\n\t.equ\tse_m_whirlpool_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_whirlpool\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_whirlpool_1:\n\t.byte\tKEYSH , se_m_whirlpool_key+0\n\t.byte\tTEMPO , 150*se_m_whirlpool_tbs/2\n\t.byte\t\tVOICE , 36\n\t.byte\t\tBENDR , 12\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tVOL   , 115*se_m_whirlpool_mvl/mxv\n\t.byte\t\tBEND  , c_v-18\n\t.byte\t\tTIE   , Dn2 , v127\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-5\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-3\n\t.byte\tW03\n\t.byte\t\t        c_v+2\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-13\n\t.byte\tW04\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-16\n\t.byte\tW04\n\t.byte\t\tBEND  , c_v+14\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-14\n\t.byte\tW06\n\t.byte\t\t        c_v-9\n\t.byte\t\tBEND  , c_v+18\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v-6\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+24\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW06\n\t.byte\t\t        c_v+3\n\t.byte\tW06\n\t.byte\t\t        c_v+7\n\t.byte\tW06\n\t.byte\t\t        c_v+11\n\t.byte\t\tBEND  , c_v+17\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+16\n\t.byte\t\tBEND  , c_v+10\n\t.byte\tW06\n\t.byte\t\tPAN   , c_v+11\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+5\n\t.byte\tW05\n\t.byte\t\tPAN   , c_v+6\n\t.byte\tW02\n\t.byte\t\tVOL   , 103*se_m_whirlpool_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v+4\n\t.byte\tW01\n\t.byte\t\tVOL   , 85*se_m_whirlpool_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-5\n\t.byte\tW04\n\t.byte\t\tPAN   , c_v+0\n\t.byte\tW01\n\t.byte\t\tVOL   , 71*se_m_whirlpool_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-8\n\t.byte\tW03\n\t.byte\t\tVOL   , 52*se_m_whirlpool_mvl/mxv\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW03\n\t.byte\t\tBEND  , c_v-12\n\t.byte\tW01\n\t.byte\t\tVOL   , 32*se_m_whirlpool_mvl/mxv\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-10\n\t.byte\tW03\n\t.byte\t\tVOL   , 11*se_m_whirlpool_mvl/mxv\n\t.byte\t\tBEND  , c_v-19\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-15\n\t.byte\tW01\n\t.byte\t\tVOL   , 6*se_m_whirlpool_mvl/mxv\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v-28\n\t.byte\tW04\n\t.byte\t\tEOT\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_whirlpool:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_whirlpool_pri\t@ Priority\n\t.byte\tse_m_whirlpool_rev\t@ Reverb.\n\n\t.word\tse_m_whirlpool_grp\n\n\t.word\tse_m_whirlpool_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_m_yawn.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_m_yawn_grp, voicegroup128\n\t.equ\tse_m_yawn_pri, 4\n\t.equ\tse_m_yawn_rev, reverb_set+50\n\t.equ\tse_m_yawn_mvl, 127\n\t.equ\tse_m_yawn_key, 0\n\t.equ\tse_m_yawn_tbs, 1\n\t.equ\tse_m_yawn_exg, 0\n\t.equ\tse_m_yawn_cmp, 1\n\n\t.section .rodata\n\t.global\tse_m_yawn\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_m_yawn_1:\n\t.byte\t\tVOL   , 110*se_m_yawn_mvl/mxv\n\t.byte\tKEYSH , se_m_yawn_key+0\n\t.byte\tTEMPO , 150*se_m_yawn_tbs/2\n\t.byte\t\tVOICE , 61\n\t.byte\t\tBENDR , 44\n\t.byte\t\tPAN   , c_v+0\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN48   , Cn4 , v108\n\t.byte\tW02\n\t.byte\t\tBEND  , c_v-1\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW03\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW02\n\t.byte\t\tPAN   , c_v-4\n\t.byte\tW01\n\t.byte\t\tBEND  , c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v+1\n\t.byte\tW02\n\t.byte\t\t        c_v+1\n\t.byte\tW02\n\t.byte\t\t        c_v+1\n\t.byte\tW02\n\t.byte\t\t        c_v+1\n\t.byte\tW01\n\t.byte\t\t        c_v+1\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-10\n\t.byte\t\tBEND  , c_v+1\n\t.byte\tW01\n\t.byte\t\t        c_v+2\n\t.byte\tW02\n\t.byte\t\t        c_v+2\n\t.byte\tW03\n\t.byte\t\t        c_v+1\n\t.byte\tW02\n\t.byte\t\t        c_v+2\n\t.byte\tW01\n\t.byte\t\t        c_v+1\n\t.byte\tW03\n\t.byte\t\tPAN   , c_v-4\n\t.byte\t\tBEND  , c_v+1\n\t.byte\tW01\n\t.byte\t\t        c_v+1\n\t.byte\tW02\n\t.byte\t\t        c_v+1\n\t.byte\tW01\n\t.byte\t\t        c_v+0\n\t.byte\tW02\n\t.byte\t\t        c_v+0\n\t.byte\tW01\n\t.byte\t\t        c_v-1\n\t.byte\tW01\n\t.byte\t\t        c_v-1\n\t.byte\tW01\n\t.byte\t\t        c_v-3\n\t.byte\tW01\n\t.byte\t\t        c_v-3\n\t.byte\tW02\n\t.byte\tFINE\n\n@********************** Track  2 **********************@\n\nse_m_yawn_2:\n\t.byte\tKEYSH , se_m_yawn_key+0\n\t.byte\t\tVOICE , 66\n\t.byte\t\tBENDR , 44\n\t.byte\t\tPAN   , c_v+1\n\t.byte\t\tVOL   , 110*se_m_yawn_mvl/mxv\n\t.byte\t\tN48   , Dn3 , v020\n\t.byte\tW24\n\t.byte\tW03\n\t.byte\t\tVOL   , 103*se_m_yawn_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        96*se_m_yawn_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        83*se_m_yawn_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        67*se_m_yawn_mvl/mxv\n\t.byte\tW04\n\t.byte\t\t        49*se_m_yawn_mvl/mxv\n\t.byte\tW03\n\t.byte\t\t        23*se_m_yawn_mvl/mxv\n\t.byte\tW03\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_m_yawn:\n\t.byte\t2\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_m_yawn_pri\t@ Priority\n\t.byte\tse_m_yawn_rev\t@ Reverb.\n\n\t.word\tse_m_yawn_grp\n\n\t.word\tse_m_yawn_1\n\t.word\tse_m_yawn_2\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_rg_bag_pocket.s",
    "content": "\t.include \"MPlayDef.s\"\n\t.section .rodata\n\t.global se_rg_bag_pocket\n\t.align 2\n\t.equ se_rg_bag_pocket_grp, voicegroup191\n\t.equ se_rg_bag_pocket_pri, 5\n\t.equ se_rg_bag_pocket_rev, reverb_set+50\n\nse_rg_bag_pocket_1: @ 86BC7AC\n\t.byte KEYSH, 0x00\n\t.byte TEMPO, 0xD3\n\t.byte VOICE, 0x50\n\t.byte VOL, 0x40\n\t.byte BEND, 0x40\n\t.byte N02\n\t.byte Dn4\n\t.byte v084\n\t.byte W02\n\t.byte BEND, 0x51\n\t.byte N03\n\t.byte Fs4\n\t.byte v080\n\t.byte W01\n\t.byte BEND, 0x18\n\t.byte W03\n\t.byte FINE\n\nse_rg_bag_pocket_2: @ 86BC7C4\n\t.byte KEYSH, 0x00\n\t.byte VOICE, 0x02\n\t.byte XCMD, 0x08\n\t.byte GsM2\n\t.byte v009\n\t.byte GsM2\n\t.byte VOL, 0x7F\n\t.byte PAN, 0x40\n\t.byte BEND, 0x40\n\t.byte N04\n\t.byte En3\n\t.byte v127\n\t.byte W03\n\t.byte W01\n\t.byte VOICE, 0x02\n\t.byte N02\n\t.byte Bn3\n\t.byte W02\n\t.byte FINE\n\n@ ***************************************\n\t.align 2\nse_rg_bag_pocket: @ 86BC7E0\n\t.byte 2\n\t.byte 0\n\t.byte se_rg_bag_pocket_pri\n\t.byte se_rg_bag_pocket_rev\n\t.word se_rg_bag_pocket_grp\n\n\t.word se_rg_bag_pocket_1\n\t.word se_rg_bag_pocket_2\n"
  },
  {
    "path": "sound/songs/se_wall_hit.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_wall_hit_grp, voicegroup127\n\t.equ\tse_wall_hit_pri, 2\n\t.equ\tse_wall_hit_rev, reverb_set+50\n\t.equ\tse_wall_hit_mvl, 127\n\t.equ\tse_wall_hit_key, 0\n\t.equ\tse_wall_hit_tbs, 1\n\t.equ\tse_wall_hit_exg, 0\n\t.equ\tse_wall_hit_cmp, 1\n\n\t.section .rodata\n\t.global\tse_wall_hit\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_wall_hit_1:\n\t.byte\tKEYSH , se_wall_hit_key+0\n\t.byte\tTEMPO , 220*se_wall_hit_tbs/2\n\t.byte\t\tVOICE , 89\n\t.byte\t\tVOL   , 80*se_wall_hit_mvl/mxv\n\t.byte\t\tBEND  , c_v+0\n\t.byte\t\tN18   , Gn1 , v127\n\t.byte\tW24\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_wall_hit:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_wall_hit_pri\t@ Priority\n\t.byte\tse_wall_hit_rev\t@ Reverb.\n\n\t.word\tse_wall_hit_grp\n\n\t.word\tse_wall_hit_1\n\n\t.end\n"
  },
  {
    "path": "sound/songs/se_win_open.s",
    "content": "\t.include \"MPlayDef.s\"\n\n\t.equ\tse_win_open_grp, voicegroup127\n\t.equ\tse_win_open_pri, 5\n\t.equ\tse_win_open_rev, reverb_set+50\n\t.equ\tse_win_open_mvl, 127\n\t.equ\tse_win_open_key, 0\n\t.equ\tse_win_open_tbs, 1\n\t.equ\tse_win_open_exg, 0\n\t.equ\tse_win_open_cmp, 1\n\n\t.section .rodata\n\t.global\tse_win_open\n\t.align\t2\n\n@********************** Track  1 **********************@\n\nse_win_open_1:\n\t.byte\tKEYSH , se_win_open_key+0\n\t.byte\tTEMPO , 220*se_win_open_tbs/2\n\t.byte\t\tVOICE , 127\n\t.byte\t\tVOL   , 110*se_win_open_mvl/mxv\n\t.byte\t\tN03   , Ds3 , v127\n\t.byte\tW03\n\t.byte\t\tN15   , Gn4\n\t.byte\tW21\n\t.byte\tFINE\n\n@******************************************************@\n\t.align\t2\n\nse_win_open:\n\t.byte\t1\t@ NumTrks\n\t.byte\t0\t@ NumBlks\n\t.byte\tse_win_open_pri\t@ Priority\n\t.byte\tse_win_open_rev\t@ Reverb.\n\n\t.word\tse_win_open_grp\n\n\t.word\tse_win_open_1\n\n\t.end\n"
  },
  {
    "path": "sound/voice_groups.inc",
    "content": ".include \"sound/voicegroups/voicegroup000.inc\"\n.include \"sound/voicegroups/voicegroup001.inc\"\n.include \"sound/voicegroups/voicegroup002.inc\"\n.include \"sound/voicegroups/voicegroup003.inc\"\n.include \"sound/voicegroups/voicegroup004.inc\"\n.include \"sound/voicegroups/voicegroup005.inc\"\n.include \"sound/voicegroups/voicegroup006.inc\"\n.include \"sound/voicegroups/voicegroup007.inc\"\n.include \"sound/voicegroups/voicegroup008.inc\"\n.include \"sound/voicegroups/voicegroup009.inc\"\n.include \"sound/voicegroups/voicegroup010.inc\"\n.include \"sound/voicegroups/voicegroup011.inc\"\n.include \"sound/voicegroups/voicegroup012.inc\"\n.include \"sound/voicegroups/voicegroup013.inc\"\n.include \"sound/voicegroups/voicegroup014.inc\"\n.include \"sound/voicegroups/voicegroup015.inc\"\n.include \"sound/voicegroups/voicegroup016.inc\"\n.include \"sound/voicegroups/voicegroup017.inc\"\n.include \"sound/voicegroups/voicegroup018.inc\"\n.include \"sound/voicegroups/voicegroup019.inc\"\n.include \"sound/voicegroups/voicegroup020.inc\"\n.include \"sound/voicegroups/voicegroup021.inc\"\n.include \"sound/voicegroups/voicegroup022.inc\"\n.include \"sound/voicegroups/voicegroup023.inc\"\n.include \"sound/voicegroups/voicegroup024.inc\"\n.include \"sound/voicegroups/voicegroup025.inc\"\n.include \"sound/voicegroups/voicegroup026.inc\"\n.include \"sound/voicegroups/voicegroup027.inc\"\n.include \"sound/voicegroups/voicegroup028.inc\"\n.include \"sound/voicegroups/voicegroup029.inc\"\n.include \"sound/voicegroups/voicegroup030.inc\"\n.include \"sound/voicegroups/voicegroup031.inc\"\n.include \"sound/voicegroups/voicegroup032.inc\"\n.include \"sound/voicegroups/voicegroup033.inc\"\n.include \"sound/voicegroups/voicegroup034.inc\"\n.include \"sound/voicegroups/voicegroup035.inc\"\n.include \"sound/voicegroups/voicegroup036.inc\"\n.include \"sound/voicegroups/voicegroup037.inc\"\n.include \"sound/voicegroups/voicegroup038.inc\"\n.include \"sound/voicegroups/voicegroup039.inc\"\n.include \"sound/voicegroups/voicegroup040.inc\"\n.include \"sound/voicegroups/voicegroup041.inc\"\n.include \"sound/voicegroups/voicegroup042.inc\"\n.include \"sound/voicegroups/voicegroup043.inc\"\n.include \"sound/voicegroups/voicegroup044.inc\"\n.include \"sound/voicegroups/voicegroup045.inc\"\n.include \"sound/voicegroups/voicegroup046.inc\"\n.include \"sound/voicegroups/voicegroup047.inc\"\n.include \"sound/voicegroups/voicegroup048.inc\"\n.include \"sound/voicegroups/voicegroup049.inc\"\n.include \"sound/voicegroups/voicegroup050.inc\"\n.include \"sound/voicegroups/voicegroup051.inc\"\n.include \"sound/voicegroups/voicegroup052.inc\"\n.include \"sound/voicegroups/voicegroup053.inc\"\n.include \"sound/voicegroups/voicegroup054.inc\"\n.include \"sound/voicegroups/voicegroup055.inc\"\n.include \"sound/voicegroups/voicegroup056.inc\"\n.include \"sound/voicegroups/voicegroup057.inc\"\n.include \"sound/voicegroups/voicegroup058.inc\"\n.include \"sound/voicegroups/voicegroup059.inc\"\n.include \"sound/voicegroups/voicegroup060.inc\"\n.include \"sound/voicegroups/voicegroup061.inc\"\n.include \"sound/voicegroups/voicegroup062.inc\"\n.include \"sound/voicegroups/voicegroup063.inc\"\n.include \"sound/voicegroups/voicegroup064.inc\"\n.include \"sound/voicegroups/voicegroup065.inc\"\n.include \"sound/voicegroups/voicegroup066.inc\"\n.include \"sound/voicegroups/voicegroup067.inc\"\n.include \"sound/voicegroups/voicegroup068.inc\"\n.include \"sound/voicegroups/voicegroup069.inc\"\n.include \"sound/voicegroups/voicegroup070.inc\"\n.include \"sound/voicegroups/voicegroup071.inc\"\n.include \"sound/voicegroups/voicegroup072.inc\"\n.include \"sound/voicegroups/voicegroup073.inc\"\n.include \"sound/voicegroups/voicegroup074.inc\"\n.include \"sound/voicegroups/voicegroup075.inc\"\n.include \"sound/voicegroups/voicegroup076.inc\"\n.include \"sound/voicegroups/voicegroup077.inc\"\n.include \"sound/voicegroups/voicegroup078.inc\"\n.include \"sound/voicegroups/voicegroup079.inc\"\n.include \"sound/voicegroups/voicegroup080.inc\"\n.include \"sound/voicegroups/voicegroup081.inc\"\n.include \"sound/voicegroups/voicegroup082.inc\"\n.include \"sound/voicegroups/voicegroup083.inc\"\n.include \"sound/voicegroups/voicegroup084.inc\"\n.include \"sound/voicegroups/voicegroup085.inc\"\n.include \"sound/voicegroups/voicegroup086.inc\"\n.include \"sound/voicegroups/voicegroup087.inc\"\n.include \"sound/voicegroups/voicegroup088.inc\"\n.include \"sound/voicegroups/voicegroup089.inc\"\n.include \"sound/voicegroups/voicegroup090.inc\"\n.include \"sound/voicegroups/voicegroup091.inc\"\n.include \"sound/voicegroups/voicegroup092.inc\"\n.include \"sound/voicegroups/voicegroup093.inc\"\n.include \"sound/voicegroups/voicegroup094.inc\"\n.include \"sound/voicegroups/voicegroup095.inc\"\n.include \"sound/voicegroups/voicegroup096.inc\"\n.include \"sound/voicegroups/voicegroup097.inc\"\n.include \"sound/voicegroups/voicegroup098.inc\"\n.include \"sound/voicegroups/voicegroup099.inc\"\n.include \"sound/voicegroups/voicegroup100.inc\"\n.include \"sound/voicegroups/voicegroup101.inc\"\n.include \"sound/voicegroups/voicegroup102.inc\"\n.include \"sound/voicegroups/voicegroup103.inc\"\n.include \"sound/voicegroups/voicegroup104.inc\"\n.include \"sound/voicegroups/voicegroup105.inc\"\n.include \"sound/voicegroups/voicegroup106.inc\"\n.include \"sound/voicegroups/voicegroup107.inc\"\n.include \"sound/voicegroups/voicegroup108.inc\"\n.include \"sound/voicegroups/voicegroup109.inc\"\n.include \"sound/voicegroups/voicegroup110.inc\"\n.include \"sound/voicegroups/voicegroup111.inc\"\n.include \"sound/voicegroups/voicegroup112.inc\"\n.include \"sound/voicegroups/voicegroup113.inc\"\n.include \"sound/voicegroups/voicegroup114.inc\"\n.include \"sound/voicegroups/voicegroup115.inc\"\n.include \"sound/voicegroups/voicegroup116.inc\"\n.include \"sound/voicegroups/voicegroup117.inc\"\n.include \"sound/voicegroups/voicegroup118.inc\"\n.include \"sound/voicegroups/voicegroup119.inc\"\n.include \"sound/voicegroups/voicegroup120.inc\"\n.include \"sound/voicegroups/voicegroup121.inc\"\n.include \"sound/voicegroups/voicegroup122.inc\"\n.include \"sound/voicegroups/voicegroup123.inc\"\n.include \"sound/voicegroups/voicegroup124.inc\"\n.include \"sound/voicegroups/voicegroup125.inc\"\n.include \"sound/voicegroups/voicegroup126.inc\"\n.include \"sound/voicegroups/voicegroup127.inc\"\n.include \"sound/voicegroups/voicegroup128.inc\"\n.include \"sound/cry_tables.inc\"\n.include \"sound/voicegroups/voicegroup129.inc\"\n.include \"sound/voicegroups/voicegroup130.inc\"\n.include \"sound/voicegroups/voicegroup131.inc\"\n.include \"sound/voicegroups/voicegroup132.inc\"\n.include \"sound/voicegroups/voicegroup133.inc\"\n.include \"sound/voicegroups/voicegroup134.inc\"\n.include \"sound/voicegroups/voicegroup135.inc\"\n.include \"sound/voicegroups/voicegroup136.inc\"\n.include \"sound/voicegroups/voicegroup137.inc\"\n.include \"sound/voicegroups/voicegroup138.inc\"\n.include \"sound/voicegroups/voicegroup139.inc\"\n.include \"sound/voicegroups/voicegroup140.inc\"\n.include \"sound/voicegroups/voicegroup141.inc\"\n.include \"sound/voicegroups/voicegroup142.inc\"\n.include \"sound/voicegroups/voicegroup143.inc\"\n.include \"sound/voicegroups/voicegroup144.inc\"\n.include \"sound/voicegroups/voicegroup145.inc\"\n.include \"sound/voicegroups/voicegroup146.inc\"\n.include \"sound/voicegroups/voicegroup147.inc\"\n.include \"sound/voicegroups/voicegroup148.inc\"\n.include \"sound/voicegroups/voicegroup149.inc\"\n.include \"sound/voicegroups/voicegroup150.inc\"\n.include \"sound/voicegroups/voicegroup151.inc\"\n.include \"sound/voicegroups/voicegroup152.inc\"\n.include \"sound/voicegroups/voicegroup153.inc\"\n.include \"sound/voicegroups/voicegroup154.inc\"\n.include \"sound/voicegroups/voicegroup155.inc\"\n.include \"sound/voicegroups/voicegroup156.inc\"\n.include \"sound/voicegroups/voicegroup157.inc\"\n.include \"sound/voicegroups/voicegroup158.inc\"\n.include \"sound/voicegroups/voicegroup159.inc\"\n.include \"sound/voicegroups/voicegroup160.inc\"\n.include \"sound/voicegroups/voicegroup161.inc\"\n.include \"sound/voicegroups/voicegroup162.inc\"\n.include \"sound/voicegroups/voicegroup163.inc\"\n.include \"sound/voicegroups/voicegroup164.inc\"\n.include \"sound/voicegroups/voicegroup165.inc\"\n.include \"sound/voicegroups/voicegroup166.inc\"\n.include \"sound/voicegroups/voicegroup167.inc\"\n.include \"sound/voicegroups/voicegroup168.inc\"\n.include \"sound/voicegroups/voicegroup169.inc\"\n.include \"sound/voicegroups/voicegroup170.inc\"\n.include \"sound/voicegroups/voicegroup171.inc\"\n.include \"sound/voicegroups/voicegroup172.inc\"\n.include \"sound/voicegroups/voicegroup173.inc\"\n.include \"sound/voicegroups/voicegroup174.inc\"\n.include \"sound/voicegroups/voicegroup175.inc\"\n.include \"sound/voicegroups/voicegroup176.inc\"\n.include \"sound/voicegroups/voicegroup177.inc\"\n.include \"sound/voicegroups/voicegroup178.inc\"\n.include \"sound/voicegroups/voicegroup179.inc\"\n.include \"sound/voicegroups/voicegroup180.inc\"\n.include \"sound/voicegroups/voicegroup181.inc\"\n.include \"sound/voicegroups/voicegroup182.inc\"\n.include \"sound/voicegroups/voicegroup183.inc\"\n.include \"sound/voicegroups/voicegroup184.inc\"\n.include \"sound/voicegroups/voicegroup185.inc\"\n.include \"sound/voicegroups/voicegroup186.inc\"\n.include \"sound/voicegroups/voicegroup187.inc\"\n.include \"sound/voicegroups/voicegroup188.inc\"\n.include \"sound/voicegroups/voicegroup189.inc\"\n.include \"sound/voicegroups/voicegroup190.inc\"\n.include \"sound/voicegroups/voicegroup191.inc\"\n"
  },
  {
    "path": "sound/voicegroups/voicegroup000.inc",
    "content": "\t.align 2\nvoicegroup000::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 0, 9, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 204, 193, 239\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup001.inc",
    "content": "\t.align 2\nvoicegroup001::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 1, 6, 0\n\tvoice_programmable_wave 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 6, 0\n\tvoice_square_2 60, 0, 3, 0, 1, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 0, 0, 1, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup002.inc",
    "content": "\t.align 2\nvoicegroup002::\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_oboe, 255, 165, 154, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_unused_sd90_oboe, 255, 165, 154, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_unused_guitar_separates_power_chord, 255, 165, 206, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 206, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_snare, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 255, 0\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_kick, 255, 0, 255, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242\n\tvoice_directsound 48, 44, DirectSoundWaveData_unused_sc55_tom, 255, 210, 77, 204\n\tvoice_directsound_no_resample 60, 79, DirectSoundWaveData_unknown_close_hihat, 255, 127, 0, 188\n\tvoice_directsound 51, 54, DirectSoundWaveData_unused_sc55_tom, 255, 216, 77, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 54, 64, DirectSoundWaveData_unused_sc55_tom, 255, 216, 77, 204\n\tvoice_directsound_no_resample 60, 79, DirectSoundWaveData_unknown_open_hihat, 255, 242, 141, 0\n\tvoice_directsound 57, 69, DirectSoundWaveData_unused_sc55_tom, 255, 210, 77, 204\n\tvoice_directsound 60, 79, DirectSoundWaveData_unused_sc55_tom, 255, 204, 77, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 62, 84, DirectSoundWaveData_unused_sc55_tom, 255, 204, 77, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 70, 49, DirectSoundWaveData_unknown_bell, 255, 165, 103, 231\n\tvoice_directsound_no_resample 32, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204\n\tvoice_directsound_no_resample 60, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 235, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216\n\tvoice_directsound_no_resample 30, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 72, 104, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 72, 94, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242\n\tvoice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242\n\tvoice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound_no_resample 64, 80, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242\n\tvoice_directsound 68, 34, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242\n\tvoice_directsound 72, 44, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242\n\tvoice_directsound 76, 84, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound 80, 94, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound_no_resample 33, 89, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound 84, 104, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound_no_resample 64, 24, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup003.inc",
    "content": "\t.align 2\nvoicegroup003::\n\tvoice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204\n\tvoice_directsound_no_resample 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188\n\tvoice_directsound_no_resample 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242\n\tvoice_directsound_no_resample 64, 29, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216\n\tvoice_directsound_no_resample 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188\n\tvoice_directsound_no_resample 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188\n\tvoice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188\n\tvoice_directsound_no_resample 64, 24, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0\n\tvoice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0\n\tvoice_directsound 50, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0\n\tvoice_directsound 64, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242\n\tvoice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242\n\tvoice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound_no_resample 64, 80, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242\n\tvoice_directsound 68, 34, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242\n\tvoice_directsound 72, 44, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 76, 84, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound 80, 94, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound_no_resample 33, 89, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound 64, 104, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound_no_resample 64, 24, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup004.inc",
    "content": "\t.align 2\nvoicegroup004::\n\tvoice_directsound_no_resample 66, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204\n\tvoice_directsound_no_resample 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188\n\tvoice_directsound_no_resample 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242\n\tvoice_directsound_no_resample 64, 29, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216\n\tvoice_directsound_no_resample 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 61, 84, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188\n\tvoice_directsound_no_resample 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188\n\tvoice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188\n\tvoice_directsound_no_resample 64, 24, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0\n\tvoice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0\n\tvoice_directsound 50, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0\n\tvoice_directsound 64, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0\n\tvoice_directsound 62, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242\n\tvoice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127\n\tvoice_directsound 65, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242\n\tvoice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound_no_resample 64, 80, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242\n\tvoice_directsound 68, 34, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242\n\tvoice_directsound 72, 44, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 76, 84, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound 80, 94, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound 56, 89, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound 64, 104, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound_no_resample 64, 24, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231\n\tvoice_directsound_no_resample 66, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204\n\tvoice_directsound 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188\n\tvoice_directsound 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242\n\tvoice_directsound 60, 29, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 58, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound 62, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216\n\tvoice_directsound 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0\n\tvoice_directsound 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0\n\tvoice_directsound 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_directsound 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 61, 84, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 255, 0\n\tvoice_directsound 64, 64, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188\n\tvoice_directsound 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188\n\tvoice_directsound 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0\n\tvoice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0\n\tvoice_directsound 50, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0\n\tvoice_directsound 64, 84, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup005.inc",
    "content": "\t.align 2\nvoicegroup005::\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_48, 255, 252, 0, 239\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_60, 255, 250, 0, 221\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_72, 255, 250, 0, 221\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_piano1_84, 255, 247, 0, 221\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup006.inc",
    "content": "\t.align 2\nvoicegroup006::\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_60, 255, 0, 255, 196\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_72, 255, 0, 255, 196\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_84, 255, 0, 255, 196\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup007.inc",
    "content": "\t.align 2\nvoicegroup007::\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_trumpet_60, 255, 0, 193, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_trumpet_72, 255, 0, 193, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_trumpet_84, 255, 0, 193, 127\n\tvoice_square_1_alt 60, 0, 38, 2, 1, 0, 0, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 36, 2, 0, 1, 4, 2\n\tvoice_square_1_alt 60, 0, 21, 2, 0, 0, 15, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup008.inc",
    "content": "\t.align 2\nvoicegroup008::\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tuba_39, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tuba_51, 255, 0, 255, 165\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup009.inc",
    "content": "\t.align 2\nvoicegroup009::\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_french_horn_60, 255, 0, 224, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_french_horn_72, 255, 0, 218, 165\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup010.inc",
    "content": "\t.align 2\nvoicegroup010::\n\tvoice_keysplit_all voicegroup031\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 3, 0, 4, 0, 1\n\tvoice_square_1 60, 0, 0, 3, 0, 4, 0, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 3, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 3, 0, 0, 7, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup011.inc",
    "content": "\t.align 2\nvoicegroup011::\n\tvoice_keysplit_all voicegroup022\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 4, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 3, 0, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 3, 0, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 3, 0, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 1, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 1, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup012.inc",
    "content": "\t.align 2\nvoicegroup012::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 255, 178, 180, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 29, 2, 0, 2, 0, 0\n\tvoice_square_1_alt 60, 0, 22, 2, 0, 2, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup013.inc",
    "content": "\t.align 2\nvoicegroup013::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 0, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup014.inc",
    "content": "\t.align 2\nvoicegroup014::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 6, 1\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 6, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup015.inc",
    "content": "\t.align 2\nvoicegroup015::\n\tvoice_keysplit_all voicegroup016\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 3, 0, 2, 0, 0\n\tvoice_square_1 60, 0, 0, 3, 0, 2, 0, 0\n\tvoice_square_2 60, 0, 3, 0, 6, 0, 0\n\tvoice_square_1 60, 0, 0, 3, 0, 6, 0, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup016.inc",
    "content": "\t.align 2\nvoicegroup016::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 0, 2\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 1\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_kick, 255, 0, 255, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 32, 74, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 72, 66, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 72, 62, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup017.inc",
    "content": "\t.align 2\nvoicegroup017::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_2_alt 60, 0, 2, 0, 3, 3, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 3, 3, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 7, 2\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 2\n\tvoice_square_2_alt 60, 0, 2, 1, 1, 0, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 1, 1, 0, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 1, 1, 7, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2\n\tvoice_square_1_alt 60, 0, 0, 2, 1, 1, 7, 2\n\tvoice_square_2_alt 60, 0, 3, 1, 1, 7, 2\n\tvoice_square_1_alt 60, 0, 0, 3, 1, 1, 7, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 3\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 2\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 2\n\tvoice_square_2_alt 60, 0, 1, 1, 2, 6, 2\n\tvoice_square_1_alt 60, 0, 0, 1, 1, 2, 6, 2\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 0, 6, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup018.inc",
    "content": "\t.align 2\nvoicegroup018::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 0, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 1, 0, 1, 0, 3\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup019.inc",
    "content": "\t.align 2\nvoicegroup019::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 6, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 2\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 0, 7, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup020.inc",
    "content": "\t.align 2\nvoicegroup020::\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 7, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 6, 2\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 6, 2\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 0, 6, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 7, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup021.inc",
    "content": "\t.align 2\nvoicegroup021::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 0, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 6, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 0, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup022.inc",
    "content": "\t.align 2\nvoicegroup022::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 7, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 0, 7, 0\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_kick, 255, 0, 255, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 32, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 72, 67, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 72, 61, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup023.inc",
    "content": "\t.align 2\nvoicegroup023::\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 7, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 6, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 7, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup024.inc",
    "content": "\t.align 2\nvoicegroup024::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 7, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 0, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 7, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup025.inc",
    "content": "\t.align 2\nvoicegroup025::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup026.inc",
    "content": "\t.align 2\nvoicegroup026::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 9, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 9, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 7, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup027.inc",
    "content": "\t.align 2\nvoicegroup027::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 1, 0, 2, 0, 0\n\tvoice_square_1 60, 0, 0, 1, 0, 2, 0, 0\n\tvoice_square_2 60, 0, 1, 0, 6, 0, 0\n\tvoice_square_1 60, 0, 0, 1, 0, 6, 0, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 4, 1, 4\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup028.inc",
    "content": "\t.align 2\nvoicegroup028::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 3, 0, 1, 0, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 0, 0, 2, 0, 0\n\tvoice_square_1 60, 0, 0, 0, 0, 2, 0, 0\n\tvoice_square_2 60, 0, 0, 0, 6, 0, 0\n\tvoice_square_1 60, 0, 0, 0, 0, 6, 0, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 2, 0, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_2 60, 0, 3, 0, 4, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup029.inc",
    "content": "\t.align 2\nvoicegroup029::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 0, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 7, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 0, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 0, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup030.inc",
    "content": "\t.align 2\nvoicegroup030::\n\tvoice_keysplit_all voicegroup031\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 4, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 37, 165, 180, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup031.inc",
    "content": "\t.align 2\nvoicegroup031::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 165, 154, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 32, 49, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 30, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 72, 79, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 72, 74, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup032.inc",
    "content": "\t.align 2\nvoicegroup032::\n\tvoice_keysplit_all voicegroup016\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 3, 4, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 3, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 250, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\tvoice_noise_alt 60, 0, 0, 0, 4, 1, 4\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup033.inc",
    "content": "\t.align 2\nvoicegroup033::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup034.inc",
    "content": "\t.align 2\nvoicegroup034::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 1, 4, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave 60, 0, ProgrammableWaveData_16, 0, 7, 15, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup035.inc",
    "content": "\t.align 2\nvoicegroup035::\n\tvoice_keysplit_all voicegroup031\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 6, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 0, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup036.inc",
    "content": "\t.align 2\nvoicegroup036::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 6, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 4, 1, 4\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup037.inc",
    "content": "\t.align 2\nvoicegroup037::\n\tvoice_keysplit_all voicegroup031\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 0, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup038.inc",
    "content": "\t.align 2\nvoicegroup038::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup039.inc",
    "content": "\t.align 2\nvoicegroup039::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup040.inc",
    "content": "\t.align 2\nvoicegroup040::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup041.inc",
    "content": "\t.align 2\nvoicegroup041::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup042.inc",
    "content": "\t.align 2\nvoicegroup042::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup043.inc",
    "content": "\t.align 2\nvoicegroup043::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup044.inc",
    "content": "\t.align 2\nvoicegroup044::\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 5, 1, 7\n\tvoice_square_2_alt 60, 0, 3, 0, 4, 3, 6\n\tvoice_square_2_alt 60, 0, 2, 1, 1, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 224\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup045.inc",
    "content": "\t.align 2\nvoicegroup045::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 0, 1\n\tvoice_square_1_alt 60, 0, 0, 3, 1, 2, 6, 0\n\tvoice_square_2_alt 60, 0, 3, 1, 2, 6, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 0, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 1, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup046.inc",
    "content": "\t.align 2\nvoicegroup046::\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 1, 12, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 1, 1, 9, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 6, 3\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 216\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 6, 3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup047.inc",
    "content": "\t.align 2\nvoicegroup047::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 204, 193, 239\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 6, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 1, 7, 15, 2\n\tvoice_square_2_alt 60, 0, 1, 1, 1, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 1, 1, 2, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 6, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup048.inc",
    "content": "\t.align 2\nvoicegroup048::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 7, 3, 3\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 204, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 239\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 4, 4, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 3, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 3, 3, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 12, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 2, 4, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup049.inc",
    "content": "\t.align 2\nvoicegroup049::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1\n\tvoice_square_2_alt 60, 0, 1, 1, 3, 4, 2\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 1, 7, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 4, 2\n\tvoice_square_2_alt 60, 0, 1, 1, 3, 4, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 1, 4, 4, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup050.inc",
    "content": "\t.align 2\nvoicegroup050::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup051.inc",
    "content": "\t.align 2\nvoicegroup051::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 1, 4, 4, 2\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 3, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 1, 3, 4, 2\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 3, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup052.inc",
    "content": "\t.align 2\nvoicegroup052::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 3, 1, 2, 6, 0\n\tvoice_square_2 60, 0, 3, 1, 2, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 6, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 7, 6, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 9, 4\n\tvoice_noise_alt 60, 0, 0, 3, 1, 10, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup053.inc",
    "content": "\t.align 2\nvoicegroup053::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup054.inc",
    "content": "\t.align 2\nvoicegroup054::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 5, 2\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup055.inc",
    "content": "\t.align 2\nvoicegroup055::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 204, 193, 239\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 6, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 7, 15, 2\n\tvoice_square_2_alt 60, 0, 1, 1, 1, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup056.inc",
    "content": "\t.align 2\nvoicegroup056::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup057.inc",
    "content": "\t.align 2\nvoicegroup057::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 188, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 128, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_bubbles, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 1, 4, 10, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 1, 5, 9, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup058.inc",
    "content": "\t.align 2\nvoicegroup058::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup059.inc",
    "content": "\t.align 2\nvoicegroup059::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 1, 1, 6, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 6, 2\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 6, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 1, 1, 2, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 6, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup060.inc",
    "content": "\t.align 2\nvoicegroup060::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 128, 226, 0, 38\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 1, 1, 6, 1\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 4, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 7, 3, 3\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 7, 3, 3\n\tvoice_square_1_alt 60, 0, 0, 3, 2, 2, 7, 0\n\tvoice_square_2_alt 60, 0, 1, 1, 2, 3, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup061.inc",
    "content": "\t.align 2\nvoicegroup061::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup062.inc",
    "content": "\t.align 2\nvoicegroup062::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup063.inc",
    "content": "\t.align 2\nvoicegroup063::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup064.inc",
    "content": "\t.align 2\nvoicegroup064::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup065.inc",
    "content": "\t.align 2\nvoicegroup065::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup066.inc",
    "content": "\t.align 2\nvoicegroup066::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 3\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup067.inc",
    "content": "\t.align 2\nvoicegroup067::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup068.inc",
    "content": "\t.align 2\nvoicegroup068::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 2, 3, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 3, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup069.inc",
    "content": "\t.align 2\nvoicegroup069::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup070.inc",
    "content": "\t.align 2\nvoicegroup070::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup071.inc",
    "content": "\t.align 2\nvoicegroup071::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup072.inc",
    "content": "\t.align 2\nvoicegroup072::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup073.inc",
    "content": "\t.align 2\nvoicegroup073::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup074.inc",
    "content": "\t.align 2\nvoicegroup074::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup075.inc",
    "content": "\t.align 2\nvoicegroup075::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 3, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup076.inc",
    "content": "\t.align 2\nvoicegroup076::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup077.inc",
    "content": "\t.align 2\nvoicegroup077::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 196\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup078.inc",
    "content": "\t.align 2\nvoicegroup078::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 196\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 0, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup079.inc",
    "content": "\t.align 2\nvoicegroup079::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 6, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 6, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 1\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 6, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 5\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 4, 4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 6, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup080.inc",
    "content": "\t.align 2\nvoicegroup080::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup081.inc",
    "content": "\t.align 2\nvoicegroup081::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup082.inc",
    "content": "\t.align 2\nvoicegroup082::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 2, 4, 1\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 6, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 4, 4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup083.inc",
    "content": "\t.align 2\nvoicegroup083::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 72, 249\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 6, 4\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 2, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup084.inc",
    "content": "\t.align 2\nvoicegroup084::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup085.inc",
    "content": "\t.align 2\nvoicegroup085::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 1, 2, 4, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 13, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup086.inc",
    "content": "\t.align 2\nvoicegroup086::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup087.inc",
    "content": "\t.align 2\nvoicegroup087::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup088.inc",
    "content": "\t.align 2\nvoicegroup088::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 1, 1, 6, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 6, 2\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 1, 1, 1, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 6, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup089.inc",
    "content": "\t.align 2\nvoicegroup089::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 3\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 4, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup090.inc",
    "content": "\t.align 2\nvoicegroup090::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 2, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup091.inc",
    "content": "\t.align 2\nvoicegroup091::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 72, 249\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 226, 0, 38\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 5, 2\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 5, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 7, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 2, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup092.inc",
    "content": "\t.align 2\nvoicegroup092::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 7, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup093.inc",
    "content": "\t.align 2\nvoicegroup093::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 7, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup094.inc",
    "content": "\t.align 2\nvoicegroup094::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 72, 249\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 7, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup095.inc",
    "content": "\t.align 2\nvoicegroup095::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 3\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup096.inc",
    "content": "\t.align 2\nvoicegroup096::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup097.inc",
    "content": "\t.align 2\nvoicegroup097::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 249\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 7, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup098.inc",
    "content": "\t.align 2\nvoicegroup098::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 7, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_10, 255, 255, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup099.inc",
    "content": "\t.align 2\nvoicegroup099::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 7, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 2, 1, 5, 0\n\tvoice_square_2_alt 60, 0, 1, 2, 1, 5, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup100.inc",
    "content": "\t.align 2\nvoicegroup100::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 1, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 1, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup101.inc",
    "content": "\t.align 2\nvoicegroup101::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 1, 5, 2, 4\n\tvoice_square_2_alt 60, 0, 1, 1, 5, 2, 4\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 1, 2, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 1, 1, 6, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 4, 6, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 1, 4, 6, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 1, 2, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 1, 1, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup102.inc",
    "content": "\t.align 2\nvoicegroup102::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 248\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 6, 0, 6\n\tvoice_square_2_alt 60, 0, 2, 0, 6, 0, 6\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup103.inc",
    "content": "\t.align 2\nvoicegroup103::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 1, 1, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 0, 10, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup104.inc",
    "content": "\t.align 2\nvoicegroup104::\n\tvoice_keysplit_all voicegroup003\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_koto_high, 255, 0, 206, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_shakuhachi, 255, 0, 255, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 2, 0, 12, 5\n\tvoice_square_2_alt 60, 0, 0, 0, 0, 10, 4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 2, 0, 12, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_koto_low, 255, 0, 206, 242\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup105.inc",
    "content": "\t.align 2\nvoicegroup105::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 9, 4\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 9, 4\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup106.inc",
    "content": "\t.align 2\nvoicegroup106::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 64, 38, 128, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup107.inc",
    "content": "\t.align 2\nvoicegroup107::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup108.inc",
    "content": "\t.align 2\nvoicegroup108::\n\tvoice_keysplit_all voicegroup004\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_heart_of_asia_gamelan, 255, 188, 139, 239\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 13, 4\n\tvoice_square_2_alt 60, 0, 0, 0, 0, 9, 2\n\tvoice_square_2_alt 60, 0, 1, 0, 0, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup109.inc",
    "content": "\t.align 2\nvoicegroup109::\n\tvoice_keysplit_all voicegroup004\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_church_organ3_low, 255, 76, 154, 188\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_church_organ3_high, 255, 76, 154, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 0, 13, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 0, 12, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup110.inc",
    "content": "\t.align 2\nvoicegroup110::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 239\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 1, 1, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 0, 10, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup111.inc",
    "content": "\t.align 2\nvoicegroup111::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 226\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 195\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 195\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 195\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup112.inc",
    "content": "\t.align 2\nvoicegroup112::\n\tvoice_keysplit_all voicegroup003\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 76\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 128, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 128, 165, 128, 188\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_female_voice, 128, 165, 128, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_unused_unknown_male_voice, 128, 165, 128, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 0, 7, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 0, 6, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 0, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 7, 10, 1\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup113.inc",
    "content": "\t.align 2\nvoicegroup113::\n\tvoice_keysplit_all voicegroup002\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_23, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_25, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_24, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_22, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_9, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_10, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_11, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_12, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_13, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 195\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 180, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 7, 7, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 7, 7, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 7, 7, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 7, 7, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 7, 7, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 7, 7, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 7, 7, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 7, 7, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup114.inc",
    "content": "\t.align 2\nvoicegroup114::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 3, 0, 0, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup115.inc",
    "content": "\t.align 2\nvoicegroup115::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 128, 249, 0, 188\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 188, 103, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 165, 154, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 198\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 146\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 165, 180, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 6, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 3, 6, 2\n\tvoice_square_2_alt 60, 0, 0, 0, 2, 6, 5\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 1, 9, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 6, 3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 2\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup116.inc",
    "content": "\t.align 2\nvoicegroup116::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 6, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 190, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 180, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2\n\tvoice_square_2_alt 60, 0, 3, 0, 3, 3, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 3, 6, 5\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 7, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_21, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 6, 3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup117.inc",
    "content": "\t.align 2\nvoicegroup117::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 1, 1, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 1, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 3, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup118.inc",
    "content": "\t.align 2\nvoicegroup118::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 0, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 0, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 250, 0, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 0, 255, 127\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup119.inc",
    "content": "\t.align 2\nvoicegroup119::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 0, 0, 2, 4, 1\n\tvoice_square_1 60, 0, 0, 0, 0, 2, 4, 1\n\tvoice_square_2 60, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 60, 0, DirectSoundWaveData_sc88pro_timpani_with_snare, 255, 246, 0, 226\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 7, 1\n\tvoice_square_2 60, 0, 1, 0, 1, 9, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup120.inc",
    "content": "\t.align 2\nvoicegroup120::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 2, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 2, 6, 1\n\tvoice_square_2 60, 0, 3, 0, 2, 4, 1\n\tvoice_square_1 60, 0, 0, 3, 0, 2, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 7, 1\n\tvoice_square_2 60, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 3, 0, 0, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup121.inc",
    "content": "\t.align 2\nvoicegroup121::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 7, 1\n\tvoice_square_2 60, 0, 0, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 0, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 0, 0, 0, 7, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup122.inc",
    "content": "\t.align 2\nvoicegroup122::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 1, 0, 1, 6, 1\n\tvoice_square_1 60, 0, 0, 1, 0, 1, 6, 1\n\tvoice_square_2 60, 0, 2, 0, 1, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 165, 154, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 3, 0, 1, 9, 1\n\tvoice_square_1 60, 0, 0, 3, 0, 0, 9, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup123.inc",
    "content": "\t.align 2\nvoicegroup123::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 216, 90, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 3, 0, 0, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup124.inc",
    "content": "\t.align 2\nvoicegroup124::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 2, 3, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 2, 3, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 3, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 1, 7, 1\n\tvoice_square_2 60, 0, 3, 0, 2, 7, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup125.inc",
    "content": "\t.align 2\nvoicegroup125::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 2, 0, 2, 3, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 3, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 3, 0, 0, 7, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup126.inc",
    "content": "\t.align 2\nvoicegroup126::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 0, 1, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 0, 1, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 0, 0, 0, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 235, 128, 99\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2 60, 0, 3, 1, 1, 6, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 3, 1, 1, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 216\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 246, 0, 216\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup127.inc",
    "content": "\t.align 2\nvoicegroup127::\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_synth_snare, 255, 249, 103, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 0, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 4, 0, 1\n\tvoice_square_1_alt 60, 0, 44, 2, 0, 4, 0, 0\n\tvoice_square_1_alt 60, 0, 38, 0, 0, 4, 0, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 7, 0, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 2, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 2, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 23, 1, 0, 1, 9, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 226, 0, 165\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 6, 0, 1\n\tvoice_square_1_alt 60, 0, 36, 0, 0, 2, 0, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 0, 1\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 0, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 46, 2, 0, 4, 0, 0\n\tvoice_square_1_alt 60, 0, 38, 2, 0, 4, 0, 0\n\tvoice_square_1_alt 60, 0, 119, 2, 0, 0, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 1\n\tvoice_square_1_alt 60, 0, 106, 2, 0, 2, 0, 0\n\tvoice_square_1_alt 60, 0, 23, 2, 0, 1, 9, 0\n\tvoice_square_1_alt 60, 0, 21, 2, 0, 1, 9, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 0, 15, 1\n\tvoice_square_1_alt 60, 0, 47, 2, 0, 2, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise 60, 0, 0, 0, 7, 15, 0\n\tvoice_noise 60, 0, 0, 2, 7, 15, 0\n\tvoice_noise_alt 60, 0, 0, 2, 0, 15, 0\n\tvoice_noise_alt 60, 0, 1, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 3, 0, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 0, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup128.inc",
    "content": "\t.align 2\nvoicegroup128::\n\tvoice_directsound_no_resample 60, 0, DirectSoundWaveData_bicycle_bell, 255, 249, 0, 165\n\tvoice_directsound_alt 60, 0, DirectSoundWaveData_bicycle_bell, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_synth_snare, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 242, 0, 127\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 1\n\tvoice_noise_alt 60, 0, 1, 0, 1, 0, 1\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 255, 165\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 1\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_1, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_2, 255, 0, 255, 127\n\tvoice_noise_alt 60, 0, 1, 0, 2, 0, 0\n\tvoice_square_1 60, 0, 103, 3, 2, 7, 0, 0\n\tvoice_square_2 60, 0, 3, 2, 7, 0, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 226, 0, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_3, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 204, 0, 127\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 1\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_4, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 103, 0, 0, 7, 0, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_wind, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_bubbles, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 127\n\tvoice_noise_alt 60, 0, 0, 0, 7, 15, 1\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_5, 255, 0, 255, 127\n\tvoice_noise_alt 60, 0, 1, 0, 7, 15, 1\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 246, 0, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_6, 255, 0, 255, 127\n\tvoice_square_1_alt 60, 0, 19, 2, 0, 2, 0, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 103, 0, 0, 0, 15, 0\n\tvoice_directsound_alt 60, 0, DirectSoundWaveData_unknown_6, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 255, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_7, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 255, 242, 0, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_8, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_close_hihat, 255, 127, 0, 188\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_9, 255, 249, 0, 165\n\tvoice_square_1 60, 0, 0, 0, 4, 6, 0, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 13, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 13, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_trinity_big_boned, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 252, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 0, 4, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 188, 0, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 226, 0, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 26, 0, 255, 127\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 0, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 252, 0, 127\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 0, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 127, 0, 127\n\tvoice_noise_alt 60, 0, 0, 1, 6, 0, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_slap_bass, 255, 255, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_10, 255, 255, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_french_horn_72, 11, 242, 0, 127\n\tvoice_square_1_alt 60, 0, 0, 2, 4, 6, 0, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_11, 255, 255, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_unused_sc55_tom, 255, 0, 255, 165\n\tvoice_noise_alt 60, 0, 0, 5, 7, 15, 1\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 128, 242, 0, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_string_ensemble_72, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 0, 1, 5, 0, 0\n\tvoice_noise_alt 60, 0, 0, 6, 6, 0, 1\n\tvoice_noise_alt 60, 0, 0, 3, 6, 0, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_trinity_30303_mega_bass, 15, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_12, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_13, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_14, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_15, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_16, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_17, 255, 0, 255, 165\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup129.inc",
    "content": "\t.align 2\nvoicegroup129::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 226, 25, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_1, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_open_triangle, 255, 204, 128, 249\n\tvoice_directsound 60, 0, DirectSoundWaveData_register_noise, 255, 0, 255, 76\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_18, 255, 0, 206, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 206, 38\n\tvoice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 206, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 252, 0, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 204, 0, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 10, 4\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 0, 10, 3\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 10, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 0, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 6\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 29, 2, 0, 2, 0, 0\n\tvoice_square_1_alt 60, 0, 22, 2, 0, 2, 0, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 9, 2\n\tvoice_noise_alt 60, 0, 0, 0, 4, 3, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 12, 0\n\tvoice_noise_alt 60, 0, 1, 0, 1, 9, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup130.inc",
    "content": "\t.align 2\nvoicegroup130::\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_1, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_2, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_3, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_4, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_5, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_6, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_7, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_8, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_9, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_10, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_11, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_12, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_13, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_14, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_15, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_16, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_17, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_18, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_19, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_20, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_21, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_22, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_23, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_24, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_25, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_26, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_27, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_28, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_29, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_30, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_31, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_32, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_33, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_34, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_35, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_36, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_37, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_38, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_39, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_40, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_41, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_42, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_43, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_44, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_45, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_46, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_47, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_48, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_49, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_50, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_Phoneme_51, 255, 0, 255, 0\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion_duplicate, 255, 249, 25, 248\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 7, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup131.inc",
    "content": "\t.align 2\nvoicegroup131::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_directsound 60, 0, DirectSoundWaveData_steinway_b_piano, 128, 204, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 5\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 6, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 9, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup132.inc",
    "content": "\t.align 2\nvoicegroup132::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 118, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 51, 204, 92, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 165, 154, 235\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 4, 2, 2\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 7, 5\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 4, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 4, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 4, 2, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 2, 9, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 8, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup133.inc",
    "content": "\t.align 2\nvoicegroup133::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 108, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 9, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 9, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 1, 0, 9, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 8, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup134.inc",
    "content": "\t.align 2\nvoicegroup134::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 7, 1\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup135.inc",
    "content": "\t.align 2\nvoicegroup135::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 85, 137, 180, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 9, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 0, 9, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 1, 2, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup136.inc",
    "content": "\t.align 2\nvoicegroup136::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 5, 0, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 5, 0, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 2, 4, 10, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 5, 0, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 5, 0, 0\n\tvoice_square_2_alt 60, 0, 3, 2, 4, 10, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 1, 5, 0, 3\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 1, 5, 0, 3\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 10, 2\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 10, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup137.inc",
    "content": "\t.align 2\nvoicegroup137::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 165, 180, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 137, 154, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 204, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 0, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1\n\tvoice_square_2_alt 60, 0, 1, 1, 2, 3, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 2, 4, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 2, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup138.inc",
    "content": "\t.align 2\nvoicegroup138::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226\n\tvoice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 6, 3\n\tvoice_square_2_alt 60, 0, 0, 0, 2, 6, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup139.inc",
    "content": "\t.align 2\nvoicegroup139::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 127, 103, 201\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 37, 127, 77, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 51, 204, 92, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 7, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup140.inc",
    "content": "\t.align 2\nvoicegroup140::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 2, 3, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 3, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup141.inc",
    "content": "\t.align 2\nvoicegroup141::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 7, 3\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 6, 5\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 1, 7, 0, 6\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 2, 9, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup142.inc",
    "content": "\t.align 2\nvoicegroup142::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 64, 188, 128, 201\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 195, 103, 220\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 128, 195, 72, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 85, 188, 103, 160\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 128, 188, 77, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 175, 154, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 4\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 5, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 7, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup143.inc",
    "content": "\t.align 2\nvoicegroup143::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 160, 123, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 3, 2\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 9, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup144.inc",
    "content": "\t.align 2\nvoicegroup144::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 85, 188, 92, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 85, 127, 180, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 51, 204, 92, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 4, 2\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 9, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup145.inc",
    "content": "\t.align 2\nvoicegroup145::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226\n\tvoice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2\n\tvoice_square_2_alt 60, 0, 3, 0, 0, 9, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 2, 6, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup146.inc",
    "content": "\t.align 2\nvoicegroup146::\n\tvoice_keysplit_all voicegroup002\n\tvoice_directsound 60, 0, DirectSoundWaveData_steinway_b_piano, 255, 165, 103, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 249, 25, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 43, 76, 103, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 4, 4\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 9, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup147.inc",
    "content": "\t.align 2\nvoicegroup147::\n\tvoice_keysplit_all voicegroup001\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 249, 25, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 6, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 0, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 2, 4, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup148.inc",
    "content": "\t.align 2\nvoicegroup148::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 226, 0, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 12, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 0, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 3, 5, 2\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 5\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup149.inc",
    "content": "\t.align 2\nvoicegroup149::\n\tvoice_keysplit_all voicegroup190\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 165, 154, 153\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_oboe, 43, 188, 103, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_unused_sd90_oboe, 43, 165, 103, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 2\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 6, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup150.inc",
    "content": "\t.align 2\nvoicegroup150::\n\tvoice_keysplit_all voicegroup002\n\tvoice_directsound 60, 0, DirectSoundWaveData_steinway_b_piano, 255, 165, 103, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 85, 204, 77, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 4, 6\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup151.inc",
    "content": "\t.align 2\nvoicegroup151::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 127\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup152.inc",
    "content": "\t.align 2\nvoicegroup152::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 160, 175, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 127, 154, 235\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 4, 2, 1\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 5, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 4, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 4, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 2, 9, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup153.inc",
    "content": "\t.align 2\nvoicegroup153::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 127, 154, 235\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 3, 5, 2\n\tvoice_square_2_alt 60, 0, 3, 0, 3, 4, 2\n\tvoice_square_2_alt 60, 0, 0, 0, 2, 6, 5\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 6, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_8, 0, 1, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup154.inc",
    "content": "\t.align 2\nvoicegroup154::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 97, 236\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 127, 154, 235\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 0, 10, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 0, 10, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_4, 0, 0, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 0, 12, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup155.inc",
    "content": "\t.align 2\nvoicegroup155::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 188, 103, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 165, 154, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 165, 180, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2\n\tvoice_square_2_alt 60, 0, 3, 0, 3, 6, 2\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 6, 5\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 3, 6, 5\n\tvoice_square_2_alt 60, 0, 0, 0, 2, 6, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_3, 0, 7, 15, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 1, 9, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 6, 3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 2\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup156.inc",
    "content": "\t.align 2\nvoicegroup156::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 4, 4, 4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 180, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 7, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 3, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 7, 5\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 2, 6, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup157.inc",
    "content": "\t.align 2\nvoicegroup157::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 6, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 190, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_unused_sc88pro_unison_slap, 255, 165, 180, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 7, 2\n\tvoice_square_2_alt 60, 0, 3, 0, 3, 3, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 3, 6, 5\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 7, 2\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 6, 3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup158.inc",
    "content": "\t.align 2\nvoicegroup158::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 108, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 236, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 9, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 10, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 1, 0, 9, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 8, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup159.inc",
    "content": "\t.align 2\nvoicegroup159::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 64, 249, 0, 188\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 51, 249, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 7, 0, 6\n\tvoice_square_2_alt 60, 0, 1, 1, 5, 1, 6\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 1, 7, 0, 6\n\tvoice_square_1_alt 60, 0, 0, 0, 1, 4, 3, 6\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup160.inc",
    "content": "\t.align 2\nvoicegroup160::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 4, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup161.inc",
    "content": "\t.align 2\nvoicegroup161::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 4\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 6, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 6, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup162.inc",
    "content": "\t.align 2\nvoicegroup162::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 64, 188, 108, 244\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 64, 195, 92, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 64, 204, 113, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 0, 6, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 0, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup163.inc",
    "content": "\t.align 2\nvoicegroup163::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226\n\tvoice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_unknown_18, 255, 0, 206, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 5, 2\n\tvoice_square_2_alt 60, 0, 3, 0, 3, 4, 2\n\tvoice_square_2_alt 60, 0, 0, 0, 2, 6, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 0, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup164.inc",
    "content": "\t.align 2\nvoicegroup164::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 128, 180, 108, 209\n\tvoice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 85, 204, 77, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 10, 6\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 6, 2\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 4\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 0, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup165.inc",
    "content": "\t.align 2\nvoicegroup165::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_glockenspiel, 255, 165, 51, 242\n\tvoice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 37, 165, 103, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 204, 92, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 10, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 6, 6\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_enhanced_delay_shaku, 255, 191, 97, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 9, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup166.inc",
    "content": "\t.align 2\nvoicegroup166::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 128, 146, 108, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 204, 103, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 255, 0, 255, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 153\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 236, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 9, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 9, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 1, 0, 9, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 8, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup167.inc",
    "content": "\t.align 2\nvoicegroup167::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 10, 4\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 8, 3\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 6, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 0, 6, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup168.inc",
    "content": "\t.align 2\nvoicegroup168::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226\n\tvoice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 4, 2\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 6, 4\n\tvoice_square_2_alt 60, 0, 0, 0, 2, 6, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 0, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup169.inc",
    "content": "\t.align 2\nvoicegroup169::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 210\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 4, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 4, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 1, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 4, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup170.inc",
    "content": "\t.align 2\nvoicegroup170::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 7, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 1, 7, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup171.inc",
    "content": "\t.align 2\nvoicegroup171::\n\tvoice_keysplit_all voicegroup001\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 1, 7, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 1, 7, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 0, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 7, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 1, 7, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 0, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 0, 7, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_6, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_7, 0, 7, 15, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup172.inc",
    "content": "\t.align 2\nvoicegroup172::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226\n\tvoice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 255, 204, 77, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 5, 2\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 6, 3\n\tvoice_square_2_alt 60, 0, 0, 0, 2, 6, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_14, 0, 0, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup173.inc",
    "content": "\t.align 2\nvoicegroup173::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226\n\tvoice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 128, 204, 77, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 51, 0, 203, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 216, 51, 224\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 3, 4\n\tvoice_square_2_alt 60, 0, 3, 0, 3, 3, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 3, 2\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup174.inc",
    "content": "\t.align 2\nvoicegroup174::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 128, 0, 255, 214\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 128, 0, 255, 206\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 209\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 2, 3, 4\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 3, 4\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 2, 3, 4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_2, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 3, 1\n\tvoice_keysplit_all voicegroup177\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 9, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 9, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 154, 127\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 3, 1\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup175.inc",
    "content": "\t.align 2\nvoicegroup175::\n\tvoice_keysplit_all voicegroup177\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 165, 154, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup176.inc",
    "content": "\t.align 2\nvoicegroup176::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 7, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 9, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup177.inc",
    "content": "\t.align 2\nvoicegroup177::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0\n\tvoice_directsound_no_resample 67, 71, DirectSoundWaveData_sd90_solo_snare, 255, 180, 175, 228\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_solo_snare, 255, 0, 255, 242\n\tvoice_directsound_no_resample 65, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242\n\tvoice_directsound 64, 24, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 68, 29, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242\n\tvoice_directsound 72, 64, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 76, 39, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound 80, 89, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 226\n\tvoice_directsound_no_resample 33, 10, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound 84, 104, DirectSoundWaveData_sd90_ambient_tom, 255, 0, 255, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242\n\tvoice_directsound_no_resample 64, 118, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0\n\tvoice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0\n\tvoice_directsound 50, 64, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0\n\tvoice_directsound 64, 64, DirectSoundWaveData_ethnic_flavours_kotsuzumi, 255, 0, 255, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup178.inc",
    "content": "\t.align 2\nvoicegroup178::\n\tvoice_keysplit_all voicegroup177\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 204, 103, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 154, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 7, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 7, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 0, 15, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup179.inc",
    "content": "\t.align 2\nvoicegroup179::\n\tvoice_keysplit_all voicegroup177\n\tvoice_keysplit_all voicegroup176\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_xylophone, 255, 235, 0, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 85, 165, 154, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 0, 10, 0\n\tvoice_square_2_alt 60, 0, 0, 0, 1, 9, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 1, 9, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup180.inc",
    "content": "\t.align 2\nvoicegroup180::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 64, 249, 0, 188\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 249, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 3, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 3, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 255, 255, 127\n\tvoice_noise_alt 60, 0, 0, 0, 1, 0, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup181.inc",
    "content": "\t.align 2\nvoicegroup181::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 242, 51, 242\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup182.inc",
    "content": "\t.align 2\nvoicegroup182::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 0, 193, 76\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup008, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 1, 2, 3, 1\n\tvoice_square_2_alt 60, 0, 1, 0, 2, 6, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 3, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup183.inc",
    "content": "\t.align 2\nvoicegroup183::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 4, 1\n\tvoice_square_2_alt 60, 0, 2, 0, 2, 4, 1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 3, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup184.inc",
    "content": "\t.align 2\nvoicegroup184::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 255, 0, 255, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup185.inc",
    "content": "\t.align 2\nvoicegroup185::\n\tvoice_keysplit_all voicegroup002\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_overdrive_guitar, 128, 0, 255, 214\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_high, 128, 0, 255, 206\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fingered_bass, 255, 253, 0, 149\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_synth_bass, 255, 252, 0, 115\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_pizzicato_strings, 255, 216, 0, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_timpani, 255, 246, 0, 226\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_classical_choir_voice_ahhs, 85, 0, 154, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_distortion_guitar_low, 255, 0, 255, 209\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_whistle, 255, 0, 255, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_16, 0, 7, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_15, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_5, 0, 7, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup186.inc",
    "content": "\t.align 2\nvoicegroup186::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_2_alt 60, 0, 3, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup187.inc",
    "content": "\t.align 2\nvoicegroup187::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 255, 76, 133, 137\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 64, 188, 108, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 249, 25, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 246, 0, 235\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup007, KeySplitTable3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup009, KeySplitTable5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 2\n\tvoice_square_2_alt 60, 0, 1, 0, 1, 7, 1\n\tvoice_square_2_alt 60, 0, 0, 0, 2, 6, 5\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 0, 12, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 6, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup188.inc",
    "content": "\t.align 2\nvoicegroup188::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226\n\tvoice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 128, 204, 77, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 51, 0, 203, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 216, 51, 224\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 6, 1\n\tvoice_square_2_alt 60, 0, 3, 0, 3, 3, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 7, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 9, 1\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup189.inc",
    "content": "\t.align 2\nvoicegroup189::\n\tvoice_keysplit_all voicegroup002\n\tvoice_keysplit voicegroup005, KeySplitTable1\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_classical_detuned_ep1_low, 255, 188, 128, 226\n\tvoice_directsound 60, 65, DirectSoundWaveData_sd90_classical_detuned_ep1_high, 128, 204, 77, 246\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tubular_bell, 255, 165, 90, 216\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_organ2, 51, 0, 203, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 128, 249, 25, 127\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 64, 216, 51, 224\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_fretless_bass, 255, 253, 0, 188\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_flute, 255, 127, 231, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 2, 6, 3\n\tvoice_square_2_alt 60, 0, 3, 0, 2, 7, 2\n\tvoice_square_1_alt 60, 0, 0, 1, 0, 2, 6, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\n"
  },
  {
    "path": "sound/voicegroups/voicegroup190.inc",
    "content": "\t.align 2\nvoicegroup190::\n\tvoice_programmable_wave_alt 60, 0, ProgrammableWaveData_1, 0, 7, 15, 2\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 7, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 9, 1\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_drum_and_percussion_kick, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 52, DirectSoundWaveData_sc88pro_orchestra_snare, 255, 0, 255, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 60, 64, DirectSoundWaveData_sc88pro_rnd_snare, 255, 0, 255, 242\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 33, 104, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 63, 64, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_tambourine, 255, 127, 77, 204\n\tvoice_directsound_no_resample 64, 14, DirectSoundWaveData_trinity_cymbal_crash, 255, 231, 0, 188\n\tvoice_directsound_no_resample 64, 89, DirectSoundWaveData_sd90_cowbell, 255, 0, 255, 242\n\tvoice_directsound_no_resample 64, 24, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 255, 235, 0, 231\n\tvoice_directsound_no_resample 64, 54, DirectSoundWaveData_sc88pro_orchestra_cymbal_crash, 8, 0, 255, 216\n\tvoice_directsound_no_resample 64, 94, DirectSoundWaveData_unused_heart_of_asia_indian_drum, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 34, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_directsound_no_resample 64, 90, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188\n\tvoice_directsound_no_resample 64, 79, DirectSoundWaveData_sd90_open_triangle, 255, 242, 103, 188\n\tvoice_directsound_no_resample 64, 39, DirectSoundWaveData_sd90_open_triangle, 255, 165, 103, 188\n\tvoice_directsound_no_resample 64, 64, DirectSoundWaveData_sc88pro_jingle_bell, 255, 0, 255, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound_no_resample 64, 104, DirectSoundWaveData_ethnic_flavours_atarigane, 255, 0, 255, 0\n\tvoice_directsound 63, 64, DirectSoundWaveData_sc88pro_taiko, 255, 0, 255, 0\n"
  },
  {
    "path": "sound/voicegroups/voicegroup191.inc",
    "content": "\t.align 2\nvoicegroup191::\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_mute_high_conga, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_open_low_conga, 255, 0, 255, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_tr909_hand_clap, 255, 226, 25, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_wave_54, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_dance_drums_ride_bell, 255, 165, 103, 231\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_open_triangle, 255, 204, 128, 249\n\tvoice_directsound 60, 0, DirectSoundWaveData_register_noise, 255, 0, 255, 76\n\tvoice_directsound 60, 0, DirectSoundWaveData_wave_77, 255, 0, 206, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_ohtsuzumi, 255, 0, 206, 38\n\tvoice_directsound 60, 0, DirectSoundWaveData_ethnic_flavours_hyoushigi, 255, 0, 206, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_nylon_str_guitar, 255, 165, 128, 204\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sd90_special_scream_drive, 255, 0, 255, 165\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_harp, 255, 252, 0, 204\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_accordion, 255, 0, 255, 165\n\tvoice_directsound 60, 0, DirectSoundWaveData_sc88pro_square_wave, 255, 204, 0, 127\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_keysplit voicegroup006, KeySplitTable4\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 3, 0, 0, 10, 3\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 0, 15, 1\n\tvoice_square_1_alt 60, 0, 0, 0, 0, 2, 5, 6\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_square_1 60, 0, 0, 2, 0, 0, 15, 0\n\tvoice_noise_alt 60, 0, 0, 0, 1, 9, 2\n\tvoice_noise_alt 60, 0, 0, 0, 4, 3, 1\n\tvoice_noise_alt 60, 0, 0, 0, 1, 12, 0\n\tvoice_noise_alt 60, 0, 1, 0, 1, 9, 0\n\tvoice_noise_alt 60, 0, 0, 0, 2, 6, 0"
  },
  {
    "path": "spritesheet_rules.mk",
    "content": "OBJEVENTGFXDIR := graphics/object_events/pics\nFLDEFFGFXDIR := graphics/field_effects/pics\n\n$(OBJEVENTGFXDIR)/misc/cut_tree.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/misc/rock_smash_rock.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/misc/surf_blob.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/misc/ss_anne.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 8 -mheight 4\n\n$(OBJEVENTGFXDIR)/misc/town_map.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/people/agatha.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/anabel.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/aroma_lady.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/balding_man.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/battle_girl.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/beauty.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/biker.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/bill.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/bird_keeper.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/blackbelt.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/blaine.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/blue.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/boy.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/brandon.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/brock.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/bruno.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/bug_catcher.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/burglar.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/cable_club_receptionist.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/cameraman.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/camper.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/captain.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/celio.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/channeler.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/chef.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/clerk.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/cooltrainer_f.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/cooltrainer_m.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/cue_ball.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/daisy.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/em_brendan.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/em_may.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/engineer.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/erika.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/fat_man.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/fisher.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/gba_kid.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/gentleman.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/giovanni.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/green_bike.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/green_fish.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/green_item.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/green_normal.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/green_surf_run.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/green_surf.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/green_vs_seeker_bike.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/green_underwater.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/greta.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/gym_guy.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/hiker.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/juggler.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/koga.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/lady.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/lance.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/lass.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/little_boy.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/people/little_girl.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/people/lorelei.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/lt_surge.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/lucy.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/man.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/master_beauty.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/master_bird_keeper.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/master_blackbelt.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/master_bug_catcher.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/master_cooltrainer_m.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/master_hiker.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/master_lass.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/master_psychic_m.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/master_scientist.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/master_youngster.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/mg_deliveryman.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/misty.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/mom.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/mr_fuji.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/noland.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/nurse.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/old_man_1.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/old_man_2.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/old_woman.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/painter.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/picnicker.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/pokemaniac.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/pokemon_breeder.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/pokemon_ranger_f.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/pokemon_ranger_m.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/policeman.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/prof_oak.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/psychic_f.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/psychic_m.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/red_bike.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/red_fish.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/red_item.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/red_normal.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/red_surf_run.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/red_surf.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/red_vs_seeker_bike.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/red_underwater.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/rich_boy.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/rocker.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/rocker_2.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/rocket_f.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/rocket_m.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/rs_brendan.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/rs_may.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/ruin_maniac.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/sabrina.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/sailor.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/scientist.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/scott.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/sitting_boy.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/spenser.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/super_nerd.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/swimmer_f_land.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/swimmer_f_water.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/swimmer_f_water_2.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/swimmer_m_land.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/swimmer_m_water.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/tamer.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/teachy_tv_host.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/trainer_tower_dude.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/tuber_f.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/people/tuber_m_land.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/people/tuber_m_water.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/people/tucker.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/twin.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/people/union_room_receptionist.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/unused_male_receptionist.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/unused_man.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/unused_woman.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/woman_1.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/woman_2.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/woman_3.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/worker_f.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/worker_m.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/young_couple_f.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/young_couple_m.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/people/youngster.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/pokemon/abra.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/bulbasaur.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/chansey.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/charmander.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/clefairy.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/cubone.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/deoxys_a.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/pokemon/deoxys_d.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/pokemon/deoxys_n.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/pokemon/doduo.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/fearow.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/ho_oh.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/pokemon/jigglypuff.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/kabuto.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/kangaskhan.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/lapras.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/latias.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/pokemon/latios.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/pokemon/lugia.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 4 -mheight 4\n\n$(OBJEVENTGFXDIR)/pokemon/machoke.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/machop.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/meowth.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/nidoran_f.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/nidoran_m.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/nidorino.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/omanyte.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/pidgeot.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/pidgey.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/pikachu.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/poliwrath.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/psyduck.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/seel.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/slowbro.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/slowpoke.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/spearow.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/squirtle.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/sudowoodo.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n\n$(OBJEVENTGFXDIR)/pokemon/voltorb.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/wigglytuff.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 2\n\n$(OBJEVENTGFXDIR)/pokemon/mew.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -mwidth 2 -mheight 4\n"
  },
  {
    "path": "src/AgbRfu_LinkManager.c",
    "content": "#include \"global.h\"\n#include \"librfu.h\"\n#include \"AgbRfu_LinkManager.h\"\n\n#define RN_ACCEPT           0x01\n#define RN_NAME_TIMER_CLEAR 0x02\n#define RN_DISCONNECT       0x04\n\n#define LINK_RECOVERY_OFF        0x00\n#define LINK_RECOVERY_START      0x01\n#define LINK_RECOVERY_EXE        0x02\n#define LINK_RECOVERY_IMPOSSIBLE 0x04\n\n#define FSP_ON    0x01\n#define FSP_START 0x02\n\nLINK_MANAGER lman;\n\nstatic void rfu_LMAN_clearVariables(void);\nstatic void rfu_LMAN_settingPCSWITCH(u32 rand);\nstatic void rfu_LMAN_REQ_callback(u16 reqCommandId, u16 reqResult);\nstatic void rfu_LMAN_MSC_callback(u16 reqCommandId);\nstatic void rfu_LMAN_PARENT_checkRecvChildName(void);\nstatic void rfu_LMAN_CHILD_checkSendChildName(void);\nstatic void rfu_LMAN_CHILD_checkSendChildName2(void);\nstatic void rfu_LMAN_CHILD_linkRecoveryProcess(void);\nstatic u8 rfu_LMAN_CHILD_checkEnableParentCandidate(void);\nstatic void rfu_LMAN_occureCallback(u8 msg, u8 param_count);\nstatic void rfu_LMAN_disconnect(u8 bmDisconnectSlot);\nstatic void rfu_LMAN_reflectCommunicationStatus(u8 bm_disconnectedSlot);\nstatic void rfu_LMAN_checkNICommunicateStatus(void);\nstatic void rfu_LMAN_managerChangeAgbClockMaster(void);\n\nu32 rfu_LMAN_REQBN_softReset_and_checkID(void)\n{\n    u32 id = rfu_REQBN_softReset_and_checkID();\n    if (id == RFU_ID)\n        lman.RFU_powerOn_flag = 1;\n    if (lman.state != LMAN_FORCED_STOP_AND_RFU_RESET && lman.state != LMAN_STATE_SOFT_RESET_AND_CHECK_ID)\n    {\n        lman.state = lman.next_state = LMAN_STATE_READY;\n    }\n    lman.pcswitch_flag = 0;\n    lman.reserveDisconnectSlot_flag = 0;\n    lman.acceptCount = 0;\n    lman.acceptSlot_flag = 0;\n    lman.parent_child = MODE_NEUTRAL;\n    rfu_LMAN_managerChangeAgbClockMaster();\n    return id;\n}\n\nvoid rfu_LMAN_REQ_sendData(u8 clockChangeFlag)\n{\n    if (gRfuLinkStatus->parentChild == MODE_CHILD)\n    {\n        if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON)\n            clockChangeFlag = TRUE;\n        else\n            clockChangeFlag = FALSE;\n    }\n    else\n        lman.parentAck_flag = 0;\n    rfu_REQ_sendData(clockChangeFlag);\n}\n\nu8 rfu_LMAN_initializeManager(void (*LMAN_callback_p)(u8, u8), void (*MSC_callback_p)(u16))\n{\n    if (LMAN_callback_p == NULL)\n    {\n        return LMAN_ERROR_ILLEGAL_PARAMETER;\n    }\n    CpuFill16(0, &lman, sizeof(struct linkManagerTag));\n    lman.parent_child = MODE_NEUTRAL;\n    lman.LMAN_callback = LMAN_callback_p;\n    lman.MSC_callback = MSC_callback_p;\n    rfu_setMSCCallback(rfu_LMAN_MSC_callback);\n    rfu_setREQCallback(rfu_LMAN_REQ_callback);\n    return 0;\n}\n\nstatic void rfu_LMAN_endManager(void)\n{\n    CpuFill16(0, &lman, sizeof(struct linkManagerTag) - 8);\n    lman.parent_child = MODE_NEUTRAL;\n}\n\nvoid rfu_LMAN_initializeRFU(INIT_PARAM *init_parameters)\n{\n    rfu_LMAN_clearVariables();\n    lman.state = LMAN_STATE_SOFT_RESET_AND_CHECK_ID;\n    lman.next_state = LMAN_STATE_RESET;\n    lman.init_param = init_parameters;\n    lman.linkRecovery_enable = init_parameters->linkRecovery_enable;\n    lman.linkRecoveryTimer.count_max = init_parameters->linkRecovery_period;\n    lman.NI_failCounter_limit = init_parameters->NI_failCounter_limit;\n    if (init_parameters->fastSearchParent_flag)\n    {\n        lman.fastSearchParent_flag = FSP_ON;\n    }\n}\n\nstatic void rfu_LMAN_clearVariables(void)\n{\n    u8 i;\n\n    lman.state = lman.next_state = LMAN_STATE_READY;\n    lman.parent_child = MODE_NEUTRAL;\n    lman.pcswitch_flag = 0;\n    lman.child_slot = 0;\n    lman.connectSlot_flag_old = 0;\n    lman.nameAcceptTimer.active = 0;\n    lman.linkRecoveryTimer.active = 0;\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        lman.nameAcceptTimer.count[i] = 0;\n        lman.linkRecoveryTimer.count[i] = 0;\n    }\n}\n\nvoid rfu_LMAN_powerDownRFU(void)\n{\n    lman.state = LMAN_STATE_STOP_MODE;\n}\n\nu8 rfu_LMAN_establishConnection(u8 parent_child, u16 connect_period, u16 name_accept_period, u16 *acceptable_serialNo_list)\n{\n    u8 i;\n    u16 *serial_list;\n\n    if (lman.state != LMAN_STATE_READY && (lman.state != LMAN_STATE_WAIT_RECV_CHILD_NAME || parent_child != MODE_PARENT))\n    {\n        lman.param[0] = 1;\n        rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);\n        return LMAN_ERROR_MANAGER_BUSY;\n    }\n    if (rfu_getMasterSlave() == AGB_CLK_SLAVE)\n    {\n        lman.param[0] = 2;\n        rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);\n        return LMAN_ERROR_AGB_CLK_SLAVE;\n    }\n    for (i = 0, serial_list = acceptable_serialNo_list; i < 16; i++)\n    {\n        if (*serial_list++ == 0xFFFF)\n        {\n            break;\n        }\n    }\n    if (i == 16)\n    {\n        lman.param[0] = 4;\n        rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);\n        return LMAN_ERROR_ILLEGAL_PARAMETER;\n    }\n    if (parent_child > MODE_PARENT)\n    {\n        lman.pcswitch_flag = PCSWITCH_1ST_SC_START;\n        parent_child = MODE_PARENT;\n        connect_period = 0;\n    }\n    else\n    {\n        lman.pcswitch_flag = 0;\n    }\n    if (parent_child != MODE_CHILD)\n    {\n        lman.state = LMAN_STATE_START_SEARCH_CHILD;\n    }\n    else\n    {\n        lman.state = LMAN_STATE_START_SEARCH_PARENT;\n        if (lman.fastSearchParent_flag)\n        {\n            lman.fastSearchParent_flag = FSP_START;\n        }\n    }\n    lman.parent_child = parent_child;\n    lman.connect_period = connect_period;\n    lman.nameAcceptTimer.count_max = name_accept_period;\n    lman.acceptable_serialNo_list = acceptable_serialNo_list;\n    return 0;\n}\n\nu8 rfu_LMAN_CHILD_connectParent(u16 parentId, u16 connect_period)\n{\n    u8 i;\n\n    if (lman.state != LMAN_STATE_READY && (lman.state < 9 || lman.state > 11))\n    {\n        lman.param[0] = 1;\n        rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);\n        return LMAN_ERROR_MANAGER_BUSY;\n    }\n    if (rfu_getMasterSlave() == AGB_CLK_SLAVE)\n    {\n        lman.param[0] = 2;\n        rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);\n        return LMAN_ERROR_AGB_CLK_SLAVE;\n    }\n    for (i = 0; i < gRfuLinkStatus->findParentCount; i++)\n    {\n        if (gRfuLinkStatus->partner[i].id == parentId)\n        {\n            break;\n        }\n    }\n    if (gRfuLinkStatus->findParentCount == 0 || i == gRfuLinkStatus->findParentCount)\n    {\n        lman.param[0] = 3;\n        rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);\n        return LMAN_ERROR_PID_NOT_FOUND;\n    }\n    if (lman.state == LMAN_STATE_READY || lman.state == LMAN_STATE_START_SEARCH_PARENT)\n    {\n        lman.state = LMAN_STATE_START_CONNECT_PARENT;\n        lman.next_state = LMAN_STATE_POLL_CONNECT_PARENT;\n    }\n    else\n    {\n        lman.state = LMAN_STATE_END_SEARCH_PARENT;\n        lman.next_state = LMAN_STATE_START_CONNECT_PARENT;\n    }\n    lman.work = parentId;\n    lman.connect_period = connect_period;\n    if (lman.pcswitch_flag != 0)\n    {\n        lman.pcswitch_flag = PCSWITCH_CP;\n    }\n    return 0;\n}\n\nstatic void rfu_LMAN_PARENT_stopWaitLinkRecoveryAndDisconnect(u8 bm_targetSlot)\n{\n    u8 i;\n\n    if ((bm_targetSlot & lman.linkRecoveryTimer.active) == 0)\n        return;\n    lman.linkRecoveryTimer.active &= ~bm_targetSlot;\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if ((bm_targetSlot >> i) & 1)\n        {\n            lman.linkRecoveryTimer.count[i] = 0;\n        }\n    }\n    i = gRfuLinkStatus->linkLossSlotFlag & bm_targetSlot;\n    if (i)\n    {\n        rfu_LMAN_disconnect(i);\n    }\n    lman.param[0] = i;\n    rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, i);\n}\n\nvoid rfu_LMAN_stopManager(u8 forced_stop_and_RFU_reset_flag)\n{\n    u8 msg = 0;\n    lman.pcswitch_flag = 0;\n    if (forced_stop_and_RFU_reset_flag)\n    {\n        rfu_LMAN_clearVariables();\n        lman.state = LMAN_FORCED_STOP_AND_RFU_RESET;\n        return;\n    }\n    switch (lman.state)\n    {\n    case LMAN_STATE_START_SEARCH_CHILD:\n        lman.state = LMAN_STATE_WAIT_RECV_CHILD_NAME;\n        lman.next_state = LMAN_STATE_READY;\n        msg = LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED;\n        break;\n    case LMAN_STATE_POLL_SEARCH_CHILD:\n        lman.state = LMAN_STATE_END_SEARCH_CHILD;\n        lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME;\n        break;\n    case LMAN_STATE_END_SEARCH_CHILD:\n        lman.state = LMAN_STATE_END_SEARCH_CHILD;\n        lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME;\n        break;\n    case LMAN_STATE_WAIT_RECV_CHILD_NAME:\n        break;\n    case LMAN_STATE_START_SEARCH_PARENT:\n        lman.state = lman.next_state = LMAN_STATE_READY;\n        msg = LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED;\n        break;\n    case LMAN_STATE_POLL_SEARCH_PARENT:\n        lman.state = LMAN_STATE_END_SEARCH_PARENT;\n        lman.next_state = LMAN_STATE_READY;\n        break;\n    case LMAN_STATE_END_SEARCH_PARENT:\n        lman.state = LMAN_STATE_END_SEARCH_PARENT;\n        lman.next_state = LMAN_STATE_READY;\n        break;\n    case LMAN_STATE_START_CONNECT_PARENT:\n        lman.state = lman.next_state = LMAN_STATE_READY;\n        msg = LMAN_MSG_CONNECT_PARENT_FAILED;\n        break;\n    case LMAN_STATE_POLL_CONNECT_PARENT:\n        lman.state = LMAN_STATE_END_CONNECT_PARENT;\n        break;\n    case LMAN_STATE_END_CONNECT_PARENT:\n        lman.state = LMAN_STATE_END_CONNECT_PARENT;\n        break;\n    case LMAN_STATE_SEND_CHILD_NAME:\n        break;\n    case LMAN_STATE_START_LINK_RECOVERY:\n        lman.state = lman.state_bak[0];\n        lman.next_state = lman.state_bak[1];\n        rfu_LMAN_disconnect(gRfuLinkStatus->linkLossSlotFlag);\n        lman.param[0] = gRfuLinkStatus->linkLossSlotFlag;\n        rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1);\n        return;\n    case LMAN_STATE_POLL_LINK_RECOVERY:\n        lman.state = LMAN_STATE_END_LINK_RECOVERY;\n        break;\n    case LMAN_STATE_END_LINK_RECOVERY:\n        lman.state = LMAN_STATE_END_LINK_RECOVERY;\n        break;\n    default:\n        lman.state = lman.next_state = LMAN_STATE_READY;\n        msg = LMAN_MSG_MANAGER_STOPPED;\n        break;\n    }\n    if (lman.state == LMAN_STATE_READY)\n    {\n        rfu_LMAN_occureCallback(msg, 0);\n    }\n}\n\nstatic bool8 rfu_LMAN_linkWatcher(u16 REQ_commandID)\n{\n    u8 i;\n    u8 bm_linkLossSlot;\n    u8 reason;\n    u8 bm_linkRecoverySlot;\n    u8 bm_disconnectSlot;\n\n    bool8 disconnect_occure_flag = FALSE;\n    rfu_REQBN_watchLink(REQ_commandID, &bm_linkLossSlot, &reason, &bm_linkRecoverySlot);\n    if (bm_linkLossSlot)\n    {\n        lman.param[0] = bm_linkLossSlot;\n        lman.param[1] = reason;\n        if (lman.linkRecovery_enable)\n        {\n            lman.linkRecovery_start_flag = LINK_RECOVERY_START;\n            if (lman.parent_child == MODE_CHILD && reason == REASON_DISCONNECTED)\n            {\n                lman.linkRecovery_start_flag = LINK_RECOVERY_IMPOSSIBLE;\n            }\n            if (lman.linkRecovery_start_flag == LINK_RECOVERY_START)\n            {\n                for (i = 0; i < RFU_CHILD_MAX; i++)\n                {\n                    if ((bm_linkLossSlot >> i) & 1)\n                    {\n                        lman.linkRecoveryTimer.active |= (1 << i);\n                        lman.linkRecoveryTimer.count[i] = lman.linkRecoveryTimer.count_max;\n                    }\n                }\n                rfu_LMAN_occureCallback(LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY, 1);\n            }\n            else\n            {\n                lman.linkRecovery_start_flag = 0;\n                rfu_LMAN_disconnect(bm_linkLossSlot);\n                disconnect_occure_flag = TRUE;\n                rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1);\n            }\n        }\n        else\n        {\n            rfu_LMAN_disconnect(bm_linkLossSlot);\n            disconnect_occure_flag = TRUE;\n            rfu_LMAN_occureCallback(LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED, 2);\n        }\n        rfu_LMAN_managerChangeAgbClockMaster();\n    }\n    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n    {\n        if (bm_linkRecoverySlot)\n        {\n            for (i = 0; i < RFU_CHILD_MAX; i++)\n            {\n                if ((lman.linkRecoveryTimer.active >> i) & 1 && (bm_linkRecoverySlot >> i) & 1)\n                {\n                    lman.linkRecoveryTimer.count[i] = 0;\n                }\n            }\n            lman.linkRecoveryTimer.active &= ~bm_linkRecoverySlot;\n            lman.param[0] = bm_linkRecoverySlot;\n            rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_SUCCESSED, 1);\n        }\n        if (lman.linkRecoveryTimer.active)\n        {\n            bm_disconnectSlot = 0;\n            for (i = 0; i < RFU_CHILD_MAX; i++)\n            {\n                if ((lman.linkRecoveryTimer.active >> i) & 1 && lman.linkRecoveryTimer.count[i] && --lman.linkRecoveryTimer.count[i] == 0)\n                {\n                    lman.linkRecoveryTimer.active &= ~(1 << i);\n                    bm_disconnectSlot |= (1 << i);\n                }\n            }\n            if (bm_disconnectSlot)\n            {\n                rfu_LMAN_disconnect(bm_disconnectSlot);\n                disconnect_occure_flag = TRUE;\n                lman.param[0] = bm_disconnectSlot;\n                rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1);\n            }\n        }\n        if (!lman.linkRecoveryTimer.active)\n        {\n            lman.linkRecovery_start_flag = 0;\n        }\n    }\n    return disconnect_occure_flag;\n}\n\nvoid rfu_LMAN_syncVBlank(void)\n{\n    if (rfu_syncVBlank())\n    {\n        rfu_LMAN_occureCallback(LMAN_MSG_WATCH_DOG_TIMER_ERROR, 0);\n        rfu_LMAN_managerChangeAgbClockMaster();\n    }\n}\n\nvoid rfu_LMAN_manager_entity(u32 rand)\n{\n    u8 msg;\n\n    if (lman.LMAN_callback == NULL && lman.state != LMAN_STATE_READY)\n    {\n        lman.state = LMAN_STATE_READY;\n        return;\n    }\n    if (lman.pcswitch_flag)\n    {\n        rfu_LMAN_settingPCSWITCH(rand);\n    }\n    while (1)\n    {\n        if (lman.state != LMAN_STATE_READY)\n        {\n            rfu_waitREQComplete();\n            lman.active = 1;\n            switch (lman.state)\n            {\n            case LMAN_FORCED_STOP_AND_RFU_RESET:\n                if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID)\n                {\n                    msg=LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET;\n                }\n                else\n                {\n                    msg=LMAN_MSG_RFU_FATAL_ERROR;\n                }\n                lman.state = lman.next_state = LMAN_STATE_READY;\n                rfu_LMAN_occureCallback(msg, 0);\n                break;\n            case LMAN_STATE_SOFT_RESET_AND_CHECK_ID:\n                if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID)\n                {\n                    lman.state = lman.next_state;\n                    lman.next_state = LMAN_STATE_CONFIG_SYSTEM;\n                }\n                else\n                {\n                    lman.state = lman.next_state = LMAN_STATE_READY;\n                    rfu_LMAN_occureCallback(LMAN_MSG_RFU_FATAL_ERROR, 0);\n                }\n                break;\n            case LMAN_STATE_RESET:\n                rfu_REQ_reset();\n                break;\n            case LMAN_STATE_CONFIG_SYSTEM:\n                rfu_REQ_configSystem(lman.init_param->availSlot_flag, lman.init_param->maxMFrame, lman.init_param->MC_TimerCount);\n                break;\n            case LMAN_STATE_CONFIG_GAME_DATA:\n                rfu_REQ_configGameData(lman.init_param->mboot_flag, lman.init_param->serialNo, (const u8 *)lman.init_param->gameName, lman.init_param->userName);\n                break;\n            case LMAN_STATE_START_SEARCH_CHILD:\n                rfu_REQ_startSearchChild();\n                break;\n            case LMAN_STATE_POLL_SEARCH_CHILD:\n                rfu_REQ_pollSearchChild();\n                break;\n            case LMAN_STATE_END_SEARCH_CHILD:\n                rfu_REQ_endSearchChild();\n                break;\n            case LMAN_STATE_WAIT_RECV_CHILD_NAME:\n                break;\n            case LMAN_STATE_START_SEARCH_PARENT:\n                rfu_REQ_startSearchParent();\n                break;\n            case LMAN_STATE_POLL_SEARCH_PARENT:\n                rfu_REQ_pollSearchParent();\n                break;\n            case LMAN_STATE_END_SEARCH_PARENT:\n                rfu_REQ_endSearchParent();\n                break;\n            case LMAN_STATE_START_CONNECT_PARENT:\n                rfu_REQ_startConnectParent(lman.work);\n                break;\n            case LMAN_STATE_POLL_CONNECT_PARENT:\n                rfu_REQ_pollConnectParent();\n                break;\n            case LMAN_STATE_END_CONNECT_PARENT:\n                rfu_REQ_endConnectParent();\n                break;\n            case LMAN_STATE_SEND_CHILD_NAME:\n                break;\n            case LMAN_STATE_START_LINK_RECOVERY:\n                rfu_REQ_CHILD_startConnectRecovery(gRfuLinkStatus->linkLossSlotFlag);\n                break;\n            case LMAN_STATE_POLL_LINK_RECOVERY:\n                rfu_REQ_CHILD_pollConnectRecovery();\n                break;\n            case LMAN_STATE_END_LINK_RECOVERY:\n                rfu_REQ_CHILD_endConnectRecovery();\n                break;\n            case LMAN_STATE_MS_CHANGE:\n                rfu_REQ_changeMasterSlave();\n                break;\n            case LMAN_STATE_WAIT_CLOCK_MASTER:\n                break;\n            case LMAN_STATE_STOP_MODE:\n                rfu_REQ_stopMode();\n                break;\n            case LMAN_STATE_BACK_STATE:\n                break;\n            default:\n                break;\n            }\n            rfu_waitREQComplete();\n            lman.active = 0;\n        }\n        if (lman.state == LMAN_STATE_END_LINK_RECOVERY || lman.state == LMAN_STATE_MS_CHANGE)\n            ;\n        else\n            break;\n    }\n    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n    {\n        if (rfu_LMAN_linkWatcher(0))\n            return;\n    }\n    rfu_LMAN_PARENT_checkRecvChildName();\n    rfu_LMAN_CHILD_checkSendChildName();\n    rfu_LMAN_CHILD_linkRecoveryProcess();\n    rfu_LMAN_checkNICommunicateStatus();\n}\n\nstatic void rfu_LMAN_settingPCSWITCH(u32 rand)\n{\n    if (lman.pcswitch_flag == PCSWITCH_3RD_SC_START)\n    {\n        lman.parent_child = MODE_PARENT;\n        lman.state = LMAN_STATE_START_SEARCH_CHILD;\n        lman.connect_period = lman.pcswitch_period_bak;\n        if (lman.connect_period)\n        {\n            lman.pcswitch_flag = PCSWITCH_3RD_SC;\n        }\n        else\n        {\n            lman.pcswitch_flag = PCSWITCH_1ST_SC_START;\n        }\n    }\n    if (lman.pcswitch_flag == PCSWITCH_1ST_SC_START)\n    {\n        lman.parent_child = MODE_PARENT;\n        lman.state = LMAN_STATE_START_SEARCH_CHILD;\n        lman.connect_period = rand % 140;\n        lman.pcswitch_period_bak = 140 - lman.connect_period;\n        if (lman.connect_period)\n        {\n            lman.pcswitch_flag = PCSWITCH_1ST_SC;\n        }\n        else\n        {\n            lman.pcswitch_flag = PCSWITCH_2ND_SP_START;\n        }\n    }\n    if (lman.pcswitch_flag == PCSWITCH_2ND_SP_START)\n    {\n        lman.parent_child = MODE_CHILD;\n        lman.connect_period = PCSWITCH_SP_PERIOD;\n        lman.pcswitch_flag = PCSWITCH_2ND_SP;\n        lman.state = LMAN_STATE_START_SEARCH_PARENT;\n    }\n}\n\nstatic void rfu_LMAN_REQ_callback(u16 reqCommandId, u16 reqResult)\n{\n    u8 status;\n    u8 *stwiRecvBuffer;\n    u8 i;\n\n    if (lman.active != 0)\n    {\n        lman.active = 0;\n        switch (reqCommandId)\n        {\n        case ID_RESET_REQ:\n            if (reqResult == 0)\n            {\n                lman.state = lman.next_state;\n                lman.next_state = LMAN_STATE_CONFIG_GAME_DATA;\n            }\n            break;\n        case ID_SYSTEM_CONFIG_REQ:\n            if (reqResult == 0)\n            {\n                lman.state = lman.next_state;\n                lman.next_state = LMAN_STATE_READY;\n            }\n            break;\n        case ID_GAME_CONFIG_REQ:\n            if (reqResult == 0)\n            {\n                lman.state = lman.next_state = LMAN_STATE_READY;\n                rfu_LMAN_occureCallback(LMAN_MSG_INITIALIZE_COMPLETED, 0);\n            }\n            break;\n        case ID_SC_START_REQ:\n            if (reqResult == 0)\n            {\n                lman.state = lman.next_state = LMAN_STATE_POLL_SEARCH_CHILD;\n            }\n            break;\n        case ID_SC_POLL_REQ:\n            if (lman.connect_period && --lman.connect_period == 0)\n            {\n                lman.state = LMAN_STATE_END_SEARCH_CHILD;\n                lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME;\n            }\n            break;\n        case ID_SC_END_REQ:\n            if (reqResult == 0)\n            {\n                lman.state = lman.next_state;\n                lman.next_state = LMAN_STATE_READY;\n                if (lman.pcswitch_flag == 0)\n                {\n                    rfu_LMAN_occureCallback(LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED, 0);\n                }\n            }\n            break;\n        case ID_SP_START_REQ:\n            if (reqResult == 0)\n            {\n                if (lman.fastSearchParent_flag == FSP_ON)\n                {\n                    if (lman.connect_period > 1)\n                    {\n                        lman.connect_period--;\n                    }\n                }\n                lman.state = lman.next_state = LMAN_STATE_POLL_SEARCH_PARENT;\n            }\n            break;\n        case ID_SP_POLL_REQ:\n            if (reqResult == 0)\n            {\n                status = rfu_LMAN_CHILD_checkEnableParentCandidate();\n                lman.param[0] = status;\n                if (status)\n                {\n                    rfu_LMAN_occureCallback(LMAN_MSG_PARENT_FOUND, 1);\n                }\n                if (lman.fastSearchParent_flag && lman.connect_period != 1 && gRfuLinkStatus->findParentCount == RFU_CHILD_MAX)\n                {\n                    rfu_REQ_endSearchParent();\n                    rfu_waitREQComplete();\n                    lman.state = LMAN_STATE_START_SEARCH_PARENT;\n                    lman.fastSearchParent_flag = FSP_ON;\n                }\n            }\n            if (lman.connect_period && --lman.connect_period == 0)\n            {\n                lman.state = LMAN_STATE_END_SEARCH_PARENT;\n                lman.next_state = LMAN_STATE_READY;\n            }\n            break;\n        case ID_SP_END_REQ:\n            if (reqResult == 0)\n            {\n                lman.state = lman.next_state;\n                if (lman.pcswitch_flag == 0)\n                {\n                    if (lman.state == LMAN_STATE_READY)\n                    {\n                        rfu_LMAN_occureCallback(LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED, 0);\n                    }\n                }\n                else if (lman.pcswitch_flag != PCSWITCH_CP)\n                {\n                    lman.state = LMAN_STATE_START_SEARCH_CHILD;\n                    lman.pcswitch_flag = PCSWITCH_3RD_SC_START;\n                }\n            }\n            break;\n        case ID_CP_START_REQ:\n            if (reqResult == 0)\n            {\n                lman.state = lman.next_state = LMAN_STATE_POLL_CONNECT_PARENT;\n            }\n            break;\n        case ID_CP_POLL_REQ:\n            if (reqResult == 0 && !rfu_getConnectParentStatus(&status, &lman.child_slot) && !status)\n            {\n                lman.state = LMAN_STATE_END_CONNECT_PARENT;\n            }\n            if (lman.connect_period && --lman.connect_period == 0)\n            {\n                lman.state = LMAN_STATE_END_CONNECT_PARENT;\n            }\n            break;\n        case ID_CP_END_REQ:\n            if (reqResult == 0 && !rfu_getConnectParentStatus(&status, &lman.child_slot))\n            {\n                if (!status)\n                {\n                    lman.state = LMAN_STATE_MS_CHANGE;\n                    lman.next_state = LMAN_STATE_SEND_CHILD_NAME;\n                    lman.work = 0x22;\n                    lman.param[0] = lman.child_slot;\n                }\n                else\n                {\n                    lman.state = lman.next_state = LMAN_STATE_READY;\n                    lman.work = 0x23;\n                    lman.param[0] = status;\n                    if (lman.pcswitch_flag)\n                    {\n                        lman.pcswitch_flag = PCSWITCH_2ND_SP_START;\n                        lman.state = LMAN_STATE_START_SEARCH_PARENT;\n                    }\n                }\n                rfu_LMAN_occureCallback(lman.work, 0x01);\n                lman.work = 0;\n            }\n            break;\n        case ID_CPR_START_REQ:\n            if (reqResult == 0)\n            {\n                lman.param[0] = gRfuLinkStatus->linkLossSlotFlag;\n                lman.state = lman.next_state = LMAN_STATE_POLL_LINK_RECOVERY;\n                for (lman.child_slot = 0; lman.child_slot < RFU_CHILD_MAX; lman.child_slot++)\n                {\n                    if ((gRfuLinkStatus->linkLossSlotFlag >> lman.child_slot) & 1)\n                    {\n                        break;\n                    }\n                }\n            }\n            break;\n        case ID_CPR_POLL_REQ:\n            if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&status) && status < 2)\n            {\n                lman.state = LMAN_STATE_END_LINK_RECOVERY;\n            }\n            if (lman.linkRecoveryTimer.count[lman.child_slot] && --lman.linkRecoveryTimer.count[lman.child_slot] == 0)\n            {\n                lman.state = LMAN_STATE_END_LINK_RECOVERY;\n            }\n            break;\n        case ID_CPR_END_REQ:\n            if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&status))\n            {\n                if (!status)\n                {\n                    lman.state = LMAN_STATE_MS_CHANGE;\n                    lman.next_state = LMAN_STATE_BACK_STATE;\n                    lman.work = 0x32;\n                }\n                else\n                {\n                    lman.state = lman.next_state = LMAN_STATE_READY;\n                    rfu_LMAN_disconnect(gRfuLinkStatus->linkLossSlotFlag);\n                    lman.work = 0x33;\n                }\n                lman.linkRecoveryTimer.count[lman.child_slot] = 0;\n                lman.linkRecoveryTimer.active = 0;\n                lman.linkRecovery_start_flag = 0;\n                rfu_LMAN_occureCallback(lman.work, 0x01);\n                lman.work = 0;\n            }\n            break;\n        case ID_MS_CHANGE_REQ:\n            if (reqResult == 0)\n            {\n                if (lman.next_state == LMAN_STATE_BACK_STATE)\n                {\n                    lman.state = lman.state_bak[0];\n                    lman.next_state = lman.state_bak[1];\n                    lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_ON;\n                    rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE, 0);\n                }\n                else if (lman.next_state == LMAN_STATE_SEND_CHILD_NAME)\n                {\n                    lman.state = lman.next_state;\n                    lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_ON;\n                    rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE, 0);\n                    lman.nameAcceptTimer.active |= 1 << lman.child_slot;\n                    lman.nameAcceptTimer.count[lman.child_slot] = lman.nameAcceptTimer.count_max;\n                    rfu_clearSlot(TYPE_NI_SEND, lman.child_slot);\n                    status = rfu_NI_CHILD_setSendGameName(lman.child_slot, 0x0e);\n                    if (status)\n                    {\n                        lman.state = lman.next_state = LMAN_STATE_READY;\n                        rfu_LMAN_managerChangeAgbClockMaster();\n                        rfu_LMAN_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);\n                        lman.param[0] = status;\n                        rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED, 1);\n                    }\n                }\n            }\n            break;\n        case ID_STOP_MODE_REQ:\n            if (reqResult == 0)\n            {\n                lman.state = lman.next_state = LMAN_STATE_READY;\n                rfu_LMAN_occureCallback(LMAN_MSG_RFU_POWER_DOWN, 0);\n            }\n            break;\n        }\n        lman.active = 1;\n    }\n    else if (reqResult == 3 && lman.msc_exe_flag && (reqCommandId == ID_DATA_TX_REQ || reqCommandId == ID_DATA_RX_REQ || reqCommandId == ID_MS_CHANGE_REQ))\n    {\n        rfu_REQ_RFUStatus();\n        rfu_waitREQComplete();\n        rfu_getRFUStatus(&status);\n        if (status == 0 && gRfuLinkStatus->parentChild == MODE_CHILD)\n        {\n            stwiRecvBuffer = rfu_getSTWIRecvBuffer() + 4;\n            *stwiRecvBuffer++ = gRfuLinkStatus->connSlotFlag;\n            *stwiRecvBuffer = REASON_LINK_LOSS;\n            rfu_LMAN_linkWatcher(ID_DISCONNECTED_AND_CHANGE_REQ);\n            reqResult = 0;\n        }\n    }\n    switch (reqCommandId)\n    {\n    case ID_DISCONNECT_REQ:\n        if (reqResult == 0)\n        {\n            lman.param[0] = *(rfu_getSTWIRecvBuffer() + 8);\n            rfu_LMAN_reflectCommunicationStatus(lman.param[0]);\n            if (lman.linkRecoveryTimer.active)\n            {\n                lman.linkRecoveryTimer.active &= ~lman.param[0];\n                for (i = 0; i < RFU_CHILD_MAX; i++)\n                {\n                    if ((lman.param[0] >> i) & 1)\n                    {\n                        lman.linkRecoveryTimer.count[i] = 0;\n                    }\n                }\n                if (lman.parent_child == MODE_CHILD)\n                {\n                    lman.state = lman.next_state = LMAN_STATE_READY;\n                }\n            }\n            status = lman.acceptSlot_flag & lman.param[0];\n            for (i = 0; i < RFU_CHILD_MAX; i++)\n            {\n                if ((status >> i) & 1 && lman.acceptCount)\n                {\n                    lman.acceptCount--;\n                }\n            }\n            lman.acceptSlot_flag &= ~lman.param[0];\n            if (lman.pcswitch_flag)\n            {\n                if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)\n                {\n                    if (lman.pcswitch_flag == PCSWITCH_SC_LOCK)\n                    {\n                        lman.connect_period = lman.pcswitch_period_bak;\n                        lman.pcswitch_flag = PCSWITCH_3RD_SC;\n                        lman.state = LMAN_STATE_POLL_SEARCH_CHILD;\n                    }\n                    else if (lman.state != LMAN_STATE_POLL_SEARCH_CHILD && lman.state != LMAN_STATE_END_SEARCH_CHILD)\n                    {\n                        lman.pcswitch_flag = PCSWITCH_1ST_SC_START;\n                        lman.state = LMAN_STATE_START_SEARCH_CHILD;\n                    }\n                }\n            }\n            if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)\n            {\n                if (lman.state == LMAN_STATE_READY)\n                {\n                    lman.parent_child = MODE_NEUTRAL;\n                }\n            }\n            if (lman.active == 0)\n            {\n                rfu_LMAN_occureCallback(LMAN_MSG_LINK_DISCONNECTED_BY_USER, 1);\n            }\n        }\n        break;\n    case ID_DATA_RX_REQ:\n        rfu_LMAN_CHILD_checkSendChildName2();\n        if (gRfuLinkStatus->parentChild != MODE_NEUTRAL)\n        {\n            rfu_LMAN_occureCallback(LMAN_MSG_RECV_DATA_REQ_COMPLETED, 0);\n        }\n        break;\n    case ID_RESET_REQ:\n    case ID_STOP_MODE_REQ:\n        if (reqResult == 0)\n        {\n            lman.reserveDisconnectSlot_flag = 0;\n            lman.acceptCount = 0;\n            lman.acceptSlot_flag = 0;\n            lman.parent_child = MODE_NEUTRAL;\n            rfu_LMAN_managerChangeAgbClockMaster();\n            if (reqCommandId == ID_STOP_MODE_REQ)\n            {\n                rfu_LMAN_endManager();\n            }\n        }\n        break;\n    }\n    if (reqResult != 0)\n    {\n        if (reqCommandId == ID_SP_START_REQ && reqResult != 0 && lman.pcswitch_flag == PCSWITCH_2ND_SP)\n        {\n            gRfuLinkStatus->parentChild = MODE_PARENT;\n            gRfuLinkStatus->connSlotFlag = 0xF;\n            rfu_LMAN_disconnect(15);\n            rfu_waitREQComplete();\n            return;\n        }\n        else\n        {\n            lman.param[0] = reqCommandId;\n            lman.param[1] = reqResult;\n            if (lman.active)\n            {\n                lman.state = lman.next_state = LMAN_STATE_READY;\n            }\n            rfu_LMAN_occureCallback(LMAN_MSG_REQ_API_ERROR, 2);\n            rfu_LMAN_managerChangeAgbClockMaster();\n        }\n    }\n    if (reqCommandId == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ)\n    {\n        rfu_LMAN_occureCallback(LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA, 0);\n        rfu_LMAN_managerChangeAgbClockMaster();\n    }\n}\n\nstatic void rfu_LMAN_MSC_callback(u16 reqCommandId)\n{\n    u8 active_bak;\n    u8 thisAck_flag;\n\n    active_bak = lman.active;\n    lman.active = 0;\n    lman.msc_exe_flag = 1;\n    if (gRfuLinkStatus->parentChild == MODE_CHILD)\n    {\n        rfu_LMAN_linkWatcher(reqCommandId);\n        if (lman.childClockSlave_flag != RFU_CHILD_CLOCK_SLAVE_ON)\n        {\n            rfu_LMAN_managerChangeAgbClockMaster();\n            lman.msc_exe_flag = 0;\n            lman.active = active_bak;\n            return;\n        }\n    }\n    else\n    {\n        if (!rfu_UNI_PARENT_getDRAC_ACK(&thisAck_flag))\n        {\n            lman.parentAck_flag |= thisAck_flag;\n        }\n    }\n    if (lman.MSC_callback != NULL)\n    {\n        lman.MSC_callback(reqCommandId);\n        rfu_waitREQComplete();\n        if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF_REQ)\n        {\n            rfu_LMAN_managerChangeAgbClockMaster();\n        }\n    }\n    lman.msc_exe_flag = 0;\n    lman.active = active_bak;\n}\n\nstatic void rfu_LMAN_PARENT_checkRecvChildName(void)\n{\n    u8 newSlot;\n    u8 newAcceptSlot;\n    u8 i;\n    u8 flags;\n    u8 tgtSlot;\n    const u16 *ptr;\n\n    if (lman.state == LMAN_STATE_START_SEARCH_CHILD || lman.state == LMAN_STATE_POLL_SEARCH_CHILD || lman.state == LMAN_STATE_END_SEARCH_CHILD || lman.state == LMAN_STATE_WAIT_RECV_CHILD_NAME)\n    {\n        newSlot = ((gRfuLinkStatus->connSlotFlag ^ lman.connectSlot_flag_old) & gRfuLinkStatus->connSlotFlag) & ~gRfuLinkStatus->getNameFlag;\n        lman.connectSlot_flag_old = gRfuLinkStatus->connSlotFlag;\n        if (newSlot)\n        {\n            lman.param[0] = newSlot;\n            rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_DETECTED, 1);\n        }\n        newAcceptSlot = 0x00;\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n        {\n            tgtSlot = 1 << i;\n            flags = 0x00;\n            if (newSlot & tgtSlot)\n            {\n                lman.nameAcceptTimer.count[i] = lman.nameAcceptTimer.count_max;\n                lman.nameAcceptTimer.active |= tgtSlot;\n            }\n            else if (lman.nameAcceptTimer.active & tgtSlot)\n            {\n                if (gRfuSlotStatusNI[i]->recv.state == SLOT_STATE_RECV_SUCCESS)\n                {\n                    if (gRfuSlotStatusNI[i]->recv.dataType == 1)\n                    {\n                        flags = RN_NAME_TIMER_CLEAR;\n                        for (ptr = lman.acceptable_serialNo_list; *ptr != 0xFFFF; ptr++)\n                        {\n                            if (gRfuLinkStatus->partner[i].serialNo == *ptr)\n                            {\n                                lman.acceptSlot_flag |= tgtSlot;\n                                lman.acceptCount++;\n                                newAcceptSlot |= tgtSlot;\n                                flags |= RN_ACCEPT;\n                                break;\n                            }\n                        }\n                        if (!(flags & RN_ACCEPT))\n                        {\n                            flags |= RN_DISCONNECT;\n                        }\n                    }\n                }\n                else if (--lman.nameAcceptTimer.count[i] == 0)\n                {\n                    flags = RN_NAME_TIMER_CLEAR | RN_DISCONNECT;\n                }\n                if (flags & RN_NAME_TIMER_CLEAR)\n                {\n                    lman.nameAcceptTimer.active &= ~tgtSlot;\n                    lman.nameAcceptTimer.count[i] = 0;\n                    rfu_clearSlot(TYPE_NI_RECV, i);\n                }\n                if (flags & RN_DISCONNECT)\n                {\n                    lman.reserveDisconnectSlot_flag |= tgtSlot;\n                }\n            }\n        }\n        if (newAcceptSlot)\n        {\n            lman.param[0] = newAcceptSlot;\n            rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED, 1);\n        }\n        if (lman.reserveDisconnectSlot_flag)\n        {\n            flags = 1;\n            if (gRfuLinkStatus->sendSlotUNIFlag)\n            {\n                if (((lman.parentAck_flag & lman.acceptSlot_flag) != lman.acceptSlot_flag))\n                {\n                    flags = 0;\n                }\n            }\n            if (flags)\n            {\n                rfu_LMAN_disconnect(lman.reserveDisconnectSlot_flag);\n                lman.param[0] = lman.reserveDisconnectSlot_flag;\n                lman.reserveDisconnectSlot_flag = 0;\n                rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_REJECTED, 1);\n            }\n        }\n        if (lman.nameAcceptTimer.active == 0 && lman.state == LMAN_STATE_WAIT_RECV_CHILD_NAME)\n        {\n            if (lman.pcswitch_flag == 0)\n            {\n                lman.state = lman.next_state = LMAN_STATE_READY;\n                rfu_LMAN_occureCallback(LMAN_MSG_END_WAIT_CHILD_NAME, 0);\n            }\n            else\n            {\n                if (lman.pcswitch_flag == PCSWITCH_1ST_SC)\n                {\n                    lman.pcswitch_flag = PCSWITCH_2ND_SP_START;\n                    lman.state = LMAN_STATE_START_SEARCH_PARENT;\n                }\n                else\n                {\n                    lman.pcswitch_flag = PCSWITCH_1ST_SC_START;\n                    lman.state = LMAN_STATE_START_SEARCH_CHILD;\n                }\n                if (lman.acceptSlot_flag)\n                {\n                    lman.connect_period = 0;\n                    lman.pcswitch_flag = PCSWITCH_SC_LOCK;\n                    lman.state = LMAN_STATE_START_SEARCH_CHILD;\n                }\n            }\n        }\n    }\n}\n\nstatic void rfu_LMAN_CHILD_checkSendChildName(void)\n{\n    u16 imeBak = REG_IME;\n    REG_IME = 0;\n    if (lman.state == LMAN_STATE_SEND_CHILD_NAME)\n    {\n        if (--lman.nameAcceptTimer.count[lman.child_slot] == 0 || gRfuSlotStatusNI[lman.child_slot]->send.state == SLOT_STATE_SEND_FAILED)\n        {\n            rfu_LMAN_requestChangeAgbClockMaster();\n            lman.state = LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER;\n            rfu_clearSlot(TYPE_NI_SEND, lman.child_slot);\n            lman.nameAcceptTimer.active &= ~(1 << lman.child_slot);\n            lman.nameAcceptTimer.count[lman.child_slot] = 0;\n        }\n    }\n    REG_IME = imeBak;\n    if (lman.state == LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER)\n    {\n        if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON)\n        {\n            rfu_LMAN_requestChangeAgbClockMaster();\n        }\n        if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF)\n        {\n            lman.state = lman.next_state = LMAN_STATE_READY;\n            rfu_LMAN_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);\n            lman.param[0] = 0;\n            rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED, 1);\n        }\n    }\n}\n\nstatic void rfu_LMAN_CHILD_checkSendChildName2(void)\n{\n    if (lman.state == LMAN_STATE_SEND_CHILD_NAME && gRfuSlotStatusNI[lman.child_slot]->send.state == SLOT_STATE_SEND_SUCCESS)\n    {\n        lman.state = lman.next_state = LMAN_STATE_READY;\n        rfu_clearSlot(TYPE_NI_SEND, lman.child_slot);\n        lman.nameAcceptTimer.active &= ~(1 << lman.child_slot);\n        lman.nameAcceptTimer.count[lman.child_slot] = 0;\n        rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_COMPLETED, 0);\n    }\n}\n\nstatic void rfu_LMAN_CHILD_linkRecoveryProcess(void)\n{\n    if (lman.parent_child == MODE_CHILD && lman.linkRecovery_start_flag == LINK_RECOVERY_START)\n    {\n        lman.state_bak[0] = lman.state;\n        lman.state_bak[1] = lman.next_state;\n        lman.state = LMAN_STATE_START_LINK_RECOVERY;\n        lman.next_state = LMAN_STATE_POLL_LINK_RECOVERY;\n        lman.linkRecovery_start_flag = LINK_RECOVERY_EXE;\n    }\n}\n\nstatic u8 rfu_LMAN_CHILD_checkEnableParentCandidate(void)\n{\n    u8 i;\n    u16 *serialNo;\n    u8 flags = 0x00;\n\n    for (i = 0; i < gRfuLinkStatus->findParentCount; i++)\n    {\n        for (serialNo = lman.acceptable_serialNo_list; *serialNo != 0xFFFF; serialNo++)\n        {\n            if (gRfuLinkStatus->partner[i].serialNo == *serialNo)\n            {\n                flags |= (1 << i);\n            }\n        }\n    }\n    return flags;\n}\n\nstatic void rfu_LMAN_occureCallback(u8 msg, u8 param_count)\n{\n    if (lman.LMAN_callback != NULL)\n    {\n        lman.LMAN_callback(msg, param_count);\n    }\n    lman.param[0] = lman.param[1] = 0;\n}\n\nstatic void rfu_LMAN_disconnect(u8 bm_disconnectedSlot)\n{\n    u8 active_bak = lman.active;\n    lman.active = 1;\n    rfu_REQ_disconnect(bm_disconnectedSlot);\n    rfu_waitREQComplete();\n    lman.active = active_bak;\n}\n\nstatic void rfu_LMAN_reflectCommunicationStatus(u8 bm_disconnectedSlot)\n{\n    u8 i;\n\n    if (gRfuLinkStatus->sendSlotNIFlag)\n    {\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n        {\n            if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->send.bmSlot & bm_disconnectedSlot)\n            {\n                rfu_changeSendTarget(TYPE_NI, i, gRfuSlotStatusNI[i]->send.bmSlot & ~bm_disconnectedSlot);\n            }\n        }\n    }\n    if (gRfuLinkStatus->recvSlotNIFlag)\n    {\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n        {\n            if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.bmSlot & bm_disconnectedSlot)\n            {\n                rfu_NI_stopReceivingData(i);\n            }\n        }\n    }\n    if (gRfuLinkStatus->sendSlotUNIFlag)\n    {\n        gRfuLinkStatus->sendSlotUNIFlag &= ~bm_disconnectedSlot;\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n        {\n            if (gRfuSlotStatusUNI[i]->send.state == SLOT_STATE_SEND_UNI && bm_disconnectedSlot & gRfuSlotStatusUNI[i]->send.bmSlot)\n            {\n                gRfuSlotStatusUNI[i]->send.bmSlot &= ~bm_disconnectedSlot;\n            }\n        }\n    }\n}\n\nstatic void rfu_LMAN_checkNICommunicateStatus(void)\n{\n    u8 i;\n    u8 j;\n    u8 flags;\n\n    if (lman.NI_failCounter_limit)\n    {\n        if (gRfuLinkStatus->sendSlotNIFlag)\n        {\n            for (i = 0; i < RFU_CHILD_MAX; i++)\n            {\n                if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG)\n                {\n                    flags = 0;\n                    for (j = 0; j < RFU_CHILD_MAX; j++)\n                    {\n                        if ((gRfuSlotStatusNI[i]->send.bmSlot >> j) & 1 && gRfuSlotStatusNI[j]->send.failCounter > lman.NI_failCounter_limit)\n                        {\n                            flags |= (1 << j);\n                        }\n                        if (flags)\n                        {\n                            rfu_changeSendTarget(TYPE_NI, i, flags ^ gRfuSlotStatusNI[i]->send.bmSlot);\n                        }\n                    }\n                }\n            }\n        }\n        if (gRfuLinkStatus->recvSlotNIFlag)\n        {\n            for (i = 0; i < RFU_CHILD_MAX; i++)\n            {\n                if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.failCounter > lman.NI_failCounter_limit)\n                {\n                    rfu_NI_stopReceivingData(i);\n                }\n            }\n        }\n    }\n}\n\nvoid rfu_LMAN_setMSCCallback(void (*MSC_callback_p)(u16))\n{\n    lman.MSC_callback = MSC_callback_p;\n    rfu_setMSCCallback(rfu_LMAN_MSC_callback);\n}\n\nstatic void rfu_LMAN_setLMANCallback(void (*func)(u8, u8))\n{\n    lman.LMAN_callback = func;\n}\n\nu8 rfu_LMAN_setLinkRecovery(u8 enable_flag, u16 recovery_period)\n{\n    u16 imeBak;\n    if (lman.linkRecovery_enable && enable_flag == 0 && lman.linkRecoveryTimer.active)\n    {\n        return LMAN_ERROR_NOW_LINK_RECOVERY;\n    }\n    imeBak = REG_IME;\n    REG_IME = 0;\n    lman.linkRecovery_enable = enable_flag;\n    lman.linkRecoveryTimer.count_max = recovery_period;\n    REG_IME = imeBak;\n    return 0;\n}\n\nstatic u8 rfu_LMAN_setNIFailCounterLimit(u16 NI_failCounter_limit)\n{\n    if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag)\n    {\n        lman.param[0] = 6;\n        rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);\n        return LMAN_ERROR_NOW_COMMUNICATION;\n    }\n    lman.NI_failCounter_limit = NI_failCounter_limit;\n    return 0;\n}\n\nstatic u8 rfu_LMAN_setFastSearchParent(u8 enable_flag)\n{\n    if (lman.state == LMAN_STATE_START_SEARCH_PARENT || lman.state == LMAN_STATE_POLL_SEARCH_PARENT || lman.state == LMAN_STATE_END_SEARCH_PARENT)\n    {\n        lman.param[0] = 7;\n        rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);\n        return LMAN_ERROR_NOW_SEARCH_PARENT;\n    }\n    if (enable_flag)\n    {\n        lman.fastSearchParent_flag = FSP_ON;\n    }\n    else\n    {\n        lman.fastSearchParent_flag = 0;\n    }\n    return 0;\n}\n\nstatic void rfu_LMAN_managerChangeAgbClockMaster(void)\n{\n    if (lman.childClockSlave_flag != RFU_CHILD_CLOCK_SLAVE_OFF)\n    {\n        lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_OFF;\n        rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_MASTER, 0);\n    }\n}\n\nvoid rfu_LMAN_requestChangeAgbClockMaster(void)\n{\n    if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF)\n    {\n        rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_MASTER, 0);\n    }\n    else if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON)\n    {\n        lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_OFF_REQ;\n    }\n}\n\nvoid rfu_LMAN_forceChangeSP(void)\n{\n    if (lman.pcswitch_flag)\n    {\n        switch (lman.state)\n        {\n        case LMAN_STATE_START_SEARCH_CHILD:\n            lman.pcswitch_flag = PCSWITCH_2ND_SP_START;\n            lman.state = LMAN_STATE_START_SEARCH_PARENT;\n            break;\n        case LMAN_STATE_POLL_SEARCH_CHILD:\n            lman.pcswitch_flag = PCSWITCH_1ST_SC;\n            lman.connect_period = 1;\n            break;\n        case LMAN_STATE_END_SEARCH_CHILD:\n        case LMAN_STATE_WAIT_RECV_CHILD_NAME:\n            lman.pcswitch_flag = PCSWITCH_1ST_SC;\n            break;\n        case LMAN_STATE_START_SEARCH_PARENT:\n        case LMAN_STATE_POLL_SEARCH_PARENT:\n            lman.connect_period = PCSWITCH_SP_PERIOD;\n            break;\n        case LMAN_STATE_END_SEARCH_PARENT:\n            lman.connect_period = PCSWITCH_SP_PERIOD;\n            lman.state = LMAN_STATE_POLL_SEARCH_PARENT;\n            break;\n        }\n    }\n}\n"
  },
  {
    "path": "src/agb_flash.c",
    "content": "#include \"gba/gba.h\"\n#include \"gba/flash_internal.h\"\n\nstatic u8 sTimerNum;\nstatic u16 sTimerCount;\nstatic vu16 *sTimerReg;\nstatic u16 sSavedIme;\n\nu8 gFlashTimeoutFlag;\nu8 (*PollFlashStatus)(u8 *);\nu16 (*WaitForFlashWrite)(u8 phase, u8 *addr, u8 lastData);\nu16 (*ProgramFlashSector)(u16 sectorNum, void *src);\nconst struct FlashType *gFlash;\nu16 (*ProgramFlashByte)(u16 sectorNum, u32 offset, u8 data);\nu16 gFlashNumRemainingBytes;\nu16 (*EraseFlashChip)();\nu16 (*EraseFlashSector)(u16 sectorNum);\nconst u16 *gFlashMaxTime;\n\nvoid SetReadFlash1(u16 *dest);\n\nvoid SwitchFlashBank(u8 bankNum)\n{\n    FLASH_WRITE(0x5555, 0xAA);\n    FLASH_WRITE(0x2AAA, 0x55);\n    FLASH_WRITE(0x5555, 0xB0);\n    FLASH_WRITE(0x0000, bankNum);\n}\n\n#define DELAY()                  \\\ndo {                             \\\n    vu16 i;                      \\\n    for (i = 20000; i != 0; i--) \\\n        ;                        \\\n} while (0)\n\nu16 ReadFlashId(void)\n{\n    u16 flashId;\n    u16 readFlash1Buffer[0x20];\n    u8 (*readFlash1)(u8 *);\n\n    SetReadFlash1(readFlash1Buffer);\n    readFlash1 = (u8 (*)(u8 *))((s32)readFlash1Buffer + 1);\n\n    // Enter ID mode.\n    FLASH_WRITE(0x5555, 0xAA);\n    FLASH_WRITE(0x2AAA, 0x55);\n    FLASH_WRITE(0x5555, 0x90);\n    DELAY();\n\n    flashId = readFlash1(FLASH_BASE + 1) << 8;\n    flashId |= readFlash1(FLASH_BASE);\n\n    // Leave ID mode.\n    FLASH_WRITE(0x5555, 0xAA);\n    FLASH_WRITE(0x2AAA, 0x55);\n    FLASH_WRITE(0x5555, 0xF0);\n    FLASH_WRITE(0x5555, 0xF0);\n    DELAY();\n\n    return flashId;\n}\n\nvoid FlashTimerIntr(void)\n{\n    if (sTimerCount != 0 && --sTimerCount == 0)\n        gFlashTimeoutFlag = 1;\n}\n\nu16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void))\n{\n    if (timerNum >= 4)\n        return 1;\n\n    sTimerNum = timerNum;\n    sTimerReg = &REG_TMCNT_L(sTimerNum);\n    *intrFunc = FlashTimerIntr;\n    return 0;\n}\n\nvoid StartFlashTimer(u8 phase)\n{\n    const u16 *maxTime = &gFlashMaxTime[phase * 3];\n    sSavedIme = REG_IME;\n    REG_IME = 0;\n    sTimerReg[1] = 0;\n    REG_IE |= (INTR_FLAG_TIMER0 << sTimerNum);\n    gFlashTimeoutFlag = 0;\n    sTimerCount = *maxTime++;\n    *sTimerReg++ = *maxTime++;\n    *sTimerReg-- = *maxTime++;\n    REG_IF = (INTR_FLAG_TIMER0 << sTimerNum);\n    REG_IME = 1;\n}\n\nvoid StopFlashTimer(void)\n{\n    REG_IME = 0;\n    *sTimerReg++ = 0;\n    *sTimerReg-- = 0;\n    REG_IE &= ~(INTR_FLAG_TIMER0 << sTimerNum);\n    REG_IME = sSavedIme;\n}\n\nu8 ReadFlash1(u8 *addr)\n{\n    return *addr;\n}\n\nvoid SetReadFlash1(u16 *dest)\n{\n    u16 *src;\n    u32 i;\n\n    PollFlashStatus = (u8 (*)(u8 *))((s32)dest + 1);\n\n    src = (u16 *)ReadFlash1;\n    src = (u16 *)((s32)src ^ 1);\n\n    i = ((s32)SetReadFlash1 - (s32)ReadFlash1) >> 1;\n\n    while (i != 0)\n    {\n        *dest++ = *src++;\n        i--;\n    }\n}\n\n\n// Using volatile here to make sure the flash memory will ONLY be read as bytes, to prevent any compiler optimizations.\nvoid ReadFlash_Core(vu8 *src, u8 *dest, u32 size)\n{\n    while (size-- != 0)\n    {\n        *dest++ = *src++;\n    }\n}\n\nvoid ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size)\n{\n    u8 *src;\n    u32 i;\n    vu16 readFlash_Core_Buffer[0x40];\n    vu16 *funcSrc;\n    vu16 *funcDest;\n    void (*readFlash_Core)(vu8 *, u8 *, u32);\n\n    REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;\n\n    if (gFlash->romSize == FLASH_ROM_SIZE_1M)\n    {\n        SwitchFlashBank(sectorNum / SECTORS_PER_BANK);\n        sectorNum %= SECTORS_PER_BANK;\n    }\n\n    funcSrc = (vu16 *)ReadFlash_Core;\n    funcSrc = (vu16 *)((s32)funcSrc ^ 1);\n    funcDest = readFlash_Core_Buffer;\n\n    i = ((s32)ReadFlash - (s32)ReadFlash_Core) >> 1;\n\n    while (i != 0)\n    {\n        *funcDest++ = *funcSrc++;\n        i--;\n    }\n\n    readFlash_Core = (void (*)(vu8 *, u8 *, u32))((s32)readFlash_Core_Buffer + 1);\n\n    src = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset;\n\n    readFlash_Core(src, dest, size);\n}\n\nu32 VerifyFlashSector_Core(u8 *src, u8 *tgt, u32 size)\n{\n    while (size-- != 0)\n    {\n        if (*tgt++ != *src++)\n            return (u32)(tgt - 1);\n    }\n\n    return 0;\n}\n\nu32 VerifyFlashSector(u16 sectorNum, u8 *src)\n{\n    u32 i;\n    vu16 verifyFlashSector_Core_Buffer[0x80];\n    vu16 *funcSrc;\n    vu16 *funcDest;\n    u8 *tgt;\n    u16 size;\n    u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32);\n\n    REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;\n\n    if (gFlash->romSize == FLASH_ROM_SIZE_1M)\n    {\n        SwitchFlashBank(sectorNum / SECTORS_PER_BANK);\n        sectorNum %= SECTORS_PER_BANK;\n    }\n\n    funcSrc = (vu16 *)VerifyFlashSector_Core;\n    funcSrc = (vu16 *)((s32)funcSrc ^ 1);\n    funcDest = verifyFlashSector_Core_Buffer;\n\n    i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1;\n\n    while (i != 0)\n    {\n        *funcDest++ = *funcSrc++;\n        i--;\n    }\n\n    verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1);\n\n    tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift);\n    size = gFlash->sector.size;\n\n    return verifyFlashSector_Core(src, tgt, size); // return 0 if verified.\n}\n\nu32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n)\n{\n    u32 i;\n    vu16 verifyFlashSector_Core_Buffer[0x80];\n    vu16 *funcSrc;\n    vu16 *funcDest;\n    u8 *tgt;\n    u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32);\n\n    if (gFlash->romSize == FLASH_ROM_SIZE_1M)\n    {\n        SwitchFlashBank(sectorNum / SECTORS_PER_BANK);\n        sectorNum %= SECTORS_PER_BANK;\n    }\n\n    REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;\n\n    funcSrc = (vu16 *)VerifyFlashSector_Core;\n    funcSrc = (vu16 *)((s32)funcSrc ^ 1);\n    funcDest = verifyFlashSector_Core_Buffer;\n\n    i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1;\n\n    while (i != 0)\n    {\n        *funcDest++ = *funcSrc++;\n        i--;\n    }\n\n    verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1);\n\n    tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift);\n\n    return verifyFlashSector_Core(src, tgt, n);\n}\n\nu32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src)\n{\n    u32 i;\n    u32 result;\n\n    for (i = 0; i < 3; i++) // 3 attempts\n    {\n        result = ProgramFlashSector(sectorNum, src);\n        if (result != 0)\n            continue;\n\n        result = VerifyFlashSector(sectorNum, src);\n        if (result == 0)\n            break;\n    }\n\n    return result; // return 0 if verified and programmed.\n}\n\nu32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *dataSrc, u32 n)\n{\n    u32 i;\n    u32 result;\n\n    for (i = 0; i < 3; i++)\n    {\n        result = ProgramFlashSector(sectorNum, dataSrc);\n        if (result != 0)\n            continue;\n\n        result = VerifyFlashSectorNBytes(sectorNum, dataSrc, n);\n        if (result == 0)\n            break;\n    }\n\n    return result;\n}\n"
  },
  {
    "path": "src/agb_flash_1m.c",
    "content": "#include \"gba/gba.h\"\n#include \"gba/flash_internal.h\"\n\nstatic const char AgbLibFlashVersion[] = \"FLASH1M_V103\";\n\nconst struct FlashSetupInfo * const sSetupInfos[] =\n{\n    &MX29L010,\n    &LE26FV10N1TS,\n    &DefaultFlash\n};\n\nu16 IdentifyFlash(void)\n{\n    u16 result;\n    u16 flashId;\n    const struct FlashSetupInfo * const *setupInfo;\n\n    REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;\n\n    flashId = ReadFlashId();\n\n    setupInfo = sSetupInfos;\n    result = 1;\n\n    for (;;)\n    {\n        if ((*setupInfo)->type.ids.separate.makerId == 0)\n            break;\n\n        if (flashId == (*setupInfo)->type.ids.joined)\n        {\n            result = 0;\n            break;\n        }\n\n        setupInfo++;\n    }\n\n    ProgramFlashByte = (*setupInfo)->programFlashByte;\n    ProgramFlashSector = (*setupInfo)->programFlashSector;\n    EraseFlashChip = (*setupInfo)->eraseFlashChip;\n    EraseFlashSector = (*setupInfo)->eraseFlashSector;\n    WaitForFlashWrite = (*setupInfo)->WaitForFlashWrite;\n    gFlashMaxTime = (*setupInfo)->maxTime;\n    gFlash = &(*setupInfo)->type;\n\n    return result;\n}\n\nu16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData)\n{\n    u16 result = 0;\n    u8 status;\n\n    StartFlashTimer(phase);\n\n    while ((status = PollFlashStatus(addr)) != lastData)\n    {\n        if (status & 0x20)\n        {\n            // The write operation exceeded the flash chip's time limit.\n\n            if (PollFlashStatus(addr) == lastData)\n                break;\n\n            FLASH_WRITE(0x5555, 0xF0);\n            result = phase | 0xA000u;\n            break;\n        }\n\n        if (gFlashTimeoutFlag)\n        {\n            if (PollFlashStatus(addr) == lastData)\n                break;\n\n            FLASH_WRITE(0x5555, 0xF0);\n            result = phase | 0xC000u;\n            break;\n        }\n    }\n\n    StopFlashTimer();\n\n    return result;\n}\n"
  },
  {
    "path": "src/agb_flash_le.c",
    "content": "#include \"gba/gba.h\"\n#include \"gba/flash_internal.h\"\n\nconst u16 leMaxTime[] =\n{\n      10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,\n      10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,\n    2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,\n    2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,\n};\n\nconst struct FlashSetupInfo LE26FV10N1TS =\n{\n    ProgramFlashByte_MX,\n    ProgramFlashSector_MX,\n    EraseFlashChip_MX,\n    EraseFlashSector_MX,\n    WaitForFlashWrite_Common,\n    leMaxTime,\n    {\n        131072, // ROM size\n        {\n            4096, // sector size\n              12, // bit shift to multiply by sector size (4096 == 1 << 12)\n              32, // number of sectors\n               0  // appears to be unused\n        },\n        { 3, 1 }, // wait state setup data\n        { { 0x62, 0x13 } } // ID\n    }\n};\n"
  },
  {
    "path": "src/agb_flash_mx.c",
    "content": "#include \"gba/gba.h\"\n#include \"gba/flash_internal.h\"\n\nconst u16 mxMaxTime[] =\n{\n      10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,\n      10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,\n    2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,\n    2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,\n};\n\nconst struct FlashSetupInfo MX29L010 =\n{\n    ProgramFlashByte_MX,\n    ProgramFlashSector_MX,\n    EraseFlashChip_MX,\n    EraseFlashSector_MX,\n    WaitForFlashWrite_Common,\n    mxMaxTime,\n    {\n        131072, // ROM size\n        {\n            4096, // sector size\n              12, // bit shift to multiply by sector size (4096 == 1 << 12)\n              32, // number of sectors\n               0  // appears to be unused\n        },\n        { 3, 1 }, // wait state setup data\n#if defined(GERMAN) && defined(SAPPHIRE)\n        { { 0xBF, 0xD4 } } // ID\n#else\n        { { 0xC2, 0x09 } } // ID\n#endif\n    }\n};\n\nconst struct FlashSetupInfo DefaultFlash =\n{\n    ProgramFlashByte_MX,\n    ProgramFlashSector_MX,\n    EraseFlashChip_MX,\n    EraseFlashSector_MX,\n    WaitForFlashWrite_Common,\n    mxMaxTime,\n    {\n        131072, // ROM size\n        {\n            4096, // sector size\n              12, // bit shift to multiply by sector size (4096 == 1 << 12)\n              32, // number of sectors\n               0  // appears to be unused\n        },\n        { 3, 1 }, // wait state setup data\n        { { 0x00, 0x00 } } // ID of 0\n    }\n};\n\nu16 EraseFlashChip_MX(void)\n{\n    u16 result;\n    u16 readFlash1Buffer[0x20];\n\n    REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];\n\n    FLASH_WRITE(0x5555, 0xAA);\n    FLASH_WRITE(0x2AAA, 0x55);\n    FLASH_WRITE(0x5555, 0x80);\n    FLASH_WRITE(0x5555, 0xAA);\n    FLASH_WRITE(0x2AAA, 0x55);\n    FLASH_WRITE(0x5555, 0x10);\n\n    SetReadFlash1(readFlash1Buffer);\n\n    result = WaitForFlashWrite(3, FLASH_BASE, 0xFF);\n\n    REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;\n\n    return result;\n}\n\nu16 EraseFlashSector_MX(u16 sectorNum)\n{\n    u16 numTries;\n    u16 result;\n    u8 *addr;\n    u16 readFlash1Buffer[0x20];\n\n    if (sectorNum >= gFlash->sector.count)\n        return 0x80FF;\n\n    SwitchFlashBank(sectorNum / SECTORS_PER_BANK);\n    sectorNum %= SECTORS_PER_BANK;\n\n    numTries = 0;\n\ntry_erase:\n    REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];\n\n    addr = FLASH_BASE + (sectorNum << gFlash->sector.shift);\n\n    FLASH_WRITE(0x5555, 0xAA);\n    FLASH_WRITE(0x2AAA, 0x55);\n    FLASH_WRITE(0x5555, 0x80);\n    FLASH_WRITE(0x5555, 0xAA);\n    FLASH_WRITE(0x2AAA, 0x55);\n    *addr = 0x30;\n\n    SetReadFlash1(readFlash1Buffer);\n\n    result = WaitForFlashWrite(2, addr, 0xFF);\n\n    if (!(result & 0xA000) || numTries > 3)\n        goto done;\n\n    numTries++;\n\n    goto try_erase;\n\ndone:\n    REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;\n\n    return result;\n}\n\nu16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data)\n{\n    u8 *addr;\n    u16 readFlash1Buffer[0x20];\n\n    if (offset >= gFlash->sector.size)\n        return 0x8000;\n\n    SwitchFlashBank(sectorNum / SECTORS_PER_BANK);\n    sectorNum %= SECTORS_PER_BANK;\n\n    addr = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset;\n\n    SetReadFlash1(readFlash1Buffer);\n\n    REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];\n\n    FLASH_WRITE(0x5555, 0xAA);\n    FLASH_WRITE(0x2AAA, 0x55);\n    FLASH_WRITE(0x5555, 0xA0);\n    *addr = data;\n\n    return WaitForFlashWrite(1, addr, data);\n}\n\nstatic u16 ProgramByte(u8 *src, u8 *dest)\n{\n    FLASH_WRITE(0x5555, 0xAA);\n    FLASH_WRITE(0x2AAA, 0x55);\n    FLASH_WRITE(0x5555, 0xA0);\n    *dest = *src;\n\n    return WaitForFlashWrite(1, dest, *src);\n}\n\nu16 ProgramFlashSector_MX(u16 sectorNum, void *src)\n{\n    u16 result;\n    u8 *dest;\n    u16 readFlash1Buffer[0x20];\n\n    if (sectorNum >= gFlash->sector.count)\n        return 0x80FF;\n\n    result = EraseFlashSector_MX(sectorNum);\n\n    if (result != 0)\n        return result;\n\n    SwitchFlashBank(sectorNum / SECTORS_PER_BANK);\n    sectorNum %= SECTORS_PER_BANK;\n\n    SetReadFlash1(readFlash1Buffer);\n\n    REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];\n\n    gFlashNumRemainingBytes = gFlash->sector.size;\n    dest = FLASH_BASE + (sectorNum << gFlash->sector.shift);\n\n    while (gFlashNumRemainingBytes > 0)\n    {\n        result = ProgramByte(src, dest);\n\n        if (result != 0)\n            break;\n\n        gFlashNumRemainingBytes--;\n        src++;\n        dest++;\n    }\n\n    return result;\n}\n"
  },
  {
    "path": "src/bag.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"item_menu.h\"\n#include \"text_window.h\"\n#include \"menu_helpers.h\"\n#include \"new_menu_helpers.h\"\n#include \"menu.h\"\n#include \"money.h\"\n#include \"strings.h\"\n\nstatic const u16 sBagWindowPalF[] = INCBIN_U16(\"graphics/item_menu/bag_window_pal.gbapal\");\n\nstatic const u8 sTextColors[][3] = {\n    {0, 1, 2},\n    {0, 2, 3},\n    {0, 3, 2},\n    {0, 8, 9}\n};\n\nstatic const struct WindowTemplate sDefaultBagWindowsStd[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 1,\n        .width = 18,\n        .height = 12,\n        .paletteNum = 15,\n        .baseBlock = 0x008a\n    }, {\n        .bg = 0,\n        .tilemapLeft = 5,\n        .tilemapTop = 14,\n        .width = 25,\n        .height = 6,\n        .paletteNum = 15,\n        .baseBlock = 0x0162\n    }, {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 9,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x01f8\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sDefaultBagWindowsDeposit[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 1,\n        .width = 18,\n        .height = 12,\n        .paletteNum = 15,\n        .baseBlock = 0x008a\n    }, {\n        .bg = 0,\n        .tilemapLeft = 5,\n        .tilemapTop = 14,\n        .width = 25,\n        .height = 6,\n        .paletteNum = 15,\n        .baseBlock = 0x0162\n    }, {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 12,\n        .baseBlock = 0x01f8\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 24,\n        .tilemapTop = 15,\n        .width = 5,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x242\n    }, {\n        .bg = 0,\n        .tilemapLeft = 17,\n        .tilemapTop = 9,\n        .width = 12,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x242\n    }, {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 8,\n        .height = 3,\n        .paletteNum = 12,\n        .baseBlock = 0x272\n    }, {\n        .bg = 0,\n        .tilemapLeft = 23,\n        .tilemapTop = 15,\n        .width = 6,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x28a\n    }, {\n        .bg = 0,\n        .tilemapLeft = 21,\n        .tilemapTop = 9,\n        .width = 6,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x28a\n    }, {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x2a2\n    }, {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 15,\n        .width = 14,\n        .height = 4,\n        .paletteNum = 12,\n        .baseBlock = 0x2a2\n    }, {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 15,\n        .width = 15,\n        .height = 4,\n        .paletteNum = 12,\n        .baseBlock = 0x2da\n    }, {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 15,\n        .width = 16,\n        .height = 4,\n        .paletteNum = 12,\n        .baseBlock = 0x316\n    }, {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 15,\n        .width = 23,\n        .height = 4,\n        .paletteNum = 12,\n        .baseBlock = 0x356\n    }, {\n        .bg = 0,\n        .tilemapLeft = 22,\n        .tilemapTop = 17,\n        .width = 7,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x20a\n    }, {\n        .bg = 0,\n        .tilemapLeft = 22,\n        .tilemapTop = 15,\n        .width = 7,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x20a\n    }, {\n        .bg = 0,\n        .tilemapLeft = 22,\n        .tilemapTop = 13,\n        .width = 7,\n        .height = 6,\n        .paletteNum = 15,\n        .baseBlock = 0x20a\n    }, {\n        .bg = 0,\n        .tilemapLeft = 22,\n        .tilemapTop = 11,\n        .width = 7,\n        .height = 8,\n        .paletteNum = 15,\n        .baseBlock = 0x20a\n    }\n};\n\nstatic const u8 sUnused[] = {16, 8, 4};\n\nstatic EWRAM_DATA u8 sOpenWindows[11] = {};\n\nvoid InitBagWindows(void)\n{\n    u32 i;\n\n    if (gBagMenuState.location != 3)\n        InitWindows(sDefaultBagWindowsStd);\n    else\n        InitWindows(sDefaultBagWindowsDeposit);\n    DeactivateAllTextPrinters();\n    LoadUserWindowGfx(0, 0x64, BG_PLTT_ID(14));\n    LoadMenuMessageWindowGfx(0, 0x6D, BG_PLTT_ID(13));\n    LoadStdWindowGfx(0, 0x81, BG_PLTT_ID(12));\n    LoadPalette(sBagWindowPalF, BG_PLTT_ID(15), sizeof(sBagWindowPalF));\n    for (i = 0; i < 3; i++)\n    {\n        FillWindowPixelBuffer(i, 0x00);\n        PutWindowTilemap(i);\n    }\n    ScheduleBgCopyTilemapToVram(0);\n    for (i = 0; i < 11; i++)\n    {\n        sOpenWindows[i] = 0xFF;\n    }\n}\n\nvoid BagPrintTextOnWindow(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx)\n{\n    AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, sTextColors[colorIdx], speed, str);\n}\n\nvoid BagPrintTextOnWin1CenteredColor0(const u8 * str, u8 unused)\n{\n    u32 x = 0x48 - GetStringWidth(FONT_NORMAL_COPY_1, str, 0);\n    AddTextPrinterParameterized3(2, FONT_NORMAL_COPY_1, x / 2, 1, sTextColors[0], 0, str);\n}\n\nvoid BagDrawDepositItemTextBox(void)\n{\n    u32 x;\n    DrawStdFrameWithCustomTileAndPalette(2, FALSE, 0x081, 12);\n    x = 0x40 - GetStringWidth(FONT_SMALL, gText_DepositItem, 0);\n    AddTextPrinterParameterized(2, FONT_SMALL, gText_DepositItem, x / 2, 1, 0, NULL);\n}\n\nu8 ShowBagWindow(u8 whichWindow, u8 nItems)\n{\n    if (sOpenWindows[whichWindow] == 0xFF)\n    {\n        sOpenWindows[whichWindow] = AddWindow(&sWindowTemplates[whichWindow + nItems]);\n        if (whichWindow != 6)\n        {\n            DrawStdFrameWithCustomTileAndPalette(sOpenWindows[whichWindow], FALSE, 0x064, 14);\n        }\n        else\n        {\n            DrawStdFrameWithCustomTileAndPalette(sOpenWindows[whichWindow], FALSE, 0x081, 12);\n        }\n        ScheduleBgCopyTilemapToVram(0);\n    }\n    return sOpenWindows[whichWindow];\n}\n\nvoid HideBagWindow(u8 whichWindow)\n{\n    ClearStdWindowAndFrameToTransparent(sOpenWindows[whichWindow], FALSE);\n    ClearWindowTilemap(sOpenWindows[whichWindow]);\n    RemoveWindow(sOpenWindows[whichWindow]);\n    ScheduleBgCopyTilemapToVram(0);\n    sOpenWindows[whichWindow] = 0xFF;\n}\n\nu8 OpenBagWindow(u8 whichWindow)\n{\n    if (sOpenWindows[whichWindow] == 0xFF)\n    {\n        sOpenWindows[whichWindow] = AddWindow(&sWindowTemplates[whichWindow]);\n    }\n    return sOpenWindows[whichWindow];\n}\n\nvoid CloseBagWindow(u8 whichWindow)\n{\n    if (sOpenWindows[whichWindow] != 0xFF)\n    {\n        ClearDialogWindowAndFrameToTransparent(sOpenWindows[whichWindow], FALSE);\n        ClearWindowTilemap(sOpenWindows[whichWindow]);\n        RemoveWindow(sOpenWindows[whichWindow]);\n        PutWindowTilemap(1);\n        ScheduleBgCopyTilemapToVram(0);\n        sOpenWindows[whichWindow] = 0xFF;\n    }\n}\n\nu8 GetBagWindow(u8 whichWindow)\n{\n    return sOpenWindows[whichWindow];\n}\n\nvoid BagCreateYesNoMenuBottomRight(u8 taskId, const struct YesNoFuncTable * ptrs)\n{\n    CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates[3], FONT_NORMAL, 0, 2, 0x064, 14, ptrs);\n}\n\nvoid BagCreateYesNoMenuTopRight(u8 taskId, const struct YesNoFuncTable * ptrs)\n{\n    CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates[4], FONT_NORMAL, 0, 2, 0x064, 14, ptrs);\n}\n\nvoid BagPrintMoneyAmount(void)\n{\n    PrintMoneyAmountInMoneyBoxWithBorder(ShowBagWindow(2, 0), 0x081, 0x0C, GetMoney(&gSaveBlock1Ptr->money));\n}\n\nvoid BagDrawTextBoxOnWindow(u8 windowId)\n{\n    DrawTextBorderOuter(windowId, 0x064, 14);\n}\n"
  },
  {
    "path": "src/battle_ai_script_commands.c",
    "content": "#include \"global.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"util.h\"\n#include \"event_data.h\"\n#include \"item.h\"\n#include \"random.h\"\n#include \"battle_ai_script_commands.h\"\n#include \"constants/abilities.h\"\n#include \"constants/battle_ai.h\"\n#include \"constants/battle_move_effects.h\"\n#include \"constants/moves.h\"\n\n#define AI_ACTION_DONE          0x0001\n#define AI_ACTION_FLEE          0x0002\n#define AI_ACTION_WATCH         0x0004\n#define AI_ACTION_DO_NOT_ATTACK 0x0008\n#define AI_ACTION_UNK5          0x0010\n#define AI_ACTION_UNK6          0x0020\n#define AI_ACTION_UNK7          0x0040\n#define AI_ACTION_UNK8          0x0080\n\n#define AI_THINKING_STRUCT (gBattleResources->ai)\n#define BATTLE_HISTORY (gBattleResources->battleHistory)\n\n// AI states\nenum\n{\n    AIState_SettingUp,\n    AIState_Processing,\n    AIState_FinishedProcessing,\n    AIState_DoNotProcess\n};\n\n/*\nsAIScriptPtr is a pointer to the next battle AI cmd command to read.\nwhen a command finishes processing, sAIScriptPtr is incremented by\nthe number of bytes that the current command had reserved for arguments\nin order to read the next command correctly. refer to battle_ai_scripts.s for the\nAI scripts.\n*/\n\nstatic EWRAM_DATA const u8 *sAIScriptPtr = NULL;\nextern u8 *gBattleAI_ScriptsTable[];\n\nstatic void Cmd_if_random_less_than(void);\nstatic void Cmd_if_random_greater_than(void);\nstatic void Cmd_if_random_equal(void);\nstatic void Cmd_if_random_not_equal(void);\nstatic void Cmd_score(void);\nstatic void Cmd_if_hp_less_than(void);\nstatic void Cmd_if_hp_more_than(void);\nstatic void Cmd_if_hp_equal(void);\nstatic void Cmd_if_hp_not_equal(void);\nstatic void Cmd_if_status(void);\nstatic void Cmd_if_not_status(void);\nstatic void Cmd_if_status2(void);\nstatic void Cmd_if_not_status2(void);\nstatic void Cmd_if_status3(void);\nstatic void Cmd_if_not_status3(void);\nstatic void Cmd_if_side_affecting(void);\nstatic void Cmd_if_not_side_affecting(void);\nstatic void Cmd_if_less_than(void);\nstatic void Cmd_if_more_than(void);\nstatic void Cmd_if_equal(void);\nstatic void Cmd_if_not_equal(void);\nstatic void Cmd_if_less_than_ptr(void);\nstatic void Cmd_if_more_than_ptr(void);\nstatic void Cmd_if_equal_ptr(void);\nstatic void Cmd_if_not_equal_ptr(void);\nstatic void Cmd_if_move(void);\nstatic void Cmd_if_not_move(void);\nstatic void Cmd_if_in_bytes(void);\nstatic void Cmd_if_not_in_bytes(void);\nstatic void Cmd_if_in_hwords(void);\nstatic void Cmd_if_not_in_hwords(void);\nstatic void Cmd_if_user_has_attacking_move(void);\nstatic void Cmd_if_user_has_no_attacking_moves(void);\nstatic void Cmd_get_turn_count(void);\nstatic void Cmd_get_type(void);\nstatic void Cmd_get_considered_move_power(void);\nstatic void Cmd_get_how_powerful_move_is(void);\nstatic void Cmd_get_last_used_battler_move(void);\nstatic void Cmd_if_equal_(void);\nstatic void Cmd_if_not_equal_(void);\nstatic void Cmd_if_would_go_first(void);\nstatic void Cmd_if_would_not_go_first(void);\nstatic void Cmd_nullsub_2A(void);\nstatic void Cmd_nullsub_2B(void);\nstatic void Cmd_count_alive_pokemon(void);\nstatic void Cmd_get_considered_move(void);\nstatic void Cmd_get_considered_move_effect(void);\nstatic void Cmd_get_ability(void);\nstatic void Cmd_get_highest_type_effectiveness(void);\nstatic void Cmd_if_type_effectiveness(void);\nstatic void Cmd_nullsub_32(void);\nstatic void Cmd_nullsub_33(void);\nstatic void Cmd_if_status_in_party(void);\nstatic void Cmd_if_status_not_in_party(void);\nstatic void Cmd_get_weather(void);\nstatic void Cmd_if_effect(void);\nstatic void Cmd_if_not_effect(void);\nstatic void Cmd_if_stat_level_less_than(void);\nstatic void Cmd_if_stat_level_more_than(void);\nstatic void Cmd_if_stat_level_equal(void);\nstatic void Cmd_if_stat_level_not_equal(void);\nstatic void Cmd_if_can_faint(void);\nstatic void Cmd_if_cant_faint(void);\nstatic void Cmd_if_has_move(void);\nstatic void Cmd_if_doesnt_have_move(void);\nstatic void Cmd_if_has_move_with_effect(void);\nstatic void Cmd_if_doesnt_have_move_with_effect(void);\nstatic void Cmd_if_any_move_disabled_or_encored(void);\nstatic void Cmd_if_curr_move_disabled_or_encored(void);\nstatic void Cmd_flee(void);\nstatic void Cmd_if_random_safari_flee(void);\nstatic void Cmd_watch(void);\nstatic void Cmd_get_hold_effect(void);\nstatic void Cmd_get_gender(void);\nstatic void Cmd_is_first_turn_for(void);\nstatic void Cmd_get_stockpile_count(void);\nstatic void Cmd_is_double_battle(void);\nstatic void Cmd_get_used_held_item(void);\nstatic void Cmd_get_move_type_from_result(void);\nstatic void Cmd_get_move_power_from_result(void);\nstatic void Cmd_get_move_effect_from_result(void);\nstatic void Cmd_get_protect_count(void);\nstatic void Cmd_nullsub_52(void);\nstatic void Cmd_nullsub_53(void);\nstatic void Cmd_nullsub_54(void);\nstatic void Cmd_nullsub_55(void);\nstatic void Cmd_nullsub_56(void);\nstatic void Cmd_nullsub_57(void);\nstatic void Cmd_call(void);\nstatic void Cmd_goto(void);\nstatic void Cmd_end(void);\nstatic void Cmd_if_level_compare(void);\nstatic void Cmd_if_target_taunted(void);\nstatic void Cmd_if_target_not_taunted(void);\n\nstatic void RecordLastUsedMoveByTarget(void);\nstatic void BattleAI_DoAIProcessing(void);\nstatic void AIStackPushVar(const u8 *ptr);\nstatic bool8 AIStackPop(void);\n\ntypedef void (*BattleAICmdFunc)(void);\n\nstatic const BattleAICmdFunc sBattleAICmdTable[] =\n{\n    Cmd_if_random_less_than,              // 0x0\n    Cmd_if_random_greater_than,           // 0x1\n    Cmd_if_random_equal,                  // 0x2\n    Cmd_if_random_not_equal,              // 0x3\n    Cmd_score,                            // 0x4\n    Cmd_if_hp_less_than,                  // 0x5\n    Cmd_if_hp_more_than,                  // 0x6\n    Cmd_if_hp_equal,                      // 0x7\n    Cmd_if_hp_not_equal,                  // 0x8\n    Cmd_if_status,                        // 0x9\n    Cmd_if_not_status,                    // 0xA\n    Cmd_if_status2,                       // 0xB\n    Cmd_if_not_status2,                   // 0xC\n    Cmd_if_status3,                       // 0xD\n    Cmd_if_not_status3,                   // 0xE\n    Cmd_if_side_affecting,                // 0xF\n    Cmd_if_not_side_affecting,            // 0x10\n    Cmd_if_less_than,                     // 0x11\n    Cmd_if_more_than,                     // 0x12\n    Cmd_if_equal,                         // 0x13\n    Cmd_if_not_equal,                     // 0x14\n    Cmd_if_less_than_ptr,                 // 0x15\n    Cmd_if_more_than_ptr,                 // 0x16\n    Cmd_if_equal_ptr,                     // 0x17\n    Cmd_if_not_equal_ptr,                 // 0x18\n    Cmd_if_move,                          // 0x19\n    Cmd_if_not_move,                      // 0x1A\n    Cmd_if_in_bytes,                      // 0x1B\n    Cmd_if_not_in_bytes,                  // 0x1C\n    Cmd_if_in_hwords,                     // 0x1D\n    Cmd_if_not_in_hwords,                 // 0x1E\n    Cmd_if_user_has_attacking_move,       // 0x1F\n    Cmd_if_user_has_no_attacking_moves,   // 0x20\n    Cmd_get_turn_count,                   // 0x21\n    Cmd_get_type,                         // 0x22\n    Cmd_get_considered_move_power,        // 0x23\n    Cmd_get_how_powerful_move_is,         // 0x24\n    Cmd_get_last_used_battler_move,       // 0x25\n    Cmd_if_equal_,                        // 0x26\n    Cmd_if_not_equal_,                    // 0x27\n    Cmd_if_would_go_first,                // 0x28\n    Cmd_if_would_not_go_first,            // 0x29\n    Cmd_nullsub_2A,                       // 0x2A\n    Cmd_nullsub_2B,                       // 0x2B\n    Cmd_count_alive_pokemon,              // 0x2C\n    Cmd_get_considered_move,              // 0x2D\n    Cmd_get_considered_move_effect,       // 0x2E\n    Cmd_get_ability,                      // 0x2F\n    Cmd_get_highest_type_effectiveness,   // 0x30\n    Cmd_if_type_effectiveness,            // 0x31\n    Cmd_nullsub_32,                       // 0x32\n    Cmd_nullsub_33,                       // 0x33\n    Cmd_if_status_in_party,               // 0x34\n    Cmd_if_status_not_in_party,           // 0x35\n    Cmd_get_weather,                      // 0x36\n    Cmd_if_effect,                        // 0x37\n    Cmd_if_not_effect,                    // 0x38\n    Cmd_if_stat_level_less_than,          // 0x39\n    Cmd_if_stat_level_more_than,          // 0x3A\n    Cmd_if_stat_level_equal,              // 0x3B\n    Cmd_if_stat_level_not_equal,          // 0x3C\n    Cmd_if_can_faint,                     // 0x3D\n    Cmd_if_cant_faint,                    // 0x3E\n    Cmd_if_has_move,                      // 0x3F\n    Cmd_if_doesnt_have_move,              // 0x40\n    Cmd_if_has_move_with_effect,          // 0x41\n    Cmd_if_doesnt_have_move_with_effect,  // 0x42\n    Cmd_if_any_move_disabled_or_encored,  // 0x43\n    Cmd_if_curr_move_disabled_or_encored, // 0x44\n    Cmd_flee,                             // 0x45\n    Cmd_if_random_safari_flee,            // 0x46\n    Cmd_watch,                            // 0x47\n    Cmd_get_hold_effect,                  // 0x48\n    Cmd_get_gender,                       // 0x49\n    Cmd_is_first_turn_for,                // 0x4A\n    Cmd_get_stockpile_count,              // 0x4B\n    Cmd_is_double_battle,                 // 0x4C\n    Cmd_get_used_held_item,               // 0x4D\n    Cmd_get_move_type_from_result,        // 0x4E\n    Cmd_get_move_power_from_result,       // 0x4F\n    Cmd_get_move_effect_from_result,      // 0x50\n    Cmd_get_protect_count,                // 0x51\n    Cmd_nullsub_52,                       // 0x52\n    Cmd_nullsub_53,                       // 0x53\n    Cmd_nullsub_54,                       // 0x54\n    Cmd_nullsub_55,                       // 0x55\n    Cmd_nullsub_56,                       // 0x56\n    Cmd_nullsub_57,                       // 0x57\n    Cmd_call,                             // 0x58\n    Cmd_goto,                             // 0x59\n    Cmd_end,                              // 0x5A\n    Cmd_if_level_compare,                 // 0x5B\n    Cmd_if_target_taunted,                // 0x5C\n    Cmd_if_target_not_taunted,            // 0x5D\n};\n\nstatic const u16 sDiscouragedPowerfulMoveEffects[] =\n{\n    EFFECT_EXPLOSION,\n    EFFECT_DREAM_EATER,\n    EFFECT_RAZOR_WIND,\n    EFFECT_SKY_ATTACK,\n    EFFECT_RECHARGE,\n    EFFECT_SKULL_BASH,\n    EFFECT_SOLAR_BEAM,\n    EFFECT_SPIT_UP,\n    EFFECT_FOCUS_PUNCH,\n    EFFECT_SUPERPOWER,\n    EFFECT_ERUPTION,\n    EFFECT_OVERHEAT,\n    0xFFFF\n};\n\nvoid BattleAI_HandleItemUseBeforeAISetup(void)\n{\n    s32 i;\n    u8 *data = (u8 *)BATTLE_HISTORY;\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    for (i = 0; i < sizeof(struct BattleHistory); i++)\n        data[i] = 0;\n\n    // Items are allowed to use in ONLY trainer battles.\n    if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n        && (gTrainerBattleOpponent_A != TRAINER_SECRET_BASE)\n        && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_SAFARI | BATTLE_TYPE_LINK))\n        )\n    {\n        for (i = 0; i < MAX_TRAINER_ITEMS; i++)\n        {\n            if (sTrainers[gTrainerBattleOpponent_A].items[i] != 0)\n            {\n                BATTLE_HISTORY->trainerItems[BATTLE_HISTORY->itemsNo] = sTrainers[gTrainerBattleOpponent_A].items[i];\n                BATTLE_HISTORY->itemsNo++;\n            }\n        }\n    }\n\n    BattleAI_SetupAIData();\n}\n\nvoid BattleAI_SetupAIData(void)\n{\n    s32 i;\n    u8 *data = (u8 *)AI_THINKING_STRUCT;\n    u8 moveLimitations;\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    // Clear AI data.\n    for (i = 0; i < sizeof(struct AI_ThinkingStruct); i++)\n        data[i] = 0;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n        AI_THINKING_STRUCT->score[i] = 100;\n\n    moveLimitations = CheckMoveLimitations(gActiveBattler, 0, 0xFF);\n\n    // Ignore moves that aren't possible to use.\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        if (gBitTable[i] & moveLimitations)\n            AI_THINKING_STRUCT->score[i] = 0;\n\n        AI_THINKING_STRUCT->simulatedRNG[i] = 100 - (Random() % 16);\n    }\n\n    gBattleResources->AI_ScriptsStack->size = 0;\n    gBattlerAttacker = gActiveBattler;\n\n    // Decide a random target battlerId in doubles.\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n    {\n        gBattlerTarget = (Random() & BIT_FLANK);\n\n        if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])\n            gBattlerTarget ^= BIT_FLANK;\n    }\n    // There's only one choice in single battles.\n    else\n    {\n        gBattlerTarget = gBattlerAttacker ^ BIT_SIDE;\n    }\n\n    // Choose proper trainer ai scripts.\n    // Fire Red, why all the returns?!?\n    if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)\n    {\n        AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_SAFARI;\n        return;\n    }\n    else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER)\n    {\n        AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_ROAMING;\n        return;\n    }\n    else if (!(gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER)) && (gTrainerBattleOpponent_A != TRAINER_SECRET_BASE))\n    {\n        if (gBattleTypeFlags & BATTLE_TYPE_WILD_SCRIPTED)\n        {\n            AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_CHECK_BAD_MOVE;\n            return;\n        }\n        else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY_FRLG)\n        {\n            AI_THINKING_STRUCT->aiFlags = (AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY);\n            return;\n        }\n    }\n    else\n    {\n        AI_THINKING_STRUCT->aiFlags = (AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY);\n        return;\n    }\n    AI_THINKING_STRUCT->aiFlags = sTrainers[gTrainerBattleOpponent_A].aiFlags;\n}\n\nu8 BattleAI_ChooseMoveOrAction(void)\n{\n    u8 currentMoveArray[MAX_MON_MOVES];\n    u8 consideredMoveArray[MAX_MON_MOVES];\n    u8 numOfBestMoves;\n    s32 i;\n\n    RecordLastUsedMoveByTarget();\n    while (AI_THINKING_STRUCT->aiFlags != 0)\n    {\n        if (AI_THINKING_STRUCT->aiFlags & 1)\n        {\n            AI_THINKING_STRUCT->aiState = AIState_SettingUp;\n            BattleAI_DoAIProcessing();\n        }\n        AI_THINKING_STRUCT->aiFlags >>= 1;\n        AI_THINKING_STRUCT->aiLogicId++;\n        AI_THINKING_STRUCT->movesetIndex = 0;\n    }\n\n    // special flee or watch cases for safari.\n    if (AI_THINKING_STRUCT->aiAction & AI_ACTION_FLEE)\n        return AI_CHOICE_FLEE;\n    if (AI_THINKING_STRUCT->aiAction & AI_ACTION_WATCH)\n        return AI_CHOICE_WATCH;\n\n    numOfBestMoves = 1;\n    currentMoveArray[0] = AI_THINKING_STRUCT->score[0];\n    consideredMoveArray[0] = 0;\n\n    for (i = 1; i < MAX_MON_MOVES; i++)\n    {\n        if (currentMoveArray[0] < AI_THINKING_STRUCT->score[i])\n        {\n            numOfBestMoves = 1;\n            currentMoveArray[0] = AI_THINKING_STRUCT->score[i];\n            consideredMoveArray[0] = i;\n        }\n        if (currentMoveArray[0] == AI_THINKING_STRUCT->score[i])\n        {\n            currentMoveArray[numOfBestMoves] = AI_THINKING_STRUCT->score[i];\n            consideredMoveArray[numOfBestMoves++] = i;\n        }\n    }\n\n    return consideredMoveArray[Random() % numOfBestMoves]; // break any ties that exist.\n}\n\nstatic void BattleAI_DoAIProcessing(void)\n{\n    while (AI_THINKING_STRUCT->aiState != AIState_FinishedProcessing)\n    {\n        switch (AI_THINKING_STRUCT->aiState)\n        {\n        case AIState_DoNotProcess: // Needed to match.\n            break;\n        case AIState_SettingUp:\n            sAIScriptPtr = gBattleAI_ScriptsTable[AI_THINKING_STRUCT->aiLogicId];\n\n            if (gBattleMons[gBattlerAttacker].pp[AI_THINKING_STRUCT->movesetIndex] == 0)\n            {\n                AI_THINKING_STRUCT->moveConsidered = 0; // Don't consider moves with no PP\n            }\n            else\n            {\n                AI_THINKING_STRUCT->moveConsidered = gBattleMons[gBattlerAttacker].moves[AI_THINKING_STRUCT->movesetIndex];\n            }\n            AI_THINKING_STRUCT->aiState++;\n            break;\n        case AIState_Processing:\n            if (AI_THINKING_STRUCT->moveConsidered != 0)\n            {\n                sBattleAICmdTable[*sAIScriptPtr](); // Run AI command.\n            }\n            else\n            {\n                AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0;\n                AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE;\n            }\n            if (AI_THINKING_STRUCT->aiAction & AI_ACTION_DONE)\n            {\n                AI_THINKING_STRUCT->movesetIndex++;\n\n                if (AI_THINKING_STRUCT->movesetIndex < MAX_MON_MOVES && (AI_THINKING_STRUCT->aiAction & AI_ACTION_DO_NOT_ATTACK) == 0)\n                    AI_THINKING_STRUCT->aiState = AIState_SettingUp; // as long as their are more moves to process, keep setting this to setup state.\n                else\n                    AI_THINKING_STRUCT->aiState++; // done processing.\n                AI_THINKING_STRUCT->aiAction &= (AI_ACTION_FLEE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK |\n                AI_ACTION_UNK5 | AI_ACTION_UNK6 | AI_ACTION_UNK7 | AI_ACTION_UNK8); // disable AI_ACTION_DONE.\n            }\n            break;\n        }\n    }\n}\n\nstatic void RecordLastUsedMoveByTarget(void)\n{\n    s32 i;\n\n    for (i = 0; i < 8; i++)\n    {\n        if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] == 0)\n        {\n            BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] = gLastMoves[gBattlerTarget];\n            return;\n        }\n    }\n}\n\n// not used\nstatic void ClearBattlerMoveHistory(u8 battlerId)\n{\n    s32 i;\n\n    for (i = 0; i < 8; i++)\n        BATTLE_HISTORY->usedMoves[battlerId / 2][i] = MOVE_NONE;\n}\n\nvoid RecordAbilityBattle(u8 battlerId, u8 abilityId)\n{\n    if (GetBattlerSide(battlerId) == 0)\n        BATTLE_HISTORY->abilities[GET_BATTLER_SIDE(battlerId)] = abilityId;\n}\n\nvoid RecordItemEffectBattle(u8 battlerId, u8 itemEffect)\n{\n    if (GetBattlerSide(battlerId) == 0)\n        BATTLE_HISTORY->itemEffects[GET_BATTLER_SIDE(battlerId)] = itemEffect;\n}\n\nstatic void Cmd_if_random_less_than(void)\n{\n    if (Random() % 256 < sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_if_random_greater_than(void)\n{\n    if (Random() % 256 > sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_if_random_equal(void)\n{\n    if (Random() % 256 == sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_if_random_not_equal(void)\n{\n    if (Random() % 256 != sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_score(void)\n{\n    AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] += sAIScriptPtr[1]; // add the result to the array of the move consider's score.\n\n    if (AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] < 0) // if the score is negative, flatten it to 0.\n        AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0;\n\n    sAIScriptPtr += 2; // AI return.\n}\n\nstatic void Cmd_if_hp_less_than(void)\n{\n    u16 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) < sAIScriptPtr[2])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3);\n    else\n        sAIScriptPtr += 7;\n}\n\nstatic void Cmd_if_hp_more_than(void)\n{\n    u16 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) > sAIScriptPtr[2])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3);\n    else\n        sAIScriptPtr += 7;\n}\n\nstatic void Cmd_if_hp_equal(void)\n{\n    u16 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) == sAIScriptPtr[2])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3);\n    else\n        sAIScriptPtr += 7;\n}\n\nstatic void Cmd_if_hp_not_equal(void)\n{\n    u16 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) != sAIScriptPtr[2])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3);\n    else\n        sAIScriptPtr += 7;\n}\n\nstatic void Cmd_if_status(void)\n{\n    u16 battlerId;\n    u32 status;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    status = T1_READ_32(sAIScriptPtr + 2);\n\n    if (gBattleMons[battlerId].status1 & status)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6);\n    else\n        sAIScriptPtr += 10;\n}\n\nstatic void Cmd_if_not_status(void)\n{\n    u16 battlerId;\n    u32 status;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    status = T1_READ_32(sAIScriptPtr + 2);\n\n    if (!(gBattleMons[battlerId].status1 & status))\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6);\n    else\n        sAIScriptPtr += 10;\n}\n\nstatic void Cmd_if_status2(void)\n{\n    u16 battlerId;\n    u32 status;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    status = T1_READ_32(sAIScriptPtr + 2);\n\n    if ((gBattleMons[battlerId].status2 & status))\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6);\n    else\n        sAIScriptPtr += 10;\n}\n\nstatic void Cmd_if_not_status2(void)\n{\n    u16 battlerId;\n    u32 status;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    status = T1_READ_32(sAIScriptPtr + 2);\n\n    if (!(gBattleMons[battlerId].status2 & status))\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6);\n    else\n        sAIScriptPtr += 10;\n}\n\nstatic void Cmd_if_status3(void)\n{\n    u16 battlerId;\n    u32 status;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    status = T1_READ_32(sAIScriptPtr + 2);\n\n    if (gStatuses3[battlerId] & status)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6);\n    else\n        sAIScriptPtr += 10;\n}\n\nstatic void Cmd_if_not_status3(void)\n{\n    u16 battlerId;\n    u32 status;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    status = T1_READ_32(sAIScriptPtr + 2);\n\n    if (!(gStatuses3[battlerId] & status))\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6);\n    else\n        sAIScriptPtr += 10;\n}\n\nstatic void Cmd_if_side_affecting(void)\n{\n    u16 battlerId;\n    u32 side, status;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    side = GET_BATTLER_SIDE(battlerId);\n    status = T1_READ_32(sAIScriptPtr + 2);\n\n    if (gSideStatuses[side] & status)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6);\n    else\n        sAIScriptPtr += 10;\n}\n\nstatic void Cmd_if_not_side_affecting(void)\n{\n    u16 battlerId;\n    u32 side, status;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    side = GET_BATTLER_SIDE(battlerId);\n    status = T1_READ_32(sAIScriptPtr + 2);\n\n    if (!(gSideStatuses[side] & status))\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6);\n    else\n        sAIScriptPtr += 10;\n}\n\nstatic void Cmd_if_less_than(void)\n{\n    if (AI_THINKING_STRUCT->funcResult < sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_if_more_than(void)\n{\n    if (AI_THINKING_STRUCT->funcResult > sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_if_equal(void)\n{\n    if (AI_THINKING_STRUCT->funcResult == sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_if_not_equal(void)\n{\n    if (AI_THINKING_STRUCT->funcResult != sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_if_less_than_ptr(void)\n{\n    const u8 *value = T1_READ_PTR(sAIScriptPtr + 1);\n\n    if (AI_THINKING_STRUCT->funcResult < *value)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5);\n    else\n        sAIScriptPtr += 9;\n}\n\nstatic void Cmd_if_more_than_ptr(void)\n{\n    const u8 *value = T1_READ_PTR(sAIScriptPtr + 1);\n\n    if (AI_THINKING_STRUCT->funcResult > *value)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5);\n    else\n        sAIScriptPtr += 9;\n}\n\nstatic void Cmd_if_equal_ptr(void)\n{\n    const u8 *value = T1_READ_PTR(sAIScriptPtr + 1);\n\n    if (AI_THINKING_STRUCT->funcResult == *value)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5);\n    else\n        sAIScriptPtr += 9;\n}\n\nstatic void Cmd_if_not_equal_ptr(void)\n{\n    const u8 *value = T1_READ_PTR(sAIScriptPtr + 1);\n\n    if (AI_THINKING_STRUCT->funcResult != *value)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5);\n    else\n        sAIScriptPtr += 9;\n}\n\nstatic void Cmd_if_move(void)\n{\n    u16 move = T1_READ_16(sAIScriptPtr + 1);\n\n    if (AI_THINKING_STRUCT->moveConsidered == move)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3);\n    else\n        sAIScriptPtr += 7;\n}\n\nstatic void Cmd_if_not_move(void)\n{\n    u16 move = T1_READ_16(sAIScriptPtr + 1);\n\n    if (AI_THINKING_STRUCT->moveConsidered != move)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3);\n    else\n        sAIScriptPtr += 7;\n}\n\nstatic void Cmd_if_in_bytes(void)\n{\n    const u8 *ptr = T1_READ_PTR(sAIScriptPtr + 1);\n\n    while (*ptr != 0xFF)\n    {\n        if (AI_THINKING_STRUCT->funcResult == *ptr)\n        {\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5);\n            return;\n        }\n        ptr++;\n    }\n    sAIScriptPtr += 9;\n}\n\nstatic void Cmd_if_not_in_bytes(void)\n{\n    const u8 *ptr = T1_READ_PTR(sAIScriptPtr + 1);\n\n    while (*ptr != 0xFF)\n    {\n        if (AI_THINKING_STRUCT->funcResult == *ptr)\n        {\n            sAIScriptPtr += 9;\n            return;\n        }\n        ptr++;\n    }\n    sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5);\n}\n\nstatic void Cmd_if_in_hwords(void)\n{\n    const u16 *ptr = (const u16 *)T1_READ_PTR(sAIScriptPtr + 1);\n\n    while (*ptr != 0xFFFF)\n    {\n        if (AI_THINKING_STRUCT->funcResult == *ptr)\n        {\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5);\n            return;\n        }\n        ptr++;\n    }\n    sAIScriptPtr += 9;\n}\n\nstatic void Cmd_if_not_in_hwords(void)\n{\n    const u16 *ptr = (const u16 *)T1_READ_PTR(sAIScriptPtr + 1);\n\n    while (*ptr != 0xFFFF)\n    {\n        if (AI_THINKING_STRUCT->funcResult == *ptr)\n        {\n            sAIScriptPtr += 9;\n            return;\n        }\n        ptr++;\n    }\n    sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5);\n}\n\nstatic void Cmd_if_user_has_attacking_move(void)\n{\n    s32 i;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        if (gBattleMons[gBattlerAttacker].moves[i] != 0\n            && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].power != 0)\n            break;\n    }\n\n    if (i == MAX_MON_MOVES)\n        sAIScriptPtr += 5;\n    else\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1);\n}\n\nstatic void Cmd_if_user_has_no_attacking_moves(void)\n{\n    s32 i;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        if (gBattleMons[gBattlerAttacker].moves[i] != 0\n         && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].power != 0)\n            break;\n    }\n\n    if (i != MAX_MON_MOVES)\n        sAIScriptPtr += 5;\n    else\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1);\n}\n\nstatic void Cmd_get_turn_count(void)\n{\n    AI_THINKING_STRUCT->funcResult = gBattleResults.battleTurnCounter;\n    sAIScriptPtr += 1;\n}\n\nstatic void Cmd_get_type(void)\n{\n    switch (sAIScriptPtr[1])\n    {\n    case AI_TYPE1_USER:\n        AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerAttacker].type1;\n        break;\n    case AI_TYPE1_TARGET:\n        AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].type1;\n        break;\n    case AI_TYPE2_USER:\n        AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerAttacker].type2;\n        break;\n    case AI_TYPE2_TARGET:\n        AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].type2;\n        break;\n    case AI_TYPE_MOVE:\n        if(gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == EFFECT_HIDDEN_POWER)\n        {\n            s32 typeBits  = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0)\n              | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1)\n              | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2)\n              | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3)\n              | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4)\n              | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5);\n\n            u8 type = (15 * typeBits) / 63 + 1;\n            if (type >= TYPE_MYSTERY)\n                type++;\n            type |= 0xC0;\n            AI_THINKING_STRUCT->funcResult = type;\n        }\n        else\n            AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].type;\n        break;\n    }\n    sAIScriptPtr += 2;\n}\n\nstatic void Cmd_get_considered_move_power(void)\n{\n    if(gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == EFFECT_HIDDEN_POWER)\n    {\n        s32 powerBits  = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1)\n              | ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0)\n              | ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1)\n              | ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2)\n              | ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3)\n              | ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4);\n\n        AI_THINKING_STRUCT->funcResult = (40 * powerBits) / 63 + 30;\n    }\n    else\n        AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power;\n    sAIScriptPtr += 1;\n}\n\nstatic void Cmd_get_how_powerful_move_is(void)\n{\n    s32 i, checkedMove;\n    s32 moveDmgs[MAX_MON_MOVES];\n\n    for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)\n    {\n        if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i])\n            break;\n    }\n\n    if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1\n        && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)\n    {\n        gDynamicBasePower = 0;\n        gBattleStruct->dynamicMoveType = 0;\n        gBattleScripting.dmgMultiplier = 1;\n        gMoveResultFlags = 0;\n        gCritMultiplier = 1;\n\n        for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)\n        {\n            for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)\n            {\n                if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i])\n                    break;\n            }\n\n            if (gBattleMons[gBattlerAttacker].moves[checkedMove] != MOVE_NONE\n                && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF\n                && gBattleMoves[gBattleMons[gBattlerAttacker].moves[checkedMove]].power > 1)\n            {\n                gCurrentMove = gBattleMons[gBattlerAttacker].moves[checkedMove];\n                AI_CalcDmg(gBattlerAttacker, gBattlerTarget);\n                TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget);\n                moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100;\n                if (moveDmgs[checkedMove] == 0)\n                    moveDmgs[checkedMove] = 1;\n            }\n            else if(gBattleMons[gBattlerAttacker].moves[checkedMove] != MOVE_NONE\n                && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF\n                && gBattleMons[gBattlerAttacker].moves[checkedMove] == MOVE_HIDDEN_POWER)\n            {\n                gCurrentMove = gBattleMons[gBattlerAttacker].moves[checkedMove];\n                AI_CalcDmg(gBattlerAttacker, gBattlerTarget);\n                TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget);\n                moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100;\n                if (moveDmgs[checkedMove] == 0)\n                    moveDmgs[checkedMove] = 1;\n            }\n            else\n            {\n                moveDmgs[checkedMove] = 0;\n            }\n        }\n\n        for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)\n        {\n            if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex])\n                break;\n        }\n\n        if (checkedMove == MAX_MON_MOVES)\n            AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful.\n        else\n            AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful.\n    }\n    else\n    {\n        AI_THINKING_STRUCT->funcResult = MOVE_POWER_DISCOURAGED; // Highly discouraged in terms of power.\n    }\n\n    sAIScriptPtr++;\n}\n\nstatic void Cmd_get_last_used_battler_move(void)\n{\n    if (sAIScriptPtr[1] == AI_USER)\n        AI_THINKING_STRUCT->funcResult = gLastMoves[gBattlerAttacker];\n    else\n        AI_THINKING_STRUCT->funcResult = gLastMoves[gBattlerTarget];\n\n    sAIScriptPtr += 2;\n}\n\nstatic void Cmd_if_equal_(void) // Same as if_equal.\n{\n    if (sAIScriptPtr[1] == AI_THINKING_STRUCT->funcResult)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_if_not_equal_(void) // Same as if_not_equal.\n{\n    if (sAIScriptPtr[1] != AI_THINKING_STRUCT->funcResult)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_if_would_go_first(void)\n{\n    if (GetWhoStrikesFirst(gBattlerAttacker, gBattlerTarget, TRUE) == sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_if_would_not_go_first(void)\n{\n    if (GetWhoStrikesFirst(gBattlerAttacker, gBattlerTarget, TRUE) != sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_nullsub_2A(void)\n{\n}\n\nstatic void Cmd_nullsub_2B(void)\n{\n}\n\nstatic void Cmd_count_alive_pokemon(void)\n{\n    u8 battlerId;\n    u8 battlerOnField1, battlerOnField2;\n    struct Pokemon *party;\n    s32 i;\n\n    AI_THINKING_STRUCT->funcResult = 0;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n        party = gPlayerParty;\n    else\n        party = gEnemyParty;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n    {\n        u32 position;\n        battlerOnField1 = gBattlerPartyIndexes[battlerId];\n        position = GetBattlerPosition(battlerId) ^ BIT_FLANK;\n        battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)];\n    }\n    else // In singles there's only one battlerId by side.\n    {\n        battlerOnField1 = gBattlerPartyIndexes[battlerId];\n        battlerOnField2 = gBattlerPartyIndexes[battlerId];\n    }\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (i != battlerOnField1 && i != battlerOnField2\n         && GetMonData(&party[i], MON_DATA_HP) != 0\n         && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE\n         && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG)\n        {\n            AI_THINKING_STRUCT->funcResult++;\n        }\n    }\n\n    sAIScriptPtr += 2;\n}\n\nstatic void Cmd_get_considered_move(void)\n{\n    AI_THINKING_STRUCT->funcResult = AI_THINKING_STRUCT->moveConsidered;\n    sAIScriptPtr += 1;\n}\n\nstatic void Cmd_get_considered_move_effect(void)\n{\n    AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect;\n    sAIScriptPtr += 1;\n}\n\nstatic void Cmd_get_ability(void)\n{\n    u8 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    if (GetBattlerSide(battlerId) == AI_TARGET)\n    {\n        u16 side = GET_BATTLER_SIDE(battlerId);\n\n        if (BATTLE_HISTORY->abilities[side] != 0)\n        {\n            AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->abilities[side];\n            sAIScriptPtr += 2;\n            return;\n        }\n\n        // abilities that prevent fleeing.\n        if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG\n        || gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL\n        || gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP)\n        {\n            AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability;\n            sAIScriptPtr += 2;\n            return;\n        }\n\n        if (gSpeciesInfo[gBattleMons[battlerId].species].abilities[0] != ABILITY_NONE)\n        {\n            if (gSpeciesInfo[gBattleMons[battlerId].species].abilities[1] != ABILITY_NONE)\n            {\n                // AI has no knowledge of opponent, so it guesses which ability.\n                if (Random() % 2)\n                    AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[0];\n                else\n                    AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[1];\n            }\n            else\n            {\n                AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[0];\n            }\n        }\n        else\n        {\n             // AI can't actually reach this part since no pokemon has ability 2 and no ability 1.\n            AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[1];\n        }\n    }\n    else\n    {\n        // The AI knows its own ability.\n        AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability;\n    }\n\n    sAIScriptPtr += 2;\n}\n\nstatic void Cmd_get_highest_type_effectiveness(void)\n{\n    s32 i;\n    u8 *dynamicMoveType;\n\n    gDynamicBasePower = 0;\n    dynamicMoveType = &gBattleStruct->dynamicMoveType;\n    *dynamicMoveType = 0;\n    gBattleScripting.dmgMultiplier = 1;\n    gMoveResultFlags = 0;\n    gCritMultiplier = 1;\n    AI_THINKING_STRUCT->funcResult = 0;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        gBattleMoveDamage = 40;\n        gCurrentMove = gBattleMons[gBattlerAttacker].moves[i];\n\n        if (gCurrentMove != MOVE_NONE)\n        {\n            TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget);\n\n            if (gBattleMoveDamage == 120) // Super effective STAB.\n                gBattleMoveDamage = AI_EFFECTIVENESS_x2;\n            if (gBattleMoveDamage == 240)\n                gBattleMoveDamage = AI_EFFECTIVENESS_x4;\n            if (gBattleMoveDamage == 30) // Not very effective STAB.\n                gBattleMoveDamage = AI_EFFECTIVENESS_x0_5;\n            if (gBattleMoveDamage == 15)\n                gBattleMoveDamage = AI_EFFECTIVENESS_x0_25;\n\n            if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)\n                gBattleMoveDamage = AI_EFFECTIVENESS_x0;\n\n            if (AI_THINKING_STRUCT->funcResult < gBattleMoveDamage)\n                AI_THINKING_STRUCT->funcResult = gBattleMoveDamage;\n        }\n    }\n\n    sAIScriptPtr += 1;\n}\n\nstatic void Cmd_if_type_effectiveness(void)\n{\n    u8 damageVar;\n\n    gDynamicBasePower = 0;\n    gBattleStruct->dynamicMoveType = 0;\n    gBattleScripting.dmgMultiplier = 1;\n    gMoveResultFlags = 0;\n    gCritMultiplier = 1;\n\n    gBattleMoveDamage = AI_EFFECTIVENESS_x1;\n    gCurrentMove = AI_THINKING_STRUCT->moveConsidered;\n\n    TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget);\n\n    if (gBattleMoveDamage == 120) // Super effective STAB.\n        gBattleMoveDamage = AI_EFFECTIVENESS_x2;\n    if (gBattleMoveDamage == 240)\n        gBattleMoveDamage = AI_EFFECTIVENESS_x4;\n    if (gBattleMoveDamage == 30) // Not very effective STAB.\n        gBattleMoveDamage = AI_EFFECTIVENESS_x0_5;\n    if (gBattleMoveDamage == 15)\n        gBattleMoveDamage = AI_EFFECTIVENESS_x0_25;\n\n    if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)\n        gBattleMoveDamage = AI_EFFECTIVENESS_x0;\n\n    // Store gBattleMoveDamage in a u8 variable because sAIScriptPtr[1] is a u8.\n    damageVar = gBattleMoveDamage;\n\n    if (damageVar == sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_nullsub_32(void)\n{\n}\n\nstatic void Cmd_nullsub_33(void)\n{\n}\n\nstatic void Cmd_if_status_in_party(void)\n{\n    struct Pokemon *party;\n    struct Pokemon *partyPtr;\n    int i;\n    u32 statusToCompareTo;\n    // u8 battlerId\n\n    // for whatever reason, game freak put the party pointer into 2 variables instead of 1\n    // it's possible at some point the switch encompassed the whole function and used each respective variable creating largely duplicate code.\n    switch (sAIScriptPtr[1])\n    {\n    case 1:\n        party = partyPtr = gEnemyParty;\n        break;\n    default:\n        party = partyPtr = gPlayerParty;\n        break;\n    }\n\n    /* Emerald's fixed version below\n    switch (sAIScriptPtr[1])\n    {\n    case AI_USER:\n        battlerId = gBattlerAttacker;\n        break;\n    default:\n        battlerId = gBattlerTarget;\n        break;\n    }\n\n    party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;\n    */\n\n    statusToCompareTo = T1_READ_32(sAIScriptPtr + 2);\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        u16 species = GetMonData(&party[i], MON_DATA_SPECIES);\n        u16 hp = GetMonData(&party[i], MON_DATA_HP);\n        u32 status = GetMonData(&party[i], MON_DATA_STATUS);\n\n        if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo)\n        {\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6);\n            return;\n        }\n    }\n\n    sAIScriptPtr += 10;\n}\n\n// bugged, doesnt return properly. also unused\nstatic void Cmd_if_status_not_in_party(void)\n{\n    struct Pokemon *party;\n    struct Pokemon *partyPtr;\n    int i;\n    u32 statusToCompareTo;\n    //u8 battlerId\n\n    switch (sAIScriptPtr[1])\n    {\n    case 1:\n        party = partyPtr = gEnemyParty;\n        break;\n    default:\n        party = partyPtr = gPlayerParty;\n        break;\n    }\n\n    statusToCompareTo = T1_READ_32(sAIScriptPtr + 2);\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        u16 species = GetMonData(&party[i], MON_DATA_SPECIES);\n        u16 hp = GetMonData(&party[i], MON_DATA_HP);\n        u32 status = GetMonData(&party[i], MON_DATA_STATUS);\n\n        // everytime the status is found, the AI's logic jumps further and further past its intended destination. this results in a broken AI macro and is probably why it is unused.\n        if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo)\n        {\n            sAIScriptPtr += 10; // doesnt return?\n            #ifdef UBFIX\n            return;\n            #endif\n        }\n    }\n    sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6);\n}\n\nenum\n{\n    WEATHER_TYPE_SUNNY,\n    WEATHER_TYPE_RAIN,\n    WEATHER_TYPE_SANDSTORM,\n    WEATHER_TYPE_HAIL,\n};\n\nextern u16 gBattleWeather;\n\nstatic void Cmd_get_weather(void)\n{\n    if (gBattleWeather & B_WEATHER_RAIN)\n        AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_RAIN;\n    if (gBattleWeather & B_WEATHER_SANDSTORM)\n        AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_SANDSTORM;\n    if (gBattleWeather & B_WEATHER_SUN)\n        AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_SUNNY;\n    if (gBattleWeather & B_WEATHER_HAIL_TEMPORARY)\n        AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_HAIL;\n\n    sAIScriptPtr += 1;\n}\n\nstatic void Cmd_if_effect(void)\n{\n    if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_if_not_effect(void)\n{\n    if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect != sAIScriptPtr[1])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n    else\n        sAIScriptPtr += 6;\n}\n\nstatic void Cmd_if_stat_level_less_than(void)\n{\n    u32 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    if (gBattleMons[battlerId].statStages[sAIScriptPtr[2]] < sAIScriptPtr[3])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4);\n    else\n        sAIScriptPtr += 8;\n}\n\nstatic void Cmd_if_stat_level_more_than(void)\n{\n    u32 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    if (gBattleMons[battlerId].statStages[sAIScriptPtr[2]] > sAIScriptPtr[3])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4);\n    else\n        sAIScriptPtr += 8;\n}\n\nstatic void Cmd_if_stat_level_equal(void)\n{\n    u32 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    if (gBattleMons[battlerId].statStages[sAIScriptPtr[2]] == sAIScriptPtr[3])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4);\n    else\n        sAIScriptPtr += 8;\n}\n\nstatic void Cmd_if_stat_level_not_equal(void)\n{\n    u32 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    if (gBattleMons[battlerId].statStages[sAIScriptPtr[2]] != sAIScriptPtr[3])\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4);\n    else\n        sAIScriptPtr += 8;\n}\n\nstatic void Cmd_if_can_faint(void)\n{\n    if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2)\n    {\n        sAIScriptPtr += 5;\n        return;\n    }\n\n    gDynamicBasePower = 0;\n    gBattleStruct->dynamicMoveType = 0;\n    gBattleScripting.dmgMultiplier = 1;\n    gMoveResultFlags = 0;\n    gCritMultiplier = 1;\n    gCurrentMove = AI_THINKING_STRUCT->moveConsidered;\n    AI_CalcDmg(gBattlerAttacker, gBattlerTarget);\n    TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget);\n\n    gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100;\n\n    // Moves always do at least 1 damage.\n    if (gBattleMoveDamage == 0)\n        gBattleMoveDamage = 1;\n\n    if (gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1);\n    else\n        sAIScriptPtr += 5;\n}\n\nstatic void Cmd_if_cant_faint(void)\n{\n    if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2)\n    {\n        sAIScriptPtr += 5;\n        return;\n    }\n\n    gDynamicBasePower = 0;\n    gBattleStruct->dynamicMoveType = 0;\n    gBattleScripting.dmgMultiplier = 1;\n    gMoveResultFlags = 0;\n    gCritMultiplier = 1;\n    gCurrentMove = AI_THINKING_STRUCT->moveConsidered;\n    AI_CalcDmg(gBattlerAttacker, gBattlerTarget);\n    TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget);\n\n    gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100;\n\n    // This macro is missing the damage 0 = 1 assumption.\n\n    if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1);\n    else\n        sAIScriptPtr += 5;\n}\n\nstatic void Cmd_if_has_move(void)\n{\n    int i;\n    const u16 *movePtr = (u16 *)(sAIScriptPtr + 2);\n\n    switch (sAIScriptPtr[1])\n    {\n    case AI_USER:\n    case AI_USER_PARTNER:\n        for (i = 0; i < MAX_MON_MOVES; i++)\n        {\n            if (gBattleMons[gBattlerAttacker].moves[i] == *movePtr)\n                break;\n        }\n        if (i == MAX_MON_MOVES)\n            sAIScriptPtr += 8;\n        else\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4);\n        break;\n    case AI_TARGET:\n    case AI_TARGET_PARTNER:\n        for (i = 0; i < 8; i++)\n        {\n            if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] == *movePtr)\n                break;\n        }\n        if (i == 8)\n            sAIScriptPtr += 8;\n        else\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4);\n        break;\n    }\n}\n\nstatic void Cmd_if_doesnt_have_move(void)\n{\n    int i;\n    const u16 *movePtr = (u16 *)(sAIScriptPtr + 2);\n\n    switch (sAIScriptPtr[1])\n    {\n    case AI_USER:\n    case AI_USER_PARTNER:\n        for (i = 0; i < MAX_MON_MOVES; i++)\n        {\n            if (gBattleMons[gBattlerAttacker].moves[i] == *movePtr)\n                break;\n        }\n        if (i != MAX_MON_MOVES)\n            sAIScriptPtr += 8;\n        else\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4);\n        break;\n    case AI_TARGET:\n    case AI_TARGET_PARTNER:\n        for (i = 0; i < 8; i++)\n        {\n            if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] == *movePtr)\n                break;\n        }\n        if (i != 8)\n            sAIScriptPtr += 8;\n        else\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4);\n        break;\n    }\n}\n\nstatic void Cmd_if_has_move_with_effect(void)\n{\n    int i;\n\n    switch (sAIScriptPtr[1])\n    {\n    case AI_USER:\n    case AI_USER_PARTNER:\n        for (i = 0; i < MAX_MON_MOVES; i++)\n        {\n            if (gBattleMons[gBattlerAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].effect == sAIScriptPtr[2])\n                break;\n        }\n        if (i != MAX_MON_MOVES)\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3);\n        else\n            sAIScriptPtr += 7;\n        break;\n    case AI_TARGET:\n    case AI_TARGET_PARTNER:\n        for (i = 0; i < 8; i++)\n        {\n            if (gBattleMons[gBattlerAttacker].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i]].effect == sAIScriptPtr[2])\n                break;\n        }\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3);\n    }\n}\n\nstatic void Cmd_if_doesnt_have_move_with_effect(void)\n{\n    int i;\n\n    switch (sAIScriptPtr[1])\n    {\n    case AI_USER:\n    case AI_USER_PARTNER:\n        for (i = 0; i < MAX_MON_MOVES; i++)\n        {\n            if (gBattleMons[gBattlerAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].effect == sAIScriptPtr[2])\n                break;\n        }\n        if (i != MAX_MON_MOVES)\n            sAIScriptPtr += 7;\n        else\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3);\n        break;\n    case AI_TARGET:\n    case AI_TARGET_PARTNER:\n        for (i = 0; i < 8; i++)\n        {\n            if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i]].effect == sAIScriptPtr[2])\n                break;\n        }\n        sAIScriptPtr += 7;\n    }\n}\n\nstatic void Cmd_if_any_move_disabled_or_encored(void)\n{\n    u8 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    if (sAIScriptPtr[2] == 0)\n    {\n        if (gDisableStructs[battlerId].disabledMove == MOVE_NONE)\n            sAIScriptPtr += 7;\n        else\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3);\n    }\n    else if (sAIScriptPtr[2] != 1)\n    {\n        sAIScriptPtr += 7;\n    }\n    else\n    {\n        if (gDisableStructs[battlerId].encoredMove != MOVE_NONE)\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3);\n        else\n            sAIScriptPtr += 7;\n    }\n}\n\nstatic void Cmd_if_curr_move_disabled_or_encored(void)\n{\n    switch (sAIScriptPtr[1])\n    {\n    case 0:\n        if (gDisableStructs[gActiveBattler].disabledMove == AI_THINKING_STRUCT->moveConsidered)\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n        else\n            sAIScriptPtr += 6;\n        break;\n    case 1:\n        if (gDisableStructs[gActiveBattler].encoredMove == AI_THINKING_STRUCT->moveConsidered)\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n        else\n            sAIScriptPtr += 6;\n        break;\n    default:\n        sAIScriptPtr += 6;\n        break;\n    }\n}\n\nstatic void Cmd_flee(void)\n{\n    AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_FLEE being enabled.\n}\n\nstatic void Cmd_if_random_safari_flee(void)\n{\n    u8 safariFleeRate;\n\n    if (gBattleStruct->safariRockThrowCounter)\n    {\n        safariFleeRate = gBattleStruct->safariEscapeFactor * 2;\n        if (safariFleeRate > 20)\n            safariFleeRate = 20;\n    }\n    else if (gBattleStruct->safariBaitThrowCounter != 0)\n    {\n        safariFleeRate = gBattleStruct->safariEscapeFactor / 4;\n        if (safariFleeRate == 0)\n            safariFleeRate = 1;\n    }\n    else\n        safariFleeRate = gBattleStruct->safariEscapeFactor;\n    safariFleeRate *= 5;\n    if ((u8)(Random() % 100) < safariFleeRate)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1);\n    else\n        sAIScriptPtr += 5;\n}\n\nstatic void Cmd_watch(void)\n{\n    AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_WATCH being enabled.\n}\n\nstatic void Cmd_get_hold_effect(void)\n{\n    u8 battlerId;\n    u16 side;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n    {\n        side = GET_BATTLER_SIDE(battlerId);\n        AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->itemEffects[side];\n    }\n    else\n        AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[battlerId].item);\n\n    sAIScriptPtr += 2;\n}\n\nstatic void Cmd_get_gender(void)\n{\n    u8 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[battlerId].species, gBattleMons[battlerId].personality);\n\n    sAIScriptPtr += 2;\n}\n\nstatic void Cmd_is_first_turn_for(void)\n{\n    u8 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].isFirstTurn;\n\n    sAIScriptPtr += 2;\n}\n\nstatic void Cmd_get_stockpile_count(void)\n{\n    u8 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].stockpileCounter;\n\n    sAIScriptPtr += 2;\n}\n\nstatic void Cmd_is_double_battle(void)\n{\n    AI_THINKING_STRUCT->funcResult = gBattleTypeFlags & BATTLE_TYPE_DOUBLE;\n\n    sAIScriptPtr += 1;\n}\n\nstatic void Cmd_get_used_held_item(void)\n{\n    u8 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    AI_THINKING_STRUCT->funcResult = ((u8 *)gBattleStruct->usedHeldItems)[battlerId * 2];\n    sAIScriptPtr += 2;\n}\n\nstatic void Cmd_get_move_type_from_result(void)\n{\n    if(gBattleMoves[AI_THINKING_STRUCT->funcResult].effect == EFFECT_HIDDEN_POWER)\n    {\n        s32 typeBits  = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0)\n            | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1)\n            | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2)\n            | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3)\n            | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4)\n            | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5);\n\n        u8 type = (15 * typeBits) / 63 + 1;\n        if (type >= TYPE_MYSTERY)\n            type++;\n        type |= 0xC0;\n        AI_THINKING_STRUCT->funcResult = type;\n    }\n    else\n        AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].type;\n\n    sAIScriptPtr += 1;\n}\n\nstatic void Cmd_get_move_power_from_result(void)\n{\n    if(gBattleMoves[AI_THINKING_STRUCT->funcResult].effect == EFFECT_HIDDEN_POWER)\n    {\n        s32 powerBits  = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1)\n              | ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0)\n              | ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1)\n              | ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2)\n              | ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3)\n              | ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4);\n\n        AI_THINKING_STRUCT->funcResult = (40 * powerBits) / 63 + 30;\n    }\n    else\n        AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].power;\n\n    sAIScriptPtr += 1;\n}\n\nstatic void Cmd_get_move_effect_from_result(void)\n{\n    AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].effect;\n\n    sAIScriptPtr += 1;\n}\n\nstatic void Cmd_get_protect_count(void)\n{\n    u8 battlerId;\n\n    if (sAIScriptPtr[1] == AI_USER)\n        battlerId = gBattlerAttacker;\n    else\n        battlerId = gBattlerTarget;\n\n    AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].protectUses;\n\n    sAIScriptPtr += 2;\n}\n\nstatic void Cmd_nullsub_52(void)\n{\n}\n\nstatic void Cmd_nullsub_53(void)\n{\n}\n\nstatic void Cmd_nullsub_54(void)\n{\n}\n\nstatic void Cmd_nullsub_55(void)\n{\n}\n\nstatic void Cmd_nullsub_56(void)\n{\n}\n\nstatic void Cmd_nullsub_57(void)\n{\n}\n\nstatic void Cmd_call(void)\n{\n    AIStackPushVar(sAIScriptPtr + 5);\n    sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1);\n}\n\nstatic void Cmd_goto(void)\n{\n    sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1);\n}\n\nstatic void Cmd_end(void)\n{\n    if (AIStackPop() == FALSE)\n        AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE;\n}\n\nstatic void Cmd_if_level_compare(void)\n{\n    switch (sAIScriptPtr[1])\n    {\n    case 0: // greater than\n        if (gBattleMons[gBattlerAttacker].level > gBattleMons[gBattlerTarget].level)\n        {\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n            return;\n        }\n        sAIScriptPtr += 6;\n        return;\n    case 1: // less than\n        if (gBattleMons[gBattlerAttacker].level < gBattleMons[gBattlerTarget].level)\n        {\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n            return;\n        }\n        sAIScriptPtr += 6;\n        return;\n    case 2: // equal\n        if (gBattleMons[gBattlerAttacker].level == gBattleMons[gBattlerTarget].level)\n        {\n            sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2);\n            return;\n        }\n        sAIScriptPtr += 6;\n        return;\n    }\n}\n\nstatic void Cmd_if_target_taunted(void)\n{\n    if (gDisableStructs[gBattlerTarget].tauntTimer != 0)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1);\n    else\n        sAIScriptPtr += 5;\n}\n\nstatic void Cmd_if_target_not_taunted(void)\n{\n    if (gDisableStructs[gBattlerTarget].tauntTimer == 0)\n        sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1);\n    else\n        sAIScriptPtr += 5;\n}\n\nstatic void AIStackPushVar(const u8 *var)\n{\n    gBattleResources->AI_ScriptsStack->ptr[gBattleResources->AI_ScriptsStack->size++] = var;\n}\n\n// unused\nstatic void AIStackPushVar_cursor(void)\n{\n    gBattleResources->AI_ScriptsStack->ptr[gBattleResources->AI_ScriptsStack->size++] = sAIScriptPtr;\n}\n\nstatic bool8 AIStackPop(void)\n{\n    if (gBattleResources->AI_ScriptsStack->size != 0)\n    {\n        --gBattleResources->AI_ScriptsStack->size;\n        sAIScriptPtr = gBattleResources->AI_ScriptsStack->ptr[gBattleResources->AI_ScriptsStack->size];\n        return TRUE;\n    }\n    else\n        return FALSE;\n}\n"
  },
  {
    "path": "src/battle_ai_switch_items.c",
    "content": "#include \"global.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_controllers.h\"\n#include \"random.h\"\n#include \"util.h\"\n#include \"constants/abilities.h\"\n#include \"constants/item_effects.h\"\n#include \"constants/items.h\"\n#include \"constants/moves.h\"\n#include \"constants/pokemon.h\"\n\nstatic bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng);\nstatic bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent);\nstatic bool8 ShouldUseItem(void);\n\nstatic bool8 ShouldSwitchIfPerishSong(void)\n{\n    if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG\n     && gDisableStructs[gActiveBattler].perishSongTimer == 0)\n    {\n        *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE;\n        BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nstatic bool8 ShouldSwitchIfWonderGuard(void)\n{\n    u8 opposingBattler;\n    u8 moveFlags;\n    s32 i, j;\n    u16 move;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n        return FALSE;\n    if (gBattleMons[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)].ability == ABILITY_WONDER_GUARD)\n    {\n        // Check if Pokemon has a super effective move.\n        for (opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), i = 0; i < MAX_MON_MOVES; ++i)\n        {\n            move = gBattleMons[gActiveBattler].moves[i];\n            if (move == MOVE_NONE)\n                continue;\n            moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability);\n            if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)\n                return FALSE;\n        }\n        // Find a Pokemon in the party that has a super effective move.\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0\n             || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE\n             || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG\n             || i == gBattlerPartyIndexes[gActiveBattler])\n                continue;\n            GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); // Unused return value.\n            GetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM); // Unused return value.        \n            for (opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), j = 0; j < MAX_MON_MOVES; ++j)\n            {\n                move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j);\n                if (move == MOVE_NONE)\n                    continue;\n                moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability);\n                if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % 3 < 2)\n                {\n                    // We found a mon.\n                    *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = i;\n                    BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);\n                    return TRUE;\n                }\n            }\n        }\n    }\n    return FALSE; // There is not a single Pokemon in the party that has a super effective move against a mon with Wonder Guard.\n}\n\nstatic bool8 FindMonThatAbsorbsOpponentsMove(void)\n{\n    u8 battlerIn1, battlerIn2;\n    u8 absorbingTypeAbility;\n    s32 i;\n\n    if ((HasSuperEffectiveMoveAgainstOpponents(TRUE) && Random() % 3) \n    || (gLastLandedMoves[gActiveBattler] == MOVE_NONE))\n        return FALSE;\n    if (gLastLandedMoves[gActiveBattler] == 0xFFFF\n     || gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0)\n        return FALSE;\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n    {\n        battlerIn1 = gActiveBattler;\n        if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))])\n            battlerIn2 = gActiveBattler;\n        else\n            battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)));\n    }\n    else\n    {\n        battlerIn1 = gActiveBattler;\n        battlerIn2 = gActiveBattler;\n    }\n    if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_FIRE)\n        absorbingTypeAbility = ABILITY_FLASH_FIRE;\n    else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_WATER)\n        absorbingTypeAbility = ABILITY_WATER_ABSORB;\n    else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_ELECTRIC)\n        absorbingTypeAbility = ABILITY_VOLT_ABSORB;\n    else\n        return FALSE;\n    if (gBattleMons[gActiveBattler].ability == absorbingTypeAbility)\n        return FALSE;\n    for (i = 0; i < PARTY_SIZE; ++i)\n    {\n        u16 species;\n        u8 monAbility;\n\n        if ((GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0)\n         || (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE)\n         || (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG)\n         || (i == gBattlerPartyIndexes[battlerIn1])\n         || (i == gBattlerPartyIndexes[battlerIn2])\n         || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1))\n         || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)))\n            continue;\n        species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES);\n        if (GetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM) != ABILITY_NONE)\n            monAbility = gSpeciesInfo[species].abilities[1];\n        else\n            monAbility = gSpeciesInfo[species].abilities[0];\n        if (absorbingTypeAbility == monAbility && Random() & 1)\n        {\n            // we found a mon\n            *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = i;\n            BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 ShouldSwitchIfNaturalCure(void)\n{\n    if (!(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)\n     || (gBattleMons[gActiveBattler].ability != ABILITY_NATURAL_CURE)\n     || (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 2))\n        return FALSE;\n    if ((gLastLandedMoves[gActiveBattler] == MOVE_NONE || gLastLandedMoves[gActiveBattler] == 0xFFFF) && Random() & 1)\n    {\n        *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE;\n        BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);\n        return TRUE;\n    }\n    else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0 && Random() & 1)\n    {\n        *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE;\n        BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);\n        return TRUE;\n    }\n    if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 1)\n     || FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 1))\n        return TRUE;\n    if (Random() & 1)\n    {\n        *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE;\n        BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng)\n{\n    u8 opposingBattler;\n    s32 i;\n    u8 moveFlags;\n    u16 move;\n\n    opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n    if (!(gAbsentBattlerFlags & gBitTable[opposingBattler]))\n    {\n        for (i = 0; i < MAX_MON_MOVES; ++i)\n        {\n            move = gBattleMons[gActiveBattler].moves[i];\n            if (move == MOVE_NONE)\n                continue;\n\n            moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability);\n            if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)\n            {\n                if (noRng || (Random() % 10))\n                    return TRUE;\n            }\n        }\n    }\n    if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))\n        return FALSE;\n    opposingBattler = GetBattlerAtPosition(BATTLE_PARTNER(B_POSITION_PLAYER_LEFT));\n    if (!(gAbsentBattlerFlags & gBitTable[opposingBattler]))\n    {\n        for (i = 0; i < MAX_MON_MOVES; ++i)\n        {\n            move = gBattleMons[gActiveBattler].moves[i];\n            if (move == MOVE_NONE)\n                continue;\n            moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability);\n            if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)\n            {\n                if (noRng)\n                    return TRUE;\n                if (Random() % 10 != 0)\n                    return TRUE;\n            }\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 AreStatsRaised(void)\n{\n    u8 buffedStatsValue = 0;\n    s32 i;\n\n    for (i = 0; i < NUM_BATTLE_STATS; ++i)\n    {\n        if (gBattleMons[gActiveBattler].statStages[i] > 6)\n            buffedStatsValue += gBattleMons[gActiveBattler].statStages[i] - 6;\n    }\n    return (buffedStatsValue > 3);\n}\n\nstatic bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)\n{\n    u8 battlerIn1, battlerIn2;\n    s32 i, j;\n    u16 move;\n    u8 moveFlags;\n\n    if (gLastLandedMoves[gActiveBattler] == 0)\n        return FALSE;\n    if ((gLastLandedMoves[gActiveBattler] == 0xFFFF)\n     || (gLastHitBy[gActiveBattler] == 0xFF)\n     || (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0))\n        return FALSE;\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n    {\n        battlerIn1 = gActiveBattler;\n        if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))])\n            battlerIn2 = gActiveBattler;\n        else\n            battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)));\n    }\n    else\n    {\n        battlerIn1 = gActiveBattler;\n        battlerIn2 = gActiveBattler;\n    }\n    for (i = 0; i < PARTY_SIZE; ++i)\n    {\n        u16 species;\n        u8 monAbility;\n\n        if ((GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0)\n         || (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE)\n         || (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG)\n         || (i == gBattlerPartyIndexes[battlerIn1])\n         || (i == gBattlerPartyIndexes[battlerIn2])\n         || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1))\n         || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)))\n            continue;\n        species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES);\n        if (GetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM) != ABILITY_NONE)\n            monAbility = gSpeciesInfo[species].abilities[1];\n        else\n            monAbility = gSpeciesInfo[species].abilities[0];\n        moveFlags = AI_TypeCalc(gLastLandedMoves[gActiveBattler], species, monAbility);\n        if (moveFlags & flags)\n        {\n            battlerIn1 = gLastHitBy[gActiveBattler];\n            for (j = 0; j < MAX_MON_MOVES; ++j)\n            {\n                move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j);\n                if (move == MOVE_NONE)\n                    continue;\n                moveFlags = AI_TypeCalc(move, gBattleMons[battlerIn1].species, gBattleMons[battlerIn1].ability);\n                if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0)\n                {\n                    *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = i;\n                    BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);\n                    return TRUE;\n                }\n            }\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 ShouldSwitch(void)\n{\n    u8 battlerIn1, battlerIn2;\n    s32 i;\n    s32 availableToSwitch;\n\n    if ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))\n     || (gStatuses3[gActiveBattler] & STATUS3_ROOTED)\n     || AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_SHADOW_TAG, 0, 0)\n     || AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_ARENA_TRAP, 0, 0))\n        return FALSE; // misses the flying or levitate check\n    if (AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MAGNET_PULL, 0, 0))\n        if ((gBattleMons[gActiveBattler].type1 == TYPE_STEEL) || (gBattleMons[gActiveBattler].type2 == TYPE_STEEL))\n            return FALSE;\n    availableToSwitch = 0;\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n    {\n        battlerIn1 = gActiveBattler;\n        if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)])\n            battlerIn2 = gActiveBattler;\n        else\n            battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK);\n    }\n    else\n    {\n        battlerIn2 = gActiveBattler;\n        battlerIn1 = gActiveBattler;\n    }\n    for (i = 0; i < PARTY_SIZE; ++i)\n    {\n        if ((GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0)\n         || (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE)\n         || (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG)\n         || (i == gBattlerPartyIndexes[battlerIn1])\n         || (i == gBattlerPartyIndexes[battlerIn2])\n         || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1))\n         || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)))\n            continue;\n        ++availableToSwitch;\n    }\n    if (!availableToSwitch)\n        return FALSE;\n    if (ShouldSwitchIfPerishSong()\n     || ShouldSwitchIfWonderGuard()\n     || FindMonThatAbsorbsOpponentsMove()\n     || ShouldSwitchIfNaturalCure())\n        return TRUE;\n    if (HasSuperEffectiveMoveAgainstOpponents(FALSE)\n     || AreStatsRaised())\n        return FALSE;\n    if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 2)\n     || FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 3))\n        return TRUE;\n    return FALSE;\n}\n\nvoid AI_TrySwitchOrUseItem(void)\n{\n    u8 battlerIn1, battlerIn2;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n    {\n        if (ShouldSwitch())\n        {\n            if (*(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) == 6)\n            {\n                s32 monToSwitchId = GetMostSuitableMonToSwitchInto();\n                if (monToSwitchId == 6)\n                {\n                    if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))\n                    {\n                        battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n                        battlerIn2 = battlerIn1;\n                    }\n                    else\n                    {\n                        battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n                        battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n                    }\n                    for (monToSwitchId = 0; monToSwitchId < PARTY_SIZE; ++monToSwitchId)\n                    {\n                        if ((!GetMonData(&gEnemyParty[monToSwitchId], MON_DATA_HP) == 0)\n                         && (monToSwitchId != gBattlerPartyIndexes[battlerIn1])\n                         && (monToSwitchId != gBattlerPartyIndexes[battlerIn2])\n                         && (monToSwitchId != *(gBattleStruct->monToSwitchIntoId + battlerIn1))\n                         && (monToSwitchId != *(gBattleStruct->monToSwitchIntoId + battlerIn2)))\n                            break;\n                    }\n                }\n                *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = monToSwitchId;\n            }\n            *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1));\n            return;\n        }\n        else if (ShouldUseItem())\n        {\n            return;\n        }\n    }\n    BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, (gActiveBattler ^ BIT_SIDE) << 8);\n}\n\nstatic void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 *var)\n{\n    s32 i = 0;\n\n    while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE)\n    {\n        if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT)\n        {\n            i += 3;\n            continue;\n        }\n        else if (TYPE_EFFECT_ATK_TYPE(i) == atkType)\n        {\n            // Check type1.\n            if (TYPE_EFFECT_DEF_TYPE(i) == defType1)\n                *var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10;\n            // Check type2.\n            if (TYPE_EFFECT_DEF_TYPE(i) == defType2 && defType1 != defType2)\n                *var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10;\n        }\n        i += 3;\n    }\n}\n\nu8 GetMostSuitableMonToSwitchInto(void)\n{\n    u8 opposingBattler;\n    u8 bestDmg; // Note : should be changed to u32 for obvious reasons.\n    u8 bestMonId;\n    u8 battlerIn1, battlerIn2;\n    s32 i, j;\n    u8 invalidMons;\n    u16 move;\n\n    if (*(gBattleStruct->monToSwitchIntoId + gActiveBattler) != PARTY_SIZE)\n        return *(gBattleStruct->monToSwitchIntoId + gActiveBattler);\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n    {\n        battlerIn1 = gActiveBattler;\n        if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)])\n            battlerIn2 = gActiveBattler;\n        else\n            battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK);\n        // UB: It considers the opponent only player's side even though it can battle alongside player.\n        opposingBattler = Random() & BIT_FLANK;\n        if (gAbsentBattlerFlags & gBitTable[opposingBattler])\n            opposingBattler ^= BIT_FLANK;\n    }\n    else\n    {\n        opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n        battlerIn1 = gActiveBattler;\n        battlerIn2 = gActiveBattler;\n    }\n    invalidMons = 0;\n    while (invalidMons != 0x3F) // All mons are invalid.\n    {\n        bestDmg = 0;\n        bestMonId = 6;\n        // Find the mon whose type is the most suitable offensively.\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            u16 species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES);\n            if (species != SPECIES_NONE\n                && GetMonData(&gEnemyParty[i], MON_DATA_HP) != 0\n                && !(gBitTable[i] & invalidMons)\n                && gBattlerPartyIndexes[battlerIn1] != i\n                && gBattlerPartyIndexes[battlerIn2] != i\n                && i != *(gBattleStruct->monToSwitchIntoId + battlerIn1)\n                && i != *(gBattleStruct->monToSwitchIntoId + battlerIn2))\n            {\n                u8 type1 = gSpeciesInfo[species].types[0];\n                u8 type2 = gSpeciesInfo[species].types[1];\n                u8 typeDmg = 10;\n                ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type1, type1, type2, &typeDmg);\n                ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type2, type1, type2, &typeDmg);\n                if (bestDmg < typeDmg)\n                {\n                    bestDmg = typeDmg;\n                    bestMonId = i;\n                }\n            }\n            else\n            {\n                invalidMons |= gBitTable[i];\n            }\n        }\n        // Ok, we know the mon has the right typing but does it have at least one super effective move?\n        if (bestMonId != PARTY_SIZE)\n        {\n            for (i = 0; i < MAX_MON_MOVES; ++i)\n            {\n                move = GetMonData(&gEnemyParty[bestMonId], MON_DATA_MOVE1 + i);\n                if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBattler) & MOVE_RESULT_SUPER_EFFECTIVE)\n                    break;\n            }\n            if (i != MAX_MON_MOVES)\n                return bestMonId; // Has both the typing and at least one super effective move.\n\n            invalidMons |= gBitTable[bestMonId]; // Sorry buddy, we want something better.\n        }\n        else\n        {\n            invalidMons = 0x3F; // No viable mon to switch.\n        }\n    }\n    gDynamicBasePower = 0;\n    gBattleStruct->dynamicMoveType = 0;\n    gBattleScripting.dmgMultiplier = 1;\n    gMoveResultFlags = 0;\n    gCritMultiplier = 1;\n    bestDmg = 0;\n    bestMonId = 6;\n    // If we couldn't find the best mon in terms of typing, find the one that deals most damage.\n    for (i = 0; i < PARTY_SIZE; ++i)\n    {\n        if (((u16)(GetMonData(&gEnemyParty[i], MON_DATA_SPECIES)) == SPECIES_NONE)\n         || (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0)\n         || (gBattlerPartyIndexes[battlerIn1] == i)\n         || (gBattlerPartyIndexes[battlerIn2] == i)\n         || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1))\n         || (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)))\n            continue;\n        for (j = 0; j < MAX_MON_MOVES; ++j)\n        {\n            move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j);\n            gBattleMoveDamage = 0;\n            if (move != MOVE_NONE && gBattleMoves[move].power != 1)\n            {\n                AI_CalcDmg(gActiveBattler, opposingBattler);\n                TypeCalc(move, gActiveBattler, opposingBattler);\n            }\n            if (bestDmg < gBattleMoveDamage)\n            {\n                bestDmg = gBattleMoveDamage;\n                bestMonId = i;\n            }\n        }\n    }\n    return bestMonId;\n}\n\nstatic u8 GetAI_ItemType(u8 itemId, const u8 *itemEffect) // NOTE: should take u16 as item Id argument\n{\n    if (itemId == ITEM_FULL_RESTORE)\n        return AI_ITEM_FULL_RESTORE;\n    else if (itemEffect[4] & ITEM4_HEAL_HP)\n        return AI_ITEM_HEAL_HP;\n    else if (itemEffect[3] & ITEM3_STATUS_ALL)\n        return AI_ITEM_CURE_CONDITION;\n    else if (itemEffect[0] & (ITEM0_DIRE_HIT | ITEM0_X_ATTACK) || itemEffect[1] != 0 || itemEffect[2] != 0)\n        return AI_ITEM_X_STAT;\n    else if (itemEffect[3] & ITEM3_GUARD_SPEC)\n        return AI_ITEM_GUARD_SPECS;\n    else\n        return AI_ITEM_NOT_RECOGNIZABLE;\n}\n\nstatic bool8 ShouldUseItem(void)\n{\n    s32 i;\n    u8 validMons = 0;\n    bool8 shouldUse = FALSE;\n\n    for (i = 0; i < PARTY_SIZE; ++i)\n        if (GetMonData(&gEnemyParty[i], MON_DATA_HP) != 0\n         && GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE\n         && GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG)\n            ++validMons;\n    for (i = 0; i < MAX_TRAINER_ITEMS; ++i)\n    {\n        u16 item;\n        const u8 *itemEffects;\n        u8 paramOffset;\n        u8 battlerSide;\n\n        if (i && validMons > (gBattleResources->battleHistory->itemsNo - i) + 1)\n            continue;\n        item = gBattleResources->battleHistory->trainerItems[i];\n        if (item == ITEM_NONE || gItemEffectTable[item - ITEM_POTION] == NULL)\n            continue;\n        if (item == ITEM_ENIGMA_BERRY)\n            itemEffects = gSaveBlock1Ptr->enigmaBerry.itemEffect;\n        else\n            itemEffects = gItemEffectTable[item - ITEM_POTION];\n        *(gBattleStruct->AI_itemType + gActiveBattler / 2) = GetAI_ItemType(item, itemEffects);\n        switch (*(gBattleStruct->AI_itemType + gActiveBattler / 2))\n        {\n        case AI_ITEM_FULL_RESTORE:\n            if (gBattleMons[gActiveBattler].hp >= gBattleMons[gActiveBattler].maxHP / 4)\n                break;\n            if (gBattleMons[gActiveBattler].hp == 0)\n                break;\n            shouldUse = TRUE;\n            break;\n        case AI_ITEM_HEAL_HP:\n            paramOffset = GetItemEffectParamOffset(item, 4, 4);\n            if (paramOffset == 0 || gBattleMons[gActiveBattler].hp == 0)\n                break;\n            if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 4 || gBattleMons[gActiveBattler].maxHP - gBattleMons[gActiveBattler].hp > itemEffects[paramOffset])\n                shouldUse = TRUE;\n            break;\n        case AI_ITEM_CURE_CONDITION:\n            *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0;\n            if (itemEffects[3] & ITEM3_SLEEP && gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)\n            {\n                *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20;\n                shouldUse = TRUE;\n            }\n            if (itemEffects[3] & ITEM3_POISON && (gBattleMons[gActiveBattler].status1 & STATUS1_POISON || gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON))\n            {\n                *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x10;\n                shouldUse = TRUE;\n            }\n            if (itemEffects[3] & ITEM3_BURN && gBattleMons[gActiveBattler].status1 & STATUS1_BURN)\n            {\n                *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8;\n                shouldUse = TRUE;\n            }\n            if (itemEffects[3] & ITEM3_FREEZE && gBattleMons[gActiveBattler].status1 & STATUS1_FREEZE)\n            {\n                *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4;\n                shouldUse = TRUE;\n            }\n            if (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[gActiveBattler].status1 & STATUS1_PARALYSIS)\n            {\n                *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2;\n                shouldUse = TRUE;\n            }\n            if (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)\n            {\n                *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1;\n                shouldUse = TRUE;\n            }\n            break;\n        case AI_ITEM_X_STAT:\n            *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0;\n            if (!gDisableStructs[gActiveBattler].isFirstTurn)\n                break;\n            if (itemEffects[0] & ITEM0_X_ATTACK)\n                *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1;\n            if (itemEffects[1] & ITEM1_X_DEFEND)\n                *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2;\n            if (itemEffects[1] & ITEM1_X_SPEED)\n                *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4;\n            if (itemEffects[2] & ITEM2_X_SPATK)\n                *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8;\n            if (itemEffects[2] & ITEM2_X_ACCURACY)\n                *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20;\n            if (itemEffects[0] & ITEM0_DIRE_HIT)\n                *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x80;\n            shouldUse = TRUE;\n            break;\n        case AI_ITEM_GUARD_SPECS:\n            battlerSide = GetBattlerSide(gActiveBattler);\n            if (gDisableStructs[gActiveBattler].isFirstTurn && gSideTimers[battlerSide].mistTimer == 0)\n                shouldUse = TRUE;\n            break;\n        case AI_ITEM_NOT_RECOGNIZABLE:\n            return FALSE;\n        }\n        if (shouldUse)\n        {\n            BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0);\n            *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2) = item;\n            gBattleResources->battleHistory->trainerItems[i] = 0;\n            return shouldUse;\n        }\n    }\n    return FALSE;\n}\n"
  },
  {
    "path": "src/battle_anim.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_controllers.h\"\n#include \"battle_interface.h\"\n#include \"battle_bg.h\"\n#include \"decompress.h\"\n#include \"graphics.h\"\n#include \"m4a.h\"\n#include \"task.h\"\n#include \"constants/battle_anim.h\"\n\n/*\n    This file handles the commands for the macros defined in\n    battle_anim_script.inc and used in battle_anim_scripts.s\n*/\n\n#define ANIM_SPRITE_INDEX_COUNT 8\n\nEWRAM_DATA static const u8 *sBattleAnimScriptPtr = NULL;\nEWRAM_DATA static const u8 *sBattleAnimScriptRetAddr = NULL;\nEWRAM_DATA void (*gAnimScriptCallback)(void) = NULL;\nEWRAM_DATA static s8 sAnimFramesToWait = 0;\nEWRAM_DATA bool8 gAnimScriptActive = FALSE;\nEWRAM_DATA u8 gAnimVisualTaskCount = 0;\nEWRAM_DATA u8 gAnimSoundTaskCount = 0;\nEWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL;\nEWRAM_DATA s32 gAnimMoveDmg = 0;\nEWRAM_DATA u16 gAnimMovePower = 0;\nEWRAM_DATA static u16 sAnimSpriteIndexArray[ANIM_SPRITE_INDEX_COUNT] = {0};\nEWRAM_DATA u8 gAnimFriendship = 0;\nEWRAM_DATA u16 gWeatherMoveAnim = 0;\nEWRAM_DATA s16 gBattleAnimArgs[ANIM_ARGS_COUNT] = {0};\nEWRAM_DATA static u16 sSoundAnimFramesToWait = 0;\nEWRAM_DATA static u8 sMonAnimTaskIdArray[2] = {0};\nEWRAM_DATA u8 gAnimMoveTurn = 0;\nEWRAM_DATA static u8 sAnimBackgroundFadeState = 0;\nEWRAM_DATA static u16 sAnimMoveIndex = 0; // Set but unused.\nEWRAM_DATA u8 gBattleAnimAttacker = 0;\nEWRAM_DATA u8 gBattleAnimTarget = 0;\nEWRAM_DATA u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gAnimCustomPanning = 0;\n\nstatic void AddSpriteIndex(u16 index);\nstatic void ClearSpriteIndex(u16 index);\nstatic void WaitAnimFrameCount(void);\nstatic void RunAnimScriptCommand(void);\nstatic void Task_ClearMonBgStatic(u8 taskId);\nstatic void Task_FadeToBg(u8 taskId);\nstatic void Task_PanFromInitialToTarget(u8 taskId);\nstatic void Task_InitUpdateMonBg(u8 taskId);\nstatic void LoadMoveBg(u16 bgId);\nstatic void LoadDefaultBg(void);\nstatic void Task_LoopAndPlaySE(u8 taskId);\nstatic void Task_WaitAndPlaySE(u8 taskId);\nstatic void Task_ClearMonBg(u8 taskId);\n\nstatic void Cmd_loadspritegfx(void);\nstatic void Cmd_unloadspritegfx(void);\nstatic void Cmd_createsprite(void);\nstatic void Cmd_createvisualtask(void);\nstatic void Cmd_delay(void);\nstatic void Cmd_waitforvisualfinish(void);\nstatic void Cmd_nop(void);\nstatic void Cmd_nop2(void);\nstatic void Cmd_end(void);\nstatic void Cmd_playse(void);\nstatic void Cmd_monbg(void);\nstatic void Cmd_clearmonbg(void);\nstatic void Cmd_setalpha(void);\nstatic void Cmd_blendoff(void);\nstatic void Cmd_call(void);\nstatic void Cmd_return(void);\nstatic void Cmd_setarg(void);\nstatic void Cmd_choosetwoturnanim(void);\nstatic void Cmd_jumpifmoveturn(void);\nstatic void Cmd_goto(void);\nstatic void Cmd_fadetobg(void);\nstatic void Cmd_restorebg(void);\nstatic void Cmd_waitbgfadeout(void);\nstatic void Cmd_waitbgfadein(void);\nstatic void Cmd_changebg(void);\nstatic void Cmd_playsewithpan(void);\nstatic void Cmd_setpan(void);\nstatic void Cmd_panse(void);\nstatic void Cmd_loopsewithpan(void);\nstatic void Cmd_waitplaysewithpan(void);\nstatic void Cmd_setbldcnt(void);\nstatic void Cmd_createsoundtask(void);\nstatic void Cmd_waitsound(void);\nstatic void Cmd_jumpargeq(void);\nstatic void Cmd_monbg_static(void);\nstatic void Cmd_clearmonbg_static(void);\nstatic void Cmd_jumpifcontest(void);\nstatic void Cmd_fadetobgfromset(void);\nstatic void Cmd_panse_adjustnone(void);\nstatic void Cmd_panse_adjustall(void);\nstatic void Cmd_splitbgprio(void);\nstatic void Cmd_splitbgprio_all(void);\nstatic void Cmd_splitbgprio_foes(void);\nstatic void Cmd_invisible(void);\nstatic void Cmd_visible(void);\nstatic void Cmd_teamattack_moveback(void);\nstatic void Cmd_teamattack_movefwd(void);\nstatic void Cmd_stopsound(void);\n\n#include \"data/battle_anim.h\"\n\nstatic void (*const sScriptCmdTable[])(void) =\n{\n    Cmd_loadspritegfx,        // 0x00\n    Cmd_unloadspritegfx,      // 0x01\n    Cmd_createsprite,         // 0x02\n    Cmd_createvisualtask,     // 0x03\n    Cmd_delay,                // 0x04\n    Cmd_waitforvisualfinish,  // 0x05\n    Cmd_nop,                  // 0x06\n    Cmd_nop2,                 // 0x07\n    Cmd_end,                  // 0x08\n    Cmd_playse,               // 0x09\n    Cmd_monbg,                // 0x0A\n    Cmd_clearmonbg,           // 0x0B\n    Cmd_setalpha,             // 0x0C\n    Cmd_blendoff,             // 0x0D\n    Cmd_call,                 // 0x0E\n    Cmd_return,               // 0x0F\n    Cmd_setarg,               // 0x10\n    Cmd_choosetwoturnanim,    // 0x11\n    Cmd_jumpifmoveturn,       // 0x12\n    Cmd_goto,                 // 0x13\n    Cmd_fadetobg,             // 0x14\n    Cmd_restorebg,            // 0x15\n    Cmd_waitbgfadeout,        // 0x16\n    Cmd_waitbgfadein,         // 0x17\n    Cmd_changebg,             // 0x18\n    Cmd_playsewithpan,        // 0x19\n    Cmd_setpan,               // 0x1A\n    Cmd_panse,                // 0x1B\n    Cmd_loopsewithpan,        // 0x1C\n    Cmd_waitplaysewithpan,    // 0x1D\n    Cmd_setbldcnt,            // 0x1E\n    Cmd_createsoundtask,      // 0x1F\n    Cmd_waitsound,            // 0x20\n    Cmd_jumpargeq,            // 0x21\n    Cmd_monbg_static,         // 0x22\n    Cmd_clearmonbg_static,    // 0x23\n    Cmd_jumpifcontest,        // 0x24\n    Cmd_fadetobgfromset,      // 0x25\n    Cmd_panse_adjustnone,     // 0x26\n    Cmd_panse_adjustall,      // 0x27\n    Cmd_splitbgprio,          // 0x28\n    Cmd_splitbgprio_all,      // 0x29\n    Cmd_splitbgprio_foes,     // 0x2A\n    Cmd_invisible,            // 0x2B\n    Cmd_visible,              // 0x2C\n    Cmd_teamattack_moveback,  // 0x2D\n    Cmd_teamattack_movefwd,   // 0x2E\n    Cmd_stopsound,            // 0x2F\n};\n\nvoid ClearBattleAnimationVars(void)\n{\n    s32 i;\n\n    sAnimFramesToWait = 0;\n    gAnimScriptActive = FALSE;\n    gAnimVisualTaskCount = 0;\n    gAnimSoundTaskCount = 0;\n    gAnimDisableStructPtr = NULL;\n    gAnimMoveDmg = 0;\n    gAnimMovePower = 0;\n    gAnimFriendship = 0;\n    \n    // Clear index array.\n    for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)\n        sAnimSpriteIndexArray[i] |= 0xFFFF;\n\n    // Clear anim args.\n    for (i = 0; i < ANIM_ARGS_COUNT; i++)\n        gBattleAnimArgs[i] = 0;\n\n    sMonAnimTaskIdArray[0] = TASK_NONE;\n    sMonAnimTaskIdArray[1] = TASK_NONE;\n    gAnimMoveTurn = 0;\n    sAnimBackgroundFadeState = 0;\n    sAnimMoveIndex = 0;\n    gBattleAnimAttacker = 0;\n    gBattleAnimTarget = 0;\n    gAnimCustomPanning = 0;\n}\n\nvoid DoMoveAnim(u16 move)\n{\n    gBattleAnimAttacker = gBattlerAttacker;\n    gBattleAnimTarget = gBattlerTarget;\n    LaunchBattleAnimation(gBattleAnims_Moves, move, TRUE);\n}\n\nvoid LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMoveAnim)\n{\n    s32 i;\n\n    InitPrioritiesForVisibleBattlers();\n    UpdateOamPriorityInAllHealthboxes(0);\n    for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n    {\n        if (GetBattlerSide(i) != B_SIDE_PLAYER)\n            gAnimBattlerSpecies[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);\n        else\n            gAnimBattlerSpecies[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);\n    }\n\n    if (!isMoveAnim)\n        sAnimMoveIndex = 0;\n    else\n        sAnimMoveIndex = tableId;\n\n    for (i = 0; i < ANIM_ARGS_COUNT; i++)\n        gBattleAnimArgs[i] = 0;\n\n    sMonAnimTaskIdArray[0] = TASK_NONE;\n    sMonAnimTaskIdArray[1] = TASK_NONE;\n    sBattleAnimScriptPtr = animsTable[tableId];\n    gAnimScriptActive = TRUE;\n    sAnimFramesToWait = 0;\n    gAnimScriptCallback = RunAnimScriptCommand;\n\n    for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)\n        sAnimSpriteIndexArray[i] = 0xFFFF;\n\n    if (isMoveAnim)\n    {\n        for (i = 0; gMovesWithQuietBGM[i] != 0xFFFF; i++)\n        {\n            if (tableId == gMovesWithQuietBGM[i])\n            {\n                m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 128);\n                break;\n            }\n        }\n    }\n\n    gBattle_WIN0H = 0;\n    gBattle_WIN0V = 0;\n    gBattle_WIN1H = 0;\n    gBattle_WIN1V = 0;\n}\n\nvoid DestroyAnimSprite(struct Sprite *sprite)\n{\n    FreeSpriteOamMatrix(sprite);\n    DestroySprite(sprite);\n    gAnimVisualTaskCount--;\n}\n\nvoid DestroyAnimVisualTask(u8 taskId)\n{\n    DestroyTask(taskId);\n    gAnimVisualTaskCount--;\n}\n\nvoid DestroyAnimSoundTask(u8 taskId)\n{\n    DestroyTask(taskId);\n    gAnimSoundTaskCount--;\n}\n\nstatic void AddSpriteIndex(u16 index)\n{\n    s32 i;\n\n    for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)\n    {\n        if (sAnimSpriteIndexArray[i] == 0xFFFF)\n        {\n            sAnimSpriteIndexArray[i] = index;\n            return;\n        }\n    }\n}\n\nstatic void ClearSpriteIndex(u16 index)\n{\n    s32 i;\n\n    for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)\n    {\n        if (sAnimSpriteIndexArray[i] == index)\n        {\n            sAnimSpriteIndexArray[i] = 0xFFFF;\n            return;\n        }\n    }\n}\n\nstatic void WaitAnimFrameCount(void)\n{\n    if (sAnimFramesToWait <= 0)\n    {\n        gAnimScriptCallback = RunAnimScriptCommand;\n        sAnimFramesToWait = 0;\n    }\n    else\n    {\n        sAnimFramesToWait--;\n    }\n}\n\nstatic void RunAnimScriptCommand(void)\n{\n    do\n    {\n        sScriptCmdTable[sBattleAnimScriptPtr[0]]();\n    } while (sAnimFramesToWait == 0 && gAnimScriptActive);\n}\n\nstatic void Cmd_loadspritegfx(void)\n{\n    u16 index;\n\n    sBattleAnimScriptPtr++;\n    index = T1_READ_16(sBattleAnimScriptPtr);\n    LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]);\n    LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]);\n    sBattleAnimScriptPtr += 2;\n    AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index));\n    sAnimFramesToWait = 1;\n    gAnimScriptCallback = WaitAnimFrameCount;\n}\n\nstatic void Cmd_unloadspritegfx(void)\n{\n    u16 index;\n\n    sBattleAnimScriptPtr++;\n    index = T1_READ_16(sBattleAnimScriptPtr);\n    FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);\n    FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);\n    sBattleAnimScriptPtr += 2;\n    ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index));\n}\n\n// Create sprite from template and init data array with varargs\n// args: template, flags, va_args\n// flags:\n//  - bits 0-6: subpriority mod (signed)\n//  - bit 7: target if set else attacker\nstatic void Cmd_createsprite(void)\n{\n    s32 i;\n    const struct SpriteTemplate *template;\n    u8 argVar;\n    u8 argsCount;\n    s16 subpriority;\n\n    sBattleAnimScriptPtr++;\n    template = (const struct SpriteTemplate *)(T2_READ_32(sBattleAnimScriptPtr));\n    sBattleAnimScriptPtr += 4;\n\n    argVar = sBattleAnimScriptPtr[0];\n    sBattleAnimScriptPtr++;\n\n    argsCount = sBattleAnimScriptPtr[0];\n    sBattleAnimScriptPtr++;\n    for (i = 0; i < argsCount; i++)\n    {\n        gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr);\n        sBattleAnimScriptPtr += 2;\n    }\n\n    if (argVar & ANIMSPRITE_IS_TARGET)\n    {\n        argVar ^= ANIMSPRITE_IS_TARGET;\n        if (argVar >= 64)\n            argVar -= 64;\n        else\n            argVar *= -1;\n\n        subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + (s8)(argVar);\n    }\n    else\n    {\n        if (argVar >= 64)\n            argVar -= 64;\n        else\n            argVar *= -1;\n\n        subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) + (s8)(argVar);\n    }\n\n    if (subpriority < 3)\n        subpriority = 3;\n\n    CreateSpriteAndAnimate(\n        template,\n        GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2),\n        GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET),\n        subpriority);\n    gAnimVisualTaskCount++;\n}\n\nstatic void Cmd_createvisualtask(void)\n{\n    TaskFunc taskFunc;\n    u8 taskPriority;\n    u8 taskId;\n    u8 numArgs;\n    s32 i;\n\n    sBattleAnimScriptPtr++;\n\n    taskFunc = (TaskFunc)T2_READ_32(sBattleAnimScriptPtr);\n    sBattleAnimScriptPtr += 4;\n\n    taskPriority = sBattleAnimScriptPtr[0];\n    sBattleAnimScriptPtr++;\n\n    numArgs = sBattleAnimScriptPtr[0];\n    sBattleAnimScriptPtr++;\n\n    for (i = 0; i < numArgs; i++)\n    {\n        gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr);\n        sBattleAnimScriptPtr += 2;\n    }\n\n    taskId = CreateTask(taskFunc, taskPriority);\n    taskFunc(taskId);\n    gAnimVisualTaskCount++;\n}\n\nstatic void Cmd_delay(void)\n{\n    sBattleAnimScriptPtr++;\n    sAnimFramesToWait = sBattleAnimScriptPtr[0];\n    if (sAnimFramesToWait == 0)\n        sAnimFramesToWait = -1;\n    sBattleAnimScriptPtr++;\n    gAnimScriptCallback = WaitAnimFrameCount;\n}\n\nstatic void Cmd_waitforvisualfinish(void)\n{\n    if (gAnimVisualTaskCount == 0)\n    {\n        sBattleAnimScriptPtr++;\n        sAnimFramesToWait = 0;\n    }\n    else\n    {\n        sAnimFramesToWait = 1;\n    }\n}\n\nstatic void Cmd_nop(void)\n{\n}\n\nstatic void Cmd_nop2(void)\n{\n}\n\nstatic void Cmd_end(void)\n{\n    s32 i;\n    bool32 continuousAnim = FALSE;\n\n    // Keep waiting as long as there are animations to be done.\n    if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0\n     || sMonAnimTaskIdArray[0] != TASK_NONE || sMonAnimTaskIdArray[1] != TASK_NONE)\n    {\n        sSoundAnimFramesToWait = 0;\n        sAnimFramesToWait = 1;\n        return;\n    }\n\n    // Finish the sound effects.\n    if (IsSEPlaying())\n    {\n        if (++sSoundAnimFramesToWait <= 90) // Wait 90 frames, then halt the sound effect.\n        {\n            sAnimFramesToWait = 1;\n            return;\n        }\n        else\n        {\n            m4aMPlayStop(&gMPlayInfo_SE1);\n            m4aMPlayStop(&gMPlayInfo_SE2);\n        }\n    }\n\n    // The SE has halted, so set the SE Frame Counter to 0 and continue.\n    sSoundAnimFramesToWait = 0;\n\n    for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)\n    {\n        if (sAnimSpriteIndexArray[i] != 0xFFFF)\n        {\n            FreeSpriteTilesByTag(gBattleAnimPicTable[sAnimSpriteIndexArray[i]].tag);\n            FreeSpritePaletteByTag(gBattleAnimPicTable[sAnimSpriteIndexArray[i]].tag);\n            sAnimSpriteIndexArray[i] = 0xFFFF; // set terminator.\n        }\n    }\n\n    if (!continuousAnim)\n    {\n        m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256);\n        InitPrioritiesForVisibleBattlers();\n        UpdateOamPriorityInAllHealthboxes(1);\n        gAnimScriptActive = FALSE;\n    }\n}\n\nstatic void Cmd_playse(void)\n{\n    sBattleAnimScriptPtr++;\n    PlaySE(T1_READ_16(sBattleAnimScriptPtr));\n    sBattleAnimScriptPtr += 2;\n}\n\n#define t1_MONBG_BATTLER        0\n#define t1_MON_IN_BG2           1\n#define t1_CREATE_ANOTHER_TASK  2\n#define t1_IS_SECONDMON_BG      3\n\n#define t2_BATTLER_SPRITE_ID    0\n#define t2_MON_IN_BG2           5\n#define t2_MONBG_BATTLER        6\n\nstatic void Cmd_monbg(void)\n{\n    bool8 toBG_2;\n    u8 taskId;\n    u8 battlerId;\n    u8 animBattler;\n    u8 position;\n    u8 spriteId;\n\n    sBattleAnimScriptPtr++;\n    animBattler = sBattleAnimScriptPtr[0];\n    if (animBattler == ANIM_ATTACKER)\n        animBattler = ANIM_ATK_PARTNER;\n    else if (animBattler == ANIM_TARGET)\n        animBattler = ANIM_DEF_PARTNER;\n\n    if (animBattler == ANIM_ATTACKER || animBattler == ANIM_ATK_PARTNER)\n        battlerId = gBattleAnimAttacker;\n    else\n        battlerId = gBattleAnimTarget;\n    \n    // Move designated battler to background\n    if (IsBattlerSpriteVisible(battlerId))\n    {\n        position = GetBattlerPosition(battlerId);\n        if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT)\n            toBG_2 = FALSE;\n        else\n            toBG_2 = TRUE;\n\n        MoveBattlerSpriteToBG(battlerId, toBG_2);\n        spriteId = gBattlerSpriteIds[battlerId];\n        taskId = CreateTask(Task_InitUpdateMonBg, 10);\n        gTasks[taskId].data[t1_MONBG_BATTLER] = spriteId;\n        gTasks[taskId].data[1] = gSprites[spriteId].x + gSprites[spriteId].x2;\n        gTasks[taskId].data[2] = gSprites[spriteId].y + gSprites[spriteId].y2;\n        if (!toBG_2)\n        {\n            gTasks[taskId].data[3] = gBattle_BG1_X;\n            gTasks[taskId].data[4] = gBattle_BG1_Y;\n        }\n        else\n        {\n            gTasks[taskId].data[3] = gBattle_BG2_X;\n            gTasks[taskId].data[4] = gBattle_BG2_Y;\n        }\n\n        gTasks[taskId].data[5] = toBG_2;\n        gTasks[taskId].data[6] = battlerId;\n        sMonAnimTaskIdArray[0] = taskId;\n    }\n\n    battlerId ^= BIT_FLANK;\n    if (animBattler > ANIM_TARGET && IsBattlerSpriteVisible(battlerId))\n    {\n        position = GetBattlerPosition(battlerId);\n        if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT)\n            toBG_2 = FALSE;\n        else\n            toBG_2 = TRUE;\n\n        MoveBattlerSpriteToBG(battlerId, toBG_2);\n        spriteId = gBattlerSpriteIds[battlerId];\n        taskId = CreateTask(Task_InitUpdateMonBg, 10);\n        gTasks[taskId].data[t1_MONBG_BATTLER] = spriteId;\n        gTasks[taskId].data[1] = gSprites[spriteId].x + gSprites[spriteId].x2;\n        gTasks[taskId].data[2] = gSprites[spriteId].y + gSprites[spriteId].y2;\n        if (!toBG_2)\n        {\n            gTasks[taskId].data[3] = gBattle_BG1_X;\n            gTasks[taskId].data[4] = gBattle_BG1_Y;\n        }\n        else\n        {\n            gTasks[taskId].data[3] = gBattle_BG2_X;\n            gTasks[taskId].data[4] = gBattle_BG2_Y;\n        }\n\n        gTasks[taskId].data[5] = toBG_2;\n        gTasks[taskId].data[6] = battlerId;\n        sMonAnimTaskIdArray[1] = taskId;\n    }\n\n    sBattleAnimScriptPtr++;\n}\n\nbool8 IsBattlerSpriteVisible(u8 battlerId)\n{\n    u8 battler = battlerId;\n    \n    if (!IsBattlerSpritePresent(battler))\n        return FALSE;\n\n    if (!gBattleSpritesDataPtr->battlerData[battler].invisible || !gSprites[gBattlerSpriteIds[battler]].invisible)\n        return TRUE;\n\n    return FALSE;\n}\n\nvoid MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2)\n{\n    struct BattleAnimBgData animBg;\n    u8 battlerSpriteId;\n    struct Sprite *sprite;\n\n    if (!toBG_2)\n    {\n\n        RequestDma3Fill(0, (void *)(BG_SCREEN_ADDR(8)), 0x2000, DMA3_32BIT);\n        RequestDma3Fill(0, (void *)(BG_SCREEN_ADDR(28)), 0x1000, DMA3_32BIT);\n        GetBattleAnimBg1Data(&animBg);\n        CpuFill16(toBG_2, animBg.bgTiles, 0x1000);\n        CpuFill16(toBG_2, animBg.bgTilemap, 0x800);\n\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 2);\n        SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1);\n        SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 0);\n\n        battlerSpriteId = gBattlerSpriteIds[battlerId];\n        gBattle_BG1_X =  -(gSprites[battlerSpriteId].x + gSprites[battlerSpriteId].x2) + 0x20;\n        gBattle_BG1_Y =  -(gSprites[battlerSpriteId].y + gSprites[battlerSpriteId].y2) + 0x20;\n        gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;\n\n        SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);\n        SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);\n\n        LoadPalette(&gPlttBufferUnfaded[OBJ_PLTT_ID(battlerId)], BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n        CpuCopy32(&gPlttBufferUnfaded[OBJ_PLTT_ID(battlerId)], (void *)(BG_PLTT + animBg.paletteId * PLTT_SIZE_4BPP), PLTT_SIZE_4BPP);\n\n        CopyBattlerSpriteToBg(1, 0, 0, GetBattlerPosition(battlerId), animBg.paletteId, animBg.bgTiles,\n                              animBg.bgTilemap, animBg.tilesOffset);\n    }\n    else\n    {\n        RequestDma3Fill(0, (void *)(BG_SCREEN_ADDR(12)), 0x2000, DMA3_32BIT);\n        RequestDma3Fill(0, (void *)(BG_SCREEN_ADDR(30)), 0x1000, DMA3_32BIT);\n        GetBattleAnimBgData(&animBg, 2);\n        CpuFill16(0, animBg.bgTiles + 0x1000, 0x1000);\n        CpuFill16(0, animBg.bgTilemap + 0x400, 0x800);\n        SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);\n        SetAnimBgAttribute(2, BG_ANIM_SCREEN_SIZE, 1);\n        SetAnimBgAttribute(2, BG_ANIM_AREA_OVERFLOW_MODE, 0);\n\n        battlerSpriteId = gBattlerSpriteIds[battlerId];\n        gBattle_BG2_X =  -(gSprites[battlerSpriteId].x + gSprites[battlerSpriteId].x2) + 0x20;\n        gBattle_BG2_Y =  -(gSprites[battlerSpriteId].y + gSprites[battlerSpriteId].y2) + 0x20;\n        gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;\n\n        SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X);\n        SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y);\n\n        LoadPalette(&gPlttBufferUnfaded[OBJ_PLTT_ID(battlerId)], BG_PLTT_ID(9), PLTT_SIZE_4BPP);\n        CpuCopy32(&gPlttBufferUnfaded[OBJ_PLTT_ID(battlerId)], (void *)(BG_PLTT + 9 * PLTT_SIZE_4BPP), PLTT_SIZE_4BPP);\n\n        CopyBattlerSpriteToBg(2, 0, 0, GetBattlerPosition(battlerId), animBg.paletteId, animBg.bgTiles + 0x1000,\n                              animBg.bgTilemap + 0x400, animBg.tilesOffset);\n    }\n}\n\nvoid RelocateBattleBgPal(u16 paletteNum, u16 *dest, s32 offset, u8 largeScreen)\n{\n    u8 i, j;\n    u32 size;\n\n    if (!largeScreen)\n        size = 32;\n    else\n        size = 64;\n    paletteNum <<= 12;\n    for (i = 0; i < size; i++)\n    {\n        for (j = 0; j < 32; j++)\n        {\n            dest[j + i * 32] = ((dest[j + i * 32] & 0xFFF) | paletteNum) + offset;\n        }\n    }\n}\n\nvoid ResetBattleAnimBg(bool8 to_BG2)\n{\n    struct BattleAnimBgData animBg;\n    GetBattleAnimBg1Data(&animBg);\n\n    if (!to_BG2)\n    {\n        InitBattleAnimBg(1);\n        gBattle_BG1_X = 0;\n        gBattle_BG1_Y = 0;\n    }\n    else\n    {\n        InitBattleAnimBg(2);\n        gBattle_BG2_X = 0;\n        gBattle_BG2_Y = 0;\n    }\n}\n\nstatic void Task_InitUpdateMonBg(u8 taskId)\n{\n    u8 spriteId, palIndex;\n    s16 x, y;\n    struct BattleAnimBgData animBg;\n\n    spriteId = gTasks[taskId].data[0];\n    palIndex = gTasks[taskId].data[6];\n    GetBattleAnimBg1Data(&animBg);\n    x = gTasks[taskId].data[1] - (gSprites[spriteId].x + gSprites[spriteId].x2);\n    y = gTasks[taskId].data[2] - (gSprites[spriteId].y + gSprites[spriteId].y2);\n\n    if (gTasks[taskId].data[5] == 0)\n    {\n        gBattle_BG1_X = x + gTasks[taskId].data[3];\n        gBattle_BG1_Y = y + gTasks[taskId].data[4];\n        CpuCopy32(&gPlttBufferFaded[OBJ_PLTT_ID(palIndex)], &gPlttBufferFaded[BG_PLTT_ID(animBg.paletteId)], PLTT_SIZE_4BPP);\n    }\n    else\n    {\n        gBattle_BG2_X = x + gTasks[taskId].data[3];\n        gBattle_BG2_Y = y + gTasks[taskId].data[4];\n        CpuCopy32(&gPlttBufferFaded[OBJ_PLTT_ID(palIndex)], &gPlttBufferFaded[BG_PLTT_ID(9)], PLTT_SIZE_4BPP);\n    }\n}\n\nstatic void Cmd_clearmonbg(void)\n{\n    u8 animBattlerId;\n    u8 battlerId;\n    u8 taskId;\n\n    sBattleAnimScriptPtr++;\n    animBattlerId = sBattleAnimScriptPtr[0];\n    if (animBattlerId == ANIM_ATTACKER)\n        animBattlerId = ANIM_ATK_PARTNER;\n    else if (animBattlerId == ANIM_TARGET)\n        animBattlerId = ANIM_DEF_PARTNER;\n\n    if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER)\n        battlerId = gBattleAnimAttacker;\n    else\n        battlerId = gBattleAnimTarget;\n\n    if (sMonAnimTaskIdArray[0] != TASK_NONE)\n        gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE;\n    if (animBattlerId > ANIM_TARGET && sMonAnimTaskIdArray[1] != TASK_NONE)\n        gSprites[gBattlerSpriteIds[battlerId ^ BIT_FLANK]].invisible = FALSE;\n    else\n        animBattlerId = ANIM_ATTACKER;\n\n    taskId = CreateTask(Task_ClearMonBg, 5);\n    gTasks[taskId].data[0] = animBattlerId;\n    gTasks[taskId].data[2] = battlerId;\n\n    sBattleAnimScriptPtr++;\n}\n\nstatic void Task_ClearMonBg(u8 taskId)\n{\n    u8 toBG_2;\n    u8 position;\n    \n    gTasks[taskId].data[1]++;\n    if (gTasks[taskId].data[1] != 1)\n    {\n        position = GetBattlerPosition((u8)gTasks[taskId].data[2]);\n        if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT)\n            toBG_2 = FALSE;\n        else\n            toBG_2 = TRUE;\n\n        if (sMonAnimTaskIdArray[0] != TASK_NONE)\n        {\n            ResetBattleAnimBg(toBG_2);\n            DestroyTask(sMonAnimTaskIdArray[0]);\n            sMonAnimTaskIdArray[0] = TASK_NONE;\n        }\n        if (gTasks[taskId].data[0] > 1)\n        {\n            ResetBattleAnimBg(toBG_2 ^ 1);\n            DestroyTask(sMonAnimTaskIdArray[1]);\n            sMonAnimTaskIdArray[1] = TASK_NONE;\n        }\n        DestroyTask(taskId);\n    }\n}\n\n// Equivalent to Cmd_monbg but never creates Task_InitUpdateMonBg / Task_UpdateMonBg\nstatic void Cmd_monbg_static(void)\n{\n    bool8 toBG_2;\n    u8 battlerId;\n    u8 animBattlerId;\n    u8 position;\n\n    sBattleAnimScriptPtr++;\n    animBattlerId = sBattleAnimScriptPtr[0];\n    if (animBattlerId == ANIM_ATTACKER)\n        animBattlerId = ANIM_ATK_PARTNER;\n    else if (animBattlerId == ANIM_TARGET)\n        animBattlerId = ANIM_DEF_PARTNER;\n\n    if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER)\n        battlerId = gBattleAnimAttacker;\n    else\n        battlerId = gBattleAnimTarget;\n\n    if (IsBattlerSpriteVisible(battlerId))\n    {\n        position = GetBattlerPosition(battlerId);\n        if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT)\n            toBG_2 = FALSE;\n        else\n            toBG_2 = TRUE;\n        \n        MoveBattlerSpriteToBG(battlerId, toBG_2);\n        gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE;\n    }\n\n    battlerId ^= BIT_FLANK;\n    if (animBattlerId > ANIM_TARGET && IsBattlerSpriteVisible(battlerId))\n    {\n        position = GetBattlerPosition(battlerId);\n        if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT)\n            toBG_2 = FALSE;\n        else\n            toBG_2 = TRUE;\n\n        MoveBattlerSpriteToBG(battlerId, toBG_2);\n        gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE;\n    }\n\n    sBattleAnimScriptPtr++;\n}\n\nstatic void Cmd_clearmonbg_static(void)\n{\n    u8 animBattlerId;\n    u8 battlerId;\n    u8 taskId;\n\n    sBattleAnimScriptPtr++;\n    animBattlerId = sBattleAnimScriptPtr[0];\n\n    if (animBattlerId == ANIM_ATTACKER)\n        animBattlerId = ANIM_ATK_PARTNER;\n    else if (animBattlerId == ANIM_TARGET)\n        animBattlerId = ANIM_DEF_PARTNER;\n\n    if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER)\n        battlerId = gBattleAnimAttacker;\n    else\n        battlerId = gBattleAnimTarget;\n\n    if (IsBattlerSpriteVisible(battlerId))\n        gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE;\n    if (animBattlerId > ANIM_TARGET && IsBattlerSpriteVisible(battlerId ^ BIT_FLANK))\n        gSprites[gBattlerSpriteIds[battlerId ^ BIT_FLANK]].invisible = FALSE;\n    else\n        animBattlerId = ANIM_ATTACKER;\n\n    taskId = CreateTask(Task_ClearMonBgStatic, 5);\n    gTasks[taskId].data[0] = animBattlerId;\n    gTasks[taskId].data[2] = battlerId;\n\n    sBattleAnimScriptPtr++;\n}\n\nstatic void Task_ClearMonBgStatic(u8 taskId)\n{\n    bool8 to_BG2;\n    u8 position;\n    u8 battlerId;\n    \n    gTasks[taskId].data[1]++;\n    if (gTasks[taskId].data[1] != 1)\n    {\n        bool8 toBG_2;\n        battlerId = gTasks[taskId].data[2];\n        position = GetBattlerPosition(battlerId);\n        if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT)\n            toBG_2 = FALSE;\n        else\n            toBG_2 = TRUE;\n\n        if (IsBattlerSpriteVisible(battlerId))\n            ResetBattleAnimBg(toBG_2);\n        \n        if (gTasks[taskId].data[0] > 1 && IsBattlerSpriteVisible(battlerId ^ BIT_FLANK))\n            ResetBattleAnimBg(toBG_2 ^ 1);\n\n        DestroyTask(taskId);\n    }\n}\n\n#undef t1_MONBG_BATTLER\n#undef t1_MON_IN_BG2\n#undef t1_CREATE_ANOTHER_TASK\n#undef t1_IS_SECONDMON_BG\n\n#undef t2_BATTLER_SPRITE_ID\n#undef t2_MON_IN_BG2\n#undef t2_MONBG_BATTLER\n\nstatic void Cmd_setalpha(void)\n{\n    u16 half1, half2;\n\n    sBattleAnimScriptPtr++;\n    half1 = *(sBattleAnimScriptPtr++);\n    half2 = *(sBattleAnimScriptPtr++) << 8;\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n    SetGpuReg(REG_OFFSET_BLDALPHA, half1 | half2);\n}\n\nstatic void Cmd_setbldcnt(void)\n{\n    u16 half1, half2;\n\n    sBattleAnimScriptPtr++;\n    half1 = *(sBattleAnimScriptPtr++);\n    half2 = *(sBattleAnimScriptPtr++) << 8;\n    SetGpuReg(REG_OFFSET_BLDCNT, half1 | half2);\n}\n\nstatic void Cmd_blendoff(void)\n{\n    sBattleAnimScriptPtr++;\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n}\n\nstatic void Cmd_call(void)\n{\n    sBattleAnimScriptPtr++;\n    sBattleAnimScriptRetAddr = sBattleAnimScriptPtr + 4;\n    sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);\n}\n\nstatic void Cmd_return(void)\n{\n    sBattleAnimScriptPtr = sBattleAnimScriptRetAddr;\n}\n\nstatic void Cmd_setarg(void)\n{\n    const u8 *addr = sBattleAnimScriptPtr;\n    u16 value;\n    u8 argId;\n\n    sBattleAnimScriptPtr++;\n    argId = sBattleAnimScriptPtr[0];\n    sBattleAnimScriptPtr++;\n    value = T1_READ_16(sBattleAnimScriptPtr);\n    sBattleAnimScriptPtr = addr + 4;\n    gBattleAnimArgs[argId] = value;\n}\n\nstatic void Cmd_choosetwoturnanim(void)\n{\n    sBattleAnimScriptPtr++;\n    if (gAnimMoveTurn & 1)\n        sBattleAnimScriptPtr += 4;\n    sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);\n}\n\nstatic void Cmd_jumpifmoveturn(void)\n{\n    u8 toCheck;\n    \n    sBattleAnimScriptPtr++;\n    toCheck = sBattleAnimScriptPtr[0];\n    sBattleAnimScriptPtr++;\n\n    if (toCheck == gAnimMoveTurn)\n        sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);\n    else\n        sBattleAnimScriptPtr += 4;\n}\n\nstatic void Cmd_goto(void)\n{\n    sBattleAnimScriptPtr++;\n    sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);\n}\n\nbool8 IsContest(void)\n{\n    return FALSE;\n}\n\n// Unused\nstatic bool8 IsSpeciesNotUnown(u16 species)\n{\n    if (species == SPECIES_UNOWN)\n        return FALSE;\n    else\n        return TRUE;\n}\n\n#define tBackgroundId   data[0]\n#define tState          data[10]\n\nstatic void Cmd_fadetobg(void)\n{\n    u8 backgroundId;\n    u8 taskId;\n\n    sBattleAnimScriptPtr++;\n    backgroundId = sBattleAnimScriptPtr[0];\n    sBattleAnimScriptPtr++;\n    taskId = CreateTask(Task_FadeToBg, 5);\n    gTasks[taskId].tBackgroundId = backgroundId;\n    sAnimBackgroundFadeState = 1;\n}\n\nstatic void Cmd_fadetobgfromset(void)\n{\n    u8 bg1, bg2, bg3;\n    u8 taskId;\n\n    sBattleAnimScriptPtr++;\n    bg1 = sBattleAnimScriptPtr[0];\n    bg2 = sBattleAnimScriptPtr[1];\n    bg3 = sBattleAnimScriptPtr[2];\n    sBattleAnimScriptPtr += 3;\n    taskId = CreateTask(Task_FadeToBg, 5);\n\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n        gTasks[taskId].tBackgroundId = bg2;\n    else\n        gTasks[taskId].tBackgroundId = bg1;\n\n    sAnimBackgroundFadeState = 1;\n}\n\nstatic void Task_FadeToBg(u8 taskId)\n{\n    if (gTasks[taskId].tState == 0)\n    {\n        BeginHardwarePaletteFade(0xE8, 0, 0, 16, 0);\n        gTasks[taskId].tState++;\n        return;\n    }\n    if (gPaletteFade.active)\n        return;\n    if (gTasks[taskId].tState == 1)\n    {\n        gTasks[taskId].tState++;\n        sAnimBackgroundFadeState = 2;\n    }\n    else if (gTasks[taskId].tState == 2)\n    {\n        s16 bgId = gTasks[taskId].tBackgroundId;\n\n        if (bgId == -1)\n            LoadDefaultBg();\n        else\n            LoadMoveBg(bgId);\n\n        BeginHardwarePaletteFade(0xE8, 0, 16, 0, 1);\n        gTasks[taskId].tState++;\n        return;\n    }\n    if (gPaletteFade.active)\n        return;\n    if (gTasks[taskId].tState == 3)\n    {\n        DestroyTask(taskId);\n        sAnimBackgroundFadeState = 0;\n    }\n}\n\nstatic void LoadMoveBg(u16 bgId)\n{\n    LZDecompressVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)(BG_SCREEN_ADDR(26)));\n    LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(BG_CHAR_ADDR(2)));\n    LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, BG_PLTT_ID(2), PLTT_SIZE_4BPP);\n}\n\nstatic void LoadDefaultBg(void)\n{\n    DrawMainBattleBackground();\n}\n\nstatic void Cmd_restorebg(void)\n{\n    u8 taskId;\n\n    sBattleAnimScriptPtr++;\n    taskId = CreateTask(Task_FadeToBg, 5);\n    gTasks[taskId].tBackgroundId = -1;\n    sAnimBackgroundFadeState = 1;\n}\n\n#undef tBackgroundId\n#undef tState\n\nstatic void Cmd_waitbgfadeout(void)\n{\n    if (sAnimBackgroundFadeState == 2)\n    {\n        sBattleAnimScriptPtr++;\n        sAnimFramesToWait = 0;\n    }\n    else\n    {\n        sAnimFramesToWait = 1;\n    }\n}\n\nstatic void Cmd_waitbgfadein(void)\n{\n    if (sAnimBackgroundFadeState == 0)\n    {\n        sBattleAnimScriptPtr++;\n        sAnimFramesToWait = 0;\n    }\n    else\n    {\n        sAnimFramesToWait = 1;\n    }\n}\n\nstatic void Cmd_changebg(void)\n{\n    sBattleAnimScriptPtr++;\n    LoadMoveBg(sBattleAnimScriptPtr[0]);\n    sBattleAnimScriptPtr++;\n}\n\ns8 BattleAnimAdjustPanning(s8 pan)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gBattleAnimAttacker].statusAnimActive)\n    {\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            pan = SOUND_PAN_TARGET;\n        else\n            pan = SOUND_PAN_ATTACKER;\n    }\n    else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n    {\n        if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n        {\n            if (pan == SOUND_PAN_TARGET)\n                pan = SOUND_PAN_ATTACKER;\n            else if (pan != SOUND_PAN_ATTACKER)\n                pan *= -1;\n        }\n    }\n    else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)\n    {\n        if (pan == SOUND_PAN_ATTACKER)\n            pan = SOUND_PAN_TARGET;\n    }\n    else\n    {\n        pan *= -1;\n    }\n\n    if (pan > SOUND_PAN_TARGET)\n        pan = SOUND_PAN_TARGET;\n    else if (pan < SOUND_PAN_ATTACKER)\n        pan = SOUND_PAN_ATTACKER;\n\n    return pan;\n}\n\ns8 BattleAnimAdjustPanning2(s8 pan)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gBattleAnimAttacker].statusAnimActive)\n    {\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            pan = SOUND_PAN_TARGET;\n        else\n            pan = SOUND_PAN_ATTACKER;\n    }\n    else\n    {\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            pan = -pan;\n    }\n    return pan;\n}\n\ns16 KeepPanInRange(s16 panArg, s32 oldPan)\n{\n    s16 pan = panArg;\n\n    if (pan > SOUND_PAN_TARGET)\n        pan = SOUND_PAN_TARGET;\n    else if (pan < SOUND_PAN_ATTACKER)\n        pan = SOUND_PAN_ATTACKER;\n\n    return pan;\n}\n\ns16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan)\n{\n    s16 ret;\n\n    if (sourcePan < targetPan)\n        ret = ((incrementPan < 0) ? -incrementPan : incrementPan);\n    else if (sourcePan > targetPan)\n        ret = -((incrementPan < 0) ? -incrementPan : incrementPan);\n    else\n        ret = 0;\n\n    return ret;\n}\n\nstatic void Cmd_playsewithpan(void)\n{\n    u16 songId;\n    s8 pan;\n\n    sBattleAnimScriptPtr++;\n    songId = T1_READ_16(sBattleAnimScriptPtr);\n    pan = sBattleAnimScriptPtr[2];\n    PlaySE12WithPanning(songId, BattleAnimAdjustPanning(pan));\n    sBattleAnimScriptPtr += 3;\n}\n\nstatic void Cmd_setpan(void)\n{\n    s8 pan;\n\n    sBattleAnimScriptPtr++;\n    pan = sBattleAnimScriptPtr[0];\n    SE12PanpotControl(BattleAnimAdjustPanning(pan));\n    sBattleAnimScriptPtr++;\n}\n\n#define tInitialPan     data[0]\n#define tTargetPan      data[1]\n#define tIncrementPan   data[2]\n#define tFramesToWait   data[3]\n#define tCurrentPan     data[4]\n#define tFrameCounter   data[8]\n\nstatic void Cmd_panse(void)\n{\n    u16 songNum;\n    s8 currentPanArg, incrementPan, incrementPanArg, currentPan, targetPan;\n    u8 framesToWait;\n    u8 taskId;\n\n    sBattleAnimScriptPtr++;\n    songNum = T1_READ_16(sBattleAnimScriptPtr);\n    currentPanArg = sBattleAnimScriptPtr[2];\n    incrementPan = sBattleAnimScriptPtr[3];\n    incrementPanArg = sBattleAnimScriptPtr[4];\n    framesToWait = sBattleAnimScriptPtr[5];\n\n    currentPan = BattleAnimAdjustPanning(currentPanArg);\n    targetPan = BattleAnimAdjustPanning(incrementPan);\n    incrementPan = CalculatePanIncrement(currentPan, targetPan, incrementPanArg);\n    taskId = CreateTask(Task_PanFromInitialToTarget, 1);\n    gTasks[taskId].tInitialPan = currentPan;\n    gTasks[taskId].tTargetPan = targetPan;\n    gTasks[taskId].tIncrementPan = incrementPan;\n    gTasks[taskId].tFramesToWait = framesToWait;\n    gTasks[taskId].tCurrentPan = currentPan;\n\n    PlaySE12WithPanning(songNum, currentPan);\n\n    gAnimSoundTaskCount++;\n    sBattleAnimScriptPtr += 6;\n}\n\nstatic void Task_PanFromInitialToTarget(u8 taskId)\n{\n    bool32 destroyTask = FALSE;\n    if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait)\n    {\n        s16 pan;\n        s16 initialPanning, targetPanning, currentPan, incrementPan;\n\n        gTasks[taskId].tFrameCounter = 0;\n        initialPanning = gTasks[taskId].tInitialPan;\n        targetPanning = gTasks[taskId].tTargetPan;\n        currentPan = gTasks[taskId].tCurrentPan;\n        incrementPan = gTasks[taskId].tIncrementPan;\n        pan = currentPan + incrementPan;\n        gTasks[taskId].tCurrentPan = pan;\n\n        if (incrementPan == 0)\n        {\n            destroyTask = TRUE;\n        }\n        else if (initialPanning < targetPanning)\n        {\n            if (pan >= targetPanning)\n                destroyTask = TRUE;\n        }\n        else // Panning decreasing.\n        {\n            if (pan <= targetPanning)\n                destroyTask = TRUE;\n        }\n\n        if (destroyTask)\n        {\n            pan = targetPanning;\n            DestroyTask(taskId);\n            gAnimSoundTaskCount--;\n        }\n\n        SE12PanpotControl(pan);\n    }\n}\n\nstatic void Cmd_panse_adjustnone(void)\n{\n    u16 songId;\n    s8 currentPan, targetPan, incrementPan;\n    u8 framesToWait;\n    u8 taskId;\n\n    sBattleAnimScriptPtr++;\n    songId = T1_READ_16(sBattleAnimScriptPtr);\n    currentPan = sBattleAnimScriptPtr[2];\n    targetPan = sBattleAnimScriptPtr[3];\n    incrementPan = sBattleAnimScriptPtr[4];\n    framesToWait = sBattleAnimScriptPtr[5];\n\n    taskId = CreateTask(Task_PanFromInitialToTarget, 1);\n    gTasks[taskId].tInitialPan = currentPan;\n    gTasks[taskId].tTargetPan = targetPan;\n    gTasks[taskId].tIncrementPan = incrementPan;\n    gTasks[taskId].tFramesToWait = framesToWait;\n    gTasks[taskId].tCurrentPan = currentPan;\n\n    PlaySE12WithPanning(songId, currentPan);\n\n    gAnimSoundTaskCount++;\n    sBattleAnimScriptPtr += 6;\n}\n\nstatic void Cmd_panse_adjustall(void)\n{\n    u16 songId;\n    s8 targetPanArg, incrementPanArg, currentPanArg, currentPan, targetPan, incrementPan;\n    u8 framesToWait;\n    u8 taskId;\n\n    sBattleAnimScriptPtr++;\n    songId = T1_READ_16(sBattleAnimScriptPtr);\n    currentPanArg = sBattleAnimScriptPtr[2];\n    targetPanArg = sBattleAnimScriptPtr[3];\n    incrementPanArg = sBattleAnimScriptPtr[4];\n    framesToWait = sBattleAnimScriptPtr[5];\n\n    currentPan = BattleAnimAdjustPanning2(currentPanArg);\n    targetPan = BattleAnimAdjustPanning2(targetPanArg);\n    incrementPan = BattleAnimAdjustPanning2(incrementPanArg);\n\n    taskId = CreateTask(Task_PanFromInitialToTarget, 1);\n    gTasks[taskId].tInitialPan = currentPan;\n    gTasks[taskId].tTargetPan = targetPan;\n    gTasks[taskId].tIncrementPan = incrementPan;\n    gTasks[taskId].tFramesToWait = framesToWait;\n    gTasks[taskId].tCurrentPan = currentPan;\n\n    PlaySE12WithPanning(songId, currentPan);\n\n    gAnimSoundTaskCount++;\n    sBattleAnimScriptPtr += 6;\n}\n\n#undef tInitialPan\n#undef tTargetPan\n#undef tIncrementPan\n#undef tFramesToWait\n#undef tCurrentPan\n#undef tFrameCounter\n\n#define tSongId         data[0]\n#define tPanning        data[1]\n#define tFramesToWait   data[2]\n#define tNumberOfPlays  data[3]\n#define tFrameCounter   data[8]\n\nstatic void Cmd_loopsewithpan(void)\n{\n    u16 songId;\n    s8 panningArg, panning;\n    u8 framesToWait, numberOfPlays;\n    u8 taskId;\n\n    sBattleAnimScriptPtr++;\n    songId = T1_READ_16(sBattleAnimScriptPtr);\n    panningArg = sBattleAnimScriptPtr[2];\n    framesToWait = sBattleAnimScriptPtr[3];\n    numberOfPlays = sBattleAnimScriptPtr[4];\n    panning = BattleAnimAdjustPanning(panningArg);\n\n    taskId = CreateTask(Task_LoopAndPlaySE, 1);\n    gTasks[taskId].tSongId = songId;\n    gTasks[taskId].tPanning = panning;\n    gTasks[taskId].tFramesToWait = framesToWait;\n    gTasks[taskId].tNumberOfPlays = numberOfPlays;\n    gTasks[taskId].tFrameCounter = framesToWait;\n    gTasks[taskId].func(taskId);\n\n    gAnimSoundTaskCount++;\n    sBattleAnimScriptPtr += 5;\n}\n\nstatic void Task_LoopAndPlaySE(u8 taskId)\n{\n    if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait)\n    {\n        u16 songId;\n        s8 panning;\n        u8 numberOfPlays;\n\n        gTasks[taskId].tFrameCounter = 0;\n        songId = gTasks[taskId].tSongId;\n        panning = gTasks[taskId].tPanning;\n        numberOfPlays = --gTasks[taskId].tNumberOfPlays;\n        PlaySE12WithPanning(songId, panning);\n        if (numberOfPlays == 0)\n        {\n            DestroyTask(taskId);\n            gAnimSoundTaskCount--;\n        }\n    }\n}\n\n#undef tSongId\n#undef tPanning\n#undef tFramesToWait\n#undef tNumberOfPlays\n#undef tFrameCounter\n\n#define tSongId         data[0]\n#define tPanning        data[1]\n#define tFramesToWait   data[2]\n\nstatic void Cmd_waitplaysewithpan(void)\n{\n    u16 songId;\n    s8 panningArg, panning;\n    u8 framesToWait;\n    u8 taskId;\n\n    sBattleAnimScriptPtr++;\n    songId = T1_READ_16(sBattleAnimScriptPtr);\n    panningArg = sBattleAnimScriptPtr[2];\n    framesToWait = sBattleAnimScriptPtr[3];\n    panning = BattleAnimAdjustPanning(panningArg);\n\n    taskId = CreateTask(Task_WaitAndPlaySE, 1);\n    gTasks[taskId].tSongId = songId;\n    gTasks[taskId].tPanning = panning;\n    gTasks[taskId].tFramesToWait = framesToWait;\n\n    gAnimSoundTaskCount++;\n    sBattleAnimScriptPtr += 4;\n}\n\nstatic void Task_WaitAndPlaySE(u8 taskId)\n{\n    if (gTasks[taskId].tFramesToWait-- <= 0)\n    {\n        PlaySE12WithPanning(gTasks[taskId].tSongId, gTasks[taskId].tPanning);\n        DestroyTask(taskId);\n        gAnimSoundTaskCount--;\n    }\n}\n\n#undef tSongId\n#undef tPanning\n#undef tFramesToWait\n\nstatic void Cmd_createsoundtask(void)\n{\n    TaskFunc func;\n    u8 numArgs, taskId;\n    s32 i;\n\n    sBattleAnimScriptPtr++;\n    func = (TaskFunc)T2_READ_32(sBattleAnimScriptPtr);\n    sBattleAnimScriptPtr += 4;\n    numArgs = sBattleAnimScriptPtr[0];\n    sBattleAnimScriptPtr++;\n    for (i = 0; i < numArgs; i++)\n    {\n        gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr);\n        sBattleAnimScriptPtr += 2;\n    }\n    taskId = CreateTask(func, 1);\n    func(taskId);\n    gAnimSoundTaskCount++;\n}\n\nstatic void Cmd_waitsound(void)\n{\n    if (gAnimSoundTaskCount != 0)\n    {\n        sSoundAnimFramesToWait = 0;\n        sAnimFramesToWait = 1;\n    }\n    else if (IsSEPlaying())\n    {\n        if (++sSoundAnimFramesToWait > 90)\n        {\n            m4aMPlayStop(&gMPlayInfo_SE1);\n            m4aMPlayStop(&gMPlayInfo_SE2);\n            sSoundAnimFramesToWait = 0;\n        }\n        else\n        {\n            sAnimFramesToWait = 1;\n        }\n    }\n    else\n    {\n        sSoundAnimFramesToWait = 0;\n        sBattleAnimScriptPtr++;\n        sAnimFramesToWait = 0;\n    }\n}\n\nstatic void Cmd_jumpargeq(void)\n{\n    u8 argId;\n    s16 valueToCheck;\n\n    sBattleAnimScriptPtr++;\n    argId = sBattleAnimScriptPtr[0];\n    valueToCheck = T1_READ_16(sBattleAnimScriptPtr + 1);\n\n    if (valueToCheck == gBattleAnimArgs[argId])\n        sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr + 3);\n    else\n        sBattleAnimScriptPtr += 7;\n}\n\nstatic void Cmd_jumpifcontest(void)\n{\n    sBattleAnimScriptPtr += 5;\n}\n\nstatic void Cmd_splitbgprio(void)\n{\n    u8 wantedBattler;\n    u8 battlerId;\n    u8 battlerPosition;\n\n    wantedBattler = sBattleAnimScriptPtr[1];\n    sBattleAnimScriptPtr += 2;\n\n    if (wantedBattler != ANIM_ATTACKER)\n        battlerId = gBattleAnimTarget;\n    else\n        battlerId = gBattleAnimAttacker;\n\n    // Apply only if the given battler is the lead (on left from team's perspective)\n    battlerPosition = GetBattlerPosition(battlerId);\n    if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_OPPONENT_RIGHT)\n    {\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n        SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);\n    }\n}\n\nstatic void Cmd_splitbgprio_all(void)\n{\n    sBattleAnimScriptPtr++;\n    SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n    SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);\n}\n\nstatic void Cmd_splitbgprio_foes(void)\n{\n    u8 wantedBattler;\n    u8 battlerPosition;\n    u8 battlerId;\n\n    wantedBattler = sBattleAnimScriptPtr[1];\n    sBattleAnimScriptPtr += 2;\n\n    // Apply only if the attacking the opposing side\n    if (GetBattlerSide(gBattleAnimAttacker) != GetBattlerSide(gBattleAnimTarget))\n    {\n        if (wantedBattler != ANIM_ATTACKER)\n            battlerId = gBattleAnimTarget;\n        else\n            battlerId = gBattleAnimAttacker;\n\n        // Apply only if the given battler is the lead (on left from team's perspective)\n        battlerPosition = GetBattlerPosition(battlerId);\n        if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_OPPONENT_RIGHT)\n        {\n            SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n            SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);\n        }\n    }\n}\n\nstatic void Cmd_invisible(void)\n{\n    u8 spriteId;\n\n    spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]);\n    if (spriteId != SPRITE_NONE)\n        gSprites[spriteId].invisible = TRUE;\n\n    sBattleAnimScriptPtr += 2;\n}\n\nstatic void Cmd_visible(void)\n{\n    u8 spriteId;\n\n    spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]);\n    if (spriteId != SPRITE_NONE)\n        gSprites[spriteId].invisible = FALSE;\n\n    sBattleAnimScriptPtr += 2;\n}\n\n// Below two commands are never used\nstatic void Cmd_teamattack_moveback(void)\n{\n    u8 wantedBattler;\n    u8 priority;\n    u8 spriteId;\n\n    wantedBattler = sBattleAnimScriptPtr[1];\n    sBattleAnimScriptPtr += 2;\n\n    // Apply to double battles when attacking own side\n    if (IsDoubleBattle()\n     && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))\n    {\n        if (wantedBattler == ANIM_ATTACKER)\n        {\n            priority = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);\n            spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n        }\n        else\n        {\n            priority = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);\n            spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);\n        }\n        if (spriteId != SPRITE_NONE)\n        {\n            gSprites[spriteId].invisible = FALSE;\n            if (priority == 2)\n                gSprites[spriteId].oam.priority = 3;\n\n            if (priority == 1)\n                ResetBattleAnimBg(FALSE);\n            else\n                ResetBattleAnimBg(TRUE);\n        }\n    }\n}\n\nstatic void Cmd_teamattack_movefwd(void)\n{\n    u8 wantedBattler;\n    u8 priority;\n    u8 spriteId;\n\n    wantedBattler = sBattleAnimScriptPtr[1];\n    sBattleAnimScriptPtr += 2;\n\n    // Apply to double battles when attacking own side\n    if (IsDoubleBattle()\n     && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))\n    {\n        if (wantedBattler == ANIM_ATTACKER)\n        {\n            priority = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);\n            spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n        }\n        else\n        {\n            priority = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);\n            spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);\n        }\n\n        if (spriteId != SPRITE_NONE && priority == 2)\n            gSprites[spriteId].oam.priority = 2;\n    }\n}\n\nstatic void Cmd_stopsound(void)\n{\n    m4aMPlayStop(&gMPlayInfo_SE1);\n    m4aMPlayStop(&gMPlayInfo_SE2);\n    sBattleAnimScriptPtr++;\n}\n"
  },
  {
    "path": "src/battle_anim_bug.c",
    "content": "#include \"global.h\"\n#include \"battle_anim.h\"\n#include \"gpu_regs.h\"\n#include \"trig.h\"\n\nstatic void AnimMegahornHorn(struct Sprite *sprite);\nstatic void AnimLeechLifeNeedle(struct Sprite *sprite);\nstatic void AnimTranslateWebThread(struct Sprite *sprite);\nstatic void AnimTranslateWebThread_Step(struct Sprite *sprite);\nstatic void AnimStringWrap(struct Sprite *sprite);\nstatic void AnimStringWrap_Step(struct Sprite *sprite);\nstatic void AnimSpiderWeb(struct Sprite *sprite);\nstatic void AnimSpiderWeb_Step(struct Sprite *sprite);\nstatic void AnimSpiderWeb_End(struct Sprite *sprite);\nstatic void AnimTranslateStinger(struct Sprite *sprite);\nstatic void AnimMissileArc(struct Sprite *sprite);\nstatic void AnimMissileArc_Step(struct Sprite *sprite);\nstatic void AnimTailGlowOrb(struct Sprite *sprite);\n\nstatic const union AffineAnimCmd sAffineAnim_MegahornHorn_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 30, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_MegahornHorn_1[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, -99, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_MegahornHorn_2[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 94, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_MegahornHorn[] =\n{\n    sAffineAnim_MegahornHorn_0,\n    sAffineAnim_MegahornHorn_1,\n    sAffineAnim_MegahornHorn_2,\n};\n\nconst struct SpriteTemplate gMegahornHornSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HORN_HIT_2,\n    .paletteTag = ANIM_TAG_HORN_HIT_2,\n    .oam = &gOamData_AffineDouble_ObjNormal_32x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_MegahornHorn,\n    .callback = AnimMegahornHorn,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_LeechLifeNeedle_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -33, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_LeechLifeNeedle_1[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 96, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_LeechLifeNeedle_2[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -96, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_LeechLifeNeedle[] =\n{\n    sAffineAnim_LeechLifeNeedle_0,\n    sAffineAnim_LeechLifeNeedle_1,\n    sAffineAnim_LeechLifeNeedle_2,\n};\n\nconst struct SpriteTemplate gLeechLifeNeedleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_NEEDLE,\n    .paletteTag = ANIM_TAG_NEEDLE,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_LeechLifeNeedle,\n    .callback = AnimLeechLifeNeedle,\n};\n\nconst struct SpriteTemplate gWebThreadSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WEB_THREAD,\n    .paletteTag = ANIM_TAG_WEB_THREAD,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimTranslateWebThread,\n};\n\nconst struct SpriteTemplate gStringWrapSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_STRING,\n    .paletteTag = ANIM_TAG_STRING,\n    .oam = &gOamData_AffineOff_ObjNormal_64x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimStringWrap,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_SpiderWeb[] =\n{\n    AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),\n    AFFINEANIMCMD_FRAME(0x6, 0x6, 0, 1),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_SpiderWeb[] =\n{\n    sAffineAnim_SpiderWeb,\n};\n\nconst struct SpriteTemplate gSpiderWebSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPIDER_WEB,\n    .paletteTag = ANIM_TAG_SPIDER_WEB,\n    .oam = &gOamData_AffineDouble_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_SpiderWeb,\n    .callback = AnimSpiderWeb,\n};\n\nconst struct SpriteTemplate gLinearStingerSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_NEEDLE,\n    .paletteTag = ANIM_TAG_NEEDLE,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimTranslateStinger,\n};\n\nconst struct SpriteTemplate gPinMissileSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_NEEDLE,\n    .paletteTag = ANIM_TAG_NEEDLE,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMissileArc,\n};\n\nconst struct SpriteTemplate gIcicleSpearSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICICLE_SPEAR,\n    .paletteTag = ANIM_TAG_ICICLE_SPEAR,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMissileArc,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_TailGlowOrb[] =\n{\n    AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),\n    AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 18),\n    AFFINEANIMCMD_LOOP(0),\n    AFFINEANIMCMD_FRAME(-0x5, -0x5, 0, 8),\n    AFFINEANIMCMD_FRAME(0x5, 0x5, 0, 8),\n    AFFINEANIMCMD_LOOP(5),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_TailGlowOrb[] =\n{\n    sAffineAnim_TailGlowOrb,\n};\n\nconst struct SpriteTemplate gTailGlowOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .oam = &gOamData_AffineNormal_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_TailGlowOrb,\n    .callback = AnimTailGlowOrb,\n};\n\nstatic void AnimMegahornHorn(struct Sprite *sprite)\n{\n    if (IsContest())\n    {\n        StartSpriteAffineAnim(sprite, 2);\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n        gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n    }\n    else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n    {\n        StartSpriteAffineAnim(sprite, 1);\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n        gBattleAnimArgs[3] = -gBattleAnimArgs[3];\n        gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n    }\n    sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0];\n    sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nstatic void AnimLeechLifeNeedle(struct Sprite *sprite)\n{\n    if (IsContest())\n    {\n        gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n        StartSpriteAffineAnim(sprite, 2);\n    }\n    else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n    {\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n        gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n    }\n    sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0];\n    sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Creates a single web thread that travels from attacker to target.\n// Used by MOVE_STRING_SHOT and MOVE_SPIDER_WEB in their first move phase.\n// arg 0: x\n// arg 1: y\n// arg 2: controls the left-to-right movement\n// arg 3: amplitude\n// arg 4: if targets both opponents\nstatic void AnimTranslateWebThread(struct Sprite *sprite)\n{\n    if (IsContest())\n        gBattleAnimArgs[2] /= 2;\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = sprite->x;\n    sprite->data[3] = sprite->y;\n    if (!gBattleAnimArgs[4])\n    {\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n    else\n    {\n        SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);\n    }\n    InitAnimLinearTranslationWithSpeed(sprite);\n    sprite->data[5] = gBattleAnimArgs[3];\n    sprite->callback = AnimTranslateWebThread_Step;\n}\n\nstatic void AnimTranslateWebThread_Step(struct Sprite *sprite)\n{\n    if (AnimTranslateLinear(sprite))\n    {\n        DestroyAnimSprite(sprite);\n        return;\n    }\n    sprite->x2 += Sin(sprite->data[6], sprite->data[5]);\n    sprite->data[6] = (sprite->data[6] + 13) & 0xFF;\n}\n\nstatic void AnimStringWrap(struct Sprite *sprite)\n{\n    SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->x, &sprite->y);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->x -= gBattleAnimArgs[0];\n    else\n        sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n        sprite->y += 8;\n    sprite->callback = AnimStringWrap_Step;\n}\n\nstatic void AnimStringWrap_Step(struct Sprite *sprite)\n{\n    if (++sprite->data[0] == 3)\n    {\n        sprite->data[0] = 0;\n        sprite->invisible ^= 1;\n    }\n    if (++sprite->data[1] == 51)\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimSpiderWeb(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));\n    sprite->data[0] = 16;\n    sprite->callback = AnimSpiderWeb_Step;\n}\n\nstatic void AnimSpiderWeb_Step(struct Sprite *sprite)\n{\n    if (sprite->data[2] < 20)\n    {\n        ++sprite->data[2];\n    }\n    else if (sprite->data[1]++ & 1)\n    {\n        --sprite->data[0];\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0]));\n\n        if (sprite->data[0] == 0)\n        {\n            sprite->invisible = TRUE;\n            sprite->callback = AnimSpiderWeb_End;\n        }\n    }\n}\n\nstatic void AnimSpiderWeb_End(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    DestroyAnimSprite(sprite);\n}\n\n// Translates a stinger sprite linearly to a destination location. The sprite is\n// initially rotated so that it appears to be traveling in a straight line.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: target x pixel offset\n// arg 3: target y pixel offset\n// arg 4: duration\nstatic void AnimTranslateStinger(struct Sprite *sprite)\n{\n    s16 lVarX, lVarY;\n    u16 rot;\n\n    if (IsContest())\n    {\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    }\n    else if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n        gBattleAnimArgs[3] = -gBattleAnimArgs[3];\n    }\n    if (!IsContest() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))\n    {\n        if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT\n         || GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT)\n        {\n            s16 temp1, temp2;\n\n            temp1 = gBattleAnimArgs[2];\n            gBattleAnimArgs[2] = -temp1;\n\n            temp2 = gBattleAnimArgs[0];\n            gBattleAnimArgs[0] = -temp2;\n        }\n    }\n    InitSpritePosToAnimAttacker(sprite, 1);\n    lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];\n    lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    rot = ArcTan2Neg(lVarX - sprite->x, lVarY - sprite->y);\n    rot += 0xC000;\n    TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rot);\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = lVarX;\n    sprite->data[4] = lVarY;\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Rotates sprite and moves it in an arc, so that it appears like a missle or arrow traveling.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: target x pixel offset\n// arg 3: target y pixel offset\n// arg 4: duration\n// arg 5: wave amplitude\nstatic void AnimMissileArc(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, 1);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    sprite->data[5] = gBattleAnimArgs[5];\n    InitAnimArcTranslation(sprite);\n    sprite->callback = AnimMissileArc_Step;\n    sprite->invisible = TRUE;\n}\n\nstatic void AnimMissileArc_Step(struct Sprite *sprite)\n{\n    sprite->invisible = FALSE;\n\n    if (TranslateAnimHorizontalArc(sprite))\n    {\n        DestroyAnimSprite(sprite);\n    }\n    else\n    {\n        s16 tempData[8];\n        u16 *data = sprite->data;\n        u16 x1 = sprite->x;\n        s16 x2 = sprite->x2;\n        u16 y1 = sprite->y;\n        s16 y2 = sprite->y2;\n        s32 i;\n\n        for (i = 0; i < 8; ++i)\n            tempData[i] = data[i];\n        x2 += x1;\n        y2 += y1;\n        if (!TranslateAnimHorizontalArc(sprite))\n        {\n            u16 rotation = ArcTan2Neg(sprite->x + sprite->x2 - x2,\n                                      sprite->y + sprite->y2 - y2);\n\n            rotation += 0xC000;\n            TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rotation);\n            for (i = 0; i < 8; ++i)\n                data[i] = tempData[i];\n        }\n    }\n}\n\nstatic void AnimTailGlowOrb(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + 18;\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + 18;\n    }\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n}\n"
  },
  {
    "path": "src/battle_anim_dark.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"graphics.h\"\n#include \"scanline_effect.h\"\n#include \"trig.h\"\n#include \"util.h\"\n\nstatic void AnimUnusedBagSteal(struct Sprite *sprite);\nstatic void AnimUnusedBagSteal_Step(struct Sprite *sprite);\nstatic void AnimBite(struct Sprite *sprite);\nstatic void AnimTearDrop(struct Sprite *sprite);\nstatic void AnimClawSlash(struct Sprite *sprite);\nstatic void AnimTask_AttackerFadeToInvisible_Step(u8 taskId);\nstatic void AnimTask_AttackerFadeFromInvisible_Step(u8 taskId);\nstatic void AnimBite_Step1(struct Sprite *sprite);\nstatic void AnimBite_Step2(struct Sprite *sprite);\nstatic void AnimTearDrop_Step(struct Sprite *sprite);\nstatic void SetAllBattlersSpritePriority(u8 priority);\nstatic void AnimTask_MoveAttackerMementoShadow_Step(u8 taskId);\nstatic void DoMementoShadowEffect(struct Task *task);\nstatic void AnimTask_MoveTargetMementoShadow_Step(u8 taskId);\nstatic void AnimTask_MetallicShine_Step(u8 taskId);\n\n// Unused\nconst struct SpriteTemplate sUnusedBagStealSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_TIED_BAG,\n    .paletteTag = ANIM_TAG_TIED_BAG,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimUnusedBagSteal,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Bite_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Bite_1[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 32, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Bite_2[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 64, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Bite_3[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 96, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Bite_4[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -128, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Bite_5[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -96, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Bite_6[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -64, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Bite_7[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -32, 1),\n    AFFINEANIMCMD_END,\n};\n\nconst union AffineAnimCmd *const gAffineAnims_Bite[] =\n{\n    sAffineAnim_Bite_0,\n    sAffineAnim_Bite_1,\n    sAffineAnim_Bite_2,\n    sAffineAnim_Bite_3,\n    sAffineAnim_Bite_4,\n    sAffineAnim_Bite_5,\n    sAffineAnim_Bite_6,\n    sAffineAnim_Bite_7,\n};\n\nconst struct SpriteTemplate gSharpTeethSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SHARP_TEETH,\n    .paletteTag = ANIM_TAG_SHARP_TEETH,\n    .oam = &gOamData_AffineNormal_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gAffineAnims_Bite,\n    .callback = AnimBite,\n};\n\nconst struct SpriteTemplate gClampJawSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CLAMP,\n    .paletteTag = ANIM_TAG_CLAMP,\n    .oam = &gOamData_AffineNormal_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gAffineAnims_Bite,\n    .callback = AnimBite,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_TearDrop_0[] =\n{\n    AFFINEANIMCMD_FRAME(0xC0, 0xC0, 80, 0),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -2, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_TearDrop_1[] =\n{\n    AFFINEANIMCMD_FRAME(0xC0, 0xC0, -80, 0),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 2, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_TearDrop[] =\n{\n    sAffineAnim_TearDrop_0,\n    sAffineAnim_TearDrop_1,\n};\n\nconst struct SpriteTemplate gTearDropSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_BUBBLES,\n    .paletteTag = ANIM_TAG_SMALL_BUBBLES,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_TearDrop,\n    .callback = AnimTearDrop,\n};\n\nstatic const union AnimCmd sAnim_ClawSlash_0[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(48, 4),\n    ANIMCMD_FRAME(64, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_ClawSlash_1[] =\n{\n    ANIMCMD_FRAME(0, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(48, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(64, 4, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_ClawSlash[] =\n{\n    sAnim_ClawSlash_0,\n    sAnim_ClawSlash_1,\n};\n\nconst struct SpriteTemplate gClawSlashSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CLAW_SLASH,\n    .paletteTag = ANIM_TAG_CLAW_SLASH,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_ClawSlash,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimClawSlash,\n};\n\nvoid AnimTask_AttackerFadeToInvisible(u8 taskId)\n{\n    s32 battler;\n\n    gTasks[taskId].data[0] = gBattleAnimArgs[0];\n    battler = gBattleAnimAttacker;\n    gTasks[taskId].data[1] = 16;\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));\n    if (GetBattlerSpriteBGPriorityRank(battler) == 1)\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);\n    else\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);\n    gTasks[taskId].func = AnimTask_AttackerFadeToInvisible_Step;\n}\n\nstatic void AnimTask_AttackerFadeToInvisible_Step(u8 taskId)\n{\n    u8 blendA = gTasks[taskId].data[1] >> 8;\n    u8 blendB = gTasks[taskId].data[1];\n\n    if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0])\n    {\n        ++blendA;\n        --blendB;\n        gTasks[taskId].data[1] = BLDALPHA_BLEND(blendB, blendA);\n        SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]);\n        gTasks[taskId].data[2] = 0;\n        if (blendA == 16)\n        {\n            gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = TRUE;\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n    else\n    {\n        ++gTasks[taskId].data[2];\n    }\n}\n\nvoid AnimTask_AttackerFadeFromInvisible(u8 taskId)\n{\n    gTasks[taskId].data[0] = gBattleAnimArgs[0];\n    gTasks[taskId].data[1] = BLDALPHA_BLEND(0, 16);\n    gTasks[taskId].func = AnimTask_AttackerFadeFromInvisible_Step;\n    SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]);\n}\n\nstatic void AnimTask_AttackerFadeFromInvisible_Step(u8 taskId)\n{\n    u8 blendA = gTasks[taskId].data[1] >> 8;\n    u8 blendB = gTasks[taskId].data[1];\n\n    if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0])\n    {\n        --blendA;\n        ++blendB;\n        gTasks[taskId].data[1] = (blendA << 8) | blendB;\n        SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]);\n        gTasks[taskId].data[2] = 0;\n        if (blendA == 0)\n        {\n            SetGpuReg(REG_OFFSET_BLDCNT, 0);\n            SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n    else\n    {\n        ++gTasks[taskId].data[2];\n    }\n}\n\nvoid AnimTask_InitAttackerFadeFromInvisible(u8 taskId)\n{\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);\n    else\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);\n    DestroyAnimVisualTask(taskId);\n}\n\nstatic void AnimUnusedBagSteal(struct Sprite *sprite)\n{\n    sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->data[3] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[0] = 0x7E;\n    InitSpriteDataForLinearTranslation(sprite);\n    sprite->data[3] = -sprite->data[1];\n    sprite->data[4] = -sprite->data[2];\n    sprite->data[6] = 0xFFD8;\n    sprite->callback = AnimUnusedBagSteal_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimUnusedBagSteal_Step(struct Sprite *sprite)\n{\n    sprite->data[3] += sprite->data[1];\n    sprite->data[4] += sprite->data[2];\n    sprite->x2 = sprite->data[3] >> 8;\n    sprite->y2 = sprite->data[4] >> 8;\n    if (sprite->data[7] == 0)\n    {\n        sprite->data[3] += sprite->data[1];\n        sprite->data[4] += sprite->data[2];\n        sprite->x2 = sprite->data[3] >> 8;\n        sprite->y2 = sprite->data[4] >> 8;\n        --sprite->data[0];\n    }\n    sprite->y2 += Sin(sprite->data[5], sprite->data[6]);\n    sprite->data[5] = (sprite->data[5] + 3) & 0xFF;\n    if (sprite->data[5] > 0x7F)\n    {\n        sprite->data[5] = 0;\n        sprite->data[6] += 20;\n        ++sprite->data[7];\n    }\n    if (--sprite->data[0] == 0)\n        DestroyAnimSprite(sprite);\n}\n\n// Move sprite inward for Bite/Crunch and Clamp\nstatic void AnimBite(struct Sprite *sprite)\n{\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]);\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->data[1] = gBattleAnimArgs[4];\n    sprite->data[2] = gBattleAnimArgs[5];\n    sprite->callback = AnimBite_Step1;\n}\n\nstatic void AnimBite_Step1(struct Sprite *sprite)\n{\n    sprite->data[4] += sprite->data[0];\n    sprite->data[5] += sprite->data[1];\n    sprite->x2 = sprite->data[4] >> 8;\n    sprite->y2 = sprite->data[5] >> 8;\n    if (++sprite->data[3] == sprite->data[2])\n        sprite->callback = AnimBite_Step2;\n}\n\nstatic void AnimBite_Step2(struct Sprite *sprite)\n{\n    sprite->data[4] -= sprite->data[0];\n    sprite->data[5] -= sprite->data[1];\n    sprite->x2 = sprite->data[4] >> 8;\n    sprite->y2 = sprite->data[5] >> 8;\n    if (--sprite->data[3] == 0)\n        DestroySpriteAndMatrix(sprite);\n}\n\n// Launches a tear drop away from the battler. Used by Fake Tears\nstatic void AnimTearDrop(struct Sprite *sprite)\n{\n    u8 battler;\n    s8 xOffset;\n\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n    xOffset = 20;\n    sprite->oam.tileNum += 4;\n    switch (gBattleAnimArgs[1])\n    {\n    case 0:\n        sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 8;\n        sprite->y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 8;\n        break;\n    case 1:\n        sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 14;\n        sprite->y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 16;\n        break;\n    case 2:\n        sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) + 8;\n        sprite->y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 8;\n        StartSpriteAffineAnim(sprite, 1);\n        xOffset = -20;\n        break;\n    case 3:\n        sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) + 14;\n        sprite->y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 16;\n        StartSpriteAffineAnim(sprite, 1);\n        xOffset = -20;\n        break;\n    }\n    sprite->data[0] = 32;\n    sprite->data[2] = sprite->x + xOffset;\n    sprite->data[4] = sprite->y + 12;\n    sprite->data[5] = -12;\n    InitAnimArcTranslation(sprite);\n    sprite->callback = AnimTearDrop_Step;\n}\n\nstatic void AnimTearDrop_Step(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n        DestroySpriteAndMatrix(sprite);\n}\n\nvoid AnimTask_MoveAttackerMementoShadow(u8 taskId)\n{\n    struct ScanlineEffectParams scanlineParams;\n    struct BattleAnimBgData animBg;\n    u32 i;\n    u8 pos;\n    s32 var0;\n    struct Task *task = &gTasks[taskId];\n\n    task->data[7] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 31;\n    task->data[6] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) - 7;\n    task->data[5] = task->data[7];\n    task->data[4] = task->data[6];\n    task->data[13] = (task->data[7] - task->data[6]) << 8;\n    pos = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n    task->data[14] = pos - 32;\n    task->data[15] = pos + 32;\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        task->data[8] = -12;\n    else\n        task->data[8] = -64;\n    task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);\n    if (task->data[3] == 1)\n    {\n        GetBattleAnimBg1Data(&animBg);\n        task->data[10] = gBattle_BG1_Y;\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);\n        FillPalette(RGB_BLACK, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n        scanlineParams.dmaDest = &REG_BG1VOFS;\n        var0 = WINOUT_WIN01_BG1;\n        if (!IsContest())\n            gBattle_BG2_X += DISPLAY_WIDTH;\n    }\n    else\n    {\n        task->data[10] = gBattle_BG2_Y;\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);\n        FillPalette(RGB_BLACK, BG_PLTT_ID(9), PLTT_SIZE_4BPP);\n        scanlineParams.dmaDest = &REG_BG2VOFS;\n        var0 = WINOUT_WIN01_BG2;\n        if (!IsContest())\n            gBattle_BG1_X += DISPLAY_WIDTH;\n    }\n    scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;\n    scanlineParams.initState = 1;\n    scanlineParams.unused9 = 0;\n    task->data[11] = 0;\n    task->data[12] = 16;\n    task->data[0] = 0;\n    task->data[1] = 0;\n    task->data[2] = 0;\n    SetAllBattlersSpritePriority(3);\n    for (i = 0; i < 112; ++i)\n    {\n        gScanlineEffectRegBuffers[0][i] = task->data[10];\n        gScanlineEffectRegBuffers[1][i] = task->data[10];\n    }\n    ScanlineEffect_SetParams(scanlineParams);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | (var0 ^ (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR)));\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n    gBattle_WIN0H = (task->data[14] << 8) | task->data[15];\n    gBattle_WIN0V = DISPLAY_HEIGHT;\n\n    task->func = AnimTask_MoveAttackerMementoShadow_Step;\n}\n\nstatic void AnimTask_MoveAttackerMementoShadow_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        if (++task->data[1] > 1)\n        {\n            task->data[1] = 0;\n            if (++task->data[2] & 1)\n            {\n                if (task->data[11] != 12)\n                    ++task->data[11];\n            }\n            else if (task->data[12] != 8)\n            {\n                --task->data[12];\n            }\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12]));\n            if (task->data[11] == 12 && task->data[12] == 8)\n                ++task->data[0];\n        }\n        break;\n    case 1:\n        task->data[4] -= 8;\n        DoMementoShadowEffect(task);\n        if (task->data[4] < task->data[8])\n            ++task->data[0];\n        break;\n    case 2:\n        task->data[4] -= 8;\n        DoMementoShadowEffect(task);\n        task->data[14] += 4;\n        task->data[15] -= 4;\n        if (task->data[14] >= task->data[15])\n            task->data[14] = task->data[15];\n        gBattle_WIN0H = (task->data[14] << 8) | task->data[15];\n        if (task->data[14] == task->data[15])\n            ++task->data[0];\n        break;\n    case 3:\n        gScanlineEffect.state = 3;\n        ++task->data[0];\n        break;\n    case 4:\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nvoid AnimTask_MoveTargetMementoShadow(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n    struct ScanlineEffectParams scanlineParams;\n    u8 x;\n    u32 i;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        if (IsContest() == TRUE)\n        {\n            gBattle_WIN0H = 0;\n            gBattle_WIN0V = 0;\n            SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n            SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n            DestroyAnimVisualTask(taskId);\n        }\n        else\n        {\n            task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);\n            if (task->data[3] == 1)\n            {\n                SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);\n                gBattle_BG2_X += DISPLAY_WIDTH;\n            }\n            else\n            {\n                SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);\n                gBattle_BG1_X += DISPLAY_WIDTH;\n            }\n            ++task->data[0];\n        }\n        break;\n    case 1:\n        if (task->data[3] == 1)\n        {\n            GetBattleAnimBg1Data(&animBg);\n            task->data[10] = gBattle_BG1_Y;\n            FillPalette(RGB_BLACK, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n        }\n        else\n        {\n            task->data[10] = gBattle_BG2_Y;\n            FillPalette(RGB_BLACK, BG_PLTT_ID(9), PLTT_SIZE_4BPP);\n        }\n        SetAllBattlersSpritePriority(3);\n        ++task->data[0];\n        break;\n    case 2:\n        task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 31;\n        task->data[6] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) - 7;\n        task->data[13] = (task->data[7] - task->data[6]) << 8;\n        x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n        task->data[14] = x - 4;\n        task->data[15] = x + 4;\n        if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n            task->data[8] = -12;\n        else\n            task->data[8] = -64;\n        task->data[4] = task->data[8];\n        task->data[5] = task->data[8];\n        task->data[11] = 12;\n        task->data[12] = 8;\n        ++task->data[0];\n        break;\n    case 3:\n        if (task->data[3] == 1)\n            scanlineParams.dmaDest = &REG_BG1VOFS;\n        else\n            scanlineParams.dmaDest = &REG_BG2VOFS;\n        for (i = 0; i < 112; ++i)\n        {\n            gScanlineEffectRegBuffers[0][i] = task->data[10] + (159 - i);\n            gScanlineEffectRegBuffers[1][i] = task->data[10] + (159 - i);\n        }\n        scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;\n        scanlineParams.initState = 1;\n        scanlineParams.unused9 = 0;\n        ScanlineEffect_SetParams(scanlineParams);\n        ++task->data[0];\n        break;\n    case 4:\n        if (task->data[3] == 1)\n            SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n        else\n            SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n        gBattle_WIN0H = (task->data[14] << 8) | task->data[15];\n        gBattle_WIN0V = DISPLAY_HEIGHT;\n        task->data[0] = 0;\n        task->data[1] = 0;\n        task->data[2] = 0;\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8));\n        task->func = AnimTask_MoveTargetMementoShadow_Step;\n        break;\n    }\n}\n\nstatic void AnimTask_MoveTargetMementoShadow_Step(u8 taskId)\n{\n    u8 pos;\n    u32 i;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        task->data[5] += 8;\n        if (task->data[5] >= task->data[7])\n            task->data[5] = task->data[7];\n        DoMementoShadowEffect(task);\n        if (task->data[5] == task->data[7])\n            ++task->data[0];\n        break;\n    case 1:\n        if (task->data[15] - task->data[14] < 0x40)\n        {\n            task->data[14] -= 4;\n            task->data[15] += 4;\n        }\n        else\n        {\n            task->data[1] = 1;\n        }\n        gBattle_WIN0H = (task->data[14] << 8) | task->data[15];\n        task->data[4] += 8;\n        if (task->data[4] >= task->data[6])\n            task->data[4] = task->data[6];\n        DoMementoShadowEffect(task);\n        if (task->data[4] == task->data[6] && task->data[1])\n        {\n            task->data[1] = 0;\n            ++task->data[0];\n        }\n        break;\n    case 2:\n        if (++task->data[1] > 1)\n        {\n            task->data[1] = 0;\n            ++task->data[2];\n            if (task->data[2] & 1)\n            {\n                if (task->data[11])\n                    --task->data[11];\n            }\n            else if (task->data[12] < 16)\n            {\n                ++task->data[12];\n            }\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12]));\n            if (task->data[11] == 0 && task->data[12] == 16)\n                ++task->data[0];\n        }\n        break;\n    case 3:\n        gScanlineEffect.state = 3;\n        ++task->data[0];\n        break;\n    case 4:\n        gBattle_WIN0H = 0;\n        gBattle_WIN0V = 0;\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n        SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void DoMementoShadowEffect(struct Task *task)\n{\n    s32 var0, var1, var4;\n    s16 var2, i;\n\n    var2 = task->data[5] - task->data[4];\n    if (var2 != 0)\n    {\n        var0 = task->data[13] / var2;\n        var1 = task->data[6] << 8;\n        for (i = 0; i < task->data[4]; ++i)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159);\n        for (i = task->data[4]; i <= task->data[5]; ++i)\n        {\n            if (i >= 0)\n            {\n                s16 var3 = (var1 >> 8) - i;\n\n                gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var3 + task->data[10];\n            }\n            var1 += var0;\n        }\n        var4 = task->data[10] - (i - 159);\n        for (; i < task->data[7]; ++i)\n            if (i >= 0)\n                gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var4--;\n    }\n    else\n    {\n        var4 = task->data[10] + 159;\n        for (i = 0; i < 112; ++i)\n        {\n            gScanlineEffectRegBuffers[0][i] = var4;\n            gScanlineEffectRegBuffers[1][i] = var4;\n            --var4;\n        }\n    }\n}\n\nstatic void SetAllBattlersSpritePriority(u8 priority)\n{\n    u32 i;\n\n    for (i = 0; i < MAX_BATTLERS_COUNT; ++i)\n    {\n        u8 spriteId = GetAnimBattlerSpriteId(i);\n        if (spriteId != SPRITE_NONE)\n            gSprites[spriteId].oam.priority = priority;\n    }\n}\n\nvoid AnimTask_InitMementoShadow(u8 taskId)\n{\n    bool8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? TRUE : FALSE;\n\n    MoveBattlerSpriteToBG(gBattleAnimAttacker, toBG2);\n    gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = FALSE;\n    if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))\n    {\n        MoveBattlerSpriteToBG(gBattleAnimAttacker ^ 2, toBG2 ^ 1);\n        gSprites[gBattlerSpriteIds[gBattleAnimAttacker ^ 2]].invisible = FALSE;\n    }\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_MementoHandleBg(u8 taskId)\n{\n    bool8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? TRUE : FALSE;\n    \n    ResetBattleAnimBg(toBG2);\n    if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))\n        ResetBattleAnimBg(toBG2 ^ 1);\n    DestroyAnimVisualTask(taskId);\n}\n\n// Animates a deep slash from a claw. Used by Metal Claw, Dragon Claw, and Crush Claw\nstatic void AnimClawSlash(struct Sprite *sprite)\n{\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    StartSpriteAnim(sprite, gBattleAnimArgs[2]);\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Makes the attacker metallic and shining.\n// Used by MOVE_HARDEN and MOVE_IRON_DEFENSE.\n// arg0: if true won't change battler's palette back\n// arg1: if true, use custom color\n// arg2: custom color\n// Custom color argument is used in MOVE_POISON_TAIL to make the mon turn purplish/pinkish as if became cloaked in poison.\nvoid AnimTask_MetallicShine(u8 taskId)\n{\n    u16 species;\n    u8 spriteId, newSpriteId;\n    u16 paletteNum;\n    struct BattleAnimBgData animBg;\n    bool32 priorityChanged = FALSE;\n\n    gBattle_WIN0H = 0;\n    gBattle_WIN0V = 0;\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12));\n    SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0);\n    SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);\n    if (!IsContest())\n        SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);\n    if (IsDoubleBattle() && !IsContest())\n    {\n        if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT)\n        {\n            if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)) == TRUE)\n            {\n                gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority--;\n                SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n                priorityChanged = TRUE;\n            }\n        }\n    }\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);\n    else\n        species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);\n    spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species);\n    GetBattleAnimBg1Data(&animBg);\n    AnimLoadCompressedBgTilemap(animBg.bgId, gMetalShineTilemap);\n    AnimLoadCompressedBgGfx(animBg.bgId, gMetalShineGfx, animBg.tilesOffset);\n    LoadCompressedPalette(gMetalShinePalette, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n    gBattle_BG1_X = -gSprites[spriteId].x + 96;\n    gBattle_BG1_Y = -gSprites[spriteId].y + 32;\n    paletteNum = 16 + gSprites[spriteId].oam.paletteNum;\n    if (gBattleAnimArgs[1] == 0)\n        SetGreyscaleOrOriginalPalette(paletteNum, FALSE);\n    else\n        BlendPalette(PLTT_ID(paletteNum), 16, 11, gBattleAnimArgs[2]);\n    gTasks[taskId].data[0] = newSpriteId;\n    gTasks[taskId].data[1] = gBattleAnimArgs[0];\n    gTasks[taskId].data[2] = gBattleAnimArgs[1];\n    gTasks[taskId].data[3] = gBattleAnimArgs[2];\n    gTasks[taskId].data[6] = priorityChanged;\n    gTasks[taskId].func = AnimTask_MetallicShine_Step;\n}\n\nstatic void AnimTask_MetallicShine_Step(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n    u16 paletteNum;\n    u8 spriteId;\n\n    gTasks[taskId].data[10] += 4;\n    gBattle_BG1_X -= 4;\n    if (gTasks[taskId].data[10] == 128)\n    {\n        gTasks[taskId].data[10] = 0;\n        gBattle_BG1_X += 128;\n        gTasks[taskId].data[11]++;\n        if (gTasks[taskId].data[11] == 2)\n        {\n            spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n            paletteNum = 16 + gSprites[spriteId].oam.paletteNum;\n            if (gTasks[taskId].data[1] == 0)\n                SetGreyscaleOrOriginalPalette(paletteNum, 1);\n            DestroySprite(&gSprites[gTasks[taskId].data[0]]);\n            GetBattleAnimBg1Data(&animBg);\n            InitBattleAnimBg(animBg.bgId);\n            if (gTasks[taskId].data[6] == 1)\n                gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority++;\n        }\n        else if (gTasks[taskId].data[11] == 3)\n        {\n            gBattle_WIN0H = 0;\n            gBattle_WIN0V = 0;\n            SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n            SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n            if (!IsContest())\n                SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);\n            SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);\n            SetGpuReg(REG_OFFSET_BLDCNT, 0);\n            SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n}\n\n// Changes battler's palette to either greyscale or original.\n// arg0: which battler\n// arg1: 0 grayscale, 1 original\nvoid AnimTask_SetGrayscaleOrOriginalPal(u8 taskId)\n{\n    u8 spriteId, battler;\n    bool8 calcSpriteId = FALSE;\n    u8 position = B_POSITION_PLAYER_LEFT;\n\n    switch (gBattleAnimArgs[0])\n    {\n    case ANIM_ATTACKER:\n    case ANIM_TARGET:\n    case ANIM_ATK_PARTNER:\n    case ANIM_DEF_PARTNER:\n        spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n        break;\n    case 4:\n        position = B_POSITION_PLAYER_LEFT;\n        calcSpriteId = TRUE;\n        break;\n    case 5:\n        position = B_POSITION_PLAYER_RIGHT;\n        calcSpriteId = TRUE;\n        break;\n    case 6:\n        position = B_POSITION_OPPONENT_LEFT;\n        calcSpriteId = TRUE;\n        break;\n    case 7:\n        position = B_POSITION_OPPONENT_RIGHT;\n        calcSpriteId = TRUE;\n        break;\n    default:\n        spriteId = SPRITE_NONE;\n        break;\n    }\n    if (calcSpriteId)\n    {\n        battler = GetBattlerAtPosition(position);\n        if (IsBattlerSpriteVisible(battler))\n            spriteId = gBattlerSpriteIds[battler];\n        else\n            spriteId = SPRITE_NONE;\n    }\n    if (spriteId != SPRITE_NONE)\n        SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid GetIsDoomDesireHitTurn(u8 taskId)\n{\n    if (gAnimMoveTurn < 2)\n        gBattleAnimArgs[ARG_RET_ID] = FALSE;\n    if (gAnimMoveTurn == 2)\n        gBattleAnimArgs[ARG_RET_ID] = TRUE;\n    DestroyAnimVisualTask(taskId);\n}\n"
  },
  {
    "path": "src/battle_anim_dragon.c",
    "content": "#include \"global.h\"\n#include \"battle_anim.h\"\n#include \"scanline_effect.h\"\n#include \"task.h\"\n#include \"trig.h\"\n\nstatic void AnimOutrageFlame(struct Sprite *sprite);\nstatic void AnimDragonFireToTarget(struct Sprite *sprite);\nstatic void AnimDragonRageFirePlume(struct Sprite *sprite);\nstatic void AnimDragonDanceOrb(struct Sprite *sprite);\nstatic void AnimOverheatFlame(struct Sprite *sprite);\nstatic void AnimDragonDanceOrb_Step(struct Sprite *sprite);\nstatic void AnimTask_DragonDanceWaver_Step(u8 taskId);\nstatic void UpdateDragonDanceScanlineEffect(struct Task *task);\nstatic void AnimOverheatFlame_Step(struct Sprite *sprite);\n\nstatic EWRAM_DATA u16 sUnusedOverheatData[7] = {0};\n\nstatic const union AnimCmd sAnim_OutrageOverheatFire_0[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(48, 4),\n    ANIMCMD_FRAME(64, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_OutrageOverheatFire[] =\n{\n    sAnim_OutrageOverheatFire_0,\n};\n\nconst struct SpriteTemplate gOutrageFlameSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_OutrageOverheatFire,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimOutrageFlame,\n};\n\nstatic const union AnimCmd sAnim_DragonBreathFire_0[] =\n{\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_DragonBreathFire_1[] =\n{\n    ANIMCMD_FRAME(16, 3, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 3, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(48, 3, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_DragonBreathFire[] =\n{\n    sAnim_DragonBreathFire_0,\n    sAnim_DragonBreathFire_1,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_DragonBreathFire_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x50, 0x50, 127, 0),\n    AFFINEANIMCMD_FRAME(0xD, 0xD, 0, 100),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_DragonBreathFire_1[] =\n{\n    AFFINEANIMCMD_FRAME(0x50, 0x50, 0, 0),\n    AFFINEANIMCMD_FRAME(0xD, 0xD, 0, 100),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_DragonBreathFire[] =\n{\n    sAffineAnim_DragonBreathFire_0,\n    sAffineAnim_DragonBreathFire_1,\n};\n\nconst struct SpriteTemplate gDragonBreathFireSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineDouble_ObjNormal_32x32,\n    .anims = sAnims_DragonBreathFire,\n    .images = NULL,\n    .affineAnims = sAffineAnims_DragonBreathFire,\n    .callback = AnimDragonFireToTarget,\n};\n\nconst union AnimCmd sAnim_DragonRageFirePlume[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(32, 5),\n    ANIMCMD_FRAME(48, 5),\n    ANIMCMD_FRAME(64, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_DragonRageFirePlume[] =\n{\n    sAnim_DragonRageFirePlume,\n};\n\nconst struct SpriteTemplate gDragonRageFirePlumeSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FIRE_PLUME,\n    .paletteTag = ANIM_TAG_FIRE_PLUME,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_DragonRageFirePlume,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDragonRageFirePlume,\n};\n\nstatic const union AnimCmd sAnim_DragonRageFire[] =\n{\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_DragonRageFire[] =\n{\n    sAnim_DragonRageFire,\n    sAnim_DragonRageFire,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_DragonRageFire_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x64, 0x64, 127, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_DragonRageFire_1[] =\n{\n    AFFINEANIMCMD_FRAME(0x64, 0x64, 0, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_DragonRageFire[] =\n{\n    sAffineAnim_DragonRageFire_0,\n    sAffineAnim_DragonRageFire_1,\n};\n\nconst struct SpriteTemplate gDragonRageFireSpitSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineDouble_ObjNormal_32x32,\n    .anims = sAnims_DragonRageFire,\n    .images = NULL,\n    .affineAnims = sAffineAnims_DragonRageFire,\n    .callback = AnimDragonFireToTarget,\n};\n\nconst struct SpriteTemplate gDragonDanceOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HOLLOW_ORB,\n    .paletteTag = ANIM_TAG_HOLLOW_ORB,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDragonDanceOrb,\n};\n\nconst struct SpriteTemplate gOverheatFlameSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_OutrageOverheatFire,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimOverheatFlame,\n};\n\nstatic void AnimOutrageFlame(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->x -= gBattleAnimArgs[0];\n        gBattleAnimArgs[3] = -gBattleAnimArgs[3];\n        gBattleAnimArgs[4] = -gBattleAnimArgs[4];\n    }\n    else\n    {\n        sprite->x += gBattleAnimArgs[0];\n    }\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[3] = gBattleAnimArgs[4];\n    sprite->data[5] = gBattleAnimArgs[5];\n    sprite->invisible = TRUE;\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = TranslateSpriteLinearAndFlicker;\n}\n\nstatic void StartDragonFireTranslation(struct Sprite *sprite)\n{\n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->x -= gBattleAnimArgs[1];\n        sprite->y += gBattleAnimArgs[1];\n        sprite->data[2] -= gBattleAnimArgs[2];\n        sprite->data[4] += gBattleAnimArgs[3];\n    }\n    else\n    {\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n        sprite->data[2] += gBattleAnimArgs[2];\n        sprite->data[4] += gBattleAnimArgs[3];\n        StartSpriteAnim(sprite, 1);\n    }\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n}\n\nstatic void AnimDragonRageFirePlume(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[0] == 0)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);\n    }\n    SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[1]);\n    sprite->y += gBattleAnimArgs[2];\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n}\n\n// For Dragon Breath and Dragon Rage\nstatic void AnimDragonFireToTarget(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        StartSpriteAffineAnim(sprite, 1);\n    StartDragonFireTranslation(sprite);\n}\n\nstatic void AnimDragonDanceOrb(struct Sprite *sprite)\n{\n    u16 r5;\n    u16 r0;\n\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[4] = 0;\n    sprite->data[5] = 1;\n    sprite->data[6] = gBattleAnimArgs[0];\n    r5 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_HEIGHT);\n    r0 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_WIDTH);\n    if (r5 > r0)\n        sprite->data[7] = r5 / 2;\n    else\n        sprite->data[7] = r0 / 2;\n    sprite->x2 = Cos(sprite->data[6], sprite->data[7]);\n    sprite->y2 = Sin(sprite->data[6], sprite->data[7]);\n    sprite->callback = AnimDragonDanceOrb_Step;\n}\n\nstatic void AnimDragonDanceOrb_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->data[6] = (sprite->data[6] - sprite->data[5]) & 0xFF;\n        sprite->x2 = Cos(sprite->data[6], sprite->data[7]);\n        sprite->y2 = Sin(sprite->data[6], sprite->data[7]);\n        if (++sprite->data[4] > 5)\n        {\n            sprite->data[4] = 0;\n            if (sprite->data[5] <= 15 && ++sprite->data[5] > 15)\n                sprite->data[5] = 16;\n        }\n        if (++sprite->data[3] > 0x3C)\n        {\n            sprite->data[3] = 0;\n            ++sprite->data[0];\n        }\n        break;\n    case 1:\n        sprite->data[6] = (sprite->data[6] - sprite->data[5]) & 0xFF;\n        if (sprite->data[7] <= 0x95 && (sprite->data[7] += 8) > 0x95)\n            sprite->data[7] = 0x96;\n        sprite->x2 = Cos(sprite->data[6], sprite->data[7]);\n        sprite->y2 = Sin(sprite->data[6], sprite->data[7]);\n        if (++sprite->data[4] > 5)\n        {\n            sprite->data[4] = 0;\n            if (sprite->data[5] <= 15 && ++sprite->data[5] > 15)\n                sprite->data[5] = 16;\n        }\n        if (++sprite->data[3] > 20)\n            DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\n// Wavers the attacker back and forth. Progressing vertical wave of scanline shifts\n// Used by Dragon Dance\nvoid AnimTask_DragonDanceWaver(u8 taskId)\n{\n    struct ScanlineEffectParams scanlineParams;\n    struct Task *task = &gTasks[taskId];\n    u32 i;\n    u8 r1;\n\n    if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)\n    {\n        scanlineParams.dmaDest = &REG_BG1HOFS;\n        task->data[2] = gBattle_BG1_X;\n    }\n    else\n    {\n        scanlineParams.dmaDest = &REG_BG2HOFS;\n        task->data[2] = gBattle_BG2_X;\n    }\n    scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;\n    scanlineParams.initState = 1;\n    scanlineParams.unused9 = 0;\n    r1 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);\n    task->data[3] = r1 - 32;\n    task->data[4] = r1 + 32;\n    if (task->data[3] < 0)\n        task->data[3] = 0;\n    for (i = task->data[3]; i <= task->data[4]; ++i)\n    {\n        gScanlineEffectRegBuffers[0][i] = task->data[2];\n        gScanlineEffectRegBuffers[1][i] = task->data[2];\n    }\n    ScanlineEffect_SetParams(scanlineParams);\n    task->func = AnimTask_DragonDanceWaver_Step;\n}\n\nstatic void AnimTask_DragonDanceWaver_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        if (++task->data[7] > 1)\n        {\n            task->data[7] = 0;\n            if (++task->data[6] == 3)\n                ++task->data[0];\n        }\n        UpdateDragonDanceScanlineEffect(task);\n        break;\n    case 1:\n        if (++task->data[1] > 0x3C)\n            ++task->data[0];\n        UpdateDragonDanceScanlineEffect(task);\n        break;\n    case 2:\n        if (++task->data[7] > 1)\n        {\n            task->data[7] = 0;\n            if (--task->data[6] == 0)\n                ++task->data[0];\n        }\n        UpdateDragonDanceScanlineEffect(task);\n        break;\n    case 3:\n        gScanlineEffect.state = 3;\n        ++task->data[0];\n        break;\n    case 4:\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void UpdateDragonDanceScanlineEffect(struct Task *task)\n{\n    u16 i, r3 = task->data[5];\n\n    for (i = task->data[3]; i <= task->data[4]; ++i)\n    {\n        gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = ((gSineTable[r3] * task->data[6]) >> 7) + task->data[2];\n        r3 = (r3 + 8) & 0xFF;\n    }\n    task->data[5] = (task->data[5] + 9) & 0xFF;\n}\n\nstatic void AnimOverheatFlame(struct Sprite *sprite)\n{\n    s32 i, yAmplitude = (gBattleAnimArgs[2] * 3) / 5;\n\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[4];\n    sprite->data[1] = Cos(gBattleAnimArgs[1], gBattleAnimArgs[2]);\n    sprite->data[2] = Sin(gBattleAnimArgs[1], yAmplitude);\n    sprite->x += sprite->data[1] * gBattleAnimArgs[0];\n    sprite->y += sprite->data[2] * gBattleAnimArgs[0];\n    sprite->data[3] = gBattleAnimArgs[3];\n    sprite->callback = AnimOverheatFlame_Step;\n    for (i = 0; i < 7; ++i)\n        sUnusedOverheatData[i] = sprite->data[i];\n}\n\nstatic void AnimOverheatFlame_Step(struct Sprite *sprite)\n{\n    sprite->data[4] += sprite->data[1];\n    sprite->data[5] += sprite->data[2];\n    sprite->x2 = sprite->data[4] / 10;\n    sprite->y2 = sprite->data[5] / 10;\n    if (++sprite->data[0] > sprite->data[3])\n        DestroyAnimSprite(sprite);\n}\n"
  },
  {
    "path": "src/battle_anim_effects_1.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"battle_interface.h\"\n#include \"random.h\"\n#include \"trig.h\"\n#include \"util.h\"\n#include \"constants/songs.h\"\n\nstruct {\n    s16 startX;\n    s16 startY;\n    s16 targetX;\n    s16 targetY;\n} static EWRAM_DATA sFrenzyPlantRootData = {0}; // Debug? Written to but never read.\n\nstatic void AnimMovePowderParticle(struct Sprite *);\nstatic void AnimMovePowderParticle_Step(struct Sprite *);\nstatic void AnimSolarBeamSmallOrb(struct Sprite *);\nstatic void AnimSolarBeamSmallOrb_Step(struct Sprite *);\nstatic void AnimSolarBeamBigOrb(struct Sprite *);\nstatic void AnimPowerAbsorptionOrb(struct Sprite *);\nstatic void AnimAbsorptionOrb(struct Sprite *);\nstatic void AnimAbsorptionOrb_Step(struct Sprite *);\nstatic void AnimHyperBeamOrb(struct Sprite *);\nstatic void AnimHyperBeamOrb_Step(struct Sprite *);\nstatic void AnimMimicOrb(struct Sprite *);\nstatic void AnimLeechSeed(struct Sprite *);\nstatic void AnimLeechSeed_Step(struct Sprite *);\nstatic void AnimLeechSeedSprouts(struct Sprite *);\nstatic void AnimSporeParticle(struct Sprite *);\nstatic void AnimSporeParticle_Step(struct Sprite *);\nstatic void AnimPetalDanceBigFlower(struct Sprite *);\nstatic void AnimPetalDanceBigFlower_Step(struct Sprite *);\nstatic void AnimPetalDanceSmallFlower(struct Sprite *);\nstatic void AnimPetalDanceSmallFlower_Step(struct Sprite *);\nstatic void AnimRazorLeafParticle(struct Sprite *);\nstatic void AnimRazorLeafParticle_Step1(struct Sprite *);\nstatic void AnimRazorLeafParticle_Step2(struct Sprite *);\nstatic void AnimIngrainRoot(struct Sprite *);\nstatic void AnimFrenzyPlantRoot(struct Sprite *);\nstatic void AnimIngrainOrb(struct Sprite *);\nstatic void AnimTranslateLinearSingleSineWave(struct Sprite *);\nstatic void AnimTranslateLinearSingleSineWave_Step(struct Sprite *);\nstatic void AnimMoveTwisterParticle_Step(struct Sprite *);\nstatic void AnimConstrictBinding(struct Sprite *);\nstatic void AnimConstrictBinding_Step1(struct Sprite *);\nstatic void AnimConstrictBinding_Step2(struct Sprite *);\nstatic void AnimTask_DuplicateAndShrinkToPos_Step1(u8);\nstatic void AnimTask_DuplicateAndShrinkToPos_Step2(u8);\nstatic void AnimKnockOffItem(struct Sprite *);\nstatic void AnimPresent(struct Sprite *);\nstatic void AnimPresentHealParticle(struct Sprite *);\nstatic void AnimItemSteal(struct Sprite *);\nstatic void AnimItemSteal_Step3(struct Sprite *);\nstatic void AnimRootFlickerOut(struct Sprite *);\nstatic void AnimTrickBag(struct Sprite *);\nstatic void AnimTrickBag_Step1(struct Sprite *);\nstatic void AnimTrickBag_Step2(struct Sprite *);\nstatic void AnimTrickBag_Step3(struct Sprite *);\nstatic void AnimTask_LeafBlade_Step(u8);\nstatic s16 LeafBladeGetPosFactor(struct Sprite *);\nstatic void AnimTask_LeafBlade_Step2(struct Task *, u8);\nstatic void AnimTask_LeafBlade_Step2_Callback(struct Sprite *);\nstatic void AnimFlyingParticle(struct Sprite *);\nstatic void AnimFlyingParticle_Step(struct Sprite *);\nstatic void AnimNeedleArmSpike(struct Sprite *);\nstatic void AnimNeedleArmSpike_Step(struct Sprite *);\nstatic void AnimSlice_Step(struct Sprite *);\nstatic void AnimCirclingMusicNote(struct Sprite *);\nstatic void AnimCirclingMusicNote_Step(struct Sprite *);\nstatic void AnimProtect(struct Sprite *);\nstatic void AnimProtect_Step(struct Sprite *);\nstatic void AnimMilkBottle(struct Sprite *);\nstatic void AnimMilkBottle_Step1(struct Sprite *);\nstatic void AnimMilkBottle_Step2(struct Sprite *, int, int);\nstatic void AnimBubbleBurst(struct Sprite *);\nstatic void AnimBubbleBurst_Step(struct Sprite *);\nstatic void AnimSleepLetterZ(struct Sprite *);\nstatic void AnimSleepLetterZ_Step(struct Sprite *);\nstatic void AnimLockOnTarget(struct Sprite *);\nstatic void AnimLockOnTarget_Step1(struct Sprite *);\nstatic void AnimLockOnTarget_Step2(struct Sprite *);\nstatic void AnimLockOnTarget_Step3(struct Sprite *);\nstatic void AnimLockOnTarget_Step4(struct Sprite *);\nstatic void AnimLockOnTarget_Step5(struct Sprite *);\nstatic void AnimLockOnTarget_Step6(struct Sprite *);\nstatic void AnimLockOnMoveTarget(struct Sprite *);\nstatic void AnimBowMon(struct Sprite *);\nstatic void AnimBowMon_Step1(struct Sprite *);\nstatic void AnimBowMon_Step1_Callback(struct Sprite *);\nstatic void AnimBowMon_Step2(struct Sprite *);\nstatic void AnimBowMon_Step3(struct Sprite *);\nstatic void AnimBowMon_Step4(struct Sprite *);\nstatic void AnimBowMon_Step3_Callback(struct Sprite *);\nstatic void AnimTipMon(struct Sprite *sprite);\nstatic void AnimTipMon_Step(struct Sprite *);\nstatic void AnimTask_SkullBashPositionSet(u8);\nstatic void AnimTask_SkullBashPositionReset(u8);\nstatic void AnimSlashSlice(struct Sprite *);\nstatic void AnimFalseSwipeSlice(struct Sprite *);\nstatic void AnimFalseSwipeSlice_Step1(struct Sprite *);\nstatic void AnimFalseSwipeSlice_Step2(struct Sprite *);\nstatic void AnimFalseSwipeSlice_Step3(struct Sprite *);\nstatic void AnimFalseSwipePositionedSlice(struct Sprite *);\nstatic void AnimEndureEnergy(struct Sprite *);\nstatic void AnimEndureEnergy_Step(struct Sprite *);\nstatic void AnimSharpenSphere(struct Sprite *);\nstatic void AnimSharpenSphere_Step(struct Sprite *);\nstatic void AnimConversion(struct Sprite *);\nstatic void AnimConversion2(struct Sprite *);\nstatic void AnimConversion2_Step(struct Sprite *);\nstatic void AnimMoon(struct Sprite *);\nstatic void AnimMoon_Step(struct Sprite *);\nstatic void AnimMoonlightSparkle(struct Sprite *);\nstatic void AnimMoonlightSparkle_Step(struct Sprite *);\nstatic void AnimHornHit(struct Sprite *);\nstatic void AnimHornHit_Step(struct Sprite *);\nstatic void AnimTask_DoubleTeam_Step(u8);\nstatic void AnimDoubleTeam(struct Sprite *);\nstatic void AnimWavyMusicNotes(struct Sprite *);\nstatic void AnimWavyMusicNotes_CalcVelocity(s16, s16, s16 *, s16 *, s8);\nstatic void AnimWavyMusicNotes_Step(struct Sprite *);\nstatic void AnimFlyingMusicNotes(struct Sprite *);\nstatic void AnimFlyingMusicNotes_Step(struct Sprite *);\nstatic void AnimSlowFlyingMusicNotes(struct Sprite *);\nstatic void AnimSlowFlyingMusicNotes_Step(struct Sprite *);\nstatic void AnimThoughtBubble(struct Sprite *);\nstatic void AnimThoughtBubble_Step(struct Sprite *);\nstatic void AnimMetronomeFinger(struct Sprite *);\nstatic void AnimMetronomeFinger_Step(struct Sprite *);\nstatic void AnimFollowMeFinger(struct Sprite *);\nstatic void AnimFollowMeFinger_Step1(struct Sprite *);\nstatic void AnimFollowMeFinger_Step2(struct Sprite *);\nstatic void AnimTauntFinger(struct Sprite *);\nstatic void AnimTauntFinger_Step1(struct Sprite *);\nstatic void AnimTauntFinger_Step2(struct Sprite *);\nstatic void AnimBellyDrumHand(struct Sprite *);\nstatic void AnimSuperFang(struct Sprite *);\nstatic void AnimGrantingStars(struct Sprite *);\nstatic void AnimSparklingStars(struct Sprite *);\nstatic void AnimCuttingSlice(struct Sprite *);\nstatic void AnimAirCutterSlice(struct Sprite *);\nstatic void AnimFlickeringPunch(struct Sprite *);\nstatic void AnimSlidingHit(struct Sprite *);\nstatic void AnimWhipHit(struct Sprite *);\n\nstatic const u8 sUnused[] = {2, 4, 1, 3};\n\nstatic const union AnimCmd sPowderParticlesAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(2, 5),\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_FRAME(6, 5),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_FRAME(10, 5),\n    ANIMCMD_FRAME(12, 5),\n    ANIMCMD_FRAME(14, 5),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sPowderParticlesAnimTable[] =\n{\n    sPowderParticlesAnimCmds,\n};\n\nconst struct SpriteTemplate gSleepPowderParticleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SLEEP_POWDER,\n    .paletteTag = ANIM_TAG_SLEEP_POWDER,\n    .oam = &gOamData_AffineOff_ObjNormal_8x16,\n    .anims = sPowderParticlesAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMovePowderParticle,\n};\n\nconst struct SpriteTemplate gStunSporeParticleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_STUN_SPORE,\n    .paletteTag = ANIM_TAG_STUN_SPORE,\n    .oam = &gOamData_AffineOff_ObjNormal_8x16,\n    .anims = sPowderParticlesAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMovePowderParticle,\n};\n\nconst struct SpriteTemplate gPoisonPowderParticleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_POISON_POWDER,\n    .paletteTag = ANIM_TAG_POISON_POWDER,\n    .oam = &gOamData_AffineOff_ObjNormal_8x16,\n    .anims = sPowderParticlesAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMovePowderParticle,\n};\n\nstatic const union AnimCmd sSolarBeamBigOrbAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSolarBeamBigOrbAnimCmds2[] =\n{\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSolarBeamBigOrbAnimCmds3[] =\n{\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSolarBeamBigOrbAnimCmds4[] =\n{\n    ANIMCMD_FRAME(3, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSolarBeamBigOrbAnimCmds5[] =\n{\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSolarBeamBigOrbAnimCmds6[] =\n{\n    ANIMCMD_FRAME(5, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSolarBeamBigOrbAnimCmds7[] =\n{\n    ANIMCMD_FRAME(6, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSolarBeamSmallOrbAnimCms[] =\n{\n    ANIMCMD_FRAME(7, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sPowerAbsorptionOrbAnimCmds[] =\n{\n    ANIMCMD_FRAME(8, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSolarBeamBigOrbAnimTable[] =\n{\n    sSolarBeamBigOrbAnimCmds1,\n    sSolarBeamBigOrbAnimCmds2,\n    sSolarBeamBigOrbAnimCmds3,\n    sSolarBeamBigOrbAnimCmds4,\n    sSolarBeamBigOrbAnimCmds5,\n    sSolarBeamBigOrbAnimCmds6,\n    sSolarBeamBigOrbAnimCmds7,\n};\n\nstatic const union AnimCmd *const sSolarBeamSmallOrbAnimTable[] =\n{\n    sSolarBeamSmallOrbAnimCms,\n};\n\nstatic const union AnimCmd *const sPowerAbsorptionOrbAnimTable[] =\n{\n    sPowerAbsorptionOrbAnimCmds,\n};\n\nstatic const union AffineAnimCmd sPowerAbsorptionOrbAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(-5, -5, 0, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sPowerAbsorptionOrbAffineAnimTable[] =\n{\n    sPowerAbsorptionOrbAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gPowerAbsorptionOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ORBS,\n    .paletteTag = ANIM_TAG_ORBS,\n    .oam = &gOamData_AffineNormal_ObjBlend_16x16,\n    .anims = sPowerAbsorptionOrbAnimTable,\n    .images = NULL,\n    .affineAnims = sPowerAbsorptionOrbAffineAnimTable,\n    .callback = AnimPowerAbsorptionOrb,\n};\n\nconst struct SpriteTemplate gSolarBeamBigOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ORBS,\n    .paletteTag = ANIM_TAG_ORBS,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sSolarBeamBigOrbAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSolarBeamBigOrb,\n};\n\nconst struct SpriteTemplate gSolarBeamSmallOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ORBS,\n    .paletteTag = ANIM_TAG_ORBS,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sSolarBeamSmallOrbAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSolarBeamSmallOrb,\n};\n\nstatic const union AffineAnimCmd sStockpileAbsorptionOrbAffineCmds[] =\n{\n    AFFINEANIMCMD_FRAME(320, 320, 0, 0),\n    AFFINEANIMCMD_FRAME(-14, -14, 0, 1),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sStockpileAbsorptionOrbAffineAnimTable[] =\n{\n    sStockpileAbsorptionOrbAffineCmds,\n};\n\nconst struct SpriteTemplate gStockpileAbsorptionOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GRAY_ORB,\n    .paletteTag = ANIM_TAG_GRAY_ORB,\n    .oam = &gOamData_AffineDouble_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sStockpileAbsorptionOrbAffineAnimTable,\n    .callback = AnimPowerAbsorptionOrb,\n};\n\nstatic const union AffineAnimCmd sAbsorptionOrbAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(-5, -5, 0, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sAbsorptionOrbAffineAnimTable[] =\n{\n    sAbsorptionOrbAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gAbsorptionOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ORBS,\n    .paletteTag = ANIM_TAG_ORBS,\n    .oam = &gOamData_AffineNormal_ObjBlend_16x16,\n    .anims = sPowerAbsorptionOrbAnimTable,\n    .images = NULL,\n    .affineAnims = sAbsorptionOrbAffineAnimTable,\n    .callback = AnimAbsorptionOrb,\n};\n\nconst struct SpriteTemplate gHyperBeamOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ORBS,\n    .paletteTag = ANIM_TAG_ORBS,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sSolarBeamBigOrbAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimHyperBeamOrb,\n};\n\nstatic const union AnimCmd sLeechSeedAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sLeechSeedAnimCmds2[] =\n{\n    ANIMCMD_FRAME(4, 7),\n    ANIMCMD_FRAME(8, 7),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sLeechSeedAnimTable[] =\n{\n    sLeechSeedAnimCmds1,\n    sLeechSeedAnimCmds2,\n};\n\nconst struct SpriteTemplate gLeechSeedSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SEED,\n    .paletteTag = ANIM_TAG_SEED,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sLeechSeedAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimLeechSeed,\n};\n\nstatic const union AnimCmd sSporeParticleAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSporeParticleAnimCmds2[] =\n{\n    ANIMCMD_FRAME(4, 7),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSporeParticleAnimTable[] =\n{\n    sSporeParticleAnimCmds1,\n    sSporeParticleAnimCmds2,\n};\n\nconst struct SpriteTemplate gSporeParticleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPORE,\n    .paletteTag = ANIM_TAG_SPORE,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sSporeParticleAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSporeParticle,\n};\n\nstatic const union AnimCmd sPetalDanceBigFlowerAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sPetalDanceSmallFlowerAnimCmds[] =\n{\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sPetalDanceBigFlowerAnimTable[] =\n{\n    sPetalDanceBigFlowerAnimCmds,\n};\n\nstatic const union AnimCmd *const sPetalDanceSmallFlowerAnimTable[] =\n{\n    sPetalDanceSmallFlowerAnimCmds,\n};\n\nconst struct SpriteTemplate gPetalDanceBigFlowerSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FLOWER,\n    .paletteTag = ANIM_TAG_FLOWER,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sPetalDanceBigFlowerAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimPetalDanceBigFlower,\n};\n\nconst struct SpriteTemplate gPetalDanceSmallFlowerSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FLOWER,\n    .paletteTag = ANIM_TAG_FLOWER,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sPetalDanceSmallFlowerAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimPetalDanceSmallFlower,\n};\n\nstatic const union AnimCmd sRazorLeafParticleAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_FRAME(12, 5),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(20, 5),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(12, 5),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sRazorLeafParticleAnimCmds2[] =\n{\n    ANIMCMD_FRAME(24, 5),\n    ANIMCMD_FRAME(28, 5),\n    ANIMCMD_FRAME(32, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sRazorLeafParticleAnimTable[] =\n{\n    sRazorLeafParticleAnimCmds1,\n    sRazorLeafParticleAnimCmds2,\n};\n\nconst struct SpriteTemplate gRazorLeafParticleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_LEAF,\n    .paletteTag = ANIM_TAG_LEAF,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sRazorLeafParticleAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRazorLeafParticle,\n};\n\nconst struct SpriteTemplate gTwisterLeafSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_LEAF,\n    .paletteTag = ANIM_TAG_LEAF,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sRazorLeafParticleAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMoveTwisterParticle,\n};\n\nstatic const union AnimCmd sRazorLeafCutterAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(0, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 3, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 3, .vFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sRazorLeafCutterAnimTable[] =\n{\n    sRazorLeafCutterAnimCmds,\n};\n\nconst struct SpriteTemplate gRazorLeafCutterSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_RAZOR_LEAF,\n    .paletteTag = ANIM_TAG_RAZOR_LEAF,\n    .oam = &gOamData_AffineOff_ObjNormal_32x16,\n    .anims = sRazorLeafCutterAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimTranslateLinearSingleSineWave,\n};\n\nstatic const union AffineAnimCmd sSwiftStarAffineAnimCmds[] = \n{\n    AFFINEANIMCMD_FRAME(0, 0, 0, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sSwiftStarAffineAnimTable[] = \n{\n    sSwiftStarAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gSwiftStarSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_YELLOW_STAR,\n    .paletteTag = ANIM_TAG_YELLOW_STAR,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sSwiftStarAffineAnimTable,\n    .callback = AnimTranslateLinearSingleSineWave,\n};\n\nstatic const union AnimCmd sAnim_ConstrictBinding[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(64, 4),\n    ANIMCMD_FRAME(96, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_ConstrictBinding_Flipped[] =\n{\n    ANIMCMD_FRAME(0,  4, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(64, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(96, 4, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_ConstrictBinding[] =\n{\n    sAnim_ConstrictBinding,\n    sAnim_ConstrictBinding_Flipped,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ConstrictBinding[] = \n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(-11, 0, 0, 6),\n    AFFINEANIMCMD_FRAME(11, 0, 0, 6),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ConstrictBinding_Flipped[] = \n{\n    AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(11, 0, 0, 6),\n    AFFINEANIMCMD_FRAME(-11, 0, 0, 6),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_ConstrictBinding[] = \n{\n    sAffineAnim_ConstrictBinding,\n    sAffineAnim_ConstrictBinding_Flipped,\n};\n\nconst struct SpriteTemplate gConstrictBindingSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_TENDRILS,\n    .paletteTag = ANIM_TAG_TENDRILS,\n    .oam = &gOamData_AffineNormal_ObjNormal_64x32,\n    .anims = sAnims_ConstrictBinding,\n    .images = NULL,\n    .affineAnims = sAffineAnims_ConstrictBinding,\n    .callback = AnimConstrictBinding,\n};\n\nstatic const union AffineAnimCmd sMimicOrbAffineAnimCmds1[] = \n{\n    AFFINEANIMCMD_FRAME(0, 0, 0, 0),\n    AFFINEANIMCMD_FRAME(48, 48, 0, 14),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sMimicOrbAffineAnimCmds2[] = \n{\n    AFFINEANIMCMD_FRAME(-16, -16, 0, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sMimicOrbAffineAnimTable[] = \n{\n    sMimicOrbAffineAnimCmds1,\n    sMimicOrbAffineAnimCmds2,\n};\n\nconst struct SpriteTemplate gMimicOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ORBS,\n    .paletteTag = ANIM_TAG_ORBS,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x16,\n    .anims = sPowerAbsorptionOrbAnimTable,\n    .images = NULL,\n    .affineAnims = sMimicOrbAffineAnimTable,\n    .callback = AnimMimicOrb,\n};\n\nstatic const union AnimCmd sIngrainRootAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 7),\n    ANIMCMD_FRAME(16, 7),\n    ANIMCMD_FRAME(32, 7),\n    ANIMCMD_FRAME(48, 7),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sIngrainRootAnimCmds2[] =\n{\n    ANIMCMD_FRAME(0, 7, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 7, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 7, .hFlip = TRUE),\n    ANIMCMD_FRAME(48, 7, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sIngrainRootAnimCmds3[] =\n{\n    ANIMCMD_FRAME(0, 7),\n    ANIMCMD_FRAME(16, 7),\n    ANIMCMD_FRAME(32, 7),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sIngrainRootAnimCmds4[] =\n{\n    ANIMCMD_FRAME(0, 7, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 7, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 7, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sIngrainRootAnimTable[] =\n{\n    sIngrainRootAnimCmds1,\n    sIngrainRootAnimCmds2,\n    sIngrainRootAnimCmds3,\n    sIngrainRootAnimCmds4,\n};\n\nconst struct SpriteTemplate gIngrainRootSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROOTS,\n    .paletteTag = ANIM_TAG_ROOTS,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sIngrainRootAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimIngrainRoot,\n};\n\nconst struct SpriteTemplate gFrenzyPlantRootSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROOTS,\n    .paletteTag = ANIM_TAG_ROOTS,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sIngrainRootAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFrenzyPlantRoot,\n};\n\nstatic const union AnimCmd sIngrainOrbAnimCmds[] =\n{\n    ANIMCMD_FRAME(3, 3),\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sIngrainOrbAnimTable[] =\n{\n    sIngrainOrbAnimCmds,\n};\n\nconst struct SpriteTemplate gIngrainOrbSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_ORBS,\n    .paletteTag = ANIM_TAG_ORBS,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sIngrainOrbAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimIngrainOrb,\n};\n\nstatic const union AnimCmd sFallingBagAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 30),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sFallingBagAnimTable[] =\n{\n    sFallingBagAnimCmds,\n};\n\nstatic const union AffineAnimCmd sFallingBagAffineAnimCmds1[] = \n{\n    AFFINEANIMCMD_FRAME(0, 0, -4, 10),\n    AFFINEANIMCMD_FRAME(0, 0, 4, 20),\n    AFFINEANIMCMD_FRAME(0, 0, -4, 10),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sFallingBagAffineAnimCmds2[] = \n{\n    AFFINEANIMCMD_FRAME(0, 0, -1, 2),\n    AFFINEANIMCMD_FRAME(0, 0, 1, 4),\n    AFFINEANIMCMD_FRAME(0, 0, -1, 4),\n    AFFINEANIMCMD_FRAME(0, 0, 1, 4),\n    AFFINEANIMCMD_FRAME(0, 0, -1, 4),\n    AFFINEANIMCMD_FRAME(0, 0, 1, 2),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sFallingBagAffineAnimTable[] = \n{\n    sFallingBagAffineAnimCmds1,\n    sFallingBagAffineAnimCmds2,\n};\n\nconst struct SpriteTemplate gPresentSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ITEM_BAG,\n    .paletteTag = ANIM_TAG_ITEM_BAG,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sFallingBagAnimTable,\n    .images = NULL,\n    .affineAnims = sFallingBagAffineAnimTable,\n    .callback = AnimPresent,\n};\n\nconst struct SpriteTemplate gKnockOffItemSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ITEM_BAG,\n    .paletteTag = ANIM_TAG_ITEM_BAG,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sFallingBagAnimTable,\n    .images = NULL,\n    .affineAnims = sFallingBagAffineAnimTable,\n    .callback = AnimKnockOffItem,\n};\n\nstatic const union AnimCmd sPresentHealParticleAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(8, 4),\n    ANIMCMD_FRAME(12, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sPresentHealParticleAnimTable[] =\n{\n    sPresentHealParticleAnimCmds,\n};\n\nconst struct SpriteTemplate gPresentHealParticleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GREEN_SPARKLE,\n    .paletteTag = ANIM_TAG_GREEN_SPARKLE,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sPresentHealParticleAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimPresentHealParticle,\n};\n\nconst struct SpriteTemplate gItemStealSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ITEM_BAG,\n    .paletteTag = ANIM_TAG_ITEM_BAG,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sFallingBagAnimTable,\n    .images = NULL,\n    .affineAnims = sFallingBagAffineAnimTable,\n    .callback = AnimItemSteal,\n};\n\nstatic const union AffineAnimCmd sTrickBagAffineAnimCmds1[] = \n{\n    AFFINEANIMCMD_FRAME(0, 0, 0, 3),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sTrickBagAffineAnimCmds2[] = \n{\n    AFFINEANIMCMD_FRAME(0, -10, 0, 3),\n    AFFINEANIMCMD_FRAME(0, -6, 0, 3),\n    AFFINEANIMCMD_FRAME(0, -2, 0, 3),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 3),\n    AFFINEANIMCMD_FRAME(0, 2, 0, 3),\n    AFFINEANIMCMD_FRAME(0, 6, 0, 3),\n    AFFINEANIMCMD_FRAME(0, 10, 0, 3),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sTrickBagAffineAnimTable[] = \n{\n    sTrickBagAffineAnimCmds1,\n    sTrickBagAffineAnimCmds2,\n    sFallingBagAffineAnimCmds1,\n    sFallingBagAffineAnimCmds2,\n};\n\nconst struct SpriteTemplate gTrickBagSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ITEM_BAG,\n    .paletteTag = ANIM_TAG_ITEM_BAG,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sFallingBagAnimTable,\n    .images = NULL,\n    .affineAnims = sTrickBagAffineAnimTable,\n    .callback = AnimTrickBag,\n};\n\nstatic const s8 gTrickBagCoordinates[][3] =\n{\n    {5, 24,   1},\n    {0,  4,   0},\n    {8, 16,  -1},\n    {0,  2,   0},\n    {8, 16,   1},\n    {0,  2,   0},\n    {8, 16,   1},\n    {0,  2,   0},\n    {8, 16,   1},\n    {0, 16,   0},\n    {0,  0, 127},\n};\n\nstatic const union AnimCmd sLeafBladeAnimCmds1[] =\n{\n    ANIMCMD_FRAME(28, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sLeafBladeAnimCmds2[] =\n{\n    ANIMCMD_FRAME(32, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sLeafBladeAnimCmds3[] =\n{\n    ANIMCMD_FRAME(20, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sLeafBladeAnimCmds4[] =\n{\n    ANIMCMD_FRAME(28, 1, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sLeafBladeAnimCmds5[] =    \n{\n    ANIMCMD_FRAME(16, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sLeafBladeAnimCmds6[] =    \n{\n    ANIMCMD_FRAME(16, 1, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sLeafBladeAnimCmds7[] =    \n{\n    ANIMCMD_FRAME(28, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sLeafBladeAnimTable[] =\n{\n    sLeafBladeAnimCmds1,\n    sLeafBladeAnimCmds2,\n    sLeafBladeAnimCmds3,\n    sLeafBladeAnimCmds4,\n    sLeafBladeAnimCmds5,\n    sLeafBladeAnimCmds6,\n    sLeafBladeAnimCmds7,\n};\n\nconst struct SpriteTemplate gLeafBladeSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_LEAF,\n    .paletteTag = ANIM_TAG_LEAF,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sLeafBladeAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const union AffineAnimCmd sAromatherapyBigFlowerAffineAnimCmds[] = \n{\n    AFFINEANIMCMD_FRAME(256, 256, 0, 0),\n    AFFINEANIMCMD_FRAME(0, 0, 4, 1),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sAromatherapyBigFlowerAffineAnimTable[] = \n{\n    sAromatherapyBigFlowerAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gAromatherapySmallFlowerSpriteTemplate = \n{\n    .tileTag = ANIM_TAG_FLOWER,\n    .paletteTag = ANIM_TAG_FLOWER,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sPetalDanceSmallFlowerAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFlyingParticle,\n};\n\nconst struct SpriteTemplate gAromatherapyBigFlowerSpriteTemplate = \n{\n    .tileTag = ANIM_TAG_FLOWER,\n    .paletteTag = ANIM_TAG_FLOWER,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = sPetalDanceBigFlowerAnimTable,\n    .images = NULL,\n    .affineAnims = sAromatherapyBigFlowerAffineAnimTable,\n    .callback = AnimFlyingParticle,\n};\n\nstatic const union AffineAnimCmd sSilverWindBigSparkAffineAnimCmds[] = \n{\n    AFFINEANIMCMD_FRAME(256, 256, 0, 0),\n    AFFINEANIMCMD_FRAME(0, 0, -10, 1),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd sSilverWindMediumSparkAffineAnimCmds[] = \n{\n    AFFINEANIMCMD_FRAME(192, 192, 0, 0),\n    AFFINEANIMCMD_FRAME(0, 0, -12, 1),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd sSilverWindSmallSparkAffineAnimCmds[] = \n{\n    AFFINEANIMCMD_FRAME(143, 143, 0, 0),\n    AFFINEANIMCMD_FRAME(0, 0, -15, 1),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sSilverWindBigSparkAffineAnimTable[] = \n{\n    sSilverWindBigSparkAffineAnimCmds,\n};\n\nstatic const union AffineAnimCmd *const sSilverWindMediumSparkAffineAnimTable[] = \n{\n    sSilverWindMediumSparkAffineAnimCmds,\n};\n\nstatic const union AffineAnimCmd *const sSilverWindSmallSparkAffineAnimTable[] = \n{\n    sSilverWindSmallSparkAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gSilverWindBigSparkSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_SPARKLE_6,\n    .paletteTag = ANIM_TAG_SPARKLE_6,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sSilverWindBigSparkAffineAnimTable,\n    .callback = AnimFlyingParticle,\n};\n\nconst struct SpriteTemplate gSilverWindMediumSparkSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_SPARKLE_6,\n    .paletteTag = ANIM_TAG_SPARKLE_6,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sSilverWindMediumSparkAffineAnimTable,\n    .callback = AnimFlyingParticle,\n};\n\nconst struct SpriteTemplate gSilverWindSmallSparkSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARKLE_6,\n    .paletteTag = ANIM_TAG_SPARKLE_6,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sSilverWindSmallSparkAffineAnimTable,\n    .callback = AnimFlyingParticle,\n};\n\nstatic const u16 sMagicalLeafBlendColors[] =\n{\n    RGB(31, 0, 0),\n    RGB(31, 19, 0),\n    RGB(31, 31, 0),\n    RGB(0, 31, 0),\n    RGB(5, 14, 31),\n    RGB(22, 10, 31),\n    RGB(22, 21, 31),\n};\n\nconst struct SpriteTemplate gNeedleArmSpikeSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_GREEN_SPIKE,\n    .paletteTag = ANIM_TAG_GREEN_SPIKE,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimNeedleArmSpike,\n};\n\nstatic const union AnimCmd sAnim_Whip[] =    \n{\n    ANIMCMD_FRAME(64, 3),\n    ANIMCMD_FRAME(80, 3),\n    ANIMCMD_FRAME(96, 3),\n    ANIMCMD_FRAME(112, 6),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Whip_Flipped[] =    \n{\n    ANIMCMD_FRAME(64, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(80, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(96, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(112, 6, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_Whip[] =    \n{\n    sAnim_Whip,\n    sAnim_Whip_Flipped,\n};\n\nconst struct SpriteTemplate gSlamHitSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SLAM_HIT,\n    .paletteTag = ANIM_TAG_SLAM_HIT,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_Whip,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWhipHit,\n};\n\nconst struct SpriteTemplate gVineWhipSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WHIP_HIT,\n    .paletteTag = ANIM_TAG_WHIP_HIT,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_Whip,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWhipHit,\n};\n\nstatic const union AnimCmd sAnim_SlidingHit[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(48, 4),\n    ANIMCMD_FRAME(64, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_SlidingHit[] =\n{\n    sAnim_SlidingHit,\n};\n\n// Unused\nstatic const struct SpriteTemplate sSlidingHit1SpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HIT,\n    .paletteTag = ANIM_TAG_HIT,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_SlidingHit,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSlidingHit,\n};\n\n// Unused\nstatic const struct SpriteTemplate sSlidingHit2SpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HIT_2,\n    .paletteTag = ANIM_TAG_HIT_2,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_SlidingHit,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSlidingHit,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlickeringPunch_Normal[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedTopLeft[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, 32, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedLeft[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, 64, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedBottomLeft[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, 96, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlickeringPunch_UpsideDown[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, -128, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedBottomRight[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, -96, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedRight[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, -64, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedTopRight[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, -32, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_FlickeringPunch[] = \n{\n    sAffineAnim_FlickeringPunch_Normal,\n    sAffineAnim_FlickeringPunch_TurnedTopLeft,\n    sAffineAnim_FlickeringPunch_TurnedLeft,\n    sAffineAnim_FlickeringPunch_TurnedBottomLeft,\n    sAffineAnim_FlickeringPunch_UpsideDown,\n    sAffineAnim_FlickeringPunch_TurnedBottomRight,\n    sAffineAnim_FlickeringPunch_TurnedRight,\n    sAffineAnim_FlickeringPunch_TurnedTopRight,\n};\n\n// Unused\nstatic const struct SpriteTemplate sFlickeringPunchSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_FlickeringPunch,\n    .callback = AnimFlickeringPunch,\n};\n\nstatic const union AnimCmd sCuttingSliceAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(32, 5),\n    ANIMCMD_FRAME(48, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sCuttingSliceAnimTable[] =\n{\n    sCuttingSliceAnimCmds,\n};\n\nconst struct SpriteTemplate gCuttingSliceSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CUT,\n    .paletteTag = ANIM_TAG_CUT,\n    .oam = &gOamData_AffineOff_ObjBlend_32x32,\n    .anims = sCuttingSliceAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimCuttingSlice,\n};\n\nconst struct SpriteTemplate gAirCutterSliceSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CUT,\n    .paletteTag = ANIM_TAG_CUT,\n    .oam = &gOamData_AffineOff_ObjBlend_32x32,\n    .anims = sCuttingSliceAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimAirCutterSlice,\n};\n\nstatic const union AnimCmd sAnim_CirclingMusicNote_Eighth[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_CirclingMusicNote_BeamedEighth[] =\n{\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_CirclingMusicNote_SlantedBeamedEighth[] =\n{\n    ANIMCMD_FRAME(8, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_CirclingMusicNote_Quarter[] =\n{\n    ANIMCMD_FRAME(12, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_CirclingMusicNote_QuarterRest[] =\n{\n    ANIMCMD_FRAME(16, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_CirclingMusicNote_EighthRest[] =\n{\n    ANIMCMD_FRAME(20, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_CirclingMusicNote_Eighth_Flipped[] =\n{\n    ANIMCMD_FRAME(0, 1, .vFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_CirclingMusicNote_BeamedEighth_Flipped[] =\n{\n    ANIMCMD_FRAME(4, 1, .vFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_CirclingMusicNote_SlantedBeamedEighth_Flipped[] =\n{\n    ANIMCMD_FRAME(8, 1, .vFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_CirclingMusicNote_Quarter_Flipped[] =\n{\n    ANIMCMD_FRAME(12, 1, .vFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_CirclingMusicNote[] =\n{\n    sAnim_CirclingMusicNote_Eighth,\n    sAnim_CirclingMusicNote_BeamedEighth,\n    sAnim_CirclingMusicNote_SlantedBeamedEighth,\n    sAnim_CirclingMusicNote_Quarter,\n    sAnim_CirclingMusicNote_QuarterRest,\n    sAnim_CirclingMusicNote_EighthRest,\n    sAnim_CirclingMusicNote_Eighth_Flipped,\n    sAnim_CirclingMusicNote_BeamedEighth_Flipped,\n    sAnim_CirclingMusicNote_SlantedBeamedEighth_Flipped,\n    sAnim_CirclingMusicNote_Quarter_Flipped,\n};\n\n// Unused\nstatic const struct SpriteTemplate sCirclingMusicNoteSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUSIC_NOTES,\n    .paletteTag = ANIM_TAG_MUSIC_NOTES,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sAnims_CirclingMusicNote,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimCirclingMusicNote,\n};\n\nconst struct SpriteTemplate gProtectSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_PROTECT,\n    .paletteTag = ANIM_TAG_PROTECT,\n    .oam = &gOamData_AffineOff_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimProtect,\n};\n\nstatic const union AffineAnimCmd sMilkBottleAffineAnimCmds1[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sMilkBottleAffineAnimCmds2[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 2, 12),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 6),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -2, 24),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 6),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 2, 12),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sMilkBottleAffineAnimTable[] =\n{\n    sMilkBottleAffineAnimCmds1,\n    sMilkBottleAffineAnimCmds2,\n};\n\nconst struct SpriteTemplate gMilkBottleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MILK_BOTTLE,\n    .paletteTag = ANIM_TAG_MILK_BOTTLE,\n    .oam = &gOamData_AffineNormal_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sMilkBottleAffineAnimTable,\n    .callback = AnimMilkBottle,\n};\n\nstatic const union AnimCmd sGrantingStarsAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 7),\n    ANIMCMD_FRAME(16, 7),\n    ANIMCMD_FRAME(32, 7),\n    ANIMCMD_FRAME(48, 7),\n    ANIMCMD_FRAME(64, 7),\n    ANIMCMD_FRAME(80, 7),\n    ANIMCMD_FRAME(96, 7),\n    ANIMCMD_FRAME(112, 7),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sGrantingStarsAnimTable[] =\n{\n    sGrantingStarsAnimCmds,\n};\n\nconst struct SpriteTemplate gGrantingStarsSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_SPARKLE_2,\n    .paletteTag = ANIM_TAG_SPARKLE_2,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sGrantingStarsAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimGrantingStars,\n};\n\nconst struct SpriteTemplate gSparklingStarsSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_SPARKLE_2,\n    .paletteTag = ANIM_TAG_SPARKLE_2,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sGrantingStarsAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSparklingStars,\n};\n\nstatic const union AnimCmd sAnim_BubbleBurst[] =\n{\n    ANIMCMD_FRAME(0, 10),\n    ANIMCMD_FRAME(4, 10),\n    ANIMCMD_FRAME(8, 10),\n    ANIMCMD_FRAME(12, 10),\n    ANIMCMD_FRAME(16, 26),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(20, 5),\n    ANIMCMD_FRAME(24, 15),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BubbleBurst_Flipped[] =\n{\n    ANIMCMD_FRAME(0, 10, .hFlip = TRUE),\n    ANIMCMD_FRAME(4, 10, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 10, .hFlip = TRUE),\n    ANIMCMD_FRAME(12, 10, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 26, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 5, .hFlip = TRUE),\n    ANIMCMD_FRAME(20, 5, .hFlip = TRUE),\n    ANIMCMD_FRAME(24, 15, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_BubbleBurst[] =\n{\n    sAnim_BubbleBurst,\n    sAnim_BubbleBurst_Flipped,\n};\n\n// Unused\nstatic const struct SpriteTemplate sBubbleBurstSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BUBBLE_BURST,\n    .paletteTag = ANIM_TAG_BUBBLE_BURST,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sAnims_BubbleBurst,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBubbleBurst,\n};\n\nstatic const union AnimCmd sSleepLetterZAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 40),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSleepLetterZAnimTable[] =\n{\n    sSleepLetterZAnimCmds,\n};\n\nstatic const union AffineAnimCmd sSleepLetterZAffineAnimCmds1[] =\n{\n    AFFINEANIMCMD_FRAME(0x14, 0x14, -30, 0),\n    AFFINEANIMCMD_FRAME(0x8, 0x8, 1, 24),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sSleepLetterZAffineAnimCmds1_2[] =\n{\n    AFFINEANIMCMD_LOOP(0),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24),\n    AFFINEANIMCMD_LOOP(10),\n};\n\nstatic const union AffineAnimCmd sSleepLetterZAffineAnimCmds2[] =\n{\n    AFFINEANIMCMD_FRAME(0x14, 0x14, 30, 0),\n    AFFINEANIMCMD_FRAME(0x8, 0x8, -1, 24),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sSleepLetterZAffineAnimCmds2_2[] =\n{\n    AFFINEANIMCMD_LOOP(0),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 24),\n    AFFINEANIMCMD_LOOP(10),\n};\n\nstatic const union AffineAnimCmd *const sSleepLetterZAffineAnimTable[] =\n{\n    sSleepLetterZAffineAnimCmds1,\n    sSleepLetterZAffineAnimCmds2,\n};\n\nconst struct SpriteTemplate gSleepLetterZSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_LETTER_Z,\n    .paletteTag = ANIM_TAG_LETTER_Z,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sSleepLetterZAnimTable,\n    .images = NULL,\n    .affineAnims = sSleepLetterZAffineAnimTable,\n    .callback = AnimSleepLetterZ,\n};\n\nconst struct SpriteTemplate gLockOnTargetSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_LOCK_ON,\n    .paletteTag = ANIM_TAG_LOCK_ON,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimLockOnTarget,\n};\n\nconst struct SpriteTemplate gLockOnMoveTargetSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_LOCK_ON,\n    .paletteTag = ANIM_TAG_LOCK_ON,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimLockOnMoveTarget,\n};\n\nstatic const s8 sInclineMonCoordTable[][2] =\n{\n    { 64,  64},\n    {  0, -64},\n    {-64,  64},\n    { 32, -32},\n};\n\nconst struct SpriteTemplate gBowMonSpriteTemplate =    \n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBowMon,\n};\n\n// Unused\n// Same as BowMon above but without backing up\nstatic const struct SpriteTemplate sTipMonSpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimTipMon,\n};\n\nstatic const union AnimCmd sSlashSliceAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(48, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSlashSliceAnimCmds2[] =\n{\n    ANIMCMD_FRAME(48, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSlashSliceAnimTable[] =\n{\n    sSlashSliceAnimCmds1,\n    sSlashSliceAnimCmds2,\n};\n\nconst struct SpriteTemplate gSlashSliceSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_SLASH,\n    .paletteTag = ANIM_TAG_SLASH,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sSlashSliceAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSlashSlice,\n};\n\nconst struct SpriteTemplate gFalseSwipeSliceSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SLASH_2,\n    .paletteTag = ANIM_TAG_SLASH_2,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sSlashSliceAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFalseSwipeSlice,\n};\n\nconst struct SpriteTemplate gFalseSwipePositionedSliceSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SLASH_2,\n    .paletteTag = ANIM_TAG_SLASH_2,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sSlashSliceAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFalseSwipePositionedSlice,\n};\n\nstatic const union AnimCmd sEndureEnergyAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(8, 12),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(24, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sEndureEnergyAnimTable[] =\n{\n    sEndureEnergyAnimCmds,\n};\n\nconst struct SpriteTemplate gEndureEnergySpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FOCUS_ENERGY,\n    .paletteTag = ANIM_TAG_FOCUS_ENERGY,\n    .oam = &gOamData_AffineOff_ObjNormal_16x32,\n    .anims = sEndureEnergyAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimEndureEnergy,\n};\n\nstatic const union AnimCmd sSharpenSphereAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 18),\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(16, 18),\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(16, 6),\n    ANIMCMD_FRAME(32, 18),\n    ANIMCMD_FRAME(16, 6),\n    ANIMCMD_FRAME(32, 6),\n    ANIMCMD_FRAME(48, 18),\n    ANIMCMD_FRAME(32, 6),\n    ANIMCMD_FRAME(48, 6),\n    ANIMCMD_FRAME(64, 18),\n    ANIMCMD_FRAME(48, 6),\n    ANIMCMD_FRAME(64, 54),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSharpenSphereAnimTable[] =\n{\n    sSharpenSphereAnimCmds,\n};\n\nconst struct SpriteTemplate gSharpenSphereSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPHERE_TO_CUBE,\n    .paletteTag = ANIM_TAG_SPHERE_TO_CUBE,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sSharpenSphereAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSharpenSphere,\n};\n\nconst struct SpriteTemplate gOctazookaBallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BLACK_BALL,\n    .paletteTag = ANIM_TAG_BLACK_BALL,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = TranslateAnimSpriteToTargetMonLocation,\n};\n\nstatic const union AnimCmd sOctazookaAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_FRAME(64, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sOctazookaAnimTable[] =\n{\n    sOctazookaAnimCmds,\n};\n\nconst struct SpriteTemplate gOctazookaSmokeSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GRAY_SMOKE,\n    .paletteTag = ANIM_TAG_GRAY_SMOKE,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sOctazookaAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSpriteOnMonPos,\n};\n\nstatic const union AnimCmd sConversionAnimCmds[] =\n{\n    ANIMCMD_FRAME(3, 5),\n    ANIMCMD_FRAME(2, 5),\n    ANIMCMD_FRAME(1, 5),\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sConversionAnimTable[] =\n{\n    sConversionAnimCmds,\n};\n\nstatic const union AffineAnimCmd sConversionAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sConversionAffineAnimTable[] =\n{\n    sConversionAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gConversionSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CONVERSION,\n    .paletteTag = ANIM_TAG_CONVERSION,\n    .oam = &gOamData_AffineDouble_ObjBlend_8x8,\n    .anims = sConversionAnimTable,\n    .images = NULL,\n    .affineAnims = sConversionAffineAnimTable,\n    .callback = AnimConversion,\n};\n\nstatic const union AnimCmd sConversion2AnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(1, 5),\n    ANIMCMD_FRAME(2, 5),\n    ANIMCMD_FRAME(3, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sConversion2AnimTable[] =\n{\n    sConversion2AnimCmds,\n};\n\nconst struct SpriteTemplate gConversion2SpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CONVERSION,\n    .paletteTag = ANIM_TAG_CONVERSION,\n    .oam = &gOamData_AffineDouble_ObjBlend_8x8,\n    .anims = sConversion2AnimTable,\n    .images = NULL,\n    .affineAnims = sConversionAffineAnimTable,\n    .callback = AnimConversion2,\n};\n\nconst struct SpriteTemplate gMoonSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MOON,\n    .paletteTag = ANIM_TAG_MOON,\n    .oam = &gOamData_AffineOff_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMoon,\n};\n\nstatic const union AnimCmd sMoonlightSparkleAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(8, 8),\n    ANIMCMD_FRAME(12, 8),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sMoonlightSparkleAnimTable[] =\n{\n    sMoonlightSparkleAnimCmds,\n};\n\nconst struct SpriteTemplate gMoonlightSparkleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GREEN_SPARKLE,\n    .paletteTag = ANIM_TAG_GREEN_SPARKLE,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sMoonlightSparkleAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMoonlightSparkle,\n};\n\nstatic const union AnimCmd sHealingBlueStarAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(16, 2),\n    ANIMCMD_FRAME(32, 2),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_FRAME(64, 5),\n    ANIMCMD_FRAME(80, 3),\n    ANIMCMD_FRAME(96, 2),\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sHealingBlueStarAnimTable[] =\n{\n    sHealingBlueStarAnimCmds,\n};\n\nconst struct SpriteTemplate gHealingBlueStarSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BLUE_STAR,\n    .paletteTag = ANIM_TAG_BLUE_STAR,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sHealingBlueStarAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSpriteOnMonPos,\n};\n\nconst struct SpriteTemplate gHornHitSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HORN_HIT,\n    .paletteTag = ANIM_TAG_HORN_HIT,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimHornHit,\n};\n\nstatic const union AnimCmd sSuperFangAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(16, 2),\n    ANIMCMD_FRAME(32, 2),\n    ANIMCMD_FRAME(48, 2),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSuperFangAnimTable[] =\n{\n    sSuperFangAnimCmds,\n};\n\nconst struct SpriteTemplate gSuperFangSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FANG_ATTACK,\n    .paletteTag = ANIM_TAG_FANG_ATTACK,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sSuperFangAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSuperFang,\n};\n\nstatic const union AnimCmd sWavyMusicNotesAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 10),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sWavyMusicNotesAnimCmds2[] =\n{\n    ANIMCMD_FRAME(4, 10),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sWavyMusicNotesAnimCmds3[] =\n{\n    ANIMCMD_FRAME(8, 41),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sWavyMusicNotesAnimCmds4[] =\n{\n    ANIMCMD_FRAME(12, 10),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sWavyMusicNotesAnimCmds5[] =\n{\n    ANIMCMD_FRAME(16, 10),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sWavyMusicNotesAnimCmds6[] =\n{\n    ANIMCMD_FRAME(20, 10),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sWavyMusicNotesAnimCmds7[] =\n{\n    ANIMCMD_FRAME(0, 10, .vFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sWavyMusicNotesAnimCmds8[] =\n{\n    ANIMCMD_FRAME(4, 10, .vFlip = TRUE),\n    ANIMCMD_END,\n};\n\nconst union AnimCmd *const gMusicNotesAnimTable[] =    \n{\n    sWavyMusicNotesAnimCmds1,\n    sWavyMusicNotesAnimCmds2,\n    sWavyMusicNotesAnimCmds3,\n    sWavyMusicNotesAnimCmds4,\n    sWavyMusicNotesAnimCmds5,\n    sWavyMusicNotesAnimCmds6,\n    sWavyMusicNotesAnimCmds7,\n    sWavyMusicNotesAnimCmds8,\n};\n\nstatic const union AffineAnimCmd sWavyMusicNotesAffineAnimCmds[] =    \n{\n    AFFINEANIMCMD_FRAME(0xC, 0xC, 0, 16),\n    AFFINEANIMCMD_FRAME(0xFFF4, 0xFFF4, 0, 16),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sMusicNotesAffineAnimTable[] =    \n{\n    sWavyMusicNotesAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gWavyMusicNotesSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_MUSIC_NOTES,\n    .paletteTag = ANIM_TAG_MUSIC_NOTES,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x16,\n    .anims = gMusicNotesAnimTable,\n    .images = NULL,\n    .affineAnims = sMusicNotesAffineAnimTable,\n    .callback = AnimWavyMusicNotes,\n};\n\nstatic const u16 sParticlesColorBlendTable[][6] =    \n{\n    {ANIM_TAG_MUSIC_NOTES,     RGB_WHITE, RGB(31, 26, 28), RGB(31, 22, 26), RGB(31, 17, 24), RGB(31, 13, 22)},\n    {ANIM_TAG_BENT_SPOON,      RGB_WHITE, RGB(25, 31, 26), RGB(20, 31, 21), RGB(15, 31, 16), RGB(10, 31, 12)},\n    {ANIM_TAG_SPHERE_TO_CUBE,  RGB_WHITE, RGB(31, 31, 24), RGB(31, 31, 17), RGB(31, 31, 10), RGB(31, 31, 3)},\n    {ANIM_TAG_LARGE_FRESH_EGG, RGB_WHITE, RGB(26, 28, 31), RGB(21, 26, 31), RGB(16, 24, 31), RGB(12, 22, 31)},\n};\n\nconst struct SpriteTemplate gFastFlyingMusicNotesSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUSIC_NOTES,\n    .paletteTag = ANIM_TAG_MUSIC_NOTES,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x16,\n    .anims = gMusicNotesAnimTable,\n    .images = NULL,\n    .affineAnims = sMusicNotesAffineAnimTable,\n    .callback = AnimFlyingMusicNotes,\n};\n\nconst struct SpriteTemplate gBellyDrumHandSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_PURPLE_HAND_OUTLINE,\n    .paletteTag = ANIM_TAG_PURPLE_HAND_OUTLINE,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBellyDrumHand,\n};\n\nstatic const union AffineAnimCmd sSlowFlyingMusicNotesAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0),\n    AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 1),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sSlowFlyinsMusicNotesAffineAnimTable[] =\n{\n    sSlowFlyingMusicNotesAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gSlowFlyingMusicNotesSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUSIC_NOTES,\n    .paletteTag = ANIM_TAG_MUSIC_NOTES,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x16,\n    .anims = gMusicNotesAnimTable,\n    .images = NULL,\n    .affineAnims = sSlowFlyinsMusicNotesAffineAnimTable,\n    .callback = AnimSlowFlyingMusicNotes,\n};\n\nstatic const union AnimCmd sMetronomeThroughtBubbleAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(48, 2, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sMetronomeThroughtBubbleAnimCmds3[] =\n{\n    ANIMCMD_FRAME(48, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 2, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sMetronomeThroughtBubbleAnimCmds2[] =\n{\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(16, 2),\n    ANIMCMD_FRAME(32, 2),\n    ANIMCMD_FRAME(48, 2),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sMetronomeThroughtBubbleAnimCmds4[] =\n{\n    ANIMCMD_FRAME(48, 2),\n    ANIMCMD_FRAME(32, 2),\n    ANIMCMD_FRAME(16, 2),\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sMetronomeThroughtBubbleAnimTable[] =\n{\n    sMetronomeThroughtBubbleAnimCmds1,\n    sMetronomeThroughtBubbleAnimCmds2,\n    sMetronomeThroughtBubbleAnimCmds3,\n    sMetronomeThroughtBubbleAnimCmds4,\n};\n\nconst struct SpriteTemplate gThoughtBubbleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_THOUGHT_BUBBLE,\n    .paletteTag = ANIM_TAG_THOUGHT_BUBBLE,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sMetronomeThroughtBubbleAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimThoughtBubble,\n};\n\nstatic const union AffineAnimCmd sMetronomeFingerAffineAnimCmds1[] =\n{\n    AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),\n    AFFINEANIMCMD_FRAME(0x1E, 0x1E, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sMetronomeFingerAffineAnimCmds2[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 11),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 11),\n    AFFINEANIMCMD_LOOP(2),\n    AFFINEANIMCMD_FRAME(-0x1E, -0x1E, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sMetronomeFingerAffineAnimCmds2_2[] =\n{\n    AFFINEANIMCMD_FRAME(16, 16, 0, 0),\n    AFFINEANIMCMD_FRAME(30, 30, 0, 8),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 16),\n    AFFINEANIMCMD_LOOP(0),\n    AFFINEANIMCMD_FRAME(0, 0, 4, 11),\n    AFFINEANIMCMD_FRAME(0, 0, -4, 11),\n    AFFINEANIMCMD_LOOP(2),\n    AFFINEANIMCMD_FRAME(-30, -30, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sMetronomeFingerAffineAnimTable[] =\n{\n    sMetronomeFingerAffineAnimCmds1,\n    sMetronomeFingerAffineAnimCmds2,\n};\n\nconst struct SpriteTemplate gMetronomeFingerSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FINGER,\n    .paletteTag = ANIM_TAG_FINGER,\n    .oam = &gOamData_AffineDouble_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sMetronomeFingerAffineAnimTable,\n    .callback = AnimMetronomeFinger,\n};\n\nconst struct SpriteTemplate gFollowMeFingerSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FINGER,\n    .paletteTag = ANIM_TAG_FINGER,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sMetronomeFingerAffineAnimTable,\n    .callback = AnimFollowMeFinger,\n};\n\nstatic const union AnimCmd sTauntFingerAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sTauntFingerAnimCmds2[] =\n{\n    ANIMCMD_FRAME(0, 1, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sTauntFingerAnimCmds3[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sTauntFingerAnimCmds4[] =\n{\n    ANIMCMD_FRAME(0, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 4, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sTauntFingerAnimTable[] =\n{\n    sTauntFingerAnimCmds1,\n    sTauntFingerAnimCmds2,\n    sTauntFingerAnimCmds3,\n    sTauntFingerAnimCmds4,\n};\n\nconst struct SpriteTemplate gTauntFingerSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FINGER_2,\n    .paletteTag = ANIM_TAG_FINGER_2,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sTauntFingerAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimTauntFinger,\n};\n\n// Animates the falling particles that horizontally wave back and forth.\n// Used by Sleep Powder, Stun Spore, and Poison Powder.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: total duration in frames\n// arg 3: vertical movement speed (sub-pixel value)\n// arg 4: wave amplitude\n// arg 5: wave speed\nstatic void AnimMovePowderParticle(struct Sprite* sprite)\n{\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[3];\n\n    if (GetBattlerSide(gBattleAnimAttacker))\n    {\n        sprite->data[3] = -gBattleAnimArgs[4];\n    }\n    else\n    {\n        sprite->data[3] = gBattleAnimArgs[4];\n    }\n\n    sprite->data[4] = gBattleAnimArgs[5];\n    sprite->callback = AnimMovePowderParticle_Step;\n}\n\nstatic void AnimMovePowderParticle_Step(struct Sprite* sprite)\n{\n    if (sprite->data[0] > 0)\n    {\n        sprite->data[0]--;\n        sprite->y2 = sprite->data[2] >> 8;\n        sprite->data[2] += sprite->data[1];\n        sprite->x2 = Sin(sprite->data[5], sprite->data[3]);\n        sprite->data[5] = (sprite->data[5] + sprite->data[4]) & 0xFF;\n    }\n    else\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\n// Moves an energy orb towards the center of the mon.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: duration\nstatic void AnimPowerAbsorptionOrb(struct Sprite* sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n}\n\n// Moves an orb in a straight line towards the target mon.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: duration\n// arg 3: sprite anim number\nstatic void AnimSolarBeamBigOrb(struct Sprite* sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    StartSpriteAnim(sprite, gBattleAnimArgs[3]);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Moves a small orb in a wavy pattern towards the target mon.\n// The small orb \"circles\" the big orbs in AnimSolarBeamBigOrb.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: duration\n// arg 3: initial wave offset\nstatic void AnimSolarBeamSmallOrb(struct Sprite* sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    InitAnimLinearTranslation(sprite);\n    sprite->data[5] = gBattleAnimArgs[3];\n    sprite->callback = AnimSolarBeamSmallOrb_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimSolarBeamSmallOrb_Step(struct Sprite* sprite)\n{\n    if (AnimTranslateLinear(sprite))\n    {\n        DestroySprite(sprite);\n    }\n    else\n    {\n        if (sprite->data[5] > 0x7F)\n            sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1;\n        else\n            sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 6;\n\n        sprite->x2 += Sin(sprite->data[5], 5);\n        sprite->y2 += Cos(sprite->data[5], 14);\n        sprite->data[5] = (sprite->data[5] + 15) & 0xFF;\n    }\n}\n\n// Creates 15 small secondary orbs used in the solarbeam anim effect.\n// There is a 7-frame delay between each of them.\n// No args.\nvoid AnimTask_CreateSmallSolarBeamOrbs(u8 taskId)\n{\n    if (--gTasks[taskId].data[0] == -1)\n    {\n        gTasks[taskId].data[1]++;\n        gTasks[taskId].data[0] = 6;\n        gBattleAnimArgs[0] = 15;\n        gBattleAnimArgs[1] = 0;\n        gBattleAnimArgs[2] = 80;\n        gBattleAnimArgs[3] = 0;\n        CreateSpriteAndAnimate(&gSolarBeamSmallOrbSpriteTemplate, 0, 0, GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1);\n    }\n\n    if (gTasks[taskId].data[1] == 15)\n        DestroyAnimVisualTask(taskId);\n}\n\n// Moves an orb from the target mon to the attacking mon in an arc-like fashion.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: wave amplitude\n// arg 3: wave period (lower means faster wave)\nstatic void AnimAbsorptionOrb(struct Sprite* sprite)\n{\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[5] = gBattleAnimArgs[2];\n    InitAnimArcTranslation(sprite);\n    sprite->callback = AnimAbsorptionOrb_Step;\n}\n\nstatic void AnimAbsorptionOrb_Step(struct Sprite* sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n        DestroyAnimSprite(sprite);\n}\n\n// Moves an orb in a wave-like fashion towards the target mon. The wave's\n// properties and the sprite anim are randomly determined.\nstatic void AnimHyperBeamOrb(struct Sprite* sprite)\n{\n    u16 speed;\n    u16 animNum = Random();\n\n    StartSpriteAnim(sprite, animNum % 8);\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->x -= 20;\n    else\n        sprite->x += 20;\n\n    speed = Random();\n    sprite->data[0] = (speed & 31) + 64;\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    InitAnimFastLinearTranslationWithSpeed(sprite);\n    sprite->data[5] = Random() & 0xFF;\n    sprite->data[6] = sprite->subpriority;\n    sprite->callback = AnimHyperBeamOrb_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimHyperBeamOrb_Step(struct Sprite* sprite)\n{\n    if (AnimFastTranslateLinear(sprite))\n    {\n        DestroyAnimSprite(sprite);\n    }\n    else\n    {\n        sprite->y2 += Cos(sprite->data[5], 12);\n        if (sprite->data[5] < 0x7F)\n            sprite->subpriority = sprite->data[6];\n        else\n            sprite->subpriority = sprite->data[6] + 1;\n\n        sprite->data[5] += 24;\n        sprite->data[5] &= 0xFF;\n    }\n}\n\n// seed (sprouts a sapling from a seed.)\n// Used by Leech Seed.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: target x pixel offset\n// arg 3: target y pixel offset\n// arg 4: duration\n// arg 5: wave amplitude\nstatic void AnimLeechSeed(struct Sprite* sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[2];\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[3];\n    sprite->data[5] = gBattleAnimArgs[5];\n    InitAnimArcTranslation(sprite);\n    sprite->callback = AnimLeechSeed_Step;\n}\n\nstatic void AnimLeechSeed_Step(struct Sprite* sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n    {\n        sprite->invisible = TRUE;\n        sprite->data[0] = 10;\n        sprite->callback = WaitAnimForDuration;\n        StoreSpriteCallbackInData6(sprite, AnimLeechSeedSprouts);\n    }\n}\n\nstatic void AnimLeechSeedSprouts(struct Sprite* sprite)\n{\n    sprite->invisible = FALSE;\n    StartSpriteAnim(sprite, 1);\n    sprite->data[0] = 60;\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Moves a spore particle in a halo around the target mon.\n// The sprite's priority is updated to give the effect of going\n// behind the mon's sprite.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: initial wave offset\n// arg 3: duration\n// arg 4: blend (0 = off, 1 = on)\nstatic void AnimSporeParticle(struct Sprite* sprite)\n{\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    StartSpriteAnim(sprite, gBattleAnimArgs[4]);\n    if (gBattleAnimArgs[4] == 1)\n        sprite->oam.objMode = ST_OAM_OBJ_BLEND;\n\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->data[1] = gBattleAnimArgs[2];\n    sprite->callback = AnimSporeParticle_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimSporeParticle_Step(struct Sprite* sprite)\n{\n    sprite->x2 = Sin(sprite->data[1], 32);\n    sprite->y2 = Cos(sprite->data[1], -3) + ((sprite->data[2] += 24) >> 8);\n    if ((u16)(sprite->data[1] - 0x40) < 0x80)\n    {\n        sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget);\n    }\n    else\n    {\n        u8 priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1;\n        if (priority > 3)\n            priority = 3;\n\n        sprite->oam.priority = priority;\n    }\n\n    sprite->data[1] += 2;\n    sprite->data[1] &= 0xFF;\n    if (--sprite->data[0] == -1)\n        DestroyAnimSprite(sprite);\n}\n\n// In a double battle, Updates the mon sprite background priorities to allow\n// the circling effect controlled by AnimSporeParticle.\n// No args.\nvoid AnimTask_SporeDoubleBattle(u8 taskId)\n{\n    if (IsContest() || !IsDoubleBattle())\n    {\n        DestroyAnimVisualTask(taskId);\n    }\n    else\n    {\n        if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1)\n            SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 3);\n        else\n            SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\n// Rotates a big flower around the attacking mon, and slowly floats\n// downward.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: target y pixel offset\n// arg 3: duration\nstatic void AnimPetalDanceBigFlower(struct Sprite* sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, FALSE);\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = sprite->x;\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];\n    InitAnimLinearTranslation(sprite);\n    sprite->data[5] = 0x40;\n    sprite->callback = AnimPetalDanceBigFlower_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimPetalDanceBigFlower_Step(struct Sprite* sprite)\n{\n    if (!AnimTranslateLinear(sprite))\n    {\n        sprite->x2 += Sin(sprite->data[5], 32);\n        sprite->y2 += Cos(sprite->data[5], -5);\n        if ((u16)(sprite->data[5] - 0x40) < 0x80)\n            sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1;\n        else\n            sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) + 1;\n\n        sprite->data[5] = (sprite->data[5] + 5) & 0xFF;\n    }\n    else\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\n// Slowly floats a small flower downard, while swaying from right to left.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: target y pixel offset\n// arg 3: duration\nstatic void AnimPetalDanceSmallFlower(struct Sprite* sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = sprite->x;\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];\n    InitAnimLinearTranslation(sprite);\n    sprite->data[5] = 0x40;\n    sprite->callback = AnimPetalDanceSmallFlower_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimPetalDanceSmallFlower_Step(struct Sprite* sprite)\n{\n    if (!AnimTranslateLinear(sprite))\n    {\n        sprite->x2 += Sin(sprite->data[5], 8);\n        if ((u16)(sprite->data[5] - 59) < 5 || (u16)(sprite->data[5] - 187) < 5)\n            sprite->oam.matrixNum ^= ST_OAM_HFLIP;\n\n        sprite->data[5] += 5;\n        sprite->data[5] &= 0xFF;\n    }\n    else\n    {\n       DestroyAnimSprite(sprite);\n    }\n}\n\n// Shoots a leaf upward, then floats it downward while swaying back and forth.\n// arg 0: upward x delta per frame\n// arg 1: upward y delta per frame\n// arg 2: upward duration\nstatic void AnimRazorLeafParticle(struct Sprite* sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[0] = gBattleAnimArgs[0];\n    sprite->data[1] = gBattleAnimArgs[1];\n    sprite->data[2] = gBattleAnimArgs[2];\n    sprite->callback = AnimRazorLeafParticle_Step1;\n}\n\nstatic void AnimRazorLeafParticle_Step1(struct Sprite* sprite)\n{\n    if (!sprite->data[2])\n    {\n        if (sprite->data[1] & 1)\n        {\n            sprite->data[0] = 0x80;\n            sprite->data[1] = 0;\n            sprite->data[2] = 0;\n        }\n        else\n        {\n            sprite->data[0] = 0;\n            sprite->data[1] = 0;\n            sprite->data[2] = 0;\n        }\n        sprite->callback = AnimRazorLeafParticle_Step2;\n    }\n    else\n    {\n        sprite->data[2]--;\n        sprite->x += sprite->data[0];\n        sprite->y += sprite->data[1];\n    }\n}\n\nstatic void AnimRazorLeafParticle_Step2(struct Sprite* sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker))\n        sprite->x2 = -Sin(sprite->data[0], 25);\n    else\n        sprite->x2 = Sin(sprite->data[0], 25);\n\n    sprite->data[0] += 2;\n    sprite->data[0] &= 0xFF;\n    sprite->data[1]++;\n    if (!(sprite->data[1] & 1))\n        sprite->y2++;\n\n    if (sprite->data[1] > 80)\n        DestroyAnimSprite(sprite);\n}\n\n// Animates a sprite that moves linearly from one location to another, with a\n// single-cycle sine wave added to the y position along the way.\n// Used by Razor Leaf and Magical Leaf.\n// arg 0: initial x offset\n// arg 1: initial y offset\n// arg 2: target x offset\n// arg 3: target y offset\n// arg 4: translation duration\n// arg 5: wave amplitude\n// arg 6: target between double battle opponents (boolean)\nstatic void AnimTranslateLinearSingleSineWave(struct Sprite* sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n\n    sprite->data[0] = gBattleAnimArgs[4];\n    if (!gBattleAnimArgs[6])\n    {\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    }\n    else\n    {\n        SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->data[2], &sprite->data[4]);\n        sprite->data[2] += gBattleAnimArgs[2];\n        sprite->data[4] += gBattleAnimArgs[3];\n    }\n\n    sprite->data[5] = gBattleAnimArgs[5];\n    InitAnimArcTranslation(sprite);\n    if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))\n        sprite->data[0] = 1;\n    else\n        sprite->data[0] = 0;\n\n    sprite->callback = AnimTranslateLinearSingleSineWave_Step;\n}\n\nstatic void AnimTranslateLinearSingleSineWave_Step(struct Sprite* sprite)\n{\n    bool8 destroy = FALSE;\n    s16 a = sprite->data[0];\n    s16 b = sprite->data[7];\n    s16 r0;\n\n    sprite->data[0] = 1;\n    TranslateAnimHorizontalArc(sprite);\n    r0 = sprite->data[7];\n    sprite->data[0] = a;\n    if (b > 200 && r0 < 56 && sprite->oam.affineParam == 0)\n        sprite->oam.affineParam++;\n\n    if (sprite->oam.affineParam != 0 && sprite->data[0] != 0)\n    {\n        sprite->invisible ^= 1;\n        sprite->oam.affineParam++;\n        if (sprite->oam.affineParam == 30)\n            destroy = TRUE;\n    }\n\n    if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16\n     || sprite->x + sprite->x2 < -16\n     || sprite->y + sprite->y2 > DISPLAY_HEIGHT\n     || sprite->y + sprite->y2 < -16)\n        destroy = TRUE;\n\n    if (destroy)\n        DestroyAnimSprite(sprite);\n}\n\n// Animates particles in the Twister move animation.\n// arg 0: duration\n// arg 1: total y delta (the particles rise upward)\n// arg 2: wave period (higher means faster wave)\n// arg 3: wave amplitude\n// arg 4: speedup frame (particles move faster at the end of the animation)\nvoid AnimMoveTwisterParticle(struct Sprite* sprite)\n{\n    if (!IsContest() && IsDoubleBattle() == TRUE)\n        SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->x, &sprite->y);\n\n    sprite->y += 32;\n    sprite->data[0] = gBattleAnimArgs[0];\n    sprite->data[1] = gBattleAnimArgs[1];\n    sprite->data[2] = gBattleAnimArgs[2];\n    sprite->data[3] = gBattleAnimArgs[3];\n    sprite->data[4] = gBattleAnimArgs[4];\n    sprite->callback = AnimMoveTwisterParticle_Step;\n}\n\nstatic void AnimMoveTwisterParticle_Step(struct Sprite* sprite)\n{\n    if (sprite->data[1] == 0xFF)\n    {\n        sprite->y -= 2;\n    }\n    else if (sprite->data[1] > 0)\n    {\n        sprite->y -= 2;\n        sprite->data[1] -= 2;\n    }\n\n    sprite->data[5] += sprite->data[2];\n    if (sprite->data[0] < sprite->data[4])\n        sprite->data[5] += sprite->data[2];\n\n    sprite->data[5] &= 0xFF;\n    sprite->x2 = Cos(sprite->data[5], sprite->data[3]);\n    sprite->y2 = Sin(sprite->data[5], 5);\n    if (sprite->data[5] < 0x80)\n        sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) - 1;\n    else\n        sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1;\n\n    if (--sprite->data[0] == 0)\n        DestroyAnimSprite(sprite);\n}\n\n// Squeezes a constricting \"rope\" several times via affine animations.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: affine anim num\n// arg 3: num squeezes\nstatic void AnimConstrictBinding(struct Sprite* sprite)\n{\n    InitSpritePosToAnimTarget(sprite, FALSE);\n    sprite->affineAnimPaused = TRUE;\n    StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]);\n    sprite->data[6] = gBattleAnimArgs[2];\n    sprite->data[7] = gBattleAnimArgs[3];\n    sprite->callback = AnimConstrictBinding_Step1;\n}\n\nstatic void AnimConstrictBinding_Step1(struct Sprite* sprite)\n{\n    u8 spriteId;\n\n    if ((u16)gBattleAnimArgs[7] == 0xFFFF)\n    {\n        sprite->affineAnimPaused = FALSE;\n        spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);\n        sprite->data[0] = 0x100;\n        sprite->callback = AnimConstrictBinding_Step2;\n    }\n}\n\nstatic void AnimConstrictBinding_Step2(struct Sprite* sprite)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);\n    \n    if (!sprite->data[2])\n        sprite->data[0] += 11;\n    else\n        sprite->data[0] -= 11;\n\n    if (++sprite->data[1] == 6)\n    {\n        sprite->data[1] = 0;\n        sprite->data[2] ^= 1;\n    }\n\n    if (sprite->affineAnimEnded)\n    {\n        if (--sprite->data[7] > 0)\n            StartSpriteAffineAnim(sprite, sprite->data[6]);\n        else\n            DestroyAnimSprite(sprite);\n    }\n}\n\nvoid AnimTask_ShrinkTargetCopy(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);\n    \n    if (gSprites[spriteId].invisible)\n    {\n        DestroyAnimVisualTask(taskId);\n    }\n    else\n    {\n        PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND);\n        gTasks[taskId].data[0] = gBattleAnimArgs[0];\n        gTasks[taskId].data[1] = gBattleAnimArgs[1];\n        gTasks[taskId].data[11] = 0x100;\n        gTasks[taskId].func = AnimTask_DuplicateAndShrinkToPos_Step1;\n    }\n}\n\nstatic void AnimTask_DuplicateAndShrinkToPos_Step1(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);\n    \n    gTasks[taskId].data[10] += gTasks[taskId].data[0];\n    gSprites[spriteId].x2 = gTasks[taskId].data[10] >> 8;\n    if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)\n        gSprites[spriteId].x2 = -gSprites[spriteId].x2;\n\n    gTasks[taskId].data[11] += 16;\n    SetSpriteRotScale(spriteId, gTasks[taskId].data[11], gTasks[taskId].data[11], 0);\n    SetBattlerSpriteYOffsetFromYScale(spriteId);\n    if (--gTasks[taskId].data[1] == 0)\n    {\n        gTasks[taskId].data[0] = 0;\n        gTasks[taskId].func = AnimTask_DuplicateAndShrinkToPos_Step2;\n    }\n}\n\nstatic void AnimTask_DuplicateAndShrinkToPos_Step2(u8 taskId)\n{\n    if ((u16)gBattleAnimArgs[7] == 0xFFFF)\n    {\n        if (gTasks[taskId].data[0] == 0)\n        {\n            u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);\n            ResetSpriteRotScale(spriteId);\n            gSprites[spriteId].y2 = gSprites[spriteId].x2 = 0;\n            gTasks[taskId].data[0]++;\n            return;\n        }\n    }\n    else\n    {\n        if (gTasks[taskId].data[0] == 0)\n            return;\n    }\n\n    gTasks[taskId].data[0]++;\n    if (gTasks[taskId].data[0] == 3)\n        DestroyAnimVisualTask(taskId);\n}\n\n// Moves an orb from the target mon to the attacking mon.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\nstatic void AnimMimicOrb(struct Sprite* sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n            gBattleAnimArgs[0] *= -1;\n\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[0];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[1];\n        sprite->invisible = TRUE;\n        sprite->data[0]++;\n        break;\n    case 1:\n        sprite->invisible = FALSE;\n        if (sprite->affineAnimEnded)\n        {\n            ChangeSpriteAffineAnim(sprite, 1);\n            sprite->data[0] = 25;\n            sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n            sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n            sprite->callback = InitAndRunAnimFastLinearTranslation;\n            StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n            break;\n        }\n    }\n}\n\n// Animates a root that flickers away after some time.\n// arg 0: x pixel offset\n// arg 1: y pixel offset\n// arg 2: sprite subpriority offset\n// arg 3: sprite anim num\n// arg 4: duration\nstatic void AnimIngrainRoot(struct Sprite* sprite)\n{\n    if (!sprite->data[0])\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n        sprite->x2 = gBattleAnimArgs[0];\n        sprite->y2 = gBattleAnimArgs[1];\n        sprite->subpriority = gBattleAnimArgs[2] + 30;\n        StartSpriteAnim(sprite, gBattleAnimArgs[3]);\n        sprite->data[2] = gBattleAnimArgs[4];\n        sprite->data[0]++;\n        if (sprite->y + sprite->y2 > 120)\n            sprite->y += sprite->y2 + sprite->y - 120;\n    }\n    sprite->callback = AnimRootFlickerOut;\n}\n\n// Places a root on the path to the target mon that flickers away after some time.\n// arg 0: percent along the path to the target mon\n// arg 1: x pixel offset\n// arg 2: y pixel offset\n// arg 3: sprite subpriority offset\n// arg 4: sprite anum num\n// arg 5: duration\nstatic void AnimFrenzyPlantRoot(struct Sprite *sprite)\n{\n    s16 attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    s16 attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    s16 targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    s16 targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n\n    targetX -= attackerX;\n    targetY -= attackerY;\n    sprite->x = attackerX + targetX * gBattleAnimArgs[0] / 100;\n    sprite->y = attackerY + targetY * gBattleAnimArgs[0] / 100;\n    sprite->x2 = gBattleAnimArgs[1];\n    sprite->y2 = gBattleAnimArgs[2];\n    sprite->subpriority = gBattleAnimArgs[3] + 30;\n    StartSpriteAnim(sprite, gBattleAnimArgs[4]);\n    sprite->data[2] = gBattleAnimArgs[5];\n    sprite->callback = AnimRootFlickerOut;\n    sFrenzyPlantRootData.startX = sprite->x;\n    sFrenzyPlantRootData.startY = sprite->y;\n    sFrenzyPlantRootData.targetX = targetX;\n    sFrenzyPlantRootData.targetY = targetY;\n}\n\nstatic void AnimRootFlickerOut(struct Sprite* sprite)\n{\n    if (++sprite->data[0] > (sprite->data[2] - 10))\n        sprite->invisible = sprite->data[0] % 2;\n\n    if (sprite->data[0] > sprite->data[2])\n        DestroyAnimSprite(sprite);\n}\n\n// Moves an orb in a fast wavy path.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: horizontal velocity\n// arg 3: wave amplitude\n// arg 4: duration\nstatic void AnimIngrainOrb(struct Sprite* sprite)\n{\n    if (!sprite->data[0])\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1];\n        sprite->data[1] = gBattleAnimArgs[2];\n        sprite->data[2] = gBattleAnimArgs[3];\n        sprite->data[3] = gBattleAnimArgs[4];\n    }\n\n    sprite->data[0]++;\n    sprite->x2 = sprite->data[1] * sprite->data[0];\n    sprite->y2 = Sin((sprite->data[0] * 20) & 0xFF, sprite->data[2]);\n    if (sprite->data[0] > sprite->data[3])\n        DestroyAnimSprite(sprite);\n}\n\nstatic void InitItemBagData(struct Sprite* sprite, s16 c)\n{\n    int a = (sprite->x << 8) | sprite->y;\n    int b = (sprite->data[6] << 8) | sprite->data[7];\n    c <<= 8;\n    sprite->data[5] = a;\n    sprite->data[6] = b;\n    sprite->data[7] = c;\n}\n\nbool8 MoveAlongLinearPath(struct Sprite* sprite)\n{\n    u16 xStartPos = (u8)(sprite->data[5] >> 8);\n    u16 yStartPos = (u8)sprite->data[5];\n    s32 xEndPos = (u8)(sprite->data[6] >> 8);\n    s32 yEndPos = (u8)sprite->data[6];\n    s16 totalTime = sprite->data[7] >> 8;\n    s16 currentTime = sprite->data[7] & 0xFF;\n    s16 yEndPos_2;\n    s16 r0;\n    s32 var1;\n    s32 vaxEndPos;\n\n    if (xEndPos == 0)\n        xEndPos = -32;\n    else if (xEndPos == 255)\n        xEndPos = DISPLAY_WIDTH + 32;\n\n    yEndPos_2 = yEndPos - yStartPos;\n    r0 = xEndPos - xStartPos;\n    var1 = r0 * currentTime / totalTime;\n    vaxEndPos = yEndPos_2 * currentTime / totalTime;\n    sprite->x = var1 + xStartPos;\n    sprite->y = vaxEndPos + yStartPos;\n    if (++currentTime == totalTime)\n        return TRUE;\n\n    sprite->data[7] = (totalTime << 8) | currentTime;\n    return FALSE;\n}\n\nstatic void AnimItemSteal_Step2(struct Sprite* sprite)\n{\n    if (sprite->data[0] == 10)\n        StartSpriteAffineAnim(sprite, 1);\n\n    sprite->data[0]++;\n    if (sprite->data[0] > 50)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimItemSteal_Step1(struct Sprite* sprite)\n{\n    sprite->data[0] += sprite->data[3] * 128 / sprite->data[4];\n    if (sprite->data[0] >= 128)\n    {\n        sprite->data[1]++;\n        sprite->data[0] = 0;\n    }\n\n    sprite->y2 = Sin(sprite->data[0] + 128, 30 - sprite->data[1] * 8);\n    if (MoveAlongLinearPath(sprite))\n    {\n        sprite->y2 = 0;\n        sprite->data[0] = 0;\n        sprite->callback = AnimItemSteal_Step2;\n    }\n}\n\nstatic void AnimPresent(struct Sprite* sprite)\n{\n    s16 targetX;\n    s16 targetY;\n    \n    InitSpritePosToAnimAttacker(sprite, FALSE);\n    targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n    targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);\n    if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget)\n    {\n        sprite->data[6] = targetX;\n        sprite->data[7] = targetY + 10;\n        InitItemBagData(sprite, 60);\n        sprite->data[3] = 1;\n    }\n    else\n    {\n        sprite->data[6] = targetX;\n        sprite->data[7] = targetY + 10;\n        InitItemBagData(sprite, 60);\n        sprite->data[3] = 3;\n    }\n\n    sprite->data[4] = 60;\n    sprite->callback = AnimItemSteal_Step1;\n}\n\nstatic void AnimKnockOffOpponentsItem(struct Sprite* sprite)\n{\n    int zero;\n    \n    sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]);\n    zero = 0;\n    if (sprite->data[0] > 0x7F)\n    {\n        sprite->data[1]++;\n        sprite->data[0] = zero;\n    }\n\n    sprite->y2 = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8);\n    if (MoveAlongLinearPath(sprite))\n    {\n        sprite->y2 = zero;\n        sprite->data[0] = zero;\n        DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimKnockOffItem(struct Sprite* sprite)\n{\n    s16 targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);\n    \n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n    {\n        sprite->data[6] = 0;\n        sprite->data[7] = targetY + 10;\n        InitItemBagData(sprite, 40);\n        sprite->data[3] = 3;\n        sprite->data[4] = 60;\n        sprite->callback = AnimItemSteal_Step1;\n    }\n    else\n    {\n        sprite->data[6] = 255;\n        sprite->data[7] = targetY + 10;\n        if (IsContest())\n            sprite->data[6] = 0;\n\n        InitItemBagData(sprite, 40);\n        sprite->data[3] = 3;\n        sprite->data[4] = 60;\n        sprite->callback = AnimKnockOffOpponentsItem;\n    }\n}\n\n// Animates a heal particle upward.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: vertical velocity\n// arg 3: unused\nstatic void AnimPresentHealParticle(struct Sprite* sprite)\n{\n    if (!sprite->data[0])\n    {\n        InitSpritePosToAnimTarget(sprite, FALSE);\n        sprite->data[1] = gBattleAnimArgs[2];\n    }\n\n    sprite->data[0]++;\n    sprite->y2 = sprite->data[1] * sprite->data[0];\n    if (sprite->animEnded)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimItemSteal(struct Sprite* sprite)\n{\n    s16 attackerX;\n    s16 attackerY;\n    \n    InitSpritePosToAnimTarget(sprite, FALSE);\n    attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n    attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n    if (BATTLE_PARTNER(gBattleAnimTarget) == gBattleAnimAttacker)\n    {\n        sprite->data[6] = attackerX;\n        sprite->data[7] = attackerY + 10;\n        InitItemBagData(sprite, 60);\n        sprite->data[3] = 1;\n    }\n    else\n    {\n        sprite->data[6] = attackerX;\n        sprite->data[7] = attackerY + 10;\n        InitItemBagData(sprite, 60);\n        sprite->data[3] = 3;\n    }\n\n    sprite->data[4] = 60;\n    sprite->callback = AnimItemSteal_Step3;\n}\n\nstatic void AnimItemSteal_Step3(struct Sprite* sprite)\n{\n    int zero;\n    \n    sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]);\n    zero = 0;\n    if (sprite->data[0] > 127)\n    {\n        sprite->data[1]++;\n        sprite->data[0] = zero;\n    }\n\n    sprite->y2 = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8);\n    if (sprite->y2 == 0)\n        PlaySE12WithPanning(SE_M_BUBBLE2, BattleAnimAdjustPanning(SOUND_PAN_TARGET));\n\n    if (MoveAlongLinearPath(sprite))\n    {\n        sprite->y2 = 0;\n        sprite->data[0] = 0;\n        sprite->callback = AnimItemSteal_Step2;\n        PlaySE12WithPanning(SE_M_BUBBLE2, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));\n    }\n}\n\n// Moves a bag in a circular motion.\n// arg 0: y position\n// arg 1: initial wave offset\nstatic void AnimTrickBag(struct Sprite* sprite)\n{\n    int a;\n    int b;\n\n    if (!sprite->data[0])\n    {\n        if (!IsContest())\n        {\n            sprite->data[1] = gBattleAnimArgs[1];\n            sprite->x = 120;\n        }\n        else\n        {\n            a = gBattleAnimArgs[1] - 32;\n            if (a < 0)\n                b = gBattleAnimArgs[1] + 0xDF;\n            else\n                b = a;\n\n            sprite->data[1] = a - ((b >> 8) << 8);\n            sprite->x = 70;\n        }\n\n        sprite->y = gBattleAnimArgs[0];\n        sprite->data[2] = gBattleAnimArgs[0];\n        sprite->data[4] = 20;\n        sprite->x2 = Cos(sprite->data[1], 60);\n        sprite->y2 = Sin(sprite->data[1], 20);\n        sprite->callback = AnimTrickBag_Step1;\n        if (sprite->data[1] > 0 && sprite->data[1] < 192)\n            sprite->subpriority = 31;\n        else\n            sprite->subpriority = 29;\n    }\n}\n\nstatic void AnimTrickBag_Step1(struct Sprite* sprite)\n{\n    switch (sprite->data[3])\n    {\n    case 0:\n        if (sprite->data[2] > 78)\n        {\n            sprite->data[3] = 1;\n            StartSpriteAffineAnim(sprite, 1);\n            break;\n        }\n        else\n        {\n            sprite->data[2] += sprite->data[4] / 10;\n            sprite->data[4] += 3;\n            sprite->y = sprite->data[2];\n            break;\n        }\n        break;\n    case 1:\n        if (sprite->data[3] && sprite->affineAnimEnded)\n        {\n            sprite->data[0] = 0;\n            sprite->data[2] = 0;\n            sprite->callback = AnimTrickBag_Step2;\n        }\n        break;\n    }\n}\n\nstatic void AnimTrickBag_Step2(struct Sprite* sprite)\n{\n    if (sprite->data[2] == gTrickBagCoordinates[sprite->data[0]][1])\n    {\n        if (gTrickBagCoordinates[sprite->data[0]][2] == 127)\n        {\n            sprite->data[0] = 0;\n            sprite->callback = AnimTrickBag_Step3;\n        }\n\n        sprite->data[2] = 0;\n        sprite->data[0]++;\n    }\n    else\n    {\n        sprite->data[2]++;\n        sprite->data[1] = (gTrickBagCoordinates[sprite->data[0]][0] * gTrickBagCoordinates[sprite->data[0]][2] + sprite->data[1]) & 0xFF;\n        if (!IsContest())\n        {\n            if ((u16)(sprite->data[1] - 1) < 191)\n                sprite->subpriority = 31;\n            else\n                sprite->subpriority = 29;\n        }\n\n        sprite->x2 = Cos(sprite->data[1], 60);\n        sprite->y2 = Sin(sprite->data[1], 20);\n    }\n}\n\nstatic void AnimTrickBag_Step3(struct Sprite* sprite)\n{\n    if (sprite->data[0] > 20)\n        DestroyAnimSprite(sprite);\n\n    sprite->invisible = sprite->data[0] % 2;\n    sprite->data[0]++;\n}\n\nvoid AnimTask_LeafBlade(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->data[4] = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 1;\n    task->data[6] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    task->data[10] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH);\n    task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT);\n    task->data[5] = (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) ? 1 : -1;\n    task->data[9] = 56 - (task->data[5] * 64);\n    task->data[8] = task->data[7] - task->data[9] + task->data[6];\n    task->data[2] = CreateSprite(&gLeafBladeSpriteTemplate, task->data[8], task->data[9], task->data[4]);\n    if (task->data[2] == MAX_SPRITES)\n        DestroyAnimVisualTask(taskId);\n\n    gSprites[task->data[2]].data[0] = 10;\n    gSprites[task->data[2]].data[1] = task->data[8];\n    gSprites[task->data[2]].data[2] = task->data[6] - (task->data[10] / 2 + 10) * task->data[5];\n    gSprites[task->data[2]].data[3] = task->data[9];\n    gSprites[task->data[2]].data[4] = task->data[7] + (task->data[11] / 2 + 10) * task->data[5];\n    gSprites[task->data[2]].data[5] = LeafBladeGetPosFactor(&gSprites[task->data[2]]);\n    InitAnimArcTranslation(&gSprites[task->data[2]]);\n    task->func = AnimTask_LeafBlade_Step;\n}\n\nstatic void AnimTask_LeafBlade_Step(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    struct Sprite* sprite = &gSprites[task->data[2]];\n    int a = task->data[0];\n    \n    switch (a)\n    {\n    case 4:\n        AnimTask_LeafBlade_Step2(task, taskId);\n        if (TranslateAnimHorizontalArc(sprite))\n        {\n            task->data[15] = 5;\n            task->data[0] = 0xFF;\n        }\n        break;\n    case 8:\n        AnimTask_LeafBlade_Step2(task, taskId);\n        if (TranslateAnimHorizontalArc(sprite))\n        {\n            task->data[15] = 9;\n            task->data[0] = 0xFF;\n        }\n        break;\n    case 0:\n        AnimTask_LeafBlade_Step2(task, taskId);\n        if (TranslateAnimHorizontalArc(sprite))\n        {\n            task->data[15] = 1;\n            task->data[0] = 0xFF;\n        }\n        break;\n    case 1:\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->x2 = 0;\n        sprite->y2 = 0;\n        sprite->data[0] = 10;\n        sprite->data[1] = sprite->x;\n        sprite->data[2] = task->data[6];\n        sprite->data[3] = sprite->y;\n        sprite->data[4] = task->data[7];\n        sprite->data[5] = LeafBladeGetPosFactor(sprite);\n        task->data[4] += 2;\n        task->data[3] = a;\n        sprite->subpriority = task->data[4];\n        StartSpriteAnim(sprite, task->data[3]);\n        InitAnimArcTranslation(sprite);\n        task->data[0]++;\n        break;\n    case 2:\n        AnimTask_LeafBlade_Step2(task, taskId);\n        if (TranslateAnimHorizontalArc(sprite))\n        {\n            task->data[15] = 3;\n            task->data[0] = 0xFF;\n        }\n        break;\n    case 3:\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->x2 = 0;\n        sprite->y2 = 0;\n        sprite->data[0] = 10;\n        sprite->data[1] = sprite->x;\n        sprite->data[2] = task->data[6] - ((task->data[10] / 2) + 10) * task->data[5];\n        sprite->data[3] = sprite->y;\n        sprite->data[4] = task->data[7] - ((task->data[11] / 2) + 10) * task->data[5];\n        sprite->data[5] = LeafBladeGetPosFactor(sprite);\n        task->data[3] = 2;\n        sprite->subpriority = task->data[4];\n        StartSpriteAnim(sprite, task->data[3]);\n        InitAnimArcTranslation(sprite);\n        task->data[0]++;\n        break;\n    case 5:\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->x2 = 0;\n        sprite->y2 = 0;\n        sprite->data[0] = 10;\n        sprite->data[1] = sprite->x;\n        sprite->data[2] = task->data[6] + ((task->data[10] / 2) + 10) * task->data[5];\n        sprite->data[3] = sprite->y;\n        sprite->data[4] = task->data[7] + ((task->data[11] / 2) + 10) * task->data[5];\n        sprite->data[5] = LeafBladeGetPosFactor(sprite);\n        task->data[4] -= 2;\n        task->data[3] = 3;\n        sprite->subpriority = task->data[4];\n        StartSpriteAnim(sprite, task->data[3]);\n        InitAnimArcTranslation(sprite);\n        task->data[0]++;\n        break;\n    case 6:\n        AnimTask_LeafBlade_Step2(task, taskId);\n        if (TranslateAnimHorizontalArc(sprite))\n        {\n            task->data[15] = 7;\n            task->data[0] = 0xFF;\n        }\n        break;\n    case 7:\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->x2 = 0;\n        sprite->y2 = 0;\n        sprite->data[0] = 10;\n        sprite->data[1] = sprite->x;\n        sprite->data[2] = task->data[6];\n        sprite->data[3] = sprite->y;\n        sprite->data[4] = task->data[7];\n        sprite->data[5] = LeafBladeGetPosFactor(sprite);\n        task->data[4] += 2;\n        task->data[3] = 4;\n        sprite->subpriority = task->data[4];\n        StartSpriteAnim(sprite, task->data[3]);\n        InitAnimArcTranslation(sprite);\n        task->data[0]++;\n        break;\n    case 9:\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->x2 = 0;\n        sprite->y2 = 0;\n        sprite->data[0] = 10;\n        sprite->data[1] = sprite->x;\n        sprite->data[2] = task->data[6] - ((task->data[10] / 2) + 10) * task->data[5];\n        sprite->data[3] = sprite->y;\n        sprite->data[4] = task->data[7] + ((task->data[11] / 2) + 10) * task->data[5];\n        sprite->data[5] = LeafBladeGetPosFactor(sprite);\n        task->data[3] = 5;\n        sprite->subpriority = task->data[4];\n        StartSpriteAnim(sprite, task->data[3]);\n        InitAnimArcTranslation(sprite);\n        task->data[0]++;\n        break;\n    case 10:\n        AnimTask_LeafBlade_Step2(task, taskId);\n        if (TranslateAnimHorizontalArc(sprite))\n        {\n            task->data[15] = 11;\n            task->data[0] = 0xFF;\n        }\n        break;\n    case 11:\n    {\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->x2 = 0;\n        sprite->y2 = 0;\n        sprite->data[0] = 10;\n        sprite->data[1] = sprite->x;\n        sprite->data[2] = task->data[8];\n        sprite->data[3] = sprite->y;\n        sprite->data[4] = task->data[9];\n        sprite->data[5] = LeafBladeGetPosFactor(sprite);\n        task->data[4] -= 2;\n        task->data[3] = 6;\n        sprite->subpriority = task->data[4];\n        StartSpriteAnim(sprite, task->data[3]);\n        InitAnimArcTranslation(sprite);\n        task->data[0]++;\n        break;\n    }\n    case 12:\n        AnimTask_LeafBlade_Step2(task, taskId);\n        if (TranslateAnimHorizontalArc(sprite))\n        {\n            DestroySprite(sprite);\n            task->data[0]++;\n        }\n        break;\n    case 13:\n        if (task->data[12] == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    case 0xFF:\n        if (++task->data[1] > 5)\n        {\n            task->data[1] = 0;\n            task->data[0] = task->data[15];\n        }\n        break;\n    }\n}\n\nstatic s16 LeafBladeGetPosFactor(struct Sprite* sprite)\n{\n    s16 var = 8;\n    \n    if (sprite->data[4] < sprite->y)\n        var = -var;\n\n    return var;\n}\n\nstatic void AnimTask_LeafBlade_Step2(struct Task* task, u8 taskId)\n{\n    task->data[14]++;\n    if (task->data[14] > 0)\n    {\n        u8 spriteId;\n        s16 spriteX;\n        s16 spriteY;\n        task->data[14] = 0;\n        spriteX = gSprites[task->data[2]].x + gSprites[task->data[2]].x2;\n        spriteY = gSprites[task->data[2]].y + gSprites[task->data[2]].y2;\n        spriteId = CreateSprite(&gLeafBladeSpriteTemplate, spriteX, spriteY, task->data[4]);\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].data[6] = taskId;\n            gSprites[spriteId].data[7] = 12;\n            gTasks[taskId].data[12]++;\n            gSprites[spriteId].data[0] = task->data[13] & 1;\n            gTasks[taskId].data[13]++;\n            StartSpriteAnim(&gSprites[spriteId], task->data[3]);\n            gSprites[spriteId].subpriority = task->data[4];\n            gSprites[spriteId].callback = AnimTask_LeafBlade_Step2_Callback;\n        }\n    }\n}\n\nstatic void AnimTask_LeafBlade_Step2_Callback(struct Sprite* sprite)\n{\n    sprite->data[0]++;\n    if (sprite->data[0] > 1)\n    {\n        sprite->data[0] = 0;\n        sprite->invisible ^= 1;\n        sprite->data[1]++;\n        if (sprite->data[1] > 8)\n        {\n            gTasks[sprite->data[6]].data[sprite->data[7]]--;\n            DestroySprite(sprite);\n        }\n    }\n}\n\nstatic void AnimFlyingParticle(struct Sprite* sprite)\n{\n    u8 battler;\n    \n    if (!gBattleAnimArgs[6])\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    if (GetBattlerSide(battler) != B_SIDE_PLAYER)\n    {\n        sprite->data[4] = 0;\n        sprite->data[2] = gBattleAnimArgs[3];\n        sprite->x = 0xFFF0;\n    }\n    else\n    {\n        sprite->data[4] = 1;\n        sprite->data[2] = -gBattleAnimArgs[3];\n        sprite->x = 0x100;\n    }\n\n    sprite->data[1] = gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[3] = gBattleAnimArgs[4];\n    switch (gBattleAnimArgs[5])\n    {\n    case 0:\n        sprite->y = gBattleAnimArgs[0];\n        sprite->oam.priority = GetBattlerSpriteBGPriority(battler);\n        break;\n    case 1:\n        sprite->y = gBattleAnimArgs[0];\n        sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1;\n        break;\n    case 2:\n        sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[0];\n        sprite->oam.priority = GetBattlerSpriteBGPriority(battler);\n        break;\n    case 3:\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[0];\n        GetAnimBattlerSpriteId(ANIM_TARGET);\n        sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1;\n        break;\n    }\n\n    sprite->callback = AnimFlyingParticle_Step;\n}\n\nstatic void AnimFlyingParticle_Step(struct Sprite* sprite)\n{\n    int a = sprite->data[7];\n    \n    sprite->data[7]++;\n    sprite->y2 = (sprite->data[1] * gSineTable[sprite->data[0]]) >> 8;\n    sprite->x2 = sprite->data[2] * a;\n    sprite->data[0] = (sprite->data[3] * a) & 0xFF;\n    if (!sprite->data[4])\n    {\n        if (sprite->x2 + sprite->x <= 0xF7)\n            return;\n    }\n    else\n    {\n        if (sprite->x2 + sprite->x > -16)\n            return;\n    }\n\n    DestroySpriteAndMatrix(sprite);\n}\n\nvoid AnimTask_CycleMagicalLeafPal(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    switch (task->data[0])\n    {\n    case 0:\n        task->data[8] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(ANIM_TAG_LEAF));\n        task->data[12] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(ANIM_TAG_RAZOR_LEAF));\n        task->data[0]++;\n        break;\n    case 1:\n        if (++task->data[9] >= 0)\n        {\n            task->data[9] = 0;\n            BlendPalette(task->data[8], 16, task->data[10], sMagicalLeafBlendColors[task->data[11]]);\n            BlendPalette(task->data[12], 16, task->data[10], sMagicalLeafBlendColors[task->data[11]]);\n            if (++task->data[10] == 17)\n            {\n                task->data[10] = 0;\n                if (++task->data[11] == 7)\n                    task->data[11] = 0;\n            }\n        }\n        break;\n    }\n\n    if (gBattleAnimArgs[7] == -1)\n        DestroyAnimVisualTask(taskId);\n}\n\nstatic void AnimNeedleArmSpike(struct Sprite* sprite)\n{\n    u8 a;\n    u8 b;\n    u16 c;\n    u16 x;\n    u16 y;\n\n    if (gBattleAnimArgs[4] == 0)\n    {\n        DestroyAnimSprite(sprite);\n    }\n    else\n    {\n        if (gBattleAnimArgs[0] == 0)\n        {\n            a = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n            b = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n        }\n        else\n        {\n            a = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n            b = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n        }\n\n        sprite->data[0] = gBattleAnimArgs[4];\n        if (gBattleAnimArgs[1] == 0)\n        {\n            sprite->x = gBattleAnimArgs[2] + a;\n            sprite->y = gBattleAnimArgs[3] + b;\n            sprite->data[5] = a;\n            sprite->data[6] = b;\n        }\n        else\n        {\n            sprite->x = a;\n            sprite->y = b;\n            sprite->data[5] = gBattleAnimArgs[2] + a;\n            sprite->data[6] = gBattleAnimArgs[3] + b;\n        }\n\n        x = sprite->x;\n        sprite->data[1] = x * 16;\n        y = sprite->y;\n        sprite->data[2] = y * 16;\n        sprite->data[3] = (sprite->data[5] - sprite->x) * 16 / gBattleAnimArgs[4];\n        sprite->data[4] = (sprite->data[6] - sprite->y) * 16 / gBattleAnimArgs[4];\n        c = ArcTan2Neg(sprite->data[5] - x, sprite->data[6] - y);\n        if (IsContest())\n            c -= 0x8000;\n\n        TrySetSpriteRotScale(sprite, 0, 0x100, 0x100, c);\n        sprite->callback = AnimNeedleArmSpike_Step;\n    }\n}\n\nstatic void AnimNeedleArmSpike_Step(struct Sprite* sprite)\n{\n    if (sprite->data[0])\n    {\n        sprite->data[1] += sprite->data[3];\n        sprite->data[2] += sprite->data[4];\n        sprite->x = sprite->data[1] >> 4 ;\n        sprite->y = sprite->data[2] >> 4 ;\n        sprite->data[0]--;\n    }\n    else\n    {\n        DestroySpriteAndMatrix(sprite);\n    }\n}\n\nstatic void AnimWhipHit_WaitEnd(struct Sprite* sprite)\n{\n    if (sprite->animEnded)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimSlidingHit(struct Sprite* sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->x -= gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n    }\n    else\n    {\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n    }\n\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nstatic void AnimWhipHit(struct Sprite* sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        StartSpriteAnim(sprite, 1);\n\n    sprite->callback = AnimWhipHit_WaitEnd;\n    SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);\n    sprite->y += gBattleAnimArgs[1];\n}\n\nstatic void AnimFlickeringPunch(struct Sprite* sprite)\n{\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[3] = gBattleAnimArgs[4];\n    sprite->data[5] = gBattleAnimArgs[5];\n    StartSpriteAffineAnim(sprite, gBattleAnimArgs[6]);\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = TranslateSpriteLinearAndFlicker;\n}\n\n// Moves the sprite in a diagonally slashing motion across the target mon.\n// Used by moves such as MOVE_CUT and MOVE_AERIAL_ACE.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: slice direction; 0 = right-to-left, 1 = left-to-right\nstatic void AnimCuttingSlice(struct Sprite* sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n        sprite->y += 8;\n\n    sprite->callback = AnimSlice_Step;\n    if (gBattleAnimArgs[2] == 0)\n    {\n        sprite->x += gBattleAnimArgs[0];\n    }\n    else\n    {\n        sprite->x -= gBattleAnimArgs[0];\n        sprite->hFlip = 1;\n    }\n\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[1] -= 0x400;\n    sprite->data[2] += 0x400;\n    sprite->data[5] = gBattleAnimArgs[2];\n    if (sprite->data[5] == 1)\n        sprite->data[1] = -sprite->data[1];\n}\n\nstatic void AnimAirCutterSlice(struct Sprite* sprite)\n{\n    u8 a;\n    u8 b;\n    \n    switch (gBattleAnimArgs[3])\n    {\n    case 1:\n        a = GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X);\n        b = GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y);\n        break;\n    case 2:\n        a = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n        b = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);\n        if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget)))\n        {\n            a = (GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X) + a) / 2;\n            b = (GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y) + b) / 2;\n        }\n        break;\n    case 0:\n    default:\n        a = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n        b = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);\n        break;\n    }\n\n    sprite->x = a;\n    sprite->y = b;\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n        sprite->y += 8;\n\n    sprite->callback = AnimSlice_Step;\n    if (gBattleAnimArgs[2] == 0)\n    {\n        sprite->x += gBattleAnimArgs[0];\n    }\n    else\n    {\n        sprite->x -= gBattleAnimArgs[0];\n        sprite->hFlip = 1;\n    }\n\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[1] -= 0x400;\n    sprite->data[2] += 0x400;\n    sprite->data[5] = gBattleAnimArgs[2];\n    if (sprite->data[5] == 1)\n        sprite->data[1] = -sprite->data[1];\n}\n\nstatic void AnimSlice_Step(struct Sprite* sprite)\n{\n    sprite->data[3] += sprite->data[1];\n    sprite->data[4] += sprite->data[2];\n    if (sprite->data[5] == 0)\n        sprite->data[1] += 0x18;\n    else\n        sprite->data[1] -= 0x18;\n\n    sprite->data[2] -= 0x18;\n    sprite->x2 = sprite->data[3] >> 8;\n    sprite->y2 = sprite->data[4] >> 8;\n    sprite->data[0]++;\n    if (sprite->data[0] == 20)\n    {\n        StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n        sprite->data[0] = 3;\n        sprite->callback = WaitAnimForDuration;\n    }\n}\n\nstatic void UnusedFlickerAnim(struct Sprite* sprite)\n{\n    if (sprite->data[2] > 1)\n    {\n        if (sprite->data[3] & 1)\n        {\n            sprite->invisible = FALSE;\n            gSprites[sprite->data[0]].invisible = FALSE;\n            gSprites[sprite->data[1]].invisible = FALSE;\n        }\n        else\n        {\n            sprite->invisible = TRUE;\n            gSprites[sprite->data[0]].invisible = TRUE;\n            gSprites[sprite->data[1]].invisible = TRUE;\n        }\n\n        sprite->data[2] = 0;\n        sprite->data[3]++;\n    }\n    else\n    {\n        sprite->data[2]++;\n    }\n\n    if (sprite->data[3] == 10)\n    {\n        DestroySprite(&gSprites[sprite->data[0]]);\n        DestroySprite(&gSprites[sprite->data[1]]);\n        DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimCirclingMusicNote(struct Sprite* sprite)\n{\n    sprite->data[0] = gBattleAnimArgs[2];\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->x -= gBattleAnimArgs[0];\n    else\n        sprite->x += gBattleAnimArgs[0];\n\n    StartSpriteAnim(sprite, gBattleAnimArgs[5]);\n    sprite->data[1] = -gBattleAnimArgs[3];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[3] = gBattleAnimArgs[4];\n    sprite->callback = AnimCirclingMusicNote_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimCirclingMusicNote_Step(struct Sprite* sprite)\n{\n    sprite->x2 = Cos(sprite->data[0], 100);\n    sprite->y2 = Sin(sprite->data[0], 20);\n    if (sprite->data[0] < 128)\n        sprite->subpriority = 0;\n    else\n        sprite->subpriority = 14;\n\n    sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF;\n    sprite->data[5] += 0x82;\n    sprite->y2 += sprite->data[5] >> 8;\n    sprite->data[2]++;\n    if (sprite->data[2] == sprite->data[3])\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimProtect(struct Sprite* sprite)\n{\n    if (IsContest())\n        gBattleAnimArgs[1] += 8;\n\n    sprite->x = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0];\n    sprite->y = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1];\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest())\n        sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker) + 1;\n    else\n        sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);\n\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[2] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(ANIM_TAG_PROTECT));\n    sprite->data[7] = 16;\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], sprite->data[7]));\n    sprite->callback = AnimProtect_Step;\n}\n\nstatic void AnimProtect_Step(struct Sprite *sprite)\n{\n    int i, id, savedPal;\n    sprite->data[5] += 96;\n    sprite->x2 = -(sprite->data[5] >> 8);\n    if (++sprite->data[1] > 1)\n    {\n        sprite->data[1] = 0;\n        savedPal = gPlttBufferFaded[sprite->data[2] + 1];\n        i = 0;\n        while (i < 6)\n        {\n            id = sprite->data[2] + ++i;\n            gPlttBufferFaded[id] = gPlttBufferFaded[id + 1];\n        }\n\n        gPlttBufferFaded[sprite->data[2] + 7] = savedPal;\n    }\n\n    if (sprite->data[7] > 6 && sprite->data[0] >0 && ++sprite->data[6] > 1)\n    {\n        sprite->data[6] = 0;\n        sprite->data[7] -= 1;\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], sprite->data[7]));\n    }\n\n    if (sprite->data[0] > 0)\n    {\n        sprite->data[0] -= 1;\n    }\n    else if (++sprite->data[6] > 1)\n    {\n        sprite->data[6] = 0;\n        sprite->data[7]++;\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], sprite->data[7]));\n        if (sprite->data[7] == 16)\n        {\n            sprite->invisible = TRUE;\n            sprite->callback = DestroyAnimSpriteAndDisableBlend;\n        }\n    }\n}\n\nstatic void AnimMilkBottle(struct Sprite* sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + 0xFFE8;\n    sprite->data[0] = 0;\n    sprite->data[1] = 0;\n    sprite->data[2] = 0;\n    sprite->data[3] = 0;\n    sprite->data[4] = 0;\n    sprite->data[6] = 0;\n    sprite->data[7] = 16;\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));\n    sprite->callback = AnimMilkBottle_Step1;\n}\n\nstatic void AnimMilkBottle_Step1(struct Sprite* sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        if (++sprite->data[2] > 0)\n        {\n            sprite->data[2] = 0;\n            if (((++sprite->data[1]) & 1) != 0)\n            {\n                if (sprite->data[6] <= 15)\n                    sprite->data[6]++;\n            }\n            else if (sprite->data[7] > 0)\n                sprite->data[7]--;\n\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));\n            if (sprite->data[6] == 16 && sprite->data[7] == 0)\n            {\n                sprite->data[1] = 0;\n                sprite->data[0]++;\n            }\n        }\n        break;\n    case 1:\n        if (++sprite->data[1] > 8)\n        {\n            sprite->data[1] = 0;\n            StartSpriteAffineAnim(sprite, 1);\n            sprite->data[0]++;\n        }\n        break;\n    case 2:\n        AnimMilkBottle_Step2(sprite, 16, 4);\n        if (++sprite->data[1] > 2)\n        {\n            sprite->data[1] = 0;\n            sprite->y++;\n        }\n\n        if (++sprite->data[2] <= 29)\n            break;\n\n        if (sprite->data[2] & 1)\n        {\n            if (sprite->data[6] > 0)\n                sprite->data[6]--;\n        }\n        else if (sprite->data[7] <= 15)\n        {\n            sprite->data[7]++;\n        }\n\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));\n        if (sprite->data[6] == 0 && sprite->data[7] == 16)\n        {\n            sprite->data[1] = 0;\n            sprite->data[2] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 3:\n        sprite->invisible = TRUE;\n        sprite->data[0]++;\n        break;\n    case 4:\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));\n        DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\nstatic void AnimMilkBottle_Step2(struct Sprite* sprite, int unk1, int unk2)\n{\n    if (sprite->data[3] <= 11)\n        sprite->data[4] += 2;\n\n    if ((u16)(sprite->data[3] - 0x12) <= 0x17)\n        sprite->data[4] -= 2;\n\n    if ((sprite->data[3]) > 0x2F)\n        sprite->data[4] += 2;\n\n    sprite->x2 = sprite->data[4] / 9;\n    sprite->y2 = sprite->data[4] / 14;\n    if (sprite->y2 < 0)\n        sprite->y2 *= -1;\n\n    sprite->data[3]++;\n    if (sprite->data[3] > 0x3B)\n        sprite->data[3] = 0;\n}\n\nstatic void AnimGrantingStars(struct Sprite* sprite)\n{\n    if (!gBattleAnimArgs[2])\n        SetSpriteCoordsToAnimAttackerCoords(sprite);\n\n    SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[5];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[2] = gBattleAnimArgs[4];\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = TranslateSpriteLinearFixedPoint;\n}\n\nstatic void AnimSparklingStars(struct Sprite* sprite)\n{\n    u8 battler;\n    \n    if (!gBattleAnimArgs[2])\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    if (IsDoubleBattle() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler)))\n    {\n        SetAverageBattlerPositions(battler, gBattleAnimArgs[6], &sprite->x, &sprite->y);\n        SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);\n        sprite->y += gBattleAnimArgs[1];\n    }\n    else\n    {\n        if (!gBattleAnimArgs[6])\n        {\n            sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X);\n            sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y) + gBattleAnimArgs[1];\n        }\n        else\n        {\n            sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);\n            sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];\n        }\n\n        SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);\n    }\n\n    sprite->data[0] = gBattleAnimArgs[5];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[2] = gBattleAnimArgs[4];\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = TranslateSpriteLinearFixedPoint;\n}\n\nstatic void AnimBubbleBurst(struct Sprite* sprite)\n{\n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n    {\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n    }\n    else\n    {\n        sprite->x -= gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n        StartSpriteAnim(sprite, 1);\n    }\n\n    sprite->callback = AnimBubbleBurst_Step;\n}\n\nstatic void AnimBubbleBurst_Step(struct Sprite* sprite)\n{\n    if (++sprite->data[0] > 30)\n    {\n        sprite->y2 = (30 - sprite->data[0]) / 3;\n        sprite->x2 = Sin(sprite->data[1] * 4, 3);\n        sprite->data[1]++;\n    }\n\n    if (sprite->animEnded)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimSleepLetterZ(struct Sprite* sprite)\n{\n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n    {\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n        sprite->data[3] = 1;\n    }\n    else\n    {\n        sprite->x -= gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n        sprite->data[3] = 0xFFFF;\n        StartSpriteAffineAnim(sprite, 1);\n    }\n\n    sprite->callback = AnimSleepLetterZ_Step;\n}\n\nstatic void AnimSleepLetterZ_Step(struct Sprite* sprite)\n{\n    sprite->y2 = -(sprite->data[0] / 0x28);\n    sprite->x2 = sprite->data[4] / 10;\n    sprite->data[4] += sprite->data[3] * 2;\n    sprite->data[0] += sprite->data[1];\n    if (++sprite->data[1] > 60)\n        DestroySpriteAndMatrix(sprite);\n}\n\nstatic void AnimLockOnTarget(struct Sprite* sprite)\n{\n    sprite->x -= 32;\n    sprite->y -= 32;\n    sprite->data[0] = 20;\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, AnimLockOnTarget_Step1);\n}\n\nstatic void AnimLockOnTarget_Step1(struct Sprite* sprite)\n{\n    switch (sprite->data[5] & 1)\n    {\n    case 0:\n        sprite->data[0] = 1;\n        sprite->callback = WaitAnimForDuration;\n        StoreSpriteCallbackInData6(sprite, AnimLockOnTarget_Step1);\n        break;\n    case 1:\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->y2 = 0;\n        sprite->x2 = 0;\n        sprite->data[0] = 8;\n        sprite->data[2] = sprite->x + sInclineMonCoordTable[sprite->data[5] >> 8][0];\n        sprite->data[4] = sprite->y + sInclineMonCoordTable[sprite->data[5] >> 8][1];\n        sprite->callback = StartAnimLinearTranslation;\n        StoreSpriteCallbackInData6(sprite, AnimLockOnTarget_Step2);\n        sprite->data[5] += 0x100;\n        PlaySE12WithPanning(SE_M_LOCK_ON, BattleAnimAdjustPanning(SOUND_PAN_TARGET));\n        break;\n    }\n\n    sprite->data[5] ^= 1;\n}\n\nstatic void AnimLockOnTarget_Step2(struct Sprite* sprite)\n{\n    if ((sprite->data[5] >> 8) == 4)\n    {\n        sprite->data[0] = 10;\n        sprite->callback = WaitAnimForDuration;\n        StoreSpriteCallbackInData6(sprite, AnimLockOnTarget_Step3);\n    }\n    else\n    {\n        sprite->callback = AnimLockOnTarget_Step1;\n    }\n}\n\nstatic void AnimLockOnTarget_Step3(struct Sprite* sprite)\n{\n    s16 a;\n    s16 b;\n    \n    if (sprite->oam.affineParam == 0)\n    {\n        sprite->data[0] = 3;\n        sprite->data[1] = 0;\n        sprite->data[2] = 0;\n        sprite->callback = WaitAnimForDuration;\n        StoreSpriteCallbackInData6(sprite, AnimLockOnTarget_Step4);\n    }\n    else\n    {\n        switch (sprite->oam.affineParam)\n        {\n        case 1:\n            a = -8;\n            b = -8;\n            break;\n        case 2:\n            a = -8;\n            b = 8;\n            break;\n        case 3:\n            a = 8;\n            b = -8;\n            break;\n        default:\n            a = 8;\n            b = 8;\n            break;\n        }\n\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->y2 = 0;\n        sprite->x2 = 0;\n        sprite->data[0] = 6;\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + a;\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + b;\n        sprite->callback = StartAnimLinearTranslation;\n        StoreSpriteCallbackInData6(sprite, AnimLockOnTarget_Step5);\n    }\n}\n\nstatic void AnimLockOnTarget_Step4(struct Sprite* sprite)\n{\n    if (sprite->data[2] == 0)\n    {\n        if ((sprite->data[1] += 3) > 16)\n            sprite->data[1] = 16;\n    }\n    else if ((sprite->data[1] -= 3) < 0)\n    {\n        sprite->data[1] = 0;\n    }\n\n    BlendPalettes(GetBattlePalettesMask(1, 1, 1, 1, 1, 0, 0), sprite->data[1], RGB_WHITE);\n    if (sprite->data[1] == 16)\n    {\n        int pal;\n        sprite->data[2]++;\n        pal = sprite->oam.paletteNum;\n        LoadPalette(&gPlttBufferUnfaded[OBJ_PLTT_ID(pal) + 8], OBJ_PLTT_ID(pal) + 1, PLTT_SIZEOF(2));\n        PlaySE12WithPanning(SE_M_LEER, BattleAnimAdjustPanning(SOUND_PAN_TARGET));\n    }\n    else if (sprite->data[1] == 0)\n    {\n        sprite->callback = AnimLockOnTarget_Step5;\n    }\n}\n\nstatic void AnimLockOnTarget_Step5(struct Sprite* sprite)\n{\n    if ((u16)gBattleAnimArgs[7] == 0xFFFF)\n    {\n        sprite->data[1] = 0;\n        sprite->data[0] = 0;\n        sprite->callback = AnimLockOnTarget_Step6;\n    }\n}\n\nstatic void AnimLockOnTarget_Step6(struct Sprite* sprite)\n{\n    if (sprite->data[0] % 3 == 0)\n    {\n        sprite->data[1]++;\n        sprite->invisible ^= 1;\n    }\n\n    sprite->data[0]++;\n    if (sprite->data[1] == 8)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimLockOnMoveTarget(struct Sprite* sprite)\n{\n    sprite->oam.affineParam = gBattleAnimArgs[0];\n    if ((s16)sprite->oam.affineParam == 1)\n    {\n        sprite->x -= 0x18;\n        sprite->y -= 0x18;\n    }\n    else if ((s16)sprite->oam.affineParam == 2)\n    {\n        sprite->x -= 0x18;\n        sprite->y += 0x18;\n        sprite->oam.matrixNum = ST_OAM_VFLIP;\n    }\n    else if ((s16)sprite->oam.affineParam == 3)\n    {\n        sprite->x += 0x18;\n        sprite->y -= 0x18;\n        sprite->oam.matrixNum = ST_OAM_HFLIP;\n    }\n    else\n    {\n        sprite->x += 0x18;\n        sprite->y += 0x18;\n        sprite->oam.matrixNum = ST_OAM_HFLIP | ST_OAM_VFLIP;\n    }\n\n    sprite->oam.tileNum = (sprite->oam.tileNum + 16);\n    sprite->callback = AnimLockOnTarget;\n    sprite->callback(sprite);\n}\n\nstatic void AnimBowMon(struct Sprite* sprite)\n{\n    sprite->invisible = TRUE;\n    sprite->data[0] = 0;\n    switch (gBattleAnimArgs[0])\n    {\n    case 0:\n        sprite->callback = AnimBowMon_Step1;\n        break;\n    case 1:\n        sprite->callback = AnimBowMon_Step2;\n        break;\n    case 2:\n        sprite->callback = AnimBowMon_Step3;\n        break;\n    default:\n        sprite->callback = AnimBowMon_Step4;\n        break;\n    }\n}\n\nstatic void AnimBowMon_Step1(struct Sprite* sprite)\n{\n    sprite->data[0] = 6;\n    sprite->data[1] = (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) ? 2 : -2;\n    sprite->data[2] = 0;\n    sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];\n    StoreSpriteCallbackInData6(sprite, AnimBowMon_Step1_Callback);\n    sprite->callback = TranslateSpriteLinearById;\n}\n\nstatic void AnimBowMon_Step1_Callback(struct Sprite* sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];\n        PrepareBattlerSpriteForRotScale(sprite->data[3], ST_OAM_OBJ_NORMAL);\n        sprite->data[4] = (sprite->data[6] = GetBattlerSide(gBattleAnimAttacker)) ? 0x300 : 0xFFFFFD00;\n        sprite->data[5] = 0;\n    }\n\n    sprite->data[5] += sprite->data[4];\n    SetSpriteRotScale(sprite->data[3], 0x100, 0x100, sprite->data[5]);\n    SetBattlerSpriteYOffsetFromRotation(sprite->data[3]);\n    if (++sprite->data[0] > 3)\n    {\n        sprite->data[0] = 0;\n        sprite->callback = AnimBowMon_Step4;\n    }\n}\n\nstatic void AnimBowMon_Step2(struct Sprite* sprite)\n{\n    sprite->data[0] = 4;\n    sprite->data[1] = (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) ? -3 : 3;\n    sprite->data[2] = 0;\n    sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];\n    StoreSpriteCallbackInData6(sprite, AnimBowMon_Step4);\n    sprite->callback = TranslateSpriteLinearById;\n}\n\nstatic void AnimBowMon_Step3(struct Sprite* sprite)\n{\n    if (++sprite->data[0] > 8)\n    {\n        sprite->data[0] = 0;\n        sprite->callback = AnimBowMon_Step3_Callback;\n    }\n}\n\nstatic void AnimBowMon_Step3_Callback(struct Sprite* sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];\n        sprite->data[6] = GetBattlerSide(gBattleAnimAttacker);\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        {\n            sprite->data[4] = 0xFC00;\n            sprite->data[5] = 0xC00;\n        }\n        else\n        {\n            sprite->data[4] = 0x400;\n            sprite->data[5] = 0xF400;\n        }\n    }\n\n    sprite->data[5] += sprite->data[4];\n    SetSpriteRotScale(sprite->data[3], 0x100, 0x100, sprite->data[5]);\n    SetBattlerSpriteYOffsetFromRotation(sprite->data[3]);\n    if (++sprite->data[0] > 2)\n    {\n        ResetSpriteRotScale(sprite->data[3]);\n        sprite->callback = AnimBowMon_Step4;\n    }\n}\n\nstatic void AnimBowMon_Step4(struct Sprite* sprite)\n{\n    DestroyAnimSprite(sprite);\n}\n\nstatic void AnimTipMon(struct Sprite *sprite)\n{\n    sprite->data[0] = 0;\n    sprite->callback = AnimTipMon_Step;\n}\n\nstatic void AnimTipMon_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->data[1] = 0;\n        sprite->data[2] = gBattlerSpriteIds[gBattleAnimAttacker];\n        sprite->data[3] = GetBattlerSide(gBattleAnimAttacker);\n        sprite->data[4] = (sprite->data[3] != B_SIDE_PLAYER) ? 0x200 : -0x200;\n        sprite->data[5] = 0;\n        PrepareBattlerSpriteForRotScale(sprite->data[2], ST_OAM_OBJ_NORMAL);\n        sprite->data[0]++;\n        // fall through\n    case 1:\n        sprite->data[5] += sprite->data[4];\n        SetSpriteRotScale(sprite->data[2], 0x100, 0x100, sprite->data[5]);\n        SetBattlerSpriteYOffsetFromRotation(sprite->data[2]);\n        if (++sprite->data[1] > 3)\n        {\n            sprite->data[1] = 0;\n            sprite->data[4] *= -1;\n            sprite->data[0]++;\n        }\n        break;\n    case 2:\n        sprite->data[5] += sprite->data[4];\n        SetSpriteRotScale(sprite->data[2], 0x100, 0x100, sprite->data[5]);\n        SetBattlerSpriteYOffsetFromRotation(sprite->data[2]);\n        if (++sprite->data[1] > 3)\n        {\n            ResetSpriteRotScale(sprite->data[2]);\n            DestroyAnimSprite(sprite);\n        }\n        break;\n    }\n}\n\nvoid AnimTask_SkullBashPosition(u8 taskId)\n{\n    u8 side;\n\n    gTasks[taskId].data[0] = gBattlerSpriteIds[gBattleAnimAttacker];\n    side = GetBattlerSide(gBattleAnimAttacker);\n    gTasks[taskId].data[1] = side;\n    gTasks[taskId].data[2] = 0;\n    switch (gBattleAnimArgs[0])\n    {\n    default:\n        DestroyAnimVisualTask(taskId);\n        break;\n    case 0:\n        gTasks[taskId].data[2] = 0;\n        gTasks[taskId].data[3] = 8;\n        gTasks[taskId].data[4] = 0;\n        gTasks[taskId].data[5] = 3;\n        if (side == B_SIDE_PLAYER)\n            gTasks[taskId].data[5] *= -1;\n\n        gTasks[taskId].func = AnimTask_SkullBashPositionSet;\n        break;\n    case 1:\n        gTasks[taskId].data[3] = 8;\n        gTasks[taskId].data[4] = 0x600;\n        gTasks[taskId].data[5] = 0xC0;\n        if (side == B_SIDE_PLAYER)\n        {\n            gTasks[taskId].data[4] = -gTasks[taskId].data[4];\n            gTasks[taskId].data[5] = -gTasks[taskId].data[5];\n        }\n\n        gTasks[taskId].func = AnimTask_SkullBashPositionReset;\n        break;\n    }\n}\n\nstatic void AnimTask_SkullBashPositionSet(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    \n    switch (task->data[2])\n    {\n    case 0:\n        if (task->data[3])\n        {\n            task->data[4] += task->data[5];\n            gSprites[task->data[0]].x2 = task->data[4];\n            task->data[3]--;\n        }\n        else\n        {\n            task->data[3] = 8;\n            task->data[4] = 0;\n            task->data[5] = (task->data[1] == 0) ? -0xC0 : 0xC0;\n            PrepareBattlerSpriteForRotScale(task->data[0], ST_OAM_OBJ_NORMAL);\n            task->data[2]++;\n        }\n        break;\n    case 1:\n        if (task->data[3])\n        {\n            task->data[4] += task->data[5];\n            SetSpriteRotScale(task->data[0], 0x100, 0x100, task->data[4]);\n            SetBattlerSpriteYOffsetFromRotation(task->data[0]);\n            task->data[3]--;\n        }\n        else\n        {\n            task->data[3] = 8;\n            task->data[4] = gSprites[task->data[0]].x2;\n            task->data[5] = (task->data[1] == 0) ? 0x2 : -0x2;\n            task->data[6] = 1;\n            task->data[2]++;\n        }\n        break;\n    case 2:\n        if (task->data[3])\n        {\n            if (task->data[6])\n            {\n                task->data[6]--;\n            }\n            else\n            {\n                if (task->data[3] & 1)\n                    gSprites[task->data[0]].x2 = task->data[4] + task->data[5];\n                else\n                    gSprites[task->data[0]].x2 = task->data[4] - task->data[5];\n\n                task->data[6] = 1;\n                task->data[3]--;\n            }\n        }\n        else\n        {\n            gSprites[task->data[0]].x2 = task->data[4];\n            task->data[3] = 12;\n            task->data[2]++;\n        }\n        break;\n    case 3:\n        if (task->data[3])\n        {\n            task->data[3]--;\n        }\n        else\n        {\n            task->data[3] = 3;\n            task->data[4] = gSprites[task->data[0]].x2;\n            task->data[5] = (task->data[1] == 0) ? 8 : -8;\n            task->data[2]++;\n        }\n        break;\n    case 4:\n        if (task->data[3])\n        {\n            task->data[4] += task->data[5];\n            gSprites[task->data[0]].x2 = task->data[4];\n            task->data[3]--;\n        }\n        else\n        {\n            DestroyAnimVisualTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void AnimTask_SkullBashPositionReset(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    if (task->data[3])\n    {\n        task->data[4] -= task->data[5];\n        SetSpriteRotScale(task->data[0], 0x100, 0x100, task->data[4]);\n        SetBattlerSpriteYOffsetFromRotation(task->data[0]);\n        task->data[3]--;\n    }\n    else\n    {\n        ResetSpriteRotScale(task->data[0]);\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nstatic void AnimSlashSlice(struct Sprite* sprite)\n{\n    if (gBattleAnimArgs[0] == 0)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[1];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];\n    }\n\n    sprite->data[0] = 0;\n    sprite->data[1] = 0;\n    StoreSpriteCallbackInData6(sprite, AnimFalseSwipeSlice_Step3);\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n}\n\nstatic void AnimFalseSwipeSlice(struct Sprite* sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + 0xFFD0;\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    StoreSpriteCallbackInData6(sprite, AnimFalseSwipeSlice_Step1);\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n}\n\nstatic void AnimFalseSwipePositionedSlice(struct Sprite* sprite)\n{\n    sprite->x = sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + 0xFFD0 + gBattleAnimArgs[0];\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    StartSpriteAnim(sprite, 1);\n    sprite->data[0] = 0;\n    sprite->data[1] = 0;\n    sprite->callback = AnimFalseSwipeSlice_Step3;\n}\n\nstatic void AnimFalseSwipeSlice_Step1(struct Sprite* sprite)\n{\n    if (++sprite->data[0] > 8)\n    {\n        sprite->data[0] = 12;\n        sprite->data[1] = 8;\n        sprite->data[2] = 0;\n        StoreSpriteCallbackInData6(sprite, AnimFalseSwipeSlice_Step2);\n        sprite->callback = TranslateSpriteLinear;\n    }\n}\n\nstatic void AnimFalseSwipeSlice_Step2(struct Sprite* sprite)\n{\n    sprite->data[0] = 0;\n    sprite->data[1] = 0;\n    sprite->callback = AnimFalseSwipeSlice_Step3;\n}\n\nstatic void AnimFalseSwipeSlice_Step3(struct Sprite* sprite)\n{\n    if (++sprite->data[0] > 1)\n    {\n        sprite->data[0] = 0;\n        sprite->invisible = !sprite->invisible;\n        if (++sprite->data[1] > 8)\n            DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimEndureEnergy(struct Sprite* sprite)\n{\n    if (gBattleAnimArgs[0] == 0)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[1];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[2];\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[1];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[2];\n    }\n\n    sprite->data[0] = 0;\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->callback = AnimEndureEnergy_Step;\n}\n\nstatic void AnimEndureEnergy_Step(struct Sprite* sprite)\n{\n    if (++sprite->data[0] > sprite->data[1])\n    {\n        sprite->data[0] = 0;\n        sprite->y--;\n    }\n\n    sprite->y -= sprite->data[0];\n    if (sprite->animEnded)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimSharpenSphere(struct Sprite* sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) - 12;\n    sprite->data[0] = 0;\n    sprite->data[1] = 2;\n    sprite->data[2] = 0;\n    sprite->data[3] = 0;\n    sprite->data[4] = 0;\n    sprite->data[5] = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);\n    sprite->callback = AnimSharpenSphere_Step;\n}\n\nstatic void AnimSharpenSphere_Step(struct Sprite* sprite)\n{\n    if (++sprite->data[0] >= sprite->data[1])\n    {\n        sprite->invisible = !sprite->invisible;\n        if (!sprite->invisible)\n        {\n            sprite->data[4]++;\n            if (!(sprite->data[4] & 1))\n                PlaySE12WithPanning(SE_M_SWAGGER2, sprite->data[5]);\n        }\n\n        sprite->data[0] = 0;\n        if (++sprite->data[2] > 1)\n        {\n            sprite->data[2] = 0;\n            sprite->data[1]++;\n        }\n    }\n\n    if (sprite->animEnded && sprite->data[1] > 16 && sprite->invisible)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimConversion(struct Sprite* sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1];\n        if (IsContest())\n            sprite->y += 10;\n\n        sprite->data[0]++;\n    }\n\n    if ((u16)gBattleAnimArgs[7] == 0xFFFF)\n        DestroyAnimSprite(sprite);\n}\n\nvoid AnimTask_ConversionAlphaBlend(u8 taskId)\n{\n    if (gTasks[taskId].data[2] == 1)\n    {\n        gBattleAnimArgs[7] = 0xFFFF;\n        gTasks[taskId].data[2]++;\n    }\n    else if (gTasks[taskId].data[2] == 2)\n    {\n        DestroyAnimVisualTask(taskId);\n    }\n    else\n    {\n        if (++gTasks[taskId].data[0] == 4)\n        {\n            gTasks[taskId].data[0] = 0;\n            gTasks[taskId].data[1]++;\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - gTasks[taskId].data[1], gTasks[taskId].data[1]));\n            if (gTasks[taskId].data[1] == 16)\n                gTasks[taskId].data[2]++;\n        }\n    }\n}\n\nstatic void AnimConversion2(struct Sprite* sprite)\n{\n    InitSpritePosToAnimTarget(sprite, FALSE);\n    sprite->animPaused = TRUE;\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->callback = AnimConversion2_Step;\n}\n\nstatic void AnimConversion2_Step(struct Sprite* sprite)\n{\n    if (sprite->data[0])\n    {\n        sprite->data[0]--;\n    }\n    else\n    {\n        sprite->animPaused = FALSE;\n        sprite->data[0] = 30;\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n        sprite->callback = StartAnimLinearTranslation;\n        StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    }\n}\n\nvoid AnimTask_Conversion2AlphaBlend(u8 taskId)\n{\n    if (++gTasks[taskId].data[0] == 4)\n    {\n        gTasks[taskId].data[0] = 0;\n        gTasks[taskId].data[1]++;\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));\n        if (gTasks[taskId].data[1] == 16)\n            DestroyAnimVisualTask(taskId);\n    }\n}\n\n// Unused\nstatic void AnimTask_HideBattlersHealthbox(u8 taskId)\n{\n    u32 i;\n    \n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if (gBattleAnimArgs[0] == TRUE && GetBattlerSide(i) == B_SIDE_PLAYER)\n            SetHealthboxSpriteInvisible(gHealthboxSpriteIds[i]);\n\n        if (gBattleAnimArgs[1] == TRUE && GetBattlerSide(i) == B_SIDE_OPPONENT)\n            SetHealthboxSpriteInvisible(gHealthboxSpriteIds[i]);\n    }\n\n    DestroyAnimVisualTask(taskId);\n}\n\n// Unused\nstatic void AnimTask_ShowBattlersHealthbox(u8 taskId)\n{\n    u32 i;\n    for (i = 0; i < gBattlersCount; i++)\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[i]);\n\n    DestroyAnimVisualTask(taskId);\n}\n\nstatic void AnimMoon(struct Sprite* sprite)\n{\n    if (IsContest())\n    {\n        sprite->x = 48;\n        sprite->y = 40;\n    }\n    else\n    {\n        sprite->x = gBattleAnimArgs[0];\n        sprite->y = gBattleAnimArgs[1];\n    }\n\n    sprite->oam.shape = SPRITE_SHAPE(8x8);\n    sprite->oam.size = SPRITE_SIZE(64x32);\n    sprite->data[0] = 0;\n    sprite->callback = AnimMoon_Step;\n}\n\nstatic void AnimMoon_Step(struct Sprite* sprite)\n{\n    if (sprite->data[0])\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimMoonlightSparkle(struct Sprite* sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0];\n    sprite->y = gBattleAnimArgs[1];\n    sprite->data[0] = 0;\n    sprite->data[1] = 0;\n    sprite->data[2] = 0;\n    sprite->data[3] = 0;\n    sprite->data[4] = 1;\n    sprite->callback = AnimMoonlightSparkle_Step;\n}\n\nstatic void AnimMoonlightSparkle_Step(struct Sprite* sprite)\n{\n    if (++sprite->data[1] > 1)\n    {\n        sprite->data[1] = 0;\n        if (sprite->data[2] < 120)\n        {\n            sprite->y++;\n            sprite->data[2]++;\n        }\n    }\n\n    if (sprite->data[0])\n        DestroyAnimSprite(sprite);\n}\n\nvoid AnimTask_MoonlightEndFade_Step(u8);\n\n\nvoid AnimTask_MoonlightEndFade(u8 taskId)\n{\n    int a = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) & 0xFFFF;\n    int b;\n    int c;\n    int d;\n\n    gTasks[taskId].data[0] = 0;\n    gTasks[taskId].data[1] = 0;\n    gTasks[taskId].data[2] = 0;\n    gTasks[taskId].data[3] = a;\n    gTasks[taskId].data[4] = 0;\n    gTasks[taskId].data[5] = 0;\n    gTasks[taskId].data[6] = 0;\n    gTasks[taskId].data[7] = 13;\n    gTasks[taskId].data[8] = 14;\n    gTasks[taskId].data[9] = 15;\n    b = GetBattleMonSpritePalettesMask(1, 1, 1, 1);\n    c = a | b;\n    StorePointerInVars(&gTasks[taskId].data[14], &gTasks[taskId].data[15], (void *)c);\n    b = b | (0x10000 << IndexOfSpritePaletteTag(ANIM_TAG_MOON));\n    d = IndexOfSpritePaletteTag(ANIM_TAG_GREEN_SPARKLE);\n    BeginNormalPaletteFade((0x10000 << d) | b, 0, 0, 16, RGB(27, 29, 31));\n    gTasks[taskId].func = AnimTask_MoonlightEndFade_Step;\n    gTasks[taskId].func(taskId);\n}\n\nvoid AnimTask_MoonlightEndFade_Step(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    switch (task->data[0])\n    {\n    case 0:\n        if (++task->data[1] > 0)\n        {\n            u16 color;\n            u16 bitmask;\n            u16 r3;\n            u32 i;\n            u32 j;\n            task->data[1] = 0;\n            if (++task->data[2] <= 15)\n            {\n                u16 red;\n                u16 green;\n                u16 blue;\n                task->data[4] += task->data[7];\n                task->data[5] += task->data[8];\n                task->data[6] += task->data[9];\n                red = task->data[4] >> 3;\n                green = task->data[5] >> 3;\n                blue = task->data[6] >> 3;\n                color = RGB(red, green, blue);\n            }\n            else\n            {\n                color = RGB(27, 29, 31);\n                task->data[0]++;\n            }\n\n            bitmask = 1;\n            r3 = 0;\n            for (i = 0; i <= 15; i++)\n            {\n                if (task->data[3] & bitmask)\n                {\n                    for (j = 1; j <= 15; j++)\n                    {\n                        gPlttBufferFaded[r3 + j] = color;\n                    }\n                }\n\n                bitmask <<= 1;\n                r3 += 16;\n            }\n        }\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n        {\n            u8 spriteId;\n            for (spriteId = 0; spriteId < MAX_SPRITES; spriteId++)\n            {\n                if (gSprites[spriteId].template == &gMoonSpriteTemplate || gSprites[spriteId].template == &gMoonlightSparkleSpriteTemplate)\n                    gSprites[spriteId].data[0] = 1;\n            }\n\n            task->data[1] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 2:\n        if (++task->data[1] > 30)\n        {\n            BeginNormalPaletteFade((u32)LoadPointerFromVars(task->data[14], task->data[15]), 0, 16, 0, RGB(27, 29, 31));\n            task->data[0]++;\n        }\n        break;\n    case 3:\n        if (!gPaletteFade.active)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void AnimHornHit(struct Sprite* sprite)\n{\n    if (gBattleAnimArgs[2] < 2)\n        gBattleAnimArgs[2] = 2;\n\n    if (gBattleAnimArgs[2] > 0x7F)\n        gBattleAnimArgs[2] = 0x7F;\n\n    sprite->data[0] = 0;\n    sprite->data[1] = gBattleAnimArgs[2];\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0];\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];\n    sprite->data[6] = sprite->x;\n    sprite->data[7] = sprite->y;\n    if (IsContest())\n    {\n        sprite->oam.matrixNum = ST_OAM_HFLIP;\n        sprite->x += 40;\n        sprite->y += 20;\n        sprite->data[2] = sprite->x << 7;\n        sprite->data[3] = -0x1400 / sprite->data[1];\n        sprite->data[4] = sprite->y << 7;\n        sprite->data[5] = -0xA00 / sprite->data[1];\n    }\n    else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n    {\n        sprite->x -= 40;\n        sprite->y += 20;\n        sprite->data[2] = sprite->x << 7;\n        sprite->data[3] = 0x1400 / sprite->data[1];\n        sprite->data[4] = sprite->y << 7;\n        sprite->data[5] = -0xA00 / sprite->data[1];\n    }\n    else\n    {\n        sprite->x += 40;\n        sprite->y -= 20;\n        sprite->data[2] = sprite->x << 7;\n        sprite->data[3] = -0x1400 / sprite->data[1];\n        sprite->data[4] = sprite->y << 7;\n        sprite->data[5] = 0xA00 / sprite->data[1];\n        sprite->oam.matrixNum = (ST_OAM_HFLIP | ST_OAM_VFLIP);\n    }\n\n    sprite->callback = AnimHornHit_Step;\n}\n\nstatic void AnimHornHit_Step(struct Sprite* sprite)\n{\n    sprite->data[2] += sprite->data[3];\n    sprite->data[4] += sprite->data[5];\n    sprite->x = sprite->data[2] >> 7;\n    sprite->y = sprite->data[4] >> 7;\n    if (--sprite->data[1] == 1)\n    {\n        sprite->x = sprite->data[6];\n        sprite->y = sprite->data[7];\n    }\n\n    if (sprite->data[1] == 0)\n        DestroyAnimSprite(sprite);\n}\n\nvoid AnimTask_DoubleTeam(u8 taskId)\n{\n    u32 i;\n    int obj;\n    u16 r3;\n    u16 r4;\n    struct Task* task = &gTasks[taskId];\n    \n    task->data[0] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    task->data[1] = AllocSpritePalette(ANIM_TAG_BENT_SPOON);\n    r3 = OBJ_PLTT_ID(task->data[1]);\n    r4 = OBJ_PLTT_ID2(gSprites[task->data[0]].oam.paletteNum);\n    for (i = 1; i < 16; i++)\n        gPlttBufferUnfaded[r3 + i] = gPlttBufferUnfaded[r4 + i];\n\n    BlendPalette(r3, 16, 11, RGB_BLACK);\n    task->data[3] = 0;\n    i = 0;\n    while (i < 2 && (obj = CloneBattlerSpriteWithBlend(0)) >= 0)\n    {\n        gSprites[obj].oam.paletteNum = task->data[1];\n        gSprites[obj].data[0] = 0;\n        gSprites[obj].data[1] = i << 7;\n        gSprites[obj].data[2] = taskId;\n        gSprites[obj].callback = AnimDoubleTeam;\n        task->data[3]++;\n        i++;\n    }\n\n    task->func = AnimTask_DoubleTeam_Step;\n    if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);\n    else\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);\n}\n\nstatic void AnimTask_DoubleTeam_Step(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    if (!task->data[3])\n    {\n        if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)\n            SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);\n        else\n            SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);\n\n        FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON);\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nstatic void AnimDoubleTeam(struct Sprite* sprite)\n{\n    if (++sprite->data[3] > 1)\n    {\n        sprite->data[3] = 0;\n        sprite->data[0]++;\n    }\n\n    if (sprite->data[0] > 64)\n    {\n        gTasks[sprite->data[2]].data[3]--;\n        DestroySpriteWithActiveSheet(sprite);\n    }\n    else\n    {\n        sprite->data[4] = gSineTable[sprite->data[0]] / 6;\n        sprite->data[5] = gSineTable[sprite->data[0]] / 13;\n        sprite->data[1] = (sprite->data[1] + sprite->data[5]) & 0xFF;\n        sprite->x2 = Sin(sprite->data[1], sprite->data[4]);\n    }\n}\n\nstatic void AnimSuperFang(struct Sprite* sprite)\n{\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n}\n\nvoid AnimTask_MusicNotesRainbowBlend(u8 taskId)\n{\n    u32 i;\n    u32 j;\n    u16 index;\n\n    index = IndexOfSpritePaletteTag(sParticlesColorBlendTable[0][0]);\n    if (index != 0xFF)\n    {\n        index = OBJ_PLTT_ID(index);\n        for (i = 1; i < NELEMS(sParticlesColorBlendTable[0]); i++)\n            gPlttBufferFaded[index + i] = sParticlesColorBlendTable[0][i];\n    }\n\n    for (j = 1; j < NELEMS(sParticlesColorBlendTable); j++)\n    {\n        index = AllocSpritePalette(sParticlesColorBlendTable[j][0]);\n        if (index != 0xFF)\n        {\n            index = OBJ_PLTT_ID(index);\n            for (i = 1; i < NELEMS(sParticlesColorBlendTable[0]); i++)\n                gPlttBufferFaded[index + i] = sParticlesColorBlendTable[j][i];\n        }\n    }\n    DestroyAnimVisualTask(taskId);\n}\n\n// clears the rainbow effect for musical notes.\nvoid AnimTask_MusicNotesClearRainbowBlend(u8 taskId)\n{\n    u32 i;\n    \n    for (i = 1; i < NELEMS(sParticlesColorBlendTable); i++)\n        FreeSpritePaletteByTag(sParticlesColorBlendTable[i][0]);\n\n    DestroyAnimVisualTask(taskId);\n}\n\n#define sMoveTimer      data[0]\n#define sBlendTableIdx  data[1]\n#define sBlendTimer     data[2]\n#define sBlendCycleTime data[3]\n#define sX              data[4]\n#define sY              data[5]\n#define sVelocX         data[6]\n#define sVelocY         data[7]\n\nstatic void AnimWavyMusicNotes(struct Sprite* sprite)\n{\n    u8 index;\n    u8 x, y;\n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    StartSpriteAnim(sprite, gBattleAnimArgs[0]);\n    if ((index = IndexOfSpritePaletteTag(sParticlesColorBlendTable[gBattleAnimArgs[1]][0])) != 0xFF)\n        sprite->oam.paletteNum = index;\n\n    sprite->sBlendTableIdx = gBattleAnimArgs[1];\n    sprite->sBlendTimer = 0;\n    sprite->sBlendCycleTime = gBattleAnimArgs[2];\n    if (IsContest())\n    {\n        x = 48;\n        y = 40;\n    }\n    else\n    {\n        x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n\n    sprite->sX = sprite->x << 4;\n    sprite->sY = sprite->y << 4;\n    AnimWavyMusicNotes_CalcVelocity(x - sprite->x, y - sprite->y, &sprite->sVelocX, &sprite->sVelocY, 40);\n    sprite->callback = AnimWavyMusicNotes_Step;\n}\n\nstatic void AnimWavyMusicNotes_CalcVelocity(s16 x, s16 y, s16 *velocX, s16 *velocY, s8 xSpeedFactor)\n{\n   int x2;\n    int time;\n    if (x < 0)\n        xSpeedFactor = -xSpeedFactor;\n\n    x2 = x * 256;\n    time = x2 / xSpeedFactor;\n    if (time == 0)\n        time = 1;\n\n    *velocX = x2 / time;\n    *velocY = (y * 256) / time;\n}\n\nstatic void AnimWavyMusicNotes_Step(struct Sprite* sprite)\n{\n    s16 y, trigIdx;\n    u8 index;\n\n    sprite->sMoveTimer++;\n    trigIdx = sprite->sMoveTimer * 5 - ((sprite->sMoveTimer * 5 / 256) << 8);\n    sprite->sX += sprite->sVelocX;\n    sprite->sY += sprite->sVelocY;\n    sprite->x = sprite->sX >> 4;\n    sprite->y = sprite->sY >> 4;\n    sprite->y2 = Sin(trigIdx, 15);\n\n    y = sprite->y;\n    if (sprite->x < -16 || sprite->x > DISPLAY_WIDTH + 16 || y < -16 || y > DISPLAY_HEIGHT - 32)\n    {\n        DestroySpriteAndMatrix(sprite);\n    }\n    else\n    {\n        if (sprite->sBlendCycleTime && ++sprite->sBlendTimer > sprite->sBlendCycleTime)\n        {\n            sprite->sBlendTimer = 0;\n            if (++sprite->sBlendTableIdx > 3)\n                sprite->sBlendTableIdx = 0;\n\n            index = IndexOfSpritePaletteTag(sParticlesColorBlendTable[sprite->sBlendTableIdx][0]);\n            if (index != 0xFF)\n                sprite->oam.paletteNum = index;\n        }\n    }\n}\n\nstatic void AnimFlyingMusicNotes(struct Sprite* sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)\n        gBattleAnimArgs[1] *= -1;\n\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1];\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];\n    StartSpriteAnim(sprite, gBattleAnimArgs[0]);\n    sprite->data[2] = 0;\n    sprite->data[3] = 0;\n    sprite->data[4] = sprite->x << 4;\n    sprite->data[5] = sprite->y << 4;\n    sprite->data[6] = (gBattleAnimArgs[1] << 4) / 5;\n    sprite->data[7] = (gBattleAnimArgs[2] << 7) / 5;\n    sprite->callback = AnimFlyingMusicNotes_Step;\n}\n\nstatic void AnimFlyingMusicNotes_Step(struct Sprite* sprite)\n{\n    sprite->data[4] += sprite->data[6];\n    sprite->data[5] += sprite->data[7];\n    sprite->x = sprite->data[4] >> 4;\n    sprite->y = sprite->data[5] >> 4;\n    if (sprite->data[0] > 5 && sprite->data[3] == 0)\n    {\n        sprite->data[2] = (sprite->data[2] + 16) & 0xFF;\n        sprite->x2 = Cos(sprite->data[2], 18);\n        sprite->y2 = Sin(sprite->data[2], 18);\n        if (sprite->data[2] == 0)\n            sprite->data[3] = 1;\n    }\n\n    if (++sprite->data[0] == 48)\n        DestroySpriteAndMatrix(sprite);\n}\n\nstatic void AnimBellyDrumHand(struct Sprite* sprite)\n{\n    s16 a;\n    \n    if (gBattleAnimArgs[0] == 1)\n    {\n        sprite->oam.matrixNum = ST_OAM_HFLIP;\n        a = 16;\n    }\n    else\n    {\n        a = -16;\n    }\n\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + a;\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + 8;\n    sprite->data[0] = 8;\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nstatic void AnimSlowFlyingMusicNotes(struct Sprite* sprite)\n{\n    s16 xDiff;\n    u8 index;\n    \n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    sprite->y += 8;\n    StartSpriteAnim(sprite, gBattleAnimArgs[1]);\n    index = IndexOfSpritePaletteTag(sParticlesColorBlendTable[gBattleAnimArgs[2]][0]);\n    if (index != 0xFF)\n        sprite->oam.paletteNum = index;\n\n    xDiff = (gBattleAnimArgs[0] == 0) ? -32 : 32;\n    sprite->data[0] = 40;\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = xDiff + sprite->data[1];\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = sprite->data[3] - 40;\n    InitAnimLinearTranslation(sprite);\n    sprite->data[5] = gBattleAnimArgs[3];\n    sprite->callback = AnimSlowFlyingMusicNotes_Step;\n}\n\nstatic void AnimSlowFlyingMusicNotes_Step(struct Sprite* sprite)\n{\n    if (!AnimTranslateLinear(sprite))\n    {\n        s16 xDiff;\n        \n        xDiff = Sin(sprite->data[5], 8);\n        if (sprite->x2 < 0)\n            xDiff = -xDiff;\n\n        sprite->x2 += xDiff;\n        sprite->y2 += Sin(sprite->data[5], 4);\n        sprite->data[5] = (sprite->data[5] + 8) & 0xFF;\n    }\n    else\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\nvoid SetSpriteNextToMonHead(u8 battler, struct Sprite* sprite)\n{\n    if (GetBattlerSide(battler) == B_SIDE_PLAYER)\n        sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) + 8;\n    else\n        sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8;\n\n    sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) - (s16)GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4;\n}\n\nstatic void AnimThoughtBubble(struct Sprite* sprite)\n{\n    u8 animNum;\n    u8 battler;\n    \n    if (gBattleAnimArgs[0] == 0)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    SetSpriteNextToMonHead(battler, sprite);\n    animNum = (GetBattlerSide(battler) == B_SIDE_PLAYER) ? 0 : 1;\n    sprite->data[0] = gBattleAnimArgs[1];\n    sprite->data[1] = animNum + 2;\n    StartSpriteAnim(sprite, animNum);\n    StoreSpriteCallbackInData6(sprite, AnimThoughtBubble_Step);\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n}\n\nstatic void AnimThoughtBubble_Step(struct Sprite* sprite)\n{\n    if (--sprite->data[0] == 0)\n    {\n        StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n        StartSpriteAnim(sprite, sprite->data[1]);\n        sprite->callback = RunStoredCallbackWhenAnimEnds;\n    }\n}\n\nstatic void AnimMetronomeFinger(struct Sprite* sprite)\n{\n    u8 battler;\n    \n    if (gBattleAnimArgs[0] == 0)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    SetSpriteNextToMonHead(battler, sprite);\n    sprite->data[0] = 0;\n    StoreSpriteCallbackInData6(sprite, AnimMetronomeFinger_Step);\n    sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n}\n\nstatic void AnimMetronomeFinger_Step(struct Sprite* sprite)\n{\n    if (++sprite->data[0] > 16)\n    {\n        StartSpriteAffineAnim(sprite, 1);\n        StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n        sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n    }\n}\n\nstatic void AnimFollowMeFinger(struct Sprite* sprite)\n{\n    u8 battler;\n    \n    if (gBattleAnimArgs[0] == 0)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X);\n    sprite->y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP);\n    if (sprite->y <= 9)\n        sprite->y = 10;\n\n    sprite->data[0] = 1;\n    sprite->data[1] = 0;\n    sprite->data[2] = sprite->subpriority;\n    sprite->data[3] = sprite->subpriority + 4;\n    sprite->data[4] = 0;\n    StoreSpriteCallbackInData6(sprite, AnimFollowMeFinger_Step1);\n    sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n}\n\nstatic void AnimFollowMeFinger_Step1(struct Sprite* sprite)\n{\n    if (++sprite->data[4] > 12)\n        sprite->callback = AnimFollowMeFinger_Step2;\n}\n\nstatic void AnimFollowMeFinger_Step2(struct Sprite* sprite)\n{\n    s16 x1, x2;\n\n    sprite->data[1] += 4;\n    if (sprite->data[1] > 254)\n    {\n        if (--sprite->data[0] == 0)\n        {\n            sprite->x2 = 0;\n            sprite->callback = AnimMetronomeFinger_Step;\n            return;\n        }\n        else\n        {\n            sprite->data[1] &= 0xFF;\n        }\n    }\n\n    if (sprite->data[1] > 0x4F)\n        sprite->subpriority = sprite->data[3];\n\n    if (sprite->data[1] > 0x9F)\n        sprite->subpriority = sprite->data[2];\n\n    x1 = gSineTable[sprite->data[1]];\n    x2 = x1 >> 3;\n    sprite->x2 = (x1 >> 3) + (x2 >> 1);\n}\n\nstatic void AnimTauntFinger(struct Sprite* sprite)\n{\n    u8 battler;\n    \n    if (gBattleAnimArgs[0] == 0)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    SetSpriteNextToMonHead(battler, sprite);\n    if (GetBattlerSide(battler) == B_SIDE_PLAYER)\n    {\n        StartSpriteAnim(sprite, 0);\n        sprite->data[0] = 2;\n    }\n    else\n    {\n        StartSpriteAnim(sprite, 1);\n        sprite->data[0] = 3;\n    }\n\n    sprite->callback = AnimTauntFinger_Step1;\n}\n\nstatic void AnimTauntFinger_Step1(struct Sprite* sprite)\n{\n    if (++sprite->data[1] > 10)\n    {\n        sprite->data[1] = 0;\n        StartSpriteAnim(sprite, sprite->data[0]);\n        StoreSpriteCallbackInData6(sprite, AnimTauntFinger_Step2);\n        sprite->callback = RunStoredCallbackWhenAnimEnds;\n    }\n}\n\nstatic void AnimTauntFinger_Step2(struct Sprite* sprite)\n{\n    if (++sprite->data[1] > 5)\n        DestroyAnimSprite(sprite);\n}\n\n"
  },
  {
    "path": "src/battle_anim_effects_2.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"battle_interface.h\"\n#include \"decompress.h\"\n#include \"graphics.h\"\n#include \"math_util.h\"\n#include \"random.h\"\n#include \"scanline_effect.h\"\n#include \"trig.h\"\n#include \"util.h\"\n#include \"constants/songs.h\"\n\nstatic void AnimBouncingMusicNote(struct Sprite *);\nstatic void AnimBouncingMusicNote_Step(struct Sprite *);\nstatic void AnimMovingClamp(struct Sprite *);\nstatic void AnimMovingClamp_Step(struct Sprite *);\nstatic void AnimMovingClamp_End(struct Sprite *);\nstatic void AnimTask_Withdraw_Step(u8);\nstatic void AnimSwordsDanceBlade(struct Sprite *);\nstatic void AnimSwordsDanceBlade_Step(struct Sprite *);\nstatic void AnimVoidLines(struct Sprite *);\nstatic void AnimVoidLines_Step(struct Sprite *);\nstatic void AnimFallingCoin(struct Sprite *);\nstatic void AnimFallingCoin_Step(struct Sprite *);\nstatic void AnimBulletSeed(struct Sprite *);\nstatic void AnimBulletSeed_Step1(struct Sprite *);\nstatic void AnimBulletSeed_Step2(struct Sprite *);\nstatic void AnimViceGripPincer(struct Sprite *);\nstatic void AnimViceGripPincer_Step(struct Sprite *);\nstatic void AnimGuillotinePincer(struct Sprite *);\nstatic void AnimGuillotinePincer_Step1(struct Sprite *);\nstatic void AnimGuillotinePincer_Step2(struct Sprite *);\nstatic void AnimGuillotinePincer_Step3(struct Sprite *);\nstatic void AnimTask_GrowAndGrayscale_Step(u8);\nstatic void AnimTask_Minimize_Step1(u8);\nstatic void CreateMinimizeSprite(struct Task *, u8);\nstatic void ClonedMinizeSprite_Step(struct Sprite *);\nstatic void AnimTask_Splash_Step(u8);\nstatic void AnimTask_GrowAndShrink_Step(u8);\nstatic void AnimTask_ThrashMoveMonHorizontal_Step(u8);\nstatic void AnimTask_ThrashMoveMonVertical_Step(u8);\nstatic void AnimTask_SketchDrawMon_Step(u8);\nstatic void AnimPencil(struct Sprite *);\nstatic void AnimPencil_Step(struct Sprite *);\nstatic void AnimSoftBoiledEgg(struct Sprite *);\nstatic void AnimSoftBoiledEgg_Step1(struct Sprite *);\nstatic void AnimSoftBoiledEgg_Step2(struct Sprite *);\nstatic void AnimSoftBoiledEgg_Step3(struct Sprite *);\nstatic void AnimSoftBoiledEgg_Step3_Callback1(struct Sprite *);\nstatic void AnimSoftBoiledEgg_Step3_Callback2(struct Sprite *);\nstatic void AnimSoftBoiledEgg_Step4(struct Sprite *);\nstatic void AnimSoftBoiledEgg_Step4_Callback(struct Sprite *);\nstatic void AnimTask_AttackerStretchAndDisappear_Step(u8);\nstatic void AnimTask_ExtremeSpeedImpact_Step(u8);\nstatic void AnimTask_ExtremeSpeedMonReappear_Step(u8);\nstatic void AnimTask_SpeedDust_Step(u8);\nstatic void AnimTask_FakeOut_Step1(u8);\nstatic void AnimTask_FakeOut_Step2(u8);\nstatic void AnimRedHeartProjectile(struct Sprite *);\nstatic void AnimRedHeartProjectile_Step(struct Sprite *);\nstatic void AnimRedHeartRising(struct Sprite *);\nstatic void AnimRedHeartRising_Step(struct Sprite *);\nstatic void AnimTask_HeartsBackground_Step(u8);\nstatic void AnimTask_ScaryFace_Step(u8);\nstatic void AnimOrbitFast(struct Sprite *);\nstatic void AnimOrbitFast_Step(struct Sprite *);\nstatic void AnimOrbitScatter(struct Sprite *);\nstatic void AnimOrbitScatter_Step(struct Sprite *);\nstatic void AnimMovementWaves(struct Sprite *);\nstatic void AnimMovementWaves_Step(struct Sprite *);\nstatic void AnimTask_UproarDistortion_Step(u8);\nstatic void AnimJaggedMusicNote(struct Sprite *);\nstatic void AnimJaggedMusicNote_Step(struct Sprite *);\nstatic void AnimPerishSongMusicNote2(struct Sprite *);\nstatic void AnimPerishSongMusicNote(struct Sprite *);\nstatic void AnimPerishSongMusicNote_Step1(struct Sprite *);\nstatic void AnimPerishSongMusicNote_Step2(struct Sprite *);\nstatic void AnimCirclingFinger(struct Sprite *);\nstatic void AnimVibrateBattlerBack(struct Sprite *);\nstatic void AnimKinesisZapEnergy(struct Sprite *);\nstatic void AnimSonicBoomProjectile(struct Sprite *);\nstatic void AnimAirWaveProjectile(struct Sprite *);\nstatic void AnimCoinThrow(struct Sprite *);\nstatic void AnimRazorWindTornado(struct Sprite *);\nstatic void AnimBreathPuff(struct Sprite *);\nstatic void AnimAngerMark(struct Sprite *);\nstatic void AnimBlendThinRing(struct Sprite *);\nstatic void AnimHyperVoiceRing(struct Sprite *);\nstatic void AnimUproarRing(struct Sprite *);\nstatic void AnimSpeedDust(struct Sprite *);\nstatic void AnimHealBellMusicNote(struct Sprite *);\nstatic void AnimMagentaHeart(struct Sprite *);\nstatic void AnimSpitUpOrb(struct Sprite *);\nstatic void AnimEyeSparkle(struct Sprite *);\nstatic void AnimAngel(struct Sprite *);\nstatic void AnimPinkHeart(struct Sprite *);\nstatic void AnimDevil(struct Sprite *);\nstatic void AnimFurySwipes(struct Sprite *);\nstatic void AnimGuardRing(struct Sprite *);\n\n// Unused\nstatic const struct SpriteTemplate sCirclingFingerSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FINGER,\n    .paletteTag = ANIM_TAG_FINGER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimCirclingFinger,\n};\n\nstatic const union AnimCmd sAnim_BouncingMusicNote[] =\n{\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_END,\n};\n\n// Unused (association assumed)\nstatic const union AnimCmd *const sAnims_BouncingMusicNote[] =\n{\n    sAnim_BouncingMusicNote,\n};\n\n// Unused\nstatic const struct SpriteTemplate sBouncingMusicNoteSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUSIC_NOTES,\n    .paletteTag = ANIM_TAG_MUSIC_NOTES,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBouncingMusicNote,\n};\n\n// Unused\nstatic const struct SpriteTemplate sVibrateBattlerBackSpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimVibrateBattlerBack,\n};\n\n// Unused\nstatic const struct SpriteTemplate sMovingClampSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CLAMP,\n    .paletteTag = ANIM_TAG_CLAMP,\n    .oam = &gOamData_AffineNormal_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gAffineAnims_Bite,\n    .callback = AnimMovingClamp,\n};\n\nstatic const union AnimCmd sAnim_SmallExplosion[] =\n{\n    ANIMCMD_FRAME(0, 9),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_SmallExplosion[] =\n{\n    sAnim_SmallExplosion,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_SmallExplosion[] =\n{\n    AFFINEANIMCMD_FRAME(80, 80, 0, 0),\n    AFFINEANIMCMD_FRAME(9, 9, 0, 18),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_SmallExplosion[] =\n{\n    sAffineAnim_SmallExplosion,\n};\n\n// Unused\nstatic const struct SpriteTemplate sSmallExplosionSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_EXPLOSION_6,\n    .paletteTag = ANIM_TAG_EXPLOSION_6,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sAnims_SmallExplosion,\n    .images = NULL,\n    .affineAnims = sAffineAnims_SmallExplosion,\n    .callback = AnimSpriteOnMonPos,\n};\n\nstatic const union AnimCmd sKinesisZapEnergyAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(24, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(40, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(48, 3, .hFlip = TRUE),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sKinesisZapEnergyAnimTable[] =\n{\n    sKinesisZapEnergyAnimCmds,\n};\n\nconst struct SpriteTemplate gKinesisZapEnergySpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ALERT,\n    .paletteTag = ANIM_TAG_ALERT,\n    .oam = &gOamData_AffineOff_ObjNormal_32x16,\n    .anims = sKinesisZapEnergyAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimKinesisZapEnergy,\n};\n\nstatic const union AffineAnimCmd sSwordsDanceBladeAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(16, 256, 0, 0),\n    AFFINEANIMCMD_FRAME(20, 0, 0, 12),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 32),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sSwordsDanceBladeAffineAnimTable[] =\n{\n    sSwordsDanceBladeAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gSwordsDanceBladeSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SWORD,\n    .paletteTag = ANIM_TAG_SWORD,\n    .oam = &gOamData_AffineNormal_ObjBlend_32x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sSwordsDanceBladeAffineAnimTable,\n    .callback = AnimSwordsDanceBlade,\n};\n\nconst struct SpriteTemplate gSonicBoomSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_AIR_WAVE,\n    .paletteTag = ANIM_TAG_AIR_WAVE,\n    .oam = &gOamData_AffineDouble_ObjBlend_32x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSonicBoomProjectile,\n};\n\nconst struct SpriteTemplate gAirWaveProjectileSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_AIR_WAVE,\n    .paletteTag = ANIM_TAG_AIR_WAVE,\n    .oam = &gOamData_AffineOff_ObjBlend_32x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimAirWaveProjectile,\n};\n\nstatic const union AffineAnimCmd sGrowingRingAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(32, 32, 0, 0),\n    AFFINEANIMCMD_FRAME(7, 7, 0, -56),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sWaterPulseRingAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(5, 5, 0, 10),\n    AFFINEANIMCMD_FRAME(-10, -10, 0, 10),\n    AFFINEANIMCMD_FRAME(10, 10, 0, 10),\n    AFFINEANIMCMD_FRAME(-10, -10, 0, 10),\n    AFFINEANIMCMD_FRAME(10, 10, 0, 10),\n    AFFINEANIMCMD_FRAME(-10, -10, 0, 10),\n    AFFINEANIMCMD_FRAME(10, 10, 0, 10),\n    AFFINEANIMCMD_END,\n};\n\nconst union AffineAnimCmd *const gGrowingRingAffineAnimTable[] =\n{\n    sGrowingRingAffineAnimCmds,\n};\n\nstatic const union AffineAnimCmd *const sWaterPulseRingAffineAnimTable[] =    \n{\n    sWaterPulseRingAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gSupersonicRingSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_GOLD_RING,\n    .paletteTag = ANIM_TAG_GOLD_RING,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gGrowingRingAffineAnimTable,\n    .callback = TranslateAnimSpriteToTargetMonLocation,\n};\n\nconst struct SpriteTemplate gScreechRingSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_PURPLE_RING,\n    .paletteTag = ANIM_TAG_PURPLE_RING,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gGrowingRingAffineAnimTable,\n    .callback = TranslateAnimSpriteToTargetMonLocation,\n};\n\nconst struct SpriteTemplate gMetalSoundSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_METAL_SOUND_WAVES,\n    .paletteTag = ANIM_TAG_METAL_SOUND_WAVES,\n    .oam = &gOamData_AffineDouble_ObjNormal_32x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gGrowingRingAffineAnimTable,\n    .callback = TranslateAnimSpriteToTargetMonLocation,\n};\n\nconst struct SpriteTemplate gWaterPulseRingSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_BLUE_RING_2,\n    .paletteTag = ANIM_TAG_BLUE_RING_2,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sWaterPulseRingAffineAnimTable,\n    .callback = AnimWaterPulseRing,\n};\n\nconst struct SpriteTemplate gEggThrowSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_LARGE_FRESH_EGG,\n    .paletteTag = ANIM_TAG_LARGE_FRESH_EGG,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimThrowProjectile,\n};\n\nstatic const struct SpriteTemplate sVoidLinesSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_VOID_LINES,\n    .paletteTag = ANIM_TAG_VOID_LINES,\n    .oam = &gOamData_AffineOff_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimVoidLines,\n};\n\nstatic const union AnimCmd sCoinAnimCmds[] =\n{\n    ANIMCMD_FRAME(8, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sCoinAnimTable[] =\n{\n    sCoinAnimCmds,\n};\n\nstatic const union AffineAnimCmd sFallingCoinAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, 10, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sFallingCoinAffineAnimTable[] =\n{\n    sFallingCoinAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gCoinThrowSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_COIN,\n    .paletteTag = ANIM_TAG_COIN,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = sCoinAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimCoinThrow,\n};\n\nconst struct SpriteTemplate gFallingCoinSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_COIN,\n    .paletteTag = ANIM_TAG_COIN,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = sCoinAnimTable,\n    .images = NULL,\n    .affineAnims = sFallingCoinAffineAnimTable,\n    .callback = AnimFallingCoin,\n};\n\nstatic const union AffineAnimCmd sBulletSeedAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, 20, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sBulletSeedAffineAnimTable[] =\n{\n    sBulletSeedAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gBulletSeedSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_SEED,\n    .paletteTag = ANIM_TAG_SEED,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sBulletSeedAffineAnimTable,\n    .callback = AnimBulletSeed,\n};\n\nstatic const union AffineAnimCmd sRazorWindTornadoAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(16, 256, 0, 0),\n    AFFINEANIMCMD_FRAME(4, 0, 0, 40),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sRazorWindTornadoAffineAnimTable[] =\n{\n    sRazorWindTornadoAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gRazorWindTornadoSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GUST,\n    .paletteTag = ANIM_TAG_GUST,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sRazorWindTornadoAffineAnimTable,\n    .callback = AnimRazorWindTornado,\n};\n\nstatic const union AnimCmd sViceGripAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(32, 20),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sViceGripAnimCmds2[] =\n{\n    ANIMCMD_FRAME(0, 3, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 3, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 20, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sViceGripAnimTable[] =\n{\n    sViceGripAnimCmds1,\n    sViceGripAnimCmds2,\n};\n\nconst struct SpriteTemplate gViceGripSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CUT,\n    .paletteTag = ANIM_TAG_CUT,\n    .oam = &gOamData_AffineOff_ObjBlend_32x32,\n    .anims = sViceGripAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimViceGripPincer,\n};\n\nstatic const union AnimCmd sGuillotineAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(16, 2),\n    ANIMCMD_FRAME(32, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sGuillotineAnimCmds2[] =\n{\n    ANIMCMD_FRAME(0, 2, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 2, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 1, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sGuillotineAnimTable[] =\n{\n    sGuillotineAnimCmds1,\n    sGuillotineAnimCmds2,\n};\n\nconst struct SpriteTemplate gGuillotineSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CUT,\n    .paletteTag = ANIM_TAG_CUT,\n    .oam = &gOamData_AffineOff_ObjBlend_32x32,\n    .anims = sGuillotineAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimGuillotinePincer,\n};\n\nstatic const union AffineAnimCmd sSplashEffectAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(-6, 4, 0, 8),\n    AFFINEANIMCMD_FRAME(10, -10, 0, 8),\n    AFFINEANIMCMD_FRAME(-4, 6, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sGrowAndShrinkAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(-4, -5, 0, 12),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 24),\n    AFFINEANIMCMD_FRAME(4, 5, 0, 12),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AnimCmd sBreathPuffAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(4, 40, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(12, 4, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sBreathPuffAnimCmds2[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(4, 40),\n    ANIMCMD_FRAME(8, 4),\n    ANIMCMD_FRAME(12, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sBreathPuffAnimTable[] =\n{\n    sBreathPuffAnimCmds1,\n    sBreathPuffAnimCmds2,\n};\n\nconst struct SpriteTemplate gBreathPuffSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BREATH,\n    .paletteTag = ANIM_TAG_BREATH,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sBreathPuffAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBreathPuff,\n};\n\nstatic const union AffineAnimCmd sAngerMarkAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(11, 11, 0, 8),\n    AFFINEANIMCMD_FRAME(-11, -11, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAngerMarkAffineAnimTable[] =\n{\n    sAngerMarkAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gAngerMarkSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ANGER,\n    .paletteTag = ANIM_TAG_ANGER,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAngerMarkAffineAnimTable,\n    .callback = AnimAngerMark,\n};\n\nstatic const union AffineAnimCmd sThrashMoveMonAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(-10, 9, 0, 7),\n    AFFINEANIMCMD_FRAME(20, -20, 0, 7),\n    AFFINEANIMCMD_FRAME(-20, 20, 0, 7),\n    AFFINEANIMCMD_FRAME(10, -9, 0, 7),\n    AFFINEANIMCMD_LOOP(2),\n    AFFINEANIMCMD_END,\n};\n\nconst struct SpriteTemplate gPencilSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_PENCIL,\n    .paletteTag = ANIM_TAG_PENCIL,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimPencil,\n};\n\nconst struct SpriteTemplate gSnoreZSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_SNORE_Z,\n    .paletteTag = ANIM_TAG_SNORE_Z,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimTravelDiagonally,\n};\n\nstatic const union AnimCmd sExplosionAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(32, 5),\n    ANIMCMD_FRAME(48, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sExplosionAnimTable[] =\n{\n    sExplosionAnimCmds,\n};\n\nconst struct SpriteTemplate gExplosionSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_EXPLOSION,\n    .paletteTag = ANIM_TAG_EXPLOSION,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sExplosionAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSpriteOnMonPos,\n};\n\nstatic const union AffineAnimCmd sSoftBoiledEggAffineAnimCmds1[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, -8, 2),\n    AFFINEANIMCMD_FRAME(0, 0, 8, 4),\n    AFFINEANIMCMD_FRAME(0, 0, -8, 2),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sSoftBoiledEggAffineAnimCmds2[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sSoftBoiledEggAffineAnimCmds3[] =\n{\n    AFFINEANIMCMD_FRAME(-8, 4, 0, 8),\n    AFFINEANIMCMD_LOOP(0),\n    AFFINEANIMCMD_FRAME(16, -8, 0, 8),\n    AFFINEANIMCMD_FRAME(-16, 8, 0, 8),\n    AFFINEANIMCMD_LOOP(1),\n    AFFINEANIMCMD_FRAME(256, 256, 0, 0),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 15),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sSoftBoiledEggAffineAnimTable[] =\n{\n    sSoftBoiledEggAffineAnimCmds1,\n    sSoftBoiledEggAffineAnimCmds2,\n    sSoftBoiledEggAffineAnimCmds3,\n};\n\nconst struct SpriteTemplate gSoftBoiledEggSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_BREAKING_EGG,\n    .paletteTag = ANIM_TAG_BREAKING_EGG,\n    .oam = &gOamData_AffineDouble_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sSoftBoiledEggAffineAnimTable,\n    .callback = AnimSoftBoiledEgg,\n};\n\nstatic const union AffineAnimCmd sThinRingExpandingAffineAnimCmds1[] =\n{\n    AFFINEANIMCMD_FRAME(16, 16, 0, 0),\n    AFFINEANIMCMD_FRAME(16, 16, 0, 30),\n    AFFINEANIMCMD_END_ALT(1),\n};\n\nstatic const union AffineAnimCmd sThinRingExpandingAffineAnimCmds2[] =\n{\n    AFFINEANIMCMD_FRAME(16, 16, 0, 0),\n    AFFINEANIMCMD_FRAME(32, 32, 0, 15),\n    AFFINEANIMCMD_END_ALT(1),\n};\n\nstatic const union AffineAnimCmd sHyperVoiceRingAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(16, 16, 0, 0),\n    AFFINEANIMCMD_FRAME(11, 11, 0, 45),\n    AFFINEANIMCMD_END_ALT(1),\n};\n\nstatic const union AffineAnimCmd *const sThinRingExpandingAffineAnimTable[] =\n{\n    sThinRingExpandingAffineAnimCmds1,\n    sThinRingExpandingAffineAnimCmds2,\n};\n\nstatic const union AffineAnimCmd *const sHyperVoiceRingAffineAnimTable[] =\n{\n    sHyperVoiceRingAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gThinRingExpandingSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_THIN_RING,\n    .paletteTag = ANIM_TAG_THIN_RING,\n    .oam = &gOamData_AffineDouble_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sThinRingExpandingAffineAnimTable,\n    .callback = AnimSpriteOnMonPos,\n};\n\nstatic const union AffineAnimCmd sThinRingShrinkingAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(512, 512, 0, 0),\n    AFFINEANIMCMD_FRAME(-16, -16, 0, 30),\n    AFFINEANIMCMD_END_ALT(1),\n};\n\nstatic const union AffineAnimCmd *const sThinRingShrinkingAffineAnimTable[] =\n{\n    sThinRingShrinkingAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gThinRingShrinkingSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_THIN_RING,\n    .paletteTag = ANIM_TAG_THIN_RING,\n    .oam = &gOamData_AffineDouble_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sThinRingShrinkingAffineAnimTable,\n    .callback = AnimSpriteOnMonPos,\n};\n\nconst struct SpriteTemplate gBlendThinRingExpandingSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_THIN_RING,\n    .paletteTag = ANIM_TAG_THIN_RING,\n    .oam = &gOamData_AffineDouble_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sThinRingExpandingAffineAnimTable,\n    .callback = AnimBlendThinRing,\n};\n\nconst struct SpriteTemplate gHyperVoiceRingSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_THIN_RING,\n    .paletteTag = ANIM_TAG_THIN_RING,\n    .oam = &gOamData_AffineDouble_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sHyperVoiceRingAffineAnimTable,\n    .callback = AnimHyperVoiceRing,\n};\n\nconst struct SpriteTemplate gUproarRingSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_THIN_RING,\n    .paletteTag = ANIM_TAG_THIN_RING,\n    .oam = &gOamData_AffineDouble_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sThinRingExpandingAffineAnimTable,\n    .callback = AnimUproarRing,\n};\n\nstatic const union AffineAnimCmd sStretchAttackerAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(96, -13, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AnimCmd sSpeedDustAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(4, 3),\n    ANIMCMD_FRAME(8, 3),\n    ANIMCMD_FRAME(4, 3),\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSpeedDustAnimTable[] =\n{\n    sSpeedDustAnimCmds,\n};\n\nconst struct SpriteTemplate gSpeedDustSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPEED_DUST,\n    .paletteTag = ANIM_TAG_SPEED_DUST,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sSpeedDustAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSpeedDust,\n};\n\nstatic const s8 sSpeedDustPosTable[][2] =\n{\n    {30, 28},\n    {-20, 24},\n    {16, 26},\n    {-10, 28},\n};\n\nstatic const union AnimCmd sBellAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(16, 6),\n    ANIMCMD_FRAME(32, 15),\n    ANIMCMD_FRAME(16, 6),\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(16, 6, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 15, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 6, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(16, 6),\n    ANIMCMD_FRAME(32, 15),\n    ANIMCMD_FRAME(16, 6),\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sBellAnimTable[] =\n{\n    sBellAnimCmds,\n};\n\nconst struct SpriteTemplate gBellSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BELL,\n    .paletteTag = ANIM_TAG_BELL,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sBellAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSpriteOnMonPos,\n};\n\n#define NUM_MUSIC_NOTE_PAL_TAGS  3\n\nconst u16 gMusicNotePaletteTagsTable[NUM_MUSIC_NOTE_PAL_TAGS] =\n{\n    ANIM_TAG_MUSIC_NOTES_2,\n    ANIM_SPRITES_START - 1,\n    ANIM_SPRITES_START - 2,\n};\n\nconst struct SpriteTemplate gHealBellMusicNoteSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUSIC_NOTES_2,\n    .paletteTag = ANIM_TAG_MUSIC_NOTES_2,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimHealBellMusicNote,\n};\n\nconst struct SpriteTemplate gMagentaHeartSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MAGENTA_HEART,\n    .paletteTag = ANIM_TAG_MAGENTA_HEART,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMagentaHeart,\n};\n\nstatic const union AffineAnimCmd sAffineAnims_StretchBattlerUp[] =\n{\n    AFFINEANIMCMD_FRAME(10, -13, 0, 10),\n    AFFINEANIMCMD_FRAME(-10, 13, 0, 10),\n    AFFINEANIMCMD_END,\n};\n\nconst struct SpriteTemplate gRedHeartProjectileSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_RED_HEART,\n    .paletteTag = ANIM_TAG_RED_HEART,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRedHeartProjectile,\n};\n\nconst struct SpriteTemplate gRedHeartBurstSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_RED_HEART,\n    .paletteTag = ANIM_TAG_RED_HEART,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimParticleBurst,\n};\n\nconst struct SpriteTemplate gRedHeartRisingSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_RED_HEART,\n    .paletteTag = ANIM_TAG_RED_HEART,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRedHeartRising,\n};\n\nstatic const union AffineAnimCmd sHiddenPowerOrbAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(128, 128, 0, 0),\n    AFFINEANIMCMD_FRAME(8, 8, 0, 1),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sHiddenPowerOrbAffineAnimTable[] =\n{\n    sHiddenPowerOrbAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gHiddenPowerOrbSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_RED_ORB,\n    .paletteTag = ANIM_TAG_RED_ORB,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sHiddenPowerOrbAffineAnimTable,\n    .callback = AnimOrbitFast,\n};\n\nconst struct SpriteTemplate gHiddenPowerOrbScatterSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_RED_ORB,\n    .paletteTag = ANIM_TAG_RED_ORB,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sHiddenPowerOrbAffineAnimTable,\n    .callback = AnimOrbitScatter,\n};\n\nstatic const union AffineAnimCmd sSpitUpOrbAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(128, 128, 0, 0),\n    AFFINEANIMCMD_FRAME(8, 8, 0, 1),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sSpitUpOrbAffineAnimTable[] =\n{\n    sSpitUpOrbAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gSpitUpOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_RED_ORB_2,\n    .paletteTag = ANIM_TAG_RED_ORB_2,\n    .oam = &gOamData_AffineDouble_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sSpitUpOrbAffineAnimTable,\n    .callback = AnimSpitUpOrb,\n};\n\nstatic const union AnimCmd sEyeSparkleAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(8, 4),\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sEyeSparkleAnimTable[] =\n{\n    sEyeSparkleAnimCmds,\n};\n\nconst struct SpriteTemplate gEyeSparkleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_EYE_SPARKLE,\n    .paletteTag = ANIM_TAG_EYE_SPARKLE,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sEyeSparkleAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimEyeSparkle,\n};\n\nstatic const union AnimCmd sAngelSpriteAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 24),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAngelSpriteAnimTable[] =\n{\n    sAngelSpriteAnimCmds,\n};\n\nconst struct SpriteTemplate gAngelSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ANGEL,\n    .paletteTag = ANIM_TAG_ANGEL,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAngelSpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimAngel,\n};\n\nconst struct SpriteTemplate gPinkHeartSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_PINK_HEART,\n    .paletteTag = ANIM_TAG_PINK_HEART,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimPinkHeart,\n};\n\nstatic const union AnimCmd sDevilAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sDevilAnimCmds2[] =\n{\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sDevilAnimTable[] =\n{\n    sDevilAnimCmds1,\n    sDevilAnimCmds2,\n};\n\nconst struct SpriteTemplate gDevilSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_DEVIL,\n    .paletteTag = ANIM_TAG_DEVIL,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sDevilAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDevil,\n};\n\nstatic const union AnimCmd sAnim_FurySwipes[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(48, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_FurySwipes_Flipped[] =\n{\n    ANIMCMD_FRAME(0, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(48, 4, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_FurySwipes[] =\n{\n    sAnim_FurySwipes,\n    sAnim_FurySwipes_Flipped,\n};\n\nconst struct SpriteTemplate gFurySwipesSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SWIPE,\n    .paletteTag = ANIM_TAG_SWIPE,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_FurySwipes,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFurySwipes,\n};\n\nstatic const union AnimCmd sMovementWavesAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(16, 8),\n    ANIMCMD_FRAME(32, 8),\n    ANIMCMD_FRAME(16, 8),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sMovementWavesAnimCmds2[] =\n{\n    ANIMCMD_FRAME(16, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 8, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sMovementWavesAnimTable[] =\n{\n    sMovementWavesAnimCmds1,\n    sMovementWavesAnimCmds2,\n};\n\nconst struct SpriteTemplate gMovementWavesSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MOVEMENT_WAVES,\n    .paletteTag = ANIM_TAG_MOVEMENT_WAVES,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sMovementWavesAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMovementWaves,\n};\n\nstatic const union AffineAnimCmd sUproarAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(-12, 8, 0, 4),\n    AFFINEANIMCMD_FRAME(20, -20, 0, 4),\n    AFFINEANIMCMD_FRAME(-8, 12, 0, 4),\n    AFFINEANIMCMD_END,\n};\n\nconst struct SpriteTemplate gJaggedMusicNoteSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_JAGGED_MUSIC_NOTE,\n    .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimJaggedMusicNote,\n};\n\nstatic const union AffineAnimCmd sPerishSongMusicNoteAffineAnimCmds1[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, 0, 5),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sPerishSongMusicNoteAffineAnimCmds2[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, -8, 16),\n    AFFINEANIMCMD_END_ALT(1),\n};\n\nstatic const union AffineAnimCmd sPerishSongMusicNoteAffineAnimCmds3[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, 8, 16),\n    AFFINEANIMCMD_END_ALT(1),\n};\n\nstatic const union AffineAnimCmd *const sPerishSongMusicNoteAffineAnimTable[] =\n{\n    sPerishSongMusicNoteAffineAnimCmds1,\n    sPerishSongMusicNoteAffineAnimCmds2,\n    sPerishSongMusicNoteAffineAnimCmds3,\n};\n\nconst struct SpriteTemplate gPerishSongMusicNoteSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUSIC_NOTES_2,\n    .paletteTag = ANIM_TAG_MUSIC_NOTES_2,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gMusicNotesAnimTable,\n    .images = NULL,\n    .affineAnims = sPerishSongMusicNoteAffineAnimTable,\n    .callback = AnimPerishSongMusicNote,\n};\n\nconst struct SpriteTemplate gPerishSongMusicNote2SpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUSIC_NOTES_2,\n    .paletteTag = ANIM_TAG_MUSIC_NOTES_2,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gMusicNotesAnimTable,\n    .images = NULL,\n    .affineAnims = sPerishSongMusicNoteAffineAnimTable,\n    .callback = AnimPerishSongMusicNote2,\n};\n\nstatic const union AffineAnimCmd sGuardRingAffineAnimCmds1[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sGuardRingAffineAnimCmds2[] =\n{\n    AFFINEANIMCMD_FRAME(512, 256, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sGuardRingAffineAnimTable[] =\n{\n    sGuardRingAffineAnimCmds1,\n    sGuardRingAffineAnimCmds2,\n};\n\nconst struct SpriteTemplate gGuardRingSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GUARD_RING,\n    .paletteTag = ANIM_TAG_GUARD_RING,\n    .oam = &gOamData_AffineDouble_ObjBlend_64x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sGuardRingAffineAnimTable,\n    .callback = AnimGuardRing,\n};\n\n#define sAmplitudeX  data[1]\n#define sCircleSpeed data[2]\n#define sMoveSteps   data[3]\n#define sAmplitudeY  data[4]\n\nstatic void AnimCirclingFinger(struct Sprite *sprite)\n{\n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);\n    sprite->y += gBattleAnimArgs[1];\n    sprite->sAmplitudeX = gBattleAnimArgs[2];\n    sprite->sCircleSpeed = gBattleAnimArgs[4];\n    sprite->sMoveSteps = gBattleAnimArgs[5];\n    sprite->sAmplitudeY = gBattleAnimArgs[3];\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = TranslateSpriteInEllipse;\n    sprite->callback(sprite);\n}\n\n#undef sAmplitudeX\n#undef sCircleSpeed\n#undef sMoveSteps\n#undef sAmplitudeY\n\nstatic void AnimBouncingMusicNote(struct Sprite *sprite)\n{\n    u8 battler;\n    \n    if (gBattleAnimArgs[0] == 0)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    SetSpriteNextToMonHead(battler, sprite);\n    sprite->data[0] = 0;\n    sprite->data[1] = 0;\n    sprite->callback = AnimBouncingMusicNote_Step;\n}\n\nstatic void AnimBouncingMusicNote_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->y2 -= 3;\n        if (++sprite->data[1] == 6)\n            sprite->data[0]++;\n        break;\n    case 1:\n        sprite->y2 += 3;\n        if (--sprite->data[1] == 0)\n            sprite->data[0]++;\n        break;\n    case 2:\n        if (++sprite->data[1] == 64)\n            DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\nstatic void AnimVibrateBattlerBack_Step(struct Sprite *sprite)\n{\n    s16 temp;\n    gSprites[sprite->data[2]].x2 += sprite->data[1];\n    temp = sprite->data[1];\n    sprite->data[1] = -temp;\n    if (sprite->data[0] == 0)\n    {\n        gSprites[sprite->data[2]].x2 = 0;\n        DestroySpriteAndMatrix(sprite);\n    }\n\n    sprite->data[0]--;\n}\n\nstatic void AnimVibrateBattlerBack(struct Sprite *sprite)\n{\n    u8 spriteId;\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    spriteId = gBattlerSpriteIds[gBattleAnimTarget];\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->x -= gBattleAnimArgs[0];\n    else\n        sprite->x += gBattleAnimArgs[0];\n\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[2] = spriteId;\n    sprite->callback = AnimVibrateBattlerBack_Step;\n    sprite->invisible = TRUE;\n}\n\nstatic void AnimMovingClamp(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[5] = gBattleAnimArgs[4];\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, AnimMovingClamp_Step);\n}\n\nstatic void AnimMovingClamp_Step(struct Sprite *sprite)\n{\n    sprite->data[0] = sprite->data[1];\n    sprite->data[2] = sprite->x;\n    sprite->data[4] = sprite->y + 15;\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, AnimMovingClamp_End);\n}\n\nstatic void AnimMovingClamp_End(struct Sprite *sprite)\n{\n    if (sprite->data[5] == 0)\n        DestroyAnimSprite(sprite);\n    else\n        sprite->data[5]--;\n}\n\n// Rotates the attacking mon sprite downwards and then back upwards to its original position.\n// No args.\nvoid AnimTask_Withdraw(u8 taskId)\n{\n    PrepareBattlerSpriteForRotScale(gBattlerSpriteIds[gBattleAnimAttacker], ST_OAM_OBJ_NORMAL);\n    gTasks[taskId].func = AnimTask_Withdraw_Step;\n}\n\nstatic void AnimTask_Withdraw_Step(u8 taskId)\n{\n    u8 spriteId = gBattlerSpriteIds[gBattleAnimAttacker];\n    s16 rotation;\n    \n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        rotation = -gTasks[taskId].data[0];\n    else\n        rotation = gTasks[taskId].data[0];\n\n    SetSpriteRotScale(spriteId, 0x100, 0x100, rotation);\n    if (gTasks[taskId].data[1] == 0)\n    {\n        gTasks[taskId].data[0] += 0xB0;\n        // this y position update gets overwritten by SetBattlerSpriteYOffsetFromRotation()\n        gSprites[spriteId].y2++;\n    }\n    else if (gTasks[taskId].data[1] == 1)\n    {\n        if (++gTasks[taskId].data[3] == 30)\n            gTasks[taskId].data[1] = 2;\n\n        return;\n    }\n    else\n    {\n        gTasks[taskId].data[0] -= 0xB0;\n        // this y position update gets overwritten by SetBattlerSpriteYOffsetFromRotation()\n        gSprites[spriteId].y2--;\n    }\n\n    SetBattlerSpriteYOffsetFromRotation(spriteId);\n    if (gTasks[taskId].data[0] == 0xF20 || gTasks[taskId].data[0] == 0)\n    {\n        if (gTasks[taskId].data[1] == 2)\n        {\n            ResetSpriteRotScale(spriteId);\n            DestroyAnimVisualTask(taskId);\n        }\n        else\n        {\n            gTasks[taskId].data[1]++;\n        }\n    }\n}\n\n// Animates a \"zap of energy\" used in KINESIS.\n// arg 0: x pixel offset\n// arg 1: y pixel offset\n// arg 2: vertical flip\nstatic void AnimKinesisZapEnergy(struct Sprite *sprite)\n{\n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->x -= gBattleAnimArgs[0];\n    else\n        sprite->x += gBattleAnimArgs[0];\n\n    sprite->y += gBattleAnimArgs[1];\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->hFlip = TRUE;\n        if (gBattleAnimArgs[2])\n            sprite->vFlip = TRUE;\n    }\n    else\n    {\n        if (gBattleAnimArgs[2])\n            sprite->vFlip = TRUE;\n    }\n\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Animates a sword that rises into the air after a brief pause.\n// arg 0: x pixel offset\n// arg 1: y pixel offset\nstatic void AnimSwordsDanceBlade(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, FALSE);\n    sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n    StoreSpriteCallbackInData6(sprite, AnimSwordsDanceBlade_Step);\n}\n\nstatic void AnimSwordsDanceBlade_Step(struct Sprite *sprite)\n{\n    sprite->data[0] = 6;\n    sprite->data[2] = sprite->x;\n    sprite->data[4] = sprite->y - 32;\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Moves a projectile towards the target mon. The sprite is rotated to be pointing\n// in the same direction it's moving.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: target x pixel offset\n// arg 3: target y pixel offset\n// arg 4: duration\nstatic void AnimSonicBoomProjectile(struct Sprite *sprite)\n{\n    s16 targetXPos;\n    s16 targetYPos;\n    u16 rotation;\n\n    if (IsContest())\n    {\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    }\n    else if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n        gBattleAnimArgs[3] = -gBattleAnimArgs[3];\n    }\n\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    targetXPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];\n    targetYPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    rotation = ArcTan2Neg(targetXPos - sprite->x, targetYPos - sprite->y);\n    rotation += 0xF000;\n    if (IsContest())\n        rotation -= 0x6000;\n\n    TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rotation);\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = targetXPos;\n    sprite->data[4] = targetYPos;\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nstatic void AnimAirWaveProjectile_Step2(struct Sprite *sprite)\n{\n    if (sprite->data[0]-- <= 0)\n    {\n        gTasks[sprite->data[7]].data[1]--;\n        DestroySprite(sprite);\n    }\n}\n\nstatic void AnimAirWaveProjectile_Step1(struct Sprite *sprite)\n{\n    struct Task* task = &gTasks[sprite->data[7]];\n    \n    if (sprite->data[0] > task->data[5])\n    {\n        sprite->data[5] += sprite->data[3];\n        sprite->data[6] += sprite->data[4];\n    }\n    else\n    {\n        sprite->data[5] -= sprite->data[3];\n        sprite->data[6] -= sprite->data[4];\n    }\n\n    sprite->data[1] += sprite->data[5];\n    sprite->data[2] += sprite->data[6];\n    if (1 & task->data[7])\n        sprite->x2 = ((u16)sprite->data[1] >> 8) * -1;\n    else\n        sprite->x2 = (u16)sprite->data[1] >> 8;\n\n    if (1 & task->data[8])\n        sprite->y2 = ((u16)sprite->data[2] / 256u) * -1;\n    else\n        sprite->y2 = (u16)sprite->data[2] / 256u;\n\n    if (sprite->data[0]-- <= 0)\n    {\n        sprite->data[0] = 30;\n        sprite->callback = AnimAirWaveProjectile_Step2;\n    }\n}\n\nstatic void AnimAirWaveProjectile(struct Sprite *sprite)\n{\n    s16 a;\n    s16 b;\n    s16 c;\n    \n    struct Task* task = &gTasks[sprite->data[7]];\n    \n    sprite->data[1] += (-2 & task->data[7]);\n    sprite->data[2] += (-2 & task->data[8]);\n    if (1 & task->data[7])\n        sprite->x2 = ((u16)sprite->data[1] >> 8) * -1;\n    else\n        sprite->x2 = (u16)sprite->data[1] >> 8;\n\n    if (1 & task->data[8])\n        sprite->y2 = ((u16)sprite->data[2] / 256u) * -1;\n    else\n        sprite->y2 = (u16)sprite->data[2] / 256u;\n\n    if (sprite->data[0]-- <= 0)\n    {\n        sprite->data[0] = 8;\n        task->data[5] = 4;\n        a = Q_8_8_inv(0x1000);\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->y2 = 0;\n        sprite->x2 = 0;\n        if (task->data[11] >= sprite->x)\n            b = (task->data[11] - sprite->x) << 8;\n        else\n            b = (sprite->x - task->data[11]) << 8;\n\n        if (task->data[12] >= sprite->y)\n            c = (task->data[12] - sprite->y) << 8;\n        else\n            c = (sprite->y - task->data[12]) << 8;\n\n        sprite->data[2] = 0;\n        sprite->data[1] = 0;\n        sprite->data[6] = 0;\n        sprite->data[5] = 0;\n        sprite->data[3] = Q_8_8_mul(Q_8_8_mul(b, a), Q_8_8_inv(0x1C0));\n        sprite->data[4] = Q_8_8_mul(Q_8_8_mul(c, a), Q_8_8_inv(0x1C0));\n        sprite->callback = AnimAirWaveProjectile_Step1;\n    }\n}\n\nstatic void AirCutterProjectile_Step2(u8 taskId)\n{\n    if (gTasks[taskId].data[1] == 0)\n        DestroyAnimVisualTask(taskId);\n}\n\nstatic void AirCutterProjectile_Step1(u8 taskId)\n{\n    if (gTasks[taskId].data[0]-- <= 0)\n    {\n        u8 spriteId;\n        struct Sprite *sprite;\n        spriteId = CreateSprite(&gAirWaveProjectileSpriteTemplate, gTasks[taskId].data[9], gTasks[taskId].data[10], gTasks[taskId].data[2] - gTasks[taskId].data[1]);\n        sprite = &gSprites[spriteId];\n        switch (gTasks[taskId].data[4])\n        {\n        case 1:\n            sprite->oam.matrixNum |= (ST_OAM_HFLIP | ST_OAM_VFLIP);\n            break;\n        case 2:\n            sprite->oam.matrixNum = ST_OAM_HFLIP;\n            break;\n        }\n\n        sprite->data[0] = gTasks[taskId].data[5] - gTasks[taskId].data[6];\n        sprite->data[7] = taskId;\n        gTasks[taskId].data[gTasks[taskId].data[1] + 13] = spriteId;\n        gTasks[taskId].data[0] = gTasks[taskId].data[3];\n        gTasks[taskId].data[1]++;\n        PlaySE12WithPanning(SE_M_BLIZZARD2, BattleAnimAdjustPanning(-SOUND_PAN_TARGET));\n        if (gTasks[taskId].data[1] > 2)\n            gTasks[taskId].func = AirCutterProjectile_Step2;\n    }\n}\n\nvoid AnimTask_AirCutterProjectile(u8 taskId)\n{\n    s16 attackerY = 0;\n    s16 attackerX = 0;\n    s16 targetX = 0;\n    s16 targetY = 0;\n    s16 xDiff, yDiff;\n\n    if (IsContest())\n    {\n        gTasks[taskId].data[4] = 2;\n        gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n        if (gBattleAnimArgs[2] & 1)\n            gBattleAnimArgs[2] &= ~1;\n        else\n            gBattleAnimArgs[2] |= 1;\n    }\n    else\n    {\n        if ((gBattlerPositions[gBattleAnimTarget] & BIT_SIDE) == B_SIDE_PLAYER)\n        {\n            gTasks[taskId].data[4] = 1;\n            gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n            gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n            if (gBattleAnimArgs[2] & 1)\n                gBattleAnimArgs[2] &= ~1;\n            else\n                gBattleAnimArgs[2] |= 1;\n        }\n    }\n\n    attackerX = gTasks[taskId].data[9] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n    attackerY = gTasks[taskId].data[10] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n    if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n        && IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget)))\n    {\n        SetAverageBattlerPositions(gBattleAnimTarget, 0, &targetX, &targetY);\n    }\n    else\n    {\n        targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n        targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);\n    }\n\n    targetX = gTasks[taskId].data[11] = targetX + gBattleAnimArgs[0];\n    targetY = gTasks[taskId].data[12] = targetY + gBattleAnimArgs[1];\n    if (targetX >= attackerX)\n        xDiff = targetX - attackerX;\n    else\n        xDiff = attackerX - targetX;\n\n    gTasks[taskId].data[5] = Q_8_8_mul(xDiff, Q_8_8_inv(gBattleAnimArgs[2] & ~1));\n    gTasks[taskId].data[6] = Q_8_8_mul(gTasks[taskId].data[5], 0x80);\n    gTasks[taskId].data[7] = gBattleAnimArgs[2];\n    if (targetY >= attackerY)\n    {\n        yDiff = targetY - attackerY;\n        gTasks[taskId].data[8] = Q_8_8_mul(yDiff, Q_8_8_inv(gTasks[taskId].data[5])) & ~1;\n    }\n    else\n    {\n        yDiff = attackerY - targetY;\n        gTasks[taskId].data[8] = Q_8_8_mul(yDiff, Q_8_8_inv(gTasks[taskId].data[5])) | 1;\n    }\n\n    gTasks[taskId].data[3] = gBattleAnimArgs[3];\n    if (gBattleAnimArgs[4] & 0x80)\n    {\n        gBattleAnimArgs[4] ^= 0x80;\n        if (gBattleAnimArgs[4] >= 64)\n        {\n            u16 var = GetBattlerSpriteSubpriority(gBattleAnimTarget) + (gBattleAnimArgs[4] - 64);\n            gTasks[taskId].data[2] = var;\n        }\n        else\n        {\n            u16 var = GetBattlerSpriteSubpriority(gBattleAnimTarget) - gBattleAnimArgs[4];\n            gTasks[taskId].data[2] = var;\n        }\n    }\n    else\n    {\n        if (gBattleAnimArgs[4] >= 64)\n        {\n            u16 var = GetBattlerSpriteSubpriority(gBattleAnimTarget) + (gBattleAnimArgs[4] - 64);\n            gTasks[taskId].data[2] = var;\n        }\n        else\n        {\n            u16 var = GetBattlerSpriteSubpriority(gBattleAnimTarget) - gBattleAnimArgs[4];\n            gTasks[taskId].data[2] = var;\n        }\n    }\n\n    if (gTasks[taskId].data[2] < 3)\n        gTasks[taskId].data[2] = 3;\n\n    gTasks[taskId].func = AirCutterProjectile_Step1;\n}\n\nstatic void AnimVoidLines(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, FALSE);\n    sprite->data[0] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(sVoidLinesSpriteTemplate.paletteTag));\n    sprite->callback = AnimVoidLines_Step;\n}\n\nstatic void AnimVoidLines_Step(struct Sprite *sprite)\n{\n    u16 id, val;\n    int i;\n\n    if (++sprite->data[1] == 2)\n    {\n        sprite->data[1] = 0;\n        id = sprite->data[0];\n        val = gPlttBufferFaded[8 + id];\n        for (i = 8; i < 16; i++)\n            gPlttBufferFaded[i + id] = gPlttBufferFaded[i + id + 1];\n\n        gPlttBufferFaded[id + 15] = val;\n\n        if (++sprite->data[2] == 24)\n            DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimCoinThrow(struct Sprite *sprite)\n{\n    s16 r6;\n    s16 r7;\n    u16 var;\n\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    r6 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    r7 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n\n    r6 += gBattleAnimArgs[2];\n    var = ArcTan2Neg(r6 - sprite->x, r7 - sprite->y);\n    var += 0xC000;\n    TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, var);\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = r6;\n    sprite->data[4] = r7;\n    sprite->callback = InitAnimLinearTranslationWithSpeedAndPos;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nstatic void AnimFallingCoin(struct Sprite *sprite)\n{\n    sprite->data[2] = -16;\n    sprite->y += 8;\n    sprite->callback = AnimFallingCoin_Step;\n}\n\nstatic void AnimFallingCoin_Step(struct Sprite *sprite)\n{\n    sprite->data[0] += 0x80;\n    sprite->x2 = sprite->data[0] >> 8;\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        sprite->x2 = -sprite->x2;\n\n    sprite->y2 = Sin(sprite->data[1], sprite->data[2]);\n    sprite->data[1] += 5;\n    if (sprite->data[1] > 126)\n    {\n        sprite->data[1] = 0;\n        sprite->data[2] /= 2;\n        if (++sprite->data[3] == 2)\n            DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimBulletSeed(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[0] = 20;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->callback = StartAnimLinearTranslation;\n    sprite->affineAnimPaused = TRUE;\n    StoreSpriteCallbackInData6(sprite, AnimBulletSeed_Step1);\n}\n\nstatic void AnimBulletSeed_Step1(struct Sprite *sprite)\n{\n    int i;\n    u16 rand;\n    s16 *ptr;\n    \n    PlaySE12WithPanning(SE_M_HORN_ATTACK, BattleAnimAdjustPanning(SOUND_PAN_TARGET));\n    sprite->x += sprite->x2;\n    sprite->y += sprite->y2;\n    sprite->y2 = 0;\n    sprite->x2 = 0;\n    ptr = &sprite->data[7];\n    for (i = 0; i < 8; i++)\n        ptr[i - 7] = 0;\n\n    rand = Random();\n    sprite->data[6] = 0xFFF4 - (rand & 7);\n    rand = Random();\n    sprite->data[7] = (rand % 0xA0) + 0xA0;\n    sprite->callback = AnimBulletSeed_Step2;\n    sprite->affineAnimPaused = FALSE;\n}\n\nstatic void AnimBulletSeed_Step2(struct Sprite *sprite)\n{\n    sprite->data[0] += sprite->data[7];\n    sprite->x2 = sprite->data[0] >> 8;\n    if (sprite->data[7] & 1)\n        sprite->x2 = -sprite->x2;\n\n    sprite->y2 = Sin(sprite->data[1], sprite->data[6]);\n    sprite->data[1] += 8;\n    if (sprite->data[1] > 126)\n    {\n        sprite->data[1] = 0;\n        sprite->data[2] /= 2;\n        if (++sprite->data[3] == 1)\n            DestroyAnimSprite(sprite);\n    }\n}\n\n// Moves a tornado in a circlular motion.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: wave amplitude\n// arg 3: unused\n// arg 4: initial wave offset\n// arg 5: wave period (higher means faster wave)\n// arg 6: duration\nstatic void AnimRazorWindTornado(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, FALSE);\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        sprite->y += 16;\n\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[1] = gBattleAnimArgs[2];\n    sprite->data[2] = gBattleAnimArgs[5];\n    sprite->data[3] = gBattleAnimArgs[6];\n    sprite->data[4] = gBattleAnimArgs[3];\n    sprite->callback = TranslateSpriteInCircle;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback(sprite);\n}\n\n// Animates a single pincer line that extends towards the center of the target mon.\n// arg 0: invert\nstatic void AnimViceGripPincer(struct Sprite *sprite)\n{\n    s16 startXOffset = 32;\n    s16 startYOffset = -32;\n    s16 endXOffset = 16;\n    s16 endYOffset = -16;\n    \n    if (gBattleAnimArgs[0])\n    {\n        startXOffset = -32;\n        startYOffset = 32;\n        endXOffset = -16;\n        endYOffset = 16;\n        StartSpriteAnim(sprite, 1);\n    }\n\n    sprite->x += startXOffset;\n    sprite->y += startYOffset;\n    sprite->data[0] = 6;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + endXOffset;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + endYOffset;\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, AnimViceGripPincer_Step);\n}\n\nstatic void AnimViceGripPincer_Step(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n        DestroyAnimSprite(sprite);\n}\n\n// Animates a single pincer line that extends towards the center of the target mon, and then back out.\n// arg 0: animation id\nstatic void AnimGuillotinePincer(struct Sprite *sprite)\n{\n    s16 startXOffset = 32;\n    s16 startYOffset = -32;\n    s16 endXOffset = 16;\n    s16 endYOffset = -16;\n    \n    if (gBattleAnimArgs[0])\n    {\n        startXOffset = -32;\n        startYOffset = 32;\n        endXOffset = -16;\n        endYOffset = 16;\n        StartSpriteAnim(sprite, gBattleAnimArgs[0]);\n    }\n\n    sprite->x += startXOffset;\n    sprite->y += startYOffset;\n    sprite->data[0] = 6;\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + endXOffset;\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + endYOffset;\n    InitAnimLinearTranslation(sprite);\n    sprite->data[5] = gBattleAnimArgs[0];\n    sprite->data[6] = sprite->data[0];\n    sprite->callback = AnimGuillotinePincer_Step1;\n}\n\nstatic void AnimGuillotinePincer_Step1(struct Sprite *sprite)\n{\n    if (AnimTranslateLinear(sprite) && sprite->animEnded)\n    {\n        SeekSpriteAnim(sprite, 0);\n        sprite->animPaused = TRUE;\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->x2 = 2;\n        sprite->y2 = -2;\n        sprite->data[0] = sprite->data[6];\n        sprite->data[1] ^= 1;\n        sprite->data[2] ^= 1;\n        sprite->data[4] = 0;\n        sprite->data[3] = 0;\n        sprite->callback = AnimGuillotinePincer_Step2;\n    }\n}\n\nstatic void AnimGuillotinePincer_Step2(struct Sprite *sprite)\n{\n    if (sprite->data[3])\n    {\n        sprite->x2 = -sprite->x2;\n        sprite->y2 = -sprite->y2;\n    }\n\n    sprite->data[3] ^= 1;\n    if (++sprite->data[4] == 51)\n    {\n        sprite->y2 = 0;\n        sprite->x2 = 0;\n        sprite->data[4] = 0;\n        sprite->data[3] = 0;\n        sprite->animPaused = FALSE;\n        StartSpriteAnim(sprite, sprite->data[5] ^ 1);\n        sprite->callback = AnimGuillotinePincer_Step3;\n    }\n}\n\nstatic void AnimGuillotinePincer_Step3(struct Sprite *sprite)\n{\n    if (AnimTranslateLinear(sprite))\n        DestroyAnimSprite(sprite);\n}\n\n// Scales up the target mon sprite, and sets the palette to greyscale.\n// Used in MOVE_DISABLE.\n// No args.\nvoid AnimTask_GrowAndGrayscale(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);\n    \n    PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND);\n    SetSpriteRotScale(spriteId, 0xD0, 0xD0, 0);\n    SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, FALSE);\n    gTasks[taskId].data[0] = 80;\n    gTasks[taskId].func = AnimTask_GrowAndGrayscale_Step;\n}\n\nstatic void AnimTask_GrowAndGrayscale_Step(u8 taskId)\n{\n    if (--gTasks[taskId].data[0] == -1)\n    {\n        u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);\n        ResetSpriteRotScale(spriteId);\n        SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, TRUE);\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\n// Shrinks and grows the attacking mon several times. Also creates transparent versions of the\n// mon's sprite while it is shrinking.\n// No args.\nvoid AnimTask_Minimize(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    \n    task->data[0] = spriteId;\n    PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL);\n    task->data[1] = 0;\n    task->data[2] = 0;\n    task->data[3] = 0;\n    task->data[4] = 0x100;\n    task->data[5] = 0;\n    task->data[6] = 0;\n    task->data[7] = GetBattlerSpriteSubpriority(gBattleAnimAttacker);\n    task->func = AnimTask_Minimize_Step1;\n}\n\nstatic void AnimTask_Minimize_Step1(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    switch (task->data[1])\n    {\n    case 0:\n        if (task->data[2] == 0 || task->data[2] == 3 || task->data[2] == 6)\n            CreateMinimizeSprite(task, taskId);\n        task->data[2]++;\n        task->data[4] += 0x28;\n        SetSpriteRotScale(task->data[0], task->data[4], task->data[4], 0);\n        SetBattlerSpriteYOffsetFromYScale(task->data[0]);\n        if (task->data[2] == 32)\n        {\n            task->data[5]++;\n            task->data[1]++;\n        }\n        break;\n    case 1:\n        if (task->data[6] == 0)\n        {\n            if (task->data[5] == 3)\n            {\n                task->data[2] = 0;\n                task->data[1] = 3;\n            }\n            else\n            {\n                task->data[2] = 0;\n                task->data[3] = 0;\n                task->data[4] = 0x100;\n                SetSpriteRotScale(task->data[0], task->data[4], task->data[4], 0);\n                SetBattlerSpriteYOffsetFromYScale(task->data[0]);\n                task->data[1] = 2;\n            }\n        }\n        break;\n    case 2:\n        task->data[1] = 0;\n        break;\n    case 3:\n        if (++task->data[2] > 32)\n        {\n            task->data[2] = 0;\n            task->data[1]++;\n        }\n        break;\n    case 4:\n        task->data[2] += 2;\n        task->data[4] -= 0x50;\n        SetSpriteRotScale(task->data[0], task->data[4], task->data[4], 0);\n        SetBattlerSpriteYOffsetFromYScale(task->data[0]);\n        if (task->data[2] == 32)\n        {\n            task->data[2] = 0;\n            task->data[1]++;\n        }\n        break;\n    case 5:\n        ResetSpriteRotScale(task->data[0]);\n        gSprites[task->data[15]].y2 = 0;\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void CreateMinimizeSprite(struct Task* task, u8 taskId)\n{\n    u16 matrixNum;\n    s16 spriteId = CloneBattlerSpriteWithBlend(ANIM_ATTACKER);\n    \n    if (spriteId >= 0)\n    {\n        if ((matrixNum = AllocOamMatrix()) == 0xFF)\n        {\n            DestroySpriteWithActiveSheet(&gSprites[spriteId]);\n        }\n        else\n        {\n            gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;\n            gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;\n            gSprites[spriteId].affineAnimPaused = TRUE;\n            gSprites[spriteId].oam.matrixNum = matrixNum;\n            gSprites[spriteId].subpriority = task->data[7] - task->data[3];\n            task->data[3]++;\n            task->data[6]++;\n            gSprites[spriteId].data[0] = 16;\n            gSprites[spriteId].data[1] = taskId;\n            gSprites[spriteId].data[2] = 6;\n            gSprites[spriteId].callback = ClonedMinizeSprite_Step;\n            SetSpriteRotScale(spriteId, task->data[4], task->data[4], 0);\n            gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n            CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode);\n        }\n    }\n}\n\nstatic void ClonedMinizeSprite_Step(struct Sprite *sprite)\n{\n    if (--sprite->data[0] == 0)\n    {\n        gTasks[sprite->data[1]].data[sprite->data[2]]--;\n        FreeOamMatrix(sprite->oam.matrixNum);\n        DestroySpriteWithActiveSheet(sprite);\n    }\n}\n\n// Task to facilitate expanding and hopping effect seen in Splash.\n// arg 0: anim battler\n// arg 1: num hops\nvoid AnimTask_Splash(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    if (gBattleAnimArgs[1] == 0)\n    {\n        DestroyAnimVisualTask(taskId);\n    }\n    else\n    {\n        u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n        task->data[0] = spriteId;\n        task->data[1] = 0;\n        task->data[2] = gBattleAnimArgs[1];\n        task->data[3] = 0;\n        task->data[4] = 0;\n        PrepareAffineAnimInTaskData(task, spriteId, sSplashEffectAffineAnimCmds);\n        task->func = AnimTask_Splash_Step;\n    }\n}\n\nstatic void AnimTask_Splash_Step(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    switch (task->data[1])\n    {\n    case 0:\n        RunAffineAnimFromTaskData(task);\n        task->data[4] += 3;\n        gSprites[task->data[0]].y2 += task->data[4];\n        if (++task->data[3] > 7)\n        {\n            task->data[3] = 0;\n            task->data[1]++;\n        }\n        break;\n    case 1:\n        RunAffineAnimFromTaskData(task);\n        gSprites[task->data[0]].y2 += task->data[4];\n        if (++task->data[3] > 7)\n        {\n            task->data[3] = 0;\n            task->data[1]++;\n        }\n        break;\n    case 2:\n        if (task->data[4] != 0)\n        {\n            gSprites[task->data[0]].y2 -= 2;\n            task->data[4] -= 2;\n        }\n        else\n            task->data[1]++;\n        break;\n    case 3:\n        if (!RunAffineAnimFromTaskData(task))\n        {\n            if (--task->data[2] == 0)\n            {\n                gSprites[task->data[0]].y2 = 0;\n                DestroyAnimVisualTask(taskId);\n            }\n            else\n            {\n                PrepareAffineAnimInTaskData(task, task->data[0], sSplashEffectAffineAnimCmds);\n                task->data[1] = 0;\n            }\n        }\n        break;\n    }\n}\n\n// Grows, pauses, then shrinks the attacking mon.\n// Used by MOVE_SWAGGER and MOVE_BULK_UP\n// No args.\nvoid AnimTask_GrowAndShrink(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    \n    PrepareAffineAnimInTaskData(task, spriteId, sGrowAndShrinkAffineAnimCmds);\n    task->func = AnimTask_GrowAndShrink_Step;\n}\n\nstatic void AnimTask_GrowAndShrink_Step(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    if (!RunAffineAnimFromTaskData(task))\n        DestroyAnimVisualTask(taskId);\n}\n\n// Animates a little puff of the mon's breath.\n// Used by MOVE_SWAGGER and MOVE_BULK_UP\n// No args.\nstatic void AnimBreathPuff(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n    {\n        StartSpriteAnim(sprite, 0);\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + 32;\n        sprite->data[1] = 64;\n    }\n    else\n    {\n        StartSpriteAnim(sprite, 1);\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) - 32;\n        sprite->data[1] = -64;\n    }\n\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[0] = 52;\n    sprite->data[2] = 0;\n    sprite->data[3] = 0;\n    sprite->data[4] = 0;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = TranslateSpriteLinearFixedPoint;\n}\n\n// Animates an \"angry\" mark above a mon's head.\n// arg 0: target mon (0 = attacker, 1 = target)\n// arg 1: x pixel offset\n// arg 2: y pixel offset\nstatic void AnimAngerMark(struct Sprite *sprite)\n{\n    u8 battler;\n    \n    if (!gBattleAnimArgs[0])\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    if (GetBattlerSide(battler) == B_SIDE_OPPONENT)\n        gBattleAnimArgs[1] *= -1;\n\n    sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2) + gBattleAnimArgs[1];\n    sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];\n    if (sprite->y < 8)\n        sprite->y = 8;\n\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n}\n\n// left/right movements\nvoid AnimTask_ThrashMoveMonHorizontal(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    \n    task->data[0] = spriteId;\n    task->data[1] = 0;\n    PrepareAffineAnimInTaskData(task, spriteId, sThrashMoveMonAffineAnimCmds);\n    task->func = AnimTask_ThrashMoveMonHorizontal_Step;\n}\n\nstatic void AnimTask_ThrashMoveMonHorizontal_Step(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    if (!RunAffineAnimFromTaskData(task))\n        DestroyAnimVisualTask(taskId);\n}\n\n// up/down movements\nvoid AnimTask_ThrashMoveMonVertical(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    task->data[0] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    task->data[1] = 0;\n    task->data[2] = 4;\n    task->data[3] = 7;\n    task->data[4] = 3;\n    task->data[5] = gSprites[task->data[0]].x;\n    task->data[6] = gSprites[task->data[0]].y;\n    task->data[7] = 0;\n    task->data[8] = 0;\n    task->data[9] = 2;\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)\n        task->data[2] *= -1;\n\n    task->func = AnimTask_ThrashMoveMonVertical_Step;\n}\n\nstatic void AnimTask_ThrashMoveMonVertical_Step(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    if (++task->data[7] > 2)\n    {\n        task->data[7] = 0;\n        task->data[8]++;\n        if (task->data[8] & 1)\n            gSprites[task->data[0]].y += task->data[9];\n        else\n            gSprites[task->data[0]].y -= task->data[9];\n    }\n    switch (task->data[1])\n    {\n    case 0:\n        gSprites[task->data[0]].x += task->data[2];\n        if (--task->data[3] == 0)\n        {\n            task->data[3] = 14;\n            task->data[1] = 1;\n        }\n        break;\n    case 1:\n        gSprites[task->data[0]].x -= task->data[2];\n        if (--task->data[3] == 0)\n        {\n            task->data[3] = 7;\n            task->data[1] = 2;\n        }\n        break;\n    case 2:\n        gSprites[task->data[0]].x += task->data[2];\n        if (--task->data[3] == 0)\n        {\n            if (--task->data[4] != 0)\n            {\n                task->data[3] = 7;\n                task->data[1] = 0;\n            }\n            else\n            {\n                if ((task->data[8] & 1) != 0)\n                    gSprites[task->data[0]].y -= task->data[9];\n\n                DestroyAnimVisualTask(taskId);\n            }\n        }\n        break;\n    }\n}\n\nvoid AnimTask_SketchDrawMon(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    struct ScanlineEffectParams params;\n    s32 i;\n    \n    task->data[0] = GetBattlerYCoordWithElevation(gBattleAnimTarget) + 32;\n    task->data[1] = 4;\n    task->data[2] = 0;\n    task->data[3] = 0;\n    task->data[4] = 0;\n    task->data[5] = 0;\n    task->data[15] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT);\n\n    if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1)\n    {\n        task->data[6] = gBattle_BG1_X;\n        params.dmaDest = (u16 *)REG_ADDR_BG1HOFS;\n    }\n    else\n    {\n        task->data[6] = gBattle_BG2_X;\n        params.dmaDest = (u16 *)REG_ADDR_BG2HOFS;\n    }\n\n    for (i = task->data[0] - 0x40; i <= task->data[0]; i++)\n    {\n        if (i >= 0)\n        {\n            gScanlineEffectRegBuffers[0][i] = task->data[6] + 0xF0;\n            gScanlineEffectRegBuffers[1][i] = task->data[6] + 0xF0;\n        }\n    }\n\n    params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;\n    params.initState = 1;\n    params.unused9 = 0;\n    ScanlineEffect_SetParams(params);\n    task->func = AnimTask_SketchDrawMon_Step;\n}\n\nstatic void AnimTask_SketchDrawMon_Step(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n\n    switch (task->data[4])\n    {\n    case 0:\n        if (++task->data[5] > 20)\n            task->data[4]++;\n        break;\n    case 1:\n        if (++task->data[1] > 3)\n        {\n            task->data[1] = 0;\n            task->data[2] = task->data[3] & 3;\n            task->data[5] = task->data[0] - task->data[3];\n            switch (task->data[2])\n            {\n            case 0:\n                break;\n            case 1:\n                task->data[5] -= 2;\n                break;\n            case 2:\n                task->data[5] += 1;\n                break;\n            case 3:\n                task->data[5] += 1;\n                break;\n            }\n\n            if (task->data[5] >= 0)\n            {\n                gScanlineEffectRegBuffers[0][task->data[5]] = task->data[6];\n                gScanlineEffectRegBuffers[1][task->data[5]] = task->data[6];\n            }\n\n            if (++task->data[3] >= task->data[15])\n            {\n                gScanlineEffect.state = 3;\n                DestroyAnimVisualTask(taskId);\n            }\n        }\n        break;\n    }\n}\n\nstatic void AnimPencil(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) - 16;\n    sprite->y = GetBattlerYCoordWithElevation(gBattleAnimTarget) + 16;\n    sprite->data[0] = 0;\n    sprite->data[1] = 0;\n    sprite->data[2] = 0;\n    sprite->data[3] = 16;\n    sprite->data[4] = 0;\n    sprite->data[5] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT) + 2;\n    sprite->data[6] = BattleAnimAdjustPanning(SOUND_PAN_TARGET);\n    sprite->callback = AnimPencil_Step;\n}\n\nstatic void AnimPencil_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        if (++sprite->data[2] > 1)\n        {\n            sprite->data[2] = 0;\n            sprite->invisible = !sprite->invisible;\n        }\n        if (++sprite->data[1] > 16)\n        {\n            sprite->invisible = FALSE;\n            sprite->data[0]++;\n        }\n        break;\n    case 1:\n        if (++sprite->data[1] > 3 && sprite->data[2] < sprite->data[5])\n        {\n            sprite->data[1] = 0;\n            sprite->y -= 1;\n            sprite->data[2]++;\n            if (sprite->data[2] % 10 == 0)\n                PlaySE12WithPanning(SE_M_SKETCH, sprite->data[6]);\n        }\n        sprite->data[4] += sprite->data[3];\n        if (sprite->data[4] > 31)\n        {\n            sprite->data[4] = 0x40 - sprite->data[4];\n            sprite->data[3] *= -1;\n        }\n        else if (sprite->data[4] <= -32)\n        {\n            sprite->data[4] = -0x40 - sprite->data[4];\n            sprite->data[3] *= -1;\n        }\n        sprite->x2 = sprite->data[4];\n        if (sprite->data[5] == sprite->data[2])\n        {\n            sprite->data[1] = 0;\n            sprite->data[2] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 2:\n        if (++sprite->data[2] > 1)\n        {\n            sprite->data[2] = 0;\n            sprite->invisible = !sprite->invisible;\n        }\n        if (++sprite->data[1] > 16)\n        {\n            sprite->invisible = FALSE;\n            DestroyAnimSprite(sprite);\n        }\n        break;\n    }\n}\n\nstatic void AnimBlendThinRing(struct Sprite *sprite)\n{\n    u8 battler = 0;\n    u16 sp0 = 0;\n    u16 sp1 = 0;\n    u8 r4;\n\n    if (gBattleAnimArgs[2] == 0)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    r4 = gBattleAnimArgs[3] ^ 1;\n    if (IsDoubleBattle() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler)))\n    {\n        SetAverageBattlerPositions(battler, r4, &sp0, &sp1);\n        if (r4 == 0)\n            r4 = GetBattlerSpriteCoord(battler, BATTLER_COORD_X);\n        else\n            r4 = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);\n\n        if (GetBattlerSide(battler) != B_SIDE_PLAYER)\n            gBattleAnimArgs[0] -= (sp0 - r4) - gBattleAnimArgs[0];\n        else\n            gBattleAnimArgs[0] = sp0 - r4;\n    }\n\n    sprite->callback = AnimSpriteOnMonPos;\n    sprite->callback(sprite);\n}\n\nstatic void AnimHyperVoiceRing_WaitEnd(struct Sprite *sprite)\n{\n    if (AnimTranslateLinear(sprite))\n    {\n        FreeSpriteOamMatrix(sprite);\n        DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimHyperVoiceRing(struct Sprite *sprite)\n{\n    u16 startX = 0;\n    u16 startY = 0;\n    s16 x = 0;\n    s16 y = 0;\n    u8 yCoordType;\n    u8 battler1;\n    u8 battler2;\n    u8 xCoordType;\n\n    if (gBattleAnimArgs[5] == 0)\n    {\n        battler1 = gBattleAnimAttacker;\n        battler2 = gBattleAnimTarget;\n    }\n    else\n    {\n        battler1 = gBattleAnimTarget;\n        battler2 = gBattleAnimAttacker;\n    }\n\n    if (!gBattleAnimArgs[6])\n    {\n        xCoordType = BATTLER_COORD_X;\n        yCoordType = BATTLER_COORD_Y;\n    }\n    else\n    {\n        xCoordType = BATTLER_COORD_X_2;\n        yCoordType = BATTLER_COORD_Y_PIC_OFFSET;\n    }\n\n    if (GetBattlerSide(battler1) != B_SIDE_PLAYER)\n    {\n        startX = GetBattlerSpriteCoord(battler1, xCoordType) + gBattleAnimArgs[0];\n        if (IsBattlerSpriteVisible(BATTLE_PARTNER(battler2)))\n            sprite->subpriority = gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battler2)]].subpriority - 1;\n        else\n            sprite->subpriority = gSprites[gBattlerSpriteIds[battler2]].subpriority - 1;\n    }\n    else\n    {\n        startX = GetBattlerSpriteCoord(battler1, xCoordType) - gBattleAnimArgs[0];\n        if (!IsContest() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler1)))\n        {\n            if (gSprites[gBattlerSpriteIds[battler1]].x < gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battler1)]].x)\n                sprite->subpriority = gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battler1)]].subpriority + 1;\n            else\n                sprite->subpriority = gSprites[gBattlerSpriteIds[battler1]].subpriority - 1;\n        }\n        else\n        {\n            sprite->subpriority = gSprites[gBattlerSpriteIds[battler1]].subpriority - 1;\n        }\n\n    }\n\n    startY = GetBattlerSpriteCoord(battler1, yCoordType) + gBattleAnimArgs[1];\n    if (!IsContest() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler2)))\n    {\n        SetAverageBattlerPositions(battler2, gBattleAnimArgs[6], &x, &y);\n    }\n    else\n    {\n        x = GetBattlerSpriteCoord(battler2, xCoordType);\n        y = GetBattlerSpriteCoord(battler2, yCoordType);\n    }\n\n    if (GetBattlerSide(battler2) != B_SIDE_PLAYER)\n        x += gBattleAnimArgs[3];\n    else\n        x -= gBattleAnimArgs[3];\n\n    y += gBattleAnimArgs[4];\n    sprite->x = sprite->data[1] = startX;\n    sprite->y = sprite->data[3] = startY;\n    sprite->data[2] = x;\n    sprite->data[4] = y;\n    sprite->data[0] = gBattleAnimArgs[0];\n    InitAnimLinearTranslation(sprite);\n    sprite->callback = AnimHyperVoiceRing_WaitEnd;\n    sprite->callback(sprite);\n}\n\nstatic void AnimUproarRing(struct Sprite *sprite)\n{\n    u8 index = IndexOfSpritePaletteTag(ANIM_TAG_THIN_RING);\n    \n    if (index != 0xFF)\n        BlendPalette(OBJ_PLTT_ID(index) + 1, 15, gBattleAnimArgs[5], gBattleAnimArgs[4]);\n\n    StartSpriteAffineAnim(sprite, 1);\n    sprite->callback = AnimSpriteOnMonPos;\n    sprite->callback(sprite);\n}\n\nstatic void AnimSoftBoiledEgg(struct Sprite *sprite)\n{\n    s16 r1;\n    \n    InitSpritePosToAnimAttacker(sprite, FALSE);\n    r1 = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? -160 : 160;\n    sprite->data[0] = 0x380;\n    sprite->data[1] = r1;\n    sprite->data[7] = gBattleAnimArgs[2];\n    sprite->callback = AnimSoftBoiledEgg_Step1;\n}\n\nstatic void AnimSoftBoiledEgg_Step1(struct Sprite *sprite)\n{\n    s16 add;\n    \n    sprite->y2 -= (sprite->data[0] >> 8);\n    sprite->x2 = sprite->data[1] >> 8;\n    sprite->data[0] -= 32;\n    add = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? -160 : 160;\n    sprite->data[1] += add;\n    if (sprite->y2 > 0)\n    {\n        sprite->y += sprite->y2;\n        sprite->x += sprite->x2;\n        sprite->y2 = 0;\n        sprite->x2 = 0;\n        sprite->data[0] = 0;\n        StartSpriteAffineAnim(sprite, 1);\n        sprite->callback = AnimSoftBoiledEgg_Step2;\n    }\n}\n\nstatic void AnimSoftBoiledEgg_Step2(struct Sprite *sprite)\n{\n    if (sprite->data[0]++ > 19)\n    {\n        StartSpriteAffineAnim(sprite, 2);\n        sprite->callback = AnimSoftBoiledEgg_Step3;\n    }\n}\n\nstatic void AnimSoftBoiledEgg_Step3(struct Sprite *sprite)\n{\n    if (sprite->affineAnimEnded)\n    {\n        StartSpriteAffineAnim(sprite, 1);\n        sprite->data[0] = 0;\n        if (sprite->data[7] == 0)\n        {\n            sprite->oam.tileNum += 16;\n            sprite->callback = AnimSoftBoiledEgg_Step3_Callback1;\n        }\n        else\n        {\n            sprite->oam.tileNum += 32;\n            sprite->callback = AnimSoftBoiledEgg_Step4;\n        }\n    }\n}\n\nstatic void AnimSoftBoiledEgg_Step3_Callback1(struct Sprite *sprite)\n{\n    sprite->y2 -= 2;\n    if (++sprite->data[0] == 9)\n    {\n        sprite->data[0] = 16;\n        sprite->data[1] = 0;\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND((u16)sprite->data[0], 0));\n        sprite->callback = AnimSoftBoiledEgg_Step3_Callback2;\n    }\n}\n\nstatic void AnimSoftBoiledEgg_Step3_Callback2(struct Sprite *sprite)\n{\n    if (sprite->data[1]++ % 3 == 0)\n    {\n        sprite->data[0]--;\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0]));\n        if (sprite->data[0] == 0)\n            sprite->callback = AnimSoftBoiledEgg_Step4;\n    }\n}\n\nstatic void AnimSoftBoiledEgg_Step4(struct Sprite *sprite)\n{\n    if ((u16)gBattleAnimArgs[7] == 0xFFFF)\n    {\n        sprite->invisible = TRUE;\n        if (sprite->data[7] == 0)\n            sprite->callback = AnimSoftBoiledEgg_Step4_Callback;\n        else\n            sprite->callback = DestroyAnimSprite;\n    }\n}\n\nstatic void AnimSoftBoiledEgg_Step4_Callback(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    DestroyAnimSprite(sprite);\n}\n\n// Used by Extremespeed\nvoid AnimTask_AttackerStretchAndDisappear(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    \n    task->data[0] = spriteId;\n    PrepareAffineAnimInTaskData(task, spriteId, sStretchAttackerAffineAnimCmds);\n    task->func = AnimTask_AttackerStretchAndDisappear_Step;\n}\n\nstatic void AnimTask_AttackerStretchAndDisappear_Step(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    if (!RunAffineAnimFromTaskData(task))\n    {\n        gSprites[task->data[0]].y2 = 0;\n        gSprites[task->data[0]].invisible = TRUE;\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nvoid AnimTask_ExtremeSpeedImpact(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    task->data[0] = 0;\n    task->data[1] = 0;\n    task->data[2] = 0;\n    task->data[3] = 0;\n    task->data[12] = 3;\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n    {\n        task->data[13] = 0xFFFF;\n        task->data[14] = 8;\n    }\n    else\n    {\n        task->data[13] = 1;\n        task->data[14] = -8;\n    }\n\n    task->data[15] = GetAnimBattlerSpriteId(ANIM_TARGET);\n    task->func = AnimTask_ExtremeSpeedImpact_Step;\n}\n\nstatic void AnimTask_ExtremeSpeedImpact_Step(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        gSprites[task->data[15]].x2 += task->data[14];\n        task->data[1] = 0;\n        task->data[2] = 0;\n        task->data[3] = 0;\n        task->data[0]++;\n        break;\n    case 1:\n        if (++task->data[1] > 1)\n        {\n            task->data[1] = 0;\n            task->data[2]++;\n            if (task->data[2] & 1)\n                gSprites[task->data[15]].x2 += 6;\n            else\n                gSprites[task->data[15]].x2 -= 6;\n\n            if (++task->data[3] > 4)\n            {\n                if (task->data[2] & 1)\n                    gSprites[task->data[15]].x2 -= 6;\n\n                task->data[0]++;\n            }\n        }\n        break;\n    case 2:\n        if (--task->data[12] != 0)\n            task->data[0] = 0;\n        else\n            task->data[0]++;\n        break;\n    case 3:\n        gSprites[task->data[15]].x2 += task->data[13];\n        if (gSprites[task->data[15]].x2 == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nvoid AnimTask_ExtremeSpeedMonReappear(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    task->data[0] = 0;\n    task->data[1] = 0;\n    task->data[2] = 0;\n    task->data[3] = 0;\n    task->data[4] = 1;\n    task->data[13] = 14;\n    task->data[14] = 2;\n    task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    task->func = AnimTask_ExtremeSpeedMonReappear_Step;\n}\n\nstatic void AnimTask_ExtremeSpeedMonReappear_Step(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    if (task->data[0] == 0 && ++task->data[1] > task->data[4])\n    {\n        task->data[1] = 0;\n        if (++task->data[2] & 1)\n            gSprites[task->data[15]].invisible = FALSE;\n        else\n            gSprites[task->data[15]].invisible = TRUE;\n\n        if (++task->data[3] >= task->data[13])\n        {\n            if (++task->data[4] < task->data[14])\n            {\n                task->data[1] = 0;\n                task->data[2] = 0;\n                task->data[3] = 0;\n            }\n            else\n            {\n                gSprites[task->data[15]].invisible = FALSE;\n                DestroyAnimVisualTask(taskId);\n            }\n        }\n    }\n}\n\nvoid AnimTask_SpeedDust(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    task->data[0] = 0;\n    task->data[1] = 4;\n    task->data[2] = 0;\n    task->data[3] = 0;\n    task->data[4] = 0;\n    task->data[5] = 0;\n    task->data[6] = 0;\n    task->data[7] = 0;\n    task->data[8] = 0;\n    task->data[13] = 0;\n    task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n    task->data[15] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n    task->func = AnimTask_SpeedDust_Step;\n}\n\nstatic void AnimTask_SpeedDust_Step(u8 taskId)\n{\n    struct Task* task = &gTasks[taskId];\n    \n    switch (task->data[8])\n    {\n    case 0:\n        if (++task->data[4] > 1)\n        {\n            task->data[4] = 0;\n            task->data[5] = (task->data[5] + 1) & 1;\n            if (++task->data[6] > 20)\n            {\n                if (task->data[7] == 0)\n                {\n                    task->data[6] = 0;\n                    task->data[8] = 1;\n                }\n                else\n                    task->data[8] = 2;\n            }\n        }\n        break;\n    case 1:\n        task->data[5] = 0;\n        if (++task->data[4] > 20)\n        {\n            task->data[7] = 1;\n            task->data[8] = 0;\n        }\n        break;\n    case 2:\n        task->data[5] = 1;\n        break;\n    }\n\n    switch (task->data[0])\n    {\n    case 0:\n        if (++task->data[1] > 4)\n        {\n            u8 spriteId;\n            task->data[1] = 0;\n            spriteId = CreateSprite(&gSpeedDustSpriteTemplate, task->data[14], task->data[15], 0);\n            if (spriteId != MAX_SPRITES)\n            {\n                gSprites[spriteId].data[0] = taskId;\n                gSprites[spriteId].data[1] = 13;\n                gSprites[spriteId].x2 = sSpeedDustPosTable[task->data[2]][0];\n                gSprites[spriteId].y2 = sSpeedDustPosTable[task->data[2]][1];\n                task->data[13]++;\n                if (++task->data[2] > 3)\n                {\n                    task->data[2] = 0;\n                    if (++task->data[3] > 5)\n                        task->data[0]++;\n                }\n            }\n        }\n        break;\n    case 1:\n        if (task->data[13] == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void AnimSpeedDust(struct Sprite *sprite)\n{\n    sprite->invisible = gTasks[sprite->data[0]].data[5];\n    if (sprite->animEnded)\n    {\n        gTasks[sprite->data[0]].data[sprite->data[1]]--;\n        DestroySprite(sprite);\n    }\n}\n\nvoid AnimTask_LoadMusicNotesPals(u8 taskId)\n{\n    int i;\n    u8 paletteNums[NUM_MUSIC_NOTE_PAL_TAGS];\n\n    paletteNums[0] = IndexOfSpritePaletteTag(ANIM_TAG_MUSIC_NOTES_2);\n    for (i = 1; i < NUM_MUSIC_NOTE_PAL_TAGS; i++)\n        paletteNums[i] = AllocSpritePalette(ANIM_SPRITES_START - i);\n\n    gMonSpritesGfxPtr->multiUseBuffer = AllocZeroed(0x2000);\n    LZDecompressWram(gBattleAnimSpritePal_MusicNotes2, gMonSpritesGfxPtr->multiUseBuffer);\n    for (i = 0; i < NUM_MUSIC_NOTE_PAL_TAGS; i++)\n        LoadPalette(&gMonSpritesGfxPtr->multiUseBuffer[i * 32], OBJ_PLTT_ID(paletteNums[i]), PLTT_SIZE_4BPP);\n\n    FREE_AND_SET_NULL(gMonSpritesGfxPtr->multiUseBuffer);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_FreeMusicNotesPals(u8 taskId)\n{\n    int i;\n    \n    for (i = 0; i < NUM_MUSIC_NOTE_PAL_TAGS; i++)\n        FreeSpritePaletteByTag(gMusicNotePaletteTagsTable[i]);\n\n    DestroyAnimVisualTask(taskId);\n}\n\nstatic void SetMusicNotePalette(struct Sprite *sprite, u8 a, u8 b)\n{\n    u8 tile = (b & 1) ? 32 : 0;\n    sprite->oam.tileNum += tile + (a << 2);\n    sprite->oam.paletteNum = IndexOfSpritePaletteTag(gMusicNotePaletteTagsTable[b >> 1]);\n}\n\nstatic void AnimHealBellMusicNote(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, FALSE);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[2];\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[3];\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    SetMusicNotePalette(sprite, gBattleAnimArgs[5], gBattleAnimArgs[6]);\n}\n\nstatic void AnimMagentaHeart(struct Sprite *sprite)\n{\n    if (++sprite->data[0] == 1)\n        InitSpritePosToAnimAttacker(sprite, FALSE);\n\n    sprite->x2 = Sin(sprite->data[1], 8);\n    sprite->y2 = sprite->data[2] >> 8;\n    sprite->data[1] = (sprite->data[1] + 7) & 0xFF;\n    sprite->data[2] -= 0x80;\n    if (sprite->data[0] == 60)\n        DestroyAnimSprite(sprite);\n}\n\nvoid AnimTask_FakeOut(u8 taskId)\n{\n    u16 win0h = IsContest() ? 152 : DISPLAY_WIDTH;\n    u16 win0v = 0;\n\n    gBattle_WIN0H = win0h;\n    gBattle_WIN0V = DISPLAY_HEIGHT;\n    SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H);\n    SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V);\n    SetGpuReg(REG_OFFSET_WININ,  WININ_WIN1_CLR | WININ_WIN1_OBJ | WININ_WIN1_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_BG_ALL);\n    SetGpuReg(REG_OFFSET_WINOUT, WININ_WIN1_CLR | WININ_WIN1_OBJ | WININ_WIN1_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ | WININ_WIN0_BG_ALL);    \n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN);\n    SetGpuReg(REG_OFFSET_BLDY, 16);\n    gTasks[taskId].data[0] = win0v;\n    gTasks[taskId].data[1] = win0h;\n    gTasks[taskId].func = AnimTask_FakeOut_Step1;\n}\n\nstatic void AnimTask_FakeOut_Step1(u8 taskId)\n{\n    gTasks[taskId].data[0] += 13;\n    gTasks[taskId].data[1] -= 13;\n    if (gTasks[taskId].data[0] >= gTasks[taskId].data[1])\n    {\n        gBattle_WIN0H = 0;\n        gTasks[taskId].func = AnimTask_FakeOut_Step2;\n    }\n    else\n    {\n        gBattle_WIN0H = gTasks[taskId].data[1] | (gTasks[taskId].data[0] << 8);\n    }\n}\n\nstatic void AnimTask_FakeOut_Step2(u8 taskId)\n{\n    if (++gTasks[taskId].data[10] == 5)\n    {\n        gTasks[taskId].data[11] = 0x88;\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_LIGHTEN);\n        BlendPalettes(GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), 16, RGB_WHITE);\n    }\n    else if (gTasks[taskId].data[10] > 4)\n    {\n        gBattle_WIN0H = 0;\n        gBattle_WIN0V = 0;\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n        SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nvoid AnimTask_StretchTargetUp(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);\n    \n    if (++gTasks[taskId].data[0] == 1)\n    {\n        PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_TARGET), sAffineAnims_StretchBattlerUp);\n        gSprites[spriteId].x2 = 4;\n    }\n    else\n    {\n        gSprites[spriteId].x2 = -gSprites[spriteId].x2;\n        if (!RunAffineAnimFromTaskData(&gTasks[taskId]))\n        {\n            gSprites[spriteId].x2 = 0;\n            gSprites[spriteId].y2 = 0;\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n}\n\nvoid AnimTask_StretchAttackerUp(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    \n    if (++gTasks[taskId].data[0] == 1)\n    {\n        PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sAffineAnims_StretchBattlerUp);\n        gSprites[spriteId].x2 = 4;\n    }\n    else\n    {\n        gSprites[spriteId].x2 = -gSprites[spriteId].x2;\n        if (!RunAffineAnimFromTaskData(&gTasks[taskId]))\n        {\n            gSprites[spriteId].x2 = 0;\n            gSprites[spriteId].y2 = 0;\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n}\n\nstatic void AnimRedHeartProjectile(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[0] = 95;\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    InitAnimLinearTranslation(sprite);\n    sprite->callback = AnimRedHeartProjectile_Step;\n}\n\nstatic void AnimRedHeartProjectile_Step(struct Sprite *sprite)\n{\n    if (!AnimTranslateLinear(sprite))\n    {\n        sprite->y2 += Sin(sprite->data[5], 14);\n        sprite->data[5] = (sprite->data[5] + 4) & 0xFF;\n    }\n    else\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\nvoid AnimParticleBurst(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        sprite->data[1] = gBattleAnimArgs[0];\n        sprite->data[2] = gBattleAnimArgs[1];\n        sprite->data[0]++;\n    }\n    else\n    {\n        sprite->data[4] += sprite->data[1];\n        sprite->x2 = sprite->data[4] >> 8;\n        sprite->y2 = Sin(sprite->data[3], sprite->data[2]);\n        sprite->data[3] = (sprite->data[3] + 3) & 0xFF;\n        if (sprite->data[3] > 100)\n            sprite->invisible = sprite->data[3] % 2;\n\n        if (sprite->data[3] > 120)\n            DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimRedHeartRising(struct Sprite *sprite)\n{\n    sprite->x = gBattleAnimArgs[0];\n    sprite->y = DISPLAY_HEIGHT;\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[1];\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, AnimRedHeartRising_Step);\n}\n\nstatic void AnimRedHeartRising_Step(struct Sprite *sprite)\n{\n    s16 y;\n    \n    sprite->data[2] += sprite->data[1];\n    sprite->y2 = -((u16)sprite->data[2] >> 8);\n    sprite->x2 = Sin(sprite->data[3], 4);\n    sprite->data[3] = (sprite->data[3] + 3) & 0xFF;\n    y = sprite->y + sprite->y2;\n    if (y <= 72)\n    {\n        sprite->invisible = sprite->data[3] % 2;\n        if (y <= 64)\n            DestroyAnimSprite(sprite);\n    }\n}\n\nvoid AnimTask_HeartsBackground(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 3);\n    SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);\n    if (!IsContest())\n        SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);\n\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);\n    SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);\n    GetBattleAnimBg1Data(&animBg);\n    AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBg_AttractTilemap);\n    AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBg_AttractGfx, animBg.tilesOffset);\n    LoadCompressedPalette(gBattleAnimBg_AttractPal, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n    if (IsContest())\n        RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0);\n    \n    gTasks[taskId].func = AnimTask_HeartsBackground_Step;\n}\n\nstatic void AnimTask_HeartsBackground_Step(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n\n    switch (gTasks[taskId].data[12])\n    {\n    case 0:\n        if (++gTasks[taskId].data[10] == 4)\n        {\n            gTasks[taskId].data[10] = 0;\n            gTasks[taskId].data[11]++;\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));\n            if (gTasks[taskId].data[11] == 16)\n            {\n                gTasks[taskId].data[12]++;\n                gTasks[taskId].data[11] = 0;\n            }\n        }\n        break;\n    case 1:\n        if (++gTasks[taskId].data[11] == 141)\n        {\n            gTasks[taskId].data[11] = 16;\n            gTasks[taskId].data[12]++;\n        }\n        break;\n    case 2:\n        if (++gTasks[taskId].data[10] == 4)\n        {\n            gTasks[taskId].data[10] = 0;\n            gTasks[taskId].data[11]--;\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));\n            if (gTasks[taskId].data[11] == 0)\n            {\n                gTasks[taskId].data[12]++;\n                gTasks[taskId].data[11] = 0;\n            }\n        }\n        break;\n    case 3:\n        GetBattleAnimBg1Data(&animBg);\n        InitBattleAnimBg(animBg.bgId);\n        gTasks[taskId].data[12]++;\n        break;\n    case 4:\n        if (!IsContest())\n            SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);\n\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nvoid AnimTask_ScaryFace(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n    SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);\n    if (!IsContest())\n        SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);\n\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);\n    SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);\n    GetBattleAnimBg1Data(&animBg);\n    \n    if (IsContest())\n        LZDecompressVram(gBattleAnimBgTilemap_ScaryFaceContest, animBg.bgTilemap);\n    else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)\n        AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBgTilemap_ScaryFacePlayer);\n    else\n        AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBgTilemap_ScaryFaceOpponent);\n\n    AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnim_ScaryFaceGfx, animBg.tilesOffset);\n    LoadCompressedPalette(gBattleAnim_ScaryFacePal, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n    if (IsContest())\n        RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0);\n    \n    gTasks[taskId].func = AnimTask_ScaryFace_Step;\n}\n\nstatic void AnimTask_ScaryFace_Step(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n\n    switch (gTasks[taskId].data[12])\n    {\n    case 0:\n        if (++gTasks[taskId].data[10] == 2)\n        {\n            gTasks[taskId].data[10] = 0;\n            gTasks[taskId].data[11]++;\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));\n            if (gTasks[taskId].data[11] == 14)\n            {\n                gTasks[taskId].data[12]++;\n                gTasks[taskId].data[11] = 0;\n            }\n        }\n        break;\n    case 1:\n        if (++gTasks[taskId].data[11] == 21)\n        {\n            gTasks[taskId].data[11] = 14;\n            gTasks[taskId].data[12]++;\n        }\n        break;\n    case 2:\n        if (++gTasks[taskId].data[10] == 2)\n        {\n            gTasks[taskId].data[10] = 0;\n            gTasks[taskId].data[11]--;\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));\n            if (gTasks[taskId].data[11] == 0)\n            {\n                gTasks[taskId].data[12]++;\n                gTasks[taskId].data[11] = 0;\n            }\n        }\n        break;\n    case 3:\n        GetBattleAnimBg1Data(&animBg);\n        InitBattleAnimBg(1);\n        InitBattleAnimBg(2);\n        gTasks[taskId].data[12]++;\n        // fall through\n    case 4:\n        if (!IsContest())\n            SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);\n\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Orbits a sphere in an ellipse around the mon.\n// Used by MOVE_HIDDEN_POWER\n// arg 0: duration\n// arg 1: initial wave offset\nstatic void AnimOrbitFast(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->affineAnimPaused = TRUE;\n    sprite->data[0] = gBattleAnimArgs[0];\n    sprite->data[1] = gBattleAnimArgs[1];\n    sprite->data[7] = GetBattlerSpriteSubpriority(gBattleAnimAttacker);\n    sprite->callback = AnimOrbitFast_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimOrbitFast_Step(struct Sprite *sprite)\n{\n    if (sprite->data[1] >= 64 && sprite->data[1] <= 191)\n        sprite->subpriority = sprite->data[7] + 1;\n    else\n        sprite->subpriority = sprite->data[7] - 1;\n\n    sprite->x2 = Sin(sprite->data[1], sprite->data[2] >> 8);\n    sprite->y2 = Cos(sprite->data[1], sprite->data[3] >> 8);\n    sprite->data[1] = (sprite->data[1] + 9) & 0xFF;\n    switch (sprite->data[5])\n    {\n    case 1:\n        sprite->data[2] -= 0x400;\n        sprite->data[3] -= 0x100;\n        if (++sprite->data[4] == sprite->data[0])\n        {\n            sprite->data[5] = 2;\n            return;\n        }\n        break;\n    case 0:\n        sprite->data[2] += 0x400;\n        sprite->data[3] += 0x100;\n        if (++sprite->data[4] == sprite->data[0])\n        {\n            sprite->data[4] = 0;\n            sprite->data[5] = 1;\n        }\n        break;\n    }\n\n    if ((u16)gBattleAnimArgs[7] == 0xFFFF)\n        DestroyAnimSprite(sprite);\n}\n\n// Moves orbs away from the mon, based on where they are in their orbit.\n// Used in MOVE_HIDDEN_POWER.\n// arg 0: initial wave offset\nstatic void AnimOrbitScatter(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[0] = Sin(gBattleAnimArgs[0], 10);\n    sprite->data[1] = Cos(gBattleAnimArgs[0], 7);\n    sprite->callback = AnimOrbitScatter_Step;\n}\n\nstatic void AnimOrbitScatter_Step(struct Sprite *sprite)\n{\n    sprite->x2 += sprite->data[0];\n    sprite->y2 += sprite->data[1];\n    if (sprite->x + sprite->x2 + 16 > ((u32)DISPLAY_WIDTH + 32)\n     || sprite->y + sprite->y2 > DISPLAY_HEIGHT || sprite->y + sprite->y2 < -16)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimSpitUpOrb_Step(struct Sprite *sprite)\n{\n    sprite->x2 += sprite->data[0];\n    sprite->y2 += sprite->data[1];\n    if (sprite->data[3]++ >= sprite->data[2])\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimSpitUpOrb(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[0] = Sin(gBattleAnimArgs[0], 10);\n    sprite->data[1] = Cos(gBattleAnimArgs[0], 7);\n    sprite->data[2] = gBattleAnimArgs[1];\n    sprite->callback = AnimSpitUpOrb_Step;\n}\n\nstatic void AnimEyeSparkle_Step(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimEyeSparkle(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->callback = AnimEyeSparkle_Step;\n}\n\nstatic void AnimAngel(struct Sprite *sprite)\n{\n    s16 var0;\n    \n    if (!sprite->data[0])\n    {\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n    }\n\n    sprite->data[0]++;\n    var0 = (sprite->data[0] * 10) & 0xFF;\n    sprite->x2 = Sin(var0, 80) >> 8;\n    if (sprite->data[0] < 80)\n        sprite->y2 = (sprite->data[0] / 2) + (Cos(var0, 80) >> 8);\n\n    if (sprite->data[0] > 90)\n    {\n        sprite->data[2]++;\n        sprite->x2 -= sprite->data[2] / 2;\n    }\n\n    if (sprite->data[0] > 100)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimPinkHeart_Step(struct Sprite *sprite)\n{\n    sprite->data[5]++;\n    sprite->x2 = Sin(sprite->data[3], 5);\n    sprite->y2 = sprite->data[5] / 2;\n    sprite->data[3] = (sprite->data[3] + 3) & 0xFF;\n    if (sprite->data[5] > 20)\n        sprite->invisible = sprite->data[5] % 2;\n\n    if (sprite->data[5] > 30)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimPinkHeart(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        sprite->data[1] = gBattleAnimArgs[0];\n        sprite->data[2] = gBattleAnimArgs[1];\n        sprite->data[0]++;\n    }\n    else\n    {\n        sprite->data[4] += sprite->data[1];\n        sprite->x2 = sprite->data[4] >> 8;\n        sprite->y2 = Sin(sprite->data[3], sprite->data[2]);\n        sprite->data[3] = (sprite->data[3] + 3) & 0xFF;\n        if (sprite->data[3] > 70)\n        {\n            sprite->callback = AnimPinkHeart_Step;\n            sprite->x += sprite->x2;\n            sprite->y += sprite->y2;\n            sprite->x2 = 0;\n            sprite->y2 = 0;\n            sprite->data[3] = Random() % 180;\n        }\n    }\n}\n\nstatic void AnimDevil(struct Sprite *sprite)\n{\n    if (sprite->data[3] == 0)\n    {\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n        StartSpriteAnim(sprite, 0);\n        sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 1;\n        sprite->data[2] = 1;\n    }\n    sprite->data[0] += sprite->data[2];\n    sprite->data[1] = (sprite->data[0] * 4) % 256;\n    if (sprite->data[1] < 0)\n        sprite->data[1] = 0;\n    sprite->x2 = Cos(sprite->data[1], 30 - sprite->data[0] / 4);\n    sprite->y2 = Sin(sprite->data[1], 10 - sprite->data[0] / 8);\n    if (sprite->data[1] > 128 && sprite->data[2] > 0)\n        sprite->data[2] = -1;\n    if (sprite->data[1] == 0 && sprite->data[2] < 0)\n        sprite->data[2] = 1;\n    sprite->data[3]++;\n    if (sprite->data[3] < 10 || sprite->data[3] > 80)\n        sprite->invisible = sprite->data[0] % 2;\n    else\n        sprite->invisible = FALSE;\n    if (sprite->data[3] > 90)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimFurySwipes(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n        StartSpriteAnim(sprite, gBattleAnimArgs[2]);\n        sprite->data[0]++;\n    }\n    else if (sprite->animEnded)\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimMovementWaves(struct Sprite *sprite)\n{\n    if (!gBattleAnimArgs[2])\n    {\n        DestroyAnimSprite(sprite);\n    }\n    else\n    {\n        if (!gBattleAnimArgs[0])\n        {\n            sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n            sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n        }\n        else\n        {\n            sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n            sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n        }\n\n        if (!gBattleAnimArgs[1])\n            sprite->x += 32;\n        else\n            sprite->x -= 32;\n\n        sprite->data[0] = gBattleAnimArgs[2];\n        sprite->data[1] = gBattleAnimArgs[1];\n        StartSpriteAnim(sprite, sprite->data[1]);\n        sprite->callback = AnimMovementWaves_Step;\n    }\n}\n\nstatic void AnimMovementWaves_Step(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n    {\n        if (--sprite->data[0])\n            StartSpriteAnim(sprite, sprite->data[1]);\n        else\n            DestroyAnimSprite(sprite);\n    }\n}\n\nvoid AnimTask_UproarDistortion(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n\n    PrepareAffineAnimInTaskData(&gTasks[taskId], spriteId, sUproarAffineAnimCmds);\n    gTasks[taskId].func = AnimTask_UproarDistortion_Step;\n}\n\nstatic void AnimTask_UproarDistortion_Step(u8 taskId)\n{\n    if (!RunAffineAnimFromTaskData(&gTasks[taskId]))\n        DestroyAnimVisualTask(taskId);\n}\n\nstatic void AnimJaggedMusicNote(struct Sprite *sprite)\n{\n    int var1;\n    u8 battler = !gBattleAnimArgs[0] ? gBattleAnimAttacker : gBattleAnimTarget;\n\n    if (GetBattlerSide(battler) == B_SIDE_OPPONENT)\n        gBattleAnimArgs[1] *= -1;\n\n    sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2)  + gBattleAnimArgs[1];\n    sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];\n    sprite->data[0] = 0;\n    sprite->data[1] = (u16)sprite->x << 3;\n    sprite->data[2] = (u16)sprite->y << 3;\n\n    var1 = gBattleAnimArgs[1] << 3;\n    if (var1 < 0)\n        var1 += 7;\n    sprite->data[3] = var1 >> 3;\n\n    var1 = gBattleAnimArgs[2] << 3;\n    if (var1 < 0)\n        var1 += 7;\n    sprite->data[4] = var1 >> 3;\n\n    sprite->oam.tileNum += gBattleAnimArgs[3] * 16;\n    sprite->callback = AnimJaggedMusicNote_Step;\n}\n\nstatic void AnimJaggedMusicNote_Step(struct Sprite *sprite)\n{\n    sprite->data[1] += sprite->data[3];\n    sprite->data[2] += sprite->data[4];\n    sprite->x = sprite->data[1] >> 3;\n    sprite->y = sprite->data[2] >> 3;\n    if (++sprite->data[0] > 16)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimPerishSongMusicNote2(struct Sprite *sprite)\n{\n    if (!sprite->data[0])\n    {\n        sprite->data[1] = 120 - gBattleAnimArgs[0];\n        sprite->invisible = TRUE;\n    }\n\n    if (++sprite->data[0] == sprite->data[1])\n        SetGreyscaleOrOriginalPalette(sprite->oam.paletteNum + 16, FALSE);\n\n    if (sprite->data[0] == sprite->data[1] + 80)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimPerishSongMusicNote(struct Sprite *sprite)\n{\n    int index;\n    int var2;\n\n    if (!sprite->data[0])\n    {\n        sprite->x = 120;\n        sprite->y = gBattleAnimArgs[0] / 2 - 15;\n\n        StartSpriteAnim(sprite, gBattleAnimArgs[1]);\n\n        sprite->data[5] = 120;\n        sprite->data[3] = gBattleAnimArgs[2];\n    }\n\n    sprite->data[0]++;\n\n    sprite->data[1] = sprite->data[0] / 2;\n    index = ((sprite->data[0] * 3) + (u16)sprite->data[3]);\n    var2 = 0xFF;\n    sprite->data[6] = (sprite->data[6] + 10) & 0xFF;\n\n    index &= var2;\n    sprite->x2 = Cos(index, 100);\n\n    sprite->y2 = sprite->data[1] + Sin(index, 10) + Cos(sprite->data[6], 4);\n\n    if (sprite->data[0] > sprite->data[5])\n    {\n        sprite->callback = AnimPerishSongMusicNote_Step1;\n\n        sprite->data[0] = 0;\n        SetSpritePrimaryCoordsFromSecondaryCoords(sprite);\n        sprite->data[2] = 5;\n        sprite->data[4] = 0;\n        sprite->data[3] = 0;\n\n        StartSpriteAffineAnim(sprite, 1);\n    }\n}\n\nstatic void AnimPerishSongMusicNote_Step1(struct Sprite *sprite)\n{\n    if (++sprite->data[0] > 10)\n    {\n        sprite->data[0] = 0;\n        sprite->callback = AnimPerishSongMusicNote_Step2;\n    }\n}\n\nstatic void AnimPerishSongMusicNote_Step2(struct Sprite *sprite)\n{\n    sprite->data[3] += sprite->data[2];\n    sprite->y2 = sprite->data[3];\n\n    sprite->data[2]++;\n\n    if (sprite->data[3] > 48 && sprite->data[2] > 0)\n    {\n        sprite->data[2] = sprite->data[4] - 5;\n        sprite->data[4]++;\n    }\n\n    if (sprite->data[4] > 3)\n    {\n        sprite->invisible = sprite->data[2] % 2;\n        DestroyAnimSprite(sprite);\n    }\n\n    if (sprite->data[4] == 4)\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimGuardRing(struct Sprite *sprite)\n{\n    if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))\n    {\n        SetAverageBattlerPositions(gBattleAnimAttacker, FALSE, &sprite->x, &sprite->y);\n        sprite->y += 40;\n\n        StartSpriteAffineAnim(sprite, 1);\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 40;\n    }\n\n    sprite->data[0] = 13;\n    sprite->data[2] = sprite->x;\n    sprite->data[4] = sprite->y - 72;\n\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nvoid AnimTask_IsFuryCutterHitRight(u8 taskId)\n{\n    gBattleAnimArgs[ARG_RET_ID] = gAnimDisableStructPtr->furyCutterCounter & 1;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_GetFuryCutterHitCount(u8 taskId)\n{\n    gBattleAnimArgs[ARG_RET_ID] = gAnimDisableStructPtr->furyCutterCounter;\n    DestroyAnimVisualTask(taskId);\n}\n"
  },
  {
    "path": "src/battle_anim_effects_3.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"data.h\"\n#include \"decompress.h\"\n#include \"graphics.h\"\n#include \"pokemon_icon.h\"\n#include \"random.h\"\n#include \"scanline_effect.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"util.h\"\n#include \"constants/battle_anim.h\"\n#include \"constants/songs.h\"\n#include \"constants/weather.h\"\n\nstatic void AnimBlackSmoke(struct Sprite *);\nstatic void AnimBlackSmoke_Step(struct Sprite *);\nstatic void AnimWhiteHalo(struct Sprite *);\nstatic void AnimWhiteHalo_Step1(struct Sprite *);\nstatic void AnimWhiteHalo_Step2(struct Sprite *);\nstatic void AnimMeanLookEye(struct Sprite *);\nstatic void AnimMeanLookEye_Step1(struct Sprite *);\nstatic void AnimMeanLookEye_Step2(struct Sprite *);\nstatic void AnimMeanLookEye_Step3(struct Sprite *);\nstatic void AnimMeanLookEye_Step4(struct Sprite *);\nstatic void SetPsychicBackground_Step(u8);\nstatic void FadeScreenToWhite_Step(u8);\nstatic void AnimSpikes(struct Sprite *);\nstatic void AnimSpikes_Step1(struct Sprite *);\nstatic void AnimSpikes_Step2(struct Sprite *);\nstatic void AnimSpotlight(struct Sprite *);\nstatic void AnimSpotlight_Step1(struct Sprite *);\nstatic void AnimSpotlight_Step2(struct Sprite *);\nstatic void AnimClappingHand(struct Sprite *);\nstatic void AnimClappingHand_Step(struct Sprite *);\nstatic void AnimClappingHand2(struct Sprite *);\nstatic void AnimRapidSpin(struct Sprite *);\nstatic void AnimRapidSpin_Step(struct Sprite *);\nstatic void RapinSpinMonElevation_Step(u8);\nstatic void TormentAttacker_Step(u8);\nstatic void TormentAttacker_Callback(struct Sprite *);\nstatic void AnimWishStar(struct Sprite *);\nstatic void AnimWishStar_Step(struct Sprite *);\nstatic void AnimMiniTwinklingStar(struct Sprite *);\nstatic void AnimMiniTwinklingStar_Step(struct Sprite *);\nstatic void AnimGreenStar(struct Sprite *);\nstatic void AnimGreenStar_Step1(struct Sprite *);\nstatic void AnimGreenStar_Step2(struct Sprite *);\nstatic void AnimGreenStar_Callback(struct Sprite *);\nstatic void AnimTask_RockMonBackAndForth_Step(u8);\nstatic void AnimSweetScentPetal(struct Sprite *);\nstatic void AnimSweetScentPetal_Step(struct Sprite *);\nstatic void AnimTask_FlailMovement_Step(u8);\nstatic void AnimFlatterConfetti(struct Sprite *);\nstatic void AnimFlatterConfetti_Step(struct Sprite *);\nstatic void AnimFlatterSpotlight(struct Sprite *);\nstatic void AnimFlatterSpotlight_Step(struct Sprite *);\nstatic void AnimReversalOrb(struct Sprite *);\nstatic void AnimReversalOrb_Step(struct Sprite *);\nstatic void AnimTask_RolePlaySilhouette_Step1(u8);\nstatic void AnimTask_RolePlaySilhouette_Step2(u8);\nstatic void AnimTask_AcidArmor_Step(u8);\nstatic void AnimTask_DeepInhale_Step(u8);\nstatic void AnimYawnCloud(struct Sprite *);\nstatic void AnimYawnCloud_Step(struct Sprite *);\nstatic void AnimTask_SquishAndSweatDroplets_Step(u8);\nstatic void CreateSweatDroplets(u8, bool8);\nstatic void AnimTask_FacadeColorBlend_Step(u8);\nstatic void AnimRoarNoiseLine(struct Sprite *);\nstatic void AnimRoarNoiseLine_Step(struct Sprite *);\nstatic void AnimTask_GlareEyeDots_Step(u8);\nstatic void GetGlareEyeDotCoords(s16, s16, s16, s16, u8, u8, s16 *, s16 *);\nstatic void AnimTask_BarrageBall_Step(u8);\nstatic void AnimSmellingSaltsHand(struct Sprite *);\nstatic void AnimSmellingSaltsHand_Step(struct Sprite *);\nstatic void AnimTask_SmellingSaltsSquish_Step(u8);\nstatic void AnimSmellingSaltExclamation(struct Sprite *);\nstatic void AnimSmellingSaltExclamation_Step(struct Sprite *);\nstatic void AnimHelpingHandClap(struct Sprite *);\nstatic void AnimHelpingHandClap_Step(struct Sprite *);\nstatic void AnimTask_HelpingHandAttackerMovement_Step(u8);\nstatic void AnimForesightMagnifyingGlass(struct Sprite *);\nstatic void AnimForesightMagnifyingGlass_Step(struct Sprite *);\nstatic void AnimTask_MonToSubstituteDoll(u8);\nstatic void AnimBlockX(struct Sprite *);\nstatic void AnimBlockX_Step(struct Sprite *);\nstatic void AnimTask_OdorSleuthMovementWaitFinish(u8);\nstatic void MoveOdorSleuthClone(struct Sprite *);\nstatic void AnimTask_TeeterDanceMovement_Step(u8);\nstatic void AnimRecycle(struct Sprite *);\nstatic void AnimRecycle_Step(struct Sprite *);\nstatic void AnimTask_SlackOffSquish_Step(u8);\nstatic void AnimTealAlert(struct Sprite *);\nstatic void AnimLeer(struct Sprite *);\nstatic void AnimLetterZ(struct Sprite *);\nstatic void AnimFang(struct Sprite *);\nstatic void AnimTriAttackTriangle(struct Sprite *);\nstatic void AnimBatonPassPokeball(struct Sprite *);\nstatic void AnimSwallowBlueOrb(struct Sprite *);\nstatic void AnimWeakFrustrationAngerMark(struct Sprite *);\nstatic void AnimPainSplitProjectile(struct Sprite *);\nstatic void AnimSmokeBallEscapeCloud(struct Sprite *);\nstatic void AnimFacadeSweatDrop(struct Sprite *);\nstatic void AnimGlareEyeDot(struct Sprite *);\nstatic void AnimAssistPawprint(struct Sprite *);\nstatic void AnimMeteorMashStar(struct Sprite *);\nstatic void AnimUnusedItemBagSteal(struct Sprite *);\nstatic void AnimKnockOffStrike(struct Sprite *);\n\nstatic const union AnimCmd sScratchAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(48, 4),\n    ANIMCMD_FRAME(64, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sScratchAnimTable[] =\n{\n    sScratchAnimCmds,\n};\n\nconst struct SpriteTemplate gScratchSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SCRATCH,\n    .paletteTag = ANIM_TAG_SCRATCH,\n    .oam = &gOamData_AffineOff_ObjBlend_32x32,\n    .anims = sScratchAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSpriteOnMonPos,\n};\n\nconst struct SpriteTemplate gBlackSmokeSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_BLACK_SMOKE,\n    .paletteTag = ANIM_TAG_BLACK_SMOKE,\n    .oam = &gOamData_AffineOff_ObjNormal_32x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBlackSmoke,\n};\n\nconst struct SpriteTemplate gBlackBallSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_BLACK_BALL,\n    .paletteTag = ANIM_TAG_BLACK_BALL,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimThrowProjectile,\n};\n\nstatic const union AnimCmd sOpeningEyeAnimCmds[] =    \n{\n    ANIMCMD_FRAME(0, 40),\n    ANIMCMD_FRAME(16, 8),\n    ANIMCMD_FRAME(32, 40),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sOpeningEyeAnimTable[] =    \n{\n    sOpeningEyeAnimCmds,\n};\n\nconst struct SpriteTemplate gOpeningEyeSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_OPENING_EYE,\n    .paletteTag = ANIM_TAG_OPENING_EYE,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sOpeningEyeAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSpriteOnMonPos,\n};\n\nconst struct SpriteTemplate gWhiteHaloSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROUND_WHITE_HALO,\n    .paletteTag = ANIM_TAG_ROUND_WHITE_HALO,\n    .oam = &gOamData_AffineOff_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWhiteHalo,\n};\n\nconst struct SpriteTemplate gTealAlertSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_TEAL_ALERT,\n    .paletteTag = ANIM_TAG_TEAL_ALERT,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimTealAlert,\n};\n\nstatic const union AffineAnimCmd sMeanLookEyeAffineAnimCmds1[] =\n{\n    AFFINEANIMCMD_FRAME(0x180, 0x180, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x20, 0x18, 0, 5),\n    AFFINEANIMCMD_FRAME(0x18, -0x20, 0, 5),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd sMeanLookEyeAffineAnimCmds2[] =\n{\n    AFFINEANIMCMD_FRAME(0x30, 0x30, 0, 0),\n    AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 6),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sMeanLookEyeAffineAnimTable[] =\n{\n    sMeanLookEyeAffineAnimCmds1,\n    sMeanLookEyeAffineAnimCmds2,\n};\n\nconst struct SpriteTemplate gMeanLookEyeSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_EYE,\n    .paletteTag = ANIM_TAG_EYE,\n    .oam = &gOamData_AffineDouble_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sMeanLookEyeAffineAnimTable,\n    .callback = AnimMeanLookEye,\n};\n\nconst struct SpriteTemplate gSpikesSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_SPIKES,\n    .paletteTag = ANIM_TAG_SPIKES,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSpikes,\n};\n\nstatic const union AnimCmd sLeerAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_FRAME(64, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sLeerAnimTable[] =\n{\n    sLeerAnimCmds,\n};\n\nconst struct SpriteTemplate gLeerSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_LEER,\n    .paletteTag = ANIM_TAG_LEER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sLeerAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimLeer,\n};\n\nstatic const union AnimCmd sLetterZAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sLetterZAnimTable[] =\n{\n    sLetterZAnimCmds,\n};\n\nstatic const union AffineAnimCmd sLetterZAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(-7, -7, -3, 16),\n    AFFINEANIMCMD_FRAME(7, 7, 3, 16),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sLetterZAffineAnimTable[] =\n{\n    sLetterZAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gLetterZSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_LETTER_Z,\n    .paletteTag = ANIM_TAG_LETTER_Z,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sLetterZAnimTable,\n    .images = NULL,\n    .affineAnims = sLetterZAffineAnimTable,\n    .callback = AnimLetterZ,\n};\n\nstatic const union AnimCmd sFangAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(16, 16),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(48, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sFangAnimTable[] =\n{\n    sFangAnimCmds,\n};\n\nstatic const union AffineAnimCmd sFangAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x20, -0x20, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sFangAffineAnimTable[] =\n{\n    sFangAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gFangSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FANG_ATTACK,\n    .paletteTag = ANIM_TAG_FANG_ATTACK,\n    .oam = &gOamData_AffineDouble_ObjNormal_32x32,\n    .anims = sFangAnimTable,\n    .images = NULL,\n    .affineAnims = sFangAffineAnimTable,\n    .callback = AnimFang,\n};\n\nstatic const union AffineAnimCmd sSpotlightAffineAnimCmds1[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x180, 0, 0),\n    AFFINEANIMCMD_FRAME(0x10, 0x0, 0, 20),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sSpotlightAffineAnimCmds2[] =\n{\n    AFFINEANIMCMD_FRAME(0x140, 0x180, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x10, 0x0, 0, 19),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sSpotlightAffineAnimTable[] =\n{\n    sSpotlightAffineAnimCmds1,\n    sSpotlightAffineAnimCmds2,\n};\n\nconst struct SpriteTemplate gSpotlightSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPOTLIGHT,\n    .paletteTag = ANIM_TAG_SPOTLIGHT,\n    .oam = &gOamData_AffineDouble_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sSpotlightAffineAnimTable,\n    .callback = AnimSpotlight,\n};\n\nconst struct SpriteTemplate gClappingHandSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_TAG_HAND,\n    .paletteTag = ANIM_TAG_TAG_HAND,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimClappingHand,\n};\n\nconst struct SpriteTemplate gClappingHand2SpriteTemplate =\n{\n    .tileTag = ANIM_TAG_TAG_HAND,\n    .paletteTag = ANIM_TAG_TAG_HAND,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimClappingHand2,\n};\n\nstatic const union AnimCmd sRapidSpinAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(8, 2),\n    ANIMCMD_FRAME(16, 2),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sRapidSpinAnimTable[] =\n{\n    sRapidSpinAnimCmds,\n};\n\nconst struct SpriteTemplate gRapidSpinSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_RAPID_SPIN,\n    .paletteTag = ANIM_TAG_RAPID_SPIN,\n    .oam = &gOamData_AffineOff_ObjNormal_32x16,\n    .anims = sRapidSpinAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRapidSpin,\n};\n\nstatic const union AffineAnimCmd sAffineAnims_Torment[] =\n{\n    AFFINEANIMCMD_FRAME(-12, 8, 0, 4),\n    AFFINEANIMCMD_FRAME(20, -20, 0, 4),\n    AFFINEANIMCMD_FRAME(-8, 12, 0, 4),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AnimCmd sTriAttackTriangleAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sTriAttackTriangleAnimTable[] =\n{\n    sTriAttackTriangleAnimCmds,\n};\n\nstatic const union AffineAnimCmd sTriAttackTriangleAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, 5, 40),\n    AFFINEANIMCMD_FRAME(0, 0, 10, 10),\n    AFFINEANIMCMD_FRAME(0, 0, 15, 10),\n    AFFINEANIMCMD_FRAME(0, 0, 20, 40),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sTriAttackTriangleAffineAnimTable[] =\n{\n    sTriAttackTriangleAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gTriAttackTriangleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_TRI_ATTACK_TRIANGLE,\n    .paletteTag = ANIM_TAG_TRI_ATTACK_TRIANGLE,\n    .oam = &gOamData_AffineDouble_ObjNormal_64x64,\n    .anims = sTriAttackTriangleAnimTable,\n    .images = NULL,\n    .affineAnims = sTriAttackTriangleAffineAnimTable,\n    .callback = AnimTriAttackTriangle,\n};\n\nstatic const union AnimCmd sEclipsingOrbAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_FRAME(32, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 3, .hFlip = TRUE),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sEclipsingOrbAnimTable[] =\n{\n    sEclipsingOrbAnimCmds,\n};\n\nconst struct SpriteTemplate gEclipsingOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ECLIPSING_ORB,\n    .paletteTag = ANIM_TAG_ECLIPSING_ORB,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sEclipsingOrbAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSpriteOnMonPos,\n};\n\nstatic const union AffineAnimCmd DefenseCurlDeformMonAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(-12, 20, 0, 8),\n    AFFINEANIMCMD_FRAME(12, -20, 0, 8),\n    AFFINEANIMCMD_LOOP(2),\n    AFFINEANIMCMD_END,\n};\n\nconst struct SpriteTemplate gBatonPassPokeballSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_POKEBALL,\n    .paletteTag = ANIM_TAG_POKEBALL,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBatonPassPokeball,\n};\n\nconst struct SpriteTemplate gWishStarSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GOLD_STARS,\n    .paletteTag = ANIM_TAG_GOLD_STARS,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWishStar,\n};\n\nconst struct SpriteTemplate gMiniTwinklingStarSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GOLD_STARS,\n    .paletteTag = ANIM_TAG_GOLD_STARS,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMiniTwinklingStar,\n};\n\nstatic const union AffineAnimCmd sStockpileDeformMonAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(8, -8, 0, 12),\n    AFFINEANIMCMD_FRAME(-16, 16, 0, 12),\n    AFFINEANIMCMD_FRAME(8, -8, 0, 12),\n    AFFINEANIMCMD_LOOP(1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sSpitUpDeformMonAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(0, 6, 0, 20),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 20),\n    AFFINEANIMCMD_FRAME(0, -18, 0, 6),\n    AFFINEANIMCMD_FRAME(-18, -18, 0, 3),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 15),\n    AFFINEANIMCMD_FRAME(4, 4, 0, 13),\n    AFFINEANIMCMD_END,\n};\n\nconst struct SpriteTemplate gSwallowBlueOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BLUE_ORB,\n    .paletteTag = ANIM_TAG_BLUE_ORB,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSwallowBlueOrb,\n};\n\nstatic const union AffineAnimCmd sSwallowDeformMonAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(0, 6, 0, 20),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 20),\n    AFFINEANIMCMD_FRAME(7, -30, 0, 6),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 20),\n    AFFINEANIMCMD_FRAME(-2, 3, 0, 20),\n    AFFINEANIMCMD_END,\n};\n\nstatic const s8 sMorningSunLightBeamCoordsTable[] =\n{\n    0xE8,\n    0x18,\n    0xFC,\n    0x00,\n};\n\nstatic const union AnimCmd sGreenStarAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(4, 6),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sGreenStarAnimCmds2[] =\n{\n    ANIMCMD_FRAME(8, 6),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sGreenStarAnimCmds3[] =    \n{\n    ANIMCMD_FRAME(12, 6),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sGreenStarAnimTable[] =    \n{\n    sGreenStarAnimCmds1,\n    sGreenStarAnimCmds2,\n    sGreenStarAnimCmds3,\n};\n\nconst struct SpriteTemplate gGreenStarSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_GREEN_STAR,\n    .paletteTag = ANIM_TAG_GREEN_STAR,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sGreenStarAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimGreenStar,\n};\n\nstatic const s8 sDoomDesireLightBeamCoordTable[] =    \n{\n    0x78,\n    0x50,\n    0x28,\n    0x00,\n};\n\nstatic const u8 sDoomDesireLightBeamDelayTable[] =    \n{\n    0,\n    0,\n    0,\n    0,\n    50,\n};\n\nstatic const union AffineAnimCmd sStrongFrustrationAffineAnimCmds[] =    \n{\n    AFFINEANIMCMD_FRAME(0, -15, 0, 7),\n    AFFINEANIMCMD_FRAME(0, 15, 0, 7),\n    AFFINEANIMCMD_LOOP(2),\n    AFFINEANIMCMD_END,\n};\n\nconst struct SpriteTemplate gWeakFrustrationAngerMarkSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ANGER,\n    .paletteTag = ANIM_TAG_ANGER,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWeakFrustrationAngerMark,\n};\n\nstatic const union AnimCmd sSweetScentPetalAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_FRAME(3, 8),\n    ANIMCMD_FRAME(3, 8, .vFlip = TRUE),\n    ANIMCMD_FRAME(2, 8, .vFlip = TRUE),\n    ANIMCMD_FRAME(0, 8, .vFlip = TRUE),\n    ANIMCMD_FRAME(1, 8, .vFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sSweetScentPetalAnimCmds2[] =\n{\n    ANIMCMD_FRAME(0, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(1, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(3, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(3, 8, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 8, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 8, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(1, 8, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sSweetScentPetalAnimCmds3[] =\n{\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSweetScentPetalAnimCmdTable[] =    \n{\n    sSweetScentPetalAnimCmds1,\n    sSweetScentPetalAnimCmds2,\n    sSweetScentPetalAnimCmds3,\n};\n\nconst struct SpriteTemplate gSweetScentPetalSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_PINK_PETAL,\n    .paletteTag = ANIM_TAG_PINK_PETAL,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sSweetScentPetalAnimCmdTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSweetScentPetal,\n};\n\nstatic const u16 sUnusedPalette[] = INCBIN_U16(\"graphics/battle_anims/unused/unknown.gbapal\");\n\nstatic const union AnimCmd sPainSplitAnimCmds[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(4, 9),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sPainSplitAnimCmdTable[] =\n{\n    sPainSplitAnimCmds,\n};\n\nconst struct SpriteTemplate gPainSplitProjectileSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_PAIN_SPLIT,\n    .paletteTag = ANIM_TAG_PAIN_SPLIT,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sPainSplitAnimCmdTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimPainSplitProjectile,\n};\n\nconst struct SpriteTemplate gFlatterConfettiSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CONFETTI,\n    .paletteTag = ANIM_TAG_CONFETTI,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFlatterConfetti,\n};\n\nconst struct SpriteTemplate gFlatterSpotlightSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPOTLIGHT,\n    .paletteTag = ANIM_TAG_SPOTLIGHT,\n    .oam = &gOamData_AffineDouble_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sSpotlightAffineAnimTable,\n    .callback = AnimFlatterSpotlight,\n};\n\nconst struct SpriteTemplate gReversalOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BLUE_ORB,\n    .paletteTag = ANIM_TAG_BLUE_ORB,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimReversalOrb,\n};\n\nstatic const union AffineAnimCmd sDeepInhaleAffineAnimCmds[] =    \n{\n    AFFINEANIMCMD_FRAME(16, 0, 0, 4),\n    AFFINEANIMCMD_FRAME(0, -3, 0, 16),\n    AFFINEANIMCMD_FRAME(4, 0, 0, 4),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 24),\n    AFFINEANIMCMD_FRAME(-5, 3, 0, 16),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sYawnCloudAffineAnimCmds1[] =    \n{\n    AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0),\n    AFFINEANIMCMD_FRAME(-8, -8, 0, 8),\n    AFFINEANIMCMD_FRAME(8, 8, 0, 8),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sYawnCloudAffineAnimCmds2[] =    \n{\n    AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0),\n    AFFINEANIMCMD_FRAME(8, 8, 0, 8),\n    AFFINEANIMCMD_FRAME(-8, -8, 0, 8),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sYawnCloudAffineAnimCmds3[] =    \n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(8, 8, 0, 8),\n    AFFINEANIMCMD_FRAME(-8, -8, 0, 8),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sYawnCloudAffineAnimTable[] =    \n{\n    sYawnCloudAffineAnimCmds1,\n    sYawnCloudAffineAnimCmds2,\n    sYawnCloudAffineAnimCmds3,\n};\n\nconst struct SpriteTemplate gYawnCloudSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_PINK_CLOUD,\n    .paletteTag = ANIM_TAG_PINK_CLOUD,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sYawnCloudAffineAnimTable,\n    .callback = AnimYawnCloud,\n};\n\nstatic const union AffineAnimCmd sSmokeBallEscapeCloudAffineAnimCmds1[] =    \n{\n    AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0),\n    AFFINEANIMCMD_FRAME(-4, -6, 0, 16),\n    AFFINEANIMCMD_FRAME(4, 6, 0, 16),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sSmokeBallEscapeCloudAffineAnimCmds2[] =    \n{\n    AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0),\n    AFFINEANIMCMD_FRAME(4, 6, 0, 16),\n    AFFINEANIMCMD_FRAME(-4, -6, 0, 16),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sSmokeBallEscapeCloudAffineAnimCmds3[] =    \n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(4, 6, 0, 16),\n    AFFINEANIMCMD_FRAME(-4, -6, 0, 16),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sSmokeBallEscapeCloudAffineAnimCmds4[] =    \n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(8, 10, 0, 30),\n    AFFINEANIMCMD_FRAME(-8, -10, 0, 16),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sSmokeBallEscapeCloudAffineAnimTable[] =    \n{\n    sSmokeBallEscapeCloudAffineAnimCmds1,\n    sSmokeBallEscapeCloudAffineAnimCmds2,\n    sSmokeBallEscapeCloudAffineAnimCmds3,\n    sSmokeBallEscapeCloudAffineAnimCmds4,\n};\n\nconst struct SpriteTemplate gSmokeBallEscapeCloudSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_PINK_CLOUD,\n    .paletteTag = ANIM_TAG_PINK_CLOUD,\n    .oam = &gOamData_AffineDouble_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sSmokeBallEscapeCloudAffineAnimTable,\n    .callback = AnimSmokeBallEscapeCloud,\n};\n\nstatic const union AffineAnimCmd sFacadeSquishAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(-16, 16, 0, 6),\n    AFFINEANIMCMD_FRAME(16, -16, 0, 12),\n    AFFINEANIMCMD_FRAME(-16, 16, 0, 6),\n    AFFINEANIMCMD_END,\n};\n\nconst struct SpriteTemplate gFacadeSweatDropSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SWEAT_DROP,\n    .paletteTag = ANIM_TAG_SWEAT_DROP,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFacadeSweatDrop,\n};\n\nstatic const u16 sFacadeBlendColors[] = \n{\n    RGB(28, 25,  1),\n    RGB(28, 21,  5),\n    RGB(27, 18,  8),\n    RGB(27, 14, 11),\n    RGB(26, 10, 15),\n    RGB(26,  7, 18),\n    RGB(25,  3, 21),\n    RGB(25,  0, 25),\n    RGB(25,  0, 23),\n    RGB(25,  0, 20),\n    RGB(25,  0, 16),\n    RGB(25,  0, 13),\n    RGB(26,  0, 10),\n    RGB(26,  0,  6),\n    RGB(26,  0,  3),\n    RGB(27,  0,  0),\n    RGB(27,  1,  0),\n    RGB(27,  5,  0),\n    RGB(27,  9,  0),\n    RGB(27, 12,  0),\n    RGB(28, 16,  0),\n    RGB(28, 19,  0),\n    RGB(28, 23,  0),\n    RGB(29, 27,  0),\n};\n\nstatic const union AnimCmd sRoarNoiseLineAnimCmds1[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sRoarNoiseLineAnimCmds2[] =    \n{\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sRoarNoiseLineAnimTable[] =\n{\n    sRoarNoiseLineAnimCmds1,\n    sRoarNoiseLineAnimCmds2,\n};\n\nconst struct SpriteTemplate gRoarNoiseLineSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_NOISE_LINE,\n    .paletteTag = ANIM_TAG_NOISE_LINE,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sRoarNoiseLineAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRoarNoiseLine,\n};\n\nconst struct SpriteTemplate gGlareEyeDotSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_RED_EYE,\n    .paletteTag = ANIM_TAG_SMALL_RED_EYE,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimGlareEyeDot,\n};\n\nconst struct SpriteTemplate gAssistPawprintSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_PAW_PRINT,\n    .paletteTag = ANIM_TAG_PAW_PRINT,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimAssistPawprint,\n};\n\nstatic const union AffineAnimCmd sBarrageBallAffineAnimCmds1[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, -4, 24),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sBarrageBallAffineAnimCmds2[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0),\n    AFFINEANIMCMD_FRAME(0, 0, 4, 24),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sBarrageBallAffineAnimTable[] =\n{\n    sBarrageBallAffineAnimCmds1,\n    sBarrageBallAffineAnimCmds2,\n};\n\nconst struct SpriteTemplate gBarrageBallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_RED_BALL,\n    .paletteTag = ANIM_TAG_RED_BALL,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sBarrageBallAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nconst struct SpriteTemplate gSmellingSaltsHandSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_TAG_HAND,\n    .paletteTag = ANIM_TAG_TAG_HAND,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSmellingSaltsHand,\n};\n\nstatic const union AffineAnimCmd sSmellingSaltsSquishAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(0, -16, 0, 6),\n    AFFINEANIMCMD_FRAME(0, 16, 0, 6),\n    AFFINEANIMCMD_END,\n};\n\nconst struct SpriteTemplate gSmellingSaltExclamationSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMELLINGSALT_EFFECT,\n    .paletteTag = ANIM_TAG_SMELLINGSALT_EFFECT,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSmellingSaltExclamation,\n};\n\nconst struct SpriteTemplate gHelpingHandClapSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_TAG_HAND,\n    .paletteTag = ANIM_TAG_TAG_HAND,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimHelpingHandClap,\n};\n\nconst struct SpriteTemplate gForesightMagnifyingGlassSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MAGNIFYING_GLASS,\n    .paletteTag = ANIM_TAG_MAGNIFYING_GLASS,\n    .oam = &gOamData_AffineOff_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimForesightMagnifyingGlass,\n};\n\nconst struct SpriteTemplate gMeteorMashStarSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_GOLD_STARS,\n    .paletteTag = ANIM_TAG_GOLD_STARS,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMeteorMashStar,\n};\n\nstatic const struct SpriteTemplate sUnusedStarBurstSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GOLD_STARS,\n    .paletteTag = ANIM_TAG_GOLD_STARS,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimParticleBurst,\n};\n\nconst struct SpriteTemplate gBlockXSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_X_SIGN,\n    .paletteTag = ANIM_TAG_X_SIGN,\n    .oam = &gOamData_AffineOff_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBlockX,\n};\n\nstatic const struct SpriteTemplate sUnusedItemBagStealSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ITEM_BAG,\n    .paletteTag = ANIM_TAG_ITEM_BAG,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimUnusedItemBagSteal,\n};\n\nstatic const union AnimCmd sKnockOffStrikeAnimCmds[] =    \n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(64, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sKnockOffStrikeAnimTable[] =    \n{\n    sKnockOffStrikeAnimCmds,\n};\n\nstatic const union AffineAnimCmd sKnockOffStrikeAffineanimCmds1[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(0, 0, -4, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sKnockOffStrikeAffineanimCmds2[] =\n{\n    AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(0, 0, 4, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sKnockOffStrikeAffineAnimTable[] =\n{\n    sKnockOffStrikeAffineanimCmds1,\n    sKnockOffStrikeAffineanimCmds2,\n};\n\nconst struct SpriteTemplate gKnockOffStrikeSpriteTemplate =    \n{\n    .tileTag = ANIM_TAG_SLAM_HIT_2,\n    .paletteTag = ANIM_TAG_SLAM_HIT_2,\n    .oam = &gOamData_AffineNormal_ObjNormal_64x64,\n    .anims = sKnockOffStrikeAnimTable,\n    .images = NULL,\n    .affineAnims = sKnockOffStrikeAffineAnimTable,\n    .callback = AnimKnockOffStrike,\n};\n\nstatic const union AffineAnimCmd sRecycleSpriteAffineAnimCmds[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, -4, 64),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sRecycleSpriteAffineAnimTable[] =\n{\n    sRecycleSpriteAffineAnimCmds,\n};\n\nconst struct SpriteTemplate gRecycleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_RECYCLE,\n    .paletteTag = ANIM_TAG_RECYCLE,\n    .oam = &gOamData_AffineNormal_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sRecycleSpriteAffineAnimTable,\n    .callback = AnimRecycle,\n};\n\nstatic const union AffineAnimCmd sSlackOffSquishAffineAnimCmds[] =    \n{\n    AFFINEANIMCMD_FRAME(0, 16, 0, 4),\n    AFFINEANIMCMD_FRAME(-2, 0, 0, 8),\n    AFFINEANIMCMD_FRAME(0, 4, 0, 4),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 24),\n    AFFINEANIMCMD_FRAME(1, -5, 0, 16),\n    AFFINEANIMCMD_END,\n};\n\nstatic void AnimBlackSmoke(struct Sprite *sprite)\n{\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    if (!gBattleAnimArgs[3])\n        sprite->data[0] = gBattleAnimArgs[2];\n    else\n        sprite->data[0] = -gBattleAnimArgs[2];\n\n    sprite->data[1] = gBattleAnimArgs[4];\n    sprite->callback = AnimBlackSmoke_Step;\n}\n\nstatic void AnimBlackSmoke_Step(struct Sprite *sprite)\n{\n    if (sprite->data[1] > 0)\n    {\n        sprite->x2 = sprite->data[2] >> 8;\n        sprite->data[2] += sprite->data[0];\n        sprite->invisible ^= 1;\n        sprite->data[1]--;\n    }\n    else\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\nvoid AnimTask_SmokescreenImpact(u8 taskId)\n{\n    SmokescreenImpact(\n        GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + 8,\n        GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + 8,\n        FALSE);\n    DestroyAnimVisualTask(taskId);\n}\n\nstatic void AnimWhiteHalo(struct Sprite *sprite)\n{\n    sprite->data[0] = 90;\n    sprite->callback = WaitAnimForDuration;\n    sprite->data[1] = 7;\n    StoreSpriteCallbackInData6(sprite, AnimWhiteHalo_Step1);\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1]));\n}\n\nstatic void AnimWhiteHalo_Step1(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1]));\n    if (--sprite->data[1] < 0)\n    {\n        sprite->invisible = TRUE;\n        sprite->callback = AnimWhiteHalo_Step2;\n    }\n}\n\nstatic void AnimWhiteHalo_Step2(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    DestroyAnimSprite(sprite);\n}\n\nstatic void AnimTealAlert(struct Sprite *sprite)\n{\n    u16 rotation;\n    u8 x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    u8 y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    rotation = ArcTan2Neg(sprite->x - x, sprite->y - y);\n    rotation += 0x6000;\n    if (IsContest())\n        rotation += 0x4000;\n\n    TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rotation);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[2] = x;\n    sprite->data[4] = y;\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nstatic void AnimMeanLookEye(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    sprite->data[0] = 4;\n    sprite->callback = AnimMeanLookEye_Step1;\n}\n\nstatic void AnimMeanLookEye_Step1(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0]));\n    if (sprite->data[1])\n        sprite->data[0]--;\n    else\n        sprite->data[0]++;\n\n    if (sprite->data[0] == 15 || sprite->data[0] == 4)\n        sprite->data[1] ^= 1;\n\n    if (sprite->data[2]++ > 70)\n    {\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        StartSpriteAffineAnim(sprite, 1);\n        sprite->data[2] = 0;\n        sprite->invisible = TRUE;\n        sprite->affineAnimPaused = TRUE;\n        sprite->callback = AnimMeanLookEye_Step2;\n    }\n}\n\nstatic void AnimMeanLookEye_Step2(struct Sprite *sprite)\n{\n    if (sprite->data[2]++ > 9)\n    {\n        sprite->invisible = FALSE;\n        sprite->affineAnimPaused = FALSE;\n        if (sprite->affineAnimEnded)\n            sprite->callback = AnimMeanLookEye_Step3;\n    }\n}\n\nstatic void AnimMeanLookEye_Step3(struct Sprite *sprite)\n{\n    switch (sprite->data[3])\n    {\n    case 0:\n    case 1:\n        sprite->x2 = 1;\n        sprite->y2 = 0;\n        break;\n    case 2:\n    case 3:\n        sprite->x2 = -1;\n        sprite->y2 = 0;\n        break;\n    case 4:\n    case 5:\n        sprite->x2 = 0;\n        sprite->y2 = 1;\n        break;\n    case 6:\n    default:\n        sprite->x2 = 0;\n        sprite->y2 = -1;\n        break;\n    }\n\n    if (++sprite->data[3] > 7)\n        sprite->data[3] = 0;\n\n    if (sprite->data[4]++ > 15)\n    {\n        sprite->data[0] = 16;\n        sprite->data[1] = 0;\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 0));\n        sprite->callback = AnimMeanLookEye_Step4;\n    }\n}\n\nstatic void AnimMeanLookEye_Step4(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0]));\n    if (sprite->data[1]++ > 1)\n    {\n        sprite->data[0]--;\n        sprite->data[1] = 0;\n    }\n\n    if (sprite->data[0] == 0)\n        sprite->invisible = TRUE;\n\n    if (sprite->data[0] < 0)\n    {\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        DestroyAnimSprite(sprite);\n    }\n}\n\nvoid AnimTask_SetPsychicBackground(u8 taskId)\n{\n    gTasks[taskId].func = SetPsychicBackground_Step;\n    gAnimVisualTaskCount--;\n}\n\nstatic void SetPsychicBackground_Step(u8 taskId)\n{\n    int i;\n    u16 lastColor;\n    u8 paletteIndex = GetBattleBgPaletteNum();\n\n    if (++gTasks[taskId].data[5] == 4)\n    {\n        lastColor = gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + 11];\n        for (i = 10; i > 0; i--)\n            gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + i + 1] = gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + i];\n\n        gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + 1] = lastColor;\n        gTasks[taskId].data[5] = 0;\n    }\n\n    if ((u16)gBattleAnimArgs[7] == 0xFFFF)\n        DestroyTask(taskId);\n}\n\nvoid AnimTask_FadeScreenToWhite(u8 taskId)\n{\n    gTasks[taskId].func = FadeScreenToWhite_Step;\n    gAnimVisualTaskCount--;\n}\n\nstatic void FadeScreenToWhite_Step(u8 taskId)\n{\n    int i;\n    u16 lastColor;\n    u8 paletteIndex = GetBattleBgPaletteNum();\n\n    if (++gTasks[taskId].data[5] == 4)\n    {\n        lastColor = gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + 11];\n        for (i = 10; i > 0; i--)\n            gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + i + 1] = gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + i];\n        gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + 1] = lastColor;\n\n        lastColor = gPlttBufferUnfaded[BG_PLTT_ID(paletteIndex) + 11];\n        for (i = 10; i > 0; i--)\n            gPlttBufferUnfaded[BG_PLTT_ID(paletteIndex) + i + 1] = gPlttBufferUnfaded[BG_PLTT_ID(paletteIndex) + i];\n        gPlttBufferUnfaded[BG_PLTT_ID(paletteIndex) + 1] = lastColor;\n\n        gTasks[taskId].data[5] = 0;\n    }\n\n    if ((u16)gBattleAnimArgs[7] == 0xFFFF)\n        DestroyTask(taskId);\n}\n\nstatic void AnimSpikes(struct Sprite *sprite)\n{\n    u16 x;\n    u16 y;\n\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &x, &y);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = x + gBattleAnimArgs[2];\n    sprite->data[4] = y + gBattleAnimArgs[3];\n    sprite->data[5] = -50;\n    InitAnimArcTranslation(sprite);\n    sprite->callback = AnimSpikes_Step1;\n}\n\nstatic void AnimSpikes_Step1(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n    {\n        sprite->data[0] = 30;\n        sprite->data[1] = 0;\n        sprite->callback = WaitAnimForDuration;\n        StoreSpriteCallbackInData6(sprite, AnimSpikes_Step2);\n    }\n}\n\nstatic void AnimSpikes_Step2(struct Sprite *sprite)\n{\n    if (sprite->data[1] & 1)\n        sprite->invisible ^= 1;\n\n    if (++sprite->data[1] == 16)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimLeer(struct Sprite *sprite)\n{\n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);\n    sprite->y += gBattleAnimArgs[1];\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nstatic void AnimLetterZ(struct Sprite *sprite)\n{\n    int var0;\n    \n    if (sprite->data[0] == 0)\n    {\n        SetSpriteCoordsToAnimAttackerCoords(sprite);\n        SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);\n        if (!IsContest())\n        {\n            if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n            {\n                sprite->data[1] = gBattleAnimArgs[2];\n                sprite->data[2] = gBattleAnimArgs[3];\n            }\n            else\n            {\n                sprite->data[1] = -1 * gBattleAnimArgs[2];\n                sprite->data[2] = -1 * gBattleAnimArgs[3];\n            }\n        }\n        else\n        {\n            sprite->data[1] = -1 * gBattleAnimArgs[2];\n            sprite->data[2] = gBattleAnimArgs[3];\n        }\n    }\n\n    sprite->data[0]++;\n    var0 = (sprite->data[0] * 20) & 0xFF;\n    sprite->data[3] += sprite->data[1];\n    sprite->data[4] += sprite->data[2];\n    sprite->x2 = sprite->data[3] / 2;\n    sprite->y2 = Sin(var0 & 0xFF, 5) + (sprite->data[4] / 2);\n    if ((u16)(sprite->x + sprite->x2) > 240)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimFang(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n        DestroyAnimSprite(sprite);\n}\n\nvoid AnimTask_IsTargetPlayerSide(u8 taskId)\n{\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)\n        gBattleAnimArgs[ARG_RET_ID] = FALSE;\n    else\n        gBattleAnimArgs[ARG_RET_ID] = TRUE;\n\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_IsHealingMove(u8 taskId)\n{\n    if (gAnimMoveDmg > 0)\n        gBattleAnimArgs[ARG_RET_ID] = FALSE;\n    else\n        gBattleAnimArgs[ARG_RET_ID] = TRUE;\n\n    DestroyAnimVisualTask(taskId);\n}\n\nstatic void AnimSpotlight(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);\n    gBattle_WIN0H = 0;\n    gBattle_WIN0V = 0;\n    SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H);\n    SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V);\n    InitSpritePosToAnimTarget(sprite, FALSE);\n    sprite->oam.objMode = ST_OAM_OBJ_WINDOW;\n    sprite->invisible = TRUE;\n    sprite->callback = AnimSpotlight_Step1;\n}\n\nstatic void AnimSpotlight_Step1(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->invisible = FALSE;\n        if (sprite->affineAnimEnded)\n            sprite->data[0]++;\n        break;\n    case 1:\n    case 3:\n        sprite->data[1] += 117;\n        sprite->x2 = sprite->data[1] >> 8;\n        if (++sprite->data[2] == 21)\n        {\n            sprite->data[2] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 2:\n        sprite->data[1] -= 117;\n        sprite->x2 = sprite->data[1] >> 8;\n        if (++sprite->data[2] == 41)\n        {\n            sprite->data[2] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 4:\n        ChangeSpriteAffineAnim(sprite, 1);\n        sprite->data[0]++;\n        break;\n    case 5:\n        if (sprite->affineAnimEnded)\n        {\n            sprite->invisible = TRUE;\n            sprite->callback = AnimSpotlight_Step2;\n        }\n        break;\n    }\n}\n\nstatic void AnimSpotlight_Step2(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);\n    SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);\n    DestroyAnimSprite(sprite);\n}\n\nstatic void AnimClappingHand(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[3] == 0)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n    }\n\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->oam.tileNum += 16;\n    if (gBattleAnimArgs[2] == 0)\n    {\n        sprite->oam.matrixNum = ST_OAM_HFLIP;\n        sprite->x2 = -12;\n        sprite->data[1] = 2;\n    }\n    else\n    {\n        sprite->x2 = 12;\n        sprite->data[1] = -2;\n    }\n\n    sprite->data[0] = gBattleAnimArgs[4];\n    if (sprite->data[3] != 255)\n        sprite->data[3] = gBattleAnimArgs[2];\n\n    sprite->callback = AnimClappingHand_Step;\n}\n\nstatic void AnimClappingHand_Step(struct Sprite *sprite)\n{\n    if (sprite->data[2] == 0)\n    {\n        sprite->x2 += sprite->data[1];\n        if (sprite->x2 == 0)\n        {\n            sprite->data[2]++;\n            if (sprite->data[3] == 0)\n            {\n                PlaySE1WithPanning(SE_M_ENCORE, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));\n            }\n        }\n    }\n    else\n    {\n        sprite->x2 -= sprite->data[1];\n        if (abs(sprite->x2) == 12)\n        {\n            sprite->data[0]--;\n            sprite->data[2]--;\n        }\n\n    }\n\n    if (sprite->data[0] == 0)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimClappingHand2(struct Sprite *sprite)\n{\n    sprite->oam.objMode = ST_OAM_OBJ_WINDOW;\n    sprite->data[3] = 255;\n    AnimClappingHand(sprite);\n}\n\nvoid AnimTask_CreateSpotlight(u8 taskId)\n{\n    if (IsContest())\n    {\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_OBJ | WININ_WIN1_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ | WININ_WIN0_BG_ALL);\n        gBattle_WIN1H = WIN_RANGE(152, DISPLAY_WIDTH);\n        gBattle_WIN1V = WIN_RANGE(0, DISPLAY_HEIGHT);\n        SetGpuReg(REG_OFFSET_WIN1H, gBattle_WIN0H);\n        SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN0V);\n    }\n    else\n    {\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ);\n        gBattle_WIN1H = WIN_RANGE(0, DISPLAY_WIDTH);\n        gBattle_WIN1V = WIN_RANGE(120, DISPLAY_HEIGHT);\n        SetGpuReg(REG_OFFSET_WIN1H, gBattle_WIN1H);\n        SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN1V);\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);\n    }\n\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_RemoveSpotlight(u8 taskId)\n{\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n    gBattle_WIN1H = 0;\n    gBattle_WIN1V = 0;\n    if (!IsContest())\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);\n\n    DestroyAnimVisualTask(taskId);\n}\n\nstatic void AnimRapidSpin(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[0] == 0)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[1];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[1];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);\n    }\n\n    sprite->y2 = gBattleAnimArgs[2];\n    sprite->data[0] = (sprite->y2 > gBattleAnimArgs[3]);\n    sprite->data[1] = 0;\n    sprite->data[2] = gBattleAnimArgs[4];\n    sprite->data[3] = gBattleAnimArgs[5];\n    sprite->data[4] = gBattleAnimArgs[3];\n    sprite->callback = AnimRapidSpin_Step;\n}\n\nstatic void AnimRapidSpin_Step(struct Sprite *sprite)\n{\n    sprite->data[1] = (sprite->data[1] + sprite->data[2]) & 0xFF;\n    sprite->x2 = gSineTable[sprite->data[1]] >> 4;\n    sprite->y2 += sprite->data[3];\n    if (sprite->data[0])\n    {\n        if (sprite->y2 < sprite->data[4])\n            DestroyAnimSprite(sprite);\n    }\n    else\n    {\n        if (sprite->y2 > sprite->data[4])\n            DestroyAnimSprite(sprite);\n    }\n}\n\nvoid AnimTask_RapinSpinMonElevation(u8 taskId)\n{\n    s16 var0;\n    u8 toBG2;\n    s16 var2;\n    int var3;\n    int var4;\n    s32 i;\n    struct ScanlineEffectParams scanlineParams;\n    struct Task *task = &gTasks[taskId];\n\n    if (!gBattleAnimArgs[0])\n    {\n        var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);\n        toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);\n    }\n    else\n    {\n        var0 = GetBattlerYCoordWithElevation(gBattleAnimTarget);\n        toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);\n    }\n\n    task->data[0] = var0 + 36;\n    task->data[1] = task->data[0];\n    task->data[2] = var0 - 33;\n    if (task->data[2] < 0)\n        task->data[2] = 0;\n\n    task->data[3] = task->data[0];\n    task->data[4] = 8;\n    task->data[5] = gBattleAnimArgs[1];\n    task->data[6] = 0;\n    task->data[7] = 0;\n    if (toBG2 == 1)\n    {\n        var3 = gBattle_BG1_X;\n        task->data[8] = var3;\n        var4 = var3 + DISPLAY_WIDTH;\n    }\n    else\n    {\n        var3 = gBattle_BG2_X;\n        task->data[8] = var3;\n        var4 = var3 + DISPLAY_WIDTH;\n    }\n\n    task->data[9] = var4;\n    task->data[10] = gBattleAnimArgs[2];\n    if (!gBattleAnimArgs[2])\n    {\n        task->data[11] = var4;\n        var2 = task->data[8];\n    }\n    else\n    {\n        task->data[11] = var3;\n        var2 = task->data[9];\n    }\n\n    task->data[15] = 0;\n    i = task->data[2];\n    while (i <= task->data[3])\n    {\n        gScanlineEffectRegBuffers[0][i] = var2;\n        gScanlineEffectRegBuffers[1][i] = var2;\n        i++;\n    }\n\n    if (toBG2 == 1)\n        scanlineParams.dmaDest = &REG_BG1HOFS;\n    else\n        scanlineParams.dmaDest = &REG_BG2HOFS;\n\n    scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;\n    scanlineParams.initState = 1;\n    scanlineParams.unused9 = 0;\n    ScanlineEffect_SetParams(scanlineParams);\n\n    task->func = RapinSpinMonElevation_Step;\n}\n\nstatic void RapinSpinMonElevation_Step(u8 taskId)\n{\n    s32 i;\n    struct Task *task = &gTasks[taskId];\n\n    task->data[0] -= task->data[5];\n    if (task->data[0] < task->data[2])\n        task->data[0] = task->data[2];\n\n    if (task->data[4] == 0)\n    {\n        task->data[1] -= task->data[5];\n        if (task->data[1] < task->data[2])\n        {\n            task->data[1] = task->data[2];\n            task->data[15] = 1;\n        }\n    }\n    else\n    {\n        task->data[4]--;\n    }\n\n    if (++task->data[6] > 1)\n    {\n        task->data[6] = 0;\n        task->data[7] = task->data[7] == 0 ? 1 : 0;\n\n        if (task->data[7])\n            task->data[12] = task->data[8];\n        else\n            task->data[12] = task->data[9];\n    }\n\n    i = task->data[0];\n    while (i < task->data[1])\n    {\n        gScanlineEffectRegBuffers[0][i] = task->data[12];\n        gScanlineEffectRegBuffers[1][i] = task->data[12];\n        i++;\n    }\n\n    i = task->data[1];\n    while (i <= task->data[3])\n    {\n        gScanlineEffectRegBuffers[0][i] = task->data[11];\n        gScanlineEffectRegBuffers[1][i] = task->data[11];\n        i++;\n    }\n\n    if (task->data[15])\n    {\n        if (task->data[10])\n            gScanlineEffect.state = 3;\n\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nvoid AnimTask_TormentAttacker(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->data[0] = 0;\n    task->data[1] = 0;\n    task->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    task->data[4] = 32;\n    task->data[5] = -20;\n    task->data[6] = 0;\n    task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    task->func = TormentAttacker_Step;\n}\n\nstatic void TormentAttacker_Step(u8 taskId)\n{\n    int var0, var1;\n    s16 x, y;\n    u16 i, j;\n    u8 spriteId;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        var0 = task->data[2];\n        if (task->data[1] & 1)\n        {\n            var1 = task->data[4];\n            x = var0 - var1;\n        }\n        else\n        {\n            var1 = task->data[4];\n            x = var0 + var1;\n        }\n\n        y = task->data[3] + task->data[5];\n        spriteId = CreateSprite(&gThoughtBubbleSpriteTemplate, x, y, 6 - task->data[1]);\n        PlaySE12WithPanning(SE_M_METRONOME, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));\n\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].hFlip = task->data[1] & 1;\n            gSprites[spriteId].callback = SpriteCallbackDummy;\n        }\n\n        if (task->data[1] & 1)\n        {\n            task->data[4] -= 6;\n            task->data[5] -= 6;\n        }\n\n        PrepareAffineAnimInTaskData(task, task->data[15], sAffineAnims_Torment);\n        task->data[1]++;\n        task->data[0] = 1;\n        break;\n    case 1:\n        if (!RunAffineAnimFromTaskData(task))\n        {\n            if (task->data[1] == 6)\n            {\n                task->data[6] = 8;\n                task->data[0] = 3;\n            }\n            else\n            {\n                if (task->data[1] <= 2)\n                    task->data[6] = 10;\n                else\n                    task->data[6] = 0;\n\n                task->data[0] = 2;\n            }\n        }\n        break;\n    case 2:\n        if (task->data[6] != 0)\n            task->data[6]--;\n        else\n            task->data[0] = 0;\n        break;\n    case 3:\n        if (task->data[6] != 0)\n            task->data[6]--;\n        else\n            task->data[0] = 4;\n        break;\n    case 4:\n        for (i = 0, j = 0; i < MAX_SPRITES; i++)\n        {\n            if (gSprites[i].template == &gThoughtBubbleSpriteTemplate)\n            {\n                gSprites[i].data[0] = taskId;\n                gSprites[i].data[1] = 6;\n                StartSpriteAnim(&gSprites[i], 2);\n                gSprites[i].callback = TormentAttacker_Callback;\n                if (++j == 6)\n                    break;\n            }\n        }\n\n        task->data[6] = j;\n        task->data[0] = 5;\n        break;\n    case 5:\n        if (task->data[6] == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void TormentAttacker_Callback(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n    {\n        gTasks[sprite->data[0]].data[sprite->data[1]]--;\n        DestroySprite(sprite);\n    }\n}\n\nstatic void AnimTriAttackTriangle(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n        InitSpritePosToAnimAttacker(sprite, FALSE);\n\n    if (++sprite->data[0] < 40)\n    {\n        u16 var = sprite->data[0];\n        if ((var & 1) == 0)\n            sprite->invisible = TRUE;\n        else\n            sprite->invisible = FALSE;\n    }\n\n    if (sprite->data[0] > 30)\n        sprite->invisible = FALSE;\n\n    if (sprite->data[0] == 61)\n    {\n        StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->x2 = 0;\n        sprite->y2 = 0;\n        sprite->data[0] = 20;\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n        sprite->callback = StartAnimLinearTranslation;\n    }\n}\n\nvoid AnimTask_DefenseCurlDeformMon(u8 taskId)\n{\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), DefenseCurlDeformMonAffineAnimCmds);\n        gTasks[taskId].data[0]++;\n        break;\n    case 1:\n        if (!RunAffineAnimFromTaskData(&gTasks[taskId]))\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void AnimBatonPassPokeball(struct Sprite *sprite)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n        PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL);\n        sprite->data[1] = 256;\n        sprite->data[2] = 256;\n        sprite->data[0]++;\n        break;\n    case 1:\n        sprite->data[1] += 96;\n        sprite->data[2] -= 26;\n        SetSpriteRotScale(spriteId, sprite->data[1], sprite->data[2], 0);\n\n        if (++sprite->data[3] == 5)\n            sprite->data[0]++;\n        // fall through\n    case 2:\n        sprite->data[1] += 96;\n        sprite->data[2] += 48;\n        SetSpriteRotScale(spriteId, sprite->data[1], sprite->data[2], 0);\n\n        if (++sprite->data[3] == 9)\n        {\n            sprite->data[3] = 0;\n            gSprites[spriteId].invisible = TRUE;\n            ResetSpriteRotScale(spriteId);\n            sprite->data[0]++;\n        }\n        break;\n    case 3:\n        sprite->y2 -= 6;\n        if (sprite->y + sprite->y2 < -32)\n            DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\nstatic void AnimWishStar(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->x = -16;\n    else\n        sprite->x = DISPLAY_WIDTH + 16;\n\n    sprite->y = 0;\n    sprite->callback = AnimWishStar_Step;\n}\n\nstatic void AnimWishStar_Step(struct Sprite *sprite)\n{\n    u32 newX;\n\n    sprite->data[0] += 72;\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->x2 = sprite->data[0] >> 4;\n    else\n        sprite->x2 = -(sprite->data[0] >> 4);\n\n    sprite->data[1] += 16;\n    sprite->y2 += sprite->data[1] >> 8;\n\n    if (++sprite->data[2] % 3 == 0)\n    {\n        CreateSpriteAndAnimate(\n            &gMiniTwinklingStarSpriteTemplate,\n            sprite->x + sprite->x2,\n            sprite->y + sprite->y2,\n            sprite->subpriority + 1);\n    }\n\n    newX = sprite->x + sprite->x2 + 32;\n    if (newX > DISPLAY_WIDTH + 64)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimMiniTwinklingStar(struct Sprite *sprite)\n{\n    u8 rand;\n    s8 y;\n\n    rand = Random() & 3;\n    if (rand == 0)\n        sprite->oam.tileNum += 4;\n    else\n        sprite->oam.tileNum += 5;\n\n    y = Random() & 7;\n    if (y > 3)\n        y = -y;\n\n    sprite->y2 = y;\n    sprite->callback = AnimMiniTwinklingStar_Step;\n}\n\nstatic void AnimMiniTwinklingStar_Step(struct Sprite *sprite)\n{\n    if (++sprite->data[0] < 30)\n    {\n        if (++sprite->data[1] == 2)\n        {\n            sprite->invisible ^= 1;\n            sprite->data[1] = 0;\n        }\n    }\n    else\n    {\n        if (sprite->data[1] == 2)\n            sprite->invisible = FALSE;\n\n        if (sprite->data[1] == 3)\n        {\n            sprite->invisible = TRUE;\n            sprite->data[1] = -1;\n        }\n\n        sprite->data[1]++;\n    }\n\n    if (sprite->data[0] > 60)\n        DestroySprite(sprite);\n}\n\nvoid AnimTask_StockpileDeformMon(u8 taskId)\n{\n    if (!gTasks[taskId].data[0])\n    {\n        PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sStockpileDeformMonAffineAnimCmds);\n        gTasks[taskId].data[0]++;\n    }\n    else\n    {\n        if (!RunAffineAnimFromTaskData(&gTasks[taskId]))\n            DestroyAnimVisualTask(taskId);\n    }\n}\n\nvoid AnimTask_SpitUpDeformMon(u8 taskId)\n{\n    if (!gTasks[taskId].data[0])\n    {\n        PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sSpitUpDeformMonAffineAnimCmds);\n        gTasks[taskId].data[0]++;\n    }\n    else\n    {\n        if (!RunAffineAnimFromTaskData(&gTasks[taskId]))\n            DestroyAnimVisualTask(taskId);\n    }\n}\n\nstatic void AnimSwallowBlueOrb(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        InitSpritePosToAnimAttacker(sprite, FALSE);\n        sprite->data[1] = 0x900;\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n        sprite->data[0]++;\n        break;\n    case 1:\n        sprite->y2 -= sprite->data[1] >> 8;\n        sprite->data[1] -= 96;\n        if (sprite->y + sprite->y2 > sprite->data[2])\n            DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\nvoid AnimTask_SwallowDeformMon(u8 taskId)\n{\n    if (!gTasks[taskId].data[0])\n    {\n        PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sSwallowDeformMonAffineAnimCmds);\n        gTasks[taskId].data[0]++;\n    }\n    else\n    {\n        if (!RunAffineAnimFromTaskData(&gTasks[taskId]))\n            DestroyAnimVisualTask(taskId);\n    }\n}\n\nvoid AnimTask_TransformMon(u8 taskId)\n{\n    int i, j;\n    u8 position;\n    struct BattleAnimBgData animBg;\n    u8 *dest;\n    u8 *src;\n    u16 *bgTilemap;\n    u16 stretch;\n\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        SetGpuReg(REG_OFFSET_MOSAIC, 0);\n        if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)\n            SetAnimBgAttribute(1, BG_ANIM_MOSAIC, 1);\n        else\n            SetAnimBgAttribute(2, BG_ANIM_MOSAIC, 1);\n\n        gTasks[taskId].data[10] = gBattleAnimArgs[0];\n        gTasks[taskId].data[0]++;\n        break;\n    case 1:\n        if (gTasks[taskId].data[2]++ > 1)\n        {\n            gTasks[taskId].data[2] = 0;\n            gTasks[taskId].data[1]++;\n            stretch = gTasks[taskId].data[1];\n            SetGpuReg(REG_OFFSET_MOSAIC, (stretch << 4) | stretch);\n            if (stretch == 15)\n                gTasks[taskId].data[0]++;\n        }\n        break;\n    case 2:\n        HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10]);\n        GetBattleAnimBgDataByPriorityRank(&animBg, gBattleAnimAttacker);\n        if (IsContest())\n            position = 0;\n        else\n            position = GetBattlerPosition(gBattleAnimAttacker);\n\n        src = gMonSpritesGfxPtr->sprites[position] + (gBattleMonForms[gBattleAnimAttacker] << 11);\n        dest = animBg.bgTiles;\n        CpuCopy32(src, dest, MON_PIC_SIZE);\n        LoadBgTiles(1, animBg.bgTiles, 0x800, animBg.tilesOffset);\n        gTasks[taskId].data[0]++;\n        break;\n    case 3:\n        if (gTasks[taskId].data[2]++ > 1)\n        {\n            gTasks[taskId].data[2] = 0;\n            gTasks[taskId].data[1]--;\n            stretch = gTasks[taskId].data[1];\n            SetGpuReg(REG_OFFSET_MOSAIC, (stretch << 4) | stretch);\n\n            if (stretch == 0)\n                gTasks[taskId].data[0]++;\n        }\n        break;\n    case 4:\n        SetGpuReg(REG_OFFSET_MOSAIC, 0);\n        if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)\n            SetAnimBgAttribute(1, BG_ANIM_MOSAIC, 0);\n        else\n            SetAnimBgAttribute(2, BG_ANIM_MOSAIC, 0);\n\n        if (!IsContest())\n        {\n            if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)\n            {\n                if (gTasks[taskId].data[10] == 0)\n                    SetBattlerShadowSpriteCallback(gBattleAnimAttacker, gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies);\n            }\n        }\n\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nvoid AnimTask_IsMonInvisible(u8 taskId)\n{\n    gBattleAnimArgs[ARG_RET_ID] = gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_CastformGfxChange(u8 taskId)\n{\n    HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, TRUE);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_MorningSunLightBeam(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n        SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n        if (!IsContest())\n            SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);\n\n        GetBattleAnimBg1Data(&animBg);\n        AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnim_MorningSunTilemap);\n        AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnim_MorningSunGfx, animBg.tilesOffset);\n        LoadCompressedPalette(gBattleAnim_MorningSunPal, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n        if (IsContest())\n        {\n            RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0);\n            gBattle_BG1_X = -56;\n            gBattle_BG1_Y = 0;\n        }\n        else\n        {\n            if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n                gBattle_BG1_X = -135;\n            else\n                gBattle_BG1_X = -10;\n            \n            gBattle_BG1_Y = 0;\n        }\n\n        gTasks[taskId].data[10] = gBattle_BG1_X;\n        gTasks[taskId].data[11] = gBattle_BG1_Y;\n\n        gTasks[taskId].data[0]++;\n        PlaySE12WithPanning(SE_M_MORNING_SUN, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));\n        break;\n    case 1:\n        if (gTasks[taskId].data[4]++ > 0)\n        {\n            gTasks[taskId].data[4] = 0;\n            if (++gTasks[taskId].data[1] > 12)\n                gTasks[taskId].data[1] = 12;\n\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));\n            if (gTasks[taskId].data[1] == 12)\n                gTasks[taskId].data[0]++;\n        }\n        break;\n    case 2:\n        if (--gTasks[taskId].data[1] < 0)\n            gTasks[taskId].data[1] = 0;\n\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));\n        if (!gTasks[taskId].data[1])\n        {\n            gBattle_BG1_X = sMorningSunLightBeamCoordsTable[gTasks[taskId].data[2]] + gTasks[taskId].data[10];\n            if (++gTasks[taskId].data[2] == 4)\n                gTasks[taskId].data[0] = 4;\n            else\n                gTasks[taskId].data[0] = 3;\n        }\n        break;\n    case 3:\n        if (++gTasks[taskId].data[3] == 4)\n        {\n            gTasks[taskId].data[3] = 0;\n            gTasks[taskId].data[0] = 1;\n            PlaySE12WithPanning(SE_M_MORNING_SUN, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));\n        }\n        break;\n    case 4:\n        GetBattleAnimBg1Data(&animBg);\n        InitBattleAnimBg(animBg.bgId);\n        if (!IsContest())\n            SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);\n\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n        gBattle_BG1_X = 0;\n        gBattle_BG1_Y = 0;\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void AnimGreenStar(struct Sprite *sprite)\n{\n    s16 xOffset;\n    u8 spriteId1;\n    u8 spriteId2;\n\n    xOffset = Random();\n    xOffset &= 0x3F;\n    if (xOffset > 31)\n        xOffset = 32 - xOffset;\n\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + xOffset;\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 32;\n    sprite->data[1] = gBattleAnimArgs[0];\n    sprite->data[2] = gBattleAnimArgs[1];\n\n    spriteId1 = CreateSprite(&gGreenStarSpriteTemplate, sprite->x, sprite->y, sprite->subpriority + 1);\n    spriteId2 = CreateSprite(&gGreenStarSpriteTemplate, sprite->x, sprite->y, sprite->subpriority + 1);\n    StartSpriteAnim(&gSprites[spriteId1], 1);\n    StartSpriteAnim(&gSprites[spriteId2], 2);\n\n    gSprites[spriteId1].data[1] = gBattleAnimArgs[0];\n    gSprites[spriteId1].data[2] = gBattleAnimArgs[1];\n    gSprites[spriteId2].data[1] = gBattleAnimArgs[0];\n    gSprites[spriteId2].data[2] = gBattleAnimArgs[1];\n    gSprites[spriteId1].data[7] = -1;\n    gSprites[spriteId2].data[7] = -1;\n    gSprites[spriteId1].invisible = TRUE;\n    gSprites[spriteId2].invisible = TRUE;\n    gSprites[spriteId1].callback = AnimGreenStar_Callback;\n    gSprites[spriteId2].callback = AnimGreenStar_Callback;\n\n    sprite->data[6] = spriteId1;\n    sprite->data[7] = spriteId2;\n    sprite->callback = AnimGreenStar_Step1;\n}\n\nstatic void AnimGreenStar_Step1(struct Sprite *sprite)\n{\n    s16 delta = sprite->data[3] + sprite->data[2];\n    \n    sprite->y2 -= delta >> 8;\n    sprite->data[3] += sprite->data[2];\n    sprite->data[3] &= 0xFF;\n    if (sprite->data[4] == 0 && sprite->y2 < -8)\n    {\n        gSprites[sprite->data[6]].invisible = FALSE;\n        sprite->data[4]++;\n    }\n\n    if (sprite->data[4] == 1 && sprite->y2 < -16)\n    {\n        gSprites[sprite->data[7]].invisible = FALSE;\n        sprite->data[4]++;\n    }\n\n    if (--sprite->data[1] == -1)\n    {\n        sprite->invisible = TRUE;\n        sprite->callback = AnimGreenStar_Step2;\n    }\n}\n\nstatic void AnimGreenStar_Step2(struct Sprite *sprite)\n{\n    if (gSprites[sprite->data[6]].callback == SpriteCallbackDummy\n     && gSprites[sprite->data[7]].callback == SpriteCallbackDummy)\n    {\n        DestroySprite(&gSprites[sprite->data[6]]);\n        DestroySprite(&gSprites[sprite->data[7]]);\n        DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimGreenStar_Callback(struct Sprite *sprite)\n{\n    if (!sprite->invisible)\n    {\n        s16 delta = sprite->data[3] + sprite->data[2];\n        sprite->y2 -= delta >> 8;\n        sprite->data[3] += sprite->data[2];\n        sprite->data[3] &= 0xFF;\n        if (--sprite->data[1] == -1)\n        {\n            sprite->invisible = TRUE;\n            sprite->callback = SpriteCallbackDummy;\n        }\n    }\n}\n\nvoid AnimTask_DoomDesireLightBeam(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(3, 13));\n        SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n        if (!IsContest())\n            SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);\n        \n        GetBattleAnimBg1Data(&animBg);\n        AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnim_MorningSunTilemap);\n        AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnim_MorningSunGfx, animBg.tilesOffset);\n        LoadCompressedPalette(gBattleAnim_MorningSunPal, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n                \n        if (IsContest())\n        {\n            RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0);\n            gBattle_BG1_X = -56;\n            gBattle_BG1_Y = 0;\n        }\n        else\n        {\n            u8 position = GetBattlerPosition(gBattleAnimTarget);\n            if (IsDoubleBattle() == TRUE)\n            {\n                if (position == B_POSITION_OPPONENT_LEFT)\n                    gBattle_BG1_X = -155;\n                if (position == B_POSITION_OPPONENT_RIGHT)\n                    gBattle_BG1_X = -115;\n                if (position == B_POSITION_PLAYER_LEFT)\n                    gBattle_BG1_X = 14;\n                if (position == B_POSITION_PLAYER_RIGHT)\n                    gBattle_BG1_X = -20;\n            }\n            else\n            {\n                if (position == B_POSITION_OPPONENT_LEFT)\n                    gBattle_BG1_X = -135;\n                if (position == B_POSITION_PLAYER_LEFT)\n                    gBattle_BG1_X = -10;\n            }\n\n            gBattle_BG1_Y = 0;\n        }\n\n        gTasks[taskId].data[10] = gBattle_BG1_X;\n        gTasks[taskId].data[11] = gBattle_BG1_Y;\n        gTasks[taskId].data[0]++;\n        break;\n    case 1:\n        gTasks[taskId].data[3] = 0;\n        if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)\n            gBattle_BG1_X = gTasks[taskId].data[10] + sDoomDesireLightBeamCoordTable[gTasks[taskId].data[2]];\n        else\n            gBattle_BG1_X = gTasks[taskId].data[10] - sDoomDesireLightBeamCoordTable[gTasks[taskId].data[2]];\n\n        if (++gTasks[taskId].data[2] == 5)\n            gTasks[taskId].data[0] = 5;\n        else\n            gTasks[taskId].data[0]++;\n        break;\n    case 2:\n        if (--gTasks[taskId].data[1] <= 4)\n            gTasks[taskId].data[1] = 5;\n\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(3, gTasks[taskId].data[1]));\n        if (gTasks[taskId].data[1] == 5)\n            gTasks[taskId].data[0]++;\n        break;\n    case 3:\n        if (++gTasks[taskId].data[3] > sDoomDesireLightBeamDelayTable[gTasks[taskId].data[2]])\n            gTasks[taskId].data[0]++;\n        break;\n    case 4:\n        if (++gTasks[taskId].data[1] > 13)\n            gTasks[taskId].data[1] = 13;\n\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(3, gTasks[taskId].data[1]));\n        if (gTasks[taskId].data[1] == 13)\n            gTasks[taskId].data[0] = 1;\n        break;\n    case 5:\n        GetBattleAnimBg1Data(&animBg);\n        InitBattleAnimBg(animBg.bgId);\n        if (!IsContest())\n            SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);\n\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n        gBattle_BG1_X = 0;\n        gBattle_BG1_Y = 0;\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Briefly vertically grows and shrinks the attacking mon's sprite.\n// No args.\nvoid AnimTask_StrongFrustrationGrowAndShrink(u8 taskId)\n{\n    if (gTasks[taskId].data[0] == 0)\n    {\n        PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sStrongFrustrationAffineAnimCmds);\n        gTasks[taskId].data[0]++;\n    }\n    else\n    {\n        if (!RunAffineAnimFromTaskData(&gTasks[taskId]))\n            DestroyAnimVisualTask(taskId);\n    }\n}\n\n// Animates an anger mark near the mon's head.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\nstatic void AnimWeakFrustrationAngerMark(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        InitSpritePosToAnimAttacker(sprite, 0);\n        sprite->data[0]++;\n    }\n    else if (sprite->data[0]++ > 20)\n    {\n        sprite->data[1] += 160;\n        sprite->data[2] += 128;\n\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            sprite->x2 = -(sprite->data[1] >> 8);\n        else\n            sprite->x2 = sprite->data[1] >> 8;\n\n        sprite->y2 += sprite->data[2] >> 8;\n        if (sprite->y2 > 64)\n            DestroyAnimSprite(sprite);\n    }\n}\n\n// Rocks the mon back and forth. This is done on a pivot so it is done via rotation.\n// arg 0: which battler\n// arg 1: number of rocks\n// arg 2: rotation speed increase\nvoid AnimTask_RockMonBackAndForth(u8 taskId)\n{\n    u8 side;\n    struct Task *task = &gTasks[taskId];\n\n    if (!gBattleAnimArgs[1])\n    {\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n\n    if (gBattleAnimArgs[2] < 0)\n        gBattleAnimArgs[2] = 0;\n    if (gBattleAnimArgs[2] > 2)\n        gBattleAnimArgs[2] = 2;\n\n    task->data[0] = 0;\n    task->data[1] = 0;\n    task->data[2] = 0;\n    task->data[3] = 8 - (2 * gBattleAnimArgs[2]);\n    task->data[4] = 0x100 + (gBattleAnimArgs[2] * 128);\n    task->data[5] = gBattleAnimArgs[2] + 2;\n    task->data[6] = gBattleAnimArgs[1] - 1;\n    task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n        side = GetBattlerSide(gBattleAnimAttacker);\n    else\n        side = GetBattlerSide(gBattleAnimTarget);\n\n    if (side == B_SIDE_OPPONENT)\n    {\n        task->data[4] *= -1;\n        task->data[5] *= -1;\n    }\n\n    PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL);\n    task->func = AnimTask_RockMonBackAndForth_Step;\n}\n\nstatic void AnimTask_RockMonBackAndForth_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        gSprites[task->data[15]].x2 += task->data[5];\n        task->data[2] -= task->data[4];\n        SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]);\n        SetBattlerSpriteYOffsetFromRotation(task->data[15]);\n        if (++task->data[1] >= task->data[3])\n        {\n            task->data[1] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 1:\n        gSprites[task->data[15]].x2 -= task->data[5];\n        task->data[2] += task->data[4];\n        SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]);\n        SetBattlerSpriteYOffsetFromRotation(task->data[15]);\n        if (++task->data[1] >= task->data[3] * 2)\n        {\n            task->data[1] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 2:\n        gSprites[task->data[15]].x2 += task->data[5];\n        task->data[2] -= task->data[4];\n        SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]);\n        SetBattlerSpriteYOffsetFromRotation(task->data[15]);\n        if (++task->data[1] >= task->data[3])\n        {\n            if (task->data[6])\n            {\n                task->data[6]--;\n                task->data[1] = 0;\n                task->data[0] = 0;\n            }\n            else\n            {\n                task->data[0]++;\n            }\n        }\n        break;\n    case 3:\n        ResetSpriteRotScale(task->data[15]);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Floats a petal across the screen towards the target mon's side.\n// arg 0: initial y pixel offset\n// arg 1: sprite anim num\n// arg 2: unused\nstatic void AnimSweetScentPetal(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n    {\n        sprite->x = 0;\n        sprite->y = gBattleAnimArgs[0];\n    }\n    else\n    {\n        sprite->x = DISPLAY_WIDTH;\n        sprite->y = gBattleAnimArgs[0] - 30;\n    }\n\n    sprite->data[2] = gBattleAnimArgs[2];\n    StartSpriteAnim(sprite, gBattleAnimArgs[1]);\n    sprite->callback = AnimSweetScentPetal_Step;\n}\n\nstatic void AnimSweetScentPetal_Step(struct Sprite *sprite)\n{\n    sprite->data[0] += 3;\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n    {\n        sprite->x += 5;\n        sprite->y -= 1;\n\n        if (sprite->x > DISPLAY_WIDTH)\n            DestroyAnimSprite(sprite);\n\n        sprite->y2 = Sin(sprite->data[0] & 0xFF, 16);\n    }\n    else\n    {\n        sprite->x -= 5;\n        sprite->y += 1;\n\n        if (sprite->x < 0)\n            DestroyAnimSprite(sprite);\n\n        sprite->y2 = Cos(sprite->data[0] & 0xFF, 16);\n    }\n}\n\n// Moves the mon sprite in a flailing back-and-forth motion.\n// arg 0: which battler\nvoid AnimTask_FlailMovement(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->data[0] = 0;\n    task->data[1] = 0;\n    task->data[2] = 0;\n    task->data[3] = 0;\n    task->data[12] = 0x20;\n    task->data[13] = 0x40;\n    task->data[14] = 0x800;\n    task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n\n    PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL);\n    task->func = AnimTask_FlailMovement_Step;\n}\n\nstatic void AnimTask_FlailMovement_Step(u8 taskId)\n{\n    int temp;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        task->data[2] += 0x200;\n        if (task->data[2] >= task->data[14])\n        {\n            s16 diff = task->data[14] - task->data[2];\n            s16 div = diff / (task->data[14] * 2);\n            s16 mod = diff % (task->data[14] * 2);\n\n            if ((div & 1) == 0)\n            {\n                task->data[2] = task->data[14] - mod;\n                task->data[0] = 1;\n            }\n            else\n            {\n                task->data[2] = mod - task->data[14];\n            }\n        }\n        break;\n    case 1:\n        task->data[2] -= 0x200;\n        if (task->data[2] <= -task->data[14])\n        {\n            s16 diff = task->data[14] - task->data[2];\n            s16 div = diff / (task->data[14] * 2);\n            s16 mod = diff % (task->data[14] * 2);\n\n            if ((1 & div) == 0)\n            {\n                task->data[2] = mod - task->data[14];\n                task->data[0] = 0;\n            }\n            else\n            {\n                task->data[2] = task->data[14] - mod;\n            }\n        }\n        break;\n    case 2:\n        ResetSpriteRotScale(task->data[15]);\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n\n    SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]);\n    SetBattlerSpriteYOffsetFromRotation(task->data[15]);\n    gSprites[task->data[15]].x2 = -(((temp = task->data[2]) >= 0 ? task->data[2] : temp + 63) >> 6);\n    if (++task->data[1] > 8)\n    {\n        if (task->data[12])\n        {\n            task->data[12]--;\n            task->data[14] -= task->data[13];\n            if (task->data[14] < 16)\n                task->data[14] = 16;\n        }\n        else\n        {\n            task->data[0] = 2;\n        }\n    }\n}\n\n// Makes a spark-like projectile fall on top of the mon.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: which battler\nstatic void AnimPainSplitProjectile(struct Sprite *sprite)\n{\n    if (!sprite->data[0])\n    {\n        if (gBattleAnimArgs[2] == ANIM_ATTACKER)\n        {\n            sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n            sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n        }\n\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n        sprite->data[1] = 0x80;\n        sprite->data[2] = 0x300;\n        sprite->data[3] = gBattleAnimArgs[1];\n        sprite->data[0]++;\n    }\n    else\n    {\n        sprite->x2 = sprite->data[1] >> 8;\n        sprite->y2 += sprite->data[2] >> 8;\n        if (sprite->data[4] == 0 && sprite->y2 > -sprite->data[3])\n        {\n            sprite->data[4] = 1;\n            sprite->data[2] = (-sprite->data[2] / 3) * 2;\n        }\n\n        sprite->data[1] += 192;\n        sprite->data[2] += 128;\n        if (sprite->animEnded)\n            DestroyAnimSprite(sprite);\n    }\n}\n\n// Performs one of several affine transformations on the mon sprite.\n// arg 0: which battler\n// arg 1: which transformation\nvoid AnimTask_PainSplitMovement(u8 taskId)\n{\n    u8 spriteId;\n\n    if (gTasks[taskId].data[0] == 0)\n    {\n        if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n            gTasks[taskId].data[11] = gBattleAnimAttacker;\n        else\n            gTasks[taskId].data[11] = gBattleAnimTarget;\n\n        spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n        gTasks[taskId].data[10] = spriteId;\n        PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL);\n\n        switch (gBattleAnimArgs[1])\n        {\n        case 0:\n            SetSpriteRotScale(spriteId, 0xE0, 0x140, 0);\n            SetBattlerSpriteYOffsetFromYScale(spriteId);\n            break;\n        case 1:\n            SetSpriteRotScale(spriteId, 0xD0, 0x130, 0xF00);\n            SetBattlerSpriteYOffsetFromYScale(spriteId);\n            if (IsContest() || GetBattlerSide(gTasks[taskId].data[11]) == B_SIDE_PLAYER)\n                gSprites[spriteId].y2 += 16;\n            break;\n        case 2:\n            SetSpriteRotScale(spriteId, 0xD0, 0x130, 0xF100);\n            SetBattlerSpriteYOffsetFromYScale(spriteId);\n            if (IsContest() || GetBattlerSide(gTasks[taskId].data[11]) == B_SIDE_PLAYER)\n                gSprites[spriteId].y2 += 16;\n            break;\n        }\n\n        gSprites[spriteId].x2 = 2;\n        gTasks[taskId].data[0]++;\n    }\n    else\n    {\n        spriteId = gTasks[taskId].data[10];\n        if (++gTasks[taskId].data[2] == 3)\n        {\n            gTasks[taskId].data[2] = 0;\n            gSprites[spriteId].x2 = -gSprites[spriteId].x2;\n        }\n\n        if (++gTasks[taskId].data[1] == 13)\n        {\n            ResetSpriteRotScale(spriteId);\n            gSprites[spriteId].x2 = 0;\n            gSprites[spriteId].y2 = 0;\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n}\n\n// Move a piece of confetti in a slightly-random speed across the screen.\n// arg 0: which battler the confetti starts from\nstatic void AnimFlatterConfetti(struct Sprite *sprite)\n{\n    u8 tileOffset;\n    int rand1;\n    int rand2;\n\n    tileOffset = Random() % 12;\n    sprite->oam.tileNum += tileOffset;\n    rand1 = Random() & 0x1FF;\n    rand2 = Random() & 0xFF;\n\n    if (rand1 & 1)\n        sprite->data[0] = 0x5E0 + rand1;\n    else\n        sprite->data[0] = 0x5E0 - rand1;\n\n    if (rand2 & 1)\n        sprite->data[1] = 0x480 + rand2;\n    else\n        sprite->data[1] = 0x480 - rand2;\n\n    sprite->data[2] = gBattleAnimArgs[0];\n    if (sprite->data[2] == ANIM_ATTACKER)\n        sprite->x = -8;\n    else\n        sprite->x = 248;\n\n    sprite->y = 104;\n    sprite->callback = AnimFlatterConfetti_Step;\n}\n\nstatic void AnimFlatterConfetti_Step(struct Sprite *sprite)\n{\n    if (sprite->data[2] == 0)\n    {\n        sprite->x2 += sprite->data[0] >> 8;\n        sprite->y2 -= sprite->data[1] >> 8;\n    }\n    else\n    {\n        sprite->x2 -= sprite->data[0] >> 8;\n        sprite->y2 -= sprite->data[1] >> 8;\n    }\n\n    sprite->data[0] -= 22;\n    sprite->data[1] -= 48;\n    if (sprite->data[0] < 0)\n        sprite->data[0] = 0;\n\n    if (++sprite->data[3] == 31)\n        DestroyAnimSprite(sprite);\n}\n\n// Uses a spotlight sprite as a light mask to illuminate the target mon. The spotlight grows and shrinks.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: duration of fully-opened spotlight\nstatic void AnimFlatterSpotlight(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);\n    gBattle_WIN0H = 0;\n    gBattle_WIN0V = 0;\n    SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H);\n    SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V);\n    sprite->data[0] = gBattleAnimArgs[2];\n    InitSpritePosToAnimTarget(sprite, FALSE);\n    sprite->oam.objMode = ST_OAM_OBJ_WINDOW;\n    sprite->invisible = TRUE;\n    sprite->callback = AnimFlatterSpotlight_Step;\n}\n\nstatic void AnimFlatterSpotlight_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[1])\n    {\n    case 0:\n        sprite->invisible = FALSE;\n        if (sprite->affineAnimEnded)\n            sprite->data[1]++;\n        break;\n    case 1:\n        if (--sprite->data[0] == 0)\n        {\n            ChangeSpriteAffineAnim(sprite, 1);\n            sprite->data[1]++;\n        }\n        break;\n    case 2:\n        if (sprite->affineAnimEnded)\n        {\n            sprite->invisible = TRUE;\n            sprite->data[1]++;\n        }\n        break;\n    case 3:\n        SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);\n        SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);\n        DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\n// Spins an orb around the attacking mon, while its path radius grows and shrinks.\n// arg 0: duration\n// arg 1: initial wave offset\nstatic void AnimReversalOrb(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[0] = gBattleAnimArgs[0];\n    sprite->data[1] = gBattleAnimArgs[1];\n    sprite->callback = AnimReversalOrb_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimReversalOrb_Step(struct Sprite *sprite)\n{\n    sprite->x2 = Sin(sprite->data[1], sprite->data[2] >> 8);\n    sprite->y2 = Cos(sprite->data[1], sprite->data[3] >> 8);\n    sprite->data[1] = (sprite->data[1] + 9) & 0xFF;\n\n    if ((u16)sprite->data[1] < 64 || sprite->data[1] > 195)\n        sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1;\n    else\n        sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) + 1;\n\n    if (!sprite->data[5])\n    {\n        sprite->data[2] += 0x400;\n        sprite->data[3] += 0x100;\n        sprite->data[4]++;\n        if (sprite->data[4] == sprite->data[0])\n        {\n            sprite->data[4] = 0;\n            sprite->data[5] = 1;\n        }\n    }\n    else if (sprite->data[5] == 1)\n    {\n        sprite->data[2] -= 0x400;\n        sprite->data[3] -= 0x100;\n        sprite->data[4]++;\n        if (sprite->data[4] == sprite->data[0])\n            DestroyAnimSprite(sprite);\n    }\n}\n\n// Copies the target mon's sprite, and makes a white silhouette that shrinks away.\nvoid AnimTask_RolePlaySilhouette(u8 taskId)\n{\n    bool8 isBackPic;\n    u32 personality;\n    u32 otId;\n    u16 species;\n    s16 xOffset;\n    u32 priority;\n    u8 spriteId;\n    s16 coord1, coord2;\n\n    GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        isBackPic = FALSE;\n        personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_PERSONALITY);\n        otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_OT_ID);\n        if (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies == SPECIES_NONE)\n        {\n            if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n            {\n                species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES);\n                if(species == SPECIES_DEOXYS)\n                {\n                    personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_FORME);\n                }\n            }\n            else\n            {\n                species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES);\n                if(species == SPECIES_DEOXYS)\n                {\n                    personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_FORME);\n                }\n            } \n        }\n        else\n        {\n            species = gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies;\n        }\n\n        xOffset = 20;\n        priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);\n    }\n    else\n    {\n        isBackPic = TRUE;\n        personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_PERSONALITY);\n        otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_OT_ID);\n        if (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies == SPECIES_NONE)\n        {\n            if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n            {\n                species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES);\n                if(species == SPECIES_DEOXYS)\n                {\n                    personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_FORME);\n                }\n            }\n            else\n            {\n                species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES);\n                if(species == SPECIES_DEOXYS)\n                {\n                    personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_FORME);\n                }\n            }\n        }\n        else\n        {\n            species = gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies;\n        }\n\n        xOffset = -20;\n        priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);\n    }\n\n    coord1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n    coord2 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n    spriteId = CreateAdditionalMonSpriteForMoveAnim(species, isBackPic, 0, coord1 + xOffset, coord2, 5, personality, otId, gBattleAnimTarget, 1);\n    gSprites[spriteId].oam.priority = priority;\n    gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;\n    FillPalette(RGB_WHITE, OBJ_PLTT_ID(gSprites[spriteId].oam.paletteNum), PLTT_SIZE_4BPP);\n    gSprites[spriteId].oam.priority = priority;\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));\n    gTasks[taskId].data[0] = spriteId;\n    gTasks[taskId].func = AnimTask_RolePlaySilhouette_Step1;\n}\n\nstatic void AnimTask_RolePlaySilhouette_Step1(u8 taskId)\n{\n    if (gTasks[taskId].data[10]++ > 1)\n    {\n        gTasks[taskId].data[10] = 0;\n        gTasks[taskId].data[1]++;\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));\n        if (gTasks[taskId].data[1] == 10)\n        {\n            gTasks[taskId].data[10] = 256;\n            gTasks[taskId].data[11] = 256;\n            gTasks[taskId].func = AnimTask_RolePlaySilhouette_Step2;\n        }\n    }\n}\n\nstatic void AnimTask_RolePlaySilhouette_Step2(u8 taskId)\n{\n    u8 spriteId = gTasks[taskId].data[0];\n    \n    gTasks[taskId].data[10] -= 16;\n    gTasks[taskId].data[11] += 128;\n    gSprites[spriteId].oam.affineMode |= ST_OAM_AFFINE_DOUBLE_MASK;\n    TrySetSpriteRotScale(&gSprites[spriteId], TRUE, gTasks[taskId].data[10], gTasks[taskId].data[11], 0);\n    if (++gTasks[taskId].data[12] == 9)\n    {\n        TryResetSpriteAffineState(&gSprites[spriteId]);\n        DestroySpriteAndFreeResources_(&gSprites[spriteId]);\n        gTasks[taskId].func = DestroyAnimVisualTaskAndDisableBlend;\n    }\n}\n\n// Performs a wavy transformation on the mon's sprite, and fades out.\n// arg 0: which battler\nvoid AnimTask_AcidArmor(u8 taskId)\n{\n    u8 battler;\n    u16 bgX, bgY;\n    s16 y, i;\n    struct ScanlineEffectParams scanlineParams;\n    struct Task *task = &gTasks[taskId];\n\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    task->data[0] = 0;\n    task->data[1] = 0;\n    task->data[2] = 0;\n    task->data[3] = 16;\n    task->data[4] = 0;\n    task->data[5] = battler;\n    task->data[6] = 32;\n    task->data[7] = 0;\n    task->data[8] = 24;\n\n    if (GetBattlerSide(battler) == B_SIDE_OPPONENT)\n        task->data[8] *= -1;\n\n    task->data[13] = GetBattlerYCoordWithElevation(battler) - 34;\n    if (task->data[13] < 0)\n        task->data[13] = 0;\n\n    task->data[14] = task->data[13] + 66;\n    task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n    if (GetBattlerSpriteBGPriorityRank(battler) == 1)\n    {\n        scanlineParams.dmaDest = &REG_BG1HOFS;\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);\n        bgX = gBattle_BG1_X;\n        bgY = gBattle_BG1_Y;\n    }\n    else\n    {\n        scanlineParams.dmaDest = &REG_BG2HOFS;\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);\n        bgX = gBattle_BG2_X;\n        bgY = gBattle_BG2_Y;\n    }\n\n    for (y = 0, i = 0; y < 160; y++, i += 2)\n    {\n        gScanlineEffectRegBuffers[0][i] = bgX;\n        gScanlineEffectRegBuffers[1][i] = bgX;\n        gScanlineEffectRegBuffers[0][i + 1] = bgY;\n        gScanlineEffectRegBuffers[1][i + 1] = bgY;\n    }\n\n    scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_32BIT;\n    scanlineParams.initState = 1;\n    scanlineParams.unused9 = 0;\n    ScanlineEffect_SetParams(scanlineParams);\n    task->func = AnimTask_AcidArmor_Step;\n}\n\nstatic void AnimTask_AcidArmor_Step(u8 taskId)\n{\n    struct Task *task;\n    s16 var1;\n    s16 var2;\n    s16 bgX, bgY;\n    s16 offset;\n    s16 var0;\n    s32 i;\n    s16 sineIndex;\n    s16 var3;\n\n    task = &gTasks[taskId];\n    if (GetBattlerSpriteBGPriorityRank(task->data[5]) == 1)\n    {\n        bgX = gBattle_BG1_X;\n        bgY = gBattle_BG1_Y;\n    }\n    else\n    {\n        bgX = gBattle_BG2_X;\n        bgY = gBattle_BG2_Y;\n    }\n\n    switch (task->data[0])\n    {\n    case 0:\n        offset = task->data[14] * 2;\n        var1 = 0;\n        var2 = 0;\n        i = 0;\n        task->data[1] = (task->data[1] + 2) & 0xFF;\n        sineIndex = task->data[1];\n        task->data[9] = 0x7E0 / task->data[6];\n        task->data[10] = -((task->data[7] * 2) / task->data[9]);\n        task->data[11] = task->data[7];\n        var3 = task->data[11] >> 5;\n        task->data[12] = var3;\n        var0 = task->data[14];\n        while (var0 > task->data[13])\n        {\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][offset + 1] = (i - var2) + bgY;\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][offset] = bgX + var3 + (gSineTable[sineIndex] >> 5);\n            sineIndex = (sineIndex + 10) & 0xFF;\n            task->data[11] += task->data[10];\n            var3 = task->data[11] >> 5;\n            task->data[12] = var3;\n\n            i++;\n            offset -= 2;\n            var1 += task->data[6];\n            var2 = var1 >> 5;\n            var0--;\n        }\n\n        var0 *= 2;\n        while (var0 >= 0)\n        {\n            gScanlineEffectRegBuffers[0][var0] = bgX + 240;\n            gScanlineEffectRegBuffers[1][var0] = bgX + 240;\n            var0 -= 2;\n        }\n\n        if (++task->data[6] > 63)\n        {\n            task->data[6] = 64;\n            task->data[2]++;\n            if (task->data[2] & 1)\n                task->data[3]--;\n            else\n                task->data[4]++;\n\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4]));\n            if (task->data[3] == 0 && task->data[4] == 16)\n            {\n                task->data[2] = 0;\n                task->data[3] = 0;\n                task->data[0]++;\n            }\n        }\n        else\n        {\n            task->data[7] += task->data[8];\n        }\n        break;\n    case 1:\n        if (++task->data[2] > 12)\n        {\n            gScanlineEffect.state = 3;\n            task->data[2] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 2:\n        task->data[2]++;\n        if (task->data[2] & 1)\n            task->data[3]++;\n        else\n            task->data[4]--;\n\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4]));\n        if (task->data[3] == 16 && task->data[4] == 0)\n        {\n            task->data[2] = 0;\n            task->data[3] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 3:\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Runs an affine animation that makes it look like the mon is inhaling deeply.\n// arg 0: which battler\nvoid AnimTask_DeepInhale(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    \n    task->data[0] = 0;\n    task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n    PrepareAffineAnimInTaskData(&gTasks[taskId], task->data[15], sDeepInhaleAffineAnimCmds);\n    task->func = AnimTask_DeepInhale_Step;\n}\n\nstatic void AnimTask_DeepInhale_Step(u8 taskId)\n{\n    u16 var0;\n    struct Task *task = &gTasks[taskId];\n    \n    var0 = task->data[0];\n    task->data[0]++;\n    var0 -= 20;\n    if (var0 < 23)\n    {\n        if (++task->data[1] > 1)\n        {\n            task->data[1] = 0;\n            task->data[2]++;\n            if (task->data[2] & 1)\n                gSprites[task->data[15]].x2 = 1;\n            else\n                gSprites[task->data[15]].x2 = -1;\n        }\n    }\n    else\n    {\n        gSprites[task->data[15]].x2 = 0;\n    }\n\n    if (!RunAffineAnimFromTaskData(&gTasks[taskId]))\n        DestroyAnimVisualTask(taskId);\n}\n\nstatic void InitYawnCloudPosition(struct Sprite *sprite, s16 startX, s16 startY, s16 destX, s16 destY, u16 duration)\n{\n    sprite->x = startX;\n    sprite->y = startY;\n    sprite->data[4] = startX << 4;\n    sprite->data[5] = startY << 4;\n    sprite->data[6] = ((destX - startX) << 4) / duration;\n    sprite->data[7] = ((destY - startY) << 4) / duration;\n}\n\nstatic void UpdateYawnCloudPosition(struct Sprite *sprite)\n{\n    sprite->data[4] += sprite->data[6];\n    sprite->data[5] += sprite->data[7];\n    sprite->x = sprite->data[4] >> 4;\n    sprite->y = sprite->data[5] >> 4;\n}\n\n// Drifts a cloud in a wavy path towards the target mon.\n// arg 0: which affine anim\nstatic void AnimYawnCloud(struct Sprite *sprite)\n{\n    s16 destX = sprite->x;\n    s16 destY = sprite->y;\n\n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    StartSpriteAffineAnim(sprite, gBattleAnimArgs[0]);\n    InitYawnCloudPosition(sprite, sprite->x, sprite->y, destX, destY, 64);\n    sprite->data[0] = 0;\n    sprite->callback = AnimYawnCloud_Step;\n}\n\nstatic void AnimYawnCloud_Step(struct Sprite *sprite)\n{\n    int index;\n\n    sprite->data[0]++;\n    index = (sprite->data[0] * 8) & 0xFF;\n    UpdateYawnCloudPosition(sprite);\n    sprite->y2 = Sin(index, 8);\n    if (sprite->data[0] > 58)\n    {\n        if (++sprite->data[1] > 1)\n        {\n            sprite->data[1] = 0;\n            sprite->data[2]++;\n            sprite->invisible = sprite->data[2] & 1;\n            if (sprite->data[2] > 3)\n                DestroySpriteAndMatrix(sprite);\n        }\n    }\n}\n\n// Animates a cloud coming from the smoke ball.\n// arg 0: ?\n// arg 1: initial x pixel offset\n// arg 2: initial y pixel offset\n// arg 3: ?\nstatic void AnimSmokeBallEscapeCloud(struct Sprite *sprite)\n{\n    sprite->data[0] = gBattleAnimArgs[3];\n    StartSpriteAffineAnim(sprite, gBattleAnimArgs[0]);\n    if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1];\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];\n    sprite->callback = DestroyAnimSpriteAfterTimer;\n}\n\nstatic void AnimTask_SlideMonForFocusBand_Step2(u8 taskId)\n{\n    u16 var0 = 0;\n    u16 var1 = 0;\n\n    gTasks[taskId].data[0]--;\n    if ((gTasks[taskId].data[6] & 0x8000) && (--gTasks[taskId].data[1] == -1))\n    {\n        if (gTasks[taskId].data[9] == 0)\n        {\n            gTasks[taskId].data[9] = gTasks[taskId].data[4];\n            gTasks[taskId].data[4] = -gTasks[taskId].data[4];\n        }\n        else\n        {\n            gTasks[taskId].data[9] = 0;\n        }\n\n        if (gTasks[taskId].data[10] == 0)\n        {\n            gTasks[taskId].data[10] = gTasks[taskId].data[5];\n            gTasks[taskId].data[5] = -gTasks[taskId].data[5];\n        }\n        else\n        {\n            gTasks[taskId].data[10] = 0;\n        }\n\n        gTasks[taskId].data[1] = gTasks[taskId].data[13];\n    }\n\n    var0 = gTasks[taskId].data[7];\n    var1 = gTasks[taskId].data[8];\n    if (gTasks[taskId].data[2] & 0x8000)\n        gSprites[gTasks[taskId].data[15]].x2 = gTasks[taskId].data[9] - (var0 >> 8);\n    else\n        gSprites[gTasks[taskId].data[15]].x2 = gTasks[taskId].data[9] + (var0 >> 8);\n\n    if (gTasks[taskId].data[3] & 0x8000)\n        gSprites[gTasks[taskId].data[15]].y2 = gTasks[taskId].data[10] - (var1 >> 8);\n    else\n        gSprites[gTasks[taskId].data[15]].y2 = gTasks[taskId].data[10] + (var1 >> 8);\n\n    if (gTasks[taskId].data[0] < 1)\n    {\n        DestroyTask(taskId);\n        gAnimVisualTaskCount--;\n    }\n}\n\nstatic void AnimTask_SlideMonForFocusBand_Step1(u8 taskId)\n{\n    u16 var0 = 0;\n    u16 var1 = 0;\n\n    gTasks[taskId].data[0]--;\n    if ((gTasks[taskId].data[6] & 0x8000) && (--gTasks[taskId].data[1] == -1))\n    {\n        if (gTasks[taskId].data[9] == 0)\n        {\n            gTasks[taskId].data[9] = gTasks[taskId].data[4];\n            gTasks[taskId].data[4] = -gTasks[taskId].data[4];\n        }\n        else\n        {\n            gTasks[taskId].data[9] = var0;\n        }\n\n        if (gTasks[taskId].data[10] == 0)\n        {\n            gTasks[taskId].data[10] = gTasks[taskId].data[5];\n            gTasks[taskId].data[5] = -gTasks[taskId].data[5];\n        }\n        else\n        {\n            gTasks[taskId].data[10] = 0;\n        }\n\n        gTasks[taskId].data[1] = gTasks[taskId].data[13];\n    }\n\n    var0 = (gTasks[taskId].data[2] & 0x7FFF) + gTasks[taskId].data[7];\n    var1 = (gTasks[taskId].data[3] & 0x7FFF) + gTasks[taskId].data[8];\n    if (gTasks[taskId].data[2] & 0x8000)\n        gSprites[gTasks[taskId].data[15]].x2 = gTasks[taskId].data[9] - (var0 >> 8);\n    else\n        gSprites[gTasks[taskId].data[15]].x2 = gTasks[taskId].data[9] + (var0 >> 8);\n\n    if (gTasks[taskId].data[3] & 0x8000)\n        gSprites[gTasks[taskId].data[15]].y2 = gTasks[taskId].data[10] - (var1 >> 8);\n    else\n        gSprites[gTasks[taskId].data[15]].y2 = gTasks[taskId].data[10] + (var1 >> 8);\n\n    gTasks[taskId].data[7] = var0;\n    gTasks[taskId].data[8] = var1;\n    if (gTasks[taskId].data[0] < 1)\n    {\n        gTasks[taskId].data[0] = 30;\n        gTasks[taskId].data[13] = 0;\n        gTasks[taskId].func = AnimTask_SlideMonForFocusBand_Step2;\n    }\n}\n\nvoid AnimTask_SlideMonForFocusBand(u8 taskId)\n{\n    gTasks[taskId].data[15] = gBattlerSpriteIds[gBattleAnimAttacker];\n    gTasks[taskId].data[14] = gBattleAnimArgs[0];\n    gTasks[taskId].data[0] = gBattleAnimArgs[0];\n    gTasks[taskId].data[13] = gBattleAnimArgs[6];\n    if (gBattleAnimArgs[3])\n        gTasks[taskId].data[6] = gTasks[taskId].data[6] | -0x8000;\n\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        gTasks[taskId].data[2] = gBattleAnimArgs[1];\n        gTasks[taskId].data[3] = gBattleAnimArgs[2];\n    }\n    else\n    {\n        if (gBattleAnimArgs[1] & 0x8000)\n            gTasks[taskId].data[2] = gBattleAnimArgs[1] & 0x7FFF;\n        else\n            gTasks[taskId].data[2] = gBattleAnimArgs[1] | -0x8000;\n\n        if (gBattleAnimArgs[2] & 0x8000)\n            gTasks[taskId].data[3] = gBattleAnimArgs[2] & 0x7FFF;\n        else\n            gTasks[taskId].data[3] = gBattleAnimArgs[2] | -0x8000;\n    }\n\n    gTasks[taskId].data[8] = 0;\n    gTasks[taskId].data[7] = 0;\n    gTasks[taskId].data[4] = gBattleAnimArgs[4];\n    gTasks[taskId].data[5] = gBattleAnimArgs[5];\n    gTasks[taskId].func = AnimTask_SlideMonForFocusBand_Step1;\n}\n\n#define IDX_ACTIVE_SPRITES 2  // Used by the sprite callback to modify the number of active sprites\n\n// Task data for AnimTask_SquishAndSweatDroplets\n#define tState           data[0]\n#define tTimer           data[1]\n#define tActiveSprites   data[IDX_ACTIVE_SPRITES]\n#define tNumSquishes     data[3]\n#define tBaseX           data[4]\n#define tBaseY           data[5]\n#define tSubpriority     data[6]\n// data[7]-data[15] used by PrepareAffineAnimInTaskData\n#define tBattlerSpriteId data[15]\n\n// Sprite data for AnimFacadeSweatDrop\n#define sTimer            data[0]\n#define sVelocX           data[1]\n#define sVelocY           data[2]\n#define sTaskId           data[3]\n#define sActiveSpritesIdx data[4]\n\n// Squishes the mon vertically and emits sweat droplets a few times.\n// arg 0: battler\n// arg 1: num squishes\nvoid AnimTask_SquishAndSweatDroplets(u8 taskId)\n{\n    u8 battler;\n    struct Task *task = &gTasks[taskId];\n\n    if (!gBattleAnimArgs[1])\n        DestroyAnimVisualTask(taskId);\n\n    task->tState = 0;\n    task->tTimer = 0;\n    task->tActiveSprites = 0;\n    task->tNumSquishes = gBattleAnimArgs[1];\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    task->tBaseX = GetBattlerSpriteCoord(battler, BATTLER_COORD_X);\n    task->tBaseY = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y);\n    task->tSubpriority = GetBattlerSpriteSubpriority(battler);\n    task->tBattlerSpriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n    PrepareAffineAnimInTaskData(task, task->tBattlerSpriteId, sFacadeSquishAffineAnimCmds);\n    task->func = AnimTask_SquishAndSweatDroplets_Step;\n}\n\nstatic void AnimTask_SquishAndSweatDroplets_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->tState)\n    {\n    case 0:\n        task->tTimer++;\n        if (task->tTimer == 6)\n            CreateSweatDroplets(taskId, TRUE);\n\n        if (task->tTimer == 18)\n            CreateSweatDroplets(taskId, FALSE);\n\n        if (!RunAffineAnimFromTaskData(task))\n        {\n            if (--task->tNumSquishes == 0)\n            {\n                // Animation is finished\n                task->tState++;\n            }\n            else\n            {\n                // Animation continues, more droplet sprites to create\n                task->tTimer = 0;\n                PrepareAffineAnimInTaskData(task, task->tBattlerSpriteId, sFacadeSquishAffineAnimCmds);\n            }\n        }\n        break;\n    case 1:\n        // Wait for sprites to be destroyed before ending task\n        if (task->tActiveSprites == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void CreateSweatDroplets(u8 taskId, bool8 lowerDroplets)\n{\n    u32 i;\n    s8 xOffset, yOffset;\n    struct Task *task;\n    s16 xCoords[4];\n    s16 yCoords[2];\n\n    task = &gTasks[taskId];\n    if (!lowerDroplets)\n    {\n        xOffset = 18;\n        yOffset = -20;\n    }\n    else\n    {\n        xOffset = 30;\n        yOffset = 20;\n    }\n\n    xCoords[0] = task->tBaseX - xOffset;\n    xCoords[1] = task->tBaseX - xOffset - 4;\n    xCoords[2] = task->tBaseX + xOffset;\n    xCoords[3] = task->tBaseX + xOffset + 4;\n    yCoords[0] = task->tBaseY + yOffset;\n    yCoords[1] = task->tBaseY + yOffset + 6;\n\n    for (i = 0; i < 4; i++)\n    {\n        u8 spriteId = CreateSprite(&gFacadeSweatDropSpriteTemplate, xCoords[i], yCoords[i & 1], task->tSubpriority - 5);\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].sTimer = 0;\n            gSprites[spriteId].sVelocX = i < 2 ? -2 : 2; // First two travel left, remaining travel right\n            gSprites[spriteId].sVelocY = -1;\n            gSprites[spriteId].sTaskId = taskId;\n            gSprites[spriteId].sActiveSpritesIdx = IDX_ACTIVE_SPRITES;\n            task->tActiveSprites++;\n        }\n    }\n}\n\nstatic void AnimFacadeSweatDrop(struct Sprite *sprite)\n{\n    sprite->x += sprite->sVelocX;\n    sprite->y += sprite->sVelocY;\n    if (++sprite->sTimer > 6)\n    {\n        gTasks[sprite->sTaskId].data[sprite->sActiveSpritesIdx]--;\n        DestroySprite(sprite);\n    }\n}\n\n#undef IDX_ACTIVE_SPRITES\n#undef tState\n#undef tTimer\n#undef tActiveSprites\n#undef tNumSquishes\n#undef tBaseX\n#undef tBaseY\n#undef tSubpriority\n#undef tBattlerSpriteId\n#undef sTimer\n#undef sVelocX\n#undef sVelocY\n#undef sTaskId\n#undef sActiveSpritesIdx\n\n// Blends the mon sprite's color with a rotating set of colors.\n// arg 0: battler\n// arg 1: duration\nvoid AnimTask_FacadeColorBlend(u8 taskId)\n{\n    u8 spriteId;\n\n    gTasks[taskId].data[0] = 0;\n    gTasks[taskId].data[1] = gBattleAnimArgs[1];\n    spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n    gTasks[taskId].data[2] = OBJ_PLTT_ID(gSprites[spriteId].oam.paletteNum);\n    gTasks[taskId].func = AnimTask_FacadeColorBlend_Step;\n}\n\nstatic void AnimTask_FacadeColorBlend_Step(u8 taskId)\n{\n    if (gTasks[taskId].data[1])\n    {\n        BlendPalette(gTasks[taskId].data[2], 16, 8, sFacadeBlendColors[gTasks[taskId].data[0]]);\n        if (++gTasks[taskId].data[0] > 23)\n            gTasks[taskId].data[0] = 0;\n\n        gTasks[taskId].data[1]--;\n    }\n    else\n    {\n        BlendPalette(gTasks[taskId].data[2], 16, 0, RGB_BLACK);\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nvoid AnimTask_StatusClearedEffect(u8 taskId)\n{\n    StartMonScrollingBgMask(taskId, 0, 0x1A0, gBattleAnimAttacker, gBattleAnimArgs[0], 10, 2, 30, gCureBubblesGfx, gCureBubblesTilemap, gCureBubblesPal);\n}\n\n// Moves a noise line from the mon.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: which direction (0 = upward, 1 = downward, 2 = horizontal)\nstatic void AnimRoarNoiseLine(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)\n        gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0];\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1];\n    if (gBattleAnimArgs[2] == 0)\n    {\n        sprite->data[0] = 0x280;\n        sprite->data[1] = -0x280;\n    }\n    else if (gBattleAnimArgs[2] == 1)\n    {\n        sprite->vFlip = TRUE;\n        sprite->data[0] = 0x280;\n        sprite->data[1] = 0x280;\n    }\n    else\n    {\n        StartSpriteAnim(sprite, 1);\n        sprite->data[0] = 0x280;\n    }\n\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->data[0] = -sprite->data[0];\n        sprite->hFlip = TRUE;\n    }\n\n    sprite->callback = AnimRoarNoiseLine_Step;\n}\n\nstatic void AnimRoarNoiseLine_Step(struct Sprite *sprite)\n{\n    sprite->data[6] += sprite->data[0];\n    sprite->data[7] += sprite->data[1];\n    sprite->x2 = sprite->data[6] >> 8;\n    sprite->y2 = sprite->data[7] >> 8;\n    if (++sprite->data[5] == 14)\n        DestroyAnimSprite(sprite);\n}\n\n#define IDX_ACTIVE_SPRITES 10  // Used by the sprite callback to modify the number of active sprites\n\n// Task data for AnimTask_GlareEyeDots\n#define tState         data[0]\n#define tTimer         data[1]\n#define tPairNum       data[2]\n#define tPairMax       data[5]\n#define tDotOffset     data[6]\n#define tIsContest     data[7]\n#define tActiveSprites data[IDX_ACTIVE_SPRITES]\n#define tStartX        data[11]\n#define tStartY        data[12]\n#define tEndX          data[13]\n#define tEndY          data[14]\n\n// Sprite data for AnimGlareEyeDot\n#define sTimer            data[0]\n#define sTaskId           data[1]\n#define sActiveSpritesIdx data[2]\n\n// Makes a series of dots in a trail from the attacker to the target.\n// arg 0: unused\nvoid AnimTask_GlareEyeDots(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->tPairMax = 12;\n    task->tDotOffset = 3;\n    task->tIsContest = FALSE;\n\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        task->tStartX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4;\n    else\n        task->tStartX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4;\n\n    task->tStartY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4;\n    task->tEndX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    task->tEndY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    task->func = AnimTask_GlareEyeDots_Step;\n}\n\nstatic void AnimTask_GlareEyeDots_Step(u8 taskId)\n{\n    u32 i;\n    s16 x, y;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->tState)\n    {\n    case 0:\n        // Wait to create next pair of dots\n        if (++task->tTimer > 3)\n        {\n            task->tTimer = 0;\n            GetGlareEyeDotCoords(\n                task->tStartX,\n                task->tStartY,\n                task->tEndX,\n                task->tEndY,\n                task->tPairMax,\n                task->tPairNum,\n                &x,\n                &y);\n\n            // Create dot pair\n            for (i = 0; i < 2; i++)\n            {\n                u8 spriteId = CreateSprite(&gGlareEyeDotSpriteTemplate, x, y, 35);\n                if (spriteId != MAX_SPRITES)\n                {\n                    if (!task->tIsContest)\n                    {\n                        if (i == 0)\n                            gSprites[spriteId].x2 = gSprites[spriteId].y2 = -task->tDotOffset;\n                        else\n                            gSprites[spriteId].x2 = gSprites[spriteId].y2 = task->tDotOffset;\n                    }\n                    else\n                    {\n                        if (i == 0)\n                        {\n                            gSprites[spriteId].x2 = -task->tDotOffset;\n                            gSprites[spriteId].y2 = task->tDotOffset;\n                        }\n                        else\n                        {\n                            gSprites[spriteId].x2 = task->tDotOffset;\n                            gSprites[spriteId].y2 = -task->tDotOffset;\n                        }\n                    }\n\n                    gSprites[spriteId].sTimer = 0;\n                    gSprites[spriteId].sTaskId = taskId;\n                    gSprites[spriteId].sActiveSpritesIdx = IDX_ACTIVE_SPRITES;\n                    task->tActiveSprites++;\n                }\n            }\n\n            if (task->tPairNum == task->tPairMax)\n                task->tState++;\n\n            task->tPairNum++;\n        }\n        break;\n    case 1:\n        // Wait for sprites to be destroyed before ending task\n        if (task->tActiveSprites == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void GetGlareEyeDotCoords(s16 startX, s16 startY, s16 endX, s16 endY, u8 pairMax, u8 pairNum, s16 *x, s16 *y)\n{\n    int x2;\n    int y2;\n\n    if (pairNum == 0)\n    {\n        *x = startX;\n        *y = startY;\n        return;\n    }\n\n    if (pairNum >= pairMax)\n    {\n        *x = endX;\n        *y = endY;\n        return;\n    }\n\n    pairMax--;\n    x2 = (startX << 8) + pairNum * (((endX - startX) << 8) / pairMax);\n    y2 = (startY << 8) + pairNum * (((endY - startY) << 8) / pairMax);\n    *x = x2 >> 8;\n    *y = y2 >> 8;\n}\n\nstatic void AnimGlareEyeDot(struct Sprite *sprite)\n{\n    if (++sprite->sTimer > 36)\n    {\n        gTasks[sprite->sTaskId].data[sprite->sActiveSpritesIdx]--;\n        DestroySprite(sprite);\n    }\n}\n\n#undef IDX_ACTIVE_SPRITES\n#undef tState\n#undef tTimer\n#undef tPairNum\n#undef tPairMax\n#undef tDotOffset\n#undef tIsContest\n#undef tActiveSprites\n#undef tStartX\n#undef tStartY\n#undef tEndX\n#undef tEndY\n#undef sTimer\n#undef sTaskId\n#undef sActiveSpritesIdx\n\n// Moves a pawprint in a straight line.\n// arg 0: initial x position\n// arg 1: initial y position\n// arg 2: destination x position\n// arg 3: destination y position\n// arg 4: duration\nstatic void AnimAssistPawprint(struct Sprite *sprite)\n{\n    sprite->x = gBattleAnimArgs[0];\n    sprite->y = gBattleAnimArgs[1];\n    sprite->data[2] = gBattleAnimArgs[2];\n    sprite->data[4] = gBattleAnimArgs[3];\n    sprite->data[0] = gBattleAnimArgs[4];\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = InitAndRunAnimFastLinearTranslation;\n}\n\n// Moves a ball in an arc twoards the target, and rotates the ball while arcing.\n// No args.\nvoid AnimTask_BarrageBall(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT) / 4;\n    task->data[15] = CreateSprite(&gBarrageBallSpriteTemplate, task->data[11], task->data[12], GetBattlerSpriteSubpriority(gBattleAnimTarget) - 5);\n    if (task->data[15] != MAX_SPRITES)\n    {\n        gSprites[task->data[15]].data[0] = 16;\n        gSprites[task->data[15]].data[2] = task->data[13];\n        gSprites[task->data[15]].data[4] = task->data[14];\n        gSprites[task->data[15]].data[5] = -32;\n        InitAnimArcTranslation(&gSprites[task->data[15]]);\n        if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)\n            StartSpriteAffineAnim(&gSprites[task->data[15]], 1);\n\n        task->func = AnimTask_BarrageBall_Step;\n    }\n    else\n    {\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nstatic void AnimTask_BarrageBall_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        if (++task->data[1] > 1)\n        {\n            task->data[1] = 0;\n            TranslateAnimHorizontalArc(&gSprites[task->data[15]]);\n            if (++task->data[2] > 7)\n                task->data[0]++;\n        }\n        break;\n    case 1:\n        if (TranslateAnimHorizontalArc(&gSprites[task->data[15]]))\n        {\n            task->data[1] = 0;\n            task->data[2] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 2:\n        if (++task->data[1] > 1)\n        {\n            task->data[1] = 0;\n            task->data[2]++;\n            gSprites[task->data[15]].invisible = task->data[2] & 1;\n            if (task->data[2] == 16)\n            {\n                FreeOamMatrix(gSprites[task->data[15]].oam.matrixNum);\n                DestroySprite(&gSprites[task->data[15]]);\n                task->data[0]++;\n            }\n        }\n        break;\n    case 3:\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Moves a hand back and forth in a squishing motion.\n// arg 0: which battler\n// arg 1: horizontal flip\n// arg 2: num squishes\nstatic void AnimSmellingSaltsHand(struct Sprite *sprite)\n{\n    u8 battler;\n\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    sprite->oam.tileNum += 16;\n    sprite->data[6] = gBattleAnimArgs[2];\n    sprite->data[7] = gBattleAnimArgs[1] == 0 ? -1 : 1;\n    sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET);\n    if (gBattleAnimArgs[1] == 0)\n    {\n        sprite->oam.matrixNum |= ST_OAM_HFLIP;\n        sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8;\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) + 8;\n    }\n\n    sprite->callback = AnimSmellingSaltsHand_Step;\n}\n\nstatic void AnimSmellingSaltsHand_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        if (++sprite->data[1] > 1)\n        {\n            sprite->data[1] = 0;\n            sprite->x2 += sprite->data[7];\n            if (++sprite->data[2] == 12)\n                sprite->data[0]++;\n        }\n        break;\n    case 1:\n        if (++sprite->data[1] == 8)\n        {\n            sprite->data[1] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 2:\n        sprite->x2 -= sprite->data[7] * 4;\n        if (++sprite->data[1] == 6)\n        {\n            sprite->data[1] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 3:\n        sprite->x2 += sprite->data[7] * 3;\n        if (++sprite->data[1] == 8)\n        {\n            if (--sprite->data[6])\n            {\n                sprite->data[1] = 0;\n                sprite->data[0]--;\n            }\n            else\n            {\n                DestroyAnimSprite(sprite);\n            }\n        }\n        break;\n    }\n}\n\n// Squishes the mon horizontally a few times.\n// arg 0: which mon\n// arg 1: number of squishes\nvoid AnimTask_SmellingSaltsSquish(u8 taskId)\n{\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n    {\n        DestroyAnimVisualTask(taskId);\n    }\n    else\n    {\n        gTasks[taskId].data[0] = gBattleAnimArgs[1];\n        gTasks[taskId].data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n        PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], sSmellingSaltsSquishAffineAnimCmds);\n        gTasks[taskId].func = AnimTask_SmellingSaltsSquish_Step;\n    }\n}\n\nstatic void AnimTask_SmellingSaltsSquish_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (++task->data[1] > 1)\n    {\n        task->data[1] = 0;\n        if (!(task->data[2] & 1))\n            gSprites[task->data[15]].x2 = 2;\n        else\n            gSprites[task->data[15]].x2 = -2;\n    }\n\n    if (!RunAffineAnimFromTaskData(task))\n    {\n        gSprites[task->data[15]].x2 = 0;\n        if (--task->data[0])\n        {\n            PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], sSmellingSaltsSquishAffineAnimCmds);\n            task->data[1] = 0;\n            task->data[2] = 0;\n        }\n        else\n        {\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n}\n\n// Blinks an exclamation image over the mon a few times.\n// arg 0: which mon\n// arg 1: blink delay\n// arg 2: number of blinks\nstatic void AnimSmellingSaltExclamation(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP);\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP);\n    }\n\n    if (sprite->y < 8)\n        sprite->y = 8;\n\n    sprite->data[0] = 0;\n    sprite->data[1] = gBattleAnimArgs[1];\n    sprite->data[2] = 0;\n    sprite->data[3] = gBattleAnimArgs[2];\n    sprite->callback = AnimSmellingSaltExclamation_Step;\n}\n\nstatic void AnimSmellingSaltExclamation_Step(struct Sprite *sprite)\n{\n    if (++sprite->data[0] >= sprite->data[1])\n    {\n        sprite->data[0] = 0;\n        sprite->data[2] = (sprite->data[2] + 1) & 1;\n        sprite->invisible = sprite->data[2];\n        if (sprite->data[2] && --sprite->data[3] == 0)\n            DestroyAnimSprite(sprite);\n    }\n}\n\n// Claps a hand several times.\n// arg 0: which hand\n// arg 1:\nstatic void AnimHelpingHandClap(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[0] == 0)\n    {\n        sprite->oam.matrixNum |= ST_OAM_HFLIP;\n        sprite->x = 100;\n        sprite->data[7] = 1;\n    }\n    else\n    {\n        sprite->x = 140;\n        sprite->data[7] = -1;\n    }\n\n    sprite->y = 56;\n    sprite->callback = AnimHelpingHandClap_Step;\n}\n\nstatic void AnimHelpingHandClap_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->y -= sprite->data[7] * 2;\n        if (sprite->data[1] & 1)\n            sprite->x -= sprite->data[7] * 2;\n\n        if (++sprite->data[1] == 9)\n        {\n            sprite->data[1] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 1:\n        if (++sprite->data[1] == 4)\n        {\n            sprite->data[1] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 2:\n        sprite->data[1]++;\n        sprite->y += sprite->data[7] * 3;\n        sprite->x2 = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3);\n        if (sprite->data[1] == 12)\n        {\n            sprite->data[1] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 3:\n        if (++sprite->data[1] == 2)\n        {\n            sprite->data[1] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 4:\n        sprite->data[1]++;\n        sprite->y -= sprite->data[7] * 3;\n        sprite->x2 = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3);\n        if (sprite->data[1] == 12)\n            sprite->data[0]++;\n        break;\n    case 5:\n        sprite->data[1]++;\n        sprite->y += sprite->data[7] * 3;\n        sprite->x2 = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3);\n        if (sprite->data[1] == 15)\n            sprite->oam.tileNum += 16;\n\n        if (sprite->data[1] == 18)\n        {\n            sprite->data[1] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 6:\n        sprite->x += sprite->data[7] * 6;\n        if (++sprite->data[1] == 9)\n        {\n            sprite->data[1] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 7:\n        sprite->x += sprite->data[7] * 2;\n        if (++sprite->data[1] == 1)\n        {\n            sprite->data[1] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 8:\n        sprite->x -= sprite->data[7] * 3;\n        if (++sprite->data[1] == 5)\n            DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\n// Repeatedly moves the attacking mon in a horizontal lunging motion.\n// No args.\nvoid AnimTask_HelpingHandAttackerMovement(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    if (IsDoubleBattle() == TRUE)\n    {\n        int attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n        int partnerX = GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_X);\n        if (attackerX > partnerX)\n            task->data[14] = 1;\n        else\n            task->data[14] = -1;\n    }\n    else\n    {\n        if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n            task->data[14] = -1;\n        else\n            task->data[14] = 1;\n    }\n\n    task->func = AnimTask_HelpingHandAttackerMovement_Step;\n}\n\nstatic void AnimTask_HelpingHandAttackerMovement_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        if (++task->data[1] == 13)\n        {\n            task->data[1] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 1:\n        gSprites[task->data[15]].x2 -= task->data[14] * 3;\n        if (++task->data[1] == 6)\n        {\n            task->data[1] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 2:\n        gSprites[task->data[15]].x2 += task->data[14] * 3;\n        if (++task->data[1] == 6)\n        {\n            task->data[1] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 3:\n        if (++task->data[1] == 2)\n        {\n            task->data[1] = 0;\n            if (task->data[2] == 0)\n            {\n                task->data[2]++;\n                task->data[0] = 1;\n            }\n            else\n            {\n                task->data[0]++;\n            }\n        }\n        break;\n    case 4:\n        gSprites[task->data[15]].x2 += task->data[14];\n        if (++task->data[1] == 3)\n        {\n            task->data[1] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 5:\n        if (++task->data[1] == 6)\n        {\n            task->data[1] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 6:\n        gSprites[task->data[15]].x2 -= task->data[14] * 4;\n        if (++task->data[1] == 5)\n        {\n            task->data[1] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 7:\n        gSprites[task->data[15]].x2 += task->data[14] * 4;\n        if (++task->data[1] == 5)\n        {\n            task->data[1] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 8:\n        gSprites[task->data[15]].x2 = 0;\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Moves a magnifying glass around in straight lines.\n// arg 0: magnifying glass target mon\nstatic void AnimForesightMagnifyingGlass(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n    {\n        InitSpritePosToAnimAttacker(sprite, TRUE);\n        sprite->data[7] = gBattleAnimAttacker;\n    }\n    else\n    {\n        sprite->data[7] = gBattleAnimTarget;\n    }\n\n    if (GetBattlerSide(sprite->data[7]) == B_SIDE_OPPONENT)\n        sprite->oam.matrixNum = ST_OAM_HFLIP;\n\n    sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]);\n    sprite->oam.objMode = ST_OAM_OBJ_BLEND;\n    sprite->callback = AnimForesightMagnifyingGlass_Step;\n}\n\nstatic void AnimForesightMagnifyingGlass_Step(struct Sprite *sprite)\n{\n    u16 x, y;\n\n    switch (sprite->data[5])\n    {\n    case 0:\n        switch (sprite->data[6])\n        {\n        default:\n            sprite->data[6] = 0;\n        case 0:\n        case 4:\n            x = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_RIGHT) - 4;\n            y = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_BOTTOM) - 4;\n            break;\n        case 1:\n            x = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_RIGHT) - 4;\n            y = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_TOP) + 4;\n            break;\n        case 2:\n            x = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_LEFT) + 4;\n            y = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_BOTTOM) - 4;\n            break;\n        case 3:\n            x = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_LEFT) + 4;\n            y = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_TOP) - 4;\n            break;\n        case 5:\n            x = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_X_2);\n            y = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_Y_PIC_OFFSET);\n            break;\n        }\n\n        if (sprite->data[6] == 4)\n            sprite->data[0] = 24;\n        else if (sprite->data[6] == 5)\n            sprite->data[0] = 6;\n        else\n            sprite->data[0] = 12;\n\n        sprite->data[1] = sprite->x;\n        sprite->data[2] = x;\n        sprite->data[3] = sprite->y;\n        sprite->data[4] = y;\n        InitAnimLinearTranslation(sprite);\n        sprite->data[5]++;\n        break;\n    case 1:\n        if (AnimTranslateLinear(sprite))\n        {\n            switch (sprite->data[6])\n            {\n            default:\n                sprite->x += sprite->x2;\n                sprite->y += sprite->y2;\n                sprite->y2 = 0;\n                sprite->x2 = 0;\n                sprite->data[0] = 0;\n                sprite->data[5]++;\n                sprite->data[6]++;\n                break;\n            case 4:\n                sprite->x += sprite->x2;\n                sprite->y += sprite->y2;\n                sprite->y2 = 0;\n                sprite->x2 = 0;\n                sprite->data[5] = 0;\n                sprite->data[6]++;\n                break;\n            case 5:\n                sprite->data[0] = 0;\n                sprite->data[1] = 16;\n                sprite->data[2] = 0;\n                sprite->data[5] = 3;\n                break;\n            }\n        }\n        break;\n    case 2:\n        if (++sprite->data[0] == 4)\n            sprite->data[5] = 0;\n        break;\n    case 3:\n        if (!(sprite->data[0] & 1))\n            sprite->data[1]--;\n        else\n            sprite->data[2]++;\n\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], sprite->data[2]));\n        if (++sprite->data[0] == 32)\n        {\n            sprite->invisible = TRUE;\n            sprite->data[5]++;\n        }\n        break;\n    case 4:\n        DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\nstatic void AnimMeteorMashStar_Step(struct Sprite *sprite)\n{\n    sprite->x2 = ((sprite->data[2] - sprite->data[0]) * sprite->data[5]) / sprite->data[4];\n    sprite->y2 = ((sprite->data[3] - sprite->data[1]) * sprite->data[5]) / sprite->data[4];\n    if (!(sprite->data[5] & 1))\n    {\n        CreateSprite(\n            &gMiniTwinklingStarSpriteTemplate,\n            sprite->x + sprite->x2,\n            sprite->y + sprite->y2, 5);\n    }\n\n    if (sprite->data[5] == sprite->data[4])\n        DestroyAnimSprite(sprite);\n\n    sprite->data[5]++;\n}\n\n// Moves a shooting star across the screen that leaves little twinkling stars behind its path.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: destination x pixel offset\n// arg 3: destination y pixel offset\n// arg 4: duration\nstatic void AnimMeteorMashStar(struct Sprite *sprite)\n{\n    s16 y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    s16 x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n    {\n        sprite->data[0] = sprite->x - gBattleAnimArgs[0];\n        sprite->data[2] = sprite->x - gBattleAnimArgs[2];\n    }\n    else\n    {\n        sprite->data[0] = sprite->x + gBattleAnimArgs[0];\n        sprite->data[2] = sprite->x + gBattleAnimArgs[2];\n    }\n\n    sprite->data[1] = sprite->y + gBattleAnimArgs[1];\n    sprite->data[3] = sprite->y + gBattleAnimArgs[3];\n    sprite->data[4] = gBattleAnimArgs[4];\n    sprite->x = sprite->data[0];\n    sprite->y = sprite->data[1];\n    sprite->callback = AnimMeteorMashStar_Step;\n}\n\nvoid AnimTask_MonToSubstitute(u8 taskId)\n{\n    int i;\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n\n    if (gTasks[taskId].data[0] == 0)\n    {\n        PrepareBattlerSpriteForRotScale(spriteId, FALSE);\n        gTasks[taskId].data[1] = 0x100;\n        gTasks[taskId].data[2] = 0x100;\n        gTasks[taskId].data[0]++;\n    }\n    else if (gTasks[taskId].data[0] == 1)\n    {\n        gTasks[taskId].data[1] += 0x60;\n        gTasks[taskId].data[2] -= 0xD;\n        SetSpriteRotScale(spriteId, gTasks[taskId].data[1], gTasks[taskId].data[2], 0);\n        if (++gTasks[taskId].data[3] == 9)\n        {\n            gTasks[taskId].data[3] = 0;\n            ResetSpriteRotScale(spriteId);\n            gSprites[spriteId].invisible = TRUE;\n            gTasks[taskId].data[0]++;\n        }\n    }\n    else\n    {\n        LoadBattleMonGfxAndAnimate(gBattleAnimAttacker, 0, spriteId);\n        for (i = 0; i < NUM_TASK_DATA; i++)\n            gTasks[taskId].data[i] = 0;\n\n        gTasks[taskId].func = AnimTask_MonToSubstituteDoll;\n    }\n}\n\nstatic void AnimTask_MonToSubstituteDoll(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        gSprites[spriteId].y2 = -200;\n        gSprites[spriteId].x2 = 200;\n        gSprites[spriteId].invisible = FALSE;\n        gTasks[taskId].data[10] = 0;\n        gTasks[taskId].data[0]++;\n        break;\n    case 1:\n        gTasks[taskId].data[10] += 112;\n        gSprites[spriteId].y2 += gTasks[taskId].data[10] >> 8;\n        if (gSprites[spriteId].y + gSprites[spriteId].y2 >= -32)\n            gSprites[spriteId].x2 = 0;\n\n        if (gSprites[spriteId].y2 > 0)\n            gSprites[spriteId].y2 = 0;\n\n        if (gSprites[spriteId].y2 == 0)\n        {\n            PlaySE12WithPanning(SE_M_BUBBLE2, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));\n            gTasks[taskId].data[10] -= 0x800;\n            gTasks[taskId].data[0]++;\n        }\n        break;\n    case 2:\n        gTasks[taskId].data[10] -= 112;\n        if (gTasks[taskId].data[10] < 0)\n            gTasks[taskId].data[10] = 0;\n\n        gSprites[spriteId].y2 -= gTasks[taskId].data[10] >> 8;\n        if (gTasks[taskId].data[10] == 0)\n            gTasks[taskId].data[0]++;\n        break;\n    case 3:\n        gTasks[taskId].data[10] += 112;\n        gSprites[spriteId].y2 += gTasks[taskId].data[10] >> 8;\n        if (gSprites[spriteId].y2 > 0)\n            gSprites[spriteId].y2 = 0;\n\n        if (gSprites[spriteId].y2 == 0)\n        {\n            PlaySE12WithPanning(SE_M_BUBBLE2, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));\n            DestroyAnimVisualTask(taskId);\n        }\n        break;\n    }\n}\n\n// Moves down an X that flickers and disappears.\n// No args.\nstatic void AnimBlockX(struct Sprite *sprite)\n{\n    s16 y;\n\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n    {\n        sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 2;\n        y = -144;\n    }\n    else\n    {\n        sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 2;\n        y = -96;\n    }\n\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->y2 = y;\n    sprite->callback = AnimBlockX_Step;\n}\n\nstatic void AnimBlockX_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->y2 += 10;\n        if (sprite->y2 >= 0)\n        {\n            PlaySE12WithPanning(SE_M_SKETCH, BattleAnimAdjustPanning(SOUND_PAN_TARGET));\n            sprite->y2 = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 1:\n        sprite->data[1] += 4;\n        sprite->y2 = -(gSineTable[sprite->data[1]] >> 3);\n        if (sprite->data[1] > 0x7F)\n        {\n            PlaySE12WithPanning(SE_M_SKETCH, BattleAnimAdjustPanning(SOUND_PAN_TARGET));\n            sprite->data[1] = 0;\n            sprite->y2 = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 2:\n        sprite->data[1] += 6;\n        sprite->y2 = -(gSineTable[sprite->data[1]] >> 4);\n        if (sprite->data[1] > 0x7F)\n        {\n            sprite->data[1] = 0;\n            sprite->y2 = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 3:\n        if (++sprite->data[1] > 8)\n        {\n            PlaySE12WithPanning(SE_M_LEER, BattleAnimAdjustPanning(SOUND_PAN_TARGET));\n            sprite->data[1] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 4:\n        if (++sprite->data[1] > 8)\n        {\n            sprite->data[1] = 0;\n            sprite->data[2]++;\n            sprite->invisible = sprite->data[2] & 1;\n            if (sprite->data[2] == 7)\n                DestroyAnimSprite(sprite);\n        }\n        break;\n    }\n}\n\n// Quickly moves two clones of the target mon back and forth.\n// No args.\nvoid AnimTask_OdorSleuthMovement(u8 taskId)\n{\n    s16 spriteId1, spriteId2;\n\n    spriteId1 = CloneBattlerSpriteWithBlend(ANIM_TARGET);\n    if (spriteId1 < 0)\n    {\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n\n    spriteId2 = CloneBattlerSpriteWithBlend(ANIM_TARGET);\n    if (spriteId2 < 0)\n    {\n        DestroySpriteWithActiveSheet(&gSprites[spriteId1]);\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n\n    gSprites[spriteId2].x2 += 24;\n    gSprites[spriteId1].x2 -= 24;\n    gSprites[spriteId2].data[0] = 0;\n    gSprites[spriteId1].data[0] = 0;\n    gSprites[spriteId2].data[1] = 0;\n    gSprites[spriteId1].data[1] = 0;\n    gSprites[spriteId2].data[2] = 0;\n    gSprites[spriteId1].data[2] = 0;\n    gSprites[spriteId2].data[3] = 16;\n    gSprites[spriteId1].data[3] = -16;\n    gSprites[spriteId2].data[4] = 0;\n    gSprites[spriteId1].data[4] = 128;\n    gSprites[spriteId2].data[5] = 24;\n    gSprites[spriteId1].data[5] = 24;\n    gSprites[spriteId2].data[6] = taskId;\n    gSprites[spriteId1].data[6] = taskId;\n    gSprites[spriteId2].data[7] = 0;\n    gSprites[spriteId1].data[7] = 0;\n    gTasks[taskId].data[0] = 2;\n\n    if (!gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].invisible)\n    {\n        gSprites[spriteId2].invisible = FALSE;\n        gSprites[spriteId1].invisible = TRUE;\n    }\n    else\n    {\n        gSprites[spriteId2].invisible = TRUE;\n        gSprites[spriteId1].invisible = TRUE;\n    }\n\n    gSprites[spriteId2].oam.objMode = ST_OAM_OBJ_NORMAL;\n    gSprites[spriteId1].oam.objMode = ST_OAM_OBJ_NORMAL;\n    gSprites[spriteId2].callback = MoveOdorSleuthClone;\n    gSprites[spriteId1].callback = MoveOdorSleuthClone;\n    gTasks[taskId].func = AnimTask_OdorSleuthMovementWaitFinish;\n}\n\nstatic void AnimTask_OdorSleuthMovementWaitFinish(u8 taskId)\n{\n    if (gTasks[taskId].data[0] == 0)\n        DestroyAnimVisualTask(taskId);\n}\n\nstatic void MoveOdorSleuthClone(struct Sprite *sprite)\n{\n    int zero = 0;\n    \n    if (++sprite->data[1] > 1)\n    {\n        sprite->data[1] = 0;\n        if (!gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].invisible)\n            sprite->invisible ^= 1;\n    }\n\n    sprite->data[4] = sprite->data[4] + sprite->data[3];\n    sprite->data[4] &= 0xFF;\n    sprite->x2 = Cos(sprite->data[4], sprite->data[5]);\n    switch (sprite->data[0])\n    {\n    case 0:\n        if (++sprite->data[2] == 60)\n        {\n            sprite->data[2] = 0;\n            sprite->data[0]++;\n        }\n        break;\n    case 1:\n        if (++sprite->data[2] > 0)\n        {\n            sprite->data[2] = 0;\n            sprite->data[5] -= 2;\n            if (sprite->data[5] < 0)\n            {\n                gTasks[sprite->data[6]].data[sprite->data[7]]--;\n                DestroySpriteWithActiveSheet(sprite);\n            }\n        }\n        break;\n    }\n}\n\nvoid AnimTask_GetReturnPowerLevel(u8 taskId)\n{\n    gBattleAnimArgs[ARG_RET_ID] = 0;\n    if (gAnimFriendship < 60)\n        gBattleAnimArgs[ARG_RET_ID] = 0;\n    if (gAnimFriendship > 60 && gAnimFriendship < 92)\n        gBattleAnimArgs[ARG_RET_ID] = 1;\n    if (gAnimFriendship > 91 && gAnimFriendship < 201)\n        gBattleAnimArgs[ARG_RET_ID] = 2;\n    if (gAnimFriendship > 200)\n        gBattleAnimArgs[ARG_RET_ID] = 3;\n\n    DestroyAnimVisualTask(taskId);\n}\n\n// Makes the mon run out of screen, run past the opposing mon, and return to its original position.\n// No args.\nvoid AnimTask_SnatchOpposingMonMove(u8 taskId)\n{\n    u8 spriteId, spriteId2;\n    u32 personality;\n    u32 otId;\n    u16 species;\n    u8 subpriority;\n    bool8 isBackPic;\n    s16 x;\n\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n        gTasks[taskId].data[1] += 0x800;\n        if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n            gSprites[spriteId].x2 += (gTasks[taskId].data[1] >> 8);\n        else\n            gSprites[spriteId].x2 -= (gTasks[taskId].data[1] >> 8);\n\n        gTasks[taskId].data[1] &= 0xFF;\n        x = gSprites[spriteId].x + gSprites[spriteId].x2;\n        if (x < -32 || x > DISPLAY_WIDTH + 32)\n        {\n            gTasks[taskId].data[1] = 0;\n            gTasks[taskId].data[0]++;\n        }\n        break;\n    case 1:\n        {\n            s16 x;\n\n            if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n            {\n                personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY);\n                otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID);\n                if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE)\n                {\n                    species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);\n                    if(species == SPECIES_DEOXYS)\n                    {\n                        personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_FORME);\n                    }\n                }\n                else\n                    species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies;\n\n                subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1;\n                isBackPic = FALSE;\n                x = DISPLAY_WIDTH + 32;\n            }\n            else\n            {\n                personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY);\n                otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID);\n                if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE)\n                {\n                    species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);\n                    if(species == SPECIES_DEOXYS)\n                    {\n                        personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_FORME);\n                    }\n                }\n                else\n                    species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies;\n\n                subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority - 1;\n                isBackPic = TRUE;\n                x = -32;\n            }\n\n            spriteId2 = CreateAdditionalMonSpriteForMoveAnim(species, isBackPic, 0, x, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y), subpriority, personality, otId, gBattleAnimAttacker, 0);\n            \n            if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies != SPECIES_NONE)\n                BlendPalette(OBJ_PLTT_ID(gSprites[spriteId2].oam.paletteNum), 16, 6, RGB_WHITE);\n            gTasks[taskId].data[15] = spriteId2;\n            gTasks[taskId].data[0]++;\n            break;\n        }\n    case 2:\n        spriteId2 = gTasks[taskId].data[15];\n        gTasks[taskId].data[1] += 0x800;\n        if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n            gSprites[spriteId2].x2 -= (gTasks[taskId].data[1] >> 8);\n        else\n            gSprites[spriteId2].x2 += (gTasks[taskId].data[1] >> 8);\n\n        gTasks[taskId].data[1] &= 0xFF;\n        x = gSprites[spriteId2].x + gSprites[spriteId2].x2;\n        if (gTasks[taskId].data[14] == 0)\n        {\n            if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n            {\n                if (x < GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X))\n                {\n                    gTasks[taskId].data[14]++;\n                    gBattleAnimArgs[7] = 0xFFFF;\n                }\n            }\n            else\n            {\n                if (x > GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X))\n                {\n                    gTasks[taskId].data[14]++;\n                    gBattleAnimArgs[7] = 0xFFFF;\n                }\n            }\n        }\n        if (x < -32 || x > DISPLAY_WIDTH + 32)\n        {\n            gTasks[taskId].data[1] = 0;\n            gTasks[taskId].data[0]++;\n        }\n        break;\n    case 3:\n        spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n        spriteId2 = gTasks[taskId].data[15];\n        DestroySpriteAndFreeResources_(&gSprites[spriteId2]);\n        if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n            gSprites[spriteId].x2 = -gSprites[spriteId].x - 32;\n        else\n            gSprites[spriteId].x2 = DISPLAY_WIDTH + 32 - gSprites[spriteId].x;\n\n        gTasks[taskId].data[0]++;\n        break;\n    case 4:\n        spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n        gTasks[taskId].data[1] += 0x800;\n        if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        {\n            gSprites[spriteId].x2 += (gTasks[taskId].data[1] >> 8);\n            if (gSprites[spriteId].x2 + gSprites[spriteId].x >= GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X))\n                gSprites[spriteId].x2 = 0;\n        }\n        else\n        {\n            gSprites[spriteId].x2 -= (gTasks[taskId].data[1] >> 8);\n            if (gSprites[spriteId].x2 + gSprites[spriteId].x <= GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X))\n                gSprites[spriteId].x2 = 0;\n        }\n\n        gTasks[taskId].data[1] = (u8)gTasks[taskId].data[1];\n        if (gSprites[spriteId].x2 == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void AnimUnusedItemBagSteal(struct Sprite *sprite)\n{\n    switch (sprite->data[7])\n    {\n    case 0:\n        if (gBattleAnimArgs[7] == -1)\n        {\n            PlaySE12WithPanning(SE_M_VITAL_THROW, BattleAnimAdjustPanning(SOUND_PAN_TARGET));\n            sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 16;\n            sprite->data[0] = -32;\n            sprite->data[7]++;\n            sprite->invisible = FALSE;\n            if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)\n                sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority - 1;\n        }\n        else\n        {\n            sprite->invisible = TRUE;\n        }\n        break;\n    case 1:\n        sprite->y2 = Sin(sprite->data[1], sprite->data[0]);\n        sprite->data[1] += 5;\n        if (sprite->data[1] > 0x7F)\n        {\n            sprite->data[0] = sprite->data[0] / 2;\n            sprite->data[3]++;\n            sprite->data[1] -= 0x7F;\n        }\n\n        sprite->data[2] += 0x100;\n        if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n            sprite->x2 -= (sprite->data[2] >> 8);\n        else\n            sprite->x2 += (sprite->data[2] >> 8);\n\n        sprite->data[2] &= 0xFF;\n        if (sprite->data[3] == 2)\n            DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\n// Quickly moves the mon towards its partner and back.\n// No args.\nvoid AnimTask_SnatchPartnerMove(u8 taskId)\n{\n    s16 attackerX, targetX;\n    u8 spriteId;\n\n    switch (gTasks[taskId].data[15])\n    {\n    case 0:\n        attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n        targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n        gTasks[taskId].data[0] = 6;\n        if (attackerX > targetX)\n            gTasks[taskId].data[0] *= -1;\n\n        gTasks[taskId].data[1] = attackerX;\n        gTasks[taskId].data[2] = targetX;\n        gTasks[taskId].data[15]++;\n        break;\n    case 1:\n        spriteId = gBattlerSpriteIds[gBattleAnimAttacker];\n        gSprites[spriteId].x2 += gTasks[taskId].data[0];\n        if (gTasks[taskId].data[0] > 0)\n        {\n            if (gSprites[spriteId].x + gSprites[spriteId].x2 >= gTasks[taskId].data[2])\n                gTasks[taskId].data[15]++;\n        }\n        else\n        {\n            if (gSprites[spriteId].x + gSprites[spriteId].x2 <= gTasks[taskId].data[2])\n                gTasks[taskId].data[15]++;\n        }\n        break;\n    case 2:\n        gTasks[taskId].data[0] *= -1;\n        gTasks[taskId].data[15]++;\n        break;\n    case 3:\n        spriteId = gBattlerSpriteIds[gBattleAnimAttacker];\n        gSprites[spriteId].x2 += gTasks[taskId].data[0];\n        if (gTasks[taskId].data[0] < 0)\n        {\n            if (gSprites[spriteId].x + gSprites[spriteId].x2 <= gTasks[taskId].data[1])\n                gTasks[taskId].data[15]++;\n        }\n        else\n        {\n            if (gSprites[spriteId].x + gSprites[spriteId].x2 >= gTasks[taskId].data[1])\n                gTasks[taskId].data[15]++;\n        }\n        break;\n    case 4:\n    default:\n        spriteId = gBattlerSpriteIds[gBattleAnimAttacker];\n        gSprites[spriteId].x2 = 0;\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Moves the mon's sprite back and forth in an unpredictable swaying motion.\n// No args.\nvoid AnimTask_TeeterDanceMovement(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    \n    task->data[3] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    task->data[4] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : -1;\n    task->data[6] = gSprites[task->data[3]].y;\n    task->data[5] = gSprites[task->data[3]].x;\n    task->data[9] = 0;\n    task->data[11] = 0;\n    task->data[10] = 1;\n    task->data[12] = 0;\n    task->func = AnimTask_TeeterDanceMovement_Step;\n}\n\nstatic void AnimTask_TeeterDanceMovement_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    \n    switch (task->data[0])\n    {\n    case 0:\n        task->data[11] += 8;\n        task->data[11] &= 0xFF;\n        gSprites[task->data[3]].x2 = gSineTable[task->data[11]] >> 5;\n        task->data[9] += 2;\n        task->data[9] &= 0xFF;\n        gSprites[task->data[3]].x = (gSineTable[task->data[9]] >> 3) * task->data[4] + task->data[5];\n        if (task->data[9] == 0)\n        {\n            gSprites[task->data[3]].x = task->data[5];\n            task->data[0]++;\n        }\n        break;\n    case 1:\n        task->data[11] += 8;\n        task->data[11] &= 0xFF;\n        gSprites[task->data[3]].x2 = gSineTable[task->data[11]] >> 5;\n        if (task->data[11] == 0)\n        {\n            gSprites[task->data[3]].x2 = 0;\n            task->data[0]++;\n        }\n        break;\n    case 2:\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void AnimKnockOffStrike_Step(struct Sprite *sprite)\n{\n    // These two cases are identical.\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n    {\n        sprite->data[1] += sprite->data[0];\n        sprite->data[1] &= 0xFF;\n    }\n    else\n    {\n        sprite->data[1] += sprite->data[0];\n        sprite->data[1] &= 0xFF;\n    }\n\n    sprite->x2 = Cos(sprite->data[1], 20);\n    sprite->y2 = Sin(sprite->data[1], 20);\n    if (sprite->animEnded)\n        DestroyAnimSprite(sprite);\n\n    sprite->data[2]++;\n}\n\n// Animates a strike that swipes downard at the target mon.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\nstatic void AnimKnockOffStrike(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n    {\n        sprite->x -= gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n        sprite->data[0] = -11;\n        sprite->data[1] = 192;\n        StartSpriteAffineAnim(sprite, 1);\n    }\n    else\n    {\n        sprite->data[0] = 11;\n        sprite->data[1] = 192;\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n    }\n\n    sprite->callback = AnimKnockOffStrike_Step;\n}\n\n// Gradually fades a rotating recyle arrow sprite in and back out.\n// No args.\nstatic void AnimRecycle(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP);\n    if (sprite->y < 16)\n        sprite->y = 16;\n\n    sprite->data[6] = 0;\n    sprite->data[7] = 16;\n    sprite->callback = AnimRecycle_Step;\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));\n}\n\nstatic void AnimRecycle_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[2])\n    {\n    case 0:\n        if (++sprite->data[0] > 1)\n        {\n            sprite->data[0] = 0;\n            if (!(sprite->data[1] & 1))\n            {\n                if (sprite->data[6] < 16)\n                    sprite->data[6]++;\n            }\n            else\n            {\n                if (sprite->data[7] != 0)\n                    sprite->data[7]--;\n            }\n\n            sprite->data[1]++;\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));\n            if (sprite->data[7] == 0)\n                sprite->data[2]++;\n        }\n        break;\n    case 1:\n        if (++sprite->data[0] == 10)\n        {\n            sprite->data[0] = 0;\n            sprite->data[1] = 0;\n            sprite->data[2]++;\n        }\n        break;\n    case 2:\n        if (++sprite->data[0] > 1)\n        {\n            sprite->data[0] = 0;\n            if (!(sprite->data[1] & 1))\n            {\n                if (sprite->data[6] != 0)\n                    sprite->data[6]--;\n            }\n            else\n            {\n                if (sprite->data[7] < 16)\n                    sprite->data[7]++;\n            }\n\n            sprite->data[1]++;\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));\n            if (sprite->data[7] == 16)\n                sprite->data[2]++;\n        }\n        break;\n    case 3:\n        DestroySpriteAndMatrix(sprite);\n        break;\n    }\n}\n\nvoid AnimTask_GetWeather(u8 taskId)\n{\n    gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_NONE;\n    if (gWeatherMoveAnim & B_WEATHER_SUN)\n        gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SUN;\n    else if (gWeatherMoveAnim & B_WEATHER_RAIN)\n        gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_RAIN;\n    else if (gWeatherMoveAnim & B_WEATHER_SANDSTORM)\n        gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SANDSTORM;\n    else if (gWeatherMoveAnim & B_WEATHER_HAIL)\n        gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_HAIL;\n\n    DestroyAnimVisualTask(taskId);\n}\n\n// Squishes the mon sprite vertically, and shakes it back and forth.\n// arg 0: which battler\nvoid AnimTask_SlackOffSquish(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    \n    task->data[0] = 0;\n    task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n    PrepareAffineAnimInTaskData(task, task->data[15], sSlackOffSquishAffineAnimCmds);\n    task->func = AnimTask_SlackOffSquish_Step;\n}\n\nstatic void AnimTask_SlackOffSquish_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    gTasks[taskId].data[0]++;\n    if (gTasks[taskId].data[0] > 16 && gTasks[taskId].data[0] < 40)\n    {\n        if (++task->data[1] > 2)\n        {\n            task->data[1] = 0;\n            task->data[2]++;\n            if (!(task->data[2] & 1))\n                gSprites[task->data[15]].x2 = -1;\n            else\n                gSprites[task->data[15]].x2 = 1;\n        }\n    }\n    else\n    {\n        gSprites[task->data[15]].x2 = 0;\n    }\n\n    if (!RunAffineAnimFromTaskData(&gTasks[taskId]))\n        DestroyAnimVisualTask(taskId);\n}\n"
  },
  {
    "path": "src/battle_anim_electric.c",
    "content": "#include \"global.h\"\n#include \"battle_anim.h\"\n#include \"trig.h\"\n#include \"sound.h\"\n#include \"constants/songs.h\"\n\nstatic void AnimLightning(struct Sprite *sprite);\nstatic void AnimUnusedSpinningFist(struct Sprite *sprite);\nstatic void AnimUnusedCirclingShock(struct Sprite *sprite);\nstatic void AnimSparkElectricity(struct Sprite *sprite);\nstatic void AnimZapCannonSpark(struct Sprite *sprite);\nstatic void AnimThunderboltOrb(struct Sprite *sprite);\nstatic void AnimSparkElectricityFlashing(struct Sprite *sprite);\nstatic void AnimElectricity(struct Sprite *sprite);\nstatic void AnimElectricBoltSegment(struct Sprite *sprite);\nstatic void AnimThunderWave(struct Sprite *sprite);\nstatic void AnimGrowingChargeOrb(struct Sprite *sprite);\nstatic void AnimElectricPuff(struct Sprite *sprite);\nstatic void AnimVoltTackleOrbSlide(struct Sprite *sprite);\nstatic void AnimVoltTackleBolt(struct Sprite *sprite);\nstatic void AnimGrowingShockWaveOrb(struct Sprite *sprite);\nstatic void AnimShockWaveProgressingBolt(struct Sprite *sprite);\nstatic void AnimLightning_Step(struct Sprite *sprite);\nstatic void AnimUnusedSpinningFist_Step(struct Sprite *sprite);\nstatic void AnimZapCannonSpark_Step(struct Sprite *sprite);\nstatic void AnimSparkElectricityFlashing_Step(struct Sprite *sprite);\nstatic void AnimTask_ElectricBolt_Step(u8 taskId);\nstatic void AnimThunderWave_Step(struct Sprite *sprite);\nstatic void AnimTask_ElectricChargingParticles_Step(u8 taskId);\nstatic void AnimElectricChargingParticles(struct Sprite *sprite);\nstatic void AnimVoltTackleOrbSlide_Step(struct Sprite *sprite);\nstatic bool8 CreateVoltTackleBolt(struct Task *task, u8 taskId);\nstatic bool8 CreateShockWaveBoltSprite(struct Task *task, u8 taskId);\nstatic bool8 CreateShockWaveLightningSprite(struct Task *task, u8 taskId);\nstatic void AnimShockWaveLightning(struct Sprite *sprite);\n\nstatic const union AnimCmd sAnim_Lightning[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(32, 8),\n    ANIMCMD_FRAME(48, 5),\n    ANIMCMD_FRAME(64, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_Lightning[] =\n{\n    sAnim_Lightning,\n};\n\nconst struct SpriteTemplate gLightningSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_LIGHTNING,\n    .paletteTag = ANIM_TAG_LIGHTNING,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_Lightning,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimLightning,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_UnusedSpinningFist[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 20),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -16, 60),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_UnusedSpinningFist[] =\n{\n    sAffineAnim_UnusedSpinningFist,\n};\n\nstatic const struct SpriteTemplate sUnusedSpinningFistSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_UnusedSpinningFist,\n    .callback = AnimUnusedSpinningFist,\n};\n\nstatic const union AnimCmd sAnim_UnusedCirclingShock[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(32, 5),\n    ANIMCMD_FRAME(48, 5),\n    ANIMCMD_FRAME(64, 5),\n    ANIMCMD_FRAME(80, 5),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_UnusedCirclingShock[] =\n{\n    sAnim_UnusedCirclingShock,\n};\n\nstatic const struct SpriteTemplate sUnusedCirclingShockSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SHOCK,\n    .paletteTag = ANIM_TAG_SHOCK,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_UnusedCirclingShock,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimUnusedCirclingShock,\n};\n\nconst struct SpriteTemplate gSparkElectricitySpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARK_2,\n    .paletteTag = ANIM_TAG_SPARK_2,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSparkElectricity,\n};\n\nconst struct SpriteTemplate gZapCannonBallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BLACK_BALL_2,\n    .paletteTag = ANIM_TAG_BLACK_BALL_2,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = TranslateAnimSpriteToTargetMonLocation,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlashingSpark[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 20, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_FlashingSpark[] =\n{\n    sAffineAnim_FlashingSpark,\n};\n\nconst struct SpriteTemplate gZapCannonSparkSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARK_2,\n    .paletteTag = ANIM_TAG_SPARK_2,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_FlashingSpark,\n    .callback = AnimZapCannonSpark,\n};\n\nstatic const union AnimCmd sAnim_ThunderboltOrb[] =\n{\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(16, 6),\n    ANIMCMD_FRAME(32, 6),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_ThunderboltOrb[] =\n{\n    sAnim_ThunderboltOrb,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ThunderboltOrb[] =\n{\n    AFFINEANIMCMD_FRAME(0xE8, 0xE8, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 10),\n    AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 10),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_ThunderboltOrb[] =\n{\n    sAffineAnim_ThunderboltOrb,\n};\n\nconst struct SpriteTemplate gThunderboltOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SHOCK_3,\n    .paletteTag = ANIM_TAG_SHOCK_3,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sAnims_ThunderboltOrb,\n    .images = NULL,\n    .affineAnims = sAffineAnims_ThunderboltOrb,\n    .callback = AnimThunderboltOrb,\n};\n\nconst struct SpriteTemplate gSparkElectricityFlashingSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARK_2,\n    .paletteTag = ANIM_TAG_SPARK_2,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_FlashingSpark,\n    .callback = AnimSparkElectricityFlashing,\n};\n\nconst struct SpriteTemplate gElectricitySpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARK_2,\n    .paletteTag = ANIM_TAG_SPARK_2,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimElectricity,\n};\n\nstatic const struct SpriteTemplate sElectricBoltSegmentSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARK,\n    .paletteTag = ANIM_TAG_SPARK,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimElectricBoltSegment,\n};\n\nconst struct SpriteTemplate gThunderWaveSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARK_H,\n    .paletteTag = ANIM_TAG_SPARK_H,\n    .oam = &gOamData_AffineOff_ObjNormal_32x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimThunderWave,\n};\n\nstatic const s8 sElectricChargingParticleCoordOffsets[][2] =\n{\n    { 58, -60},\n    {-56, -36},\n    {  8, -56},\n    {-16,  56},\n    { 58, -10},\n    {-58,  10},\n    { 48, -18},\n    {-8,   56},\n    { 16, -56},\n    {-58, -42},\n    { 58,  30},\n    {-48,  40},\n    { 12, -48},\n    { 48, -12},\n    {-56,  18},\n    { 48,  48},\n};\n\nstatic const union AnimCmd sAnim_ElectricChargingParticles_0[] =\n{\n    ANIMCMD_FRAME(3, 1),\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_ElectricChargingParticles_1[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(1, 5),\n    ANIMCMD_FRAME(2, 5),\n    ANIMCMD_FRAME(3, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_ElectricChargingParticles[] =\n{\n    sAnim_ElectricChargingParticles_0,\n    sAnim_ElectricChargingParticles_1,\n};\n\nstatic const struct SpriteTemplate gElectricChargingParticlesSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ELECTRIC_ORBS,\n    .paletteTag = ANIM_TAG_ELECTRIC_ORBS,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sAnims_ElectricChargingParticles,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),\n    AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 60),\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_LOOP(0),\n    AFFINEANIMCMD_FRAME(-0x4, -0x4, 0, 5),\n    AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 5),\n    AFFINEANIMCMD_LOOP(10),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_1[] =\n{\n    AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),\n    AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 30),\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x4, -0x4, 0, 5),\n    AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 5),\n    AFFINEANIMCMD_JUMP(3),\n};\n\nstatic const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_2[] =\n{\n    AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),\n    AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 30),\n    AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 30),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_GrowingElectricOrb[] =\n{\n    sAffineAnim_GrowingElectricOrb_0,\n    sAffineAnim_GrowingElectricOrb_1,\n    sAffineAnim_GrowingElectricOrb_2,\n};\n\nconst struct SpriteTemplate gGrowingChargeOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .oam = &gOamData_AffineNormal_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_GrowingElectricOrb,\n    .callback = AnimGrowingChargeOrb,\n};\n\nstatic const union AnimCmd sAnim_ElectricPuff[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_ElectricPuff[] =\n{\n    sAnim_ElectricPuff,\n};\n\nconst struct SpriteTemplate gElectricPuffSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ELECTRICITY,\n    .paletteTag = ANIM_TAG_ELECTRICITY,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_ElectricPuff,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimElectricPuff,\n};\n\nconst struct SpriteTemplate gVoltTackleOrbSlideSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .oam = &gOamData_AffineNormal_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_GrowingElectricOrb,\n    .callback = AnimVoltTackleOrbSlide,\n};\n\nstatic const union AnimCmd sAnim_VoltTackleBolt_0[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_VoltTackleBolt_1[] =\n{\n    ANIMCMD_FRAME(2, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_VoltTackleBolt_2[] =\n{\n    ANIMCMD_FRAME(4, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_VoltTackleBolt_3[] =\n{\n    ANIMCMD_FRAME(6, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_VoltTackleBolt[] =\n{\n    sAnim_VoltTackleBolt_0,\n    sAnim_VoltTackleBolt_1,\n    sAnim_VoltTackleBolt_2,\n    sAnim_VoltTackleBolt_3,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_VoltTackleBolt[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_VoltTackleBolt[] =\n{\n    sAffineAnim_VoltTackleBolt,\n};\n\nstatic const struct SpriteTemplate gVoltTackleBoltSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARK,\n    .paletteTag = ANIM_TAG_SPARK,\n    .oam = &gOamData_AffineDouble_ObjNormal_8x16,\n    .anims = sAnims_VoltTackleBolt,\n    .images = NULL,\n    .affineAnims = sAffineAnims_VoltTackleBolt,\n    .callback = AnimVoltTackleBolt,\n};\n\nconst struct SpriteTemplate gGrowingShockWaveOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .oam = &gOamData_AffineNormal_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_GrowingElectricOrb,\n    .callback = AnimGrowingShockWaveOrb,\n};\n\nstatic const struct SpriteTemplate sShockWaveProgressingBoltSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARK,\n    .paletteTag = ANIM_TAG_SPARK,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimShockWaveProgressingBolt,\n};\n\nstatic void AnimLightning(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->x -= gBattleAnimArgs[0];\n    else\n        sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->callback = AnimLightning_Step;\n}\n\nstatic void AnimLightning_Step(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimUnusedSpinningFist(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->x -= gBattleAnimArgs[0];\n    else\n        sprite->x += gBattleAnimArgs[0];\n    sprite->callback = AnimUnusedSpinningFist_Step;\n}\n\nstatic void AnimUnusedSpinningFist_Step(struct Sprite *sprite)\n{\n    if (sprite->affineAnimEnded)\n        DestroySpriteAndMatrix(sprite);\n}\n\nstatic void AnimUnusedCirclingShock(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->x -= gBattleAnimArgs[0];\n        sprite->y -= gBattleAnimArgs[1];\n    }\n    else\n    {\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n    }\n    sprite->data[0] = 0;\n    sprite->data[1] = gBattleAnimArgs[2];\n    sprite->data[2] = gBattleAnimArgs[3];\n    sprite->data[3] = gBattleAnimArgs[4];\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = TranslateSpriteInCircle;\n}\n\nstatic void AnimSparkElectricity(struct Sprite *sprite)\n{\n    u8 battler;\n    u32 matrixNum;\n    s16 sineVal;\n\n    switch (gBattleAnimArgs[4])\n    {\n    case ANIM_ATTACKER:\n        battler = gBattleAnimAttacker;\n        break;\n    case ANIM_TARGET:\n    default:\n        battler = gBattleAnimTarget;\n        break;\n    case ANIM_ATK_PARTNER:\n        if (!IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))\n            battler = gBattleAnimAttacker;\n        else\n            battler = BATTLE_PARTNER(gBattleAnimAttacker);\n        break;\n    case ANIM_DEF_PARTNER:\n        if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))\n            battler = BATTLE_PARTNER(gBattleAnimTarget);\n        else\n            battler = gBattleAnimTarget;\n        break;\n    }\n    if (gBattleAnimArgs[5] == 0)\n    {\n        sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X);\n        sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y);\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n    sprite->x2 = (gSineTable[gBattleAnimArgs[0]] * gBattleAnimArgs[1]) >> 8;\n    sprite->y2 = (gSineTable[gBattleAnimArgs[0] + 64] * gBattleAnimArgs[1]) >> 8;\n    if (gBattleAnimArgs[6] & 1)\n        sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1;\n    matrixNum = sprite->oam.matrixNum;\n    sineVal = gSineTable[gBattleAnimArgs[2]];\n    gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[gBattleAnimArgs[2] + 64];\n    gOamMatrices[matrixNum].b = sineVal;\n    gOamMatrices[matrixNum].c = -sineVal;\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->callback = DestroyAnimSpriteAfterTimer;\n}\n\nstatic void AnimZapCannonSpark(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, 1);\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    InitAnimLinearTranslation(sprite);\n    sprite->data[5] = gBattleAnimArgs[2];\n    sprite->data[6] = gBattleAnimArgs[5];\n    sprite->data[7] = gBattleAnimArgs[4];\n    sprite->oam.tileNum += gBattleAnimArgs[6] * 4;\n    sprite->callback = AnimZapCannonSpark_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimZapCannonSpark_Step(struct Sprite *sprite)\n{\n    if (!AnimTranslateLinear(sprite))\n    {\n        sprite->x2 += Sin(sprite->data[7], sprite->data[5]);\n        sprite->y2 += Cos(sprite->data[7], sprite->data[5]);\n        sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF;\n        if(!(sprite->data[7] % 3))\n            sprite->invisible ^= 1;\n    }\n    else\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimThunderboltOrb_Step(struct Sprite *sprite)\n{\n    if (--sprite->data[5] == -1)\n    {\n        sprite->invisible ^= 1;\n        sprite->data[5] = sprite->data[4];\n    }\n    if (sprite->data[3]-- <= 0)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimThunderboltOrb(struct Sprite *sprite)\n{\n    if (IsContest() || GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[1];\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];\n    sprite->data[3] = gBattleAnimArgs[0];\n    sprite->data[4] = gBattleAnimArgs[3];\n    sprite->data[5] = gBattleAnimArgs[3];\n    sprite->callback = AnimThunderboltOrb_Step;\n}\n\nstatic void AnimSparkElectricityFlashing(struct Sprite *sprite)\n{\n    u8 battler;\n\n    sprite->data[0] = gBattleAnimArgs[3];\n    if (gBattleAnimArgs[7] & 0x8000)\n        battler = gBattleAnimTarget;\n    else\n        battler = gBattleAnimAttacker;\n    if (IsContest() || GetBattlerSide(battler) == B_SIDE_PLAYER)\n        gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n    sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2) + gBattleAnimArgs[0];\n    sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];\n    sprite->data[4] = gBattleAnimArgs[7] & 0x7FFF;\n    sprite->data[5] = gBattleAnimArgs[2];\n    sprite->data[6] = gBattleAnimArgs[5];\n    sprite->data[7] = gBattleAnimArgs[4];\n    sprite->oam.tileNum += gBattleAnimArgs[6] * 4;\n    sprite->callback = AnimSparkElectricityFlashing_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimSparkElectricityFlashing_Step(struct Sprite *sprite)\n{\n    sprite->x2 = Sin(sprite->data[7], sprite->data[5]);\n    sprite->y2 = Cos(sprite->data[7], sprite->data[5]);\n    sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF;\n    if (sprite->data[7] % sprite->data[4] == 0)\n        sprite->invisible ^= 1;\n    if (sprite->data[0]-- <= 0)\n        DestroyAnimSprite(sprite);\n}\n\n// Electricity arcs around the target. Used for Paralysis and various electric move hits\nstatic void AnimElectricity(struct Sprite *sprite)\n{\n    InitSpritePosToAnimTarget(sprite, FALSE);\n    sprite->oam.tileNum += gBattleAnimArgs[3] * 4;\n    if (gBattleAnimArgs[3] == 1)\n        sprite->oam.matrixNum = ST_OAM_HFLIP;\n    else if (gBattleAnimArgs[3] == 2)\n        sprite->oam.matrixNum = ST_OAM_VFLIP;\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// The vertical falling thunder bolt used in Thunder Wave/Shock/Bolt\nvoid AnimTask_ElectricBolt(u8 taskId)\n{\n    gTasks[taskId].data[0] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[0];\n    gTasks[taskId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[1];\n    gTasks[taskId].data[2] = gBattleAnimArgs[2];\n    gTasks[taskId].func = AnimTask_ElectricBolt_Step;\n}\n\nstatic void AnimTask_ElectricBolt_Step(u8 taskId)\n{\n    u16 r8;\n    u16 r2;\n    s16 r12;\n    u8 spriteId = 0;\n    u8 r7 = 0;\n    u8 sp = gTasks[taskId].data[2];\n    s16 x = gTasks[taskId].data[0];\n    s16 y = gTasks[taskId].data[1];\n\n    if (!gTasks[taskId].data[2])\n    {\n        r8 = 0;\n        r2 = 1;\n        r12 = 16;\n    }\n    else\n    {\n        r12 = 16;\n        r8 = 8;\n        r2 = 4;\n    }\n    switch (gTasks[taskId].data[10])\n    {\n    case 0:\n        r12 *= 1;\n        spriteId = CreateSprite(&sElectricBoltSegmentSpriteTemplate, x, y + r12, 2);\n        ++r7;\n        break;\n    case 2:\n        r12 *= 2;\n        r8 += r2;\n        spriteId = CreateSprite(&sElectricBoltSegmentSpriteTemplate, x, y + r12, 2);\n        ++r7;\n        break;\n    case 4:\n        r12 *= 3;\n        r8 += r2 * 2;\n        spriteId = CreateSprite(&sElectricBoltSegmentSpriteTemplate, x, y + r12, 2);\n        ++r7;\n        break;\n    case 6:\n        r12 *= 4;\n        r8 += r2 * 3;\n        spriteId = CreateSprite(&sElectricBoltSegmentSpriteTemplate, x, y + r12, 2);\n        ++r7;\n        break;\n    case 8:\n        r12 *= 5;\n        spriteId = CreateSprite(&sElectricBoltSegmentSpriteTemplate, x, y + r12, 2);\n        ++r7;\n        break;\n    case 10:\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n    if (r7)\n    {\n        gSprites[spriteId].oam.tileNum += r8;\n        gSprites[spriteId].data[0] = sp;\n        gSprites[spriteId].callback(&gSprites[spriteId]);\n    }\n    ++gTasks[taskId].data[10];\n}\n\nstatic void AnimElectricBoltSegment(struct Sprite *sprite)\n{\n    if (!sprite->data[0])\n    {\n        sprite->oam.shape = SPRITE_SHAPE(8x16);\n        sprite->oam.size = SPRITE_SIZE(8x16);\n    }\n    else\n    {\n        sprite->oam.shape = SPRITE_SHAPE(16x16);\n        sprite->oam.size = SPRITE_SIZE(16x16);\n    }\n    if (++sprite->data[1] == 15)\n        DestroySprite(sprite);\n}\n\n// The horizontal bands of electricity used in Thunder Wave\nstatic void AnimThunderWave(struct Sprite *sprite)\n{\n    u8 spriteId;\n\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    spriteId = CreateSprite(&gThunderWaveSpriteTemplate, sprite->x + 32, sprite->y, sprite->subpriority);\n    gSprites[spriteId].oam.tileNum += 8;\n    ++gAnimVisualTaskCount;\n    gSprites[spriteId].callback = AnimThunderWave_Step;\n    sprite->callback = AnimThunderWave_Step;\n}\n\nstatic void AnimThunderWave_Step(struct Sprite *sprite)\n{\n    if (++sprite->data[0] == 3)\n    {\n        sprite->data[0] = 0;\n        sprite->invisible ^= 1;\n    }\n    if (++sprite->data[1] == 51)\n        DestroyAnimSprite(sprite);\n}\n\n// Animates small electric orbs moving from around the battler inward. For Charge/Shock Wave\nvoid AnimTask_ElectricChargingParticles(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (!gBattleAnimArgs[0])\n    {\n        task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        task->data[15] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n    else\n    {\n        task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        task->data[15] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n    task->data[6] = gBattleAnimArgs[1];\n    task->data[7] = 0;\n    task->data[8] = 0;\n    task->data[9] = 0;\n    task->data[10] = 0;\n    task->data[11] = gBattleAnimArgs[3];\n    task->data[12] = 0;\n    task->data[13] = gBattleAnimArgs[2];\n    task->func = AnimTask_ElectricChargingParticles_Step;\n}\n\nstatic void AnimTask_ElectricChargingParticles_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (task->data[6])\n    {\n        if (++task->data[12] > task->data[13])\n        {\n            u8 spriteId;\n\n            task->data[12] = 0;\n            spriteId = CreateSprite(&gElectricChargingParticlesSpriteTemplate, task->data[14], task->data[15], 2);\n            if (spriteId != MAX_SPRITES)\n            {\n                struct Sprite *sprite = &gSprites[spriteId];\n\n                sprite->x += sElectricChargingParticleCoordOffsets[task->data[9]][0];\n                sprite->y += sElectricChargingParticleCoordOffsets[task->data[9]][1];\n                sprite->data[0] = 40 - task->data[8] * 5;\n                sprite->data[1] = sprite->x;\n                sprite->data[2] = task->data[14];\n                sprite->data[3] = sprite->y;\n                sprite->data[4] = task->data[15];\n                sprite->data[5] = taskId;\n                InitAnimLinearTranslation(sprite);\n                StoreSpriteCallbackInData6(sprite, AnimElectricChargingParticles);\n                sprite->callback = RunStoredCallbackWhenAnimEnds;\n                if (++task->data[9] > 15)\n                    task->data[9] = 0;\n                if (++task->data[10] >= task->data[11])\n                {\n                    task->data[10] = 0;\n                    if (task->data[8] <= 5)\n                        ++task->data[8];\n                }\n                ++task->data[7];\n                --task->data[6];\n            }\n        }\n    }\n    else if(task->data[7] == 0)\n    {\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nstatic void AnimElectricChargingParticles_Step(struct Sprite *sprite)\n{\n    if (AnimTranslateLinear(sprite))\n    {\n        --gTasks[sprite->data[5]].data[7];\n        DestroySprite(sprite);\n    }\n}\n\nstatic void AnimElectricChargingParticles(struct Sprite *sprite)\n{\n    StartSpriteAnim(sprite, 1);\n    sprite->callback = AnimElectricChargingParticles_Step;\n}\n\nstatic void AnimGrowingChargeOrb(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n}\n\n// The quick electric burst at the end of Charge / during the Volt Tackle hit\nstatic void AnimElectricPuff(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n    sprite->x2 = gBattleAnimArgs[1];\n    sprite->y2 = gBattleAnimArgs[2];\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n}\n\n// Creates an orb of electricity that grows then slides off-screen. The attacker slides with it\nstatic void AnimVoltTackleOrbSlide(struct Sprite *sprite)\n{\n    StartSpriteAffineAnim(sprite, 1);\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[6] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    sprite->data[7] = 16;\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)\n        sprite->data[7] *= -1;\n    sprite->callback = AnimVoltTackleOrbSlide_Step;\n}\n\nstatic void AnimVoltTackleOrbSlide_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        if (++sprite->data[1] > 40)\n            ++sprite->data[0];\n        break;\n    case 1:\n        sprite->x += sprite->data[7];\n        gSprites[sprite->data[6]].x2 += sprite->data[7];\n        if ((u16)(sprite->x + 80) > 400)\n            DestroySpriteAndMatrix(sprite);\n        break;\n    }\n}\n\nvoid AnimTask_VoltTackleAttackerReappear(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n        task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        {\n            task->data[14] = -32;\n            task->data[13] = 2;\n        }\n        else\n        {\n            task->data[14] = 32;\n            task->data[13] = -2;\n        }\n        gSprites[task->data[15]].x2 = task->data[14];\n        ++task->data[0];\n        break;\n    case 1:\n        if (++task->data[1] > 1)\n        {\n            task->data[1] = 0;\n            gSprites[task->data[15]].invisible ^= 1;\n\n            if (task->data[14])\n            {\n                task->data[14] += task->data[13];\n                gSprites[task->data[15]].x2 = task->data[14];\n            }\n            else\n            {\n                ++task->data[0];\n            }\n        }\n        break;\n    case 2:\n        if (++task->data[1] > 1)\n        {\n            task->data[1] = 0;\n            gSprites[task->data[15]].invisible ^= 1;\n            if (++task->data[2] == 8)\n                ++task->data[0];\n        }\n        break;\n    case 3:\n        gSprites[task->data[15]].invisible = FALSE;\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// The horizontal bolts of electricity for Volt Tackle\nvoid AnimTask_VoltTackleBolt(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch(task->data[0])\n    {\n    case 0:\n        task->data[1] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : -1;\n        switch (gBattleAnimArgs[0])\n        {\n        case 0:\n            task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n            task->data[5] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n            task->data[4] = (task->data[1] * 128) + 120;\n            break;\n        case 4:\n            task->data[3] = 120 - (task->data[1] * 128);\n            task->data[5] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n            task->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) - (task->data[1] * 32);\n            break;\n        default:\n            if ((gBattleAnimArgs[0] & 1) != 0)\n            {\n                task->data[3] = 256;\n                task->data[4] = -16;\n            }\n            else\n            {\n                task->data[3] = -16;\n                task->data[4] = 256;\n            }\n            if (task->data[1] == 1)\n            {\n                task->data[5] = 80 - gBattleAnimArgs[0] * 10;\n            }\n            else\n            {\n                u16 temp;\n\n                task->data[5] = gBattleAnimArgs[0] * 10 + 40;\n                temp = task->data[3];\n                task->data[3] = task->data[4];\n                task->data[4] = temp;\n            }\n        }\n        if (task->data[3] < task->data[4])\n        {\n            task->data[1] = 1;\n            task->data[6] = 0;\n        }\n        else\n        {\n            task->data[1] = -1;\n            task->data[6] = 3;\n        }\n        ++task->data[0];\n        break;\n    case 1:\n        if (++task->data[2] > 0)\n        {\n            task->data[2] = 0;\n            if (CreateVoltTackleBolt(task, taskId) || CreateVoltTackleBolt(task, taskId))\n                ++task->data[0];\n        }\n        break;\n    case 2:\n        if (task->data[7] == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic bool8 CreateVoltTackleBolt(struct Task *task, u8 taskId)\n{\n    u8 spriteId = CreateSprite(&gVoltTackleBoltSpriteTemplate, task->data[3], task->data[5], 35);\n    \n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].data[6] = taskId;\n        gSprites[spriteId].data[7] = 7;\n        ++task->data[7];\n    }\n    task->data[6] += task->data[1];\n    if (task->data[6] < 0)\n        task->data[6] = 3;\n    if (task->data[6] > 3)\n        task->data[6] = 0;\n    task->data[3] += task->data[1] * 16;\n    if ((task->data[1] == 1 && task->data[3] >= task->data[4])\n     || (task->data[1] == -1 && task->data[3] <= task->data[4]))\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void AnimVoltTackleBolt(struct Sprite *sprite)\n{\n    if (++sprite->data[0] > 12)\n    {\n        --gTasks[sprite->data[6]].data[sprite->data[7]];\n        FreeOamMatrix(sprite->oam.matrixNum);\n        DestroySprite(sprite);\n    }\n}\n\nstatic void AnimGrowingShockWaveOrb(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n        StartSpriteAffineAnim(sprite, 2);\n        ++sprite->data[0];\n        break;\n    case 1:\n        if (sprite->affineAnimEnded)\n            DestroySpriteAndMatrix(sprite);\n        break;\n    }\n}\n\nvoid AnimTask_ShockWaveProgressingBolt(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        task->data[6] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        task->data[7] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n        task->data[8] = 4;\n        task->data[10] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        task->data[9] = (task->data[10] - task->data[6]) / 5;\n        task->data[4] = 7;\n        task->data[5] = -1;\n        task->data[11] = 12;\n        task->data[12] = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);\n        task->data[13] = BattleAnimAdjustPanning(SOUND_PAN_TARGET);\n        task->data[14] = task->data[12];\n        task->data[15] = (task->data[13] - task->data[12]) / 3;\n        ++task->data[0];\n        break;\n    case 1:\n        if (++task->data[1] > 0)\n        {\n            task->data[1] = 0;\n            if (CreateShockWaveBoltSprite(task, taskId))\n            {\n                if (task->data[2] == 5)\n                    task->data[0] = 3;\n                else\n                    ++task->data[0];\n            }\n        }\n        if (task->data[11])\n            --task->data[11];\n        break;\n    case 2:\n        if (task->data[11])\n            --task->data[11];\n        if (++task->data[1] > 4)\n        {\n            task->data[1] = 0;\n            if (task->data[2] & 1)\n            {\n                task->data[7] = 4;\n                task->data[8] = 68;\n                task->data[4] = 0;\n                task->data[5] = 1;\n            }\n            else\n            {\n                task->data[7] = 68;\n                task->data[8] = 4;\n                task->data[4] = 7;\n                task->data[5] = -1;\n            }\n            if (task->data[11])\n                task->data[0] = 4;\n            else\n                task->data[0] = 1;\n        }\n        break;\n    case 3:\n        if (task->data[3] == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    case 4:\n        if (task->data[11])\n            --task->data[11];\n        else\n            task->data[0] = 1;\n        break;\n    }\n}\n\nstatic bool8 CreateShockWaveBoltSprite(struct Task *task, u8 taskId)\n{\n    u8 spriteId = CreateSprite(&sShockWaveProgressingBoltSpriteTemplate, task->data[6], task->data[7], 35);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].oam.tileNum += task->data[4];\n        task->data[4] += task->data[5];\n        if (task->data[4] < 0)\n            task->data[4] = 7;\n        if (task->data[4] > 7)\n            task->data[4] = 0;\n        gSprites[spriteId].data[6] = taskId;\n        gSprites[spriteId].data[7] = 3;\n        ++task->data[3];\n    }\n    if (task->data[4] == 0 && task->data[5] > 0)\n    {\n        task->data[14] += task->data[15];\n        PlaySE12WithPanning(SE_M_THUNDERBOLT, task->data[14]);\n    }\n    if ((task->data[5] < 0 && task->data[7] <= task->data[8])\n     || (task->data[5] > 0 && task->data[7] >= task->data[8]))\n    {\n        ++task->data[2];\n        task->data[6] += task->data[9];\n        return TRUE;\n    }\n    else\n    {\n        task->data[7] += task->data[5] * 8;\n        return FALSE;\n    }\n}\n\n// Just runs timer for sprite. See AnimTask_ShockWaveProgressingBolt\nstatic void AnimShockWaveProgressingBolt(struct Sprite *sprite)\n{\n    if (++sprite->data[0] > 12)\n    {\n        --gTasks[sprite->data[6]].data[sprite->data[7]];\n        DestroySprite(sprite);\n    }\n}\n\nvoid AnimTask_ShockWaveLightning(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        task->data[15] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 32;\n        task->data[14] = task->data[15];\n        while (task->data[14] > 16)\n            task->data[14] -= 32;\n        task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        task->data[12] = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 2;\n        ++task->data[0];\n        break;\n    case 1:\n        if (++task->data[1] > 1)\n        {\n            task->data[1] = 0;\n            if (CreateShockWaveLightningSprite(task, taskId))\n                ++task->data[0];\n        }\n        break;\n    case 2:\n        if (task->data[10] == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic bool8 CreateShockWaveLightningSprite(struct Task *task, u8 taskId)\n{\n    u8 spriteId = CreateSprite(&gLightningSpriteTemplate, task->data[13], task->data[14], task->data[12]);\n    \n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].callback = AnimShockWaveLightning;\n        gSprites[spriteId].data[6] = taskId;\n        gSprites[spriteId].data[7] = 10;\n        ++task->data[10];\n    }\n    if (task->data[14] >= task->data[15])\n        return TRUE;\n    task->data[14] += 32;\n    return FALSE;\n}\n\nstatic void AnimShockWaveLightning(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n    {\n        --gTasks[sprite->data[6]].data[sprite->data[7]];\n        DestroySprite(sprite);\n    }\n}\n"
  },
  {
    "path": "src/battle_anim_fight.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"random.h\"\n#include \"task.h\"\n#include \"trig.h\"\n\nstatic void AnimUnusedHumanoidFoot(struct Sprite *sprite);\nstatic void AnimSlideHandOrFootToTarget(struct Sprite *sprite);\nstatic void AnimJumpKick(struct Sprite *sprite);\nstatic void AnimBasicFistOrFoot(struct Sprite *sprite);\nstatic void AnimFistOrFootRandomPos(struct Sprite *sprite);\nstatic void AnimCrossChopHand(struct Sprite *sprite);\nstatic void AnimSlidingKick(struct Sprite *sprite);\nstatic void AnimSpinningKickOrPunch(struct Sprite *sprite);\nstatic void AnimStompFoot(struct Sprite *sprite);\nstatic void AnimDizzyPunchDuck(struct Sprite *sprite);\nstatic void AnimBrickBreakWall(struct Sprite *sprite);\nstatic void AnimBrickBreakWallShard(struct Sprite *sprite);\nstatic void AnimSuperpowerOrb(struct Sprite *sprite);\nstatic void AnimSuperpowerRock(struct Sprite *sprite);\nstatic void AnimSuperpowerFireball(struct Sprite *sprite);\nstatic void AnimArmThrustHit(struct Sprite *sprite);\nstatic void AnimRevengeScratch(struct Sprite *sprite);\nstatic void AnimFocusPunchFist(struct Sprite *sprite);\nstatic void AnimFistOrFootRandomPos_Step(struct Sprite *sprite);\nstatic void AnimCrossChopHand_Step(struct Sprite *sprite);\nstatic void AnimSlidingKick_Step(struct Sprite *sprite);\nstatic void AnimSpinningKickOrPunchFinish(struct Sprite *sprite);\nstatic void AnimStompFootStep(struct Sprite *sprite);\nstatic void AnimStompFootEnd(struct Sprite *sprite);\nstatic void AnimBrickBreakWall_Step(struct Sprite *sprite);\nstatic void AnimBrickBreakWallShard_Step(struct Sprite *sprite);\nstatic void AnimSuperpowerOrb_Step(struct Sprite *sprite);\nstatic void AnimSuperpowerRock_Step1(struct Sprite *sprite);\nstatic void AnimSuperpowerRock_Step2(struct Sprite *sprite);\n\nstatic const struct SpriteTemplate sUnusedHumanoidFootSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HUMANOID_FOOT,\n    .paletteTag = ANIM_TAG_HUMANOID_FOOT,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimUnusedHumanoidFoot,\n};\n\nstatic const union AnimCmd sAnim_Fist[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_FootWide[] =\n{\n    ANIMCMD_FRAME(16, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_FootTall[] =\n{\n    ANIMCMD_FRAME(32, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_HandLeft[] =\n{\n    ANIMCMD_FRAME(48, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_HandRight[] =\n{\n    ANIMCMD_FRAME(48, 1, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_HandsAndFeet[] =\n{\n    sAnim_Fist,\n    sAnim_FootWide,\n    sAnim_FootTall,\n    sAnim_HandLeft,\n    sAnim_HandRight,\n};\n\nconst struct SpriteTemplate gKarateChopSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_HandsAndFeet,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSlideHandOrFootToTarget,\n};\n\nconst struct SpriteTemplate gJumpKickSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_HandsAndFeet,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimJumpKick,\n};\n\nconst struct SpriteTemplate gFistFootSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_HandsAndFeet,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBasicFistOrFoot,\n};\n\nconst struct SpriteTemplate gFistFootRandomPosSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_HandsAndFeet,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFistOrFootRandomPos,\n};\n\nconst struct SpriteTemplate gCrossChopHandSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = &sAnims_HandsAndFeet[3],\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimCrossChopHand,\n};\n\nconst struct SpriteTemplate gSlidingKickSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = &sAnims_HandsAndFeet[1],\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSlidingKick,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_SpinningHandOrFoot[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x8, -0x8, 20, 1),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_SpinningHandOrFoot[] =\n{\n    sAffineAnim_SpinningHandOrFoot,\n};\n\n// Blaze Kick / Meteor Mash\nconst struct SpriteTemplate gSpinningHandOrFootSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineDouble_ObjNormal_32x32,\n    .anims = sAnims_HandsAndFeet,\n    .images = NULL,\n    .affineAnims = sAffineAnims_SpinningHandOrFoot,\n    .callback = AnimSpinningKickOrPunch,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_MegaPunchKick[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x4, -0x4, 20, 1),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_MegaPunchKick[] =\n{\n    sAffineAnim_MegaPunchKick,\n};\n\nconst struct SpriteTemplate gMegaPunchKickSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineDouble_ObjNormal_32x32,\n    .anims = sAnims_HandsAndFeet,\n    .images = NULL,\n    .affineAnims = sAffineAnims_MegaPunchKick,\n    .callback = AnimSpinningKickOrPunch,\n};\n\nconst struct SpriteTemplate gStompFootSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = &sAnims_HandsAndFeet[1],\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimStompFoot,\n};\n\nconst struct SpriteTemplate gDizzyPunchDuckSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_DUCK,\n    .paletteTag = ANIM_TAG_DUCK,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDizzyPunchDuck,\n};\n\nconst struct SpriteTemplate gBrickBreakWallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BLUE_LIGHT_WALL,\n    .paletteTag = ANIM_TAG_BLUE_LIGHT_WALL,\n    .oam = &gOamData_AffineOff_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBrickBreakWall,\n};\n\nconst struct SpriteTemplate gBrickBreakWallShardSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_TORN_METAL,\n    .paletteTag = ANIM_TAG_TORN_METAL,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBrickBreakWallShard,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_SuperpowerOrb[] =\n{\n    AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 0),\n    AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 64),\n    AFFINEANIMCMD_FRAME(-0x6, -0x6, 0, 8),\n    AFFINEANIMCMD_FRAME(0x6, 0x6, 0, 8),\n    AFFINEANIMCMD_JUMP(2),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_SuperpowerOrb[] =\n{\n    sAffineAnim_SuperpowerOrb,\n};\n\nconst struct SpriteTemplate gSuperpowerOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .oam = &gOamData_AffineDouble_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_SuperpowerOrb,\n    .callback = AnimSuperpowerOrb,\n};\n\nconst struct SpriteTemplate gSuperpowerRockSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FLAT_ROCK,\n    .paletteTag = ANIM_TAG_FLAT_ROCK,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSuperpowerRock,\n};\n\nconst struct SpriteTemplate gSuperpowerFireballSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_METEOR,\n    .paletteTag = ANIM_TAG_METEOR,\n    .oam = &gOamData_AffineOff_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSuperpowerFireball,\n};\n\nconst struct SpriteTemplate gArmThrustHandSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_HandsAndFeet,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimArmThrustHit,\n};\n\nstatic const union AnimCmd sAnim_RevengeSmallScratch_0[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_RevengeSmallScratch_1[] =\n{\n    ANIMCMD_FRAME(0, 4, .vFlip = TRUE),\n    ANIMCMD_FRAME(16, 4, .vFlip = TRUE),\n    ANIMCMD_FRAME(32, 4, .vFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_RevengeSmallScratch_2[] =\n{\n    ANIMCMD_FRAME(0, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 4, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_RevengeSmallScratch[] =\n{\n    sAnim_RevengeSmallScratch_0,\n    sAnim_RevengeSmallScratch_1,\n    sAnim_RevengeSmallScratch_2,\n};\n\nconst struct SpriteTemplate gRevengeSmallScratchSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_PURPLE_SCRATCH,\n    .paletteTag = ANIM_TAG_PURPLE_SCRATCH,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_RevengeSmallScratch,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRevengeScratch,\n};\n\nstatic const union AnimCmd sAnim_RevengeBigScratch_0[] =\n{\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(64, 6),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_RevengeBigScratch_1[] =\n{\n    ANIMCMD_FRAME(0, 6, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(64, 6, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_RevengeBigScratch_2[] =\n{\n    ANIMCMD_FRAME(0, 6, .hFlip = TRUE),\n    ANIMCMD_FRAME(64, 6, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_RevengeBigScratch[] =\n{\n    sAnim_RevengeBigScratch_0,\n    sAnim_RevengeBigScratch_1,\n    sAnim_RevengeBigScratch_2,\n};\n\nconst struct SpriteTemplate gRevengeBigScratchSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_PURPLE_SWIPE,\n    .paletteTag = ANIM_TAG_PURPLE_SWIPE,\n    .oam = &gOamData_AffineOff_ObjNormal_64x64,\n    .anims = sAnims_RevengeBigScratch,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRevengeScratch,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FocusPunchFist[] =\n{\n    AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x20, -0x20, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_FocusPunchFist[] =\n{\n    sAffineAnim_FocusPunchFist,\n};\n\nconst struct SpriteTemplate gFocusPunchFistSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HANDS_AND_FEET,\n    .paletteTag = ANIM_TAG_HANDS_AND_FEET,\n    .oam = &gOamData_AffineDouble_ObjNormal_32x32,\n    .anims = sAnims_HandsAndFeet,\n    .images = NULL,\n    .affineAnims = sAffineAnims_FocusPunchFist,\n    .callback = AnimFocusPunchFist,\n};\n\nstatic void AnimUnusedHumanoidFoot(struct Sprite *sprite)\n{\n    SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = 15;\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nstatic void AnimSlideHandOrFootToTarget(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[7] == 1 && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n        gBattleAnimArgs[3] = -gBattleAnimArgs[3];\n    }\n    StartSpriteAnim(sprite, gBattleAnimArgs[6]);\n    gBattleAnimArgs[6] = 0;\n    AnimTravelDiagonally(sprite);\n}\n\nstatic void AnimJumpKick(struct Sprite *sprite)\n{\n    if (IsContest())\n    {\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n        gBattleAnimArgs[3] = -gBattleAnimArgs[3];\n    }\n    AnimSlideHandOrFootToTarget(sprite);\n}\n\n// Displays a basic fist or foot sprite for a given duration.\n// Used by many fighting moves (and elemental \"punch\" moves).\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: duration\n// arg 3: ? (todo: related to initial pixel offsets)\n// arg 4: anim num\nstatic void AnimBasicFistOrFoot(struct Sprite *sprite)\n{\n    StartSpriteAnim(sprite, gBattleAnimArgs[4]);\n    if (gBattleAnimArgs[3] == 0)\n        InitSpritePosToAnimAttacker(sprite, 1);\n    else\n        InitSpritePosToAnimTarget(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nstatic void AnimFistOrFootRandomPos(struct Sprite *sprite)\n{\n    u8 battler;\n    s16 xMod, yMod;\n    s16 x, y;\n\n    if (gBattleAnimArgs[0] == 0)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n\n    if (gBattleAnimArgs[2] < 0)\n        gBattleAnimArgs[2] = Random() % 5;\n    StartSpriteAnim(sprite, gBattleAnimArgs[2]);\n    sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET);\n    xMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_WIDTH) / 2;\n    yMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4;\n    x = Random() % xMod;\n    y = Random() % yMod;\n    if (Random() & 1)\n        x *= -1;\n    if (Random() & 1)\n        y *= -1;\n    if ((gBattlerPositions[battler] & BIT_SIDE) == B_SIDE_PLAYER)\n        y += 0xFFF0;\n    sprite->x += x;\n    sprite->y += y;\n    sprite->data[0] = gBattleAnimArgs[1];\n    sprite->data[7] = CreateSprite(&gBasicHitSplatSpriteTemplate, sprite->x, sprite->y, sprite->subpriority + 1);\n    if (sprite->data[7] != MAX_SPRITES)\n    {\n        StartSpriteAffineAnim(&gSprites[sprite->data[7]], 0);\n        gSprites[sprite->data[7]].callback = SpriteCallbackDummy;\n    }\n    sprite->callback = AnimFistOrFootRandomPos_Step;\n}\n\nstatic void AnimFistOrFootRandomPos_Step(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        if (sprite->data[7] != MAX_SPRITES)\n        {\n            FreeOamMatrix(gSprites[sprite->data[7]].oam.matrixNum);\n            DestroySprite(&gSprites[sprite->data[7]]);\n        }\n        DestroyAnimSprite(sprite);\n    }\n    else\n    {\n        --sprite->data[0];\n    }\n}\n\nstatic void AnimCrossChopHand(struct Sprite *sprite)\n{\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    sprite->data[0] = 30;\n    if (gBattleAnimArgs[2] == 0)\n    {\n        sprite->data[2] = sprite->x - 20;\n    }\n    else\n    {\n        sprite->data[2] = sprite->x + 20;\n        sprite->hFlip = 1;\n    }\n    sprite->data[4] = sprite->y - 20;\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, AnimCrossChopHand_Step);\n}\n\nstatic void AnimCrossChopHand_Step(struct Sprite *sprite)\n{\n    if (++sprite->data[5] == 11)\n    {\n        sprite->data[2] = sprite->x - sprite->x2;\n        sprite->data[4] = sprite->y - sprite->y2;\n        sprite->data[0] = 8;\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->y2 = 0;\n        sprite->x2 = 0;\n        sprite->callback = StartAnimLinearTranslation;\n        StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    }\n}\n\n// Rolling Kick / Low Kick\nstatic void AnimSlidingKick(struct Sprite *sprite)\n{\n    if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget && GetBattlerPosition(gBattleAnimTarget) < B_POSITION_PLAYER_RIGHT)\n        gBattleAnimArgs[0] *= -1;\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = sprite->x + gBattleAnimArgs[2];\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = sprite->y;\n    InitAnimLinearTranslation(sprite);\n    sprite->data[5] = gBattleAnimArgs[5];\n    sprite->data[6] = gBattleAnimArgs[4];\n    sprite->data[7] = 0;\n    sprite->callback = AnimSlidingKick_Step;\n}\n\nstatic void AnimSlidingKick_Step(struct Sprite *sprite)\n{\n    if (!AnimTranslateLinear(sprite))\n    {\n        sprite->y2 += Sin(sprite->data[7] >> 8, sprite->data[5]);\n        sprite->data[7] += sprite->data[6];\n    }\n    else\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\n// Animates the spinning, shrinking kick or punch, which then\n// reappears at full size. Used by moves such as MOVE_MEGA_PUNCH and MOVE_MEGA_KICK.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: anim num\n// arg 3: spin duration\nstatic void AnimSpinningKickOrPunch(struct Sprite *sprite)\n{\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    StartSpriteAnim(sprite, gBattleAnimArgs[2]);\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, AnimSpinningKickOrPunchFinish);\n}\n\nstatic void AnimSpinningKickOrPunchFinish(struct Sprite *sprite)\n{\n    StartSpriteAffineAnim(sprite, 0);\n    sprite->affineAnimPaused = 1;\n    sprite->data[0] = 20;\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Animates MOVE_STOMP's foot that slides downward.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: initial wait duration\nstatic void AnimStompFoot(struct Sprite *sprite)\n{\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->callback = AnimStompFootStep;\n}\n\nstatic void AnimStompFootStep(struct Sprite *sprite)\n{\n    if (--sprite->data[0] == -1)\n    {\n        sprite->data[0] = 6;\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n        sprite->callback = StartAnimLinearTranslation;\n        StoreSpriteCallbackInData6(sprite, AnimStompFootEnd);\n    }\n}\n\nstatic void AnimStompFootEnd(struct Sprite *sprite)\n{\n    sprite->data[0] = 15;\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nstatic void AnimDizzyPunchDuck(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        InitSpritePosToAnimTarget(sprite, TRUE);\n        sprite->data[1] = gBattleAnimArgs[2];\n        sprite->data[2] = gBattleAnimArgs[3];\n        ++sprite->data[0];\n    }\n    else\n    {\n        sprite->data[4] += sprite->data[1];\n        sprite->x2 = sprite->data[4] >> 8;\n        sprite->y2 = Sin(sprite->data[3], sprite->data[2]);\n        sprite->data[3] = (sprite->data[3] + 3) & 0xFF;\n        if (sprite->data[3] > 100)\n            sprite->invisible = sprite->data[3] % 2;\n        if (sprite->data[3] > 120)\n            DestroyAnimSprite(sprite);\n    }\n}\n\n// The wall that appears when Brick Break is going to shatter the target's defensive wall\nstatic void AnimBrickBreakWall(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[0] == 0)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);\n    }\n    sprite->x += gBattleAnimArgs[1];\n    sprite->y += gBattleAnimArgs[2];\n    sprite->data[0] = 0;\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[2] = gBattleAnimArgs[4];\n    sprite->data[3] = 0;\n    sprite->callback = AnimBrickBreakWall_Step;\n}\n\nstatic void AnimBrickBreakWall_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        if (--sprite->data[1] == 0)\n        {\n            if (sprite->data[2] == 0)\n                DestroyAnimSprite(sprite);\n            else\n                ++sprite->data[0];\n        }\n        break;\n    case 1:\n        if (++sprite->data[1] > 1)\n        {\n            sprite->data[1] = 0;\n            ++sprite->data[3];\n            if (sprite->data[3] & 1)\n                sprite->x2 = 2;\n            else\n                sprite->x2 = -2;\n        }\n\n        if (--sprite->data[2] == 0)\n            DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\n// Piece of shattered defensive wall flies off. Used by Brick Break when the target has a defensive wall\nstatic void AnimBrickBreakWallShard(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[2];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[3];\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[2];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[3];\n    }\n    sprite->oam.tileNum += gBattleAnimArgs[1] * 16;\n    sprite->data[0] = 0;\n    switch (gBattleAnimArgs[1])\n    {\n    case 0:\n        sprite->data[6] = -3;\n        sprite->data[7] = -3;\n        break;\n    case 1:\n        sprite->data[6] = 3;\n        sprite->data[7] = -3;\n        break;\n    case 2:\n        sprite->data[6] = -3;\n        sprite->data[7] = 3;\n        break;\n    case 3:\n        sprite->data[6] = 3;\n        sprite->data[7] = 3;\n        break;\n    default:\n        DestroyAnimSprite(sprite);\n        return;\n    }\n    sprite->callback = AnimBrickBreakWallShard_Step;\n}\n\nstatic void AnimBrickBreakWallShard_Step(struct Sprite *sprite)\n{\n    sprite->x += sprite->data[6];\n    sprite->y += sprite->data[7];\n    if (++sprite->data[0] > 40)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimSuperpowerOrb(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[0] == 0)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n        sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);\n        sprite->data[7] = gBattleAnimTarget;\n    }\n    else\n    {\n        sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget);\n        sprite->data[7] = gBattleAnimAttacker;\n    }\n    sprite->data[0] = 0;\n    sprite->data[1] = 12;\n    sprite->data[2] = 8;\n    sprite->callback = AnimSuperpowerOrb_Step;\n}\n\nstatic void AnimSuperpowerOrb_Step(struct Sprite *sprite)\n{\n    if (++sprite->data[0] == 180)\n    {\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        sprite->data[0] = 16;\n        sprite->data[1] = sprite->x;\n        sprite->data[2] = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_X_2);\n        sprite->data[3] = sprite->y;\n        sprite->data[4] = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_Y_PIC_OFFSET);\n        InitAnimLinearTranslation(sprite);\n        StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n        sprite->callback = AnimTranslateLinear_WithFollowup;\n    }\n}\n\n// Floating rock that flies off to hit the target. Used by Superpower\nstatic void AnimSuperpowerRock(struct Sprite *sprite)\n{\n    sprite->x = gBattleAnimArgs[0];\n    sprite->y = 120;\n    sprite->data[0] = gBattleAnimArgs[3];\n    StorePointerInVars(&sprite->data[4], &sprite->data[5], (void *)(sprite->y << 8));\n    sprite->data[6] = gBattleAnimArgs[1];\n    sprite->oam.tileNum += gBattleAnimArgs[2] * 4;\n    sprite->callback = AnimSuperpowerRock_Step1;\n}\n\nstatic void AnimSuperpowerRock_Step1(struct Sprite *sprite)\n{\n    void *var0;\n\n    if (sprite->data[0] != 0)\n    {\n        var0 = LoadPointerFromVars(sprite->data[4], sprite->data[5]);\n        var0 -= sprite->data[6];\n        StorePointerInVars(&sprite->data[4], &sprite->data[5], var0);\n        var0 = (void *)(((intptr_t)var0) >> 8);\n        sprite->y = (intptr_t)var0;\n        if (sprite->y < -8)\n            DestroyAnimSprite(sprite);\n        else\n            --sprite->data[0];\n    }\n    else\n    {\n        s16 pos0 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        s16 pos1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n        s16 pos2 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        s16 pos3 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n\n        sprite->data[0] = pos2 - pos0;\n        sprite->data[1] = pos3 - pos1;\n        sprite->data[2] = sprite->x << 4;\n        sprite->data[3] = sprite->y << 4;\n        sprite->callback = AnimSuperpowerRock_Step2;\n    }\n}\n\nstatic void AnimSuperpowerRock_Step2(struct Sprite *sprite)\n{\n    u16 edgeX;\n\n    sprite->data[2] += sprite->data[0];\n    sprite->data[3] += sprite->data[1];\n    sprite->x = sprite->data[2] >> 4;\n    sprite->y = sprite->data[3] >> 4;\n    edgeX = sprite->x + 8;\n    if (edgeX > 256 || sprite->y < -8 || sprite->y > 120)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimSuperpowerFireball(struct Sprite *sprite)\n{\n    u8 battler;\n\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattlerAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n        battler = gBattleAnimTarget;\n        sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);\n    }\n    else\n    {\n        battler = gBattleAnimAttacker;\n        sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget);\n    }\n    if (IsContest())\n        sprite->oam.matrixNum |= ST_OAM_HFLIP;\n    else if (GetBattlerSide(battler) == B_SIDE_PLAYER)\n        sprite->oam.matrixNum |= (ST_OAM_HFLIP | ST_OAM_VFLIP);\n    sprite->data[0] = 16;\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET);\n    InitAnimLinearTranslation(sprite);\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = AnimTranslateLinear_WithFollowup;\n}\n\nstatic void AnimArmThrustHit_Step(struct Sprite *sprite)\n{\n    if (sprite->data[0] == sprite->data[4])\n        DestroyAnimSprite(sprite);\n    ++sprite->data[0];\n}\n\nstatic void AnimArmThrustHit(struct Sprite *sprite)\n{\n    u8 turn;\n\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[2] = gBattleAnimArgs[0];\n    sprite->data[3] = gBattleAnimArgs[1];\n    sprite->data[4] = gBattleAnimArgs[2];\n    turn = gAnimMoveTurn;\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n        ++turn;\n    if (turn & 1)\n    {\n        sprite->data[2] = -sprite->data[2];\n        ++sprite->data[1];\n    }\n    StartSpriteAnim(sprite, sprite->data[1]);\n    sprite->x2 = sprite->data[2];\n    sprite->y2 = sprite->data[3];\n    sprite->callback = AnimArmThrustHit_Step;\n}\n\nstatic void AnimRevengeScratch(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[2] == ANIM_ATTACKER)\n        InitSpritePosToAnimAttacker(sprite, 0);\n    else\n        InitSpritePosToAnimTarget(sprite, FALSE);\n    if (IsContest())\n        StartSpriteAnim(sprite, 2);\n    else if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        StartSpriteAnim(sprite, 1);\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Fist shrinks toward target and shakes\nstatic void AnimFocusPunchFist(struct Sprite *sprite)\n{\n    if (sprite->affineAnimEnded)\n    {\n        sprite->data[1] = (sprite->data[1] + 40) & 0xFF;\n        sprite->x2 = Sin(sprite->data[1], 2);\n        if (++sprite->data[0] > 40)\n            DestroyAnimSprite(sprite);\n    }\n}\n\nvoid AnimTask_MoveSkyUppercutBg(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        ToggleBg3Mode(0);\n        task->data[8] = gBattleAnimArgs[0];\n        ++task->data[0];\n        break;\n    case 1:\n        if (--task->data[8] == -1)\n            ++task->data[0];\n        break;\n    case 2:\n    default:\n        task->data[9] += 1280;\n        break;\n    }\n    task->data[10] += 2816;\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n        gBattle_BG3_X += task->data[9] >> 8;\n    else\n        gBattle_BG3_X -= task->data[9] >> 8;\n    gBattle_BG3_Y += task->data[10] >> 8;\n    task->data[9] &= 0xFF;\n    task->data[10] &= 0xFF;\n    if (gBattleAnimArgs[7] == -1)\n    {\n        gBattle_BG3_X = 0;\n        gBattle_BG3_Y = 0;\n        ToggleBg3Mode(1);\n        DestroyAnimVisualTask(taskId);\n    }\n}\n"
  },
  {
    "path": "src/battle_anim_fire.c",
    "content": "#include \"global.h\"\n#include \"battle_anim.h\"\n#include \"sound.h\"\n#include \"util.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"palette.h\"\n#include \"constants/songs.h\"\n\nstatic void AnimFireSpiralInward(struct Sprite *sprite);\nstatic void AnimFireSpread(struct Sprite *sprite);\nstatic void AnimLargeFlame(struct Sprite *sprite);\nstatic void AnimFirePlume(struct Sprite *sprite);\nstatic void AnimUnusedSmallEmber(struct Sprite *sprite);\nstatic void AnimSunlight(struct Sprite *sprite);\nstatic void AnimEmberFlare(struct Sprite *sprite);\nstatic void AnimBurnFlame(struct Sprite *sprite);\nstatic void AnimFireRing(struct Sprite *sprite);\nstatic void AnimFireCross(struct Sprite *sprite);\nstatic void AnimFireSpiralOutward(struct Sprite *sprite);\nstatic void AnimEruptionLaunchRock(struct Sprite *sprite);\nstatic void AnimEruptionFallingRock(struct Sprite *sprite);\nstatic void AnimWillOWispOrb(struct Sprite *sprite);\nstatic void AnimWillOWispFire(struct Sprite *sprite);\nstatic void AnimLargeFlame_Step(struct Sprite *sprite);\nstatic void AnimUnusedSmallEmber_Step(struct Sprite *sprite);\nstatic void AnimFireRing_Step1(struct Sprite *sprite);\nstatic void AnimFireRing_Step2(struct Sprite *sprite);\nstatic void AnimFireRing_Step3(struct Sprite *sprite);\nstatic void UpdateFireRingCircleOffset(struct Sprite *sprite);\nstatic void AnimFireSpiralOutward_Step1(struct Sprite *sprite);\nstatic void AnimFireSpiralOutward_Step2(struct Sprite *sprite);\nstatic void AnimTask_EruptionLaunchRocks_Step(u8 taskId);\nstatic void CreateEruptionLaunchRocks(u8 spriteId, u8 taskId, u8 a3);\nstatic u16 GetEruptionLaunchRockInitialYPos(u8 spriteId);\nstatic void InitEruptionLaunchRockCoordData(struct Sprite *sprite, s16 x, s16 y);\nstatic void UpdateEruptionLaunchRockPos(struct Sprite *sprite);\nstatic void AnimEruptionFallingRock_Step(struct Sprite *sprite);\nstatic void AnimWillOWispOrb_Step(struct Sprite *sprite);\nstatic void AnimTask_MoveHeatWaveTargets_Step(u8 taskId);\n\nstatic const union AnimCmd sAnim_FireSpiralSpread_0[] =\n{\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(48, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_FireSpiralSpread_1[] =\n{\n    ANIMCMD_FRAME(16, 4, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 4, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_FRAME(48, 4, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_FireSpiralSpread[] =\n{\n    sAnim_FireSpiralSpread_0,\n    sAnim_FireSpiralSpread_1,\n};\n\nconst struct SpriteTemplate gFireSpiralInwardSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_FireSpiralSpread,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFireSpiralInward,\n};\n\nconst struct SpriteTemplate gFireSpreadSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_FireSpiralSpread,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFireSpread,\n};\n\nstatic const union AnimCmd sAnim_LargeFlame[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_FRAME(64, 3),\n    ANIMCMD_FRAME(80, 3),\n    ANIMCMD_FRAME(96, 3),\n    ANIMCMD_FRAME(112, 3),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_LargeFlame[] =\n{\n    sAnim_LargeFlame,\n};\n\nstatic const union AnimCmd sAnim_FirePlume[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(32, 5),\n    ANIMCMD_FRAME(48, 5),\n    ANIMCMD_FRAME(64, 5),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_FirePlume[] =\n{\n    sAnim_FirePlume,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_LargeFlame[] =\n{\n    AFFINEANIMCMD_FRAME(0x32, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(0x20, 0x0, 0, 7),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_LargeFlame[] =\n{\n    sAffineAnim_LargeFlame,\n};\n\nconst struct SpriteTemplate gLargeFlameSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FIRE,\n    .paletteTag = ANIM_TAG_FIRE,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sAnims_LargeFlame,\n    .images = NULL,\n    .affineAnims = sAffineAnims_LargeFlame,\n    .callback = AnimLargeFlame,\n};\n\nconst struct SpriteTemplate gLargeFlameScatterSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FIRE,\n    .paletteTag = ANIM_TAG_FIRE,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_LargeFlame,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimLargeFlame,\n};\n\nconst struct SpriteTemplate gFirePlumeSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FIRE_PLUME,\n    .paletteTag = ANIM_TAG_FIRE_PLUME,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_FirePlume,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFirePlume,\n};\n\nstatic const struct SpriteTemplate sUnusedEmberFirePlumeSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_FirePlume,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFirePlume,\n};\n\nstatic const union AnimCmd sAnim_UnusedSmallEmber[] =\n{\n    ANIMCMD_FRAME(16, 6),\n    ANIMCMD_FRAME(32, 6),\n    ANIMCMD_FRAME(48, 6),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_UnusedSmallEmber[] =\n{\n    sAnim_UnusedSmallEmber,\n};\n\nstatic const struct SpriteTemplate sUnusedSmallEmberSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_UnusedSmallEmber,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimUnusedSmallEmber,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_SunlightRay[] =\n{\n    AFFINEANIMCMD_FRAME(0x50, 0x50, 0, 0),\n    AFFINEANIMCMD_FRAME(0x2, 0x2, 10, 1),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_SunlightRay[] =\n{\n    sAffineAnim_SunlightRay,\n};\n\nconst struct SpriteTemplate gSunlightRaySpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SUNLIGHT,\n    .paletteTag = ANIM_TAG_SUNLIGHT,\n    .oam = &gOamData_AffineNormal_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_SunlightRay,\n    .callback = AnimSunlight,\n};\n\nstatic const union AnimCmd sAnim_BasicFire[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(48, 4),\n    ANIMCMD_FRAME(64, 4),\n    ANIMCMD_JUMP(0),\n};\n\nconst union AnimCmd *const gAnims_BasicFire[] =\n{\n    sAnim_BasicFire,\n};\n\nconst struct SpriteTemplate gEmberSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = TranslateAnimSpriteToTargetMonLocation,\n};\n\nconst struct SpriteTemplate gEmberFlareSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gAnims_BasicFire,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimEmberFlare,\n};\n\nconst struct SpriteTemplate gBurnFlameSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gAnims_BasicFire,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBurnFlame,\n};\n\nconst struct SpriteTemplate gFireBlastRingSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gAnims_BasicFire,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFireRing,\n};\n\nstatic const union AnimCmd sAnim_FireBlastCross[] =\n{\n    ANIMCMD_FRAME(32, 6),\n    ANIMCMD_FRAME(48, 6),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_FireBlastCross[] =\n{\n    sAnim_FireBlastCross,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Unused_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Unused_1[] =\n{\n    AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_Unused[] =\n{\n    sAffineAnim_Unused_0,\n    sAffineAnim_Unused_1,\n};\n\nconst struct SpriteTemplate gFireBlastCrossSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_FireBlastCross,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFireCross,\n};\n\nconst struct SpriteTemplate gFireSpiralOutwardSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gAnims_BasicFire,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFireSpiralOutward,\n};\n\nconst struct SpriteTemplate gWeatherBallFireDownSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gAnims_BasicFire,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWeatherBallDown,\n};\n\nstatic const struct SpriteTemplate gEruptionLaunchRockSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WARM_ROCK,\n    .paletteTag = ANIM_TAG_WARM_ROCK,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimEruptionLaunchRock,\n};\n\nstatic const s16 sEruptionLaunchRockSpeeds[][2] =\n{\n    {-2, -5},\n    {-1, -1},\n    { 3, -6},\n    { 4, -2},\n    { 2, -8},\n    {-5, -5},\n    { 4, -7},\n};\n\nconst struct SpriteTemplate gEruptionFallingRockSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WARM_ROCK,\n    .paletteTag = ANIM_TAG_WARM_ROCK,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimEruptionFallingRock,\n};\n\nstatic const union AnimCmd sAnim_WillOWispOrb_0[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_FRAME(12, 5),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_WillOWispOrb_1[] =\n{\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_WillOWispOrb_2[] =\n{\n    ANIMCMD_FRAME(20, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_WillOWispOrb_3[] =\n{\n    ANIMCMD_FRAME(20, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_WillOWispOrb[] =\n{\n    sAnim_WillOWispOrb_0,\n    sAnim_WillOWispOrb_1,\n    sAnim_WillOWispOrb_2,\n    sAnim_WillOWispOrb_3,\n};\n\nconst struct SpriteTemplate gWillOWispOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WISP_ORB,\n    .paletteTag = ANIM_TAG_WISP_ORB,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sAnims_WillOWispOrb,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWillOWispOrb,\n};\n\nstatic const union AnimCmd sAnim_WillOWispFire[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(32, 5),\n    ANIMCMD_FRAME(48, 5),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_WillOWispFire[] =\n{\n    sAnim_WillOWispFire,\n};\n\nconst struct SpriteTemplate gWillOWispFireSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WISP_FIRE,\n    .paletteTag = ANIM_TAG_WISP_FIRE,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_WillOWispFire,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWillOWispFire,\n};\n\n// Directions for shaking up/down or left/right in AnimTask_ShakeTargetInPattern\n// Only first 10 values are ever accessed.\n// First pattern results in larger shakes, second results in faster oscillation\nstatic const s8 sShakeDirsPattern0[16] =\n{\n    -1, -1, 0, 1, 1, 0, 0, -1, -1, 1, 1, 0, 0, -1, 0, 1,\n};\n\nstatic const s8 sShakeDirsPattern1[16] =\n{\n    -1, 0, 1, 0, -1, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, 1,\n};\n\n// For the first stage of Fire Punch\nstatic void AnimFireSpiralInward(struct Sprite *sprite)\n{\n    sprite->data[0] = gBattleAnimArgs[0];\n    sprite->data[1] = 0x3C;\n    sprite->data[2] = 0x9;\n    sprite->data[3] = 0x1E;\n    sprite->data[4] = 0xFE00;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = TranslateSpriteInGrowingCircle;\n    sprite->callback(sprite);\n}\n\n// For the impact spread of fire sprites for moves like Blaze Kick or Fire Punch\nstatic void AnimFireSpread(struct Sprite *sprite)\n{\n    SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[1] = gBattleAnimArgs[2];\n    sprite->data[2] = gBattleAnimArgs[3];\n    sprite->callback = TranslateSpriteLinearFixedPoint;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nstatic void AnimFirePlume(struct Sprite *sprite)\n{\n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->x -= gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n        sprite->data[2] = -gBattleAnimArgs[4];\n    }\n    else\n    {\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n        sprite->data[2] = gBattleAnimArgs[4];\n    }\n    sprite->data[1] = gBattleAnimArgs[2];\n    sprite->data[4] = gBattleAnimArgs[3];\n    sprite->data[3] = gBattleAnimArgs[5];\n    sprite->callback = AnimLargeFlame_Step;\n}\n\nstatic void AnimLargeFlame(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->x -= gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n        sprite->data[2] = gBattleAnimArgs[4];\n    }\n    else\n    {\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n        sprite->data[2] = -gBattleAnimArgs[4];\n    }\n    sprite->data[1] = gBattleAnimArgs[2];\n    sprite->data[4] = gBattleAnimArgs[3];\n    sprite->data[3] = gBattleAnimArgs[5];\n    sprite->callback = AnimLargeFlame_Step;\n}\n\nstatic void AnimLargeFlame_Step(struct Sprite *sprite)\n{\n    if (++sprite->data[0] < sprite->data[4])\n    {\n        sprite->x2 += sprite->data[2];\n        sprite->y2 += sprite->data[3];\n    }\n    if (sprite->data[0] == sprite->data[1])\n        DestroySpriteAndMatrix(sprite);\n}\n\nstatic void AnimUnusedSmallEmber(struct Sprite *sprite)\n{\n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->x -= gBattleAnimArgs[0];\n    }\n    else\n    {\n        sprite->x += gBattleAnimArgs[0];\n        sprite->subpriority = 8;\n    }\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[2] = gBattleAnimArgs[4];\n    sprite->data[3] = gBattleAnimArgs[5];\n    sprite->data[4] = gBattleAnimArgs[6];\n    sprite->data[5] = 0;\n    sprite->callback = AnimUnusedSmallEmber_Step;\n}\n\nstatic void AnimUnusedSmallEmber_Step(struct Sprite *sprite)\n{\n    if (sprite->data[3])\n    {\n        if(sprite->data[5] > 10000)\n            sprite->subpriority = 1;\n        sprite->x2 = Sin(sprite->data[0], sprite->data[1] + (sprite->data[5] >> 8));\n        sprite->y2 = Cos(sprite->data[0], sprite->data[1] + (sprite->data[5] >> 8));\n        sprite->data[0] += sprite->data[2];\n        sprite->data[5] += sprite->data[4];\n        if (sprite->data[0] > 255)\n            sprite->data[0] -= 256;\n        else if (sprite->data[0] < 0)\n            sprite->data[0] += 256;\n        --sprite->data[3];\n    }\n    else\n    {\n        DestroySpriteAndMatrix(sprite);\n    }\n}\n\n// Sunlight from Sunny Day / sunny weather\nstatic void AnimSunlight(struct Sprite *sprite)\n{\n    sprite->x = 0;\n    sprite->y = 0;\n    sprite->data[0] = 60;\n    sprite->data[2] = 140;\n    sprite->data[4] = 80;\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Animates the secondary effect of MOVE_EMBER, where the flames grow and slide\n// horizontally a bit.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: target x pixel offset\n// arg 3: target y pixel offset\n// arg 4: duration\n// arg 5: ? (TODO: something related to which mon the pixel offsets are based on)\n// arg 6: ? (TODO: something related to which mon the pixel offsets are based on)\nstatic void AnimEmberFlare(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)\n     && (gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)\n         || gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)))\n            gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    sprite->callback = AnimTravelDiagonally;\n    sprite->callback(sprite);\n}\n\nstatic void AnimBurnFlame(struct Sprite *sprite)\n{\n    gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n    gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    sprite->callback = AnimTravelDiagonally;\n}\n\n// Animates the a fire sprite in the first-half of the MOVE_FIRE_BLAST\n// animation.  The fire sprite first moves in a circle around the mon,\n// and then it is translated towards the target mon, while still rotating.\n// Lastly, it moves in a circle around the target mon.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: initial wave offset\n//void AnimFireRing(struct Sprite *sprite)\nstatic void AnimFireRing(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[7] = gBattleAnimArgs[2];\n    sprite->data[0] = 0;\n    sprite->callback = AnimFireRing_Step1;\n}\n\nstatic void AnimFireRing_Step1(struct Sprite *sprite)\n{   \n    UpdateFireRingCircleOffset(sprite);\n\n    if (++sprite->data[0] == 0x12)\n    {\n        sprite->data[0] = 0x19;\n        sprite->data[1] = sprite->x;\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->data[3] = sprite->y;\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n        InitAnimLinearTranslation(sprite);\n        sprite->callback = AnimFireRing_Step2;\n    }\n}\n\nstatic void AnimFireRing_Step2(struct Sprite *sprite)\n{\n    if (AnimTranslateLinear(sprite))\n    {\n        sprite->data[0] = 0;\n\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n        sprite->x2 = sprite->y2 = 0;\n        sprite->callback = AnimFireRing_Step3;\n        sprite->callback(sprite);\n    }\n    else\n    {\n        sprite->x2 += Sin(sprite->data[7], 28);\n        sprite->y2 += Cos(sprite->data[7], 28);\n        sprite->data[7] = (sprite->data[7] + 20) & 0xFF;\n    }\n}\n\nstatic void AnimFireRing_Step3(struct Sprite *sprite)\n{\n    UpdateFireRingCircleOffset(sprite);\n    if (++sprite->data[0] == 0x1F)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void UpdateFireRingCircleOffset(struct Sprite *sprite)\n{\n    sprite->x2 = Sin(sprite->data[7], 28);\n    sprite->y2 = Cos(sprite->data[7], 28);\n    sprite->data[7] = (sprite->data[7] + 20) & 0xFF;\n}\n\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: duration\n// arg 3: x delta\n// arg 4: y delta \n// AnimFireCross(struct Sprite *sprite)\nstatic void AnimFireCross(struct Sprite *sprite)\n{\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[2] = gBattleAnimArgs[4];\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = TranslateSpriteLinear;\n}\n\nstatic void AnimFireSpiralOutward(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, 1);\n    sprite->data[1] = gBattleAnimArgs[2];\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->invisible = TRUE;\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, AnimFireSpiralOutward_Step1);\n}\n\nstatic void AnimFireSpiralOutward_Step1(struct Sprite *sprite)\n{\n    sprite->invisible = FALSE;\n    sprite->data[0] = sprite->data[1];\n    sprite->data[1] = 0;\n    sprite->callback = AnimFireSpiralOutward_Step2;\n    sprite->callback(sprite);\n}\n\nstatic void AnimFireSpiralOutward_Step2(struct Sprite *sprite)\n{\n    sprite->x2 = Sin(sprite->data[1], sprite->data[2] >> 8);\n    sprite->y2 = Cos(sprite->data[1], sprite->data[2] >> 8);\n    sprite->data[1] = (sprite->data[1] + 10) & 0xFF;\n    sprite->data[2] += 0xD0;\n    if (--sprite->data[0] == -1)\n        DestroyAnimSprite(sprite);\n}\n\n#define IDX_ACTIVE_SPRITES 6  // Used by the sprite callback to modify the number of active sprites\n\n#define tState            data[0]\n#define tTimer1           data[1]\n#define tTimer2           data[2]\n#define tTimer3           data[3]\n#define tAttackerY        data[4]\n#define tAttackerSide     data[5]\n#define tActiveSprites    data[IDX_ACTIVE_SPRITES]\n// data[8]-data[15] used by BattleAnimHelper_SetSpriteSquashParams / BattleAnimHelper_RunSpriteSquash\n#define tAttackerSpriteId data[15]\n\n#define sSpeedDelay       data[0]\n#define sLaunchStage      data[1]\n#define sX                data[2]\n#define sY                data[3]\n#define sSpeedX           data[4]\n#define sSpeedY           data[5]\n#define sTaskId           data[6]\n#define sActiveSpritesIdx data[7]\n\n// Animates first stage of Eruption where the attacker squishes and launches rocks away from themself\nvoid AnimTask_EruptionLaunchRocks(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->tAttackerSpriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    task->tState = 0;\n    task->tTimer1 = 0;\n    task->tTimer2 = 0;\n    task->tTimer3 = 0;\n    task->tAttackerY = gSprites[task->tAttackerSpriteId].y;\n    task->tAttackerSide = GetBattlerSide(gBattleAnimAttacker);\n    task->tActiveSprites = 0;\n    PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL);\n    task->func = AnimTask_EruptionLaunchRocks_Step;\n}\n\nstatic void AnimTask_EruptionLaunchRocks_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->tState)\n    {\n    case 0:\n        BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x100, 0x100, 0xE0, 0x200, 32);\n        task->tState++;\n    case 1:\n        if (++task->tTimer1 > 1)\n        {\n            task->tTimer1 = 0;\n\n            if (++task->tTimer2 & 1)\n                gSprites[task->tAttackerSpriteId].x2 = 3;\n            else\n                gSprites[task->tAttackerSpriteId].x2 = -3;\n        }\n\n        if (task->tAttackerSide != B_SIDE_PLAYER)\n        {\n            if (++task->tTimer3 > 4)\n            {\n                task->tTimer3 = 0;\n                gSprites[task->tAttackerSpriteId].y++;\n            }\n        }\n\n        if(!BattleAnimHelper_RunSpriteSquash(task))\n        {\n            SetBattlerSpriteYOffsetFromYScale(task->tAttackerSpriteId);\n            gSprites[task->tAttackerSpriteId].x2 = 0;\n\n            task->tTimer1 = 0;\n            task->tTimer2 = 0;\n            task->tTimer3 = 0;\n            task->tState++;\n        }\n        break;\n    case 2:\n        if (++task->tTimer1 > 4)\n        {\n            if (task->tAttackerSide != B_SIDE_PLAYER)\n                BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0xE0, 0x200, 0x180, 0xF0, 6);\n            else\n                BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0xE0, 0x200, 0x180, 0xC0, 6);\n\n            task->tTimer1 = 0;\n            task->tState++;\n        }\n        break;\n    case 3:\n        if (!BattleAnimHelper_RunSpriteSquash(task))\n        {\n            CreateEruptionLaunchRocks(task->tAttackerSpriteId, taskId, IDX_ACTIVE_SPRITES);\n            task->tState++;\n        }\n        break;\n    case 4:\n        if (++task->tTimer1 > 1)\n        {\n            task->tTimer1 = 0;\n\n            if (++task->tTimer2 & 1)\n                gSprites[task->tAttackerSpriteId].y2 += 3;\n            else\n                gSprites[task->tAttackerSpriteId].y2 -= 3;\n        }\n\n        if (++task->tTimer3 > 24)\n        {\n            if (task->tAttackerSide != B_SIDE_PLAYER)\n                BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x180, 0xF0, 0x100, 0x100, 8);\n            else\n                BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x180, 0xC0, 0x100, 0x100, 8);\n\n            if (task->tTimer2 & 1)\n                gSprites[task->tAttackerSpriteId].y2 -= 3;\n\n            task->tTimer1 = 0;\n            task->tTimer2 = 0;\n            task->tTimer3 = 0;\n            task->tState++;\n        }\n        break;\n    case 5:\n        if (task->tAttackerSide != B_SIDE_PLAYER)\n            gSprites[task->tAttackerSpriteId].y--;\n\n        if (!BattleAnimHelper_RunSpriteSquash(task))\n        {\n            gSprites[task->tAttackerSpriteId].y = task->tAttackerY;\n            ResetSpriteRotScale(task->tAttackerSpriteId);\n            task->tTimer2 = 0;\n            task->tState++;\n        }\n        break;\n    case 6:\n        if (task->tActiveSprites == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    default:\n        break;\n    }\n}\n\nstatic void CreateEruptionLaunchRocks(u8 spriteId, u8 taskId, u8 activeSpritesIdx)\n{\n    u16 i, j;\n    s8 sign;\n\n    u16 y = GetEruptionLaunchRockInitialYPos(spriteId);\n    u16 x = gSprites[spriteId].x;\n\n    if(!GetBattlerSide(gBattleAnimAttacker))\n    {\n        x -= 12;\n        sign = 1;\n    }\n    else\n    {\n        x += 16;\n        sign = -1;\n    }\n\n    for (i = 0, j = 0; i <= 6; i++)\n    {\n        u8 spriteId = CreateSprite(&gEruptionLaunchRockSpriteTemplate, x, y, 2);\n\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].oam.tileNum += j * 4 + 0x40;\n\n            if (++j >= 5)\n                j = 0;\n\n            InitEruptionLaunchRockCoordData(&gSprites[spriteId], sEruptionLaunchRockSpeeds[i][0] * sign, sEruptionLaunchRockSpeeds[i][1]);\n            gSprites[spriteId].sTaskId = taskId;\n            gSprites[spriteId].sActiveSpritesIdx = activeSpritesIdx;\n\n            gTasks[taskId].data[activeSpritesIdx]++;\n        }\n    }\n}\n\nstatic void AnimEruptionLaunchRock(struct Sprite *sprite)\n{\n    UpdateEruptionLaunchRockPos(sprite);\n\n    if (sprite->invisible)\n    {\n        gTasks[sprite->sTaskId].data[sprite->sActiveSpritesIdx]--;\n        DestroySprite(sprite);\n    }\n}\n\nstatic u16 GetEruptionLaunchRockInitialYPos(u8 spriteId)\n{\n    s16 y = gSprites[spriteId].y + gSprites[spriteId].y2 + gSprites[spriteId].centerToCornerVecY;\n\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        y += 74;\n    else\n        y += 44;\n\n    return y;\n}\n\nstatic void InitEruptionLaunchRockCoordData(struct Sprite *sprite, s16 speedX, s16 speedY)\n{\n    sprite->sSpeedDelay = 0;\n    sprite->sLaunchStage = 0;\n    sprite->sX = (u16)sprite->x * 8;\n    sprite->sY = (u16)sprite->y * 8;\n    sprite->sSpeedX = speedX * 8;\n    sprite->sSpeedY = speedY * 8;\n}\n\nstatic void UpdateEruptionLaunchRockPos(struct Sprite *sprite)\n{\n    int extraLaunchSpeed;\n    if (++sprite->sSpeedDelay > 2)\n    {\n        sprite->sSpeedDelay = 0;\n        ++sprite->sLaunchStage;\n        extraLaunchSpeed = (u16)sprite->sLaunchStage * (u16)sprite->sLaunchStage;\n        sprite->sY += extraLaunchSpeed;\n    }\n\n    sprite->sX += sprite->sSpeedX;\n    sprite->x = sprite->sX >> 3;\n    sprite->sY += sprite->sSpeedY;\n    sprite->y = sprite->sY >> 3;\n\n    if (sprite->x < -8 || sprite->x > DISPLAY_WIDTH + 8 || sprite->y < -8 || sprite->y > 120)\n        sprite->invisible = TRUE;\n}\n\n#undef IDX_ACTIVE_SPRITES\n#undef tState\n#undef tTimer1\n#undef tTimer2\n#undef tTimer3\n#undef tAttackerY\n#undef tAttackerSide\n#undef tActiveSprites\n#undef tAttackerSpriteId\n#undef sSpeedDelay\n#undef sLaunchStage\n#undef sX\n#undef sY\n#undef sSpeedX\n#undef sSpeedY\n#undef sTaskId\n#undef sActiveSpritesIdx\n\n#define sState       data[0]\n#define sBounceTimer data[1]\n#define sBounceDir   data[2]\n#define sEndTimer    data[3]\n#define sFallDelay   data[6]\n#define sTargetY     data[7]\n\nstatic void AnimEruptionFallingRock(struct Sprite *sprite)\n{\n    sprite->x = gBattleAnimArgs[0];\n    sprite->y = gBattleAnimArgs[1];\n\n    sprite->sState = 0;\n    sprite->sBounceTimer = 0;\n    sprite->sBounceDir = 0;\n    sprite->sFallDelay = gBattleAnimArgs[2];\n    sprite->sTargetY = gBattleAnimArgs[3];\n\n    sprite->oam.tileNum += gBattleAnimArgs[4] * 16;\n    sprite->callback = AnimEruptionFallingRock_Step;\n}\n\nstatic void AnimEruptionFallingRock_Step(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        // Wait to begin falling\n        if (sprite->sFallDelay != 0)\n        {\n            sprite->sFallDelay--;\n            return;\n        }\n\n        sprite->sState++;\n        // fall through\n    case 1:\n        // Rock is falling\n        sprite->y += 8;\n        if (sprite->y >= sprite->sTargetY)\n        {\n            sprite->y = sprite->sTargetY;\n            sprite->sState++;\n        }\n        break;\n    case 2:\n        // Bounce up and down on landing spot\n        if (++sprite->sBounceTimer > 1)\n        {\n            sprite->sBounceTimer = 0;\n            if ((++sprite->sBounceDir & 1) != 0)\n                sprite->y2 = -3;\n            else\n                sprite->y2 = 3;\n        }\n\n        if (++sprite->sEndTimer > 16)\n            DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\n#undef sState\n#undef sBounceTimer\n#undef sBounceDir\n#undef sEndTimer\n#undef sFallDelay\n#undef sTargetY\n\n//wisp orb\nstatic void AnimWillOWispOrb(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        InitSpritePosToAnimAttacker(sprite, FALSE);\n        StartSpriteAnim(sprite, gBattleAnimArgs[2]);\n        sprite->data[7] = gBattleAnimArgs[2];\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            sprite->data[4] = 4;\n        else\n            sprite->data[4] = -4;\n        sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget);\n        ++sprite->data[0];\n        break;\n    case 1:\n        sprite->data[1] += 192;\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            sprite->y2 = -(sprite->data[1] >> 8);\n        else\n            sprite->y2 = sprite->data[1] >> 8;\n        sprite->x2 = Sin(sprite->data[2], sprite->data[4]);\n        sprite->data[2] = (sprite->data[2] + 4) & 0xFF;\n        if (++sprite->data[3] == 1)\n        {\n            sprite->data[3] = 0;\n            ++sprite->data[0];\n        }\n        break;\n    case 2:\n        sprite->x2 = Sin(sprite->data[2], sprite->data[4]);\n        sprite->data[2] = (sprite->data[2] + 4) & 0xFF;\n        if (++sprite->data[3] == 31)\n        {\n            sprite->x += sprite->x2;\n            sprite->y += sprite->y2;\n            sprite->x2 = sprite->y2 = 0;\n            sprite->data[0] = 256;\n            sprite->data[1] = sprite->x;\n            sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n            sprite->data[3] = sprite->y;\n            sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n            InitAnimLinearTranslationWithSpeed(sprite);\n            sprite->callback = AnimWillOWispOrb_Step;\n        }\n        break;\n    }\n}\n\nstatic void AnimWillOWispOrb_Step(struct Sprite *sprite)\n{\n    s16 initialData5, newData5;\n\n    if (!AnimTranslateLinear(sprite))\n    {\n        sprite->x2 += Sin(sprite->data[5], 16);\n        initialData5 = sprite->data[5];\n        sprite->data[5] = (sprite->data[5] + 4) & 0xFF;\n        newData5 = sprite->data[5];\n        if ((initialData5 == 0 || initialData5 > 196) && newData5 > 0 && sprite->data[7] == 0)\n            PlaySE12WithPanning(SE_M_FLAME_WHEEL, gAnimCustomPanning);\n    }\n    else\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimWillOWispFire(struct Sprite *sprite)\n{\n    if (!sprite->data[0])\n    {\n        sprite->data[1] = gBattleAnimArgs[0];\n        ++sprite->data[0];\n    }\n    sprite->data[3] += 0xC0 * 2;\n    sprite->data[4] += 0xA0;\n    sprite->x2 = Sin(sprite->data[1], sprite->data[3] >> 8);\n    sprite->y2 = Cos(sprite->data[1], sprite->data[4] >> 8);\n    sprite->data[1] = (sprite->data[1] + 7) & 0xFF;\n    if (!IsContest())\n    {\n        if (sprite->data[1] < 64 || sprite->data[1] > 195)\n            sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget);\n        else\n            sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1;\n    }\n    else\n    {\n        if (sprite->data[1] < 64 || sprite->data[1] > 195)\n            sprite->subpriority = 0x1D;\n        else\n            sprite->subpriority = 0x1F;\n    }\n    if (++sprite->data[2] > 0x14)\n        sprite->invisible ^= 1;\n    if (sprite->data[2] == 0x1E)\n        DestroyAnimSprite(sprite);\n}\n\nvoid AnimTask_MoveHeatWaveTargets(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->data[12] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : -1;\n    task->data[13] = IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK) + 1;\n    task->data[14] = GetAnimBattlerSpriteId(ANIM_TARGET);\n    task->data[15] = GetAnimBattlerSpriteId(ANIM_DEF_PARTNER);\n    task->func = AnimTask_MoveHeatWaveTargets_Step;\n}\n\nstatic void AnimTask_MoveHeatWaveTargets_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n        case 0:\n            task->data[10] += task->data[12] * 2;\n            if (++task->data[1] >= 2)\n            {\n                task->data[1] = 0;\n                ++task->data[2];\n                if (task->data[2] & 1)\n                    task->data[11] = 2;\n                else\n                    task->data[11] = -2;\n            }\n            for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++)\n                gSprites[task->data[task->data[3] + 14]].x2 = task->data[10] + task->data[11];\n            if (++task->data[9] == 16)\n            {\n                task->data[9] = 0;\n                ++task->data[0];\n            }\n            break;\n        case 1:\n            if (++task->data[1] >= 5)\n            {\n                task->data[1] = 0;\n                ++task->data[2];\n                if (task->data[2] & 1)\n                    task->data[11] = 2;\n                else\n                    task->data[11] = -2;\n            }\n            for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++)\n                gSprites[task->data[task->data[3] + 14]].x2 = task->data[10] + task->data[11];\n            if (++task->data[9] == 96)\n            {\n                task->data[9] = 0;\n                ++task->data[0];\n            }\n            break;\n        case 2:\n            task->data[10] -= task->data[12] * 2;\n            if (++task->data[1] >= 2)\n            {\n                task->data[1] = 0;\n                ++task->data[2];\n                if (task->data[2] & 1)\n                    task->data[11] = 2;\n                else\n                    task->data[11] = -2;\n            }\n            for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++)\n                gSprites[task->data[task->data[3] + 14]].x2 = task->data[10] + task->data[11];\n            if (++task->data[9] == 16)\n                ++task->data[0];\n            break;\n        case 3:\n            for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++)\n                gSprites[task->data[task->data[3] + 14]].x2 = 0;\n            DestroyAnimVisualTask(taskId);\n            break;\n    }\n}\n\n// Used to add a color mask to the battle background.\n// arg 0: opacity\n// arg 1: color code\nvoid AnimTask_BlendBackground(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n\n    GetBattleAnimBg1Data(&animBg);\n    BlendPalette(BG_PLTT_ID(animBg.paletteId), 16, gBattleAnimArgs[0], gBattleAnimArgs[1]);\n    DestroyAnimVisualTask(taskId);\n}\n\n#define tShakeNum    data[0]\n#define tMaxShakes   data[1]\n#define tShakeOffset data[2] // Never read, gBattleAnimArgs[1] is used directly instead\n#define tVertical    data[3]\n#define tPatternId   data[4]\n\n// Shakes target horizontally or vertically tMaxShakes times, following a set pattern of alternations\nvoid AnimTask_ShakeTargetInPattern(u8 taskId)\n{\n    s8 dir;\n    u8 spriteId;\n\n    if (gTasks[taskId].tShakeNum == 0)\n    {\n        gTasks[taskId].tMaxShakes = gBattleAnimArgs[0];\n        gTasks[taskId].tShakeOffset = gBattleAnimArgs[1];\n        gTasks[taskId].tVertical = gBattleAnimArgs[2];\n        gTasks[taskId].tPatternId = gBattleAnimArgs[3];\n    }\n    gTasks[taskId].tShakeNum++;\n\n    spriteId = gBattlerSpriteIds[gBattleAnimTarget];\n\n    if (gTasks[taskId].tPatternId == 0)\n        dir = sShakeDirsPattern0[gTasks[taskId].tShakeNum % 10];\n    else\n        dir = sShakeDirsPattern1[gTasks[taskId].tShakeNum % 10];\n\n    if (gTasks[taskId].tVertical == TRUE)\n        gSprites[spriteId].y2 = gBattleAnimArgs[1] * dir < 0 ? -(gBattleAnimArgs[1] * dir) : gBattleAnimArgs[1] * dir;\n    else\n        gSprites[spriteId].x2 = gBattleAnimArgs[1] * dir;\n\n    if (gTasks[taskId].tShakeNum == gTasks[taskId].tMaxShakes)\n    {\n        gSprites[spriteId].x2 = 0;\n        gSprites[spriteId].y2 = 0;\n        DestroyAnimVisualTask(taskId);\n    }\n}\n"
  },
  {
    "path": "src/battle_anim_flying.c",
    "content": "#include \"global.h\"\n#include \"battle_anim.h\"\n#include \"gflib.h\"\n#include \"trig.h\"\n#include \"constants/battle_anim.h\"\n#include \"random.h\"\n\nstatic void AnimEllipticalGust(struct Sprite *sprite);\nstatic void AnimGustToTarget(struct Sprite *sprite);\nstatic void AnimAirWaveCrescent(struct Sprite *sprite);\nstatic void AnimFlyBallUp(struct Sprite *sprite);\nstatic void AnimFlyBallAttack(struct Sprite *sprite);\nstatic void AnimFallingFeather(struct Sprite *sprite);\nstatic void AnimUnusedBubbleThrow(struct Sprite *sprite);\nstatic void AnimUnusedFeather(struct Sprite *sprite);\nstatic void AnimWhirlwindLine(struct Sprite *sprite);\nstatic void AnimBounceBallShrink(struct Sprite *sprite);\nstatic void AnimBounceBallLand(struct Sprite *sprite);\nstatic void AnimDiveBall(struct Sprite *sprite);\nstatic void AnimDiveWaterSplash(struct Sprite *sprite);\nstatic void AnimSprayWaterDroplet(struct Sprite *sprite);\nstatic void AnimUnusedFlashingLight(struct Sprite *sprite);\nstatic void AnimSkyAttackBird(struct Sprite *sprite);\nstatic void AnimEllipticalGust_Step(struct Sprite *sprite);\nstatic void AnimTask_AnimateGustTornadoPalette_Step(u8 taskId);\nstatic void AnimGustToTarget_Step(struct Sprite *sprite);\nstatic void AnimFlyBallUp_Step(struct Sprite *sprite);\nstatic void AnimFlyBallAttack_Step(struct Sprite *sprite);\nstatic void AnimFallingFeather_Step(struct Sprite *sprite);\nstatic void AnimUnusedFeather_Step(struct Sprite *sprite);\nstatic void AnimWhirlwindLine_Step(struct Sprite *sprite);\nstatic void AnimDiveBall_Step1(struct Sprite *sprite);\nstatic void AnimDiveBall_Step2(struct Sprite *sprite);\nstatic void AnimSprayWaterDroplet_Step(struct Sprite *sprite);\nstatic void AnimUnusedFlashingLight_Step(struct Sprite *sprite);\nstatic void AnimSkyAttackBird_Step(struct Sprite *sprite);\n\nconst struct SpriteTemplate gEllipticalGustSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GUST,\n    .paletteTag = ANIM_TAG_GUST,\n    .oam = &gOamData_AffineOff_ObjNormal_32x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimEllipticalGust,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_GustToTarget[] =\n{\n    AFFINEANIMCMD_FRAME(0x10, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(0xA, 0x0, 0, 24),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_GustToTarget[] =\n{\n    sAffineAnim_GustToTarget,\n};\n\nconst struct SpriteTemplate gGustToTargetSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GUST,\n    .paletteTag = ANIM_TAG_GUST,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_GustToTarget,\n    .callback = AnimGustToTarget,\n};\n\nstatic const union AnimCmd sAffineAnim_AirWaveCrescent[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(0, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 3, .vFlip = TRUE),\n    ANIMCMD_FRAME(0, 3, .vFlip = TRUE, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAffineAnims_AirWaveCrescent[] =\n{\n    sAffineAnim_AirWaveCrescent,\n};\n\nconst struct SpriteTemplate gAirWaveCrescentSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_AIR_WAVE_2,\n    .paletteTag = ANIM_TAG_AIR_WAVE_2,\n    .oam = &gOamData_AffineOff_ObjNormal_32x16,\n    .anims = sAffineAnims_AirWaveCrescent,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimAirWaveCrescent,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlyBallUp[] =\n{\n    AFFINEANIMCMD_FRAME(0x10, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(0x28, 0x0, 0, 6),\n    AFFINEANIMCMD_FRAME(0x0, -0x20, 0, 5),\n    AFFINEANIMCMD_FRAME(-0x10, 0x20, 0, 10),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_FlyBallUp[] =\n{\n    sAffineAnim_FlyBallUp,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlyBallAttack_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 50, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlyBallAttack_1[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -40, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_FlyBallAttack[] =\n{\n    sAffineAnim_FlyBallAttack_0,\n    sAffineAnim_FlyBallAttack_1,\n};\n\nconst struct SpriteTemplate gFlyBallUpSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROUND_SHADOW,\n    .paletteTag = ANIM_TAG_ROUND_SHADOW,\n    .oam = &gOamData_AffineDouble_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_FlyBallUp,\n    .callback = AnimFlyBallUp,\n};\n\nconst struct SpriteTemplate gFlyBallAttackSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROUND_SHADOW,\n    .paletteTag = ANIM_TAG_ROUND_SHADOW,\n    .oam = &gOamData_AffineNormal_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_FlyBallAttack,\n    .callback = AnimFlyBallAttack,\n};\n\nstatic const union AnimCmd sAnim_FallingFeather_0[] =\n{\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_FallingFeather_1[] =\n{\n    ANIMCMD_FRAME(16, 0, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_FallingFeather[] =\n{\n    sAnim_FallingFeather_0,\n    sAnim_FallingFeather_1,\n};\n\nconst struct SpriteTemplate gFallingFeatherSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WHITE_FEATHER,\n    .paletteTag = ANIM_TAG_WHITE_FEATHER,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sAnims_FallingFeather,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFallingFeather,\n};\n\nstatic const u16 sUnusedPal[] = INCBIN_U16(\"graphics/battle_anims/unused/flying.gbapal\");\n\nstatic const struct SpriteTemplate sUnusedBubbleThrowSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_BUBBLES,\n    .paletteTag = ANIM_TAG_SMALL_BUBBLES,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimUnusedBubbleThrow,\n};\n\nstatic const struct SpriteTemplate sUnusedFeatherSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WHITE_FEATHER,\n    .paletteTag = ANIM_TAG_WHITE_FEATHER,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sAnims_FallingFeather,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimUnusedFeather,\n};\n\nstatic const union AnimCmd sAnim_WhirlwindLines[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_FRAME(8, 1),\n    ANIMCMD_FRAME(16, 1),\n    ANIMCMD_FRAME(8, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 1, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_WhirlwindLines[] =\n{\n    sAnim_WhirlwindLines,\n};\n\nconst struct SpriteTemplate gWhirlwindLineSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WHIRLWIND_LINES,\n    .paletteTag = ANIM_TAG_WHIRLWIND_LINES,\n    .oam = &gOamData_AffineOff_ObjNormal_32x16,\n    .anims = sAnims_WhirlwindLines,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWhirlwindLine,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_BounceBallShrink[] =\n{\n    AFFINEANIMCMD_FRAME(0x10, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(0x28, 0x0, 0, 6),\n    AFFINEANIMCMD_FRAME(0x0, -0x20, 0, 5),\n    AFFINEANIMCMD_FRAME(-0x14, 0x0, 0, 7),\n    AFFINEANIMCMD_FRAME(-0x14, -0x14, 0, 5),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_BounceBallShrink[] =\n{\n    sAffineAnim_BounceBallShrink,\n};\n\nconst struct SpriteTemplate gBounceBallShrinkSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROUND_SHADOW,\n    .paletteTag = ANIM_TAG_ROUND_SHADOW,\n    .oam = &gOamData_AffineDouble_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_BounceBallShrink,\n    .callback = AnimBounceBallShrink,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_BounceBallLand[] =\n{\n    AFFINEANIMCMD_FRAME(0xA0, 0x100, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_BounceBallLand[] =\n{\n    sAffineAnim_BounceBallLand,\n};\n\nconst struct SpriteTemplate gBounceBallLandSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROUND_SHADOW,\n    .paletteTag = ANIM_TAG_ROUND_SHADOW,\n    .oam = &gOamData_AffineDouble_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_BounceBallLand,\n    .callback = AnimBounceBallLand,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_DiveBall[] =\n{\n    AFFINEANIMCMD_FRAME(0x10, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(0x28, 0x0, 0, 6),\n    AFFINEANIMCMD_FRAME(0x0, -0x20, 0, 5),\n    AFFINEANIMCMD_FRAME(-0x10, 0x20, 0, 10),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_DiveBall[] =\n{\n    sAffineAnim_DiveBall,\n};\n\nconst struct SpriteTemplate gDiveBallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROUND_SHADOW,\n    .paletteTag = ANIM_TAG_ROUND_SHADOW,\n    .oam = &gOamData_AffineDouble_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_DiveBall,\n    .callback = AnimDiveBall,\n};\n\nstatic const union AffineAnimCmd sAnim_Unused[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x0, 0, 0),\n    AFFINEANIMCMD_FRAME(0x0, 0x20, 0, 12),\n    AFFINEANIMCMD_FRAME(0x0, -0x20, 0, 11),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAnims_Unused[] =\n{\n    sAnim_Unused,\n};\n\nconst struct SpriteTemplate gDiveWaterSplashSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPLASH,\n    .paletteTag = ANIM_TAG_SPLASH,\n    .oam = &gOamData_AffineDouble_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDiveWaterSplash,\n};\n\nconst struct SpriteTemplate gSprayWaterDropletSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SWEAT_BEAD,\n    .paletteTag = ANIM_TAG_SWEAT_BEAD,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSprayWaterDroplet,\n};\n\nstatic const struct SpriteTemplate sUnusedFlashingLightSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .oam = &gOamData_AffineOff_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimUnusedFlashingLight,\n};\n\nconst struct SpriteTemplate gSkyAttackBirdSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BIRD,\n    .paletteTag = ANIM_TAG_BIRD,\n    .oam = &gOamData_AffineDouble_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSkyAttackBird,\n};\n\nstatic void AnimEllipticalGust(struct Sprite *sprite)\n{\n    InitSpritePosToAnimTarget(sprite, FALSE);\n    sprite->y += 20;\n    sprite->data[1] = 191;\n    sprite->callback = AnimEllipticalGust_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimEllipticalGust_Step(struct Sprite *sprite)\n{\n    sprite->x2 = Sin(sprite->data[1], 32);\n    sprite->y2 = Cos(sprite->data[1], 8);\n    sprite->data[1] += 5;\n    sprite->data[1] &= 0xFF;\n    if (++sprite->data[0] == 71)\n        DestroyAnimSprite(sprite);\n}\n\n// Animates the palette on the gust tornado to make it look like its spinning\nvoid AnimTask_AnimateGustTornadoPalette(u8 taskId)\n{\n    gTasks[taskId].data[0] = gBattleAnimArgs[1];\n    gTasks[taskId].data[1] = gBattleAnimArgs[0];\n    gTasks[taskId].data[2] = IndexOfSpritePaletteTag(ANIM_TAG_GUST);\n    gTasks[taskId].func = AnimTask_AnimateGustTornadoPalette_Step;\n}\n\nstatic void AnimTask_AnimateGustTornadoPalette_Step(u8 taskId)\n{\n    u8 data2;\n    u16 temp;\n    s32 i, base;\n\n    if (gTasks[taskId].data[10]++ == gTasks[taskId].data[1])\n    {\n        gTasks[taskId].data[10] = 0;\n        data2 = gTasks[taskId].data[2];\n        temp = gPlttBufferFaded[OBJ_PLTT_ID(data2) + 8];\n        i = 7;\n        base = PLTT_ID(data2);\n        do\n        {\n            gPlttBufferFaded[base + OBJ_PLTT_OFFSET + 1 + i] = gPlttBufferFaded[base + OBJ_PLTT_OFFSET + i];\n        } while (--i > 0);\n\n        gPlttBufferFaded[base + OBJ_PLTT_OFFSET + 1] = temp;\n    }\n    if (--gTasks[taskId].data[0] == 0)\n        DestroyAnimVisualTask(taskId);\n}\n\nstatic void AnimGustToTarget(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    InitAnimLinearTranslation(sprite);\n    sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n    StoreSpriteCallbackInData6(sprite, AnimGustToTarget_Step);\n}\n\nstatic void AnimGustToTarget_Step(struct Sprite *sprite)\n{\n    if (AnimTranslateLinear(sprite))\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimAirWaveCrescent(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n        gBattleAnimArgs[3] = -gBattleAnimArgs[3];\n    }\n    if (IsContest())\n    {\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n        gBattleAnimArgs[3] = -gBattleAnimArgs[3];\n    }\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[4];\n    if (gBattleAnimArgs[6] == 0)\n    {\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n    else\n    {\n        SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);\n    }\n    sprite->data[2] = sprite->data[2] + gBattleAnimArgs[2];\n    sprite->data[4] = sprite->data[4] + gBattleAnimArgs[3];\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    SeekSpriteAnim(sprite, gBattleAnimArgs[5]);\n}\n\nstatic void AnimFlyBallUp(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->callback = AnimFlyBallUp_Step;\n    gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE;\n}\n\nstatic void AnimFlyBallUp_Step(struct Sprite *sprite)\n{\n    if (sprite->data[0] > 0)\n    {\n        --sprite->data[0];\n    }\n    else\n    {\n        sprite->data[2] += sprite->data[1];\n        sprite->y2 -= (sprite->data[2] >> 8);\n    }\n    if (sprite->y + sprite->y2 < -32)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimFlyBallAttack(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->x = DISPLAY_WIDTH + 32;\n        sprite->y = -32;\n        StartSpriteAffineAnim(sprite, 1);\n    }\n    else\n    {\n        sprite->x = -32;\n        sprite->y = -32;\n    }\n    sprite->data[0] = gBattleAnimArgs[0];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    InitAnimLinearTranslation(sprite);\n    sprite->callback = AnimFlyBallAttack_Step;\n}\n\nstatic void AnimFlyBallAttack_Step(struct Sprite *sprite)\n{\n    sprite->data[0] = 1;\n    AnimTranslateLinear(sprite);\n    if (((u16)sprite->data[3] >> 8) > 200)\n    {\n        sprite->x += sprite->x2;\n        sprite->x2 = 0;\n        sprite->data[3] &= 0xFF;\n    }\n    if (sprite->x + sprite->x2 < -32\n     || sprite->x + sprite->x2 > DISPLAY_WIDTH + 32\n     || sprite->y + sprite->y2 > DISPLAY_HEIGHT)\n    {\n        gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = FALSE;\n        DestroyAnimSprite(sprite);\n    }\n}\n\nvoid DestroyAnimSpriteAfterTimer(struct Sprite *sprite)\n{\n    if (sprite->data[0]-- <= 0)\n    {\n        if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)\n        {\n            FreeOamMatrix(sprite->oam.matrixNum);\n            sprite->oam.affineMode = ST_OAM_AFFINE_OFF;\n        }\n        DestroySprite(sprite);\n        --gAnimVisualTaskCount;\n    }\n}\n\nstruct FeatherDanceData\n{\n    u16 unk0_0a:1;\n    u16 unk0_0b:1;\n    u16 unk0_0c:1;\n    u16 unk0_0d:1;\n    u16 unk0_1:4;\n    u16 unk1:8;\n    u16 unk2;\n    s16 unk4;\n    u16 unk6;\n    u16 unk8;\n    u16 unkA;\n    u8 unkC[2];\n    u16 unkE_0:1;\n    u16 unkE_1:15;\n};\n\nstatic void AnimFallingFeather(struct Sprite *sprite)\n{\n    u8 battler, matrixNum, sinIndex;\n    s16 spriteCoord, sinVal;\n    struct FeatherDanceData *data = (struct FeatherDanceData *)sprite->data;\n\n    if (gBattleAnimArgs[7] & 0x100)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n    if (GetBattlerSide(battler) == B_SIDE_PLAYER)\n        gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n    sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_ATTR_HEIGHT) + gBattleAnimArgs[0];\n    spriteCoord = GetBattlerSpriteCoord(battler, BATTLER_COORD_ATTR_WIDTH);\n    sprite->y = spriteCoord + gBattleAnimArgs[1];\n    data->unk8 = sprite->y << 8;\n    data->unkE_1 = spriteCoord + gBattleAnimArgs[6];\n    data->unk0_0c = 1;\n    data->unk2 = gBattleAnimArgs[2] & 0xFF;\n    data->unkA = (gBattleAnimArgs[2] >> 8) & 0xFF;\n    data->unk4 = gBattleAnimArgs[3];\n    data->unk6 = gBattleAnimArgs[4];\n    *(u16 *)(data->unkC) = gBattleAnimArgs[5];\n    if (data->unk2 >= 64 && data->unk2 <= 191)\n    {\n        if (!IsContest())\n            sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1;\n        else\n            sprite->oam.priority = GetBattlerSpriteBGPriority(battler);\n        data->unkE_0 = 0;\n        if (!(data->unk4 & 0x8000))\n        {\n            sprite->hFlip ^= 1;\n            sprite->animNum = sprite->hFlip;\n            sprite->animBeginning = TRUE;\n            sprite->animEnded = FALSE;\n        }\n    }\n    else\n    {\n        sprite->oam.priority = GetBattlerSpriteBGPriority(battler);\n        data->unkE_0 = 1;\n        if (data->unk4 & 0x8000)\n        {\n            sprite->hFlip ^= 1;\n            sprite->animNum = sprite->hFlip;\n\n            sprite->animBeginning = TRUE;\n            sprite->animEnded = FALSE;\n        }\n    }\n    data->unk0_1 = data->unk2 >> 6;\n    sprite->x2 = (gSineTable[data->unk2] * data->unkC[0]) >> 8;\n    matrixNum = sprite->oam.matrixNum;\n    sinIndex = (-sprite->x2 >> 1) + data->unkA;\n    sinVal = gSineTable[sinIndex];\n    gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[sinIndex + 64];\n    if (sprite)\n    {\n        gOamMatrices[matrixNum].b = sinVal;\n        gOamMatrices[matrixNum].c = -sinVal;\n    }\n    else // pointless, exactly the same\n    {\n        gOamMatrices[matrixNum].b = sinVal;\n        gOamMatrices[matrixNum].c = -sinVal;\n    }\n    sprite->callback = AnimFallingFeather_Step;\n}\n\nstatic void AnimFallingFeather_Step(struct Sprite *sprite)\n{\n    u8 matrixNum, sinIndex;\n    s16 sinVal = 0;\n    struct FeatherDanceData *data = (struct FeatherDanceData *)sprite->data;\n    if (data->unk0_0a)\n    {\n        if (data->unk1-- % 256 == 0)\n        {\n            data->unk0_0a = 0;\n            data->unk1 = 0;\n        }\n    }\n    else\n    {\n        switch (data->unk2 / 64)\n        {\n        case 0: \n            if ((u8)data->unk0_1 == 1) //casts to u8 here are necessary for matching\n            {\n                data->unk0_0d = 1;\n                data->unk0_0a = 1;\n                data->unk1 = 0;\n            }\n            else if ((u8)data->unk0_1 == 3)\n            {\n                data->unk0_0b ^= 1;\n                data->unk0_0a = 1;\n                data->unk1 = 0;\n            }\n            else if (data->unk0_0d)\n            {\n                sprite->hFlip ^= 1;\n                sprite->animNum = sprite->hFlip;\n                sprite->animBeginning = TRUE;\n                sprite->animEnded = FALSE;\n                if (data->unk0_0c)\n                {\n                    if (!IsContest())\n                    {\n                        if (!data->unkE_0)\n                        {\n                            --sprite->oam.priority;\n                            data->unkE_0 ^= 1;\n                        }\n                        else\n                        {\n                            ++sprite->oam.priority;\n                            data->unkE_0 ^= 1;\n                        }\n                    }\n                    else\n                    {\n                        if (!data->unkE_0)\n                        {\n                            sprite->subpriority -= 12;\n                            data->unkE_0 ^= 1;\n                        }\n                        else\n                        {\n                            sprite->subpriority += 12;\n                            data->unkE_0 ^= 1;\n                        }\n                    }\n                }\n                data->unk0_0d = 0;\n                data->unk2;\n            }\n            data->unk0_1 = 0;\n            break;\n        case 1:\n            if ((u8)data->unk0_1 == 0)\n            {\n                data->unk0_0d = 1;\n                data->unk0_0a = 1;\n                data->unk1 = 0;\n            }\n            else if ((u8)data->unk0_1 == 2)\n            {\n                data->unk0_0a = 1;\n                data->unk1 = 0;\n            }\n            else if (data->unk0_0d)\n            {\n                sprite->hFlip ^= 1;\n                sprite->animNum = sprite->hFlip;\n                sprite->animBeginning = TRUE;\n                sprite->animEnded = FALSE;\n                if (data->unk0_0c)\n                {\n                    if (!IsContest())\n                    {\n                        if (!data->unkE_0)\n                        {\n                            --sprite->oam.priority;\n                            data->unkE_0 ^= 1;\n                        }\n                        else\n                        {\n                            ++sprite->oam.priority;\n                            data->unkE_0 ^= 1;\n                        }\n                    }\n                    else\n                    {\n                        if (!data->unkE_0)\n                        {\n                            sprite->subpriority -= 12;\n                            data->unkE_0 ^= 1;\n                        }\n                        else\n                        {\n                            sprite->subpriority += 12;\n                            data->unkE_0 ^= 1;\n                        }\n                    }\n                }\n                data->unk0_0d = 0;\n            }\n            data->unk0_1 = 1;\n            break;\n        case 2:\n            if ((u8)data->unk0_1 == 3)\n            {\n                data->unk0_0d = 1;\n                data->unk0_0a = 1;\n                data->unk1 = 0;\n            }\n            else if ((u8)data->unk0_1 == 1)\n            {\n                data->unk0_0a = 1;\n                data->unk1 = 0;\n            }\n            else if (data->unk0_0d)\n            {\n                sprite->hFlip ^= 1;\n                sprite->animNum = sprite->hFlip;\n                sprite->animBeginning = TRUE;\n                sprite->animEnded = FALSE;\n                if (data->unk0_0c)\n                {\n                    if (!IsContest())\n                    {\n                        if (!data->unkE_0)\n                        {\n                            --sprite->oam.priority;\n                            data->unkE_0 ^= 1;\n                        }\n                        else\n                        {\n                            ++sprite->oam.priority;\n                            data->unkE_0 ^= 1;\n                        }\n                    }\n                    else\n                    {\n                        if (!data->unkE_0)\n                        {\n                            sprite->subpriority -= 12;\n                            data->unkE_0 ^= 1;\n                        }\n                        else\n                        {\n                            sprite->subpriority += 12;\n                            data->unkE_0 ^= 1;\n                        }\n                    }\n                }\n                data->unk0_0d = 0;\n            }\n            data->unk0_1 = 2;\n            break;\n        case 3:\n            if ((u8)data->unk0_1 == 2)\n            {\n                data->unk0_0d = 1;\n            }\n            else if ((u8)data->unk0_1 == 0)\n            {\n                data->unk0_0b ^= 1;\n                data->unk0_0a = 1;\n                data->unk1 = 0;\n            }\n            else if (data->unk0_0d)\n            {\n                sprite->hFlip ^= 1;\n                sprite->animNum = sprite->hFlip;\n                sprite->animBeginning = TRUE;\n                sprite->animEnded = FALSE;\n                if (data->unk0_0c)\n                {\n                    if (!IsContest())\n                    {\n                        if (!data->unkE_0)\n                        {\n                            --sprite->oam.priority;\n                            data->unkE_0 ^= 1;\n                        }\n                        else\n                        {\n                            ++sprite->oam.priority;\n                            data->unkE_0 ^= 1;\n                        }\n                    }\n                    else\n                    {\n                        if (!data->unkE_0)\n                        {\n                            sprite->subpriority -= 12;\n                            data->unkE_0 ^= 1;\n                        }\n                        else\n                        {\n                            sprite->subpriority += 12;\n                            data->unkE_0 ^= 1;\n                        }\n                    }\n                }\n                data->unk0_0d = 0;\n            }\n            data->unk0_1 = 3;\n            break;\n        }\n\n        sprite->x2 = ((s32)data->unkC[data->unk0_0b] * gSineTable[data->unk2]) >> 8;\n        matrixNum = sprite->oam.matrixNum;\n\n        sinIndex = (-sprite->x2 >> 1) + data->unkA;\n        sinVal = gSineTable[sinIndex];\n\n        gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[sinIndex + 64];\n        gOamMatrices[matrixNum].b = sinVal;\n        gOamMatrices[matrixNum].c = -sinVal;\n\n        data->unk8 += data->unk6;\n        sprite->y = data->unk8 >> 8;\n        if (data->unk4 & 0x8000)\n            data->unk2 = (data->unk2 - (data->unk4 & 0x7FFF)) & 0xFF;\n        else\n            data->unk2 = (data->unk2 + (data->unk4 & 0x7FFF)) & 0xFF;\n\n        if (sprite->y + sprite->y2 >= data->unkE_1)\n        {\n            sprite->data[0] = 0;\n            sprite->callback = DestroyAnimSpriteAfterTimer;\n        }\n    }\n}\n\nstatic void AnimUnusedBubbleThrow(struct Sprite *sprite)\n{\n    sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget);\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->callback = TranslateAnimSpriteToTargetMonLocation;\n}\n\nstatic void AnimUnusedFeather(struct Sprite *sprite)\n{\n    u8 matrixNum;\n    s16 rn, sinVal;\n\n    sprite->data[1] = gBattleAnimArgs[0];\n    sprite->data[2] = gBattleAnimArgs[1];\n    sprite->data[3] = gBattleAnimArgs[2];\n    if (!IsContest())\n    {\n        if (gBattlerPositions[gBattleAnimTarget] & B_POSITION_OPPONENT_LEFT)\n            sprite->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH) + gBattleAnimArgs[3];\n        else\n            sprite->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH) + 40;\n        if (gBattleAnimArgs[4])\n            sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1;\n        else\n            sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget);\n    }\n    else\n    {\n        sprite->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH) + gBattleAnimArgs[3];\n    }\n    sprite->data[4] = gSineTable[sprite->data[1] & 0xFF];\n    sprite->data[5] = -gSineTable[(sprite->data[1] & 0xFF) + 64];\n    sprite->data[6] = 0;\n    sprite->y2 = 0;\n    sprite->x2 = 0;\n    matrixNum = sprite->oam.matrixNum;\n    sprite->data[1] = (u16)sprite->data[1] >> 8;\n    rn = Random();\n    if (rn & 0x8000)\n        sprite->data[1] = 0xFF - sprite->data[1];\n    sinVal = gSineTable[sprite->data[1]];\n    gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[sprite->data[1] + 64];\n    gOamMatrices[matrixNum].b = sinVal;\n    gOamMatrices[matrixNum].c = -sinVal;\n    sprite->animBeginning = TRUE;\n    sprite->animEnded = FALSE;\n    if (rn & 1)\n    {\n        sprite->animNum = 1;\n        sprite->hFlip = TRUE;\n    }\n    sprite->callback = AnimUnusedFeather_Step;\n}\n\nstatic void AnimUnusedFeather_Step(struct Sprite *sprite)\n{\n    struct FeatherDanceData fData;\n    struct FeatherDanceData *tData = (struct FeatherDanceData *)sprite->data;\n    u8 item;\n    u32 x, y;\n\n    ++sprite->data[0];\n    if (sprite->data[0] <= 4)\n        return;\n    sprite->x2 = (sprite->data[4] * sprite->data[6]) >> 8;\n    sprite->y2 = (sprite->data[5] * sprite->data[6]) >> 8;\n    sprite->data[6] += sprite->data[3] & 0xFF;\n    if (sprite->data[6] < (sprite->data[2] & 0xFF))\n        return;\n    sprite->x += sprite->x2;\n    sprite->y += sprite->y2;\n    sprite->x2 = 0;\n    sprite->y2 = 0;\n    memcpy(&fData, tData, sizeof(struct FeatherDanceData));\n    memset(tData, 0, sizeof(struct FeatherDanceData));\n    tData->unk8 = sprite->y << 8;\n    tData->unk6 = fData.unk6 >> 8;\n    tData->unk2 = 0;\n    tData->unkA = fData.unk2;\n    if (sprite->animNum != 0)\n    {\n        if (tData->unk6 & 8)\n            tData->unk4 = 0x8001;\n        else\n            tData->unk4 = 0x8002;\n    }\n    else if (tData->unk6 & 8)\n    {\n        tData->unk4 = 1;\n    }\n    else\n    {\n        tData->unk4 = 2;\n    }\n    item = fData.unk4 >> 8;\n    tData->unkC[0] = item;\n    tData->unkC[1] = item - 2;\n    x = (((u16 *)&fData)[7] << 1);\n    y = (((u16 *)tData)[7] & 1);\n    ((u16 *)tData)[7] = y | x;\n    sprite->callback = AnimFallingFeather_Step;\n}\n\nstatic void AnimWhirlwindLine(struct Sprite *sprite)\n{\n    u16 arg;\n    u8 mult;\n\n    if (gBattleAnimArgs[2] == ANIM_ATTACKER)\n        InitSpritePosToAnimAttacker(sprite, 0);\n    else\n        InitSpritePosToAnimTarget(sprite, FALSE);\n    if ((gBattleAnimArgs[2] == ANIM_ATTACKER && GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n     || (gBattleAnimArgs[2] == ANIM_TARGET && GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER))\n        sprite->x += 8;\n    SeekSpriteAnim(sprite, gBattleAnimArgs[4]);\n    sprite->x -= 32;\n    sprite->data[1] = 0x0ccc;\n    arg = gBattleAnimArgs[4];\n    mult = 12;\n    sprite->x2 += mult * arg;\n    sprite->data[0] = arg;\n    sprite->data[7] = gBattleAnimArgs[3];\n    sprite->callback = AnimWhirlwindLine_Step;\n}\n\nstatic void AnimWhirlwindLine_Step(struct Sprite *sprite)\n{\n    sprite->x2 += sprite->data[1] >> 8;\n    if (++sprite->data[0] == 6)\n    {\n        sprite->data[0] = 0;\n        sprite->x2 = 0;\n        StartSpriteAnim(sprite, 0);\n    }\n\n    if (--sprite->data[7] == -1)\n        DestroyAnimSprite(sprite);\n}\n\nvoid AnimTask_DrillPeckHitSplats(u8 taskId)\n{\n    if (!(gTasks[taskId].data[0] % 32))\n    {\n        ++gAnimVisualTaskCount;\n        gBattleAnimArgs[0] = Sin(gTasks[taskId].data[0], -13);\n        gBattleAnimArgs[1] = Cos(gTasks[taskId].data[0], -13);\n        gBattleAnimArgs[2] = 1;\n        gBattleAnimArgs[3] = 3;\n        CreateSpriteAndAnimate(&gFlashingHitSplatSpriteTemplate,\n                               GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2),\n                               GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET),\n                               3);\n    }\n    gTasks[taskId].data[0] += 8;\n    if (gTasks[taskId].data[0] > 255)\n        DestroyAnimVisualTask(taskId);\n}\n\nstatic void AnimBounceBallShrink(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        InitSpritePosToAnimAttacker(sprite, 1);\n        gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE;\n        ++sprite->data[0];\n        break;\n    case 1:\n        if (sprite->affineAnimEnded)\n            DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\nstatic void AnimBounceBallLand(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);\n        sprite->y2 = -sprite->y - 32;\n        ++sprite->data[0];\n        break;\n    case 1:\n        sprite->y2 += 10;\n        if (sprite->y2 >= 0)\n            ++sprite->data[0];\n        break;\n    case 2:\n        sprite->y2 -= 10;\n        if (sprite->y + sprite->y2 < -32)\n        {\n            gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = FALSE;\n            DestroyAnimSprite(sprite);\n        }\n        break;\n    }\n}\n\nstatic void AnimDiveBall(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, 1);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->callback = AnimDiveBall_Step1;\n    gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE;\n}\n\nstatic void AnimDiveBall_Step1(struct Sprite *sprite)\n{\n    if (sprite->data[0] > 0)\n    {\n        --sprite->data[0];\n    }\n    else if (sprite->y + sprite->y2 > -32)\n    {\n        sprite->data[2] += sprite->data[1];\n        sprite->y2 -= (sprite->data[2] >> 8);\n    }\n    else\n    {\n        sprite->invisible = TRUE;\n        if (sprite->data[3]++ > 20)\n            sprite->callback = AnimDiveBall_Step2;\n    }\n}\n\nstatic void AnimDiveBall_Step2(struct Sprite *sprite)\n{\n    sprite->y2 += sprite->data[2] >> 8;\n    if (sprite->y + sprite->y2 > -32)\n        sprite->invisible = FALSE;\n    if (sprite->y2 > 0)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimDiveWaterSplash(struct Sprite *sprite)\n{\n    u32 matrixNum;\n    s32 t1, t2;\n\n    switch (sprite->data[0])\n    {\n    case 0:\n        if (!gBattleAnimArgs[0])\n        {\n            sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n            sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n        }\n        else\n        {\n            sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n            sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);\n        }\n        sprite->data[1] = 512;\n        TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0);\n        ++sprite->data[0];\n        break;\n    case 1:\n        if (sprite->data[2] <= 11)\n            sprite->data[1] -= 40;\n        else\n            sprite->data[1] += 40;\n        ++sprite->data[2];\n        TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0);\n        matrixNum = sprite->oam.matrixNum;\n        t1 = 15616;\n        t2 = t1 / gOamMatrices[matrixNum].d + 1;\n        if (t2 > 128)\n            t2 = 128;\n        t2 = (64 - t2) / 2;\n        sprite->y2 = t2;\n        if (sprite->data[2] == 24)\n        {\n            TryResetSpriteAffineState(sprite);\n            DestroyAnimSprite(sprite);\n        }\n        break;\n    }\n}\n\n// Launches a water droplet away from the specified battler. Used by Astonish and Dive\nstatic void AnimSprayWaterDroplet(struct Sprite *sprite)\n{\n    s32 v1 = 0x1FF & Random();\n    s32 v2 = 0x7F & Random();\n\n    if (v1 % 2)\n        sprite->data[0] = 736 + v1;\n    else\n        sprite->data[0] = 736 - v1;\n\n    if (v2 % 2)\n        sprite->data[1] = 896 + v2;\n    else\n        sprite->data[1] = 896 - v2;\n    sprite->data[2] = gBattleAnimArgs[0];\n    if (sprite->data[2])\n        sprite->oam.matrixNum = ST_OAM_HFLIP;\n    if (gBattleAnimArgs[1] == 0)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 32;\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 32;\n    }\n    sprite->callback = AnimSprayWaterDroplet_Step;\n}\n\nstatic void AnimSprayWaterDroplet_Step(struct Sprite *sprite)\n{\n    if (sprite->data[2] == 0)\n    {\n        sprite->x2 += sprite->data[0] >> 8;\n        sprite->y2 -= sprite->data[1] >> 8;\n    }\n    else\n    {\n        sprite->x2 -= sprite->data[0] >> 8;\n        sprite->y2 -= sprite->data[1] >> 8;\n    }\n    sprite->data[0] = sprite->data[0];\n    sprite->data[1] -= 32;\n    if (sprite->data[0] < 0)\n        sprite->data[0] = 0;\n    if (++sprite->data[3] == 31)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimUnusedFlashingLight(struct Sprite *sprite)\n{\n    sprite->data[6] = 0;\n    sprite->data[7] = 64;\n    sprite->callback = AnimUnusedFlashingLight_Step;\n}\n\nstatic void AnimUnusedFlashingLight_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        if (++sprite->data[1] > 8)\n        {\n            sprite->data[1] = 0;\n            sprite->invisible ^= 1;\n            if (++sprite->data[2] > 5 && sprite->invisible != FALSE)\n                ++sprite->data[0];\n        }\n        break;\n    case 1:\n        DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\nstatic void AnimSkyAttackBird(struct Sprite *sprite)\n{\n    u16 rotation;\n    s16 posx = sprite->x;\n    s16 posy = sprite->y;\n\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[4] = sprite->x << 4;\n    sprite->data[5] = sprite->y << 4;\n    sprite->data[6] = ((posx - sprite->x) << 4) / 12;\n    sprite->data[7] = ((posy - sprite->y) << 4) / 12;\n    rotation = ArcTan2Neg(posx - sprite->x, posy - sprite->y);\n    rotation += 49152;\n    TrySetSpriteRotScale(sprite, 1, 0x100, 0x100, rotation);\n    sprite->callback = AnimSkyAttackBird_Step;\n}\n\nstatic void AnimSkyAttackBird_Step(struct Sprite *sprite)\n{\n    sprite->data[4] += sprite->data[6];\n    sprite->data[5] += sprite->data[7];\n    sprite->x = sprite->data[4] >> 4;\n    sprite->y = sprite->data[5] >> 4;\n    if (sprite->x > DISPLAY_WIDTH + 45 || sprite->x < -45\n     || sprite->y > 157 || sprite->y < -45)\n        DestroySpriteAndMatrix(sprite);\n}\n\n// Unused\nstatic void AnimTask_SetAttackerVisibility(u8 taskId)\n{\n    if (gBattleAnimArgs[0] == 0)\n    {\n        u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n\n        gSprites[spriteId].invisible = TRUE;\n    }\n    else\n    {\n        u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n\n        gSprites[spriteId].invisible = FALSE;\n    }\n    DestroyAnimVisualTask(taskId);\n}\n"
  },
  {
    "path": "src/battle_anim_ghost.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"scanline_effect.h\"\n#include \"graphics.h\"\n#include \"trig.h\"\n#include \"util.h\"\n#include \"decompress.h\"\n#include \"constants/songs.h\"\n\nstatic void AnimConfuseRayBallBounce(struct Sprite *sprite);\nstatic void AnimConfuseRayBallBounce_Step1(struct Sprite *sprite);\nstatic void AnimConfuseRayBallBounce_Step2(struct Sprite *sprite);\nstatic void UpdateConfuseRayBallBlend(struct Sprite *sprite);\nstatic void AnimConfuseRayBallSpiral(struct Sprite *sprite);\nstatic void AnimConfuseRayBallSpiral_Step(struct Sprite *sprite);\nstatic void AnimTask_NightShadeClone_Step1(u8 taskId);\nstatic void AnimTask_NightShadeClone_Step2(u8 taskId);\nstatic void AnimShadowBall(struct Sprite *sprite);\nstatic void AnimShadowBall_Step(struct Sprite *sprite);\nstatic void AnimLick(struct Sprite *sprite);\nstatic void AnimLick_Step(struct Sprite *sprite);\nstatic void AnimTask_NightmareClone_Step(u8 taskId);\nstatic void AnimTask_SpiteTargetShadow_Step1(u8 taskId);\nstatic void AnimTask_SpiteTargetShadow_Step2(u8 taskId);\nstatic void AnimTask_SpiteTargetShadow_Step3(u8 taskId);\nstatic void AnimDestinyBondWhiteShadow(struct Sprite *sprite);\nstatic void AnimDestinyBondWhiteShadow_Step(struct Sprite *sprite);\nstatic void AnimTask_DestinyBondWhiteShadow_Step(u8 taskId);\nstatic void AnimTask_CurseStretchingBlackBg_Step1(u8 taskId);\nstatic void AnimTask_CurseStretchingBlackBg_Step2(u8 taskId);\nstatic void AnimCurseNail(struct Sprite *sprite);\nstatic void AnimCurseNail_Step1(struct Sprite *sprite);\nstatic void AnimCurseNail_Step2(struct Sprite *sprite);\nstatic void AnimCurseNail_End(struct Sprite *sprite);\nstatic void AnimGhostStatusSprite(struct Sprite *sprite);\nstatic void AnimGhostStatusSprite_End(struct Sprite *sprite);\nstatic void AnimTask_GrudgeFlames_Step(u8 taskId);\nstatic void AnimGrudgeFlame(struct Sprite *sprite);\nstatic void AnimMonMoveCircular(struct Sprite *sprite);\nstatic void AnimTask_GhostGetOut_Step1(u8 taskId);\nstatic void AnimTask_GhostGetOut_Step2(u8 taskId);\nstatic void AnimTask_GhostGetOut_Step3(u8 taskId);\nstatic void AnimMonMoveCircular_Step(struct Sprite *sprite);\n\nstatic const union AffineAnimCmd sAffineAnim_ConfuseRayBallBounce[] =\n{\n    AFFINEANIMCMD_FRAME(0x1E, 0x1E, 10, 5),\n    AFFINEANIMCMD_FRAME(-0x1E, -0x1E, 10, 5),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_ConfuseRayBallBounce[] =\n{\n    sAffineAnim_ConfuseRayBallBounce,\n};\n\nconst struct SpriteTemplate gConfuseRayBallBounceSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_YELLOW_BALL,\n    .paletteTag = ANIM_TAG_YELLOW_BALL,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_ConfuseRayBallBounce,\n    .callback = AnimConfuseRayBallBounce,\n};\n\nconst struct SpriteTemplate gConfuseRayBallSpiralSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_YELLOW_BALL,\n    .paletteTag = ANIM_TAG_YELLOW_BALL,\n    .oam = &gOamData_AffineOff_ObjBlend_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimConfuseRayBallSpiral,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ShadowBall[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 10, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_ShadowBall[] =\n{\n    sAffineAnim_ShadowBall,\n};\n\nconst struct SpriteTemplate gShadowBallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SHADOW_BALL,\n    .paletteTag = ANIM_TAG_SHADOW_BALL,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_ShadowBall,\n    .callback = AnimShadowBall,\n};\n\nconst union AnimCmd sAnim_Lick[] =\n{\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(8, 2),\n    ANIMCMD_FRAME(16, 2),\n    ANIMCMD_FRAME(24, 2),\n    ANIMCMD_FRAME(32, 2),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_Lick[] =\n{\n    sAnim_Lick,\n};\n\nconst struct SpriteTemplate gLickSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_LICK,\n    .paletteTag = ANIM_TAG_LICK,\n    .oam = &gOamData_AffineOff_ObjNormal_16x32,\n    .anims = sAnims_Lick,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimLick,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Unused[] =\n{\n    AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_Unused[] =\n{\n    sAffineAnim_Unused,\n};\n\nconst struct SpriteTemplate gDestinyBondWhiteShadowSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WHITE_SHADOW,\n    .paletteTag = ANIM_TAG_WHITE_SHADOW,\n    .oam = &gOamData_AffineOff_ObjBlend_64x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDestinyBondWhiteShadow,\n};\n\nconst struct SpriteTemplate gCurseNailSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_NAIL,\n    .paletteTag = ANIM_TAG_NAIL,\n    .oam = &gOamData_AffineOff_ObjBlend_32x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimCurseNail,\n};\n\nconst struct SpriteTemplate gCurseGhostSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GHOSTLY_SPIRIT,\n    .paletteTag = ANIM_TAG_GHOSTLY_SPIRIT,\n    .oam = &gOamData_AffineOff_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimGhostStatusSprite,\n};\n\nconst struct SpriteTemplate gNightmareDevilSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_DEVIL,\n    .paletteTag = ANIM_TAG_DEVIL,\n    .oam = &gOamData_AffineOff_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimGhostStatusSprite,\n};\n\nstatic const union AnimCmd sAnim_GrudgeFlame[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(8, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(24, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_GrudgeFlame[] =\n{\n    sAnim_GrudgeFlame,\n};\n\nconst struct SpriteTemplate gGrudgeFlameSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_PURPLE_FLAME,\n    .paletteTag = ANIM_TAG_PURPLE_FLAME,\n    .oam = &gOamData_AffineOff_ObjBlend_16x32,\n    .anims = sAnims_GrudgeFlame,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimGrudgeFlame,\n};\n\n// Unused\nstatic const struct SpriteTemplate sMonMoveCircularSpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMonMoveCircular,\n};\n\nstatic void AnimConfuseRayBallBounce(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, 1);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    InitAnimLinearTranslationWithSpeed(sprite);\n    sprite->callback = AnimConfuseRayBallBounce_Step1;\n    sprite->data[6] = 16;\n    SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL));\n    SetGpuReg(REG_OFFSET_BLDALPHA, sprite->data[6]);\n}\n\nstatic void AnimConfuseRayBallBounce_Step1(struct Sprite *sprite)\n{\n    s16 r0, r2;\n\n    UpdateConfuseRayBallBlend(sprite);\n    if (AnimTranslateLinear(sprite))\n    {\n        sprite->callback = AnimConfuseRayBallBounce_Step2;\n        return;\n    }\n    sprite->x2 += Sin(sprite->data[5], 10);\n    sprite->y2 += Cos(sprite->data[5], 15);\n    r2 = sprite->data[5];\n    sprite->data[5] = (sprite->data[5] + 5) & 0xFF;\n    r0 = sprite->data[5];\n    if (r2 != 0 && r2 <= 196)\n        return;\n    if (r0 <= 0)\n        return;\n    PlaySE12WithPanning(SE_M_CONFUSE_RAY, gAnimCustomPanning);\n}\n\nstatic void AnimConfuseRayBallBounce_Step2(struct Sprite *sprite)\n{\n    s16 r2, r0;\n\n    sprite->data[0] = 1;\n    AnimTranslateLinear(sprite);\n    sprite->x2 += Sin(sprite->data[5], 10);\n    sprite->y2 += Cos(sprite->data[5], 15);\n    r2 = sprite->data[5];\n    sprite->data[5] = (sprite->data[5] + 5) & 0xFF;\n    r0 = sprite->data[5];\n    if ((r2 == 0 || r2 > 196) && r0 > 0)\n        PlaySE(SE_M_CONFUSE_RAY);\n    if (sprite->data[6] == 0)\n    {\n        sprite->invisible = TRUE;\n        sprite->callback = DestroyAnimSpriteAndDisableBlend;\n    }\n    else\n    {\n        UpdateConfuseRayBallBlend(sprite);\n    }\n}\n\nstatic void UpdateConfuseRayBallBlend(struct Sprite *sprite)\n{\n    s16 r0;\n\n    if (sprite->data[6] > 0xFF)\n    {\n        if (++sprite->data[6] == 0x10d)\n            sprite->data[6] = 0;\n        return;\n    }\n    r0 = sprite->data[7];\n    ++sprite->data[7];\n    if ((r0 & 0xFF) == 0)\n    {\n        sprite->data[7] &= 0xff00;\n        if ((sprite->data[7] & 0x100) != 0)\n            ++sprite->data[6];\n        else\n            --sprite->data[6];\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], 16 - sprite->data[6]));\n        if (sprite->data[6] == 0 || sprite->data[6] == 16)\n            sprite->data[7] ^= 0x100;\n        if (sprite->data[6] == 0)\n            sprite->data[6] = 0x100;\n    }\n}\n\nstatic void AnimConfuseRayBallSpiral(struct Sprite *sprite)\n{\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    sprite->callback = AnimConfuseRayBallSpiral_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimConfuseRayBallSpiral_Step(struct Sprite *sprite)\n{\n    u16 temp1;\n\n    sprite->x2 = Sin(sprite->data[0], 32);\n    sprite->y2 = Cos(sprite->data[0], 8);\n    temp1 = sprite->data[0] - 65;\n    if (temp1 <= 130)\n        sprite->oam.priority = 2;\n    else\n        sprite->oam.priority = 1;\n    sprite->data[0] = (sprite->data[0] + 19) & 0xFF;\n    sprite->data[2] += 80;\n    sprite->y2 += sprite->data[2] >> 8;\n    sprite->data[7] += 1;\n    if (sprite->data[7] == 61)\n        DestroyAnimSprite(sprite);\n}\n\n// Creates a large transparent clone of the attacker centered on their position which shrinks to original size\nvoid AnimTask_NightShadeClone(u8 taskId)\n{\n    u8 spriteId;\n\n    SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL));\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10));\n    spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND);\n    SetSpriteRotScale(spriteId, 128, 128, 0);\n    gSprites[spriteId].invisible = FALSE;\n    gTasks[taskId].data[0] = 128;\n    gTasks[taskId].data[1] = *gBattleAnimArgs;\n    gTasks[taskId].data[2] = 0;\n    gTasks[taskId].data[3] = 16;\n    gTasks[taskId].func = AnimTask_NightShadeClone_Step1;\n}\n\nstatic void AnimTask_NightShadeClone_Step1(u8 taskId)\n{\n    gTasks[taskId].data[10] += 1;\n    if (gTasks[taskId].data[10] == 3)\n    {\n        gTasks[taskId].data[10] = 0;\n        gTasks[taskId].data[2] += 1;\n        gTasks[taskId].data[3] -= 1;\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[2], gTasks[taskId].data[3]));\n        if (gTasks[taskId].data[2] != 9)\n            return;\n        gTasks[taskId].func = AnimTask_NightShadeClone_Step2;\n    }\n}\n\nstatic void AnimTask_NightShadeClone_Step2(u8 taskId)\n{\n    u8 spriteId;\n\n    if (gTasks[taskId].data[1] > 0)\n    {\n        gTasks[taskId].data[1] -= 1;\n        return;\n    }\n    spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    gTasks[taskId].data[0] += 8;\n    if (gTasks[taskId].data[0] <= 0xFF)\n    {\n        SetSpriteRotScale(spriteId, gTasks[taskId].data[0], gTasks[taskId].data[0], 0);\n    }\n    else\n    {\n        ResetSpriteRotScale(spriteId);\n        DestroyAnimVisualTask(taskId);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    }\n}\n\n// Spins a sprite towards the target, pausing in the middle.\n// Used in Shadow Ball.\n// arg 0: duration step 1 (attacker -> center)\n// arg 1: duration step 2 (spin center)\n// arg 2: duration step 3 (center -> target)\nstatic void AnimShadowBall(struct Sprite *sprite)\n{\n    s16 oldPosX = sprite->x;\n    s16 oldPosY = sprite->y;\n\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[0] = 0;\n    sprite->data[1] = gBattleAnimArgs[0];\n    sprite->data[2] = gBattleAnimArgs[1];\n    sprite->data[3] = gBattleAnimArgs[2];\n    sprite->data[4] = sprite->x << 4;\n    sprite->data[5] = sprite->y << 4;\n    sprite->data[6] = ((oldPosX - sprite->x) << 4) / (gBattleAnimArgs[0] << 1);\n    sprite->data[7] = ((oldPosY - sprite->y) << 4) / (gBattleAnimArgs[0] << 1);\n    sprite->callback = AnimShadowBall_Step;\n}\n\nstatic void AnimShadowBall_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->data[4] += sprite->data[6];\n        sprite->data[5] += sprite->data[7];\n        sprite->x = sprite->data[4] >> 4;\n        sprite->y = sprite->data[5] >> 4;\n        sprite->data[1] -= 1;\n        if (sprite->data[1] > 0)\n            break;\n        sprite->data[0] += 1;\n        break;\n    case 1:\n        sprite->data[2] -= 1;\n        if (sprite->data[2] > 0)\n            break;\n        sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n        sprite->data[4] = sprite->x << 4;\n        sprite->data[5] = sprite->y << 4;\n        sprite->data[6] = ((sprite->data[1] - sprite->x) << 4) / sprite->data[3];\n        sprite->data[7] = ((sprite->data[2] - sprite->y) << 4) / sprite->data[3];\n        sprite->data[0] += 1;\n        break;\n    case 2:\n        sprite->data[4] += sprite->data[6];\n        sprite->data[5] += sprite->data[7];\n        sprite->x = sprite->data[4] >> 4;\n        sprite->y = sprite->data[5] >> 4;\n        sprite->data[3] -= 1;\n        if (sprite->data[3] > 0)\n            break;\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n        sprite->data[0] += 1;\n        break;\n    case 3:\n        DestroySpriteAndMatrix(sprite);\n        break;\n    }\n}\n\nstatic void AnimLick(struct Sprite *sprite)\n{\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    sprite->callback = AnimLick_Step;\n}\n\nstatic void AnimLick_Step(struct Sprite *sprite)\n{\n    bool8 r5 = FALSE;\n    bool8 r6 = FALSE;\n\n    if (sprite->animEnded)\n    {\n        if (!sprite->invisible)\n            sprite->invisible = TRUE;\n\n        switch (sprite->data[0])\n        {\n        default:\n            r6 = TRUE;\n            break;\n        case 0:\n            if (sprite->data[1] == 2)\n                r5 = TRUE;\n            break;\n        case 1:\n            if (sprite->data[1] == 4)\n                r5 = TRUE;\n            break;\n        }\n        if (r5)\n        {\n            sprite->invisible ^= 1;\n            ++sprite->data[2];\n            sprite->data[1] = 0;\n            if (sprite->data[2] == 5)\n            {\n                sprite->data[2] = 0;\n                ++sprite->data[0];\n            }\n        }\n        else if (r6)\n        {\n            DestroyAnimSprite(sprite);\n        }\n        else\n        {\n            ++sprite->data[1];\n        }\n    }\n}\n\n// Creates a transparent clone of the target which drifts up and away to the side\nvoid AnimTask_NightmareClone(u8 taskId)\n{\n    struct Task *task;\n\n    task = &gTasks[taskId];\n    task->data[0] = CloneBattlerSpriteWithBlend(ANIM_TARGET);\n    if (task->data[0] < 0)\n    {\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n    task->data[1] = 0;\n    task->data[2] = 15;\n    task->data[3] = 2;\n    task->data[4] = 0;\n    SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL));\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[2], task->data[3]));\n    gSprites[task->data[0]].data[0] = 80;\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n    {\n        gSprites[task->data[0]].data[1] = -144;\n        gSprites[task->data[0]].data[2] = 112;\n    }\n    else\n    {\n        gSprites[task->data[0]].data[1] = 144;\n        gSprites[task->data[0]].data[2] = -112;\n    }\n    gSprites[task->data[0]].data[3] = 0;\n    gSprites[task->data[0]].data[4] = 0;\n    StoreSpriteCallbackInData6(&gSprites[task->data[0]], SpriteCallbackDummy);\n    gSprites[task->data[0]].callback = TranslateSpriteLinearFixedPoint;\n    task->func = AnimTask_NightmareClone_Step;\n}\n\nstatic void AnimTask_NightmareClone_Step(u8 taskId)\n{\n    struct Task *task;\n\n    task = &gTasks[taskId];\n    switch (task->data[4])\n    {\n    case 0:\n        task->data[1] += 1;\n        task->data[5] = task->data[1] & 3;\n        if (task->data[5] == 1)\n            if (task->data[2] > 0)\n                task->data[2] -= 1;\n        if (task->data[5] == 3)\n            if (task->data[3] <= 15)\n                task->data[3] += 1;\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[2], task->data[3]));\n        if (task->data[3] != 16 || task->data[2] != 0)\n            break;\n        if (task->data[1] <= 80)\n            break;\n        DestroySpriteWithActiveSheet(&gSprites[task->data[0]]);\n        task->data[4] = 1;\n        break;\n    case 1:\n        if (++task->data[6] <= 1)\n            break;\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        task->data[4] += 1;\n        break;\n    case 2:\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Creates a blended copy of the target that wavers in front of them\nvoid AnimTask_SpiteTargetShadow(u8 taskId)\n{\n    struct Task *task;\n\n    task = &gTasks[taskId];\n    task->data[15] = 0;\n    task->func = AnimTask_SpiteTargetShadow_Step1;\n    task->func(taskId);\n}\n\nstatic void AnimTask_SpiteTargetShadow_Step1(u8 taskId)\n{\n    s16 startLine;\n    struct Task *task = &gTasks[taskId];\n    u8 position = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);\n\n    switch (task->data[15])\n    {\n    case 0:\n        task->data[14] = AllocSpritePalette(ANIM_TAG_BENT_SPOON);\n        if (task->data[14] == 0xFF || task->data[14] == 0xF)\n        {\n            DestroyAnimVisualTask(taskId);\n        }\n        else\n        {\n            task->data[0] = CloneBattlerSpriteWithBlend(1);\n            if (task->data[0] < 0)\n            {\n                FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON);\n                DestroyAnimVisualTask(taskId);\n            }\n            else\n            {\n                s16 mask2;\n\n                gSprites[task->data[0]].oam.paletteNum = task->data[14];\n                gSprites[task->data[0]].oam.objMode = ST_OAM_OBJ_NORMAL;\n                gSprites[task->data[0]].oam.priority = 3;\n                gSprites[task->data[0]].invisible = (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].invisible);\n                task->data[1] = 0;\n                task->data[2] = 0;\n                task->data[3] = 16;\n                task->data[13] = GetAnimBattlerSpriteId(ANIM_TARGET);\n                task->data[4] = OBJ_PLTT_ID2(gSprites[task->data[13]].oam.paletteNum);\n                if (position == 1)\n                {\n                    u16 mask = DISPCNT_BG1_ON;\n\n                    mask2 = mask;\n                }\n                else\n                {\n                    u16 mask = DISPCNT_BG2_ON;\n\n                    mask2 = mask;\n                }\n                ClearGpuRegBits(REG_OFFSET_DISPCNT, mask2);\n                ++task->data[15];\n            }\n        }\n        break;\n    case 1:\n        task->data[14] = OBJ_PLTT_ID2(task->data[14]);\n        CpuCopy32(&gPlttBufferUnfaded[task->data[4]], &gPlttBufferFaded[task->data[14]], PLTT_SIZE_4BPP);\n        BlendPalette(task->data[4], 16, 10, RGB(13, 0, 15));\n        ++task->data[15];\n        break;\n    case 2:\n        startLine = gSprites[task->data[13]].y + gSprites[task->data[13]].y2 - 32;\n        if (startLine < 0)\n            startLine = 0;\n        if (position == 1)\n            task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, 4, 1);\n        else\n            task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, 8, 1);\n        ++task->data[15];\n        break;\n    case 3:\n        if (position == 1)\n            SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL | BLDCNT_TGT1_BG1));\n        else\n            SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL | BLDCNT_TGT1_BG2));\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10));\n        ++task->data[15];\n        break;\n    case 4:\n        if (position == 1)\n            SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);\n        else\n            SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);\n        task->func = AnimTask_SpiteTargetShadow_Step2;\n        ++task->data[15];\n        break;\n    default:\n        ++task->data[15];\n        break;\n    }\n}\n\nstatic void AnimTask_SpiteTargetShadow_Step2(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    ++task->data[1];\n    task->data[5] = task->data[1] & 1;\n    if (task->data[5] == 0)\n        task->data[2] = gSineTable[task->data[1]] / 18;\n    if (task->data[5] == 1)\n        task->data[3] = 16 - (gSineTable[task->data[1]] / 18);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[2], task->data[3]));\n    if (task->data[1] == 128)\n    {\n        task->data[15] = 0;\n        task->func = AnimTask_SpiteTargetShadow_Step3;\n        task->func(taskId);\n    }\n}\n\nstatic void AnimTask_SpiteTargetShadow_Step3(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    u8 rank = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);\n\n    switch (task->data[15])\n    {\n    case 0:\n        gScanlineEffect.state = 3;\n        task->data[14] = GetAnimBattlerSpriteId(ANIM_TARGET);\n        if (rank == 1)\n            ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);\n        else\n            ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);\n        break;\n    case 1:\n        BlendPalette(task->data[4], 16, 0, RGB(13, 0, 15));\n        break;\n    case 2:\n        gSprites[task->data[14]].invisible = TRUE;\n        DestroySpriteWithActiveSheet(&gSprites[task->data[0]]);\n        FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        if (rank == 1)\n            SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);\n        else\n            SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n    ++task->data[15];\n}\n\nstatic void AnimDestinyBondWhiteShadow(struct Sprite *sprite)\n{\n    s16 battler1X, battler1Y;\n    s16 battler2X, battler2Y;\n    s16 yDiff;\n\n    if (gBattleAnimArgs[0] == 0)\n    {\n        battler1X = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n        battler1Y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 28;\n        battler2X = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n        battler2Y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 28;\n    }\n    else\n    {\n        battler1X = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n        battler1Y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 28;\n        battler2X = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n        battler2Y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 28;\n    }\n    yDiff = battler2Y - battler1Y;\n    sprite->data[0] = battler1X * 16;\n    sprite->data[1] = battler1Y * 16;\n    sprite->data[2] = ((battler2X - battler1X) * 16) / gBattleAnimArgs[1];\n    sprite->data[3] = (yDiff * 16) / gBattleAnimArgs[1];\n    sprite->data[4] = gBattleAnimArgs[1];\n    sprite->data[5] = battler2X;\n    sprite->data[6] = battler2Y;\n    sprite->data[7] = sprite->data[4] / 2;\n    sprite->oam.priority = 2;\n    sprite->x = battler1X;\n    sprite->y = battler1Y;\n    sprite->callback = AnimDestinyBondWhiteShadow_Step;\n    sprite->invisible = TRUE;\n}\n\nstatic void AnimDestinyBondWhiteShadow_Step(struct Sprite *sprite)\n{\n    if (sprite->data[4])\n    {\n        sprite->data[0] += sprite->data[2];\n        sprite->data[1] += sprite->data[3];\n        sprite->x = sprite->data[0] >> 4;\n        sprite->y = sprite->data[1] >> 4;\n        if (--sprite->data[4] == 0)\n            sprite->data[0] = 0;\n    }\n}\n\nvoid AnimTask_DestinyBondWhiteShadow(u8 taskId)\n{\n    struct Task *task;\n    s16 battler;\n    u8 spriteId;\n    s16 baseX, baseY;\n    s16 x, y;\n\n    task = &gTasks[taskId];\n    SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL));\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10));\n    task->data[5] = 0;\n    task->data[6] = 0;\n    task->data[7] = 0;\n    task->data[8] = 0;\n    task->data[9] = 16;\n    task->data[10] = gBattleAnimArgs[0];\n    baseX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    baseY = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM);\n    if (!IsContest())\n    {\n        for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler)\n        {\n            if (battler != gBattleAnimAttacker\n             && battler != (gBattleAnimAttacker ^ 2)\n             && IsBattlerSpriteVisible(battler))\n            {\n                spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55);\n                if (spriteId != MAX_SPRITES)\n                {\n                    x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);\n                    y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_BOTTOM);\n                    gSprites[spriteId].data[0] = baseX << 4;\n                    gSprites[spriteId].data[1] = baseY << 4;\n                    gSprites[spriteId].data[2] = ((x - baseX) << 4) / gBattleAnimArgs[1];\n                    gSprites[spriteId].data[3] = ((y - baseY) << 4) / gBattleAnimArgs[1];\n                    gSprites[spriteId].data[4] = gBattleAnimArgs[1];\n                    gSprites[spriteId].data[5] = x;\n                    gSprites[spriteId].data[6] = y;\n                    gSprites[spriteId].callback = AnimDestinyBondWhiteShadow_Step;\n                    task->data[task->data[12] + 13] = spriteId;\n                    ++task->data[12];\n                }\n            }\n        }\n    }\n    else\n    {\n        spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55);\n        if (spriteId != MAX_SPRITES)\n        {\n            x = 48;\n            y = 40;\n            gSprites[spriteId].data[0] = baseX << 4;\n            gSprites[spriteId].data[1] = baseY << 4;\n            gSprites[spriteId].data[2] = ((x - baseX) << 4) / gBattleAnimArgs[1];\n            gSprites[spriteId].data[3] = ((y - baseY) << 4) / gBattleAnimArgs[1];\n            gSprites[spriteId].data[4] = gBattleAnimArgs[1];\n            gSprites[spriteId].data[5] = x;\n            gSprites[spriteId].data[6] = y;\n            gSprites[spriteId].callback = AnimDestinyBondWhiteShadow_Step;\n            task->data[13] = spriteId;\n            task->data[12] = 1;\n        }\n    }\n    task->func = AnimTask_DestinyBondWhiteShadow_Step;\n}\n\nstatic void AnimTask_DestinyBondWhiteShadow_Step(u8 taskId)\n{\n    u32 i;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        if (task->data[6] == 0)\n        {\n            if (++task->data[5] > 1)\n            {\n                task->data[5] = 0;\n                ++task->data[7];\n                if (task->data[7] & 1)\n                {\n                    if (task->data[8] < 16)\n                        ++task->data[8];\n                }\n                else\n                {\n                    if (task->data[9])\n                        --task->data[9];\n                }\n                SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[8], task->data[9]));\n                if (task->data[7] >= 24)\n                {\n                    task->data[7] = 0;\n                    task->data[6] = 1;\n                }\n            }\n        }\n        if (task->data[10])\n            --task->data[10];\n        else if (task->data[6])\n            ++task->data[0];\n        break;\n    case 1:\n        if (++task->data[5] > 1)\n        {\n            task->data[5] = 0;\n            ++task->data[7];\n            if (task->data[7] & 1)\n            {\n                if (task->data[8])\n                    --task->data[8];\n            }\n            else if (task->data[9] < 16)\n            {\n                    ++task->data[9];\n            }\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[8], task->data[9]));\n            if (task->data[8] == 0 && task->data[9] == 16)\n            {\n                for (i = 0; i < task->data[12]; ++i)\n                    DestroySprite(&gSprites[task->data[i + 13]]);\n                ++task->data[0];\n            }\n        }\n        break;\n    case 2:\n        if (++task->data[5] > 0)\n            ++task->data[0];\n        break;\n    case 3:\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nvoid AnimTask_CurseStretchingBlackBg(u8 taskId)\n{\n    s16 startX, startY;\n    s16 leftDistance, topDistance, bottomDistance, rightDistance;\n\n    gBattle_WIN0H = 0;\n    gBattle_WIN0V = 0;\n    SetGpuReg(REG_OFFSET_WININ, ((WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR) |\n                                    (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR)));\n    SetGpuReg(REG_OFFSET_WINOUT, ((WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ) |\n                                    (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR)));\n    SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN));\n    SetGpuReg(REG_OFFSET_BLDY, 16);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER || IsContest())\n        startX = 40;\n    else\n        startX = 200;\n    gBattle_WIN0H = WIN_RANGE(startX, startX);\n    startY = 40;\n    gBattle_WIN0V = WIN_RANGE(startY, startY);\n    leftDistance = startX;\n    rightDistance = 240 - startX;\n    topDistance = startY;\n    bottomDistance = 72;\n    gTasks[taskId].data[1] = leftDistance;\n    gTasks[taskId].data[2] = rightDistance;\n    gTasks[taskId].data[3] = topDistance;\n    gTasks[taskId].data[4] = bottomDistance;\n    gTasks[taskId].data[5] = startX;\n    gTasks[taskId].data[6] = startY;\n    gTasks[taskId].func = AnimTask_CurseStretchingBlackBg_Step1;\n}\n\nstatic void AnimTask_CurseStretchingBlackBg_Step1(u8 taskId)\n{\n    s16 step, leftDistance, rightDistance, topDistance, bottomDistance, startX, startY;\n    u16 left, right, top, bottom, selectedPalettes;\n\n    step = gTasks[taskId].data[0];\n    ++gTasks[taskId].data[0];\n    leftDistance = gTasks[taskId].data[1];\n    rightDistance = gTasks[taskId].data[2];\n    topDistance = gTasks[taskId].data[3];\n    bottomDistance = gTasks[taskId].data[4];\n    startX = gTasks[taskId].data[5];\n    startY = gTasks[taskId].data[6];\n    if (step < 16)\n    {\n        left   = startX - (leftDistance   * 0.0625) * step;\n        right  = startX + (rightDistance  * 0.0625) * step;\n        top    = startY - (topDistance    * 0.0625) * step;\n        bottom = startY + (bottomDistance * 0.0625) * step;\n    }\n    else\n    {\n        left = 0;\n        right = 240;\n        top = 0;\n        bottom = 112;\n        selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);\n        BeginNormalPaletteFade(selectedPalettes, 0, 16, 16, RGB(0, 0, 0));\n        gTasks[taskId].func = AnimTask_CurseStretchingBlackBg_Step2;\n    }\n    gBattle_WIN0H = WIN_RANGE(left, right);\n    gBattle_WIN0V = WIN_RANGE(top, bottom);\n}\n\nstatic void AnimTask_CurseStretchingBlackBg_Step2(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        gBattle_WIN0H = 0;\n        gBattle_WIN0V = 0;\n        SetGpuReg(REG_OFFSET_WININ, ((WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR) |\n                                        (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR)));\n        SetGpuReg(REG_OFFSET_WINOUT, ((WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR) |\n                                        (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR)));\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nstatic void AnimCurseNail(struct Sprite *sprite)\n{\n    s16 xDelta, xDelta2;\n\n    InitSpritePosToAnimAttacker(sprite, 1);\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n    {\n        xDelta = 24;\n        xDelta2 = -2;\n        sprite->oam.matrixNum = ST_OAM_HFLIP;\n    }\n    else\n    {\n        xDelta = -24;\n        xDelta2 = 2;\n    }\n    sprite->x += xDelta;\n    sprite->data[1] = xDelta2;\n    sprite->data[0] = 60;\n    sprite->callback = AnimCurseNail_Step1;\n}\n\nstatic void AnimCurseNail_Step1(struct Sprite *sprite)\n{\n    u16 var0;\n\n    if (sprite->data[0] > 0)\n    {\n        --sprite->data[0];\n    }\n    else\n    {\n        sprite->x2 += sprite->data[1];\n        var0 = sprite->x2 + 7;\n        if (var0 > 14)\n        {\n            sprite->x += sprite->x2;\n            sprite->x2 = 0;\n            sprite->oam.tileNum += 8;\n            if (++sprite->data[2] == 3)\n            {\n                sprite->data[0] = 30;\n                sprite->callback = WaitAnimForDuration;\n                StoreSpriteCallbackInData6(sprite, AnimCurseNail_Step2);\n            }\n            else\n            {\n                sprite->data[0] = 40;\n            }\n        }\n    }\n}\n\nstatic void AnimCurseNail_Step2(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL));\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));\n        ++sprite->data[0];\n        sprite->data[1] = 0;\n        sprite->data[2] = 0;\n    }\n    else if (sprite->data[1] < 2)\n    {\n        ++sprite->data[1];\n    }\n    else\n    {\n        sprite->data[1] = 0;\n        ++sprite->data[2];\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND2(16 - sprite->data[2], sprite->data[2]));\n        if (sprite->data[2] == 16)\n        {\n            sprite->invisible = TRUE;\n            sprite->callback = AnimCurseNail_End;\n        }\n    }\n}\n\nstatic void AnimCurseNail_End(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    gBattle_WIN0H = 0;\n    gBattle_WIN0V = 0;\n    DestroyAnimSprite(sprite);\n}\n\nstatic void AnimGhostStatusSprite(struct Sprite *sprite)\n{\n    u16 coeffB, coeffA;\n\n    sprite->x2 = Sin(sprite->data[0], 12);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->x2 = -sprite->x2;\n    sprite->data[0] = (sprite->data[0] + 6) & 0xFF;\n    sprite->data[1] += 0x100;\n    sprite->y2 = -(sprite->data[1] >> 8);\n    ++sprite->data[7];\n    if (sprite->data[7] == 1)\n    {\n        sprite->data[6] = 0x050B;\n        SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL));\n        SetGpuReg(REG_OFFSET_BLDALPHA, sprite->data[6]);\n    }\n    else if (sprite->data[7] > 30)\n    {\n        ++sprite->data[2];\n        coeffB = sprite->data[6] >> 8;\n        coeffA = sprite->data[6] & 0xFF;\n        if (++coeffB > 16)\n            coeffB = 16;\n        --coeffA;\n        if ((s16)coeffA < 0)\n            coeffA = 0;\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(coeffA, coeffB));\n        sprite->data[6] = BLDALPHA_BLEND(coeffA, coeffB);\n        if (coeffB == 16 && coeffA == 0)\n        {\n            sprite->invisible = TRUE;\n            sprite->callback = AnimGhostStatusSprite_End;\n        }\n    }\n}\n\nstatic void AnimGhostStatusSprite_End(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    DestroyAnimSprite(sprite);\n}\n\nvoid AnimTask_GrudgeFlames(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->data[0] = 0;\n    task->data[1] = 16;\n    task->data[9] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    task->data[10] = GetBattlerYCoordWithElevation(gBattleAnimAttacker);\n    task->data[11] = (GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2) + 8;\n    task->data[7] = 0;\n    task->data[5] = GetBattlerSpriteBGPriority(gBattleAnimAttacker);\n    task->data[6] = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 2;\n    task->data[3] = 0;\n    task->data[4] = 16;\n    SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL));\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10));\n    task->data[8] = 0;\n    task->func = AnimTask_GrudgeFlames_Step;\n}\n\nstatic void AnimTask_GrudgeFlames_Step(u8 taskId)\n{\n    u32 i;\n    u8 spriteId;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        for (i = 0; i < 6; ++i)\n        {\n            spriteId = CreateSprite(&gGrudgeFlameSpriteTemplate, task->data[9], task->data[10], task->data[6]);\n            if (spriteId != MAX_SPRITES)\n            {\n                gSprites[spriteId].data[0] = taskId;\n                gSprites[spriteId].data[1] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER;\n                gSprites[spriteId].data[2] = (i * 42) & 0xFF;\n                gSprites[spriteId].data[3] = task->data[11];\n                gSprites[spriteId].data[5] = i * 6;\n                ++task->data[7];\n            }\n        }\n        ++task->data[0];\n        break;\n    case 1:\n        if (++task->data[1] & 1)\n        {\n            if (task->data[3] < 14)\n                ++task->data[3];\n        }\n        else if (task->data[4] > 4)\n        {\n            --task->data[4];\n        }\n        if (task->data[3] == 14 && task->data[4] == 4)\n        {\n            task->data[1] = 0;\n            ++task->data[0];\n        }\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4]));\n        break;\n    case 2:\n        if (++task->data[1] > 30)\n        {\n            task->data[1] = 0;\n            ++task->data[0];\n        }\n        break;\n    case 3:\n        if (++task->data[1] & 1)\n        {\n            if (task->data[3] > 0)\n                --task->data[3];\n        }\n        else if (task->data[4] < 16)\n        {\n            ++task->data[4];\n        }\n\n        if (task->data[3] == 0 && task->data[4] == 16)\n        {\n            task->data[8] = 1;\n            ++task->data[0];\n        }\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4]));\n        break;\n    case 4:\n        if (task->data[7] == 0)\n            ++task->data[0];\n        break;\n    case 5:\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void AnimGrudgeFlame(struct Sprite *sprite)\n{\n    u16 index;\n\n    if (sprite->data[1] == 0)\n        sprite->data[2] += 2;\n    else\n        sprite->data[2] -= 2;\n    sprite->data[2] &= 0xFF;\n    sprite->x2 = Sin(sprite->data[2], sprite->data[3]);\n    index = sprite->data[2] - 65;\n    if (index < 127)\n        sprite->oam.priority = gTasks[sprite->data[0]].data[5] + 1;\n    else\n        sprite->oam.priority = gTasks[sprite->data[0]].data[5];\n    ++sprite->data[5];\n    sprite->data[6] = (sprite->data[5] * 8) & 0xFF;\n    sprite->y2 = Sin(sprite->data[6], 7);\n    if (gTasks[sprite->data[0]].data[8])\n    {\n        --gTasks[sprite->data[0]].data[7];\n        DestroySprite(sprite);\n    }\n}\n\n// Used by the ghost Marowak when it hasn't been revealed by the Silph Scope.\n// Animates a shimmering copy of the attacker (the ghost) accompanied by the 'Scary Face' graphics\nvoid AnimTask_GhostGetOut(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->data[15] = 0;\n    task->func = AnimTask_GhostGetOut_Step1;\n    task->func(taskId);\n}\n\nstatic void AnimTask_GhostGetOut_Step1(u8 taskId)\n{\n    s16 y;\n    struct BattleAnimBgData animBgData;\n    struct Task *task = &gTasks[taskId];\n    u8 rank = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);\n\n    switch (task->data[15])\n    {\n    case 0:\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 2);\n        SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 1);\n        task->data[1] = 0;\n        task->data[2] = 0;\n        task->data[3] = 16;\n        task->data[4] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n        task->data[5] = gSprites[task->data[4]].oam.priority;\n        task->data[6] = OBJ_PLTT_ID2(gSprites[task->data[4]].oam.paletteNum);\n        gSprites[task->data[4]].oam.objMode = ST_OAM_OBJ_BLEND;\n        gSprites[task->data[4]].oam.priority = 3;\n        task->data[7] = BG_PLTT_ID(8);\n        break;\n    case 1:\n        ++task->data[1];\n        if (task->data[1] & 1)\n            return;\n        BlendPalette(task->data[6], 0x10, task->data[2], RGB(0, 23, 25));\n        BlendPalette(task->data[7], 0x10, task->data[2], RGB(0, 23, 25));\n        if (task->data[2] <= 11)\n        {\n            ++task->data[2];\n            return;\n        }\n        task->data[1] = 0;\n        task->data[2] = 0;\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10));\n        break;\n    case 2:\n        SetAnimBgAttribute(2, BG_ANIM_CHAR_BASE_BLOCK, 1);\n        SetAnimBgAttribute(2, BG_ANIM_SCREEN_SIZE, 0);\n        gBattle_BG2_X = 0;\n        gBattle_BG2_Y = 0;\n        SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X);\n        SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y);\n        GetBattleAnimBgData(&animBgData, 2);\n        AnimLoadCompressedBgGfx(animBgData.bgId, gBattleAnim_ScaryFaceGfx, animBgData.tilesOffset);\n        LoadCompressedPalette(gBattleAnim_ScaryFacePal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP);\n        break;\n    case 3:\n        GetBattleAnimBgData(&animBgData, 2);\n        gMonSpritesGfxPtr->multiUseBuffer = AllocZeroed(0x2000);\n        LZDecompressWram(gBattleAnimBgTilemap_ScaryFacePlayer, gMonSpritesGfxPtr->multiUseBuffer);\n        RelocateBattleBgPal(animBgData.paletteId, gMonSpritesGfxPtr->multiUseBuffer, 256, 0);\n        CopyToBgTilemapBufferRect_ChangePalette(animBgData.bgId, gMonSpritesGfxPtr->multiUseBuffer, 0, 0, 0x20, 0x20, 0x11);\n        CopyBgTilemapBufferToVram(2);\n        FREE_AND_SET_NULL(gMonSpritesGfxPtr->multiUseBuffer);\n        break;\n    case 4:\n        ++task->data[1];\n        if (task->data[1] & 1)\n            return;\n        ++task->data[2];\n        --task->data[3];\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[2], task->data[3]));\n        if (task->data[3])\n            return;\n        task->data[1] = 0;\n        task->data[2] = 0;\n        task->data[3] = 16;\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10));\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n        SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);\n        break;\n    case 5:\n        if (rank == 1)\n            ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);\n        else\n            ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);\n        break;\n    case 6:\n        y = gSprites[task->data[4]].y + gSprites[task->data[4]].y2 - 0x20;\n        if (y < 0)\n            y = 0;\n        if (rank == 1)\n            task->data[10] = ScanlineEffect_InitWave(y, y + 0x40, 4, 8, 0, 4, 1);\n        else\n            task->data[10] = ScanlineEffect_InitWave(y, y + 0x40, 4, 8, 0, 8, 1);\n        break;\n    case 7:\n        BlendPalette(task->data[7], 0x10, 0xC, RGB(31, 31, 29));\n        if (rank == 1)\n            SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);\n        else\n            SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);\n        task->func = AnimTask_GhostGetOut_Step2;\n        task->data[15] = 0;\n        break;\n    }\n    ++task->data[15];\n}\n\nstatic void AnimTask_GhostGetOut_Step2(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    ++task->data[1];\n    task->data[8] = task->data[1] & 1;\n    if (!task->data[8])\n        task->data[2] = gSineTable[task->data[1]] / 18;\n    if (task->data[8] == 1)\n        task->data[3] = 16 - gSineTable[task->data[1]] / 18;\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[2], task->data[3]));\n    if (task->data[1] == 128)\n    {\n        task->data[15] = 0;\n        task->func = AnimTask_GhostGetOut_Step3;\n        task->func(taskId);\n    }\n}\n\nstatic void AnimTask_GhostGetOut_Step3(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[15])\n    {\n    case 0:\n        gScanlineEffect.state = 3;\n        BlendPalette(task->data[7], 0x10, 0xC, RGB(0, 23, 25));\n        break;\n    case 1:\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x10, 0));\n        task->data[2] = 16;\n        task->data[3] = 0;\n        break;\n    case 2:\n        --task->data[2];\n        ++task->data[3];\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[2], task->data[3]));\n        if (task->data[3] <= 15)\n            return;\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 2);\n        SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);\n        break;\n    case 3:\n        InitBattleAnimBg(2);\n        FillPalette(RGB_BLACK, BG_PLTT_ID(9), PLTT_SIZE_4BPP);\n        SetAnimBgAttribute(2, BG_ANIM_CHAR_BASE_BLOCK, 0);\n        task->data[1] = 12;\n        break;\n    case 4:\n        BlendPalette(task->data[6], 0x10, task->data[1], RGB(0, 23, 25));\n        BlendPalette(task->data[7], 0x10, task->data[1], RGB(0, 23, 25));\n        if ( task->data[1] )\n        {\n            --task->data[1];\n            return;\n        }\n        task->data[1] = 0;\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10));\n        break;\n    case 5:\n        gSprites[task->data[4]].oam.priority = task->data[5];\n        gSprites[task->data[4]].oam.objMode = ST_OAM_OBJ_NORMAL;\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n        SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 1);\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_NONE);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n    ++task->data[15];\n}\n\nstatic void AnimMonMoveCircular(struct Sprite *sprite)\n{\n    sprite->invisible = TRUE;\n    sprite->data[5] = gBattlerSpriteIds[gBattleAnimAttacker];\n    sprite->data[0] = 128;\n    sprite->data[1] = 10;\n    sprite->data[2] = gBattleAnimArgs[0];\n    sprite->data[3] = gBattleAnimArgs[1];\n    sprite->callback = AnimMonMoveCircular_Step;\n    gSprites[sprite->data[5]].y += 8;\n}\n\nstatic void AnimMonMoveCircular_Step(struct Sprite *sprite)\n{\n    if (sprite->data[3])\n    {\n        --sprite->data[3];\n        gSprites[sprite->data[5]].x2 = Sin(sprite->data[0], sprite->data[1]);\n        gSprites[sprite->data[5]].y2 = Cos(sprite->data[0], sprite->data[1]);\n        sprite->data[0] += sprite->data[2];\n        if (sprite->data[0] > 255)\n            sprite->data[0] -= 256;\n    }\n    else\n    {\n        gSprites[sprite->data[5]].x2 = 0;\n        gSprites[sprite->data[5]].y2 = 0;\n        gSprites[sprite->data[5]].y -= 8;\n        sprite->callback = DestroySpriteAndMatrix;\n    }\n}\n"
  },
  {
    "path": "src/battle_anim_ground.c",
    "content": "#include \"global.h\"\n#include \"battle_anim.h\"\n#include \"random.h\"\n#include \"scanline_effect.h\"\n#include \"task.h\"\n#include \"trig.h\"\n\nstatic void AnimBonemerangProjectile(struct Sprite *sprite);\nstatic void AnimBoneHitProjectile(struct Sprite *sprite);\nstatic void AnimDirtScatter(struct Sprite *sprite);\nstatic void AnimMudSportDirt(struct Sprite *sprite);\nstatic void AnimDirtPlumeParticle(struct Sprite *sprite);\nstatic void AnimDigDirtMound(struct Sprite *sprite);\nstatic void AnimBonemerangProjectile_Step(struct Sprite *sprite);\nstatic void AnimBonemerangProjectile_End(struct Sprite *sprite);\nstatic void AnimMudSportDirtRising(struct Sprite *sprite);\nstatic void AnimMudSportDirtFalling(struct Sprite *sprite);\nstatic void AnimTask_DigBounceMovement(u8 taskId);\nstatic void AnimTask_DigDisappear(u8 taskId);\nstatic void SetDigScanlineEffect(u8 useBg1, s16 y, s16 endY);\nstatic void AnimTask_DigSetVisibleUnderground(u8 taskId);\nstatic void AnimTask_DigRiseUpFromHole(u8 taskId);\nstatic void AnimDirtPlumeParticle_Step(struct Sprite *sprite);\nstatic void AnimTask_ShakeTerrain(u8 taskId);\nstatic void AnimTask_ShakeBattlers(u8 taskId);\nstatic void SetBattlersXOffsetForShake(struct Task *task);\nstatic void WaitForFissureCompletion(u8 taskId);\n\nstatic const union AffineAnimCmd sAffineAnim_Bonemerang[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 15, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sAffineAnim_SpinningBone[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 20, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_Bonemerang[] =\n{\n    sAffineAnim_Bonemerang,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_SpinningBone[] =\n{\n    sAffineAnim_SpinningBone,\n};\n\nconst struct SpriteTemplate gBonemerangSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BONE,\n    .paletteTag = ANIM_TAG_BONE,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_Bonemerang,\n    .callback = AnimBonemerangProjectile,\n};\n\nconst struct SpriteTemplate gSpinningBoneSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BONE,\n    .paletteTag = ANIM_TAG_BONE,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_SpinningBone,\n    .callback = AnimBoneHitProjectile,\n};\n\nconst struct SpriteTemplate gSandAttackDirtSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUD_SAND,\n    .paletteTag = ANIM_TAG_MUD_SAND,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDirtScatter,\n};\n\nstatic const union AnimCmd sAnim_MudSlapMud[] =\n{\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_MudSlapMud[] =\n{\n    sAnim_MudSlapMud,\n};\n\nconst struct SpriteTemplate gMudSlapMudSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUD_SAND,\n    .paletteTag = ANIM_TAG_MUD_SAND,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sAnims_MudSlapMud,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDirtScatter,\n};\n\nconst struct SpriteTemplate gMudsportMudSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUD_SAND,\n    .paletteTag = ANIM_TAG_MUD_SAND,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMudSportDirt,\n};\n\nconst struct SpriteTemplate gDirtPlumeSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUD_SAND,\n    .paletteTag = ANIM_TAG_MUD_SAND,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDirtPlumeParticle,\n};\n\nconst struct SpriteTemplate gDirtMoundSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_DIRT_MOUND,\n    .paletteTag = ANIM_TAG_DIRT_MOUND,\n    .oam = &gOamData_AffineOff_ObjNormal_32x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDigDirtMound,\n};\n\n// Moves a bone projectile towards the target mon, which moves like\n// a boomerang. After hitting the target mon, it comes back to the user.\nstatic void AnimBonemerangProjectile(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[0] = 20;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[5] = -40;\n    InitAnimArcTranslation(sprite);\n    sprite->callback = AnimBonemerangProjectile_Step;\n}\n\nstatic void AnimBonemerangProjectile_Step(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n    {\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->y2 = 0;\n        sprite->x2 = 0;\n        sprite->data[0] = 20;\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n        sprite->data[5] = 40;\n        InitAnimArcTranslation(sprite);\n        sprite->callback = AnimBonemerangProjectile_End;\n    }\n}\n\nstatic void AnimBonemerangProjectile_End(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n        DestroyAnimSprite(sprite);\n}\n\n// Moves a bone projectile towards the target mon, starting right next to\n// the target mon.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: target x pixel offset\n// arg 3: target y pixel offset\n// arg 4: duration\nstatic void AnimBoneHitProjectile(struct Sprite *sprite)\n{\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Moves a small dirt projectile towards the target mon.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: duration\n// arg 3: target x pixel offset\n// arg 4: target y pixel offset\nstatic void AnimDirtScatter(struct Sprite *sprite)\n{\n    u8 targetXPos, targetYPos;\n    s16 xOffset, yOffset;\n\n    InitSpritePosToAnimAttacker(sprite, 1);\n    targetXPos = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2);\n    targetYPos = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    xOffset = Random() & 0x1F;\n    yOffset = Random() & 0x1F;\n    if (xOffset > 16)\n        xOffset = 16 - xOffset;\n    if (yOffset > 16)\n        yOffset = 16 - yOffset;\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[2] = targetXPos + xOffset;\n    sprite->data[4] = targetYPos + yOffset;\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n}\n\n// Moves a particle of dirt in the Mud Sport animation.\n// The dirt can either be rising upward, or falling down.\n// arg 0: 0 = dirt is rising into the air, 1 = dirt is falling down\n// arg 1: initial x pixel offset\n// arg 2: initial y pixel offset\nstatic void AnimMudSportDirt(struct Sprite *sprite)\n{\n    ++sprite->oam.tileNum;\n    if (gBattleAnimArgs[0] == 0)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];\n        sprite->data[0] = gBattleAnimArgs[1] > 0 ? 1 : -1;\n        sprite->callback = AnimMudSportDirtRising;\n    }\n    else\n    {\n        sprite->x = gBattleAnimArgs[1];\n        sprite->y = gBattleAnimArgs[2];\n        sprite->y2 = -gBattleAnimArgs[2];\n        sprite->callback = AnimMudSportDirtFalling;\n    }\n}\n\nstatic void AnimMudSportDirtRising(struct Sprite *sprite)\n{\n    if (++sprite->data[1] > 1)\n    {\n        sprite->data[1] = 0;\n        sprite->x += sprite->data[0];\n    }\n    sprite->y -= 4;\n    if (sprite->y < -4)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimMudSportDirtFalling(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->y2 += 4;\n        if (sprite->y2 >= 0)\n        {\n            sprite->y2 = 0;\n            ++sprite->data[0];\n        }\n        break;\n    case 1:\n        if (++sprite->data[1] > 0)\n        {\n            sprite->data[1] = 0;\n            sprite->invisible ^= 1;\n            if (++sprite->data[2] == 10)\n                DestroyAnimSprite(sprite);\n        }\n        break;\n    }\n}\n\nvoid AnimTask_DigDownMovement(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (gBattleAnimArgs[0] == FALSE)\n        task->func = AnimTask_DigBounceMovement;\n    else\n        task->func = AnimTask_DigDisappear;\n    task->func(taskId);\n}\n\nstatic void AnimTask_DigBounceMovement(u8 taskId)\n{\n    u8 var0;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        task->data[10] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n        task->data[11] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);\n        if (task->data[11] == 1)\n        {\n            task->data[12] = gBattle_BG1_X;\n            task->data[13] = gBattle_BG1_Y;\n        }\n        else\n        {\n            task->data[12] = gBattle_BG2_X;\n            task->data[13] = gBattle_BG2_Y;\n        }\n        var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);\n        task->data[14] = var0 - 32;\n        task->data[15] = var0 + 32;\n        if (task->data[14] < 0)\n            task->data[14] = 0;\n        gSprites[task->data[10]].invisible = TRUE;\n        ++task->data[0];\n        break;\n    case 1:\n        SetDigScanlineEffect(task->data[11], task->data[14], task->data[15]);\n        ++task->data[0];\n        break;\n    case 2:\n        task->data[2] = (task->data[2] + 6) & 0x7F;\n        if (++task->data[4] > 2)\n        {\n            task->data[4] = 0;\n            ++task->data[3];\n        }\n        task->data[5] = task->data[3] + (gSineTable[task->data[2]] >> 4);\n        if (task->data[11] == 1)\n            gBattle_BG1_Y = task->data[13] - task->data[5];\n        else\n            gBattle_BG2_Y = task->data[13] - task->data[5];\n\n        if (task->data[5] > 63)\n        {\n            task->data[5] = 120 - task->data[14];\n            if (task->data[11] == 1)\n                gBattle_BG1_Y = task->data[13] - task->data[5];\n            else\n                gBattle_BG2_Y = task->data[13] - task->data[5];\n\n            gSprites[task->data[10]].x2 = 272 - gSprites[task->data[10]].x;\n            ++task->data[0];\n        }\n        break;\n    case 3:\n        gScanlineEffect.state = 3;\n        ++task->data[0];\n        break;\n    case 4:\n        DestroyAnimVisualTask(taskId);\n        gSprites[task->data[10]].invisible = TRUE;\n        break;\n    }\n}\n\nstatic void AnimTask_DigDisappear(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n\n    gSprites[spriteId].invisible = TRUE;\n    gSprites[spriteId].x2 = 0;\n    gSprites[spriteId].y2 = 0;\n    if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)\n        gBattle_BG1_Y = 0;\n    else\n        gBattle_BG2_Y = 0;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_DigUpMovement(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (gBattleAnimArgs[0] == FALSE)\n        task->func = AnimTask_DigSetVisibleUnderground;\n    else\n        task->func = AnimTask_DigRiseUpFromHole;\n\n    task->func(taskId);\n}\n\nstatic void AnimTask_DigSetVisibleUnderground(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        task->data[10] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n        gSprites[task->data[10]].invisible = FALSE;\n        gSprites[task->data[10]].x2 = 0;\n        gSprites[task->data[10]].y2 = DISPLAY_HEIGHT - gSprites[task->data[10]].y;\n        ++task->data[0];\n        break;\n    case 1:\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nstatic void AnimTask_DigRiseUpFromHole(u8 taskId)\n{\n    u8 var0;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        task->data[10] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n        task->data[11] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);\n        if (task->data[11] == 1)\n            task->data[12] = gBattle_BG1_X;\n        else\n            task->data[12] = gBattle_BG2_X;\n        var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);\n        task->data[14] = var0 - 32;\n        task->data[15] = var0 + 32;\n        ++task->data[0];\n        break;\n    case 1:\n        SetDigScanlineEffect(task->data[11], 0, task->data[15]);\n        ++task->data[0];\n        break;\n    case 2:\n        gSprites[task->data[10]].y2 = 96;\n        ++task->data[0];\n        break;\n    case 3:\n        gSprites[task->data[10]].y2 -= 8;\n        if (gSprites[task->data[10]].y2 == 0)\n        {\n            gScanlineEffect.state = 3;\n            ++task->data[0];\n        }\n        break;\n    case 4:\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void SetDigScanlineEffect(u8 useBG1, s16 y, s16 endY)\n{\n    s16 bgX;\n    struct ScanlineEffectParams scanlineParams;\n\n    if (useBG1 == 1)\n    {\n        bgX = gBattle_BG1_X;\n        scanlineParams.dmaDest = &REG_BG1HOFS;\n    }\n    else\n    {\n        bgX = gBattle_BG2_X;\n        scanlineParams.dmaDest = &REG_BG2HOFS;\n    }\n    if (y < 0)\n        y = 0;\n    while (y < endY)\n    {\n        gScanlineEffectRegBuffers[0][y] = bgX;\n        gScanlineEffectRegBuffers[1][y] = bgX;\n        ++y;\n    }\n    while (y < 160)\n    {\n        gScanlineEffectRegBuffers[0][y] = bgX + 240;\n        gScanlineEffectRegBuffers[1][y] = bgX + 240;\n        ++y;\n    }\n    scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;\n    scanlineParams.initState = 1;\n    scanlineParams.unused9 = 0;\n    ScanlineEffect_SetParams(scanlineParams);\n}\n\n// Moves a particle of dirt in a plume of dirt. Used in Fissure and Dig.\n// arg 0: which mon (0 = attacker, 1 = target)\n// arg 1: which side of mon (0 = left, 1 = right)\n// arg 2: target x offset\n// arg 3: target y offset\n// arg 4: wave amplitude\n// arg 5: duration\nstatic void AnimDirtPlumeParticle(struct Sprite *sprite)\n{\n    s8 battler;\n    s16 xOffset;\n\n    if (gBattleAnimArgs[0] == 0)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n    xOffset = 24;\n    if (gBattleAnimArgs[1] == 1)\n    {\n        xOffset *= -1;\n        gBattleAnimArgs[2] *= -1;\n    }\n    sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2) + xOffset;\n    sprite->y = GetBattlerYCoordWithElevation(battler) + 30;\n    sprite->data[0] = gBattleAnimArgs[5];\n    sprite->data[2] = sprite->x + gBattleAnimArgs[2];\n    sprite->data[4] = sprite->y + gBattleAnimArgs[3];\n    sprite->data[5] = gBattleAnimArgs[4];\n    InitAnimArcTranslation(sprite);\n    sprite->callback = AnimDirtPlumeParticle_Step;\n}\n\nstatic void AnimDirtPlumeParticle_Step(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n        DestroyAnimSprite(sprite);\n}\n\n// Displays the dirt mound seen in the move Dig for set duration.\n// The dirt mound image is too large for a single sprite, so two\n// sprites are lined up next to each other.\n// arg 0: which mon (0 = attacker, 1 = target)\n// arg 1: oam tile num (0 = left half of image, 1 = right half of image)\n// arg 2: duration\nstatic void AnimDigDirtMound(struct Sprite *sprite)\n{\n    s8 battler;\n\n    if (gBattleAnimArgs[0] == 0)\n        battler = gBattleAnimAttacker;\n    else\n        battler = gBattleAnimTarget;\n    sprite->x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X) - 16 + (gBattleAnimArgs[1] * 32);\n    sprite->y = GetBattlerYCoordWithElevation(battler) + 32;\n    sprite->oam.tileNum += gBattleAnimArgs[1] * 8;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->callback = WaitAnimForDuration;\n}\n\n#define tState               data[0]\n#define tDelay               data[1]\n#define tTimer               data[2]\n#define tMaxTime             data[3]\n#define tbattlerSpriteIds(i) data[9 + (i)]\n#define tNumBattlers         data[13] // AnimTask_ShakeBattlers\n#define tInitialX            data[13] // AnimTask_ShakeTerrain\n#define tHorizOffset         data[14]\n#define tInitHorizOffset     data[15]\n\n// Shakes battler(s) or the battle terrain back and forth horizontally. Used by e.g. Earthquake, Eruption\n// arg0: What to shake. 0-3 for any specific battler, MAX_BATTLERS_COUNT for all battlers, MAX_BATTLERS_COUNT + 1 for the terrain\n// arg1: Shake intensity, used to calculate horizontal pixel offset (if 0, use move power instead)\n// arg2: Length of time to shake for\nvoid AnimTask_HorizontalShake(u8 taskId)\n{\n    u32 i;\n    struct Task *task = &gTasks[taskId];\n\n    if (gBattleAnimArgs[1] != 0)\n        task->tHorizOffset = task->tInitHorizOffset = gBattleAnimArgs[1] + 3;\n    else\n        task->tHorizOffset = task->tInitHorizOffset = (gAnimMovePower / 10) + 3;\n\n    task->tMaxTime = gBattleAnimArgs[2];\n    switch (gBattleAnimArgs[0])\n    {\n    case MAX_BATTLERS_COUNT + 1: // Shake terrain\n        task->tInitialX = gBattle_BG3_X;\n        task->func = AnimTask_ShakeTerrain;\n        break;\n    case MAX_BATTLERS_COUNT: // Shake all battlers\n        task->tNumBattlers = 0;\n        for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n        {\n            if (IsBattlerSpriteVisible(i))\n            {\n                task->tbattlerSpriteIds(task->tNumBattlers) = gBattlerSpriteIds[i];\n                task->tNumBattlers++;\n            }\n        }\n        task->func = AnimTask_ShakeBattlers;\n        break;\n    default: // Shake specific battler\n        task->tbattlerSpriteIds(0) = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n        if (task->tbattlerSpriteIds(0) == SPRITE_NONE)\n        {\n            DestroyAnimVisualTask(taskId);\n        }\n        else\n        {\n            task->tNumBattlers = 1;\n            task->func = AnimTask_ShakeBattlers;\n        }\n        break;\n    }\n}\n\nstatic void AnimTask_ShakeTerrain(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->tState)\n    {\n    case 0:\n        if (++task->tDelay > 1)\n        {\n            task->tDelay = 0;\n            if ((task->tTimer & 1) == 0)\n                gBattle_BG3_X = task->tInitialX + task->tInitHorizOffset;\n            else\n                gBattle_BG3_X = task->tInitialX - task->tInitHorizOffset;\n\n            if (++task->tTimer == task->tMaxTime)\n            {\n                task->tTimer = 0;\n                task->tHorizOffset--;\n                task->tState++;\n            }\n        }\n        break;\n    case 1:\n        if (++task->tDelay > 1)\n        {\n            task->tDelay = 0;\n            if ((task->tTimer & 1) == 0)\n                gBattle_BG3_X = task->tInitialX + task->tHorizOffset;\n            else\n                gBattle_BG3_X = task->tInitialX - task->tHorizOffset;\n\n            if (++task->tTimer == 4)\n            {\n                task->tTimer = 0;\n                if (--task->tHorizOffset == 0)\n                    task->tState++;\n            }\n        }\n        break;\n    case 2:\n        gBattle_BG3_X = task->tInitialX;\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void AnimTask_ShakeBattlers(u8 taskId)\n{\n    u32 i;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->tState)\n    {\n    case 0:\n        if (++task->tDelay > 1)\n        {\n            task->tDelay = 0;\n            SetBattlersXOffsetForShake(task);\n            if (++task->tTimer == task->tMaxTime)\n            {\n                task->tTimer = 0;\n                task->tHorizOffset--;\n                task->tState++;\n            }\n        }\n        break;\n    case 1:\n        if (++task->tDelay > 1)\n        {\n            task->tDelay = 0;\n            SetBattlersXOffsetForShake(task);\n            if (++task->tTimer == 4)\n            {\n                task->tTimer = 0;\n                if (--task->tHorizOffset == 0)\n                    task->tState++;\n            }\n        }\n        break;\n    case 2:\n        for (i = 0; i < task->tNumBattlers; i++)\n            gSprites[task->tbattlerSpriteIds(i)].x2 = 0;\n\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void SetBattlersXOffsetForShake(struct Task *task)\n{\n    u16 i, xOffset;\n\n    if ((task->tTimer & 1) == 0)\n        xOffset = (task->tHorizOffset / 2) + (task->tHorizOffset & 1);\n    else\n        xOffset = -(task->tHorizOffset / 2);\n\n    for (i = 0; i < task->tNumBattlers; i++)\n    {\n        gSprites[task->tbattlerSpriteIds(i)].x2 = xOffset;\n    }\n}\n\n#undef tState\n#undef tDelay\n#undef tTimer\n#undef tMaxTime\n#undef tbattlerSpriteIds\n#undef tNumBattlers\n#undef tInitialX\n#undef tHorizOffset\n#undef tInitHorizOffset\n\nvoid AnimTask_IsPowerOver99(u8 taskId)\n{\n    gBattleAnimArgs[15] = gAnimMovePower > 99;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_PositionFissureBgOnBattler(u8 taskId)\n{\n    struct Task *newTask;\n    u8 battler = (gBattleAnimArgs[0] & 1) ? gBattleAnimTarget : gBattleAnimAttacker;\n\n    if (gBattleAnimArgs[0] > 1)\n        battler ^= BIT_FLANK;\n    newTask = &gTasks[CreateTask(WaitForFissureCompletion, gBattleAnimArgs[1])];\n    newTask->data[1] = (32 - GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2)) & 0x1FF;\n    newTask->data[2] = (64 - GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET)) & 0xFF;\n    gBattle_BG3_X = newTask->data[1];\n    gBattle_BG3_Y = newTask->data[2];\n    newTask->data[3] = gBattleAnimArgs[2];\n    DestroyAnimVisualTask(taskId);\n}\n\nstatic void WaitForFissureCompletion(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    // Holds the BG3 offsets until gBattleAnimArgs[7]\n    // is set to a special terminator value.\n    if (gBattleAnimArgs[7] == task->data[3])\n    {\n        gBattle_BG3_X = 0;\n        gBattle_BG3_Y = 0;\n        DestroyTask(taskId);\n    }\n    else\n    {\n        gBattle_BG3_X = task->data[1];\n        gBattle_BG3_Y = task->data[2];\n    }\n}\n"
  },
  {
    "path": "src/battle_anim_ice.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"graphics.h\"\n#include \"random.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"constants/battle_anim.h\"\n\nstruct HailStruct\n{\n    s32 x:10;\n    s32 y:10;\n    s32 bPosition:8;\n    s32 unk3:4;\n};\n\nstatic void AnimUnusedIceCrystalThrow(struct Sprite *sprite);\nstatic void AnimUnusedIceCrystalThrow_Step(struct Sprite *sprite);\nstatic void AnimIcePunchSwirlingParticle(struct Sprite *sprite);\nstatic void AnimIceBeamParticle(struct Sprite *sprite);\nstatic void AnimIceEffectParticle(struct Sprite *sprite);\nstatic void AnimFlickerIceEffectParticle(struct Sprite *sprite);\nstatic void AnimSwirlingSnowball(struct Sprite *sprite);\nstatic void AnimSwirlingSnowball_Step1(struct Sprite *sprite);\nstatic void AnimSwirlingSnowball_Step2(struct Sprite *sprite);\nstatic void AnimSwirlingSnowball_End(struct Sprite *sprite);\nstatic void AnimMoveParticleBeyondTarget(struct Sprite *sprite);\nstatic void AnimWiggleParticleTowardsTarget(struct Sprite *sprite);\nstatic void AnimWaveFromCenterOfTarget(struct Sprite *sprite);\nstatic void InitSwirlingFogAnim(struct Sprite *sprite);\nstatic void AnimSwirlingFogAnim(struct Sprite *sprite);\nstatic void AnimThrowMistBall(struct Sprite *sprite);\nstatic void InitPoisonGasCloudAnim(struct Sprite *sprite);\nstatic void MovePoisonGasCloud(struct Sprite *sprite);\nstatic void AnimHailBegin(struct Sprite *sprite);\nstatic void AnimHailContinue(struct Sprite *sprite);\nstatic void InitIceBallAnim(struct Sprite *sprite);\nstatic void AnimThrowIceBall(struct Sprite *sprite);\nstatic void InitIceBallParticle(struct Sprite *sprite);\nstatic void AnimIceBallParticle(struct Sprite *sprite);\nstatic void AnimTask_HazeScrollingFog_Step(u8 taskId);\nstatic void AnimTask_MistBallFog_Step(u8 taskId);\nstatic void AnimTask_Hail2(u8 taskId);\nstatic bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c);\n\nstatic const union AnimCmd sAnim_Unused[] =\n{\n    ANIMCMD_FRAME(0, 5, .hFlip = TRUE),\n    ANIMCMD_FRAME(1, 5, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_Unused[] =\n{\n    sAnim_Unused,\n};\n\nstatic const struct SpriteTemplate sUnusedIceCrystalThrowSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_CRYSTALS,\n    .paletteTag = ANIM_TAG_ICE_CRYSTALS,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimUnusedIceCrystalThrow,\n};\n\nstatic const union AnimCmd sAnim_IceCrystalLargeChunk[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_IceCrystalLarge[] =\n{\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_IceCrystalSmall[] =\n{\n    ANIMCMD_FRAME(6, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Snowball[] =\n{\n    ANIMCMD_FRAME(7, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BlizzardIceCrystal[] =\n{\n    ANIMCMD_FRAME(8, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_SmallBubblePair[] =\n{\n    ANIMCMD_FRAME(12, 6),\n    ANIMCMD_FRAME(13, 6),\n    ANIMCMD_JUMP(0),\n};\n\n// Unused, contains just the top left corner of the large ice crystal\nstatic const union AnimCmd *const sAnims_IceCrystalLargeChunk[] =\n{\n    sAnim_IceCrystalLargeChunk,\n};\n\nstatic const union AnimCmd *const sAnims_IceCrystalLarge[] =\n{\n    sAnim_IceCrystalLarge,\n};\n\nstatic const union AnimCmd *const sAnims_IceCrystalSmall[] =\n{\n    sAnim_IceCrystalSmall,\n};\n\nstatic const union AnimCmd *const sAnims_Snowball[] =\n{\n    sAnim_Snowball,\n};\n\nstatic const union AnimCmd *const sAnims_BlizzardIceCrystal[] =\n{\n    sAnim_BlizzardIceCrystal,\n};\n\nconst union AnimCmd *const gAnims_SmallBubblePair[] =\n{\n    sAnim_SmallBubblePair,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_IceCrystalSpiralInwardLarge[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 40, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_IceCrystalSpiralInwardLarge[] =\n{\n    sAffineAnim_IceCrystalSpiralInwardLarge,\n};\n\nconst struct SpriteTemplate gIceCrystalSpiralInwardLarge =\n{\n    .tileTag = ANIM_TAG_ICE_CRYSTALS,\n    .paletteTag = ANIM_TAG_ICE_CRYSTALS,\n    .oam = &gOamData_AffineDouble_ObjBlend_8x16,\n    .anims = sAnims_IceCrystalLarge,\n    .images = NULL,\n    .affineAnims = sAffineAnims_IceCrystalSpiralInwardLarge,\n    .callback = AnimIcePunchSwirlingParticle,\n};\n\nconst struct SpriteTemplate gIceCrystalSpiralInwardSmall =\n{\n    .tileTag = ANIM_TAG_ICE_CRYSTALS,\n    .paletteTag = ANIM_TAG_ICE_CRYSTALS,\n    .oam = &gOamData_AffineOff_ObjBlend_8x8,\n    .anims = sAnims_IceCrystalSmall,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimIcePunchSwirlingParticle,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_IceBeamInnerCrystal[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 10, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_IceBeamInnerCrystal[] =\n{\n    sAffineAnim_IceBeamInnerCrystal,\n};\n\nconst struct SpriteTemplate gIceBeamInnerCrystalSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_CRYSTALS,\n    .paletteTag = ANIM_TAG_ICE_CRYSTALS,\n    .oam = &gOamData_AffineNormal_ObjBlend_8x16,\n    .anims = sAnims_IceCrystalLarge,\n    .images = NULL,\n    .affineAnims = sAffineAnims_IceBeamInnerCrystal,\n    .callback = AnimIceBeamParticle,\n};\n\nconst struct SpriteTemplate gIceBeamOuterCrystalSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_CRYSTALS,\n    .paletteTag = ANIM_TAG_ICE_CRYSTALS,\n    .oam = &gOamData_AffineOff_ObjBlend_8x8,\n    .anims = sAnims_IceCrystalSmall,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimIceBeamParticle,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_IceCrystalHit[] =\n{\n    AFFINEANIMCMD_FRAME(0xCE, 0xCE, 0, 0),\n    AFFINEANIMCMD_FRAME(0x5, 0x5, 0, 10),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 6),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_IceCrystalHit[] =\n{\n    sAffineAnim_IceCrystalHit,\n};\n\nconst struct SpriteTemplate gIceCrystalHitLargeSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_CRYSTALS,\n    .paletteTag = ANIM_TAG_ICE_CRYSTALS,\n    .oam = &gOamData_AffineNormal_ObjBlend_8x16,\n    .anims = sAnims_IceCrystalLarge,\n    .images = NULL,\n    .affineAnims = sAffineAnims_IceCrystalHit,\n    .callback = AnimIceEffectParticle,\n};\n\nconst struct SpriteTemplate gIceCrystalHitSmallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_CRYSTALS,\n    .paletteTag = ANIM_TAG_ICE_CRYSTALS,\n    .oam = &gOamData_AffineNormal_ObjBlend_8x8,\n    .anims = sAnims_IceCrystalSmall,\n    .images = NULL,\n    .affineAnims = sAffineAnims_IceCrystalHit,\n    .callback = AnimIceEffectParticle,\n};\n\nconst struct SpriteTemplate gSwirlingSnowballSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_CRYSTALS,\n    .paletteTag = ANIM_TAG_ICE_CRYSTALS,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sAnims_Snowball,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSwirlingSnowball,\n};\n\nconst struct SpriteTemplate gBlizzardIceCrystalSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_CRYSTALS,\n    .paletteTag = ANIM_TAG_ICE_CRYSTALS,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sAnims_BlizzardIceCrystal,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMoveParticleBeyondTarget,\n};\n\nconst struct SpriteTemplate gPowderSnowSnowballSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_CRYSTALS,\n    .paletteTag = ANIM_TAG_ICE_CRYSTALS,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sAnims_Snowball,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimMoveParticleBeyondTarget,\n};\n\nstatic const union AnimCmd sAnim_IceGroundSpike[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(2, 5),\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_FRAME(6, 5),\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_FRAME(2, 5),\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_IceGroundSpike[] =\n{\n    sAnim_IceGroundSpike,\n};\n\nconst struct SpriteTemplate gIceGroundSpikeSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_SPIKES,\n    .paletteTag = ANIM_TAG_ICE_SPIKES,\n    .oam = &gOamData_AffineOff_ObjBlend_8x16,\n    .anims = sAnims_IceGroundSpike,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWaveFromCenterOfTarget,\n};\n\nstatic const union AnimCmd sAnim_Cloud[] =\n{\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(8, 8),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_Cloud[] =\n{\n    sAnim_Cloud,\n};\n\nconst struct SpriteTemplate gMistCloudSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MIST_CLOUD,\n    .paletteTag = ANIM_TAG_MIST_CLOUD,\n    .oam = &gOamData_AffineOff_ObjBlend_32x16,\n    .anims = sAnims_Cloud,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = InitSwirlingFogAnim,\n};\n\nconst struct SpriteTemplate gSmogCloudSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_PURPLE_GAS_CLOUD,\n    .paletteTag = ANIM_TAG_PURPLE_GAS_CLOUD,\n    .oam = &gOamData_AffineOff_ObjBlend_32x16,\n    .anims = sAnims_Cloud,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = InitSwirlingFogAnim,\n};\n\nstatic const u8 sHazeBlendAmounts[] =\n{\n    0, 1, 2, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 6, 6, 7, 8, 8, 8, 9,\n};\n\nconst struct SpriteTemplate gMistBallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_BUBBLES,\n    .paletteTag = ANIM_TAG_SMALL_BUBBLES,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimThrowMistBall,\n};\n\nstatic const u8 sMistBlendAmounts[] =\n{\n    0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5,\n};\n\nconst struct SpriteTemplate gPoisonGasCloudSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_PURPLE_GAS_CLOUD,\n    .paletteTag = ANIM_TAG_PURPLE_GAS_CLOUD,\n    .oam = &gOamData_AffineOff_ObjBlend_32x16,\n    .anims = sAnims_Cloud,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = InitPoisonGasCloudAnim,\n};\n\nstatic const struct HailStruct sHailCoordData[] =\n{\n    {.x = 100, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT,    .unk3 = 2},\n    {.x = 85,  .y = 120, .bPosition = B_POSITION_PLAYER_LEFT,    .unk3 = 0},\n    {.x = 242, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT,  .unk3 = 1},\n    {.x = 66,  .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT,   .unk3 = 1},\n    {.x = 182, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .unk3 = 0},\n    {.x = 60,  .y = 120, .bPosition = B_POSITION_PLAYER_LEFT,    .unk3 = 2},\n    {.x = 214, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT,  .unk3 = 0},\n    {.x = 113, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT,    .unk3 = 1},\n    {.x = 210, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .unk3 = 1},\n    {.x = 38,  .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT,   .unk3 = 0},\n};\n\nstatic const union AffineAnimCmd sAffineAnim_HailParticle_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_HailParticle_1[] =\n{\n    AFFINEANIMCMD_FRAME(0xF0, 0xF0, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_HailParticle_2[] =\n{\n    AFFINEANIMCMD_FRAME(0xE0, 0xE0, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_WeatherBallIceDown[] =\n{\n    AFFINEANIMCMD_FRAME(0x150, 0x150, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_HailParticle[] =\n{\n    sAffineAnim_HailParticle_0,\n    sAffineAnim_HailParticle_1,\n    sAffineAnim_HailParticle_2,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_WeatherBallIceDown[] =\n{\n    sAffineAnim_WeatherBallIceDown,\n};\n\nstatic const struct SpriteTemplate sHailParticleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HAIL,\n    .paletteTag = ANIM_TAG_HAIL,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_HailParticle,\n    .callback = AnimHailBegin,\n};\n\nconst struct SpriteTemplate gWeatherBallIceDownSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HAIL,\n    .paletteTag = ANIM_TAG_HAIL,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_WeatherBallIceDown,\n    .callback = AnimWeatherBallDown,\n};\n\nstatic const union AnimCmd sAnim_IceBallChunk_0[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_IceBallChunk_1[] =\n{\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(48, 4),\n    ANIMCMD_FRAME(64, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_IceBallChunk[] =\n{\n    sAnim_IceBallChunk_0,\n    sAnim_IceBallChunk_1,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_IceBallChunk_0[] =\n{\n    AFFINEANIMCMD_FRAME(0xE0, 0xE0, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_IceBallChunk_1[] =\n{\n    AFFINEANIMCMD_FRAME(0x118, 0x118, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_IceBallChunk_2[] =\n{\n    AFFINEANIMCMD_FRAME(0x150, 0x150, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_IceBallChunk_3[] =\n{\n    AFFINEANIMCMD_FRAME(0x180, 0x180, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_IceBallChunk_4[] =\n{\n    AFFINEANIMCMD_FRAME(0x1C0, 0x1C0, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_IceBallChunk[] =\n{\n    sAffineAnim_IceBallChunk_0,\n    sAffineAnim_IceBallChunk_1,\n    sAffineAnim_IceBallChunk_2,\n    sAffineAnim_IceBallChunk_3,\n    sAffineAnim_IceBallChunk_4,\n};\n\nconst struct SpriteTemplate gIceBallChunkSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_CHUNK,\n    .paletteTag = ANIM_TAG_ICE_CHUNK,\n    .oam = &gOamData_AffineDouble_ObjNormal_32x32,\n    .anims = sAnims_IceBallChunk,\n    .images = NULL,\n    .affineAnims = sAffineAnims_IceBallChunk,\n    .callback = InitIceBallAnim,\n};\n\nconst struct SpriteTemplate gIceBallImpactShardSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_CRYSTALS,\n    .paletteTag = ANIM_TAG_ICE_CRYSTALS,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sAnims_IceCrystalSmall,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = InitIceBallParticle,\n};\n\nstatic void AnimUnusedIceCrystalThrow(struct Sprite *sprite)\n{\n    s16 targetX, targetY, attackerX, attackerY;\n\n    sprite->oam.tileNum += 7;\n    targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[1] = gBattleAnimArgs[0] + attackerX;\n    sprite->data[2] = gBattleAnimArgs[2] + targetX;\n    sprite->data[3] = gBattleAnimArgs[1] + attackerY;\n    sprite->data[4] = gBattleAnimArgs[3] + targetY;\n    ConvertPosDataToTranslateLinearData(sprite);\n    // won't match with while loop\n    for (; (targetX >= -32 && targetX <= DISPLAY_WIDTH + 32) && (targetY >= -32 && targetY <= DISPLAY_HEIGHT + 32);\n            targetX += sprite->data[1], targetY += sprite->data[2])\n        ;\n    sprite->data[1] = -sprite->data[1];\n    sprite->data[2] = -sprite->data[2];\n    for (; (attackerX >= -32 && attackerX <= DISPLAY_WIDTH + 32) && (attackerY >= -32 && attackerY <= DISPLAY_HEIGHT + 32);\n            attackerX += sprite->data[1], attackerY += sprite->data[2])\n        ;\n    sprite->x = attackerX;\n    sprite->y = attackerY;\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[1] = attackerX;\n    sprite->data[2] = targetX;\n    sprite->data[3] = attackerY;\n    sprite->data[4] = targetY;\n    ConvertPosDataToTranslateLinearData(sprite);\n    sprite->data[3] = gBattleAnimArgs[5];\n    sprite->data[4] = gBattleAnimArgs[6];\n    sprite->callback = AnimUnusedIceCrystalThrow_Step;\n}\n\nstatic void AnimUnusedIceCrystalThrow_Step(struct Sprite *sprite)\n{\n    if (sprite->data[0] != 0)\n    {\n        sprite->data[5] += sprite->data[1];\n        sprite->data[6] += sprite->data[2];\n        sprite->x2 = sprite->data[5];\n        sprite->y2 = sprite->data[6];\n        sprite->x2 += Sin(sprite->data[7], sprite->data[3]);\n        sprite->y2 += Sin(sprite->data[7], sprite->data[3]);\n        sprite->data[7] = (sprite->data[7] + sprite->data[4]) & 0xFF;\n        --sprite->data[0];\n    }\n    else\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\n// Animates the swirling ice crystals in Ice Punch.\n// arg 0: initial position angle around circle (0-256)\nstatic void AnimIcePunchSwirlingParticle(struct Sprite *sprite)\n{\n    sprite->data[0] = gBattleAnimArgs[0];\n    sprite->data[1] = 60;\n    sprite->data[2] = 9;\n    sprite->data[3] = 30;\n    sprite->data[4] = -512;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = TranslateSpriteInGrowingCircle;\n    sprite->callback(sprite);\n}\n\n// Animates the ice particles in Ice Beam.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: target x offset\n// arg 3: target y offset\n// arg 4: duration\nstatic void AnimIceBeamParticle(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->data[2] -= gBattleAnimArgs[2];\n    else\n        sprite->data[2] += gBattleAnimArgs[2];\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    sprite->data[0] = gBattleAnimArgs[4];\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = StartAnimLinearTranslation;\n}\n\n// Animates the ice crystals at the end of Ice Punch, Ice Beam, Tri Attack,\n// Weather Ball (Hail), Blizzard, and Powder Snow.\n// arg 0: target x offset\n// arg 1: target y offset\n// arg 2: ??? unknown boolean\nstatic void AnimIceEffectParticle(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[2] == 0)\n    {\n        InitSpritePosToAnimTarget(sprite, TRUE);\n    }\n    else\n    {\n        SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->x, &sprite->y);\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n    }\n    StoreSpriteCallbackInData6(sprite, AnimFlickerIceEffectParticle);\n    sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n}\n\nstatic void AnimFlickerIceEffectParticle(struct Sprite *sprite)\n{\n    sprite->invisible ^= 1;\n    if (++sprite->data[0] == 20)\n        DestroySpriteAndMatrix(sprite);\n}\n\n// Animates the small snowballs that swirl around the target in Blizzard and Icy Wind.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: target x offset\n// arg 3: target y offset\n// arg 4: particle speed\n// arg 5: multiple targets? (boolean)\nstatic void AnimSwirlingSnowball(struct Sprite *sprite)\n{\n    s32 i;\n    s16 tempDataHolder[8];\n\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[1] = sprite->x;\n    sprite->data[3] = sprite->y;\n    if (!gBattleAnimArgs[5])\n    {\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    }\n    else\n    {\n        SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);\n    }\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->data[2] -= gBattleAnimArgs[2];\n    else\n        sprite->data[2] += gBattleAnimArgs[2];\n    for (i = 0; i < 8; ++i)\n        tempDataHolder[i] = sprite->data[i];\n    InitAnimFastLinearTranslationWithSpeed(sprite);\n    sprite->data[1] ^= 1;\n    sprite->data[2] ^= 1;\n    while (1)\n    {\n        sprite->data[0] = 1;\n        AnimFastTranslateLinear(sprite);\n        if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16\n         || sprite->x + sprite->x2 < -16\n         || sprite->y + sprite->y2 > DISPLAY_HEIGHT\n         || sprite->y + sprite->y2 < -16)\n            break;\n    }\n    sprite->x += sprite->x2;\n    sprite->y += sprite->y2;\n    sprite->x2 = sprite->y2 = 0;\n    for (i = 0; i < 8; ++i)\n        sprite->data[i] = tempDataHolder[i];\n    sprite->callback = InitAnimFastLinearTranslationWithSpeedAndPos;\n    StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step1);\n}\n\nstatic void AnimSwirlingSnowball_Step1(struct Sprite *sprite)\n{\n    s16 tempVar;\n\n    sprite->x += sprite->x2;\n    sprite->y += sprite->y2;\n    sprite->y2 = 0;\n    sprite->x2 = 0;\n    sprite->data[0] = 128;\n    tempVar = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 20 : -20;\n    sprite->data[3] = Sin(sprite->data[0], tempVar);\n    sprite->data[4] = Cos(sprite->data[0], 0xF);\n    sprite->data[5] = 0;\n    sprite->callback = AnimSwirlingSnowball_Step2;\n    sprite->callback(sprite);\n}\n\nstatic void AnimSwirlingSnowball_Step2(struct Sprite *sprite)\n{\n    s16 tempVar = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 20 : -20;\n    \n    if (sprite->data[5] <= 31)\n    {\n        sprite->x2 = Sin(sprite->data[0], tempVar) - sprite->data[3];\n        sprite->y2 = Cos(sprite->data[0], 15)      - sprite->data[4];\n        sprite->data[0] = (sprite->data[0] + 16) & 0xFF;\n        sprite->data[5] += 1;\n    }\n    else\n    {\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->x2 = sprite->y2 = 0;\n        sprite->data[3] = sprite->data[4] = 0;\n        sprite->callback = AnimSwirlingSnowball_End;\n    }\n}\n\nstatic void AnimSwirlingSnowball_End(struct Sprite *sprite)\n{\n    sprite->data[0] = 1;\n    AnimFastTranslateLinear(sprite);\n    if ((u32)(sprite->x + sprite->x2 + 16) > 272\n     || sprite->y + sprite->y2 > 256\n     || sprite->y + sprite->y2 < -16)\n        DestroyAnimSprite(sprite);\n}\n\n// Moves particles towards the target mon and off the screen. Used to animate\n// the large snowballs in Blizzard and the small snowballs in Powder Snow.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: target x offset\n// arg 3: target y offset\n// arg 4: speed\n// arg 5: wave amplitude\n// arg 6: wave frequency\n// arg 7: multiple targets? (boolean)\nstatic void AnimMoveParticleBeyondTarget(struct Sprite *sprite)\n{\n    s32 i;\n    s16 tempDataHolder[8];\n\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[1] = sprite->x;\n    sprite->data[3] = sprite->y;\n    if (!gBattleAnimArgs[7])\n    {\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n    else\n    {\n        SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);\n    }\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->data[2] -= gBattleAnimArgs[2];\n    else\n        sprite->data[2] += gBattleAnimArgs[2];\n    sprite->data[4] += gBattleAnimArgs[3];\n    InitAnimFastLinearTranslationWithSpeed(sprite);\n    for (i = 0; i < 8; ++i)\n        tempDataHolder[i] = sprite->data[i];\n    sprite->data[1] ^= 1;\n    sprite->data[2] ^= 1;\n    while (1)\n    {\n        sprite->data[0] = 1;\n        AnimFastTranslateLinear(sprite);\n        if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16\n         || sprite->x + sprite->x2 < -16\n         || sprite->y + sprite->y2 > DISPLAY_HEIGHT\n         || sprite->y + sprite->y2 < -16)\n            break;\n    }\n    sprite->x += sprite->x2;\n    sprite->y += sprite->y2;\n    sprite->y2 = 0;\n    sprite->x2 = 0;\n    for (i = 0; i < 8; ++i)\n        sprite->data[i] = tempDataHolder[i];\n    sprite->data[5] = gBattleAnimArgs[5];\n    sprite->data[6] = gBattleAnimArgs[6];\n    sprite->callback = AnimWiggleParticleTowardsTarget;\n}\n\n// Moves particles in a sine wave towards the target.\nstatic void AnimWiggleParticleTowardsTarget(struct Sprite *sprite)\n{\n    AnimFastTranslateLinear(sprite);\n    if (sprite->data[0] == 0)\n        sprite->data[0] = 1;\n    sprite->y2 += Sin(sprite->data[7], sprite->data[5]);\n    sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF;\n    if (sprite->data[0] == 1)\n    {\n        if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16\n         || sprite->x + sprite->x2 < -16\n         || sprite->y + sprite->y2 > DISPLAY_HEIGHT\n         || sprite->y + sprite->y2 < -16)\n            DestroyAnimSprite(sprite);\n    }\n}\n\n// Animates the ice pilar wave used by Icy Wind.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: ??? unknown boolean\nstatic void AnimWaveFromCenterOfTarget(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        if (gBattleAnimArgs[2] == 0)\n        {\n            InitSpritePosToAnimTarget(sprite, FALSE);\n        }\n        else\n        {\n            SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->x, &sprite->y);\n            if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n                gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n            sprite->x += gBattleAnimArgs[0];\n            sprite->y += gBattleAnimArgs[1];\n        }\n        ++sprite->data[0];\n    }\n    else\n    {\n        if (sprite->animEnded)\n            DestroyAnimSprite(sprite);\n    }\n}\n\n// Animates the fog that swirls around the mon in Mist and Smog.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: change in y pixels per rotation\n// arg 3: duration\n// arg 4: animate on opponent? (boolean)\n// arg 5: ??? unknown boolean\nstatic void InitSwirlingFogAnim(struct Sprite *sprite)\n{\n    s16 tempVar;\n    u8  battler;\n\n    if (gBattleAnimArgs[4] == 0)\n    {\n        if (gBattleAnimArgs[5] == 0)\n        {\n            InitSpritePosToAnimAttacker(sprite, FALSE);\n        }\n        else\n        {\n            SetAverageBattlerPositions(gBattleAnimAttacker, 0, &sprite->x, &sprite->y);\n            if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n                sprite->x -= gBattleAnimArgs[0];\n            else\n                sprite->x += gBattleAnimArgs[0];\n            sprite->y += gBattleAnimArgs[1];\n        }\n        battler = gBattleAnimAttacker;\n    }\n    else\n    {\n        if (gBattleAnimArgs[5] == 0)\n        {\n            InitSpritePosToAnimTarget(sprite, FALSE);\n        }\n        else\n        {\n            SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->x, &sprite->y);\n            if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)\n                sprite->x -= gBattleAnimArgs[0];\n            else\n                sprite->x += gBattleAnimArgs[0];\n            sprite->y += gBattleAnimArgs[1];\n        }\n        battler = gBattleAnimTarget;\n    }\n    sprite->data[7] = battler;\n    if (gBattleAnimArgs[5] == 0 || !IsDoubleBattle())\n        tempVar = 0x20;\n    else\n        tempVar = 0x40;\n    sprite->data[6] = tempVar;\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n        sprite->y += 8;\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = sprite->x;\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = sprite->y + gBattleAnimArgs[2];\n    InitAnimLinearTranslation(sprite);\n    sprite->data[5] = 64;\n    sprite->callback = AnimSwirlingFogAnim;\n    sprite->callback(sprite);\n}\n\n// Animates swirling fog initialized by InitSwirlingFogAnim.\nstatic void AnimSwirlingFogAnim(struct Sprite *sprite)\n{\n    if (!AnimTranslateLinear(sprite))\n    {\n        sprite->x2 += Sin(sprite->data[5], sprite->data[6]);\n        sprite->y2 += Cos(sprite->data[5], -6);\n        if ((u16)(sprite->data[5] - 64) <= 0x7F)\n            sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]);\n        else\n            sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]) + 1;\n        sprite->data[5] = (sprite->data[5] + 3) & 0xFF;\n    }\n    else\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\n// Fades mons to black and places foggy overlay in Haze.\nvoid AnimTask_HazeScrollingFog(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n    SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);\n    if (!IsContest())\n        SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);\n    SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);\n    GetBattleAnimBg1Data(&animBg);\n    LoadBgTiles(animBg.bgId, gWeatherFogHorizontalTiles, 0x800, animBg.tilesOffset);\n    AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimFogTilemap);\n    LoadPalette(&gDefaultWeatherSpritePalette, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n    if (IsContest())\n        RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0);\n    gTasks[taskId].func = AnimTask_HazeScrollingFog_Step;\n}\n\nstatic void AnimTask_HazeScrollingFog_Step(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n\n    gBattle_BG1_X += -1;\n    switch (gTasks[taskId].data[12])\n    {\n    case 0:\n        if (++gTasks[taskId].data[10] == 4)\n        {\n            gTasks[taskId].data[10] = 0;\n            ++gTasks[taskId].data[9];\n            gTasks[taskId].data[11] = sHazeBlendAmounts[gTasks[taskId].data[9]];\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));\n            if (gTasks[taskId].data[11] == 9)\n            {\n                ++gTasks[taskId].data[12];\n                gTasks[taskId].data[11] = 0;\n            }\n        }\n        break;\n    case 1:\n        if (++gTasks[taskId].data[11] == 0x51)\n        {\n            gTasks[taskId].data[11] = 9;\n            ++gTasks[taskId].data[12];\n        }\n        break;\n    case 2:\n        if (++gTasks[taskId].data[10] == 4)\n        {\n            gTasks[taskId].data[10] = 0;\n            --gTasks[taskId].data[11];\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));\n            if (gTasks[taskId].data[11] == 0)\n            {\n                ++gTasks[taskId].data[12];\n                gTasks[taskId].data[11] = 0;\n            }\n        }\n        break;\n    case 3:\n        GetBattleAnimBg1Data(&animBg);\n        InitBattleAnimBg(1);\n        InitBattleAnimBg(2);\n        ++gTasks[taskId].data[12];\n        // fall through\n    case 4:\n        if (!IsContest())\n            SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);\n        gBattle_BG1_X = 0;\n        gBattle_BG1_Y = 0;\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Throws the ball in Mist Ball.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: targey x offset\n// arg 3: target y offset\n// arg 4: duration\n// arg 5: ??? unknown (seems to vibrate target mon somehow)\nstatic void AnimThrowMistBall(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->callback = TranslateAnimSpriteToTargetMonLocation;\n}\n\nvoid AnimTask_MistBallFog(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n    SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);\n    if (!IsContest())\n        SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);\n    SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);\n    GetBattleAnimBg1Data(&animBg);\n    LoadBgTiles(animBg.bgId, gWeatherFogHorizontalTiles, 0x800, animBg.tilesOffset);\n    AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimFogTilemap);\n    LoadPalette(&gDefaultWeatherSpritePalette, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n    if (IsContest())\n        RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0);\n    gTasks[taskId].data[15] = -1;\n    gTasks[taskId].func = AnimTask_MistBallFog_Step;\n}\n\nstatic void AnimTask_MistBallFog_Step(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n\n    gBattle_BG1_X += gTasks[taskId].data[15];\n    switch (gTasks[taskId].data[12])\n    {\n    case 0:\n        gTasks[taskId].data[9] += 1;\n        gTasks[taskId].data[11] = sMistBlendAmounts[gTasks[taskId].data[9]];\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 17 - gTasks[taskId].data[11]));\n        if (gTasks[taskId].data[11] == 5)\n        {\n            ++gTasks[taskId].data[12];\n            gTasks[taskId].data[11] = 0;\n        }\n        break;\n    case 1:\n        if (++gTasks[taskId].data[11] == 0x51)\n        {\n            gTasks[taskId].data[11] = 5;\n            ++gTasks[taskId].data[12];\n        }\n        break;\n    case 2:\n        if (++gTasks[taskId].data[10] == 4)\n        {\n            gTasks[taskId].data[10] = 0;\n            gTasks[taskId].data[11] -= 1;\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));\n            if (gTasks[taskId].data[11] == 0)\n            {\n                ++gTasks[taskId].data[12];\n                gTasks[taskId].data[11] = 0;\n            }\n        }\n        break;\n    case 3:\n        GetBattleAnimBg1Data(&animBg);\n        InitBattleAnimBg(1);\n        InitBattleAnimBg(2);\n        ++gTasks[taskId].data[12];\n        // fall through\n    case 4:\n        if (!IsContest())\n            SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);\n        gBattle_BG1_X = 0;\n        gBattle_BG1_Y = 0;\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Initializes gas clouds in the Poison Gas animation.\n// arg 0: duration\n// arg 1: ? target x offset\n// arg 2: ? target y offset\n// arg 3: ? swirl start x\n// arg 4: ? swirl start y\n// arg 5: ??? unknown\n// arg 6: ??? unknown\n// arg 7: ??? unknown boolean\nstatic void InitPoisonGasCloudAnim(struct Sprite *sprite)\n{\n    sprite->data[0] = gBattleAnimArgs[0];\n    if (GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) < GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2))\n        sprite->data[7] = 0x8000;\n    if ((gBattlerPositions[gBattleAnimTarget] & BIT_SIDE) == B_SIDE_PLAYER)\n    {\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n        gBattleAnimArgs[3] = -gBattleAnimArgs[3];\n        if ((sprite->data[7] & 0x8000) && (gBattlerPositions[gBattleAnimAttacker] & BIT_SIDE) == B_SIDE_PLAYER)\n            sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1;\n        sprite->data[6] = 1;\n    }\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    if (gBattleAnimArgs[7])\n    {\n        sprite->data[1] = sprite->x + gBattleAnimArgs[1];\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[3];\n        sprite->data[3] = sprite->y + gBattleAnimArgs[2];\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[4];\n        sprite->data[7] |= GetBattlerSpriteBGPriority(gBattleAnimTarget) << 8;\n    }\n    else\n    {\n        sprite->data[1] = sprite->x + gBattleAnimArgs[1];\n        sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[3];\n        sprite->data[3] = sprite->y + gBattleAnimArgs[2];\n        sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[4];\n        sprite->data[7] |= GetBattlerSpriteBGPriority(gBattleAnimTarget) << 8;\n    }\n    if (IsContest())\n    {\n        sprite->data[6] = 1;\n        sprite->subpriority = 0x80;\n    }\n    InitAnimLinearTranslation(sprite);\n    sprite->callback = MovePoisonGasCloud;\n}\n\nstatic void MovePoisonGasCloud(struct Sprite *sprite)\n{\n    s32 value;\n\n    switch (sprite->data[7] & 0xFF)\n    {\n    case 0:\n        AnimTranslateLinear(sprite);\n        value = gSineTable[sprite->data[5]];\n        sprite->x2 += value >> 4;\n        if (sprite->data[6])\n            sprite->data[5] = (sprite->data[5] - 8) & 0xFF;\n        else\n            sprite->data[5] = (sprite->data[5] + 8) & 0xFF;\n        if (sprite->data[0] <= 0)\n        {\n            sprite->data[0] = 80;\n            sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n            sprite->data[1] = sprite->x;\n            sprite->data[2] = sprite->x;\n            sprite->y += sprite->y2;\n            sprite->data[3] = sprite->y;\n            sprite->data[4] = sprite->y + 29;\n            ++sprite->data[7];\n            if (IsContest())\n                sprite->data[5] = 80;\n            else if (GET_BATTLER_SIDE2(gBattleAnimTarget) != B_SIDE_PLAYER)\n                sprite->data[5] = 204;\n            else\n                sprite->data[5] = 80;\n            sprite->y2 = 0;\n            value = gSineTable[sprite->data[5]];\n            sprite->x2 = value >> 3;\n            sprite->data[5] = (sprite->data[5] + 2) & 0xFF;\n            InitAnimLinearTranslation(sprite);\n        }\n        break;\n    case 1:\n        AnimTranslateLinear(sprite);\n        value = gSineTable[sprite->data[5]];\n        sprite->x2 += value >> 3;\n        sprite->y2 += (gSineTable[sprite->data[5] + 0x40] * -3) >> 8;\n        if (!IsContest())\n        {\n            u16 var0 = sprite->data[5] - 0x40;\n\n            if (var0 <= 0x7F)\n                sprite->oam.priority = sprite->data[7] >> 8;\n            else\n                sprite->oam.priority = (sprite->data[7] >> 8) + 1;\n            sprite->data[5] = (sprite->data[5] + 4) & 0xFF;\n        }\n        else\n        {\n            u16 var0 = sprite->data[5] - 0x40;\n\n            if (var0 <= 0x7F)\n                sprite->subpriority = 128;\n            else\n                sprite->subpriority = 140;\n            sprite->data[5] = (sprite->data[5] - 4) & 0xFF;\n        }\n        if (sprite->data[0] <= 0)\n        {\n            sprite->data[0] = 0x300;\n            sprite->data[1] = sprite->x += sprite->x2;\n            sprite->data[3] = sprite->y += sprite->y2;\n            sprite->data[4] = sprite->y + 4;\n            if (IsContest())\n                sprite->data[2] = -0x10;\n            else if (GET_BATTLER_SIDE2(gBattleAnimTarget) != B_SIDE_PLAYER)\n                sprite->data[2] = 0x100;\n            else\n                sprite->data[2] = -0x10;\n            ++sprite->data[7];\n            sprite->x2 = sprite->y2 = 0;\n            InitAnimLinearTranslationWithSpeed(sprite);\n        }\n        break;\n    case 2:\n        if (AnimTranslateLinear(sprite))\n        {\n            if (sprite->oam.affineMode & 1)\n            {\n                FreeOamMatrix(sprite->oam.matrixNum);\n                sprite->oam.affineMode = ST_OAM_AFFINE_OFF;\n            }\n            DestroySprite(sprite);\n            --gAnimVisualTaskCount;\n        }\n        break;\n    }\n}\n\n// Creates Hail.\nvoid AnimTask_Hail(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->func = AnimTask_Hail2;\n}\n\nstatic void AnimTask_Hail2(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        if (++task->data[4] > 2)\n        {\n            task->data[4] = 0;\n            task->data[5] = 0;\n            task->data[2] = 0;\n            ++task->data[0];\n        }\n        break;\n    case 1:\n        if (task->data[5] == 0)\n        {\n            if (GenerateHailParticle(task->data[3], task->data[2], taskId, 1))\n                ++task->data[1];\n            if (++task->data[2] == 3)\n            {\n                if (++task->data[3] == 10)\n                    ++task->data[0];\n                else\n                    --task->data[0];\n            }\n            else\n            {\n                task->data[5] = 1;\n            }\n        }\n        else\n        {\n            --task->data[5];\n        }\n        break;\n    case 2:\n        if (task->data[1] == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c)\n{\n    u8 id;\n    s16 battlerX, battlerY;\n    s16 spriteX;\n    bool8 possibleBool = FALSE;\n    s8 unk = sHailCoordData[hailStructId].unk3;\n\n    if (unk != 2)\n    {\n        id = GetBattlerAtPosition(sHailCoordData[hailStructId].bPosition);\n        if (IsBattlerSpriteVisible(id))\n        {\n            possibleBool = TRUE;\n            battlerX = GetBattlerSpriteCoord(id, BATTLER_COORD_X_2);\n            battlerY = GetBattlerSpriteCoord(id, BATTLER_COORD_Y_PIC_OFFSET);\n            switch (unk)\n            {\n            case 0:\n                battlerX -= GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_WIDTH) / 6;\n                battlerY -= GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_HEIGHT) / 6;\n                break;\n            case 1:\n                battlerX += GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_WIDTH) / 6;\n                battlerY += GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_HEIGHT) / 6;\n                break;\n            }\n        }\n        else\n        {\n            battlerX = sHailCoordData[hailStructId].x;\n            battlerY = sHailCoordData[hailStructId].y;\n        }\n    }\n    else\n    {\n        battlerX = sHailCoordData[hailStructId].x;\n        battlerY = sHailCoordData[hailStructId].y;\n    }\n    spriteX = battlerX - ((battlerY + 8) / 2);\n    id = CreateSprite(&sHailParticleSpriteTemplate, spriteX, -8, 18);\n    if (id == MAX_SPRITES)\n    {\n        return FALSE;\n    }\n    else\n    {\n        StartSpriteAffineAnim(&gSprites[id], affineAnimNum);\n        gSprites[id].data[0] = possibleBool;\n        gSprites[id].data[3] = battlerX;\n        gSprites[id].data[4] = battlerY;\n        gSprites[id].data[5] = affineAnimNum;\n        gSprites[id].data[6] = taskId;\n        gSprites[id].data[7] = c;\n        return TRUE;\n    }\n}\n\nstatic void AnimHailBegin(struct Sprite *sprite)\n{\n    u8 spriteId;\n\n    sprite->x += 4;\n    sprite->y += 8;\n    if (sprite->x < sprite->data[3] && sprite->y < sprite->data[4])\n        return;\n    if (sprite->data[0] == 1 && sprite->data[5] == 0)\n    {\n        spriteId = CreateSprite(&gIceCrystalHitLargeSpriteTemplate, sprite->data[3], sprite->data[4], sprite->subpriority);\n        sprite->data[0] = spriteId;\n        if (spriteId != 64)\n        {\n            gSprites[sprite->data[0]].callback = AnimHailContinue;\n            gSprites[sprite->data[0]].data[6] = sprite->data[6];\n            gSprites[sprite->data[0]].data[7] = sprite->data[7];\n        }\n        FreeOamMatrix(sprite->oam.matrixNum);\n        DestroySprite(sprite);\n    }\n    else\n    {\n        --gTasks[sprite->data[6]].data[sprite->data[7]];\n        FreeOamMatrix(sprite->oam.matrixNum);\n        DestroySprite(sprite);\n    }\n}\n\nstatic void AnimHailContinue(struct Sprite *sprite)\n{\n    if (++sprite->data[0] == 20)\n    {\n        --gTasks[sprite->data[6]].data[sprite->data[7]];\n        FreeOamMatrix(sprite->oam.matrixNum);\n        DestroySprite(sprite);\n    }\n}\n\n// Initializes the animation for Ice Ball.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: target x offset\n// arg 3: target y offset\n// arg 4: duration\n// arg 5: arc height (negative)\nstatic void InitIceBallAnim(struct Sprite *sprite)\n{\n    u8 animNum = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1;\n\n    if (animNum > 4)\n        animNum = 4;\n    StartSpriteAffineAnim(sprite, animNum);\n    InitSpritePosToAnimAttacker(sprite, 1);\n    sprite->data[0] = gBattleAnimArgs[4];\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    sprite->data[5] = gBattleAnimArgs[5];\n    InitAnimArcTranslation(sprite);\n    sprite->callback = AnimThrowIceBall;\n}\n\n// Throws the ball of ice in Ice Ball.\nstatic void AnimThrowIceBall(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n    {\n        StartSpriteAnim(sprite, 1);\n        sprite->callback = RunStoredCallbackWhenAnimEnds;\n        StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    }\n}\n\n// Initializes the particles that scatter at the end of the Ice Ball animation.\nstatic void InitIceBallParticle(struct Sprite *sprite)\n{\n    s16 randA, randB;\n\n    sprite->oam.tileNum += 8;\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    randA = (Random() & 0xFF) + 256;\n    randB = Random() & 0x1FF;\n    if (randB > 0xFF)\n        randB = 256 - randB;\n    sprite->data[1] = randA;\n    sprite->data[2] = randB;\n    sprite->callback = AnimIceBallParticle;\n}\n\n// Animates the particles created by InitIceBallParticle.\nstatic void AnimIceBallParticle(struct Sprite *sprite)\n{\n    sprite->data[3] += sprite->data[1];\n    sprite->data[4] += sprite->data[2];\n    if (sprite->data[1] & 1)\n        sprite->x2 = -(sprite->data[3] >> 8);\n    else\n        sprite->x2 = sprite->data[3] >> 8;\n    sprite->y2 = sprite->data[4] >> 8;\n    if (++sprite->data[0] == 21)\n        DestroyAnimSprite(sprite);\n}\n\n// Counter for Ice Ball.\nvoid AnimTask_GetRolloutCounter(u8 taskId)\n{\n    u8 arg = gBattleAnimArgs[0];\n\n    gBattleAnimArgs[arg] = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1;\n    DestroyAnimVisualTask(taskId);\n}\n"
  },
  {
    "path": "src/battle_anim_mon_movement.c",
    "content": "#include \"global.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"task.h\"\n#include \"trig.h\"\n\n#undef abs\n#define abs(x) ((x) < 0 ? -(x) : (x))\n\nstatic void AnimTask_ShakeMon_Step(u8 taskId);\nstatic void AnimTask_ShakeMon2Step(u8 taskId);\nstatic void AnimTask_ShakeMonInPlace_Step(u8 taskId);\nstatic void AnimTask_ShakeAndSinkMon_Step(u8 taskId);\nstatic void AnimTask_TranslateMonElliptical_Step(u8 taskId);\nstatic void DoHorizontalLunge(struct Sprite *sprite);\nstatic void ReverseHorizontalLungeDirection(struct Sprite *sprite);\nstatic void DoVerticalDip(struct Sprite *sprite);\nstatic void ReverseVerticalDipDirection(struct Sprite *sprite);\nstatic void SlideMonToOriginalPos(struct Sprite *sprite);\nstatic void SlideMonToOriginalPos_Step(struct Sprite *sprite);\nstatic void SlideMonToOffset(struct Sprite *sprite);\nstatic void SlideMonToOffsetAndBack(struct Sprite *sprite);\nstatic void SlideMonToOffsetAndBack_End(struct Sprite *sprite);\nstatic void AnimTask_WindUpLunge_Step1(u8 taskId);\nstatic void AnimTask_WindUpLunge_Step2(u8 taskId);\nstatic void AnimTask_SlideOffScreen_Step(u8 taskId);\nstatic void AnimTask_SwayMon_Step(u8 taskId);\nstatic void AnimTask_ScaleMonAndRestore_Step(u8 taskId);\nstatic void AnimTask_RotateMonSpriteToSide_Step(u8 taskId);\nstatic void AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step(u8 taskId);\n\nconst struct SpriteTemplate gHorizontalLungeSpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = DoHorizontalLunge,\n};\n\nconst struct SpriteTemplate gVerticalDipSpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = DoVerticalDip,\n};\n\nconst struct SpriteTemplate gSlideMonToOriginalPosSpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SlideMonToOriginalPos,\n};\n\nconst struct SpriteTemplate gSlideMonToOffsetSpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SlideMonToOffset,\n};\n\nconst struct SpriteTemplate gSlideMonToOffsetAndBackSpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SlideMonToOffsetAndBack,\n};\n\n// Task to facilitate simple shaking of a pokemon's picture in battle.\n// The shaking alternates between the original position and the target position.\n// arg 0: anim battler\n// arg 1: x pixel offset\n// arg 2: y pixel offset\n// arg 3: num times to shake\n// arg 4: frame delay\nvoid AnimTask_ShakeMon(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n\n    if (spriteId == SPRITE_NONE)\n    {\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n    gSprites[spriteId].x2 = gBattleAnimArgs[1];\n    gSprites[spriteId].y2 = gBattleAnimArgs[2];\n    gTasks[taskId].data[0] = spriteId;\n    gTasks[taskId].data[1] = gBattleAnimArgs[3];\n    gTasks[taskId].data[2] = gBattleAnimArgs[4];\n    gTasks[taskId].data[3] = gBattleAnimArgs[4];\n    gTasks[taskId].data[4] = gBattleAnimArgs[1];\n    gTasks[taskId].data[5] = gBattleAnimArgs[2];\n    gTasks[taskId].func = AnimTask_ShakeMon_Step;\n    gTasks[taskId].func(taskId);\n}\n\nstatic void AnimTask_ShakeMon_Step(u8 taskId)\n{\n    if (gTasks[taskId].data[3] == 0)\n    {\n        if (gSprites[gTasks[taskId].data[0]].x2 == 0)\n            gSprites[gTasks[taskId].data[0]].x2 = gTasks[taskId].data[4];\n        else\n            gSprites[gTasks[taskId].data[0]].x2 = 0;\n        if (gSprites[gTasks[taskId].data[0]].y2 == 0)\n            gSprites[gTasks[taskId].data[0]].y2 = gTasks[taskId].data[5];\n        else\n            gSprites[gTasks[taskId].data[0]].y2 = 0;\n        gTasks[taskId].data[3] = gTasks[taskId].data[2];\n        if (--gTasks[taskId].data[1] == 0)\n        {\n            gSprites[gTasks[taskId].data[0]].x2 = 0;\n            gSprites[gTasks[taskId].data[0]].y2 = 0;\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n    else\n        gTasks[taskId].data[3]--;\n}\n\n// Task to facilitate simple shaking of a pokemon's picture in battle.\n// The shaking alternates between the positive and negative versions of the specified pixel offsets.\n// arg 0: anim battler\n// arg 1: x pixel offset\n// arg 2: y pixel offset\n// arg 3: num times to shake\n// arg 4: frame delay\nvoid AnimTask_ShakeMon2(u8 taskId)\n{\n    bool8 abort = FALSE;\n    u8 spriteId;\n    u8 battlerId;\n\n    if (gBattleAnimArgs[0] < MAX_BATTLERS_COUNT)\n    {\n        spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n        if (spriteId == SPRITE_NONE)\n            abort = TRUE;\n    }\n    else if (gBattleAnimArgs[0] != 8)\n    {\n        switch (gBattleAnimArgs[0])\n        {\n        case 4:\n            battlerId = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n            break;\n        case 5:\n            battlerId = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);\n            break;\n        case 6:\n            battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n            break;\n        default:\n            battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n            break;\n        }\n        if (!IsBattlerSpriteVisible(battlerId))\n            abort = TRUE;\n        spriteId = gBattlerSpriteIds[battlerId];\n    }\n    else\n        spriteId = gBattlerSpriteIds[gBattleAnimAttacker];\n\n    if (abort)\n    {\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n\n    gSprites[spriteId].x2 = gBattleAnimArgs[1];\n    gSprites[spriteId].y2 = gBattleAnimArgs[2];\n    gTasks[taskId].data[0] = spriteId;\n    gTasks[taskId].data[1] = gBattleAnimArgs[3];\n    gTasks[taskId].data[2] = gBattleAnimArgs[4];\n    gTasks[taskId].data[3] = gBattleAnimArgs[4];\n    gTasks[taskId].data[4] = gBattleAnimArgs[1];\n    gTasks[taskId].data[5] = gBattleAnimArgs[2];\n    gTasks[taskId].func = AnimTask_ShakeMon2Step;\n    gTasks[taskId].func(taskId);\n}\n\nstatic void AnimTask_ShakeMon2Step(u8 taskId)\n{\n    if (gTasks[taskId].data[3] == 0)\n    {\n        if (gSprites[gTasks[taskId].data[0]].x2 == gTasks[taskId].data[4])\n            gSprites[gTasks[taskId].data[0]].x2 = -gTasks[taskId].data[4];\n        else\n            gSprites[gTasks[taskId].data[0]].x2 = gTasks[taskId].data[4];\n        if (gSprites[gTasks[taskId].data[0]].y2 == gTasks[taskId].data[5])\n            gSprites[gTasks[taskId].data[0]].y2 = -gTasks[taskId].data[5];\n        else\n            gSprites[gTasks[taskId].data[0]].y2 = gTasks[taskId].data[5];\n        gTasks[taskId].data[3] = gTasks[taskId].data[2];\n        if (--gTasks[taskId].data[1] == 0)\n        {\n            gSprites[gTasks[taskId].data[0]].x2 = 0;\n            gSprites[gTasks[taskId].data[0]].y2 = 0;\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n    else\n        gTasks[taskId].data[3]--;\n}\n\n// Task to facilitate simple shaking of a pokemon's picture in battle.\n// The shaking alternates between the positive and negative versions of the specified pixel offsets\n// with respect to the current location of the mon's picture.\n// arg 0: battler\n// arg 1: x offset\n// arg 2: y offset\n// arg 3: num shakes\n// arg 4: delay\nvoid AnimTask_ShakeMonInPlace(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n\n    if (spriteId == SPRITE_NONE)\n    {\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n    gSprites[spriteId].x2 += gBattleAnimArgs[1];\n    gSprites[spriteId].y2 += gBattleAnimArgs[2];\n    gTasks[taskId].data[0] = spriteId;\n    gTasks[taskId].data[1] = 0;\n    gTasks[taskId].data[2] = gBattleAnimArgs[3];\n    gTasks[taskId].data[3] = 0;\n    gTasks[taskId].data[4] = gBattleAnimArgs[4];\n    gTasks[taskId].data[5] = gBattleAnimArgs[1] * 2;\n    gTasks[taskId].data[6] = gBattleAnimArgs[2] * 2;\n    gTasks[taskId].func = AnimTask_ShakeMonInPlace_Step;\n    gTasks[taskId].func(taskId);\n}\n\nstatic void AnimTask_ShakeMonInPlace_Step(u8 taskId)\n{\n    if (gTasks[taskId].data[3] == 0)\n    {\n        if (gTasks[taskId].data[1] & 1)\n        {\n            gSprites[gTasks[taskId].data[0]].x2 += gTasks[taskId].data[5];\n            gSprites[gTasks[taskId].data[0]].y2 += gTasks[taskId].data[6];\n        }\n        else\n        {\n            gSprites[gTasks[taskId].data[0]].x2 -= gTasks[taskId].data[5];\n            gSprites[gTasks[taskId].data[0]].y2 -= gTasks[taskId].data[6];\n        }\n        gTasks[taskId].data[3] = gTasks[taskId].data[4];\n        if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2])\n        {\n            if (gTasks[taskId].data[1] & 1)\n            {\n                gSprites[gTasks[taskId].data[0]].x2 += gTasks[taskId].data[5] / 2;\n                gSprites[gTasks[taskId].data[0]].y2 += gTasks[taskId].data[6] / 2;\n            }\n            else\n            {\n                gSprites[gTasks[taskId].data[0]].x2 -= gTasks[taskId].data[5] / 2;\n                gSprites[gTasks[taskId].data[0]].y2 -= gTasks[taskId].data[6] / 2;\n            }\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n    else\n        gTasks[taskId].data[3]--;\n}\n\n// Shakes a mon bg horizontally and moves it downward linearly.\n// arg 0: battler\n// arg 1: x offset\n// arg 2: frame delay between each movement\n// arg 3: downward speed (subpixel)\n// arg 4: duration\nvoid AnimTask_ShakeAndSinkMon(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n\n    gSprites[spriteId].x2 = gBattleAnimArgs[1];\n    gTasks[taskId].data[0] = spriteId;\n    gTasks[taskId].data[1] = gBattleAnimArgs[1];\n    gTasks[taskId].data[2] = gBattleAnimArgs[2];\n    gTasks[taskId].data[3] = gBattleAnimArgs[3];\n    gTasks[taskId].data[4] = gBattleAnimArgs[4];\n    gTasks[taskId].func = AnimTask_ShakeAndSinkMon_Step;\n    gTasks[taskId].func(taskId);\n}\n\nstatic void AnimTask_ShakeAndSinkMon_Step(u8 taskId)\n{\n    u8 spriteId = gTasks[taskId].data[0];\n    s16 x = gTasks[taskId].data[1];\n    if (gTasks[taskId].data[2] == gTasks[taskId].data[8]++)\n    {\n        gTasks[taskId].data[8] = 0;\n        if (gSprites[spriteId].x2 == x)\n            x = -x;\n        gSprites[spriteId].x2 += x;\n    }\n    gTasks[taskId].data[1] = x;\n    gTasks[taskId].data[9] += gTasks[taskId].data[3];\n    gSprites[spriteId].y2 = gTasks[taskId].data[9] >> 8;\n    if (--gTasks[taskId].data[4] == 0)\n        DestroyAnimVisualTask(taskId);\n}\n\n// Moves a mon bg picture along an elliptical path that begins\n// and ends at the mon's origin location.\n// arg 0: battler\n// arg 1: ellipse width\n// arg 2: ellipse height\n// arg 3: num loops\n// arg 4: speed (valid values are 0-5)\nvoid AnimTask_TranslateMonElliptical(u8 taskId)\n{\n    u8 wavePeriod = 1;\n    u32 i;\n    u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n    if (gBattleAnimArgs[4] > 5)\n        gBattleAnimArgs[4] = 5;\n    for (i = 0; i < gBattleAnimArgs[4]; i++)\n        wavePeriod *= 2;\n    gTasks[taskId].data[0] = spriteId;\n    gTasks[taskId].data[1] = gBattleAnimArgs[1];\n    gTasks[taskId].data[2] = gBattleAnimArgs[2];\n    gTasks[taskId].data[3] = gBattleAnimArgs[3];\n    gTasks[taskId].data[4] = wavePeriod;\n    gTasks[taskId].func = AnimTask_TranslateMonElliptical_Step;\n    gTasks[taskId].func(taskId);\n}\n\nstatic void AnimTask_TranslateMonElliptical_Step(u8 taskId)\n{\n    u8 spriteId = gTasks[taskId].data[0];\n    gSprites[spriteId].x2 = Sin(gTasks[taskId].data[5], gTasks[taskId].data[1]);\n    gSprites[spriteId].y2 = -Cos(gTasks[taskId].data[5], gTasks[taskId].data[2]);\n    gSprites[spriteId].y2 += gTasks[taskId].data[2];\n    gTasks[taskId].data[5] += gTasks[taskId].data[4];\n    gTasks[taskId].data[5] &= 0xFF;\n    if (gTasks[taskId].data[5] == 0)\n        gTasks[taskId].data[3]--;\n    if (gTasks[taskId].data[3] == 0)\n    {\n        gSprites[spriteId].x2 = 0;\n        gSprites[spriteId].y2 = 0;\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\n// Moves a mon bg picture along an elliptical path that begins\n// and ends at the mon's origin location. Reverses the direction\n// of the path if it's not on the player's side of the battle.\n// arg 0: battler\n// arg 1: ellipse width\n// arg 2: ellipse height\n// arg 3: num loops\n// arg 4: speed (valid values are 0-5)\nvoid AnimTask_TranslateMonEllipticalRespectSide(u8 taskId)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n    AnimTask_TranslateMonElliptical(taskId);\n}\n\n// Performs a simple horizontal lunge, where the mon moves\n// horizontally, and then moves back in the opposite direction.\n// arg 0: duration of single lunge direction\n// arg 1: x pixel delta that is applied each frame\nstatic void DoHorizontalLunge(struct Sprite *sprite)\n{\n    sprite->invisible = TRUE;\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->data[1] = -gBattleAnimArgs[1];\n    else\n        sprite->data[1] =  gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[0];\n    sprite->data[2] = 0;\n    sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];\n    sprite->data[4] = gBattleAnimArgs[0];\n    StoreSpriteCallbackInData6(sprite, ReverseHorizontalLungeDirection);\n    sprite->callback = TranslateSpriteLinearById;\n}\n\nstatic void ReverseHorizontalLungeDirection(struct Sprite *sprite)\n{\n    sprite->data[0] = sprite->data[4];\n    sprite->data[1] = -sprite->data[1];\n    sprite->callback = TranslateSpriteLinearById;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Performs a simple vertical dipping motion, where moves vertically, and then\n// moves back in the opposite direction.\n// arg 0: duration of single dip direction\n// arg 1: y pixel delta that is applied each frame\n// arg 2: battler\nstatic void DoVerticalDip(struct Sprite *sprite)\n{\n    u8 spriteId;\n    sprite->invisible = TRUE;\n    spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);\n    sprite->data[0] = gBattleAnimArgs[0];\n    sprite->data[1] = 0;\n    sprite->data[2] = gBattleAnimArgs[1];\n    sprite->data[3] = spriteId;\n    sprite->data[4] = gBattleAnimArgs[0];\n    StoreSpriteCallbackInData6(sprite, ReverseVerticalDipDirection);\n    sprite->callback = TranslateSpriteLinearById;\n}\n\nstatic void ReverseVerticalDipDirection(struct Sprite *sprite)\n{\n    sprite->data[0] = sprite->data[4];\n    sprite->data[2] = -sprite->data[2];\n    sprite->callback = TranslateSpriteLinearById;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Linearly slides a mon's bg picture back to its original sprite position.\n// The sprite parameter is a dummy sprite used for facilitating the movement with its callback.\n// arg 0: 1 = target or 0 = attacker\n// arg 1: direction (0 = horizontal and vertical, 1 = horizontal only, 2 = vertical only)\n// arg 2: duration\nstatic void SlideMonToOriginalPos(struct Sprite *sprite)\n{\n    u8 spriteId;\n    if (gBattleAnimArgs[0] == 0)\n        spriteId = gBattlerSpriteIds[gBattleAnimAttacker];\n    else\n        spriteId = gBattlerSpriteIds[gBattleAnimTarget];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gSprites[spriteId].x + gSprites[spriteId].x2;\n    sprite->data[2] = gSprites[spriteId].x;\n    sprite->data[3] = gSprites[spriteId].y + gSprites[spriteId].y2;\n    sprite->data[4] = gSprites[spriteId].y;\n    InitSpriteDataForLinearTranslation(sprite);\n    sprite->data[3] = 0;\n    sprite->data[4] = 0;\n    sprite->data[5] = gSprites[spriteId].x2;\n    sprite->data[6] = gSprites[spriteId].y2;\n    sprite->invisible = TRUE;\n    if (gBattleAnimArgs[1] == 1)\n        sprite->data[2] = 0;\n    else if (gBattleAnimArgs[1] == 2)\n        sprite->data[1] = 0;\n    sprite->data[7] = gBattleAnimArgs[1];\n    sprite->data[7] |= spriteId << 8;\n    sprite->callback = SlideMonToOriginalPos_Step;\n}\n\nstatic void SlideMonToOriginalPos_Step(struct Sprite *sprite)\n{\n    u8 data7 = sprite->data[7];\n    struct Sprite *monSprite = &gSprites[sprite->data[7] >> 8];\n    if (sprite->data[0] == 0)\n    {\n        if (data7 == 1 || data7 == 0)\n            monSprite->x2 = 0;\n        if (data7 == 2 || data7 == 0)\n            monSprite->y2 = 0;\n        DestroyAnimSprite(sprite);\n    }\n    else\n    {\n        sprite->data[0]--;\n        sprite->data[3] += sprite->data[1];\n        sprite->data[4] += sprite->data[2];\n        monSprite->x2 = (sprite->data[3] >> 8) + sprite->data[5];\n        monSprite->y2 = (sprite->data[4] >> 8) + sprite->data[6];\n    }\n}\n\n// Linearly translates a mon to a target offset. The horizontal offset\n// is mirrored for the opponent's pokemon, and the vertical offset\n// is only mirrored if arg 3 is set to 1.\n// arg 0: 0 = attacker, 1 = target\n// arg 1: target x pixel offset\n// arg 2: target y pixel offset\n// arg 3: mirror vertical translation for opposite battle side\n// arg 4: duration\nstatic void SlideMonToOffset(struct Sprite *sprite)\n{\n    u8 battlerId;\n    u8 monSpriteId;\n    if (gBattleAnimArgs[0] == 0)\n        battlerId = gBattleAnimAttacker;\n    else\n        battlerId = gBattleAnimTarget;\n    monSpriteId = gBattlerSpriteIds[battlerId];\n    if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n    {\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n        if (gBattleAnimArgs[3] == 1)\n            gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    }\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[1] = gSprites[monSpriteId].x;\n    sprite->data[2] = gSprites[monSpriteId].x + gBattleAnimArgs[1];\n    sprite->data[3] = gSprites[monSpriteId].y;\n    sprite->data[4] = gSprites[monSpriteId].y + gBattleAnimArgs[2];\n    InitSpriteDataForLinearTranslation(sprite);\n    sprite->data[3] = 0;\n    sprite->data[4] = 0;\n    sprite->data[5] = monSpriteId;\n    sprite->invisible = TRUE;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = TranslateSpriteLinearByIdFixedPoint;\n}\n\nstatic void SlideMonToOffsetAndBack(struct Sprite *sprite)\n{\n    u8 battlerId;\n    u8 spriteId;\n    sprite->invisible = TRUE;\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n        battlerId = gBattleAnimAttacker;\n    else\n        battlerId = gBattleAnimTarget;\n    spriteId = gBattlerSpriteIds[battlerId];\n    if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n    {\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n        if (gBattleAnimArgs[3] == 1)\n            gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    }\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[1] = gSprites[spriteId].x + gSprites[spriteId].x2;\n    sprite->data[2] = sprite->data[1] + gBattleAnimArgs[1];\n    sprite->data[3] = gSprites[spriteId].y + gSprites[spriteId].y2;\n    sprite->data[4] = sprite->data[3] + gBattleAnimArgs[2];\n    InitSpriteDataForLinearTranslation(sprite);\n    sprite->data[3] = gSprites[spriteId].x2 << 8;\n    sprite->data[4] = gSprites[spriteId].y2 << 8;\n    sprite->data[5] = spriteId;\n    sprite->data[6] = gBattleAnimArgs[5];\n    if (gBattleAnimArgs[5] == 0)\n        StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    else\n        StoreSpriteCallbackInData6(sprite, SlideMonToOffsetAndBack_End);\n    sprite->callback = TranslateSpriteLinearByIdFixedPoint;\n}\n\nstatic void SlideMonToOffsetAndBack_End(struct Sprite *sprite)\n{\n    gSprites[sprite->data[5]].x2 = 0;\n    gSprites[sprite->data[5]].y2 = 0;\n    DestroyAnimSprite(sprite);\n}\n\n// Task to facilitate a two-part translation animation, in which the sprite\n// is first translated in an arc to one position.  Then, it \"lunges\" to a target\n// x offset.  Used in TAKE_DOWN, for example.\n// arg 0: anim bank\n// arg 1: horizontal speed (subpixel)\n// arg 2: wave amplitude\n// arg 3: first duration\n// arg 4: delay before starting lunge\n// arg 5: target x offset for lunge\n// arg 6: lunge duration\nvoid AnimTask_WindUpLunge(u8 taskId)\n{\n    u16 wavePeriod = 0x8000 / gBattleAnimArgs[3];\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n        gBattleAnimArgs[5] = -gBattleAnimArgs[5];\n    }\n    gTasks[taskId].data[0] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n    gTasks[taskId].data[1] = gBattleAnimArgs[1] * 256 / gBattleAnimArgs[3];\n    gTasks[taskId].data[2] = gBattleAnimArgs[2];\n    gTasks[taskId].data[3] = gBattleAnimArgs[3];\n    gTasks[taskId].data[4] = gBattleAnimArgs[4];\n    gTasks[taskId].data[5] = gBattleAnimArgs[5] * 256 / gBattleAnimArgs[6];\n    gTasks[taskId].data[6] = gBattleAnimArgs[6];\n    gTasks[taskId].data[7] = wavePeriod;\n    gTasks[taskId].func = AnimTask_WindUpLunge_Step1;\n}\n\nstatic void AnimTask_WindUpLunge_Step1(u8 taskId)\n{\n    u8 spriteId = gTasks[taskId].data[0];\n    gTasks[taskId].data[11] += gTasks[taskId].data[1];\n    gSprites[spriteId].x2 = gTasks[taskId].data[11] >> 8;\n    gSprites[spriteId].y2 = Sin((u8)(gTasks[taskId].data[10] >> 8), gTasks[taskId].data[2]);\n    gTasks[taskId].data[10] += gTasks[taskId].data[7];\n    if (--gTasks[taskId].data[3] == 0)\n        gTasks[taskId].func = AnimTask_WindUpLunge_Step2;\n}\n\nstatic void AnimTask_WindUpLunge_Step2(u8 taskId)\n{\n    u8 spriteId;\n\n    if (gTasks[taskId].data[4] > 0)\n        gTasks[taskId].data[4]--;\n    else\n    {\n        spriteId = gTasks[taskId].data[0];\n        gTasks[taskId].data[12] += gTasks[taskId].data[5];\n        gSprites[spriteId].x2 = (gTasks[taskId].data[12] >> 8) + (gTasks[taskId].data[11] >> 8);\n        if (--gTasks[taskId].data[6] == 0)\n            DestroyAnimVisualTask(taskId);\n    }\n}\n\n// To move a mon off-screen when pushed out by Roar/Whirlwind\nvoid AnimTask_SlideOffScreen(u8 taskId)\n{\n    u8 spriteId;\n\n    switch (gBattleAnimArgs[0])\n    {\n    case ANIM_ATTACKER:\n    case ANIM_TARGET:\n        spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n        break;\n    case ANIM_ATK_PARTNER:\n        if (!IsBattlerSpriteVisible(gBattleAnimAttacker ^ BIT_FLANK))\n        {\n            DestroyAnimVisualTask(taskId);\n            return;\n        }\n        spriteId = gBattlerSpriteIds[gBattleAnimAttacker ^ BIT_FLANK];\n        break;\n    case ANIM_DEF_PARTNER:\n        if (!IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK))\n        {\n            DestroyAnimVisualTask(taskId);\n            return;\n        }\n        spriteId = gBattlerSpriteIds[gBattleAnimTarget ^ BIT_FLANK];\n        break;\n    default:\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n    gTasks[taskId].data[0] = spriteId;\n    if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)\n        gTasks[taskId].data[1] = gBattleAnimArgs[1];\n    else\n        gTasks[taskId].data[1] = -gBattleAnimArgs[1];\n    gTasks[taskId].func = AnimTask_SlideOffScreen_Step;\n}\n\nstatic void AnimTask_SlideOffScreen_Step(u8 taskId)\n{\n    u8 spriteId = gTasks[taskId].data[0];\n    gSprites[spriteId].x2 += gTasks[taskId].data[1];\n    if (gSprites[spriteId].x2 + gSprites[spriteId].x < -32 || gSprites[spriteId].x2 + gSprites[spriteId].x > DISPLAY_WIDTH + 32)\n        DestroyAnimVisualTask(taskId);\n}\n\n// Task that facilitates translating the mon bg picture back and forth\n// in a swaying motion (uses Sine wave). It can sway either horizontally\n// or vertically, but not both.\n// arg 0: direction (0 = horizontal, 1 = vertical)\n// arg 1: wave amplitude\n// arg 2: wave period\n// arg 3: num sways\n// arg 4: which mon (0 = attacker, 1 = target)\nvoid AnimTask_SwayMon(u8 taskId)\n{\n    u8 spriteId;\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n    spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[4]);\n    gTasks[taskId].data[0] = gBattleAnimArgs[0];\n    gTasks[taskId].data[1] = gBattleAnimArgs[1];\n    gTasks[taskId].data[2] = gBattleAnimArgs[2];\n    gTasks[taskId].data[3] = gBattleAnimArgs[3];\n    gTasks[taskId].data[4] = spriteId;\n    if (gBattleAnimArgs[4] == 0)\n        gTasks[taskId].data[5] = gBattleAnimAttacker;\n    else\n        gTasks[taskId].data[5] = gBattleAnimTarget;\n    gTasks[taskId].data[12] = 1;\n    gTasks[taskId].func = AnimTask_SwayMon_Step;\n}\n\nstatic void AnimTask_SwayMon_Step(u8 taskId)\n{\n    u8 spriteId;\n    u32 waveIndex;\n    s16 sineValue;\n    u16 sineIndex;\n\n    spriteId = gTasks[taskId].data[4];\n    sineIndex = gTasks[taskId].data[10] + gTasks[taskId].data[2];\n    gTasks[taskId].data[10] = sineIndex;\n    waveIndex = sineIndex >> 8;\n    sineValue = Sin(waveIndex, gTasks[taskId].data[1]);\n    if (gTasks[taskId].data[0] == 0)\n    {\n        gSprites[spriteId].x2 = sineValue;\n    }\n    else if (GetBattlerSide(gTasks[taskId].data[5]) == B_SIDE_PLAYER)\n    {\n        gSprites[spriteId].y2 = abs(sineValue);\n    }\n    else\n        gSprites[spriteId].y2 = -abs(sineValue);\n    if ((waveIndex > 0x7F && gTasks[taskId].data[11] == 0 && gTasks[taskId].data[12] == 1) || (waveIndex < 0x7F && gTasks[taskId].data[11] == 1 && gTasks[taskId].data[12] == 0))\n    {\n        gTasks[taskId].data[11] ^= 1;\n        gTasks[taskId].data[12] ^= 1;\n        if (--gTasks[taskId].data[3] == 0)\n        {\n            gSprites[spriteId].x2 = 0;\n            gSprites[spriteId].y2 = 0;\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n}\n\n// Scales a mon's sprite, and then scales back to its original dimensions.\n// arg 0: x scale delta\n// arg 1: y scale delta\n// arg 2: duration\n// arg 3: anim bank\n// arg 4: sprite object mode\nvoid AnimTask_ScaleMonAndRestore(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[3]);\n    PrepareBattlerSpriteForRotScale(spriteId, gBattleAnimArgs[4]);\n    gTasks[taskId].data[0] = gBattleAnimArgs[0];\n    gTasks[taskId].data[1] = gBattleAnimArgs[1];\n    gTasks[taskId].data[2] = gBattleAnimArgs[2];\n    gTasks[taskId].data[3] = gBattleAnimArgs[2];\n    gTasks[taskId].data[4] = spriteId;\n    gTasks[taskId].data[10] = 0x100;\n    gTasks[taskId].data[11] = 0x100;\n    gTasks[taskId].func = AnimTask_ScaleMonAndRestore_Step;\n}\n\nstatic void AnimTask_ScaleMonAndRestore_Step(u8 taskId)\n{\n    u8 spriteId;\n    gTasks[taskId].data[10] += gTasks[taskId].data[0];\n    gTasks[taskId].data[11] += gTasks[taskId].data[1];\n    spriteId = gTasks[taskId].data[4];\n    SetSpriteRotScale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[11], 0);\n    if (--gTasks[taskId].data[2] == 0)\n    {\n        if (gTasks[taskId].data[3] > 0)\n        {\n            gTasks[taskId].data[0] = -gTasks[taskId].data[0];\n            gTasks[taskId].data[1] = -gTasks[taskId].data[1];\n            gTasks[taskId].data[2] = gTasks[taskId].data[3];\n            gTasks[taskId].data[3] = 0;\n        }\n        else\n        {\n            ResetSpriteRotScale(spriteId);\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n}\n\nvoid AnimTask_RotateMonSpriteToSide(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);\n    PrepareBattlerSpriteForRotScale(spriteId, 0);\n    gTasks[taskId].data[1] = 0;\n    gTasks[taskId].data[2] = gBattleAnimArgs[0];\n    if (gBattleAnimArgs[3] != 1)\n        gTasks[taskId].data[3] = 0;\n    else\n        gTasks[taskId].data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];\n    gTasks[taskId].data[4] = gBattleAnimArgs[1];\n    gTasks[taskId].data[5] = spriteId;\n    gTasks[taskId].data[6] = gBattleAnimArgs[3];\n    if (IsContest())\n        gTasks[taskId].data[7] = 1;\n    else\n    {\n        if (gBattleAnimArgs[2] == ANIM_ATTACKER)\n            gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : 0;\n        else\n            gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER ? 1 : 0;\n    }\n    if (gTasks[taskId].data[7] && !IsContest())\n    {\n        s16 tmp;\n        tmp = gTasks[taskId].data[3];\n        gTasks[taskId].data[3] = -tmp;\n        tmp = gTasks[taskId].data[4];\n        gTasks[taskId].data[4] = -tmp;\n    }\n    gTasks[taskId].func = AnimTask_RotateMonSpriteToSide_Step;\n}\n\n// Rotates mon to side and back to original position. For Peck and when a held item activates\nvoid AnimTask_RotateMonToSideAndRestore(u8 taskId)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);\n    PrepareBattlerSpriteForRotScale(spriteId, 0);\n    gTasks[taskId].data[1] = 0;\n    gTasks[taskId].data[2] = gBattleAnimArgs[0];\n    if (gBattleAnimArgs[2] == ANIM_ATTACKER)\n    {\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n    }\n    else\n    {\n        if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)\n            gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n    }\n    if (gBattleAnimArgs[3] != 1)\n        gTasks[taskId].data[3] = 0;\n    else\n        gTasks[taskId].data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];\n    gTasks[taskId].data[4] = gBattleAnimArgs[1];\n    gTasks[taskId].data[5] = spriteId;\n    gTasks[taskId].data[6] = gBattleAnimArgs[3];\n    gTasks[taskId].data[7] = 1;\n    if (gTasks[taskId].data[7] )\n    {\n        s16 tmp = gTasks[taskId].data[3];\n        gTasks[taskId].data[3] = -tmp;\n        tmp = gTasks[taskId].data[4];\n        gTasks[taskId].data[4] = -tmp;\n    }\n    gTasks[taskId].func = AnimTask_RotateMonSpriteToSide_Step;\n}\n\nstatic void AnimTask_RotateMonSpriteToSide_Step(u8 taskId)\n{\n    gTasks[taskId].data[3] += gTasks[taskId].data[4];\n    SetSpriteRotScale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]);\n    if (gTasks[taskId].data[7])\n        SetBattlerSpriteYOffsetFromRotation(gTasks[taskId].data[5]);\n    if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2])\n    {\n        switch (gTasks[taskId].data[6])\n        {\n        case 1:\n            ResetSpriteRotScale(gTasks[taskId].data[5]);\n            // fallthrough\n        case 0:\n        default:\n            DestroyAnimVisualTask(taskId);\n            break;\n        case 2:\n            gTasks[taskId].data[1] = 0;\n            gTasks[taskId].data[4] *= -1;\n            gTasks[taskId].data[6] = 1;\n            break;\n        }\n    }\n}\n\nvoid AnimTask_ShakeTargetBasedOnMovePowerOrDmg(u8 taskId)\n{\n    if (gBattleAnimArgs[0] == 0)\n    {\n        gTasks[taskId].data[15] = gAnimMovePower / 12;\n        if (gTasks[taskId].data[15] < 1)\n            gTasks[taskId].data[15] = 1;\n        if (gTasks[taskId].data[15] > 16)\n            gTasks[taskId].data[15] = 16;\n    }\n    else\n    {\n        gTasks[taskId].data[15] = gAnimMoveDmg / 12;\n        if (gTasks[taskId].data[15] < 1)\n            gTasks[taskId].data[15] = 1;\n        if (gTasks[taskId].data[15] > 16)\n            gTasks[taskId].data[15] = 16;\n    }\n    gTasks[taskId].data[14] = gTasks[taskId].data[15] / 2;\n    gTasks[taskId].data[13] = gTasks[taskId].data[14] + (gTasks[taskId].data[15] & 1);\n    gTasks[taskId].data[12] = 0;\n    gTasks[taskId].data[10] = gBattleAnimArgs[3];\n    gTasks[taskId].data[11] = gBattleAnimArgs[4];\n    gTasks[taskId].data[7] = GetAnimBattlerSpriteId(ANIM_TARGET);\n    gTasks[taskId].data[8] = gSprites[gTasks[taskId].data[7]].x2;\n    gTasks[taskId].data[9] = gSprites[gTasks[taskId].data[7]].y2;\n    gTasks[taskId].data[0] = 0;\n    gTasks[taskId].data[1] = gBattleAnimArgs[1];\n    gTasks[taskId].data[2] = gBattleAnimArgs[2];\n    gTasks[taskId].func = AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step;\n}\n\nstatic void AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    if (++task->data[0] > task->data[1])\n    {\n        task->data[0] = 0;\n        task->data[12] = (task->data[12] + 1) & 1;\n        if (task->data[10])\n        {\n            if (task->data[12])\n            {\n                gSprites[task->data[7]].x2 = task->data[8] + task->data[13];\n            }\n            else\n            {\n                gSprites[task->data[7]].x2 = task->data[8] - task->data[14];\n            }\n        }\n        if (task->data[11])\n        {\n            if (task->data[12])\n            {\n                gSprites[task->data[7]].y2 = task->data[15];\n            }\n            else\n            {\n                gSprites[task->data[7]].y2 = 0;\n            }\n        }\n        if (!--task->data[2])\n        {\n            gSprites[task->data[7]].x2 = 0;\n            gSprites[task->data[7]].y2 = 0;\n            DestroyAnimVisualTask(taskId);\n            return;\n        }\n    }\n}\n"
  },
  {
    "path": "src/battle_anim_mons.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"data.h\"\n#include \"decompress.h\"\n#include \"pokemon_icon.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"util.h\"\n#include \"constants/battle_anim.h\"\n\n#define IS_DOUBLE_BATTLE() (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n\nstatic u8 GetBattlerSpriteFinal_Y(u8 battlerId, u16 species, bool8 a3);\nstatic void PlayerThrowBall_AnimTranslateLinear_WithFollowup(struct Sprite *sprite);\nstatic void AnimFastTranslateLinearWaitEnd(struct Sprite *sprite);\nstatic bool8 ShouldRotScaleSpeciesBeFlipped(void);\nstatic void AnimThrowProjectile_Step(struct Sprite *sprite);\nstatic void AnimTask_AlphaFadeIn_Step(u8 taskId);\nstatic void AnimTask_BlendMonInAndOutSetup(struct Task *task);\nstatic void AnimTask_BlendMonInAndOut_Step(u8 taskId);\nstatic u16 GetBattlerYDeltaFromSpriteId(u8 spriteId);\nstatic void AnimTask_AttackerPunchWithTrace_Step(u8 taskId);\nstatic void CreateBattlerTrace(struct Task *task, u8 taskId);\nstatic void AnimBattlerTrace(struct Sprite *sprite);\nstatic void AnimWeatherBallUp_Step(struct Sprite *sprite);\n\nstatic EWRAM_DATA union AffineAnimCmd *sAnimTaskAffineAnim = NULL;\nstatic EWRAM_DATA u32 sUnused = 0;\n\nstatic const struct UCoords8 sBattlerCoords[][MAX_BATTLERS_COUNT] =\n{\n    { // Single battle\n        { 72, 80 },\n        { 176, 40 },\n        { 48, 40 },\n        { 112, 80 },\n    },\n    { // Double battle\n        { 32, 80 },\n        { 200, 40 },\n        { 90, 88 },\n        { 152, 32 },\n    },\n};\n\n// One entry for each of the four Castform forms.\nconst struct MonCoords gCastformFrontSpriteCoords[NUM_CASTFORM_FORMS] =\n{\n    [CASTFORM_NORMAL] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 17 },\n    [CASTFORM_FIRE]   = { .size = MON_COORDS_SIZE(48, 48), .y_offset =  9 },\n    [CASTFORM_WATER]  = { .size = MON_COORDS_SIZE(32, 48), .y_offset =  9 },\n    [CASTFORM_ICE]    = { .size = MON_COORDS_SIZE(64, 48), .y_offset =  8 },\n};\n\nstatic const u8 sCastformElevations[NUM_CASTFORM_FORMS] =\n{\n    [CASTFORM_NORMAL] = 13,\n    [CASTFORM_FIRE]   = 14,\n    [CASTFORM_WATER]  = 13,\n    [CASTFORM_ICE]    = 13,\n};\n\n// Y position of the backsprite for each of the four Castform forms.\nstatic const u8 sCastformBackSpriteYCoords[NUM_CASTFORM_FORMS] =\n{\n    [CASTFORM_NORMAL] = 0,\n    [CASTFORM_FIRE]   = 0,\n    [CASTFORM_WATER]  = 0,\n    [CASTFORM_ICE]    = 0,\n};\n\n// Placeholders for pokemon sprites to be created for a move animation effect (e.g. Role Play / Snatch)\n#define TAG_MOVE_EFFECT_MON_1 55125\n#define TAG_MOVE_EFFECT_MON_2 55126\n\nstatic const struct SpriteTemplate sSpriteTemplates_MoveEffectMons[] =\n{\n    {\n        .tileTag = TAG_MOVE_EFFECT_MON_1,\n        .paletteTag = TAG_MOVE_EFFECT_MON_1,\n        .oam = &gOamData_AffineNormal_ObjNormal_64x64,\n        .anims = gDummySpriteAnimTable,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n    {\n        .tileTag = TAG_MOVE_EFFECT_MON_2,\n        .paletteTag = TAG_MOVE_EFFECT_MON_2,\n        .oam = &gOamData_AffineNormal_ObjNormal_64x64,\n        .anims = gDummySpriteAnimTable,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    }\n};\n\nstatic const struct SpriteSheet sSpriteSheets_MoveEffectMons[] =\n{\n    { gMiscBlank_Gfx, MON_PIC_SIZE, TAG_MOVE_EFFECT_MON_1 },\n    { gMiscBlank_Gfx, MON_PIC_SIZE, TAG_MOVE_EFFECT_MON_2 },\n};\n\nu8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType)\n{\n    u8 retVal;\n    u16 species;\n    struct BattleSpriteInfo *spriteInfo;\n\n    switch (coordType)\n    {\n    case BATTLER_COORD_X:\n    case BATTLER_COORD_X_2:\n        retVal = sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].x;\n        break;\n    case BATTLER_COORD_Y:\n        retVal = sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].y;\n        break;\n    case BATTLER_COORD_Y_PIC_OFFSET:\n    case BATTLER_COORD_Y_PIC_OFFSET_DEFAULT:\n    default:\n        if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n        {\n            spriteInfo = gBattleSpritesDataPtr->battlerData;\n            if (!spriteInfo[battlerId].transformSpecies)\n                species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n            else\n                species = spriteInfo[battlerId].transformSpecies;\n        }\n        else\n        {\n            spriteInfo = gBattleSpritesDataPtr->battlerData;\n            if (!spriteInfo[battlerId].transformSpecies)\n                species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n            else\n                species = spriteInfo[battlerId].transformSpecies;\n        }\n        if (coordType == BATTLER_COORD_Y_PIC_OFFSET)\n            retVal = GetBattlerSpriteFinal_Y(battlerId, species, TRUE);\n        else\n            retVal = GetBattlerSpriteFinal_Y(battlerId, species, FALSE);\n        break;\n    }\n    return retVal;\n}\n\nstatic u8 GetBattlerYDelta(u8 battlerId, u16 species)\n{\n    u16 letter;\n    u32 personality;\n    struct BattleSpriteInfo *spriteInfo;\n    u8 ret;\n    u16 coordSpecies;\n\n    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n    {\n        if (species == SPECIES_UNOWN)\n        {\n            spriteInfo = gBattleSpritesDataPtr->battlerData;\n            if (!spriteInfo[battlerId].transformSpecies)\n                personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY);\n            else\n                personality = gTransformedPersonalities[battlerId];\n            letter = GET_UNOWN_LETTER(personality);\n            if (!letter)\n                coordSpecies = species;\n            else\n                coordSpecies = letter + SPECIES_UNOWN_B - 1;\n            ret = gMonBackPicCoords[coordSpecies].y_offset;\n        }\n        else if (species == SPECIES_CASTFORM)\n        {\n            ret = sCastformBackSpriteYCoords[gBattleMonForms[battlerId]];\n        }\n        else if (species > NUM_SPECIES)\n        {\n            ret = gMonBackPicCoords[0].y_offset;\n        }\n        else\n        {\n            ret = gMonBackPicCoords[species].y_offset;\n        }\n    }\n    else\n    {\n        if (species == SPECIES_UNOWN)\n        {\n            spriteInfo = gBattleSpritesDataPtr->battlerData;\n            if (!spriteInfo[battlerId].transformSpecies)\n                personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY);\n            else\n                personality = gTransformedPersonalities[battlerId];\n            letter = GET_UNOWN_LETTER(personality);\n            if (!letter)\n                coordSpecies = species;\n            else\n                coordSpecies = letter + SPECIES_UNOWN_B - 1;\n            ret = gMonFrontPicCoords[coordSpecies].y_offset;\n        }\n        else if (species == SPECIES_CASTFORM)\n        {\n            ret = gCastformFrontSpriteCoords[gBattleMonForms[battlerId]].y_offset;\n        }\n        else if (species > NUM_SPECIES)\n        {\n            ret = gMonFrontPicCoords[0].y_offset;\n        }\n        else\n        {\n            ret = gMonFrontPicCoords[species].y_offset;\n        }\n    }\n    return ret;\n}\n\nstatic u8 GetBattlerElevation(u8 battlerId, u16 species)\n{\n    u8 ret = 0;\n\n    if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT)\n    {\n        if (species == SPECIES_CASTFORM)\n            ret = sCastformElevations[gBattleMonForms[battlerId]];\n        else if (species > NUM_SPECIES)\n            ret = gEnemyMonElevation[0];\n        else\n            ret = gEnemyMonElevation[species];\n    }\n    return ret;\n}\n\nstatic u8 GetBattlerSpriteFinal_Y(u8 battlerId, u16 species, bool8 a3)\n{\n    u16 offset;\n    u8 y;\n\n    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n    {\n        offset = GetBattlerYDelta(battlerId, species);\n    }\n    else\n    {\n        offset = GetBattlerYDelta(battlerId, species);\n        offset -= GetBattlerElevation(battlerId, species);\n    }\n    y = offset + sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].y;\n    if (a3)\n    {\n        if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n            y += 8;\n        if (y > DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8)\n            y = DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8;\n    }\n    return y;\n}\n\nu8 GetBattlerSpriteCoord2(u8 battlerId, u8 coordType)\n{\n    u16 species;\n    struct BattleSpriteInfo *spriteInfo;\n\n    if (coordType == BATTLER_COORD_Y_PIC_OFFSET || coordType == BATTLER_COORD_Y_PIC_OFFSET_DEFAULT)\n    {\n        spriteInfo = gBattleSpritesDataPtr->battlerData;\n        if (!spriteInfo[battlerId].transformSpecies)\n            species = gAnimBattlerSpecies[battlerId];\n        else\n            species = spriteInfo[battlerId].transformSpecies;\n        if (coordType == BATTLER_COORD_Y_PIC_OFFSET)\n            return GetBattlerSpriteFinal_Y(battlerId, species, TRUE);\n        else\n            return GetBattlerSpriteFinal_Y(battlerId, species, FALSE);\n    }\n    else\n    {\n        return GetBattlerSpriteCoord(battlerId, coordType);\n    }\n}\n\nu8 GetBattlerSpriteDefault_Y(u8 battlerId)\n{\n    return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET_DEFAULT);\n}\n\nu8 GetSubstituteSpriteDefault_Y(u8 battlerId)\n{\n    u16 y;\n\n    if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n        y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 16;\n    else\n        y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 17;\n    return y;\n}\n\nu8 GetGhostSpriteDefault_Y(u8 battlerId)\n{\n    if (GetBattlerSide(battlerId) != B_SIDE_OPPONENT)\n        return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET_DEFAULT);\n    else\n        return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y);\n}\n\nu8 GetBattlerYCoordWithElevation(u8 battlerId)\n{\n    u16 species;\n    u8 y;\n    struct BattleSpriteInfo *spriteInfo;\n\n    y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y);\n    if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n    {\n        spriteInfo = gBattleSpritesDataPtr->battlerData;\n        if (!spriteInfo[battlerId].transformSpecies)\n            species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n        else\n            species = spriteInfo[battlerId].transformSpecies;\n    }\n    else\n    {\n        spriteInfo = gBattleSpritesDataPtr->battlerData;\n        if (!spriteInfo[battlerId].transformSpecies)\n            species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n        else\n            species = spriteInfo[battlerId].transformSpecies;\n    }\n    if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n        y -= GetBattlerElevation(battlerId, species);\n    return y;\n}\n\nu8 GetAnimBattlerSpriteId(u8 animBattler)\n{\n    u8 *sprites;\n\n    if (animBattler == ANIM_ATTACKER)\n    {\n        if (IsBattlerSpritePresent(gBattleAnimAttacker))\n        {\n            sprites = gBattlerSpriteIds;\n            return sprites[gBattleAnimAttacker];\n        }\n        else\n        {\n            return SPRITE_NONE;\n        }\n    }\n    else if (animBattler == ANIM_TARGET)\n    {\n        if (IsBattlerSpritePresent(gBattleAnimTarget))\n        {\n            sprites = gBattlerSpriteIds;\n            return sprites[gBattleAnimTarget];\n        }\n        else\n        {\n            return SPRITE_NONE;\n        }\n    }\n    else if (animBattler == ANIM_ATK_PARTNER)\n    {\n        if (!IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))\n            return SPRITE_NONE;\n        else\n            return gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)];\n    }\n    else\n    {\n        if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget)))\n            return gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimTarget)];\n        else\n            return SPRITE_NONE;\n    }\n}\n\nvoid StoreSpriteCallbackInData6(struct Sprite *sprite, SpriteCallback callback)\n{\n    sprite->data[6] = (u32)(callback) & 0xFFFF;\n    sprite->data[7] = (u32)(callback) >> 16;\n}\n\nstatic void SetCallbackToStoredInData6(struct Sprite *sprite)\n{\n    u32 callback = (u16)sprite->data[6] | (sprite->data[7] << 16);\n    \n    sprite->callback = (SpriteCallback)callback;\n}\n\n// Sprite data for TranslateSpriteInCircle/Ellipse and related\n#define sCirclePos    data[0]\n#define sAmplitude    data[1]\n#define sCircleSpeed  data[2]\n#define sDuration     data[3]\n\n// TranslateSpriteInGrowingCircle\n#define sAmplitudeSpeed  data[4]\n#define sAmplitudeChange data[5]\n\n// TranslateSpriteInEllipse\n#define sAmplitudeX sAmplitude\n#define sAmplitudeY data[4]\n\n// TranslateSpriteInLissajousCurve\n#define sCirclePosX   sCirclePos\n#define sCircleSpeedX sCircleSpeed\n#define sCirclePosY   data[4]\n#define sCircleSpeedY data[5]\n\n// x = a * sin(theta0 + dtheta * t)\n// y = a * cos(theta0 + dtheta * t)\nvoid TranslateSpriteInCircle(struct Sprite *sprite)\n{\n    if (sprite->sDuration)\n    {\n        sprite->x2 = Sin(sprite->sCirclePos, sprite->sAmplitude);\n        sprite->y2 = Cos(sprite->sCirclePos, sprite->sAmplitude);\n        sprite->sCirclePos += sprite->sCircleSpeed;\n        if (sprite->sCirclePos >= 0x100)\n            sprite->sCirclePos -= 0x100;\n        else if (sprite->sCirclePos < 0)\n            sprite->sCirclePos += 0x100;\n        sprite->sDuration--;\n    }\n    else\n    {\n        SetCallbackToStoredInData6(sprite);\n    }\n}\n\n// x = (a0 + da * t) * sin(theta0 + dtheta * t)\n// y = (a0 + da * t) * cos(theta0 + dtheta * t)\nvoid TranslateSpriteInGrowingCircle(struct Sprite *sprite)\n{\n    if (sprite->sDuration)\n    {\n        sprite->x2 = Sin(sprite->sCirclePos, (sprite->sAmplitudeChange >> 8) + sprite->sAmplitude);\n        sprite->y2 = Cos(sprite->sCirclePos, (sprite->sAmplitudeChange >> 8) + sprite->sAmplitude);\n        sprite->sCirclePos += sprite->sCircleSpeed;\n        sprite->sAmplitudeChange += sprite->sAmplitudeSpeed;\n        if (sprite->sCirclePos >= 0x100)\n            sprite->sCirclePos -= 0x100;\n        else if (sprite->sCirclePos < 0)\n            sprite->sCirclePos += 0x100;\n        sprite->sDuration--;\n    }\n    else\n    {\n        SetCallbackToStoredInData6(sprite);\n    }\n}\n\n// Unused\n// Exact shape depends on arguments. Can move in a figure-8-like pattern, or circular, etc.\n// x = alpl * sin(alpha0 + dalpha * t)\n// y = ampl * cos(beta0 + dbeta * t)\nstatic void TranslateSpriteInLissajousCurve(struct Sprite *sprite)\n{\n    if (sprite->sDuration)\n    {\n        sprite->x2 = Sin(sprite->sCirclePosX, sprite->sAmplitude);\n        sprite->y2 = Cos(sprite->sCirclePosY, sprite->sAmplitude);\n        sprite->sCirclePosX += sprite->sCircleSpeedX;\n        sprite->sCirclePosY += sprite->sCircleSpeedY;\n        \n        if (sprite->sCirclePosX >= 0x100)\n            sprite->sCirclePosX -= 0x100;\n        else if (sprite->sCirclePosX < 0)\n            sprite->sCirclePosX += 0x100;\n\n        if (sprite->sCirclePosY >= 0x100)\n            sprite->sCirclePosY -= 0x100;\n        else if (sprite->sCirclePosY < 0)\n            sprite->sCirclePosY += 0x100;\n\n        sprite->sDuration--;\n    }\n    else\n    {\n        SetCallbackToStoredInData6(sprite);\n    }\n}\n\n// x = a * sin(theta0 + dtheta * t)\n// y = b * cos(theta0 + dtheta * t)\nvoid TranslateSpriteInEllipse(struct Sprite *sprite)\n{\n    if (sprite->sDuration)\n    {\n        sprite->x2 = Sin(sprite->sCirclePos, sprite->sAmplitudeX);\n        sprite->y2 = Cos(sprite->sCirclePos, sprite->sAmplitudeY);\n        sprite->sCirclePos += sprite->sCircleSpeed;\n        if (sprite->sCirclePos >= 0x100)\n            sprite->sCirclePos -= 0x100;\n        else if (sprite->sCirclePos < 0)\n            sprite->sCirclePos += 0x100;\n        sprite->sDuration--;\n    }\n    else\n    {\n        SetCallbackToStoredInData6(sprite);\n    }\n}\n\n#undef sCirclePos\n#undef sAmplitude\n#undef sCircleSpeed\n#undef sDuration\n#undef sAmplitudeSpeed\n#undef sAmplitudeChange\n#undef sAmplitudeX\n#undef sAmplitudeY\n#undef sCirclePosX\n#undef sCircleSpeedX\n#undef sCirclePosY\n#undef sCircleSpeedY\n\n// Simply waits until the sprite's data[0] hits zero.\n// This is used to let sprite anims or affine anims to run for a designated\n// duration.\nvoid WaitAnimForDuration(struct Sprite *sprite)\n{\n    if (sprite->data[0] > 0)\n        --sprite->data[0];\n    else\n        SetCallbackToStoredInData6(sprite);\n}\n\n// Sprite data for ConvertPosDataToTranslateLinearData\n#define sStepsX  data[0]\n#define sStartX  data[1]\n#define sTargetX data[2]\n#define sStartY  data[3]\n#define sTargetY data[4]\n\n// Sprite data for TranslateSpriteLinear\n#define sMoveSteps data[0]\n#define sSpeedX    data[1]\n#define sSpeedY    data[2]\n\nstatic void AnimPosToTranslateLinear(struct Sprite *sprite)\n{\n    ConvertPosDataToTranslateLinearData(sprite);\n    sprite->callback = TranslateSpriteLinear;\n    sprite->callback(sprite);\n}\n\nvoid ConvertPosDataToTranslateLinearData(struct Sprite *sprite)\n{\n    s16 old;\n    int xDiff;\n\n    if (sprite->sStartX > sprite->sTargetX)\n        sprite->sStepsX = -sprite->sStepsX;\n    xDiff = sprite->sTargetX - sprite->sStartX;\n    old = sprite->sStepsX;\n    sprite->sMoveSteps = abs(xDiff / sprite->sStepsX);\n    sprite->sSpeedY = (sprite->sTargetY - sprite->sStartY) / sprite->sMoveSteps;\n    sprite->sSpeedX = old;\n}\n\nvoid TranslateSpriteLinear(struct Sprite *sprite)\n{\n    if (sprite->sMoveSteps > 0)\n    {\n        sprite->sMoveSteps--;\n        sprite->x2 += sprite->sSpeedX;\n        sprite->y2 += sprite->sSpeedY;\n    }\n    else\n    {\n        SetCallbackToStoredInData6(sprite);\n    }\n}\n\nvoid TranslateSpriteLinearFixedPoint(struct Sprite *sprite)\n{\n    if (sprite->data[0] > 0)\n    {\n        --sprite->data[0];\n        sprite->data[3] += sprite->data[1];\n        sprite->data[4] += sprite->data[2];\n        sprite->x2 = sprite->data[3] >> 8;\n        sprite->y2 = sprite->data[4] >> 8;\n    }\n    else\n    {\n        SetCallbackToStoredInData6(sprite);\n    }\n}\n\nstatic void TranslateSpriteLinearFixedPointIconFrame(struct Sprite *sprite)\n{\n    if (sprite->data[0] > 0)\n    {\n        --sprite->data[0];\n        sprite->data[3] += sprite->data[1];\n        sprite->data[4] += sprite->data[2];\n        sprite->x2 = sprite->data[3] >> 8;\n        sprite->y2 = sprite->data[4] >> 8;\n    }\n    else\n    {\n        SetCallbackToStoredInData6(sprite);\n    }\n\n    UpdateMonIconFrame(sprite);\n}\n\n// Unused\nstatic void TranslateSpriteToBattleTargetPos(struct Sprite *sprite)\n{\n    sprite->data[1] = sprite->x + sprite->x2;\n    sprite->data[3] = sprite->y + sprite->y2;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->callback = AnimPosToTranslateLinear;\n}\n\n// Same as TranslateSpriteLinear but takes an id to specify which sprite to move\nvoid TranslateSpriteLinearById(struct Sprite *sprite)\n{\n    if (sprite->data[0] > 0)\n    {\n        --sprite->data[0];\n        gSprites[sprite->data[3]].x2 += sprite->data[1];\n        gSprites[sprite->data[3]].y2 += sprite->data[2];\n    }\n    else\n    {\n        SetCallbackToStoredInData6(sprite);\n    }\n}\n\nvoid TranslateSpriteLinearByIdFixedPoint(struct Sprite *sprite)\n{\n    if (sprite->data[0] > 0)\n    {\n        --sprite->data[0];\n        sprite->data[3] += sprite->data[1];\n        sprite->data[4] += sprite->data[2];\n        gSprites[sprite->data[5]].x2 = sprite->data[3] >> 8;\n        gSprites[sprite->data[5]].y2 = sprite->data[4] >> 8;\n    }\n    else\n    {\n        SetCallbackToStoredInData6(sprite);\n    }\n}\n\nvoid TranslateSpriteLinearAndFlicker(struct Sprite *sprite)\n{\n    if (sprite->data[0] > 0)\n    {\n        --sprite->data[0];\n        sprite->x2 = sprite->data[2] >> 8;\n        sprite->data[2] += sprite->data[1];\n        sprite->y2 = sprite->data[4] >> 8;\n        sprite->data[4] += sprite->data[3];\n        if (sprite->data[0] % sprite->data[5] == 0)\n        {\n            if (sprite->data[5])\n                sprite->invisible ^= 1;\n        }\n    }\n    else\n    {\n        SetCallbackToStoredInData6(sprite);\n    }\n}\n\nvoid DestroySpriteAndMatrix(struct Sprite *sprite)\n{\n    FreeSpriteOamMatrix(sprite);\n    DestroyAnimSprite(sprite);\n}\n\n// Unused\nstatic void SetupAndStartSpriteLinearTranslationToAttacker(struct Sprite *sprite)\n{\n    sprite->sStartX = sprite->x + sprite->x2;\n    sprite->sStartY = sprite->y + sprite->y2;\n    sprite->sTargetX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->sTargetY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->callback = AnimPosToTranslateLinear;\n}\n\n#undef sStepsX\n#undef sStartX\n#undef sTargetX\n#undef sStartY\n#undef sTargetY\n\n// Unused\nstatic void EndUnkPaletteAnim(struct Sprite *sprite)\n{\n    PaletteStruct_ResetById(sprite->data[5]);\n    DestroySpriteAndMatrix(sprite);\n}\n\nvoid RunStoredCallbackWhenAffineAnimEnds(struct Sprite *sprite)\n{\n    if (sprite->affineAnimEnded)\n        SetCallbackToStoredInData6(sprite);\n}\n\nvoid RunStoredCallbackWhenAnimEnds(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n        SetCallbackToStoredInData6(sprite);\n}\n\nvoid DestroyAnimSpriteAndDisableBlend(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    DestroyAnimSprite(sprite);\n}\n\nvoid DestroyAnimVisualTaskAndDisableBlend(u8 taskId)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid SetSpriteCoordsToAnimAttackerCoords(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n}\n\n// Sets the initial x offset of the anim sprite depending on the horizontal orientation\n// of the two involved mons.\nvoid SetAnimSpriteInitialXOffset(struct Sprite *sprite, s16 xOffset)\n{\n    u16 attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n    u16 targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n\n    if (attackerX > targetX)\n    {\n        sprite->x -= xOffset;\n    }\n    else if (attackerX < targetX)\n    {\n        sprite->x += xOffset;\n    }\n    else\n    {\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            sprite->x -= xOffset;\n        else\n            sprite->x += xOffset;\n    }\n}\n\nvoid InitAnimArcTranslation(struct Sprite *sprite)\n{\n    sprite->sTransl_InitX = sprite->x;\n    sprite->sTransl_InitY = sprite->y;\n    InitAnimLinearTranslation(sprite);\n    sprite->data[6] = 0x8000 / sprite->sTransl_Speed;\n    sprite->data[7] = 0;\n}\n\nbool8 TranslateAnimHorizontalArc(struct Sprite *sprite)\n{\n    if (AnimTranslateLinear(sprite))\n        return TRUE;\n    sprite->data[7] += sprite->data[6];\n    sprite->y2 += Sin((u8)(sprite->data[7] >> 8), sprite->sTransl_ArcAmpl);\n    return FALSE;\n}\n\nbool8 TranslateAnimVerticalArc(struct Sprite *sprite)\n{\n    if (AnimTranslateLinear(sprite))\n        return TRUE;\n    sprite->data[7] += sprite->data[6];\n    sprite->x2 += Sin((u8)(sprite->data[7] >> 8), sprite->sTransl_ArcAmpl);\n    return FALSE;\n}\n\nvoid SetSpritePrimaryCoordsFromSecondaryCoords(struct Sprite *sprite)\n{\n    sprite->x += sprite->x2;\n    sprite->y += sprite->y2;\n    sprite->x2 = 0;\n    sprite->y2 = 0;\n}\n\nvoid InitSpritePosToAnimTarget(struct Sprite *sprite, bool8 respectMonPicOffsets)\n{\n    // Battle anim sprites are automatically created at the anim target's center, which\n    // is why there is no else clause for the \"respectMonPicOffsets\" check.\n    if (!respectMonPicOffsets)\n    {\n        sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X);\n        sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y);\n    }\n    SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);\n    sprite->y += gBattleAnimArgs[1];\n}\n\nvoid InitSpritePosToAnimAttacker(struct Sprite *sprite, bool8 respectMonPicOffsets)\n{\n    if (!respectMonPicOffsets)\n    {\n        sprite->x = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X);\n        sprite->y = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y);\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n    SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);\n    sprite->y += gBattleAnimArgs[1];\n}\n\nu8 GetBattlerSide(u8 battlerId)\n{\n    return GET_BATTLER_SIDE2(battlerId);\n}\n\nu8 GetBattlerPosition(u8 battlerId)\n{\n    return GET_BATTLER_POSITION(battlerId);\n}\n\nu8 GetBattlerAtPosition(u8 position)\n{\n    u32 i;\n\n    for (i = 0; i < gBattlersCount; ++i)\n        if (gBattlerPositions[i] == position)\n            break;\n    return i;\n}\n\nbool8 IsBattlerSpritePresent(u8 battlerId)\n{\n    if (gBattlerPositions[battlerId] == 0xFF)\n    {\n        return FALSE;\n    }\n    else if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n    {\n        if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) != 0)\n            return TRUE;\n    }\n    else\n    {\n        if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) != 0)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nbool8 IsDoubleBattle(void)\n{\n    return IS_DOUBLE_BATTLE();\n}\n\n#define BG_ANIM_PAL_1        8\n#define BG_ANIM_PAL_2        9\n\nvoid GetBattleAnimBg1Data(struct BattleAnimBgData *animBgData)\n{\n    animBgData->bgTiles = gBattleAnimBgTileBuffer;\n    animBgData->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer;\n    animBgData->paletteId = BG_ANIM_PAL_1;\n    animBgData->bgId = 1;\n    animBgData->tilesOffset = 0x200;\n    animBgData->unused = 0;\n}\n\nvoid GetBattleAnimBgData(struct BattleAnimBgData *animBgData, u32 bgId)\n{\n    if (bgId == 1)\n    {\n        GetBattleAnimBg1Data(animBgData);\n    }\n    else\n    {\n        animBgData->bgTiles = gBattleAnimBgTileBuffer;\n        animBgData->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer;\n        animBgData->paletteId = BG_ANIM_PAL_2;\n        animBgData->bgId = 2;\n        animBgData->tilesOffset = 0x300;\n        animBgData->unused = 0;\n    }\n}\n\nvoid GetBattleAnimBgDataByPriorityRank(struct BattleAnimBgData *animBgData, u8 unused)\n{\n    animBgData->bgTiles = gBattleAnimBgTileBuffer;\n    animBgData->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer;\n    if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)\n    {\n        animBgData->paletteId = BG_ANIM_PAL_1;\n        animBgData->bgId = 1;\n        animBgData->tilesOffset = 0x200;\n        animBgData->unused = 0;\n    }\n    else\n    {\n        animBgData->paletteId = BG_ANIM_PAL_2;\n        animBgData->bgId = 2;\n        animBgData->tilesOffset = 0x300;\n        animBgData->unused = 0;\n    }\n}\n\nvoid InitBattleAnimBg(u32 bgId)\n{\n    struct BattleAnimBgData animBgData;\n\n    GetBattleAnimBgData(&animBgData, bgId);\n    CpuFill32(0, animBgData.bgTiles, 0x2000);\n    LoadBgTiles(bgId, animBgData.bgTiles, 0x2000, animBgData.tilesOffset);\n    FillBgTilemapBufferRect(bgId, 0, 0, 0, 32, 64, 17);\n    CopyBgTilemapBufferToVram(bgId);\n}\n\nvoid AnimLoadCompressedBgGfx(u32 bgId, const u32 *src, u32 tilesOffset)\n{\n    CpuFill32(0, gBattleAnimBgTileBuffer, 0x2000);\n    LZDecompressWram(src, gBattleAnimBgTileBuffer);\n    LoadBgTiles(bgId, gBattleAnimBgTileBuffer, 0x2000, tilesOffset);\n}\n\nvoid InitAnimBgTilemapBuffer(u32 bgId, const void *src)\n{\n    FillBgTilemapBufferRect(bgId, 0, 0, 0, 32, 64, 17);\n    CopyToBgTilemapBuffer(bgId, src, 0, 0);\n}\n\nvoid AnimLoadCompressedBgTilemap(u32 bgId, const u32 *src)\n{\n    InitAnimBgTilemapBuffer(bgId, src);\n    CopyBgTilemapBufferToVram(bgId);\n}\n\nu8 GetBattleBgPaletteNum(void)\n{\n    /*\n    if (IsContest())\n        return 1;\n    */\n    return 2;\n}\n\nvoid ToggleBg3Mode(bool8 largeScreenSize)\n{\n    if (!largeScreenSize)\n    {\n        SetAnimBgAttribute(3, BG_ANIM_SCREEN_SIZE, 0);\n        SetAnimBgAttribute(3, BG_ANIM_AREA_OVERFLOW_MODE, 1);\n    }\n    else\n    {\n        SetAnimBgAttribute(3, BG_ANIM_SCREEN_SIZE, 1);\n        SetAnimBgAttribute(3, BG_ANIM_AREA_OVERFLOW_MODE, 0);\n    }\n}\n\nvoid Trade_MoveSelectedMonToTarget(struct Sprite *sprite)\n{\n    sprite->data[1] = sprite->x;\n    sprite->data[3] = sprite->y;\n    InitSpriteDataForLinearTranslation(sprite);\n    sprite->callback = TranslateSpriteLinearFixedPointIconFrame;\n    sprite->callback(sprite);\n}\n\nvoid InitSpriteDataForLinearTranslation(struct Sprite *sprite)\n{\n    s16 x = (sprite->data[2] - sprite->data[1]) << 8;\n    s16 y = (sprite->data[4] - sprite->data[3]) << 8;\n\n    sprite->data[1] = x / sprite->data[0];\n    sprite->data[2] = y / sprite->data[0];\n    sprite->data[4] = 0;\n    sprite->data[3] = 0;\n}\n\nvoid InitAnimLinearTranslation(struct Sprite *sprite)\n{\n    s32 x = sprite->sTransl_DestX - sprite->sTransl_InitX;\n    s32 y = sprite->sTransl_DestY - sprite->sTransl_InitY;\n    bool8 movingLeft = x < 0;\n    bool8 movingUp = y < 0;\n    u16 xDelta = abs(x) << 8;\n    u16 yDelta = abs(y) << 8;\n\n    xDelta = xDelta / sprite->sTransl_Speed;\n    yDelta = yDelta / sprite->sTransl_Speed;\n\n    if (movingLeft)\n        xDelta |= 1;\n    else\n        xDelta &= ~1;\n\n    if (movingUp)\n        yDelta |= 1;\n    else\n        yDelta &= ~1;\n\n    sprite->data[1] = xDelta;\n    sprite->data[2] = yDelta;\n    sprite->data[4] = 0;\n    sprite->data[3] = 0;\n}\n\nvoid StartAnimLinearTranslation(struct Sprite *sprite)\n{\n    sprite->sTransl_InitX = sprite->x;\n    sprite->sTransl_InitY = sprite->y;\n    InitAnimLinearTranslation(sprite);\n    sprite->callback = AnimTranslateLinear_WithFollowup;\n    sprite->callback(sprite);\n}\n\nvoid PlayerThrowBall_StartAnimLinearTranslation(struct Sprite *sprite)\n{\n    sprite->sTransl_InitX = sprite->x;\n    sprite->sTransl_InitY = sprite->y;\n    InitAnimLinearTranslation(sprite);\n    sprite->callback = PlayerThrowBall_AnimTranslateLinear_WithFollowup;\n    sprite->callback(sprite);\n}\n\nbool8 AnimTranslateLinear(struct Sprite *sprite)\n{\n    u16 v1, v2, x, y;\n\n    if (!sprite->data[0])\n        return TRUE;\n    v1 = sprite->data[1];\n    v2 = sprite->data[2];\n    x = sprite->data[3];\n    y = sprite->data[4];\n    x += v1;\n    y += v2;\n    if (v1 & 1)\n        sprite->x2 = -(x >> 8);\n    else\n        sprite->x2 = x >> 8;\n\n    if (v2 & 1)\n        sprite->y2 = -(y >> 8);\n    else\n        sprite->y2 = y >> 8;\n    sprite->data[3] = x;\n    sprite->data[4] = y;\n    --sprite->data[0];\n    return FALSE;\n}\n\nvoid AnimTranslateLinear_WithFollowup(struct Sprite *sprite)\n{\n    if (AnimTranslateLinear(sprite))\n        SetCallbackToStoredInData6(sprite);\n}\n\nstatic void PlayerThrowBall_AnimTranslateLinear_WithFollowup(struct Sprite *sprite)\n{\n    UpdatePlayerPosInThrowAnim(sprite);\n    if (AnimTranslateLinear(sprite))\n        SetCallbackToStoredInData6(sprite);\n}\n\nvoid InitAnimLinearTranslationWithSpeed(struct Sprite *sprite)\n{\n    s32 v1 = abs(sprite->sTransl_DestX - sprite->sTransl_InitX) << 8;\n\n    sprite->sTransl_Speed = v1 / sprite->sTransl_Duration;\n    InitAnimLinearTranslation(sprite);\n}\n\nvoid InitAnimLinearTranslationWithSpeedAndPos(struct Sprite *sprite)\n{\n    sprite->sTransl_InitX = sprite->x;\n    sprite->sTransl_InitY = sprite->y;\n    InitAnimLinearTranslationWithSpeed(sprite);\n    sprite->callback = AnimTranslateLinear_WithFollowup;\n    sprite->callback(sprite);\n}\n\nstatic void InitAnimFastLinearTranslation(struct Sprite *sprite)\n{\n    s32 xDiff = sprite->sTransl_DestX - sprite->sTransl_InitX;\n    s32 yDiff = sprite->sTransl_DestY - sprite->sTransl_InitY;\n    bool8 xSign = xDiff < 0;\n    bool8 ySign = yDiff < 0;\n    u16 x2 = abs(xDiff) << 4;\n    u16 y2 = abs(yDiff) << 4;\n\n    x2 /= sprite->sTransl_Duration;\n    y2 /= sprite->sTransl_Duration;\n    if (xSign)\n        x2 |= 1;\n    else\n        x2 &= ~1;\n    if (ySign)\n        y2 |= 1;\n    else\n        y2 &= ~1;\n    sprite->data[1] = x2;\n    sprite->data[2] = y2;\n    sprite->data[4] = 0;\n    sprite->data[3] = 0;\n}\n\nvoid InitAndRunAnimFastLinearTranslation(struct Sprite *sprite)\n{\n    sprite->sTransl_InitX = sprite->x;\n    sprite->sTransl_InitY = sprite->y;\n    InitAnimFastLinearTranslation(sprite);\n    sprite->callback = AnimFastTranslateLinearWaitEnd;\n    sprite->callback(sprite);\n}\n\nbool8 AnimFastTranslateLinear(struct Sprite *sprite)\n{\n    u16 v1, v2, x, y;\n\n    if (!sprite->data[0])\n        return TRUE;\n    v1 = sprite->data[1];\n    v2 = sprite->data[2];\n    x = sprite->data[3];\n    y = sprite->data[4];\n    x += v1;\n    y += v2;\n    if (v1 & 1)\n        sprite->x2 = -(x >> 4);\n    else\n        sprite->x2 = x >> 4;\n    if (v2 & 1)\n        sprite->y2 = -(y >> 4);\n    else\n        sprite->y2 = y >> 4;\n    sprite->data[3] = x;\n    sprite->data[4] = y;\n    --sprite->data[0];\n    return FALSE;\n}\n\nstatic void AnimFastTranslateLinearWaitEnd(struct Sprite *sprite)\n{\n    if (AnimFastTranslateLinear(sprite))\n        SetCallbackToStoredInData6(sprite);\n}\n\nvoid InitAnimFastLinearTranslationWithSpeed(struct Sprite *sprite)\n{\n    s32 xDiff = abs(sprite->data[2] - sprite->data[1]) << 4;\n\n    sprite->data[0] = xDiff / sprite->data[0];\n    InitAnimFastLinearTranslation(sprite);\n}\n\nvoid InitAnimFastLinearTranslationWithSpeedAndPos(struct Sprite *sprite)\n{\n    sprite->data[1] = sprite->x;\n    sprite->data[3] = sprite->y;\n    InitAnimFastLinearTranslationWithSpeed(sprite);\n    sprite->callback = AnimFastTranslateLinearWaitEnd;\n    sprite->callback(sprite);\n}\n\nvoid SetSpriteRotScale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation)\n{\n    s32 i;\n    struct ObjAffineSrcData src;\n    struct OamMatrix matrix;\n\n    src.xScale = xScale;\n    src.yScale = yScale;\n    src.rotation = rotation;\n    if (ShouldRotScaleSpeciesBeFlipped())\n        src.xScale = -src.xScale;\n    i = gSprites[spriteId].oam.matrixNum;\n    ObjAffineSet(&src, &matrix, 1, 2);\n    gOamMatrices[i].a = matrix.a;\n    gOamMatrices[i].b = matrix.b;\n    gOamMatrices[i].c = matrix.c;\n    gOamMatrices[i].d = matrix.d;\n}\n\n// Pokémon in Contests (except Unown) should be flipped.\nstatic bool8 ShouldRotScaleSpeciesBeFlipped(void)\n{\n    /*\n    if (IsContest())\n    {\n        if (gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].data[2] == SPECIES_UNOWN)\n            return FALSE;\n        else\n            return TRUE;\n    }\n    */\n    return FALSE;\n}\n\nvoid PrepareBattlerSpriteForRotScale(u8 spriteId, u8 objMode)\n{\n    u8 battlerId = gSprites[spriteId].data[0];\n\n    if (IsBattlerSpriteVisible(battlerId))\n        gSprites[spriteId].invisible = FALSE;\n    gSprites[spriteId].oam.objMode = objMode;\n    gSprites[spriteId].affineAnimPaused = TRUE;\n    if (!gSprites[spriteId].oam.affineMode)\n        gSprites[spriteId].oam.matrixNum = gBattleSpritesDataPtr->healthBoxesData[battlerId].matrixNum;\n    gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;\n    CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode);\n}\n\nvoid ResetSpriteRotScale(u8 spriteId)\n{\n    SetSpriteRotScale(spriteId, 0x100, 0x100, 0);\n    gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n    gSprites[spriteId].oam.objMode = 0;\n    gSprites[spriteId].affineAnimPaused = FALSE;\n    CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode);\n}\n\n// Sets the sprite's y offset equal to the y displacement caused by the\n// matrix's rotation.\nvoid SetBattlerSpriteYOffsetFromRotation(u8 spriteId)\n{\n    u16 matrixNum = gSprites[spriteId].oam.matrixNum;\n    // The \"c\" component of the battler sprite matrix contains the sine of the rotation angle divided by some scale amount.\n    s16 c = gOamMatrices[matrixNum].c;\n\n    if (c < 0)\n        c = -c;\n    gSprites[spriteId].y2 = c >> 3;\n}\n\nvoid TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 xScale, s16 yScale, u16 rotation)\n{\n    s32 i;\n    struct ObjAffineSrcData src;\n    struct OamMatrix matrix;\n\n    if (sprite->oam.affineMode & 1)\n    {\n        sprite->affineAnimPaused = TRUE;\n        if (recalcCenterVector)\n            CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);\n        src.xScale = xScale;\n        src.yScale = yScale;\n        src.rotation = rotation;\n        if (ShouldRotScaleSpeciesBeFlipped())\n            src.xScale = -src.xScale;\n        i = sprite->oam.matrixNum;\n        ObjAffineSet(&src, &matrix, 1, 2);\n        gOamMatrices[i].a = matrix.a;\n        gOamMatrices[i].b = matrix.b;\n        gOamMatrices[i].c = matrix.c;\n        gOamMatrices[i].d = matrix.d;\n    }\n}\n\nvoid TryResetSpriteAffineState(struct Sprite *sprite)\n{\n    TrySetSpriteRotScale(sprite, TRUE, 0x100, 0x100, 0);\n    sprite->affineAnimPaused = FALSE;\n    CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);\n}\n\nstatic u16 ArcTan2_(s16 a, s16 b)\n{\n    return ArcTan2(a, b);\n}\n\nu16 ArcTan2Neg(s16 a, s16 b)\n{\n    u16 var = ArcTan2_(a, b);\n    return -var;\n}\n\nvoid SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor)\n{\n    s32 i;\n    struct PlttData *originalColor;\n    struct PlttData *destColor;\n    u16 average;\n\n    paletteNum = PLTT_ID(paletteNum);\n\n    if (!restoreOriginalColor)\n    {\n        for (i = 0; i < 16; ++i)\n        {\n            originalColor = (struct PlttData *)&gPlttBufferUnfaded[paletteNum + i];\n            average = originalColor->r + originalColor->g + originalColor->b;\n            average /= 3;\n            destColor = (struct PlttData *)&gPlttBufferFaded[paletteNum + i];\n            destColor->r = average;\n            destColor->g = average;\n            destColor->b = average;\n        }\n    }\n    else\n    {\n        CpuCopy32(&gPlttBufferUnfaded[paletteNum], &gPlttBufferFaded[paletteNum], PLTT_SIZE_4BPP);\n    }\n}\n\nu32 GetBattlePalettesMask(bool8 battleBackground, bool8 attacker, bool8 target, bool8 attackerPartner, bool8 targetPartner, bool8 anim1, bool8 anim2)\n{\n    u32 selectedPalettes = 0;\n    u32 shift;\n\n    if (battleBackground)\n    {\n        selectedPalettes = 0xe; // Palettes 1, 2, and 3\n    }\n    if (attacker)\n    {\n        shift = gBattleAnimAttacker + 16;\n        selectedPalettes |= 1 << shift;\n    }\n    if (target)\n    {\n        shift = gBattleAnimTarget + 16;\n        selectedPalettes |= 1 << shift;\n    }\n    if (attackerPartner)\n    {\n        if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))\n        {\n            shift = BATTLE_PARTNER(gBattleAnimAttacker) + 16;\n            selectedPalettes |= 1 << shift;\n        }\n    }\n    if (targetPartner)\n    {\n        if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget)))\n        {\n            shift = BATTLE_PARTNER(gBattleAnimTarget) + 16;\n            selectedPalettes |= 1 << shift;\n        }\n    }\n    if (anim1)\n        selectedPalettes |= 1 << BG_ANIM_PAL_1;\n\n    if (anim2)\n        selectedPalettes |= 1 << BG_ANIM_PAL_2;\n\n    return selectedPalettes;\n}\n\nu32 GetBattleMonSpritePalettesMask(bool8 playerLeft, bool8 playerRight, bool8 foeLeft, bool8 foeRight)\n{\n    u32 selectedPalettes = 0;\n    u32 shift;\n\n    if (playerLeft)\n    {\n        if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)))\n        {\n            selectedPalettes |= 1 << (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) + 16);\n        }\n    }\n    if (playerRight)\n    {\n        if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)))\n        {\n            shift = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT) + 16;\n            selectedPalettes |= 1 << shift;\n        }\n    }\n    if (foeLeft)\n    {\n        if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)))\n        {\n            shift = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT) + 16;\n            selectedPalettes |= 1 << shift;\n        }\n    }\n    if (foeRight)\n    {\n        if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)))\n        {\n            shift = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT) + 16;\n            selectedPalettes |= 1 << shift;\n        }\n    }\n    return selectedPalettes;\n}\n\nu8 GetSpritePalIdxByBattler(u8 battler)\n{\n    return battler;\n}\n\n// Unused\nstatic u8 GetSpritePalIdxByPosition(u8 position)\n{\n    return GetBattlerAtPosition(position);\n}\n\nvoid AnimSpriteOnMonPos(struct Sprite *sprite)\n{\n    bool8 var;\n\n    if (!sprite->data[0])\n    {\n        if (!gBattleAnimArgs[3])\n            var = TRUE;\n        else\n            var = FALSE;\n        if (!gBattleAnimArgs[2])\n            InitSpritePosToAnimAttacker(sprite, var);\n        else\n            InitSpritePosToAnimTarget(sprite, var);\n        ++sprite->data[0];\n\n    }\n    else if (sprite->animEnded || sprite->affineAnimEnded)\n    {\n        DestroySpriteAndMatrix(sprite);\n    }\n}\n\n// Linearly translates a sprite to a target position on the\n// other mon's sprite.\n// arg 0: initial x offset\n// arg 1: initial y offset\n// arg 2: target x offset\n// arg 3: target y offset\n// arg 4: duration\n// arg 5: lower 8 bits = location on attacking mon, upper 8 bits = location on target mon pick to target\nvoid TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite)\n{\n    bool8 respectMonPicOffsets;\n    u8 coordType;\n\n    if (!(gBattleAnimArgs[5] & 0xFF00))\n        respectMonPicOffsets = TRUE;\n    else\n        respectMonPicOffsets = FALSE;\n    if (!(gBattleAnimArgs[5] & 0xFF))\n        coordType = BATTLER_COORD_Y_PIC_OFFSET;\n    else\n        coordType = BATTLER_COORD_Y;\n    InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, coordType) + gBattleAnimArgs[3];\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nvoid AnimThrowProjectile(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, 1);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    sprite->data[5] = gBattleAnimArgs[5];\n    InitAnimArcTranslation(sprite);\n    sprite->callback = AnimThrowProjectile_Step;\n}\n\nstatic void AnimThrowProjectile_Step(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n        DestroyAnimSprite(sprite);\n}\n\nvoid AnimTravelDiagonally(struct Sprite *sprite)\n{\n    bool8 r4;\n    u8 battlerId, coordType;\n\n    if (!gBattleAnimArgs[6])\n    {\n        r4 = TRUE;\n        coordType = BATTLER_COORD_Y_PIC_OFFSET;\n    }\n    else\n    {\n        r4 = FALSE;\n        coordType = BATTLER_COORD_Y;\n    }\n    if (!gBattleAnimArgs[5])\n    {\n        InitSpritePosToAnimAttacker(sprite, r4);\n        battlerId = gBattleAnimAttacker;\n    }\n    else\n    {\n        InitSpritePosToAnimTarget(sprite, r4);\n        battlerId = gBattleAnimTarget;\n    }\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    InitSpritePosToAnimTarget(sprite, r4);\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) + gBattleAnimArgs[2];\n    sprite->data[4] = GetBattlerSpriteCoord(battlerId, coordType) + gBattleAnimArgs[3];\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\ns16 CloneBattlerSpriteWithBlend(u8 animBattler)\n{\n    u32 i;\n    u8 spriteId = GetAnimBattlerSpriteId(animBattler);\n\n    if (spriteId != SPRITE_NONE)\n    {\n        for (i = 0; i < MAX_SPRITES; ++i)\n        {\n            if (!gSprites[i].inUse)\n            {\n                gSprites[i] = gSprites[spriteId];\n                gSprites[i].oam.objMode = ST_OAM_OBJ_BLEND;\n                gSprites[i].invisible = FALSE;\n                return i;\n            }\n        }\n    }\n    return -1;\n}\n\nvoid DestroySpriteWithActiveSheet(struct Sprite *sprite)\n{\n    sprite->usingSheet = TRUE;\n    DestroySprite(sprite);\n}\n\n// Only used to fade Moonlight moon sprite in\nvoid AnimTask_AlphaFadeIn(u8 taskId)\n{\n    s16 v1 = 0, v2 = 0;\n\n    if (gBattleAnimArgs[2] > gBattleAnimArgs[0])\n        v2 = 1;\n    if (gBattleAnimArgs[2] < gBattleAnimArgs[0])\n        v2 = -1;\n    if (gBattleAnimArgs[3] > gBattleAnimArgs[1])\n        v1 = 1;\n    if (gBattleAnimArgs[3] < gBattleAnimArgs[1])\n        v1 = -1;\n    gTasks[taskId].data[0] = 0;\n    gTasks[taskId].data[1] = gBattleAnimArgs[4];\n    gTasks[taskId].data[2] = 0;\n    gTasks[taskId].data[3] = gBattleAnimArgs[0];\n    gTasks[taskId].data[4] = gBattleAnimArgs[1];\n    gTasks[taskId].data[5] = v2;\n    gTasks[taskId].data[6] = v1;\n    gTasks[taskId].data[7] = gBattleAnimArgs[2];\n    gTasks[taskId].data[8] = gBattleAnimArgs[3];\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gBattleAnimArgs[0], gBattleAnimArgs[1]));\n    gTasks[taskId].func = AnimTask_AlphaFadeIn_Step;\n}\n\nstatic void AnimTask_AlphaFadeIn_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (++task->data[0] > task->data[1])\n    {\n        task->data[0] = 0;\n        if (++task->data[2] & 1)\n        {\n            if (task->data[3] != task->data[7])\n                task->data[3] += task->data[5];\n        }\n        else\n        {\n            if (task->data[4] != task->data[8])\n                task->data[4] += task->data[6];\n        }\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4]));\n        if (task->data[3] == task->data[7] && task->data[4] == task->data[8])\n        {\n            DestroyAnimVisualTask(taskId);\n            return;\n        }\n    }\n}\n\n// Linearly blends a mon's sprite colors with a target color with increasing\n// strength, and then blends out to the original color.\n// arg 0: anim bank\n// arg 1: blend color\n// arg 2: target blend coefficient\n// arg 3: initial delay\n// arg 4: number of times to blend in and out\nvoid AnimTask_BlendMonInAndOut(u8 task)\n{\n    u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n\n    if (spriteId == 0xFF)\n    {\n        DestroyAnimVisualTask(task);\n        return;\n    }\n    gTasks[task].data[0] = OBJ_PLTT_ID(gSprites[spriteId].oam.paletteNum) + 1;\n    AnimTask_BlendMonInAndOutSetup(&gTasks[task]);\n}\n\nstatic void AnimTask_BlendMonInAndOutSetup(struct Task *task)\n{\n    task->data[1] = gBattleAnimArgs[1];\n    task->data[2] = 0;\n    task->data[3] = gBattleAnimArgs[2];\n    task->data[4] = 0;\n    task->data[5] = gBattleAnimArgs[3];\n    task->data[6] = 0;\n    task->data[7] = gBattleAnimArgs[4];\n    task->func = AnimTask_BlendMonInAndOut_Step;\n}\n\nstatic void AnimTask_BlendMonInAndOut_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (++task->data[4] >= task->data[5])\n    {\n        task->data[4] = 0;\n        if (!task->data[6])\n        {\n            ++task->data[2];\n            BlendPalette(task->data[0], 15, task->data[2], task->data[1]);\n            if (task->data[2] == task->data[3])\n                task->data[6] = 1;\n        }\n        else\n        {\n            --task->data[2];\n            BlendPalette(task->data[0], 15, task->data[2], task->data[1]);\n            if (!task->data[2])\n            {\n                if (--task->data[7])\n                {\n                    task->data[4] = 0;\n                    task->data[6] = 0;\n                }\n                else\n                {\n                    DestroyAnimVisualTask(taskId);\n                    return;\n                }\n            }\n        }\n    }\n}\n\n// See AnimTask_BlendMonInAndOut. Same, but ANIM_TAG_* instead of mon\nvoid AnimTask_BlendPalInAndOutByTag(u8 taskId)\n{\n    u8 palette = IndexOfSpritePaletteTag(gBattleAnimArgs[0]);\n\n    if (palette == 0xFF)\n    {\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n    gTasks[taskId].data[0] = (palette * 0x10) + 0x101;\n    AnimTask_BlendMonInAndOutSetup(&gTasks[taskId]);\n}\n\nvoid PrepareAffineAnimInTaskData(struct Task *task, u8 spriteId, const union AffineAnimCmd *affineAnimCmds)\n{\n    task->data[7] = 0;\n    task->data[8] = 0;\n    task->data[9] = 0;\n    task->data[15] = spriteId;\n    task->data[10] = 0x100;\n    task->data[11] = 0x100;\n    task->data[12] = 0;\n    StorePointerInVars(&task->data[13], &task->data[14], affineAnimCmds);\n    PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL);\n}\n\nbool8 RunAffineAnimFromTaskData(struct Task *task)\n{\n    sAnimTaskAffineAnim = LoadPointerFromVars(task->data[13], task->data[14]) + (task->data[7] << 3);\n    switch (sAnimTaskAffineAnim->type)\n    {\n    default:\n        if (!sAnimTaskAffineAnim->frame.duration)\n        {\n            task->data[10] = sAnimTaskAffineAnim->frame.xScale;\n            task->data[11] = sAnimTaskAffineAnim->frame.yScale;\n            task->data[12] = sAnimTaskAffineAnim->frame.rotation;\n            ++task->data[7];\n            ++sAnimTaskAffineAnim;\n        }\n        task->data[10] += sAnimTaskAffineAnim->frame.xScale;\n        task->data[11] += sAnimTaskAffineAnim->frame.yScale;\n        task->data[12] += sAnimTaskAffineAnim->frame.rotation;\n        SetSpriteRotScale(task->data[15], task->data[10], task->data[11], task->data[12]);\n        SetBattlerSpriteYOffsetFromYScale(task->data[15]);\n        if (++task->data[8] >= sAnimTaskAffineAnim->frame.duration)\n        {\n            task->data[8] = 0;\n            ++task->data[7];\n        }\n        break;\n    case AFFINEANIMCMDTYPE_JUMP:\n        task->data[7] = sAnimTaskAffineAnim->jump.target;\n        break;\n    case AFFINEANIMCMDTYPE_LOOP:\n        if (sAnimTaskAffineAnim->loop.count)\n        {\n            if (task->data[9])\n            {\n                if (!--task->data[9])\n                {\n                    ++task->data[7];\n                    break;\n                }\n            }\n            else\n            {\n                task->data[9] = sAnimTaskAffineAnim->loop.count;\n            }\n            if (!task->data[7])\n            {\n                break;\n            }\n            while (TRUE)\n            {\n                --task->data[7];\n                --sAnimTaskAffineAnim;\n                if (sAnimTaskAffineAnim->type == AFFINEANIMCMDTYPE_LOOP)\n                {\n                    ++task->data[7];\n                    return TRUE;\n                }\n                if (!task->data[7])\n                    return TRUE;\n            }\n        }\n        ++task->data[7];\n        break;\n    case AFFINEANIMCMDTYPE_END:\n        gSprites[task->data[15]].y2 = 0;\n        ResetSpriteRotScale(task->data[15]);\n        return FALSE;\n    }\n    return TRUE;\n}\n\n// Sets the sprite's y offset equal to the y displacement caused by the\n// matrix's scale in the y dimension.\nvoid SetBattlerSpriteYOffsetFromYScale(u8 spriteId)\n{\n    s32 var = MON_PIC_HEIGHT - GetBattlerYDeltaFromSpriteId(spriteId) * 2;\n    u16 matrix = gSprites[spriteId].oam.matrixNum;\n    s32 var2 = SAFE_DIV(var << 8, gOamMatrices[matrix].d);\n\n    if (var2 > MON_PIC_HEIGHT * 2)\n        var2 = MON_PIC_HEIGHT * 2;\n    gSprites[spriteId].y2 = (var - var2) / 2;\n}\n\n// Sets the sprite's y offset equal to the y displacement caused by another sprite\n// matrix's scale in the y dimension.\nvoid SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId)\n{\n    s32 var = MON_PIC_HEIGHT - GetBattlerYDeltaFromSpriteId(otherSpriteId) * 2;\n    u16 matrix = gSprites[spriteId].oam.matrixNum;\n    s32 var2 = SAFE_DIV((var << 8), gOamMatrices[matrix].d);\n\n    if (var2 > MON_PIC_HEIGHT * 2)\n        var2 = MON_PIC_HEIGHT * 2;\n    gSprites[spriteId].y2 = (var - var2) / 2;\n}\n\nstatic u16 GetBattlerYDeltaFromSpriteId(u8 spriteId)\n{\n    struct BattleSpriteInfo *spriteInfo;\n    u8 battlerId = gSprites[spriteId].data[0];\n    u16 species;\n    u32 i;\n\n    for (i = 0; i < MAX_BATTLERS_COUNT; ++i)\n    {\n        if (gBattlerSpriteIds[i] == spriteId)\n        {\n            if (GetBattlerSide(i) == B_SIDE_PLAYER)\n            {\n                spriteInfo = gBattleSpritesDataPtr->battlerData;\n                if (!spriteInfo[battlerId].transformSpecies)\n                    species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);\n                else\n                    species = spriteInfo[battlerId].transformSpecies;\n                return gMonBackPicCoords[species].y_offset;\n            }\n            else\n            {\n                spriteInfo = gBattleSpritesDataPtr->battlerData;\n                if (!spriteInfo[battlerId].transformSpecies)\n                    species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);\n                else\n                    species = spriteInfo[battlerId].transformSpecies;\n                return gMonFrontPicCoords[species].y_offset;\n            }\n        }\n    }\n    return MON_PIC_HEIGHT;\n}\n\nvoid StorePointerInVars(s16 *lo, s16 *hi, const void *ptr)\n{\n    *lo = ((intptr_t)ptr) & 0xffff;\n    *hi = (((intptr_t)ptr) >> 16) & 0xffff;\n}\n\nvoid *LoadPointerFromVars(s16 lo, s16 hi)\n{\n    return (void *)((u16)lo | ((u16)hi << 16));\n}\n\nvoid BattleAnimHelper_SetSpriteSquashParams(struct Task *task, u8 spriteId, s16 xScaleStart, s16 yScaleStart, s16 xScaleEnd, s16 yScaleEnd, u16 duration)\n{\n    task->data[8] = duration;\n    task->data[15] = spriteId;\n    task->data[9] = xScaleStart;\n    task->data[10] = yScaleStart;\n    task->data[13] = xScaleEnd;\n    task->data[14] = yScaleEnd;\n    task->data[11] = (xScaleEnd - xScaleStart) / duration;\n    task->data[12] = (yScaleEnd - yScaleStart) / duration;\n}\n\nu8 BattleAnimHelper_RunSpriteSquash(struct Task *task)\n{\n    if (!task->data[8])\n        return 0;\n    if (--task->data[8] != 0)\n    {\n        task->data[9] += task->data[11];\n        task->data[10] += task->data[12];\n    }\n    else\n    {\n        task->data[9] = task->data[13];\n        task->data[10] = task->data[14];\n    }\n    SetSpriteRotScale(task->data[15], task->data[9], task->data[10], 0);\n    if (task->data[8])\n        SetBattlerSpriteYOffsetFromYScale(task->data[15]);\n    else\n        gSprites[task->data[15]].y2 = 0;\n    return task->data[8];\n}\n\nvoid AnimTask_GetFrustrationPowerLevel(u8 taskId)\n{\n    u16 powerLevel;\n\n    if (gAnimFriendship <= 30)\n        powerLevel = 0;\n    else if (gAnimFriendship <= 100)\n        powerLevel = 1;\n    else if (gAnimFriendship <= 200)\n        powerLevel = 2;\n    else\n        powerLevel = 3;\n    gBattleAnimArgs[ARG_RET_ID] = powerLevel;\n    DestroyAnimVisualTask(taskId);\n}\n\n// Unused\nstatic void SetPriorityForVisibleBattlers(u8 priority)\n{\n    if (IsBattlerSpriteVisible(gBattleAnimTarget))\n        gSprites[gBattlerSpriteIds[gBattleAnimTarget]].oam.priority = priority;\n    if (IsBattlerSpriteVisible(gBattleAnimAttacker))\n        gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].oam.priority = priority;\n    if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget)))\n        gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimTarget)]].oam.priority = priority;\n    if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))\n        gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority = priority;\n}\n\nvoid InitPrioritiesForVisibleBattlers(void)\n{\n    s32 i;\n\n    for (i = 0; i < gBattlersCount; ++i)\n    {\n        if (IsBattlerSpriteVisible(i))\n        {\n            gSprites[gBattlerSpriteIds[i]].subpriority = GetBattlerSpriteSubpriority(i);\n            gSprites[gBattlerSpriteIds[i]].oam.priority = 2;\n        }\n    }\n}\n\nu8 GetBattlerSpriteSubpriority(u8 battlerId)\n{\n    u8 subpriority;\n    u8 position = GetBattlerPosition(battlerId);\n\n    if (position == B_POSITION_PLAYER_LEFT)\n        subpriority = 30;\n    else if (position == B_POSITION_PLAYER_RIGHT)\n        subpriority = 20;\n    else if (position == B_POSITION_OPPONENT_LEFT)\n        subpriority = 40;\n    else\n        subpriority = 50;\n    return subpriority;\n}\n\nu8 GetBattlerSpriteBGPriority(u8 battlerId)\n{\n    u8 position = GetBattlerPosition(battlerId);\n\n    if (position == B_POSITION_PLAYER_LEFT || position == B_POSITION_OPPONENT_RIGHT)\n        return GetAnimBgAttribute(2, BG_ANIM_PRIORITY);\n    else\n        return GetAnimBgAttribute(1, BG_ANIM_PRIORITY);\n}\n\nu8 GetBattlerSpriteBGPriorityRank(u8 battlerId)\n{\n    u8 position = GetBattlerPosition(battlerId);\n\n    if (position == B_POSITION_PLAYER_LEFT || position == B_POSITION_OPPONENT_RIGHT)\n        return 2;\n    else\n        return 1;\n}\n\n// Create pokemon sprite to be used for a move animation effect (e.g. Role Play / Snatch)\nu8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 templateId, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, bool32 ignoreDeoxys)\n{\n    u8 spriteId;\n    u16 sheet = LoadSpriteSheet(&sSpriteSheets_MoveEffectMons[templateId]);\n    u16 palette = AllocSpritePalette(sSpriteTemplates_MoveEffectMons[templateId].paletteTag);\n\n    if (gMonSpritesGfxPtr != NULL && gMonSpritesGfxPtr->multiUseBuffer == NULL)\n        gMonSpritesGfxPtr->multiUseBuffer = AllocZeroed(0x2000);\n    if (!isBackpic)\n    {\n        LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), OBJ_PLTT_ID(palette), PLTT_SIZE_4BPP);\n        if (ignoreDeoxys == TRUE || ShouldIgnoreDeoxysForm(DEOXYS_CHECK_BATTLE_ANIM, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0)\n            LoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species],\n                                                gMonSpritesGfxPtr->multiUseBuffer,\n                                                species,\n                                                personality,\n                                                TRUE);\n        else\n            LoadSpecialPokePic(&gMonFrontPicTable[species],\n                               gMonSpritesGfxPtr->multiUseBuffer,\n                               species,\n                               personality,\n                               TRUE);\n    }\n    else\n    {\n        LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), OBJ_PLTT_ID(palette), PLTT_SIZE_4BPP);\n        if (ignoreDeoxys == TRUE || ShouldIgnoreDeoxysForm(DEOXYS_CHECK_BATTLE_ANIM, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0)\n            LoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species],\n                                                gMonSpritesGfxPtr->multiUseBuffer,\n                                                species,\n                                                personality,\n                                                FALSE);\n        else\n            LoadSpecialPokePic(&gMonBackPicTable[species],\n                               gMonSpritesGfxPtr->multiUseBuffer,\n                               species,\n                               personality,\n                               FALSE);\n    }\n    RequestDma3Copy(gMonSpritesGfxPtr->multiUseBuffer, (void *)(OBJ_VRAM0 + (sheet * 0x20)), 0x800, 1);\n    FREE_AND_SET_NULL(gMonSpritesGfxPtr->multiUseBuffer);\n    if (!isBackpic)\n        spriteId = CreateSprite(&sSpriteTemplates_MoveEffectMons[templateId], x, y + gMonFrontPicCoords[species].y_offset, subpriority);\n    else\n        spriteId = CreateSprite(&sSpriteTemplates_MoveEffectMons[templateId], x, y + gMonBackPicCoords[species].y_offset, subpriority);\n    return spriteId;\n}\n\nvoid DestroySpriteAndFreeResources_(struct Sprite *sprite)\n{\n    DestroySpriteAndFreeResources(sprite);\n}\n\ns16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr)\n{\n    u16 species;\n    u32 personality;\n    u16 letter;\n    u16 unownSpecies;\n    s32 ret;\n    const struct MonCoords *coords;\n    struct BattleSpriteInfo *spriteInfo;\n\n    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n    {\n        spriteInfo = gBattleSpritesDataPtr->battlerData;\n        if (!spriteInfo[battlerId].transformSpecies)\n        {\n            species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n            personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY);\n        }\n        else\n        {\n            species = spriteInfo[battlerId].transformSpecies;\n            personality = gTransformedPersonalities[battlerId];\n        }\n        if (species == SPECIES_UNOWN)\n        {\n            letter = GET_UNOWN_LETTER(personality);\n            if (!letter)\n                unownSpecies = SPECIES_UNOWN;\n            else\n                unownSpecies = letter + SPECIES_UNOWN_B - 1;\n            coords = &gMonBackPicCoords[unownSpecies];\n        }\n        else if (species > NUM_SPECIES)\n        {\n            coords = &gMonBackPicCoords[0];\n        }\n        else\n        {\n            coords = &gMonBackPicCoords[species];\n        }\n    }\n    else\n    {\n        spriteInfo = gBattleSpritesDataPtr->battlerData;\n        if (!spriteInfo[battlerId].transformSpecies)\n        {\n            species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n            personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY);\n        }\n        else\n        {\n            species = spriteInfo[battlerId].transformSpecies;\n            personality = gTransformedPersonalities[battlerId];\n        }\n\n        if (species == SPECIES_UNOWN)\n        {\n            letter = GET_UNOWN_LETTER(personality);\n            if (!letter)\n                unownSpecies = SPECIES_UNOWN;\n            else\n                unownSpecies = letter + SPECIES_UNOWN_B - 1;\n            coords = &gMonFrontPicCoords[unownSpecies];\n        }\n        else if (species == SPECIES_CASTFORM)\n        {\n            coords = &gCastformFrontSpriteCoords[gBattleMonForms[battlerId]];\n        }\n        else if (species > NUM_SPECIES)\n        {\n            coords = &gMonFrontPicCoords[0];\n        }\n        else\n        {\n            coords = &gMonFrontPicCoords[species];\n        }\n    }\n    switch (attr)\n    {\n    case BATTLER_COORD_ATTR_HEIGHT:\n        return GET_MON_COORDS_HEIGHT(coords->size);\n    case BATTLER_COORD_ATTR_WIDTH:\n        return GET_MON_COORDS_WIDTH(coords->size);\n    case BATTLER_COORD_ATTR_LEFT:\n        return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) - (GET_MON_COORDS_WIDTH(coords->size) / 2);\n    case BATTLER_COORD_ATTR_RIGHT:\n        return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) + (GET_MON_COORDS_WIDTH(coords->size) / 2);\n    case BATTLER_COORD_ATTR_TOP:\n        return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) - (GET_MON_COORDS_HEIGHT(coords->size) / 2);\n    case BATTLER_COORD_ATTR_BOTTOM:\n        return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) + (GET_MON_COORDS_HEIGHT(coords->size) / 2);\n    case BATTLER_COORD_ATTR_RAW_BOTTOM:\n        ret = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 31;\n        return ret - coords->y_offset;\n    default:\n        return 0;\n    }\n}\n\nvoid SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x, s16 *y)\n{\n    u8 xCoordType, yCoordType;\n    s16 battlerX, battlerY;\n    s16 partnerX, partnerY;\n\n    if (!respectMonPicOffsets)\n    {\n        xCoordType = BATTLER_COORD_X;\n        yCoordType = BATTLER_COORD_Y;\n    }\n    else\n    {\n        xCoordType = BATTLER_COORD_X_2;\n        yCoordType = BATTLER_COORD_Y_PIC_OFFSET;\n    }\n    battlerX = GetBattlerSpriteCoord(battlerId, xCoordType);\n    battlerY = GetBattlerSpriteCoord(battlerId, yCoordType);\n    if (IsDoubleBattle())\n    {\n        partnerX = GetBattlerSpriteCoord(BATTLE_PARTNER(battlerId), xCoordType);\n        partnerY = GetBattlerSpriteCoord(BATTLE_PARTNER(battlerId), yCoordType);\n    }\n    else\n    {\n        partnerX = battlerX;\n        partnerY = battlerY;\n    }\n    *x = (battlerX + partnerX) / 2;\n    *y = (battlerY + partnerY) / 2;\n}\n\nu8 CreateInvisibleSpriteCopy(s32 battlerId, u8 spriteId, s32 species)\n{\n    u8 newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);\n\n    gSprites[newSpriteId] = gSprites[spriteId];\n    gSprites[newSpriteId].usingSheet = TRUE;\n    gSprites[newSpriteId].oam.priority = 0;\n    gSprites[newSpriteId].oam.objMode = ST_OAM_OBJ_WINDOW;\n    gSprites[newSpriteId].oam.tileNum = gSprites[spriteId].oam.tileNum;\n    gSprites[newSpriteId].callback = SpriteCallbackDummy;\n    return newSpriteId;\n}\n\nvoid AnimTranslateLinearAndFlicker_Flipped(struct Sprite *sprite)\n{\n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->x -= gBattleAnimArgs[0];\n        gBattleAnimArgs[3] = -gBattleAnimArgs[3];\n        sprite->hFlip = TRUE;\n    }\n    else\n    {\n        sprite->x += gBattleAnimArgs[0];\n    }\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[3] = gBattleAnimArgs[4];\n    sprite->data[5] = gBattleAnimArgs[5];\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = TranslateSpriteLinearAndFlicker;\n}\n\n// Used by three different unused battle anim sprite templates.\nvoid AnimTranslateLinearAndFlicker(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->x -= gBattleAnimArgs[0];\n        gBattleAnimArgs[3] *= -1;\n    }\n    else\n    {\n        sprite->x += gBattleAnimArgs[0];\n    }\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[3] = gBattleAnimArgs[4];\n    sprite->data[5] = gBattleAnimArgs[5];\n    StartSpriteAnim(sprite, gBattleAnimArgs[6]);\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = TranslateSpriteLinearAndFlicker;\n}\n\n// Used by Detect/Disable\nvoid AnimSpinningSparkle(struct Sprite *sprite)\n{\n    SetSpriteCoordsToAnimAttackerCoords(sprite);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->x -= gBattleAnimArgs[0];\n    else\n        sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Task and sprite data for AnimTask_AttackerPunchWithTrace\n#define tBattlerSpriteId data[0]\n#define tMoveSpeed       data[1]\n#define tState           data[2]\n#define tCounter         data[3]\n#define tPaletteNum      data[4]\n#define tNumTracesActive data[5]\n#define tPriority        data[6]\n\n#define sActiveTime data[0]\n#define sTaskId     data[1]\n#define sSpriteId   data[2]\n\nvoid AnimTask_AttackerPunchWithTrace(u8 taskId)\n{\n    u16 src;\n    u16 dest;\n    struct Task *task = &gTasks[taskId];\n\n    task->tBattlerSpriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    task->tMoveSpeed = (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) ? -8 : 8;\n    task->tState = 0;\n    task->tCounter = 0;\n    gSprites[task->tBattlerSpriteId].x2 -= task->tBattlerSpriteId;\n    task->tPaletteNum = AllocSpritePalette(ANIM_TAG_BENT_SPOON);\n    task->tNumTracesActive = 0;\n\n    dest = OBJ_PLTT_ID2(task->tPaletteNum);\n    src = OBJ_PLTT_ID2(gSprites[task->tBattlerSpriteId].oam.paletteNum);\n    \n    // Set trace's priority based on battler's subpriority\n    task->tPriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker);\n    if (task->tPriority == 20 || task->tPriority == 40)\n        task->tPriority = 2;\n    else\n        task->tPriority = 3;\n\n    CpuCopy32(&gPlttBufferUnfaded[src], &gPlttBufferFaded[dest], PLTT_SIZE_4BPP);\n    BlendPalette(dest, 16, gBattleAnimArgs[1], gBattleAnimArgs[0]);\n    task->func = AnimTask_AttackerPunchWithTrace_Step;\n}\n\nstatic void AnimTask_AttackerPunchWithTrace_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->tState)\n    {\n    case 0:\n        // Move forward\n        CreateBattlerTrace(task, taskId);\n        gSprites[task->tBattlerSpriteId].x2 += task->tMoveSpeed;\n        if (++task->tCounter == 5)\n        {\n            task->tCounter--;\n            task->tState++;\n        }\n        break;\n    case 1:\n        // Move back (do same number of traces as before)\n        CreateBattlerTrace(task, taskId);\n        gSprites[task->tBattlerSpriteId].x2 -= task->tMoveSpeed;\n        if (--task->tCounter == 0)\n        {\n            gSprites[task->tBattlerSpriteId].x2 = 0;\n            task->tState++;\n        }\n        break;\n    case 2:\n        if (task->tNumTracesActive == 0)\n        {\n            FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON);\n            DestroyAnimVisualTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void CreateBattlerTrace(struct Task *task, u8 taskId)\n{\n    s16 spriteId = CloneBattlerSpriteWithBlend(0);\n    if (spriteId >= 0)\n    {\n        gSprites[spriteId].oam.priority = task->tPriority;\n        gSprites[spriteId].oam.paletteNum = task->tPaletteNum;\n        gSprites[spriteId].sActiveTime = 8;\n        gSprites[spriteId].sTaskId = taskId;\n        gSprites[spriteId].sSpriteId = spriteId;\n        gSprites[spriteId].x2 = gSprites[task->tBattlerSpriteId].x2;\n        gSprites[spriteId].callback = AnimBattlerTrace;\n        task->tNumTracesActive++;\n    }\n}\n\n// Just waits until destroyed\nstatic void AnimBattlerTrace(struct Sprite *sprite)\n{\n    if (--sprite->sActiveTime == 0)\n    {\n        gTasks[sprite->sTaskId].tNumTracesActive--;\n        DestroySpriteWithActiveSheet(sprite);\n    }\n}\n\n#undef tBattlerSpriteId\n#undef tMoveSpeed\n#undef tState\n#undef tCounter\n#undef tPaletteNum\n#undef tNumTracesActive\n#undef tPriority\n\n#undef sActiveTime\n#undef sTaskId\n#undef sSpriteId\n\nvoid AnimWeatherBallUp(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        sprite->data[0] = 5;\n    else\n        sprite->data[0] = -10;\n    sprite->data[1] = -40;\n    sprite->callback = AnimWeatherBallUp_Step;\n}\n\nstatic void AnimWeatherBallUp_Step(struct Sprite *sprite)\n{\n    sprite->data[2] += sprite->data[0];\n    sprite->data[3] += sprite->data[1];\n    sprite->x2 = sprite->data[2] / 10;\n    sprite->y2 = sprite->data[3] / 10;\n    if (sprite->data[1] < -20)\n        ++sprite->data[1];\n    if (sprite->y + sprite->y2 < -32)\n        DestroyAnimSprite(sprite);\n}\n\nvoid AnimWeatherBallDown(struct Sprite *sprite)\n{\n    s32 x;\n\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[2] = sprite->x + gBattleAnimArgs[4];\n    sprite->data[4] = sprite->y + gBattleAnimArgs[5];\n    if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)\n    {\n        x = (u16)gBattleAnimArgs[4] + 30;\n        sprite->x += x;\n        sprite->y = gBattleAnimArgs[5] - 20;\n    }\n    else\n    {\n        x = (u16)gBattleAnimArgs[4] - 30;\n        sprite->x += x;\n        sprite->y = gBattleAnimArgs[5] - 80;\n    }\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n"
  },
  {
    "path": "src/battle_anim_normal.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"random.h\"\n#include \"task.h\"\n#include \"trig.h\"\n\nstatic void AnimConfusionDuck(struct Sprite *sprite);\nstatic void AnimSimplePaletteBlend(struct Sprite *sprite);\nstatic void AnimComplexPaletteBlend(struct Sprite *sprite);\nstatic void AnimCirclingSparkle(struct Sprite *sprite);\nstatic void AnimShakeMonOrBattleTerrain(struct Sprite *sprite);\nstatic void AnimHitSplatBasic(struct Sprite *sprite);\nstatic void AnimHitSplatHandleInvert(struct Sprite *sprite);\nstatic void AnimHitSplatRandom(struct Sprite *sprite);\nstatic void AnimHitSplatOnMonEdge(struct Sprite *sprite);\nstatic void AnimCrossImpact(struct Sprite *sprite);\nstatic void AnimFlashingHitSplat(struct Sprite *sprite);\nstatic void AnimHitSplatPersistent(struct Sprite *sprite);\nstatic void AnimConfusionDuck_Step(struct Sprite *sprite);\nstatic void AnimSimplePaletteBlend_Step(struct Sprite *sprite);\nstatic void AnimComplexPaletteBlend_Step1(struct Sprite *sprite);\nstatic void AnimComplexPaletteBlend_Step2(struct Sprite *sprite);\nstatic void BlendColorCycle(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);\nstatic void AnimTask_BlendColorCycleLoop(u8 taskId);\nstatic void BlendColorCycleExclude(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);\nstatic void AnimTask_BlendColorCycleExcludeLoop(u8 taskId);\nstatic void BlendColorCycleByTag(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);\nstatic void AnimTask_BlendColorCycleByTagLoop(u8 taskId);\nstatic void AnimTask_FlashAnimTagWithColor_Step1(u8 taskId);\nstatic void AnimTask_FlashAnimTagWithColor_Step2(u8 taskId);\nstatic void AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled(void);\nstatic void AnimShakeMonOrBattleTerrain_Step(struct Sprite *sprite);\nstatic void AnimTask_ShakeBattleTerrain_Step(u8 taskId);\nstatic void AnimFlashingHitSplat_Step(struct Sprite *sprite);\n\n\nstatic const union AnimCmd sAnim_ConfusionDuck_0[] =\n{\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(0, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 8),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_ConfusionDuck_1[] =\n{\n    ANIMCMD_FRAME(0, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(8, 8),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_ConfusionDuck[] =\n{\n    sAnim_ConfusionDuck_0,\n    sAnim_ConfusionDuck_1,\n};\n\nconst struct SpriteTemplate gConfusionDuckSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_DUCK,\n    .paletteTag = ANIM_TAG_DUCK,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sAnims_ConfusionDuck,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimConfusionDuck,\n};\n\nconst struct SpriteTemplate gSimplePaletteBlendSpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSimplePaletteBlend,\n};\n\nconst struct SpriteTemplate gComplexPaletteBlendSpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimComplexPaletteBlend,\n};\n\nstatic const union AnimCmd sAnim_CirclingSparkle[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_FRAME(64, 3),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_CirclingSparkle[] =\n{\n    sAnim_CirclingSparkle,\n};\n\n// Unused\nstatic const struct SpriteTemplate sCirclingSparkleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARKLE_4,\n    .paletteTag = ANIM_TAG_SPARKLE_4,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_CirclingSparkle,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimCirclingSparkle,\n};\n\nconst struct SpriteTemplate gShakeMonOrTerrainSpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimShakeMonOrBattleTerrain,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_HitSplat_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_HitSplat_1[] =\n{\n    AFFINEANIMCMD_FRAME(0xD8, 0xD8, 0, 0),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_HitSplat_2[] =\n{\n    AFFINEANIMCMD_FRAME(0xB0, 0xB0, 0, 0),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_HitSplat_3[] =\n{\n    AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_HitSplat[] =\n{\n    sAffineAnim_HitSplat_0,\n    sAffineAnim_HitSplat_1,\n    sAffineAnim_HitSplat_2,\n    sAffineAnim_HitSplat_3,\n};\n\nconst struct SpriteTemplate gBasicHitSplatSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_IMPACT,\n    .paletteTag = ANIM_TAG_IMPACT,\n    .oam = &gOamData_AffineNormal_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_HitSplat,\n    .callback = AnimHitSplatBasic,\n};\n\nconst struct SpriteTemplate gHandleInvertHitSplatSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_IMPACT,\n    .paletteTag = ANIM_TAG_IMPACT,\n    .oam = &gOamData_AffineNormal_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_HitSplat,\n    .callback = AnimHitSplatHandleInvert,\n};\n\nconst struct SpriteTemplate gWaterHitSplatSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WATER_IMPACT,\n    .paletteTag = ANIM_TAG_WATER_IMPACT,\n    .oam = &gOamData_AffineNormal_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_HitSplat,\n    .callback = AnimHitSplatBasic,\n};\n\nconst struct SpriteTemplate gRandomPosHitSplatSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_IMPACT,\n    .paletteTag = ANIM_TAG_IMPACT,\n    .oam = &gOamData_AffineNormal_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_HitSplat,\n    .callback = AnimHitSplatRandom,\n};\n\nconst struct SpriteTemplate gMonEdgeHitSplatSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_IMPACT,\n    .paletteTag = ANIM_TAG_IMPACT,\n    .oam = &gOamData_AffineNormal_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_HitSplat,\n    .callback = AnimHitSplatOnMonEdge,\n};\n\nconst struct SpriteTemplate gCrossImpactSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CROSS_IMPACT,\n    .paletteTag = ANIM_TAG_CROSS_IMPACT,\n    .oam = &gOamData_AffineOff_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimCrossImpact,\n};\n\nconst struct SpriteTemplate gFlashingHitSplatSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_IMPACT,\n    .paletteTag = ANIM_TAG_IMPACT,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_HitSplat,\n    .callback = AnimFlashingHitSplat,\n};\n\nconst struct SpriteTemplate gPersistHitSplatSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_IMPACT,\n    .paletteTag = ANIM_TAG_IMPACT,\n    .oam = &gOamData_AffineNormal_ObjBlend_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_HitSplat,\n    .callback = AnimHitSplatPersistent,\n};\n\n// Moves a spinning duck around the mon's head.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: initial wave offset\n// arg 3: wave period (higher means faster wave)\n// arg 4: duration\nstatic void AnimConfusionDuck(struct Sprite *sprite)\n{\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[2];\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->data[1] = -gBattleAnimArgs[3];\n        sprite->data[4] = 1;\n    }\n    else\n    {\n        sprite->data[1] = gBattleAnimArgs[3];\n        sprite->data[4] = 0;\n        StartSpriteAnim(sprite, 1);\n    }\n    sprite->data[3] = gBattleAnimArgs[4];\n    sprite->callback = AnimConfusionDuck_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimConfusionDuck_Step(struct Sprite *sprite)\n{\n    sprite->x2 = Cos(sprite->data[0], 30);\n    sprite->y2 = Sin(sprite->data[0], 10);\n    if ((u16)sprite->data[0] < 128)\n        sprite->oam.priority = 1;\n    else\n        sprite->oam.priority = 3;\n    sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF;\n    if (++sprite->data[2] == sprite->data[3])\n        DestroyAnimSprite(sprite);\n}\n\n// Performs a simple color blend on a specified sprite.\n// arg 0: palette selector\n// arg 1: delay\n// arg 2: start blend amount\n// arg 3: end blend amount\n// arg 4: blend color\nstatic void AnimSimplePaletteBlend(struct Sprite *sprite)\n{\n    u32 selectedPalettes = UnpackSelectedBattlePalettes(gBattleAnimArgs[0]);\n    \n    BeginNormalPaletteFade(selectedPalettes, gBattleAnimArgs[1], gBattleAnimArgs[2], gBattleAnimArgs[3], gBattleAnimArgs[4]);\n    sprite->invisible = TRUE;\n    sprite->callback = AnimSimplePaletteBlend_Step;\n}\n\n// Unpacks a bitfield and returns a bitmask of its selected palettes.\n// Bits 0-6 of the selector parameter result in the following palettes being selected:\n//   0: F_PAL_BG, battle background palettes (BG palettes 1, 2, and 3)\n//   1: F_PAL_ATTACKER, gBattleAnimAttacker OBJ palette\n//   2: F_PAL_TARGET, gBattleAnimTarget OBJ palette\n//   3: F_PAL_ATK_PARTNER, gBattleAnimAttacker partner OBJ palette\n//   4: F_PAL_DEF_PARTNER, gBattleAnimTarget partner OBJ palette\n//   5: F_PAL_ANIM_1, BG palette 8\n//   6: F_PAL_ANIM_2, BG palette 9\nu32 UnpackSelectedBattlePalettes(s16 selector)\n{\n    u8 battleBackground = selector & 1;\n    u8 attacker = (selector >> 1) & 1;\n    u8 target = (selector >> 2) & 1;\n    u8 attackerPartner = (selector >> 3) & 1;\n    u8 targetPartner = (selector >> 4) & 1;\n    u8 anim1 = (selector >> 5) & 1;\n    u8 anim2 = (selector >> 6) & 1;\n\n    return GetBattlePalettesMask(battleBackground, attacker, target, attackerPartner, targetPartner, anim1, anim2);\n}\n\nstatic void AnimSimplePaletteBlend_Step(struct Sprite *sprite)\n{\n    if (!gPaletteFade.active)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimComplexPaletteBlend(struct Sprite *sprite)\n{\n    u32 selectedPalettes;\n\n    sprite->data[0] = gBattleAnimArgs[1];\n    sprite->data[1] = gBattleAnimArgs[1];\n    sprite->data[2] = gBattleAnimArgs[2];\n    sprite->data[3] = gBattleAnimArgs[3];\n    sprite->data[4] = gBattleAnimArgs[4];\n    sprite->data[5] = gBattleAnimArgs[5];\n    sprite->data[6] = gBattleAnimArgs[6];\n    sprite->data[7] = gBattleAnimArgs[0];\n    selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]);\n    BlendPalettes(selectedPalettes, gBattleAnimArgs[4], gBattleAnimArgs[3]);\n    sprite->invisible = TRUE;\n    sprite->callback = AnimComplexPaletteBlend_Step1;\n}\n\nstatic void AnimComplexPaletteBlend_Step1(struct Sprite *sprite)\n{\n    u32 selectedPalettes;\n\n    if (sprite->data[0] > 0)\n    {\n        --sprite->data[0];\n        return;\n    }\n    if (gPaletteFade.active)\n        return;\n    if (sprite->data[2] == 0)\n    {\n        sprite->callback = AnimComplexPaletteBlend_Step2;\n        return;\n    }\n    selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]);\n    if (sprite->data[1] & 0x100)\n        BlendPalettes(selectedPalettes, sprite->data[4], sprite->data[3]);\n    else\n        BlendPalettes(selectedPalettes, sprite->data[6], sprite->data[5]);\n    sprite->data[1] ^= 0x100;\n    sprite->data[0] = sprite->data[1] & 0xFF;\n    --sprite->data[2];\n}\n\nstatic void AnimComplexPaletteBlend_Step2(struct Sprite *sprite)\n{\n    u32 selectedPalettes;\n\n    if (!gPaletteFade.active)\n    {\n        selectedPalettes = UnpackSelectedBattlePalettes(sprite->data[7]);\n        BlendPalettes(selectedPalettes, 0, 0);\n        DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimCirclingSparkle(struct Sprite *sprite)\n{\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = 0;\n    sprite->data[1] = 10;\n    sprite->data[2] = 8;\n    sprite->data[3] = 40;\n    sprite->data[4] = 112;\n    sprite->data[5] = 0;\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = TranslateSpriteInGrowingCircle;\n    sprite->callback(sprite);\n}\n\n// Task data for AnimTask_BlendColorCycle, AnimTask_BlendColorCycleExclude, and AnimTask_BlendColorCycleByTag\n#define tPalSelector   data[0]  // AnimTask_BlendColorCycle\n#define tPalTag        data[0]  // AnimTask_BlendColorCycleByTag\n#define tDelay         data[1]\n#define tNumBlends     data[2]\n#define tInitialBlendY data[3]\n#define tTargetBlendY  data[4]\n#define tBlendColor    data[5]\n#define tRestoreBlend  data[8]\n#define tPalSelectorHi data[9]\n#define tPalSelectorLo data[10]\n\n// Blends mon/screen to designated color or back alternately tNumBlends times\n// Many uses of this task only set a tNumBlends of 2, which has the effect of blending to a color and back once\nvoid AnimTask_BlendColorCycle(u8 taskId)\n{\n    gTasks[taskId].tPalSelector = gBattleAnimArgs[0];\n    gTasks[taskId].tDelay = gBattleAnimArgs[1];\n    gTasks[taskId].tNumBlends = gBattleAnimArgs[2];\n    gTasks[taskId].tInitialBlendY = gBattleAnimArgs[3];\n    gTasks[taskId].tTargetBlendY = gBattleAnimArgs[4];\n    gTasks[taskId].tBlendColor = gBattleAnimArgs[5];\n    gTasks[taskId].tRestoreBlend = FALSE;\n    BlendColorCycle(taskId, 0, gTasks[taskId].tTargetBlendY);\n    gTasks[taskId].func = AnimTask_BlendColorCycleLoop;\n}\n\nstatic void BlendColorCycle(u8 taskId, u8 startBlendAmount, u8 targetBlendAmount)\n{\n    u32 selectedPalettes = UnpackSelectedBattlePalettes(gTasks[taskId].tPalSelector);\n    BeginNormalPaletteFade(\n        selectedPalettes,\n        gTasks[taskId].tDelay,\n        startBlendAmount,\n        targetBlendAmount,\n        gTasks[taskId].tBlendColor);\n\n    gTasks[taskId].tNumBlends--;\n    gTasks[taskId].tRestoreBlend ^= 1;\n}\n\nstatic void AnimTask_BlendColorCycleLoop(u8 taskId)\n{\n    u8 startBlendAmount, targetBlendAmount;\n    if (!gPaletteFade.active)\n    {\n        if (gTasks[taskId].tNumBlends > 0)\n        {\n            if (!gTasks[taskId].tRestoreBlend)\n            {\n                // Blend to designated color\n                startBlendAmount = gTasks[taskId].tInitialBlendY;\n                targetBlendAmount = gTasks[taskId].tTargetBlendY;\n            }\n            else\n            {\n                // Blend back to original color\n                startBlendAmount = gTasks[taskId].tTargetBlendY;\n                targetBlendAmount = gTasks[taskId].tInitialBlendY;\n            }\n\n            if (gTasks[taskId].tNumBlends == 1)\n                targetBlendAmount = 0;\n\n            BlendColorCycle(taskId, startBlendAmount, targetBlendAmount);\n        }\n        else\n        {\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n}\n\n// See AnimTask_BlendColorCycle. Same, but excludes Attacker and Target\nvoid AnimTask_BlendColorCycleExclude(u8 taskId)\n{\n    int battler;\n    u32 selectedPalettes = 0;\n\n    gTasks[taskId].data[0] = gBattleAnimArgs[0];\n    gTasks[taskId].tDelay = gBattleAnimArgs[1];\n    gTasks[taskId].tNumBlends = gBattleAnimArgs[2];\n    gTasks[taskId].tInitialBlendY = gBattleAnimArgs[3];\n    gTasks[taskId].tTargetBlendY = gBattleAnimArgs[4];\n    gTasks[taskId].tBlendColor = gBattleAnimArgs[5];\n    gTasks[taskId].tRestoreBlend = 0;\n\n    for (battler = 0; battler < gBattlersCount; battler++)\n    {\n        if (battler != gBattleAnimAttacker && battler != gBattleAnimTarget)\n            selectedPalettes |= 1 << (battler + 16);\n    }\n\n    if (gBattleAnimArgs[0] == 1)\n        selectedPalettes |= 0xE;\n\n    gTasks[taskId].tPalSelectorHi = selectedPalettes >> 16;\n    gTasks[taskId].tPalSelectorLo = selectedPalettes & 0xFF;\n    BlendColorCycleExclude(taskId, 0, gTasks[taskId].tTargetBlendY);\n    gTasks[taskId].func = AnimTask_BlendColorCycleExcludeLoop;\n}\n\nstatic void BlendColorCycleExclude(u8 taskId, u8 startBlendAmount, u8 targetBlendAmount)\n{\n    u32 selectedPalettes = ((u16)gTasks[taskId].tPalSelectorHi << 16) | (u16)gTasks[taskId].tPalSelectorLo;\n    BeginNormalPaletteFade(\n        selectedPalettes,\n        gTasks[taskId].tDelay,\n        startBlendAmount,\n        targetBlendAmount,\n        gTasks[taskId].tBlendColor);\n\n    gTasks[taskId].tNumBlends--;\n    gTasks[taskId].tRestoreBlend ^= 1;\n}\n\nstatic void AnimTask_BlendColorCycleExcludeLoop(u8 taskId)\n{\n    u8 startBlendAmount, targetBlendAmount;\n    if (!gPaletteFade.active)\n    {\n        if (gTasks[taskId].tNumBlends > 0)\n        {\n            if (!gTasks[taskId].tRestoreBlend)\n            {\n                // Blend to designated color\n                startBlendAmount = gTasks[taskId].tInitialBlendY;\n                targetBlendAmount = gTasks[taskId].tTargetBlendY;\n            }\n            else\n            {\n                // Blend back to original color\n                startBlendAmount = gTasks[taskId].tTargetBlendY;\n                targetBlendAmount = gTasks[taskId].tInitialBlendY;\n            }\n\n            if (gTasks[taskId].tNumBlends == 1)\n                targetBlendAmount = 0;\n\n            BlendColorCycleExclude(taskId, startBlendAmount, targetBlendAmount);\n        }\n        else\n        {\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n}\n\n// See AnimTask_BlendColorCycle. Same, but selects palette by ANIM_TAG_*\nvoid AnimTask_BlendColorCycleByTag(u8 taskId)\n{\n    gTasks[taskId].tPalTag = gBattleAnimArgs[0];\n    gTasks[taskId].tDelay = gBattleAnimArgs[1];\n    gTasks[taskId].tNumBlends = gBattleAnimArgs[2];\n    gTasks[taskId].tInitialBlendY = gBattleAnimArgs[3];\n    gTasks[taskId].tTargetBlendY = gBattleAnimArgs[4];\n    gTasks[taskId].tBlendColor = gBattleAnimArgs[5];\n    gTasks[taskId].tRestoreBlend = FALSE;\n\n    BlendColorCycleByTag(taskId, 0, gTasks[taskId].tTargetBlendY);\n    gTasks[taskId].func = AnimTask_BlendColorCycleByTagLoop;\n}\n\nstatic void BlendColorCycleByTag(u8 taskId, u8 startBlendAmount, u8 targetBlendAmount)\n{\n    u8 paletteIndex = IndexOfSpritePaletteTag(gTasks[taskId].tPalTag);\n    BeginNormalPaletteFade(\n        1 << (paletteIndex + 16),\n        gTasks[taskId].tDelay,\n        startBlendAmount,\n        targetBlendAmount,\n        gTasks[taskId].tBlendColor);\n\n    gTasks[taskId].tNumBlends--;\n    gTasks[taskId].tRestoreBlend ^= 1;\n}\n\nstatic void AnimTask_BlendColorCycleByTagLoop(u8 taskId)\n{\n    u8 startBlendAmount, targetBlendAmount;\n    if (!gPaletteFade.active)\n    {\n        if (gTasks[taskId].tNumBlends > 0)\n        {\n            if (!gTasks[taskId].tRestoreBlend)\n            {\n                // Blend to designated color\n                startBlendAmount = gTasks[taskId].tInitialBlendY;\n                targetBlendAmount = gTasks[taskId].tTargetBlendY;\n            }\n            else\n            {\n                // Blend back to original color\n                startBlendAmount = gTasks[taskId].tTargetBlendY;\n                targetBlendAmount = gTasks[taskId].tInitialBlendY;\n            }\n\n            if (gTasks[taskId].tNumBlends == 1)\n                targetBlendAmount = 0;\n\n            BlendColorCycleByTag(taskId, startBlendAmount, targetBlendAmount);\n        }\n        else\n        {\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n}\n\n#undef tPalSelector\n#undef tPalTag\n#undef tDelay\n#undef tNumBlends\n#undef tInitialBlendY\n#undef tTargetBlendY\n#undef tBlendColor\n#undef tRestoreBlend\n#undef tPalSelectorHi\n#undef tPalSelectorLo\n\n// Flashes the specified anim tag with given color. Used e.g. to flash the particles red in Hyper Beam\nvoid AnimTask_FlashAnimTagWithColor(u8 taskId)\n{\n    u8 paletteIndex;\n\n    gTasks[taskId].data[0] = gBattleAnimArgs[1];\n    gTasks[taskId].data[1] = gBattleAnimArgs[1];\n    gTasks[taskId].data[2] = gBattleAnimArgs[2];\n    gTasks[taskId].data[3] = gBattleAnimArgs[3];\n    gTasks[taskId].data[4] = gBattleAnimArgs[4];\n    gTasks[taskId].data[5] = gBattleAnimArgs[5];\n    gTasks[taskId].data[6] = gBattleAnimArgs[6];\n    gTasks[taskId].data[7] = gBattleAnimArgs[0];\n    paletteIndex = IndexOfSpritePaletteTag(gBattleAnimArgs[0]);\n    BeginNormalPaletteFade(1 << (paletteIndex + 16),\n                           0,\n                           gBattleAnimArgs[4],\n                           gBattleAnimArgs[4],\n                           gBattleAnimArgs[3]);\n    gTasks[taskId].func = AnimTask_FlashAnimTagWithColor_Step1;\n}\n\nstatic void AnimTask_FlashAnimTagWithColor_Step1(u8 taskId)\n{\n    u32 selectedPalettes;\n\n    if (gTasks[taskId].data[0] > 0)\n    {\n        --gTasks[taskId].data[0];\n        return;\n    }\n    if (gPaletteFade.active)\n        return;\n    if (gTasks[taskId].data[2] == 0)\n    {\n        gTasks[taskId].func = AnimTask_FlashAnimTagWithColor_Step2;\n        return;\n    }\n    selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16);\n    if (gTasks[taskId].data[1] & 0x100)\n        BeginNormalPaletteFade(selectedPalettes,\n                               0,\n                               gTasks[taskId].data[4],\n                               gTasks[taskId].data[4],\n                               gTasks[taskId].data[3]);\n    else\n        BeginNormalPaletteFade(selectedPalettes,\n                               0,\n                               gTasks[taskId].data[6],\n                               gTasks[taskId].data[6],\n                               gTasks[taskId].data[5]);\n    gTasks[taskId].data[1] ^= 0x100;\n    gTasks[taskId].data[0] = gTasks[taskId].data[1] & 0xFF;\n    --gTasks[taskId].data[2];\n}\n\nstatic void AnimTask_FlashAnimTagWithColor_Step2(u8 taskId)\n{\n    u32 selectedPalettes;\n\n    if (!gPaletteFade.active)\n    {\n        selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16);\n        BeginNormalPaletteFade(selectedPalettes, 0, 0, 0, RGB(0, 0, 0));\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nvoid AnimTask_InvertScreenColor(u8 taskId)\n{\n    u32 selectedPalettes = 0;\n    u8 attackerBattler = gBattleAnimAttacker;\n    u8 targetBattler = gBattleAnimTarget;\n\n    if (gBattleAnimArgs[0] & 0x100)\n        selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);\n    if (gBattleAnimArgs[1] & 0x100)\n        selectedPalettes |= (0x10000 << attackerBattler);\n    if (gBattleAnimArgs[2] & 0x100)\n        selectedPalettes |= (0x10000 << targetBattler);\n    InvertPlttBuffer(selectedPalettes);\n    DestroyAnimVisualTask(taskId);\n}\n\n// Unused\n#define tTimer         data[0]\n#define tLength        data[1]\n#define tFlagsScenery  data[2]\n#define tFlagsAttacker data[3]\n#define tFlagsTarget   data[4]\n#define tColorR        data[5]\n#define tColorG        data[6]\n#define tColorB        data[7]\nstatic void AnimTask_TintPalettes(u8 taskId)\n{\n    u8 attackerBattler;\n    u8 targetBattler;\n    u8 paletteIndex;\n    u32 selectedPalettes = 0;\n\n    if (gTasks[taskId].data[0] == 0)\n    {\n        gTasks[taskId].data[2] = gBattleAnimArgs[0];\n        gTasks[taskId].data[3] = gBattleAnimArgs[1];\n        gTasks[taskId].data[4] = gBattleAnimArgs[2];\n        gTasks[taskId].data[1] = gBattleAnimArgs[3];\n        gTasks[taskId].data[5] = gBattleAnimArgs[4];\n        gTasks[taskId].data[6] = gBattleAnimArgs[5];\n        gTasks[taskId].data[7] = gBattleAnimArgs[6];\n    }\n    ++gTasks[taskId].data[0];\n    attackerBattler = gBattleAnimAttacker;\n    targetBattler = gBattleAnimTarget;\n    if (gTasks[taskId].data[2] & 0x100)\n        selectedPalettes = 0x0000FFFF;\n    if (gTasks[taskId].data[2] & 0x1)\n    {\n        paletteIndex = IndexOfSpritePaletteTag(gSprites[gHealthboxSpriteIds[attackerBattler]].template->paletteTag);\n        selectedPalettes |= (1 << paletteIndex) << 16;\n    }\n    if (gTasks[taskId].data[3] & 0x100)\n        selectedPalettes |= (1 << attackerBattler) << 16;\n    if (gTasks[taskId].data[4] & 0x100)\n        selectedPalettes |= (1 << targetBattler) << 16;\n    TintPlttBuffer(selectedPalettes, gTasks[taskId].data[5], gTasks[taskId].data[6], gTasks[taskId].data[7]);\n    if (gTasks[taskId].data[0] == gTasks[taskId].data[1])\n    {\n        UnfadePlttBuffer(selectedPalettes);\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\n#undef tTimer\n#undef tLength\n#undef tFlagsScenery\n#undef tFlagsAttacker\n#undef tFlagsTarget\n#undef tColorR\n#undef tColorG\n#undef tColorB\n\nstatic void AnimShakeMonOrBattleTerrain(struct Sprite *sprite)\n{\n    u16 var0;\n\n    sprite->invisible = TRUE;\n    sprite->data[0] = -gBattleAnimArgs[0];\n    sprite->data[1] = gBattleAnimArgs[1];\n    sprite->data[2] = gBattleAnimArgs[1];\n    sprite->data[3] = gBattleAnimArgs[2];\n\n    switch (gBattleAnimArgs[3])\n    {\n    case 0:\n        StoreSpriteCallbackInData6(sprite, (void *)&gBattle_BG3_X);\n        break;\n    case 1:\n        StoreSpriteCallbackInData6(sprite, (void *)&gBattle_BG3_Y);\n        break;\n    case 2:\n        StoreSpriteCallbackInData6(sprite, (void *)&gSpriteCoordOffsetX);\n        break;\n    default:\n        StoreSpriteCallbackInData6(sprite, (void *)&gSpriteCoordOffsetY);\n        break;\n    }\n    sprite->data[4] = *(u16 *)(sprite->data[6] | (sprite->data[7] << 16));\n    sprite->data[5] = gBattleAnimArgs[3];\n    var0 = sprite->data[5] - 2;\n    if (var0 < 2)\n        AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled();\n    sprite->callback = AnimShakeMonOrBattleTerrain_Step;\n}\n\nstatic void AnimShakeMonOrBattleTerrain_Step(struct Sprite *sprite)\n{\n    u32 i;\n    u16 var0;\n\n    if (sprite->data[3] > 0)\n    {\n        --sprite->data[3];\n        if (sprite->data[1] > 0)\n        {\n            --sprite->data[1];\n        }\n        else\n        {\n            sprite->data[1] = sprite->data[2];\n            *(u16 *)(sprite->data[6] | (sprite->data[7] << 16)) += sprite->data[0];\n            sprite->data[0] = -sprite->data[0];\n        }\n    }\n    else\n    {\n        *(u16 *)(sprite->data[6] | (sprite->data[7] << 16)) = sprite->data[4];\n        var0 = sprite->data[5] - 2;\n        if (var0 < 2)\n            for (i = 0; i < gBattlersCount; ++i)\n                gSprites[gBattlerSpriteIds[i]].coordOffsetEnabled = FALSE;\n        DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled(void)\n{\n    gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = FALSE;\n    gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = FALSE;\n    if (gBattleAnimArgs[4] == 2)\n    {\n        gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = TRUE;\n        gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = TRUE;\n    }\n    else\n    {\n        if (gBattleAnimArgs[4] == 0)\n            gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = TRUE;\n        else\n            gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = TRUE;\n    }\n}\n\n// Task data for AnimTask_ShakeBattleTerrain\n#define tXOffset     data[0]\n#define tYOffset     data[1]\n#define tNumShakes   data[2]\n#define tTimer       data[3]\n#define tShakeDelay  data[8]\n\n// Can shake battle terrain back and forth on the X or down and back to original pos on Y (cant shake up from orig pos)\n// arg0: x offset of shake\n// arg1: y offset of shake\n// arg2: number of shakes\n// arg3: time between shakes\nvoid AnimTask_ShakeBattleTerrain(u8 taskId)\n{\n    gTasks[taskId].tXOffset = gBattleAnimArgs[0];\n    gTasks[taskId].tYOffset = gBattleAnimArgs[1];\n    gTasks[taskId].tNumShakes = gBattleAnimArgs[2];\n    gTasks[taskId].tTimer = gBattleAnimArgs[3];\n    gTasks[taskId].tShakeDelay = gBattleAnimArgs[3];\n    gBattle_BG3_X = gBattleAnimArgs[0];\n    gBattle_BG3_Y = gBattleAnimArgs[1];\n    gTasks[taskId].func = AnimTask_ShakeBattleTerrain_Step;\n    gTasks[taskId].func(taskId);\n}\n\nstatic void AnimTask_ShakeBattleTerrain_Step(u8 taskId)\n{\n    if (gTasks[taskId].tTimer == 0)\n    {\n        if (gBattle_BG3_X == gTasks[taskId].tXOffset)\n            gBattle_BG3_X = -gTasks[taskId].tXOffset;\n        else\n            gBattle_BG3_X = gTasks[taskId].tXOffset;\n\n        if (gBattle_BG3_Y == -gTasks[taskId].tYOffset)\n            gBattle_BG3_Y = 0;\n        else\n            gBattle_BG3_Y = -gTasks[taskId].tYOffset;\n\n        gTasks[taskId].tTimer = gTasks[taskId].tShakeDelay;\n        if (--gTasks[taskId].tNumShakes == 0)\n        {\n            gBattle_BG3_X = 0;\n            gBattle_BG3_Y = 0;\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n    else\n    {\n        gTasks[taskId].tTimer--;\n    }\n}\n\n#undef tXOffset\n#undef tYOffset\n#undef tNumShakes\n#undef tTimer\n#undef tShakeDelay\n\nstatic void AnimHitSplatBasic(struct Sprite *sprite)\n{\n    StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);\n    if (gBattleAnimArgs[2] == 0)\n        InitSpritePosToAnimAttacker(sprite, TRUE);\n    else\n        InitSpritePosToAnimTarget(sprite, TRUE);\n    sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Same as basic hit splat but takes a length of time to persist for (arg4)\nstatic void AnimHitSplatPersistent(struct Sprite *sprite)\n{\n    StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);\n    if (gBattleAnimArgs[2] == 0)\n        InitSpritePosToAnimAttacker(sprite, TRUE);\n    else\n        InitSpritePosToAnimTarget(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSpriteAfterTimer);\n}\n\n// For paired hit splats whose position is inverted when used by the opponent on the player.\n// Used by Twineedle and Spike Cannon\nstatic void AnimHitSplatHandleInvert(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER && !IsContest())\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n    AnimHitSplatBasic(sprite);\n}\n\nstatic void AnimHitSplatRandom(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[1] == -1)\n        gBattleAnimArgs[1] = Random() & 3;\n    StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]);\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n        InitSpritePosToAnimAttacker(sprite, FALSE);\n    else\n        InitSpritePosToAnimTarget(sprite, FALSE);\n    sprite->x2 += (Random() % 48) - 24;\n    sprite->y2 += (Random() % 24) - 12;\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n}\n\nstatic void AnimHitSplatOnMonEdge(struct Sprite *sprite)\n{\n    sprite->data[0] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n    sprite->x = gSprites[sprite->data[0]].x + gSprites[sprite->data[0]].x2;\n    sprite->y = gSprites[sprite->data[0]].y + gSprites[sprite->data[0]].y2;\n    sprite->x2 = gBattleAnimArgs[1];\n    sprite->y2 = gBattleAnimArgs[2];\n    StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = RunStoredCallbackWhenAffineAnimEnds;\n}\n\nstatic void AnimCrossImpact(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[2] == ANIM_ATTACKER)\n        InitSpritePosToAnimAttacker(sprite, TRUE);\n    else\n        InitSpritePosToAnimTarget(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[3];\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = WaitAnimForDuration;\n}\n\nstatic void AnimFlashingHitSplat(struct Sprite *sprite)\n{\n    StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);\n    if (gBattleAnimArgs[2] == ANIM_ATTACKER)\n        InitSpritePosToAnimAttacker(sprite, TRUE);\n    else\n        InitSpritePosToAnimTarget(sprite, TRUE);\n    sprite->callback = AnimFlashingHitSplat_Step;\n}\n\nstatic void AnimFlashingHitSplat_Step(struct Sprite *sprite)\n{\n    sprite->invisible ^= 1;\n    if (sprite->data[0]++ > 12)\n        DestroyAnimSprite(sprite);\n}\n"
  },
  {
    "path": "src/battle_anim_poison.c",
    "content": "#include \"global.h\"\n#include \"battle_anim.h\"\n#include \"trig.h\"\n\nstatic void AnimSludgeProjectile(struct Sprite *sprite);\nstatic void AnimAcidPoisonBubble(struct Sprite *sprite);\nstatic void AnimSludgeBombHitParticle(struct Sprite *sprite);\nstatic void AnimAcidPoisonDroplet(struct Sprite *sprite);\nstatic void AnimBubbleEffect(struct Sprite *sprite);\nstatic void AnimSludgeProjectile_Step(struct Sprite *sprite);\nstatic void AnimAcidPoisonBubble_Step(struct Sprite *sprite);\nstatic void AnimSludgeBombHitParticle_Step(struct Sprite *sprite);\nstatic void AnimBubbleEffect_Step(struct Sprite *sprite);\n\nstatic const union AnimCmd sAnim_ToxicBubble[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(24, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_ToxicBubble[] =\n{\n    sAnim_ToxicBubble,\n};\n\nconst struct SpriteTemplate gToxicBubbleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_TOXIC_BUBBLE,\n    .paletteTag = ANIM_TAG_TOXIC_BUBBLE,\n    .oam = &gOamData_AffineOff_ObjNormal_16x32,\n    .anims = sAnims_ToxicBubble,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSpriteOnMonPos,\n};\n\nstatic const union AnimCmd sAnim_PoisonProjectile[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_AcidPoisonDroplet[] =\n{\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_SludgeBombHit[] =\n{\n    ANIMCMD_FRAME(8, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_PoisonProjectile[] =\n{\n    sAnim_PoisonProjectile,\n};\n\nstatic const union AnimCmd *const sAnims_AcidPoisonDroplet[] =\n{\n    sAnim_AcidPoisonDroplet,\n};\n\nstatic const union AnimCmd *const sAnims_SludgeBombHit[] =\n{\n    sAnim_SludgeBombHit,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_PoisonProjectile[] =\n{\n    AFFINEANIMCMD_FRAME(0x160, 0x160, 0, 0),\n    AFFINEANIMCMD_FRAME(-0xA, -0xA, 0, 10),\n    AFFINEANIMCMD_FRAME(0xA, 0xA, 0, 10),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sAffineAnim_SludgeBombHit[] =\n{\n    AFFINEANIMCMD_FRAME(0xEC, 0xEC, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_PoisonProjectile[] =\n{\n    sAffineAnim_PoisonProjectile,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_SludgeBombHit[] =\n{\n    sAffineAnim_SludgeBombHit,\n};\n\nconst struct SpriteTemplate gSludgeProjectileSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_POISON_BUBBLE,\n    .paletteTag = ANIM_TAG_POISON_BUBBLE,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x16,\n    .anims = sAnims_PoisonProjectile,\n    .images = NULL,\n    .affineAnims = sAffineAnims_PoisonProjectile,\n    .callback = AnimSludgeProjectile,\n};\n\nconst struct SpriteTemplate gAcidPoisonBubbleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_POISON_BUBBLE,\n    .paletteTag = ANIM_TAG_POISON_BUBBLE,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x16,\n    .anims = sAnims_PoisonProjectile,\n    .images = NULL,\n    .affineAnims = sAffineAnims_PoisonProjectile,\n    .callback = AnimAcidPoisonBubble,\n};\n\nconst struct SpriteTemplate gSludgeBombHitParticleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_POISON_BUBBLE,\n    .paletteTag = ANIM_TAG_POISON_BUBBLE,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = sAnims_SludgeBombHit,\n    .images = NULL,\n    .affineAnims = sAffineAnims_SludgeBombHit,\n    .callback = AnimSludgeBombHitParticle,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_AcidPoisonDroplet[] =\n{\n    AFFINEANIMCMD_FRAME(-0x10, 0x10, 0, 6),\n    AFFINEANIMCMD_FRAME(0x10, -0x10, 0, 6),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nconst union AffineAnimCmd *const gAffineAnims_Droplet[] =\n{\n    sAffineAnim_AcidPoisonDroplet,\n};\n\nconst struct SpriteTemplate gAcidPoisonDropletSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_POISON_BUBBLE,\n    .paletteTag = ANIM_TAG_POISON_BUBBLE,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x16,\n    .anims = sAnims_AcidPoisonDroplet,\n    .images = NULL,\n    .affineAnims = gAffineAnims_Droplet,\n    .callback = AnimAcidPoisonDroplet,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Bubble[] =\n{\n    AFFINEANIMCMD_FRAME(0x9C, 0x9C, 0, 0),\n    AFFINEANIMCMD_FRAME(0x5, 0x5, 0, 20),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_Bubble[] =\n{\n    sAffineAnim_Bubble,\n};\n\nconst struct SpriteTemplate gPoisonBubbleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_POISON_BUBBLE,\n    .paletteTag = ANIM_TAG_POISON_BUBBLE,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = sAnims_PoisonProjectile,\n    .images = NULL,\n    .affineAnims = sAffineAnims_Bubble,\n    .callback = AnimBubbleEffect,\n};\n\nconst struct SpriteTemplate gWaterBubbleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_BUBBLES,\n    .paletteTag = ANIM_TAG_SMALL_BUBBLES,\n    .oam = &gOamData_AffineNormal_ObjBlend_16x16,\n    .anims = gAnims_WaterBubble,\n    .images = NULL,\n    .affineAnims = sAffineAnims_Bubble,\n    .callback = AnimBubbleEffect,\n};\n\nstatic void AnimSludgeProjectile(struct Sprite *sprite)\n{\n    if (!gBattleAnimArgs[3])\n        StartSpriteAnim(sprite, 2);\n    InitSpritePosToAnimAttacker(sprite, 1);\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[5] = -30;\n    InitAnimArcTranslation(sprite);\n    sprite->callback = AnimSludgeProjectile_Step;\n}\n\nstatic void AnimSludgeProjectile_Step(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimAcidPoisonBubble(struct Sprite *sprite)\n{\n    s16 l1, l2;\n\n    if (!gBattleAnimArgs[3])\n        StartSpriteAnim(sprite, 2);\n    InitSpritePosToAnimAttacker(sprite, 1);\n    SetAverageBattlerPositions(gBattleAnimTarget, 1, &l1, &l2);\n    if (GetBattlerSide(gBattleAnimAttacker))\n        gBattleAnimArgs[4] = -gBattleAnimArgs[4];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[2] = l1 + gBattleAnimArgs[4];\n    sprite->data[4] = l2 + gBattleAnimArgs[5];\n    sprite->data[5] = -30;\n    InitAnimArcTranslation(sprite);\n    sprite->callback = AnimAcidPoisonBubble_Step;\n}\n\nstatic void AnimAcidPoisonBubble_Step(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimSludgeBombHitParticle(struct Sprite *sprite)\n{\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = sprite->x + gBattleAnimArgs[0];\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = sprite->y + gBattleAnimArgs[1];\n    InitSpriteDataForLinearTranslation(sprite);\n    sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2];\n    sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2];\n    sprite->callback = AnimSludgeBombHitParticle_Step;\n}\n\nstatic void AnimSludgeBombHitParticle_Step(struct Sprite *sprite)\n{\n    TranslateSpriteLinearFixedPoint(sprite);\n    sprite->data[1] -= sprite->data[5];\n    sprite->data[2] -= sprite->data[6];\n    if (!sprite->data[0])\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimAcidPoisonDroplet(struct Sprite *sprite)\n{\n    SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = sprite->x + gBattleAnimArgs[2];\n    sprite->data[4] = sprite->y + sprite->data[0];\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Animates a bubble by rising upward, swaying side to side, and\n// enlarging the sprite. This is used as an after-effect by poison-type\n// moves, along with MOVE_BUBBLE, and MOVE_BUBBLEBEAM.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: 0 = single-target, 1 = multi-target\nstatic void AnimBubbleEffect(struct Sprite *sprite)\n{\n    if (!gBattleAnimArgs[2])\n    {\n        InitSpritePosToAnimTarget(sprite, TRUE);\n    }\n    else\n    {\n        SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y);\n\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n        sprite->x += gBattleAnimArgs[0];\n        sprite->y += gBattleAnimArgs[1];\n    }\n    sprite->callback = AnimBubbleEffect_Step;\n}\n\nstatic void AnimBubbleEffect_Step(struct Sprite *sprite)\n{\n    sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF;\n    sprite->x2 = Sin(sprite->data[0], 4);\n    sprite->data[1] += 0x30;\n    sprite->y2 = -(sprite->data[1] >> 8);\n    if (sprite->affineAnimEnded)\n        DestroyAnimSprite(sprite);\n}\n"
  },
  {
    "path": "src/battle_anim_psychic.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"scanline_effect.h\"\n#include \"trig.h\"\n#include \"constants/songs.h\"\n\nstatic void AnimDefensiveWall(struct Sprite *sprite);\nstatic void AnimWallSparkle(struct Sprite *sprite);\nstatic void AnimBentSpoon(struct Sprite *sprite);\nstatic void AnimQuestionMark(struct Sprite *sprite);\nstatic void AnimRedX(struct Sprite *sprite);\nstatic void AnimSkillSwapOrb(struct Sprite *sprite);\nstatic void AnimPsychoBoost(struct Sprite *sprite);\nstatic void AnimDefensiveWall_Step2(struct Sprite *sprite);\nstatic void AnimDefensiveWall_Step3(struct Sprite *sprite);\nstatic void AnimDefensiveWall_Step4(struct Sprite *sprite);\nstatic void AnimDefensiveWall_Step5(struct Sprite *sprite);\nstatic void AnimQuestionMark_Step1(struct Sprite *sprite);\nstatic void AnimQuestionMark_Step2(struct Sprite *sprite);\nstatic void AnimTask_MeditateStretchAttacker_Step(u8 taskId);\nstatic void AnimTask_Teleport_Step(u8 taskId);\nstatic void AnimTask_ImprisonOrbs_Step(u8 taskId);\nstatic void AnimTask_SkillSwap_Step(u8 taskId);\nstatic void AnimTask_ExtrasensoryDistortion_Step(u8 taskId);\nstatic void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId);\n\nstatic const union AffineAnimCmd sAffineAnim_PsychUpSpiral[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x2, -0x2, -10, 120),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_PsychUpSpiral[] =\n{\n    sAffineAnim_PsychUpSpiral,\n};\n\nconst struct SpriteTemplate gPsychUpSpiralSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPIRAL,\n    .paletteTag = ANIM_TAG_SPIRAL,\n    .oam = &gOamData_AffineNormal_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_PsychUpSpiral,\n    .callback = AnimSpriteOnMonPos,\n};\n\nconst struct SpriteTemplate gLightScreenWallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GREEN_LIGHT_WALL,\n    .paletteTag = ANIM_TAG_GREEN_LIGHT_WALL,\n    .oam = &gOamData_AffineOff_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDefensiveWall,\n};\n\nconst struct SpriteTemplate gReflectWallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BLUE_LIGHT_WALL,\n    .paletteTag = ANIM_TAG_BLUE_LIGHT_WALL,\n    .oam = &gOamData_AffineOff_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDefensiveWall,\n};\n\nconst struct SpriteTemplate gMirrorCoatWallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_RED_LIGHT_WALL,\n    .paletteTag = ANIM_TAG_RED_LIGHT_WALL,\n    .oam = &gOamData_AffineOff_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDefensiveWall,\n};\n\nconst struct SpriteTemplate gBarrierWallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GRAY_LIGHT_WALL,\n    .paletteTag = ANIM_TAG_GRAY_LIGHT_WALL,\n    .oam = &gOamData_AffineOff_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDefensiveWall,\n};\n\nconst struct SpriteTemplate gMagicCoatWallSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ORANGE_LIGHT_WALL,\n    .paletteTag = ANIM_TAG_ORANGE_LIGHT_WALL,\n    .oam = &gOamData_AffineOff_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimDefensiveWall,\n};\n\nstatic const union AnimCmd sAnim_ReflectSparkle[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_FRAME(64, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_ReflectSparkle[] =\n{\n    sAnim_ReflectSparkle,\n};\n\nconst struct SpriteTemplate gReflectSparkleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARKLE_4,\n    .paletteTag = ANIM_TAG_SPARKLE_4,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_ReflectSparkle,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWallSparkle,\n};\n\nstatic const union AnimCmd sAnim_SpecialScreenSparkle[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_FRAME(12, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_SpecialScreenSparkle[] =\n{\n    sAnim_SpecialScreenSparkle,\n};\n\nconst struct SpriteTemplate gSpecialScreenSparkleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARKLE_3,\n    .paletteTag = ANIM_TAG_SPARKLE_3,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sAnims_SpecialScreenSparkle,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWallSparkle,\n};\n\nconst struct SpriteTemplate gGoldRingSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GOLD_RING,\n    .paletteTag = ANIM_TAG_GOLD_RING,\n    .oam = &gOamData_AffineOff_ObjNormal_16x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = TranslateAnimSpriteToTargetMonLocation,\n};\n\nstatic const union AnimCmd sAnim_BentSpoon_0[] =\n{\n    ANIMCMD_FRAME(8, 60, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 5, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 5, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 5, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 22, .hFlip = TRUE),\n    ANIMCMD_LOOP(0),\n    ANIMCMD_FRAME(16, 5, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 5, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 5, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 5, .hFlip = TRUE),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_FRAME(8, 22, .hFlip = TRUE),\n    ANIMCMD_FRAME(24, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(40, 22, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BentSpoon_1[] =\n{\n    ANIMCMD_FRAME(8, 60),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(8, 22),\n    ANIMCMD_LOOP(0),\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_FRAME(8, 22),\n    ANIMCMD_FRAME(24, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(40, 22),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_BentSpoon[] =\n{\n    sAnim_BentSpoon_0,\n    sAnim_BentSpoon_1,\n};\n\nconst struct SpriteTemplate gBentSpoonSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BENT_SPOON,\n    .paletteTag = ANIM_TAG_BENT_SPOON,\n    .oam = &gOamData_AffineOff_ObjNormal_16x32,\n    .anims = sAnims_BentSpoon,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimBentSpoon,\n};\n\nstatic const union AnimCmd sAnim_QuestionMark[] =\n{\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(16, 6),\n    ANIMCMD_FRAME(32, 6),\n    ANIMCMD_FRAME(48, 6),\n    ANIMCMD_FRAME(64, 6),\n    ANIMCMD_FRAME(80, 6),\n    ANIMCMD_FRAME(96, 18),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_QuestionMark[] =\n{\n    sAnim_QuestionMark,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_QuestionMark[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, 4, 4),\n    AFFINEANIMCMD_FRAME(0, 0, -4, 8),\n    AFFINEANIMCMD_FRAME(0, 0, 4, 4),\n    AFFINEANIMCMD_LOOP(2),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_QuestionMark[] =\n{\n    sAffineAnim_QuestionMark,\n};\n\nconst struct SpriteTemplate gQuestionMarkSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_AMNESIA,\n    .paletteTag = ANIM_TAG_AMNESIA,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_QuestionMark,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimQuestionMark,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_MeditateStretchAttacker[] =\n{\n    AFFINEANIMCMD_FRAME(-8, 10, 0, 16),\n    AFFINEANIMCMD_FRAME(18, -18, 0, 16),\n    AFFINEANIMCMD_FRAME(-20, 16, 0, 8),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Teleport[] =\n{\n    AFFINEANIMCMD_FRAME(64, -4, 0, 20),\n    AFFINEANIMCMD_FRAME(0, 0, 0, -56),\n    AFFINEANIMCMD_END,\n};\n\nstatic const struct SpriteTemplate sImprisonOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_HOLLOW_ORB,\n    .paletteTag = ANIM_TAG_HOLLOW_ORB,\n    .oam = &gOamData_AffineOff_ObjBlend_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nconst struct SpriteTemplate gRedXSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_X_SIGN,\n    .paletteTag = ANIM_TAG_X_SIGN,\n    .oam = &gOamData_AffineOff_ObjNormal_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRedX,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_SkillSwapOrb_0[] =\n{\n    AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 8),\n    AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sAffineAnim_SkillSwapOrb_1[] =\n{\n    AFFINEANIMCMD_FRAME(0xF0, 0xF0, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 6),\n    AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8),\n    AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 2),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd sAffineAnim_SkillSwapOrb_2[] =\n{\n    AFFINEANIMCMD_FRAME(0xD0, 0xD0, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 4),\n    AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8),\n    AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 4),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd sAffineAnim_SkillSwapOrb_3[] =\n{\n    AFFINEANIMCMD_FRAME(0xB0, 0xB0, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 2),\n    AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8),\n    AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 6),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_SkillSwapOrb[] =\n{\n    sAffineAnim_SkillSwapOrb_0,\n    sAffineAnim_SkillSwapOrb_1,\n    sAffineAnim_SkillSwapOrb_2,\n    sAffineAnim_SkillSwapOrb_3,\n};\n\nstatic const struct SpriteTemplate sSkillSwapOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BLUEGREEN_ORB,\n    .paletteTag = ANIM_TAG_BLUEGREEN_ORB,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_SkillSwapOrb,\n    .callback = AnimSkillSwapOrb,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_LusterPurgeCircle[] =\n{\n    AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 0),\n    AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 120),\n    AFFINEANIMCMD_END_ALT(1),\n};\n\nstatic const union AffineAnimCmd *const gAffineAnims_LusterPurgeCircle[] =\n{\n    sAffineAnim_LusterPurgeCircle,\n};\n\nconst struct SpriteTemplate gLusterPurgeCircleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WHITE_CIRCLE_OF_LIGHT,\n    .paletteTag = ANIM_TAG_WHITE_CIRCLE_OF_LIGHT,\n    .oam = &gOamData_AffineDouble_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gAffineAnims_LusterPurgeCircle,\n    .callback = AnimSpriteOnMonPos,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_PsychoBoostOrb_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 0),\n    AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 17),\n    AFFINEANIMCMD_LOOP(0),\n    AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 10),\n    AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 10),\n    AFFINEANIMCMD_LOOP(4),\n    AFFINEANIMCMD_LOOP(0),\n    AFFINEANIMCMD_FRAME(-0x10, -0x10, 0, 5),\n    AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 5),\n    AFFINEANIMCMD_LOOP(7),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_PsychoBoostOrb_1[] =\n{\n    AFFINEANIMCMD_FRAME(-0x14, 0x18, 0, 15),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_PsychoBoostOrb[] =\n{\n    sAffineAnim_PsychoBoostOrb_0,\n    sAffineAnim_PsychoBoostOrb_1,\n};\n\nconst struct SpriteTemplate gPsychoBoostOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,\n    .oam = &gOamData_AffineDouble_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_PsychoBoostOrb,\n    .callback = AnimPsychoBoost,\n};\n\n// For the rectangular wall sprite used by Reflect, Mirror Coat, etc\nstatic void AnimDefensiveWall(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest())\n    {\n        sprite->oam.priority = 2;\n        sprite->subpriority = 200;\n    }\n    if (!IsContest())\n    {\n        u8 battlerCopy;\n        u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        u8 rank = GetBattlerSpriteBGPriorityRank(battler);\n        s32 var0 = 1;\n        bool8 toBG2 = (rank ^ var0) != 0;\n\n        if (IsBattlerSpriteVisible(battler))\n            MoveBattlerSpriteToBG(battler, toBG2);\n        battler = BATTLE_PARTNER(battlerCopy);\n        if (IsBattlerSpriteVisible(battler))\n            MoveBattlerSpriteToBG(battler, toBG2 ^ var0);\n    }\n    if (!IsContest() && IsDoubleBattle())\n    {\n        if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        {\n            sprite->x = 72;\n            sprite->y = 80;\n        }\n        else\n        {\n            sprite->x = 176;\n            sprite->y = 40;\n        }\n    }\n    else\n    {\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1];\n    }\n    if (IsContest())\n        sprite->y += 9;\n    sprite->data[0] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(gBattleAnimArgs[2]));\n    sprite->callback = AnimDefensiveWall_Step2;\n    sprite->callback(sprite);\n}\n\n// AnimDefensiveWall_Step1 is removed in FRLG from the removal of Contest handling\n\nstatic void AnimDefensiveWall_Step2(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3]));\n    if (sprite->data[3] == 13)\n        sprite->callback = AnimDefensiveWall_Step3;\n    else\n        ++sprite->data[3];\n}\n\nstatic void AnimDefensiveWall_Step3(struct Sprite *sprite)\n{\n    u16 color;\n    u16 startOffset;\n    s32 i;\n\n    if (++sprite->data[1] == 2)\n    {\n        sprite->data[1] = 0;\n        startOffset = sprite->data[0];\n        color = gPlttBufferFaded[startOffset + 8];\n        for (i = 8; i > 0; --i)\n            gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1];\n        gPlttBufferFaded[startOffset + 1] = color;\n        if (++sprite->data[2] == 16)\n            sprite->callback = AnimDefensiveWall_Step4;\n    }\n}\n\nstatic void AnimDefensiveWall_Step4(struct Sprite *sprite)\n{\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3]));\n    if (--sprite->data[3] == -1)\n    {\n        if (!IsContest())\n        {\n            u8 battlerCopy;\n            u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n\n            if (IsBattlerSpriteVisible(battler))\n                gSprites[gBattlerSpriteIds[battler]].invisible = FALSE;\n            battler = BATTLE_PARTNER(battlerCopy);\n            if (IsBattlerSpriteVisible(battler))\n                gSprites[gBattlerSpriteIds[battler]].invisible = FALSE;\n        }\n        sprite->invisible = TRUE;\n        sprite->callback = AnimDefensiveWall_Step5;\n    }\n}\n\nstatic void AnimDefensiveWall_Step5(struct Sprite *sprite)\n{\n    if (!IsContest())\n    {\n        u8 battlerCopy;\n        u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        u8 rank = GetBattlerSpriteBGPriorityRank(battler);\n        s32 var0 = 1;\n        bool8 toBG2 = (rank ^ var0) != 0;\n\n        if (IsBattlerSpriteVisible(battler))\n            ResetBattleAnimBg(toBG2);\n        battler = battlerCopy ^ 2;\n        if (IsBattlerSpriteVisible(battler))\n            ResetBattleAnimBg(toBG2 ^ var0);\n    }\n    sprite->callback = DestroyAnimSprite;\n}\n\n// Animates the sparkle that appears during Reflect or Light Screen/Mirror Coat\nstatic void AnimWallSparkle(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        bool32 ignoreOffsets = gBattleAnimArgs[3];\n        bool8 respectMonPicOffsets = FALSE;\n        if (!ignoreOffsets)\n            respectMonPicOffsets = TRUE;\n        if (!IsContest() && IsDoubleBattle())\n        {\n            if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n            {\n                sprite->x = 72 - gBattleAnimArgs[0];\n                sprite->y = gBattleAnimArgs[1] + 80;\n            }\n            else\n            {\n                sprite->x = gBattleAnimArgs[0] + 176;\n                sprite->y = gBattleAnimArgs[1] + 40;\n            }\n        }\n        else\n        {\n            if (gBattleAnimArgs[2] == 0)\n                InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets);\n            else\n                InitSpritePosToAnimTarget(sprite, respectMonPicOffsets);\n        }\n\n        ++sprite->data[0];\n    }\n    else if (sprite->animEnded || sprite->affineAnimEnded)\n    {\n        DestroySpriteAndMatrix(sprite);\n    }\n}\n\nstatic void AnimBentSpoon(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        StartSpriteAnim(sprite, 1);\n        sprite->x -= 40;\n        sprite->y += 10;\n        sprite->data[1] = -1;\n    }\n    else\n    {\n        sprite->x += 40;\n        sprite->y -= 10;\n        sprite->data[1] = 1;\n    }\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n}\n\n// Used by Amnesia\nstatic void AnimQuestionMark(struct Sprite *sprite)\n{\n    s16 x = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) /  2;\n    s16 y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / -2;\n\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)\n        x = -x;\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + x;\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + y;\n    if (sprite->y < 16)\n        sprite->y = 16;\n    StoreSpriteCallbackInData6(sprite, AnimQuestionMark_Step1);\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n}\n\nstatic void AnimQuestionMark_Step1(struct Sprite *sprite)\n{\n    sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL;\n    sprite->affineAnims = sAffineAnims_QuestionMark;\n    sprite->data[0] = 0;\n    InitSpriteAffineAnim(sprite);\n    sprite->callback = AnimQuestionMark_Step2;\n}\n\nstatic void AnimQuestionMark_Step2(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        if (sprite->affineAnimEnded)\n        {\n            FreeOamMatrix(sprite->oam.matrixNum);\n            sprite->oam.affineMode = ST_OAM_AFFINE_OFF;\n            sprite->data[1] = 18;\n            ++sprite->data[0];\n        }\n        break;\n    case 1:\n        if (--sprite->data[1] == -1)\n            DestroyAnimSprite(sprite);\n        break;\n    }\n}\n\nvoid AnimTask_MeditateStretchAttacker(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n\n    task->data[0] = spriteId;\n    PrepareAffineAnimInTaskData(task, spriteId, sAffineAnim_MeditateStretchAttacker);\n    task->func = AnimTask_MeditateStretchAttacker_Step;\n}\n\nstatic void AnimTask_MeditateStretchAttacker_Step(u8 taskId)\n{\n    if (!RunAffineAnimFromTaskData(&gTasks[taskId]))\n        DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_Teleport(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n\n    task->data[0] = spriteId;\n    task->data[1] = 0;\n    task->data[2] = 0;\n    task->data[3] = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 4 : 8;\n    PrepareAffineAnimInTaskData(task, task->data[0], sAffineAnim_Teleport);\n    task->func = AnimTask_Teleport_Step;\n}\n\nstatic void AnimTask_Teleport_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[1])\n    {\n    case 0:\n        RunAffineAnimFromTaskData(task);\n        if (++task->data[2] > 19)\n            ++task->data[1];\n        break;\n    case 1:\n        if (task->data[3] != 0)\n        {\n            gSprites[task->data[0]].y2 -= 8;\n            --task->data[3];\n        }\n        else\n        {\n            gSprites[task->data[0]].invisible = TRUE;\n            gSprites[task->data[0]].x = DISPLAY_WIDTH + 32;\n            ResetSpriteRotScale(task->data[0]);\n            DestroyAnimVisualTask(taskId);\n        }\n        break;\n    }\n}\n\nvoid AnimTask_ImprisonOrbs(u8 taskId)\n{\n    u16 var0, var1;\n    struct Task *task = &gTasks[taskId];\n\n    task->data[3] = 16;\n    task->data[4] = 0;\n    task->data[13] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    var0 = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 3;\n    var1 = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 3;\n    task->data[12] = var0 > var1 ? var0 : var1;\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));\n    task->func = AnimTask_ImprisonOrbs_Step;\n}\n\nstatic void AnimTask_ImprisonOrbs_Step(u8 taskId)\n{\n    u32 i;\n    u8 spriteId;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        if (++task->data[1] > 8)\n        {\n            task->data[1] = 0;\n            spriteId = CreateSprite(&sImprisonOrbSpriteTemplate, task->data[13], task->data[14], 0);\n            task->data[task->data[2] + 8] = spriteId;\n            if (spriteId != MAX_SPRITES)\n            {\n                switch (task->data[2])\n                {\n                case 0:\n                    gSprites[spriteId].x2 = task->data[12];\n                    gSprites[spriteId].y2 = -task->data[12];\n                    break;\n                case 1:\n                    gSprites[spriteId].x2 = -task->data[12];\n                    gSprites[spriteId].y2 = task->data[12];\n                    break;\n                case 2:\n                    gSprites[spriteId].x2 = task->data[12];\n                    gSprites[spriteId].y2 = task->data[12];\n                    break;\n                case 3:\n                    gSprites[spriteId].x2 = -task->data[12];\n                    gSprites[spriteId].y2 = -task->data[12];\n                    break;\n                }\n            }\n\n            if (++task->data[2] == 5)\n                ++task->data[0];\n        }\n        break;\n    case 1:\n        if (task->data[1] & 1)\n            --task->data[3];\n        else\n            ++task->data[4];\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4]));\n        if (++task->data[1] == 32)\n        {\n            for (i = 8; i < 13; ++i)\n                if (task->data[i] != MAX_SPRITES)\n                    DestroySprite(&gSprites[task->data[i]]);\n            ++task->data[0];\n        }\n        break;\n    case 2:\n        ++task->data[0];\n        break;\n    case 3:\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void AnimRedX_Step(struct Sprite *sprite)\n{\n    if (sprite->data[1] > sprite->data[0] - 10)\n        sprite->invisible = sprite->data[1] & 1;\n    if (sprite->data[1] == sprite->data[0])\n        DestroyAnimSprite(sprite);\n    ++sprite->data[1];\n}\n\nstatic void AnimRedX(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[0] == 0)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    }\n    sprite->data[0] = gBattleAnimArgs[1];\n    sprite->callback = AnimRedX_Step;\n}\n\nvoid AnimTask_SkillSwap(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (IsContest())\n    {\n        if (gBattleAnimArgs[0] == ANIM_TARGET)\n        {\n            task->data[10] = -10;\n            task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8;\n            task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) + 8;\n            task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_RIGHT) - 8;\n            task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) + 8;\n        }\n        else\n        {\n            task->data[10] = 10;\n            task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_LEFT) + 8;\n            task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM) - 8;\n            task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_LEFT) + 8;\n            task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_BOTTOM) - 8;\n        }\n    }\n    else\n    {\n        if (gBattleAnimArgs[0] == 1)\n        {\n            task->data[10] = -10;\n            task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_LEFT) + 8;\n            task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) + 8;\n            task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_LEFT) + 8;\n            task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) + 8;\n        }\n        else\n        {\n            task->data[10] = 10;\n            task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_RIGHT) - 8;\n            task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM) - 8;\n            task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8;\n            task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_BOTTOM) - 8;\n        }\n    }\n    task->data[1] = 6;\n    task->func = AnimTask_SkillSwap_Step;\n}\n\nstatic void AnimTask_SkillSwap_Step(u8 taskId)\n{\n    u8 spriteId;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        if (++task->data[1] > 6)\n        {\n            task->data[1] = 0;\n            spriteId = CreateSprite(&sSkillSwapOrbSpriteTemplate, task->data[11], task->data[12], 0);\n            if (spriteId != 64)\n            {\n                gSprites[spriteId].data[0] = 16;\n                gSprites[spriteId].data[2] = task->data[13];\n                gSprites[spriteId].data[4] = task->data[14];\n                gSprites[spriteId].data[5] = task->data[10];\n                InitAnimArcTranslation(&gSprites[spriteId]);\n                StartSpriteAffineAnim(&gSprites[spriteId], task->data[2] & 3);\n            }\n\n            if (++task->data[2] == 12)\n                ++task->data[0];\n        }\n        break;\n    case 1:\n        if (++task->data[1] > 17)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void AnimSkillSwapOrb(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n    {\n        FreeOamMatrix(sprite->oam.matrixNum);\n        DestroySprite(sprite);\n    }\n}\n\n// The scanline effect that distorts the target during Extrasensory by segmenting the mon vertically and shifting the slices\n// arg0: Stage. Stage 0 is a slight right distortion, 1 is a medium left distortion, and 2 is a severe right distortion\nvoid AnimTask_ExtrasensoryDistortion(u8 taskId)\n{\n    s32 i;\n    u8 yOffset;\n    struct ScanlineEffectParams scanlineParams;\n    struct Task *task = &gTasks[taskId];\n    \n    yOffset = GetBattlerYCoordWithElevation(gBattleAnimTarget);\n    task->data[14] = yOffset - 32;\n    switch (gBattleAnimArgs[0])\n    {\n    case 0:\n        task->data[11] = 2;\n        task->data[12] = 5;\n        task->data[13] = 64;\n        task->data[15] = yOffset + 32;\n        break;\n    case 1:\n        task->data[11] = 2;\n        task->data[12] = 5;\n        task->data[13] = 192;\n        task->data[15] = yOffset + 32;\n        break;\n    case 2:\n        task->data[11] = 4;\n        task->data[12] = 4;\n        task->data[13] = 0;\n        task->data[15] = yOffset + 32;\n        break;\n    }\n    if (task->data[14] < 0)\n        task->data[14] = 0;\n    if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1)\n    {\n        task->data[10] = gBattle_BG1_X;\n        scanlineParams.dmaDest = &REG_BG1HOFS;\n    }\n    else\n    {\n        task->data[10] = gBattle_BG2_X;\n        scanlineParams.dmaDest = &REG_BG2HOFS;\n    }\n    for (i = task->data[14]; i <= task->data[14] + 64; ++i)\n    {\n        gScanlineEffectRegBuffers[0][i] = task->data[10];\n        gScanlineEffectRegBuffers[1][i] = task->data[10];\n    }\n    scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;\n    scanlineParams.initState = 1;\n    scanlineParams.unused9 = 0;\n    ScanlineEffect_SetParams(scanlineParams);\n    task->func = AnimTask_ExtrasensoryDistortion_Step;\n}\n\nstatic void AnimTask_ExtrasensoryDistortion_Step(u8 taskId)\n{\n    s16 sineIndex, i;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        sineIndex = task->data[13];\n        for (i = task->data[14]; i <= task->data[15]; ++i)\n        {\n            s16 var2 = (gSineTable[sineIndex] >> task->data[12]);\n\n            if (var2 > 0)\n                var2 += (task->data[1] & 3);\n            else if (var2 < 0)\n                var2 -= (task->data[1] & 3);\n            gScanlineEffectRegBuffers[0][i] = task->data[10] + var2;\n            gScanlineEffectRegBuffers[1][i] = task->data[10] + var2;\n            sineIndex += task->data[11];\n        }\n        if (++task->data[1] > 23)\n            ++task->data[0];\n        break;\n    case 1:\n        gScanlineEffect.state = 3;\n        ++task->data[0];\n        break;\n    case 2:\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Creates a cloned transparent sprite of the battler that grows and then shrinks back to original size. Used by Extrasensory\n// arg0: battler\nvoid AnimTask_TransparentCloneGrowAndShrink(u8 taskId)\n{\n    s16 spriteId;\n    s16 matrixNum;\n    struct Task *task = &gTasks[taskId];\n    \n    matrixNum = AllocOamMatrix();\n    if (matrixNum == 0xFF)\n    {\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n    spriteId = CloneBattlerSpriteWithBlend(gBattleAnimArgs[0]);\n    if (spriteId < 0)\n    {\n        FreeOamMatrix(matrixNum);\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n    gSprites[spriteId].callback = SpriteCallbackDummy;\n    gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;\n    gSprites[spriteId].oam.matrixNum = matrixNum;\n    gSprites[spriteId].affineAnimPaused = TRUE;\n    ++gSprites[spriteId].subpriority;\n    SetSpriteRotScale(spriteId, 256, 256, 0);\n    CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode);\n    task->data[13] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);\n    task->data[14] = matrixNum;\n    task->data[15] = spriteId;\n    task->func = AnimTask_TransparentCloneGrowAndShrink_Step;\n}\n\nstatic void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        task->data[1] += 4;\n        task->data[2] = 256 - (gSineTable[task->data[1]] >> 1);\n        SetSpriteRotScale(task->data[15], task->data[2], task->data[2], 0);\n        SetBattlerSpriteYOffsetFromOtherYScale(task->data[15], task->data[13]);\n        if (task->data[1] == 48)\n            ++task->data[0];\n        break;\n    case 1:\n        task->data[1] -= 4;\n        task->data[2] = 256 - (gSineTable[task->data[1]] >> 1);\n        SetSpriteRotScale(task->data[15], task->data[2], task->data[2], 0);\n        SetBattlerSpriteYOffsetFromOtherYScale(task->data[15], task->data[13]);\n        if (task->data[1] == 0)\n            ++task->data[0];\n        break;\n    case 2:\n        DestroySpriteWithActiveSheet(&gSprites[task->data[15]]);\n        ++task->data[0];\n        break;\n    case 3:\n        FreeOamMatrix(task->data[14]);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void AnimPsychoBoost(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n        if (IsContest())\n            sprite->y += 12;\n        sprite->data[1] = 8;\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1]));\n        ++sprite->data[0];\n        break;\n    case 1:\n        if (sprite->affineAnimEnded)\n        {\n            PlaySE12WithPanning(SE_M_TELEPORT, BattleAnimAdjustPanning(-64));\n            ChangeSpriteAffineAnim(sprite, 1);\n            ++sprite->data[0];\n        }\n        break;\n    case 2:\n        if (sprite->data[2]++ > 1)\n        {\n            sprite->data[2] = 0;\n            --sprite->data[1];\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1]));\n            if (sprite->data[1] == 0)\n            {\n                ++sprite->data[0];\n                sprite->invisible = TRUE;\n            }\n        }\n        sprite->data[3] += 0x380;\n        sprite->y2 -= sprite->data[3] >> 8;\n        sprite->data[3] &= 0xFF;\n        break;\n    case 3:\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        DestroyAnimSprite(sprite);\n        break;\n    }\n}\n"
  },
  {
    "path": "src/battle_anim_rock.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"graphics.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"constants/songs.h\"\n\nstatic void AnimFallingRock(struct Sprite *sprite);\nstatic void AnimRockFragment(struct Sprite *sprite);\nstatic void AnimFlyingSandCrescent(struct Sprite *sprite);\nstatic void AnimRaiseSprite(struct Sprite *sprite);\nstatic void AnimTask_Rollout_Step(u8 taskId);\nstatic void AnimRolloutParticle(struct Sprite *sprite);\nstatic void AnimRockTomb(struct Sprite *sprite);\nstatic void AnimRockBlastRock(struct Sprite *sprite);\nstatic void AnimRockScatter(struct Sprite *sprite);\nstatic void AnimParticleInVortex(struct Sprite *sprite);\nstatic void AnimFallingRock_Step(struct Sprite *sprite);\nstatic void AnimParticleInVortex_Step(struct Sprite *sprite);\nstatic void AnimTask_LoadSandstormBackground_Step(u8 taskId);\nstatic void CreateRolloutDirtSprite(struct Task *task);\nstatic u8 GetRolloutCounter(void);\nstatic void AnimRockTomb_Step(struct Sprite *sprite);\nstatic void AnimRockScatter_Step(struct Sprite *sprite);\n\nstatic const union AnimCmd sAnim_FlyingRock_0[] =\n{\n    ANIMCMD_FRAME(32, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_FlyingRock_1[] =\n{\n    ANIMCMD_FRAME(48, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_FlyingRock_2[] =\n{\n    ANIMCMD_FRAME(64, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_FlyingRock[] =\n{\n    sAnim_FlyingRock_0,\n    sAnim_FlyingRock_1,\n    sAnim_FlyingRock_2,\n};\n\nconst struct SpriteTemplate gFallingRockSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROCKS,\n    .paletteTag = ANIM_TAG_ROCKS,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_FlyingRock,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFallingRock,\n};\n\nconst struct SpriteTemplate gRockFragmentSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROCKS,\n    .paletteTag = ANIM_TAG_ROCKS,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_FlyingRock,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRockFragment,\n};\n\nconst struct SpriteTemplate gSwirlingDirtSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUD_SAND,\n    .paletteTag = ANIM_TAG_MUD_SAND,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimParticleInVortex,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Whirlpool[] =\n{\n    AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0),\n    AFFINEANIMCMD_FRAME(0x2, -0x3, 0, 5),\n    AFFINEANIMCMD_FRAME(-0x2, 0x3, 0, 5),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_Whirlpool[] =\n{\n    sAffineAnim_Whirlpool,\n};\n\nconst struct SpriteTemplate gWhirlpoolSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WATER_ORB,\n    .paletteTag = ANIM_TAG_WATER_ORB,\n    .oam = &gOamData_AffineNormal_ObjBlend_16x16,\n    .anims = gAnims_WaterMudOrb,\n    .images = NULL,\n    .affineAnims = sAffineAnims_Whirlpool,\n    .callback = AnimParticleInVortex,\n};\n\nconst struct SpriteTemplate gFireSpinSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gAnims_BasicFire,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimParticleInVortex,\n};\n\nconst struct SpriteTemplate gFlyingSandCrescentSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_FLYING_DIRT,\n    .paletteTag = ANIM_TAG_FLYING_DIRT,\n    .oam = &gOamData_AffineOff_ObjNormal_32x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFlyingSandCrescent,\n};\n\nstatic const struct Subsprite sFlyingSandSubsprites[] =\n{\n    {\n        .x = -16,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x16),\n        .size = SPRITE_SIZE(32x16),\n        .tileOffset = 0,\n        .priority = 1,\n    },\n    {   \n        .x = 16,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x16),\n        .size = SPRITE_SIZE(32x16),\n        .tileOffset = 8,\n        .priority = 1,\n    },\n};\n\nstatic const struct SubspriteTable sFlyingSandSubspriteTable[] =\n{\n    { NELEMS(sFlyingSandSubsprites), sFlyingSandSubsprites },\n};\n\nstatic const union AnimCmd sAnim_Rock_Biggest[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Rock_Bigger[] =\n{\n    ANIMCMD_FRAME(16, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Rock_Big[] =\n{\n    ANIMCMD_FRAME(32, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Rock_Small[] =\n{\n    ANIMCMD_FRAME(48, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Rock_Smaller[] =\n{\n    ANIMCMD_FRAME(64, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Rock_Smallest[] =\n{\n    ANIMCMD_FRAME(80, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_BasicRock[] =\n{\n    sAnim_Rock_Biggest,\n    sAnim_Rock_Bigger,\n    sAnim_Rock_Big,\n    sAnim_Rock_Small,\n    sAnim_Rock_Smaller,\n    sAnim_Rock_Smallest,\n};\n\nconst struct SpriteTemplate gAncientPowerRockSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROCKS,\n    .paletteTag = ANIM_TAG_ROCKS,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_BasicRock,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRaiseSprite,\n};\n\nconst struct SpriteTemplate gRolloutMudSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MUD_SAND,\n    .paletteTag = ANIM_TAG_MUD_SAND,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRolloutParticle,\n};\n\nconst struct SpriteTemplate gRolloutRockSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROCKS,\n    .paletteTag = ANIM_TAG_ROCKS,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRolloutParticle,\n};\n\nconst struct SpriteTemplate gRockTombRockSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROCKS,\n    .paletteTag = ANIM_TAG_ROCKS,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_BasicRock,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRockTomb,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_BasicRock_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -5, 5),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sAffineAnim_BasicRock_1[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 5, 5),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_BasicRock[] =\n{\n    sAffineAnim_BasicRock_0,\n    sAffineAnim_BasicRock_1,\n};\n\nconst struct SpriteTemplate gRockBlastRockSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROCKS,\n    .paletteTag = ANIM_TAG_ROCKS,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sAnims_BasicRock,\n    .images = NULL,\n    .affineAnims = sAffineAnims_BasicRock,\n    .callback = AnimRockBlastRock,\n};\n\nconst struct SpriteTemplate gRockScatterSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROCKS,\n    .paletteTag = ANIM_TAG_ROCKS,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = sAnims_BasicRock,\n    .images = NULL,\n    .affineAnims = sAffineAnims_BasicRock,\n    .callback = AnimRockScatter,\n};\n\nconst struct SpriteTemplate gTwisterRockSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROCKS,\n    .paletteTag = ANIM_TAG_ROCKS,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = &sAnims_BasicRock[4],\n    .images = NULL,\n    .affineAnims = sAffineAnims_BasicRock,\n    .callback = AnimMoveTwisterParticle,\n};\n\nconst struct SpriteTemplate gWeatherBallRockDownSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ROCKS,\n    .paletteTag = ANIM_TAG_ROCKS,\n    .oam = &gOamData_AffineNormal_ObjNormal_32x32,\n    .anims = &sAnims_BasicRock[2],\n    .images = NULL,\n    .affineAnims = sAffineAnims_BasicRock,\n    .callback = AnimWeatherBallDown,\n};\n\nstatic void AnimFallingRock(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[3] != 0)\n        SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->x, &sprite->y);\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += 14;\n    StartSpriteAnim(sprite, gBattleAnimArgs[1]);\n    AnimateSprite(sprite);\n    sprite->data[0] = 0;\n    sprite->data[1] = 0;\n    sprite->data[2] = 4;\n    sprite->data[3] = 16;\n    sprite->data[4] = -70;\n    sprite->data[5] = gBattleAnimArgs[2];\n    StoreSpriteCallbackInData6(sprite, AnimFallingRock_Step);\n    sprite->callback = TranslateSpriteInEllipse;\n    sprite->callback(sprite);\n}\n\nstatic void AnimFallingRock_Step(struct Sprite *sprite)\n{\n    sprite->x += sprite->data[5];\n    sprite->data[0] = 192;\n    sprite->data[1] = sprite->data[5];\n    sprite->data[2] = 4;\n    sprite->data[3] = 32;\n    sprite->data[4] = -24;\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n    sprite->callback = TranslateSpriteInEllipse;\n    sprite->callback(sprite);\n}\n\n// Animates the rock particles that are shown on the impact for Rock Blast / Rock Smash\nstatic void AnimRockFragment(struct Sprite *sprite)\n{\n    StartSpriteAnim(sprite, gBattleAnimArgs[5]);\n    AnimateSprite(sprite);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        sprite->x -= gBattleAnimArgs[0];\n    else\n        sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = sprite->x + gBattleAnimArgs[2];\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = sprite->y + gBattleAnimArgs[3];\n    InitSpriteDataForLinearTranslation(sprite);\n    sprite->data[3] = 0;\n    sprite->data[4] = 0;\n    sprite->callback = TranslateSpriteLinearFixedPoint;\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n}\n\n// Swirls particle in vortex. Used for moves like Fire Spin or Sand Tomb\nstatic void AnimParticleInVortex(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[6] == 0)\n        InitSpritePosToAnimAttacker(sprite, 0);\n    else\n        InitSpritePosToAnimTarget(sprite, FALSE);\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->data[1] = gBattleAnimArgs[2];\n    sprite->data[2] = gBattleAnimArgs[4];\n    sprite->data[3] = gBattleAnimArgs[5];\n    sprite->callback = AnimParticleInVortex_Step;\n}\n\nstatic void AnimParticleInVortex_Step(struct Sprite *sprite)\n{\n    sprite->data[4] += sprite->data[1];\n    sprite->y2 = -(sprite->data[4] >> 8);\n    sprite->x2 = Sin(sprite->data[5], sprite->data[3]);\n    sprite->data[5] = (sprite->data[5] + sprite->data[2]) & 0xFF;\n    if (--sprite->data[0] == -1)\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\nvoid AnimTask_LoadSandstormBackground(u8 taskId)\n{\n    s32 var0;\n    struct BattleAnimBgData animBg;\n\n    var0 = 0;\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n    SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);\n    if (!IsContest())\n        SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);\n    SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);\n    GetBattleAnimBg1Data(&animBg);\n    AnimLoadCompressedBgTilemap(animBg.bgId, gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap);\n    AnimLoadCompressedBgGfx(animBg.bgId, gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet, animBg.tilesOffset);\n    LoadCompressedPalette(gBattleAnimSpritePal_FlyingDirt, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n    if (IsContest())\n        RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0);\n    if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        var0 = 1;\n    gTasks[taskId].data[0] = var0;\n    gTasks[taskId].func = AnimTask_LoadSandstormBackground_Step;\n}\n\nstatic void AnimTask_LoadSandstormBackground_Step(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n\n    if (gTasks[taskId].data[0] == 0)\n        gBattle_BG1_X += -6;\n    else\n        gBattle_BG1_X += 6;\n    gBattle_BG1_Y += -1;\n    switch (gTasks[taskId].data[12])\n    {\n    case 0:\n        if (++gTasks[taskId].data[10] == 4)\n        {\n            gTasks[taskId].data[10] = 0;\n            ++gTasks[taskId].data[11];\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));\n            if (gTasks[taskId].data[11] == 7)\n            {\n                ++gTasks[taskId].data[12];\n                gTasks[taskId].data[11] = 0;\n            }\n        }\n        break;\n    case 1:\n        if (++gTasks[taskId].data[11] == 101)\n        {\n            gTasks[taskId].data[11] = 7;\n            ++gTasks[taskId].data[12];\n        }\n        break;\n    case 2:\n        if (++gTasks[taskId].data[10] == 4)\n        {\n            gTasks[taskId].data[10] = 0;\n            --gTasks[taskId].data[11];\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));\n            if (gTasks[taskId].data[11] == 0)\n            {\n                ++gTasks[taskId].data[12];\n                gTasks[taskId].data[11] = 0;\n            }\n        }\n        break;\n    case 3:\n        GetBattleAnimBg1Data(&animBg);\n        InitBattleAnimBg(animBg.bgId);\n        ++gTasks[taskId].data[12];\n        break;\n    case 4:\n        if (!IsContest())\n            SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);\n        gBattle_BG1_X = 0;\n        gBattle_BG1_Y = 0;\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Animates the sprites that fly diagonally across the screen\n// in Sandstorm and Heat Wave.\n// arg 0: initial y pixel offset\n// arg 1: projectile speed\n// arg 2: y pixel drop\n// arg 3: ??? unknown (possibly a color bit)\nstatic void AnimFlyingSandCrescent(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        if (gBattleAnimArgs[3] != 0 && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        {\n            sprite->x = 304;\n            gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n            sprite->data[5] = 1;\n            sprite->oam.matrixNum = ST_OAM_HFLIP;\n        }\n        else\n        {\n            sprite->x = -64;\n        }\n        sprite->y = gBattleAnimArgs[0];\n        SetSubspriteTables(sprite, sFlyingSandSubspriteTable);\n        sprite->data[1] = gBattleAnimArgs[1];\n        sprite->data[2] = gBattleAnimArgs[2];\n        ++sprite->data[0];\n    }\n    else\n    {\n        sprite->data[3] += sprite->data[1];\n        sprite->data[4] += sprite->data[2];\n        sprite->x2 += (sprite->data[3] >> 8);\n        sprite->y2 += (sprite->data[4] >> 8);\n        sprite->data[3] &= 0xFF;\n        sprite->data[4] &= 0xFF;\n        if (sprite->data[5] == 0)\n        {\n            if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 32)\n            {\n                sprite->callback = DestroyAnimSprite;\n            }\n        }\n        else if (sprite->x + sprite->x2 < -32)\n        {\n            sprite->callback = DestroyAnimSprite;\n        }\n    }\n}\n\n// Animates the rising rocks in Ancient Power.\n// arg 0: initial x pixel offset\n// arg 1: initial y pixel offset\n// arg 2: terminal y offset\n// arg 3: duration\n// arg 4: sprite size [1,5]\nstatic void AnimRaiseSprite(struct Sprite *sprite)\n{\n    StartSpriteAnim(sprite, gBattleAnimArgs[4]);\n    InitSpritePosToAnimAttacker(sprite, 0);\n    sprite->data[0] = gBattleAnimArgs[3];\n    sprite->data[2] = sprite->x;\n    sprite->data[4] = sprite->y + gBattleAnimArgs[2];\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nvoid AnimTask_Rollout(u8 taskId)\n{\n    u16 var0, var1, var2, var3;\n    u8 rolloutCounter;\n    s32 var5;\n    s16 pan1, pan2;\n    struct Task *task;\n\n    task = &gTasks[taskId];\n    var0 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    var1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 24;\n    var2 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    var3 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 24;\n    if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget)\n        var3 = var1;\n    rolloutCounter = GetRolloutCounter();\n    if (rolloutCounter == 1)\n        task->data[8] = 32;\n    else\n        task->data[8] = 48 - (rolloutCounter * 8);\n    task->data[0] = 0;\n    task->data[11] = 0;\n    task->data[9] = 0;\n    task->data[12] = 1;\n    var5 = task->data[8];\n    if (var5 < 0)\n        var5 += 7;\n    task->data[10] = (var5 >> 3) - 1;\n    task->data[2] = var0 * 8;\n    task->data[3] = var1 * 8;\n    task->data[4] = ((var2 - var0) * 8) / task->data[8];\n    task->data[5] = ((var3 - var1) * 8) / task->data[8];\n    task->data[6] = 0;\n    task->data[7] = 0;\n    pan1 = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);\n    pan2 = BattleAnimAdjustPanning(SOUND_PAN_TARGET);\n    task->data[13] = pan1;\n    task->data[14] = (pan2 - pan1) / task->data[8];\n    task->data[1] = rolloutCounter;\n    task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    task->func = AnimTask_Rollout_Step;\n}\n\nstatic void AnimTask_Rollout_Step(u8 taskId)\n{\n    struct Task *task;\n\n    task = &gTasks[taskId];\n    switch (task->data[0])\n    {\n    case 0:\n        task->data[6] -= task->data[4];\n        task->data[7] -= task->data[5];\n        gSprites[task->data[15]].x2 = task->data[6] >> 3;\n        gSprites[task->data[15]].y2 = task->data[7] >> 3;\n        if (++task->data[9] == 10)\n        {\n            task->data[11] = 20;\n            ++task->data[0];\n        }\n        PlaySE12WithPanning(SE_M_HEADBUTT, task->data[13]);\n        break;\n    case 1:\n        if (--task->data[11] == 0)\n            ++task->data[0];\n        break;\n    case 2:\n        if (--task->data[9] != 0)\n        {\n            task->data[6] += task->data[4];\n            task->data[7] += task->data[5];\n        }\n        else\n        {\n            task->data[6] = 0;\n            task->data[7] = 0;\n            ++task->data[0];\n        }\n        gSprites[task->data[15]].x2 = task->data[6] >> 3;\n        gSprites[task->data[15]].y2 = task->data[7] >> 3;\n        break;\n    case 3:\n        task->data[2] += task->data[4];\n        task->data[3] += task->data[5];\n        if (++task->data[9] >= task->data[10])\n        {\n            task->data[9] = 0;\n            CreateRolloutDirtSprite(task);\n            task->data[13] += task->data[14];\n            PlaySE12WithPanning(SE_M_DIG, task->data[13]);\n        }\n        if (--task->data[8] == 0)\n        {\n            ++task->data[0];\n        }\n        break;\n    case 4:\n        if (task->data[11] == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void CreateRolloutDirtSprite(struct Task *task)\n{\n    const struct SpriteTemplate *spriteTemplate;\n    s32 tileOffset;\n    u16 x, y;\n    u8 spriteId;\n\n    switch (task->data[1])\n    {\n    case 1:\n        spriteTemplate = &gRolloutMudSpriteTemplate;\n        tileOffset = 0;\n        break;\n    case 2:\n    case 3:\n        spriteTemplate = &gRolloutRockSpriteTemplate;\n        tileOffset = 80;\n        break;\n    case 4:\n        spriteTemplate = &gRolloutRockSpriteTemplate;\n        tileOffset = 64;\n        break;\n    case 5:\n        spriteTemplate = &gRolloutRockSpriteTemplate;\n        tileOffset = 48;\n        break;\n    default:\n        return;\n    }\n    x = task->data[2] >> 3;\n    y = task->data[3] >> 3;\n    x += (task->data[12] * 4);\n    spriteId = CreateSprite(spriteTemplate, x, y, 35);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].data[0] = 18;\n        gSprites[spriteId].data[2] = ((task->data[12] * 20) + x) + (task->data[1] * 3);\n        gSprites[spriteId].data[4] = y;\n        gSprites[spriteId].data[5] = -16 - (task->data[1] * 2);\n        gSprites[spriteId].oam.tileNum += tileOffset;\n        InitAnimArcTranslation(&gSprites[spriteId]);\n        ++task->data[11];\n    }\n    task->data[12] *= -1;\n}\n\nstatic void AnimRolloutParticle(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n    {\n        u8 taskId = FindTaskIdByFunc(AnimTask_Rollout_Step);\n\n        if (taskId != TASK_NONE)\n            --gTasks[taskId].data[11];\n        DestroySprite(sprite);\n    }\n}\n\nstatic u8 GetRolloutCounter(void)\n{\n    u8 retVal = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer;\n    u8 var0 = retVal - 1;\n\n    if (var0 > 4)\n        retVal = 1;\n    return retVal;\n}\n\nstatic void AnimRockTomb(struct Sprite *sprite)\n{\n    StartSpriteAnim(sprite, gBattleAnimArgs[4]);\n    sprite->x2 = gBattleAnimArgs[0];\n    sprite->data[2] = gBattleAnimArgs[1];\n    sprite->data[3] -= gBattleAnimArgs[2];\n    sprite->data[0] = 3;\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->callback = AnimRockTomb_Step;\n    sprite->invisible = TRUE;\n}\n\nstatic void AnimRockTomb_Step(struct Sprite *sprite)\n{\n    sprite->invisible = FALSE;\n    if (sprite->data[3] != 0)\n    {\n        sprite->y2 = sprite->data[2] + sprite->data[3];\n        sprite->data[3] += sprite->data[0];\n        ++sprite->data[0];\n        if (sprite->data[3] > 0)\n        {\n            sprite->data[3] = 0;\n        }\n    }\n    else if (--sprite->data[1] == 0)\n    {\n        DestroyAnimSprite(sprite);\n    }\n}\n\nstatic void AnimRockBlastRock(struct Sprite *sprite)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)\n        StartSpriteAffineAnim(sprite, 1);\n    TranslateAnimSpriteToTargetMonLocation(sprite);\n}\n\nstatic void AnimRockScatter(struct Sprite *sprite)\n{\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);\n    sprite->x += gBattleAnimArgs[0];\n    sprite->y += gBattleAnimArgs[1];\n    sprite->data[1] = gBattleAnimArgs[0];\n    sprite->data[2] = gBattleAnimArgs[1];\n    sprite->data[5] = gBattleAnimArgs[2];\n    StartSpriteAnim(sprite, gBattleAnimArgs[3]);\n    sprite->callback = AnimRockScatter_Step;\n}\n\nstatic void AnimRockScatter_Step(struct Sprite *sprite)\n{\n    sprite->data[0] += 8;\n    sprite->data[3] += sprite->data[1];\n    sprite->data[4] += sprite->data[2];\n    sprite->x2 += sprite->data[3] / 40;\n    sprite->y2 -= Sin(sprite->data[0], sprite->data[5]);\n    if (sprite->data[0] > 140)\n        DestroyAnimSprite(sprite);\n}\n\nvoid AnimTask_GetSeismicTossDamageLevel(u8 taskId)\n{\n    if (gAnimMoveDmg < 33)\n        gBattleAnimArgs[ARG_RET_ID] = 0;\n    if ((u32)gAnimMoveDmg - 33 < 33)\n        gBattleAnimArgs[ARG_RET_ID] = 1;\n    if (gAnimMoveDmg > 65)\n        gBattleAnimArgs[ARG_RET_ID] = 2;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_MoveSeismicTossBg(u8 taskId)\n{\n    if (gTasks[taskId].data[0] == 0)\n    {\n        ToggleBg3Mode(0);\n        gTasks[taskId].data[1] = 200;\n    }\n    gBattle_BG3_Y += gTasks[taskId].data[1] / 10;\n    gTasks[taskId].data[1] -= 3;\n    if (gTasks[taskId].data[0] == 120)\n    {\n        ToggleBg3Mode(1);\n        DestroyAnimVisualTask(taskId);\n    }\n    ++gTasks[taskId].data[0];\n}\n\nvoid AnimTask_SeismicTossBgAccelerateDownAtEnd(u8 taskId)\n{\n    if (gTasks[taskId].data[0] == 0)\n    {\n        ToggleBg3Mode(0);\n        ++gTasks[taskId].data[0];\n        gTasks[taskId].data[2] = gBattle_BG3_Y;\n    }\n    gTasks[taskId].data[1] += 80;\n    gTasks[taskId].data[1] &= 0xFF;\n    gBattle_BG3_Y = gTasks[taskId].data[2] + Cos(4, gTasks[taskId].data[1]);\n    if (gBattleAnimArgs[7] == 0xFFF)\n    {\n        gBattle_BG3_Y = 0;\n        ToggleBg3Mode(1);\n        DestroyAnimVisualTask(taskId);\n    }\n}\n"
  },
  {
    "path": "src/battle_anim_smokescreen.c",
    "content": "#include \"global.h\"\n#include \"battle_gfx_sfx_util.h\"\n#include \"decompress.h\"\n#include \"graphics.h\"\n#include \"util.h\"\n\n#define TAG_SMOKESCREEN 55019\n\n#define PALTAG_SHADOW 55039\n#define GFXTAG_SHADOW 55129\n\nstatic void SpriteCB_SmokescreenImpactMain(struct Sprite *);\nstatic void SpriteCB_SmokescreenImpact(struct Sprite *);\n\nstatic const struct CompressedSpriteSheet sSmokescreenImpactSpriteSheet =\n{\n    .data = gSmokescreenImpactTiles, .size = 0x180, .tag = TAG_SMOKESCREEN\n};\n\nstatic const struct CompressedSpritePalette sSmokescreenImpactSpritePalette =\n{\n    .data = gSmokescreenImpactPalette, .tag = TAG_SMOKESCREEN\n};\n\nstatic const struct OamData sOamData_SmokescreenImpact =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const union AnimCmd sAnim_SmokescreenImpact_0[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(8, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_SmokescreenImpact_1[] =\n{\n    ANIMCMD_FRAME(0, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(4, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 4, .hFlip = TRUE),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_SmokescreenImpact_2[] =\n{\n    ANIMCMD_FRAME(0, 4, .vFlip = TRUE),\n    ANIMCMD_FRAME(4, 4, .vFlip = TRUE),\n    ANIMCMD_FRAME(8, 4, .vFlip = TRUE),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_SmokescreenImpact_3[] =\n{\n    ANIMCMD_FRAME(0, 4, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME(4, 4, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME(8, 4, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_SmokescreenImpact[] =\n{\n    sAnim_SmokescreenImpact_0,\n    sAnim_SmokescreenImpact_1,\n    sAnim_SmokescreenImpact_2,\n    sAnim_SmokescreenImpact_3,\n};\n\nstatic const struct SpriteTemplate sSmokescreenImpactSpriteTemplate =\n{\n    .tileTag = TAG_SMOKESCREEN,\n    .paletteTag = TAG_SMOKESCREEN,\n    .oam = &sOamData_SmokescreenImpact,\n    .anims = sAnims_SmokescreenImpact,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_SmokescreenImpact\n};\n\nconst struct CompressedSpriteSheet gSpriteSheet_EnemyShadow =\n{\n    .data = gEnemyMonShadow_Gfx, .size = 0x80, .tag = GFXTAG_SHADOW\n};\n\nstatic const struct OamData sOamData_EnemyShadow =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x8),\n    .tileNum = 0,\n    .priority = 3,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nconst struct SpriteTemplate gSpriteTemplate_EnemyShadow =\n{\n    .tileTag = GFXTAG_SHADOW,\n    .paletteTag = PALTAG_SHADOW,\n    .oam = &sOamData_EnemyShadow,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_SetInvisible\n};\n\n#define sActiveSprites data[0]\n#define sPersist       data[1]\n\n#define sMainSpriteId data[0]\n\nu8 SmokescreenImpact(s16 x, s16 y, bool8 persist)\n{\n    u8 mainSpriteId;\n    u8 spriteId1, spriteId2, spriteId3, spriteId4;\n    struct Sprite *mainSprite;\n\n    if (GetSpriteTileStartByTag(sSmokescreenImpactSpriteSheet.tag) == 0xFFFF)\n    {\n        LoadCompressedSpriteSheetUsingHeap(&sSmokescreenImpactSpriteSheet);\n        LoadCompressedSpritePaletteUsingHeap(&sSmokescreenImpactSpritePalette);\n    }\n\n    mainSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_SmokescreenImpactMain);\n    mainSprite = &gSprites[mainSpriteId];\n    mainSprite->sPersist = persist;\n\n    // Top left sprite\n    spriteId1 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x - 16, y - 16, 2);\n    gSprites[spriteId1].sMainSpriteId = mainSpriteId;\n    mainSprite->sActiveSprites++;\n    AnimateSprite(&gSprites[spriteId1]);\n\n    // Top right sprite\n    spriteId2 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x, y - 16, 2);\n    gSprites[spriteId2].sMainSpriteId = mainSpriteId;\n    mainSprite->sActiveSprites++;\n    StartSpriteAnim(&gSprites[spriteId2], 1);\n    AnimateSprite(&gSprites[spriteId2]);\n\n    // Bottom left sprite\n    spriteId3 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x - 16, y, 2);\n    gSprites[spriteId3].sMainSpriteId = mainSpriteId;\n    mainSprite->sActiveSprites++;\n    StartSpriteAnim(&gSprites[spriteId3], 2);\n    AnimateSprite(&gSprites[spriteId3]);\n\n    // Bottom right sprite\n    spriteId4 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x, y, 2);\n    gSprites[spriteId4].sMainSpriteId = mainSpriteId;\n    mainSprite->sActiveSprites++;\n    StartSpriteAnim(&gSprites[spriteId4], 3);\n    AnimateSprite(&gSprites[spriteId4]);\n\n    return mainSpriteId;\n}\n\nstatic void SpriteCB_SmokescreenImpactMain(struct Sprite *sprite)\n{\n    if (sprite->sActiveSprites == 0)\n    {\n        FreeSpriteTilesByTag(sSmokescreenImpactSpriteSheet.tag);\n        FreeSpritePaletteByTag(sSmokescreenImpactSpritePalette.tag);\n        if (!sprite->sPersist)\n            DestroySprite(sprite);\n        else\n            sprite->callback = SpriteCallbackDummy;\n    }\n}\n\nstatic void SpriteCB_SmokescreenImpact(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n    {\n        gSprites[sprite->sMainSpriteId].sActiveSprites--;\n        DestroySprite(sprite);\n    }\n}\n"
  },
  {
    "path": "src/battle_anim_sound_tasks.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"task.h\"\n#include \"constants/battle_anim.h\"\n#include \"constants/sound.h\"\n\nstatic void SoundTask_FireBlast_Step1(u8 taskId);\nstatic void SoundTask_FireBlast_Step2(u8 taskId);\nstatic void SoundTask_LoopSEAdjustPanning_Step(u8 taskId);\nstatic void SoundTask_PlayDoubleCry_Step(u8 taskId);\nstatic void SoundTask_PlayCryWithEcho_Step(u8 taskId);\nstatic void SoundTask_AdjustPanningVar_Step(u8 taskId);\n\n// Loops the specified sound effect and pans from the\n// attacker to the target. The second specified sound effect\n// is played at the very end. This task is effectively\n// hardcoded to the move FIRE_BLAST due to the baked-in\n// durations.\n// arg 0: looped sound effect\n// arg 1: ending sound effect\nvoid SoundTask_FireBlast(u8 taskId)\n{\n    s8 pan1, pan2, panIncrement;\n\n    gTasks[taskId].data[0] = gBattleAnimArgs[0];\n    gTasks[taskId].data[1] = gBattleAnimArgs[1];\n    pan1 = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);\n    pan2 = BattleAnimAdjustPanning(SOUND_PAN_TARGET);\n    panIncrement = CalculatePanIncrement(pan1, pan2, 2);\n    gTasks[taskId].data[2] = pan1;\n    gTasks[taskId].data[3] = pan2;\n    gTasks[taskId].data[4] = panIncrement;\n    gTasks[taskId].data[10] = 10;\n    gTasks[taskId].func = SoundTask_FireBlast_Step1;\n}\n\nstatic void SoundTask_FireBlast_Step1(u8 taskId)\n{\n    s16 pan = gTasks[taskId].data[2];\n    s8 panIncrement = gTasks[taskId].data[4];\n\n    if (++gTasks[taskId].data[11] == 111)\n    {\n        gTasks[taskId].data[10] = 5;\n        gTasks[taskId].data[11] = 0;\n        gTasks[taskId].func = SoundTask_FireBlast_Step2;\n    }\n    else\n    {\n        if (++gTasks[taskId].data[10] == 11)\n        {\n            gTasks[taskId].data[10] = 0;\n            PlaySE12WithPanning(gTasks[taskId].data[0], pan);\n        }\n        pan += panIncrement;\n        gTasks[taskId].data[2] = KeepPanInRange(pan, panIncrement);\n    }\n}\n\nstatic void SoundTask_FireBlast_Step2(u8 taskId)\n{\n    if (++gTasks[taskId].data[10] == 6)\n    {\n        s8 pan;\n\n        gTasks[taskId].data[10] = 0;\n        pan = BattleAnimAdjustPanning(SOUND_PAN_TARGET);\n        PlaySE12WithPanning(gTasks[taskId].data[1], pan);\n        if (++gTasks[taskId].data[11] == 2)\n            DestroyAnimSoundTask(taskId);\n    }\n}\n\nvoid SoundTask_LoopSEAdjustPanning(u8 taskId)\n{\n    u16 songId = gBattleAnimArgs[0];\n    s8 targetPan = gBattleAnimArgs[2];\n    s8 panIncrement = gBattleAnimArgs[3];\n    u8 r10 = gBattleAnimArgs[4];\n    u8 r7 = gBattleAnimArgs[5];\n    u8 r9 = gBattleAnimArgs[6];\n    s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);\n\n    targetPan = BattleAnimAdjustPanning(targetPan);\n    panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement);\n    gTasks[taskId].data[0] = songId;\n    gTasks[taskId].data[1] = sourcePan;\n    gTasks[taskId].data[2] = targetPan;\n    gTasks[taskId].data[3] = panIncrement;\n    gTasks[taskId].data[4] = r10;\n    gTasks[taskId].data[5] = r7;\n    gTasks[taskId].data[6] = r9;\n    gTasks[taskId].data[10] = 0;\n    gTasks[taskId].data[11] = sourcePan;\n    gTasks[taskId].data[12] = r9;\n    gTasks[taskId].func = SoundTask_LoopSEAdjustPanning_Step;\n    gTasks[taskId].func(taskId);\n}\n\nstatic void SoundTask_LoopSEAdjustPanning_Step(u8 taskId)\n{\n    if (gTasks[taskId].data[12]++ == gTasks[taskId].data[6])\n    {\n        gTasks[taskId].data[12] = 0;\n        PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[11]);\n        if (--gTasks[taskId].data[4] == 0)\n        {\n            DestroyAnimSoundTask(taskId);\n            return;\n        }\n    }\n    if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5])\n    {\n        u16 dPan, oldPan;\n\n        gTasks[taskId].data[10] = 0;\n        dPan = gTasks[taskId].data[3];\n        oldPan = gTasks[taskId].data[11];\n        gTasks[taskId].data[11] = dPan + oldPan;\n        gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11], oldPan);\n    }\n}\n\nvoid SoundTask_PlayCryHighPitch(u8 taskId)\n{\n    u16 species = SPECIES_NONE;\n    u8 battlerId;\n    s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);\n\n    // Get wanted battler.\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n        battlerId = gBattleAnimAttacker;\n    else if (gBattleAnimArgs[0] == ANIM_TARGET)\n        battlerId = gBattleAnimTarget;\n    else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER)\n        battlerId = BATTLE_PARTNER(gBattleAnimAttacker);\n    else\n        battlerId = BATTLE_PARTNER(gBattleAnimTarget);\n\n    // Check if battler is visible.\n    if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) \n     && !IsBattlerSpriteVisible(battlerId))\n    {\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n    if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n        species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n    else\n        species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n    if (species != SPECIES_NONE)\n        PlayCry_ByMode(species, pan, CRY_MODE_HIGH_PITCH);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid SoundTask_PlayDoubleCry(u8 taskId)\n{\n    u16 species = SPECIES_NONE;\n    u8 battlerId;\n    s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);\n        \n    // Get wanted battler.\n    if (gBattleAnimArgs[0] == ANIM_ATTACKER)\n        battlerId = gBattleAnimAttacker;\n    else if (gBattleAnimArgs[0] == ANIM_TARGET)\n        battlerId = gBattleAnimTarget;\n    else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER)\n        battlerId = BATTLE_PARTNER(gBattleAnimAttacker);\n    else\n        battlerId = BATTLE_PARTNER(gBattleAnimTarget);\n    // Check if battler is visible.\n    if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) \n     && !IsBattlerSpriteVisible(battlerId))\n    {\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n    if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n        species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n    else\n        species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n    gTasks[taskId].data[0] = gBattleAnimArgs[1];\n    gTasks[taskId].data[1] = species;\n    gTasks[taskId].data[2] = pan;\n    if (species != SPECIES_NONE)\n    {\n        if (gBattleAnimArgs[1] == DOUBLE_CRY_GROWL)\n            PlayCry_ByMode(species, pan, CRY_MODE_GROWL_1);\n        else // DOUBLE_CRY_ROAR\n            PlayCry_ByMode(species, pan, CRY_MODE_ROAR_1);\n        gTasks[taskId].func = SoundTask_PlayDoubleCry_Step;\n    }\n    else\n    {\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nstatic void SoundTask_PlayDoubleCry_Step(u8 taskId)\n{\n    u16 species = gTasks[taskId].data[1];\n    s8 pan = gTasks[taskId].data[2];\n\n    if (gTasks[taskId].data[9] < 2)\n    {\n        ++gTasks[taskId].data[9];\n    }\n    else if (gTasks[taskId].data[0] == DOUBLE_CRY_GROWL)\n    {\n        if (!IsCryPlaying())\n        {\n            PlayCry_ByMode(species, pan, CRY_MODE_GROWL_2);\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n    else // DOUBLE_CRY_ROAR\n    {\n        if (!IsCryPlaying())\n        {\n            PlayCry_ByMode(species, pan, CRY_MODE_ROAR_2);\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n}\n\nvoid SoundTask_WaitForCry(u8 taskId)\n{\n    if (gTasks[taskId].data[9] < 2)\n        ++gTasks[taskId].data[9];\n    else if (!IsCryPlaying())\n        DestroyAnimVisualTask(taskId);\n}\n\n#define tSpecies data[1]\n#define tPan     data[2]\n#define tState   data[9]\n\nvoid SoundTask_PlayCryWithEcho(u8 taskId)\n{\n    u16 species;\n    s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);\n    species = gAnimBattlerSpecies[gBattleAnimAttacker];\n    gTasks[taskId].tSpecies = species;\n    gTasks[taskId].tPan = pan;\n    if (species != SPECIES_NONE)\n    {\n        PlayCry_ByMode(species, pan, CRY_MODE_ECHO_START);\n        gTasks[taskId].func = SoundTask_PlayCryWithEcho_Step;\n    }\n    else\n    {\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nstatic void SoundTask_PlayCryWithEcho_Step(u8 taskId)\n{\n\n    if (gTasks[taskId].tState < 2)\n    {\n        gTasks[taskId].tState++;\n    }\n    else if (!IsCryPlaying())\n    {\n        u16 species = gTasks[taskId].tSpecies;\n        s8 pan = gTasks[taskId].tPan;\n        \n        PlayCry_ByMode(species, pan, CRY_MODE_ECHO_END);\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\n#undef tSpecies\n#undef tPan\n#undef tState\n\nvoid SoundTask_PlaySE1WithPanning(u8 taskId)\n{\n    u16 songId = gBattleAnimArgs[0];\n    s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);\n\n    PlaySE1WithPanning(songId, pan);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid SoundTask_PlaySE2WithPanning(u8 taskId)\n{\n    u16 songId = gBattleAnimArgs[0];\n    s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);\n\n    PlaySE2WithPanning(songId, pan);\n    DestroyAnimVisualTask(taskId);\n}\n\n// Adjusts panning and assigns it to gAnimCustomPanning. Doesnt play sound.\n// Used by Confuse Ray and Will-O-Wisp (see uses of gAnimCustomPanning)\nvoid SoundTask_AdjustPanningVar(u8 taskId)\n{\n    s8 targetPan = gBattleAnimArgs[1];\n    s8 panIncrement = gBattleAnimArgs[2];\n    u16 r9 = gBattleAnimArgs[3];\n    s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[0]);\n\n    targetPan = BattleAnimAdjustPanning(targetPan);\n    panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement);\n    gTasks[taskId].data[1] = sourcePan;\n    gTasks[taskId].data[2] = targetPan;\n    gTasks[taskId].data[3] = panIncrement;\n    gTasks[taskId].data[5] = r9;\n    gTasks[taskId].data[10] = 0;\n    gTasks[taskId].data[11] = sourcePan;\n    gTasks[taskId].func = SoundTask_AdjustPanningVar_Step;\n    gTasks[taskId].func(taskId);\n}\n\nstatic void SoundTask_AdjustPanningVar_Step(u8 taskId)\n{\n    u16 oldPan, panIncrement = gTasks[taskId].data[3];\n\n    if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5])\n    {\n        gTasks[taskId].data[10] = 0;\n        oldPan = gTasks[taskId].data[11];\n        gTasks[taskId].data[11] = panIncrement + oldPan; \n        gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11], oldPan);\n    }\n    gAnimCustomPanning = gTasks[taskId].data[11];\n    if (gTasks[taskId].data[11] == gTasks[taskId].data[2])\n        DestroyAnimVisualTask(taskId);\n}\n"
  },
  {
    "path": "src/battle_anim_special.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_main.h\"\n#include \"battle_message.h\"\n#include \"battle_controllers.h\"\n#include \"battle_interface.h\"\n#include \"decompress.h\"\n#include \"graphics.h\"\n#include \"m4a.h\"\n#include \"pokeball.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"util.h\"\n#include \"constants/items.h\"\n#include \"constants/moves.h\"\n#include \"constants/songs.h\"\n\n#define TAG_PARTICLES_POKEBALL    55020\n#define TAG_PARTICLES_GREATBALL   55021\n#define TAG_PARTICLES_SAFARIBALL  55022\n#define TAG_PARTICLES_ULTRABALL   55023\n#define TAG_PARTICLES_MASTERBALL  55024\n#define TAG_PARTICLES_NETBALL     55025\n#define TAG_PARTICLES_DIVEBALL    55026\n#define TAG_PARTICLES_NESTBALL    55027\n#define TAG_PARTICLES_REPEATBALL  55028\n#define TAG_PARTICLES_TIMERBALL   55029\n#define TAG_PARTICLES_LUXURYBALL  55030\n#define TAG_PARTICLES_PREMIERBALL 55031\n\nu32 gMonShrinkDuration;\nu16 gMonShrinkDelta;\nu16 gMonShrinkDistance;\n\nstatic void AnimTask_UnusedLevelUpHealthBox_Step(u8);\nstatic void AnimTask_FlashHealthboxOnLevelUp_Step(u8);\nstatic void AnimTask_ThrowBall_WaitAnimObjComplete(u8);\nstatic void SpriteCB_ThrowBall_Init(struct Sprite *);\nstatic void AnimTask_ThrowBallSpecial_PlaySfx(u8);\nstatic void AnimTask_ThrowBallSpecial_ResetPlayerSprite(u8);\nstatic void SpriteCB_ThrowBall_ArcFlight(struct Sprite *);\nstatic void TrainerBallBlock(struct Sprite *);\nstatic void SpriteCB_ThrowBall_TenFrameDelay(struct Sprite *);\nstatic void SpriteCB_ThrowBall_ShrinkMon(struct Sprite *);\nstatic void SpriteCB_ThrowBall_InitialFall(struct Sprite *);\nstatic void SpriteCB_ThrowBall_Bounce(struct Sprite *);\nstatic void SpriteCB_ThrowBall_DelayThenBreakOut(struct Sprite *);\nstatic void SpriteCB_ThrowBall_InitShake(struct Sprite *);\nstatic void SpriteCB_ThrowBall_DoShake(struct Sprite *);\nstatic void SpriteCB_ThrowBall_InitClick(struct Sprite *);\nstatic void SpriteCB_ThrowBall_BeginBreakOut(struct Sprite *);\nstatic void SpriteCB_ThrowBall_DoClick(struct Sprite *);\nstatic void CreateStarsWhenBallClicks(struct Sprite *);\nstatic void SpriteCB_ThrowBall_FinishClick(struct Sprite *);\nstatic void BattleAnimObj_SignalEnd(struct Sprite *);\nstatic void LoadBallParticleGfx(u8);\nstatic void SpriteCB_BallCaptureSuccessStar(struct Sprite *);\nstatic void SpriteCB_ThrowBall_RunBreakOut(struct Sprite *);\nstatic void TrainerBallBlock2(struct Sprite *);\nstatic void GhostBallDodge(struct Sprite *sprite);\nstatic void GhostBallDodge2(struct Sprite *sprite);\nstatic void PokeBallOpenParticleAnimation_Step1(struct Sprite *);\nstatic void PokeBallOpenParticleAnimation_Step2(struct Sprite *);\nstatic void DestroyBallOpenAnimationParticle(struct Sprite *);\nstatic void FanOutBallOpenParticles_Step1(struct Sprite *);\nstatic void RepeatBallOpenParticleAnimation_Step1(struct Sprite *);\nstatic void PremierBallOpenParticleAnimation_Step1(struct Sprite *);\nstatic void Task_FadeMon_ToBallColor(u8);\nstatic void Task_FadeMon_ToNormal(u8);\nstatic void Task_FadeMon_ToNormal_Step(u8);\nstatic void AnimTask_ShinySparkles(u8);\nstatic void SpriteCB_ShinySparkles_1(struct Sprite *);\nstatic void SpriteCB_ShinySparkles_2(struct Sprite *);\nstatic void AnimTask_ShinySparkles_WaitSparkles(u8);\nstatic void SpriteCB_SafariBaitOrRock_WaitPlayerThrow(struct Sprite *);\nstatic void SpriteCB_SafariBaitOrRock_ArcFlight(struct Sprite *);\nstatic void SpriteCB_SafariBaitOrRock_Finish(struct Sprite *);\nstatic void PokeBallOpenParticleAnimation(u8);\nstatic void GreatBallOpenParticleAnimation(u8);\nstatic void SafariBallOpenParticleAnimation(u8);\nstatic void UltraBallOpenParticleAnimation(u8);\nstatic void MasterBallOpenParticleAnimation(u8);\nstatic void DiveBallOpenParticleAnimation(u8);\nstatic void RepeatBallOpenParticleAnimation(u8);\nstatic void TimerBallOpenParticleAnimation(u8);\nstatic void PremierBallOpenParticleAnimation(u8);\nstatic void SpriteCB_SafariBaitOrRock_Init(struct Sprite *);\n\nstruct CaptureStar\n{\n    s8 xOffset;\n    s8 yOffset;\n    s8 amplitude;\n};\n\nstatic const struct CaptureStar sCaptureStar[] =\n{\n    {\n        .xOffset = 10,\n        .yOffset = 2,\n        .amplitude = -3,\n    },\n    {\n        .xOffset = 15,\n        .yOffset = 0,\n        .amplitude = -4,\n    },\n    {\n        .xOffset = -10,\n        .yOffset = 2,\n        .amplitude = -4,\n    },\n};\n\nconst struct CompressedSpriteSheet gBallParticleSpritesheets[] =\n{\n    [BALL_POKE]    = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_POKEBALL},\n    [BALL_GREAT]   = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_GREATBALL},\n    [BALL_SAFARI]  = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_SAFARIBALL},\n    [BALL_ULTRA]   = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_ULTRABALL},\n    [BALL_MASTER]  = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_MASTERBALL},\n    [BALL_NET]     = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NETBALL},\n    [BALL_DIVE]    = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_DIVEBALL},\n    [BALL_NEST]    = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NESTBALL},\n    [BALL_REPEAT]  = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_REPEATBALL},\n    [BALL_TIMER]   = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_TIMERBALL},\n    [BALL_LUXURY]  = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_LUXURYBALL},\n    [BALL_PREMIER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_PREMIERBALL},\n};\n\nconst struct CompressedSpritePalette gBallParticlePalettes[] =\n{\n    [BALL_POKE]    = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_POKEBALL},\n    [BALL_GREAT]   = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_GREATBALL},\n    [BALL_SAFARI]  = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_SAFARIBALL},\n    [BALL_ULTRA]   = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_ULTRABALL},\n    [BALL_MASTER]  = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_MASTERBALL},\n    [BALL_NET]     = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NETBALL},\n    [BALL_DIVE]    = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_DIVEBALL},\n    [BALL_NEST]    = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NESTBALL},\n    [BALL_REPEAT]  = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_REPEATBALL},\n    [BALL_TIMER]   = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_TIMERBALL},\n    [BALL_LUXURY]  = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_LUXURYBALL},\n    [BALL_PREMIER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_PREMIERBALL},\n};\n\nstatic const union AnimCmd sAnim_RegularBall[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_FRAME(0, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_MasterBall[] =\n{\n    ANIMCMD_FRAME(3, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_NetDiveBall[] =\n{\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_NestBall[] =\n{\n    ANIMCMD_FRAME(5, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_LuxuryPremierBall[] =\n{\n    ANIMCMD_FRAME(6, 4),\n    ANIMCMD_FRAME(7, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UltraRepeatTimerBall[] =    \n{\n    ANIMCMD_FRAME(7, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_BallParticles[] =    \n{\n    sAnim_RegularBall,\n    sAnim_MasterBall,\n    sAnim_NetDiveBall,\n    sAnim_NestBall,\n    sAnim_LuxuryPremierBall,\n    sAnim_UltraRepeatTimerBall,\n};\n\nstatic const u8 sBallParticleAnimNums[] =\n{\n    [BALL_POKE]    = 0,\n    [BALL_GREAT]   = 0,\n    [BALL_SAFARI]  = 0,\n    [BALL_ULTRA]   = 5,\n    [BALL_MASTER]  = 1,\n    [BALL_NET]     = 2,\n    [BALL_DIVE]    = 2,\n    [BALL_NEST]    = 3,\n    [BALL_REPEAT]  = 5,\n    [BALL_TIMER]   = 5,\n    [BALL_LUXURY]  = 4,\n    [BALL_PREMIER] = 4,\n};\n\nstatic const TaskFunc sBallParticleAnimationFuncs[] =\n{\n    [BALL_POKE]    = PokeBallOpenParticleAnimation,\n    [BALL_GREAT]   = GreatBallOpenParticleAnimation,\n    [BALL_SAFARI]  = SafariBallOpenParticleAnimation,\n    [BALL_ULTRA]   = UltraBallOpenParticleAnimation,\n    [BALL_MASTER]  = MasterBallOpenParticleAnimation,\n    [BALL_NET]     = SafariBallOpenParticleAnimation,\n    [BALL_DIVE]    = DiveBallOpenParticleAnimation,\n    [BALL_NEST]    = UltraBallOpenParticleAnimation,\n    [BALL_REPEAT]  = RepeatBallOpenParticleAnimation,\n    [BALL_TIMER]   = TimerBallOpenParticleAnimation,\n    [BALL_LUXURY]  = GreatBallOpenParticleAnimation,\n    [BALL_PREMIER] = PremierBallOpenParticleAnimation,\n};\n\nstatic const struct SpriteTemplate sBallParticlesSpriteTemplates[] =\n{\n    [BALL_POKE] = {\n        .tileTag = TAG_PARTICLES_POKEBALL,\n        .paletteTag = TAG_PARTICLES_POKEBALL,\n        .oam = &gOamData_AffineOff_ObjNormal_8x8,\n        .anims = sAnims_BallParticles,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n    [BALL_GREAT] = {\n        .tileTag = TAG_PARTICLES_GREATBALL,\n        .paletteTag = TAG_PARTICLES_GREATBALL,\n        .oam = &gOamData_AffineOff_ObjNormal_8x8,\n        .anims = sAnims_BallParticles,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n    [BALL_SAFARI] = {\n        .tileTag = TAG_PARTICLES_SAFARIBALL,\n        .paletteTag = TAG_PARTICLES_SAFARIBALL,\n        .oam = &gOamData_AffineOff_ObjNormal_8x8,\n        .anims = sAnims_BallParticles,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n    [BALL_ULTRA] = {\n        .tileTag = TAG_PARTICLES_ULTRABALL,\n        .paletteTag = TAG_PARTICLES_ULTRABALL,\n        .oam = &gOamData_AffineOff_ObjNormal_8x8,\n        .anims = sAnims_BallParticles,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n    [BALL_MASTER] = {\n        .tileTag = TAG_PARTICLES_MASTERBALL,\n        .paletteTag = TAG_PARTICLES_MASTERBALL,\n        .oam = &gOamData_AffineOff_ObjNormal_8x8,\n        .anims = sAnims_BallParticles,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n    [BALL_NET] = {\n        .tileTag = TAG_PARTICLES_NETBALL,\n        .paletteTag = TAG_PARTICLES_NETBALL,\n        .oam = &gOamData_AffineOff_ObjNormal_8x8,\n        .anims = sAnims_BallParticles,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n    [BALL_DIVE] = {\n        .tileTag = TAG_PARTICLES_DIVEBALL,\n        .paletteTag = TAG_PARTICLES_DIVEBALL,\n        .oam = &gOamData_AffineOff_ObjNormal_8x8,\n        .anims = sAnims_BallParticles,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n    [BALL_NEST] = {\n        .tileTag = TAG_PARTICLES_NESTBALL,\n        .paletteTag = TAG_PARTICLES_NESTBALL,\n        .oam = &gOamData_AffineOff_ObjNormal_8x8,\n        .anims = sAnims_BallParticles,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n    [BALL_REPEAT] = {\n        .tileTag = TAG_PARTICLES_REPEATBALL,\n        .paletteTag = TAG_PARTICLES_REPEATBALL,\n        .oam = &gOamData_AffineOff_ObjNormal_8x8,\n        .anims = sAnims_BallParticles,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n    [BALL_TIMER] = {\n        .tileTag = TAG_PARTICLES_TIMERBALL,\n        .paletteTag = TAG_PARTICLES_TIMERBALL,\n        .oam = &gOamData_AffineOff_ObjNormal_8x8,\n        .anims = sAnims_BallParticles,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n    [BALL_LUXURY] = {\n        .tileTag = TAG_PARTICLES_LUXURYBALL,\n        .paletteTag = TAG_PARTICLES_LUXURYBALL,\n        .oam = &gOamData_AffineOff_ObjNormal_8x8,\n        .anims = sAnims_BallParticles,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n    [BALL_PREMIER] = {\n        .tileTag = TAG_PARTICLES_PREMIERBALL,\n        .paletteTag = TAG_PARTICLES_PREMIERBALL,\n        .oam = &gOamData_AffineOff_ObjNormal_8x8,\n        .anims = sAnims_BallParticles,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    },\n};\n\nstatic const u16 sBallOpenFadeColors[] =\n{\n    [BALL_POKE]    = RGB(31, 22, 30),\n    [BALL_GREAT]   = RGB(16, 23, 30),\n    [BALL_SAFARI]  = RGB(23, 30, 20),\n    [BALL_ULTRA]   = RGB(31, 31, 15),\n    [BALL_MASTER]  = RGB(23, 20, 28),\n    [BALL_NET]     = RGB(21, 31, 25),\n    [BALL_DIVE]    = RGB(12, 25, 30),\n    [BALL_NEST]    = RGB(30, 27, 10),\n    [BALL_REPEAT]  = RGB(31, 24, 16),\n    [BALL_TIMER]   = RGB(29, 30, 30),\n    [BALL_LUXURY]  = RGB(31, 17, 10),\n    [BALL_PREMIER] = RGB(31, 9, 10),\n\n    // Unused\n    RGB_BLACK,\n    RGB(1, 16, 0),\n    RGB(3, 0, 1),\n    RGB(1, 8, 0),\n    RGB(0, 8, 0),\n    RGB(3, 8, 1),\n    RGB(6, 8, 1),\n    RGB(4, 0, 0),\n};\n\nconst struct SpriteTemplate gSafariBaitSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SAFARI_BAIT,\n    .paletteTag = ANIM_TAG_SAFARI_BAIT,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_SafariBaitOrRock_Init,\n};\n\nstatic const union AnimCmd sSpriteAnim_SafariRock_0[] =\n{\n    ANIMCMD_FRAME(64, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_SafariRock[] =\n{\n    sSpriteAnim_SafariRock_0,\n};\n\nconst struct SpriteTemplate gSafariRockTemplate =\n{\n    .tileTag = ANIM_TAG_ROCKS,\n    .paletteTag = ANIM_TAG_ROCKS,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sSpriteAnimTable_SafariRock,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_SafariBaitOrRock_Init,\n};\n\n// Unused\nvoid AnimTask_LevelUpHealthBox(u8 taskId)\n{\n    struct BattleAnimBgData animBgData;\n    u8 healthBoxSpriteId;\n    u8 battler;\n    u8 spriteId1, spriteId2, spriteId3, spriteId4;\n\n    battler = gBattleAnimAttacker;\n    gBattle_WIN0H = 0;\n    gBattle_WIN0V = 0;\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0);\n    SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);\n    SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 1);\n    SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);\n    healthBoxSpriteId = gHealthboxSpriteIds[battler];\n    spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam;\n    spriteId2 = gSprites[healthBoxSpriteId].data[5];\n    spriteId3 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);\n    spriteId4 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);\n    gSprites[healthBoxSpriteId].oam.priority = 1;\n    gSprites[spriteId1].oam.priority = 1;\n    gSprites[spriteId2].oam.priority = 1;\n    gSprites[spriteId3] = gSprites[healthBoxSpriteId];\n    gSprites[spriteId4] = gSprites[spriteId1];\n    gSprites[spriteId3].oam.objMode = ST_OAM_OBJ_WINDOW;\n    gSprites[spriteId4].oam.objMode = ST_OAM_OBJ_WINDOW;\n    gSprites[spriteId3].callback = SpriteCallbackDummy;\n    gSprites[spriteId4].callback = SpriteCallbackDummy;\n    GetBattleAnimBg1Data(&animBgData);\n    AnimLoadCompressedBgTilemap(animBgData.bgId, gUnusedLevelupAnimationTilemap);\n    AnimLoadCompressedBgGfx(animBgData.bgId, gUnusedLevelupAnimationGfx, animBgData.tilesOffset);\n    LoadCompressedPalette(gCureBubblesPal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP);\n    gBattle_BG1_X = -gSprites[spriteId3].x + 32;\n    gBattle_BG1_Y = -gSprites[spriteId3].y - 32;\n    gTasks[taskId].data[1] = 640;\n    gTasks[taskId].data[0] = spriteId3;\n    gTasks[taskId].data[2] = spriteId4;\n    gTasks[taskId].func = AnimTask_UnusedLevelUpHealthBox_Step;\n}\n\nstatic void AnimTask_UnusedLevelUpHealthBox_Step(u8 taskId)\n{\n    u8 spriteId1, spriteId2;\n    u8 battler;\n\n    battler = gBattleAnimAttacker;\n    gTasks[taskId].data[13] += gTasks[taskId].data[1];\n    gBattle_BG1_Y += (u16)gTasks[taskId].data[13] >> 8;\n    gTasks[taskId].data[13] &= 0xFF;\n\n    switch (gTasks[taskId].data[15])\n    {\n    case 0:\n        if (gTasks[taskId].data[11]++ > 1)\n        {\n            gTasks[taskId].data[11] = 0;\n            gTasks[taskId].data[12]++;\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));\n            if (gTasks[taskId].data[12] == 8)\n                gTasks[taskId].data[15]++;\n        }\n        break;\n    case 1:\n        if (++gTasks[taskId].data[10] == 30)\n            gTasks[taskId].data[15]++;\n        break;\n    case 2:\n        if (gTasks[taskId].data[11]++ > 1)\n        {\n            gTasks[taskId].data[11] = 0;\n            gTasks[taskId].data[12]--;\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));\n            if (gTasks[taskId].data[12] == 0)\n            {\n                ResetBattleAnimBg(0);\n                gBattle_WIN0H = 0;\n                gBattle_WIN0V = 0;\n                SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n                SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);\n                if (!IsContest())\n                    SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);\n\n                SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);\n                SetGpuReg(REG_OFFSET_BLDCNT, 0);\n                SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));\n                DestroySprite(&gSprites[gTasks[taskId].data[0]]);\n                DestroySprite(&gSprites[gTasks[taskId].data[2]]);\n                SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 0);\n                spriteId1 = gSprites[gHealthboxSpriteIds[battler]].oam.affineParam;\n                spriteId2 = gSprites[gHealthboxSpriteIds[battler]].data[5];\n                gSprites[gHealthboxSpriteIds[battler]].oam.priority = 1;\n                gSprites[spriteId1].oam.priority = 1;\n                gSprites[spriteId2].oam.priority = 1;\n                DestroyAnimVisualTask(taskId);\n            }\n        }\n        break;\n    }\n}\n\nvoid DoLoadHealthboxPalsForLevelUp(u8 *paletteId1, u8 *paletteId2, u8 battler)\n{\n    u8 healthBoxSpriteId;\n    u8 spriteId1, spriteId2;\n    u16 offset1, offset2;\n\n    healthBoxSpriteId = gHealthboxSpriteIds[battler];\n    spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam;\n    spriteId2 = gSprites[healthBoxSpriteId].data[5];\n    *paletteId1 = AllocSpritePalette(TAG_HEALTHBOX_PALS_1);\n    *paletteId2 = AllocSpritePalette(TAG_HEALTHBOX_PALS_2);\n    offset1 = OBJ_PLTT_ID(gSprites[healthBoxSpriteId].oam.paletteNum);\n    offset2 = OBJ_PLTT_ID(gSprites[spriteId2].oam.paletteNum);\n    LoadPalette(&gPlttBufferUnfaded[offset1], OBJ_PLTT_ID(*paletteId1), PLTT_SIZE_4BPP);\n    LoadPalette(&gPlttBufferUnfaded[offset2], OBJ_PLTT_ID(*paletteId2), PLTT_SIZE_4BPP);\n    gSprites[healthBoxSpriteId].oam.paletteNum = *paletteId1;\n    gSprites[spriteId1].oam.paletteNum = *paletteId1;\n    gSprites[spriteId2].oam.paletteNum = *paletteId2;\n}\n\nvoid AnimTask_LoadHealthboxPalsForLevelUp(u8 taskId)\n{\n    u8 paletteId1, paletteId2;\n    \n    DoLoadHealthboxPalsForLevelUp(&paletteId1, &paletteId2, gBattleAnimAttacker);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid DoFreeHealthboxPalsForLevelUp(u8 battler)\n{\n    u8 healthBoxSpriteId;\n    u8 spriteId1, spriteId2;\n    u8 paletteId1, paletteId2;\n\n    healthBoxSpriteId = gHealthboxSpriteIds[battler];\n    spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam;\n    spriteId2 = gSprites[healthBoxSpriteId].data[5];\n    FreeSpritePaletteByTag(TAG_HEALTHBOX_PALS_1);\n    FreeSpritePaletteByTag(TAG_HEALTHBOX_PALS_2);\n    paletteId1 = IndexOfSpritePaletteTag(TAG_HEALTHBOX_PAL);\n    paletteId2 = IndexOfSpritePaletteTag(TAG_HEALTHBAR_PAL);\n    gSprites[healthBoxSpriteId].oam.paletteNum = paletteId1;\n    gSprites[spriteId1].oam.paletteNum = paletteId1;\n    gSprites[spriteId2].oam.paletteNum = paletteId2;\n}\n\nvoid AnimTask_FreeHealthboxPalsForLevelUp(u8 taskId)\n{\n    DoFreeHealthboxPalsForLevelUp(gBattleAnimAttacker);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_FlashHealthboxOnLevelUp(u8 taskId)\n{\n    gTasks[taskId].data[10] = gBattleAnimArgs[0];\n    gTasks[taskId].data[11] = gBattleAnimArgs[1];\n    gTasks[taskId].func = AnimTask_FlashHealthboxOnLevelUp_Step;\n}\n\nstatic void AnimTask_FlashHealthboxOnLevelUp_Step(u8 taskId)\n{\n    u8 paletteNum;\n    int paletteOffset, colorOffset;\n\n    gTasks[taskId].data[0]++;\n    if (gTasks[taskId].data[0]++ >= gTasks[taskId].data[11])\n    {\n        gTasks[taskId].data[0] = 0;\n        paletteNum = IndexOfSpritePaletteTag(TAG_HEALTHBOX_PALS_1);\n        colorOffset = gTasks[taskId].data[10] == 0 ? 6 : 2;\n        switch (gTasks[taskId].data[1])\n        {\n        case 0:\n            gTasks[taskId].data[2] += 2;\n            if (gTasks[taskId].data[2] > 16)\n                gTasks[taskId].data[2] = 16;\n\n            paletteOffset = OBJ_PLTT_ID(paletteNum);\n            BlendPalette(paletteOffset + colorOffset, 1, gTasks[taskId].data[2], RGB(20, 27, 31));\n            if (gTasks[taskId].data[2] == 16)\n                gTasks[taskId].data[1]++;\n            break;\n        case 1:\n            gTasks[taskId].data[2] -= 2;\n            if (gTasks[taskId].data[2] < 0)\n                gTasks[taskId].data[2] = 0;\n\n            paletteOffset = OBJ_PLTT_ID(paletteNum);\n            BlendPalette(paletteOffset + colorOffset, 1, gTasks[taskId].data[2], RGB(20, 27, 31));\n            if (gTasks[taskId].data[2] == 0)\n                DestroyAnimVisualTask(taskId);\n            break;\n        }\n    }\n}\n\nvoid AnimTask_SwitchOutShrinkMon(u8 taskId)\n{\n    u8 spriteId;\n\n    spriteId = gBattlerSpriteIds[gBattleAnimAttacker];\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL);\n        gTasks[taskId].data[10] = 0x100;\n        gTasks[taskId].data[0]++;\n        break;\n    case 1:\n        gTasks[taskId].data[10] += 0x30;\n        SetSpriteRotScale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[10], 0);\n        SetBattlerSpriteYOffsetFromYScale(spriteId);\n        if (gTasks[taskId].data[10] >= 0x2D0)\n            gTasks[taskId].data[0]++;\n        break;\n    case 2:\n        ResetSpriteRotScale(spriteId);\n        gSprites[spriteId].invisible = TRUE;\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nvoid AnimTask_SwitchOutBallEffect(u8 taskId)\n{\n    u8 spriteId;\n    u16 ball;\n    u8 ballId;\n    u8 x, y;\n    u8 priority, subpriority;\n    u32 selectedPalettes;\n\n    spriteId = gBattlerSpriteIds[gBattleAnimAttacker];\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        ball = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_POKEBALL);\n    else\n        ball = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_POKEBALL);\n\n    ballId = ItemIdToBallId(ball);\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n        y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n        priority = gSprites[spriteId].oam.priority;\n        subpriority = gSprites[spriteId].subpriority;\n        gTasks[taskId].data[10] = AnimateBallOpenParticles(x, y + 32, priority, subpriority, ballId);\n        selectedPalettes = GetBattlePalettesMask(1, 0, 0, 0, 0, 0, 0);\n        gTasks[taskId].data[11] = LaunchBallFadeMonTask(0, gBattleAnimAttacker, selectedPalettes, ballId);\n        gTasks[taskId].data[0]++;\n        break;\n    case 1:\n        if (!gTasks[gTasks[taskId].data[10]].isActive && !gTasks[gTasks[taskId].data[11]].isActive)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nvoid AnimTask_LoadBallGfx(u8 taskId)\n{\n    u8 ballId = ItemIdToBallId(gLastUsedItem);\n    \n    LoadBallGfx(ballId);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_FreeBallGfx(u8 taskId)\n{\n    u8 ballId = ItemIdToBallId(gLastUsedItem);\n    \n    FreeBallGfx(ballId);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_IsBallBlockedByTrainerOrDodged(u8 taskId)\n{\n    switch (gBattleSpritesDataPtr->animationData->ballThrowCaseId)\n    {\n    case BALL_TRAINER_BLOCK:\n        gBattleAnimArgs[ARG_RET_ID] = -1;\n        break;\n    case BALL_GHOST_DODGE:\n        gBattleAnimArgs[ARG_RET_ID] = -2;\n        break;\n    default:\n        gBattleAnimArgs[ARG_RET_ID] = 0;\n        break;\n    }\n\n    DestroyAnimVisualTask(taskId);\n}\n\nu8 ItemIdToBallId(u16 ballItem)\n{\n    switch (ballItem)\n    {\n    case ITEM_MASTER_BALL:\n        return BALL_MASTER;\n    case ITEM_ULTRA_BALL:\n        return BALL_ULTRA;\n    case ITEM_GREAT_BALL:\n        return BALL_GREAT;\n    case ITEM_SAFARI_BALL:\n        return BALL_SAFARI;\n    case ITEM_NET_BALL:\n        return BALL_NET;\n    case ITEM_DIVE_BALL:\n        return BALL_DIVE;\n    case ITEM_NEST_BALL:\n        return BALL_NEST;\n    case ITEM_REPEAT_BALL:\n        return BALL_REPEAT;\n    case ITEM_TIMER_BALL:\n        return BALL_TIMER;\n    case ITEM_LUXURY_BALL:\n        return BALL_LUXURY;\n    case ITEM_PREMIER_BALL:\n        return BALL_PREMIER;\n    case ITEM_POKE_BALL:\n    default:\n        return BALL_POKE;\n    }\n}\n\nvoid AnimTask_ThrowBall(u8 taskId)\n{\n    u8 ballId;\n    u8 spriteId;\n\n    ballId = ItemIdToBallId(gLastUsedItem);\n    spriteId = CreateSprite(&gBallSpriteTemplates[ballId], 32, 80, 29);\n    gSprites[spriteId].data[0] = 34;\n    gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n    gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) - 16;\n    gSprites[spriteId].callback = SpriteCB_ThrowBall_Init;\n    gBattleSpritesDataPtr->animationData->wildMonInvisible = gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible;\n    gTasks[taskId].data[0] = spriteId;\n    gTasks[taskId].func = AnimTask_ThrowBall_WaitAnimObjComplete;\n}\n\nstatic void AnimTask_ThrowBall_WaitAnimObjComplete(u8 taskId)\n{\n    u8 spriteId = gTasks[taskId].data[0];\n    \n    if ((u16)gSprites[spriteId].data[0] == 0xFFFF)\n        DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_ThrowBallSpecial(u8 taskId)\n{\n    int x, y;\n    u8 ballId;\n    u8 subpriority;\n    u8 spriteId;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL)\n    {\n        x = 28;\n        y = 11;\n    }\n    else\n    {\n        x = 23;\n        y = 11;\n        if (gSaveBlock2Ptr->playerGender == FEMALE)\n            y = 13;\n    }\n\n    ballId = ItemIdToBallId(gLastUsedItem);\n    subpriority = GetBattlerSpriteSubpriority(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) + 1;\n    spriteId = CreateSprite(&gBallSpriteTemplates[ballId], x | 32, y | 80, subpriority);\n    gSprites[spriteId].data[0] = 34;\n    gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);\n    gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) - 16;\n    gSprites[spriteId].callback = SpriteCallbackDummy;\n    gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].callback = SpriteCB_PlayerThrowInit;\n    gTasks[taskId].data[0] = spriteId;\n    gTasks[taskId].func = AnimTask_ThrowBallSpecial_PlaySfx;\n}\n\nstatic void AnimTask_ThrowBallSpecial_PlaySfx(u8 taskId)\n{\n    if (gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].animCmdIndex == 1)\n    {\n        PlaySE12WithPanning(SE_BALL_THROW, 0);\n        gSprites[gTasks[taskId].data[0]].callback = SpriteCB_ThrowBall_Init;\n        CreateTask(AnimTask_ThrowBallSpecial_ResetPlayerSprite, 10);\n        gTasks[taskId].func = AnimTask_ThrowBall_WaitAnimObjComplete;\n    }\n}\n\nstatic void AnimTask_ThrowBallSpecial_ResetPlayerSprite(u8 taskId)\n{\n    if (gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].animEnded)\n    {\n        StartSpriteAnim(&gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]], 0);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void SpriteCB_ThrowBall_Init(struct Sprite *sprite)\n{\n    u16 destX = sprite->data[1];\n    u16 destY = sprite->data[2];\n    \n    sprite->sTransl_InitX = sprite->x;\n    sprite->sTransl_DestX = destX;\n    sprite->sTransl_InitY = sprite->y;\n    sprite->sTransl_DestY = destY;\n    sprite->sTransl_ArcAmpl = -40;\n    InitAnimArcTranslation(sprite);\n    sprite->callback = SpriteCB_ThrowBall_ArcFlight;\n}\n\nstatic void SpriteCB_ThrowBall_ArcFlight(struct Sprite *sprite)\n{\n    int i;\n    u8 ballId;\n\n    if (TranslateAnimHorizontalArc(sprite))\n    {\n        if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_TRAINER_BLOCK)\n        {\n            sprite->callback = TrainerBallBlock;\n        }\n        else if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_GHOST_DODGE)\n        {\n            sprite->callback = GhostBallDodge;\n        }\n        else\n        {\n            StartSpriteAnim(sprite, 1);\n            sprite->x += sprite->x2;\n            sprite->y += sprite->y2;\n            sprite->x2 = 0;\n            sprite->y2 = 0;\n\n            for (i = 0; i < 8; i++)\n                sprite->data[i] = 0;\n\n            sprite->data[5] = 0;\n            sprite->callback = SpriteCB_ThrowBall_TenFrameDelay;\n\n            ballId = ItemIdToBallId(gLastUsedItem);\n            switch (ballId)\n            {\n            case 0 ... POKEBALL_COUNT - 1:\n                AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId);\n                LaunchBallFadeMonTask(0, gBattleAnimTarget, 14, ballId);\n                break;\n            }\n        }\n    }\n}\n\nstatic void SpriteCB_ThrowBall_TenFrameDelay(struct Sprite *sprite)\n{\n    if (++sprite->data[5] == 10)\n    {\n        sprite->data[5] = CreateTask(TaskDummy, 50);\n        sprite->callback = SpriteCB_ThrowBall_ShrinkMon;\n        gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] = 0;\n    }\n}\n\nstatic void SpriteCB_ThrowBall_ShrinkMon(struct Sprite *sprite)\n{\n    u8 spriteId;\n    u8 taskId;\n\n    spriteId = gBattlerSpriteIds[gBattleAnimTarget];\n    taskId = sprite->data[5];\n    if (++gTasks[taskId].data[1] == 11)\n        PlaySE(SE_BALL_TRADE);\n\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL);\n        gTasks[taskId].data[10] = 256;\n        gMonShrinkDuration = 28;\n        gMonShrinkDistance = (gSprites[spriteId].y + gSprites[spriteId].y2) - (sprite->y + sprite->y2);\n        gMonShrinkDelta = (gMonShrinkDistance * 256) / gMonShrinkDuration;\n        gTasks[taskId].data[2] = gMonShrinkDelta;\n        gTasks[taskId].data[0]++;\n        break;\n    case 1:\n        gTasks[taskId].data[10] += 0x20;\n        SetSpriteRotScale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[10], 0);\n        gTasks[taskId].data[3] += gTasks[taskId].data[2];\n        gSprites[spriteId].y2 = -gTasks[taskId].data[3] >> 8;\n        if (gTasks[taskId].data[10] >= 0x480)\n            gTasks[taskId].data[0]++;\n        break;\n    case 2:\n        ResetSpriteRotScale(spriteId);\n        gSprites[spriteId].invisible = TRUE;\n        gTasks[taskId].data[0]++;\n        break;\n    default:\n        if (gTasks[taskId].data[1] > 10)\n        {\n            DestroyTask(taskId);\n            StartSpriteAnim(sprite, 2);\n            sprite->data[5] = 0;\n            sprite->callback = SpriteCB_ThrowBall_InitialFall;\n        }\n        break;\n    }\n}\n\nstatic void SpriteCB_ThrowBall_InitialFall(struct Sprite *sprite)\n{\n    int angle;\n\n    if (sprite->animEnded)\n    {\n        sprite->data[3] = 0;\n        sprite->data[4] = 40;\n        sprite->data[5] = 0;\n        angle = 0;\n        sprite->y += Cos(angle, 40);\n        sprite->y2 = -Cos(angle, sprite->data[4]);\n        sprite->callback = SpriteCB_ThrowBall_Bounce;\n    }\n}\n\nstatic void SpriteCB_ThrowBall_Bounce(struct Sprite *sprite)\n{\n    bool8 lastBounce;\n    int bounceCount;\n\n    lastBounce = FALSE;\n    switch (sprite->data[3] & 0xFF)\n    {\n    case 0:\n        sprite->y2 = -Cos(sprite->data[5], sprite->data[4]);\n        sprite->data[5] += (sprite->data[3] >> 8) + 4;\n        if (sprite->data[5] >= 64)\n        {\n            sprite->data[4] -= 10;\n            sprite->data[3] += 257;\n\n            bounceCount = sprite->data[3] >> 8;\n            if (bounceCount == 4)\n                lastBounce = TRUE;\n\n            // Play a different sound effect for each pokeball bounce.\n            switch (bounceCount)\n            {\n            case 1:\n                PlaySE(SE_BALL_BOUNCE_1);\n                break;\n            case 2:\n                PlaySE(SE_BALL_BOUNCE_2);\n                break;\n            case 3:\n                PlaySE(SE_BALL_BOUNCE_3);\n                break;\n            default:\n                PlaySE(SE_BALL_BOUNCE_4);\n                break;\n            }\n        }\n        break;\n    case 1:\n        sprite->y2 = -Cos(sprite->data[5], sprite->data[4]);\n        sprite->data[5] -= (sprite->data[3] >> 8) + 4;\n        if (sprite->data[5] <= 0)\n        {\n            sprite->data[5] = 0;\n            sprite->data[3] &= -0x100;\n        }\n        break;\n    }\n\n    if (lastBounce)\n    {\n        sprite->data[3] = 0;\n        sprite->y += Cos(64, 40);\n        sprite->y2 = 0;\n        if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_NO_SHAKES)\n        {\n            sprite->data[5] = 0;\n            sprite->callback = SpriteCB_ThrowBall_DelayThenBreakOut;\n        }\n        else\n        {\n            sprite->callback = SpriteCB_ThrowBall_InitShake;\n            sprite->data[4] = 1;\n            sprite->data[5] = 0;\n        }\n    }\n}\n\nstatic void SpriteCB_ThrowBall_InitShake(struct Sprite *sprite)\n{\n    if (++sprite->data[3] == 31)\n    {\n        sprite->data[3] = 0;\n        sprite->affineAnimPaused = TRUE;\n        StartSpriteAffineAnim(sprite, 1);\n        gBattleSpritesDataPtr->animationData->ballSubpx = 0;\n        sprite->callback = SpriteCB_ThrowBall_DoShake;\n        PlaySE(SE_BALL);\n    }\n}\n\nstatic void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)\n{\n    s8 state;\n    u16 var0;\n\n    switch (sprite->data[3] & 0xFF)\n    {\n    case 0:\n        if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF)\n        {\n            sprite->x2 += sprite->data[4];\n            gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF;\n        }\n        else\n        {\n            gBattleSpritesDataPtr->animationData->ballSubpx += 0xB0;\n        }\n\n        sprite->data[5]++;\n        sprite->affineAnimPaused = FALSE;\n        var0 = sprite->data[5] + 7;\n        if (var0 > 14)\n        {\n            gBattleSpritesDataPtr->animationData->ballSubpx = 0;\n            sprite->data[3]++;\n            sprite->data[5] = 0;\n        }\n        break;\n    case 1:\n        if (++sprite->data[5] == 1)\n        {\n            sprite->data[5] = 0;\n            sprite->data[4] = -sprite->data[4];\n            sprite->data[3]++;\n            sprite->affineAnimPaused = FALSE;\n            if (sprite->data[4] < 0)\n                ChangeSpriteAffineAnim(sprite, 2);\n            else\n                ChangeSpriteAffineAnim(sprite, 1);\n        }\n        else\n        {\n            sprite->affineAnimPaused = TRUE;\n        }\n        break;\n    case 2:\n        if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF)\n        {\n            sprite->x2 += sprite->data[4];\n            gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF;\n        }\n        else\n        {\n            gBattleSpritesDataPtr->animationData->ballSubpx += 0xB0;\n        }\n\n        sprite->data[5]++;\n        sprite->affineAnimPaused = FALSE;\n        var0 = sprite->data[5] + 12;\n        if (var0 > 24)\n        {\n            gBattleSpritesDataPtr->animationData->ballSubpx = 0;\n            sprite->data[3]++;\n            sprite->data[5] = 0;\n        }\n        break;\n    case 3:\n        if (sprite->data[5]++ < 0)\n        {\n            sprite->affineAnimPaused = TRUE;\n            break;\n        }\n\n        sprite->data[5] = 0;\n        sprite->data[4] = -sprite->data[4];\n        sprite->data[3]++;\n        sprite->affineAnimPaused = FALSE;\n        if (sprite->data[4] < 0)\n            ChangeSpriteAffineAnim(sprite, 2);\n        else\n            ChangeSpriteAffineAnim(sprite, 1);\n        // fall through\n    case 4:\n        if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF)\n        {\n            sprite->x2 += sprite->data[4];\n            gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF;\n        }\n        else\n        {\n            gBattleSpritesDataPtr->animationData->ballSubpx += 0xB0;\n        }\n\n        sprite->data[5]++;\n        sprite->affineAnimPaused = FALSE;\n        var0 = sprite->data[5] + 4;\n        if (var0 > 8)\n        {\n            gBattleSpritesDataPtr->animationData->ballSubpx = 0;\n            sprite->data[3]++;\n            sprite->data[5] = 0;\n            sprite->data[4] = -sprite->data[4];\n        }\n        break;\n    case 5:\n        sprite->data[3] += 0x100;\n        state = sprite->data[3] >> 8;\n        if (state == gBattleSpritesDataPtr->animationData->ballThrowCaseId)\n        {\n            sprite->affineAnimPaused = TRUE;\n            sprite->callback = SpriteCB_ThrowBall_DelayThenBreakOut;\n        }\n        else\n        {\n            if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_3_SHAKES_SUCCESS && state == 3)\n            {\n                sprite->callback = SpriteCB_ThrowBall_InitClick;\n                sprite->affineAnimPaused = TRUE;\n            }\n            else\n            {\n                sprite->data[3]++;\n                sprite->affineAnimPaused = TRUE;\n            }\n        }\n        break;\n    case 6:\n    default:\n        if (++sprite->data[5] == 31)\n        {\n            sprite->data[5] = 0;\n            sprite->data[3] &= -0x100;\n            StartSpriteAffineAnim(sprite, 3);\n            if (sprite->data[4] < 0)\n                StartSpriteAffineAnim(sprite, 2);\n            else\n                StartSpriteAffineAnim(sprite, 1);\n\n            PlaySE(SE_BALL);\n        }\n        break;\n    }\n}\n\nstatic void SpriteCB_ThrowBall_DelayThenBreakOut(struct Sprite *sprite)\n{\n    if (++sprite->data[5] == 31)\n    {\n        sprite->data[5] = 0;\n        sprite->callback = SpriteCB_ThrowBall_BeginBreakOut;\n    }\n}\n\nstatic void SpriteCB_ThrowBall_InitClick(struct Sprite *sprite)\n{\n    sprite->animPaused = TRUE;\n    sprite->callback = SpriteCB_ThrowBall_DoClick;\n    sprite->data[3] = 0;\n    sprite->data[4] = 0;\n    sprite->data[5] = 0;\n}\n\nstatic void SpriteCB_ThrowBall_DoClick(struct Sprite *sprite)\n{\n    u8 *battler = &gBattleAnimTarget;\n\n    sprite->data[4]++;\n    if (sprite->data[4] == 40)\n    {\n        PlaySE(SE_BALL_CLICK);\n        BlendPalettes(0x10000 << sprite->oam.paletteNum, 6, RGB_BLACK);\n        CreateStarsWhenBallClicks(sprite);\n    }\n    else if (sprite->data[4] == 60)\n    {\n        BeginNormalPaletteFade(0x10000 << sprite->oam.paletteNum, 2, 6, 0, RGB_BLACK);\n    }\n    else if (sprite->data[4] == 95)\n    {\n        gDoingBattleAnim = FALSE;\n        UpdateOamPriorityInAllHealthboxes(1);\n        m4aMPlayAllStop();\n        PlaySE(MUS_CAUGHT_INTRO);\n    }\n    else if (sprite->data[4] == 315)\n    {\n        FreeOamMatrix(gSprites[gBattlerSpriteIds[*battler]].oam.matrixNum);\n        DestroySprite(&gSprites[gBattlerSpriteIds[*battler]]);\n        sprite->data[0] = 0;\n        sprite->callback = SpriteCB_ThrowBall_FinishClick;\n    }\n}\n\nstatic void SpriteCB_ThrowBall_FinishClick(struct Sprite *sprite)\n{\n    u8 paletteIndex;\n\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->data[1] = 0;\n        sprite->data[2] = 0;\n        sprite->oam.objMode = ST_OAM_OBJ_BLEND;\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));\n        paletteIndex = IndexOfSpritePaletteTag(sprite->template->paletteTag);\n        BeginNormalPaletteFade(1 << (paletteIndex + 0x10), 0, 0, 16, RGB_WHITE);\n        sprite->data[0]++;\n        break;\n    case 1:\n        if (sprite->data[1]++ > 0)\n        {\n            sprite->data[1] = 0;\n            sprite->data[2]++;\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[2], sprite->data[2]));\n            if (sprite->data[2] == 16)\n                sprite->data[0]++;\n        }\n        break;\n    case 2:\n        sprite->invisible = TRUE;\n        sprite->data[0]++;\n        break;\n    default:\n        if (!gPaletteFade.active)\n        {\n            SetGpuReg(REG_OFFSET_BLDCNT, 0);\n            SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n            sprite->data[0] = 0;\n            sprite->callback = BattleAnimObj_SignalEnd;\n        }\n        break;\n    }\n}\n\nstatic void BattleAnimObj_SignalEnd(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        sprite->data[0] = -1;\n    }\n    else\n    {\n        FreeSpriteOamMatrix(sprite);\n        DestroySprite(sprite);\n    }\n}\n\nstatic void CreateStarsWhenBallClicks(struct Sprite *sprite)\n{\n    u32 i;\n    u8 subpriority;\n\n    if (sprite->subpriority)\n    {\n        subpriority = sprite->subpriority - 1;\n    }\n    else\n    {\n        subpriority = 0;\n        sprite->subpriority = 1;\n    }\n\n    LoadBallParticleGfx(BALL_MASTER);\n    for (i = 0; i < 3; i++)\n    {\n        u8 spriteId = CreateSprite(&sBallParticlesSpriteTemplates[BALL_MASTER], sprite->x, sprite->y, subpriority);\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].sTransl_Speed = 24;\n            gSprites[spriteId].sTransl_DestX = sprite->x + sCaptureStar[i].xOffset;\n            gSprites[spriteId].sTransl_DestY = sprite->y + sCaptureStar[i].yOffset;\n            gSprites[spriteId].sTransl_ArcAmpl = sCaptureStar[i].amplitude;\n            InitAnimArcTranslation(&gSprites[spriteId]);\n            gSprites[spriteId].callback = SpriteCB_BallCaptureSuccessStar;\n            StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[BALL_MASTER]);\n        }\n    }\n}\n\nstatic void SpriteCB_BallCaptureSuccessStar(struct Sprite *sprite)\n{\n    sprite->invisible = !sprite->invisible;\n    if (TranslateAnimHorizontalArc(sprite))\n        DestroySprite(sprite);\n}\n\nstatic void SpriteCB_ThrowBall_BeginBreakOut(struct Sprite *sprite)\n{\n    u8 ballId;\n\n    StartSpriteAnim(sprite, 1);\n    StartSpriteAffineAnim(sprite, 0);\n    sprite->callback = SpriteCB_ThrowBall_RunBreakOut;\n    ballId = ItemIdToBallId(gLastUsedItem);\n    switch (ballId)\n    {\n    case 0 ... POKEBALL_COUNT - 1:\n        AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId);\n        LaunchBallFadeMonTask(1, gBattleAnimTarget, 14, ballId);\n        break;\n    }\n\n    gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = FALSE;\n    StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], 1);\n    AnimateSprite(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]]);\n    gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] = 0x1000;\n}\n\nstatic void SpriteCB_ThrowBall_RunBreakOut(struct Sprite *sprite)\n{\n    bool32 next = FALSE;\n\n    if (sprite->animEnded)\n        sprite->invisible = TRUE;\n\n    if (gSprites[gBattlerSpriteIds[gBattleAnimTarget]].affineAnimEnded)\n    {\n        StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], 0);\n        next = TRUE;\n    }\n    else\n    {\n        gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] -= 288;\n        gSprites[gBattlerSpriteIds[gBattleAnimTarget]].y2 = gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] >> 8;\n    }\n\n    if (sprite->animEnded && next)\n    {\n        gSprites[gBattlerSpriteIds[gBattleAnimTarget]].y2 = 0;\n        gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = gBattleSpritesDataPtr->animationData->wildMonInvisible;\n        sprite->data[0] = 0;\n        sprite->callback = BattleAnimObj_SignalEnd;\n        gDoingBattleAnim = FALSE;\n        UpdateOamPriorityInAllHealthboxes(1);\n    }\n}\n\nstatic void TrainerBallBlock(struct Sprite *sprite)\n{\n    int i;\n\n    sprite->x += sprite->x2;\n    sprite->y += sprite->y2;\n    sprite->x2 = sprite->y2 = 0;\n    for (i = 0; i < 6; i++)\n        sprite->data[i] = 0;\n\n    sprite->callback = TrainerBallBlock2;\n}\n\nstatic void TrainerBallBlock2(struct Sprite *sprite)\n{\n    s16 var0 = sprite->data[0] + 0x800;\n    s16 var1 = sprite->data[1] + 0x680;\n    \n    sprite->x2 -= var1 >> 8;\n    sprite->y2 += var0 >> 8;\n    sprite->data[0] = (sprite->data[0] + 0x800) & 0xFF;\n    sprite->data[1] = (sprite->data[1] + 0x680) & 0xFF;\n    if (sprite->y + sprite->y2 > 160\n     || sprite->x + sprite->x2 < -8)\n    {\n        sprite->data[0] = 0;\n        sprite->callback = BattleAnimObj_SignalEnd;\n        gDoingBattleAnim = FALSE;\n        UpdateOamPriorityInAllHealthboxes(1);\n    }\n}\n\nstatic void GhostBallDodge(struct Sprite *sprite)\n{\n    sprite->x += sprite->x2;\n    sprite->y += sprite->y2;\n    sprite->x2 = sprite->y2 = 0;\n    sprite->data[0] = 0x22;\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = sprite->x - 8;\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = 0x90;\n    sprite->data[5] = 0x20;\n    InitAnimArcTranslation(sprite);\n    TranslateAnimVerticalArc(sprite);\n    sprite->callback = GhostBallDodge2;\n}\n\nstatic void GhostBallDodge2(struct Sprite *sprite)\n{\n    if (!TranslateAnimVerticalArc(sprite))\n    {\n        if ((sprite->y + sprite->y2) < 65)\n            return;\n    }\n    \n    sprite->data[0] = 0;\n    sprite->callback = BattleAnimObj_SignalEnd;\n    gDoingBattleAnim = FALSE;\n    UpdateOamPriorityInAllHealthboxes(1);\n}\n\nstatic void LoadBallParticleGfx(u8 ballId)\n{\n    if (GetSpriteTileStartByTag(gBallParticleSpritesheets[ballId].tag) == 0xFFFF)\n    {\n        LoadCompressedSpriteSheetUsingHeap(&gBallParticleSpritesheets[ballId]);\n        LoadCompressedSpritePaletteUsingHeap(&gBallParticlePalettes[ballId]);\n    }\n}\n\nu8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId)\n{\n    u8 taskId;\n\n    LoadBallParticleGfx(ballId);\n    taskId = CreateTask(sBallParticleAnimationFuncs[ballId], 5);\n    gTasks[taskId].data[1] = x;\n    gTasks[taskId].data[2] = y;\n    gTasks[taskId].data[3] = priority;\n    gTasks[taskId].data[4] = subpriority;\n    gTasks[taskId].data[15] = ballId;\n    PlaySE(SE_BALL_OPEN);\n    return taskId;\n}\n\nstatic void IncrementBattleParticleCounter(void)\n{\n    if (gMain.inBattle)\n        gBattleSpritesDataPtr->animationData->numBallParticles++;\n}\n\nstatic void PokeBallOpenParticleAnimation(u8 taskId)\n{\n    u8 spriteId;\n    u8 x, y;\n    u8 priority, subpriority;\n    u8 ballId;\n    u8 var0;\n\n    ballId = gTasks[taskId].data[15];\n    if (gTasks[taskId].data[0] < 16)\n    {\n        x = gTasks[taskId].data[1];\n        y = gTasks[taskId].data[2];\n        priority = gTasks[taskId].data[3];\n        subpriority = gTasks[taskId].data[4];\n\n        spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);\n        if (spriteId != MAX_SPRITES)\n        {\n            IncrementBattleParticleCounter();\n            StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);\n            gSprites[spriteId].callback = PokeBallOpenParticleAnimation_Step1;\n            gSprites[spriteId].oam.priority = priority;\n\n            var0 = (u8)gTasks[taskId].data[0];\n            if (var0 >= 8)\n                var0 -= 8;\n\n            gSprites[spriteId].data[0] = var0 * 32;\n        }\n\n        if (gTasks[taskId].data[0] == 15)\n        {\n            if (!gMain.inBattle)\n                gSprites[spriteId].data[7] = 1;\n\n            DestroyTask(taskId);\n            return;\n        }\n    }\n\n    gTasks[taskId].data[0]++;\n}\n\nstatic void PokeBallOpenParticleAnimation_Step1(struct Sprite *sprite)\n{\n    if (sprite->data[1] == 0)\n        sprite->callback = PokeBallOpenParticleAnimation_Step2;\n    else\n        sprite->data[1]--;\n}\n\nstatic void PokeBallOpenParticleAnimation_Step2(struct Sprite *sprite)\n{\n    sprite->x2 = Sin(sprite->data[0], sprite->data[1]);\n    sprite->y2 = Cos(sprite->data[0], sprite->data[1]);\n    sprite->data[1] += 2;\n    if (sprite->data[1] == 50)\n        DestroyBallOpenAnimationParticle(sprite);\n}\n\nstatic void TimerBallOpenParticleAnimation(u8 taskId)\n{\n    u32 i;\n    u8 x, y, priority, subpriority, ballId;\n    u8 spriteId;\n\n    ballId = gTasks[taskId].data[15];\n    x = gTasks[taskId].data[1];\n    y = gTasks[taskId].data[2];\n    priority = gTasks[taskId].data[3];\n    subpriority = gTasks[taskId].data[4];\n\n    for (i = 0; i < 8; i++)\n    {\n        spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);\n        if (spriteId != MAX_SPRITES)\n        {\n            IncrementBattleParticleCounter();\n            StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);\n            gSprites[spriteId].callback = FanOutBallOpenParticles_Step1;\n            gSprites[spriteId].oam.priority = priority;\n            gSprites[spriteId].data[0] = i * 32;\n            gSprites[spriteId].data[4] = 10;\n            gSprites[spriteId].data[5] = 2;\n            gSprites[spriteId].data[6] = 1;\n        }\n    }\n\n    if (!gMain.inBattle)\n        gSprites[spriteId].data[7] = 1;\n\n    DestroyTask(taskId);\n}\n\nstatic void DiveBallOpenParticleAnimation(u8 taskId)\n{\n    u32 i;\n    u8 x, y, priority, subpriority, ballId;\n    u8 spriteId;\n\n    ballId = gTasks[taskId].data[15];\n    x = gTasks[taskId].data[1];\n    y = gTasks[taskId].data[2];\n    priority = gTasks[taskId].data[3];\n    subpriority = gTasks[taskId].data[4];\n\n    for (i = 0; i < 8; i++)\n    {\n        spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);\n        if (spriteId != MAX_SPRITES)\n        {\n            IncrementBattleParticleCounter();\n            StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);\n            gSprites[spriteId].callback = FanOutBallOpenParticles_Step1;\n            gSprites[spriteId].oam.priority = priority;\n            gSprites[spriteId].data[0] = i * 32;\n            gSprites[spriteId].data[4] = 10;\n            gSprites[spriteId].data[5] = 1;\n            gSprites[spriteId].data[6] = 2;\n        }\n    }\n\n    if (!gMain.inBattle)\n        gSprites[spriteId].data[7] = 1;\n\n    DestroyTask(taskId);\n}\n\n// Also used for Net Ball\nstatic void SafariBallOpenParticleAnimation(u8 taskId)\n{\n    u32 i;\n    u8 x, y, priority, subpriority, ballId;\n    u8 spriteId;\n\n    ballId = gTasks[taskId].data[15];\n    x = gTasks[taskId].data[1];\n    y = gTasks[taskId].data[2];\n    priority = gTasks[taskId].data[3];\n    subpriority = gTasks[taskId].data[4];\n\n    for (i = 0; i < 8; i++)\n    {\n        spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);\n        if (spriteId != MAX_SPRITES)\n        {\n            IncrementBattleParticleCounter();\n            StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);\n            gSprites[spriteId].callback = FanOutBallOpenParticles_Step1;\n            gSprites[spriteId].oam.priority = priority;\n            gSprites[spriteId].data[0] = i * 32;\n            gSprites[spriteId].data[4] = 4;\n            gSprites[spriteId].data[5] = 1;\n            gSprites[spriteId].data[6] = 1;\n        }\n    }\n\n    if (!gMain.inBattle)\n        gSprites[spriteId].data[7] = 1;\n\n    DestroyTask(taskId);\n}\n\n// Also used for Nest Ball\nstatic void UltraBallOpenParticleAnimation(u8 taskId)\n{\n    u32 i;\n    u8 x, y, priority, subpriority, ballId;\n    u8 spriteId;\n\n    ballId = gTasks[taskId].data[15];\n    x = gTasks[taskId].data[1];\n    y = gTasks[taskId].data[2];\n    priority = gTasks[taskId].data[3];\n    subpriority = gTasks[taskId].data[4];\n\n    for (i = 0; i < 10; i++)\n    {\n        spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);\n        if (spriteId != MAX_SPRITES)\n        {\n            IncrementBattleParticleCounter();\n            StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);\n            gSprites[spriteId].callback = FanOutBallOpenParticles_Step1;\n            gSprites[spriteId].oam.priority = priority;\n            gSprites[spriteId].data[0] = i * 25;\n            gSprites[spriteId].data[4] = 5;\n            gSprites[spriteId].data[5] = 1;\n            gSprites[spriteId].data[6] = 1;\n        }\n    }\n\n    if (!gMain.inBattle)\n        gSprites[spriteId].data[7] = 1;\n\n    DestroyTask(taskId);\n}\n\n// Also used for Luxury Ball\nstatic void GreatBallOpenParticleAnimation(u8 taskId)\n{\n    u32 i;\n    u8 x, y, priority, subpriority, ballId;\n    u8 spriteId;\n\n    if (gTasks[taskId].data[7])\n    {\n        gTasks[taskId].data[7]--;\n    }\n    else\n    {\n        ballId = gTasks[taskId].data[15];\n        x = gTasks[taskId].data[1];\n        y = gTasks[taskId].data[2];\n        priority = gTasks[taskId].data[3];\n        subpriority = gTasks[taskId].data[4];\n\n        for (i = 0; i < 8; i++)\n        {\n            spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);\n            if (spriteId != MAX_SPRITES)\n            {\n                IncrementBattleParticleCounter();\n                StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);\n                gSprites[spriteId].callback = FanOutBallOpenParticles_Step1;\n                gSprites[spriteId].oam.priority = priority;\n                gSprites[spriteId].data[0] = i * 32;\n                gSprites[spriteId].data[4] = 8;\n                gSprites[spriteId].data[5] = 2;\n                gSprites[spriteId].data[6] = 2;\n            }\n        }\n\n        gTasks[taskId].data[7] = 8;\n        if (++gTasks[taskId].data[0] == 2)\n        {\n            if (!gMain.inBattle)\n                gSprites[spriteId].data[7] = 1;\n\n            DestroyTask(taskId);\n        }\n    }\n}\n\nstatic void FanOutBallOpenParticles_Step1(struct Sprite *sprite)\n{\n    sprite->x2 = Sin(sprite->data[0], sprite->data[1]);\n    sprite->y2 = Cos(sprite->data[0], sprite->data[2]);\n    sprite->data[0] = (sprite->data[0] + sprite->data[4]) & 0xFF;\n    sprite->data[1] += sprite->data[5];\n    sprite->data[2] += sprite->data[6];\n    if (++sprite->data[3] == 51)\n        DestroyBallOpenAnimationParticle(sprite);\n}\n\nstatic void RepeatBallOpenParticleAnimation(u8 taskId)\n{\n    u32 i;\n    u8 x, y, priority, subpriority, ballId;\n    u8 spriteId;\n\n    ballId = gTasks[taskId].data[15];\n    x = gTasks[taskId].data[1];\n    y = gTasks[taskId].data[2];\n    priority = gTasks[taskId].data[3];\n    subpriority = gTasks[taskId].data[4];\n\n    for (i = 0; i < POKEBALL_COUNT; i++)\n    {\n        spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);\n        if (spriteId != MAX_SPRITES)\n        {\n            IncrementBattleParticleCounter();\n            StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);\n            gSprites[spriteId].callback = RepeatBallOpenParticleAnimation_Step1;\n            gSprites[spriteId].oam.priority = priority;\n            gSprites[spriteId].data[0] = i * 21;\n        }\n    }\n\n    if (!gMain.inBattle)\n        gSprites[spriteId].data[7] = 1;\n\n    DestroyTask(taskId);\n}\n\nstatic void RepeatBallOpenParticleAnimation_Step1(struct Sprite *sprite)\n{\n    sprite->x2 = Sin(sprite->data[0], sprite->data[1]);\n    sprite->y2 = Cos(sprite->data[0], Sin(sprite->data[0], sprite->data[2]));\n    sprite->data[0] = (sprite->data[0] + 6) & 0xFF;\n    sprite->data[1]++;\n    sprite->data[2]++;\n    if (++sprite->data[3] == 51)\n        DestroyBallOpenAnimationParticle(sprite);\n}\n\nstatic void MasterBallOpenParticleAnimation(u8 taskId)\n{\n    u8 i, j;\n    u8 x, y, priority, subpriority, ballId;\n    u8 spriteId;\n\n    ballId = gTasks[taskId].data[15];\n    x = gTasks[taskId].data[1];\n    y = gTasks[taskId].data[2];\n    priority = gTasks[taskId].data[3];\n    subpriority = gTasks[taskId].data[4];\n\n    for (j = 0; j < 2; j++)\n    {\n        for (i = 0; i < 8; i++)\n        {\n            spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);\n            if (spriteId != MAX_SPRITES)\n            {\n                IncrementBattleParticleCounter();\n                StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);\n                gSprites[spriteId].callback = FanOutBallOpenParticles_Step1;\n                gSprites[spriteId].oam.priority = priority;\n                gSprites[spriteId].data[0] = i * 32;\n                gSprites[spriteId].data[4] = 8;\n\n                if (j == 0)\n                {\n                    gSprites[spriteId].data[5] = 2;\n                    gSprites[spriteId].data[6] = 1;\n                }\n                else\n                {\n                    gSprites[spriteId].data[5] = 1;\n                    gSprites[spriteId].data[6] = 2;\n                }\n            }\n        }\n    }\n\n    if (!gMain.inBattle)\n        gSprites[spriteId].data[7] = 1;\n\n    DestroyTask(taskId);\n}\n\nstatic void PremierBallOpenParticleAnimation(u8 taskId)\n{\n    u32 i;\n    u8 x, y, priority, subpriority, ballId;\n    u8 spriteId;\n\n    ballId = gTasks[taskId].data[15];\n    x = gTasks[taskId].data[1];\n    y = gTasks[taskId].data[2];\n    priority = gTasks[taskId].data[3];\n    subpriority = gTasks[taskId].data[4];\n\n    for (i = 0; i < 8; i++)\n    {\n        spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);\n        if (spriteId != MAX_SPRITES)\n        {\n            IncrementBattleParticleCounter();\n            StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);\n            gSprites[spriteId].callback = PremierBallOpenParticleAnimation_Step1;\n            gSprites[spriteId].oam.priority = priority;\n            gSprites[spriteId].data[0] = i * 32;\n        }\n    }\n\n    if (!gMain.inBattle)\n        gSprites[spriteId].data[7] = 1;\n\n    DestroyTask(taskId);\n}\n\nstatic void PremierBallOpenParticleAnimation_Step1(struct Sprite *sprite)\n{\n    sprite->x2 = Sin(sprite->data[0], sprite->data[1]);\n    sprite->y2 = Cos(sprite->data[0], Sin(sprite->data[0] & 0x3F, sprite->data[2]));\n    sprite->data[0] = (sprite->data[0] + 10) & 0xFF;\n    sprite->data[1]++;\n    sprite->data[2]++;\n    if (++sprite->data[3] == 51)\n        DestroyBallOpenAnimationParticle(sprite);\n}\n\nstatic void DestroyBallOpenAnimationParticle(struct Sprite *sprite)\n{\n    int i, j;\n\n    if (!gMain.inBattle)\n    {\n        if (sprite->data[7] == 1)\n            DestroySpriteAndFreeResources(sprite);\n        else\n            DestroySprite(sprite);\n    }\n    else\n    {\n        gBattleSpritesDataPtr->animationData->numBallParticles--;\n        if (gBattleSpritesDataPtr->animationData->numBallParticles == 0)\n        {\n            for (j = 0; j < POKEBALL_COUNT; j++)\n            {\n                FreeSpriteTilesByTag(gBallParticleSpritesheets[j].tag);\n                FreeSpritePaletteByTag(gBallParticlePalettes[j].tag);\n            }\n\n            DestroySprite(sprite);\n        }\n        else\n        {\n            DestroySprite(sprite);\n        }\n    }\n}\n\nu8 LaunchBallFadeMonTask(bool8 unfadeLater, u8 battler, u32 selectedPalettes, u8 ballId)\n{\n    u8 taskId;\n\n    taskId = CreateTask(Task_FadeMon_ToBallColor, 5);\n    gTasks[taskId].data[15] = ballId;\n    gTasks[taskId].data[3] = battler;\n    gTasks[taskId].data[10] = selectedPalettes;\n    gTasks[taskId].data[11] = selectedPalettes >> 16;\n\n    if (!unfadeLater)\n    {\n        BlendPalette(OBJ_PLTT_ID(battler), 16, 0, sBallOpenFadeColors[ballId]);\n        gTasks[taskId].data[1] = 1;\n    }\n    else\n    {\n        BlendPalette(OBJ_PLTT_ID(battler), 16, 16, sBallOpenFadeColors[ballId]);\n        gTasks[taskId].data[0] = 16;\n        gTasks[taskId].data[1] = -1;\n        gTasks[taskId].func = Task_FadeMon_ToNormal;\n    }\n\n    BeginNormalPaletteFade(selectedPalettes, 0, 0, 16, RGB_WHITE);\n    return taskId;\n}\n\nstatic void Task_FadeMon_ToBallColor(u8 taskId)\n{\n    u8 ballId = gTasks[taskId].data[15];\n\n    if (gTasks[taskId].data[2] <= 16)\n    {\n        BlendPalette(OBJ_PLTT_ID(gTasks[taskId].data[3]), 16, gTasks[taskId].data[0], sBallOpenFadeColors[ballId]);\n        gTasks[taskId].data[0] += gTasks[taskId].data[1];\n        gTasks[taskId].data[2]++;\n    }\n    else if (!gPaletteFade.active)\n    {\n        u32 selectedPalettes = (u16)gTasks[taskId].data[10] | ((u16)gTasks[taskId].data[11] << 16);\n        BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB_WHITE);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_FadeMon_ToNormal(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        u32 selectedPalettes = (u16)gTasks[taskId].data[10] | ((u16)gTasks[taskId].data[11] << 16);\n        BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB_WHITE);\n        gTasks[taskId].func = Task_FadeMon_ToNormal_Step;\n    }\n}\n\nstatic void Task_FadeMon_ToNormal_Step(u8 taskId)\n{\n    u8 ballId = gTasks[taskId].data[15];\n\n    if (gTasks[taskId].data[2] <= 16)\n    {\n        BlendPalette(OBJ_PLTT_ID(gTasks[taskId].data[3]), 16, gTasks[taskId].data[0], sBallOpenFadeColors[ballId]);\n        gTasks[taskId].data[0] += gTasks[taskId].data[1];\n        gTasks[taskId].data[2]++;\n    }\n    else\n    {\n        DestroyTask(taskId);\n    }\n}\n\nvoid AnimTask_SwapMonSpriteToFromSubstitute(u8 taskId)\n{\n    u8 spriteId;\n    u32 x;\n    bool32 done = FALSE;\n\n    spriteId = gBattlerSpriteIds[gBattleAnimAttacker];\n    switch (gTasks[taskId].data[10])\n    {\n    case 0:\n        gTasks[taskId].data[11] = gBattleAnimArgs[0];\n        gTasks[taskId].data[0] += 0x500;\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            gSprites[spriteId].x2 += gTasks[taskId].data[0] >> 8;\n        else\n            gSprites[spriteId].x2 -= gTasks[taskId].data[0] >> 8;\n\n        gTasks[taskId].data[0] &= 0xFF;\n        x = gSprites[spriteId].x + gSprites[spriteId].x2 + 32;\n        if (x > 304)\n            gTasks[taskId].data[10]++;\n        break;\n    case 1:\n        LoadBattleMonGfxAndAnimate(gBattleAnimAttacker, gTasks[taskId].data[11], spriteId);\n        gTasks[taskId].data[10]++;\n        break;\n    case 2:\n        gTasks[taskId].data[0] += 0x500;\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n            gSprites[spriteId].x2 -= gTasks[taskId].data[0] >> 8;\n        else\n            gSprites[spriteId].x2 += gTasks[taskId].data[0] >> 8;\n\n        gTasks[taskId].data[0] &= 0xFF;\n        if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        {\n            if (gSprites[spriteId].x2 <= 0)\n            {\n                gSprites[spriteId].x2 = 0;\n                done = TRUE;\n            }\n        }\n        else\n        {\n            if (gSprites[spriteId].x2 >= 0)\n            {\n                gSprites[spriteId].x2 = 0;\n                done = TRUE;\n            }\n        }\n\n        if (done)\n            DestroyAnimVisualTask(taskId);\n\n        break;\n    }\n}\n\nvoid AnimTask_SubstituteFadeToInvisible(u8 taskId)\n{\n    u8 spriteId;\n\n    switch (gTasks[taskId].data[15])\n    {\n    case 0:\n        if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == B_POSITION_OPPONENT_LEFT)\n            SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n        else\n            SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));\n        gTasks[taskId].data[15]++;\n        break;\n    case 1:\n        if (gTasks[taskId].data[1]++ > 1)\n        {\n            gTasks[taskId].data[1] = 0;\n            gTasks[taskId].data[0]++;\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - gTasks[taskId].data[0], gTasks[taskId].data[0]));\n            if (gTasks[taskId].data[0] == 16)\n                gTasks[taskId].data[15]++;\n        }\n        break;\n    case 2:\n        spriteId = gBattlerSpriteIds[gBattleAnimAttacker];\n        RequestDma3Fill(0, (void *)OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * TILE_SIZE_4BPP, 0x800, DMA3_32BIT);\n        ClearBehindSubstituteBit(gBattleAnimAttacker);\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nvoid AnimTask_IsAttackerBehindSubstitute(u8 taskId)\n{\n    gBattleAnimArgs[ARG_RET_ID] = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].behindSubstitute;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_SetTargetToEffectBattler(u8 taskId)\n{\n    gBattleAnimTarget = gEffectBattler;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid TryShinyAnimation(u8 battler, struct Pokemon *mon)\n{\n    bool32 isShiny;\n    u32 otId, personality;\n    u32 shinyValue;\n    u8 taskId1, taskId2;\n\n    isShiny = FALSE;\n    gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = TRUE;\n    otId = GetMonData(mon, MON_DATA_OT_ID);\n    personality = GetMonData(mon, MON_DATA_PERSONALITY);\n\n    if (IsBattlerSpriteVisible(battler))\n    {\n        shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);\n        if (shinyValue < SHINY_ODDS)\n            isShiny = TRUE;\n\n        if (isShiny)\n        {\n            if (GetSpriteTileStartByTag(ANIM_TAG_GOLD_STARS) == 0xFFFF)\n            {\n                LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[ANIM_TAG_GOLD_STARS - ANIM_SPRITES_START]);\n                LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[ANIM_TAG_GOLD_STARS - ANIM_SPRITES_START]);\n            }\n\n            taskId1 = CreateTask(AnimTask_ShinySparkles, 10);\n            taskId2 = CreateTask(AnimTask_ShinySparkles, 10);\n            gTasks[taskId1].data[0] = battler;\n            gTasks[taskId2].data[0] = battler;\n            gTasks[taskId1].data[1] = 0;\n            gTasks[taskId2].data[1] = 1;\n            return;\n        }\n    }\n\n    gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = TRUE;\n}\n\nstatic void AnimTask_ShinySparkles(u8 taskId)\n{\n    u8 battler;\n    u8 x, y;\n    u8 spriteId;\n    u16 counter;\n    s16 state;\n    u8 pan;\n\n    if (gTasks[taskId].data[13] < 60)\n    {\n        gTasks[taskId].data[13]++;\n        return;\n    }\n\n    if (gBattleSpritesDataPtr->animationData->numBallParticles)\n        return;\n\n    counter = gTasks[taskId].data[10]++;\n    if (counter & 3)\n        return;\n\n    battler = gTasks[taskId].data[0];\n    x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X);\n    y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y);\n    state = gTasks[taskId].data[11];\n    if (state == 0)\n    {\n        spriteId = CreateSprite(&gWishStarSpriteTemplate, x, y, 5);\n    }\n    else if (state >= 0 && gTasks[taskId].data[11] < 4)\n    {\n        spriteId = CreateSprite(&gMiniTwinklingStarSpriteTemplate, x, y, 5);\n        gSprites[spriteId].oam.tileNum += 4;\n    }\n    else\n    {\n        spriteId = CreateSprite(&gMiniTwinklingStarSpriteTemplate, x, y, 5);\n        gSprites[spriteId].oam.tileNum += 5;\n    }\n\n    if (gTasks[taskId].data[1] == FALSE)\n    {\n        gSprites[spriteId].callback = SpriteCB_ShinySparkles_1;\n    }\n    else\n    {\n        gSprites[spriteId].callback = SpriteCB_ShinySparkles_2;\n        gSprites[spriteId].x2 = -32;\n        gSprites[spriteId].y2 = 32;\n        gSprites[spriteId].invisible = TRUE;\n        if (gTasks[taskId].data[11] == FALSE)\n        {\n            if (GetBattlerSide(battler) == B_SIDE_PLAYER)\n                pan = SOUND_PAN_ATTACKER;\n            else\n                pan = SOUND_PAN_TARGET;\n\n            PlaySE12WithPanning(SE_SHINY, pan);\n        }\n    }\n\n    gSprites[spriteId].data[0] = taskId;\n    gTasks[taskId].data[11]++;\n    if (spriteId != MAX_SPRITES)\n        gTasks[taskId].data[12]++;\n\n    if (gTasks[taskId].data[11] == 5)\n        gTasks[taskId].func = AnimTask_ShinySparkles_WaitSparkles;\n}\n\nstatic void AnimTask_ShinySparkles_WaitSparkles(u8 taskId)\n{\n    u8 battler;\n\n    if (gTasks[taskId].data[12] == FALSE)\n    {\n        if (gTasks[taskId].data[1] == TRUE)\n        {\n            battler = gTasks[taskId].data[0];\n            gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = TRUE;\n        }\n\n        DestroyTask(taskId);\n    }\n}\n\nstatic void SpriteCB_ShinySparkles_1(struct Sprite *sprite)\n{\n    sprite->x2 = Sin(sprite->data[1], 24);\n    sprite->y2 = Cos(sprite->data[1], 24);\n    sprite->data[1] += 12;\n    if (sprite->data[1] > 0xFF)\n    {\n        gTasks[sprite->data[0]].data[12]--;\n        FreeSpriteOamMatrix(sprite);\n        DestroySprite(sprite);\n    }\n}\n\nstatic void SpriteCB_ShinySparkles_2(struct Sprite *sprite)\n{\n    if (sprite->data[1] < 4)\n    {\n        sprite->data[1]++;\n    }\n    else\n    {\n        sprite->invisible = FALSE;\n        sprite->x2 += 5;\n        sprite->y2 -= 5;\n        if (sprite->x2 > 32)\n        {\n            gTasks[sprite->data[0]].data[12]--;\n            FreeSpriteOamMatrix(sprite);\n            DestroySprite(sprite);\n        }\n    }\n}\n\nvoid AnimTask_LoadBaitGfx(u8 taskId)\n{\n    u8 paletteIndex;\n\n    LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[ANIM_TAG_SAFARI_BAIT - ANIM_SPRITES_START]);\n    LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[ANIM_TAG_SAFARI_BAIT - ANIM_SPRITES_START]);\n    paletteIndex = IndexOfSpritePaletteTag(ANIM_TAG_SAFARI_BAIT);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_FreeBaitGfx(u8 taskId)\n{\n    FreeSpriteTilesByTag(ANIM_TAG_SAFARI_BAIT);\n    FreeSpritePaletteByTag(ANIM_TAG_SAFARI_BAIT);\n    DestroyAnimVisualTask(taskId);\n}\n\nstatic void SpriteCB_SafariBaitOrRock_Init(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, 0);\n    sprite->sTransl_Speed = 30;\n    sprite->sTransl_DestX = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), BATTLER_COORD_X) + gBattleAnimArgs[2];\n    sprite->sTransl_DestY = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), BATTLER_COORD_Y) + gBattleAnimArgs[3];\n    sprite->sTransl_ArcAmpl = -32;\n    InitAnimArcTranslation(sprite);\n    gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].callback = SpriteCB_PlayerThrowInit;\n    sprite->callback = SpriteCB_SafariBaitOrRock_WaitPlayerThrow;\n}\n\nstatic void SpriteCB_SafariBaitOrRock_WaitPlayerThrow(struct Sprite *sprite)\n{\n    if (gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].animCmdIndex == 1)\n        sprite->callback = SpriteCB_SafariBaitOrRock_ArcFlight;\n}\n\nstatic void SpriteCB_SafariBaitOrRock_ArcFlight(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n    {\n        sprite->data[0] = 0;\n        sprite->invisible = TRUE;\n        sprite->callback = SpriteCB_SafariBaitOrRock_Finish;\n    }\n}\n\nstatic void SpriteCB_SafariBaitOrRock_Finish(struct Sprite *sprite)\n{\n    if (gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].animEnded)\n    {\n        if (++sprite->data[0] > 0)\n        {\n            StartSpriteAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], 0);\n            DestroyAnimSprite(sprite);\n        }\n    }\n}\n\nvoid AnimTask_SafariOrGhost_DecideAnimSides(u8 taskId)\n{\n    switch (gBattleAnimArgs[0])\n    {\n    case 0:\n        gBattleAnimAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n        gBattleAnimTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        break;\n    case 1:\n        gBattleAnimAttacker = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        gBattleAnimTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n        break;\n    }\n\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_SafariGetReaction(u8 taskId)\n{\n    if (gBattleCommunication[MULTISTRING_CHOOSER] >= NUM_SAFARI_REACTIONS)\n        gBattleAnimArgs[7] = 0;\n    else\n        gBattleAnimArgs[7] = gBattleCommunication[MULTISTRING_CHOOSER];\n    \n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_GetTrappedMoveAnimId(u8 taskId)\n{\n    if (gBattleSpritesDataPtr->animationData->animArg == MOVE_FIRE_SPIN)\n        gBattleAnimArgs[0] = TRAP_ANIM_FIRE_SPIN;\n    else if (gBattleSpritesDataPtr->animationData->animArg == MOVE_WHIRLPOOL)\n        gBattleAnimArgs[0] = TRAP_ANIM_WHIRLPOOL;\n    else if (gBattleSpritesDataPtr->animationData->animArg == MOVE_CLAMP)\n        gBattleAnimArgs[0] = TRAP_ANIM_CLAMP;\n    else if (gBattleSpritesDataPtr->animationData->animArg == MOVE_SAND_TOMB)\n        gBattleAnimArgs[0] = TRAP_ANIM_SAND_TOMB;\n    else\n        gBattleAnimArgs[0] = TRAP_ANIM_BIND;\n\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_GetBattlersFromArg(u8 taskId)\n{\n    gBattleAnimAttacker = gBattleSpritesDataPtr->animationData->animArg;\n    gBattleAnimTarget = gBattleSpritesDataPtr->animationData->animArg >> 8;\n    DestroyAnimVisualTask(taskId);\n}\n"
  },
  {
    "path": "src/battle_anim_status_effects.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"decompress.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"util.h\"\n#include \"constants/battle_anim.h\"\n#include \"constants/pokemon.h\"\n\nstatic u8 Task_FlashingCircleImpacts(u8 battlerId, bool8 b);\nstatic void Task_UpdateFlashingCircleImpacts(u8 taskId);\nstatic void AnimTask_FrozenIceCube_Step1(u8 taskId);\nstatic void AnimTask_FrozenIceCube_Step2(u8 taskId);\nstatic void AnimTask_FrozenIceCube_Step3(u8 taskId);\nstatic void AnimTask_FrozenIceCube_Step4(u8 taskId);\nstatic void Task_DoStatusAnimation(u8 taskId);\nstatic void AnimFlashingCircleImpact(struct Sprite *sprite);\nstatic void AnimFlashingCircleImpact_Step(struct Sprite *sprite);\n\nstatic const union AnimCmd sAnim_FlickeringOrb[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(4, 3),\n    ANIMCMD_FRAME(8, 3),\n    ANIMCMD_FRAME(12, 3),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_FlickeringOrb[] =\n{\n    sAnim_FlickeringOrb\n};\n\n// Unused\nstatic const struct SpriteTemplate sFlickeringOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ORB,\n    .paletteTag = ANIM_TAG_ORB,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sAnims_FlickeringOrb,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimTranslateLinearAndFlicker,\n};\n\n// Unused\nstatic const struct SpriteTemplate sFlickeringOrbFlippedSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ORB,\n    .paletteTag = ANIM_TAG_ORB,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sAnims_FlickeringOrb,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimTranslateLinearAndFlicker_Flipped,\n};\n\nstatic const union AnimCmd sAnim_WeatherBallNormal[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_WeatherBallNormal[] =\n{\n    sAnim_WeatherBallNormal\n};\n\nconst struct SpriteTemplate gWeatherBallUpSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WEATHER_BALL,\n    .paletteTag = ANIM_TAG_WEATHER_BALL,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_WeatherBallNormal,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWeatherBallUp,\n};\n\nconst struct SpriteTemplate gWeatherBallNormalDownSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WEATHER_BALL,\n    .paletteTag = ANIM_TAG_WEATHER_BALL,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_WeatherBallNormal,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWeatherBallDown,\n};\n\nstatic const union AnimCmd sAnim_SpinningSparkle[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(48, 3),\n    ANIMCMD_FRAME(64, 3),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_SpinningSparkle[] =\n{\n    sAnim_SpinningSparkle\n};\n\nconst struct SpriteTemplate gSpinningSparkleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SPARKLE_4,\n    .paletteTag = ANIM_TAG_SPARKLE_4,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_SpinningSparkle,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSpinningSparkle,\n};\n\n// Unused\nstatic const struct SpriteTemplate sFlickeringFootSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_MONSTER_FOOT,\n    .paletteTag = ANIM_TAG_MONSTER_FOOT,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimTranslateLinearAndFlicker,\n};\n\nstatic const union AnimCmd sAnim_FlickeringImpact_0[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_FlickeringImpact_1[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_FlickeringImpact_2[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_FlickeringImpact[] =\n{\n    sAnim_FlickeringImpact_0,\n    sAnim_FlickeringImpact_1,\n    sAnim_FlickeringImpact_2\n};\n\n// Unused\nstatic const struct SpriteTemplate sFlickeringImpactSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_IMPACT,\n    .paletteTag = ANIM_TAG_IMPACT,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_FlickeringImpact,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimTranslateLinearAndFlicker,\n};\n\nstatic const union AnimCmd sAnim_FlickeringShrinkOrb[] =\n{\n    ANIMCMD_FRAME(0, 15),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_FlickeringShrinkOrb[] =\n{\n    sAnim_FlickeringShrinkOrb\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlickeringShrinkOrb[] =\n{\n    AFFINEANIMCMD_FRAME(96, 96, 0, 0),\n    AFFINEANIMCMD_FRAME(2, 2, 0, 1),\n    AFFINEANIMCMD_JUMP(1)\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_FlickeringShrinkOrb[] =\n{\n    sAffineAnim_FlickeringShrinkOrb\n};\n\n// Unused\nstatic const struct SpriteTemplate sFlickeringShrinkOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ORB,\n    .paletteTag = ANIM_TAG_ORB,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x16,\n    .anims = sAnims_FlickeringShrinkOrb,\n    .images = NULL,\n    .affineAnims = sAffineAnims_FlickeringShrinkOrb,\n    .callback = AnimTranslateLinearAndFlicker_Flipped,\n};\n\nstatic const struct Subsprite sFrozenIceCubeSubsprites[] =\n{\n    {.x = -16, .y = -16, .shape = SPRITE_SHAPE(64x64),  .size = SPRITE_SIZE(64x64), .tileOffset =   0, .priority = 2},\n    {.x = -16, .y =  48, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset =  64, .priority = 2},\n    {.x =  48, .y = -16, .shape = SPRITE_SHAPE(32x64), .size = SPRITE_SIZE(32x64), .tileOffset =  96, .priority = 2},\n    {.x =  48, .y =  48, .shape = SPRITE_SHAPE(32x32),  .size = SPRITE_SIZE(32x32), .tileOffset = 128, .priority = 2},\n};\n\nstatic const struct SubspriteTable sFrozenIceCubeSubspriteTable[] =\n{\n    {NELEMS(sFrozenIceCubeSubsprites), sFrozenIceCubeSubsprites},\n};\n\nstatic const struct SpriteTemplate sFrozenIceCubeSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_CUBE,\n    .paletteTag = ANIM_TAG_ICE_CUBE,\n    .oam = &gOamData_AffineOff_ObjBlend_64x64,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const struct SpriteTemplate sFlashingCircleImpactSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_CIRCLE_IMPACT,\n    .paletteTag = ANIM_TAG_CIRCLE_IMPACT,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimFlashingCircleImpact,\n};\n\n// Unused\nstatic u8 Task_FlashingCircleImpacts(u8 battlerId, bool8 b)\n{\n    u8 battlerSpriteId = gBattlerSpriteIds[battlerId];\n    u8 taskId = CreateTask(Task_UpdateFlashingCircleImpacts, 10);\n    u8 spriteId2;\n    u32 i;\n\n    LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]);\n    LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]);\n    gTasks[taskId].data[0] = battlerId;\n    if (b)\n    {\n        gTasks[taskId].data[1] = RGB_RED;\n        for (i = 0; i < 10; i++)\n        {\n            spriteId2 = CreateSprite(&sFlashingCircleImpactSpriteTemplate, gSprites[battlerSpriteId].x, gSprites[battlerSpriteId].y + 32, 0);\n            gSprites[spriteId2].data[0] = i * 51;\n            gSprites[spriteId2].data[1] = -256;\n            gSprites[spriteId2].invisible = TRUE;\n            if (i > 4)\n                gSprites[spriteId2].data[6] = 21;\n        }\n    }\n    else\n    {\n        gTasks[taskId].data[1] = RGB_BLUE;\n        for (i = 0; i < 10; i++)\n        {\n            spriteId2 = CreateSprite(&sFlashingCircleImpactSpriteTemplate, gSprites[battlerSpriteId].x, gSprites[battlerSpriteId].y - 32, 0);\n            gSprites[spriteId2].data[0] = i * 51;\n            gSprites[spriteId2].data[1] = 256;\n            gSprites[spriteId2].invisible = TRUE;\n            if (i > 4)\n                gSprites[spriteId2].data[6] = 21;\n        }\n    }\n    gSprites[spriteId2].data[7] = 1;\n    return taskId;\n}\n\nstatic void Task_UpdateFlashingCircleImpacts(u8 taskId)\n{\n    if (gTasks[taskId].data[2] == 2)\n    {\n        gTasks[taskId].data[2] = 0;\n        BlendPalette(OBJ_PLTT_ID(gTasks[taskId].data[0]), 16, gTasks[taskId].data[4], gTasks[taskId].data[1]);\n        if (gTasks[taskId].data[5] == 0)\n        {\n            gTasks[taskId].data[4]++;\n            if (gTasks[taskId].data[4] > 8)\n                gTasks[taskId].data[5] ^= 1;\n        }\n        else\n        {\n            u16 var = gTasks[taskId].data[4];\n\n            gTasks[taskId].data[4]--;\n            if (gTasks[taskId].data[4] < 0)\n            {\n                gTasks[taskId].data[4] = var;\n                gTasks[taskId].data[5] ^= 1;\n                gTasks[taskId].data[3]++;\n                if (gTasks[taskId].data[3] == 2)\n                    DestroyTask(taskId);\n            }\n        }\n    }\n    else\n    {\n        gTasks[taskId].data[2]++;\n    }\n}\n\nstatic void AnimFlashingCircleImpact(struct Sprite *sprite)\n{\n    if (sprite->data[6] == 0)\n    {\n        sprite->invisible = FALSE;\n        sprite->callback = AnimFlashingCircleImpact_Step;\n        sprite->callback(sprite);\n    }\n    else\n    {\n        sprite->data[6]--;\n    }\n}\n\nstatic void AnimFlashingCircleImpact_Step(struct Sprite *sprite)\n{\n    sprite->x2 = Cos(sprite->data[0], 32);\n    sprite->y2 = Sin(sprite->data[0], 8);\n    if (sprite->data[0] < 128)\n        sprite->subpriority = 29;\n    else\n        sprite->subpriority = 31;\n    sprite->data[0] = (sprite->data[0] + 8) & 0xFF;\n    sprite->data[5] += sprite->data[1];\n    sprite->y2 += sprite->data[5] >> 8;\n    sprite->data[2]++;\n    if (sprite->data[2] == 52)\n    {\n        if (sprite->data[7])\n            DestroySpriteAndFreeResources(sprite);\n        else\n            DestroySprite(sprite);\n    }\n}\n\nvoid AnimTask_FrozenIceCube(u8 taskId)\n{\n    s16 x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) - 32;\n    s16 y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) - 36;\n    u8 spriteId;\n\n    if (IsContest())\n        x -= 6;\n    \n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    spriteId = CreateSprite(&sFrozenIceCubeSpriteTemplate, x, y, 4);\n    if (GetSpriteTileStartByTag(ANIM_TAG_ICE_CUBE) == 0xFFFF)\n        gSprites[spriteId].invisible = TRUE;\n    \n    SetSubspriteTables(&gSprites[spriteId], sFrozenIceCubeSubspriteTable);\n    gTasks[taskId].data[15] = spriteId;\n    gTasks[taskId].func = AnimTask_FrozenIceCube_Step1;\n}\n\nstatic void AnimTask_FrozenIceCube_Step1(u8 taskId)\n{\n    gTasks[taskId].data[1]++;\n    if (gTasks[taskId].data[1] == 10)\n    {\n        gTasks[taskId].func = AnimTask_FrozenIceCube_Step2;\n        gTasks[taskId].data[1] = 0;\n    }\n    else\n    {\n        u8 var = gTasks[taskId].data[1];\n\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(var, 16 - var));\n    }\n}\n\nstatic void AnimTask_FrozenIceCube_Step2(u8 taskId)\n{\n    u8 palIndex = IndexOfSpritePaletteTag(ANIM_TAG_ICE_CUBE);\n\n    if (gTasks[taskId].data[1]++ > 13)\n    {\n        gTasks[taskId].data[2]++;\n        if (gTasks[taskId].data[2] == 3)\n        {\n            u16 temp;\n\n            temp = gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 13];\n            gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 13] = gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 14];\n            gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 14] = gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 15];\n            gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 15] = temp;\n\n            gTasks[taskId].data[2] = 0;\n            gTasks[taskId].data[3]++;\n            if (gTasks[taskId].data[3] == 3)\n            {\n                gTasks[taskId].data[3] = 0;\n                gTasks[taskId].data[1] = 0;\n                gTasks[taskId].data[4]++;\n                if (gTasks[taskId].data[4] == 2)\n                {\n                    gTasks[taskId].data[1] = 9;\n                    gTasks[taskId].func = AnimTask_FrozenIceCube_Step3;\n                }\n            }\n        }\n    }\n}\n\nstatic void AnimTask_FrozenIceCube_Step3(u8 taskId)\n{\n    gTasks[taskId].data[1]--;\n    if (gTasks[taskId].data[1] == -1)\n    {\n        gTasks[taskId].func = AnimTask_FrozenIceCube_Step4;\n        gTasks[taskId].data[1] = 0;\n    }\n    else\n    {\n        u8 var = gTasks[taskId].data[1];\n\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(var, 16 - var));\n    }\n}\n\nstatic void AnimTask_FrozenIceCube_Step4(u8 taskId)\n{\n    gTasks[taskId].data[1]++;\n    if (gTasks[taskId].data[1] == 37)\n    {\n        u8 spriteId = gTasks[taskId].data[15];\n\n        FreeSpriteOamMatrix(&gSprites[spriteId]);\n        DestroySprite(&gSprites[spriteId]);\n    }\n    else if (gTasks[taskId].data[1] == 39)\n    {\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\n#define CASE(by, stat) case (STAT_ANIM_##by + stat - 1)\n\nvoid AnimTask_StatsChange(u8 taskId)\n{\n    bool16 goesDown = FALSE;\n    s16 animStatId = 0;\n    bool16 sharply = FALSE;\n\n    switch (gBattleSpritesDataPtr->animationData->animArg)\n    {\n    CASE(PLUS1,  STAT_ATK):     goesDown = FALSE;  animStatId = 0;  break;\n    CASE(PLUS1,  STAT_DEF):     goesDown = FALSE;  animStatId = 1;  break;\n    CASE(PLUS1,  STAT_SPEED):   goesDown = FALSE;  animStatId = 3;  break;\n    CASE(PLUS1,  STAT_SPATK):   goesDown = FALSE;  animStatId = 5;  break;\n    CASE(PLUS1,  STAT_SPDEF):   goesDown = FALSE;  animStatId = 6;  break;\n    CASE(PLUS1,  STAT_ACC):     goesDown = FALSE;  animStatId = 2;  break;\n    CASE(PLUS1,  STAT_EVASION): goesDown = FALSE;  animStatId = 4;  break;\n\n    CASE(MINUS1, STAT_ATK):     goesDown = TRUE;   animStatId = 0;  break;\n    CASE(MINUS1, STAT_DEF):     goesDown = TRUE;   animStatId = 1;  break;\n    CASE(MINUS1, STAT_SPEED):   goesDown = TRUE;   animStatId = 3;  break;\n    CASE(MINUS1, STAT_SPATK):   goesDown = TRUE;   animStatId = 5;  break;\n    CASE(MINUS1, STAT_SPDEF):   goesDown = TRUE;   animStatId = 6;  break;\n    CASE(MINUS1, STAT_ACC):     goesDown = TRUE;   animStatId = 2;  break;\n    CASE(MINUS1, STAT_EVASION): goesDown = TRUE;   animStatId = 4;  break;\n\n    CASE(PLUS2,  STAT_ATK):     goesDown = FALSE;  animStatId = 0;     sharply = TRUE;   break;\n    CASE(PLUS2,  STAT_DEF):     goesDown = FALSE;  animStatId = 1;     sharply = TRUE;   break;\n    CASE(PLUS2,  STAT_SPEED):   goesDown = FALSE;  animStatId = 3;     sharply = TRUE;   break;\n    CASE(PLUS2,  STAT_SPATK):   goesDown = FALSE;  animStatId = 5;     sharply = TRUE;   break;\n    CASE(PLUS2,  STAT_SPDEF):   goesDown = FALSE;  animStatId = 6;     sharply = TRUE;   break;\n    CASE(PLUS2,  STAT_ACC):     goesDown = FALSE;  animStatId = 2;     sharply = TRUE;   break;\n    CASE(PLUS2,  STAT_EVASION): goesDown = FALSE;  animStatId = 4;     sharply = TRUE;   break;\n\n    CASE(MINUS2, STAT_ATK):     goesDown = TRUE;   animStatId = 0;     sharply = TRUE;   break;\n    CASE(MINUS2, STAT_DEF):     goesDown = TRUE;   animStatId = 1;     sharply = TRUE;   break;\n    CASE(MINUS2, STAT_SPEED):   goesDown = TRUE;   animStatId = 3;     sharply = TRUE;   break;\n    CASE(MINUS2, STAT_SPATK):   goesDown = TRUE;   animStatId = 5;     sharply = TRUE;   break;\n    CASE(MINUS2, STAT_SPDEF):   goesDown = TRUE;   animStatId = 6;     sharply = TRUE;   break;\n    CASE(MINUS2, STAT_ACC):     goesDown = TRUE;   animStatId = 2;     sharply = TRUE;   break;\n    CASE(MINUS2, STAT_EVASION): goesDown = TRUE;   animStatId = 4;     sharply = TRUE;   break;\n\n    case STAT_ANIM_MULTIPLE_PLUS1:  goesDown = FALSE;  animStatId = 0xFF;  sharply = FALSE;  break;\n    case STAT_ANIM_MULTIPLE_PLUS2:  goesDown = FALSE;  animStatId = 0xFF;  sharply = TRUE;   break;\n    case STAT_ANIM_MULTIPLE_MINUS1: goesDown = TRUE;   animStatId = 0xFF;  sharply = FALSE;  break;\n    case STAT_ANIM_MULTIPLE_MINUS2: goesDown = TRUE;   animStatId = 0xFF;  sharply = TRUE;   break;\n\n    default:\n        DestroyAnimVisualTask(taskId);\n        return;\n    }\n\n    gBattleAnimArgs[0] = goesDown;\n    gBattleAnimArgs[1] = animStatId;\n    gBattleAnimArgs[2] = 0;\n    gBattleAnimArgs[3] = 0;\n    gBattleAnimArgs[4] = sharply;\n    gTasks[taskId].func = InitStatsChangeAnimation;\n    InitStatsChangeAnimation(taskId);\n}\n\n#undef CASE\n\nvoid LaunchStatusAnimation(u8 battlerId, u8 statusAnimId)\n{\n    u8 taskId;\n\n    gBattleAnimAttacker = battlerId;\n    gBattleAnimTarget = battlerId;\n    LaunchBattleAnimation(gBattleAnims_StatusConditions, statusAnimId, 0);\n    taskId = CreateTask(Task_DoStatusAnimation, 10);\n    gTasks[taskId].data[0] = battlerId;\n}\n\nstatic void Task_DoStatusAnimation(u8 taskId)\n{\n    gAnimScriptCallback();\n    if (!gAnimScriptActive)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].data[0]].statusAnimActive = FALSE;\n        DestroyTask(taskId);\n    }\n}\n"
  },
  {
    "path": "src/battle_anim_utility_funcs.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"graphics.h\"\n#include \"task.h\"\n#include \"util.h\"\n#include \"constants/songs.h\"\n\nstruct AnimStatsChangeData\n{\n    u8 battler1;\n    u8 battler2;\n    u8 higherPriority;\n    s16 data[8];\n    u16 species;\n};\n\nstatic void StartBlendAnimSpriteColor(u8 taskId, u32 selectedPalettes);\nstatic void AnimTask_BlendSpriteColor_Step2(u8 taskId);\nstatic void AnimTask_HardwarePaletteFade_Step(u8 taskId);\nstatic void AnimTask_TraceMonBlended_Step(u8 taskId);\nstatic void AnimMonTrace(struct Sprite *sprite);\nstatic void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8 taskId);\nstatic void StatsChangeAnimation_Step1(u8 taskId);\nstatic void StatsChangeAnimation_Step2(u8 taskId);\nstatic void StatsChangeAnimation_Step3(u8 taskId);\nstatic void AnimTask_Flash_Step(u8 taskId);\nstatic void SetPalettesToColor(u32 selectedPalettes, u16 color);\nstatic void AnimTask_UpdateSlidingBg(u8 taskId);\nstatic void UpdateMonScrollingBgMask(u8 taskId);\nstatic void AnimTask_WaitAndRestoreVisibility(u8 taskId);\n\nstatic EWRAM_DATA struct AnimStatsChangeData *sAnimStatsChangeData = NULL;\n\nstatic const u16 sRgbWhite[] = { RGB_WHITE };\nconst u8 gBattleAnimRegOffsBgCnt[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT };\nconst u8 gBattleIntroRegOffsBgCnt[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT };\n\n// gBattleAnimArgs[0] is a bitfield.\n// Bits 0-10 result in the following palettes being selected:\n//   0: battle background palettes (BG palettes 1, 2, and 3)\n//   1: gBattleAnimAttacker OBJ palette\n//   2: gBattleAnimTarget OBJ palette\n//   3: gBattleAnimAttacker partner OBJ palette\n//   4: gBattleAnimTarget partner OBJ palette\n//   5: BG palette 4\n//   6: BG palette 5\n//   7: Player battler left\n//   8: Player battler right\n//   9: Enemy battler left\n//  10: Enemy battler right\nvoid AnimTask_BlendBattleAnimPal(u8 taskId)\n{\n    u32 selectedPalettes = UnpackSelectedBattlePalettes(gBattleAnimArgs[0]);\n    \n    selectedPalettes |= GetBattleMonSpritePalettesMask(\n        (gBattleAnimArgs[0] >>  7) & 1,\n        (gBattleAnimArgs[0] >>  8) & 1,\n        (gBattleAnimArgs[0] >>  9) & 1,\n        (gBattleAnimArgs[0] >> 10) & 1);\n    StartBlendAnimSpriteColor(taskId, selectedPalettes);\n}\n\n// gBattleAnimArgs[0] is a command ID\n// This command will blend bg and battlers except as commanded:\n// 0: Not attacker\n// 1: Not target\n// 2: Not attacker nor bg\n// 3: Not target nor bg\n// 4: Neither attacker nor target\n// 5: Blend all\n// 6: Neither bg nor attacker's partner\n// 7: Neither bg nor target's partner\nvoid AnimTask_BlendBattleAnimPalExclude(u8 taskId)\n{\n    u8 battler;\n    u32 selectedPalettes;\n    u8 animBattlers[2];\n\n    animBattlers[1] = 0xFF;\n    selectedPalettes = UnpackSelectedBattlePalettes(1);\n    switch (gBattleAnimArgs[0])\n    {\n    case 2:\n        selectedPalettes = 0;\n        // fall through\n    case ANIM_ATTACKER:\n        animBattlers[0] = gBattleAnimAttacker;\n        break;\n    case 3:\n        selectedPalettes = 0;\n        // fall through\n    case ANIM_TARGET:\n        animBattlers[0] = gBattleAnimTarget;\n        break;\n    case 4:\n        animBattlers[0] = gBattleAnimAttacker;\n        animBattlers[1] = gBattleAnimTarget;\n        break;\n    case 5:\n        animBattlers[0] = 0xFF;\n        break;\n    case 6:\n        selectedPalettes = 0;\n        animBattlers[0] = BATTLE_PARTNER(gBattleAnimAttacker);\n        break;\n    case 7:\n        selectedPalettes = 0;\n        animBattlers[0] = BATTLE_PARTNER(gBattleAnimTarget);\n        break;\n    }\n    for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler)\n    {\n        if (battler != animBattlers[0] \n         && battler != animBattlers[1]\n         && IsBattlerSpriteVisible(battler))\n            selectedPalettes |= 0x10000 << GetSpritePalIdxByBattler(battler);\n    }\n    StartBlendAnimSpriteColor(taskId, selectedPalettes);\n}\n\nvoid AnimTask_SetCamouflageBlend(u8 taskId)\n{\n    u32 selectedPalettes = UnpackSelectedBattlePalettes(gBattleAnimArgs[0]);\n    \n    switch (gBattleTerrain)\n    {\n    case BATTLE_TERRAIN_GRASS:\n        gBattleAnimArgs[4] = RGB(12, 24, 2);\n        break;\n    case BATTLE_TERRAIN_LONG_GRASS:\n        gBattleAnimArgs[4] = RGB(0, 15, 2);\n        break;\n    case BATTLE_TERRAIN_SAND:\n        gBattleAnimArgs[4] = RGB(30, 24, 11);\n        break;\n    case BATTLE_TERRAIN_UNDERWATER:\n        gBattleAnimArgs[4] = RGB(0, 0, 18);\n        break;\n    case BATTLE_TERRAIN_WATER:\n        gBattleAnimArgs[4] = RGB(11, 22, 31);\n        break;\n    case BATTLE_TERRAIN_POND:\n        gBattleAnimArgs[4] = RGB(11, 22, 31);\n        break;\n    case BATTLE_TERRAIN_MOUNTAIN:\n        gBattleAnimArgs[4] = RGB(22, 16, 10);\n        break;\n    case BATTLE_TERRAIN_CAVE:\n        gBattleAnimArgs[4] = RGB(14, 9, 3);\n        break;\n    case BATTLE_TERRAIN_BUILDING:\n        gBattleAnimArgs[4] = RGB(31, 31, 31);\n        break;\n    case BATTLE_TERRAIN_PLAIN:\n        gBattleAnimArgs[4] = RGB(31, 31, 31);\n        break;\n    }\n    StartBlendAnimSpriteColor(taskId, selectedPalettes);\n}\n\nvoid AnimTask_BlendParticle(u8 taskId)\n{\n    u8 paletteIndex = IndexOfSpritePaletteTag(gBattleAnimArgs[0]);\n    u32 selectedPalettes = 1 << (paletteIndex + 16);\n\n    StartBlendAnimSpriteColor(taskId, selectedPalettes);\n}\n\nstatic void StartBlendAnimSpriteColor(u8 taskId, u32 selectedPalettes)\n{\n    gTasks[taskId].data[0] = selectedPalettes;\n    gTasks[taskId].data[1] = selectedPalettes >> 16;\n    gTasks[taskId].data[2] = gBattleAnimArgs[1];\n    gTasks[taskId].data[3] = gBattleAnimArgs[2];\n    gTasks[taskId].data[4] = gBattleAnimArgs[3];\n    gTasks[taskId].data[5] = gBattleAnimArgs[4];\n    gTasks[taskId].data[10] = gBattleAnimArgs[2];\n    gTasks[taskId].func = AnimTask_BlendSpriteColor_Step2;\n    gTasks[taskId].func(taskId);\n}\n\nstatic void AnimTask_BlendSpriteColor_Step2(u8 taskId)\n{\n    u32 selectedPalettes;\n    u16 singlePaletteMask = 0;\n\n    if (gTasks[taskId].data[9] == gTasks[taskId].data[2])\n    {\n        gTasks[taskId].data[9] = 0;\n        selectedPalettes = gTasks[taskId].data[0] | (gTasks[taskId].data[1] << 16);\n        while (selectedPalettes)\n        {\n            if (selectedPalettes & 1)\n                BlendPalette(singlePaletteMask, 16, gTasks[taskId].data[10], gTasks[taskId].data[5]);\n            singlePaletteMask += 0x10;\n            selectedPalettes >>= 1;\n        }\n        if (gTasks[taskId].data[10] < gTasks[taskId].data[4])\n            ++gTasks[taskId].data[10];\n        else if (gTasks[taskId].data[10] > gTasks[taskId].data[4])\n            --gTasks[taskId].data[10];\n        else\n            DestroyAnimVisualTask(taskId);\n    }\n    else\n    {\n        ++gTasks[taskId].data[9];\n    }\n}\n\nvoid AnimTask_HardwarePaletteFade(u8 taskId)\n{\n    BeginHardwarePaletteFade(gBattleAnimArgs[0],\n                             gBattleAnimArgs[1],\n                             gBattleAnimArgs[2],\n                             gBattleAnimArgs[3],\n                             gBattleAnimArgs[4]);\n    gTasks[taskId].func = AnimTask_HardwarePaletteFade_Step;\n}\n\nstatic void AnimTask_HardwarePaletteFade_Step(u8 taskId)\n{\n    if (!gPaletteFade.active)\n        DestroyAnimVisualTask(taskId);\n}\n\n// Used to leave blended traces of a mon, usually to imply speed as in Agility or Aerial Ace\nvoid AnimTask_TraceMonBlended(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->data[0] = gBattleAnimArgs[0];\n    task->data[1] = 0;\n    task->data[2] = gBattleAnimArgs[1];\n    task->data[3] = gBattleAnimArgs[2];\n    task->data[4] = gBattleAnimArgs[3];\n    task->data[5] = 0;\n    task->func = AnimTask_TraceMonBlended_Step;\n}\nstatic void AnimTask_TraceMonBlended_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (task->data[4])\n    {\n        if (task->data[1])\n        {\n            --task->data[1];\n        }\n        else\n        {\n            task->data[6] = CloneBattlerSpriteWithBlend(task->data[0]);\n            if (task->data[6] >= 0)\n            {\n                gSprites[task->data[6]].oam.priority = task->data[0] ? 1 : 2;\n                gSprites[task->data[6]].data[0] = task->data[3];\n                gSprites[task->data[6]].data[1] = taskId;\n                gSprites[task->data[6]].data[2] = 5;\n                gSprites[task->data[6]].callback = AnimMonTrace;\n                ++task->data[5];\n            }\n            --task->data[4];\n            task->data[1] = task->data[2];\n        }\n    }\n    else if (task->data[5] == 0)\n    {\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nstatic void AnimMonTrace(struct Sprite *sprite)\n{\n    if (sprite->data[0])\n    {\n        --sprite->data[0];\n    }\n    else\n    {\n        --gTasks[sprite->data[1]].data[sprite->data[2]];\n        DestroySpriteWithActiveSheet(sprite);\n    }\n}\n\n// Only used by Curse for non-Ghost mons\nvoid AnimTask_DrawFallingWhiteLinesOnAttacker(u8 taskId)\n{\n    u16 species;\n    s32 newSpriteId;\n    u16 var0;\n    u16 bg1Cnt;\n    u8 spriteId;\n    struct BattleAnimBgData animBgData;\n\n    var0 = 0;\n    gBattle_WIN0H = 0;\n    gBattle_WIN0V = 0;\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR\n                              | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR\n                               | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12));\n    bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT);\n    ((struct BgCnt *)&bg1Cnt)->priority = 0;\n    ((struct BgCnt *)&bg1Cnt)->screenSize = 0;\n    SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);\n    if (!IsContest())\n    {\n        ((struct BgCnt *)&bg1Cnt)->charBaseBlock = 1;\n        SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);\n    }\n    if (IsDoubleBattle() && !IsContest())\n    {\n        if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_RIGHT\n         || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT)\n        {\n            if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)) == TRUE)\n            {\n                gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority -= 1;\n                ((struct BgCnt *)&bg1Cnt)->priority = 1;\n                SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);\n                var0 = 1;\n            }\n        }\n    }\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);\n    else\n        species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);\n    spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species);\n    GetBattleAnimBg1Data(&animBgData);\n    AnimLoadCompressedBgTilemap(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_tilemap);\n    if (IsContest())\n        RelocateBattleBgPal(animBgData.paletteId, animBgData.bgTilemap, 0, 0);\n    AnimLoadCompressedBgGfx(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_sheet, animBgData.tilesOffset);\n    LoadPalette(sRgbWhite, BG_PLTT_ID(animBgData.paletteId) + 1, PLTT_SIZEOF(1));\n    gBattle_BG1_X = -gSprites[spriteId].x + 32;\n    gBattle_BG1_Y = -gSprites[spriteId].y + 32;\n    gTasks[taskId].data[0] = newSpriteId;\n    gTasks[taskId].data[6] = var0;\n    gTasks[taskId].func = AnimTask_DrawFallingWhiteLinesOnAttacker_Step;\n}\n\nstatic void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8 taskId)\n{\n    struct BattleAnimBgData animBgData;\n    struct Sprite *sprite;\n    u16 bg1Cnt;\n\n    gTasks[taskId].data[10] += 4;\n    gBattle_BG1_Y -= 4;\n    if (gTasks[taskId].data[10] == 64)\n    {\n        gTasks[taskId].data[10] = 0;\n        gBattle_BG1_Y += 64;\n        if (++gTasks[taskId].data[11] == 4)\n        {\n            ResetBattleAnimBg(0);\n            gBattle_WIN0H = 0;\n            gBattle_WIN0V = 0;\n            SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR\n                                      | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n            SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL  | WINOUT_WIN01_OBJ  | WINOUT_WIN01_CLR\n                                       | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);\n            if (!IsContest())\n            {\n                bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT);\n                ((struct BgCnt *)&bg1Cnt)->charBaseBlock = 0;\n                SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);\n            }\n            SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);\n            SetGpuReg(REG_OFFSET_BLDCNT, 0);\n            SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n            sprite = &gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)]; // unused\n            sprite = &gSprites[gTasks[taskId].data[0]];\n            DestroySprite(sprite);\n            GetBattleAnimBg1Data(&animBgData);\n            InitBattleAnimBg(animBgData.bgId);\n            if (gTasks[taskId].data[6] == 1)\n                ++gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority;\n            gBattle_BG1_Y = 0;\n            DestroyAnimVisualTask(taskId);\n        }\n    }\n}\n\nvoid InitStatsChangeAnimation(u8 taskId)\n{\n    u32 i;\n\n    sAnimStatsChangeData = AllocZeroed(sizeof(struct AnimStatsChangeData));\n    for (i = 0; i < 8; ++i)\n        sAnimStatsChangeData->data[i] = gBattleAnimArgs[i];\n    gTasks[taskId].func = StatsChangeAnimation_Step1;\n}\n\nstatic void StatsChangeAnimation_Step1(u8 taskId)\n{\n    if (sAnimStatsChangeData->data[2] == 0)\n        sAnimStatsChangeData->battler1 = gBattleAnimAttacker;\n    else\n        sAnimStatsChangeData->battler1 = gBattleAnimTarget;\n    sAnimStatsChangeData->battler2 = BATTLE_PARTNER(sAnimStatsChangeData->battler1);\n    if (IsContest() || (sAnimStatsChangeData->data[3] && !IsBattlerSpriteVisible(sAnimStatsChangeData->battler2)))\n        sAnimStatsChangeData->data[3] = 0;\n    gBattle_WIN0H = 0;\n    gBattle_WIN0V = 0;\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR\n                              | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ  | WINOUT_WIN01_CLR\n                               | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0);\n    SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);\n    if (!IsContest())\n        SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);\n    if (IsDoubleBattle() && sAnimStatsChangeData->data[3] == 0)\n    {\n        if (GetBattlerPosition(sAnimStatsChangeData->battler1) == B_POSITION_OPPONENT_RIGHT\n         || GetBattlerPosition(sAnimStatsChangeData->battler1) == B_POSITION_PLAYER_LEFT)\n        {\n            if (IsBattlerSpriteVisible(sAnimStatsChangeData->battler2) == TRUE)\n            {\n                gSprites[gBattlerSpriteIds[sAnimStatsChangeData->battler2]].oam.priority -= 1;\n                SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n                sAnimStatsChangeData->higherPriority = 1;\n            }\n        }\n    }\n    if (GetBattlerSide(sAnimStatsChangeData->battler1) != B_SIDE_PLAYER)\n        sAnimStatsChangeData->species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES);\n    else\n        sAnimStatsChangeData->species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES);\n    gTasks[taskId].func = StatsChangeAnimation_Step2;\n}\n\nstatic void StatsChangeAnimation_Step2(u8 taskId)\n{\n    struct BattleAnimBgData animBgData;\n    u8 spriteId, newSpriteId = 0;\n    u8 battlerSpriteId;\n\n    battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler1];\n    spriteId = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species);\n    if (sAnimStatsChangeData->data[3])\n    {\n        battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler2];\n        newSpriteId = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species);\n    }\n    GetBattleAnimBg1Data(&animBgData);\n    if (sAnimStatsChangeData->data[0] == 0)\n        AnimLoadCompressedBgTilemap(animBgData.bgId, gBattleStatMask1_Tilemap);\n    else\n        AnimLoadCompressedBgTilemap(animBgData.bgId, gBattleStatMask2_Tilemap);\n    if (IsContest())\n        RelocateBattleBgPal(animBgData.paletteId, animBgData.bgTilemap, 0, 0);\n    AnimLoadCompressedBgGfx(animBgData.bgId, gBattleStatMask_Gfx, animBgData.tilesOffset);\n    switch (sAnimStatsChangeData->data[1])\n    {\n    case 0:\n        LoadCompressedPalette(gBattleStatMask2_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP);\n        break;\n    case 1:\n        LoadCompressedPalette(gBattleStatMask1_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP);\n        break;\n    case 2:\n        LoadCompressedPalette(gBattleStatMask3_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP);\n        break;\n    case 3:\n        LoadCompressedPalette(gBattleStatMask4_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP);\n        break;\n    case 4:\n        LoadCompressedPalette(gBattleStatMask6_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP);\n        break;\n    case 5:\n        LoadCompressedPalette(gBattleStatMask7_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP);\n        break;\n    case 6:\n        LoadCompressedPalette(gBattleStatMask8_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP);\n        break;\n    default:\n        LoadCompressedPalette(gBattleStatMask5_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP);\n        break;\n    }\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n     if (sAnimStatsChangeData->data[0] == 1)\n    {\n        gBattle_BG1_X = 64;\n        gTasks[taskId].data[1] = -3;\n    }\n    else\n    {\n        gTasks[taskId].data[1] = 3;\n    }\n\n    if (sAnimStatsChangeData->data[4] == 0)\n    {\n        gTasks[taskId].data[4] = 10;\n        gTasks[taskId].data[5] = 20;\n    }\n    else\n    {\n        gTasks[taskId].data[4] = 13;\n        gTasks[taskId].data[5] = 30;\n    }\n    gTasks[taskId].data[0] = spriteId;\n    gTasks[taskId].data[2] = sAnimStatsChangeData->data[3];\n    gTasks[taskId].data[3] = newSpriteId;\n    gTasks[taskId].data[6] = sAnimStatsChangeData->higherPriority;\n    gTasks[taskId].data[7] = gBattlerSpriteIds[sAnimStatsChangeData->battler2];\n    gTasks[taskId].func = StatsChangeAnimation_Step3;\n    if (sAnimStatsChangeData->data[0] == 0)\n        PlaySE12WithPanning(SE_M_STAT_INCREASE, BattleAnimAdjustPanning2(SOUND_PAN_ATTACKER));\n    else\n        PlaySE12WithPanning(SE_M_STAT_DECREASE, BattleAnimAdjustPanning2(SOUND_PAN_ATTACKER));\n}\n\nstatic void StatsChangeAnimation_Step3(u8 taskId)\n{\n    gBattle_BG1_Y += gTasks[taskId].data[1];\n\n    switch (gTasks[taskId].data[15])\n    {\n    case 0:\n        if (gTasks[taskId].data[11]++ > 0)\n        {\n            gTasks[taskId].data[11] = 0;\n            ++gTasks[taskId].data[12];\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));\n            if (gTasks[taskId].data[12] == gTasks[taskId].data[4])\n                ++gTasks[taskId].data[15];\n        }\n        break;\n    case 1:\n        if (++gTasks[taskId].data[10] == gTasks[taskId].data[5])\n            ++gTasks[taskId].data[15];\n        break;\n    case 2:\n        if (gTasks[taskId].data[11]++ > 0)\n        {\n            gTasks[taskId].data[11] = 0;\n            --gTasks[taskId].data[12];\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));\n            if (gTasks[taskId].data[12] == 0)\n            {\n                ResetBattleAnimBg(0);\n                ++gTasks[taskId].data[15];\n            }\n        }\n        break;\n    case 3:\n        gBattle_WIN0H = 0;\n        gBattle_WIN0V = 0;\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR\n                                  | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n        SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL  | WINOUT_WIN01_OBJ  | WINOUT_WIN01_CLR\n                                   | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);\n        if (!IsContest())\n            SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);\n        SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        DestroySprite(&gSprites[gTasks[taskId].data[0]]);\n        if (gTasks[taskId].data[2])\n            DestroySprite(&gSprites[gTasks[taskId].data[3]]);\n        if (gTasks[taskId].data[6] == 1)\n            ++gSprites[gTasks[taskId].data[7]].oam.priority;\n        Free(sAnimStatsChangeData);\n        sAnimStatsChangeData = NULL;\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nvoid AnimTask_Flash(u8 taskId)\n{\n    u32 selectedPalettes = GetBattleMonSpritePalettesMask(1, 1, 1, 1);\n\n    SetPalettesToColor(selectedPalettes, 0);\n    gTasks[taskId].data[14] = selectedPalettes >> 16;\n    selectedPalettes = GetBattlePalettesMask(1, 0, 0, 0, 0, 0, 0) & 0xFFFF;\n    SetPalettesToColor(selectedPalettes, 0xFFFF);\n    gTasks[taskId].data[15] = selectedPalettes;\n    gTasks[taskId].data[0] = 0;\n    gTasks[taskId].data[1] = 0;\n    gTasks[taskId].func = AnimTask_Flash_Step;\n}\n\nstatic void AnimTask_Flash_Step(u8 taskId)\n{\n    u32 i;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        if (++task->data[1] > 6)\n        {\n            task->data[1] = 0;\n            task->data[2] = 16;\n            ++task->data[0];\n        }\n        break;\n    case 1:\n        if (++task->data[1] > 1)\n        {\n            task->data[1] = 0;\n            --task->data[2];\n            for (i = 0; i < 16; ++i)\n            {\n                if ((task->data[15] >> i) & 1)\n                {\n                    u16 paletteOffset = BG_PLTT_ID(i);\n                    BlendPalette(paletteOffset, 16, task->data[2], 0xFFFF);\n                }\n\n                if ((task->data[14] >> i) & 1)\n                {\n                    u16 paletteOffset = OBJ_PLTT_ID(i);\n                    BlendPalette(paletteOffset, 16, task->data[2], 0);\n                }\n            }\n\n            if (task->data[2] == 0)\n                ++task->data[0];\n        }\n        break;\n    case 2:\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void SetPalettesToColor(u32 selectedPalettes, u16 color)\n{\n    u16 i, curOffset, paletteOffset;\n\n    for (i = 0; i < 32; selectedPalettes >>= 1, ++i)\n        if (selectedPalettes & 1)\n            for (curOffset = PLTT_ID(i), paletteOffset = curOffset; curOffset < paletteOffset + 16; ++curOffset)\n                gPlttBufferFaded[curOffset] = color;\n}\n\nvoid AnimTask_BlendNonAttackerPalettes(u8 taskId)\n{\n    s32 j;\n    u32 battler, selectedPalettes = 0;\n\n    for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler)\n        if (gBattleAnimAttacker != battler)\n            selectedPalettes |= 1 << (battler + 16);\n    for (j = 5; j != 0; --j)\n        gBattleAnimArgs[j] = gBattleAnimArgs[j - 1];\n    StartBlendAnimSpriteColor(taskId, selectedPalettes);\n}\n\nvoid AnimTask_StartSlidingBg(u8 taskId)\n{\n    u8 newTaskId;\n\n    ToggleBg3Mode(0);\n    newTaskId = CreateTask(AnimTask_UpdateSlidingBg, 5);\n    if (gBattleAnimArgs[2] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        gBattleAnimArgs[0] = -gBattleAnimArgs[0];\n        gBattleAnimArgs[1] = -gBattleAnimArgs[1];\n    }\n    gTasks[newTaskId].data[1] = gBattleAnimArgs[0];\n    gTasks[newTaskId].data[2] = gBattleAnimArgs[1];\n    gTasks[newTaskId].data[3] = gBattleAnimArgs[3];\n    ++gTasks[newTaskId].data[0];\n    DestroyAnimVisualTask(taskId);\n}\n\nstatic void AnimTask_UpdateSlidingBg(u8 taskId)\n{\n    gTasks[taskId].data[10] += gTasks[taskId].data[1];\n    gTasks[taskId].data[11] += gTasks[taskId].data[2];\n    gBattle_BG3_X += gTasks[taskId].data[10] >> 8;\n    gBattle_BG3_Y += gTasks[taskId].data[11] >> 8;\n    gTasks[taskId].data[10] &= 0xFF;\n    gTasks[taskId].data[11] &= 0xFF;\n    if (gBattleAnimArgs[7] == gTasks[taskId].data[3])\n    {\n        gBattle_BG3_X = 0;\n        gBattle_BG3_Y = 0;\n        ToggleBg3Mode(1);\n        DestroyTask(taskId);\n    }\n}\n\nvoid AnimTask_GetAttackerSide(u8 taskId)\n{\n    gBattleAnimArgs[7] = GetBattlerSide(gBattleAnimAttacker);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_GetTargetSide(u8 taskId)\n{\n    gBattleAnimArgs[7] = GetBattlerSide(gBattleAnimTarget);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_GetTargetIsAttackerPartner(u8 taskId)\n{\n    gBattleAnimArgs[7] = BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget;\n    DestroyAnimVisualTask(taskId);\n}\n\n// For hiding or subsequently revealing all other battlers\nvoid AnimTask_SetAllNonAttackersInvisiblity(u8 taskId)\n{\n    u16 battler;\n\n    for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler)\n        if (battler != gBattleAnimAttacker && IsBattlerSpriteVisible(battler))\n            gSprites[gBattlerSpriteIds[battler]].invisible = gBattleAnimArgs[0];\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid StartMonScrollingBgMask(u8 taskId, s32 unused, u16 scrollSpeed, u8 battler1, bool8 includePartner, u8 numFadeSteps, u8 fadeStepDelay, u8 duration, const u32 *gfx, const u32 *tilemap, const u32 *palette)\n{\n    u16 species;\n    u8 spriteId, newSpriteId = 0;\n    u16 bg1Cnt;\n    struct BattleAnimBgData animBgData;\n    u8 battler2 = BATTLE_PARTNER(battler1);\n\n    if (IsContest() || (includePartner && !IsBattlerSpriteVisible(battler2)))\n        includePartner = FALSE;\n    gBattle_WIN0H = 0;\n    gBattle_WIN0V = 0;\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR\n                              | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ  | WINOUT_WIN01_CLR\n                               | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT);\n    ((vBgCnt *)&bg1Cnt)->priority = 0;\n    ((vBgCnt *)&bg1Cnt)->screenSize = 0;\n    ((vBgCnt *)&bg1Cnt)->areaOverflowMode = 1;\n    if (!IsContest())\n        ((vBgCnt *)&bg1Cnt)->charBaseBlock = 1;\n    SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);\n    if (GetBattlerSide(battler1) != B_SIDE_PLAYER)\n        species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES);\n    else\n        species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES);\n    spriteId = CreateInvisibleSpriteCopy(battler1, gBattlerSpriteIds[battler1], species);\n    if (includePartner)\n        newSpriteId = CreateInvisibleSpriteCopy(battler2, gBattlerSpriteIds[battler2], species);\n    GetBattleAnimBg1Data(&animBgData);\n    AnimLoadCompressedBgTilemap(animBgData.bgId, tilemap);\n    if (IsContest())\n        RelocateBattleBgPal(animBgData.paletteId, animBgData.bgTilemap, 0, 0);\n    AnimLoadCompressedBgGfx(animBgData.bgId, gfx, animBgData.tilesOffset);\n    LoadCompressedPalette(palette, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP);\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    gTasks[taskId].data[1] = scrollSpeed;\n    gTasks[taskId].data[4] = numFadeSteps;\n    gTasks[taskId].data[5] = duration;\n    gTasks[taskId].data[6] = fadeStepDelay;\n    gTasks[taskId].data[0] = spriteId;\n    gTasks[taskId].data[2] = includePartner;\n    gTasks[taskId].data[3] = newSpriteId;\n    gTasks[taskId].func = UpdateMonScrollingBgMask;\n}\n\nstatic void UpdateMonScrollingBgMask(u8 taskId)\n{\n    gTasks[taskId].data[13] += gTasks[taskId].data[1] < 0 ? -gTasks[taskId].data[1] : gTasks[taskId].data[1];\n    if (gTasks[taskId].data[1] < 0)\n        gBattle_BG1_Y -= gTasks[taskId].data[13] >> 8;\n    else\n        gBattle_BG1_Y += gTasks[taskId].data[13] >> 8;\n    gTasks[taskId].data[13] &= 0xFF;\n    switch (gTasks[taskId].data[15])\n    {\n    case 0:\n        if (gTasks[taskId].data[11]++ >= gTasks[taskId].data[6])\n        {\n            gTasks[taskId].data[11] = 0;\n            ++gTasks[taskId].data[12];\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));\n            if (gTasks[taskId].data[12] == gTasks[taskId].data[4])\n                ++gTasks[taskId].data[15];\n        }\n        break;\n    case 1:\n        if (++gTasks[taskId].data[10] == gTasks[taskId].data[5])\n            ++gTasks[taskId].data[15];\n        break;\n    case 2:\n        if (gTasks[taskId].data[11]++ >= gTasks[taskId].data[6])\n        {\n            gTasks[taskId].data[11] = 0;\n            --gTasks[taskId].data[12];\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));\n            if (gTasks[taskId].data[12] == 0)\n            {\n                ResetBattleAnimBg(0);\n                gBattle_WIN0H = 0;\n                gBattle_WIN0V = 0;\n                SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR\n                                          | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n                SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL  | WINOUT_WIN01_OBJ  | WINOUT_WIN01_CLR\n                                           | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);\n                if (!IsContest())\n                {\n                    u16 bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT);\n                    ((vBgCnt *)&bg1Cnt)->charBaseBlock = 0;\n                    SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);\n                }\n                SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);\n                SetGpuReg(REG_OFFSET_BLDCNT, 0);\n                SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n                DestroySprite(&gSprites[gTasks[taskId].data[0]]);\n                if (gTasks[taskId].data[2])\n                    DestroySprite(&gSprites[gTasks[taskId].data[3]]);\n                DestroyAnimVisualTask(taskId);\n            }\n        }\n        break;\n    }\n}\n\nvoid AnimTask_GetBattleTerrain(u8 taskId)\n{\n    gBattleAnimArgs[0] = gBattleTerrain;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_AllocBackupPalBuffer(u8 taskId)\n{\n    gMonSpritesGfxPtr->multiUseBuffer = AllocZeroed(0x2000);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_FreeBackupPalBuffer(u8 taskId)\n{\n    FREE_AND_SET_NULL(gMonSpritesGfxPtr->multiUseBuffer);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_CopyPalUnfadedToBackup(u8 taskId)\n{\n    u32 selectedPalettes;\n    s32 paletteIndex = 0;\n\n    if (gBattleAnimArgs[0] == 0)\n        for (selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);\n             (selectedPalettes & 1) == 0;\n             ++paletteIndex)\n            selectedPalettes >>= 1;\n    else if (gBattleAnimArgs[0] == 1)\n        paletteIndex = gBattleAnimAttacker + 16;\n    else if (gBattleAnimArgs[0] == 2)\n        paletteIndex = gBattleAnimTarget + 16;\n    memcpy(&gMonSpritesGfxPtr->multiUseBuffer[gBattleAnimArgs[1] * 16], &gPlttBufferUnfaded[PLTT_ID(paletteIndex)], PLTT_SIZE_4BPP);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_CopyPalUnfadedFromBackup(u8 taskId)\n{\n    u32 selectedPalettes;\n    s32 paletteIndex = 0;\n\n    if (gBattleAnimArgs[0] == 0)\n        for (selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);\n             (selectedPalettes & 1) == 0;\n             ++paletteIndex)\n            selectedPalettes >>= 1;\n    else if (gBattleAnimArgs[0] == 1)\n        paletteIndex = gBattleAnimAttacker + 16;\n    else if (gBattleAnimArgs[0] == 2)\n        paletteIndex = gBattleAnimTarget + 16;\n    memcpy(&gPlttBufferUnfaded[PLTT_ID(paletteIndex)], &gMonSpritesGfxPtr->multiUseBuffer[gBattleAnimArgs[1] * 16], PLTT_SIZE_4BPP);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_CopyPalFadedToUnfaded(u8 taskId)\n{\n    u32 selectedPalettes;\n    s32 paletteIndex = 0;\n\n    if (gBattleAnimArgs[0] == 0)\n        for (selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);\n             (selectedPalettes & 1) == 0;\n             ++paletteIndex)\n            selectedPalettes >>= 1;\n    else if (gBattleAnimArgs[0] == 1)\n        paletteIndex = gBattleAnimAttacker + 16;\n    else if (gBattleAnimArgs[0] == 2)\n        paletteIndex = gBattleAnimTarget + 16;\n    memcpy(&gPlttBufferUnfaded[PLTT_ID(paletteIndex)], &gPlttBufferFaded[PLTT_ID(paletteIndex)], PLTT_SIZE_4BPP);\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_IsContest(u8 taskId)\n{\n    if (IsContest())\n        gBattleAnimArgs[ARG_RET_ID] = TRUE;\n    else\n        gBattleAnimArgs[ARG_RET_ID] = FALSE;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_SetAnimAttackerAndTargetForEffectTgt(u8 taskId)\n{\n    gBattleAnimAttacker = gBattlerTarget;\n    gBattleAnimTarget = gEffectBattler;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_IsTargetSameSide(u8 taskId)\n{\n    if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))\n        gBattleAnimArgs[ARG_RET_ID] = TRUE;\n    else\n        gBattleAnimArgs[ARG_RET_ID] = FALSE;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_SetAnimTargetToBattlerTarget(u8 taskId)\n{\n    gBattleAnimTarget = gBattlerTarget;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_SetAnimAttackerAndTargetForEffectAtk(u8 taskId)\n{\n    gBattleAnimAttacker = gBattlerAttacker;\n    gBattleAnimTarget = gEffectBattler;\n    DestroyAnimVisualTask(taskId);\n}\n\nvoid AnimTask_SetAttackerInvisibleWaitForSignal(u8 taskId)\n{\n    if (IsContest())\n    {\n        DestroyAnimVisualTask(taskId);\n    }\n    else\n    {\n        gTasks[taskId].data[0] = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible;\n        gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible = 1;\n        gTasks[taskId].func = AnimTask_WaitAndRestoreVisibility;\n        --gAnimVisualTaskCount;\n    }\n}\n\nstatic void AnimTask_WaitAndRestoreVisibility(u8 taskId)\n{\n    if (gBattleAnimArgs[7] == 0x1000)\n    {\n        gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible = (u8)gTasks[taskId].data[0] & 1;\n        DestroyTask(taskId);\n    }\n}\n"
  },
  {
    "path": "src/battle_anim_water.c",
    "content": "#include \"global.h\"\n#include \"battle_anim.h\"\n#include \"decompress.h\"\n#include \"gpu_regs.h\"\n#include \"graphics.h\"\n#include \"palette.h\"\n#include \"pokemon.h\"\n#include \"random.h\"\n#include \"scanline_effect.h\"\n#include \"sprite.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"util.h\"\n\nstatic void AnimRainDrop(struct Sprite *);\nstatic void AnimRainDrop_Step(struct Sprite *);\nstatic void AnimWaterBubbleProjectile(struct Sprite *);\nstatic void AnimWaterBubbleProjectile_Step1(struct Sprite *);\nstatic void AnimWaterBubbleProjectile_Step2(struct Sprite *);\nstatic void AnimWaterBubbleProjectile_Step3(struct Sprite *);\nstatic void AnimAuroraBeamRings(struct Sprite *);\nstatic void AnimAuroraBeamRings_Step(struct Sprite *);\nstatic void AnimToTargetInSinWave(struct Sprite *);\nstatic void AnimToTargetInSinWave_Step(struct Sprite *);\nstatic void AnimHydroCannonCharge(struct Sprite *);\nstatic void AnimHydroCannonCharge_Step(struct Sprite *);\nstatic void AnimHydroCannonBeam(struct Sprite *);\nstatic void AnimWaterGunDroplet(struct Sprite *);\nstatic void AnimSmallBubblePair(struct Sprite *);\nstatic void AnimSmallBubblePair_Step(struct Sprite *);\nstatic void AnimSmallDriftingBubbles(struct Sprite *);\nstatic void AnimSmallDriftingBubbles_Step(struct Sprite *);\nstatic void AnimSmallWaterOrb(struct Sprite *);\nstatic void AnimWaterSpoutRain(struct Sprite *);\nstatic void AnimWaterSpoutRainHit(struct Sprite *);\nstatic void AnimWaterSportDroplet(struct Sprite *);\nstatic void AnimWaterSportDroplet_Step(struct Sprite *);\nstatic void AnimWaterPulseBubble(struct Sprite *);\nstatic void AnimWaterPulseBubble_Step(struct Sprite *);\nstatic void AnimWaterPulseRingBubble(struct Sprite *);\nstatic void AnimWaterPulseRing_Step(struct Sprite *);\nstatic void AnimTask_RotateAuroraRingColors_Step(u8);\nstatic void AnimTask_RunSinAnimTimer(u8);\nstatic void AnimTask_CreateSurfWave_Step1(u8);\nstatic void AnimTask_CreateSurfWave_Step2(u8);\nstatic void AnimTask_SurfWaveScanlineEffect(u8);\nstatic void AnimTask_WaterSpoutLaunch_Step(u8);\nstatic void AnimTask_WaterSpoutRain_Step(u8);\nstatic u8 GetWaterSpoutPowerForAnim(void);\nstatic void CreateWaterSpoutLaunchDroplets(struct Task *, u8);\nstatic void CreateWaterSpoutRainDroplet(struct Task *, u8);\nstatic void AnimTask_WaterSport_Step(u8);\nstatic void CreateWaterSportDroplet(struct Task *);\nstatic void CreateWaterPulseRingBubbles(struct Sprite *, s32, s32);\n\nstatic const u8 sUnusedWater_Gfx[] = INCBIN_U8(\"graphics/battle_anims/unused/water.4bpp\");\nstatic const u8 sUnusedWater[] = INCBIN_U8(\"graphics/battle_anims/unused/water.bin\");\n\nstatic const union AnimCmd sAnim_RainDrop[] =\n{\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(8, 2),\n    ANIMCMD_FRAME(16, 2),\n    ANIMCMD_FRAME(24, 6),\n    ANIMCMD_FRAME(32, 2),\n    ANIMCMD_FRAME(40, 2),\n    ANIMCMD_FRAME(48, 2),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_RainDrop[] =\n{\n    sAnim_RainDrop,\n};\n\nconst struct SpriteTemplate gRainDropSpriteTemplate  =\n{\n    .tileTag = ANIM_TAG_RAIN_DROPS,\n    .paletteTag = ANIM_TAG_RAIN_DROPS,\n    .oam = &gOamData_AffineOff_ObjNormal_16x32,\n    .anims = sAnims_RainDrop,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimRainDrop,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_WaterBubbleProjectile[] =\n{\n    AFFINEANIMCMD_FRAME(-0x5, -0x5, 0, 10),\n    AFFINEANIMCMD_FRAME(0x5, 0x5, 0, 10),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_WaterBubbleProjectile[] =\n{\n    sAffineAnim_WaterBubbleProjectile,\n};\n\nstatic const union AnimCmd sAnim_WaterBubbleProjectile[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_WaterBubbleProjectile[] =\n{\n    sAnim_WaterBubbleProjectile,\n};\n\nconst struct SpriteTemplate gWaterBubbleProjectileSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BUBBLE,\n    .paletteTag = ANIM_TAG_BUBBLE,\n    .oam = &gOamData_AffineNormal_ObjBlend_16x16,\n    .anims = sAnims_WaterBubbleProjectile,\n    .images = NULL,\n    .affineAnims = sAffineAnims_WaterBubbleProjectile,\n    .callback = AnimWaterBubbleProjectile,\n};\n\nstatic const union AnimCmd sAnim_AuroraBeamRing_0[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_AuroraBeamRing_1[] =\n{\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_AuroraBeamRing[] =\n{\n    sAnim_AuroraBeamRing_0,\n    sAnim_AuroraBeamRing_1,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_AuroraBeamRing[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),\n    AFFINEANIMCMD_FRAME(0x60, 0x60, 0, 1),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_AuroraBeamRing[] =\n{\n    sAffineAnim_AuroraBeamRing,\n};\n\nconst struct SpriteTemplate gAuroraBeamRingSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_RAINBOW_RINGS,\n    .paletteTag = ANIM_TAG_RAINBOW_RINGS,\n    .oam = &gOamData_AffineDouble_ObjNormal_8x16,\n    .anims = sAnims_AuroraBeamRing,\n    .images = NULL,\n    .affineAnims = sAffineAnims_AuroraBeamRing,\n    .callback = AnimAuroraBeamRings,\n};\n\nstatic const union AnimCmd sAnim_WaterMudOrb[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_FRAME(8, 1),\n    ANIMCMD_FRAME(12, 1),\n    ANIMCMD_JUMP(0),\n};\n\nconst union AnimCmd *const gAnims_WaterMudOrb[] =\n{\n    sAnim_WaterMudOrb,\n};\n\nconst struct SpriteTemplate gHydroPumpOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WATER_ORB,\n    .paletteTag = ANIM_TAG_WATER_ORB,\n    .oam = &gOamData_AffineOff_ObjBlend_16x16,\n    .anims = gAnims_WaterMudOrb,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimToTargetInSinWave,\n};\n\nconst struct SpriteTemplate gMudShotOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BROWN_ORB,\n    .paletteTag = ANIM_TAG_BROWN_ORB,\n    .oam = &gOamData_AffineOff_ObjBlend_16x16,\n    .anims = gAnims_WaterMudOrb,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimToTargetInSinWave,\n};\n\nconst struct SpriteTemplate gSignalBeamRedOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GLOWY_RED_ORB,\n    .paletteTag = ANIM_TAG_GLOWY_RED_ORB,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimToTargetInSinWave,\n};\n\nconst struct SpriteTemplate gSignalBeamGreenOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GLOWY_GREEN_ORB,\n    .paletteTag = ANIM_TAG_GLOWY_GREEN_ORB,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimToTargetInSinWave,\n};\n\nstatic const union AnimCmd sAnim_FlamethrowerFlame[] =\n{\n    ANIMCMD_FRAME(16, 2),\n    ANIMCMD_FRAME(32, 2),\n    ANIMCMD_FRAME(48, 2),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_FlamethrowerFlame[] =\n{\n    sAnim_FlamethrowerFlame,\n};\n\nconst struct SpriteTemplate gFlamethrowerFlameSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_EMBER,\n    .paletteTag = ANIM_TAG_SMALL_EMBER,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnims_FlamethrowerFlame,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimToTargetInSinWave,\n};\n\nconst struct SpriteTemplate gPsywaveRingSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_BLUE_RING,\n    .paletteTag = ANIM_TAG_BLUE_RING,\n    .oam = &gOamData_AffineDouble_ObjNormal_16x32,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gGrowingRingAffineAnimTable,\n    .callback = AnimToTargetInSinWave,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_HydroCannonCharge[] =\n{\n    AFFINEANIMCMD_FRAME(0x3, 0x3, 10, 50),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 10),\n    AFFINEANIMCMD_FRAME(-0x14, -0x14, -10, 20),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_HydroCannonBeam[] =\n{\n    AFFINEANIMCMD_FRAME(0x150, 0x150, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_HydroCannonCharge[] =\n{\n    sAffineAnim_HydroCannonCharge,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_HydroCannonBeam[] =\n{\n    sAffineAnim_HydroCannonBeam,\n};\n\nconst struct SpriteTemplate gHydroCannonChargeSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WATER_ORB,\n    .paletteTag = ANIM_TAG_WATER_ORB,\n    .oam = &gOamData_AffineDouble_ObjBlend_16x16,\n    .anims = gAnims_WaterMudOrb,\n    .images = NULL,\n    .affineAnims = sAffineAnims_HydroCannonCharge,\n    .callback = AnimHydroCannonCharge,\n};\n\nconst struct SpriteTemplate gHydroCannonBeamSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_WATER_ORB,\n    .paletteTag = ANIM_TAG_WATER_ORB,\n    .oam = &gOamData_AffineDouble_ObjBlend_16x16,\n    .anims = gAnims_WaterMudOrb,\n    .images = NULL,\n    .affineAnims = sAffineAnims_HydroCannonBeam,\n    .callback = AnimHydroCannonBeam,\n};\n\nstatic const union AnimCmd sAnim_WaterBubble[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_WaterGunDroplet[] =\n{\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_END,\n};\n\nconst union AnimCmd *const gAnims_WaterBubble[] =\n{\n    sAnim_WaterBubble,\n};\n\nstatic const union AnimCmd *const sAnims_WaterGunDroplet[] =\n{\n    sAnim_WaterGunDroplet,\n};\n\nconst struct SpriteTemplate gWaterGunProjectileSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_BUBBLES,\n    .paletteTag = ANIM_TAG_SMALL_BUBBLES,\n    .oam = &gOamData_AffineOff_ObjBlend_16x16,\n    .anims = gAnims_WaterBubble,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimThrowProjectile,\n};\n\nconst struct SpriteTemplate gWaterGunDropletSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_BUBBLES,\n    .paletteTag = ANIM_TAG_SMALL_BUBBLES,\n    .oam = &gOamData_AffineDouble_ObjBlend_16x16,\n    .anims = sAnims_WaterGunDroplet,\n    .images = NULL,\n    .affineAnims = gAffineAnims_Droplet,\n    .callback = AnimWaterGunDroplet,\n};\n\nconst struct SpriteTemplate gSmallBubblePairSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_ICE_CRYSTALS, // ice_crystals_4, which are bubbles\n    .paletteTag = ANIM_TAG_ICE_CRYSTALS,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gAnims_SmallBubblePair,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSmallBubblePair,\n};\n\nconst struct SpriteTemplate gSmallDriftingBubblesSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_BUBBLES,\n    .paletteTag = ANIM_TAG_SMALL_BUBBLES,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSmallDriftingBubbles,\n};\n\n// Used by Water Spout / Water Sport\nconst struct SpriteTemplate gSmallWaterOrbSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_GLOWY_BLUE_ORB,\n    .paletteTag = ANIM_TAG_GLOWY_BLUE_ORB,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimSmallWaterOrb,\n};\n\nstatic const union AnimCmd sAnim_WaterPulseBubble_0[] =\n{\n    ANIMCMD_FRAME(8, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_WaterPulseBubble_1[] =\n{\n    ANIMCMD_FRAME(9, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_WeatherBallWaterDown[] =\n{\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_WaterPulseBubble[] =\n{\n    sAnim_WaterPulseBubble_0,\n    sAnim_WaterPulseBubble_1,\n};\n\nstatic const union AnimCmd *const sAnims_WeatherBallWaterDown[] =\n{\n    sAnim_WeatherBallWaterDown,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_WaterPulseRingBubble_0[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(-0xA, -0xA, 0, 15),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_WaterPulseRingBubble_1[] =\n{\n    AFFINEANIMCMD_FRAME(0xE0, 0xE0, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 15),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_WeatherBallWaterDown[] =\n{\n    AFFINEANIMCMD_FRAME(0x150, 0x150, 0, 0),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 15),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_WaterPulseRingBubble[] =\n{\n    sAffineAnim_WaterPulseRingBubble_0,\n    sAffineAnim_WaterPulseRingBubble_1,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_WeatherBallWaterDown[] =\n{\n    sAffineAnim_WeatherBallWaterDown,\n};\n\nconst struct SpriteTemplate gWaterPulseBubbleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_BUBBLES,\n    .paletteTag = ANIM_TAG_SMALL_BUBBLES,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sAnims_WaterPulseBubble,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = AnimWaterPulseBubble,\n};\n\nconst struct SpriteTemplate gWaterPulseRingBubbleSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_BUBBLES,\n    .paletteTag = ANIM_TAG_SMALL_BUBBLES,\n    .oam = &gOamData_AffineNormal_ObjNormal_8x8,\n    .anims = sAnims_WaterPulseBubble,\n    .images = NULL,\n    .affineAnims = sAffineAnims_WaterPulseRingBubble,\n    .callback = AnimWaterPulseRingBubble,\n};\n\nconst struct SpriteTemplate gWeatherBallWaterDownSpriteTemplate =\n{\n    .tileTag = ANIM_TAG_SMALL_BUBBLES,\n    .paletteTag = ANIM_TAG_SMALL_BUBBLES,\n    .oam = &gOamData_AffineNormal_ObjNormal_16x16,\n    .anims = sAnims_WeatherBallWaterDown,\n    .images = NULL,\n    .affineAnims = sAffineAnims_WeatherBallWaterDown,\n    .callback = AnimWeatherBallDown,\n};\n\nvoid AnimTask_CreateRaindrops(u8 taskId) \n{\n     u8 x, y;\n\n    if (gTasks[taskId].data[0] == 0)\n    {\n        gTasks[taskId].data[1] = gBattleAnimArgs[0];\n        gTasks[taskId].data[2] = gBattleAnimArgs[1];\n        gTasks[taskId].data[3] = gBattleAnimArgs[2];\n    }\n    gTasks[taskId].data[0]++;\n    if (gTasks[taskId].data[0] % gTasks[taskId].data[2] == 1)\n    {\n        x = Random() % DISPLAY_WIDTH;\n        y = Random() % (DISPLAY_HEIGHT / 2);\n        CreateSprite(&gRainDropSpriteTemplate, x, y, 4);\n    }\n    if (gTasks[taskId].data[0] == gTasks[taskId].data[3])\n        DestroyAnimVisualTask(taskId);\n}\n\nstatic void AnimRainDrop(struct Sprite *sprite) \n{\n    sprite->callback = AnimRainDrop_Step;\n}\n\nstatic void AnimRainDrop_Step(struct Sprite *sprite) \n{\n    if (++sprite->data[0] < 14) // Was 13 in emerald\n    {\n        sprite->x2 += 1;\n        sprite->y2 += 4;\n    }\n    if (sprite->animEnded)\n    {\n        DestroySprite(sprite);\n    }\n}\n\n// For water bubbles that move to a dest, as in Bubble/Bubblebeam\nstatic void AnimWaterBubbleProjectile(struct Sprite *sprite)\n{\n    u8 spriteId;\n\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) - gBattleAnimArgs[0];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];\n        sprite->animPaused = TRUE;\n    }\n    else\n    {\n        sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0];\n        sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];\n        sprite->animPaused = TRUE;\n    }\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    sprite->data[0] = gBattleAnimArgs[6];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    InitAnimLinearTranslation(sprite);\n    spriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);\n    sprite->data[5] = spriteId;\n    sprite->x -= Sin((u8)gBattleAnimArgs[4], gBattleAnimArgs[2]);\n    sprite->y -= Cos((u8)gBattleAnimArgs[4], gBattleAnimArgs[3]);\n    gSprites[spriteId].data[0] = gBattleAnimArgs[2];\n    gSprites[spriteId].data[1] = gBattleAnimArgs[3];\n    gSprites[spriteId].data[2] = gBattleAnimArgs[5];\n    gSprites[spriteId].data[3] = (u8)gBattleAnimArgs[4] * 256;\n    gSprites[spriteId].data[4] = gBattleAnimArgs[6];\n    sprite->callback = AnimWaterBubbleProjectile_Step1;\n    sprite->callback(sprite);\n}\n\nstatic void AnimWaterBubbleProjectile_Step1(struct Sprite *sprite)\n{\n    u8 otherSpriteId = sprite->data[5];\n    u8 timer = gSprites[otherSpriteId].data[4];\n    u16 trigIndex = gSprites[otherSpriteId].data[3];\n\n    sprite->data[0] = 1;\n    AnimTranslateLinear(sprite);\n    sprite->x2 += Sin(trigIndex >> 8, gSprites[otherSpriteId].data[0]);\n    sprite->y2 += Cos(trigIndex >> 8, gSprites[otherSpriteId].data[1]);\n    gSprites[otherSpriteId].data[3] = trigIndex + gSprites[otherSpriteId].data[2];\n    if (--timer != 0)\n    {\n        gSprites[otherSpriteId].data[4] = timer;\n    }\n    else\n    {\n        sprite->callback = AnimWaterBubbleProjectile_Step2;\n        DestroySprite(&gSprites[otherSpriteId]);\n    }\n}\n\nstatic void AnimWaterBubbleProjectile_Step2(struct Sprite *sprite)\n{\n    sprite->animPaused = FALSE;\n    sprite->callback = RunStoredCallbackWhenAnimEnds;\n    StoreSpriteCallbackInData6(sprite, AnimWaterBubbleProjectile_Step3);\n}\n\nstatic void AnimWaterBubbleProjectile_Step3(struct Sprite *sprite)\n{\n    sprite->data[0] = 10;\n    sprite->callback = WaitAnimForDuration;\n    StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);\n}\n\nstatic void AnimAuroraBeamRings(struct Sprite *sprite)\n{\n    s16 unkArg;\n\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        unkArg = -gBattleAnimArgs[2];\n    else\n        unkArg = gBattleAnimArgs[2];\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + unkArg;\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];\n    InitAnimLinearTranslation(sprite);\n    sprite->callback = AnimAuroraBeamRings_Step;\n    sprite->affineAnimPaused = TRUE;\n    sprite->callback(sprite);\n}\n\nstatic void AnimAuroraBeamRings_Step(struct Sprite *sprite)\n{\n    if ((u16)gBattleAnimArgs[7] == 0xFFFF)\n    {\n        StartSpriteAnim(sprite, 1);\n        sprite->affineAnimPaused = FALSE;\n    }\n    if (AnimTranslateLinear(sprite))\n        DestroyAnimSprite(sprite);\n}\n\n// Updates the palette on the rainbow rings used in Aurora Beam to make them appear to be rotating counterclockwise\nvoid AnimTask_RotateAuroraRingColors(u8 taskId)\n{\n    gTasks[taskId].data[0] = gBattleAnimArgs[0];\n    gTasks[taskId].data[2] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(ANIM_TAG_RAINBOW_RINGS));\n    gTasks[taskId].func = AnimTask_RotateAuroraRingColors_Step;\n}\nstatic void AnimTask_RotateAuroraRingColors_Step(u8 taskId)\n{\n    int i;\n    u16 palIndex;\n\n    if (++gTasks[taskId].data[10] == 3)\n    {\n        u16 tempPlt;\n        gTasks[taskId].data[10] = 0;\n        palIndex = gTasks[taskId].data[2] + 1;\n        tempPlt = gPlttBufferFaded[palIndex];\n        for (i = 1; i < 8; i++)\n            gPlttBufferFaded[palIndex + i - 1] = gPlttBufferFaded[palIndex + i];\n        gPlttBufferFaded[palIndex + 7] = tempPlt;\n    }\n    if (++gTasks[taskId].data[11] == gTasks[taskId].data[0])\n        DestroyAnimVisualTask(taskId);\n}\n\n// For animating undulating beam attacks (e.g. Flamethrower, Hydro Pump, Signal Beam)\nstatic void AnimToTargetInSinWave(struct Sprite *sprite)\n{\n    u16 retArg;\n\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[0] = 30;\n    sprite->data[1] = sprite->x;\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[3] = sprite->y;\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    InitAnimLinearTranslation(sprite);\n    sprite->data[5] = 0xD200 / sprite->data[0];\n    sprite->data[7] = gBattleAnimArgs[3];\n    retArg = gBattleAnimArgs[7];\n    if (gBattleAnimArgs[7] > 127)\n    {\n        sprite->data[6] = (retArg - 127) * 256;\n        sprite->data[7] = -sprite->data[7];\n    }\n    else\n    {\n        sprite->data[6] = retArg * 256;\n    }\n    sprite->callback = AnimToTargetInSinWave_Step;\n    sprite->callback(sprite);\n}\n\nstatic void AnimToTargetInSinWave_Step(struct Sprite *sprite)\n{\n    if (AnimTranslateLinear(sprite))\n        DestroyAnimSprite(sprite);\n    sprite->y2 += Sin(sprite->data[6] >> 8, sprite->data[7]);\n    if ((sprite->data[6] + sprite->data[5]) >> 8 > 127)\n    {\n        sprite->data[6] = 0;\n        sprite->data[7] = -sprite->data[7];\n    }\n    else\n    {\n        sprite->data[6] += sprite->data[5];\n    }\n}\n\nvoid AnimTask_StartSinAnimTimer(u8 taskId)\n{\n    gTasks[taskId].data[0] = gBattleAnimArgs[0];\n    gBattleAnimArgs[7] = 0;\n    gTasks[taskId].func = AnimTask_RunSinAnimTimer;\n}\n\nstatic void AnimTask_RunSinAnimTimer(u8 taskId)\n{\n    gBattleAnimArgs[7] = (gBattleAnimArgs[7] + 3) & 0xFF;\n    if (--gTasks[taskId].data[0] == 0)\n        DestroyAnimVisualTask(taskId);\n}\n\n// Flashing blue orbs grow in size near the attacker. First stage of Hydro Cannon\nstatic void AnimHydroCannonCharge(struct Sprite *sprite)\n{\n    u8 priority;\n\n    sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);\n    sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);\n    sprite->y2 = -10;\n    priority = GetBattlerSpriteSubpriority(gBattleAnimAttacker);\n    if (!IsContest())\n    {\n        if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n        {\n            sprite->x2 = 10;\n            sprite->subpriority = priority + 2;\n        }\n        else\n        {\n            sprite->x2 = -10;\n            sprite->subpriority = priority - 2;\n        }\n    }\n    else\n    {\n        sprite->x2 = -10;\n        sprite->subpriority = priority + 2;\n    }\n    sprite->callback = AnimHydroCannonCharge_Step;\n}\n\nstatic void AnimHydroCannonCharge_Step(struct Sprite *sprite)\n{\n    if (sprite->affineAnimEnded)\n        DestroyAnimSprite(sprite);\n}\n\n// Flashing blue orbs move from the attacker to the target. Second stage of Hydro Cannon\nstatic void AnimHydroCannonBeam(struct Sprite *sprite)\n{\n    bool8 animType;\n    u8 coordType;\n    if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))\n    {\n        gBattleAnimArgs[0] *= -1;\n        if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_LEFT)\n            gBattleAnimArgs[0] *= -1;\n    }\n    if ((gBattleAnimArgs[5] & 0xFF00) == 0)\n        animType = TRUE;\n    else\n        animType = FALSE;\n    if ((u8)gBattleAnimArgs[5] == 0)\n        coordType = BATTLER_COORD_Y_PIC_OFFSET;\n    else\n        coordType = 1;\n    InitSpritePosToAnimAttacker(sprite, animType);\n    if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)\n        gBattleAnimArgs[2] = -gBattleAnimArgs[2];\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];\n    sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, coordType) + gBattleAnimArgs[3];\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\n// Water droplet appears and drips down. Used by Water Gun on impact\nstatic void AnimWaterGunDroplet(struct Sprite *sprite)\n{\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    sprite->data[0] = gBattleAnimArgs[4];\n    sprite->data[2] = sprite->x + gBattleAnimArgs[2];\n    sprite->data[4] = sprite->y + gBattleAnimArgs[4];\n    sprite->callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);\n}\n\nstatic void AnimSmallBubblePair(struct Sprite *sprite)\n{\n    if (gBattleAnimArgs[3] != ANIM_ATTACKER)\n        InitSpritePosToAnimTarget(sprite, TRUE);\n    else\n        InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[7] = gBattleAnimArgs[2];\n    sprite->callback = AnimSmallBubblePair_Step;\n}\n\nstatic void AnimSmallBubblePair_Step(struct Sprite *sprite)\n{\n    sprite->data[0] = (sprite->data[0] + 11) & 0xFF;\n    sprite->x2 = Sin(sprite->data[0], 4);\n    sprite->data[1] += 48;\n    sprite->y2 = -(sprite->data[1] >> 8);\n    if (sprite->data[7]-- == 0)\n        DestroyAnimSprite(sprite);\n}\n\nvoid AnimTask_CreateSurfWave(u8 taskId)\n{\n    struct BattleAnimBgData animBg;\n    u8 taskId2;\n    u16 *x, *y; //These pointers are needed to match\n\n    x = &gBattle_BG1_X;\n    y = &gBattle_BG1_Y;\n\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);\n    SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1);\n    GetBattleAnimBg1Data(&animBg);\n    if (!IsContest())\n    {\n        SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);\n        if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)\n            AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBgTilemap_SurfOpponent);\n        else\n            AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBgTilemap_SurfPlayer);\n    }\n    else\n    {\n        // Changed from Emerald\n        LZDecompressVram(gBattleAnimBgTilemap_SurfContest, animBg.bgTilemap);\n        RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 1);\n    }\n    AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBgImage_Surf, animBg.tilesOffset);\n    if (gBattleAnimArgs[0] == 0)\n        LoadCompressedPalette(gBattleAnimBgPalette_Surf, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n    else\n        LoadCompressedPalette(gBattleAnimBgPalette_MuddyWater, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);\n    taskId2 = CreateTask(AnimTask_SurfWaveScanlineEffect, gTasks[taskId].priority + 1);\n    gTasks[taskId].data[15] = taskId2;\n    gTasks[taskId2].data[0] = 0;\n    gTasks[taskId2].data[1] = 0x1000;\n    gTasks[taskId2].data[2] = 0x1000;\n    if (IsContest())\n    {\n        *x = -80;\n        *y = -48;\n        gTasks[taskId].data[0] = 2;\n        gTasks[taskId].data[1] = 1;\n        gTasks[taskId2].data[3] = 0;\n    }\n    else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)\n    {\n        *x = -224;\n        *y = 256;\n        gTasks[taskId].data[0] = 2;\n        gTasks[taskId].data[1] = -1;\n        gTasks[taskId2].data[3] = 1;\n    }\n    else\n    {\n        *x = 0;\n        *y = -48;\n        gTasks[taskId].data[0] = -2;\n        gTasks[taskId].data[1] = 1;\n        gTasks[taskId2].data[3] = 0;\n    }\n    SetGpuReg(REG_OFFSET_BG1HOFS, *x);\n    SetGpuReg(REG_OFFSET_BG1VOFS, *y);\n    if (gTasks[taskId2].data[3] == 0)\n    {\n        gTasks[taskId2].data[4] = 48;\n        gTasks[taskId2].data[5] = 112;\n    }\n    else\n    {\n        gTasks[taskId2].data[4] = 0;\n        gTasks[taskId2].data[5] = 0;\n    }\n    gTasks[taskId].data[6] = 1;\n    gTasks[taskId].func = AnimTask_CreateSurfWave_Step1;\n}\n\nstatic void AnimTask_CreateSurfWave_Step1(u8 taskId)\n{\n    u16 rgbBuffer;\n    u32 i;\n    u16 *BGptrX, *BGptrY;\n    struct BattleAnimBgData animBg;\n\n    BGptrX = &gBattle_BG1_X;\n    BGptrY = &gBattle_BG1_Y;\n\n    *BGptrX += gTasks[taskId].data[0];\n    *BGptrY += gTasks[taskId].data[1];\n    GetBattleAnimBg1Data(&animBg);\n    gTasks[taskId].data[2] += gTasks[taskId].data[1];\n    if (++gTasks[taskId].data[5] == 4)\n    {\n        rgbBuffer = gPlttBufferFaded[16 * animBg.paletteId + 7];\n        for (i = 6; i != 0; i--) // i > 0 generates the exact same code in this context\n        {\n            gPlttBufferFaded[16 * animBg.paletteId + 1 + i] = gPlttBufferFaded[16 * animBg.paletteId + 1 + i - 1]; // 1 + i - 1 is needed to match for some bizarre reason\n        }\n        gPlttBufferFaded[16 * animBg.paletteId + 1] = rgbBuffer;\n        gTasks[taskId].data[5] = 0;\n    }\n    if (++gTasks[taskId].data[6] > 1)\n    {\n        gTasks[taskId].data[6] = 0;\n        if (++gTasks[taskId].data[3] < 14)\n        {\n            gTasks[gTasks[taskId].data[15]].data[1] = (s16)((gTasks[taskId].data[3]) | ((16 - gTasks[taskId].data[3]) << 8));\n            gTasks[taskId].data[4]++;\n        }\n        if (gTasks[taskId].data[3] > 54)\n        {\n            gTasks[taskId].data[4]--;\n            gTasks[gTasks[taskId].data[15]].data[1] = (s16)((gTasks[taskId].data[4]) | ((16 - gTasks[taskId].data[4]) << 8));\n        }\n    }\n    if (!(gTasks[gTasks[taskId].data[15]].data[1] & 0x1F))\n    {\n        gTasks[taskId].data[0] = gTasks[gTasks[taskId].data[15]].data[1] & 0x1F;\n        gTasks[taskId].func = AnimTask_CreateSurfWave_Step2;\n    }\n}\n\nstatic void AnimTask_CreateSurfWave_Step2(u8 taskId)\n{\n    u16 *BGptrX = &gBattle_BG1_X;\n    u16 *BGptrY = &gBattle_BG1_Y;\n    if (gTasks[taskId].data[0] == 0)\n    {\n        InitBattleAnimBg(1);\n        InitBattleAnimBg(2);\n        gTasks[taskId].data[0]++;\n    }\n    else\n    {\n        if (!IsContest())\n            SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);\n        *BGptrX = 0;\n        *BGptrY = 0;\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));\n        gTasks[gTasks[taskId].data[15]].data[15] = -1;\n        DestroyAnimVisualTask(taskId);\n    }\n}\n\nstatic void AnimTask_SurfWaveScanlineEffect(u8 taskId)\n{\n    s32 i;\n    struct ScanlineEffectParams params;\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        for (i = 0; i < task->data[4]; i++)\n            gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2];\n        for (i = task->data[4]; i < task->data[5]; i++)\n            gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[1];\n        for (i = task->data[5]; i < 160; i++)\n            gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2];\n\n        if (task->data[4] == 0)\n            gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[1];\n        else\n            gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2];\n\n        params.dmaDest = (vu16 *)REG_ADDR_BLDALPHA;\n        params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;\n        params.initState = 1;\n        params.unused9 = 0;\n        ScanlineEffect_SetParams(params);\n        task->data[0]++;\n        break;\n    case 1:\n        if (task->data[3] == 0)\n        {\n            if (--task->data[4] <= 0)\n            {\n                task->data[4] = 0;\n                task->data[0]++;\n            }\n        }\n        else if (++task->data[5] > 111)\n        {\n            task->data[0]++;\n        }\n\n        for (i = 0; i < task->data[4]; i++)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[2];\n        for (i = task->data[4]; i < task->data[5]; i++)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[1];\n        for (i = task->data[5]; i < 160; i++)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[2];\n        break;\n    case 2:\n        for (i = 0; i < task->data[4]; i++)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[2];\n        for (i = task->data[4]; i < task->data[5]; i++)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[1];\n        for (i = task->data[5]; i < 160; i++)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[2];\n\n        if (task->data[15] == -1)\n        {\n            ScanlineEffect_Stop();\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void AnimSmallDriftingBubbles(struct Sprite *sprite)\n{\n    s16 randData;\n    s16 randData2;\n\n    sprite->oam.tileNum += 8;\n    InitSpritePosToAnimTarget(sprite, TRUE);\n    randData = (Random() & 0xFF) | 256;\n    randData2 = (Random() & 0x1FF);\n    if (randData2 > 255)\n        randData2 = 256 - randData2;\n    sprite->data[1] = randData;\n    sprite->data[2] = randData2;\n    sprite->callback = AnimSmallDriftingBubbles_Step;\n}\n\nstatic void AnimSmallDriftingBubbles_Step(struct Sprite *sprite)\n{\n    sprite->data[3] += sprite->data[1];\n    sprite->data[4] += sprite->data[2];\n    if (sprite->data[1] & 1)\n        sprite->x2 = -(sprite->data[3] >> 8);\n    else\n        sprite->x2 = sprite->data[3] >> 8;\n    sprite->y2 = sprite->data[4] >> 8;\n    if (++sprite->data[0] == 21)\n        DestroyAnimSprite(sprite);\n}\n\nvoid AnimTask_WaterSpoutLaunch(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER);\n    task->data[5] = gSprites[task->data[15]].y;\n    task->data[1] = GetWaterSpoutPowerForAnim();\n    PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL);\n    task->func = AnimTask_WaterSpoutLaunch_Step;\n}\n\nstatic void AnimTask_WaterSpoutLaunch_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x100, 0x100, 224, 0x200, 32);\n        task->data[0]++;\n    case 1:\n        if (++task->data[3] > 1)\n        {\n            task->data[3] = 0;\n            if (++task->data[4] & 1)\n            {\n                gSprites[task->data[15]].x2 = 3;\n                gSprites[task->data[15]].y++;\n            }\n            else\n            {\n                gSprites[task->data[15]].x2 = -3;\n            }\n        }\n        if (BattleAnimHelper_RunSpriteSquash(task) == 0)\n        {\n            SetBattlerSpriteYOffsetFromYScale(task->data[15]);\n            gSprites[task->data[15]].x2 = 0;\n            task->data[3] = 0;\n            task->data[4] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 2:\n        if (++task->data[3] > 4)\n        {\n            BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 224, 0x200, 384, 224, 8);\n            task->data[3] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 3:\n        if (BattleAnimHelper_RunSpriteSquash(task) == 0)\n        {\n            task->data[3] = 0;\n            task->data[4] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 4:\n        CreateWaterSpoutLaunchDroplets(task, taskId);\n        task->data[0]++;\n    case 5:\n        if (++task->data[3] > 1)\n        {\n            task->data[3] = 0;\n            if (++task->data[4] & 1)\n                gSprites[task->data[15]].y2 += 2;\n            else\n                gSprites[task->data[15]].y2 -= 2;\n            if (task->data[4] == 10)\n            {\n                BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 384, 224, 0x100, 0x100, 8);\n                task->data[3] = 0;\n                task->data[4] = 0;\n                task->data[0]++;\n            }\n        }\n        break;\n    case 6:\n        gSprites[task->data[15]].y--;\n        if (BattleAnimHelper_RunSpriteSquash(task) == 0)\n        {\n            ResetSpriteRotScale(task->data[15]);\n            gSprites[task->data[15]].y = task->data[5];\n            task->data[4] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 7:\n        if (task->data[2] == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\n// Returns a value 0-3 relative to which quarter HP the attacker is in\n// A higher number results in more water sprites during the Water Spout animation\nstatic u8 GetWaterSpoutPowerForAnim(void)\n{\n    u32 i;\n    u16 hp;\n    u16 maxhp;\n    u16 partyIndex;\n    struct Pokemon *slot;\n\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n    {\n        partyIndex = gBattlerPartyIndexes[gBattleAnimAttacker];\n        slot =  &gPlayerParty[partyIndex];\n        maxhp = GetMonData(slot, MON_DATA_MAX_HP);\n        hp = GetMonData(slot, MON_DATA_HP);\n        maxhp /= 4;\n    }\n    else\n    {\n        partyIndex = gBattlerPartyIndexes[gBattleAnimAttacker];\n        slot =  &gEnemyParty[partyIndex];\n        maxhp = GetMonData(slot, MON_DATA_MAX_HP);\n        hp = GetMonData(slot, MON_DATA_HP);\n        maxhp /= 4;\n    }\n    for (i = 0; i < 3; i++)\n    {\n        if (hp < maxhp * (i + 1))\n            return i;\n    }\n    return 3;\n}\n\nstatic void CreateWaterSpoutLaunchDroplets(struct Task *task, u8 taskId)\n{\n    s32 i;\n    s16 attackerCoordX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    s16 attackerCoordY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    s16 trigIndex = 172;\n    u8 subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1;\n    s16 increment = 4 - task->data[1];\n    u8 spriteId;\n\n    if (increment <= 0)\n        increment = 1;\n    for (i = 0; i < 20; i += increment)\n    {\n        spriteId = CreateSprite(&gSmallWaterOrbSpriteTemplate, attackerCoordX, attackerCoordY, subpriority);\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].data[1] = i;\n            gSprites[spriteId].data[2] = attackerCoordX * 16;\n            gSprites[spriteId].data[3] = attackerCoordY * 16;\n            gSprites[spriteId].data[4] = Cos(trigIndex, 64);\n            gSprites[spriteId].data[5] = Sin(trigIndex, 64);\n            gSprites[spriteId].data[6] = taskId;\n            gSprites[spriteId].data[7] = 2;\n            if (task->data[2] & 1)\n                AnimSmallWaterOrb(&gSprites[spriteId]);\n            task->data[2]++;\n        }\n        trigIndex = (trigIndex + increment * 2);\n        trigIndex &= 0xFF;\n    }\n}\n\nstatic void AnimSmallWaterOrb(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->data[4] += (sprite->data[1] % 6) * 3;\n        sprite->data[5] += (sprite->data[1] % 3) * 3;\n        sprite->data[0]++;\n    case 1:\n        sprite->data[2] += sprite->data[4];\n        sprite->data[3] += sprite->data[5];\n        sprite->x = sprite->data[2] >> 4;\n        sprite->y = sprite->data[3] >> 4;\n        if (sprite->x < -8 || sprite->x > 248 || sprite->y < -8 || sprite->y > 120)\n        {\n            gTasks[sprite->data[6]].data[sprite->data[7]]--;\n            DestroySprite(sprite);\n        }\n        break;\n    }\n}\n\nvoid AnimTask_WaterSpoutRain(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->data[1] = GetWaterSpoutPowerForAnim();\n    if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)\n    {\n        task->data[4] = 136;\n        task->data[6] = 40;\n    }\n    else\n    {\n        task->data[4] = 16;\n        task->data[6] = 80;\n    }\n    task->data[5] = 98;\n    task->data[7] = task->data[4] + 49;\n    task->data[12] = task->data[1] * 5 + 5;\n    task->func = AnimTask_WaterSpoutRain_Step;\n}\n\nstatic void AnimTask_WaterSpoutRain_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    u8 taskId2;\n\n    switch (task->data[0])\n    {\n    case 0:\n        if (++task->data[2] > 2)\n        {\n            task->data[2] = 0;\n            CreateWaterSpoutRainDroplet(task, taskId);\n        }\n        if (task->data[10] != 0 && task->data[13] == 0)\n        {\n            gBattleAnimArgs[0] = ANIM_TARGET;\n            gBattleAnimArgs[1] = 0;\n            gBattleAnimArgs[2] = 12;\n            taskId2 = CreateTask(AnimTask_HorizontalShake, 80);\n            if (taskId2 != 0xFF)\n            {\n                gTasks[taskId2].func(taskId2);\n                gAnimVisualTaskCount++;\n            }\n            gBattleAnimArgs[0] = ANIM_DEF_PARTNER;\n            taskId2 = CreateTask(AnimTask_HorizontalShake, 80);\n            if (taskId2 != 0xFF)\n            {\n                gTasks[taskId2].func(taskId2);\n                gAnimVisualTaskCount++;\n            }\n            task->data[13] = 1;\n        }\n        if (task->data[11] >= task->data[12])\n            task->data[0]++;\n        break;\n    case 1:\n        if (task->data[9] == 0)\n            DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void CreateWaterSpoutRainDroplet(struct Task *task, u8 taskId)\n{\n    u16 yPosArg = ((gSineTable[task->data[8]] + 3) >> 4) + task->data[6];\n    u8 spriteId = CreateSprite(&gSmallWaterOrbSpriteTemplate, task->data[7], 0, 0);\n\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].callback = AnimWaterSpoutRain;\n        gSprites[spriteId].data[5] = yPosArg;\n        gSprites[spriteId].data[6] = taskId;\n        gSprites[spriteId].data[7] = 9;\n        task->data[9]++;\n    }\n    task->data[11]++;\n    task->data[8] = (task->data[8] + 39) & 0xFF;\n    task->data[7] = (ISO_RANDOMIZE2(task->data[7]) % task->data[5]) + task->data[4];\n}\n\nstatic void AnimWaterSpoutRain(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        sprite->y += 8;\n        if (sprite->y >= sprite->data[5])\n        {\n            gTasks[sprite->data[6]].data[10] = 1;\n            sprite->data[1] = CreateSprite(&gWaterHitSplatSpriteTemplate, sprite->x, sprite->y, 1);\n            if (sprite->data[1] != MAX_SPRITES)\n            {\n                StartSpriteAffineAnim(&gSprites[sprite->data[1]], 3);\n                gSprites[sprite->data[1]].data[6] = sprite->data[6];\n                gSprites[sprite->data[1]].data[7] = sprite->data[7];\n                gSprites[sprite->data[1]].callback = AnimWaterSpoutRainHit;\n            }\n            DestroySprite(sprite);\n        }\n    }\n}\n\nstatic void AnimWaterSpoutRainHit(struct Sprite *sprite)\n{\n    if (++sprite->data[1] > 1)\n    {\n        sprite->data[1] = 0;\n        sprite->invisible ^= 1;\n        if (++sprite->data[2] == 12)\n        {\n            gTasks[sprite->data[6]].data[sprite->data[7]]--;\n            FreeOamMatrix(sprite->oam.matrixNum);\n            DestroySprite(sprite);\n        }\n    }\n}\n\nvoid AnimTask_WaterSport(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);\n    task->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);\n    task->data[7] = (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) ? 1 : -1;\n    if (IsContest())\n        task->data[7] *= -1;\n    task->data[5] = task->data[3] + task->data[7] * 8;\n    task->data[6] = task->data[4] - task->data[7] * 8;\n    task->data[9] = -32;\n    task->data[1] = 0;\n    task->data[0] = 0;\n    task->func = AnimTask_WaterSport_Step;\n}\n\nstatic void AnimTask_WaterSport_Step(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->data[0])\n    {\n    case 0:\n        CreateWaterSportDroplet(task);\n        if (task->data[10] != 0)\n            task->data[0]++;\n        break;\n    case 1:\n        CreateWaterSportDroplet(task);\n        if (++task->data[1] > 16)\n        {\n            task->data[1] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 2:\n        CreateWaterSportDroplet(task);\n        task->data[5] += task->data[7] * 6;\n        if (!(task->data[5] >= -16 && task->data[5] <= 256))\n        {\n            if (++task->data[12] > 2)\n            {\n                task->data[13] = 1;\n                task->data[0] = 6;\n                task->data[1] = 0;\n            }\n            else\n            {\n                task->data[1] = 0;\n                task->data[0]++;\n            }\n        }\n        break;\n    case 3:\n        CreateWaterSportDroplet(task);\n        task->data[6] -= task->data[7] * 2;\n        if (++task->data[1] > 7)\n            task->data[0]++;\n        break;\n    case 4:\n        CreateWaterSportDroplet(task);\n        task->data[5] -= task->data[7] * 6;\n        if (!(task->data[5] >= -16 && task->data[5] <= 256))\n        {\n            task->data[12]++;\n            task->data[1] = 0;\n            task->data[0]++;\n        }\n        break;\n    case 5:\n        CreateWaterSportDroplet(task);\n        task->data[6] -= task->data[7] * 2;\n        if (++task->data[1] > 7)\n            task->data[0] = 2;\n        break;\n    case 6:\n        if (task->data[8] == 0)\n            task->data[0]++;\n        break;\n    default:\n        DestroyAnimVisualTask(taskId);\n        break;\n    }\n}\n\nstatic void CreateWaterSportDroplet(struct Task *task)\n{\n    u8 spriteId;\n\n    if (++task->data[2] > 1)\n    {\n        task->data[2] = 0;\n        spriteId = CreateSprite(&gSmallWaterOrbSpriteTemplate, task->data[3], task->data[4], 10);\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].data[0] = 16;\n            gSprites[spriteId].data[2] = task->data[5];\n            gSprites[spriteId].data[4] = task->data[6];\n            gSprites[spriteId].data[5] = task->data[9];\n            InitAnimArcTranslation(&gSprites[spriteId]);\n            gSprites[spriteId].callback = AnimWaterSportDroplet;\n            task->data[8]++;\n        }\n    }\n}\n\nstatic void AnimWaterSportDroplet(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n    {\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->data[0] = 6;\n        sprite->data[2] = (Random() & 0x1F) - 16 + sprite->x;\n        sprite->data[4] = (Random() & 0x1F) - 16 + sprite->y;\n        sprite->data[5] = ~(Random() & 7);\n        InitAnimArcTranslation(sprite);\n        sprite->callback = AnimWaterSportDroplet_Step;\n    }\n}\n\nstatic void AnimWaterSportDroplet_Step(struct Sprite *sprite)\n{\n    u32 i;\n\n    if (TranslateAnimHorizontalArc(sprite))\n    {\n        for (i = 0; i < NUM_TASKS; i++)\n        {\n            if (gTasks[i].func == AnimTask_WaterSport_Step)\n            {\n                gTasks[i].data[10] = 1;\n                gTasks[i].data[8]--;\n                DestroySprite(sprite);\n            }\n        }\n    }\n}\n\nstatic void AnimWaterPulseBubble(struct Sprite *sprite)\n{\n    sprite->x = gBattleAnimArgs[0];\n    sprite->y = gBattleAnimArgs[1];\n    sprite->data[0] = gBattleAnimArgs[2];\n    sprite->data[1] = gBattleAnimArgs[3];\n    sprite->data[2] = gBattleAnimArgs[4];\n    sprite->data[3] = gBattleAnimArgs[5];\n    sprite->callback = AnimWaterPulseBubble_Step;\n}\n\nstatic void AnimWaterPulseBubble_Step(struct Sprite *sprite)\n{\n    sprite->data[4] -= sprite->data[0];\n    sprite->y2 = sprite->data[4] / 10;\n    sprite->data[5] = (sprite->data[5] + sprite->data[1]) & 0xFF;\n    sprite->x2 = Sin(sprite->data[5], sprite->data[2]);\n    if (--sprite->data[3] == 0)\n        DestroyAnimSprite(sprite);\n}\n\nstatic void AnimWaterPulseRingBubble(struct Sprite *sprite)\n{\n    sprite->data[3] += sprite->data[1];\n    sprite->data[4] += sprite->data[2];\n    sprite->x2 = sprite->data[3] >> 7;\n    sprite->y2 = sprite->data[4] >> 7;\n    if (--sprite->data[0] == 0)\n    {\n        FreeSpriteOamMatrix(sprite);\n        DestroySprite(sprite);\n    }\n}\n\nvoid AnimWaterPulseRing(struct Sprite *sprite)\n{\n    InitSpritePosToAnimAttacker(sprite, TRUE);\n    sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);\n    sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);\n    sprite->data[3] = gBattleAnimArgs[2];\n    sprite->data[4] = gBattleAnimArgs[3];\n    sprite->callback = AnimWaterPulseRing_Step;\n}\n\nstatic void AnimWaterPulseRing_Step(struct Sprite *sprite)\n{\n    int xDiff = sprite->data[1] - sprite->x;\n    int yDiff = sprite->data[2] - sprite->y;\n\n    sprite->x2 = (sprite->data[0] * xDiff) / sprite->data[3];\n    sprite->y2 = (sprite->data[0] * yDiff) / sprite->data[3];\n    if (++sprite->data[5] == sprite->data[4])\n    {\n        sprite->data[5] = 0;\n        CreateWaterPulseRingBubbles(sprite, xDiff, yDiff);\n    }\n    if (sprite->data[3] == sprite->data[0])\n        DestroyAnimSprite(sprite);\n    sprite->data[0]++;\n}\n\nstatic void CreateWaterPulseRingBubbles(struct Sprite *sprite, s32 xDiff, s32 yDiff)\n{\n    s16 combinedX, combinedY;\n    s16 i, something;\n    s16 unusedVar = 1; //unusedVar is needed to match\n    s16 somethingRandomX, somethingRandomY;\n    u8 spriteId;\n\n    something = sprite->data[0] / 2;\n    combinedX = sprite->x + sprite->x2;\n    combinedY = sprite->y + sprite->y2;\n    if (yDiff < 0)\n        unusedVar *= -1; //Needed to Match\n    somethingRandomY = yDiff + (Random() % 10) - 5;\n    somethingRandomX = -xDiff + (Random() % 10) - 5;\n\n    for (i = 0; i < 1; i++)\n    {\n        spriteId = CreateSprite(&gWaterPulseRingBubbleSpriteTemplate, combinedX, combinedY + something, 130);\n        gSprites[spriteId].data[0] = 20;\n        gSprites[spriteId].data[1] = somethingRandomY;\n        gSprites[spriteId].subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1;\n        if (somethingRandomX < 0)\n        {\n            gSprites[spriteId].data[2] = -somethingRandomX;\n        }\n        else\n        {\n            gSprites[spriteId].data[2] = somethingRandomX;\n        }\n    }\n    for (i = 0; i < 1; i++)\n    {\n        spriteId = CreateSprite(&gWaterPulseRingBubbleSpriteTemplate, combinedX, combinedY - something, 130);\n        gSprites[spriteId].data[0] = 20;\n        gSprites[spriteId].data[1] = somethingRandomY;\n        gSprites[spriteId].subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1;\n        if (somethingRandomX > 0)\n        {\n            gSprites[spriteId].data[2] = -somethingRandomX;\n        }\n        else\n        {\n            gSprites[spriteId].data[2] = somethingRandomX;\n        }\n    }\n}\n\n"
  },
  {
    "path": "src/battle_bg.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_bg.h\"\n#include \"battle_message.h\"\n#include \"decompress.h\"\n#include \"event_data.h\"\n#include \"graphics.h\"\n#include \"link.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"text_window.h\"\n#include \"trig.h\"\n#include \"constants/maps.h\"\n#include \"constants/songs.h\"\n#include \"constants/trainers.h\"\n\n#define TAG_VS_LETTERS 10000\n\nstruct BattleBackground\n{\n    const void *tileset;\n    const void *tilemap;\n    const void *entryTileset;\n    const void *entryTilemap;\n    const void *palette;\n};\n\nstatic void CB2_unused(void);\nstatic u8 GetBattleTerrainOverride(void);\n\nstatic const u8 sUnused[] = {1, 2};\n\nstatic const struct OamData sVsLetter_V_OamData = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0x000,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const struct OamData sVsLetter_S_OamData = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0x040,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const union AffineAnimCmd sVsLetterAffineAnimCmds0[] = {\n    AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sVsLetterAffineAnimCmds1[] = {\n    AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0),\n    AFFINEANIMCMD_FRAME(0x18, 0x18, 0x0, 0x80),\n    AFFINEANIMCMD_FRAME(0x18, 0x18, 0x0, 0x80),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sVsLetterAffineAnimTable[] = {\n    sVsLetterAffineAnimCmds0,\n    sVsLetterAffineAnimCmds1\n};\n\nstatic const struct SpriteTemplate sVsLetter_V_SpriteTemplate = {\n    .tileTag = TAG_VS_LETTERS,\n    .paletteTag = TAG_VS_LETTERS,\n    .oam = &sVsLetter_V_OamData,\n    .anims = gDummySpriteAnimTable,\n    .affineAnims = sVsLetterAffineAnimTable,\n    .callback = SpriteCB_VsLetterDummy\n};\n\nstatic const struct SpriteTemplate sVsLetter_S_SpriteTemplate = {\n    .tileTag = TAG_VS_LETTERS,\n    .paletteTag = TAG_VS_LETTERS,\n    .oam = &sVsLetter_S_OamData,\n    .anims = gDummySpriteAnimTable,\n    .affineAnims = sVsLetterAffineAnimTable,\n    .callback = SpriteCB_VsLetterDummy\n};\n\nstatic const struct CompressedSpriteSheet sVsLettersSpriteSheet = {\n    gVsLettersGfx,\n    0x1000,\n    TAG_VS_LETTERS\n};\n\nconst struct BgTemplate gBattleBgTemplates[4] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 24,\n        .screenSize = 2,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 28,\n        .screenSize = 2,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 30,\n        .screenSize = 1,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    }, {\n        .bg = 3,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 26,\n        .screenSize = 1,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct WindowTemplate sStandardBattleWindowTemplates[] = {\n    [B_WIN_MSG] = {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 15,\n        .width = 28,\n        .height = 4,\n        .paletteNum = 0,\n        .baseBlock = 0x090\n    },\n    [B_WIN_ACTION_PROMPT] = {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 35,\n        .width = 14,\n        .height = 4,\n        .paletteNum = 0,\n        .baseBlock = 0x1c0\n    },\n    [B_WIN_ACTION_MENU] = {\n        .bg = 0,\n        .tilemapLeft = 17,\n        .tilemapTop = 35,\n        .width = 12,\n        .height = 4,\n        .paletteNum = 5,\n        .baseBlock = 0x190\n    },\n    [B_WIN_MOVE_NAME_1] = {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 55,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x300\n    },\n    [B_WIN_MOVE_NAME_2] = {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 55,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x310\n    },\n    [B_WIN_MOVE_NAME_3] = {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 57,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x320\n    },\n    [B_WIN_MOVE_NAME_4] = {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 57,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x330\n    },\n    [B_WIN_PP] = {\n        .bg = 0,\n        .tilemapLeft = 21,\n        .tilemapTop = 55,\n        .width = 3,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x290\n    },\n    [B_WIN_MOVE_TYPE] = {\n        .bg = 0,\n        .tilemapLeft = 21,\n        .tilemapTop = 57,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x296\n    },\n    [B_WIN_PP_REMAINING] = {\n        .bg = 0,\n        .tilemapLeft = 24,\n        .tilemapTop = 55,\n        .width = 5,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x2a6\n    },\n    [B_WIN_DUMMY] = {\n        .bg = 0,\n        .tilemapLeft = 25,\n        .tilemapTop = 57,\n        .width = 0,\n        .height = 0,\n        .paletteNum = 5,\n        .baseBlock = 0x2b0\n    },\n    [B_WIN_SWITCH_PROMPT] = {\n        .bg = 0,\n        .tilemapLeft = 21,\n        .tilemapTop = 55,\n        .width = 8,\n        .height = 4,\n        .paletteNum = 5,\n        .baseBlock = 0x2b0\n    },\n    [B_WIN_LEVEL_UP_BOX] = {\n        .bg = 1,\n        .tilemapLeft = 19,\n        .tilemapTop = 8,\n        .width = 10,\n        .height = 11,\n        .paletteNum = 5,\n        .baseBlock = 0x100\n    },\n    [B_WIN_LEVEL_UP_BANNER] = {\n        .bg = 2,\n        .tilemapLeft = 18,\n        .tilemapTop = 0,\n        .width = 12,\n        .height = 3,\n        .paletteNum = 6,\n        .baseBlock = 0x16e\n    },\n    [B_WIN_YESNO] = {\n        .bg = 0,\n        .tilemapLeft = 25,\n        .tilemapTop = 9,\n        .width = 4,\n        .height = 4,\n        .paletteNum = 5,\n        .baseBlock = 0x100\n    },\n    [B_WIN_VS_PLAYER] = {\n        .bg = 1,\n        .tilemapLeft = 2,\n        .tilemapTop = 3,\n        .width = 7,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x020\n    },\n    [B_WIN_VS_OPPONENT] = {\n        .bg = 2,\n        .tilemapLeft = 2,\n        .tilemapTop = 3,\n        .width = 7,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x040\n    },\n    [B_WIN_VS_MULTI_PLAYER_1] = {\n        .bg = 1,\n        .tilemapLeft = 2,\n        .tilemapTop = 2,\n        .width = 7,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x020\n    },\n    [B_WIN_VS_MULTI_PLAYER_2] = {\n        .bg = 2,\n        .tilemapLeft = 2,\n        .tilemapTop = 2,\n        .width = 7,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x040\n    },\n    [B_WIN_VS_MULTI_PLAYER_3] = {\n        .bg = 1,\n        .tilemapLeft = 2,\n        .tilemapTop = 6,\n        .width = 7,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x060\n    },\n    [B_WIN_VS_MULTI_PLAYER_4] = {\n        .bg = 2,\n        .tilemapLeft = 2,\n        .tilemapTop = 6,\n        .width = 7,\n        .height = 2,\n        .paletteNum = 5,\n        .baseBlock = 0x080\n    },\n    [B_WIN_VS_OUTCOME_DRAW] = {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 2,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 0,\n        .baseBlock = 0x0a0\n    },\n    [B_WIN_VS_OUTCOME_LEFT] = {\n        .bg = 0,\n        .tilemapLeft = 4,\n        .tilemapTop = 2,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 0,\n        .baseBlock = 0x0a0\n    },\n    [B_WIN_VS_OUTCOME_RIGHT] = {\n        .bg = 0,\n        .tilemapLeft = 19,\n        .tilemapTop = 2,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 0,\n        .baseBlock = 0x0b0\n    },\n    [B_WIN_OAK_OLD_MAN] = {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 7,\n        .baseBlock = 0x090\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const u32 sBattleTerrainPalette_Grass[] = INCBIN_U32(\"graphics/battle_terrain/grass/terrain.gbapal.lz\");\nstatic const u32 sBattleTerrainTiles_Grass[] = INCBIN_U32(\"graphics/battle_terrain/grass/terrain.4bpp.lz\");\nstatic const u32 sBattleTerrainTilemap_Grass[] = INCBIN_U32(\"graphics/battle_terrain/grass/terrain.bin.lz\");\nstatic const u32 sBattleTerrainAnimTiles_Grass[] = INCBIN_U32(\"graphics/battle_terrain/grass/anim.4bpp.lz\");\nstatic const u32 sBattleTerrainAnimTilemap_Grass[] = INCBIN_U32(\"graphics/battle_terrain/grass/anim.bin.lz\");\n\nstatic const u32 sBattleTerrainPalette_LongGrass[] = INCBIN_U32(\"graphics/battle_terrain/longgrass/terrain.gbapal.lz\");\nstatic const u32 sBattleTerrainTiles_LongGrass[] = INCBIN_U32(\"graphics/battle_terrain/longgrass/terrain.4bpp.lz\");\nstatic const u32 sBattleTerrainTilemap_LongGrass[] = INCBIN_U32(\"graphics/battle_terrain/longgrass/terrain.bin.lz\");\nstatic const u32 sBattleTerrainAnimTiles_LongGrass[] = INCBIN_U32(\"graphics/battle_terrain/longgrass/anim.4bpp.lz\");\nstatic const u32 sBattleTerrainAnimTilemap_LongGrass[] = INCBIN_U32(\"graphics/battle_terrain/longgrass/anim.bin.lz\");\n\nstatic const u32 sBattleTerrainPalette_Sand[] = INCBIN_U32(\"graphics/battle_terrain/sand/terrain.gbapal.lz\");\nstatic const u32 sBattleTerrainTiles_Sand[] = INCBIN_U32(\"graphics/battle_terrain/sand/terrain.4bpp.lz\");\nstatic const u32 sBattleTerrainTilemap_Sand[] = INCBIN_U32(\"graphics/battle_terrain/sand/terrain.bin.lz\");\nstatic const u32 sBattleTerrainAnimTiles_Sand[] = INCBIN_U32(\"graphics/battle_terrain/sand/anim.4bpp.lz\");\nstatic const u32 sBattleTerrainAnimTilemap_Sand[] = INCBIN_U32(\"graphics/battle_terrain/sand/anim.bin.lz\");\n\nstatic const u32 sBattleTerrainPalette_Underwater[] = INCBIN_U32(\"graphics/battle_terrain/underwater/terrain.gbapal.lz\");\nstatic const u32 sBattleTerrainTiles_Underwater[] = INCBIN_U32(\"graphics/battle_terrain/underwater/terrain.4bpp.lz\");\nstatic const u32 sBattleTerrainTilemap_Underwater[] = INCBIN_U32(\"graphics/battle_terrain/underwater/terrain.bin.lz\");\nstatic const u32 sBattleTerrainAnimTiles_Underwater[] = INCBIN_U32(\"graphics/battle_terrain/underwater/anim.4bpp.lz\");\nstatic const u32 sBattleTerrainAnimTilemap_Underwater[] = INCBIN_U32(\"graphics/battle_terrain/underwater/anim.bin.lz\");\n\nstatic const u32 sBattleTerrainPalette_Water[] = INCBIN_U32(\"graphics/battle_terrain/water/terrain.gbapal.lz\");\nstatic const u32 sBattleTerrainTiles_Water[] = INCBIN_U32(\"graphics/battle_terrain/water/terrain.4bpp.lz\");\nstatic const u32 sBattleTerrainTilemap_Water[] = INCBIN_U32(\"graphics/battle_terrain/water/terrain.bin.lz\");\nstatic const u32 sBattleTerrainAnimTiles_Water[] = INCBIN_U32(\"graphics/battle_terrain/water/anim.4bpp.lz\");\nstatic const u32 sBattleTerrainAnimTilemap_Water[] = INCBIN_U32(\"graphics/battle_terrain/water/anim.bin.lz\");\n\nstatic const u32 sBattleTerrainPalette_Pond[] = INCBIN_U32(\"graphics/battle_terrain/pond/terrain.gbapal.lz\");\nstatic const u32 sBattleTerrainTiles_Pond[] = INCBIN_U32(\"graphics/battle_terrain/pond/terrain.4bpp.lz\");\nstatic const u32 sBattleTerrainTilemap_Pond[] = INCBIN_U32(\"graphics/battle_terrain/pond/terrain.bin.lz\");\nstatic const u32 sBattleTerrainAnimTiles_Pond[] = INCBIN_U32(\"graphics/battle_terrain/pond/anim.4bpp.lz\");\nstatic const u32 sBattleTerrainAnimTilemap_Pond[] = INCBIN_U32(\"graphics/battle_terrain/pond/anim.bin.lz\");\n\nstatic const u32 sBattleTerrainPalette_Mountain[] = INCBIN_U32(\"graphics/battle_terrain/mountain/terrain.gbapal.lz\");\nstatic const u32 sBattleTerrainTiles_Mountain[] = INCBIN_U32(\"graphics/battle_terrain/mountain/terrain.4bpp.lz\");\nstatic const u32 sBattleTerrainTilemap_Mountain[] = INCBIN_U32(\"graphics/battle_terrain/mountain/terrain.bin.lz\");\nstatic const u32 sBattleTerrainAnimTiles_Mountain[] = INCBIN_U32(\"graphics/battle_terrain/mountain/anim.4bpp.lz\");\nstatic const u32 sBattleTerrainAnimTilemap_Mountain[] = INCBIN_U32(\"graphics/battle_terrain/mountain/anim.bin.lz\");\n\nstatic const u32 sBattleTerrainPalette_Cave[] = INCBIN_U32(\"graphics/battle_terrain/cave/terrain.gbapal.lz\");\nstatic const u32 sBattleTerrainTiles_Cave[] = INCBIN_U32(\"graphics/battle_terrain/cave/terrain.4bpp.lz\");\nstatic const u32 sBattleTerrainTilemap_Cave[] = INCBIN_U32(\"graphics/battle_terrain/cave/terrain.bin.lz\");\nstatic const u32 sBattleTerrainAnimTiles_Cave[] = INCBIN_U32(\"graphics/battle_terrain/cave/anim.4bpp.lz\");\nstatic const u32 sBattleTerrainAnimTilemap_Cave[] = INCBIN_U32(\"graphics/battle_terrain/cave/anim.bin.lz\");\n\nstatic const u32 sBattleTerrainPalette_Building[] = INCBIN_U32(\"graphics/battle_terrain/building/terrain.gbapal.lz\");\nstatic const u32 sBattleTerrainTiles_Building[] = INCBIN_U32(\"graphics/battle_terrain/building/terrain.4bpp.lz\");\nstatic const u32 sBattleTerrainTilemap_Building[] = INCBIN_U32(\"graphics/battle_terrain/building/terrain.bin.lz\");\nstatic const u32 sBattleTerrainAnimTiles_Building[] = INCBIN_U32(\"graphics/battle_terrain/building/anim.4bpp.lz\");\nstatic const u32 sBattleTerrainAnimTilemap_Building[] = INCBIN_U32(\"graphics/battle_terrain/building/anim.bin.lz\");\n\nstatic const u32 sBattleTerrainPalette_Link[] = INCBIN_U32(\"graphics/battle_terrain/indoor/link.gbapal.lz\");\nstatic const u32 sBattleTerrainPalette_Gym[] = INCBIN_U32(\"graphics/battle_terrain/indoor/gym.gbapal.lz\");\nstatic const u32 sBattleTerrainPalette_Leader[] = INCBIN_U32(\"graphics/battle_terrain/indoor/leader.gbapal.lz\");\nstatic const u32 sBattleTerrainPalette_Indoor2[] = INCBIN_U32(\"graphics/battle_terrain/indoor/2.gbapal.lz\");\nstatic const u32 sBattleTerrainPalette_Indoor1[] = INCBIN_U32(\"graphics/battle_terrain/indoor/1.gbapal.lz\");\nstatic const u32 sBattleTerrainPalette_Lorelei[] = INCBIN_U32(\"graphics/battle_terrain/indoor/lorelei.gbapal.lz\");\nstatic const u32 sBattleTerrainPalette_Bruno[] = INCBIN_U32(\"graphics/battle_terrain/indoor/bruno.gbapal.lz\");\nstatic const u32 sBattleTerrainPalette_Agatha[] = INCBIN_U32(\"graphics/battle_terrain/indoor/agatha.gbapal.lz\");\nstatic const u32 sBattleTerrainPalette_Lance[] = INCBIN_U32(\"graphics/battle_terrain/indoor/lance.gbapal.lz\");\nstatic const u32 sBattleTerrainPalette_Champion[] = INCBIN_U32(\"graphics/battle_terrain/indoor/champion.gbapal.lz\");\nstatic const u32 sBattleTerrainPalette_Plain[] = INCBIN_U32(\"graphics/battle_terrain/indoor/plain.gbapal.lz\");\nstatic const u32 sBattleTerrainTiles_Indoor[] = INCBIN_U32(\"graphics/battle_terrain/indoor/terrain.4bpp.lz\");\nstatic const u32 sBattleTerrainTilemap_Indoor[] = INCBIN_U32(\"graphics/battle_terrain/indoor/terrain.bin.lz\");\n\nstatic const struct BattleBackground sBattleTerrainTable[] = {\n    [BATTLE_TERRAIN_GRASS] =\n    {\n        .tileset = sBattleTerrainTiles_Grass,\n        .tilemap = sBattleTerrainTilemap_Grass,\n        .entryTileset = sBattleTerrainAnimTiles_Grass,\n        .entryTilemap = sBattleTerrainAnimTilemap_Grass,\n        .palette = sBattleTerrainPalette_Grass\n    },\n    [BATTLE_TERRAIN_LONG_GRASS] =\n    {\n        .tileset = sBattleTerrainTiles_LongGrass,\n        .tilemap = sBattleTerrainTilemap_LongGrass,\n        .entryTileset = sBattleTerrainAnimTiles_LongGrass,\n        .entryTilemap = sBattleTerrainAnimTilemap_LongGrass,\n        .palette = sBattleTerrainPalette_LongGrass\n    },\n    [BATTLE_TERRAIN_SAND] =\n    {\n        .tileset = sBattleTerrainTiles_Sand,\n        .tilemap = sBattleTerrainTilemap_Sand,\n        .entryTileset = sBattleTerrainAnimTiles_Sand,\n        .entryTilemap = sBattleTerrainAnimTilemap_Sand,\n        .palette = sBattleTerrainPalette_Sand\n    },\n    [BATTLE_TERRAIN_UNDERWATER] =\n    {\n        .tileset = sBattleTerrainTiles_Underwater,\n        .tilemap = sBattleTerrainTilemap_Underwater,\n        .entryTileset = sBattleTerrainAnimTiles_Underwater,\n        .entryTilemap = sBattleTerrainAnimTilemap_Underwater,\n        .palette = sBattleTerrainPalette_Underwater\n    },\n    [BATTLE_TERRAIN_WATER] =\n    {\n        .tileset = sBattleTerrainTiles_Water,\n        .tilemap = sBattleTerrainTilemap_Water,\n        .entryTileset = sBattleTerrainAnimTiles_Water,\n        .entryTilemap = sBattleTerrainAnimTilemap_Water,\n        .palette = sBattleTerrainPalette_Water\n    },\n    [BATTLE_TERRAIN_POND] =\n    {\n        .tileset = sBattleTerrainTiles_Pond,\n        .tilemap = sBattleTerrainTilemap_Pond,\n        .entryTileset = sBattleTerrainAnimTiles_Pond,\n        .entryTilemap = sBattleTerrainAnimTilemap_Pond,\n        .palette = sBattleTerrainPalette_Pond\n    },\n    [BATTLE_TERRAIN_MOUNTAIN] =\n    {\n        .tileset = sBattleTerrainTiles_Mountain,\n        .tilemap = sBattleTerrainTilemap_Mountain,\n        .entryTileset = sBattleTerrainAnimTiles_Mountain,\n        .entryTilemap = sBattleTerrainAnimTilemap_Mountain,\n        .palette = sBattleTerrainPalette_Mountain\n    },\n    [BATTLE_TERRAIN_CAVE] =\n    {\n        .tileset = sBattleTerrainTiles_Cave,\n        .tilemap = sBattleTerrainTilemap_Cave,\n        .entryTileset = sBattleTerrainAnimTiles_Cave,\n        .entryTilemap = sBattleTerrainAnimTilemap_Cave,\n        .palette = sBattleTerrainPalette_Cave\n    },\n    [BATTLE_TERRAIN_BUILDING] =\n    {\n        .tileset = sBattleTerrainTiles_Building,\n        .tilemap = sBattleTerrainTilemap_Building,\n        .entryTileset = sBattleTerrainAnimTiles_Building,\n        .entryTilemap = sBattleTerrainAnimTilemap_Building,\n        .palette = sBattleTerrainPalette_Building\n    },\n    [BATTLE_TERRAIN_PLAIN] =\n    {\n        .tileset = sBattleTerrainTiles_Building,\n        .tilemap = sBattleTerrainTilemap_Building,\n        .entryTileset = sBattleTerrainAnimTiles_Building,\n        .entryTilemap = sBattleTerrainAnimTilemap_Building,\n        .palette = sBattleTerrainPalette_Plain\n    },\n    [BATTLE_TERRAIN_LINK] =\n    {\n        .tileset = sBattleTerrainTiles_Building,\n        .tilemap = sBattleTerrainTilemap_Building,\n        .entryTileset = sBattleTerrainAnimTiles_Building,\n        .entryTilemap = sBattleTerrainAnimTilemap_Building,\n        .palette = sBattleTerrainPalette_Link\n    },\n    [BATTLE_TERRAIN_GYM] =\n    {\n        .tileset = sBattleTerrainTiles_Building,\n        .tilemap = sBattleTerrainTilemap_Building,\n        .entryTileset = sBattleTerrainAnimTiles_Building,\n        .entryTilemap = sBattleTerrainAnimTilemap_Building,\n        .palette = sBattleTerrainPalette_Gym\n    },\n    [BATTLE_TERRAIN_LEADER] =\n    {\n        .tileset = sBattleTerrainTiles_Building,\n        .tilemap = sBattleTerrainTilemap_Building,\n        .entryTileset = sBattleTerrainAnimTiles_Building,\n        .entryTilemap = sBattleTerrainAnimTilemap_Building,\n        .palette = sBattleTerrainPalette_Leader\n    },\n    [BATTLE_TERRAIN_INDOOR_2] =\n    {\n        .tileset = sBattleTerrainTiles_Indoor,\n        .tilemap = sBattleTerrainTilemap_Indoor,\n        .entryTileset = sBattleTerrainAnimTiles_Building,\n        .entryTilemap = sBattleTerrainAnimTilemap_Building,\n        .palette = sBattleTerrainPalette_Indoor2\n    },\n    [BATTLE_TERRAIN_INDOOR_1] =\n    {\n        .tileset = sBattleTerrainTiles_Indoor,\n        .tilemap = sBattleTerrainTilemap_Indoor,\n        .entryTileset = sBattleTerrainAnimTiles_Building,\n        .entryTilemap = sBattleTerrainAnimTilemap_Building,\n        .palette = sBattleTerrainPalette_Indoor1\n    },\n    [BATTLE_TERRAIN_LORELEI] =\n    {\n        .tileset = sBattleTerrainTiles_Indoor,\n        .tilemap = sBattleTerrainTilemap_Indoor,\n        .entryTileset = sBattleTerrainAnimTiles_Building,\n        .entryTilemap = sBattleTerrainAnimTilemap_Building,\n        .palette = sBattleTerrainPalette_Lorelei\n    },\n    [BATTLE_TERRAIN_BRUNO] =\n    {\n        .tileset = sBattleTerrainTiles_Indoor,\n        .tilemap = sBattleTerrainTilemap_Indoor,\n        .entryTileset = sBattleTerrainAnimTiles_Building,\n        .entryTilemap = sBattleTerrainAnimTilemap_Building,\n        .palette = sBattleTerrainPalette_Bruno\n    },\n    [BATTLE_TERRAIN_AGATHA] =\n    {\n        .tileset = sBattleTerrainTiles_Indoor,\n        .tilemap = sBattleTerrainTilemap_Indoor,\n        .entryTileset = sBattleTerrainAnimTiles_Building,\n        .entryTilemap = sBattleTerrainAnimTilemap_Building,\n        .palette = sBattleTerrainPalette_Agatha\n    },\n    [BATTLE_TERRAIN_LANCE] =\n    {\n        .tileset = sBattleTerrainTiles_Indoor,\n        .tilemap = sBattleTerrainTilemap_Indoor,\n        .entryTileset = sBattleTerrainAnimTiles_Building,\n        .entryTilemap = sBattleTerrainAnimTilemap_Building,\n        .palette = sBattleTerrainPalette_Lance\n    },\n    [BATTLE_TERRAIN_CHAMPION] =\n    {\n        .tileset = sBattleTerrainTiles_Indoor,\n        .tilemap = sBattleTerrainTilemap_Indoor,\n        .entryTileset = sBattleTerrainAnimTiles_Building,\n        .entryTilemap = sBattleTerrainAnimTilemap_Building,\n        .palette = sBattleTerrainPalette_Champion\n    }\n};\n\nstatic const struct {\n    u8 mapScene;\n    u8 battleTerrain;\n} sMapBattleSceneMapping[] = {\n    {MAP_BATTLE_SCENE_GYM,      BATTLE_TERRAIN_GYM},\n    {MAP_BATTLE_SCENE_INDOOR_1, BATTLE_TERRAIN_INDOOR_1},\n    {MAP_BATTLE_SCENE_INDOOR_2, BATTLE_TERRAIN_INDOOR_2},\n    {MAP_BATTLE_SCENE_LORELEI,  BATTLE_TERRAIN_LORELEI},\n    {MAP_BATTLE_SCENE_BRUNO,    BATTLE_TERRAIN_BRUNO},\n    {MAP_BATTLE_SCENE_AGATHA,   BATTLE_TERRAIN_AGATHA},\n    {MAP_BATTLE_SCENE_LANCE,    BATTLE_TERRAIN_LANCE},\n    {MAP_BATTLE_SCENE_LINK,     BATTLE_TERRAIN_LINK}\n};\n\n// Unused\nvoid CreateUnknownDebugSprite(void)\n{\n    u8 spriteId;\n\n    ResetSpriteData();\n    spriteId = CreateSprite(&gUnknownDebugSprite, 0, 0, 0);\n    gSprites[spriteId].invisible = TRUE;\n    SetMainCallback2(CB2_unused);\n}\n\nstatic void CB2_unused(void)\n{\n    AnimateSprites();\n    BuildOamBuffer();\n}\n\nstatic u8 GetBattleTerrainByMapScene(u8 mapBattleScene)\n{\n    int i;\n    for (i = 0; i < NELEMS(sMapBattleSceneMapping); i++)\n    {\n        if (mapBattleScene == sMapBattleSceneMapping[i].mapScene)\n            return sMapBattleSceneMapping[i].battleTerrain;\n    }\n    return BATTLE_TERRAIN_PLAIN;\n}\n\nstatic void LoadBattleTerrainGfx(u16 terrain)\n{\n    if (terrain >= NELEMS(sBattleTerrainTable))\n        terrain = BATTLE_TERRAIN_PLAIN;\n    // Copy to bg3\n    LZDecompressVram(sBattleTerrainTable[terrain].tileset, (void *)BG_CHAR_ADDR(2));\n    LZDecompressVram(sBattleTerrainTable[terrain].tilemap, (void *)BG_SCREEN_ADDR(26));\n    LoadCompressedPalette(sBattleTerrainTable[terrain].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);\n}\n\nstatic void LoadBattleTerrainEntryGfx(u16 terrain)\n{\n    if(gSaveBlock2Ptr->optionsBattleIntroAnim) //don't do entry anim graphics if set to Fast\n        return;\n\n    if (terrain >= NELEMS(sBattleTerrainTable))\n        terrain = BATTLE_TERRAIN_PLAIN;\n    // Copy to bg1\n    LZDecompressVram(sBattleTerrainTable[terrain].entryTileset, (void *)BG_CHAR_ADDR(1));\n    LZDecompressVram(sBattleTerrainTable[terrain].entryTilemap, (void *)BG_SCREEN_ADDR(28));\n}\n\n// Unused\nvoid GetBattleTerrainGfxPtrs(u8 terrain, const u32 **tilesPtr, const u32 **mapPtr, const u32 **palPtr)\n{\n    if (terrain > BATTLE_TERRAIN_PLAIN)\n        terrain = BATTLE_TERRAIN_PLAIN;\n    *tilesPtr = sBattleTerrainTable[terrain].tileset;\n    *mapPtr = sBattleTerrainTable[terrain].tilemap;\n    *palPtr = sBattleTerrainTable[terrain].palette;\n}\n\nvoid BattleInitBgsAndWindows(void)\n{\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, gBattleBgTemplates, NELEMS(gBattleBgTemplates));\n    InitWindows(sStandardBattleWindowTemplates);\n    DeactivateAllTextPrinters();\n}\n\nvoid InitBattleBgsVideo(void)\n{\n    EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);\n    BattleInitBgsAndWindows();\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_OBJWIN_ON);\n}\n\nvoid LoadBattleMenuWindowGfx(void)\n{\n    LoadUserWindowGfx(2, 0x012, BG_PLTT_ID(1));\n    LoadUserWindowGfx(2, 0x022, BG_PLTT_ID(1));\n\n    gPlttBufferUnfaded[BG_PLTT_ID(5) + 12] = RGB( 9,  9,  9);\n    gPlttBufferUnfaded[BG_PLTT_ID(5) + 13] = RGB( 9,  9,  9);\n    gPlttBufferUnfaded[BG_PLTT_ID(5) + 14] = RGB(31, 31, 31);\n    gPlttBufferUnfaded[BG_PLTT_ID(5) + 15] = RGB( 26,  26,  25);\n    CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(5) + 12], &gPlttBufferFaded[BG_PLTT_ID(5) + 12], PLTT_SIZEOF(4));\n\n    if (gBattleTypeFlags & (BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_POKEDUDE))\n    {\n        Menu_LoadStdPalAt(BG_PLTT_ID(7));\n        LoadMenuMessageWindowGfx(0, 0x030, BG_PLTT_ID(7));\n\n        gPlttBufferUnfaded[BG_PLTT_ID(7) + 6] = RGB( 0,  0,  0);\n        CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(7) + 6], &gPlttBufferFaded[BG_PLTT_ID(7) + 6], PLTT_SIZEOF(1));\n    }\n}\n\nvoid DrawMainBattleBackground(void)\n{\n    LoadBattleTerrainGfx(GetBattleTerrainOverride());\n}\n\nvoid LoadBattleTextboxAndBackground(void)\n{\n    LZDecompressVram(gBattleInterface_Textbox_Gfx, (void *)BG_CHAR_ADDR(0));\n    CopyToBgTilemapBuffer(0, gBattleInterface_Textbox_Tilemap, 0, 0x000);\n    CopyBgTilemapBufferToVram(0);\n    LoadCompressedPalette(gBattleInterface_Textbox_Pal, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP);\n    LoadBattleMenuWindowGfx();\n    DrawMainBattleBackground();\n}\n\nstatic void DrawLinkBattleParticipantPokeballs(u8 taskId, u8 multiplayerId, u8 bgId, u8 destX, u8 destY)\n{\n    s32 i;\n    u16 pokeballStatuses = 0;\n    u16 tiles[6];\n\n    if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n    {\n        if (gTasks[taskId].data[5] != 0)\n        {\n            switch (multiplayerId)\n            {\n            case 0:\n                pokeballStatuses = 0x3F & gTasks[taskId].data[3];\n                break;\n            case 1:\n                pokeballStatuses = (0xFC0 & gTasks[taskId].data[4]) >> 6;\n                break;\n            case 2:\n                pokeballStatuses = (0xFC0 & gTasks[taskId].data[3]) >> 6;\n                break;\n            case 3:\n                pokeballStatuses = 0x3F & gTasks[taskId].data[4];\n                break;\n            }\n        }\n        else\n        {\n            switch (multiplayerId)\n            {\n            case 0:\n                pokeballStatuses = 0x3F & gTasks[taskId].data[3];\n                break;\n            case 1:\n                pokeballStatuses = 0x3F & gTasks[taskId].data[4];\n                break;\n            case 2:\n                pokeballStatuses = (0xFC0 & gTasks[taskId].data[3]) >> 6;\n                break;\n            case 3:\n                pokeballStatuses = (0xFC0 & gTasks[taskId].data[4]) >> 6;\n                break;\n            }\n        }\n\n        for (i = 0; i < 3; i++)\n            tiles[i] = ((pokeballStatuses & (3 << (i * 2))) >> (i * 2)) + 0x6001;\n\n        CopyToBgTilemapBufferRect_ChangePalette(bgId, tiles, destX, destY, 3, 1, 0x11);\n        CopyBgTilemapBufferToVram(bgId);\n    }\n    else\n    {\n        if (multiplayerId == gBattleStruct->multiplayerId)\n            pokeballStatuses = gTasks[taskId].data[3];\n        else\n            pokeballStatuses = gTasks[taskId].data[4];\n\n        for (i = 0; i < 6; i++)\n            tiles[i] = ((pokeballStatuses & (3 << (i * 2))) >> (i * 2)) + 0x6001;\n\n        CopyToBgTilemapBufferRect_ChangePalette(bgId, tiles, destX, destY, 6, 1, 0x11);\n        CopyBgTilemapBufferToVram(bgId);\n    }\n}\n\nstatic void DrawLinkBattleVsScreenOutcomeText(void)\n{\n    if (gBattleOutcome == B_OUTCOME_DREW)\n    {\n        BattlePutTextOnWindow(gText_Draw, B_WIN_VS_OUTCOME_DRAW);\n    }\n    else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n    {\n        if (gBattleOutcome == B_OUTCOME_WON)\n        {\n            switch (gLinkPlayers[gBattleStruct->multiplayerId].id)\n            {\n            case 0:\n                BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_LEFT);\n                BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_RIGHT);\n                break;\n            case 1:\n                BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_RIGHT);\n                BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_LEFT);\n                break;\n            case 2:\n                BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_LEFT);\n                BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_RIGHT);\n                break;\n            case 3:\n                BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_RIGHT);\n                BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_LEFT);\n                break;\n            }\n        }\n        else\n        {\n            switch (gLinkPlayers[gBattleStruct->multiplayerId].id)\n            {\n            case 0:\n                BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_RIGHT);\n                BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_LEFT);\n                break;\n            case 1:\n                BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_LEFT);\n                BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_RIGHT);\n                break;\n            case 2:\n                BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_RIGHT);\n                BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_LEFT);\n                break;\n            case 3:\n                BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_LEFT);\n                BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_RIGHT);\n                break;\n            }\n        }\n    }\n    else if (gBattleOutcome == B_OUTCOME_WON)\n    {\n        if (gLinkPlayers[gBattleStruct->multiplayerId].id != 0)\n        {\n            BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_RIGHT);\n            BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_LEFT);\n        }\n        else\n        {\n            BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_LEFT);\n            BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_RIGHT);\n        }\n    }\n    else\n    {\n        if (gLinkPlayers[gBattleStruct->multiplayerId].id != 0)\n        {\n            BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_LEFT);\n            BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_RIGHT);\n        }\n        else\n        {\n            BattlePutTextOnWindow(gText_Win, B_WIN_VS_OUTCOME_RIGHT);\n            BattlePutTextOnWindow(gText_Loss, B_WIN_VS_OUTCOME_LEFT);\n        }\n    }\n}\n\nvoid InitLinkBattleVsScreen(u8 taskId)\n{\n    struct LinkPlayer *linkPlayer;\n    u8 *name;\n    s32 i, palId;\n\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n        {\n            for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n            {\n                name = gLinkPlayers[i].name;\n                linkPlayer = &gLinkPlayers[i];\n\n                switch (linkPlayer->id)\n                {\n                case 0:\n                    BattlePutTextOnWindow(name, B_WIN_VS_MULTI_PLAYER_1);\n                    DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 1, 2, 4);\n                    break;\n                case 1:\n                    BattlePutTextOnWindow(name, B_WIN_VS_MULTI_PLAYER_2);\n                    DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 2, 2, 4);\n                    break;\n                case 2:\n                    BattlePutTextOnWindow(name, B_WIN_VS_MULTI_PLAYER_3);\n                    DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 1, 2, 8);\n                    break;\n                case 3:\n                    BattlePutTextOnWindow(name, B_WIN_VS_MULTI_PLAYER_4);\n                    DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 2, 2, 8);\n                    break;\n                }\n            }\n        }\n        else\n        {\n            u8 playerId = gBattleStruct->multiplayerId;\n            u8 opponentId = playerId ^ BIT_SIDE;\n            u8 opponentId_copy = opponentId;\n\n            if (gLinkPlayers[playerId].id != 0)\n                opponentId = playerId, playerId = opponentId_copy;\n\n            name = gLinkPlayers[playerId].name;\n            BattlePutTextOnWindow(name, B_WIN_VS_PLAYER);\n\n            name = gLinkPlayers[opponentId].name;\n            BattlePutTextOnWindow(name, B_WIN_VS_OPPONENT);\n\n            DrawLinkBattleParticipantPokeballs(taskId, playerId, 1, 2, 7);\n            DrawLinkBattleParticipantPokeballs(taskId, opponentId, 2, 2, 7);\n        }\n        gTasks[taskId].data[0]++;\n        break;\n    case 1:\n        palId = AllocSpritePalette(TAG_VS_LETTERS);\n        gPlttBufferUnfaded[OBJ_PLTT_ID(palId) + 15] = gPlttBufferFaded[OBJ_PLTT_ID(palId) + 15] = RGB_WHITE;\n        gBattleStruct->linkBattleVsSpriteId_V = CreateSprite(&sVsLetter_V_SpriteTemplate, 108, 80, 0);\n        gBattleStruct->linkBattleVsSpriteId_S = CreateSprite(&sVsLetter_S_SpriteTemplate, 132, 80, 0);\n        gSprites[gBattleStruct->linkBattleVsSpriteId_V].invisible = TRUE;\n        gSprites[gBattleStruct->linkBattleVsSpriteId_S].invisible = TRUE;\n        gTasks[taskId].data[0]++;\n        break;\n    case 2:\n        if (gTasks[taskId].data[5] != 0)\n        {\n            gBattle_BG1_X = -(20) - (Sin2(gTasks[taskId].data[1]) / 32);\n            gBattle_BG2_X = -(140) - (Sin2(gTasks[taskId].data[2]) / 32);\n            gBattle_BG1_Y = -36;\n            gBattle_BG2_Y = -36;\n        }\n        else\n        {\n            gBattle_BG1_X = -(20) - (Sin2(gTasks[taskId].data[1]) / 32);\n            gBattle_BG1_Y = (Cos2(gTasks[taskId].data[1]) / 32) - 164;\n            gBattle_BG2_X = -(140) - (Sin2(gTasks[taskId].data[2]) / 32);\n            gBattle_BG2_Y = (Cos2(gTasks[taskId].data[2]) / 32) - 164;\n        }\n\n        if (gTasks[taskId].data[2] != 0)\n        {\n            gTasks[taskId].data[2] -= 2;\n            gTasks[taskId].data[1] += 2;\n        }\n        else\n        {\n            if (gTasks[taskId].data[5] != 0)\n                DrawLinkBattleVsScreenOutcomeText();\n\n            PlaySE(SE_M_HARDEN);\n            DestroyTask(taskId);\n            gSprites[gBattleStruct->linkBattleVsSpriteId_V].invisible = FALSE;\n            gSprites[gBattleStruct->linkBattleVsSpriteId_S].invisible = FALSE;\n            gSprites[gBattleStruct->linkBattleVsSpriteId_S].oam.tileNum += 0x40;\n            gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[0] = 0;\n            gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[0] = 1;\n            gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[1] = gSprites[gBattleStruct->linkBattleVsSpriteId_V].x;\n            gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[1] = gSprites[gBattleStruct->linkBattleVsSpriteId_S].x;\n            gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[2] = 0;\n            gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[2] = 0;\n        }\n        break;\n    }\n}\n\nvoid DrawBattleEntryBackground(void)\n{\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        LZDecompressVram(gFile_graphics_battle_transitions_vs_frame_sheet, (void *)(BG_CHAR_ADDR(1)));\n        LZDecompressVram(gVsLettersGfx, (void *)(VRAM + 0x10000));\n        LoadCompressedPalette(gFile_graphics_battle_transitions_vs_frame_palette, BG_PLTT_ID(6), PLTT_SIZE_4BPP);\n        SetBgAttribute(1, BG_ATTR_SCREENSIZE, 1);\n        SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(1) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT512x256);\n        CopyToBgTilemapBuffer(1, gFile_graphics_battle_transitions_vs_frame_tilemap, 0, 0);\n        CopyToBgTilemapBuffer(2, gFile_graphics_battle_transitions_vs_frame_tilemap, 0, 0);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(2);\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR);\n        SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n        gBattle_BG1_Y = -164;\n        gBattle_BG2_Y = -164;\n        LoadCompressedSpriteSheetUsingHeap(&sVsLettersSpriteSheet);\n    }\n    else if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)\n    {\n        LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_GRASS);\n    }\n    else if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))\n    {\n        LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING);\n    }\n    else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)\n    {\n        if (gGameVersion == VERSION_FIRE_RED)\n        {\n            LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_CAVE);\n        }\n        else\n        {\n            LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_WATER);\n        }\n    }\n    else\n    {\n        if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n        {\n            u8 trainerClass = sTrainers[gTrainerBattleOpponent_A].trainerClass;\n            if (trainerClass == TRAINER_CLASS_LEADER)\n            {\n                LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING);\n                return;\n            }\n            else if (trainerClass == TRAINER_CLASS_CHAMPION)\n            {\n                LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING);\n                return;\n            }\n        }\n\n        if (GetCurrentMapBattleScene() == MAP_BATTLE_SCENE_NORMAL)\n        {\n            LoadBattleTerrainEntryGfx(gBattleTerrain);\n        }\n        else\n        {\n            LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING);\n        }\n    }\n}\n\nstatic u8 GetBattleTerrainOverride(void)\n{\n    u8 battleScene;\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))\n    {\n        return BATTLE_TERRAIN_LINK;\n    }\n    else if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)\n    {\n        gBattleTerrain = BATTLE_TERRAIN_GRASS;\n        return BATTLE_TERRAIN_GRASS;\n    }\n    else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n    {\n        if (sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER)\n            return BATTLE_TERRAIN_LEADER;\n        else if (sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)\n            return BATTLE_TERRAIN_CHAMPION;\n    }\n    battleScene = GetCurrentMapBattleScene();\n    if (battleScene == MAP_BATTLE_SCENE_NORMAL)\n    {\n        return gBattleTerrain;\n    }\n    return GetBattleTerrainByMapScene(battleScene);\n}\n\nbool8 LoadChosenBattleElement(u8 caseId)\n{\n    bool8 ret = FALSE;\n    u8 battleScene;\n    switch (caseId)\n    {\n    case 0:\n        LZDecompressVram(gBattleInterface_Textbox_Gfx, (void *)BG_CHAR_ADDR(0));\n        break;\n    case 1:\n        CopyToBgTilemapBuffer(0, gBattleInterface_Textbox_Tilemap, 0, 0x000);\n        CopyBgTilemapBufferToVram(0);\n        break;\n    case 2:\n        LoadCompressedPalette(gBattleInterface_Textbox_Pal, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP);\n        break;\n    case 3:\n        battleScene = GetBattleTerrainOverride();\n        LZDecompressVram(sBattleTerrainTable[battleScene].tileset, (void *)BG_CHAR_ADDR(2));\n        // fallthrough\n    case 4:\n        battleScene = GetBattleTerrainOverride();\n        LZDecompressVram(sBattleTerrainTable[battleScene].tilemap, (void *)BG_SCREEN_ADDR(26));\n        break;\n    case 5:\n        battleScene = GetBattleTerrainOverride();\n        LoadCompressedPalette(sBattleTerrainTable[battleScene].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP);\n        break;\n    case 6:\n        LoadBattleMenuWindowGfx();\n        break;\n    default:\n        ret = TRUE;\n        break;\n    }\n    return ret;\n}\n"
  },
  {
    "path": "src/battle_controller_link_opponent.c",
    "content": "#include \"global.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_controllers.h\"\n#include \"battle_interface.h\"\n#include \"battle_message.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"link.h\"\n#include \"m4a.h\"\n#include \"pokeball.h\"\n#include \"task.h\"\n#include \"util.h\"\n#include \"constants/battle_anim.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n#include \"constants/trainers.h\"\n\nstatic void LinkOpponentHandleGetMonData(void);\nstatic void LinkOpponentHandleGetRawMonData(void);\nstatic void LinkOpponentHandleSetMonData(void);\nstatic void LinkOpponentHandleSetRawMonData(void);\nstatic void LinkOpponentHandleLoadMonSprite(void);\nstatic void LinkOpponentHandleSwitchInAnim(void);\nstatic void LinkOpponentHandleReturnMonToBall(void);\nstatic void LinkOpponentHandleDrawTrainerPic(void);\nstatic void LinkOpponentHandleTrainerSlide(void);\nstatic void LinkOpponentHandleTrainerSlideBack(void);\nstatic void LinkOpponentHandleFaintAnimation(void);\nstatic void LinkOpponentHandlePaletteFade(void);\nstatic void LinkOpponentHandleSuccessBallThrowAnim(void);\nstatic void LinkOpponentHandleBallThrowAnim(void);\nstatic void LinkOpponentHandlePause(void);\nstatic void LinkOpponentHandleMoveAnimation(void);\nstatic void LinkOpponentHandlePrintString(void);\nstatic void LinkOpponentHandlePrintSelectionString(void);\nstatic void LinkOpponentHandleChooseAction(void);\nstatic void LinkOpponentHandleUnknownYesNoBox(void);\nstatic void LinkOpponentHandleChooseMove(void);\nstatic void LinkOpponentHandleChooseItem(void);\nstatic void LinkOpponentHandleChoosePokemon(void);\nstatic void LinkOpponentHandleCmd23(void);\nstatic void LinkOpponentHandleHealthBarUpdate(void);\nstatic void LinkOpponentHandleExpUpdate(void);\nstatic void LinkOpponentHandleStatusIconUpdate(void);\nstatic void LinkOpponentHandleStatusAnimation(void);\nstatic void LinkOpponentHandleStatusXor(void);\nstatic void LinkOpponentHandleDataTransfer(void);\nstatic void LinkOpponentHandleDMA3Transfer(void);\nstatic void LinkOpponentHandlePlayBGM(void);\nstatic void LinkOpponentHandleCmd32(void);\nstatic void LinkOpponentHandleTwoReturnValues(void);\nstatic void LinkOpponentHandleChosenMonReturnValue(void);\nstatic void LinkOpponentHandleOneReturnValue(void);\nstatic void LinkOpponentHandleOneReturnValue_Duplicate(void);\nstatic void LinkOpponentHandleClearUnkVar(void);\nstatic void LinkOpponentHandleSetUnkVar(void);\nstatic void LinkOpponentHandleClearUnkFlag(void);\nstatic void LinkOpponentHandleToggleUnkFlag(void);\nstatic void LinkOpponentHandleHitAnimation(void);\nstatic void LinkOpponentHandleCantSwitch(void);\nstatic void LinkOpponentHandlePlaySE(void);\nstatic void LinkOpponentHandlePlayFanfare(void);\nstatic void LinkOpponentHandleFaintingCry(void);\nstatic void LinkOpponentHandleIntroSlide(void);\nstatic void LinkOpponentHandleIntroTrainerBallThrow(void);\nstatic void LinkOpponentHandleDrawPartyStatusSummary(void);\nstatic void LinkOpponentHandleHidePartyStatusSummary(void);\nstatic void LinkOpponentHandleEndBounceEffect(void);\nstatic void LinkOpponentHandleSpriteInvisibility(void);\nstatic void LinkOpponentHandleBattleAnimation(void);\nstatic void LinkOpponentHandleLinkStandbyMsg(void);\nstatic void LinkOpponentHandleResetActionMoveSelection(void);\nstatic void LinkOpponentHandleEndLinkBattle(void);\nstatic void LinkOpponentCmdEnd(void);\n\nstatic void LinkOpponentBufferRunCommand(void);\nstatic void LinkOpponentBufferExecCompleted(void);\nstatic void SwitchIn_HandleSoundAndEnd(void);\nstatic u32 CopyLinkOpponentMonData(u8 monId, u8 *dst);\nstatic void SetLinkOpponentMonData(u8 monId);\nstatic void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit);\nstatic void DoSwitchOutAnimation(void);\nstatic void LinkOpponentDoMoveAnimation(void);\nstatic void Task_StartSendOutAnim(u8 taskId);\nstatic void SpriteCB_FreeOpponentSprite(struct Sprite *sprite);\nstatic void EndDrawPartyStatusSummary(void);\n\nstatic void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) =\n{\n    [CONTROLLER_GETMONDATA]               = LinkOpponentHandleGetMonData,\n    [CONTROLLER_GETRAWMONDATA]            = LinkOpponentHandleGetRawMonData,\n    [CONTROLLER_SETMONDATA]               = LinkOpponentHandleSetMonData,\n    [CONTROLLER_SETRAWMONDATA]            = LinkOpponentHandleSetRawMonData,\n    [CONTROLLER_LOADMONSPRITE]            = LinkOpponentHandleLoadMonSprite,\n    [CONTROLLER_SWITCHINANIM]             = LinkOpponentHandleSwitchInAnim,\n    [CONTROLLER_RETURNMONTOBALL]          = LinkOpponentHandleReturnMonToBall,\n    [CONTROLLER_DRAWTRAINERPIC]           = LinkOpponentHandleDrawTrainerPic,\n    [CONTROLLER_TRAINERSLIDE]             = LinkOpponentHandleTrainerSlide,\n    [CONTROLLER_TRAINERSLIDEBACK]         = LinkOpponentHandleTrainerSlideBack,\n    [CONTROLLER_FAINTANIMATION]           = LinkOpponentHandleFaintAnimation,\n    [CONTROLLER_PALETTEFADE]              = LinkOpponentHandlePaletteFade,\n    [CONTROLLER_SUCCESSBALLTHROWANIM]     = LinkOpponentHandleSuccessBallThrowAnim,\n    [CONTROLLER_BALLTHROWANIM]            = LinkOpponentHandleBallThrowAnim,\n    [CONTROLLER_PAUSE]                    = LinkOpponentHandlePause,\n    [CONTROLLER_MOVEANIMATION]            = LinkOpponentHandleMoveAnimation,\n    [CONTROLLER_PRINTSTRING]              = LinkOpponentHandlePrintString,\n    [CONTROLLER_PRINTSTRINGPLAYERONLY]    = LinkOpponentHandlePrintSelectionString,\n    [CONTROLLER_CHOOSEACTION]             = LinkOpponentHandleChooseAction,\n    [CONTROLLER_UNKNOWNYESNOBOX]          = LinkOpponentHandleUnknownYesNoBox,\n    [CONTROLLER_CHOOSEMOVE]               = LinkOpponentHandleChooseMove,\n    [CONTROLLER_OPENBAG]                  = LinkOpponentHandleChooseItem,\n    [CONTROLLER_CHOOSEPOKEMON]            = LinkOpponentHandleChoosePokemon,\n    [CONTROLLER_23]                       = LinkOpponentHandleCmd23,\n    [CONTROLLER_HEALTHBARUPDATE]          = LinkOpponentHandleHealthBarUpdate,\n    [CONTROLLER_EXPUPDATE]                = LinkOpponentHandleExpUpdate,\n    [CONTROLLER_STATUSICONUPDATE]         = LinkOpponentHandleStatusIconUpdate,\n    [CONTROLLER_STATUSANIMATION]          = LinkOpponentHandleStatusAnimation,\n    [CONTROLLER_STATUSXOR]                = LinkOpponentHandleStatusXor,\n    [CONTROLLER_DATATRANSFER]             = LinkOpponentHandleDataTransfer,\n    [CONTROLLER_DMA3TRANSFER]             = LinkOpponentHandleDMA3Transfer,\n    [CONTROLLER_PLAYBGM]                  = LinkOpponentHandlePlayBGM,\n    [CONTROLLER_32]                       = LinkOpponentHandleCmd32,\n    [CONTROLLER_TWORETURNVALUES]          = LinkOpponentHandleTwoReturnValues,\n    [CONTROLLER_CHOSENMONRETURNVALUE]     = LinkOpponentHandleChosenMonReturnValue,\n    [CONTROLLER_ONERETURNVALUE]           = LinkOpponentHandleOneReturnValue,\n    [CONTROLLER_ONERETURNVALUE_DUPLICATE] = LinkOpponentHandleOneReturnValue_Duplicate,\n    [CONTROLLER_CLEARUNKVAR]              = LinkOpponentHandleClearUnkVar,\n    [CONTROLLER_SETUNKVAR]                = LinkOpponentHandleSetUnkVar,\n    [CONTROLLER_CLEARUNKFLAG]             = LinkOpponentHandleClearUnkFlag,\n    [CONTROLLER_TOGGLEUNKFLAG]            = LinkOpponentHandleToggleUnkFlag,\n    [CONTROLLER_HITANIMATION]             = LinkOpponentHandleHitAnimation,\n    [CONTROLLER_CANTSWITCH]               = LinkOpponentHandleCantSwitch,\n    [CONTROLLER_PLAYSE]                   = LinkOpponentHandlePlaySE,\n    [CONTROLLER_PLAYFANFARE]              = LinkOpponentHandlePlayFanfare,\n    [CONTROLLER_FAINTINGCRY]              = LinkOpponentHandleFaintingCry,\n    [CONTROLLER_INTROSLIDE]               = LinkOpponentHandleIntroSlide,\n    [CONTROLLER_INTROTRAINERBALLTHROW]    = LinkOpponentHandleIntroTrainerBallThrow,\n    [CONTROLLER_DRAWPARTYSTATUSSUMMARY]   = LinkOpponentHandleDrawPartyStatusSummary,\n    [CONTROLLER_HIDEPARTYSTATUSSUMMARY]   = LinkOpponentHandleHidePartyStatusSummary,\n    [CONTROLLER_ENDBOUNCE]                = LinkOpponentHandleEndBounceEffect,\n    [CONTROLLER_SPRITEINVISIBILITY]       = LinkOpponentHandleSpriteInvisibility,\n    [CONTROLLER_BATTLEANIMATION]          = LinkOpponentHandleBattleAnimation,\n    [CONTROLLER_LINKSTANDBYMSG]           = LinkOpponentHandleLinkStandbyMsg,\n    [CONTROLLER_RESETACTIONMOVESELECTION] = LinkOpponentHandleResetActionMoveSelection,\n    [CONTROLLER_ENDLINKBATTLE]            = LinkOpponentHandleEndLinkBattle,\n    [CONTROLLER_TERMINATOR_NOP]           = LinkOpponentCmdEnd\n};\n\nstatic void LinkOpponentDummy(void)\n{\n}\n\nvoid SetControllerToLinkOpponent(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = LinkOpponentBufferRunCommand;\n}\n\nstatic void LinkOpponentBufferRunCommand(void)\n{\n    if (gBattleControllerExecFlags & gBitTable[gActiveBattler])\n    {\n        if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sLinkOpponentBufferCommands))\n            sLinkOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]]();\n        else\n            LinkOpponentBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnBattlerSpriteCallbackDummy(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        LinkOpponentBufferExecCompleted();\n}\n\nstatic void FreeTrainerSpriteAfterSlide(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n    {\n        FreeTrainerFrontPicPaletteAndTile(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam);\n        gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum = gSprites[gBattlerSpriteIds[gActiveBattler]].data[5];\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        LinkOpponentBufferExecCompleted();\n    }\n}\n\nstatic void Intro_DelayAndEnd(void)\n{\n    if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0;\n        LinkOpponentBufferExecCompleted();\n    }\n}\n\nstatic void Intro_WaitForShinyAnimAndHealthbox(void)\n{\n    bool32 healthboxAnimDone = FALSE;\n\n    if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))\n    {\n        if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n            healthboxAnimDone = TRUE;\n    }\n    else if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy\n          && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == gSprites[gHealthboxSpriteIds[gActiveBattler]].callback)\n    {\n        healthboxAnimDone = TRUE;\n    }\n\n    if (IsCryPlayingOrClearCrySongs())\n        healthboxAnimDone = FALSE;\n\n    if (healthboxAnimDone)\n    {\n        if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT)\n        {\n            if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim\n                || !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim)\n                return;\n\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE;\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE;\n            FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n            FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n        }\n        if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n        {\n            if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT)\n                m4aMPlayContinue(&gMPlayInfo_BGM);\n        }\n        else\n        {\n            m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256);\n        }\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3;\n        gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd;\n    }\n}\n\nstatic void Intro_TryShinyAnimShowHealthbox(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive\n     && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim)\n            TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim)\n            TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]);\n        if (gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gActiveBattler) == 3)\n        {\n            if (++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == 1)\n                return;\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0;\n        }\n        if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n        {\n            DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]);\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK],\n                                     &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]],\n                                     HEALTHBOX_ALL);\n            StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK);\n            SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);\n            SetBattlerShadowSpriteCallback(gActiveBattler ^ BIT_FLANK, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], MON_DATA_SPECIES));\n        }\n        DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]);\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler],\n                                 &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]],\n                                 HEALTHBOX_ALL);\n        StartHealthboxSlideIn(gActiveBattler);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n        SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));\n        gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;\n        gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;\n    }\n}\n\nstatic void TryShinyAnimAfterMonAnim(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded == TRUE\n     && gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0)\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim)\n        {\n            TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);\n        }\n        else if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n            FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n            FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n            LinkOpponentBufferExecCompleted();\n        }\n    }\n}\n\nstatic void CompleteOnHealthbarDone(void)\n{\n    s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);\n\n    SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n\n    if (hpValue != -1)\n        UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);\n    else\n        LinkOpponentBufferExecCompleted();\n}\n\nstatic void HideHealthboxAfterMonFaint(void)\n{\n    if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse)\n    {\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        LinkOpponentBufferExecCompleted();\n    }\n}\n\nstatic void FreeMonSpriteAfterSwitchOutAnim(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n    {\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        HideBattlerShadowSprite(gActiveBattler);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        LinkOpponentBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnInactiveTextPrinter(void)\n{\n    if (!IsTextPrinterActive(B_WIN_MSG))\n        LinkOpponentBufferExecCompleted();\n}\n\nstatic void DoHitAnimBlinkSpriteEffect(void)\n{\n    u8 spriteId = gBattlerSpriteIds[gActiveBattler];\n\n    if (gSprites[spriteId].data[1] == 32)\n    {\n        gSprites[spriteId].data[1] = 0;\n        gSprites[spriteId].invisible = FALSE;\n        gDoingBattleAnim = FALSE;\n        LinkOpponentBufferExecCompleted();\n    }\n    else\n    {\n        if ((gSprites[spriteId].data[1] % 4) == 0)\n            gSprites[spriteId].invisible ^= 1;\n        gSprites[spriteId].data[1]++;\n    }\n}\n\nstatic void SwitchIn_ShowSubstitute(void)\n{\n    if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n    {\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);\n\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd;\n    }\n}\n\nstatic void SwitchIn_HandleSoundAndEnd(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && !IsCryPlayingOrClearCrySongs())\n    {\n        m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100);\n        LinkOpponentBufferExecCompleted();\n    }\n}\n\nstatic void SwitchIn_ShowHealthbox(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n\n        FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n        FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n\n        StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0);\n\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);\n        StartHealthboxSlideIn(gActiveBattler);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n        CopyBattleSpriteInvisibility(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute;\n    }\n}\n\nstatic void SwitchIn_TryShinyAnim(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive\n        && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim)\n    {\n        TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);\n    }\n\n    if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy\n        && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)\n    {\n        DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]);\n        SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox;\n    }\n}\n\nstatic void CompleteOnFinishedStatusAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)\n        LinkOpponentBufferExecCompleted();\n}\n\nstatic void CompleteOnFinishedBattleAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)\n        LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentBufferExecCompleted(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = LinkOpponentBufferRunCommand;\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        u8 playerId = GetMultiplayerId();\n\n        PrepareBufferDataTransferLink(2, 4, &playerId);\n        gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;\n    }\n    else\n    {\n        gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];\n    }\n}\n\nstatic void LinkOpponentHandleGetMonData(void)\n{\n    u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data\n    u32 size = 0;\n    u8 monToCheck;\n    s32 i;\n\n    if (gBattleBufferA[gActiveBattler][2] == 0)\n    {\n        size += CopyLinkOpponentMonData(gBattlerPartyIndexes[gActiveBattler], monData);\n    }\n    else\n    {\n        monToCheck = gBattleBufferA[gActiveBattler][2];\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (monToCheck & 1)\n                size += CopyLinkOpponentMonData(i, monData + size);\n            monToCheck >>= 1;\n        }\n    }\n    BtlController_EmitDataTransfer(BUFFER_B, size, monData);\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic u32 CopyLinkOpponentMonData(u8 monId, u8 *dst)\n{\n    struct BattlePokemon battleMon;\n    struct MovePpInfo moveData;\n    u8 nickname[20];\n    u8 *src;\n    s16 data16;\n    u32 data32;\n    s32 size = 0;\n\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case REQUEST_ALL_BATTLE:\n        battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES);\n        battleMon.item = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM);\n        for (size = 0; size < MAX_MON_MOVES; size++)\n        {\n            battleMon.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size);\n            battleMon.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);\n        }\n        battleMon.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES);\n        battleMon.friendship = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP);\n        battleMon.experience = GetMonData(&gEnemyParty[monId], MON_DATA_EXP);\n        battleMon.hpIV = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV);\n        battleMon.attackIV = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV);\n        battleMon.defenseIV = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV);\n        battleMon.speedIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV);\n        battleMon.spAttackIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV);\n        battleMon.spDefenseIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV);\n        battleMon.personality = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY);\n        battleMon.status1 = GetMonData(&gEnemyParty[monId], MON_DATA_STATUS);\n        battleMon.level = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL);\n        battleMon.hp = GetMonData(&gEnemyParty[monId], MON_DATA_HP);\n        battleMon.maxHP = GetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP);\n        battleMon.attack = GetMonData(&gEnemyParty[monId], MON_DATA_ATK);\n        battleMon.defense = GetMonData(&gEnemyParty[monId], MON_DATA_DEF);\n        battleMon.speed = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED);\n        battleMon.spAttack = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK);\n        battleMon.spDefense = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF);\n        battleMon.isEgg = GetMonData(&gEnemyParty[monId], MON_DATA_IS_EGG);\n        battleMon.abilityNum = GetMonData(&gEnemyParty[monId], MON_DATA_ABILITY_NUM);\n        battleMon.otId = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID);\n        GetMonData(&gEnemyParty[monId], MON_DATA_NICKNAME, nickname);\n        StringCopy_Nickname(battleMon.nickname, nickname);\n        GetMonData(&gEnemyParty[monId], MON_DATA_OT_NAME, battleMon.otName);\n        src = (u8 *)&battleMon;\n        for (size = 0; size < sizeof(battleMon); size++)\n            dst[size] = src[size];\n        break;\n    case REQUEST_SPECIES_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_HELDITEM_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_MOVES_PP_BATTLE:\n        for (size = 0; size < MAX_MON_MOVES; size++)\n        {\n            moveData.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size);\n            moveData.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);\n        }\n        moveData.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES);\n        src = (u8 *)(&moveData);\n        for (size = 0; size < sizeof(moveData); size++)\n            dst[size] = src[size];\n        break;\n    case REQUEST_MOVE1_BATTLE:\n    case REQUEST_MOVE2_BATTLE:\n    case REQUEST_MOVE3_BATTLE:\n    case REQUEST_MOVE4_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_PP_DATA_BATTLE:\n        for (size = 0; size < MAX_MON_MOVES; size++)\n            dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);\n        dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES);\n        size++;\n        break;\n    case REQUEST_PPMOVE1_BATTLE:\n    case REQUEST_PPMOVE2_BATTLE:\n    case REQUEST_PPMOVE3_BATTLE:\n    case REQUEST_PPMOVE4_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);\n        size = 1;\n        break;\n    case REQUEST_OTID_BATTLE:\n        data32 = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        size = 3;\n        break;\n    case REQUEST_EXP_BATTLE:\n        data32 = GetMonData(&gEnemyParty[monId], MON_DATA_EXP);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        size = 3;\n        break;\n    case REQUEST_HP_EV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_EV);\n        size = 1;\n        break;\n    case REQUEST_ATK_EV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV);\n        size = 1;\n        break;\n    case REQUEST_DEF_EV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV);\n        size = 1;\n        break;\n    case REQUEST_SPEED_EV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV);\n        size = 1;\n        break;\n    case REQUEST_SPATK_EV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV);\n        size = 1;\n        break;\n    case REQUEST_SPDEF_EV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV);\n        size = 1;\n        break;\n    case REQUEST_FRIENDSHIP_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP);\n        size = 1;\n        break;\n    case REQUEST_POKERUS_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKERUS);\n        size = 1;\n        break;\n    case REQUEST_MET_LOCATION_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION);\n        size = 1;\n        break;\n    case REQUEST_MET_LEVEL_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL);\n        size = 1;\n        break;\n    case REQUEST_MET_GAME_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME);\n        size = 1;\n        break;\n    case REQUEST_POKEBALL_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL);\n        size = 1;\n        break;\n    case REQUEST_ALL_IVS_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV);\n        dst[1] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV);\n        dst[2] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV);\n        dst[3] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV);\n        dst[4] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV);\n        dst[5] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV);\n        size = 6;\n        break;\n    case REQUEST_HP_IV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV);\n        size = 1;\n        break;\n    case REQUEST_ATK_IV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV);\n        size = 1;\n        break;\n    case REQUEST_DEF_IV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV);\n        size = 1;\n        break;\n    case REQUEST_SPEED_IV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV);\n        size = 1;\n        break;\n    case REQUEST_SPATK_IV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV);\n        size = 1;\n        break;\n    case REQUEST_SPDEF_IV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV);\n        size = 1;\n        break;\n    case REQUEST_PERSONALITY_BATTLE:\n        data32 = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        dst[3] = (data32 & 0xFF000000) >> 24;\n        size = 4;\n        break;\n    case REQUEST_CHECKSUM_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_STATUS_BATTLE:\n        data32 = GetMonData(&gEnemyParty[monId], MON_DATA_STATUS);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        dst[3] = (data32 & 0xFF000000) >> 24;\n        size = 4;\n        break;\n    case REQUEST_LEVEL_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL);\n        size = 1;\n        break;\n    case REQUEST_HP_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_HP);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_MAX_HP_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_ATK_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_ATK);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_DEF_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_DEF);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPEED_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPATK_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPDEF_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_COOL_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL);\n        size = 1;\n        break;\n    case REQUEST_BEAUTY_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY);\n        size = 1;\n        break;\n    case REQUEST_CUTE_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE);\n        size = 1;\n        break;\n    case REQUEST_SMART_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART);\n        size = 1;\n        break;\n    case REQUEST_TOUGH_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH);\n        size = 1;\n        break;\n    case REQUEST_SHEEN_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SHEEN);\n        size = 1;\n        break;\n    case REQUEST_COOL_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_BEAUTY_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_CUTE_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_SMART_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_TOUGH_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON);\n        size = 1;\n        break;\n    }\n    return size;\n}\n\nstatic void LinkOpponentHandleGetRawMonData(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleSetMonData(void)\n{\n    u8 monToCheck;\n    u32 i;\n\n    if (gBattleBufferA[gActiveBattler][2] == 0)\n    {\n        SetLinkOpponentMonData(gBattlerPartyIndexes[gActiveBattler]);\n    }\n    else\n    {\n        monToCheck = gBattleBufferA[gActiveBattler][2];\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (monToCheck & 1)\n                SetLinkOpponentMonData(i);\n            monToCheck >>= 1;\n        }\n    }\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void SetLinkOpponentMonData(u8 monId)\n{\n    struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];\n    struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];\n    s32 i;\n\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case REQUEST_ALL_BATTLE:\n        {\n            u8 iv;\n\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &battlePokemon->species);\n            SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);\n            for (i = 0; i < MAX_MON_MOVES; i++)\n            {\n                SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);\n                SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);\n            }\n            SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses);\n            SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship);\n            SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &battlePokemon->experience);\n            iv = battlePokemon->hpIV;\n            SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &iv);\n            iv = battlePokemon->attackIV;\n            SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &iv);\n            iv = battlePokemon->defenseIV;\n            SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &iv);\n            iv = battlePokemon->speedIV;\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &iv);\n            iv = battlePokemon->spAttackIV;\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &iv);\n            iv = battlePokemon->spDefenseIV;\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &iv);\n            SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality);\n            SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &battlePokemon->status1);\n            SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &battlePokemon->level);\n            SetMonData(&gEnemyParty[monId], MON_DATA_HP, &battlePokemon->hp);\n            SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP);\n            SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &battlePokemon->attack);\n            SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &battlePokemon->defense);\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &battlePokemon->speed);\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack);\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense);\n        }\n        break;\n    case REQUEST_SPECIES_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HELDITEM_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MOVES_PP_BATTLE:\n        for (i = 0; i < MAX_MON_MOVES; i++)\n        {\n            SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);\n            SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);\n        }\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses);\n        break;\n    case REQUEST_MOVE1_BATTLE:\n    case REQUEST_MOVE2_BATTLE:\n    case REQUEST_MOVE3_BATTLE:\n    case REQUEST_MOVE4_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_PP_DATA_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);\n        break;\n    case REQUEST_PPMOVE1_BATTLE:\n    case REQUEST_PPMOVE2_BATTLE:\n    case REQUEST_PPMOVE3_BATTLE:\n    case REQUEST_PPMOVE4_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_OTID_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_EXP_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HP_EV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_EV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_EV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_EV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_EV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_EV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_FRIENDSHIP_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_POKERUS_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_LOCATION_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_LEVEL_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_GAME_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_POKEBALL_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ALL_IVS_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);\n        break;\n    case REQUEST_HP_IV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_IV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_IV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_IV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_IV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_IV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_PERSONALITY_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CHECKSUM_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_STATUS_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_LEVEL_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HP_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MAX_HP_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_COOL_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_BEAUTY_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CUTE_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SMART_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_TOUGH_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SHEEN_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_COOL_RIBBON_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_BEAUTY_RIBBON_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CUTE_RIBBON_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SMART_RIBBON_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_TOUGH_RIBBON_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    }\n}\n\nstatic void LinkOpponentHandleSetRawMonData(void)\n{\n    u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];\n    u32 i;\n\n    for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++)\n        dst[i] = gBattleBufferA[gActiveBattler][3 + i];\n\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleLoadMonSprite(void)\n{\n    u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);\n\n    BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n    SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler));\n\n    gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                     GetBattlerSpriteCoord(gActiveBattler, BATTLER_COORD_X_2),\n                                                     GetBattlerSpriteDefault_Y(gActiveBattler),\n                                                     GetBattlerSpriteSubpriority(gActiveBattler));\n\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]);\n\n    SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));\n\n    gBattlerControllerFuncs[gActiveBattler] = TryShinyAnimAfterMonAnim;\n}\n\nstatic void LinkOpponentHandleSwitchInAnim(void)\n{\n    gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1];\n    StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]);\n    gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim;\n}\n\nstatic void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit)\n{\n    u16 species;\n\n    ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit);\n    gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];\n    species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n    gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim);\n    BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId);\n    SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));\n    gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2),\n                                                GetBattlerSpriteDefault_Y(battlerId),\n                                                GetBattlerSpriteSubpriority(battlerId));\n\n    gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId];\n\n    gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;\n    gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;\n    gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;\n\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);\n\n    gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;\n    gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;\n\n    gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT);\n}\n\nstatic void LinkOpponentHandleReturnMonToBall(void)\n{\n    if (gBattleBufferA[gActiveBattler][1] == 0)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n        gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;\n    }\n    else\n    {\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        HideBattlerShadowSprite(gActiveBattler);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        LinkOpponentBufferExecCompleted();\n    }\n}\n\nstatic void DoSwitchOutAnimation(void)\n{\n    switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)\n    {\n    case 0:\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;\n        break;\n    case 1:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_OPPONENT_MON);\n            gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim;\n        }\n        break;\n    }\n}\n\n#define sSpeedX data[0]\n\nstatic void LinkOpponentHandleDrawTrainerPic(void)\n{\n    s16 xPos;\n    u32 trainerPicId;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n    {\n        if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != 0) // second mon\n            xPos = 152;\n        else // first mon\n            xPos = 200;\n\n        if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_RUBY\n         || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_SAPPHIRE)\n        {\n            if (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender != MALE)\n                trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_MAY];\n            else\n                trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_BRENDAN];\n        }\n        else if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_EMERALD)\n        {\n            if (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender != MALE)\n                trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_EM_MAY];\n            else\n                trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_EM_BRENDAN];\n        }\n        else if (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender != MALE)\n        {\n            trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_LEAF];\n        }\n        else\n        {\n            trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_RED];\n        }\n    }\n    else\n    {\n        xPos = 176;\n        if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)\n        {\n            trainerPicId = GetUnionRoomTrainerPic();\n        }\n        else if ((gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].version & 0xFF) == VERSION_RUBY\n              || (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].version & 0xFF) == VERSION_SAPPHIRE)\n        {\n            if (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].gender != MALE)\n                trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_MAY];\n            else\n                trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_BRENDAN];\n        }\n        else if ((gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].version & 0xFF) == VERSION_EMERALD)\n        {\n            if (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].gender != MALE)\n                trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_EM_MAY];\n            else\n                trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_EM_BRENDAN];\n        }\n        else if (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].gender != MALE)\n        {\n            trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_LEAF];\n        }\n        else\n        {\n            trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_RED];\n        }\n    }\n    DecompressTrainerFrontPic(trainerPicId, gActiveBattler);\n    SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));\n    gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                     xPos,\n                                                     (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 40,\n                                                     GetBattlerSpriteSubpriority(gActiveBattler));\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 2;\n    if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n        gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = DISPLAY_WIDTH;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicId].tag);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn;\n\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;\n}\n\nstatic void LinkOpponentHandleTrainerSlide(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\n#undef sSpeedX\n\nstatic void LinkOpponentHandleTrainerSlideBack(void)\n{\n    SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);\n    gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide;\n}\n\nstatic void LinkOpponentHandleFaintAnimation(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0)\n    {\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++;\n    }\n    else\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            PlaySE12WithPanning(SE_FAINT, SOUND_PAN_TARGET);\n            gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon;\n            gBattlerControllerFuncs[gActiveBattler] = HideHealthboxAfterMonFaint;\n        }\n    }\n}\n\nstatic void LinkOpponentHandlePaletteFade(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleSuccessBallThrowAnim(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleBallThrowAnim(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandlePause(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleMoveAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);\n\n        gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];\n        gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);\n        gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);\n        gAnimFriendship = gBattleBufferA[gActiveBattler][10];\n        gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);\n        gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];\n        gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;\n        if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE\n        {\n            LinkOpponentBufferExecCompleted();\n        }\n        else\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            gBattlerControllerFuncs[gActiveBattler] = LinkOpponentDoMoveAnimation;\n        }\n    }\n}\n\nstatic void LinkOpponentDoMoveAnimation(void)\n{\n    u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);\n    u8 multihit = gBattleBufferA[gActiveBattler][11];\n\n    switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)\n    {\n    case 0:\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute\n            && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8)\n        {\n            gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1;\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        }\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;\n        break;\n    case 1:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF);\n            DoMoveAnim(move);\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;\n        }\n        break;\n    case 2:\n        gAnimScriptCallback();\n        if (!gAnimScriptActive)\n        {\n            SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL);\n            if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2)\n            {\n                InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);\n                gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0;\n            }\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;\n        }\n        break;\n    case 3:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            CopyAllBattleSpritesInvisibilities();\n            TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            LinkOpponentBufferExecCompleted();\n        }\n        break;\n    }\n}\n\nstatic void LinkOpponentHandlePrintString(void)\n{\n    u16 *stringId;\n\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]);\n    BufferStringBattle(*stringId);\n    if (BattleStringShouldBeColored(*stringId))\n        BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT));\n    else\n        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;\n}\n\nstatic void LinkOpponentHandlePrintSelectionString(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleChooseAction(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleUnknownYesNoBox(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleChooseMove(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleChooseItem(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleChoosePokemon(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleCmd23(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleHealthBarUpdate(void)\n{\n    s16 hpVal;\n\n    LoadBattleBarGfx(0);\n    hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n\n    if (hpVal != INSTANT_HP_BAR_DROP)\n    {\n        u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);\n        u32 curHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);\n\n        SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);\n    }\n    else\n    {\n        u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);\n\n        SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);\n    }\n\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;\n}\n\nstatic void LinkOpponentHandleExpUpdate(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleStatusIconUpdate(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u8 battlerId;\n\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON);\n        battlerId = gActiveBattler;\n        gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0;\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;\n    }\n}\n\nstatic void LinkOpponentHandleStatusAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1],\n                        gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24));\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;\n    }\n}\n\nstatic void LinkOpponentHandleStatusXor(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleDataTransfer(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleDMA3Transfer(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandlePlayBGM(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleCmd32(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleTwoReturnValues(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleChosenMonReturnValue(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleOneReturnValue(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleOneReturnValue_Duplicate(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleClearUnkVar(void)\n{\n    gUnusedControllerStruct.unk = 0;\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleSetUnkVar(void)\n{\n    gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1];\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleClearUnkFlag(void)\n{\n    gUnusedControllerStruct.flag = 0;\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleToggleUnkFlag(void)\n{\n    gUnusedControllerStruct.flag ^= 1;\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleHitAnimation(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)\n    {\n        LinkOpponentBufferExecCompleted();\n    }\n    else\n    {\n        gDoingBattleAnim = TRUE;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;\n        DoHitAnimHealthboxEffect(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;\n    }\n}\n\nstatic void LinkOpponentHandleCantSwitch(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandlePlaySE(void)\n{\n    s8 pan;\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        pan = SOUND_PAN_ATTACKER;\n    else\n        pan = SOUND_PAN_TARGET;\n\n    PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandlePlayFanfare(void)\n{\n    PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleFaintingCry(void)\n{\n    u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);\n\n    PlayCry_ByMode(species, 25, CRY_MODE_FAINT);\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleIntroSlide(void)\n{\n    HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);\n    gIntroSlideFlags |= 1;\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleIntroTrainerBallThrow(void)\n{\n    u8 taskId;\n\n    SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;\n\n    StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreeOpponentSprite);\n\n    taskId = CreateTask(Task_StartSendOutAnim, 5);\n    gTasks[taskId].data[0] = gActiveBattler;\n\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)\n        gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;\n\n    gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;\n    gBattlerControllerFuncs[gActiveBattler] = LinkOpponentDummy;\n}\n\nstatic void Task_StartSendOutAnim(u8 taskId)\n{\n    u8 savedActiveBank = gActiveBattler;\n\n    gActiveBattler = gTasks[taskId].data[0];\n    if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI))\n    {\n        gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n        StartSendOutAnim(gActiveBattler, FALSE);\n    }\n    else\n    {\n        gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n        StartSendOutAnim(gActiveBattler, FALSE);\n        gActiveBattler = BATTLE_PARTNER(gActiveBattler);\n        gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n        StartSendOutAnim(gActiveBattler, FALSE);\n        gActiveBattler = BATTLE_PARTNER(gActiveBattler);\n    }\n    gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox;\n    gActiveBattler = savedActiveBank;\n    DestroyTask(taskId);\n}\n\nstatic void SpriteCB_FreeOpponentSprite(struct Sprite *sprite)\n{\n    FreeTrainerFrontPicPaletteAndTile(sprite->oam.affineParam);\n    sprite->oam.tileNum = sprite->data[5];\n    FreeSpriteOamMatrix(sprite);\n    DestroySprite(sprite);\n}\n\nstatic void LinkOpponentHandleDrawPartyStatusSummary(void)\n{\n    if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n    {\n        LinkOpponentBufferExecCompleted();\n    }\n    else\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = TRUE;\n\n        if (gBattleBufferA[gActiveBattler][2] != 0)\n        {\n            if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay < 2)\n            {\n                gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay++;\n                return;\n            }\n            else\n            {\n                gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay = 0;\n            }\n        }\n\n        gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0;\n\n        if (gBattleBufferA[gActiveBattler][2] != 0)\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93;\n\n        gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary;\n    }\n}\n\nstatic void EndDrawPartyStatusSummary(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0;\n        LinkOpponentBufferExecCompleted();\n    }\n}\n\nstatic void LinkOpponentHandleHidePartyStatusSummary(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)\n        gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleEndBounceEffect(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleSpriteInvisibility(void)\n{\n    if (IsBattlerSpritePresent(gActiveBattler))\n    {\n        gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1];\n        CopyBattleSpriteInvisibility(gActiveBattler);\n    }\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleBattleAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u8 animationId = gBattleBufferA[gActiveBattler][1];\n        u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n\n        if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))\n            LinkOpponentBufferExecCompleted();\n        else\n            gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;\n    }\n}\n\nstatic void LinkOpponentHandleLinkStandbyMsg(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleResetActionMoveSelection(void)\n{\n    LinkOpponentBufferExecCompleted();\n}\n\nstatic void LinkOpponentHandleEndLinkBattle(void)\n{\n    if (gBattleBufferA[gActiveBattler][1] == B_OUTCOME_DREW)\n        gBattleOutcome = gBattleBufferA[gActiveBattler][1];\n    else\n        gBattleOutcome = gBattleBufferA[gActiveBattler][1] ^ B_OUTCOME_DREW;\n\n    FadeOutMapMusic(5);\n    BeginFastPaletteFade(3);\n    LinkOpponentBufferExecCompleted();\n    gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks;\n}\n\nstatic void LinkOpponentCmdEnd(void)\n{\n}\n"
  },
  {
    "path": "src/battle_controller_link_partner.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"link.h\"\n#include \"pokeball.h\"\n#include \"task.h\"\n#include \"util.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_controllers.h\"\n#include \"battle_interface.h\"\n#include \"battle_message.h\"\n#include \"constants/battle_anim.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n\nstatic void LinkPartnerHandleGetMonData(void);\nstatic void LinkPartnerHandleGetRawMonData(void);\nstatic void LinkPartnerHandleSetMonData(void);\nstatic void LinkPartnerHandleSetRawMonData(void);\nstatic void LinkPartnerHandleLoadMonSprite(void);\nstatic void LinkPartnerHandleSwitchInAnim(void);\nstatic void LinkPartnerHandleReturnMonToBall(void);\nstatic void LinkPartnerHandleDrawTrainerPic(void);\nstatic void LinkPartnerHandleTrainerSlide(void);\nstatic void LinkPartnerHandleTrainerSlideBack(void);\nstatic void LinkPartnerHandleFaintAnimation(void);\nstatic void LinkPartnerHandlePaletteFade(void);\nstatic void LinkPartnerHandleSuccessBallThrowAnim(void);\nstatic void LinkPartnerHandleBallThrowAnim(void);\nstatic void LinkPartnerHandlePause(void);\nstatic void LinkPartnerHandleMoveAnimation(void);\nstatic void LinkPartnerHandlePrintString(void);\nstatic void LinkPartnerHandlePrintSelectionString(void);\nstatic void LinkPartnerHandleChooseAction(void);\nstatic void LinkPartnerHandleUnknownYesNoBox(void);\nstatic void LinkPartnerHandleChooseMove(void);\nstatic void LinkPartnerHandleChooseItem(void);\nstatic void LinkPartnerHandleChoosePokemon(void);\nstatic void LinkPartnerHandleCmd23(void);\nstatic void LinkPartnerHandleHealthBarUpdate(void);\nstatic void LinkPartnerHandleExpUpdate(void);\nstatic void LinkPartnerHandleStatusIconUpdate(void);\nstatic void LinkPartnerHandleStatusAnimation(void);\nstatic void LinkPartnerHandleStatusXor(void);\nstatic void LinkPartnerHandleDataTransfer(void);\nstatic void LinkPartnerHandleDMA3Transfer(void);\nstatic void LinkPartnerHandlePlayBGM(void);\nstatic void LinkPartnerHandleCmd32(void);\nstatic void LinkPartnerHandleTwoReturnValues(void);\nstatic void LinkPartnerHandleChosenMonReturnValue(void);\nstatic void LinkPartnerHandleOneReturnValue(void);\nstatic void LinkPartnerHandleOneReturnValue_Duplicate(void);\nstatic void LinkPartnerHandleClearUnkVar(void);\nstatic void LinkPartnerHandleSetUnkVar(void);\nstatic void LinkPartnerHandleClearUnkFlag(void);\nstatic void LinkPartnerHandleToggleUnkFlag(void);\nstatic void LinkPartnerHandleHitAnimation(void);\nstatic void LinkPartnerHandleCantSwitch(void);\nstatic void LinkPartnerHandlePlaySE(void);\nstatic void LinkPartnerHandlePlayFanfare(void);\nstatic void LinkPartnerHandleFaintingCry(void);\nstatic void LinkPartnerHandleIntroSlide(void);\nstatic void LinkPartnerHandleIntroTrainerBallThrow(void);\nstatic void LinkPartnerHandleDrawPartyStatusSummary(void);\nstatic void LinkPartnerHandleHidePartyStatusSummary(void);\nstatic void LinkPartnerHandleEndBounceEffect(void);\nstatic void LinkPartnerHandleSpriteInvisibility(void);\nstatic void LinkPartnerHandleBattleAnimation(void);\nstatic void LinkPartnerHandleLinkStandbyMsg(void);\nstatic void LinkPartnerHandleResetActionMoveSelection(void);\nstatic void LinkPartnerHandleEndLinkBattle(void);\nstatic void LinkPartnerCmdEnd(void);\n\nstatic void LinkPartnerBufferRunCommand(void);\nstatic void LinkPartnerBufferExecCompleted(void);\nstatic void SwitchIn_WaitAndEnd(void);\nstatic u32 CopyLinkPartnerMonData(u8 monId, u8 *dst);\nstatic void SetLinkPartnerMonData(u8 monId);\nstatic void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit);\nstatic void DoSwitchOutAnimation(void);\nstatic void LinkPartnerDoMoveAnimation(void);\nstatic void Task_StartSendOutAnim(u8 taskId);\nstatic void EndDrawPartyStatusSummary(void);\n\nstatic void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) =\n{\n    [CONTROLLER_GETMONDATA]               = LinkPartnerHandleGetMonData,\n    [CONTROLLER_GETRAWMONDATA]            = LinkPartnerHandleGetRawMonData,\n    [CONTROLLER_SETMONDATA]               = LinkPartnerHandleSetMonData,\n    [CONTROLLER_SETRAWMONDATA]            = LinkPartnerHandleSetRawMonData,\n    [CONTROLLER_LOADMONSPRITE]            = LinkPartnerHandleLoadMonSprite,\n    [CONTROLLER_SWITCHINANIM]             = LinkPartnerHandleSwitchInAnim,\n    [CONTROLLER_RETURNMONTOBALL]          = LinkPartnerHandleReturnMonToBall,\n    [CONTROLLER_DRAWTRAINERPIC]           = LinkPartnerHandleDrawTrainerPic,\n    [CONTROLLER_TRAINERSLIDE]             = LinkPartnerHandleTrainerSlide,\n    [CONTROLLER_TRAINERSLIDEBACK]         = LinkPartnerHandleTrainerSlideBack,\n    [CONTROLLER_FAINTANIMATION]           = LinkPartnerHandleFaintAnimation,\n    [CONTROLLER_PALETTEFADE]              = LinkPartnerHandlePaletteFade,\n    [CONTROLLER_SUCCESSBALLTHROWANIM]     = LinkPartnerHandleSuccessBallThrowAnim,\n    [CONTROLLER_BALLTHROWANIM]            = LinkPartnerHandleBallThrowAnim,\n    [CONTROLLER_PAUSE]                    = LinkPartnerHandlePause,\n    [CONTROLLER_MOVEANIMATION]            = LinkPartnerHandleMoveAnimation,\n    [CONTROLLER_PRINTSTRING]              = LinkPartnerHandlePrintString,\n    [CONTROLLER_PRINTSTRINGPLAYERONLY]    = LinkPartnerHandlePrintSelectionString,\n    [CONTROLLER_CHOOSEACTION]             = LinkPartnerHandleChooseAction,\n    [CONTROLLER_UNKNOWNYESNOBOX]          = LinkPartnerHandleUnknownYesNoBox,\n    [CONTROLLER_CHOOSEMOVE]               = LinkPartnerHandleChooseMove,\n    [CONTROLLER_OPENBAG]                  = LinkPartnerHandleChooseItem,\n    [CONTROLLER_CHOOSEPOKEMON]            = LinkPartnerHandleChoosePokemon,\n    [CONTROLLER_23]                       = LinkPartnerHandleCmd23,\n    [CONTROLLER_HEALTHBARUPDATE]          = LinkPartnerHandleHealthBarUpdate,\n    [CONTROLLER_EXPUPDATE]                = LinkPartnerHandleExpUpdate,\n    [CONTROLLER_STATUSICONUPDATE]         = LinkPartnerHandleStatusIconUpdate,\n    [CONTROLLER_STATUSANIMATION]          = LinkPartnerHandleStatusAnimation,\n    [CONTROLLER_STATUSXOR]                = LinkPartnerHandleStatusXor,\n    [CONTROLLER_DATATRANSFER]             = LinkPartnerHandleDataTransfer,\n    [CONTROLLER_DMA3TRANSFER]             = LinkPartnerHandleDMA3Transfer,\n    [CONTROLLER_PLAYBGM]                  = LinkPartnerHandlePlayBGM,\n    [CONTROLLER_32]                       = LinkPartnerHandleCmd32,\n    [CONTROLLER_TWORETURNVALUES]          = LinkPartnerHandleTwoReturnValues,\n    [CONTROLLER_CHOSENMONRETURNVALUE]     = LinkPartnerHandleChosenMonReturnValue,\n    [CONTROLLER_ONERETURNVALUE]           = LinkPartnerHandleOneReturnValue,\n    [CONTROLLER_ONERETURNVALUE_DUPLICATE] = LinkPartnerHandleOneReturnValue_Duplicate,\n    [CONTROLLER_CLEARUNKVAR]              = LinkPartnerHandleClearUnkVar,\n    [CONTROLLER_SETUNKVAR]                = LinkPartnerHandleSetUnkVar,\n    [CONTROLLER_CLEARUNKFLAG]             = LinkPartnerHandleClearUnkFlag,\n    [CONTROLLER_TOGGLEUNKFLAG]            = LinkPartnerHandleToggleUnkFlag,\n    [CONTROLLER_HITANIMATION]             = LinkPartnerHandleHitAnimation,\n    [CONTROLLER_CANTSWITCH]               = LinkPartnerHandleCantSwitch,\n    [CONTROLLER_PLAYSE]                   = LinkPartnerHandlePlaySE,\n    [CONTROLLER_PLAYFANFARE]              = LinkPartnerHandlePlayFanfare,\n    [CONTROLLER_FAINTINGCRY]              = LinkPartnerHandleFaintingCry,\n    [CONTROLLER_INTROSLIDE]               = LinkPartnerHandleIntroSlide,\n    [CONTROLLER_INTROTRAINERBALLTHROW]    = LinkPartnerHandleIntroTrainerBallThrow,\n    [CONTROLLER_DRAWPARTYSTATUSSUMMARY]   = LinkPartnerHandleDrawPartyStatusSummary,\n    [CONTROLLER_HIDEPARTYSTATUSSUMMARY]   = LinkPartnerHandleHidePartyStatusSummary,\n    [CONTROLLER_ENDBOUNCE]                = LinkPartnerHandleEndBounceEffect,\n    [CONTROLLER_SPRITEINVISIBILITY]       = LinkPartnerHandleSpriteInvisibility,\n    [CONTROLLER_BATTLEANIMATION]          = LinkPartnerHandleBattleAnimation,\n    [CONTROLLER_LINKSTANDBYMSG]           = LinkPartnerHandleLinkStandbyMsg,\n    [CONTROLLER_RESETACTIONMOVESELECTION] = LinkPartnerHandleResetActionMoveSelection,\n    [CONTROLLER_ENDLINKBATTLE]            = LinkPartnerHandleEndLinkBattle,\n    [CONTROLLER_TERMINATOR_NOP]           = LinkPartnerCmdEnd\n};\n\nstatic void LinkPartnerDummy(void)\n{\n}\n\nvoid SetControllerToLinkPartner(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = LinkPartnerBufferRunCommand;\n}\n\nstatic void LinkPartnerBufferRunCommand(void)\n{\n    if (gBattleControllerExecFlags & gBitTable[gActiveBattler])\n    {\n        if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sLinkPartnerBufferCommands))\n            sLinkPartnerBufferCommands[gBattleBufferA[gActiveBattler][0]]();\n        else\n            LinkPartnerBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnBattlerSpriteCallbackDummy(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        LinkPartnerBufferExecCompleted();\n}\n\nstatic void FreeTrainerSpriteAfterSlide(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n    {\n        BattleGfxSfxDummy3(MALE);\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        LinkPartnerBufferExecCompleted();\n    }\n}\n\nstatic void Intro_DelayAndEnd(void)\n{\n    if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0;\n        LinkPartnerBufferExecCompleted();\n    }\n}\n\nstatic void Intro_WaitForHealthbox(void)\n{\n    bool32 finished = FALSE;\n\n    if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))\n    {\n        if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n            finished = TRUE;\n    }\n    else if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy\n         && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy)\n    {\n        finished = TRUE;\n    }\n\n    if (IsCryPlayingOrClearCrySongs())\n        finished = FALSE;\n\n    if (finished)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3;\n        gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd;\n    }\n}\n\nstatic void Intro_ShowHealthbox(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive\n        && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive\n        && ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay != 1)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0;\n\n        if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n        {\n            DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]);\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK],\n                                     &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]],\n                                     HEALTHBOX_ALL);\n\n            StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK);\n\n            SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);\n        }\n\n        DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]);\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler],\n                                 &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]],\n                                 HEALTHBOX_ALL);\n        StartHealthboxSlideIn(gActiveBattler);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n\n        gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;\n\n        gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForHealthbox;\n    }\n}\n\nstatic void WaitForMonAnimAfterLoad(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded && gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0)\n        LinkPartnerBufferExecCompleted();\n}\n\nstatic void CompleteOnHealthbarDone(void)\n{\n    s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);\n\n    SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n\n    if (hpValue != -1)\n    {\n        UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);\n    }\n    else\n    {\n        HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n        LinkPartnerBufferExecCompleted();\n    }\n}\n\nstatic void FreeMonSpriteAfterFaintAnim(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].y + gSprites[gBattlerSpriteIds[gActiveBattler]].y2 > DISPLAY_HEIGHT)\n    {\n        FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        LinkPartnerBufferExecCompleted();\n    }\n}\n\nstatic void FreeMonSpriteAfterSwitchOutAnim(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n    {\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        LinkPartnerBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnInactiveTextPrinter(void)\n{\n    if (!IsTextPrinterActive(B_WIN_MSG))\n        LinkPartnerBufferExecCompleted();\n}\n\nstatic void DoHitAnimBlinkSpriteEffect(void)\n{\n    u8 spriteId = gBattlerSpriteIds[gActiveBattler];\n\n    if (gSprites[spriteId].data[1] == 32)\n    {\n        gSprites[spriteId].data[1] = 0;\n        gSprites[spriteId].invisible = FALSE;\n        gDoingBattleAnim = FALSE;\n        LinkPartnerBufferExecCompleted();\n    }\n    else\n    {\n        if ((gSprites[spriteId].data[1] % 4) == 0)\n            gSprites[spriteId].invisible ^= 1;\n        gSprites[spriteId].data[1]++;\n    }\n}\n\nstatic void SwitchIn_ShowSubstitute(void)\n{\n    if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n    {\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);\n\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_WaitAndEnd;\n    }\n}\n\nstatic void SwitchIn_WaitAndEnd(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n    {\n        LinkPartnerBufferExecCompleted();\n    }\n}\n\nstatic void SwitchIn_ShowHealthbox(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n\n        FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n        FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n\n        CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10);\n        HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n        StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0);\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);\n        StartHealthboxSlideIn(gActiveBattler);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n        CopyBattleSpriteInvisibility(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute;\n    }\n}\n\nstatic void SwitchIn_TryShinyAnim(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim\n        && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)\n    {\n        TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);\n    }\n\n    if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy\n     && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)\n    {\n        DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]);\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox;\n    }\n}\n\nstatic void LinkPartnerBufferExecCompleted(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = LinkPartnerBufferRunCommand;\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        u8 playerId = GetMultiplayerId();\n\n        PrepareBufferDataTransferLink(2, 4, &playerId);\n        gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;\n    }\n    else\n    {\n        gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];\n    }\n}\n\nstatic void CompleteOnFinishedStatusAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)\n        LinkPartnerBufferExecCompleted();\n}\n\nstatic void CompleteOnFinishedBattleAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)\n        LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleGetMonData(void)\n{\n    u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data\n    u32 size = 0;\n    u8 monToCheck;\n    s32 i;\n\n    if (gBattleBufferA[gActiveBattler][2] == 0)\n    {\n        size += CopyLinkPartnerMonData(gBattlerPartyIndexes[gActiveBattler], monData);\n    }\n    else\n    {\n        monToCheck = gBattleBufferA[gActiveBattler][2];\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (monToCheck & 1)\n                size += CopyLinkPartnerMonData(i, monData + size);\n            monToCheck >>= 1;\n        }\n    }\n    BtlController_EmitDataTransfer(BUFFER_B, size, monData);\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic u32 CopyLinkPartnerMonData(u8 monId, u8 *dst)\n{\n    struct BattlePokemon battleMon;\n    struct MovePpInfo moveData;\n    u8 nickname[20];\n    u8 *src;\n    s16 data16;\n    u32 data32;\n    s32 size = 0;\n\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case REQUEST_ALL_BATTLE:\n        battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);\n        battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM);\n        for (size = 0; size < MAX_MON_MOVES; size++)\n        {\n            battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);\n            battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);\n        }\n        battleMon.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);\n        battleMon.friendship = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP);\n        battleMon.experience = GetMonData(&gPlayerParty[monId], MON_DATA_EXP);\n        battleMon.hpIV = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV);\n        battleMon.attackIV = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV);\n        battleMon.defenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV);\n        battleMon.speedIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV);\n        battleMon.spAttackIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV);\n        battleMon.spDefenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV);\n        battleMon.personality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY);\n        battleMon.status1 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS);\n        battleMon.level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);\n        battleMon.hp = GetMonData(&gPlayerParty[monId], MON_DATA_HP);\n        battleMon.maxHP = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP);\n        battleMon.attack = GetMonData(&gPlayerParty[monId], MON_DATA_ATK);\n        battleMon.defense = GetMonData(&gPlayerParty[monId], MON_DATA_DEF);\n        battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED);\n        battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK);\n        battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF);\n        battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG);\n        battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM);\n        battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID);\n        GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname);\n        StringCopy_Nickname(battleMon.nickname, nickname);\n        GetMonData(&gPlayerParty[monId], MON_DATA_OT_NAME, battleMon.otName);\n        src = (u8 *)&battleMon;\n        for (size = 0; size < sizeof(battleMon); size++)\n            dst[size] = src[size];\n        break;\n    case REQUEST_SPECIES_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_HELDITEM_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_MOVES_PP_BATTLE:\n        for (size = 0; size < MAX_MON_MOVES; size++)\n        {\n            moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);\n            moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);\n        }\n        moveData.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);\n        src = (u8 *)(&moveData);\n        for (size = 0; size < sizeof(moveData); size++)\n            dst[size] = src[size];\n        break;\n    case REQUEST_MOVE1_BATTLE:\n    case REQUEST_MOVE2_BATTLE:\n    case REQUEST_MOVE3_BATTLE:\n    case REQUEST_MOVE4_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_PP_DATA_BATTLE:\n        for (size = 0; size < MAX_MON_MOVES; size++)\n            dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);\n        dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);\n        size++;\n        break;\n    case REQUEST_PPMOVE1_BATTLE:\n    case REQUEST_PPMOVE2_BATTLE:\n    case REQUEST_PPMOVE3_BATTLE:\n    case REQUEST_PPMOVE4_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);\n        size = 1;\n        break;\n    case REQUEST_OTID_BATTLE:\n        data32 = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        size = 3;\n        break;\n    case REQUEST_EXP_BATTLE:\n        data32 = GetMonData(&gPlayerParty[monId], MON_DATA_EXP);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        size = 3;\n        break;\n    case REQUEST_HP_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_EV);\n        size = 1;\n        break;\n    case REQUEST_ATK_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV);\n        size = 1;\n        break;\n    case REQUEST_DEF_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV);\n        size = 1;\n        break;\n    case REQUEST_SPEED_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV);\n        size = 1;\n        break;\n    case REQUEST_SPATK_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV);\n        size = 1;\n        break;\n    case REQUEST_SPDEF_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV);\n        size = 1;\n        break;\n    case REQUEST_FRIENDSHIP_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP);\n        size = 1;\n        break;\n    case REQUEST_POKERUS_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKERUS);\n        size = 1;\n        break;\n    case REQUEST_MET_LOCATION_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION);\n        size = 1;\n        break;\n    case REQUEST_MET_LEVEL_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL);\n        size = 1;\n        break;\n    case REQUEST_MET_GAME_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME);\n        size = 1;\n        break;\n    case REQUEST_POKEBALL_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL);\n        size = 1;\n        break;\n    case REQUEST_ALL_IVS_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV);\n        dst[1] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV);\n        dst[2] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV);\n        dst[3] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV);\n        dst[4] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV);\n        dst[5] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV);\n        size = 6;\n        break;\n    case REQUEST_HP_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV);\n        size = 1;\n        break;\n    case REQUEST_ATK_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV);\n        size = 1;\n        break;\n    case REQUEST_DEF_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV);\n        size = 1;\n        break;\n    case REQUEST_SPEED_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV);\n        size = 1;\n        break;\n    case REQUEST_SPATK_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV);\n        size = 1;\n        break;\n    case REQUEST_SPDEF_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV);\n        size = 1;\n        break;\n    case REQUEST_PERSONALITY_BATTLE:\n        data32 = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        dst[3] = (data32 & 0xFF000000) >> 24;\n        size = 4;\n        break;\n    case REQUEST_CHECKSUM_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_STATUS_BATTLE:\n        data32 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        dst[3] = (data32 & 0xFF000000) >> 24;\n        size = 4;\n        break;\n    case REQUEST_LEVEL_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);\n        size = 1;\n        break;\n    case REQUEST_HP_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HP);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_MAX_HP_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_ATK_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_ATK);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_DEF_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_DEF);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPEED_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPATK_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPDEF_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_COOL_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL);\n        size = 1;\n        break;\n    case REQUEST_BEAUTY_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY);\n        size = 1;\n        break;\n    case REQUEST_CUTE_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE);\n        size = 1;\n        break;\n    case REQUEST_SMART_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART);\n        size = 1;\n        break;\n    case REQUEST_TOUGH_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH);\n        size = 1;\n        break;\n    case REQUEST_SHEEN_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SHEEN);\n        size = 1;\n        break;\n    case REQUEST_COOL_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_BEAUTY_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_CUTE_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_SMART_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_TOUGH_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON);\n        size = 1;\n        break;\n    }\n\n    return size;\n}\n\nstatic void LinkPartnerHandleGetRawMonData(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleSetMonData(void)\n{\n    u8 monToCheck;\n    u32 i;\n\n    if (gBattleBufferA[gActiveBattler][2] == 0)\n    {\n        SetLinkPartnerMonData(gBattlerPartyIndexes[gActiveBattler]);\n    }\n    else\n    {\n        monToCheck = gBattleBufferA[gActiveBattler][2];\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (monToCheck & 1)\n                SetLinkPartnerMonData(i);\n            monToCheck >>= 1;\n        }\n    }\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void SetLinkPartnerMonData(u8 monId)\n{\n    struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];\n    struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];\n    s32 i;\n\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case REQUEST_ALL_BATTLE:\n        {\n            u8 iv;\n\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species);\n            SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);\n            for (i = 0; i < MAX_MON_MOVES; i++)\n            {\n                SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);\n                SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);\n            }\n            SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses);\n            SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship);\n            SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &battlePokemon->experience);\n            iv = battlePokemon->hpIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &iv);\n            iv = battlePokemon->attackIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &iv);\n            iv = battlePokemon->defenseIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &iv);\n            iv = battlePokemon->speedIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &iv);\n            iv = battlePokemon->spAttackIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &iv);\n            iv = battlePokemon->spDefenseIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &iv);\n            SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality);\n            SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &battlePokemon->status1);\n            SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &battlePokemon->level);\n            SetMonData(&gPlayerParty[monId], MON_DATA_HP, &battlePokemon->hp);\n            SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP);\n            SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &battlePokemon->attack);\n            SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &battlePokemon->defense);\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &battlePokemon->speed);\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack);\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense);\n        }\n        break;\n    case REQUEST_SPECIES_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HELDITEM_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MOVES_PP_BATTLE:\n        for (i = 0; i < MAX_MON_MOVES; i++)\n        {\n            SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);\n            SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);\n        }\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses);\n        break;\n    case REQUEST_MOVE1_BATTLE:\n    case REQUEST_MOVE2_BATTLE:\n    case REQUEST_MOVE3_BATTLE:\n    case REQUEST_MOVE4_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_PP_DATA_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);\n        break;\n    case REQUEST_PPMOVE1_BATTLE:\n    case REQUEST_PPMOVE2_BATTLE:\n    case REQUEST_PPMOVE3_BATTLE:\n    case REQUEST_PPMOVE4_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_OTID_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_EXP_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HP_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_FRIENDSHIP_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_POKERUS_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_LOCATION_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_LEVEL_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_GAME_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_POKEBALL_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ALL_IVS_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);\n        break;\n    case REQUEST_HP_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_PERSONALITY_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CHECKSUM_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_STATUS_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_LEVEL_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HP_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MAX_HP_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_COOL_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_BEAUTY_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CUTE_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SMART_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_TOUGH_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SHEEN_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_COOL_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_BEAUTY_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CUTE_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SMART_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_TOUGH_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    }\n\n    HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n}\n\nstatic void LinkPartnerHandleSetRawMonData(void)\n{\n    u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];\n    u32 i;\n\n    for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++)\n        dst[i] = gBattleBufferA[gActiveBattler][3 + i];\n\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleLoadMonSprite(void)\n{\n    u16 species;\n\n    BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n    species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);\n    SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler));\n\n    gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                     GetBattlerSpriteCoord(gActiveBattler, BATTLER_COORD_X_2),\n                                                     GetBattlerSpriteDefault_Y(gActiveBattler),\n                                                     GetBattlerSpriteSubpriority(gActiveBattler));\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]);\n    gBattlerControllerFuncs[gActiveBattler] = WaitForMonAnimAfterLoad;\n}\n\nstatic void LinkPartnerHandleSwitchInAnim(void)\n{\n    ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]);\n    gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1];\n    BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n    StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]);\n    gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim;\n}\n\nstatic void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit)\n{\n    u16 species;\n\n    ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit);\n    gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];\n    species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n    gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim);\n    SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));\n\n    gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2),\n                                                GetBattlerSpriteDefault_Y(battlerId),\n                                                GetBattlerSpriteSubpriority(battlerId));\n\n    gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId];\n\n    gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;\n    gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;\n    gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;\n\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);\n\n    gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;\n    gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;\n\n    gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT);\n}\n\nstatic void LinkPartnerHandleReturnMonToBall(void)\n{\n    if (gBattleBufferA[gActiveBattler][1] == 0)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n        gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;\n    }\n    else\n    {\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        LinkPartnerBufferExecCompleted();\n    }\n}\n\nstatic void DoSwitchOutAnimation(void)\n{\n    switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)\n    {\n    case 0:\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;\n        break;\n    case 1:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON);\n            gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim;\n        }\n        break;\n    }\n}\n\n#define sSpeedX data[0]\n\nstatic void LinkPartnerHandleDrawTrainerPic(void)\n{\n    s16 xPos;\n    u32 trainerPicId;\n\n    if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != B_FLANK_LEFT) // Second mon, on the right.\n        xPos = 90;\n    else // First mon, on the left.\n        xPos = 32;\n\n    if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_RUBY\n        || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_SAPPHIRE)\n    {\n        trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN;\n    }\n    else if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_EMERALD)\n    {\n        trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_EMERALD_BRENDAN;\n    }\n    else\n    {\n        trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender;\n    }\n\n    DecompressTrainerBackPalette(trainerPicId, gActiveBattler);\n    SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));\n    gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80, GetBattlerSpriteSubpriority(gActiveBattler));\n\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2;\n    if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n        gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -DISPLAY_WIDTH;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn;\n\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;\n}\n\n#undef sSpeedX\n\nstatic void LinkPartnerHandleTrainerSlide(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleTrainerSlideBack(void)\n{\n    SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);\n    gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide;\n}\n\n#define sSpeedX data[1]\n#define sSpeedY data[2]\n\nstatic void LinkPartnerHandleFaintAnimation(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0)\n    {\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++;\n    }\n    else\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n            PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER);\n            gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 0;\n            gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedY = 5;\n            gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim;\n            gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim;\n        }\n    }\n}\n\n#undef sSpeedX\n#undef sSpeedY\n\nstatic void LinkPartnerHandlePaletteFade(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleSuccessBallThrowAnim(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleBallThrowAnim(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandlePause(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleMoveAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);\n\n        gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];\n        gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);\n        gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);\n        gAnimFriendship = gBattleBufferA[gActiveBattler][10];\n        gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);\n        gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];\n        gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;\n        if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE\n        {\n            LinkPartnerBufferExecCompleted();\n        }\n        else\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            gBattlerControllerFuncs[gActiveBattler] = LinkPartnerDoMoveAnimation;\n        }\n    }\n}\n\nstatic void LinkPartnerDoMoveAnimation(void)\n{\n    u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);\n    u8 multihit = gBattleBufferA[gActiveBattler][11];\n\n    switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)\n    {\n    case 0:\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute\n            && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8)\n        {\n            gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1;\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        }\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;\n        break;\n    case 1:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF);\n            DoMoveAnim(move);\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;\n        }\n        break;\n    case 2:\n        gAnimScriptCallback();\n        if (!gAnimScriptActive)\n        {\n            SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL);\n            if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2)\n            {\n                InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);\n                gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0;\n            }\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;\n        }\n        break;\n    case 3:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            CopyAllBattleSpritesInvisibilities();\n            TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            LinkPartnerBufferExecCompleted();\n        }\n        break;\n    }\n}\n\nstatic void LinkPartnerHandlePrintString(void)\n{\n    u16 *stringId;\n\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]);\n    BufferStringBattle(*stringId);\n    if (BattleStringShouldBeColored(*stringId))\n        BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT));\n    else\n        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;\n}\n\nstatic void LinkPartnerHandlePrintSelectionString(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleChooseAction(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleUnknownYesNoBox(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleChooseMove(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleChooseItem(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleChoosePokemon(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleCmd23(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleHealthBarUpdate(void)\n{\n    s16 hpVal;\n\n    LoadBattleBarGfx(0);\n    hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n\n    if (hpVal != INSTANT_HP_BAR_DROP)\n    {\n        u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);\n        u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);\n\n        SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);\n    }\n    else\n    {\n        u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);\n\n        SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);\n    }\n\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;\n}\n\nstatic void LinkPartnerHandleExpUpdate(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleStatusIconUpdate(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u8 battlerId;\n\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON);\n        battlerId = gActiveBattler;\n        gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0;\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;\n    }\n}\n\nstatic void LinkPartnerHandleStatusAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1],\n                        gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24));\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;\n    }\n}\n\nstatic void LinkPartnerHandleStatusXor(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleDataTransfer(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleDMA3Transfer(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandlePlayBGM(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleCmd32(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleTwoReturnValues(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleChosenMonReturnValue(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleOneReturnValue(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleOneReturnValue_Duplicate(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleClearUnkVar(void)\n{\n    gUnusedControllerStruct.unk = 0;\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleSetUnkVar(void)\n{\n    gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1];\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleClearUnkFlag(void)\n{\n    gUnusedControllerStruct.flag = 0;\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleToggleUnkFlag(void)\n{\n    gUnusedControllerStruct.flag ^= 1;\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleHitAnimation(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)\n    {\n        LinkPartnerBufferExecCompleted();\n    }\n    else\n    {\n        gDoingBattleAnim = TRUE;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;\n        DoHitAnimHealthboxEffect(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;\n    }\n}\n\nstatic void LinkPartnerHandleCantSwitch(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandlePlaySE(void)\n{\n    s8 pan;\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        pan = SOUND_PAN_ATTACKER;\n    else\n        pan = SOUND_PAN_TARGET;\n\n    PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandlePlayFanfare(void)\n{\n    PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleFaintingCry(void)\n{\n    u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);\n\n    PlayCry_ByMode(species, -25, CRY_MODE_FAINT);\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleIntroSlide(void)\n{\n    HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);\n    gIntroSlideFlags |= 1;\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleIntroTrainerBallThrow(void)\n{\n    u8 paletteNum;\n    u8 taskId;\n    u32 trainerPicId;\n\n    SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;\n\n    StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite);\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);\n\n    paletteNum = AllocSpritePalette(0xD6F9);\n    if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_RUBY\n        || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_SAPPHIRE)\n    {\n        trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN;\n    }\n    else if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_EMERALD)\n    {\n        trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_EMERALD_BRENDAN;\n    }\n    else\n    {\n        trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender;\n    }\n\n    LoadCompressedPalette(gTrainerBackPicPaletteTable[trainerPicId].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP);\n\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum;\n\n    taskId = CreateTask(Task_StartSendOutAnim, 5);\n    gTasks[taskId].data[0] = gActiveBattler;\n\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)\n        gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;\n\n    gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;\n    gBattlerControllerFuncs[gActiveBattler] = LinkPartnerDummy;\n}\n\nstatic void Task_StartSendOutAnim(u8 taskId)\n{\n    if (gTasks[taskId].data[1] < 24)\n    {\n        gTasks[taskId].data[1]++;\n    }\n    else\n    {\n        u8 savedActiveBattler = gActiveBattler;\n\n        gActiveBattler = gTasks[taskId].data[0];\n        if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI))\n        {\n            gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n            StartSendOutAnim(gActiveBattler, FALSE);\n        }\n        else\n        {\n            gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n            StartSendOutAnim(gActiveBattler, FALSE);\n            gActiveBattler ^= BIT_FLANK;\n            gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n            BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n            StartSendOutAnim(gActiveBattler, FALSE);\n            gActiveBattler ^= BIT_FLANK;\n        }\n        gBattlerControllerFuncs[gActiveBattler] = Intro_ShowHealthbox;\n        gActiveBattler = savedActiveBattler;\n        DestroyTask(taskId);\n    }\n}\n\nstatic void LinkPartnerHandleDrawPartyStatusSummary(void)\n{\n    if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n    {\n        LinkPartnerBufferExecCompleted();\n    }\n    else\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = TRUE;\n        gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0;\n\n        if (gBattleBufferA[gActiveBattler][2] != 0) // Skip delay on battle start\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93;\n\n        gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary;\n    }\n}\n\nstatic void EndDrawPartyStatusSummary(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0;\n        LinkPartnerBufferExecCompleted();\n    }\n}\n\nstatic void LinkPartnerHandleHidePartyStatusSummary(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)\n        gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleEndBounceEffect(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleSpriteInvisibility(void)\n{\n    if (IsBattlerSpritePresent(gActiveBattler))\n    {\n        gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1];\n        CopyBattleSpriteInvisibility(gActiveBattler);\n    }\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleBattleAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u8 animationId = gBattleBufferA[gActiveBattler][1];\n        u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n\n        if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))\n            LinkPartnerBufferExecCompleted();\n        else\n            gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;\n    }\n}\n\nstatic void LinkPartnerHandleLinkStandbyMsg(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleResetActionMoveSelection(void)\n{\n    LinkPartnerBufferExecCompleted();\n}\n\nstatic void LinkPartnerHandleEndLinkBattle(void)\n{\n    gBattleOutcome = gBattleBufferA[gActiveBattler][1];\n    FadeOutMapMusic(5);\n    BeginFastPaletteFade(3);\n    LinkPartnerBufferExecCompleted();\n    gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks;\n}\n\nstatic void LinkPartnerCmdEnd(void)\n{\n}\n"
  },
  {
    "path": "src/battle_controller_oak_old_man.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"pokeball.h\"\n#include \"party_menu.h\"\n#include \"util.h\"\n#include \"m4a.h\"\n#include \"link.h\"\n#include \"item.h\"\n#include \"item_menu.h\"\n#include \"strings.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_controllers.h\"\n#include \"battle_interface.h\"\n#include \"battle_message.h\"\n#include \"reshow_battle_screen.h\"\n#include \"constants/songs.h\"\n#include \"constants/items.h\"\n\nstatic void OakOldManHandleGetMonData(void);\nstatic void OakOldManHandleGetRawMonData(void);\nstatic void OakOldManHandleSetMonData(void);\nstatic void OakOldManHandleSetRawMonData(void);\nstatic void OakOldManHandleLoadMonSprite(void);\nstatic void OakOldManHandleSwitchInAnim(void);\nstatic void OakOldManHandleReturnMonToBall(void);\nstatic void OakOldManHandleDrawTrainerPic(void);\nstatic void OakOldManHandleTrainerSlide(void);\nstatic void OakOldManHandleTrainerSlideBack(void);\nstatic void OakOldManHandleFaintAnimation(void);\nstatic void OakOldManHandlePaletteFade(void);\nstatic void OakOldManHandleSuccessBallThrowAnim(void);\nstatic void OakOldManHandleBallThrowAnim(void);\nstatic void OakOldManHandlePause(void);\nstatic void OakOldManHandleMoveAnimation(void);\nstatic void OakOldManHandlePrintString(void);\nstatic void OakOldManHandlePrintSelectionString(void);\nstatic void OakOldManHandleChooseAction(void);\nstatic void OakOldManHandleUnknownYesNoBox(void);\nstatic void OakOldManHandleChooseMove(void);\nstatic void OakOldManHandleChooseItem(void);\nstatic void OakOldManHandleChoosePokemon(void);\nstatic void OakOldManHandleCmd23(void);\nstatic void OakOldManHandleHealthBarUpdate(void);\nstatic void OakOldManHandleExpUpdate(void);\nstatic void OakOldManHandleStatusIconUpdate(void);\nstatic void OakOldManHandleStatusAnimation(void);\nstatic void OakOldManHandleStatusXor(void);\nstatic void OakOldManHandleDataTransfer(void);\nstatic void OakOldManHandleDMA3Transfer(void);\nstatic void OakOldManHandlePlayBGM(void);\nstatic void OakOldManHandleCmd32(void);\nstatic void OakOldManHandleTwoReturnValues(void);\nstatic void OakOldManHandleChosenMonReturnValue(void);\nstatic void OakOldManHandleOneReturnValue(void);\nstatic void OakOldManHandleOneReturnValue_Duplicate(void);\nstatic void OakOldManHandleCmd37(void);\nstatic void OakOldManHandleCmd38(void);\nstatic void OakOldManHandleCmd39(void);\nstatic void OakOldManHandleCmd40(void);\nstatic void OakOldManHandleHitAnimation(void);\nstatic void OakOldManHandleCmd42(void);\nstatic void OakOldManHandlePlaySE(void);\nstatic void OakOldManHandlePlayFanfare(void);\nstatic void OakOldManHandleFaintingCry(void);\nstatic void OakOldManHandleIntroSlide(void);\nstatic void OakOldManHandleIntroTrainerBallThrow(void);\nstatic void OakOldManHandleDrawPartyStatusSummary(void);\nstatic void OakOldManHandleHidePartyStatusSummary(void);\nstatic void OakOldManHandleEndBounceEffect(void);\nstatic void OakOldManHandleSpriteInvisibility(void);\nstatic void OakOldManHandleBattleAnimation(void);\nstatic void OakOldManHandleLinkStandbyMsg(void);\nstatic void OakOldManHandleResetActionMoveSelection(void);\nstatic void OakOldManHandleCmd55(void);\nstatic void OakOldManCmdEnd(void);\n\nstatic void OakOldManBufferRunCommand(void);\nstatic void OakOldManBufferExecCompleted(void);\nstatic void WaitForMonSelection(void);\nstatic void CompleteWhenChoseItem(void);\nstatic void PrintOakText_KeepAnEyeOnHP(void);\nstatic void Intro_WaitForShinyAnimAndHealthbox(void);\nstatic void PrintOakText_ForPetesSake(void);\nstatic void Task_LaunchLvlUpAnim(u8 taskId);\nstatic void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId);\nstatic void CompleteOnInactiveTextPrinter2(void);\nstatic void Task_PrepareToGiveExpWithExpBar(u8 taskId);\nstatic void Task_GiveExpWithExpBar(u8 taskId);\nstatic void Task_UpdateLvlInHealthbox(u8 taskId);\nstatic void PrintOakTextWithMainBgDarkened(const u8 *text, u8 delay);\nstatic u32 CopyOakOldManMonData(u8 monId, u8 *dst);\nstatic void SetOakOldManMonData(u8 monId);\nstatic void OakOldManDoMoveAnimation(void);\nstatic void HandleInputChooseAction(void);\nstatic void Task_StartSendOutAnim(u8 taskId);\n\nstatic void (*const sOakOldManBufferCommands[CONTROLLER_CMDS_COUNT])(void) =\n{\n    [CONTROLLER_GETMONDATA]               = OakOldManHandleGetMonData,\n    [CONTROLLER_GETRAWMONDATA]            = OakOldManHandleGetRawMonData,\n    [CONTROLLER_SETMONDATA]               = OakOldManHandleSetMonData,\n    [CONTROLLER_SETRAWMONDATA]            = OakOldManHandleSetRawMonData,\n    [CONTROLLER_LOADMONSPRITE]            = OakOldManHandleLoadMonSprite,\n    [CONTROLLER_SWITCHINANIM]             = OakOldManHandleSwitchInAnim,\n    [CONTROLLER_RETURNMONTOBALL]          = OakOldManHandleReturnMonToBall,\n    [CONTROLLER_DRAWTRAINERPIC]           = OakOldManHandleDrawTrainerPic,\n    [CONTROLLER_TRAINERSLIDE]             = OakOldManHandleTrainerSlide,\n    [CONTROLLER_TRAINERSLIDEBACK]         = OakOldManHandleTrainerSlideBack,\n    [CONTROLLER_FAINTANIMATION]           = OakOldManHandleFaintAnimation,\n    [CONTROLLER_PALETTEFADE]              = OakOldManHandlePaletteFade,\n    [CONTROLLER_SUCCESSBALLTHROWANIM]     = OakOldManHandleSuccessBallThrowAnim,\n    [CONTROLLER_BALLTHROWANIM]            = OakOldManHandleBallThrowAnim,\n    [CONTROLLER_PAUSE]                    = OakOldManHandlePause,\n    [CONTROLLER_MOVEANIMATION]            = OakOldManHandleMoveAnimation,\n    [CONTROLLER_PRINTSTRING]              = OakOldManHandlePrintString,\n    [CONTROLLER_PRINTSTRINGPLAYERONLY]    = OakOldManHandlePrintSelectionString,\n    [CONTROLLER_CHOOSEACTION]             = OakOldManHandleChooseAction,\n    [CONTROLLER_UNKNOWNYESNOBOX]          = OakOldManHandleUnknownYesNoBox,\n    [CONTROLLER_CHOOSEMOVE]               = OakOldManHandleChooseMove,\n    [CONTROLLER_OPENBAG]                  = OakOldManHandleChooseItem,\n    [CONTROLLER_CHOOSEPOKEMON]            = OakOldManHandleChoosePokemon,\n    [CONTROLLER_23]                       = OakOldManHandleCmd23,\n    [CONTROLLER_HEALTHBARUPDATE]          = OakOldManHandleHealthBarUpdate,\n    [CONTROLLER_EXPUPDATE]                = OakOldManHandleExpUpdate,\n    [CONTROLLER_STATUSICONUPDATE]         = OakOldManHandleStatusIconUpdate,\n    [CONTROLLER_STATUSANIMATION]          = OakOldManHandleStatusAnimation,\n    [CONTROLLER_STATUSXOR]                = OakOldManHandleStatusXor,\n    [CONTROLLER_DATATRANSFER]             = OakOldManHandleDataTransfer,\n    [CONTROLLER_DMA3TRANSFER]             = OakOldManHandleDMA3Transfer,\n    [CONTROLLER_PLAYBGM]                  = OakOldManHandlePlayBGM,\n    [CONTROLLER_32]                       = OakOldManHandleCmd32,\n    [CONTROLLER_TWORETURNVALUES]          = OakOldManHandleTwoReturnValues,\n    [CONTROLLER_CHOSENMONRETURNVALUE]     = OakOldManHandleChosenMonReturnValue,\n    [CONTROLLER_ONERETURNVALUE]           = OakOldManHandleOneReturnValue,\n    [CONTROLLER_ONERETURNVALUE_DUPLICATE] = OakOldManHandleOneReturnValue_Duplicate,\n    [CONTROLLER_CLEARUNKVAR]              = OakOldManHandleCmd37,\n    [CONTROLLER_SETUNKVAR]                = OakOldManHandleCmd38,\n    [CONTROLLER_CLEARUNKFLAG]             = OakOldManHandleCmd39,\n    [CONTROLLER_TOGGLEUNKFLAG]            = OakOldManHandleCmd40,\n    [CONTROLLER_HITANIMATION]             = OakOldManHandleHitAnimation,\n    [CONTROLLER_CANTSWITCH]               = OakOldManHandleCmd42,\n    [CONTROLLER_PLAYSE]                   = OakOldManHandlePlaySE,\n    [CONTROLLER_PLAYFANFARE]              = OakOldManHandlePlayFanfare,\n    [CONTROLLER_FAINTINGCRY]              = OakOldManHandleFaintingCry,\n    [CONTROLLER_INTROSLIDE]               = OakOldManHandleIntroSlide,\n    [CONTROLLER_INTROTRAINERBALLTHROW]    = OakOldManHandleIntroTrainerBallThrow,\n    [CONTROLLER_DRAWPARTYSTATUSSUMMARY]   = OakOldManHandleDrawPartyStatusSummary,\n    [CONTROLLER_HIDEPARTYSTATUSSUMMARY]   = OakOldManHandleHidePartyStatusSummary,\n    [CONTROLLER_ENDBOUNCE]                = OakOldManHandleEndBounceEffect,\n    [CONTROLLER_SPRITEINVISIBILITY]       = OakOldManHandleSpriteInvisibility,\n    [CONTROLLER_BATTLEANIMATION]          = OakOldManHandleBattleAnimation,\n    [CONTROLLER_LINKSTANDBYMSG]           = OakOldManHandleLinkStandbyMsg,\n    [CONTROLLER_RESETACTIONMOVESELECTION] = OakOldManHandleResetActionMoveSelection,\n    [CONTROLLER_ENDLINKBATTLE]            = OakOldManHandleCmd55,\n    [CONTROLLER_TERMINATOR_NOP]           = OakOldManCmdEnd,\n};\n\nstatic void OakOldManDummy(void)\n{\n}\n\nvoid SetControllerToOakOrOldMan(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = OakOldManBufferRunCommand;\n    gBattleStruct->simulatedInputState[0] = 0;\n    gBattleStruct->simulatedInputState[1] = 0;\n    gBattleStruct->simulatedInputState[2] = 0;\n    gBattleStruct->simulatedInputState[3] = 0;\n}\n\nstatic void OakOldManBufferRunCommand(void)\n{\n    if (gBattleControllerExecFlags & gBitTable[gActiveBattler])\n    {\n        if (gBattleBufferA[gActiveBattler][0] < NELEMS(sOakOldManBufferCommands))\n            sOakOldManBufferCommands[gBattleBufferA[gActiveBattler][0]]();\n        else\n            OakOldManBufferExecCompleted();\n    }\n}\n\nstatic void HandleInputChooseAction(void)\n{\n    // Like player, but specifically for Rival in Oak's Lab\n    u16 itemId = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n\n    DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1);\n    DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1);\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n\n        switch (gActionSelectionCursor[gActiveBattler])\n        {\n        case 0:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, 0);\n            break;\n        case 1:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0);\n            break;\n        case 2:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);\n            break;\n        case 3:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0);\n            break;\n        }\n        OakOldManBufferExecCompleted();\n    }\n    else if (JOY_NEW(DPAD_LEFT))\n    {\n        if (gActionSelectionCursor[gActiveBattler] & 1) // if is B_ACTION_USE_ITEM or B_ACTION_RUN\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] ^= 1;\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n    }\n    else if (JOY_NEW(DPAD_RIGHT))\n    {\n        if (!(gActionSelectionCursor[gActiveBattler] & 1)) // if is B_ACTION_USE_MOVE or B_ACTION_SWITCH\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] ^= 1;\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n    }\n    else if (JOY_NEW(DPAD_UP))\n    {\n        if (gActionSelectionCursor[gActiveBattler] & 2) // if is B_ACTION_SWITCH or B_ACTION_RUN\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] ^= 2;\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n    }\n    else if (JOY_NEW(DPAD_DOWN))\n    {\n        if (!(gActionSelectionCursor[gActiveBattler] & 2)) // if is B_ACTION_USE_MOVE or B_ACTION_USE_ITEM\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] ^= 2;\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n         && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT\n         && !(gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)])\n         && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n        {\n            if (gBattleBufferA[gActiveBattler][1] == B_ACTION_USE_ITEM)\n            {\n                // Add item to bag if it is a ball\n                if (itemId <= ITEM_PREMIER_BALL)\n                    AddBagItem(itemId, 1);\n                else\n                    return;\n            }\n            PlaySE(SE_SELECT);\n            BtlController_EmitTwoReturnValues(1, B_ACTION_CANCEL_PARTNER, 0);\n            OakOldManBufferExecCompleted();\n        }\n    }\n    else if (JOY_NEW(START_BUTTON))\n    {\n        SwapHpBarsWithHpText();\n    }\n}\n\nstatic void SimulateInputChooseAction(void)\n{\n    // Old Man\n    switch (gBattleStruct->simulatedInputState[0])\n    {\n    case 0:\n        gBattleStruct->simulatedInputState[2] = 64;\n        ++gBattleStruct->simulatedInputState[0];\n        // fall through\n    case 1:\n        if (--gBattleStruct->simulatedInputState[2] == 0)\n        {\n            // Move cursor to BAG\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(0);\n            ActionSelectionCreateCursorAt(1, 0);\n            gBattleStruct->simulatedInputState[2] = 64;\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 2:\n        if (--gBattleStruct->simulatedInputState[2] == 0)\n        {\n            // Open bag\n            PlaySE(SE_SELECT);\n            BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0);\n            OakOldManBufferExecCompleted();\n        }\n        break;\n    }\n}\n\nstatic void CompleteOnBattlerSpriteCallbackDummy(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        OakOldManBufferExecCompleted();\n}\n\nstatic void CompleteOnInactiveTextPrinter(void)\n{\n    if (!IsTextPrinterActive(0))\n        OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManSetBattleEndCallbacks(void)\n{\n    if (!gPaletteFade.active)\n    {\n        gMain.inBattle = FALSE;\n        gMain.callback1 = gPreBattleCallback1;\n        SetMainCallback2(gMain.savedCallback);\n    }\n}\n\nstatic void CompleteOnSpecialAnimDone(void)\n{\n    if (!gDoingBattleAnim)\n        OakOldManBufferExecCompleted();\n}\n\nvoid OakOldManHandleInputChooseMove(void)\n{\n    HandleInputChooseMove();\n    if (!(gBattleControllerExecFlags & gBitTable[gActiveBattler]))\n        OakOldManBufferExecCompleted();\n}\n\nstatic void OpenPartyMenuToChooseMon(void)\n{\n    if (!gPaletteFade.active)\n    {\n        u8 caseId;\n\n        gBattlerControllerFuncs[gActiveBattler] = WaitForMonSelection;\n        caseId = gTasks[gBattleControllerData[gActiveBattler]].data[0];\n        DestroyTask(gBattleControllerData[gActiveBattler]);\n        FreeAllWindowBuffers();\n        OpenPartyMenuInTutorialBattle(caseId);\n    }\n}\n\nstatic void WaitForMonSelection(void)\n{\n    if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)\n    {\n        if (gPartyMenuUseExitCallback == TRUE)\n            BtlController_EmitChosenMonReturnValue(1, gSelectedMonPartyId, gBattlePartyCurrentOrder);\n        else\n            BtlController_EmitChosenMonReturnValue(1, 6, NULL);\n        OakOldManBufferExecCompleted();\n    }\n}\n\nstatic void OpenBagAndChooseItem(void)\n{\n    if (!gPaletteFade.active)\n    {\n        gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChoseItem;\n        ReshowBattleScreenDummy();\n        FreeAllWindowBuffers();\n        if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n            CB2_BagMenuFromBattle();\n        else\n            InitOldManBag();\n    }\n}\n\nstatic void CompleteWhenChoseItem(void)\n{\n    if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)\n    {\n        if (!BtlCtrl_OakOldMan_TestState2Flag(FIRST_BATTLE_MSG_FLAG_HP_RESTORE)\n         && gSpecialVar_ItemId == ITEM_POTION\n         && gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n        {\n            BtlCtrl_OakOldMan_SetState2Flag(FIRST_BATTLE_MSG_FLAG_HP_RESTORE);\n            gBattlerControllerFuncs[gActiveBattler] = PrintOakText_KeepAnEyeOnHP;\n        }\n        else\n        {\n            BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId);\n            OakOldManBufferExecCompleted();\n        }\n    }\n}\n\nstatic void Intro_TryShinyAnimShowHealthbox(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim\n     && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)\n        TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim\n     && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)\n        TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]);\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)\n    {\n        if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n        {\n            DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]);\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK],\n                                     &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]],\n                                     HEALTHBOX_ALL);\n            StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK);\n            SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);\n        }\n        DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]);\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler],\n                                 &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]],\n                                 HEALTHBOX_ALL);\n        StartHealthboxSlideIn(gActiveBattler);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n        gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;\n        gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;\n    }\n}\n\nstatic void Intro_WaitForShinyAnimAndHealthbox(void)\n{\n    bool32 r4 = FALSE;\n\n    if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        r4 = TRUE;\n    if (r4\n     && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim\n     && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE;\n        FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n        FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n        CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10);\n        HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = PrintOakText_ForPetesSake;\n    }\n}\n\n#define tExpTask_monId      data[0]\n#define tExpTask_gainedExp  data[1]\n#define tExpTask_battler    data[2]\n#define tExpTask_frames     data[10]\n\nstatic void Task_GiveExpToMon(u8 taskId)\n{\n    u32 monId = (u8)gTasks[taskId].tExpTask_monId;\n    u8 battlerId = gTasks[taskId].tExpTask_battler;\n    s16 gainedExp = gTasks[taskId].tExpTask_gainedExp;\n\n    if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // Give exp without moving the expbar.\n    {\n        struct Pokemon *mon = &gPlayerParty[monId];\n        u16 species = GetMonData(mon, MON_DATA_SPECIES);\n        u8 level = GetMonData(mon, MON_DATA_LEVEL);\n        u32 currExp = GetMonData(mon, MON_DATA_EXP);\n        u32 nextLvlExp = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1];\n\n        if (currExp + gainedExp >= nextLvlExp)\n        {\n            u8 savedActiveBattler;\n\n            SetMonData(mon, MON_DATA_EXP, &nextLvlExp);\n            CalculateMonStats(mon, TRUE);\n            gainedExp -= nextLvlExp - currExp;\n            savedActiveBattler = gActiveBattler;\n            gActiveBattler = battlerId;\n            BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);\n            gActiveBattler = savedActiveBattler;\n            if (IsDoubleBattle() == TRUE\n             && ((u16)monId == gBattlerPartyIndexes[battlerId] || (u16)monId == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]))\n                gTasks[taskId].func = Task_LaunchLvlUpAnim;\n            else\n                gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter;\n        }\n        else\n        {\n            currExp += gainedExp;\n            SetMonData(mon, MON_DATA_EXP, &currExp);\n            gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter2;\n            DestroyTask(taskId);\n        }\n    }\n    else\n    {\n        gTasks[taskId].func = Task_PrepareToGiveExpWithExpBar;\n    }\n}\n\nstatic void Task_PrepareToGiveExpWithExpBar(u8 taskId)\n{\n    u8 monIndex = gTasks[taskId].tExpTask_monId;\n    s32 gainedExp = gTasks[taskId].tExpTask_gainedExp;\n    u8 battlerId = gTasks[taskId].tExpTask_battler;\n    struct Pokemon *mon = &gPlayerParty[monIndex];\n    u8 level = GetMonData(mon, MON_DATA_LEVEL);\n    u16 species = GetMonData(mon, MON_DATA_SPECIES);\n    u32 exp = GetMonData(mon, MON_DATA_EXP);\n    u32 currLvlExp = gExperienceTables[gSpeciesInfo[species].growthRate][level];\n    u32 expToNextLvl;\n\n    exp -= currLvlExp;\n    expToNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - currLvlExp;\n    SetBattleBarStruct(battlerId, gHealthboxSpriteIds[battlerId], expToNextLvl, exp, -gainedExp);\n    PlaySE(SE_EXP);\n    gTasks[taskId].func = Task_GiveExpWithExpBar;\n}\n\nstatic void Task_GiveExpWithExpBar(u8 taskId)\n{\n    if (gTasks[taskId].tExpTask_frames < 13)\n    {\n        ++gTasks[taskId].tExpTask_frames;\n    }\n    else\n    {\n        u8 monId = gTasks[taskId].tExpTask_monId;\n        s16 gainedExp = gTasks[taskId].tExpTask_gainedExp;\n        u8 battlerId = gTasks[taskId].tExpTask_battler;\n        s16 newExpPoints;\n\n        newExpPoints = MoveBattleBar(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[battlerId]);\n        if (newExpPoints == -1) // The bar has been filled with given exp points.\n        {\n            u8 level;\n            s32 currExp;\n            u16 species;\n            s32 expOnNextLvl;\n\n            m4aSongNumStop(SE_EXP);\n            level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);\n            currExp = GetMonData(&gPlayerParty[monId], MON_DATA_EXP);\n            species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);\n            expOnNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1];\n            if (currExp + gainedExp >= expOnNextLvl)\n            {\n                u8 savedActiveBattler;\n\n                SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl);\n                CalculateMonStats(&gPlayerParty[monId], TRUE);\n                gainedExp -= expOnNextLvl - currExp;\n                savedActiveBattler = gActiveBattler;\n                gActiveBattler = battlerId;\n                BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);\n                gActiveBattler = savedActiveBattler;\n                gTasks[taskId].func = Task_LaunchLvlUpAnim;\n            }\n            else\n            {\n                currExp += gainedExp;\n                SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp);\n                gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter2;\n                DestroyTask(taskId);\n            }\n        }\n    }\n}\n\nstatic void Task_LaunchLvlUpAnim(u8 taskId)\n{\n    u8 battlerId = gTasks[taskId].tExpTask_battler;\n    u8 monIndex = gTasks[taskId].tExpTask_monId;\n\n    if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])\n        battlerId ^= BIT_FLANK;\n    InitAndLaunchSpecialAnimation(battlerId, battlerId, battlerId, B_ANIM_LVL_UP);\n    gTasks[taskId].func = Task_UpdateLvlInHealthbox;\n}\n\nstatic void Task_UpdateLvlInHealthbox(u8 taskId)\n{\n    u8 battlerId = gTasks[taskId].tExpTask_battler;\n\n    if (!gBattleSpritesDataPtr->healthBoxesData[battlerId].specialAnimActive)\n    {\n        u8 monIndex = gTasks[taskId].tExpTask_monId;\n\n        GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL);  // Unused return value.\n        if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId ^ BIT_FLANK], &gPlayerParty[monIndex], HEALTHBOX_ALL);\n        else\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId], &gPlayerParty[monIndex], HEALTHBOX_ALL);\n        gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter;\n    }\n}\n\nstatic void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId)\n{\n    u8 monIndex = gTasks[taskId].tExpTask_monId;\n    u8 battlerId;\n\n    GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value\n    battlerId = gTasks[taskId].tExpTask_battler;\n    gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter2;\n    DestroyTask(taskId);\n}\n\nstatic void FreeMonSpriteAfterFaintAnim(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].y + gSprites[gBattlerSpriteIds[gActiveBattler]].y2 > DISPLAY_HEIGHT)\n    {\n        FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        OakOldManBufferExecCompleted();\n    }\n}\n\nstatic void PrintOakText_ForPetesSake(void)\n{\n    u32 mask;\n\n    switch (gBattleStruct->simulatedInputState[0])\n    {\n    case 0:\n        if (!gPaletteFade.active)\n        {\n            DoLoadHealthboxPalsForLevelUp(&gBattleStruct->simulatedInputState[1], &gBattleStruct->simulatedInputState[3], GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT));\n            BeginNormalPaletteFade(0xFFFFFF7E,\n                                   4,\n                                   0,\n                                   8,\n                                   RGB_BLACK);\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n        {\n            BtlCtrl_DrawVoiceoverMessageFrame();\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 2:\n        BattleStringExpandPlaceholdersToDisplayedString(gText_ForPetesSake);\n        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN);\n        ++gBattleStruct->simulatedInputState[0];\n        break;\n    case 3:\n        if (!IsTextPrinterActive(24))\n        {\n            mask = (gBitTable[gBattleStruct->simulatedInputState[1]] | gBitTable[gBattleStruct->simulatedInputState[3]]) << 16;\n            BeginNormalPaletteFade(mask,\n                                   4,\n                                   8,\n                                   0,\n                                   RGB_BLACK);\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 4:\n        if (!gPaletteFade.active)\n        {\n            BattleStringExpandPlaceholdersToDisplayedString(gText_TheTrainerThat);\n            BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN);\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 5:\n        if (!IsTextPrinterActive(24))\n        {\n            mask = (gBitTable[gBattleStruct->simulatedInputState[1]] | gBitTable[gBattleStruct->simulatedInputState[3]]) << 16;\n            BeginNormalPaletteFade(mask,\n                                   4,\n                                   0,\n                                   8,\n                                   RGB_BLACK);\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 6:\n        if (!gPaletteFade.active)\n        {\n            BattleStringExpandPlaceholdersToDisplayedString(gText_TryBattling);\n            BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN);\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 7:\n        if (!IsTextPrinterActive(24))\n        {\n            BeginNormalPaletteFade(0xFFFFFF7E,\n                                   4,\n                                   8,\n                                   0,\n                                   RGB_BLACK);\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 8:\n        if (!gPaletteFade.active)\n        {\n            DoFreeHealthboxPalsForLevelUp(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT));\n            BtlCtrl_RemoveVoiceoverMessageFrame();\n            gBattleStruct->simulatedInputState[0] = 0;\n            OakOldManBufferExecCompleted();\n        }\n        break;\n    }\n}\n\nvoid PrintOakText_InflictingDamageIsKey(void)\n{\n    PrintOakTextWithMainBgDarkened(gText_InflictingDamageIsKey, 1);\n}\n\nstatic void PrintOakText_LoweringStats(void)\n{\n    PrintOakTextWithMainBgDarkened(gText_LoweringStats, 64);\n}\n\nvoid PrintOakText_OakNoRunningFromATrainer(void)\n{\n    PrintOakTextWithMainBgDarkened(gText_OakNoRunningFromATrainer, 1);\n}\n\nstatic void PrintOakText_WinEarnsPrizeMoney(void)\n{\n    PrintOakTextWithMainBgDarkened(gText_WinEarnsPrizeMoney, 64);\n}\n\nvoid PrintOakText_HowDisappointing(void)\n{\n    PrintOakTextWithMainBgDarkened(gText_HowDissapointing, 64);\n}\n\nstatic void PrintOakTextWithMainBgDarkened(const u8 *text, u8 delay)\n{\n    // If delay is 0, it's treated as 256.\n    switch (gBattleStruct->simulatedInputState[0])\n    {\n    case 0:\n        if (!IsTextPrinterActive(0))\n        {\n            gBattleStruct->simulatedInputState[3] = delay;\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 1:\n        if (--gBattleStruct->simulatedInputState[3] == 0)\n        {\n            BeginNormalPaletteFade(0xFFFFFF7E,\n                                   4,\n                                   0,\n                                   8,\n                                   RGB_BLACK);\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            BtlCtrl_DrawVoiceoverMessageFrame();\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 3:\n        BattleStringExpandPlaceholdersToDisplayedString(text);\n        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN);\n        ++gBattleStruct->simulatedInputState[0];\n        break;\n    case 4:\n        if (!IsTextPrinterActive(24))\n        {\n            BeginNormalPaletteFade(0xFFFFFF7E,\n                                   4,\n                                   8,\n                                   0,\n                                   RGB_BLACK);\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 5:\n        if (!gPaletteFade.active)\n        {\n            BtlCtrl_RemoveVoiceoverMessageFrame();\n            if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n                OakOldManBufferExecCompleted();\n            else\n                OpponentBufferExecCompleted();\n            gBattleCommunication[MSG_DISPLAY] = 0;\n            gBattleStruct->simulatedInputState[0] = 0;\n        }\n        break;\n    }\n}\n\nstatic void PrintOakText_KeepAnEyeOnHP(void)\n{\n    u32 mask;\n\n    switch (gBattleStruct->simulatedInputState[0])\n    {\n    case 0:\n        if (!gPaletteFade.active)\n        {\n            DoLoadHealthboxPalsForLevelUp(&gBattleStruct->simulatedInputState[1], &gBattleStruct->simulatedInputState[3], gActiveBattler);\n            BeginNormalPaletteFade(0xFFFFFF7E,\n                                   4,\n                                   0,\n                                   8,\n                                   RGB_BLACK);\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n        {\n            mask = (gBitTable[gBattleStruct->simulatedInputState[1]] | gBitTable[gBattleStruct->simulatedInputState[3]]) << 16;\n            BeginNormalPaletteFade(mask,\n                                   4,\n                                   8,\n                                   0,\n                                   RGB_BLACK);\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            BtlCtrl_DrawVoiceoverMessageFrame();\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 3:\n        BattleStringExpandPlaceholdersToDisplayedString(gText_KeepAnEyeOnHP);\n        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN);\n        ++gBattleStruct->simulatedInputState[0];\n        break;\n    case 4:\n        if (!IsTextPrinterActive(24))\n        {\n            mask = (gBitTable[gBattleStruct->simulatedInputState[1]] | gBitTable[gBattleStruct->simulatedInputState[3]]) << 16;\n            BeginNormalPaletteFade(mask,\n                                   4,\n                                   0,\n                                   8,\n                                   RGB_BLACK);\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 5:\n        if (!gPaletteFade.active)\n        {\n            BeginNormalPaletteFade(0xFFFFFF7E,\n                                   4,\n                                   8,\n                                   0,\n                                   RGB_BLACK);\n            ++gBattleStruct->simulatedInputState[0];\n        }\n        break;\n    case 6:\n        if (!gPaletteFade.active)\n        {\n            BtlCtrl_RemoveVoiceoverMessageFrame();\n            BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId);\n            OakOldManBufferExecCompleted();\n            gBattleStruct->simulatedInputState[0] = 0;\n        }\n        break;\n    }\n}\n\nstatic void CompleteOnHealthbarDone(void)\n{\n    s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);\n\n    SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n    if (hpValue != -1)\n    {\n        UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);\n    }\n    else\n    {\n        HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n        OakOldManBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnInactiveTextPrinter2(void)\n{\n    if (!IsTextPrinterActive(0))\n        OakOldManBufferExecCompleted();\n}\n\nstatic void DoHitAnimBlinkSpriteEffect(void)\n{\n    u8 spriteId = gBattlerSpriteIds[gActiveBattler];\n\n    if (gSprites[spriteId].data[1] == 32)\n    {\n        gSprites[spriteId].data[1] = 0;\n        gSprites[spriteId].invisible = FALSE;\n        gDoingBattleAnim = FALSE;\n        OakOldManBufferExecCompleted();\n    }\n    else\n    {\n        if ((gSprites[spriteId].data[1] % 4) == 0)\n            gSprites[spriteId].invisible ^= 1;\n        ++gSprites[spriteId].data[1];\n    }\n}\n\nstatic void DoSwitchOutAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n    {\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        OakOldManBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnBattlerSpriteCallbackDummy2(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        OakOldManBufferExecCompleted();\n}\n\nstatic void CompleteOnFinishedBattleAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)\n        OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManBufferExecCompleted(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = OakOldManBufferRunCommand;\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        u8 playerId = GetMultiplayerId();\n\n        PrepareBufferDataTransferLink(2, 4, &playerId);\n        gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;\n    }\n    else\n    {\n        gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];\n    }\n}\n\nstatic void CompleteOnFinishedStatusAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)\n        OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleGetMonData(void)\n{\n    u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data\n    u32 size = 0;\n    u8 monToCheck;\n    s32 i;\n\n    if (gBattleBufferA[gActiveBattler][2] == 0)\n    {\n        size += CopyOakOldManMonData(gBattlerPartyIndexes[gActiveBattler], monData);\n    }\n    else\n    {\n        monToCheck = gBattleBufferA[gActiveBattler][2];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (monToCheck & 1)\n                size += CopyOakOldManMonData(i, monData + size);\n            monToCheck >>= 1;\n        }\n    }\n    BtlController_EmitDataTransfer(BUFFER_B, size, monData);\n    OakOldManBufferExecCompleted();\n}\n\nstatic u32 CopyOakOldManMonData(u8 monId, u8 *dst)\n{\n    struct BattlePokemon battleMon;\n    struct MovePpInfo moveData;\n    u8 nickname[20];\n    u8 *src;\n    s16 data16;\n    u32 data32;\n    s32 size = 0;\n\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case REQUEST_ALL_BATTLE:\n        battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);\n        battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM);\n        for (size = 0; size < MAX_MON_MOVES; ++size)\n        {\n            battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);\n            battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);\n        }\n        battleMon.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);\n        battleMon.friendship = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP);\n        battleMon.experience = GetMonData(&gPlayerParty[monId], MON_DATA_EXP);\n        battleMon.hpIV = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV);\n        battleMon.attackIV = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV);\n        battleMon.defenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV);\n        battleMon.speedIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV);\n        battleMon.spAttackIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV);\n        battleMon.spDefenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV);\n        battleMon.personality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY);\n        battleMon.status1 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS);\n        battleMon.level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);\n        battleMon.hp = GetMonData(&gPlayerParty[monId], MON_DATA_HP);\n        battleMon.maxHP = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP);\n        battleMon.attack = GetMonData(&gPlayerParty[monId], MON_DATA_ATK);\n        battleMon.defense = GetMonData(&gPlayerParty[monId], MON_DATA_DEF);\n        battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED);\n        battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK);\n        battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF);\n        battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG);\n        battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM);\n        battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID);\n        GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname);\n        StringCopy_Nickname(battleMon.nickname, nickname);\n        GetMonData(&gPlayerParty[monId], MON_DATA_OT_NAME, battleMon.otName);\n        src = (u8 *)&battleMon;\n        for (size = 0; size < sizeof(battleMon); ++size)\n            dst[size] = src[size];\n        break;\n    case REQUEST_SPECIES_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_HELDITEM_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_MOVES_PP_BATTLE:\n        for (size = 0; size < MAX_MON_MOVES; ++size)\n        {\n            moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);\n            moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);\n        }\n        moveData.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);\n        src = (u8 *)(&moveData);\n        for (size = 0; size < sizeof(moveData); ++size)\n            dst[size] = src[size];\n        break;\n    case REQUEST_MOVE1_BATTLE:\n    case REQUEST_MOVE2_BATTLE:\n    case REQUEST_MOVE3_BATTLE:\n    case REQUEST_MOVE4_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_PP_DATA_BATTLE:\n        for (size = 0; size < MAX_MON_MOVES; ++size)\n            dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);\n        dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);\n        ++size;\n        break;\n    case REQUEST_PPMOVE1_BATTLE:\n    case REQUEST_PPMOVE2_BATTLE:\n    case REQUEST_PPMOVE3_BATTLE:\n    case REQUEST_PPMOVE4_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);\n        size = 1;\n        break;\n    case REQUEST_OTID_BATTLE:\n        data32 = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        size = 3;\n        break;\n    case REQUEST_EXP_BATTLE:\n        data32 = GetMonData(&gPlayerParty[monId], MON_DATA_EXP);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        size = 3;\n        break;\n    case REQUEST_HP_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_EV);\n        size = 1;\n        break;\n    case REQUEST_ATK_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV);\n        size = 1;\n        break;\n    case REQUEST_DEF_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV);\n        size = 1;\n        break;\n    case REQUEST_SPEED_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV);\n        size = 1;\n        break;\n    case REQUEST_SPATK_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV);\n        size = 1;\n        break;\n    case REQUEST_SPDEF_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV);\n        size = 1;\n        break;\n    case REQUEST_FRIENDSHIP_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP);\n        size = 1;\n        break;\n    case REQUEST_POKERUS_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKERUS);\n        size = 1;\n        break;\n    case REQUEST_MET_LOCATION_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION);\n        size = 1;\n        break;\n    case REQUEST_MET_LEVEL_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL);\n        size = 1;\n        break;\n    case REQUEST_MET_GAME_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME);\n        size = 1;\n        break;\n    case REQUEST_POKEBALL_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL);\n        size = 1;\n        break;\n    case REQUEST_ALL_IVS_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV);\n        dst[1] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV);\n        dst[2] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV);\n        dst[3] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV);\n        dst[4] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV);\n        dst[5] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV);\n        size = 6;\n        break;\n    case REQUEST_HP_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV);\n        size = 1;\n        break;\n    case REQUEST_ATK_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV);\n        size = 1;\n        break;\n    case REQUEST_DEF_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV);\n        size = 1;\n        break;\n    case REQUEST_SPEED_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV);\n        size = 1;\n        break;\n    case REQUEST_SPATK_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV);\n        size = 1;\n        break;\n    case REQUEST_SPDEF_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV);\n        size = 1;\n        break;\n    case REQUEST_PERSONALITY_BATTLE:\n        data32 = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        dst[3] = (data32 & 0xFF000000) >> 24;\n        size = 4;\n        break;\n    case REQUEST_CHECKSUM_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_STATUS_BATTLE:\n        data32 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        dst[3] = (data32 & 0xFF000000) >> 24;\n        size = 4;\n        break;\n    case REQUEST_LEVEL_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);\n        size = 1;\n        break;\n    case REQUEST_HP_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HP);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_MAX_HP_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_ATK_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_ATK);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_DEF_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_DEF);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPEED_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPATK_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPDEF_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_COOL_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL);\n        size = 1;\n        break;\n    case REQUEST_BEAUTY_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY);\n        size = 1;\n        break;\n    case REQUEST_CUTE_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE);\n        size = 1;\n        break;\n    case REQUEST_SMART_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART);\n        size = 1;\n        break;\n    case REQUEST_TOUGH_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH);\n        size = 1;\n        break;\n    case REQUEST_SHEEN_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SHEEN);\n        size = 1;\n        break;\n    case REQUEST_COOL_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_BEAUTY_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_CUTE_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_SMART_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_TOUGH_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON);\n        size = 1;\n        break;\n    }\n    return size;\n}\n\nstatic void OakOldManHandleGetRawMonData(void)\n{\n    PlayerHandleGetRawMonData();\n}\n\nstatic void OakOldManHandleSetMonData(void)\n{\n    u8 monToCheck;\n    u32 i;\n\n    if (gBattleBufferA[gActiveBattler][2] == 0)\n    {\n        SetOakOldManMonData(gBattlerPartyIndexes[gActiveBattler]);\n    }\n    else\n    {\n        monToCheck = gBattleBufferA[gActiveBattler][2];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (monToCheck & 1)\n                SetOakOldManMonData(i);\n            monToCheck >>= 1;\n        }\n    }\n    OakOldManBufferExecCompleted();\n}\n\nstatic void SetOakOldManMonData(u8 monId)\n{\n    struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];\n    struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];\n    s32 i;\n\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case REQUEST_ALL_BATTLE:\n        {\n            u8 iv;\n\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species);\n            SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);\n            for (i = 0; i < MAX_MON_MOVES; ++i)\n            {\n                SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);\n                SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);\n            }\n            SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses);\n            SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship);\n            SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &battlePokemon->experience);\n            iv = battlePokemon->hpIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &iv);\n            iv = battlePokemon->attackIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &iv);\n            iv = battlePokemon->defenseIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &iv);\n            iv = battlePokemon->speedIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &iv);\n            iv = battlePokemon->spAttackIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &iv);\n            iv = battlePokemon->spDefenseIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &iv);\n            SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality);\n            SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &battlePokemon->status1);\n            SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &battlePokemon->level);\n            SetMonData(&gPlayerParty[monId], MON_DATA_HP, &battlePokemon->hp);\n            SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP);\n            SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &battlePokemon->attack);\n            SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &battlePokemon->defense);\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &battlePokemon->speed);\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack);\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense);\n        }\n        break;\n    case REQUEST_SPECIES_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HELDITEM_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MOVES_PP_BATTLE:\n        for (i = 0; i < MAX_MON_MOVES; ++i)\n        {\n            SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);\n            SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);\n        }\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses);\n        break;\n    case REQUEST_MOVE1_BATTLE:\n    case REQUEST_MOVE2_BATTLE:\n    case REQUEST_MOVE3_BATTLE:\n    case REQUEST_MOVE4_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_PP_DATA_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);\n        break;\n    case REQUEST_PPMOVE1_BATTLE:\n    case REQUEST_PPMOVE2_BATTLE:\n    case REQUEST_PPMOVE3_BATTLE:\n    case REQUEST_PPMOVE4_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_OTID_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_EXP_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HP_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_FRIENDSHIP_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_POKERUS_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_LOCATION_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_LEVEL_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_GAME_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_POKEBALL_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ALL_IVS_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);\n        break;\n    case REQUEST_HP_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_PERSONALITY_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CHECKSUM_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_STATUS_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_LEVEL_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HP_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MAX_HP_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_COOL_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_BEAUTY_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CUTE_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SMART_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_TOUGH_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SHEEN_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_COOL_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_BEAUTY_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CUTE_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SMART_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_TOUGH_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    }\n    HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n}\n\nstatic void OakOldManHandleSetRawMonData(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleLoadMonSprite(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleSwitchInAnim(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleReturnMonToBall(void)\n{\n    if (gBattleBufferA[gActiveBattler][1] == 0)\n    {\n        InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON);\n        gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;\n    }\n    else\n    {\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        OakOldManBufferExecCompleted();\n    }\n}\n\nstatic void OakOldManHandleDrawTrainerPic(void)\n{\n    if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n    {\n        DecompressTrainerBackPalette(gSaveBlock2Ptr->playerGender, gActiveBattler);\n        SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(gActiveBattler));\n        gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                         80,\n                                                         (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].size) * 4 + 80,\n                                                         30);\n    }\n    else\n    {\n        DecompressTrainerBackPalette(TRAINER_BACK_PIC_OLD_MAN, gActiveBattler);\n        SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_OLD_MAN, GetBattlerPosition(gActiveBattler));\n        gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                         80,\n                                                         (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_OLD_MAN].size) * 4 + 80,\n                                                         30);\n    }\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;\n    if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -240;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn;\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;\n}\n\nstatic void OakOldManHandleTrainerSlide(void)\n{\n    if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n    {\n        DecompressTrainerBackPalette(gSaveBlock2Ptr->playerGender, gActiveBattler);\n        SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(gActiveBattler));\n        gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                         80,\n                                                         (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].size) * 4 + 80,\n                                                         30);\n    }\n    else\n    {\n        DecompressTrainerBackPalette(TRAINER_BACK_PIC_OLD_MAN, gActiveBattler);\n        SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_OLD_MAN, GetBattlerPosition(gActiveBattler));\n        gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                         80,\n                                                         (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_OLD_MAN].size) * 4 + 80,\n                                                         30);\n    }\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -96;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn;\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy2;\n}\n\nstatic void OakOldManHandleTrainerSlideBack(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleFaintAnimation(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0)\n    {\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState;\n    }\n    else\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n            PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER);\n            gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;\n            gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5;\n            gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim;\n            gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim;\n        }\n    }\n}\n\nstatic void OakOldManHandlePaletteFade(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleSuccessBallThrowAnim(void)\n{\n    gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;\n    gDoingBattleAnim = TRUE;\n    InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;\n}\n\nstatic void OakOldManHandleBallThrowAnim(void)\n{\n    u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1];\n\n    gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;\n    gDoingBattleAnim = TRUE;\n    InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;\n}\n\nstatic void OakOldManHandlePause(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleMoveAnimation(void)\n{\n    u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);\n\n    gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];\n    gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);\n    gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);\n    gAnimFriendship = gBattleBufferA[gActiveBattler][10];\n    gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);\n    gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];\n    gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;\n    if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE\n    {\n        OakOldManBufferExecCompleted();\n    }\n    else\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n        gBattlerControllerFuncs[gActiveBattler] = OakOldManDoMoveAnimation;\n    }\n}\n\nstatic void OakOldManDoMoveAnimation(void)\n{\n    u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);\n\n    switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)\n    {\n    case 0:\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;\n        break;\n    case 1:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF);\n            DoMoveAnim(move);\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;\n        }\n        break;\n    case 2:\n        gAnimScriptCallback();\n        if (!gAnimScriptActive)\n        {\n            SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL);\n            if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n                InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;\n        }\n        break;\n    case 3:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            CopyAllBattleSpritesInvisibilities();\n            TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            OakOldManBufferExecCompleted();\n        }\n        break;\n    }\n}\n\nstatic void OakOldManHandlePrintString(void)\n{\n    u16 *stringId;\n\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]);\n    if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && *stringId == 1)\n    {\n        OakOldManBufferExecCompleted();\n    }\n    else\n    {\n        BufferStringBattle(*stringId);\n        if (BattleStringShouldBeColored(*stringId))\n            BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT));\n        else\n            BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n        if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n        {\n            switch (*stringId)\n            {\n            case STRINGID_DEFENDERSSTATFELL:\n                if (!BtlCtrl_OakOldMan_TestState2Flag(FIRST_BATTLE_MSG_FLAG_STAT_CHG))\n                {\n                    BtlCtrl_OakOldMan_SetState2Flag(FIRST_BATTLE_MSG_FLAG_STAT_CHG);\n                    gBattlerControllerFuncs[gActiveBattler] = PrintOakText_LoweringStats;\n                    return;\n                }\n                break;\n            case STRINGID_PLAYERGOTMONEY:\n                gBattlerControllerFuncs[gActiveBattler] = PrintOakText_WinEarnsPrizeMoney;\n                return;\n            case STRINGID_TRAINER1WINTEXT:\n                gBattlerControllerFuncs[gActiveBattler] = PrintOakText_HowDisappointing;\n                return;\n            case STRINGID_DONTLEAVEBIRCH:\n                gBattlerControllerFuncs[gActiveBattler] = PrintOakText_OakNoRunningFromATrainer;\n                return;\n            }\n        }\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;\n    }\n}\n\nstatic void OakOldManHandlePrintSelectionString(void)\n{\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        OakOldManHandlePrintString();\n    else\n        OakOldManBufferExecCompleted();\n}\n\nstatic void HandleChooseActionAfterDma3(void)\n{\n    if (!IsDma3ManagerBusyWithBgCopy())\n    {\n        gBattle_BG0_X = 0;\n        gBattle_BG0_Y = 160;\n        if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n            gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction;\n        else\n            gBattlerControllerFuncs[gActiveBattler] = SimulateInputChooseAction;\n    }\n}\n\nstatic void OakOldManHandleChooseAction(void)\n{\n    s32 i;\n\n    gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3;\n    BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG);\n    BattlePutTextOnWindow(gText_BattleMenu, B_WIN_ACTION_MENU);\n    for (i = 0; i < MAX_MON_MOVES; ++i)\n        ActionSelectionDestroyCursorAt((u8)i);\n    ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n    if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n        BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo);\n    else\n        BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillOldManDo);\n    BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_ACTION_PROMPT);\n}\n\nstatic void OakOldManHandleUnknownYesNoBox(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakHandleChooseMove_WaitDma3(void)\n{\n    if (!IsDma3ManagerBusyWithBgCopy())\n    {\n        gBattle_BG0_X = 0;\n        gBattle_BG0_Y = 320;\n        gBattlerControllerFuncs[gActiveBattler] = OakOldManHandleInputChooseMove;\n    }\n}\n\nstatic void OakOldManHandleChooseMove(void)\n{\n    if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n    {\n        InitMoveSelectionsVarsAndStrings();\n        gBattlerControllerFuncs[gActiveBattler] = OakHandleChooseMove_WaitDma3;\n    }\n    else\n    {\n        switch (gBattleStruct->simulatedInputState[1])\n        {\n        case 0:\n            InitMoveSelectionsVarsAndStrings();\n            ++gBattleStruct->simulatedInputState[1];\n            gBattleStruct->simulatedInputState[3] = 80;\n            // fall through\n        case 1:\n            if (--gBattleStruct->simulatedInputState[3] == 0)\n            {\n                PlaySE(SE_SELECT);\n                BtlController_EmitTwoReturnValues(1, 10, 0x100);\n                OakOldManBufferExecCompleted();\n            }\n            break;\n        }\n    }\n}\n\nstatic void OakOldManHandleChooseItem(void)\n{\n    s32 i;\n\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n    gBattlerControllerFuncs[gActiveBattler] = OpenBagAndChooseItem;\n    gBattlerInMenuId = gActiveBattler;\n    for (i = 0; i < 3; ++i)\n        gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][i + 1];\n}\n\nstatic void OakOldManHandleChoosePokemon(void)\n{\n    s32 i;\n\n    gBattleControllerData[gActiveBattler] = CreateTask(TaskDummy, 0xFF);\n    gTasks[gBattleControllerData[gActiveBattler]].data[0] = gBattleBufferA[gActiveBattler][1] & 0xF;\n    *(&gBattleStruct->battlerPreventingSwitchout) = gBattleBufferA[gActiveBattler][1] >> 4;\n    *(&gBattleStruct->playerPartyIdx) = gBattleBufferA[gActiveBattler][2];\n    *(&gBattleStruct->abilityPreventingSwitchout) = gBattleBufferA[gActiveBattler][3];\n    for (i = 0; i < 3; ++i)\n        gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][4 + i];\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n    gBattlerControllerFuncs[gActiveBattler] = OpenPartyMenuToChooseMon;\n    gBattlerInMenuId = gActiveBattler;\n}\n\nstatic void OakOldManHandleCmd23(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleHealthBarUpdate(void)\n{\n    s16 hpVal;\n\n    LoadBattleBarGfx(0);\n    hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n    if (hpVal != INSTANT_HP_BAR_DROP)\n    {\n        u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);\n        u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);\n\n        SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);\n    }\n    else\n    {\n        u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);\n\n        SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);\n        UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], 0, HP_CURRENT);\n    }\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;\n}\n\nstatic void OakOldManHandleExpUpdate(void)\n{\n    u8 monId = gBattleBufferA[gActiveBattler][1];\n\n    if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_LEVEL)\n    {\n        OakOldManBufferExecCompleted();\n    }\n    else\n    {\n        s16 expPointsToGive;\n        u8 taskId;\n\n        LoadBattleBarGfx(1);\n        GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);  // Unused return value.\n        expPointsToGive = T1_READ_16(&gBattleBufferA[gActiveBattler][2]);\n        taskId = CreateTask(Task_GiveExpToMon, 10);\n        gTasks[taskId].tExpTask_monId = monId;\n        gTasks[taskId].tExpTask_gainedExp = expPointsToGive;\n        gTasks[taskId].tExpTask_battler = gActiveBattler;\n        gBattlerControllerFuncs[gActiveBattler] = OakOldManDummy;\n    }\n}\n\nstatic void OakOldManHandleStatusIconUpdate(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleStatusAnimation(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleStatusXor(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleDataTransfer(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleDMA3Transfer(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandlePlayBGM(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleCmd32(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleTwoReturnValues(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleChosenMonReturnValue(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleOneReturnValue(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleOneReturnValue_Duplicate(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleCmd37(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleCmd38(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleCmd39(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleCmd40(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleHitAnimation(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)\n    {\n        OakOldManBufferExecCompleted();\n    }\n    else\n    {\n        gDoingBattleAnim = TRUE;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;\n        DoHitAnimHealthboxEffect(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;\n    }\n}\n\nstatic void OakOldManHandleCmd42(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandlePlaySE(void)\n{\n    PlaySE(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandlePlayFanfare(void)\n{\n    PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleFaintingCry(void)\n{\n    u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);\n\n    PlayCry_Normal(species, 25);\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleIntroSlide(void)\n{\n    HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);\n    gIntroSlideFlags |= 1;\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleIntroTrainerBallThrow(void)\n{\n    u8 paletteNum;\n    u8 taskId;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n    {\n        SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;\n        StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite);\n        StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);\n        paletteNum = AllocSpritePalette(0xD6F8);\n        LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2Ptr->playerGender].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP);\n        gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum;\n        taskId = CreateTask(Task_StartSendOutAnim, 5);\n        gTasks[taskId].data[0] = gActiveBattler;\n        if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)\n            gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;\n        gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;\n        gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy;\n    }\n    else\n    {\n        if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)\n            gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;\n        OakOldManBufferExecCompleted();\n    }\n}\n\nstatic void StartSendOutAnim(u8 battlerId)\n{\n    u16 species;\n\n    gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = SPECIES_NONE;\n    gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];\n    species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n    gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim);\n    SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));\n    gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2),\n                                                GetBattlerSpriteDefault_Y(battlerId),\n                                                GetBattlerSpriteSubpriority(battlerId));\n    gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId];\n    gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;\n    gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;\n    gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);\n    gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;\n    gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;\n    gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT);\n}\n\nstatic void Task_StartSendOutAnim(u8 taskId)\n{\n    if (gTasks[taskId].data[1] < 31)\n    {\n        ++gTasks[taskId].data[1];\n    }\n    else\n    {\n        u8 savedActiveBattler = gActiveBattler;\n\n        gActiveBattler = gTasks[taskId].data[0];\n        gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n        StartSendOutAnim(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox;\n        gActiveBattler = savedActiveBattler;\n        DestroyTask(taskId);\n    }\n}\n\nstatic void OakOldManHandleDrawPartyStatusSummary(void)\n{\n    if (gBattleBufferA[gActiveBattler][1] != 0\n     && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n    {\n        OakOldManBufferExecCompleted();\n    }\n    else\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = TRUE;\n        gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler,\n                                                                                      (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4],\n                                                                                      gBattleBufferA[gActiveBattler][1],\n                                                                                      gBattleBufferA[gActiveBattler][2]);\n        OakOldManBufferExecCompleted();\n    }\n}\n\nstatic void OakOldManHandleHidePartyStatusSummary(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleEndBounceEffect(void)\n{\n    EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX);\n    EndBounceEffect(gActiveBattler, BOUNCE_MON);\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleSpriteInvisibility(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleBattleAnimation(void)\n{\n    u8 animationId = gBattleBufferA[gActiveBattler][1];\n    u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n\n    if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))\n        OakOldManBufferExecCompleted();\n    else\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;\n}\n\nstatic void OakOldManHandleLinkStandbyMsg(void)\n{\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case 0:\n    case 1:\n        EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX);\n        EndBounceEffect(gActiveBattler, BOUNCE_MON);\n        break;\n    case 2:\n        break;\n    }\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleResetActionMoveSelection(void)\n{\n    OakOldManBufferExecCompleted();\n}\n\nstatic void OakOldManHandleCmd55(void)\n{\n    gBattleOutcome = gBattleBufferA[gActiveBattler][1];\n    FadeOutMapMusic(5);\n    BeginFastPaletteFade(3);\n    OakOldManBufferExecCompleted();\n    if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) && gBattleTypeFlags & BATTLE_TYPE_LINK)\n        gBattlerControllerFuncs[gActiveBattler] = OakOldManSetBattleEndCallbacks;\n}\n\nstatic void OakOldManCmdEnd(void)\n{\n}\n\nbool8 BtlCtrl_OakOldMan_TestState2Flag(u8 mask)\n{\n    return gBattleStruct->simulatedInputState[2] & mask;\n}\n\nvoid BtlCtrl_OakOldMan_SetState2Flag(u8 mask)\n{\n    gBattleStruct->simulatedInputState[2] |= mask;\n}\n\nvoid BtlCtrl_DrawVoiceoverMessageFrame(void)\n{\n    u32 width = 0x1A;\n    u32 pal = 7;\n\n    FillBgTilemapBufferRect(0, 0x30,                 0,    0xE,  1,     1, pal);\n    FillBgTilemapBufferRect(0, 0x31,                 1,    0xE,  1,     1, pal);\n    FillBgTilemapBufferRect(0, 0x32,                 2,    0xE,  width, 1, pal);\n    FillBgTilemapBufferRect(0, 0x33,                 0x1C, 0xE,  1,     1, pal);\n    FillBgTilemapBufferRect(0, 0x34,                 0x1D, 0xE,  1,     1, pal);\n    FillBgTilemapBufferRect(0, 0x35,                 0,    0xF,  1,     1, pal);\n    FillBgTilemapBufferRect(0, 0x36,                 1,    0xF,  1,     1, pal);\n    FillBgTilemapBufferRect(0, 0x38,                 0x1C, 0xF,  1,     1, pal);\n    FillBgTilemapBufferRect(0, 0x39,                 0x1D, 0xF,  1,     1, pal);\n    FillBgTilemapBufferRect(0, 0x3A,                 0,    0x10, 1,     1, pal);\n    FillBgTilemapBufferRect(0, 0x3B,                 1,    0x10, 1,     1, pal);\n    FillBgTilemapBufferRect(0, 0x3C,                 0x1C, 0x10, 1,     1, pal);\n    FillBgTilemapBufferRect(0, 0x3D,                 0x1D, 0x10, 1,     1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x3A), 0,    0x11, 1,     1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x3B), 1,    0x11, 1,     1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x3C), 0x1C, 0x11, 1,     1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x3D), 0x1D, 0x11, 1,     1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x35), 0,    0x12, 1,     1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x36), 1,    0x12, 1,     1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x38), 0x1C, 0x12, 1,     1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x39), 0x1D, 0x12, 1,     1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x30), 0,    0x13, 1,     1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x31), 1,    0x13, 1,     1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x32), 2,    0x13, width, 1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x33), 0x1C, 0x13, 1,     1, pal);\n    FillBgTilemapBufferRect(0, BG_TILE_V_FLIP(0x34), 0x1D, 0x13, 1,     1, pal);\n}\n\nvoid BtlCtrl_RemoveVoiceoverMessageFrame(void)\n{\n    u32 pal = 0;\n    u32 width = 0x1A;\n    u32 height;\n\n    FillBgTilemapBufferRect(0, 3,    0,    0xE,  1,     1,      pal);\n    height = 4;\n    FillBgTilemapBufferRect(0, 4,    1,    0xE,  1,     1,      pal);\n    FillBgTilemapBufferRect(0, 5,    2,    0xE,  width, 1,      pal);\n    FillBgTilemapBufferRect(0, 6,    0x1C, 0xE,  1,     1,      pal);\n    FillBgTilemapBufferRect(0, 7,    0x1D, 0xE,  1,     1,      pal);\n    FillBgTilemapBufferRect(0, 8,    0,    0xF,  1,     height, pal);\n    FillBgTilemapBufferRect(0, 9,    1,    0xF,  1,     height, pal);\n    FillBgTilemapBufferRect(0, 0xA,  2,    0xF,  width, height, pal);\n    FillBgTilemapBufferRect(0, 0xB,  0x1C, 0xF,  1,     height, pal);\n    FillBgTilemapBufferRect(0, 0xC,  0x1D, 0xF,  1,     height, pal);\n    FillBgTilemapBufferRect(0, 0xD,  0,    0x13, 1,     1,      pal);\n    FillBgTilemapBufferRect(0, 0xE,  1,    0x13, 1,     1,      pal);\n    FillBgTilemapBufferRect(0, 0xF,  2,    0x13, width, 1,      pal);\n    FillBgTilemapBufferRect(0, 0x10, 0x1C, 0x13, 1,     1,      pal);\n    FillBgTilemapBufferRect(0, 0x11, 0x1D, 0x13, 1,     1,      pal);\n}\n"
  },
  {
    "path": "src/battle_controller_opponent.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"m4a.h\"\n#include \"task.h\"\n#include \"util.h\"\n#include \"pokeball.h\"\n#include \"random.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_controllers.h\"\n#include \"battle_message.h\"\n#include \"battle_interface.h\"\n#include \"battle_tower.h\"\n#include \"battle_gfx_sfx_util.h\"\n#include \"battle_ai_script_commands.h\"\n#include \"battle_ai_switch_items.h\"\n#include \"event_data.h\"\n#include \"trainer_tower.h\"\n#include \"constants/battle_anim.h\"\n#include \"constants/moves.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n\nstatic void OpponentHandleGetMonData(void);\nstatic void OpponentHandleGetRawMonData(void);\nstatic void OpponentHandleSetMonData(void);\nstatic void OpponentHandleSetRawMonData(void);\nstatic void OpponentHandleLoadMonSprite(void);\nstatic void OpponentHandleSwitchInAnim(void);\nstatic void OpponentHandleReturnMonToBall(void);\nstatic void OpponentHandleDrawTrainerPic(void);\nstatic void OpponentHandleTrainerSlide(void);\nstatic void OpponentHandleTrainerSlideBack(void);\nstatic void OpponentHandleFaintAnimation(void);\nstatic void OpponentHandlePaletteFade(void);\nstatic void OpponentHandleSuccessBallThrowAnim(void);\nstatic void OpponentHandleBallThrowAnim(void);\nstatic void OpponentHandlePause(void);\nstatic void OpponentHandleMoveAnimation(void);\nstatic void OpponentHandlePrintString(void);\nstatic void OpponentHandlePrintSelectionString(void);\nstatic void OpponentHandleChooseAction(void);\nstatic void OpponentHandleUnknownYesNoBox(void);\nstatic void OpponentHandleChooseMove(void);\nstatic void OpponentHandleChooseItem(void);\nstatic void OpponentHandleChoosePokemon(void);\nstatic void OpponentHandleCmd23(void);\nstatic void OpponentHandleHealthBarUpdate(void);\nstatic void OpponentHandleExpUpdate(void);\nstatic void OpponentHandleStatusIconUpdate(void);\nstatic void OpponentHandleStatusAnimation(void);\nstatic void OpponentHandleStatusXor(void);\nstatic void OpponentHandleDataTransfer(void);\nstatic void OpponentHandleDMA3Transfer(void);\nstatic void OpponentHandlePlayBGM(void);\nstatic void OpponentHandleCmd32(void);\nstatic void OpponentHandleTwoReturnValues(void);\nstatic void OpponentHandleChosenMonReturnValue(void);\nstatic void OpponentHandleOneReturnValue(void);\nstatic void OpponentHandleOneReturnValue_Duplicate(void);\nstatic void OpponentHandleCmd37(void);\nstatic void OpponentHandleCmd38(void);\nstatic void OpponentHandleCmd39(void);\nstatic void OpponentHandleCmd40(void);\nstatic void OpponentHandleHitAnimation(void);\nstatic void OpponentHandleCmd42(void);\nstatic void OpponentHandlePlaySE(void);\nstatic void OpponentHandlePlayFanfare(void);\nstatic void OpponentHandleFaintingCry(void);\nstatic void OpponentHandleIntroSlide(void);\nstatic void OpponentHandleIntroTrainerBallThrow(void);\nstatic void OpponentHandleDrawPartyStatusSummary(void);\nstatic void OpponentHandleHidePartyStatusSummary(void);\nstatic void OpponentHandleEndBounceEffect(void);\nstatic void OpponentHandleSpriteInvisibility(void);\nstatic void OpponentHandleBattleAnimation(void);\nstatic void OpponentHandleLinkStandbyMsg(void);\nstatic void OpponentHandleResetActionMoveSelection(void);\nstatic void OpponentHandleCmd55(void);\nstatic void OpponentCmdEnd(void);\n\nstatic void OpponentBufferRunCommand(void);\nstatic u32 GetOpponentMonData(u8 monId, u8 *dst);\nstatic void SetOpponentMonData(u8 monId);\nstatic void DoSwitchOutAnimation(void);\nstatic void OpponentDoMoveAnimation(void);\nstatic void SwitchIn_HandleSoundAndEnd(void);\nstatic void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit);\nstatic void Task_StartSendOutAnim(u8 taskId);\nstatic void SpriteCB_FreeOpponentSprite(struct Sprite *sprite);\nstatic void EndDrawPartyStatusSummary(void);\n\nstatic void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) =\n{\n    [CONTROLLER_GETMONDATA]               = OpponentHandleGetMonData,\n    [CONTROLLER_GETRAWMONDATA]            = OpponentHandleGetRawMonData,\n    [CONTROLLER_SETMONDATA]               = OpponentHandleSetMonData,\n    [CONTROLLER_SETRAWMONDATA]            = OpponentHandleSetRawMonData,\n    [CONTROLLER_LOADMONSPRITE]            = OpponentHandleLoadMonSprite,\n    [CONTROLLER_SWITCHINANIM]             = OpponentHandleSwitchInAnim,\n    [CONTROLLER_RETURNMONTOBALL]          = OpponentHandleReturnMonToBall,\n    [CONTROLLER_DRAWTRAINERPIC]           = OpponentHandleDrawTrainerPic,\n    [CONTROLLER_TRAINERSLIDE]             = OpponentHandleTrainerSlide,\n    [CONTROLLER_TRAINERSLIDEBACK]         = OpponentHandleTrainerSlideBack,\n    [CONTROLLER_FAINTANIMATION]           = OpponentHandleFaintAnimation,\n    [CONTROLLER_PALETTEFADE]              = OpponentHandlePaletteFade,\n    [CONTROLLER_SUCCESSBALLTHROWANIM]     = OpponentHandleSuccessBallThrowAnim,\n    [CONTROLLER_BALLTHROWANIM]            = OpponentHandleBallThrowAnim,\n    [CONTROLLER_PAUSE]                    = OpponentHandlePause,\n    [CONTROLLER_MOVEANIMATION]            = OpponentHandleMoveAnimation,\n    [CONTROLLER_PRINTSTRING]              = OpponentHandlePrintString,\n    [CONTROLLER_PRINTSTRINGPLAYERONLY]    = OpponentHandlePrintSelectionString,\n    [CONTROLLER_CHOOSEACTION]             = OpponentHandleChooseAction,\n    [CONTROLLER_UNKNOWNYESNOBOX]          = OpponentHandleUnknownYesNoBox,\n    [CONTROLLER_CHOOSEMOVE]               = OpponentHandleChooseMove,\n    [CONTROLLER_OPENBAG]                  = OpponentHandleChooseItem,\n    [CONTROLLER_CHOOSEPOKEMON]            = OpponentHandleChoosePokemon,\n    [CONTROLLER_23]                       = OpponentHandleCmd23,\n    [CONTROLLER_HEALTHBARUPDATE]          = OpponentHandleHealthBarUpdate,\n    [CONTROLLER_EXPUPDATE]                = OpponentHandleExpUpdate,\n    [CONTROLLER_STATUSICONUPDATE]         = OpponentHandleStatusIconUpdate,\n    [CONTROLLER_STATUSANIMATION]          = OpponentHandleStatusAnimation,\n    [CONTROLLER_STATUSXOR]                = OpponentHandleStatusXor,\n    [CONTROLLER_DATATRANSFER]             = OpponentHandleDataTransfer,\n    [CONTROLLER_DMA3TRANSFER]             = OpponentHandleDMA3Transfer,\n    [CONTROLLER_PLAYBGM]                  = OpponentHandlePlayBGM,\n    [CONTROLLER_32]                       = OpponentHandleCmd32,\n    [CONTROLLER_TWORETURNVALUES]          = OpponentHandleTwoReturnValues,\n    [CONTROLLER_CHOSENMONRETURNVALUE]     = OpponentHandleChosenMonReturnValue,\n    [CONTROLLER_ONERETURNVALUE]           = OpponentHandleOneReturnValue,\n    [CONTROLLER_ONERETURNVALUE_DUPLICATE] = OpponentHandleOneReturnValue_Duplicate,\n    [CONTROLLER_CLEARUNKVAR]              = OpponentHandleCmd37,\n    [CONTROLLER_SETUNKVAR]                = OpponentHandleCmd38,\n    [CONTROLLER_CLEARUNKFLAG]             = OpponentHandleCmd39,\n    [CONTROLLER_TOGGLEUNKFLAG]            = OpponentHandleCmd40,\n    [CONTROLLER_HITANIMATION]             = OpponentHandleHitAnimation,\n    [CONTROLLER_CANTSWITCH]               = OpponentHandleCmd42,\n    [CONTROLLER_PLAYSE]                   = OpponentHandlePlaySE,\n    [CONTROLLER_PLAYFANFARE]              = OpponentHandlePlayFanfare,\n    [CONTROLLER_FAINTINGCRY]              = OpponentHandleFaintingCry,\n    [CONTROLLER_INTROSLIDE]               = OpponentHandleIntroSlide,\n    [CONTROLLER_INTROTRAINERBALLTHROW]    = OpponentHandleIntroTrainerBallThrow,\n    [CONTROLLER_DRAWPARTYSTATUSSUMMARY]   = OpponentHandleDrawPartyStatusSummary,\n    [CONTROLLER_HIDEPARTYSTATUSSUMMARY]   = OpponentHandleHidePartyStatusSummary,\n    [CONTROLLER_ENDBOUNCE]                = OpponentHandleEndBounceEffect,\n    [CONTROLLER_SPRITEINVISIBILITY]       = OpponentHandleSpriteInvisibility,\n    [CONTROLLER_BATTLEANIMATION]          = OpponentHandleBattleAnimation,\n    [CONTROLLER_LINKSTANDBYMSG]           = OpponentHandleLinkStandbyMsg,\n    [CONTROLLER_RESETACTIONMOVESELECTION] = OpponentHandleResetActionMoveSelection,\n    [CONTROLLER_ENDLINKBATTLE]            = OpponentHandleCmd55,\n    [CONTROLLER_TERMINATOR_NOP]           = OpponentCmdEnd\n};\n\n// unknown unused data\nstatic const u8 sUnused[] = { 0xB0, 0xB0, 0xC8, 0x98, 0x28, 0x28, 0x28, 0x20 };\n\nstatic void OpponentDummy(void)\n{\n}\n\nvoid SetControllerToOpponent(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = OpponentBufferRunCommand;\n}\n\nstatic void OpponentBufferRunCommand(void)\n{\n    if (gBattleControllerExecFlags & gBitTable[gActiveBattler])\n    {\n        if (gBattleBufferA[gActiveBattler][0] < NELEMS(sOpponentBufferCommands))\n            sOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]]();\n        else\n            OpponentBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnBattlerSpriteCallbackDummy(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        OpponentBufferExecCompleted();\n}\n\nstatic void CompleteOnBattlerSpriteCallbackDummy2(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        OpponentBufferExecCompleted();\n}\n\nstatic void FreeTrainerSpriteAfterSlide(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n    {\n        FreeTrainerFrontPicPaletteAndTile(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam);\n        gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum = gSprites[gBattlerSpriteIds[gActiveBattler]].data[5];\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        OpponentBufferExecCompleted();\n    }\n}\n\nstatic void Intro_DelayAndEnd(void)\n{\n    if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0;\n        OpponentBufferExecCompleted();\n    }\n}\n\nstatic void Intro_WaitForShinyAnimAndHealthbox(void)\n{\n    bool8 var = FALSE;\n\n    if (!IsDoubleBattle() || ((IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))))\n    {\n        if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n            var = TRUE;\n    }\n    else if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy\n          && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == gSprites[gHealthboxSpriteIds[gActiveBattler]].callback)\n    {\n        var = TRUE;\n    }\n    if (IsCryPlayingOrClearCrySongs())\n        var = FALSE;\n    if (var && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE;\n        FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n        FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n        if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n            m4aMPlayContinue(&gMPlayInfo_BGM);\n        else\n            m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3;\n        gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd;\n    }\n}\n\nstatic void Intro_TryShinyAnimShowHealthbox(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)\n        TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)\n        TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]);\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)\n    {\n        if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n        {\n            DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]);\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK],\n                                     &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]],\n                                     HEALTHBOX_ALL);\n            StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK);\n            SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);\n            SetBattlerShadowSpriteCallback(gActiveBattler ^ BIT_FLANK, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], MON_DATA_SPECIES));\n        }\n        DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]);\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler],\n                                 &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]],\n                                 HEALTHBOX_ALL);\n        StartHealthboxSlideIn(gActiveBattler);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n        SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));\n        gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;\n        gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;\n    }\n}\n\nstatic void TryShinyAnimAfterMonAnim(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded == TRUE\n     && gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0)\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim)\n        {\n            TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);\n        }\n        else if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n            FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n            FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n            OpponentBufferExecCompleted();\n        }\n    }\n}\n\nstatic void CompleteOnHealthbarDone(void)\n{\n    s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);\n    \n    SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n    if (hpValue != -1)\n    {\n        UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);\n    }\n    else\n    {\n        if (!BtlCtrl_OakOldMan_TestState2Flag(1) && (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE))\n        {\n            BtlCtrl_OakOldMan_SetState2Flag(1);\n            gBattlerControllerFuncs[gActiveBattler] = PrintOakText_InflictingDamageIsKey;\n        }\n        else\n        {\n            OpponentBufferExecCompleted();\n        }\n    }\n}\n\nstatic void HideHealthboxAfterMonFaint(void)\n{\n    if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse)\n    {\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        OpponentBufferExecCompleted();\n    }\n}\n\nstatic void FreeMonSpriteAfterSwitchOutAnim(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n    {\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        HideBattlerShadowSprite(gActiveBattler);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        OpponentBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnInactiveTextPrinter(void)\n{\n    if (!IsTextPrinterActive(0))\n        OpponentBufferExecCompleted();\n}\n\nstatic void DoHitAnimBlinkSpriteEffect(void)\n{\n    u8 spriteId = gBattlerSpriteIds[gActiveBattler];\n\n    if (gSprites[spriteId].data[1] == 32)\n    {\n        gSprites[spriteId].data[1] = 0;\n        gSprites[spriteId].invisible = FALSE;\n        gDoingBattleAnim = FALSE;\n        OpponentBufferExecCompleted();\n    }\n    else\n    {\n        if ((gSprites[spriteId].data[1] % 4) == 0)\n            gSprites[spriteId].invisible ^= 1;\n        ++gSprites[spriteId].data[1];\n    }\n}\n\nstatic void SwitchIn_ShowSubstitute(void)\n{\n    if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n    {\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd;\n    }\n}\n\nstatic void SwitchIn_HandleSoundAndEnd(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && !IsCryPlayingOrClearCrySongs())\n    {\n        m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100);\n        OpponentBufferExecCompleted();\n    }\n}\n\nstatic void SwitchIn_ShowHealthbox(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n        FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n        FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n        StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0);\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);\n        StartHealthboxSlideIn(gActiveBattler);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n        CopyBattleSpriteInvisibility(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute;\n    }\n}\n\nstatic void SwitchIn_TryShinyAnim(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)\n        TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);\n    if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy\n     && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)\n    {\n        DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]);\n        SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox;\n    }\n}\n\nstatic void CompleteOnFinishedStatusAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)\n        OpponentBufferExecCompleted();\n}\n\nstatic void CompleteOnFinishedBattleAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)\n        OpponentBufferExecCompleted();\n}\n\nvoid OpponentBufferExecCompleted(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = OpponentBufferRunCommand;\n    gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];\n}\n\nstatic void OpponentHandleGetMonData(void)\n{\n    u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data\n    u32 size = 0;\n    u8 monToCheck;\n    s32 i;\n\n    if (!gBattleBufferA[gActiveBattler][2])\n    {\n        size += GetOpponentMonData(gBattlerPartyIndexes[gActiveBattler], monData);\n    }\n    else\n    {\n        monToCheck = gBattleBufferA[gActiveBattler][2];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (monToCheck & 1)\n                size += GetOpponentMonData(i, monData + size);\n            monToCheck >>= 1;\n        }\n    }\n    BtlController_EmitDataTransfer(BUFFER_B, size, monData);\n    OpponentBufferExecCompleted();\n}\n\nstatic u32 GetOpponentMonData(u8 monId, u8 *dst)\n{\n    struct BattlePokemon battleMon;\n    struct MovePpInfo moveData;\n    u8 nickname[20];\n    u8 *src;\n    s16 data16;\n    u32 data32;\n    s32 size = 0;\n\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case REQUEST_ALL_BATTLE:\n        battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES);\n        battleMon.item = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM);\n        for (size = 0; size < MAX_MON_MOVES; ++size)\n        {\n            battleMon.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size);\n            battleMon.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);\n        }\n        battleMon.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES);\n        battleMon.friendship = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP);\n        battleMon.experience = GetMonData(&gEnemyParty[monId], MON_DATA_EXP);\n        battleMon.hpIV = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV);\n        battleMon.attackIV = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV);\n        battleMon.defenseIV = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV);\n        battleMon.speedIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV);\n        battleMon.spAttackIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV);\n        battleMon.spDefenseIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV);\n        battleMon.personality = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY);\n        battleMon.status1 = GetMonData(&gEnemyParty[monId], MON_DATA_STATUS);\n        battleMon.level = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL);\n        battleMon.hp = GetMonData(&gEnemyParty[monId], MON_DATA_HP);\n        battleMon.maxHP = GetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP);\n        battleMon.attack = GetMonData(&gEnemyParty[monId], MON_DATA_ATK);\n        battleMon.defense = GetMonData(&gEnemyParty[monId], MON_DATA_DEF);\n        battleMon.speed = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED);\n        battleMon.spAttack = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK);\n        battleMon.spDefense = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF);\n        battleMon.isEgg = GetMonData(&gEnemyParty[monId], MON_DATA_IS_EGG);\n        battleMon.abilityNum = GetMonData(&gEnemyParty[monId], MON_DATA_ABILITY_NUM);\n        battleMon.otId = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID);\n        GetMonData(&gEnemyParty[monId], MON_DATA_NICKNAME, nickname);\n        StringCopy_Nickname(battleMon.nickname, nickname);\n        GetMonData(&gEnemyParty[monId], MON_DATA_OT_NAME, battleMon.otName);\n        src = (u8 *)&battleMon;\n        for (size = 0; size < sizeof(battleMon); ++size)\n            dst[size] = src[size];\n        break;\n    case REQUEST_SPECIES_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_HELDITEM_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_MOVES_PP_BATTLE:\n        for (size = 0; size < MAX_MON_MOVES; ++size)\n        {\n            moveData.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size);\n            moveData.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);\n        }\n        moveData.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES);\n        src = (u8 *)(&moveData);\n        for (size = 0; size < sizeof(moveData); ++size)\n            dst[size] = src[size];\n        break;\n    case REQUEST_MOVE1_BATTLE:\n    case REQUEST_MOVE2_BATTLE:\n    case REQUEST_MOVE3_BATTLE:\n    case REQUEST_MOVE4_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_PP_DATA_BATTLE:\n        for (size = 0; size < MAX_MON_MOVES; ++size)\n            dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);\n        dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES);\n        ++size;\n        break;\n    case REQUEST_PPMOVE1_BATTLE:\n    case REQUEST_PPMOVE2_BATTLE:\n    case REQUEST_PPMOVE3_BATTLE:\n    case REQUEST_PPMOVE4_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);\n        size = 1;\n        break;\n    case REQUEST_OTID_BATTLE:\n        data32 = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        size = 3;\n        break;\n    case REQUEST_EXP_BATTLE:\n        data32 = GetMonData(&gEnemyParty[monId], MON_DATA_EXP);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        size = 3;\n        break;\n    case REQUEST_HP_EV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_EV);\n        size = 1;\n        break;\n    case REQUEST_ATK_EV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV);\n        size = 1;\n        break;\n    case REQUEST_DEF_EV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV);\n        size = 1;\n        break;\n    case REQUEST_SPEED_EV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV);\n        size = 1;\n        break;\n    case REQUEST_SPATK_EV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV);\n        size = 1;\n        break;\n    case REQUEST_SPDEF_EV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV);\n        size = 1;\n        break;\n    case REQUEST_FRIENDSHIP_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP);\n        size = 1;\n        break;\n    case REQUEST_POKERUS_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKERUS);\n        size = 1;\n        break;\n    case REQUEST_MET_LOCATION_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION);\n        size = 1;\n        break;\n    case REQUEST_MET_LEVEL_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL);\n        size = 1;\n        break;\n    case REQUEST_MET_GAME_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME);\n        size = 1;\n        break;\n    case REQUEST_POKEBALL_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL);\n        size = 1;\n        break;\n    case REQUEST_ALL_IVS_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV);\n        dst[1] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV);\n        dst[2] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV);\n        dst[3] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV);\n        dst[4] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV);\n        dst[5] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV);\n        size = 6;\n        break;\n    case REQUEST_HP_IV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV);\n        size = 1;\n        break;\n    case REQUEST_ATK_IV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV);\n        size = 1;\n        break;\n    case REQUEST_DEF_IV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV);\n        size = 1;\n        break;\n    case REQUEST_SPEED_IV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV);\n        size = 1;\n        break;\n    case REQUEST_SPATK_IV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV);\n        size = 1;\n        break;\n    case REQUEST_SPDEF_IV_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV);\n        size = 1;\n        break;\n    case REQUEST_PERSONALITY_BATTLE:\n        data32 = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        dst[3] = (data32 & 0xFF000000) >> 24;\n        size = 4;\n        break;\n    case REQUEST_CHECKSUM_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_STATUS_BATTLE:\n        data32 = GetMonData(&gEnemyParty[monId], MON_DATA_STATUS);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        dst[3] = (data32 & 0xFF000000) >> 24;\n        size = 4;\n        break;\n    case REQUEST_LEVEL_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL);\n        size = 1;\n        break;\n    case REQUEST_HP_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_HP);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_MAX_HP_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_ATK_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_ATK);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_DEF_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_DEF);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPEED_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPATK_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPDEF_BATTLE:\n        data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_COOL_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL);\n        size = 1;\n        break;\n    case REQUEST_BEAUTY_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY);\n        size = 1;\n        break;\n    case REQUEST_CUTE_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE);\n        size = 1;\n        break;\n    case REQUEST_SMART_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART);\n        size = 1;\n        break;\n    case REQUEST_TOUGH_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH);\n        size = 1;\n        break;\n    case REQUEST_SHEEN_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SHEEN);\n        size = 1;\n        break;\n    case REQUEST_COOL_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_BEAUTY_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_CUTE_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_SMART_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_TOUGH_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON);\n        size = 1;\n        break;\n    }\n    return size;\n}\n\nstatic void OpponentHandleGetRawMonData(void)\n{\n    struct BattlePokemon battleMon;\n    u8 *src = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];\n    u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBattler][1];\n    u32 i;\n\n    for (i = 0; i < gBattleBufferA[gActiveBattler][2]; ++i)\n        dst[i] = src[i];\n    BtlController_EmitDataTransfer(BUFFER_B, gBattleBufferA[gActiveBattler][2], dst);\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleSetMonData(void)\n{\n    u8 monToCheck;\n    u32 i;\n\n    if (gBattleBufferA[gActiveBattler][2] == 0)\n    {\n        SetOpponentMonData(gBattlerPartyIndexes[gActiveBattler]);\n    }\n    else\n    {\n        monToCheck = gBattleBufferA[gActiveBattler][2];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (monToCheck & 1)\n                SetOpponentMonData(i);\n            monToCheck >>= 1;\n        }\n    }\n    OpponentBufferExecCompleted();\n}\n\nstatic void SetOpponentMonData(u8 monId)\n{\n    struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];\n    struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];\n    s32 i;\n\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case REQUEST_ALL_BATTLE:\n        {\n            u8 iv;\n\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &battlePokemon->species);\n            SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);\n            for (i = 0; i < MAX_MON_MOVES; ++i)\n            {\n                SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);\n                SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);\n            }\n            SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses);\n            SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship);\n            SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &battlePokemon->experience);\n            iv = battlePokemon->hpIV;\n            SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &iv);\n            iv = battlePokemon->attackIV;\n            SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &iv);\n            iv = battlePokemon->defenseIV;\n            SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &iv);\n            iv = battlePokemon->speedIV;\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &iv);\n            iv = battlePokemon->spAttackIV;\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &iv);\n            iv = battlePokemon->spDefenseIV;\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &iv);\n            SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality);\n            SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &battlePokemon->status1);\n            SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &battlePokemon->level);\n            SetMonData(&gEnemyParty[monId], MON_DATA_HP, &battlePokemon->hp);\n            SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP);\n            SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &battlePokemon->attack);\n            SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &battlePokemon->defense);\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &battlePokemon->speed);\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack);\n            SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense);\n        }\n        break;\n    case REQUEST_SPECIES_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HELDITEM_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MOVES_PP_BATTLE:\n        for (i = 0; i < MAX_MON_MOVES; ++i)\n        {\n            SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);\n            SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);\n        }\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses);\n        break;\n    case REQUEST_MOVE1_BATTLE:\n    case REQUEST_MOVE2_BATTLE:\n    case REQUEST_MOVE3_BATTLE:\n    case REQUEST_MOVE4_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_PP_DATA_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);\n        break;\n    case REQUEST_PPMOVE1_BATTLE:\n    case REQUEST_PPMOVE2_BATTLE:\n    case REQUEST_PPMOVE3_BATTLE:\n    case REQUEST_PPMOVE4_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_OTID_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_EXP_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HP_EV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_EV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_EV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_EV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_EV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_EV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_FRIENDSHIP_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_POKERUS_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_LOCATION_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_LEVEL_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_GAME_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_POKEBALL_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ALL_IVS_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);\n        break;\n    case REQUEST_HP_IV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_IV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_IV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_IV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_IV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_IV_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_PERSONALITY_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CHECKSUM_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_STATUS_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_LEVEL_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HP_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MAX_HP_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_COOL_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_BEAUTY_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CUTE_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SMART_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_TOUGH_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SHEEN_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_COOL_RIBBON_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_BEAUTY_RIBBON_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CUTE_RIBBON_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SMART_RIBBON_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_TOUGH_RIBBON_BATTLE:\n        SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    }\n}\n\nstatic void OpponentHandleSetRawMonData(void)\n{\n    u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];\n    u32 i;\n\n    for (i = 0; i < gBattleBufferA[gActiveBattler][2]; ++i)\n        dst[i] = gBattleBufferA[gActiveBattler][3 + i];\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleLoadMonSprite(void)\n{\n    u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);\n    u32 y;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_GHOST)\n    {\n        DecompressGhostFrontPic(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n        y = GetGhostSpriteDefault_Y(gActiveBattler);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = TRUE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = TRUE;\n    }\n    else\n    {\n        BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n        y = GetBattlerSpriteDefault_Y(gActiveBattler);\n    }\n    SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler));\n    gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                     GetBattlerSpriteCoord(gActiveBattler, BATTLER_COORD_X_2),\n                                                     y,\n                                                     GetBattlerSpriteSubpriority(gActiveBattler));\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH;\n    if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n        gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = 0;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = species;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]);\n    if (!(gBattleTypeFlags & BATTLE_TYPE_GHOST))\n        SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));\n    gBattlerControllerFuncs[gActiveBattler] = TryShinyAnimAfterMonAnim;\n}\n\nstatic void OpponentHandleSwitchInAnim(void)\n{\n    *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = 6;\n    gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1];\n    StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]);\n    gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim;\n}\n\nstatic void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit)\n{\n    u16 species;\n\n    ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit);\n    gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];\n    species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n    gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim);\n    BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId);\n    SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));\n    gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2),\n                                                GetBattlerSpriteDefault_Y(battlerId),\n                                                GetBattlerSpriteSubpriority(battlerId));\n    gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;\n    gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;\n    gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId];\n    gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);\n    gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;\n    gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;\n    gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT);\n}\n\nstatic void OpponentHandleReturnMonToBall(void)\n{\n    if (!gBattleBufferA[gActiveBattler][1])\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n        gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;\n    }\n    else\n    {\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        HideBattlerShadowSprite(gActiveBattler);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        OpponentBufferExecCompleted();\n    }\n}\n\nstatic void DoSwitchOutAnimation(void)\n{\n    switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)\n    {\n    case 0:\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;\n        break;\n    case 1:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_OPPONENT_MON);\n            gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim;\n        }\n        break;\n    }\n}\n\nstatic void OpponentHandleDrawTrainerPic(void)\n{\n    u32 trainerPicId;\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)\n        trainerPicId = GetSecretBaseTrainerPicIndex();\n    else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)\n        trainerPicId = GetBattleTowerTrainerFrontSpriteId();\n    else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)\n        trainerPicId = GetTrainerTowerTrainerFrontSpriteId();\n    else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)\n        trainerPicId = GetEreaderTrainerFrontSpriteId();\n    else\n        trainerPicId = sTrainers[gTrainerBattleOpponent_A].trainerPic;\n    DecompressTrainerFrontPic(trainerPicId, gActiveBattler);\n    SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));\n    gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                     176,\n                                                     (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 40,\n                                                     GetBattlerSpriteSubpriority(gActiveBattler));\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2;\n    if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 240;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicId].tag);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn;\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;\n}\n\nstatic void OpponentHandleTrainerSlide(void)\n{\n    u32 trainerPicId;\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)\n        trainerPicId = GetSecretBaseTrainerPicIndex();\n    else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)\n        trainerPicId = GetBattleTowerTrainerFrontSpriteId();\n    else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)\n        trainerPicId = GetTrainerTowerTrainerFrontSpriteId();\n    else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)\n        trainerPicId = GetEreaderTrainerFrontSpriteId();\n    else\n        trainerPicId = sTrainers[gTrainerBattleOpponent_A].trainerPic;\n    DecompressTrainerFrontPic(trainerPicId, gActiveBattler);\n    SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));\n    gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                     176,\n                                                     (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 40,\n                                                     30);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = 96;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x += 32;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicId].tag);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn;\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy2;\n}\n\nstatic void OpponentHandleTrainerSlideBack(void)\n{\n    SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);\n    gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide;\n}\n\nstatic void OpponentHandleFaintAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)\n    {\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState;\n    }\n    else\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            PlaySE12WithPanning(SE_FAINT, SOUND_PAN_TARGET);\n            gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon;\n            gBattlerControllerFuncs[gActiveBattler] = HideHealthboxAfterMonFaint;\n        }\n    }\n}\n\nstatic void OpponentHandlePaletteFade(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleSuccessBallThrowAnim(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleBallThrowAnim(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandlePause(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleMoveAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);\n\n        gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];\n        gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);\n        gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);\n        gAnimFriendship = gBattleBufferA[gActiveBattler][10];\n        gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);\n        gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];\n        gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;\n        if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE\n        {\n            OpponentBufferExecCompleted();\n        }\n        else\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            gBattlerControllerFuncs[gActiveBattler] = OpponentDoMoveAnimation;\n        }\n    }\n}\n\nstatic void OpponentDoMoveAnimation(void)\n{\n    u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);\n    u8 multihit = gBattleBufferA[gActiveBattler][11];\n\n    switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)\n    {\n    case 0:\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute\n            && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8)\n        {\n            gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1;\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        }\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;\n        break;\n    case 1:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF);\n            DoMoveAnim(move);\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;\n        }\n        break;\n    case 2:\n        gAnimScriptCallback();\n        if (!gAnimScriptActive)\n        {\n            SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL);\n            if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2)\n            {\n                InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);\n                gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0;\n            }\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;\n        }\n        break;\n    case 3:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            CopyAllBattleSpritesInvisibilities();\n            TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            OpponentBufferExecCompleted();\n        }\n        break;\n    }\n}\n\nstatic void OpponentHandlePrintString(void)\n{\n    u16 *stringId;\n\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]);\n    BufferStringBattle(*stringId);\n    if (BattleStringShouldBeColored(*stringId))\n        BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT));\n    else\n        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n    if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n    {\n        switch (*stringId)\n        {\n        case 0x17F:\n            gBattlerControllerFuncs[gActiveBattler] = PrintOakText_HowDisappointing;\n            return;\n        case 0xE3:\n            gBattlerControllerFuncs[gActiveBattler] = PrintOakText_OakNoRunningFromATrainer;\n            return;\n        }\n    }\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;\n}\n\nstatic void OpponentHandlePrintSelectionString(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleChooseAction(void)\n{\n    AI_TrySwitchOrUseItem();\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleUnknownYesNoBox(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleChooseMove(void)\n{\n    u8 chosenMoveId;\n    struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]);\n\n    if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER))\n    {\n\n        BattleAI_SetupAIData();\n        chosenMoveId = BattleAI_ChooseMoveOrAction();\n\n        switch (chosenMoveId)\n        {\n        case AI_CHOICE_WATCH:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_WATCH_CAREFULLY, 0);\n            break;\n        case AI_CHOICE_FLEE:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0);\n            break;\n        default:\n            if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))\n                gBattlerTarget = gActiveBattler;\n            if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & MOVE_TARGET_BOTH)\n            {\n                gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n                if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])\n                    gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);\n            }\n            BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (gBattlerTarget << 8));\n            break;\n        }\n        OpponentBufferExecCompleted();\n    }\n    else\n    {\n        u16 move;\n\n        do\n        {\n            chosenMoveId = Random() & 3;\n            move = moveInfo->moves[chosenMoveId];\n        }\n        while (move == MOVE_NONE);\n        if (gBattleMoves[move].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))\n            BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (gActiveBattler << 8));\n        else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n            BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8));\n        else\n            BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8));\n\n        OpponentBufferExecCompleted();\n    }\n}\n\nstatic void OpponentHandleChooseItem(void)\n{\n    BtlController_EmitOneReturnValue(1, *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2));\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleChoosePokemon(void)\n{\n    s32 chosenMonId;\n\n    if (*(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) == PARTY_SIZE)\n    {\n        chosenMonId = GetMostSuitableMonToSwitchInto();\n\n        if (chosenMonId == PARTY_SIZE)\n        {\n            s32 battler1, battler2;\n\n            if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))\n            {\n                battler2 = battler1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n            }\n            else\n            {\n                battler1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n                battler2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n            }\n            for (chosenMonId = 0; chosenMonId < PARTY_SIZE; ++chosenMonId)\n                if (GetMonData(&gEnemyParty[chosenMonId], MON_DATA_HP) != 0\n                 && chosenMonId != gBattlerPartyIndexes[battler1]\n                 && chosenMonId != gBattlerPartyIndexes[battler2])\n                    break;\n        }\n    }\n    else\n    {\n        chosenMonId = *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1));\n        *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE;\n    }\n    *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = chosenMonId;\n    BtlController_EmitChosenMonReturnValue(1, chosenMonId, NULL);\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleCmd23(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleHealthBarUpdate(void)\n{\n    s16 hpVal;\n\n    LoadBattleBarGfx(0);\n    hpVal = (gBattleBufferA[gActiveBattler][3] << 8) | gBattleBufferA[gActiveBattler][2];\n\n    if (hpVal != INSTANT_HP_BAR_DROP)\n    {\n        u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);\n        u32 curHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);\n\n        SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);\n    }\n    else\n    {\n        u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);\n\n        SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);\n    }\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;\n}\n\nstatic void OpponentHandleExpUpdate(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleStatusIconUpdate(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u8 battlerId;\n\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON);\n        battlerId = gActiveBattler;\n        gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = FALSE;\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;\n    }\n}\n\nstatic void OpponentHandleStatusAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1],\n                                           gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24));\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;\n    }\n}\n\nstatic void OpponentHandleStatusXor(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleDataTransfer(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleDMA3Transfer(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandlePlayBGM(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleCmd32(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleTwoReturnValues(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleChosenMonReturnValue(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleOneReturnValue(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleOneReturnValue_Duplicate(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleCmd37(void)\n{\n    gUnusedControllerStruct.unk = 0;\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleCmd38(void)\n{\n    gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1];\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleCmd39(void)\n{\n    gUnusedControllerStruct.flag = 0;\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleCmd40(void)\n{\n    gUnusedControllerStruct.flag ^= 1;\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleHitAnimation(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)\n    {\n        OpponentBufferExecCompleted();\n    }\n    else\n    {\n        gDoingBattleAnim = TRUE;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;\n        DoHitAnimHealthboxEffect(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;\n    }\n}\n\nstatic void OpponentHandleCmd42(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandlePlaySE(void)\n{\n    s8 pan;\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        pan = SOUND_PAN_ATTACKER;\n    else\n        pan = SOUND_PAN_TARGET;\n    PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandlePlayFanfare(void)\n{\n    PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleFaintingCry(void)\n{\n    u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);\n\n    PlayCry_ByMode(species, 25, CRY_MODE_FAINT);\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleIntroSlide(void)\n{\n    HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);\n    gIntroSlideFlags |= 1;\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleIntroTrainerBallThrow(void)\n{\n    u8 paletteNum;\n    u8 taskId;\n\n    SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreeOpponentSprite);\n    taskId = CreateTask(Task_StartSendOutAnim, 5);\n    gTasks[taskId].data[0] = gActiveBattler;\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)\n        gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;\n    gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;\n    gBattlerControllerFuncs[gActiveBattler] = OpponentDummy;\n}\n\nstatic void SpriteCB_FreeOpponentSprite(struct Sprite *sprite)\n{\n    FreeTrainerFrontPicPaletteAndTile(sprite->oam.affineParam);\n    sprite->oam.tileNum = sprite->data[5];\n    FreeSpriteOamMatrix(sprite);\n    DestroySprite(sprite);\n}\n\nstatic void Task_StartSendOutAnim(u8 taskId)\n{\n    u8 savedActiveBattler = gActiveBattler;\n\n    gActiveBattler = gTasks[taskId].data[0];\n    if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI))\n    {\n        gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n        StartSendOutAnim(gActiveBattler, FALSE);\n    }\n    else\n    {\n        gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n        StartSendOutAnim(gActiveBattler, FALSE);\n        gActiveBattler ^= BIT_FLANK;\n        gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n        StartSendOutAnim(gActiveBattler, FALSE);\n        gActiveBattler ^= BIT_FLANK;\n    }\n    gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox;\n    gActiveBattler = savedActiveBattler;\n    DestroyTask(taskId);\n}\n\nstatic void OpponentHandleDrawPartyStatusSummary(void)\n{\n    if (gBattleBufferA[gActiveBattler][1] && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n    {\n        OpponentBufferExecCompleted();\n    }\n    else\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = TRUE;\n        if (gBattleBufferA[gActiveBattler][2])\n        {\n            if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay < 2)\n            {\n                ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay;\n                return;\n            }\n            else\n            {\n                gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay = 0;\n            }\n        }\n        gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, \n                                                                                      (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], \n                                                                                      gBattleBufferA[gActiveBattler][1], \n                                                                                      gBattleBufferA[gActiveBattler][2]);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0;\n        if (gBattleBufferA[gActiveBattler][2])\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0x5D;\n        gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary;\n    }\n}\n\nstatic void EndDrawPartyStatusSummary(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 0x5C)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0;\n        OpponentBufferExecCompleted();\n    }\n}\n\nstatic void OpponentHandleHidePartyStatusSummary(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)\n        gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleEndBounceEffect(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleSpriteInvisibility(void)\n{\n    if (IsBattlerSpritePresent(gActiveBattler))\n    {\n        gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1];\n        CopyBattleSpriteInvisibility(gActiveBattler);\n    }\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleBattleAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u8 animationId = gBattleBufferA[gActiveBattler][1];\n        u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n\n        if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))\n            OpponentBufferExecCompleted();\n        else\n            gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;\n    }\n}\n\nstatic void OpponentHandleLinkStandbyMsg(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleResetActionMoveSelection(void)\n{\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentHandleCmd55(void)\n{\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER))\n    {\n        gMain.inBattle = 0;\n        gMain.callback1 = gPreBattleCallback1;\n        SetMainCallback2(gMain.savedCallback);\n    }\n    OpponentBufferExecCompleted();\n}\n\nstatic void OpponentCmdEnd(void)\n{\n}\n"
  },
  {
    "path": "src/battle_controller_player.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"item.h\"\n#include \"item_menu.h\"\n#include \"link.h\"\n#include \"m4a.h\"\n#include \"party_menu.h\"\n#include \"pokeball.h\"\n#include \"strings.h\"\n#include \"pokemon_special_anim.h\"\n#include \"task.h\"\n#include \"util.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_controllers.h\"\n#include \"battle_interface.h\"\n#include \"battle_message.h\"\n#include \"battle_script_commands.h\"\n#include \"reshow_battle_screen.h\"\n#include \"constants/battle_anim.h\"\n#include \"constants/items.h\"\n#include \"constants/moves.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n\nstatic void PlayerHandleGetMonData(void);\nstatic void PlayerHandleSetMonData(void);\nstatic void PlayerHandleSetRawMonData(void);\nstatic void PlayerHandleLoadMonSprite(void);\nstatic void PlayerHandleSwitchInAnim(void);\nstatic void PlayerHandleReturnMonToBall(void);\nstatic void PlayerHandleDrawTrainerPic(void);\nstatic void PlayerHandleTrainerSlide(void);\nstatic void PlayerHandleTrainerSlideBack(void);\nstatic void PlayerHandleFaintAnimation(void);\nstatic void PlayerHandlePaletteFade(void);\nstatic void PlayerHandleSuccessBallThrowAnim(void);\nstatic void PlayerHandleBallThrowAnim(void);\nstatic void PlayerHandlePause(void);\nstatic void PlayerHandleMoveAnimation(void);\nstatic void PlayerHandlePrintString(void);\nstatic void PlayerHandlePrintSelectionString(void);\nstatic void PlayerHandleChooseAction(void);\nstatic void PlayerHandleUnknownYesNoBox(void);\nstatic void PlayerHandleChooseMove(void);\nstatic void PlayerHandleChooseItem(void);\nstatic void PlayerHandleChoosePokemon(void);\nstatic void PlayerHandleCmd23(void);\nstatic void PlayerHandleHealthBarUpdate(void);\nstatic void PlayerHandleExpUpdate(void);\nstatic void PlayerHandleStatusIconUpdate(void);\nstatic void PlayerHandleStatusAnimation(void);\nstatic void PlayerHandleStatusXor(void);\nstatic void PlayerHandleDataTransfer(void);\nstatic void PlayerHandleDMA3Transfer(void);\nstatic void PlayerHandlePlayBGM(void);\nstatic void PlayerHandleCmd32(void);\nstatic void PlayerHandleTwoReturnValues(void);\nstatic void PlayerHandleChosenMonReturnValue(void);\nstatic void PlayerHandleOneReturnValue(void);\nstatic void PlayerHandleOneReturnValue_Duplicate(void);\nstatic void PlayerHandleCmd37(void);\nstatic void PlayerHandleCmd38(void);\nstatic void PlayerHandleCmd39(void);\nstatic void PlayerHandleCmd40(void);\nstatic void PlayerHandleHitAnimation(void);\nstatic void PlayerHandleCmd42(void);\nstatic void PlayerHandlePlaySE(void);\nstatic void PlayerHandlePlayFanfare(void);\nstatic void PlayerHandleFaintingCry(void);\nstatic void PlayerHandleIntroSlide(void);\nstatic void PlayerHandleIntroTrainerBallThrow(void);\nstatic void PlayerHandleDrawPartyStatusSummary(void);\nstatic void PlayerHandleHidePartyStatusSummary(void);\nstatic void PlayerHandleEndBounceEffect(void);\nstatic void PlayerHandleSpriteInvisibility(void);\nstatic void PlayerHandleBattleAnimation(void);\nstatic void PlayerHandleLinkStandbyMsg(void);\nstatic void PlayerHandleResetActionMoveSelection(void);\nstatic void PlayerHandleCmd55(void);\nstatic void PlayerCmdEnd(void);\n\nstatic void PlayerBufferRunCommand(void);\nstatic void HandleInputChooseTarget(void);\nstatic void MoveSelectionDisplayPpNumber(void);\nstatic void MoveSelectionDisplayPpString(void);\nstatic void MoveSelectionDisplayMoveType(void);\nstatic void MoveSelectionDisplayMoveNames(void);\nstatic void HandleMoveSwitching(void);\nstatic void WaitForMonSelection(void);\nstatic void CompleteWhenChoseItem(void);\nstatic void Task_LaunchLvlUpAnim(u8 taskId);\nstatic void Task_PrepareToGiveExpWithExpBar(u8 taskId);\nstatic void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId);\nstatic void Task_UpdateLvlInHealthbox(u8 taskId);\nstatic void PrintLinkStandbyMsg(void);\nstatic u32 CopyPlayerMonData(u8 monId, u8 *dst);\nstatic void SetPlayerMonData(u8 monId);\nstatic void DoSwitchOutAnimation(void);\nstatic void PlayerDoMoveAnimation(void);\nstatic void Task_StartSendOutAnim(u8 taskId);\nstatic void PreviewDeterminativeMoveTargets(void);\nstatic void SwitchIn_HandleSoundAndEnd(void);\nstatic void Task_GiveExpWithExpBar(u8 taskId);\nstatic void Task_CreateLevelUpVerticalStripes(u8 taskId);\nstatic void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit);\nstatic void EndDrawPartyStatusSummary(void);\n\nextern u8 GetWeatherBallType(void);\nextern u8 GetHiddenPowerType(struct Pokemon * mon);\nextern const u16 gNaturePowerMoves[];\n\nstatic void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) =\n{\n    [CONTROLLER_GETMONDATA]               = PlayerHandleGetMonData,\n    [CONTROLLER_GETRAWMONDATA]            = PlayerHandleGetRawMonData,\n    [CONTROLLER_SETMONDATA]               = PlayerHandleSetMonData,\n    [CONTROLLER_SETRAWMONDATA]            = PlayerHandleSetRawMonData,\n    [CONTROLLER_LOADMONSPRITE]            = PlayerHandleLoadMonSprite,\n    [CONTROLLER_SWITCHINANIM]             = PlayerHandleSwitchInAnim,\n    [CONTROLLER_RETURNMONTOBALL]          = PlayerHandleReturnMonToBall,\n    [CONTROLLER_DRAWTRAINERPIC]           = PlayerHandleDrawTrainerPic,\n    [CONTROLLER_TRAINERSLIDE]             = PlayerHandleTrainerSlide,\n    [CONTROLLER_TRAINERSLIDEBACK]         = PlayerHandleTrainerSlideBack,\n    [CONTROLLER_FAINTANIMATION]           = PlayerHandleFaintAnimation,\n    [CONTROLLER_PALETTEFADE]              = PlayerHandlePaletteFade,\n    [CONTROLLER_SUCCESSBALLTHROWANIM]     = PlayerHandleSuccessBallThrowAnim,\n    [CONTROLLER_BALLTHROWANIM]            = PlayerHandleBallThrowAnim,\n    [CONTROLLER_PAUSE]                    = PlayerHandlePause,\n    [CONTROLLER_MOVEANIMATION]            = PlayerHandleMoveAnimation,\n    [CONTROLLER_PRINTSTRING]              = PlayerHandlePrintString,\n    [CONTROLLER_PRINTSTRINGPLAYERONLY]    = PlayerHandlePrintSelectionString,\n    [CONTROLLER_CHOOSEACTION]             = PlayerHandleChooseAction,\n    [CONTROLLER_UNKNOWNYESNOBOX]          = PlayerHandleUnknownYesNoBox,\n    [CONTROLLER_CHOOSEMOVE]               = PlayerHandleChooseMove,\n    [CONTROLLER_OPENBAG]                  = PlayerHandleChooseItem,\n    [CONTROLLER_CHOOSEPOKEMON]            = PlayerHandleChoosePokemon,\n    [CONTROLLER_23]                       = PlayerHandleCmd23,\n    [CONTROLLER_HEALTHBARUPDATE]          = PlayerHandleHealthBarUpdate,\n    [CONTROLLER_EXPUPDATE]                = PlayerHandleExpUpdate,\n    [CONTROLLER_STATUSICONUPDATE]         = PlayerHandleStatusIconUpdate,\n    [CONTROLLER_STATUSANIMATION]          = PlayerHandleStatusAnimation,\n    [CONTROLLER_STATUSXOR]                = PlayerHandleStatusXor,\n    [CONTROLLER_DATATRANSFER]             = PlayerHandleDataTransfer,\n    [CONTROLLER_DMA3TRANSFER]             = PlayerHandleDMA3Transfer,\n    [CONTROLLER_PLAYBGM]                  = PlayerHandlePlayBGM,\n    [CONTROLLER_32]                       = PlayerHandleCmd32,\n    [CONTROLLER_TWORETURNVALUES]          = PlayerHandleTwoReturnValues,\n    [CONTROLLER_CHOSENMONRETURNVALUE]     = PlayerHandleChosenMonReturnValue,\n    [CONTROLLER_ONERETURNVALUE]           = PlayerHandleOneReturnValue,\n    [CONTROLLER_ONERETURNVALUE_DUPLICATE] = PlayerHandleOneReturnValue_Duplicate,\n    [CONTROLLER_CLEARUNKVAR]              = PlayerHandleCmd37,\n    [CONTROLLER_SETUNKVAR]                = PlayerHandleCmd38,\n    [CONTROLLER_CLEARUNKFLAG]             = PlayerHandleCmd39,\n    [CONTROLLER_TOGGLEUNKFLAG]            = PlayerHandleCmd40,\n    [CONTROLLER_HITANIMATION]             = PlayerHandleHitAnimation,\n    [CONTROLLER_CANTSWITCH]               = PlayerHandleCmd42,\n    [CONTROLLER_PLAYSE]                   = PlayerHandlePlaySE,\n    [CONTROLLER_PLAYFANFARE]              = PlayerHandlePlayFanfare,\n    [CONTROLLER_FAINTINGCRY]              = PlayerHandleFaintingCry,\n    [CONTROLLER_INTROSLIDE]               = PlayerHandleIntroSlide,\n    [CONTROLLER_INTROTRAINERBALLTHROW]    = PlayerHandleIntroTrainerBallThrow,\n    [CONTROLLER_DRAWPARTYSTATUSSUMMARY]   = PlayerHandleDrawPartyStatusSummary,\n    [CONTROLLER_HIDEPARTYSTATUSSUMMARY]   = PlayerHandleHidePartyStatusSummary,\n    [CONTROLLER_ENDBOUNCE]                = PlayerHandleEndBounceEffect,\n    [CONTROLLER_SPRITEINVISIBILITY]       = PlayerHandleSpriteInvisibility,\n    [CONTROLLER_BATTLEANIMATION]          = PlayerHandleBattleAnimation,\n    [CONTROLLER_LINKSTANDBYMSG]           = PlayerHandleLinkStandbyMsg,\n    [CONTROLLER_RESETACTIONMOVESELECTION] = PlayerHandleResetActionMoveSelection,\n    [CONTROLLER_ENDLINKBATTLE]            = PlayerHandleCmd55,\n    [CONTROLLER_TERMINATOR_NOP]           = PlayerCmdEnd,\n};\n\nstatic const u8 sTargetIdentities[] = { B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_RIGHT, B_POSITION_OPPONENT_LEFT };\n\n// unknown unused data\nstatic const u8 sUnused[] = { 0x48, 0x48, 0x20, 0x5a, 0x50, 0x50, 0x50, 0x58 };\n\nvoid BattleControllerDummy(void)\n{\n}\n\nvoid SetControllerToPlayer(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = PlayerBufferRunCommand;\n    gDoingBattleAnim = FALSE;\n}\n\nstatic void PlayerBufferExecCompleted(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = PlayerBufferRunCommand;\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        u8 playerId = GetMultiplayerId();\n\n        PrepareBufferDataTransferLink(2, 4, &playerId);\n        gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;\n    }\n    else\n    {\n        gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];\n    }\n}\n\nstatic void PlayerBufferRunCommand(void)\n{\n    if (gBattleControllerExecFlags & gBitTable[gActiveBattler])\n    {\n        if (gBattleBufferA[gActiveBattler][0] < NELEMS(sPlayerBufferCommands))\n            sPlayerBufferCommands[gBattleBufferA[gActiveBattler][0]]();\n        else\n            PlayerBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnBattlerSpritePosX_0(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0)\n        PlayerBufferExecCompleted();\n}\n\nstatic void HandleInputChooseAction(void)\n{\n    u16 itemId = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n\n    DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1);\n    DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1);\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n\n        switch (gActionSelectionCursor[gActiveBattler])\n        {\n        case 0:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, 0);\n            break;\n        case 1:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0);\n            break;\n        case 2:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);\n            break;\n        case 3:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0);\n            break;\n        }\n        PlayerBufferExecCompleted();\n    }\n    else if (JOY_NEW(DPAD_LEFT))\n    {\n        if (gActionSelectionCursor[gActiveBattler] & 1) // if is B_ACTION_USE_ITEM or B_ACTION_RUN\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] ^= 1;\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n    }\n    else if (JOY_NEW(DPAD_RIGHT))\n    {\n        if (!(gActionSelectionCursor[gActiveBattler] & 1)) // if is B_ACTION_USE_MOVE or B_ACTION_SWITCH\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] ^= 1;\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n    }\n    else if (JOY_NEW(DPAD_UP))\n    {\n        if (gActionSelectionCursor[gActiveBattler] & 2) // if is B_ACTION_SWITCH or B_ACTION_RUN\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] ^= 2;\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n    }\n    else if (JOY_NEW(DPAD_DOWN))\n    {\n        if (!(gActionSelectionCursor[gActiveBattler] & 2)) // if is B_ACTION_USE_MOVE or B_ACTION_USE_ITEM\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] ^= 2;\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n         && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT\n         && !(gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)])\n         && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n        {\n            if (gBattleBufferA[gActiveBattler][1] == B_ACTION_USE_ITEM)\n            {\n                // Add item to bag if it is a ball\n                if (itemId <= ITEM_PREMIER_BALL)\n                    AddBagItem(itemId, 1);\n                else\n                    return;\n            }\n            PlaySE(SE_SELECT);\n            BtlController_EmitTwoReturnValues(1, B_ACTION_CANCEL_PARTNER, 0);\n            PlayerBufferExecCompleted();\n        }\n        else\n        {\n            if(!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) //if wild, pressing B moves cursor to run\n            {\n                PlaySE(SE_SELECT);\n                ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n                gActionSelectionCursor[gActiveBattler] = 3;\n                ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n            }\n        }\n    }\n    else if (JOY_NEW(START_BUTTON))\n    {\n        SwapHpBarsWithHpText();\n    }\n}\n\n// Unused\nstatic void EndBounceEffect2(void)\n{\n    EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX);\n    EndBounceEffect(gActiveBattler, BOUNCE_MON);\n    gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseTarget;\n}\n\nstatic void HandleInputChooseTarget(void)\n{\n    s32 i;\n    u8 identities[4];\n\n    memcpy(identities, sTargetIdentities, NELEMS(sTargetIdentities));\n    DoBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX, 15, 1);\n    i = 0;\n    if (gBattlersCount != 0)\n    {\n        do\n        {\n            if (i != gMultiUsePlayerCursor)\n                EndBounceEffect(i, BOUNCE_HEALTHBOX);\n            ++i;\n        }\n        while (i < gBattlersCount);\n    }\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget;\n        BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8));\n        EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX);\n        PlayerBufferExecCompleted();\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget;\n        gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove;\n        DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1);\n        DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1);\n        EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX);\n    }\n    else if (JOY_NEW(DPAD_LEFT | DPAD_UP))\n    {\n        PlaySE(SE_SELECT);\n        gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget;\n\n        do\n        {\n            u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor);\n\n            for (i = 0; i < MAX_BATTLERS_COUNT; ++i)\n                if (currSelIdentity == identities[i])\n                    break;\n            do\n            {\n                if (--i < 0)\n                    i = MAX_BATTLERS_COUNT; // UB: array out of range\n                gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]);\n            }\n            while (gMultiUsePlayerCursor == gBattlersCount);\n            i = 0;\n            switch (GetBattlerPosition(gMultiUsePlayerCursor))\n            {\n            case B_POSITION_PLAYER_LEFT:\n            case B_POSITION_PLAYER_RIGHT:\n                if (gActiveBattler != gMultiUsePlayerCursor)\n                    ++i;\n                else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler])].target & MOVE_TARGET_USER_OR_SELECTED)\n                    ++i;\n                break;\n            case B_POSITION_OPPONENT_LEFT:\n            case B_POSITION_OPPONENT_RIGHT:\n                ++i;\n                break;\n            }\n            if (gAbsentBattlerFlags & gBitTable[gMultiUsePlayerCursor])\n                i = 0;\n        }\n        while (i == 0);\n        gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_ShowAsMoveTarget;\n    }\n    else if (JOY_NEW(DPAD_RIGHT | DPAD_DOWN))\n    {\n        PlaySE(SE_SELECT);\n        gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget;\n\n        do\n        {\n            u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor);\n\n            for (i = 0; i < MAX_BATTLERS_COUNT; ++i)\n                if (currSelIdentity == identities[i])\n                    break;\n            do\n            {\n                if (++i > 3)\n                    i = 0;\n                gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]);\n            }\n            while (gMultiUsePlayerCursor == gBattlersCount);\n            i = 0;\n            switch (GetBattlerPosition(gMultiUsePlayerCursor))\n            {\n            case B_POSITION_PLAYER_LEFT:\n            case B_POSITION_PLAYER_RIGHT:\n                if (gActiveBattler != gMultiUsePlayerCursor)\n                    ++i;\n                else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler])].target & MOVE_TARGET_USER_OR_SELECTED)\n                    ++i;\n                break;\n            case B_POSITION_OPPONENT_LEFT:\n            case B_POSITION_OPPONENT_RIGHT:\n                ++i;\n                break;\n            }\n            if (gAbsentBattlerFlags & gBitTable[gMultiUsePlayerCursor])\n                i = 0;\n        }\n        while (i == 0);\n        gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_ShowAsMoveTarget;\n    }\n}\n\nvoid HandleInputChooseMove(void)\n{\n    bool32 canSelectTarget = FALSE;\n    struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]);\n\n    PreviewDeterminativeMoveTargets();\n    if (JOY_NEW(A_BUTTON))\n    {\n        u8 moveTarget;\n\n        PlaySE(SE_SELECT);\n        if (moveInfo->moves[gMoveSelectionCursor[gActiveBattler]] == MOVE_CURSE)\n        {\n            if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST)\n                moveTarget = MOVE_TARGET_USER;\n            else\n                moveTarget = MOVE_TARGET_SELECTED;\n        }\n        else\n        {\n            moveTarget = gBattleMoves[moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]].target;\n        }\n\n        if (moveTarget & MOVE_TARGET_USER)\n            gMultiUsePlayerCursor = gActiveBattler;\n        else\n            gMultiUsePlayerCursor = GetBattlerAtPosition((GetBattlerPosition(gActiveBattler) & BIT_SIDE) ^ BIT_SIDE);\n\n        if (!gBattleBufferA[gActiveBattler][1]) // not a double battle\n        {\n            if (moveTarget & MOVE_TARGET_USER_OR_SELECTED && !gBattleBufferA[gActiveBattler][2])\n                ++canSelectTarget;\n        }\n        else // double battle\n        {\n            if (!(moveTarget & (MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_DEPENDS | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER)))\n                ++canSelectTarget; // either selected or user\n            if (moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]] == 0)\n            {\n                canSelectTarget = FALSE;\n            }\n            else if (!(moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) <= 1)\n            {\n                gMultiUsePlayerCursor = GetDefaultMoveTarget(gActiveBattler);\n                canSelectTarget = FALSE;\n            }\n        }\n        ResetPaletteFadeControl();\n        BeginNormalPaletteFade(0xF0000, 0, 0, 0, RGB_WHITE);\n        if (!canSelectTarget)\n        {\n            BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8));\n            PlayerBufferExecCompleted();\n        }\n        else\n        {\n            gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseTarget;\n            if (moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED))\n                gMultiUsePlayerCursor = gActiveBattler;\n            else if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)])\n                gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n            else\n                gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n            gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_ShowAsMoveTarget;\n        }\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        BtlController_EmitTwoReturnValues(1, 10, 0xFFFF);\n        PlayerBufferExecCompleted();\n        ResetPaletteFadeControl();\n        BeginNormalPaletteFade(0xF0000, 0, 0, 0, RGB_WHITE);\n    }\n    else if (JOY_NEW(DPAD_LEFT))\n    {\n        if (gMoveSelectionCursor[gActiveBattler] & 1)\n        {\n            MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);\n            gMoveSelectionCursor[gActiveBattler] ^= 1;\n            PlaySE(SE_SELECT);\n            MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);\n            MoveSelectionDisplayPpNumber();\n            MoveSelectionDisplayMoveType();\n            BeginNormalPaletteFade(0xF0000, 0, 0, 0, RGB_WHITE);\n        }\n    }\n    else if (JOY_NEW(DPAD_RIGHT))\n    {\n        if (!(gMoveSelectionCursor[gActiveBattler] & 1)\n         && (gMoveSelectionCursor[gActiveBattler] ^ 1) < gNumberOfMovesToChoose)\n        {\n            MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);\n            gMoveSelectionCursor[gActiveBattler] ^= 1;\n            PlaySE(SE_SELECT);\n            MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);\n            MoveSelectionDisplayPpNumber();\n            MoveSelectionDisplayMoveType();\n            BeginNormalPaletteFade(0xF0000, 0, 0, 0, RGB_WHITE);\n        }\n    }\n    else if (JOY_NEW(DPAD_UP))\n    {\n        if (gMoveSelectionCursor[gActiveBattler] & 2)\n        {\n            MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);\n            gMoveSelectionCursor[gActiveBattler] ^= 2;\n            PlaySE(SE_SELECT);\n            MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);\n            MoveSelectionDisplayPpNumber();\n            MoveSelectionDisplayMoveType();\n            BeginNormalPaletteFade(0xF0000, 0, 0, 0, RGB_WHITE);\n        }\n    }\n    else if (JOY_NEW(DPAD_DOWN))\n    {\n        if (!(gMoveSelectionCursor[gActiveBattler] & 2)\n         && (gMoveSelectionCursor[gActiveBattler] ^ 2) < gNumberOfMovesToChoose)\n        {\n            MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);\n            gMoveSelectionCursor[gActiveBattler] ^= 2;\n            PlaySE(SE_SELECT);\n            MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);\n            MoveSelectionDisplayPpNumber();\n            MoveSelectionDisplayMoveType();\n            BeginNormalPaletteFade(0xF0000, 0, 0, 0, RGB_WHITE);\n        }\n    }\n    else if (JOY_NEW(SELECT_BUTTON))\n    {\n        if (gNumberOfMovesToChoose > 1 && !(gBattleTypeFlags & BATTLE_TYPE_LINK))\n        {\n            MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29);\n            if (gMoveSelectionCursor[gActiveBattler] != 0)\n                gMultiUsePlayerCursor = 0;\n            else\n                gMultiUsePlayerCursor = gMoveSelectionCursor[gActiveBattler] + 1;\n            MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27);\n            BattlePutTextOnWindow(gText_BattleSwitchWhich, B_WIN_SWITCH_PROMPT);\n            gBattlerControllerFuncs[gActiveBattler] = HandleMoveSwitching;\n        }\n    }\n}\n\n// not used\nstatic u32 HandleMoveInputUnused(void)\n{\n    u32 var = 0;\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        var = 1;\n    }\n    if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        gBattle_BG0_X = 0;\n        gBattle_BG0_Y = 0x140;\n        var = 0xFF;\n    }\n    if (JOY_NEW(DPAD_LEFT) && gMoveSelectionCursor[gActiveBattler] & 1)\n    {\n        MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);\n        gMoveSelectionCursor[gActiveBattler] ^= 1;\n        PlaySE(SE_SELECT);\n        MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);\n    }\n    if (JOY_NEW(DPAD_RIGHT) && !(gMoveSelectionCursor[gActiveBattler] & 1)\n        && (gMoveSelectionCursor[gActiveBattler] ^ 1) < gNumberOfMovesToChoose)\n    {\n        MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);\n        gMoveSelectionCursor[gActiveBattler] ^= 1;\n        PlaySE(SE_SELECT);\n        MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);\n    }\n    if (JOY_NEW(DPAD_UP) && gMoveSelectionCursor[gActiveBattler] & 2)\n    {\n        MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);\n        gMoveSelectionCursor[gActiveBattler] ^= 2;\n        PlaySE(SE_SELECT);\n        MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);\n    }\n    if (JOY_NEW(DPAD_DOWN) && !(gMoveSelectionCursor[gActiveBattler] & 2)\n        && (gMoveSelectionCursor[gActiveBattler] ^ 2) < gNumberOfMovesToChoose)\n    {\n        MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);\n        gMoveSelectionCursor[gActiveBattler] ^= 2;\n        PlaySE(SE_SELECT);\n        MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);\n    }\n    return var;\n}\n\nstatic void HandleMoveSwitching(void)\n{\n    u8 perMovePPBonuses[4];\n    struct ChooseMoveStruct moveStruct;\n    u8 totalPPBonuses;\n\n    if (JOY_NEW(A_BUTTON | SELECT_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n\n        if (gMoveSelectionCursor[gActiveBattler] != gMultiUsePlayerCursor)\n        {\n            struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]);\n            s32 i;\n\n            // swap moves and pp\n            i = moveInfo->moves[gMoveSelectionCursor[gActiveBattler]];\n            moveInfo->moves[gMoveSelectionCursor[gActiveBattler]] = moveInfo->moves[gMultiUsePlayerCursor];\n            moveInfo->moves[gMultiUsePlayerCursor] = i;\n            i = moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]];\n            moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]] = moveInfo->currentPp[gMultiUsePlayerCursor];\n            moveInfo->currentPp[gMultiUsePlayerCursor] = i;\n            i = moveInfo->maxPp[gMoveSelectionCursor[gActiveBattler]];\n            moveInfo->maxPp[gMoveSelectionCursor[gActiveBattler]] = moveInfo->maxPp[gMultiUsePlayerCursor];\n            moveInfo->maxPp[gMultiUsePlayerCursor] = i;\n            if (gDisableStructs[gActiveBattler].mimickedMoves & gBitTable[gMoveSelectionCursor[gActiveBattler]])\n            {\n                gDisableStructs[gActiveBattler].mimickedMoves &= (~gBitTable[gMoveSelectionCursor[gActiveBattler]]);\n                gDisableStructs[gActiveBattler].mimickedMoves |= gBitTable[gMultiUsePlayerCursor];\n            }\n            MoveSelectionDisplayMoveNames();\n            for (i = 0; i < MAX_MON_MOVES; ++i)\n                perMovePPBonuses[i] = (gBattleMons[gActiveBattler].ppBonuses & (3 << (i * 2))) >> (i * 2);\n            totalPPBonuses = perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]];\n            perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]] = perMovePPBonuses[gMultiUsePlayerCursor];\n            perMovePPBonuses[gMultiUsePlayerCursor] = totalPPBonuses;\n            totalPPBonuses = 0;\n            for (i = 0; i < MAX_MON_MOVES; ++i)\n                totalPPBonuses |= perMovePPBonuses[i] << (i * 2);\n\n            gBattleMons[gActiveBattler].ppBonuses = totalPPBonuses;\n            for (i = 0; i < MAX_MON_MOVES; ++i)\n            {\n                gBattleMons[gActiveBattler].moves[i] = moveInfo->moves[i];\n                gBattleMons[gActiveBattler].pp[i] = moveInfo->currentPp[i];\n            }\n            if (!(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED))\n            {\n                for (i = 0; i < MAX_MON_MOVES; ++i)\n                {\n                    moveStruct.moves[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i);\n                    moveStruct.currentPp[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP1 + i);\n                }\n\n                totalPPBonuses = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP_BONUSES);\n                for (i = 0; i < MAX_MON_MOVES; ++i)\n                    perMovePPBonuses[i] = (totalPPBonuses & (3 << (i * 2))) >> (i * 2);\n                i = moveStruct.moves[gMoveSelectionCursor[gActiveBattler]];\n                moveStruct.moves[gMoveSelectionCursor[gActiveBattler]] = moveStruct.moves[gMultiUsePlayerCursor];\n                moveStruct.moves[gMultiUsePlayerCursor] = i;\n                i = moveStruct.currentPp[gMoveSelectionCursor[gActiveBattler]];\n                moveStruct.currentPp[gMoveSelectionCursor[gActiveBattler]] = moveStruct.currentPp[gMultiUsePlayerCursor];\n                moveStruct.currentPp[gMultiUsePlayerCursor] = i;\n                totalPPBonuses = perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]];\n                perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]] = perMovePPBonuses[gMultiUsePlayerCursor];\n                perMovePPBonuses[gMultiUsePlayerCursor] = totalPPBonuses;\n                totalPPBonuses = 0;\n                for (i = 0; i < MAX_MON_MOVES; ++i)\n                    totalPPBonuses |= perMovePPBonuses[i] << (i * 2);\n                for (i = 0; i < MAX_MON_MOVES; ++i)\n                {\n                    SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i, &moveStruct.moves[i]);\n                    SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP1 + i, &moveStruct.currentPp[i]);\n                }\n                SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP_BONUSES, &totalPPBonuses);\n            }\n        }\n        if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n            gBattlerControllerFuncs[gActiveBattler] = OakOldManHandleInputChooseMove;\n        else\n            gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove;\n        gMoveSelectionCursor[gActiveBattler] = gMultiUsePlayerCursor;\n        MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);\n        MoveSelectionDisplayPpString();\n        MoveSelectionDisplayPpNumber();\n        MoveSelectionDisplayMoveType();\n    }\n    if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor);\n        MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);\n        if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n            gBattlerControllerFuncs[gActiveBattler] = OakOldManHandleInputChooseMove;\n        else\n            gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove;\n        MoveSelectionDisplayPpString();\n        MoveSelectionDisplayPpNumber();\n        MoveSelectionDisplayMoveType();\n    }\n    if (JOY_NEW(DPAD_LEFT))\n    {\n        if (gMultiUsePlayerCursor & 1)\n        {\n            if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])\n                MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29);\n            else\n                MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor);\n            gMultiUsePlayerCursor ^= 1;\n            PlaySE(SE_SELECT);\n            if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])\n                MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 0);\n            else\n                MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27);\n        }\n    }\n    if (JOY_NEW(DPAD_RIGHT))\n    {\n        if (!(gMultiUsePlayerCursor & 1) && (gMultiUsePlayerCursor ^ 1) < gNumberOfMovesToChoose)\n        {\n            if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])\n                MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29);\n            else\n                MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor);\n            gMultiUsePlayerCursor ^= 1;\n            PlaySE(SE_SELECT);\n            if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])\n                MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 0);\n            else\n                MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27);\n        }\n    }\n    if (JOY_NEW(DPAD_UP))\n    {\n        if (gMultiUsePlayerCursor & 2)\n        {\n            if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])\n                MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29);\n            else\n                MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor);\n            gMultiUsePlayerCursor ^= 2;\n            PlaySE(SE_SELECT);\n            if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])\n                MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 0);\n            else\n                MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27);\n        }\n    }\n    if (JOY_NEW(DPAD_DOWN))\n    {\n        if (!(gMultiUsePlayerCursor & 2) && (gMultiUsePlayerCursor ^ 2) < gNumberOfMovesToChoose)\n        {\n            if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])\n                MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29);\n            else\n                MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor);\n            gMultiUsePlayerCursor ^= 2;\n            PlaySE(SE_SELECT);\n            if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])\n                MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 0);\n            else\n                MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27);\n        }\n    }\n}\n\nstatic void SetLinkBattleEndCallbacks(void)\n{\n    if (gWirelessCommType == 0)\n    {\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            m4aSongNumStop(SE_LOW_HEALTH);\n            gMain.inBattle = 0;\n            gMain.callback1 = gPreBattleCallback1;\n            SetMainCallback2(CB2_InitEndLinkBattle);\n            FreeAllWindowBuffers();\n        }\n    }\n    else if (IsLinkTaskFinished())\n    {\n        m4aSongNumStop(SE_LOW_HEALTH);\n        gMain.inBattle = 0;\n        gMain.callback1 = gPreBattleCallback1;\n        SetMainCallback2(CB2_InitEndLinkBattle);\n        FreeAllWindowBuffers();\n    }\n}\n\nvoid SetBattleEndCallbacks(void)\n{\n    if (!gPaletteFade.active)\n    {\n        if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n        {\n            if (gWirelessCommType == 0)\n                SetCloseLinkCallback();\n            else\n                SetLinkStandbyCallback();\n            gBattlerControllerFuncs[gActiveBattler] = SetLinkBattleEndCallbacks;\n        }\n        else\n        {\n            m4aSongNumStop(SE_LOW_HEALTH);\n            gMain.inBattle = FALSE;\n            gMain.callback1 = gPreBattleCallback1;\n            SetMainCallback2(gMain.savedCallback);\n        }\n    }\n}\n\nstatic void CompleteOnBattlerSpriteCallbackDummy(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        PlayerBufferExecCompleted();\n}\n\nstatic void CompleteOnBattlerSpriteCallbackDummy2(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        PlayerBufferExecCompleted();\n}\n\nstatic void FreeTrainerSpriteAfterSlide(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n    {\n        BattleGfxSfxDummy3(gSaveBlock2Ptr->playerGender);\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        PlayerBufferExecCompleted();\n    }\n}\n\nstatic void Intro_DelayAndEnd(void)\n{\n    if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0;\n        PlayerBufferExecCompleted();\n    }\n}\n\nstatic void Intro_WaitForShinyAnimAndHealthbox(void)\n{\n    bool8 var = FALSE;\n\n    if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))\n    {\n        if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n            var = TRUE;\n    }\n    else\n    {\n        if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy\n         && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy)\n            var = TRUE;\n    }\n    if (IsCryPlayingOrClearCrySongs())\n        var = FALSE;\n    if (var && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim\n        && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE;\n        FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n        FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n            if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n                m4aMPlayContinue(&gMPlayInfo_BGM);\n            else\n                m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256);\n        HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n        if (IsDoubleBattle())\n            HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], gActiveBattler ^ BIT_FLANK);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3;\n        gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd;\n    }\n}\n\nstatic void Intro_TryShinyAnimShowHealthbox(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim)\n            TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim)\n            TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]);\n        if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n        {\n            DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]);\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK],\n                                     &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]],\n                                     HEALTHBOX_ALL);\n            StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK);\n            SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);\n        }\n        DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]);\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler],\n                                 &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]],\n                                 HEALTHBOX_ALL);\n        StartHealthboxSlideIn(gActiveBattler);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n        gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;\n        gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;\n    }\n}\n\nstatic void SwitchIn_CleanShinyAnimShowSubstitute(void)\n{\n    if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy\n     && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n        FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n        FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd;\n    }\n}\n\nstatic void SwitchIn_HandleSoundAndEnd(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive\n     && !IsCryPlayingOrClearCrySongs())\n    {\n        m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100);\n        HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n        PlayerBufferExecCompleted();\n    }\n}\n\nstatic void SwitchIn_TryShinyAnimShowHealthbox(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim\n     && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)\n        TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);\n    if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy\n     && !(gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive))\n    {\n        DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]);\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler],\n                                 &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]],\n                                 HEALTHBOX_ALL);\n        StartHealthboxSlideIn(gActiveBattler);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n        CopyBattleSpriteInvisibility(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_CleanShinyAnimShowSubstitute;\n    }\n}\n\nvoid Task_PlayerController_RestoreBgmAfterCry(u8 taskId)\n{\n    if (!IsCryPlayingOrClearCrySongs())\n    {\n        m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void CompleteOnHealthbarDone(void)\n{\n    s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);\n\n    SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n    if (hpValue != -1)\n    {\n        UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);\n    }\n    else\n    {\n        HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n        PlayerBufferExecCompleted();\n    }\n}\n\nvoid CompleteOnInactiveTextPrinter(void)\n{\n    if (!IsTextPrinterActive(0))\n        PlayerBufferExecCompleted();\n}\n\n#define tExpTask_monId      data[0]\n#define tExpTask_gainedExp  data[1]\n#define tExpTask_battler    data[2]\n#define tExpTask_frames     data[10]\n// TODO: document other used fields\n\nstatic void Task_GiveExpToMon(u8 taskId)\n{\n    u32 monId = (u8)(gTasks[taskId].tExpTask_monId);\n    u8 battlerId = gTasks[taskId].tExpTask_battler;\n    s16 gainedExp = gTasks[taskId].tExpTask_gainedExp;\n\n    if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // Give exp without moving the expbar.\n    {\n        struct Pokemon *mon = &gPlayerParty[monId];\n        u16 species = GetMonData(mon, MON_DATA_SPECIES);\n        u8 level = GetMonData(mon, MON_DATA_LEVEL);\n        u32 currExp = GetMonData(mon, MON_DATA_EXP);\n        u32 nextLvlExp = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1];\n\n        if (currExp + gainedExp >= nextLvlExp)\n        {\n            u8 savedActiveBattler;\n\n            SetMonData(mon, MON_DATA_EXP, &nextLvlExp);\n            CalculateMonStats(mon, FALSE);\n            gainedExp -= nextLvlExp - currExp;\n            savedActiveBattler = gActiveBattler;\n            gActiveBattler = battlerId;\n            BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);\n            gActiveBattler = savedActiveBattler;\n            if (IsDoubleBattle() == TRUE\n             && ((u16)(monId) == gBattlerPartyIndexes[battlerId] || (u16)(monId) == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]))\n                gTasks[taskId].func = Task_LaunchLvlUpAnim;\n            else\n                gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter;\n        }\n        else\n        {\n            currExp += gainedExp;\n            SetMonData(mon, MON_DATA_EXP, &currExp);\n            gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter;\n            DestroyTask(taskId);\n        }\n    }\n    else\n    {\n        gTasks[taskId].func = Task_PrepareToGiveExpWithExpBar;\n    }\n}\n\nstatic void Task_PrepareToGiveExpWithExpBar(u8 taskId)\n{\n    u8 monIndex = gTasks[taskId].tExpTask_monId;\n    s32 gainedExp = gTasks[taskId].tExpTask_gainedExp;\n    u8 battlerId = gTasks[taskId].tExpTask_battler;\n    struct Pokemon *mon = &gPlayerParty[monIndex];\n    u8 level = GetMonData(mon, MON_DATA_LEVEL);\n    u16 species = GetMonData(mon, MON_DATA_SPECIES);\n    u32 exp = GetMonData(mon, MON_DATA_EXP);\n    u32 currLvlExp = gExperienceTables[gSpeciesInfo[species].growthRate][level];\n    u32 expToNextLvl;\n\n    exp -= currLvlExp;\n    expToNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - currLvlExp;\n    SetBattleBarStruct(battlerId, gHealthboxSpriteIds[battlerId], expToNextLvl, exp, -gainedExp);\n    PlaySE(SE_EXP);\n    gTasks[taskId].func = Task_GiveExpWithExpBar;\n}\n\nstatic void Task_GiveExpWithExpBar(u8 taskId)\n{\n    if (gTasks[taskId].tExpTask_frames < 13)\n    {\n        ++gTasks[taskId].tExpTask_frames;\n    }\n    else\n    {\n        u8 monId = gTasks[taskId].tExpTask_monId;\n        s16 gainedExp = gTasks[taskId].tExpTask_gainedExp;\n        u8 battlerId = gTasks[taskId].tExpTask_battler;\n        s16 newExpPoints;\n\n        newExpPoints = MoveBattleBar(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[battlerId]);\n        if (newExpPoints == -1) // The bar has been filled with given exp points.\n        {\n            u8 level;\n            s32 currExp;\n            u16 species;\n            s32 expOnNextLvl;\n\n            m4aSongNumStop(SE_EXP);\n            level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);\n            currExp = GetMonData(&gPlayerParty[monId], MON_DATA_EXP);\n            species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);\n            expOnNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1];\n            if (currExp + gainedExp >= expOnNextLvl)\n            {\n                u8 savedActiveBattler;\n\n                SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl);\n                CalculateMonStats(&gPlayerParty[monId], FALSE);\n                gainedExp -= expOnNextLvl - currExp;\n                savedActiveBattler = gActiveBattler;\n                gActiveBattler = battlerId;\n                BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);\n                gActiveBattler = savedActiveBattler;\n                gTasks[taskId].func = Task_LaunchLvlUpAnim;\n            }\n            else\n            {\n                currExp += gainedExp;\n                SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp);\n                gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter;\n                DestroyTask(taskId);\n            }\n        }\n    }\n}\n\nstatic void Task_LaunchLvlUpAnim(u8 taskId)\n{\n    u8 battlerId = gTasks[taskId].tExpTask_battler;\n    u8 monIndex = gTasks[taskId].tExpTask_monId;\n\n    if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])\n        battlerId ^= BIT_FLANK;\n    InitAndLaunchSpecialAnimation(battlerId, battlerId, battlerId, B_ANIM_LVL_UP);\n    gTasks[taskId].func = Task_UpdateLvlInHealthbox;\n}\n\nstatic void Task_UpdateLvlInHealthbox(u8 taskId)\n{\n    u8 battlerId = gTasks[taskId].tExpTask_battler;\n\n    if (!gBattleSpritesDataPtr->healthBoxesData[battlerId].specialAnimActive)\n    {\n        u8 monIndex = gTasks[taskId].tExpTask_monId;\n\n        GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL);  // Unused return value.\n        if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId ^ BIT_FLANK], &gPlayerParty[monIndex], HEALTHBOX_ALL);\n        else\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId], &gPlayerParty[monIndex], HEALTHBOX_ALL);\n        gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter;\n    }\n}\n\nstatic void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId)\n{\n    u8 monIndex;\n    s32 battlerId = gTasks[taskId].tExpTask_battler;\n\n    if (IsBattlerSpriteVisible((u8)battlerId) == TRUE)\n    {\n        gTasks[taskId].func = Task_CreateLevelUpVerticalStripes;\n        gTasks[taskId].data[15] = 0;\n    }\n    else\n    {\n        gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter;\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_CreateLevelUpVerticalStripes(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u8 battlerId = tExpTask_battler;\n    u16 bgPriorityRank = GetBattlerSpriteBGPriorityRank(battlerId);\n    bool32 isOnBg2 = ((bgPriorityRank ^ 1)) != 0;\n    struct Sprite *sprite = &gSprites[gBattlerSpriteIds[battlerId]];\n\n    switch (data[15])\n    {\n    case 0:\n        if (!IsTextPrinterActive(0))\n        {\n            if (!isOnBg2)\n            {\n                data[14] = gBattle_BG1_X;\n                data[13] = gBattle_BG1_Y;\n                gBattle_BG1_X = -(sprite->x + sprite->x2) + 32;\n                gBattle_BG1_Y = -(sprite->y + sprite->y2) + 32;\n            }\n            else\n            {\n                data[14] = gBattle_BG2_X;\n                data[13] = gBattle_BG2_Y;\n                gBattle_BG2_X = -(sprite->x + sprite->x2) + 32;\n                gBattle_BG2_Y = -(sprite->y + sprite->y2) + 32;\n            }\n            ++data[15];\n        }\n        break;\n    case 1:\n        {\n            u32 battlerIdAlt = battlerId;\n            bool32 v6Alt = isOnBg2;\n\n            MoveBattlerSpriteToBG(battlerIdAlt, v6Alt);\n        }\n        ++data[15];\n        break;\n    case 2:\n        PlaySE(SE_RS_SHOP);\n        if (IsMonGettingExpSentOut())\n            CreateLevelUpVerticalSpritesTask(sprite->x + sprite->x2,\n                        sprite->y + sprite->y2,\n                        10000,\n                        10000,\n                        1,\n                        0);\n        ++data[15];\n        break;\n    case 3:\n        if (!LevelUpVerticalSpritesTaskIsRunning())\n        {\n            sprite->invisible = FALSE;\n            ++data[15];\n        }\n        break;\n    case 5:\n        ResetBattleAnimBg(isOnBg2);\n        ++data[15];\n        break;\n    case 4:\n        ++data[15];\n        break;\n    case 6:\n        if (!isOnBg2)\n        {\n            gBattle_BG1_X = data[14];\n            gBattle_BG1_Y = data[13];\n        }\n        else\n        {\n            gBattle_BG2_X = data[14];\n            gBattle_BG2_Y = data[13];\n        }\n        gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter;\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void FreeMonSpriteAfterFaintAnim(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].y + gSprites[gBattlerSpriteIds[gActiveBattler]].y2 > DISPLAY_HEIGHT)\n    {\n        FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        PlayerBufferExecCompleted();\n    }\n}\n\nstatic void FreeMonSpriteAfterSwitchOutAnim(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n    {\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        PlayerBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnInactiveTextPrinter2(void)\n{\n    if (!IsTextPrinterActive(0))\n        PlayerBufferExecCompleted();\n}\n\nstatic void OpenPartyMenuToChooseMon(void)\n{\n    if (!gPaletteFade.active)\n    {\n        u8 caseId;\n\n        gBattlerControllerFuncs[gActiveBattler] = WaitForMonSelection;\n        caseId = gTasks[gBattleControllerData[gActiveBattler]].data[0];\n        DestroyTask(gBattleControllerData[gActiveBattler]);\n        FreeAllWindowBuffers();\n        OpenPartyMenuInTutorialBattle(caseId);\n    }\n}\n\nstatic void WaitForMonSelection(void)\n{\n    if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)\n    {\n        if (gPartyMenuUseExitCallback == TRUE)\n            BtlController_EmitChosenMonReturnValue(1, gSelectedMonPartyId, gBattlePartyCurrentOrder);\n        else\n            BtlController_EmitChosenMonReturnValue(1, 6, NULL);\n        if ((gBattleBufferA[gActiveBattler][1] & 0xF) == 1)\n            PrintLinkStandbyMsg();\n        PlayerBufferExecCompleted();\n    }\n}\n\nstatic void OpenBagAndChooseItem(void)\n{\n    if (!gPaletteFade.active)\n    {\n        gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChoseItem;\n        ReshowBattleScreenDummy();\n        FreeAllWindowBuffers();\n        CB2_BagMenuFromBattle();\n    }\n}\n\nstatic void CompleteWhenChoseItem(void)\n{\n    if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)\n    {\n        BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId);\n        PlayerBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnSpecialAnimDone(void)\n{\n    if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        PlayerBufferExecCompleted();\n}\n\nstatic void DoHitAnimBlinkSpriteEffect(void)\n{\n    u8 spriteId = gBattlerSpriteIds[gActiveBattler];\n\n    if (gSprites[spriteId].data[1] == 32)\n    {\n        gSprites[spriteId].data[1] = 0;\n        gSprites[spriteId].invisible = FALSE;\n        gDoingBattleAnim = FALSE;\n        PlayerBufferExecCompleted();\n    }\n    else\n    {\n        if ((gSprites[spriteId].data[1] % 4) == 0)\n            gSprites[spriteId].invisible ^= 1;\n        ++gSprites[spriteId].data[1];\n    }\n}\n\nstatic void MoveSelectionDisplayMoveNames(void)\n{\n    s32 i;\n    struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]);\n    gNumberOfMovesToChoose = 0;\n\n    for (i = 0; i < MAX_MON_MOVES; ++i)\n    {\n        MoveSelectionDestroyCursorAt(i);\n        StringCopy(gDisplayedStringBattle, gText_MoveInterfaceDynamicColors);\n        StringAppend(gDisplayedStringBattle, gMoveNames[moveInfo->moves[i]]);\n        BattlePutTextOnWindow(gDisplayedStringBattle, i + 3);\n        if (moveInfo->moves[i] != MOVE_NONE)\n            ++gNumberOfMovesToChoose;\n    }\n}\n\nstatic void MoveSelectionDisplayPpString(void)\n{\n    StringCopy(gDisplayedStringBattle, gText_MoveInterfacePP);\n    BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_PP);\n}\n\nstatic void MoveSelectionDisplayPpNumber(void)\n{\n    u8 *txtPtr;\n    struct ChooseMoveStruct *moveInfo;\n\n    if (gBattleBufferA[gActiveBattler][2] == TRUE) // check if we didn't want to display pp number\n        return;\n    SetPpNumbersPaletteInMoveSelection();\n    moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]);\n    txtPtr = ConvertIntToDecimalStringN(gDisplayedStringBattle, moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]], STR_CONV_MODE_RIGHT_ALIGN, 2);\n    *txtPtr = CHAR_SLASH;\n    ConvertIntToDecimalStringN(++txtPtr, moveInfo->maxPp[gMoveSelectionCursor[gActiveBattler]], STR_CONV_MODE_RIGHT_ALIGN, 2);\n    BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_PP_REMAINING);\n}\n\nstatic void MoveSelectionDisplayMoveType(void)\n{\n    u8 *txtPtr;\n    struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]);\n    u16 move = moveInfo->moves[gMoveSelectionCursor[gActiveBattler]];\n    const u8 *strPtr;\n\n    txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType);\n    *txtPtr++ = EXT_CTRL_CODE_BEGIN;\n    *txtPtr++ = 6;\n    *txtPtr++ = 1;\n    txtPtr = StringCopy(txtPtr, gText_MoveInterfaceDynamicColors);\n    switch(move)\n    {\n        case MOVE_HIDDEN_POWER:\n        {\n            strPtr = gTypeNames[GetHiddenPowerType(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]])];\n            break;\n        }\n        case MOVE_WEATHER_BALL:\n        {\n            strPtr = gTypeNames[GetWeatherBallType()];\n            break;\n        }\n        case MOVE_NATURE_POWER:\n        {\n            strPtr = gTypeNames[gBattleMoves[gNaturePowerMoves[gBattleTerrain]].type];\n            break;\n        }\n        default:\n        {\n            strPtr = gTypeNames[gBattleMoves[move].type];\n            break;\n        }\n    }\n    StringCopy(txtPtr, strPtr);\n    BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MOVE_TYPE);\n}\n\nvoid MoveSelectionCreateCursorAt(u8 cursorPosition, u8 arg1)\n{\n    u16 src[2];\n\n    src[0] = arg1 + 1;\n    src[1] = arg1 + 2;\n    CopyToBgTilemapBufferRect_ChangePalette(0, src, 9 * (cursorPosition & 1) + 1, 55 + (cursorPosition & 2), 1, 2, 0x11);\n    CopyBgTilemapBufferToVram(0);\n}\n\nvoid MoveSelectionDestroyCursorAt(u8 cursorPosition)\n{\n    u16 src[2];\n\n    src[0] = 32;\n    src[1] = 32;\n    CopyToBgTilemapBufferRect_ChangePalette(0, src, 9 * (cursorPosition & 1) + 1, 55 + (cursorPosition & 2), 1, 2, 0x11);\n    CopyBgTilemapBufferToVram(0);\n}\n\nvoid ActionSelectionCreateCursorAt(u8 cursorPosition, u8 arg1)\n{\n    u16 src[2];\n\n    src[0] = 1;\n    src[1] = 2;\n    CopyToBgTilemapBufferRect_ChangePalette(0, src, 7 * (cursorPosition & 1) + 16, 35 + (cursorPosition & 2), 1, 2, 0x11);\n    CopyBgTilemapBufferToVram(0);\n}\n\nvoid ActionSelectionDestroyCursorAt(u8 cursorPosition)\n{\n    u16 src[2];\n\n    src[0] = 32;\n    src[1] = 32;\n    CopyToBgTilemapBufferRect_ChangePalette(0, src, 7 * (cursorPosition & 1) + 16, 35 + (cursorPosition & 2), 1, 2, 0x11);\n    CopyBgTilemapBufferToVram(0);\n}\n\nvoid SetCB2ToReshowScreenAfterMenu(void)\n{\n    SetMainCallback2(ReshowBattleScreenAfterMenu);\n}\n\nvoid SetCB2ToReshowScreenAfterMenu2(void)\n{\n    SetMainCallback2(ReshowBattleScreenAfterMenu);\n}\n\nstatic void CompleteOnFinishedStatusAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)\n        PlayerBufferExecCompleted();\n}\n\nstatic void CompleteOnFinishedBattleAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)\n        PlayerBufferExecCompleted();\n}\n\nstatic void PrintLinkStandbyMsg(void)\n{\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        gBattle_BG0_X = 0;\n        gBattle_BG0_Y = 0;\n        BattlePutTextOnWindow(gText_LinkStandby, B_WIN_MSG);\n    }\n}\n\nstatic void PlayerHandleGetMonData(void)\n{\n    u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data\n    u32 size = 0;\n    u8 monToCheck;\n    s32 i;\n\n    if (gBattleBufferA[gActiveBattler][2] == 0)\n    {\n        size += CopyPlayerMonData(gBattlerPartyIndexes[gActiveBattler], monData);\n    }\n    else\n    {\n        monToCheck = gBattleBufferA[gActiveBattler][2];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (monToCheck & 1)\n                size += CopyPlayerMonData(i, monData + size);\n            monToCheck >>= 1;\n        }\n    }\n    BtlController_EmitDataTransfer(BUFFER_B, size, monData);\n    PlayerBufferExecCompleted();\n}\n\nstatic u32 CopyPlayerMonData(u8 monId, u8 *dst)\n{\n    struct BattlePokemon battleMon;\n    struct MovePpInfo moveData;\n    u8 nickname[20];\n    u8 *src;\n    s16 data16;\n    u32 data32;\n    s32 size = 0;\n\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case REQUEST_ALL_BATTLE:\n        battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);\n        battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM);\n        for (size = 0; size < MAX_MON_MOVES; ++size)\n        {\n            battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);\n            battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);\n        }\n        battleMon.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);\n        battleMon.friendship = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP);\n        battleMon.experience = GetMonData(&gPlayerParty[monId], MON_DATA_EXP);\n        battleMon.hpIV = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV);\n        battleMon.attackIV = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV);\n        battleMon.defenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV);\n        battleMon.speedIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV);\n        battleMon.spAttackIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV);\n        battleMon.spDefenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV);\n        battleMon.personality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY);\n        battleMon.status1 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS);\n        battleMon.level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);\n        battleMon.hp = GetMonData(&gPlayerParty[monId], MON_DATA_HP);\n        battleMon.maxHP = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP);\n        battleMon.attack = GetMonData(&gPlayerParty[monId], MON_DATA_ATK);\n        battleMon.defense = GetMonData(&gPlayerParty[monId], MON_DATA_DEF);\n        battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED);\n        battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK);\n        battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF);\n        battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG);\n        battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM);\n        battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID);\n        GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname);\n        StringCopy_Nickname(battleMon.nickname, nickname);\n        GetMonData(&gPlayerParty[monId], MON_DATA_OT_NAME, battleMon.otName);\n        src = (u8 *)&battleMon;\n        for (size = 0; size < sizeof(battleMon); ++size)\n            dst[size] = src[size];\n        break;\n    case REQUEST_SPECIES_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_HELDITEM_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_MOVES_PP_BATTLE:\n        for (size = 0; size < MAX_MON_MOVES; ++size)\n        {\n            moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);\n            moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);\n        }\n        moveData.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);\n        src = (u8 *)(&moveData);\n        for (size = 0; size < sizeof(moveData); ++size)\n            dst[size] = src[size];\n        break;\n    case REQUEST_MOVE1_BATTLE:\n    case REQUEST_MOVE2_BATTLE:\n    case REQUEST_MOVE3_BATTLE:\n    case REQUEST_MOVE4_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_PP_DATA_BATTLE:\n        for (size = 0; size < MAX_MON_MOVES; ++size)\n            dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);\n        dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);\n        ++size;\n        break;\n    case REQUEST_PPMOVE1_BATTLE:\n    case REQUEST_PPMOVE2_BATTLE:\n    case REQUEST_PPMOVE3_BATTLE:\n    case REQUEST_PPMOVE4_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);\n        size = 1;\n        break;\n    case REQUEST_OTID_BATTLE:\n        data32 = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        size = 3;\n        break;\n    case REQUEST_EXP_BATTLE:\n        data32 = GetMonData(&gPlayerParty[monId], MON_DATA_EXP);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        size = 3;\n        break;\n    case REQUEST_HP_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_EV);\n        size = 1;\n        break;\n    case REQUEST_ATK_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV);\n        size = 1;\n        break;\n    case REQUEST_DEF_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV);\n        size = 1;\n        break;\n    case REQUEST_SPEED_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV);\n        size = 1;\n        break;\n    case REQUEST_SPATK_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV);\n        size = 1;\n        break;\n    case REQUEST_SPDEF_EV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV);\n        size = 1;\n        break;\n    case REQUEST_FRIENDSHIP_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP);\n        size = 1;\n        break;\n    case REQUEST_POKERUS_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKERUS);\n        size = 1;\n        break;\n    case REQUEST_MET_LOCATION_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION);\n        size = 1;\n        break;\n    case REQUEST_MET_LEVEL_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL);\n        size = 1;\n        break;\n    case REQUEST_MET_GAME_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME);\n        size = 1;\n        break;\n    case REQUEST_POKEBALL_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL);\n        size = 1;\n        break;\n    case REQUEST_ALL_IVS_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV);\n        dst[1] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV);\n        dst[2] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV);\n        dst[3] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV);\n        dst[4] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV);\n        dst[5] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV);\n        size = 6;\n        break;\n    case REQUEST_HP_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV);\n        size = 1;\n        break;\n    case REQUEST_ATK_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV);\n        size = 1;\n        break;\n    case REQUEST_DEF_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV);\n        size = 1;\n        break;\n    case REQUEST_SPEED_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV);\n        size = 1;\n        break;\n    case REQUEST_SPATK_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV);\n        size = 1;\n        break;\n    case REQUEST_SPDEF_IV_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV);\n        size = 1;\n        break;\n    case REQUEST_PERSONALITY_BATTLE:\n        data32 = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        dst[3] = (data32 & 0xFF000000) >> 24;\n        size = 4;\n        break;\n    case REQUEST_CHECKSUM_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_STATUS_BATTLE:\n        data32 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        dst[3] = (data32 & 0xFF000000) >> 24;\n        size = 4;\n        break;\n    case REQUEST_LEVEL_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);\n        size = 1;\n        break;\n    case REQUEST_HP_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HP);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_MAX_HP_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_ATK_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_ATK);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_DEF_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_DEF);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPEED_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPATK_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPDEF_BATTLE:\n        data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_COOL_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL);\n        size = 1;\n        break;\n    case REQUEST_BEAUTY_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY);\n        size = 1;\n        break;\n    case REQUEST_CUTE_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE);\n        size = 1;\n        break;\n    case REQUEST_SMART_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART);\n        size = 1;\n        break;\n    case REQUEST_TOUGH_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH);\n        size = 1;\n        break;\n    case REQUEST_SHEEN_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SHEEN);\n        size = 1;\n        break;\n    case REQUEST_COOL_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_BEAUTY_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_CUTE_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_SMART_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_TOUGH_RIBBON_BATTLE:\n        dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON);\n        size = 1;\n        break;\n    }\n    return size;\n}\n\nvoid PlayerHandleGetRawMonData(void)\n{\n    struct BattlePokemon battleMon;\n    u8 *src = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];\n    u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBattler][1];\n    u32 i;\n\n    for (i = 0; i < gBattleBufferA[gActiveBattler][2]; ++i)\n        dst[i] = src[i];\n\n    BtlController_EmitDataTransfer(BUFFER_B, gBattleBufferA[gActiveBattler][2], dst);\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleSetMonData(void)\n{\n    u8 monToCheck;\n    u32 i;\n\n    if (gBattleBufferA[gActiveBattler][2] == 0)\n    {\n        SetPlayerMonData(gBattlerPartyIndexes[gActiveBattler]);\n    }\n    else\n    {\n        monToCheck = gBattleBufferA[gActiveBattler][2];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (monToCheck & 1)\n                SetPlayerMonData(i);\n            monToCheck >>= 1;\n        }\n    }\n    PlayerBufferExecCompleted();\n}\n\nstatic void SetPlayerMonData(u8 monId)\n{\n    struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];\n    struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];\n    s32 i;\n\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case REQUEST_ALL_BATTLE:\n        {\n            u8 iv;\n\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species);\n            SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);\n            for (i = 0; i < MAX_MON_MOVES; ++i)\n            {\n                SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);\n                SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);\n            }\n            SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses);\n            SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship);\n            SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &battlePokemon->experience);\n            iv = battlePokemon->hpIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &iv);\n            iv = battlePokemon->attackIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &iv);\n            iv = battlePokemon->defenseIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &iv);\n            iv = battlePokemon->speedIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &iv);\n            iv = battlePokemon->spAttackIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &iv);\n            iv = battlePokemon->spDefenseIV;\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &iv);\n            SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality);\n            SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &battlePokemon->status1);\n            SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &battlePokemon->level);\n            SetMonData(&gPlayerParty[monId], MON_DATA_HP, &battlePokemon->hp);\n            SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP);\n            SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &battlePokemon->attack);\n            SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &battlePokemon->defense);\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &battlePokemon->speed);\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack);\n            SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense);\n        }\n        break;\n    case REQUEST_SPECIES_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HELDITEM_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MOVES_PP_BATTLE:\n        for (i = 0; i < MAX_MON_MOVES; ++i)\n        {\n            SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);\n            SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);\n        }\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses);\n        break;\n    case REQUEST_MOVE1_BATTLE:\n    case REQUEST_MOVE2_BATTLE:\n    case REQUEST_MOVE3_BATTLE:\n    case REQUEST_MOVE4_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_PP_DATA_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);\n        break;\n    case REQUEST_PPMOVE1_BATTLE:\n    case REQUEST_PPMOVE2_BATTLE:\n    case REQUEST_PPMOVE3_BATTLE:\n    case REQUEST_PPMOVE4_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_OTID_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_EXP_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HP_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_EV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_FRIENDSHIP_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_POKERUS_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_LOCATION_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_LEVEL_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_GAME_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_POKEBALL_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ALL_IVS_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);\n        break;\n    case REQUEST_HP_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_IV_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_PERSONALITY_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CHECKSUM_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_STATUS_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_LEVEL_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HP_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MAX_HP_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_COOL_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_BEAUTY_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CUTE_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SMART_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_TOUGH_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SHEEN_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_COOL_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_BEAUTY_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CUTE_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SMART_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_TOUGH_RIBBON_BATTLE:\n        SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    }\n    HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n}\n\nstatic void PlayerHandleSetRawMonData(void)\n{\n    u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];\n    u32 i;\n\n    for (i = 0; i < gBattleBufferA[gActiveBattler][2]; ++i)\n        dst[i] = gBattleBufferA[gActiveBattler][3 + i];\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleLoadMonSprite(void)\n{\n    BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpritePosX_0;\n}\n\nstatic void PlayerHandleSwitchInAnim(void)\n{\n    ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]);\n    gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1];\n    BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n    gActionSelectionCursor[gActiveBattler] = 0;\n    gMoveSelectionCursor[gActiveBattler] = 0;\n    StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]);\n    gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnimShowHealthbox;\n}\n\nstatic void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit)\n{\n    u16 species;\n\n    ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit);\n    gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];\n    species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n    gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim);\n    SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));\n    gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2),\n                                                GetBattlerSpriteDefault_Y(battlerId),\n                                                GetBattlerSpriteSubpriority(battlerId));\n    gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId];\n    gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;\n    gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;\n    gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);\n    gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;\n    gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;\n    gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT);\n}\n\nstatic void PlayerHandleReturnMonToBall(void)\n{\n    if (gBattleBufferA[gActiveBattler][1] == 0)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n        gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;\n    }\n    else\n    {\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        PlayerBufferExecCompleted();\n    }\n}\n\nstatic void DoSwitchOutAnimation(void)\n{\n    switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)\n    {\n    case 0:\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;\n        break;\n    case 1:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON);\n            gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim;\n        }\n        break;\n    }\n}\n\nstatic void PlayerHandleDrawTrainerPic(void)\n{\n    s16 xPos;\n    u32 trainerPicId;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n    {\n        if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != B_FLANK_LEFT) // Second mon, on the right.\n            xPos = 90;\n        else // First mon, on the left.\n            xPos = 32;\n\n    }\n    else\n    {\n        xPos = 80;\n    }\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_RUBY\n         || (gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_SAPPHIRE)\n            trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN;\n        else if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_EMERALD)\n            trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_EMERALD_BRENDAN;\n        else\n            trainerPicId = gLinkPlayers[GetMultiplayerId()].gender;\n    }\n    else\n    {\n        trainerPicId = gSaveBlock2Ptr->playerGender;\n    }\n    DecompressTrainerBackPalette(trainerPicId, gActiveBattler);\n    SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));\n    gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                     xPos,\n                                                     (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80,\n                                                     GetBattlerSpriteSubpriority(gActiveBattler));\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;\n    if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -240;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn;\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;\n}\n\nstatic void PlayerHandleTrainerSlide(void)\n{\n    u32 trainerPicId;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_RUBY\n         || (gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_SAPPHIRE)\n            trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + 2;\n        else if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_EMERALD)\n            trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + 6;\n        else\n            trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + 0;\n    }\n    else\n    {\n        trainerPicId = gSaveBlock2Ptr->playerGender + 0;\n    }\n    DecompressTrainerBackPalette(trainerPicId, gActiveBattler);\n    SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));\n    gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                     80,\n                                                     (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80,\n                                                     30);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -96;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn;\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy2;\n}\n\nstatic void PlayerHandleTrainerSlideBack(void)\n{\n    SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;\n    StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);\n    gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide;\n}\n\nstatic void PlayerHandleFaintAnimation(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0)\n    {\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState;\n    }\n    else\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n            PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER);\n            gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;\n            gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5;\n            gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim;\n            gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim;\n        }\n    }\n}\n\nstatic void PlayerHandlePaletteFade(void)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK);\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleSuccessBallThrowAnim(void)\n{\n    gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;\n    gDoingBattleAnim = TRUE;\n    InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;\n}\n\nstatic void PlayerHandleBallThrowAnim(void)\n{\n    u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1];\n\n    gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;\n    gDoingBattleAnim = TRUE;\n    InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;\n}\n\nstatic void PlayerHandlePause(void)\n{\n    u8 var = gBattleBufferA[gActiveBattler][1];\n\n    while (var)\n        --var;\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleMoveAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);\n\n        gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];\n        gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);\n        gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);\n        gAnimFriendship = gBattleBufferA[gActiveBattler][10];\n        gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);\n        gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];\n        gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;\n        if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // Always returns FALSE.\n        {\n            PlayerBufferExecCompleted();\n        }\n        else\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            gBattlerControllerFuncs[gActiveBattler] = PlayerDoMoveAnimation;\n        }\n    }\n}\n\nstatic void PlayerDoMoveAnimation(void)\n{\n    u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);\n    u8 multihit = gBattleBufferA[gActiveBattler][11];\n\n    switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)\n    {\n    case 0:\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute\n         && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8)\n        {\n            gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1;\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        }\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;\n        break;\n    case 1:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF);\n            DoMoveAnim(move);\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;\n        }\n        break;\n    case 2:\n        gAnimScriptCallback();\n        if (!gAnimScriptActive)\n        {\n            SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL);\n            if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2)\n            {\n                InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);\n                gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0;\n            }\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;\n        }\n        break;\n    case 3:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            CopyAllBattleSpritesInvisibilities();\n            TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            PlayerBufferExecCompleted();\n        }\n        break;\n    }\n}\n\nstatic void PlayerHandlePrintString(void)\n{\n    u16 *stringId;\n\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]);\n    BufferStringBattle(*stringId);\n    if (BattleStringShouldBeColored(*stringId))\n        BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT));\n    else\n        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter2;\n}\n\nstatic void PlayerHandlePrintSelectionString(void)\n{\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        PlayerHandlePrintString();\n    else\n        PlayerBufferExecCompleted();\n}\n\nstatic void HandleChooseActionAfterDma3(void)\n{\n    if (!IsDma3ManagerBusyWithBgCopy())\n    {\n        gBattle_BG0_X = 0;\n        gBattle_BG0_Y = 160;\n        gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction;\n    }\n}\n\nstatic void PlayerHandleChooseAction(void)\n{\n    s32 i;\n\n    gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3;\n    BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG);\n    BattlePutTextOnWindow(gText_BattleMenu, B_WIN_ACTION_MENU);\n    for (i = 0; i < 4; ++i)\n        ActionSelectionDestroyCursorAt(i);\n    ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n    BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo);\n    BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_ACTION_PROMPT);\n}\n\nstatic void PlayerHandleUnknownYesNoBox(void)\n{\n}\n\nstatic void HandleChooseMoveAfterDma3(void)\n{\n    if (!IsDma3ManagerBusyWithBgCopy())\n    {\n        gBattle_BG0_X = 0;\n        gBattle_BG0_Y = 320;\n        gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove;\n    }\n}\n\nstatic void PlayerHandleChooseMove(void)\n{\n    InitMoveSelectionsVarsAndStrings();\n    gBattlerControllerFuncs[gActiveBattler] = HandleChooseMoveAfterDma3;\n}\n\nvoid InitMoveSelectionsVarsAndStrings(void)\n{\n    MoveSelectionDisplayMoveNames();\n    gMultiUsePlayerCursor = 0xFF;\n    MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);\n    MoveSelectionDisplayPpString();\n    MoveSelectionDisplayPpNumber();\n    MoveSelectionDisplayMoveType();\n}\n\nstatic void PlayerHandleChooseItem(void)\n{\n    s32 i;\n\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n    gBattlerControllerFuncs[gActiveBattler] = OpenBagAndChooseItem;\n    gBattlerInMenuId = gActiveBattler;\n    for (i = 0; i < 3; ++i)\n        gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][1 + i];\n}\n\nstatic void PlayerHandleChoosePokemon(void)\n{\n    s32 i;\n\n    gBattleControllerData[gActiveBattler] = CreateTask(TaskDummy, 0xFF);\n    gTasks[gBattleControllerData[gActiveBattler]].data[0] = gBattleBufferA[gActiveBattler][1] & 0xF;\n    *(&gBattleStruct->battlerPreventingSwitchout) = gBattleBufferA[gActiveBattler][1] >> 4;\n    *(&gBattleStruct->playerPartyIdx) = gBattleBufferA[gActiveBattler][2];\n    *(&gBattleStruct->abilityPreventingSwitchout) = gBattleBufferA[gActiveBattler][3];\n    for (i = 0; i < 3; ++i)\n        gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][4 + i];\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n    gBattlerControllerFuncs[gActiveBattler] = OpenPartyMenuToChooseMon;\n    gBattlerInMenuId = gActiveBattler;\n}\n\nstatic void PlayerHandleCmd23(void)\n{\n    BattleStopLowHpSound();\n    BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK);\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleHealthBarUpdate(void)\n{\n    s16 hpVal;\n\n    LoadBattleBarGfx(0);\n    hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n    if (hpVal != INSTANT_HP_BAR_DROP)\n    {\n        u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);\n        u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);\n\n        SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);\n    }\n    else\n    {\n        u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);\n\n        SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);\n        UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], 0, HP_CURRENT);\n    }\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;\n}\n\nstatic void PlayerHandleExpUpdate(void)\n{\n    u8 monId = gBattleBufferA[gActiveBattler][1];\n\n    if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_LEVEL)\n    {\n        PlayerBufferExecCompleted();\n    }\n    else\n    {\n        s16 expPointsToGive;\n        u8 taskId;\n\n        LoadBattleBarGfx(1);\n        GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);  // Unused return value.\n        expPointsToGive = T1_READ_16(&gBattleBufferA[gActiveBattler][2]);\n        taskId = CreateTask(Task_GiveExpToMon, 10);\n        gTasks[taskId].tExpTask_monId = monId;\n        gTasks[taskId].tExpTask_gainedExp = expPointsToGive;\n        gTasks[taskId].tExpTask_battler = gActiveBattler;\n        gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy;\n    }\n}\n\nstatic void PlayerHandleStatusIconUpdate(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u8 battlerId;\n\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON);\n        battlerId = gActiveBattler;\n        gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = FALSE;\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;\n    }\n}\n\nstatic void PlayerHandleStatusAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1],\n                                           gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24));\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;\n    }\n}\n\nstatic void PlayerHandleStatusXor(void)\n{\n    u8 val = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_STATUS) ^ gBattleBufferA[gActiveBattler][1];\n\n    SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_STATUS, &val);\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleDataTransfer(void)\n{\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleDMA3Transfer(void)\n{\n    u32 dstArg = gBattleBufferA[gActiveBattler][1]\n               | (gBattleBufferA[gActiveBattler][2] << 8)\n               | (gBattleBufferA[gActiveBattler][3] << 16)\n               | (gBattleBufferA[gActiveBattler][4] << 24);\n    u16 sizeArg = gBattleBufferA[gActiveBattler][5] | (gBattleBufferA[gActiveBattler][6] << 8);\n    const u8 *src = &gBattleBufferA[gActiveBattler][7];\n    u8 *dst = (u8 *)(dstArg);\n    u32 size = sizeArg;\n\n    while (TRUE)\n    {\n        if (size <= 0x1000)\n        {\n            DmaCopy16(3, src, dst, size);\n            break;\n        }\n        DmaCopy16(3, src, dst, 0x1000);\n        src += 0x1000;\n        dst += 0x1000;\n        size -= 0x1000;\n    }\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandlePlayBGM(void)\n{\n    PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleCmd32(void)\n{\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleTwoReturnValues(void)\n{\n    BtlController_EmitTwoReturnValues(1, 0, 0);\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleChosenMonReturnValue(void)\n{\n    BtlController_EmitChosenMonReturnValue(1, 0, NULL);\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleOneReturnValue(void)\n{\n    BtlController_EmitOneReturnValue(1, 0);\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleOneReturnValue_Duplicate(void)\n{\n    BtlController_EmitOneReturnValue_Duplicate(1, 0);\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleCmd37(void)\n{\n    gUnusedControllerStruct.unk = 0;\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleCmd38(void)\n{\n    gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1];\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleCmd39(void)\n{\n    gUnusedControllerStruct.flag = 0;\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleCmd40(void)\n{\n    gUnusedControllerStruct.flag ^= 1;\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleHitAnimation(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)\n    {\n        PlayerBufferExecCompleted();\n    }\n    else\n    {\n        gDoingBattleAnim = TRUE;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;\n        DoHitAnimHealthboxEffect(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;\n    }\n}\n\nstatic void PlayerHandleCmd42(void)\n{\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandlePlaySE(void)\n{\n    s8 pan;\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        pan = SOUND_PAN_ATTACKER;\n    else\n        pan = SOUND_PAN_TARGET;\n    PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandlePlayFanfare(void)\n{\n    PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleFaintingCry(void)\n{\n    PlayCry_ByMode(GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES), -25, CRY_MODE_FAINT);\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleIntroSlide(void)\n{\n    HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);\n    gIntroSlideFlags |= 1;\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleIntroTrainerBallThrow(void)\n{\n    u8 paletteNum;\n    u8 taskId;\n\n    SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = PlayerThrowBall_StartAnimLinearTranslation;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;\n    StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite);\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);\n    paletteNum = AllocSpritePalette(0xD6F8);\n    LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2Ptr->playerGender].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum;\n    taskId = CreateTask(Task_StartSendOutAnim, 5);\n    gTasks[taskId].data[0] = gActiveBattler;\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)\n        gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;\n    gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;\n    gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy;\n}\n\nvoid SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite)\n{\n    u8 battlerId = sprite->data[5];\n\n    FreeSpriteOamMatrix(sprite);\n    FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum));\n    DestroySprite(sprite);\n    BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId);\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], 0);\n}\n\nstatic void Task_StartSendOutAnim(u8 taskId)\n{\n    if (gTasks[taskId].data[1] < 31)\n    {\n        ++gTasks[taskId].data[1];\n    }\n    else\n    {\n        u8 savedActiveBattler = gActiveBattler;\n\n        gActiveBattler = gTasks[taskId].data[0];\n        if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI))\n        {\n            gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n            StartSendOutAnim(gActiveBattler, FALSE);\n        }\n        else\n        {\n            gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n            StartSendOutAnim(gActiveBattler, FALSE);\n            gActiveBattler ^= BIT_FLANK;\n            gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n            BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n            StartSendOutAnim(gActiveBattler, FALSE);\n            gActiveBattler ^= BIT_FLANK;\n        }\n        gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox;\n        gActiveBattler = savedActiveBattler;\n        DestroyTask(taskId);\n    }\n}\n\nstatic void PlayerHandleDrawPartyStatusSummary(void)\n{\n    if (gBattleBufferA[gActiveBattler][1] && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n    {\n        PlayerBufferExecCompleted();\n    }\n    else\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = TRUE;\n        gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0;\n        if (gBattleBufferA[gActiveBattler][2] != 0)\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93;\n        gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary;\n    }\n}\n\nstatic void EndDrawPartyStatusSummary(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 0x5C)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0;\n        PlayerBufferExecCompleted();\n    }\n}\n\nstatic void PlayerHandleHidePartyStatusSummary(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)\n        gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleEndBounceEffect(void)\n{\n    EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX);\n    EndBounceEffect(gActiveBattler, BOUNCE_MON);\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleSpriteInvisibility(void)\n{\n    if (IsBattlerSpritePresent(gActiveBattler))\n    {\n        gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1];\n        CopyBattleSpriteInvisibility(gActiveBattler);\n    }\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleBattleAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u8 animationId = gBattleBufferA[gActiveBattler][1];\n        u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n\n        if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))\n            PlayerBufferExecCompleted();\n        else\n            gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;\n    }\n}\n\nstatic void PlayerHandleLinkStandbyMsg(void)\n{\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case 0:\n        PrintLinkStandbyMsg();\n        // fall through\n    case 1:\n        EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX);\n        EndBounceEffect(gActiveBattler, BOUNCE_MON);\n        break;\n    case 2:\n        PrintLinkStandbyMsg();\n        break;\n    }\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleResetActionMoveSelection(void)\n{\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case RESET_ACTION_MOVE_SELECTION:\n        gActionSelectionCursor[gActiveBattler] = 0;\n        gMoveSelectionCursor[gActiveBattler] = 0;\n        break;\n    case RESET_ACTION_SELECTION:\n        gActionSelectionCursor[gActiveBattler] = 0;\n        break;\n    case RESET_MOVE_SELECTION:\n        gMoveSelectionCursor[gActiveBattler] = 0;\n        break;\n    }\n    PlayerBufferExecCompleted();\n}\n\nstatic void PlayerHandleCmd55(void)\n{\n    gBattleOutcome = gBattleBufferA[gActiveBattler][1];\n    FadeOutMapMusic(5);\n    BeginFastPaletteFade(3);\n    PlayerBufferExecCompleted();\n    gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks;\n}\n\nstatic void PlayerCmdEnd(void)\n{\n}\n\nstatic void PreviewDeterminativeMoveTargets(void)\n{\n    u32 bitMask = 0;\n    u8 startY = 0;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n    {\n        u8 moveTarget;\n        struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]);\n        u16 move = moveInfo->moves[gMoveSelectionCursor[gActiveBattler]];\n\n        if (move == MOVE_CURSE)\n        {\n            if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST)\n                moveTarget = MOVE_TARGET_USER;\n            else\n                moveTarget = MOVE_TARGET_SELECTED;\n        }\n        else\n        {\n            moveTarget = gBattleMoves[moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]].target;\n        }\n        switch (moveTarget)\n        {\n        case MOVE_TARGET_SELECTED:\n        case MOVE_TARGET_DEPENDS:\n        case MOVE_TARGET_USER_OR_SELECTED:\n        case MOVE_TARGET_RANDOM:\n            bitMask = 0xF0000;\n            startY = 0;\n            break;\n        case MOVE_TARGET_BOTH:\n        case MOVE_TARGET_OPPONENTS_FIELD:\n            bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]\n                     | gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]) << 16;\n            startY = 8;\n            break;\n        case MOVE_TARGET_USER:\n            switch (move)\n            {\n            case MOVE_HAZE:\n            case MOVE_SANDSTORM:\n            case MOVE_PERISH_SONG:\n            case MOVE_RAIN_DANCE:\n            case MOVE_SUNNY_DAY:\n            case MOVE_HAIL:\n            case MOVE_MUD_SPORT:\n            case MOVE_WATER_SPORT:\n                bitMask = 0xF0000;\n                break;\n            case MOVE_SAFEGUARD:\n            case MOVE_REFLECT:\n            case MOVE_LIGHT_SCREEN:\n            case MOVE_MIST:\n            case MOVE_HEAL_BELL:\n            case MOVE_AROMATHERAPY:\n                bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]\n                         | gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]) << 16;\n                break;\n            case MOVE_HELPING_HAND:\n                bitMask = (gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) << 16;\n                break;\n            default:\n                bitMask = (gBitTable[gActiveBattler]) << 16;\n                break;\n            }\n            startY = 8;\n            break;\n        case MOVE_TARGET_FOES_AND_ALLY:\n            bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]\n                     | gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]\n                     | gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]) << 16;\n            startY = 8;\n            break;\n        }\n        BeginNormalPaletteFade(bitMask, 8, startY, 0, RGB_WHITE);\n    }\n}\n"
  },
  {
    "path": "src/battle_controller_pokedude.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"party_menu.h\"\n#include \"pokeball.h\"\n#include \"data.h\"\n#include \"util.h\"\n#include \"m4a.h\"\n#include \"link.h\"\n#include \"event_data.h\"\n#include \"item_menu.h\"\n#include \"strings.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_controllers.h\"\n#include \"battle_interface.h\"\n#include \"battle_message.h\"\n#include \"reshow_battle_screen.h\"\n#include \"teachy_tv.h\"\n#include \"constants/songs.h\"\n#include \"constants/moves.h\"\n#include \"constants/pokemon.h\"\n\nstruct PokedudeTextScriptHeader\n{\n    u8 btlcmd;\n    u8 side;\n    u16 stringid;\n    void (*callback)(void);\n};\n\nstruct PokedudeBattlePartyInfo\n{\n    u8 side;\n    u8 level;\n    u16 species;\n    u16 moves[MAX_MON_MOVES];\n    u8 nature;\n    u8 gender;\n};\n\nstatic void PokedudeHandleGetMonData(void);\nstatic void PokedudeHandleGetRawMonData(void);\nstatic void PokedudeHandleSetMonData(void);\nstatic void PokedudeHandleSetRawMonData(void);\nstatic void PokedudeHandleLoadMonSprite(void);\nstatic void PokedudeHandleSwitchInAnim(void);\nstatic void PokedudeHandleReturnMonToBall(void);\nstatic void PokedudeHandleDrawTrainerPic(void);\nstatic void PokedudeHandleTrainerSlide(void);\nstatic void PokedudeHandleTrainerSlideBack(void);\nstatic void PokedudeHandleFaintAnimation(void);\nstatic void PokedudeHandlePaletteFade(void);\nstatic void PokedudeHandleSuccessBallThrowAnim(void);\nstatic void PokedudeHandleBallThrowAnim(void);\nstatic void PokedudeHandlePause(void);\nstatic void PokedudeHandleMoveAnimation(void);\nstatic void PokedudeHandlePrintString(void);\nstatic void PokedudeHandlePrintSelectionString(void);\nstatic void PokedudeHandleChooseAction(void);\nstatic void PokedudeHandleUnknownYesNoBox(void);\nstatic void PokedudeHandleChooseMove(void);\nstatic void PokedudeHandleChooseItem(void);\nstatic void PokedudeHandleChoosePokemon(void);\nstatic void PokedudeHandleCmd23(void);\nstatic void PokedudeHandleHealthBarUpdate(void);\nstatic void PokedudeHandleExpUpdate(void);\nstatic void PokedudeHandleStatusIconUpdate(void);\nstatic void PokedudeHandleStatusAnimation(void);\nstatic void PokedudeHandleStatusXor(void);\nstatic void PokedudeHandleDataTransfer(void);\nstatic void PokedudeHandleDMA3Transfer(void);\nstatic void PokedudeHandlePlayBGM(void);\nstatic void PokedudeHandleCmd32(void);\nstatic void PokedudeHandleTwoReturnValues(void);\nstatic void PokedudeHandleChosenMonReturnValue(void);\nstatic void PokedudeHandleOneReturnValue(void);\nstatic void PokedudeHandleOneReturnValue_Duplicate(void);\nstatic void PokedudeHandleCmd37(void);\nstatic void PokedudeHandleCmd38(void);\nstatic void PokedudeHandleCmd39(void);\nstatic void PokedudeHandleCmd40(void);\nstatic void PokedudeHandleHitAnimation(void);\nstatic void PokedudeHandleCmd42(void);\nstatic void PokedudeHandlePlaySE(void);\nstatic void PokedudeHandlePlayFanfare(void);\nstatic void PokedudeHandleFaintingCry(void);\nstatic void PokedudeHandleIntroSlide(void);\nstatic void PokedudeHandleIntroTrainerBallThrow(void);\nstatic void PokedudeHandleDrawPartyStatusSummary(void);\nstatic void PokedudeHandleHidePartyStatusSummary(void);\nstatic void PokedudeHandleEndBounceEffect(void);\nstatic void PokedudeHandleSpriteInvisibility(void);\nstatic void PokedudeHandleBattleAnimation(void);\nstatic void PokedudeHandleLinkStandbyMsg(void);\nstatic void PokedudeHandleResetActionMoveSelection(void);\nstatic void PokedudeHandleCmd55(void);\nstatic void PokedudeCmdEnd(void);\n\nstatic void PokedudeAction_PrintVoiceoverMessage(void);\nstatic void PokedudeAction_PrintMessageWithHealthboxPals(void);\nstatic void PokedudeBufferExecCompleted(void);\nstatic void PokedudeSimulateInputChooseAction(void);\nstatic void PokedudeBufferRunCommand(void);\nstatic bool8 HandlePokedudeVoiceoverEtc(void);\nstatic void PokedudeSimulateInputChooseMove(void);\nstatic void WaitForMonSelection(void);\nstatic void CompleteWhenChoseItem(void);\nstatic void Intro_WaitForShinyAnimAndHealthbox(void);\nstatic void Task_LaunchLvlUpAnim(u8 taskId);\nstatic void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId);\nstatic void CompleteOnInactiveTextPrinter2(void);\nstatic void Task_PrepareToGiveExpWithExpBar(u8 taskId);\nstatic void Task_GiveExpWithExpBar(u8 taskId);\nstatic void Task_UpdateLvlInHealthbox(u8 taskId);\nstatic u32 CopyPokedudeMonData(u8 monId, u8 *dst);\nstatic void SetPokedudeMonData(u8 monId);\nstatic void StartSendOutAnim(u8 battlerId);\nstatic void PokedudeDoMoveAnimation(void);\nstatic void Task_StartSendOutAnim(u8 taskId);\nstatic const u8 *GetPokedudeText(void);\n\nstatic void (*const sPokedudeBufferCommands[CONTROLLER_CMDS_COUNT])(void) =\n{\n    [CONTROLLER_GETMONDATA]               = PokedudeHandleGetMonData,\n    [CONTROLLER_GETRAWMONDATA]            = PokedudeHandleGetRawMonData,\n    [CONTROLLER_SETMONDATA]               = PokedudeHandleSetMonData,\n    [CONTROLLER_SETRAWMONDATA]            = PokedudeHandleSetRawMonData,\n    [CONTROLLER_LOADMONSPRITE]            = PokedudeHandleLoadMonSprite,\n    [CONTROLLER_SWITCHINANIM]             = PokedudeHandleSwitchInAnim,\n    [CONTROLLER_RETURNMONTOBALL]          = PokedudeHandleReturnMonToBall,\n    [CONTROLLER_DRAWTRAINERPIC]           = PokedudeHandleDrawTrainerPic,\n    [CONTROLLER_TRAINERSLIDE]             = PokedudeHandleTrainerSlide,\n    [CONTROLLER_TRAINERSLIDEBACK]         = PokedudeHandleTrainerSlideBack,\n    [CONTROLLER_FAINTANIMATION]           = PokedudeHandleFaintAnimation,\n    [CONTROLLER_PALETTEFADE]              = PokedudeHandlePaletteFade,\n    [CONTROLLER_SUCCESSBALLTHROWANIM]     = PokedudeHandleSuccessBallThrowAnim,\n    [CONTROLLER_BALLTHROWANIM]            = PokedudeHandleBallThrowAnim,\n    [CONTROLLER_PAUSE]                    = PokedudeHandlePause,\n    [CONTROLLER_MOVEANIMATION]            = PokedudeHandleMoveAnimation,\n    [CONTROLLER_PRINTSTRING]              = PokedudeHandlePrintString,\n    [CONTROLLER_PRINTSTRINGPLAYERONLY]    = PokedudeHandlePrintSelectionString,\n    [CONTROLLER_CHOOSEACTION]             = PokedudeHandleChooseAction,\n    [CONTROLLER_UNKNOWNYESNOBOX]          = PokedudeHandleUnknownYesNoBox,\n    [CONTROLLER_CHOOSEMOVE]               = PokedudeHandleChooseMove,\n    [CONTROLLER_OPENBAG]                  = PokedudeHandleChooseItem,\n    [CONTROLLER_CHOOSEPOKEMON]            = PokedudeHandleChoosePokemon,\n    [CONTROLLER_23]                       = PokedudeHandleCmd23,\n    [CONTROLLER_HEALTHBARUPDATE]          = PokedudeHandleHealthBarUpdate,\n    [CONTROLLER_EXPUPDATE]                = PokedudeHandleExpUpdate,\n    [CONTROLLER_STATUSICONUPDATE]         = PokedudeHandleStatusIconUpdate,\n    [CONTROLLER_STATUSANIMATION]          = PokedudeHandleStatusAnimation,\n    [CONTROLLER_STATUSXOR]                = PokedudeHandleStatusXor,\n    [CONTROLLER_DATATRANSFER]             = PokedudeHandleDataTransfer,\n    [CONTROLLER_DMA3TRANSFER]             = PokedudeHandleDMA3Transfer,\n    [CONTROLLER_PLAYBGM]                  = PokedudeHandlePlayBGM,\n    [CONTROLLER_32]                       = PokedudeHandleCmd32,\n    [CONTROLLER_TWORETURNVALUES]          = PokedudeHandleTwoReturnValues,\n    [CONTROLLER_CHOSENMONRETURNVALUE]     = PokedudeHandleChosenMonReturnValue,\n    [CONTROLLER_ONERETURNVALUE]           = PokedudeHandleOneReturnValue,\n    [CONTROLLER_ONERETURNVALUE_DUPLICATE] = PokedudeHandleOneReturnValue_Duplicate,\n    [CONTROLLER_CLEARUNKVAR]              = PokedudeHandleCmd37,\n    [CONTROLLER_SETUNKVAR]                = PokedudeHandleCmd38,\n    [CONTROLLER_CLEARUNKFLAG]             = PokedudeHandleCmd39,\n    [CONTROLLER_TOGGLEUNKFLAG]            = PokedudeHandleCmd40,\n    [CONTROLLER_HITANIMATION]             = PokedudeHandleHitAnimation,\n    [CONTROLLER_CANTSWITCH]               = PokedudeHandleCmd42,\n    [CONTROLLER_PLAYSE]                   = PokedudeHandlePlaySE,\n    [CONTROLLER_PLAYFANFARE]              = PokedudeHandlePlayFanfare,\n    [CONTROLLER_FAINTINGCRY]              = PokedudeHandleFaintingCry,\n    [CONTROLLER_INTROSLIDE]               = PokedudeHandleIntroSlide,\n    [CONTROLLER_INTROTRAINERBALLTHROW]    = PokedudeHandleIntroTrainerBallThrow,\n    [CONTROLLER_DRAWPARTYSTATUSSUMMARY]   = PokedudeHandleDrawPartyStatusSummary,\n    [CONTROLLER_HIDEPARTYSTATUSSUMMARY]   = PokedudeHandleHidePartyStatusSummary,\n    [CONTROLLER_ENDBOUNCE]                = PokedudeHandleEndBounceEffect,\n    [CONTROLLER_SPRITEINVISIBILITY]       = PokedudeHandleSpriteInvisibility,\n    [CONTROLLER_BATTLEANIMATION]          = PokedudeHandleBattleAnimation,\n    [CONTROLLER_LINKSTANDBYMSG]           = PokedudeHandleLinkStandbyMsg,\n    [CONTROLLER_RESETACTIONMOVESELECTION] = PokedudeHandleResetActionMoveSelection,\n    [CONTROLLER_ENDLINKBATTLE]            = PokedudeHandleCmd55,\n    [CONTROLLER_TERMINATOR_NOP]           = PokedudeCmdEnd,\n};\n\n// unknown unused data\nstatic const u8 sUnused[] = { 0x48, 0x48, 0x20, 0x5a, 0x50, 0x50, 0x50, 0x58 };\n\n#define pdHealthboxPal1  simulatedInputState[0]\n#define pdHealthboxPal2  simulatedInputState[1]\n#define pdScriptNum      simulatedInputState[2]\n#define pdMessageNo      simulatedInputState[3]\n\nstatic void PokedudeDummy(void)\n{\n}\n\nvoid SetControllerToPokedude(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = PokedudeBufferRunCommand;\n    *(&gBattleStruct->pdScriptNum) = gSpecialVar_0x8004;\n    gBattleStruct->pdMessageNo = 0;\n}\n\nstatic void PokedudeBufferRunCommand(void)\n{\n    if (gBattleControllerExecFlags & gBitTable[gActiveBattler])\n    {\n        if (gBattleBufferA[gActiveBattler][0] < NELEMS(sPokedudeBufferCommands))\n        {\n            if (!HandlePokedudeVoiceoverEtc())\n                sPokedudeBufferCommands[gBattleBufferA[gActiveBattler][0]]();\n        }\n        else\n        {\n            PokedudeBufferExecCompleted();\n        }\n    }\n}\n\nstatic void HandleInputChooseAction(void)\n{\n    PokedudeSimulateInputChooseAction();\n}\n\nstatic void CompleteOnBattlerSpriteCallbackDummy(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        PokedudeBufferExecCompleted();\n}\n\nstatic void CompleteOnBattlerSpritePosX_0(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded == TRUE\n        && gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0)\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim)\n        {\n            TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);\n        }\n        else if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n            FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n            FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n            PokedudeBufferExecCompleted();\n        }\n    }\n}\n\nstatic void CompleteOnInactiveTextPrinter(void)\n{\n    if (!IsTextPrinterActive(0))\n        PokedudeBufferExecCompleted();\n}\n\nstatic void Pokedude_SetBattleEndCallbacks(void)\n{\n    if (!gPaletteFade.active)\n    {\n        gMain.inBattle = FALSE;\n        gMain.callback1 = gPreBattleCallback1;\n        SetMainCallback2(gMain.savedCallback);\n    }\n}\n\nstatic void SwitchIn_HandleSoundAndEnd(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n    {\n        CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10);\n        HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n        PokedudeBufferExecCompleted();\n    }\n}\n\nstatic void SwitchIn_CleanShinyAnimShowSubstitute(void)\n{\n    if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy\n        && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n        FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n        FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd;\n    }\n}\n\nstatic void SwitchIn_TryShinyAnimShowHealthbox(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim\n        && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)\n        TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);\n    if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy\n        && !(gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive))\n    {\n        DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]);\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler],\n                                 &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]],\n                                 HEALTHBOX_ALL);\n        StartHealthboxSlideIn(gActiveBattler);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n        CopyBattleSpriteInvisibility(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = SwitchIn_CleanShinyAnimShowSubstitute;\n    }\n}\n\nstatic void CompleteOnSpecialAnimDone(void)\n{\n    if (!gDoingBattleAnim)\n        PokedudeBufferExecCompleted();\n}\n\nstatic void Intro_DelayAndEnd(void)\n{\n    if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == 255)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0;\n        PokedudeBufferExecCompleted();\n    }\n}\n\nstatic void PokedudeHandleInputChooseMove(void)\n{\n    PokedudeSimulateInputChooseMove();\n}\n\nstatic void OpenPartyMenuToChooseMon(void)\n{\n    if (!gPaletteFade.active)\n    {\n        gBattlerControllerFuncs[gActiveBattler] = WaitForMonSelection;\n        DestroyTask(gBattleControllerData[gActiveBattler]);\n        FreeAllWindowBuffers();\n        Pokedude_OpenPartyMenuInBattle();\n    }\n}\n\nstatic void WaitForMonSelection(void)\n{\n    if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)\n    {\n        if (gPartyMenuUseExitCallback == TRUE)\n            BtlController_EmitChosenMonReturnValue(1, gSelectedMonPartyId, gBattlePartyCurrentOrder);\n        else\n            BtlController_EmitChosenMonReturnValue(1, 6, NULL);\n        PokedudeBufferExecCompleted();\n    }\n}\n\nstatic void OpenBagAndChooseItem(void)\n{\n    u8 callbackId;\n\n    if (!gPaletteFade.active)\n    {\n        gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChoseItem;\n        ReshowBattleScreenDummy();\n        FreeAllWindowBuffers();\n        switch (gSpecialVar_0x8004)\n        {\n        case TTVSCR_STATUS:\n        default:\n            callbackId = ITEMMENULOCATION_TTVSCR_STATUS;\n            break;\n        case TTVSCR_CATCHING:\n            callbackId = ITEMMENULOCATION_TTVSCR_CATCHING;\n            break;\n        }\n        InitPokedudeBag(callbackId);\n    }\n}\n\nstatic void CompleteWhenChoseItem(void)\n{\n    if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)\n    {\n        BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId);\n        PokedudeBufferExecCompleted();\n    }\n}\n\nstatic void Intro_TryShinyAnimShowHealthbox(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim\n        && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)\n        TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim\n        && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)\n        TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]);\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)\n    {\n        if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n        {\n            DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]);\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK],\n                                     &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]],\n                                     HEALTHBOX_ALL);\n            StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK);\n            SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);\n        }\n        DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]);\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler],\n                                 &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]],\n                                 HEALTHBOX_ALL);\n        StartHealthboxSlideIn(gActiveBattler);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n        gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;\n        gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;\n    }\n}\n\nstatic void Intro_WaitForShinyAnimAndHealthbox(void)\n{\n    bool32 r4 = FALSE;\n\n    if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        r4 = TRUE;\n    if (r4\n        && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim\n        && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE;\n        FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);\n        FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);\n        CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10);\n        HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd;\n    }\n}\n\n#define tExpTask_monId      data[0]\n#define tExpTask_gainedExp  data[1]\n#define tExpTask_battler    data[2]\n#define tExpTask_frames     data[10]\n\nstatic void Task_GiveExpToMon(u8 taskId)\n{\n    u32 monId = (u8)gTasks[taskId].tExpTask_monId;\n    u8 battlerId = gTasks[taskId].tExpTask_battler;\n    s16 gainedExp = gTasks[taskId].tExpTask_gainedExp;\n\n    if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // Give exp without moving the expbar.\n    {\n        struct Pokemon *mon = &gPlayerParty[monId];\n        u16 species = GetMonData(mon, MON_DATA_SPECIES);\n        u8 level = GetMonData(mon, MON_DATA_LEVEL);\n        u32 currExp = GetMonData(mon, MON_DATA_EXP);\n        u32 nextLvlExp = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1];\n\n        if (currExp + gainedExp >= nextLvlExp)\n        {\n            u8 savedActiveBattler;\n\n            SetMonData(mon, MON_DATA_EXP, &nextLvlExp);\n            CalculateMonStats(mon, TRUE);\n            gainedExp -= nextLvlExp - currExp;\n            savedActiveBattler = gActiveBattler;\n            gActiveBattler = battlerId;\n            BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);\n            gActiveBattler = savedActiveBattler;\n            if (IsDoubleBattle() == TRUE\n                && ((u16)monId == gBattlerPartyIndexes[battlerId] || (u16)monId == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]))\n                gTasks[taskId].func = Task_LaunchLvlUpAnim;\n            else\n                gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter;\n        }\n        else\n        {\n            currExp += gainedExp;\n            SetMonData(mon, MON_DATA_EXP, &currExp);\n            gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter2;\n            DestroyTask(taskId);\n        }\n    }\n    else\n    {\n        gTasks[taskId].func = Task_PrepareToGiveExpWithExpBar;\n    }\n}\n\nstatic void Task_PrepareToGiveExpWithExpBar(u8 taskId)\n{\n    u8 monIndex = gTasks[taskId].tExpTask_monId;\n    s32 gainedExp = gTasks[taskId].tExpTask_gainedExp;\n    u8 battlerId = gTasks[taskId].tExpTask_battler;\n    struct Pokemon *mon = &gPlayerParty[monIndex];\n    u8 level = GetMonData(mon, MON_DATA_LEVEL);\n    u16 species = GetMonData(mon, MON_DATA_SPECIES);\n    u32 exp = GetMonData(mon, MON_DATA_EXP);\n    u32 currLvlExp = gExperienceTables[gSpeciesInfo[species].growthRate][level];\n    u32 expToNextLvl;\n\n    exp -= currLvlExp;\n    expToNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - currLvlExp;\n    SetBattleBarStruct(battlerId, gHealthboxSpriteIds[battlerId], expToNextLvl, exp, -gainedExp);\n    PlaySE(SE_EXP);\n    gTasks[taskId].func = Task_GiveExpWithExpBar;\n}\n\nstatic void Task_GiveExpWithExpBar(u8 taskId)\n{\n    if (gTasks[taskId].tExpTask_frames < 13)\n    {\n        ++gTasks[taskId].tExpTask_frames;\n    }\n    else\n    {\n        u8 monId = gTasks[taskId].tExpTask_monId;\n        s16 gainedExp = gTasks[taskId].tExpTask_gainedExp;\n        u8 battlerId = gTasks[taskId].tExpTask_battler;\n        s16 newExpPoints;\n\n        newExpPoints = MoveBattleBar(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[battlerId]);\n        if (newExpPoints == -1) // The bar has been filled with given exp points.\n        {\n            u8 level;\n            s32 currExp;\n            u16 species;\n            s32 expOnNextLvl;\n\n            m4aSongNumStop(SE_EXP);\n            level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);\n            currExp = GetMonData(&gPlayerParty[monId], MON_DATA_EXP);\n            species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);\n            expOnNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1];\n            if (currExp + gainedExp >= expOnNextLvl)\n            {\n                u8 savedActiveBattler;\n\n                SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl);\n                CalculateMonStats(&gPlayerParty[monId], TRUE);\n                gainedExp -= expOnNextLvl - currExp;\n                savedActiveBattler = gActiveBattler;\n                gActiveBattler = battlerId;\n                BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);\n                gActiveBattler = savedActiveBattler;\n                gTasks[taskId].func = Task_LaunchLvlUpAnim;\n            }\n            else\n            {\n                currExp += gainedExp;\n                SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp);\n                gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter2;\n                DestroyTask(taskId);\n            }\n        }\n    }\n}\n\nstatic void Task_LaunchLvlUpAnim(u8 taskId)\n{\n    u8 battlerId = gTasks[taskId].tExpTask_battler;\n    u8 monIndex = gTasks[taskId].tExpTask_monId;\n\n    if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])\n        battlerId ^= BIT_FLANK;\n    InitAndLaunchSpecialAnimation(battlerId, battlerId, battlerId, B_ANIM_LVL_UP);\n    gTasks[taskId].func = Task_UpdateLvlInHealthbox;\n}\n\nstatic void Task_UpdateLvlInHealthbox(u8 taskId)\n{\n    u8 battlerId = gTasks[taskId].tExpTask_battler;\n\n    if (!gBattleSpritesDataPtr->healthBoxesData[battlerId].specialAnimActive)\n    {\n        u8 monIndex = gTasks[taskId].tExpTask_monId;\n\n        GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL);  // Unused return value.\n        if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId ^ BIT_FLANK], &gPlayerParty[monIndex], HEALTHBOX_ALL);\n        else\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId], &gPlayerParty[monIndex], HEALTHBOX_ALL);\n        gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter;\n    }\n}\n\nstatic void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId)\n{\n    u8 monIndex = gTasks[taskId].tExpTask_monId;\n    u8 battlerId;\n\n    GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value\n    battlerId = gTasks[taskId].tExpTask_battler;\n    gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter2;\n    DestroyTask(taskId);\n}\n\nstatic void FreeMonSpriteAfterFaintAnim(void)\n{\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n    {\n        if (gSprites[gBattlerSpriteIds[gActiveBattler]].y + gSprites[gBattlerSpriteIds[gActiveBattler]].y2 > DISPLAY_HEIGHT)\n        {\n            FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum);\n            DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n            SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n            PokedudeBufferExecCompleted();\n        }\n    }\n    else\n    {\n        if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse)\n        {\n            SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n            PokedudeBufferExecCompleted();\n        }\n    }\n}\n\nstatic void CompleteOnHealthbarDone(void)\n{\n    s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);\n\n    SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n    if (hpValue != -1)\n    {\n        UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);\n    }\n    else\n    {\n        HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n        PokedudeBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnInactiveTextPrinter2(void)\n{\n    if (!IsTextPrinterActive(0))\n        PokedudeBufferExecCompleted();\n}\n\nstatic void DoHitAnimBlinkSpriteEffect(void)\n{\n    u8 spriteId = gBattlerSpriteIds[gActiveBattler];\n\n    if (gSprites[spriteId].data[1] == 32)\n    {\n        gSprites[spriteId].data[1] = 0;\n        gSprites[spriteId].invisible = FALSE;\n        gDoingBattleAnim = FALSE;\n        PokedudeBufferExecCompleted();\n    }\n    else\n    {\n        if ((gSprites[spriteId].data[1] % 4) == 0)\n            gSprites[spriteId].invisible ^= 1;\n        ++gSprites[spriteId].data[1];\n    }\n}\n\nstatic void DoSwitchOutAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n    {\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        PokedudeBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnBattlerSpriteCallbackDummy2(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        PokedudeBufferExecCompleted();\n}\n\nstatic void CompleteOnFinishedBattleAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)\n        PokedudeBufferExecCompleted();\n}\n\nstatic void CompleteOnFinishedStatusAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)\n        PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeBufferExecCompleted(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = PokedudeBufferRunCommand;\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        u8 playerId = GetMultiplayerId();\n\n        PrepareBufferDataTransferLink(2, 4, &playerId);\n        gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;\n    }\n    else\n    {\n        gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];\n    }\n}\n\n// not used\nstatic void CompleteOnFinishedStatusAnimation2(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)\n        PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleGetMonData(void)\n{\n    u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data\n    u32 size = 0;\n    u8 monToCheck;\n    s32 i;\n\n    if (gBattleBufferA[gActiveBattler][2] == 0)\n    {\n        size += CopyPokedudeMonData(gBattlerPartyIndexes[gActiveBattler], monData);\n    }\n    else\n    {\n        monToCheck = gBattleBufferA[gActiveBattler][2];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (monToCheck & 1)\n                size += CopyPokedudeMonData(i, monData + size);\n            monToCheck >>= 1;\n        }\n    }\n    BtlController_EmitDataTransfer(BUFFER_B, size, monData);\n    PokedudeBufferExecCompleted();\n}\n\nstatic u32 CopyPokedudeMonData(u8 monId, u8 *dst)\n{\n    struct BattlePokemon battleMon;\n    struct MovePpInfo moveData;\n    u8 nickname[20];\n    u8 *src;\n    s16 data16;\n    u32 data32;\n    s32 size = 0;\n    struct Pokemon *mon;\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        mon = &gPlayerParty[monId];\n    else\n        mon = &gEnemyParty[monId];\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case REQUEST_ALL_BATTLE:\n        battleMon.species = GetMonData(mon, MON_DATA_SPECIES);\n        battleMon.item = GetMonData(mon, MON_DATA_HELD_ITEM);\n        for (size = 0; size < MAX_MON_MOVES; ++size)\n        {\n            battleMon.moves[size] = GetMonData(mon, MON_DATA_MOVE1 + size);\n            battleMon.pp[size] = GetMonData(mon, MON_DATA_PP1 + size);\n        }\n        battleMon.ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);\n        battleMon.friendship = GetMonData(mon, MON_DATA_FRIENDSHIP);\n        battleMon.experience = GetMonData(mon, MON_DATA_EXP);\n        battleMon.hpIV = GetMonData(mon, MON_DATA_HP_IV);\n        battleMon.attackIV = GetMonData(mon, MON_DATA_ATK_IV);\n        battleMon.defenseIV = GetMonData(mon, MON_DATA_DEF_IV);\n        battleMon.speedIV = GetMonData(mon, MON_DATA_SPEED_IV);\n        battleMon.spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV);\n        battleMon.spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV);\n        battleMon.personality = GetMonData(mon, MON_DATA_PERSONALITY);\n        battleMon.status1 = GetMonData(mon, MON_DATA_STATUS);\n        battleMon.level = GetMonData(mon, MON_DATA_LEVEL);\n        battleMon.hp = GetMonData(mon, MON_DATA_HP);\n        battleMon.maxHP = GetMonData(mon, MON_DATA_MAX_HP);\n        battleMon.attack = GetMonData(mon, MON_DATA_ATK);\n        battleMon.defense = GetMonData(mon, MON_DATA_DEF);\n        battleMon.speed = GetMonData(mon, MON_DATA_SPEED);\n        battleMon.spAttack = GetMonData(mon, MON_DATA_SPATK);\n        battleMon.spDefense = GetMonData(mon, MON_DATA_SPDEF);\n        battleMon.isEgg = GetMonData(mon, MON_DATA_IS_EGG);\n        battleMon.abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM);\n        battleMon.otId = GetMonData(mon, MON_DATA_OT_ID);\n        GetMonData(mon, MON_DATA_NICKNAME, nickname);\n        StringCopy_Nickname(battleMon.nickname, nickname);\n        GetMonData(mon, MON_DATA_OT_NAME, battleMon.otName);\n        src = (u8 *)&battleMon;\n        for (size = 0; size < sizeof(battleMon); ++size)\n            dst[size] = src[size];\n        break;\n    case REQUEST_SPECIES_BATTLE:\n        data16 = GetMonData(mon, MON_DATA_SPECIES);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_HELDITEM_BATTLE:\n        data16 = GetMonData(mon, MON_DATA_HELD_ITEM);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_MOVES_PP_BATTLE:\n        for (size = 0; size < MAX_MON_MOVES; ++size)\n        {\n            moveData.moves[size] = GetMonData(mon, MON_DATA_MOVE1 + size);\n            moveData.pp[size] = GetMonData(mon, MON_DATA_PP1 + size);\n        }\n        moveData.ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);\n        src = (u8 *)(&moveData);\n        for (size = 0; size < sizeof(moveData); ++size)\n            dst[size] = src[size];\n        break;\n    case REQUEST_MOVE1_BATTLE:\n    case REQUEST_MOVE2_BATTLE:\n    case REQUEST_MOVE3_BATTLE:\n    case REQUEST_MOVE4_BATTLE:\n        data16 = GetMonData(mon, MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_PP_DATA_BATTLE:\n        for (size = 0; size < MAX_MON_MOVES; ++size)\n            dst[size] = GetMonData(mon, MON_DATA_PP1 + size);\n        dst[size] = GetMonData(mon, MON_DATA_PP_BONUSES);\n        ++size;\n        break;\n    case REQUEST_PPMOVE1_BATTLE:\n    case REQUEST_PPMOVE2_BATTLE:\n    case REQUEST_PPMOVE3_BATTLE:\n    case REQUEST_PPMOVE4_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);\n        size = 1;\n        break;\n    case REQUEST_OTID_BATTLE:\n        data32 = GetMonData(mon, MON_DATA_OT_ID);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        size = 3;\n        break;\n    case REQUEST_EXP_BATTLE:\n        data32 = GetMonData(mon, MON_DATA_EXP);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        size = 3;\n        break;\n    case REQUEST_HP_EV_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_HP_EV);\n        size = 1;\n        break;\n    case REQUEST_ATK_EV_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_ATK_EV);\n        size = 1;\n        break;\n    case REQUEST_DEF_EV_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_DEF_EV);\n        size = 1;\n        break;\n    case REQUEST_SPEED_EV_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_SPEED_EV);\n        size = 1;\n        break;\n    case REQUEST_SPATK_EV_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_SPATK_EV);\n        size = 1;\n        break;\n    case REQUEST_SPDEF_EV_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_SPDEF_EV);\n        size = 1;\n        break;\n    case REQUEST_FRIENDSHIP_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_FRIENDSHIP);\n        size = 1;\n        break;\n    case REQUEST_POKERUS_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_POKERUS);\n        size = 1;\n        break;\n    case REQUEST_MET_LOCATION_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_MET_LOCATION);\n        size = 1;\n        break;\n    case REQUEST_MET_LEVEL_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_MET_LEVEL);\n        size = 1;\n        break;\n    case REQUEST_MET_GAME_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_MET_GAME);\n        size = 1;\n        break;\n    case REQUEST_POKEBALL_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_POKEBALL);\n        size = 1;\n        break;\n    case REQUEST_ALL_IVS_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_HP_IV);\n        dst[1] = GetMonData(mon, MON_DATA_ATK_IV);\n        dst[2] = GetMonData(mon, MON_DATA_DEF_IV);\n        dst[3] = GetMonData(mon, MON_DATA_SPEED_IV);\n        dst[4] = GetMonData(mon, MON_DATA_SPATK_IV);\n        dst[5] = GetMonData(mon, MON_DATA_SPDEF_IV);\n        size = 6;\n        break;\n    case REQUEST_HP_IV_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_HP_IV);\n        size = 1;\n        break;\n    case REQUEST_ATK_IV_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_ATK_IV);\n        size = 1;\n        break;\n    case REQUEST_DEF_IV_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_DEF_IV);\n        size = 1;\n        break;\n    case REQUEST_SPEED_IV_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_SPEED_IV);\n        size = 1;\n        break;\n    case REQUEST_SPATK_IV_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_SPATK_IV);\n        size = 1;\n        break;\n    case REQUEST_SPDEF_IV_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_SPDEF_IV);\n        size = 1;\n        break;\n    case REQUEST_PERSONALITY_BATTLE:\n        data32 = GetMonData(mon, MON_DATA_PERSONALITY);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        dst[3] = (data32 & 0xFF000000) >> 24;\n        size = 4;\n        break;\n    case REQUEST_CHECKSUM_BATTLE:\n        data16 = GetMonData(mon, MON_DATA_CHECKSUM);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_STATUS_BATTLE:\n        data32 = GetMonData(mon, MON_DATA_STATUS);\n        dst[0] = (data32 & 0x000000FF);\n        dst[1] = (data32 & 0x0000FF00) >> 8;\n        dst[2] = (data32 & 0x00FF0000) >> 16;\n        dst[3] = (data32 & 0xFF000000) >> 24;\n        size = 4;\n        break;\n    case REQUEST_LEVEL_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_LEVEL);\n        size = 1;\n        break;\n    case REQUEST_HP_BATTLE:\n        data16 = GetMonData(mon, MON_DATA_HP);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_MAX_HP_BATTLE:\n        data16 = GetMonData(mon, MON_DATA_MAX_HP);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_ATK_BATTLE:\n        data16 = GetMonData(mon, MON_DATA_ATK);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_DEF_BATTLE:\n        data16 = GetMonData(mon, MON_DATA_DEF);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPEED_BATTLE:\n        data16 = GetMonData(mon, MON_DATA_SPEED);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPATK_BATTLE:\n        data16 = GetMonData(mon, MON_DATA_SPATK);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_SPDEF_BATTLE:\n        data16 = GetMonData(mon, MON_DATA_SPDEF);\n        dst[0] = data16;\n        dst[1] = data16 >> 8;\n        size = 2;\n        break;\n    case REQUEST_COOL_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_COOL);\n        size = 1;\n        break;\n    case REQUEST_BEAUTY_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_BEAUTY);\n        size = 1;\n        break;\n    case REQUEST_CUTE_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_CUTE);\n        size = 1;\n        break;\n    case REQUEST_SMART_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_SMART);\n        size = 1;\n        break;\n    case REQUEST_TOUGH_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_TOUGH);\n        size = 1;\n        break;\n    case REQUEST_SHEEN_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_SHEEN);\n        size = 1;\n        break;\n    case REQUEST_COOL_RIBBON_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_COOL_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_BEAUTY_RIBBON_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_BEAUTY_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_CUTE_RIBBON_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_CUTE_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_SMART_RIBBON_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_SMART_RIBBON);\n        size = 1;\n        break;\n    case REQUEST_TOUGH_RIBBON_BATTLE:\n        dst[0] = GetMonData(mon, MON_DATA_TOUGH_RIBBON);\n        size = 1;\n        break;\n    }\n    return size;\n}\n\nstatic void PokedudeHandleGetRawMonData(void)\n{\n    PlayerHandleGetRawMonData();\n}\n\nstatic void PokedudeHandleSetMonData(void)\n{\n    u8 monToCheck;\n    u32 i;\n\n    if (gBattleBufferA[gActiveBattler][2] == 0)\n    {\n        SetPokedudeMonData(gBattlerPartyIndexes[gActiveBattler]);\n    }\n    else\n    {\n        monToCheck = gBattleBufferA[gActiveBattler][2];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (monToCheck & 1)\n                SetPokedudeMonData(i);\n            monToCheck >>= 1;\n        }\n    }\n    PokedudeBufferExecCompleted();\n}\n\nstatic void SetPokedudeMonData(u8 monId)\n{\n    struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];\n    struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];\n    s32 i;\n    struct Pokemon *mon;\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        mon = &gPlayerParty[monId];\n    else\n        mon = &gEnemyParty[monId];\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case REQUEST_ALL_BATTLE:\n    {\n        u8 iv;\n\n        SetMonData(mon, MON_DATA_SPECIES, &battlePokemon->species);\n        SetMonData(mon, MON_DATA_HELD_ITEM, &battlePokemon->item);\n        for (i = 0; i < MAX_MON_MOVES; ++i)\n        {\n            SetMonData(mon, MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);\n            SetMonData(mon, MON_DATA_PP1 + i, &battlePokemon->pp[i]);\n        }\n        SetMonData(mon, MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses);\n        SetMonData(mon, MON_DATA_FRIENDSHIP, &battlePokemon->friendship);\n        SetMonData(mon, MON_DATA_EXP, &battlePokemon->experience);\n        iv = battlePokemon->hpIV;\n        SetMonData(mon, MON_DATA_HP_IV, &iv);\n        iv = battlePokemon->attackIV;\n        SetMonData(mon, MON_DATA_ATK_IV, &iv);\n        iv = battlePokemon->defenseIV;\n        SetMonData(mon, MON_DATA_DEF_IV, &iv);\n        iv = battlePokemon->speedIV;\n        SetMonData(mon, MON_DATA_SPEED_IV, &iv);\n        iv = battlePokemon->spAttackIV;\n        SetMonData(mon, MON_DATA_SPATK_IV, &iv);\n        iv = battlePokemon->spDefenseIV;\n        SetMonData(mon, MON_DATA_SPDEF_IV, &iv);\n        SetMonData(mon, MON_DATA_PERSONALITY, &battlePokemon->personality);\n        SetMonData(mon, MON_DATA_STATUS, &battlePokemon->status1);\n        SetMonData(mon, MON_DATA_LEVEL, &battlePokemon->level);\n        SetMonData(mon, MON_DATA_HP, &battlePokemon->hp);\n        SetMonData(mon, MON_DATA_MAX_HP, &battlePokemon->maxHP);\n        SetMonData(mon, MON_DATA_ATK, &battlePokemon->attack);\n        SetMonData(mon, MON_DATA_DEF, &battlePokemon->defense);\n        SetMonData(mon, MON_DATA_SPEED, &battlePokemon->speed);\n        SetMonData(mon, MON_DATA_SPATK, &battlePokemon->spAttack);\n        SetMonData(mon, MON_DATA_SPDEF, &battlePokemon->spDefense);\n    }\n        break;\n    case REQUEST_SPECIES_BATTLE:\n        SetMonData(mon, MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HELDITEM_BATTLE:\n        SetMonData(mon, MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MOVES_PP_BATTLE:\n        for (i = 0; i < MAX_MON_MOVES; ++i)\n        {\n            SetMonData(mon, MON_DATA_MOVE1 + i, &moveData->moves[i]);\n            SetMonData(mon, MON_DATA_PP1 + i, &moveData->pp[i]);\n        }\n        SetMonData(mon, MON_DATA_PP_BONUSES, &moveData->ppBonuses);\n        break;\n    case REQUEST_MOVE1_BATTLE:\n    case REQUEST_MOVE2_BATTLE:\n    case REQUEST_MOVE3_BATTLE:\n    case REQUEST_MOVE4_BATTLE:\n        SetMonData(mon, MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_PP_DATA_BATTLE:\n        SetMonData(mon, MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);\n        SetMonData(mon, MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);\n        SetMonData(mon, MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);\n        SetMonData(mon, MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);\n        SetMonData(mon, MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);\n        break;\n    case REQUEST_PPMOVE1_BATTLE:\n    case REQUEST_PPMOVE2_BATTLE:\n    case REQUEST_PPMOVE3_BATTLE:\n    case REQUEST_PPMOVE4_BATTLE:\n        SetMonData(mon, MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_OTID_BATTLE:\n        SetMonData(mon, MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_EXP_BATTLE:\n        SetMonData(mon, MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HP_EV_BATTLE:\n        SetMonData(mon, MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_EV_BATTLE:\n        SetMonData(mon, MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_EV_BATTLE:\n        SetMonData(mon, MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_EV_BATTLE:\n        SetMonData(mon, MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_EV_BATTLE:\n        SetMonData(mon, MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_EV_BATTLE:\n        SetMonData(mon, MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_FRIENDSHIP_BATTLE:\n        SetMonData(mon, MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_POKERUS_BATTLE:\n        SetMonData(mon, MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_LOCATION_BATTLE:\n        SetMonData(mon, MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_LEVEL_BATTLE:\n        SetMonData(mon, MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MET_GAME_BATTLE:\n        SetMonData(mon, MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_POKEBALL_BATTLE:\n        SetMonData(mon, MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ALL_IVS_BATTLE:\n        SetMonData(mon, MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);\n        SetMonData(mon, MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);\n        SetMonData(mon, MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);\n        SetMonData(mon, MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);\n        SetMonData(mon, MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);\n        SetMonData(mon, MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);\n        break;\n    case REQUEST_HP_IV_BATTLE:\n        SetMonData(mon, MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_IV_BATTLE:\n        SetMonData(mon, MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_IV_BATTLE:\n        SetMonData(mon, MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_IV_BATTLE:\n        SetMonData(mon, MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_IV_BATTLE:\n        SetMonData(mon, MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_IV_BATTLE:\n        SetMonData(mon, MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_PERSONALITY_BATTLE:\n        SetMonData(mon, MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CHECKSUM_BATTLE:\n        SetMonData(mon, MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_STATUS_BATTLE:\n        SetMonData(mon, MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_LEVEL_BATTLE:\n        SetMonData(mon, MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_HP_BATTLE:\n        SetMonData(mon, MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_MAX_HP_BATTLE:\n        SetMonData(mon, MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_ATK_BATTLE:\n        SetMonData(mon, MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_DEF_BATTLE:\n        SetMonData(mon, MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPEED_BATTLE:\n        SetMonData(mon, MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPATK_BATTLE:\n        SetMonData(mon, MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SPDEF_BATTLE:\n        SetMonData(mon, MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_COOL_BATTLE:\n        SetMonData(mon, MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_BEAUTY_BATTLE:\n        SetMonData(mon, MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CUTE_BATTLE:\n        SetMonData(mon, MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SMART_BATTLE:\n        SetMonData(mon, MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_TOUGH_BATTLE:\n        SetMonData(mon, MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SHEEN_BATTLE:\n        SetMonData(mon, MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_COOL_RIBBON_BATTLE:\n        SetMonData(mon, MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_BEAUTY_RIBBON_BATTLE:\n        SetMonData(mon, MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_CUTE_RIBBON_BATTLE:\n        SetMonData(mon, MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_SMART_RIBBON_BATTLE:\n        SetMonData(mon, MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    case REQUEST_TOUGH_RIBBON_BATTLE:\n        SetMonData(mon, MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);\n        break;\n    }\n    HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n}\n\nstatic void PokedudeHandleSetRawMonData(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleLoadMonSprite(void)\n{\n    u32 y;\n    u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);\n\n    BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n    y = GetBattlerSpriteDefault_Y(gActiveBattler);\n    SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler));\n    gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                     GetBattlerSpriteCoord(gActiveBattler, BATTLER_COORD_X_2),\n                                                     y,\n                                                     GetBattlerSpriteSubpriority(gActiveBattler));\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH;\n    if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n        gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = 0;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = species;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]);\n    SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpritePosX_0;\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleSwitchInAnim(void)\n{\n    ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]);\n    gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1];\n    BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n    gActionSelectionCursor[gActiveBattler] = 0;\n    gMoveSelectionCursor[gActiveBattler] = 0;\n    StartSendOutAnim(gActiveBattler);\n    gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnimShowHealthbox;\n}\n\nstatic void PokedudeHandleReturnMonToBall(void)\n{\n    if (gBattleBufferA[gActiveBattler][1] == 0)\n    {\n        InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON);\n        gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;\n    }\n    else\n    {\n        FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);\n        PokedudeBufferExecCompleted();\n    }\n}\n\nstatic void PokedudeHandleDrawTrainerPic(void)\n{\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n    {\n        DecompressTrainerBackPalette(TRAINER_BACK_PIC_POKEDUDE, gActiveBattler);\n        SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_POKEDUDE, GetBattlerPosition(gActiveBattler));\n        gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                         80,\n                                                         (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_POKEDUDE].size) * 4 + 80,\n                                                         30);\n        gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;\n        if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n            gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -240;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn;\n    }\n    else\n    {\n        u32 tranerPicid = TRAINER_PIC_PROFESSOR_OAK;\n        DecompressTrainerFrontPic(tranerPicid, gActiveBattler);\n        SetMultiuseSpriteTemplateToTrainerBack(tranerPicid, GetBattlerPosition(gActiveBattler));\n        gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                         176,\n                                                         (8 - gTrainerFrontPicCoords[tranerPicid].size) * 4 + 40,\n                                                         GetBattlerSpriteSubpriority(gActiveBattler));\n        gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2;\n        if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n            gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 240;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[tranerPicid].tag);\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[tranerPicid].tag);\n        gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = tranerPicid;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn;\n    }\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;\n}\n\nstatic void PokedudeHandleTrainerSlide(void)\n{\n    DecompressTrainerBackPalette(TRAINER_BACK_PIC_POKEDUDE, gActiveBattler);\n    SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_POKEDUDE, GetBattlerPosition(gActiveBattler));\n    gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                     80,\n                                                     (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_POKEDUDE].size) * 4 + 80,\n                                                     30);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -96;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn;\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy2;\n}\n\nstatic void PokedudeHandleTrainerSlideBack(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleFaintAnimation(void)\n{\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0)\n    {\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState;\n    }\n    else\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n            {\n                HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n                PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER);\n                gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;\n                gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5;\n                gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim;\n            }\n            else\n            {\n                PlaySE12WithPanning(SE_FAINT, SOUND_PAN_TARGET);\n                gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon;\n            }\n            gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim;\n        }\n    }\n}\n\nstatic void PokedudeHandlePaletteFade(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleSuccessBallThrowAnim(void)\n{\n    gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;\n    gDoingBattleAnim = TRUE;\n    InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;\n}\n\nstatic void PokedudeHandleBallThrowAnim(void)\n{\n    u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1];\n\n    gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;\n    gDoingBattleAnim = TRUE;\n    InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;\n}\n\nstatic void PokedudeHandlePause(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleMoveAnimation(void)\n{\n    u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);\n\n    gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];\n    gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);\n    gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);\n    gAnimFriendship = gBattleBufferA[gActiveBattler][10];\n    gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);\n    gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];\n    gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;\n    if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE\n    {\n        PokedudeBufferExecCompleted();\n    }\n    else\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n        gBattlerControllerFuncs[gActiveBattler] = PokedudeDoMoveAnimation;\n    }\n}\n\nstatic void PokedudeDoMoveAnimation(void)\n{\n    u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);\n\n    switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)\n    {\n    case 0:\n        if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n            InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;\n        break;\n    case 1:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF);\n            DoMoveAnim(move);\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;\n        }\n        break;\n    case 2:\n        gAnimScriptCallback();\n        if (!gAnimScriptActive)\n        {\n            SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL);\n            if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)\n                InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;\n        }\n        break;\n    case 3:\n        if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        {\n            CopyAllBattleSpritesInvisibilities();\n            TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;\n            PokedudeBufferExecCompleted();\n        }\n        break;\n    }\n}\n\nstatic void PokedudeHandlePrintString(void)\n{\n    u16 *stringId;\n\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]);\n    BufferStringBattle(*stringId);\n    if (BattleStringShouldBeColored(*stringId))\n        BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT));\n    else\n        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;\n}\n\nstatic void PokedudeHandlePrintSelectionString(void)\n{\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        PokedudeHandlePrintString();\n    else\n        PokedudeBufferExecCompleted();\n}\n\nstatic void HandleChooseActionAfterDma3(void)\n{\n    if (!IsDma3ManagerBusyWithBgCopy())\n    {\n        gBattle_BG0_X = 0;\n        gBattle_BG0_Y = 160;\n        gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction;\n    }\n}\n\nstatic void PokedudeHandleChooseAction(void)\n{\n    s32 i;\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n    {\n        gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3;\n        BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG);\n        BattlePutTextOnWindow(gText_BattleMenu, B_WIN_ACTION_MENU);\n        for (i = 0; i < MAX_MON_MOVES; ++i)\n            ActionSelectionDestroyCursorAt((u8)i);\n        ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo);\n        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_ACTION_PROMPT);\n    }\n    else\n    {\n        gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction;\n    }\n}\n\nstatic void PokedudeHandleUnknownYesNoBox(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleChooseMoveAfterDma3(void)\n{\n    if (!IsDma3ManagerBusyWithBgCopy())\n    {\n        gBattle_BG0_X = 0;\n        gBattle_BG0_Y = 320;\n        gBattlerControllerFuncs[gActiveBattler] = PokedudeHandleInputChooseMove;\n    }\n}\n\nstatic void PokedudeHandleChooseMove(void)\n{\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n    {\n        InitMoveSelectionsVarsAndStrings();\n        gBattlerControllerFuncs[gActiveBattler] = PokedudeHandleChooseMoveAfterDma3;\n    }\n    else\n    {\n        gBattlerControllerFuncs[gActiveBattler] = PokedudeHandleInputChooseMove;\n    }\n}\n\nstatic void PokedudeHandleChooseItem(void)\n{\n    s32 i;\n\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n    gBattlerControllerFuncs[gActiveBattler] = OpenBagAndChooseItem;\n    gBattlerInMenuId = gActiveBattler;\n    for (i = 0; i < 3; ++i)\n        gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][i + 1];\n}\n\nstatic void PokedudeHandleChoosePokemon(void)\n{\n    s32 i;\n\n    gBattleControllerData[gActiveBattler] = CreateTask(TaskDummy, 0xFF);\n    gTasks[gBattleControllerData[gActiveBattler]].data[0] = gBattleBufferA[gActiveBattler][1] & 0xF;\n    *(&gBattleStruct->battlerPreventingSwitchout) = gBattleBufferA[gActiveBattler][1] >> 4;\n    *(&gBattleStruct->playerPartyIdx) = gBattleBufferA[gActiveBattler][2];\n    *(&gBattleStruct->abilityPreventingSwitchout) = gBattleBufferA[gActiveBattler][3];\n    for (i = 0; i < 3; ++i)\n        gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][4 + i];\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n    gBattlerControllerFuncs[gActiveBattler] = OpenPartyMenuToChooseMon;\n    gBattlerInMenuId = gActiveBattler;\n}\n\nstatic void PokedudeHandleCmd23(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleHealthBarUpdate(void)\n{\n    s16 hpVal;\n    struct Pokemon *mon;\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]];\n    else\n        mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]];\n    LoadBattleBarGfx(0);\n    hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n    if (hpVal != INSTANT_HP_BAR_DROP)\n    {\n        u32 maxHP = GetMonData(mon, MON_DATA_MAX_HP);\n        u32 curHP = GetMonData(mon, MON_DATA_HP);\n\n        SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);\n    }\n    else\n    {\n        u32 maxHP = GetMonData(mon, MON_DATA_MAX_HP);\n\n        SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);\n        UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], 0, HP_CURRENT);\n    }\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;\n}\n\nstatic void PokedudeHandleExpUpdate(void)\n{\n    u8 monId = gBattleBufferA[gActiveBattler][1];\n\n    if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_LEVEL)\n    {\n        PokedudeBufferExecCompleted();\n    }\n    else\n    {\n        s16 expPointsToGive;\n        u8 taskId;\n\n        LoadBattleBarGfx(1);\n        GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);  // Unused return value.\n        expPointsToGive = T1_READ_16(&gBattleBufferA[gActiveBattler][2]);\n        taskId = CreateTask(Task_GiveExpToMon, 10);\n        gTasks[taskId].tExpTask_monId = monId;\n        gTasks[taskId].tExpTask_gainedExp = expPointsToGive;\n        gTasks[taskId].tExpTask_battler = gActiveBattler;\n        gBattlerControllerFuncs[gActiveBattler] = PokedudeDummy;\n    }\n}\n\nstatic void PokedudeHandleStatusIconUpdate(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        u8 battlerId;\n        struct Pokemon *mon;\n\n        if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n            mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]];\n        else\n            mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]];\n        UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_STATUS_ICON);\n        battlerId = gActiveBattler;\n        gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = FALSE;\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;\n    }\n}\n\nstatic void PokedudeHandleStatusAnimation(void)\n{\n    if (!IsBattleSEPlaying(gActiveBattler))\n    {\n        InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1],\n                                           gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24));\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;\n    }\n}\n\nstatic void PokedudeHandleStatusXor(void)\n{\n    struct Pokemon *mon;\n    u8 val;\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]];\n    else\n        mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]];\n    val = GetMonData(mon, MON_DATA_STATUS) ^ gBattleBufferA[gActiveBattler][1];\n    SetMonData(mon, MON_DATA_STATUS, &val);\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleDataTransfer(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleDMA3Transfer(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandlePlayBGM(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleCmd32(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleTwoReturnValues(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleChosenMonReturnValue(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleOneReturnValue(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleOneReturnValue_Duplicate(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleCmd37(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleCmd38(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleCmd39(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleCmd40(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleHitAnimation(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)\n    {\n        PokedudeBufferExecCompleted();\n    }\n    else\n    {\n        gDoingBattleAnim = TRUE;\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;\n        DoHitAnimHealthboxEffect(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;\n    }\n}\n\nstatic void PokedudeHandleCmd42(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandlePlaySE(void)\n{\n    PlaySE(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandlePlayFanfare(void)\n{\n    PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleFaintingCry(void)\n{\n    struct Pokemon *mon;\n    u16 species;\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]];\n    else\n        mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]];\n    species = GetMonData(mon, MON_DATA_SPECIES);\n    PlayCry_Normal(species, 25);\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleIntroSlide(void)\n{\n    HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);\n    gIntroSlideFlags |= 1;\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleIntroTrainerBallThrow(void)\n{\n    u8 paletteNum;\n    u8 taskId;\n\n    SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;\n    StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite);\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);\n    paletteNum = AllocSpritePalette(0xD6F8);\n    LoadCompressedPalette(gTrainerBackPicPaletteTable[TRAINER_BACK_PIC_POKEDUDE].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum;\n    taskId = CreateTask(Task_StartSendOutAnim, 5);\n    gTasks[taskId].data[0] = gActiveBattler;\n    if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)\n        gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;\n    gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;\n    gBattlerControllerFuncs[gActiveBattler] = PokedudeDummy;\n}\n\nstatic void StartSendOutAnim(u8 battlerId)\n{\n    u16 species;\n\n    gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = SPECIES_NONE;\n    gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];\n    species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);\n    gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim);\n    SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));\n    gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2),\n                                                GetBattlerSpriteDefault_Y(battlerId),\n                                                GetBattlerSpriteSubpriority(battlerId));\n    gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId];\n    gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;\n    gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;\n    gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;\n    StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);\n    gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;\n    gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;\n    gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT);\n}\n\nstatic void Task_StartSendOutAnim(u8 taskId)\n{\n    if (gTasks[taskId].data[1] < 31)\n    {\n        ++gTasks[taskId].data[1];\n    }\n    else\n    {\n        u8 savedActiveBattler = gActiveBattler;\n\n        gActiveBattler = gTasks[taskId].data[0];\n        gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];\n        StartSendOutAnim(gActiveBattler);\n        gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox;\n        gActiveBattler = savedActiveBattler;\n        DestroyTask(taskId);\n    }\n}\n\nstatic void PokedudeHandleDrawPartyStatusSummary(void)\n{\n    if (gBattleBufferA[gActiveBattler][1] != 0\n        && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n    {\n        PokedudeBufferExecCompleted();\n    }\n    else\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = TRUE;\n        gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler,\n                                                                                      (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4],\n                                                                                      gBattleBufferA[gActiveBattler][1],\n                                                                                      gBattleBufferA[gActiveBattler][2]);\n        PokedudeBufferExecCompleted();\n    }\n}\n\nstatic void PokedudeHandleHidePartyStatusSummary(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleEndBounceEffect(void)\n{\n    EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX);\n    EndBounceEffect(gActiveBattler, BOUNCE_MON);\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleSpriteInvisibility(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleBattleAnimation(void)\n{\n    u8 animationId = gBattleBufferA[gActiveBattler][1];\n    u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n\n    if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))\n        PokedudeBufferExecCompleted();\n    else\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;\n}\n\nstatic void PokedudeHandleLinkStandbyMsg(void)\n{\n    switch (gBattleBufferA[gActiveBattler][1])\n    {\n    case 0:\n    case 1:\n        EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX);\n        EndBounceEffect(gActiveBattler, BOUNCE_MON);\n        break;\n    case 2:\n        break;\n    }\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleResetActionMoveSelection(void)\n{\n    PokedudeBufferExecCompleted();\n}\n\nstatic void PokedudeHandleCmd55(void)\n{\n    gBattleOutcome = gBattleBufferA[gActiveBattler][1];\n    FadeOutMapMusic(5);\n    BeginFastPaletteFade(FAST_FADE_OUT_TO_BLACK);\n    PokedudeBufferExecCompleted();\n    if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) && gBattleTypeFlags & BATTLE_TYPE_LINK)\n        gBattlerControllerFuncs[gActiveBattler] = Pokedude_SetBattleEndCallbacks;\n}\n\nstatic void PokedudeCmdEnd(void)\n{\n}\n\n// Script handlers\n\nstruct PokedudeInputScript\n{\n    // 0-3 for selection, 4 to repeat action, 255 to repeat move\n    u8 cursorPos[MAX_BATTLERS_COUNT];\n    u8 delay[MAX_BATTLERS_COUNT];\n};\n\nstatic const struct PokedudeInputScript sInputScripts_ChooseAction_Battle[] =\n{\n    {\n        .cursorPos = {0, 0},\n        .delay     = {64, 0}\n    },\n    {\n        .cursorPos = {4, 4},\n        .delay     = {0, 0}\n    },\n};\n\nstatic const struct PokedudeInputScript sInputScripts_ChooseAction_Status[] =\n{\n    {\n        .cursorPos = {0, 0},\n        .delay     = {64, 0}\n    },\n    {\n        .cursorPos = {1, 0},\n        .delay     = {64, 0}\n    },\n    {\n        .cursorPos = {0, 0},\n        .delay     = {64, 0}\n    },\n};\n\nstatic const struct PokedudeInputScript sInputScripts_ChooseAction_Matchups[] =\n{\n    {\n        .cursorPos = {0, 0},\n        .delay     = {64, 0}\n    },\n    {\n        .cursorPos = {2, 0},\n        .delay     = {64, 0}\n    },\n    {\n        .cursorPos = {0, 0},\n        .delay     = {64, 0}\n    },\n};\n\nstatic const struct PokedudeInputScript sInputScripts_ChooseAction_Catching[] =\n{\n    {\n        .cursorPos = {0, 0},\n        .delay     = {64, 0}\n    },\n    {\n        .cursorPos = {0, 0},\n        .delay     = {64, 0}\n    },\n    {\n        .cursorPos = {1, 0},\n        .delay     = {64, 0}\n    },\n};\n\nstatic const struct PokedudeInputScript *const sInputScripts_ChooseAction[] =\n{\n    [TTVSCR_BATTLE]   = sInputScripts_ChooseAction_Battle,\n    [TTVSCR_STATUS]   = sInputScripts_ChooseAction_Status,\n    [TTVSCR_MATCHUPS] = sInputScripts_ChooseAction_Matchups,\n    [TTVSCR_CATCHING] = sInputScripts_ChooseAction_Catching,\n};\n\nstatic const struct PokedudeInputScript sInputScripts_ChooseMove_Battle[] =\n{\n    {\n        .cursorPos = {  2,   2},\n        .delay     = { 64,   0}\n    },\n    {\n        .cursorPos = {255, 255},\n        .delay     = {  0,   0}\n    },\n};\n\nstatic const struct PokedudeInputScript sInputScripts_ChooseMove_Status[] =\n{\n    {\n        .cursorPos = {  2,   2},\n        .delay     = { 64,   0}\n    },\n    {\n        .cursorPos = {  2,   0},\n        .delay     = { 64,   0}\n    },\n    {\n        .cursorPos = {  2,   0},\n        .delay     = { 64,   0}\n    },\n    {\n        .cursorPos = {255, 255},\n        .delay     = {  0,   0}\n    },\n};\n\nstatic const struct PokedudeInputScript sInputScripts_ChooseMove_Matchups[] =\n{\n    {\n        .cursorPos = {  2,   0},\n        .delay     = { 64,   0}\n    },\n    {\n        .cursorPos = {  0,   0},\n        .delay     = { 64,   0}\n    },\n    {\n        .cursorPos = {  0,   0},\n        .delay     = { 64,   0}\n    },\n    {\n        .cursorPos = {255, 255},\n        .delay     = {  0,   0}\n    },\n};\n\nstatic const struct PokedudeInputScript sInputScripts_ChooseMove_Catching[] =\n{\n    {\n        .cursorPos = {  0,   2},\n        .delay     = { 64,   0}\n    },\n    {\n        .cursorPos = {  2,   2},\n        .delay     = { 64,   0}\n    },\n    {\n        .cursorPos = {255, 255},\n        .delay     = {  0,   0}\n    },\n};\n\nstatic const struct PokedudeInputScript *const sInputScripts_ChooseMove[] =\n{\n    [TTVSCR_BATTLE]   = sInputScripts_ChooseMove_Battle,\n    [TTVSCR_STATUS]   = sInputScripts_ChooseMove_Status,\n    [TTVSCR_MATCHUPS] = sInputScripts_ChooseMove_Matchups,\n    [TTVSCR_CATCHING] = sInputScripts_ChooseMove_Catching,\n};\n\nstatic const struct PokedudeTextScriptHeader sPokedudeTextScripts_Battle[] =\n{\n    {\n        .btlcmd = CONTROLLER_CHOOSEACTION,\n        .side = B_SIDE_PLAYER,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_PRINTSTRING,\n        .side = B_SIDE_OPPONENT,\n        .stringid = STRINGID_USEDMOVE,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_CHOOSEACTION,\n        .side = B_SIDE_PLAYER,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_PRINTSTRING,\n        .side = B_SIDE_PLAYER,\n        .stringid = STRINGID_PKMNGAINEDEXP,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n};\n\nstatic const struct PokedudeTextScriptHeader sPokedudeTextScripts_Status[] =\n{\n    {\n        .btlcmd = CONTROLLER_CHOOSEACTION,\n        .side = B_SIDE_PLAYER,\n        .callback = NULL,\n    },\n    {\n        .btlcmd = CONTROLLER_CHOOSEACTION,\n        .side = B_SIDE_PLAYER,\n        .callback = PokedudeAction_PrintMessageWithHealthboxPals,\n    },\n    {\n        .btlcmd = CONTROLLER_OPENBAG,\n        .side = B_SIDE_PLAYER,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_PRINTSTRING,\n        .side = B_SIDE_OPPONENT,\n        .stringid = STRINGID_USEDMOVE,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_PRINTSTRING,\n        .side = B_SIDE_PLAYER,\n        .stringid = STRINGID_PKMNGAINEDEXP,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n};\n\nstatic const struct PokedudeTextScriptHeader sPokedudeTextScripts_Matchups[] =\n{\n    {\n        .btlcmd = CONTROLLER_PRINTSTRING,\n        .side = B_SIDE_OPPONENT,\n        .stringid = STRINGID_USEDMOVE,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_CHOOSEACTION,\n        .side = B_SIDE_PLAYER,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_CHOOSEPOKEMON,\n        .side = B_SIDE_PLAYER,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_PRINTSTRING,\n        .side = B_SIDE_OPPONENT,\n        .stringid = STRINGID_USEDMOVE,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_CHOOSEACTION,\n        .side = B_SIDE_PLAYER,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_CHOOSEMOVE,\n        .side = B_SIDE_PLAYER,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_PRINTSTRING,\n        .side = B_SIDE_PLAYER,\n        .stringid = STRINGID_PKMNGAINEDEXP,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n};\n\nstatic const struct PokedudeTextScriptHeader sPokedudeTextScripts_Catching[] =\n{\n    {\n        .btlcmd = CONTROLLER_CHOOSEACTION,\n        .side = B_SIDE_PLAYER,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_CHOOSEACTION,\n        .side = B_SIDE_PLAYER,\n        .callback = NULL,\n    },\n    {\n        .btlcmd = CONTROLLER_CHOOSEACTION,\n        .side = B_SIDE_PLAYER,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_PRINTSTRING,\n        .side = B_SIDE_OPPONENT,\n        .stringid = STRINGID_PKMNFASTASLEEP,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_OPENBAG,\n        .side = B_SIDE_PLAYER,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n    {\n        .btlcmd = CONTROLLER_ENDLINKBATTLE,\n        .side = B_SIDE_PLAYER,\n        .callback = PokedudeAction_PrintVoiceoverMessage,\n    },\n};\n\nstatic const struct PokedudeTextScriptHeader *const sPokedudeTextScripts[] =\n{\n    [TTVSCR_BATTLE]   = sPokedudeTextScripts_Battle,\n    [TTVSCR_STATUS]   = sPokedudeTextScripts_Status,\n    [TTVSCR_MATCHUPS] = sPokedudeTextScripts_Matchups,\n    [TTVSCR_CATCHING] = sPokedudeTextScripts_Catching,\n};\n\nstatic const u8 *const sPokedudeTexts_Battle[] =\n{\n    Pokedude_Text_SpeedierBattlerGoesFirst,\n    Pokedude_Text_MyRattataFasterThanPidgey,\n    Pokedude_Text_BattlersTakeTurnsAttacking,\n    Pokedude_Text_MyRattataWonGetsEXP,\n};\n\nstatic const u8 *const sPokedudeTexts_Status[] =\n{\n    Pokedude_Text_UhOhRattataPoisoned,\n    Pokedude_Text_UhOhRattataPoisoned,\n    Pokedude_Text_HealStatusRightAway,\n    Pokedude_Text_UsingItemTakesTurn,\n    Pokedude_Text_YayWeManagedToWin,\n};\n\nstatic const u8 *const sPokedudeTexts_TypeMatchup[] =\n{\n    Pokedude_Text_WaterNotVeryEffectiveAgainstGrass,\n    Pokedude_Text_GrassEffectiveAgainstWater,\n    Pokedude_Text_LetsTryShiftingMons,\n    Pokedude_Text_ShiftingUsesTurn,\n    Pokedude_Text_ButterfreeDoubleResistsGrass,\n    Pokedude_Text_ButterfreeGoodAgainstOddish,\n    Pokedude_Text_YeahWeWon,\n};\n\nstatic const u8 *const sPokedudeTexts_Catching[] =\n{\n    Pokedude_Text_WeakenMonBeforeCatching,\n    Pokedude_Text_WeakenMonBeforeCatching,\n    Pokedude_Text_BestIfTargetStatused,\n    Pokedude_Text_CantDoubleUpOnStatus,\n    Pokedude_Text_LetMeThrowBall,\n    Pokedude_Text_PickBestKindOfBall,\n};\n\nstatic const struct PokedudeBattlePartyInfo sParties_Battle[] =\n{\n    {\n        .side = B_SIDE_PLAYER,\n        .level = 15,\n        .species = SPECIES_RATTATA,\n        .moves = { MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_HYPER_FANG, MOVE_QUICK_ATTACK },\n        .nature = NATURE_LONELY,\n        .gender = MALE,\n    },\n    {\n        .side = B_SIDE_OPPONENT,\n        .level = 18,\n        .species = SPECIES_PIDGEY,\n        .moves = { MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK },\n        .nature = NATURE_NAUGHTY,\n        .gender = MALE,\n    },\n    {0xFF}\n};\n\nstatic const struct PokedudeBattlePartyInfo sParties_Status[] =\n{\n    {\n        .side = B_SIDE_PLAYER,\n        .level = 15,\n        .species = SPECIES_RATTATA,\n        .moves = { MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_HYPER_FANG, MOVE_QUICK_ATTACK },\n        .nature = NATURE_LONELY,\n        .gender = MALE,\n    },\n    {\n        .side = B_SIDE_OPPONENT,\n        .level = 14,\n        .species = SPECIES_ODDISH,\n        .moves = { MOVE_ABSORB, MOVE_SWEET_SCENT, MOVE_POISON_POWDER },\n        .nature = NATURE_RASH,\n        .gender = MALE,\n    },\n    {0xFF}\n};\n\nstatic const struct PokedudeBattlePartyInfo sParties_Matchups[] =\n{\n    {\n        .side = B_SIDE_PLAYER,\n        .level = 15,\n        .species = SPECIES_POLIWAG,\n        .moves = { MOVE_WATER_GUN, MOVE_HYPNOSIS, MOVE_BUBBLE },\n        .nature = NATURE_RASH,\n        .gender = MALE,\n    },\n    {\n        .side = B_SIDE_PLAYER,\n        .level = 15,\n        .species = SPECIES_BUTTERFREE,\n        .moves = { MOVE_CONFUSION, MOVE_POISON_POWDER, MOVE_STUN_SPORE, MOVE_SLEEP_POWDER },\n        .nature = NATURE_RASH,\n        .gender = MALE,\n    },\n    {\n        .side = B_SIDE_OPPONENT,\n        .level = 14,\n        .species = SPECIES_ODDISH,\n        .moves = { MOVE_ABSORB, MOVE_SWEET_SCENT, MOVE_POISON_POWDER },\n        .nature = NATURE_RASH,\n        .gender = MALE,\n    },\n    {0xFF}\n};\n\nstatic const struct PokedudeBattlePartyInfo sParties_Catching[] =\n{\n    {\n        .side = B_SIDE_PLAYER,\n        .level = 15,\n        .species = SPECIES_BUTTERFREE,\n        .moves = { MOVE_CONFUSION, MOVE_POISON_POWDER, MOVE_SLEEP_POWDER, MOVE_STUN_SPORE },\n        .nature = NATURE_RASH,\n        .gender = MALE,\n    },\n    {\n        .side = B_SIDE_OPPONENT,\n        .level = 11,\n        .species = SPECIES_JIGGLYPUFF,\n        .moves = { MOVE_SING, MOVE_DEFENSE_CURL, MOVE_POUND },\n        .nature = NATURE_CAREFUL,\n        .gender = MALE,\n    },\n    {0xFF}\n};\n\n\nstatic const struct PokedudeBattlePartyInfo *const sPokedudeBattlePartyPointers[] =\n{\n    [TTVSCR_BATTLE]   = sParties_Battle,\n    [TTVSCR_STATUS]   = sParties_Status,\n    [TTVSCR_MATCHUPS] = sParties_Matchups,\n    [TTVSCR_CATCHING] = sParties_Catching,\n};\n\nstruct PokedudeBattlerState *gPokedudeBattlerStates[MAX_BATTLERS_COUNT];\n\nstatic void PokedudeSimulateInputChooseAction(void)\n{\n    const struct PokedudeInputScript *script_p = sInputScripts_ChooseAction[gBattleStruct->pdScriptNum];\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n    {\n        DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1);\n        DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1);\n    }\n    if (script_p[gPokedudeBattlerStates[gActiveBattler]->action_idx].delay[gActiveBattler] == gPokedudeBattlerStates[gActiveBattler]->timer)\n    {\n        if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n            PlaySE(SE_SELECT);\n        gPokedudeBattlerStates[gActiveBattler]->timer = 0;\n        switch (script_p[gPokedudeBattlerStates[gActiveBattler]->action_idx].cursorPos[gActiveBattler])\n        {\n        case 0:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, 0);\n            break;\n        case 1:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0);\n            break;\n        case 2:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);\n            break;\n        case 3:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0);\n            break;\n        }\n        PokedudeBufferExecCompleted();\n        ++gPokedudeBattlerStates[gActiveBattler]->action_idx;\n        if (script_p[gPokedudeBattlerStates[gActiveBattler]->action_idx].cursorPos[gActiveBattler] == 4)\n            gPokedudeBattlerStates[gActiveBattler]->action_idx = 0;\n    }\n    else\n    {\n        if (gActionSelectionCursor[gActiveBattler] != script_p[gPokedudeBattlerStates[gActiveBattler]->action_idx].cursorPos[gActiveBattler]\n            && script_p[gPokedudeBattlerStates[gActiveBattler]->action_idx].delay[gActiveBattler] / 2 == gPokedudeBattlerStates[gActiveBattler]->timer)\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] = script_p[gPokedudeBattlerStates[gActiveBattler]->action_idx].cursorPos[gActiveBattler];\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n        ++gPokedudeBattlerStates[gActiveBattler]->timer;\n    }\n}\n\nstatic void PokedudeSimulateInputChooseMove(void)\n{\n    const struct PokedudeInputScript *script_p = sInputScripts_ChooseMove[gBattleStruct->pdScriptNum];\n\n    if (script_p[gPokedudeBattlerStates[gActiveBattler]->move_idx].delay[gActiveBattler] == gPokedudeBattlerStates[gActiveBattler]->timer)\n    {\n        if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n            PlaySE(SE_SELECT);\n        gPokedudeBattlerStates[gActiveBattler]->timer = 0;\n        BtlController_EmitTwoReturnValues(1,\n                                          B_ACTION_EXEC_SCRIPT,\n                                          script_p[gPokedudeBattlerStates[gActiveBattler]->move_idx].cursorPos[gActiveBattler] | ((gActiveBattler ^ BIT_SIDE) << 8));\n        PokedudeBufferExecCompleted();\n        ++gPokedudeBattlerStates[gActiveBattler]->move_idx;\n        if (script_p[gPokedudeBattlerStates[gActiveBattler]->move_idx].cursorPos[gActiveBattler] == 255)\n            gPokedudeBattlerStates[gActiveBattler]->move_idx = 0;\n    }\n    else\n    {\n        if (script_p[gPokedudeBattlerStates[gActiveBattler]->move_idx].cursorPos[gActiveBattler] != gMoveSelectionCursor[gActiveBattler]\n            && script_p[gPokedudeBattlerStates[gActiveBattler]->move_idx].delay[gActiveBattler] / 2 == gPokedudeBattlerStates[gActiveBattler]->timer)\n        {\n            PlaySE(SE_SELECT);\n            MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);\n            gMoveSelectionCursor[gActiveBattler] = script_p[gPokedudeBattlerStates[gActiveBattler]->move_idx].cursorPos[gActiveBattler];\n            MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);\n        }\n        ++gPokedudeBattlerStates[gActiveBattler]->timer;\n    }\n}\n\nstatic bool8 HandlePokedudeVoiceoverEtc(void)\n{\n    const struct PokedudeTextScriptHeader *header_p = sPokedudeTextScripts[gBattleStruct->pdScriptNum];\n    const u16 * bstringid_p = (const u16 *)&gBattleBufferA[gActiveBattler][2];\n\n    if (gBattleBufferA[gActiveBattler][0] != header_p[gBattleStruct->pdMessageNo].btlcmd)\n        return FALSE;\n    if (gActiveBattler != header_p[gBattleStruct->pdMessageNo].side)\n        return FALSE;\n    if (gBattleBufferA[gActiveBattler][0] == CONTROLLER_PRINTSTRING && header_p[gBattleStruct->pdMessageNo].stringid != *bstringid_p)\n        return FALSE;\n    if (header_p[gBattleStruct->pdMessageNo].callback == NULL)\n    {\n        gBattleStruct->pdMessageNo++;\n        return FALSE;\n    }\n    gBattlerControllerFuncs[gActiveBattler] = header_p[gBattleStruct->pdMessageNo].callback;\n    gPokedudeBattlerStates[gActiveBattler]->timer = 0;\n    gPokedudeBattlerStates[gActiveBattler]->msg_idx = header_p[gBattleStruct->pdMessageNo].stringid;\n    gBattleStruct->pdMessageNo++;\n    return TRUE;\n}\n\nstatic void ReturnFromPokedudeAction(void)\n{\n    gPokedudeBattlerStates[gActiveBattler]->timer = 0;\n    gBattlerControllerFuncs[gActiveBattler] = PokedudeBufferRunCommand;\n}\n\nstatic void PokedudeAction_PrintVoiceoverMessage(void)\n{\n    switch (gPokedudeBattlerStates[gActiveBattler]->timer)\n    {\n    case 0:\n        if (!gPaletteFade.active)\n        {\n            BeginNormalPaletteFade(0xFFFFFF7F, 4, 0, 8, RGB_BLACK);\n            ++gPokedudeBattlerStates[gActiveBattler]->timer;\n        }\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n        {\n            gPokedudeBattlerStates[gActiveBattler]->saved_bg0y = gBattle_BG0_Y;\n            BtlCtrl_DrawVoiceoverMessageFrame();\n            ++gPokedudeBattlerStates[gActiveBattler]->timer;\n        }\n        break;\n    case 2:\n        gBattle_BG0_Y = 0;\n        BattleStringExpandPlaceholdersToDisplayedString(GetPokedudeText());\n        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN);\n        ++gPokedudeBattlerStates[gActiveBattler]->timer;\n        break;\n    case 3:\n        if (!IsTextPrinterActive(24) && JOY_NEW(A_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            BeginNormalPaletteFade(0xFFFFFF7F, 4, 8, 0, RGB_BLACK);\n            ++gPokedudeBattlerStates[gActiveBattler]->timer;\n        }\n        break;\n    case 4:\n        if (!gPaletteFade.active)\n        {\n            if (gPokedudeBattlerStates[gActiveBattler]->msg_idx == STRINGID_PKMNGAINEDEXP)\n            {\n                BattleStopLowHpSound();\n                PlayBGM(MUS_VICTORY_WILD);\n            }\n            gBattle_BG0_Y = gPokedudeBattlerStates[gActiveBattler]->saved_bg0y;\n            BtlCtrl_RemoveVoiceoverMessageFrame();\n            ReturnFromPokedudeAction();\n        }\n        break;\n    }\n}\n\nstatic void PokedudeAction_PrintMessageWithHealthboxPals(void)\n{\n    switch (gPokedudeBattlerStates[gActiveBattler]->timer)\n    {\n    case 0:\n        if (!gPaletteFade.active)\n        {\n            DoLoadHealthboxPalsForLevelUp(&gBattleStruct->pdHealthboxPal2,\n                                          &gBattleStruct->pdHealthboxPal1,\n                                          GetBattlerAtPosition(B_POSITION_PLAYER_LEFT));\n            BeginNormalPaletteFade(0xFFFFFF7F, 4, 0, 8, RGB_BLACK);\n            ++gPokedudeBattlerStates[gActiveBattler]->timer;\n        }\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n        {\n            u32 mask = (gBitTable[gBattleStruct->pdHealthboxPal2] | gBitTable[gBattleStruct->pdHealthboxPal1]) << 16;\n\n            ++mask; // It's possible that this is influenced by other functions, as\n            --mask; // this also striked in battle_controller_oak_old_man.c but was naturally fixed.\n            BeginNormalPaletteFade(mask, 4, 8, 0, RGB_BLACK);\n            ++gPokedudeBattlerStates[gActiveBattler]->timer;\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            BtlCtrl_DrawVoiceoverMessageFrame();\n            ++gPokedudeBattlerStates[gActiveBattler]->timer;\n        }\n        break;\n    case 3:\n        BattleStringExpandPlaceholdersToDisplayedString(GetPokedudeText());\n        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_OAK_OLD_MAN);\n        ++gPokedudeBattlerStates[gActiveBattler]->timer;\n        break;\n    case 4:\n        if (!IsTextPrinterActive(24) && JOY_NEW(A_BUTTON))\n        {\n            u32 mask;\n\n            PlaySE(SE_SELECT);\n            mask = (gBitTable[gBattleStruct->pdHealthboxPal2] | gBitTable[gBattleStruct->pdHealthboxPal1]) << 16;\n            ++mask;\n            --mask;\n            BeginNormalPaletteFade(mask, 4, 0, 8, RGB_BLACK);\n            ++gPokedudeBattlerStates[gActiveBattler]->timer;\n        }\n        break;\n    case 5:\n        if (!gPaletteFade.active)\n        {\n            BeginNormalPaletteFade(0xFFFFFF7F, 4, 8, 0, RGB_BLACK);\n            ++gPokedudeBattlerStates[gActiveBattler]->timer;\n        }\n        break;\n    case 6:\n        if (!gPaletteFade.active)\n        {\n            if (gPokedudeBattlerStates[gActiveBattler]->msg_idx == STRINGID_PKMNGAINEDEXP)\n            {\n                BattleStopLowHpSound();\n                PlayBGM(MUS_VICTORY_WILD);\n            }\n            DoFreeHealthboxPalsForLevelUp(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT));\n            BtlCtrl_RemoveVoiceoverMessageFrame();\n            ReturnFromPokedudeAction();\n        }\n        break;\n    }\n}\n\nstatic const u8 *GetPokedudeText(void)\n{\n    switch (gBattleStruct->pdScriptNum)\n    {\n    case TTVSCR_BATTLE:\n    default:\n        return sPokedudeTexts_Battle[gBattleStruct->pdMessageNo - 1];\n    case TTVSCR_STATUS:\n        return sPokedudeTexts_Status[gBattleStruct->pdMessageNo - 1];\n    case TTVSCR_MATCHUPS:\n        return sPokedudeTexts_TypeMatchup[gBattleStruct->pdMessageNo - 1];\n    case TTVSCR_CATCHING:\n        return sPokedudeTexts_Catching[gBattleStruct->pdMessageNo - 1];\n    }\n}\n\nvoid InitPokedudePartyAndOpponent(void)\n{\n    s32 i, j;\n    struct Pokemon *mon;\n    s32 myIdx = 0;\n    s32 opIdx = 0;\n    const struct PokedudeBattlePartyInfo *data;\n\n    gBattleTypeFlags = BATTLE_TYPE_POKEDUDE;\n    ZeroPlayerPartyMons();\n    ZeroEnemyPartyMons();\n    data = sPokedudeBattlePartyPointers[gSpecialVar_0x8004];\n    i = 0;\n    do\n    {\n        if (data[i].side == B_SIDE_PLAYER)\n            mon = &gPlayerParty[myIdx++];\n        else\n            mon = &gEnemyParty[opIdx++];\n        CreateMonWithGenderNatureLetter(mon, data[i].species, data[i].level, 0, data[i].gender, data[i].nature, 0);\n        for (j = 0; j < 4; ++j)\n            SetMonMoveSlot(mon, data[i].moves[j], j);\n    } while (data[++i].side != 0xFF);\n}\n"
  },
  {
    "path": "src/battle_controller_safari.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_controllers.h\"\n#include \"battle_interface.h\"\n#include \"battle_message.h\"\n#include \"data.h\"\n#include \"item_menu.h\"\n#include \"link.h\"\n#include \"main.h\"\n#include \"pokeball.h\"\n#include \"util.h\"\n#include \"strings.h\"\n#include \"constants/songs.h\"\n#include \"constants/battle_anim.h\"\n\nstatic void SafariHandleGetMonData(void);\nstatic void SafariHandleGetRawMonData(void);\nstatic void SafariHandleSetMonData(void);\nstatic void SafariHandleSetRawMonData(void);\nstatic void SafariHandleLoadMonSprite(void);\nstatic void SafariHandleSwitchInAnim(void);\nstatic void SafariHandleReturnMonToBall(void);\nstatic void SafariHandleDrawTrainerPic(void);\nstatic void SafariHandleTrainerSlide(void);\nstatic void SafariHandleTrainerSlideBack(void);\nstatic void SafariHandleFaintAnimation(void);\nstatic void SafariHandlePaletteFade(void);\nstatic void SafariHandleSuccessBallThrowAnim(void);\nstatic void SafariHandleBallThrowAnim(void);\nstatic void SafariHandlePause(void);\nstatic void SafariHandleMoveAnimation(void);\nstatic void SafariHandlePrintString(void);\nstatic void SafariHandlePrintSelectionString(void);\nstatic void SafariHandleChooseAction(void);\nstatic void SafariHandleUnknownYesNoBox(void);\nstatic void SafariHandleChooseMove(void);\nstatic void SafariHandleChooseItem(void);\nstatic void SafariHandleChoosePokemon(void);\nstatic void SafariHandleCmd23(void);\nstatic void SafariHandleHealthBarUpdate(void);\nstatic void SafariHandleExpUpdate(void);\nstatic void SafariHandleStatusIconUpdate(void);\nstatic void SafariHandleStatusAnimation(void);\nstatic void SafariHandleStatusXor(void);\nstatic void SafariHandleDataTransfer(void);\nstatic void SafariHandleDMA3Transfer(void);\nstatic void SafariHandlePlayBGM(void);\nstatic void SafariHandleCmd32(void);\nstatic void SafariHandleTwoReturnValues(void);\nstatic void SafariHandleChosenMonReturnValue(void);\nstatic void SafariHandleOneReturnValue(void);\nstatic void SafariHandleOneReturnValue_Duplicate(void);\nstatic void SafariHandleCmd37(void);\nstatic void SafariHandleCmd38(void);\nstatic void SafariHandleCmd39(void);\nstatic void SafariHandleCmd40(void);\nstatic void SafariHandleHitAnimation(void);\nstatic void SafariHandleCmd42(void);\nstatic void SafariHandlePlaySE(void);\nstatic void SafariHandlePlayFanfareOrBGM(void);\nstatic void SafariHandleFaintingCry(void);\nstatic void SafariHandleIntroSlide(void);\nstatic void SafariHandleIntroTrainerBallThrow(void);\nstatic void SafariHandleDrawPartyStatusSummary(void);\nstatic void SafariHandleHidePartyStatusSummary(void);\nstatic void SafariHandleEndBounceEffect(void);\nstatic void SafariHandleSpriteInvisibility(void);\nstatic void SafariHandleBattleAnimation(void);\nstatic void SafariHandleLinkStandbyMsg(void);\nstatic void SafariHandleResetActionMoveSelection(void);\nstatic void SafariHandleCmd55(void);\nstatic void SafariCmdEnd(void);\n\nstatic void SafariBufferRunCommand(void);\nstatic void SafariBufferExecCompleted(void);\nstatic void CompleteWhenChosePokeblock(void);\n\nstatic void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) =\n{\n    [CONTROLLER_GETMONDATA]               = SafariHandleGetMonData,\n    [CONTROLLER_GETRAWMONDATA]            = SafariHandleGetRawMonData,\n    [CONTROLLER_SETMONDATA]               = SafariHandleSetMonData,\n    [CONTROLLER_SETRAWMONDATA]            = SafariHandleSetRawMonData,\n    [CONTROLLER_LOADMONSPRITE]            = SafariHandleLoadMonSprite,\n    [CONTROLLER_SWITCHINANIM]             = SafariHandleSwitchInAnim,\n    [CONTROLLER_RETURNMONTOBALL]          = SafariHandleReturnMonToBall,\n    [CONTROLLER_DRAWTRAINERPIC]           = SafariHandleDrawTrainerPic,\n    [CONTROLLER_TRAINERSLIDE]             = SafariHandleTrainerSlide,\n    [CONTROLLER_TRAINERSLIDEBACK]         = SafariHandleTrainerSlideBack,\n    [CONTROLLER_FAINTANIMATION]           = SafariHandleFaintAnimation,\n    [CONTROLLER_PALETTEFADE]              = SafariHandlePaletteFade,\n    [CONTROLLER_SUCCESSBALLTHROWANIM]     = SafariHandleSuccessBallThrowAnim,\n    [CONTROLLER_BALLTHROWANIM]            = SafariHandleBallThrowAnim,\n    [CONTROLLER_PAUSE]                    = SafariHandlePause,\n    [CONTROLLER_MOVEANIMATION]            = SafariHandleMoveAnimation,\n    [CONTROLLER_PRINTSTRING]              = SafariHandlePrintString,\n    [CONTROLLER_PRINTSTRINGPLAYERONLY]    = SafariHandlePrintSelectionString,\n    [CONTROLLER_CHOOSEACTION]             = SafariHandleChooseAction,\n    [CONTROLLER_UNKNOWNYESNOBOX]          = SafariHandleUnknownYesNoBox,\n    [CONTROLLER_CHOOSEMOVE]               = SafariHandleChooseMove,\n    [CONTROLLER_OPENBAG]                  = SafariHandleChooseItem,\n    [CONTROLLER_CHOOSEPOKEMON]            = SafariHandleChoosePokemon,\n    [CONTROLLER_23]                       = SafariHandleCmd23,\n    [CONTROLLER_HEALTHBARUPDATE]          = SafariHandleHealthBarUpdate,\n    [CONTROLLER_EXPUPDATE]                = SafariHandleExpUpdate,\n    [CONTROLLER_STATUSICONUPDATE]         = SafariHandleStatusIconUpdate,\n    [CONTROLLER_STATUSANIMATION]          = SafariHandleStatusAnimation,\n    [CONTROLLER_STATUSXOR]                = SafariHandleStatusXor,\n    [CONTROLLER_DATATRANSFER]             = SafariHandleDataTransfer,\n    [CONTROLLER_DMA3TRANSFER]             = SafariHandleDMA3Transfer,\n    [CONTROLLER_PLAYBGM]                  = SafariHandlePlayBGM,\n    [CONTROLLER_32]                       = SafariHandleCmd32,\n    [CONTROLLER_TWORETURNVALUES]          = SafariHandleTwoReturnValues,\n    [CONTROLLER_CHOSENMONRETURNVALUE]     = SafariHandleChosenMonReturnValue,\n    [CONTROLLER_ONERETURNVALUE]           = SafariHandleOneReturnValue,\n    [CONTROLLER_ONERETURNVALUE_DUPLICATE] = SafariHandleOneReturnValue_Duplicate,\n    [CONTROLLER_CLEARUNKVAR]              = SafariHandleCmd37,\n    [CONTROLLER_SETUNKVAR]                = SafariHandleCmd38,\n    [CONTROLLER_CLEARUNKFLAG]             = SafariHandleCmd39,\n    [CONTROLLER_TOGGLEUNKFLAG]            = SafariHandleCmd40,\n    [CONTROLLER_HITANIMATION]             = SafariHandleHitAnimation,\n    [CONTROLLER_CANTSWITCH]               = SafariHandleCmd42,\n    [CONTROLLER_PLAYSE]                   = SafariHandlePlaySE,\n    [CONTROLLER_PLAYFANFARE]              = SafariHandlePlayFanfareOrBGM,\n    [CONTROLLER_FAINTINGCRY]              = SafariHandleFaintingCry,\n    [CONTROLLER_INTROSLIDE]               = SafariHandleIntroSlide,\n    [CONTROLLER_INTROTRAINERBALLTHROW]    = SafariHandleIntroTrainerBallThrow,\n    [CONTROLLER_DRAWPARTYSTATUSSUMMARY]   = SafariHandleDrawPartyStatusSummary,\n    [CONTROLLER_HIDEPARTYSTATUSSUMMARY]   = SafariHandleHidePartyStatusSummary,\n    [CONTROLLER_ENDBOUNCE]                = SafariHandleEndBounceEffect,\n    [CONTROLLER_SPRITEINVISIBILITY]       = SafariHandleSpriteInvisibility,\n    [CONTROLLER_BATTLEANIMATION]          = SafariHandleBattleAnimation,\n    [CONTROLLER_LINKSTANDBYMSG]           = SafariHandleLinkStandbyMsg,\n    [CONTROLLER_RESETACTIONMOVESELECTION] = SafariHandleResetActionMoveSelection,\n    [CONTROLLER_ENDLINKBATTLE]            = SafariHandleCmd55,\n    [CONTROLLER_TERMINATOR_NOP]           = SafariCmdEnd,\n};\n\n// not used\nstatic void SafariDummy(void)\n{\n}\n\nvoid SetControllerToSafari(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = SafariBufferRunCommand;\n}\n\nstatic void SafariBufferRunCommand(void)\n{\n    if (gBattleControllerExecFlags & gBitTable[gActiveBattler])\n    {\n        if (gBattleBufferA[gActiveBattler][0] < NELEMS(sSafariBufferCommands))\n            sSafariBufferCommands[gBattleBufferA[gActiveBattler][0]]();\n        else\n            SafariBufferExecCompleted();\n    }\n}\n\nstatic void HandleInputChooseAction(void)\n{\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n\n        switch (gActionSelectionCursor[gActiveBattler])\n        {\n        case 0:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_BALL, 0);\n            break;\n        case 1:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_BAIT, 0);\n            break;\n        case 2:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_GO_NEAR, 0);\n            break;\n        case 3:\n            BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_RUN, 0);\n            break;\n        }\n        SafariBufferExecCompleted();\n    }\n    else if (JOY_NEW(DPAD_LEFT))\n    {\n        if (gActionSelectionCursor[gActiveBattler] & 1)\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] ^= 1;\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n    }\n    else if (JOY_NEW(DPAD_RIGHT))\n    {\n        if (!(gActionSelectionCursor[gActiveBattler] & 1))\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] ^= 1;\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n    }\n    else if (JOY_NEW(DPAD_UP))\n    {\n        if (gActionSelectionCursor[gActiveBattler] & 2)\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] ^= 2;\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n    }\n    else if (JOY_NEW(DPAD_DOWN))\n    {\n        if (!(gActionSelectionCursor[gActiveBattler] & 2))\n        {\n            PlaySE(SE_SELECT);\n            ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n            gActionSelectionCursor[gActiveBattler] ^= 2;\n            ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n        }\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);\n        gActionSelectionCursor[gActiveBattler] = 3;\n        ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n    }\n}\n\nstatic void CompleteOnBattlerSpriteCallbackDummy(void)\n{\n    if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        SafariBufferExecCompleted();\n}\n\nstatic void CompleteOnInactiveTextPrinter(void)\n{\n    if (!IsTextPrinterActive(0))\n        SafariBufferExecCompleted();\n}\n\nstatic void CompleteOnHealthboxSpriteCallbackDummy(void)\n{\n    if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)\n        SafariBufferExecCompleted();\n}\n\nstatic void Safari_SetBattleEndCallbacks(void)\n{\n    if (!gPaletteFade.active)\n    {\n        gMain.inBattle = FALSE;\n        gMain.callback1 = gPreBattleCallback1;\n        SetMainCallback2(gMain.savedCallback);\n    }\n}\n\nstatic void CompleteOnSpecialAnimDone(void)\n{\n    if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)\n        SafariBufferExecCompleted();\n}\n\nstatic void SafariOpenPokeblockCase(void)\n{\n    if (!gPaletteFade.active)\n        gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChosePokeblock;\n}\n\nstatic void CompleteWhenChosePokeblock(void)\n{\n    if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)\n    {\n        BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId);\n        SafariBufferExecCompleted();\n    }\n}\n\nstatic void CompleteOnFinishedBattleAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)\n        SafariBufferExecCompleted();\n}\n\nstatic void SafariBufferExecCompleted(void)\n{\n    gBattlerControllerFuncs[gActiveBattler] = SafariBufferRunCommand;\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        u8 playerId = GetMultiplayerId();\n\n        PrepareBufferDataTransferLink(2, 4, &playerId);\n        gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;\n    }\n    else\n    {\n        gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];\n    }\n}\n\n// not used\nstatic void CompleteOnFinishedStatusAnimation(void)\n{\n    if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)\n        SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleGetMonData(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleGetRawMonData(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleSetMonData(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleSetRawMonData(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleLoadMonSprite(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleSwitchInAnim(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleReturnMonToBall(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleDrawTrainerPic(void)\n{\n    DecompressTrainerBackPalette(gSaveBlock2Ptr->playerGender, gActiveBattler);\n    SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(gActiveBattler));\n    gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,\n                                                     80,\n                                                     (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].size) * 4 + 80,\n                                                     30);\n    gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;\n    if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n        gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -240;\n    gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn;\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;\n}\n\nstatic void SafariHandleTrainerSlide(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleTrainerSlideBack(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleFaintAnimation(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandlePaletteFade(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleSuccessBallThrowAnim(void)\n{\n    gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;\n    gDoingBattleAnim = TRUE;\n    InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;\n}\n\nstatic void SafariHandleBallThrowAnim(void)\n{\n    u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1];\n\n    gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;\n    gDoingBattleAnim = TRUE;\n    InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;\n}\n\nstatic void SafariHandlePause(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleMoveAnimation(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandlePrintString(void)\n{\n    u16 *stringId;\n\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    stringId = (u16 *)(&gBattleBufferA[gActiveBattler][2]);\n    BufferStringBattle(*stringId);\n    if (BattleStringShouldBeColored(*stringId))\n        BattlePutTextOnWindow(gDisplayedStringBattle, (B_WIN_MSG | B_TEXT_FLAG_NPC_CONTEXT_FONT));\n    else\n        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;\n}\n\nstatic void SafariHandlePrintSelectionString(void)\n{\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        SafariHandlePrintString();\n    else\n        SafariBufferExecCompleted();\n}\n\nstatic void HandleChooseActionAfterDma3(void)\n{\n    if (!IsDma3ManagerBusyWithBgCopy())\n    {\n        gBattle_BG0_X = 0;\n        gBattle_BG0_Y = 160;\n        gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction;\n    }\n}\n\nstatic void SafariHandleChooseAction(void)\n{\n    s32 i;\n\n    gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3;\n    BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG);\n    BattlePutTextOnWindow(gText_SafariZoneMenu, B_WIN_ACTION_MENU);\n    for (i = 0; i < 4; ++i)\n        ActionSelectionDestroyCursorAt(i);\n    ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);\n    BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPlayerThrow);\n    BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_ACTION_PROMPT);\n}\n\nstatic void SafariHandleUnknownYesNoBox(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleChooseMove(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleChooseItem(void)\n{\n    s32 i;\n\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n    gBattlerControllerFuncs[gActiveBattler] = SafariOpenPokeblockCase;\n    gBattlerInMenuId = gActiveBattler;\n}\n\nstatic void SafariHandleChoosePokemon(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleCmd23(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleHealthBarUpdate(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleExpUpdate(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleStatusIconUpdate(void)\n{\n    UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_SAFARI_BALLS_TEXT);\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleStatusAnimation(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleStatusXor(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleDataTransfer(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleDMA3Transfer(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandlePlayBGM(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleCmd32(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleTwoReturnValues(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleChosenMonReturnValue(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleOneReturnValue(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleOneReturnValue_Duplicate(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleCmd37(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleCmd38(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleCmd39(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleCmd40(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleHitAnimation(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleCmd42(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandlePlaySE(void)\n{\n    s8 pan;\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        pan = SOUND_PAN_ATTACKER;\n    else\n        pan = SOUND_PAN_TARGET;\n    PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandlePlayFanfareOrBGM(void)\n{\n    PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleFaintingCry(void)\n{\n    u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);\n\n    PlayCry_Normal(species, 25);\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleIntroSlide(void)\n{\n    HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);\n    gIntroSlideFlags |= 1;\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleIntroTrainerBallThrow(void)\n{\n    UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_SAFARI_ALL_TEXT);\n    StartHealthboxSlideIn(gActiveBattler);\n    SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);\n    gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthboxSpriteCallbackDummy;\n}\n\nstatic void SafariHandleDrawPartyStatusSummary(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleHidePartyStatusSummary(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleEndBounceEffect(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleSpriteInvisibility(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleBattleAnimation(void)\n{\n    u8 animationId = gBattleBufferA[gActiveBattler][1];\n    u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);\n\n    if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))\n        SafariBufferExecCompleted();\n    else\n        gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;\n}\n\nstatic void SafariHandleLinkStandbyMsg(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleResetActionMoveSelection(void)\n{\n    SafariBufferExecCompleted();\n}\n\nstatic void SafariHandleCmd55(void)\n{\n    gBattleOutcome = gBattleBufferA[gActiveBattler][1];\n    FadeOutMapMusic(5);\n    BeginFastPaletteFade(3);\n    SafariBufferExecCompleted();\n    if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER))\n        gBattlerControllerFuncs[gActiveBattler] = Safari_SetBattleEndCallbacks;\n}\n\nstatic void SafariCmdEnd(void)\n{\n}\n"
  },
  {
    "path": "src/battle_controllers.c",
    "content": "#include \"global.h\"\n#include \"battle.h\"\n#include \"battle_ai_script_commands.h\"\n#include \"battle_anim.h\"\n#include \"battle_controllers.h\"\n#include \"battle_message.h\"\n#include \"cable_club.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"party_menu.h\"\n#include \"task.h\"\n#include \"util.h\"\n#include \"constants/abilities.h\"\n\nstatic EWRAM_DATA u8 sLinkSendTaskId = 0;\nstatic EWRAM_DATA u8 sLinkReceiveTaskId = 0;\nstatic EWRAM_DATA u8 sUnused = 0; // Debug? Never read\nEWRAM_DATA struct UnusedControllerStruct gUnusedControllerStruct = {}; // Debug? Unused code that writes to it, never read\nstatic EWRAM_DATA u8 sBattleBuffersTransferData[0x100] = {};\n\nstatic void CreateTasksForSendRecvLinkBuffers(void);\nstatic void InitLinkBtlControllers(void);\nstatic void InitSinglePlayerBtlControllers(void);\nstatic void SetBattlePartyIds(void);\nstatic void Task_HandleSendLinkBuffersData(u8 taskId);\nstatic void Task_HandleCopyReceivedLinkBuffersData(u8 taskId);\n\nvoid HandleLinkBattleSetup(void)\n{\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        if (gWirelessCommType)\n            SetWirelessCommType1();\n        if (!gReceivedRemoteLinkPlayers)\n            OpenLink();\n        CreateTask(Task_WaitForLinkPlayerConnection, 0);\n        CreateTasksForSendRecvLinkBuffers();\n    }\n}\n\nvoid SetUpBattleVars(void)\n{\n    s32 i;\n\n    gBattleMainFunc = BeginBattleIntroDummy;\n\n    for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n    {\n        gBattlerControllerFuncs[i] = BattleControllerDummy;\n        gBattlerPositions[i] = 0xFF;\n        gActionSelectionCursor[i] = 0;\n        gMoveSelectionCursor[i] = 0;\n    }\n\n    HandleLinkBattleSetup();\n    gBattleControllerExecFlags = 0;\n    ClearBattleAnimationVars();\n    ClearBattleMonForms();\n    BattleAI_HandleItemUseBeforeAISetup();\n\n    // Below are never read\n    gUnusedFirstBattleVar1 = 0;\n    gUnusedFirstBattleVar2 = 0;\n}\n\nvoid InitBattleControllers(void)\n{\n    s32 i;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n        InitLinkBtlControllers();\n    else\n        InitSinglePlayerBtlControllers();\n\n    SetBattlePartyIds();\n\n    if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n    {\n        for (i = 0; i < gBattlersCount; i++)\n            BufferBattlePartyCurrentOrderBySide(i, 0);\n    }\n}\n\nstatic void InitSinglePlayerBtlControllers(void)\n{\n    if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))\n    {\n        gBattleMainFunc = BeginBattleIntro;\n        if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)\n        {\n            gBattlerControllerFuncs[0] = SetControllerToPokedude;\n            gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;\n            gBattlerControllerFuncs[1] = SetControllerToPokedude;\n            gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;\n            gBattlersCount = 2;\n        }\n        else\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)\n                gBattlerControllerFuncs[0] = SetControllerToSafari;\n            else if (gBattleTypeFlags & (BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE))\n                gBattlerControllerFuncs[0] = SetControllerToOakOrOldMan;\n            else\n                gBattlerControllerFuncs[0] = SetControllerToPlayer;\n            gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;\n            gBattlerControllerFuncs[1] = SetControllerToOpponent;\n            gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;\n            gBattlersCount = 2;\n        }\n    }\n    else\n    {\n        gBattleMainFunc = BeginBattleIntro;\n        if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)\n        {\n            gBattlerControllerFuncs[0] = SetControllerToPokedude;\n            gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;\n            gBattlerControllerFuncs[1] = SetControllerToPokedude;\n            gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;\n            gBattlerControllerFuncs[2] = SetControllerToPokedude;\n            gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT;\n            gBattlerControllerFuncs[3] = SetControllerToPokedude;\n            gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;\n            gBattlersCount = MAX_BATTLERS_COUNT;\n        }\n        else\n        {\n            gBattlerControllerFuncs[0] = SetControllerToPlayer;\n            gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;\n            gBattlerControllerFuncs[1] = SetControllerToOpponent;\n            gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;\n            gBattlerControllerFuncs[2] = SetControllerToPlayer;\n            gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT;\n            gBattlerControllerFuncs[3] = SetControllerToOpponent;\n            gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;\n            gBattlersCount = MAX_BATTLERS_COUNT;\n        }\n    }\n}\n\nstatic void InitLinkBtlControllers(void)\n{\n    s32 i;\n    u8 multiplayerId;\n\n    if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))\n    {\n        if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)\n        {\n            gBattleMainFunc = BeginBattleIntro;\n\n            gBattlerControllerFuncs[0] = SetControllerToPlayer;\n            gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;\n\n            gBattlerControllerFuncs[1] = SetControllerToLinkOpponent;\n            gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;\n\n            gBattlersCount = 2;\n        }\n        else\n        {\n            gBattlerControllerFuncs[1] = SetControllerToPlayer;\n            gBattlerPositions[1] = B_POSITION_PLAYER_LEFT;\n\n            gBattlerControllerFuncs[0] = SetControllerToLinkOpponent;\n            gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT;\n\n            gBattlersCount = 2;\n        }\n    }\n    else if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n    {\n        if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)\n        {\n            gBattleMainFunc = BeginBattleIntro;\n\n            gBattlerControllerFuncs[0] = SetControllerToPlayer;\n            gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;\n\n            gBattlerControllerFuncs[1] = SetControllerToLinkOpponent;\n            gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;\n\n            gBattlerControllerFuncs[2] = SetControllerToPlayer;\n            gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT;\n\n            gBattlerControllerFuncs[3] = SetControllerToLinkOpponent;\n            gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;\n\n            gBattlersCount = MAX_BATTLERS_COUNT;\n        }\n        else\n        {\n            gBattlerControllerFuncs[1] = SetControllerToPlayer;\n            gBattlerPositions[1] = B_POSITION_PLAYER_LEFT;\n\n            gBattlerControllerFuncs[0] = SetControllerToLinkOpponent;\n            gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT;\n\n            gBattlerControllerFuncs[3] = SetControllerToPlayer;\n            gBattlerPositions[3] = B_POSITION_PLAYER_RIGHT;\n\n            gBattlerControllerFuncs[2] = SetControllerToLinkOpponent;\n            gBattlerPositions[2] = B_POSITION_OPPONENT_RIGHT;\n\n            gBattlersCount = MAX_BATTLERS_COUNT;\n        }\n    }\n    else\n    {\n        multiplayerId = GetMultiplayerId();\n\n        if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)\n            gBattleMainFunc = BeginBattleIntro;\n\n        for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n        {\n            switch (gLinkPlayers[i].id)\n            {\n            case 0:\n            case 3:\n                BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 0);\n                break;\n            case 1:\n            case 2:\n                BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 1);\n                break;\n            }\n\n            if (i == multiplayerId)\n            {\n                gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToPlayer;\n                switch (gLinkPlayers[i].id)\n                {\n                case 0:\n                case 3:\n                    gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT;\n                    gBattlerPartyIndexes[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT;\n                    break;\n                case 1:\n                case 2:\n                    gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT;\n                    gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;\n                    break;\n                }\n            }\n            else\n            {\n                if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1))\n                 || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1)))\n                {\n                    gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkPartner;\n                    switch (gLinkPlayers[i].id)\n                    {\n                    case 0:\n                    case 3:\n                        gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT;\n                        gBattlerPartyIndexes[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT;\n                        break;\n                    case 1:\n                    case 2:\n                        gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT;\n                        gBattlerPartyIndexes[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT;\n                        break;\n                    }\n                }\n                else\n                {\n                    gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkOpponent;\n                    switch (gLinkPlayers[i].id)\n                    {\n                    case 0:\n                    case 3:\n                        gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_LEFT;\n                        gBattlerPartyIndexes[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT;\n                        break;\n                    case 1:\n                    case 2:\n                        gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT;\n                        gBattlerPartyIndexes[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT;\n                        break;\n                    }\n                }\n            }\n        }\n\n        gBattlersCount = MAX_BATTLERS_COUNT;\n    }\n}\n\nstatic void SetBattlePartyIds(void)\n{\n    s32 i, j;\n\n    if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n    {\n        for (i = 0; i < gBattlersCount; i++)\n        {\n            for (j = 0; j < PARTY_SIZE; ++j)\n            {\n                if (i < 2)\n                {\n                    if (GET_BATTLER_SIDE2(i) == B_SIDE_PLAYER)\n                    {\n                        if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0\n                         && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE\n                         && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG\n                         && !GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG))\n                        {\n                            gBattlerPartyIndexes[i] = j;\n                            break;\n                        }\n                    }\n                    else\n                    {\n                        if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0\n                         && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE\n                         && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG\n                         && !GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG))\n                        {\n                            gBattlerPartyIndexes[i] = j;\n                            break;\n                        }\n                    }\n                }\n                else\n                {\n                    if (GET_BATTLER_SIDE2(i) == B_SIDE_PLAYER)\n                    {\n                        if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0\n                         && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != SPECIES_NONE  // Probably a typo by Game Freak. The rest use SPECIES2.\n                         && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG\n                         && !GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG)\n                         && gBattlerPartyIndexes[i - 2] != j)\n                        {\n                            gBattlerPartyIndexes[i] = j;\n                            break;\n                        }\n                    }\n                    else\n                    {\n                        if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0\n                         && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE\n                         && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG\n                         && !GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG)\n                         && gBattlerPartyIndexes[i - 2] != j)\n                        {\n                            gBattlerPartyIndexes[i] = j;\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nstatic void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size)\n{\n    s32 i;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        PrepareBufferDataTransferLink(bufferId, size, data);\n    }\n    else\n    {\n        switch (bufferId)\n        {\n        case BUFFER_A:\n            for (i = 0; i < size; data++, i++)\n                gBattleBufferA[gActiveBattler][i] = *data;\n            break;\n        case BUFFER_B:\n            for (i = 0; i < size; data++, i++)\n                gBattleBufferB[gActiveBattler][i] = *data;\n            break;\n        }\n    }\n}\n\nstatic void CreateTasksForSendRecvLinkBuffers(void)\n{\n    sLinkSendTaskId = CreateTask(Task_HandleSendLinkBuffersData, 0);\n    gTasks[sLinkSendTaskId].data[11] = 0;\n    gTasks[sLinkSendTaskId].data[12] = 0;\n    gTasks[sLinkSendTaskId].data[13] = 0;\n    gTasks[sLinkSendTaskId].data[14] = 0;\n    gTasks[sLinkSendTaskId].data[15] = 0;\n\n    sLinkReceiveTaskId = CreateTask(Task_HandleCopyReceivedLinkBuffersData, 0);\n    gTasks[sLinkReceiveTaskId].data[12] = 0;\n    gTasks[sLinkReceiveTaskId].data[13] = 0;\n    gTasks[sLinkReceiveTaskId].data[14] = 0;\n    gTasks[sLinkReceiveTaskId].data[15] = 0;\n\n    sUnused = 0;\n}\n\nenum\n{\n    LINK_BUFF_BUFFER_ID,\n    LINK_BUFF_ACTIVE_BATTLER,\n    LINK_BUFF_ATTACKER,\n    LINK_BUFF_TARGET,\n    LINK_BUFF_SIZE_LO,\n    LINK_BUFF_SIZE_HI,\n    LINK_BUFF_ABSENT_BATTLER_FLAGS,\n    LINK_BUFF_EFFECT_BATTLER,\n    LINK_BUFF_DATA,\n};\n\nvoid PrepareBufferDataTransferLink(u8 bufferId, u16 size, u8 *data)\n{\n    s32 alignedSize;\n    s32 i;\n\n    alignedSize = size - size % 4 + 4;\n    if (gTasks[sLinkSendTaskId].data[14] + alignedSize + LINK_BUFF_DATA + 1 > BATTLE_BUFFER_LINK_SIZE)\n    {\n        gTasks[sLinkSendTaskId].data[12] = gTasks[sLinkSendTaskId].data[14];\n        gTasks[sLinkSendTaskId].data[14] = 0;\n    }\n    gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_BUFFER_ID] = bufferId;\n    gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_ACTIVE_BATTLER] = gActiveBattler;\n    gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_ATTACKER] = gBattlerAttacker;\n    gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_TARGET] = gBattlerTarget;\n    gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_SIZE_LO] = alignedSize;\n    gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_SIZE_HI] = (alignedSize & 0x0000FF00) >> 8;\n    gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_ABSENT_BATTLER_FLAGS] = gAbsentBattlerFlags;\n    gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_EFFECT_BATTLER] = gEffectBattler;\n\n    for (i = 0; i < size; i++)\n        gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_DATA + i] = data[i];\n\n    gTasks[sLinkSendTaskId].data[14] = gTasks[sLinkSendTaskId].data[14] + alignedSize + LINK_BUFF_DATA;\n}\n\nstatic void Task_HandleSendLinkBuffersData(u8 taskId)\n{\n    u16 blockSize;\n    s32 playerCount;\n\n    switch (gTasks[taskId].data[11])\n    {\n    case 0:\n        gTasks[taskId].data[10] = 100;\n        gTasks[taskId].data[11]++;\n        break;\n    case 1:\n        gTasks[taskId].data[10]--;\n        if (gTasks[taskId].data[10] == 0)\n        {\n            gTasks[taskId].data[11]++;\n            if (gReceivedRemoteLinkPlayers)\n                gTasks[taskId].data[11] = 3;\n        }\n        break;\n    case 2:\n        playerCount = GetLinkPlayerCount_2();\n        if ((gBattleTypeFlags & BATTLE_TYPE_MULTI && playerCount > 3) || (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && playerCount > 1))\n        {\n            if (IsLinkMaster())\n            {\n                CheckShouldAdvanceLinkState();\n                gTasks[taskId].data[11]++;\n            }\n            else\n            {\n                gTasks[taskId].data[11]++;\n            }\n        }\n        break;\n    case 3:\n        if (gTasks[taskId].data[15] != gTasks[taskId].data[14])\n        {\n            if (gTasks[taskId].data[13] == 0)\n            {\n                if (gTasks[taskId].data[15] > gTasks[taskId].data[14]\n                 && gTasks[taskId].data[15] == gTasks[taskId].data[12])\n                {\n                    gTasks[taskId].data[12] = 0;\n                    gTasks[taskId].data[15] = 0;\n                }\n                blockSize = (gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_LO] | (gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_HI] << 8)) + LINK_BUFF_DATA;\n                SendBlock(BitmaskAllOtherLinkPlayers(), &gLinkBattleSendBuffer[gTasks[taskId].data[15]], blockSize);\n                gTasks[taskId].data[11]++;\n            }\n            else\n            {\n                gTasks[taskId].data[13]--;\n                break;\n            }\n        }\n        break;\n    case 4:\n        if (IsLinkTaskFinished())\n        {\n            blockSize = gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_LO] | (gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_HI] << 8);\n            gTasks[taskId].data[13] = 5;\n            gTasks[taskId].data[15] = gTasks[taskId].data[15] + blockSize + LINK_BUFF_DATA;\n            gTasks[taskId].data[11] = 3;\n        }\n        break;\n    case 5:\n        if (--gTasks[taskId].data[13] == 0)\n        {\n            gTasks[taskId].data[13] = 5;\n            gTasks[taskId].data[11] = 3;\n        }\n        break;\n    }\n}\n\nvoid TryReceiveLinkBattleData(void)\n{\n    u32 i;\n    s32 j;\n    u8 *recvBuffer;\n\n    if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & BATTLE_TYPE_LINK_IN_BATTLE) && (gLinkPlayers[0].linkType == 0x2211))\n    {\n        DestroyTask_RfuIdle();\n        for (i = 0; i < GetLinkPlayerCount(); i++)\n        {\n            if (GetBlockReceivedStatus() & gBitTable[i])\n            {\n                ResetBlockReceivedFlag(i);\n                recvBuffer = (u8 *)gBlockRecvBuffer[i];\n                {\n                    u8 *dest, *src;\n                    u16 dataSize = gBlockRecvBuffer[i][2];\n\n                    if (gTasks[sLinkReceiveTaskId].data[14] + 9 + dataSize > 0x1000)\n                    {\n                        gTasks[sLinkReceiveTaskId].data[12] = gTasks[sLinkReceiveTaskId].data[14];\n                        gTasks[sLinkReceiveTaskId].data[14] = 0;\n                    }\n\n                    dest = &gLinkBattleRecvBuffer[gTasks[sLinkReceiveTaskId].data[14]];\n                    src = recvBuffer;\n\n                    for (j = 0; j < dataSize + 8; j++)\n                        dest[j] = src[j];\n\n                    gTasks[sLinkReceiveTaskId].data[14] = gTasks[sLinkReceiveTaskId].data[14] + dataSize + 8;\n                }\n            }\n        }\n    }\n}\n\nstatic void Task_HandleCopyReceivedLinkBuffersData(u8 taskId)\n{\n    u16 blockSize;\n    u8 battlerId;\n    u8 var;\n\n    if (gTasks[taskId].data[15] != gTasks[taskId].data[14])\n    {\n        if (gTasks[taskId].data[15] > gTasks[taskId].data[14]\n         && gTasks[taskId].data[15] == gTasks[taskId].data[12])\n        {\n            gTasks[taskId].data[12] = 0;\n            gTasks[taskId].data[15] = 0;\n        }\n        battlerId = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_ACTIVE_BATTLER];\n        blockSize = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_LO] | (gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_HI] << 8);\n\n        switch (gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 0])\n        {\n        case 0:\n            if (gBattleControllerExecFlags & gBitTable[battlerId])\n                return;\n\n            memcpy(gBattleBufferA[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA], blockSize);\n            MarkBattlerReceivedLinkData(battlerId);\n\n            if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER))\n            {\n                gBattlerAttacker = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_ATTACKER];\n                gBattlerTarget = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_TARGET];\n                gAbsentBattlerFlags = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_ABSENT_BATTLER_FLAGS];\n                gEffectBattler = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_EFFECT_BATTLER];\n            }\n            break;\n        case 1:\n            memcpy(gBattleBufferB[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA], blockSize);\n            break;\n        case 2:\n            var = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA];\n            gBattleControllerExecFlags &= ~(gBitTable[battlerId] << (var * 4));\n            break;\n        }\n\n        gTasks[taskId].data[15] = gTasks[taskId].data[15] + blockSize + LINK_BUFF_DATA;\n    }\n}\n\nvoid BtlController_EmitGetMonData(u8 bufferId, u8 requestId, u8 monToCheck)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_GETMONDATA;\n    sBattleBuffersTransferData[1] = requestId;\n    sBattleBuffersTransferData[2] = monToCheck;\n    sBattleBuffersTransferData[3] = 0;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\n// Unused\nstatic void BtlController_EmitGetRawMonData(u8 bufferId, u8 monId, u8 bytes)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_GETRAWMONDATA;\n    sBattleBuffersTransferData[1] = monId;\n    sBattleBuffersTransferData[2] = bytes;\n    sBattleBuffersTransferData[3] = 0;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitSetMonData(u8 bufferId, u8 requestId, u8 monToCheck, u8 bytes, void *data)\n{\n    s32 i;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_SETMONDATA;\n    sBattleBuffersTransferData[1] = requestId;\n    sBattleBuffersTransferData[2] = monToCheck;\n    for (i = 0; i < bytes; i++)\n        sBattleBuffersTransferData[3 + i] = *(u8 *)(data++);\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 3 + bytes);\n}\n\n// Unused\nstatic void BtlController_EmitSetRawMonData(u8 bufferId, u8 monId, u8 bytes, void *data)\n{\n    s32 i;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_SETRAWMONDATA;\n    sBattleBuffersTransferData[1] = monId;\n    sBattleBuffersTransferData[2] = bytes;\n    for (i = 0; i < bytes; i++)\n        sBattleBuffersTransferData[3 + i] = *(u8 *)(data++);\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, bytes + 3);\n}\n\nvoid BtlController_EmitLoadMonSprite(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_LOADMONSPRITE;\n    sBattleBuffersTransferData[1] = CONTROLLER_LOADMONSPRITE;\n    sBattleBuffersTransferData[2] = CONTROLLER_LOADMONSPRITE;\n    sBattleBuffersTransferData[3] = CONTROLLER_LOADMONSPRITE;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitSwitchInAnim(u8 bufferId, u8 partyId, bool8 dontClearSubstituteBit)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_SWITCHINANIM;\n    sBattleBuffersTransferData[1] = partyId;\n    sBattleBuffersTransferData[2] = dontClearSubstituteBit;\n    sBattleBuffersTransferData[3] = 5;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitReturnMonToBall(u8 bufferId, bool8 skipAnim)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_RETURNMONTOBALL;\n    sBattleBuffersTransferData[1] = skipAnim;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);\n}\n\nvoid BtlController_EmitDrawTrainerPic(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_DRAWTRAINERPIC;\n    sBattleBuffersTransferData[1] = CONTROLLER_DRAWTRAINERPIC;\n    sBattleBuffersTransferData[2] = CONTROLLER_DRAWTRAINERPIC;\n    sBattleBuffersTransferData[3] = CONTROLLER_DRAWTRAINERPIC;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitTrainerSlide(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_TRAINERSLIDE;\n    sBattleBuffersTransferData[1] = CONTROLLER_TRAINERSLIDE;\n    sBattleBuffersTransferData[2] = CONTROLLER_TRAINERSLIDE;\n    sBattleBuffersTransferData[3] = CONTROLLER_TRAINERSLIDE;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitTrainerSlideBack(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_TRAINERSLIDEBACK;\n    sBattleBuffersTransferData[1] = CONTROLLER_TRAINERSLIDEBACK;\n    sBattleBuffersTransferData[2] = CONTROLLER_TRAINERSLIDEBACK;\n    sBattleBuffersTransferData[3] = CONTROLLER_TRAINERSLIDEBACK;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitFaintAnimation(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_FAINTANIMATION;\n    sBattleBuffersTransferData[1] = CONTROLLER_FAINTANIMATION;\n    sBattleBuffersTransferData[2] = CONTROLLER_FAINTANIMATION;\n    sBattleBuffersTransferData[3] = CONTROLLER_FAINTANIMATION;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\n// Unused\nstatic void BtlController_EmitPaletteFade(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_PALETTEFADE;\n    sBattleBuffersTransferData[1] = CONTROLLER_PALETTEFADE;\n    sBattleBuffersTransferData[2] = CONTROLLER_PALETTEFADE;\n    sBattleBuffersTransferData[3] = CONTROLLER_PALETTEFADE;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\n// Unused\nstatic void BtlController_EmitSuccessBallThrowAnim(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_SUCCESSBALLTHROWANIM;\n    sBattleBuffersTransferData[1] = CONTROLLER_SUCCESSBALLTHROWANIM;\n    sBattleBuffersTransferData[2] = CONTROLLER_SUCCESSBALLTHROWANIM;\n    sBattleBuffersTransferData[3] = CONTROLLER_SUCCESSBALLTHROWANIM;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitBallThrowAnim(u8 bufferId, u8 caseId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_BALLTHROWANIM;\n    sBattleBuffersTransferData[1] = caseId;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);\n}\n\n// Unused\nstatic void BtlController_EmitPause(u8 bufferId, u8 toWait, void *data)\n{\n    s32 i;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_PAUSE;\n    sBattleBuffersTransferData[1] = toWait;\n    for (i = 0; i < toWait * 3; i++)\n        sBattleBuffersTransferData[2 + i] = *(u8 *)(data++);\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, toWait * 3 + 2);\n}\n\nvoid BtlController_EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, struct DisableStruct *disableStructPtr)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_MOVEANIMATION;\n    sBattleBuffersTransferData[1] = move;\n    sBattleBuffersTransferData[2] = (move & 0xFF00) >> 8;\n    sBattleBuffersTransferData[3] = turnOfMove;\n    sBattleBuffersTransferData[4] = movePower;\n    sBattleBuffersTransferData[5] = (movePower & 0xFF00) >> 8;\n    sBattleBuffersTransferData[6] = dmg;\n    sBattleBuffersTransferData[7] = (dmg & 0x0000FF00) >> 8;\n    sBattleBuffersTransferData[8] = (dmg & 0x00FF0000) >> 16;\n    sBattleBuffersTransferData[9] = (dmg & 0xFF000000) >> 24;\n    sBattleBuffersTransferData[10] = friendship;\n    sBattleBuffersTransferData[11] = gMultiHitCounter; // multihit in pokeem\n    if (WEATHER_HAS_EFFECT2)\n    {\n        sBattleBuffersTransferData[12] = gBattleWeather;\n        sBattleBuffersTransferData[13] = (gBattleWeather & 0xFF00) >> 8;\n    }\n    else\n    {\n        sBattleBuffersTransferData[12] = 0;\n        sBattleBuffersTransferData[13] = 0;\n    }\n    sBattleBuffersTransferData[14] = 0;\n    sBattleBuffersTransferData[15] = 0;\n    memcpy(&sBattleBuffersTransferData[16], disableStructPtr, sizeof(struct DisableStruct));\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 16 + sizeof(struct DisableStruct));\n}\n\nvoid BtlController_EmitPrintString(u8 bufferId, u16 stringID)\n{\n    s32 i;\n    struct BattleMsgData *stringInfo;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRING;\n    sBattleBuffersTransferData[1] = gBattleOutcome;\n    sBattleBuffersTransferData[2] = stringID;\n    sBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8;\n\n    stringInfo = (struct BattleMsgData *)(&sBattleBuffersTransferData[4]);\n    stringInfo->currentMove = gCurrentMove;\n    stringInfo->originallyUsedMove = gChosenMove;\n    stringInfo->lastItem = gLastUsedItem;\n    stringInfo->lastAbility = gLastUsedAbility;\n    stringInfo->scrActive = gBattleScripting.battler;\n    stringInfo->bakScriptPartyIdx = gBattleStruct->scriptPartyIdx;\n    stringInfo->hpScale = gBattleStruct->hpScale;\n    stringInfo->itemEffectBattler = gPotentialItemEffectBattler;\n    stringInfo->moveType = gBattleMoves[gCurrentMove].type;\n\n    for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n        stringInfo->abilities[i] = gBattleMons[i].ability;\n    for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++)\n    {\n        stringInfo->textBuffs[0][i] = gBattleTextBuff1[i];\n        stringInfo->textBuffs[1][i] = gBattleTextBuff2[i];\n        stringInfo->textBuffs[2][i] = gBattleTextBuff3[i];\n    }\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct BattleMsgData) + 4);\n}\n\nvoid BtlController_EmitPrintSelectionString(u8 bufferId, u16 stringID)\n{\n    s32 i;\n    struct BattleMsgData *stringInfo;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRINGPLAYERONLY;\n    sBattleBuffersTransferData[1] = CONTROLLER_PRINTSTRINGPLAYERONLY;\n    sBattleBuffersTransferData[2] = stringID;\n    sBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8;\n\n    stringInfo = (struct BattleMsgData *)(&sBattleBuffersTransferData[4]);\n    stringInfo->currentMove = gCurrentMove;\n    stringInfo->originallyUsedMove = gChosenMove;\n    stringInfo->lastItem = gLastUsedItem;\n    stringInfo->lastAbility = gLastUsedAbility;\n    stringInfo->scrActive = gBattleScripting.battler;\n    stringInfo->bakScriptPartyIdx = gBattleStruct->scriptPartyIdx;\n\n    for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n        stringInfo->abilities[i] = gBattleMons[i].ability;\n    for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++)\n    {\n        stringInfo->textBuffs[0][i] = gBattleTextBuff1[i];\n        stringInfo->textBuffs[1][i] = gBattleTextBuff2[i];\n        stringInfo->textBuffs[2][i] = gBattleTextBuff3[i];\n    }\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct BattleMsgData) + 4);\n}\n\n// itemId only relevant for B_ACTION_USE_ITEM\nvoid BtlController_EmitChooseAction(u8 bufferId, u8 action, u16 itemId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_CHOOSEACTION;\n    sBattleBuffersTransferData[1] = action;\n    sBattleBuffersTransferData[2] = itemId;\n    sBattleBuffersTransferData[3] = (itemId & 0xFF00) >> 8;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\n// Unused\nstatic void BtlController_EmitUnknownYesNoBox(u8 bufferId, u32 arg1) // TODO: Does the function name make sense for pokefirered?\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_UNKNOWNYESNOBOX;\n    sBattleBuffersTransferData[1] = arg1;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);\n}\n\nvoid BtlController_EmitChooseMove(u8 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData)\n{\n    s32 i;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_CHOOSEMOVE;\n    sBattleBuffersTransferData[1] = isDoubleBattle;\n    sBattleBuffersTransferData[2] = NoPpNumber;\n    sBattleBuffersTransferData[3] = 0;\n    for (i = 0; i < sizeof(*movePpData); i++)\n        sBattleBuffersTransferData[4 + i] = *((u8 *)(movePpData) + i);\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(*movePpData) + 4);\n}\n\nvoid BtlController_EmitChooseItem(u8 bufferId, u8 *battlePartyOrder)\n{\n    s32 i;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_OPENBAG;\n    for (i = 0; i < PARTY_SIZE / 2; i++)\n        sBattleBuffersTransferData[1 + i] = battlePartyOrder[i];\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 slotId, u8 abilityId, u8 *data)\n{\n    s32 i;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_CHOOSEPOKEMON;\n    sBattleBuffersTransferData[1] = caseId;\n    sBattleBuffersTransferData[2] = slotId;\n    sBattleBuffersTransferData[3] = abilityId;\n    for (i = 0; i < 3; i++)\n        sBattleBuffersTransferData[4 + i] = data[i];\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 8);  // Only 7 bytes were written.\n}\n\n// Unused\nstatic void BtlController_EmitCmd23(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_23;\n    sBattleBuffersTransferData[1] = CONTROLLER_23;\n    sBattleBuffersTransferData[2] = CONTROLLER_23;\n    sBattleBuffersTransferData[3] = CONTROLLER_23;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitHealthBarUpdate(u8 bufferId, u16 hpValue)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_HEALTHBARUPDATE;\n    sBattleBuffersTransferData[1] = 0;\n    sBattleBuffersTransferData[2] = (s16)hpValue;\n    sBattleBuffersTransferData[3] = ((s16)hpValue & 0xFF00) >> 8;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitExpUpdate(u8 bufferId, u8 partyId, u16 expPoints)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_EXPUPDATE;\n    sBattleBuffersTransferData[1] = partyId;\n    sBattleBuffersTransferData[2] = (s16)expPoints;\n    sBattleBuffersTransferData[3] = ((s16)expPoints & 0xFF00) >> 8;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitStatusIconUpdate(u8 bufferId, u32 status1, u32 status2)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_STATUSICONUPDATE;\n    sBattleBuffersTransferData[1] = status1;\n    sBattleBuffersTransferData[2] = (status1 & 0x0000FF00) >> 8;\n    sBattleBuffersTransferData[3] = (status1 & 0x00FF0000) >> 16;\n    sBattleBuffersTransferData[4] = (status1 & 0xFF000000) >> 24;\n    sBattleBuffersTransferData[5] = status2;\n    sBattleBuffersTransferData[6] = (status2 & 0x0000FF00) >> 8;\n    sBattleBuffersTransferData[7] = (status2 & 0x00FF0000) >> 16;\n    sBattleBuffersTransferData[8] = (status2 & 0xFF000000) >> 24;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 9);\n}\n\nvoid BtlController_EmitStatusAnimation(u8 bufferId, bool8 status2, u32 status)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_STATUSANIMATION;\n    sBattleBuffersTransferData[1] = status2;\n    sBattleBuffersTransferData[2] = status;\n    sBattleBuffersTransferData[3] = (status & 0x0000FF00) >> 8;\n    sBattleBuffersTransferData[4] = (status & 0x00FF0000) >> 16;\n    sBattleBuffersTransferData[5] = (status & 0xFF000000) >> 24;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 6);\n}\n\n// Unused\nstatic void BtlController_EmitStatusXor(u8 bufferId, u8 b)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_STATUSXOR;\n    sBattleBuffersTransferData[1] = b;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);\n}\n\nvoid BtlController_EmitDataTransfer(u8 bufferId, u16 size, void *data)\n{\n    s32 i;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_DATATRANSFER;\n    sBattleBuffersTransferData[1] = CONTROLLER_DATATRANSFER;\n    sBattleBuffersTransferData[2] = size;\n    sBattleBuffersTransferData[3] = (size & 0xFF00) >> 8;\n    for (i = 0; i < size; i++)\n        sBattleBuffersTransferData[4 + i] = *(u8 *)(data++);\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, size + 4);\n}\n\n// Unused\nstatic void BtlController_EmitDMA3Transfer(u8 bufferId, void *dst, u16 size, void *data)\n{\n    s32 i;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_DMA3TRANSFER;\n    sBattleBuffersTransferData[1] = (u32)(dst);\n    sBattleBuffersTransferData[2] = ((u32)(dst) & 0x0000FF00) >> 8;\n    sBattleBuffersTransferData[3] = ((u32)(dst) & 0x00FF0000) >> 16;\n    sBattleBuffersTransferData[4] = ((u32)(dst) & 0xFF000000) >> 24;\n    sBattleBuffersTransferData[5] = size;\n    sBattleBuffersTransferData[6] = (size & 0xFF00) >> 8;\n    for (i = 0; i < size; i++)\n        sBattleBuffersTransferData[7 + i] = *(u8 *)(data++);\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, size + 7);\n}\n\n// Unused\nstatic void BtlController_EmitPlayBGM(u8 bufferId, u16 songId, void *data)\n{\n    s32 i;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_PLAYBGM;\n    sBattleBuffersTransferData[1] = songId;\n    sBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8;\n\n    // Nonsense loop using songId as a size\n    // Would go out of bounds for any song id after SE_DEOXYS_MOVE (253)\n    for (i = 0; i < songId; i++)\n        sBattleBuffersTransferData[3 + i] = *(u8 *)(data++);\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, songId + 3);\n}\n\n// Unused\nstatic void BtlController_EmitCmd32(u8 bufferId, u16 size, void *data)\n{\n    s32 i;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_32;\n    sBattleBuffersTransferData[1] = size;\n    sBattleBuffersTransferData[2] = (size & 0xFF00) >> 8;\n    for (i = 0; i < size; i++)\n        sBattleBuffersTransferData[3 + i] = *(u8 *)(data++);\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, size + 3);\n}\n\nvoid BtlController_EmitTwoReturnValues(u8 bufferId, u8 ret8, u16 ret16)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_TWORETURNVALUES;\n    sBattleBuffersTransferData[1] = ret8;\n    sBattleBuffersTransferData[2] = ret16;\n    sBattleBuffersTransferData[3] = (ret16 & 0xFF00) >> 8;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitChosenMonReturnValue(u8 bufferId, u8 partyId, u8 *battlePartyOrder)\n{\n    s32 i;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_CHOSENMONRETURNVALUE;\n    sBattleBuffersTransferData[1] = partyId;\n    for (i = 0; i < (int)ARRAY_COUNT(gBattlePartyCurrentOrder); i++)\n        sBattleBuffersTransferData[2 + i] = battlePartyOrder[i];\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 5);\n}\n\nvoid BtlController_EmitOneReturnValue(u8 bufferId, u16 ret)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_ONERETURNVALUE;\n    sBattleBuffersTransferData[1] = ret;\n    sBattleBuffersTransferData[2] = (ret & 0xFF00) >> 8;\n    sBattleBuffersTransferData[3] = 0;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitOneReturnValue_Duplicate(u8 bufferId, u16 ret)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_ONERETURNVALUE_DUPLICATE;\n    sBattleBuffersTransferData[1] = ret;\n    sBattleBuffersTransferData[2] = (ret & 0xFF00) >> 8;\n    sBattleBuffersTransferData[3] = 0;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\n// Unused\nstatic void BtlController_EmitClearUnkVar(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_CLEARUNKVAR;\n    sBattleBuffersTransferData[1] = CONTROLLER_CLEARUNKVAR;\n    sBattleBuffersTransferData[2] = CONTROLLER_CLEARUNKVAR;\n    sBattleBuffersTransferData[3] = CONTROLLER_CLEARUNKVAR;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\n// Unused\nstatic void BtlController_EmitSetUnkVar(u8 bufferId, u8 b)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_SETUNKVAR;\n    sBattleBuffersTransferData[1] = b;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);\n}\n\n// Unused\nstatic void BtlController_EmitClearUnkFlag(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_CLEARUNKFLAG;\n    sBattleBuffersTransferData[1] = CONTROLLER_CLEARUNKFLAG;\n    sBattleBuffersTransferData[2] = CONTROLLER_CLEARUNKFLAG;\n    sBattleBuffersTransferData[3] = CONTROLLER_CLEARUNKFLAG;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\n// Unused\nstatic void BtlController_EmitToggleUnkFlag(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_TOGGLEUNKFLAG;\n    sBattleBuffersTransferData[1] = CONTROLLER_TOGGLEUNKFLAG;\n    sBattleBuffersTransferData[2] = CONTROLLER_TOGGLEUNKFLAG;\n    sBattleBuffersTransferData[3] = CONTROLLER_TOGGLEUNKFLAG;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitHitAnimation(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_HITANIMATION;\n    sBattleBuffersTransferData[1] = CONTROLLER_HITANIMATION;\n    sBattleBuffersTransferData[2] = CONTROLLER_HITANIMATION;\n    sBattleBuffersTransferData[3] = CONTROLLER_HITANIMATION;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitCantSwitch(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_CANTSWITCH;\n    sBattleBuffersTransferData[1] = CONTROLLER_CANTSWITCH;\n    sBattleBuffersTransferData[2] = CONTROLLER_CANTSWITCH;\n    sBattleBuffersTransferData[3] = CONTROLLER_CANTSWITCH;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitPlaySE(u8 bufferId, u16 songId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_PLAYSE;\n    sBattleBuffersTransferData[1] = songId;\n    sBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8;\n    sBattleBuffersTransferData[3] = 0;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitPlayFanfare(u8 bufferId, u16 songId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_PLAYFANFARE;\n    sBattleBuffersTransferData[1] = songId;\n    sBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8;\n    sBattleBuffersTransferData[3] = 0;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitFaintingCry(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_FAINTINGCRY;\n    sBattleBuffersTransferData[1] = CONTROLLER_FAINTINGCRY;\n    sBattleBuffersTransferData[2] = CONTROLLER_FAINTINGCRY;\n    sBattleBuffersTransferData[3] = CONTROLLER_FAINTINGCRY;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitIntroSlide(u8 bufferId, u8 terrainId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_INTROSLIDE;\n    sBattleBuffersTransferData[1] = terrainId;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);\n}\n\nvoid BtlController_EmitIntroTrainerBallThrow(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_INTROTRAINERBALLTHROW;\n    sBattleBuffersTransferData[1] = CONTROLLER_INTROTRAINERBALLTHROW;\n    sBattleBuffersTransferData[2] = CONTROLLER_INTROTRAINERBALLTHROW;\n    sBattleBuffersTransferData[3] = CONTROLLER_INTROTRAINERBALLTHROW;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* hpAndStatus, u8 flags)\n{\n    s32 i;\n\n    sBattleBuffersTransferData[0] = CONTROLLER_DRAWPARTYSTATUSSUMMARY;\n    sBattleBuffersTransferData[1] = flags & ~PARTY_SUMM_SKIP_DRAW_DELAY; // If true, skip player side\n    sBattleBuffersTransferData[2] = (flags & PARTY_SUMM_SKIP_DRAW_DELAY) >> 7; // If true, skip delay after drawing. True during intro\n    sBattleBuffersTransferData[3] = CONTROLLER_DRAWPARTYSTATUSSUMMARY;\n    for (i = 0; i < (s32)(sizeof(struct HpAndStatus) * PARTY_SIZE); i++)\n        sBattleBuffersTransferData[4 + i] = *(i + (u8 *)(hpAndStatus));\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct HpAndStatus) * PARTY_SIZE + 4);\n}\n\nvoid BtlController_EmitHidePartyStatusSummary(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_HIDEPARTYSTATUSSUMMARY;\n    sBattleBuffersTransferData[1] = CONTROLLER_HIDEPARTYSTATUSSUMMARY;\n    sBattleBuffersTransferData[2] = CONTROLLER_HIDEPARTYSTATUSSUMMARY;\n    sBattleBuffersTransferData[3] = CONTROLLER_HIDEPARTYSTATUSSUMMARY;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitEndBounceEffect(u8 bufferId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_ENDBOUNCE;\n    sBattleBuffersTransferData[1] = CONTROLLER_ENDBOUNCE;\n    sBattleBuffersTransferData[2] = CONTROLLER_ENDBOUNCE;\n    sBattleBuffersTransferData[3] = CONTROLLER_ENDBOUNCE;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitSpriteInvisibility(u8 bufferId, bool8 isInvisible)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_SPRITEINVISIBILITY;\n    sBattleBuffersTransferData[1] = isInvisible;\n    sBattleBuffersTransferData[2] = CONTROLLER_SPRITEINVISIBILITY;\n    sBattleBuffersTransferData[3] = CONTROLLER_SPRITEINVISIBILITY;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\nvoid BtlController_EmitBattleAnimation(u8 bufferId, u8 animationId, u16 argument)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_BATTLEANIMATION;\n    sBattleBuffersTransferData[1] = animationId;\n    sBattleBuffersTransferData[2] = argument;\n    sBattleBuffersTransferData[3] = (argument & 0xFF00) >> 8;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);\n}\n\n// mode is a LINK_STANDBY_* constant\nvoid BtlController_EmitLinkStandbyMsg(u8 bufferId, u8 mode)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_LINKSTANDBYMSG;\n    sBattleBuffersTransferData[1] = mode;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);\n}\n\nvoid BtlController_EmitResetActionMoveSelection(u8 bufferId, u8 caseId)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_RESETACTIONMOVESELECTION;\n    sBattleBuffersTransferData[1] = caseId;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);\n}\n\nvoid BtlController_EmitEndLinkBattle(u8 bufferId, u8 battleOutcome)\n{\n    sBattleBuffersTransferData[0] = CONTROLLER_ENDLINKBATTLE;\n    sBattleBuffersTransferData[1] = battleOutcome;\n    PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);\n}\n"
  },
  {
    "path": "src/battle_gfx_sfx_util.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"m4a.h\"\n#include \"task.h\"\n#include \"graphics.h\"\n#include \"decompress.h\"\n#include \"palette.h\"\n#include \"sprite.h\"\n#include \"data.h\"\n#include \"util.h\"\n#include \"party_menu.h\"\n#include \"battle.h\"\n#include \"battle_main.h\"\n#include \"battle_anim.h\"\n#include \"battle_interface.h\"\n#include \"constants/battle_anim.h\"\n#include \"constants/moves.h\"\n#include \"constants/songs.h\"\n\nstatic bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId);\nstatic void Task_ClearBitWhenBattleTableAnimDone(u8 taskId);\nstatic void Task_ClearBitWhenSpecialAnimDone(u8 taskId);\nstatic void ClearSpritesBattlerHealthboxAnimData(void);\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_SinglesPlayerHealthbox =\n{\n    .data = gHealthboxSinglesPlayerGfx,\n    .size = 0x1000,\n    .tag = TAG_HEALTHBOX_PLAYER1_TILE,\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_SinglesOpponentHealthbox =\n{\n    .data = gHealthboxSinglesOpponentGfx,\n    .size = 0x1000,\n    .tag = TAG_HEALTHBOX_OPPONENT1_TILE,\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheets_DoublesPlayerHealthbox[2] =\n{\n    {\n        .data = gHealthboxDoublesPlayerGfx,\n        .size = 0x800,\n        .tag = TAG_HEALTHBOX_PLAYER1_TILE,\n    },\n    {\n        .data = gHealthboxDoublesPlayerGfx,\n        .size = 0x800,\n        .tag = TAG_HEALTHBOX_PLAYER2_TILE,\n    },\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheets_DoublesOpponentHealthbox[2] =\n{\n    {\n        .data = gHealthboxDoublesOpponentGfx,\n        .size = 0x800,\n        .tag = TAG_HEALTHBOX_OPPONENT1_TILE,\n    },\n    {\n        .data = gHealthboxDoublesOpponentGfx,\n        .size = 0x800,\n        .tag = TAG_HEALTHBOX_OPPONENT2_TILE,\n    },\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_SafariHealthbox =\n{\n    .data = gHealthboxSafariGfx,\n    .size = 0x1000,\n    .tag = TAG_HEALTHBOX_SAFARI_TILE,\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheets_HealthBar[MAX_BATTLERS_COUNT] =\n{\n    {\n        .data = gBlankGfxCompressed,\n        .size = 0x100,\n        .tag = TAG_HEALTHBAR_PLAYER1_TILE,\n    },\n    {\n        .data = gBlankGfxCompressed,\n        .size = 0x120,\n        .tag = TAG_HEALTHBAR_OPPONENT1_TILE,\n    },\n    {\n        .data = gBlankGfxCompressed,\n        .size = 0x100,\n        .tag = TAG_HEALTHBAR_PLAYER2_TILE,\n    },\n    {\n        .data = gBlankGfxCompressed,\n        .size = 0x120,\n        .tag = TAG_HEALTHBAR_OPPONENT2_TILE,\n    },\n};\n\nstatic const struct SpritePalette sSpritePalettes_HealthBoxHealthBar[2] =\n{\n    {\n        .data = gBattleInterface_Healthbox_Pal,\n        .tag = TAG_HEALTHBOX_PAL,\n    },\n    {\n        .data = gBattleInterface_Healthbar_Pal,\n        .tag = TAG_HEALTHBAR_PAL,\n    },\n};\n\nvoid AllocateBattleSpritesData(void)\n{\n    gBattleSpritesDataPtr = AllocZeroed(sizeof(struct BattleSpriteData));\n    gBattleSpritesDataPtr->battlerData = AllocZeroed(sizeof(struct BattleSpriteInfo) * MAX_BATTLERS_COUNT);\n    gBattleSpritesDataPtr->healthBoxesData = AllocZeroed(sizeof(struct BattleHealthboxInfo) * MAX_BATTLERS_COUNT);\n    gBattleSpritesDataPtr->animationData = AllocZeroed(sizeof(struct BattleAnimationInfo));\n    gBattleSpritesDataPtr->battleBars = AllocZeroed(sizeof(struct BattleBarInfo) * MAX_BATTLERS_COUNT);\n}\n\nvoid FreeBattleSpritesData(void)\n{\n    if (gBattleSpritesDataPtr)\n    {\n        FREE_AND_SET_NULL(gBattleSpritesDataPtr->battleBars);\n        FREE_AND_SET_NULL(gBattleSpritesDataPtr->animationData);\n        FREE_AND_SET_NULL(gBattleSpritesDataPtr->healthBoxesData);\n        FREE_AND_SET_NULL(gBattleSpritesDataPtr->battlerData);\n        FREE_AND_SET_NULL(gBattleSpritesDataPtr);\n    }\n}\n\nvoid SpriteCB_WaitForBattlerBallReleaseAnim(struct Sprite *sprite)\n{\n    u8 spriteId = sprite->data[1];\n\n    if (!gSprites[spriteId].affineAnimEnded)\n        return;\n    if (gSprites[spriteId].invisible)\n        return;\n    if (gSprites[spriteId].animPaused)\n        gSprites[spriteId].animPaused = 0;\n    else if (gSprites[spriteId].animEnded)\n    {\n        gSprites[spriteId].callback = SetIdleSpriteCallback;\n        StartSpriteAffineAnim(&gSprites[spriteId], 0);\n        sprite->callback = SpriteCallbackDummy;\n    }\n}\n\n// Unused\nstatic void DoBattleSpriteAffineAnim(struct Sprite *sprite, bool8 arg1)\n{\n    sprite->animPaused = 1;\n    sprite->callback = SpriteCallbackDummy;\n    if (!arg1)\n        StartSpriteAffineAnim(sprite, 1);\n    else\n        StartSpriteAffineAnim(sprite, 1);\n    AnimateSprite(sprite);\n}\n\nvoid SpriteCB_TrainerSlideIn(struct Sprite *sprite)\n{\n    if (!(gIntroSlideFlags & 1))\n    {\n        sprite->x2 += sprite->data[0];\n        if (sprite->x2 == 0)\n            sprite->callback = SpriteCallbackDummy;\n    }\n}\n\nvoid InitAndLaunchChosenStatusAnimation(bool8 isStatus2, u32 status)\n{\n    gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive = 1;\n    if (!isStatus2)\n    {\n        if (status == STATUS1_FREEZE)\n            LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_FRZ);\n        else if (status == STATUS1_POISON || status & STATUS1_TOXIC_POISON)\n            LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_PSN);\n        else if (status == STATUS1_BURN)\n            LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_BRN);\n        else if (status & STATUS1_SLEEP)\n            LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_SLP);\n        else if (status == STATUS1_PARALYSIS)\n            LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_PRZ);\n        else // no animation\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive = 0;\n    }\n    else\n    {\n        if (status & STATUS2_INFATUATION)\n            LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_INFATUATION);\n        else if (status & STATUS2_CONFUSION)\n            LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_CONFUSION);\n        else if (status & STATUS2_CURSED)\n            LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_CURSED);\n        else if (status & STATUS2_NIGHTMARE)\n            LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_NIGHTMARE);\n        else if (status & STATUS2_WRAPPED)\n            LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_WRAPPED); // this animation doesn't actually exist\n        else // no animation\n            gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive = 0;\n    }\n}\n\n#define tBattlerId data[0]\n\nbool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId, u16 argument)\n{\n    u8 taskId;\n\n    if (tableId == B_ANIM_CASTFORM_CHANGE && (argument & 0x80))\n    {\n        gBattleMonForms[activeBattler] = (argument & ~(0x80));\n        return TRUE;\n    }\n    else if (gBattleSpritesDataPtr->battlerData[activeBattler].behindSubstitute\n          && !ShouldAnimBeDoneRegardlessOfSubsitute(tableId))\n    {\n        return TRUE;\n    }\n    else if (gBattleSpritesDataPtr->battlerData[activeBattler].behindSubstitute\n          && tableId == B_ANIM_SUBSTITUTE_FADE\n          && gSprites[gBattlerSpriteIds[activeBattler]].invisible)\n    {\n        LoadBattleMonGfxAndAnimate(activeBattler, TRUE, gBattlerSpriteIds[activeBattler]);\n        ClearBehindSubstituteBit(activeBattler);\n        return TRUE;\n    }\n    gBattleAnimAttacker = atkBattler;\n    gBattleAnimTarget = defBattler;\n    gBattleSpritesDataPtr->animationData->animArg = argument;\n    LaunchBattleAnimation(gBattleAnims_General, tableId, FALSE);\n    taskId = CreateTask(Task_ClearBitWhenBattleTableAnimDone, 10);\n    gTasks[taskId].tBattlerId = activeBattler;\n    gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].animFromTableActive = 1;\n    return FALSE;\n}\n\nstatic void Task_ClearBitWhenBattleTableAnimDone(u8 taskId)\n{\n    gAnimScriptCallback();\n    if (!gAnimScriptActive)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].animFromTableActive = 0;\n        DestroyTask(taskId);\n    }\n}\n\nstatic bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId)\n{\n    switch (animId)\n    {\n    case B_ANIM_SUBSTITUTE_FADE:\n    case B_ANIM_RAIN_CONTINUES:\n    case B_ANIM_SUN_CONTINUES:\n    case B_ANIM_SANDSTORM_CONTINUES:\n    case B_ANIM_HAIL_CONTINUES:\n    case B_ANIM_SNATCH_MOVE:\n        return TRUE;\n    default:\n        return FALSE;\n    }\n}\n\nvoid InitAndLaunchSpecialAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId)\n{\n    u8 taskId;\n\n    gBattleAnimAttacker = atkBattler;\n    gBattleAnimTarget = defBattler;\n    LaunchBattleAnimation(gBattleAnims_Special, tableId, FALSE);\n    taskId = CreateTask(Task_ClearBitWhenSpecialAnimDone, 10);\n    gTasks[taskId].tBattlerId = activeBattler;\n    gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].specialAnimActive = 1;\n}\n\nstatic void Task_ClearBitWhenSpecialAnimDone(u8 taskId)\n{\n    gAnimScriptCallback();\n    if (!gAnimScriptActive)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].specialAnimActive = 0;\n        DestroyTask(taskId);\n    }\n}\n\nbool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn)\n{\n    return FALSE;\n}\n\nbool8 IsBattleSEPlaying(u8 battlerId)\n{\n    u8 zero = 0;\n\n    if (IsSEPlaying())\n    {\n        ++gBattleSpritesDataPtr->healthBoxesData[battlerId].soundTimer;\n        // UB: Uses gActiveBattler instead of battlerId.\n        // In practice, this is never a problem, as this routine\n        // is only ever passed gActiveBattler.\n        if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].soundTimer < 30)\n            return TRUE;\n        m4aMPlayStop(&gMPlayInfo_SE1);\n        m4aMPlayStop(&gMPlayInfo_SE2);\n    }\n    if (zero == 0)\n    {\n        gBattleSpritesDataPtr->healthBoxesData[battlerId].soundTimer = 0;\n        return FALSE;\n    }\n    else\n    {\n        return TRUE;\n    }\n}\n\nvoid BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId)\n{\n    u32 monsPersonality, currentPersonality, otId;\n    u16 species;\n    u8 position;\n    u16 paletteOffset;\n    const void *lzPaletteData;\n    void *buffer;\n\n    monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY);\n    if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE)\n    {\n        species = GetMonData(mon, MON_DATA_SPECIES);\n        currentPersonality = monsPersonality;\n        if(species == SPECIES_DEOXYS)\n        {\n            currentPersonality = GetMonData(mon, MON_DATA_FORME);\n        }\n    }\n    else\n    {\n        species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies;\n        currentPersonality = gTransformedPersonalities[battlerId];\n    }\n    otId = GetMonData(mon, MON_DATA_OT_ID);\n    position = GetBattlerPosition(battlerId);\n    HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species],\n                                              gMonSpritesGfxPtr->sprites[position],\n                                              species, currentPersonality);\n    paletteOffset = OBJ_PLTT_ID(battlerId);\n    if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE)\n        lzPaletteData = GetMonFrontSpritePal(mon);\n    else\n        lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality);\n    buffer = AllocZeroed(0x400);\n    LZDecompressWram(lzPaletteData, buffer);\n    LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP);\n    LoadPalette(buffer, BG_PLTT_ID(8) + BG_PLTT_ID(battlerId), PLTT_SIZE_4BPP);\n    Free(buffer);\n    if (species == SPECIES_CASTFORM)\n    {\n        paletteOffset = OBJ_PLTT_ID(battlerId);\n        LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]);\n        LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, PLTT_SIZE_4BPP);\n    }\n    // transform's pink color\n    if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE)\n    {\n        BlendPalette(paletteOffset, 16, 6, RGB_WHITE);\n        CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZE_4BPP);\n    }\n}\n\nvoid BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId)\n{\n    u32 monsPersonality, currentPersonality, otId;\n    u16 species;\n    u8 position;\n    u16 paletteOffset;\n    const void *lzPaletteData;\n    void *buffer;\n\n    monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY);\n    if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE)\n    {\n        species = GetMonData(mon, MON_DATA_SPECIES);\n        currentPersonality = monsPersonality;\n        if(species == SPECIES_DEOXYS)\n        {\n            currentPersonality = GetMonData(mon, MON_DATA_FORME);\n        }\n    }\n    else\n    {\n        species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies;\n        currentPersonality = gTransformedPersonalities[battlerId];\n    }\n    otId = GetMonData(mon, MON_DATA_OT_ID);\n    position = GetBattlerPosition(battlerId);\n    if (ShouldIgnoreDeoxysForm(DEOXYS_CHECK_BATTLE_SPRITE, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE)\n        HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species],\n                                                  gMonSpritesGfxPtr->sprites[position],\n                                                  species, currentPersonality);\n    else\n        HandleLoadSpecialPokePic(&gMonBackPicTable[species],\n                                gMonSpritesGfxPtr->sprites[position],\n                                species, currentPersonality);\n    paletteOffset = OBJ_PLTT_ID(battlerId);\n    if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE)\n        lzPaletteData = GetMonFrontSpritePal(mon);\n    else\n        lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality);\n    buffer = AllocZeroed(0x400);\n    LZDecompressWram(lzPaletteData, buffer);\n    LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP);\n    LoadPalette(buffer, BG_PLTT_ID(8) + BG_PLTT_ID(battlerId), PLTT_SIZE_4BPP);\n    Free(buffer);\n    if (species == SPECIES_CASTFORM)\n    {\n        paletteOffset = OBJ_PLTT_ID(battlerId);\n        LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]);\n        LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, PLTT_SIZE_4BPP);\n    }\n    // transform's pink color\n    if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE)\n    {\n        BlendPalette(paletteOffset, 16, 6, RGB_WHITE);\n        CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZE_4BPP);\n    }\n}\n\nvoid DecompressGhostFrontPic(struct Pokemon *unused, u8 battlerId)\n{\n    u16 palOffset;\n    void *buffer;\n    u8 position = GetBattlerPosition(battlerId);\n\n    LZ77UnCompWram(gGhostFrontPic, gMonSpritesGfxPtr->sprites[position]);\n    palOffset = OBJ_PLTT_ID(battlerId);\n    buffer = AllocZeroed(0x400);\n    LZDecompressWram(gGhostPalette, buffer);\n    LoadPalette(buffer, palOffset, PLTT_SIZE_4BPP);\n    LoadPalette(buffer, BG_PLTT_ID(8) + BG_PLTT_ID(battlerId), PLTT_SIZE_4BPP);\n    Free(buffer);\n}\n\nvoid DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId)\n{\n    struct SpriteSheet sheet;\n    u8 position = GetBattlerPosition(battlerId);\n\n    DecompressPicFromTable(&gTrainerFrontPicTable[frontPicId], gMonSpritesGfxPtr->sprites[position], SPECIES_NONE);\n    sheet.data = gMonSpritesGfxPtr->sprites[position];\n    sheet.size = gTrainerFrontPicTable[frontPicId].size;\n    sheet.tag = gTrainerFrontPicTable[frontPicId].tag;\n    LoadSpriteSheet(&sheet);\n    LoadCompressedSpritePaletteUsingHeap(&gTrainerFrontPicPaletteTable[frontPicId]);\n}\n\nvoid DecompressTrainerBackPalette(u16 index, u8 palette)\n{\n    LoadCompressedPalette(gTrainerBackPicPaletteTable[index].data, OBJ_PLTT_ID2(palette), PLTT_SIZE_4BPP);\n}\n\nvoid BattleGfxSfxDummy3(u8 gender)\n{\n}\n\nvoid FreeTrainerFrontPicPaletteAndTile(u16 frontPicId)\n{\n    FreeSpritePaletteByTag(gTrainerFrontPicPaletteTable[frontPicId].tag);\n    FreeSpriteTilesByTag(gTrainerFrontPicTable[frontPicId].tag);\n}\n\n// not used\nstatic void BattleLoadAllHealthBoxesGfxAtOnce(void)\n{\n    u8 numberOfBattlers = 0;\n    u32 i;\n\n    LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]);\n    LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[1]);\n    if (!IsDoubleBattle())\n    {\n        LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_SinglesPlayerHealthbox);\n        LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_SinglesOpponentHealthbox);\n        numberOfBattlers = 2;\n    }\n    else\n    {\n        LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesPlayerHealthbox[0]);\n        LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesPlayerHealthbox[1]);\n        LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesOpponentHealthbox[0]);\n        LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesOpponentHealthbox[1]);\n        numberOfBattlers = MAX_BATTLERS_COUNT;\n    }\n    for (i = 0; i < numberOfBattlers; ++i)\n        LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[i]]);\n}\n\nbool8 BattleLoadAllHealthBoxesGfx(u8 state)\n{\n    bool8 retVal = FALSE;\n\n    if (state)\n    {\n        if (state == 1)\n        {\n            LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]);\n            LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[1]);\n        }\n        else if (!IsDoubleBattle())\n        {\n            if (state == 2)\n            {\n                if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)\n                    LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_SafariHealthbox);\n                else\n                    LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_SinglesPlayerHealthbox);\n            }\n            else if (state == 3)\n                LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_SinglesOpponentHealthbox);\n            else if (state == 4)\n                LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[0]]);\n            else if (state == 5)\n                LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[1]]);\n            else\n                retVal = TRUE;\n        }\n        else\n        {\n            if (state == 2)\n                LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesPlayerHealthbox[0]);\n            else if (state == 3)\n                LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesPlayerHealthbox[1]);\n            else if (state == 4)\n                LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesOpponentHealthbox[0]);\n            else if (state == 5)\n                LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_DoublesOpponentHealthbox[1]);\n            else if (state == 6)\n                LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[0]]);\n            else if (state == 7)\n                LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[1]]);\n            else if (state == 8)\n                LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[2]]);\n            else if (state == 9)\n                LoadCompressedSpriteSheetUsingHeap(&sSpriteSheets_HealthBar[gBattlerPositions[3]]);\n            else\n                retVal = TRUE;\n        }\n    }\n    return retVal;\n}\n\nvoid LoadBattleBarGfx(u8 arg0)\n{\n    LZDecompressWram(gInterfaceGfx_HPNumbers, gMonSpritesGfxPtr->barFontGfx);\n}\n\nbool8 BattleInitAllSprites(u8 *state, u8 *battlerId)\n{\n    bool8 retVal = FALSE;\n\n    switch (*state)\n    {\n    case 0:\n        ClearSpritesBattlerHealthboxAnimData();\n        ++*state;\n        break;\n    case 1:\n        if (!BattleLoadAllHealthBoxesGfx(*battlerId))\n        {\n            ++*battlerId;\n        }\n        else\n        {\n            *battlerId = 0;\n            ++*state;\n        }\n        break;\n    case 2:\n        ++*state;\n        break;\n    case 3:\n        if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && *battlerId == 0)\n            gHealthboxSpriteIds[*battlerId] = CreateSafariPlayerHealthboxSprites();\n        else\n            gHealthboxSpriteIds[*battlerId] = CreateBattlerHealthboxSprites(*battlerId);\n\n        ++*battlerId;\n        if (*battlerId == gBattlersCount)\n        {\n            *battlerId = 0;\n            ++*state;\n        }\n        break;\n    case 4:\n        InitBattlerHealthboxCoords(*battlerId);\n        if (gBattlerPositions[*battlerId] <= 1)\n            DummyBattleInterfaceFunc(gHealthboxSpriteIds[*battlerId], FALSE);\n        else\n            DummyBattleInterfaceFunc(gHealthboxSpriteIds[*battlerId], TRUE);\n\n        ++*battlerId;\n        if (*battlerId == gBattlersCount)\n        {\n            *battlerId = 0;\n            ++*state;\n        }\n        break;\n    case 5:\n        if (GetBattlerSide(*battlerId) == B_SIDE_PLAYER)\n        {\n            if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))\n                UpdateHealthboxAttribute(gHealthboxSpriteIds[*battlerId], &gPlayerParty[gBattlerPartyIndexes[*battlerId]], HEALTHBOX_ALL);\n        }\n        else\n        {\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[*battlerId], &gEnemyParty[gBattlerPartyIndexes[*battlerId]], HEALTHBOX_ALL);\n        }\n        SetHealthboxSpriteInvisible(gHealthboxSpriteIds[*battlerId]);\n        ++*battlerId;\n        if (*battlerId == gBattlersCount)\n        {\n            *battlerId = 0;\n            ++*state;\n        }\n        break;\n    case 6:\n        LoadAndCreateEnemyShadowSprites();\n        BufferBattlePartyCurrentOrder();\n        retVal = TRUE;\n        break;\n    }\n    return retVal;\n}\n\nvoid ClearSpritesHealthboxAnimData(void)\n{\n    memset(gBattleSpritesDataPtr->healthBoxesData, 0, sizeof(struct BattleHealthboxInfo) * MAX_BATTLERS_COUNT);\n    memset(gBattleSpritesDataPtr->animationData, 0, sizeof(struct BattleAnimationInfo));\n}\n\nstatic void ClearSpritesBattlerHealthboxAnimData(void)\n{\n    ClearSpritesHealthboxAnimData();\n    memset(gBattleSpritesDataPtr->battlerData, 0, sizeof(struct BattleSpriteInfo) * MAX_BATTLERS_COUNT);\n}\n\nvoid CopyAllBattleSpritesInvisibilities(void)\n{\n    s32 i;\n\n    for (i = 0; i < gBattlersCount; ++i)\n        gBattleSpritesDataPtr->battlerData[i].invisible = gSprites[gBattlerSpriteIds[i]].invisible;\n}\n\nvoid CopyBattleSpriteInvisibility(u8 battlerId)\n{\n    gBattleSpritesDataPtr->battlerData[battlerId].invisible = gSprites[gBattlerSpriteIds[battlerId]].invisible;\n}\n\nvoid HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 transformType)\n{\n    u16 paletteOffset, targetSpecies;\n    u32 personalityValue;\n    u32 otId;\n    u8 position;\n    const u32 *lzPaletteData;\n    void *buffer;\n\n    if (transformType == 255) // Ghost unveiled with Silph Scope\n    {\n        const void *src;\n        void *dst;\n\n        position = GetBattlerPosition(battlerAtk);\n        targetSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_SPECIES);\n        personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY);\n        otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID);\n        HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[targetSpecies],\n                                                  gMonSpritesGfxPtr->sprites[position],\n                                                  targetSpecies,\n                                                  personalityValue);\n        src = gMonSpritesGfxPtr->sprites[position];\n        dst = (void *)(VRAM + 0x10000 + gSprites[gBattlerSpriteIds[battlerAtk]].oam.tileNum * 32);\n        DmaCopy32(3, src, dst, 0x800);\n        paletteOffset = OBJ_PLTT_ID(battlerAtk);\n        lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(targetSpecies, otId, personalityValue);\n        buffer = AllocZeroed(0x400);\n        LZDecompressWram(lzPaletteData, buffer);\n        LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP);\n        Free(buffer);\n        gSprites[gBattlerSpriteIds[battlerAtk]].y = GetBattlerSpriteDefault_Y(battlerAtk);\n        StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], gBattleMonForms[battlerAtk]);\n        SetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_NICKNAME, gSpeciesNames[targetSpecies]);\n        UpdateNickInHealthbox(gHealthboxSpriteIds[battlerAtk], &gEnemyParty[gBattlerPartyIndexes[battlerAtk]]);\n        TryAddPokeballIconToHealthbox(gHealthboxSpriteIds[battlerAtk], 1);\n    }\n    else if (transformType) // Castform form change\n    {\n        StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], gBattleSpritesDataPtr->animationData->animArg);\n        paletteOffset = OBJ_PLTT_ID(battlerAtk);\n        LoadPalette(gBattleStruct->castformPalette[gBattleSpritesDataPtr->animationData->animArg], paletteOffset, PLTT_SIZE_4BPP);\n        gBattleMonForms[battlerAtk] = gBattleSpritesDataPtr->animationData->animArg;\n        if (gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies != SPECIES_NONE)\n        {\n            BlendPalette(paletteOffset, 16, 6, RGB_WHITE);\n            CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZE_4BPP);\n        }\n        gSprites[gBattlerSpriteIds[battlerAtk]].y = GetBattlerSpriteDefault_Y(battlerAtk);\n    }\n    else // Transform move\n    {\n        const void *src;\n        void *dst;\n\n        position = GetBattlerPosition(battlerAtk);\n        if (GetBattlerSide(battlerDef) == B_SIDE_OPPONENT)\n            targetSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerDef]], MON_DATA_SPECIES);\n        else\n            targetSpecies = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerDef]], MON_DATA_SPECIES);\n        if (GetBattlerSide(battlerAtk) == B_SIDE_PLAYER)\n        {\n            personalityValue = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY);\n            otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID);\n\n            HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies],\n                                                      gMonSpritesGfxPtr->sprites[position],\n                                                      targetSpecies,\n                                                      gTransformedPersonalities[battlerAtk]);\n        }\n        else\n        {\n            personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY);\n            otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID);\n\n            HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[targetSpecies],\n                                                      gMonSpritesGfxPtr->sprites[position],\n                                                      targetSpecies,\n                                                      gTransformedPersonalities[battlerAtk]);\n        }\n        src = gMonSpritesGfxPtr->sprites[position];\n        dst = (void *)(VRAM + 0x10000 + gSprites[gBattlerSpriteIds[battlerAtk]].oam.tileNum * 32);\n        DmaCopy32(3, src, dst, 0x800);\n        paletteOffset = OBJ_PLTT_ID(battlerAtk);\n        lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(targetSpecies, otId, personalityValue);\n        buffer = AllocZeroed(0x400);\n        LZDecompressWram(lzPaletteData, buffer);\n        LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP);\n        Free(buffer);\n        if (targetSpecies == SPECIES_CASTFORM)\n        {\n            LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]);\n            LoadPalette(gBattleStruct->castformPalette[0] + gBattleMonForms[battlerDef] * 16, paletteOffset, PLTT_SIZE_4BPP);\n        }\n        BlendPalette(paletteOffset, 16, 6, RGB_WHITE);\n        CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZE_4BPP);\n        gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies = targetSpecies;\n        gBattleMonForms[battlerAtk] = gBattleMonForms[battlerDef];\n        gSprites[gBattlerSpriteIds[battlerAtk]].y = GetBattlerSpriteDefault_Y(battlerAtk);\n        StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], gBattleMonForms[battlerAtk]);\n    }\n}\n\nvoid BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite)\n{\n    u8 position;\n    s32 i;\n    u32 palOffset;\n\n    if (!loadMonSprite)\n    {\n        position = GetBattlerPosition(battlerId);\n        if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n            LZDecompressVram(gSubstituteDollGfx, gMonSpritesGfxPtr->sprites[position]);\n        else\n            LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites[position]);\n        for (i = 1; i < 4; ++i)\n        {\n            u8 (*ptr)[4][0x800] = gMonSpritesGfxPtr->sprites[position];\n\n            ++ptr;\n            --ptr;\n            DmaCopy32Defvars(3, (*ptr)[0], (*ptr)[i], 0x800);\n        }\n        palOffset = OBJ_PLTT_ID(battlerId);\n        LoadCompressedPalette(gSubstituteDollPal, palOffset, PLTT_SIZE_4BPP);\n    }\n    else\n    {\n        if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n            BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId);\n        else\n            BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId);\n    }\n}\n\nvoid LoadBattleMonGfxAndAnimate(u8 battlerId, bool8 loadMonSprite, u8 spriteId)\n{\n    BattleLoadSubstituteOrMonSpriteGfx(battlerId, loadMonSprite);\n    StartSpriteAnim(&gSprites[spriteId], gBattleMonForms[battlerId]);\n    if (!loadMonSprite)\n        gSprites[spriteId].y = GetSubstituteSpriteDefault_Y(battlerId);\n    else\n        gSprites[spriteId].y = GetBattlerSpriteDefault_Y(battlerId);\n}\n\nvoid TrySetBehindSubstituteSpriteBit(u8 battlerId, u16 move)\n{\n    if (move == MOVE_SUBSTITUTE)\n        gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute = 1;\n}\n\nvoid ClearBehindSubstituteBit(u8 battlerId)\n{\n    gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute = 0;\n}\n\nvoid HandleLowHpMusicChange(struct Pokemon *mon, u8 battlerId)\n{\n    u16 hp = GetMonData(mon, MON_DATA_HP);\n    u16 maxHP = GetMonData(mon, MON_DATA_MAX_HP);\n\n    if (GetHPBarLevel(hp, maxHP) == HP_BAR_RED)\n    {\n        if (!gBattleSpritesDataPtr->battlerData[battlerId].lowHpSong)\n        {\n            if (!gBattleSpritesDataPtr->battlerData[battlerId ^ BIT_FLANK].lowHpSong)\n                PlaySE(SE_LOW_HEALTH);\n            gBattleSpritesDataPtr->battlerData[battlerId].lowHpSong = 1;\n        }\n    }\n    else\n    {\n        gBattleSpritesDataPtr->battlerData[battlerId].lowHpSong = 0;\n        if (!IsDoubleBattle())\n            m4aSongNumStop(SE_LOW_HEALTH);\n        else if (IsDoubleBattle() && !gBattleSpritesDataPtr->battlerData[battlerId ^ BIT_FLANK].lowHpSong)\n            m4aSongNumStop(SE_LOW_HEALTH);\n    }\n}\n\nvoid BattleStopLowHpSound(void)\n{\n    u8 playerBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n\n    gBattleSpritesDataPtr->battlerData[playerBattler].lowHpSong = 0;\n    if (IsDoubleBattle())\n        gBattleSpritesDataPtr->battlerData[playerBattler ^ BIT_FLANK].lowHpSong = 0;\n    m4aSongNumStop(SE_LOW_HEALTH);\n}\n\n// not used\nstatic u8 GetMonHPBarLevel(struct Pokemon *mon)\n{\n    u16 hp = GetMonData(mon, MON_DATA_HP);\n    u16 maxHP = GetMonData(mon, MON_DATA_MAX_HP);\n\n    return GetHPBarLevel(hp, maxHP);\n}\n\nvoid HandleBattleLowHpMusicChange(void)\n{\n    if (gMain.inBattle)\n    {\n        u8 playerBattler1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n        u8 playerBattler2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);\n        u8 battler1PartyId = GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[playerBattler1]);\n        u8 battler2PartyId = GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[playerBattler2]);\n\n        if (GetMonData(&gPlayerParty[battler1PartyId], MON_DATA_HP) != 0)\n            HandleLowHpMusicChange(&gPlayerParty[battler1PartyId], playerBattler1);\n        if (IsDoubleBattle() && GetMonData(&gPlayerParty[battler2PartyId], MON_DATA_HP) != 0)\n            HandleLowHpMusicChange(&gPlayerParty[battler2PartyId], playerBattler2);\n    }\n}\n\nvoid SetBattlerSpriteAffineMode(u8 affineMode)\n{\n    s32 i;\n\n    for (i = 0; i < gBattlersCount; ++i)\n    {\n        if (IsBattlerSpritePresent(i))\n        {\n            gSprites[gBattlerSpriteIds[i]].oam.affineMode = affineMode;\n            if (affineMode == ST_OAM_AFFINE_OFF)\n            {\n                gBattleSpritesDataPtr->healthBoxesData[i].matrixNum = gSprites[gBattlerSpriteIds[i]].oam.matrixNum;\n                gSprites[gBattlerSpriteIds[i]].oam.matrixNum = 0;\n            }\n            else\n            {\n                gSprites[gBattlerSpriteIds[i]].oam.matrixNum = gBattleSpritesDataPtr->healthBoxesData[i].matrixNum;\n            }\n        }\n    }\n}\n\nvoid LoadAndCreateEnemyShadowSprites(void)\n{\n    u8 battlerId;\n\n    LoadCompressedSpriteSheetUsingHeap(&gSpriteSheet_EnemyShadow);\n    battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n    gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X), GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 29, 0xC8);\n    gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].data[0] = battlerId;\n    if (IsDoubleBattle())\n    {\n        battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n        gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X), GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 29, 0xC8);\n        gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].data[0] = battlerId;\n    }\n}\n\nstatic void SpriteCB_EnemyShadow(struct Sprite *shadowSprite)\n{\n    bool8 invisible = FALSE;\n    u8 battlerId = shadowSprite->tBattlerId;\n    struct Sprite *battlerSprite = &gSprites[gBattlerSpriteIds[battlerId]];\n\n    if (!battlerSprite->inUse || !IsBattlerSpritePresent(battlerId))\n    {\n        shadowSprite->callback = SpriteCB_SetInvisible;\n        return;\n    }\n    if (gAnimScriptActive || battlerSprite->invisible)\n        invisible = TRUE;\n    else if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE\n             && gEnemyMonElevation[gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies] == 0)\n        invisible = TRUE;\n    if (gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute)\n        invisible = TRUE;\n    shadowSprite->x = battlerSprite->x;\n    shadowSprite->x2 = battlerSprite->x2;\n    shadowSprite->invisible = invisible;\n}\n\nvoid SpriteCB_SetInvisible(struct Sprite *sprite)\n{\n    sprite->invisible = TRUE;\n}\n\nvoid SetBattlerShadowSpriteCallback(u8 battlerId, u16 species)\n{\n    // The player's shadow is never seen.\n    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n        return;\n\n    if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE)\n        species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies;\n\n    if (gEnemyMonElevation[species] != 0)\n        gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].callback = SpriteCB_EnemyShadow;\n    else\n        gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].callback = SpriteCB_SetInvisible;\n}\n\nvoid HideBattlerShadowSprite(u8 battlerId)\n{\n    gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].callback = SpriteCB_SetInvisible;\n}\n\n// Low-level function that sets specific interface tiles' palettes,\n// overwriting any pixel with value 0.\nvoid BattleInterfaceSetWindowPals(void)\n{\n    // 9 tiles at 0x06000240\n    u16 *vramPtr = (u16 *)(BG_VRAM + 0x240);\n    s32 i;\n    s32 j;\n\n    for (i = 0; i < 9; ++i)\n    {\n        for (j = 0; j < 16; ++vramPtr, ++j)\n        {\n            if (!(*vramPtr & 0xF000))\n                *vramPtr |= 0xF000;\n            if (!(*vramPtr & 0x0F00))\n                *vramPtr |= 0x0F00;\n            if (!(*vramPtr & 0x00F0))\n                *vramPtr |= 0x00F0;\n            if (!(*vramPtr & 0x000F))\n                *vramPtr |= 0x000F;\n        }\n    }\n\n    // 18 tiles at 0x06000600\n    vramPtr = (u16 *)(BG_VRAM + 0x600);\n    for (i = 0; i < 18; ++i)\n    {\n        for (j = 0; j < 16; ++vramPtr, ++j)\n        {\n            if (!(*vramPtr & 0xF000))\n                *vramPtr |= 0x6000;\n            if (!(*vramPtr & 0x0F00))\n                *vramPtr |= 0x0600;\n            if (!(*vramPtr & 0x00F0))\n                *vramPtr |= 0x0060;\n            if (!(*vramPtr & 0x000F))\n                *vramPtr |= 0x0006;\n        }\n    }\n}\n\nvoid ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute)\n{\n    gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = SPECIES_NONE;\n    gBattleMonForms[battlerId] = 0;\n    if (!dontClearSubstitute)\n        ClearBehindSubstituteBit(battlerId);\n}\n\nvoid AllocateMonSpritesGfx(void)\n{\n    u8 i = 0, j;\n\n    gMonSpritesGfxPtr = NULL;\n    gMonSpritesGfxPtr = AllocZeroed(sizeof(*gMonSpritesGfxPtr));\n    gMonSpritesGfxPtr->firstDecompressed = AllocZeroed(0x8000);\n    for (i = 0; i < MAX_BATTLERS_COUNT; ++i)\n    {\n        gMonSpritesGfxPtr->sprites[i] = gMonSpritesGfxPtr->firstDecompressed + (i * 0x2000);\n        *(gMonSpritesGfxPtr->templates + i) = gSpriteTemplates_Battlers[i];\n\n        for (j = 0; j < 4; ++j)\n        {\n            gMonSpritesGfxPtr->images[i][j].data = gMonSpritesGfxPtr->sprites[i] + (j * 0x800);\n            gMonSpritesGfxPtr->images[i][j].size = 0x800;\n        }\n\n        gMonSpritesGfxPtr->templates[i].images = gMonSpritesGfxPtr->images[i];\n    }\n    gMonSpritesGfxPtr->barFontGfx = AllocZeroed(0x1000);\n}\n\nvoid FreeMonSpritesGfx(void)\n{\n    if (gMonSpritesGfxPtr == NULL)\n        return;\n    if (gMonSpritesGfxPtr->multiUseBuffer != NULL)\n        FREE_AND_SET_NULL(gMonSpritesGfxPtr->multiUseBuffer);\n    if (gMonSpritesGfxPtr->field_178 != NULL)\n        FREE_AND_SET_NULL(gMonSpritesGfxPtr->field_178);\n    FREE_AND_SET_NULL(gMonSpritesGfxPtr->barFontGfx);\n    FREE_AND_SET_NULL(gMonSpritesGfxPtr->firstDecompressed);\n    gMonSpritesGfxPtr->sprites[0] = NULL;\n    gMonSpritesGfxPtr->sprites[1] = NULL;\n    gMonSpritesGfxPtr->sprites[2] = NULL;\n    gMonSpritesGfxPtr->sprites[3] = NULL;\n    FREE_AND_SET_NULL(gMonSpritesGfxPtr);\n}\n\nbool32 ShouldPlayNormalMonCry(struct Pokemon *mon)\n{\n    s16 hp, maxHP;\n    s32 barLevel;\n\n    if (GetMonData(mon, MON_DATA_STATUS) & (STATUS1_ANY | STATUS1_TOXIC_COUNTER))\n        return FALSE;\n\n    hp = GetMonData(mon, MON_DATA_HP);\n    maxHP = GetMonData(mon, MON_DATA_MAX_HP);\n\n    barLevel = GetHPBarLevel(hp, maxHP);\n    if (barLevel <= HP_BAR_YELLOW)\n        return FALSE;\n\n    return TRUE;\n}\n"
  },
  {
    "path": "src/battle_interface.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"battle_interface.h\"\n#include \"battle_setup.h\"\n#include \"battle_message.h\"\n#include \"event_data.h\"\n#include \"decompress.h\"\n#include \"graphics.h\"\n#include \"menu.h\"\n#include \"overworld.h\"\n#include \"pokedex.h\"\n#include \"pokemon_summary_screen.h\"\n#include \"safari_zone.h\"\n#include \"constants/songs.h\"\n\n#undef abs\n#define abs(a) ((a) < 0 ? -(a) : (a))\n\nstruct TestingBar\n{\n    s32 maxValue;\n    s32 oldValue;\n    s32 receivedValue;\n    u32 pal:5;\n    u32 tileOffset;\n};\n\n// These are used as indexes for each \"section of tiles\" in gBattleInterface_Gfx\n#define B_INTERFACE_GFX_TRANSPARENT             0\n#define B_INTERFACE_GFX_HP_BAR_HP_TEXT          1\n#define B_INTERFACE_GFX_HP_BAR_GREEN            3\n#define B_INTERFACE_GFX_EXP_BAR                 12\n#define B_INTERFACE_GFX_STATUS_PSN_BATTLER0     21 // BATTLER0: B_POSITION_PLAYER_LEFT\n#define B_INTERFACE_GFX_STATUS_PAR_BATTLER0     24\n#define B_INTERFACE_GFX_STATUS_SLP_BATTLER0     27\n#define B_INTERFACE_GFX_STATUS_FRZ_BATTLER0     30\n#define B_INTERFACE_GFX_STATUS_BRN_BATTLER0     33\n// tiles 36 through 38 are unused\n#define B_INTERFACE_GFX_STATUS_NONE             39\n// tiles 40 through 42 are unused\n#define B_INTERFACE_GFX_SAFARI_HEALTHBOX_0      43\n#define B_INTERFACE_GFX_SAFARI_HEALTHBOX_1      44\n#define B_INTERFACE_GFX_SAFARI_HEALTHBOX_2      45\n// tile 46 is unused\n#define B_INTERFACE_GFX_HP_BAR_YELLOW           47\n#define B_INTERFACE_GFX_HP_BAR_RED              56\n#define B_INTERFACE_GFX_HP_BAR_LEFT_BORDER      65 // Used in place of the HP text graphic if the pokemon is statused\n#define B_INTERFACE_GFX_BALL_PARTY_SUMMARY      66\n#define B_INTERFACE_GFX_BALL_CAUGHT             70\n#define B_INTERFACE_GFX_STATUS_PSN_BATTLER1     71 // BATTLER1: B_POSITION_OPPONENT_LEFT\n#define B_INTERFACE_GFX_STATUS_PAR_BATTLER1     74\n#define B_INTERFACE_GFX_STATUS_SLP_BATTLER1     77\n#define B_INTERFACE_GFX_STATUS_FRZ_BATTLER1     80\n#define B_INTERFACE_GFX_STATUS_BRN_BATTLER1     83\n#define B_INTERFACE_GFX_STATUS_PSN_BATTLER2     86 // BATTLER2: B_POSITION_PLAYER_RIGHT\n#define B_INTERFACE_GFX_STATUS_PAR_BATTLER2     89\n#define B_INTERFACE_GFX_STATUS_SLP_BATTLER2     92\n#define B_INTERFACE_GFX_STATUS_FRZ_BATTLER2     95\n#define B_INTERFACE_GFX_STATUS_BRN_BATTLER2     98\n#define B_INTERFACE_GFX_STATUS_PSN_BATTLER3     101 // BATTLER3: B_POSITION_OPPONENT_RIGHT\n#define B_INTERFACE_GFX_STATUS_PAR_BATTLER3     104\n#define B_INTERFACE_GFX_STATUS_SLP_BATTLER3     107\n#define B_INTERFACE_GFX_STATUS_FRZ_BATTLER3     110\n#define B_INTERFACE_GFX_STATUS_BRN_BATTLER3     113\n#define B_INTERFACE_GFX_BOTTOM_RIGHT_CORNER_HP_AS_TEXT 116 // Used in the player's\n#define B_INTERFACE_GFX_BOTTOM_RIGHT_CORNER_HP_AS_BAR  117 // healthbox in double battles\n#define B_INTERFACE_GFX_NUZLOCKE_INDICATOR 118 //Nuzlocke indicator\n\n\nstatic void SpriteCB_HealthBoxOther(struct Sprite *sprite);\nstatic void SpriteCB_HealthBar(struct Sprite *sprite);\nstatic const u8 *GetBattleInterfaceGfxPtr(u8 which);\nstatic void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent);\nstatic void Task_HidePartyStatusSummary_BattleStart_1(u8 taskId);\nstatic void Task_HidePartyStatusSummary_BattleStart_2(u8 taskId);\nstatic void SpriteCB_PartySummaryBar_Exit(struct Sprite *sprite);\nstatic void SpriteCB_PartySummaryBall_Exit(struct Sprite *sprite);\nstatic void Task_HidePartyStatusSummary_DuringBattle(u8 taskId);\nstatic void SpriteCB_PartySummaryBall_OnSwitchout(struct Sprite *sprite);\nstatic void UpdateStatusIconInHealthbox(u8 spriteId);\nstatic void SpriteCB_PartySummaryBar(struct Sprite *sprite);\nstatic void SpriteCB_PartySummaryBall_OnBattleStart(struct Sprite *sprite);\nstatic u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId);\nstatic void MoveBattleBarGraphically(u8 battlerId, u8 whichBar);\nstatic u8 GetReceivedValueInPixels(s32 oldValue, s32 receivedValue, s32 maxValue, u8 scale);\nstatic u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 *arg4, u8 scale);\nstatic s32 CalcNewBarValue(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5);\nstatic s32 CalcNewExpBarValue(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5);\nstatic void DrawHealthbarOntoScreen(struct TestingBar *barInfo, s32 *currValue, u8 bg, u8 x, u8 y);\nstatic void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 windowWidth);\nstatic u8 *AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 *windowId);\nstatic void RemoveWindowOnHealthbox(u32 windowId);\nstatic void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 windowWidth);\n\nstatic const struct OamData sOamData_Healthbox = {\n    .shape = SPRITE_SHAPE(64x32),\n    .size = SPRITE_SIZE(64x32),\n    .priority = 1\n};\n\nstatic const struct SpriteTemplate sHealthboxPlayerSpriteTemplates[] = {\n    [B_POSITION_PLAYER_LEFT / 2] = {\n        .tileTag = TAG_HEALTHBOX_PLAYER1_TILE,\n        .paletteTag = TAG_HEALTHBOX_PAL,\n        .oam = &sOamData_Healthbox,\n        .anims = gDummySpriteAnimTable,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    },\n    [B_POSITION_PLAYER_RIGHT / 2] = {\n        .tileTag = TAG_HEALTHBOX_PLAYER2_TILE,\n        .paletteTag = TAG_HEALTHBOX_PAL,\n        .oam = &sOamData_Healthbox,\n        .anims = gDummySpriteAnimTable,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    }\n};\n\nstatic const struct SpriteTemplate sHealthboxOpponentSpriteTemplates[] = {\n    [B_POSITION_OPPONENT_LEFT / 2] = {\n        .tileTag = TAG_HEALTHBOX_OPPONENT1_TILE,\n        .paletteTag = TAG_HEALTHBOX_PAL,\n        .oam = &sOamData_Healthbox,\n        .anims = gDummySpriteAnimTable,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    },\n    [B_POSITION_OPPONENT_RIGHT / 2] = {\n        .tileTag = TAG_HEALTHBOX_OPPONENT2_TILE,\n        .paletteTag = TAG_HEALTHBOX_PAL,\n        .oam = &sOamData_Healthbox,\n        .anims = gDummySpriteAnimTable,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    }\n};\n\nstatic const struct SpriteTemplate sHealthboxSafariSpriteTemplate =\n{\n    .tileTag = TAG_HEALTHBOX_SAFARI_TILE,\n    .paletteTag = TAG_HEALTHBOX_PAL,\n    .oam = &sOamData_Healthbox,\n    .anims = gDummySpriteAnimTable,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_Healthbar = {\n    .shape = SPRITE_SHAPE(32x8),\n    .size = SPRITE_SIZE(32x8),\n    .priority = 1\n};\n\nstatic const struct SpriteTemplate sHealthbarSpriteTemplates[] = {\n    [B_POSITION_PLAYER_LEFT] = {\n        .tileTag = TAG_HEALTHBAR_PLAYER1_TILE,\n        .paletteTag = TAG_HEALTHBAR_PAL,\n        .oam = &sOamData_Healthbar,\n        .anims = gDummySpriteAnimTable,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_HealthBar\n    },\n    [B_POSITION_OPPONENT_LEFT] = {\n        .tileTag = TAG_HEALTHBAR_OPPONENT1_TILE,\n        .paletteTag = TAG_HEALTHBAR_PAL,\n        .oam = &sOamData_Healthbar,\n        .anims = gDummySpriteAnimTable,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_HealthBar\n    },\n    [B_POSITION_PLAYER_RIGHT] = {\n        .tileTag = TAG_HEALTHBAR_PLAYER2_TILE,\n        .paletteTag = TAG_HEALTHBAR_PAL,\n        .oam = &sOamData_Healthbar,\n        .anims = gDummySpriteAnimTable,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_HealthBar\n    },\n    [B_POSITION_OPPONENT_RIGHT] = {\n        .tileTag = TAG_HEALTHBAR_OPPONENT2_TILE,\n        .paletteTag = TAG_HEALTHBAR_PAL,\n        .oam = &sOamData_Healthbar,\n        .anims = gDummySpriteAnimTable,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_HealthBar\n    }\n};\n\nstatic const struct Subsprite sUnused_Subsprites_0[] = {\n    { -16, 0, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), 0, 1 },\n    { 48, 0, SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), 32, 1 },\n    { -16, 32, SPRITE_SHAPE(32x8), SPRITE_SIZE(32x8), 48, 1 },\n    { 16, 32, SPRITE_SHAPE(32x8), SPRITE_SIZE(32x8), 52, 1 },\n    { 48, 32, SPRITE_SHAPE(32x8), SPRITE_SIZE(32x8), 56, 1 }\n};\n\nstatic const struct Subsprite sUnused_Subsprites_2[] = {\n    { -16, 0, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), 64, 1 },\n    { 48, 0, SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), 96, 1 },\n    { -16, 32, SPRITE_SHAPE(32x8), SPRITE_SIZE(32x8), 112, 1 },\n    { 16, 32, SPRITE_SHAPE(32x8), SPRITE_SIZE(32x8), 116, 1 },\n    { 48, 32, SPRITE_SHAPE(32x8), SPRITE_SIZE(32x8), 120, 1 }\n};\n\nstatic const struct Subsprite sUnused_Subsprites_1[] = {\n    { -16, 0, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), 0, 1 },\n    { 48, 0, SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), 32, 1 }\n};\n\nstatic const struct Subsprite sUnused_Subsprites_3[] = {\n    { -16, 0, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), 0, 1 },\n    { 48, 0, SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), 32, 1 }\n};\n\nstatic const struct Subsprite sHealthBar_Subsprites_Player[] = {\n    {\n        .x = -16,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 1\n    }\n};\n\nstatic const struct Subsprite sHealthBar_Subsprites_Opponent[] = {\n    {\n        .x = -16,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 1\n    },\n    {\n        .x = -32,\n        .y = 0,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 8,\n        .priority = 1\n    },\n};\n\n// Unused\nstatic const struct SubspriteTable sUnused_SubspriteTable[] = {\n    {ARRAY_COUNT(sUnused_Subsprites_0), sUnused_Subsprites_0},\n    {ARRAY_COUNT(sUnused_Subsprites_1), sUnused_Subsprites_1},\n    {ARRAY_COUNT(sUnused_Subsprites_2), sUnused_Subsprites_2},\n    {ARRAY_COUNT(sUnused_Subsprites_3), sUnused_Subsprites_3}\n};\n\nstatic const struct SubspriteTable sHealthBar_SubspriteTable[] = {\n    [B_SIDE_PLAYER]   = {ARRAY_COUNT(sHealthBar_Subsprites_Player), sHealthBar_Subsprites_Player},\n    [B_SIDE_OPPONENT] = {ARRAY_COUNT(sHealthBar_Subsprites_Opponent), sHealthBar_Subsprites_Opponent},\n};\n\nstatic const struct Subsprite sStatusSummaryBar_Subsprites_Enter[] = {\n    {\n        .x = -96,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = -64,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 1\n    },\n    {\n        .x = -32,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 8,\n        .priority = 1\n    },\n    {\n        .x = 0,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 12,\n        .priority = 1\n    }\n};\n\nstatic const struct Subsprite sStatusSummaryBar_Subsprites_Exit[] = {\n    {\n        .x = -96,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = -64,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 1\n    },\n    {\n        .x = -32,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 8,\n        .priority = 1\n    },\n    {\n        .x = 0,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 8,\n        .priority = 1\n    },\n    {\n        .x = 32,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 8,\n        .priority = 1\n    },\n    {\n        .x = 64,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 12,\n        .priority = 1\n    }\n};\n\nstatic const struct SubspriteTable sStatusSummaryBar_SubspriteTable_Enter[] = {\n    {ARRAY_COUNT(sStatusSummaryBar_Subsprites_Enter), sStatusSummaryBar_Subsprites_Enter}\n};\n\nstatic const struct SubspriteTable sStatusSummaryBar_SubspriteTable_Exit[] = {\n    {ARRAY_COUNT(sStatusSummaryBar_Subsprites_Exit), sStatusSummaryBar_Subsprites_Exit}\n};\n\nstatic const u16 sBattleInterface_Unused[] = INCBIN_U16(\"graphics/battle_interface/unused.4bpp\");\n\nstatic const struct CompressedSpriteSheet sPartySummaryBarSpriteSheets[] = {\n    {gBattleInterface_PartySummaryBar_Gfx, 16 * TILE_SIZE_4BPP, TAG_PARTY_SUMMARY_BAR_PLAYER_TILE},\n    {gBattleInterface_PartySummaryBar_Gfx, 16 * TILE_SIZE_4BPP, TAG_PARTY_SUMMARY_BAR_OPPONENT_TILE}\n};\n\nstatic const struct SpritePalette sPartySummaryBarSpritePals[] = {\n    {gBattleInterface_Healthbox_Pal, TAG_PARTY_SUMMARY_BAR_PLAYER_PAL},\n    {gBattleInterface_Healthbox_Pal, TAG_PARTY_SUMMARY_BAR_OPPONENT_PAL}\n};\n\nstatic const struct SpritePalette sPartySummaryBallSpritePals[] = {\n    {gBattleInterface_Healthbar_Pal, TAG_PARTY_SUMMARY_BALL_PLAYER_PAL},\n    {gBattleInterface_Healthbar_Pal, TAG_PARTY_SUMMARY_BALL_OPPONENT_PAL}\n};\n\nstatic const struct SpriteSheet sPartySummaryBallSpriteSheets[] = {\n    {gBattleInterface_Gfx + B_INTERFACE_GFX_BALL_PARTY_SUMMARY, 4 * TILE_SIZE_4BPP, TAG_PARTY_SUMMARY_BALL_PLAYER_TILE},\n    {gBattleInterface_Gfx + B_INTERFACE_GFX_BALL_PARTY_SUMMARY, 4 * TILE_SIZE_4BPP, TAG_PARTY_SUMMARY_BALL_OPPONENT_TILE}\n};\n\n// Unused\nstatic const struct OamData sOamData_Healthbox2 = {\n    .shape = SPRITE_SHAPE(64x32),\n    .size = SPRITE_SIZE(64x32),\n    .priority = 1\n};\n\nstatic const struct OamData sOamData_PartySummaryBall = {\n    .shape = SPRITE_SHAPE(8x8),\n    .size = SPRITE_SIZE(8x8),\n    .priority = 1\n};\n\nstatic const struct SpriteTemplate sPartySummaryBarSpriteTemplates[] = {\n    {\n        .tileTag = TAG_PARTY_SUMMARY_BAR_PLAYER_TILE,\n        .paletteTag = TAG_PARTY_SUMMARY_BAR_PLAYER_PAL,\n        .oam = &sOamData_Healthbox,\n        .anims = gDummySpriteAnimTable,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_PartySummaryBar\n    }, {\n        .tileTag = TAG_PARTY_SUMMARY_BAR_OPPONENT_TILE,\n        .paletteTag = TAG_PARTY_SUMMARY_BAR_OPPONENT_PAL,\n        .oam = &sOamData_Healthbox,\n        .anims = gDummySpriteAnimTable,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_PartySummaryBar\n    }\n};\n\nstatic const struct SpriteTemplate sPartySummaryBallSpriteTemplates[] = {\n    {\n        .tileTag = TAG_PARTY_SUMMARY_BALL_PLAYER_TILE,\n        .paletteTag = TAG_PARTY_SUMMARY_BALL_PLAYER_PAL,\n        .oam = &sOamData_PartySummaryBall,\n        .anims = gDummySpriteAnimTable,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_PartySummaryBall_OnBattleStart\n    }, {\n        .tileTag = TAG_PARTY_SUMMARY_BALL_OPPONENT_TILE,\n        .paletteTag = TAG_PARTY_SUMMARY_BALL_OPPONENT_PAL,\n        .oam = &sOamData_PartySummaryBall,\n        .anims = gDummySpriteAnimTable,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_PartySummaryBall_OnBattleStart\n    }\n};\n\nstatic void Debug_DrawNumber(s16 number, u16 *dest, bool8 singleRow)\n{\n    s8 i, j;\n    u8 buff[4];\n\n    for (i = 0; i < 4; i++)\n        buff[i] = 0;\n\n    for (i = 3; ; i--)\n    {\n        if (number > 0)\n        {\n            buff[i] = number % 10;\n            number /= 10;\n        }\n        else\n        {\n            while (i > -1)\n            {\n                buff[i] = 0xFF;\n                i--;\n            }\n\n            if (buff[3] == 0xFF)\n                buff[3] = 0;\n            break;\n        }\n    }\n\n    if (!singleRow)\n    {\n        for (i = 0, j = 0; i < 4; i++)\n        {\n            if (buff[j] == 0xFF)\n            {\n                dest[j + 0x00] &= 0xFC00;\n                dest[j + 0x00] |= 30;\n                dest[i + 0x20] &= 0xFC00;\n                dest[i + 0x20] |= 30;\n            }\n            else\n            {\n                dest[j + 0x00] &= 0xFC00;\n                dest[j + 0x00] |= 20 + buff[j];\n                dest[i + 0x20] &= 0xFC00;\n                dest[i + 0x20] |= 20 + buff[i] + 1 * TILE_SIZE_4BPP;\n            }\n            j++;\n        }\n    }\n    else\n    {\n        for (i = 0; i < 4; i++)\n        {\n            if (buff[i] == 0xFF)\n            {\n                dest[i + 0x00] &= 0xFC00;\n                dest[i + 0x00] |= 30;\n                dest[i + 0x20] &= 0xFC00;\n                dest[i + 0x20] |= 30;\n            }\n            else\n            {\n                dest[i + 0x00] &= 0xFC00;\n                dest[i + 0x00] |= 20 + buff[i];\n                dest[i + 0x20] &= 0xFC00;\n                dest[i + 0x20] |= 20 + buff[i] + 1 * TILE_SIZE_4BPP;\n            }\n        }\n    }\n}\n\n// Unused\nstatic void Debug_DrawNumberPair(s16 num1, s16 num2, u16 *dest)\n{\n    dest[4] = 30;\n    Debug_DrawNumber(num2, &dest[0], FALSE);\n    Debug_DrawNumber(num1, &dest[5], TRUE);\n}\n\n// Because the healthbox is too large to fit into one sprite, it is divided\n// into two sprites. The left sprite is used as the 'main' healthbox sprite,\n// while the right sprite is the 'other' healthbox sprite.\n// There is also a third sprite for the healthbar, visible on the healthbox.\n\n// sprite data for main (left) healthbox sprite\n#define sHealthboxOtherSpriteId oam.affineParam\n#define sHealthBarSpriteId      data[5]\n#define sBattlerId              data[6]\n\n// sprite data for other (right) healthbox sprite\n#define sHealthboxSpriteId      data[5]\n\n// sprite data for healthbar sprite\n#define sHealthboxSpriteId      data[5]\n#define sHealthbarType          data[6]\n\nenum\n{\n    HEALTHBAR_TYPE_PLAYER_SINGLE,\n    HEALTHBAR_TYPE_PLAYER_DOUBLE,\n    HEALTHBAR_TYPE_OPPONENT,\n};\n\nu8 CreateBattlerHealthboxSprites(u8 battlerId)\n{\n    s16 healthbarType = HEALTHBAR_TYPE_PLAYER_SINGLE;\n    u8 healthboxSpriteId;\n    u8 healthboxOtherSpriteId;\n    u8 healthbarSpriteId;\n    struct Sprite *healthbarSprite;\n\n    if (!IsDoubleBattle())\n    {\n        if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n        {\n            healthboxSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[B_POSITION_PLAYER_LEFT / 2], 240, 160, 1);\n            healthboxOtherSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[B_POSITION_PLAYER_LEFT / 2], 240, 160, 1);\n\n            gSprites[healthboxSpriteId].oam.shape = SPRITE_SHAPE(64x64);\n            gSprites[healthboxOtherSpriteId].oam.shape = SPRITE_SHAPE(64x64);\n            gSprites[healthboxOtherSpriteId].oam.tileNum += 2 * TILE_SIZE_4BPP;\n        }\n        else\n        {\n            healthboxSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[B_POSITION_OPPONENT_LEFT / 2], 240, 160, 1);\n            healthboxOtherSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[B_POSITION_OPPONENT_LEFT / 2], 240, 160, 1);\n\n            gSprites[healthboxOtherSpriteId].oam.tileNum += 1 * TILE_SIZE_4BPP;\n            healthbarType = HEALTHBAR_TYPE_OPPONENT;\n        }\n\n        gSprites[healthboxSpriteId].sHealthboxOtherSpriteId = healthboxOtherSpriteId;\n        gSprites[healthboxOtherSpriteId].sHealthboxSpriteId = healthboxSpriteId;\n        gSprites[healthboxOtherSpriteId].callback = SpriteCB_HealthBoxOther;\n    }\n    else\n    {\n        if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n        {\n            healthboxSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1);\n            healthboxOtherSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1);\n\n            gSprites[healthboxSpriteId].sHealthboxOtherSpriteId = healthboxOtherSpriteId;\n            gSprites[healthboxOtherSpriteId].sHealthboxSpriteId = healthboxSpriteId;\n            gSprites[healthboxOtherSpriteId].oam.tileNum += 1 * TILE_SIZE_4BPP;\n            gSprites[healthboxOtherSpriteId].callback = SpriteCB_HealthBoxOther;\n            healthbarType = HEALTHBAR_TYPE_PLAYER_DOUBLE;\n        }\n        else\n        {\n            healthboxSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1);\n            healthboxOtherSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1);\n\n            gSprites[healthboxSpriteId].sHealthboxOtherSpriteId = healthboxOtherSpriteId;\n            gSprites[healthboxOtherSpriteId].sHealthboxSpriteId = healthboxSpriteId;\n            gSprites[healthboxOtherSpriteId].oam.tileNum += 1 * TILE_SIZE_4BPP;\n            gSprites[healthboxOtherSpriteId].callback = SpriteCB_HealthBoxOther;\n            healthbarType = HEALTHBAR_TYPE_OPPONENT;\n        }\n    }\n    healthbarSpriteId = CreateSpriteAtEnd(&sHealthbarSpriteTemplates[gBattlerPositions[battlerId]], 140, 60, 0);\n    healthbarSprite = &gSprites[healthbarSpriteId];\n    SetSubspriteTables(healthbarSprite, &sHealthBar_SubspriteTable[GetBattlerSide(battlerId)]);\n    healthbarSprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;\n    healthbarSprite->oam.priority = 1;\n    CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_HP_BAR_HP_TEXT), OBJ_VRAM0 + healthbarSprite->oam.tileNum * TILE_SIZE_4BPP, 2 * TILE_SIZE_4BPP);\n\n    gSprites[healthboxSpriteId].sHealthBarSpriteId = healthbarSpriteId;\n    gSprites[healthboxSpriteId].sBattlerId = battlerId;\n    gSprites[healthboxSpriteId].invisible = TRUE;\n    gSprites[healthboxOtherSpriteId].invisible = TRUE;\n    healthbarSprite->sHealthboxSpriteId = healthboxSpriteId;\n    healthbarSprite->sHealthbarType = healthbarType;\n    healthbarSprite->invisible = TRUE;\n\n    return healthboxSpriteId;\n}\n\nu8 CreateSafariPlayerHealthboxSprites(void)\n{\n    u8 healthboxSpriteId = CreateSprite(&sHealthboxSafariSpriteTemplate, 240, 160, 1);\n    u8 healthboxOtherSpriteId = CreateSpriteAtEnd(&sHealthboxSafariSpriteTemplate, 240, 160, 1);\n\n    gSprites[healthboxSpriteId].oam.shape = SPRITE_SHAPE(64x64);\n    gSprites[healthboxOtherSpriteId].oam.shape = SPRITE_SHAPE(64x64);\n    gSprites[healthboxOtherSpriteId].oam.tileNum += 2 * TILE_SIZE_4BPP;\n    gSprites[healthboxSpriteId].sHealthboxOtherSpriteId = healthboxOtherSpriteId;\n    gSprites[healthboxOtherSpriteId].sHealthboxSpriteId = healthboxSpriteId;\n    gSprites[healthboxOtherSpriteId].callback = SpriteCB_HealthBoxOther;\n    return healthboxSpriteId;\n}\n\nstatic const u8 *GetBattleInterfaceGfxPtr(u8 elementId)\n{\n    return gBattleInterface_Gfx[elementId];\n}\n\n// Syncs the position of healthbar accordingly with the healthbox.\nstatic void SpriteCB_HealthBar(struct Sprite *sprite)\n{\n    u8 healthboxSpriteId = sprite->sHealthboxSpriteId;\n\n    switch (sprite->sHealthbarType)\n    {\n    case HEALTHBAR_TYPE_PLAYER_SINGLE:\n        sprite->x = gSprites[healthboxSpriteId].x + 16;\n        sprite->y = gSprites[healthboxSpriteId].y;\n        break;\n    case HEALTHBAR_TYPE_PLAYER_DOUBLE:\n        sprite->x = gSprites[healthboxSpriteId].x + 16;\n        sprite->y = gSprites[healthboxSpriteId].y;\n        break;\n    default:\n    case HEALTHBAR_TYPE_OPPONENT:\n        sprite->x = gSprites[healthboxSpriteId].x + 8;\n        sprite->y = gSprites[healthboxSpriteId].y;\n        break;\n    }\n    sprite->x2 = gSprites[healthboxSpriteId].x2;\n    sprite->y2 = gSprites[healthboxSpriteId].y2;\n}\n\nstatic void SpriteCB_HealthBoxOther(struct Sprite *sprite)\n{\n    u8 healthboxSpriteId = sprite->sHealthboxSpriteId;\n\n    sprite->x = gSprites[healthboxSpriteId].x + 64;\n    sprite->y = gSprites[healthboxSpriteId].y;\n\n    sprite->x2 = gSprites[healthboxSpriteId].x2;\n    sprite->y2 = gSprites[healthboxSpriteId].y2;\n}\n\nvoid SetBattleBarStruct(u8 battlerId, u8 healthboxSpriteId, s32 maxVal, s32 oldVal, s32 receivedValue)\n{\n    gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId = healthboxSpriteId;\n    gBattleSpritesDataPtr->battleBars[battlerId].maxValue = maxVal;\n    gBattleSpritesDataPtr->battleBars[battlerId].oldValue = oldVal;\n    gBattleSpritesDataPtr->battleBars[battlerId].receivedValue = receivedValue;\n    gBattleSpritesDataPtr->battleBars[battlerId].currValue = -32768;\n}\n\nvoid SetHealthboxSpriteInvisible(u8 healthboxSpriteId)\n{\n    gSprites[healthboxSpriteId].invisible = TRUE;\n    gSprites[gSprites[healthboxSpriteId].sHealthBarSpriteId].invisible = TRUE;\n    gSprites[gSprites[healthboxSpriteId].sHealthboxOtherSpriteId].invisible = TRUE;\n}\n\nvoid SetHealthboxSpriteVisible(u8 healthboxSpriteId)\n{\n    gSprites[healthboxSpriteId].invisible = FALSE;\n    gSprites[gSprites[healthboxSpriteId].sHealthBarSpriteId].invisible = FALSE;\n    gSprites[gSprites[healthboxSpriteId].sHealthboxOtherSpriteId].invisible = FALSE;\n}\n\nstatic void UpdateSpritePos(u8 spriteId, s16 x, s16 y)\n{\n    gSprites[spriteId].x = x;\n    gSprites[spriteId].y = y;\n}\n\nvoid DestoryHealthboxSprite(u8 healthboxSpriteId)\n{\n    DestroySprite(&gSprites[gSprites[healthboxSpriteId].sHealthboxOtherSpriteId]);\n    DestroySprite(&gSprites[gSprites[healthboxSpriteId].sHealthBarSpriteId]);\n    DestroySprite(&gSprites[healthboxSpriteId]);\n}\n\nvoid DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBattlerOnly)\n{\n}\n\nvoid UpdateOamPriorityInAllHealthboxes(u8 priority)\n{\n    s32 i;\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        u8 healthboxSpriteId = gHealthboxSpriteIds[i];\n        u8 healthboxOtherSpriteId = gSprites[gHealthboxSpriteIds[i]].sHealthboxOtherSpriteId;\n        u8 healthbarSpriteId = gSprites[gHealthboxSpriteIds[i]].sHealthBarSpriteId;\n\n        gSprites[healthboxSpriteId].oam.priority = priority;\n        gSprites[healthboxOtherSpriteId].oam.priority = priority;\n        gSprites[healthbarSpriteId].oam.priority = priority;\n    }\n}\n\nvoid InitBattlerHealthboxCoords(u8 battler)\n{\n    s16 x = 0, y = 0;\n\n    if (!IsDoubleBattle())\n    {\n        if (GetBattlerSide(battler) != B_SIDE_PLAYER)\n            x = 44, y = 30;\n        else\n            x = 158, y = 88;\n    }\n    else\n    {\n        switch (GetBattlerPosition(battler))\n        {\n        case B_POSITION_PLAYER_LEFT:\n            x = 159, y = 75;\n            break;\n        case B_POSITION_PLAYER_RIGHT:\n            x = 171, y = 100;\n            break;\n        case B_POSITION_OPPONENT_LEFT:\n            x = 44, y = 19;\n            break;\n        case B_POSITION_OPPONENT_RIGHT:\n            x = 32, y = 44;\n            break;\n        }\n    }\n\n    UpdateSpritePos(gHealthboxSpriteIds[battler], x, y);\n}\n\nstatic void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl)\n{\n    u32 windowId, spriteTileNum;\n    u8 *windowTileData;\n    u8 text[16] = _(\"{LV_2}\");\n    u32 xPos;\n    u8 *objVram;\n\n    objVram = ConvertIntToDecimalStringN(text + 2, lvl, STR_CONV_MODE_LEFT_ALIGN, 3);\n    xPos = 5 * (3 - (objVram - (text + 2)));\n\n    windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, xPos, 3, &windowId);\n    spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP;\n\n    if (GetBattlerSide(gSprites[healthboxSpriteId].sBattlerId) == B_SIDE_PLAYER)\n    {\n        objVram = (void *)(OBJ_VRAM0);\n        if (!IsDoubleBattle())\n            objVram += spriteTileNum + 0x820;\n        else\n            objVram += spriteTileNum + 0x420;\n    }\n    else\n    {\n        objVram = (void *)(OBJ_VRAM0);\n        objVram += spriteTileNum + 0x400;\n    }\n    TextIntoHealthboxObject(objVram, windowTileData, 3);\n    RemoveWindowOnHealthbox(windowId);\n}\n\nvoid UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)\n{\n    u32 windowId, spriteTileNum;\n    u8 *windowTileData;\n\n    if (GetBattlerSide(gSprites[healthboxSpriteId].sBattlerId) == B_SIDE_PLAYER && !IsDoubleBattle())\n    {\n        // Only in the Japanese release can HP be displayed as text outside of double battles\n        u8 text[8];\n        if (maxOrCurrent != HP_CURRENT) // singles, max\n        {\n            ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3);\n            windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 0, 5, &windowId);\n            spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum;\n            TextIntoHealthboxObject((void *)(OBJ_VRAM0) + spriteTileNum * TILE_SIZE_4BPP + 0xA40, windowTileData, 2);\n            RemoveWindowOnHealthbox(windowId);\n        }\n        else // singles, current\n        {\n            u8 *strptr;\n            strptr = ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3);\n            *strptr++ = CHAR_SLASH;\n            *strptr++ = EOS;\n            windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 4, 5, &windowId);\n            spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum;\n            TextIntoHealthboxObject((void *)(OBJ_VRAM0) + spriteTileNum * TILE_SIZE_4BPP + 0x2E0, windowTileData, 1);\n            TextIntoHealthboxObject((void *)(OBJ_VRAM0) + spriteTileNum * TILE_SIZE_4BPP + 0xA00, windowTileData + 0x20, 2);\n            RemoveWindowOnHealthbox(windowId);\n        }\n    }\n    else\n    {\n        u8 battler;\n\n        u8 text[20] = __(\"{COLOR 01}{HIGHLIGHT 02}\");\n        battler = gSprites[healthboxSpriteId].sBattlerId;\n        if (IsDoubleBattle() == TRUE || GetBattlerSide(battler) == B_SIDE_OPPONENT)\n            UpdateHpTextInHealthboxInDoubles(healthboxSpriteId, value, maxOrCurrent);\n        else\n        {\n            // Only in the Japanese release can HP be displayed as text outside of double battles\n            u32 var;\n            u32 i;\n\n            if (GetBattlerSide(gSprites[healthboxSpriteId].sBattlerId) == B_SIDE_PLAYER)\n            {\n                if (maxOrCurrent == HP_CURRENT)\n                    var = 29;\n                else\n                    var = 89;\n            }\n            else\n            {\n                if (maxOrCurrent == HP_CURRENT)\n                    var = 20;\n                else\n                    var = 48;\n            }\n\n            ConvertIntToDecimalStringN(text + 6, value, STR_CONV_MODE_RIGHT_ALIGN, 3);\n            RenderTextHandleBold(gMonSpritesGfxPtr->barFontGfx, 0, text, 0, 0, 0, 0, 0);\n\n            for (i = 0; i < 3; i++)\n            {\n                CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[i * 64 + 32],\n                          (void *)((OBJ_VRAM0) + TILE_SIZE_4BPP * (gSprites[healthboxSpriteId].oam.tileNum + var + i)),\n                          1 * TILE_SIZE_4BPP);\n            }\n        }\n    }\n}\n\nstatic const u8 sText_Slash[] = _(\"/\");\n\nstatic void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)\n{\n    u32 windowId, spriteTileNum;\n    u8 *windowTileData;\n\n    u8 battlerId;\n\n    u8 text[20] = __(\"{COLOR 01}{HIGHLIGHT 00}\");\n    battlerId = gSprites[healthboxSpriteId].sBattlerId;\n\n    if (gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars)\n    {\n        u8 var = 4;\n        u8 healthBarSpriteId;\n        u8 *txtPtr;\n        u32 i;\n\n        if (maxOrCurrent == HP_CURRENT)\n            var = 0;\n\n        healthBarSpriteId = gSprites[healthboxSpriteId].sHealthBarSpriteId;\n        txtPtr = ConvertIntToDecimalStringN(text + 6, value, STR_CONV_MODE_RIGHT_ALIGN, 3);\n        if (maxOrCurrent == HP_CURRENT)\n            StringCopy(txtPtr, sText_Slash);\n\n        RenderTextHandleBold(gMonSpritesGfxPtr->barFontGfx, 0, text, 0, 0, 0, 0, 0);\n\n        for (i = var; i < var + 3; i++)\n        {\n            if (i < 3)\n            {\n                CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[((i - var) * 64) + 32],\n                          (void *)((OBJ_VRAM0) + (1 + gSprites[healthBarSpriteId].oam.tileNum + i) * TILE_SIZE_4BPP),\n                          1 * TILE_SIZE_4BPP);\n            }\n            else\n            {\n                CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[((i - var) * 64) + 32],\n                          (void *)((OBJ_VRAM0 + 0x20) + (i + gSprites[healthBarSpriteId].oam.tileNum) * TILE_SIZE_4BPP),\n                          1 * TILE_SIZE_4BPP);\n            }\n        }\n\n        if (maxOrCurrent == HP_CURRENT)\n        {\n            CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[224],\n                      (void *)((OBJ_VRAM0) + ((gSprites[healthBarSpriteId].oam.tileNum + 4) * TILE_SIZE_4BPP)),\n                      1 * TILE_SIZE_4BPP);\n            CpuFill32(0,\n                      (void *)((OBJ_VRAM0) + (gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP)),\n                      1 * TILE_SIZE_4BPP);\n        }\n        else\n        {\n            if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n            {\n                CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_BOTTOM_RIGHT_CORNER_HP_AS_TEXT),\n                          (void *)(OBJ_VRAM0) + ((gSprites[healthboxSpriteId].oam.tileNum + 52) * TILE_SIZE_4BPP),\n                          1 * TILE_SIZE_4BPP);\n            }\n        }\n    }\n}\n\n// Prints mon's nature, catch and flee rate. Probably used to test pokeblock-related features.\nstatic void PrintSafariMonInfo(u8 healthboxSpriteId, struct Pokemon *mon)\n{\n    u8 text[20] = __(\"{COLOR 01}{HIGHLIGHT 02}\");\n    s32 j, spriteTileNum;\n    u8 *barFontGfx;\n    u8 i, var, nature, healthBarSpriteId;\n\n    barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBattlerPosition(gSprites[healthboxSpriteId].sBattlerId) * 384)];\n    var = 5;\n    nature = GetNature(mon);\n    StringCopy(text + 6, gNatureNamePointers[nature]);\n    RenderTextHandleBold(barFontGfx, 0, text, 0, 0, 0, 0, 0);\n\n    for (j = 6, i = 0; i < var; i++, j++)\n    {\n        u8 elementId;\n\n        if ((text[j] >= 55 && text[j] <= 74) || (text[j] >= 135 && text[j] <= 154))\n            elementId = B_INTERFACE_GFX_SAFARI_HEALTHBOX_1;\n        else if ((text[j] >= 75 && text[j] <= 79) || (text[j] >= 155 && text[j] <= 159))\n            elementId = B_INTERFACE_GFX_SAFARI_HEALTHBOX_2;\n        else\n            elementId = B_INTERFACE_GFX_SAFARI_HEALTHBOX_0;\n\n        CpuCopy32(GetBattleInterfaceGfxPtr(elementId), barFontGfx + (i * 64), 0x20);\n    }\n\n    for (j = 1; j < var + 1; j++)\n    {\n        spriteTileNum = (gSprites[healthboxSpriteId].oam.tileNum + (j - (j / 8 * 8)) + (j / 8 * 64)) * TILE_SIZE_4BPP;\n        CpuCopy32(barFontGfx, (void *)(OBJ_VRAM0) + (spriteTileNum), 0x20);\n        barFontGfx += 0x20;\n\n        spriteTileNum = (8 + gSprites[healthboxSpriteId].oam.tileNum + (j - (j / 8 * 8)) + (j / 8 * 64)) * TILE_SIZE_4BPP;\n        CpuCopy32(barFontGfx, (void *)(OBJ_VRAM0) + (spriteTileNum), 0x20);\n        barFontGfx += 0x20;\n    }\n\n    healthBarSpriteId = gSprites[healthboxSpriteId].sHealthBarSpriteId;\n    ConvertIntToDecimalStringN(text + 6, gBattleStruct->safariCatchFactor, STR_CONV_MODE_RIGHT_ALIGN, 2);\n    ConvertIntToDecimalStringN(text + 9, gBattleStruct->safariEscapeFactor, STR_CONV_MODE_RIGHT_ALIGN, 2);\n    text[5] = CHAR_SPACE;\n    text[8] = CHAR_SLASH;\n    RenderTextHandleBold(gMonSpritesGfxPtr->barFontGfx, 0, text, 0, 0, 0, 0, 0);\n\n    j = healthBarSpriteId; // Needed to match for some reason.\n    for (j = 0; j < 5; j++)\n    {\n        if (j <= 1)\n        {\n            CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[0x40 * j + 0x20],\n                      (void *)(OBJ_VRAM0) + (gSprites[healthBarSpriteId].oam.tileNum + 2 + j) * TILE_SIZE_4BPP,\n                      32);\n        }\n        else\n        {\n            CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[0x40 * j + 0x20],\n                      (void *)(OBJ_VRAM0 + 0xC0) + (j + gSprites[healthBarSpriteId].oam.tileNum) * TILE_SIZE_4BPP,\n                      32);\n        }\n    }\n}\n\nvoid SwapHpBarsWithHpText(void)\n{\n    s32 i;\n    u8 healthBarSpriteId;\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if (gSprites[gHealthboxSpriteIds[i]].callback == SpriteCallbackDummy\n            && GetBattlerSide(i) != B_SIDE_OPPONENT\n            && (IsDoubleBattle() || GetBattlerSide(i) != B_SIDE_PLAYER))\n        {\n            bool8 noBars;\n\n            gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars ^= 1;\n            noBars = gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars;\n            if (GetBattlerSide(i) == B_SIDE_PLAYER)\n            {\n                if (!IsDoubleBattle())\n                    continue;\n                if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)\n                    continue;\n\n                if (noBars == TRUE) // bars to text\n                {\n                    healthBarSpriteId = gSprites[gHealthboxSpriteIds[i]].sHealthBarSpriteId;\n\n                    CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP), 8 * TILE_SIZE_4BPP);\n                    UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT);\n                    UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX);\n                }\n                else // text to bars\n                {\n                    UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]);\n                    UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gPlayerParty[gBattlerPartyIndexes[i]], HEALTHBOX_HEALTH_BAR);\n                    CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_BOTTOM_RIGHT_CORNER_HP_AS_BAR),\n                             (void *)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxSpriteIds[i]].oam.tileNum * TILE_SIZE_4BPP),\n                             1 * TILE_SIZE_4BPP);\n                }\n            }\n            else\n            {\n                if (noBars == TRUE) // bars to text\n                {\n                    if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)\n                    {\n                        // Most likely a debug function.\n                        PrintSafariMonInfo(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]]);\n                    }\n                    else\n                    {\n                        healthBarSpriteId = gSprites[gHealthboxSpriteIds[i]].sHealthBarSpriteId;\n\n                        CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 8 * TILE_SIZE_4BPP);\n                        UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT);\n                        UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX);\n                    }\n                }\n                else // text to bars\n                {\n                    UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]);\n                    UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]], HEALTHBOX_HEALTH_BAR);\n                    if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)\n                        UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]], HEALTHBOX_NICK);\n                }\n            }\n            gSprites[gHealthboxSpriteIds[i]].data[7] ^= 1;\n        }\n    }\n}\n\n#define tBattler                data[0]\n#define tSummaryBarSpriteId     data[1]\n#define tBallIconSpriteId(n)    data[3 + n]\n#define tIsBattleStart          data[10]\n#define tTimer                  data[11]\n#define tBlendWeight            data[15]\n\n// sprite data for party summary bar\n#define sEnterSpeed             data[0]\n#define sExitSpeed              data[1]\n\n// sprite data for party summary ball icon\n#define sSummaryBarSpriteId     data[0]\n#define sTimer                  data[1]\n#define sIsOpponent             data[2]\n#define sSpeed                  data[3]\n#define sIsEmptyBall            data[7]\n\nu8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, bool8 isSwitchingMons, bool8 isBattleStart)\n{\n    bool8 isOpponent;\n    s8 nValidMons;\n    s16 x, y, x2, speed;\n    s32 i;\n    u8 summaryBarSpriteId;\n    u8 ballIconSpritesIds[PARTY_SIZE];\n    u8 taskId;\n\n    if (!isSwitchingMons || GetBattlerPosition(battlerId) != B_POSITION_OPPONENT_RIGHT)\n    {\n        if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n        {\n            isOpponent = FALSE;\n            x = 136, y = 96;\n            x2 = 100;\n            speed = -5;\n        }\n        else\n        {\n            isOpponent = TRUE;\n\n            if (!isSwitchingMons || !IsDoubleBattle())\n                x = 104, y = 40;\n            else\n                x = 104, y = 16;\n\n            x2 = -100;\n            speed = 5;\n        }\n    }\n    else\n    {\n        isOpponent = TRUE;\n        x = 104, y = 40;\n        x2 = -100;\n        speed = 5;\n    }\n\n    for (i = 0, nValidMons = 0; i < PARTY_SIZE; i++)\n    {\n        if (partyInfo[i].hp != HP_EMPTY_SLOT)\n            nValidMons++;\n    }\n\n    LoadCompressedSpriteSheetUsingHeap(&sPartySummaryBarSpriteSheets[isOpponent]);\n    LoadSpriteSheet(&sPartySummaryBallSpriteSheets[isOpponent]);\n    LoadSpritePalette(&sPartySummaryBarSpritePals[isOpponent]);\n    LoadSpritePalette(&sPartySummaryBallSpritePals[isOpponent]);\n\n    summaryBarSpriteId = CreateSprite(&sPartySummaryBarSpriteTemplates[isOpponent], x, y, 10);\n    SetSubspriteTables(&gSprites[summaryBarSpriteId], sStatusSummaryBar_SubspriteTable_Enter);\n    gSprites[summaryBarSpriteId].x2 = x2;\n    gSprites[summaryBarSpriteId].sEnterSpeed = speed;\n\n    if (isOpponent)\n    {\n        gSprites[summaryBarSpriteId].x -= 96;\n        gSprites[summaryBarSpriteId].oam.matrixNum = ST_OAM_HFLIP;\n    }\n    else\n        gSprites[summaryBarSpriteId].x += 96;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        ballIconSpritesIds[i] = CreateSpriteAtEnd(&sPartySummaryBallSpriteTemplates[isOpponent], x, y - 4, 9);\n\n        if (!isBattleStart)\n            gSprites[ballIconSpritesIds[i]].callback = SpriteCB_PartySummaryBall_OnSwitchout;\n\n        if (!isOpponent)\n        {\n            gSprites[ballIconSpritesIds[i]].x2 = 0;\n            gSprites[ballIconSpritesIds[i]].y2 = 0;\n        }\n\n        gSprites[ballIconSpritesIds[i]].sSummaryBarSpriteId = summaryBarSpriteId;\n\n        if (!isOpponent)\n        {\n            gSprites[ballIconSpritesIds[i]].x += 10 * i + 24;\n            gSprites[ballIconSpritesIds[i]].sTimer = i * 7 + 10;\n            gSprites[ballIconSpritesIds[i]].x2 = 120;\n        }\n        else\n        {\n            gSprites[ballIconSpritesIds[i]].x -= 10 * (5 - i) + 24;\n            gSprites[ballIconSpritesIds[i]].sTimer = (6 - i) * 7 + 10;\n            gSprites[ballIconSpritesIds[i]].x2 = -120;\n        }\n\n        gSprites[ballIconSpritesIds[i]].sIsOpponent = isOpponent;\n    }\n\n    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n    {\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n            {\n                if (partyInfo[i].hp == HP_EMPTY_SLOT) \n                {\n                    gSprites[ballIconSpritesIds[i]].oam.tileNum += 1;\n                    gSprites[ballIconSpritesIds[i]].sIsEmptyBall = TRUE;\n                }\n                else if (partyInfo[i].hp == 0)\n                    gSprites[ballIconSpritesIds[i]].oam.tileNum += 3;\n                else if (partyInfo[i].status != STATUS1_NONE)\n                    gSprites[ballIconSpritesIds[i]].oam.tileNum += 2;\n            }\n            else\n            {\n                if (i >= nValidMons) \n                {\n                    gSprites[ballIconSpritesIds[i]].oam.tileNum += 1;\n                    gSprites[ballIconSpritesIds[i]].sIsEmptyBall = TRUE;\n                }\n                else if (partyInfo[i].hp == 0)\n                    gSprites[ballIconSpritesIds[i]].oam.tileNum += 3;\n                else if (partyInfo[i].status != STATUS1_NONE)\n                    gSprites[ballIconSpritesIds[i]].oam.tileNum += 2;\n            }\n        }\n    }\n    else\n    {\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n            {\n                if (partyInfo[i].hp == HP_EMPTY_SLOT)\n                {\n                    gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 1;\n                    gSprites[ballIconSpritesIds[5 - i]].sIsEmptyBall = TRUE;\n                }\n                else if (partyInfo[i].hp == 0)\n                    gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 3;\n                else if (partyInfo[i].status != STATUS1_NONE)\n                    gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 2;\n            }\n            else\n            {\n                ballIconSpritesIds[5 - i] += 0;\n                if (i >= nValidMons)\n                {\n                    gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 1;\n                    gSprites[ballIconSpritesIds[5 - i]].sIsEmptyBall = TRUE;\n                }\n                else if (partyInfo[i].hp == 0)\n                    gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 3;\n                else if (partyInfo[i].status != STATUS1_NONE)\n                {\n                    do\n                    {\n                        gSprites[ballIconSpritesIds[5 - i]].oam.tileNum += 2;\n                    } while (0);\n                }\n            }\n            ballIconSpritesIds[5 - ++i] += 0; i--;\n        }\n    }\n\n    taskId = CreateTask(TaskDummy, 5);\n    gTasks[taskId].tBattler = battlerId;\n    gTasks[taskId].tSummaryBarSpriteId = summaryBarSpriteId;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n        gTasks[taskId].tBallIconSpriteId(i) = ballIconSpritesIds[i];\n\n    gTasks[taskId].tIsBattleStart = isBattleStart;\n    PlaySE12WithPanning(SE_BALL_TRAY_ENTER, 0);\n    return taskId;\n}\n\nvoid Task_HidePartyStatusSummary(u8 taskId)\n{\n    u8 ballIconSpriteIds[PARTY_SIZE];\n    bool8 isBattleStart;\n    u8 summaryBarSpriteId;\n    u8 battlerId;\n    s32 i;\n\n    isBattleStart = gTasks[taskId].tIsBattleStart;\n    summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId;\n    battlerId = gTasks[taskId].tBattler;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n        ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i);\n\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));\n\n    gTasks[taskId].tBlendWeight = 16;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n        gSprites[ballIconSpriteIds[i]].oam.objMode = ST_OAM_OBJ_BLEND;\n\n    gSprites[summaryBarSpriteId].oam.objMode = ST_OAM_OBJ_BLEND;\n\n    if (isBattleStart)\n    {\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n            {\n                gSprites[ballIconSpriteIds[5 - i]].sTimer = 7 * i;\n                gSprites[ballIconSpriteIds[5 - i]].sSpeed = 0;\n                gSprites[ballIconSpriteIds[5 - i]].data[4] = 0;\n                gSprites[ballIconSpriteIds[5 - i]].callback = SpriteCB_PartySummaryBall_Exit;\n            }\n            else\n            {\n                gSprites[ballIconSpriteIds[i]].sTimer = 7 * i;\n                gSprites[ballIconSpriteIds[i]].sSpeed = 0;\n                gSprites[ballIconSpriteIds[i]].data[4] = 0;\n                gSprites[ballIconSpriteIds[i]].callback = SpriteCB_PartySummaryBall_Exit;\n            }\n        }\n        gSprites[summaryBarSpriteId].sEnterSpeed /= 2;\n        gSprites[summaryBarSpriteId].sExitSpeed = 0;\n        gSprites[summaryBarSpriteId].callback = SpriteCB_PartySummaryBar_Exit;\n        SetSubspriteTables(&gSprites[summaryBarSpriteId], sStatusSummaryBar_SubspriteTable_Exit);\n        gTasks[taskId].func = Task_HidePartyStatusSummary_BattleStart_1;\n    }\n    else\n        gTasks[taskId].func = Task_HidePartyStatusSummary_DuringBattle;\n\n}\n\nstatic void Task_HidePartyStatusSummary_BattleStart_1(u8 taskId)\n{\n    if ((gTasks[taskId].tTimer++ % 2) == 0)\n    {\n        if (--gTasks[taskId].tBlendWeight < 0)\n            return;\n\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].tBlendWeight, 16 - gTasks[taskId].tBlendWeight));\n    }\n    if (gTasks[taskId].tBlendWeight == 0)\n        gTasks[taskId].func = Task_HidePartyStatusSummary_BattleStart_2;\n}\n\nstatic void Task_HidePartyStatusSummary_BattleStart_2(u8 taskId)\n{\n    u8 ballIconSpriteIds[PARTY_SIZE];\n    s32 i;\n\n    u8 battlerId = gTasks[taskId].tBattler;\n    if (--gTasks[taskId].tBlendWeight == -1)\n    {\n        u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId;\n\n        for (i = 0; i < PARTY_SIZE; i++)\n            ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i);\n\n        DestroySpriteAndFreeResources(&gSprites[summaryBarSpriteId]);\n        DestroySpriteAndFreeResources(&gSprites[ballIconSpriteIds[0]]);\n\n        for (i = 1; i < PARTY_SIZE; i++)\n            DestroySprite(&gSprites[ballIconSpriteIds[i]]);\n    }\n    else if (gTasks[taskId].tBlendWeight == -3)\n    {\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_HidePartyStatusSummary_DuringBattle(u8 taskId)\n{\n    u8 ballIconSpriteIds[PARTY_SIZE];\n    s32 i;\n    u8 battlerId = gTasks[taskId].tBattler;\n\n    if (--gTasks[taskId].tBlendWeight >= 0)\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].tBlendWeight, 16 - gTasks[taskId].tBlendWeight));\n    else if (gTasks[taskId].tBlendWeight == -1)\n    {\n        u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId;\n\n        for (i = 0; i < PARTY_SIZE; i++)\n            ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i);\n\n        DestroySpriteAndFreeResources(&gSprites[summaryBarSpriteId]);\n        DestroySpriteAndFreeResources(&gSprites[ballIconSpriteIds[0]]);\n\n        for (i = 1; i < PARTY_SIZE; i++)\n            DestroySprite(&gSprites[ballIconSpriteIds[i]]);\n    }\n    else if (gTasks[taskId].tBlendWeight == -3)\n    {\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        DestroyTask(taskId);\n    }\n}\n\n#undef tBattler\n#undef tSummaryBarSpriteId\n#undef tBallIconSpriteId\n#undef tIsBattleStart\n#undef tBlendWeight\n\nstatic void SpriteCB_PartySummaryBar(struct Sprite *sprite)\n{\n    if (sprite->x2 != 0)\n        sprite->x2 += sprite->sEnterSpeed;\n}\n\nstatic void SpriteCB_PartySummaryBar_Exit(struct Sprite *sprite)\n{\n    sprite->sExitSpeed += 32;\n    if (sprite->sEnterSpeed > 0)\n        sprite->x2 += sprite->sExitSpeed >> 4;\n    else\n        sprite->x2 -= sprite->sExitSpeed >> 4;\n    sprite->sExitSpeed &= 0xF;\n}\n\nstatic void SpriteCB_PartySummaryBall_OnBattleStart(struct Sprite *sprite)\n{\n    bool8 isOpponent;\n    u16 speed;\n\n    if (sprite->sTimer > 0)\n    {\n        sprite->sTimer--;\n        return;\n    }\n\n    isOpponent = sprite->sIsOpponent;\n    speed = sprite->sSpeed;\n    speed += 56;\n    sprite->sSpeed = speed & 0xFFF0;\n\n    if (isOpponent != FALSE)\n    {\n        sprite->x2 += speed / 16;\n        if (sprite->x2 > 0)\n            sprite->x2 = 0;\n    }\n    else\n    {\n        sprite->x2 -= speed / 16;\n        if (sprite->x2 < 0)\n            sprite->x2 = 0;\n    }\n\n    if (sprite->x2 == 0)\n    {\n        s8 pan = isOpponent ? SOUND_PAN_ATTACKER : SOUND_PAN_TARGET;\n        if (sprite->sIsEmptyBall != FALSE)\n            PlaySE2WithPanning(SE_BALL_TRAY_EXIT, pan);\n        else\n            PlaySE1WithPanning(SE_BALL_TRAY_BALL, pan);\n\n        sprite->callback = SpriteCallbackDummy;\n    }\n}\n\nstatic void SpriteCB_PartySummaryBall_Exit(struct Sprite *sprite)\n{\n    bool8 isOpponent;\n    u16 speed;\n\n    if (sprite->sTimer > 0)\n    {\n        sprite->sTimer--;\n        return;\n    }\n    isOpponent = sprite->sIsOpponent;\n    speed = sprite->sSpeed;\n    speed += 56;\n    sprite->sSpeed = speed & 0xFFF0;\n    if (isOpponent != FALSE)\n        sprite->x2 += speed / 16;\n    else\n        sprite->x2 -= speed / 16;\n\n    if (sprite->x2 + sprite->x > DISPLAY_WIDTH + 8 || sprite->x2 + sprite->x < -8)\n    {\n        sprite->invisible = TRUE;\n        sprite->callback = SpriteCallbackDummy;\n    }\n}\n\nstatic void SpriteCB_PartySummaryBall_OnSwitchout(struct Sprite *sprite)\n{\n    u8 summaryBarSpriteId = sprite->sSummaryBarSpriteId;\n\n    sprite->x2 = gSprites[summaryBarSpriteId].x2;\n    sprite->y2 = gSprites[summaryBarSpriteId].y2;\n}\n\n\n#undef sSummaryBarSpriteId\n#undef sTimer\n#undef sIsOpponent\n#undef sSpeed\n#undef sIsEmptyBall\n\n#undef sEnterSpeed\n#undef sExitSpeed\n\nstatic const u8 sText_HealthboxNickname[] = _(\"{HIGHLIGHT 02}\");\n\nvoid UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon)\n{\n    u8 nickname[POKEMON_NAME_LENGTH + 1];\n    u8 *ptr;\n    u32 windowId, spriteTileNum;\n    u8 *windowTileData;\n    u16 species;\n    u8 gender;\n\n    ptr = StringCopy(gDisplayedStringBattle, sText_HealthboxNickname);\n    GetMonData(mon, MON_DATA_NICKNAME, nickname);\n    StringGet_Nickname(nickname);\n    ptr = StringCopy(ptr, nickname);\n    *ptr++ = EXT_CTRL_CODE_BEGIN;\n    *ptr++ = EXT_CTRL_CODE_COLOR;\n\n    gender = GetMonGender(mon);\n    species = GetMonData(mon, MON_DATA_SPECIES);\n\n    if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && StringCompare(nickname, gSpeciesNames[species]) == 0)\n        gender = 100;\n\n    if (CheckBattleTypeGhost(mon, gSprites[healthboxSpriteId].sBattlerId))\n        gender = 100;\n\n    // AddTextPrinterAndCreateWindowOnHealthbox's arguments are the same in all 3 cases.\n    // It's possible they may have been different in early development phases.\n    switch (gender)\n    {\n    default:\n        *ptr++ = TEXT_DYNAMIC_COLOR_2;\n        *ptr++ = EOS;\n        windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, &windowId);\n        break;\n    case MON_MALE:\n        *ptr++ = TEXT_DYNAMIC_COLOR_2;\n        *ptr++ = CHAR_MALE;\n        *ptr++ = EOS;\n        windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, &windowId);\n        break;\n    case MON_FEMALE:\n        *ptr++ = TEXT_DYNAMIC_COLOR_1;\n        *ptr++ = CHAR_FEMALE;\n        *ptr++ = EOS;\n        windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, &windowId);\n        break;\n    }\n\n    spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP;\n\n    if (GetBattlerSide(gSprites[healthboxSpriteId].sBattlerId) == B_SIDE_PLAYER)\n    {\n        TextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0x40 + spriteTileNum), windowTileData, 6);\n        ptr = (void *)(OBJ_VRAM0);\n        if (!IsDoubleBattle())\n            ptr += spriteTileNum + 0x800;\n        else\n            ptr += spriteTileNum + 0x400;\n\n        TextIntoHealthboxObject(ptr, windowTileData + 0xC0, 1);\n    }\n    else\n        TextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0x20 + spriteTileNum), windowTileData, 7);\n\n    RemoveWindowOnHealthbox(windowId);\n}\n\nvoid TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus)\n{\n    u8 battlerId, healthBarSpriteId;\n\n    if (gBattleTypeFlags & (BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_POKEDUDE))\n        return;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n        return;\n\n    battlerId = gSprites[healthboxSpriteId].sBattlerId;\n    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n        return;\n    if (CheckBattleTypeGhost(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId))\n        return;\n    if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT))\n    {\n        if(gSaveBlock1Ptr->keyFlags.nuzlocke == 0)\n        {\n            return;\n        }\n        else\n        {\n            if(FlagGet(FLAG_SYS_POKEDEX_GET)) //don't print indicator before has Pokedex\n            {\n                if(!IsWildMonNuzlockeDupe(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES)) && \n                    NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == FALSE)\n                {   //not dupe && first encounter\n                    healthBarSpriteId = gSprites[healthboxSpriteId].sHealthBarSpriteId;\n\n                    if (noStatus)\n                        CpuCopy32(gNuzlockeFirstEncounterIndicator, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32);\n                    else\n                    CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32);\n                    return;\n                }\n            }\n            return;\n        }\n    }\n\n    healthBarSpriteId = gSprites[healthboxSpriteId].sHealthBarSpriteId;\n\n    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n    {\n        if(FlagGet(FLAG_SYS_POKEDEX_GET)) //don't print indicator before has Pokedex\n        {\n            if(!IsWildMonNuzlockeDupe(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES)) && \n                    NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == FALSE)\n            {   //not dupe && first encounter\n                if (noStatus)\n                    CpuCopy32(gNuzlockeFirstEncounterIndicator, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32);\n                else\n                CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32);\n                return;\n            }\n        }\n    }\n\n    if (noStatus)\n        CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_BALL_CAUGHT), (void *)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP);\n    else\n        CpuFill32(0, (void *)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 1 * TILE_SIZE_4BPP);\n}\n\nenum\n{\n    PAL_STATUS_PSN,\n    PAL_STATUS_PAR,\n    PAL_STATUS_SLP,\n    PAL_STATUS_FRZ,\n    PAL_STATUS_BRN\n};\n\nstatic const u16 sStatusIconColors[] = {\n    [PAL_STATUS_PSN] = RGB(24, 12, 24),\n    [PAL_STATUS_PAR] = RGB(23, 23, 3),\n    [PAL_STATUS_SLP] = RGB(20, 20, 17),\n    [PAL_STATUS_FRZ] = RGB(17, 22, 28),\n    [PAL_STATUS_BRN] = RGB(28, 14, 10)\n};\n\nstatic void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)\n{\n    s32 i;\n    u8 battlerId, healthBarSpriteId;\n    u32 status, pltAdder;\n    const u8 *statusGfxPtr;\n    s16 tileNumAdder;\n    u8 statusPalId;\n\n    battlerId = gSprites[healthboxSpriteId].sBattlerId;\n    healthBarSpriteId = gSprites[healthboxSpriteId].sHealthBarSpriteId;\n    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n    {\n        status = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_STATUS);\n        if (!IsDoubleBattle())\n            tileNumAdder = 0x1A;\n        else\n            tileNumAdder = 0x12;\n    }\n    else\n    {\n        status = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_STATUS);\n        tileNumAdder = 0x11;\n    }\n\n    if (status & STATUS1_SLEEP)\n    {\n        statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_SLP_BATTLER0, battlerId));\n        statusPalId = PAL_STATUS_SLP;\n    }\n    else if (status & STATUS1_PSN_ANY)\n    {\n        statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_PSN_BATTLER0, battlerId));\n        statusPalId = PAL_STATUS_PSN;\n    }\n    else if (status & STATUS1_BURN)\n    {\n        statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_BRN_BATTLER0, battlerId));\n        statusPalId = PAL_STATUS_BRN;\n    }\n    else if (status & STATUS1_FREEZE)\n    {\n        statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_FRZ_BATTLER0, battlerId));\n        statusPalId = PAL_STATUS_FRZ;\n    }\n    else if (status & STATUS1_PARALYSIS)\n    {\n        statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_PAR_BATTLER0, battlerId));\n        statusPalId = PAL_STATUS_PAR;\n    }\n    else\n    {\n        statusGfxPtr = GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_STATUS_NONE);\n\n        for (i = 0; i < 3; i++)\n            CpuCopy32(statusGfxPtr,\n                      (void *)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder + i) * TILE_SIZE_4BPP),\n                      1 * TILE_SIZE_4BPP);\n\n        if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars)\n            CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_HP_BAR_HP_TEXT),\n                      (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP),\n                      2 * TILE_SIZE_4BPP);\n\n        TryAddPokeballIconToHealthbox(healthboxSpriteId, TRUE);\n        return;\n    }\n\n    pltAdder = PLTT_ID(gSprites[healthboxSpriteId].oam.paletteNum);\n    pltAdder += battlerId + 12;\n\n    FillPalette(sStatusIconColors[statusPalId], pltAdder + OBJ_PLTT_OFFSET, PLTT_SIZEOF(1));\n    CpuCopy16(&gPlttBufferUnfaded[OBJ_PLTT_OFFSET + pltAdder], (u16 *)OBJ_PLTT + pltAdder, PLTT_SIZEOF(1));\n    CpuCopy32(statusGfxPtr, (void *)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * TILE_SIZE_4BPP), 3 * TILE_SIZE_4BPP);\n    if (IsDoubleBattle() == TRUE || GetBattlerSide(battlerId) == B_SIDE_OPPONENT)\n    {\n        if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars)\n        {\n            CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_TRANSPARENT),\n                     (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP),\n                     1 * TILE_SIZE_4BPP);\n            CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_HP_BAR_LEFT_BORDER),\n                     (void *)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 1) * TILE_SIZE_4BPP),\n                     1 * TILE_SIZE_4BPP);\n        }\n    }\n    TryAddPokeballIconToHealthbox(healthboxSpriteId, FALSE);\n}\n\nstatic u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId)\n{\n    u8 ret = statusElementId;\n\n    switch (statusElementId)\n    {\n    case B_INTERFACE_GFX_STATUS_PSN_BATTLER0:\n        if (battlerId == 0)\n            ret = B_INTERFACE_GFX_STATUS_PSN_BATTLER0;\n        else if (battlerId == 1)\n            ret = B_INTERFACE_GFX_STATUS_PSN_BATTLER1;\n        else if (battlerId == 2)\n            ret = B_INTERFACE_GFX_STATUS_PSN_BATTLER2;\n        else\n            ret = B_INTERFACE_GFX_STATUS_PSN_BATTLER3;\n        break;\n    case B_INTERFACE_GFX_STATUS_PAR_BATTLER0:\n        if (battlerId == 0)\n            ret = B_INTERFACE_GFX_STATUS_PAR_BATTLER0;\n        else if (battlerId == 1)\n            ret = B_INTERFACE_GFX_STATUS_PAR_BATTLER1;\n        else if (battlerId == 2)\n            ret = B_INTERFACE_GFX_STATUS_PAR_BATTLER2;\n        else\n            ret = B_INTERFACE_GFX_STATUS_PAR_BATTLER3;\n        break;\n    case B_INTERFACE_GFX_STATUS_SLP_BATTLER0:\n        if (battlerId == 0)\n            ret = B_INTERFACE_GFX_STATUS_SLP_BATTLER0;\n        else if (battlerId == 1)\n            ret = B_INTERFACE_GFX_STATUS_SLP_BATTLER1;\n        else if (battlerId == 2)\n            ret = B_INTERFACE_GFX_STATUS_SLP_BATTLER2;\n        else\n            ret = B_INTERFACE_GFX_STATUS_SLP_BATTLER3;\n        break;\n    case B_INTERFACE_GFX_STATUS_FRZ_BATTLER0:\n        if (battlerId == 0)\n            ret = B_INTERFACE_GFX_STATUS_FRZ_BATTLER0;\n        else if (battlerId == 1)\n            ret = B_INTERFACE_GFX_STATUS_FRZ_BATTLER1;\n        else if (battlerId == 2)\n            ret = B_INTERFACE_GFX_STATUS_FRZ_BATTLER2;\n        else\n            ret = B_INTERFACE_GFX_STATUS_FRZ_BATTLER3;\n        break;\n    case B_INTERFACE_GFX_STATUS_BRN_BATTLER0:\n        if (battlerId == 0)\n            ret = B_INTERFACE_GFX_STATUS_BRN_BATTLER0;\n        else if (battlerId == 1)\n            ret = B_INTERFACE_GFX_STATUS_BRN_BATTLER1;\n        else if (battlerId == 2)\n            ret = B_INTERFACE_GFX_STATUS_BRN_BATTLER2;\n        else\n            ret = B_INTERFACE_GFX_STATUS_BRN_BATTLER3;\n        break;\n    }\n    return ret;\n}\n\nstatic void UpdateSafariBallsTextOnHealthbox(u8 healthboxSpriteId)\n{\n    u32 windowId, spriteTileNum;\n    u8 *windowTileData;\n\n    windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gText_SafariBalls, 0, 3, &windowId);\n    spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP;\n    TextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0x40) + spriteTileNum, windowTileData, 6);\n    TextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0x800) + spriteTileNum, windowTileData + 0xC0, 2);\n    RemoveWindowOnHealthbox(windowId);\n}\n\nstatic void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId)\n{\n    u8 text[16];\n    u8 *txtPtr;\n    u32 windowId, spriteTileNum;\n    u8 *windowTileData;\n\n    txtPtr = StringCopy(text, gText_HighlightRed_Left);\n    ConvertIntToDecimalStringN(txtPtr, gNumSafariBalls, STR_CONV_MODE_LEFT_ALIGN, 2);\n\n    windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 47 - GetStringWidth(FONT_SMALL, text, 0), 3, &windowId);\n    spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP;\n    SafariTextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0x2C0) + spriteTileNum, windowTileData, 2);\n    SafariTextIntoHealthboxObject((void *)(OBJ_VRAM0 + 0xA00) + spriteTileNum, windowTileData + 0x40, 4);\n    RemoveWindowOnHealthbox(windowId);\n}\n\nvoid UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId)\n{\n    s32 maxHp, currHp;\n    u8 battlerId = gSprites[healthboxSpriteId].sBattlerId;\n\n    if (elementId == HEALTHBOX_ALL && !IsDoubleBattle())\n        GetBattlerSide(battlerId); // Pointless function call.\n\n    if (GetBattlerSide(gSprites[healthboxSpriteId].sBattlerId) == B_SIDE_PLAYER)\n    {\n        u8 isDoubles;\n\n        if (elementId == HEALTHBOX_LEVEL || elementId == HEALTHBOX_ALL)\n            UpdateLvlInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_LEVEL));\n        if (elementId == HEALTHBOX_CURRENT_HP || elementId == HEALTHBOX_ALL)\n            UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_HP), HP_CURRENT);\n        if (elementId == HEALTHBOX_MAX_HP || elementId == HEALTHBOX_ALL)\n            UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_MAX_HP), HP_MAX);\n        if (elementId == HEALTHBOX_HEALTH_BAR || elementId == HEALTHBOX_ALL)\n        {\n            LoadBattleBarGfx(0);\n            maxHp = GetMonData(mon, MON_DATA_MAX_HP);\n            currHp = GetMonData(mon, MON_DATA_HP);\n            SetBattleBarStruct(battlerId, healthboxSpriteId, maxHp, currHp, 0);\n            MoveBattleBar(battlerId, healthboxSpriteId, HEALTH_BAR, 0);\n        }\n        isDoubles = IsDoubleBattle();\n        if (!isDoubles && (elementId == HEALTHBOX_EXP_BAR || elementId == HEALTHBOX_ALL))\n        {\n            u16 species;\n            u32 exp, currLevelExp;\n            s32 currExpBarValue, maxExpBarValue;\n            u8 level;\n\n            LoadBattleBarGfx(3);\n            species = GetMonData(mon, MON_DATA_SPECIES);\n            level = GetMonData(mon, MON_DATA_LEVEL);\n            exp = GetMonData(mon, MON_DATA_EXP);\n            currLevelExp = gExperienceTables[gSpeciesInfo[species].growthRate][level];\n            currExpBarValue = exp - currLevelExp;\n            maxExpBarValue = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - currLevelExp;\n            SetBattleBarStruct(battlerId, healthboxSpriteId, maxExpBarValue, currExpBarValue, isDoubles);\n            MoveBattleBar(battlerId, healthboxSpriteId, EXP_BAR, 0);\n        }\n        if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL)\n            UpdateNickInHealthbox(healthboxSpriteId, mon);\n        if (elementId == HEALTHBOX_STATUS_ICON || elementId == HEALTHBOX_ALL)\n            UpdateStatusIconInHealthbox(healthboxSpriteId);\n        if (elementId == HEALTHBOX_SAFARI_ALL_TEXT)\n            UpdateSafariBallsTextOnHealthbox(healthboxSpriteId);\n        if (elementId == HEALTHBOX_SAFARI_ALL_TEXT || elementId == HEALTHBOX_SAFARI_BALLS_TEXT)\n            UpdateLeftNoOfBallsTextOnHealthbox(healthboxSpriteId);\n    }\n    else\n    {\n        if (elementId == HEALTHBOX_LEVEL || elementId == HEALTHBOX_ALL)\n            UpdateLvlInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_LEVEL));\n        if (elementId == HEALTHBOX_HEALTH_BAR || elementId == HEALTHBOX_ALL)\n        {\n            LoadBattleBarGfx(0);\n            maxHp = GetMonData(mon, MON_DATA_MAX_HP);\n            currHp = GetMonData(mon, MON_DATA_HP);\n            SetBattleBarStruct(battlerId, healthboxSpriteId, maxHp, currHp, 0);\n            MoveBattleBar(battlerId, healthboxSpriteId, HEALTH_BAR, 0);\n        }\n        if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL)\n            UpdateNickInHealthbox(healthboxSpriteId, mon);\n        if (elementId == HEALTHBOX_STATUS_ICON || elementId == HEALTHBOX_ALL)\n            UpdateStatusIconInHealthbox(healthboxSpriteId);\n    }\n}\n\n#define B_HEALTHBAR_NUM_PIXELS 48\n#define B_HEALTHBAR_NUM_TILES  (B_HEALTHBAR_NUM_PIXELS / 8)\n#define B_EXPBAR_NUM_PIXELS    64\n#define B_EXPBAR_NUM_TILES     (B_EXPBAR_NUM_PIXELS / 8)\n\ns32 MoveBattleBar(u8 battlerId, u8 healthboxSpriteId, u8 whichBar, u8 unused)\n{\n    s32 currentBarValue;\n\n    if (whichBar == HEALTH_BAR)\n    {\n        if(gSaveBlock2Ptr->optionsHpBarAnimSpeed == 0) //standard\n        {\n            currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue,\n                                            gBattleSpritesDataPtr->battleBars[battlerId].oldValue,\n                                            gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,\n                                            &gBattleSpritesDataPtr->battleBars[battlerId].currValue,\n                                            B_HEALTHBAR_NUM_TILES, 1);\n        }\n        else if(gSaveBlock2Ptr->optionsHpBarAnimSpeed == 1) //fast\n        {\n            currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue,\n                                            gBattleSpritesDataPtr->battleBars[battlerId].oldValue,\n                                            gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,\n                                            &gBattleSpritesDataPtr->battleBars[battlerId].currValue,\n                                            B_HEALTHBAR_NUM_TILES, 1 + (u16) (gBattleMons[battlerId].maxHP / 80));\n        }\n        else if(gSaveBlock2Ptr->optionsHpBarAnimSpeed == 2) //faster\n        {\n            currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue,\n                                            gBattleSpritesDataPtr->battleBars[battlerId].oldValue,\n                                            gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,\n                                            &gBattleSpritesDataPtr->battleBars[battlerId].currValue,\n                                            B_HEALTHBAR_NUM_TILES, 1 + (u16) (gBattleMons[battlerId].maxHP / 30));\n        }\n        else // instant healthbar drop\n        {\n            currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue,\n                                            gBattleSpritesDataPtr->battleBars[battlerId].oldValue,\n                                            gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,\n                                            &gBattleSpritesDataPtr->battleBars[battlerId].currValue,\n                                            B_HEALTHBAR_NUM_TILES, 714); //max HP of Blissey, makes the healthbar drop in one tick\n        }\n    }\n    else // exp bar\n    {\n        if(gSaveBlock2Ptr->optionsExpBarAnimSpeed) // instant expbar movement\n        {\n            currentBarValue = CalcNewExpBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue,\n                                            gBattleSpritesDataPtr->battleBars[battlerId].oldValue,\n                                            gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,\n                                            &gBattleSpritesDataPtr->battleBars[battlerId].currValue,\n                                            B_EXPBAR_NUM_TILES, 65535); //largest possible value to move in one tick\n        }\n        else\n        {\n            u16 increment = GetReceivedValueInPixels(gBattleSpritesDataPtr->battleBars[battlerId].oldValue,\n                                                       gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,\n                                                       gBattleSpritesDataPtr->battleBars[battlerId].maxValue,\n                                                       B_EXPBAR_NUM_TILES);\n            if (increment == 0)\n                increment = 1;\n            increment = abs(gBattleSpritesDataPtr->battleBars[battlerId].receivedValue / increment);\n\n            currentBarValue = CalcNewExpBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue,\n                                                 gBattleSpritesDataPtr->battleBars[battlerId].oldValue,\n                                                 gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,\n                                                 &gBattleSpritesDataPtr->battleBars[battlerId].currValue,\n                                                 B_EXPBAR_NUM_TILES,\n                                                 increment);\n        }\n    }\n\n    if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars))\n        MoveBattleBarGraphically(battlerId, whichBar);\n\n    if (currentBarValue == -1)\n        gBattleSpritesDataPtr->battleBars[battlerId].currValue = 0;\n\n    return currentBarValue;\n}\n\nstatic void MoveBattleBarGraphically(u8 battlerId, u8 whichBar)\n{\n    u8 filledPixels[B_HEALTHBAR_NUM_TILES > B_EXPBAR_NUM_TILES ? B_HEALTHBAR_NUM_TILES : B_EXPBAR_NUM_TILES];\n    u8 totalFilledPixels, level;\n    u8 barElementId;\n    u32 i;\n\n    switch (whichBar)\n    {\n    case HEALTH_BAR:\n        totalFilledPixels = CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battlerId].maxValue,\n                                                gBattleSpritesDataPtr->battleBars[battlerId].oldValue,\n                                                gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,\n                                                &gBattleSpritesDataPtr->battleBars[battlerId].currValue,\n                                                filledPixels,\n                                                B_HEALTHBAR_NUM_TILES);\n\n        if (totalFilledPixels > (B_HEALTHBAR_NUM_PIXELS * 50 / 100)) // more than 50 % hp\n            barElementId = B_INTERFACE_GFX_HP_BAR_GREEN;\n        else if (totalFilledPixels > (B_HEALTHBAR_NUM_PIXELS * 20 / 100)) // more than 20% hp\n            barElementId = B_INTERFACE_GFX_HP_BAR_YELLOW;\n        else\n            barElementId = B_INTERFACE_GFX_HP_BAR_RED; // 20 % or less\n\n        for (i = 0; i < B_HEALTHBAR_NUM_TILES; i++)\n        {\n            u8 healthbarSpriteId = gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].sHealthBarSpriteId;\n            if (i < 2) // first 2 tiles are on left healthbar sprite\n                CpuCopy32(GetBattleInterfaceGfxPtr(barElementId) + filledPixels[i] * TILE_SIZE_4BPP,\n                          (void *)(OBJ_VRAM0 + (gSprites[healthbarSpriteId].oam.tileNum + 2 + i) * TILE_SIZE_4BPP), // + 2 here is due to B_INTERFACE_GFX_HP_BAR_HP_TEXT\n                          1 * TILE_SIZE_4BPP);\n            else // remaining 4 tiles are on right healthbar sprite\n                CpuCopy32(GetBattleInterfaceGfxPtr(barElementId) + filledPixels[i] * TILE_SIZE_4BPP,\n                          (void *)(OBJ_VRAM0 + 64 + (i + gSprites[healthbarSpriteId].oam.tileNum) * TILE_SIZE_4BPP),\n                          1 * TILE_SIZE_4BPP);\n        }\n        break;\n    case EXP_BAR:\n        CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battlerId].maxValue,\n                            gBattleSpritesDataPtr->battleBars[battlerId].oldValue,\n                            gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,\n                            &gBattleSpritesDataPtr->battleBars[battlerId].currValue,\n                            filledPixels,\n                            B_EXPBAR_NUM_TILES);\n        level = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_LEVEL);\n        if (level == MAX_LEVEL)\n        {\n            for (i = 0; i < B_EXPBAR_NUM_TILES; i++)\n                filledPixels[i] = 0;\n        }\n        for (i = 0; i < B_EXPBAR_NUM_TILES; i++)\n        {\n            if (i < 4) // first 4 tiles are on left healthbox sprite\n                CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_EXP_BAR) + filledPixels[i] * TILE_SIZE_4BPP,\n                          (void *)(OBJ_VRAM0 + (gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum + 36 + i) * TILE_SIZE_4BPP),\n                          1 * TILE_SIZE_4BPP);\n            else // remaining 4 tiles are on right healthbox sprite\n                CpuCopy32(GetBattleInterfaceGfxPtr(B_INTERFACE_GFX_EXP_BAR) + filledPixels[i] * TILE_SIZE_4BPP,\n                          (void *)(OBJ_VRAM0 + 0xB80 + (i + gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum) * TILE_SIZE_4BPP),\n                          1 * TILE_SIZE_4BPP);\n        }\n        break;\n    }\n}\n\nstatic s32 CalcNewBarValue(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 totalPixels, u16 increment)\n{\n    s32 ret, newValue;\n    totalPixels *= 8;\n\n    if (*currValue == -32768) // first function call\n    {\n        if (maxValue < totalPixels)\n            *currValue = Q_24_8(oldValue);\n        else\n            *currValue = oldValue;\n    }\n\n    newValue = oldValue - receivedValue;\n    if (newValue < 0)\n        newValue = 0;\n    else if (newValue > maxValue)\n        newValue = maxValue;\n\n    if (maxValue < totalPixels)\n    {\n        if (newValue == Q_24_8_TO_INT(*currValue) && (*currValue & 0xFF) == 0)\n            return -1;\n    }\n    else\n    {\n        if (newValue == *currValue) // we're done, the bar's value has been updated\n            return -1;\n    }\n\n    if (maxValue < totalPixels) // handle cases of max var having less pixels than the whole bar\n    {\n        s32 incrementInQ = Q_24_8(maxValue) / totalPixels;\n        if(gSaveBlock2Ptr->optionsHpBarAnimSpeed == 3) //instant\n        {\n            if(*currValue - receivedValue <= 0)\n                incrementInQ = *currValue;\n            else\n                incrementInQ = *currValue - receivedValue;\n        }\n\n        if (receivedValue < 0) // fill bar right\n        {\n            *currValue += incrementInQ;\n            ret = Q_24_8_TO_INT(*currValue);\n            if (ret >= newValue)\n            {\n                *currValue = Q_24_8(newValue);\n                ret = newValue;\n            }\n        }\n        else // move bar left\n        {\n            *currValue -= incrementInQ;\n            ret = Q_24_8_TO_INT(*currValue);\n            // try round up\n            if ((*currValue & 0xFF) > 0)\n                ret++;\n            if (ret <= newValue)\n            {\n                *currValue = Q_24_8(newValue);\n                ret = newValue;\n            }\n        }\n    }\n    else\n    {\n        if (receivedValue < 0) // fill bar right\n        {\n            *currValue += increment;\n            if (*currValue > newValue)\n                *currValue = newValue;\n            ret = *currValue;\n        }\n        else // move bar left\n        {\n            *currValue -= increment;\n            if (*currValue < newValue)\n                *currValue = newValue;\n            ret = *currValue;\n        }\n    }\n\n    return ret;\n}\n\nstatic s32 CalcNewExpBarValue(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 scale, u16 toAdd)\n{\n    s32 ret, newValue;\n    scale *= 8;\n\n    if (*currValue == -32768) // first function call\n    {\n        if (maxValue < scale)\n            *currValue = Q_24_8(oldValue);\n        else\n            *currValue = oldValue;\n    }\n\n    newValue = oldValue - receivedValue;\n    if (newValue < 0)\n        newValue = 0;\n    else if (newValue > maxValue)\n        newValue = maxValue;\n\n    if (maxValue < scale)\n    {\n        if (newValue == Q_24_8_TO_INT(*currValue) && (*currValue & 0xFF) == 0)\n            return -1;\n    }\n    else\n    {\n        if (newValue == *currValue) // we're done, the bar's value has been updated\n            return -1;\n    }\n\n    if (maxValue < scale) // handle cases of max var having less pixels than the whole bar\n    {\n        s32 toAdd_ = Q_24_8(maxValue) / scale;\n        if(gSaveBlock2Ptr->optionsHpBarAnimSpeed == 3) //instant\n        {\n            if(*currValue - receivedValue <= 0)\n                toAdd_ = *currValue;\n            else\n                toAdd_ = *currValue - receivedValue;\n        }\n\n        if (receivedValue < 0) // fill bar right\n        {\n            *currValue += toAdd_;\n            ret = Q_24_8_TO_INT(*currValue);\n            if (ret >= newValue)\n            {\n                *currValue = Q_24_8(newValue);\n                ret = newValue;\n            }\n        }\n        else // move bar left\n        {\n            *currValue -= toAdd_;\n            ret = Q_24_8_TO_INT(*currValue);\n            // try round up\n            if ((*currValue & 0xFF) > 0)\n                ret++;\n            if (ret <= newValue)\n            {\n                *currValue = Q_24_8(newValue);\n                ret = newValue;\n            }\n        }\n    }\n    else\n    {\n        if (receivedValue < 0) // fill bar right\n        {\n            *currValue += toAdd;\n            if (*currValue > newValue)\n                *currValue = newValue;\n            ret = *currValue;\n        }\n        else // move bar left\n        {\n            *currValue -= toAdd;\n            if (*currValue < newValue)\n                *currValue = newValue;\n            ret = *currValue;\n        }\n    }\n\n    return ret;\n}\n\nstatic u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 *filledPixels, u8 numTiles)\n{\n    u8 numPixelsToFill, totalFilledPixels, totalPixels;\n    u32 i;\n\n    s32 newValue = oldValue - receivedValue;\n    if (newValue < 0)\n        newValue = 0;\n    else if (newValue > maxValue)\n        newValue = maxValue;\n\n    totalPixels = numTiles * 8;\n\n    for (i = 0; i < numTiles; i++)\n        filledPixels[i] = 0;\n\n    if (maxValue < totalPixels)\n        numPixelsToFill = Q_24_8_TO_INT(*currValue * totalPixels / maxValue);\n    else\n        numPixelsToFill = *currValue * totalPixels / maxValue;\n\n    totalFilledPixels = numPixelsToFill;\n\n    if (numPixelsToFill == 0 && newValue > 0)\n    {\n        filledPixels[0] = 1;\n        totalFilledPixels = 1;\n    }\n    else\n    {\n        for (i = 0; i < numTiles; i++)\n        {\n            if (numPixelsToFill >= 8) // too many to fill into a single tile\n                filledPixels[i] = 8;\n            else\n            {\n                filledPixels[i] = numPixelsToFill;\n                break;\n            }\n            numPixelsToFill -= 8;\n        }\n    }\n\n    return totalFilledPixels;\n}\n\n// Unused\n// These functions seem as if they were made for testing the health bar.\nstatic s16 UpdateAndDrawHealthbarOntoScreen(struct TestingBar *barInfo, s32 *currValue, u8 bg, u8 x, u8 y)\n{\n    s16 hpVal;\n\n    hpVal = CalcNewBarValue(barInfo->maxValue,\n                          barInfo->oldValue,\n                          barInfo->receivedValue,\n                          currValue,\n                          B_HEALTHBAR_NUM_TILES,\n                          1);\n\n    DrawHealthbarOntoScreen(barInfo, currValue, bg, x, y);\n\n    return hpVal;\n}\n\n// Unused\nstatic s16 CalcNewHealthbarValue(struct TestingBar *barInfo, s32 *currValue)\n{\n    return CalcNewBarValue(barInfo->maxValue,\n                          barInfo->oldValue,\n                          barInfo->receivedValue,\n                          currValue,\n                          B_HEALTHBAR_NUM_TILES,\n                          1);\n}\n\n// Unused\nstatic void DoDrawHealthbarOntoScreen(struct TestingBar *barInfo, s32 *currValue, u8 bg, u8 x, u8 y)\n{\n    DrawHealthbarOntoScreen(barInfo, currValue, bg, x, y);\n}\n\n// Unused\nstatic void DrawHealthbarOntoScreen(struct TestingBar *barInfo, s32 *currValue, u8 bg, u8 x, u8 y)\n{\n    u8 filledPixels[B_HEALTHBAR_NUM_TILES];\n    u16 tiles[B_HEALTHBAR_NUM_TILES];\n    u32 i;\n\n    CalcBarFilledPixels(barInfo->maxValue,\n                        barInfo->oldValue,\n                        barInfo->receivedValue,\n                        currValue,\n                        filledPixels,\n                        B_HEALTHBAR_NUM_TILES);\n\n    for (i = 0; i < ARRAY_COUNT(tiles); i++)\n        tiles[i] = (barInfo->pal << 12) | (barInfo->tileOffset + filledPixels[i]);\n\n    CopyToBgTilemapBufferRect_ChangePalette(bg, tiles, x, y, 6, 1, 17);\n}\n\nstatic u8 GetReceivedValueInPixels(s32 oldValue, s32 receivedValue, s32 maxValue, u8 totalPixels)\n{\n    s32 newVal, result;\n    s8 oldToMax, newToMax;\n\n    totalPixels *= 8;\n    newVal = oldValue - receivedValue;\n\n    if (newVal < 0)\n        newVal = 0;\n    else if (newVal > maxValue)\n        newVal = maxValue;\n\n    oldToMax = oldValue * totalPixels / maxValue;\n    newToMax = newVal * totalPixels / maxValue;\n    result = oldToMax - newToMax;\n\n    return abs(result);\n}\n\nu8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale)\n{\n    u8 result = hp * scale / maxhp;\n\n    if (result == 0 && hp > 0)\n        return 1;\n\n    return result;\n}\n\nu8 GetHPBarLevel(s16 hp, s16 maxhp)\n{\n    u8 result;\n\n    if (hp == maxhp)\n        result = HP_BAR_FULL;\n    else\n    {\n        u8 fraction = GetScaledHPFraction(hp, maxhp, B_HEALTHBAR_NUM_PIXELS);\n        if (fraction > (B_HEALTHBAR_NUM_PIXELS * 50 / 100))\n            result = HP_BAR_GREEN;\n        else if (fraction > (B_HEALTHBAR_NUM_PIXELS * 20 / 100))\n            result = HP_BAR_YELLOW;\n        else if (fraction > 0)\n            result = HP_BAR_RED;\n        else\n            result = HP_BAR_EMPTY;\n    }\n\n    return result;\n}\n\nstatic const struct WindowTemplate sHealthboxWindowTemplate = {\n    .bg = 0,\n    .tilemapLeft = 0,\n    .tilemapTop = 0,\n    .width = 8,\n    .height = 2,\n    .paletteNum = 0,\n    .baseBlock = 0\n};\n\nstatic u8 *AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 *windowId)\n{\n    u16 winId;\n    u8 color[3];\n    struct WindowTemplate winTemplate = sHealthboxWindowTemplate;\n\n    winId = AddWindow(&winTemplate);\n    FillWindowPixelBuffer(winId, PIXEL_FILL(2));\n\n    color[0] = 2;\n    color[1] = 1;\n    color[2] = 3;\n\n    AddTextPrinterParameterized4(winId, FONT_SMALL, x, y, 0, 0, color, -1, str);\n\n    *windowId = winId;\n    return (u8 *)(GetWindowAttribute(winId, WINDOW_TILE_DATA));\n}\n\nstatic void RemoveWindowOnHealthbox(u32 windowId)\n{\n    RemoveWindow(windowId);\n}\n\nstatic void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 windowWidth)\n{\n    CpuCopy32(windowTileData + 256, dest + 256, windowWidth * TILE_SIZE_4BPP);\n// + 256 as that prevents the top 4 blank rows of sHealthboxWindowTemplate from being copied\n    if (windowWidth > 0)\n    {\n        do\n        {\n            CpuCopy32(windowTileData + 20, dest + 20, 12);\n            dest += 32, windowTileData += 32;\n            windowWidth--;\n        } while (windowWidth != 0);\n    }\n}\n\nstatic void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 windowWidth)\n{\n    CpuCopy32(windowTileData, dest, windowWidth * TILE_SIZE_4BPP);\n    CpuCopy32(windowTileData + 256, dest + 256, windowWidth * TILE_SIZE_4BPP);\n}\n"
  },
  {
    "path": "src/battle_intro.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_setup.h\"\n#include \"scanline_effect.h\"\n#include \"task.h\"\n#include \"trig.h\"\n\nstatic EWRAM_DATA u16 sBgCnt = 0;\n\nextern const u8 gBattleAnimRegOffsBgCnt[];\nextern const u8 gBattleIntroRegOffsBgCnt[];\n\nstatic void BattleIntroSlide1(u8 taskId);\nstatic void BattleIntroSlide2(u8 taskId);\nstatic void BattleIntroSlide3(u8 taskId);\nstatic void BattleIntroSlideLink(u8 taskId);\n\nstatic const TaskFunc sBattleIntroSlideFuncs[] =\n{\n    BattleIntroSlide1, // BATTLE_TERRAIN_GRASS\n    BattleIntroSlide1, // BATTLE_TERRAIN_LONG_GRASS\n    BattleIntroSlide2, // BATTLE_TERRAIN_SAND\n    BattleIntroSlide2, // BATTLE_TERRAIN_UNDERWATER\n    BattleIntroSlide2, // BATTLE_TERRAIN_WATER\n    BattleIntroSlide1, // BATTLE_TERRAIN_POND\n    BattleIntroSlide1, // BATTLE_TERRAIN_MOUNTAIN\n    BattleIntroSlide1, // BATTLE_TERRAIN_CAVE\n    BattleIntroSlide3, // BATTLE_TERRAIN_BUILDING\n    BattleIntroSlide3, // BATTLE_TERRAIN_PLAIN\n};\n\nvoid SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value)\n{\n    if (bgId < 4)\n    {\n        sBgCnt = GetGpuReg(gBattleAnimRegOffsBgCnt[bgId]);\n        switch (attributeId)\n        {\n        case BG_ANIM_SCREEN_SIZE:\n            ((struct BgCnt *)&sBgCnt)->screenSize = value;\n            break;\n        case BG_ANIM_AREA_OVERFLOW_MODE:\n            ((struct BgCnt *)&sBgCnt)->areaOverflowMode = value;\n            break;\n        case BG_ANIM_MOSAIC:\n            ((struct BgCnt *)&sBgCnt)->mosaic = value;\n            break;\n        case BG_ANIM_CHAR_BASE_BLOCK:\n            ((struct BgCnt *)&sBgCnt)->charBaseBlock = value;\n            break;\n        case BG_ANIM_PRIORITY:\n            ((struct BgCnt *)&sBgCnt)->priority = value;\n            break;\n        case BG_ANIM_PALETTES_MODE:\n            ((struct BgCnt *)&sBgCnt)->palettes = value;\n            break;\n        case BG_ANIM_SCREEN_BASE_BLOCK:\n            ((struct BgCnt *)&sBgCnt)->screenBaseBlock = value;\n            break;\n        }\n        SetGpuReg(gBattleAnimRegOffsBgCnt[bgId], sBgCnt);\n    }\n}\n\ns32 GetAnimBgAttribute(u8 bgId, u8 attributeId)\n{\n    u16 bgCnt;\n\n    if (bgId < 4)\n    {\n        bgCnt = GetGpuReg(gBattleIntroRegOffsBgCnt[bgId]);\n        switch (attributeId)\n        {\n        case BG_ANIM_SCREEN_SIZE:\n            return ((struct BgCnt *)&bgCnt)->screenSize;\n        case BG_ANIM_AREA_OVERFLOW_MODE:\n            return ((struct BgCnt *)&bgCnt)->areaOverflowMode;\n        case BG_ANIM_MOSAIC:\n            return ((struct BgCnt *)&bgCnt)->mosaic;\n        case BG_ANIM_CHAR_BASE_BLOCK:\n            return ((struct BgCnt *)&bgCnt)->charBaseBlock;\n        case BG_ANIM_PRIORITY:\n            return ((struct BgCnt *)&bgCnt)->priority;\n        case BG_ANIM_PALETTES_MODE:\n            return ((struct BgCnt *)&bgCnt)->palettes;\n        case BG_ANIM_SCREEN_BASE_BLOCK:\n            return ((struct BgCnt *)&bgCnt)->screenBaseBlock;\n        }\n    }\n    return 0;\n}\n\nvoid HandleIntroSlide(u8 terrain)\n{\n    u8 taskId;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        taskId = CreateTask(BattleIntroSlideLink, 0);\n    }\n    else if ((gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) && gGameVersion != VERSION_RUBY)\n    {\n        terrain = BATTLE_TERRAIN_UNDERWATER;\n        taskId = CreateTask(BattleIntroSlide2, 0);\n    }\n    else\n    {\n        taskId = CreateTask(sBattleIntroSlideFuncs[terrain], 0);\n    }\n    gTasks[taskId].data[0] = 0;\n    gTasks[taskId].data[1] = terrain;\n    gTasks[taskId].data[2] = 0;\n    gTasks[taskId].data[3] = 0;\n    gTasks[taskId].data[4] = 0;\n    gTasks[taskId].data[5] = 0;\n    gTasks[taskId].data[6] = 0;\n}\n\nvoid BattleIntroSlideEnd(u8 taskId)\n{\n    DestroyTask(taskId);\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    gBattle_BG2_X = 0;\n    gBattle_BG2_Y = 0;\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);\n}\n\nstatic void BattleIntroSlide1(u8 taskId)\n{\n    s32 i;\n\n    gBattle_BG1_X += 6;\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n        {\n            gTasks[taskId].data[2] = 16;\n            ++gTasks[taskId].data[0];\n        }\n        else\n        {\n            gTasks[taskId].data[2] = 1;\n            ++gTasks[taskId].data[0];\n        }\n        break;\n    case 1:\n        if (--gTasks[taskId].data[2] == 0)\n        {\n            ++gTasks[taskId].data[0];\n            SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);\n        }\n        break;\n    case 2:\n        gBattle_WIN0V -= 0xFF;\n        if ((gBattle_WIN0V & 0xFF00) == 0x3000)\n        {\n            ++gTasks[taskId].data[0];\n            gTasks[taskId].data[2] = 240;\n            if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n                gTasks[taskId].data[2] = 0;\n            gTasks[taskId].data[3] = 32;\n            gIntroSlideFlags &= ~1;\n        }\n        break;\n    case 3:\n        if (gTasks[taskId].data[3])\n        {\n            --gTasks[taskId].data[3];\n        }\n        else\n        {\n            if (gTasks[taskId].data[1] == 1)\n            {\n                if (gBattle_BG1_Y != 0xFFB0)\n                    gBattle_BG1_Y -= 2;\n            }\n            else if (gBattle_BG1_Y != 0xFFC8)\n            {\n                    gBattle_BG1_Y -= 1;\n            }\n        }\n        if (gBattle_WIN0V & 0xFF00)\n            gBattle_WIN0V -= 0x3FC;\n        if (gTasks[taskId].data[2])\n            gTasks[taskId].data[2] -= 2;\n        // Scanline settings have already been set in CB2_InitBattleInternal\n        for (i = 0; i < 80; ++i)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2];\n        while (i < 160)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2];\n        if(gSaveBlock2Ptr->optionsBattleIntroAnim == 0)\n        {\n            if (!gTasks[taskId].data[2])\n            {\n                gScanlineEffect.state = 3;\n                ++gTasks[taskId].data[0];\n                CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);\n                SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);\n                SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);\n                SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);\n                SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);\n            }\n        }\n        else\n        {\n            if (gTasks[taskId].data[3] == 0) //wait for black bars to be done splitting\n            {\n                gScanlineEffect.state = 3;\n                ++gTasks[taskId].data[0];\n                CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);\n                SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); //intro particles on this bg\n                SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);\n                SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);\n                SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);\n            }\n        }\n        break;\n    case 4:\n        BattleIntroSlideEnd(taskId);\n        break;\n    }\n}\n\nstatic void BattleIntroSlide2(u8 taskId)\n{\n    s32 i;\n\n    switch (gTasks[taskId].data[1])\n    {\n    case 2:\n    case 4:\n        gBattle_BG1_X += 8;\n        break;\n    case 3:\n        gBattle_BG1_X += 6;\n        break;\n    }\n    if (gTasks[taskId].data[1] == 4)\n    {\n        gBattle_BG1_Y = Cos2(gTasks[taskId].data[6]) / 512 - 8;\n        if (gTasks[taskId].data[6] < 180)\n            gTasks[taskId].data[6] += 4;\n        else\n            gTasks[taskId].data[6] += 6;\n        if (gTasks[taskId].data[6] == 360)\n            gTasks[taskId].data[6] = 0;\n    }\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        gTasks[taskId].data[4] = 16;\n        if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n        {\n            gTasks[taskId].data[2] = 16;\n            ++gTasks[taskId].data[0];\n        }\n        else\n        {\n            gTasks[taskId].data[2] = 1;\n            ++gTasks[taskId].data[0];\n        }\n        break;\n    case 1:\n        if (--gTasks[taskId].data[2] == 0)\n        {\n            ++gTasks[taskId].data[0];\n            SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);\n        }\n        break;\n    case 2:\n        gBattle_WIN0V -= 0xFF;\n        if ((gBattle_WIN0V & 0xFF00) == 0x3000)\n        {\n            ++gTasks[taskId].data[0];\n            gTasks[taskId].data[2] = 240;\n            if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n                gTasks[taskId].data[2] = 0;\n            gTasks[taskId].data[3] = 32;\n            gTasks[taskId].data[5] = 1;\n            gIntroSlideFlags &= ~1;\n        }\n        break;\n    case 3:\n        if (gTasks[taskId].data[3])\n        {\n            if (--gTasks[taskId].data[3] == 0)\n            {\n                SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ);\n                SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(15, 0));\n                SetGpuReg(REG_OFFSET_BLDY, 0);\n            }\n        }\n        else if ((gTasks[taskId].data[4] & 0x1F) && --gTasks[taskId].data[5] == 0)\n        {\n                gTasks[taskId].data[4] += 0xFF;\n                gTasks[taskId].data[5] = 4;\n        }\n        if (gBattle_WIN0V & 0xFF00)\n            gBattle_WIN0V -= 0x3FC;\n\n        if (gTasks[taskId].data[2])\n            gTasks[taskId].data[2] -= 2;\n        // Scanline settings have already been set in CB2_InitBattleInternal()\n        for (i = 0; i < 80; ++i)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2];\n        while (i < 160)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2];\n        if(gSaveBlock2Ptr->optionsBattleIntroAnim == 0)\n        {\n            if (!gTasks[taskId].data[2])\n            {\n                gScanlineEffect.state = 3;\n                ++gTasks[taskId].data[0];\n                CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);\n                SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);\n                SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);\n                SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);\n                SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);\n            }\n        }\n        else\n        {\n            if (gTasks[taskId].data[3] == 0) //wait for black bars to be done splitting\n            {\n                gScanlineEffect.state = 3;\n                ++gTasks[taskId].data[0];\n                CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);\n                SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); //intro particles on this bg\n                SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);\n                SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);\n                SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);\n            }\n        }\n        break;\n    case 4:\n        BattleIntroSlideEnd(taskId);\n        break;\n    }\n    if (gTasks[taskId].data[0] != 4)\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[4], 0));\n}\n\nstatic void BattleIntroSlide3(u8 taskId)\n{\n    s32 i;\n\n    gBattle_BG1_X += 8;\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8));\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        gTasks[taskId].data[4] = BLDALPHA_BLEND(8, 8);\n        if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n        {\n            gTasks[taskId].data[2] = 16;\n            ++gTasks[taskId].data[0];\n        }\n        else\n        {\n            gTasks[taskId].data[2] = 1;\n            ++gTasks[taskId].data[0];\n        }\n        break;\n    case 1:\n        if (--gTasks[taskId].data[2] == 0)\n        {\n            ++gTasks[taskId].data[0];\n            SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);\n        }\n        break;\n    case 2:\n        gBattle_WIN0V -= 0xFF;\n        if ((gBattle_WIN0V & 0xFF00) == 0x3000)\n        {\n            ++gTasks[taskId].data[0];\n            gTasks[taskId].data[2] = 240;\n            if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n                gTasks[taskId].data[2] = 0;\n            gTasks[taskId].data[3] = 32;\n            gTasks[taskId].data[5] = 1;\n            gIntroSlideFlags &= ~1;\n        }\n        break;\n    case 3:\n        if (gTasks[taskId].data[3])\n        {\n            --gTasks[taskId].data[3];\n        }\n        else if ((gTasks[taskId].data[4] & 0xF) && --gTasks[taskId].data[5] == 0)\n        {\n            gTasks[taskId].data[4] += 0xFF;\n            gTasks[taskId].data[5] = 6;\n        }\n        if (gBattle_WIN0V & 0xFF00)\n            gBattle_WIN0V -= 0x3FC;\n        if (gTasks[taskId].data[2])\n            gTasks[taskId].data[2] -= 2;\n        // Scanline settings have already been set in CB2_InitBattleInternal()\n        for (i = 0; i < 80; ++i)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2];\n        while (i < 160)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2];\n        if(gSaveBlock2Ptr->optionsBattleIntroAnim == 0)\n        {\n            if (!gTasks[taskId].data[2])\n            {\n                gScanlineEffect.state = 3;\n                ++gTasks[taskId].data[0];\n                CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);\n                SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);\n                SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);\n                SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);\n                SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);\n            }\n        }\n        else\n        {\n            if (gTasks[taskId].data[3] == 0) //wait for black bars to be done splitting\n            {\n                gScanlineEffect.state = 3;\n                ++gTasks[taskId].data[0];\n                CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);\n                SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); //intro particles on this bg\n                SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);\n                SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);\n                SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);\n            }\n        }\n        break;\n    case 4:\n        BattleIntroSlideEnd(taskId);\n        break;\n    }\n    if (gTasks[taskId].data[0] != 4)\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[4], 0));\n}\n\nstatic void BattleIntroSlideLink(u8 taskId)\n{\n    s32 i;\n\n    if (gTasks[taskId].data[0] > 1 && !gTasks[taskId].data[4])\n    {\n        u16 var0 = gBattle_BG1_X & 0x8000;\n\n        if (var0 || gBattle_BG1_X < 80)\n        {\n            gBattle_BG1_X += 3;\n            gBattle_BG2_X -= 3;\n        }\n        else\n        {\n            CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);\n            CpuFill32(0, (void *)BG_SCREEN_ADDR(30), BG_SCREEN_SIZE);\n            gTasks[taskId].data[4] = 1;\n        }\n    }\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        gTasks[taskId].data[2] = 32;\n        ++gTasks[taskId].data[0];\n        break;\n    case 1:\n        if (--gTasks[taskId].data[2] == 0)\n        {\n            ++gTasks[taskId].data[0];\n            gSprites[gBattleStruct->linkBattleVsSpriteId_V].oam.objMode = ST_OAM_OBJ_WINDOW;\n            gSprites[gBattleStruct->linkBattleVsSpriteId_V].callback = SpriteCB_VsLetterInit;\n            gSprites[gBattleStruct->linkBattleVsSpriteId_S].oam.objMode = ST_OAM_OBJ_WINDOW;\n            gSprites[gBattleStruct->linkBattleVsSpriteId_S].callback = SpriteCB_VsLetterInit;\n            SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);\n            SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2);\n        }\n        break;\n    case 2:\n        gBattle_WIN0V -= 0xFF;\n        if ((gBattle_WIN0V & 0xFF00) == 0x3000)\n        {\n            ++gTasks[taskId].data[0];\n            gTasks[taskId].data[2] = 240;\n            if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n                gTasks[taskId].data[2] = 0;\n            gTasks[taskId].data[3] = 32;\n            gIntroSlideFlags &= ~1;\n        }\n        break;\n    case 3:\n        if (gBattle_WIN0V & 0xFF00)\n            gBattle_WIN0V -= 0x3FC;\n        if (gTasks[taskId].data[2])\n            gTasks[taskId].data[2] -= 2;\n        // Scanline settings have already been set in CB2_InitBattleInternal()\n        for (i = 0; i < 80; ++i)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2];\n        while (i < 160)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2];\n        if(gSaveBlock2Ptr->optionsBattleIntroAnim != 0)\n        {\n            CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);\n            CpuFill32(0, (void *)BG_SCREEN_ADDR(30), BG_SCREEN_SIZE);\n            gTasks[taskId].data[4] = 1;\n        }\n        if (!gTasks[taskId].data[2])\n        {\n            gScanlineEffect.state = 3;\n            ++gTasks[taskId].data[0];\n            SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);\n            SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);\n            SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);\n            SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);\n        }\n        break;\n    case 4:\n        BattleIntroSlideEnd(taskId);\n        break;\n    }\n}\n\nvoid CopyBattlerSpriteToBg(s32 bgId, u8 x, u8 y, u8 battlerPosition, u8 palno, u8 *tilesDest, u16 *tilemapDest, u16 tilesOffset)\n{\n    s32 i, j;\n    u8 battler = GetBattlerAtPosition(battlerPosition);\n    s32 offset = tilesOffset;\n\n    CpuCopy16(gMonSpritesGfxPtr->sprites[battlerPosition] + BG_SCREEN_SIZE * gBattleMonForms[battler], tilesDest, BG_SCREEN_SIZE);\n    LoadBgTiles(bgId, tilesDest, 0x1000, tilesOffset);\n    for (i = y; i < y + 8; ++i)\n        for (j = x; j < x + 8; ++j)\n            tilemapDest[i * 32 + j] = offset++ | (palno << 12);\n    LoadBgTilemap(bgId, tilemapDest, BG_SCREEN_SIZE, 0);\n}\n\n// Unused\nstatic void DrawBattlerOnBgDMA(u8 arg0, u8 arg1, u8 battlerPosition, u8 arg3, u8 arg4, u16 arg5, u8 arg6, u8 arg7)\n{\n    s32 i, j, offset;\n\n    DmaCopy16(3, gMonSpritesGfxPtr->sprites[battlerPosition] + BG_SCREEN_SIZE * arg3, (void *)BG_SCREEN_ADDR(0) + arg5, BG_SCREEN_SIZE);\n    offset = (arg5 >> 5) - (arg7 << 9);\n    for (i = arg1; i < arg1 + 8; ++i)\n        for (j = arg0; j < arg0 + 8; ++j)\n            *((u16 *)(BG_VRAM) + (i * 32) + (j + (arg6 << 10))) = offset++ | (arg4 << 12);\n}\n"
  },
  {
    "path": "src/battle_main.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_ai_script_commands.h\"\n#include \"battle_controllers.h\"\n#include \"battle_interface.h\"\n#include \"battle_main.h\"\n#include \"battle_message.h\"\n#include \"battle_scripts.h\"\n#include \"battle_setup.h\"\n#include \"berry.h\"\n#include \"data.h\"\n#include \"decompress.h\"\n#include \"event_data.h\"\n#include \"evolution_scene.h\"\n#include \"graphics.h\"\n#include \"help_system.h\"\n#include \"item.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"load_save.h\"\n#include \"m4a.h\"\n#include \"party_menu.h\"\n#include \"pokeball.h\"\n#include \"pokedex.h\"\n#include \"quest_log.h\"\n#include \"random.h\"\n#include \"roamer.h\"\n#include \"safari_zone.h\"\n#include \"scanline_effect.h\"\n#include \"script.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"vs_seeker.h\"\n#include \"util.h\"\n#include \"constants/abilities.h\"\n#include \"constants/battle_move_effects.h\"\n#include \"constants/battle_setup.h\"\n#include \"constants/hold_effects.h\"\n#include \"constants/items.h\"\n#include \"constants/layouts.h\"\n#include \"constants/moves.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/songs.h\"\n#include \"constants/trainers.h\"\n\nstatic void SpriteCB_UnusedDebugSprite(struct Sprite *sprite);\nstatic void HandleAction_UseMove(void);\nstatic void HandleAction_Switch(void);\nstatic void HandleAction_UseItem(void);\nstatic void HandleAction_Run(void);\nstatic void HandleAction_WatchesCarefully(void);\nstatic void HandleAction_SafariZoneBallThrow(void);\nstatic void HandleAction_ThrowBait(void);\nstatic void HandleAction_ThrowRock(void);\nstatic void HandleAction_SafariZoneRun(void);\nstatic void HandleAction_OldManBallThrow(void);\nstatic void HandleAction_TryFinish(void);\nstatic void HandleAction_NothingIsFainted(void);\nstatic void HandleAction_ActionFinished(void);\nstatic void HandleEndTurn_ContinueBattle(void);\nstatic void HandleEndTurn_BattleWon(void);\nstatic void HandleEndTurn_BattleLost(void);\nstatic void HandleEndTurn_RanFromBattle(void);\nstatic void HandleEndTurn_MonFled(void);\nstatic void HandleEndTurn_FinishBattle(void);\nstatic void CB2_InitBattleInternal(void);\nstatic void CB2_PreInitMultiBattle(void);\nstatic void CB2_HandleStartMultiBattle(void);\nstatic u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum);\nstatic void CB2_HandleStartBattle(void);\nstatic void TryCorrectShedinjaLanguage(struct Pokemon *mon);\nstatic void BattleMainCB1(void);\nstatic void CB2_QuitPokedudeBattle(void);\nstatic void SpriteCB_UnusedDebugSprite_Step(struct Sprite *sprite);\nstatic void CB2_EndLinkBattle(void);\nstatic void EndLinkBattleInSteps(void);\nstatic void SpriteCB_MoveWildMonToRight(struct Sprite *sprite);\nstatic void SpriteCB_WildMonShowHealthbox(struct Sprite *sprite);\nstatic void SpriteCB_Flicker(struct Sprite *sprite);\nstatic void SpriteCB_AnimFaintOpponent(struct Sprite *sprite);\nstatic void SpriteCB_BlinkVisible(struct Sprite *sprite);\nstatic void oac_poke_ally_(struct Sprite *sprite);\nstatic void SpriteCB_Idle(struct Sprite *sprite);\nstatic void SpriteCB_BounceEffect(struct Sprite *sprite);\nstatic void SpriteCB_PlayerThrowUpdate(struct Sprite *sprite);\nstatic void BattleStartClearSetData(void);\nstatic void BattleIntroGetMonsData(void);\nstatic void TurnValuesCleanUp(bool8 var0);\nstatic void SpecialStatusesClear(void);\nstatic void BattleIntroPrepareBackgroundSlide(void);\nstatic void BattleIntroDrawTrainersOrMonsSprites(void);\nstatic void BattleIntroDrawPartySummaryScreens(void);\nstatic void BattleIntroPrintTrainerWantsToBattle(void);\nstatic void BattleIntroPrintWildMonAttacked(void);\nstatic void BattleIntroPrintOpponentSendsOut(void);\nstatic void BattleIntroPrintPlayerSendsOut(void);\nstatic void BattleIntroRecordMonsToDex(void);\nstatic void BattleIntroOpponentSendsOutMonAnimation(void);\nstatic void BattleIntroPlayerSendsOutMonAnimation(void);\nstatic void TryDoEventsBeforeFirstTurn(void);\nstatic void HandleTurnActionSelectionState(void);\nstatic void RunTurnActionsFunctions(void);\nstatic void SetActionsAndBattlersTurnOrder(void);\nstatic void CheckFocusPunch_ClearVarsBeforeTurnStarts(void);\nstatic void HandleEndTurn_FinishBattle(void);\nstatic void FreeResetData_ReturnToOvOrDoEvolutions(void);\nstatic void ReturnFromBattleToOverworld(void);\nstatic void TryEvolvePokemon(void);\nstatic void WaitForEvoSceneToFinish(void);\n\nEWRAM_DATA u16 gBattle_BG0_X = 0;\nEWRAM_DATA u16 gBattle_BG0_Y = 0;\nEWRAM_DATA u16 gBattle_BG1_X = 0;\nEWRAM_DATA u16 gBattle_BG1_Y = 0;\nEWRAM_DATA u16 gBattle_BG2_X = 0;\nEWRAM_DATA u16 gBattle_BG2_Y = 0;\nEWRAM_DATA u16 gBattle_BG3_X = 0;\nEWRAM_DATA u16 gBattle_BG3_Y = 0;\nEWRAM_DATA u16 gBattle_WIN0H = 0;\nEWRAM_DATA u16 gBattle_WIN0V = 0;\nEWRAM_DATA u16 gBattle_WIN1H = 0;\nEWRAM_DATA u16 gBattle_WIN1V = 0;\nEWRAM_DATA u8 gDisplayedStringBattle[300] = {0};\nEWRAM_DATA u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT] = {0};\nEWRAM_DATA u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT] = {0};\nEWRAM_DATA u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT] = {0};\n// The below array is never intentionally used. However, Brock's\n// defeat text (PewterCity_Gym_Text_BrockDefeat) is too long\n// for gDisplayedStringBattle and overflows into this array. If it\n// is removed (and none of the buffers above are increased in size)\n// it will instead overflow into useful data.\nstatic EWRAM_DATA u32 sFlickerArray[25] = {0};\nEWRAM_DATA u32 gBattleTypeFlags = 0;\nEWRAM_DATA u8 gBattleTerrain = 0;\nEWRAM_DATA u32 gUnusedFirstBattleVar1 = 0;\nEWRAM_DATA struct MultiBattlePokemonTx gMultiPartnerParty[3] = {0};\nEWRAM_DATA u8 *gBattleAnimBgTileBuffer = NULL;\nEWRAM_DATA u8 *gBattleAnimBgTilemapBuffer = NULL;\nstatic EWRAM_DATA u16 *sUnknownDebugSpriteDataBuffer = NULL;\nEWRAM_DATA u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200] = {0};\nEWRAM_DATA u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200] = {0};\nEWRAM_DATA u8 gActiveBattler = 0;\nEWRAM_DATA u32 gBattleControllerExecFlags = 0;\nEWRAM_DATA u8 gBattlersCount = 0;\nEWRAM_DATA u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gBattlerPositions[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gBattlerByTurnOrder[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gCurrentTurnActionNumber = 0;\nEWRAM_DATA u8 gCurrentActionFuncId = 0;\nEWRAM_DATA struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gBattlerSpriteIds[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gCurrMovePos = 0;\nEWRAM_DATA u8 gChosenMovePos = 0;\nEWRAM_DATA u16 gCurrentMove = 0;\nEWRAM_DATA u16 gChosenMove = 0;\nEWRAM_DATA u16 gCalledMove = 0;\nEWRAM_DATA s32 gBattleMoveDamage = 0;\nEWRAM_DATA s32 gHpDealt = 0;\nEWRAM_DATA s32 gTakenDmg[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u16 gLastUsedItem = 0;\nEWRAM_DATA u8 gLastUsedAbility = 0;\nEWRAM_DATA u8 gBattlerAttacker = 0;\nEWRAM_DATA u8 gBattlerTarget = 0;\nEWRAM_DATA u8 gBattlerFainted = 0;\nEWRAM_DATA u8 gEffectBattler = 0;\nEWRAM_DATA u8 gPotentialItemEffectBattler = 0;\nEWRAM_DATA u8 gAbsentBattlerFlags = 0;\nEWRAM_DATA u8 gCritMultiplier = 0;\nEWRAM_DATA u8 gMultiHitCounter = 0;\nEWRAM_DATA const u8 *gBattlescriptCurrInstr = NULL;\nEWRAM_DATA u32 gUnusedBattleMainVar = 0;\nEWRAM_DATA u8 gChosenActionByBattler[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA const u8 *gSelectionBattleScripts[MAX_BATTLERS_COUNT] = {NULL};\nEWRAM_DATA u16 gLastPrintedMoves[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u16 gLastMoves[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u16 gLastLandedMoves[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u16 gLastHitByType[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u16 gLastResultingMoves[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u16 gLockedMoves[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gLastHitBy[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gMoveResultFlags = 0;\nEWRAM_DATA u32 gHitMarker = 0;\nstatic EWRAM_DATA u8 sUnusedBattlersArray[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gUnusedFirstBattleVar2 = 0;\nEWRAM_DATA u16 gSideStatuses[2] = {0};\nEWRAM_DATA struct SideTimer gSideTimers[2] = {0};\nEWRAM_DATA u32 gStatuses3[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u16 gPauseCounterBattle = 0;\nEWRAM_DATA u16 gPaydayMoney = 0;\nEWRAM_DATA u16 gRandomTurnNumber = 0;\nEWRAM_DATA u8 gBattleCommunication[BATTLE_COMMUNICATION_ENTRIES_COUNT] = {0};\nEWRAM_DATA u8 gBattleOutcome = 0;\nEWRAM_DATA struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u16 gBattleWeather = 0;\nEWRAM_DATA struct WishFutureKnock gWishFutureKnock = {0};\nEWRAM_DATA u16 gIntroSlideFlags = 0;\nEWRAM_DATA u8 gSentPokesToOpponent[2] = {0};\nEWRAM_DATA u16 gDynamicBasePower = 0;\nEWRAM_DATA u16 gExpShareExp = 0;\nEWRAM_DATA struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA struct BattleScripting gBattleScripting = {0};\nEWRAM_DATA struct BattleStruct *gBattleStruct = NULL;\nEWRAM_DATA u8 *gLinkBattleSendBuffer = NULL;\nEWRAM_DATA u8 *gLinkBattleRecvBuffer = NULL;\nEWRAM_DATA struct BattleResources *gBattleResources = NULL;\nEWRAM_DATA u8 gActionSelectionCursor[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gMoveSelectionCursor[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gBattlerStatusSummaryTaskId[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA u8 gBattlerInMenuId = 0;\nEWRAM_DATA bool8 gDoingBattleAnim = FALSE;\nEWRAM_DATA u32 gTransformedPersonalities[MAX_BATTLERS_COUNT] = {0};\nEWRAM_DATA struct BattleSpriteData *gBattleSpritesDataPtr = NULL;\nEWRAM_DATA struct MonSpritesGfx *gMonSpritesGfxPtr = NULL;\nEWRAM_DATA u16 gBattleMovePower = 0;\nEWRAM_DATA u16 gMoveToLearn = 0;\nEWRAM_DATA u8 gBattleMonForms[MAX_BATTLERS_COUNT] = {0};\n\nvoid (*gPreBattleCallback1)(void);\nvoid (*gBattleMainFunc)(void);\nstruct BattleResults gBattleResults;\nu8 gLeveledUpInBattle;\nvoid (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void);\nu8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT];\nu8 gMultiUsePlayerCursor;\nu8 gNumberOfMovesToChoose;\nu8 gBattleControllerData[MAX_BATTLERS_COUNT];\n\nstatic const struct ScanlineEffectParams sIntroScanlineParams16Bit =\n{\n    &REG_BG3HOFS, SCANLINE_EFFECT_DMACNT_16BIT, 1\n};\n\nconst struct SpriteTemplate gUnknownDebugSprite =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_UnusedDebugSprite,\n};\n\nstatic const u8 sText_ShedinjaJpnName[] = _(\"ヌケニン\"); // Nukenin\n\nconst struct OamData gOamData_BattlerOpponent =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nconst struct OamData gOamData_BattlerPlayer =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 2,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sAnim_Unused[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnims_Unused[] =\n{\n    sAnim_Unused,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Unused[] =\n{\n    AFFINEANIMCMD_FRAME(-0x10, 0x0, 0, 4),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 0x3C),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_Unused[] =\n{\n    sAffineAnim_Unused,\n};\n\nstatic const s8 sPlayerThrowXTranslation[] = { -32, -16, -16, -32, -32, 0, 0, 0 };\n\n// format: attacking type, defending type, damage multiplier\n// the multiplier is a (decimal) fixed-point number:\n// 20 is ×2.0 TYPE_MUL_SUPER_EFFECTIVE\n// 10 is ×1.0 TYPE_MUL_NORMAL\n// 05 is ×0.5 TYPE_MUL_NOT_EFFECTIVE\n// 00 is ×0.0 TYPE_MUL_NO_EFFECT\nconst u8 gTypeEffectiveness[336] =\n{\n    TYPE_NORMAL, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_NORMAL, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FIRE, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FIRE, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FIRE, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_FIRE, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_FIRE, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_FIRE, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FIRE, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FIRE, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_WATER, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_WATER, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_WATER, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_WATER, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_WATER, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_WATER, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_ELECTRIC, TYPE_WATER, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_ELECTRIC, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_ELECTRIC, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_ELECTRIC, TYPE_GROUND, TYPE_MUL_NO_EFFECT,\n    TYPE_ELECTRIC, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_ELECTRIC, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_GRASS, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_GRASS, TYPE_WATER, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_GRASS, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_GRASS, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_GRASS, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_GRASS, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_GRASS, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_GRASS, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_GRASS, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_GRASS, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_ICE, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_ICE, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_ICE, TYPE_ICE, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_ICE, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_ICE, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_ICE, TYPE_DRAGON, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_ICE, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_ICE, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FIGHTING, TYPE_NORMAL, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_FIGHTING, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_FIGHTING, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FIGHTING, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FIGHTING, TYPE_PSYCHIC, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FIGHTING, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FIGHTING, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_FIGHTING, TYPE_DARK, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_FIGHTING, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_POISON, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_POISON, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_POISON, TYPE_GROUND, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_POISON, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_POISON, TYPE_GHOST, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_POISON, TYPE_STEEL, TYPE_MUL_NO_EFFECT,\n    TYPE_GROUND, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_GROUND, TYPE_ELECTRIC, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_GROUND, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_GROUND, TYPE_POISON, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_GROUND, TYPE_FLYING, TYPE_MUL_NO_EFFECT,\n    TYPE_GROUND, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_GROUND, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_GROUND, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_FLYING, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FLYING, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_FLYING, TYPE_FIGHTING, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_FLYING, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_FLYING, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FLYING, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_PSYCHIC, TYPE_FIGHTING, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_PSYCHIC, TYPE_POISON, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_PSYCHIC, TYPE_PSYCHIC, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_PSYCHIC, TYPE_DARK, TYPE_MUL_NO_EFFECT,\n    TYPE_PSYCHIC, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_BUG, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_BUG, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_BUG, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_BUG, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_BUG, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_BUG, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_BUG, TYPE_GHOST, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_BUG, TYPE_DARK, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_BUG, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_ROCK, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_ROCK, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_ROCK, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_ROCK, TYPE_GROUND, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_ROCK, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_ROCK, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_ROCK, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_GHOST, TYPE_NORMAL, TYPE_MUL_NO_EFFECT,\n    TYPE_GHOST, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_GHOST, TYPE_DARK, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_GHOST, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_GHOST, TYPE_GHOST, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_DRAGON, TYPE_DRAGON, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_DRAGON, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_DARK, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_DARK, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_DARK, TYPE_GHOST, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_DARK, TYPE_DARK, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_DARK, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_STEEL, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_STEEL, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_STEEL, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_STEEL, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_STEEL, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,\n    TYPE_STEEL, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,\n    TYPE_FORESIGHT, TYPE_FORESIGHT, TYPE_MUL_NO_EFFECT,\n    TYPE_NORMAL, TYPE_GHOST, TYPE_MUL_NO_EFFECT,\n    TYPE_FIGHTING, TYPE_GHOST, TYPE_MUL_NO_EFFECT,\n    TYPE_ENDTABLE, TYPE_ENDTABLE, TYPE_MUL_NO_EFFECT\n};\n\nconst u8 gTypeNames[NUMBER_OF_MON_TYPES][TYPE_NAME_LENGTH + 1] =\n{\n    [TYPE_NORMAL] = _(\"NORMAL\"),\n    [TYPE_FIGHTING] = _(\"FIGHT\"),\n    [TYPE_FLYING] = _(\"FLYING\"),\n    [TYPE_POISON] = _(\"POISON\"),\n    [TYPE_GROUND] = _(\"GROUND\"),\n    [TYPE_ROCK] = _(\"ROCK\"),\n    [TYPE_BUG] = _(\"BUG\"),\n    [TYPE_GHOST] = _(\"GHOST\"),\n    [TYPE_STEEL] = _(\"STEEL\"),\n    [TYPE_MYSTERY] = _(\"???\"),\n    [TYPE_FIRE] = _(\"FIRE\"),\n    [TYPE_WATER] = _(\"WATER\"),\n    [TYPE_GRASS] = _(\"GRASS\"),\n    [TYPE_ELECTRIC] = _(\"ELECTR\"),\n    [TYPE_PSYCHIC] = _(\"PSYCHC\"),\n    [TYPE_ICE] = _(\"ICE\"),\n    [TYPE_DRAGON] = _(\"DRAGON\"),\n    [TYPE_DARK] = _(\"DARK\"),\n};\n\n// This is a factor in how much money you get for beating a trainer.\nconst struct TrainerMoney gTrainerMoneyTable[] =\n{\n    {TRAINER_CLASS_LEADER, 25},\n    {TRAINER_CLASS_ELITE_FOUR, 25},\n    {TRAINER_CLASS_PKMN_PROF, 25},\n    {TRAINER_CLASS_RIVAL_EARLY, 4},\n    {TRAINER_CLASS_RIVAL_LATE, 9},\n    {TRAINER_CLASS_CHAMPION, 25},\n    {TRAINER_CLASS_YOUNGSTER, 4},\n    {TRAINER_CLASS_BUG_CATCHER, 3},\n    {TRAINER_CLASS_HIKER, 9},\n    {TRAINER_CLASS_BIRD_KEEPER, 6},\n    {TRAINER_CLASS_PICNICKER, 5},\n    {TRAINER_CLASS_SUPER_NERD, 6},\n    {TRAINER_CLASS_FISHERMAN, 9},\n    {TRAINER_CLASS_TEAM_ROCKET, 8},\n    {TRAINER_CLASS_LASS, 4},\n    {TRAINER_CLASS_BEAUTY, 18},\n    {TRAINER_CLASS_BLACK_BELT, 6},\n    {TRAINER_CLASS_CUE_BALL, 6},\n    {TRAINER_CLASS_CHANNELER, 8},\n    {TRAINER_CLASS_ROCKER, 6},\n    {TRAINER_CLASS_GENTLEMAN, 18},\n    {TRAINER_CLASS_BURGLAR, 22},\n    {TRAINER_CLASS_SWIMMER_M, 1},\n    {TRAINER_CLASS_ENGINEER, 12},\n    {TRAINER_CLASS_JUGGLER, 10},\n    {TRAINER_CLASS_SAILOR, 8},\n    {TRAINER_CLASS_COOLTRAINER, 9},\n    {TRAINER_CLASS_POKEMANIAC, 12},\n    {TRAINER_CLASS_TAMER, 10},\n    {TRAINER_CLASS_CAMPER, 5},\n    {TRAINER_CLASS_PSYCHIC, 5},\n    {TRAINER_CLASS_BIKER, 5},\n    {TRAINER_CLASS_GAMER, 18},\n    {TRAINER_CLASS_SCIENTIST, 12},\n    {TRAINER_CLASS_CRUSH_GIRL, 6},\n    {TRAINER_CLASS_TUBER, 1},\n    {TRAINER_CLASS_PKMN_BREEDER, 7},\n    {TRAINER_CLASS_PKMN_RANGER, 9},\n    {TRAINER_CLASS_AROMA_LADY, 7},\n    {TRAINER_CLASS_RUIN_MANIAC, 12},\n    {TRAINER_CLASS_LADY, 50},\n    {TRAINER_CLASS_PAINTER, 4},\n    {TRAINER_CLASS_TWINS, 3},\n    {TRAINER_CLASS_YOUNG_COUPLE, 7},\n    {TRAINER_CLASS_SIS_AND_BRO, 1},\n    {TRAINER_CLASS_COOL_COUPLE, 6},\n    {TRAINER_CLASS_CRUSH_KIN, 6},\n    {TRAINER_CLASS_SWIMMER_F, 1},\n    {TRAINER_CLASS_PLAYER, 1},\n    {TRAINER_CLASS_RS_LEADER, 25},\n    {TRAINER_CLASS_RS_ELITE_FOUR, 25},\n    {TRAINER_CLASS_RS_LASS, 4},\n    {TRAINER_CLASS_RS_YOUNGSTER, 4},\n    {TRAINER_CLASS_PKMN_TRAINER, 15},\n    {TRAINER_CLASS_RS_HIKER, 10},\n    {TRAINER_CLASS_RS_BEAUTY, 20},\n    {TRAINER_CLASS_RS_FISHERMAN, 10},\n    {TRAINER_CLASS_RS_LADY, 50},\n    {TRAINER_CLASS_TRIATHLETE, 10},\n    {TRAINER_CLASS_TEAM_AQUA, 5},\n    {TRAINER_CLASS_RS_TWINS, 3},\n    {TRAINER_CLASS_RS_SWIMMER_F, 2},\n    {TRAINER_CLASS_RS_BUG_CATCHER, 4},\n    {TRAINER_CLASS_SCHOOL_KID, 5},\n    {TRAINER_CLASS_RICH_BOY, 50},\n    {TRAINER_CLASS_SR_AND_JR, 4},\n    {TRAINER_CLASS_RS_BLACK_BELT, 8},\n    {TRAINER_CLASS_RS_TUBER_F, 1},\n    {TRAINER_CLASS_HEX_MANIAC, 6},\n    {TRAINER_CLASS_RS_PKMN_BREEDER, 10},\n    {TRAINER_CLASS_TEAM_MAGMA, 5},\n    {TRAINER_CLASS_INTERVIEWER, 12},\n    {TRAINER_CLASS_RS_TUBER_M, 1},\n    {TRAINER_CLASS_RS_YOUNG_COUPLE, 8},\n    {TRAINER_CLASS_GUITARIST, 8},\n    {TRAINER_CLASS_RS_GENTLEMAN, 20},\n    {TRAINER_CLASS_RS_CHAMPION, 50},\n    {TRAINER_CLASS_MAGMA_LEADER, 20},\n    {TRAINER_CLASS_BATTLE_GIRL, 6},\n    {TRAINER_CLASS_RS_SWIMMER_M, 2},\n    {TRAINER_CLASS_POKEFAN, 20},\n    {TRAINER_CLASS_EXPERT, 10},\n    {TRAINER_CLASS_DRAGON_TAMER, 12},\n    {TRAINER_CLASS_RS_BIRD_KEEPER, 8},\n    {TRAINER_CLASS_NINJA_BOY, 3},\n    {TRAINER_CLASS_PARASOL_LADY, 10},\n    {TRAINER_CLASS_BUG_MANIAC, 15},\n    {TRAINER_CLASS_RS_SAILOR, 8},\n    {TRAINER_CLASS_COLLECTOR, 15},\n    {TRAINER_CLASS_RS_PKMN_RANGER, 12},\n    {TRAINER_CLASS_MAGMA_ADMIN, 10},\n    {TRAINER_CLASS_RS_AROMA_LADY, 10},\n    {TRAINER_CLASS_RS_RUIN_MANIAC, 15},\n    {TRAINER_CLASS_RS_COOLTRAINER, 12},\n    {TRAINER_CLASS_RS_POKEMANIAC, 15},\n    {TRAINER_CLASS_KINDLER, 8},\n    {TRAINER_CLASS_RS_CAMPER, 4},\n    {TRAINER_CLASS_RS_PICNICKER, 4},\n    {TRAINER_CLASS_RS_PSYCHIC, 6},\n    {TRAINER_CLASS_RS_SIS_AND_BRO, 3},\n    {TRAINER_CLASS_OLD_COUPLE, 10},\n    {TRAINER_CLASS_AQUA_ADMIN, 10},\n    {TRAINER_CLASS_AQUA_LEADER, 20},\n    {TRAINER_CLASS_BOSS, 25},\n    { 0xFF, 5},\n};\n\n#include \"data/text/abilities.h\"\n\nstatic void (*const sTurnActionsFuncsTable[])(void) =\n{\n    [B_ACTION_USE_MOVE]               = HandleAction_UseMove,\n    [B_ACTION_USE_ITEM]               = HandleAction_UseItem,\n    [B_ACTION_SWITCH]                 = HandleAction_Switch,\n    [B_ACTION_RUN]                    = HandleAction_Run,\n    [B_ACTION_SAFARI_WATCH_CAREFULLY] = HandleAction_WatchesCarefully,\n    [B_ACTION_SAFARI_BALL]            = HandleAction_SafariZoneBallThrow,\n    [B_ACTION_SAFARI_BAIT]            = HandleAction_ThrowBait,\n    [B_ACTION_SAFARI_GO_NEAR]         = HandleAction_ThrowRock,\n    [B_ACTION_SAFARI_RUN]             = HandleAction_SafariZoneRun,\n    [B_ACTION_OLDMAN_THROW]           = HandleAction_OldManBallThrow,\n    [B_ACTION_EXEC_SCRIPT]            = HandleAction_RunBattleScript,\n    [B_ACTION_TRY_FINISH]             = HandleAction_TryFinish,\n    [B_ACTION_FINISHED]               = HandleAction_ActionFinished,\n    [B_ACTION_NOTHING_FAINTED]        = HandleAction_NothingIsFainted,\n};\n\nstatic void (*const sEndTurnFuncsTable[])(void) =\n{\n    [0]                           = HandleEndTurn_ContinueBattle,\n    [B_OUTCOME_WON]               = HandleEndTurn_BattleWon,\n    [B_OUTCOME_LOST]              = HandleEndTurn_BattleLost,\n    [B_OUTCOME_DREW]              = HandleEndTurn_BattleLost,\n    [B_OUTCOME_RAN]               = HandleEndTurn_RanFromBattle,\n    [B_OUTCOME_PLAYER_TELEPORTED] = HandleEndTurn_FinishBattle,\n    [B_OUTCOME_MON_FLED]          = HandleEndTurn_MonFled,\n    [B_OUTCOME_CAUGHT]            = HandleEndTurn_FinishBattle,\n    [B_OUTCOME_NO_SAFARI_BALLS]   = HandleEndTurn_FinishBattle,\n};\n\nconst u8 gStatusConditionString_PoisonJpn[] = _(\"どく$$$$$\");\nconst u8 gStatusConditionString_SleepJpn[] = _(\"ねむり$$$$\");\nconst u8 gStatusConditionString_ParalysisJpn[] = _(\"まひ$$$$$\");\nconst u8 gStatusConditionString_BurnJpn[] = _(\"やけど$$$$\");\nconst u8 gStatusConditionString_IceJpn[] = _(\"こおり$$$$\");\nconst u8 gStatusConditionString_ConfusionJpn[] = _(\"こんらん$$$\");\nconst u8 gStatusConditionString_LoveJpn[] = _(\"メロメロ$$$\");\n\nconst u8 *const gStatusConditionStringsTable[][2] =\n{\n    {gStatusConditionString_PoisonJpn, gText_Poison},\n    {gStatusConditionString_SleepJpn, gText_Sleep},\n    {gStatusConditionString_ParalysisJpn, gText_Paralysis},\n    {gStatusConditionString_BurnJpn, gText_Burn},\n    {gStatusConditionString_IceJpn, gText_Ice},\n    {gStatusConditionString_ConfusionJpn, gText_Confusion},\n    {gStatusConditionString_LoveJpn, gText_Love}\n};\n\nvoid CB2_InitBattle(void)\n{\n    MoveSaveBlocks_ResetHeap();\n    AllocateBattleResources();\n    AllocateBattleSpritesData();\n    AllocateMonSpritesGfx();\n    if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n    {\n        HandleLinkBattleSetup();\n        SetMainCallback2(CB2_PreInitMultiBattle);\n        gBattleCommunication[MULTIUSE_STATE] = 0;\n    }\n    else\n    {\n        CB2_InitBattleInternal();\n        if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n            {\n                if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n                    SetHelpContext(HELPCONTEXT_TRAINER_BATTLE_DOUBLE);\n                else\n                    SetHelpContext(HELPCONTEXT_TRAINER_BATTLE_SINGLE);\n            }\n            else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)\n            {\n                SetHelpContext(HELPCONTEXT_SAFARI_BATTLE);\n            }\n            else\n            {\n                SetHelpContext(HELPCONTEXT_WILD_BATTLE);\n            }\n        }\n    }\n}\n\nstatic void CB2_InitBattleInternal(void)\n{\n    s32 i;\n\n    SetHBlankCallback(NULL);\n    SetVBlankCallback(NULL);\n\n    CpuFill32(0, (void *)(VRAM), VRAM_SIZE);\n\n    SetGpuReg(REG_OFFSET_MOSAIC, 0);\n    SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH);\n    SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1));\n    SetGpuReg(REG_OFFSET_WININ, 0);\n    SetGpuReg(REG_OFFSET_WINOUT, 0);\n\n    gBattle_WIN0H = DISPLAY_WIDTH;\n    gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1);\n    ScanlineEffect_Clear();\n\n    for (i = 0; i < 80; ++i)\n    {\n        gScanlineEffectRegBuffers[0][i] = 0xF0;\n        gScanlineEffectRegBuffers[1][i] = 0xF0;\n    }\n    for (; i < 160; ++i)\n    {\n        gScanlineEffectRegBuffers[0][i] = 0xFF10;\n        gScanlineEffectRegBuffers[1][i] = 0xFF10;\n    }\n    ScanlineEffect_SetParams(sIntroScanlineParams16Bit);\n\n    ResetPaletteFade();\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    gBattle_BG2_X = 0;\n    gBattle_BG2_Y = 0;\n    gBattle_BG3_X = 0;\n    gBattle_BG3_Y = 0;\n\n    gBattleTerrain = BattleSetup_GetTerrainId();\n\n    InitBattleBgsVideo();\n    LoadBattleTextboxAndBackground();\n    ResetSpriteData();\n    ResetTasks();\n    DrawBattleEntryBackground();\n    FreeAllSpritePalettes();\n    gReservedSpritePaletteCount = 4;\n    SetVBlankCallback(VBlankCB_Battle);\n    SetUpBattleVars();\n\n    if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n        SetMainCallback2(CB2_HandleStartMultiBattle);\n    else\n        SetMainCallback2(CB2_HandleStartBattle);\n    if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))\n    {\n        CreateNPCTrainerParty(&gEnemyParty[0], gTrainerBattleOpponent_A);\n        SetWildMonHeldItem();\n    }\n\n    gMain.inBattle = TRUE;\n    for (i = 0; i < PARTY_SIZE; i++)\n        AdjustFriendship(&gPlayerParty[i], FRIENDSHIP_EVENT_LEAGUE_BATTLE);\n\n    gBattleCommunication[MULTIUSE_STATE] = 0;\n}\n\n#define BUFFER_PARTY_VS_SCREEN_STATUS(party, flags, i)                    \\\n    for ((i) = 0; (i) < PARTY_SIZE; (i)++)                                \\\n    {                                                                     \\\n        u16 species = GetMonData(&(party)[(i)], MON_DATA_SPECIES_OR_EGG); \\\n        u16 hp = GetMonData(&(party)[(i)], MON_DATA_HP);                  \\\n        u32 status = GetMonData(&(party)[(i)], MON_DATA_STATUS);          \\\n                                                                          \\\n        if (species == SPECIES_NONE)                                      \\\n            continue;                                                     \\\n                                                                          \\\n        /* Is healthy mon? */                                             \\\n        if (species != SPECIES_EGG && hp != 0 && status == 0)             \\\n            (flags) |= 1 << (i) * 2;                                      \\\n                                                                          \\\n        if (species == SPECIES_NONE) /* Redundant */                      \\\n            continue;                                                     \\\n                                                                          \\\n        /* Is Egg or statused? */                                         \\\n        if (hp != 0 && (species == SPECIES_EGG || status != 0))           \\\n            (flags) |= 2 << (i) * 2;                                      \\\n                                                                          \\\n        if (species == SPECIES_NONE) /* Redundant */                      \\\n            continue;                                                     \\\n                                                                          \\\n        /* Is fainted? */                                                 \\\n        if (species != SPECIES_EGG && hp == 0)                            \\\n            (flags) |= 3 << (i) * 2;                                      \\\n    }\n\n// For Vs Screen at link battle start\nstatic void BufferPartyVsScreenHealth_AtStart(void)\n{\n    u16 flags = 0;\n    s32 i;\n\n    BUFFER_PARTY_VS_SCREEN_STATUS(gPlayerParty, flags, i);\n    gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsLo = flags;\n    *(&gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi) = flags >> 8;\n}\n\nstatic void SetPlayerBerryDataInBattleStruct(void)\n{\n    s32 i;\n    struct BattleStruct *battleStruct = gBattleStruct;\n    struct BattleEnigmaBerry *battleBerry = &battleStruct->multiBuffer.linkBattlerHeader.battleEnigmaBerry;\n\n    if (IsEnigmaBerryValid() == TRUE)\n    {\n        for (i = 0; i < BERRY_NAME_LENGTH; i++)\n            battleBerry->name[i] = gSaveBlock1Ptr->enigmaBerry.berry.name[i];\n        battleBerry->name[i] = EOS;\n        for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; i++)\n            battleBerry->itemEffect[i] = gSaveBlock1Ptr->enigmaBerry.itemEffect[i];\n        battleBerry->holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;\n        battleBerry->holdEffectParam = gSaveBlock1Ptr->enigmaBerry.holdEffectParam;\n    }\n    else\n    {\n        const struct Berry *berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY));\n\n        for (i = 0; i < BERRY_NAME_LENGTH; i++)\n            battleBerry->name[i] = berryData->name[i];\n        battleBerry->name[i] = EOS;\n        for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; i++)\n            battleBerry->itemEffect[i] = 0;\n        battleBerry->holdEffect = HOLD_EFFECT_NONE;\n        battleBerry->holdEffectParam = 0;\n    }\n}\n\nstatic void SetAllPlayersBerryData(void)\n{\n    s32 i, j;\n\n    if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))\n    {\n        if (IsEnigmaBerryValid() == TRUE)\n        {\n            for (i = 0; i < BERRY_NAME_LENGTH; i++)\n            {\n                gEnigmaBerries[0].name[i] = gSaveBlock1Ptr->enigmaBerry.berry.name[i];\n                gEnigmaBerries[2].name[i] = gSaveBlock1Ptr->enigmaBerry.berry.name[i];\n            }\n            gEnigmaBerries[0].name[i] = EOS;\n            gEnigmaBerries[2].name[i] = EOS;\n\n            for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; i++)\n            {\n                gEnigmaBerries[0].itemEffect[i] = gSaveBlock1Ptr->enigmaBerry.itemEffect[i];\n                gEnigmaBerries[2].itemEffect[i] = gSaveBlock1Ptr->enigmaBerry.itemEffect[i];\n            }\n\n            gEnigmaBerries[0].holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;\n            gEnigmaBerries[2].holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;\n            gEnigmaBerries[0].holdEffectParam = gSaveBlock1Ptr->enigmaBerry.holdEffectParam;\n            gEnigmaBerries[2].holdEffectParam = gSaveBlock1Ptr->enigmaBerry.holdEffectParam;\n        }\n        else\n        {\n            const struct Berry *berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY));\n\n            for (i = 0; i < BERRY_NAME_LENGTH; i++)\n            {\n                gEnigmaBerries[0].name[i] = berryData->name[i];\n                gEnigmaBerries[2].name[i] = berryData->name[i];\n            }\n            gEnigmaBerries[0].name[i] = EOS;\n            gEnigmaBerries[2].name[i] = EOS;\n\n            for (i = 0; i < BERRY_ITEM_EFFECT_COUNT; i++)\n            {\n                gEnigmaBerries[0].itemEffect[i] = 0;\n                gEnigmaBerries[2].itemEffect[i] = 0;\n            }\n\n            gEnigmaBerries[0].holdEffect = HOLD_EFFECT_NONE;\n            gEnigmaBerries[2].holdEffect = HOLD_EFFECT_NONE;\n            gEnigmaBerries[0].holdEffectParam = 0;\n            gEnigmaBerries[2].holdEffectParam = 0;\n        }\n    }\n    else\n    {\n        s32 numPlayers;\n        struct BattleEnigmaBerry *src;\n        u8 battlerId;\n\n        if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n        {\n            for (i = 0; i < 4; i++)\n            {\n                src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2);\n                battlerId = gLinkPlayers[i].id;\n                for (j = 0; j < BERRY_NAME_LENGTH; j++)\n                    gEnigmaBerries[battlerId].name[j] = src->name[j];\n                gEnigmaBerries[battlerId].name[j] = EOS;\n                for (j = 0; j < BERRY_ITEM_EFFECT_COUNT; j++)\n                    gEnigmaBerries[battlerId].itemEffect[j] = src->itemEffect[j];\n                gEnigmaBerries[battlerId].holdEffect = src->holdEffect;\n                gEnigmaBerries[battlerId].holdEffectParam = src->holdEffectParam;\n            }\n        }\n        else\n        {\n            for (i = 0; i < 2; i++)\n            {\n                src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2);\n                for (j = 0; j < BERRY_NAME_LENGTH; j++)\n                {\n                    gEnigmaBerries[i].name[j] = src->name[j];\n                    gEnigmaBerries[i + 2].name[j] = src->name[j];\n                }\n                gEnigmaBerries[i].name[j] = EOS;\n                gEnigmaBerries[i + 2].name[j] = EOS;\n                for (j = 0; j < BERRY_ITEM_EFFECT_COUNT; j++)\n                {\n                    gEnigmaBerries[i].itemEffect[j] = src->itemEffect[j];\n                    gEnigmaBerries[i + 2].itemEffect[j] = src->itemEffect[j];\n                }\n                gEnigmaBerries[i].holdEffect = src->holdEffect;\n                gEnigmaBerries[i + 2].holdEffect = src->holdEffect;\n                gEnigmaBerries[i].holdEffectParam = src->holdEffectParam;\n                gEnigmaBerries[i + 2].holdEffectParam = src->holdEffectParam;\n            }\n        }\n    }\n}\n\nstatic void LinkBattleComputeBattleTypeFlags(u8 numPlayers, u8 multiPlayerId)\n{\n    u8 found = 0;\n\n    // If player 1 is playing the minimum version, player 1 is master.\n    if (gBlockRecvBuffer[0][0] == 0x100)\n    {\n        if (multiPlayerId == 0)\n            gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER;\n        else\n            gBattleTypeFlags |= BATTLE_TYPE_TRAINER;\n        found++;\n    }\n    if (found == 0)\n    {\n        // If multiple different versions are being used, player 1 is master.\n        s32 i;\n\n        for (i = 0; i < numPlayers; i++)\n            if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0])\n                break;\n        if (i == numPlayers)\n        {\n            if (multiPlayerId == 0)\n                gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER;\n            else\n                gBattleTypeFlags |= BATTLE_TYPE_TRAINER;\n            found++;\n        }\n        if (found == 0)\n        {\n            // Lowest index player with the highest game version is master.\n            for (i = 0; i < numPlayers; i++)\n            {\n                if (gBlockRecvBuffer[i][0] == 0x201 && i != multiPlayerId)\n                    if (i < multiPlayerId)\n                        break;\n                if (gBlockRecvBuffer[i][0] > 0x201 && i != multiPlayerId)\n                    break;\n            }\n            if (i == numPlayers)\n                gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER;\n            else\n                gBattleTypeFlags |= BATTLE_TYPE_TRAINER;\n        }\n    }\n}\n\nstatic void CB2_HandleStartBattle(void)\n{\n    u8 playerMultiplayerId;\n    u8 enemyMultiplayerId;\n\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    playerMultiplayerId = GetMultiplayerId();\n    gBattleStruct->multiplayerId = playerMultiplayerId;\n    enemyMultiplayerId = playerMultiplayerId ^ BIT_SIDE;\n    switch (gBattleCommunication[MULTIUSE_STATE])\n    {\n    case 0:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            ShowBg(0);\n            ShowBg(1);\n            ShowBg(2);\n            ShowBg(3);\n            BattleInterfaceSetWindowPals();\n            gBattleCommunication[MULTIUSE_STATE] = 1;\n        }\n        if (gWirelessCommType)\n            LoadWirelessStatusIndicatorSpriteGfx();\n        break;\n    case 1:\n        if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n        {\n            if (gReceivedRemoteLinkPlayers)\n            {\n                if (IsLinkTaskFinished())\n                {\n                    // 0x201\n                    *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 1;\n                    *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 2;\n                    BufferPartyVsScreenHealth_AtStart();\n                    SetPlayerBerryDataInBattleStruct();\n                    SendBlock(BitmaskAllOtherLinkPlayers(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader));\n                    gBattleCommunication[MULTIUSE_STATE] = 2;\n                }\n                if (gWirelessCommType != 0)\n                    CreateWirelessStatusIndicatorSprite(0, 0);\n            }\n        }\n        else\n        {\n            gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER;\n            gBattleCommunication[MULTIUSE_STATE] = 15;\n            SetAllPlayersBerryData();\n        }\n        break;\n    case 2:\n        if ((GetBlockReceivedStatus() & 3) == 3)\n        {\n            u8 taskId;\n\n            ResetBlockReceivedFlags();\n            LinkBattleComputeBattleTypeFlags(2, playerMultiplayerId);\n            SetAllPlayersBerryData();\n            taskId = CreateTask(InitLinkBattleVsScreen, 0);\n            gTasks[taskId].data[1] = 270;\n            gTasks[taskId].data[2] = 90;\n            gTasks[taskId].data[5] = 0;\n            gTasks[taskId].data[3] = gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsLo | (gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi << 8);\n            gTasks[taskId].data[4] = gBlockRecvBuffer[enemyMultiplayerId][1];\n            SetDeoxysStats();\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 3:\n        if (IsLinkTaskFinished())\n        {\n            SendBlock(BitmaskAllOtherLinkPlayers(), gPlayerParty, sizeof(struct Pokemon) * 2);\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 4:\n        if ((GetBlockReceivedStatus() & 3) == 3)\n        {\n            ResetBlockReceivedFlags();\n            memcpy(gEnemyParty, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2);\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 7:\n        if (IsLinkTaskFinished())\n        {\n            SendBlock(BitmaskAllOtherLinkPlayers(), gPlayerParty + 2, sizeof(struct Pokemon) * 2);\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 8:\n        if ((GetBlockReceivedStatus() & 3) == 3)\n        {\n            ResetBlockReceivedFlags();\n            memcpy(gEnemyParty + 2, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2);\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 11:\n        if (IsLinkTaskFinished())\n        {\n            SendBlock(BitmaskAllOtherLinkPlayers(), gPlayerParty + 4, sizeof(struct Pokemon) * 2);\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 12:\n        if ((GetBlockReceivedStatus() & 3) == 3)\n        {\n            ResetBlockReceivedFlags();\n            memcpy(gEnemyParty + 4, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2);\n            TryCorrectShedinjaLanguage(&gEnemyParty[0]);\n            TryCorrectShedinjaLanguage(&gEnemyParty[1]);\n            TryCorrectShedinjaLanguage(&gEnemyParty[2]);\n            TryCorrectShedinjaLanguage(&gEnemyParty[3]);\n            TryCorrectShedinjaLanguage(&gEnemyParty[4]);\n            TryCorrectShedinjaLanguage(&gEnemyParty[5]);\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 15:\n        InitBattleControllers();\n        gBattleCommunication[MULTIUSE_STATE]++;\n        gBattleCommunication[SPRITES_INIT_STATE1] = 0;\n        gBattleCommunication[SPRITES_INIT_STATE2] = 0;\n        break;\n    case 16:\n        if (BattleInitAllSprites(&gBattleCommunication[SPRITES_INIT_STATE1], &gBattleCommunication[SPRITES_INIT_STATE2]))\n        {\n            gPreBattleCallback1 = gMain.callback1;\n            gMain.callback1 = BattleMainCB1;\n            SetMainCallback2(BattleMainCB2);\n            if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n            {\n                gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE;\n            }\n        }\n        break;\n    case 5:\n    case 9:\n    case 13:\n        gBattleCommunication[MULTIUSE_STATE]++;\n        gBattleCommunication[1] = 1;\n    case 6:\n    case 10:\n    case 14:\n        if (--gBattleCommunication[1] == 0)\n            gBattleCommunication[MULTIUSE_STATE]++;\n        break;\n    }\n}\n\nstatic void PrepareOwnMultiPartnerBuffer(void)\n{\n    s32 i, j;\n    u8 *nick, *cur;\n\n    for (i = 0; i < 3; i++)\n    {\n        gMultiPartnerParty[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES);\n        gMultiPartnerParty[i].heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);\n        nick = gMultiPartnerParty[i].nickname;\n        GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nick);\n        gMultiPartnerParty[i].level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);\n        gMultiPartnerParty[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);\n        gMultiPartnerParty[i].maxhp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);\n        gMultiPartnerParty[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);\n        gMultiPartnerParty[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);\n        gMultiPartnerParty[i].gender = GetMonGender(&gPlayerParty[i]);\n        StripExtCtrlCodes(nick);\n        if (GetMonData(&gPlayerParty[i], MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE)\n        {\n            for (cur = nick, j = 0; cur[j] != EOS; j++)\n                ;\n            while (j < 6)\n                cur[j++] = 0;\n            cur[j] = EOS;\n        }\n    }\n    memcpy(gBattleStruct->multiBuffer.multiBattleMons, gMultiPartnerParty, sizeof(gMultiPartnerParty));\n}\n\nstatic void CB2_PreInitMultiBattle(void)\n{\n    s32 i;\n    u8 playerMultiplierId;\n    u8 r4 = 0xF;\n    u16 *savedBattleTypeFlags;\n    void (**savedCallback)(void);\n\n    playerMultiplierId = GetMultiplayerId();\n    gBattleStruct->multiplayerId = playerMultiplierId;\n    savedCallback = &gBattleStruct->savedCallback;\n    savedBattleTypeFlags = &gBattleStruct->savedBattleTypeFlags;\n\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    switch (gBattleCommunication[MULTIUSE_STATE])\n    {\n    case 0:\n        if (gReceivedRemoteLinkPlayers && IsLinkTaskFinished())\n        {\n            PrepareOwnMultiPartnerBuffer();\n            SendBlock(BitmaskAllOtherLinkPlayers(), gBattleStruct->multiBuffer.multiBattleMons, sizeof(gBattleStruct->multiBuffer.multiBattleMons));\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 1:\n        if ((GetBlockReceivedStatus() & r4) == r4)\n        {\n            ResetBlockReceivedFlags();\n            for (i = 0; i < 4; i++)\n            {\n                if (i == playerMultiplierId)\n                    continue;\n                if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[playerMultiplierId].id & 1))\n                 || (gLinkPlayers[i].id & 1 && gLinkPlayers[playerMultiplierId].id & 1))\n                    memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], sizeof(gMultiPartnerParty));\n            }\n            gBattleCommunication[MULTIUSE_STATE]++;\n            *savedCallback = gMain.savedCallback;\n            *savedBattleTypeFlags = gBattleTypeFlags;\n            gMain.savedCallback = CB2_PreInitMultiBattle;\n            ShowPartyMenuToShowcaseMultiBattleParty();\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            gBattleCommunication[MULTIUSE_STATE]++;\n            if (gWirelessCommType)\n                SetLinkStandbyCallback();\n            else\n                SetCloseLinkCallback();\n        }\n        break;\n    case 3:\n        if (gWirelessCommType)\n        {\n            if (IsLinkRfuTaskFinished())\n            {\n                gBattleTypeFlags = *savedBattleTypeFlags;\n                gMain.savedCallback = *savedCallback;\n                SetMainCallback2(CB2_InitBattleInternal);\n            }\n        }\n        else if (!gReceivedRemoteLinkPlayers)\n        {\n            gBattleTypeFlags = *savedBattleTypeFlags;\n            gMain.savedCallback = *savedCallback;\n            SetMainCallback2(CB2_InitBattleInternal);\n        }\n        break;\n    }\n}\n\nstatic void CB2_HandleStartMultiBattle(void)\n{\n    u8 playerMultiplayerId;\n    s32 id;\n    u8 taskId;\n\n    playerMultiplayerId = GetMultiplayerId();\n    gBattleStruct->multiplayerId = playerMultiplayerId;\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    switch (gBattleCommunication[MULTIUSE_STATE])\n    {\n    case 0:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            ShowBg(0);\n            ShowBg(1);\n            ShowBg(2);\n            ShowBg(3);\n            BattleInterfaceSetWindowPals();\n            gBattleCommunication[MULTIUSE_STATE] = 1;\n        }\n        if (gWirelessCommType)\n            LoadWirelessStatusIndicatorSpriteGfx();\n        break;\n    case 1:\n        if (gReceivedRemoteLinkPlayers)\n        {\n            if (IsLinkTaskFinished())\n            {\n                // 0x201\n                *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 1;\n                *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 2;\n                BufferPartyVsScreenHealth_AtStart();\n                SetPlayerBerryDataInBattleStruct();\n                SendBlock(BitmaskAllOtherLinkPlayers(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader));\n                gBattleCommunication[MULTIUSE_STATE]++;\n            }\n            if (gWirelessCommType)\n                CreateWirelessStatusIndicatorSprite(0, 0);\n        }\n        break;\n    case 2:\n        if ((GetBlockReceivedStatus() & 0xF) == 0xF)\n        {\n            ResetBlockReceivedFlags();\n            LinkBattleComputeBattleTypeFlags(4, playerMultiplayerId);\n            SetAllPlayersBerryData();\n            SetDeoxysStats();\n            memcpy(gDecompressionBuffer, gPlayerParty, sizeof(struct Pokemon) * 3);\n            taskId = CreateTask(InitLinkBattleVsScreen, 0);\n            gTasks[taskId].data[1] = 270;\n            gTasks[taskId].data[2] = 90;\n            gTasks[taskId].data[5] = 0;\n            gTasks[taskId].data[3] = 0;\n            gTasks[taskId].data[4] = 0;\n            for (id = 0; id < MAX_LINK_PLAYERS; ++id)\n            {\n                switch (gLinkPlayers[id].id)\n                {\n                case 0:\n                    gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F;\n                    break;\n                case 1:\n                    gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F;\n                    break;\n                case 2:\n                    gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6;\n                    break;\n                case 3:\n                    gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6;\n                    break;\n                }\n            }\n            ZeroPlayerPartyMons();\n            ZeroEnemyPartyMons();\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        else\n        {\n            break;\n        }\n        // fall through\n    case 3:\n        if (IsLinkTaskFinished())\n        {\n            SendBlock(BitmaskAllOtherLinkPlayers(), gDecompressionBuffer, sizeof(struct Pokemon) * 2);\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 4:\n        if ((GetBlockReceivedStatus() & 0xF) == 0xF)\n        {\n            ResetBlockReceivedFlags();\n            for (id = 0; id < MAX_LINK_PLAYERS; ++id)\n            {\n                if (id == playerMultiplayerId)\n                {\n                    switch (gLinkPlayers[id].id)\n                    {\n                    case 0:\n                    case 3:\n                        memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);\n                        break;\n                    case 1:\n                    case 2:\n                        memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);\n                        break;\n                    }\n                }\n                else\n                {\n                    if ((!(gLinkPlayers[id].id & 1) && !(gLinkPlayers[playerMultiplayerId].id & 1))\n                     || ((gLinkPlayers[id].id & 1) && (gLinkPlayers[playerMultiplayerId].id & 1)))\n                    {\n                        switch (gLinkPlayers[id].id)\n                        {\n                        case 0:\n                        case 3:\n                            memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);\n                            break;\n                        case 1:\n                        case 2:\n                            memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);\n                            break;\n                        }\n                    }\n                    else\n                    {\n                        switch (gLinkPlayers[id].id)\n                        {\n                        case 0:\n                        case 3:\n                            memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);\n                            break;\n                        case 1:\n                        case 2:\n                            memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);\n                            break;\n                        }\n                    }\n                }\n            }\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 7:\n        if (IsLinkTaskFinished())\n        {\n            SendBlock(BitmaskAllOtherLinkPlayers(), gDecompressionBuffer + sizeof(struct Pokemon) * 2, sizeof(struct Pokemon));\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 8:\n        if ((GetBlockReceivedStatus() & 0xF) == 0xF)\n        {\n            ResetBlockReceivedFlags();\n            for (id = 0; id < MAX_LINK_PLAYERS; ++id)\n            {\n                if (id == playerMultiplayerId)\n                {\n                    switch (gLinkPlayers[id].id)\n                    {\n                    case 0:\n                    case 3:\n                        memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));\n                        break;\n                    case 1:\n                    case 2:\n                        memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));\n                        break;\n                    }\n                }\n                else\n                {\n                    if ((!(gLinkPlayers[id].id & 1) && !(gLinkPlayers[playerMultiplayerId].id & 1))\n                     || ((gLinkPlayers[id].id & 1) && (gLinkPlayers[playerMultiplayerId].id & 1)))\n                    {\n                        switch (gLinkPlayers[id].id)\n                        {\n                        case 0:\n                        case 3:\n                            memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));\n                            break;\n                        case 1:\n                        case 2:\n                            memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));\n                            break;\n                        }\n                    }\n                    else\n                    {\n                        switch (gLinkPlayers[id].id)\n                        {\n                        case 0:\n                        case 3:\n                            memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));\n                            break;\n                        case 1:\n                        case 2:\n                            memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));\n                            break;\n                        }\n                    }\n                }\n            }\n            TryCorrectShedinjaLanguage(&gPlayerParty[0]);\n            TryCorrectShedinjaLanguage(&gPlayerParty[1]);\n            TryCorrectShedinjaLanguage(&gPlayerParty[2]);\n            TryCorrectShedinjaLanguage(&gPlayerParty[3]);\n            TryCorrectShedinjaLanguage(&gPlayerParty[4]);\n            TryCorrectShedinjaLanguage(&gPlayerParty[5]);\n            TryCorrectShedinjaLanguage(&gEnemyParty[0]);\n            TryCorrectShedinjaLanguage(&gEnemyParty[1]);\n            TryCorrectShedinjaLanguage(&gEnemyParty[2]);\n            TryCorrectShedinjaLanguage(&gEnemyParty[3]);\n            TryCorrectShedinjaLanguage(&gEnemyParty[4]);\n            TryCorrectShedinjaLanguage(&gEnemyParty[5]);\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 11:\n        InitBattleControllers();\n        gBattleCommunication[MULTIUSE_STATE]++;\n        gBattleCommunication[SPRITES_INIT_STATE1] = 0;\n        gBattleCommunication[SPRITES_INIT_STATE2] = 0;\n        break;\n    case 12:\n        if (BattleInitAllSprites(&gBattleCommunication[SPRITES_INIT_STATE1], &gBattleCommunication[SPRITES_INIT_STATE2]))\n        {\n            gPreBattleCallback1 = gMain.callback1;\n            gMain.callback1 = BattleMainCB1;\n            SetMainCallback2(BattleMainCB2);\n            if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n                gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE;\n        }\n        break;\n    case 5:\n    case 9:\n        ++gBattleCommunication[0];\n        gBattleCommunication[SPRITES_INIT_STATE1] = 1;\n        // fall through\n    case 6:\n    case 10:\n        if (--gBattleCommunication[SPRITES_INIT_STATE1] == 0)\n            ++gBattleCommunication[0];\n        break;\n    }\n}\n\nvoid BattleMainCB2(void)\n{\n    AnimateSprites();\n    BuildOamBuffer();\n    RunTextPrinters();\n    UpdatePaletteFade();\n    RunTasks();\n\n    if (JOY_HELD(B_BUTTON) && gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)\n    {\n        gSpecialVar_Result = gBattleOutcome = B_OUTCOME_DREW;\n        ResetPaletteFadeControl();\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        SetMainCallback2(CB2_QuitPokedudeBattle);\n    }\n}\n\nvoid FreeRestoreBattleData(void)\n{\n    gMain.callback1 = gPreBattleCallback1;\n    gScanlineEffect.state = 3;\n    gMain.inBattle = FALSE;\n    ZeroEnemyPartyMons();\n    m4aSongNumStop(SE_LOW_HEALTH);\n    FreeMonSpritesGfx();\n    FreeBattleSpritesData();\n    FreeBattleResources();\n}\n\nstatic void CB2_QuitPokedudeBattle(void)\n{\n    UpdatePaletteFade();\n    if (!gPaletteFade.active)\n    {\n        FreeRestoreBattleData();\n        FreeAllWindowBuffers();\n        SetMainCallback2(gMain.savedCallback);\n    }\n}\n\nstatic void SpriteCB_UnusedDebugSprite(struct Sprite *sprite)\n{\n    sprite->data[0] = 0;\n    sprite->callback = SpriteCB_UnusedDebugSprite_Step;\n}\n\nstatic void SpriteCB_UnusedDebugSprite_Step(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sUnknownDebugSpriteDataBuffer = AllocZeroed(0x1000);\n        ++sprite->data[0];\n        sprite->data[1] = 0;\n        sprite->data[2] = 0x281;\n        sprite->data[3] = 0;\n        sprite->data[4] = 1;\n        // fall through\n    case 1:\n        if (--sprite->data[4] == 0)\n        {\n            s32 i, r2, r0;\n\n            sprite->data[4] = 2;\n            r2 = sprite->data[1] + sprite->data[3] * 32;\n            r0 = sprite->data[2] - sprite->data[3] * 32;\n            for (i = 0; i <= 29; i += 2)\n            {\n                *(&sUnknownDebugSpriteDataBuffer[r2] + i) = 0x3D;\n                *(&sUnknownDebugSpriteDataBuffer[r0] + i) = 0x3D;\n            }\n            if (++sprite->data[3] == 21)\n            {\n                ++sprite->data[0];\n                sprite->data[1] = 32;\n            }\n        }\n        break;\n    case 2:\n        if (--sprite->data[1] == 20)\n        {\n            if (sUnknownDebugSpriteDataBuffer != NULL)\n            {\n                memset(sUnknownDebugSpriteDataBuffer, 0, 0x1000);\n                FREE_AND_SET_NULL(sUnknownDebugSpriteDataBuffer);\n            }\n            SetMainCallback2(CB2_InitBattle);\n        }\n        break;\n    }\n}\n\nstatic u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum)\n{\n    u32 nameHash = 0;\n    u32 personalityValue;\n    u8 fixedIV;\n    s32 i, j;\n    s8 levelScaling = GetScaledLevel();\n    u8 ivCalcMode = gSaveBlock1Ptr->keyFlags.ivCalcMode;\n    struct Trainer* sTrainers;\n    bool8 inBattleHouse = FALSE;\n    u8 level;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    if(gMapHeader.mapLayoutId == LAYOUT_SEVEN_ISLAND_HOUSE_ROOM2)\n        inBattleHouse = TRUE;\n\n    if(trainerNum >= TRAINER_RIVAL_ROUTE22_LATE_SQUIRTLE && trainerNum <= TRAINER_RIVAL_ROUTE22_LATE_CHARMANDER)\n    {   //adjust level scaling for penultimate Rival battle\n        if(levelScaling < 0)\n        {   //Easy Mode\n            levelScaling -= 3;\n        }\n        if(levelScaling > 0)\n        {   //Challenge Mode\n            levelScaling += 3;\n        }\n    }\n    if((trainerNum >= TRAINER_ELITE_FOUR_LORELEI_2 && trainerNum <= TRAINER_CHAMPION_REMATCH_CHARMANDER) \n        || (trainerNum >= TRAINER_ELITE_FOUR_LORELEI_CHALLENGE_2 && trainerNum <= TRAINER_CHAMPION_REMATCH_CHARMANDER_CHALLENGE))\n    {   //adjust level scaling for E4 and Champ rematches\n        if(levelScaling < 0)\n        {   //Easy Mode\n            levelScaling -= 5;\n        }\n        if(levelScaling > 0)\n        {   //Challenge Mode\n            levelScaling += 5;\n        }\n    }\n    if (trainerNum == TRAINER_SECRET_BASE)\n        return 0;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_TRAINER\n     && !(gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER_TOWER)))\n    {\n        ZeroEnemyPartyMons();\n        for (i = 0; i < sTrainers[trainerNum].partySize; i++)\n        {\n\n            if (sTrainers[trainerNum].doubleBattle == TRUE)\n                personalityValue = 0x80;\n            else if (sTrainers[trainerNum].encounterMusic_gender & F_TRAINER_FEMALE)\n                personalityValue = 0x78; // Use personality more likely to result in a female Pokémon\n            else\n                personalityValue = 0x88; // Use personality more likely to result in a male Pokémon\n            for (j = 0; sTrainers[trainerNum].trainerName[j] != EOS; j++)\n                nameHash += sTrainers[trainerNum].trainerName[j];\n            switch (sTrainers[trainerNum].partyFlags)\n            {\n                case 0:\n                {\n                    const struct TrainerMonNoItemDefaultMoves *partyData = sTrainers[trainerNum].party.NoItemDefaultMoves;\n\n                    for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j)\n                        nameHash += gSpeciesNames[partyData[i].species][j];\n                    personalityValue += nameHash << 8;\n                    if(ivCalcMode == IV_CALC_PERFECT)\n                        fixedIV = MAX_PER_STAT_IVS;\n                    else\n                        fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;\n                    CreateMon(&party[i], partyData[i].species, partyData[i].lvl + levelScaling, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);\n                    break;\n                }\n                case F_TRAINER_PARTY_CUSTOM_MOVESET:\n                {\n                    const struct TrainerMonNoItemCustomMoves *partyData = sTrainers[trainerNum].party.NoItemCustomMoves;\n\n                    for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j)\n                        nameHash += gSpeciesNames[partyData[i].species][j];\n                    personalityValue += nameHash << 8;\n                    if(ivCalcMode == IV_CALC_PERFECT)\n                        fixedIV = MAX_PER_STAT_IVS;\n                    else\n                        fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;\n                    CreateMon(&party[i], partyData[i].species, partyData[i].lvl + levelScaling, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);\n                    for (j = 0; j < MAX_MON_MOVES; ++j)\n                    {\n                        SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]);\n                        SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);\n                    }\n                    break;\n                }\n                case F_TRAINER_PARTY_HELD_ITEM:\n                {\n                    const struct TrainerMonItemDefaultMoves *partyData = sTrainers[trainerNum].party.ItemDefaultMoves;\n\n                    for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j)\n                        nameHash += gSpeciesNames[partyData[i].species][j];\n                    personalityValue += nameHash << 8;\n                    if(ivCalcMode == IV_CALC_PERFECT)\n                        fixedIV = MAX_PER_STAT_IVS;\n                    else\n                        fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;\n                    CreateMon(&party[i], partyData[i].species, partyData[i].lvl + levelScaling, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);\n\n                    SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);\n                    break;\n                }\n                case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM:\n                {\n                    const struct TrainerMonItemCustomMoves *partyData = sTrainers[trainerNum].party.ItemCustomMoves;\n\n                    for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j)\n                        nameHash += gSpeciesNames[partyData[i].species][j];\n                    personalityValue += ((nameHash << 8) - partyData[i].abilityNum);\n                    if(ivCalcMode == IV_CALC_PERFECT)\n                        fixedIV = MAX_PER_STAT_IVS;\n                    if((trainerNum == TRAINER_LEADER_LT_SURGE_CHALLENGE || TRAINER_CHAMPION_FIRST_SQUIRTLE_CHALLENGE) &&  i == 3) //preserving Hidden Power IVs\n                        fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;\n                    else if(trainerNum == TRAINER_CHAMPION_FIRST_BULBASAUR_CHALLENGE && i == 4) //preserving Hidden Power IVs\n                        fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;\n                    else if(ivCalcMode != IV_CALC_PERFECT)\n                        fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;\n                    if(inBattleHouse)\n                    {\n                        level = partyData[i].lvl + ReturnBattleHouseLevel();\n                        if(level > 75)\n                            level = 75;\n                        CreateMon(&party[i], partyData[i].species, level + levelScaling, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);\n                    }\n                    else\n                        CreateMon(&party[i], partyData[i].species, partyData[i].lvl + levelScaling, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);\n                    SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);\n                    for (j = 0; j < MAX_MON_MOVES; ++j)\n                    {\n                        SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]);\n                        SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);\n                    }\n                    break;\n                }\n                case F_TRAINER_PARTY_EVS:\n                {\n                    const struct TrainerMonItemCustomMovesEVs *partyData = sTrainers[trainerNum].party.ItemCustomMovesEVs;\n                    u8 gender;\n                    u8 friendship = 255;\n\n                    for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; ++j)\n                        nameHash += gSpeciesNames[partyData[i].species][j];\n                    if (sTrainers[trainerNum].encounterMusic_gender & 0x80)\n                        gender = MON_FEMALE;\n                    else\n                        gender = MON_MALE;\n                    if(ivCalcMode == IV_CALC_PERFECT)\n                        fixedIV = MAX_PER_STAT_IVS;\n                    else\n                        fixedIV = partyData[i].iv;\n                    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE) || inBattleHouse)\n                        fixedIV = partyData[i].iv;\n                    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n                        CreateMonWithGenderNatureAbility(&party[i], partyData[i].species, GetMonData(&gPlayerParty[0], MON_DATA_LEVEL, NULL), fixedIV, gender, partyData[i].nature, partyData[i].abilityNum);\n                    else if(inBattleHouse)\n                    {\n                        level = partyData[i].lvl + ReturnBattleHouseLevel();\n                        if(level > 75)\n                            level = 75;\n                        CreateMonWithGenderNatureAbility(&party[i], partyData[i].species, level + levelScaling, fixedIV, gender, partyData[i].nature, partyData[i].abilityNum);\n                    }\n                    else\n                    {\n                        if(gMapHeader.mapLayoutId == LAYOUT_PALLET_TOWN_PROFESSOR_OAKS_LAB)\n                        {   //special casing superboss battle with Oak\n                            if(gSaveBlock1Ptr->keyFlags.difficulty == DIFFICULTY_CHALLENGE)\n                                levelScaling = 5;\n                            else if(gSaveBlock1Ptr->keyFlags.difficulty == DIFFICULTY_EASY)\n                                levelScaling = -5;\n                            else\n                                levelScaling = 0;\n                        }\n                        CreateMonWithGenderNatureAbility(&party[i], partyData[i].species, partyData[i].lvl + levelScaling, fixedIV, gender, partyData[i].nature, partyData[i].abilityNum);\n                    }\n                    SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);\n                    for (j = 0; j < MAX_MON_MOVES; ++j)\n                    {\n                        SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]);\n                        SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);\n                    }\n                    for (j = 0; j < NUM_STATS; j++)\n                    {\n                        SetMonData(&party[i], MON_DATA_HP_EV + j, &partyData[i].evs[j]);\n                    }\n                    SetMonData(&party[i], MON_DATA_FRIENDSHIP, &friendship);\n                    CalculateMonStats(&party[i], FALSE);\n                    break;\n                }\n            }\n        }\n        gBattleTypeFlags |= sTrainers[trainerNum].doubleBattle;\n    }\n\n    return sTrainers[trainerNum].partySize;\n}\n\n// Unused\nstatic void HBlankCB_Battle(void)\n{\n    if (REG_VCOUNT < DISPLAY_HEIGHT && REG_VCOUNT >= 111)\n        REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x512;\n}\n\nvoid VBlankCB_Battle(void)\n{\n    // Change gRngSeed every vblank.\n    Random();\n\n    SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X);\n    SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y);\n    SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);\n    SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);\n    SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X);\n    SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y);\n    SetGpuReg(REG_OFFSET_BG3HOFS, gBattle_BG3_X);\n    SetGpuReg(REG_OFFSET_BG3VOFS, gBattle_BG3_Y);\n    SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H);\n    SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V);\n    SetGpuReg(REG_OFFSET_WIN1H, gBattle_WIN1H);\n    SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN1V);\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n    ScanlineEffect_InitHBlankDmaTransfer();\n}\n\nvoid SpriteCB_VsLetterDummy(struct Sprite *sprite)\n{\n\n}\n\nstatic void SpriteCB_VsLetter(struct Sprite *sprite)\n{\n    if (sprite->data[0] != 0)\n        sprite->x = sprite->data[1] + ((sprite->data[2] & 0xFF00) >> 8);\n    else\n        sprite->x = sprite->data[1] - ((sprite->data[2] & 0xFF00) >> 8);\n\n    sprite->data[2] += 0x180;\n\n    if (sprite->affineAnimEnded)\n    {\n        FreeSpriteTilesByTag(ANIM_SPRITES_START);\n        FreeSpritePaletteByTag(ANIM_SPRITES_START);\n        FreeSpriteOamMatrix(sprite);\n        DestroySprite(sprite);\n    }\n}\n\nvoid SpriteCB_VsLetterInit(struct Sprite *sprite)\n{\n    StartSpriteAffineAnim(sprite, 1);\n    sprite->callback = SpriteCB_VsLetter;\n    PlaySE(SE_MUGSHOT);\n}\n\nstatic void BufferPartyVsScreenHealth_AtEnd(u8 taskId)\n{\n    struct Pokemon *party1 = NULL;\n    struct Pokemon *party2 = NULL;\n    u8 multiplayerId = gBattleStruct->multiplayerId;\n    u32 flags;\n    s32 i;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n    {\n        switch (gLinkPlayers[multiplayerId].id)\n        {\n        case 0:\n        case 2:\n            party1 = gPlayerParty;\n            party2 = gEnemyParty;\n            break;\n        case 1:\n        case 3:\n            party1 = gEnemyParty;\n            party2 = gPlayerParty;\n            break;\n        }\n    }\n    else\n    {\n        party1 = gPlayerParty;\n        party2 = gEnemyParty;\n    }\n\n    flags = 0;\n    BUFFER_PARTY_VS_SCREEN_STATUS(party1, flags, i);\n    gTasks[taskId].data[3] = flags;\n\n    flags = 0;\n    BUFFER_PARTY_VS_SCREEN_STATUS(party2, flags, i);\n    gTasks[taskId].data[4] = flags;\n}\n\nvoid CB2_InitEndLinkBattle(void)\n{\n    s32 i;\n    u8 taskId;\n\n    SetHBlankCallback(NULL);\n    SetVBlankCallback(NULL);\n    CpuFill32(0, (void *)VRAM, VRAM_SIZE);\n    SetGpuReg(REG_OFFSET_MOSAIC, 0);\n    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0xF0));\n    SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0x50, 0x51));\n    SetGpuReg(REG_OFFSET_WININ, 0);\n    SetGpuReg(REG_OFFSET_WINOUT, 0);\n    gBattle_WIN0H = WIN_RANGE(0, 0xF0);\n    gBattle_WIN0V = WIN_RANGE(0x50, 0x51);\n    ScanlineEffect_Clear();\n    for (i = 0; i < 80; i++)\n    {\n        gScanlineEffectRegBuffers[0][i] = 0xF0;\n        gScanlineEffectRegBuffers[1][i] = 0xF0;\n    }\n\n    for (; i < 160; i++)\n    {\n        gScanlineEffectRegBuffers[0][i] = 0xFF10;\n        gScanlineEffectRegBuffers[1][i] = 0xFF10;\n    }\n    ResetPaletteFade();\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    gBattle_BG2_X = 0;\n    gBattle_BG2_Y = 0;\n    gBattle_BG3_X = 0;\n    gBattle_BG3_Y = 0;\n    InitBattleBgsVideo();\n    LoadCompressedPalette(gBattleInterface_Textbox_Pal, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP);\n    LoadBattleMenuWindowGfx();\n    ResetSpriteData();\n    ResetTasks();\n    DrawBattleEntryBackground();\n    SetGpuReg(REG_OFFSET_WINOUT, WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR);\n    FreeAllSpritePalettes();\n    gReservedSpritePaletteCount = 4;\n    SetVBlankCallback(VBlankCB_Battle);\n    taskId = CreateTask(InitLinkBattleVsScreen, 0);\n    gTasks[taskId].data[1] = 270;\n    gTasks[taskId].data[2] = 90;\n    gTasks[taskId].data[5] = 1;\n    BufferPartyVsScreenHealth_AtEnd(taskId);\n    SetMainCallback2(CB2_EndLinkBattle);\n    gBattleCommunication[MULTIUSE_STATE] = 0;\n}\n\nstatic void CB2_EndLinkBattle(void)\n{\n    EndLinkBattleInSteps();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n    RunTasks();\n}\n\nstatic void EndLinkBattleInSteps(void)\n{\n    s32 i;\n\n    switch (gBattleCommunication[MULTIUSE_STATE])\n    {\n    case 0:\n        ShowBg(0);\n        ShowBg(1);\n        ShowBg(2);\n        gBattleCommunication[1] = 0xFF;\n        gBattleCommunication[MULTIUSE_STATE]++;\n        break;\n    case 1:\n        if (--gBattleCommunication[1] == 0)\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            SetMainCallback2(gMain.savedCallback);\n            TrySetQuestLogLinkBattleEvent();\n            FreeMonSpritesGfx();\n            FreeBattleSpritesData();\n            FreeBattleResources();\n        }\n        break;\n    }\n}\n\nu32 GetBattleBgTemplateData(u8 arrayId, u8 caseId)\n{\n    u32 ret = 0;\n\n    switch (caseId)\n    {\n    case 0:\n        ret = gBattleBgTemplates[arrayId].bg;\n        break;\n    case 1:\n        ret = gBattleBgTemplates[arrayId].charBaseIndex;\n        break;\n    case 2:\n        ret = gBattleBgTemplates[arrayId].mapBaseIndex;\n        break;\n    case 3:\n        ret = gBattleBgTemplates[arrayId].screenSize;\n        break;\n    case 4:\n        ret = gBattleBgTemplates[arrayId].paletteMode;\n        break;\n    case 5:\n        ret = gBattleBgTemplates[arrayId].priority;\n        break;\n    case 6:\n        ret = gBattleBgTemplates[arrayId].baseTile;\n        break;\n    }\n    return ret;\n}\n\nstatic void TryCorrectShedinjaLanguage(struct Pokemon *mon)\n{\n    u8 nickname[POKEMON_NAME_LENGTH + 1];\n    u8 language = LANGUAGE_JAPANESE;\n\n    if (GetMonData(mon, MON_DATA_SPECIES) == SPECIES_SHEDINJA\n     && GetMonData(mon, MON_DATA_LANGUAGE) != language)\n    {\n        GetMonData(mon, MON_DATA_NICKNAME, nickname);\n        if (StringCompareWithoutExtCtrlCodes(nickname, sText_ShedinjaJpnName) == 0)\n            SetMonData(mon, MON_DATA_LANGUAGE, &language);\n    }\n}\n\n#define sBattler            data[0]\n#define sSpeciesId          data[2]\n\nvoid SpriteCB_EnemyMon(struct Sprite *sprite)\n{\n    sprite->callback = SpriteCB_MoveWildMonToRight;\n    StartSpriteAnimIfDifferent(sprite, 0);\n    BeginNormalPaletteFade(0x20000, 0, 10, 10, RGB(8, 8, 8));\n}\n\nstatic void SpriteCB_MoveWildMonToRight(struct Sprite *sprite)\n{\n    if(gSaveBlock2Ptr->optionsBattleIntroAnim)\n        sprite->invisible = TRUE;\n    if ((gIntroSlideFlags & 1) == 0)\n    {\n        if(gSaveBlock2Ptr->optionsBattleIntroAnim == 0)\n            sprite->x2 += 2;\n        if (sprite->x2 == 0)\n        {\n            sprite->invisible = FALSE;\n            sprite->callback = SpriteCB_WildMonShowHealthbox;\n            PlayCry_Normal(sprite->data[2], 25);\n        }\n    }\n}\n\nstatic void SpriteCB_WildMonShowHealthbox(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n    {\n        StartHealthboxSlideIn(sprite->sBattler);\n        SetHealthboxSpriteVisible(gHealthboxSpriteIds[sprite->sBattler]);\n        sprite->callback = SpriteCallbackDummy_2;\n        StartSpriteAnimIfDifferent(sprite, 0);\n        BeginNormalPaletteFade(0x20000, 0, 10, 0, RGB(8, 8, 8));\n    }\n}\n\nvoid SpriteCallbackDummy_2(struct Sprite *sprite)\n{\n}\n\n#define sNumFlickers data[3]\n#define sDelay       data[4]\n\n// Unused\nstatic void SpriteCB_InitFlicker(struct Sprite *sprite)\n{\n    sprite->sNumFlickers = 6;\n    sprite->sDelay = 1;\n    sprite->callback = SpriteCB_Flicker;\n}\n\nstatic void SpriteCB_Flicker(struct Sprite *sprite)\n{\n    sprite->sDelay--;\n    if (sprite->sDelay == 0)\n    {\n        sprite->sDelay = 8;\n        sprite->invisible ^= 1;\n        sprite->sNumFlickers--;\n        if (sprite->sNumFlickers == 0)\n        {\n            sprite->invisible = FALSE;\n            sprite->callback = SpriteCallbackDummy_2;\n            sFlickerArray[0] = 0;\n        }\n    }\n}\n\n#undef sNumFlickers\n#undef sDelay\n\nvoid SpriteCB_FaintOpponentMon(struct Sprite *sprite)\n{\n    u8 battler = sprite->sBattler;\n    u16 species;\n    u8 yOffset;\n\n    if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies != 0)\n        species = gBattleSpritesDataPtr->battlerData[battler].transformSpecies;\n    else\n        species = sprite->sSpeciesId;\n\n    GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY);  // Unused return value.\n\n    if (species == SPECIES_UNOWN)\n    {\n        u32 personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY);\n        u16 unownForm = GET_UNOWN_LETTER(personalityValue);\n        u16 unownSpecies;\n\n        if (unownForm == 0)\n            unownSpecies = SPECIES_UNOWN;  // Use the A Unown form.\n        else\n            unownSpecies = NUM_SPECIES + unownForm;  // Use one of the other Unown letters.\n\n        yOffset = gMonFrontPicCoords[unownSpecies].y_offset;\n    }\n    else if (species == SPECIES_CASTFORM)\n    {\n        yOffset = gCastformFrontSpriteCoords[gBattleMonForms[battler]].y_offset;\n    }\n    else if (species > NUM_SPECIES)\n    {\n        yOffset = gMonFrontPicCoords[SPECIES_NONE].y_offset;\n    }\n    else\n    {\n        yOffset = gMonFrontPicCoords[species].y_offset;\n    }\n\n    sprite->data[3] = 8 - yOffset / 8;\n    sprite->data[4] = 1;\n    sprite->callback = SpriteCB_AnimFaintOpponent;\n}\n\nstatic void SpriteCB_AnimFaintOpponent(struct Sprite *sprite)\n{\n    s32 i;\n\n    if (--sprite->data[4] == 0)\n    {\n        sprite->data[4] = 2;\n        sprite->y2 += 8; // Move the sprite down.\n        if (--sprite->data[3] < 0)\n        {\n            FreeSpriteOamMatrix(sprite);\n            DestroySprite(sprite);\n        }\n        else // Erase bottom part of the sprite to create a smooth illusion of mon falling down.\n        {\n            u8 *dst = (u8 *)gMonSpritesGfxPtr->sprites[GetBattlerPosition(sprite->sBattler)] + (gBattleMonForms[sprite->sBattler] << 11) + (sprite->data[3] << 8);\n\n            for (i = 0; i < 0x100; i++)\n                *(dst++) = 0;\n            StartSpriteAnim(sprite, gBattleMonForms[sprite->sBattler]);\n        }\n    }\n}\n\n// Used when selecting a move, which can hit multiple targets, in double battles.\nvoid SpriteCB_ShowAsMoveTarget(struct Sprite *sprite)\n{\n    sprite->data[3] = 8;\n    sprite->data[4] = sprite->invisible;\n    sprite->callback = SpriteCB_BlinkVisible;\n}\n\nstatic void SpriteCB_BlinkVisible(struct Sprite *sprite)\n{\n    if (--sprite->data[3] == 0)\n    {\n        sprite->invisible ^= 1;\n        sprite->data[3] = 8;\n    }\n}\n\nvoid SpriteCB_HideAsMoveTarget(struct Sprite *sprite)\n{\n    sprite->invisible = sprite->data[4];\n    sprite->data[4] = FALSE;\n    sprite->callback = SpriteCallbackDummy_2;\n}\n\nvoid SpriteCB_AllyMon(struct Sprite *sprite)\n{\n    sprite->callback = oac_poke_ally_;\n}\n\nstatic void oac_poke_ally_(struct Sprite *sprite)\n{\n    if (!(gIntroSlideFlags & 1))\n    {\n        sprite->x2 -= 2;\n        if (sprite->x2 == 0)\n        {\n            sprite->callback = SpriteCB_Idle;\n            sprite->data[1] = 0;\n        }\n    }\n}\n\nvoid SetIdleSpriteCallback(struct Sprite *sprite)\n{\n    sprite->callback = SpriteCB_Idle;\n}\n\nstatic void SpriteCB_Idle(struct Sprite *sprite)\n{\n}\n\n#define sSpeedX data[1]\n#define sSpeedY data[2]\n\nvoid SpriteCB_FaintSlideAnim(struct Sprite *sprite)\n{\n    if (!(gIntroSlideFlags & 1))\n    {\n        sprite->x2 += sprite->sSpeedX;\n        sprite->y2 += sprite->sSpeedY;\n    }\n}\n\n#define sSpeedX data[1]\n#define sSpeedY data[2]\n\n#define sSinIndex           data[0]\n#define sDelta              data[1]\n#define sAmplitude          data[2]\n#define sBouncerSpriteId    data[3]\n#define sWhich              data[4]\n\nvoid DoBounceEffect(u8 battler, u8 which, s8 delta, s8 amplitude)\n{\n    u8 invisibleSpriteId;\n    u8 bouncerSpriteId;\n\n    switch (which)\n    {\n    case BOUNCE_HEALTHBOX:\n    default:\n        if (gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing)\n            return;\n        break;\n    case BOUNCE_MON:\n        if (gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing)\n            return;\n        break;\n    }\n\n    invisibleSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_BounceEffect);\n    if (which == BOUNCE_HEALTHBOX)\n    {\n        bouncerSpriteId = gHealthboxSpriteIds[battler];\n        gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId = invisibleSpriteId;\n        gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing = 1;\n        gSprites[invisibleSpriteId].sSinIndex = 128; // 0\n    }\n    else\n    {\n        bouncerSpriteId = gBattlerSpriteIds[battler];\n        gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId = invisibleSpriteId;\n        gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing = 1;\n        gSprites[invisibleSpriteId].sSinIndex = 192; // -1\n    }\n    gSprites[invisibleSpriteId].sDelta = delta;\n    gSprites[invisibleSpriteId].sAmplitude = amplitude;\n    gSprites[invisibleSpriteId].sBouncerSpriteId = bouncerSpriteId;\n    gSprites[invisibleSpriteId].sWhich = which;\n    gSprites[bouncerSpriteId].x2 = 0;\n    gSprites[bouncerSpriteId].y2 = 0;\n}\n\nvoid EndBounceEffect(u8 battler, u8 which)\n{\n    u8 bouncerSpriteId;\n\n    if (which == BOUNCE_HEALTHBOX)\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing)\n            return;\n\n        bouncerSpriteId = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId].sBouncerSpriteId;\n        DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId]);\n        gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing = 0;\n    }\n    else\n    {\n        if (!gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing)\n            return;\n\n        bouncerSpriteId = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId].sBouncerSpriteId;\n        DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId]);\n        gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing = 0;\n    }\n\n    gSprites[bouncerSpriteId].x2 = 0;\n    gSprites[bouncerSpriteId].y2 = 0;\n}\n\nstatic void SpriteCB_BounceEffect(struct Sprite *sprite)\n{\n    u8 bouncerSpriteId = sprite->sBouncerSpriteId;\n    s32 index;\n\n    if (sprite->sWhich == BOUNCE_HEALTHBOX)\n        index = sprite->sSinIndex;\n    else\n        index = sprite->sSinIndex;\n    gSprites[bouncerSpriteId].y2 = Sin(index, sprite->sAmplitude) + sprite->sAmplitude;\n    sprite->sSinIndex = (sprite->sSinIndex + sprite->sDelta) & 0xFF;\n}\n\nvoid SpriteCB_PlayerThrowInit(struct Sprite *sprite)\n{\n    StartSpriteAnim(sprite, 1);\n    sprite->callback = SpriteCB_PlayerThrowUpdate;\n}\n\nvoid UpdatePlayerPosInThrowAnim(struct Sprite *sprite)\n{\n    if (sprite->animDelayCounter == 0)\n        sprite->centerToCornerVecX = sPlayerThrowXTranslation[sprite->animCmdIndex];\n}\n\nstatic void SpriteCB_PlayerThrowUpdate(struct Sprite *sprite)\n{\n    UpdatePlayerPosInThrowAnim(sprite);\n    if (sprite->animEnded)\n        sprite->callback = SpriteCB_Idle;\n}\n\nvoid BeginBattleIntroDummy(void)\n{\n\n}\n\nvoid BeginBattleIntro(void)\n{\n    BattleStartClearSetData();\n    gBattleCommunication[1] = 0;\n    gBattleMainFunc = BattleIntroGetMonsData;\n}\n\nstatic void BattleMainCB1(void)\n{\n    gBattleMainFunc();\n\n    for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n        gBattlerControllerFuncs[gActiveBattler]();\n}\n\nstatic void BattleStartClearSetData(void)\n{\n    s32 i;\n    u32 j;\n    u8 *dataPtr;\n\n    TurnValuesCleanUp(FALSE);\n    SpecialStatusesClear();\n\n    for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n    {\n        gStatuses3[i] = 0;\n\n        dataPtr = (u8 *)&gDisableStructs[i];\n        for (j = 0; j < sizeof(struct DisableStruct); j++)\n            dataPtr[j] = 0;\n\n        gDisableStructs[i].isFirstTurn = 2;\n        sUnusedBattlersArray[i] = 0;\n        gLastMoves[i] = MOVE_NONE;\n        gLastLandedMoves[i] = MOVE_NONE;\n        gLastHitByType[i] = 0;\n        gLastResultingMoves[i] = MOVE_NONE;\n        gLastHitBy[i] = 0xFF;\n        gLockedMoves[i] = MOVE_NONE;\n        gLastPrintedMoves[i] = MOVE_NONE;\n        gBattleResources->flags->flags[i] = 0;\n    }\n\n    for (i = 0; i < 2; i++)\n    {\n        gSideStatuses[i] = 0;\n\n        dataPtr = (u8 *)&gSideTimers[i];\n        for (j = 0; j < sizeof(struct SideTimer); j++)\n            dataPtr[j] = 0;\n    }\n\n    gBattlerAttacker = 0;\n    gBattlerTarget = 0;\n    gBattleWeather = 0;\n\n    dataPtr = (u8 *)&gWishFutureKnock;\n    for (i = 0; i < sizeof(struct WishFutureKnock); i++)\n        dataPtr[i] = 0;\n\n    gHitMarker = 0;\n\n    if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_POKEDUDE)) && gSaveBlock2Ptr->optionsBattleSceneOff)\n        gHitMarker |= HITMARKER_NO_ANIMATIONS;\n\n    gBattleScripting.battleStyle = gSaveBlock2Ptr->optionsBattleStyle;\n\n    gMultiHitCounter = 0;\n    gBattleOutcome = 0;\n    gBattleControllerExecFlags = 0;\n    gPaydayMoney = 0;\n    gBattleResources->battleScriptsStack->size = 0;\n    gBattleResources->battleCallbackStack->size = 0;\n\n    for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++)\n        gBattleCommunication[i] = 0;\n\n    gPauseCounterBattle = 0;\n    gBattleMoveDamage = 0;\n    gIntroSlideFlags = 0;\n    gBattleScripting.animTurn = 0;\n    gBattleScripting.animTargetsHit = 0;\n    gLeveledUpInBattle = 0;\n    gAbsentBattlerFlags = 0;\n    gBattleStruct->runTries = 0;\n    gBattleStruct->safariRockThrowCounter = 0;\n    gBattleStruct->safariBaitThrowCounter = 0;\n    *(&gBattleStruct->safariCatchFactor) = gSpeciesInfo[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275;\n    *(&gBattleStruct->safariEscapeFactor) = gSpeciesInfo[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].safariZoneFleeRate * 100 / 1275;\n    if (gBattleStruct->safariEscapeFactor <= 1)\n        gBattleStruct->safariEscapeFactor = 2;\n    gBattleStruct->wildVictorySong = 0;\n    gBattleStruct->moneyMultiplier = 1;\n\n    for (i = 0; i < 8; i++)\n    {\n        *((u8 *)gBattleStruct->lastTakenMove + i) = MOVE_NONE;\n        *((u8 *)gBattleStruct->usedHeldItems + i) = ITEM_NONE;\n        *((u8 *)gBattleStruct->choicedMove + i) = MOVE_NONE;\n        *((u8 *)gBattleStruct->changedItems + i) = ITEM_NONE;\n        *(i + 0 * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n        *(i + 1 * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n        *(i + 2 * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n        *(i + 3 * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n    }\n    *(gBattleStruct->AI_monToSwitchIntoId + 0) = PARTY_SIZE;\n    *(gBattleStruct->AI_monToSwitchIntoId + 1) = PARTY_SIZE;\n    *(&gBattleStruct->givenExpMons) = 0;\n    for (i = 0; i < 11; i++)\n        gBattleResults.catchAttempts[i] = 0;\n    gBattleResults.battleTurnCounter = 0;\n    gBattleResults.playerFaintCounter = 0;\n    gBattleResults.opponentFaintCounter = 0;\n    gBattleResults.playerSwitchesCounter = 0;\n    gBattleResults.numHealingItemsUsed = 0;\n    gBattleResults.numRevivesUsed = 0;\n    gBattleResults.playerMonWasDamaged = FALSE;\n    gBattleResults.usedMasterBall = FALSE;\n    gBattleResults.lastOpponentSpecies = SPECIES_NONE;\n    gBattleResults.lastUsedMovePlayer = MOVE_NONE;\n    gBattleResults.lastUsedMoveOpponent = MOVE_NONE;\n    gBattleResults.playerMon1Species = SPECIES_NONE;\n    gBattleResults.playerMon2Species = SPECIES_NONE;\n    gBattleResults.caughtMonSpecies = SPECIES_NONE;\n    for (i = 0; i < POKEMON_NAME_LENGTH; ++i)\n    {\n        gBattleResults.playerMon1Name[i] = 0;\n        gBattleResults.playerMon2Name[i] = 0;\n        gBattleResults.caughtMonNick[i] = 0;\n    }\n}\n\nvoid SwitchInClearSetData(void)\n{\n    struct DisableStruct disableStructCopy = gDisableStructs[gActiveBattler];\n    s32 i;\n    u8 *ptr;\n\n    if (gBattleMoves[gCurrentMove].effect != EFFECT_BATON_PASS)\n    {\n        for (i = 0; i < NUM_BATTLE_STATS; i++)\n            gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE;\n        for (i = 0; i < gBattlersCount; i++)\n        {\n            if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].battlerPreventingEscape == gActiveBattler)\n                gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION;\n            if ((gStatuses3[i] & STATUS3_ALWAYS_HITS) && gDisableStructs[i].battlerWithSureHit == gActiveBattler)\n            {\n                gStatuses3[i] &= ~STATUS3_ALWAYS_HITS;\n                gDisableStructs[i].battlerWithSureHit = 0;\n            }\n        }\n    }\n    if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS)\n    {\n        gBattleMons[gActiveBattler].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED);\n        gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT);\n        for (i = 0; i < gBattlersCount; i++)\n        {\n            if (GetBattlerSide(gActiveBattler) != GetBattlerSide(i)\n             && (gStatuses3[i] & STATUS3_ALWAYS_HITS) != 0\n             && (gDisableStructs[i].battlerWithSureHit == gActiveBattler))\n            {\n                gStatuses3[i] &= ~STATUS3_ALWAYS_HITS;\n                gStatuses3[i] |= STATUS3_ALWAYS_HITS_TURN(2);\n            }\n        }\n    }\n    else\n    {\n        gBattleMons[gActiveBattler].status2 = 0;\n        gStatuses3[gActiveBattler] = 0;\n    }\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(gActiveBattler))\n            gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(gActiveBattler);\n        if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == gActiveBattler)\n            gBattleMons[i].status2 &= ~STATUS2_WRAPPED;\n    }\n\n    gActionSelectionCursor[gActiveBattler] = 0;\n    gMoveSelectionCursor[gActiveBattler] = 0;\n\n    ptr = (u8 *)&gDisableStructs[gActiveBattler];\n    for (i = 0; i < sizeof(struct DisableStruct); i++)\n        ptr[i] = 0;\n\n    if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS)\n    {\n        gDisableStructs[gActiveBattler].substituteHP = disableStructCopy.substituteHP;\n        gDisableStructs[gActiveBattler].battlerWithSureHit = disableStructCopy.battlerWithSureHit;\n        gDisableStructs[gActiveBattler].perishSongTimer = disableStructCopy.perishSongTimer;\n        gDisableStructs[gActiveBattler].perishSongTimerStartValue = disableStructCopy.perishSongTimerStartValue;\n        gDisableStructs[gActiveBattler].battlerPreventingEscape = disableStructCopy.battlerPreventingEscape;\n    }\n\n    gMoveResultFlags = 0;\n    gDisableStructs[gActiveBattler].isFirstTurn = 2;\n    gLastMoves[gActiveBattler] = MOVE_NONE;\n    gLastLandedMoves[gActiveBattler] = MOVE_NONE;\n    gLastHitByType[gActiveBattler] = 0;\n    gLastResultingMoves[gActiveBattler] = MOVE_NONE;\n    gLastPrintedMoves[gActiveBattler] = MOVE_NONE;\n    gLastHitBy[gActiveBattler] = 0xFF;\n\n    *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 0) = MOVE_NONE;\n    *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 1) = MOVE_NONE;\n    *(0 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n    *(0 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0;\n    *(1 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n    *(1 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0;\n    *(2 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n    *(2 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0;\n    *(3 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n    *(3 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0;\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if (i != gActiveBattler)\n        {\n            *(gBattleStruct->lastTakenMove + i * 2 + 0) = MOVE_NONE;\n            *(gBattleStruct->lastTakenMove + i * 2 + 1) = MOVE_NONE;\n        }\n        *(i * 8 + gActiveBattler * 2 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n        *(i * 8 + gActiveBattler * 2 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0;\n    }\n\n    *((u8 *)(&gBattleStruct->choicedMove[gActiveBattler]) + 0) = MOVE_NONE;\n    *((u8 *)(&gBattleStruct->choicedMove[gActiveBattler]) + 1) = MOVE_NONE;\n\n    gBattleResources->flags->flags[gActiveBattler] = 0;\n    gCurrentMove = MOVE_NONE;\n}\n\nvoid FaintClearSetData(void)\n{\n    s32 i;\n    u8 *ptr;\n\n    for (i = 0; i < NUM_BATTLE_STATS; i++)\n        gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE;\n\n    gBattleMons[gActiveBattler].status2 = 0;\n    gStatuses3[gActiveBattler] = 0;\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].battlerPreventingEscape == gActiveBattler)\n            gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION;\n        if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(gActiveBattler))\n            gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(gActiveBattler);\n        if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == gActiveBattler)\n            gBattleMons[i].status2 &= ~STATUS2_WRAPPED;\n    }\n\n    gActionSelectionCursor[gActiveBattler] = 0;\n    gMoveSelectionCursor[gActiveBattler] = 0;\n\n    ptr = (u8 *)&gDisableStructs[gActiveBattler];\n    for (i = 0; i < sizeof(struct DisableStruct); i++)\n        ptr[i] = 0;\n\n    gProtectStructs[gActiveBattler].protected = FALSE;\n    gProtectStructs[gActiveBattler].endured = FALSE;\n    gProtectStructs[gActiveBattler].noValidMoves = FALSE;\n    gProtectStructs[gActiveBattler].helpingHand = FALSE;\n    gProtectStructs[gActiveBattler].bounceMove = FALSE;\n    gProtectStructs[gActiveBattler].stealMove = FALSE;\n    gProtectStructs[gActiveBattler].flag0Unknown = FALSE;\n    gProtectStructs[gActiveBattler].prlzImmobility = FALSE;\n    gProtectStructs[gActiveBattler].confusionSelfDmg = FALSE;\n    gProtectStructs[gActiveBattler].targetNotAffected = FALSE;\n    gProtectStructs[gActiveBattler].chargingTurn = FALSE;\n    gProtectStructs[gActiveBattler].fleeType = 0;\n    gProtectStructs[gActiveBattler].usedImprisonedMove = FALSE;\n    gProtectStructs[gActiveBattler].loveImmobility = FALSE;\n    gProtectStructs[gActiveBattler].usedDisabledMove = FALSE;\n    gProtectStructs[gActiveBattler].usedTauntedMove = FALSE;\n    gProtectStructs[gActiveBattler].flag2Unknown = FALSE;\n    gProtectStructs[gActiveBattler].flinchImmobility = FALSE;\n    gProtectStructs[gActiveBattler].notFirstStrike = FALSE;\n\n    gDisableStructs[gActiveBattler].isFirstTurn = 2;\n\n    gLastMoves[gActiveBattler] = MOVE_NONE;\n    gLastLandedMoves[gActiveBattler] = MOVE_NONE;\n    gLastHitByType[gActiveBattler] = 0;\n    gLastResultingMoves[gActiveBattler] = MOVE_NONE;\n    gLastPrintedMoves[gActiveBattler] = MOVE_NONE;\n    gLastHitBy[gActiveBattler] = 0xFF;\n\n    *((u8 *)(&gBattleStruct->choicedMove[gActiveBattler]) + 0) = MOVE_NONE;\n    *((u8 *)(&gBattleStruct->choicedMove[gActiveBattler]) + 1) = MOVE_NONE;\n\n    *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 0) = MOVE_NONE;\n    *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 1) = MOVE_NONE;\n    *(0 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n    *(0 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0;\n    *(1 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n    *(1 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0;\n    *(2 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n    *(2 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0;\n    *(3 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n    *(3 * 2 + gActiveBattler * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0;\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if (i != gActiveBattler)\n        {\n            *(gBattleStruct->lastTakenMove + i * 2 + 0) = MOVE_NONE;\n            *(gBattleStruct->lastTakenMove + i * 2 + 1) = MOVE_NONE;\n        }\n        *(i * 8 + gActiveBattler * 2 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;\n        *(i * 8 + gActiveBattler * 2 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = 0;\n    }\n    gBattleResources->flags->flags[gActiveBattler] = 0;\n    gBattleMons[gActiveBattler].type1 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0];\n    gBattleMons[gActiveBattler].type2 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1];\n}\n\nstatic void BattleIntroGetMonsData(void)\n{\n    switch (gBattleCommunication[MULTIUSE_STATE])\n    {\n    case 0:\n        gActiveBattler = gBattleCommunication[1];\n        BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, 0);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattleCommunication[MULTIUSE_STATE]++;\n        break;\n    case 1:\n        if (gBattleControllerExecFlags == 0)\n        {\n            gBattleCommunication[1]++;\n            if (gBattleCommunication[1] == gBattlersCount)\n                gBattleMainFunc = BattleIntroPrepareBackgroundSlide;\n            else\n                gBattleCommunication[MULTIUSE_STATE] = 0;\n        }\n        break;\n    }\n}\n\nstatic void BattleIntroPrepareBackgroundSlide(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        gActiveBattler = GetBattlerAtPosition(0);\n        BtlController_EmitIntroSlide(BUFFER_A, gBattleTerrain);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattleMainFunc = BattleIntroDrawTrainersOrMonsSprites;\n        gBattleCommunication[MULTIUSE_STATE] = 0;\n        gBattleCommunication[SPRITES_INIT_STATE1] = 0;\n    }\n}\n\nstatic void BattleIntroDrawTrainersOrMonsSprites(void)\n{\n    u8 *ptr;\n    s32 i;\n\n    if (gBattleControllerExecFlags)\n        return;\n\n    for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n    {\n        if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI)\n            && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        {\n            ptr = (u8 *)&gBattleMons[gActiveBattler];\n            for (i = 0; i < sizeof(struct BattlePokemon); i++)\n                ptr[i] = 0;\n        }\n        else\n        {\n            u16 *hpOnSwitchout;\n\n            ptr = (u8 *)&gBattleMons[gActiveBattler];\n            for (i = 0; i < sizeof(struct BattlePokemon); i++)\n                ptr[i] = gBattleBufferB[gActiveBattler][4 + i];\n\n            gBattleMons[gActiveBattler].type1 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0];\n            gBattleMons[gActiveBattler].type2 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1];\n            gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum);\n            hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(gActiveBattler)];\n            *hpOnSwitchout = gBattleMons[gActiveBattler].hp;\n            for (i = 0; i < NUM_BATTLE_STATS; i++)\n                gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE;\n            gBattleMons[gActiveBattler].status2 = 0;\n        }\n\n        if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT)\n        {\n            BtlController_EmitDrawTrainerPic(BUFFER_A);\n            MarkBattlerForControllerExec(gActiveBattler);\n        }\n\n        if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n        {\n            if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT)\n            {\n                BtlController_EmitDrawTrainerPic(BUFFER_A);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n            if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT\n                 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER\n                                       | BATTLE_TYPE_TRAINER_TOWER\n                                       | BATTLE_TYPE_BATTLE_TOWER\n                                       | BATTLE_TYPE_POKEDUDE\n                                       | BATTLE_TYPE_LINK\n                                       | BATTLE_TYPE_GHOST\n                                       | BATTLE_TYPE_OLD_MAN_TUTORIAL\n                                       | BATTLE_TYPE_LEGENDARY)))\n                HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality);\n        }\n        else\n        {\n            if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT)\n            {\n                if (gBattleTypeFlags & (BATTLE_TYPE_GHOST | BATTLE_TYPE_GHOST_UNVEILED))\n                {\n                    if (!IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags))\n                        HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality);\n                }\n                else if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER\n                                            | BATTLE_TYPE_TRAINER_TOWER\n                                            | BATTLE_TYPE_BATTLE_TOWER\n                                            | BATTLE_TYPE_POKEDUDE\n                                            | BATTLE_TYPE_LINK\n                                            | BATTLE_TYPE_GHOST\n                                            | BATTLE_TYPE_OLD_MAN_TUTORIAL\n                                            | BATTLE_TYPE_LEGENDARY)))\n                {\n                    HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality);\n                }\n                BtlController_EmitLoadMonSprite(0);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n        }\n        if (gBattleTypeFlags & BATTLE_TYPE_MULTI\n            && (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT || GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT))\n        {\n            BtlController_EmitDrawTrainerPic(BUFFER_A);\n            MarkBattlerForControllerExec(gActiveBattler);\n        }\n    }\n    gBattleMainFunc = BattleIntroDrawPartySummaryScreens;\n}\n\nstatic void BattleIntroDrawPartySummaryScreens(void)\n{\n    s32 i;\n    struct HpAndStatus hpStatus[PARTY_SIZE];\n\n    if (gBattleControllerExecFlags)\n        return;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n    {\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE\n             || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG)\n            {\n                hpStatus[i].hp = HP_EMPTY_SLOT;\n                hpStatus[i].status = 0;\n            }\n            else\n            {\n                hpStatus[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP);\n                hpStatus[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS);\n            }\n        }\n        gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        BtlController_EmitDrawPartyStatusSummary(BUFFER_A, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY);\n        MarkBattlerForControllerExec(gActiveBattler);\n\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE\n             || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG)\n            {\n                hpStatus[i].hp = HP_EMPTY_SLOT;\n                hpStatus[i].status = 0;\n            }\n            else\n            {\n                hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);\n                hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);\n            }\n        }\n        gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n        BtlController_EmitDrawPartyStatusSummary(BUFFER_A, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY);\n        MarkBattlerForControllerExec(gActiveBattler);\n\n        gBattleMainFunc = BattleIntroPrintTrainerWantsToBattle;\n    }\n    else\n    {\n        // The struct gets set here, but nothing is ever done with it since\n        // wild battles don't show the party summary.\n        // Still, there's no point in having dead code.\n\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE\n             || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG)\n            {\n                hpStatus[i].hp = HP_EMPTY_SLOT;\n                hpStatus[i].status = 0;\n            }\n            else\n            {\n                hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);\n                hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);\n            }\n        }\n\n        gBattleMainFunc = BattleIntroPrintWildMonAttacked;\n    }\n}\n\nstatic void BattleIntroPrintTrainerWantsToBattle(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        PrepareStringBattle(STRINGID_INTROMSG, gActiveBattler);\n        gBattleMainFunc = BattleIntroPrintOpponentSendsOut;\n    }\n}\n\nstatic void BattleIntroPrintWildMonAttacked(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        gBattleMainFunc = BattleIntroPrintPlayerSendsOut;\n        PrepareStringBattle(STRINGID_INTROMSG, 0);\n        if (IS_BATTLE_TYPE_GHOST_WITH_SCOPE(gBattleTypeFlags))\n        {\n            gBattleScripting.battler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n            BattleScriptExecute(BattleScript_SilphScopeUnveiled);\n        }\n    }\n}\n\nstatic void BattleIntroPrintOpponentSendsOut(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT));\n        gBattleMainFunc = BattleIntroOpponentSendsOutMonAnimation;\n    }\n}\n\nstatic void BattleIntroOpponentSendsOutMonAnimation(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n        {\n            if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT)\n            {\n                BtlController_EmitIntroTrainerBallThrow(0);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n            if (gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT)\n            {\n                BtlController_EmitIntroTrainerBallThrow(0);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n        }\n        gBattleMainFunc = BattleIntroRecordMonsToDex;\n    }\n}\n\nstatic void BattleIntroRecordMonsToDex(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n            if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT\n             && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER\n                                   | BATTLE_TYPE_TRAINER_TOWER\n                                   | BATTLE_TYPE_BATTLE_TOWER\n                                   | BATTLE_TYPE_POKEDUDE\n                                   | BATTLE_TYPE_LINK\n                                   | BATTLE_TYPE_GHOST\n                                   | BATTLE_TYPE_OLD_MAN_TUTORIAL\n                                   | BATTLE_TYPE_LEGENDARY)))\n                HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality);\n        gBattleMainFunc = BattleIntroPrintPlayerSendsOut;\n    }\n}\n\n// not used\nstatic void Unused_AutoProgressToIntro(void)\n{\n    if (gBattleControllerExecFlags == 0)\n        gBattleMainFunc = BattleIntroPrintPlayerSendsOut;\n}\n\nstatic void BattleIntroPrintPlayerSendsOut(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))\n            PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(B_POSITION_PLAYER_LEFT));\n        gBattleMainFunc = BattleIntroPlayerSendsOutMonAnimation;\n    }\n}\n\nstatic void BattleIntroPlayerSendsOutMonAnimation(void)\n{\n    u32 position;\n\n    if (gBattleControllerExecFlags)\n        return;\n\n    for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n    {\n        if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT)\n        {\n            BtlController_EmitIntroTrainerBallThrow(0);\n            MarkBattlerForControllerExec(gActiveBattler);\n        }\n        if (gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT)\n        {\n            BtlController_EmitIntroTrainerBallThrow(0);\n            MarkBattlerForControllerExec(gActiveBattler);\n        }\n    }\n    gBattleStruct->switchInAbilitiesCounter = 0;\n    gBattleStruct->switchInItemsCounter = 0;\n    gBattleStruct->overworldWeatherDone = FALSE;\n\n    gBattleMainFunc = TryDoEventsBeforeFirstTurn;\n}\n\n// Unused\nstatic void BattleIntroSwitchInPlayerMons(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n        {\n            if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n            {\n                BtlController_EmitSwitchInAnim(BUFFER_A, gBattlerPartyIndexes[gActiveBattler], FALSE);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n        }\n\n        gBattleStruct->switchInAbilitiesCounter = 0;\n        gBattleStruct->switchInItemsCounter = 0;\n        gBattleStruct->overworldWeatherDone = FALSE;\n\n        gBattleMainFunc = TryDoEventsBeforeFirstTurn;\n    }\n}\n\nstatic void TryDoEventsBeforeFirstTurn(void)\n{\n    s32 i, j;\n    u8 effect = 0;\n\n    if (gBattleControllerExecFlags)\n        return;\n\n    if (gBattleStruct->switchInAbilitiesCounter == 0)\n    {\n        for (i = 0; i < gBattlersCount; i++)\n            gBattlerByTurnOrder[i] = i;\n        for (i = 0; i < gBattlersCount - 1; i++)\n            for (j = i + 1; j < gBattlersCount; j++)\n                if (GetWhoStrikesFirst(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], TRUE) != 0)\n                    SwapTurnOrder(i, j);\n    }\n    if (!gBattleStruct->overworldWeatherDone\n        && AbilityBattleEffects(0, 0, 0, ABILITYEFFECT_SWITCH_IN_WEATHER, 0) != 0)\n    {\n        gBattleStruct->overworldWeatherDone = TRUE;\n        return;\n    }\n    // Check all switch in abilities happening from the fastest mon to slowest.\n    while (gBattleStruct->switchInAbilitiesCounter < gBattlersCount)\n    {\n        if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBattlerByTurnOrder[gBattleStruct->switchInAbilitiesCounter], 0, 0, 0) != 0)\n            effect++;\n        ++gBattleStruct->switchInAbilitiesCounter;\n        if (effect != 0)\n            return;\n    }\n    if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) != 0)\n        return;\n    if (AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) != 0)\n        return;\n    // Check all switch in items having effect from the fastest mon to slowest.\n    while (gBattleStruct->switchInItemsCounter < gBattlersCount)\n    {\n        if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gBattlerByTurnOrder[gBattleStruct->switchInItemsCounter], FALSE))\n            effect++;\n        ++gBattleStruct->switchInItemsCounter;\n        if (effect != 0)\n            return;\n    }\n    for (i = 0; i < gBattlersCount; i++) // pointless, ruby leftover\n        ;\n    for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n    {\n        *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE;\n        gChosenActionByBattler[i] = B_ACTION_NONE;\n        gChosenMoveByBattler[i] = MOVE_NONE;\n    }\n    TurnValuesCleanUp(FALSE);\n    SpecialStatusesClear();\n    *(&gBattleStruct->absentBattlerFlags) = gAbsentBattlerFlags;\n    gBattleMainFunc = HandleTurnActionSelectionState;\n    ResetSentPokesToOpponentValue();\n    for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++)\n        gBattleCommunication[i] = 0;\n    for (i = 0; i < gBattlersCount; i++)\n        gBattleMons[i].status2 &= ~(STATUS2_FLINCHED);\n    *(&gBattleStruct->turnEffectsTracker) = 0;\n    *(&gBattleStruct->turnEffectsBattlerId) = 0;\n    *(&gBattleStruct->wishPerishSongState) = 0;\n    *(&gBattleStruct->wishPerishSongBattlerId) = 0;\n    gBattleScripting.moveendState = 0;\n    gBattleStruct->faintedActionsState = 0;\n    gBattleStruct->turnCountersTracker = 0;\n    gMoveResultFlags = 0;\n    gRandomTurnNumber = Random();\n}\n\nstatic void HandleEndTurn_ContinueBattle(void)\n{\n    s32 i;\n\n    if (gBattleControllerExecFlags == 0)\n    {\n        gBattleMainFunc = BattleTurnPassed;\n        for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++)\n            gBattleCommunication[i] = 0;\n        for (i = 0; i < gBattlersCount; i++)\n        {\n            gBattleMons[i].status2 &= ~(STATUS2_FLINCHED);\n            if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].status2 & STATUS2_MULTIPLETURNS))\n                CancelMultiTurnMoves(i);\n        }\n        gBattleStruct->turnEffectsTracker = 0;\n        gBattleStruct->turnEffectsBattlerId = 0;\n        gBattleStruct->wishPerishSongState = 0;\n        gBattleStruct->wishPerishSongBattlerId = 0;\n        gBattleStruct->turnCountersTracker = 0;\n        gMoveResultFlags = 0;\n    }\n}\n\nvoid BattleTurnPassed(void)\n{\n    s32 i;\n\n    TurnValuesCleanUp(TRUE);\n    if (gBattleOutcome == 0)\n    {\n        if (DoFieldEndTurnEffects())\n            return;\n        if (DoBattlerEndTurnEffects())\n            return;\n    }\n    if (HandleFaintedMonActions())\n        return;\n    gBattleStruct->faintedActionsState = 0;\n    if (HandleWishPerishSongOnTurnEnd())\n        return;\n    TurnValuesCleanUp(FALSE);\n    gHitMarker &= ~(HITMARKER_NO_ATTACKSTRING);\n    gHitMarker &= ~(HITMARKER_UNABLE_TO_USE_MOVE);\n    gHitMarker &= ~(HITMARKER_PLAYER_FAINTED);\n    gHitMarker &= ~(HITMARKER_PASSIVE_DAMAGE);\n    gBattleScripting.animTurn = 0;\n    gBattleScripting.animTargetsHit = 0;\n    gBattleScripting.moveendState = 0;\n    gBattleMoveDamage = 0;\n    gMoveResultFlags = 0;\n    for (i = 0; i < 5; i++)\n        gBattleCommunication[i] = 0;\n    if (gBattleOutcome != 0)\n    {\n        gCurrentActionFuncId = B_ACTION_FINISHED;\n        gBattleMainFunc = RunTurnActionsFunctions;\n        return;\n    }\n    if (gBattleResults.battleTurnCounter < 0xFF)\n        ++gBattleResults.battleTurnCounter;\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        gChosenActionByBattler[i] = B_ACTION_NONE;\n        gChosenMoveByBattler[i] = MOVE_NONE;\n    }\n    for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n        *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE;\n    *(&gBattleStruct->absentBattlerFlags) = gAbsentBattlerFlags;\n    gBattleMainFunc = HandleTurnActionSelectionState;\n    gRandomTurnNumber = Random();\n}\n\nu8 IsRunningFromBattleImpossible(void)\n{\n    u8 holdEffect;\n    u8 side;\n    s32 i;\n\n    if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY)\n        holdEffect = gEnigmaBerries[gActiveBattler].holdEffect;\n    else\n        holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item);\n    gPotentialItemEffectBattler = gActiveBattler;\n    if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN\n     || (gBattleTypeFlags & BATTLE_TYPE_LINK)\n     || gBattleMons[gActiveBattler].ability == ABILITY_RUN_AWAY)\n        return BATTLE_RUN_SUCCESS;\n    side = GetBattlerSide(gActiveBattler);\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if (side != GetBattlerSide(i)\n         && gBattleMons[i].ability == ABILITY_SHADOW_TAG)\n        {\n            gBattleScripting.battler = i;\n            gLastUsedAbility = gBattleMons[i].ability;\n            gBattleCommunication[MULTISTRING_CHOOSER] = 2;\n            return BATTLE_RUN_FAILURE;\n        }\n        if (side != GetBattlerSide(i)\n         && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE\n         && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING)\n         && gBattleMons[i].ability == ABILITY_ARENA_TRAP)\n        {\n            gBattleScripting.battler = i;\n            gLastUsedAbility = gBattleMons[i].ability;\n            gBattleCommunication[MULTISTRING_CHOOSER] = 2;\n            return BATTLE_RUN_FAILURE;\n        }\n    }\n    i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0);\n    if (i != 0 && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL))\n    {\n        gBattleScripting.battler = i - 1;\n        gLastUsedAbility = gBattleMons[i - 1].ability;\n        gBattleCommunication[MULTISTRING_CHOOSER] = 2;\n        return BATTLE_RUN_FAILURE;\n    }\n    if ((gBattleMons[gActiveBattler].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED))\n     || (gStatuses3[gActiveBattler] & STATUS3_ROOTED))\n    {\n        gBattleCommunication[MULTISTRING_CHOOSER] = 0;\n        return BATTLE_RUN_FORBIDDEN;\n    }\n    if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)\n    {\n        gBattleCommunication[MULTISTRING_CHOOSER] = 1;\n        return BATTLE_RUN_FORBIDDEN;\n    }\n    return BATTLE_RUN_SUCCESS;\n}\n\nvoid UpdatePartyOwnerOnSwitch_NonMulti(u8 battler)\n{\n    s32 i;\n    u8 r4, r1;\n\n    for (i = 0; i < 3; i++)\n        gBattlePartyCurrentOrder[i] = *(battler * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders));\n    r4 = GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battler]);\n    r1 = GetPartyIdFromBattlePartyId(*(gBattleStruct->monToSwitchIntoId + battler));\n    SwitchPartyMonSlots(r4, r1);\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n    {\n        for (i = 0; i < 3; i++)\n        {\n            *(battler * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i];\n            *(BATTLE_PARTNER(battler) * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i];\n        }\n    }\n    else\n    {\n        for (i = 0; i < 3; i++)\n            *(battler * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i];\n    }\n}\n\nenum\n{\n    STATE_BEFORE_ACTION_CHOSEN,\n    STATE_WAIT_ACTION_CHOSEN,\n    STATE_WAIT_ACTION_CASE_CHOSEN,\n    STATE_WAIT_ACTION_CONFIRMED_STANDBY,\n    STATE_WAIT_ACTION_CONFIRMED,\n    STATE_SELECTION_SCRIPT,\n    STATE_WAIT_SET_BEFORE_ACTION,\n};\n\nstatic void HandleTurnActionSelectionState(void)\n{\n    s32 i;\n\n    gBattleCommunication[ACTIONS_CONFIRMED_COUNT] = 0;\n    for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n    {\n        u8 position = GetBattlerPosition(gActiveBattler);\n\n        switch (gBattleCommunication[gActiveBattler])\n        {\n        case STATE_BEFORE_ACTION_CHOSEN: // Choose an action.\n            *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = PARTY_SIZE;\n            if (gBattleTypeFlags & BATTLE_TYPE_MULTI\n             || (position & BIT_FLANK) == B_FLANK_LEFT\n             || gBattleStruct->absentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(position))]\n             || gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(position))] == STATE_WAIT_ACTION_CONFIRMED)\n            {\n                if (gBattleStruct->absentBattlerFlags & gBitTable[gActiveBattler])\n                {\n                    gChosenActionByBattler[gActiveBattler] = B_ACTION_NOTHING_FAINTED;\n                    if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n                        gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED;\n                    else\n                        gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;\n                }\n                else\n                {\n                    if (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS\n                     || gBattleMons[gActiveBattler].status2 & STATUS2_RECHARGE)\n                    {\n                        gChosenActionByBattler[gActiveBattler] = B_ACTION_USE_MOVE;\n                        gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;\n                    }\n                    else\n                    {\n                        BtlController_EmitChooseAction(0, gChosenActionByBattler[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8));\n                        MarkBattlerForControllerExec(gActiveBattler);\n                        gBattleCommunication[gActiveBattler]++;\n                    }\n                }\n            }\n            break;\n        case STATE_WAIT_ACTION_CHOSEN: // Try to perform an action.\n            if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))\n            {\n                gChosenActionByBattler[gActiveBattler] = gBattleBufferB[gActiveBattler][1];\n                switch (gBattleBufferB[gActiveBattler][1])\n                {\n                case B_ACTION_USE_MOVE:\n                    if (AreAllMovesUnusable())\n                    {\n                        gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;\n                        *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE;\n                        *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_WAIT_ACTION_CONFIRMED_STANDBY;\n                        *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3];\n                        return;\n                    }\n                    else if (gDisableStructs[gActiveBattler].encoredMove != MOVE_NONE)\n                    {\n                        gChosenMoveByBattler[gActiveBattler] = gDisableStructs[gActiveBattler].encoredMove;\n                        *(gBattleStruct->chosenMovePositions + gActiveBattler) = gDisableStructs[gActiveBattler].encoredMovePos;\n                        gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;\n                        return;\n                    }\n                    else\n                    {\n                        struct ChooseMoveStruct moveInfo;\n\n                        moveInfo.species = gBattleMons[gActiveBattler].species;\n                        moveInfo.monType1 = gBattleMons[gActiveBattler].type1;\n                        moveInfo.monType2 = gBattleMons[gActiveBattler].type2;\n                        for (i = 0; i < MAX_MON_MOVES; i++)\n                        {\n                            moveInfo.moves[i] = gBattleMons[gActiveBattler].moves[i];\n                            moveInfo.currentPp[i] = gBattleMons[gActiveBattler].pp[i];\n                            moveInfo.maxPp[i] = CalculatePPWithBonus(gBattleMons[gActiveBattler].moves[i],\n                                                                     gBattleMons[gActiveBattler].ppBonuses,\n                                                                     i);\n                        }\n                        BtlController_EmitChooseMove(0, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0, FALSE, &moveInfo);\n                        MarkBattlerForControllerExec(gActiveBattler);\n                    }\n                    break;\n                case B_ACTION_USE_ITEM:\n                    if ((gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) || FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n                    {\n                        gSelectionBattleScripts[gActiveBattler] = BattleScript_ActionSelectionItemsCantBeUsed;\n                        gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;\n                        *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE;\n                        *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN;\n                        return;\n                    }\n                    else\n                    {\n                        BtlController_EmitChooseItem(0, gBattleStruct->battlerPartyOrders[gActiveBattler]);\n                        MarkBattlerForControllerExec(gActiveBattler);\n                    }\n                    break;\n                case B_ACTION_SWITCH:\n                    *(gBattleStruct->battlerPartyIndexes + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler];\n                    if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION) || gStatuses3[gActiveBattler] & STATUS3_ROOTED)\n                    {\n                        BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CANT_SWITCH, 6, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]);\n                    }\n                    else if ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_SHADOW_TAG))\n                          || ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_ARENA_TRAP))\n                              && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING)\n                              && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE)\n                          || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0))\n                              && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL)))\n                    {\n                        BtlController_EmitChoosePokemon(BUFFER_A, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, 6, gLastUsedAbility, gBattleStruct->battlerPartyOrders[gActiveBattler]);\n                    }\n                    else\n                    {\n                        if (gActiveBattler == 2 && gChosenActionByBattler[0] == B_ACTION_SWITCH)\n                            BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]);\n                        else if (gActiveBattler == 3 && gChosenActionByBattler[1] == B_ACTION_SWITCH)\n                            BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]);\n                        else\n                            BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CHOOSE_MON, 6, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]);\n                    }\n                    MarkBattlerForControllerExec(gActiveBattler);\n                    break;\n                case B_ACTION_SAFARI_BALL:\n                    if (IsPlayerPartyAndPokemonStorageFull())\n                    {\n                        gSelectionBattleScripts[gActiveBattler] = BattleScript_PrintFullBox;\n                        gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;\n                        *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE;\n                        *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN;\n                        return;\n                    }\n                    break;\n                case B_ACTION_CANCEL_PARTNER:\n                    gBattleCommunication[gActiveBattler] = STATE_WAIT_SET_BEFORE_ACTION;\n                    gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))] = STATE_BEFORE_ACTION_CHOSEN;\n                    BtlController_EmitEndBounceEffect(0);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                    return;\n                }\n                if (gBattleTypeFlags & BATTLE_TYPE_TRAINER\n                 && !(gBattleTypeFlags & BATTLE_TYPE_LINK)\n                 && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN)\n                {\n                    BattleScriptExecute(BattleScript_PrintCantRunFromTrainer);\n                    gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;\n                }\n                else if (IsRunningFromBattleImpossible() != BATTLE_RUN_SUCCESS\n                      && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN)\n                {\n                    gSelectionBattleScripts[gActiveBattler] = BattleScript_PrintCantEscapeFromBattle;\n                    gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;\n                    *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE;\n                    *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN;\n                    return;\n                }\n                else\n                {\n                    gBattleCommunication[gActiveBattler]++;\n                }\n            }\n            break;\n        case STATE_WAIT_ACTION_CASE_CHOSEN:\n            if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))\n            {\n                switch (gChosenActionByBattler[gActiveBattler])\n                {\n                case B_ACTION_USE_MOVE:\n                    switch (gBattleBufferB[gActiveBattler][1])\n                    {\n                    case 3 ... 9:\n                        gChosenActionByBattler[gActiveBattler] = gBattleBufferB[gActiveBattler][1];\n                        return;\n                    default:\n                        if ((gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8)) == 0xFFFF)\n                        {\n                            gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;\n                        }\n                        else if (TrySetCantSelectMoveBattleScript())\n                        {\n                            gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;\n                            *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE;\n                            gBattleBufferB[gActiveBattler][1] = 0;\n                            *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_WAIT_ACTION_CHOSEN;\n                            return;\n                        }\n                        else\n                        {\n                            *(gBattleStruct->chosenMovePositions + gActiveBattler) = gBattleBufferB[gActiveBattler][2];\n                            gChosenMoveByBattler[gActiveBattler] = gBattleMons[gActiveBattler].moves[*(gBattleStruct->chosenMovePositions + gActiveBattler)];\n                            *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3];\n                            gBattleCommunication[gActiveBattler]++;\n                        }\n                        break;\n                    }\n                    break;\n                case B_ACTION_USE_ITEM:\n                    if ((gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)) == 0)\n                    {\n                        gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;\n                    }\n                    else\n                    {\n                        gLastUsedItem = (gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8));\n                        gBattleCommunication[gActiveBattler]++;\n                    }\n                    break;\n                case B_ACTION_SWITCH:\n                    if (gBattleBufferB[gActiveBattler][1] == PARTY_SIZE)\n                    {\n                        gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;\n                    }\n                    else\n                    {\n                        *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = gBattleBufferB[gActiveBattler][1];\n                        if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n                        {\n                            *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) &= 0xF;\n                            *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0);\n                            *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 1) = gBattleBufferB[gActiveBattler][3];\n                            *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) &= (0xF0);\n                            *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4;\n                            *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 2) = gBattleBufferB[gActiveBattler][3];\n                        }\n                        gBattleCommunication[gActiveBattler]++;\n                    }\n                    break;\n                case B_ACTION_RUN:\n                    gHitMarker |= HITMARKER_RUN;\n                    gBattleCommunication[gActiveBattler]++;\n                    break;\n                case B_ACTION_SAFARI_WATCH_CAREFULLY:\n                    gBattleCommunication[gActiveBattler]++;\n                    break;\n                case B_ACTION_SAFARI_BALL:\n                    gBattleCommunication[gActiveBattler]++;\n                    break;\n                case B_ACTION_SAFARI_BAIT:\n                case B_ACTION_SAFARI_GO_NEAR:\n                    gBattleCommunication[gActiveBattler]++;\n                    break;\n                case B_ACTION_SAFARI_RUN:\n                    gHitMarker |= HITMARKER_RUN;\n                    gBattleCommunication[gActiveBattler]++;\n                    break;\n                case B_ACTION_OLDMAN_THROW:\n                    gBattleCommunication[gActiveBattler]++;\n                    break;\n                }\n            }\n            break;\n        case STATE_WAIT_ACTION_CONFIRMED_STANDBY:\n            if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))\n            {\n                if (((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_DOUBLE)) != BATTLE_TYPE_DOUBLE)\n                 || (position & BIT_FLANK) != B_FLANK_LEFT\n                 || (*(&gBattleStruct->absentBattlerFlags) & gBitTable[GetBattlerAtPosition(position ^ BIT_FLANK)]))\n                    BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_STOP_BOUNCE);\n                else\n                    BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_STOP_BOUNCE_ONLY);\n                MarkBattlerForControllerExec(gActiveBattler);\n                gBattleCommunication[gActiveBattler]++;\n            }\n            break;\n        case STATE_WAIT_ACTION_CONFIRMED:\n            if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))\n                ++gBattleCommunication[ACTIONS_CONFIRMED_COUNT];\n            break;\n        case STATE_SELECTION_SCRIPT:\n            if (*(gBattleStruct->selectionScriptFinished + gActiveBattler))\n            {\n                gBattleCommunication[gActiveBattler] = *(gBattleStruct->stateIdAfterSelScript + gActiveBattler);\n            }\n            else\n            {\n                gBattlerAttacker = gActiveBattler;\n                gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBattler];\n                if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))\n                    gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();\n                gSelectionBattleScripts[gActiveBattler] = gBattlescriptCurrInstr;\n            }\n            break;\n        case STATE_WAIT_SET_BEFORE_ACTION:\n            if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))\n                gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;\n            break;\n        }\n    }\n    // Check if everyone chose actions.\n    if (gBattleCommunication[ACTIONS_CONFIRMED_COUNT] == gBattlersCount)\n        gBattleMainFunc = SetActionsAndBattlersTurnOrder;\n}\n\nvoid SwapTurnOrder(u8 id1, u8 id2)\n{\n    u32 temp;\n\n    SWAP(gActionsByTurnOrder[id1], gActionsByTurnOrder[id2], temp);\n    SWAP(gBattlerByTurnOrder[id1], gBattlerByTurnOrder[id2], temp);\n}\n\nu8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves)\n{\n    u8 strikesFirst = 0;\n    u8 speedMultiplierBattler1 = 0, speedMultiplierBattler2 = 0;\n    u32 speedBattler1 = 0, speedBattler2 = 0;\n    u8 holdEffect = 0;\n    u8 holdEffectParam = 0;\n    u16 moveBattler1 = 0, moveBattler2 = 0;\n\n    if (WEATHER_HAS_EFFECT)\n    {\n        if ((gBattleMons[battler1].ability == ABILITY_SWIFT_SWIM && gBattleWeather & B_WEATHER_RAIN)\n            || (gBattleMons[battler1].ability == ABILITY_CHLOROPHYLL && gBattleWeather & B_WEATHER_SUN))\n            speedMultiplierBattler1 = 2;\n        else\n            speedMultiplierBattler1 = 1;\n        if ((gBattleMons[battler2].ability == ABILITY_SWIFT_SWIM && gBattleWeather & B_WEATHER_RAIN)\n            || (gBattleMons[battler2].ability == ABILITY_CHLOROPHYLL && gBattleWeather & B_WEATHER_SUN))\n            speedMultiplierBattler2 = 2;\n        else\n            speedMultiplierBattler2 = 1;\n    }\n    else\n    {\n        speedMultiplierBattler1 = 1;\n        speedMultiplierBattler2 = 1;\n    }\n\n    speedBattler1 = (gBattleMons[battler1].speed * speedMultiplierBattler1)\n                * (gStatStageRatios[gBattleMons[battler1].statStages[STAT_SPEED]][0])\n                / (gStatStageRatios[gBattleMons[battler1].statStages[STAT_SPEED]][1]);\n\n    if (gBattleMons[battler1].item == ITEM_ENIGMA_BERRY)\n    {\n        holdEffect = gEnigmaBerries[battler1].holdEffect;\n        holdEffectParam = gEnigmaBerries[battler1].holdEffectParam;\n    }\n    else\n    {\n        holdEffect = ItemId_GetHoldEffect(gBattleMons[battler1].item);\n        holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[battler1].item);\n    }\n    // badge boost\n    if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gSaveBlock1Ptr->keyFlags.difficulty != DIFFICULTY_CHALLENGE\n     && FlagGet(FLAG_BADGE03_GET)\n     && GetBattlerSide(battler1) == B_SIDE_PLAYER)\n        speedBattler1 = (speedBattler1 * 110) / 100;\n    if (holdEffect == HOLD_EFFECT_MACHO_BRACE)\n        speedBattler1 /= 2;\n    if (gBattleMons[battler1].status1 & STATUS1_PARALYSIS)\n        speedBattler1 /= 4;\n    if (holdEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * holdEffectParam) / 100)\n        speedBattler1 = UINT_MAX;\n    // check second battlerId's speed\n    speedBattler2 = (gBattleMons[battler2].speed * speedMultiplierBattler2)\n                    * (gStatStageRatios[gBattleMons[battler2].statStages[STAT_SPEED]][0])\n                    / (gStatStageRatios[gBattleMons[battler2].statStages[STAT_SPEED]][1]);\n    if (gBattleMons[battler2].item == ITEM_ENIGMA_BERRY)\n    {\n        holdEffect = gEnigmaBerries[battler2].holdEffect;\n        holdEffectParam = gEnigmaBerries[battler2].holdEffectParam;\n    }\n    else\n    {\n        holdEffect = ItemId_GetHoldEffect(gBattleMons[battler2].item);\n        holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[battler2].item);\n    }\n    // badge boost\n    if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)\n     && FlagGet(FLAG_BADGE03_GET)\n     && GetBattlerSide(battler2) == B_SIDE_PLAYER)\n        speedBattler2 = (speedBattler2 * 110) / 100;\n    if (holdEffect == HOLD_EFFECT_MACHO_BRACE)\n        speedBattler2 /= 2;\n    if (gBattleMons[battler2].status1 & STATUS1_PARALYSIS)\n        speedBattler2 /= 4;\n    if (holdEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * holdEffectParam) / 100)\n        speedBattler2 = UINT_MAX;\n    if (ignoreChosenMoves)\n    {\n        moveBattler1 = MOVE_NONE;\n        moveBattler2 = MOVE_NONE;\n    }\n    else\n    {\n        if (gChosenActionByBattler[battler1] == B_ACTION_USE_MOVE)\n        {\n            if (gProtectStructs[battler1].noValidMoves)\n                moveBattler1 = MOVE_STRUGGLE;\n            else\n                moveBattler1 = gBattleMons[battler1].moves[*(gBattleStruct->chosenMovePositions + battler1)];\n        }\n        else\n            moveBattler1 = MOVE_NONE;\n        if (gChosenActionByBattler[battler2] == B_ACTION_USE_MOVE)\n        {\n            if (gProtectStructs[battler2].noValidMoves)\n                moveBattler2 = MOVE_STRUGGLE;\n            else\n                moveBattler2 = gBattleMons[battler2].moves[*(gBattleStruct->chosenMovePositions + battler2)];\n        }\n        else\n            moveBattler2 = MOVE_NONE;\n    }\n    // both move priorities are different than 0\n    if (gBattleMoves[moveBattler1].priority != 0 || gBattleMoves[moveBattler2].priority != 0)\n    {\n        // both priorities are the same\n        if (gBattleMoves[moveBattler1].priority == gBattleMoves[moveBattler2].priority)\n        {\n            if (speedBattler1 == speedBattler2 && Random() & 1)\n                strikesFirst = 2; // same speeds, same priorities\n            else if (speedBattler1 < speedBattler2)\n                strikesFirst = 1; // battler2 has more speed\n            // else battler1 has more speed\n        }\n        else if (gBattleMoves[moveBattler1].priority < gBattleMoves[moveBattler2].priority)\n            strikesFirst = 1; // battler2's move has greater priority\n        // else battler1's move has greater priority\n    }\n    // both priorities are equal to 0\n    else\n    {\n        if (speedBattler1 == speedBattler2 && Random() & 1)\n            strikesFirst = 2; // same speeds, same priorities\n        else if (speedBattler1 < speedBattler2)\n            strikesFirst = 1; // battler2 has more speed\n        // else battler1 has more speed\n    }\n    return strikesFirst;\n}\n\nstatic void SetActionsAndBattlersTurnOrder(void)\n{\n    s32 turnOrderId = 0;\n    s32 i, j;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)\n    {\n        for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n        {\n            gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler];\n            gBattlerByTurnOrder[turnOrderId] = gActiveBattler;\n            turnOrderId++;\n        }\n    }\n    else\n    {\n        if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n        {\n            for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n            {\n                if (gChosenActionByBattler[gActiveBattler] == B_ACTION_RUN)\n                {\n                    turnOrderId = 5;\n                    break;\n                }\n            }\n        }\n        else if (gChosenActionByBattler[0] == B_ACTION_RUN)\n        {\n            gActiveBattler = 0;\n            turnOrderId = 5;\n        }\n        if (turnOrderId == 5) // One of battlers wants to run.\n        {\n            gActionsByTurnOrder[0] = gChosenActionByBattler[gActiveBattler];\n            gBattlerByTurnOrder[0] = gActiveBattler;\n            turnOrderId = 1;\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (i != gActiveBattler)\n                {\n                    gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[i];\n                    gBattlerByTurnOrder[turnOrderId] = i;\n                    turnOrderId++;\n                }\n            }\n            gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts;\n            gBattleStruct->focusPunchBattlerId = 0;\n            return;\n        }\n        else\n        {\n            for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n            {\n                if (gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_ITEM || gChosenActionByBattler[gActiveBattler] == B_ACTION_SWITCH)\n                {\n                    gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler];\n                    gBattlerByTurnOrder[turnOrderId] = gActiveBattler;\n                    turnOrderId++;\n                }\n            }\n            for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n            {\n                if (gChosenActionByBattler[gActiveBattler] != B_ACTION_USE_ITEM && gChosenActionByBattler[gActiveBattler] != B_ACTION_SWITCH)\n                {\n                    gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler];\n                    gBattlerByTurnOrder[turnOrderId] = gActiveBattler;\n                    turnOrderId++;\n                }\n            }\n            for (i = 0; i < gBattlersCount - 1; i++)\n            {\n                for (j = i + 1; j < gBattlersCount; j++)\n                {\n                    u8 battler1 = gBattlerByTurnOrder[i];\n                    u8 battler2 = gBattlerByTurnOrder[j];\n\n                    if (gActionsByTurnOrder[i] != B_ACTION_USE_ITEM\n                     && gActionsByTurnOrder[j] != B_ACTION_USE_ITEM\n                     && gActionsByTurnOrder[i] != B_ACTION_SWITCH\n                     && gActionsByTurnOrder[j] != B_ACTION_SWITCH)\n                        if (GetWhoStrikesFirst(battler1, battler2, FALSE))\n                            SwapTurnOrder(i, j);\n                }\n            }\n        }\n    }\n    gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts;\n    gBattleStruct->focusPunchBattlerId = 0;\n}\n\nstatic void TurnValuesCleanUp(bool8 var0)\n{\n    s32 i;\n    u8 *dataPtr;\n\n    for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n    {\n        if (var0)\n        {\n            gProtectStructs[gActiveBattler].protected = FALSE;\n            gProtectStructs[gActiveBattler].endured = FALSE;\n        }\n        else\n        {\n            dataPtr = (u8 *)(&gProtectStructs[gActiveBattler]);\n            for (i = 0; i < sizeof(struct ProtectStruct); i++)\n                dataPtr[i] = 0;\n            if (gDisableStructs[gActiveBattler].isFirstTurn)\n                --gDisableStructs[gActiveBattler].isFirstTurn;\n            if (gDisableStructs[gActiveBattler].rechargeTimer)\n            {\n                --gDisableStructs[gActiveBattler].rechargeTimer;\n                if (gDisableStructs[gActiveBattler].rechargeTimer == 0)\n                    gBattleMons[gActiveBattler].status2 &= ~(STATUS2_RECHARGE);\n            }\n        }\n\n        if (gDisableStructs[gActiveBattler].substituteHP == 0)\n            gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE);\n    }\n    gSideTimers[0].followmeTimer = 0;\n    gSideTimers[1].followmeTimer = 0;\n}\n\nstatic void SpecialStatusesClear(void)\n{\n    for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n    {\n        s32 i;\n        u8 *dataPtr = (u8 *)(&gSpecialStatuses[gActiveBattler]);\n\n        for (i = 0; i < sizeof(struct SpecialStatus); i++)\n            dataPtr[i] = 0;\n    }\n}\n\nstatic void CheckFocusPunch_ClearVarsBeforeTurnStarts(void)\n{\n    if (!(gHitMarker & HITMARKER_RUN))\n    {\n        while (gBattleStruct->focusPunchBattlerId < gBattlersCount)\n        {\n            gActiveBattler = gBattlerAttacker = gBattleStruct->focusPunchBattlerId;\n            ++gBattleStruct->focusPunchBattlerId;\n            if (gChosenMoveByBattler[gActiveBattler] == MOVE_FOCUS_PUNCH\n             && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)\n             && !(gDisableStructs[gBattlerAttacker].truantCounter)\n             && !(gProtectStructs[gActiveBattler].noValidMoves))\n            {\n                BattleScriptExecute(BattleScript_FocusPunchSetUp);\n                return;\n            }\n        }\n    }\n    TryClearRageStatuses();\n    gCurrentTurnActionNumber = 0;\n    {\n        // something stupid needed to match\n        u8 zero;\n\n        gCurrentActionFuncId = gActionsByTurnOrder[(zero = 0)];\n    }\n    gDynamicBasePower = 0;\n    gBattleStruct->dynamicMoveType = 0;\n    gBattleMainFunc = RunTurnActionsFunctions;\n    gBattleCommunication[3] = 0;\n    gBattleCommunication[4] = 0;\n    gBattleScripting.multihitMoveEffect = 0;\n    gBattleResources->battleScriptsStack->size = 0;\n}\n\nstatic void RunTurnActionsFunctions(void)\n{\n    if (gBattleOutcome != 0)\n        gCurrentActionFuncId = B_ACTION_FINISHED;\n    *(&gBattleStruct->savedTurnActionNumber) = gCurrentTurnActionNumber;\n    sTurnActionsFuncsTable[gCurrentActionFuncId]();\n\n    if (gCurrentTurnActionNumber >= gBattlersCount) // everyone did their actions, turn finished\n    {\n        gHitMarker &= ~(HITMARKER_PASSIVE_DAMAGE);\n        gBattleMainFunc = sEndTurnFuncsTable[gBattleOutcome & 0x7F];\n    }\n    else\n    {\n        if (gBattleStruct->savedTurnActionNumber != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another battlerId\n        {\n            gHitMarker &= ~(HITMARKER_NO_ATTACKSTRING);\n            gHitMarker &= ~(HITMARKER_UNABLE_TO_USE_MOVE);\n        }\n    }\n}\n\nstatic void HandleEndTurn_BattleWon(void)\n{\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    gCurrentActionFuncId = 0;\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        gBattleTextBuff1[0] = gBattleOutcome;\n        gBattlerAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n        gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost;\n        gBattleOutcome &= ~(B_OUTCOME_LINK_BATTLE_RAN);\n    }\n    else if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER))\n    {\n        BattleStopLowHpSound();\n        PlayBGM(MUS_VICTORY_TRAINER);\n        gBattlescriptCurrInstr = BattleScript_BattleTowerTrainerBattleWon;\n    }\n    else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & BATTLE_TYPE_LINK))\n    {\n        BattleStopLowHpSound();\n        if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n            gBattlescriptCurrInstr = BattleScript_MasterTrainerBattleWon;\n        else\n            gBattlescriptCurrInstr = BattleScript_LocalTrainerBattleWon;\n        switch (sTrainers[gTrainerBattleOpponent_A].trainerClass)\n        {\n        case TRAINER_CLASS_LEADER:\n        case TRAINER_CLASS_CHAMPION:\n        case TRAINER_CLASS_PKMN_PROF:\n            PlayBGM(MUS_VICTORY_GYM_LEADER);\n            break;\n        case TRAINER_CLASS_BOSS:\n        case TRAINER_CLASS_TEAM_ROCKET:\n        case TRAINER_CLASS_COOLTRAINER:\n        case TRAINER_CLASS_ELITE_FOUR:\n        case TRAINER_CLASS_GENTLEMAN:\n        default:\n            PlayBGM(MUS_VICTORY_TRAINER);\n            break;\n        }\n    }\n    else\n    {\n        gBattlescriptCurrInstr = BattleScript_PayDayMoneyAndPickUpItems;\n    }\n    gBattleMainFunc = HandleEndTurn_FinishBattle;\n}\n\nstatic void HandleEndTurn_BattleLost(void)\n{\n    gCurrentActionFuncId = 0;\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        gBattleTextBuff1[0] = gBattleOutcome;\n        gBattlerAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n        gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost;\n        gBattleOutcome &= ~(B_OUTCOME_LINK_BATTLE_RAN);\n    }\n    else\n    {\n        if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && GetTrainerBattleMode() == TRAINER_BATTLE_EARLY_RIVAL)\n        {\n            if (GetRivalBattleFlags() & RIVAL_BATTLE_HEAL_AFTER)\n                gBattleCommunication[MULTISTRING_CHOOSER] = 1; // Dont do white out text\n            else\n                gBattleCommunication[MULTISTRING_CHOOSER] = 2; // Do white out text\n            gBattlerAttacker = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        }\n        else\n        {\n            gBattleCommunication[MULTISTRING_CHOOSER] = 0;\n        }\n        if(!FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n            gBattlescriptCurrInstr = BattleScript_LocalBattleLost;\n        else\n            gBattlescriptCurrInstr = BattleScript_EReaderOrSecretBaseTrainerEnd;\n    }\n    gBattleMainFunc = HandleEndTurn_FinishBattle;\n}\n\nstatic void HandleEndTurn_RanFromBattle(void)\n{\n    gCurrentActionFuncId = 0;\n    switch (gProtectStructs[gBattlerAttacker].fleeType)\n    {\n    default:\n        gBattlescriptCurrInstr = BattleScript_GotAwaySafely;\n        break;\n    case 1:\n        gBattlescriptCurrInstr = BattleScript_SmokeBallEscape;\n        break;\n    case 2:\n        gBattlescriptCurrInstr = BattleScript_RanAwayUsingMonAbility;\n        break;\n    }\n    gBattleMainFunc = HandleEndTurn_FinishBattle;\n}\n\nstatic void HandleEndTurn_MonFled(void)\n{\n    gCurrentActionFuncId = 0;\n    PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker]);\n    gBattlescriptCurrInstr = BattleScript_WildMonFled;\n    gBattleMainFunc = HandleEndTurn_FinishBattle;\n}\n\nstatic void HandleEndTurn_FinishBattle(void)\n{\n    if (gCurrentActionFuncId == B_ACTION_TRY_FINISH || gCurrentActionFuncId == B_ACTION_FINISHED)\n    {\n        if (!(gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_SAFARI | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_LINK)))\n        {\n            for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n            {\n                if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n                {\n                    if (gBattleResults.playerMon1Species == SPECIES_NONE)\n                    {\n                        gBattleResults.playerMon1Species = gBattleMons[gActiveBattler].species;\n                        StringCopy(gBattleResults.playerMon1Name, gBattleMons[gActiveBattler].nickname);\n                    }\n                    else\n                    {\n                        gBattleResults.playerMon2Species = gBattleMons[gActiveBattler].species;\n                        StringCopy(gBattleResults.playerMon2Name, gBattleMons[gActiveBattler].nickname);\n                    }\n                }\n            }\n        }\n        TrySetQuestLogBattleEvent();\n        if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n            ClearRematchStateByTrainerId();\n        BeginFastPaletteFade(3);\n        FadeOutMapMusic(5);\n        gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions;\n        gCB2_AfterEvolution = BattleMainCB2;\n    }\n    else if (gBattleControllerExecFlags == 0)\n    {\n        gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();\n    }\n}\n\nstatic void FreeResetData_ReturnToOvOrDoEvolutions(void)\n{\n    if (!gPaletteFade.active)\n    {\n        ResetSpriteData();\n        if (gLeveledUpInBattle == 0 || gBattleOutcome != B_OUTCOME_WON)\n            gBattleMainFunc = ReturnFromBattleToOverworld;\n        else\n            gBattleMainFunc = TryEvolvePokemon;\n        FreeAllWindowBuffers();\n        if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))\n        {\n            FreeMonSpritesGfx();\n            FreeBattleSpritesData();\n            FreeBattleResources();\n        }\n    }\n}\n\nstatic void TryEvolvePokemon(void)\n{\n    s32 i;\n\n    while (gLeveledUpInBattle != 0)\n    {\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (gLeveledUpInBattle & gBitTable[i])\n            {\n                u16 species;\n                u8 levelUpBits = gLeveledUpInBattle;\n\n                levelUpBits &= ~(gBitTable[i]);\n                gLeveledUpInBattle = levelUpBits;\n\n                species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_NORMAL, levelUpBits);\n                if (species != SPECIES_NONE)\n                {\n                    gBattleMainFunc = WaitForEvoSceneToFinish;\n                    EvolutionScene(&gPlayerParty[i], species, 0x81, i);\n                    return;\n                }\n            }\n        }\n    }\n    gBattleMainFunc = ReturnFromBattleToOverworld;\n}\n\nstatic void WaitForEvoSceneToFinish(void)\n{\n    if (gMain.callback2 == BattleMainCB2)\n        gBattleMainFunc = TryEvolvePokemon;\n}\n\nstatic void ReturnFromBattleToOverworld(void)\n{\n    if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))\n    {\n        RandomlyGivePartyPokerus(gPlayerParty);\n        PartySpreadPokerus(gPlayerParty);\n    }\n    if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) || !gReceivedRemoteLinkPlayers)\n    {\n        gSpecialVar_Result = gBattleOutcome;\n        gMain.inBattle = FALSE;\n        gMain.callback1 = gPreBattleCallback1;\n        if (gBattleTypeFlags & BATTLE_TYPE_ROAMER)\n        {\n            UpdateRoamerHPStatus(&gEnemyParty[0]);\n            if ((gBattleOutcome == B_OUTCOME_WON) || gBattleOutcome == B_OUTCOME_CAUGHT) // & with B_OUTCOME_WON (1) will return TRUE and deactivates the roamer.\n            {\n                SetRoamerInactive();\n                if(gBattleOutcome == B_OUTCOME_CAUGHT) //caught roamer\n                {\n                    u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0);\n                    switch(species)\n                    {\n                        case SPECIES_RAIKOU:\n                            FlagSet(FLAG_CAUGHT_RAIKOU);\n                            break;\n                        case SPECIES_ENTEI:\n                            FlagSet(FLAG_CAUGHT_ENTEI);\n                            break;\n                        default:\n                            FlagSet(FLAG_CAUGHT_SUICUNE);\n                            break;\n                    }\n                }\n            }\n        }\n        m4aSongNumStop(SE_LOW_HEALTH);\n        SetMainCallback2(gMain.savedCallback);\n    }\n}\n\nvoid RunBattleScriptCommands_PopCallbacksStack(void)\n{\n    if (gCurrentActionFuncId == B_ACTION_TRY_FINISH || gCurrentActionFuncId == B_ACTION_FINISHED)\n    {\n        if (gBattleResources->battleCallbackStack->size != 0)\n            gBattleResources->battleCallbackStack->size--;\n        gBattleMainFunc = gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size];\n    }\n    else\n    {\n        if (gBattleControllerExecFlags == 0)\n            gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();\n    }\n}\n\nvoid RunBattleScriptCommands(void)\n{\n    if (gBattleControllerExecFlags == 0)\n        gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();\n}\n\nstatic void HandleAction_UseMove(void)\n{\n    u8 side;\n    u8 var = 4;\n\n    gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];\n    if (*(&gBattleStruct->absentBattlerFlags) & gBitTable[gBattlerAttacker])\n    {\n        gCurrentActionFuncId = B_ACTION_FINISHED;\n        return;\n    }\n    gCritMultiplier = 1;\n    gBattleScripting.dmgMultiplier = 1;\n    gBattleStruct->atkCancellerTracker = 0;\n    gMoveResultFlags = 0;\n    gMultiHitCounter = 0;\n    gBattleCommunication[MISS_TYPE] = 0;\n    gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerAttacker);\n    // choose move\n    if (gProtectStructs[gBattlerAttacker].noValidMoves)\n    {\n        gProtectStructs[gBattlerAttacker].noValidMoves = 0;\n        gCurrentMove = gChosenMove = MOVE_STRUGGLE;\n        gHitMarker |= HITMARKER_NO_PPDEDUCT;\n        *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(MOVE_STRUGGLE, NO_TARGET_OVERRIDE);\n    }\n    else if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE)\n    {\n        gCurrentMove = gChosenMove = gLockedMoves[gBattlerAttacker];\n    }\n    // encore forces you to use the same move\n    else if (gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE\n          && gDisableStructs[gBattlerAttacker].encoredMove == gBattleMons[gBattlerAttacker].moves[gDisableStructs[gBattlerAttacker].encoredMovePos])\n    {\n        gCurrentMove = gChosenMove = gDisableStructs[gBattlerAttacker].encoredMove;\n        gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos;\n        *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);\n    }\n    // check if the encored move wasn't overwritten\n    else if (gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE\n          && gDisableStructs[gBattlerAttacker].encoredMove != gBattleMons[gBattlerAttacker].moves[gDisableStructs[gBattlerAttacker].encoredMovePos])\n    {\n        gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos;\n        gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos];\n        gDisableStructs[gBattlerAttacker].encoredMove = MOVE_NONE;\n        gDisableStructs[gBattlerAttacker].encoredMovePos = 0;\n        gDisableStructs[gBattlerAttacker].encoreTimer = 0;\n        *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);\n    }\n    else if (gBattleMons[gBattlerAttacker].moves[gCurrMovePos] != gChosenMoveByBattler[gBattlerAttacker])\n    {\n        gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos];\n        *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);\n    }\n    else\n    {\n        gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos];\n    }\n    if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n        gBattleResults.lastUsedMovePlayer = gCurrentMove;\n    else\n        gBattleResults.lastUsedMoveOpponent = gCurrentMove;\n    // choose target\n    side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;\n    if (gSideTimers[side].followmeTimer != 0\n     && gBattleMoves[gCurrentMove].target == MOVE_TARGET_SELECTED\n     && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gSideTimers[side].followmeTarget)\n     && gBattleMons[gSideTimers[side].followmeTarget].hp != 0)\n    {\n        gBattlerTarget = gSideTimers[side].followmeTarget;\n    }\n    else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n          && gSideTimers[side].followmeTimer == 0\n          && (gBattleMoves[gCurrentMove].power != 0\n             || gBattleMoves[gCurrentMove].target != MOVE_TARGET_USER)\n          && gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_LIGHTNING_ROD\n          && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)\n    {\n        side = GetBattlerSide(gBattlerAttacker);\n        for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n            if (side != GetBattlerSide(gActiveBattler)\n             && *(gBattleStruct->moveTarget + gBattlerAttacker) != gActiveBattler\n             && gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD\n             && GetBattlerTurnOrderNum(gActiveBattler) < var)\n                var = GetBattlerTurnOrderNum(gActiveBattler);\n        if (var == 4)\n        {\n            if (gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM)\n            {\n                if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n                {\n                    if (Random() & 1)\n                        gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n                    else\n                        gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n                }\n                else\n                {\n                    if (Random() & 1)\n                        gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n                    else\n                        gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);\n                }\n            }\n            else\n            {\n                gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker);\n            }\n            if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])\n            {\n                if (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget))\n                {\n                    gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK);\n                }\n                else\n                {\n                    gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_SIDE);\n                    if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])\n                        gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK);\n                }\n            }\n        }\n        else\n        {\n            gActiveBattler = gBattlerByTurnOrder[var];\n            RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability);\n            gSpecialStatuses[gActiveBattler].lightningRodRedirected = 1;\n            gBattlerTarget = gActiveBattler;\n        }\n    }\n    else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE\n          && gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM)\n    {\n        if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n        {\n            if (Random() & 1)\n                gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n            else\n                gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n        }\n        else\n        {\n            if (Random() & 1)\n                gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n            else\n                gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);\n        }\n        if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]\n         && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget))\n            gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK);\n    }\n    else\n    {\n        gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker);\n        if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])\n        {\n            if (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget))\n            {\n                gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK);\n            }\n            else\n            {\n                gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_SIDE);\n                if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])\n                    gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK);\n            }\n        }\n    }\n    gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];\n    gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;\n}\n\nstatic void HandleAction_Switch(void)\n{\n    gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    gActionSelectionCursor[gBattlerAttacker] = 0;\n    gMoveSelectionCursor[gBattlerAttacker] = 0;\n    PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, *(gBattleStruct->battlerPartyIndexes + gBattlerAttacker));\n    gBattleScripting.battler = gBattlerAttacker;\n    gBattlescriptCurrInstr = BattleScript_ActionSwitch;\n    gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;\n    if (gBattleResults.playerSwitchesCounter < 255)\n        ++gBattleResults.playerSwitchesCounter;\n}\n\nstatic void HandleAction_UseItem(void)\n{\n    gBattlerAttacker = gBattlerTarget = gBattlerByTurnOrder[gCurrentTurnActionNumber];\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    ClearFuryCutterDestinyBondGrudge(gBattlerAttacker);\n    gLastUsedItem = gBattleBufferB[gBattlerAttacker][1] | (gBattleBufferB[gBattlerAttacker][2] << 8);\n    if (gLastUsedItem <= ITEM_PREMIER_BALL) // is ball\n    {\n        gBattlescriptCurrInstr = gBattlescriptsForBallThrow[gLastUsedItem];\n    }\n    else if (gLastUsedItem == ITEM_POKE_DOLL || gLastUsedItem == ITEM_FLUFFY_TAIL)\n    {\n        gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[0];\n    }\n    else if (gLastUsedItem == ITEM_POKE_FLUTE)\n    {\n        gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[1];\n    }\n    else if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n    {\n        gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0];\n    }\n    else\n    {\n        gBattleScripting.battler = gBattlerAttacker;\n        switch (*(gBattleStruct->AI_itemType + (gBattlerAttacker >> 1)))\n        {\n        case AI_ITEM_FULL_RESTORE:\n        case AI_ITEM_HEAL_HP:\n            break;\n        case AI_ITEM_CURE_CONDITION:\n            gBattleCommunication[MULTISTRING_CHOOSER] = 0;\n            if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1)\n            {\n                if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 0x3E)\n                    gBattleCommunication[MULTISTRING_CHOOSER] = 5;\n            }\n            else\n            {\n                while (!(*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1))\n                {\n                    *(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1;\n                    gBattleCommunication[MULTISTRING_CHOOSER]++;\n                }\n            }\n            break;\n        case AI_ITEM_X_STAT:\n            gBattleCommunication[MULTISTRING_CHOOSER] = 4;\n            if (*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & 0x80)\n            {\n                gBattleCommunication[MULTISTRING_CHOOSER] = 5;\n            }\n            else\n            {\n                PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK);\n                PREPARE_STRING_BUFFER(gBattleTextBuff2, CHAR_X);\n                while (!((*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1))) & 1))\n                {\n                    *(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1;\n                    ++gBattleTextBuff1[2];\n                }\n                gBattleScripting.animArg1 = gBattleTextBuff1[2] + 14;\n                gBattleScripting.animArg2 = 0;\n            }\n            break;\n        case AI_ITEM_GUARD_SPECS:\n            if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n                gBattleCommunication[MULTISTRING_CHOOSER] = 2;\n            else\n                gBattleCommunication[MULTISTRING_CHOOSER] = 0;\n            break;\n        }\n\n        gBattlescriptCurrInstr = gBattlescriptsForUsingItem[*(gBattleStruct->AI_itemType + gBattlerAttacker / 2)];\n    }\n    gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;\n}\n\nbool8 TryRunFromBattle(u8 battler)\n{\n    bool8 effect = FALSE;\n    u8 holdEffect;\n    u8 speedVar;\n\n    if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY)\n        holdEffect = gEnigmaBerries[battler].holdEffect;\n    else\n        holdEffect = ItemId_GetHoldEffect(gBattleMons[battler].item);\n    gPotentialItemEffectBattler = battler;\n    if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN)\n    {\n        gLastUsedItem = gBattleMons[battler].item;\n        gProtectStructs[battler].fleeType = FLEE_ITEM;\n        effect++;\n    }\n    else if (gBattleMons[battler].ability == ABILITY_RUN_AWAY)\n    {\n        gLastUsedAbility = ABILITY_RUN_AWAY;\n        gProtectStructs[battler].fleeType = FLEE_ABILITY;\n        effect++;\n    }\n    else if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags))\n    {\n        if (GetBattlerSide(battler) == B_SIDE_PLAYER)\n            effect++;\n    }\n    else\n    {\n        if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))\n        {\n            if (gBattleMons[battler].speed < gBattleMons[BATTLE_OPPOSITE(battler)].speed)\n            {\n                speedVar = (gBattleMons[battler].speed * 128) / (gBattleMons[BATTLE_OPPOSITE(battler)].speed) + (gBattleStruct->runTries * 30);\n                if (speedVar > (Random() & 0xFF))\n                    effect++;\n            }\n            else // same speed or faster\n            {\n                effect++;\n            }\n        }\n\n        ++gBattleStruct->runTries;\n    }\n    if (effect != 0)\n    {\n        gCurrentTurnActionNumber = gBattlersCount;\n        gBattleOutcome = B_OUTCOME_RAN;\n    }\n    return effect;\n}\n\nstatic void HandleAction_Run(void)\n{\n    gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];\n\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        gCurrentTurnActionNumber = gBattlersCount;\n        for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n        {\n            if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n            {\n                if (gChosenActionByBattler[gActiveBattler] == B_ACTION_RUN)\n                    gBattleOutcome |= B_OUTCOME_LOST;\n            }\n            else\n            {\n                if (gChosenActionByBattler[gActiveBattler] == B_ACTION_RUN)\n                    gBattleOutcome |= B_OUTCOME_WON;\n            }\n        }\n        gBattleOutcome |= B_OUTCOME_LINK_BATTLE_RAN;\n    }\n    else\n    {\n        if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n        {\n            if (!TryRunFromBattle(gBattlerAttacker)) // failed to run away\n            {\n                ClearFuryCutterDestinyBondGrudge(gBattlerAttacker);\n                gBattleCommunication[MULTISTRING_CHOOSER] = 3;\n                gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString;\n                gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;\n            }\n        }\n        else\n        {\n            if (gBattleMons[gBattlerAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))\n            {\n                gBattleCommunication[MULTISTRING_CHOOSER] = 4;\n                gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString;\n                gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;\n            }\n            else\n            {\n                gCurrentTurnActionNumber = gBattlersCount;\n                gBattleOutcome = B_OUTCOME_MON_FLED;\n            }\n        }\n    }\n}\n\nstatic void HandleAction_WatchesCarefully(void)\n{\n    gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    if (gBattleStruct->safariRockThrowCounter != 0)\n    {\n        --gBattleStruct->safariRockThrowCounter;\n        if (gBattleStruct->safariRockThrowCounter == 0)\n        {\n            *(&gBattleStruct->safariCatchFactor) = gSpeciesInfo[GetMonData(gEnemyParty, MON_DATA_SPECIES)].catchRate * 100 / 1275;\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_WATCHING;\n        }\n        else\n        {\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_ANGRY;\n        }\n    }\n    else\n    {\n        if (gBattleStruct->safariBaitThrowCounter != 0)\n        {\n            --gBattleStruct->safariBaitThrowCounter;\n            if (gBattleStruct->safariBaitThrowCounter == 0)\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_WATCHING;\n            else\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_EATING;\n        }\n        else\n        {\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MON_WATCHING;\n        }\n    }\n    gBattlescriptCurrInstr = gBattlescriptsForSafariActions[0];\n    gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;\n}\n\nstatic void HandleAction_SafariZoneBallThrow(void)\n{\n    gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    --gNumSafariBalls;\n    gLastUsedItem = ITEM_SAFARI_BALL;\n    gBattlescriptCurrInstr = gBattlescriptsForBallThrow[ITEM_SAFARI_BALL];\n    gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;\n}\n\nstatic void HandleAction_ThrowBait(void)\n{\n    gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    gBattleStruct->safariBaitThrowCounter += Random() % 5 + 2;\n    if (gBattleStruct->safariBaitThrowCounter > 6)\n        gBattleStruct->safariBaitThrowCounter = 6;\n    gBattleStruct->safariRockThrowCounter = 0;\n    gBattleStruct->safariCatchFactor >>= 1;\n    if (gBattleStruct->safariCatchFactor <= 2)\n        gBattleStruct->safariCatchFactor = 3;\n    gBattlescriptCurrInstr = gBattlescriptsForSafariActions[2];\n    gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;\n}\n\nstatic void HandleAction_ThrowRock(void)\n{\n    gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    gBattleStruct->safariRockThrowCounter += Random() % 5 + 2;\n    if (gBattleStruct->safariRockThrowCounter > 6)\n        gBattleStruct->safariRockThrowCounter = 6;\n    gBattleStruct->safariBaitThrowCounter = 0;\n    gBattleStruct->safariCatchFactor <<= 1;\n    if (gBattleStruct->safariCatchFactor > 20)\n        gBattleStruct->safariCatchFactor = 20;\n    gBattlescriptCurrInstr = gBattlescriptsForSafariActions[1];\n    gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;\n}\n\nstatic void HandleAction_SafariZoneRun(void)\n{\n    gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];\n    PlaySE(SE_FLEE);\n    gCurrentTurnActionNumber = gBattlersCount;\n    gBattleOutcome = B_OUTCOME_RAN;\n}\n\nstatic void HandleAction_OldManBallThrow(void)\n{\n    gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker])\n    gBattlescriptCurrInstr = gBattlescriptsForSafariActions[3];\n    gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;\n    gActionsByTurnOrder[1] = B_ACTION_FINISHED;\n}\n\nstatic void HandleAction_TryFinish(void)\n{\n    if (!HandleFaintedMonActions())\n    {\n        gBattleStruct->faintedActionsState = 0;\n        gCurrentActionFuncId = B_ACTION_FINISHED;\n    }\n}\n\nstatic void HandleAction_NothingIsFainted(void)\n{\n    ++gCurrentTurnActionNumber;\n    gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber];\n    gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED\n                    | HITMARKER_NO_PPDEDUCT | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_IGNORE_ON_AIR\n                    | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_PASSIVE_DAMAGE\n                    | HITMARKER_OBEYS | HITMARKER_WAKE_UP_CLEAR | HITMARKER_SYNCHRONISE_EFFECT\n                    | HITMARKER_CHARGING | HITMARKER_NEVER_SET);\n}\n\nstatic void HandleAction_ActionFinished(void)\n{\n    ++gCurrentTurnActionNumber;\n    gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber];\n    SpecialStatusesClear();\n    gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED\n                    | HITMARKER_NO_PPDEDUCT | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_IGNORE_ON_AIR\n                    | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_PASSIVE_DAMAGE\n                    | HITMARKER_OBEYS | HITMARKER_WAKE_UP_CLEAR | HITMARKER_SYNCHRONISE_EFFECT\n                    | HITMARKER_CHARGING | HITMARKER_NEVER_SET);\n    gCurrentMove = MOVE_NONE;\n    gBattleMoveDamage = 0;\n    gMoveResultFlags = 0;\n    gBattleScripting.animTurn = 0;\n    gBattleScripting.animTargetsHit = 0;\n    gLastLandedMoves[gBattlerAttacker] = 0;\n    gLastHitByType[gBattlerAttacker] = 0;\n    gBattleStruct->dynamicMoveType = 0;\n    gDynamicBasePower = 0;\n    gBattleScripting.moveendState = 0;\n    gBattleCommunication[MOVE_EFFECT_BYTE] = 0;\n    gBattleCommunication[ACTIONS_CONFIRMED_COUNT] = 0;\n    gBattleScripting.multihitMoveEffect = 0;\n    gBattleResources->battleScriptsStack->size = 0;\n}\n"
  },
  {
    "path": "src/battle_message.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"strings.h\"\n#include \"battle_message.h\"\n#include \"link.h\"\n#include \"event_scripts.h\"\n#include \"event_data.h\"\n#include \"item.h\"\n#include \"battle_tower.h\"\n#include \"trainer_tower.h\"\n#include \"battle_setup.h\"\n#include \"field_specials.h\"\n#include \"new_menu_helpers.h\"\n#include \"battle_controllers.h\"\n#include \"graphics.h\"\n#include \"battle_ai_switch_items.h\"\n#include \"constants/moves.h\"\n#include \"constants/items.h\"\n#include \"constants/trainers.h\"\n#include \"constants/weather.h\"\n\nstruct BattleWindowText\n{\n    u8 fillValue;\n    u8 fontId;\n    u8 x;\n    u8 y;\n    u8 letterSpacing;\n    u8 lineSpacing;\n    u8 speed;\n    u8 fgColor;\n    u8 bgColor;\n    u8 shadowColor;\n};\n\nstatic EWRAM_DATA u8 sBattlerAbilities[MAX_BATTLERS_COUNT] = {};\nstatic EWRAM_DATA struct BattleMsgData *sBattleMsgDataPtr = NULL;\n\nstatic void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst);\n\nstatic const u8 sText_Empty1[] = _(\"\");\nstatic const u8 sText_Trainer1LoseText[] = _(\"{B_TRAINER1_LOSE_TEXT}\");\nstatic const u8 sText_Trainer2LoseText[] = _(\"{B_TRAINER2_LOSE_TEXT}\");\nstatic const u8 sText_Trainer1RecallPkmn1[] = _(\"{B_TRAINER1_NAME}: {B_OPPONENT_MON1_NAME}, come back!\");\nstatic const u8 sText_Trainer1WinText[] = _(\"{B_TRAINER1_WIN_TEXT}\");\nstatic const u8 sText_Trainer1RecallPkmn2[] = _(\"{B_TRAINER1_NAME}: {B_OPPONENT_MON2_NAME}, come back!\");\nstatic const u8 sText_Trainer1RecallBoth[] = _(\"{B_TRAINER1_NAME}: {B_OPPONENT_MON1_NAME} and\\n{B_OPPONENT_MON2_NAME}, come back!\");\nstatic const u8 sText_Trainer2WinText[] = _(\"{B_TRAINER2_WIN_TEXT}\");\nstatic const u8 sText_PkmnGainedEXP[] = _(\"{B_BUFF1} gained{B_BUFF2}\\n{B_BUFF3} EXP. Points!\\p\");\nstatic const u8 sText_EmptyString4[] = _(\"\");\nstatic const u8 sText_ABoosted[] = _(\" a boosted\");\nstatic const u8 sText_PkmnGrewToLv[] = _(\"{B_BUFF1} grew to\\nLV. {B_BUFF2}!{WAIT_SE}\\p\");\nstatic const u8 sText_PkmnLearnedMove[] = _(\"{B_BUFF1} learned\\n{B_BUFF2}!{WAIT_SE}\\p\");\nstatic const u8 sText_TryToLearnMove1[] = _(\"{B_BUFF1} is trying to\\nlearn {B_BUFF2}.\\p\");\nstatic const u8 sText_TryToLearnMove2[] = _(\"But, {B_BUFF1} can't learn\\nmore than four moves.\\p\");\nstatic const u8 sText_TryToLearnMove3[] = _(\"Delete a move to make\\nroom for {B_BUFF2}?\");\nstatic const u8 sText_PkmnForgotMove[] = _(\"{B_BUFF1} forgot\\n{B_BUFF2}.\\p\");\nstatic const u8 sText_StopLearningMove[] = _(\"{PAUSE 32}Stop learning\\n{B_BUFF2}?\");\nstatic const u8 sText_DidNotLearnMove[] = _(\"{B_BUFF1} did not learn\\n{B_BUFF2}.\\p\");\nstatic const u8 sText_UseNextPkmn[] = _(\"Use next POKéMON?\");\nstatic const u8 sText_AttackMissed[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s\\nattack missed!\");\nstatic const u8 sText_PkmnProtectedItself[] = _(\"{B_DEF_NAME_WITH_PREFIX}\\nprotected itself!\");\nstatic const u8 sText_AvoidedDamage[] = _(\"{B_DEF_NAME_WITH_PREFIX} avoided\\ndamage with {B_DEF_ABILITY}!\");\nstatic const u8 sText_PkmnMakesGroundMiss[] = _(\"{B_DEF_NAME_WITH_PREFIX} makes GROUND\\nmoves miss with {B_DEF_ABILITY}!\");\nstatic const u8 sText_PkmnAvoidedAttack[] = _(\"{B_DEF_NAME_WITH_PREFIX} avoided\\nthe attack!\");\nstatic const u8 sText_ItDoesntAffect[] = _(\"It doesn't affect\\n{B_DEF_NAME_WITH_PREFIX}…\");\nstatic const u8 sText_AttackerFainted[] = _(\"{B_ATK_NAME_WITH_PREFIX}\\nfainted!\\p\");\nstatic const u8 sText_TargetFainted[] = _(\"{B_DEF_NAME_WITH_PREFIX}\\nfainted!\\p\");\nstatic const u8 sText_PlayerGotMoney[] = _(\"{B_PLAYER_NAME} got ¥{B_BUFF1}\\nfor winning!\\p\");\nstatic const u8 sText_PlayerWhiteout[] = _(\"{B_PLAYER_NAME} is out of\\nusable POKéMON!\\p\");\nstatic const u8 sText_PlayerPanicked[] = _(\"{B_PLAYER_NAME} panicked and lost ¥{B_BUFF1}…\\p… … … …\\p{B_PLAYER_NAME} whited out!{PAUSE_UNTIL_PRESS}\");\nstatic const u8 sText_PlayerWhiteoutAgainstTrainer[] = _(\"{B_PLAYER_NAME} is out of\\nusable POKéMON!\\pPlayer lost against\\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!{PAUSE_UNTIL_PRESS}\");\nstatic const u8 sText_PlayerPaidAsPrizeMoney[] = _(\"{B_PLAYER_NAME} paid ¥{B_BUFF1} as the prize\\nmoney…\\p… … … …\\p{B_PLAYER_NAME} whited out!{PAUSE_UNTIL_PRESS}\");\nstatic const u8 sText_PlayerWhiteout2[] = _(\"{B_PLAYER_NAME} whited out!{PAUSE_UNTIL_PRESS}\");\nstatic const u8 sText_PreventsEscape[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX} prevents\\nescape with {B_SCR_ACTIVE_ABILITY}!\\p\");\nstatic const u8 sText_CantEscape2[] = _(\"Can't escape!\\p\");\nstatic const u8 sText_AttackerCantEscape[] = _(\"{B_ATK_NAME_WITH_PREFIX} can't escape!\");\nstatic const u8 sText_HitXTimes[] = _(\"Hit {B_BUFF1} time(s)!\");\nstatic const u8 sText_PkmnFellAsleep[] = _(\"{B_EFF_NAME_WITH_PREFIX}\\nfell asleep!\");\nstatic const u8 sText_PkmnMadeSleep[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nmade {B_EFF_NAME_WITH_PREFIX} sleep!\");\nstatic const u8 sText_PkmnAlreadyAsleep[] = _(\"{B_DEF_NAME_WITH_PREFIX} is\\nalready asleep!\");\nstatic const u8 sText_PkmnAlreadyAsleep2[] = _(\"{B_ATK_NAME_WITH_PREFIX} is\\nalready asleep!\");\nstatic const u8 sText_PkmnWasntAffected[] = _(\"{B_DEF_NAME_WITH_PREFIX}\\nwasn't affected!\");\nstatic const u8 sText_PkmnWasPoisoned[] = _(\"{B_EFF_NAME_WITH_PREFIX}\\nwas poisoned!\");\nstatic const u8 sText_PkmnPoisonedBy[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\npoisoned {B_EFF_NAME_WITH_PREFIX}!\");\nstatic const u8 sText_PkmnHurtByPoison[] = _(\"{B_ATK_NAME_WITH_PREFIX} is hurt\\nby poison!\");\nstatic const u8 sText_PkmnAlreadyPoisoned[] = _(\"{B_DEF_NAME_WITH_PREFIX} is already\\npoisoned.\");\nstatic const u8 sText_PkmnBadlyPoisoned[] = _(\"{B_EFF_NAME_WITH_PREFIX} is badly\\npoisoned!\");\nstatic const u8 sText_PkmnEnergyDrained[] = _(\"{B_DEF_NAME_WITH_PREFIX} had its\\nenergy drained!\");\nstatic const u8 sText_PkmnWasBurned[] = _(\"{B_EFF_NAME_WITH_PREFIX} was burned!\");\nstatic const u8 sText_PkmnBurnedBy[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nburned {B_EFF_NAME_WITH_PREFIX}!\");\nstatic const u8 sText_PkmnHurtByBurn[] = _(\"{B_ATK_NAME_WITH_PREFIX} is hurt\\nby its burn!\");\nstatic const u8 sText_PkmnAlreadyHasBurn[] = _(\"{B_DEF_NAME_WITH_PREFIX} already\\nhas a burn.\");\nstatic const u8 sText_PkmnWasFrozen[] = _(\"{B_EFF_NAME_WITH_PREFIX} was\\nfrozen solid!\");\nstatic const u8 sText_PkmnFrozenBy[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nfroze {B_EFF_NAME_WITH_PREFIX} solid!\");\nstatic const u8 sText_PkmnIsFrozen[] = _(\"{B_ATK_NAME_WITH_PREFIX} is\\nfrozen solid!\");\nstatic const u8 sText_PkmnWasDefrosted[] = _(\"{B_DEF_NAME_WITH_PREFIX} was\\ndefrosted!\");\nstatic const u8 sText_PkmnWasDefrosted2[] = _(\"{B_ATK_NAME_WITH_PREFIX} was\\ndefrosted!\");\nstatic const u8 sText_PkmnWasDefrostedBy[] = _(\"{B_ATK_NAME_WITH_PREFIX} was\\ndefrosted by {B_CURRENT_MOVE}!\");\nstatic const u8 sText_PkmnWasParalyzed[] = _(\"{B_EFF_NAME_WITH_PREFIX} is paralyzed!\\nIt may be unable to move!\");\nstatic const u8 sText_PkmnWasParalyzedBy[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nparalyzed {B_EFF_NAME_WITH_PREFIX}!\\lIt may be unable to move!\");\nstatic const u8 sText_PkmnIsParalyzed[] = _(\"{B_ATK_NAME_WITH_PREFIX} is paralyzed!\\nIt can't move!\");\nstatic const u8 sText_PkmnIsAlreadyParalyzed[] = _(\"{B_DEF_NAME_WITH_PREFIX} is\\nalready paralyzed!\");\nstatic const u8 sText_PkmnHealedParalysis[] = _(\"{B_DEF_NAME_WITH_PREFIX} was\\nhealed of paralysis!\");\nstatic const u8 sText_PkmnDreamEaten[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s\\ndream was eaten!\");\nstatic const u8 sText_StatsWontIncrease[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\\nwon't go higher!\");\nstatic const u8 sText_StatsWontDecrease[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\\nwon't go lower!\");\nstatic const u8 sText_TeamStoppedWorking[] = _(\"Your team's {B_BUFF1}\\nstopped working!\");\nstatic const u8 sText_FoeStoppedWorking[] = _(\"The foe's {B_BUFF1}\\nstopped working!\");\nstatic const u8 sText_PkmnIsConfused[] = _(\"{B_ATK_NAME_WITH_PREFIX} is\\nconfused!\");\nstatic const u8 sText_PkmnHealedConfusion[] = _(\"{B_ATK_NAME_WITH_PREFIX} snapped\\nout of confusion!\");\nstatic const u8 sText_PkmnWasConfused[] = _(\"{B_EFF_NAME_WITH_PREFIX} became\\nconfused!\");\nstatic const u8 sText_PkmnAlreadyConfused[] = _(\"{B_DEF_NAME_WITH_PREFIX} is\\nalready confused!\");\nstatic const u8 sText_PkmnFellInLove[] = _(\"{B_DEF_NAME_WITH_PREFIX}\\nfell in love!\");\nstatic const u8 sText_PkmnInLove[] = _(\"{B_ATK_NAME_WITH_PREFIX} is in love\\nwith {B_SCR_ACTIVE_NAME_WITH_PREFIX}!\");\nstatic const u8 sText_PkmnImmobilizedByLove[] = _(\"{B_ATK_NAME_WITH_PREFIX} is\\nimmobilized by love!\");\nstatic const u8 sText_PkmnBlownAway[] = _(\"{B_DEF_NAME_WITH_PREFIX} was\\nblown away!\");\nstatic const u8 sText_PkmnChangedType[] = _(\"{B_ATK_NAME_WITH_PREFIX} transformed\\ninto the {B_BUFF1} type!\");\nstatic const u8 sText_PkmnFlinched[] = _(\"{B_ATK_NAME_WITH_PREFIX} flinched!\");\nstatic const u8 sText_PkmnRegainedHealth[] = _(\"{B_DEF_NAME_WITH_PREFIX} regained\\nhealth!\");\nstatic const u8 sText_PkmnHPFull[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s\\nHP is full!\");\nstatic const u8 sText_PkmnRaisedSpDef[] = _(\"{B_ATK_PREFIX2}'s {B_CURRENT_MOVE}\\nraised SP. DEF!\");\nstatic const u8 sText_PkmnRaisedSpDefALittle[] = _(\"{B_ATK_PREFIX2}'s {B_CURRENT_MOVE}\\nraised SP. DEF a little!\");\nstatic const u8 sText_PkmnRaisedDef[] = _(\"{B_ATK_PREFIX2}'s {B_CURRENT_MOVE}\\nraised DEFENSE!\");\nstatic const u8 sText_PkmnRaisedDefALittle[] = _(\"{B_ATK_PREFIX2}'s {B_CURRENT_MOVE}\\nraised DEFENSE a little!\");\nstatic const u8 sText_PkmnCoveredByVeil[] = _(\"{B_ATK_PREFIX2}'s party is covered\\nby a veil!\");\nstatic const u8 sText_PkmnUsedSafeguard[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s party is protected\\nby SAFEGUARD!\");\nstatic const u8 sText_PkmnSafeguardExpired[] = _(\"{B_ATK_PREFIX3}'s party is no longer\\nprotected by SAFEGUARD!\");\nstatic const u8 sText_PkmnWentToSleep[] = _(\"{B_ATK_NAME_WITH_PREFIX} went\\nto sleep!\");\nstatic const u8 sText_PkmnSleptHealthy[] = _(\"{B_ATK_NAME_WITH_PREFIX} slept and\\nbecame healthy!\");\nstatic const u8 sText_PkmnWhippedWhirlwind[] = _(\"{B_ATK_NAME_WITH_PREFIX} whipped\\nup a whirlwind!\");\nstatic const u8 sText_PkmnTookSunlight[] = _(\"{B_ATK_NAME_WITH_PREFIX} took\\nin sunlight!\");\nstatic const u8 sText_PkmnLoweredHead[] = _(\"{B_ATK_NAME_WITH_PREFIX} lowered\\nits head!\");\nstatic const u8 sText_PkmnIsGlowing[] = _(\"{B_ATK_NAME_WITH_PREFIX} is glowing!\");\nstatic const u8 sText_PkmnFlewHigh[] = _(\"{B_ATK_NAME_WITH_PREFIX} flew\\nup high!\");\nstatic const u8 sText_PkmnDugHole[] = _(\"{B_ATK_NAME_WITH_PREFIX} dug a hole!\");\nstatic const u8 sText_PkmnHidUnderwater[] = _(\"{B_ATK_NAME_WITH_PREFIX} hid\\nunderwater!\");\nstatic const u8 sText_PkmnSprangUp[] = _(\"{B_ATK_NAME_WITH_PREFIX} sprang up!\");\nstatic const u8 sText_PkmnSqueezedByBind[] = _(\"{B_DEF_NAME_WITH_PREFIX} was squeezed by\\n{B_ATK_NAME_WITH_PREFIX}'s BIND!\");\nstatic const u8 sText_PkmnTrappedInVortex[] = _(\"{B_DEF_NAME_WITH_PREFIX} was trapped\\nin the vortex!\");\nstatic const u8 sText_PkmnTrappedBySandTomb[] = _(\"{B_DEF_NAME_WITH_PREFIX} was trapped\\nby SAND TOMB!\");\nstatic const u8 sText_PkmnWrappedBy[] = _(\"{B_DEF_NAME_WITH_PREFIX} was WRAPPED by\\n{B_ATK_NAME_WITH_PREFIX}!\");\nstatic const u8 sText_PkmnClamped[] = _(\"{B_ATK_NAME_WITH_PREFIX} CLAMPED\\n{B_DEF_NAME_WITH_PREFIX}!\");\nstatic const u8 sText_PkmnHurtBy[] = _(\"{B_ATK_NAME_WITH_PREFIX} is hurt\\nby {B_BUFF1}!\");\nstatic const u8 sText_PkmnFreedFrom[] = _(\"{B_ATK_NAME_WITH_PREFIX} was freed\\nfrom {B_BUFF1}!\");\nstatic const u8 sText_PkmnCrashed[] = _(\"{B_ATK_NAME_WITH_PREFIX} kept going\\nand crashed!\");\nconst u8 gBattleText_MistShroud[] = _(\"{B_ATK_PREFIX2} became\\nshrouded in MIST!\");\nstatic const u8 sText_PkmnProtectedByMist[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX} is protected\\nby MIST!\");\nconst u8 gBattleText_GetPumped[] = _(\"{B_ATK_NAME_WITH_PREFIX} is getting\\npumped!\");\nstatic const u8 sText_PkmnHitWithRecoil[] = _(\"{B_ATK_NAME_WITH_PREFIX} is hit\\nwith recoil!\");\nstatic const u8 sText_PkmnProtectedItself2[] = _(\"{B_ATK_NAME_WITH_PREFIX} protected\\nitself!\");\nstatic const u8 sText_PkmnBuffetedBySandstorm[] = _(\"{B_ATK_NAME_WITH_PREFIX} is buffeted\\nby the sandstorm!\");\nstatic const u8 sText_PkmnPeltedByHail[] = _(\"{B_ATK_NAME_WITH_PREFIX} is pelted\\nby HAIL!\");\nstatic const u8 sText_PkmnsXWoreOff[] = _(\"{B_ATK_PREFIX1}'s {B_BUFF1}\\nwore off!\");\nstatic const u8 sText_PkmnSeeded[] = _(\"{B_DEF_NAME_WITH_PREFIX} was seeded!\");\nstatic const u8 sText_PkmnEvadedAttack[] = _(\"{B_DEF_NAME_WITH_PREFIX} evaded\\nthe attack!\");\nstatic const u8 sText_PkmnSappedByLeechSeed[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s health is\\nsapped by LEECH SEED!\");\nstatic const u8 sText_PkmnFastAsleep[] = _(\"{B_ATK_NAME_WITH_PREFIX} is fast\\nasleep.\");\nstatic const u8 sText_PkmnWokeUp[] = _(\"{B_ATK_NAME_WITH_PREFIX} woke up!\");\nstatic const u8 sText_PkmnUproarKeptAwake[] = _(\"But {B_SCR_ACTIVE_NAME_WITH_PREFIX}'s UPROAR\\nkept it awake!\");\nstatic const u8 sText_PkmnWokeUpInUproar[] = _(\"{B_ATK_NAME_WITH_PREFIX} woke up\\nin the UPROAR!\");\nstatic const u8 sText_PkmnCausedUproar[] = _(\"{B_ATK_NAME_WITH_PREFIX} caused\\nan UPROAR!\");\nstatic const u8 sText_PkmnMakingUproar[] = _(\"{B_ATK_NAME_WITH_PREFIX} is making\\nan UPROAR!\");\nstatic const u8 sText_PkmnCalmedDown[] = _(\"{B_ATK_NAME_WITH_PREFIX} calmed down.\");\nstatic const u8 sText_PkmnCantSleepInUproar[] = _(\"But {B_DEF_NAME_WITH_PREFIX} can't\\nsleep in an UPROAR!\");\nstatic const u8 sText_PkmnStockpiled[] = _(\"{B_ATK_NAME_WITH_PREFIX} STOCKPILED\\n{B_BUFF1}!\");\nstatic const u8 sText_PkmnCantStockpile[] = _(\"{B_ATK_NAME_WITH_PREFIX} can't\\nSTOCKPILE any more!\");\nstatic const u8 sText_PkmnCantSleepInUproar2[] = _(\"But {B_DEF_NAME_WITH_PREFIX} can't\\nsleep in an UPROAR!\");\nstatic const u8 sText_UproarKeptPkmnAwake[] = _(\"But the UPROAR kept\\n{B_DEF_NAME_WITH_PREFIX} awake!\");\nstatic const u8 sText_PkmnStayedAwakeUsing[] = _(\"{B_DEF_NAME_WITH_PREFIX} stayed awake\\nusing its {B_DEF_ABILITY}!\");\nstatic const u8 sText_PkmnStoringEnergy[] = _(\"{B_ATK_NAME_WITH_PREFIX} is storing\\nenergy!\");\nstatic const u8 sText_PkmnUnleashedEnergy[] = _(\"{B_ATK_NAME_WITH_PREFIX} unleashed\\nenergy!\");\nstatic const u8 sText_PkmnFatigueConfusion[] = _(\"{B_ATK_NAME_WITH_PREFIX} became\\nconfused due to fatigue!\");\nstatic const u8 sText_PkmnPickedUpItem[] = _(\"{B_PLAYER_NAME} picked up\\n¥{B_BUFF1}!\\p\");\nstatic const u8 sText_PkmnUnaffected[] = _(\"{B_DEF_NAME_WITH_PREFIX} is\\nunaffected!\");\nstatic const u8 sText_PkmnTransformedInto[] = _(\"{B_ATK_NAME_WITH_PREFIX} transformed\\ninto {B_BUFF1}!\");\nstatic const u8 sText_PkmnMadeSubstitute[] = _(\"{B_ATK_NAME_WITH_PREFIX} made\\na SUBSTITUTE!\");\nstatic const u8 sText_PkmnHasSubstitute[] = _(\"{B_ATK_NAME_WITH_PREFIX} already\\nhas a SUBSTITUTE!\");\nstatic const u8 sText_SubstituteDamaged[] = _(\"The SUBSTITUTE took damage\\nfor {B_DEF_NAME_WITH_PREFIX}!\\p\");\nstatic const u8 sText_PkmnSubstituteFaded[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s\\nSUBSTITUTE faded!\\p\");\nstatic const u8 sText_PkmnMustRecharge[] = _(\"{B_ATK_NAME_WITH_PREFIX} must\\nrecharge!\");\nstatic const u8 sText_PkmnRageBuilding[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s RAGE\\nis building!\");\nstatic const u8 sText_PkmnMoveWasDisabled[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\\nwas disabled!\");\nstatic const u8 sText_PkmnMoveDisabledNoMore[] = _(\"{B_ATK_NAME_WITH_PREFIX} is disabled\\nno more!\");\nstatic const u8 sText_PkmnGotEncore[] = _(\"{B_DEF_NAME_WITH_PREFIX} got\\nan ENCORE!\");\nstatic const u8 sText_PkmnEncoreEnded[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s ENCORE\\nended!\");\nstatic const u8 sText_PkmnTookAim[] = _(\"{B_ATK_NAME_WITH_PREFIX} took aim\\nat {B_DEF_NAME_WITH_PREFIX}!\");\nstatic const u8 sText_PkmnSketchedMove[] = _(\"{B_ATK_NAME_WITH_PREFIX} SKETCHED\\n{B_BUFF1}!\");\nstatic const u8 sText_PkmnTryingToTakeFoe[] = _(\"{B_ATK_NAME_WITH_PREFIX} is trying\\nto take its foe with it!\");\nstatic const u8 sText_PkmnTookFoe[] = _(\"{B_DEF_NAME_WITH_PREFIX} took\\n{B_ATK_NAME_WITH_PREFIX} with it!\");\nstatic const u8 sText_PkmnReducedPP[] = _(\"Reduced {B_DEF_NAME_WITH_PREFIX}'s\\n{B_BUFF1} by {B_BUFF2}!\");\nstatic const u8 sText_PkmnStoleItem[] = _(\"{B_ATK_NAME_WITH_PREFIX} stole\\n{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ITEM}!\");\nstatic const u8 sText_TargetCantEscapeNow[] = _(\"{B_DEF_NAME_WITH_PREFIX} can't\\nescape now!\");\nstatic const u8 sText_PkmnFellIntoNightmare[] = _(\"{B_DEF_NAME_WITH_PREFIX} fell into\\na NIGHTMARE!\");\nstatic const u8 sText_PkmnLockedInNightmare[] = _(\"{B_ATK_NAME_WITH_PREFIX} is locked\\nin a NIGHTMARE!\");\nstatic const u8 sText_PkmnLaidCurse[] = _(\"{B_ATK_NAME_WITH_PREFIX} cut its own HP and\\nlaid a CURSE on {B_DEF_NAME_WITH_PREFIX}!\");\nstatic const u8 sText_PkmnAfflictedByCurse[] = _(\"{B_ATK_NAME_WITH_PREFIX} is afflicted\\nby the CURSE!\");\nstatic const u8 sText_SpikesScattered[] = _(\"SPIKES were scattered all around\\nthe opponent's side!\");\nstatic const u8 sText_PkmnHurtBySpikes[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX} is hurt\\nby SPIKES!\");\nstatic const u8 sText_PkmnIdentified[] = _(\"{B_ATK_NAME_WITH_PREFIX} identified\\n{B_DEF_NAME_WITH_PREFIX}!\");\nstatic const u8 sText_PkmnPerishCountFell[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s PERISH count\\nfell to {B_BUFF1}!\");\nstatic const u8 sText_PkmnBracedItself[] = _(\"{B_ATK_NAME_WITH_PREFIX} braced\\nitself!\");\nstatic const u8 sText_PkmnEnduredHit[] = _(\"{B_DEF_NAME_WITH_PREFIX} ENDURED\\nthe hit!\");\nstatic const u8 sText_MagnitudeStrength[] = _(\"MAGNITUDE {B_BUFF1}!\");\nstatic const u8 sText_PkmnCutHPMaxedAttack[] = _(\"{B_ATK_NAME_WITH_PREFIX} cut its own HP\\nand maximized ATTACK!\");\nstatic const u8 sText_PkmnCopiedStatChanges[] = _(\"{B_ATK_NAME_WITH_PREFIX} copied\\n{B_DEF_NAME_WITH_PREFIX}'s stat changes!\");\nstatic const u8 sText_PkmnGotFree[] = _(\"{B_ATK_NAME_WITH_PREFIX} got free of\\n{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}!\");\nstatic const u8 sText_PkmnShedLeechSeed[] = _(\"{B_ATK_NAME_WITH_PREFIX} shed\\nLEECH SEED!\");\nstatic const u8 sText_PkmnBlewAwaySpikes[] = _(\"{B_ATK_NAME_WITH_PREFIX} blew away\\nSPIKES!\");\nstatic const u8 sText_PkmnFledFromBattle[] = _(\"{B_ATK_NAME_WITH_PREFIX} fled from\\nbattle!\");\nstatic const u8 sText_PkmnForesawAttack[] = _(\"{B_ATK_NAME_WITH_PREFIX} foresaw\\nan attack!\");\nstatic const u8 sText_PkmnTookAttack[] = _(\"{B_DEF_NAME_WITH_PREFIX} took the\\n{B_BUFF1} attack!\");\nstatic const u8 sText_PkmnChoseXAsDestiny[] = _(\"{B_ATK_NAME_WITH_PREFIX} chose\\n{B_CURRENT_MOVE} as its destiny!\");\nstatic const u8 sText_PkmnAttack[] = _(\"{B_BUFF1}'s attack!\");\nstatic const u8 sText_PkmnCenterAttention[] = _(\"{B_ATK_NAME_WITH_PREFIX} became the\\ncenter of attention!\");\nstatic const u8 sText_PkmnChargingPower[] = _(\"{B_ATK_NAME_WITH_PREFIX} began\\ncharging power!\");\nstatic const u8 sText_NaturePowerTurnedInto[] = _(\"NATURE POWER turned into\\n{B_CURRENT_MOVE}!\");\nstatic const u8 sText_PkmnStatusNormal[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s status\\nreturned to normal!\");\nstatic const u8 sText_PkmnSubjectedToTorment[] = _(\"{B_DEF_NAME_WITH_PREFIX} was subjected\\nto TORMENT!\");\nstatic const u8 sText_PkmnTighteningFocus[] = _(\"{B_ATK_NAME_WITH_PREFIX} is tightening\\nits focus!\");\nstatic const u8 sText_PkmnFellForTaunt[] = _(\"{B_DEF_NAME_WITH_PREFIX} fell for\\nthe TAUNT!\");\nstatic const u8 sText_PkmnReadyToHelp[] = _(\"{B_ATK_NAME_WITH_PREFIX} is ready to\\nhelp {B_DEF_NAME_WITH_PREFIX}!\");\nstatic const u8 sText_PkmnSwitchedItems[] = _(\"{B_ATK_NAME_WITH_PREFIX} switched\\nitems with its opponent!\");\nstatic const u8 sText_PkmnObtainedX[] = _(\"{B_ATK_NAME_WITH_PREFIX} obtained\\n{B_BUFF1}.\");\nstatic const u8 sText_PkmnObtainedX2[] = _(\"{B_DEF_NAME_WITH_PREFIX} obtained\\n{B_BUFF2}.\");\nstatic const u8 sText_PkmnObtainedXYObtainedZ[] = _(\"{B_ATK_NAME_WITH_PREFIX} obtained\\n{B_BUFF1}.\\p{B_DEF_NAME_WITH_PREFIX} obtained\\n{B_BUFF2}.\");\nstatic const u8 sText_PkmnCopiedFoe[] = _(\"{B_ATK_NAME_WITH_PREFIX} copied\\n{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}!\");\nstatic const u8 sText_PkmnMadeWish[] = _(\"{B_ATK_NAME_WITH_PREFIX} made a WISH!\");\nstatic const u8 sText_PkmnWishCameTrue[] = _(\"{B_BUFF1}'s WISH\\ncame true!\");\nstatic const u8 sText_PkmnPlantedRoots[] = _(\"{B_ATK_NAME_WITH_PREFIX} planted its roots!\");\nstatic const u8 sText_PkmnAbsorbedNutrients[] = _(\"{B_ATK_NAME_WITH_PREFIX} absorbed\\nnutrients with its roots!\");\nstatic const u8 sText_PkmnAnchoredItself[] = _(\"{B_DEF_NAME_WITH_PREFIX} anchored\\nitself with its roots!\");\nstatic const u8 sText_PkmnWasMadeDrowsy[] = _(\"{B_ATK_NAME_WITH_PREFIX} made\\n{B_DEF_NAME_WITH_PREFIX} drowsy!\");\nstatic const u8 sText_PkmnKnockedOff[] = _(\"{B_ATK_NAME_WITH_PREFIX} knocked off\\n{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ITEM}!\");\nstatic const u8 sText_PkmnSwappedAbilities[] = _(\"{B_ATK_NAME_WITH_PREFIX} swapped abilities\\nwith its opponent!\");\nstatic const u8 sText_PkmnSealedOpponentMove[] = _(\"{B_ATK_NAME_WITH_PREFIX} sealed the\\nopponent's moveシsス!\");\nstatic const u8 sText_PkmnWantsGrudge[] = _(\"{B_ATK_NAME_WITH_PREFIX} wants the\\nopponent to bear a GRUDGE!\");\nstatic const u8 sText_PkmnLostPPGrudge[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} lost\\nall its PP due to the GRUDGE!\");\nstatic const u8 sText_PkmnShroudedItself[] = _(\"{B_ATK_NAME_WITH_PREFIX} shrouded\\nitself in {B_CURRENT_MOVE}!\");\nstatic const u8 sText_PkmnMoveBounced[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE}\\nwas bounced back by MAGIC COAT!\");\nstatic const u8 sText_PkmnWaitsForTarget[] = _(\"{B_ATK_NAME_WITH_PREFIX} waits for its foe\\nto make a move!\");\nstatic const u8 sText_PkmnSnatchedMove[] = _(\"{B_DEF_NAME_WITH_PREFIX} SNATCHED\\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s move!\");\nstatic const u8 sText_ElectricityWeakened[] = _(\"Electricity's power was\\nweakened!\");\nstatic const u8 sText_FireWeakened[] = _(\"Fire's power was\\nweakened!\");\nstatic const u8 sText_XFoundOneY[] = _(\"{B_ATK_NAME_WITH_PREFIX} found\\none {B_LAST_ITEM}!\");\nstatic const u8 sText_SoothingAroma[] = _(\"A soothing aroma wafted\\nthrough the area!\");\nstatic const u8 sText_ItemsCantBeUsedNow[] = _(\"Items can't be used now.{PAUSE 64}\");\nstatic const u8 sText_ForXCommaYZ[] = _(\"For {B_SCR_ACTIVE_NAME_WITH_PREFIX},\\n{B_LAST_ITEM} {B_BUFF1}\");\nstatic const u8 sText_PkmnUsedXToGetPumped[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX} used\\n{B_LAST_ITEM} to hustle!\");\nstatic const u8 sText_PkmnLostFocus[] = _(\"{B_ATK_NAME_WITH_PREFIX} lost its\\nfocus and couldn't move!\");\nstatic const u8 sText_PkmnWasDraggedOut[] = _(\"{B_DEF_NAME_WITH_PREFIX} was\\ndragged out!\\p\");\nstatic const u8 sText_TheWallShattered[] = _(\"The wall shattered!\");\nstatic const u8 sText_ButNoEffect[] = _(\"But it had no effect!\");\nstatic const u8 sText_PkmnHasNoMovesLeft[] = _(\"{B_ACTIVE_NAME_WITH_PREFIX} has no\\nmoves left!\\p\");\nstatic const u8 sText_PkmnMoveIsDisabled[] = _(\"{B_ACTIVE_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE}\\nis disabled!\\p\");\nstatic const u8 sText_PkmnCantUseMoveTorment[] = _(\"{B_ACTIVE_NAME_WITH_PREFIX} can't use the same\\nmove in a row due to the TORMENT!\\p\");\nstatic const u8 sText_PkmnCantUseMoveTaunt[] = _(\"{B_ACTIVE_NAME_WITH_PREFIX} can't use\\n{B_CURRENT_MOVE} after the TAUNT!\\p\");\nstatic const u8 sText_PkmnCantUseMoveSealed[] = _(\"{B_ACTIVE_NAME_WITH_PREFIX} can't use the\\nsealed {B_CURRENT_MOVE}!\\p\");\nstatic const u8 sText_PkmnMadeItRain[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nmade it rain!\");\nstatic const u8 sText_PkmnRaisedSpeed[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nraised its SPEED!\");\nstatic const u8 sText_PkmnProtectedBy[] = _(\"{B_DEF_NAME_WITH_PREFIX} was protected\\nby {B_DEF_ABILITY}!\");\nstatic const u8 sText_PkmnPreventsUsage[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\nprevents {B_ATK_NAME_WITH_PREFIX}\\lfrom using {B_CURRENT_MOVE}!\");\nstatic const u8 sText_PkmnRestoredHPUsing[] = _(\"{B_DEF_NAME_WITH_PREFIX} restored HP\\nusing its {B_DEF_ABILITY}!\");\nstatic const u8 sText_PkmnsXMadeYUseless[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\nmade {B_CURRENT_MOVE} useless!\");\nstatic const u8 sText_PkmnChangedTypeWith[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\nmade it the {B_BUFF1} type!\");\nstatic const u8 sText_PkmnPreventsParalysisWith[] = _(\"{B_EFF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\nprevents paralysis!\");\nstatic const u8 sText_PkmnPreventsRomanceWith[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\nprevents romance!\");\nstatic const u8 sText_PkmnPreventsPoisoningWith[] = _(\"{B_EFF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\nprevents poisoning!\");\nstatic const u8 sText_PkmnPreventsConfusionWith[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\nprevents confusion!\");\nstatic const u8 sText_PkmnRaisedFirePowerWith[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\nraised its FIRE power!\");\nstatic const u8 sText_PkmnAnchorsItselfWith[] = _(\"{B_DEF_NAME_WITH_PREFIX} anchors\\nitself with {B_DEF_ABILITY}!\");\nstatic const u8 sText_PkmnCutsAttackWith[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\ncuts {B_DEF_NAME_WITH_PREFIX}'s ATTACK!\");\nstatic const u8 sText_PkmnPreventsStatLossWith[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nprevents stat loss!\");\nstatic const u8 sText_PkmnHurtsWith[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\nhurt {B_ATK_NAME_WITH_PREFIX}!\");\nstatic const u8 sText_PkmnTraced[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX} TRACED\\n{B_BUFF1}'s {B_BUFF2}!\");\nstatic const u8 sText_PkmnsXPreventsBurns[] = _(\"{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY}\\nprevents burns!\");\nstatic const u8 sText_PkmnsXBlocksY[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\nblocks {B_CURRENT_MOVE}!\");\nstatic const u8 sText_PkmnsXBlocksY2[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nblocks {B_CURRENT_MOVE}!\");\nstatic const u8 sText_PkmnsXRestoredHPALittle2[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY}\\nrestored its HP a little!\");\nstatic const u8 sText_PkmnsXWhippedUpSandstorm[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nwhipped up a sandstorm!\");\nstatic const u8 sText_PkmnsXIntensifiedSun[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nintensified the sun's rays!\");\nstatic const u8 sText_PkmnsXPreventsYLoss[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nprevents {B_BUFF1} loss!\");\nstatic const u8 sText_PkmnsXInfatuatedY[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\ninfatuated {B_ATK_NAME_WITH_PREFIX}!\");\nstatic const u8 sText_PkmnsXMadeYIneffective[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\nmade {B_CURRENT_MOVE} ineffective!\");\nstatic const u8 sText_PkmnsXCuredYProblem[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\ncured its {B_BUFF1} problem!\");\nstatic const u8 sText_ItSuckedLiquidOoze[] = _(\"It sucked up the\\nLIQUID OOZE!\");\nstatic const u8 sText_PkmnTransformed[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX} transformed!\");\nstatic const u8 sText_PkmnsXTookAttack[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\ntook the attack!\");\nconst u8 gText_PkmnsXPreventsSwitching[] = _(\"{B_BUFF1}'s {B_LAST_ABILITY}\\nprevents switching!\\p\");\nstatic const u8 sText_PreventedFromWorking[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\\nprevented {B_SCR_ACTIVE_NAME_WITH_PREFIX}'s\\l{B_BUFF1} from working!\");\nstatic const u8 sText_PkmnsXMadeItIneffective[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nmade it ineffective!\");\nstatic const u8 sText_PkmnsXPreventsFlinching[] = _(\"{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY}\\nprevents flinching!\");\nstatic const u8 sText_PkmnsXPreventsYsZ[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY}\\nprevents {B_DEF_NAME_WITH_PREFIX}'s\\l{B_DEF_ABILITY} from working!\");\nstatic const u8 sText_PkmnsXCuredItsYProblem[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\ncured its {B_BUFF1} problem!\");\nstatic const u8 sText_PkmnsXHadNoEffectOnY[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\\nhad no effect on {B_EFF_NAME_WITH_PREFIX}!\");\nstatic const u8 sText_TooScaredToMove[] = _(\"{B_ATK_NAME_WITH_PREFIX} is too scared to move!\");\nstatic const u8 sText_GetOutGetOut[] = _(\"GHOST: Get out…… Get out……\");\nstatic const u8 sText_StatSharply[] = _(\"sharply \");\nconst u8 gBattleText_Rose[] = _(\"rose!\");\nstatic const u8 sText_StatHarshly[] = _(\"harshly \");\nstatic const u8 sText_StatFell[] = _(\"fell!\");\nstatic const u8 sText_AttackersStatRose[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\\n{B_BUFF2}\");\nconst u8 gText_DefendersStatRose[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\\n{B_BUFF2}\");\nstatic const u8 sText_UsingItemTheStatOfPkmnRose[] = _(\"Using {B_LAST_ITEM}, the {B_BUFF1}\\nof {B_SCR_ACTIVE_NAME_WITH_PREFIX} {B_BUFF2}\");\nstatic const u8 sText_AttackersStatFell[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\\n{B_BUFF2}\");\nstatic const u8 sText_DefendersStatFell[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\\n{B_BUFF2}\");\nstatic const u8 sText_StatsWontIncrease2[] = _(\"{B_ATK_NAME_WITH_PREFIX}'s stats won't\\ngo any higher!\");\nstatic const u8 sText_StatsWontDecrease2[] = _(\"{B_DEF_NAME_WITH_PREFIX}'s stats won't\\ngo any lower!\");\nstatic const u8 sText_CriticalHit[] = _(\"A critical hit!\");\nstatic const u8 sText_OneHitKO[] = _(\"It's a one-hit KO!\");\nstatic const u8 sText_123Poof[] = _(\"{PAUSE 32}1, {PAUSE 15}2, and{PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE SE_BALL_BOUNCE_1}Poof!\\p\");\nstatic const u8 sText_AndEllipsis[] = _(\"And…\\p\");\nstatic const u8 sText_HMMovesCantBeForgotten[] = _(\"HM moves can't be\\nforgotten now.\\p\");\nstatic const u8 sText_NotVeryEffective[] = _(\"It's not very effective…\");\nstatic const u8 sText_SuperEffective[] = _(\"It's super effective!\");\nstatic const u8 sText_GotAwaySafely[] = _(\"{PLAY_SE SE_FLEE}Got away safely!\\p\");\nstatic const u8 sText_PkmnFledUsingIts[] = _(\"{PLAY_SE SE_FLEE}{B_ATK_NAME_WITH_PREFIX} fled\\nusing its {B_LAST_ITEM}!\\p\");\nstatic const u8 sText_PkmnFledUsing[] = _(\"{PLAY_SE SE_FLEE}{B_ATK_NAME_WITH_PREFIX} fled\\nusing {B_ATK_ABILITY}!\\p\");\nstatic const u8 sText_WildPkmnFled[] = _(\"{PLAY_SE SE_FLEE}Wild {B_BUFF1} fled!\");\nstatic const u8 sText_PlayerDefeatedLinkTrainer[] = _(\"Player defeated\\n{B_LINK_OPPONENT1_NAME}!\");\nstatic const u8 sText_TwoLinkTrainersDefeated[] = _(\"Player beat {B_LINK_OPPONENT1_NAME}\\nand {B_LINK_OPPONENT2_NAME}!\");\nstatic const u8 sText_PlayerLostAgainstLinkTrainer[] = _(\"Player lost against\\n{B_LINK_OPPONENT1_NAME}!\");\nstatic const u8 sText_PlayerLostToTwo[] = _(\"Player lost to {B_LINK_OPPONENT1_NAME}\\nand {B_LINK_OPPONENT2_NAME}!\");\nstatic const u8 sText_PlayerBattledToDrawLinkTrainer[] = _(\"Player battled to a draw against\\n{B_LINK_OPPONENT1_NAME}!\");\nstatic const u8 sText_PlayerBattledToDrawVsTwo[] = _(\"Player battled to a draw against\\n{B_LINK_OPPONENT1_NAME} and {B_LINK_OPPONENT2_NAME}!\");\nstatic const u8 sText_WildFled[] = _(\"{PLAY_SE SE_FLEE}{B_LINK_OPPONENT1_NAME} fled!\");\nstatic const u8 sText_TwoWildFled[] = _(\"{PLAY_SE SE_FLEE}{B_LINK_OPPONENT1_NAME} and\\n{B_LINK_OPPONENT2_NAME} fled!\");\nstatic const u8 sText_NoRunningFromTrainers[] = _(\"No! There's no running\\nfrom a TRAINER battle!\\p\");\nstatic const u8 sText_CantEscape[] = _(\"Can't escape!\\p\");\nstatic const u8 sText_DontLeaveBirch[] = _(\"\"); // Dummied\nstatic const u8 sText_ButNothingHappened[] = _(\"But nothing happened!\");\nstatic const u8 sText_ButItFailed[] = _(\"But it failed!\");\nstatic const u8 sText_ItHurtConfusion[] = _(\"It hurt itself in its\\nconfusion!\");\nstatic const u8 sText_MirrorMoveFailed[] = _(\"The MIRROR MOVE failed!\");\nstatic const u8 sText_StartedToRain[] = _(\"It started to rain!\");\nstatic const u8 sText_DownpourStarted[] = _(\"A downpour started!\"); // corresponds to DownpourText in pokegold and pokecrystal and is used by Rain Dance in GSC\nstatic const u8 sText_RainContinues[] = _(\"Rain continues to fall.\");\nstatic const u8 sText_DownpourContinues[] = _(\"The downpour continues.\"); // unused\nstatic const u8 sText_RainStopped[] = _(\"The rain stopped.\");\nstatic const u8 sText_SandstormBrewed[] = _(\"A sandstorm brewed!\");\nstatic const u8 sText_SandstormRages[] = _(\"The sandstorm rages.\");\nstatic const u8 sText_SandstormSubsided[] = _(\"The sandstorm subsided.\");\nstatic const u8 sText_SunlightGotBright[] = _(\"The sunlight got bright!\");\nstatic const u8 sText_SunlightStrong[] = _(\"The sunlight is strong.\");\nstatic const u8 sText_SunlightFaded[] = _(\"The sunlight faded.\");\nstatic const u8 sText_StartedHail[] = _(\"It started to hail!\");\nstatic const u8 sText_HailContinues[] = _(\"Hail continues to fall.\");\nstatic const u8 sText_HailStopped[] = _(\"The hail stopped.\");\nstatic const u8 sText_FailedToSpitUp[] = _(\"But it failed to SPIT UP\\na thing!\");\nstatic const u8 sText_FailedToSwallow[] = _(\"But it failed to SWALLOW\\na thing!\");\nstatic const u8 sText_WindBecameHeatWave[] = _(\"The wind turned into a\\nHEAT WAVE!\");\nstatic const u8 sText_StatChangesGone[] = _(\"All stat changes were\\neliminated!\");\nstatic const u8 sText_CoinsScattered[] = _(\"Coins scattered everywhere!\");\nstatic const u8 sText_TooWeakForSubstitute[] = _(\"It was too weak to make\\na SUBSTITUTE!\");\nstatic const u8 sText_SharedPain[] = _(\"The battlers shared\\ntheir pain!\");\nstatic const u8 sText_BellChimed[] = _(\"A bell chimed!\");\nstatic const u8 sText_FaintInThree[] = _(\"All affected POKéMON will\\nfaint in three turns!\");\nstatic const u8 sText_NoPPLeft[] = _(\"There's no PP left for\\nthis move!\\p\");\nstatic const u8 sText_ButNoPPLeft[] = _(\"But there was no PP left\\nfor the move!\");\nstatic const u8 sText_PkmnIgnoresAsleep[] = _(\"{B_ATK_NAME_WITH_PREFIX} ignored\\norders while asleep!\");\nstatic const u8 sText_PkmnIgnoredOrders[] = _(\"{B_ATK_NAME_WITH_PREFIX} ignored\\norders!\");\nstatic const u8 sText_PkmnBeganToNap[] = _(\"{B_ATK_NAME_WITH_PREFIX} began to nap!\");\nstatic const u8 sText_PkmnLoafing[] = _(\"{B_ATK_NAME_WITH_PREFIX} is\\nloafing around!\");\nstatic const u8 sText_PkmnWontObey[] = _(\"{B_ATK_NAME_WITH_PREFIX} won't\\nobey!\");\nstatic const u8 sText_PkmnTurnedAway[] = _(\"{B_ATK_NAME_WITH_PREFIX} turned away!\");\nstatic const u8 sText_PkmnPretendNotNotice[] = _(\"{B_ATK_NAME_WITH_PREFIX} pretended\\nnot to notice!\");\nstatic const u8 sText_EnemyAboutToSwitchPkmn[] = _(\"{B_TRAINER1_CLASS} {B_TRAINER1_NAME} is\\nabout to use {B_BUFF2}.\\pWill {B_PLAYER_NAME} change\\nPOKéMON?\");\nstatic const u8 sText_EnemyAboutToSwitchPkmnNoPredict[] = _(\"{B_TRAINER1_CLASS} {B_TRAINER1_NAME} is\\nabout to switch POKéMON.\\pWill {B_PLAYER_NAME} change\\nPOKéMON?\");\nstatic const u8 sText_PkmnLearnedMove2[] = _(\"{B_ATK_NAME_WITH_PREFIX} learned\\n{B_BUFF1}!\");\nstatic const u8 sText_PlayerDefeatedLinkTrainerTrainer1[] = _(\"Player defeated\\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!\\p\");\nstatic const u8 sText_ThrewARock[] = _(\"{B_PLAYER_NAME} threw a ROCK\\nat the {B_OPPONENT_MON1_NAME}!\");\nstatic const u8 sText_ThrewSomeBait[] = _(\"{B_PLAYER_NAME} threw some BAIT\\nat the {B_OPPONENT_MON1_NAME}!\");\nstatic const u8 sText_PkmnWatchingCarefully[] = _(\"{B_OPPONENT_MON1_NAME} is watching\\ncarefully!\");\nstatic const u8 sText_PkmnIsAngry[] = _(\"{B_OPPONENT_MON1_NAME} is angry!\");\nstatic const u8 sText_PkmnIsEating[] = _(\"{B_OPPONENT_MON1_NAME} is eating!\");\nstatic const u8 sText_OutOfSafariBalls[] = _(\"{PLAY_SE SE_DING_DONG}ANNOUNCER: You're out of\\nSAFARI BALLS! Game over!\\p\");\nstatic const u8 sText_WildPkmnAppeared[] = _(\"Wild {B_OPPONENT_MON1_NAME} appeared!\\p\");\nstatic const u8 sText_WildPkmnAppeared2[] = _(\"Wild {B_OPPONENT_MON1_NAME} appeared!\\p\");\nstatic const u8 sText_WildPkmnAppearedPause[] = _(\"Wild {B_OPPONENT_MON1_NAME} appeared!{PAUSE 127}\");\nstatic const u8 sText_TwoWildPkmnAppeared[] = _(\"Wild {B_OPPONENT_MON1_NAME} and\\n{B_OPPONENT_MON2_NAME} appeared!\\p\");\nstatic const u8 sText_GhostAppearedCantId[] = _(\"The GHOST appeared!\\pDarn!\\nThe GHOST can't be ID'd!\\p\");\nstatic const u8 sText_TheGhostAppeared[] = _(\"The GHOST appeared!\\p\");\nstatic const u8 sText_SilphScopeUnveil[] = _(\"SILPH SCOPE unveiled the GHOST's\\nidentity!\");\nstatic const u8 sText_TheGhostWas[] = _(\"The GHOST was MAROWAK!\\p\\n\");\nstatic const u8 sText_Trainer1WantsToBattle[] = _(\"{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\\nwould like to battle!\\p\");\nstatic const u8 sText_LinkTrainerWantsToBattle[] = _(\"{B_LINK_OPPONENT1_NAME}\\nwants to battle!\");\nstatic const u8 sText_TwoLinkTrainersWantToBattle[] = _(\"{B_LINK_OPPONENT1_NAME} and {B_LINK_OPPONENT2_NAME}\\nwant to battle!\");\nstatic const u8 sText_Trainer1SentOutPkmn[] = _(\"{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\\nout {B_OPPONENT_MON1_NAME}!{PAUSE 60}\");\nstatic const u8 sText_Trainer1SentOutTwoPkmn[] = _(\"{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\\nout {B_OPPONENT_MON1_NAME} and {B_OPPONENT_MON2_NAME}!{PAUSE 60}\");\nstatic const u8 sText_Trainer1SentOutPkmn2[] = _(\"{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\\nout {B_BUFF1}!\");\nstatic const u8 sText_LinkTrainerSentOutPkmn[] = _(\"{B_LINK_OPPONENT1_NAME} sent out\\n{B_OPPONENT_MON1_NAME}!\");\nstatic const u8 sText_LinkTrainerSentOutTwoPkmn[] = _(\"{B_LINK_OPPONENT1_NAME} sent out\\n{B_OPPONENT_MON1_NAME} and {B_OPPONENT_MON2_NAME}!\");\nstatic const u8 sText_TwoLinkTrainersSentOutPkmn[] = _(\"{B_LINK_OPPONENT1_NAME} sent out {B_LINK_OPPONENT_MON1_NAME}!\\n{B_LINK_OPPONENT2_NAME} sent out {B_LINK_OPPONENT_MON2_NAME}!\");\nstatic const u8 sText_LinkTrainerSentOutPkmn2[] = _(\"{B_LINK_OPPONENT1_NAME} sent out\\n{B_BUFF1}!\");\nstatic const u8 sText_LinkTrainerMultiSentOutPkmn[] = _(\"{B_LINK_SCR_TRAINER_NAME} sent out\\n{B_BUFF1}!\");\nstatic const u8 sText_GoPkmn[] = _(\"Go! {B_PLAYER_MON1_NAME}!\");\nstatic const u8 sText_GoTwoPkmn[] = _(\"Go! {B_PLAYER_MON1_NAME} and\\n{B_PLAYER_MON2_NAME}!\");\nstatic const u8 sText_GoPkmn2[] = _(\"Go! {B_BUFF1}!\");\nstatic const u8 sText_DoItPkmn[] = _(\"Do it! {B_BUFF1}!\");\nstatic const u8 sText_GoForItPkmn[] = _(\"Go for it, {B_BUFF1}!\");\nstatic const u8 sText_YourFoesWeakGetEmPkmn[] = _(\"Your foe's weak!\\nGet 'em, {B_BUFF1}!\");\nstatic const u8 sText_LinkPartnerSentOutPkmnGoPkmn[] = _(\"{B_LINK_PARTNER_NAME} sent out {B_LINK_PLAYER_MON2_NAME}!\\nGo! {B_LINK_PLAYER_MON1_NAME}!\");\nstatic const u8 sText_PkmnThatsEnough[] = _(\"{B_BUFF1}, that's enough!\\nCome back!\");\nstatic const u8 sText_PkmnComeBack[] = _(\"{B_BUFF1}, come back!\");\nstatic const u8 sText_PkmnOkComeBack[] = _(\"{B_BUFF1}, OK!\\nCome back!\");\nconst u8 sText_PkmnGoodComeBack[] = _(\"{B_BUFF1}, good!\\nCome back!\");\nstatic const u8 sText_Trainer1WithdrewPkmn[] = _(\"{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\\nwithdrew {B_BUFF1}!\");\nstatic const u8 sText_LinkTrainer1WithdrewPkmn[] = _(\"{B_LINK_OPPONENT1_NAME} withdrew\\n{B_BUFF1}!\");\nstatic const u8 sText_LinkTrainer2WithdrewPkmn[] = _(\"{B_LINK_SCR_TRAINER_NAME} withdrew\\n{B_BUFF1}!\");\nstatic const u8 sText_WildPkmnPrefix[] = _(\"Wild \");\nstatic const u8 sText_FoePkmnPrefix[] = _(\"Foe \");\nstatic const u8 sText_FoePkmnPrefix2[] = _(\"Foe\");\nstatic const u8 sText_AllyPkmnPrefix[] = _(\"Ally\");\nstatic const u8 sText_FoePkmnPrefix3[] = _(\"Foe\");\nstatic const u8 sText_AllyPkmnPrefix2[] = _(\"Ally\");\nstatic const u8 sText_FoePkmnPrefix4[] = _(\"Foe\");\nstatic const u8 sText_AllyPkmnPrefix3[] = _(\"Ally\");\nstatic const u8 sText_AttackerUsedX[] = _(\"{B_ATK_NAME_WITH_PREFIX} used\\n{B_BUFF2}!\");\nstatic const u8 sText_MonPickedUpItem[] = _(\"Your POKéMON picked\\nup some items!\");\nstatic const u8 sText_MonPickedUpItemSolo[] = _(\"{B_BUFF1} picked up {B_BUFF2} {B_BUFF3}!\");\n\n//link title strings\nstatic const u8 sText_LinkTrainerSentOutPkmnTitle[] = _(\"{B_LINK_OPPONENT1_NAME}\\nsent out {B_OPPONENT_MON1_NAME}!\");\nstatic const u8 sText_LinkTrainerSentOutTwoPkmnTitle[] = _(\"{B_LINK_OPPONENT1_NAME}\\nsent out {B_OPPONENT_MON1_NAME} and {B_OPPONENT_MON2_NAME}!\");\nstatic const u8 sText_LinkPartnerSentOutPkmnGoPkmnTitle[] = _(\"{B_LINK_PARTNER_NAME}\\nsent out {B_LINK_PLAYER_MON2_NAME}!\\lGo! {B_LINK_PLAYER_MON1_NAME}!\");\nstatic const u8 sText_TwoLinkTrainersSentOutPkmnYY[] = _(\"{B_LINK_OPPONENT1_NAME}\\nsent out {B_LINK_OPPONENT_MON1_NAME}!\\p{B_LINK_OPPONENT2_NAME}\\nsent out {B_LINK_OPPONENT_MON2_NAME}!\");\nstatic const u8 sText_TwoLinkTrainersSentOutPkmnYN[] = _(\"{B_LINK_OPPONENT1_NAME}\\nsent out {B_LINK_OPPONENT_MON1_NAME}!\\l{B_LINK_OPPONENT2_NAME} sent out {B_LINK_OPPONENT_MON2_NAME}!\");\nstatic const u8 sText_TwoLinkTrainersSentOutPkmnNY[] = _(\"{B_LINK_OPPONENT1_NAME} sent out {B_LINK_OPPONENT_MON1_NAME}!\\p{B_LINK_OPPONENT2_NAME}\\nsent out {B_LINK_OPPONENT_MON2_NAME}!\");\nstatic const u8 sText_LinkTrainer1WithdrewPkmnTitle[] = _(\"{B_LINK_OPPONENT1_NAME}\\nwithdrew {B_BUFF1}!\");\nstatic const u8 sText_LinkTrainer2WithdrewPkmnTitle[] = _(\"{B_LINK_SCR_TRAINER_NAME}\\nwithdrew {B_BUFF1}!\");\nstatic const u8 sText_LinkTrainerSentOutPkmn2Title[] = _(\"{B_LINK_OPPONENT1_NAME}\\nsent out {B_BUFF1}!\");\nstatic const u8 sText_LinkTrainerMultiSentOutPkmnTitle[] = _(\"{B_LINK_SCR_TRAINER_NAME}\\nsent out {B_BUFF1}!\");\nstatic const u8 sText_TwoLinkTrainersWantToBattleYY[] = _(\"{B_LINK_OPPONENT1_NAME} and\\n{B_LINK_OPPONENT2_NAME}\\lwant to battle!\");\nstatic const u8 sText_TwoLinkTrainersWantToBattleYN[] = _(\"{B_LINK_OPPONENT1_NAME} and\\n{B_LINK_OPPONENT2_NAME} want to battle!\");\n\n\nstatic const u8 sText_HP2[] = _(\"HP\");\nstatic const u8 sText_Attack2[] = _(\"ATTACK\");\nstatic const u8 sText_Defense2[] = _(\"DEFENSE\");\nstatic const u8 sText_Speed[] = _(\"SPEED\");\nstatic const u8 sText_SpAtk2[] = _(\"SP. ATK\");\nstatic const u8 sText_SpDef2[] = _(\"SP. DEF\");\nstatic const u8 sText_Accuracy[] = _(\"accuracy\");\nstatic const u8 sText_Evasiveness[] = _(\"evasiveness\");\n\nconst u8 *const gStatNamesTable[] = {\n    sText_HP2,\n    sText_Attack2,\n    sText_Defense2,\n    sText_Speed,\n    sText_SpAtk2,\n    sText_SpDef2,\n    sText_Accuracy,\n    sText_Evasiveness\n};\n\nstatic const u8 sText_PokeblockWasTooSpicy[] = _(\"was too spicy!\"); //\nstatic const u8 sText_PokeblockWasTooDry[] = _(\"was too dry!\");\nstatic const u8 sText_PokeblockWasTooSweet[] = _(\"was too sweet!\");\nstatic const u8 sText_PokeblockWasTooBitter[] = _(\"was too bitter!\");\nstatic const u8 sText_PokeblockWasTooSour[] = _(\"was too sour!\");\n\nconst u8 *const gPokeblockWasTooXStringTable[] = {\n    sText_PokeblockWasTooSpicy,\n    sText_PokeblockWasTooDry,\n    sText_PokeblockWasTooSweet,\n    sText_PokeblockWasTooBitter,\n    sText_PokeblockWasTooSour\n};\n\nstatic const u8 sText_PlayerUsedItem[] = _(\"{B_PLAYER_NAME} used\\n{B_LAST_ITEM}!\");\nstatic const u8 sText_OldManUsedItem[] = _(\"The old man used\\n{B_LAST_ITEM}!\");\nstatic const u8 sText_PokedudeUsedItem[] = _(\"The POKé DUDE used\\n{B_LAST_ITEM}!\");\nstatic const u8 sText_Trainer1UsedItem[] = _(\"{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\\nused {B_LAST_ITEM}!\");\nstatic const u8 sText_TrainerBlockedBall[] = _(\"The TRAINER blocked the BALL!\");\nstatic const u8 sText_DontBeAThief[] = _(\"Don't be a thief!\");\nstatic const u8 sText_ItDodgedBall[] = _(\"It dodged the thrown BALL!\\nThis POKéMON can't be caught!\");\nstatic const u8 sText_YouMissedPkmn[] = _(\"You missed the POKéMON!\");\nstatic const u8 sText_PkmnBrokeFree[] = _(\"Oh, no!\\nThe POKéMON broke free!\");\nstatic const u8 sText_ItAppearedCaught[] = _(\"Aww!\\nIt appeared to be caught!\");\nstatic const u8 sText_AarghAlmostHadIt[] = _(\"Aargh!\\nAlmost had it!\");\nstatic const u8 sText_ShootSoClose[] = _(\"Shoot!\\nIt was so close, too!\");\nstatic const u8 sText_GotchaPkmnCaught[] = _(\"Gotcha!\\n{B_OPPONENT_MON1_NAME} was caught!{WAIT_SE}{PLAY_BGM MUS_CAUGHT}\\p\");\nstatic const u8 sText_GotchaPkmnCaught2[] = _(\"Gotcha!\\n{B_OPPONENT_MON1_NAME} was caught!{WAIT_SE}{PLAY_BGM MUS_CAUGHT}{PAUSE 127}\");\nstatic const u8 sText_GiveNicknameCaptured[] = _(\"Give a nickname to the\\ncaptured {B_OPPONENT_MON1_NAME}?\");\nstatic const u8 sText_PkmnSentToPC[] = _(\"{B_OPPONENT_MON1_NAME} was sent to\\n{B_PC_CREATOR_NAME} PC.\");\nstatic const u8 sText_Someones[] = _(\"someone's\");\nstatic const u8 sText_Bills[] = _(\"BILL's\");\nstatic const u8 sText_PkmnDataAddedToDex[] = _(\"{B_OPPONENT_MON1_NAME}'s data was\\nadded to the POKéDEX.\\p\");\nstatic const u8 sText_ItIsRaining[] = _(\"It is raining.\"); // used only in RSE when a battle starts in a rainy area\nstatic const u8 sText_SandstormIsRaging[] = _(\"A sandstorm is raging.\");\nstatic const u8 sText_BoxIsFull[] = _(\"The BOX is full!\\nYou can't catch any more!\\p\");\nstatic const u8 sText_EnigmaBerry[] = _(\"ENIGMA BERRY\");\nstatic const u8 sText_BerrySuffix[] = _(\" BERRY\");\nstatic const u8 sText_PkmnsItemCuredParalysis[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\\ncured paralysis!\");\nstatic const u8 sText_PkmnsItemCuredPoison[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\\ncured poison!\");\nstatic const u8 sText_PkmnsItemHealedBurn[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\\nhealed its burn!\");\nstatic const u8 sText_PkmnsItemDefrostedIt[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\\ndefrosted it!\");\nstatic const u8 sText_PkmnsItemWokeIt[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\\nwoke it from its sleep!\");\nstatic const u8 sText_PkmnsItemSnappedOut[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\\nsnapped it out of confusion!\");\nstatic const u8 sText_PkmnsItemCuredProblem[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\\ncured its {B_BUFF1} problem!\");\nstatic const u8 sText_PkmnsItemNormalizedStatus[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\\nnormalized its status!\");\nstatic const u8 sText_PkmnsItemRestoredHealth[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\\nrestored health!\");\nstatic const u8 sText_PkmnsItemRestoredPP[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\\nrestored {B_BUFF1}'s PP!\");\nstatic const u8 sText_PkmnsItemRestoredStatus[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\\nrestored its status!\");\nstatic const u8 sText_PkmnsItemRestoredHPALittle[] = _(\"{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\\nrestored its HP a little!\");\nstatic const u8 sText_ItemAllowsOnlyYMove[] = _(\"{B_LAST_ITEM}'s effect allows only\\n{B_CURRENT_MOVE} to be used!\\p\");\nstatic const u8 sText_PkmnHungOnWithX[] = _(\"{B_DEF_NAME_WITH_PREFIX} hung on\\nusing its {B_LAST_ITEM}!\");\nconst u8 gText_EmptyString3[] = _(\"\");\nstatic const u8 sText_PlayedFluteCatchyTune[] = _(\"{B_PLAYER_NAME} played the {B_LAST_ITEM}.\\pNow, that's a catchy tune!\");\nstatic const u8 sText_PlayedThe[] = _(\"{B_PLAYER_NAME} played the\\n{B_LAST_ITEM}.\");\nstatic const u8 sText_PkmnHearingFluteAwoke[] = _(\"The POKéMON hearing the FLUTE\\nawoke!\");\nstatic const u8 sText_YouThrowABallNowRight[] = _(\"You throw a BALL now, right?\\nI… I'll do my best!\");\nconst u8 gText_ForPetesSake[] = _(\"OAK: Oh, for Pete's sake…\\nSo pushy, as always.\\p{B_PLAYER_NAME}.\\pYou've never had a POKéMON battle\\nbefore, have you?\\pA POKéMON battle is when TRAINERS\\npit their POKéMON against each\\lother.\\p\");\nconst u8 gText_TheTrainerThat[] = _(\"The TRAINER that makes the other\\nTRAINER's POKéMON faint by lowering\\ltheir HP to “0,” wins.\\p\");\nconst u8 gText_TryBattling[] = _(\"But rather than talking about it,\\nyou'll learn more from experience.\\pTry battling and see for yourself.\\p\");\nconst u8 gText_InflictingDamageIsKey[] = _(\"OAK: Inflicting damage on the foe\\nis the key to any battle.\\p\");\nconst u8 gText_LoweringStats[] = _(\"OAK: Lowering the foe's stats\\nwill put you at an advantage.\\p\");\nconst u8 gText_KeepAnEyeOnHP[] = _(\"OAK: Keep your eyes on your\\nPOKéMON's HP.\\pIt will faint if the HP drops to\\n“0.”\\p\");\nconst u8 gText_OakNoRunningFromATrainer[] = _(\"OAK: No! There's no running away\\nfrom a TRAINER POKéMON battle!\\p\");\nconst u8 gText_WinEarnsPrizeMoney[] = _(\"OAK: Hm! Excellent!\\pIf you win, you earn prize money,\\nand your POKéMON will grow!\\pBattle other TRAINERS and make\\nyour POKéMON strong!\\p\");\nconst u8 gText_HowDissapointing[] = _(\"OAK: Hm…\\nHow disappointing…\\pIf you win, you earn prize money,\\nand your POKéMON grow.\\pBut if you lose, {B_PLAYER_NAME}, you end\\nup paying prize money…\\pHowever, since you had no warning\\nthis time, I'll pay for you.\\pBut things won't be this way once\\nyou step outside these doors.\\pThat's why you must strengthen your\\nPOKéMON by battling wild POKéMON.\\p\");\n\nconst u8 gText_GrandMaster[] = _(\"GRAND MASTER \");\nconst u8 gText_Master[] = _(\" MASTER \");\n\nconst u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_START] = {\n    [STRINGID_TRAINER1LOSETEXT - BATTLESTRINGS_TABLE_START]              = sText_Trainer1LoseText,\n    [STRINGID_PKMNGAINEDEXP - BATTLESTRINGS_TABLE_START]                 = sText_PkmnGainedEXP,\n    [STRINGID_PKMNGREWTOLV - BATTLESTRINGS_TABLE_START]                  = sText_PkmnGrewToLv,\n    [STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_TABLE_START]               = sText_PkmnLearnedMove,\n    [STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_TABLE_START]               = sText_TryToLearnMove1,\n    [STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_TABLE_START]               = sText_TryToLearnMove2,\n    [STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_TABLE_START]               = sText_TryToLearnMove3,\n    [STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_TABLE_START]                = sText_PkmnForgotMove,\n    [STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_TABLE_START]              = sText_StopLearningMove,\n    [STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_TABLE_START]               = sText_DidNotLearnMove,\n    [STRINGID_PKMNLEARNEDMOVE2 - BATTLESTRINGS_TABLE_START]              = sText_PkmnLearnedMove2,\n    [STRINGID_ATTACKMISSED - BATTLESTRINGS_TABLE_START]                  = sText_AttackMissed,\n    [STRINGID_PKMNPROTECTEDITSELF - BATTLESTRINGS_TABLE_START]           = sText_PkmnProtectedItself,\n    [STRINGID_STATSWONTINCREASE2 - BATTLESTRINGS_TABLE_START]            = sText_StatsWontIncrease2,\n    [STRINGID_AVOIDEDDAMAGE - BATTLESTRINGS_TABLE_START]                 = sText_AvoidedDamage,\n    [STRINGID_ITDOESNTAFFECT - BATTLESTRINGS_TABLE_START]                = sText_ItDoesntAffect,\n    [STRINGID_ATTACKERFAINTED - BATTLESTRINGS_TABLE_START]               = sText_AttackerFainted,\n    [STRINGID_TARGETFAINTED - BATTLESTRINGS_TABLE_START]                 = sText_TargetFainted,\n    [STRINGID_PLAYERGOTMONEY - BATTLESTRINGS_TABLE_START]                = sText_PlayerGotMoney,\n    [STRINGID_PLAYERWHITEOUT - BATTLESTRINGS_TABLE_START]                = sText_PlayerWhiteout,\n    [STRINGID_PLAYERWHITEOUT2 - BATTLESTRINGS_TABLE_START]               = sText_PlayerPanicked,\n    [STRINGID_PREVENTSESCAPE - BATTLESTRINGS_TABLE_START]                = sText_PreventsEscape,\n    [STRINGID_HITXTIMES - BATTLESTRINGS_TABLE_START]                     = sText_HitXTimes,\n    [STRINGID_PKMNFELLASLEEP - BATTLESTRINGS_TABLE_START]                = sText_PkmnFellAsleep,\n    [STRINGID_PKMNMADESLEEP - BATTLESTRINGS_TABLE_START]                 = sText_PkmnMadeSleep,\n    [STRINGID_PKMNALREADYASLEEP - BATTLESTRINGS_TABLE_START]             = sText_PkmnAlreadyAsleep,\n    [STRINGID_PKMNALREADYASLEEP2 - BATTLESTRINGS_TABLE_START]            = sText_PkmnAlreadyAsleep2,\n    [STRINGID_PKMNWASNTAFFECTED - BATTLESTRINGS_TABLE_START]             = sText_PkmnWasntAffected,\n    [STRINGID_PKMNWASPOISONED - BATTLESTRINGS_TABLE_START]               = sText_PkmnWasPoisoned,\n    [STRINGID_PKMNPOISONEDBY - BATTLESTRINGS_TABLE_START]                = sText_PkmnPoisonedBy,\n    [STRINGID_PKMNHURTBYPOISON - BATTLESTRINGS_TABLE_START]              = sText_PkmnHurtByPoison,\n    [STRINGID_PKMNALREADYPOISONED - BATTLESTRINGS_TABLE_START]           = sText_PkmnAlreadyPoisoned,\n    [STRINGID_PKMNBADLYPOISONED - BATTLESTRINGS_TABLE_START]             = sText_PkmnBadlyPoisoned,\n    [STRINGID_PKMNENERGYDRAINED - BATTLESTRINGS_TABLE_START]             = sText_PkmnEnergyDrained,\n    [STRINGID_PKMNWASBURNED - BATTLESTRINGS_TABLE_START]                 = sText_PkmnWasBurned,\n    [STRINGID_PKMNBURNEDBY - BATTLESTRINGS_TABLE_START]                  = sText_PkmnBurnedBy,\n    [STRINGID_PKMNHURTBYBURN - BATTLESTRINGS_TABLE_START]                = sText_PkmnHurtByBurn,\n    [STRINGID_PKMNWASFROZEN - BATTLESTRINGS_TABLE_START]                 = sText_PkmnWasFrozen,\n    [STRINGID_PKMNFROZENBY - BATTLESTRINGS_TABLE_START]                  = sText_PkmnFrozenBy,\n    [STRINGID_PKMNISFROZEN - BATTLESTRINGS_TABLE_START]                  = sText_PkmnIsFrozen,\n    [STRINGID_PKMNWASDEFROSTED - BATTLESTRINGS_TABLE_START]              = sText_PkmnWasDefrosted,\n    [STRINGID_PKMNWASDEFROSTED2 - BATTLESTRINGS_TABLE_START]             = sText_PkmnWasDefrosted2,\n    [STRINGID_PKMNWASDEFROSTEDBY - BATTLESTRINGS_TABLE_START]            = sText_PkmnWasDefrostedBy,\n    [STRINGID_PKMNWASPARALYZED - BATTLESTRINGS_TABLE_START]              = sText_PkmnWasParalyzed,\n    [STRINGID_PKMNWASPARALYZEDBY - BATTLESTRINGS_TABLE_START]            = sText_PkmnWasParalyzedBy,\n    [STRINGID_PKMNISPARALYZED - BATTLESTRINGS_TABLE_START]               = sText_PkmnIsParalyzed,\n    [STRINGID_PKMNISALREADYPARALYZED - BATTLESTRINGS_TABLE_START]        = sText_PkmnIsAlreadyParalyzed,\n    [STRINGID_PKMNHEALEDPARALYSIS - BATTLESTRINGS_TABLE_START]           = sText_PkmnHealedParalysis,\n    [STRINGID_PKMNDREAMEATEN - BATTLESTRINGS_TABLE_START]                = sText_PkmnDreamEaten,\n    [STRINGID_STATSWONTINCREASE - BATTLESTRINGS_TABLE_START]             = sText_StatsWontIncrease,\n    [STRINGID_STATSWONTDECREASE - BATTLESTRINGS_TABLE_START]             = sText_StatsWontDecrease,\n    [STRINGID_TEAMSTOPPEDWORKING - BATTLESTRINGS_TABLE_START]            = sText_TeamStoppedWorking,\n    [STRINGID_FOESTOPPEDWORKING - BATTLESTRINGS_TABLE_START]             = sText_FoeStoppedWorking,\n    [STRINGID_PKMNISCONFUSED - BATTLESTRINGS_TABLE_START]                = sText_PkmnIsConfused,\n    [STRINGID_PKMNHEALEDCONFUSION - BATTLESTRINGS_TABLE_START]           = sText_PkmnHealedConfusion,\n    [STRINGID_PKMNWASCONFUSED - BATTLESTRINGS_TABLE_START]               = sText_PkmnWasConfused,\n    [STRINGID_PKMNALREADYCONFUSED - BATTLESTRINGS_TABLE_START]           = sText_PkmnAlreadyConfused,\n    [STRINGID_PKMNFELLINLOVE - BATTLESTRINGS_TABLE_START]                = sText_PkmnFellInLove,\n    [STRINGID_PKMNINLOVE - BATTLESTRINGS_TABLE_START]                    = sText_PkmnInLove,\n    [STRINGID_PKMNIMMOBILIZEDBYLOVE - BATTLESTRINGS_TABLE_START]         = sText_PkmnImmobilizedByLove,\n    [STRINGID_PKMNBLOWNAWAY - BATTLESTRINGS_TABLE_START]                 = sText_PkmnBlownAway,\n    [STRINGID_PKMNCHANGEDTYPE - BATTLESTRINGS_TABLE_START]               = sText_PkmnChangedType,\n    [STRINGID_PKMNFLINCHED - BATTLESTRINGS_TABLE_START]                  = sText_PkmnFlinched,\n    [STRINGID_PKMNREGAINEDHEALTH - BATTLESTRINGS_TABLE_START]            = sText_PkmnRegainedHealth,\n    [STRINGID_PKMNHPFULL - BATTLESTRINGS_TABLE_START]                    = sText_PkmnHPFull,\n    [STRINGID_PKMNRAISEDSPDEF - BATTLESTRINGS_TABLE_START]               = sText_PkmnRaisedSpDef,\n    [STRINGID_PKMNRAISEDDEF - BATTLESTRINGS_TABLE_START]                 = sText_PkmnRaisedDef,\n    [STRINGID_PKMNCOVEREDBYVEIL - BATTLESTRINGS_TABLE_START]             = sText_PkmnCoveredByVeil,\n    [STRINGID_PKMNUSEDSAFEGUARD - BATTLESTRINGS_TABLE_START]             = sText_PkmnUsedSafeguard,\n    [STRINGID_PKMNSAFEGUARDEXPIRED - BATTLESTRINGS_TABLE_START]          = sText_PkmnSafeguardExpired,\n    [STRINGID_PKMNWENTTOSLEEP - BATTLESTRINGS_TABLE_START]               = sText_PkmnWentToSleep,\n    [STRINGID_PKMNSLEPTHEALTHY - BATTLESTRINGS_TABLE_START]              = sText_PkmnSleptHealthy,\n    [STRINGID_PKMNWHIPPEDWHIRLWIND - BATTLESTRINGS_TABLE_START]          = sText_PkmnWhippedWhirlwind,\n    [STRINGID_PKMNTOOKSUNLIGHT - BATTLESTRINGS_TABLE_START]              = sText_PkmnTookSunlight,\n    [STRINGID_PKMNLOWEREDHEAD - BATTLESTRINGS_TABLE_START]               = sText_PkmnLoweredHead,\n    [STRINGID_PKMNISGLOWING - BATTLESTRINGS_TABLE_START]                 = sText_PkmnIsGlowing,\n    [STRINGID_PKMNFLEWHIGH - BATTLESTRINGS_TABLE_START]                  = sText_PkmnFlewHigh,\n    [STRINGID_PKMNDUGHOLE - BATTLESTRINGS_TABLE_START]                   = sText_PkmnDugHole,\n    [STRINGID_PKMNSQUEEZEDBYBIND - BATTLESTRINGS_TABLE_START]            = sText_PkmnSqueezedByBind,\n    [STRINGID_PKMNTRAPPEDINVORTEX - BATTLESTRINGS_TABLE_START]           = sText_PkmnTrappedInVortex,\n    [STRINGID_PKMNWRAPPEDBY - BATTLESTRINGS_TABLE_START]                 = sText_PkmnWrappedBy,\n    [STRINGID_PKMNCLAMPED - BATTLESTRINGS_TABLE_START]                   = sText_PkmnClamped,\n    [STRINGID_PKMNHURTBY - BATTLESTRINGS_TABLE_START]                    = sText_PkmnHurtBy,\n    [STRINGID_PKMNFREEDFROM - BATTLESTRINGS_TABLE_START]                 = sText_PkmnFreedFrom,\n    [STRINGID_PKMNCRASHED - BATTLESTRINGS_TABLE_START]                   = sText_PkmnCrashed,\n    [STRINGID_PKMNSHROUDEDINMIST - BATTLESTRINGS_TABLE_START]            = gBattleText_MistShroud,\n    [STRINGID_PKMNPROTECTEDBYMIST - BATTLESTRINGS_TABLE_START]           = sText_PkmnProtectedByMist,\n    [STRINGID_PKMNGETTINGPUMPED - BATTLESTRINGS_TABLE_START]             = gBattleText_GetPumped,\n    [STRINGID_PKMNHITWITHRECOIL - BATTLESTRINGS_TABLE_START]             = sText_PkmnHitWithRecoil,\n    [STRINGID_PKMNPROTECTEDITSELF2 - BATTLESTRINGS_TABLE_START]          = sText_PkmnProtectedItself2,\n    [STRINGID_PKMNBUFFETEDBYSANDSTORM - BATTLESTRINGS_TABLE_START]       = sText_PkmnBuffetedBySandstorm,\n    [STRINGID_PKMNPELTEDBYHAIL - BATTLESTRINGS_TABLE_START]              = sText_PkmnPeltedByHail,\n    [STRINGID_PKMNSEEDED - BATTLESTRINGS_TABLE_START]                    = sText_PkmnSeeded,\n    [STRINGID_PKMNEVADEDATTACK - BATTLESTRINGS_TABLE_START]              = sText_PkmnEvadedAttack,\n    [STRINGID_PKMNSAPPEDBYLEECHSEED - BATTLESTRINGS_TABLE_START]         = sText_PkmnSappedByLeechSeed,\n    [STRINGID_PKMNFASTASLEEP - BATTLESTRINGS_TABLE_START]                = sText_PkmnFastAsleep,\n    [STRINGID_PKMNWOKEUP - BATTLESTRINGS_TABLE_START]                    = sText_PkmnWokeUp,\n    [STRINGID_PKMNUPROARKEPTAWAKE - BATTLESTRINGS_TABLE_START]           = sText_PkmnUproarKeptAwake,\n    [STRINGID_PKMNWOKEUPINUPROAR - BATTLESTRINGS_TABLE_START]            = sText_PkmnWokeUpInUproar,\n    [STRINGID_PKMNCAUSEDUPROAR - BATTLESTRINGS_TABLE_START]              = sText_PkmnCausedUproar,\n    [STRINGID_PKMNMAKINGUPROAR - BATTLESTRINGS_TABLE_START]              = sText_PkmnMakingUproar,\n    [STRINGID_PKMNCALMEDDOWN - BATTLESTRINGS_TABLE_START]                = sText_PkmnCalmedDown,\n    [STRINGID_PKMNCANTSLEEPINUPROAR - BATTLESTRINGS_TABLE_START]         = sText_PkmnCantSleepInUproar,\n    [STRINGID_PKMNSTOCKPILED - BATTLESTRINGS_TABLE_START]                = sText_PkmnStockpiled,\n    [STRINGID_PKMNCANTSTOCKPILE - BATTLESTRINGS_TABLE_START]             = sText_PkmnCantStockpile,\n    [STRINGID_PKMNCANTSLEEPINUPROAR2 - BATTLESTRINGS_TABLE_START]        = sText_PkmnCantSleepInUproar2,\n    [STRINGID_UPROARKEPTPKMNAWAKE - BATTLESTRINGS_TABLE_START]           = sText_UproarKeptPkmnAwake,\n    [STRINGID_PKMNSTAYEDAWAKEUSING - BATTLESTRINGS_TABLE_START]          = sText_PkmnStayedAwakeUsing,\n    [STRINGID_PKMNSTORINGENERGY - BATTLESTRINGS_TABLE_START]             = sText_PkmnStoringEnergy,\n    [STRINGID_PKMNUNLEASHEDENERGY - BATTLESTRINGS_TABLE_START]           = sText_PkmnUnleashedEnergy,\n    [STRINGID_PKMNFATIGUECONFUSION - BATTLESTRINGS_TABLE_START]          = sText_PkmnFatigueConfusion,\n    [STRINGID_PLAYERPICKEDUPMONEY - BATTLESTRINGS_TABLE_START]           = sText_PkmnPickedUpItem,\n    [STRINGID_PKMNUNAFFECTED - BATTLESTRINGS_TABLE_START]                = sText_PkmnUnaffected,\n    [STRINGID_PKMNTRANSFORMEDINTO - BATTLESTRINGS_TABLE_START]           = sText_PkmnTransformedInto,\n    [STRINGID_PKMNMADESUBSTITUTE - BATTLESTRINGS_TABLE_START]            = sText_PkmnMadeSubstitute,\n    [STRINGID_PKMNHASSUBSTITUTE - BATTLESTRINGS_TABLE_START]             = sText_PkmnHasSubstitute,\n    [STRINGID_SUBSTITUTEDAMAGED - BATTLESTRINGS_TABLE_START]             = sText_SubstituteDamaged,\n    [STRINGID_PKMNSUBSTITUTEFADED - BATTLESTRINGS_TABLE_START]           = sText_PkmnSubstituteFaded,\n    [STRINGID_PKMNMUSTRECHARGE - BATTLESTRINGS_TABLE_START]              = sText_PkmnMustRecharge,\n    [STRINGID_PKMNRAGEBUILDING - BATTLESTRINGS_TABLE_START]              = sText_PkmnRageBuilding,\n    [STRINGID_PKMNMOVEWASDISABLED - BATTLESTRINGS_TABLE_START]           = sText_PkmnMoveWasDisabled,\n    [STRINGID_PKMNMOVEISDISABLED - BATTLESTRINGS_TABLE_START]            = sText_PkmnMoveIsDisabled,\n    [STRINGID_PKMNMOVEDISABLEDNOMORE - BATTLESTRINGS_TABLE_START]        = sText_PkmnMoveDisabledNoMore,\n    [STRINGID_PKMNGOTENCORE - BATTLESTRINGS_TABLE_START]                 = sText_PkmnGotEncore,\n    [STRINGID_PKMNENCOREENDED - BATTLESTRINGS_TABLE_START]               = sText_PkmnEncoreEnded,\n    [STRINGID_PKMNTOOKAIM - BATTLESTRINGS_TABLE_START]                   = sText_PkmnTookAim,\n    [STRINGID_PKMNSKETCHEDMOVE - BATTLESTRINGS_TABLE_START]              = sText_PkmnSketchedMove,\n    [STRINGID_PKMNTRYINGTOTAKEFOE - BATTLESTRINGS_TABLE_START]           = sText_PkmnTryingToTakeFoe,\n    [STRINGID_PKMNTOOKFOE - BATTLESTRINGS_TABLE_START]                   = sText_PkmnTookFoe,\n    [STRINGID_PKMNREDUCEDPP - BATTLESTRINGS_TABLE_START]                 = sText_PkmnReducedPP,\n    [STRINGID_PKMNSTOLEITEM - BATTLESTRINGS_TABLE_START]                 = sText_PkmnStoleItem,\n    [STRINGID_TARGETCANTESCAPENOW - BATTLESTRINGS_TABLE_START]           = sText_TargetCantEscapeNow,\n    [STRINGID_PKMNFELLINTONIGHTMARE - BATTLESTRINGS_TABLE_START]         = sText_PkmnFellIntoNightmare,\n    [STRINGID_PKMNLOCKEDINNIGHTMARE - BATTLESTRINGS_TABLE_START]         = sText_PkmnLockedInNightmare,\n    [STRINGID_PKMNLAIDCURSE - BATTLESTRINGS_TABLE_START]                 = sText_PkmnLaidCurse,\n    [STRINGID_PKMNAFFLICTEDBYCURSE - BATTLESTRINGS_TABLE_START]          = sText_PkmnAfflictedByCurse,\n    [STRINGID_SPIKESSCATTERED - BATTLESTRINGS_TABLE_START]               = sText_SpikesScattered,\n    [STRINGID_PKMNHURTBYSPIKES - BATTLESTRINGS_TABLE_START]              = sText_PkmnHurtBySpikes,\n    [STRINGID_PKMNIDENTIFIED - BATTLESTRINGS_TABLE_START]                = sText_PkmnIdentified,\n    [STRINGID_PKMNPERISHCOUNTFELL - BATTLESTRINGS_TABLE_START]           = sText_PkmnPerishCountFell,\n    [STRINGID_PKMNBRACEDITSELF - BATTLESTRINGS_TABLE_START]              = sText_PkmnBracedItself,\n    [STRINGID_PKMNENDUREDHIT - BATTLESTRINGS_TABLE_START]                = sText_PkmnEnduredHit,\n    [STRINGID_MAGNITUDESTRENGTH - BATTLESTRINGS_TABLE_START]             = sText_MagnitudeStrength,\n    [STRINGID_PKMNCUTHPMAXEDATTACK - BATTLESTRINGS_TABLE_START]          = sText_PkmnCutHPMaxedAttack,\n    [STRINGID_PKMNCOPIEDSTATCHANGES - BATTLESTRINGS_TABLE_START]         = sText_PkmnCopiedStatChanges,\n    [STRINGID_PKMNGOTFREE - BATTLESTRINGS_TABLE_START]                   = sText_PkmnGotFree,\n    [STRINGID_PKMNSHEDLEECHSEED - BATTLESTRINGS_TABLE_START]             = sText_PkmnShedLeechSeed,\n    [STRINGID_PKMNBLEWAWAYSPIKES - BATTLESTRINGS_TABLE_START]            = sText_PkmnBlewAwaySpikes,\n    [STRINGID_PKMNFLEDFROMBATTLE - BATTLESTRINGS_TABLE_START]            = sText_PkmnFledFromBattle,\n    [STRINGID_PKMNFORESAWATTACK - BATTLESTRINGS_TABLE_START]             = sText_PkmnForesawAttack,\n    [STRINGID_PKMNTOOKATTACK - BATTLESTRINGS_TABLE_START]                = sText_PkmnTookAttack,\n    [STRINGID_PKMNATTACK - BATTLESTRINGS_TABLE_START]                    = sText_PkmnAttack,\n    [STRINGID_PKMNCENTERATTENTION - BATTLESTRINGS_TABLE_START]           = sText_PkmnCenterAttention,\n    [STRINGID_PKMNCHARGINGPOWER - BATTLESTRINGS_TABLE_START]             = sText_PkmnChargingPower,\n    [STRINGID_NATUREPOWERTURNEDINTO - BATTLESTRINGS_TABLE_START]         = sText_NaturePowerTurnedInto,\n    [STRINGID_PKMNSTATUSNORMAL - BATTLESTRINGS_TABLE_START]              = sText_PkmnStatusNormal,\n    [STRINGID_PKMNHASNOMOVESLEFT - BATTLESTRINGS_TABLE_START]            = sText_PkmnHasNoMovesLeft,\n    [STRINGID_PKMNSUBJECTEDTOTORMENT - BATTLESTRINGS_TABLE_START]        = sText_PkmnSubjectedToTorment,\n    [STRINGID_PKMNCANTUSEMOVETORMENT - BATTLESTRINGS_TABLE_START]        = sText_PkmnCantUseMoveTorment,\n    [STRINGID_PKMNTIGHTENINGFOCUS - BATTLESTRINGS_TABLE_START]           = sText_PkmnTighteningFocus,\n    [STRINGID_PKMNFELLFORTAUNT - BATTLESTRINGS_TABLE_START]              = sText_PkmnFellForTaunt,\n    [STRINGID_PKMNCANTUSEMOVETAUNT - BATTLESTRINGS_TABLE_START]          = sText_PkmnCantUseMoveTaunt,\n    [STRINGID_PKMNREADYTOHELP - BATTLESTRINGS_TABLE_START]               = sText_PkmnReadyToHelp,\n    [STRINGID_PKMNSWITCHEDITEMS - BATTLESTRINGS_TABLE_START]             = sText_PkmnSwitchedItems,\n    [STRINGID_PKMNCOPIEDFOE - BATTLESTRINGS_TABLE_START]                 = sText_PkmnCopiedFoe,\n    [STRINGID_PKMNMADEWISH - BATTLESTRINGS_TABLE_START]                  = sText_PkmnMadeWish,\n    [STRINGID_PKMNWISHCAMETRUE - BATTLESTRINGS_TABLE_START]              = sText_PkmnWishCameTrue,\n    [STRINGID_PKMNPLANTEDROOTS - BATTLESTRINGS_TABLE_START]              = sText_PkmnPlantedRoots,\n    [STRINGID_PKMNABSORBEDNUTRIENTS - BATTLESTRINGS_TABLE_START]         = sText_PkmnAbsorbedNutrients,\n    [STRINGID_PKMNANCHOREDITSELF - BATTLESTRINGS_TABLE_START]            = sText_PkmnAnchoredItself,\n    [STRINGID_PKMNWASMADEDROWSY - BATTLESTRINGS_TABLE_START]             = sText_PkmnWasMadeDrowsy,\n    [STRINGID_PKMNKNOCKEDOFF - BATTLESTRINGS_TABLE_START]                = sText_PkmnKnockedOff,\n    [STRINGID_PKMNSWAPPEDABILITIES - BATTLESTRINGS_TABLE_START]          = sText_PkmnSwappedAbilities,\n    [STRINGID_PKMNSEALEDOPPONENTMOVE - BATTLESTRINGS_TABLE_START]        = sText_PkmnSealedOpponentMove,\n    [STRINGID_PKMNCANTUSEMOVESEALED - BATTLESTRINGS_TABLE_START]         = sText_PkmnCantUseMoveSealed,\n    [STRINGID_PKMNWANTSGRUDGE - BATTLESTRINGS_TABLE_START]               = sText_PkmnWantsGrudge,\n    [STRINGID_PKMNLOSTPPGRUDGE - BATTLESTRINGS_TABLE_START]              = sText_PkmnLostPPGrudge,\n    [STRINGID_PKMNSHROUDEDITSELF - BATTLESTRINGS_TABLE_START]            = sText_PkmnShroudedItself,\n    [STRINGID_PKMNMOVEBOUNCED - BATTLESTRINGS_TABLE_START]               = sText_PkmnMoveBounced,\n    [STRINGID_PKMNWAITSFORTARGET - BATTLESTRINGS_TABLE_START]            = sText_PkmnWaitsForTarget,\n    [STRINGID_PKMNSNATCHEDMOVE - BATTLESTRINGS_TABLE_START]              = sText_PkmnSnatchedMove,\n    [STRINGID_PKMNMADEITRAIN - BATTLESTRINGS_TABLE_START]                = sText_PkmnMadeItRain,\n    [STRINGID_PKMNRAISEDSPEED - BATTLESTRINGS_TABLE_START]               = sText_PkmnRaisedSpeed,\n    [STRINGID_PKMNPROTECTEDBY - BATTLESTRINGS_TABLE_START]               = sText_PkmnProtectedBy,\n    [STRINGID_PKMNPREVENTSUSAGE - BATTLESTRINGS_TABLE_START]             = sText_PkmnPreventsUsage,\n    [STRINGID_PKMNRESTOREDHPUSING - BATTLESTRINGS_TABLE_START]           = sText_PkmnRestoredHPUsing,\n    [STRINGID_PKMNCHANGEDTYPEWITH - BATTLESTRINGS_TABLE_START]           = sText_PkmnChangedTypeWith,\n    [STRINGID_PKMNPREVENTSPARALYSISWITH - BATTLESTRINGS_TABLE_START]     = sText_PkmnPreventsParalysisWith,\n    [STRINGID_PKMNPREVENTSROMANCEWITH - BATTLESTRINGS_TABLE_START]       = sText_PkmnPreventsRomanceWith,\n    [STRINGID_PKMNPREVENTSPOISONINGWITH - BATTLESTRINGS_TABLE_START]     = sText_PkmnPreventsPoisoningWith,\n    [STRINGID_PKMNPREVENTSCONFUSIONWITH - BATTLESTRINGS_TABLE_START]     = sText_PkmnPreventsConfusionWith,\n    [STRINGID_PKMNRAISEDFIREPOWERWITH - BATTLESTRINGS_TABLE_START]       = sText_PkmnRaisedFirePowerWith,\n    [STRINGID_PKMNANCHORSITSELFWITH - BATTLESTRINGS_TABLE_START]         = sText_PkmnAnchorsItselfWith,\n    [STRINGID_PKMNCUTSATTACKWITH - BATTLESTRINGS_TABLE_START]            = sText_PkmnCutsAttackWith,\n    [STRINGID_PKMNPREVENTSSTATLOSSWITH - BATTLESTRINGS_TABLE_START]      = sText_PkmnPreventsStatLossWith,\n    [STRINGID_PKMNHURTSWITH - BATTLESTRINGS_TABLE_START]                 = sText_PkmnHurtsWith,\n    [STRINGID_PKMNTRACED - BATTLESTRINGS_TABLE_START]                    = sText_PkmnTraced,\n    [STRINGID_STATSHARPLY - BATTLESTRINGS_TABLE_START]                   = sText_StatSharply,\n    [STRINGID_STATROSE - BATTLESTRINGS_TABLE_START]                      = gBattleText_Rose,\n    [STRINGID_STATHARSHLY - BATTLESTRINGS_TABLE_START]                   = sText_StatHarshly,\n    [STRINGID_STATFELL - BATTLESTRINGS_TABLE_START]                      = sText_StatFell,\n    [STRINGID_ATTACKERSSTATROSE - BATTLESTRINGS_TABLE_START]             = sText_AttackersStatRose,\n    [STRINGID_DEFENDERSSTATROSE - BATTLESTRINGS_TABLE_START]             = gText_DefendersStatRose,\n    [STRINGID_ATTACKERSSTATFELL - BATTLESTRINGS_TABLE_START]             = sText_AttackersStatFell,\n    [STRINGID_DEFENDERSSTATFELL - BATTLESTRINGS_TABLE_START]             = sText_DefendersStatFell,\n    [STRINGID_CRITICALHIT - BATTLESTRINGS_TABLE_START]                   = sText_CriticalHit,\n    [STRINGID_ONEHITKO - BATTLESTRINGS_TABLE_START]                      = sText_OneHitKO,\n    [STRINGID_123POOF - BATTLESTRINGS_TABLE_START]                       = sText_123Poof,\n    [STRINGID_ANDELLIPSIS - BATTLESTRINGS_TABLE_START]                   = sText_AndEllipsis,\n    [STRINGID_NOTVERYEFFECTIVE - BATTLESTRINGS_TABLE_START]              = sText_NotVeryEffective,\n    [STRINGID_SUPEREFFECTIVE - BATTLESTRINGS_TABLE_START]                = sText_SuperEffective,\n    [STRINGID_GOTAWAYSAFELY - BATTLESTRINGS_TABLE_START]                 = sText_GotAwaySafely,\n    [STRINGID_WILDPKMNFLED - BATTLESTRINGS_TABLE_START]                  = sText_WildPkmnFled,\n    [STRINGID_NORUNNINGFROMTRAINERS - BATTLESTRINGS_TABLE_START]         = sText_NoRunningFromTrainers,\n    [STRINGID_CANTESCAPE - BATTLESTRINGS_TABLE_START]                    = sText_CantEscape,\n    [STRINGID_DONTLEAVEBIRCH - BATTLESTRINGS_TABLE_START]                = sText_DontLeaveBirch,\n    [STRINGID_BUTNOTHINGHAPPENED - BATTLESTRINGS_TABLE_START]            = sText_ButNothingHappened,\n    [STRINGID_BUTITFAILED - BATTLESTRINGS_TABLE_START]                   = sText_ButItFailed,\n    [STRINGID_ITHURTCONFUSION - BATTLESTRINGS_TABLE_START]               = sText_ItHurtConfusion,\n    [STRINGID_MIRRORMOVEFAILED - BATTLESTRINGS_TABLE_START]              = sText_MirrorMoveFailed,\n    [STRINGID_STARTEDTORAIN - BATTLESTRINGS_TABLE_START]                 = sText_StartedToRain,\n    [STRINGID_DOWNPOURSTARTED - BATTLESTRINGS_TABLE_START]               = sText_DownpourStarted,\n    [STRINGID_RAINCONTINUES - BATTLESTRINGS_TABLE_START]                 = sText_RainContinues,\n    [STRINGID_DOWNPOURCONTINUES - BATTLESTRINGS_TABLE_START]             = sText_DownpourContinues,\n    [STRINGID_RAINSTOPPED - BATTLESTRINGS_TABLE_START]                   = sText_RainStopped,\n    [STRINGID_SANDSTORMBREWED - BATTLESTRINGS_TABLE_START]               = sText_SandstormBrewed,\n    [STRINGID_SANDSTORMRAGES - BATTLESTRINGS_TABLE_START]                = sText_SandstormRages,\n    [STRINGID_SANDSTORMSUBSIDED - BATTLESTRINGS_TABLE_START]             = sText_SandstormSubsided,\n    [STRINGID_SUNLIGHTGOTBRIGHT - BATTLESTRINGS_TABLE_START]             = sText_SunlightGotBright,\n    [STRINGID_SUNLIGHTSTRONG - BATTLESTRINGS_TABLE_START]                = sText_SunlightStrong,\n    [STRINGID_SUNLIGHTFADED - BATTLESTRINGS_TABLE_START]                 = sText_SunlightFaded,\n    [STRINGID_STARTEDHAIL - BATTLESTRINGS_TABLE_START]                   = sText_StartedHail,\n    [STRINGID_HAILCONTINUES - BATTLESTRINGS_TABLE_START]                 = sText_HailContinues,\n    [STRINGID_HAILSTOPPED - BATTLESTRINGS_TABLE_START]                   = sText_HailStopped,\n    [STRINGID_FAILEDTOSPITUP - BATTLESTRINGS_TABLE_START]                = sText_FailedToSpitUp,\n    [STRINGID_FAILEDTOSWALLOW - BATTLESTRINGS_TABLE_START]               = sText_FailedToSwallow,\n    [STRINGID_WINDBECAMEHEATWAVE - BATTLESTRINGS_TABLE_START]            = sText_WindBecameHeatWave,\n    [STRINGID_STATCHANGESGONE - BATTLESTRINGS_TABLE_START]               = sText_StatChangesGone,\n    [STRINGID_COINSSCATTERED - BATTLESTRINGS_TABLE_START]                = sText_CoinsScattered,\n    [STRINGID_TOOWEAKFORSUBSTITUTE - BATTLESTRINGS_TABLE_START]          = sText_TooWeakForSubstitute,\n    [STRINGID_SHAREDPAIN - BATTLESTRINGS_TABLE_START]                    = sText_SharedPain,\n    [STRINGID_BELLCHIMED - BATTLESTRINGS_TABLE_START]                    = sText_BellChimed,\n    [STRINGID_FAINTINTHREE - BATTLESTRINGS_TABLE_START]                  = sText_FaintInThree,\n    [STRINGID_NOPPLEFT - BATTLESTRINGS_TABLE_START]                      = sText_NoPPLeft,\n    [STRINGID_BUTNOPPLEFT - BATTLESTRINGS_TABLE_START]                   = sText_ButNoPPLeft,\n    [STRINGID_PLAYERUSEDITEM - BATTLESTRINGS_TABLE_START]                = sText_PlayerUsedItem,\n    [STRINGID_OLDMANUSEDITEM - BATTLESTRINGS_TABLE_START]                = sText_OldManUsedItem,\n    [STRINGID_TRAINERBLOCKEDBALL - BATTLESTRINGS_TABLE_START]            = sText_TrainerBlockedBall,\n    [STRINGID_DONTBEATHIEF - BATTLESTRINGS_TABLE_START]                  = sText_DontBeAThief,\n    [STRINGID_ITDODGEDBALL - BATTLESTRINGS_TABLE_START]                  = sText_ItDodgedBall,\n    [STRINGID_YOUMISSEDPKMN - BATTLESTRINGS_TABLE_START]                 = sText_YouMissedPkmn,\n    [STRINGID_PKMNBROKEFREE - BATTLESTRINGS_TABLE_START]                 = sText_PkmnBrokeFree,\n    [STRINGID_ITAPPEAREDCAUGHT - BATTLESTRINGS_TABLE_START]              = sText_ItAppearedCaught,\n    [STRINGID_AARGHALMOSTHADIT - BATTLESTRINGS_TABLE_START]              = sText_AarghAlmostHadIt,\n    [STRINGID_SHOOTSOCLOSE - BATTLESTRINGS_TABLE_START]                  = sText_ShootSoClose,\n    [STRINGID_GOTCHAPKMNCAUGHT - BATTLESTRINGS_TABLE_START]              = sText_GotchaPkmnCaught,\n    [STRINGID_GOTCHAPKMNCAUGHT2 - BATTLESTRINGS_TABLE_START]             = sText_GotchaPkmnCaught2,\n    [STRINGID_GIVENICKNAMECAPTURED - BATTLESTRINGS_TABLE_START]          = sText_GiveNicknameCaptured,\n    [STRINGID_PKMNSENTTOPC - BATTLESTRINGS_TABLE_START]                  = sText_PkmnSentToPC,\n    [STRINGID_PKMNDATAADDEDTODEX - BATTLESTRINGS_TABLE_START]            = sText_PkmnDataAddedToDex,\n    [STRINGID_ITISRAINING - BATTLESTRINGS_TABLE_START]                   = sText_ItIsRaining,\n    [STRINGID_SANDSTORMISRAGING - BATTLESTRINGS_TABLE_START]             = sText_SandstormIsRaging,\n    [STRINGID_CANTESCAPE2 - BATTLESTRINGS_TABLE_START]                   = sText_CantEscape2,\n    [STRINGID_PKMNIGNORESASLEEP - BATTLESTRINGS_TABLE_START]             = sText_PkmnIgnoresAsleep,\n    [STRINGID_PKMNIGNOREDORDERS - BATTLESTRINGS_TABLE_START]             = sText_PkmnIgnoredOrders,\n    [STRINGID_PKMNBEGANTONAP - BATTLESTRINGS_TABLE_START]                = sText_PkmnBeganToNap,\n    [STRINGID_PKMNLOAFING - BATTLESTRINGS_TABLE_START]                   = sText_PkmnLoafing,\n    [STRINGID_PKMNWONTOBEY - BATTLESTRINGS_TABLE_START]                  = sText_PkmnWontObey,\n    [STRINGID_PKMNTURNEDAWAY - BATTLESTRINGS_TABLE_START]                = sText_PkmnTurnedAway,\n    [STRINGID_PKMNPRETENDNOTNOTICE - BATTLESTRINGS_TABLE_START]          = sText_PkmnPretendNotNotice,\n    [STRINGID_ENEMYABOUTTOSWITCHPKMN - BATTLESTRINGS_TABLE_START]        = sText_EnemyAboutToSwitchPkmn,\n    [STRINGID_THREWROCK - BATTLESTRINGS_TABLE_START]                     = sText_ThrewARock,\n    [STRINGID_THREWBAIT - BATTLESTRINGS_TABLE_START]                     = sText_ThrewSomeBait,\n    [STRINGID_PKMNWATCHINGCAREFULLY - BATTLESTRINGS_TABLE_START]         = sText_PkmnWatchingCarefully,\n    [STRINGID_PKMNANGRY - BATTLESTRINGS_TABLE_START]                     = sText_PkmnIsAngry,\n    [STRINGID_PKMNEATING - BATTLESTRINGS_TABLE_START]                    = sText_PkmnIsEating,\n    [STRINGID_DUMMY288 - BATTLESTRINGS_TABLE_START]                      = sText_Empty1,\n    [STRINGID_DUMMY289 - BATTLESTRINGS_TABLE_START]                      = sText_Empty1,\n    [STRINGID_OUTOFSAFARIBALLS - BATTLESTRINGS_TABLE_START]              = sText_OutOfSafariBalls,\n    [STRINGID_PKMNSITEMCUREDPARALYSIS - BATTLESTRINGS_TABLE_START]       = sText_PkmnsItemCuredParalysis,\n    [STRINGID_PKMNSITEMCUREDPOISON - BATTLESTRINGS_TABLE_START]          = sText_PkmnsItemCuredPoison,\n    [STRINGID_PKMNSITEMHEALEDBURN - BATTLESTRINGS_TABLE_START]           = sText_PkmnsItemHealedBurn,\n    [STRINGID_PKMNSITEMDEFROSTEDIT - BATTLESTRINGS_TABLE_START]          = sText_PkmnsItemDefrostedIt,\n    [STRINGID_PKMNSITEMWOKEIT - BATTLESTRINGS_TABLE_START]               = sText_PkmnsItemWokeIt,\n    [STRINGID_PKMNSITEMSNAPPEDOUT - BATTLESTRINGS_TABLE_START]           = sText_PkmnsItemSnappedOut,\n    [STRINGID_PKMNSITEMCUREDPROBLEM - BATTLESTRINGS_TABLE_START]         = sText_PkmnsItemCuredProblem,\n    [STRINGID_PKMNSITEMRESTOREDHEALTH - BATTLESTRINGS_TABLE_START]       = sText_PkmnsItemRestoredHealth,\n    [STRINGID_PKMNSITEMRESTOREDPP - BATTLESTRINGS_TABLE_START]           = sText_PkmnsItemRestoredPP,\n    [STRINGID_PKMNSITEMRESTOREDSTATUS - BATTLESTRINGS_TABLE_START]       = sText_PkmnsItemRestoredStatus,\n    [STRINGID_PKMNSITEMRESTOREDHPALITTLE - BATTLESTRINGS_TABLE_START]    = sText_PkmnsItemRestoredHPALittle,\n    [STRINGID_ITEMALLOWSONLYYMOVE - BATTLESTRINGS_TABLE_START]           = sText_ItemAllowsOnlyYMove,\n    [STRINGID_PKMNHUNGONWITHX - BATTLESTRINGS_TABLE_START]               = sText_PkmnHungOnWithX,\n    [STRINGID_EMPTYSTRING3 - BATTLESTRINGS_TABLE_START]                  = gText_EmptyString3,\n    [STRINGID_PKMNSXPREVENTSBURNS - BATTLESTRINGS_TABLE_START]           = sText_PkmnsXPreventsBurns,\n    [STRINGID_PKMNSXBLOCKSY - BATTLESTRINGS_TABLE_START]                 = sText_PkmnsXBlocksY,\n    [STRINGID_PKMNSXRESTOREDHPALITTLE2 - BATTLESTRINGS_TABLE_START]      = sText_PkmnsXRestoredHPALittle2,\n    [STRINGID_PKMNSXWHIPPEDUPSANDSTORM - BATTLESTRINGS_TABLE_START]      = sText_PkmnsXWhippedUpSandstorm,\n    [STRINGID_PKMNSXPREVENTSYLOSS - BATTLESTRINGS_TABLE_START]           = sText_PkmnsXPreventsYLoss,\n    [STRINGID_PKMNSXINFATUATEDY - BATTLESTRINGS_TABLE_START]             = sText_PkmnsXInfatuatedY,\n    [STRINGID_PKMNSXMADEYINEFFECTIVE - BATTLESTRINGS_TABLE_START]        = sText_PkmnsXMadeYIneffective,\n    [STRINGID_PKMNSXCUREDYPROBLEM - BATTLESTRINGS_TABLE_START]           = sText_PkmnsXCuredYProblem,\n    [STRINGID_ITSUCKEDLIQUIDOOZE - BATTLESTRINGS_TABLE_START]            = sText_ItSuckedLiquidOoze,\n    [STRINGID_PKMNTRANSFORMED - BATTLESTRINGS_TABLE_START]               = sText_PkmnTransformed,\n    [STRINGID_ELECTRICITYWEAKENED - BATTLESTRINGS_TABLE_START]           = sText_ElectricityWeakened,\n    [STRINGID_FIREWEAKENED - BATTLESTRINGS_TABLE_START]                  = sText_FireWeakened,\n    [STRINGID_PKMNHIDUNDERWATER - BATTLESTRINGS_TABLE_START]             = sText_PkmnHidUnderwater,\n    [STRINGID_PKMNSPRANGUP - BATTLESTRINGS_TABLE_START]                  = sText_PkmnSprangUp,\n    [STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_TABLE_START]        = sText_HMMovesCantBeForgotten,\n    [STRINGID_XFOUNDONEY - BATTLESTRINGS_TABLE_START]                    = sText_XFoundOneY,\n    [STRINGID_PLAYERDEFEATEDTRAINER1 - BATTLESTRINGS_TABLE_START]        = sText_PlayerDefeatedLinkTrainerTrainer1,\n    [STRINGID_SOOTHINGAROMA - BATTLESTRINGS_TABLE_START]                 = sText_SoothingAroma,\n    [STRINGID_ITEMSCANTBEUSEDNOW - BATTLESTRINGS_TABLE_START]            = sText_ItemsCantBeUsedNow,\n    [STRINGID_FORXCOMMAYZ - BATTLESTRINGS_TABLE_START]                   = sText_ForXCommaYZ,\n    [STRINGID_USINGITEMSTATOFPKMNROSE - BATTLESTRINGS_TABLE_START]       = sText_UsingItemTheStatOfPkmnRose,\n    [STRINGID_PKMNUSEDXTOGETPUMPED - BATTLESTRINGS_TABLE_START]          = sText_PkmnUsedXToGetPumped,\n    [STRINGID_PKMNSXMADEYUSELESS - BATTLESTRINGS_TABLE_START]            = sText_PkmnsXMadeYUseless,\n    [STRINGID_PKMNTRAPPEDBYSANDTOMB - BATTLESTRINGS_TABLE_START]         = sText_PkmnTrappedBySandTomb,\n    [STRINGID_EMPTYSTRING4 - BATTLESTRINGS_TABLE_START]                  = sText_EmptyString4,\n    [STRINGID_ABOOSTED - BATTLESTRINGS_TABLE_START]                      = sText_ABoosted,\n    [STRINGID_PKMNSXINTENSIFIEDSUN - BATTLESTRINGS_TABLE_START]          = sText_PkmnsXIntensifiedSun,\n    [STRINGID_PKMNMAKESGROUNDMISS - BATTLESTRINGS_TABLE_START]           = sText_PkmnMakesGroundMiss,\n    [STRINGID_YOUTHROWABALLNOWRIGHT - BATTLESTRINGS_TABLE_START]         = sText_YouThrowABallNowRight,\n    [STRINGID_PKMNSXTOOKATTACK - BATTLESTRINGS_TABLE_START]              = sText_PkmnsXTookAttack,\n    [STRINGID_PKMNCHOSEXASDESTINY - BATTLESTRINGS_TABLE_START]           = sText_PkmnChoseXAsDestiny,\n    [STRINGID_PKMNLOSTFOCUS - BATTLESTRINGS_TABLE_START]                 = sText_PkmnLostFocus,\n    [STRINGID_USENEXTPKMN - BATTLESTRINGS_TABLE_START]                   = sText_UseNextPkmn,\n    [STRINGID_PKMNFLEDUSINGITS - BATTLESTRINGS_TABLE_START]              = sText_PkmnFledUsingIts,\n    [STRINGID_PKMNFLEDUSING - BATTLESTRINGS_TABLE_START]                 = sText_PkmnFledUsing,\n    [STRINGID_PKMNWASDRAGGEDOUT - BATTLESTRINGS_TABLE_START]             = sText_PkmnWasDraggedOut,\n    [STRINGID_PREVENTEDFROMWORKING - BATTLESTRINGS_TABLE_START]          = sText_PreventedFromWorking,\n    [STRINGID_PKMNSITEMNORMALIZEDSTATUS - BATTLESTRINGS_TABLE_START]     = sText_PkmnsItemNormalizedStatus,\n    [STRINGID_TRAINER1USEDITEM - BATTLESTRINGS_TABLE_START]              = sText_Trainer1UsedItem,\n    [STRINGID_BOXISFULL - BATTLESTRINGS_TABLE_START]                     = sText_BoxIsFull,\n    [STRINGID_PKMNAVOIDEDATTACK - BATTLESTRINGS_TABLE_START]             = sText_PkmnAvoidedAttack,\n    [STRINGID_PKMNSXMADEITINEFFECTIVE - BATTLESTRINGS_TABLE_START]       = sText_PkmnsXMadeItIneffective,\n    [STRINGID_PKMNSXPREVENTSFLINCHING - BATTLESTRINGS_TABLE_START]       = sText_PkmnsXPreventsFlinching,\n    [STRINGID_PKMNALREADYHASBURN - BATTLESTRINGS_TABLE_START]            = sText_PkmnAlreadyHasBurn,\n    [STRINGID_STATSWONTDECREASE2 - BATTLESTRINGS_TABLE_START]            = sText_StatsWontDecrease2,\n    [STRINGID_PKMNSXBLOCKSY2 - BATTLESTRINGS_TABLE_START]                = sText_PkmnsXBlocksY2,\n    [STRINGID_PKMNSXWOREOFF - BATTLESTRINGS_TABLE_START]                 = sText_PkmnsXWoreOff,\n    [STRINGID_PKMNRAISEDDEFALITTLE - BATTLESTRINGS_TABLE_START]          = sText_PkmnRaisedDefALittle,\n    [STRINGID_PKMNRAISEDSPDEFALITTLE - BATTLESTRINGS_TABLE_START]        = sText_PkmnRaisedSpDefALittle,\n    [STRINGID_THEWALLSHATTERED - BATTLESTRINGS_TABLE_START]              = sText_TheWallShattered,\n    [STRINGID_PKMNSXPREVENTSYSZ - BATTLESTRINGS_TABLE_START]             = sText_PkmnsXPreventsYsZ,\n    [STRINGID_PKMNSXCUREDITSYPROBLEM - BATTLESTRINGS_TABLE_START]        = sText_PkmnsXCuredItsYProblem,\n    [STRINGID_ATTACKERCANTESCAPE - BATTLESTRINGS_TABLE_START]            = sText_AttackerCantEscape,\n    [STRINGID_PKMNOBTAINEDX - BATTLESTRINGS_TABLE_START]                 = sText_PkmnObtainedX,\n    [STRINGID_PKMNOBTAINEDX2 - BATTLESTRINGS_TABLE_START]                = sText_PkmnObtainedX2,\n    [STRINGID_PKMNOBTAINEDXYOBTAINEDZ - BATTLESTRINGS_TABLE_START]       = sText_PkmnObtainedXYObtainedZ,\n    [STRINGID_BUTNOEFFECT - BATTLESTRINGS_TABLE_START]                   = sText_ButNoEffect,\n    [STRINGID_PKMNSXHADNOEFFECTONY - BATTLESTRINGS_TABLE_START]          = sText_PkmnsXHadNoEffectOnY,\n    [STRINGID_OAKPLAYERWON - BATTLESTRINGS_TABLE_START]                  = gText_WinEarnsPrizeMoney,\n    [STRINGID_OAKPLAYERLOST - BATTLESTRINGS_TABLE_START]                 = gText_HowDissapointing,\n    [STRINGID_PLAYERLOSTAGAINSTENEMYTRAINER - BATTLESTRINGS_TABLE_START] = sText_PlayerWhiteoutAgainstTrainer,\n    [STRINGID_PLAYERPAIDPRIZEMONEY - BATTLESTRINGS_TABLE_START]          = sText_PlayerPaidAsPrizeMoney,\n    [STRINGID_PKMNTRANSFERREDSOMEONESPC - BATTLESTRINGS_TABLE_START]     = Text_MonSentToBoxInSomeonesPC,\n    [STRINGID_PKMNTRANSFERREDBILLSPC - BATTLESTRINGS_TABLE_START]        = Text_MonSentToBoxInBillsPC,\n    [STRINGID_PKMNBOXSOMEONESPCFULL - BATTLESTRINGS_TABLE_START]         = Text_MonSentToBoxSomeonesBoxFull,\n    [STRINGID_PKMNBOXBILLSPCFULL - BATTLESTRINGS_TABLE_START]            = Text_MonSentToBoxBillsBoxFull,\n    [STRINGID_POKEDUDEUSED - BATTLESTRINGS_TABLE_START]                  = sText_PokedudeUsedItem,\n    [STRINGID_POKEFLUTECATCHY - BATTLESTRINGS_TABLE_START]               = sText_PlayedFluteCatchyTune,\n    [STRINGID_POKEFLUTE - BATTLESTRINGS_TABLE_START]                     = sText_PlayedThe,\n    [STRINGID_MONHEARINGFLUTEAWOKE - BATTLESTRINGS_TABLE_START]          = sText_PkmnHearingFluteAwoke,\n    [STRINGID_TRAINER2LOSETEXT - BATTLESTRINGS_TABLE_START]              = sText_Trainer2LoseText,\n    [STRINGID_TRAINER2WINTEXT - BATTLESTRINGS_TABLE_START]               = sText_Trainer2WinText,\n    [STRINGID_PLAYERWHITEDOUT - BATTLESTRINGS_TABLE_START]               = sText_PlayerWhiteout2,\n    [STRINGID_MONTOOSCAREDTOMOVE - BATTLESTRINGS_TABLE_START]            = sText_TooScaredToMove,\n    [STRINGID_GHOSTGETOUTGETOUT - BATTLESTRINGS_TABLE_START]             = sText_GetOutGetOut,\n    [STRINGID_SILPHSCOPEUNVEILED - BATTLESTRINGS_TABLE_START]            = sText_SilphScopeUnveil,\n    [STRINGID_GHOSTWASMAROWAK - BATTLESTRINGS_TABLE_START]               = sText_TheGhostWas,\n    [STRINGID_TRAINER1MON1COMEBACK - BATTLESTRINGS_TABLE_START]          = sText_Trainer1RecallPkmn1,\n    [STRINGID_TRAINER1WINTEXT - BATTLESTRINGS_TABLE_START]               = sText_Trainer1WinText,\n    [STRINGID_TRAINER1MON2COMEBACK - BATTLESTRINGS_TABLE_START]          = sText_Trainer1RecallPkmn2,\n    [STRINGID_TRAINER1MON1AND2COMEBACK - BATTLESTRINGS_TABLE_START]      = sText_Trainer1RecallBoth,\n    [STRINGID_ENEMYABOUTTOSWITCHPKMNNOPREDICT - BATTLESTRINGS_TABLE_START] = sText_EnemyAboutToSwitchPkmnNoPredict,\n    [STRINGID_PICKUP - BATTLESTRINGS_TABLE_START]                        = sText_MonPickedUpItem,\n    [STRINGID_PICKUPSOLO - BATTLESTRINGS_TABLE_START]                    = sText_MonPickedUpItemSolo\n};\n\nconst u16 gMissStringIds[] =\n{\n    [B_MSG_MISSED]      = STRINGID_ATTACKMISSED,\n    [B_MSG_PROTECTED]   = STRINGID_PKMNPROTECTEDITSELF,\n    [B_MSG_AVOIDED_ATK] = STRINGID_PKMNAVOIDEDATTACK,\n    [B_MSG_AVOIDED_DMG] = STRINGID_AVOIDEDDAMAGE,\n    [B_MSG_GROUND_MISS] = STRINGID_PKMNMAKESGROUNDMISS\n};\n\nconst u16 gNoEscapeStringIds[] =\n{\n    [B_MSG_CANT_ESCAPE]          = STRINGID_CANTESCAPE,\n    [B_MSG_DONT_LEAVE_BIRCH]     = STRINGID_DONTLEAVEBIRCH,\n    [B_MSG_PREVENTS_ESCAPE]      = STRINGID_PREVENTSESCAPE,\n    [B_MSG_CANT_ESCAPE_2]        = STRINGID_CANTESCAPE2,\n    [B_MSG_ATTACKER_CANT_ESCAPE] = STRINGID_ATTACKERCANTESCAPE\n};\n\nconst u16 gMoveWeatherChangeStringIds[] =\n{\n    [B_MSG_STARTED_RAIN]      = STRINGID_STARTEDTORAIN,\n    [B_MSG_STARTED_DOWNPOUR]  = STRINGID_DOWNPOURSTARTED,\n    [B_MSG_WEATHER_FAILED]    = STRINGID_BUTITFAILED,\n    [B_MSG_STARTED_SANDSTORM] = STRINGID_SANDSTORMBREWED,\n    [B_MSG_STARTED_SUNLIGHT]  = STRINGID_SUNLIGHTGOTBRIGHT,\n    [B_MSG_STARTED_HAIL]      = STRINGID_STARTEDHAIL\n};\n\nconst u16 gSandstormHailContinuesStringIds[] =\n{\n    [B_MSG_SANDSTORM] = STRINGID_SANDSTORMRAGES,\n    [B_MSG_HAIL]      = STRINGID_HAILCONTINUES\n};\n\nconst u16 gSandstormHailDmgStringIds[] =\n{\n    [B_MSG_SANDSTORM] = STRINGID_PKMNBUFFETEDBYSANDSTORM,\n    [B_MSG_HAIL]      = STRINGID_PKMNPELTEDBYHAIL\n};\n\nconst u16 gSandstormHailEndStringIds[] =\n{\n    [B_MSG_SANDSTORM] = STRINGID_SANDSTORMSUBSIDED,\n    [B_MSG_HAIL]      = STRINGID_HAILSTOPPED\n};\n\nconst u16 gRainContinuesStringIds[] =\n{\n    [B_MSG_RAIN_CONTINUES]     = STRINGID_RAINCONTINUES,\n    [B_MSG_DOWNPOUR_CONTINUES] = STRINGID_DOWNPOURCONTINUES,\n    [B_MSG_RAIN_STOPPED]       = STRINGID_RAINSTOPPED\n};\n\nconst u16 gProtectLikeUsedStringIds[] =\n{\n    [B_MSG_PROTECTED_ITSELF] = STRINGID_PKMNPROTECTEDITSELF2,\n    [B_MSG_BRACED_ITSELF]    = STRINGID_PKMNBRACEDITSELF,\n    [B_MSG_PROTECT_FAILED]   = STRINGID_BUTITFAILED\n};\n\nconst u16 gReflectLightScreenSafeguardStringIds[] =\n{\n    [B_MSG_SIDE_STATUS_FAILED]     = STRINGID_BUTITFAILED,\n    [B_MSG_SET_REFLECT_SINGLE]     = STRINGID_PKMNRAISEDDEF,\n    [B_MSG_SET_REFLECT_DOUBLE]     = STRINGID_PKMNRAISEDDEFALITTLE,\n    [B_MSG_SET_LIGHTSCREEN_SINGLE] = STRINGID_PKMNRAISEDSPDEF,\n    [B_MSG_SET_LIGHTSCREEN_DOUBLE] = STRINGID_PKMNRAISEDSPDEFALITTLE,\n    [B_MSG_SET_SAFEGUARD]          = STRINGID_PKMNCOVEREDBYVEIL\n};\n\nconst u16 gLeechSeedStringIds[] =\n{\n    [B_MSG_LEECH_SEED_SET]   = STRINGID_PKMNSEEDED,\n    [B_MSG_LEECH_SEED_MISS]  = STRINGID_PKMNEVADEDATTACK,\n    [B_MSG_LEECH_SEED_FAIL]  = STRINGID_ITDOESNTAFFECT,\n    [B_MSG_LEECH_SEED_DRAIN] = STRINGID_PKMNSAPPEDBYLEECHSEED,\n    [B_MSG_LEECH_SEED_OOZE]  = STRINGID_ITSUCKEDLIQUIDOOZE\n};\n\nconst u16 gRestUsedStringIds[] =\n{\n    [B_MSG_REST]          = STRINGID_PKMNWENTTOSLEEP,\n    [B_MSG_REST_STATUSED] = STRINGID_PKMNSLEPTHEALTHY\n};\n\nconst u16 gUproarOverTurnStringIds[] =\n{\n    [B_MSG_UPROAR_CONTINUES] = STRINGID_PKMNMAKINGUPROAR,\n    [B_MSG_UPROAR_ENDS]      = STRINGID_PKMNCALMEDDOWN\n};\n\nconst u16 gStockpileUsedStringIds[] =\n{\n    [B_MSG_STOCKPILED]     = STRINGID_PKMNSTOCKPILED,\n    [B_MSG_CANT_STOCKPILE] = STRINGID_PKMNCANTSTOCKPILE\n};\n\nconst u16 gWokeUpStringIds[] =\n{\n    [B_MSG_WOKE_UP]        = STRINGID_PKMNWOKEUP,\n    [B_MSG_WOKE_UP_UPROAR] = STRINGID_PKMNWOKEUPINUPROAR\n};\n\nconst u16 gSwallowFailStringIds[] =\n{\n    [B_MSG_SWALLOW_FAILED]  = STRINGID_FAILEDTOSWALLOW,\n    [B_MSG_SWALLOW_FULL_HP] = STRINGID_PKMNHPFULL\n};\n\nconst u16 gUproarAwakeStringIds[] =\n{\n    [B_MSG_CANT_SLEEP_UPROAR]  = STRINGID_PKMNCANTSLEEPINUPROAR2,\n    [B_MSG_UPROAR_KEPT_AWAKE]  = STRINGID_UPROARKEPTPKMNAWAKE,\n    [B_MSG_STAYED_AWAKE_USING] = STRINGID_PKMNSTAYEDAWAKEUSING\n};\n\nconst u16 gStatUpStringIds[] =\n{\n    [B_MSG_ATTACKER_STAT_ROSE] = STRINGID_ATTACKERSSTATROSE,\n    [B_MSG_DEFENDER_STAT_ROSE] = STRINGID_DEFENDERSSTATROSE,\n    [B_MSG_STAT_WONT_INCREASE] = STRINGID_STATSWONTINCREASE,\n    [B_MSG_STAT_ROSE_EMPTY]    = STRINGID_EMPTYSTRING3,\n    [B_MSG_STAT_ROSE_ITEM]     = STRINGID_USINGITEMSTATOFPKMNROSE,\n    [B_MSG_USED_DIRE_HIT]      = STRINGID_PKMNUSEDXTOGETPUMPED,\n};\n\nconst u16 gStatDownStringIds[] =\n{\n    [B_MSG_ATTACKER_STAT_FELL] = STRINGID_ATTACKERSSTATFELL,\n    [B_MSG_DEFENDER_STAT_FELL] = STRINGID_DEFENDERSSTATFELL,\n    [B_MSG_STAT_WONT_DECREASE] = STRINGID_STATSWONTDECREASE,\n    [B_MSG_STAT_FELL_EMPTY]    = STRINGID_EMPTYSTRING3\n};\n\n// Index read from sTWOTURN_STRINGID\nconst u16 gFirstTurnOfTwoStringIds[] =\n{\n    [B_MSG_TURN1_RAZOR_WIND] = STRINGID_PKMNWHIPPEDWHIRLWIND,\n    [B_MSG_TURN1_SOLAR_BEAM] = STRINGID_PKMNTOOKSUNLIGHT,\n    [B_MSG_TURN1_SKULL_BASH] = STRINGID_PKMNLOWEREDHEAD,\n    [B_MSG_TURN1_SKY_ATTACK] = STRINGID_PKMNISGLOWING,\n    [B_MSG_TURN1_FLY]        = STRINGID_PKMNFLEWHIGH,\n    [B_MSG_TURN1_DIG]        = STRINGID_PKMNDUGHOLE,\n    [B_MSG_TURN1_DIVE]       = STRINGID_PKMNHIDUNDERWATER,\n    [B_MSG_TURN1_BOUNCE]     = STRINGID_PKMNSPRANGUP\n};\n\n// Index copied from move's index in gTrappingMoves\nconst u16 gWrappedStringIds[] =\n{\n    STRINGID_PKMNSQUEEZEDBYBIND,   // MOVE_BIND\n    STRINGID_PKMNWRAPPEDBY,        // MOVE_WRAP\n    STRINGID_PKMNTRAPPEDINVORTEX,  // MOVE_FIRE_SPIN\n    STRINGID_PKMNCLAMPED,          // MOVE_CLAMP\n    STRINGID_PKMNTRAPPEDINVORTEX,  // MOVE_WHIRLPOOL\n    STRINGID_PKMNTRAPPEDBYSANDTOMB // MOVE_SAND_TOMB\n};\n\nconst u16 gMistUsedStringIds[] =\n{\n    [B_MSG_SET_MIST]    = STRINGID_PKMNSHROUDEDINMIST,\n    [B_MSG_MIST_FAILED] = STRINGID_BUTITFAILED\n};\n\nconst u16 gFocusEnergyUsedStringIds[] =\n{\n    [B_MSG_GETTING_PUMPED]      = STRINGID_PKMNGETTINGPUMPED,\n    [B_MSG_FOCUS_ENERGY_FAILED] = STRINGID_BUTITFAILED\n};\n\nconst u16 gTransformUsedStringIds[] =\n{\n    [B_MSG_TRANSFORMED]      = STRINGID_PKMNTRANSFORMEDINTO,\n    [B_MSG_TRANSFORM_FAILED] = STRINGID_BUTITFAILED\n};\n\nconst u16 gSubstituteUsedStringIds[] =\n{\n    [B_MSG_SET_SUBSTITUTE]    = STRINGID_PKMNMADESUBSTITUTE,\n    [B_MSG_SUBSTITUTE_FAILED] = STRINGID_TOOWEAKFORSUBSTITUTE\n};\n\nconst u16 gGotPoisonedStringIds[] =\n{\n    [B_MSG_STATUSED]            = STRINGID_PKMNWASPOISONED,\n    [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNPOISONEDBY\n};\n\nconst u16 gGotParalyzedStringIds[] =\n{\n    [B_MSG_STATUSED]            = STRINGID_PKMNWASPARALYZED,\n    [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNWASPARALYZEDBY\n};\n\nconst u16 gFellAsleepStringIds[] =\n{\n    [B_MSG_STATUSED]            = STRINGID_PKMNFELLASLEEP,\n    [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNMADESLEEP\n};\n\nconst u16 gGotBurnedStringIds[] =\n{\n    [B_MSG_STATUSED]            = STRINGID_PKMNWASBURNED,\n    [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNBURNEDBY\n};\n\nconst u16 gGotFrozenStringIds[] =\n{\n    [B_MSG_STATUSED]            = STRINGID_PKMNWASFROZEN,\n    [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNFROZENBY\n};\n\nconst u16 gGotDefrostedStringIds[] =\n{\n    [B_MSG_DEFROSTED]         = STRINGID_PKMNWASDEFROSTED2,\n    [B_MSG_DEFROSTED_BY_MOVE] = STRINGID_PKMNWASDEFROSTEDBY\n};\n\nconst u16 gKOFailedStringIds[] =\n{\n    [B_MSG_KO_MISS]       = STRINGID_ATTACKMISSED,\n    [B_MSG_KO_UNAFFECTED] = STRINGID_PKMNUNAFFECTED\n};\n\nconst u16 gAttractUsedStringIds[] =\n{\n    [B_MSG_STATUSED]            = STRINGID_PKMNFELLINLOVE,\n    [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNSXINFATUATEDY\n};\n\nconst u16 gAbsorbDrainStringIds[] =\n{\n    [B_MSG_ABSORB]      = STRINGID_PKMNENERGYDRAINED,\n    [B_MSG_ABSORB_OOZE] = STRINGID_ITSUCKEDLIQUIDOOZE\n};\n\nconst u16 gSportsUsedStringIds[] =\n{\n    [B_MSG_WEAKEN_ELECTRIC] = STRINGID_ELECTRICITYWEAKENED,\n    [B_MSG_WEAKEN_FIRE]     = STRINGID_FIREWEAKENED\n};\n\nconst u16 gPartyStatusHealStringIds[] =\n{\n    [B_MSG_BELL]                     = STRINGID_BELLCHIMED,\n    [B_MSG_BELL_SOUNDPROOF_ATTACKER] = STRINGID_BELLCHIMED,\n    [B_MSG_BELL_SOUNDPROOF_PARTNER]  = STRINGID_BELLCHIMED,\n    [B_MSG_BELL_BOTH_SOUNDPROOF]     = STRINGID_BELLCHIMED,\n    [B_MSG_SOOTHING_AROMA]           = STRINGID_SOOTHINGAROMA\n};\n\nconst u16 gFutureMoveUsedStringIds[] =\n{\n    [B_MSG_FUTURE_SIGHT] = STRINGID_PKMNFORESAWATTACK,\n    [B_MSG_DOOM_DESIRE]  = STRINGID_PKMNCHOSEXASDESTINY\n};\n\nconst u16 gBallEscapeStringIds[] =\n{\n    [BALL_NO_SHAKES]     = STRINGID_PKMNBROKEFREE,\n    [BALL_1_SHAKE]       = STRINGID_ITAPPEAREDCAUGHT,\n    [BALL_2_SHAKES]      = STRINGID_AARGHALMOSTHADIT,\n    [BALL_3_SHAKES_FAIL] = STRINGID_SHOOTSOCLOSE\n};\n\n// Overworld weathers that don't have an associated battle weather default to \"It is raining.\"\nconst u16 gWeatherStartsStringIds[] =\n{\n    [WEATHER_NONE]               = STRINGID_ITISRAINING,\n    [WEATHER_SUNNY_CLOUDS]       = STRINGID_ITISRAINING,\n    [WEATHER_SUNNY]              = STRINGID_ITISRAINING,\n    [WEATHER_RAIN]               = STRINGID_ITISRAINING,\n    [WEATHER_SNOW]               = STRINGID_ITISRAINING,\n    [WEATHER_RAIN_THUNDERSTORM]  = STRINGID_ITISRAINING,\n    [WEATHER_FOG_HORIZONTAL]     = STRINGID_ITISRAINING,\n    [WEATHER_VOLCANIC_ASH]       = STRINGID_ITISRAINING,\n    [WEATHER_SANDSTORM]          = STRINGID_SANDSTORMISRAGING,\n    [WEATHER_FOG_DIAGONAL]       = STRINGID_ITISRAINING,\n    [WEATHER_UNDERWATER]         = STRINGID_ITISRAINING,\n    [WEATHER_SHADE]              = STRINGID_ITISRAINING,\n    [WEATHER_DROUGHT]            = STRINGID_SUNLIGHTSTRONG,\n    [WEATHER_DOWNPOUR]           = STRINGID_ITISRAINING,\n    [WEATHER_UNDERWATER_BUBBLES] = STRINGID_ITISRAINING,\n    [WEATHER_ABNORMAL]           = STRINGID_ITISRAINING\n};\n\nconst u16 gInobedientStringIds[] =\n{\n    [B_MSG_LOAFING]            = STRINGID_PKMNLOAFING,\n    [B_MSG_WONT_OBEY]          = STRINGID_PKMNWONTOBEY,\n    [B_MSG_TURNED_AWAY]        = STRINGID_PKMNTURNEDAWAY,\n    [B_MSG_PRETEND_NOT_NOTICE] = STRINGID_PKMNPRETENDNOTNOTICE\n};\n\nconst u16 gSafariReactionStringIds[NUM_SAFARI_REACTIONS] =\n{\n    [B_MSG_MON_WATCHING] = STRINGID_PKMNWATCHINGCAREFULLY,\n    [B_MSG_MON_ANGRY]    = STRINGID_PKMNANGRY,\n    [B_MSG_MON_EATING]   = STRINGID_PKMNEATING\n};\n\nconst u16 gTrainerItemCuredStatusStringIds[] =\n{\n    [AI_HEAL_CONFUSION] = STRINGID_PKMNSITEMSNAPPEDOUT,\n    [AI_HEAL_PARALYSIS] = STRINGID_PKMNSITEMCUREDPARALYSIS,\n    [AI_HEAL_FREEZE]    = STRINGID_PKMNSITEMDEFROSTEDIT,\n    [AI_HEAL_BURN]      = STRINGID_PKMNSITEMHEALEDBURN,\n    [AI_HEAL_POISON]    = STRINGID_PKMNSITEMCUREDPOISON,\n    [AI_HEAL_SLEEP]     = STRINGID_PKMNSITEMWOKEIT\n};\n\nconst u16 gBerryEffectStringIds[] =\n{\n    [B_MSG_CURED_PROBLEM]     = STRINGID_PKMNSITEMCUREDPROBLEM,\n    [B_MSG_NORMALIZED_STATUS] = STRINGID_PKMNSITEMNORMALIZEDSTATUS\n};\n\nconst u16 gBRNPreventionStringIds[] =\n{\n    [B_MSG_ABILITY_PREVENTS_MOVE_STATUS]    = STRINGID_PKMNSXPREVENTSBURNS,\n    [B_MSG_ABILITY_PREVENTS_ABILITY_STATUS] = STRINGID_PKMNSXPREVENTSYSZ,\n    [B_MSG_STATUS_HAD_NO_EFFECT]            = STRINGID_PKMNSXHADNOEFFECTONY\n};\n\nconst u16 gPRLZPreventionStringIds[] =\n{\n    [B_MSG_ABILITY_PREVENTS_MOVE_STATUS]    = STRINGID_PKMNPREVENTSPARALYSISWITH,\n    [B_MSG_ABILITY_PREVENTS_ABILITY_STATUS] = STRINGID_PKMNSXPREVENTSYSZ,\n    [B_MSG_STATUS_HAD_NO_EFFECT]            = STRINGID_PKMNSXHADNOEFFECTONY\n};\n\nconst u16 gPSNPreventionStringIds[] =\n{\n    [B_MSG_ABILITY_PREVENTS_MOVE_STATUS]    = STRINGID_PKMNPREVENTSPOISONINGWITH,\n    [B_MSG_ABILITY_PREVENTS_ABILITY_STATUS] = STRINGID_PKMNSXPREVENTSYSZ,\n    [B_MSG_STATUS_HAD_NO_EFFECT]            = STRINGID_PKMNSXHADNOEFFECTONY\n};\n\nconst u16 gItemSwapStringIds[] =\n{\n    [B_MSG_ITEM_SWAP_TAKEN] = STRINGID_PKMNOBTAINEDX,\n    [B_MSG_ITEM_SWAP_GIVEN] = STRINGID_PKMNOBTAINEDX2,\n    [B_MSG_ITEM_SWAP_BOTH]  = STRINGID_PKMNOBTAINEDXYOBTAINEDZ\n};\n\nconst u16 gFlashFireStringIds[] =\n{\n    [B_MSG_FLASH_FIRE_BOOST]    = STRINGID_PKMNRAISEDFIREPOWERWITH,\n    [B_MSG_FLASH_FIRE_NO_BOOST] = STRINGID_PKMNSXMADEYINEFFECTIVE\n};\n\nconst u16 gCaughtMonStringIds[] =\n{\n    [B_MSG_SENT_SOMEONES_PC]  = STRINGID_PKMNTRANSFERREDSOMEONESPC,\n    [B_MSG_SENT_BILLS_PC]     = STRINGID_PKMNTRANSFERREDBILLSPC,\n    [B_MSG_SOMEONES_BOX_FULL] = STRINGID_PKMNBOXSOMEONESPCFULL,\n    [B_MSG_BILLS_BOX_FULL]    = STRINGID_PKMNBOXBILLSPCFULL\n};\n\n// Index is determined in VARIOUS_GET_BATTLERS_FOR_RECALL by ORing flags for each present battler on the losing side.\n// No battlers (0) is skipped.\nconst u16 gDoubleBattleRecallStrings[1 << (MAX_BATTLERS_COUNT / 2)] =\n{\n    STRINGID_TRAINER1MON1COMEBACK,\n    STRINGID_TRAINER1MON1COMEBACK,\n    STRINGID_TRAINER1MON2COMEBACK,\n    STRINGID_TRAINER1MON1AND2COMEBACK\n};\n\nconst u16 gTrappingMoves[NUM_TRAPPING_MOVES + 1] =\n{\n    MOVE_BIND,\n    MOVE_WRAP,\n    MOVE_FIRE_SPIN,\n    MOVE_CLAMP,\n    MOVE_WHIRLPOOL,\n    MOVE_SAND_TOMB,\n    0xFFFF // Never read\n};\n\nconst u8 gText_PkmnIsEvolving[] = _(\"What?\\n{STR_VAR_1} is evolving!\");\nconst u8 gText_CongratsPkmnEvolved[] = _(\"Congratulations! Your {STR_VAR_1}\\nevolved into {STR_VAR_2}!{WAIT_SE}\\p\");\nconst u8 gText_PkmnStoppedEvolving[] = _(\"Huh? {STR_VAR_1}\\nstopped evolving!\\p\");\nconst u8 gText_EllipsisQuestionMark[] = _(\"……?\\p\");\nconst u8 gText_WhatWillPkmnDo[] = _(\"What will\\n{B_ACTIVE_NAME_WITH_PREFIX} do?\");\nconst u8 gText_WhatWillPlayerThrow[] = _(\"What will {B_PLAYER_NAME}\\nthrow?\");\nconst u8 gText_WhatWillOldManDo[] = _(\"What will the\\nold man do?\");\nconst u8 gText_LinkStandby[] = _(\"{PAUSE 16}Link standby…\");\nconst u8 gText_BattleMenu[] = _(\"{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 13 14 15}FIGHT{CLEAR_TO 56}BAG\\nPOKéMON{CLEAR_TO 56}RUN\");\nconst u8 gText_SafariZoneMenu[] = _(\"{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 13 14 15}BALL{CLEAR_TO 56}BAIT\\nROCK{CLEAR_TO 56}RUN\");\nconst u8 gText_MoveInterfacePP[] = _(\"PP \");\nconst u8 gText_MoveInterfaceType[] = _(\"TYPE/\");\nconst u8 gText_MoveInterfaceDynamicColors[] = _(\"{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 13 14 15}\");\nconst u8 gText_BattleYesNoChoice[] = _(\"{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 13 14 15}Yes\\nNo\");\nconst u8 gText_BattleSwitchWhich[] = _(\"{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 13 14 15}Switch\\nwhich?\");\nstatic const u8 sText_UnusedColors[] = _(\"{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 13 14 15}\");\nstatic const u8 sText_RightArrow2[] = _(\"{RIGHT_ARROW_2}\");\nstatic const u8 sText_Plus[] = _(\"{PLUS}\");\nstatic const u8 sText_Dash[] = _(\"-\");\n\nstatic const u8 sText_MaxHP[] = _(\"{FONT_SMALL}Max{FONT_NORMAL} HP\");\nstatic const u8 sText_Attack[] = _(\"ATTACK \");\nstatic const u8 sText_Defense[] = _(\"DEFENSE\");\nstatic const u8 sText_SpAtk[] = _(\"SP. ATK\");\nstatic const u8 sText_SpDef[] = _(\"SP. DEF\");\n\n// Unused\nstatic const u8 *const sStatNamesTable2[] =\n{\n    sText_MaxHP,\n    sText_SpAtk,\n    sText_Attack,\n    sText_SpDef,\n    sText_Defense,\n    sText_Speed\n};\n\nconst u8 gText_SafariBalls[] = _(\"{HIGHLIGHT 2}SAFARI BALLS\"); //\nconst u8 gText_HighlightRed_Left[] = _(\"{HIGHLIGHT 2}Left: \");\nconst u8 gText_HighlightRed[] = _(\"{HIGHLIGHT 2}\");\nconst u8 gText_Sleep[] = _(\"sleep\");\nconst u8 gText_Poison[] = _(\"poison\");\nconst u8 gText_Burn[] = _(\"burn\");\nconst u8 gText_Paralysis[] = _(\"paralysis\");\nconst u8 gText_Ice[] = _(\"ice\");\nconst u8 gText_Confusion[] = _(\"confusion\");\nconst u8 gText_Love[] = _(\"love\");\nconst u8 gText_BattleTowerBan_Space[] = _(\"  \");\nconst u8 gText_BattleTowerBan_Newline1[] = _(\"\\n\");\nconst u8 gText_BattleTowerBan_Newline2[] = _(\"\\n\");\nconst u8 gText_BattleTowerBan_Is1[] = _(\" is\");\nconst u8 gText_BattleTowerBan_Is2[] = _(\" is\");\nconst u8 gText_BadEgg[] = _(\"Bad EGG\");\nconst u8 gText_BattleWallyName[] = _(\"ミツル\");\nconst u8 gText_Win[] = _(\"{HIGHLIGHT 0}Win\");\nconst u8 gText_Loss[] = _(\"{HIGHLIGHT 0}Loss\");\nconst u8 gText_Draw[] = _(\"{HIGHLIGHT 0}Draw\");\nstatic const u8 sText_SpaceIs[] = _(\" is\");\nstatic const u8 sText_ApostropheS[] = _(\"'s\");\nconst u8 gText_ANormalMove[] = _(\"a NORMAL move\");\nconst u8 gText_AFightingMove[] = _(\"a FIGHTING move\");\nconst u8 gText_AFlyingMove[] = _(\"a FLYING move\");\nconst u8 gText_APoisonMove[] = _(\"a POISON move\");\nconst u8 gText_AGroundMove[] = _(\"a GROUND move\");\nconst u8 gText_ARockMove[] = _(\"a ROCK move\");\nconst u8 gText_ABugMove[] = _(\"a BUG move\");\nconst u8 gText_AGhostMove[] = _(\"a GHOST move\");\nconst u8 gText_ASteelMove[] = _(\"a STEEL move\");\nconst u8 gText_AMysteryMove[] = _(\"a ??? move\");\nconst u8 gText_AFireMove[] = _(\"a FIRE move\");\nconst u8 gText_AWaterMove[] = _(\"a WATER move\");\nconst u8 gText_AGrassMove[] = _(\"a GRASS move\");\nconst u8 gText_AnElectricMove[] = _(\"an ELECTRIC move\");\nconst u8 gText_APsychicMove[] = _(\"a PSYCHIC move\");\nconst u8 gText_AnIceMove[] = _(\"an ICE move\");\nconst u8 gText_ADragonMove[] = _(\"a DRAGON move\");\nconst u8 gText_ADarkMove[] = _(\"a DARK move\");\nconst u8 gText_TimeBoard[] = _(\"TIME BOARD\");\nconst u8 gText_ClearTime[] = _(\"CLEAR TIME\"); // Unused\nconst u8 gText_XMinYZSec[] = _(\"{STR_VAR_1}MIN. {STR_VAR_2}.{STR_VAR_3}SEC.\");\nconst u8 gText_Unused_1F[] = _(\"1F\");\nconst u8 gText_Unused_2F[] = _(\"2F\");\nconst u8 gText_Unused_3F[] = _(\"3F\");\nconst u8 gText_Unused_4F[] = _(\"4F\");\nconst u8 gText_Unused_5F[] = _(\"5F\");\nconst u8 gText_Unused_6F[] = _(\"6F\");\nconst u8 gText_Unused_7F[] = _(\"7F\");\nconst u8 gText_Unused_8F[] = _(\"8F\");\n\nconst u8 *const gTrainerTowerChallengeTypeTexts[NUM_TOWER_CHALLENGE_TYPES] =\n{\n    gOtherText_Single,\n    gOtherText_Double,\n    gOtherText_Knockout,\n    gOtherText_Mixed\n};\n\nstatic const u8 sText_Trainer1Fled[] = _(\"{PLAY_SE SE_FLEE}{B_TRAINER1_CLASS} {B_TRAINER1_NAME} fled!\");\nstatic const u8 sText_PlayerLostAgainstTrainer1[] = _(\"Player lost against\\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!\");\nstatic const u8 sText_PlayerBattledToDrawTrainer1[] = _(\"Player battled to a draw against\\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!\");\n\nstatic const u8 *const sATypeMove_Table[NUMBER_OF_MON_TYPES] =\n{\n    [TYPE_NORMAL]   = gText_ANormalMove,\n    [TYPE_FIGHTING] = gText_AFightingMove,\n    [TYPE_FLYING]   = gText_AFlyingMove,\n    [TYPE_POISON]   = gText_APoisonMove,\n    [TYPE_GROUND]   = gText_AGroundMove,\n    [TYPE_ROCK]     = gText_ARockMove,\n    [TYPE_BUG]      = gText_ABugMove,\n    [TYPE_GHOST]    = gText_AGhostMove,\n    [TYPE_STEEL]    = gText_ASteelMove,\n    [TYPE_MYSTERY]  = gText_AMysteryMove,\n    [TYPE_FIRE]     = gText_AFireMove,\n    [TYPE_WATER]    = gText_AWaterMove,\n    [TYPE_GRASS]    = gText_AGrassMove,\n    [TYPE_ELECTRIC] = gText_AnElectricMove,\n    [TYPE_PSYCHIC]  = gText_APsychicMove,\n    [TYPE_ICE]      = gText_AnIceMove,\n    [TYPE_DRAGON]   = gText_ADragonMove,\n    [TYPE_DARK]     = gText_ADarkMove\n};\n\n// code\nvoid BufferStringBattle(u16 stringId)\n{\n    s32 i;\n    const u8 *stringPtr = NULL;\n    u8 multiplayerId = GetMultiplayerId();\n\n    sBattleMsgDataPtr = (struct BattleMsgData *)(&gBattleBufferA[gActiveBattler][4]);\n    gLastUsedItem = sBattleMsgDataPtr->lastItem;\n    gLastUsedAbility = sBattleMsgDataPtr->lastAbility;\n    gBattleScripting.battler = sBattleMsgDataPtr->scrActive;\n    *(&gBattleStruct->scriptPartyIdx) = sBattleMsgDataPtr->bakScriptPartyIdx;\n    *(&gBattleStruct->hpScale) = sBattleMsgDataPtr->hpScale;\n    gPotentialItemEffectBattler = sBattleMsgDataPtr->itemEffectBattler;\n    *(&gBattleStruct->stringMoveType) = sBattleMsgDataPtr->moveType;\n\n    for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n    {\n        sBattlerAbilities[i] = sBattleMsgDataPtr->abilities[i];\n    }\n    for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++)\n    {\n        gBattleTextBuff1[i] = sBattleMsgDataPtr->textBuffs[0][i];\n        gBattleTextBuff2[i] = sBattleMsgDataPtr->textBuffs[1][i];\n        gBattleTextBuff3[i] = sBattleMsgDataPtr->textBuffs[2][i];\n    }\n\n    switch (stringId)\n    {\n    case STRINGID_INTROMSG: // first battle msg\n        if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n            {\n                if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n                {\n                    u8 title1 = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead;\n                    u8 title2 = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id)))].neverRead;\n                    if(title1 && title2)\n                        stringPtr = sText_TwoLinkTrainersWantToBattleYY;\n                    else if(title1 && !title2)\n                        stringPtr = sText_TwoLinkTrainersWantToBattleYN;\n                    else if(!title1 && title2)\n                        stringPtr = sText_TwoLinkTrainersWantToBattleYY;\n                    else\n                        stringPtr = sText_TwoLinkTrainersWantToBattle;\n                }\n                else\n                {\n                    if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)\n                        stringPtr = sText_Trainer1WantsToBattle;\n                    else\n                        stringPtr = sText_LinkTrainerWantsToBattle;\n                }\n            }\n            else\n            {\n                stringPtr = sText_Trainer1WantsToBattle;\n            }\n        }\n        else\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_GHOST)\n            {\n                if (gBattleTypeFlags & BATTLE_TYPE_GHOST_UNVEILED)\n                    stringPtr = sText_TheGhostAppeared;\n                else\n                    stringPtr = sText_GhostAppearedCantId;\n            }\n            else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY)\n                stringPtr = sText_WildPkmnAppeared2;\n            else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) // interesting, looks like they had something planned for wild double battles\n                stringPtr = sText_TwoWildPkmnAppeared;\n            else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL)\n                stringPtr = sText_WildPkmnAppearedPause;\n            else\n                stringPtr = sText_WildPkmnAppeared;\n        }\n        break;\n    case STRINGID_INTROSENDOUT: // poke first send-out\n        if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n            {\n                if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n                {\n                    if(gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(gLinkPlayers[multiplayerId].id))].neverRead != 0)\n                        stringPtr = sText_LinkPartnerSentOutPkmnGoPkmnTitle;\n                    else\n                        stringPtr = sText_LinkPartnerSentOutPkmnGoPkmn;\n                }\n                else\n                    stringPtr = sText_GoTwoPkmn;\n            }\n            else\n            {\n                stringPtr = sText_GoPkmn;\n            }\n        }\n        else\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n            {\n                if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n                {\n                    u8 title1 = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead;\n                    u8 title2 = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id)))].neverRead;\n                    if(title1 && title2)\n                        stringPtr = sText_TwoLinkTrainersSentOutPkmnYY;\n                    else if(title1 && !title2)\n                        stringPtr = sText_TwoLinkTrainersSentOutPkmnYN;\n                    else if(!title1 && title2)\n                        stringPtr = sText_TwoLinkTrainersSentOutPkmnNY;\n                    else\n                        stringPtr = sText_TwoLinkTrainersSentOutPkmn;\n                }\n                else if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n                {\n                    if(gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead != 0)\n                        stringPtr = sText_LinkTrainerSentOutTwoPkmnTitle;\n                    else\n                        stringPtr = sText_LinkTrainerSentOutTwoPkmn;\n                }\n                else\n                    stringPtr = sText_Trainer1SentOutTwoPkmn;\n            }\n            else\n            {\n                if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))\n                    stringPtr = sText_Trainer1SentOutPkmn;\n                else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)\n                    stringPtr = sText_Trainer1SentOutPkmn;\n                else\n                {\n                    if(gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead != 0)\n                        stringPtr = sText_LinkTrainerSentOutPkmnTitle;\n                    else\n                        stringPtr = sText_LinkTrainerSentOutPkmn;\n                }\n            }\n        }\n        break;\n    case STRINGID_RETURNMON: // sending poke to ball msg\n        if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        {\n            if (*(&gBattleStruct->hpScale) == 0)\n                stringPtr = sText_PkmnThatsEnough;\n            else if (*(&gBattleStruct->hpScale) == 1 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n                stringPtr = sText_PkmnComeBack;\n            else if (*(&gBattleStruct->hpScale) == 2)\n                stringPtr = sText_PkmnOkComeBack;\n            else\n                stringPtr = sText_PkmnGoodComeBack;\n        }\n        else\n        {\n            if (gTrainerBattleOpponent_A == TRAINER_LINK_OPPONENT)\n            {\n                if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n                {\n                    if(gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].neverRead != 0)\n                        stringPtr = sText_LinkTrainer2WithdrewPkmnTitle;\n                    else\n                        stringPtr = sText_LinkTrainer2WithdrewPkmn;\n                }\n                else\n                {\n                    if(gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead != 0)\n                        stringPtr = sText_LinkTrainer1WithdrewPkmnTitle;\n                    else\n                        stringPtr = sText_LinkTrainer1WithdrewPkmn;\n                }\n            }\n            else\n            {\n                stringPtr = sText_Trainer1WithdrewPkmn;\n            }\n        }\n        break;\n    case STRINGID_SWITCHINMON: // switch-in msg\n        if (GetBattlerSide(gBattleScripting.battler) == B_SIDE_PLAYER)\n        {\n            if (*(&gBattleStruct->hpScale) == 0 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n                stringPtr = sText_GoPkmn2;\n            else if (*(&gBattleStruct->hpScale) == 1)\n                stringPtr = sText_DoItPkmn;\n            else if (*(&gBattleStruct->hpScale) == 2)\n                stringPtr = sText_GoForItPkmn;\n            else\n                stringPtr = sText_YourFoesWeakGetEmPkmn;\n        }\n        else\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n            {\n                if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n                {\n                    if(gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].neverRead != 0)\n                        stringPtr = sText_LinkTrainerMultiSentOutPkmnTitle;\n                    else\n                        stringPtr = sText_LinkTrainerMultiSentOutPkmn;\n                }\n                else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)\n                    stringPtr = sText_Trainer1SentOutPkmn2;\n                else\n                {\n                    if(gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead != 0)\n                        stringPtr = sText_LinkTrainerSentOutPkmn2Title;\n                    else\n                        stringPtr = sText_LinkTrainerSentOutPkmn2;\n                }\n            }\n            else\n            {\n                stringPtr = sText_Trainer1SentOutPkmn2;\n            }\n        }\n        break;\n    case STRINGID_USEDMOVE: // pokemon used a move msg\n        if (sBattleMsgDataPtr->currentMove >= MOVES_COUNT)\n            StringCopy(gBattleTextBuff2, sATypeMove_Table[*(&gBattleStruct->stringMoveType)]);\n        else\n            StringCopy(gBattleTextBuff2, gMoveNames[sBattleMsgDataPtr->currentMove]);\n\n        stringPtr = sText_AttackerUsedX;\n        break;\n    case STRINGID_BATTLEEND: // battle end\n        if (gBattleTextBuff1[0] & B_OUTCOME_LINK_BATTLE_RAN)\n        {\n            gBattleTextBuff1[0] &= ~(B_OUTCOME_LINK_BATTLE_RAN);\n            if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && gBattleTextBuff1[0] != B_OUTCOME_DREW)\n                gBattleTextBuff1[0] ^= (B_OUTCOME_LOST | B_OUTCOME_WON);\n\n            if (gBattleTextBuff1[0] == B_OUTCOME_LOST || gBattleTextBuff1[0] == B_OUTCOME_DREW)\n                stringPtr = sText_GotAwaySafely;\n            else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n                stringPtr = sText_TwoWildFled;\n            else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)\n                stringPtr = sText_Trainer1Fled;\n            else\n                stringPtr = sText_WildFled;\n        }\n        else\n        {\n            if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && gBattleTextBuff1[0] != B_OUTCOME_DREW)\n                gBattleTextBuff1[0] ^= (B_OUTCOME_LOST | B_OUTCOME_WON);\n\n            if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n            {\n                switch (gBattleTextBuff1[0])\n                {\n                case B_OUTCOME_WON:\n                    stringPtr = sText_TwoLinkTrainersDefeated;\n                    break;\n                case B_OUTCOME_LOST:\n                    stringPtr = sText_PlayerLostToTwo;\n                    break;\n                case B_OUTCOME_DREW:\n                    stringPtr = sText_PlayerBattledToDrawVsTwo;\n                    break;\n                }\n            }\n            else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)\n            {\n                switch (gBattleTextBuff1[0])\n                {\n                case B_OUTCOME_WON:\n                    stringPtr = sText_PlayerDefeatedLinkTrainerTrainer1;\n                    break;\n                case B_OUTCOME_LOST:\n                    stringPtr = sText_PlayerLostAgainstTrainer1;\n                    break;\n                case B_OUTCOME_DREW:\n                    stringPtr = sText_PlayerBattledToDrawTrainer1;\n                    break;\n                }\n            }\n            else\n            {\n                switch (gBattleTextBuff1[0])\n                {\n                case B_OUTCOME_WON:\n                    stringPtr = sText_PlayerDefeatedLinkTrainer;\n                    break;\n                case B_OUTCOME_LOST:\n                    stringPtr = sText_PlayerLostAgainstLinkTrainer;\n                    break;\n                case B_OUTCOME_DREW:\n                    stringPtr = sText_PlayerBattledToDrawLinkTrainer;\n                    break;\n                }\n            }\n        }\n        break;\n    default: // load a string from the table\n        if (stringId >= BATTLESTRINGS_COUNT)\n        {\n            gDisplayedStringBattle[0] = EOS;\n            return;\n        }\n        else\n        {\n            stringPtr = gBattleStringsTable[stringId - BATTLESTRINGS_TABLE_START];\n        }\n        break;\n    }\n\n    BattleStringExpandPlaceholdersToDisplayedString(stringPtr);\n}\n\nu32 BattleStringExpandPlaceholdersToDisplayedString(const u8 *src)\n{\n    BattleStringExpandPlaceholders(src, gDisplayedStringBattle);\n}\n\nstatic const u8 *TryGetStatusString(u8 *src)\n{\n    u32 i;\n    u8 status[] = _(\"$$$$$$$\");\n    u32 chars1, chars2;\n    u8 *statusPtr;\n\n    statusPtr = status;\n    for (i = 0; i < 8; i++)\n    {\n        if (*src == EOS)\n            break;\n        *statusPtr = *src;\n        src++;\n        statusPtr++;\n    }\n\n    chars1 = *(u32 *)(&status[0]);\n    chars2 = *(u32 *)(&status[4]);\n\n    for (i = 0; i < NELEMS(gStatusConditionStringsTable); i++)\n    {\n        if (chars1 == *(u32 *)(&gStatusConditionStringsTable[i][0][0])\n            && chars2 == *(u32 *)(&gStatusConditionStringsTable[i][0][4]))\n            return gStatusConditionStringsTable[i][1];\n    }\n    return NULL;\n}\n\n#define HANDLE_NICKNAME_STRING_CASE(battlerId, monIndex)                \\\n    if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)                     \\\n    {                                                                   \\\n        if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)                     \\\n            toCpy = sText_FoePkmnPrefix;                                \\\n        else                                                            \\\n            toCpy = sText_WildPkmnPrefix;                               \\\n        while (*toCpy != EOS)                                           \\\n        {                                                               \\\n            dst[dstId] = *toCpy;                                        \\\n            dstId++;                                                    \\\n            toCpy++;                                                    \\\n        }                                                               \\\n        GetMonData(&gEnemyParty[monIndex], MON_DATA_NICKNAME, text);    \\\n    }                                                                   \\\n    else                                                                \\\n    {                                                                   \\\n        GetMonData(&gPlayerParty[monIndex], MON_DATA_NICKNAME, text);   \\\n    }                                                                   \\\n    StringGet_Nickname(text);                                           \\\n    toCpy = text;\n\nu32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)\n{\n    u32 dstId = 0; // if they used dstId, why not use srcId as well?\n    const u8 *toCpy = NULL;\n    u8 text[30];\n    u8 multiplayerId;\n    s32 i;\n    struct Trainer* sTrainers;\n    u8 title = 0;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    multiplayerId = GetMultiplayerId();\n\n    while (*src != EOS)\n    {\n        if (*src == PLACEHOLDER_BEGIN)\n        {\n            src++;\n            switch (*src)\n            {\n            case B_TXT_BUFF1:\n                if (gBattleTextBuff1[0] == B_BUFF_PLACEHOLDER_BEGIN)\n                {\n                    ExpandBattleTextBuffPlaceholders(gBattleTextBuff1, gStringVar1);\n                    toCpy = gStringVar1;\n                }\n                else\n                {\n                    toCpy = TryGetStatusString(gBattleTextBuff1);\n                    if (toCpy == NULL)\n                        toCpy = gBattleTextBuff1;\n                }\n                break;\n            case B_TXT_BUFF2:\n                if (gBattleTextBuff2[0] == B_BUFF_PLACEHOLDER_BEGIN)\n                {\n                    ExpandBattleTextBuffPlaceholders(gBattleTextBuff2, gStringVar2);\n                    toCpy = gStringVar2;\n                }\n                else\n                    toCpy = gBattleTextBuff2;\n                break;\n            case B_TXT_BUFF3:\n                if (gBattleTextBuff3[0] == B_BUFF_PLACEHOLDER_BEGIN)\n                {\n                    ExpandBattleTextBuffPlaceholders(gBattleTextBuff3, gStringVar3);\n                    toCpy = gStringVar3;\n                }\n                else\n                    toCpy = gBattleTextBuff3;\n                break;\n            case B_TXT_COPY_VAR_1:\n                toCpy = gStringVar1;\n                break;\n            case B_TXT_COPY_VAR_2:\n                toCpy = gStringVar2;\n                break;\n            case B_TXT_COPY_VAR_3:\n                toCpy = gStringVar3;\n                break;\n            case B_TXT_PLAYER_MON1_NAME: // first player poke name\n                GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]],\n                           MON_DATA_NICKNAME, text);\n                StringGet_Nickname(text);\n                toCpy = text;\n                break;\n            case B_TXT_OPPONENT_MON1_NAME: // first enemy poke name\n                GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]],\n                           MON_DATA_NICKNAME, text);\n                StringGet_Nickname(text);\n                toCpy = text;\n                break;\n            case B_TXT_PLAYER_MON2_NAME: // second player poke name\n                GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]],\n                           MON_DATA_NICKNAME, text);\n                StringGet_Nickname(text);\n                toCpy = text;\n                break;\n            case B_TXT_OPPONENT_MON2_NAME: // second enemy poke name\n                GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]],\n                           MON_DATA_NICKNAME, text);\n                StringGet_Nickname(text);\n                toCpy = text;\n                break;\n            case B_TXT_LINK_PLAYER_MON1_NAME: // link first player poke name\n                GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id]],\n                           MON_DATA_NICKNAME, text);\n                StringGet_Nickname(text);\n                toCpy = text;\n                break;\n            case B_TXT_LINK_OPPONENT_MON1_NAME: // link first opponent poke name\n                GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 1]],\n                           MON_DATA_NICKNAME, text);\n                StringGet_Nickname(text);\n                toCpy = text;\n                break;\n            case B_TXT_LINK_PLAYER_MON2_NAME: // link second player poke name\n                GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 2]],\n                           MON_DATA_NICKNAME, text);\n                StringGet_Nickname(text);\n                toCpy = text;\n                break;\n            case B_TXT_LINK_OPPONENT_MON2_NAME: // link second opponent poke name\n                GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 3]],\n                           MON_DATA_NICKNAME, text);\n                StringGet_Nickname(text);\n                toCpy = text;\n                break;\n            case B_TXT_ATK_NAME_WITH_PREFIX_MON1: // attacker name with prefix, only battlerId 0/1\n                HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker,\n                                            gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker))])\n                break;\n            case B_TXT_ATK_PARTNER_NAME: // attacker partner name\n                if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n                    GetMonData(\n                        &gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) +\n                                                           2]], MON_DATA_NICKNAME, text);\n                else\n                    GetMonData(\n                        &gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) +\n                                                          2]], MON_DATA_NICKNAME, text);\n\n                StringGet_Nickname(text);\n                toCpy = text;\n                break;\n            case B_TXT_ATK_NAME_WITH_PREFIX: // attacker name with prefix\n                HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker])\n                break;\n            case B_TXT_DEF_NAME_WITH_PREFIX: // target name with prefix\n                HANDLE_NICKNAME_STRING_CASE(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget])\n                break;\n            case B_TXT_EFF_NAME_WITH_PREFIX: // effect battlerId name with prefix\n                HANDLE_NICKNAME_STRING_CASE(gEffectBattler, gBattlerPartyIndexes[gEffectBattler])\n                break;\n            case B_TXT_ACTIVE_NAME_WITH_PREFIX: // active battlerId name with prefix\n                HANDLE_NICKNAME_STRING_CASE(gActiveBattler, gBattlerPartyIndexes[gActiveBattler])\n                break;\n            case B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX: // scripting active battlerId name with prefix\n                HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, gBattlerPartyIndexes[gBattleScripting.battler])\n                break;\n            case B_TXT_CURRENT_MOVE: // current move name\n                if (sBattleMsgDataPtr->currentMove >= MOVES_COUNT)\n                    toCpy = (const u8 *)&sATypeMove_Table[gBattleStruct->stringMoveType];\n                else\n                    toCpy = gMoveNames[sBattleMsgDataPtr->currentMove];\n                break;\n            case B_TXT_LAST_MOVE: // originally used move name\n                if (sBattleMsgDataPtr->originallyUsedMove >= MOVES_COUNT)\n                    toCpy = (const u8 *)&sATypeMove_Table[gBattleStruct->stringMoveType];\n                else\n                    toCpy = gMoveNames[sBattleMsgDataPtr->originallyUsedMove];\n                break;\n            case B_TXT_LAST_ITEM: // last used item\n                if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n                {\n                    if (gLastUsedItem == ITEM_ENIGMA_BERRY)\n                    {\n                        if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n                        {\n                            if ((gBattleStruct->multiplayerId != 0 && (gPotentialItemEffectBattler & BIT_SIDE))\n                                || (gBattleStruct->multiplayerId == 0 && !(gPotentialItemEffectBattler & BIT_SIDE)))\n                            {\n                                StringCopy(text, gEnigmaBerries[gPotentialItemEffectBattler].name);\n                                StringAppend(text, sText_BerrySuffix);\n                                toCpy = text;\n                            }\n                            else\n                            {\n                                toCpy = sText_EnigmaBerry;\n                            }\n                        }\n                        else\n                        {\n                            if (gLinkPlayers[gBattleStruct->multiplayerId].id == gPotentialItemEffectBattler)\n                            {\n                                StringCopy(text, gEnigmaBerries[gPotentialItemEffectBattler].name);\n                                StringAppend(text, sText_BerrySuffix);\n                                toCpy = text;\n                            }\n                            else\n                                toCpy = sText_EnigmaBerry;\n                        }\n                    }\n                    else\n                    {\n                        CopyItemName(gLastUsedItem, text);\n                        toCpy = text;\n                    }\n                }\n                else\n                {\n                    CopyItemName(gLastUsedItem, text);\n                    toCpy = text;\n                }\n                break;\n            case B_TXT_LAST_ABILITY: // last used ability\n                toCpy = gAbilityNames[gLastUsedAbility];\n                break;\n            case B_TXT_ATK_ABILITY: // attacker ability\n                toCpy = gAbilityNames[sBattlerAbilities[gBattlerAttacker]];\n                break;\n            case B_TXT_DEF_ABILITY: // target ability\n                toCpy = gAbilityNames[sBattlerAbilities[gBattlerTarget]];\n                break;\n            case B_TXT_SCR_ACTIVE_ABILITY: // scripting active ability\n                toCpy = gAbilityNames[sBattlerAbilities[gBattleScripting.battler]];\n                break;\n            case B_TXT_EFF_ABILITY: // effect battlerId ability\n                toCpy = gAbilityNames[sBattlerAbilities[gEffectBattler]];\n                break;\n            case B_TXT_TRAINER1_CLASS: // trainer class name\n                if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)\n                    toCpy = gTrainerClassNames[GetSecretBaseTrainerNameIndex()];\n                else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)\n                    toCpy = gTrainerClassNames[GetUnionRoomTrainerClass()];\n                else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)\n                    toCpy = gTrainerClassNames[GetBattleTowerTrainerClassNameId()];\n                else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)\n                    toCpy = gTrainerClassNames[GetTrainerTowerOpponentClass()];\n                else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)\n                    toCpy = gTrainerClassNames[GetEreaderTrainerClassId()];\n                else\n                    toCpy = gTrainerClassNames[sTrainers[gTrainerBattleOpponent_A].trainerClass];\n                break;\n            case B_TXT_TRAINER1_NAME: // trainer1 name\n                if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)\n                {\n                    for (i = 0; i < (s32)NELEMS(gBattleResources->secretBase->trainerName); i++)\n                        text[i] = gBattleResources->secretBase->trainerName[i];\n                    text[i] = EOS;\n                    toCpy = text;\n                }\n                if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)\n                {\n                    toCpy = gLinkPlayers[multiplayerId ^ BIT_SIDE].name;\n                }\n                else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)\n                {\n                    GetBattleTowerTrainerName(text);\n                    toCpy = text;\n                }\n                else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)\n                {\n                    GetTrainerTowerOpponentName(text);\n                    toCpy = text;\n                }\n                else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)\n                {\n                    CopyEReaderTrainerName5(text);\n                    toCpy = text;\n                }\n                else\n                {\n                    if (sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_RIVAL_EARLY\n                     || sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_RIVAL_LATE\n                     || sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)\n                        toCpy = GetExpandedPlaceholder(PLACEHOLDER_ID_RIVAL);\n                    else\n                        toCpy = sTrainers[gTrainerBattleOpponent_A].trainerName;\n                }\n                break;\n            case B_TXT_LINK_PLAYER_NAME: // link player name\n                title = gLinkPlayers[multiplayerId].neverRead;\n                if(title != 0)\n                {\n                    if(title == 152)\n                    {   //GRAND MASTER\n                        StringCopy(gStringVar1, gText_GrandMaster);\n                    }\n                    else\n                    {   //MON MASTER\n                        StringCopy(gStringVar1, gSpeciesNames[title]);\n                        StringAppend(gStringVar1, gText_Master);\n                    }\n                    StringAppend(gStringVar1, gLinkPlayers[multiplayerId].name);\n                    toCpy = gStringVar1;\n                }\n                else\n                {\n                    toCpy = gLinkPlayers[multiplayerId].name;\n                }\n                break;\n            case B_TXT_LINK_PARTNER_NAME: // link partner name\n                title = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(gLinkPlayers[multiplayerId].id))].neverRead;\n                if(title != 0)\n                {\n                    if(title == 152)\n                    {   //GRAND MASTER\n                        StringCopy(gStringVar1, gText_GrandMaster);\n                    }\n                    else\n                    {   //MON MASTER\n                        StringCopy(gStringVar1, gSpeciesNames[title]);\n                        StringAppend(gStringVar1, gText_Master);\n                    }\n                    StringAppend(gStringVar1, gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(gLinkPlayers[multiplayerId].id))].name);\n                    toCpy = gStringVar1;\n                }\n                else\n                {\n                    toCpy = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(gLinkPlayers[multiplayerId].id))].name;\n                }\n                break;\n            case B_TXT_LINK_OPPONENT1_NAME: // link opponent 1 name\n                title = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].neverRead;\n                if(title != 0)\n                {\n                    if(title == 152)\n                    {   //GRAND MASTER\n                        StringCopy(gStringVar1, gText_GrandMaster);\n                    }\n                    else\n                    {   //MON MASTER\n                        StringCopy(gStringVar1, gSpeciesNames[title]);\n                        StringAppend(gStringVar1, gText_Master);\n                    }\n                    StringAppend(gStringVar1, gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].name);\n                    toCpy = gStringVar1;\n                }\n                else\n                {\n                    toCpy = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id))].name;\n                }\n                break;\n            case B_TXT_LINK_OPPONENT2_NAME: // link opponent 2 name\n                title = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id)))].neverRead;\n                if(title != 0)\n                {\n                    if(title == 152)\n                    {   //GRAND MASTER\n                        StringCopy(gStringVar1, gText_GrandMaster);\n                    }\n                    else\n                    {   //MON MASTER\n                        StringCopy(gStringVar1, gSpeciesNames[title]);\n                        StringAppend(gStringVar1, gText_Master);\n                    }\n                    StringAppend(gStringVar1, gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id)))].name);\n                    toCpy = gStringVar1;\n                }\n                else\n                {\n                    toCpy = gLinkPlayers[GetBattlerMultiplayerId(BATTLE_PARTNER(BATTLE_OPPOSITE(gLinkPlayers[multiplayerId].id)))].name;\n                }\n                break;\n            case B_TXT_LINK_SCR_TRAINER_NAME: // link scripting active name\n                title = gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].neverRead;\n                if(title != 0)\n                {\n                    if(title == 152)\n                    {   //GRAND MASTER\n                        StringCopy(gStringVar1, gText_GrandMaster);\n                    }\n                    else\n                    {   //MON MASTER\n                        StringCopy(gStringVar1, gSpeciesNames[title]);\n                        StringAppend(gStringVar1, gText_Master);\n                    }\n                    StringAppend(gStringVar1, gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].name);\n                    toCpy = gStringVar1;\n                }\n                else\n                {\n                    toCpy = gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].name;\n                }\n                break;\n            case B_TXT_PLAYER_NAME: // player name\n                toCpy = gSaveBlock2Ptr->playerName;\n                break;\n            case B_TXT_TRAINER1_LOSE_TEXT: // trainerA lose text\n                if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)\n                {\n                    GetTrainerTowerOpponentLoseText(gStringVar4, 0);\n                    toCpy = gStringVar4;\n                }\n                else\n                {\n                    toCpy = GetTrainerALoseText();\n                }\n                break;\n            case B_TXT_TRAINER1_WIN_TEXT: // trainerA win text\n                if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)\n                {\n                    GetTrainerTowerOpponentWinText(gStringVar4, 0);\n                    toCpy = gStringVar4;\n                }\n                else\n                {\n                    toCpy = GetTrainerWonSpeech();\n                }\n                break;\n            case B_TXT_TRAINER2_LOSE_TEXT:\n                GetTrainerTowerOpponentLoseText(gStringVar4, 1);\n                toCpy = gStringVar4;\n                break;\n            case B_TXT_TRAINER2_WIN_TEXT:\n                GetTrainerTowerOpponentWinText(gStringVar4, 1);\n                toCpy = gStringVar4;\n                break;\n            case B_TXT_26: // ?\n                HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, *(&gBattleStruct->scriptPartyIdx))\n                break;\n            case B_TXT_PC_CREATOR_NAME: // lanette pc\n                if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC))\n                    toCpy = sText_Bills;\n                else\n                    toCpy = sText_Someones;\n                break;\n            case B_TXT_ATK_PREFIX2:\n                if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n                    toCpy = sText_AllyPkmnPrefix2;\n                else\n                    toCpy = sText_FoePkmnPrefix3;\n                break;\n            case B_TXT_DEF_PREFIX2:\n                if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)\n                    toCpy = sText_AllyPkmnPrefix2;\n                else\n                    toCpy = sText_FoePkmnPrefix3;\n                break;\n            case B_TXT_ATK_PREFIX1:\n                if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n                    toCpy = sText_AllyPkmnPrefix;\n                else\n                    toCpy = sText_FoePkmnPrefix2;\n                break;\n            case B_TXT_DEF_PREFIX1:\n                if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)\n                    toCpy = sText_AllyPkmnPrefix;\n                else\n                    toCpy = sText_FoePkmnPrefix2;\n                break;\n            case B_TXT_ATK_PREFIX3:\n                if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n                    toCpy = sText_AllyPkmnPrefix3;\n                else\n                    toCpy = sText_FoePkmnPrefix4;\n                break;\n            case B_TXT_DEF_PREFIX3:\n                if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)\n                    toCpy = sText_AllyPkmnPrefix3;\n                else\n                    toCpy = sText_FoePkmnPrefix4;\n                break;\n            }\n\n            // missing if (toCpy != NULL) check\n            while (*toCpy != EOS)\n            {\n                dst[dstId++] = *toCpy;\n                toCpy++;\n            }\n            if (*src == B_TXT_TRAINER1_LOSE_TEXT || *src == B_TXT_TRAINER1_WIN_TEXT\n             || *src == B_TXT_TRAINER2_LOSE_TEXT || *src == B_TXT_TRAINER2_WIN_TEXT)\n            {\n                dst[dstId++] = EXT_CTRL_CODE_BEGIN;\n                dst[dstId++] = EXT_CTRL_CODE_PAUSE_UNTIL_PRESS;\n            }\n        }\n        else\n        {\n            dst[dstId++] = *src;\n        }\n        src++;\n    }\n\n    dst[dstId++] = *src;\n\n    return dstId;\n}\n\nstatic void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)\n{\n    u32 srcId = 1;\n    u32 value = 0;\n    u8 text[12];\n    u16 hword;\n\n    *dst = EOS;\n    while (src[srcId] != B_BUFF_EOS)\n    {\n        switch (src[srcId])\n        {\n        case B_BUFF_STRING: // battle string\n            hword = T1_READ_16(&src[srcId + 1]);\n            StringAppend(dst, gBattleStringsTable[hword - BATTLESTRINGS_TABLE_START]);\n            srcId += 3;\n            break;\n        case B_BUFF_NUMBER: // int to string\n            switch (src[srcId + 1])\n            {\n            case 1:\n                value = src[srcId + 3];\n                break;\n            case 2:\n                value = T1_READ_16(&src[srcId + 3]);\n                break;\n            case 4:\n                value = T1_READ_32(&src[srcId + 3]);\n                break;\n            }\n            ConvertIntToDecimalStringN(dst, value, STR_CONV_MODE_LEFT_ALIGN, src[srcId + 2]);\n            srcId += src[srcId + 1] + 3;\n            break;\n        case B_BUFF_MOVE: // move name\n            StringAppend(dst, gMoveNames[T1_READ_16(&src[srcId + 1])]);\n            srcId += 3;\n            break;\n        case B_BUFF_TYPE: // type name\n            StringAppend(dst, gTypeNames[src[srcId + 1]]);\n            srcId += 2;\n            break;\n        case B_BUFF_MON_NICK_WITH_PREFIX: // poke nick with prefix\n            if (GetBattlerSide(src[srcId + 1]) == B_SIDE_PLAYER)\n            {\n                GetMonData(&gPlayerParty[src[srcId + 2]], MON_DATA_NICKNAME, text);\n            }\n            else\n            {\n                if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n                    StringAppend(dst, sText_FoePkmnPrefix);\n                else\n                    StringAppend(dst, sText_WildPkmnPrefix);\n\n                GetMonData(&gEnemyParty[src[srcId + 2]], MON_DATA_NICKNAME, text);\n            }\n            StringGet_Nickname(text);\n            StringAppend(dst, text);\n            srcId += 3;\n            break;\n        case B_BUFF_STAT: // stats\n            StringAppend(dst, gStatNamesTable[src[srcId + 1]]);\n            srcId += 2;\n            break;\n        case B_BUFF_SPECIES: // species name\n            bufferspeciesname(dst, T1_READ_16(&src[srcId + 1]));\n            srcId += 3;\n            break;\n        case B_BUFF_MON_NICK: // poke nick without prefix\n            if (GetBattlerSide(src[srcId + 1]) == B_SIDE_PLAYER)\n                GetMonData(&gPlayerParty[src[srcId + 2]], MON_DATA_NICKNAME, dst);\n            else\n                GetMonData(&gEnemyParty[src[srcId + 2]], MON_DATA_NICKNAME, dst);\n            StringGet_Nickname(dst);\n            srcId += 3;\n            break;\n        case B_BUFF_NEGATIVE_FLAVOR: // flavor table\n            StringAppend(dst, gPokeblockWasTooXStringTable[src[srcId + 1]]);\n            srcId += 2;\n            break;\n        case B_BUFF_ABILITY: // ability names\n            StringAppend(dst, gAbilityNames[src[srcId + 1]]);\n            srcId += 2;\n            break;\n        case B_BUFF_ITEM: // item name\n            hword = T1_READ_16(&src[srcId + 1]);\n            if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n            {\n                if (hword == ITEM_ENIGMA_BERRY)\n                {\n                    if (gLinkPlayers[gBattleStruct->multiplayerId].id == gPotentialItemEffectBattler)\n                    {\n                        StringCopy(dst, gEnigmaBerries[gPotentialItemEffectBattler].name);\n                        StringAppend(dst, sText_BerrySuffix);\n                    }\n                    else\n                    {\n                        StringAppend(dst, sText_EnigmaBerry);\n                    }\n                }\n                else\n                {\n                    CopyItemName(hword, dst);\n                }\n            }\n            else\n            {\n                CopyItemName(hword, dst);\n            }\n            srcId += 3;\n            break;\n        }\n    }\n}\n\nstatic const struct BattleWindowText sTextOnWindowsInfo_Normal[] = {\n    [B_WIN_MSG] = {\n        .fillValue = PIXEL_FILL(0xf),\n        .fontId = FONT_NORMAL,\n        .x = 2,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 2,\n        .speed = 1,\n        .fgColor = 1,\n        .bgColor = 15,\n        .shadowColor = 6,\n    },\n    [B_WIN_ACTION_PROMPT] = {\n        .fillValue = PIXEL_FILL(0xf),\n        .fontId = FONT_NORMAL,\n        .x = 2,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 2,\n        .speed = 0,\n        .fgColor = 1,\n        .bgColor = 15,\n        .shadowColor = 6,\n    },\n    [B_WIN_ACTION_MENU] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_NORMAL_COPY_1,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 2,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_MOVE_NAME_1] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_SMALL,\n        .x = 0,\n        .y = 1,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_MOVE_NAME_2] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_SMALL,\n        .x = 0,\n        .y = 1,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_MOVE_NAME_3] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_SMALL,\n        .x = 0,\n        .y = 1,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_MOVE_NAME_4] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_SMALL,\n        .x = 0,\n        .y = 1,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_PP] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_SMALL,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 12,\n        .bgColor = 14,\n        .shadowColor = 11,\n    },\n    [B_WIN_MOVE_TYPE] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_SMALL,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_PP_REMAINING] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_NORMAL_COPY_1,\n        .x = 10,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 2,\n        .speed = 0,\n        .fgColor = 12,\n        .bgColor = 14,\n        .shadowColor = 11,\n    },\n    [B_WIN_DUMMY] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_NORMAL_COPY_1,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 2,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_SWITCH_PROMPT] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_NORMAL_COPY_1,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 2,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_LEVEL_UP_BOX] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_NORMAL,\n        .x = 0,\n        .y = 0,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_LEVEL_UP_BANNER] = {\n        .fillValue = PIXEL_FILL(0x0),\n        .fontId = FONT_SMALL,\n        .x = 0x20,\n        .y = 0,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 1,\n        .bgColor = 0,\n        .shadowColor = 2,\n    },\n    [B_WIN_YESNO] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_NORMAL,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 1,\n        .lineSpacing = 2,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_VS_PLAYER] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_NORMAL,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_VS_OPPONENT] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_NORMAL,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_VS_MULTI_PLAYER_1] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_NORMAL,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_VS_MULTI_PLAYER_2] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_NORMAL,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_VS_MULTI_PLAYER_3] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_NORMAL,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_VS_MULTI_PLAYER_4] = {\n        .fillValue = PIXEL_FILL(0xe),\n        .fontId = FONT_NORMAL,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 13,\n        .bgColor = 14,\n        .shadowColor = 15,\n    },\n    [B_WIN_VS_OUTCOME_DRAW] = {\n        .fillValue = PIXEL_FILL(0x0),\n        .fontId = FONT_NORMAL,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 1,\n        .bgColor = 0,\n        .shadowColor = 6,\n    },\n    [B_WIN_VS_OUTCOME_LEFT] = {\n        .fillValue = PIXEL_FILL(0x0),\n        .fontId = FONT_NORMAL,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 1,\n        .bgColor = 0,\n        .shadowColor = 6,\n    },\n    [B_WIN_VS_OUTCOME_RIGHT] = {\n        .fillValue = PIXEL_FILL(0x0),\n        .fontId = FONT_NORMAL,\n        .x = 0,\n        .y = 2,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .speed = 0,\n        .fgColor = 1,\n        .bgColor = 0,\n        .shadowColor = 6,\n    },\n    [B_WIN_OAK_OLD_MAN] = {\n        .fillValue = PIXEL_FILL(0x1),\n        .fontId = FONT_MALE,\n        .x = 0,\n        .y = 1,\n        .letterSpacing = 0,\n        .lineSpacing = 1,\n        .speed = 1,\n        .fgColor = 2,\n        .bgColor = 1,\n        .shadowColor = 3,\n    }\n};\n\nstatic const u8 sNpcTextColorToFont[] = \n{\n    [NPC_TEXT_COLOR_MALE]    = FONT_MALE, \n    [NPC_TEXT_COLOR_FEMALE]  = FONT_FEMALE, \n    [NPC_TEXT_COLOR_MON]     = FONT_NORMAL, \n    [NPC_TEXT_COLOR_NEUTRAL] = FONT_NORMAL,\n};\n\n// windowId: Upper 2 bits are text flags\n//   x40: Use NPC context-defined font\n//   x80: Inhibit window clear\nvoid BattlePutTextOnWindow(const u8 *text, u8 windowId) {\n    bool32 copyToVram;\n    struct TextPrinterTemplate printerTemplate;\n    u8 speed;\n    int x;\n    u8 color;\n\n    u8 textFlags = windowId & 0xC0;\n    windowId &= 0x3F;\n    if (!(textFlags & 0x80))\n        FillWindowPixelBuffer(windowId, sTextOnWindowsInfo_Normal[windowId].fillValue);\n    if (textFlags & 0x40) {\n        color = ContextNpcGetTextColor();\n        printerTemplate.fontId = sNpcTextColorToFont[color];\n    }\n    else {\n        printerTemplate.fontId = sTextOnWindowsInfo_Normal[windowId].fontId;\n    }\n    switch (windowId)\n    {\n    case B_WIN_VS_PLAYER:\n    case B_WIN_VS_OPPONENT:\n    case B_WIN_VS_MULTI_PLAYER_1:\n    case B_WIN_VS_MULTI_PLAYER_2:\n    case B_WIN_VS_MULTI_PLAYER_3:\n    case B_WIN_VS_MULTI_PLAYER_4:\n        x = (48 - GetStringWidth(sTextOnWindowsInfo_Normal[windowId].fontId, text,\n                                 sTextOnWindowsInfo_Normal[windowId].letterSpacing)) / 2;\n        break;\n    case B_WIN_VS_OUTCOME_DRAW:\n    case B_WIN_VS_OUTCOME_LEFT:\n    case B_WIN_VS_OUTCOME_RIGHT:\n        x = (64 - GetStringWidth(sTextOnWindowsInfo_Normal[windowId].fontId, text,\n                                 sTextOnWindowsInfo_Normal[windowId].letterSpacing)) / 2;\n        break;\n    default:\n        x = sTextOnWindowsInfo_Normal[windowId].x;\n        break;\n    }\n    if (x < 0)\n        x = 0;\n    printerTemplate.currentChar = text;\n    printerTemplate.windowId = windowId;\n    printerTemplate.x = x;\n    printerTemplate.y = sTextOnWindowsInfo_Normal[windowId].y;\n    printerTemplate.currentX = printerTemplate.x;\n    printerTemplate.currentY = printerTemplate.y;\n    printerTemplate.letterSpacing = sTextOnWindowsInfo_Normal[windowId].letterSpacing;\n    printerTemplate.lineSpacing = sTextOnWindowsInfo_Normal[windowId].lineSpacing;\n    printerTemplate.unk = 0;\n    printerTemplate.fgColor = sTextOnWindowsInfo_Normal[windowId].fgColor;\n    printerTemplate.bgColor = sTextOnWindowsInfo_Normal[windowId].bgColor;\n    printerTemplate.shadowColor = sTextOnWindowsInfo_Normal[windowId].shadowColor;\n    if (windowId == B_WIN_OAK_OLD_MAN)\n        gTextFlags.useAlternateDownArrow = FALSE;\n    else\n        gTextFlags.useAlternateDownArrow = TRUE;\n\n    if ((gBattleTypeFlags & BATTLE_TYPE_LINK) || ((gBattleTypeFlags & BATTLE_TYPE_POKEDUDE) && windowId != B_WIN_OAK_OLD_MAN))\n        gTextFlags.autoScroll = TRUE;\n    else\n        gTextFlags.autoScroll = FALSE;\n\n    if (windowId == B_WIN_MSG || windowId == B_WIN_OAK_OLD_MAN)\n    {\n        if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n            speed = 1;\n        else\n            speed = GetTextSpeedSetting();\n        gTextFlags.canABSpeedUpPrint = TRUE;\n    }\n    else\n    {\n        speed = sTextOnWindowsInfo_Normal[windowId].speed;\n        gTextFlags.canABSpeedUpPrint = FALSE;\n    }\n\n    AddTextPrinter(&printerTemplate, speed, NULL);\n    if (!(textFlags & 0x80))\n    {\n        PutWindowTilemap(windowId);\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n    }\n}\n\nbool8 BattleStringShouldBeColored(u16 stringId)\n{\n    if (stringId == STRINGID_TRAINER1LOSETEXT\n     || stringId == STRINGID_TRAINER2LOSETEXT\n     || stringId == STRINGID_TRAINER1WINTEXT\n     || stringId == STRINGID_TRAINER2WINTEXT)\n        return TRUE;\n    return FALSE;\n}\n\nvoid SetPpNumbersPaletteInMoveSelection(void)\n{\n    struct ChooseMoveStruct *chooseMoveStruct = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]);\n    const u16 *palPtr = gPPTextPalette;\n    u8 var = GetCurrentPpToMaxPpState(chooseMoveStruct->currentPp[gMoveSelectionCursor[gActiveBattler]],\n                                      chooseMoveStruct->maxPp[gMoveSelectionCursor[gActiveBattler]]);\n\n    gPlttBufferUnfaded[BG_PLTT_ID(5) + 12] = palPtr[(var * 2) + 0];\n    gPlttBufferUnfaded[BG_PLTT_ID(5) + 11] = palPtr[(var * 2) + 1];\n\n    CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(5) + 12], &gPlttBufferFaded[BG_PLTT_ID(5) + 12], PLTT_SIZEOF(1));\n    CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(5) + 11], &gPlttBufferFaded[BG_PLTT_ID(5) + 11], PLTT_SIZEOF(1));\n}\n\nu8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp)\n{\n    if (maxPp == currentPp)\n    {\n        return 3;\n    }\n    else if (maxPp <= 2)\n    {\n        if (currentPp > 1)\n            return 3;\n        else\n            return 2 - currentPp;\n    }\n    else if (maxPp <= 7)\n    {\n        if (currentPp > 2)\n            return 3;\n        else\n            return 2 - currentPp;\n    }\n    else\n    {\n        if (currentPp == 0)\n            return 2;\n        if (currentPp <= maxPp / 4)\n            return 1;\n        if (currentPp > maxPp / 2)\n            return 3;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/battle_records.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"event_data.h\"\n#include \"task.h\"\n#include \"text_window.h\"\n#include \"battle.h\"\n#include \"trainer_tower.h\"\n#include \"trainer_pokemon_sprites.h\"\n#include \"scanline_effect.h\"\n#include \"link.h\"\n#include \"menu.h\"\n#include \"overworld.h\"\n#include \"strings.h\"\n#include \"trainer_card.h\"\n#include \"text.h\"\n#include \"new_menu_helpers.h\"\n#include \"constants/battle.h\"\n#include \"constants/songs.h\"\n#include \"constants/maps.h\"\n\nstatic EWRAM_DATA u16 * sBg3TilemapBuffer_p = NULL;\n\nstatic void MainCB2_SetUp(void);\nstatic void VBlankCB(void);\nstatic void MainCB2(void);\nstatic void Task_WaitFadeIn(u8 taskId);\nstatic void Task_WaitButton(u8 taskId);\nstatic void Task_FadeOut(u8 taskId);\nstatic void Task_DestroyAndReturnToField(u8 taskId);\nstatic void ClearWindowCommitAndRemove(u8 windowId);\nstatic void ResetGpu(void);\nstatic void StopAllRunningTasks(void);\nstatic void EnableDisplay(void);\nstatic void ResetBGPos(void);\nstatic void PrintBattleRecords(void);\nstatic void CommitWindow(u8 windowId);\nstatic void LoadFrameGfxOnBg(u8 bgId);\nvoid ShowBattleTowerRecords(void);\nvoid RemoveRecordsWindow(void);\n\nstatic const u16 sTiles[] = INCBIN_U16(\"graphics/battle_records/bg_tiles.4bpp\");\nstatic const u16 sPalette[] = INCBIN_U16(\"graphics/battle_records/bg_tiles.gbapal\");\nstatic const u16 sTilemap[] = INCBIN_U16(\"graphics/battle_records/bg_tiles.bin\");\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 1,\n        .width = 27,\n        .height = 18,\n        .paletteNum = 15,\n        .baseBlock = 0x014\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const u8 sTextColor[3] = {\n    0, 2, 3\n};\n\nstatic const struct BgTemplate sBgTemplates[2] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0, // 4bpp\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 3,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0, // 4bpp\n        .priority = 3,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct WindowTemplate sFrontierResultsWindowTemplate =\n{\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 1,\n    .width = 0x1c,\n    .height = 0x12,\n    .paletteNum = 15,\n    .baseBlock = 1\n};\n\nstatic u8 *const sStringVars[3] = {\n    gStringVar1,\n    gStringVar2,\n    gStringVar3\n};\n\nvoid ShowBattleRecords(void)\n{\n    SetVBlankCallback(NULL);\n    SetMainCallback2(MainCB2_SetUp);\n}\n\nstatic void MainCB2_SetUp(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        ResetGpu();\n        gMain.state++;\n        break;\n    case 1:\n        StopAllRunningTasks();\n        gMain.state++;\n        break;\n    case 2:\n        sBg3TilemapBuffer_p = AllocZeroed(0x800);\n        ResetBgsAndClearDma3BusyFlags(0);\n        InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));\n        SetBgTilemapBuffer(3, sBg3TilemapBuffer_p);\n        ResetBGPos();\n        gMain.state++;\n        break;\n    case 3:\n        LoadFrameGfxOnBg(3);\n        LoadPalette(GetTextWindowPalette(0), BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n        gMain.state++;\n        break;\n    case 4:\n        if (IsDma3ManagerBusyWithBgCopy() != TRUE)\n        {\n            ShowBg(0);\n            ShowBg(3);\n            CopyBgTilemapBufferToVram(3);\n            gMain.state++;\n        }\n        break;\n    case 5:\n        InitWindows(sWindowTemplates);\n        DeactivateAllTextPrinters();\n        gMain.state++;\n        break;\n    case 6:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        gMain.state++;\n        break;\n    case 7:\n        EnableDisplay();\n        SetVBlankCallback(VBlankCB);\n        if (gSpecialVar_0x8004)\n            PrintTrainerTowerRecords();\n        else\n            PrintBattleRecords();\n        CreateTask(Task_WaitFadeIn, 8);\n        SetMainCallback2(MainCB2);\n        gMain.state = 0;\n        break;\n    }\n}\n\nstatic void VBlankCB(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void MainCB2(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void Task_WaitFadeIn(u8 taskId)\n{\n    if (!gPaletteFade.active)\n        gTasks[taskId].func = Task_WaitButton;\n}\n\nstatic void Task_WaitButton(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        task->func = Task_FadeOut;\n    }\n}\n\nstatic void Task_FadeOut(u8 taskId)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n    gTasks[taskId].func = Task_DestroyAndReturnToField;\n}\n\nstatic void Task_DestroyAndReturnToField(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n        Free(sBg3TilemapBuffer_p);\n        ClearWindowCommitAndRemove(0);\n        FreeAllWindowBuffers();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void ClearWindowCommitAndRemove(u8 windowId)\n{\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(0));\n    ClearWindowTilemap(windowId);\n    CopyWindowToVram(windowId, COPYWIN_GFX);\n    RemoveWindow(windowId);\n}\n\nstatic void ResetGpu(void)\n{\n    {\n    void *dest = (void *)VRAM;\n    u32 size = VRAM_SIZE;\n    DmaClearLarge16(3, dest, size, 0x1000);\n    }\n\n    {\n    void *dest = (void *)OAM;\n    u32 size = OAM_SIZE;\n    DmaClear32(3, dest, size);\n    }\n\n    {\n    void *dest = (void *)PLTT;\n    u32 size = PLTT_SIZE;\n    DmaClear16(3, dest, size);\n    }\n\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    SetGpuReg(REG_OFFSET_BG0CNT, 0);\n    SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1CNT, 0);\n    SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG2CNT, 0);\n    SetGpuReg(REG_OFFSET_BG2HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG3CNT, 0);\n    SetGpuReg(REG_OFFSET_BG3HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG3VOFS, 0);\n    SetGpuReg(REG_OFFSET_WIN0H, 0);\n    SetGpuReg(REG_OFFSET_WIN0V, 0);\n    SetGpuReg(REG_OFFSET_WININ, 0);\n    SetGpuReg(REG_OFFSET_WINOUT, 0);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n}\n\nstatic void StopAllRunningTasks(void)\n{\n    ScanlineEffect_Stop();\n    ResetTasks();\n    ResetSpriteData();\n    ResetAllPicSprites();\n    ResetPaletteFade();\n    FreeAllSpritePalettes();\n}\n\nstatic void EnableDisplay(void)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON);\n}\n\nstatic void ResetBGPos(void)\n{\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n}\n\nstatic void ClearLinkBattleRecord(struct LinkBattleRecord *record)\n{\n    CpuFill16(0, record, sizeof(*record));\n    record->name[0] = EOS;\n    record->trainerId = 0;\n    record->wins = 0;\n    record->losses = 0;\n    record->draws = 0;\n}\n\nstatic void ClearLinkBattleRecords(struct LinkBattleRecords *records)\n{\n    s32 i;\n\n    for (i = 0; i < LINK_B_RECORDS_COUNT; i++)\n        ClearLinkBattleRecord(&records->entries[i]);\n    SetGameStat(GAME_STAT_LINK_BATTLE_WINS, 0);\n    SetGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 0);\n    SetGameStat(GAME_STAT_LINK_BATTLE_DRAWS, 0);\n}\n\nstatic s32 GetLinkBattleRecordTotalBattles(struct LinkBattleRecord * record)\n{\n    return record->wins + record->losses + record->draws;\n}\n\nstatic s32 IndexOfOpponentLinkBattleRecord(struct LinkBattleRecords * records, const u8 * name, u16 trainerId)\n{\n    s32 i;\n\n    for (i = 0; i < LINK_B_RECORDS_COUNT; i++)\n    {\n        if (StringCompareN(records->entries[i].name, name, PLAYER_NAME_LENGTH) == 0 && records->entries[i].trainerId == trainerId)\n            return i;\n    }\n\n    return LINK_B_RECORDS_COUNT;\n}\n\nstatic void SortLinkBattleRecords(struct LinkBattleRecords * records)\n{\n    struct LinkBattleRecord tmp;\n    s32 i;\n    s32 j;\n\n    for (i = LINK_B_RECORDS_COUNT - 1; i > 0; i--)\n    {\n        for (j = i - 1; j >= 0; j--)\n        {\n            if (GetLinkBattleRecordTotalBattles(&records->entries[i]) > GetLinkBattleRecordTotalBattles(&records->entries[j]))\n            {\n                tmp = records->entries[i];\n                records->entries[i] = records->entries[j];\n                records->entries[j] = tmp;\n            }\n        }\n    }\n}\n\nstatic void UpdateLinkBattleRecord(struct LinkBattleRecord * record, s32 outcome)\n{\n    switch (outcome)\n    {\n    case B_OUTCOME_WON:\n        record->wins++;\n        if (record->wins > 9999)\n            record->wins = 9999;\n        break;\n    case B_OUTCOME_LOST:\n        record->losses++;\n        if (record->losses > 9999)\n            record->losses = 9999;\n        break;\n    case B_OUTCOME_DREW:\n        record->draws++;\n        if (record->draws > 9999)\n            record->draws = 9999;\n        break;\n    }\n}\n\nstatic void UpdateLinkBattleGameStats(s32 outcome)\n{\n    u8 statId;\n\n    switch (outcome)\n    {\n    case B_OUTCOME_WON:\n        statId = GAME_STAT_LINK_BATTLE_WINS;\n        break;\n    case B_OUTCOME_LOST:\n        statId = GAME_STAT_LINK_BATTLE_LOSSES;\n        break;\n    case B_OUTCOME_DREW:\n        statId = GAME_STAT_LINK_BATTLE_DRAWS;\n        break;\n    default:\n        return;\n    }\n\n    if (GetGameStat(statId) < 9999)\n        IncrementGameStat(statId);\n}\n\nstatic void AddOpponentLinkBattleRecord(struct LinkBattleRecords * records, const u8 * name, u16 trainerId, s32 outcome, u32 language)\n{\n    u8 namebuf[PLAYER_NAME_LENGTH + 1];\n    s32 i;\n    struct LinkBattleRecord * record;\n\n    if (language == LANGUAGE_JAPANESE)\n    {\n        namebuf[0] = EXT_CTRL_CODE_BEGIN;\n        namebuf[1] = EXT_CTRL_CODE_JPN;\n        StringCopy(&namebuf[2], name);\n    }\n    else\n        StringCopy(namebuf, name);\n    UpdateLinkBattleGameStats(outcome);\n    SortLinkBattleRecords(records);\n    i = IndexOfOpponentLinkBattleRecord(records, namebuf, trainerId);\n    if (i == LINK_B_RECORDS_COUNT)\n    {\n        i = LINK_B_RECORDS_COUNT - 1;\n        record = &records->entries[LINK_B_RECORDS_COUNT - 1];\n        ClearLinkBattleRecord(record);\n        StringCopyN(record->name, namebuf, PLAYER_NAME_LENGTH);\n        record->trainerId = trainerId;\n    }\n    UpdateLinkBattleRecord(&records->entries[i], outcome);\n    SortLinkBattleRecords(records);\n}\n\nvoid ClearPlayerLinkBattleRecords(void)\n{\n    ClearLinkBattleRecords(&gSaveBlock2Ptr->linkBattleRecords);\n}\n\nstatic void IncTrainerCardWinCount(s32 battlerId)\n{\n    u16 *wins = &gTrainerCards[battlerId].rse.linkBattleWins;\n    (*wins)++;\n    if (*wins > 9999)\n        *wins = 9999;\n}\n\nstatic void IncTrainerCardLossCount(s32 battlerId)\n{\n    u16 *losses = &gTrainerCards[battlerId].rse.linkBattleLosses;\n    (*losses)++;\n    if (*losses > 9999)\n        *losses = 9999;\n}\n\nstatic void UpdateBattleOutcomeOnTrainerCards(s32 battlerId)\n{\n    switch (gBattleOutcome)\n    {\n    case B_OUTCOME_WON:\n        IncTrainerCardWinCount(battlerId ^ 1);\n        IncTrainerCardLossCount(battlerId);\n        break;\n    case B_OUTCOME_LOST:\n        IncTrainerCardLossCount(battlerId ^ 1);\n        IncTrainerCardWinCount(battlerId);\n        break;\n    }\n}\n\nvoid UpdatePlayerLinkBattleRecords(s32 battlerId)\n{\n    if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(UNION_ROOM) || gSaveBlock1Ptr->location.mapNum != MAP_NUM(UNION_ROOM))\n    {\n        UpdateBattleOutcomeOnTrainerCards(battlerId);\n        AddOpponentLinkBattleRecord(&gSaveBlock2Ptr->linkBattleRecords, gTrainerCards[battlerId].rse.playerName, gTrainerCards[battlerId].rse.trainerId, gBattleOutcome, gLinkPlayers[battlerId].language);\n    }\n}\n\nstatic void PrintTotalRecord(struct LinkBattleRecords * records)\n{\n    u32 nwins = GetGameStat(GAME_STAT_LINK_BATTLE_WINS);\n    u32 nlosses = GetGameStat(GAME_STAT_LINK_BATTLE_LOSSES);\n    u32 ndraws = GetGameStat(GAME_STAT_LINK_BATTLE_DRAWS);\n    s32 i;\n    s32 j;\n    bool32 foundEnd;\n    u8 * strvar;\n\n    if (nwins > 9999)\n        nwins = 9999;\n    if (nlosses > 9999)\n        nlosses = 9999;\n    if (ndraws > 9999)\n        ndraws = 9999;\n\n    ConvertIntToDecimalStringN(gStringVar1, nwins, STR_CONV_MODE_LEFT_ALIGN, 4);\n    ConvertIntToDecimalStringN(gStringVar2, nlosses, STR_CONV_MODE_LEFT_ALIGN, 4);\n    ConvertIntToDecimalStringN(gStringVar3, ndraws, STR_CONV_MODE_LEFT_ALIGN, 4);\n\n    for (i = 0; i < NELEMS(sStringVars); i++)\n    {\n        strvar = sStringVars[i];\n        foundEnd = FALSE;\n        for (j = 0; j < 4; j++)\n        {\n            if (!foundEnd && *strvar == EOS)\n                foundEnd = TRUE;\n            if (foundEnd)\n                *strvar = CHAR_SPACE;\n            strvar++;\n        }\n        *strvar = 0xFF;\n    }\n\n    StringExpandPlaceholders(gStringVar4, gString_BattleRecords_TotalRecord);\n    AddTextPrinterParameterized4(0, FONT_NORMAL, 12, 24, 0, 2, sTextColor, 0, gStringVar4);\n}\n\nstatic void PrintOpponentBattleRecord(struct LinkBattleRecord * record, u8 y)\n{\n    u8 i = 0;\n    s32 x;\n\n    if (record->wins == 0 && record->losses == 0 && record->draws == 0)\n    {\n        AddTextPrinterParameterized4(0, FONT_NORMAL, 0, y, 0, 2, sTextColor, 0, gString_BattleRecords_7Dashes);\n        for (i = 0; i < 3; i++)\n        {\n            if (i == 0)\n                x = 0x54;\n            else if (i == 1)\n                x = 0x84;\n            else\n                x = 0xB4;\n            AddTextPrinterParameterized4(0, FONT_NORMAL, x, y, 0, 2, sTextColor, 0, gString_BattleRecords_4Dashes);\n        }\n    }\n    else\n    {\n        for (i = 0; i < 4; i++)\n        {\n            if (i == 0)\n            {\n                x = 0;\n                StringFillWithTerminator(gStringVar1, PLAYER_NAME_LENGTH + 1);\n                StringCopyN(gStringVar1, record->name, PLAYER_NAME_LENGTH);\n            }\n            else if (i == 1)\n            {\n                x = 0x54;\n                ConvertIntToDecimalStringN(gStringVar1, record->wins, STR_CONV_MODE_RIGHT_ALIGN, 4);\n            }\n            else if (i == 2)\n            {\n                x = 0x84;\n                ConvertIntToDecimalStringN(gStringVar1, record->losses, STR_CONV_MODE_RIGHT_ALIGN, 4);\n            }\n            else\n            {\n                x = 0xB4;\n                ConvertIntToDecimalStringN(gStringVar1, record->draws, STR_CONV_MODE_RIGHT_ALIGN, 4);\n            }\n            AddTextPrinterParameterized4(0, FONT_NORMAL, x, y, 0, 2, sTextColor, 0, gStringVar1);\n        }\n    }\n}\n\nstatic void PrintBattleRecords(void)\n{\n    u32 left;\n    s32 i;\n\n    FillWindowPixelRect(0, PIXEL_FILL(0), 0, 0, 0xD8, 0x90);\n    StringExpandPlaceholders(gStringVar4, gString_BattleRecords_PlayersBattleResults);\n    left = 0xD0 - GetStringWidth(FONT_NORMAL, gStringVar4, -1);\n    AddTextPrinterParameterized4(0, FONT_NORMAL, left / 2, 4, 0, 2, sTextColor, 0, gStringVar4);\n    PrintTotalRecord(&gSaveBlock2Ptr->linkBattleRecords);\n    AddTextPrinterParameterized4(0, FONT_NORMAL, 0x54, 0x30, 0, 2, sTextColor, 0, gString_BattleRecords_ColumnHeaders);\n    for (i = 0; i < LINK_B_RECORDS_COUNT; i++)\n        PrintOpponentBattleRecord(&gSaveBlock2Ptr->linkBattleRecords.entries[i], 0x3D + 14 * i);\n    CommitWindow(0);\n}\n\nstatic void CommitWindow(u8 windowId)\n{\n    PutWindowTilemap(windowId);\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void LoadFrameGfxOnBg(u8 bg)\n{\n    LoadBgTiles(bg, sTiles, 0xC0, 0);\n    CopyToBgTilemapBufferRect(bg, sTilemap, 0, 0, 32, 32);\n    LoadPalette(sPalette, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n}\n\n// Battle Tower Stuff\n\nstatic void PrintHyphens(s32 y, u8 gRecordsWindowId)\n{\n    s32 i;\n    u8 text[37];\n\n    for (i = 0; i < 36; i++)\n        text[i] = CHAR_HYPHEN;\n    text[i] = EOS;\n\n    y = (y * 8) + 1;\n    AddTextPrinterParameterized(gRecordsWindowId, 1, text, 4, y, TEXT_SKIP_DRAW, NULL);\n}\n\n// Battle Tower records.\nstatic bool32 sub_8110494(u8 level)\n{\n    switch (gSaveBlock2Ptr->battleTower.var_4AE[level])\n    {\n    case 0:\n        return FALSE;\n    case 1:\n        return FALSE;\n    case 2:\n        return TRUE;\n    case 4:\n        return FALSE;\n    case 3:\n        return TRUE;\n    case 5:\n        return FALSE;\n    case 6:\n        return TRUE;\n    default:\n        return FALSE;\n    }\n}\n\nstatic void TowerPrintStreak(const u8 *str, u16 num, u8 x1, u8 x2, u8 y, u8 gRecordsWindowId)\n{\n    AddTextPrinterParameterized(gRecordsWindowId, 1, str, x1, y, TEXT_SKIP_DRAW, NULL);\n    if (num > 9999)\n        num = 9999;\n    ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_RIGHT_ALIGN, 4);\n    StringExpandPlaceholders(gStringVar4, gOtherText_WinStreak);\n    AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, x2, y, TEXT_SKIP_DRAW, NULL);\n}\n\nstatic void TowerPrintRecordStreak(u8 battleMode, u8 lvlMode, u8 x1, u8 x2, u8 y, u8 gRecordsWindowId)\n{\n    u16 num = gSaveBlock2Ptr->battleTower.recordWinStreaks[lvlMode];\n    TowerPrintStreak(gOtherText_Record, num, x1, x2, y, gRecordsWindowId);\n}\n\nstatic u16 TowerGetWinStreak(u8 battleMode, u8 lvlMode)\n{\n    u16 winStreak = gSaveBlock2Ptr->battleTower.currentWinStreaks[lvlMode];\n    if (winStreak > 9999)\n        return 9999;\n    else\n        return winStreak;\n}\n\nstatic void TowerPrintPrevOrCurrentStreak(u8 battleMode, u8 lvlMode, u8 x1, u8 x2, u8 y, u8 gRecordsWindowId)\n{\n    bool8 isCurrent;\n    u16 winStreak = TowerGetWinStreak(battleMode, lvlMode);\n    if (lvlMode != 0)\n        isCurrent = sub_8110494(lvlMode);\n    else\n        isCurrent = sub_8110494(lvlMode);\n    if (isCurrent == TRUE)\n        TowerPrintStreak(gOtherText_Current, winStreak, x1, x2, y, gRecordsWindowId);\n    else\n        TowerPrintStreak(gOtherText_Prev, winStreak, x1, x2, y, gRecordsWindowId);\n}\n\nstatic void PrintAligned(const u8 *str, s32 y, u8 gRecordsWindowId)\n{\n    s32 x = GetStringCenterAlignXOffset(1, str, 224);\n    y = (y * 8) + 1;\n    AddTextPrinterParameterized(gRecordsWindowId, 1, str, x, y, TEXT_SKIP_DRAW, NULL);\n}\n\nvoid ShowBattleTowerRecords(void)\n{\n    u8 battleMode = 0;\n    u8 gRecordsWindowId;\n    gRecordsWindowId = AddWindow(&sFrontierResultsWindowTemplate);\n    DrawStdWindowFrame(gRecordsWindowId, FALSE);\n    FillWindowPixelBuffer(gRecordsWindowId, PIXEL_FILL(1));\n    StringExpandPlaceholders(gStringVar4, gOtherText_BattleTowerResults);\n\n    PrintAligned(gStringVar4, 2, gRecordsWindowId);\n    AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Lv50, 8, 49, TEXT_SKIP_DRAW, NULL);\n    AddTextPrinterParameterized(gRecordsWindowId, 1, gText_OpenLv, 8, 97, TEXT_SKIP_DRAW, NULL);\n    PrintHyphens(10, gRecordsWindowId);\n    TowerPrintPrevOrCurrentStreak(battleMode, 0, 72, 121, 49, gRecordsWindowId);\n    TowerPrintRecordStreak(battleMode, 0, 72, 121, 65, gRecordsWindowId);\n    TowerPrintPrevOrCurrentStreak(battleMode, 1, 72, 121, 97, gRecordsWindowId);\n    TowerPrintRecordStreak(battleMode, 1, 72, 121, 113, gRecordsWindowId);\n    PutWindowTilemap(gRecordsWindowId);\n    CopyWindowToVram(gRecordsWindowId, 3);\n    gSpecialVar_Result = gRecordsWindowId;\n}\n\nvoid RemoveRecordsWindow(void)\n{\n    ClearStdWindowAndFrame(gSpecialVar_Result, FALSE);\n    RemoveWindow(gSpecialVar_Result);\n}"
  },
  {
    "path": "src/battle_script_commands.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"item.h\"\n#include \"util.h\"\n#include \"random.h\"\n#include \"pokedex.h\"\n#include \"money.h\"\n#include \"pokemon_icon.h\"\n#include \"mail.h\"\n#include \"event_data.h\"\n#include \"strings.h\"\n#include \"pokemon_special_anim.h\"\n#include \"pokemon_storage_system.h\"\n#include \"pokemon_summary_screen.h\"\n#include \"task.h\"\n#include \"naming_screen.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"trainer_pokemon_sprites.h\"\n#include \"field_specials.h\"\n#include \"battle.h\"\n#include \"battle_message.h\"\n#include \"battle_anim.h\"\n#include \"battle_ai_script_commands.h\"\n#include \"battle_scripts.h\"\n#include \"reshow_battle_screen.h\"\n#include \"battle_controllers.h\"\n#include \"battle_interface.h\"\n#include \"battle_setup.h\"\n#include \"constants/battle_anim.h\"\n#include \"constants/battle_move_effects.h\"\n#include \"constants/battle_script_commands.h\"\n#include \"constants/items.h\"\n#include \"constants/hold_effects.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/songs.h\"\n#include \"constants/moves.h\"\n#include \"constants/abilities.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/maps.h\"\n\nextern const u8 *const gBattleScriptsForMoveEffects[];\n\n#define DEFENDER_IS_PROTECTED ((gProtectStructs[gBattlerTarget].protected) && (gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED))\n\n#define LEVEL_UP_BANNER_START 416\n#define LEVEL_UP_BANNER_END   512\n\n#define TAG_LVLUP_BANNER_MON_ICON 55130\n\nstatic bool8 IsTwoTurnsMove(u16 move);\nstatic void TrySetDestinyBondToHappen(void);\nstatic u8 AttacksThisTurn(u8 battlerId, u16 move); // Note: returns 1 if it's a charging turn, otherwise 2.\nstatic void CheckWonderGuardAndLevitate(void);\nstatic u8 ChangeStatBuffs(s8 statValue, u8 statId, u8, const u8 *BS_ptr);\nstatic void InitLevelUpBanner(void);\nstatic bool8 SlideInLevelUpBanner(void);\nstatic bool8 SlideOutLevelUpBanner(void);\nstatic void DrawLevelUpWindow1(void);\nstatic void DrawLevelUpWindow2(void);\nstatic void PutMonIconOnLvlUpBanner(void);\nstatic void DrawLevelUpBannerText(void);\nstatic void SpriteCB_MonIconOnLvlUpBanner(struct Sprite* sprite);\n\nstatic void Cmd_attackcanceler(void);\nstatic void Cmd_accuracycheck(void);\nstatic void Cmd_attackstring(void);\nstatic void Cmd_ppreduce(void);\nstatic void Cmd_critcalc(void);\nstatic void Cmd_damagecalc(void);\nstatic void Cmd_typecalc(void);\nstatic void Cmd_adjustnormaldamage(void);\nstatic void Cmd_adjustnormaldamage2(void);\nstatic void Cmd_attackanimation(void);\nstatic void Cmd_waitanimation(void);\nstatic void Cmd_healthbarupdate(void);\nstatic void Cmd_datahpupdate(void);\nstatic void Cmd_critmessage(void);\nstatic void Cmd_effectivenesssound(void);\nstatic void Cmd_resultmessage(void);\nstatic void Cmd_printstring(void);\nstatic void Cmd_printselectionstring(void);\nstatic void Cmd_waitmessage(void);\nstatic void Cmd_printfromtable(void);\nstatic void Cmd_printselectionstringfromtable(void);\nstatic void Cmd_seteffectwithchance(void);\nstatic void Cmd_seteffectprimary(void);\nstatic void Cmd_seteffectsecondary(void);\nstatic void Cmd_clearstatusfromeffect(void);\nstatic void Cmd_tryfaintmon(void);\nstatic void Cmd_dofaintanimation(void);\nstatic void Cmd_cleareffectsonfaint(void);\nstatic void Cmd_jumpifstatus(void);\nstatic void Cmd_jumpifstatus2(void);\nstatic void Cmd_jumpifability(void);\nstatic void Cmd_jumpifsideaffecting(void);\nstatic void Cmd_jumpifstat(void);\nstatic void Cmd_jumpifstatus3condition(void);\nstatic void Cmd_jumpiftype(void);\nstatic void Cmd_getexp(void);\nstatic void Cmd_checkteamslost(void);\nstatic void Cmd_movevaluescleanup(void);\nstatic void Cmd_setmultihit(void);\nstatic void Cmd_decrementmultihit(void);\nstatic void Cmd_goto(void);\nstatic void Cmd_jumpifbyte(void);\nstatic void Cmd_jumpifhalfword(void);\nstatic void Cmd_jumpifword(void);\nstatic void Cmd_jumpifarrayequal(void);\nstatic void Cmd_jumpifarraynotequal(void);\nstatic void Cmd_setbyte(void);\nstatic void Cmd_addbyte(void);\nstatic void Cmd_subbyte(void);\nstatic void Cmd_copyarray(void);\nstatic void Cmd_copyarraywithindex(void);\nstatic void Cmd_orbyte(void);\nstatic void Cmd_orhalfword(void);\nstatic void Cmd_orword(void);\nstatic void Cmd_bicbyte(void);\nstatic void Cmd_bichalfword(void);\nstatic void Cmd_bicword(void);\nstatic void Cmd_pause(void);\nstatic void Cmd_waitstate(void);\nstatic void Cmd_healthbar_update(void);\nstatic void Cmd_return(void);\nstatic void Cmd_end(void);\nstatic void Cmd_end2(void);\nstatic void Cmd_end3(void);\nstatic void Cmd_jumpifaffectedbyprotect(void);\nstatic void Cmd_call(void);\nstatic void Cmd_jumpiftype2(void);\nstatic void Cmd_jumpifabilitypresent(void);\nstatic void Cmd_endselectionscript(void);\nstatic void Cmd_playanimation(void);\nstatic void Cmd_playanimation_var(void);\nstatic void Cmd_setgraphicalstatchangevalues(void);\nstatic void Cmd_playstatchangeanimation(void);\nstatic void Cmd_moveend(void);\nstatic void Cmd_typecalc2(void);\nstatic void Cmd_returnatktoball(void);\nstatic void Cmd_getswitchedmondata(void);\nstatic void Cmd_switchindataupdate(void);\nstatic void Cmd_switchinanim(void);\nstatic void Cmd_jumpifcantswitch(void);\nstatic void Cmd_openpartyscreen(void);\nstatic void Cmd_switchhandleorder(void);\nstatic void Cmd_switchineffects(void);\nstatic void Cmd_trainerslidein(void);\nstatic void Cmd_playse(void);\nstatic void Cmd_fanfare(void);\nstatic void Cmd_playfaintcry(void);\nstatic void Cmd_endlinkbattle(void);\nstatic void Cmd_returntoball(void);\nstatic void Cmd_handlelearnnewmove(void);\nstatic void Cmd_yesnoboxlearnmove(void);\nstatic void Cmd_yesnoboxstoplearningmove(void);\nstatic void Cmd_hitanimation(void);\nstatic void Cmd_getmoneyreward(void);\nstatic void Cmd_updatebattlermoves(void);\nstatic void Cmd_swapattackerwithtarget(void);\nstatic void Cmd_incrementgamestat(void);\nstatic void Cmd_drawpartystatussummary(void);\nstatic void Cmd_hidepartystatussummary(void);\nstatic void Cmd_jumptocalledmove(void);\nstatic void Cmd_statusanimation(void);\nstatic void Cmd_status2animation(void);\nstatic void Cmd_chosenstatusanimation(void);\nstatic void Cmd_yesnobox(void);\nstatic void Cmd_cancelallactions(void);\nstatic void Cmd_adjustsetdamage(void);\nstatic void Cmd_removeitem(void);\nstatic void Cmd_atknameinbuff1(void);\nstatic void Cmd_drawlvlupbox(void);\nstatic void Cmd_resetsentmonsvalue(void);\nstatic void Cmd_setatktoplayer0(void);\nstatic void Cmd_makevisible(void);\nstatic void Cmd_recordlastability(void);\nstatic void Cmd_buffermovetolearn(void);\nstatic void Cmd_jumpifplayerran(void);\nstatic void Cmd_hpthresholds(void);\nstatic void Cmd_hpthresholds2(void);\nstatic void Cmd_useitemonopponent(void);\nstatic void Cmd_various(void);\nstatic void Cmd_setprotectlike(void);\nstatic void Cmd_tryexplosion(void);\nstatic void Cmd_setatkhptozero(void);\nstatic void Cmd_jumpifnexttargetvalid(void);\nstatic void Cmd_tryhealhalfhealth(void);\nstatic void Cmd_trymirrormove(void);\nstatic void Cmd_setrain(void);\nstatic void Cmd_setreflect(void);\nstatic void Cmd_setseeded(void);\nstatic void Cmd_manipulatedamage(void);\nstatic void Cmd_trysetrest(void);\nstatic void Cmd_jumpifnotfirstturn(void);\nstatic void Cmd_nop(void);\nstatic void Cmd_jumpifcantmakeasleep(void);\nstatic void Cmd_stockpile(void);\nstatic void Cmd_stockpiletobasedamage(void);\nstatic void Cmd_stockpiletohpheal(void);\nstatic void Cmd_negativedamage(void);\nstatic void Cmd_statbuffchange(void);\nstatic void Cmd_normalisebuffs(void);\nstatic void Cmd_setbide(void);\nstatic void Cmd_confuseifrepeatingattackends(void);\nstatic void Cmd_setmultihitcounter(void);\nstatic void Cmd_initmultihitstring(void);\nstatic void Cmd_forcerandomswitch(void);\nstatic void Cmd_tryconversiontypechange(void);\nstatic void Cmd_givepaydaymoney(void);\nstatic void Cmd_setlightscreen(void);\nstatic void Cmd_tryKO(void);\nstatic void Cmd_damagetohalftargethp(void);\nstatic void Cmd_setsandstorm(void);\nstatic void Cmd_weatherdamage(void);\nstatic void Cmd_tryinfatuating(void);\nstatic void Cmd_updatestatusicon(void);\nstatic void Cmd_setmist(void);\nstatic void Cmd_setfocusenergy(void);\nstatic void Cmd_transformdataexecution(void);\nstatic void Cmd_setsubstitute(void);\nstatic void Cmd_mimicattackcopy(void);\nstatic void Cmd_metronome(void);\nstatic void Cmd_dmgtolevel(void);\nstatic void Cmd_psywavedamageeffect(void);\nstatic void Cmd_counterdamagecalculator(void);\nstatic void Cmd_mirrorcoatdamagecalculator(void);\nstatic void Cmd_disablelastusedattack(void);\nstatic void Cmd_trysetencore(void);\nstatic void Cmd_painsplitdmgcalc(void);\nstatic void Cmd_settypetorandomresistance(void);\nstatic void Cmd_setalwayshitflag(void);\nstatic void Cmd_copymovepermanently(void);\nstatic void Cmd_trychoosesleeptalkmove(void);\nstatic void Cmd_setdestinybond(void);\nstatic void Cmd_trysetdestinybondtohappen(void);\nstatic void Cmd_remaininghptopower(void);\nstatic void Cmd_tryspiteppreduce(void);\nstatic void Cmd_healpartystatus(void);\nstatic void Cmd_cursetarget(void);\nstatic void Cmd_trysetspikes(void);\nstatic void Cmd_setforesight(void);\nstatic void Cmd_trysetperishsong(void);\nstatic void Cmd_rolloutdamagecalculation(void);\nstatic void Cmd_jumpifconfusedandstatmaxed(void);\nstatic void Cmd_furycuttercalc(void);\nstatic void Cmd_friendshiptodamagecalculation(void);\nstatic void Cmd_presentdamagecalculation(void);\nstatic void Cmd_setsafeguard(void);\nstatic void Cmd_magnitudedamagecalculation(void);\nstatic void Cmd_jumpifnopursuitswitchdmg(void);\nstatic void Cmd_setsunny(void);\nstatic void Cmd_maxattackhalvehp(void);\nstatic void Cmd_copyfoestats(void);\nstatic void Cmd_rapidspinfree(void);\nstatic void Cmd_setdefensecurlbit(void);\nstatic void Cmd_recoverbasedonsunlight(void);\nstatic void Cmd_hiddenpowercalc(void);\nstatic void Cmd_selectfirstvalidtarget(void);\nstatic void Cmd_trysetfutureattack(void);\nstatic void Cmd_trydobeatup(void);\nstatic void Cmd_setsemiinvulnerablebit(void);\nstatic void Cmd_clearsemiinvulnerablebit(void);\nstatic void Cmd_setminimize(void);\nstatic void Cmd_sethail(void);\nstatic void Cmd_trymemento(void);\nstatic void Cmd_setforcedtarget(void);\nstatic void Cmd_setcharge(void);\nstatic void Cmd_callterrainattack(void);\nstatic void Cmd_cureifburnedparalysedorpoisoned(void);\nstatic void Cmd_settorment(void);\nstatic void Cmd_jumpifnodamage(void);\nstatic void Cmd_settaunt(void);\nstatic void Cmd_trysethelpinghand(void);\nstatic void Cmd_tryswapitems(void);\nstatic void Cmd_trycopyability(void);\nstatic void Cmd_trywish(void);\nstatic void Cmd_trysetroots(void);\nstatic void Cmd_doubledamagedealtifdamaged(void);\nstatic void Cmd_setyawn(void);\nstatic void Cmd_setdamagetohealthdifference(void);\nstatic void Cmd_scaledamagebyhealthratio(void);\nstatic void Cmd_tryswapabilities(void);\nstatic void Cmd_tryimprison(void);\nstatic void Cmd_trysetgrudge(void);\nstatic void Cmd_weightdamagecalculation(void);\nstatic void Cmd_assistattackselect(void);\nstatic void Cmd_trysetmagiccoat(void);\nstatic void Cmd_trysetsnatch(void);\nstatic void Cmd_trygetintimidatetarget(void);\nstatic void Cmd_switchoutabilities(void);\nstatic void Cmd_jumpifhasnohp(void);\nstatic void Cmd_getsecretpowereffect(void);\nstatic void Cmd_pickup(void);\nstatic void Cmd_docastformchangeanimation(void);\nstatic void Cmd_trycastformdatachange(void);\nstatic void Cmd_settypebasedhalvers(void);\nstatic void Cmd_setweatherballtype(void);\nstatic void Cmd_tryrecycleitem(void);\nstatic void Cmd_settypetoterrain(void);\nstatic void Cmd_pursuitdoubles(void);\nstatic void Cmd_snatchsetbattlers(void);\nstatic void Cmd_removelightscreenreflect(void);\nstatic void Cmd_handleballthrow(void);\nstatic void Cmd_givecaughtmon(void);\nstatic void Cmd_trysetcaughtmondexflags(void);\nstatic void Cmd_displaydexinfo(void);\nstatic void Cmd_trygivecaughtmonnick(void);\nstatic void Cmd_subattackerhpbydmg(void);\nstatic void Cmd_removeattackerstatus1(void);\nstatic void Cmd_finishaction(void);\nstatic void Cmd_finishturn(void);\n\nvoid (* const gBattleScriptingCommandsTable[])(void) =\n{\n    Cmd_attackcanceler,                          //0x0\n    Cmd_accuracycheck,                           //0x1\n    Cmd_attackstring,                            //0x2\n    Cmd_ppreduce,                                //0x3\n    Cmd_critcalc,                                //0x4\n    Cmd_damagecalc,                              //0x5\n    Cmd_typecalc,                                //0x6\n    Cmd_adjustnormaldamage,                      //0x7\n    Cmd_adjustnormaldamage2,                     //0x8\n    Cmd_attackanimation,                         //0x9\n    Cmd_waitanimation,                           //0xA\n    Cmd_healthbarupdate,                         //0xB\n    Cmd_datahpupdate,                            //0xC\n    Cmd_critmessage,                             //0xD\n    Cmd_effectivenesssound,                      //0xE\n    Cmd_resultmessage,                           //0xF\n    Cmd_printstring,                             //0x10\n    Cmd_printselectionstring,                    //0x11\n    Cmd_waitmessage,                             //0x12\n    Cmd_printfromtable,                          //0x13\n    Cmd_printselectionstringfromtable,           //0x14\n    Cmd_seteffectwithchance,                     //0x15\n    Cmd_seteffectprimary,                        //0x16\n    Cmd_seteffectsecondary,                      //0x17\n    Cmd_clearstatusfromeffect,                   //0x18\n    Cmd_tryfaintmon,                             //0x19\n    Cmd_dofaintanimation,                        //0x1A\n    Cmd_cleareffectsonfaint,                     //0x1B\n    Cmd_jumpifstatus,                            //0x1C\n    Cmd_jumpifstatus2,                           //0x1D\n    Cmd_jumpifability,                           //0x1E\n    Cmd_jumpifsideaffecting,                     //0x1F\n    Cmd_jumpifstat,                              //0x20\n    Cmd_jumpifstatus3condition,                  //0x21\n    Cmd_jumpiftype,                              //0x22\n    Cmd_getexp,                                  //0x23\n    Cmd_checkteamslost,                          //0x24\n    Cmd_movevaluescleanup,                       //0x25\n    Cmd_setmultihit,                             //0x26\n    Cmd_decrementmultihit,                       //0x27\n    Cmd_goto,                                    //0x28\n    Cmd_jumpifbyte,                              //0x29\n    Cmd_jumpifhalfword,                          //0x2A\n    Cmd_jumpifword,                              //0x2B\n    Cmd_jumpifarrayequal,                        //0x2C\n    Cmd_jumpifarraynotequal,                     //0x2D\n    Cmd_setbyte,                                 //0x2E\n    Cmd_addbyte,                                 //0x2F\n    Cmd_subbyte,                                 //0x30\n    Cmd_copyarray,                               //0x31\n    Cmd_copyarraywithindex,                      //0x32\n    Cmd_orbyte,                                  //0x33\n    Cmd_orhalfword,                              //0x34\n    Cmd_orword,                                  //0x35\n    Cmd_bicbyte,                                 //0x36\n    Cmd_bichalfword,                             //0x37\n    Cmd_bicword,                                 //0x38\n    Cmd_pause,                                   //0x39\n    Cmd_waitstate,                               //0x3A\n    Cmd_healthbar_update,                        //0x3B\n    Cmd_return,                                  //0x3C\n    Cmd_end,                                     //0x3D\n    Cmd_end2,                                    //0x3E\n    Cmd_end3,                                    //0x3F\n    Cmd_jumpifaffectedbyprotect,                 //0x40\n    Cmd_call,                                    //0x41\n    Cmd_jumpiftype2,                             //0x42\n    Cmd_jumpifabilitypresent,                    //0x43\n    Cmd_endselectionscript,                      //0x44\n    Cmd_playanimation,                           //0x45\n    Cmd_playanimation_var,                       //0x46\n    Cmd_setgraphicalstatchangevalues,            //0x47\n    Cmd_playstatchangeanimation,                 //0x48\n    Cmd_moveend,                                 //0x49\n    Cmd_typecalc2,                               //0x4A\n    Cmd_returnatktoball,                         //0x4B\n    Cmd_getswitchedmondata,                      //0x4C\n    Cmd_switchindataupdate,                      //0x4D\n    Cmd_switchinanim,                            //0x4E\n    Cmd_jumpifcantswitch,                        //0x4F\n    Cmd_openpartyscreen,                         //0x50\n    Cmd_switchhandleorder,                       //0x51\n    Cmd_switchineffects,                         //0x52\n    Cmd_trainerslidein,                          //0x53\n    Cmd_playse,                                  //0x54\n    Cmd_fanfare,                                 //0x55\n    Cmd_playfaintcry,                            //0x56\n    Cmd_endlinkbattle,                           //0x57\n    Cmd_returntoball,                            //0x58\n    Cmd_handlelearnnewmove,                      //0x59\n    Cmd_yesnoboxlearnmove,                       //0x5A\n    Cmd_yesnoboxstoplearningmove,                //0x5B\n    Cmd_hitanimation,                            //0x5C\n    Cmd_getmoneyreward,                          //0x5D\n    Cmd_updatebattlermoves,                      //0x5E\n    Cmd_swapattackerwithtarget,                  //0x5F\n    Cmd_incrementgamestat,                       //0x60\n    Cmd_drawpartystatussummary,                  //0x61\n    Cmd_hidepartystatussummary,                  //0x62\n    Cmd_jumptocalledmove,                        //0x63\n    Cmd_statusanimation,                         //0x64\n    Cmd_status2animation,                        //0x65\n    Cmd_chosenstatusanimation,                   //0x66\n    Cmd_yesnobox,                                //0x67\n    Cmd_cancelallactions,                        //0x68\n    Cmd_adjustsetdamage,                         //0x69\n    Cmd_removeitem,                              //0x6A\n    Cmd_atknameinbuff1,                          //0x6B\n    Cmd_drawlvlupbox,                            //0x6C\n    Cmd_resetsentmonsvalue,                      //0x6D\n    Cmd_setatktoplayer0,                         //0x6E\n    Cmd_makevisible,                             //0x6F\n    Cmd_recordlastability,                       //0x70\n    Cmd_buffermovetolearn,                       //0x71\n    Cmd_jumpifplayerran,                         //0x72\n    Cmd_hpthresholds,                            //0x73\n    Cmd_hpthresholds2,                           //0x74\n    Cmd_useitemonopponent,                       //0x75\n    Cmd_various,                                 //0x76\n    Cmd_setprotectlike,                          //0x77\n    Cmd_tryexplosion,                            //0x78\n    Cmd_setatkhptozero,                          //0x79\n    Cmd_jumpifnexttargetvalid,                   //0x7A\n    Cmd_tryhealhalfhealth,                       //0x7B\n    Cmd_trymirrormove,                           //0x7C\n    Cmd_setrain,                                 //0x7D\n    Cmd_setreflect,                              //0x7E\n    Cmd_setseeded,                               //0x7F\n    Cmd_manipulatedamage,                        //0x80\n    Cmd_trysetrest,                              //0x81\n    Cmd_jumpifnotfirstturn,                      //0x82\n    Cmd_nop,                                     //0x83\n    Cmd_jumpifcantmakeasleep,                    //0x84\n    Cmd_stockpile,                               //0x85\n    Cmd_stockpiletobasedamage,                   //0x86\n    Cmd_stockpiletohpheal,                       //0x87\n    Cmd_negativedamage,                          //0x88\n    Cmd_statbuffchange,                          //0x89\n    Cmd_normalisebuffs,                          //0x8A\n    Cmd_setbide,                                 //0x8B\n    Cmd_confuseifrepeatingattackends,            //0x8C\n    Cmd_setmultihitcounter,                      //0x8D\n    Cmd_initmultihitstring,                      //0x8E\n    Cmd_forcerandomswitch,                       //0x8F\n    Cmd_tryconversiontypechange,                 //0x90\n    Cmd_givepaydaymoney,                         //0x91\n    Cmd_setlightscreen,                          //0x92\n    Cmd_tryKO,                                   //0x93\n    Cmd_damagetohalftargethp,                    //0x94\n    Cmd_setsandstorm,                            //0x95\n    Cmd_weatherdamage,                           //0x96\n    Cmd_tryinfatuating,                          //0x97\n    Cmd_updatestatusicon,                        //0x98\n    Cmd_setmist,                                 //0x99\n    Cmd_setfocusenergy,                          //0x9A\n    Cmd_transformdataexecution,                  //0x9B\n    Cmd_setsubstitute,                           //0x9C\n    Cmd_mimicattackcopy,                         //0x9D\n    Cmd_metronome,                               //0x9E\n    Cmd_dmgtolevel,                              //0x9F\n    Cmd_psywavedamageeffect,                     //0xA0\n    Cmd_counterdamagecalculator,                 //0xA1\n    Cmd_mirrorcoatdamagecalculator,              //0xA2\n    Cmd_disablelastusedattack,                   //0xA3\n    Cmd_trysetencore,                            //0xA4\n    Cmd_painsplitdmgcalc,                        //0xA5\n    Cmd_settypetorandomresistance,               //0xA6\n    Cmd_setalwayshitflag,                        //0xA7\n    Cmd_copymovepermanently,                     //0xA8\n    Cmd_trychoosesleeptalkmove,                  //0xA9\n    Cmd_setdestinybond,                          //0xAA\n    Cmd_trysetdestinybondtohappen,               //0xAB\n    Cmd_remaininghptopower,                      //0xAC\n    Cmd_tryspiteppreduce,                        //0xAD\n    Cmd_healpartystatus,                         //0xAE\n    Cmd_cursetarget,                             //0xAF\n    Cmd_trysetspikes,                            //0xB0\n    Cmd_setforesight,                            //0xB1\n    Cmd_trysetperishsong,                        //0xB2\n    Cmd_rolloutdamagecalculation,                //0xB3\n    Cmd_jumpifconfusedandstatmaxed,              //0xB4\n    Cmd_furycuttercalc,                          //0xB5\n    Cmd_friendshiptodamagecalculation,           //0xB6\n    Cmd_presentdamagecalculation,                //0xB7\n    Cmd_setsafeguard,                            //0xB8\n    Cmd_magnitudedamagecalculation,              //0xB9\n    Cmd_jumpifnopursuitswitchdmg,                //0xBA\n    Cmd_setsunny,                                //0xBB\n    Cmd_maxattackhalvehp,                        //0xBC\n    Cmd_copyfoestats,                            //0xBD\n    Cmd_rapidspinfree,                           //0xBE\n    Cmd_setdefensecurlbit,                       //0xBF\n    Cmd_recoverbasedonsunlight,                  //0xC0\n    Cmd_hiddenpowercalc,                         //0xC1\n    Cmd_selectfirstvalidtarget,                  //0xC2\n    Cmd_trysetfutureattack,                      //0xC3\n    Cmd_trydobeatup,                             //0xC4\n    Cmd_setsemiinvulnerablebit,                  //0xC5\n    Cmd_clearsemiinvulnerablebit,                //0xC6\n    Cmd_setminimize,                             //0xC7\n    Cmd_sethail,                                 //0xC8\n    Cmd_trymemento,                              //0xC9\n    Cmd_setforcedtarget,                         //0xCA\n    Cmd_setcharge,                               //0xCB\n    Cmd_callterrainattack,                       //0xCC\n    Cmd_cureifburnedparalysedorpoisoned,         //0xCD\n    Cmd_settorment,                              //0xCE\n    Cmd_jumpifnodamage,                          //0xCF\n    Cmd_settaunt,                                //0xD0\n    Cmd_trysethelpinghand,                       //0xD1\n    Cmd_tryswapitems,                            //0xD2\n    Cmd_trycopyability,                          //0xD3\n    Cmd_trywish,                                 //0xD4\n    Cmd_trysetroots,                             //0xD5\n    Cmd_doubledamagedealtifdamaged,              //0xD6\n    Cmd_setyawn,                                 //0xD7\n    Cmd_setdamagetohealthdifference,             //0xD8\n    Cmd_scaledamagebyhealthratio,                //0xD9\n    Cmd_tryswapabilities,                        //0xDA\n    Cmd_tryimprison,                             //0xDB\n    Cmd_trysetgrudge,                            //0xDC\n    Cmd_weightdamagecalculation,                 //0xDD\n    Cmd_assistattackselect,                      //0xDE\n    Cmd_trysetmagiccoat,                         //0xDF\n    Cmd_trysetsnatch,                            //0xE0\n    Cmd_trygetintimidatetarget,                  //0xE1\n    Cmd_switchoutabilities,                      //0xE2\n    Cmd_jumpifhasnohp,                           //0xE3\n    Cmd_getsecretpowereffect,                    //0xE4\n    Cmd_pickup,                                  //0xE5\n    Cmd_docastformchangeanimation,               //0xE6\n    Cmd_trycastformdatachange,                   //0xE7\n    Cmd_settypebasedhalvers,                     //0xE8\n    Cmd_setweatherballtype,                      //0xE9\n    Cmd_tryrecycleitem,                          //0xEA\n    Cmd_settypetoterrain,                        //0xEB\n    Cmd_pursuitdoubles,                          //0xEC\n    Cmd_snatchsetbattlers,                       //0xED\n    Cmd_removelightscreenreflect,                //0xEE\n    Cmd_handleballthrow,                         //0xEF\n    Cmd_givecaughtmon,                           //0xF0\n    Cmd_trysetcaughtmondexflags,                 //0xF1\n    Cmd_displaydexinfo,                          //0xF2\n    Cmd_trygivecaughtmonnick,                    //0xF3\n    Cmd_subattackerhpbydmg,                      //0xF4\n    Cmd_removeattackerstatus1,                   //0xF5\n    Cmd_finishaction,                            //0xF6\n    Cmd_finishturn,                              //0xF7\n};\n\nstruct StatFractions\n{\n    u8 dividend;\n    u8 divisor;\n};\n\nstatic const struct StatFractions sAccuracyStageRatios[] =\n{\n    { 33, 100}, // -6\n    { 36, 100}, // -5\n    { 43, 100}, // -4\n    { 50, 100}, // -3\n    { 60, 100}, // -2\n    { 75, 100}, // -1\n    {  1,   1}, //  0\n    {133, 100}, // +1\n    {166, 100}, // +2\n    {  2,   1}, // +3\n    {233, 100}, // +4\n    {133,  50}, // +5\n    {  3,   1}, // +6\n};\n\n// The chance is 1/N for each stage.\nstatic const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2};\n\nstatic const u32 sStatusFlagsForMoveEffects[NUM_MOVE_EFFECTS] =\n{\n    [MOVE_EFFECT_SLEEP]          = STATUS1_SLEEP,\n    [MOVE_EFFECT_POISON]         = STATUS1_POISON,\n    [MOVE_EFFECT_BURN]           = STATUS1_BURN,\n    [MOVE_EFFECT_FREEZE]         = STATUS1_FREEZE,\n    [MOVE_EFFECT_PARALYSIS]      = STATUS1_PARALYSIS,\n    [MOVE_EFFECT_TOXIC]          = STATUS1_TOXIC_POISON,\n    [MOVE_EFFECT_CONFUSION]      = STATUS2_CONFUSION,\n    [MOVE_EFFECT_FLINCH]         = STATUS2_FLINCHED,\n    [MOVE_EFFECT_UPROAR]         = STATUS2_UPROAR,\n    [MOVE_EFFECT_CHARGING]       = STATUS2_MULTIPLETURNS,\n    [MOVE_EFFECT_WRAP]           = STATUS2_WRAPPED,\n    [MOVE_EFFECT_RECHARGE]       = STATUS2_RECHARGE,\n    [MOVE_EFFECT_PREVENT_ESCAPE] = STATUS2_ESCAPE_PREVENTION,\n    [MOVE_EFFECT_NIGHTMARE]      = STATUS2_NIGHTMARE,\n    [MOVE_EFFECT_THRASH]         = STATUS2_LOCK_CONFUSE,\n};\n\nstatic const u8 *const sMoveEffectBS_Ptrs[] =\n{\n    [0]                            = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_SLEEP]            = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_POISON]           = BattleScript_MoveEffectPoison,\n    [MOVE_EFFECT_BURN]             = BattleScript_MoveEffectBurn,\n    [MOVE_EFFECT_FREEZE]           = BattleScript_MoveEffectFreeze,\n    [MOVE_EFFECT_PARALYSIS]        = BattleScript_MoveEffectParalysis,\n    [MOVE_EFFECT_TOXIC]            = BattleScript_MoveEffectToxic,\n    [MOVE_EFFECT_CONFUSION]        = BattleScript_MoveEffectConfusion,\n    [MOVE_EFFECT_FLINCH]           = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_TRI_ATTACK]       = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_UPROAR]           = BattleScript_MoveEffectUproar,\n    [MOVE_EFFECT_PAYDAY]           = BattleScript_MoveEffectPayDay,\n    [MOVE_EFFECT_CHARGING]         = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_WRAP]             = BattleScript_MoveEffectWrap,\n    [MOVE_EFFECT_RECOIL_25]        = BattleScript_MoveEffectRecoil,\n    [MOVE_EFFECT_ATK_PLUS_1]       = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_DEF_PLUS_1]       = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_SPD_PLUS_1]       = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_SP_ATK_PLUS_1]    = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_SP_DEF_PLUS_1]    = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_ACC_PLUS_1]       = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_EVS_PLUS_1]       = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_ATK_MINUS_1]      = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_DEF_MINUS_1]      = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_SPD_MINUS_1]      = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_SP_ATK_MINUS_1]   = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_SP_DEF_MINUS_1]   = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_ACC_MINUS_1]      = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_EVS_MINUS_1]      = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_RECHARGE]         = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_RAGE]             = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_STEAL_ITEM]       = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_PREVENT_ESCAPE]   = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_NIGHTMARE]        = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_ALL_STATS_UP]     = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_RAPIDSPIN]        = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_REMOVE_PARALYSIS] = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_ATK_DEF_DOWN]     = BattleScript_MoveEffectSleep,\n    [MOVE_EFFECT_RECOIL_33]        = BattleScript_MoveEffectRecoil,\n};\n\nstatic const struct WindowTemplate sUnusedWinTemplate =\n{\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 3,\n    .width = 7,\n    .height = 15,\n    .paletteNum = 31,\n    .baseBlock = 0x3F\n};\n\nstatic const u16 sLevelUpBanner_Pal[] = INCBIN_U16(\"graphics/battle_interface/level_up_banner.gbapal\");\nstatic const u32 sLevelUpBanner_Gfx[] = INCBIN_U32(\"graphics/battle_interface/level_up_banner.4bpp.lz\");\n\n// unused\nstatic const u8 sRubyLevelUpStatBoxStats[] =\n{\n    MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK,\n    MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPEED\n};\n\nstatic const struct OamData sOamData_MonIconOnLvlUpBanner =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = 0,\n    .mosaic = FALSE,\n    .bpp = 0,\n    .shape = SPRITE_SHAPE(32x32),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_MonIconOnLvlUpBanner =\n{\n    .tileTag = TAG_LVLUP_BANNER_MON_ICON,\n    .paletteTag = TAG_LVLUP_BANNER_MON_ICON,\n    .oam = &sOamData_MonIconOnLvlUpBanner,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_MonIconOnLvlUpBanner\n};\n\nstatic const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX / 4, USHRT_MAX / 8};\n\n#define MIMIC_FORBIDDEN_END             0xFFFE\n#define METRONOME_FORBIDDEN_END         0xFFFF\n#define ASSIST_FORBIDDEN_END            0xFFFF\n\nstatic const u16 sMovesForbiddenToCopy[] =\n{\n    MOVE_METRONOME,\n    MOVE_STRUGGLE,\n    MOVE_SKETCH,\n    MOVE_MIMIC,\n    MIMIC_FORBIDDEN_END,\n    MOVE_COUNTER,\n    MOVE_MIRROR_COAT,\n    MOVE_PROTECT,\n    MOVE_DETECT,\n    MOVE_ENDURE,\n    MOVE_DESTINY_BOND,\n    MOVE_SLEEP_TALK,\n    MOVE_THIEF,\n    MOVE_FOLLOW_ME,\n    MOVE_SNATCH,\n    MOVE_HELPING_HAND,\n    MOVE_COVET,\n    MOVE_TRICK,\n    MOVE_FOCUS_PUNCH,\n    METRONOME_FORBIDDEN_END\n};\n\nstatic const u8 sFlailHpScaleToPowerTable[] =\n{\n    1, 200,\n    4, 150,\n    9, 100,\n    16, 80,\n    32, 40,\n    48, 20\n};\n\nconst u16 gNaturePowerMoves[] =\n{\n    [BATTLE_TERRAIN_GRASS]      = MOVE_STUN_SPORE,\n    [BATTLE_TERRAIN_LONG_GRASS] = MOVE_RAZOR_LEAF,\n    [BATTLE_TERRAIN_SAND]       = MOVE_EARTHQUAKE,\n    [BATTLE_TERRAIN_UNDERWATER] = MOVE_HYDRO_PUMP,\n    [BATTLE_TERRAIN_WATER]      = MOVE_SURF,\n    [BATTLE_TERRAIN_POND]       = MOVE_BUBBLE_BEAM,\n    [BATTLE_TERRAIN_MOUNTAIN]   = MOVE_ROCK_SLIDE,\n    [BATTLE_TERRAIN_CAVE]       = MOVE_SHADOW_BALL,\n    [BATTLE_TERRAIN_BUILDING]   = MOVE_SWIFT,\n    [BATTLE_TERRAIN_PLAIN]      = MOVE_SWIFT\n};\n\n// format: min. weight (hectograms), base power\nstatic const u16 sWeightToDamageTable[] =\n{\n    100, 20,\n    250, 40,\n    500, 60,\n    1000, 80,\n    2000, 100,\n    0xFFFF, 0xFFFF\n};\n\nstruct PickupItem\n{\n    u16 itemId;\n    u8 chance;\n};\n\nstatic const struct PickupItem sPickupItems[] =\n{\n    { ITEM_ORAN_BERRY, 15 },\n    { ITEM_CHERI_BERRY, 25 },\n    { ITEM_CHESTO_BERRY, 35 },\n    { ITEM_PECHA_BERRY, 45 },\n    { ITEM_RAWST_BERRY, 55 },\n    { ITEM_ASPEAR_BERRY, 65 },\n    { ITEM_PERSIM_BERRY, 75 },\n    { ITEM_PP_UP, 80 },\n    { ITEM_RARE_CANDY, 85 },\n    { ITEM_NUGGET, 90 },\n    { ITEM_POMEG_BERRY, 95 },\n    { ITEM_KELPSY_BERRY, 96 },\n    { ITEM_QUALOT_BERRY, 97 },\n    { ITEM_HONDEW_BERRY, 98 },\n    { ITEM_GREPA_BERRY, 99 },\n    { ITEM_TAMATO_BERRY, 1 },\n\n};\n\nstatic const u8 sTerrainToType[] =\n{\n    [BATTLE_TERRAIN_GRASS]      = TYPE_GRASS,\n    [BATTLE_TERRAIN_LONG_GRASS] = TYPE_GRASS,\n    [BATTLE_TERRAIN_SAND]       = TYPE_GROUND,\n    [BATTLE_TERRAIN_UNDERWATER] = TYPE_WATER,\n    [BATTLE_TERRAIN_WATER]      = TYPE_WATER,\n    [BATTLE_TERRAIN_POND]       = TYPE_WATER,\n    [BATTLE_TERRAIN_MOUNTAIN]   = TYPE_ROCK,\n    [BATTLE_TERRAIN_CAVE]       = TYPE_ROCK,\n    [BATTLE_TERRAIN_BUILDING]   = TYPE_NORMAL,\n    [BATTLE_TERRAIN_PLAIN]      = TYPE_NORMAL,\n};\n\n// - ITEM_ULTRA_BALL skips Master Ball and ITEM_NONE\nstatic const u8 sBallCatchBonuses[] =\n{\n    [ITEM_ULTRA_BALL - ITEM_ULTRA_BALL]  = 20,\n    [ITEM_GREAT_BALL - ITEM_ULTRA_BALL]  = 15,\n    [ITEM_POKE_BALL - ITEM_ULTRA_BALL]   = 10,\n    [ITEM_SAFARI_BALL - ITEM_ULTRA_BALL] = 15\n};\n\n// unknown unused data\nstatic const u32 sUnused = 0xFF7EAE60;\n\nstatic void Cmd_attackcanceler(void)\n{\n    s32 i;\n\n    if (gBattleOutcome != 0)\n    {\n        gCurrentActionFuncId = B_ACTION_FINISHED;\n        return;\n    }\n    if (gBattleMons[gBattlerAttacker].hp == 0 && !(gHitMarker & HITMARKER_NO_ATTACKSTRING))\n    {\n        gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;\n        gBattlescriptCurrInstr = BattleScript_MoveEnd;\n        return;\n    }\n    if (AtkCanceller_UnableToUseMove())\n        return;\n    if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBattlerTarget, 0, 0, 0))\n        return;\n    if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & (HITMARKER_ALLOW_NO_PP | HITMARKER_NO_ATTACKSTRING))\n     && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))\n    {\n        gBattlescriptCurrInstr = BattleScript_NoPPForMove;\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        return;\n    }\n\n    gHitMarker &= ~HITMARKER_ALLOW_NO_PP;\n\n    if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))\n    {\n        i = IsMonDisobedient(); // why use the 'i' variable...?\n        switch (i)\n        {\n        case 0:\n            break;\n        case 2:\n            gHitMarker |= HITMARKER_OBEYS;\n            return;\n        default:\n            gMoveResultFlags |= MOVE_RESULT_MISSED;\n            return;\n        }\n    }\n\n    gHitMarker |= HITMARKER_OBEYS;\n\n    if (gProtectStructs[gBattlerTarget].bounceMove && gBattleMoves[gCurrentMove].flags & FLAG_MAGIC_COAT_AFFECTED)\n    {\n        PressurePPLose(gBattlerAttacker, gBattlerTarget, MOVE_MAGIC_COAT);\n        gProtectStructs[gBattlerTarget].bounceMove = FALSE;\n        BattleScriptPushCursor();\n        gBattlescriptCurrInstr = BattleScript_MagicCoatBounce;\n        return;\n    }\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED)\n        {\n            PressurePPLose(gBattlerAttacker, gBattlerByTurnOrder[i], MOVE_SNATCH);\n            gProtectStructs[gBattlerByTurnOrder[i]].stealMove = FALSE;\n            gBattleScripting.battler = gBattlerByTurnOrder[i];\n            BattleScriptPushCursor();\n            gBattlescriptCurrInstr = BattleScript_SnatchedMove;\n            return;\n        }\n    }\n\n    if (gSpecialStatuses[gBattlerTarget].lightningRodRedirected)\n    {\n        gSpecialStatuses[gBattlerTarget].lightningRodRedirected = FALSE;\n        gLastUsedAbility = ABILITY_LIGHTNING_ROD;\n        BattleScriptPushCursor();\n        gBattlescriptCurrInstr = BattleScript_TookAttack;\n        RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);\n    }\n    else if (DEFENDER_IS_PROTECTED\n     && (gCurrentMove != MOVE_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST))\n     && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))))\n    {\n        CancelMultiTurnMoves(gBattlerAttacker);\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gLastLandedMoves[gBattlerTarget] = 0;\n        gLastHitByType[gBattlerTarget] = 0;\n        gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED;\n        gBattlescriptCurrInstr++;\n    }\n    else\n    {\n        gBattlescriptCurrInstr++;\n    }\n}\n\nstatic void JumpIfMoveFailed(u8 adder, u16 move)\n{\n    const u8 *BS_ptr = gBattlescriptCurrInstr + adder;\n    if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n    {\n        gLastLandedMoves[gBattlerTarget] = 0;\n        gLastHitByType[gBattlerTarget] = 0;\n        BS_ptr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        TrySetDestinyBondToHappen();\n        if (AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBattlerTarget, 0, 0, move))\n            return;\n    }\n    gBattlescriptCurrInstr = BS_ptr;\n}\n\nstatic void Cmd_jumpifaffectedbyprotect(void)\n{\n    if (DEFENDER_IS_PROTECTED)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        JumpIfMoveFailed(5, 0);\n        gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED;\n    }\n    else\n    {\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic bool8 JumpIfMoveAffectedByProtect(u16 move)\n{\n    bool8 affected = FALSE;\n    if (DEFENDER_IS_PROTECTED)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        JumpIfMoveFailed(7, move);\n        gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED;\n        affected = TRUE;\n    }\n    return affected;\n}\n\nstatic bool8 AccuracyCalcHelper(u16 move)\n{\n    if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker)\n    {\n        JumpIfMoveFailed(7, move);\n        return TRUE;\n    }\n\n    if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        JumpIfMoveFailed(7, move);\n        return TRUE;\n    }\n\n    gHitMarker &= ~HITMARKER_IGNORE_ON_AIR;\n\n    if (!(gHitMarker & HITMARKER_IGNORE_UNDERGROUND) && gStatuses3[gBattlerTarget] & STATUS3_UNDERGROUND)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        JumpIfMoveFailed(7, move);\n        return TRUE;\n    }\n\n    gHitMarker &= ~HITMARKER_IGNORE_UNDERGROUND;\n\n    if (!(gHitMarker & HITMARKER_IGNORE_UNDERWATER) && gStatuses3[gBattlerTarget] & STATUS3_UNDERWATER)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        JumpIfMoveFailed(7, move);\n        return TRUE;\n    }\n\n    gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER;\n\n    if ((WEATHER_HAS_EFFECT && (gBattleWeather & B_WEATHER_RAIN) && gBattleMoves[move].effect == EFFECT_THUNDER)\n     || (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW))\n    {\n        JumpIfMoveFailed(7, move);\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic void Cmd_accuracycheck(void)\n{\n    u16 move = T2_READ_16(gBattlescriptCurrInstr + 5);\n\n    if ((gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE\n        && !BtlCtrl_OakOldMan_TestState2Flag(1)\n        && gBattleMoves[move].power != 0\n        && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n     || (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE\n        && !BtlCtrl_OakOldMan_TestState2Flag(2)\n        && gBattleMoves[move].power == 0\n        && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n     || (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE))\n    {\n        JumpIfMoveFailed(7, move);\n        return;\n    }\n    if (move == NO_ACC_CALC || move == NO_ACC_CALC_CHECK_LOCK_ON)\n    {\n        if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && move == NO_ACC_CALC_CHECK_LOCK_ON && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker)\n            gBattlescriptCurrInstr += 7;\n        else if (gStatuses3[gBattlerTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER))\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        else if (!JumpIfMoveAffectedByProtect(0))\n            gBattlescriptCurrInstr += 7;\n    }\n    else\n    {\n        u8 type, moveAcc, holdEffect, param;\n        s8 buff;\n        u16 calc;\n\n        if (move == ACC_CURR_MOVE)\n            move = gCurrentMove;\n\n        GET_MOVE_TYPE(move, type);\n\n        if (JumpIfMoveAffectedByProtect(move))\n            return;\n        if (AccuracyCalcHelper(move))\n            return;\n\n        if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT)\n        {\n            u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC];\n            buff = acc;\n        }\n        else\n        {\n            u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC];\n            buff = acc + DEFAULT_STAT_STAGE - gBattleMons[gBattlerTarget].statStages[STAT_EVASION];\n        }\n\n        if (buff < MIN_STAT_STAGE)\n            buff = MIN_STAT_STAGE;\n        if (buff > MAX_STAT_STAGE)\n            buff = MAX_STAT_STAGE;\n\n        moveAcc = gBattleMoves[move].accuracy;\n        // check Thunder on sunny weather\n        if (WEATHER_HAS_EFFECT && gBattleWeather & B_WEATHER_SUN && gBattleMoves[move].effect == EFFECT_THUNDER)\n            moveAcc = 50;\n\n        calc = sAccuracyStageRatios[buff].dividend * moveAcc;\n        calc /= sAccuracyStageRatios[buff].divisor;\n\n        if (gBattleMons[gBattlerAttacker].ability == ABILITY_COMPOUND_EYES)\n            calc = (calc * 130) / 100; // 1.3 compound eyes boost\n        if (WEATHER_HAS_EFFECT && gBattleMons[gBattlerTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & B_WEATHER_SANDSTORM)\n            calc = (calc * 80) / 100; // 1.2 sand veil loss\n        if (gBattleMons[gBattlerAttacker].ability == ABILITY_HUSTLE && IS_TYPE_PHYSICAL(type))\n            calc = (calc * 80) / 100; // 1.2 hustle loss\n\n        if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY)\n        {\n            holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect;\n            param = gEnigmaBerries[gBattlerTarget].holdEffectParam;\n        }\n        else\n        {\n            holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item);\n            param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item);\n        }\n\n        gPotentialItemEffectBattler = gBattlerTarget;\n\n        if (holdEffect == HOLD_EFFECT_EVASION_UP)\n            calc = (calc * (100 - param)) / 100;\n\n        // final calculation\n        if ((Random() % 100 + 1) > calc)\n        {\n            gMoveResultFlags |= MOVE_RESULT_MISSED;\n            if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE\n             && (gBattleMoves[move].target == MOVE_TARGET_BOTH || gBattleMoves[move].target == MOVE_TARGET_FOES_AND_ALLY))\n                gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_ATK;\n            else\n                gBattleCommunication[MISS_TYPE] = B_MSG_MISSED;\n\n            CheckWonderGuardAndLevitate();\n        }\n        JumpIfMoveFailed(7, move);\n    }\n}\n\nstatic void Cmd_attackstring(void)\n{\n    if (gBattleControllerExecFlags)\n        return;\n\n    if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED)))\n    {\n        PrepareStringBattle(STRINGID_USEDMOVE, gBattlerAttacker);\n        gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED;\n    }\n    gBattlescriptCurrInstr++;\n    gBattleCommunication[MSG_DISPLAY] = 0;\n}\n\nstatic void Cmd_ppreduce(void)\n{\n    s32 ppToDeduct = 1;\n\n    if (gBattleControllerExecFlags)\n        return;\n\n    if (!gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure)\n    {\n        switch (gBattleMoves[gCurrentMove].target)\n        {\n        case MOVE_TARGET_FOES_AND_ALLY:\n            ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBattlerAttacker, ABILITY_PRESSURE, 0, 0);\n            break;\n        case MOVE_TARGET_BOTH:\n        case MOVE_TARGET_OPPONENTS_FIELD:\n            ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_PRESSURE, 0, 0);\n            break;\n        default:\n            if (gBattlerAttacker != gBattlerTarget && gBattleMons[gBattlerTarget].ability == ABILITY_PRESSURE)\n                ppToDeduct++;\n            break;\n        }\n    }\n\n    if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBattlerAttacker].pp[gCurrMovePos])\n    {\n        gProtectStructs[gBattlerAttacker].notFirstStrike = 1;\n\n        if (gBattleMons[gBattlerAttacker].pp[gCurrMovePos] > ppToDeduct)\n            gBattleMons[gBattlerAttacker].pp[gCurrMovePos] -= ppToDeduct;\n        else\n            gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 0;\n\n        if (MOVE_IS_PERMANENT(gBattlerAttacker, gCurrMovePos))\n        {\n            gActiveBattler = gBattlerAttacker;\n            BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0,\n                                         sizeof(gBattleMons[gBattlerAttacker].pp[gCurrMovePos]),\n                                         &gBattleMons[gBattlerAttacker].pp[gCurrMovePos]);\n            MarkBattlerForControllerExec(gBattlerAttacker);\n        }\n    }\n\n    gHitMarker &= ~HITMARKER_NO_PPDEDUCT;\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_critcalc(void)\n{\n    u8 holdEffect;\n    u16 item, critChance;\n\n    item = gBattleMons[gBattlerAttacker].item;\n\n    if (item == ITEM_ENIGMA_BERRY)\n        holdEffect = gEnigmaBerries[gBattlerAttacker].holdEffect;\n    else\n        holdEffect = ItemId_GetHoldEffect(item);\n\n    gPotentialItemEffectBattler = gBattlerAttacker;\n\n    critChance  = 2 * ((gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0)\n                + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL)\n                + (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK)\n                + (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK)\n                + (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL)\n                + (holdEffect == HOLD_EFFECT_SCOPE_LENS)\n                + 2 * (holdEffect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBattlerAttacker].species == SPECIES_CHANSEY)\n                + 2 * (holdEffect == HOLD_EFFECT_STICK && gBattleMons[gBattlerAttacker].species == SPECIES_FARFETCHD);\n\n    if (critChance >= ARRAY_COUNT(sCriticalHitChance))\n        critChance = ARRAY_COUNT(sCriticalHitChance) - 1;\n\n    if ((gBattleMons[gBattlerTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBattlerTarget].ability != ABILITY_SHELL_ARMOR)\n     && !(gStatuses3[gBattlerAttacker] & STATUS3_CANT_SCORE_A_CRIT)\n     && !(gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL)\n     && !(Random() % sCriticalHitChance[critChance])\n     && (!(gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) || BtlCtrl_OakOldMan_TestState2Flag(1))\n     && !(gBattleTypeFlags & BATTLE_TYPE_POKEDUDE))\n        gCritMultiplier = 2;\n    else\n        gCritMultiplier = 1;\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_damagecalc(void)\n{\n    u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)];\n    gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove,\n                                            sideStatus, gDynamicBasePower,\n                                            gBattleStruct->dynamicMoveType, gBattlerAttacker, gBattlerTarget);\n    gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier;\n\n    if (gStatuses3[gBattlerAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)\n        gBattleMoveDamage *= 2;\n    if (gProtectStructs[gBattlerAttacker].helpingHand)\n        gBattleMoveDamage = gBattleMoveDamage * 15 / 10;\n\n    gBattlescriptCurrInstr++;\n}\n\nvoid AI_CalcDmg(u8 attacker, u8 defender)\n{\n    u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(defender)];\n    gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[attacker], &gBattleMons[defender], gCurrentMove,\n                                            sideStatus, gDynamicBasePower,\n                                            gBattleStruct->dynamicMoveType, attacker, defender);\n    gDynamicBasePower = 0;\n    gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier;\n\n    if (gStatuses3[attacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)\n        gBattleMoveDamage *= 2;\n    if (gProtectStructs[attacker].helpingHand)\n        gBattleMoveDamage = gBattleMoveDamage * 15 / 10;\n}\n\nstatic void ModulateDmgByType(u8 multiplier)\n{\n    gBattleMoveDamage = gBattleMoveDamage * multiplier / 10;\n    if (gBattleMoveDamage == 0 && multiplier != 0)\n        gBattleMoveDamage = 1;\n\n    switch (multiplier)\n    {\n    case TYPE_MUL_NO_EFFECT:\n        gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;\n        gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;\n        gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE;\n        break;\n    case TYPE_MUL_NOT_EFFECTIVE:\n        if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))\n        {\n            if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE)\n                gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE;\n            else\n                gMoveResultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;\n        }\n        break;\n    case TYPE_MUL_SUPER_EFFECTIVE:\n        if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))\n        {\n            if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)\n                gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;\n            else\n                gMoveResultFlags |= MOVE_RESULT_SUPER_EFFECTIVE;\n        }\n        break;\n    }\n}\n\nstatic void Cmd_typecalc(void)\n{\n    s32 i = 0;\n    u8 moveType;\n\n    if (gCurrentMove == MOVE_STRUGGLE)\n    {\n        gBattlescriptCurrInstr++;\n        return;\n    }\n\n    GET_MOVE_TYPE(gCurrentMove, moveType);\n\n    // check stab\n    if (IS_BATTLER_OF_TYPE(gBattlerAttacker, moveType))\n    {\n        gBattleMoveDamage = gBattleMoveDamage * 15;\n        gBattleMoveDamage = gBattleMoveDamage / 10;\n    }\n\n    if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)\n    {\n        gLastUsedAbility = gBattleMons[gBattlerTarget].ability;\n        gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE);\n        gLastLandedMoves[gBattlerTarget] = 0;\n        gLastHitByType[gBattlerTarget] = 0;\n        gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS;\n        RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);\n    }\n    else\n    {\n        while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE)\n        {\n            if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT)\n            {\n                if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT)\n                    break;\n                i += 3;\n                continue;\n            }\n            else if (TYPE_EFFECT_ATK_TYPE(i) == moveType)\n            {\n                // check type1\n                if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1)\n                    ModulateDmgByType(TYPE_EFFECT_MULTIPLIER(i));\n                // check type2\n                if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 &&\n                    gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2)\n                    ModulateDmgByType(TYPE_EFFECT_MULTIPLIER(i));\n            }\n            i += 3;\n        }\n    }\n\n    if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2\n     && (!(gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) || ((gMoveResultFlags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)))\n     && gBattleMoves[gCurrentMove].power)\n    {\n        gLastUsedAbility = ABILITY_WONDER_GUARD;\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gLastLandedMoves[gBattlerTarget] = 0;\n        gLastHitByType[gBattlerTarget] = 0;\n        gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG;\n        RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);\n    }\n    if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)\n        gProtectStructs[gBattlerAttacker].targetNotAffected = 1;\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void CheckWonderGuardAndLevitate(void)\n{\n    u8 flags = 0;\n    s32 i = 0;\n    u8 moveType;\n\n    if (gCurrentMove == MOVE_STRUGGLE || !gBattleMoves[gCurrentMove].power)\n        return;\n\n    GET_MOVE_TYPE(gCurrentMove, moveType);\n\n    if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)\n    {\n        gLastUsedAbility = ABILITY_LEVITATE;\n        gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS;\n        RecordAbilityBattle(gBattlerTarget, ABILITY_LEVITATE);\n        return;\n    }\n\n    while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE)\n    {\n        if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT)\n        {\n            if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT)\n                break;\n            i += 3;\n            continue;\n        }\n        if (TYPE_EFFECT_ATK_TYPE(i) == moveType)\n        {\n            // check no effect\n            if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1\n                && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT)\n            {\n                gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;\n                gProtectStructs[gBattlerAttacker].targetNotAffected = 1;\n            }\n            if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 &&\n                gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 &&\n                TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT)\n            {\n                gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;\n                gProtectStructs[gBattlerAttacker].targetNotAffected = 1;\n            }\n\n            // check super effective\n            if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 20)\n                flags |= 1;\n            if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2\n             && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2\n             && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE)\n                flags |= 1;\n\n            // check not very effective\n            if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 5)\n                flags |= 2;\n            if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2\n             && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2\n             && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE)\n                flags |= 2;\n        }\n        i += 3;\n    }\n\n    if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2)\n    {\n        if (((flags & 2) || !(flags & 1)) && gBattleMoves[gCurrentMove].power)\n        {\n            gLastUsedAbility = ABILITY_WONDER_GUARD;\n            gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG;\n            RecordAbilityBattle(gBattlerTarget, ABILITY_WONDER_GUARD);\n        }\n    }\n}\n\n// Same as ModulateDmgByType except different arguments\nstatic void ModulateDmgByType2(u8 multiplier, u16 move, u8 *flags)\n{\n    gBattleMoveDamage = gBattleMoveDamage * multiplier / 10;\n    if (gBattleMoveDamage == 0 && multiplier != 0)\n        gBattleMoveDamage = 1;\n\n    switch (multiplier)\n    {\n    case TYPE_MUL_NO_EFFECT:\n        *flags |= MOVE_RESULT_DOESNT_AFFECT_FOE;\n        *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;\n        *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE;\n        break;\n    case TYPE_MUL_NOT_EFFECTIVE:\n        if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT))\n        {\n            if (*flags & MOVE_RESULT_SUPER_EFFECTIVE)\n                *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE;\n            else\n                *flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;\n        }\n        break;\n    case TYPE_MUL_SUPER_EFFECTIVE:\n        if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT))\n        {\n            if (*flags & MOVE_RESULT_NOT_VERY_EFFECTIVE)\n                *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;\n            else\n                *flags |= MOVE_RESULT_SUPER_EFFECTIVE;\n        }\n        break;\n    }\n}\n\nu8 TypeCalc(u16 move, u8 attacker, u8 defender)\n{\n    s32 i = 0;\n    u8 flags = 0;\n    u8 moveType;\n\n    if (move == MOVE_STRUGGLE)\n        return 0;\n    if(gBattleMoves[move].effect != EFFECT_HIDDEN_POWER)\n        moveType = gBattleMoves[move].type;\n    else\n    {\n        s32 typeBits  = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0)\n              | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1)\n              | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2)\n              | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3)\n              | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4)\n              | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5);\n\n            u8 moveType = (15 * typeBits) / 63 + 1;\n            if (moveType >= TYPE_MYSTERY)\n                moveType++;\n            moveType |= 0xC0;\n    }\n    // check stab\n    if (IS_BATTLER_OF_TYPE(attacker, moveType))\n    {\n        gBattleMoveDamage = gBattleMoveDamage * 15;\n        gBattleMoveDamage = gBattleMoveDamage / 10;\n    }\n\n    if (gBattleMons[defender].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)\n    {\n        flags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE);\n    }\n    else\n    {\n        while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE)\n        {\n            if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT)\n            {\n                if (gBattleMons[defender].status2 & STATUS2_FORESIGHT)\n                    break;\n                i += 3;\n                continue;\n            }\n\n            else if (TYPE_EFFECT_ATK_TYPE(i) == moveType)\n            {\n                // check type1\n                if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].type1)\n                    ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags);\n                // check type2\n                if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].type2 &&\n                    gBattleMons[defender].type1 != gBattleMons[defender].type2)\n                    ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags);\n            }\n            i += 3;\n        }\n    }\n\n    if (gBattleMons[defender].ability == ABILITY_WONDER_GUARD && !(flags & MOVE_RESULT_MISSED)\n        && AttacksThisTurn(attacker, move) == 2\n        && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)))\n        && gBattleMoves[move].power)\n    {\n        flags |= MOVE_RESULT_MISSED;\n    }\n    return flags;\n}\n\nu8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility)\n{\n    s32 i = 0;\n    u8 flags = 0;\n    u8 type1 = gSpeciesInfo[targetSpecies].types[0], type2 = gSpeciesInfo[targetSpecies].types[1];\n    u8 moveType;\n\n    if (move == MOVE_STRUGGLE)\n        return 0;\n    if(gBattleMoves[move].effect != EFFECT_HIDDEN_POWER)\n        moveType = gBattleMoves[move].type;\n    else\n    {\n        s32 typeBits  = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0)\n              | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1)\n              | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2)\n              | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3)\n              | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4)\n              | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5);\n\n            u8 moveType = (15 * typeBits) / 63 + 1;\n            if (moveType >= TYPE_MYSTERY)\n                moveType++;\n            moveType |= 0xC0;\n    }\n    if (targetAbility == ABILITY_LEVITATE && moveType == TYPE_GROUND)\n    {\n        flags = MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE;\n    }\n    else\n    {\n        while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE)\n        {\n            if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT)\n            {\n                i += 3;\n                continue;\n            }\n            if (TYPE_EFFECT_ATK_TYPE(i) == moveType)\n            {\n                // check type1\n                if (TYPE_EFFECT_DEF_TYPE(i) == type1)\n                    ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags);\n                // check type2\n                if (TYPE_EFFECT_DEF_TYPE(i) == type2 && type1 != type2)\n                    ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags);\n            }\n            i += 3;\n        }\n    }\n    if (targetAbility == ABILITY_WONDER_GUARD\n     && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)))\n     && gBattleMoves[move].power)\n        flags |= MOVE_RESULT_DOESNT_AFFECT_FOE;\n    return flags;\n}\n\n// Multiplies the damage by a random factor between 85% to 100% inclusive\nstatic inline void ApplyRandomDmgMultiplier(void)\n{\n    u16 rand = Random();\n    u16 randPercent = 100 - (rand % 16);\n\n    if (gBattleMoveDamage != 0)\n    {\n        gBattleMoveDamage *= randPercent;\n        gBattleMoveDamage /= 100;\n        if (gBattleMoveDamage == 0)\n            gBattleMoveDamage = 1;\n    }\n}\n\nstatic void Unused_ApplyRandomDmgMultiplier(void)\n{\n    ApplyRandomDmgMultiplier();\n}\n\nstatic void Cmd_adjustnormaldamage(void)\n{\n    u8 holdEffect, param;\n\n    ApplyRandomDmgMultiplier();\n\n    if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY)\n    {\n        holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect;\n        param = gEnigmaBerries[gBattlerTarget].holdEffectParam;\n    }\n    else\n    {\n        holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item);\n        param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item);\n    }\n\n    gPotentialItemEffectBattler = gBattlerTarget;\n\n    if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param)\n    {\n        RecordItemEffectBattle(gBattlerTarget, holdEffect);\n        gSpecialStatuses[gBattlerTarget].focusBanded = 1;\n    }\n    if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE)\n     && (gBattleMoves[gCurrentMove].effect == EFFECT_FALSE_SWIPE || gProtectStructs[gBattlerTarget].endured || gSpecialStatuses[gBattlerTarget].focusBanded)\n     && gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage)\n    {\n        gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1;\n        if (gProtectStructs[gBattlerTarget].endured)\n        {\n            gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED;\n        }\n        else if (gSpecialStatuses[gBattlerTarget].focusBanded)\n        {\n            gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON;\n            gLastUsedItem = gBattleMons[gBattlerTarget].item;\n        }\n    }\n    gBattlescriptCurrInstr++;\n}\n\n// The same as adjustnormaldamage except it doesn't check for false swipe move effect.\nstatic void Cmd_adjustnormaldamage2(void)\n{\n    u8 holdEffect, param;\n\n    ApplyRandomDmgMultiplier();\n\n    if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY)\n    {\n        holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect;\n        param = gEnigmaBerries[gBattlerTarget].holdEffectParam;\n    }\n    else\n    {\n        holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item);\n        param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item);\n    }\n\n    gPotentialItemEffectBattler = gBattlerTarget;\n\n    if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param)\n    {\n        RecordItemEffectBattle(gBattlerTarget, holdEffect);\n        gSpecialStatuses[gBattlerTarget].focusBanded = 1;\n    }\n    if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE)\n     && (gProtectStructs[gBattlerTarget].endured || gSpecialStatuses[gBattlerTarget].focusBanded)\n     && gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage)\n    {\n        gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1;\n        if (gProtectStructs[gBattlerTarget].endured)\n        {\n            gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED;\n        }\n        else if (gSpecialStatuses[gBattlerTarget].focusBanded)\n        {\n            gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON;\n            gLastUsedItem = gBattleMons[gBattlerTarget].item;\n        }\n    }\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_attackanimation(void)\n{\n    if (gBattleControllerExecFlags)\n        return;\n\n    if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE))\n    {\n        BattleScriptPush(gBattlescriptCurrInstr + 1);\n        gBattlescriptCurrInstr = BattleScript_Pausex20;\n        gBattleScripting.animTurn++;\n        gBattleScripting.animTargetsHit++;\n    }\n    else\n    {\n        if ((gBattleMoves[gCurrentMove].target & MOVE_TARGET_BOTH\n            || gBattleMoves[gCurrentMove].target & MOVE_TARGET_FOES_AND_ALLY\n            || gBattleMoves[gCurrentMove].target & MOVE_TARGET_DEPENDS)\n            && gBattleScripting.animTargetsHit)\n        {\n            gBattlescriptCurrInstr++;\n            return;\n        }\n        if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))\n        {\n            gActiveBattler = gBattlerAttacker;\n\n            BtlController_EmitMoveAnimation(BUFFER_A, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker]);\n            gBattleScripting.animTurn++;\n            gBattleScripting.animTargetsHit++;\n            MarkBattlerForControllerExec(gBattlerAttacker);\n            gBattlescriptCurrInstr++;\n        }\n        else\n        {\n            BattleScriptPush(gBattlescriptCurrInstr + 1);\n            gBattlescriptCurrInstr = BattleScript_Pausex20;\n        }\n    }\n}\n\nstatic void Cmd_waitanimation(void)\n{\n    if (gBattleControllerExecFlags == 0)\n        gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_healthbarupdate(void)\n{\n    if (gBattleControllerExecFlags)\n        return;\n\n    if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))\n    {\n        gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n        if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE))\n        {\n            PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, gActiveBattler);\n        }\n        else\n        {\n            s16 healthValue;\n\n            s32 currDmg = gBattleMoveDamage;\n            s32 maxPossibleDmgValue = 10000; // not present in R/S, ensures that huge damage values don't change sign\n\n            if (currDmg <= maxPossibleDmgValue)\n                healthValue = currDmg;\n            else\n                healthValue = maxPossibleDmgValue;\n\n            BtlController_EmitHealthBarUpdate(BUFFER_A, healthValue);\n            MarkBattlerForControllerExec(gActiveBattler);\n\n            if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleMoveDamage > 0)\n                gBattleResults.playerMonWasDamaged = TRUE;\n        }\n    }\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_datahpupdate(void)\n{\n    u32 moveType;\n\n    if (gBattleControllerExecFlags)\n        return;\n\n    if (gBattleStruct->dynamicMoveType == 0)\n        moveType = gBattleMoves[gCurrentMove].type;\n    else if (!(gBattleStruct->dynamicMoveType & F_DYNAMIC_TYPE_1))\n        moveType = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK;\n    else\n        moveType = gBattleMoves[gCurrentMove].type;\n\n    if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))\n    {\n        gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n        if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE))\n        {\n            if (gDisableStructs[gActiveBattler].substituteHP >= gBattleMoveDamage)\n            {\n                if (gSpecialStatuses[gActiveBattler].dmg == 0)\n                    gSpecialStatuses[gActiveBattler].dmg = gBattleMoveDamage;\n                gDisableStructs[gActiveBattler].substituteHP -= gBattleMoveDamage;\n                gHpDealt = gBattleMoveDamage;\n            }\n            else\n            {\n                if (gSpecialStatuses[gActiveBattler].dmg == 0)\n                    gSpecialStatuses[gActiveBattler].dmg = gDisableStructs[gActiveBattler].substituteHP;\n                gHpDealt = gDisableStructs[gActiveBattler].substituteHP;\n                gDisableStructs[gActiveBattler].substituteHP = 0;\n            }\n            // check substitute fading\n            if (gDisableStructs[gActiveBattler].substituteHP == 0)\n            {\n                gBattlescriptCurrInstr += 2;\n                BattleScriptPushCursor();\n                gBattlescriptCurrInstr = BattleScript_SubstituteFade;\n                return;\n            }\n        }\n        else\n        {\n            gHitMarker &= ~HITMARKER_IGNORE_SUBSTITUTE;\n            if (gBattleMoveDamage < 0) // hp goes up\n            {\n                gBattleMons[gActiveBattler].hp -= gBattleMoveDamage;\n                if (gBattleMons[gActiveBattler].hp > gBattleMons[gActiveBattler].maxHP)\n                    gBattleMons[gActiveBattler].hp = gBattleMons[gActiveBattler].maxHP;\n\n            }\n            else // hp goes down\n            {\n                if (gHitMarker & HITMARKER_SKIP_DMG_TRACK)\n                {\n                    gHitMarker &= ~HITMARKER_SKIP_DMG_TRACK;\n                }\n                else\n                {\n                    gTakenDmg[gActiveBattler] += gBattleMoveDamage;\n                    if (gBattlescriptCurrInstr[1] == BS_TARGET)\n                        gTakenDmgByBattler[gActiveBattler] = gBattlerAttacker;\n                    else\n                        gTakenDmgByBattler[gActiveBattler] = gBattlerTarget;\n                }\n\n                if (gBattleMons[gActiveBattler].hp > gBattleMoveDamage)\n                {\n                    gBattleMons[gActiveBattler].hp -= gBattleMoveDamage;\n                    gHpDealt = gBattleMoveDamage;\n                }\n                else\n                {\n                    gHpDealt = gBattleMons[gActiveBattler].hp;\n                    gBattleMons[gActiveBattler].hp = 0;\n                }\n\n                if (!gSpecialStatuses[gActiveBattler].dmg && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE))\n                    gSpecialStatuses[gActiveBattler].dmg = gHpDealt;\n\n                if (IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && gCurrentMove != MOVE_PAIN_SPLIT)\n                {\n                    gProtectStructs[gActiveBattler].physicalDmg = gHpDealt;\n                    gSpecialStatuses[gActiveBattler].physicalDmg = gHpDealt;\n                    if (gBattlescriptCurrInstr[1] == BS_TARGET)\n                    {\n                        gProtectStructs[gActiveBattler].physicalBattlerId = gBattlerAttacker;\n                        gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerAttacker;\n                    }\n                    else\n                    {\n                        gProtectStructs[gActiveBattler].physicalBattlerId = gBattlerTarget;\n                        gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerTarget;\n                    }\n                }\n                else if (!IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE))\n                {\n                    gProtectStructs[gActiveBattler].specialDmg = gHpDealt;\n                    gSpecialStatuses[gActiveBattler].specialDmg = gHpDealt;\n                    if (gBattlescriptCurrInstr[1] == BS_TARGET)\n                    {\n                        gProtectStructs[gActiveBattler].specialBattlerId = gBattlerAttacker;\n                        gSpecialStatuses[gActiveBattler].specialBattlerId = gBattlerAttacker;\n                    }\n                    else\n                    {\n                        gProtectStructs[gActiveBattler].specialBattlerId = gBattlerTarget;\n                        gSpecialStatuses[gActiveBattler].specialBattlerId = gBattlerTarget;\n                    }\n                }\n            }\n            gHitMarker &= ~HITMARKER_PASSIVE_DAMAGE;\n            BtlController_EmitSetMonData(BUFFER_A, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp);\n            MarkBattlerForControllerExec(gActiveBattler);\n        }\n    }\n    else\n    {\n        gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n        if (gSpecialStatuses[gActiveBattler].dmg == 0)\n            gSpecialStatuses[gActiveBattler].dmg = 0xFFFF;\n    }\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_critmessage(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        if (gCritMultiplier == 2 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))\n        {\n            PrepareStringBattle(STRINGID_CRITICALHIT, gBattlerAttacker);\n            gBattleCommunication[MSG_DISPLAY] = 1;\n        }\n        gBattlescriptCurrInstr++;\n    }\n}\n\nstatic void Cmd_effectivenesssound(void)\n{\n    if (gBattleControllerExecFlags)\n        return;\n\n    gActiveBattler = gBattlerTarget;\n    if (!(gMoveResultFlags & MOVE_RESULT_MISSED))\n    {\n        switch (gMoveResultFlags & (u8)(~MOVE_RESULT_MISSED))\n        {\n        case MOVE_RESULT_SUPER_EFFECTIVE:\n            BtlController_EmitPlaySE(BUFFER_A, SE_SUPER_EFFECTIVE);\n            MarkBattlerForControllerExec(gActiveBattler);\n            break;\n        case MOVE_RESULT_NOT_VERY_EFFECTIVE:\n            BtlController_EmitPlaySE(BUFFER_A, SE_NOT_EFFECTIVE);\n            MarkBattlerForControllerExec(gActiveBattler);\n            break;\n        case MOVE_RESULT_DOESNT_AFFECT_FOE:\n        case MOVE_RESULT_FAILED:\n            // no sound\n            break;\n        case MOVE_RESULT_FOE_ENDURED:\n        case MOVE_RESULT_ONE_HIT_KO:\n        case MOVE_RESULT_FOE_HUNG_ON:\n        default:\n            if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE)\n            {\n                BtlController_EmitPlaySE(BUFFER_A, SE_SUPER_EFFECTIVE);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n            else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)\n            {\n                BtlController_EmitPlaySE(BUFFER_A, SE_NOT_EFFECTIVE);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n            else if (!(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED)))\n            {\n                BtlController_EmitPlaySE(BUFFER_A, SE_EFFECTIVE);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n            break;\n        }\n    }\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_resultmessage(void)\n{\n    u32 stringId = 0;\n\n    if (gBattleControllerExecFlags)\n        return;\n\n    if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK))\n    {\n        stringId = gMissStringIds[gBattleCommunication[MISS_TYPE]];\n        gBattleCommunication[MSG_DISPLAY] = 1;\n    }\n    else\n    {\n        gBattleCommunication[MSG_DISPLAY] = 1;\n        switch (gMoveResultFlags & (u8)(~MOVE_RESULT_MISSED))\n        {\n        case MOVE_RESULT_SUPER_EFFECTIVE:\n            stringId = STRINGID_SUPEREFFECTIVE;\n            break;\n        case MOVE_RESULT_NOT_VERY_EFFECTIVE:\n            stringId = STRINGID_NOTVERYEFFECTIVE;\n            break;\n        case MOVE_RESULT_ONE_HIT_KO:\n            stringId = STRINGID_ONEHITKO;\n            break;\n        case MOVE_RESULT_FOE_ENDURED:\n            stringId = STRINGID_PKMNENDUREDHIT;\n            break;\n        case MOVE_RESULT_FAILED:\n            stringId = STRINGID_BUTITFAILED;\n            break;\n        case MOVE_RESULT_DOESNT_AFFECT_FOE:\n            stringId = STRINGID_ITDOESNTAFFECT;\n            break;\n        case MOVE_RESULT_FOE_HUNG_ON:\n            gLastUsedItem = gBattleMons[gBattlerTarget].item;\n            gPotentialItemEffectBattler = gBattlerTarget;\n            gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);\n            BattleScriptPushCursor();\n            gBattlescriptCurrInstr = BattleScript_FocusBandActivates;\n            return;\n        default:\n            if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)\n            {\n                stringId = STRINGID_ITDOESNTAFFECT;\n            }\n            else if (gMoveResultFlags & MOVE_RESULT_ONE_HIT_KO)\n            {\n                gMoveResultFlags &= ~MOVE_RESULT_ONE_HIT_KO;\n                gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE;\n                gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;\n                BattleScriptPushCursor();\n                gBattlescriptCurrInstr = BattleScript_OneHitKOMsg;\n                return;\n            }\n            else if (gMoveResultFlags & MOVE_RESULT_FOE_ENDURED)\n            {\n                gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);\n                BattleScriptPushCursor();\n                gBattlescriptCurrInstr = BattleScript_EnduredMsg;\n                return;\n            }\n            else if (gMoveResultFlags & MOVE_RESULT_FOE_HUNG_ON)\n            {\n                gLastUsedItem = gBattleMons[gBattlerTarget].item;\n                gPotentialItemEffectBattler = gBattlerTarget;\n                gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);\n                BattleScriptPushCursor();\n                gBattlescriptCurrInstr = BattleScript_FocusBandActivates;\n                return;\n            }\n            else if (gMoveResultFlags & MOVE_RESULT_FAILED)\n            {\n                stringId = STRINGID_BUTITFAILED;\n            }\n            else\n            {\n                gBattleCommunication[MSG_DISPLAY] = 0;\n            }\n        }\n    }\n\n    if (stringId)\n        PrepareStringBattle(stringId, gBattlerAttacker);\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_printstring(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        u16 var = T2_READ_16(gBattlescriptCurrInstr + 1);\n        PrepareStringBattle(var, gBattlerAttacker);\n        gBattlescriptCurrInstr += 3;\n        gBattleCommunication[MSG_DISPLAY] = 1;\n    }\n}\n\nstatic void Cmd_printselectionstring(void)\n{\n    gActiveBattler = gBattlerAttacker;\n\n    BtlController_EmitPrintSelectionString(BUFFER_A, T2_READ_16(gBattlescriptCurrInstr + 1));\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 3;\n    gBattleCommunication[MSG_DISPLAY] = 1;\n}\n\nstatic void Cmd_waitmessage(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        if (!gBattleCommunication[MSG_DISPLAY])\n        {\n            gBattlescriptCurrInstr += 3;\n        }\n        else\n        {\n            u16 toWait = T2_READ_16(gBattlescriptCurrInstr + 1);\n\n            if (++gPauseCounterBattle >= toWait || (gSaveBlock2Ptr->optionsBattleSceneOff && (JOY_NEW(A_BUTTON | B_BUTTON))))\n            {\n                gPauseCounterBattle = 0;\n                gBattlescriptCurrInstr += 3;\n                gBattleCommunication[MSG_DISPLAY] = 0;\n            }\n        }\n    }\n}\n\nstatic void Cmd_printfromtable(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        const u16 *ptr = (const u16 *) T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        ptr += gBattleCommunication[MULTISTRING_CHOOSER];\n\n        PrepareStringBattle(*ptr, gBattlerAttacker);\n\n        gBattlescriptCurrInstr += 5;\n        gBattleCommunication[MSG_DISPLAY] = 1;\n    }\n}\n\nstatic void Cmd_printselectionstringfromtable(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        const u16 *ptr = (const u16 *) T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        ptr += gBattleCommunication[MULTISTRING_CHOOSER];\n\n        gActiveBattler = gBattlerAttacker;\n        BtlController_EmitPrintSelectionString(BUFFER_A, *ptr);\n        MarkBattlerForControllerExec(gActiveBattler);\n\n        gBattlescriptCurrInstr += 5;\n        gBattleCommunication[MSG_DISPLAY] = 1;\n    }\n}\n\nu8 GetBattlerTurnOrderNum(u8 battlerId)\n{\n    s32 i;\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if (gBattlerByTurnOrder[i] == battlerId)\n            break;\n    }\n    return i;\n}\n\n// Called INCREMENT_RESET_RETURN in Emerald which adds \"gBattleCommunication[MOVE_EFFECT_BYTE] = 0;\" before the return.\n#define INCREMENT_RETURN                        \\\n{                                               \\\n    gBattlescriptCurrInstr++;                   \\\n    return;                                     \\\n}\n\nvoid SetMoveEffect(bool8 primary, u8 certain)\n{\n    bool32 statusChanged = FALSE;\n    u8 affectsUser = 0; // 0x40 otherwise\n    bool32 noSunCanFreeze = TRUE;\n\n    if (gBattleCommunication[MOVE_EFFECT_BYTE] & MOVE_EFFECT_AFFECTS_USER)\n    {\n        gEffectBattler = gBattlerAttacker; // battlerId that effects get applied on\n        gBattleCommunication[MOVE_EFFECT_BYTE] &= ~MOVE_EFFECT_AFFECTS_USER;\n        affectsUser = MOVE_EFFECT_AFFECTS_USER;\n        gBattleScripting.battler = gBattlerTarget; // theoretically the attacker\n    }\n    else\n    {\n        gEffectBattler = gBattlerTarget;\n        gBattleScripting.battler = gBattlerAttacker;\n    }\n    if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE && gBattleCommunication[MOVE_EFFECT_BYTE] != 1\n        && GetBattlerSide(gEffectBattler) == B_SIDE_OPPONENT)\n        INCREMENT_RETURN\n\n    if (gBattleMons[gEffectBattler].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)\n        && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9)\n        INCREMENT_RETURN\n\n    if (gSideStatuses[GET_BATTLER_SIDE(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)\n        && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7)\n        INCREMENT_RETURN\n\n    if (gBattleMons[gEffectBattler].hp == 0\n        && gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_PAYDAY\n        && gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_STEAL_ITEM)\n        INCREMENT_RETURN\n\n    if (gBattleMons[gEffectBattler].status2 & STATUS2_SUBSTITUTE && affectsUser != MOVE_EFFECT_AFFECTS_USER)\n        INCREMENT_RETURN\n\n    if (gBattleCommunication[MOVE_EFFECT_BYTE] <= PRIMARY_STATUS_MOVE_EFFECT)\n    {\n        switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]])\n        {\n        case STATUS1_SLEEP:\n            // check active uproar\n            if (gBattleMons[gEffectBattler].ability != ABILITY_SOUNDPROOF)\n            {\n                for (gActiveBattler = 0;\n                    gActiveBattler < gBattlersCount && !(gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR);\n                    gActiveBattler++)\n                {}\n            }\n            else\n                gActiveBattler = gBattlersCount;\n\n            if (gBattleMons[gEffectBattler].status1)\n                break;\n            if (gActiveBattler != gBattlersCount)\n                break;\n            if (gBattleMons[gEffectBattler].ability == ABILITY_VITAL_SPIRIT)\n                break;\n            if (gBattleMons[gEffectBattler].ability == ABILITY_INSOMNIA)\n                break;\n\n            CancelMultiTurnMoves(gEffectBattler);\n            statusChanged = TRUE;\n            break;\n        case STATUS1_POISON:\n            if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY\n                && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))\n            {\n                gLastUsedAbility = ABILITY_IMMUNITY;\n                RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY);\n\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = BattleScript_PSNPrevention;\n\n                if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)\n                {\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS;\n                    gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT;\n                }\n                else\n                {\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS;\n                }\n                return;\n            }\n            if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL))\n                && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)\n                && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))\n            {\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = BattleScript_PSNPrevention;\n\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT;\n                return;\n            }\n            if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON))\n                break;\n            if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL))\n                break;\n            if (gBattleMons[gEffectBattler].status1)\n                break;\n            if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY)\n                break;\n\n            statusChanged = TRUE;\n            break;\n        case STATUS1_BURN:\n            if (gBattleMons[gEffectBattler].ability == ABILITY_WATER_VEIL\n                && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))\n            {\n                gLastUsedAbility = ABILITY_WATER_VEIL;\n                RecordAbilityBattle(gEffectBattler, ABILITY_WATER_VEIL);\n\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = BattleScript_BRNPrevention;\n                if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)\n                {\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS;\n                    gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT;\n                }\n                else\n                {\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS;\n                }\n                return;\n            }\n            if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE)\n                && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)\n                && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))\n            {\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = BattleScript_BRNPrevention;\n\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT;\n                return;\n            }\n            if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE))\n                break;\n            if (gBattleMons[gEffectBattler].ability == ABILITY_WATER_VEIL)\n                break;\n            if (gBattleMons[gEffectBattler].status1)\n                break;\n\n            statusChanged = TRUE;\n            break;\n        case STATUS1_FREEZE:\n            if (WEATHER_HAS_EFFECT && gBattleWeather & B_WEATHER_SUN)\n                noSunCanFreeze = FALSE;\n            if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_ICE))\n                break;\n            if (gBattleMons[gEffectBattler].status1)\n                break;\n            if (noSunCanFreeze == FALSE)\n                break;\n            if (gBattleMons[gEffectBattler].ability == ABILITY_MAGMA_ARMOR)\n                break;\n\n            CancelMultiTurnMoves(gEffectBattler);\n            statusChanged = TRUE;\n            break;\n        case STATUS1_PARALYSIS:\n            if (gBattleMons[gEffectBattler].ability == ABILITY_LIMBER)\n            {\n                if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)\n                {\n                    gLastUsedAbility = ABILITY_LIMBER;\n                    RecordAbilityBattle(gEffectBattler, ABILITY_LIMBER);\n\n                    BattleScriptPush(gBattlescriptCurrInstr + 1);\n                    gBattlescriptCurrInstr = BattleScript_PRLZPrevention;\n\n                    if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)\n                    {\n                        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS;\n                        gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT;\n                    }\n                    else\n                    {\n                        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS;\n                    }\n                    return;\n                }\n                else\n                    break;\n            }\n            if (gBattleMons[gEffectBattler].status1)\n                break;\n\n            statusChanged = TRUE;\n            break;\n        case STATUS1_TOXIC_POISON:\n            if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))\n            {\n                gLastUsedAbility = ABILITY_IMMUNITY;\n                RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY);\n\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = BattleScript_PSNPrevention;\n\n                if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)\n                {\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS;\n                    gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT;\n                }\n                else\n                {\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS;\n                }\n                return;\n            }\n            if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL))\n                && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)\n                && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))\n            {\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = BattleScript_PSNPrevention;\n\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT;\n                return;\n            }\n            if (gBattleMons[gEffectBattler].status1)\n                break;\n            if (!IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) && !IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL))\n            {\n                if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY)\n                    break;\n\n                // It's redundant, because at this point we know the status1 value is 0.\n                gBattleMons[gEffectBattler].status1 &= ~STATUS1_TOXIC_POISON;\n                gBattleMons[gEffectBattler].status1 &= ~STATUS1_POISON;\n                statusChanged = TRUE;\n                break;\n            }\n            else\n            {\n                gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;\n            }\n            break;\n        }\n        if (statusChanged == TRUE)\n        {\n            BattleScriptPush(gBattlescriptCurrInstr + 1);\n\n            if (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS1_SLEEP)\n                gBattleMons[gEffectBattler].status1 |= STATUS1_SLEEP_TURN((Random() & 3) + 2); // 2-5 turns\n            else\n                gBattleMons[gEffectBattler].status1 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]];\n\n            gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];\n\n            gActiveBattler = gEffectBattler;\n            BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].status1), &gBattleMons[gEffectBattler].status1);\n            MarkBattlerForControllerExec(gActiveBattler);\n\n            if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)\n            {\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED_BY_ABILITY;\n                gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT;\n            }\n            else\n            {\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED;\n            }\n\n            // for synchronize\n\n            if (gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_POISON\n             || gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_TOXIC\n             || gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_PARALYSIS\n             || gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_BURN)\n             {\n                u8 *synchronizeEffect = &gBattleStruct->synchronizeMoveEffect;\n                *synchronizeEffect = gBattleCommunication[MOVE_EFFECT_BYTE];\n                gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT;\n             }\n        }\n        else if (statusChanged == FALSE)\n        {\n            gBattlescriptCurrInstr++;\n        }\n        return;\n    }\n    else\n    {\n        if (gBattleMons[gEffectBattler].status2 & sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]])\n        {\n            gBattlescriptCurrInstr++;\n        }\n        else\n        {\n            u8 side;\n            switch (gBattleCommunication[MOVE_EFFECT_BYTE])\n            {\n            case MOVE_EFFECT_CONFUSION:\n                if (gBattleMons[gEffectBattler].ability == ABILITY_OWN_TEMPO\n                    || gBattleMons[gEffectBattler].status2 & STATUS2_CONFUSION)\n                {\n                    gBattlescriptCurrInstr++;\n                }\n                else\n                {\n                    gBattleMons[gEffectBattler].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); // 2-5 turns\n\n                    BattleScriptPush(gBattlescriptCurrInstr + 1);\n                    gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];\n                }\n                break;\n            case MOVE_EFFECT_FLINCH:\n                if (gBattleMons[gEffectBattler].ability == ABILITY_INNER_FOCUS)\n                {\n                    if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)\n                    {\n                        gLastUsedAbility = ABILITY_INNER_FOCUS;\n                        RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS);\n                        gBattlescriptCurrInstr = BattleScript_FlinchPrevention;\n                    }\n                    else\n                    {\n                        gBattlescriptCurrInstr++;\n                    }\n                }\n                else\n                {\n                    if (GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber)\n                        gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]];\n                    gBattlescriptCurrInstr++;\n                }\n                break;\n            case MOVE_EFFECT_UPROAR:\n                if (!(gBattleMons[gEffectBattler].status2 & STATUS2_UPROAR))\n                {\n                    gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS;\n                    gLockedMoves[gEffectBattler] = gCurrentMove;\n                    gBattleMons[gEffectBattler].status2 |= STATUS2_UPROAR_TURN((Random() & 3) + 2); // 2-5 turns\n\n                    BattleScriptPush(gBattlescriptCurrInstr + 1);\n                    gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];\n                }\n                else\n                {\n                    gBattlescriptCurrInstr++;\n                }\n                break;\n            case MOVE_EFFECT_PAYDAY:\n                if (GET_BATTLER_SIDE(gBattlerAttacker) == B_SIDE_PLAYER)\n                {\n                    u16 payday = gPaydayMoney;\n                    gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 5);\n                    if (payday > gPaydayMoney)\n                        gPaydayMoney = 0xFFFF;\n                }\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];\n                break;\n            case MOVE_EFFECT_TRI_ATTACK:\n                if (gBattleMons[gEffectBattler].status1)\n                {\n                    gBattlescriptCurrInstr++;\n                }\n                else\n                {\n                    gBattleCommunication[MOVE_EFFECT_BYTE] = Random() % 3 + 3;\n                    SetMoveEffect(FALSE, 0);\n                }\n                break;\n            case MOVE_EFFECT_CHARGING:\n                gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS;\n                gLockedMoves[gEffectBattler] = gCurrentMove;\n                gProtectStructs[gEffectBattler].chargingTurn = 1;\n                gBattlescriptCurrInstr++;\n                break;\n            case MOVE_EFFECT_WRAP:\n                if (gBattleMons[gEffectBattler].status2 & STATUS2_WRAPPED)\n                {\n                    gBattlescriptCurrInstr++;\n                }\n                else\n                {\n                    gBattleMons[gEffectBattler].status2 |= STATUS2_WRAPPED_TURN((Random() & 3) + 3); // 3-6 turns\n\n                    *(gBattleStruct->wrappedMove + gEffectBattler * 2 + 0) = gCurrentMove;\n                    *(gBattleStruct->wrappedMove + gEffectBattler * 2 + 1) = gCurrentMove >> 8;\n                    *(gBattleStruct->wrappedBy + gEffectBattler) = gBattlerAttacker;\n\n                    BattleScriptPush(gBattlescriptCurrInstr + 1);\n                    gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];\n\n                    for (gBattleCommunication[MULTISTRING_CHOOSER] = 0; ; gBattleCommunication[MULTISTRING_CHOOSER]++)\n                    {\n                        if (gBattleCommunication[MULTISTRING_CHOOSER] >= NUM_TRAPPING_MOVES - 1)\n                            break;\n                        if (gTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]] == gCurrentMove)\n                            break;\n                    }\n                }\n                break;\n            case MOVE_EFFECT_RECOIL_25: // 25% recoil\n                gBattleMoveDamage = (gHpDealt) / 4;\n                if (gBattleMoveDamage == 0)\n                    gBattleMoveDamage = 1;\n\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];\n                break;\n            case MOVE_EFFECT_ATK_PLUS_1:\n            case MOVE_EFFECT_DEF_PLUS_1:\n            case MOVE_EFFECT_SPD_PLUS_1:\n            case MOVE_EFFECT_SP_ATK_PLUS_1:\n            case MOVE_EFFECT_SP_DEF_PLUS_1:\n            case MOVE_EFFECT_ACC_PLUS_1:\n            case MOVE_EFFECT_EVS_PLUS_1:\n                if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1),\n                                    gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_PLUS_1 + 1,\n                                    affectsUser, 0))\n                {\n                    gBattlescriptCurrInstr++;\n                }\n                else\n                {\n                    gBattleScripting.animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN);\n                    gBattleScripting.animArg2 = 0;\n                    BattleScriptPush(gBattlescriptCurrInstr + 1);\n                    gBattlescriptCurrInstr = BattleScript_StatUp;\n                }\n                break;\n            case MOVE_EFFECT_ATK_MINUS_1:\n            case MOVE_EFFECT_DEF_MINUS_1:\n            case MOVE_EFFECT_SPD_MINUS_1:\n            case MOVE_EFFECT_SP_ATK_MINUS_1:\n            case MOVE_EFFECT_SP_DEF_MINUS_1:\n            case MOVE_EFFECT_ACC_MINUS_1:\n            case MOVE_EFFECT_EVS_MINUS_1:\n                if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE,\n                                    gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_MINUS_1 + 1,\n                                    affectsUser, 0))\n                {\n                    gBattlescriptCurrInstr++;\n                }\n                else\n                {\n                    gBattleScripting.animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN);\n                    gBattleScripting.animArg2 = 0;\n                    BattleScriptPush(gBattlescriptCurrInstr + 1);\n                    gBattlescriptCurrInstr = BattleScript_StatDown;\n                }\n                break;\n            case MOVE_EFFECT_ATK_PLUS_2:\n            case MOVE_EFFECT_DEF_PLUS_2:\n            case MOVE_EFFECT_SPD_PLUS_2:\n            case MOVE_EFFECT_SP_ATK_PLUS_2:\n            case MOVE_EFFECT_SP_DEF_PLUS_2:\n            case MOVE_EFFECT_ACC_PLUS_2:\n            case MOVE_EFFECT_EVS_PLUS_2:\n                if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2),\n                                    gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_PLUS_2 + 1,\n                                    affectsUser, 0))\n                {\n                    gBattlescriptCurrInstr++;\n                }\n                else\n                {\n                    gBattleScripting.animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN);\n                    gBattleScripting.animArg2 = 0;\n                    BattleScriptPush(gBattlescriptCurrInstr + 1);\n                    gBattlescriptCurrInstr = BattleScript_StatUp;\n                }\n                break;\n            case MOVE_EFFECT_ATK_MINUS_2:\n            case MOVE_EFFECT_DEF_MINUS_2:\n            case MOVE_EFFECT_SPD_MINUS_2:\n            case MOVE_EFFECT_SP_ATK_MINUS_2:\n            case MOVE_EFFECT_SP_DEF_MINUS_2:\n            case MOVE_EFFECT_ACC_MINUS_2:\n            case MOVE_EFFECT_EVS_MINUS_2:\n                if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE,\n                                    gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_MINUS_2 + 1,\n                                    affectsUser, 0))\n                {\n                    gBattlescriptCurrInstr++;\n                }\n                else\n                {\n                    gBattleScripting.animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN);\n                    gBattleScripting.animArg2 = 0;\n                    BattleScriptPush(gBattlescriptCurrInstr + 1);\n                    gBattlescriptCurrInstr = BattleScript_StatDown;\n                }\n                break;\n            case MOVE_EFFECT_RECHARGE:\n                gBattleMons[gEffectBattler].status2 |= STATUS2_RECHARGE;\n                gDisableStructs[gEffectBattler].rechargeTimer = 2;\n                gLockedMoves[gEffectBattler] = gCurrentMove;\n                gBattlescriptCurrInstr++;\n                break;\n            case MOVE_EFFECT_RAGE:\n                gBattleMons[gBattlerAttacker].status2 |= STATUS2_RAGE;\n                gBattlescriptCurrInstr++;\n                break;\n            case MOVE_EFFECT_STEAL_ITEM:\n                {\n                    if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)\n                    {\n                        gBattlescriptCurrInstr++;\n                        break;\n                    }\n\n                    side = GetBattlerSide(gBattlerAttacker);\n                    if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT\n                        && !(gBattleTypeFlags &\n                            (BATTLE_TYPE_EREADER_TRAINER\n                            | BATTLE_TYPE_BATTLE_TOWER\n                            | BATTLE_TYPE_LINK))\n                        && gTrainerBattleOpponent_A != TRAINER_SECRET_BASE)\n                    {\n                        gBattlescriptCurrInstr++;\n                    }\n                    else if (!(gBattleTypeFlags &\n                            (BATTLE_TYPE_EREADER_TRAINER\n                            | BATTLE_TYPE_BATTLE_TOWER\n                            | BATTLE_TYPE_LINK))\n                        && gTrainerBattleOpponent_A != TRAINER_SECRET_BASE\n                        && (gWishFutureKnock.knockedOffMons[side] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]]))\n                    {\n                        gBattlescriptCurrInstr++;\n                    }\n                    else if (gBattleMons[gBattlerTarget].item\n                        && gBattleMons[gBattlerTarget].ability == ABILITY_STICKY_HOLD)\n                    {\n                        gBattlescriptCurrInstr = BattleScript_StickyHoldActivates;\n                        gLastUsedAbility = gBattleMons[gBattlerTarget].ability;\n                        RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);\n                    }\n                    else if (gBattleMons[gBattlerAttacker].item != ITEM_NONE\n                        || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY\n                        || IS_ITEM_MAIL(gBattleMons[gBattlerTarget].item)\n                        || gBattleMons[gBattlerTarget].item == ITEM_NONE)\n                    {\n                        gBattlescriptCurrInstr++;\n                    }\n                    else\n                    {\n                        u16 *changedItem = &gBattleStruct->changedItems[gBattlerAttacker];\n                        gLastUsedItem = *changedItem = gBattleMons[gBattlerTarget].item;\n                        gBattleMons[gBattlerTarget].item = ITEM_NONE;\n\n                        gActiveBattler = gBattlerAttacker;\n                        BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gLastUsedItem), &gLastUsedItem);\n                        MarkBattlerForControllerExec(gBattlerAttacker);\n\n                        gActiveBattler = gBattlerTarget;\n                        BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item);\n                        MarkBattlerForControllerExec(gBattlerTarget);\n\n                        BattleScriptPush(gBattlescriptCurrInstr + 1);\n                        gBattlescriptCurrInstr = BattleScript_ItemSteal;\n\n                        *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0;\n                        *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0;\n                    }\n                }\n                break;\n            case MOVE_EFFECT_PREVENT_ESCAPE:\n                gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION;\n                gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker;\n                gBattlescriptCurrInstr++;\n                break;\n            case MOVE_EFFECT_NIGHTMARE:\n                gBattleMons[gBattlerTarget].status2 |= STATUS2_NIGHTMARE;\n                gBattlescriptCurrInstr++;\n                break;\n            case MOVE_EFFECT_ALL_STATS_UP:\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = BattleScript_AllStatsUp;\n                break;\n            case MOVE_EFFECT_RAPIDSPIN:\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = BattleScript_RapidSpinAway;\n                break;\n            case MOVE_EFFECT_REMOVE_PARALYSIS: // Smelling salts\n                if (!(gBattleMons[gBattlerTarget].status1 & STATUS1_PARALYSIS))\n                {\n                    gBattlescriptCurrInstr++;\n                }\n                else\n                {\n                    gBattleMons[gBattlerTarget].status1 &= ~STATUS1_PARALYSIS;\n\n                    gActiveBattler = gBattlerTarget;\n                    BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1);\n                    MarkBattlerForControllerExec(gActiveBattler);\n\n                    BattleScriptPush(gBattlescriptCurrInstr + 1);\n                    gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal;\n                }\n                break;\n            case MOVE_EFFECT_ATK_DEF_DOWN: // SuperPower\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = BattleScript_AtkDefDown;\n                break;\n            case MOVE_EFFECT_RECOIL_33: // Double Edge\n                gBattleMoveDamage = gHpDealt / 3;\n                if (gBattleMoveDamage == 0)\n                    gBattleMoveDamage = 1;\n\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];\n                break;\n            case MOVE_EFFECT_THRASH:\n                if (gBattleMons[gEffectBattler].status2 & STATUS2_LOCK_CONFUSE)\n                {\n                    gBattlescriptCurrInstr++;\n                }\n                else\n                {\n                    gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS;\n                    gLockedMoves[gEffectBattler] = gCurrentMove;\n                    gBattleMons[gEffectBattler].status2 |= STATUS2_LOCK_CONFUSE_TURN((Random() & 1) + 2); // thrash for 2-3 turns\n                }\n                break;\n            case MOVE_EFFECT_KNOCK_OFF:\n                if (gBattleMons[gEffectBattler].ability == ABILITY_STICKY_HOLD)\n                {\n                    if (gBattleMons[gEffectBattler].item == ITEM_NONE)\n                    {\n                        gBattlescriptCurrInstr++;\n                    }\n                    else\n                    {\n                        gLastUsedAbility = ABILITY_STICKY_HOLD;\n                        gBattlescriptCurrInstr = BattleScript_StickyHoldActivates;\n                        RecordAbilityBattle(gEffectBattler, ABILITY_STICKY_HOLD);\n                    }\n                    break;\n                }\n                if (gBattleMons[gEffectBattler].item)\n                {\n                    side = GetBattlerSide(gEffectBattler);\n\n                    gLastUsedItem = gBattleMons[gEffectBattler].item;\n                    gBattleMons[gEffectBattler].item = ITEM_NONE;\n                    gWishFutureKnock.knockedOffMons[side] |= gBitTable[gBattlerPartyIndexes[gEffectBattler]];\n\n                    BattleScriptPush(gBattlescriptCurrInstr + 1);\n                    gBattlescriptCurrInstr = BattleScript_KnockedOff;\n\n                    *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gEffectBattler]) + 0) = 0;\n                    *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gEffectBattler]) + 1) = 0;\n                }\n                else\n                {\n                    gBattlescriptCurrInstr++;\n                }\n                break;\n            case MOVE_EFFECT_SP_ATK_TWO_DOWN: // Overheat\n                BattleScriptPush(gBattlescriptCurrInstr + 1);\n                gBattlescriptCurrInstr = BattleScript_SAtkDown2;\n                break;\n            }\n        }\n    }\n}\n\nstatic void Cmd_seteffectwithchance(void)\n{\n    u32 percentChance;\n\n    if (gBattleMons[gBattlerAttacker].ability == ABILITY_SERENE_GRACE)\n        percentChance = gBattleMoves[gCurrentMove].secondaryEffectChance * 2;\n    else\n        percentChance = gBattleMoves[gCurrentMove].secondaryEffectChance;\n\n    if (gBattleCommunication[MOVE_EFFECT_BYTE] & MOVE_EFFECT_CERTAIN\n        && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))\n    {\n        gBattleCommunication[MOVE_EFFECT_BYTE] &= ~MOVE_EFFECT_CERTAIN;\n        SetMoveEffect(FALSE, MOVE_EFFECT_CERTAIN);\n    }\n    else if (Random() % 100 <= percentChance\n             && gBattleCommunication[MOVE_EFFECT_BYTE]\n             && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))\n    {\n        if (percentChance >= 100)\n            SetMoveEffect(FALSE, MOVE_EFFECT_CERTAIN);\n        else\n            SetMoveEffect(FALSE, 0);\n    }\n    else\n    {\n        gBattlescriptCurrInstr++;\n    }\n\n    gBattleCommunication[MOVE_EFFECT_BYTE] = 0;\n    gBattleScripting.multihitMoveEffect = 0;\n}\n\nstatic void Cmd_seteffectprimary(void)\n{\n    SetMoveEffect(TRUE, 0);\n}\n\nstatic void Cmd_seteffectsecondary(void)\n{\n    SetMoveEffect(FALSE, 0);\n}\n\nstatic void Cmd_clearstatusfromeffect(void)\n{\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n    if (gBattleCommunication[MOVE_EFFECT_BYTE] <= PRIMARY_STATUS_MOVE_EFFECT)\n        gBattleMons[gActiveBattler].status1 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]);\n    else\n        gBattleMons[gActiveBattler].status2 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]);\n\n    gBattleCommunication[MOVE_EFFECT_BYTE] = 0;\n    gBattlescriptCurrInstr += 2;\n    gBattleScripting.multihitMoveEffect = 0;\n}\n\nstatic void Cmd_tryfaintmon(void)\n{\n    const u8 *BS_ptr;\n\n    if (gBattlescriptCurrInstr[2] != 0)\n    {\n        gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n        if (gHitMarker & HITMARKER_FAINTED(gActiveBattler))\n        {\n            BS_ptr = T1_READ_PTR(gBattlescriptCurrInstr + 3);\n\n            BattleScriptPop();\n            gBattlescriptCurrInstr = BS_ptr;\n            gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~SIDE_STATUS_SPIKES_DAMAGED;\n        }\n        else\n        {\n            gBattlescriptCurrInstr += 7;\n        }\n    }\n    else\n    {\n        u8 battlerId;\n\n        if (gBattlescriptCurrInstr[1] == BS_ATTACKER)\n        {\n            gActiveBattler = gBattlerAttacker;\n            battlerId = gBattlerTarget;\n            BS_ptr = BattleScript_FaintAttacker;\n        }\n        else\n        {\n            gActiveBattler = gBattlerTarget;\n            battlerId = gBattlerAttacker;\n            BS_ptr = BattleScript_FaintTarget;\n        }\n        if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])\n         && gBattleMons[gActiveBattler].hp == 0)\n        {\n            gHitMarker |= HITMARKER_FAINTED(gActiveBattler);\n            BattleScriptPush(gBattlescriptCurrInstr + 7);\n            gBattlescriptCurrInstr = BS_ptr;\n            if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n            {\n                gHitMarker |= HITMARKER_PLAYER_FAINTED;\n                if (gBattleResults.playerFaintCounter < 255)\n                    gBattleResults.playerFaintCounter++;\n                AdjustFriendshipOnBattleFaint(gActiveBattler);\n            }\n            else\n            {\n                if (gBattleResults.opponentFaintCounter < 255)\n                    gBattleResults.opponentFaintCounter++;\n                gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);\n                *(u8 *)(&gBattleStruct->lastAttackerToFaintOpponent) = gBattlerAttacker;\n            }\n            if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0)\n            {\n                gHitMarker &= ~HITMARKER_DESTINYBOND;\n                BattleScriptPush(gBattlescriptCurrInstr);\n                gBattleMoveDamage = gBattleMons[battlerId].hp;\n                gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife;\n            }\n            if ((gStatuses3[gBattlerTarget] & STATUS3_GRUDGE)\n             && !(gHitMarker & HITMARKER_GRUDGE)\n             && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)\n             && gBattleMons[gBattlerAttacker].hp != 0\n             && gCurrentMove != MOVE_STRUGGLE)\n            {\n                u8 moveIndex = *(gBattleStruct->chosenMovePositions + gBattlerAttacker);\n\n                gBattleMons[gBattlerAttacker].pp[moveIndex] = 0;\n                BattleScriptPush(gBattlescriptCurrInstr);\n                gBattlescriptCurrInstr = BattleScript_GrudgeTakesPp;\n                gActiveBattler = gBattlerAttacker;\n                BtlController_EmitSetMonData(BUFFER_A, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].pp[moveIndex]), &gBattleMons[gActiveBattler].pp[moveIndex]);\n                MarkBattlerForControllerExec(gActiveBattler);\n\n                PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].moves[moveIndex])\n            }\n        }\n        else\n        {\n            gBattlescriptCurrInstr += 7;\n        }\n    }\n}\n\nstatic void Cmd_dofaintanimation(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n        BtlController_EmitFaintAnimation(BUFFER_A);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr += 2;\n    }\n}\n\nstatic void Cmd_cleareffectsonfaint(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n        gBattleMons[gActiveBattler].status1 = 0;\n        BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1);\n        MarkBattlerForControllerExec(gActiveBattler);\n\n        FaintClearSetData(); // Effects like attractions, trapping, etc.\n        gBattlescriptCurrInstr += 2;\n    }\n}\n\nstatic void Cmd_jumpifstatus(void)\n{\n    u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2);\n    const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6);\n\n    if (gBattleMons[battlerId].status1 & flags && gBattleMons[battlerId].hp != 0)\n        gBattlescriptCurrInstr = jumpPtr;\n    else\n        gBattlescriptCurrInstr += 10;\n}\n\nstatic void Cmd_jumpifstatus2(void)\n{\n    u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2);\n    const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6);\n\n    if (gBattleMons[battlerId].status2 & flags && gBattleMons[battlerId].hp != 0)\n        gBattlescriptCurrInstr = jumpPtr;\n    else\n        gBattlescriptCurrInstr += 10;\n}\n\nstatic void Cmd_jumpifability(void)\n{\n    u8 battlerId;\n    u8 ability = gBattlescriptCurrInstr[2];\n    const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3);\n\n    if (gBattlescriptCurrInstr[1] == BS_ATTACKER_SIDE)\n    {\n        battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_BATTLER_SIDE, gBattlerAttacker, ability, 0, 0);\n        if (battlerId)\n        {\n            gLastUsedAbility = ability;\n            gBattlescriptCurrInstr = jumpPtr;\n            RecordAbilityBattle(battlerId - 1, gLastUsedAbility);\n            gBattleScripting.battlerWithAbility = battlerId - 1;\n        }\n        else\n            gBattlescriptCurrInstr += 7;\n    }\n    else if (gBattlescriptCurrInstr[1] == BS_NOT_ATTACKER_SIDE)\n    {\n        battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBattlerAttacker, ability, 0, 0);\n        if (battlerId)\n        {\n            gLastUsedAbility = ability;\n            gBattlescriptCurrInstr = jumpPtr;\n            RecordAbilityBattle(battlerId - 1, gLastUsedAbility);\n            gBattleScripting.battlerWithAbility = battlerId - 1;\n        }\n        else\n            gBattlescriptCurrInstr += 7;\n    }\n    else\n    {\n        battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n        if (gBattleMons[battlerId].ability == ability)\n        {\n            gLastUsedAbility = ability;\n            gBattlescriptCurrInstr = jumpPtr;\n            RecordAbilityBattle(battlerId, gLastUsedAbility);\n            gBattleScripting.battlerWithAbility = battlerId;\n        }\n        else\n            gBattlescriptCurrInstr += 7;\n    }\n}\n\nstatic void Cmd_jumpifsideaffecting(void)\n{\n    u8 side;\n    u16 flags;\n    const u8 *jumpPtr;\n\n    if (gBattlescriptCurrInstr[1] == BS_ATTACKER)\n        side = GET_BATTLER_SIDE(gBattlerAttacker);\n    else\n        side = GET_BATTLER_SIDE(gBattlerTarget);\n\n    flags = T2_READ_16(gBattlescriptCurrInstr + 2);\n    jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 4);\n\n    if (gSideStatuses[side] & flags)\n        gBattlescriptCurrInstr = jumpPtr;\n    else\n        gBattlescriptCurrInstr += 8;\n}\n\nstatic void Cmd_jumpifstat(void)\n{\n    u8 ret = 0;\n    u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    u8 value = gBattleMons[battlerId].statStages[gBattlescriptCurrInstr[3]];\n\n    switch (gBattlescriptCurrInstr[2])\n    {\n    case CMP_EQUAL:\n        if (value == gBattlescriptCurrInstr[4])\n            ret++;\n        break;\n    case CMP_NOT_EQUAL:\n        if (value != gBattlescriptCurrInstr[4])\n            ret++;\n        break;\n    case CMP_GREATER_THAN:\n        if (value > gBattlescriptCurrInstr[4])\n            ret++;\n        break;\n    case CMP_LESS_THAN:\n        if (value < gBattlescriptCurrInstr[4])\n            ret++;\n        break;\n    case CMP_COMMON_BITS:\n        if (value & gBattlescriptCurrInstr[4])\n            ret++;\n        break;\n    case CMP_NO_COMMON_BITS:\n        if (!(value & gBattlescriptCurrInstr[4]))\n            ret++;\n        break;\n    }\n\n    if (ret)\n        gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 5);\n    else\n        gBattlescriptCurrInstr += 9;\n}\n\nstatic void Cmd_jumpifstatus3condition(void)\n{\n    u32 status;\n    const u8 *jumpPtr;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    status = T2_READ_32(gBattlescriptCurrInstr + 2);\n    jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 7);\n\n    if (gBattlescriptCurrInstr[6])\n    {\n        if ((gStatuses3[gActiveBattler] & status) != 0)\n            gBattlescriptCurrInstr += 11;\n        else\n            gBattlescriptCurrInstr = jumpPtr;\n    }\n    else\n    {\n        if ((gStatuses3[gActiveBattler] & status) != 0)\n            gBattlescriptCurrInstr = jumpPtr;\n        else\n            gBattlescriptCurrInstr += 11;\n    }\n}\n\nstatic void Cmd_jumpiftype(void)\n{\n    u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    u8 type = gBattlescriptCurrInstr[2];\n    const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3);\n\n    if (IS_BATTLER_OF_TYPE(battlerId, type))\n        gBattlescriptCurrInstr = jumpPtr;\n    else\n        gBattlescriptCurrInstr += 7;\n}\n\nstatic void Cmd_getexp(void)\n{\n    u16 item;\n    s32 i; // also used as stringId\n    u8 holdEffect;\n    s32 sentIn;\n    s32 viaExpShare = 0;\n    u16 *exp = &gBattleStruct->expValue;\n\n    gBattlerFainted = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    sentIn = gSentPokesToOpponent[(gBattlerFainted & 2) >> 1];\n\n    switch (gBattleScripting.getexpState)\n    {\n    case 0: // check if should receive exp at all\n        if (GetBattlerSide(gBattlerFainted) != B_SIDE_OPPONENT || (gBattleTypeFlags &\n             (BATTLE_TYPE_LINK\n              | BATTLE_TYPE_TRAINER_TOWER\n              | BATTLE_TYPE_BATTLE_TOWER\n              | BATTLE_TYPE_SAFARI\n              | BATTLE_TYPE_EREADER_TRAINER)))\n        {\n            gBattleScripting.getexpState = 6; // goto last case\n        }\n        else\n        {\n            gBattleScripting.getexpState++;\n            gBattleStruct->givenExpMons |= gBitTable[gBattlerPartyIndexes[gBattlerFainted]];\n        }\n        break;\n    case 1: // calculate experience points to redistribute\n        {\n            u16 calculatedExp;\n            s32 viaSentIn;\n\n            for (viaSentIn = 0, i = 0; i < PARTY_SIZE; i++)\n            {\n                if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0)\n                    continue;\n                if (gBitTable[i] & sentIn)\n                    viaSentIn++;\n\n                item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);\n\n                if (item == ITEM_ENIGMA_BERRY)\n                    holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;\n                else\n                    holdEffect = ItemId_GetHoldEffect(item);\n\n                if (holdEffect == HOLD_EFFECT_EXP_SHARE)\n                    viaExpShare++;\n            }\n\n            calculatedExp = gSpeciesInfo[gBattleMons[gBattlerFainted].species].expYield * gBattleMons[gBattlerFainted].level / 7;\n            switch(gSaveBlock1Ptr->keyFlags.expMod)\n            {\n                case 0:\n                    calculatedExp = 0;\n                    break;\n                case 1:\n                    calculatedExp = calculatedExp / 2;\n                    if(calculatedExp == 0)\n                        calculatedExp = 1;\n                    break;\n                case 3:\n                    calculatedExp = calculatedExp * 2;\n                    break;\n            }\n            if (viaExpShare) // at least one mon is getting exp via exp share\n            {\n                *exp = SAFE_DIV(calculatedExp / 2, viaSentIn);\n                if (*exp == 0)\n                    *exp = 1;\n\n                gExpShareExp = calculatedExp / 2 / viaExpShare;\n                if (gExpShareExp == 0)\n                    gExpShareExp = 1;\n            }\n            else\n            {\n                *exp = SAFE_DIV(calculatedExp, viaSentIn);\n                if (*exp == 0)\n                    *exp = 1;\n                gExpShareExp = 0;\n            }\n\n            gBattleScripting.getexpState++;\n            gBattleStruct->expGetterMonId = 0;\n            gBattleStruct->sentInPokes = sentIn;\n        }\n        // fall through\n    case 2: // set exp value to the poke in expgetter_id and print message\n        if (gBattleControllerExecFlags == 0)\n        {\n            item = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HELD_ITEM);\n\n            if (item == ITEM_ENIGMA_BERRY)\n                holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;\n            else\n                holdEffect = ItemId_GetHoldEffect(item);\n\n            if (holdEffect != HOLD_EFFECT_EXP_SHARE && !(gBattleStruct->sentInPokes & 1))\n            {\n                *(&gBattleStruct->sentInPokes) >>= 1;\n                gBattleScripting.getexpState = 5;\n                gBattleMoveDamage = 0; // used for exp\n            }\n            else if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL) == MAX_LEVEL || gSaveBlock1Ptr->keyFlags.expMod == 0 || FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n            {\n                *(&gBattleStruct->sentInPokes) >>= 1;\n                gBattleScripting.getexpState = 5;\n                gBattleMoveDamage = 0; // used for exp\n\n                if (!FlagGet(FLAG_MASTER_TRAINER_BATTLE) && gSaveBlock1Ptr->keyFlags.expMod == 0)\n                {\n                    MonGainEVs(&gPlayerParty[gBattleStruct->expGetterMonId], gBattleMons[gBattlerFainted].species);\n                }\n            }\n            else\n            {\n                // music change in wild battle after fainting a poke\n                if (!(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_POKEDUDE)) && gBattleMons[0].hp != 0 && !gBattleStruct->wildVictorySong)\n                {\n                    BattleStopLowHpSound();\n                    PlayBGM(MUS_VICTORY_WILD);\n                    gBattleStruct->wildVictorySong++;\n                }\n\n                if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP))\n                {\n                    if (gBattleStruct->sentInPokes & 1)\n                        gBattleMoveDamage = *exp;\n                    else\n                        gBattleMoveDamage = 0;\n\n                    if (holdEffect == HOLD_EFFECT_EXP_SHARE)\n                        gBattleMoveDamage += gExpShareExp;\n                    if (holdEffect == HOLD_EFFECT_LUCKY_EGG)\n                        gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;\n                    if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n                        gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;\n                    if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterMonId])\n                     && !(gBattleTypeFlags & BATTLE_TYPE_POKEDUDE))\n                    {\n                        gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;\n                        i = STRINGID_ABOOSTED;\n                    }\n                    else\n                    {\n                        i = STRINGID_EMPTYSTRING4;\n                    }\n\n                    // get exp getter battlerId\n                    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n                    {\n                        if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && !(gAbsentBattlerFlags & gBitTable[2]))\n                            gBattleStruct->expGetterBattlerId = 2;\n                        else\n                        {\n                            if (!(gAbsentBattlerFlags & gBitTable[0]))\n                                gBattleStruct->expGetterBattlerId = 0;\n                            else\n                                gBattleStruct->expGetterBattlerId = 2;\n                        }\n                    }\n                    else\n                    {\n                        gBattleStruct->expGetterBattlerId = 0;\n                    }\n\n                    PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattleStruct->expGetterBattlerId, gBattleStruct->expGetterMonId);\n                    // buffer 'gained' or 'gained a boosted'\n                    PREPARE_STRING_BUFFER(gBattleTextBuff2, i);\n                    PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff3, 5, gBattleMoveDamage);\n\n                    PrepareStringBattle(STRINGID_PKMNGAINEDEXP, gBattleStruct->expGetterBattlerId);\n                    MonGainEVs(&gPlayerParty[gBattleStruct->expGetterMonId], gBattleMons[gBattlerFainted].species);\n                }\n                gBattleStruct->sentInPokes >>= 1;\n                gBattleScripting.getexpState++;\n            }\n        }\n        break;\n    case 3: // Set stats and give exp\n        if (gBattleControllerExecFlags == 0)\n        {\n            gBattleBufferB[gBattleStruct->expGetterBattlerId][0] = 0;\n            if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP) && GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL) != MAX_LEVEL)\n            {\n                gBattleResources->beforeLvlUp->stats[STAT_HP]    = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP);\n                gBattleResources->beforeLvlUp->stats[STAT_ATK]   = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK);\n                gBattleResources->beforeLvlUp->stats[STAT_DEF]   = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF);\n                gBattleResources->beforeLvlUp->stats[STAT_SPEED] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);\n                gBattleResources->beforeLvlUp->stats[STAT_SPATK] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK);\n                gBattleResources->beforeLvlUp->stats[STAT_SPDEF] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF);\n\n                gActiveBattler = gBattleStruct->expGetterBattlerId;\n                BtlController_EmitExpUpdate(BUFFER_A, gBattleStruct->expGetterMonId, gBattleMoveDamage);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n            gBattleScripting.getexpState++;\n        }\n        break;\n    case 4: // lvl up if necessary\n        if (gBattleControllerExecFlags == 0)\n        {\n            gActiveBattler = gBattleStruct->expGetterBattlerId;\n            if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELED_UP)\n            {\n                if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId)\n                    HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);\n\n                PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattleStruct->expGetterMonId);\n                PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL));\n\n                BattleScriptPushCursor();\n                gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterMonId];\n                gBattlescriptCurrInstr = BattleScript_LevelUp;\n                gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8));\n                AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterMonId], FRIENDSHIP_EVENT_GROW_LEVEL);\n\n                // update battle mon structure after level up\n                if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId && gBattleMons[0].hp)\n                {\n                    gBattleMons[0].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL);\n                    gBattleMons[0].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP);\n                    gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP);\n                    gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK);\n                    gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF);\n                    // Speed is duplicated, likely due to a copy-paste error.\n                    gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);\n                    gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);\n                    gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK);\n                    gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF);\n                }\n                // What is else if?\n                if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))\n                {\n                    gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL);\n                    gBattleMons[2].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP);\n                    gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP);\n                    gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK);\n                    gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF);\n                    gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);\n                    // Speed is duplicated again, but Special Defense is missing.\n#ifdef BUGFIX\n                    gBattleMons[2].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF);\n#else\n                    gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);\n#endif\n                    gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK);\n                }\n                gBattleScripting.getexpState = 5;\n            }\n            else\n            {\n                gBattleMoveDamage = 0;\n                gBattleScripting.getexpState = 5;\n            }\n        }\n        break;\n    case 5: // looper increment\n        if (gBattleMoveDamage) // there is exp to give, goto case 3 that gives exp\n        {\n            gBattleScripting.getexpState = 3;\n        }\n        else\n        {\n            gBattleStruct->expGetterMonId++;\n            if (gBattleStruct->expGetterMonId < PARTY_SIZE)\n                gBattleScripting.getexpState = 2; // loop again\n            else\n                gBattleScripting.getexpState = 6; // we're done\n        }\n        break;\n    case 6: // increment instruction\n        if (gBattleControllerExecFlags == 0)\n        {\n            // not sure why gf clears the item and ability here\n            gBattleMons[gBattlerFainted].item = ITEM_NONE;\n            gBattleMons[gBattlerFainted].ability = ABILITY_NONE;\n            gBattlescriptCurrInstr += 2;\n        }\n        break;\n    }\n}\n\n// For battles that aren't BATTLE_TYPE_LINK, the only thing this\n// command does is check whether the player has won/lost by totaling each team's HP. It then\n// sets gBattleOutcome accordingly, if necessary.\nstatic void Cmd_checkteamslost(void)\n{\n    u16 HP_count = 0;\n    s32 i;\n\n    if (gBattleControllerExecFlags)\n        return;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))\n        {\n            HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP);\n        }\n    }\n    if (HP_count == 0)\n        gBattleOutcome |= B_OUTCOME_LOST;\n    HP_count = 0;\n\n    // Get total HP for the enemy's party to determine if the player has won\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG))\n        {\n            HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP);\n        }\n    }\n    if (HP_count == 0)\n        gBattleOutcome |= B_OUTCOME_WON;\n\n    // For link battles that haven't ended, count number of empty battler spots\n    // In link multi battles, jump to pointer if more than 1 spot empty\n    // In non-multi battles, jump to pointer if 1 spot is missing on both sides\n    if (gBattleOutcome == 0 && (gBattleTypeFlags & BATTLE_TYPE_LINK))\n    {\n        s32 emptyPlayerSpots;\n        s32 emptyOpponentSpots;\n\n        for (emptyPlayerSpots = 0, i = 0; i < gBattlersCount; i += 2)\n        {\n            u32 *ptr = &gHitMarker;\n            u32 hitMarkerUnk = 0x10000000;\n            \n            i++;\n            --i;\n            if ((hitMarkerUnk << i) & *ptr && !gSpecialStatuses[i].faintedHasReplacement)\n                emptyPlayerSpots++;\n        }\n        for (emptyOpponentSpots = 0, i = 1; i < gBattlersCount; i += 2)\n        {\n            u32 *ptr = &gHitMarker;\n            u32 hitMarkerUnk = 0x10000000;\n            \n            {\n                u8 match;\n\n                ++match;\n                --match;\n            }\n            if ((hitMarkerUnk << i) & *ptr && !gSpecialStatuses[i].faintedHasReplacement)\n                emptyOpponentSpots++;\n        }\n\n        if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n        {\n            if (emptyOpponentSpots + emptyPlayerSpots > 1)\n                gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n            else\n                gBattlescriptCurrInstr += 5;\n        }\n        else\n        {\n            if (emptyOpponentSpots != 0 && emptyPlayerSpots != 0)\n                gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n            else\n                gBattlescriptCurrInstr += 5;\n        }\n    }\n    else\n    {\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void MoveValuesCleanUp(void)\n{\n    gMoveResultFlags = 0;\n    gBattleScripting.dmgMultiplier = 1;\n    gCritMultiplier = 1;\n    gBattleCommunication[MOVE_EFFECT_BYTE] = 0;\n    gBattleCommunication[MISS_TYPE] = 0;\n    gHitMarker &= ~HITMARKER_DESTINYBOND;\n    gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT;\n}\n\nstatic void Cmd_movevaluescleanup(void)\n{\n    MoveValuesCleanUp();\n    gBattlescriptCurrInstr += 1;\n}\n\nstatic void Cmd_setmultihit(void)\n{\n    gMultiHitCounter = gBattlescriptCurrInstr[1];\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_decrementmultihit(void)\n{\n    if (--gMultiHitCounter == 0)\n        gBattlescriptCurrInstr += 5;\n    else\n        gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n}\n\nstatic void Cmd_goto(void)\n{\n    gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n}\n\nstatic void Cmd_jumpifbyte(void)\n{\n    u8 caseID = gBattlescriptCurrInstr[1];\n    const u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 2);\n    u8 value = gBattlescriptCurrInstr[6];\n    const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 7);\n\n    gBattlescriptCurrInstr += 11;\n\n    switch (caseID)\n    {\n    case CMP_EQUAL:\n        if (*memByte == value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_NOT_EQUAL:\n        if (*memByte != value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_GREATER_THAN:\n        if (*memByte > value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_LESS_THAN:\n        if (*memByte < value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_COMMON_BITS:\n        if (*memByte & value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_NO_COMMON_BITS:\n        if (!(*memByte & value))\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    }\n}\n\nstatic void Cmd_jumpifhalfword(void)\n{\n    u8 caseID = gBattlescriptCurrInstr[1];\n    const u16 *memHword = T2_READ_PTR(gBattlescriptCurrInstr + 2);\n    u16 value = T2_READ_16(gBattlescriptCurrInstr + 6);\n    const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 8);\n\n    gBattlescriptCurrInstr += 12;\n\n    switch (caseID)\n    {\n    case CMP_EQUAL:\n        if (*memHword == value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_NOT_EQUAL:\n        if (*memHword != value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_GREATER_THAN:\n        if (*memHword > value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_LESS_THAN:\n        if (*memHword < value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_COMMON_BITS:\n        if (*memHword & value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_NO_COMMON_BITS:\n        if (!(*memHword & value))\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    }\n}\n\nstatic void Cmd_jumpifword(void)\n{\n    u8 caseID = gBattlescriptCurrInstr[1];\n    const u32 *memWord = T2_READ_PTR(gBattlescriptCurrInstr + 2);\n    u32 value = T1_READ_32(gBattlescriptCurrInstr + 6);\n    const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10);\n\n    gBattlescriptCurrInstr += 14;\n\n    switch (caseID)\n    {\n    case CMP_EQUAL:\n        if (*memWord == value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_NOT_EQUAL:\n        if (*memWord != value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_GREATER_THAN:\n        if (*memWord > value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_LESS_THAN:\n        if (*memWord < value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_COMMON_BITS:\n        if (*memWord & value)\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    case CMP_NO_COMMON_BITS:\n        if (!(*memWord & value))\n            gBattlescriptCurrInstr = jumpPtr;\n        break;\n    }\n}\n\nstatic void Cmd_jumpifarrayequal(void)\n{\n    const u8 *mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    const u8 *mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5);\n    u32 size = gBattlescriptCurrInstr[9];\n    const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10);\n\n    u32 i;\n    for (i = 0; i < size; i++)\n    {\n        if (*mem1 != *mem2)\n        {\n            gBattlescriptCurrInstr += 14;\n            break;\n        }\n        mem1++, mem2++;\n    }\n\n    if (i == size)\n        gBattlescriptCurrInstr = jumpPtr;\n}\n\nstatic void Cmd_jumpifarraynotequal(void)\n{\n    u8 equalBytes = 0;\n    const u8 *mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    const u8 *mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5);\n    u32 size = gBattlescriptCurrInstr[9];\n    const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10);\n    u32 i;\n\n    for (i = 0; i < size; i++)\n    {\n        if (*mem1 == *mem2)\n            equalBytes++;\n        mem1++, mem2++;\n    }\n\n    if (equalBytes != size)\n        gBattlescriptCurrInstr = jumpPtr;\n    else\n        gBattlescriptCurrInstr += 14;\n}\n\nstatic void Cmd_setbyte(void)\n{\n    u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    *memByte = gBattlescriptCurrInstr[5];\n\n    gBattlescriptCurrInstr += 6;\n}\n\nstatic void Cmd_addbyte(void)\n{\n    u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    *memByte += gBattlescriptCurrInstr[5];\n    gBattlescriptCurrInstr += 6;\n}\n\nstatic void Cmd_subbyte(void)\n{\n    u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    *memByte -= gBattlescriptCurrInstr[5];\n    gBattlescriptCurrInstr += 6;\n}\n\nstatic void Cmd_copyarray(void)\n{\n    u8 *dest = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    const u8 *src = T2_READ_PTR(gBattlescriptCurrInstr + 5);\n    s32 size = gBattlescriptCurrInstr[9];\n\n    s32 i;\n    for (i = 0; i < size; i++)\n        dest[i] = src[i];\n\n    gBattlescriptCurrInstr += 10;\n}\n\nstatic void Cmd_copyarraywithindex(void)\n{\n    u8 *dest = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    const u8 *src = T2_READ_PTR(gBattlescriptCurrInstr + 5);\n    const u8 *index = T2_READ_PTR(gBattlescriptCurrInstr + 9);\n    s32 size = gBattlescriptCurrInstr[13];\n\n    s32 i;\n    for (i = 0; i < size; i++)\n        dest[i] = src[i + *index];\n\n    gBattlescriptCurrInstr += 14;\n}\n\nstatic void Cmd_orbyte(void)\n{\n    u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    *memByte |= gBattlescriptCurrInstr[5];\n    gBattlescriptCurrInstr += 6;\n}\n\nstatic void Cmd_orhalfword(void)\n{\n    u16 *memHword = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    u16 val = T2_READ_16(gBattlescriptCurrInstr + 5);\n\n    *memHword |= val;\n    gBattlescriptCurrInstr += 7;\n}\n\nstatic void Cmd_orword(void)\n{\n    u32 *memWord = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    u32 val = T2_READ_32(gBattlescriptCurrInstr + 5);\n\n    *memWord |= val;\n    gBattlescriptCurrInstr += 9;\n}\n\nstatic void Cmd_bicbyte(void)\n{\n    u8 *memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    *memByte &= ~(gBattlescriptCurrInstr[5]);\n    gBattlescriptCurrInstr += 6;\n}\n\nstatic void Cmd_bichalfword(void)\n{\n    u16 *memHword = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    u16 val = T2_READ_16(gBattlescriptCurrInstr + 5);\n\n    *memHword &= ~val;\n    gBattlescriptCurrInstr += 7;\n}\n\nstatic void Cmd_bicword(void)\n{\n    u32 *memWord = T2_READ_PTR(gBattlescriptCurrInstr + 1);\n    u32 val = T2_READ_32(gBattlescriptCurrInstr + 5);\n\n    *memWord &= ~val;\n    gBattlescriptCurrInstr += 9;\n}\n\nstatic void Cmd_pause(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        u16 value = T2_READ_16(gBattlescriptCurrInstr + 1);\n        bool32 isGhostPause = FALSE;\n\n        if(value == B_WAIT_TIME_SHORT_UNSKIPPABLE)\n        {\n            isGhostPause = TRUE;\n            value = B_WAIT_TIME_SHORT;\n        }\n                                                                                         // can't skip Ghost revealed pause\n        if (++gPauseCounterBattle >= value || (gSaveBlock2Ptr->optionsBattleSceneOff  && !isGhostPause && (JOY_NEW(A_BUTTON | B_BUTTON))))\n        {\n            gPauseCounterBattle = 0;\n            gBattlescriptCurrInstr += 3;\n        }\n    }\n}\n\nstatic void Cmd_waitstate(void)\n{\n    if (gBattleControllerExecFlags == 0)\n        gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_healthbar_update(void)\n{\n    if (gBattlescriptCurrInstr[1] == BS_TARGET)\n        gActiveBattler = gBattlerTarget;\n    else\n        gActiveBattler = gBattlerAttacker;\n\n    BtlController_EmitHealthBarUpdate(BUFFER_A, gBattleMoveDamage);\n    MarkBattlerForControllerExec(gActiveBattler);\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_return(void)\n{\n    BattleScriptPop();\n}\n\nstatic void Cmd_end(void)\n{\n    gMoveResultFlags = 0;\n    gActiveBattler = 0;\n    gCurrentActionFuncId = B_ACTION_TRY_FINISH;\n}\n\nstatic void Cmd_end2(void)\n{\n    gActiveBattler = 0;\n    gCurrentActionFuncId = B_ACTION_TRY_FINISH;\n}\n\n// Pops the main function stack\nstatic void Cmd_end3(void)\n{\n    BattleScriptPop();\n    if (gBattleResources->battleCallbackStack->size != 0)\n        gBattleResources->battleCallbackStack->size--;\n    gBattleMainFunc = gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size];\n}\n\nstatic void Cmd_call(void)\n{\n    BattleScriptPush(gBattlescriptCurrInstr + 5);\n    gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n}\n\nstatic void Cmd_jumpiftype2(void)\n{\n    u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n    if (gBattlescriptCurrInstr[2] == gBattleMons[battlerId].type1 || gBattlescriptCurrInstr[2] == gBattleMons[battlerId].type2)\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);\n    else\n        gBattlescriptCurrInstr += 7;\n}\n\nstatic void Cmd_jumpifabilitypresent(void)\n{\n    if (AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, gBattlescriptCurrInstr[1], 0, 0))\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);\n    else\n        gBattlescriptCurrInstr += 6;\n}\n\nstatic void Cmd_endselectionscript(void)\n{\n    *(gBattlerAttacker + gBattleStruct->selectionScriptFinished) = TRUE;\n}\n\nstatic void Cmd_playanimation(void)\n{\n    const u16 *argumentPtr;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    argumentPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3);\n\n    if (gBattlescriptCurrInstr[2] == B_ANIM_STATS_CHANGE\n     || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE\n     || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE\n     || gBattlescriptCurrInstr[2] == B_ANIM_SILPH_SCOPED)\n    {\n        BtlController_EmitBattleAnimation(BUFFER_A, gBattlescriptCurrInstr[2], *argumentPtr);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr += 7;\n    }\n    else if (gHitMarker & HITMARKER_NO_ANIMATIONS)\n    {\n        BattleScriptPush(gBattlescriptCurrInstr + 7);\n        gBattlescriptCurrInstr = BattleScript_Pausex20;\n    }\n    else if (gBattlescriptCurrInstr[2] == B_ANIM_RAIN_CONTINUES\n          || gBattlescriptCurrInstr[2] == B_ANIM_SUN_CONTINUES\n          || gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES\n          || gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES)\n    {\n        BtlController_EmitBattleAnimation(BUFFER_A, gBattlescriptCurrInstr[2], *argumentPtr);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr += 7;\n    }\n    else if (gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE)\n    {\n        gBattlescriptCurrInstr += 7;\n    }\n    else\n    {\n        BtlController_EmitBattleAnimation(BUFFER_A, gBattlescriptCurrInstr[2], *argumentPtr);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr += 7;\n    }\n}\n\n// Same as playanimation, except it takes a pointer to some animation id, instead of taking the value directly\nstatic void Cmd_playanimation_var(void)\n{\n    const u16 *argumentPtr;\n    const u8 *animationIdPtr;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    animationIdPtr = T2_READ_PTR(gBattlescriptCurrInstr + 2);\n    argumentPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6);\n\n    if (*animationIdPtr == B_ANIM_STATS_CHANGE\n     || *animationIdPtr == B_ANIM_SNATCH_MOVE\n     || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE)\n    {\n        BtlController_EmitBattleAnimation(BUFFER_A, *animationIdPtr, *argumentPtr);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr += 10;\n    }\n    else if (gHitMarker & HITMARKER_NO_ANIMATIONS)\n    {\n        gBattlescriptCurrInstr += 10;\n    }\n    else if (*animationIdPtr == B_ANIM_RAIN_CONTINUES\n          || *animationIdPtr == B_ANIM_SUN_CONTINUES\n          || *animationIdPtr == B_ANIM_SANDSTORM_CONTINUES\n          || *animationIdPtr == B_ANIM_HAIL_CONTINUES)\n    {\n        BtlController_EmitBattleAnimation(BUFFER_A, *animationIdPtr, *argumentPtr);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr += 10;\n    }\n    else if (gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE)\n    {\n        gBattlescriptCurrInstr += 10;\n    }\n    else\n    {\n        BtlController_EmitBattleAnimation(BUFFER_A, *animationIdPtr, *argumentPtr);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr += 10;\n    }\n}\n\nstatic void Cmd_setgraphicalstatchangevalues(void)\n{\n    u8 value = 0;\n    switch (GET_STAT_BUFF_VALUE2(gBattleScripting.statChanger))\n    {\n    case SET_STAT_BUFF_VALUE(1): // +1\n        value = STAT_ANIM_PLUS1;\n        break;\n    case SET_STAT_BUFF_VALUE(2): // +2\n        value = STAT_ANIM_PLUS2;\n        break;\n    case SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE: // -1\n        value = STAT_ANIM_MINUS1;\n        break;\n    case SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE: // -2\n        value = STAT_ANIM_MINUS2;\n        break;\n    }\n    gBattleScripting.animArg1 = GET_STAT_BUFF_ID(gBattleScripting.statChanger) + value - 1;\n    gBattleScripting.animArg2 = 0;\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_playstatchangeanimation(void)\n{\n    u32 currStat = 0;\n    u16 statAnimId = 0;\n    s32 changeableStatsCount = 0;\n    u8 statsToCheck = 0;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    statsToCheck = gBattlescriptCurrInstr[2];\n\n    if (gBattlescriptCurrInstr[3] & STAT_CHANGE_NEGATIVE) // goes down\n    {\n        s16 startingStatAnimId;\n        if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO)\n            startingStatAnimId = STAT_ANIM_MINUS2 - 1;\n        else\n            startingStatAnimId = STAT_ANIM_MINUS1 - 1;\n\n        while (statsToCheck != 0)\n        {\n            if (statsToCheck & 1)\n            {\n                if (gBattlescriptCurrInstr[3] & STAT_CHANGE_CANT_PREVENT)\n                {\n                    if (gBattleMons[gActiveBattler].statStages[currStat] > MIN_STAT_STAGE)\n                    {\n                        statAnimId = startingStatAnimId + currStat;\n                        changeableStatsCount++;\n                    }\n                }\n                else if (!gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer\n                        && gBattleMons[gActiveBattler].ability != ABILITY_CLEAR_BODY\n                        && gBattleMons[gActiveBattler].ability != ABILITY_WHITE_SMOKE\n                        && !(gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE && currStat == STAT_ACC)\n                        && !(gBattleMons[gActiveBattler].ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK))\n                {\n                    if (gBattleMons[gActiveBattler].statStages[currStat] > MIN_STAT_STAGE)\n                    {\n                        statAnimId = startingStatAnimId + currStat;\n                        changeableStatsCount++;\n                    }\n                }\n            }\n            statsToCheck >>= 1, currStat++;\n        }\n\n        if (changeableStatsCount > 1) // more than one stat, so the color is gray\n        {\n            if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO)\n                statAnimId = STAT_ANIM_MULTIPLE_MINUS2;\n            else\n                statAnimId = STAT_ANIM_MULTIPLE_MINUS1;\n        }\n    }\n    else // goes up\n    {\n        s16 startingStatAnimId;\n        if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO)\n            startingStatAnimId = STAT_ANIM_PLUS2 - 1;\n        else\n            startingStatAnimId = STAT_ANIM_PLUS1 - 1;\n\n        while (statsToCheck != 0)\n        {\n            if (statsToCheck & 1 && gBattleMons[gActiveBattler].statStages[currStat] < MAX_STAT_STAGE)\n            {\n                statAnimId = startingStatAnimId + currStat;\n                changeableStatsCount++;\n            }\n            statsToCheck >>= 1, currStat++;\n        }\n\n        if (changeableStatsCount > 1) // more than one stat, so the color is gray\n        {\n            if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO)\n                statAnimId = STAT_ANIM_MULTIPLE_PLUS2;\n            else\n                statAnimId = STAT_ANIM_MULTIPLE_PLUS1;\n        }\n    }\n\n    if (gBattlescriptCurrInstr[3] & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount < 2)\n    {\n        gBattlescriptCurrInstr += 4;\n    }\n    else if (changeableStatsCount != 0 && !gBattleScripting.statAnimPlayed)\n    {\n        BtlController_EmitBattleAnimation(BUFFER_A, B_ANIM_STATS_CHANGE, statAnimId);\n        MarkBattlerForControllerExec(gActiveBattler);\n        if (gBattlescriptCurrInstr[3] & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount > 1)\n            gBattleScripting.statAnimPlayed = TRUE;\n        gBattlescriptCurrInstr += 4;\n    }\n    else\n    {\n        gBattlescriptCurrInstr += 4;\n    }\n}\n\nstatic void Cmd_moveend(void)\n{\n    s32 i;\n    bool32 effect = FALSE;\n    u8 moveType = 0;\n    u8 holdEffectAtk = 0;\n    u16 *choicedMoveAtk = NULL;\n    u8 endMode, endState;\n    u16 originallyUsedMove;\n\n    if (gChosenMove == MOVE_UNAVAILABLE)\n        originallyUsedMove = MOVE_NONE;\n    else\n        originallyUsedMove = gChosenMove;\n\n    endMode = gBattlescriptCurrInstr[1];\n    endState = gBattlescriptCurrInstr[2];\n\n    if (gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY)\n        holdEffectAtk = gEnigmaBerries[gBattlerAttacker].holdEffect;\n    else\n        holdEffectAtk = ItemId_GetHoldEffect(gBattleMons[gBattlerAttacker].item);\n\n    choicedMoveAtk = &gBattleStruct->choicedMove[gBattlerAttacker];\n    GET_MOVE_TYPE(gCurrentMove, moveType);\n\n    do\n    {\n        switch (gBattleScripting.moveendState)\n        {\n        case MOVEEND_RAGE: // rage check\n            if (gBattleMons[gBattlerTarget].status2 & STATUS2_RAGE\n                && gBattleMons[gBattlerTarget].hp != 0\n                && gBattlerAttacker != gBattlerTarget\n                && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)\n                && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n                && TARGET_TURN_DAMAGED\n                && gBattleMoves[gCurrentMove].power != 0\n                && gBattleMons[gBattlerTarget].statStages[STAT_ATK] < MAX_STAT_STAGE)\n            {\n                gBattleMons[gBattlerTarget].statStages[STAT_ATK]++;\n                BattleScriptPushCursor();\n                gBattlescriptCurrInstr = BattleScript_RageIsBuilding;\n                effect = TRUE;\n            }\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_DEFROST: // defrosting check\n            if (gBattleMons[gBattlerTarget].status1 & STATUS1_FREEZE\n                && gBattleMons[gBattlerTarget].hp != 0\n                && gBattlerAttacker != gBattlerTarget\n                && gSpecialStatuses[gBattlerTarget].specialDmg\n                && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n                && moveType == TYPE_FIRE)\n            {\n                gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE;\n                gActiveBattler = gBattlerTarget;\n                BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1);\n                MarkBattlerForControllerExec(gActiveBattler);\n                BattleScriptPushCursor();\n                gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove;\n                effect = TRUE;\n            }\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_SYNCHRONIZE_TARGET: // target synchronize\n            if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBattlerTarget, 0, 0, 0))\n                effect = TRUE;\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_ON_DAMAGE_ABILITIES: // Such as abilities activating on contact (Effect Spore, Rough Skin, etc.).\n            if (AbilityBattleEffects(ABILITYEFFECT_ON_DAMAGE, gBattlerTarget, 0, 0, 0))\n                effect = TRUE;\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_IMMUNITY_ABILITIES: // status immunities\n            if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0))\n                effect = TRUE; // it loops through all battlers, so we increment after its done with all battlers\n            else\n                gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_SYNCHRONIZE_ATTACKER: // attacker synchronize\n            if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBattlerAttacker, 0, 0, 0))\n                effect = TRUE;\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_CHOICE_MOVE: // update choice band move\n            if (gHitMarker & HITMARKER_OBEYS\n             && holdEffectAtk == HOLD_EFFECT_CHOICE_BAND\n             && gChosenMove != MOVE_STRUGGLE\n             && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE))\n            {\n                if (gChosenMove == MOVE_BATON_PASS && !(gMoveResultFlags & MOVE_RESULT_FAILED))\n                {\n                    gBattleScripting.moveendState++;\n                    break;\n                }\n                *choicedMoveAtk = gChosenMove;\n            }\n            for (i = 0; i < MAX_MON_MOVES; i++)\n            {\n                if (gBattleMons[gBattlerAttacker].moves[i] == *choicedMoveAtk)\n                    break;\n            }\n            if (i == MAX_MON_MOVES)\n                *choicedMoveAtk = MOVE_NONE;\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_CHANGED_ITEMS: // changed held items\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                u16 *changedItem = &gBattleStruct->changedItems[i];\n                if (*changedItem != ITEM_NONE)\n                {\n                    gBattleMons[i].item = *changedItem;\n                    *changedItem = ITEM_NONE;\n                }\n            }\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_ITEM_EFFECTS_ALL: // item effects for all battlers\n            if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0, FALSE))\n                effect = TRUE;\n            else\n                gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_KINGSROCK_SHELLBELL: // king's rock and shell bell\n            if (ItemBattleEffects(ITEMEFFECT_KINGSROCK_SHELLBELL, 0, FALSE))\n                effect = TRUE;\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_ATTACKER_INVISIBLE: // make attacker sprite invisible\n            if (gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE)\n                && gHitMarker & HITMARKER_NO_ANIMATIONS)\n            {\n                gActiveBattler = gBattlerAttacker;\n                BtlController_EmitSpriteInvisibility(BUFFER_A, TRUE);\n                MarkBattlerForControllerExec(gActiveBattler);\n                gBattleScripting.moveendState++;\n                return;\n            }\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_ATTACKER_VISIBLE: // make attacker sprite visible\n            if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT\n                || !(gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE))\n                || WasUnableToUseMove(gBattlerAttacker))\n            {\n                gActiveBattler = gBattlerAttacker;\n                BtlController_EmitSpriteInvisibility(BUFFER_A, FALSE);\n                MarkBattlerForControllerExec(gActiveBattler);\n                gStatuses3[gBattlerAttacker] &= ~STATUS3_SEMI_INVULNERABLE;\n                gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = 1;\n                gBattleScripting.moveendState++;\n                return;\n            }\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_TARGET_VISIBLE: // make target sprite visible\n            if (!gSpecialStatuses[gBattlerTarget].restoredBattlerSprite && gBattlerTarget < gBattlersCount\n                && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE))\n            {\n                gActiveBattler = gBattlerTarget;\n                BtlController_EmitSpriteInvisibility(BUFFER_A, FALSE);\n                MarkBattlerForControllerExec(gActiveBattler);\n                gStatuses3[gBattlerTarget] &= ~STATUS3_SEMI_INVULNERABLE;\n                gBattleScripting.moveendState++;\n                return;\n            }\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_SUBSTITUTE: // update substitute\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (gDisableStructs[i].substituteHP == 0)\n                    gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE;\n            }\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_UPDATE_LAST_MOVES:\n            if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET)\n            {\n                gActiveBattler = gBattlerAttacker;\n                gBattlerAttacker = gBattlerTarget;\n                gBattlerTarget = gActiveBattler;\n                gHitMarker &= ~HITMARKER_SWAP_ATTACKER_TARGET;\n            }\n            if (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED)\n            {\n                gLastPrintedMoves[gBattlerAttacker] = gChosenMove;\n            }\n            if (!(gAbsentBattlerFlags & gBitTable[gBattlerAttacker])\n                && !(gBattleStruct->absentBattlerFlags & gBitTable[gBattlerAttacker])\n                && gBattleMoves[originallyUsedMove].effect != EFFECT_BATON_PASS)\n            {\n                if (gHitMarker & HITMARKER_OBEYS)\n                {\n                    gLastMoves[gBattlerAttacker] = gChosenMove;\n                    gLastResultingMoves[gBattlerAttacker] = gCurrentMove;\n                }\n                else\n                {\n                    gLastMoves[gBattlerAttacker] = MOVE_UNAVAILABLE;\n                    gLastResultingMoves[gBattlerAttacker] = MOVE_UNAVAILABLE;\n                }\n\n                if (!(gHitMarker & HITMARKER_FAINTED(gBattlerTarget)))\n                    gLastHitBy[gBattlerTarget] = gBattlerAttacker;\n\n                if (gHitMarker & HITMARKER_OBEYS && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))\n                {\n                    if (gChosenMove == MOVE_UNAVAILABLE)\n                    {\n                        gLastLandedMoves[gBattlerTarget] = gChosenMove;\n                    }\n                    else\n                    {\n                        gLastLandedMoves[gBattlerTarget] = gCurrentMove;\n                        GET_MOVE_TYPE(gCurrentMove, gLastHitByType[gBattlerTarget]);\n                    }\n                }\n                else\n                {\n                    gLastLandedMoves[gBattlerTarget] = MOVE_UNAVAILABLE;\n                }\n            }\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_MIRROR_MOVE: // mirror move\n            if (!(gAbsentBattlerFlags & gBitTable[gBattlerAttacker])\n                && !(gBattleStruct->absentBattlerFlags & gBitTable[gBattlerAttacker])\n                && gBattleMoves[originallyUsedMove].flags & FLAG_MIRROR_MOVE_AFFECTED\n                && gHitMarker & HITMARKER_OBEYS\n                && gBattlerAttacker != gBattlerTarget\n                && !(gHitMarker & HITMARKER_FAINTED(gBattlerTarget))\n                && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))\n            {\n                u8 target, attacker;\n\n                *(gBattleStruct->lastTakenMove + gBattlerTarget * 2 + 0) = gChosenMove;\n                *(gBattleStruct->lastTakenMove + gBattlerTarget * 2 + 1) = gChosenMove >> 8;\n\n                target = gBattlerTarget;\n                attacker = gBattlerAttacker;\n                *(attacker * 2 + target * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 0) = gChosenMove;\n\n                target = gBattlerTarget;\n                attacker = gBattlerAttacker;\n                *(attacker * 2 + target * 8 + (u8 *)(gBattleStruct->lastTakenMoveFrom) + 1) = gChosenMove >> 8;\n            }\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_NEXT_TARGET: // For moves hitting two opposing Pokemon.\n            if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE\n                && !gProtectStructs[gBattlerAttacker].chargingTurn && gBattleMoves[gCurrentMove].target == MOVE_TARGET_BOTH\n                && !(gHitMarker & HITMARKER_NO_ATTACKSTRING))\n            {\n                u8 battlerId = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget)));\n                if (gBattleMons[battlerId].hp != 0)\n                {\n                    gBattlerTarget = battlerId;\n                    gHitMarker |= HITMARKER_NO_ATTACKSTRING;\n                    gBattleScripting.moveendState = 0;\n                    MoveValuesCleanUp();\n                    BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]);\n                    gBattlescriptCurrInstr = BattleScript_FlushMessageBox;\n                    return;\n                }\n                else\n                {\n                    gHitMarker |= HITMARKER_NO_ATTACKSTRING;\n                }\n            }\n            gBattleScripting.moveendState++;\n            break;\n        case MOVEEND_COUNT:\n            break;\n        }\n\n        if (endMode == 1 && effect == FALSE)\n            gBattleScripting.moveendState = MOVEEND_COUNT;\n        if (endMode == 2 && endState == gBattleScripting.moveendState)\n            gBattleScripting.moveendState = MOVEEND_COUNT;\n\n    } while (gBattleScripting.moveendState != MOVEEND_COUNT && effect == FALSE);\n\n    if (gBattleScripting.moveendState == MOVEEND_COUNT && effect == FALSE)\n        gBattlescriptCurrInstr += 3;\n}\n\nstatic void Cmd_typecalc2(void)\n{\n    u8 flags = 0;\n    s32 i = 0;\n    u8 moveType = gBattleMoves[gCurrentMove].type;\n\n    if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)\n    {\n        gLastUsedAbility = gBattleMons[gBattlerTarget].ability;\n        gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE);\n        gLastLandedMoves[gBattlerTarget] = 0;\n        gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS;\n        RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);\n    }\n    else\n    {\n        while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE)\n        {\n            if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT)\n            {\n                if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT)\n                {\n                    break;\n                }\n                else\n                {\n                    i += 3;\n                    continue;\n                }\n            }\n\n            if (TYPE_EFFECT_ATK_TYPE(i) == moveType)\n            {\n                // check type1\n                if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1)\n                {\n                    if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT)\n                    {\n                        gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;\n                        break;\n                    }\n                    if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE)\n                    {\n                        flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;\n                    }\n                    if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE)\n                    {\n                        flags |= MOVE_RESULT_SUPER_EFFECTIVE;\n                    }\n                }\n                // check type2\n                if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2)\n                {\n                    if (gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2\n                        && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT)\n                    {\n                        gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;\n                        break;\n                    }\n                    if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2\n                        && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2\n                        && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE)\n                    {\n                        flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;\n                    }\n                    if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2\n                        && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2\n                        && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE)\n                    {\n                        flags |= MOVE_RESULT_SUPER_EFFECTIVE;\n                    }\n                }\n            }\n            i += 3;\n        }\n    }\n\n    if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD\n        && !(flags & MOVE_RESULT_NO_EFFECT)\n        && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2\n        && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)))\n        && gBattleMoves[gCurrentMove].power)\n    {\n        gLastUsedAbility = ABILITY_WONDER_GUARD;\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gLastLandedMoves[gBattlerTarget] = 0;\n        gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG;\n        RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);\n    }\n    if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)\n        gProtectStructs[gBattlerAttacker].targetNotAffected = 1;\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_returnatktoball(void)\n{\n    gActiveBattler = gBattlerAttacker;\n    if (!(gHitMarker & HITMARKER_FAINTED(gActiveBattler)))\n    {\n        BtlController_EmitReturnMonToBall(BUFFER_A, FALSE);\n        MarkBattlerForControllerExec(gActiveBattler);\n    }\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_getswitchedmondata(void)\n{\n    if (gBattleControllerExecFlags)\n        return;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n    gBattlerPartyIndexes[gActiveBattler] = *(gBattleStruct->monToSwitchIntoId + gActiveBattler);\n\n    BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]]);\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_switchindataupdate(void)\n{\n    struct BattlePokemon oldData;\n    s32 i;\n    u8 *monData;\n\n    if (gBattleControllerExecFlags)\n        return;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    oldData = gBattleMons[gActiveBattler];\n    monData = (u8 *)(&gBattleMons[gActiveBattler]);\n\n    for (i = 0; i < sizeof(struct BattlePokemon); i++)\n        monData[i] = gBattleBufferB[gActiveBattler][4 + i];\n\n    gBattleMons[gActiveBattler].type1 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[0];\n    gBattleMons[gActiveBattler].type2 = gSpeciesInfo[gBattleMons[gActiveBattler].species].types[1];\n    gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum);\n\n    // check knocked off item\n    i = GetBattlerSide(gActiveBattler);\n    if (gWishFutureKnock.knockedOffMons[i] & gBitTable[gBattlerPartyIndexes[gActiveBattler]])\n    {\n        gBattleMons[gActiveBattler].item = ITEM_NONE;\n    }\n\n    if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS)\n    {\n        for (i = 0; i < NUM_BATTLE_STATS; i++)\n        {\n            gBattleMons[gActiveBattler].statStages[i] = oldData.statStages[i];\n        }\n        gBattleMons[gActiveBattler].status2 = oldData.status2;\n    }\n\n    SwitchInClearSetData();\n\n    gBattleScripting.battler = gActiveBattler;\n\n    PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]);\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_switchinanim(void)\n{\n    if (gBattleControllerExecFlags)\n        return;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT\n        && !(gBattleTypeFlags & (BATTLE_TYPE_LINK\n                                 | BATTLE_TYPE_TRAINER_TOWER\n                                 | BATTLE_TYPE_BATTLE_TOWER\n                                 | BATTLE_TYPE_LEGENDARY\n                                 | BATTLE_TYPE_OLD_MAN_TUTORIAL\n                                 | BATTLE_TYPE_POKEDUDE\n                                 | BATTLE_TYPE_EREADER_TRAINER\n                                 | BATTLE_TYPE_GHOST)))\n        HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality);\n\n    gAbsentBattlerFlags &= ~(gBitTable[gActiveBattler]);\n\n    BtlController_EmitSwitchInAnim(BUFFER_A, gBattlerPartyIndexes[gActiveBattler], gBattlescriptCurrInstr[2]);\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 3;\n}\n\nstatic void Cmd_jumpifcantswitch(void)\n{\n    s32 i;\n    s32 lastMonId;\n    struct Pokemon *party;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~SWITCH_IGNORE_ESCAPE_PREVENTION);\n    if (!(gBattlescriptCurrInstr[1] & SWITCH_IGNORE_ESCAPE_PREVENTION)\n        && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))\n            || (gStatuses3[gActiveBattler] & STATUS3_ROOTED)))\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);\n    }\n    else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n    {\n        if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT)\n            party = gEnemyParty;\n        else\n            party = gPlayerParty;\n\n        i = 0;\n        if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gActiveBattler)) == TRUE)\n            i = 3;\n        for (lastMonId = i + 3; i < lastMonId; i++)\n        {\n            if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE\n             && !GetMonData(&party[i], MON_DATA_IS_EGG)\n             && GetMonData(&party[i], MON_DATA_HP) != 0\n             && gBattlerPartyIndexes[gActiveBattler] != i)\n                break;\n        }\n\n        if (i == lastMonId)\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);\n        else\n            gBattlescriptCurrInstr += 6;\n    }\n    else\n    {\n        u8 battlerIn1, battlerIn2;\n\n        if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT)\n        {\n            battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n\n            if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n                battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n            else\n                battlerIn2 = battlerIn1;\n\n            party = gEnemyParty;\n        }\n        else\n        {\n            battlerIn1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n\n            if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n                battlerIn2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);\n            else\n                battlerIn2 = battlerIn1;\n\n            party = gPlayerParty;\n        }\n\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (GetMonData(&party[i], MON_DATA_HP) != 0\n             && GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE\n             && !GetMonData(&party[i], MON_DATA_IS_EGG)\n             && i != gBattlerPartyIndexes[battlerIn1] && i != gBattlerPartyIndexes[battlerIn2])\n                break;\n        }\n\n        if (i == PARTY_SIZE)\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);\n        else\n            gBattlescriptCurrInstr += 6;\n    }\n}\n\n// Opens the party screen to choose a new Pokémon to send out.\n// slotId is the Pokémon to replace.\n// Note that this is not used by the Switch action, only replacing fainted Pokémon or Baton Pass\nstatic void ChooseMonToSendOut(u8 slotId)\n{\n    *(gBattleStruct->battlerPartyIndexes + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler];\n    BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]);\n    MarkBattlerForControllerExec(gActiveBattler);\n}\n\nstatic void Cmd_openpartyscreen(void)\n{\n    u32 flags;\n    u8 hitmarkerFaintBits;\n    u8 battlerId;\n    const u8 *jumpPtr;\n\n    battlerId = 0;\n    flags = 0;\n    jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 2);\n\n    if (gBattlescriptCurrInstr[1] == BS_FAINTED_LINK_MULTIPLE_1)\n    {\n        if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE)\n        {\n            for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n            {\n                if (gHitMarker & HITMARKER_FAINTED(gActiveBattler))\n                {\n                    if (HasNoMonsToSwitch(gActiveBattler, PARTY_SIZE, PARTY_SIZE))\n                    {\n                        gAbsentBattlerFlags |= gBitTable[gActiveBattler];\n                        gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler);\n                        BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY);\n                        MarkBattlerForControllerExec(gActiveBattler);\n                    }\n                    else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement)\n                    {\n                        ChooseMonToSendOut(PARTY_SIZE);\n                        gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE;\n                    }\n                }\n                else\n                {\n                    BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                }\n            }\n        }\n        else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n        {\n            bool8 hasReplacement_0, hasReplacement_1, hasReplacement_2, hasReplacement_3;\n\n            hitmarkerFaintBits = gHitMarker >> 28;\n\n            if (gBitTable[0] & hitmarkerFaintBits)\n            {\n                gActiveBattler = 0;\n                if (HasNoMonsToSwitch(gActiveBattler, PARTY_SIZE, PARTY_SIZE))\n                {\n                    gAbsentBattlerFlags |= gBitTable[gActiveBattler];\n                    gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler);\n                    BtlController_EmitCantSwitch(BUFFER_A);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                }\n                else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement)\n                {\n                    ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[2]);\n                    gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE;\n                }\n                else\n                {\n                    BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                    flags |= 1;\n                }\n            }\n            if (gBitTable[2] & hitmarkerFaintBits && !(gBitTable[0] & hitmarkerFaintBits))\n            {\n                gActiveBattler = 2;\n                if (HasNoMonsToSwitch(gActiveBattler, PARTY_SIZE, PARTY_SIZE))\n                {\n                    gAbsentBattlerFlags |= gBitTable[gActiveBattler];\n                    gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler);\n                    BtlController_EmitCantSwitch(BUFFER_A);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                }\n                else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement)\n                {\n                    ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[0]);\n                    gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE;\n                }\n                else if (!(flags & 1))\n                {\n                    BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                }\n            }\n            if (gBitTable[1] & hitmarkerFaintBits)\n            {\n                gActiveBattler = 1;\n                if (HasNoMonsToSwitch(gActiveBattler, PARTY_SIZE, PARTY_SIZE))\n                {\n                    gAbsentBattlerFlags |= gBitTable[gActiveBattler];\n                    gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler);\n                    BtlController_EmitCantSwitch(BUFFER_A);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                }\n                else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement)\n                {\n                    ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[3]);\n                    gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE;\n                }\n                else\n                {\n                    BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                    flags |= 2;\n                }\n            }\n            if (gBitTable[3] & hitmarkerFaintBits && !(gBitTable[1] & hitmarkerFaintBits))\n            {\n                gActiveBattler = 3;\n                if (HasNoMonsToSwitch(gActiveBattler, PARTY_SIZE, PARTY_SIZE))\n                {\n                    gAbsentBattlerFlags |= gBitTable[gActiveBattler];\n                    gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler);\n                    BtlController_EmitCantSwitch(BUFFER_A);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                }\n                else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement)\n                {\n                    ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[1]);\n                    gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE;\n                }\n                else if (!(flags & 2))\n                {\n                    BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                }\n            }\n\n            hasReplacement_0 = gSpecialStatuses[0].faintedHasReplacement;\n            if (!hasReplacement_0)\n            {\n                hasReplacement_2 = gSpecialStatuses[2].faintedHasReplacement;\n                if (!hasReplacement_2 && hitmarkerFaintBits != 0)\n                {\n                    if (gAbsentBattlerFlags & gBitTable[0])\n                        gActiveBattler = 2;\n                    else\n                        gActiveBattler = 0;\n\n                    BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                }\n\n            }\n            hasReplacement_1 = gSpecialStatuses[1].faintedHasReplacement;\n            if (!hasReplacement_1)\n            {\n                hasReplacement_3 = gSpecialStatuses[3].faintedHasReplacement;\n                if (!hasReplacement_3 && hitmarkerFaintBits != 0)\n                {\n                    if (gAbsentBattlerFlags & gBitTable[1])\n                        gActiveBattler = 3;\n                    else\n                        gActiveBattler = 1;\n\n                    BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                }\n            }\n        }\n        gBattlescriptCurrInstr += 6;\n    }\n    else if (gBattlescriptCurrInstr[1] == BS_FAINTED_LINK_MULTIPLE_2)\n    {\n        if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n            {\n                hitmarkerFaintBits = gHitMarker >> 28;\n                if (gBitTable[2] & hitmarkerFaintBits && gBitTable[0] & hitmarkerFaintBits)\n                {\n                    gActiveBattler = 2;\n                    if (HasNoMonsToSwitch(gActiveBattler, gBattleBufferB[0][1], PARTY_SIZE))\n                    {\n                        gAbsentBattlerFlags |= gBitTable[gActiveBattler];\n                        gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler);\n                        BtlController_EmitCantSwitch(BUFFER_A);\n                        MarkBattlerForControllerExec(gActiveBattler);\n                    }\n                    else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement)\n                    {\n                        ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[0]);\n                        gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE;\n                    }\n                }\n                if (gBitTable[3] & hitmarkerFaintBits && hitmarkerFaintBits & gBitTable[1])\n                {\n                    gActiveBattler = 3;\n                    if (HasNoMonsToSwitch(gActiveBattler, gBattleBufferB[1][1], PARTY_SIZE))\n                    {\n                        gAbsentBattlerFlags |= gBitTable[gActiveBattler];\n                        gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler);\n                        BtlController_EmitCantSwitch(BUFFER_A);\n                        MarkBattlerForControllerExec(gActiveBattler);\n                    }\n                    else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement)\n                    {\n                        ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[1]);\n                        gSpecialStatuses[gActiveBattler].faintedHasReplacement = TRUE;\n                    }\n                }\n                gBattlescriptCurrInstr += 6;\n            }\n            else\n            {\n                // Not multi or double battle\n                gBattlescriptCurrInstr += 6;\n            }\n        }\n        else\n        {\n            // Multi battle\n            gBattlescriptCurrInstr += 6;\n        }\n\n        hitmarkerFaintBits = gHitMarker >> 28;\n\n        gBattlerFainted = 0;\n        while (!(gBitTable[gBattlerFainted] & hitmarkerFaintBits)\n               && gBattlerFainted < gBattlersCount)\n            gBattlerFainted++;\n\n        if (gBattlerFainted == gBattlersCount)\n            gBattlescriptCurrInstr = jumpPtr;\n    }\n    else\n    {\n        if (gBattlescriptCurrInstr[1] & PARTY_SCREEN_OPTIONAL)\n            hitmarkerFaintBits = PARTY_ACTION_CHOOSE_MON; // Used here as the caseId for the EmitChoose function.\n        else\n            hitmarkerFaintBits = PARTY_ACTION_SEND_OUT;\n\n        battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~PARTY_SCREEN_OPTIONAL);\n        if (gSpecialStatuses[battlerId].faintedHasReplacement)\n        {\n            gBattlescriptCurrInstr += 6;\n        }\n        else if (HasNoMonsToSwitch(battlerId, PARTY_SIZE, PARTY_SIZE))\n        {\n            gActiveBattler = battlerId;\n            gAbsentBattlerFlags |= gBitTable[gActiveBattler];\n            gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler);\n            gBattlescriptCurrInstr = jumpPtr;\n        }\n        else\n        {\n            gActiveBattler = battlerId;\n            *(gBattleStruct->battlerPartyIndexes + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler];\n\n            BtlController_EmitChoosePokemon(BUFFER_A, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + (gActiveBattler ^ 2)), 0, gBattleStruct->battlerPartyOrders[gActiveBattler]);\n            MarkBattlerForControllerExec(gActiveBattler);\n\n            gBattlescriptCurrInstr += 6;\n\n            if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT && gBattleResults.playerSwitchesCounter < 255)\n                gBattleResults.playerSwitchesCounter++;\n\n            if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n            {\n                for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)\n                {\n                    if (gActiveBattler != battlerId)\n                    {\n                        BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY);\n                        MarkBattlerForControllerExec(gActiveBattler);\n                    }\n                }\n            }\n            else\n            {\n                gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(battlerId) ^ BIT_SIDE);\n                if (gAbsentBattlerFlags & gBitTable[gActiveBattler])\n                    gActiveBattler ^= BIT_FLANK;\n\n                BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n        }\n    }\n}\n\nstatic void Cmd_switchhandleorder(void)\n{\n    s32 i;\n    if (gBattleControllerExecFlags)\n        return;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n    switch (gBattlescriptCurrInstr[2])\n    {\n    case 0:\n        for (i = 0; i < gBattlersCount; i++)\n        {\n            if (gBattleBufferB[i][0] == CONTROLLER_CHOSENMONRETURNVALUE)\n            {\n                *(gBattleStruct->monToSwitchIntoId + i) = gBattleBufferB[i][1];\n            }\n        }\n        break;\n    case 1:\n        if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n            UpdatePartyOwnerOnSwitch_NonMulti(gActiveBattler);\n        break;\n    case 2:\n        gBattleCommunication[0] = gBattleBufferB[gActiveBattler][1];\n        *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = gBattleBufferB[gActiveBattler][1];\n\n        if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n        {\n            *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) &= 0xF;\n            *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0);\n            *(gActiveBattler * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 1) = gBattleBufferB[gActiveBattler][3];\n\n            *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) &= (0xF0);\n            *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4;\n            *((gActiveBattler ^ BIT_FLANK) * 3 + (u8 *)(gBattleStruct->battlerPartyOrders) + 2) = gBattleBufferB[gActiveBattler][3];\n        }\n        else\n        {\n            UpdatePartyOwnerOnSwitch_NonMulti(gActiveBattler);\n        }\n        PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].species)\n        PREPARE_MON_NICK_BUFFER(gBattleTextBuff2, gActiveBattler, gBattleBufferB[gActiveBattler][1])\n\n        break;\n    }\n\n    gBattlescriptCurrInstr += 3;\n}\n\nstatic void Cmd_switchineffects(void)\n{\n    s32 i;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    UpdateSentPokesToOpponentValue(gActiveBattler);\n\n    gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler);\n    gSpecialStatuses[gActiveBattler].faintedHasReplacement = FALSE;\n\n    if (!(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES_DAMAGED)\n        && (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES)\n        && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING)\n        && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE)\n    {\n        u8 spikesDmg;\n\n        gSideStatuses[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_SPIKES_DAMAGED;\n\n        // Present in pokeemerald but not here\n        // gBattleMons[gActiveBattler].status2 &= ~STATUS2_DESTINY_BOND;\n        // gHitMarker &= ~HITMARKER_DESTINYBOND;\n\n        spikesDmg = (5 - gSideTimers[GetBattlerSide(gActiveBattler)].spikesAmount) * 2;\n        gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (spikesDmg);\n        if (gBattleMoveDamage == 0)\n            gBattleMoveDamage = 1;\n\n        gBattleScripting.battler = gActiveBattler;\n        BattleScriptPushCursor();\n\n        if (gBattlescriptCurrInstr[1] == BS_TARGET)\n            gBattlescriptCurrInstr = BattleScript_SpikesOnTarget;\n        else if (gBattlescriptCurrInstr[1] == BS_ATTACKER)\n            gBattlescriptCurrInstr = BattleScript_SpikesOnAttacker;\n        else\n            gBattlescriptCurrInstr = BattleScript_SpikesOnFaintedBattler;\n    }\n    else\n    {\n        // There is a hack here in pokeemerald to ensure the truant counter will be 0 when the battler's next turn starts.\n        // The truant counter is not updated in the case where a mon switches in after a lost judgement in the battle arena.\n        if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT)\n        //if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT && !gDisableStructs[gActiveBattler].truantSwitchInHack) // In pokeemerald.\n            gDisableStructs[gActiveBattler].truantCounter = 1;\n\n        //gDisableStructs[gActiveBattler].truantSwitchInHack = 0; // In pokeemerald, otherwise unused.\n\n        if (!AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBattler, 0, 0, 0)\n            && !ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gActiveBattler, FALSE))\n        {\n            gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~SIDE_STATUS_SPIKES_DAMAGED;\n\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (gBattlerByTurnOrder[i] == gActiveBattler)\n                    gActionsByTurnOrder[i] = B_ACTION_CANCEL_PARTNER;\n            }\n\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                u16 *hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(i)];\n                *hpOnSwitchout = gBattleMons[i].hp;\n            }\n\n            if (gBattlescriptCurrInstr[1] == BS_FAINTED_LINK_MULTIPLE_1)\n            {\n                u32 hitmarkerFaintBits = gHitMarker >> 28;\n\n                gBattlerFainted++;\n                while (TRUE)\n                {\n                    if (hitmarkerFaintBits & gBitTable[gBattlerFainted] && !(gAbsentBattlerFlags & gBitTable[gBattlerFainted]))\n                        break;\n                    if (gBattlerFainted >= gBattlersCount)\n                        break;\n                    gBattlerFainted++;\n                }\n            }\n            gBattlescriptCurrInstr += 2;\n        }\n    }\n}\n\nstatic void Cmd_trainerslidein(void)\n{\n    if (!gBattlescriptCurrInstr[1])\n        gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n    else\n        gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n    BtlController_EmitTrainerSlide(BUFFER_A);\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_playse(void)\n{\n    gActiveBattler = gBattlerAttacker;\n    BtlController_EmitPlaySE(BUFFER_A, T2_READ_16(gBattlescriptCurrInstr + 1));\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 3;\n}\n\nstatic void Cmd_fanfare(void)\n{\n    gActiveBattler = gBattlerAttacker;\n    BtlController_EmitPlayFanfare(BUFFER_A, T2_READ_16(gBattlescriptCurrInstr + 1));\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 3;\n}\n\nstatic void Cmd_playfaintcry(void)\n{\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    BtlController_EmitFaintingCry(BUFFER_A);\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_endlinkbattle(void)\n{\n    gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n    BtlController_EmitEndLinkBattle(BUFFER_A, gBattleOutcome);\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 1;\n}\n\nstatic void Cmd_returntoball(void)\n{\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    BtlController_EmitReturnMonToBall(BUFFER_A, TRUE);\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_handlelearnnewmove(void)\n{\n    const u8 *learnedMovePtr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    const u8 *nothingToLearnPtr = T1_READ_PTR(gBattlescriptCurrInstr + 5);\n\n    u16 learnMove = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterMonId], gBattlescriptCurrInstr[9]);\n    while (learnMove == MON_ALREADY_KNOWS_MOVE)\n        learnMove = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterMonId], FALSE);\n\n    if (learnMove == MOVE_NONE)\n    {\n        gBattlescriptCurrInstr = nothingToLearnPtr;\n    }\n    else if (learnMove == MON_HAS_MAX_MOVES)\n    {\n        gBattlescriptCurrInstr += 10;\n    }\n    else\n    {\n        gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n\n        if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId\n            && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED))\n        {\n            GiveMoveToBattleMon(&gBattleMons[gActiveBattler], learnMove);\n        }\n        if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n        {\n            gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);\n            if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId\n                && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED))\n            {\n                GiveMoveToBattleMon(&gBattleMons[gActiveBattler], learnMove);\n            }\n        }\n\n        gBattlescriptCurrInstr = learnedMovePtr;\n    }\n}\n\nstatic void Cmd_yesnoboxlearnmove(void)\n{\n    gActiveBattler = 0;\n\n    switch (gBattleScripting.learnMoveState)\n    {\n    case 0:\n        HandleBattleWindow(23, 8, 29, 13, 0);\n        BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO);\n        gBattleScripting.learnMoveState++;\n        gBattleCommunication[CURSOR_POSITION] = 0;\n        BattleCreateYesNoCursorAt();\n        break;\n    case 1:\n        if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0)\n        {\n            PlaySE(SE_SELECT);\n            BattleDestroyYesNoCursorAt();\n            gBattleCommunication[CURSOR_POSITION] = 0;\n            BattleCreateYesNoCursorAt();\n        }\n        if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0)\n        {\n            PlaySE(SE_SELECT);\n            BattleDestroyYesNoCursorAt();\n            gBattleCommunication[CURSOR_POSITION] = 1;\n            BattleCreateYesNoCursorAt();\n        }\n        if (JOY_NEW(A_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            if (gBattleCommunication[1] == 0)\n            {\n                HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR);\n                BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n                gBattleScripting.learnMoveState++;\n            }\n            else\n            {\n                gBattleScripting.learnMoveState = 4;\n            }\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            gBattleScripting.learnMoveState = 4;\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            FreeAllWindowBuffers();\n            ShowSelectMovePokemonSummaryScreen(gPlayerParty, gBattleStruct->expGetterMonId, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn);\n            gBattleScripting.learnMoveState++;\n        }\n        break;\n    case 3:\n        if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2)\n        {\n            u8 movePosition = GetMoveSlotToReplace();\n            if (movePosition == MAX_MON_MOVES)\n            {\n                gBattleScripting.learnMoveState = 4;\n            }\n            else\n            {\n                u16 moveId = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MOVE1 + movePosition);\n                \n                if (IsHMMove2(moveId))\n                {\n                    PrepareStringBattle(STRINGID_HMMOVESCANTBEFORGOTTEN, gActiveBattler);\n                    gBattleScripting.learnMoveState = 5;\n                }\n                else\n                {\n                    gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n\n                    PREPARE_MOVE_BUFFER(gBattleTextBuff2, moveId)\n\n                    RemoveMonPPBonus(&gPlayerParty[gBattleStruct->expGetterMonId], movePosition);\n                    SetMonMoveSlot(&gPlayerParty[gBattleStruct->expGetterMonId], gMoveToLearn, movePosition);\n\n                    if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId && MOVE_IS_PERMANENT(0, movePosition))\n                    {\n                        RemoveBattleMonPPBonus(&gBattleMons[0], movePosition);\n                        SetBattleMonMoveSlot(&gBattleMons[0], gMoveToLearn, movePosition);\n                    }\n                    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE\n                        && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId\n                        && MOVE_IS_PERMANENT(2, movePosition))\n                    {\n                        RemoveBattleMonPPBonus(&gBattleMons[2], movePosition);\n                        SetBattleMonMoveSlot(&gBattleMons[2], gMoveToLearn, movePosition);\n                    }\n                }\n            }\n        }\n        break;\n    case 4:\n        HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR);\n        gBattlescriptCurrInstr += 5;\n        break;\n    case 5:\n        if (gBattleControllerExecFlags == 0)\n        {\n            gBattleScripting.learnMoveState = 2;\n        }\n        break;\n    }\n}\n\nstatic void Cmd_yesnoboxstoplearningmove(void)\n{\n    switch (gBattleScripting.learnMoveState)\n    {\n    case 0:\n        HandleBattleWindow(23, 8, 29, 13, 0);\n        BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO);\n        gBattleScripting.learnMoveState++;\n        gBattleCommunication[CURSOR_POSITION] = 0;\n        BattleCreateYesNoCursorAt();\n        break;\n    case 1:\n        if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0)\n        {\n            PlaySE(SE_SELECT);\n            BattleDestroyYesNoCursorAt();\n            gBattleCommunication[CURSOR_POSITION] = 0;\n            BattleCreateYesNoCursorAt();\n        }\n        if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0)\n        {\n            PlaySE(SE_SELECT);\n            BattleDestroyYesNoCursorAt();\n            gBattleCommunication[CURSOR_POSITION] = 1;\n            BattleCreateYesNoCursorAt();\n        }\n        if (JOY_NEW(A_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n\n            if (gBattleCommunication[1] != 0)\n                gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n            else\n                gBattlescriptCurrInstr += 5;\n\n            HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR);\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n            HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR);\n        }\n        break;\n    }\n}\n\nstatic void Cmd_hitanimation(void)\n{\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n    if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n    {\n        gBattlescriptCurrInstr += 2;\n    }\n    else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBattler].substituteHP == 0)\n    {\n        BtlController_EmitHitAnimation(BUFFER_A);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr += 2;\n    }\n    else\n    {\n        gBattlescriptCurrInstr += 2;\n    }\n}\n\nstatic void Cmd_getmoneyreward(void)\n{\n    u32 i = 0;\n    u32 moneyReward;\n    u8 lastMonLevel = 0;\n\n    const struct TrainerMonItemCustomMoves *party4; //This needs to be out here\n    const struct TrainerMonItemCustomMovesEVs *party5;\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    if (gBattleOutcome == B_OUTCOME_WON)\n    {\n        if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)\n        {\n            moneyReward = gBattleResources->secretBase->party.levels[0] * 20 * gBattleStruct->moneyMultiplier;\n        }\n        else\n        {\n            switch (sTrainers[gTrainerBattleOpponent_A].partyFlags)\n            {\n            case 0:\n                {\n                    const struct TrainerMonNoItemDefaultMoves *party1 = sTrainers[gTrainerBattleOpponent_A].party.NoItemDefaultMoves;\n                    \n                    lastMonLevel = party1[sTrainers[gTrainerBattleOpponent_A].partySize - 1].lvl;\n                }\n                break;\n            case F_TRAINER_PARTY_CUSTOM_MOVESET:\n                {\n                    const struct TrainerMonNoItemCustomMoves *party2 = sTrainers[gTrainerBattleOpponent_A].party.NoItemCustomMoves;\n                    \n                    lastMonLevel = party2[sTrainers[gTrainerBattleOpponent_A].partySize - 1].lvl;\n                }\n                break;\n            case F_TRAINER_PARTY_HELD_ITEM:\n                {\n                    const struct TrainerMonItemDefaultMoves *party3 = sTrainers[gTrainerBattleOpponent_A].party.ItemDefaultMoves;\n                    \n                    lastMonLevel = party3[sTrainers[gTrainerBattleOpponent_A].partySize - 1].lvl;\n                }\n                break;\n            case (F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM):\n                {\n                    party4 = sTrainers[gTrainerBattleOpponent_A].party.ItemCustomMoves;\n                    \n                    lastMonLevel = party4[sTrainers[gTrainerBattleOpponent_A].partySize - 1].lvl;\n                }\n                break;\n            case F_TRAINER_PARTY_EVS:\n                {\n                    party5 = sTrainers[gTrainerBattleOpponent_A].party.ItemCustomMovesEVs;\n                    \n                    lastMonLevel = party5[sTrainers[gTrainerBattleOpponent_A].partySize - 1].lvl;\n                }\n                break;\n            }\n            for (; gTrainerMoneyTable[i].classId != 0xFF; i++)\n            {\n                if (gTrainerMoneyTable[i].classId == sTrainers[gTrainerBattleOpponent_A].trainerClass)\n                    break;\n            }\n            party4 = sTrainers[gTrainerBattleOpponent_A].party.ItemCustomMoves; // Needed to Match. Has no effect.\n            moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * (gBattleTypeFlags & BATTLE_TYPE_DOUBLE ? 2 : 1) * gTrainerMoneyTable[i].value;\n        }\n        AddMoney(&gSaveBlock1Ptr->money, moneyReward);\n    }\n    else\n    {\n        moneyReward = ComputeWhiteOutMoneyLoss();\n    }\n    PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff1, 5, moneyReward);\n    if (moneyReward)\n        gBattlescriptCurrInstr += 5;\n    else\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n}\n\n// Command is never used\nstatic void Cmd_updatebattlermoves(void)\n{\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n    switch (gBattleCommunication[0])\n    {\n    case 0:\n        BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, 0);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattleCommunication[0]++;\n        break;\n    case 1:\n         if (gBattleControllerExecFlags == 0)\n         {\n            s32 i;\n            struct BattlePokemon *bufferPoke = (struct BattlePokemon *) &gBattleBufferB[gActiveBattler][4];\n            for (i = 0; i < MAX_MON_MOVES; i++)\n            {\n                gBattleMons[gActiveBattler].moves[i] = bufferPoke->moves[i];\n                gBattleMons[gActiveBattler].pp[i] = bufferPoke->pp[i];\n            }\n            gBattlescriptCurrInstr += 2;\n         }\n         break;\n    }\n}\n\nstatic void Cmd_swapattackerwithtarget(void)\n{\n    gActiveBattler = gBattlerAttacker;\n    gBattlerAttacker = gBattlerTarget;\n    gBattlerTarget = gActiveBattler;\n\n    if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET)\n        gHitMarker &= ~HITMARKER_SWAP_ATTACKER_TARGET;\n    else\n        gHitMarker |= HITMARKER_SWAP_ATTACKER_TARGET;\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_incrementgamestat(void)\n{\n    if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n        IncrementGameStat(gBattlescriptCurrInstr[1]);\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_drawpartystatussummary(void)\n{\n    s32 i;\n    struct Pokemon *party;\n    struct HpAndStatus hpStatuses[PARTY_SIZE];\n\n    if (gBattleControllerExecFlags)\n        return;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n        party = gPlayerParty;\n    else\n        party = gEnemyParty;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE\n            || GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG)\n        {\n            hpStatuses[i].hp = 0xFFFF;\n            hpStatuses[i].status = 0;\n        }\n        else\n        {\n            hpStatuses[i].hp = GetMonData(&party[i], MON_DATA_HP);\n            hpStatuses[i].status = GetMonData(&party[i], MON_DATA_STATUS);\n        }\n    }\n\n    BtlController_EmitDrawPartyStatusSummary(BUFFER_A, hpStatuses, 1);\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_hidepartystatussummary(void)\n{\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    BtlController_EmitHidePartyStatusSummary(BUFFER_A);\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_jumptocalledmove(void)\n{\n    if (gBattlescriptCurrInstr[1])\n        gCurrentMove = gCalledMove;\n    else\n        gChosenMove = gCurrentMove = gCalledMove;\n\n    gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];\n}\n\nstatic void Cmd_statusanimation(void)\n{\n    if (gBattleControllerExecFlags == 0)\n    {\n        gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n        if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE)\n            && gDisableStructs[gActiveBattler].substituteHP == 0\n            && !(gHitMarker & HITMARKER_NO_ANIMATIONS))\n        {\n            BtlController_EmitStatusAnimation(BUFFER_A, FALSE, gBattleMons[gActiveBattler].status1);\n            MarkBattlerForControllerExec(gActiveBattler);\n        }\n        gBattlescriptCurrInstr += 2;\n    }\n}\n\nstatic void Cmd_status2animation(void)\n{\n    u32 wantedToAnimate;\n\n    if (gBattleControllerExecFlags == 0)\n    {\n        gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n        wantedToAnimate = T1_READ_32(gBattlescriptCurrInstr + 2);\n        if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE)\n            && gDisableStructs[gActiveBattler].substituteHP == 0\n            && !(gHitMarker & HITMARKER_NO_ANIMATIONS))\n        {\n            BtlController_EmitStatusAnimation(BUFFER_A, TRUE, gBattleMons[gActiveBattler].status2 & wantedToAnimate);\n            MarkBattlerForControllerExec(gActiveBattler);\n        }\n        gBattlescriptCurrInstr += 6;\n    }\n}\n\nstatic void Cmd_chosenstatusanimation(void)\n{\n    u32 wantedStatus;\n\n    if (gBattleControllerExecFlags == 0)\n    {\n        gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n        wantedStatus = T1_READ_32(gBattlescriptCurrInstr + 3);\n        if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE)\n            && gDisableStructs[gActiveBattler].substituteHP == 0\n            && !(gHitMarker & HITMARKER_NO_ANIMATIONS))\n        {\n            BtlController_EmitStatusAnimation(BUFFER_A, gBattlescriptCurrInstr[2], wantedStatus);\n            MarkBattlerForControllerExec(gActiveBattler);\n        }\n        gBattlescriptCurrInstr += 7;\n    }\n}\n\nstatic void Cmd_yesnobox(void)\n{\n    switch (gBattleCommunication[0])\n    {\n    case 0:\n        HandleBattleWindow(23, 8, 29, 13, 0);\n        BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO);\n        gBattleCommunication[0]++;\n        gBattleCommunication[CURSOR_POSITION] = 0;\n        BattleCreateYesNoCursorAt();\n        break;\n    case 1:\n        if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0)\n        {\n            PlaySE(SE_SELECT);\n            BattleDestroyYesNoCursorAt();\n            gBattleCommunication[CURSOR_POSITION] = 0;\n            BattleCreateYesNoCursorAt();\n        }\n        if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0)\n        {\n            PlaySE(SE_SELECT);\n            BattleDestroyYesNoCursorAt();\n            gBattleCommunication[CURSOR_POSITION] = 1;\n            BattleCreateYesNoCursorAt();\n        }\n        if (JOY_NEW(B_BUTTON))\n        {\n            gBattleCommunication[CURSOR_POSITION] = 1;\n            PlaySE(SE_SELECT);\n            HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR);\n            gBattlescriptCurrInstr++;\n        }\n        else if (JOY_NEW(A_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            HandleBattleWindow(23, 8, 29, 13, WINDOW_CLEAR);\n            gBattlescriptCurrInstr++;\n        }\n        break;\n    }\n}\n\nstatic void Cmd_cancelallactions(void)\n{\n    s32 i;\n\n    for (i = 0; i < gBattlersCount; i++)\n        gActionsByTurnOrder[i] = B_ACTION_CANCEL_PARTNER;\n\n    gBattlescriptCurrInstr++;\n}\n\n// The same as adjustnormaldamage, except there's no random damage multiplier.\nstatic void Cmd_adjustsetdamage(void)\n{\n    u8 holdEffect, param;\n\n    if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY)\n    {\n        holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect;\n        param = gEnigmaBerries[gBattlerTarget].holdEffectParam;\n    }\n    else\n    {\n        holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item);\n        param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item);\n    }\n\n    gPotentialItemEffectBattler = gBattlerTarget;\n\n    if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param)\n    {\n        RecordItemEffectBattle(gBattlerTarget, holdEffect);\n        gSpecialStatuses[gBattlerTarget].focusBanded = 1;\n    }\n    if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE)\n     && (gBattleMoves[gCurrentMove].effect == EFFECT_FALSE_SWIPE || gProtectStructs[gBattlerTarget].endured || gSpecialStatuses[gBattlerTarget].focusBanded)\n     && gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage)\n    {\n        gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1;\n        if (gProtectStructs[gBattlerTarget].endured)\n        {\n            gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED;\n        }\n        else if (gSpecialStatuses[gBattlerTarget].focusBanded)\n        {\n            gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON;\n            gLastUsedItem = gBattleMons[gBattlerTarget].item;\n        }\n    }\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_removeitem(void)\n{\n    u16 *usedHeldItem;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n    usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBattler];\n    *usedHeldItem = gBattleMons[gActiveBattler].item;\n    gBattleMons[gActiveBattler].item = ITEM_NONE;\n\n    BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item);\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_atknameinbuff1(void)\n{\n    PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker])\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_drawlvlupbox(void)\n{\n    if (gBattleScripting.drawlvlupboxState == 0)\n    {\n        // If the Pokémon getting exp is not in-battle then\n        // slide out a banner with their name and icon on it.\n        // Otherwise skip ahead.\n        if (IsMonGettingExpSentOut())\n            gBattleScripting.drawlvlupboxState = 3;\n        else\n            gBattleScripting.drawlvlupboxState = 1;\n    }\n\n    switch (gBattleScripting.drawlvlupboxState)\n    {\n    case 1:\n        // Start level up banner\n        gBattle_BG2_Y = 96;\n        SetBgAttribute(2, BG_ATTR_PRIORITY, 0);\n        ShowBg(2);\n        InitLevelUpBanner();\n        gBattleScripting.drawlvlupboxState = 2;\n        break;\n    case 2:\n        if (!SlideInLevelUpBanner())\n            gBattleScripting.drawlvlupboxState = 3;\n        break;\n    case 3:\n        // Init level up box\n        gBattle_BG1_X = 0;\n        gBattle_BG1_Y = 256;\n        SetBgAttribute(0, BG_ATTR_PRIORITY, 1);\n        SetBgAttribute(1, BG_ATTR_PRIORITY, 0);\n        ShowBg(0);\n        ShowBg(1);\n        HandleBattleWindow(18, 7, 29, 19, WINDOW_BG1);\n        gBattleScripting.drawlvlupboxState = 4;\n        break;\n    case 4:\n        // Draw page 1 of level up box\n        DrawLevelUpWindow1();\n        PutWindowTilemap(B_WIN_LEVEL_UP_BOX);\n        CopyWindowToVram(B_WIN_LEVEL_UP_BOX, COPYWIN_FULL);\n        gBattleScripting.drawlvlupboxState++;\n        break;\n    case 5:\n    case 7:\n        // Wait for draw after each page\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            gBattle_BG1_Y = 0;\n            gBattleScripting.drawlvlupboxState++;\n        }\n        break;\n    case 6:\n        if (gMain.newKeys != 0)\n        {\n            // Draw page 2 of level up box\n            PlaySE(SE_SELECT);\n            DrawLevelUpWindow2();\n            CopyWindowToVram(B_WIN_LEVEL_UP_BOX, COPYWIN_GFX);\n            gBattleScripting.drawlvlupboxState++;\n        }\n        break;\n    case 8:\n        if (gMain.newKeys != 0)\n        {\n            // Close level up box\n            PlaySE(SE_SELECT);\n            HandleBattleWindow(18, 7, 29, 19, WINDOW_BG1 | WINDOW_CLEAR);\n            gBattleScripting.drawlvlupboxState++;\n        }\n        break;\n    case 9:\n        if (!SlideOutLevelUpBanner())\n        {\n            ClearWindowTilemap(B_WIN_LEVEL_UP_BANNER);\n            CopyWindowToVram(B_WIN_LEVEL_UP_BANNER, COPYWIN_MAP);\n\n            ClearWindowTilemap(B_WIN_LEVEL_UP_BOX);\n            CopyWindowToVram(B_WIN_LEVEL_UP_BOX, COPYWIN_MAP);\n\n            SetBgAttribute(2, BG_ATTR_PRIORITY, 2);\n            ShowBg(2);\n\n            gBattleScripting.drawlvlupboxState = 10;\n        }\n        break;\n    case 10:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            SetBgAttribute(0, BG_ATTR_PRIORITY, 0);\n            SetBgAttribute(1, BG_ATTR_PRIORITY, 1);\n            ShowBg(0);\n            ShowBg(1);\n            gBattlescriptCurrInstr++;\n        }\n        break;\n    }\n}\n\nstatic void DrawLevelUpWindow1(void)\n{\n    u16 currStats[NUM_STATS];\n\n    GetMonLevelUpWindowStats(&gPlayerParty[gBattleStruct->expGetterMonId], currStats);\n    DrawLevelUpWindowPg1(B_WIN_LEVEL_UP_BOX, gBattleResources->beforeLvlUp->stats, currStats, TEXT_DYNAMIC_COLOR_5, TEXT_DYNAMIC_COLOR_4, TEXT_DYNAMIC_COLOR_6);\n}\n\nstatic void DrawLevelUpWindow2(void)\n{\n    u16 currStats[NUM_STATS];\n\n    GetMonLevelUpWindowStats(&gPlayerParty[gBattleStruct->expGetterMonId], currStats);\n    DrawLevelUpWindowPg2(B_WIN_LEVEL_UP_BOX, currStats, TEXT_DYNAMIC_COLOR_5, TEXT_DYNAMIC_COLOR_4, TEXT_DYNAMIC_COLOR_6);\n}\n\nstatic void InitLevelUpBanner(void)\n{\n    gBattle_BG2_Y = 0;\n    gBattle_BG2_X = LEVEL_UP_BANNER_START;\n\n    LoadPalette(sLevelUpBanner_Pal, BG_PLTT_ID(6), sizeof(sLevelUpBanner_Pal));\n    CopyToWindowPixelBuffer(B_WIN_LEVEL_UP_BANNER, sLevelUpBanner_Gfx, 0, 0);\n    PutWindowTilemap(B_WIN_LEVEL_UP_BANNER);\n    CopyWindowToVram(B_WIN_LEVEL_UP_BANNER, COPYWIN_FULL);\n\n    PutMonIconOnLvlUpBanner();\n}\n\nstatic bool8 SlideInLevelUpBanner(void)\n{\n    if (IsDma3ManagerBusyWithBgCopy())\n        return TRUE;\n\n    if (gBattle_BG2_X == LEVEL_UP_BANNER_END)\n        return FALSE;\n\n    if (gBattle_BG2_X == LEVEL_UP_BANNER_START)\n        DrawLevelUpBannerText();\n\n    gBattle_BG2_X += 8;\n    if (gBattle_BG2_X >= LEVEL_UP_BANNER_END)\n        gBattle_BG2_X = LEVEL_UP_BANNER_END;\n\n    return (gBattle_BG2_X != LEVEL_UP_BANNER_END);\n}\n\nstatic void DrawLevelUpBannerText(void)\n{\n    u16 monLevel;\n    u8 monGender;\n    struct TextPrinterTemplate printerTemplate;\n    u8 *txtPtr;\n    u8 *txtPtr2;\n\n    monLevel = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL);\n    monGender = GetMonGender(&gPlayerParty[gBattleStruct->expGetterMonId]);\n    GetMonNickname(&gPlayerParty[gBattleStruct->expGetterMonId], gStringVar4);\n\n    printerTemplate.currentChar = gStringVar4;\n    printerTemplate.windowId = B_WIN_LEVEL_UP_BANNER;\n    printerTemplate.fontId = FONT_SMALL;\n    printerTemplate.x = 32;\n    printerTemplate.y = 0;\n    printerTemplate.currentX = 32;\n    printerTemplate.currentY = 0;\n    printerTemplate.letterSpacing = 0;\n    printerTemplate.lineSpacing = 0;\n    printerTemplate.unk = 0;\n    printerTemplate.fgColor = TEXT_COLOR_WHITE;\n    printerTemplate.bgColor = TEXT_COLOR_TRANSPARENT;\n    printerTemplate.shadowColor = TEXT_COLOR_DARK_GRAY;\n\n    AddTextPrinter(&printerTemplate, TEXT_SKIP_DRAW, NULL);\n\n    txtPtr = gStringVar4;\n    gStringVar4[0] = CHAR_EXTRA_SYMBOL;\n    *++txtPtr = CHAR_LV_2;\n    *++txtPtr = 0;\n    txtPtr2 = txtPtr + 1;\n    txtPtr = ConvertIntToDecimalStringN(++txtPtr, monLevel, STR_CONV_MODE_LEFT_ALIGN, 3);\n    txtPtr = StringFill(txtPtr, 0, 5);\n    txtPtr = txtPtr2 + 4;\n    if (monGender != MON_GENDERLESS)\n    {\n        if (monGender == MON_MALE)\n        {\n            txtPtr = WriteColorChangeControlCode(txtPtr, 0, TEXT_DYNAMIC_COLOR_3);\n            txtPtr = WriteColorChangeControlCode(txtPtr, 1, TEXT_DYNAMIC_COLOR_4);\n            *(txtPtr++) = CHAR_MALE;\n        }\n        else\n        {\n            txtPtr = WriteColorChangeControlCode(txtPtr, 0, TEXT_DYNAMIC_COLOR_5);\n            txtPtr = WriteColorChangeControlCode(txtPtr, 1, TEXT_DYNAMIC_COLOR_6);\n            *(txtPtr++) = CHAR_FEMALE;\n        }\n        *(txtPtr++) = EOS;\n    }\n\n    printerTemplate.y = 10;\n    printerTemplate.currentY = 10;\n    AddTextPrinter(&printerTemplate, TEXT_SKIP_DRAW, NULL);\n\n    CopyWindowToVram(B_WIN_LEVEL_UP_BANNER, COPYWIN_GFX);\n}\n\nstatic bool8 SlideOutLevelUpBanner(void)\n{\n    if (gBattle_BG2_X == LEVEL_UP_BANNER_START)\n        return FALSE;\n\n    if (gBattle_BG2_X - 16 < LEVEL_UP_BANNER_START)\n        gBattle_BG2_X = LEVEL_UP_BANNER_START;\n    else\n        gBattle_BG2_X -= 16;\n\n    return (gBattle_BG2_X != LEVEL_UP_BANNER_START);\n}\n\n#define sDestroy data[0]\n#define sXOffset data[1]\n\nstatic void PutMonIconOnLvlUpBanner(void)\n{\n    u8 spriteId;\n    const u16 *iconPal;\n    struct SpriteSheet iconSheet;\n    struct SpritePalette iconPalSheet;\n\n    u16 species = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPECIES);\n    u32 personality = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_PERSONALITY);\n\n    const u8 *iconPtr = GetMonIconPtr(species, personality, 1);\n    iconSheet.data = iconPtr;\n    iconSheet.size = 0x200;\n    iconSheet.tag = TAG_LVLUP_BANNER_MON_ICON;\n\n    iconPal = GetValidMonIconPalettePtr(species);\n    iconPalSheet.data = iconPal;\n    iconPalSheet.tag = TAG_LVLUP_BANNER_MON_ICON;\n\n    LoadSpriteSheet(&iconSheet);\n    LoadSpritePalette(&iconPalSheet);\n\n    spriteId = CreateSprite(&sSpriteTemplate_MonIconOnLvlUpBanner, 256, 10, 0);\n    gSprites[spriteId].sDestroy = FALSE;\n    gSprites[spriteId].sXOffset = gBattle_BG2_X;\n}\n\nstatic void SpriteCB_MonIconOnLvlUpBanner(struct Sprite* sprite)\n{\n    sprite->x2 = sprite->sXOffset - gBattle_BG2_X;\n\n    if (sprite->x2 != 0)\n    {\n        sprite->sDestroy = TRUE;\n    }\n    else if (sprite->sDestroy)\n    {\n        DestroySprite(sprite);\n        FreeSpriteTilesByTag(TAG_LVLUP_BANNER_MON_ICON);\n        FreeSpritePaletteByTag(TAG_LVLUP_BANNER_MON_ICON);\n    }\n}\n\n#undef sDestroy\n#undef sXOffset\n\nbool32 IsMonGettingExpSentOut(void)\n{\n    if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId)\n        return TRUE;\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId)\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic void Cmd_resetsentmonsvalue(void)\n{\n    ResetSentPokesToOpponentValue();\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_setatktoplayer0(void)\n{\n    gBattlerAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_makevisible(void)\n{\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    BtlController_EmitSpriteInvisibility(BUFFER_A, FALSE);\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_recordlastability(void)\n{\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n    RecordAbilityBattle(gActiveBattler, gLastUsedAbility);\n\n#ifdef BUGFIX\n    // This command occupies two bytes (one for the command id, and one for the battler id parameter).\n    gBattlescriptCurrInstr += 2;\n#else\n    gBattlescriptCurrInstr += 1;\n#endif\n}\n\nvoid BufferMoveToLearnIntoBattleTextBuff2(void)\n{\n    PREPARE_MOVE_BUFFER(gBattleTextBuff2, gMoveToLearn);\n}\n\nstatic void Cmd_buffermovetolearn(void)\n{\n    BufferMoveToLearnIntoBattleTextBuff2();\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_jumpifplayerran(void)\n{\n    if (TryRunFromBattle(gBattlerFainted))\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    else\n        gBattlescriptCurrInstr += 5;\n}\n\nstatic void Cmd_hpthresholds(void)\n{\n    u8 opposingBattler;\n    s32 result;\n\n    if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))\n    {\n        gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n        opposingBattler = gActiveBattler ^ BIT_SIDE;\n\n        result = gBattleMons[opposingBattler].hp * 100 / gBattleMons[opposingBattler].maxHP;\n        if (result == 0)\n            result = 1;\n\n        if (result > 69 || gBattleMons[opposingBattler].hp == 0)\n            gBattleStruct->hpScale = 0;\n        else if (result > 39)\n            gBattleStruct->hpScale = 1;\n        else if (result > 9)\n            gBattleStruct->hpScale = 2;\n        else\n            gBattleStruct->hpScale = 3;\n    }\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_hpthresholds2(void)\n{\n    u8 opposingBattler;\n    s32 result;\n    u8 hpSwitchout;\n\n    if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))\n    {\n        gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n        opposingBattler = gActiveBattler ^ BIT_SIDE;\n        hpSwitchout = *(gBattleStruct->hpOnSwitchout + GetBattlerSide(opposingBattler));\n        result = (hpSwitchout - gBattleMons[opposingBattler].hp) * 100 / hpSwitchout;\n\n        if (gBattleMons[opposingBattler].hp >= hpSwitchout)\n            gBattleStruct->hpScale = 0;\n        else if (result <= 29)\n            gBattleStruct->hpScale = 1;\n        else if (result <= 69)\n            gBattleStruct->hpScale = 2;\n        else\n            gBattleStruct->hpScale = 3;\n    }\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_useitemonopponent(void)\n{\n    gBattlerInMenuId = gBattlerAttacker;\n    PokemonUseItemEffects(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]], gLastUsedItem, gBattlerPartyIndexes[gBattlerAttacker], 0, TRUE);\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_various(void)\n{\n    u8 side;\n    s32 i;\n    u32 monToCheck, status;\n    u16 species;\n    u8 abilityNum;\n\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n    switch (gBattlescriptCurrInstr[2])\n    {\n    case VARIOUS_CANCEL_MULTI_TURN_MOVES:\n        CancelMultiTurnMoves(gActiveBattler);\n        break;\n    case VARIOUS_SET_MAGIC_COAT_TARGET:\n        gBattlerAttacker = gBattlerTarget;\n        side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;\n        if (gSideTimers[side].followmeTimer != 0 && gBattleMons[gSideTimers[side].followmeTarget].hp != 0)\n            gBattlerTarget = gSideTimers[side].followmeTarget;\n        else\n            gBattlerTarget = gActiveBattler;\n        break;\n    case VARIOUS_IS_RUNNING_IMPOSSIBLE:\n        gBattleCommunication[0] = IsRunningFromBattleImpossible();\n        break;\n    case VARIOUS_GET_MOVE_TARGET:\n        gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);\n        break;\n    case VARIOUS_GET_BATTLER_FAINTED:\n        if (gHitMarker & HITMARKER_FAINTED(gActiveBattler))\n            gBattleCommunication[0] = TRUE;\n        else\n            gBattleCommunication[0] = FALSE;\n        break;\n    case VARIOUS_RESET_INTIMIDATE_TRACE_BITS:\n        gSpecialStatuses[gActiveBattler].intimidatedMon = 0;\n        gSpecialStatuses[gActiveBattler].traced = 0;\n        break;\n    case VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP:\n        if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId || gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId)\n        {\n            u16 *choicedMove;\n\n            if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId)\n                gActiveBattler = 0;\n            else\n                gActiveBattler = 2;\n\n            choicedMove = &gBattleStruct->choicedMove[gActiveBattler];\n\n            for (i = 0; i < MAX_MON_MOVES; i++)\n            {\n                if (gBattleMons[gActiveBattler].moves[i] == *choicedMove)\n                    break;\n            }\n            if (i == MAX_MON_MOVES)\n                *choicedMove = MOVE_NONE;\n        }\n        break;\n    case VARIOUS_RESET_PLAYER_FAINTED:\n        if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE))\n            && gBattleTypeFlags & BATTLE_TYPE_TRAINER\n            && gBattleMons[0].hp != 0\n            && gBattleMons[1].hp != 0)\n        {\n            gHitMarker &= ~HITMARKER_PLAYER_FAINTED;\n        }\n        break;\n    case VARIOUS_GET_BATTLERS_FOR_RECALL:\n        i = 0; // redundant\n        gBattleCommunication[MULTISTRING_CHOOSER] = 0;\n        gActiveBattler = 1;\n        for (i = 0; gActiveBattler < MAX_BATTLERS_COUNT; gActiveBattler += 2)\n        {\n            if (gActiveBattler < gBattlersCount && gBattleMons[gActiveBattler].hp != 0)\n                gBattleCommunication[MULTISTRING_CHOOSER] |= gBitTable[i];\n            i++;\n        }\n        break;\n    case VARIOUS_RETURN_OPPONENT_MON1:\n        gActiveBattler = 1;\n        if (gBattleMons[gActiveBattler].hp != 0)\n        {\n            BtlController_EmitReturnMonToBall(BUFFER_A, FALSE);\n            MarkBattlerForControllerExec(gActiveBattler);\n        }\n        break;\n    case VARIOUS_RETURN_OPPONENT_MON2:\n        if (gBattlersCount > 3)\n        {\n            gActiveBattler = 3;\n            if (gBattleMons[gActiveBattler].hp != 0)\n            {\n                BtlController_EmitReturnMonToBall(BUFFER_A, FALSE);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n        }\n        break;\n    case VARIOUS_CHECK_POKEFLUTE:\n        gBattleCommunication[MULTISTRING_CHOOSER] = 0;\n        monToCheck = 0;\n        for (i = 0; i < gBattlersCount; i++)\n        {\n            if (gBattleMons[i].ability != ABILITY_SOUNDPROOF)\n            {\n                gBattleMons[i].status1 &= ~STATUS1_SLEEP;\n                gBattleMons[i].status2 &= ~STATUS2_NIGHTMARE;\n\n            }\n        }\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG);\n            abilityNum = GetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM);\n            status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);\n            if (species != SPECIES_NONE\n             && species != SPECIES_EGG\n             && status & AILMENT_FNT\n             && GetAbilityBySpecies(species, abilityNum) != ABILITY_SOUNDPROOF)\n                monToCheck |= (1 << i);\n        }\n        if (monToCheck)\n        {\n            gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n            status = 0;\n            BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, monToCheck, 4, &status);\n            MarkBattlerForControllerExec(gActiveBattler);\n            gBattleCommunication[MULTISTRING_CHOOSER] = 1;\n        }\n        monToCheck = 0;\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG);\n            abilityNum = GetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM);\n            status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS);\n\n            if (species != SPECIES_NONE\n             && species != SPECIES_EGG\n             && status & AILMENT_FNT\n             && GetAbilityBySpecies(species, abilityNum) != ABILITY_SOUNDPROOF)\n                monToCheck |= (1 << i);\n        }\n        if (monToCheck)\n        {\n            gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n            status = 0;\n            BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, monToCheck, 4, &status);\n            MarkBattlerForControllerExec(gActiveBattler);\n            gBattleCommunication[5] = 1;\n        }\n        break;\n    case VARIOUS_WAIT_FANFARE:\n        if (!IsFanfareTaskInactive())\n            return;\n        break;\n    }\n\n    gBattlescriptCurrInstr += 3;\n}\n\n // Protect and Endure\nstatic void Cmd_setprotectlike(void)\n{\n    bool8 notLastTurn = TRUE;\n    u16 lastMove = gLastResultingMoves[gBattlerAttacker];\n\n    if (lastMove != MOVE_PROTECT && lastMove != MOVE_DETECT && lastMove != MOVE_ENDURE)\n        gDisableStructs[gBattlerAttacker].protectUses = 0;\n\n    if (gCurrentTurnActionNumber == (gBattlersCount - 1))\n        notLastTurn = FALSE;\n\n    if (sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] >= Random() && notLastTurn)\n    {\n        if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT)\n        {\n            gProtectStructs[gBattlerAttacker].protected = 1;\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF;\n        }\n        if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE)\n        {\n            gProtectStructs[gBattlerAttacker].endured = 1;\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BRACED_ITSELF;\n        }\n        gDisableStructs[gBattlerAttacker].protectUses++;\n    }\n    else\n    {\n        gDisableStructs[gBattlerAttacker].protectUses = 0;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECT_FAILED;\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_tryexplosion(void)\n{\n    if (gBattleControllerExecFlags)\n        return;\n\n    // Explosion can only fail if any battler has Damp\n    for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++)\n    {\n        if (gBattleMons[gBattlerTarget].ability == ABILITY_DAMP)\n            break;\n    }\n\n    if (gBattlerTarget == gBattlersCount)\n    {\n        // Success, no battlers with Damp. Drop user's HP bar to 0\n        gActiveBattler = gBattlerAttacker;\n        gBattleMoveDamage = gBattleMons[gActiveBattler].hp;\n        BtlController_EmitHealthBarUpdate(BUFFER_A, INSTANT_HP_BAR_DROP);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr++;\n\n        // Find first target\n        for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++)\n        {\n            if (gBattlerTarget == gBattlerAttacker)\n                continue;\n            if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget]))\n                break;\n        }\n    }\n    else\n    {\n        // Failed, a battler has Damp\n        gLastUsedAbility = ABILITY_DAMP;\n        RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability);\n        gBattlescriptCurrInstr = BattleScript_DampStopsExplosion;\n    }\n}\n\nstatic void Cmd_setatkhptozero(void)\n{\n    if (gBattleControllerExecFlags)\n        return;\n\n    gActiveBattler = gBattlerAttacker;\n    gBattleMons[gActiveBattler].hp = 0;\n    BtlController_EmitSetMonData(BUFFER_A, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp);\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_jumpifnexttargetvalid(void)\n{\n    const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n    {\n        for (gBattlerTarget++; ; gBattlerTarget++)\n        {\n            if (gBattlerTarget == gBattlerAttacker)\n                continue;\n            if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget]))\n                break;\n        }\n\n        if (gBattlerTarget >= gBattlersCount)\n            gBattlescriptCurrInstr += 5;\n        else\n            gBattlescriptCurrInstr = jumpPtr;\n    }\n    else\n    {\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_tryhealhalfhealth(void)\n{\n    const u8 *failPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n\n    if (gBattlescriptCurrInstr[5] == BS_ATTACKER)\n        gBattlerTarget = gBattlerAttacker;\n\n    gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2;\n    if (gBattleMoveDamage == 0)\n        gBattleMoveDamage = 1;\n    gBattleMoveDamage *= -1;\n\n    if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP)\n        gBattlescriptCurrInstr = failPtr;\n    else\n        gBattlescriptCurrInstr += 6;\n}\n\nstatic void Cmd_trymirrormove(void)\n{\n    s32 validMovesCount;\n    s32 i;\n    u16 move;\n    u16 validMoves[MAX_BATTLERS_COUNT - 1];\n\n    for (i = 0; i < (MAX_BATTLERS_COUNT - 1); i++) // -1 to exclude the user\n        validMoves[i] = MOVE_NONE;\n\n    for (validMovesCount = 0, i = 0; i < gBattlersCount; i++)\n    {\n        if (i != gBattlerAttacker)\n        {\n            move = T1_READ_16(i * 2 + gBattlerAttacker * 8 + gBattleStruct->lastTakenMoveFrom);\n\n            if (move != MOVE_NONE && move != MOVE_UNAVAILABLE)\n            {\n                validMoves[validMovesCount] = move;\n                validMovesCount++;\n            }\n        }\n    }\n\n    move = T1_READ_16(gBattleStruct->lastTakenMove + gBattlerAttacker * 2);\n    move++;move--; // why?\n\n    if (move != MOVE_NONE && move != MOVE_UNAVAILABLE)\n    {\n        gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;\n        gCurrentMove = move;\n        gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);\n        gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];\n    }\n    else if (validMovesCount != 0)\n    {\n        gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;\n        i = Random() % validMovesCount;\n        gCurrentMove = validMoves[i];\n        gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);\n        gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];\n    }\n    else // no valid moves found\n    {\n        gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = TRUE;\n        gBattlescriptCurrInstr++;\n    }\n}\n\nstatic void Cmd_setrain(void)\n{\n    if (gBattleWeather & B_WEATHER_RAIN)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED;\n    }\n    else\n    {\n        gBattleWeather = B_WEATHER_RAIN_TEMPORARY;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_RAIN;\n        gWishFutureKnock.weatherDuration = 5;\n    }\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_setreflect(void)\n{\n    if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_REFLECT)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED;\n    }\n    else\n    {\n        gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_REFLECT;\n        gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].reflectTimer = 5;\n        gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].reflectBattlerId = gBattlerAttacker;\n\n        if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2)\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE;\n        else\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_SINGLE;\n    }\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_setseeded(void)\n{\n    if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT || gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_MISS;\n    }\n    else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS))\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_FAIL;\n    }\n    else\n    {\n        gStatuses3[gBattlerTarget] |= gBattlerAttacker;\n        gStatuses3[gBattlerTarget] |= STATUS3_LEECHSEED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_SET;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_manipulatedamage(void)\n{\n    switch (gBattlescriptCurrInstr[1])\n    {\n    case DMG_CHANGE_SIGN:\n        gBattleMoveDamage *= -1;\n        break;\n    case DMG_RECOIL_FROM_MISS:\n        gBattleMoveDamage /= 2;\n        if (gBattleMoveDamage == 0)\n            gBattleMoveDamage = 1;\n        if ((gBattleMons[gBattlerTarget].maxHP / 2) < gBattleMoveDamage)\n            gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2;\n        break;\n    case DMG_DOUBLED:\n        gBattleMoveDamage *= 2;\n        break;\n    }\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_trysetrest(void)\n{\n    const u8 *failJump = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    gActiveBattler = gBattlerTarget = gBattlerAttacker;\n    gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP * (-1);\n\n    if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP)\n    {\n        gBattlescriptCurrInstr = failJump;\n    }\n    else\n    {\n        if (gBattleMons[gBattlerTarget].status1 & ((u8)(~STATUS1_SLEEP)))\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST_STATUSED;\n        else\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST;\n\n        gBattleMons[gBattlerTarget].status1 = STATUS1_SLEEP_TURN(3);\n        BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_jumpifnotfirstturn(void)\n{\n    const u8 *failJump = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n\n    if (gDisableStructs[gBattlerAttacker].isFirstTurn)\n        gBattlescriptCurrInstr += 5;\n    else\n        gBattlescriptCurrInstr = failJump;\n}\n\nstatic void Cmd_nop(void)\n{\n    gBattlescriptCurrInstr++;\n}\n\nbool8 UproarWakeUpCheck(u8 battlerId)\n{\n    s32 i;\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || gBattleMons[battlerId].ability == ABILITY_SOUNDPROOF)\n            continue;\n\n        gBattleScripting.battler = i;\n\n        if (gBattlerTarget == 0xFF)\n            gBattlerTarget = i;\n        else if (gBattlerTarget == i)\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_SLEEP_UPROAR;\n        else\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_KEPT_AWAKE;\n\n        break;\n    }\n\n    if (i == gBattlersCount)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic void Cmd_jumpifcantmakeasleep(void)\n{\n    const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n\n    if (UproarWakeUpCheck(gBattlerTarget))\n    {\n        gBattlescriptCurrInstr = jumpPtr;\n    }\n    else if (gBattleMons[gBattlerTarget].ability == ABILITY_INSOMNIA\n            || gBattleMons[gBattlerTarget].ability == ABILITY_VITAL_SPIRIT)\n    {\n        gLastUsedAbility = gBattleMons[gBattlerTarget].ability;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAYED_AWAKE_USING;\n        gBattlescriptCurrInstr = jumpPtr;\n        RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);\n    }\n    else\n    {\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_stockpile(void)\n{\n    if (gDisableStructs[gBattlerAttacker].stockpileCounter == 3)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_STOCKPILE;\n    }\n    else\n    {\n        gDisableStructs[gBattlerAttacker].stockpileCounter++;\n\n        PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter)\n\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STOCKPILED;\n    }\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_stockpiletobasedamage(void)\n{\n    const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0)\n    {\n        gBattlescriptCurrInstr = jumpPtr;\n    }\n    else\n    {\n        if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED)\n        {\n            gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove,\n                                                    gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)], 0,\n                                                    0, gBattlerAttacker, gBattlerTarget)\n                                * gDisableStructs[gBattlerAttacker].stockpileCounter;\n            gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter;\n\n            if (gProtectStructs[gBattlerAttacker].helpingHand)\n                gBattleMoveDamage = gBattleMoveDamage * 15 / 10;\n        }\n\n        gDisableStructs[gBattlerAttacker].stockpileCounter = 0;\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_stockpiletohpheal(void)\n{\n    const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n\n    if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0)\n    {\n        gBattlescriptCurrInstr = jumpPtr;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FAILED;\n    }\n    else if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp)\n    {\n        gDisableStructs[gBattlerAttacker].stockpileCounter = 0;\n        gBattlescriptCurrInstr = jumpPtr;\n        gBattlerTarget = gBattlerAttacker;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FULL_HP;\n    }\n    else\n    {\n        gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter));\n\n        if (gBattleMoveDamage == 0)\n            gBattleMoveDamage = 1;\n        gBattleMoveDamage *= -1;\n\n        gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter;\n        gDisableStructs[gBattlerAttacker].stockpileCounter = 0;\n        gBattlescriptCurrInstr += 5;\n        gBattlerTarget = gBattlerAttacker;\n    }\n}\n\nstatic void Cmd_negativedamage(void)\n{\n    gBattleMoveDamage = -(gHpDealt / 2);\n    if (gBattleMoveDamage == 0)\n        gBattleMoveDamage = -1;\n\n    gBattlescriptCurrInstr++;\n}\n\n#define STAT_CHANGE_WORKED      0\n#define STAT_CHANGE_DIDNT_WORK  1\n\nstatic u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr)\n{\n    bool8 certain = FALSE;\n    bool8 notProtectAffected = FALSE;\n    u32 index;\n\n    if (flags & MOVE_EFFECT_AFFECTS_USER)\n        gActiveBattler = gBattlerAttacker;\n    else\n        gActiveBattler = gBattlerTarget;\n\n    flags &= ~MOVE_EFFECT_AFFECTS_USER;\n\n    if (flags & MOVE_EFFECT_CERTAIN)\n        certain++;\n    flags &= ~MOVE_EFFECT_CERTAIN;\n\n    if (flags & STAT_CHANGE_NOT_PROTECT_AFFECTED)\n        notProtectAffected++;\n    flags &= ~STAT_CHANGE_NOT_PROTECT_AFFECTED;\n\n    PREPARE_STAT_BUFFER(gBattleTextBuff1, statId)\n\n    if (statValue <= -1) // Stat decrease.\n    {\n        if (gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer\n            && !certain && gCurrentMove != MOVE_CURSE)\n        {\n            if (flags == STAT_CHANGE_ALLOW_PTR)\n            {\n                if (gSpecialStatuses[gActiveBattler].statLowered)\n                {\n                    gBattlescriptCurrInstr = BS_ptr;\n                }\n                else\n                {\n                    BattleScriptPush(BS_ptr);\n                    gBattleScripting.battler = gActiveBattler;\n                    gBattlescriptCurrInstr = BattleScript_MistProtected;\n                    gSpecialStatuses[gActiveBattler].statLowered = 1;\n                }\n            }\n            return STAT_CHANGE_DIDNT_WORK;\n        }\n        else if (gCurrentMove != MOVE_CURSE\n                 && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(0))\n        {\n            gBattlescriptCurrInstr = BattleScript_ButItFailed;\n            return STAT_CHANGE_DIDNT_WORK;\n        }\n        else if ((gBattleMons[gActiveBattler].ability == ABILITY_CLEAR_BODY\n                  || gBattleMons[gActiveBattler].ability == ABILITY_WHITE_SMOKE)\n                 && !certain && gCurrentMove != MOVE_CURSE)\n        {\n            if (flags == STAT_CHANGE_ALLOW_PTR)\n            {\n                if (gSpecialStatuses[gActiveBattler].statLowered)\n                {\n                    gBattlescriptCurrInstr = BS_ptr;\n                }\n                else\n                {\n                    BattleScriptPush(BS_ptr);\n                    gBattleScripting.battler = gActiveBattler;\n                    gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss;\n                    gLastUsedAbility = gBattleMons[gActiveBattler].ability;\n                    RecordAbilityBattle(gActiveBattler, gLastUsedAbility);\n                    gSpecialStatuses[gActiveBattler].statLowered = 1;\n                }\n            }\n            return STAT_CHANGE_DIDNT_WORK;\n        }\n        else if (gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE\n                 && !certain && statId == STAT_ACC)\n        {\n            if (flags == STAT_CHANGE_ALLOW_PTR)\n            {\n                BattleScriptPush(BS_ptr);\n                gBattleScripting.battler = gActiveBattler;\n                gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss;\n                gLastUsedAbility = gBattleMons[gActiveBattler].ability;\n                RecordAbilityBattle(gActiveBattler, gLastUsedAbility);\n            }\n            return STAT_CHANGE_DIDNT_WORK;\n        }\n        else if (gBattleMons[gActiveBattler].ability == ABILITY_HYPER_CUTTER\n                 && !certain && statId == STAT_ATK)\n        {\n            if (flags == STAT_CHANGE_ALLOW_PTR)\n            {\n                BattleScriptPush(BS_ptr);\n                gBattleScripting.battler = gActiveBattler;\n                gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss;\n                gLastUsedAbility = gBattleMons[gActiveBattler].ability;\n                RecordAbilityBattle(gActiveBattler, gLastUsedAbility);\n            }\n            return STAT_CHANGE_DIDNT_WORK;\n        }\n        else if (gBattleMons[gActiveBattler].ability == ABILITY_SHIELD_DUST && flags == 0)\n        {\n            return STAT_CHANGE_DIDNT_WORK;\n        }\n        else // try to decrease\n        {\n            statValue = -GET_STAT_BUFF_VALUE(statValue);\n            gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN;\n            index = 1;\n            if (statValue == -2)\n            {\n                gBattleTextBuff2[1] = B_BUFF_STRING;\n                gBattleTextBuff2[2] = STRINGID_STATHARSHLY;\n                gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8;\n                index = 4;\n            }\n            gBattleTextBuff2[index++] = B_BUFF_STRING;\n            gBattleTextBuff2[index++] = STRINGID_STATFELL;\n            gBattleTextBuff2[index++] = STRINGID_STATFELL >> 8;\n            gBattleTextBuff2[index] = B_BUFF_EOS;\n\n            if (gBattleMons[gActiveBattler].statStages[statId] == MIN_STAT_STAGE)\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_DECREASE;\n            else\n                gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); // B_MSG_ATTACKER_STAT_FELL or B_MSG_DEFENDER_STAT_FELL\n        }\n    }\n    else // stat increase\n    {\n        statValue = GET_STAT_BUFF_VALUE(statValue);\n        gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN;\n        index = 1;\n        if (statValue == 2)\n        {\n            gBattleTextBuff2[1] = B_BUFF_STRING;\n            gBattleTextBuff2[2] = STRINGID_STATSHARPLY;\n            gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8;\n            index = 4;\n        }\n        gBattleTextBuff2[index++] = B_BUFF_STRING;\n        gBattleTextBuff2[index++] = STRINGID_STATROSE;\n        gBattleTextBuff2[index++] = STRINGID_STATROSE >> 8;\n        gBattleTextBuff2[index] = B_BUFF_EOS;\n\n        if (gBattleMons[gActiveBattler].statStages[statId] == MAX_STAT_STAGE)\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_INCREASE;\n        else\n            gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); // B_MSG_ATTACKER_STAT_ROSE or B_MSG_DEFENDER_STAT_ROSE\n    }\n\n    gBattleMons[gActiveBattler].statStages[statId] += statValue;\n    if (gBattleMons[gActiveBattler].statStages[statId] < MIN_STAT_STAGE)\n        gBattleMons[gActiveBattler].statStages[statId] = MIN_STAT_STAGE;\n    if (gBattleMons[gActiveBattler].statStages[statId] > MAX_STAT_STAGE)\n        gBattleMons[gActiveBattler].statStages[statId] = MAX_STAT_STAGE;\n\n    if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && flags & STAT_CHANGE_ALLOW_PTR)\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n\n    if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && !(flags & STAT_CHANGE_ALLOW_PTR))\n        return STAT_CHANGE_DIDNT_WORK;\n\n    return STAT_CHANGE_WORKED;\n}\n\nstatic void Cmd_statbuffchange(void)\n{\n    const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 2);\n    if (ChangeStatBuffs(gBattleScripting.statChanger & 0xF0, GET_STAT_BUFF_ID(gBattleScripting.statChanger), gBattlescriptCurrInstr[1], jumpPtr) == STAT_CHANGE_WORKED)\n        gBattlescriptCurrInstr += 6;\n}\n\n// Haze\nstatic void Cmd_normalisebuffs(void)\n{\n    s32 i, j;\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        for (j = 0; j < NUM_BATTLE_STATS; j++)\n            gBattleMons[i].statStages[j] = DEFAULT_STAT_STAGE;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_setbide(void)\n{\n    gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS;\n    gLockedMoves[gBattlerAttacker] = gCurrentMove;\n    gTakenDmg[gBattlerAttacker] = 0;\n    gBattleMons[gBattlerAttacker].status2 |= STATUS2_BIDE_TURN(2);\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_confuseifrepeatingattackends(void)\n{\n    if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE))\n        gBattleCommunication[MOVE_EFFECT_BYTE] = (MOVE_EFFECT_THRASH | MOVE_EFFECT_AFFECTS_USER);\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_setmultihitcounter(void)\n{\n    if (gBattlescriptCurrInstr[1])\n    {\n        gMultiHitCounter = gBattlescriptCurrInstr[1];\n    }\n    else\n    {\n        gMultiHitCounter = Random() & 3;\n        if (gMultiHitCounter > 1)\n            gMultiHitCounter = (Random() & 3) + 2;\n        else\n            gMultiHitCounter += 2;\n    }\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_initmultihitstring(void)\n{\n    PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0)\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic bool8 TryDoForceSwitchOut(void)\n{\n    if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)\n    {\n        *(gBattleStruct->battlerPartyIndexes + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget];\n    }\n    else\n    {\n        u16 random = Random() & 0xFF;\n        if ((u32)((random * (gBattleMons[gBattlerAttacker].level + gBattleMons[gBattlerTarget].level) >> 8) + 1) <= (gBattleMons[gBattlerTarget].level / 4))\n        {\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n            return FALSE;\n        }\n        *(gBattleStruct->battlerPartyIndexes + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget];\n    }\n\n    gBattlescriptCurrInstr = BattleScript_SuccessForceOut;\n    return TRUE;\n}\n\n#define MON_CAN_BATTLE(mon) (((GetMonData(mon, MON_DATA_SPECIES) && GetMonData(mon, MON_DATA_IS_EGG) != TRUE && GetMonData(mon, MON_DATA_HP))))\n\nstatic void Cmd_forcerandomswitch(void)\n{\n    if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n    {\n        u32 i;\n        struct Pokemon *party;\n        u8 valid;\n        u8 val;\n\n        if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)\n            party = gPlayerParty;\n        else\n            party = gEnemyParty;\n\n        if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n        {\n            valid = 0;\n            val = 0;\n            if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gBattlerTarget)) == 1)\n                val = PARTY_SIZE / 2;\n            for (i = val; i < val + (PARTY_SIZE / 2); i++)\n            {\n                if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE\n                 && !GetMonData(&party[i], MON_DATA_IS_EGG)\n                 && GetMonData(&party[i], MON_DATA_HP) != 0)\n                    ++valid;\n            }\n        }\n        else\n        {\n            valid = 0;\n            for (i = 0; i < PARTY_SIZE; i++)\n            {\n                if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE\n                 && !GetMonData(&party[i], MON_DATA_IS_EGG)\n                 && GetMonData(&party[i], MON_DATA_HP) != 0)\n                    ++valid;\n            }\n        }\n\n        // Fails if there's only 1 mon left in single battle or there's less than 3 left in non-multi double battle.\n        if ((valid < 2 && (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE)\n         || (valid < 3 && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)))\n        {\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        }\n        else if (TryDoForceSwitchOut())\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n            {\n                do\n                {\n                    val = Random() % (PARTY_SIZE / 2);\n                    if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gBattlerTarget)) == 1)\n                        i = val + (PARTY_SIZE / 2);\n                    else\n                        i = val;\n                }\n                while (i == gBattlerPartyIndexes[gBattlerTarget]\n                      || i == gBattlerPartyIndexes[gBattlerTarget ^ 2]\n                      || !MON_CAN_BATTLE(&party[i]));\n            }\n            else\n            {\n                if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n                {\n                    do\n                    {\n                        i = Random() % PARTY_SIZE;\n                    }\n                    while (i == gBattlerPartyIndexes[gBattlerTarget]\n                        || i == gBattlerPartyIndexes[gBattlerTarget ^ 2]\n                        || !MON_CAN_BATTLE(&party[i]));\n                }\n                else\n                {\n                    do\n                    {\n                        i = Random() % PARTY_SIZE;\n                    }\n                    while (i == gBattlerPartyIndexes[gBattlerTarget]\n                        || !MON_CAN_BATTLE(&party[i]));\n                }\n            }\n            *(gBattleStruct->monToSwitchIntoId + gBattlerTarget) = i;\n            if (!IsMultiBattle())\n                UpdatePartyOwnerOnSwitch_NonMulti(gBattlerTarget);\n            SwitchPartyOrderLinkMulti(gBattlerTarget, i, 0);\n            SwitchPartyOrderLinkMulti(gBattlerTarget ^ BIT_FLANK, i, 1);\n        }\n    }\n    else\n    {\n        TryDoForceSwitchOut();\n    }\n}\n\n// Randomly changes user's type to one of its moves' type\nstatic void Cmd_tryconversiontypechange(void)\n{\n    u8 validMoves = 0;\n    u8 moveChecked;\n    u8 moveType;\n\n    while (validMoves < MAX_MON_MOVES)\n    {\n        if (gBattleMons[gBattlerAttacker].moves[validMoves] == MOVE_NONE)\n            break;\n\n        validMoves++;\n    }\n\n    for (moveChecked = 0; moveChecked < validMoves; moveChecked++)\n    {\n        moveType = gBattleMoves[gBattleMons[gBattlerAttacker].moves[moveChecked]].type;\n\n        if (moveType == TYPE_MYSTERY)\n        {\n            if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST))\n                moveType = TYPE_GHOST;\n            else\n                moveType = TYPE_NORMAL;\n        }\n        if (moveType != gBattleMons[gBattlerAttacker].type1\n            && moveType != gBattleMons[gBattlerAttacker].type2)\n        {\n            break;\n        }\n    }\n\n    if (moveChecked == validMoves)\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        do\n        {\n            while ((moveChecked = Random() & (MAX_MON_MOVES - 1)) >= validMoves);\n\n            moveType = gBattleMoves[gBattleMons[gBattlerAttacker].moves[moveChecked]].type;\n\n            if (moveType == TYPE_MYSTERY)\n            {\n                if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST))\n                    moveType = TYPE_GHOST;\n                else\n                    moveType = TYPE_NORMAL;\n            }\n        }\n        while (moveType == gBattleMons[gBattlerAttacker].type1 || moveType == gBattleMons[gBattlerAttacker].type2);\n\n        SET_BATTLER_TYPE(gBattlerAttacker, moveType);\n        PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType);\n\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_givepaydaymoney(void)\n{\n    if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gPaydayMoney != 0)\n    {\n        u32 bonusMoney = gPaydayMoney * gBattleStruct->moneyMultiplier;\n        AddMoney(&gSaveBlock1Ptr->money, bonusMoney);\n\n        PREPARE_HWORD_NUMBER_BUFFER(gBattleTextBuff1, 5, bonusMoney)\n\n        BattleScriptPush(gBattlescriptCurrInstr + 1);\n        gBattlescriptCurrInstr = BattleScript_PrintPayDayMoneyString;\n    }\n    else\n    {\n        gBattlescriptCurrInstr++;\n    }\n}\n\nstatic void Cmd_setlightscreen(void)\n{\n    if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_LIGHTSCREEN)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED;\n    }\n    else\n    {\n        gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_LIGHTSCREEN;\n        gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenTimer = 5;\n        gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenBattlerId = gBattlerAttacker;\n\n        if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2)\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE;\n        else\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_SINGLE;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_tryKO(void)\n{\n    u8 holdEffect, param;\n\n    if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY)\n    {\n       holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect;\n       param = gEnigmaBerries[gBattlerTarget].holdEffectParam;\n    }\n    else\n    {\n        holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item);\n        param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item);\n    }\n\n    gPotentialItemEffectBattler = gBattlerTarget;\n\n    if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param)\n    {\n        RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_FOCUS_BAND);\n        gSpecialStatuses[gBattlerTarget].focusBanded = 1;\n    }\n\n    if (gBattleMons[gBattlerTarget].ability == ABILITY_STURDY)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gLastUsedAbility = ABILITY_STURDY;\n        gBattlescriptCurrInstr = BattleScript_SturdyPreventsOHKO;\n        RecordAbilityBattle(gBattlerTarget, ABILITY_STURDY);\n    }\n    else\n    {\n        u16 chance;\n        if (!(gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS))\n        {\n            chance = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level);\n            if (Random() % 100 + 1 < chance && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)\n                chance = TRUE;\n            else\n                chance = FALSE;\n        }\n        else if (gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker\n                 && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)\n        {\n            chance = TRUE;\n        }\n        else\n        {\n            chance = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level);\n            if (Random() % 100 + 1 < chance && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)\n                chance = TRUE;\n            else\n                chance = FALSE;\n        }\n        if (chance)\n        {\n            if (gProtectStructs[gBattlerTarget].endured)\n            {\n                gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1;\n                gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED;\n            }\n            else if (gSpecialStatuses[gBattlerTarget].focusBanded)\n            {\n                gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1;\n                gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON;\n                gLastUsedItem = gBattleMons[gBattlerTarget].item;\n            }\n            else\n            {\n                gBattleMoveDamage = gBattleMons[gBattlerTarget].hp;\n                gMoveResultFlags |= MOVE_RESULT_ONE_HIT_KO;\n            }\n            gBattlescriptCurrInstr += 5;\n        }\n        else\n        {\n            gMoveResultFlags |= MOVE_RESULT_MISSED;\n            if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_MISS;\n            else\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_UNAFFECTED;\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        }\n    }\n}\n\n// Super Fang\nstatic void Cmd_damagetohalftargethp(void)\n{\n    gBattleMoveDamage = gBattleMons[gBattlerTarget].hp / 2;\n    if (gBattleMoveDamage == 0)\n        gBattleMoveDamage = 1;\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_setsandstorm(void)\n{\n    if (gBattleWeather & B_WEATHER_SANDSTORM)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED;\n    }\n    else\n    {\n        gBattleWeather = B_WEATHER_SANDSTORM_TEMPORARY;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SANDSTORM;\n        gWishFutureKnock.weatherDuration = 5;\n    }\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_weatherdamage(void)\n{\n    if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags)\n     && (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT))\n    {\n        gBattleMoveDamage = 0;\n        gBattlescriptCurrInstr++;\n        return;\n    }\n    if (WEATHER_HAS_EFFECT)\n    {\n        if (gBattleWeather & B_WEATHER_SANDSTORM)\n        {\n            if (gBattleMons[gBattlerAttacker].type1 != TYPE_ROCK\n                && gBattleMons[gBattlerAttacker].type1 != TYPE_STEEL\n                && gBattleMons[gBattlerAttacker].type1 != TYPE_GROUND\n                && gBattleMons[gBattlerAttacker].type2 != TYPE_ROCK\n                && gBattleMons[gBattlerAttacker].type2 != TYPE_STEEL\n                && gBattleMons[gBattlerAttacker].type2 != TYPE_GROUND\n                && gBattleMons[gBattlerAttacker].ability != ABILITY_SAND_VEIL\n                && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND)\n                && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER))\n            {\n                gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16;\n                if (gBattleMoveDamage == 0)\n                    gBattleMoveDamage = 1;\n            }\n            else\n            {\n                gBattleMoveDamage = 0;\n            }\n        }\n        if (gBattleWeather & B_WEATHER_HAIL)\n        {\n            if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE)\n                && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND)\n                && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER))\n            {\n                gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16;\n                if (gBattleMoveDamage == 0)\n                    gBattleMoveDamage = 1;\n            }\n            else\n            {\n                gBattleMoveDamage = 0;\n            }\n        }\n    }\n    else\n    {\n        gBattleMoveDamage = 0;\n    }\n\n    if (gAbsentBattlerFlags & gBitTable[gBattlerAttacker])\n        gBattleMoveDamage = 0;\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_tryinfatuating(void)\n{\n    struct Pokemon *monAttacker, *monTarget;\n    u16 speciesAttacker, speciesTarget;\n    u32 personalityAttacker, personalityTarget;\n\n    if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n        monAttacker = &gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]];\n    else\n        monAttacker = &gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]];\n\n    if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)\n        monTarget = &gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]];\n    else\n        monTarget = &gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]];\n\n    speciesAttacker = GetMonData(monAttacker, MON_DATA_SPECIES);\n    personalityAttacker = GetMonData(monAttacker, MON_DATA_PERSONALITY);\n\n    speciesTarget = GetMonData(monTarget, MON_DATA_SPECIES);\n    personalityTarget = GetMonData(monTarget, MON_DATA_PERSONALITY);\n\n    if (gBattleMons[gBattlerTarget].ability == ABILITY_OBLIVIOUS)\n    {\n        gBattlescriptCurrInstr = BattleScript_ObliviousPreventsAttraction;\n        gLastUsedAbility = ABILITY_OBLIVIOUS;\n        RecordAbilityBattle(gBattlerTarget, ABILITY_OBLIVIOUS);\n    }\n    else\n    {\n        if (GetGenderFromSpeciesAndPersonality(speciesAttacker, personalityAttacker) == GetGenderFromSpeciesAndPersonality(speciesTarget, personalityTarget)\n            || gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION\n            || GetGenderFromSpeciesAndPersonality(speciesAttacker, personalityAttacker) == MON_GENDERLESS\n            || GetGenderFromSpeciesAndPersonality(speciesTarget, personalityTarget) == MON_GENDERLESS)\n        {\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        }\n        else\n        {\n            gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker);\n            gBattlescriptCurrInstr += 5;\n        }\n    }\n}\n\nstatic void Cmd_updatestatusicon(void)\n{\n    if (gBattleControllerExecFlags)\n        return;\n\n    if (gBattlescriptCurrInstr[1] == BS_PLAYER2)\n    {\n        for (gActiveBattler = gBattleControllerExecFlags; gActiveBattler < gBattlersCount; gActiveBattler++)\n        {\n            if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler]))\n            {\n                BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n        }\n        gBattlescriptCurrInstr += 2;\n    }\n    else if (gBattlescriptCurrInstr[1] == BS_ATTACKER_WITH_PARTNER)\n    {\n        gActiveBattler = gBattlerAttacker;\n        if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler]))\n        {\n            BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2);\n            MarkBattlerForControllerExec(gActiveBattler);\n        }\n        if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE))\n        {\n            gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK);\n            if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler]))\n            {\n                BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n        }\n        gBattlescriptCurrInstr += 2;\n    }\n    else\n    {\n\n        gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n        BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr += 2;\n    }\n}\n\nstatic void Cmd_setmist(void)\n{\n    if (gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistTimer)\n    {\n        gMoveResultFlags |= MOVE_RESULT_FAILED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MIST_FAILED;\n    }\n    else\n    {\n        gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistTimer = 5;\n        gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistBattlerId = gBattlerAttacker;\n        gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_MIST;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_MIST;\n    }\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_setfocusenergy(void)\n{\n    if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY)\n    {\n        gMoveResultFlags |= MOVE_RESULT_FAILED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FOCUS_ENERGY_FAILED;\n    }\n    else\n    {\n        gBattleMons[gBattlerAttacker].status2 |= STATUS2_FOCUS_ENERGY;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED;\n    }\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_transformdataexecution(void)\n{\n    gChosenMove = MOVE_UNAVAILABLE;\n    gBattlescriptCurrInstr++;\n    if (gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED\n        || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)\n    {\n        gMoveResultFlags |= MOVE_RESULT_FAILED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORM_FAILED;\n    }\n    else\n    {\n        s32 i;\n        u8 *battleMonAttacker, *battleMonTarget;\n\n        gBattleMons[gBattlerAttacker].status2 |= STATUS2_TRANSFORMED;\n        gDisableStructs[gBattlerAttacker].disabledMove = MOVE_NONE;\n        gDisableStructs[gBattlerAttacker].disableTimer = 0;\n        gDisableStructs[gBattlerAttacker].transformedMonPersonality = gBattleMons[gBattlerTarget].personality;\n        gDisableStructs[gBattlerAttacker].mimickedMoves = 0;\n\n        PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].species)\n\n        battleMonAttacker = (u8 *)(&gBattleMons[gBattlerAttacker]);\n        battleMonTarget = (u8 *)(&gBattleMons[gBattlerTarget]);\n\n        for (i = 0; i < offsetof(struct BattlePokemon, pp); i++)\n            battleMonAttacker[i] = battleMonTarget[i];\n\n        for (i = 0; i < MAX_MON_MOVES; i++)\n        {\n            if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].pp < 5)\n                gBattleMons[gBattlerAttacker].pp[i] = gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].pp;\n            else\n                gBattleMons[gBattlerAttacker].pp[i] = 5;\n        }\n\n        gActiveBattler = gBattlerAttacker;\n        BtlController_EmitResetActionMoveSelection(BUFFER_A, RESET_MOVE_SELECTION);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORMED;\n    }\n}\n\nstatic void Cmd_setsubstitute(void)\n{\n    u32 hp = gBattleMons[gBattlerAttacker].maxHP / 4;\n    if (gBattleMons[gBattlerAttacker].maxHP / 4 == 0)\n        hp = 1;\n\n    if (gBattleMons[gBattlerAttacker].hp <= hp)\n    {\n        gBattleMoveDamage = 0;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SUBSTITUTE_FAILED;\n    }\n    else\n    {\n        gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; // one bit value will only work for pokemon which max hp can go to 1020(which is more than possible in games)\n        if (gBattleMoveDamage == 0)\n            gBattleMoveDamage = 1;\n\n        gBattleMons[gBattlerAttacker].status2 |= STATUS2_SUBSTITUTE;\n        gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED;\n        gDisableStructs[gBattlerAttacker].substituteHP = gBattleMoveDamage;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SUBSTITUTE;\n        gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic bool8 IsMoveUncopyableByMimic(u16 move)\n{\n    s32 i;\n    for (i = 0; sMovesForbiddenToCopy[i] != MIMIC_FORBIDDEN_END\n                && sMovesForbiddenToCopy[i] != move; i++);\n\n    return (sMovesForbiddenToCopy[i] != MIMIC_FORBIDDEN_END);\n}\n\nstatic void Cmd_mimicattackcopy(void)\n{\n    gChosenMove = MOVE_UNAVAILABLE;\n\n    if (IsMoveUncopyableByMimic(gLastMoves[gBattlerTarget])\n        || gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED\n        || gLastMoves[gBattlerTarget] == MOVE_NONE\n        || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE)\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        int i;\n\n        for (i = 0; i < MAX_MON_MOVES; i++)\n        {\n            if (gBattleMons[gBattlerAttacker].moves[i] == gLastMoves[gBattlerTarget])\n                break;\n        }\n\n        if (i == MAX_MON_MOVES)\n        {\n            gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastMoves[gBattlerTarget];\n            if (gBattleMoves[gLastMoves[gBattlerTarget]].pp < 5)\n                gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = gBattleMoves[gLastMoves[gBattlerTarget]].pp;\n            else\n                gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 5;\n\n            PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget])\n\n            gDisableStructs[gBattlerAttacker].mimickedMoves |= gBitTable[gCurrMovePos];\n            gBattlescriptCurrInstr += 5;\n        }\n        else\n        {\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        }\n    }\n}\n\nstatic void Cmd_metronome(void)\n{\n    while (TRUE)\n    {\n        s32 i;\n\n        gCurrentMove = (Random() & 0x1FF) + 1;\n        if (gCurrentMove >= MOVES_COUNT)\n            continue;\n\n        for (i = 0; i < MAX_MON_MOVES; i++); // ?\n\n        i = -1;\n        while (TRUE)\n        {\n            i++;\n            if (sMovesForbiddenToCopy[i] == gCurrentMove)\n                break;\n            if (sMovesForbiddenToCopy[i] == METRONOME_FORBIDDEN_END)\n                break;\n        }\n\n        if (sMovesForbiddenToCopy[i] == METRONOME_FORBIDDEN_END)\n        {\n            gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;\n            gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];\n            gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);\n            return;\n        }\n    }\n}\n\nstatic void Cmd_dmgtolevel(void)\n{\n    gBattleMoveDamage = gBattleMons[gBattlerAttacker].level;\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_psywavedamageeffect(void)\n{\n    s32 randDamage;\n\n    while ((randDamage = Random() % 16) > 10);\n\n    randDamage *= 10;\n    gBattleMoveDamage = gBattleMons[gBattlerAttacker].level * (randDamage + 50) / 100;\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_counterdamagecalculator(void)\n{\n    u8 sideAttacker = GetBattlerSide(gBattlerAttacker);\n    u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].physicalBattlerId);\n\n    if (gProtectStructs[gBattlerAttacker].physicalDmg\n        && sideAttacker != sideTarget\n        && gBattleMons[gProtectStructs[gBattlerAttacker].physicalBattlerId].hp)\n    {\n        gBattleMoveDamage = gProtectStructs[gBattlerAttacker].physicalDmg * 2;\n\n        if (gSideTimers[sideTarget].followmeTimer && gBattleMons[gSideTimers[sideTarget].followmeTarget].hp)\n            gBattlerTarget = gSideTimers[sideTarget].followmeTarget;\n        else\n            gBattlerTarget = gProtectStructs[gBattlerAttacker].physicalBattlerId;\n\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1;\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\n// A copy of Cmd_counterdamagecalculator with the physical -> special field changes\nstatic void Cmd_mirrorcoatdamagecalculator(void)\n{\n    u8 sideAttacker = GetBattlerSide(gBattlerAttacker);\n    u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].specialBattlerId);\n\n    if (gProtectStructs[gBattlerAttacker].specialDmg && sideAttacker != sideTarget && gBattleMons[gProtectStructs[gBattlerAttacker].specialBattlerId].hp)\n    {\n        gBattleMoveDamage = gProtectStructs[gBattlerAttacker].specialDmg * 2;\n\n        if (gSideTimers[sideTarget].followmeTimer && gBattleMons[gSideTimers[sideTarget].followmeTarget].hp)\n            gBattlerTarget = gSideTimers[sideTarget].followmeTarget;\n        else\n            gBattlerTarget = gProtectStructs[gBattlerAttacker].specialBattlerId;\n\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1;\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_disablelastusedattack(void)\n{\n    s32 i;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget])\n            break;\n    }\n    if (gDisableStructs[gBattlerTarget].disabledMove == MOVE_NONE\n        && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0)\n    {\n        PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].moves[i])\n\n        gDisableStructs[gBattlerTarget].disabledMove = gBattleMons[gBattlerTarget].moves[i];\n        gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 2;\n        gDisableStructs[gBattlerTarget].disableTimerStartValue = gDisableStructs[gBattlerTarget].disableTimer; // used to save the random amount of turns?\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_trysetencore(void)\n{\n    s32 i;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget])\n            break;\n    }\n\n    if (gLastMoves[gBattlerTarget] == MOVE_STRUGGLE\n        || gLastMoves[gBattlerTarget] == MOVE_ENCORE\n        || gLastMoves[gBattlerTarget] == MOVE_MIRROR_MOVE)\n    {\n        i = MAX_MON_MOVES;\n    }\n\n    if (gDisableStructs[gBattlerTarget].encoredMove == MOVE_NONE\n        && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0)\n    {\n        gDisableStructs[gBattlerTarget].encoredMove = gBattleMons[gBattlerTarget].moves[i];\n        gDisableStructs[gBattlerTarget].encoredMovePos = i;\n        gDisableStructs[gBattlerTarget].encoreTimer = (Random() & 3) + 3;\n        gDisableStructs[gBattlerTarget].encoreTimerStartValue = gDisableStructs[gBattlerTarget].encoreTimer;\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_painsplitdmgcalc(void)\n{\n    if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE))\n    {\n        s32 hpDiff = (gBattleMons[gBattlerAttacker].hp + gBattleMons[gBattlerTarget].hp) / 2;\n        s32 painSplitHp = gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - hpDiff;\n        u8 *storeLoc = (void *)(&gBattleScripting.painSplitHp);\n\n        storeLoc[0] = (painSplitHp);\n        storeLoc[1] = (painSplitHp & 0x0000FF00) >> 8;\n        storeLoc[2] = (painSplitHp & 0x00FF0000) >> 16;\n        storeLoc[3] = (painSplitHp & 0xFF000000) >> 24;\n\n        gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp - hpDiff;\n        gSpecialStatuses[gBattlerTarget].dmg = 0xFFFF;\n\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\n// Conversion 2\nstatic void Cmd_settypetorandomresistance(void)\n{\n    if (gLastLandedMoves[gBattlerAttacker] == MOVE_NONE\n     || gLastLandedMoves[gBattlerAttacker] == MOVE_UNAVAILABLE)\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else if (IsTwoTurnsMove(gLastLandedMoves[gBattlerAttacker])\n            && gBattleMons[gLastHitBy[gBattlerAttacker]].status2 & STATUS2_MULTIPLETURNS)\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        s32 i, j, rands;\n\n        for (rands = 0; rands < 1000; rands++)\n        {\n            while (((i = Random() % 128) > sizeof(gTypeEffectiveness) / 3));\n\n            i *= 3;\n\n            if (TYPE_EFFECT_ATK_TYPE(i) == gLastHitByType[gBattlerAttacker]\n                && TYPE_EFFECT_MULTIPLIER(i) <= TYPE_MUL_NOT_EFFECTIVE\n                && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i)))\n            {\n                SET_BATTLER_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i));\n                PREPARE_TYPE_BUFFER(gBattleTextBuff1, TYPE_EFFECT_DEF_TYPE(i));\n\n                gBattlescriptCurrInstr += 5;\n                return;\n            }\n        }\n\n        for (j = 0, rands = 0; rands < sizeof(gTypeEffectiveness); j += 3, rands += 3)\n        {\n            switch (TYPE_EFFECT_ATK_TYPE(j))\n            {\n            case TYPE_ENDTABLE:\n            case TYPE_FORESIGHT:\n                break;\n            default:\n                if (TYPE_EFFECT_ATK_TYPE(j) == gLastHitByType[gBattlerAttacker]\n                 && TYPE_EFFECT_MULTIPLIER(j) <= 5\n                 && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i)))\n                {\n                    SET_BATTLER_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(rands));\n                    PREPARE_TYPE_BUFFER(gBattleTextBuff1, TYPE_EFFECT_DEF_TYPE(rands))\n\n                    gBattlescriptCurrInstr += 5;\n                    return;\n                }\n                break;\n            }\n        }\n\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_setalwayshitflag(void)\n{\n    gStatuses3[gBattlerTarget] &= ~STATUS3_ALWAYS_HITS;\n    gStatuses3[gBattlerTarget] |= STATUS3_ALWAYS_HITS_TURN(2);\n    gDisableStructs[gBattlerTarget].battlerWithSureHit = gBattlerAttacker;\n    gBattlescriptCurrInstr++;\n}\n\n// Sketch\nstatic void Cmd_copymovepermanently(void)\n{\n    gChosenMove = MOVE_UNAVAILABLE;\n\n    if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED)\n        && gLastPrintedMoves[gBattlerTarget] != MOVE_STRUGGLE\n        && gLastPrintedMoves[gBattlerTarget] != MOVE_NONE\n        && gLastPrintedMoves[gBattlerTarget] != MOVE_UNAVAILABLE\n        && gLastPrintedMoves[gBattlerTarget] != MOVE_SKETCH)\n    {\n        s32 i;\n\n        for (i = 0; i < MAX_MON_MOVES; i++)\n        {\n            if (gBattleMons[gBattlerAttacker].moves[i] == MOVE_SKETCH)\n                continue;\n            if (gBattleMons[gBattlerAttacker].moves[i] == gLastPrintedMoves[gBattlerTarget])\n                break;\n        }\n\n        if (i != MAX_MON_MOVES)\n        {\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        }\n        else // sketch worked\n        {\n            struct MovePpInfo movePpData;\n\n            gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastPrintedMoves[gBattlerTarget];\n            gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = gBattleMoves[gLastPrintedMoves[gBattlerTarget]].pp;\n            gActiveBattler = gBattlerAttacker;\n\n            for (i = 0; i < MAX_MON_MOVES; i++)\n            {\n                movePpData.moves[i] = gBattleMons[gBattlerAttacker].moves[i];\n                movePpData.pp[i] = gBattleMons[gBattlerAttacker].pp[i];\n            }\n            movePpData.ppBonuses = gBattleMons[gBattlerAttacker].ppBonuses;\n\n            BtlController_EmitSetMonData(BUFFER_A, REQUEST_MOVES_PP_BATTLE, 0, sizeof(movePpData), &movePpData);\n            MarkBattlerForControllerExec(gActiveBattler);\n\n            PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastPrintedMoves[gBattlerTarget])\n\n            gBattlescriptCurrInstr += 5;\n        }\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic bool8 IsTwoTurnsMove(u16 move)\n{\n    if (gBattleMoves[move].effect == EFFECT_SKULL_BASH\n     || gBattleMoves[move].effect == EFFECT_RAZOR_WIND\n     || gBattleMoves[move].effect == EFFECT_SKY_ATTACK\n     || gBattleMoves[move].effect == EFFECT_SOLAR_BEAM\n     || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE\n     || gBattleMoves[move].effect == EFFECT_BIDE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic bool8 IsInvalidForSleepTalkOrAssist(u16 move)\n{\n    if (move == MOVE_NONE\n     || move == MOVE_SLEEP_TALK\n     || move == MOVE_ASSIST\n     || move == MOVE_MIRROR_MOVE\n     || move == MOVE_METRONOME)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic u8 AttacksThisTurn(u8 battlerId, u16 move) // Note: returns 1 if it's a charging turn, otherwise 2\n{\n    // first argument is unused\n    if (gBattleMoves[move].effect == EFFECT_SOLAR_BEAM\n        && (gBattleWeather & B_WEATHER_SUN))\n        return 2;\n\n    if (gBattleMoves[move].effect == EFFECT_SKULL_BASH\n     || gBattleMoves[move].effect == EFFECT_RAZOR_WIND\n     || gBattleMoves[move].effect == EFFECT_SKY_ATTACK\n     || gBattleMoves[move].effect == EFFECT_SOLAR_BEAM\n     || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE\n     || gBattleMoves[move].effect == EFFECT_BIDE)\n    {\n        if ((gHitMarker & HITMARKER_CHARGING))\n            return 1;\n    }\n    return 2;\n}\n\nstatic void Cmd_trychoosesleeptalkmove(void)\n{\n    s32 i;\n    u8 unusableMovesBits = 0;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        if (IsInvalidForSleepTalkOrAssist(gBattleMons[gBattlerAttacker].moves[i])\n            || gBattleMons[gBattlerAttacker].moves[i] == MOVE_FOCUS_PUNCH\n            || gBattleMons[gBattlerAttacker].moves[i] == MOVE_UPROAR\n            || IsTwoTurnsMove(gBattleMons[gBattlerAttacker].moves[i]))\n        {\n            unusableMovesBits |= gBitTable[i];\n        }\n    }\n\n    unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~MOVE_LIMITATION_PP);\n    if (unusableMovesBits == (1 << MAX_MON_MOVES) - 1) // all 4 moves cannot be chosen\n    {\n        gBattlescriptCurrInstr += 5;\n    }\n    else // at least one move can be chosen\n    {\n        u32 movePosition;\n\n        do\n        {\n            movePosition = Random() & (MAX_MON_MOVES - 1);\n        } while ((gBitTable[movePosition] & unusableMovesBits));\n\n        gCalledMove = gBattleMons[gBattlerAttacker].moves[movePosition];\n        gCurrMovePos = movePosition;\n        gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;\n        gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE);\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_setdestinybond(void)\n{\n    gBattleMons[gBattlerAttacker].status2 |= STATUS2_DESTINY_BOND;\n    gBattlescriptCurrInstr++;\n}\n\nstatic void TrySetDestinyBondToHappen(void)\n{\n    u8 sideAttacker = GetBattlerSide(gBattlerAttacker);\n    u8 sideTarget = GetBattlerSide(gBattlerTarget);\n    if (gBattleMons[gBattlerTarget].status2 & STATUS2_DESTINY_BOND\n        && sideAttacker != sideTarget\n        && !(gHitMarker & HITMARKER_GRUDGE))\n    {\n        gHitMarker |= HITMARKER_DESTINYBOND;\n    }\n}\n\nstatic void Cmd_trysetdestinybondtohappen(void)\n{\n    TrySetDestinyBondToHappen();\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_remaininghptopower(void)\n{\n    s32 i;\n    s32 hpFraction = GetScaledHPFraction(gBattleMons[gBattlerAttacker].hp, gBattleMons[gBattlerAttacker].maxHP, 48);\n\n    for (i = 0; i < (s32) sizeof(sFlailHpScaleToPowerTable); i += 2)\n    {\n        if (hpFraction <= sFlailHpScaleToPowerTable[i])\n            break;\n    }\n\n    gDynamicBasePower = sFlailHpScaleToPowerTable[i + 1];\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_tryspiteppreduce(void)\n{\n    if (gLastMoves[gBattlerTarget] != MOVE_NONE\n     && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE)\n    {\n        s32 i;\n\n        for (i = 0; i < MAX_MON_MOVES; i++)\n        {\n            if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i])\n                break;\n        }\n\n        if (i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] > 1)\n        {\n            s32 ppToDeduct = (Random() & 3) + 2;\n            if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct)\n                ppToDeduct = gBattleMons[gBattlerTarget].pp[i];\n\n            PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget])\n\n            ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, STR_CONV_MODE_LEFT_ALIGN, 1);\n\n            PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct)\n\n            gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct;\n            gActiveBattler = gBattlerTarget;\n\n            // if (MOVE_IS_PERMANENT(gActiveBattler, i)), but backwards\n            if (!(gDisableStructs[gActiveBattler].mimickedMoves & gBitTable[i])\n                && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED))\n            {\n                BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gActiveBattler].pp[i]), &gBattleMons[gActiveBattler].pp[i]);\n                MarkBattlerForControllerExec(gActiveBattler);\n            }\n\n            gBattlescriptCurrInstr += 5;\n\n            if (gBattleMons[gBattlerTarget].pp[i] == 0)\n                CancelMultiTurnMoves(gBattlerTarget);\n        }\n        else\n        {\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        }\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_healpartystatus(void)\n{\n    u32 zero = 0;\n    u8 toHeal = 0;\n\n    if (gCurrentMove == MOVE_HEAL_BELL)\n    {\n        struct Pokemon *party;\n        s32 i;\n\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL;\n\n        if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n            party = gPlayerParty;\n        else\n            party = gEnemyParty;\n\n        if (gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF)\n        {\n            gBattleMons[gBattlerAttacker].status1 = 0;\n            gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE;\n        }\n        else\n        {\n            RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability);\n            gBattleCommunication[MULTISTRING_CHOOSER] |= B_MSG_BELL_SOUNDPROOF_ATTACKER;\n        }\n\n        gActiveBattler = gBattleScripting.battler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK);\n\n        if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE\n            && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]))\n        {\n            if (gBattleMons[gActiveBattler].ability != ABILITY_SOUNDPROOF)\n            {\n                gBattleMons[gActiveBattler].status1 = 0;\n                gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE;\n            }\n            else\n            {\n                RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability);\n                gBattleCommunication[MULTISTRING_CHOOSER] |= B_MSG_BELL_SOUNDPROOF_PARTNER;\n            }\n        }\n\n        // Because the above MULTISTRING_CHOOSER are ORd, if both are set then it will be B_MSG_BELL_BOTH_SOUNDPROOF\n\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            u16 species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG);\n            u8 abilityNum = GetMonData(&party[i], MON_DATA_ABILITY_NUM);\n\n            if (species != SPECIES_NONE && species != SPECIES_EGG)\n            {\n                u8 ability;\n\n                if (gBattlerPartyIndexes[gBattlerAttacker] == i)\n                    ability = gBattleMons[gBattlerAttacker].ability;\n                else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE\n                         && gBattlerPartyIndexes[gActiveBattler] == i\n                         && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]))\n                    ability = gBattleMons[gActiveBattler].ability;\n                else\n                    ability = GetAbilityBySpecies(species, abilityNum);\n\n                if (ability != ABILITY_SOUNDPROOF)\n                    toHeal |= (1 << i);\n            }\n        }\n    }\n    else // Aromatherapy\n    {\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOOTHING_AROMA;\n        toHeal = (1 << PARTY_SIZE) - 1;\n\n        gBattleMons[gBattlerAttacker].status1 = 0;\n        gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE;\n\n        gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK);\n        if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE\n            && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]))\n        {\n            gBattleMons[gActiveBattler].status1 = 0;\n            gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE;\n        }\n\n    }\n\n    if (toHeal)\n    {\n        gActiveBattler = gBattlerAttacker;\n        BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, toHeal, sizeof(zero), &zero);\n        MarkBattlerForControllerExec(gActiveBattler);\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_cursetarget(void)\n{\n    if (gBattleMons[gBattlerTarget].status2 & STATUS2_CURSED)\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        gBattleMons[gBattlerTarget].status2 |= STATUS2_CURSED;\n        gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2;\n        if (gBattleMoveDamage == 0)\n            gBattleMoveDamage = 1;\n\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_trysetspikes(void)\n{\n    u8 targetSide = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;\n\n    if (gSideTimers[targetSide].spikesAmount == 3)\n    {\n        gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1;\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        gSideStatuses[targetSide] |= SIDE_STATUS_SPIKES;\n        gSideTimers[targetSide].spikesAmount++;\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_setforesight(void)\n{\n    gBattleMons[gBattlerTarget].status2 |= STATUS2_FORESIGHT;\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_trysetperishsong(void)\n{\n    s32 i;\n    s32 notAffectedCount = 0;\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if (gStatuses3[i] & STATUS3_PERISH_SONG\n            || gBattleMons[i].ability == ABILITY_SOUNDPROOF)\n        {\n            notAffectedCount++;\n        }\n        else\n        {\n            gStatuses3[i] |= STATUS3_PERISH_SONG;\n            gDisableStructs[i].perishSongTimer = 3;\n            gDisableStructs[i].perishSongTimerStartValue = 3;\n        }\n    }\n\n    PressurePPLoseOnUsingPerishSong(gBattlerAttacker);\n\n    if (notAffectedCount == gBattlersCount)\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    else\n        gBattlescriptCurrInstr += 5;\n}\n\nstatic void Cmd_rolloutdamagecalculation(void)\n{\n    if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n    {\n        CancelMultiTurnMoves(gBattlerAttacker);\n        gBattlescriptCurrInstr = BattleScript_MoveMissedPause;\n    }\n    else\n    {\n        s32 i;\n\n        if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) // first hit\n        {\n            gDisableStructs[gBattlerAttacker].rolloutTimer = 5;\n            gDisableStructs[gBattlerAttacker].rolloutTimerStartValue = 5;\n            gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS;\n            gLockedMoves[gBattlerAttacker] = gCurrentMove;\n        }\n        if (--gDisableStructs[gBattlerAttacker].rolloutTimer == 0) // last hit\n        {\n            gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS;\n        }\n\n        gDynamicBasePower = gBattleMoves[gCurrentMove].power;\n\n        for (i = 1; i < (5 - gDisableStructs[gBattlerAttacker].rolloutTimer); i++)\n            gDynamicBasePower *= 2;\n\n        if (gBattleMons[gBattlerAttacker].status2 & STATUS2_DEFENSE_CURL)\n            gDynamicBasePower *= 2;\n\n        gBattlescriptCurrInstr++;\n    }\n}\n\nstatic void Cmd_jumpifconfusedandstatmaxed(void)\n{\n    if (gBattleMons[gBattlerTarget].status2 & STATUS2_CONFUSION\n        && gBattleMons[gBattlerTarget].statStages[gBattlescriptCurrInstr[1]] == MAX_STAT_STAGE)\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);\n    else\n        gBattlescriptCurrInstr += 6;\n}\n\nstatic void Cmd_furycuttercalc(void)\n{\n    if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n    {\n        gDisableStructs[gBattlerAttacker].furyCutterCounter = 0;\n        gBattlescriptCurrInstr = BattleScript_MoveMissedPause;\n    }\n    else\n    {\n        s32 i;\n\n        if (gDisableStructs[gBattlerAttacker].furyCutterCounter != 5)\n            gDisableStructs[gBattlerAttacker].furyCutterCounter++;\n\n        gDynamicBasePower = gBattleMoves[gCurrentMove].power;\n\n        for (i = 1; i < gDisableStructs[gBattlerAttacker].furyCutterCounter; i++)\n            gDynamicBasePower *= 2;\n\n        gBattlescriptCurrInstr++;\n    }\n}\n\nstatic void Cmd_friendshiptodamagecalculation(void)\n{\n    if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN)\n        gDynamicBasePower = 10 * (gBattleMons[gBattlerAttacker].friendship) / 25;\n    else // EFFECT_FRUSTRATION\n        gDynamicBasePower = 10 * (255 - gBattleMons[gBattlerAttacker].friendship) / 25;\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_presentdamagecalculation(void)\n{\n    s32 rand = Random() & 0xFF;\n\n    if (rand < 102)\n        gDynamicBasePower = 40;\n    else if (rand < 178)\n        gDynamicBasePower = 80;\n    else if (rand < 204)\n        gDynamicBasePower = 120;\n    else\n    {\n        gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 4;\n        if (gBattleMoveDamage == 0)\n            gBattleMoveDamage = 1;\n        gBattleMoveDamage *= -1;\n    }\n    if (rand < 204)\n        gBattlescriptCurrInstr = BattleScript_HitFromCritCalc;\n    else if (gBattleMons[gBattlerTarget].maxHP == gBattleMons[gBattlerTarget].hp)\n        gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp;\n    else\n    {\n        gMoveResultFlags &= ~MOVE_RESULT_DOESNT_AFFECT_FOE;\n        gBattlescriptCurrInstr = BattleScript_PresentHealTarget;\n    }\n}\n\nstatic void Cmd_setsafeguard(void)\n{\n    if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_SAFEGUARD)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED;\n    }\n    else\n    {\n        gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_SAFEGUARD;\n        gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].safeguardTimer = 5;\n        gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].safeguardBattlerId = gBattlerAttacker;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_magnitudedamagecalculation(void)\n{\n    s32 magnitude = Random() % 100;\n\n    if (magnitude < 5)\n    {\n        gDynamicBasePower = 10;\n        magnitude = 4;\n    }\n    else if (magnitude < 15)\n    {\n        gDynamicBasePower = 30;\n        magnitude = 5;\n    }\n    else if (magnitude < 35)\n    {\n        gDynamicBasePower = 50;\n        magnitude = 6;\n    }\n    else if (magnitude < 65)\n    {\n        gDynamicBasePower = 70;\n        magnitude = 7;\n    }\n    else if (magnitude < 85)\n    {\n        gDynamicBasePower = 90;\n        magnitude = 8;\n    }\n    else if (magnitude < 95)\n    {\n        gDynamicBasePower = 110;\n        magnitude = 9;\n    }\n    else\n    {\n        gDynamicBasePower = 150;\n        magnitude = 10;\n    }\n\n    PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 2, magnitude)\n\n    for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++)\n    {\n        if (gBattlerTarget == gBattlerAttacker)\n            continue;\n        if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) // a valid target was found\n            break;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_jumpifnopursuitswitchdmg(void)\n{\n    if (gMultiHitCounter == 1)\n    {\n        if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n            gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        else\n            gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n    }\n    else\n    {\n        if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n            gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n        else\n            gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);\n    }\n\n    if (gChosenActionByBattler[gBattlerTarget] == B_ACTION_USE_MOVE\n        && gBattlerAttacker == *(gBattleStruct->moveTarget + gBattlerTarget)\n        && !(gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE))\n        && gBattleMons[gBattlerAttacker].hp\n        && !gDisableStructs[gBattlerTarget].truantCounter\n        && gChosenMoveByBattler[gBattlerTarget] == MOVE_PURSUIT)\n    {\n        s32 i;\n\n        for (i = 0; i < gBattlersCount; i++)\n        {\n            if (gBattlerByTurnOrder[i] == gBattlerTarget)\n                gActionsByTurnOrder[i] = B_ACTION_TRY_FINISH;\n        }\n\n        gCurrentMove = MOVE_PURSUIT;\n        gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerTarget);\n        gBattlescriptCurrInstr += 5;\n        gBattleScripting.animTurn = 1;\n        gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_setsunny(void)\n{\n    if (gBattleWeather & B_WEATHER_SUN)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED;\n    }\n    else\n    {\n        gBattleWeather = B_WEATHER_SUN_TEMPORARY;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SUNLIGHT;\n        gWishFutureKnock.weatherDuration = 5;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\n// Belly Drum\nstatic void Cmd_maxattackhalvehp(void)\n{\n    u32 halfHp = gBattleMons[gBattlerAttacker].maxHP / 2;\n\n    if (!(gBattleMons[gBattlerAttacker].maxHP / 2))\n        halfHp = 1;\n\n    if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] < MAX_STAT_STAGE\n        && gBattleMons[gBattlerAttacker].hp > halfHp)\n    {\n        gBattleMons[gBattlerAttacker].statStages[STAT_ATK] = MAX_STAT_STAGE;\n        gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2;\n        if (gBattleMoveDamage == 0)\n            gBattleMoveDamage = 1;\n\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\n// Psych Up\nstatic void Cmd_copyfoestats(void)\n{\n    s32 i;\n\n    for (i = 0; i < NUM_BATTLE_STATS; i++)\n    {\n        gBattleMons[gBattlerAttacker].statStages[i] = gBattleMons[gBattlerTarget].statStages[i];\n    }\n\n    gBattlescriptCurrInstr += 5; // Has an unused jump ptr(possibly for a failed attempt) parameter.\n}\n\nstatic void Cmd_rapidspinfree(void)\n{\n    if (gBattleMons[gBattlerAttacker].status2 & STATUS2_WRAPPED)\n    {\n        gBattleScripting.battler = gBattlerTarget;\n        gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED;\n        gBattlerTarget = *(gBattleStruct->wrappedBy + gBattlerAttacker);\n\n        gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN;\n        gBattleTextBuff1[1] = B_BUFF_MOVE;\n        gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gBattlerAttacker * 2 + 0);\n        gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gBattlerAttacker * 2 + 1);\n        gBattleTextBuff1[4] = B_BUFF_EOS;\n\n        BattleScriptPushCursor();\n        gBattlescriptCurrInstr = BattleScript_WrapFree;\n    }\n    else if (gStatuses3[gBattlerAttacker] & STATUS3_LEECHSEED)\n    {\n        gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED;\n        gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED_BATTLER;\n        BattleScriptPushCursor();\n        gBattlescriptCurrInstr = BattleScript_LeechSeedFree;\n    }\n    else if (gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_SPIKES)\n    {\n        gSideStatuses[GetBattlerSide(gBattlerAttacker)] &= ~SIDE_STATUS_SPIKES;\n        gSideTimers[GetBattlerSide(gBattlerAttacker)].spikesAmount = 0;\n        BattleScriptPushCursor();\n        gBattlescriptCurrInstr = BattleScript_SpikesFree;\n    }\n    else\n    {\n        gBattlescriptCurrInstr++;\n    }\n}\n\nstatic void Cmd_setdefensecurlbit(void)\n{\n    gBattleMons[gBattlerAttacker].status2 |= STATUS2_DEFENSE_CURL;\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_recoverbasedonsunlight(void)\n{\n    gBattlerTarget = gBattlerAttacker;\n\n    if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP)\n    {\n        if (gBattleWeather == 0 || !WEATHER_HAS_EFFECT)\n            gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2;\n        else if (gBattleWeather & B_WEATHER_SUN)\n            gBattleMoveDamage = 20 * gBattleMons[gBattlerAttacker].maxHP / 30;\n        else // not sunny weather\n            gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4;\n\n        if (gBattleMoveDamage == 0)\n            gBattleMoveDamage = 1;\n        gBattleMoveDamage *= -1;\n\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_hiddenpowercalc(void)\n{\n    s32 powerBits, typeBits;\n\n    powerBits = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1)\n              | ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0)\n              | ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1)\n              | ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2)\n              | ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3)\n              | ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4);\n    typeBits  = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0)\n              | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1)\n              | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2)\n              | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3)\n              | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4)\n              | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5);\n\n    gDynamicBasePower = (40 * powerBits) / 63 + 30;\n\n    // Subtract 3 instead of 1 below because 2 types are excluded (TYPE_NORMAL and TYPE_MYSTERY)\n    // The final + 1 skips past Normal, and the following conditional skips TYPE_MYSTERY\n    gBattleStruct->dynamicMoveType = ((NUMBER_OF_MON_TYPES - 3) * typeBits) / 63 + 1;\n    if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY)\n        gBattleStruct->dynamicMoveType++;\n    gBattleStruct->dynamicMoveType |= F_DYNAMIC_TYPE_1 | F_DYNAMIC_TYPE_2;\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_selectfirstvalidtarget(void)\n{\n    for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++)\n    {\n        if (gBattlerTarget == gBattlerAttacker)\n            continue;\n        if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget]))\n            break;\n    }\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_trysetfutureattack(void)\n{\n    if (gWishFutureKnock.futureSightCounter[gBattlerTarget] != 0)\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove;\n        gWishFutureKnock.futureSightAttacker[gBattlerTarget] = gBattlerAttacker;\n        gWishFutureKnock.futureSightCounter[gBattlerTarget] = 3;\n        gWishFutureKnock.futureSightDmg[gBattlerTarget] = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove,\n                                                    gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)], 0,\n                                                    0, gBattlerAttacker, gBattlerTarget);\n\n        if (gProtectStructs[gBattlerAttacker].helpingHand)\n            gWishFutureKnock.futureSightDmg[gBattlerTarget] = gWishFutureKnock.futureSightDmg[gBattlerTarget] * 15 / 10;\n\n        if (gCurrentMove == MOVE_DOOM_DESIRE)\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE;\n        else\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT;\n\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_trydobeatup(void)\n{\n    struct Pokemon *party;\n\n    if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n        party = gPlayerParty;\n    else\n        party = gEnemyParty;\n\n    if (gBattleMons[gBattlerTarget].hp == 0)\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        u8 beforeLoop = gBattleCommunication[0];\n        for (;gBattleCommunication[0] < PARTY_SIZE; gBattleCommunication[0]++)\n        {\n            if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP)\n                && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES_OR_EGG)\n                && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG\n                && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS))\n                break;\n        }\n        if (gBattleCommunication[0] < PARTY_SIZE)\n        {\n            PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattleCommunication[0])\n\n            gBattlescriptCurrInstr += 9;\n\n            gBattleMoveDamage = gSpeciesInfo[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack;\n            gBattleMoveDamage *= gBattleMoves[gCurrentMove].power;\n            gBattleMoveDamage *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2);\n            gBattleMoveDamage /= gSpeciesInfo[gBattleMons[gBattlerTarget].species].baseDefense;\n            gBattleMoveDamage = (gBattleMoveDamage / 50) + 2;\n            if (gProtectStructs[gBattlerAttacker].helpingHand)\n                gBattleMoveDamage = gBattleMoveDamage * 15 / 10;\n\n            gBattleCommunication[0]++;\n        }\n        else if (beforeLoop != 0)\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        else\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5);\n    }\n}\n\nstatic void Cmd_setsemiinvulnerablebit(void)\n{\n    switch (gCurrentMove)\n    {\n    case MOVE_FLY:\n    case MOVE_BOUNCE:\n        gStatuses3[gBattlerAttacker] |= STATUS3_ON_AIR;\n        break;\n    case MOVE_DIG:\n        gStatuses3[gBattlerAttacker] |= STATUS3_UNDERGROUND;\n        break;\n    case MOVE_DIVE:\n        gStatuses3[gBattlerAttacker] |= STATUS3_UNDERWATER;\n        break;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_clearsemiinvulnerablebit(void)\n{\n    switch (gCurrentMove)\n    {\n    case MOVE_FLY:\n    case MOVE_BOUNCE:\n        gStatuses3[gBattlerAttacker] &= ~STATUS3_ON_AIR;\n        break;\n    case MOVE_DIG:\n        gStatuses3[gBattlerAttacker] &= ~STATUS3_UNDERGROUND;\n        break;\n    case MOVE_DIVE:\n        gStatuses3[gBattlerAttacker] &= ~STATUS3_UNDERWATER;\n        break;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_setminimize(void)\n{\n    if (gHitMarker & HITMARKER_OBEYS)\n        gStatuses3[gBattlerAttacker] |= STATUS3_MINIMIZED;\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_sethail(void)\n{\n    if (gBattleWeather & B_WEATHER_HAIL)\n    {\n        gMoveResultFlags |= MOVE_RESULT_MISSED;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED;\n    }\n    else\n    {\n        gBattleWeather = B_WEATHER_HAIL_TEMPORARY;\n        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_HAIL;\n        gWishFutureKnock.weatherDuration = 5;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_trymemento(void)\n{\n    if (gBattleMons[gBattlerTarget].statStages[STAT_ATK] == MIN_STAT_STAGE\n        && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] == MIN_STAT_STAGE\n        && gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED)\n    {\n        // Failed, unprotected target already has minimum Attack and Special Attack.\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        // Success, drop user's HP bar to 0\n        gActiveBattler = gBattlerAttacker;\n        gBattleMoveDamage = gBattleMons[gActiveBattler].hp;\n        BtlController_EmitHealthBarUpdate(BUFFER_A, INSTANT_HP_BAR_DROP);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\n// Follow Me\nstatic void Cmd_setforcedtarget(void)\n{\n    gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTimer = 1;\n    gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTarget = gBattlerAttacker;\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_setcharge(void)\n{\n    gStatuses3[gBattlerAttacker] |= STATUS3_CHARGED_UP;\n    gDisableStructs[gBattlerAttacker].chargeTimer = 2;\n    gDisableStructs[gBattlerAttacker].chargeTimerStartValue = 2;\n    gBattlescriptCurrInstr++;\n}\n\n// Nature Power\nstatic void Cmd_callterrainattack(void)\n{\n    gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;\n    gCurrentMove = gNaturePowerMoves[gBattleTerrain];\n    gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);\n    BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]);\n    gBattlescriptCurrInstr++;\n}\n\n// Refresh\nstatic void Cmd_cureifburnedparalysedorpoisoned(void)\n{\n    if (gBattleMons[gBattlerAttacker].status1 & (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON))\n    {\n        gBattleMons[gBattlerAttacker].status1 = 0;\n        gBattlescriptCurrInstr += 5;\n        gActiveBattler = gBattlerAttacker;\n        BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1);\n        MarkBattlerForControllerExec(gActiveBattler);\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_settorment(void)\n{\n    if (gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT)\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT;\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_jumpifnodamage(void)\n{\n    if (gProtectStructs[gBattlerAttacker].physicalDmg || gProtectStructs[gBattlerAttacker].specialDmg)\n        gBattlescriptCurrInstr += 5;\n    else\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n}\n\nstatic void Cmd_settaunt(void)\n{\n    if (gDisableStructs[gBattlerTarget].tauntTimer == 0)\n    {\n        gDisableStructs[gBattlerTarget].tauntTimer = 2;\n        gDisableStructs[gBattlerTarget].tauntTimer2 = 2;\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_trysethelpinghand(void)\n{\n    gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK);\n\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE\n        && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget])\n        && !gProtectStructs[gBattlerAttacker].helpingHand\n        && !gProtectStructs[gBattlerTarget].helpingHand)\n    {\n        gProtectStructs[gBattlerTarget].helpingHand = 1;\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\n// Trick\nstatic void Cmd_tryswapitems(void)\n{\n    // opponent can't swap items with player in regular battles\n    if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER\n        || (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT\n            && !(gBattleTypeFlags & (BATTLE_TYPE_LINK\n                                  | BATTLE_TYPE_BATTLE_TOWER\n                                  | BATTLE_TYPE_EREADER_TRAINER))\n                && gTrainerBattleOpponent_A != TRAINER_SECRET_BASE))\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        u8 sideAttacker = GetBattlerSide(gBattlerAttacker);\n        u8 sideTarget = GetBattlerSide(gBattlerTarget);\n\n        // you can't swap items if they were knocked off in regular battles\n        if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK\n                             | BATTLE_TYPE_BATTLE_TOWER\n                             | BATTLE_TYPE_EREADER_TRAINER))\n            && gTrainerBattleOpponent_A != TRAINER_SECRET_BASE\n            && (gWishFutureKnock.knockedOffMons[sideAttacker] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]]\n                || gWishFutureKnock.knockedOffMons[sideTarget] & gBitTable[gBattlerPartyIndexes[gBattlerTarget]]))\n        {\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        }\n        // can't swap if two pokemon don't have an item\n        // or if either of them is an enigma berry or a mail\n        else if ((gBattleMons[gBattlerAttacker].item == ITEM_NONE && gBattleMons[gBattlerTarget].item == ITEM_NONE)\n                 || gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY\n                 || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY\n                 || IS_ITEM_MAIL(gBattleMons[gBattlerAttacker].item)\n                 || IS_ITEM_MAIL(gBattleMons[gBattlerTarget].item))\n        {\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        }\n        // check if ability prevents swapping\n        else if (gBattleMons[gBattlerTarget].ability == ABILITY_STICKY_HOLD)\n        {\n            gBattlescriptCurrInstr = BattleScript_StickyHoldActivates;\n            gLastUsedAbility = gBattleMons[gBattlerTarget].ability;\n            RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);\n        }\n        // took a while, but all checks passed and items can be safely swapped\n        else\n        {\n            u16 oldItemAtk, *newItemAtk;\n\n            newItemAtk = &gBattleStruct->changedItems[gBattlerAttacker];\n            oldItemAtk = gBattleMons[gBattlerAttacker].item;\n            *newItemAtk = gBattleMons[gBattlerTarget].item;\n\n            gBattleMons[gBattlerAttacker].item = ITEM_NONE;\n            gBattleMons[gBattlerTarget].item = oldItemAtk;\n\n            gActiveBattler = gBattlerAttacker;\n            BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(*newItemAtk), newItemAtk);\n            MarkBattlerForControllerExec(gBattlerAttacker);\n\n            gActiveBattler = gBattlerTarget;\n            BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item);\n            MarkBattlerForControllerExec(gBattlerTarget);\n\n            *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0;\n            *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0;\n\n            *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 0) = 0;\n            *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 1) = 0;\n\n            gBattlescriptCurrInstr += 5;\n\n            PREPARE_ITEM_BUFFER(gBattleTextBuff1, *newItemAtk)\n            PREPARE_ITEM_BUFFER(gBattleTextBuff2, oldItemAtk)\n\n            if (oldItemAtk != ITEM_NONE && *newItemAtk != ITEM_NONE)\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_BOTH;  // attacker's item -> <- target's item\n            else if (oldItemAtk == ITEM_NONE && *newItemAtk != ITEM_NONE)\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_TAKEN; // nothing -> <- target's item\n            else\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_GIVEN; // attacker's item -> <- nothing\n        }\n    }\n}\n\n// Role Play\nstatic void Cmd_trycopyability(void)\n{\n    if (gBattleMons[gBattlerTarget].ability != ABILITY_NONE\n        && gBattleMons[gBattlerTarget].ability != ABILITY_WONDER_GUARD)\n    {\n        gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability;\n        gLastUsedAbility = gBattleMons[gBattlerTarget].ability;\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_trywish(void)\n{\n    switch (gBattlescriptCurrInstr[1])\n    {\n    case 0: // use wish\n        if (gWishFutureKnock.wishCounter[gBattlerAttacker] == 0)\n        {\n            gWishFutureKnock.wishCounter[gBattlerAttacker] = 2;\n            gWishFutureKnock.wishMonId[gBattlerAttacker] = gBattlerPartyIndexes[gBattlerAttacker];\n            gBattlescriptCurrInstr += 6;\n        }\n        else\n        {\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);\n        }\n        break;\n    case 1: // heal effect\n        PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerTarget, gWishFutureKnock.wishMonId[gBattlerTarget])\n\n        gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2;\n        if (gBattleMoveDamage == 0)\n            gBattleMoveDamage = 1;\n        gBattleMoveDamage *= -1;\n\n        if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP)\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);\n        else\n            gBattlescriptCurrInstr += 6;\n\n        break;\n    }\n}\n\n// Ingrain\nstatic void Cmd_trysetroots(void)\n{\n    if (gStatuses3[gBattlerAttacker] & STATUS3_ROOTED)\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        gStatuses3[gBattlerAttacker] |= STATUS3_ROOTED;\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_doubledamagedealtifdamaged(void)\n{\n    if ((gProtectStructs[gBattlerAttacker].physicalDmg != 0\n         && gProtectStructs[gBattlerAttacker].physicalBattlerId == gBattlerTarget)\n        || (gProtectStructs[gBattlerAttacker].specialDmg != 0\n            && gProtectStructs[gBattlerAttacker].specialBattlerId == gBattlerTarget))\n    {\n        gBattleScripting.dmgMultiplier = 2;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_setyawn(void)\n{\n    if (gStatuses3[gBattlerTarget] & STATUS3_YAWN\n        || gBattleMons[gBattlerTarget].status1 & STATUS1_ANY)\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2);\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_setdamagetohealthdifference(void)\n{\n    if (gBattleMons[gBattlerTarget].hp <= gBattleMons[gBattlerAttacker].hp)\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - gBattleMons[gBattlerAttacker].hp;\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_scaledamagebyhealthratio(void)\n{\n    if (gDynamicBasePower == 0)\n    {\n        u8 power = gBattleMoves[gCurrentMove].power;\n        gDynamicBasePower = gBattleMons[gBattlerAttacker].hp * power / gBattleMons[gBattlerAttacker].maxHP;\n        if (gDynamicBasePower == 0)\n            gDynamicBasePower = 1;\n    }\n    gBattlescriptCurrInstr++;\n}\n\n// Skill Swap\nstatic void Cmd_tryswapabilities(void)\n{\n    if ((gBattleMons[gBattlerAttacker].ability == ABILITY_NONE\n        && gBattleMons[gBattlerTarget].ability == ABILITY_NONE)\n     || gBattleMons[gBattlerAttacker].ability == ABILITY_WONDER_GUARD\n     || gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD\n     || gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n     {\n         gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n     }\n    else\n    {\n        u8 abilityAtk = gBattleMons[gBattlerAttacker].ability;\n        gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability;\n        gBattleMons[gBattlerTarget].ability = abilityAtk;\n\n            gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_tryimprison(void)\n{\n    if ((gStatuses3[gBattlerAttacker] & STATUS3_IMPRISONED_OTHERS))\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        u8 battlerId, sideAttacker;\n\n        sideAttacker = GetBattlerSide(gBattlerAttacker);\n        PressurePPLoseOnUsingImprison(gBattlerAttacker);\n        for (battlerId = 0; battlerId < gBattlersCount; battlerId++)\n        {\n            if (sideAttacker != GetBattlerSide(battlerId))\n            {\n                s32 attackerMoveId;\n                for (attackerMoveId = 0; attackerMoveId < MAX_MON_MOVES; attackerMoveId++)\n                {\n                    s32 i;\n                    for (i = 0; i < MAX_MON_MOVES; i++)\n                    {\n                        if (gBattleMons[gBattlerAttacker].moves[attackerMoveId] == gBattleMons[battlerId].moves[i]\n                            && gBattleMons[gBattlerAttacker].moves[attackerMoveId] != MOVE_NONE)\n                            break;\n                    }\n                    if (i != MAX_MON_MOVES)\n                        break;\n                }\n                if (attackerMoveId != MAX_MON_MOVES)\n                {\n                    gStatuses3[gBattlerAttacker] |= STATUS3_IMPRISONED_OTHERS;\n                    gBattlescriptCurrInstr += 5;\n                    break;\n                }\n            }\n        }\n        if (battlerId == gBattlersCount) // In Generation 3 games, Imprison fails if the user doesn't share any moves with any of the foes\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_trysetgrudge(void)\n{\n    if (gStatuses3[gBattlerAttacker] & STATUS3_GRUDGE)\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        gStatuses3[gBattlerAttacker] |= STATUS3_GRUDGE;\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_weightdamagecalculation(void)\n{\n    s32 i;\n    for (i = 0; sWeightToDamageTable[i] != 0xFFFF; i += 2)\n    {\n        if (sWeightToDamageTable[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), 1))\n            break;\n    }\n\n    if (sWeightToDamageTable[i] != 0xFFFF)\n        gDynamicBasePower = sWeightToDamageTable[i + 1];\n    else\n        gDynamicBasePower = 120;\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_assistattackselect(void)\n{\n    s32 chooseableMovesNo = 0;\n    struct Pokemon* party;\n    s32 monId, moveId;\n    u16 *validMoves = gBattleStruct->assistPossibleMoves;\n\n    if (GET_BATTLER_SIDE(gBattlerAttacker) != B_SIDE_PLAYER)\n        party = gEnemyParty;\n    else\n        party = gPlayerParty;\n\n    for (monId = 0; monId < PARTY_SIZE; monId++)\n    {\n        if (monId == gBattlerPartyIndexes[gBattlerAttacker])\n            continue;\n        if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE)\n            continue;\n        if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG)\n            continue;\n\n        for (moveId = 0; moveId < MAX_MON_MOVES; moveId++)\n        {\n            s32 i = 0;\n            u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId);\n\n            if (IsInvalidForSleepTalkOrAssist(move))\n                continue;\n\n            for (; sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END && move != sMovesForbiddenToCopy[i]; i++);\n\n            if (sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END)\n                continue;\n            if (move == MOVE_NONE)\n                continue;\n\n            validMoves[chooseableMovesNo] = move;\n            chooseableMovesNo++;\n        }\n    }\n    if (chooseableMovesNo)\n    {\n        gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;\n        gCalledMove = validMoves[((Random() & 0xFF) * chooseableMovesNo) >> 8];\n        gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE);\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_trysetmagiccoat(void)\n{\n    gBattlerTarget = gBattlerAttacker;\n    gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1;\n    if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        gProtectStructs[gBattlerAttacker].bounceMove = TRUE;\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\n// Snatch\nstatic void Cmd_trysetsnatch(void)\n{\n    gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1;\n    if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        gProtectStructs[gBattlerAttacker].stealMove = 1;\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_trygetintimidatetarget(void)\n{\n    u8 side;\n\n    gBattleScripting.battler = gBattleStruct->intimidateBattler;\n    side = GetBattlerSide(gBattleScripting.battler);\n\n    PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gBattleMons[gBattleScripting.battler].ability)\n\n    for (;gBattlerTarget < gBattlersCount; gBattlerTarget++)\n    {\n        if (GetBattlerSide(gBattlerTarget) == side)\n            continue;\n        if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget]))\n            break;\n    }\n\n    if (gBattlerTarget >= gBattlersCount)\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    else\n        gBattlescriptCurrInstr += 5;\n}\n\nstatic void Cmd_switchoutabilities(void)\n{\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n    switch (gBattleMons[gActiveBattler].ability)\n    {\n    case ABILITY_NATURAL_CURE:\n        gBattleMons[gActiveBattler].status1 = 0;\n        BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE,\n                                     gBitTable[*(gBattleStruct->battlerPartyIndexes + gActiveBattler)],\n                                     sizeof(gBattleMons[gActiveBattler].status1),\n                                     &gBattleMons[gActiveBattler].status1);\n        MarkBattlerForControllerExec(gActiveBattler);\n        break;\n    }\n\n    gBattlescriptCurrInstr += 2;\n}\n\nstatic void Cmd_jumpifhasnohp(void)\n{\n    gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);\n\n    if (gBattleMons[gActiveBattler].hp == 0)\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);\n    else\n        gBattlescriptCurrInstr += 6;\n}\n\nstatic void Cmd_getsecretpowereffect(void)\n{\n    switch (gBattleTerrain)\n    {\n    case BATTLE_TERRAIN_GRASS:\n        gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_POISON;\n        break;\n    case BATTLE_TERRAIN_LONG_GRASS:\n        gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_SLEEP;\n        break;\n    case BATTLE_TERRAIN_SAND:\n        gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_ACC_MINUS_1;\n        break;\n    case BATTLE_TERRAIN_UNDERWATER:\n        gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_DEF_MINUS_1;\n        break;\n    case BATTLE_TERRAIN_WATER:\n        gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_ATK_MINUS_1;\n        break;\n    case BATTLE_TERRAIN_POND:\n        gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_SPD_MINUS_1;\n        break;\n    case BATTLE_TERRAIN_MOUNTAIN:\n        gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION;\n        break;\n    case BATTLE_TERRAIN_CAVE:\n        gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FLINCH;\n        break;\n    default:\n        gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_PARALYSIS;\n        break;\n    }\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_pickup(void)\n{\n    s32 i;\n    u32 j;\n    u16 species, heldItem;\n    u32 ability;\n    u8 nickname[POKEMON_NAME_LENGTH * 2];\n    u32 index = 0;\n    u32 count = 0;\n    u32 pickupSuccess = 0;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG);\n        heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);\n        if (GetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM) != ABILITY_NONE)\n            ability = gSpeciesInfo[species].abilities[1];\n        else\n            ability = gSpeciesInfo[species].abilities[0];\n        if (ability == ABILITY_PICKUP && species != SPECIES_NONE && species != SPECIES_EGG && heldItem == ITEM_NONE && !(Random() % 10))\n        {\n            s32 random = Random() % 100;\n\n            for (j = 0; j < 15; ++j)\n                if (sPickupItems[j].chance > random)\n                    break;\n            SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &sPickupItems[j]);\n            pickupSuccess++;\n            index = i;\n        }\n    }\n    if(pickupSuccess == 1) // only one Pokemon has picked something up, print solo message\n    {\n        GetMonData(&gPlayerParty[index], MON_DATA_NICKNAME, nickname);\n        StringCopy_Nickname(gBattleTextBuff1, nickname);\n\n        if(GetMonData(&gPlayerParty[index], MON_DATA_HELD_ITEM) == ITEM_ORAN_BERRY || GetMonData(&gPlayerParty[index], MON_DATA_HELD_ITEM) == ITEM_ASPEAR_BERRY)\n            StringCopy(gBattleTextBuff2, (u8 *)gText_An);\n        else\n            StringCopy(gBattleTextBuff2, (u8 *)gText_A);\n        CopyItemName(GetMonData(&gPlayerParty[index], MON_DATA_HELD_ITEM), gBattleTextBuff3);\n        BattleScriptPush(gBattlescriptCurrInstr + 1);\n        gBattlescriptCurrInstr = BattleScript_PickedUpItemSolo;\n    }\n    else if(pickupSuccess > 1) // multiple Pokemon have picked something up, print multi message\n    {\n        BattleScriptPush(gBattlescriptCurrInstr + 1);\n        gBattlescriptCurrInstr = BattleScript_PickedUpItem;\n    }\n    else\n        gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_docastformchangeanimation(void)\n{\n    gActiveBattler = gBattleScripting.battler;\n\n    if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE)\n        *(&gBattleStruct->formToChangeInto) |= CASTFORM_SUBSTITUTE;\n\n    BtlController_EmitBattleAnimation(BUFFER_A, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto);\n    MarkBattlerForControllerExec(gActiveBattler);\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_trycastformdatachange(void)\n{\n    u8 form;\n\n    gBattlescriptCurrInstr++;\n    form = CastformDataTypeChange(gBattleScripting.battler);\n    if (form)\n    {\n        BattleScriptPushCursorAndCallback(BattleScript_CastformChange);\n        *(&gBattleStruct->formToChangeInto) = form - 1;\n    }\n}\n\n// Water and Mud Sport\nstatic void Cmd_settypebasedhalvers(void)\n{\n    bool8 worked = FALSE;\n\n    if (gBattleMoves[gCurrentMove].effect == EFFECT_MUD_SPORT)\n    {\n        if (!(gStatuses3[gBattlerAttacker] & STATUS3_MUDSPORT))\n        {\n            gStatuses3[gBattlerAttacker] |= STATUS3_MUDSPORT;\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC;\n            worked = TRUE;\n        }\n    }\n    else // Water Sport\n    {\n        if (!(gStatuses3[gBattlerAttacker] & STATUS3_WATERSPORT))\n        {\n            gStatuses3[gBattlerAttacker] |= STATUS3_WATERSPORT;\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE;\n            worked = TRUE;\n        }\n    }\n\n    if (worked)\n        gBattlescriptCurrInstr += 5;\n    else\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n}\n\nstatic void Cmd_setweatherballtype(void)\n{\n    if (WEATHER_HAS_EFFECT)\n    {\n        if (gBattleWeather & B_WEATHER_ANY)\n            gBattleScripting.dmgMultiplier = 2;\n        if (gBattleWeather & B_WEATHER_RAIN)\n            *(&gBattleStruct->dynamicMoveType) = TYPE_WATER | F_DYNAMIC_TYPE_2;\n        else if (gBattleWeather & B_WEATHER_SANDSTORM)\n            *(&gBattleStruct->dynamicMoveType) = TYPE_ROCK | F_DYNAMIC_TYPE_2;\n        else if (gBattleWeather & B_WEATHER_SUN)\n            *(&gBattleStruct->dynamicMoveType) = TYPE_FIRE | F_DYNAMIC_TYPE_2;\n        else if (gBattleWeather & B_WEATHER_HAIL)\n            *(&gBattleStruct->dynamicMoveType) = TYPE_ICE | F_DYNAMIC_TYPE_2;\n        else\n            *(&gBattleStruct->dynamicMoveType) = TYPE_NORMAL | F_DYNAMIC_TYPE_2;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_tryrecycleitem(void)\n{\n    u16 *usedHeldItem;\n\n    gActiveBattler = gBattlerAttacker;\n    usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBattler];\n    if (*usedHeldItem != ITEM_NONE && gBattleMons[gActiveBattler].item == ITEM_NONE)\n    {\n        gLastUsedItem = *usedHeldItem;\n        *usedHeldItem = ITEM_NONE;\n        gBattleMons[gActiveBattler].item = gLastUsedItem;\n\n        BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item);\n        MarkBattlerForControllerExec(gActiveBattler);\n\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_settypetoterrain(void)\n{\n    if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, sTerrainToType[gBattleTerrain]))\n    {\n        SET_BATTLER_TYPE(gBattlerAttacker, sTerrainToType[gBattleTerrain]);\n        PREPARE_TYPE_BUFFER(gBattleTextBuff1, sTerrainToType[gBattleTerrain]);\n\n        gBattlescriptCurrInstr += 5;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\n// Unused\nstatic void Cmd_pursuitdoubles(void)\n{\n    gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK);\n\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE\n        && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])\n        && gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_MOVE\n        && gChosenMoveByBattler[gActiveBattler] == MOVE_PURSUIT)\n    {\n        gActionsByTurnOrder[gActiveBattler] = B_ACTION_TRY_FINISH;\n        gCurrentMove = MOVE_PURSUIT;\n        gBattlescriptCurrInstr += 5;\n        gBattleScripting.animTurn = 1;\n        gBattleScripting.pursuitDoublesAttacker = gBattlerAttacker;\n        gBattlerAttacker = gActiveBattler;\n    }\n    else\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n}\n\nstatic void Cmd_snatchsetbattlers(void)\n{\n    gEffectBattler = gBattlerAttacker;\n\n    if (gBattlerAttacker == gBattlerTarget)\n        gBattlerAttacker = gBattlerTarget = gBattleScripting.battler;\n    else\n        gBattlerTarget = gBattleScripting.battler;\n\n    gBattleScripting.battler = gEffectBattler;\n    gBattlescriptCurrInstr++;\n}\n\n// Brick Break\nstatic void Cmd_removelightscreenreflect(void)\n{\n    u8 opposingSide = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;\n\n    if (gSideTimers[opposingSide].reflectTimer || gSideTimers[opposingSide].lightscreenTimer)\n    {\n        gSideStatuses[opposingSide] &= ~SIDE_STATUS_REFLECT;\n        gSideStatuses[opposingSide] &= ~SIDE_STATUS_LIGHTSCREEN;\n        gSideTimers[opposingSide].reflectTimer = 0;\n        gSideTimers[opposingSide].lightscreenTimer = 0;\n        gBattleScripting.animTurn = 1;\n        gBattleScripting.animTargetsHit = 1;\n    }\n    else\n    {\n        gBattleScripting.animTurn = 0;\n        gBattleScripting.animTargetsHit = 0;\n    }\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_handleballthrow(void)\n{\n    u8 ballMultiplier = 0;\n\n    if (gBattleControllerExecFlags)\n        return;\n\n    gActiveBattler = gBattlerAttacker;\n    gBattlerTarget = gBattlerAttacker ^ BIT_SIDE;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_GHOST)\n    {\n        BtlController_EmitBallThrowAnim(BUFFER_A, BALL_GHOST_DODGE);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr = BattleScript_GhostBallDodge;\n    }\n    else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n    {\n        BtlController_EmitBallThrowAnim(BUFFER_A, BALL_TRAINER_BLOCK);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr = BattleScript_TrainerBallBlock;\n    }\n    else if (gBattleTypeFlags & (BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_OLD_MAN_TUTORIAL))\n    {\n        BtlController_EmitBallThrowAnim(BUFFER_A, BALL_3_SHAKES_SUCCESS);\n        MarkBattlerForControllerExec(gActiveBattler);\n        gBattlescriptCurrInstr = BattleScript_OldMan_Pokedude_CaughtMessage;\n    }\n    else\n    {\n        u32 odds;\n        u8 catchRate;\n\n        if (gLastUsedItem == ITEM_SAFARI_BALL)\n            catchRate = gBattleStruct->safariCatchFactor * 1275 / 100;\n        else\n            catchRate = gSpeciesInfo[gBattleMons[gBattlerTarget].species].catchRate;\n\n        if (gLastUsedItem > ITEM_SAFARI_BALL)\n        {\n            switch (gLastUsedItem)\n            {\n            case ITEM_NET_BALL:\n                if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_WATER) || IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_BUG))\n                    ballMultiplier = 30;\n                else\n                    ballMultiplier = 10;\n                break;\n            case ITEM_DIVE_BALL:\n                if (GetCurrentMapType() == MAP_TYPE_UNDERWATER)\n                    ballMultiplier = 35;\n                else\n                    ballMultiplier = 10;\n                break;\n            case ITEM_NEST_BALL:\n                if (gBattleMons[gBattlerTarget].level < 40)\n                {\n                    ballMultiplier = 40 - gBattleMons[gBattlerTarget].level;\n                    if (ballMultiplier <= 9)\n                        ballMultiplier = 10;\n                }\n                else\n                {\n                    ballMultiplier = 10;\n                }\n                break;\n            case ITEM_REPEAT_BALL:\n                if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), FLAG_GET_CAUGHT))\n                    ballMultiplier = 30;\n                else\n                    ballMultiplier = 10;\n                break;\n            case ITEM_TIMER_BALL:\n                ballMultiplier = gBattleResults.battleTurnCounter + 10;\n                if (ballMultiplier > 40)\n                    ballMultiplier = 40;\n                break;\n            case ITEM_LUXURY_BALL:\n            case ITEM_PREMIER_BALL:\n                ballMultiplier = 10;\n                break;\n            }\n        }\n        else\n            ballMultiplier = sBallCatchBonuses[gLastUsedItem - ITEM_ULTRA_BALL];\n\n        odds = (catchRate * ballMultiplier / 10)\n            * (gBattleMons[gBattlerTarget].maxHP * 3 - gBattleMons[gBattlerTarget].hp * 2)\n            / (3 * gBattleMons[gBattlerTarget].maxHP);\n\n        if (gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE))\n            odds *= 2;\n        if (gBattleMons[gBattlerTarget].status1 & (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON))\n            odds = (odds * 15) / 10;\n\n        if (gLastUsedItem != ITEM_SAFARI_BALL)\n        {\n            if (gLastUsedItem == ITEM_MASTER_BALL)\n            {\n                gBattleResults.usedMasterBall = TRUE;\n            }\n            else\n            {\n                if (gBattleResults.catchAttempts[gLastUsedItem - ITEM_ULTRA_BALL] < 255)\n                    gBattleResults.catchAttempts[gLastUsedItem - ITEM_ULTRA_BALL]++;\n            }\n        }\n\n        if (odds > 254) // mon caught\n        {\n            BtlController_EmitBallThrowAnim(0, BALL_3_SHAKES_SUCCESS);\n            MarkBattlerForControllerExec(gActiveBattler);\n            if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n                gBattlescriptCurrInstr = BattleScript_SuccessBallThrowForceNick;\n            else \n                gBattlescriptCurrInstr = BattleScript_SuccessBallThrow;\n            SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem);\n            if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n            {\n                if(NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == TRUE) //already caught something here, faint mon\n                {\n                    u8 arg[4];\n                    u16 zeroHP = 0;\n                    // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData.\n                    arg[0] = 0;\n                    arg[1] = 0;\n                    arg[2] = 0;\n                    arg[3] = 0;\n                    SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_STATUS, arg); //clear status\n                    SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_HP, &zeroHP);\n                }\n                else\n                {   //if first catch in area, set dupe flag for this species.\n                    SetNuzlockeDupeFlags(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES)));\n                }\n                NuzlockeFlagSet(GetCurrentRegionMapSectionId());\n            }\n            if((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(THREE_ISLAND_BOND_BRIDGE_UNDERWATER) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(THREE_ISLAND_BOND_BRIDGE_UNDERWATER))\n                || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ARTISAN_CAVE_B1F) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ARTISAN_CAVE_B1F) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ARTISAN_CAVE_1F))))\n            {\n                u8 version = VERSION_EMERALD;\n                SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_MET_GAME, &version);\n            }\n            if(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SAFARI_ZONE_NORTH_WEST) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_WEST) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_EAST)))\n            {\n                u8 mapSec = MAPSEC_SAFARI_ZONE;\n                u8 version = VERSION_EMERALD;\n                SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_MET_LOCATION, &mapSec);\n                SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_MET_GAME, &version);\n            }    \n            if (CalculatePlayerPartyCount() == PARTY_SIZE)\n                gBattleCommunication[MULTISTRING_CHOOSER] = 0;\n            else\n                gBattleCommunication[MULTISTRING_CHOOSER] = 1;\n        }\n        else // mon may be caught, calculate shakes\n        {\n            u8 shakes;\n\n            odds = Sqrt(Sqrt(16711680 / odds));\n            odds = 1048560 / odds;\n\n            for (shakes = 0; shakes < BALL_3_SHAKES_SUCCESS && Random() < odds; shakes++);\n\n            if (gLastUsedItem == ITEM_MASTER_BALL)\n                shakes = BALL_3_SHAKES_SUCCESS; // why calculate the shakes before that check?\n\n            BtlController_EmitBallThrowAnim(BUFFER_A, shakes);\n            MarkBattlerForControllerExec(gActiveBattler);\n\n            if (shakes == BALL_3_SHAKES_SUCCESS) // mon caught, copy of the code above\n            {\n                if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n                    gBattlescriptCurrInstr = BattleScript_SuccessBallThrowForceNick;\n                else \n                    gBattlescriptCurrInstr = BattleScript_SuccessBallThrow;\n                SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem);\n                if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n                {\n                    if(NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == TRUE) //already caught something here, faint mon\n                    {\n                        u8 arg[4];\n                        u16 zeroHP = 0;\n                        // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData.\n                        arg[0] = 0;\n                        arg[1] = 0;\n                        arg[2] = 0;\n                        arg[3] = 0;\n                        SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_STATUS, arg); //clear status\n                        SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_HP, &zeroHP);\n                    }\n                    else\n                    {   //if first catch in area, set dupe flag for this species.\n                        SetNuzlockeDupeFlags(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES)));\n                    }\n                    NuzlockeFlagSet(GetCurrentRegionMapSectionId());\n                }\n                if((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(THREE_ISLAND_BOND_BRIDGE_UNDERWATER) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(THREE_ISLAND_BOND_BRIDGE_UNDERWATER))\n                || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ARTISAN_CAVE_B1F) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ARTISAN_CAVE_B1F) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ARTISAN_CAVE_1F))))\n                {\n                    u8 version = VERSION_EMERALD;\n                    SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_MET_GAME, &version);\n                }\n                if(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SAFARI_ZONE_NORTH_WEST) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_WEST) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_EAST)))\n                {\n                    u8 mapSec = MAPSEC_SAFARI_ZONE;\n                    u8 version = VERSION_EMERALD;\n                    SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_MET_LOCATION, &mapSec);\n                    SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_MET_GAME, &version);\n                }  \n                if (CalculatePlayerPartyCount() == PARTY_SIZE)\n                    gBattleCommunication[MULTISTRING_CHOOSER] = 0;\n                else\n                    gBattleCommunication[MULTISTRING_CHOOSER] = 1;\n            }\n            else // not caught\n            {\n                gBattleCommunication[MULTISTRING_CHOOSER] = shakes;\n                gBattlescriptCurrInstr = BattleScript_ShakeBallThrow;\n            }\n        }\n    }\n}\n\nstatic void Cmd_givecaughtmon(void)\n{\n    if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]]) != MON_GIVEN_TO_PARTY)\n    {\n        if (!ShouldShowBoxWasFullMessage())\n        {\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SENT_SOMEONES_PC;\n            StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON)));\n            GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2);\n        }\n        else\n        {\n            StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); // box the mon was sent to\n            GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2);\n            StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); //box the mon was going to be sent to\n            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOMEONES_BOX_FULL;\n        }\n\n        // Change to B_MSG_SENT_BILLS_PC or B_MSG_BILLS_BOX_FULL\n        if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC))\n            gBattleCommunication[MULTISTRING_CHOOSER]++;\n    }\n\n    gBattleResults.caughtMonSpecies = gBattleMons[gBattlerAttacker ^ BIT_SIDE].species;\n    GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick);\n\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_trysetcaughtmondexflags(void)\n{\n    u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL);\n    u32 personality = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY, NULL);\n\n    if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT))\n    {\n        gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n    }\n    else\n    {\n        HandleSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_SET_CAUGHT, personality);\n        gBattlescriptCurrInstr += 5;\n    }\n}\n\nstatic void Cmd_displaydexinfo(void)\n{\n    u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL);\n\n    switch (gBattleCommunication[0])\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITE);\n        gBattleCommunication[0]++;\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n        {\n            FreeAllWindowBuffers();\n            gBattleCommunication[TASK_ID] = DexScreen_RegisterMonToPokedex(species);\n            gBattleCommunication[0]++;\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active\n            && gMain.callback2 == BattleMainCB2\n            && !gTasks[gBattleCommunication[TASK_ID]].isActive)\n        {\n            CpuFill32(0, (void *)VRAM, VRAM_SIZE);\n            SetVBlankCallback(VBlankCB_Battle);\n            gBattleCommunication[0]++;\n        }\n        break;\n    case 3:\n        InitBattleBgsVideo();\n        LoadBattleTextboxAndBackground();\n        gBattle_BG3_X = 256;\n        gBattleCommunication[0]++;\n        break;\n    case 4:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            CreateMonPicSprite_HandleDeoxys(species,\n                                            gBattleMons[B_POSITION_OPPONENT_LEFT].otId,\n                                            gBattleMons[B_POSITION_OPPONENT_LEFT].personality,\n                                            TRUE,\n                                            120,\n                                            64,\n                                            0,\n                                            0xFFFF);\n            CpuFill32(0, gPlttBufferFaded, BG_PLTT_SIZE);\n            BeginNormalPaletteFade(0x1FFFF, 0, 16, 0, RGB_BLACK);\n            ShowBg(0);\n            ShowBg(3);\n            gBattleCommunication[0]++;\n        }\n        break;\n    case 5:\n        if (!gPaletteFade.active)\n            gBattlescriptCurrInstr++;\n        break;\n    }\n}\n\nvoid HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags)\n{\n    s32 destY, destX;\n    u16 var = 0;\n\n    for (destY = yStart; destY <= yEnd; destY++)\n    {\n        for (destX = xStart; destX <= xEnd; destX++)\n        {\n            if (destY == yStart)\n            {\n                if (destX == xStart)\n                    var = 0x1022;\n                else if (destX == xEnd)\n                    var = 0x1024;\n                else\n                    var = 0x1023;\n            }\n            else if (destY == yEnd)\n            {\n                if (destX == xStart)\n                    var = 0x1028;\n                else if (destX == xEnd)\n                    var = 0x102A;\n                else\n                    var = 0x1029;\n            }\n            else\n            {\n                if (destX == xStart)\n                    var = 0x1025;\n                else if (destX == xEnd)\n                    var = 0x1027;\n                else\n                    var = 0x1026;\n            }\n\n            if (flags & WINDOW_CLEAR)\n                var = 0;\n\n            if (flags & WINDOW_BG1)\n                CopyToBgTilemapBufferRect_ChangePalette(1, &var, destX, destY, 1, 1, 0x11);\n            else\n                CopyToBgTilemapBufferRect_ChangePalette(0, &var, destX, destY, 1, 1, 0x11);\n        }\n    }\n    CopyBgTilemapBufferToVram(1);\n}\n\nvoid BattleCreateYesNoCursorAt(void)\n{\n    u16 src[2];\n    src[0] = 1;\n    src[1] = 2;\n    CopyToBgTilemapBufferRect_ChangePalette(0, src, 0x18, 9 + (2 * gBattleCommunication[1]), 1, 2, 0x11);\n    CopyBgTilemapBufferToVram(0);\n}\n\nvoid BattleDestroyYesNoCursorAt(void)\n{\n    u16 src[2];\n    src[0] = 32;\n    src[1] = 32;\n\n    CopyToBgTilemapBufferRect_ChangePalette(0, src, 0x18, 9 + (2 * gBattleCommunication[1]), 1, 2, 0x11);\n    CopyBgTilemapBufferToVram(0);\n}\n\nstatic void Cmd_trygivecaughtmonnick(void)\n{\n    switch (gBattleCommunication[MULTIUSE_STATE])\n    {\n    case 0:\n        HandleBattleWindow(23, 8, 29, 13, 0);\n        BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO);\n        gBattleCommunication[MULTIUSE_STATE]++;\n        gBattleCommunication[CURSOR_POSITION] = 0;\n        BattleCreateYesNoCursorAt();\n        break;\n    case 1:\n        if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0)\n        {\n            PlaySE(SE_SELECT);\n            BattleDestroyYesNoCursorAt();\n            gBattleCommunication[CURSOR_POSITION] = 0;\n            BattleCreateYesNoCursorAt();\n        }\n        if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0)\n        {\n            PlaySE(SE_SELECT);\n            BattleDestroyYesNoCursorAt();\n            gBattleCommunication[CURSOR_POSITION] = 1;\n            BattleCreateYesNoCursorAt();\n        }\n        if (JOY_NEW(A_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            if (gBattleCommunication[CURSOR_POSITION] == 0)\n            {\n                gBattleCommunication[MULTIUSE_STATE]++;\n                BeginFastPaletteFade(3);\n            }\n            else\n            {\n                gBattleCommunication[MULTIUSE_STATE] = 4;\n            }\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            gBattleCommunication[MULTIUSE_STATE] = 4;\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick);\n            FreeAllWindowBuffers();\n\n            DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick,\n                           GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_SPECIES),\n                           GetMonGender(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]]),\n                           GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_PERSONALITY, NULL),\n                           BattleMainCB2);\n\n            gBattleCommunication[MULTIUSE_STATE]++;\n        }\n        break;\n    case 3:\n        if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)\n        {\n            SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick);\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        }\n        break;\n    case 4:\n        if (CalculatePlayerPartyCount() == PARTY_SIZE)\n            gBattlescriptCurrInstr += 5;\n        else\n            gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);\n        break;\n    }\n}\n\nstatic void Cmd_subattackerhpbydmg(void)\n{\n    gBattleMons[gBattlerAttacker].hp -= gBattleMoveDamage;\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_removeattackerstatus1(void)\n{\n    gBattleMons[gBattlerAttacker].status1 = 0;\n    gBattlescriptCurrInstr++;\n}\n\nstatic void Cmd_finishaction(void)\n{\n    gCurrentActionFuncId = B_ACTION_FINISHED;\n}\n\nstatic void Cmd_finishturn(void)\n{\n    gCurrentActionFuncId = B_ACTION_FINISHED;\n    gCurrentTurnActionNumber = gBattlersCount;\n}\n"
  },
  {
    "path": "src/battle_setup.c",
    "content": "#include \"global.h\"\n#include \"task.h\"\n#include \"help_system.h\"\n#include \"overworld.h\"\n#include \"item.h\"\n#include \"sound.h\"\n#include \"pokemon.h\"\n#include \"load_save.h\"\n#include \"safari_zone.h\"\n#include \"quest_log.h\"\n#include \"script.h\"\n#include \"script_pokemon_util.h\"\n#include \"strings.h\"\n#include \"string_util.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"metatile_behavior.h\"\n#include \"event_scripts.h\"\n#include \"fldeff.h\"\n#include \"fieldmap.h\"\n#include \"field_control_avatar.h\"\n#include \"field_player_avatar.h\"\n#include \"field_screen_effect.h\"\n#include \"field_message_box.h\"\n#include \"vs_seeker.h\"\n#include \"battle.h\"\n#include \"battle_transition.h\"\n#include \"battle_controllers.h\"\n#include \"pokedex.h\"\n#include \"constants/battle_setup.h\"\n#include \"constants/items.h\"\n#include \"constants/maps.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/songs.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/trainers.h\"\n\nenum {\n    TRANSITION_TYPE_NORMAL,\n    TRANSITION_TYPE_CAVE,\n    TRANSITION_TYPE_FLASH,\n    TRANSITION_TYPE_WATER,\n};\n\nenum\n{\n    TRAINER_PARAM_LOAD_VAL_8BIT,\n    TRAINER_PARAM_LOAD_VAL_16BIT,\n    TRAINER_PARAM_LOAD_VAL_32BIT,\n    TRAINER_PARAM_CLEAR_VAL_8BIT,\n    TRAINER_PARAM_CLEAR_VAL_16BIT,\n    TRAINER_PARAM_CLEAR_VAL_32BIT,\n    TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR,\n};\n\nstruct TrainerBattleParameter\n{\n    void *varPtr;\n    u8 ptrType;\n};\n\nstatic void DoSafariBattle(void);\nstatic void DoGhostBattle(void);\nstatic void DoStandardWildBattle(void);\nstatic void CB2_EndWildBattle(void);\nstatic u8 GetWildBattleTransition(void);\nstatic u8 GetTrainerBattleTransition(void);\nstatic void CB2_EndScriptedWildBattle(void);\nstatic void CB2_EndMarowakBattle(void);\nstatic bool32 IsPlayerDefeated(u32 battleOutcome);\nstatic void CB2_EndTrainerBattle(void);\nstatic const u8 *GetIntroSpeechOfApproachingTrainer(void);\nstatic const u8 *GetTrainerCantBattleSpeech(void);\ns8 GetScaledLevel(void);\n\nstatic EWRAM_DATA u16 sTrainerBattleMode = 0;\nEWRAM_DATA u16 gTrainerBattleOpponent_A = 0;\nstatic EWRAM_DATA u16 sTrainerObjectEventLocalId = 0;\nstatic EWRAM_DATA u8 *sTrainerAIntroSpeech = NULL;\nstatic EWRAM_DATA u8 *sTrainerADefeatSpeech = NULL;\nstatic EWRAM_DATA u8 *sTrainerVictorySpeech = NULL;\nstatic EWRAM_DATA u8 *sTrainerCannotBattleSpeech = NULL;\nstatic EWRAM_DATA u8 *sTrainerBattleEndScript = NULL;\nstatic EWRAM_DATA u8 *sTrainerABattleScriptRetAddr = NULL;\nstatic EWRAM_DATA u16 sRivalBattleFlags = 0;\nEWRAM_DATA u8 HasAlreadyCapturedHere = 0;\n\n// The first transition is used if the enemy pokemon are lower level than our pokemon.\n// Otherwise, the second transition is used.\nstatic const u8 sBattleTransitionTable_Wild[][2] =\n{\n    [TRANSITION_TYPE_NORMAL] = {B_TRANSITION_SLICE,          B_TRANSITION_WHITE_BARS_FADE},\n    [TRANSITION_TYPE_CAVE]   = {B_TRANSITION_CLOCKWISE_WIPE, B_TRANSITION_GRID_SQUARES},\n    [TRANSITION_TYPE_FLASH]  = {B_TRANSITION_BLUR,           B_TRANSITION_GRID_SQUARES},\n    [TRANSITION_TYPE_WATER]  = {B_TRANSITION_WAVE,           B_TRANSITION_RIPPLE},\n};\n\nstatic const u8 sBattleTransitionTable_Trainer[][2] =\n{\n    [TRANSITION_TYPE_NORMAL] = {B_TRANSITION_POKEBALLS_TRAIL, B_TRANSITION_ANGLED_WIPES},\n    [TRANSITION_TYPE_CAVE]   = {B_TRANSITION_SHUFFLE,         B_TRANSITION_BIG_POKEBALL},\n    [TRANSITION_TYPE_FLASH]  = {B_TRANSITION_BLUR,            B_TRANSITION_GRID_SQUARES},\n    [TRANSITION_TYPE_WATER]  = {B_TRANSITION_SWIRL,           B_TRANSITION_RIPPLE},\n};\n\nstatic const struct TrainerBattleParameter sOrdinaryBattleParams[] =\n{\n    {&sTrainerBattleMode,           TRAINER_PARAM_LOAD_VAL_8BIT},\n    {&gTrainerBattleOpponent_A,     TRAINER_PARAM_LOAD_VAL_16BIT},\n    {&sTrainerObjectEventLocalId,   TRAINER_PARAM_LOAD_VAL_16BIT},\n    {&sTrainerAIntroSpeech,         TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerADefeatSpeech,        TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerVictorySpeech,        TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerCannotBattleSpeech,   TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerBattleEndScript,      TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},\n};\n\nstatic const struct TrainerBattleParameter sContinueScriptBattleParams[] =\n{\n    {&sTrainerBattleMode,           TRAINER_PARAM_LOAD_VAL_8BIT},\n    {&gTrainerBattleOpponent_A,     TRAINER_PARAM_LOAD_VAL_16BIT},\n    {&sTrainerObjectEventLocalId,   TRAINER_PARAM_LOAD_VAL_16BIT},\n    {&sTrainerAIntroSpeech,         TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerADefeatSpeech,        TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerVictorySpeech,        TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerCannotBattleSpeech,   TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerBattleEndScript,      TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},\n};\n\nstatic const struct TrainerBattleParameter sDoubleBattleParams[] =\n{\n    {&sTrainerBattleMode,           TRAINER_PARAM_LOAD_VAL_8BIT},\n    {&gTrainerBattleOpponent_A,     TRAINER_PARAM_LOAD_VAL_16BIT},\n    {&sTrainerObjectEventLocalId,   TRAINER_PARAM_LOAD_VAL_16BIT},\n    {&sTrainerAIntroSpeech,         TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerADefeatSpeech,        TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerVictorySpeech,        TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerCannotBattleSpeech,   TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerBattleEndScript,      TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},\n};\n\nstatic const struct TrainerBattleParameter sOrdinaryNoIntroBattleParams[] =\n{\n    {&sTrainerBattleMode,           TRAINER_PARAM_LOAD_VAL_8BIT},\n    {&gTrainerBattleOpponent_A,     TRAINER_PARAM_LOAD_VAL_16BIT},\n    {&sTrainerObjectEventLocalId,   TRAINER_PARAM_LOAD_VAL_16BIT},\n    {&sTrainerAIntroSpeech,         TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerADefeatSpeech,        TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerVictorySpeech,        TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerCannotBattleSpeech,   TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerBattleEndScript,      TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},\n};\n\nstatic const struct TrainerBattleParameter sEarlyRivalBattleParams[] =\n{\n    {&sTrainerBattleMode,           TRAINER_PARAM_LOAD_VAL_8BIT},\n    {&gTrainerBattleOpponent_A,     TRAINER_PARAM_LOAD_VAL_16BIT},\n    {&sRivalBattleFlags,            TRAINER_PARAM_LOAD_VAL_16BIT},\n    {&sTrainerAIntroSpeech,         TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerADefeatSpeech,        TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerVictorySpeech,        TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerCannotBattleSpeech,   TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerBattleEndScript,      TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},\n};\n\nstatic const struct TrainerBattleParameter sContinueScriptDoubleBattleParams[] =\n{\n    {&sTrainerBattleMode,           TRAINER_PARAM_LOAD_VAL_8BIT},\n    {&gTrainerBattleOpponent_A,     TRAINER_PARAM_LOAD_VAL_16BIT},\n    {&sTrainerObjectEventLocalId,   TRAINER_PARAM_LOAD_VAL_16BIT},\n    {&sTrainerAIntroSpeech,         TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerADefeatSpeech,        TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerVictorySpeech,        TRAINER_PARAM_CLEAR_VAL_32BIT},\n    {&sTrainerCannotBattleSpeech,   TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT},\n    {&sTrainerBattleEndScript,      TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},\n};\n\nconst u8 NuzlockeLUT[MAPSEC_COUNT] = //84 used, 214 total\n{   //any mapsec not in this list = 0x0\n    [MAPSEC_PALLET_TOWN] = 0x1,\n    [MAPSEC_VIRIDIAN_CITY] = 0x2,\n    [MAPSEC_CERULEAN_CITY] = 0x3,\n    [MAPSEC_VERMILION_CITY] = 0x4,\n    [MAPSEC_CELADON_CITY] = 0x5,\n    [MAPSEC_FUCHSIA_CITY] = 0x6,\n    [MAPSEC_CINNABAR_ISLAND] = 0x7,\n    [MAPSEC_ROUTE_1] = 0x8,\n    [MAPSEC_ROUTE_2] = 0x9,\n    [MAPSEC_ROUTE_3] = 0xA,\n    [MAPSEC_ROUTE_4] = 0xB,\n    [MAPSEC_ROUTE_5] = 0xC,\n    [MAPSEC_ROUTE_6] = 0xD,\n    [MAPSEC_ROUTE_7] = 0xE,\n    [MAPSEC_ROUTE_8] = 0xF,\n    [MAPSEC_ROUTE_9] = 0x10,\n    [MAPSEC_ROUTE_10] = 0x11,\n    [MAPSEC_ROUTE_11] = 0x12,\n    [MAPSEC_ROUTE_12] = 0x13,\n    [MAPSEC_ROUTE_13] = 0x14,\n    [MAPSEC_ROUTE_14] = 0x15,\n    [MAPSEC_ROUTE_15] = 0x16,\n    [MAPSEC_ROUTE_16] = 0x17,\n    [MAPSEC_ROUTE_17] = 0x18,\n    [MAPSEC_ROUTE_18] = 0x19,\n    [MAPSEC_ROUTE_19] = 0x1A,\n    [MAPSEC_ROUTE_20] = 0x1B,\n    [MAPSEC_ROUTE_21] = 0x1C,\n    [MAPSEC_ROUTE_22] = 0x1D,\n    [MAPSEC_ROUTE_23] = 0x1E,\n    [MAPSEC_ROUTE_24] = 0x1F,\n    [MAPSEC_ROUTE_25] = 0x20,\n    [MAPSEC_VIRIDIAN_FOREST] = 0x21,\n    [MAPSEC_MT_MOON] = 0x22,\n    [MAPSEC_S_S_ANNE] = 0x23,\n    [MAPSEC_DIGLETTS_CAVE] = 0x24,\n    [MAPSEC_KANTO_VICTORY_ROAD] = 0x25,\n    [MAPSEC_POKEMON_MANSION] = 0x26,\n    [MAPSEC_KANTO_SAFARI_ZONE] = 0x27,\n    [MAPSEC_ROCK_TUNNEL] = 0x28,\n    [MAPSEC_SEAFOAM_ISLANDS] = 0x29,\n    [MAPSEC_POKEMON_TOWER] = 0x2A,\n    [MAPSEC_CERULEAN_CAVE] = 0x2B,\n    [MAPSEC_POWER_PLANT] = 0x2C,\n    [MAPSEC_ONE_ISLAND] = 0x2D,\n    [MAPSEC_FOUR_ISLAND] = 0x2E,\n    [MAPSEC_FIVE_ISLAND] = 0x2F,\n    [MAPSEC_KINDLE_ROAD] = 0x30,\n    [MAPSEC_TREASURE_BEACH] = 0x31,\n    [MAPSEC_CAPE_BRINK] = 0x32,\n    [MAPSEC_BOND_BRIDGE] = 0x33,\n    [MAPSEC_THREE_ISLE_PORT] = 0x34,\n    [MAPSEC_RESORT_GORGEOUS] = 0x35,\n    [MAPSEC_WATER_LABYRINTH] = 0x36,\n    [MAPSEC_FIVE_ISLE_MEADOW] = 0x37,\n    [MAPSEC_MEMORIAL_PILLAR] = 0x38,\n    [MAPSEC_OUTCAST_ISLAND] = 0x39,\n    [MAPSEC_GREEN_PATH] = 0x3A,\n    [MAPSEC_WATER_PATH] = 0x3B,\n    [MAPSEC_RUIN_VALLEY] = 0x3C,\n    [MAPSEC_TRAINER_TOWER] = 0x3D,\n    [MAPSEC_CANYON_ENTRANCE] = 0x3E,\n    [MAPSEC_SEVAULT_CANYON] = 0x3F,\n    [MAPSEC_TANOBY_RUINS] = 0x40,\n    [MAPSEC_NAVEL_ROCK] = 0x41,\n    [MAPSEC_MT_EMBER] = 0x42,\n    [MAPSEC_BERRY_FOREST] = 0x43,\n    [MAPSEC_ICEFALL_CAVE] = 0x44,\n    [MAPSEC_LOST_CAVE] = 0x45,\n    [MAPSEC_PATTERN_BUSH] = 0x46,\n    [MAPSEC_ALTERING_CAVE] = 0x47,\n    [MAPSEC_MONEAN_CHAMBER] = 0x48,\n    [MAPSEC_LIPTOO_CHAMBER] = 0x49,\n    [MAPSEC_WEEPTH_CHAMBER] = 0x4A,\n    [MAPSEC_DILFORD_CHAMBER] = 0x4B,\n    [MAPSEC_SCUFIB_CHAMBER] = 0x4C,\n    [MAPSEC_RIXY_CHAMBER] = 0x4D,\n    [MAPSEC_VIAPOIS_CHAMBER] = 0x4E,\n    //Other Safari Zone areas here, taking up 0x4F to 0x53\n    [MAPSEC_ARTISAN_CAVE] = 0x54,\n    [MAPSEC_SOUTHERN_ISLAND] = 0x55, //84\n    [MAPSEC_UNDERWATER_124] = 0x33, //reused Bond Bridge; same area but Underwater\n    [MAPSEC_BATTLE_FRONTIER] = 0x56\n};\n\n\n#define tState data[0]\n#define tTransition data[1]\n\nstatic void Task_BattleStart(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    switch (tState)\n    {\n    case 0:\n        if (!FldEffPoison_IsActive())\n        {\n            HelpSystem_Disable();\n            BattleTransition_StartOnField(tTransition);\n            ++tState;\n        }\n        break;\n    case 1:\n        if (IsBattleTransitionDone() == TRUE)\n        {\n            HelpSystem_Enable();\n            CleanupOverworldWindowsAndTilemaps();\n            SetMainCallback2(CB2_InitBattle);\n            RestartWildEncounterImmunitySteps();\n            ClearPoisonStepCounter();\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void CreateBattleStartTask(u8 transition, u16 song) // song == 0 means default music for current map\n{\n    u8 taskId = CreateTask(Task_BattleStart, 1);\n\n    gTasks[taskId].tTransition = transition;\n    PlayMapChosenOrBattleBGM(song);\n}\n\nstatic bool8 CheckSilphScopeInPokemonTower(u16 mapGroup, u16 mapNum)\n{\n    if (mapGroup == MAP_GROUP(POKEMON_TOWER_1F)\n     && (mapNum == MAP_NUM(POKEMON_TOWER_1F)\n      || mapNum == MAP_NUM(POKEMON_TOWER_2F)\n      || mapNum == MAP_NUM(POKEMON_TOWER_3F)\n      || mapNum == MAP_NUM(POKEMON_TOWER_4F)\n      || mapNum == MAP_NUM(POKEMON_TOWER_5F)\n      || mapNum == MAP_NUM(POKEMON_TOWER_6F)\n      || mapNum == MAP_NUM(POKEMON_TOWER_7F))\n     && !(CheckBagHasItem(ITEM_SILPH_SCOPE, 1)))\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid StartWildBattle(void)\n{\n    if (GetSafariZoneFlag())\n        DoSafariBattle();\n    else if (CheckSilphScopeInPokemonTower(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum))\n        DoGhostBattle();\n    else\n        DoStandardWildBattle();\n}\n\nstatic void DoStandardWildBattle(void)\n{\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    StopPlayerAvatar();\n    gMain.savedCallback = CB2_EndWildBattle;\n    gBattleTypeFlags = 0;\n    CreateBattleStartTask(GetWildBattleTransition(), 0);\n    IncrementGameStat(GAME_STAT_TOTAL_BATTLES);\n    IncrementGameStat(GAME_STAT_WILD_BATTLES);\n}\n\nvoid StartRoamerBattle(void)\n{\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    StopPlayerAvatar();\n    gMain.savedCallback = CB2_EndWildBattle;\n    gBattleTypeFlags = BATTLE_TYPE_ROAMER;\n    CreateBattleStartTask(GetWildBattleTransition(), MUS_C_VS_LEGEND_BEAST);\n    IncrementGameStat(GAME_STAT_TOTAL_BATTLES);\n    IncrementGameStat(GAME_STAT_WILD_BATTLES);\n}\n\nstatic void DoSafariBattle(void)\n{\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    StopPlayerAvatar();\n    gMain.savedCallback = CB2_EndSafariBattle;\n    gBattleTypeFlags = BATTLE_TYPE_SAFARI;\n    CreateBattleStartTask(GetWildBattleTransition(), 0);\n}\n\nstatic void DoGhostBattle(void)\n{\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    StopPlayerAvatar();\n    gMain.savedCallback = CB2_EndWildBattle;\n    gBattleTypeFlags = BATTLE_TYPE_GHOST;\n    CreateBattleStartTask(GetWildBattleTransition(), 0);\n    SetMonData(&gEnemyParty[0], MON_DATA_NICKNAME, gText_Ghost);\n    IncrementGameStat(GAME_STAT_TOTAL_BATTLES);\n    IncrementGameStat(GAME_STAT_WILD_BATTLES);\n}\n\nstatic void DoTrainerBattle(void)\n{\n    CreateBattleStartTask(GetTrainerBattleTransition(), 0);\n    IncrementGameStat(GAME_STAT_TOTAL_BATTLES);\n    IncrementGameStat(GAME_STAT_TRAINER_BATTLES);\n}\n\nvoid StartOldManTutorialBattle(void)\n{\n    CreateMaleMon(&gEnemyParty[0], SPECIES_WEEDLE, 5);\n    LockPlayerFieldControls();\n    gMain.savedCallback = CB2_ReturnToFieldContinueScriptPlayMapMusic;\n    gBattleTypeFlags = BATTLE_TYPE_OLD_MAN_TUTORIAL;\n    CreateBattleStartTask(B_TRANSITION_SLICE, 0);\n}\n\nvoid StartScriptedWildBattle(void)\n{\n    LockPlayerFieldControls();\n    gMain.savedCallback = CB2_EndScriptedWildBattle;\n    gBattleTypeFlags = BATTLE_TYPE_WILD_SCRIPTED;\n    CreateBattleStartTask(GetWildBattleTransition(), 0);\n    IncrementGameStat(GAME_STAT_TOTAL_BATTLES);\n    IncrementGameStat(GAME_STAT_WILD_BATTLES);\n}\n\nvoid StartMarowakBattle(void)\n{\n    LockPlayerFieldControls();\n    gMain.savedCallback = CB2_EndMarowakBattle;\n    if (CheckBagHasItem(ITEM_SILPH_SCOPE, 1))\n    {\n        gBattleTypeFlags = BATTLE_TYPE_GHOST | BATTLE_TYPE_GHOST_UNVEILED;\n        CreateMonWithGenderNatureLetter(gEnemyParty, SPECIES_MAROWAK, 30, 31, MON_FEMALE, NATURE_SERIOUS, 0);\n    }\n    else\n    {\n        gBattleTypeFlags = BATTLE_TYPE_GHOST;\n    }\n    CreateBattleStartTask(GetWildBattleTransition(), 0);\n    SetMonData(&gEnemyParty[0], MON_DATA_NICKNAME, gText_Ghost);\n    IncrementGameStat(GAME_STAT_TOTAL_BATTLES);\n    IncrementGameStat(GAME_STAT_WILD_BATTLES);\n}\n\nvoid StartSouthernIslandBattle(void)\n{\n    LockPlayerFieldControls();\n    gMain.savedCallback = CB2_EndScriptedWildBattle;\n    gBattleTypeFlags = BATTLE_TYPE_LEGENDARY;\n    CreateBattleStartTask(GetWildBattleTransition(), MUS_RS_VS_WILD);\n    IncrementGameStat(GAME_STAT_TOTAL_BATTLES);\n    IncrementGameStat(GAME_STAT_WILD_BATTLES);\n}\n\nvoid StartLegendaryBattle(void)\n{\n    u16 species;\n    \n    LockPlayerFieldControls();\n    gMain.savedCallback = CB2_EndScriptedWildBattle;\n    gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_LEGENDARY_FRLG;\n    species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES);\n    switch (species)\n    {\n    case SPECIES_MEWTWO:\n        CreateBattleStartTask(B_TRANSITION_BLUR, MUS_VS_MEWTWO);\n        break;\n    case SPECIES_MEW:\n        CreateBattleStartTask(B_TRANSITION_GRID_SQUARES, MUS_VS_MEWTWO);\n        break;\n    case SPECIES_DEOXYS:\n        CreateBattleStartTask(B_TRANSITION_BLUR, MUS_VS_DEOXYS);\n        break;\n    case SPECIES_MOLTRES:\n    case SPECIES_ARTICUNO:\n    case SPECIES_ZAPDOS:\n    case SPECIES_HO_OH:\n    case SPECIES_LUGIA:\n        CreateBattleStartTask(B_TRANSITION_BLUR, MUS_VS_LEGEND);\n        break;\n    default:\n        CreateBattleStartTask(B_TRANSITION_BLUR, MUS_RS_VS_TRAINER);\n        break;\n    }\n    IncrementGameStat(GAME_STAT_TOTAL_BATTLES);\n    IncrementGameStat(GAME_STAT_WILD_BATTLES);\n}\n\nvoid StartGroudonKyogreBattle(void)\n{\n    LockPlayerFieldControls();\n    gMain.savedCallback = CB2_EndScriptedWildBattle;\n    gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON;\n    if (gGameVersion == VERSION_FIRE_RED)\n        CreateBattleStartTask(B_TRANSITION_ANGLED_WIPES, MUS_RS_VS_TRAINER);\n    else // pointless, exactly the same\n        CreateBattleStartTask(B_TRANSITION_ANGLED_WIPES, MUS_RS_VS_TRAINER);\n    IncrementGameStat(GAME_STAT_TOTAL_BATTLES);\n    IncrementGameStat(GAME_STAT_WILD_BATTLES);\n}\n\nvoid StartRegiBattle(void)\n{\n    LockPlayerFieldControls();\n    gMain.savedCallback = CB2_EndScriptedWildBattle;\n    gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI;\n    CreateBattleStartTask(B_TRANSITION_BLUR, MUS_RS_VS_TRAINER);\n    IncrementGameStat(GAME_STAT_TOTAL_BATTLES);\n    IncrementGameStat(GAME_STAT_WILD_BATTLES);\n}\n\n// Unused\nstatic void EndPokedudeBattle(void)\n{\n    LoadPlayerParty();\n    CB2_EndWildBattle();\n}\n\n// Unused\nstatic void StartPokedudeBattle(void)\n{\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    StopPlayerAvatar();\n    gMain.savedCallback = EndPokedudeBattle;\n    SavePlayerParty();\n    InitPokedudePartyAndOpponent();\n    CreateBattleStartTask(GetWildBattleTransition(), 0);\n}\n\nbool8 CheckNuzlockeDupeFlags(u16 species)\n{\n    u8 index = species / 8; //get byte in array\n    u8 bit = species % 8;   //get bit in byte\n    u8 mask = 1 << bit;\n\n    return (gSaveBlock1Ptr->nuzlockeDupeFlags[index] & mask) != 0;\n}\n\nbool8 IsWildMonNuzlockeDupe(u16 species)\n{\n    u32 i;\n    for (i = 0; i < EVOS_PER_LINE; i++)\n    {   \n        if (CheckNuzlockeDupeFlags(SpeciesToNationalPokedexNum(gEvolutionLines[species][i])))\n            return TRUE;\n    }\n    return FALSE;\n}\n\nvoid SetNuzlockeDupeFlags(u16 species)\n{\n    u8 index = species / 8; //get byte in array\n    u8 bit = species % 8;   //get bit in byte\n    u8 mask = 1 << bit;\n\n    gSaveBlock1Ptr->nuzlockeDupeFlags[index] |= mask;\n}\n\nstatic void CB2_EndWildBattle(void)\n{\n    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n    {   \n        if(!IsWildMonNuzlockeDupe(GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)))\n        {\n            NuzlockeFlagSet(GetCurrentRegionMapSectionId());\n        }\n    }\n    CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE);\n    ResetOamRange(0, 128);\n    if (IsPlayerDefeated(gBattleOutcome) == TRUE)\n    {\n        SetMainCallback2(CB2_WhiteOut);\n    }\n    else\n    {\n        SetMainCallback2(CB2_ReturnToField);\n        gFieldCallback = FieldCB_SafariZoneRanOutOfBalls;\n    }\n}\n\nstatic void CB2_EndScriptedWildBattle(void)\n{\n    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n    {   \n        if(!IsWildMonNuzlockeDupe(GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)))\n        {\n            NuzlockeFlagSet(GetCurrentRegionMapSectionId());\n        }\n    }\n    CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE);\n    ResetOamRange(0, 128);\n    if (IsPlayerDefeated(gBattleOutcome) == TRUE)\n        SetMainCallback2(CB2_WhiteOut);\n    else\n        SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n}\n\nstatic void CB2_EndMarowakBattle(void)\n{\n    CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE);\n    ResetOamRange(0, 128);\n    if (IsPlayerDefeated(gBattleOutcome))\n    {\n        SetMainCallback2(CB2_WhiteOut);\n    }\n    else\n    {\n        // If result is TRUE player didnt defeat Marowak, force player back from stairs\n        if (gBattleOutcome == B_OUTCOME_WON)\n            gSpecialVar_Result = FALSE;\n        else\n            gSpecialVar_Result = TRUE;\n        SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n    }\n}\n\nu8 BattleSetup_GetTerrainId(void)\n{\n    u16 tileBehavior;\n    s16 x, y;\n\n    PlayerGetDestCoords(&x, &y);\n    tileBehavior = MapGridGetMetatileBehaviorAt(x, y);\n    if (MetatileBehavior_IsTallGrass(tileBehavior))\n        return BATTLE_TERRAIN_GRASS;\n    if (MetatileBehavior_IsLongGrass(tileBehavior))\n        return BATTLE_TERRAIN_LONG_GRASS;\n    if (MetatileBehavior_IsSandOrShallowFlowingWater(tileBehavior))\n        return BATTLE_TERRAIN_SAND;\n    switch (gMapHeader.mapType)\n    {\n    case MAP_TYPE_TOWN:\n    case MAP_TYPE_CITY:\n    case MAP_TYPE_ROUTE:\n        break;\n    case MAP_TYPE_UNDERGROUND:\n        if (MetatileBehavior_IsIndoorEncounter(tileBehavior))\n            return BATTLE_TERRAIN_BUILDING;\n        if (MetatileBehavior_IsSurfable(tileBehavior))\n            return BATTLE_TERRAIN_POND;\n        return BATTLE_TERRAIN_CAVE;\n    case MAP_TYPE_INDOOR:\n    case MAP_TYPE_SECRET_BASE:\n        return BATTLE_TERRAIN_BUILDING;\n    case MAP_TYPE_UNDERWATER:\n        return BATTLE_TERRAIN_UNDERWATER;\n    case MAP_TYPE_OCEAN_ROUTE:\n        if (MetatileBehavior_IsSurfable(tileBehavior))\n            return BATTLE_TERRAIN_WATER;\n        return BATTLE_TERRAIN_PLAIN;\n    }\n    if (MetatileBehavior_IsDeepWaterTerrain(tileBehavior))\n        return BATTLE_TERRAIN_WATER;\n    if (MetatileBehavior_IsSurfable(tileBehavior))\n        return BATTLE_TERRAIN_POND;\n    if (MetatileBehavior_IsMountain(tileBehavior))\n        return BATTLE_TERRAIN_MOUNTAIN;\n    if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))\n    {\n        if (MetatileBehavior_GetBridgeType(tileBehavior))\n            return BATTLE_TERRAIN_POND;\n        if (MetatileBehavior_IsBridge(tileBehavior) == TRUE)\n            return BATTLE_TERRAIN_WATER;\n    }\n    return BATTLE_TERRAIN_PLAIN;\n}\n\nstatic u8 GetBattleTransitionTypeByMap(void)\n{\n    u16 behavior;\n    s16 x, y;\n\n    PlayerGetDestCoords(&x, &y);\n    behavior = MapGridGetMetatileBehaviorAt(x, y);\n\n    if (Overworld_GetFlashLevel())\n        return TRANSITION_TYPE_FLASH;\n\n    if (MetatileBehavior_IsSurfable(behavior))\n        return TRANSITION_TYPE_WATER;\n\n    switch (gMapHeader.mapType)\n    {\n    case MAP_TYPE_UNDERGROUND:\n        return TRANSITION_TYPE_CAVE;\n    case MAP_TYPE_UNDERWATER:\n        return TRANSITION_TYPE_WATER;\n    default:\n        return TRANSITION_TYPE_NORMAL;\n    }\n}\n\nstatic u16 GetSumOfPlayerPartyLevel(u8 numMons)\n{\n    u8 sum = 0;\n    s32 i;\n\n    for (i = 0; i < PARTY_SIZE; ++i)\n    {\n        u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG);\n\n        if (species != SPECIES_EGG && species != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0)\n        {\n            sum += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);\n            if (--numMons == 0)\n                break;\n        }\n    }\n    return sum;\n}\n\nstatic u8 GetSumOfEnemyPartyLevel(u16 opponentId, u8 numMons)\n{\n    u32 i;\n    u8 sum;\n    u32 count = numMons;\n    s8 levelScaling = GetScaledLevel();\n\n    if (gTrainers[opponentId].partySize < count)\n        count = gTrainers[opponentId].partySize;\n    sum = 0;\n    switch (gTrainers[opponentId].partyFlags)\n    {\n    case 0:\n        {\n            const struct TrainerMonNoItemDefaultMoves *party;\n\n            party = gTrainers[opponentId].party.NoItemDefaultMoves;\n            for (i = 0; i < count; ++i)\n                sum += (party[i].lvl + levelScaling);\n        }\n        break;\n    case F_TRAINER_PARTY_CUSTOM_MOVESET:\n        {\n            const struct TrainerMonNoItemCustomMoves *party;\n\n            party = gTrainers[opponentId].party.NoItemCustomMoves;\n            for (i = 0; i < count; ++i)\n                sum += (party[i].lvl + levelScaling);\n        }\n        break;\n    case F_TRAINER_PARTY_HELD_ITEM:\n        {\n            const struct TrainerMonItemDefaultMoves *party;\n\n            party = gTrainers[opponentId].party.ItemDefaultMoves;\n            for (i = 0; i < count; ++i)\n                sum += (party[i].lvl + levelScaling);\n        }\n        break;\n    case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM:\n        {\n            const struct TrainerMonItemCustomMoves *party;\n\n            party = gTrainers[opponentId].party.ItemCustomMoves;\n            for (i = 0; i < count; ++i)\n                sum += (party[i].lvl + levelScaling);\n        }\n        break;\n    case F_TRAINER_PARTY_EVS:\n        {\n            const struct TrainerMonItemCustomMovesEVs *party;\n\n            party = gTrainers[opponentId].party.ItemCustomMovesEVs;\n            for (i = 0; i < count; ++i)\n                sum += (party[i].lvl + levelScaling);\n        }\n    }\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n    {\n        return GetMonData(gPlayerParty[0], MON_DATA_LEVEL, NULL);\n    }\n    return sum;\n}\n\nstatic u8 GetWildBattleTransition(void)\n{\n    u8 transitionType = GetBattleTransitionTypeByMap();\n    u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL);\n    u8 playerLevel = GetSumOfPlayerPartyLevel(1);\n\n    if (enemyLevel < playerLevel)\n        return sBattleTransitionTable_Wild[transitionType][0];\n    else\n        return sBattleTransitionTable_Wild[transitionType][1];\n}\n\nstatic u8 GetTrainerBattleTransition(void)\n{\n    u8 minPartyCount;\n    u8 transitionType;\n    u8 enemyLevel;\n    u8 playerLevel;\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)\n        return B_TRANSITION_BLUE;\n    if (sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR)\n    {\n        if (gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LORELEI || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LORELEI_2 || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LORELEI_CHALLENGE || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LORELEI_CHALLENGE_2)\n            return B_TRANSITION_LORELEI;\n        if (gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_BRUNO || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_BRUNO_2 || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_BRUNO_CHALLENGE || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_BRUNO_CHALLENGE_2)\n            return B_TRANSITION_BRUNO;\n        if (gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_AGATHA || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_AGATHA_2 || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_AGATHA_CHALLENGE || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_AGATHA_CHALLENGE_2)\n            return B_TRANSITION_AGATHA;\n        if (gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LANCE || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LANCE_2 || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LANCE_CHALLENGE || gTrainerBattleOpponent_A == TRAINER_ELITE_FOUR_LANCE_CHALLENGE_2)\n            return B_TRANSITION_LANCE;\n        return B_TRANSITION_BLUE;\n    }\n    if (sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)\n        return B_TRANSITION_BLUE;\n    if (sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_PKMN_PROF)\n        return B_TRANSITION_OAK;\n    if (sTrainers[gTrainerBattleOpponent_A].doubleBattle == TRUE)\n        minPartyCount = 2; // double battles always at least have 2 pokemon.\n    else\n        minPartyCount = 1;\n    transitionType = GetBattleTransitionTypeByMap();\n    enemyLevel = GetSumOfEnemyPartyLevel(gTrainerBattleOpponent_A, minPartyCount);\n    playerLevel = GetSumOfPlayerPartyLevel(minPartyCount);\n    if (enemyLevel < playerLevel)\n        return sBattleTransitionTable_Trainer[transitionType][0];\n    else\n        return sBattleTransitionTable_Trainer[transitionType][1];\n}\n\nu8 BattleSetup_GetBattleTowerBattleTransition(void)\n{\n    u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL);\n    u8 playerLevel = GetSumOfPlayerPartyLevel(1);\n\n    if (enemyLevel < playerLevel)\n        return B_TRANSITION_POKEBALLS_TRAIL;\n    else\n        return B_TRANSITION_BIG_POKEBALL;\n}\n\nstatic u32 TrainerBattleLoadArg32(const u8 *ptr)\n{\n    return T1_READ_32(ptr);\n}\n\nstatic u16 TrainerBattleLoadArg16(const u8 *ptr)\n{\n    return T1_READ_16(ptr);\n}\n\nstatic u8 TrainerBattleLoadArg8(const u8 *ptr)\n{\n    return T1_READ_8(ptr);\n}\n\nstatic u16 GetTrainerAFlag(void)\n{\n    return TRAINER_FLAGS_START + gTrainerBattleOpponent_A;\n}\n\nstatic bool32 IsPlayerDefeated(u32 battleOutcome)\n{\n    switch (battleOutcome)\n    {\n    case B_OUTCOME_LOST:\n    case B_OUTCOME_DREW:\n        return TRUE;\n    case B_OUTCOME_WON:\n    case B_OUTCOME_RAN:\n    case B_OUTCOME_PLAYER_TELEPORTED:\n    case B_OUTCOME_MON_FLED:\n    case B_OUTCOME_CAUGHT:\n        return FALSE;\n    default:\n        return FALSE;\n    }\n}\n\nstatic void InitTrainerBattleVariables(void)\n{\n    sTrainerBattleMode = 0;\n    gTrainerBattleOpponent_A = 0;\n    sTrainerObjectEventLocalId = 0;\n    sTrainerAIntroSpeech = NULL;\n    sTrainerADefeatSpeech = NULL;\n    sTrainerVictorySpeech = NULL;\n    sTrainerCannotBattleSpeech = NULL;\n    sTrainerBattleEndScript = NULL;\n    sTrainerABattleScriptRetAddr = NULL;\n    sRivalBattleFlags = 0;\n}\n\nstatic inline void SetU8(void *ptr, u8 value)\n{\n    *(u8 *)(ptr) = value;\n}\n\nstatic inline void SetU16(void *ptr, u16 value)\n{\n    *(u16 *)(ptr) = value;\n}\n\nstatic inline void SetU32(void *ptr, u32 value)\n{\n    *(u32 *)(ptr) = value;\n}\n\nstatic inline void SetPtr(const void *ptr, const void *value)\n{\n    *(const void **)(ptr) = value;\n}\n\nstatic void TrainerBattleLoadArgs(const struct TrainerBattleParameter *specs, const u8 *data)\n{\n    while (1)\n    {\n        switch (specs->ptrType)\n        {\n        case TRAINER_PARAM_LOAD_VAL_8BIT:\n            SetU8(specs->varPtr, TrainerBattleLoadArg8(data));\n            data += 1;\n            break;\n        case TRAINER_PARAM_LOAD_VAL_16BIT:\n            SetU16(specs->varPtr, TrainerBattleLoadArg16(data));\n            data += 2;\n            break;\n        case TRAINER_PARAM_LOAD_VAL_32BIT:\n            SetU32(specs->varPtr, TrainerBattleLoadArg32(data));\n            data += 4;\n            break;\n        case TRAINER_PARAM_CLEAR_VAL_8BIT:\n            SetU8(specs->varPtr, 0);\n            break;\n        case TRAINER_PARAM_CLEAR_VAL_16BIT:\n            SetU16(specs->varPtr, 0);\n            break;\n        case TRAINER_PARAM_CLEAR_VAL_32BIT:\n            SetU32(specs->varPtr, 0);\n            break;\n        case TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR:\n            SetPtr(specs->varPtr, data);\n            return;\n        }\n        ++specs;\n    }\n}\n\nstatic void SetMapVarsToTrainer(void)\n{\n    if (sTrainerObjectEventLocalId != 0)\n    {\n        gSpecialVar_LastTalked = sTrainerObjectEventLocalId;\n        gSelectedObjectEvent = GetObjectEventIdByLocalIdAndMap(sTrainerObjectEventLocalId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);\n    }\n}\n\nconst u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data)\n{\n    InitTrainerBattleVariables();\n    sTrainerBattleMode = TrainerBattleLoadArg8(data);\n    switch (sTrainerBattleMode)\n    {\n    case TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT:\n        TrainerBattleLoadArgs(sOrdinaryNoIntroBattleParams, data);\n        return EventScript_DoNoIntroTrainerBattle;\n    case TRAINER_BATTLE_DOUBLE:\n        TrainerBattleLoadArgs(sDoubleBattleParams, data);\n        SetMapVarsToTrainer();\n        return EventScript_TryDoDoubleTrainerBattle;\n    case TRAINER_BATTLE_CONTINUE_SCRIPT:\n    case TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC:\n        TrainerBattleLoadArgs(sContinueScriptBattleParams, data);\n        SetMapVarsToTrainer();\n        return EventScript_TryDoNormalTrainerBattle;\n    case TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE:\n    case TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC:\n        TrainerBattleLoadArgs(sContinueScriptDoubleBattleParams, data);\n        SetMapVarsToTrainer();\n        return EventScript_TryDoDoubleTrainerBattle;\n    case TRAINER_BATTLE_REMATCH_DOUBLE:\n        QL_FinishRecordingScene();\n        TrainerBattleLoadArgs(sDoubleBattleParams, data);\n        SetMapVarsToTrainer();\n        gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A);\n        return EventScript_TryDoDoubleRematchBattle;\n    case TRAINER_BATTLE_REMATCH:\n        QL_FinishRecordingScene();\n        TrainerBattleLoadArgs(sOrdinaryBattleParams, data);\n        SetMapVarsToTrainer();\n        gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A);\n        return EventScript_TryDoRematchBattle;\n    case TRAINER_BATTLE_EARLY_RIVAL:\n        TrainerBattleLoadArgs(sEarlyRivalBattleParams, data);\n        return EventScript_DoNoIntroTrainerBattle;\n    default:\n        TrainerBattleLoadArgs(sOrdinaryBattleParams, data);\n        SetMapVarsToTrainer();\n        return EventScript_TryDoNormalTrainerBattle;\n    }\n}\n\nvoid ConfigureAndSetUpOneTrainerBattle(u8 trainerEventObjId, const u8 *trainerScript)\n{\n    gSelectedObjectEvent = trainerEventObjId;\n    gSpecialVar_LastTalked = gObjectEvents[trainerEventObjId].localId;\n    BattleSetup_ConfigureTrainerBattle(trainerScript + 1);\n    ScriptContext_SetupScript(EventScript_DoTrainerBattleFromApproach);\n    LockPlayerFieldControls();\n}\n\nbool32 GetTrainerFlagFromScriptPointer(const u8 *data)\n{\n    u32 flag = TrainerBattleLoadArg16(data + 2);\n\n    return FlagGet(TRAINER_FLAGS_START + flag);\n}\n\nvoid SetUpTrainerMovement(void)\n{\n    struct ObjectEvent *objectEvent = &gObjectEvents[gSelectedObjectEvent];\n\n    SetTrainerMovementType(objectEvent, GetTrainerFacingDirectionMovementType(objectEvent->facingDirection));\n}\n\nu8 GetTrainerBattleMode(void)\n{\n    return sTrainerBattleMode;\n}\n\nu16 GetRivalBattleFlags(void)\n{\n    return sRivalBattleFlags;\n}\n\nu16 Script_HasTrainerBeenFought(void)\n{\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n    {\n        return CheckMasterTrainerFlag(gSpecialVar_0x8009);\n    }\n    return FlagGet(GetTrainerAFlag());\n}\n\nvoid SetBattledTrainerFlag(void)\n{\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n    {\n        SetMasterTrainerFlag(gSpecialVar_0x8009);\n        return;\n    }\n    FlagSet(GetTrainerAFlag());\n}\n\n// not used\nstatic void SetBattledTrainerFlag2(void)\n{\n    FlagSet(GetTrainerAFlag());\n}\n\nbool8 HasTrainerBeenFought(u16 trainerId)\n{\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n    {\n        return CheckMasterTrainerFlag(gSpecialVar_0x8009);\n    }\n    return FlagGet(TRAINER_FLAGS_START + trainerId);\n}\n\nvoid SetTrainerFlag(u16 trainerId)\n{\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n    {\n        SetMasterTrainerFlag(gSpecialVar_0x8009);\n        return;\n    }\n    FlagSet(TRAINER_FLAGS_START + trainerId);\n}\n\nvoid ClearTrainerFlag(u16 trainerId)\n{\n    FlagClear(TRAINER_FLAGS_START + trainerId);\n}\n\nvoid StartTrainerBattle(void)\n{\n    gBattleTypeFlags = BATTLE_TYPE_TRAINER;\n    if (GetTrainerBattleMode() == TRAINER_BATTLE_EARLY_RIVAL && GetRivalBattleFlags() & RIVAL_BATTLE_TUTORIAL)\n        gBattleTypeFlags |= BATTLE_TYPE_FIRST_BATTLE;\n    gMain.savedCallback = CB2_EndTrainerBattle;\n    DoTrainerBattle();\n    ScriptContext_Stop();\n}\n\nstatic void CB2_EndTrainerBattle(void)\n{\n    if (sTrainerBattleMode == TRAINER_BATTLE_EARLY_RIVAL)\n    {\n        if (IsPlayerDefeated(gBattleOutcome) == TRUE)\n        {\n            gSpecialVar_Result = TRUE;\n            if (sRivalBattleFlags & RIVAL_BATTLE_HEAL_AFTER)\n            {\n                HealPlayerPartyOak();\n            }\n            else\n            {\n                SetMainCallback2(CB2_WhiteOut);\n                return;\n            }\n            SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n            SetBattledTrainerFlag();\n            QuestLogEvents_HandleEndTrainerBattle();\n        }\n        else\n        {\n            gSpecialVar_Result = FALSE;\n            SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n            SetBattledTrainerFlag();\n            QuestLogEvents_HandleEndTrainerBattle();\n        }\n\n    }\n    else\n    {\n        if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        {\n            if(IsPlayerDefeated(gBattleOutcome) == TRUE)\n            {\n                SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n                QuestLogEvents_HandleEndTrainerBattle();\n            }\n            else\n            {\n                SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n                SetBattledTrainerFlag();\n                QuestLogEvents_HandleEndTrainerBattle();\n            }\n            return;\n        }\n        if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)\n        {\n            SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n        }\n        else if (IsPlayerDefeated(gBattleOutcome) == TRUE)\n        {\n            SetMainCallback2(CB2_WhiteOut);\n        }\n        else\n        {\n            SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n            SetBattledTrainerFlag();\n            QuestLogEvents_HandleEndTrainerBattle();\n        }\n    }\n}\n\nstatic void CB2_EndRematchBattle(void)\n{\n    if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)\n    {\n        SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n    }\n    else if (IsPlayerDefeated(gBattleOutcome) == TRUE)\n    {\n        SetMainCallback2(CB2_WhiteOut);\n    }\n    else\n    {\n        SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n        SetBattledTrainerFlag();\n        ClearRematchStateOfLastTalked();\n        ResetDeferredLinkEvent();\n    }\n}\n\nvoid StartRematchBattle(void)\n{\n    gBattleTypeFlags = BATTLE_TYPE_TRAINER;\n    gMain.savedCallback = CB2_EndRematchBattle;\n    DoTrainerBattle();\n    ScriptContext_Stop();\n}\n\nvoid ShowTrainerIntroSpeech(void)\n{\n    ShowFieldMessage(GetIntroSpeechOfApproachingTrainer());\n}\n\nconst u8 *BattleSetup_GetScriptAddrAfterBattle(void)\n{\n    if (sTrainerBattleEndScript != NULL)\n        return sTrainerBattleEndScript;\n    else\n        return EventScript_ReleaseEnd;\n}\n\nconst u8 *BattleSetup_GetTrainerPostBattleScript(void)\n{\n    if (sTrainerABattleScriptRetAddr != NULL)\n        return sTrainerABattleScriptRetAddr;\n    else\n        return EventScript_ReleaseEnd;\n}\n\nvoid ShowTrainerCantBattleSpeech(void)\n{\n    ShowFieldMessage(GetTrainerCantBattleSpeech());\n}\n\nvoid PlayTrainerEncounterMusic(void)\n{\n    u16 music;\n\n    if (!QL_IS_PLAYBACK_STATE\n     && sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC\n     && sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC)\n    {\n        switch (GetTrainerEncounterMusicId(gTrainerBattleOpponent_A))\n        {\n        case TRAINER_ENCOUNTER_MUSIC_FEMALE:\n        case TRAINER_ENCOUNTER_MUSIC_GIRL:\n        case TRAINER_ENCOUNTER_MUSIC_TWINS:\n            music = MUS_ENCOUNTER_GIRL;\n            break;\n        case TRAINER_ENCOUNTER_MUSIC_MALE:\n        case TRAINER_ENCOUNTER_MUSIC_INTENSE:\n        case TRAINER_ENCOUNTER_MUSIC_COOL:\n        case TRAINER_ENCOUNTER_MUSIC_SWIMMER:\n        case TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR:\n        case TRAINER_ENCOUNTER_MUSIC_HIKER:\n        case TRAINER_ENCOUNTER_MUSIC_INTERVIEWER:\n        case TRAINER_ENCOUNTER_MUSIC_RICH:\n            music = MUS_ENCOUNTER_BOY;\n            break;\n        default:\n            music = MUS_ENCOUNTER_ROCKET;\n            break;\n        }\n        PlayNewMapMusic(music);\n    }\n}\n\nstatic const u8 *ReturnEmptyStringIfNull(const u8 *string)\n{\n    if (string == NULL)\n        return gString_Dummy;\n    else\n        return string;\n}\n\nstatic const u8 *GetIntroSpeechOfApproachingTrainer(void)\n{\n    return ReturnEmptyStringIfNull(sTrainerAIntroSpeech);\n}\n\nconst u8 *GetTrainerALoseText(void)\n{\n    const u8 *string = sTrainerADefeatSpeech;\n\n    StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(string));\n    return gStringVar4;\n}\n\nconst u8 *GetTrainerWonSpeech(void)\n{\n    StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(sTrainerVictorySpeech));\n    return gStringVar4;\n}\n\nstatic const u8 *GetTrainerCantBattleSpeech(void)\n{\n    return ReturnEmptyStringIfNull(sTrainerCannotBattleSpeech);\n}\n\ns8 GetScaledLevel(void)\n{\n    u8 levelScaling = gMapHeader.levelScaling;\n\n    if(gSaveBlock1Ptr->keyFlags.difficulty == DIFFICULTY_CHALLENGE)\n    {\n        //we're good, just return\n        return levelScaling;\n    }\n    else if(gSaveBlock1Ptr->keyFlags.difficulty == DIFFICULTY_EASY)\n    {\n        levelScaling = 0 - levelScaling;\n        return levelScaling;\n    }\n    else\n    {   //normal mode\n        levelScaling = 0;\n        return levelScaling;\n    }\n}"
  },
  {
    "path": "src/battle_tower.c",
    "content": "#include \"global.h\"\n#include \"battle_tower.h\"\n#include \"random.h\"\n#include \"text.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"string_util.h\"\n#include \"battle_message.h\"\n#include \"data.h\"\n#include \"pokedex.h\"\n#include \"overworld.h\"\n#include \"battle_transition.h\"\n#include \"easy_chat.h\"\n#include \"battle_setup.h\"\n#include \"battle_main.h\"\n#include \"task.h\"\n#include \"battle.h\"\n#include \"party_menu.h\"\n#include \"new_game.h\"\n#include \"save.h\"\n#include \"item.h\"\n#include \"script_pokemon_util.h\"\n#include \"trainer_tower.h\"\n#include \"load_save.h\"\n#include \"malloc.h\"\n#include \"constants/trainers.h\"\n#include \"constants/species.h\"\n#include \"constants/items.h\"\n#include \"constants/moves.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/event_objects.h\"\n\nstatic EWRAM_DATA u16 sSpecialVar_0x8004_Copy = 0;\n\n#define TakeBravoTrainerBattleTowerOffTheAir()\n#define ewram160FB (*((u8 *)&gBattleStruct->field_DA))\n\nstatic void ResetBattleTowerStreak(u8 levelType);\nstatic void SetBattleTowerTrainerGfxId(u8 trainerClass);\nstatic void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowerLevelType, u8 monLevel, u16 *validPartySpecies, u16 *validPartyHeldItems, u8 *numValid);\nstatic void SaveCurrentWinStreak(void);\nstatic void ValidateBattleTowerRecordChecksums(void);\nstatic void SetBattleTowerRecordChecksum(struct BattleTowerRecord * record);\nstatic void ClearBattleTowerRecord(struct BattleTowerRecord * record);\nstatic void PopulateBravoTrainerBattleTowerLostData(void);\nstatic u16 GetCurrentBattleTowerWinStreak(u8 levelType);\nstatic void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer * eReaderTrainer);\nstatic void PrintEReaderTrainerFarewellMessage(void);\nvoid SaveGameFrontier(void);\n\n// unknown unused data\nstatic const u8 sUnused[] = {\n    5, 4, 1, 16, 4, 2, 5, 6,\n    3, 16, 6, 4, 0, 1, 2, 3,\n    0, 2, 3\n};\n\nstruct SinglesTrainerInfo\n{\n    u8 objGfx;\n    u8 facilityClass;\n    bool8 gender;\n};\n\nstatic const struct SinglesTrainerInfo sSingleBattleTrainerInfo[] = {\n    {OBJ_EVENT_GFX_AROMA_LADY,     FACILITY_CLASS_RS_AROMA_LADY,     FEMALE},\n    {OBJ_EVENT_GFX_RUIN_MANIAC,    FACILITY_CLASS_RS_RUIN_MANIAC,      MALE},\n    {OBJ_EVENT_GFX_TUBER_F,        FACILITY_CLASS_RS_TUBER_F,        FEMALE},\n    {OBJ_EVENT_GFX_TUBER_M_LAND,   FACILITY_CLASS_RS_TUBER_M,          MALE},\n    {OBJ_EVENT_GFX_COOLTRAINER_M,  FACILITY_CLASS_RS_COOLTRAINER_M,    MALE},\n    {OBJ_EVENT_GFX_COOLTRAINER_F,  FACILITY_CLASS_RS_COOLTRAINER_F,  FEMALE},\n    {OBJ_EVENT_GFX_SUPER_NERD,     FACILITY_CLASS_HEX_MANIAC,          MALE},\n    {OBJ_EVENT_GFX_WOMAN_2,        FACILITY_CLASS_RS_LADY,           FEMALE},\n    {OBJ_EVENT_GFX_BEAUTY,         FACILITY_CLASS_RS_BEAUTY,         FEMALE},\n    {OBJ_EVENT_GFX_BOY,            FACILITY_CLASS_RICH_BOY,            MALE},\n    {OBJ_EVENT_GFX_POKE_MANIAC,    FACILITY_CLASS_RS_POKEMANIAC,       MALE},\n    {OBJ_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_RS_SWIMMER_M,        MALE},\n    {OBJ_EVENT_GFX_BLACKBELT,      FACILITY_CLASS_RS_BLACK_BELT,       MALE},\n    {OBJ_EVENT_GFX_ROCKER,         FACILITY_CLASS_GUITARIST,           MALE},\n    {OBJ_EVENT_GFX_ROCKER,         FACILITY_CLASS_KINDLER,             MALE},\n    {OBJ_EVENT_GFX_CAMPER,         FACILITY_CLASS_RS_CAMPER,           MALE},\n    {OBJ_EVENT_GFX_SUPER_NERD,     FACILITY_CLASS_BUG_MANIAC,          MALE},\n    {OBJ_EVENT_GFX_PSYCHIC_M,      FACILITY_CLASS_RS_PSYCHIC_M,        MALE},\n    {OBJ_EVENT_GFX_PSYCHIC_F,      FACILITY_CLASS_RS_PSYCHIC_F,      FEMALE},\n    {OBJ_EVENT_GFX_GENTLEMAN,      FACILITY_CLASS_RS_GENTLEMAN,        MALE},\n    {OBJ_EVENT_GFX_BOY,            FACILITY_CLASS_SCHOOL_KID_M,        MALE},\n    {OBJ_EVENT_GFX_WOMAN_1,        FACILITY_CLASS_SCHOOL_KID_F,      FEMALE},\n    {OBJ_EVENT_GFX_BALDING_MAN,    FACILITY_CLASS_POKEFAN_M,           MALE},\n    {OBJ_EVENT_GFX_WOMAN_3,        FACILITY_CLASS_POKEFAN_F,         FEMALE},\n    {OBJ_EVENT_GFX_OLD_MAN_1,      FACILITY_CLASS_EXPERT_M,            MALE},\n    {OBJ_EVENT_GFX_OLD_WOMAN,      FACILITY_CLASS_EXPERT_F,          FEMALE},\n    {OBJ_EVENT_GFX_YOUNGSTER,      FACILITY_CLASS_RS_YOUNGSTER,        MALE},\n    {OBJ_EVENT_GFX_FISHER,         FACILITY_CLASS_RS_FISHERMAN,        MALE},\n    {OBJ_EVENT_GFX_COOLTRAINER_M,  FACILITY_CLASS_DRAGON_TAMER,        MALE},\n    {OBJ_EVENT_GFX_BIRD_KEEPER,    FACILITY_CLASS_RS_BIRD_KEEPER,      MALE},\n    {OBJ_EVENT_GFX_LITTLE_BOY,     FACILITY_CLASS_NINJA_BOY,           MALE},\n    {OBJ_EVENT_GFX_BATTLE_GIRL,    FACILITY_CLASS_BATTLE_GIRL,       FEMALE},\n    {OBJ_EVENT_GFX_BEAUTY,         FACILITY_CLASS_PARASOL_LADY,      FEMALE},\n    {OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_RS_SWIMMER_F,      FEMALE},\n    {OBJ_EVENT_GFX_PICNICKER,      FACILITY_CLASS_RS_PICNICKER,      FEMALE},\n    {OBJ_EVENT_GFX_SAILOR,         FACILITY_CLASS_RS_SAILOR,           MALE},\n    {OBJ_EVENT_GFX_FAT_MAN,        FACILITY_CLASS_COLLECTOR,           MALE},\n    {OBJ_EVENT_GFX_MAN,            FACILITY_CLASS_RS_PKMN_BREEDER_M,   MALE},\n    {OBJ_EVENT_GFX_POKEMON_BREEDER, FACILITY_CLASS_RS_PKMN_BREEDER_F, FEMALE},\n    {OBJ_EVENT_GFX_POKEMON_RANGER_M, FACILITY_CLASS_RS_PKMN_RANGER_M,    MALE},\n    {OBJ_EVENT_GFX_POKEMON_RANGER_F, FACILITY_CLASS_RS_PKMN_RANGER_F,  FEMALE},\n    {OBJ_EVENT_GFX_LASS,           FACILITY_CLASS_RS_LASS,           FEMALE},\n    {OBJ_EVENT_GFX_BUG_CATCHER,    FACILITY_CLASS_RS_BUG_CATCHER,      MALE},\n    {OBJ_EVENT_GFX_HIKER,          FACILITY_CLASS_RS_HIKER,            MALE},\n    {OBJ_EVENT_GFX_YOUNGSTER,      FACILITY_CLASS_YOUNGSTER,           MALE},\n    {OBJ_EVENT_GFX_BUG_CATCHER,    FACILITY_CLASS_BUG_CATCHER,         MALE},\n    {OBJ_EVENT_GFX_LASS,           FACILITY_CLASS_LASS,              FEMALE},\n    {OBJ_EVENT_GFX_SAILOR,         FACILITY_CLASS_SAILOR,              MALE},\n    {OBJ_EVENT_GFX_CAMPER,         FACILITY_CLASS_CAMPER,              MALE},\n    {OBJ_EVENT_GFX_PICNICKER,      FACILITY_CLASS_PICNICKER,         FEMALE},\n    {OBJ_EVENT_GFX_POKE_MANIAC,    FACILITY_CLASS_POKEMANIAC,          MALE},\n    {OBJ_EVENT_GFX_SUPER_NERD,     FACILITY_CLASS_SUPER_NERD,          MALE},\n    {OBJ_EVENT_GFX_HIKER,          FACILITY_CLASS_HIKER,               MALE},\n    {OBJ_EVENT_GFX_BIKER,          FACILITY_CLASS_BIKER,               MALE},\n    {OBJ_EVENT_GFX_BURGLAR,        FACILITY_CLASS_BURGLAR,             MALE},\n    {OBJ_EVENT_GFX_ENGINEER,       FACILITY_CLASS_ENGINEER,            MALE},\n    {OBJ_EVENT_GFX_FISHER,         FACILITY_CLASS_FISHERMAN,           MALE},\n    {OBJ_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_SWIMMER_M,           MALE},\n    {OBJ_EVENT_GFX_CUE_BALL,       FACILITY_CLASS_CUE_BALL,            MALE},\n    {OBJ_EVENT_GFX_OLD_MAN_1,      FACILITY_CLASS_GAMER,               MALE},\n    {OBJ_EVENT_GFX_BEAUTY,         FACILITY_CLASS_BEAUTY,            FEMALE},\n    {OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SWIMMER_F,         FEMALE},\n    {OBJ_EVENT_GFX_PSYCHIC_M,      FACILITY_CLASS_PSYCHIC_M,           MALE},\n    {OBJ_EVENT_GFX_ROCKER_2,         FACILITY_CLASS_ROCKER,            MALE},\n    {OBJ_EVENT_GFX_JUGGLER,        FACILITY_CLASS_JUGGLER,             MALE},\n    {OBJ_EVENT_GFX_TAMER,          FACILITY_CLASS_TAMER,               MALE},\n    {OBJ_EVENT_GFX_BIRD_KEEPER,    FACILITY_CLASS_BIRD_KEEPER,         MALE},\n    {OBJ_EVENT_GFX_BLACKBELT,      FACILITY_CLASS_BLACK_BELT,          MALE},\n    {OBJ_EVENT_GFX_SCIENTIST,      FACILITY_CLASS_SCIENTIST,           MALE},\n    {OBJ_EVENT_GFX_COOLTRAINER_M,  FACILITY_CLASS_COOLTRAINER_M,       MALE},\n    {OBJ_EVENT_GFX_COOLTRAINER_F,  FACILITY_CLASS_COOLTRAINER_F,     FEMALE},\n    {OBJ_EVENT_GFX_GENTLEMAN,      FACILITY_CLASS_GENTLEMAN,           MALE},\n    {OBJ_EVENT_GFX_CHANNELER,      FACILITY_CLASS_CHANNELER,         FEMALE},\n    {OBJ_EVENT_GFX_PSYCHIC_F,      FACILITY_CLASS_PSYCHIC_F,         FEMALE},\n    {OBJ_EVENT_GFX_BATTLE_GIRL,    FACILITY_CLASS_CRUSH_GIRL,        FEMALE},\n    {OBJ_EVENT_GFX_TUBER_F,        FACILITY_CLASS_TUBER,             FEMALE},\n    {OBJ_EVENT_GFX_POKEMON_BREEDER, FACILITY_CLASS_PKMN_BREEDER,      FEMALE},\n    {OBJ_EVENT_GFX_POKEMON_RANGER_M, FACILITY_CLASS_PKMN_RANGER_M,       MALE},\n    {OBJ_EVENT_GFX_POKEMON_RANGER_F, FACILITY_CLASS_PKMN_RANGER_F,     FEMALE},\n    {OBJ_EVENT_GFX_AROMA_LADY,     FACILITY_CLASS_AROMA_LADY,        FEMALE},\n    {OBJ_EVENT_GFX_RUIN_MANIAC,    FACILITY_CLASS_RUIN_MANIAC,         MALE},\n    {OBJ_EVENT_GFX_LADY,           FACILITY_CLASS_LADY,              FEMALE},\n    {OBJ_EVENT_GFX_PAINTER,        FACILITY_CLASS_PAINTER,           FEMALE}\n};\n\n#include \"data/battle_tower/trainers.h\"\n\nstatic const u16 sBattleTowerHeldItems[] = {\n    ITEM_NONE,\n    ITEM_KINGS_ROCK,\n    ITEM_SITRUS_BERRY,\n    ITEM_ORAN_BERRY,\n    ITEM_CHESTO_BERRY,\n    ITEM_HARD_STONE,\n    ITEM_FOCUS_BAND,\n    ITEM_PERSIM_BERRY,\n    ITEM_MIRACLE_SEED,\n    ITEM_BERRY_JUICE,\n    ITEM_MACHO_BRACE,\n    ITEM_SILVER_POWDER,\n    ITEM_CHERI_BERRY,\n    ITEM_BLACK_GLASSES,\n    ITEM_BLACK_BELT,\n    ITEM_SOUL_DEW,\n    ITEM_CHOICE_BAND,\n    ITEM_MAGNET,\n    ITEM_SILK_SCARF,\n    ITEM_WHITE_HERB,\n    ITEM_DEEP_SEA_SCALE,\n    ITEM_DEEP_SEA_TOOTH,\n    ITEM_MYSTIC_WATER,\n    ITEM_SHARP_BEAK,\n    ITEM_QUICK_CLAW,\n    ITEM_LEFTOVERS,\n    ITEM_RAWST_BERRY,\n    ITEM_LIGHT_BALL,\n    ITEM_POISON_BARB,\n    ITEM_NEVER_MELT_ICE,\n    ITEM_ASPEAR_BERRY,\n    ITEM_SPELL_TAG,\n    ITEM_BRIGHT_POWDER,\n    ITEM_LEPPA_BERRY,\n    ITEM_SCOPE_LENS,\n    ITEM_TWISTED_SPOON,\n    ITEM_METAL_COAT,\n    ITEM_MENTAL_HERB,\n    ITEM_CHARCOAL,\n    ITEM_PECHA_BERRY,\n    ITEM_SOFT_SAND,\n    ITEM_LUM_BERRY,\n    ITEM_DRAGON_SCALE,\n    ITEM_DRAGON_FANG,\n    ITEM_IAPAPA_BERRY,\n    ITEM_WIKI_BERRY,\n    ITEM_SEA_INCENSE,\n    ITEM_SHELL_BELL,\n    ITEM_SALAC_BERRY,\n    ITEM_LANSAT_BERRY,\n    ITEM_APICOT_BERRY,\n    ITEM_STARF_BERRY,\n    ITEM_LIECHI_BERRY,\n    ITEM_STICK,\n    ITEM_LAX_INCENSE,\n    ITEM_AGUAV_BERRY,\n    ITEM_FIGY_BERRY,\n    ITEM_THICK_CLUB,\n    ITEM_MAGO_BERRY,\n    ITEM_METAL_POWDER,\n    ITEM_PETAYA_BERRY,\n    ITEM_LUCKY_PUNCH,\n    ITEM_GANLON_BERRY\n};\n\n#include \"data/battle_tower/level_50_mons.h\"\n#include \"data/battle_tower/level_100_mons.h\"\n\nstatic const u8 sMaleTrainerClasses[] =\n{\n\n};\n\nstatic const u8 sFemaleTrainerClasses[] =\n{\n\n};\n\nstatic const u8 sMaleTrainerGfx[] =\n{\n\n};\n\nstatic const u8 sFemaleTrainerGfx[] =\n{\n\n};\n\nconst u16 gBattleTowerBannedSpecies[] = {\n    SPECIES_MEW,\n    SPECIES_MEWTWO,\n    SPECIES_HO_OH,\n    SPECIES_LUGIA,\n    SPECIES_CELEBI,\n    SPECIES_KYOGRE,\n    SPECIES_GROUDON,\n    SPECIES_RAYQUAZA,\n    SPECIES_JIRACHI,\n    SPECIES_DEOXYS,\n    0xFFFF\n};\n\nstatic const u16 sShortStreakPrizes[] = {\n    ITEM_HP_UP,\n    ITEM_PROTEIN,\n    ITEM_IRON,\n    ITEM_CALCIUM,\n    ITEM_CARBOS,\n    ITEM_ZINC\n};\n\nstatic const u16 sLongStreakPrizes[] = {\n    ITEM_BRIGHT_POWDER,\n    ITEM_WHITE_HERB,\n    ITEM_QUICK_CLAW,\n    ITEM_LEFTOVERS,\n    ITEM_MENTAL_HERB,\n    ITEM_KINGS_ROCK,\n    ITEM_FOCUS_BAND,\n    ITEM_SCOPE_LENS,\n    ITEM_CHOICE_BAND\n};\n\nvoid BattleTowerMapScript2(void)\n{\n    u8 count = 0;\n    s32 levelType;\n\n    for (levelType = 0; levelType < 2; levelType++)\n    {\n        switch (gSaveBlock2Ptr->battleTower.var_4AE[levelType])\n        {\n        default:\n        case 0:\n            ResetBattleTowerStreak(levelType);\n            if (count == 0)\n                VarSet(VAR_TEMP_0, 5);\n            break;\n        case 1:\n            ResetBattleTowerStreak(levelType);\n            VarSet(VAR_TEMP_0, BTSPECIAL_RESULT_SAVE_SCUM);\n            count++;\n            break;\n        case 3:\n            break;\n        case 4:\n            VarSet(VAR_TEMP_0, BTSPECIAL_RESULT_WON7);\n            count++;\n            break;\n        case 5:\n            VarSet(VAR_TEMP_0, BTSPECIAL_RESULT_LOST);\n            count++;\n            break;\n        case 6:\n            break;\n        case 2:\n            VarSet(VAR_TEMP_0, BTSPECIAL_RESULT_QUICKSAVE);\n            count++;\n            break;\n        }\n    }\n    if (gSaveBlock2Ptr->battleTower.var_4AE[0] == 3 && gSaveBlock2Ptr->battleTower.var_4AE[1] == 3)\n        VarSet(VAR_TEMP_0, BTSPECIAL_RESULT_INACTIVE);\n    ValidateBattleTowerRecordChecksums();\n}\n\nstatic void ResetBattleTowerStreak(u8 levelType)\n{\n    gSaveBlock2Ptr->battleTower.var_4AE[levelType] = 0;\n    gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] = 1;\n    gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] = 1;\n}\n\nstatic bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak)\n{\n    u8 trainerTeamLevel;\n    u8 monLevel;\n    s32 i;\n    u16 validPartySpecies[6];\n    u16 validPartyHeldItems[6];\n    u8 numValid;\n\n    numValid = 0;\n\n    ValidateEReaderTrainer();\n\n    if (gSpecialVar_Result != 0 || gSaveBlock2Ptr->battleTower.ereaderTrainer.winStreak != winStreak)\n        return FALSE;\n\n    if (levelType != 0)\n        trainerTeamLevel = 100;\n    else\n        trainerTeamLevel = 50;\n\n    for (i = 0; i < 3; i++)\n    {\n        monLevel = gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].level;\n        if (gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].level != trainerTeamLevel)\n            return FALSE;\n\n        CheckMonBattleTowerBanlist(\n            gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].species,\n            gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].heldItem,\n            1,\n            levelType,\n            monLevel,\n            validPartySpecies,\n            validPartyHeldItems,\n            &numValid);\n    }\n\n    return (numValid == 3);\n}\n\nstatic bool8 ChooseSpecialBattleTowerTrainer(void)\n{\n    s32 recordIndex, i;\n    u8 battleTowerLevelType;\n    u16 winStreak;\n    bool8 retVal;\n    s32 numCandidates;\n    u32 trainerIds[5];\n\n    numCandidates = 0;\n    battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n\n    winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType);\n    if (ShouldBattleEReaderTrainer(battleTowerLevelType, winStreak))\n    {\n        gSaveBlock2Ptr->battleTower.battleTowerTrainerId = BATTLE_TOWER_EREADER_TRAINER_ID;\n        retVal = TRUE;\n    }\n    else\n    {\n        // Check if one of the battle tower trainers from record mixing should be the next trainer.\n        for (recordIndex = 0; recordIndex < 5; recordIndex++)\n        {\n            struct BattleTowerRecord *record = &gSaveBlock2Ptr->battleTower.records[recordIndex];\n            u32 recordHasData = 0;\n            u32 checksum = 0;\n\n            for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32) - 1; i++)\n            {\n                recordHasData |= ((u32 *) record)[i];\n                checksum += ((u32 *) record)[i];\n            }\n\n            if (gSaveBlock2Ptr->battleTower.records[recordIndex].winStreak == winStreak\n                && gSaveBlock2Ptr->battleTower.records[recordIndex].battleTowerLevelType == battleTowerLevelType\n                && recordHasData\n                && gSaveBlock2Ptr->battleTower.records[recordIndex].checksum == checksum)\n            {\n                trainerIds[numCandidates] = recordIndex;\n                numCandidates++;\n            }\n        }\n\n        if (numCandidates == 0)\n        {\n            retVal = FALSE;\n        }\n        else\n        {\n            gSaveBlock2Ptr->battleTower.battleTowerTrainerId =\n                trainerIds[Random() % numCandidates] + BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID;\n            retVal = TRUE;\n        }\n    }\n    return retVal;\n}\n\nvoid ChooseNextBattleTowerTrainer(void)\n{\n    int i;\n    u16 trainerId;\n    bool8 levelType;\n\n    levelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n    if (ChooseSpecialBattleTowerTrainer())\n    {\n        SetBattleTowerTrainerGfxId(gSaveBlock2Ptr->battleTower.battleTowerTrainerId);\n        gSaveBlock2Ptr->battleTower.battledTrainerIds[gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1] = gSaveBlock2Ptr->battleTower.battleTowerTrainerId;\n        return;\n    }\n\n    if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] <= 7)\n    {\n        if (gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] == 7)\n        {\n            do\n            {\n                trainerId = ((Random() & 0xFF) * 5) >> 7;\n                trainerId += (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] - 1) * 10 + 20;\n\n                // Ensure trainer wasn't previously fought in this challenge.\n                for (i = 0; i < gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2Ptr->battleTower.battledTrainerIds[i] != trainerId; i++);\n            }\n            while (i != gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1);\n            gSaveBlock2Ptr->battleTower.battleTowerTrainerId = trainerId;\n        }\n        else\n        {\n            do\n            {\n                trainerId = (((Random() & 0xFF) * 5) >> 6);\n                trainerId += (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] - 1) * 10;\n\n                // Ensure trainer wasn't previously fought in this challenge.\n                for (i = 0; i < gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2Ptr->battleTower.battledTrainerIds[i] != trainerId; i++);\n            }\n            while (i != gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1);\n            gSaveBlock2Ptr->battleTower.battleTowerTrainerId = trainerId;\n        }\n    }\n    else\n    {\n        do\n        {\n            trainerId = (((Random() & 0xFF) * 30) >> 8) + 70;\n\n            // Ensure trainer wasn't previously fought in this challenge.\n            for (i = 0; i < gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2Ptr->battleTower.battledTrainerIds[i] != trainerId; i++);\n        }\n        while (i != gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1);\n        gSaveBlock2Ptr->battleTower.battleTowerTrainerId = trainerId;\n    }\n\n    SetBattleTowerTrainerGfxId(gSaveBlock2Ptr->battleTower.battleTowerTrainerId);\n    // Don't bother saving this trainer, since it's the last one in the challenge.\n    if (gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] < 7)\n        gSaveBlock2Ptr->battleTower.battledTrainerIds[gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1] = gSaveBlock2Ptr->battleTower.battleTowerTrainerId;\n}\n\nstatic void SetBattleTowerTrainerGfxId(u8 trainerClass)\n{\n    u32 i;\n    u8 facilityClass, trainerGfx1;\n\n    facilityClass = gBattleTowerTrainers[trainerClass].trainerClass;\n    for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++)\n    {\n        if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass)\n            break;\n    }\n\n    if (i != NELEMS(sSingleBattleTrainerInfo))\n    {\n        trainerGfx1 = sSingleBattleTrainerInfo[i].objGfx;\n        gSpecialVar_LastTalked = sSingleBattleTrainerInfo[i].gender;\n    }\n    else\n    {\n        trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER;\n        gSpecialVar_LastTalked = MALE;\n    }\n\n    VarSet(VAR_OBJ_GFX_ID_0, trainerGfx1);\n}\n\nvoid SetEReaderTrainerGfxId(void)\n{\n    SetBattleTowerTrainerGfxId(BATTLE_TOWER_EREADER_TRAINER_ID);\n}\n\n// Unreferenced; formerly used by Record Mixing in R/S\nstatic void UpdateOrInsertReceivedBattleTowerRecord(struct BattleTowerRecord * record0)\n{\n    s32 i;\n    s32 j;\n    s32 k;\n    s32 l = 0;\n    struct BattleTowerRecord * record = record0;\n\n    u16 winStreaks[6];\n    u16 indices[6];\n\n    for (i = 0; i < 5; i++)\n    {\n        k = 0;\n        for (j = 0; j < 4; j++)\n        {\n            if (gSaveBlock2Ptr->battleTower.records[i].trainerId[j] != record->trainerId[j])\n                break;\n        }\n        if (j == 4)\n        {\n            for (k = 0; k < 7; k++)\n            {\n                if (gSaveBlock2Ptr->battleTower.records[i].name[j] != record->name[j])\n                    break;\n                if (record->name[j] == EOS)\n                {\n                    k = 7;\n                    break;\n                }\n            }\n        }\n        if (k == 7)\n            break;\n    }\n\n    if (i < 5)\n    {\n        gSaveBlock2Ptr->battleTower.records[i] = *record;\n        return;\n    }\n\n    for (i = 0; i < 5; i++)\n    {\n        if (gSaveBlock2Ptr->battleTower.records[i].winStreak == 0)\n            break;\n    }\n\n    if (i < 5)\n    {\n        gSaveBlock2Ptr->battleTower.records[i] = *record;\n        return;\n    }\n\n    winStreaks[0] = gSaveBlock2Ptr->battleTower.records[0].winStreak;\n    indices[0] = 0;\n    l++;\n\n    for (i = 1; i < 5; i++)\n    {\n        for (j = 0; j < l; j++)\n        {\n            if (gSaveBlock2Ptr->battleTower.records[i].winStreak < winStreaks[j])\n            {\n                j = 0;\n                l = 1;\n                winStreaks[0] = gSaveBlock2Ptr->battleTower.records[i].winStreak;\n                indices[0] = i;\n                break;\n            }\n            if (gSaveBlock2Ptr->battleTower.records[i].winStreak > winStreaks[j])\n                break;\n        }\n        if (j == l)\n        {\n            winStreaks[l] = gSaveBlock2Ptr->battleTower.records[i].winStreak;\n            indices[l] = i;\n            l++;\n        }\n    }\n    i = Random() % l;\n    gSaveBlock2Ptr->battleTower.records[indices[i]] = *record;\n}\n\nu8 GetBattleTowerTrainerFrontSpriteId(void)\n{\n    if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)\n    {\n        return gFacilityClassToPicIndex[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass];\n    }\n    else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)\n    {\n        return gFacilityClassToPicIndex[gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].trainerClass];\n    }\n    else\n    {\n        return gFacilityClassToPicIndex[gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass];\n    }\n}\n\nu8 GetBattleTowerTrainerClassNameId(void)\n{\n    if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)\n    {\n        return gFacilityClassToTrainerClass[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass];\n    }\n    else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)\n    {\n        return gFacilityClassToTrainerClass[gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass];\n    }\n    else\n    {\n        return gFacilityClassToTrainerClass[gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].trainerClass];\n    }\n}\n\nvoid GetBattleTowerTrainerName(u8 *dest)\n{\n    s32 i;\n    if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)\n    {\n        for (i = 0; i < 7; i++)\n            dest[i] = gSaveBlock2Ptr->battleTower.ereaderTrainer.name[i];\n    }\n    else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)\n    {\n        for (i = 0; i < 7; i++)\n            dest[i] = gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].name[i];\n    }\n    else\n    {\n        for (i = 0; i < 7; i++)\n            dest[i] = gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].name[i];\n    }\n    dest[i] = EOS;\n}\n\nstatic void FillBattleTowerTrainerParty(void)\n{\n    s32 partyIndex;\n    s32 i;\n    u16 chosenMonIndices[3];\n    u8 friendship;\n    u8 level;\n    u8 fixedIV;\n    u8 battleMonsOffset;\n    u8 monPoolSize;\n    u8 teamFlags;\n    const struct BattleTowerPokemonTemplate *battleTowerMons;\n\n    battleMonsOffset = 0;\n    monPoolSize = 60;\n    friendship = 255;\n\n    ZeroEnemyPartyMons();\n\n    // Different trainers have access to different sets of pokemon to use in battle.\n    // The pokemon later in gBattleTowerLevel100Mons or gBattleTowerLevel50Mons are\n    // stronger. Additionally, the later trainers' pokemon are granted higher IVs.\n    if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 20)\n    {\n        fixedIV = 6;\n    }\n    else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 30)\n    {\n        fixedIV = 9;\n        battleMonsOffset = 30;\n    }\n    else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 40)\n    {\n        fixedIV = 12;\n        battleMonsOffset = 60;\n    }\n    else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 50)\n    {\n        fixedIV = 15;\n        battleMonsOffset = 90;\n    }\n    else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 60)\n    {\n        fixedIV = 18;\n        battleMonsOffset = 120;\n    }\n    else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 70)\n    {\n        fixedIV = 21;\n        battleMonsOffset = 150;\n    }\n    else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 80)\n    {\n        fixedIV = 31;\n        battleMonsOffset = 180;\n    }\n    else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)\n    {\n        fixedIV = 31;\n        battleMonsOffset = 200;\n        monPoolSize = 100;\n    }\n    else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)\n    {\n        // Load E-Reader trainer's party.\n        do\n        {\n            for (partyIndex = 0; partyIndex < 3; partyIndex++)\n                CreateBattleTowerMon(&gEnemyParty[partyIndex], &gSaveBlock2Ptr->battleTower.ereaderTrainer.party[partyIndex]);\n            return;\n        } while (0);\n    }\n    else\n    {\n        // Load a battle tower record's party. (From record mixing)\n        for (partyIndex = 0; partyIndex < 3; partyIndex++)\n        {\n            CreateBattleTowerMon(\n                &gEnemyParty[partyIndex],\n                &gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[partyIndex]);\n        }\n        return;\n    }\n\n    // Use the appropriate list of pokemon and level depending on the\n    // current challenge type. (level 50 or level 100 challenge)\n    if (gSaveBlock2Ptr->battleTower.battleTowerLevelType != 0)\n    {\n        battleTowerMons = gBattleTowerLevel100Mons;\n        level = GetHighestLevelInPlayerParty();\n        if(level < 60)\n            level = 60;\n    }\n    else\n    {\n        battleTowerMons = gBattleTowerLevel50Mons;\n        level = 50;\n    }\n\n    teamFlags = gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].teamFlags;\n\n    // Attempt to fill the trainer's party with random Pokemon until 3 have been\n    // successfully chosen. The trainer's party may not have duplicate pokemon species\n    // or duplicate held items. Each pokemon must have all of the trainer's team flags\n    // set, as well.  If any of those conditions are not met, then the loop starts over\n    // and another pokemon is chosen at random.\n    partyIndex = 0;\n    while (partyIndex != 3)\n    {\n        // Pick a random pokemon index based on the number of pokemon available to choose from\n        // and the starting offset in the battle tower pokemon array.\n        s32 battleMonIndex = ((Random() & 0xFF) * monPoolSize) / 256 + battleMonsOffset;\n\n        // Ensure the chosen pokemon has compatible team flags with the trainer.\n        if (teamFlags == 0 || (battleTowerMons[battleMonIndex].teamFlags & teamFlags) == teamFlags)\n        {\n            // Ensure this pokemon species isn't a duplicate.\n            for (i = 0; i < partyIndex; i++)\n            {\n                if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL) == battleTowerMons[battleMonIndex].species)\n                    break;\n            }\n\n            if (i != partyIndex)\n                continue;\n\n            // Ensure this pokemon's held item isn't a duplicate.\n            for (i = 0; i < partyIndex; i++)\n            {\n                if (GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) != ITEM_NONE\n                    && GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) == sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem])\n                    break;\n            }\n\n            if (i != partyIndex)\n                continue;\n\n            // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary\n            // because the species and held items were already checked directly above. Perhaps this\n            // is leftover code before the logic for duplicate species and held items was added.\n            //for (i = 0; i < partyIndex && chosenMonIndices[i] != battleMonIndex; i++);\n            for (i = 0; i < partyIndex; i++)\n            {\n                if (chosenMonIndices[i] == battleMonIndex)\n                    break;\n            }\n\n            if (i != partyIndex)\n                continue;\n\n            chosenMonIndices[partyIndex] = battleMonIndex;\n\n            // Place the chosen pokemon into the trainer's party.\n            CreateMonWithEVSpread(\n                &gEnemyParty[partyIndex],\n                battleTowerMons[battleMonIndex].species,\n                level,\n                fixedIV,\n                battleTowerMons[battleMonIndex].evSpread);\n\n            // Give the chosen pokemon its specified moves.\n            for (i = 0; i < 4; i++)\n            {\n                SetMonMoveSlot(&gEnemyParty[partyIndex], battleTowerMons[battleMonIndex].moves[i], i);\n                if (battleTowerMons[battleMonIndex].moves[i] == MOVE_FRUSTRATION)\n                    friendship = 0;  // MOVE_FRUSTRATION is more powerful the lower the pokemon's friendship is.\n            }\n\n            SetMonData(&gEnemyParty[partyIndex], MON_DATA_FRIENDSHIP, &friendship);\n            SetMonData(&gEnemyParty[partyIndex], MON_DATA_HELD_ITEM, &sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]);\n\n            // The pokemon was successfully added to the trainer's party, so it's safe to move on to\n            // the next party slot.\n            partyIndex++;\n        }\n    }\n}\n\nstatic u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 count)\n{\n    if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT))\n    {\n        if (count == 0)\n            StringAppend(gStringVar1, gText_BattleTowerBan_Space);\n        count++;\n        StringAppend(gStringVar1, gSpeciesNames[species]);\n        switch (count)\n        {\n        case 2:\n            StringAppend(gStringVar1, gText_BattleTowerBan_Newline2);\n            break;\n        case 5:\n        case 8:\n        case 11:\n            StringAppend(gStringVar1, gText_BattleTowerBan_Newline1);\n            break;\n        default:\n            StringAppend(gStringVar1, gText_BattleTowerBan_Space);\n            break;\n        }\n    }\n    return count;\n}\n\nstatic void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowerLevelType, u8 monLevel, u16 *validPartySpecies, u16 *validPartyHeldItems, u8 *numValid)\n{\n    s32 i;\n    u32 counter = 0;\n\n    if (species == SPECIES_EGG || species == SPECIES_NONE)\n        return;\n\n    while (1)\n    {\n        if (gBattleTowerBannedSpecies[counter] == 0xFFFF)\n            break;\n\n        if (gBattleTowerBannedSpecies[counter] == species)\n            break;\n\n        counter++;\n    }\n\n    if (gBattleTowerBannedSpecies[counter] != 0xFFFF)\n        return;\n\n    if (battleTowerLevelType == 0 && monLevel > 50)\n        return;\n\n    for (i = 0; i < *numValid && validPartySpecies[i] != species ; i++);\n    if (i != *numValid)\n        return;\n\n    if (heldItem != ITEM_NONE)\n    {\n        for (i = 0; i < *numValid && validPartyHeldItems[i] != heldItem ; i++);\n        if (i != *numValid)\n            return;\n    }\n\n    validPartySpecies[*numValid] = species;\n    validPartyHeldItems[*numValid] = heldItem;\n    *numValid = *numValid + 1;\n}\n\nvoid CheckPartyBattleTowerBanlist(void)\n{\n    s32 i;\n    u16 species2;\n    u16 heldItem;\n    u8 level;\n    u16 hp;\n    u32 numBanlistCaught;\n    u16 validPartySpecies[6];\n    u16 validPartyHeldItems[6];\n    u8 counter;\n\n    counter = 0;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        species2 = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG);\n        heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);\n        level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);\n        hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);\n\n        CheckMonBattleTowerBanlist(species2, heldItem, hp, gSpecialVar_Result, level, validPartySpecies, validPartyHeldItems, &counter);\n    }\n\n    if (counter < 3)\n    {\n        gStringVar1[0] = EOS;\n        gSpecialVar_0x8004 = 1;\n        counter = 0;\n\n        for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++)\n            counter = AppendBattleTowerBannedSpeciesName(gBattleTowerBannedSpecies[i], counter);\n\n        i = StringLength(gStringVar1);\n        gStringVar1[i - 1] = EOS;\n        if (counter < 3)\n            StringAppend(gStringVar1, gText_BattleTowerBan_Is1);\n        else\n            StringAppend(gStringVar1, gText_BattleTowerBan_Is2);\n    }\n    else\n    {\n        gSpecialVar_0x8004 = 0;\n        gSaveBlock2Ptr->battleTower.battleTowerLevelType = gSpecialVar_Result;\n    }\n}\n\nstatic void BufferBattleTowerTrainerMessage(const u16 *greeting)\n{\n    s32 i;\n    if (EC_DoesEasyChatStringFitOnLine(greeting, 3, 2, 18))\n    {\n        ConvertEasyChatWordsToString(gStringVar4, greeting, 2, 3);\n        i = 0;\n        while (gStringVar4[i++] != CHAR_NEWLINE)\n            ;\n        while (gStringVar4[i] != CHAR_NEWLINE)\n            i++;\n        gStringVar4[i] = CHAR_PROMPT_SCROLL;\n    }\n    else\n    {\n        ConvertEasyChatWordsToString(gStringVar4, greeting, 3, 2);\n    }\n}\n\nvoid PrintBattleTowerTrainerGreeting(void)\n{\n    if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)\n        BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting);\n    else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)\n        BufferBattleTowerTrainerMessage(gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].greeting);\n    else\n        BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting);\n}\n\nstatic void CB2_FinishEReaderBattle(void)\n{\n    s32 i;\n    u16 heldItem;\n\n    switch (sSpecialVar_0x8004_Copy)\n    {\n    case 0:\n        break;\n    case 1:\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            heldItem = GetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HELD_ITEM);\n            SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem);\n        }\n        break;\n    case 2:\n        PrintEReaderTrainerFarewellMessage();\n        break;\n    }\n\n    SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n}\n\nstatic void Task_WaitBT(u8 taskId)\n{\n    if (IsBattleTransitionDone() == TRUE)\n    {\n        gMain.savedCallback = CB2_FinishEReaderBattle;\n        CleanupOverworldWindowsAndTilemaps();\n        SetMainCallback2(CB2_InitBattle);\n        DestroyTask(taskId);\n    }\n}\n\n\nvoid StartSpecialBattle(void)\n{\n    s32 i;\n    u16 heldItem;\n    u8 transition;\n\n    sSpecialVar_0x8004_Copy = gSpecialVar_0x8004;\n    switch (sSpecialVar_0x8004_Copy)\n    {\n    case 0: // battle tower battle\n        gBattleTypeFlags = (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_TRAINER);\n        gTrainerBattleOpponent_A = 0;\n\n        FillBattleTowerTrainerParty();\n\n        CreateTask(Task_WaitBT, 1);\n        PlayMapChosenOrBattleBGM(0);\n        transition = BattleSetup_GetBattleTowerBattleTransition();\n        BattleTransition_StartOnField(transition);\n        break;\n    case 1: // secret base battle\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);\n            SetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HELD_ITEM, &heldItem);\n        }\n\n        CreateTask(Task_WaitBT, 1);\n        PlayMapChosenOrBattleBGM(0);\n        transition = BattleSetup_GetBattleTowerBattleTransition();\n        BattleTransition_StartOnField(transition);\n        break;\n    case 2: // e-reader trainer battle\n        ZeroEnemyPartyMons();\n\n        for (i = 0; i < 3; i++)\n            CreateBattleTowerMon(&gEnemyParty[i], &gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i]);\n\n        gBattleTypeFlags = (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER);\n        gTrainerBattleOpponent_A = 0;\n\n        CreateTask(Task_WaitBT, 1);\n        PlayMapChosenOrBattleBGM(0);\n        transition = BattleSetup_GetBattleTowerBattleTransition();\n        BattleTransition_StartOnField(transition);\n        break;\n    }\n}\n\nvoid SetBattleTowerProperty(void)\n{\n    s32 i;\n    u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n\n    switch (gSpecialVar_0x8004)\n    {\n    case 0:\n        ewram160FB = gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType];\n        gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8005;\n        break;\n    case 1:\n        gSaveBlock2Ptr->battleTower.battleTowerLevelType = gSpecialVar_0x8005;\n        break;\n    case 2:\n        gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType] = gSpecialVar_0x8005;\n        break;\n    case 3:\n        gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] = gSpecialVar_0x8005;\n        break;\n    case 4:\n        gSaveBlock2Ptr->battleTower.battleTowerTrainerId = gSpecialVar_0x8005;\n        break;\n    case 5:\n        for (i = 0; i < 3; i++)\n            gSaveBlock2Ptr->battleTower.selectedPartyMons[i] = gSelectedOrderFromParty[i];\n        break;\n    case 6:\n        if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)\n            ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer);\n        if (gSaveBlock2Ptr->battleTower.totalBattleTowerWins < 9999)\n            gSaveBlock2Ptr->battleTower.totalBattleTowerWins++;\n        gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType]++;\n        SaveCurrentWinStreak();\n        gSpecialVar_Result = gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType];\n        gStringVar1[0] = gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType] + 0xA1;\n        gStringVar1[1] = 0xFF;\n        break;\n    case 7:\n        if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] < 1430)\n            gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType]++;\n        SaveCurrentWinStreak();\n        gSpecialVar_Result = gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType];\n        break;\n    case 8:\n        gSaveBlock2Ptr->battleTower.unk_554 = gSpecialVar_0x8005;\n        break;\n    case 9:\n        break;\n    case 10:\n        SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak);\n        break;\n    case 11:\n        if (gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] != 3)\n            ResetBattleTowerStreak(battleTowerLevelType);\n        break;\n    case 12:\n        gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = ewram160FB;\n        break;\n    case 13:\n        gSaveBlock2Ptr->battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType);\n        break;\n    case 14:\n        gSaveBlock2Ptr->battleTower.lastStreakLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n        break;\n    }\n}\n\nvoid BattleTowerUtil(void)\n{\n    u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n\n    switch (gSpecialVar_0x8004)\n    {\n    case 0:\n        gSpecialVar_Result = gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType];\n        break;\n    case 1:\n        gSpecialVar_Result = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n        break;\n    case 2:\n        gSpecialVar_Result = gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType];\n        break;\n    case 3:\n        gSpecialVar_Result = gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType];\n        break;\n    case 4:\n        gSpecialVar_Result = gSaveBlock2Ptr->battleTower.battleTowerTrainerId;\n        break;\n    case 5:\n    case 6:\n    case 7:\n        break;\n    case 8:\n        gSpecialVar_Result = gSaveBlock2Ptr->battleTower.unk_554;\n        break;\n    case 9:\n        gSpecialVar_Result = GetCurrentBattleTowerWinStreak(battleTowerLevelType);\n        break;\n    case 10:\n        SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak);\n        break;\n    case 11:\n        ResetBattleTowerStreak(battleTowerLevelType);\n        break;\n    case 12:\n        gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = ewram160FB;\n        break;\n    case 13:\n        gSaveBlock2Ptr->battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType);\n        break;\n    case 14:\n        gSaveBlock2Ptr->battleTower.lastStreakLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n        break;\n    }\n}\n\nvoid SetBattleTowerParty(void)\n{\n    s32 i;\n\n    for (i = 0; i < 3; i++)\n        gSelectedOrderFromParty[i] = gSaveBlock2Ptr->battleTower.selectedPartyMons[i];\n\n    ReducePlayerPartyToThree();\n}\n\nstatic void SaveCurrentWinStreak(void)\n{\n    u8 levelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n    u16 streak = GetCurrentBattleTowerWinStreak(levelType);\n\n    if (gSaveBlock2Ptr->battleTower.recordWinStreaks[levelType] < streak)\n        gSaveBlock2Ptr->battleTower.recordWinStreaks[levelType] = streak;\n\n    if (gSaveBlock2Ptr->battleTower.recordWinStreaks[0] > gSaveBlock2Ptr->battleTower.recordWinStreaks[1])\n    {\n        streak = gSaveBlock2Ptr->battleTower.recordWinStreaks[0];\n        SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak);\n\n        if (streak > 9999)\n            gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak = 9999;\n        else\n            gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak = streak;\n    }\n    else\n    {\n        streak = gSaveBlock2Ptr->battleTower.recordWinStreaks[1];\n        SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak);\n\n        if (streak > 9999)\n            gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak = 9999;\n        else\n            gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak = streak;\n    }\n}\n\nstatic void SetPlayerBattleTowerRecord(void)\n{\n    s32 i;\n    u8 trainerClass;\n    struct BattleTowerRecord *playerRecord = &gSaveBlock2Ptr->battleTower.playerRecord;\n    u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n\n    if (gSaveBlock2Ptr->playerGender != MALE)\n    {\n        trainerClass = sFemaleTrainerClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1]\n                                              + gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % NELEMS(sFemaleTrainerClasses)];\n    }\n    else\n    {\n        trainerClass = sMaleTrainerClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1]\n                                            + gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % NELEMS(sMaleTrainerClasses)];\n    }\n\n    playerRecord->battleTowerLevelType = battleTowerLevelType;\n    playerRecord->trainerClass = trainerClass;\n\n    CopyTrainerId(playerRecord->trainerId, gSaveBlock2Ptr->playerTrainerId);\n    StringCopy_PlayerName(playerRecord->name, gSaveBlock2Ptr->playerName);\n\n    playerRecord->winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType);\n\n    for (i = 0; i < 6; i++)\n        playerRecord->greeting[i] = gSaveBlock1Ptr->easyChatBattleStart[i];\n\n    for (i = 0; i < 3; i++)\n        ConvertPokemonToBattleTowerPokemon(&gPlayerParty[gSaveBlock2Ptr->battleTower.selectedPartyMons[i] - 1],\n                                           &playerRecord->party[i]);\n\n    SetBattleTowerRecordChecksum(&gSaveBlock2Ptr->battleTower.playerRecord);\n    SaveCurrentWinStreak();\n}\n\nvoid SaveBattleTowerProgress(void)\n{\n    u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n\n    /*if (gSpecialVar_0x8004 == 3 || gSpecialVar_0x8004 == 0)\n    {\n        if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] > 1\n            || gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType] > 1)\n            SetPlayerBattleTowerRecord();\n    }*/\n\n    //PopulateBravoTrainerBattleTowerLostData();\n\n    gSaveBlock2Ptr->battleTower.battleOutcome = gBattleOutcome;\n\n    if (gSpecialVar_0x8004 != 3)\n        gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8004;\n\n    VarSet(VAR_TEMP_0, BTSPECIAL_TEST);\n    gSaveBlock2Ptr->battleTower.unk_554 = 1;\n    SaveGameFrontier(); //this is clobbering items, money, and other data\n}\n\nvoid SaveGameFrontier(void) //from Emerald\n{\n    s32 i;\n    struct Pokemon *monsParty = calloc(PARTY_SIZE, sizeof(struct Pokemon));\n\n    for (i = 0; i < PARTY_SIZE; i++)\n        monsParty[i] = gPlayerParty[i];\n\n    i = gPlayerPartyCount;\n    LoadPlayerParty();\n    SetContinueGameWarpStatusToDynamicWarp();\n    TrySavingData(SAVE_LINK);\n    ClearContinueGameWarpStatus2();\n    gPlayerPartyCount = i;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n        gPlayerParty[i] = monsParty[i];\n\n    free(monsParty);\n}\n\n\nvoid BattleTower_SoftReset(void)\n{\n    DoSoftReset();\n}\n\nstatic void ValidateBattleTowerRecordChecksums(void)\n{\n    u32 i;\n    s32 recordIndex;\n    struct BattleTowerRecord *record;\n    u32 checksum;\n\n    record = &gSaveBlock2Ptr->battleTower.playerRecord;\n    checksum = 0;\n    for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++)\n        checksum += ((u32 *)record)[i];\n\n    if (gSaveBlock2Ptr->battleTower.playerRecord.checksum != checksum)\n        ClearBattleTowerRecord(&gSaveBlock2Ptr->battleTower.playerRecord);\n\n    for (recordIndex = 0; recordIndex < 5; recordIndex++)\n    {\n        record = &gSaveBlock2Ptr->battleTower.records[recordIndex];\n        checksum = 0;\n        for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++)\n            checksum += ((u32 *)record)[i];\n\n        if (gSaveBlock2Ptr->battleTower.records[recordIndex].checksum != checksum)\n            ClearBattleTowerRecord(&gSaveBlock2Ptr->battleTower.records[recordIndex]);\n    }\n}\n\nstatic void SetBattleTowerRecordChecksum(struct BattleTowerRecord *record)\n{\n    u32 i;\n\n    record->checksum = 0;\n    for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++)\n        record->checksum += ((u32 *)record)[i];\n}\n\nstatic void ClearBattleTowerRecord(struct BattleTowerRecord *record)\n{\n    u32 i;\n\n    for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32); i++)\n        ((u32 *)record)[i] = 0;\n}\n\nstatic void PopulateBravoTrainerBattleTowerLostData(void)\n{\n    s32 i;\n\n    GetBattleTowerTrainerName(gSaveBlock2Ptr->battleTower.defeatedByTrainerName);\n    gSaveBlock2Ptr->battleTower.defeatedBySpecies = gBattleMons[1].species;\n    gSaveBlock2Ptr->battleTower.firstMonSpecies = gBattleMons[0].species;\n\n    for (i = 0; i < POKEMON_NAME_LENGTH; i++)\n        gSaveBlock2Ptr->battleTower.firstMonNickname[i] = gBattleMons[0].nickname[i];\n}\n\nstatic u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType)\n{\n    u16 winStreak = ((gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] - 1) * 7 - 1)\n                    + gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType];\n\n    if (winStreak > 9999)\n        return 9999;\n    else\n        return winStreak;\n}\n\nvoid DetermineBattleTowerPrize(void)\n{\n    u8 levelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n\n    if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] - 1 > 5)\n        gSaveBlock2Ptr->battleTower.prizeItem = sLongStreakPrizes[Random() % NELEMS(sLongStreakPrizes)];\n    else\n        gSaveBlock2Ptr->battleTower.prizeItem = sShortStreakPrizes[Random() % NELEMS(sShortStreakPrizes)];\n}\n\nvoid GiveBattleTowerPrize(void)\n{\n    u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n\n    if (AddBagItem(gSaveBlock2Ptr->battleTower.prizeItem, 1) == TRUE)\n    {\n        CopyItemName(gSaveBlock2Ptr->battleTower.prizeItem, gStringVar1);\n        gSpecialVar_Result = 1;\n    }\n    else\n    {\n        gSpecialVar_Result = 0;\n        gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = 6;\n    }\n}\n\nvoid AwardBattleTowerRibbons(void)\n{\n    s32 i;\n    u32 partyIndex;\n    struct Pokemon *pokemon;\n    u8 ribbonType;\n    u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;\n\n    if (battleTowerLevelType != 0)\n        ribbonType = MON_DATA_VICTORY_RIBBON;\n    else\n        ribbonType = MON_DATA_WINNING_RIBBON;\n\n    gSpecialVar_Result = 0;\n\n    if (GetCurrentBattleTowerWinStreak(battleTowerLevelType) > 55)\n    {\n        for (i = 0; i < 3; i++)\n        {\n            partyIndex = gSaveBlock2Ptr->battleTower.selectedPartyMons[i] - 1;\n            pokemon = &gPlayerParty[partyIndex];\n            if (!GetMonData(pokemon, ribbonType))\n            {\n                gSpecialVar_Result = 1;\n                SetMonData(pokemon, ribbonType, &gSpecialVar_Result);\n            }\n        }\n    }\n\n    if (gSpecialVar_Result != 0)\n        IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS);\n}\n\n// This is a leftover debugging function that is used to populate the E-Reader\n// trainer with the player's current data.\nstatic void Debug_FillEReaderTrainerWithPlayerData(void)\n{\n    struct BattleTowerEReaderTrainer *ereaderTrainer;\n    s32 i;\n    s32 j;\n\n    ereaderTrainer = &gSaveBlock2Ptr->battleTower.ereaderTrainer;\n\n    if (gSaveBlock2Ptr->playerGender != MALE)\n    {\n        ereaderTrainer->trainerClass = sFemaleTrainerClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1]\n                                                              + gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % NELEMS(sFemaleTrainerClasses)];\n    }\n    else\n    {\n        ereaderTrainer->trainerClass = sMaleTrainerClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1]\n                                                            + gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % NELEMS(sMaleTrainerClasses)];\n    }\n\n    CopyTrainerId(ereaderTrainer->trainerId, gSaveBlock2Ptr->playerTrainerId);\n    StringCopy_PlayerName(ereaderTrainer->name, gSaveBlock2Ptr->playerName);\n\n    ereaderTrainer->winStreak = 1;\n\n    j = 7;\n    for (i = 0; i < 6; i++)\n    {\n        ereaderTrainer->greeting[i] = gSaveBlock1Ptr->easyChatBattleStart[i];\n        ereaderTrainer->farewellPlayerLost[i] = j;\n        ereaderTrainer->farewellPlayerWon[i] = j + 6;\n        j++;\n    }\n\n    for (i = 0; i < 3; i++)\n        ConvertPokemonToBattleTowerPokemon(&gPlayerParty[i], &ereaderTrainer->party[i]);\n\n    SetEReaderTrainerChecksum(ereaderTrainer);\n}\n\nu8 GetEreaderTrainerFrontSpriteId(void)\n{\n    return gFacilityClassToPicIndex[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass];\n}\n\nu8 GetEreaderTrainerClassId(void)\n{\n    return gFacilityClassToTrainerClass[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass];\n}\n\nvoid CopyEReaderTrainerName5(u8 *trainerName)\n{\n    s32 i;\n\n    for (i = 0; i < 5; i++)\n        trainerName[i] = gSaveBlock2Ptr->battleTower.ereaderTrainer.name[i];\n\n    trainerName[i] = EOS;\n}\n\n// Checks if the saved E-Reader trainer is valid.\nvoid ValidateEReaderTrainer(void)\n{\n    u32 i;\n    u32 checksum;\n    struct BattleTowerEReaderTrainer *ereaderTrainer;\n\n    gSpecialVar_Result = 0;\n    ereaderTrainer = &gSaveBlock2Ptr->battleTower.ereaderTrainer;\n\n    checksum = 0;\n    for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++)\n        checksum |= ((u32 *)ereaderTrainer)[i];\n\n    if (checksum == 0)\n    {\n        gSpecialVar_Result = 1;\n        return;\n    }\n\n    checksum = 0;\n    for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++)\n        checksum += ((u32 *)ereaderTrainer)[i];\n\n    if (gSaveBlock2Ptr->battleTower.ereaderTrainer.checksum != checksum)\n    {\n        ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer);\n        gSpecialVar_Result = 1;\n    }\n}\n\nstatic void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer)\n{\n    s32 i;\n\n    ereaderTrainer->checksum = 0;\n    for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++)\n        ereaderTrainer->checksum += ((u32 *)ereaderTrainer)[i];\n}\n\nvoid ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer)\n{\n    u32 i;\n\n    for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32); i++)\n        ((u32 *)ereaderTrainer)[i] = 0;\n}\n\nvoid BufferEReaderTrainerGreeting(void)\n{\n    BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting);\n}\n\nstatic void PrintEReaderTrainerFarewellMessage(void)\n{\n    if (gBattleOutcome == B_OUTCOME_DREW)\n        gStringVar4[0] = EOS;\n    else if (gBattleOutcome == B_OUTCOME_WON)\n        BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.farewellPlayerWon);\n    else\n        BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.farewellPlayerLost);\n}\n\nvoid Dummy_TryEnableBravoTrainerBattleTower(void)\n{\n    s32 i;\n\n    for (i = 0; i < 2; i++)\n    {\n        if (gSaveBlock2Ptr->battleTower.var_4AE[i] == 1)\n            TakeBravoTrainerBattleTowerOffTheAir();\n    }\n}\n\nvoid GetBestBattleTowerStreakToVar0x8007(void)\n{\n    gSpecialVar_0x8007 = GetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK);\n}\n\nvoid TryInitBattleTowerAwardManObjectEvent(void)\n{\n    Unref_TryInitLocalObjectEvent(5);\n}\n\ns32 GetHighestLevelInPlayerParty(void)\n{\n    s32 highestLevel = 0;\n    s32 i;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL)\n            && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_EGG)\n        {\n            s32 level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL, NULL);\n            if (level > highestLevel)\n                highestLevel = level;\n        }\n    }\n\n    return highestLevel;\n}"
  },
  {
    "path": "src/battle_transition.c",
    "content": "#include \"global.h\"\n#include \"sprite.h\"\n#include \"task.h\"\n#include \"overworld.h\"\n#include \"malloc.h\"\n#include \"palette.h\"\n#include \"trig.h\"\n#include \"random.h\"\n#include \"sound.h\"\n#include \"decompress.h\"\n#include \"event_data.h\"\n#include \"field_fadetransition.h\"\n#include \"gpu_regs.h\"\n#include \"battle_transition.h\"\n#include \"field_effect.h\"\n#include \"field_weather.h\"\n#include \"field_camera.h\"\n#include \"trainer_pokemon_sprites.h\"\n#include \"scanline_effect.h\"\n#include \"event_object_movement.h\"\n#include \"constants/layouts.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/songs.h\"\n\n#define PALTAG_UNUSED_MUGSHOT 0x100A\n\n#define B_TRANS_DMA_FLAGS (1 | ((DMA_SRC_INC | DMA_DEST_FIXED | DMA_REPEAT | DMA_16BIT | DMA_START_HBLANK | DMA_ENABLE) << 16))\n\n// Used by each transition task to determine which of its functions to call\n#define tState          data[0]\n\n// Below are data defines for InitBlackWipe and UpdateBlackWipe, for the TransitionData data array.\n// These will be re-used by any transitions that use these functions.\n#define tWipeStartX data[0]\n#define tWipeStartY data[1]\n#define tWipeCurrX  data[2]\n#define tWipeCurrY  data[3]\n#define tWipeEndX   data[4]\n#define tWipeEndY   data[5]\n#define tWipeXMove  data[6]\n#define tWipeYMove  data[7]\n#define tWipeXDist  data[8]\n#define tWipeYDist  data[9]\n#define tWipeTemp   data[10]\n\n#define SET_TILE(ptr, posY, posX, tile) \\\n{                                       \\\n    u32 index = (posY) * 32 + posX;     \\\n    ptr[index] = tile | (15 << 12);     \\\n}\n\ntypedef bool8 (*TransitionStateFunc)(struct Task *task);\ntypedef bool8 (*TransitionSpriteCallback)(struct Sprite *sprite);\n\nstruct TransitionData\n{\n    vu8 vblankDma;\n    u16 winIn;\n    u16 winOut;\n    u16 win0H;\n    u16 win0V;\n    u16 win1H; // not used\n    u16 win1V;\n    u16 bldCnt;\n    u16 bldAlpha;\n    u16 bldY;\n    s16 cameraX;\n    s16 cameraY;\n    s16 bg0HOfsOpponent;\n    s16 bg0HOfsPlayer;\n    s16 bg0VOfs;\n    s16 unused_1E;\n    s16 counter;\n    s16 unused_22;\n    s16 data[11]; // for multiple purposes\n};\n\nstatic EWRAM_DATA struct TransitionData *sTransitionData = NULL;\n\nstatic bool8 TransitionIntro_FadeToGray(struct Task *task);\nstatic bool8 TransitionIntro_FadeFromGray(struct Task *task);\nstatic bool8 AngledWipes_Init(struct Task *task);\nstatic bool8 AngledWipes_SetWipeData(struct Task *task);\nstatic bool8 AngledWipes_DoWipe(struct Task *task);\nstatic bool8 AngledWipes_TryEnd(struct Task *task);\nstatic bool8 AngledWipes_StartNext(struct Task *task);\nstatic bool8 GridSquares_Init(struct Task *task);\nstatic bool8 GridSquares_Main(struct Task *task);\nstatic bool8 GridSquares_End(struct Task *task);\nstatic bool8 WhiteBarsFade_Init(struct Task *task);\nstatic bool8 WhiteBarsFade_StartBars(struct Task *task);\nstatic bool8 WhiteBarsFade_WaitBars(struct Task *task);\nstatic bool8 WhiteBarsFade_BlendToBlack(struct Task *task);\nstatic bool8 WhiteBarsFade_End(struct Task *task);\nstatic bool8 Slice_Init(struct Task *task);\nstatic bool8 Slice_Main(struct Task *task);\nstatic bool8 Slice_End(struct Task *task);\nstatic bool8 Mugshot_Init(struct Task *task);\nstatic bool8 Mugshot_SetGfx(struct Task *task);\nstatic bool8 Mugshot_ShowBanner(struct Task *task);\nstatic bool8 Mugshot_StartOpponentSlide(struct Task *task);\nstatic bool8 Mugshot_WaitStartPlayerSlide(struct Task *task);\nstatic bool8 Mugshot_WaitPlayerSlide(struct Task *task);\nstatic bool8 Mugshot_GradualWhiteFade(struct Task *task);\nstatic bool8 Mugshot_InitFadeWhiteToBlack(struct Task *task);\nstatic bool8 Mugshot_FadeToBlack(struct Task *task);\nstatic bool8 Mugshot_End(struct Task *task);\nstatic bool8 Spiral_Init(struct Task *task);\nstatic bool8 Spiral_End(struct Task *task);\nstatic bool8 Wave_Init(struct Task *task);\nstatic bool8 Wave_Main(struct Task *task);\nstatic bool8 Wave_End(struct Task *task);\nstatic bool8 Ripple_Init(struct Task *task);\nstatic bool8 Ripple_Main(struct Task *task);\nstatic bool8 ClockwiseWipe_Init(struct Task *task);\nstatic bool8 ClockwiseWipe_TopRight(struct Task *task);\nstatic bool8 ClockwiseWipe_Right(struct Task *task);\nstatic bool8 ClockwiseWipe_Bottom(struct Task *task);\nstatic bool8 ClockwiseWipe_Left(struct Task *task);\nstatic bool8 ClockwiseWipe_TopLeft(struct Task *task);\nstatic bool8 ClockwiseWipe_End(struct Task *task);\nstatic bool8 PokeballsTrail_Init(struct Task *task);\nstatic bool8 PokeballsTrail_Main(struct Task *task);\nstatic bool8 PokeballsTrail_End(struct Task *task);\nstatic bool8 BigPokeball_Init(struct Task *task);\nstatic bool8 BigPokeball_SetGfx(struct Task *task);\nstatic bool8 PatternWeave_Blend1(struct Task *task);\nstatic bool8 PatternWeave_Blend2(struct Task *task);\nstatic bool8 PatternWeave_FinishAppear(struct Task *task);\nstatic bool8 PatternWeave_CircularMask(struct Task *task);\nstatic bool8 Shuffle_Init(struct Task *task);\nstatic bool8 Shuffle_End(struct Task *task);\nstatic bool8 Swirl_Init(struct Task *task);\nstatic bool8 Swirl_End(struct Task *task);\nstatic bool8 Blur_Init(struct Task *task);\nstatic bool8 Blur_Main(struct Task *task);\nstatic bool8 Blur_End(struct Task *task);\nstatic bool8 Transition_StartIntro(struct Task *task);\nstatic bool8 Transition_WaitForIntro(struct Task *task);\nstatic bool8 Transition_StartMain(struct Task *task);\nstatic bool8 Transition_WaitForMain(struct Task *task);\n\nstatic void Task_Blur(u8 taskId);\nstatic void Task_Swirl(u8 taskId);\nstatic void Task_Shuffle(u8 taskId);\nstatic void Task_BigPokeball(u8 taskId);\nstatic void Task_PokeballsTrail(u8 taskId);\nstatic void Task_ClockwiseWipe(u8 taskId);\nstatic void Task_Ripple(u8 taskId);\nstatic void Task_Wave(u8 taskId);\nstatic void Task_Slice(u8 taskId);\nstatic void Task_WhiteBarsFade(u8 taskId);\nstatic void Task_GridSquares(u8 taskId);\nstatic void Task_AngledWipes(u8 taskId);\nstatic void Task_Lorelei(u8 taskId);\nstatic void Task_Bruno(u8 taskId);\nstatic void Task_Agatha(u8 taskId);\nstatic void Task_Lance(u8 taskId);\nstatic void Task_Blue(u8 taskId);\nstatic void Task_Spiral(u8 taskId);\nstatic void Task_Oak(u8 taskId);\nstatic void Task_Intro(u8 taskId);\nstatic void DoMugshotTransition(u8 taskId);\nstatic void Task_BattleTransition_Intro(u8 taskId);\n\nstatic void SpriteCB_MugshotTrainerPic(struct Sprite *sprite);\nstatic void SpriteCB_FldEffPokeballTrail(struct Sprite *sprite);\nstatic void SpriteCB_WhiteBarFade(struct Sprite *sprite);\n\nstatic bool8 MugshotTrainerPic_Pause(struct Sprite *sprite);\nstatic bool8 MugshotTrainerPic_Init(struct Sprite *sprite);\nstatic bool8 MugshotTrainerPic_Slide(struct Sprite *sprite);\nstatic bool8 MugshotTrainerPic_SlideSlow(struct Sprite *sprite);\nstatic bool8 MugshotTrainerPic_SlideOffscreen(struct Sprite *sprite);\n\nstatic void VBlankCB_Swirl(void);\nstatic void HBlankCB_Swirl(void);\nstatic void VBlankCB_Shuffle(void);\nstatic void HBlankCB_Shuffle(void);\nstatic void VBlankCB_PatternWeave(void);\nstatic void VBlankCB_CircularMask(void);\nstatic void VBlankCB_ClockwiseWipe(void);\nstatic void VBlankCB_Ripple(void);\nstatic void HBlankCB_Ripple(void);\nstatic void VBlankCB_Wave(void);\nstatic void VBlankCB_Spiral(void);\nstatic void VBlankCB_Mugshots(void);\nstatic void VBlankCB_MugshotsFadeOut(void);\nstatic void HBlankCB_Mugshots(void);\nstatic void VBlankCB_Slice(void);\nstatic void HBlankCB_Slice(void);\nstatic void VBlankCB_WhiteBarsFade(void);\nstatic void VBlankCB_WhiteBarsFade_Blend(void);\nstatic void HBlankCB_WhiteBarsFade(void);\nstatic void VBlankCB_AngledWipes(void);\n\nstatic void LaunchBattleTransitionTask(u8 transitionId);\nstatic void Task_BattleTransition(u8 taskId);\nstatic void InitTransitionData(void);\nstatic void CreateIntroTask(s16 fadeOutDelay, s16 fadeInDelay, s16 blinkTimes, s16 fadeOutSpeed, s16 fadeInSpeed);\nstatic bool8 IsIntroTaskDone(void);\nstatic void VBlankCB_BattleTransition(void);\nstatic void GetBg0TilemapDst(u16 **tilesetPtr);\nstatic void GetBg0TilesDst(u16 **tilemapPtr, u16 **tilesetPtr);\nstatic void SetSinWave(s16 *buffer, s16 offset, s16 sinIndex, s16 frequency, s16 amplitude, s16 bufSize);\nstatic void SetCircularMask(s16 *buffer, s16 x, s16 y, s16 radius);\nstatic void FadeScreenBlack(void);\nstatic void InitBlackWipe(s16 *data, s16 startX, s16 startY, s16 endX, s16 endY, s16 stepX, s16 stepY);\nstatic bool8 UpdateBlackWipe(s16 *data, bool8 xExact, bool8 yExact);\nstatic void SetTrainerPicSlideDirection(s16 spriteId, bool16 value);\nstatic void IncrementTrainerPicState(s16 spriteId);\nstatic s16 IsTrainerPicSlideDone(s16 spriteId);\nstatic void Mugshots_CreateTrainerPics(struct Task *task);\nstatic bool32 IsMugshotTransition(u8 transitionId);\n\nstatic const u32 sBigPokeball_Gfx[] = INCBIN_U32(\"graphics/battle_transitions/big_pokeball.4bpp\");\nstatic const u32 sSlidingPokeball_Tilemap[] = INCBIN_U32(\"graphics/battle_transitions/sliding_pokeball.bin\");\nstatic const u8 sSlidingPokeball_Gfx[] = INCBIN_U8(\"graphics/battle_transitions/sliding_pokeball.4bpp\");\nstatic const u32 sMugshotBanner_Gfx[] = INCBIN_U32(\"graphics/battle_transitions/mugshot_banner.4bpp\");\nstatic const u8 sUnusedBrendan_Gfx[] = INCBIN_U8(\"graphics/battle_transitions/unused_brendan.4bpp\");\nstatic const u8 sUnusedLass_Gfx[] = INCBIN_U8(\"graphics/battle_transitions/unused_lass.4bpp\");\nstatic const u32 sGridSquare_Gfx[] = INCBIN_U32(\"graphics/battle_transitions/grid_square.4bpp\");\n\n// All battle transitions use the same intro\nstatic const TaskFunc sTasks_Intro[] =\n{\n    [0 ... B_TRANSITION_COUNT - 1] = &Task_Intro,\n};\n\n// After the intro each transition has a unique main task.\n// This task will call the functions that do the transition effects.\nstatic const TaskFunc sTasks_Main[] =\n{\n    [B_TRANSITION_BLUR]            = Task_Blur,\n    [B_TRANSITION_SWIRL]           = Task_Swirl,\n    [B_TRANSITION_SHUFFLE]         = Task_Shuffle,\n    [B_TRANSITION_BIG_POKEBALL]    = Task_BigPokeball,\n    [B_TRANSITION_POKEBALLS_TRAIL] = Task_PokeballsTrail,\n    [B_TRANSITION_CLOCKWISE_WIPE]  = Task_ClockwiseWipe,\n    [B_TRANSITION_RIPPLE]          = Task_Ripple,\n    [B_TRANSITION_WAVE]            = Task_Wave,\n    [B_TRANSITION_SLICE]           = Task_Slice,\n    [B_TRANSITION_WHITE_BARS_FADE] = Task_WhiteBarsFade,\n    [B_TRANSITION_GRID_SQUARES]    = Task_GridSquares,\n    [B_TRANSITION_ANGLED_WIPES]    = Task_AngledWipes,\n    [B_TRANSITION_LORELEI]         = Task_Lorelei,\n    [B_TRANSITION_BRUNO]           = Task_Bruno,\n    [B_TRANSITION_AGATHA]          = Task_Agatha,\n    [B_TRANSITION_LANCE]           = Task_Lance,\n    [B_TRANSITION_BLUE]            = Task_Blue,\n    [B_TRANSITION_SPIRAL]          = Task_Spiral,\n    [B_TRANSITION_OAK]             = Task_Oak,\n};\n\nstatic const TransitionStateFunc sTaskHandlers[] =\n{\n    Transition_StartIntro,\n    Transition_WaitForIntro,\n    Transition_StartMain,\n    Transition_WaitForMain,\n};\n\nstatic const TransitionStateFunc sBlur_Funcs[] =\n{\n    Blur_Init,\n    Blur_Main,\n    Blur_End,\n};\n\nstatic const TransitionStateFunc sSwirl_Funcs[] =\n{\n    Swirl_Init,\n    Swirl_End,\n};\n\nstatic const TransitionStateFunc sShuffle_Funcs[] =\n{\n    Shuffle_Init,\n    Shuffle_End,\n};\n\nstatic const TransitionStateFunc sBigPokeball_Funcs[] =\n{\n    BigPokeball_Init,\n    BigPokeball_SetGfx,\n    PatternWeave_Blend1,\n    PatternWeave_Blend2,\n    PatternWeave_FinishAppear,\n    PatternWeave_CircularMask,\n};\n\nstatic const TransitionStateFunc sPokeballsTrail_Funcs[] =\n{\n    PokeballsTrail_Init,\n    PokeballsTrail_Main,\n    PokeballsTrail_End,\n};\n\n#define NUM_POKEBALL_TRAILS 5\nstatic const s16 sPokeballsTrail_StartXCoords[] = { -16, DISPLAY_WIDTH + 16 };\nstatic const s16 sPokeballsTrail_Delays[NUM_POKEBALL_TRAILS] = { 0, 16, 32, 8, 24 };\nstatic const s16 sPokeballsTrail_Speeds[] = { 8, -8 };\n\nstatic const TransitionStateFunc sClockwiseWipe_Funcs[] =\n{\n    ClockwiseWipe_Init,\n    ClockwiseWipe_TopRight,\n    ClockwiseWipe_Right,\n    ClockwiseWipe_Bottom,\n    ClockwiseWipe_Left,\n    ClockwiseWipe_TopLeft,\n    ClockwiseWipe_End,\n};\n\nstatic const TransitionStateFunc sRipple_Funcs[] =\n{\n    Ripple_Init,\n    Ripple_Main,\n};\n\nstatic const TransitionStateFunc sWave_Funcs[] =\n{\n    Wave_Init,\n    Wave_Main,\n    Wave_End,\n};\nstatic const s16 sSpiral_AngleData[] =\n{\n    0x0,\n    0x26E,\n    0x100,\n    0x69,\n    0x0,\n    -0x69,\n    -0x100,\n    -0x266E,\n    0x0,\n    0x26E,\n    0x100,\n    0x69,\n    0x0,\n    -0x69,\n    -0x100,\n    -0x266E,\n};\n\nstatic const TransitionStateFunc sSpiral_Funcs[] =\n{\n    Spiral_Init,\n    Spiral_End,\n};\n\nstatic const TransitionStateFunc sMugshot_Funcs[] =\n{\n    Mugshot_Init,\n    Mugshot_SetGfx,\n    Mugshot_ShowBanner,\n    Mugshot_StartOpponentSlide,\n    Mugshot_WaitStartPlayerSlide,\n    Mugshot_WaitPlayerSlide,\n    Mugshot_GradualWhiteFade,\n    Mugshot_InitFadeWhiteToBlack,\n    Mugshot_FadeToBlack,\n    Mugshot_End,\n};\n\nstatic const u8 sMugshotsTrainerPicIDsTable[MUGSHOTS_COUNT] =\n{\n    [MUGSHOT_LORELEI] = TRAINER_PIC_ELITE_FOUR_LORELEI,\n    [MUGSHOT_BRUNO]   = TRAINER_PIC_ELITE_FOUR_BRUNO,\n    [MUGSHOT_AGATHA]  = TRAINER_PIC_ELITE_FOUR_AGATHA,\n    [MUGSHOT_LANCE]   = TRAINER_PIC_ELITE_FOUR_LANCE,\n    [MUGSHOT_BLUE]    = TRAINER_PIC_CHAMPION_RIVAL,\n    [MUGSHOT_OAK]     = TRAINER_PIC_PROFESSOR_OAK,\n};\n\nstatic const s16 sMugshotsOpponentRotationScales[MUGSHOTS_COUNT][2] =\n{\n    [MUGSHOT_LORELEI] = {0x200, 0x200},\n    [MUGSHOT_BRUNO]   = {0x200, 0x200},\n    [MUGSHOT_AGATHA]  = {0x200, 0x200},\n    [MUGSHOT_LANCE]   = {0x200, 0x200},\n    [MUGSHOT_BLUE]    = {0x200, 0x200},\n    [MUGSHOT_OAK]     = {0x200, 0x200},\n};\n\nstatic const s16 sMugshotsOpponentCoords[MUGSHOTS_COUNT][2] =\n{\n    [MUGSHOT_LORELEI] = {  -8,  0 },\n    [MUGSHOT_BRUNO]   = { -10,  0 },\n    [MUGSHOT_AGATHA]  = {   0,  0 },\n    [MUGSHOT_LANCE]   = { -32,  0 },\n    [MUGSHOT_BLUE]    = {   0,  0 },\n    [MUGSHOT_OAK]     = {  -6,  0 },\n};\n\nstatic const TransitionSpriteCallback sMugshotTrainerPicFuncs[] =\n{\n    MugshotTrainerPic_Pause,\n    MugshotTrainerPic_Init,\n    MugshotTrainerPic_Slide,\n    MugshotTrainerPic_SlideSlow,\n    MugshotTrainerPic_Pause,\n    MugshotTrainerPic_SlideOffscreen,\n    MugshotTrainerPic_Pause,\n};\n\n// One element per slide direction.\n// Sign of acceleration is opposite speed, so slide decelerates.\nstatic const s16 sTrainerPicSlideSpeeds[] = {12, -12};\nstatic const s16 sTrainerPicSlideAccels[] = {-1,   1};\n\nstatic const TransitionStateFunc sSlice_Funcs[] =\n{\n    Slice_Init,\n    Slice_Main,\n    Slice_End,\n};\n\nstatic const TransitionStateFunc sWhiteBarsFade_Funcs[] =\n{\n    WhiteBarsFade_Init,\n    WhiteBarsFade_StartBars,\n    WhiteBarsFade_WaitBars,\n    WhiteBarsFade_BlendToBlack,\n    WhiteBarsFade_End,\n};\n\n#define NUM_WHITE_BARS 6\n#define WHITE_BAR_HEIGHT (1 + DISPLAY_HEIGHT / NUM_WHITE_BARS)\nstatic const u16 sWhiteBarsFade_StartDelays[NUM_WHITE_BARS] = {0, 9, 15, 6, 12, 3};\n\nstatic const TransitionStateFunc sGridSquares_Funcs[] =\n{\n    GridSquares_Init,\n    GridSquares_Main,\n    GridSquares_End,\n};\n\nstatic const TransitionStateFunc sAngledWipes_Funcs[] =\n{\n    AngledWipes_Init,\n    AngledWipes_SetWipeData,\n    AngledWipes_DoWipe,\n    AngledWipes_TryEnd,\n    AngledWipes_StartNext,\n};\n\n#define NUM_ANGLED_WIPES 7\n\nstatic const s16 sAngledWipes_MoveData[NUM_ANGLED_WIPES][5] =\n{\n// startX          startY          endX            endY            yDirection\n    {56,            0,              0,              DISPLAY_HEIGHT, 0},\n    {104,           DISPLAY_HEIGHT, DISPLAY_WIDTH,  88,             1},\n    {DISPLAY_WIDTH, 72,             56,             0,              1},\n    {0,             32,             144,            DISPLAY_HEIGHT, 0},\n    {144,           DISPLAY_HEIGHT, 184,            0,              1},\n    {56,            0,              168,            DISPLAY_HEIGHT, 0},\n    {168,           DISPLAY_HEIGHT, 48,             0,              1},\n};\n\nstatic const s16 sAngledWipes_EndDelays[NUM_ANGLED_WIPES] = { 1, 1, 1, 1, 1, 1, 0 };\n\nstatic const TransitionStateFunc sTransitionIntroFuncs[] =\n{\n    TransitionIntro_FadeToGray,\n    TransitionIntro_FadeFromGray,\n};\n\nstatic const struct SpriteFrameImage sSpriteImage_Pokeball[] =\n{\n    {\n        .data = sSlidingPokeball_Gfx, \n        .size = sizeof(sSlidingPokeball_Gfx),\n    },\n};\n\nstatic const union AnimCmd sSpriteAnim_Pokeball[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_Pokeball[] = { sSpriteAnim_Pokeball };\n\nstatic const union AffineAnimCmd sSpriteAffineAnim_Pokeball1[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, -4, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sSpriteAffineAnim_Pokeball2[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, 4, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sSpriteAffineAnimTable_Pokeball[] =\n{\n    sSpriteAffineAnim_Pokeball1,\n    sSpriteAffineAnim_Pokeball2,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Pokeball =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_POKEBALL_TRAIL,\n    .oam = &gObjectEventBaseOam_32x32,\n    .anims = sSpriteAnimTable_Pokeball,\n    .images = sSpriteImage_Pokeball,\n    .affineAnims = sSpriteAffineAnimTable_Pokeball,\n    .callback = SpriteCB_FldEffPokeballTrail,\n};\n\nstatic const struct OamData sOam_UnusedBrendanLass =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = 0,\n    .mosaic = FALSE,\n    .bpp = 0,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const struct SpriteFrameImage sImageTable_UnusedBrendan[] =\n{\n    {\n        .data = sUnusedBrendan_Gfx,\n        .size = sizeof(sUnusedBrendan_Gfx),\n    },\n};\n\nstatic const struct SpriteFrameImage sImageTable_UnusedLass[] =\n{\n    {\n        .data = sUnusedLass_Gfx,\n        .size = sizeof(sUnusedLass_Gfx),\n    },\n};\n\nstatic const union AnimCmd sSpriteAnim_UnusedBrendanLass[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_UnusedBrendanLass[] = { sSpriteAnim_UnusedBrendanLass };\n\nstatic const struct SpriteTemplate sSpriteTemplate_UnusedBrendanLass[] =\n{\n    {\n        .tileTag = TAG_NONE,\n        .paletteTag = PALTAG_UNUSED_MUGSHOT,\n        .oam = &sOam_UnusedBrendanLass,\n        .anims = sSpriteAnimTable_UnusedBrendanLass,\n        .images = sImageTable_UnusedBrendan,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_MugshotTrainerPic,\n    },\n    {\n        .tileTag = TAG_NONE,\n        .paletteTag = PALTAG_UNUSED_MUGSHOT,\n        .oam = &sOam_UnusedBrendanLass,\n        .anims = sSpriteAnimTable_UnusedBrendanLass,\n        .images = sImageTable_UnusedLass,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_MugshotTrainerPic,\n    },\n};\n\n// this palette is shared by big pokeball and sliding pokeball\nstatic const u16 sFieldEffectPal_Pokeball[] = INCBIN_U16(\"graphics/battle_transitions/sliding_pokeball.gbapal\");\n\nconst struct SpritePalette gSpritePalette_Pokeball =\n{\n    .data = sFieldEffectPal_Pokeball,\n    .tag = FLDEFF_PAL_TAG_POKEBALL_TRAIL,\n};\n\nstatic const u16 sMugshotPal_Lorelei[] = INCBIN_U16(\"graphics/battle_transitions/lorelei_bg.gbapal\");\nstatic const u16 sMugshotPal_Bruno[] = INCBIN_U16(\"graphics/battle_transitions/bruno_bg.gbapal\");\nstatic const u16 sMugshotPal_Agatha[] = INCBIN_U16(\"graphics/battle_transitions/agatha_bg.gbapal\");\nstatic const u16 sMugshotPal_Lance[] = INCBIN_U16(\"graphics/battle_transitions/lance_bg.gbapal\");\nstatic const u16 sMugshotPal_Blue[] = INCBIN_U16(\"graphics/battle_transitions/blue_bg.gbapal\");\nstatic const u16 sMugshotPal_Red[] = INCBIN_U16(\"graphics/battle_transitions/red_bg.gbapal\");\nstatic const u16 sMugshotPal_Green[] = INCBIN_U16(\"graphics/battle_transitions/green_bg.gbapal\");\n\nstatic const u16 *const sOpponentMugshotsPals[MUGSHOTS_COUNT] =\n{\n    [MUGSHOT_LORELEI] = sMugshotPal_Lorelei,\n    [MUGSHOT_BRUNO]   = sMugshotPal_Bruno,\n    [MUGSHOT_AGATHA]  = sMugshotPal_Agatha,\n    [MUGSHOT_LANCE]   = sMugshotPal_Lance,\n    [MUGSHOT_BLUE]    = sMugshotPal_Blue,\n    [MUGSHOT_OAK]     = sMugshotPal_Blue,\n};\n\nstatic const u16 *const sPlayerMugshotsPals[GENDER_COUNT] =\n{\n    [MALE]   = sMugshotPal_Red,\n    [FEMALE] = sMugshotPal_Green,\n};\n\nstatic const u16 sUnusedTrainerPalette[] = INCBIN_U16(\"graphics/battle_transitions/unused_trainer.gbapal\");\n\nstatic const struct SpritePalette sSpritePalette_UnusedTrainer =\n{\n    .data = sUnusedTrainerPalette, \n    .tag = PALTAG_UNUSED_MUGSHOT,\n};\n\nstatic const u16 sBigPokeball_Tilemap[] = INCBIN_U16(\"graphics/battle_transitions/big_pokeball_tilemap.bin\");\nstatic const u16 sMugshotsTilemap[] = INCBIN_U16(\"graphics/battle_transitions/vsbar_tilemap.bin\");\n\nvoid BattleTransition_StartOnField(u8 transitionId)\n{\n    sTransitionData = AllocZeroed(sizeof(*sTransitionData));\n    gMain.callback2 = CB2_OverworldBasic;\n    LaunchBattleTransitionTask(transitionId);\n}\n\n// Unused\nstatic void BattleTransition_Start(u8 transitionId)\n{\n    LaunchBattleTransitionTask(transitionId);\n}\n\n#define tTransitionId   data[1]\n#define tTransitionDone data[15]\n\nbool8 IsBattleTransitionDone(void)\n{\n    u8 taskId = FindTaskIdByFunc(Task_BattleTransition);\n    if (gTasks[taskId].tTransitionDone)\n    {\n        InitTransitionData();\n        FREE_AND_SET_NULL(sTransitionData);\n        DestroyTask(taskId);\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nstatic void LaunchBattleTransitionTask(u8 transitionId)\n{\n    u8 taskId = CreateTask(Task_BattleTransition, 2);\n    gTasks[taskId].tTransitionId = transitionId;\n}\n\nstatic void Task_BattleTransition(u8 taskId)\n{\n    while (sTaskHandlers[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 Transition_StartIntro(struct Task *task)\n{\n    SetWeatherScreenFadeOut();\n    CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE);\n    if(gSaveBlock2Ptr->optionsBattleTransitions && !IsMugshotTransition(task->tTransitionId))\n    {   // Instantly cuts to black and skips battle transition if optionsBattleTransitions is On.\n        // Doesn't skip if a mugshot battle transition should be happening, for the cool factor.\n        palette_bg_faded_fill_black();\n        task->tState = 3;\n        return TRUE;\n    }\n    if (sTasks_Intro[task->tTransitionId] != NULL)\n    {\n        CreateTask(sTasks_Intro[task->tTransitionId], 4);\n        task->tState++;\n        return FALSE;\n    }\n    else\n    {\n        task->tState = 2;\n        return TRUE;\n    }\n}\n\nstatic bool8 Transition_WaitForIntro(struct Task *task)\n{\n    if (FindTaskIdByFunc(sTasks_Intro[task->tTransitionId]) == TASK_NONE)\n    {\n        task->tState++;\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nstatic bool8 Transition_StartMain(struct Task *task)\n{\n    CreateTask(sTasks_Main[task->tTransitionId], 0);\n    task->tState++;\n    return FALSE;\n}\n\nstatic bool8 Transition_WaitForMain(struct Task *task)\n{\n    task->tTransitionDone = FALSE;\n    if (FindTaskIdByFunc(sTasks_Main[task->tTransitionId]) == TASK_NONE)\n        task->tTransitionDone = TRUE;\n    return FALSE;\n}\n\n#undef tTransitionId\n#undef tTransitionDone\n\nstatic void Task_Intro(u8 taskId)\n{\n    if (gTasks[taskId].tState == 0)\n    {\n        gTasks[taskId].tState++;\n        CreateIntroTask(0, 0, 2, 2, 2);\n    }\n    else if (IsIntroTaskDone())\n    {\n        DestroyTask(taskId);\n    }\n}\n\n//--------------------\n// B_TRANSITION_BLUR\n//--------------------\n\n#define tDelay   data[1]\n#define tCounter data[2]\n\nstatic void Task_Blur(u8 taskId)\n{\n    while (sBlur_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 Blur_Init(struct Task *task)\n{\n    SetGpuReg(REG_OFFSET_MOSAIC, 0);\n    SetGpuRegBits(REG_OFFSET_BG1CNT, BGCNT_MOSAIC);\n    SetGpuRegBits(REG_OFFSET_BG2CNT, BGCNT_MOSAIC);\n    SetGpuRegBits(REG_OFFSET_BG3CNT, BGCNT_MOSAIC);\n    task->tState++;\n    return TRUE;\n}\n\nstatic bool8 Blur_Main(struct Task *task)\n{\n    if (task->tDelay != 0)\n    {\n        task->tDelay--;\n    }\n    else\n    {\n        task->tDelay = 2;\n        if (++task->tCounter == 10)\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);\n        SetGpuReg(REG_OFFSET_MOSAIC, (task->tCounter & 0xF) + ((task->tCounter & 0xF) << 4));\n        if (task->tCounter > 14)\n            task->tState++;\n    }\n    return FALSE;\n}\n\nstatic bool8 Blur_End(struct Task *task)\n{\n    if (!gPaletteFade.active)\n        DestroyTask(FindTaskIdByFunc(Task_Blur));\n    return FALSE;\n}\n\n#undef tDelay\n#undef tCounter\n\n//--------------------\n// B_TRANSITION_SWIRL\n//--------------------\n\n#define tSinIndex  data[1]\n#define tAmplitude data[2]\n\nstatic void Task_Swirl(u8 taskId)\n{\n    while (sSwirl_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 Swirl_Init(struct Task *task)\n{\n    InitTransitionData();\n    ScanlineEffect_Clear();\n    BeginNormalPaletteFade(PALETTES_ALL, 4, 0, 16, RGB_BLACK);\n    SetSinWave(gScanlineEffectRegBuffers[1], sTransitionData->cameraX, 0, 2, 0, DISPLAY_HEIGHT);\n    SetVBlankCallback(VBlankCB_Swirl);\n    SetHBlankCallback(HBlankCB_Swirl);\n    EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK);\n    task->tState++;\n    return FALSE;\n}\n\nstatic bool8 Swirl_End(struct Task *task)\n{\n    sTransitionData->vblankDma = FALSE;\n    task->tSinIndex += 4;\n    task->tAmplitude += 8;\n    SetSinWave(gScanlineEffectRegBuffers[0], sTransitionData->cameraX, task->tSinIndex, 2, task->tAmplitude, 160);\n    if (!gPaletteFade.active)\n        DestroyTask(FindTaskIdByFunc(Task_Swirl));\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic void VBlankCB_Swirl(void)\n{\n    VBlankCB_BattleTransition();\n    if (sTransitionData->vblankDma)\n        DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);\n}\n\nstatic void HBlankCB_Swirl(void)\n{\n    s16 offset = gScanlineEffectRegBuffers[1][REG_VCOUNT];\n    \n    REG_BG1HOFS = offset;\n    REG_BG2HOFS = offset;\n    REG_BG3HOFS = offset;\n}\n\n#undef tSinIndex\n#undef tAmplitude\n\n//----------------------\n// B_TRANSITION_SHUFFLE\n//----------------------\n\n#define tSinVal    data[1]\n#define tAmplitude data[2]\n\nstatic void Task_Shuffle(u8 taskId)\n{\n    while (sShuffle_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 Shuffle_Init(struct Task *task)\n{\n    InitTransitionData();\n    ScanlineEffect_Clear();\n    BeginNormalPaletteFade(PALETTES_ALL, 4, 0, 16, RGB_BLACK);\n    memset(gScanlineEffectRegBuffers[1], sTransitionData->cameraY, DISPLAY_HEIGHT * 2);\n    SetVBlankCallback(VBlankCB_Shuffle);\n    SetHBlankCallback(HBlankCB_Shuffle);\n    EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK);\n    task->tState++;\n    return FALSE;\n}\n\nstatic bool8 Shuffle_End(struct Task *task)\n{\n    u32 i;\n    u16 sinVal, amplitude;\n\n    sTransitionData->vblankDma = FALSE;\n    sinVal = task->tSinVal;\n    amplitude = task->tAmplitude >> 8;\n    task->tSinVal += 4224;\n    task->tAmplitude += 384;\n\n    for (i = 0; i < DISPLAY_HEIGHT; i++, sinVal += 4224)\n        gScanlineEffectRegBuffers[0][i] = sTransitionData->cameraY + Sin(sinVal / 256, amplitude);\n\n    if (!gPaletteFade.active)\n        DestroyTask(FindTaskIdByFunc(Task_Shuffle));\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic void VBlankCB_Shuffle(void)\n{\n    VBlankCB_BattleTransition();\n    if (sTransitionData->vblankDma)\n        DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);\n}\n\nstatic void HBlankCB_Shuffle(void)\n{\n    s16 offset = gScanlineEffectRegBuffers[1][REG_VCOUNT];\n    \n    REG_BG1VOFS = offset;\n    REG_BG2VOFS = offset;\n    REG_BG3VOFS = offset;\n}\n\n#undef tSinVal\n#undef tAmplitude\n\n//------------------------------------------------------------------------\n// B_TRANSITION_BIG_POKEBALL\n//\n// In Emerald, the \"PatternWeave\" effect of this transition is used\n// by multiple different transitions. In FRLG it's unique to this one.\n//------------------------------------------------------------------------\n\n#define tBlendTarget1 data[1]\n#define tBlendTarget2 data[2]\n#define tBlendDelay   data[3]\n\n// Data 1-3 change purpose for PatternWeave_CircularMask\n#define tRadius      data[1]\n#define tRadiusDelta data[2]\n#define tVBlankSet   data[3]\n\n#define tSinIndex     data[4]\n#define tAmplitude    data[5]\n#define tEndDelay     data[8]\n\nstatic void Task_BigPokeball(u8 taskId)\n{\n    while (sBigPokeball_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\n// Separate function in Emerald\n#define InitPatternWeaveTransition(task) \\\n{ \\\n    u16 i; \\\n    InitTransitionData(); \\\n    ScanlineEffect_Clear(); \\\n    (task)->tBlendTarget1 = 16; \\\n    (task)->tBlendTarget2 = 0; \\\n    (task)->tSinIndex = 0; \\\n    (task)->tAmplitude = 0x4000; \\\n    sTransitionData->winIn = WININ_WIN0_ALL; \\\n    sTransitionData->winOut = 0; \\\n    sTransitionData->win0H = DISPLAY_WIDTH; \\\n    sTransitionData->win0V = DISPLAY_HEIGHT; \\\n    sTransitionData->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL; \\\n    sTransitionData->bldAlpha = BLDALPHA_BLEND((task)->tBlendTarget2, (task)->tBlendTarget1); \\\n    for (i = 0; i < DISPLAY_HEIGHT; i++) \\\n        gScanlineEffectRegBuffers[1][i] = DISPLAY_WIDTH; \\\n    SetVBlankCallback(VBlankCB_PatternWeave); \\\n}\n\nstatic bool8 BigPokeball_Init(struct Task *task)\n{\n    u16 *tilemap, *tileset;\n\n    InitPatternWeaveTransition(task);\n    GetBg0TilesDst(&tilemap, &tileset);\n    CpuFill16(0, tilemap, BG_SCREEN_SIZE);\n    CpuCopy16(sBigPokeball_Gfx, tileset, sizeof(sBigPokeball_Gfx));\n    LoadPalette(sFieldEffectPal_Pokeball, BG_PLTT_ID(15), sizeof(sFieldEffectPal_Pokeball));\n    task->tState++;\n    return FALSE;\n}\n\nstatic bool8 BigPokeball_SetGfx(struct Task *task)\n{\n    s16 i, j;\n    u16 *tilemap, *tileset;\n    const u16 *bigPokeballMap = sBigPokeball_Tilemap;\n\n    GetBg0TilesDst(&tilemap, &tileset);\n    for (i = 0; i < 20; i++)\n        for (j = 0; j < 30; j++, bigPokeballMap++)\n            SET_TILE(tilemap, i, j, *bigPokeballMap);\n\n    SetSinWave(gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude, DISPLAY_HEIGHT);\n    task->tState++;\n    return TRUE;\n}\n\nstatic bool8 PatternWeave_Blend1(struct Task *task)\n{\n    sTransitionData->vblankDma = FALSE;\n    if (task->tBlendDelay == 0 || --task->tBlendDelay == 0)\n    {\n        task->tBlendTarget2++;\n        task->tBlendDelay = 1; // Broken logic. This makes the condition always TRUE.\n    }\n    sTransitionData->bldAlpha = BLDALPHA_BLEND(task->tBlendTarget2, task->tBlendTarget1);\n    // Increment eva until it reaches 50% coeff\n    if (task->tBlendTarget2 > 15)\n        task->tState++;\n    task->tSinIndex += 12;\n    task->tAmplitude -= 384;\n    // Assign a very high frequency value so that 2 adjacent values in gScanlineEffectRegBuffers[0] will have different sign. \n    SetSinWave(gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude >> 8, DISPLAY_HEIGHT);\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic bool8 PatternWeave_Blend2(struct Task *task)\n{\n    sTransitionData->vblankDma = FALSE;\n    if (task->tBlendDelay == 0 || --task->tBlendDelay == 0)\n    {\n        task->tBlendTarget1--;\n        task->tBlendDelay = 2;\n    }\n    sTransitionData->bldAlpha = BLDALPHA_BLEND(task->tBlendTarget2, task->tBlendTarget1);\n    if (task->tBlendTarget1 == 0)\n        task->tState++;\n    if (task->tAmplitude > 0)\n    {\n        task->tSinIndex += 12;\n        task->tAmplitude -= 384;\n    }\n    else\n    {\n        task->tAmplitude = 0;\n    }\n    SetSinWave(gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude >> 8, DISPLAY_HEIGHT);\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic bool8 PatternWeave_FinishAppear(struct Task *task)\n{\n    sTransitionData->vblankDma = FALSE;\n    if (task->tAmplitude > 0)\n    {\n        task->tSinIndex += 12;\n        task->tAmplitude -= 384;\n    }\n    else\n    {\n        task->tAmplitude = 0;\n    }\n    SetSinWave(gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude >> 8, DISPLAY_HEIGHT);\n    if (task->tAmplitude <= 0)\n    {\n        task->tState++;\n        task->tRadius = DISPLAY_HEIGHT;\n        task->tRadiusDelta = 1 << 8;\n        task->tVBlankSet = FALSE;\n    }\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\n// Do a shrinking circular mask to go to a black screen after the pattern appears.\nstatic bool8 PatternWeave_CircularMask(struct Task *task)\n{\n    sTransitionData->vblankDma = FALSE;\n    if (task->tRadiusDelta < (8 << 8))\n        task->tRadiusDelta += (1 << 8);\n    if (task->tRadius != 0)\n    {\n        task->tRadius -= (task->tRadiusDelta >> 8);\n        if (task->tRadius < 0)\n            task->tRadius = 0;\n    }\n    SetCircularMask(gScanlineEffectRegBuffers[0], DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, task->tRadius);\n    if (task->tRadius == 0)\n    {\n        DmaStop(0);\n        FadeScreenBlack();\n        DestroyTask(FindTaskIdByFunc(Task_BigPokeball)); // FindTaskIdByFunc(task->func) in Emerald to accomdate other functions\n    }\n    if (!task->tVBlankSet)\n    {\n        task->tVBlankSet++;\n        SetVBlankCallback(VBlankCB_CircularMask);\n    }\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic void VBlankCB_SetWinAndBlend(void)\n{\n    DmaStop(0);\n    VBlankCB_BattleTransition();\n    if (sTransitionData->vblankDma)\n        DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);\n    SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn);\n    SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut);\n    SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V);\n    SetGpuReg(REG_OFFSET_BLDCNT, sTransitionData->bldCnt);\n    SetGpuReg(REG_OFFSET_BLDALPHA, sTransitionData->bldAlpha);\n}\n\nstatic void VBlankCB_PatternWeave(void)\n{\n    VBlankCB_SetWinAndBlend();\n    DmaSet(0, gScanlineEffectRegBuffers[1], &REG_BG0HOFS, B_TRANS_DMA_FLAGS);\n}\n\nstatic void VBlankCB_CircularMask(void)\n{\n    VBlankCB_SetWinAndBlend();\n    DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, B_TRANS_DMA_FLAGS);\n}\n\n#undef tAmplitude\n#undef tSinIndex\n#undef tBlendTarget1\n#undef tBlendTarget2\n#undef tRadius\n#undef tRadiusDelta\n#undef tVBlankSet\n\n//------------------------------\n// B_TRANSITION_POKEBALLS_TRAIL\n//------------------------------\n\n#define sSide  data[0]\n#define sDelay data[1]\n#define sPrevX data[2]\n\nstatic void Task_PokeballsTrail(u8 taskId)\n{\n    while (sPokeballsTrail_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 PokeballsTrail_Init(struct Task *task)\n{\n    u16 *tilemap, *tileset;\n\n    GetBg0TilesDst(&tilemap, &tileset);\n    CpuCopy16(sSlidingPokeball_Tilemap, tileset, sizeof(sSlidingPokeball_Tilemap));\n    CpuFill32(0, tilemap, BG_SCREEN_SIZE);\n    LoadPalette(sFieldEffectPal_Pokeball, BG_PLTT_ID(15), sizeof(sFieldEffectPal_Pokeball));\n    task->tState++;\n    return FALSE;\n}\n\nstatic bool8 PokeballsTrail_Main(struct Task *task)\n{\n    s16 i, side;\n    s16 startX[ARRAY_COUNT(sPokeballsTrail_StartXCoords)];\n    s16 delays[ARRAY_COUNT(sPokeballsTrail_Delays)];\n    memcpy(startX, sPokeballsTrail_StartXCoords, sizeof(sPokeballsTrail_StartXCoords));\n    memcpy(delays, sPokeballsTrail_Delays, sizeof(sPokeballsTrail_Delays));\n\n    // Randomly pick which side the first ball should start on.\n    // The side is then flipped for each subsequent ball.\n    side = Random() & 1;\n    for (i = 0; i < NUM_POKEBALL_TRAILS; i++, side ^= 1)\n    {\n        gFieldEffectArguments[0] = startX[side];    // x\n        gFieldEffectArguments[1] = (i * 32) + 16;   // y\n        gFieldEffectArguments[2] = side;\n        gFieldEffectArguments[3] = delays[i];\n        FieldEffectStart(FLDEFF_POKEBALL);\n    }\n    task->tState++;\n    return FALSE;\n}\n\nstatic bool8 PokeballsTrail_End(struct Task *task)\n{\n    if (!FieldEffectActiveListContains(FLDEFF_POKEBALL))\n    {\n        FadeScreenBlack();\n        DestroyTask(FindTaskIdByFunc(Task_PokeballsTrail));\n    }\n    return FALSE;\n}\n\nbool8 FldEff_PokeballTrail(void)\n{\n    u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Pokeball, gFieldEffectArguments[0], gFieldEffectArguments[1], 0);\n    \n    gSprites[spriteId].oam.priority = 0;\n    gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n    gSprites[spriteId].sSide = gFieldEffectArguments[2];\n    gSprites[spriteId].sDelay = gFieldEffectArguments[3];\n    gSprites[spriteId].sPrevX = -1;\n    InitSpriteAffineAnim(&gSprites[spriteId]);\n    StartSpriteAffineAnim(&gSprites[spriteId], gFieldEffectArguments[2]);\n    return FALSE;\n}\n\nstatic void SpriteCB_FldEffPokeballTrail(struct Sprite *sprite)\n{\n    s16 speeds[ARRAY_COUNT(sPokeballsTrail_Speeds)];\n    memcpy(speeds, sPokeballsTrail_Speeds, sizeof(sPokeballsTrail_Speeds));\n\n    if (sprite->sDelay)\n    {\n        sprite->sDelay--;\n    }\n    else\n    {\n        if (sprite->x >= 0 && sprite->x <= DISPLAY_WIDTH)\n        {\n            // Set Pokéball position\n            s16 posX = sprite->x >> 3;\n            s16 posY = sprite->y >> 3;\n\n            // If Pokéball moved forward clear trail behind it\n            if (posX != sprite->sPrevX)\n            {\n                u16 *ptr;\n\n                sprite->sPrevX = posX;\n                ptr = (u16 *)BG_SCREEN_ADDR((GetGpuReg(REG_OFFSET_BG0CNT) >> 8) & 0x1F);\n                SET_TILE(ptr, posY - 2, posX, 1);\n                SET_TILE(ptr, posY - 1, posX, 1);\n                SET_TILE(ptr, posY - 0, posX, 1);\n                SET_TILE(ptr, posY + 1, posX, 1);\n            }\n        }\n        sprite->x += speeds[sprite->sSide];\n        if (sprite->x < -15 || sprite->x > DISPLAY_WIDTH + 15)\n            FieldEffectStop(sprite, FLDEFF_POKEBALL);\n    }\n}\n\n#undef sSide\n#undef sDelay\n#undef sPrevX\n\n//-----------------------------\n// B_TRANSITION_CLOCKWISE_WIPE\n//-----------------------------\n\nstatic void Task_ClockwiseWipe(u8 taskId)\n{\n    while (sClockwiseWipe_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 ClockwiseWipe_Init(struct Task *task)\n{\n    u32 i;\n\n    InitTransitionData();\n    ScanlineEffect_Clear();\n    sTransitionData->winIn = 0;\n    sTransitionData->winOut = WINOUT_WIN01_ALL;\n    sTransitionData->win0H = WIN_RANGE(DISPLAY_WIDTH, DISPLAY_WIDTH + 1);\n    sTransitionData->win0V = DISPLAY_HEIGHT;\n    for (i = 0; i < DISPLAY_HEIGHT; i++)\n        gScanlineEffectRegBuffers[1][i] = WIN_RANGE(DISPLAY_WIDTH + 3, DISPLAY_WIDTH + 4);\n    SetVBlankCallback(VBlankCB_ClockwiseWipe);\n    sTransitionData->tWipeEndX = DISPLAY_WIDTH / 2;\n    task->tState++;\n    return TRUE;\n}\n\nstatic bool8 ClockwiseWipe_TopRight(struct Task *task)\n{\n    sTransitionData->vblankDma = FALSE;\n    InitBlackWipe(sTransitionData->data, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, sTransitionData->tWipeEndX, -1, 1, 1);\n    do\n    {\n        gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] = WIN_RANGE(DISPLAY_WIDTH / 2, sTransitionData->tWipeCurrX + 1);\n    }\n    while (!UpdateBlackWipe(sTransitionData->data, TRUE, TRUE));\n\n    sTransitionData->tWipeEndX += 32;\n    if (sTransitionData->tWipeEndX >= DISPLAY_WIDTH)\n    {\n        sTransitionData->tWipeEndY = 0;\n        task->tState++;\n    }\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic bool8 ClockwiseWipe_Right(struct Task *task)\n{\n    s16 start, end;\n    vu8 finished = FALSE;\n\n    sTransitionData->vblankDma = FALSE;\n    InitBlackWipe(sTransitionData->data, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, DISPLAY_WIDTH, sTransitionData->tWipeEndY, 1, 1);\n    while (TRUE)\n    {\n        start = DISPLAY_WIDTH / 2;\n        end = sTransitionData->tWipeCurrX + 1;\n        if (sTransitionData->tWipeEndY >= DISPLAY_HEIGHT / 2)\n        {\n            start = sTransitionData->tWipeCurrX;\n            end = DISPLAY_WIDTH;\n        }\n        gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] = WIN_RANGE2(start, end);\n        if (finished)\n            break;\n        finished = UpdateBlackWipe(sTransitionData->data, TRUE, TRUE);\n    }\n    sTransitionData->tWipeEndY += 16;\n    if (sTransitionData->tWipeEndY >= DISPLAY_HEIGHT)\n    {\n        sTransitionData->tWipeEndX = DISPLAY_WIDTH;\n        task->tState++;\n    }\n    else\n    {\n        while (sTransitionData->tWipeCurrY < sTransitionData->tWipeEndY)\n            gScanlineEffectRegBuffers[0][++sTransitionData->tWipeCurrY] = WIN_RANGE2(start, end);\n    }\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic bool8 ClockwiseWipe_Bottom(struct Task *task)\n{\n    sTransitionData->vblankDma = FALSE;\n    InitBlackWipe(sTransitionData->data, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, sTransitionData->tWipeEndX, DISPLAY_HEIGHT, 1, 1);\n    do\n    {\n        gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] = (sTransitionData->tWipeCurrX << 8) | DISPLAY_WIDTH;\n    }\n    while (!UpdateBlackWipe(sTransitionData->data, TRUE, TRUE));\n    sTransitionData->tWipeEndX -= 32;\n    if (sTransitionData->tWipeEndX <= 0)\n    {\n        sTransitionData->tWipeEndY = DISPLAY_HEIGHT;\n        task->tState++;\n    }\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\n/*\n * BUG: The following 2 functions are incorrect. The animation after \n * the rotation angle reaches 1.5π will not be displayed. \n *\n * There're 2 problems which need to be solved in order to correct the logic. \n * 1. With current setup, nothing is displayed inside WIN0 and everything\n * is displayed outside WIN0. Thus, if the rotation angle is > 1.5π, it\n * won't be able to handle the situation. \n * 2. The programmer sometimes swapped the place of start and end boundary\n * of WIN0 (see variables start and end), which will sometimes cause end\n * to be smaller than start. In this way, garbage data will be written to WIN0H. \n */\nstatic bool8 ClockwiseWipe_Left(struct Task *task)\n{\n    s16 end, start;\n    u16 win0H;\n    vu8 finished = FALSE;\n\n    sTransitionData->vblankDma = FALSE;\n    InitBlackWipe(sTransitionData->data, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0, sTransitionData->tWipeEndY, 1, 1);\n    while (TRUE)\n    {\n        end = (gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY]) & 0xFF;\n        start = sTransitionData->tWipeCurrX;\n        if (sTransitionData->tWipeEndY <= DISPLAY_HEIGHT / 2)\n        {\n            start = DISPLAY_WIDTH / 2;\n            end = sTransitionData->tWipeCurrX;\n        }\n        win0H = WIN_RANGE2(start, end);\n        gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] = win0H;\n        if (finished)\n            break;\n        finished = UpdateBlackWipe(sTransitionData->data, TRUE, TRUE);\n    }\n    sTransitionData->tWipeEndY -= 16;\n    if (sTransitionData->tWipeEndY <= 0)\n    {\n        sTransitionData->tWipeEndX = 0;\n        task->tState++;\n    }\n    else\n    {\n        while (sTransitionData->tWipeCurrY > sTransitionData->tWipeEndY)\n            gScanlineEffectRegBuffers[0][--sTransitionData->tWipeCurrY] = WIN_RANGE2(start, end);\n    }\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic bool8 ClockwiseWipe_TopLeft(struct Task *task)\n{\n    sTransitionData->vblankDma = FALSE;\n    InitBlackWipe(sTransitionData->data, 120, 80, sTransitionData->tWipeEndX, 0, 1, 1);\n    do\n    {\n        s16 start = DISPLAY_WIDTH / 2;\n        s16 end = sTransitionData->tWipeCurrX;\n        if (sTransitionData->tWipeCurrX >= 120)\n        {\n            start = 0;\n            end = DISPLAY_WIDTH;\n        }\n        gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] = WIN_RANGE2(start, end);\n    }\n    while (!UpdateBlackWipe(sTransitionData->data, TRUE, TRUE));\n    sTransitionData->tWipeEndX += 32;\n    if (sTransitionData->tWipeCurrX > DISPLAY_WIDTH / 2)\n        task->tState++;\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic bool8 ClockwiseWipe_End(struct Task *task)\n{\n    DmaStop(0);\n    FadeScreenBlack();\n    DestroyTask(FindTaskIdByFunc(Task_ClockwiseWipe));\n    return FALSE;\n}\n\nstatic void VBlankCB_ClockwiseWipe(void)\n{\n    DmaStop(0);\n    VBlankCB_BattleTransition();\n    if (sTransitionData->vblankDma)\n        DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 2);\n    SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn);\n    SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut);\n    SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V);\n    SetGpuReg(REG_OFFSET_WIN0H, gScanlineEffectRegBuffers[1][0]);\n    DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, B_TRANS_DMA_FLAGS);\n}\n\n//---------------------\n// B_TRANSITION_RIPPLE\n//---------------------\n\n#define tSinVal       data[1]\n#define tAmplitude    data[2]\n#define tTimer        data[3]\n#define tFadeStarted  data[4]\n\nstatic void Task_Ripple(u8 taskId)\n{\n    while (sRipple_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 Ripple_Init(struct Task *task)\n{\n    u32 i;\n\n    InitTransitionData();\n    ScanlineEffect_Clear();\n    for (i = 0; i < DISPLAY_HEIGHT; i++)\n        gScanlineEffectRegBuffers[1][i] = sTransitionData->cameraY;\n    SetVBlankCallback(VBlankCB_Ripple);\n    SetHBlankCallback(HBlankCB_Ripple);\n    EnableInterrupts(INTR_FLAG_HBLANK);\n    task->tState++;\n    return TRUE;\n}\n\nstatic bool8 Ripple_Main(struct Task *task)\n{\n    u32 i;\n    s16 amplitude;\n    u16 sinVal, speed;\n\n    sTransitionData->vblankDma = FALSE;\n    amplitude = task->tAmplitude >> 8;\n    sinVal = task->tSinVal;\n    speed = 384;\n    task->tSinVal += 0x400;\n    if (task->tAmplitude <= 0x1FFF)\n        task->tAmplitude += 384;\n    for (i = 0; i < DISPLAY_HEIGHT; i++, sinVal += speed)\n    {\n        s16 sinIndex = sinVal >> 8;\n        gScanlineEffectRegBuffers[0][i] = sTransitionData->cameraY + Sin(sinIndex & 0xFFFF, amplitude);\n    }\n    if (++task->tTimer == 41)\n    {\n        task->tFadeStarted++;\n        BeginNormalPaletteFade(PALETTES_ALL, -8, 0, 16, RGB_BLACK);\n    }\n    if (task->tFadeStarted && !gPaletteFade.active)\n        DestroyTask(FindTaskIdByFunc(Task_Ripple));\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic void VBlankCB_Ripple(void)\n{\n    VBlankCB_BattleTransition();\n    if (sTransitionData->vblankDma)\n        DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);\n}\n\nstatic void HBlankCB_Ripple(void)\n{\n    s16 offset = gScanlineEffectRegBuffers[1][REG_VCOUNT];\n    \n    REG_BG1VOFS = offset;\n    REG_BG2VOFS = offset;\n    REG_BG3VOFS = offset;\n}\n\n#undef tSinVal\n#undef tAmplitudeVal\n#undef tTimer\n#undef tFadeStarted\n\n//-------------------\n// B_TRANSITION_WAVE\n//-------------------\n\n#define tX data[1]\n#define tSinIndex data[2]\n\nstatic void Task_Wave(u8 taskId)\n{\n    while (sWave_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 Wave_Init(struct Task *task)\n{\n    u32 i;\n\n    InitTransitionData();\n    ScanlineEffect_Clear();\n    sTransitionData->winIn = WININ_WIN0_ALL;\n    sTransitionData->winOut = 0;\n    sTransitionData->win0H = DISPLAY_WIDTH;\n    sTransitionData->win0V = DISPLAY_HEIGHT;\n    for (i = 0; i < DISPLAY_HEIGHT; i++)\n        gScanlineEffectRegBuffers[1][i] = DISPLAY_WIDTH + 2;\n    SetVBlankCallback(VBlankCB_Wave);\n    task->tState++;\n    return TRUE;\n}\n\nstatic bool8 Wave_Main(struct Task *task)\n{\n    u8 i, sinIndex;\n    u16 *winVal;\n    bool8 finished;\n\n    sTransitionData->vblankDma = FALSE;\n    winVal = gScanlineEffectRegBuffers[0];\n    sinIndex = task->tSinIndex;\n    task->tSinIndex += 16;\n    task->tX += 8;\n    for (i = 0, finished = TRUE; i < DISPLAY_HEIGHT; i++, sinIndex += 4, winVal++)\n    {\n        s16 x = task->tX + Sin(sinIndex, 40);\n        if (x < 0)\n            x = 0;\n        if (x > DISPLAY_WIDTH)\n            x = DISPLAY_WIDTH;\n        *winVal = WIN_RANGE(x, DISPLAY_WIDTH + 1);\n        if (x < DISPLAY_WIDTH)\n            finished = FALSE;\n    }\n    if (finished)\n        task->tState++;\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic bool8 Wave_End(struct Task *task)\n{\n    DmaStop(0);\n    FadeScreenBlack();\n    DestroyTask(FindTaskIdByFunc(Task_Wave));\n    return FALSE;\n}\n\nstatic void VBlankCB_Wave(void)\n{\n    DmaStop(0);\n    VBlankCB_BattleTransition();\n    if (sTransitionData->vblankDma)\n        DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 2);\n    SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn);\n    SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut);\n    SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V);\n    DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, B_TRANS_DMA_FLAGS);\n}\n\n#undef tX\n#undef tSinIndex\n\n//---------------------\n// B_TRANSITION_SPIRAL\n//---------------------\n\nstatic void Task_Spiral(u8 taskId)\n{\n    while (sSpiral_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic void Spiral_UpdateFrame(s16 initRadius, s16 deltaAngleMax, u8 offsetMaybe)\n{\n    u8 sinIndex = 0;\n    s16 i, amplitude1, amplitude2;\n    s16 y1, x1, y2, x2;\n\n    for (i = DISPLAY_HEIGHT * 2; i < DISPLAY_HEIGHT * 6; i++)\n        gScanlineEffectRegBuffers[1][i] = DISPLAY_WIDTH / 2;\n\n    for (i = 0; i < (deltaAngleMax * 16); i++, sinIndex++)\n    {\n        amplitude1 = initRadius + (sinIndex >> 3);\n        if ((sinIndex >> 3) != ((sinIndex + 1) >> 3))\n        {\n            amplitude2 = amplitude1 + 1;\n        }\n        else\n        {\n            amplitude2 = amplitude1;\n        }\n\n        y1 = DISPLAY_HEIGHT / 2 - Sin(sinIndex, amplitude1);\n        x1 = Cos(sinIndex, amplitude1) + DISPLAY_WIDTH / 2;\n        y2 = DISPLAY_HEIGHT / 2 - Sin(sinIndex + 1, amplitude2);\n        x2 = Cos(sinIndex + 1, amplitude2) + DISPLAY_WIDTH / 2;\n\n        if (y1 < 0 && y2 < 0)\n            continue;\n        if (y1 > DISPLAY_HEIGHT - 1 && y2 > DISPLAY_HEIGHT - 1)\n            continue;\n\n        if (y1 < 0)\n            y1 = 0;\n        if (y1 > DISPLAY_HEIGHT - 1)\n            y1 = DISPLAY_HEIGHT - 1;\n        if (x1 < 0)\n            x1 = 0;\n        if (x1 > 255)\n            x1 = 255;\n        if (y2 < 0)\n            y2 = 0;\n        if (y2 > DISPLAY_HEIGHT - 1)\n            y2 = DISPLAY_HEIGHT - 1;\n        if (x2 < 0)\n            x2 = 0;\n        if (x2 > 255)\n            x2 = 255;\n\n        y2 -= y1;\n\n        if (sinIndex >= 64 && sinIndex < 64 * 3)\n        {\n            gScanlineEffectRegBuffers[1][y1 + DISPLAY_HEIGHT * 2] = x1;\n\n            if (y2 == 0)\n                continue;\n\n            x2 -= x1;\n            if (x2 < -1 && x1 > 1)\n                x1--;\n            else if (x2 > 1 && x1 < 255)\n                x1++;\n\n            if (y2 < 0)\n                for (; y2 < 0; y2++)\n                    gScanlineEffectRegBuffers[1][y1 + y2 + DISPLAY_HEIGHT * 2] = x1;\n            else\n                for (; y2 > 0; y2--)\n                    gScanlineEffectRegBuffers[1][y1 + y2 + DISPLAY_HEIGHT * 2] = x1;\n        }\n        else\n        {\n            gScanlineEffectRegBuffers[1][y1 + DISPLAY_HEIGHT * 3] = x1;\n\n            if (y2 == 0)\n                continue;\n\n            x2 -= x1;\n            if (x2 < -1 && x1 > 1)\n                x1--;\n            else if (x2 > 1 && x1 < 255)\n                x1++;\n\n            if (y2 < 0)\n                for (; y2 < 0; y2++)\n                    gScanlineEffectRegBuffers[1][y1 + y2 + DISPLAY_HEIGHT * 3] = x1;\n            else\n                for (; y2 > 0; y2--)\n                    gScanlineEffectRegBuffers[1][y1 + y2 + DISPLAY_HEIGHT * 3] = x1;\n        }\n    }\n\n    if (offsetMaybe == 0 || deltaAngleMax % 4 == 0)\n    {\n        for (i = 0; i < DISPLAY_HEIGHT; i++)\n            gScanlineEffectRegBuffers[1][i * 2 + offsetMaybe] = gScanlineEffectRegBuffers[1][i + DISPLAY_HEIGHT * 2] << 8\n                                                              | gScanlineEffectRegBuffers[1][i + DISPLAY_HEIGHT * 3];\n        return;\n    }\n\n    y1 = Sin(deltaAngleMax * 16, initRadius + (deltaAngleMax << 1));\n\n    switch (deltaAngleMax / 4)\n    {\n    case 0:\n        if (y1 > DISPLAY_HEIGHT / 2)\n            y1 = DISPLAY_HEIGHT / 2;\n        for (i = y1; i > 0; i--)\n        {\n            sTransitionData->data[2] = x1 = ((i * sSpiral_AngleData[deltaAngleMax]) >> 8) + DISPLAY_WIDTH / 2;\n            if (x1 < 0 || x1 > 255)\n                continue;\n            sTransitionData->cameraX = 400 - i;\n            sTransitionData->data[10] = gScanlineEffectRegBuffers[1][400 - i];\n            if (gScanlineEffectRegBuffers[1][560 - i] < x1)\n                gScanlineEffectRegBuffers[1][560 - i] = DISPLAY_WIDTH / 2;\n            else if (gScanlineEffectRegBuffers[1][400 - i] < x1)\n                gScanlineEffectRegBuffers[1][400 - i] = x1;\n        }\n        break;\n    case 1:\n        if (y1 > DISPLAY_HEIGHT / 2)\n            y1 = DISPLAY_HEIGHT / 2;\n        for (i = y1; i > 0; i--)\n        {\n            sTransitionData->data[2] = x1 = ((i * sSpiral_AngleData[deltaAngleMax]) >> 8) + DISPLAY_WIDTH / 2;\n            if (x1 < 0 || x1 > 255)\n                continue;\n            sTransitionData->cameraX = 400 - i;\n            sTransitionData->data[10] = gScanlineEffectRegBuffers[1][400 - i];\n            if (gScanlineEffectRegBuffers[1][400 - i] < x1)\n                gScanlineEffectRegBuffers[1][400 - i] = x1;\n        }\n        break;\n    case 2:\n        if (y1 < -(DISPLAY_HEIGHT / 2 - 1))\n            y1 = -(DISPLAY_HEIGHT / 2 - 1);\n        for (i = y1; i <= 0; i++)\n        {\n            sTransitionData->data[2] = x1 = ((i * sSpiral_AngleData[deltaAngleMax]) >> 8) + DISPLAY_WIDTH / 2;\n            if (x1 < 0 || x1 > 255)\n                continue;\n            sTransitionData->cameraX = 560 - i;\n            sTransitionData->data[10] = gScanlineEffectRegBuffers[1][560 - i];\n            if (gScanlineEffectRegBuffers[1][400 - i] >= x1)\n                gScanlineEffectRegBuffers[1][400 - i] = DISPLAY_WIDTH / 2;\n            else if (gScanlineEffectRegBuffers[1][560 - i] > x1)\n                gScanlineEffectRegBuffers[1][560 - i] = x1;\n        }\n        break;\n    case 3:\n        if (y1 < -(DISPLAY_HEIGHT / 2 - 1))\n            y1 = -(DISPLAY_HEIGHT / 2 - 1);\n        for (i = y1; i <= 0; i++)\n        {\n            sTransitionData->data[2] = x1 = ((i * sSpiral_AngleData[deltaAngleMax]) >> 8) + 120;\n            if (x1 < 0 || x1 > 255)\n                continue;\n            sTransitionData->cameraX = 560 - i;\n            sTransitionData->data[10] = gScanlineEffectRegBuffers[1][560 - i];\n            if (gScanlineEffectRegBuffers[1][560 - i] > x1)\n                gScanlineEffectRegBuffers[1][560 - i] = x1;\n        }\n        break;\n    default:\n        break;\n    }\n\n    for (i = 0; i < DISPLAY_HEIGHT; i++)\n        gScanlineEffectRegBuffers[1][i * 2 + offsetMaybe] = (gScanlineEffectRegBuffers[1][i + DISPLAY_HEIGHT * 2] << 8)\n                                                           | gScanlineEffectRegBuffers[1][i + DISPLAY_HEIGHT * 3];\n}\n\nstatic bool8 Spiral_Init(struct Task *task)\n{\n    InitTransitionData();\n    ScanlineEffect_Clear();\n    sTransitionData->winIn = 0;\n    sTransitionData->winOut = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;\n    sTransitionData->win0H = WIN_RANGE(DISPLAY_WIDTH / 2, DISPLAY_WIDTH / 2);\n    sTransitionData->win0V = WIN_RANGE(48, DISPLAY_HEIGHT - 48);\n    sTransitionData->win1V = WIN_RANGE(16, DISPLAY_HEIGHT - 16);\n    sTransitionData->counter = 0;\n    Spiral_UpdateFrame(0, 0, 0);\n    Spiral_UpdateFrame(0, 0, 1);\n    DmaCopy16(3, gScanlineEffectRegBuffers[1], gScanlineEffectRegBuffers[0], DISPLAY_HEIGHT * 4);\n    SetVBlankCallback(VBlankCB_Spiral);\n    task->tState++;\n    task->data[1] = 0;\n    task->data[2] = 0;\n    return FALSE;\n}\n\nstatic bool8 Spiral_End(struct Task *task)\n{\n    s16 win_top, win_bottom;\n\n    Spiral_UpdateFrame(task->data[2], task->data[1], 1);\n    sTransitionData->vblankDma |= TRUE;\n    if (++task->data[1] == (int)ARRAY_COUNT(sSpiral_AngleData) + 1)\n    {\n        Spiral_UpdateFrame(task->data[2], 16, 0);\n        win_top = 48 - task->data[2];\n        if (win_top < 0)\n            win_top = 0;\n        win_bottom = task->data[2] + 112;\n        if (win_bottom > 255)\n            win_bottom = 255;\n        sTransitionData->win0V = win_top | win_bottom; // UB: win_top should be shifted\n        task->data[2] += 32;\n        task->data[1] = 0;\n        Spiral_UpdateFrame(task->data[2], 0, 1);\n        win_top = 48 - task->data[2];\n        if (win_top < 0)\n            win_top = 0;\n        win_bottom = task->data[2] + 112;\n        if (win_bottom > 255)\n            win_bottom = 255;\n        sTransitionData->win1V = win_top | win_bottom; // UB: win_top should be shifted\n        sTransitionData->vblankDma |= TRUE;\n        if (task->data[2] >= DISPLAY_HEIGHT)\n        {\n            sTransitionData->counter = 1;\n            FadeScreenBlack();\n        }\n    }\n    return FALSE;\n}\n\nstatic void VBlankCB_Spiral(void)\n{\n    DmaStop(0);\n    VBlankCB_BattleTransition();\n    if (sTransitionData->counter)\n    {\n        DestroyTask(FindTaskIdByFunc(Task_Spiral));\n    }\n    else\n    {\n        if (sTransitionData->vblankDma)\n        {\n            DmaCopy16(3, gScanlineEffectRegBuffers[1], gScanlineEffectRegBuffers[0], DISPLAY_HEIGHT * 4);\n            sTransitionData->vblankDma = FALSE;\n        }\n        SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn);\n        SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut);\n        SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V);\n        SetGpuReg(REG_OFFSET_WIN1V, sTransitionData->win1V);\n        SetGpuReg(REG_OFFSET_WIN0H, gScanlineEffectRegBuffers[0][0]);\n        SetGpuReg(REG_OFFSET_WIN1H, gScanlineEffectRegBuffers[0][1]);\n        DmaSet(0, gScanlineEffectRegBuffers[0], &REG_WIN0H, (DMA_32BIT << 16) | B_TRANS_DMA_FLAGS);\n    }\n}\n\n//----------------------------------------------------------------\n// B_TRANSITION_LORELEI, B_TRANSITION_BRUNO, B_TRANSITION_AGATHA,\n// B_TRANSITION_LANCE, and B_TRANSITION_BLUE\n//\n// These are all the \"mugshot\" transitions, where a banner shows\n// the trainer pic of the player and their opponent.\n//----------------------------------------------------------------\n\n#define tSinIndex         data[1]\n#define tTopBannerX       data[2]\n#define tBottomBannerX    data[3]\n#define tTimer            data[3] // Re-used\n#define tFadeSpread       data[4]\n#define tOpponentSpriteId data[13]\n#define tPlayerSpriteId   data[14]\n#define tMugshotId        data[15]\n\n// Sprite data for trainer sprites in mugshots\n#define sState      data[0]\n#define sSlideSpeed data[1]\n#define sSlideAccel data[2]\n#define sDone       data[6]\n#define sSlideDir   data[7]\n\nstatic void Task_Lorelei(u8 taskId)\n{\n    gTasks[taskId].tMugshotId = MUGSHOT_LORELEI;\n    DoMugshotTransition(taskId);\n}\n\nstatic void Task_Bruno(u8 taskId)\n{\n    gTasks[taskId].tMugshotId = MUGSHOT_BRUNO;\n    DoMugshotTransition(taskId);\n}\n\nstatic void Task_Agatha(u8 taskId)\n{\n    gTasks[taskId].tMugshotId = MUGSHOT_AGATHA;\n    DoMugshotTransition(taskId);\n}\n\nstatic void Task_Lance(u8 taskId)\n{\n    gTasks[taskId].tMugshotId = MUGSHOT_LANCE;\n    DoMugshotTransition(taskId);\n}\n\nstatic void Task_Blue(u8 taskId)\n{\n    gTasks[taskId].tMugshotId = MUGSHOT_BLUE;\n    DoMugshotTransition(taskId);\n}\n\nstatic void Task_Oak(u8 taskId)\n{\n    gTasks[taskId].tMugshotId = MUGSHOT_OAK;\n    DoMugshotTransition(taskId);\n}\n\nstatic void DoMugshotTransition(u8 taskId)\n{\n    while (sMugshot_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 Mugshot_Init(struct Task *task)\n{\n    u32 i;\n\n    InitTransitionData();\n    ScanlineEffect_Clear();\n    Mugshots_CreateTrainerPics(task);\n\n    task->tSinIndex = 0;\n    task->tTopBannerX = 1;\n    task->tBottomBannerX = DISPLAY_WIDTH - 1;\n    sTransitionData->winIn = WININ_WIN0_ALL;\n    sTransitionData->winOut = WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR;\n    sTransitionData->win0V = DISPLAY_HEIGHT;\n    for (i = 0; i < DISPLAY_HEIGHT; i++)\n        gScanlineEffectRegBuffers[1][i] = WIN_RANGE(DISPLAY_WIDTH, DISPLAY_WIDTH + 1);\n    SetVBlankCallback(VBlankCB_Mugshots);\n    task->tState++;\n    return FALSE;\n}\n\nstatic bool8 Mugshot_SetGfx(struct Task *task)\n{\n    s16 i, j;\n    u16 *tilemap, *tileset;\n    const u16 *mugshotsMap = sMugshotsTilemap;\n    \n    GetBg0TilesDst(&tilemap, &tileset);\n    CpuCopy16(sMugshotBanner_Gfx, tileset, sizeof(sMugshotBanner_Gfx));\n    LoadPalette(sOpponentMugshotsPals[task->tMugshotId], BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n    LoadPalette(sPlayerMugshotsPals[gSaveBlock2Ptr->playerGender], BG_PLTT_ID(15) + 10, PLTT_SIZEOF(16 - 10));\n    \n    for (i = 0; i < 20; i++)\n        for (j = 0; j < 32; j++, mugshotsMap++)\n            SET_TILE(tilemap, i, j, *mugshotsMap);\n\n    EnableInterrupts(INTR_FLAG_HBLANK);\n    SetHBlankCallback(HBlankCB_Mugshots);\n    task->tState++;\n    return FALSE;\n}\n\nstatic bool8 Mugshot_ShowBanner(struct Task *task)\n{\n    u8 i, sinIndex;\n    u16 *winVal;\n    s16 x;\n    s32 mergedValue;\n\n    sTransitionData->vblankDma = FALSE;\n\n    winVal = gScanlineEffectRegBuffers[0];\n    sinIndex = task->tSinIndex;\n    task->tSinIndex += 16;\n\n    // Update top banner\n    for (i = 0; i < DISPLAY_HEIGHT / 2; i++, winVal++, sinIndex += 16)\n    {\n        x = task->tTopBannerX + Sin(sinIndex, 16);\n        if (x < 0)\n            x = 1;\n        if (x > DISPLAY_WIDTH)\n            x = DISPLAY_WIDTH;\n        *winVal = x;\n    }\n\n    // Update bottom banner\n    for (; i < DISPLAY_HEIGHT; i++, winVal++, sinIndex += 16)\n    {\n        x = task->tBottomBannerX - Sin(sinIndex, 16);\n        if (x < 0)\n            x = 0;\n        if (x > DISPLAY_WIDTH - 1)\n            x = DISPLAY_WIDTH - 1;\n        *winVal = (x << 8) | (DISPLAY_WIDTH);\n    }\n\n    // Slide banners across screen\n    task->tTopBannerX += 8;\n    task->tBottomBannerX -= 8;\n\n    if (task->tTopBannerX > DISPLAY_WIDTH)\n        task->tTopBannerX = DISPLAY_WIDTH;\n    if (task->tBottomBannerX < 0)\n        task->tBottomBannerX = 0;\n\n    mergedValue = *(s32 *)(&task->tTopBannerX);\n    if (mergedValue == DISPLAY_WIDTH)\n        task->tState++;\n\n    sTransitionData->bg0HOfsOpponent -= 8;\n    sTransitionData->bg0HOfsPlayer += 8;\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic bool8 Mugshot_StartOpponentSlide(struct Task *task)\n{\n    u32 i;\n    u16 *winVal;\n\n    sTransitionData->vblankDma = FALSE;\n    for (i = 0, winVal = gScanlineEffectRegBuffers[0]; i < DISPLAY_HEIGHT; i++, winVal++)\n        *winVal = DISPLAY_WIDTH;\n    task->tState++;\n\n    // Clear old data\n    task->tSinIndex = 0;\n    task->tTopBannerX = 0;\n    task->tBottomBannerX = 0;\n\n    sTransitionData->bg0HOfsOpponent -= 8;\n    sTransitionData->bg0HOfsPlayer += 8;\n\n    SetTrainerPicSlideDirection(task->tOpponentSpriteId, 0);\n    SetTrainerPicSlideDirection(task->tPlayerSpriteId, 1);\n\n    // Start opponent slide\n    IncrementTrainerPicState(task->tOpponentSpriteId);\n    PlaySE(SE_MUGSHOT);\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic bool8 Mugshot_WaitStartPlayerSlide(struct Task *task)\n{\n    sTransitionData->bg0HOfsOpponent -= 8;\n    sTransitionData->bg0HOfsPlayer += 8;\n\n    // Start player's slide in once the opponent is finished\n    if (IsTrainerPicSlideDone(task->tOpponentSpriteId))\n    {\n        task->tState++;\n        IncrementTrainerPicState(task->tPlayerSpriteId);\n    }\n    return FALSE;\n}\n\nstatic bool8 Mugshot_WaitPlayerSlide(struct Task *task)\n{\n    sTransitionData->bg0HOfsOpponent -= 8;\n    sTransitionData->bg0HOfsPlayer += 8;\n\n    if (IsTrainerPicSlideDone(task->tPlayerSpriteId))\n    {\n        sTransitionData->vblankDma = FALSE;\n        SetVBlankCallback(NULL);\n        DmaStop(0);\n        memset(gScanlineEffectRegBuffers[0], 0, DISPLAY_HEIGHT * 2);\n        memset(gScanlineEffectRegBuffers[1], 0, DISPLAY_HEIGHT * 2);\n        SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        task->tState++;\n        task->tTimer = 0;\n        task->tFadeSpread = 0;\n        sTransitionData->bldCnt = BLDCNT_TGT1_ALL | BLDCNT_EFFECT_LIGHTEN;\n        SetVBlankCallback(VBlankCB_MugshotsFadeOut);\n    }\n    return FALSE;\n}\n\nstatic bool8 Mugshot_GradualWhiteFade(struct Task *task)\n{\n    bool32 active;\n\n    sTransitionData->vblankDma = FALSE;\n    active = TRUE;\n    sTransitionData->bg0HOfsOpponent -= 8;\n    sTransitionData->bg0HOfsPlayer += 8;\n\n    if (task->tFadeSpread < DISPLAY_HEIGHT / 2)\n        task->tFadeSpread += 2;\n    if (task->tFadeSpread > DISPLAY_HEIGHT / 2)\n        task->tFadeSpread = DISPLAY_HEIGHT / 2;\n\n    if (++task->tTimer & 1)\n    {\n        s32 i;\n        for (i = 0, active = FALSE; i <= task->tFadeSpread; i++)\n        {\n            // Fade starts in middle of screen and\n            // spreads outwards in both directions.\n            s16 y1 = DISPLAY_HEIGHT / 2 - i;\n            s16 y2 = DISPLAY_HEIGHT / 2 + i;\n            if (gScanlineEffectRegBuffers[0][y1] <= 15)\n            {\n                active = TRUE;\n                gScanlineEffectRegBuffers[0][y1]++;\n            }\n            if (gScanlineEffectRegBuffers[0][y2] <= 15)\n            {\n                active = TRUE;\n                gScanlineEffectRegBuffers[0][y2]++;\n            }\n        }\n    }\n    if (task->tFadeSpread == DISPLAY_HEIGHT / 2 && !active)\n        task->tState++;\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\n// Set palette to white to replace the scanline white fade\n// before the screen fades to black.\nstatic bool8 Mugshot_InitFadeWhiteToBlack(struct Task *task)\n{\n    sTransitionData->vblankDma = FALSE;\n    BlendPalettes(PALETTES_ALL, 16, RGB_WHITE);\n    sTransitionData->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN;\n    task->tTimer = 0;\n    task->tState++;\n    return TRUE;\n}\n\nstatic bool8 Mugshot_FadeToBlack(struct Task *task)\n{\n    sTransitionData->vblankDma = FALSE;\n    task->tTimer++;\n    memset(gScanlineEffectRegBuffers[0], task->tTimer, DISPLAY_HEIGHT * 2);\n    if (task->tTimer > 15)\n        task->tState++;\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic bool8 Mugshot_End(struct Task *task)\n{\n    DmaStop(0);\n    FadeScreenBlack();\n    DestroyTask(FindTaskIdByFunc(task->func));\n    return FALSE;\n}\n\nstatic void VBlankCB_Mugshots(void)\n{\n    DmaStop(0);\n    VBlankCB_BattleTransition();\n    if (sTransitionData->vblankDma)\n        DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 2);\n    SetGpuReg(REG_OFFSET_BG0VOFS, sTransitionData->bg0VOfs);\n    SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn);\n    SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut);\n    SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V);\n    DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, B_TRANS_DMA_FLAGS);\n}\n\nstatic void VBlankCB_MugshotsFadeOut(void)\n{\n    DmaStop(0);\n    VBlankCB_BattleTransition();\n    if (sTransitionData->vblankDma)\n        DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 2);\n    SetGpuReg(REG_OFFSET_BLDCNT, sTransitionData->bldCnt);\n    DmaSet(0, gScanlineEffectRegBuffers[1], &REG_BLDY, B_TRANS_DMA_FLAGS);\n}\n\nstatic void HBlankCB_Mugshots(void)\n{\n    if (REG_VCOUNT < DISPLAY_HEIGHT / 2)\n        REG_BG0HOFS = sTransitionData->bg0HOfsOpponent;\n    else\n        REG_BG0HOFS = sTransitionData->bg0HOfsPlayer;\n}\n\n\nstatic void Mugshots_CreateTrainerPics(struct Task *task)\n{\n    struct Sprite *opponentSprite, *playerSprite;\n    s16 mugshotId;\n\n    gReservedSpritePaletteCount = 10;\n    mugshotId = task->tMugshotId;\n    task->tOpponentSpriteId = CreateTrainerSprite(sMugshotsTrainerPicIDsTable[mugshotId],\n                                                  sMugshotsOpponentCoords[mugshotId][0] - 32,\n                                                  sMugshotsOpponentCoords[mugshotId][1] + 42,\n                                                  0, gDecompressionBuffer);\n    task->tPlayerSpriteId = CreateTrainerSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender, TRUE),\n                                                DISPLAY_WIDTH + 32,\n                                                106,\n                                                0, gDecompressionBuffer);\n    gReservedSpritePaletteCount = 12;\n\n    opponentSprite = &gSprites[task->tOpponentSpriteId];\n    playerSprite = &gSprites[task->tPlayerSpriteId];\n\n    opponentSprite->callback = SpriteCB_MugshotTrainerPic;\n    playerSprite->callback = SpriteCB_MugshotTrainerPic;\n\n    opponentSprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;\n    playerSprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;\n\n    opponentSprite->oam.matrixNum = AllocOamMatrix();\n    playerSprite->oam.matrixNum = AllocOamMatrix();\n\n    opponentSprite->oam.shape = SPRITE_SHAPE(64x32);\n    playerSprite->oam.shape = SPRITE_SHAPE(64x32);\n\n    opponentSprite->oam.size = SPRITE_SIZE(64x32);\n    playerSprite->oam.size = SPRITE_SIZE(64x32);\n\n    CalcCenterToCornerVec(opponentSprite, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), ST_OAM_AFFINE_DOUBLE);\n    CalcCenterToCornerVec(playerSprite, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), ST_OAM_AFFINE_DOUBLE);\n\n    SetOamMatrixRotationScaling(opponentSprite->oam.matrixNum, sMugshotsOpponentRotationScales[mugshotId][0], sMugshotsOpponentRotationScales[mugshotId][1], 0);\n    SetOamMatrixRotationScaling(playerSprite->oam.matrixNum, -512, 512, 0);\n}\n\nstatic void SpriteCB_MugshotTrainerPic(struct Sprite *sprite)\n{\n    while (sMugshotTrainerPicFuncs[sprite->sState](sprite));\n}\n\n// Wait until IncrementTrainerPicState is called\nstatic bool8 MugshotTrainerPic_Pause(struct Sprite *sprite)\n{\n    return FALSE;\n}\n\nstatic bool8 MugshotTrainerPic_Init(struct Sprite *sprite)\n{\n    s16 speeds[ARRAY_COUNT(sTrainerPicSlideSpeeds)];\n    s16 accels[ARRAY_COUNT(sTrainerPicSlideAccels)];\n\n    memcpy(speeds, sTrainerPicSlideSpeeds, sizeof(sTrainerPicSlideSpeeds));\n    memcpy(accels, sTrainerPicSlideAccels, sizeof(sTrainerPicSlideAccels));\n    sprite->sState++;\n    sprite->sSlideSpeed = speeds[sprite->sSlideDir];\n    sprite->sSlideAccel = accels[sprite->sSlideDir];\n    return TRUE;\n}\n\nstatic bool8 MugshotTrainerPic_Slide(struct Sprite *sprite)\n{\n    sprite->x += sprite->sSlideSpeed;\n\n    // Advance state when pic passes ~40% of screen\n    if (sprite->sSlideDir && sprite->x < DISPLAY_WIDTH - 107)\n        sprite->sState++;\n    else if (!sprite->sSlideDir && sprite->x > 103)\n        sprite->sState++;\n    return FALSE;\n}\n\nstatic bool8 MugshotTrainerPic_SlideSlow(struct Sprite *sprite)\n{\n    // Add acceleration value to speed, then add speed.\n    // For both sides acceleration is opposite speed, so slide slows down.\n    sprite->sSlideSpeed += sprite->sSlideAccel;\n    sprite->x += sprite->sSlideSpeed;\n\n    // Advance state when slide comes to a stop\n    if (sprite->sSlideSpeed == 0)\n    {\n        sprite->sState++;\n        sprite->sSlideAccel = -sprite->sSlideAccel;\n        sprite->sDone = TRUE;\n    }\n    return FALSE;\n}\n\n// Slides trainer pic offscreen. This is never reached, because it's preceded\n// by a second MugshotTrainerPic_Pause, and IncrementTrainerPicState is\n// only called once per trainer pic.\nstatic bool8 MugshotTrainerPic_SlideOffscreen(struct Sprite *sprite)\n{\n    sprite->sSlideSpeed += sprite->sSlideAccel;\n    sprite->x += sprite->sSlideSpeed;\n    if (sprite->x < -31 || sprite->x > DISPLAY_WIDTH + 31)\n        sprite->sState++;\n    return FALSE;\n}\n\nstatic void SetTrainerPicSlideDirection(s16 spriteId, bool16 dirId)\n{\n    gSprites[spriteId].sSlideDir = dirId;\n}\n\nstatic void IncrementTrainerPicState(s16 spriteId)\n{\n    gSprites[spriteId].sState++;\n}\n\nstatic s16 IsTrainerPicSlideDone(s16 spriteId)\n{\n    return gSprites[spriteId].sDone;\n}\n\n#undef sState\n#undef sSlideSpeed\n#undef sSlideAccel\n#undef sDone\n#undef sSlideDir\n#undef tSinIndex\n#undef tTopBannerX\n#undef tBottomBannerX\n#undef tTimer\n#undef tFadeSpread\n#undef tOpponentSpriteId\n#undef tPlayerSpriteId\n#undef tMugshotId\n\n//--------------------\n// B_TRANSITION_SLICE\n//--------------------\n\n#define tEffectX data[1]\n#define tSpeed data[2]\n#define tAccel data[3]\n\nstatic void Task_Slice(u8 taskId)\n{\n    while (sSlice_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 Slice_Init(struct Task *task)\n{\n    u32 i;\n\n    InitTransitionData();\n    ScanlineEffect_Clear();\n    task->tSpeed = 1 << 8;\n    task->tAccel = 1;\n    sTransitionData->winIn = WININ_WIN0_ALL;\n    sTransitionData->winOut = 0;\n    sTransitionData->win0V = DISPLAY_HEIGHT;\n    for (i = 0; i < DISPLAY_HEIGHT; i++)\n    {\n        gScanlineEffectRegBuffers[1][i] = sTransitionData->cameraX;\n        gScanlineEffectRegBuffers[1][DISPLAY_HEIGHT + i] = DISPLAY_WIDTH;\n    }\n    EnableInterrupts(INTR_FLAG_HBLANK);\n    SetVBlankCallback(VBlankCB_Slice);\n    SetHBlankCallback(HBlankCB_Slice);\n    task->tState++;\n    return TRUE;\n}\n\nstatic bool8 Slice_Main(struct Task *task)\n{\n    u32 i;\n\n    sTransitionData->vblankDma = FALSE;\n    task->tEffectX += (task->tSpeed >> 8);\n    if (task->tEffectX > DISPLAY_WIDTH)\n        task->tEffectX = DISPLAY_WIDTH;\n    if (task->tSpeed <= 0xFFF)\n        task->tSpeed += task->tAccel;\n    if (task->tAccel < 128)\n        task->tAccel <<= 1;\n\n    for (i = 0; i < DISPLAY_HEIGHT; i++)\n    {\n        u16 *ofsBuffer = &gScanlineEffectRegBuffers[0][i];\n        u16 *win0HBuffer = &gScanlineEffectRegBuffers[0][i + DISPLAY_HEIGHT];\n        \n        // Alternate rows\n        if (i & 1)\n        {\n            *ofsBuffer = sTransitionData->cameraX + task->tEffectX;\n            *win0HBuffer = DISPLAY_WIDTH - task->tEffectX;\n        }\n        else\n        {\n            *ofsBuffer = sTransitionData->cameraX - task->tEffectX;\n            *win0HBuffer = WIN_RANGE(task->tEffectX, DISPLAY_WIDTH + 1);\n        }\n    }\n    if (task->tEffectX >= DISPLAY_WIDTH)\n        task->tState++;\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic bool8 Slice_End(struct Task *task)\n{\n    DmaStop(0);\n    FadeScreenBlack();\n    DestroyTask(FindTaskIdByFunc(Task_Slice));\n    return FALSE;\n}\n\nstatic void VBlankCB_Slice(void)\n{\n    DmaStop(0);\n    VBlankCB_BattleTransition();\n    SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn);\n    SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut);\n    SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V);\n    if (sTransitionData->vblankDma)\n        DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 4);\n    DmaSet(0, &gScanlineEffectRegBuffers[1][DISPLAY_HEIGHT], &REG_WIN0H, B_TRANS_DMA_FLAGS);\n}\n\nstatic void HBlankCB_Slice(void)\n{\n    s16 offset = gScanlineEffectRegBuffers[1][REG_VCOUNT];\n    \n    REG_BG1HOFS = offset;\n    REG_BG2HOFS = offset;\n    REG_BG3HOFS = offset;\n}\n\n#undef tEffectX\n#undef tSpeed\n#undef tAccel\n\n//------------------------------\n// B_TRANSITION_WHITE_BARS_FADE\n//------------------------------\n\n#define sFade            data[0]\n#define sFinished        data[1]\n#define sDestroyAttempts data[2]\n#define sDelay           data[5]\n#define sIsMainSprite    data[6]\n\n#define FADE_TARGET (16 << 8)\n\nstatic void Task_WhiteBarsFade(u8 taskId)\n{\n    while (sWhiteBarsFade_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 WhiteBarsFade_Init(struct Task *task)\n{\n    u32 i;\n\n    InitTransitionData();\n    ScanlineEffect_Clear();\n    sTransitionData->bldCnt = BLDCNT_TGT1_ALL | BLDCNT_EFFECT_LIGHTEN;\n    sTransitionData->bldY = 0;\n    sTransitionData->winIn = WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ;\n    sTransitionData->winOut = WINOUT_WIN01_ALL;\n    sTransitionData->win0V = DISPLAY_HEIGHT;\n    for (i = 0; i < DISPLAY_HEIGHT; i++)\n    {\n        gScanlineEffectRegBuffers[1][i] = 0;\n        gScanlineEffectRegBuffers[1][i + DISPLAY_HEIGHT] = DISPLAY_WIDTH;\n    }\n    EnableInterrupts(INTR_FLAG_HBLANK);\n    SetHBlankCallback(HBlankCB_WhiteBarsFade);\n    SetVBlankCallback(VBlankCB_WhiteBarsFade);\n    task->tState++;\n    return FALSE;\n}\n\nstatic bool8 WhiteBarsFade_StartBars(struct Task *task)\n{\n    s16 i, posY;\n    s16 delays[ARRAY_COUNT(sWhiteBarsFade_StartDelays)];\n    struct Sprite *sprite;\n    memcpy(delays, sWhiteBarsFade_StartDelays, sizeof(sWhiteBarsFade_StartDelays));\n\n    for (i = 0, posY = 0; i < NUM_WHITE_BARS; i++, posY += WHITE_BAR_HEIGHT)\n    {\n        sprite = &gSprites[CreateInvisibleSprite(SpriteCB_WhiteBarFade)];\n        sprite->x = DISPLAY_WIDTH;\n        sprite->y = posY;\n        sprite->sDelay = delays[i];\n    }\n\n    // Set on one sprite only. This one will enable the DMA\n    // copy in VBlank and wait for the others to destroy.\n    sprite->sIsMainSprite++;\n\n    task->tState++;\n    return FALSE;\n}\n\nstatic bool8 WhiteBarsFade_WaitBars(struct Task *task)\n{\n    sTransitionData->vblankDma = FALSE;\n    if (sTransitionData->counter >= NUM_WHITE_BARS)\n    {\n        BlendPalettes(PALETTES_ALL, 16, RGB_WHITE);\n        task->tState++;\n    }\n    return FALSE;\n}\n\nstatic bool8 WhiteBarsFade_BlendToBlack(struct Task *task)\n{\n    sTransitionData->vblankDma = FALSE;\n    DmaStop(0);\n    SetVBlankCallback(NULL);\n    SetHBlankCallback(NULL);\n    sTransitionData->win0H = DISPLAY_WIDTH;\n    sTransitionData->bldY = 0;\n    sTransitionData->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN;\n    sTransitionData->winIn = WININ_WIN0_ALL;\n    sTransitionData->counter = 0;\n    SetVBlankCallback(VBlankCB_WhiteBarsFade_Blend);\n    task->tState++;\n    return FALSE;\n}\n\nstatic bool8 WhiteBarsFade_End(struct Task *task)\n{\n   sTransitionData->counter += 480;\n   sTransitionData->bldY = sTransitionData->counter >> 8;\n   if (sTransitionData->bldY > 16)\n   {\n       FadeScreenBlack();\n       DestroyTask(FindTaskIdByFunc(Task_WhiteBarsFade));\n   }\n   return FALSE;\n}\n\nstatic void VBlankCB_WhiteBarsFade(void)\n{\n    DmaStop(0);\n    VBlankCB_BattleTransition();\n    SetGpuReg(REG_OFFSET_BLDCNT, sTransitionData->bldCnt);\n    SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn);\n    SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut);\n    SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0H); // BUG: This should obviously be sTransitionData->win0V\n    if (sTransitionData->vblankDma)\n        DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 4);\n    DmaSet(0, &gScanlineEffectRegBuffers[1][DISPLAY_HEIGHT], &REG_WIN0H, B_TRANS_DMA_FLAGS);\n}\n\nstatic void VBlankCB_WhiteBarsFade_Blend(void)\n{\n    VBlankCB_BattleTransition();\n    SetGpuReg(REG_OFFSET_BLDY, sTransitionData->bldY);\n    SetGpuReg(REG_OFFSET_BLDCNT, sTransitionData->bldCnt);\n    SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn);\n    SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut);\n    SetGpuReg(REG_OFFSET_WIN0H, sTransitionData->win0H);\n    SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V);\n}\n\n\nstatic void HBlankCB_WhiteBarsFade(void)\n{\n    vu16 index = REG_VCOUNT;\n\n    if (index == 227)\n        index = 0;\n    REG_BLDY = gScanlineEffectRegBuffers[1][index];\n}\n\nstatic void SpriteCB_WhiteBarFade(struct Sprite *sprite)\n{\n    if (sprite->sDelay)\n    {\n        sprite->sDelay--;\n        if (sprite->sIsMainSprite)\n            sTransitionData->vblankDma = TRUE;\n    }\n    else\n    {\n        u32 i;\n        u16 *bldY = &gScanlineEffectRegBuffers[0][sprite->y];\n        u16 *win0H = &gScanlineEffectRegBuffers[0][sprite->y + DISPLAY_HEIGHT];\n\n        // Each bar is 27 pixels high. With 6 bars this is a total of 162, which is 2 pixels taller than the screen.\n        // 1 bar is therefore shortened by 2 pixels\n        u32 stripeWidth = sprite->sIsMainSprite ? (WHITE_BAR_HEIGHT - 2) : WHITE_BAR_HEIGHT;\n        \n        for (i = 0; i < stripeWidth; i++)\n        {\n            bldY[i] = sprite->sFade >> 8;\n            win0H[i] = (u8)(sprite->x);\n        }\n        if (sprite->x == 0 && sprite->sFade == FADE_TARGET)\n            sprite->sFinished = TRUE;\n        sprite->x -= 24;\n        sprite->sFade += 192;\n        if (sprite->x < 0)\n            sprite->x = 0;\n        if (sprite->sFade > FADE_TARGET)\n            sprite->sFade = FADE_TARGET;\n        if (sprite->sIsMainSprite)\n            sTransitionData->vblankDma = TRUE;\n        if (sprite->sFinished)\n        {\n            if (sprite->sIsMainSprite == FALSE || (sTransitionData->counter > 4))\n            {\n                sTransitionData->counter++;\n                DestroySprite(sprite);\n            }\n        }\n    }\n}\n\n#undef sFade\n#undef sFinished\n#undef sDestroyAttempts\n#undef sDelay\n#undef sIsMainSprite\n\n//---------------------------\n// B_TRANSITION_GRID_SQUARES\n//---------------------------\n\n#define tDelay       data[1]\n#define tShrinkStage data[2]\n\nstatic void Task_GridSquares(u8 taskId)\n{\n    while (sGridSquares_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 GridSquares_Init(struct Task *task)\n{\n    u16 *tilemap, *tileset;\n\n    GetBg0TilesDst(&tilemap, &tileset);\n    CpuCopy16(sGridSquare_Gfx, tileset, 0x20);\n    CpuFill16(0xF0 << 8, tilemap, BG_SCREEN_SIZE);\n    LoadPalette(sFieldEffectPal_Pokeball, BG_PLTT_ID(15), sizeof(sFieldEffectPal_Pokeball));\n    task->tState++;\n    return FALSE;\n}\n\nstatic bool8 GridSquares_Main(struct Task *task)\n{\n    u16 *tileset;\n\n    if (task->tDelay == 0)\n    {\n        GetBg0TilemapDst(&tileset);\n        task->tDelay = 3;\n        task->tShrinkStage++;\n        CpuCopy16(&sGridSquare_Gfx[task->tShrinkStage * 8], tileset, 0x20);\n        if (task->tShrinkStage > 13)\n        {\n            task->tState++;\n            task->tDelay = 16;\n        }\n    }\n    task->tDelay--;\n    return FALSE;\n}\n\nstatic bool8 GridSquares_End(struct Task *task)\n{\n    if (--task->tDelay == 0)\n    {\n        FadeScreenBlack();\n        DestroyTask(FindTaskIdByFunc(Task_GridSquares));\n    }\n    return FALSE;\n}\n\n#undef tDelay\n#undef tShrinkStage\n\n//---------------------------\n// B_TRANSITION_ANGLED_WIPES\n//---------------------------\n\n#define tWipeId data[1]\n#define tDir    data[2]\n#define tDelay  data[3]\n\nstatic void Task_AngledWipes(u8 taskId)\n{\n    while (sAngledWipes_Funcs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 AngledWipes_Init(struct Task *task)\n{\n    u32 i;\n\n    InitTransitionData();\n    ScanlineEffect_Clear();\n    sTransitionData->winIn = WININ_WIN0_ALL;\n    sTransitionData->winOut = 0;\n    sTransitionData->win0V = DISPLAY_HEIGHT;\n    for (i = 0; i < DISPLAY_HEIGHT; i++)\n        gScanlineEffectRegBuffers[0][i] = WIN_RANGE(0, DISPLAY_WIDTH);\n    CpuCopy16(gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 2);\n    SetVBlankCallback(VBlankCB_AngledWipes);\n    task->tState++;\n    return TRUE;\n}\n\nstatic bool8 AngledWipes_SetWipeData(struct Task *task)\n{\n    InitBlackWipe(sTransitionData->data,\n                  sAngledWipes_MoveData[task->tWipeId][0],\n                  sAngledWipes_MoveData[task->tWipeId][1],\n                  sAngledWipes_MoveData[task->tWipeId][2],\n                  sAngledWipes_MoveData[task->tWipeId][3],\n                  1, 1);\n    task->tDir = sAngledWipes_MoveData[task->tWipeId][4];\n    task->tState++;\n    return TRUE;\n}\n\nstatic bool8 AngledWipes_DoWipe(struct Task *task)\n{\n    s32 i;\n    bool8 finished;\n\n    sTransitionData->vblankDma = FALSE;\n    for (i = 0, finished = FALSE; i < 16; i++)\n    {\n        s16 left = gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] >> 8;\n        s16 right = gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] & 0xFF;\n        if (task->tDir == 0)\n        {\n            // Moving down\n            if (left < sTransitionData->tWipeCurrX)\n                left = sTransitionData->tWipeCurrX;\n            if (left > right)\n                left = right;\n        }\n        else\n        {\n            // Moving up\n            if (right > sTransitionData->tWipeCurrX)\n                right = sTransitionData->tWipeCurrX;\n            if (right <= left)\n                right = left;\n        }\n        gScanlineEffectRegBuffers[0][sTransitionData->tWipeCurrY] = WIN_RANGE2(left, right);\n        if (finished)\n        {\n            task->tState++;\n            break;\n        }\n        finished = UpdateBlackWipe(sTransitionData->data, TRUE, TRUE);\n    }\n    sTransitionData->vblankDma++;\n    return FALSE;\n}\n\nstatic bool8 AngledWipes_TryEnd(struct Task *task)\n{\n    if (++task->tWipeId < NUM_ANGLED_WIPES)\n    {\n        // Continue with next wipe\n        task->tState++;\n        task->tDelay = sAngledWipes_EndDelays[task->tWipeId - 1];\n        return TRUE;\n    }\n    else\n    {\n        // End transition\n        DmaStop(0);\n        FadeScreenBlack();\n        DestroyTask(FindTaskIdByFunc(Task_AngledWipes));\n        return FALSE;\n    }\n}\n\nstatic bool8 AngledWipes_StartNext(struct Task *task)\n{\n    if (--task->tDelay == 0)\n    {\n        // Return to AngledWipes_SetWipeData\n        task->tState = 1;\n        return TRUE;\n    }\n    else\n        return FALSE;\n}\n\nstatic void VBlankCB_AngledWipes(void)\n{\n    DmaStop(0);\n    VBlankCB_BattleTransition();\n    if (sTransitionData->vblankDma)\n        DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], DISPLAY_HEIGHT * 2);\n    SetGpuReg(REG_OFFSET_WININ, sTransitionData->winIn);\n    SetGpuReg(REG_OFFSET_WINOUT, sTransitionData->winOut);\n    SetGpuReg(REG_OFFSET_WIN0V, sTransitionData->win0V);\n    SetGpuReg(REG_OFFSET_WIN0H, gScanlineEffectRegBuffers[1][0]);\n    DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, B_TRANS_DMA_FLAGS);\n}\n\n#undef tWipeId\n#undef tDir\n#undef tDelay\n\n//-----------------------------------\n// Transition intro\n//-----------------------------------\n\n#define tFadeToGrayDelay   data[1]\n#define tFadeFromGrayDelay data[2]\n#define tNumFades          data[3]\n#define tFadeToGraySpeed   data[4]\n#define tFadeFromGraySpeed data[5]\n#define tDelayTimer        data[6]\n#define tBlend             data[7]\n\nstatic void CreateIntroTask(s16 fadeToGrayDelay, s16 fadeFromGrayDelay, s16 numFades, s16 fadeToGraySpeed, s16 fadeFromGraySpeed)\n{\n    u8 taskId = CreateTask(Task_BattleTransition_Intro, 3);\n    gTasks[taskId].tFadeToGrayDelay = fadeToGrayDelay;\n    gTasks[taskId].tFadeFromGrayDelay = fadeFromGrayDelay;\n    gTasks[taskId].tNumFades = numFades;\n    gTasks[taskId].tFadeToGraySpeed = fadeToGraySpeed;\n    gTasks[taskId].tFadeFromGraySpeed = fadeFromGraySpeed;\n    gTasks[taskId].tDelayTimer = fadeToGrayDelay;\n}\n\nstatic bool8 IsIntroTaskDone(void)\n{\n    if (FindTaskIdByFunc(Task_BattleTransition_Intro) == TASK_NONE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void Task_BattleTransition_Intro(u8 taskId)\n{\n    while (sTransitionIntroFuncs[gTasks[taskId].tState](&gTasks[taskId]));\n}\n\nstatic bool8 TransitionIntro_FadeToGray(struct Task *task)\n{\n    if (task->tDelayTimer == 0 || --task->tDelayTimer == 0)\n    {\n        task->tDelayTimer = task->tFadeToGrayDelay;\n        task->tBlend += task->tFadeToGraySpeed;\n        if (task->tBlend > 16)\n            task->tBlend = 16;\n        BlendPalettes(-1, task->tBlend, RGB(11, 11, 11));\n    }\n    if (task->tBlend >= 16)\n    {\n        // Fade to gray complete, start fade back\n        task->tState++;\n        task->tDelayTimer = task->tFadeFromGrayDelay;\n    }\n    return FALSE;\n}\n\nstatic bool8 TransitionIntro_FadeFromGray(struct Task *task)\n{\n    if (task->tDelayTimer == 0 || --task->tDelayTimer == 0)\n    {\n        task->tDelayTimer = task->tFadeFromGrayDelay;\n        task->tBlend -= task->tFadeFromGraySpeed;\n        if (task->tBlend < 0)\n            task->tBlend = 0;\n        BlendPalettes(PALETTES_ALL, task->tBlend, RGB(11, 11, 11));\n    }\n    if (task->tBlend == 0)\n    {\n        if (--task->tNumFades == 0)\n        {\n            // All fades done, end intro\n            DestroyTask(FindTaskIdByFunc(Task_BattleTransition_Intro));\n        }\n        else\n        {\n            // Fade from gray complete, start new fade\n            task->tDelayTimer = task->tFadeToGrayDelay;\n            task->tState = 0;\n        }\n    }\n    return FALSE;\n}\n\n#undef tFadeToGrayDelay\n#undef tFadeFromGrayDelay\n#undef tNumFades\n#undef tFadeToGraySpeed\n#undef tFadeFromGraySpeed\n#undef tDelayTimer\n#undef tBlend\n\n//-----------------------------------\n// General transition functions\n//-----------------------------------\n\nstatic void InitTransitionData(void)\n{\n    memset(sTransitionData, 0, sizeof(*sTransitionData));\n    FieldCameraGetPixelOffsetAtGround(&sTransitionData->cameraX, &sTransitionData->cameraY);\n}\n\nstatic void VBlankCB_BattleTransition(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void GetBg0TilemapDst(u16 **tilesetPtr)\n{\n    u16 charBase;\n\n    charBase = GetGpuReg(REG_OFFSET_BG0CNT) >> 2;\n    charBase <<= 14;\n    *tilesetPtr = (u16 *)(VRAM + charBase);\n}\n\nstatic void GetBg0TilesDst(u16 **tilemapPtr, u16 **tilesetPtr)\n{\n    u16 screenBase, charBase;\n\n    screenBase = (GetGpuReg(REG_OFFSET_BG0CNT) >> 8) & 0x1F;\n    charBase = GetGpuReg(REG_OFFSET_BG0CNT) >> 2;\n    screenBase <<= 11;\n    charBase <<= 14;\n    *tilemapPtr = (u16 *)(VRAM + screenBase);\n    *tilesetPtr = (u16 *)(VRAM + charBase);\n}\n\nstatic void FadeScreenBlack(void)\n{\n    BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n}\n\nstatic void SetSinWave(s16 *buffer, s16 offset, s16 index, s16 frequency, s16 amplitude, s16 bufSize)\n{\n    u32 i;\n\n    for (i = 0; bufSize > 0; bufSize--, i++, index += frequency)\n        buffer[i] = offset + Sin(index & 0xFF, amplitude);\n}\n\nstatic void SetCircularMask(s16 *buffer, s16 x, s16 y, s16 radius)\n{\n    s32 i;\n\n    memset(buffer, 10, DISPLAY_HEIGHT * sizeof(u16));\n    // 64 iterations because we only want to cover [0, π/2) discretely.\n    for (i = 0; i < 64; i++)\n    {\n        s16 sinResult, cosResult, leftX, topY, bottomY, nextTopY, nextBottomY, winVal;\n\n        // The loop variable i here does not stand for rotation angle, \n        // but is the angle between segment (center, pointOnCircle) \n        // and vertical line.   \n        sinResult = Sin(i, radius);\n        cosResult = Cos(i, radius);\n        leftX = x - sinResult;\n        winVal = x + sinResult;\n        topY = y - cosResult;\n        bottomY = y + cosResult;\n        if (leftX < 0)\n            leftX = 0;\n        if (winVal > DISPLAY_WIDTH)\n            winVal = DISPLAY_WIDTH;\n        if (topY < 0)\n            topY = 0;\n        if (bottomY > DISPLAY_HEIGHT - 1)\n            bottomY = DISPLAY_HEIGHT - 1;\n        winVal |= (leftX << 8);\n        buffer[topY] = winVal;\n        buffer[bottomY] = winVal;\n        cosResult = Cos(i + 1, radius);\n        nextTopY = y - cosResult;\n        nextBottomY = y + cosResult;\n        if (nextTopY < 0)\n            nextTopY = 0;\n        if (nextBottomY > DISPLAY_HEIGHT - 1)\n            nextBottomY = DISPLAY_HEIGHT - 1;\n        // fill everything in between with the same WIN0H value\n        while (topY > nextTopY)\n            buffer[--topY] = winVal;\n        while (topY < nextTopY)\n            buffer[++topY] = winVal;\n        while (bottomY > nextBottomY)\n            buffer[--bottomY] = winVal;\n        while (bottomY < nextBottomY)\n            buffer[++bottomY] = winVal;\n    }\n}\n\nstatic void InitBlackWipe(s16 *data, s16 startX, s16 startY, s16 endX, s16 endY, s16 stepX, s16 stepY)\n{\n    tWipeStartX = startX;\n    tWipeStartY = startY;\n    tWipeCurrX = startX;\n    tWipeCurrY = startY;\n    tWipeEndX = endX;\n    tWipeEndY = endY;\n    tWipeXMove = stepX;\n    tWipeYMove = stepY;\n    tWipeXDist = endX - startX;\n    if (tWipeXDist < 0)\n    {\n        // If end was less than start, reverse direction\n        tWipeXDist = -tWipeXDist;\n        tWipeXMove = -stepX;\n    }\n    tWipeYDist = endY - startY;\n    if (tWipeYDist < 0)\n    {\n        // If end was less than start, reverse direction\n        tWipeYDist = -tWipeYDist;\n        tWipeYMove = -stepY;\n    }\n    tWipeTemp = 0;\n}\n\nstatic bool8 UpdateBlackWipe(s16 *data, bool8 xExact, bool8 yExact)\n{\n    u8 numFinished;\n\n    if (tWipeXDist > tWipeYDist)\n    {\n        // X has further to move, move it first\n        tWipeCurrX += tWipeXMove;\n        \n        // If it has been far enough since Y's\n        // last move then move it too\n        tWipeTemp += tWipeYDist;\n        if (tWipeTemp > tWipeXDist)\n        {\n            tWipeCurrY += tWipeYMove;\n            tWipeTemp -= tWipeXDist;\n        }\n    }\n    else\n    {\n        // Y has further to move, move it first\n        tWipeCurrY += tWipeYMove;\n        \n        // If it has been far enough since X's\n        // last move then move it too\n        tWipeTemp += tWipeXDist;\n        if (tWipeTemp > tWipeYDist)\n        {\n            tWipeCurrX += tWipeXMove;\n            tWipeTemp -= tWipeYDist;\n        }\n    }\n\n    numFinished = 0;\n\n    // Has X coord reached end?\n    if ((tWipeXMove > 0 && tWipeCurrX >= tWipeEndX)\n     || (tWipeXMove < 0 && tWipeCurrX <= tWipeEndX))\n    {\n        numFinished++;\n        if (xExact)\n            tWipeCurrX = tWipeEndX;\n    }\n\n    // Has Y coord reached end?\n    if ((tWipeYMove > 0 && tWipeCurrY >= tWipeEndY)\n     || (tWipeYMove < 0 && tWipeCurrY <= tWipeEndY))\n    {\n        numFinished++;\n        if (yExact)\n            tWipeCurrY = tWipeEndY;\n    }\n\n    // Return TRUE if both coords have reached end\n    if (numFinished == 2)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic bool32 IsMugshotTransition(u8 transitionId)\n{\n    switch(transitionId)\n    {\n        case B_TRANSITION_LORELEI ... B_TRANSITION_BLUE:\n        case B_TRANSITION_OAK:\n            return TRUE;\n        default:\n            return FALSE;\n    }\n}\n"
  },
  {
    "path": "src/battle_util.c",
    "content": "#include \"global.h\"\n#include \"item.h\"\n#include \"text.h\"\n#include \"util.h\"\n#include \"link.h\"\n#include \"berry.h\"\n#include \"random.h\"\n#include \"pokemon.h\"\n#include \"string_util.h\"\n#include \"field_weather.h\"\n#include \"event_data.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_scripts.h\"\n#include \"battle_message.h\"\n#include \"constants/battle_anim.h\"\n#include \"battle_controllers.h\"\n#include \"battle_ai_script_commands.h\"\n#include \"constants/battle.h\"\n#include \"constants/moves.h\"\n#include \"constants/items.h\"\n#include \"constants/weather.h\"\n#include \"constants/abilities.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/hold_effects.h\"\n#include \"constants/battle_move_effects.h\"\n#include \"constants/battle_script_commands.h\"\n\n#define SOUND_MOVES_END 0xFFFF\n\nstatic const u16 sSoundMovesTable[] =\n{\n    MOVE_GROWL, MOVE_ROAR, MOVE_SING, MOVE_SUPERSONIC, MOVE_SCREECH, MOVE_SNORE,\n    MOVE_UPROAR, MOVE_METAL_SOUND, MOVE_GRASS_WHISTLE, MOVE_HYPER_VOICE, SOUND_MOVES_END\n};\n\nu8 GetBattlerForBattleScript(u8 caseId)\n{\n    u8 ret = 0;\n    switch (caseId)\n    {\n    case BS_TARGET:\n        ret = gBattlerTarget;\n        break;\n    case BS_ATTACKER:\n        ret = gBattlerAttacker;\n        break;\n    case BS_EFFECT_BATTLER:\n        ret = gEffectBattler;\n        break;\n    case BS_BATTLER_0:\n        ret = 0;\n        break;\n    case BS_SCRIPTING:\n        ret = gBattleScripting.battler;\n        break;\n    case BS_FAINTED:\n        ret = gBattlerFainted;\n        break;\n    case BS_FAINTED_LINK_MULTIPLE_1:\n        ret = gBattlerFainted;\n        break;\n    case BS_PLAYER1:\n        ret = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n        break;\n    case BS_OPPONENT1:\n        ret = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        break;\n    case BS_ATTACKER_WITH_PARTNER:\n    case BS_FAINTED_LINK_MULTIPLE_2:\n    case BS_ATTACKER_SIDE:\n    case BS_NOT_ATTACKER_SIDE:\n        break;\n    }\n    return ret;\n}\n\nvoid PressurePPLose(u8 target, u8 attacker, u16 move)\n{\n    int moveIndex;\n\n    if (gBattleMons[target].ability != ABILITY_PRESSURE)\n        return;\n\n    for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++)\n    {\n        if (gBattleMons[attacker].moves[moveIndex] == move)\n            break;\n    }\n\n    if (moveIndex == MAX_MON_MOVES)\n        return;\n\n    if (gBattleMons[attacker].pp[moveIndex] != 0)\n        gBattleMons[attacker].pp[moveIndex]--;\n\n    if (MOVE_IS_PERMANENT(attacker, moveIndex))\n    {\n        gActiveBattler = attacker;\n        BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + moveIndex, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]);\n        MarkBattlerForControllerExec(gActiveBattler);\n    }\n}\n\nvoid PressurePPLoseOnUsingImprison(u8 attacker)\n{\n    int i, j;\n    int imprisonPos = MAX_MON_MOVES;\n    u8 atkSide = GetBattlerSide(attacker);\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if (atkSide != GetBattlerSide(i) && gBattleMons[i].ability == ABILITY_PRESSURE)\n        {\n            for (j = 0; j < MAX_MON_MOVES; j++)\n            {\n                if (gBattleMons[attacker].moves[j] == MOVE_IMPRISON)\n                    break;\n            }\n            if (j != MAX_MON_MOVES)\n            {\n                imprisonPos = j;\n                if (gBattleMons[attacker].pp[j] != 0)\n                    gBattleMons[attacker].pp[j]--;\n            }\n        }\n    }\n\n    if (imprisonPos != MAX_MON_MOVES && MOVE_IS_PERMANENT(attacker, imprisonPos))\n    {\n        gActiveBattler = attacker;\n        BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + imprisonPos, 0, 1, &gBattleMons[gActiveBattler].pp[imprisonPos]);\n        MarkBattlerForControllerExec(gActiveBattler);\n    }\n}\n\nvoid PressurePPLoseOnUsingPerishSong(u8 attacker)\n{\n    int i, j;\n    int perishSongPos = MAX_MON_MOVES;\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if (gBattleMons[i].ability == ABILITY_PRESSURE && i != attacker)\n        {\n            for (j = 0; j < MAX_MON_MOVES; j++)\n            {\n                if (gBattleMons[attacker].moves[j] == MOVE_PERISH_SONG)\n                    break;\n            }\n            if (j != MAX_MON_MOVES)\n            {\n                perishSongPos = j;\n                if (gBattleMons[attacker].pp[j] != 0)\n                    gBattleMons[attacker].pp[j]--;\n            }\n        }\n    }\n\n    if (perishSongPos != MAX_MON_MOVES && MOVE_IS_PERMANENT(attacker, perishSongPos))\n    {\n        gActiveBattler = attacker;\n        BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBattler].pp[perishSongPos]);\n        MarkBattlerForControllerExec(gActiveBattler);\n    }\n}\n\n// Unused\nstatic void MarkAllBattlersForControllerExec(void)\n{\n    int i;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        for (i = 0; i < gBattlersCount; i++)\n            gBattleControllerExecFlags |= gBitTable[i] << (32 - MAX_BATTLERS_COUNT);\n    }\n    else\n    {\n        for (i = 0; i < gBattlersCount; i++)\n            gBattleControllerExecFlags |= gBitTable[i];\n    }\n}\n\nvoid MarkBattlerForControllerExec(u8 battlerId)\n{\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n        gBattleControllerExecFlags |= gBitTable[battlerId] << (32 - MAX_BATTLERS_COUNT);\n    else\n        gBattleControllerExecFlags |= gBitTable[battlerId];\n}\n\nvoid MarkBattlerReceivedLinkData(u8 battlerId)\n{\n    s32 i;\n\n    for (i = 0; i < GetLinkPlayerCount(); i++)\n        gBattleControllerExecFlags |= gBitTable[battlerId] << (i << 2);\n\n    gBattleControllerExecFlags &= ~((1 << 28) << battlerId);\n}\n\nvoid CancelMultiTurnMoves(u8 battler)\n{\n    gBattleMons[battler].status2 &= ~STATUS2_MULTIPLETURNS;\n    gBattleMons[battler].status2 &= ~STATUS2_LOCK_CONFUSE;\n    gBattleMons[battler].status2 &= ~STATUS2_UPROAR;\n    gBattleMons[battler].status2 &= ~STATUS2_BIDE;\n\n    gStatuses3[battler] &= ~STATUS3_SEMI_INVULNERABLE;\n\n    gDisableStructs[battler].rolloutTimer = 0;\n    gDisableStructs[battler].furyCutterCounter = 0;\n}\n\nbool8 WasUnableToUseMove(u8 battler)\n{\n    if (gProtectStructs[battler].prlzImmobility\n        || gProtectStructs[battler].targetNotAffected\n        || gProtectStructs[battler].usedImprisonedMove\n        || gProtectStructs[battler].loveImmobility\n        || gProtectStructs[battler].usedDisabledMove\n        || gProtectStructs[battler].usedTauntedMove\n        || gProtectStructs[battler].flag2Unknown\n        || gProtectStructs[battler].flinchImmobility\n        || gProtectStructs[battler].confusionSelfDmg)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid PrepareStringBattle(u16 stringId, u8 battler)\n{\n    gActiveBattler = battler;\n    BtlController_EmitPrintString(BUFFER_A, stringId);\n    MarkBattlerForControllerExec(gActiveBattler);\n}\n\nvoid ResetSentPokesToOpponentValue(void)\n{\n    s32 i;\n    u32 bits = 0;\n\n    gSentPokesToOpponent[0] = 0;\n    gSentPokesToOpponent[1] = 0;\n\n    for (i = 0; i < gBattlersCount; i += 2)\n        bits |= gBitTable[gBattlerPartyIndexes[i]];\n\n    for (i = 1; i < gBattlersCount; i += 2)\n        gSentPokesToOpponent[(i & BIT_FLANK) >> 1] = bits;\n}\n\nvoid OpponentSwitchInResetSentPokesToOpponentValue(u8 battler)\n{\n    s32 i = 0;\n    u32 bits = 0;\n\n    if (GetBattlerSide(battler) == B_SIDE_OPPONENT)\n    {\n        u8 flank = ((battler & BIT_FLANK) >> 1);\n        gSentPokesToOpponent[flank] = 0;\n\n        for (i = 0; i < gBattlersCount; i += 2)\n        {\n            if (!(gAbsentBattlerFlags & gBitTable[i]))\n                bits |= gBitTable[gBattlerPartyIndexes[i]];\n        }\n        gSentPokesToOpponent[flank] = bits;\n    }\n}\n\nvoid UpdateSentPokesToOpponentValue(u8 battler)\n{\n    if (GetBattlerSide(battler) == B_SIDE_OPPONENT)\n    {\n        OpponentSwitchInResetSentPokesToOpponentValue(battler);\n    }\n    else\n    {\n        s32 i;\n        for (i = 1; i < gBattlersCount; i++)\n            gSentPokesToOpponent[(i & BIT_FLANK) >> 1] |= gBitTable[gBattlerPartyIndexes[battler]];\n    }\n}\n\nvoid BattleScriptPush(const u8 *bsPtr)\n{\n    gBattleResources->battleScriptsStack->ptr[gBattleResources->battleScriptsStack->size++] = bsPtr;\n}\n\nvoid BattleScriptPushCursor(void)\n{\n    gBattleResources->battleScriptsStack->ptr[gBattleResources->battleScriptsStack->size++] = gBattlescriptCurrInstr;\n}\n\nvoid BattleScriptPop(void)\n{\n    gBattlescriptCurrInstr = gBattleResources->battleScriptsStack->ptr[--gBattleResources->battleScriptsStack->size];\n}\n\nu8 TrySetCantSelectMoveBattleScript(void)\n{\n    u8 holdEffect;\n    u8 limitations = 0;\n    u16 move = gBattleMons[gActiveBattler].moves[gBattleBufferB[gActiveBattler][2]];\n    u16 *choicedMove = &gBattleStruct->choicedMove[gActiveBattler];\n\n    if (gDisableStructs[gActiveBattler].disabledMove == move && move != MOVE_NONE)\n    {\n        gBattleScripting.battler = gActiveBattler;\n        gCurrentMove = move;\n        gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingDisabledMove;\n        limitations = 1;\n    }\n\n    if (move == gLastMoves[gActiveBattler] && move != MOVE_STRUGGLE && (gBattleMons[gActiveBattler].status2 & STATUS2_TORMENT))\n    {\n        CancelMultiTurnMoves(gActiveBattler);\n        gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingTormentedMove;\n        limitations++;\n    }\n\n    if (gDisableStructs[gActiveBattler].tauntTimer != 0 && gBattleMoves[move].power == 0)\n    {\n        gCurrentMove = move;\n        gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveTaunt;\n        limitations++;\n    }\n\n    if (GetImprisonedMovesCount(gActiveBattler, move))\n    {\n        gCurrentMove = move;\n        gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingImprisonedMove;\n        limitations++;\n    }\n\n    if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY)\n        holdEffect = gEnigmaBerries[gActiveBattler].holdEffect;\n    else\n        holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item);\n\n    gPotentialItemEffectBattler = gActiveBattler;\n\n    if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move)\n    {\n        gCurrentMove = *choicedMove;\n        gLastUsedItem = gBattleMons[gActiveBattler].item;\n        gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveChoiceItem;\n        limitations++;\n    }\n\n    if (gBattleMons[gActiveBattler].pp[gBattleBufferB[gActiveBattler][2]] == 0)\n    {\n        gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingMoveWithNoPP;\n        limitations++;\n    }\n    return limitations;\n}\n\nu8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check)\n{\n    u8 holdEffect;\n    u16 *choicedMove = &gBattleStruct->choicedMove[battlerId];\n    s32 i;\n\n    if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY)\n        holdEffect = gEnigmaBerries[battlerId].holdEffect;\n    else\n        holdEffect = ItemId_GetHoldEffect(gBattleMons[battlerId].item);\n\n    gPotentialItemEffectBattler = battlerId;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        // No move\n        if (gBattleMons[battlerId].moves[i] == MOVE_NONE && check & MOVE_LIMITATION_ZEROMOVE)\n            unusableMoves |= gBitTable[i];\n        // No PP\n        if (gBattleMons[battlerId].pp[i] == 0 && check & MOVE_LIMITATION_PP)\n            unusableMoves |= gBitTable[i];\n        // Disable\n        if (gBattleMons[battlerId].moves[i] == gDisableStructs[battlerId].disabledMove && check & MOVE_LIMITATION_DISABLED)\n            unusableMoves |= gBitTable[i];\n        // Torment\n        if (gBattleMons[battlerId].moves[i] == gLastMoves[battlerId] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[battlerId].status2 & STATUS2_TORMENT)\n            unusableMoves |= gBitTable[i];\n        // Taunt\n        if (gDisableStructs[battlerId].tauntTimer && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[battlerId].moves[i]].power == 0)\n            unusableMoves |= gBitTable[i];\n        // Imprison\n        if (GetImprisonedMovesCount(battlerId, gBattleMons[battlerId].moves[i]) && check & MOVE_LIMITATION_IMPRISON)\n            unusableMoves |= gBitTable[i];\n        // Encore\n        if (gDisableStructs[battlerId].encoreTimer && gDisableStructs[battlerId].encoredMove != gBattleMons[battlerId].moves[i])\n            unusableMoves |= gBitTable[i];\n        // Choice Band\n        if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != gBattleMons[battlerId].moves[i])\n            unusableMoves |= gBitTable[i];\n    }\n    return unusableMoves;\n}\n\n#define ALL_MOVES_MASK ((1 << MAX_MON_MOVES) - 1)\nbool8 AreAllMovesUnusable(void)\n{\n    u8 unusable = CheckMoveLimitations(gActiveBattler, 0, MOVE_LIMITATIONS_ALL);\n\n    if (unusable == ALL_MOVES_MASK) // All moves are unusable.\n    {\n        gProtectStructs[gActiveBattler].noValidMoves = TRUE;\n        gSelectionBattleScripts[gActiveBattler] = BattleScript_NoMovesLeft;\n        if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n            gBattleBufferB[gActiveBattler][3] = GetBattlerAtPosition((BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler))) | (Random() & 2));\n        else \n            gBattleBufferB[gActiveBattler][3] = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler)));\n    }\n    else\n    {\n        gProtectStructs[gActiveBattler].noValidMoves = FALSE;\n    }\n\n    return (unusable == ALL_MOVES_MASK);\n}\n#undef ALL_MOVES_MASK\n\nu8 GetImprisonedMovesCount(u8 battlerId, u16 move)\n{\n    s32 i;\n    u8 imprisonedMoves = 0;\n    u8 battlerSide = GetBattlerSide(battlerId);\n\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if (battlerSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS)\n        {\n            s32 j;\n            for (j = 0; j < MAX_MON_MOVES; j++)\n            {\n                if (move == gBattleMons[i].moves[j])\n                    break;\n            }\n            if (j < MAX_MON_MOVES)\n                imprisonedMoves++;\n        }\n    }\n\n    return imprisonedMoves;\n}\n\nenum\n{\n    ENDTURN_ORDER,\n    ENDTURN_REFLECT,\n    ENDTURN_LIGHT_SCREEN,\n    ENDTURN_MIST,\n    ENDTURN_SAFEGUARD,\n    ENDTURN_WISH,\n    ENDTURN_RAIN,\n    ENDTURN_SANDSTORM,\n    ENDTURN_SUN,\n    ENDTURN_HAIL,\n    ENDTURN_FIELD_COUNT,\n};\n\nu8 DoFieldEndTurnEffects(void)\n{\n    u8 effect = 0;\n    s32 i;\n\n    for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerAttacker]; gBattlerAttacker++)\n    {\n    }\n    for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerTarget]; gBattlerTarget++)\n    {\n    }\n\n    do\n    {\n        u8 side;\n\n        switch (gBattleStruct->turnCountersTracker)\n        {\n        case ENDTURN_ORDER:\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                gBattlerByTurnOrder[i] = i;\n            }\n            for (i = 0; i < gBattlersCount - 1; i++)\n            {\n                s32 j;\n                for (j = i + 1; j < gBattlersCount; j++)\n                {\n                    if (GetWhoStrikesFirst(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE))\n                        SwapTurnOrder(i, j);\n                }\n            }\n            {\n                u8 *var = &gBattleStruct->turnCountersTracker;\n                \n                ++*var;\n                gBattleStruct->turnSideTracker = 0;\n            }\n            // fall through\n        case ENDTURN_REFLECT:\n            while (gBattleStruct->turnSideTracker < 2)\n            {\n                side = gBattleStruct->turnSideTracker;\n                gActiveBattler = gBattlerAttacker = gSideTimers[side].reflectBattlerId;\n                if (gSideStatuses[side] & SIDE_STATUS_REFLECT)\n                {\n                    if (--gSideTimers[side].reflectTimer == 0)\n                    {\n                        gSideStatuses[side] &= ~SIDE_STATUS_REFLECT;\n                        BattleScriptExecute(BattleScript_SideStatusWoreOff);\n                        PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_REFLECT);\n                        effect++;\n                    }\n                }\n                gBattleStruct->turnSideTracker++;\n                if (effect != 0)\n                    break;\n            }\n            if (effect == 0)\n            {\n                gBattleStruct->turnCountersTracker++;\n                gBattleStruct->turnSideTracker = 0;\n            }\n            break;\n        case ENDTURN_LIGHT_SCREEN:\n            while (gBattleStruct->turnSideTracker < 2)\n            {\n                side = gBattleStruct->turnSideTracker;\n                gActiveBattler = gBattlerAttacker = gSideTimers[side].lightscreenBattlerId;\n                if (gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN)\n                {\n                    if (--gSideTimers[side].lightscreenTimer == 0)\n                    {\n                        gSideStatuses[side] &= ~SIDE_STATUS_LIGHTSCREEN;\n                        BattleScriptExecute(BattleScript_SideStatusWoreOff);\n                        gBattleCommunication[MULTISTRING_CHOOSER] = side;\n                        PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_LIGHT_SCREEN);\n                        effect++;\n                    }\n                }\n                gBattleStruct->turnSideTracker++;\n                if (effect != 0)\n                    break;\n            }\n            if (effect == 0)\n            {\n                gBattleStruct->turnCountersTracker++;\n                gBattleStruct->turnSideTracker = 0;\n            }\n            break;\n        case ENDTURN_MIST:\n            while (gBattleStruct->turnSideTracker < 2)\n            {\n                side = gBattleStruct->turnSideTracker;\n                gActiveBattler = gBattlerAttacker = gSideTimers[side].mistBattlerId;\n                if (gSideTimers[side].mistTimer != 0 && --gSideTimers[side].mistTimer == 0)\n                {\n                    gSideStatuses[side] &= ~SIDE_STATUS_MIST;\n                    BattleScriptExecute(BattleScript_SideStatusWoreOff);\n                    gBattleCommunication[MULTISTRING_CHOOSER] = side;\n                    PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_MIST);\n                    effect++;\n                }\n                gBattleStruct->turnSideTracker++;\n                if (effect != 0)\n                    break;\n            }\n            if (effect == 0)\n            {\n                gBattleStruct->turnCountersTracker++;\n                gBattleStruct->turnSideTracker = 0;\n            }\n            break;\n        case ENDTURN_SAFEGUARD:\n            while (gBattleStruct->turnSideTracker < 2)\n            {\n                side = gBattleStruct->turnSideTracker;\n                gActiveBattler = gBattlerAttacker = gSideTimers[side].safeguardBattlerId;\n                if (gSideStatuses[side] & SIDE_STATUS_SAFEGUARD)\n                {\n                    if (--gSideTimers[side].safeguardTimer == 0)\n                    {\n                        gSideStatuses[side] &= ~SIDE_STATUS_SAFEGUARD;\n                        BattleScriptExecute(BattleScript_SafeguardEnds);\n                        effect++;\n                    }\n                }\n                gBattleStruct->turnSideTracker++;\n                if (effect != 0)\n                    break;\n            }\n            if (effect == 0)\n            {\n                gBattleStruct->turnCountersTracker++;\n                gBattleStruct->turnSideTracker = 0;\n            }\n            break;\n        case ENDTURN_WISH:\n            while (gBattleStruct->turnSideTracker < gBattlersCount)\n            {\n                gActiveBattler = gBattlerByTurnOrder[gBattleStruct->turnSideTracker];\n                if (gWishFutureKnock.wishCounter[gActiveBattler] != 0\n                 && --gWishFutureKnock.wishCounter[gActiveBattler] == 0\n                 && gBattleMons[gActiveBattler].hp != 0)\n                {\n                    gBattlerTarget = gActiveBattler;\n                    BattleScriptExecute(BattleScript_WishComesTrue);\n                    effect++;\n                }\n                gBattleStruct->turnSideTracker++;\n                if (effect != 0)\n                    break;\n            }\n            if (effect == 0)\n            {\n                gBattleStruct->turnCountersTracker++;\n            }\n            break;\n        case ENDTURN_RAIN:\n            if (gBattleWeather & B_WEATHER_RAIN)\n            {\n                if (!(gBattleWeather & B_WEATHER_RAIN_PERMANENT))\n                {\n                    if (--gWishFutureKnock.weatherDuration == 0)\n                    {\n                        gBattleWeather &= ~B_WEATHER_RAIN_TEMPORARY;\n                        gBattleWeather &= ~B_WEATHER_RAIN_DOWNPOUR;\n                        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_STOPPED;\n                    }\n                    else if (gBattleWeather & B_WEATHER_RAIN_DOWNPOUR)\n                        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOWNPOUR_CONTINUES;\n                    else\n                        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_CONTINUES;\n                }\n                else if (gBattleWeather & B_WEATHER_RAIN_DOWNPOUR)\n                {\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOWNPOUR_CONTINUES;\n                }\n                else\n                {\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_CONTINUES;\n                }\n\n                BattleScriptExecute(BattleScript_RainContinuesOrEnds);\n                effect++;\n            }\n            gBattleStruct->turnCountersTracker++;\n            break;\n        case ENDTURN_SANDSTORM:\n            if (gBattleWeather & B_WEATHER_SANDSTORM)\n            {\n                if (!(gBattleWeather & B_WEATHER_SANDSTORM_PERMANENT) && --gWishFutureKnock.weatherDuration == 0)\n                {\n                    gBattleWeather &= ~B_WEATHER_SANDSTORM_TEMPORARY;\n                    gBattlescriptCurrInstr = BattleScript_SandStormHailEnds;\n                }\n                else\n                {\n                    gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues;\n                }\n\n                gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES;\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SANDSTORM;\n                BattleScriptExecute(gBattlescriptCurrInstr);\n                effect++;\n            }\n            gBattleStruct->turnCountersTracker++;\n            break;\n        case ENDTURN_SUN:\n            if (gBattleWeather & B_WEATHER_SUN)\n            {\n                if (!(gBattleWeather & B_WEATHER_SUN_PERMANENT) && --gWishFutureKnock.weatherDuration == 0)\n                {\n                    gBattleWeather &= ~B_WEATHER_SUN_TEMPORARY;\n                    gBattlescriptCurrInstr = BattleScript_SunlightFaded;\n                }\n                else\n                {\n                    gBattlescriptCurrInstr = BattleScript_SunlightContinues;\n                }\n\n                BattleScriptExecute(gBattlescriptCurrInstr);\n                effect++;\n            }\n            gBattleStruct->turnCountersTracker++;\n            break;\n        case ENDTURN_HAIL:\n            if (gBattleWeather & B_WEATHER_HAIL)\n            {\n                if (--gWishFutureKnock.weatherDuration == 0)\n                {\n                    gBattleWeather &= ~B_WEATHER_HAIL_TEMPORARY;\n                    gBattlescriptCurrInstr = BattleScript_SandStormHailEnds;\n                }\n                else\n                {\n                    gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues;\n                }\n\n                gBattleScripting.animArg1 = B_ANIM_HAIL_CONTINUES;\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_HAIL;\n                BattleScriptExecute(gBattlescriptCurrInstr);\n                effect++;\n            }\n            gBattleStruct->turnCountersTracker++;\n            break;\n        case ENDTURN_FIELD_COUNT:\n            effect++;\n            break;\n        }\n    } while (effect == 0);\n    return (gBattleMainFunc != BattleTurnPassed);\n}\n\nenum\n{\n    ENDTURN_INGRAIN,\n    ENDTURN_ABILITIES,\n    ENDTURN_ITEMS1,\n    ENDTURN_LEECH_SEED,\n    ENDTURN_POISON,\n    ENDTURN_BAD_POISON,\n    ENDTURN_BURN,\n    ENDTURN_NIGHTMARES,\n    ENDTURN_CURSE,\n    ENDTURN_WRAP,\n    ENDTURN_UPROAR,\n    ENDTURN_THRASH,\n    ENDTURN_DISABLE,\n    ENDTURN_ENCORE,\n    ENDTURN_LOCK_ON,\n    ENDTURN_CHARGE,\n    ENDTURN_TAUNT,\n    ENDTURN_YAWN,\n    ENDTURN_ITEMS2,\n    ENDTURN_BATTLER_COUNT\n};\n\nu8 DoBattlerEndTurnEffects(void)\n{\n    u8 effect = 0;\n\n    gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK);\n    while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT)\n    {\n        gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId];\n        if (gAbsentBattlerFlags & gBitTable[gActiveBattler])\n        {\n            gBattleStruct->turnEffectsBattlerId++;\n        }\n        else\n        {\n            switch (gBattleStruct->turnEffectsTracker)\n            {\n            case ENDTURN_INGRAIN:  // ingrain\n                if ((gStatuses3[gActiveBattler] & STATUS3_ROOTED)\n                 && gBattleMons[gActiveBattler].hp != gBattleMons[gActiveBattler].maxHP\n                 && gBattleMons[gActiveBattler].hp != 0)\n                {\n                    gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16;\n                    if (gBattleMoveDamage == 0)\n                        gBattleMoveDamage = 1;\n                    gBattleMoveDamage *= -1;\n                    BattleScriptExecute(BattleScript_IngrainTurnHeal);\n                    effect++;\n                }\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_ABILITIES:  // end turn abilities\n                if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBattler, 0, 0, 0))\n                    effect++;\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_ITEMS1:  // item effects\n                if (ItemBattleEffects(ITEMEFFECT_NORMAL, gActiveBattler, FALSE))\n                    effect++;\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_ITEMS2:  // item effects again\n                if (ItemBattleEffects(ITEMEFFECT_NORMAL, gActiveBattler, TRUE))\n                    effect++;\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_LEECH_SEED:  // leech seed\n                if ((gStatuses3[gActiveBattler] & STATUS3_LEECHSEED)\n                 && gBattleMons[gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER].hp != 0\n                 && gBattleMons[gActiveBattler].hp != 0)\n                {\n                    gBattlerTarget = gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver.\n                    gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8;\n                    if (gBattleMoveDamage == 0)\n                        gBattleMoveDamage = 1;\n                    gBattleScripting.animArg1 = gBattlerTarget;\n                    gBattleScripting.animArg2 = gBattlerAttacker;\n                    BattleScriptExecute(BattleScript_LeechSeedTurnDrain);\n                    effect++;\n                }\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_POISON:  // poison\n                if ((gBattleMons[gActiveBattler].status1 & STATUS1_POISON) && gBattleMons[gActiveBattler].hp != 0)\n                {\n                    gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8;\n                    if (gBattleMoveDamage == 0)\n                        gBattleMoveDamage = 1;\n                    BattleScriptExecute(BattleScript_PoisonTurnDmg);\n                    effect++;\n                }\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_BAD_POISON:  // toxic poison\n                if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) && gBattleMons[gActiveBattler].hp != 0)\n                {\n                    gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16;\n                    if (gBattleMoveDamage == 0)\n                        gBattleMoveDamage = 1;\n                    if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns\n                        gBattleMons[gActiveBattler].status1 += STATUS1_TOXIC_TURN(1);\n                    gBattleMoveDamage *= (gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) >> 8;\n                    BattleScriptExecute(BattleScript_PoisonTurnDmg);\n                    effect++;\n                }\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_BURN:  // burn\n                if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) && gBattleMons[gActiveBattler].hp != 0)\n                {\n                    gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8;\n                    if (gBattleMoveDamage == 0)\n                        gBattleMoveDamage = 1;\n                    BattleScriptExecute(BattleScript_BurnTurnDmg);\n                    effect++;\n                }\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_NIGHTMARES:  // spooky nightmares\n                if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBattler].hp != 0)\n                {\n                    // R/S does not perform this sleep check, which causes the nightmare effect to\n                    // persist even after the affected Pokemon has been awakened by Shed Skin.\n                    if (gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)\n                    {\n                        gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4;\n                        if (gBattleMoveDamage == 0)\n                            gBattleMoveDamage = 1;\n                        BattleScriptExecute(BattleScript_NightmareTurnDmg);\n                        effect++;\n                    }\n                    else\n                    {\n                        gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE;\n                    }\n                }\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_CURSE:  // curse\n                if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) && gBattleMons[gActiveBattler].hp != 0)\n                {\n                    gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4;\n                    if (gBattleMoveDamage == 0)\n                        gBattleMoveDamage = 1;\n                    BattleScriptExecute(BattleScript_CurseTurnDmg);\n                    effect++;\n                }\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_WRAP:  // wrap\n                if ((gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBattler].hp != 0)\n                {\n                    gBattleMons[gActiveBattler].status2 -= STATUS2_WRAPPED_TURN(1);\n                    if (gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED)  // damaged by wrap\n                    {\n                        gBattleScripting.animArg1 = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0);\n                        gBattleScripting.animArg2 = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1);\n                        gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN;\n                        gBattleTextBuff1[1] = B_BUFF_MOVE;\n                        gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0);\n                        gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1);\n                        gBattleTextBuff1[4] = EOS;\n                        gBattlescriptCurrInstr = BattleScript_WrapTurnDmg;\n                        gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16;\n                        if (gBattleMoveDamage == 0)\n                            gBattleMoveDamage = 1;\n                    }\n                    else  // broke free\n                    {\n                        gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN;\n                        gBattleTextBuff1[1] = B_BUFF_MOVE;\n                        gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0);\n                        gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1);\n                        gBattleTextBuff1[4] = EOS;\n                        gBattlescriptCurrInstr = BattleScript_WrapEnds;\n                    }\n                    BattleScriptExecute(gBattlescriptCurrInstr);\n                    effect++;\n                }\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_UPROAR:  // uproar\n                if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR)\n                {\n                    for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++)\n                    {\n                        if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)\n                         && gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF)\n                        {\n                            gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP;\n                            gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE;\n                            gBattleCommunication[MULTISTRING_CHOOSER] = 1;\n                            BattleScriptExecute(BattleScript_MonWokeUpInUproar);\n                            gActiveBattler = gBattlerAttacker;\n                            BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);\n                            MarkBattlerForControllerExec(gActiveBattler);\n                            break;\n                        }\n                    }\n                    if (gBattlerAttacker != gBattlersCount)\n                    {\n                        effect = 2;  // a pokemon was awaken\n                        break;\n                    }\n                    else\n                    {\n                        gBattlerAttacker = gActiveBattler;\n                        gBattleMons[gActiveBattler].status2 -= STATUS2_UPROAR_TURN(1);\n                        if (WasUnableToUseMove(gActiveBattler))\n                        {\n                            CancelMultiTurnMoves(gActiveBattler);\n                            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS;\n                        }\n                        else if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR)\n                        {\n                            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_CONTINUES;\n                            gBattleMons[gActiveBattler].status2 |= STATUS2_MULTIPLETURNS;\n                        }\n                        else\n                        {\n                            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS;\n                            CancelMultiTurnMoves(gActiveBattler);\n                        }\n                        BattleScriptExecute(BattleScript_PrintUproarOverTurns);\n                        effect = 1;\n                    }\n                }\n                if (effect != 2)\n                    gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_THRASH:  // thrash\n                if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE)\n                {\n                    gBattleMons[gActiveBattler].status2 -= STATUS2_LOCK_CONFUSE_TURN(1);\n                    if (WasUnableToUseMove(gActiveBattler))\n                        CancelMultiTurnMoves(gActiveBattler);\n                    else if (!(gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE)\n                     && (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS))\n                    {\n                        gBattleMons[gActiveBattler].status2 &= ~STATUS2_MULTIPLETURNS;\n                        if (!(gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION))\n                        {\n                            gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER;\n                            SetMoveEffect(TRUE, 0);\n                            if (gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)\n                                BattleScriptExecute(BattleScript_ThrashConfuses);\n                            effect++;\n                        }\n                    }\n                }\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_DISABLE:  // disable\n                if (gDisableStructs[gActiveBattler].disableTimer != 0)\n                {\n                    s32 i;\n                    for (i = 0; i < MAX_MON_MOVES; i++)\n                    {\n                        if (gDisableStructs[gActiveBattler].disabledMove == gBattleMons[gActiveBattler].moves[i])\n                            break;\n                    }\n                    if (i == MAX_MON_MOVES)  // pokemon does not have the disabled move anymore\n                    {\n                        gDisableStructs[gActiveBattler].disabledMove = MOVE_NONE;\n                        gDisableStructs[gActiveBattler].disableTimer = 0;\n                    }\n                    else if (--gDisableStructs[gActiveBattler].disableTimer == 0)  // disable ends\n                    {\n                        gDisableStructs[gActiveBattler].disabledMove = MOVE_NONE;\n                        BattleScriptExecute(BattleScript_DisabledNoMore);\n                        effect++;\n                    }\n                }\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_ENCORE:  // encore\n                if (gDisableStructs[gActiveBattler].encoreTimer != 0)\n                {\n                    if (gBattleMons[gActiveBattler].moves[gDisableStructs[gActiveBattler].encoredMovePos] != gDisableStructs[gActiveBattler].encoredMove)  // pokemon does not have the encored move anymore\n                    {\n                        gDisableStructs[gActiveBattler].encoredMove = MOVE_NONE;\n                        gDisableStructs[gActiveBattler].encoreTimer = 0;\n                    }\n                    else if (--gDisableStructs[gActiveBattler].encoreTimer == 0\n                     || gBattleMons[gActiveBattler].pp[gDisableStructs[gActiveBattler].encoredMovePos] == 0)\n                    {\n                        gDisableStructs[gActiveBattler].encoredMove = MOVE_NONE;\n                        gDisableStructs[gActiveBattler].encoreTimer = 0;\n                        BattleScriptExecute(BattleScript_EncoredNoMore);\n                        effect++;\n                    }\n                }\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_LOCK_ON:  // lock-on decrement\n                if (gStatuses3[gActiveBattler] & STATUS3_ALWAYS_HITS)\n                    gStatuses3[gActiveBattler] -= STATUS3_ALWAYS_HITS_TURN(1);\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_CHARGE:  // charge\n                if (gDisableStructs[gActiveBattler].chargeTimer && --gDisableStructs[gActiveBattler].chargeTimer == 0)\n                    gStatuses3[gActiveBattler] &= ~STATUS3_CHARGED_UP;\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_TAUNT:  // taunt\n                if (gDisableStructs[gActiveBattler].tauntTimer)\n                    gDisableStructs[gActiveBattler].tauntTimer--;\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_YAWN:  // yawn\n                if (gStatuses3[gActiveBattler] & STATUS3_YAWN)\n                {\n                    gStatuses3[gActiveBattler] -= STATUS3_YAWN_TURN(1);\n                    if (!(gStatuses3[gActiveBattler] & STATUS3_YAWN) && !(gBattleMons[gActiveBattler].status1 & STATUS1_ANY)\n                     && gBattleMons[gActiveBattler].ability != ABILITY_VITAL_SPIRIT\n                     && gBattleMons[gActiveBattler].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler))\n                    {\n                        CancelMultiTurnMoves(gActiveBattler);\n                        gBattleMons[gActiveBattler].status1 |= STATUS1_SLEEP_TURN((Random() & 3) + 2); // 2-5 turns of sleep\n                        BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);\n                        MarkBattlerForControllerExec(gActiveBattler);\n                        gEffectBattler = gActiveBattler;\n                        BattleScriptExecute(BattleScript_YawnMakesAsleep);\n                        effect++;\n                    }\n                }\n                gBattleStruct->turnEffectsTracker++;\n                break;\n            case ENDTURN_BATTLER_COUNT:  // done\n                gBattleStruct->turnEffectsTracker = 0;\n                gBattleStruct->turnEffectsBattlerId++;\n                break;\n            }\n            if (effect != 0)\n                return effect;\n        }\n    }\n    gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK);\n    return 0;\n}\n\nbool8 HandleWishPerishSongOnTurnEnd(void)\n{\n    gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK);\n\n    switch (gBattleStruct->wishPerishSongState)\n    {\n    case 0:\n        while (gBattleStruct->wishPerishSongBattlerId < gBattlersCount)\n        {\n            gActiveBattler = gBattleStruct->wishPerishSongBattlerId;\n            if (gAbsentBattlerFlags & gBitTable[gActiveBattler])\n            {\n                gBattleStruct->wishPerishSongBattlerId++;\n                continue;\n            }\n\n            gBattleStruct->wishPerishSongBattlerId++;\n            if (gWishFutureKnock.futureSightCounter[gActiveBattler] != 0\n             && --gWishFutureKnock.futureSightCounter[gActiveBattler] == 0\n             && gBattleMons[gActiveBattler].hp != 0)\n            {\n                if (gWishFutureKnock.futureSightMove[gActiveBattler] == MOVE_FUTURE_SIGHT)\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT;\n                else\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE;\n\n                PREPARE_MOVE_BUFFER(gBattleTextBuff1, gWishFutureKnock.futureSightMove[gActiveBattler]);\n\n                gBattlerTarget = gActiveBattler;\n                gBattlerAttacker = gWishFutureKnock.futureSightAttacker[gActiveBattler];\n                gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBattler];\n                gSpecialStatuses[gBattlerTarget].dmg = 0xFFFF;\n                BattleScriptExecute(BattleScript_MonTookFutureAttack);\n                return TRUE;\n            }\n        }\n        {\n            u8 *state = &gBattleStruct->wishPerishSongState;\n            *state = 1;\n            gBattleStruct->wishPerishSongBattlerId = 0;\n        }\n        // fall through\n    case 1:\n        while (gBattleStruct->wishPerishSongBattlerId < gBattlersCount)\n        {\n            gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->wishPerishSongBattlerId];\n            if (gAbsentBattlerFlags & gBitTable[gActiveBattler])\n            {\n                gBattleStruct->wishPerishSongBattlerId++;\n                continue;\n            }\n            gBattleStruct->wishPerishSongBattlerId++;\n            if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG)\n            {\n                PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gActiveBattler].perishSongTimer);\n                if (gDisableStructs[gActiveBattler].perishSongTimer == 0)\n                {\n                    gStatuses3[gActiveBattler] &= ~STATUS3_PERISH_SONG;\n                    gBattleMoveDamage = gBattleMons[gActiveBattler].hp;\n                    gBattlescriptCurrInstr = BattleScript_PerishSongTakesLife;\n                }\n                else\n                {\n                    gDisableStructs[gActiveBattler].perishSongTimer--;\n                    gBattlescriptCurrInstr = BattleScript_PerishSongCountGoesDown;\n                }\n                BattleScriptExecute(gBattlescriptCurrInstr);\n                return TRUE;\n            }\n        }\n        break;\n    }\n\n    gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK);\n\n    return FALSE;\n}\n\n#define FAINTED_ACTIONS_MAX_CASE 7\n\nbool8 HandleFaintedMonActions(void)\n{\n    if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)\n        return FALSE;\n    do\n    {\n        s32 i;\n        switch (gBattleStruct->faintedActionsState)\n        {\n        case 0:\n            gBattleStruct->faintedActionsBattlerId = 0;\n            gBattleStruct->faintedActionsState++;\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (gAbsentBattlerFlags & gBitTable[i] && !HasNoMonsToSwitch(i, PARTY_SIZE, PARTY_SIZE))\n                    gAbsentBattlerFlags &= ~(gBitTable[i]);\n            }\n            // fall through\n        case 1:\n            do\n            {\n                gBattlerFainted = gBattlerTarget = gBattleStruct->faintedActionsBattlerId;\n                if (gBattleMons[gBattleStruct->faintedActionsBattlerId].hp == 0\n                 && !(gBattleStruct->givenExpMons & gBitTable[gBattlerPartyIndexes[gBattleStruct->faintedActionsBattlerId]])\n                 && !(gAbsentBattlerFlags & gBitTable[gBattleStruct->faintedActionsBattlerId]))\n                {\n                    BattleScriptExecute(BattleScript_GiveExp);\n                    gBattleStruct->faintedActionsState = 2;\n                    return TRUE;\n                }\n            } while (++gBattleStruct->faintedActionsBattlerId != gBattlersCount);\n            gBattleStruct->faintedActionsState = 3;\n            break;\n        case 2:\n            OpponentSwitchInResetSentPokesToOpponentValue(gBattlerFainted);\n            if (++gBattleStruct->faintedActionsBattlerId == gBattlersCount)\n                gBattleStruct->faintedActionsState = 3;\n            else\n                gBattleStruct->faintedActionsState = 1;\n            break;\n        case 3:\n            gBattleStruct->faintedActionsBattlerId = 0;\n            gBattleStruct->faintedActionsState++;\n            // fall through\n        case 4:\n            do\n            {\n                gBattlerFainted = gBattlerTarget = gBattleStruct->faintedActionsBattlerId;\n                if (gBattleMons[gBattleStruct->faintedActionsBattlerId].hp == 0\n                 && !(gAbsentBattlerFlags & gBitTable[gBattleStruct->faintedActionsBattlerId]))\n                {\n                    BattleScriptExecute(BattleScript_HandleFaintedMon);\n                    gBattleStruct->faintedActionsState = 5;\n                    return TRUE;\n                }\n            } while (++gBattleStruct->faintedActionsBattlerId != gBattlersCount);\n            gBattleStruct->faintedActionsState = 6;\n            break;\n        case 5:\n            if (++gBattleStruct->faintedActionsBattlerId == gBattlersCount)\n                gBattleStruct->faintedActionsState = 6;\n            else\n                gBattleStruct->faintedActionsState = 4;\n            break;\n        case 6:\n            if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0)\n             || AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0)\n             || ItemBattleEffects(ITEMEFFECT_NORMAL, 0, TRUE)\n             || AbilityBattleEffects(ABILITYEFFECT_FORECAST, 0, 0, 0, 0))\n                return TRUE;\n            gBattleStruct->faintedActionsState++;\n            break;\n        case FAINTED_ACTIONS_MAX_CASE:\n            break;\n        }\n    } while (gBattleStruct->faintedActionsState != FAINTED_ACTIONS_MAX_CASE);\n    return FALSE;\n}\n\nvoid TryClearRageStatuses(void)\n{\n    s32 i;\n    for (i = 0; i < gBattlersCount; i++)\n    {\n        if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMoveByBattler[i] != MOVE_RAGE)\n            gBattleMons[i].status2 &= ~STATUS2_RAGE;\n    }\n}\n\nenum\n{\n    CANCELLER_FLAGS,\n    CANCELLER_ASLEEP,\n    CANCELLER_FROZEN,\n    CANCELLER_TRUANT,\n    CANCELLER_RECHARGE,\n    CANCELLER_FLINCH,\n    CANCELLER_DISABLED,\n    CANCELLER_TAUNTED,\n    CANCELLER_IMPRISONED,\n    CANCELLER_CONFUSED,\n    CANCELLER_PARALYSED,\n    CANCELLER_GHOST,\n    CANCELLER_IN_LOVE,\n    CANCELLER_BIDE,\n    CANCELLER_THAW,\n    CANCELLER_END,\n};\n\nu8 AtkCanceller_UnableToUseMove(void)\n{\n    u8 effect = 0;\n    s32 *bideDmg = &gBattleScripting.bideDmg;\n    do\n    {\n        switch (gBattleStruct->atkCancellerTracker)\n        {\n        case CANCELLER_FLAGS: // flags clear\n            gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_DESTINY_BOND;\n            gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE;\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_ASLEEP: // check being asleep\n            if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)\n            {\n                if (UproarWakeUpCheck(gBattlerAttacker))\n                {\n                    gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP;\n                    gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE;\n                    BattleScriptPushCursor();\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR;\n                    gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;\n                    effect = 2;\n                }\n                else\n                {\n                    u8 toSub;\n                    if (gBattleMons[gBattlerAttacker].ability == ABILITY_EARLY_BIRD)\n                        toSub = 2;\n                    else\n                        toSub = 1;\n                    if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) < toSub)\n                        gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP;\n                    else\n                        gBattleMons[gBattlerAttacker].status1 -= toSub;\n                    if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)\n                    {\n                        if (gCurrentMove != MOVE_SNORE && gCurrentMove != MOVE_SLEEP_TALK)\n                        {\n                            gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep;\n                            gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;\n                            effect = 2;\n                        }\n                    }\n                    else\n                    {\n                        gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE;\n                        BattleScriptPushCursor();\n                        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP;\n                        gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;\n                        effect = 2;\n                    }\n                }\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_FROZEN: // check being frozen\n            if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE)\n            {\n                if (Random() % 5)\n                {\n                    if (gBattleMoves[gCurrentMove].effect != EFFECT_THAW_HIT) // unfreezing via a move effect happens in case 13\n                    {\n                        gBattlescriptCurrInstr = BattleScript_MoveUsedIsFrozen;\n                        gHitMarker |= HITMARKER_NO_ATTACKSTRING;\n                    }\n                    else\n                    {\n                        gBattleStruct->atkCancellerTracker++;\n                        break;\n                    }\n                }\n                else // unfreeze\n                {\n                    gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED;\n                }\n                effect = 2;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_TRUANT: // truant\n            if (gBattleMons[gBattlerAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter)\n            {\n                CancelMultiTurnMoves(gBattlerAttacker);\n                gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;\n                gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LOAFING;\n                gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround;\n                gMoveResultFlags |= MOVE_RESULT_MISSED;\n                effect = 1;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_RECHARGE: // recharge\n            if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE)\n            {\n                gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RECHARGE;\n                gDisableStructs[gBattlerAttacker].rechargeTimer = 0;\n                CancelMultiTurnMoves(gBattlerAttacker);\n                gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge;\n                gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;\n                effect = 1;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_FLINCH: // flinch\n            if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED)\n            {\n                gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_FLINCHED;\n                gProtectStructs[gBattlerAttacker].flinchImmobility = 1;\n                CancelMultiTurnMoves(gBattlerAttacker);\n                gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched;\n                gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;\n                effect = 1;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_DISABLED: // disabled move\n            if (gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != MOVE_NONE)\n            {\n                gProtectStructs[gBattlerAttacker].usedDisabledMove = 1;\n                gBattleScripting.battler = gBattlerAttacker;\n                CancelMultiTurnMoves(gBattlerAttacker);\n                gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled;\n                gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;\n                effect = 1;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_TAUNTED: // taunt\n            if (gDisableStructs[gBattlerAttacker].tauntTimer && gBattleMoves[gCurrentMove].power == 0)\n            {\n                gProtectStructs[gBattlerAttacker].usedTauntedMove = 1;\n                CancelMultiTurnMoves(gBattlerAttacker);\n                gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted;\n                gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;\n                effect = 1;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_IMPRISONED: // imprisoned\n            if (GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove))\n            {\n                gProtectStructs[gBattlerAttacker].usedImprisonedMove = 1;\n                CancelMultiTurnMoves(gBattlerAttacker);\n                gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned;\n                gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;\n                effect = 1;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_CONFUSED: // confusion\n            if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION)\n            {\n                gBattleMons[gBattlerAttacker].status2 -= STATUS2_CONFUSION_TURN(1);\n                if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION)\n                {\n                    if (Random() & 1)\n                    {\n                        // The MULTISTRING_CHOOSER is used here as a bool to signal\n                        // to BattleScript_MoveUsedIsConfused whether or not damage was taken\n                        gBattleCommunication[MULTISTRING_CHOOSER] = FALSE;\n                        BattleScriptPushCursor();\n                    }\n                    else // confusion dmg\n                    {\n                        gBattleCommunication[MULTISTRING_CHOOSER] = TRUE;\n                        gBattlerTarget = gBattlerAttacker;\n                        gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerAttacker], MOVE_POUND, 0, 40, 0, gBattlerAttacker, gBattlerAttacker);\n                        gProtectStructs[gBattlerAttacker].confusionSelfDmg = 1;\n                        gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;\n                    }\n                    gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused;\n                }\n                else // snapped out of confusion\n                {\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfusedNoMore;\n                }\n                effect = 1;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_PARALYSED: // paralysis\n            if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && (Random() % 4) == 0)\n            {\n                gProtectStructs[gBattlerAttacker].prlzImmobility = 1;\n                // This is removed in FRLG and Emerald for some reason\n                //CancelMultiTurnMoves(gBattlerAttacker);\n                gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed;\n                gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;\n                effect = 1;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_GHOST: // GHOST in pokemon tower\n            if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags))\n            {\n                if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n                    gBattlescriptCurrInstr = BattleScript_TooScaredToMove;\n                else\n                    gBattlescriptCurrInstr = BattleScript_GhostGetOutGetOut;\n                gBattleCommunication[MULTISTRING_CHOOSER] = 0;\n                effect = 1;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_IN_LOVE: // infatuation\n            if (gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION)\n            {\n                gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10);\n                if (Random() & 1)\n                {\n                    BattleScriptPushCursor();\n                }\n                else\n                {\n                    BattleScriptPush(BattleScript_MoveUsedIsInLoveCantAttack);\n                    gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;\n                    gProtectStructs[gBattlerAttacker].loveImmobility = 1;\n                    CancelMultiTurnMoves(gBattlerAttacker);\n                }\n                gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove;\n                effect = 1;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_BIDE: // bide\n            if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE)\n            {\n                gBattleMons[gBattlerAttacker].status2 -= STATUS2_BIDE_TURN(1);\n                if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE)\n                {\n                    gBattlescriptCurrInstr = BattleScript_BideStoringEnergy;\n                }\n                else\n                {\n                    // This is removed in FRLG and Emerald for some reason\n                    //gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS;\n                    if (gTakenDmg[gBattlerAttacker])\n                    {\n                        gCurrentMove = MOVE_BIDE;\n                        *bideDmg = gTakenDmg[gBattlerAttacker] * 2;\n                        gBattlerTarget = gTakenDmgByBattler[gBattlerAttacker];\n                        if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])\n                            gBattlerTarget = GetMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1);\n                        gBattlescriptCurrInstr = BattleScript_BideAttack;\n                    }\n                    else\n                    {\n                        gBattlescriptCurrInstr = BattleScript_BideNoEnergyToAttack;\n                    }\n                }\n                effect = 1;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_THAW: // move thawing\n            if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE)\n            {\n                if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT)\n                {\n                    gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE;\n                }\n                effect = 2;\n            }\n            gBattleStruct->atkCancellerTracker++;\n            break;\n        case CANCELLER_END:\n            break;\n        }\n\n    } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && effect == 0);\n\n    if (effect == 2)\n    {\n        gActiveBattler = gBattlerAttacker;\n        BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);\n        MarkBattlerForControllerExec(gActiveBattler);\n    }\n    return effect;\n}\n\nbool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)\n{\n    u8 playerId, flankId;\n    struct Pokemon *party;\n    s32 i;\n\n    if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))\n        return FALSE;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n    {\n        flankId = GetBattlerMultiplayerId(battler);\n        if (GetBattlerSide(battler) == B_SIDE_PLAYER)\n            party = gPlayerParty;\n        else\n            party = gEnemyParty;\n\n        playerId = GetLinkTrainerFlankId(flankId);\n        for (i = playerId * MULTI_PARTY_SIZE; i < playerId * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE; i++)\n        {\n            if (GetMonData(&party[i], MON_DATA_HP) != 0\n             && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE\n             && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG)\n                break;\n        }\n        return (i == playerId * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE);\n    }\n    else\n    {\n        if (GetBattlerSide(battler) == B_SIDE_OPPONENT)\n        {\n            flankId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n            playerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n            party = gEnemyParty;\n        }\n        else\n        {\n            flankId = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n            playerId = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);\n            party = gPlayerParty;\n        }\n\n        if (partyIdBattlerOn1 == PARTY_SIZE)\n            partyIdBattlerOn1 = gBattlerPartyIndexes[flankId];\n        if (partyIdBattlerOn2 == PARTY_SIZE)\n            partyIdBattlerOn2 = gBattlerPartyIndexes[playerId];\n\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (GetMonData(&party[i], MON_DATA_HP) != 0\n             && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE\n             && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG\n             && i != partyIdBattlerOn1 && i != partyIdBattlerOn2\n             && i != *(gBattleStruct->monToSwitchIntoId + flankId) && i != playerId[gBattleStruct->monToSwitchIntoId])\n                break;\n        }\n        return (i == PARTY_SIZE);\n    }\n}\n\nenum\n{\n    CASTFORM_NO_CHANGE,\n    CASTFORM_TO_NORMAL,\n    CASTFORM_TO_FIRE,\n    CASTFORM_TO_WATER,\n    CASTFORM_TO_ICE,\n};\n\nu8 CastformDataTypeChange(u8 battler)\n{\n    u8 formChange = 0;\n    if (gBattleMons[battler].species != SPECIES_CASTFORM || gBattleMons[battler].ability != ABILITY_FORECAST || gBattleMons[battler].hp == 0)\n        return CASTFORM_NO_CHANGE;\n    if (!WEATHER_HAS_EFFECT && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))\n    {\n        SET_BATTLER_TYPE(battler, TYPE_NORMAL);\n        return CASTFORM_TO_NORMAL;\n    }\n    if (!WEATHER_HAS_EFFECT)\n        return CASTFORM_NO_CHANGE;\n    if (!(gBattleWeather & (B_WEATHER_RAIN | B_WEATHER_SUN | B_WEATHER_HAIL)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))\n    {\n        SET_BATTLER_TYPE(battler, TYPE_NORMAL);\n        formChange = CASTFORM_TO_NORMAL;\n    }\n    if (gBattleWeather & B_WEATHER_SUN && !IS_BATTLER_OF_TYPE(battler, TYPE_FIRE))\n    {\n        SET_BATTLER_TYPE(battler, TYPE_FIRE);\n        formChange = CASTFORM_TO_FIRE;\n    }\n    if (gBattleWeather & B_WEATHER_RAIN && !IS_BATTLER_OF_TYPE(battler, TYPE_WATER))\n    {\n        SET_BATTLER_TYPE(battler, TYPE_WATER);\n        formChange = CASTFORM_TO_WATER;\n    }\n    if (gBattleWeather & B_WEATHER_HAIL && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE))\n    {\n        SET_BATTLER_TYPE(battler, TYPE_ICE);\n        formChange = CASTFORM_TO_ICE;\n    }\n    return formChange;\n}\n\nu8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg)\n{\n    u8 effect = 0;\n    struct Pokemon *pokeAtk;\n    struct Pokemon *pokeDef;\n    u16 speciesAtk;\n    u16 speciesDef;\n    u32 pidAtk;\n    u32 pidDef;\n\n    if (gBattlerAttacker >= gBattlersCount)\n        gBattlerAttacker = battler;\n\n    if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n        pokeAtk = &gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]];\n    else\n        pokeAtk = &gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]];\n\n    if (gBattlerTarget >= gBattlersCount)\n        gBattlerTarget = battler;\n\n    if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)\n        pokeDef = &gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]];\n    else\n        pokeDef = &gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]];\n\n    speciesAtk = GetMonData(pokeAtk, MON_DATA_SPECIES);\n    pidAtk = GetMonData(pokeAtk, MON_DATA_PERSONALITY);\n\n    speciesDef = GetMonData(pokeDef, MON_DATA_SPECIES);\n    pidDef = GetMonData(pokeDef, MON_DATA_PERSONALITY);\n\n    if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // Why isn't that check done at the beginning?\n    {\n        u8 moveType;\n        s32 i;\n        u16 move;\n        u8 side;\n        u8 target1;\n\n        if (special)\n            gLastUsedAbility = special;\n        else\n            gLastUsedAbility = gBattleMons[battler].ability;\n\n        if (moveArg)\n            move = moveArg;\n        else\n            move = gCurrentMove;\n\n        GET_MOVE_TYPE(move, moveType);\n\n        if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags)\n         && (gLastUsedAbility == ABILITY_INTIMIDATE || gLastUsedAbility == ABILITY_TRACE))\n            return effect;\n\n        switch (caseID)\n        {\n        case ABILITYEFFECT_ON_SWITCHIN: // 0\n            if (gBattlerAttacker >= gBattlersCount)\n                gBattlerAttacker = battler;\n            switch (gLastUsedAbility)\n            {\n            case ABILITYEFFECT_SWITCH_IN_WEATHER:\n                switch (GetCurrentWeather())\n                {\n                case WEATHER_RAIN:\n                case WEATHER_RAIN_THUNDERSTORM:\n                case WEATHER_DOWNPOUR:\n                    if (!(gBattleWeather & B_WEATHER_RAIN))\n                    {\n                        gBattleWeather = (B_WEATHER_RAIN_TEMPORARY | B_WEATHER_RAIN_PERMANENT);\n                        gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES;\n                        gBattleScripting.battler = battler;\n                        effect++;\n                    }\n                    break;\n                case WEATHER_SANDSTORM:\n                    if (!(gBattleWeather & B_WEATHER_SANDSTORM))\n                    {\n                        gBattleWeather = B_WEATHER_SANDSTORM;\n                        gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES;\n                        gBattleScripting.battler = battler;\n                        effect++;\n                    }\n                    break;\n                case WEATHER_DROUGHT:\n                    if (!(gBattleWeather & B_WEATHER_SUN))\n                    {\n                        gBattleWeather = B_WEATHER_SUN;\n                        gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES;\n                        gBattleScripting.battler = battler;\n                        effect++;\n                    }\n                    break;\n                }\n                if (effect != 0)\n                {\n                    gBattleCommunication[MULTISTRING_CHOOSER] = GetCurrentWeather();\n                    BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts);\n                }\n                break;\n            case ABILITY_DRIZZLE:\n                if (!(gBattleWeather & B_WEATHER_RAIN_PERMANENT))\n                {\n                    gBattleWeather = (B_WEATHER_RAIN_PERMANENT | B_WEATHER_RAIN_TEMPORARY);\n                    BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates);\n                    gBattleScripting.battler = battler;\n                    effect++;\n                }\n                break;\n            case ABILITY_SAND_STREAM:\n                if (!(gBattleWeather & B_WEATHER_SANDSTORM_PERMANENT))\n                {\n                    gBattleWeather = B_WEATHER_SANDSTORM;\n                    BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates);\n                    gBattleScripting.battler = battler;\n                    effect++;\n                }\n                break;\n            case ABILITY_DROUGHT:\n                if (!(gBattleWeather & B_WEATHER_SUN_PERMANENT))\n                {\n                    gBattleWeather = B_WEATHER_SUN;\n                    BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates);\n                    gBattleScripting.battler = battler;\n                    effect++;\n                }\n                break;\n            case ABILITY_INTIMIDATE:\n                if (!(gSpecialStatuses[battler].intimidatedMon))\n                {\n                    gStatuses3[battler] |= STATUS3_INTIMIDATE_POKES;\n                    gSpecialStatuses[battler].intimidatedMon = 1;\n                }\n                break;\n            case ABILITY_FORECAST:\n                effect = CastformDataTypeChange(battler);\n                if (effect != 0)\n                {\n                    BattleScriptPushCursorAndCallback(BattleScript_CastformChange);\n                    gBattleScripting.battler = battler;\n                    *(&gBattleStruct->formToChangeInto) = effect - 1;\n                }\n                break;\n            case ABILITY_TRACE:\n                if (!(gSpecialStatuses[battler].traced))\n                {\n                    gStatuses3[battler] |= STATUS3_TRACE;\n                    gSpecialStatuses[battler].traced = 1;\n                }\n                break;\n            case ABILITY_CLOUD_NINE:\n            case ABILITY_AIR_LOCK:\n                {\n                    for (target1 = 0; target1 < gBattlersCount; target1++)\n                    {\n                        effect = CastformDataTypeChange(target1);\n                        if (effect != 0)\n                        {\n                            BattleScriptPushCursorAndCallback(BattleScript_CastformChange);\n                            gBattleScripting.battler = target1;\n                            *(&gBattleStruct->formToChangeInto) = effect - 1;\n                            break;\n                        }\n                    }\n                }\n                break;\n            }\n            break;\n        case ABILITYEFFECT_ENDTURN: // 1\n            if (gBattleMons[battler].hp != 0)\n            {\n                gBattlerAttacker = battler;\n                switch (gLastUsedAbility)\n                {\n                case ABILITY_RAIN_DISH:\n                    if (WEATHER_HAS_EFFECT && (gBattleWeather & B_WEATHER_RAIN)\n                     && gBattleMons[battler].maxHP > gBattleMons[battler].hp)\n                    {\n                        gLastUsedAbility = ABILITY_RAIN_DISH; // why\n                        BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates);\n                        gBattleMoveDamage = gBattleMons[battler].maxHP / 16;\n                        if (gBattleMoveDamage == 0)\n                            gBattleMoveDamage = 1;\n                        gBattleMoveDamage *= -1;\n                        effect++;\n                    }\n                    break;\n                case ABILITY_SHED_SKIN:\n                    if ((gBattleMons[battler].status1 & STATUS1_ANY) && (Random() % 3) == 0)\n                    {\n                        if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON))\n                            StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);\n                        if (gBattleMons[battler].status1 & STATUS1_SLEEP)\n                            StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);\n                        if (gBattleMons[battler].status1 & STATUS1_PARALYSIS)\n                            StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);\n                        if (gBattleMons[battler].status1 & STATUS1_BURN)\n                            StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);\n                        if (gBattleMons[battler].status1 & STATUS1_FREEZE)\n                            StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);\n                        gBattleMons[battler].status1 = 0;\n                        gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE;  // fix nightmare glitch\n                        gBattleScripting.battler = gActiveBattler = battler;\n                        BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates);\n                        BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1);\n                        MarkBattlerForControllerExec(gActiveBattler);\n                        effect++;\n                    }\n                    break;\n                case ABILITY_SPEED_BOOST:\n                    if (gBattleMons[battler].statStages[STAT_SPEED] < MAX_STAT_STAGE && gDisableStructs[battler].isFirstTurn != 2)\n                    {\n                        gBattleMons[battler].statStages[STAT_SPEED]++;\n                        gBattleScripting.animArg1 = 14 + STAT_SPEED;\n                        gBattleScripting.animArg2 = 0;\n                        BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates);\n                        gBattleScripting.battler = battler;\n                        effect++;\n                    }\n                    break;\n                case ABILITY_TRUANT:\n                    gDisableStructs[gBattlerAttacker].truantCounter ^= 1;\n                    break;\n                }\n            }\n            break;\n        case ABILITYEFFECT_MOVES_BLOCK: // 2\n            if (gLastUsedAbility == ABILITY_SOUNDPROOF)\n            {\n                for (i = 0; sSoundMovesTable[i] != SOUND_MOVES_END; i++)\n                {\n                    if (sSoundMovesTable[i] == move)\n                        break;\n                }\n                if (sSoundMovesTable[i] != SOUND_MOVES_END)\n                {\n                    if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)\n                        gHitMarker |= HITMARKER_NO_PPDEDUCT;\n                    gBattlescriptCurrInstr = BattleScript_SoundproofProtected;\n                    effect = 1;\n                }\n            }\n            break;\n        case ABILITYEFFECT_ABSORBING: // 3\n            if (move)\n            {\n                switch (gLastUsedAbility)\n                {\n                case ABILITY_VOLT_ABSORB:\n                    if (moveType == TYPE_ELECTRIC && gBattleMoves[move].power != 0)\n                    {\n                        if (gProtectStructs[gBattlerAttacker].notFirstStrike)\n                            gBattlescriptCurrInstr = BattleScript_MoveHPDrain;\n                        else\n                            gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss;\n\n                        effect = 1;\n                    }\n                    break;\n                case ABILITY_WATER_ABSORB:\n                    if (moveType == TYPE_WATER && gBattleMoves[move].power != 0)\n                    {\n                        if (gProtectStructs[gBattlerAttacker].notFirstStrike)\n                            gBattlescriptCurrInstr = BattleScript_MoveHPDrain;\n                        else\n                            gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss;\n\n                        effect = 1;\n                    }\n                    break;\n                case ABILITY_FLASH_FIRE:\n                    if (moveType == TYPE_FIRE && !(gBattleMons[battler].status1 & STATUS1_FREEZE))\n                    {\n                        if (!(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_FLASH_FIRE))\n                        {\n                            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST;\n                            if (gProtectStructs[gBattlerAttacker].notFirstStrike)\n                                gBattlescriptCurrInstr = BattleScript_FlashFireBoost;\n                            else\n                                gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss;\n\n                            gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_FLASH_FIRE;\n                            effect = 2;\n                        }\n                        else\n                        {\n                            gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_NO_BOOST;\n                            if (gProtectStructs[gBattlerAttacker].notFirstStrike)\n                                gBattlescriptCurrInstr = BattleScript_FlashFireBoost;\n                            else\n                                gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss;\n\n                            effect = 2;\n                        }\n                    }\n                    break;\n                }\n                if (effect == 1)\n                {\n                    if (gBattleMons[battler].maxHP == gBattleMons[battler].hp)\n                    {\n                        if ((gProtectStructs[gBattlerAttacker].notFirstStrike))\n                            gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless;\n                        else\n                            gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless_PPLoss;\n                    }\n                    else\n                    {\n                        gBattleMoveDamage = gBattleMons[battler].maxHP / 4;\n                        if (gBattleMoveDamage == 0)\n                            gBattleMoveDamage = 1;\n                        gBattleMoveDamage *= -1;\n                    }\n                }\n            }\n            break;\n        case ABILITYEFFECT_ON_DAMAGE: // Think contact abilities.\n            switch (gLastUsedAbility)\n            {\n            case ABILITY_COLOR_CHANGE:\n                if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n                 && move != MOVE_STRUGGLE\n                 && gBattleMoves[move].power != 0\n                 && TARGET_TURN_DAMAGED\n                 && !IS_BATTLER_OF_TYPE(battler, moveType)\n                 && gBattleMons[battler].hp != 0)\n                {\n                    SET_BATTLER_TYPE(battler, moveType);\n                    PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType);\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_ColorChangeActivates;\n                    effect++;\n                }\n                break;\n            case ABILITY_ROUGH_SKIN:\n                if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n                 && gBattleMons[gBattlerAttacker].hp != 0\n                 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg\n                 && TARGET_TURN_DAMAGED\n                 && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT))\n                {\n                    gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16;\n                    if (gBattleMoveDamage == 0)\n                        gBattleMoveDamage = 1;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_RoughSkinActivates;\n                    effect++;\n                }\n                break;\n            case ABILITY_EFFECT_SPORE:\n                if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n                 && gBattleMons[gBattlerAttacker].hp != 0\n                 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg\n                 && TARGET_TURN_DAMAGED\n                 && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)\n                 && (Random() % 10) == 0)\n                {\n                    do\n                    {\n                        gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3;\n                    } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0);\n\n                    if (gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_BURN)\n                        gBattleCommunication[MOVE_EFFECT_BYTE] += 2; // 5 MOVE_EFFECT_PARALYSIS\n\n                    gBattleCommunication[MOVE_EFFECT_BYTE] += MOVE_EFFECT_AFFECTS_USER;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;\n                    gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT;\n                    effect++;\n                }\n                break;\n            case ABILITY_POISON_POINT:\n                if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n                 && gBattleMons[gBattlerAttacker].hp != 0\n                 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg\n                 && TARGET_TURN_DAMAGED\n                 && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)\n                 && (Random() % 3) == 0)\n                {\n                    gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;\n                    gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT;\n                    effect++;\n                }\n                break;\n            case ABILITY_STATIC:\n                if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n                 && gBattleMons[gBattlerAttacker].hp != 0\n                 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg\n                 && TARGET_TURN_DAMAGED\n                 && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)\n                 && (Random() % 3) == 0)\n                {\n                    gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;\n                    gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT;\n                    effect++;\n                }\n                break;\n            case ABILITY_FLAME_BODY:\n                if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n                 && gBattleMons[gBattlerAttacker].hp != 0\n                 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg\n                 && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)\n                 && TARGET_TURN_DAMAGED\n                 && (Random() % 3) == 0)\n                {\n                    gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;\n                    gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT;\n                    effect++;\n                }\n                break;\n            case ABILITY_CUTE_CHARM:\n                if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n                 && gBattleMons[gBattlerAttacker].hp != 0\n                 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg\n                 && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)\n                 && TARGET_TURN_DAMAGED\n                 && gBattleMons[gBattlerTarget].hp != 0\n                 && (Random() % 3) == 0\n                 && gBattleMons[gBattlerAttacker].ability != ABILITY_OBLIVIOUS\n                 && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef)\n                 && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION)\n                 && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != MON_GENDERLESS\n                 && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != MON_GENDERLESS)\n                {\n                    gBattleMons[gBattlerAttacker].status2 |= STATUS2_INFATUATED_WITH(gBattlerTarget);\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_CuteCharmActivates;\n                    effect++;\n                }\n                break;\n            }\n            break;\n        case ABILITYEFFECT_IMMUNITY: // 5\n            for (battler = 0; battler < gBattlersCount; battler++)\n            {\n                switch (gBattleMons[battler].ability)\n                {\n                case ABILITY_IMMUNITY:\n                    if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON | STATUS1_TOXIC_COUNTER))\n                    {\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);\n                        effect = 1;\n                    }\n                    break;\n                case ABILITY_OWN_TEMPO:\n                    if (gBattleMons[battler].status2 & STATUS2_CONFUSION)\n                    {\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);\n                        effect = 2;\n                    }\n                    break;\n                case ABILITY_LIMBER:\n                    if (gBattleMons[battler].status1 & STATUS1_PARALYSIS)\n                    {\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);\n                        effect = 1;\n                    }\n                    break;\n                case ABILITY_INSOMNIA:\n                case ABILITY_VITAL_SPIRIT:\n                    if (gBattleMons[battler].status1 & STATUS1_SLEEP)\n                    {\n                        gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE;\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);\n                        effect = 1;\n                    }\n                    break;\n                case ABILITY_WATER_VEIL:\n                    if (gBattleMons[battler].status1 & STATUS1_BURN)\n                    {\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);\n                        effect = 1;\n                    }\n                    break;\n                case ABILITY_MAGMA_ARMOR:\n                    if (gBattleMons[battler].status1 & STATUS1_FREEZE)\n                    {\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);\n                        effect = 1;\n                    }\n                    break;\n                case ABILITY_OBLIVIOUS:\n                    if (gBattleMons[battler].status2 & STATUS2_INFATUATION)\n                    {\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);\n                        effect = 3;\n                    }\n                    break;\n                }\n                if (effect != 0)\n                {\n                    switch (effect)\n                    {\n                    case 1: // status cleared\n                        gBattleMons[battler].status1 = 0;\n                        break;\n                    case 2: // get rid of confusion\n                        gBattleMons[battler].status2 &= ~STATUS2_CONFUSION;\n                        break;\n                    case 3: // get rid of infatuation\n                        gBattleMons[battler].status2 &= ~STATUS2_INFATUATION;\n                        break;\n                    }\n\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus;\n                    gBattleScripting.battler = battler;\n                    gActiveBattler = battler;\n                    BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                    return effect;\n                }\n            }\n            break;\n        case ABILITYEFFECT_FORECAST: // 6\n            for (battler = 0; battler < gBattlersCount; battler++)\n            {\n                if (gBattleMons[battler].ability == ABILITY_FORECAST)\n                {\n                    effect = CastformDataTypeChange(battler);\n                    if (effect != 0)\n                    {\n                        BattleScriptPushCursorAndCallback(BattleScript_CastformChange);\n                        gBattleScripting.battler = battler;\n                        *(&gBattleStruct->formToChangeInto) = effect - 1;\n                        return effect;\n                    }\n                }\n            }\n            break;\n        case ABILITYEFFECT_SYNCHRONIZE: // 7\n            if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT))\n            {\n                gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT;\n                gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN);\n                if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC)\n                    gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON;\n\n                gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER;\n                gBattleScripting.battler = gBattlerTarget;\n                BattleScriptPushCursor();\n                gBattlescriptCurrInstr = BattleScript_SynchronizeActivates;\n                gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT;\n                effect++;\n            }\n            break;\n        case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8\n            if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT))\n            {\n                gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT;\n                gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN);\n                if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC)\n                    gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON;\n\n                gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect;\n                gBattleScripting.battler = gBattlerAttacker;\n                BattleScriptPushCursor();\n                gBattlescriptCurrInstr = BattleScript_SynchronizeActivates;\n                gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT;\n                effect++;\n            }\n            break;\n        case ABILITYEFFECT_INTIMIDATE1: // 9\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES)\n                {\n                    gLastUsedAbility = ABILITY_INTIMIDATE;\n                    gStatuses3[i] &= ~STATUS3_INTIMIDATE_POKES;\n                    BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3);\n                    gBattleStruct->intimidateBattler = i;\n                    effect++;\n                    break;\n                }\n            }\n            break;\n        case ABILITYEFFECT_TRACE: // 11\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE))\n                {\n                    u8 target2;\n                    side = (GetBattlerPosition(i) ^ BIT_SIDE) & BIT_SIDE; // side of the opposing pokemon\n                    target1 = GetBattlerAtPosition(side);\n                    target2 = GetBattlerAtPosition(side + BIT_FLANK);\n                    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n                    {\n                        if (gBattleMons[target1].ability != ABILITY_NONE && gBattleMons[target1].hp != 0\n                         && gBattleMons[target2].ability != ABILITY_NONE && gBattleMons[target2].hp != 0)\n                        {\n                            gActiveBattler = GetBattlerAtPosition(((Random() & 1) * 2) | side);\n                            gBattleMons[i].ability = gBattleMons[gActiveBattler].ability;\n                            gLastUsedAbility = gBattleMons[gActiveBattler].ability;\n                            effect++;\n                        }\n                        else if (gBattleMons[target1].ability != ABILITY_NONE && gBattleMons[target1].hp != 0)\n                        {\n                            gActiveBattler = target1;\n                            gBattleMons[i].ability = gBattleMons[gActiveBattler].ability;\n                            gLastUsedAbility = gBattleMons[gActiveBattler].ability;\n                            effect++;\n                        }\n                        else if (gBattleMons[target2].ability != ABILITY_NONE && gBattleMons[target2].hp != 0)\n                        {\n                            gActiveBattler = target2;\n                            gBattleMons[i].ability = gBattleMons[gActiveBattler].ability;\n                            gLastUsedAbility = gBattleMons[gActiveBattler].ability;\n                            effect++;\n                        }\n                    }\n                    else\n                    {\n                        gActiveBattler = target1;\n                        if (gBattleMons[target1].ability && gBattleMons[target1].hp)\n                        {\n                            gBattleMons[i].ability = gBattleMons[target1].ability;\n                            gLastUsedAbility = gBattleMons[target1].ability;\n                            effect++;\n                        }\n                    }\n                    if (effect != 0)\n                    {\n                        BattleScriptPushCursorAndCallback(BattleScript_TraceActivates);\n                        gStatuses3[i] &= ~STATUS3_TRACE;\n                        gBattleScripting.battler = i;\n\n                        PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler])\n                        PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility)\n                        break;\n                    }\n                }\n            }\n            break;\n        case ABILITYEFFECT_INTIMIDATE2: // 10\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES))\n                {\n                    gLastUsedAbility = ABILITY_INTIMIDATE;\n                    gStatuses3[i] &= ~STATUS3_INTIMIDATE_POKES;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_IntimidateActivates;\n                    gBattleStruct->intimidateBattler = i;\n                    effect++;\n                    break;\n                }\n            }\n            break;\n        case ABILITYEFFECT_CHECK_OTHER_SIDE: // 12\n            side = GetBattlerSide(battler);\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability)\n                {\n                    gLastUsedAbility = ability;\n                    effect = i + 1;\n                }\n            }\n            break;\n        case ABILITYEFFECT_CHECK_BATTLER_SIDE: // 13\n            side = GetBattlerSide(battler);\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (GetBattlerSide(i) == side && gBattleMons[i].ability == ability)\n                {\n                    gLastUsedAbility = ability;\n                    effect = i + 1;\n                }\n            }\n            break;\n        case ABILITYEFFECT_FIELD_SPORT: // 14\n            switch (gLastUsedAbility)\n            {\n            case ABILITYEFFECT_MUD_SPORT:\n                for (i = 0; i < gBattlersCount; i++)\n                {\n                    if (gStatuses3[i] & STATUS3_MUDSPORT)\n                        effect = i + 1;\n                }\n                break;\n            case ABILITYEFFECT_WATER_SPORT:\n                for (i = 0; i < gBattlersCount; i++)\n                {\n                    if (gStatuses3[i] & STATUS3_WATERSPORT)\n                        effect = i + 1;\n                }\n                break;\n            default:\n                for (i = 0; i < gBattlersCount; i++)\n                {\n                    if (gBattleMons[i].ability == ability)\n                    {\n                        gLastUsedAbility = ability;\n                        effect = i + 1;\n                    }\n                }\n                break;\n            }\n            break;\n        case ABILITYEFFECT_CHECK_ON_FIELD: // 19\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (gBattleMons[i].ability == ability && gBattleMons[i].hp != 0)\n                {\n                    gLastUsedAbility = ability;\n                    effect = i + 1;\n                }\n            }\n            break;\n        case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER: // 15\n            side = GetBattlerSide(battler);\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability)\n                {\n                    gLastUsedAbility = ability;\n                    effect = i + 1;\n                    break;\n                }\n            }\n            if (effect == 0)\n            {\n                for (i = 0; i < gBattlersCount; i++)\n                {\n                    if (gBattleMons[i].ability == ability && GetBattlerSide(i) == side && i != battler)\n                    {\n                        gLastUsedAbility = ability;\n                        effect = i + 1;\n                    }\n                }\n            }\n            break;\n        case ABILITYEFFECT_COUNT_OTHER_SIDE: // 16\n            side = GetBattlerSide(battler);\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability)\n                {\n                    gLastUsedAbility = ability;\n                    effect++;\n                }\n            }\n            break;\n        case ABILITYEFFECT_COUNT_BATTLER_SIDE: // 17\n            side = GetBattlerSide(battler);\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (GetBattlerSide(i) == side && gBattleMons[i].ability == ability)\n                {\n                    gLastUsedAbility = ability;\n                    effect++;\n                }\n            }\n            break;\n        case ABILITYEFFECT_COUNT_ON_FIELD: // 18\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (gBattleMons[i].ability == ability && i != battler)\n                {\n                    gLastUsedAbility = ability;\n                    effect++;\n                }\n            }\n            break;\n        }\n\n        if (effect && caseID < ABILITYEFFECT_CHECK_OTHER_SIDE && gLastUsedAbility != 0xFF)\n            RecordAbilityBattle(battler, gLastUsedAbility);\n    }\n\n    return effect;\n}\n\nvoid BattleScriptExecute(const u8 *BS_ptr)\n{\n    gBattlescriptCurrInstr = BS_ptr;\n    gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size++] = gBattleMainFunc;\n    gBattleMainFunc = RunBattleScriptCommands_PopCallbacksStack;\n    gCurrentActionFuncId = 0;\n}\n\nvoid BattleScriptPushCursorAndCallback(const u8 *BS_ptr)\n{\n    BattleScriptPushCursor();\n    gBattlescriptCurrInstr = BS_ptr;\n    gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size++] = gBattleMainFunc;\n    gBattleMainFunc = RunBattleScriptCommands;\n}\n\nenum\n{\n    ITEM_NO_EFFECT,\n    ITEM_STATUS_CHANGE,\n    ITEM_EFFECT_OTHER,\n    ITEM_PP_CHANGE,\n    ITEM_HP_CHANGE,\n    ITEM_STATS_CHANGE,\n};\n\n#define TRY_EAT_CONFUSE_BERRY(flavor)                                                       \\\n    if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)         \\\n    {                                                                                       \\\n        PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavor);                                    \\\n        gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;          \\\n        if (gBattleMoveDamage == 0)                                                         \\\n            gBattleMoveDamage = 1;                                                          \\\n        if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)   \\\n            gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;   \\\n        gBattleMoveDamage *= -1;                                                            \\\n        if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, flavor) < 0) \\\n            BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);                         \\\n        else                                                                                \\\n            BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);                        \\\n        effect = ITEM_HP_CHANGE;                                                            \\\n    }\n\n#define TRY_EAT_STAT_UP_BERRY(stat)                                                         \\\n    if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam  \\\n    && !moveTurn && gBattleMons[battlerId].statStages[stat] < MAX_STAT_STAGE)               \\\n    {                                                                                       \\\n        PREPARE_STAT_BUFFER(gBattleTextBuff1, stat);                                        \\\n        gEffectBattler = battlerId;                                                         \\\n        SET_STATCHANGER(stat, 1, FALSE);                                                    \\\n        gBattleScripting.animArg1 = 14 + (stat);                                            \\\n        gBattleScripting.animArg2 = 0;                                                      \\\n        BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);                               \\\n        effect = ITEM_STATS_CHANGE;                                                         \\\n    }\n\nu8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)\n{\n    int i = 0;\n    u8 effect = ITEM_NO_EFFECT;\n    u8 changedPP = 0;\n    u8 battlerHoldEffect, atkHoldEffect, defHoldEffect;\n    u8 battlerHoldEffectParam, atkHoldEffectParam, defHoldEffectParam;\n    u16 atkItem, defItem;\n\n    gLastUsedItem = gBattleMons[battlerId].item;\n    if (gLastUsedItem == ITEM_ENIGMA_BERRY)\n    {\n        battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect;\n        battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam;\n    }\n    else\n    {\n        battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem);\n        battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem);\n    }\n\n    atkItem = gBattleMons[gBattlerAttacker].item;\n    if (atkItem == ITEM_ENIGMA_BERRY)\n    {\n        atkHoldEffect = gEnigmaBerries[gBattlerAttacker].holdEffect;\n        atkHoldEffectParam = gEnigmaBerries[gBattlerAttacker].holdEffectParam;\n    }\n    else\n    {\n        atkHoldEffect = ItemId_GetHoldEffect(atkItem);\n        atkHoldEffectParam = ItemId_GetHoldEffectParam(atkItem);\n    }\n\n    // def variables are unused\n    defItem = gBattleMons[gBattlerTarget].item;\n    if (defItem == ITEM_ENIGMA_BERRY)\n    {\n        defHoldEffect = gEnigmaBerries[gBattlerTarget].holdEffect;\n        defHoldEffectParam = gEnigmaBerries[gBattlerTarget].holdEffectParam;\n    }\n    else\n    {\n        defHoldEffect = ItemId_GetHoldEffect(defItem);\n        defHoldEffectParam = ItemId_GetHoldEffectParam(defItem);\n    }\n\n    switch (caseID)\n    {\n    case ITEMEFFECT_ON_SWITCH_IN:\n        switch (battlerHoldEffect)\n        {\n        case HOLD_EFFECT_DOUBLE_PRIZE:\n            gBattleStruct->moneyMultiplier = 2;\n            break;\n        case HOLD_EFFECT_RESTORE_STATS:\n            for (i = 0; i < NUM_BATTLE_STATS; i++)\n            {\n                if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE)\n                {\n                    gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE;\n                    effect = ITEM_STATS_CHANGE;\n                }\n            }\n            if (effect != 0)\n            {\n                gBattleScripting.battler = battlerId;\n                gPotentialItemEffectBattler = battlerId;\n                gActiveBattler = gBattlerAttacker = battlerId;\n                BattleScriptExecute(BattleScript_WhiteHerbEnd2);\n            }\n            break;\n        }\n        break;\n    case ITEMEFFECT_NORMAL:\n        if (gBattleMons[battlerId].hp)\n        {\n            switch (battlerHoldEffect)\n            {\n            case HOLD_EFFECT_RESTORE_HP:\n                if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)\n                {\n                    gBattleMoveDamage = battlerHoldEffectParam;\n                    if (gBattleMons[battlerId].hp + battlerHoldEffectParam > gBattleMons[battlerId].maxHP)\n                        gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;\n                    gBattleMoveDamage *= -1;\n                    BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);\n                    effect = ITEM_HP_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_RESTORE_PP:\n                if (!moveTurn)\n                {\n                    struct Pokemon *mon;\n                    u8 ppBonuses;\n                    u16 move;\n\n                    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n                        mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]];\n                    else\n                        mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]];\n                    for (i = 0; i < MAX_MON_MOVES; i++)\n                    {\n                        move = GetMonData(mon, MON_DATA_MOVE1 + i);\n                        changedPP = GetMonData(mon, MON_DATA_PP1 + i);\n                        ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);\n                        if (move && changedPP == 0)\n                            break;\n                    }\n                    if (i != MAX_MON_MOVES)\n                    {\n                        u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i);\n                        if (changedPP + battlerHoldEffectParam > maxPP)\n                            changedPP = maxPP;\n                        else\n                            changedPP = changedPP + battlerHoldEffectParam;\n\n                        PREPARE_MOVE_BUFFER(gBattleTextBuff1, move);\n\n                        BattleScriptExecute(BattleScript_BerryPPHealEnd2);\n                        BtlController_EmitSetMonData(BUFFER_A, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP);\n                        MarkBattlerForControllerExec(gActiveBattler);\n                        effect = ITEM_PP_CHANGE;\n                    }\n                }\n                break;\n            case HOLD_EFFECT_RESTORE_STATS:\n                for (i = 0; i < NUM_BATTLE_STATS; i++)\n                {\n                    if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE)\n                    {\n                        gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE;\n                        effect = ITEM_STATS_CHANGE;\n                    }\n                }\n                if (effect != 0)\n                {\n                    gBattleScripting.battler = battlerId;\n                    gPotentialItemEffectBattler = battlerId;\n                    gActiveBattler = gBattlerAttacker = battlerId;\n                    BattleScriptExecute(BattleScript_WhiteHerbEnd2);\n                }\n                break;\n            case HOLD_EFFECT_LEFTOVERS:\n                if (gBattleMons[battlerId].hp < gBattleMons[battlerId].maxHP && !moveTurn)\n                {\n                    gBattleMoveDamage = gBattleMons[battlerId].maxHP / 16;\n                    if (gBattleMoveDamage == 0)\n                        gBattleMoveDamage = 1;\n                    if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)\n                        gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;\n                    gBattleMoveDamage *= -1;\n                    BattleScriptExecute(BattleScript_ItemHealHP_End2);\n                    effect = ITEM_HP_CHANGE;\n                    RecordItemEffectBattle(battlerId, battlerHoldEffect);\n                }\n                break;\n            case HOLD_EFFECT_CONFUSE_SPICY:\n                TRY_EAT_CONFUSE_BERRY(FLAVOR_SPICY);\n                break;\n            case HOLD_EFFECT_CONFUSE_DRY:\n                TRY_EAT_CONFUSE_BERRY(FLAVOR_DRY);\n                break;\n            case HOLD_EFFECT_CONFUSE_SWEET:\n                TRY_EAT_CONFUSE_BERRY(FLAVOR_SWEET);\n                break;\n            case HOLD_EFFECT_CONFUSE_BITTER:\n                TRY_EAT_CONFUSE_BERRY(FLAVOR_BITTER);\n                break;\n            case HOLD_EFFECT_CONFUSE_SOUR:\n                TRY_EAT_CONFUSE_BERRY(FLAVOR_SOUR);\n                break;\n            case HOLD_EFFECT_ATTACK_UP:\n                if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam\n                && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < MAX_STAT_STAGE)\n                {\n                    PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK);\n                    PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); // Only the Attack stat-up berry has this\n                    gEffectBattler = battlerId;\n                    SET_STATCHANGER(STAT_ATK, 1, FALSE);\n                    gBattleScripting.animArg1 = 14 + STAT_ATK;\n                    gBattleScripting.animArg2 = 0;\n                    BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);\n                    effect = ITEM_STATS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_DEFENSE_UP:\n                TRY_EAT_STAT_UP_BERRY(STAT_DEF);\n                break;\n            case HOLD_EFFECT_SPEED_UP:\n                TRY_EAT_STAT_UP_BERRY(STAT_SPEED);\n                break;\n            case HOLD_EFFECT_SP_ATTACK_UP:\n                TRY_EAT_STAT_UP_BERRY(STAT_SPATK);\n                break;\n            case HOLD_EFFECT_SP_DEFENSE_UP:\n                TRY_EAT_STAT_UP_BERRY(STAT_SPDEF);\n                break;\n            case HOLD_EFFECT_CRITICAL_UP:\n                if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn\n                    && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY))\n                {\n                    gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY;\n                    BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2);\n                    effect = ITEM_EFFECT_OTHER;\n                }\n                break;\n            case HOLD_EFFECT_RANDOM_STAT_UP:\n                if (!moveTurn && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam)\n                {\n                    for (i = 0; i < NUM_STATS - 1; i++)\n                    {\n                        if (gBattleMons[battlerId].statStages[STAT_ATK + i] < MAX_STAT_STAGE)\n                            break;\n                    }\n                    if (i != NUM_STATS - 1)\n                    {\n                        do\n                        {\n                            i = Random() % (NUM_STATS - 1);\n                        } while (gBattleMons[battlerId].statStages[STAT_ATK + i] == MAX_STAT_STAGE);\n\n                        PREPARE_STAT_BUFFER(gBattleTextBuff1, i + 1);\n\n                        gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN;\n                        gBattleTextBuff2[1] = B_BUFF_STRING;\n                        gBattleTextBuff2[2] = STRINGID_STATSHARPLY;\n                        gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8;\n                        gBattleTextBuff2[4] = B_BUFF_STRING;\n                        gBattleTextBuff2[5] = STRINGID_STATROSE;\n                        gBattleTextBuff2[6] = STRINGID_STATROSE >> 8;\n                        gBattleTextBuff2[7] = EOS;\n\n                        gEffectBattler = battlerId;\n                        SET_STATCHANGER(i + 1, 2, FALSE);\n                        gBattleScripting.animArg1 = 0x21 + i + 6;\n                        gBattleScripting.animArg2 = 0;\n                        BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);\n                        effect = ITEM_STATS_CHANGE;\n                    }\n                }\n                break;\n            case HOLD_EFFECT_CURE_PAR:\n                if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)\n                {\n                    gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS;\n                    BattleScriptExecute(BattleScript_BerryCurePrlzEnd2);\n                    effect = ITEM_STATUS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_CURE_PSN:\n                if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY)\n                {\n                    gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER);\n                    BattleScriptExecute(BattleScript_BerryCurePsnEnd2);\n                    effect = ITEM_STATUS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_CURE_BRN:\n                if (gBattleMons[battlerId].status1 & STATUS1_BURN)\n                {\n                    gBattleMons[battlerId].status1 &= ~STATUS1_BURN;\n                    BattleScriptExecute(BattleScript_BerryCureBrnEnd2);\n                    effect = ITEM_STATUS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_CURE_FRZ:\n                if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)\n                {\n                    gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE;\n                    BattleScriptExecute(BattleScript_BerryCureFrzEnd2);\n                    effect = ITEM_STATUS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_CURE_SLP:\n                if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)\n                {\n                    gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP;\n                    gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;\n                    BattleScriptExecute(BattleScript_BerryCureSlpEnd2);\n                    effect = ITEM_STATUS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_CURE_CONFUSION:\n                if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)\n                {\n                    gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;\n                    BattleScriptExecute(BattleScript_BerryCureConfusionEnd2);\n                    effect = ITEM_EFFECT_OTHER;\n                }\n                break;\n            case HOLD_EFFECT_CURE_STATUS:\n                if (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION)\n                {\n                    i = 0;\n                    if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY)\n                    {\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);\n                        i++;\n                    }\n                    if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)\n                    {\n                        gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);\n                        i++;\n                    }\n                    if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)\n                    {\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);\n                        i++;\n                    }\n                    if (gBattleMons[battlerId].status1 & STATUS1_BURN)\n                    {\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);\n                        i++;\n                    }\n                    if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)\n                    {\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);\n                        i++;\n                    }\n                    if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)\n                    {\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);\n                        i++;\n                    }\n                    if (i <= 1)\n                        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;\n                    else\n                        gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NORMALIZED_STATUS;\n                    gBattleMons[battlerId].status1 = 0;\n                    gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;\n                    BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2);\n                    effect = ITEM_STATUS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_CURE_ATTRACT:\n                if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION)\n                {\n                    gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION;\n                    StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);\n                    BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2);\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;\n                    effect = ITEM_EFFECT_OTHER;\n                }\n                break;\n            }\n            if (effect != 0)\n            {\n                gBattleScripting.battler = battlerId;\n                gPotentialItemEffectBattler = battlerId;\n                gActiveBattler = gBattlerAttacker = battlerId;\n                switch (effect)\n                {\n                case ITEM_STATUS_CHANGE:\n                    BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1);\n                    MarkBattlerForControllerExec(gActiveBattler);\n                    break;\n                case ITEM_PP_CHANGE:\n                    if (MOVE_IS_PERMANENT(battlerId, i))\n                        gBattleMons[battlerId].pp[i] = changedPP;\n                    break;\n                }\n            }\n        }\n        break;\n    case ITEMEFFECT_DUMMY:\n        break;\n    case ITEMEFFECT_MOVE_END:\n        for (battlerId = 0; battlerId < gBattlersCount; battlerId++)\n        {\n            gLastUsedItem = gBattleMons[battlerId].item;\n            if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY)\n            {\n                battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect;\n                battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam;\n            }\n            else\n            {\n                battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem);\n                battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem);\n            }\n            switch (battlerHoldEffect)\n            {\n            case HOLD_EFFECT_CURE_PAR:\n                if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)\n                {\n                    gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_BerryCureParRet;\n                    effect = ITEM_STATUS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_CURE_PSN:\n                if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY)\n                {\n                    gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER);\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_BerryCurePsnRet;\n                    effect = ITEM_STATUS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_CURE_BRN:\n                if (gBattleMons[battlerId].status1 & STATUS1_BURN)\n                {\n                    gBattleMons[battlerId].status1 &= ~STATUS1_BURN;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet;\n                    effect = ITEM_STATUS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_CURE_FRZ:\n                if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)\n                {\n                    gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet;\n                    effect = ITEM_STATUS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_CURE_SLP:\n                if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)\n                {\n                    gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP;\n                    gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet;\n                    effect = ITEM_STATUS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_CURE_CONFUSION:\n                if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)\n                {\n                    gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet;\n                    effect = ITEM_EFFECT_OTHER;\n                }\n                break;\n            case HOLD_EFFECT_CURE_ATTRACT:\n                if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION)\n                {\n                    gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION;\n                    StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);\n                    BattleScriptPushCursor();\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;\n                    gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet;\n                    effect = ITEM_EFFECT_OTHER;\n                }\n                break;\n            case HOLD_EFFECT_CURE_STATUS:\n                if (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION)\n                {\n                    if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY)\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);\n\n                    if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)\n                    {\n                        gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);\n                    }\n\n                    if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);\n\n                    if (gBattleMons[battlerId].status1 & STATUS1_BURN)\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);\n\n                    if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);\n\n                    if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)\n                        StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);\n\n                    gBattleMons[battlerId].status1 = 0;\n                    gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;\n                    BattleScriptPushCursor();\n                    gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;\n                    gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet;\n                    effect = ITEM_STATUS_CHANGE;\n                }\n                break;\n            case HOLD_EFFECT_RESTORE_STATS:\n                for (i = 0; i < NUM_BATTLE_STATS; i++)\n                {\n                    if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE)\n                    {\n                        gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE;\n                        effect = ITEM_STATS_CHANGE;\n                    }\n                }\n                if (effect != 0)\n                {\n                    gBattleScripting.battler = battlerId;\n                    gPotentialItemEffectBattler = battlerId;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_WhiteHerbRet;\n                    return effect;\n                }\n                break;\n            }\n            if (effect != 0)\n            {\n                gBattleScripting.battler = battlerId;\n                gPotentialItemEffectBattler = battlerId;\n                gActiveBattler = battlerId;\n                BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);\n                MarkBattlerForControllerExec(gActiveBattler);\n                break;\n            }\n        }\n        break;\n    case ITEMEFFECT_KINGSROCK_SHELLBELL:\n        if (gBattleMoveDamage)\n        {\n            switch (atkHoldEffect)\n            {\n            case HOLD_EFFECT_FLINCH:\n                if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n                    && TARGET_TURN_DAMAGED\n                    && (Random() % 100) < battlerHoldEffectParam\n                    && gBattleMoves[gCurrentMove].flags & FLAG_KINGS_ROCK_AFFECTED\n                    && gBattleMons[gBattlerTarget].hp)\n                {\n                    gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FLINCH;\n                    BattleScriptPushCursor();\n                    SetMoveEffect(FALSE, 0);\n                    BattleScriptPop();\n                }\n                break;\n            case HOLD_EFFECT_SHELL_BELL:\n                if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)\n                    && gSpecialStatuses[gBattlerTarget].dmg != 0\n                    && gSpecialStatuses[gBattlerTarget].dmg != 0xFFFF\n                    && gBattlerAttacker != gBattlerTarget\n                    && gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP\n                    && gBattleMons[gBattlerAttacker].hp != 0)\n                {\n                    gLastUsedItem = atkItem;\n                    gPotentialItemEffectBattler = gBattlerAttacker;\n                    gBattleScripting.battler = gBattlerAttacker;\n                    gBattleMoveDamage = (gSpecialStatuses[gBattlerTarget].dmg / atkHoldEffectParam) * -1;\n                    if (gBattleMoveDamage == 0)\n                        gBattleMoveDamage = -1;\n                    gSpecialStatuses[gBattlerTarget].dmg = 0;\n                    BattleScriptPushCursor();\n                    gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret;\n                    effect++;\n                }\n                break;\n            }\n        }\n        break;\n    }\n\n    return effect;\n}\n\nvoid ClearFuryCutterDestinyBondGrudge(u8 battlerId)\n{\n    gDisableStructs[battlerId].furyCutterCounter = 0;\n    gBattleMons[battlerId].status2 &= ~STATUS2_DESTINY_BOND;\n    gStatuses3[battlerId] &= ~STATUS3_GRUDGE;\n}\n\nvoid HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands\n{\n    if (gBattleControllerExecFlags == 0)\n        gBattleScriptingCommandsTable[*gBattlescriptCurrInstr]();\n}\n\nu8 GetMoveTarget(u16 move, u8 setTarget)\n{\n    u8 targetBattler = 0;\n    u8 moveTarget;\n    u8 side;\n\n    if (setTarget != NO_TARGET_OVERRIDE)\n        moveTarget = setTarget - 1;\n    else\n        moveTarget = gBattleMoves[move].target;\n\n    switch (moveTarget)\n    {\n    case MOVE_TARGET_SELECTED:\n        side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;\n        if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp)\n            targetBattler = gSideTimers[side].followmeTarget;\n        else\n        {\n            side = GetBattlerSide(gBattlerAttacker);\n            do\n            {\n                targetBattler = Random() % gBattlersCount;\n            } while (targetBattler == gBattlerAttacker || side == GetBattlerSide(targetBattler) || gAbsentBattlerFlags & gBitTable[targetBattler]);\n            if (gBattleMoves[move].type == TYPE_ELECTRIC\n                && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_LIGHTNING_ROD, 0, 0)\n                && gBattleMons[targetBattler].ability != ABILITY_LIGHTNING_ROD)\n            {\n                targetBattler ^= BIT_FLANK;\n                RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability);\n                gSpecialStatuses[targetBattler].lightningRodRedirected = 1;\n            }\n        }\n        break;\n    case MOVE_TARGET_DEPENDS:\n    case MOVE_TARGET_BOTH:\n    case MOVE_TARGET_FOES_AND_ALLY:\n    case MOVE_TARGET_OPPONENTS_FIELD:\n        targetBattler = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE);\n        if (gAbsentBattlerFlags & gBitTable[targetBattler])\n            targetBattler ^= BIT_FLANK;\n        break;\n    case MOVE_TARGET_RANDOM:\n        side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;\n        if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp)\n            targetBattler = gSideTimers[side].followmeTarget;\n        else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & MOVE_TARGET_RANDOM)\n        {\n            if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)\n            {\n                if (Random() & 1)\n                    targetBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n                else\n                    targetBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n            }\n            else\n            {\n                if (Random() & 1)\n                    targetBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n                else\n                    targetBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);\n            }\n            if (gAbsentBattlerFlags & gBitTable[targetBattler])\n                targetBattler ^= BIT_FLANK;\n        }\n        else\n            targetBattler = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE);\n        break;\n    case MOVE_TARGET_USER_OR_SELECTED:\n    case MOVE_TARGET_USER:\n        targetBattler = gBattlerAttacker;\n        break;\n    }\n\n    *(gBattleStruct->moveTarget + gBattlerAttacker) = targetBattler;\n\n    return targetBattler;\n}\n\nstatic bool32 IsBattlerModernFatefulEncounter(u8 battlerId)\n{\n    /*if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT)\n        return TRUE;\n    if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS\n        && GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_MEW)\n            return TRUE;\n    return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MODERN_FATEFUL_ENCOUNTER, NULL);*/\n    return TRUE;\n}\n\nu8 IsMonDisobedient(void)\n{\n    s32 rnd;\n    s32 calc;\n    u8 obedienceLevel = 0;\n\n    if ((gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_POKEDUDE)))\n        return 0;\n    if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT)\n        return 0;\n\n    if (IsBattlerModernFatefulEncounter(gBattlerAttacker)) // only false if illegal Mew or Deoxys\n    {\n        if (!IsOtherTrainer(gBattleMons[gBattlerAttacker].otId, gBattleMons[gBattlerAttacker].otName))\n            return 0;\n        if (FlagGet(FLAG_BADGE08_GET))\n            return 0;\n\n        obedienceLevel = 10;\n\n        if (FlagGet(FLAG_BADGE02_GET))\n            obedienceLevel = 30;\n        if (FlagGet(FLAG_BADGE04_GET))\n            obedienceLevel = 50;\n        if (FlagGet(FLAG_BADGE06_GET))\n            obedienceLevel = 70;\n    }\n\n    if (gBattleMons[gBattlerAttacker].level <= obedienceLevel)\n        return 0;\n    rnd = (Random() & 255);\n    calc = (gBattleMons[gBattlerAttacker].level + obedienceLevel) * rnd >> 8;\n    if (calc < obedienceLevel)\n        return 0;\n\n    // is not obedient\n    if (gCurrentMove == MOVE_RAGE)\n        gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RAGE;\n    if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (gCurrentMove == MOVE_SNORE || gCurrentMove == MOVE_SLEEP_TALK))\n    {\n        gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep;\n        return 1;\n    }\n\n    rnd = (Random() & 255);\n    calc = (gBattleMons[gBattlerAttacker].level + obedienceLevel) * rnd >> 8;\n    if (calc < obedienceLevel && gCurrentMove != MOVE_FOCUS_PUNCH) // Additional check for focus punch in FR\n    {\n        calc = CheckMoveLimitations(gBattlerAttacker, gBitTable[gCurrMovePos], MOVE_LIMITATIONS_ALL);\n        if (calc == 0xF) // all moves cannot be used\n        {\n            // Randomly select, then print a disobedient string\n            // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE\n            gBattleCommunication[MULTISTRING_CHOOSER] = Random() & (NUM_LOAF_STRINGS - 1);\n            gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround;\n            return 1;\n        }\n        else // use a random move\n        {\n            do\n            {\n                gCurrMovePos = gChosenMovePos = Random() & (MAX_MON_MOVES - 1);\n            } while (gBitTable[gCurrMovePos] & calc);\n\n            gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos];\n            gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove;\n            gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE);\n            gHitMarker |= HITMARKER_DISOBEDIENT_MOVE;\n            return 2;\n        }\n    }\n    else\n    {\n        obedienceLevel = gBattleMons[gBattlerAttacker].level - obedienceLevel;\n\n        calc = (Random() & 255);\n        if (calc < obedienceLevel && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) && gBattleMons[gBattlerAttacker].ability != ABILITY_VITAL_SPIRIT && gBattleMons[gBattlerAttacker].ability != ABILITY_INSOMNIA)\n        {\n            // try putting asleep\n            int i;\n            for (i = 0; i < gBattlersCount; i++)\n            {\n                if (gBattleMons[i].status2 & STATUS2_UPROAR)\n                    break;\n            }\n            if (i == gBattlersCount)\n            {\n                gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep;\n                return 1;\n            }\n        }\n        calc -= obedienceLevel;\n        if (calc < obedienceLevel)\n        {\n            gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerAttacker], MOVE_POUND, 0, 40, 0, gBattlerAttacker, gBattlerAttacker);\n            gBattlerTarget = gBattlerAttacker;\n            gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself;\n            gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;\n            return 2;\n        }\n        else\n        {\n            // Randomly select, then print a disobedient string\n            // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE\n            gBattleCommunication[MULTISTRING_CHOOSER] = Random() & (NUM_LOAF_STRINGS - 1);\n            gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround;\n            return 1;\n        }\n    }\n}\n"
  },
  {
    "path": "src/battle_util2.c",
    "content": "#include \"global.h\"\n#include \"bg.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"malloc.h\"\n#include \"pokemon.h\"\n#include \"trainer_tower.h\"\n\nvoid AllocateBattleResources(void)\n{\n    if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)\n        InitTrainerTowerBattleStruct();\n    if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)\n    {\n        s32 i;\n\n        for (i = 0; i < 4; i++)\n            gPokedudeBattlerStates[i] = AllocZeroed(sizeof(struct PokedudeBattlerState));\n    }\n\n    gBattleStruct = AllocZeroed(sizeof(*gBattleStruct));\n\n    gBattleResources = AllocZeroed(sizeof(*gBattleResources));\n    gBattleResources->secretBase = AllocZeroed(sizeof(*gBattleResources->secretBase));\n    gBattleResources->flags = AllocZeroed(sizeof(*gBattleResources->flags));\n    gBattleResources->battleScriptsStack = AllocZeroed(sizeof(*gBattleResources->battleScriptsStack));\n    gBattleResources->battleCallbackStack = AllocZeroed(sizeof(*gBattleResources->battleCallbackStack));\n    gBattleResources->beforeLvlUp = AllocZeroed(sizeof(*gBattleResources->beforeLvlUp));\n    gBattleResources->ai = AllocZeroed(sizeof(*gBattleResources->ai));\n    gBattleResources->battleHistory = AllocZeroed(sizeof(*gBattleResources->battleHistory));\n    gBattleResources->AI_ScriptsStack = AllocZeroed(sizeof(*gBattleResources->AI_ScriptsStack));\n\n    gLinkBattleSendBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE);\n    gLinkBattleRecvBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE);\n\n    gBattleAnimBgTileBuffer = AllocZeroed(0x2000);\n    gBattleAnimBgTilemapBuffer = AllocZeroed(0x1000);\n\n    SetBgTilemapBuffer(1, gBattleAnimBgTilemapBuffer);\n    SetBgTilemapBuffer(2, gBattleAnimBgTilemapBuffer);\n}\n\nvoid FreeBattleResources(void)\n{\n    if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)\n        FreeTrainerTowerBattleStruct();\n    if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)\n    {\n        s32 i;\n\n        for (i = 0; i < 4; i++)\n        {\n            FREE_AND_SET_NULL(gPokedudeBattlerStates[i]);\n        }\n    }\n    if (gBattleResources != NULL)\n    {\n        FREE_AND_SET_NULL(gBattleStruct);\n\n        FREE_AND_SET_NULL(gBattleResources->secretBase);\n        FREE_AND_SET_NULL(gBattleResources->flags);\n        FREE_AND_SET_NULL(gBattleResources->battleScriptsStack);\n        FREE_AND_SET_NULL(gBattleResources->battleCallbackStack);\n        FREE_AND_SET_NULL(gBattleResources->beforeLvlUp);\n        FREE_AND_SET_NULL(gBattleResources->ai);\n        FREE_AND_SET_NULL(gBattleResources->battleHistory);\n        FREE_AND_SET_NULL(gBattleResources->AI_ScriptsStack);\n        FREE_AND_SET_NULL(gBattleResources);\n\n        FREE_AND_SET_NULL(gLinkBattleSendBuffer);\n        FREE_AND_SET_NULL(gLinkBattleRecvBuffer);\n\n        FREE_AND_SET_NULL(gBattleAnimBgTileBuffer);\n        FREE_AND_SET_NULL(gBattleAnimBgTilemapBuffer);\n    }\n}\n\nvoid AdjustFriendshipOnBattleFaint(u8 battlerId)\n{\n    u8 opposingBattlerId;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n    {\n        u8 opposingBattlerId2;\n\n        opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        opposingBattlerId2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n\n        if (gBattleMons[opposingBattlerId2].level > gBattleMons[opposingBattlerId].level)\n            opposingBattlerId = opposingBattlerId2;\n    }\n    else\n    {\n        opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n    }\n\n    if (gBattleMons[opposingBattlerId].level > gBattleMons[battlerId].level)\n    {\n        if (gBattleMons[opposingBattlerId].level - gBattleMons[battlerId].level > 29)\n            AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_LARGE);\n        else\n            AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_SMALL);\n    }\n    else\n    {\n        AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_SMALL);\n    }\n}\n"
  },
  {
    "path": "src/berry.c",
    "content": "#include \"global.h\"\n#include \"berry.h\"\n#include \"text.h\"\n#include \"constants/items.h\"\n\nstatic const u8 sBerryDescriptionPart1_Cheri[] = _(\"とても かわいい はなが さく.\");\nstatic const u8 sBerryDescriptionPart2_Cheri[] = _(\"まっかな みは とても からい.\");\nstatic const u8 sBerryDescriptionPart1_Chesto[] = _(\"そとの かわの ぶぶんも なかみも すべてが\");\nstatic const u8 sBerryDescriptionPart2_Chesto[] = _(\"かたい. どこを たべても しぶい.\");\nstatic const u8 sBerryDescriptionPart1_Pecha[] = _(\"とても あまくて おいしい.\");\nstatic const u8 sBerryDescriptionPart2_Pecha[] = _(\"やわらかいので はこぶときは ちゅうい.\");\nstatic const u8 sBerryDescriptionPart1_Rawst[] = _(\"はっぱの ぶぶんが ながく まるまっていると\");\nstatic const u8 sBerryDescriptionPart2_Rawst[] = _(\"みが とても にがく なるらしい.\");\nstatic const u8 sBerryDescriptionPart1_Aspear[] = _(\"かたい みの なかには すいぶんが とても\");\nstatic const u8 sBerryDescriptionPart2_Aspear[] = _(\"おおく ふくまれている. かなり すっぱい.\");\nstatic const u8 sBerryDescriptionPart1_Leppa[] = _(\"クラボなどに くらべて すこし そだつのが\");\nstatic const u8 sBerryDescriptionPart2_Leppa[] = _(\"おそい. みが ちいさいほど おいしい.\");\nstatic const u8 sBerryDescriptionPart1_Oran[] = _(\"いろいろな あじが まざった ふしぎな み.\");\nstatic const u8 sBerryDescriptionPart2_Oran[] = _(\"みを つけるのに はんにち かかる.\");\nstatic const u8 sBerryDescriptionPart1_Persim[] = _(\"たいようが だいすき. ひに あたると\");\nstatic const u8 sBerryDescriptionPart2_Persim[] = _(\"どんどん いろが あざやかに なる.\");\nstatic const u8 sBerryDescriptionPart1_Lum[] = _(\"そだつのに じかんが かかるが たいせつに\");\nstatic const u8 sBerryDescriptionPart2_Lum[] = _(\"そだてると みが 2つ つくことも ある.\");\nstatic const u8 sBerryDescriptionPart1_Sitrus[] = _(\"オレンとは きょうだいの ような そんざい.\");\nstatic const u8 sBerryDescriptionPart2_Sitrus[] = _(\"おおきくて あじも ととのっている.\");\nstatic const u8 sBerryDescriptionPart1_Figy[] = _(\"たべられた あとのような かたちの なかには\");\nstatic const u8 sBerryDescriptionPart2_Figy[] = _(\"からい せいぶんが つまっている.\");\nstatic const u8 sBerryDescriptionPart1_Wiki[] = _(\"まわりに ついている イボイボは ポケモンが\");\nstatic const u8 sBerryDescriptionPart2_Wiki[] = _(\"もちやすいように できたと いわれている.\");\nstatic const u8 sBerryDescriptionPart1_Mago[] = _(\"おおきく なれば なるほど みが まがる.\");\nstatic const u8 sBerryDescriptionPart2_Mago[] = _(\"まがるほど あまくて おいしい.\");\nstatic const u8 sBerryDescriptionPart1_Aguav[] = _(\"ちいさい サイズの はなで しかも ひかりを\");\nstatic const u8 sBerryDescriptionPart2_Aguav[] = _(\"ひつようと しない めずらしい きのみ.\");\nstatic const u8 sBerryDescriptionPart1_Iapapa[] = _(\"とても おおきな すっぱい きのみ.\");\nstatic const u8 sBerryDescriptionPart2_Iapapa[] = _(\"そだてるには みじかくても 1にち かかる.\");\nstatic const u8 sBerryDescriptionPart1_Razz[] = _(\"あかい みは たべると ちょっぴり からい.\");\nstatic const u8 sBerryDescriptionPart2_Razz[] = _(\"そだつのが はやく 4じかんで みを つける\");\nstatic const u8 sBerryDescriptionPart1_Bluk[] = _(\"そとがわは あおいいろだが たべると\");\nstatic const u8 sBerryDescriptionPart2_Bluk[] = _(\"くちの なかが まっくろに なる.\");\nstatic const u8 sBerryDescriptionPart1_Nanab[] = _(\"せかいで 7ばんめに はっけん されたので\");\nstatic const u8 sBerryDescriptionPart2_Nanab[] = _(\"ナナという せつが ゆうりょく. あまい.\");\nstatic const u8 sBerryDescriptionPart1_Wepear[] = _(\"ちいさな しろい はなが さく. にがさと\");\nstatic const u8 sBerryDescriptionPart2_Wepear[] = _(\"すっぱさが まざりあった びみょうな あじ.\");\nstatic const u8 sBerryDescriptionPart1_Pinap[] = _(\"かぜに よわく さむさにも よわい.\");\nstatic const u8 sBerryDescriptionPart2_Pinap[] = _(\"みの なかが からく そとがわが すっぱい.\");\nstatic const u8 sBerryDescriptionPart1_Pomeg[] = _(\"どんなに みずを あげても えいようが\");\nstatic const u8 sBerryDescriptionPart2_Pomeg[] = _(\"あっても 6つの み しか つけない.\");\nstatic const u8 sBerryDescriptionPart1_Kelpsy[] = _(\"ねっこの ような かたちの めずらしい\");\nstatic const u8 sBerryDescriptionPart2_Kelpsy[] = _(\"しゅるい. とても おおきな はなが さく.\");\nstatic const u8 sBerryDescriptionPart1_Qualot[] = _(\"みずが だいすき. ずっと あめが ふる\");\nstatic const u8 sBerryDescriptionPart2_Qualot[] = _(\"ばしょでも しっかりと そだつ.\");\nstatic const u8 sBerryDescriptionPart1_Hondew[] = _(\"とても こうかで なかなか めに することが\");\nstatic const u8 sBerryDescriptionPart2_Hondew[] = _(\"できない きのみ. とても おいしい.\");\nstatic const u8 sBerryDescriptionPart1_Grepa[] = _(\"やわらかさと まるい かたちからは\");\nstatic const u8 sBerryDescriptionPart2_Grepa[] = _(\"そうぞうが できないほど すっぱい.\");\nstatic const u8 sBerryDescriptionPart1_Tamato[] = _(\"くちびるが まがって しまうほど からい.\");\nstatic const u8 sBerryDescriptionPart2_Tamato[] = _(\"そだてるにも じかんが かかる.\");\nstatic const u8 sBerryDescriptionPart1_Cornn[] = _(\"おおむかしから はえていた. たくさん\");\nstatic const u8 sBerryDescriptionPart2_Cornn[] = _(\"うえないと みが つかないときも ある.\");\nstatic const u8 sBerryDescriptionPart1_Magost[] = _(\"とても あじの バランスが よいと\");\nstatic const u8 sBerryDescriptionPart2_Magost[] = _(\"ひょうばんの きのみ.\");\nstatic const u8 sBerryDescriptionPart1_Rabuta[] = _(\"たくさんの けが はえている めずらしい\");\nstatic const u8 sBerryDescriptionPart2_Rabuta[] = _(\"しゅるい. かなり にがい.\");\nstatic const u8 sBerryDescriptionPart1_Nomel[] = _(\"かなり すっぱい. 1くち たべると\");\nstatic const u8 sBerryDescriptionPart2_Nomel[] = _(\"3にちかん ほかの あじが しなくなる.\");\nstatic const u8 sBerryDescriptionPart1_Spelon[] = _(\"まっかになった みは とてつもなく からい.\");\nstatic const u8 sBerryDescriptionPart2_Spelon[] = _(\"イボからも からい せいぶんが でている.\");\nstatic const u8 sBerryDescriptionPart1_Pamtre[] = _(\"どこからともなく うみを ただよってくる.\");\nstatic const u8 sBerryDescriptionPart2_Pamtre[] = _(\"せかいの どこかで そだっている らしい.\");\nstatic const u8 sBerryDescriptionPart1_Watmel[] = _(\"とても おおきく 50センチを こえるものも\");\nstatic const u8 sBerryDescriptionPart2_Watmel[] = _(\"はっけん された. ものすごく あまい.\");\nstatic const u8 sBerryDescriptionPart1_Durin[] = _(\"みただけで にがい. あまりにも にがいので\");\nstatic const u8 sBerryDescriptionPart2_Durin[] = _(\"そのままで たべたひとは だれもいない.\");\nstatic const u8 sBerryDescriptionPart1_Belue[] = _(\"つるつるとして おいしそうだが とてつもなく\");\nstatic const u8 sBerryDescriptionPart2_Belue[] = _(\"すっぱい. そだてるにも じかんが かかる.\");\nstatic const u8 sBerryDescriptionPart1_Liechi[] = _(\"なぞのタネ. チイラのみには うみの\");\nstatic const u8 sBerryDescriptionPart2_Liechi[] = _(\"ちからが やどるという うわさが ある.\");\nstatic const u8 sBerryDescriptionPart1_Ganlon[] = _(\"なぞのタネ. リュガのみには りくの\");\nstatic const u8 sBerryDescriptionPart2_Ganlon[] = _(\"ちからが やどるという うわさが ある.\");\nstatic const u8 sBerryDescriptionPart1_Salac[] = _(\"なぞのタネ. カムラのみには そらの\");\nstatic const u8 sBerryDescriptionPart2_Salac[] = _(\"ちからが やどるという うわさが ある.\");\nstatic const u8 sBerryDescriptionPart1_Petaya[] = _(\"なぞのタネ. ヤタピのみには すべての\");\nstatic const u8 sBerryDescriptionPart2_Petaya[] = _(\"いきものの ちからが やどると いわれている\");\nstatic const u8 sBerryDescriptionPart1_Apicot[] = _(\"ふしぎな ふしぎな きのみ. なにが\");\nstatic const u8 sBerryDescriptionPart2_Apicot[] = _(\"おこるのか なにが できるのか わからない.\");\nstatic const u8 sBerryDescriptionPart1_Lansat[] = _(\"でんせつのみ と いわれている. この みを\");\nstatic const u8 sBerryDescriptionPart2_Lansat[] = _(\"もつと とても しあわせに なるらしい.\");\nstatic const u8 sBerryDescriptionPart1_Starf[] = _(\"あまりにも ちからが つよすぎるため\");\nstatic const u8 sBerryDescriptionPart2_Starf[] = _(\"せかいの はてに すてた まぼろしのみ.\");\nstatic const u8 sBerryDescriptionPart1_Enigma[] = _(\"しょうたい ふめいの きのみ.\");\nstatic const u8 sBerryDescriptionPart2_Enigma[] = _(\"ほしの ちからを もっている らしい.\");\n\nconst struct Berry gBerries[] = {\n    [ITEM_CHERI_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"CHERI\"),\n            .firmness = BERRY_FIRMNESS_SOFT,\n            .size = 20,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Cheri,\n            .description2 = sBerryDescriptionPart2_Cheri,\n            .stageDuration = 3,\n            .spicy = 10,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 0,\n            .smoothness = 25\n        },\n\n    [ITEM_CHESTO_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"CHESTO\"),\n            .firmness = BERRY_FIRMNESS_SUPER_HARD,\n            .size = 80,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Chesto,\n            .description2 = sBerryDescriptionPart2_Chesto,\n            .stageDuration = 3,\n            .spicy = 0,\n            .dry = 10,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 0,\n            .smoothness = 25\n        },\n\n    [ITEM_PECHA_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"PECHA\"),\n            .firmness = BERRY_FIRMNESS_VERY_SOFT,\n            .size = 40,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Pecha,\n            .description2 = sBerryDescriptionPart2_Pecha,\n            .stageDuration = 3,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 10,\n            .bitter = 0,\n            .sour = 0,\n            .smoothness = 25\n        },\n\n    [ITEM_RAWST_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"RAWST\"),\n            .firmness = BERRY_FIRMNESS_HARD,\n            .size = 32,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Rawst,\n            .description2 = sBerryDescriptionPart2_Rawst,\n            .stageDuration = 3,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 10,\n            .sour = 0,\n            .smoothness = 25\n        },\n\n    [ITEM_ASPEAR_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"ASPEAR\"),\n            .firmness = BERRY_FIRMNESS_SUPER_HARD,\n            .size = 50,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Aspear,\n            .description2 = sBerryDescriptionPart2_Aspear,\n            .stageDuration = 3,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 10,\n            .smoothness = 25\n        },\n\n    [ITEM_LEPPA_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"LEPPA\"),\n            .firmness = BERRY_FIRMNESS_VERY_HARD,\n            .size = 28,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Leppa,\n            .description2 = sBerryDescriptionPart2_Leppa,\n            .stageDuration = 4,\n            .spicy = 10,\n            .dry = 0,\n            .sweet = 10,\n            .bitter = 10,\n            .sour = 10,\n            .smoothness = 20\n        },\n\n    [ITEM_ORAN_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"ORAN\"),\n            .firmness = BERRY_FIRMNESS_SUPER_HARD,\n            .size = 35,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Oran,\n            .description2 = sBerryDescriptionPart2_Oran,\n            .stageDuration = 3,\n            .spicy = 10,\n            .dry = 10,\n            .sweet = 10,\n            .bitter = 10,\n            .sour = 10,\n            .smoothness = 20\n        },\n\n    [ITEM_PERSIM_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"PERSIM\"),\n            .firmness = BERRY_FIRMNESS_HARD,\n            .size = 47,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Persim,\n            .description2 = sBerryDescriptionPart2_Persim,\n            .stageDuration = 3,\n            .spicy = 10,\n            .dry = 10,\n            .sweet = 10,\n            .bitter = 10,\n            .sour = 10,\n            .smoothness = 20\n        },\n\n    [ITEM_LUM_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"LUM\"),\n            .firmness = BERRY_FIRMNESS_SUPER_HARD,\n            .size = 34,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Lum,\n            .description2 = sBerryDescriptionPart2_Lum,\n            .stageDuration = 12,\n            .spicy = 10,\n            .dry = 10,\n            .sweet = 10,\n            .bitter = 10,\n            .sour = 10,\n            .smoothness = 20\n        },\n\n    [ITEM_SITRUS_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"SITRUS\"),\n            .firmness = BERRY_FIRMNESS_VERY_HARD,\n            .size = 95,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Sitrus,\n            .description2 = sBerryDescriptionPart2_Sitrus,\n            .stageDuration = 6,\n            .spicy = 10,\n            .dry = 10,\n            .sweet = 10,\n            .bitter = 10,\n            .sour = 10,\n            .smoothness = 20\n        },\n\n    [ITEM_FIGY_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"FIGY\"),\n            .firmness = BERRY_FIRMNESS_SOFT,\n            .size = 100,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Figy,\n            .description2 = sBerryDescriptionPart2_Figy,\n            .stageDuration = 6,\n            .spicy = 10,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 0,\n            .smoothness = 25\n        },\n\n    [ITEM_WIKI_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"WIKI\"),\n            .firmness = BERRY_FIRMNESS_HARD,\n            .size = 115,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Wiki,\n            .description2 = sBerryDescriptionPart2_Wiki,\n            .stageDuration = 6,\n            .spicy = 0,\n            .dry = 10,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 0,\n            .smoothness = 25\n        },\n\n    [ITEM_MAGO_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"MAGO\"),\n            .firmness = BERRY_FIRMNESS_HARD,\n            .size = 126,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Mago,\n            .description2 = sBerryDescriptionPart2_Mago,\n            .stageDuration = 6,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 10,\n            .bitter = 0,\n            .sour = 0,\n            .smoothness = 25\n        },\n\n    [ITEM_AGUAV_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"AGUAV\"),\n            .firmness = BERRY_FIRMNESS_SUPER_HARD,\n            .size = 64,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Aguav,\n            .description2 = sBerryDescriptionPart2_Aguav,\n            .stageDuration = 6,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 10,\n            .sour = 0,\n            .smoothness = 25\n        },\n\n    [ITEM_IAPAPA_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"IAPAPA\"),\n            .firmness = BERRY_FIRMNESS_SOFT,\n            .size = 223,\n            .maxYield = 3,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Iapapa,\n            .description2 = sBerryDescriptionPart2_Iapapa,\n            .stageDuration = 6,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 10,\n            .smoothness = 25\n        },\n\n    [ITEM_RAZZ_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"RAZZ\"),\n            .firmness = BERRY_FIRMNESS_VERY_HARD,\n            .size = 120,\n            .maxYield = 6,\n            .minYield = 3,\n            .description1 = sBerryDescriptionPart1_Razz,\n            .description2 = sBerryDescriptionPart2_Razz,\n            .stageDuration = 1,\n            .spicy = 10,\n            .dry = 10,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 0,\n            .smoothness = 20\n        },\n\n    [ITEM_BLUK_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"BLUK\"),\n            .firmness = BERRY_FIRMNESS_SOFT,\n            .size = 108,\n            .maxYield = 6,\n            .minYield = 3,\n            .description1 = sBerryDescriptionPart1_Bluk,\n            .description2 = sBerryDescriptionPart2_Bluk,\n            .stageDuration = 1,\n            .spicy = 0,\n            .dry = 10,\n            .sweet = 10,\n            .bitter = 0,\n            .sour = 0,\n            .smoothness = 20\n        },\n\n    [ITEM_NANAB_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"NANAB\"),\n            .firmness = BERRY_FIRMNESS_VERY_HARD,\n            .size = 77,\n            .maxYield = 6,\n            .minYield = 3,\n            .description1 = sBerryDescriptionPart1_Nanab,\n            .description2 = sBerryDescriptionPart2_Nanab,\n            .stageDuration = 1,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 10,\n            .bitter = 10,\n            .sour = 0,\n            .smoothness = 20\n        },\n\n    [ITEM_WEPEAR_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"WEPEAR\"),\n            .firmness = BERRY_FIRMNESS_SUPER_HARD,\n            .size = 74,\n            .maxYield = 6,\n            .minYield = 3,\n            .description1 = sBerryDescriptionPart1_Wepear,\n            .description2 = sBerryDescriptionPart2_Wepear,\n            .stageDuration = 1,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 10,\n            .sour = 10,\n            .smoothness = 20\n        },\n\n    [ITEM_PINAP_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"PINAP\"),\n            .firmness = BERRY_FIRMNESS_HARD,\n            .size = 80,\n            .maxYield = 6,\n            .minYield = 3,\n            .description1 = sBerryDescriptionPart1_Pinap,\n            .description2 = sBerryDescriptionPart2_Pinap,\n            .stageDuration = 1,\n            .spicy = 10,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 10,\n            .smoothness = 20\n        },\n\n    [ITEM_POMEG_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"POMEG\"),\n            .firmness = BERRY_FIRMNESS_VERY_HARD,\n            .size = 135,\n            .maxYield = 6,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Pomeg,\n            .description2 = sBerryDescriptionPart2_Pomeg,\n            .stageDuration = 3,\n            .spicy = 10,\n            .dry = 0,\n            .sweet = 10,\n            .bitter = 10,\n            .sour = 0,\n            .smoothness = 20\n        },\n\n    [ITEM_KELPSY_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"KELPSY\"),\n            .firmness = BERRY_FIRMNESS_HARD,\n            .size = 150,\n            .maxYield = 6,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Kelpsy,\n            .description2 = sBerryDescriptionPart2_Kelpsy,\n            .stageDuration = 3,\n            .spicy = 0,\n            .dry = 10,\n            .sweet = 0,\n            .bitter = 10,\n            .sour = 10,\n            .smoothness = 20\n        },\n\n    [ITEM_QUALOT_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"QUALOT\"),\n            .firmness = BERRY_FIRMNESS_HARD,\n            .size = 110,\n            .maxYield = 6,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Qualot,\n            .description2 = sBerryDescriptionPart2_Qualot,\n            .stageDuration = 3,\n            .spicy = 10,\n            .dry = 0,\n            .sweet = 10,\n            .bitter = 0,\n            .sour = 10,\n            .smoothness = 20\n        },\n\n    [ITEM_HONDEW_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"HONDEW\"),\n            .firmness = BERRY_FIRMNESS_HARD,\n            .size = 162,\n            .maxYield = 6,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Hondew,\n            .description2 = sBerryDescriptionPart2_Hondew,\n            .stageDuration = 3,\n            .spicy = 10,\n            .dry = 10,\n            .sweet = 0,\n            .bitter = 10,\n            .sour = 0,\n            .smoothness = 20\n        },\n\n    [ITEM_GREPA_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"GREPA\"),\n            .firmness = BERRY_FIRMNESS_SOFT,\n            .size = 149,\n            .maxYield = 6,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Grepa,\n            .description2 = sBerryDescriptionPart2_Grepa,\n            .stageDuration = 3,\n            .spicy = 0,\n            .dry = 10,\n            .sweet = 10,\n            .bitter = 0,\n            .sour = 10,\n            .smoothness = 20\n        },\n\n    [ITEM_TAMATO_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"TAMATO\"),\n            .firmness = BERRY_FIRMNESS_SOFT,\n            .size = 200,\n            .maxYield = 4,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Tamato,\n            .description2 = sBerryDescriptionPart2_Tamato,\n            .stageDuration = 6,\n            .spicy = 20,\n            .dry = 10,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 0,\n            .smoothness = 30\n        },\n\n    [ITEM_CORNN_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"CORNN\"),\n            .firmness = BERRY_FIRMNESS_HARD,\n            .size = 75,\n            .maxYield = 4,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Cornn,\n            .description2 = sBerryDescriptionPart2_Cornn,\n            .stageDuration = 6,\n            .spicy = 0,\n            .dry = 20,\n            .sweet = 10,\n            .bitter = 0,\n            .sour = 0,\n            .smoothness = 30\n        },\n\n    [ITEM_MAGOST_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"MAGOST\"),\n            .firmness = BERRY_FIRMNESS_HARD,\n            .size = 140,\n            .maxYield = 4,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Magost,\n            .description2 = sBerryDescriptionPart2_Magost,\n            .stageDuration = 6,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 20,\n            .bitter = 10,\n            .sour = 0,\n            .smoothness = 30\n        },\n\n    [ITEM_RABUTA_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"RABUTA\"),\n            .firmness = BERRY_FIRMNESS_SOFT,\n            .size = 226,\n            .maxYield = 4,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Rabuta,\n            .description2 = sBerryDescriptionPart2_Rabuta,\n            .stageDuration = 6,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 20,\n            .sour = 10,\n            .smoothness = 30\n        },\n\n    [ITEM_NOMEL_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"NOMEL\"),\n            .firmness = BERRY_FIRMNESS_SUPER_HARD,\n            .size = 285,\n            .maxYield = 4,\n            .minYield = 2,\n            .description1 = sBerryDescriptionPart1_Nomel,\n            .description2 = sBerryDescriptionPart2_Nomel,\n            .stageDuration = 6,\n            .spicy = 10,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 20,\n            .smoothness = 30\n        },\n\n    [ITEM_SPELON_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"SPELON\"),\n            .firmness = BERRY_FIRMNESS_SOFT,\n            .size = 133,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Spelon,\n            .description2 = sBerryDescriptionPart2_Spelon,\n            .stageDuration = 18,\n            .spicy = 40,\n            .dry = 10,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 0,\n            .smoothness = 70\n        },\n\n    [ITEM_PAMTRE_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"PAMTRE\"),\n            .firmness = BERRY_FIRMNESS_VERY_SOFT,\n            .size = 244,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Pamtre,\n            .description2 = sBerryDescriptionPart2_Pamtre,\n            .stageDuration = 18,\n            .spicy = 0,\n            .dry = 40,\n            .sweet = 10,\n            .bitter = 0,\n            .sour = 0,\n            .smoothness = 70\n        },\n\n    [ITEM_WATMEL_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"WATMEL\"),\n            .firmness = BERRY_FIRMNESS_SOFT,\n            .size = 250,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Watmel,\n            .description2 = sBerryDescriptionPart2_Watmel,\n            .stageDuration = 18,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 40,\n            .bitter = 10,\n            .sour = 0,\n            .smoothness = 70\n        },\n\n    [ITEM_DURIN_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"DURIN\"),\n            .firmness = BERRY_FIRMNESS_HARD,\n            .size = 280,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Durin,\n            .description2 = sBerryDescriptionPart2_Durin,\n            .stageDuration = 18,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 40,\n            .sour = 10,\n            .smoothness = 70\n        },\n\n    [ITEM_BELUE_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"BELUE\"),\n            .firmness = BERRY_FIRMNESS_VERY_SOFT,\n            .size = 300,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Belue,\n            .description2 = sBerryDescriptionPart2_Belue,\n            .stageDuration = 18,\n            .spicy = 10,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 40,\n            .smoothness = 70\n        },\n\n    [ITEM_LIECHI_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"LIECHI\"),\n            .firmness = BERRY_FIRMNESS_VERY_HARD,\n            .size = 111,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Liechi,\n            .description2 = sBerryDescriptionPart2_Liechi,\n            .stageDuration = 24,\n            .spicy = 40,\n            .dry = 0,\n            .sweet = 40,\n            .bitter = 0,\n            .sour = 10,\n            .smoothness = 80\n        },\n\n    [ITEM_GANLON_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"GANLON\"),\n            .firmness = BERRY_FIRMNESS_VERY_HARD,\n            .size = 33,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Ganlon,\n            .description2 = sBerryDescriptionPart2_Ganlon,\n            .stageDuration = 24,\n            .spicy = 0,\n            .dry = 40,\n            .sweet = 0,\n            .bitter = 40,\n            .sour = 0,\n            .smoothness = 80\n        },\n\n    [ITEM_SALAC_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"SALAC\"),\n            .firmness = BERRY_FIRMNESS_VERY_HARD,\n            .size = 95,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Salac,\n            .description2 = sBerryDescriptionPart2_Salac,\n            .stageDuration = 24,\n            .spicy = 0,\n            .dry = 0,\n            .sweet = 40,\n            .bitter = 0,\n            .sour = 40,\n            .smoothness = 80\n        },\n\n    [ITEM_PETAYA_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"PETAYA\"),\n            .firmness = BERRY_FIRMNESS_VERY_HARD,\n            .size = 237,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Petaya,\n            .description2 = sBerryDescriptionPart2_Petaya,\n            .stageDuration = 24,\n            .spicy = 40,\n            .dry = 0,\n            .sweet = 0,\n            .bitter = 40,\n            .sour = 0,\n            .smoothness = 80\n        },\n\n    [ITEM_APICOT_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"APICOT\"),\n            .firmness = BERRY_FIRMNESS_HARD,\n            .size = 75,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Apicot,\n            .description2 = sBerryDescriptionPart2_Apicot,\n            .stageDuration = 24,\n            .spicy = 0,\n            .dry = 40,\n            .sweet = 0,\n            .bitter = 0,\n            .sour = 40,\n            .smoothness = 80\n        },\n\n    [ITEM_LANSAT_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"LANSAT\"),\n            .firmness = BERRY_FIRMNESS_SOFT,\n            .size = 97,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Lansat,\n            .description2 = sBerryDescriptionPart2_Lansat,\n            .stageDuration = 24,\n            .spicy = 10,\n            .dry = 10,\n            .sweet = 10,\n            .bitter = 10,\n            .sour = 10,\n            .smoothness = 30\n        },\n\n    [ITEM_STARF_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"STARF\"),\n            .firmness = BERRY_FIRMNESS_SUPER_HARD,\n            .size = 153,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Starf,\n            .description2 = sBerryDescriptionPart2_Starf,\n            .stageDuration = 24,\n            .spicy = 10,\n            .dry = 10,\n            .sweet = 10,\n            .bitter = 10,\n            .sour = 10,\n            .smoothness = 30\n        },\n\n    [ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX] =\n        {\n            .name = _(\"ENIGMA\"),\n            .firmness = BERRY_FIRMNESS_UNKNOWN,\n            .size = 0,\n            .maxYield = 2,\n            .minYield = 1,\n            .description1 = sBerryDescriptionPart1_Enigma,\n            .description2 = sBerryDescriptionPart2_Enigma,\n            .stageDuration = 24,\n            .spicy = 40,\n            .dry = 40,\n            .sweet = 40,\n            .bitter = 40,\n            .sour = 40,\n            .smoothness = 40\n        },\n\n};\n\nconst struct BerryCrushStats gBerryCrush_BerryData[] = {\n    [ITEM_CHERI_BERRY  - FIRST_BERRY_INDEX] = { 50,  20},\n    [ITEM_CHESTO_BERRY - FIRST_BERRY_INDEX] = { 50,  20},\n    [ITEM_PECHA_BERRY  - FIRST_BERRY_INDEX] = { 50,  20},\n    [ITEM_RAWST_BERRY  - FIRST_BERRY_INDEX] = { 50,  20},\n    [ITEM_ASPEAR_BERRY - FIRST_BERRY_INDEX] = { 50,  20},\n    [ITEM_LEPPA_BERRY  - FIRST_BERRY_INDEX] = { 50,  30},\n    [ITEM_ORAN_BERRY   - FIRST_BERRY_INDEX] = { 50,  30},\n    [ITEM_PERSIM_BERRY - FIRST_BERRY_INDEX] = { 50,  30},\n    [ITEM_LUM_BERRY    - FIRST_BERRY_INDEX] = { 50,  30},\n    [ITEM_SITRUS_BERRY - FIRST_BERRY_INDEX] = { 50,  30},\n    [ITEM_FIGY_BERRY   - FIRST_BERRY_INDEX] = { 60,  50},\n    [ITEM_WIKI_BERRY   - FIRST_BERRY_INDEX] = { 60,  50},\n    [ITEM_MAGO_BERRY   - FIRST_BERRY_INDEX] = { 60,  50},\n    [ITEM_AGUAV_BERRY  - FIRST_BERRY_INDEX] = { 60,  50},\n    [ITEM_IAPAPA_BERRY - FIRST_BERRY_INDEX] = { 60,  50},\n    [ITEM_RAZZ_BERRY   - FIRST_BERRY_INDEX] = { 80,  70},\n    [ITEM_BLUK_BERRY   - FIRST_BERRY_INDEX] = { 80,  70},\n    [ITEM_NANAB_BERRY  - FIRST_BERRY_INDEX] = { 80,  70},\n    [ITEM_WEPEAR_BERRY - FIRST_BERRY_INDEX] = { 80,  70},\n    [ITEM_PINAP_BERRY  - FIRST_BERRY_INDEX] = { 80,  70},\n    [ITEM_POMEG_BERRY  - FIRST_BERRY_INDEX] = {100, 100},\n    [ITEM_KELPSY_BERRY - FIRST_BERRY_INDEX] = {100, 100},\n    [ITEM_QUALOT_BERRY - FIRST_BERRY_INDEX] = {100, 100},\n    [ITEM_HONDEW_BERRY - FIRST_BERRY_INDEX] = {100, 100},\n    [ITEM_GREPA_BERRY  - FIRST_BERRY_INDEX] = {100, 100},\n    [ITEM_TAMATO_BERRY - FIRST_BERRY_INDEX] = {130, 150},\n    [ITEM_CORNN_BERRY  - FIRST_BERRY_INDEX] = {130, 150},\n    [ITEM_MAGOST_BERRY - FIRST_BERRY_INDEX] = {130, 150},\n    [ITEM_RABUTA_BERRY - FIRST_BERRY_INDEX] = {130, 150},\n    [ITEM_NOMEL_BERRY  - FIRST_BERRY_INDEX] = {130, 150},\n    [ITEM_SPELON_BERRY - FIRST_BERRY_INDEX] = {160, 250},\n    [ITEM_PAMTRE_BERRY - FIRST_BERRY_INDEX] = {160, 250},\n    [ITEM_WATMEL_BERRY - FIRST_BERRY_INDEX] = {160, 250},\n    [ITEM_DURIN_BERRY  - FIRST_BERRY_INDEX] = {160, 250},\n    [ITEM_BELUE_BERRY  - FIRST_BERRY_INDEX] = {160, 250},\n    [ITEM_LIECHI_BERRY - FIRST_BERRY_INDEX] = {180, 500},\n    [ITEM_GANLON_BERRY - FIRST_BERRY_INDEX] = {180, 500},\n    [ITEM_SALAC_BERRY  - FIRST_BERRY_INDEX] = {180, 500},\n    [ITEM_PETAYA_BERRY - FIRST_BERRY_INDEX] = {180, 500},\n    [ITEM_APICOT_BERRY - FIRST_BERRY_INDEX] = {180, 500},\n    [ITEM_LANSAT_BERRY - FIRST_BERRY_INDEX] = {200, 750},\n    [ITEM_STARF_BERRY  - FIRST_BERRY_INDEX] = {200, 750},\n    [ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX] = {150, 200}\n};\n\n// Leftover from R/S\nconst struct BerryTree gBlankBerryTree = {};\n\n#define ENIGMA_BERRY_STRUCT ({ \\\n    const struct Berry2 * berries = (const struct Berry2 *)gBerries; \\\n    berries[ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX]; \\\n})\n\nstatic u32 GetEnigmaBerryChecksum(struct EnigmaBerry *);\n\nvoid InitEnigmaBerry(void)\n{\n    s32 i;\n\n    gSaveBlock1Ptr->enigmaBerry.berry = ENIGMA_BERRY_STRUCT;\n    for (i = 0; i < 18; i++)\n        gSaveBlock1Ptr->enigmaBerry.itemEffect[i] = 0;\n    gSaveBlock1Ptr->enigmaBerry.holdEffect = 0;\n    gSaveBlock1Ptr->enigmaBerry.holdEffectParam = 0;\n    gSaveBlock1Ptr->enigmaBerry.checksum = GetEnigmaBerryChecksum(&gSaveBlock1Ptr->enigmaBerry);\n}\n\nvoid ClearEnigmaBerries(void)\n{\n    CpuFill16(0, &gSaveBlock1Ptr->enigmaBerry, sizeof(gSaveBlock1Ptr->enigmaBerry));\n    InitEnigmaBerry();\n}\n\nstruct ReceivedEnigmaBerry\n{\n    struct Berry2 berry;\n    u8 unk_001C[0x4FA];\n    u8 itemEffect[18];\n    u8 holdEffect;\n    u8 holdEffectParam;\n};\n\nvoid SetEnigmaBerry(u8 * berry)\n{\n    struct EnigmaBerry * enigmaBerry;\n    struct ReceivedEnigmaBerry * src2;\n    s32 i;\n\n    ClearEnigmaBerries();\n\n    src2 = (struct ReceivedEnigmaBerry *)berry;\n    enigmaBerry = &gSaveBlock1Ptr->enigmaBerry;\n\n    enigmaBerry->berry = src2->berry;\n    for (i = 0; i < 18; i++)\n        enigmaBerry->itemEffect[i] = src2->itemEffect[i];\n    enigmaBerry->holdEffect = src2->holdEffect;\n    enigmaBerry->holdEffectParam = src2->holdEffectParam;\n    enigmaBerry->checksum = GetEnigmaBerryChecksum(enigmaBerry);\n}\n\nstatic u32 GetEnigmaBerryChecksum(struct EnigmaBerry * enigmaBerry)\n{\n    const u8 * src = (const u8 *)enigmaBerry;\n    u32 result = 0;\n    u32 i;\n\n    for (i = 0; i < offsetof(struct EnigmaBerry, checksum); i++)\n        result += src[i];\n\n    return result;\n}\n\nbool32 IsEnigmaBerryValid(void)\n{\n    if (gSaveBlock1Ptr->enigmaBerry.berry.stageDuration == 0)\n        return FALSE;\n    if (gSaveBlock1Ptr->enigmaBerry.berry.maxYield == 0)\n        return FALSE;\n    if (GetEnigmaBerryChecksum(&gSaveBlock1Ptr->enigmaBerry) != gSaveBlock1Ptr->enigmaBerry.checksum)\n        return FALSE;\n\n    return TRUE;\n}\n\nconst struct Berry * GetBerryInfo(u8 berryIdx)\n{\n    if (berryIdx == ITEM_TO_BERRY(ITEM_ENIGMA_BERRY) && IsEnigmaBerryValid())\n        return (struct Berry *)&gSaveBlock1Ptr->enigmaBerry.berry;\n\n    if (berryIdx == 0 || berryIdx > ITEM_TO_BERRY(ITEM_ENIGMA_BERRY))\n        berryIdx = 1;\n\n    return &gBerries[berryIdx - 1];\n}\n\nu8 ItemIdToBerryType(u16 itemId)\n{\n    if (itemId - FIRST_BERRY_INDEX < 0 || itemId - FIRST_BERRY_INDEX > ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX)\n        return 1;\n\n    return ITEM_TO_BERRY(itemId);\n}\n\nu16 BerryTypeToItemId(u16 berryType)\n{\n    if (berryType - 1 < 0 || berryType - 1 > ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX)\n        return FIRST_BERRY_INDEX;\n\n    return berryType + FIRST_BERRY_INDEX - 1;\n}\n\nvoid GetBerryNameByBerryType(u8 berryType, u8 * dest)\n{\n    const struct Berry * berry = GetBerryInfo(berryType);\n    memcpy(dest, berry->name, 6);\n    dest[6] = EOS;\n}\n"
  },
  {
    "path": "src/berry_crush.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"berry.h\"\n#include \"berry_crush.h\"\n#include \"berry_pouch.h\"\n#include \"berry_powder.h\"\n#include \"decompress.h\"\n#include \"digit_obj_util.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"graphics.h\"\n#include \"item.h\"\n#include \"item_menu.h\"\n#include \"item_menu_icons.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"list_menu.h\"\n#include \"math_util.h\"\n#include \"menu.h\"\n#include \"minigame_countdown.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"random.h\"\n#include \"save.h\"\n#include \"scanline_effect.h\"\n#include \"script.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"text_window.h\"\n#include \"trig.h\"\n#include \"constants/songs.h\"\n#include \"constants/items.h\"\n\n#define MAX_TIME (10 * 60 * 60) // Timer can go up to 9:59:59\n\n#define TAG_CRUSHER_BASE  1\n#define PALTAG_EFFECT     2 // The next two gfx tags share this pal tag\n#define GFXTAG_IMPACT     2\n#define GFXTAG_SPARKLE    3\n#define TAG_TIMER_DIGITS  4\n#define TAG_PLAYER1_BERRY 5\n#define TAG_PLAYER2_BERRY 6\n#define TAG_PLAYER3_BERRY 7\n#define TAG_PLAYER4_BERRY 8\n#define TAG_PLAYER5_BERRY 9\n\n#define TAG_COUNTDOWN 0x1000\n\n#define CRUSHER_START_Y (-104)\n\nenum {\n    RUN_CMD,\n    SCHEDULE_CMD,\n};\n\nenum {\n    MSG_PICK_BERRY,\n    MSG_WAIT_PICK,\n    MSG_POWDER,\n    MSG_SAVING,\n    MSG_PLAY_AGAIN,\n    MSG_NO_BERRIES,\n    MSG_DROPPED,\n    MSG_TIMES_UP,\n    MSG_COMM_STANDBY,\n};\n\nenum {\n    CMD_NONE = 0,\n    CMD_FADE,\n    CMD_WAIT_FADE,\n    CMD_PRINT_MSG,\n    CMD_SHOW_GAME,\n    CMD_HIDE_GAME,\n    CMD_READY_BEGIN,\n    CMD_ASK_PICK_BERRY,\n    CMD_PICK_BERRY,\n    CMD_WAIT_BERRIES,\n    CMD_DROP_BERRIES,\n    CMD_DROP_LID,\n    CMD_COUNTDOWN,\n    CMD_PLAY_GAME_LEADER,\n    CMD_PLAY_GAME_MEMBER,\n    CMD_FINISH_GAME,\n    CMD_TIMES_UP,\n    CMD_CALC_RESULTS,\n    CMD_SHOW_RESULTS,\n    CMD_SAVE,\n    CMD_ASK_PLAY_AGAIN,\n    CMD_COMM_PLAY_AGAIN,\n    CMD_PLAY_AGAIN_YES,\n    CMD_PLAY_AGAIN_NO,\n    CMD_CLOSE_LINK,\n    CMD_QUIT,\n};\n\n// Args for Cmd_BeginNormalPaletteFade\n#define bSelectedPals(i)  args[0 + i]\n#define bDelay            args[4]\n#define bStartY           args[5]\n#define bTargetY          args[6]\n#define bPalette(i)       args[7 + i]\n#define bCommunicateAfter args[9]\n\n// Args for Cmd_WaitPaletteFade\n#define bWaitFadeCommAfter args[0]\n\n// Args for Cmd_PrintMessage\n#define bMsgId        args[0]\n#define bFlags        args[1]\n#define bKeys(i)      args[2 + i]\n#define bNextCmdState args[4]\n\n#define F_MSG_CLEAR  (1 << 0)\n#define F_MSG_EXPAND (1 << 1)\n\n// Main states for the game. Many are assigned but never checked\nenum {\n    STATE_INIT = 1,\n    STATE_RESET,\n    STATE_PICK_BERRY,\n    STATE_DROP_BERRIES,\n    STATE_DROP_LID,\n    STATE_COUNTDOWN,\n    STATE_PLAYING,\n    STATE_FINISHED,\n    STATE_TIMES_UP,\n    STATE_10, // Unused\n    STATE_RESULTS_PRESSES,\n    STATE_RESULTS_RANDOM,\n    STATE_RESULTS_CRUSHING,\n    STATE_14, // Unused\n    STATE_PLAY_AGAIN,\n};\n\n#define RESULTS_STATE_START STATE_RESULTS_PRESSES\n#define RESULTS_STATE_END   STATE_RESULTS_CRUSHING\n\n// IDs for each results page that shows in succession at the game's end.\n// Only 3 pages are shown for a given game. Presses and Crushing are always shown 1st and 3rd.\n// The 2nd page is random, and can be rankings for either Neatness, Cooperative, or Power.\nenum {\n    RESULTS_PAGE_PRESSES,\n    RESULTS_PAGE_RANDOM,\n    RESULTS_PAGE_CRUSHING,\n    NUM_RESULTS_PAGES,\n};\n// Random pages, see above\n// \"Neatness\" is how many of the player's inputs were at a regular interval\n// \"Cooperative\" is how often the player pressed A at the same time as others\n// \"Power\" is how much of the time the player spent pressing A\nenum {\n    RESULTS_PAGE_NEATNESS,\n    RESULTS_PAGE_COOPERATIVE,\n    RESULTS_PAGE_POWER,\n    NUM_RANDOM_RESULTS_PAGES\n};\n\n#define PLAY_AGAIN_YES        0\n#define PLAY_AGAIN_NO         1\n#define PLAY_AGAIN_NO_BERRIES 3\n\nenum {\n    COLORID_GRAY,\n    COLORID_BLACK,\n    COLORID_LIGHT_GRAY,\n    COLORID_BLUE,\n    COLORID_GREEN,\n    COLORID_RED,\n};\n\n// Flags for the inputFlags field\n// Field is 16 bits; 3 bits for each player, last bit is unused\n// The first two bits are interchangeable\n// Needlessly complicated system, the inputState field is sufficient by itself\n#define F_INPUT_HIT_A (1 << 0)\n#define F_INPUT_HIT_B (1 << 1)\n#define F_INPUT_HIT_SYNC (1 << 2) // Input at same time as another player\n#define INPUT_FLAGS_PER_PLAYER 3\n#define INPUT_FLAG_MASK ((1 << INPUT_FLAGS_PER_PLAYER) - 1)\n\n// Values for the inputState field\nenum {\n    INPUT_STATE_NONE,\n    INPUT_STATE_HIT,      // Hit the crusher\n    INPUT_STATE_HIT_SYNC, // Hit the crusher at same time as another player\n};\n\n// No reason for this to be 2\n// Simply a flag for whether a given player has sent their data this round\n// Data is only sent if the player is the leader or if they pressed A\n#define SEND_GAME_STATE 2\n\nstruct BerryCrushGame_Player\n{\n    u8 name[PLAYER_NAME_LENGTH + 1 + 4];\n    u16 berryId;\n    u16 inputTime;\n    u16 neatInputStreak;\n    u16 timeSincePrevInput;\n    u16 maxNeatInputStreak;\n    u16 numAPresses;\n    u16 numSyncedAPresses;\n    u16 timePressingA;\n    u8 inputFlags;\n    u8 inputState;\n};\n\nstruct BerryCrushGame_LocalState\n{\n    u16 sendFlag;\n    bool8 endGame:1;\n    bool8 bigSparkle:1;\n    bool8 pushedAButton:1;\n    u8 playerPressedAFlags:5;\n    s8 vibration;\n    u16 depth;\n    u16 timer;\n    u16 inputFlags;\n    u16 sparkleAmount;\n};\n\nstruct BerryCrushGame_LinkState\n{\n    u16 rfuCmd;\n    u16 sendFlag;\n    bool8 endGame:1;\n    bool8 bigSparkle:1;\n    bool8 pushedAButton:1;\n    u8 playerPressedAFlags:5;\n    s8 vibration;\n    u16 depth;\n    u16 timer;\n    u16 inputFlags;\n    u16 sparkleAmount;\n};\n\n// Flags for the inputFlags field\n// Field is 16 bits; 3 bits for each player, last bit is unused\n// The first two bits are interchangeable\n// Needlessly complicated system, the inputState field is sufficient by itself\n#define F_INPUT_HIT_A (1 << 0)\n#define F_INPUT_HIT_B (1 << 1)\n#define F_INPUT_HIT_SYNC (1 << 2) // Input at same time as another player\n#define INPUT_FLAGS_PER_PLAYER 3\n#define INPUT_FLAG_MASK ((1 << INPUT_FLAGS_PER_PLAYER) - 1)\n\nstruct BerryCrushGame_Results\n{\n    u32 powder;\n    u16 time;\n    u16 targetPressesPerSec; // Never read\n    u16 silkiness;\n    u16 totalAPresses;\n    u16 stats[2][MAX_RFU_PLAYERS];\n    u8 playerIdsRanked[2][MAX_RFU_PLAYERS + 3];\n};\n\n// playerIdsRanked above has 3 additional elements after the players.\n// Only 1 of these 2*3 is ever used, and it stores the id for which\n// random results page to show. Its define below is for readability.\n#define randomPageId playerIdsRanked[0][7]\n\nstruct BerryCrushPlayerCoords\n{\n    u8 playerId;\n    u8 windowGfxX;\n    u8 windowGfxY;\n    s16 impactXOffset;\n    s16 impactYOffset;\n    s16 berryXOffset;\n    s16 berryXDest;\n};\n\nstruct BerryCrushGame_Gfx\n{\n    u8 counter;\n    u8 vibrationIdx;\n    u8 numVibrations;\n    bool8 vibrating;\n    s16 minutes;\n    s16 secondsInt;\n    s16 secondsFrac;\n    const struct BerryCrushPlayerCoords *playerCoords[MAX_RFU_PLAYERS];\n    struct Sprite *coreSprite;\n    struct Sprite *impactSprites[MAX_RFU_PLAYERS];\n    struct Sprite *berrySprites[MAX_RFU_PLAYERS];\n    struct Sprite *sparkleSprites[11];\n    struct Sprite *timerSprites[2];\n    u8 resultsState;\n    u8 unused;\n    u8 resultsWindowId;\n    u8 nameWindowIds[MAX_RFU_PLAYERS];\n    u16 bgBuffers[4][BG_SCREEN_SIZE];\n};\n\nstruct BerryCrushGame;\n\ntypedef u32 (*CmdFunc)(struct BerryCrushGame * game, u8 * args);\n\nstruct BerryCrushGame\n{\n    MainCallback savedCallback;\n    CmdFunc cmdCallback;\n    u8 localId;\n    u8 playerCount;\n    u8 mainTask;\n    u8 textSpeed;\n    u8 cmdState;\n    u8 unused; // Never read\n    u8 nextCmd;\n    u8 afterPalFadeCmd;\n    u16 cmdTimer;\n    u16 gameState;\n    u16 playAgainState;\n    u16 pressingSpeed;\n    s16 targetAPresses;\n    s16 totalAPresses;\n    s32 powder;\n    s32 targetDepth;\n    u8 newDepth;\n    bool8 noRoomForPowder:1; // Never read\n    bool8 newRecord:1;\n    bool8 playedSound:1;\n    bool8 endGame:1;\n    bool8 bigSparkle:1;\n    u8 sparkleAmount:3;\n    u16 leaderTimer;\n    u16 timer;\n    s16 depth;\n    s16 vibration;\n    s16 bigSparkleCounter;\n    s16 numBigSparkles;\n    s16 numBigSparkleChecks;\n    s16 sparkleCounter;\n    u8 commandParams[12];\n    u16 sendCmd[6];\n    u16 recvCmd[7];\n    struct BerryCrushGame_LocalState localState;\n    struct BerryCrushGame_Results results;\n    struct BerryCrushGame_Player players[5];\n    struct BerryCrushGame_Gfx gfx;\n};\n\nstatic EWRAM_DATA struct BerryCrushGame *sGame = NULL;\n\nstatic void SetNamesAndTextSpeed(struct BerryCrushGame *game);\nstatic void GetBerryFromBag(void);\nstatic void VBlankCB(void);\nstatic void MainCB(void);\nstatic void MainTask(u8 taskId);\nstatic u32 Cmd_BeginNormalPaletteFade(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_WaitPaletteFade(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_PrintMessage(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_ShowGameDisplay(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_HideGameDisplay(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_SignalReadyToBegin(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_AskPickBerry(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_GoToBerryPouch(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_WaitForOthersToPickBerries(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_DropBerriesIntoCrusher(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_DropLid(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_Countdown(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_PlayGame_Leader(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_PlayGame_Member(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_FinishGame(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_HandleTimeUp(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_TabulateResults(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_ShowResults(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_SaveGame(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_AskPlayAgain(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_CommunicatePlayAgainResponses(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_PlayAgain(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_StopGame(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_CloseLink(struct BerryCrushGame * game, u8 *args);\nstatic u32 Cmd_Quit(struct BerryCrushGame * game, u8 *args);\nstatic void ResetGame(struct BerryCrushGame * game);\nstatic void SetPrintMessageArgs(u8 *args, u8 stringId, u8 flags, u16 waitKeys, u8 followupCmd);\nstatic void FramesToMinSec(struct BerryCrushGame_Gfx * gfx, u16 frames);\nstatic void PrintTextCentered(u8 windowId, u8 left, u8 colorId, const u8 *string);\nstatic void PrintResultsText(struct BerryCrushGame * game, u8 command, u8 x, u8 y);\nstatic void printCrushingResults(struct BerryCrushGame * game);\nstatic void Task_ShowBerryCrushRankings(u8 r4);\nstatic void PrintTimer(struct BerryCrushGame_Gfx * gfx, u16 frames);\nstatic void CreatePlayerNameWindows(struct BerryCrushGame * game);\nstatic void DrawPlayerNameWindows(struct BerryCrushGame * game);\nstatic void CopyPlayerNameWindowGfxToBg(struct BerryCrushGame * game);\nstatic void CreateGameSprites(struct BerryCrushGame * game);\nstatic void DestroyGameSprites(struct BerryCrushGame * game);\nstatic void SpriteCB_Impact(struct Sprite *sprite);\nstatic void SpriteCB_Sparkle_End(struct Sprite *sprite);\nstatic void SpriteCB_Sparkle(struct Sprite *sprite);\nstatic void SpriteCB_Sparkle_Init(struct Sprite *sprite);\nstatic struct BerryCrushGame *GetBerryCrushGame(void);\nstatic u32 QuitBerryCrush(MainCallback callback);\nstatic void ChooseBerry(void);\nstatic void BerryCrush_SetVBlankCallback(void);\nstatic void BerryCrush_InitVBlankCB(void);\nstatic void SaveResults(void);\nstatic void RunOrScheduleCommand(u16 command, u8 runMode, u8 *args);\nstatic void SetPaletteFadeArgs(u8 *args, bool8 communicateAfter, u32 selectedPals, s8 delay, u8 startY, u8 targetY, u16 palette);\nstatic s32 UpdateGame(struct BerryCrushGame *game);\nstatic s32 ShowGameDisplay(void);\nstatic s32 HideGameDisplay(void);\nstatic void CreateBerrySprites(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *spritesManager);\nstatic void BerryCrushFreeBerrySpriteGfx(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *gfx);\nstatic void UpdateInputEffects(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *gfx);\nstatic bool32 AreEffectsFinished(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *gfx);\nstatic bool32 OpenResultsWindow(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *spriteManager);\nstatic void CloseResultsWindow(struct BerryCrushGame *game);\nstatic void ResetCrusherPos(struct BerryCrushGame *game);\nstatic void HideTimer(struct BerryCrushGame_Gfx *gfx);\nstatic void SpriteCB_DropBerryIntoCrusher(struct Sprite *sprite);\n\nstatic const u8 sBitTable[] = {\n    1 << 0,\n    1 << 1,\n    1 << 2,\n    1 << 3,\n    1 << 4,\n    1 << 5,\n    1 << 6,\n    1 << 7,\n};\n\n// Additional A presses are counted depending on the number of players\n// The bonus of 5 is unobtainable\nstatic const u8 sSyncPressBonus[MAX_RFU_PLAYERS] = {0, 1, 2, 3, 5 };\n\nALIGNED(4)\nstatic const s8 sIntroOutroVibrationData[][7] = {\n    {  4,  1,  0, -1,  0,  0,  0},\n    {  4,  2,  0, -1,  0,  0,  0},\n    {  4,  2,  0, -2,  0,  0,  0},\n    {  6,  3,  1, -1, -3, -1,  0},\n    {  6,  4,  1, -2, -4, -2,  0},\n};\n\nALIGNED(4)\nconst u8 sVibrationData[MAX_RFU_PLAYERS][4] = {\n    { 3, 2, 1, 0},\n    { 3, 3, 1, 0},\n    { 3, 3, 2, 0},\n    { 3, 4, 2, 0},\n    { 3, 5, 3, 0}\n};\n\nstatic const u8 *const sMessages[] = {\n    [MSG_PICK_BERRY]   = gText_BerryCrush_AreYouReady,\n    [MSG_WAIT_PICK]    = gText_BerryCrush_WaitForOthersToChooseBerry,\n    [MSG_POWDER]       = gText_BerryCrush_GainedXUnitsOfPowder,\n    [MSG_SAVING]       = gText_BerryCrush_RecordingGameResults,\n    [MSG_PLAY_AGAIN]   = gText_BerryCrush_WantToPlayAgain,\n    [MSG_NO_BERRIES]   = gText_BerryCrush_NoBerries,\n    [MSG_DROPPED]      = gText_BerryCrush_MemberDroppedOut,\n    [MSG_TIMES_UP]     = gText_BerryCrush_TimeUp,\n    [MSG_COMM_STANDBY] = gText_BerryCrush_CommunicationStandby\n};\n\nstatic u32 (*const sBerryCrushCommands[])(struct BerryCrushGame * berryCrushGame, u8 *args) = {\n    [CMD_NONE]             = NULL,\n    [CMD_FADE]             = Cmd_BeginNormalPaletteFade,\n    [CMD_WAIT_FADE]        = Cmd_WaitPaletteFade,\n    [CMD_PRINT_MSG]        = Cmd_PrintMessage,\n    [CMD_SHOW_GAME]        = Cmd_ShowGameDisplay,\n    [CMD_HIDE_GAME]        = Cmd_HideGameDisplay,\n    [CMD_READY_BEGIN]      = Cmd_SignalReadyToBegin,\n    [CMD_ASK_PICK_BERRY]   = Cmd_AskPickBerry,\n    [CMD_PICK_BERRY]       = Cmd_GoToBerryPouch,\n    [CMD_WAIT_BERRIES]     = Cmd_WaitForOthersToPickBerries,\n    [CMD_DROP_BERRIES]     = Cmd_DropBerriesIntoCrusher,\n    [CMD_DROP_LID]         = Cmd_DropLid,\n    [CMD_COUNTDOWN]        = Cmd_Countdown,\n    [CMD_PLAY_GAME_LEADER] = Cmd_PlayGame_Leader,\n    [CMD_PLAY_GAME_MEMBER] = Cmd_PlayGame_Member,\n    [CMD_FINISH_GAME]      = Cmd_FinishGame,\n    [CMD_TIMES_UP]         = Cmd_HandleTimeUp,\n    [CMD_CALC_RESULTS]     = Cmd_TabulateResults,\n    [CMD_SHOW_RESULTS]     = Cmd_ShowResults,\n    [CMD_SAVE]             = Cmd_SaveGame,\n    [CMD_ASK_PLAY_AGAIN]   = Cmd_AskPlayAgain,\n    [CMD_COMM_PLAY_AGAIN]  = Cmd_CommunicatePlayAgainResponses,\n    [CMD_PLAY_AGAIN_YES]   = Cmd_PlayAgain,\n    [CMD_PLAY_AGAIN_NO]    = Cmd_StopGame,\n    [CMD_CLOSE_LINK]       = Cmd_CloseLink,\n    [CMD_QUIT]             = Cmd_Quit\n};\n\nstatic const u8 sSparkleThresholds[MAX_RFU_PLAYERS - 1][4] = {\n    {2,  4,  6,  7}, // 2 players\n    {3,  5,  8, 11}, // 3 players\n    {3,  7, 11, 15}, // 4 players\n    {4,  8, 12, 17}, // 5 players\n};\n\nstatic const u8 sBigSparkleThresholds[MAX_RFU_PLAYERS - 1] = {5, 7, 9, 12};\n\nstatic const u8 sReceivedPlayerBitmasks[MAX_RFU_PLAYERS - 1] = {0x03, 0x07, 0x0F, 0x1F};\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 15,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x0000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 13,\n        .screenSize = 2,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x0000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 12,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x0000\n    }, {\n        .bg = 3,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 11,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x0000\n    }\n};\n\nstatic const u8 sBerryCrushTextColorTable[][3] = {\n    [COLORID_GRAY] =       { TEXT_COLOR_WHITE,       TEXT_COLOR_DARK_GRAY,  TEXT_COLOR_LIGHT_GRAY },\n    [COLORID_BLACK] =      { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE,      TEXT_COLOR_DARK_GRAY },\n    [COLORID_LIGHT_GRAY] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_RED },\n    [COLORID_BLUE] =       { TEXT_COLOR_WHITE,       TEXT_COLOR_BLUE,       TEXT_COLOR_LIGHT_BLUE },\n    [COLORID_GREEN] =      { TEXT_COLOR_WHITE,       TEXT_COLOR_GREEN,      TEXT_COLOR_LIGHT_GREEN },\n    [COLORID_RED] =        { TEXT_COLOR_WHITE,       TEXT_COLOR_RED,        TEXT_COLOR_LIGHT_RED }\n};\n\nstatic const struct WindowTemplate sWindowTemplate_BerryCrushRankings = {\n    .bg = 0,\n    .tilemapLeft = 3,\n    .tilemapTop = 4,\n    .width = 24,\n    .height = 13,\n    .paletteNum = 15,\n    .baseBlock = 0x001\n};\n\nstatic const struct WindowTemplate sWindowTemplates_PlayerNames[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 9,\n        .height = 2,\n        .paletteNum = 8,\n        .baseBlock = 0x3ed\n    }, {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 3,\n        .width = 9,\n        .height = 2,\n        .paletteNum = 8,\n        .baseBlock = 0x3db\n    }, {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 6,\n        .width = 9,\n        .height = 2,\n        .paletteNum = 8,\n        .baseBlock = 0x3c9\n    }, {\n        .bg = 0,\n        .tilemapLeft = 21,\n        .tilemapTop = 3,\n        .width = 9,\n        .height = 2,\n        .paletteNum = 8,\n        .baseBlock = 0x3b7\n    }, {\n        .bg = 0,\n        .tilemapLeft = 21,\n        .tilemapTop = 6,\n        .width = 9,\n        .height = 2,\n        .paletteNum = 8,\n        .baseBlock = 0x3a5\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sWindowTemplates_Results[] = {\n\n    [STATE_RESULTS_PRESSES - RESULTS_STATE_START] = {\n        .bg = 0,\n        .tilemapLeft = 4,\n        .tilemapTop = 2,\n        .width = 22,\n        .height = 16,\n        .paletteNum = 15,\n\t    .baseBlock = 0x001\n    },\n    [STATE_RESULTS_RANDOM - RESULTS_STATE_START] = {\n        .bg = 0,\n        .tilemapLeft = 4,\n        .tilemapTop = 2,\n        .width = 22,\n        .height = 16,\n        .paletteNum = 15,\n\t    .baseBlock = 0x001\n    },\n    [STATE_RESULTS_CRUSHING - RESULTS_STATE_START] = {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 2,\n        .width = 24,\n        .height = 16,\n        .paletteNum = 15,\n\t    .baseBlock = 0x001\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const u8 sResultsWindowHeights[][MAX_RFU_PLAYERS - 1] = {\n    {  6,  8,  9, 11 },  // \"Presses\" and \"Neatness/Cooperative/Power\" pages\n    { 12, 14, 15, 16 },  // \"Crushing\" page\n};\n\nstatic const u32 sPressingSpeedConversionTable[] = {\n    // Hundred-millionths of a second\n    50000000, // 50\n    25000000, // 25\n    12500000, // 12.5\n     6250000, //  6.25\n     3125000, //  3.125\n     1562500, //  1.5625\n      781250, //  0.78125\n      390625  //  0.390625\n};\n\nstatic const u16 sBerryCrushCorePal[] = INCBIN_U16(\"graphics/berry_crush/crusher_base.gbapal\");\nstatic const u16 sBerryCrushImpactAndSparklesPal[] = INCBIN_U16(\"graphics/berry_crush/impact.gbapal\");\nstatic const u16 sBerryCrushTimerPal[] = INCBIN_U16(\"graphics/berry_crush/timer_digits.gbapal\");\n\nstatic const u32 sBerryCrushCoreTiles[] = INCBIN_U32(\"graphics/berry_crush/crusher_base.4bpp.lz\");\nstatic const u32 sBerryCrushImpactTiles[] = INCBIN_U32(\"graphics/berry_crush/impact.4bpp.lz\");\nstatic const u32 sBerryCrushPowderSparklesTiles[] = INCBIN_U32(\"graphics/berry_crush/sparkle.4bpp.lz\");\nstatic const u32 sBerryCrushTimerTiles[] = INCBIN_U32(\"graphics/berry_crush/timer_digits.4bpp.lz\");\n\nstatic const u32 sCrusherTop_Tilemap[] = INCBIN_U32(\"graphics/berry_crush/crusher_top.bin.lz\");\nstatic const u32 sContainerCap_Tilemap[] = INCBIN_U32(\"graphics/berry_crush/container_cap.bin.lz\");\nstatic const u32 sBg_Tilemap[] = INCBIN_U32(\"graphics/berry_crush/bg.bin.lz\");\n\n// Takes the number of players - 2 and a player id and returns the\n// index into sPlayerCoords where that player should be seated\nstatic const u8 sPlayerIdToPosId[MAX_RFU_PLAYERS - 1][MAX_RFU_PLAYERS] = {\n    {1, 3},\n    {0, 1, 3},\n    {1, 3, 2, 4},\n    {0, 1, 3, 2, 4}\n};\n\nstatic const struct BerryCrushPlayerCoords sPlayerCoords[] = {\n    {\n        .playerId = 0,\n        .windowGfxX = 0,\n        .windowGfxY = 0,\n        .impactXOffset = 0,\n        .impactYOffset = -16,\n        .berryXOffset = 0,\n        .berryXDest = 0\n    },\n    {\n        .playerId = 1,\n        .windowGfxX = 0,\n        .windowGfxY = 3,\n        .impactXOffset = -28,\n        .impactYOffset = -4,\n        .berryXOffset = -24,\n        .berryXDest = 16\n    },\n    {\n        .playerId = 2,\n        .windowGfxX = 0,\n        .windowGfxY = 6,\n        .impactXOffset = -16,\n        .impactYOffset = 20,\n        .berryXOffset = -8,\n        .berryXDest = 16\n    },\n    {\n        .playerId = 3,\n        .windowGfxX = 20,\n        .windowGfxY = 3,\n        .impactXOffset = 28,\n        .impactYOffset = -4,\n        .berryXOffset = 32,\n        .berryXDest = -8\n    },\n    {\n        .playerId = 4,\n        .windowGfxX = 20,\n        .windowGfxY = 6,\n        .impactXOffset = 16,\n        .impactYOffset = 20,\n        .berryXOffset = 16,\n        .berryXDest = -8\n    },\n};\n\nstatic const s8 sImpactCoords[][2] = {\n    { 0,  0},\n    {-1,  0},\n    { 1,  1}\n};\n\nstatic const s8 sSparkleCoords[][2] = {\n    {  0,   0},\n    {-16,  -4},\n    { 16,  -4},\n    { -8,  -2},\n    {  8,  -2},\n    {-24,  -8},\n    { 24,  -8},\n    {-32, -12},\n    { 32, -12},\n    {-40, -16},\n    { 40, -16}\n};\n\nstatic const u16 sPlayerBerrySpriteTags[] = {\n    TAG_PLAYER1_BERRY,\n    TAG_PLAYER2_BERRY,\n    TAG_PLAYER3_BERRY,\n    TAG_PLAYER4_BERRY,\n    TAG_PLAYER5_BERRY,\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheets[] = {\n    {sBerryCrushCoreTiles, 0x0800, TAG_CRUSHER_BASE},\n    {sBerryCrushImpactTiles, 0x0e00, GFXTAG_IMPACT},\n    {sBerryCrushPowderSparklesTiles, 0x0700, GFXTAG_SPARKLE},\n    {sBerryCrushTimerTiles, 0x02c0, TAG_TIMER_DIGITS},\n    {}\n};\n\nstatic const struct SpritePalette sSpritePals[] = {\n    {sBerryCrushCorePal,              TAG_CRUSHER_BASE},\n    {sBerryCrushImpactAndSparklesPal, PALTAG_EFFECT},\n    {sBerryCrushTimerPal,             TAG_TIMER_DIGITS},\n    {}\n};\n\nstatic const union AnimCmd sAnim_CrusherBase[] = {\n    ANIMCMD_FRAME(0x00, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Impact_Small[] = {\n    ANIMCMD_FRAME(0x00, 4),\n    ANIMCMD_FRAME(0x10, 4),\n    ANIMCMD_FRAME(0x20, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Impact_Big[] = {\n    ANIMCMD_FRAME(0x30, 2),\n    ANIMCMD_FRAME(0x40, 2),\n    ANIMCMD_FRAME(0x50, 2),\n    ANIMCMD_FRAME(0x60, 2),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Sparkle_Small[] = {\n    ANIMCMD_FRAME(0x00, 2),\n    ANIMCMD_FRAME(0x04, 2),\n    ANIMCMD_FRAME(0x08, 2),\n    ANIMCMD_FRAME(0x0c, 2),\n    ANIMCMD_FRAME(0x10, 2),\n    ANIMCMD_FRAME(0x14, 2),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Sparkle_Big[] = {\n    ANIMCMD_FRAME(0x18, 4),\n    ANIMCMD_FRAME(0x1c, 4),\n    ANIMCMD_FRAME(0x20, 4),\n    ANIMCMD_FRAME(0x24, 4),\n    ANIMCMD_FRAME(0x28, 4),\n    ANIMCMD_FRAME(0x2c, 4),\n    ANIMCMD_FRAME(0x30, 4),\n    ANIMCMD_FRAME(0x34, 4),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Timer[] = {\n    ANIMCMD_FRAME(0x14, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_PlayerBerry[] = {\n    ANIMCMD_FRAME(0x00, 0),\n    ANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_PlayerBerry_0[] = {\n    AFFINEANIMCMD_FRAME(Q_8_8(1.0), Q_8_8(1.0), 0, 0),\n    AFFINEANIMCMD_FRAME(0, 0, 2, 1),\n    AFFINEANIMCMD_JUMP(1)\n};\n\nstatic const union AffineAnimCmd sAffineAnim_PlayerBerry_1[] = {\n    AFFINEANIMCMD_FRAME(Q_8_8(1.0), Q_8_8(1.0), 0, 0),\n    AFFINEANIMCMD_FRAME(0, 0, -2, 1),\n    AFFINEANIMCMD_JUMP(1)\n};\n\nstatic const union AnimCmd *const sAnimTable_BerryCrushCore[] = {\n    sAnim_CrusherBase\n};\n\nstatic const union AnimCmd *const sAnimTable_BerryCrushImpact[] = {\n    sAnim_Impact_Small,\n    sAnim_Impact_Big\n};\n\nstatic const union AnimCmd *const sAnimTable_BerryCrushPowderSparkles[] = {\n    sAnim_Sparkle_Small,\n    sAnim_Sparkle_Big\n};\n\nstatic const union AnimCmd *const sAnimTable_BerryCrushTimer[] = {\n    sAnim_Timer\n};\n\nstatic const union AnimCmd *const sAnimTable_PlayerBerry[] = {\n    sAnim_PlayerBerry\n};\n\nstatic const union AffineAnimCmd *const sAffineAnimTable_PlayerBerry[] = {\n    sAffineAnim_PlayerBerry_0,\n    sAffineAnim_PlayerBerry_1\n};\n\n\nstatic const struct SpriteTemplate sSpriteTemplate_BerryCrushCore = {\n    .tileTag = TAG_CRUSHER_BASE,\n    .paletteTag = TAG_CRUSHER_BASE,\n    .oam = &gOamData_AffineOff_ObjNormal_64x64,\n    .anims = sAnimTable_BerryCrushCore,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_BerryCrushImpact = {\n    .tileTag = GFXTAG_IMPACT,\n    .paletteTag = PALTAG_EFFECT,\n    .oam = &gOamData_AffineOff_ObjNormal_32x32,\n    .anims = sAnimTable_BerryCrushImpact,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_Impact\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_BerryCrushPowderSparkles = {\n    .tileTag = GFXTAG_SPARKLE,\n    .paletteTag = PALTAG_EFFECT,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = sAnimTable_BerryCrushPowderSparkles,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_BerryCrushTimer = {\n    .tileTag = TAG_TIMER_DIGITS,\n    .paletteTag = TAG_TIMER_DIGITS,\n    .oam = &gOamData_AffineOff_ObjNormal_8x16,\n    .anims = sAnimTable_BerryCrushTimer,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_PlayerBerry = {\n    .tileTag = TAG_PLAYER1_BERRY,\n    .paletteTag = TAG_PLAYER1_BERRY,\n    .oam = &gOamData_AffineDouble_ObjNormal_32x32,\n    .anims = sAnimTable_PlayerBerry,\n    .affineAnims = sAffineAnimTable_PlayerBerry,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct DigitObjUtilTemplate sDigitObjTemplates[] = {\n    {\n        .strConvMode = 1,\n        .shape = SPRITE_SHAPE(8x16),\n        .size = SPRITE_SIZE(8x16),\n        .priority = 0,\n        .oamCount = 2,\n        .xDelta = 8,\n        .x = 156,\n        .y = 0,\n        .spriteSheet = {.compressed = &sSpriteSheets[3]},\n        .spritePal = &sSpritePals[2],\n    }, {\n        .strConvMode = 0,\n        .shape = SPRITE_SHAPE(8x16),\n        .size = SPRITE_SIZE(8x16),\n        .priority = 0,\n        .oamCount = 2,\n        .xDelta = 8,\n        .x = 180,\n        .y = 0,\n        .spriteSheet = {.compressed = &sSpriteSheets[3]},\n        .spritePal = &sSpritePals[2],\n    }, {\n        .strConvMode = 0,\n        .shape = SPRITE_SHAPE(8x16),\n        .size = SPRITE_SIZE(8x16),\n        .priority = 0,\n        .oamCount = 2,\n        .xDelta = 8,\n        .x = 204,\n        .y = 0,\n        .spriteSheet = {.compressed = &sSpriteSheets[3]},\n        .spritePal = &sSpritePals[2],\n    }\n};\n\nstatic const u8 *const sBCRankingHeaders[] = {\n    [RESULTS_PAGE_PRESSES]  = gText_SpaceTimes2,\n    [RESULTS_PAGE_RANDOM]   = gText_XDotY,\n    [RESULTS_PAGE_CRUSHING] = gText_StrVar1Berry,\n\n    [RESULTS_PAGE_NEATNESS + NUM_RESULTS_PAGES]    = gText_NeatnessRankings,\n    [RESULTS_PAGE_COOPERATIVE + NUM_RESULTS_PAGES] = gText_CooperativeRankings,\n    [RESULTS_PAGE_POWER + NUM_RESULTS_PAGES]       = gText_PressingPowerRankings\n};\n\nstatic struct BerryCrushGame *GetBerryCrushGame(void)\n{\n    return sGame;\n}\n\nstatic u32 QuitBerryCrush(MainCallback callback)\n{\n    if (sGame == NULL)\n        return 2;\n\n    if (callback == NULL)\n        callback = sGame->savedCallback;\n\n    DestroyTask(sGame->mainTask);\n    FREE_AND_SET_NULL(sGame);\n    SetMainCallback2(callback);\n    if (callback == CB2_ReturnToField)\n    {\n        PlayNewMapMusic(MUS_POKE_CENTER);\n        SetMainCallback1(CB1_Overworld);\n    }\n\n    return 0;\n}\n\n#define ERROR_EXIT(exitCallback)        \\\n    {                                   \\\n        SetMainCallback2(exitCallback); \\\n        gRfu.errorParams[0] = 0;        \\\n        gRfu.errorParams[1] = 0;        \\\n        gRfu.errorState = 1;            \\\n    }\n\n\nvoid StartBerryCrush(MainCallback callback)\n{\n    u8 playerCount = 0;\n    u8 multiplayerId;\n\n    if (!gReceivedRemoteLinkPlayers || gWirelessCommType == 0)\n    {\n        ERROR_EXIT(callback);\n        return;\n    }\n\n    playerCount = GetLinkPlayerCount();\n    multiplayerId = GetMultiplayerId();\n    if (playerCount < 2 || multiplayerId >= playerCount)\n    {\n        ERROR_EXIT(callback);\n        return;\n    }\n\n    sGame = AllocZeroed(sizeof(struct BerryCrushGame));\n    if (!sGame)\n    {\n        ERROR_EXIT(callback);\n        return;\n    }\n\n    sGame->savedCallback = callback;\n    sGame->localId = multiplayerId;\n    sGame->playerCount = playerCount;\n    SetNamesAndTextSpeed(sGame);\n    sGame->gameState = STATE_INIT;\n    sGame->nextCmd = CMD_FADE;\n    sGame->afterPalFadeCmd = CMD_READY_BEGIN;\n    SetPaletteFadeArgs(sGame->commandParams, TRUE, PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n    RunOrScheduleCommand(CMD_SHOW_GAME, SCHEDULE_CMD, sGame->commandParams);\n    SetMainCallback2(MainCB);\n    sGame->mainTask = CreateTask(MainTask, 8);\n}\n\nstatic void GetBerryFromBag(void)\n{\n    if (gSpecialVar_ItemId < FIRST_BERRY_INDEX || gSpecialVar_ItemId > LAST_BERRY_INDEX + 1)\n        gSpecialVar_ItemId = FIRST_BERRY_INDEX;\n    else\n        RemoveBagItem(gSpecialVar_ItemId, 1);\n\n    sGame->players[sGame->localId].berryId = gSpecialVar_ItemId - FIRST_BERRY_INDEX;\n    sGame->nextCmd = CMD_FADE;\n    sGame->afterPalFadeCmd = CMD_WAIT_BERRIES;\n    SetPaletteFadeArgs(sGame->commandParams, FALSE, PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n    RunOrScheduleCommand(CMD_SHOW_GAME, SCHEDULE_CMD, sGame->commandParams);\n    sGame->mainTask = CreateTask(MainTask, 8);\n    SetMainCallback2(MainCB);\n}\n\nstatic void ChooseBerry(void)\n{\n    DestroyTask(sGame->mainTask);\n    InitBerryPouch(BERRYPOUCH_FROMBERRYCRUSH, GetBerryFromBag, FALSE);\n}\n\nstatic void BerryCrush_SetVBlankCallback(void)\n{\n    SetVBlankCallback(VBlankCB);\n}\n\nstatic void BerryCrush_InitVBlankCB(void)\n{\n    SetVBlankCallback(NULL);\n}\n\nstatic void SaveResults(void)\n{\n    u32 time, presses;\n\n    time = sGame->results.time;\n    time = Q_24_8(time);\n    time = Q_24_8_div(time, Q_24_8(60));\n    presses = sGame->results.totalAPresses;\n    presses = Q_24_8(presses);\n    presses = Q_24_8_div(presses, time) & 0xFFFF;\n    sGame->pressingSpeed = presses;\n\n    switch (sGame->playerCount)\n    {\n    case 2:\n        if (sGame->pressingSpeed > gSaveBlock2Ptr->berryCrush.pressingSpeeds[0])\n        {\n            sGame->newRecord = TRUE;\n            gSaveBlock2Ptr->berryCrush.pressingSpeeds[0] = sGame->pressingSpeed;\n        }\n        break;\n    case 3:\n        if (sGame->pressingSpeed > gSaveBlock2Ptr->berryCrush.pressingSpeeds[1])\n        {\n            sGame->newRecord = TRUE;\n            gSaveBlock2Ptr->berryCrush.pressingSpeeds[1] = sGame->pressingSpeed;\n        }\n        break;\n    case 4:\n        if (sGame->pressingSpeed > gSaveBlock2Ptr->berryCrush.pressingSpeeds[2])\n        {\n            sGame->newRecord = TRUE;\n            gSaveBlock2Ptr->berryCrush.pressingSpeeds[2] = sGame->pressingSpeed;\n        }\n        break;\n    case 5:\n        if (sGame->pressingSpeed > gSaveBlock2Ptr->berryCrush.pressingSpeeds[3])\n        {\n            sGame->newRecord = TRUE;\n            gSaveBlock2Ptr->berryCrush.pressingSpeeds[3] = sGame->pressingSpeed;\n        }\n        break;\n    }\n\n    sGame->powder = sGame->results.powder;\n    if (GiveBerryPowder(sGame->powder))\n        return;\n\n    sGame->noRoomForPowder = TRUE;\n}\n\nstatic void VBlankCB(void)\n{\n    TransferPlttBuffer();\n    LoadOam();\n    ProcessSpriteCopyRequests();\n}\n\nstatic void MainCB(void)\n{\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n}\n\nstatic void MainTask(u8 taskId)\n{\n    if (sGame->cmdCallback != NULL)\n        sGame->cmdCallback(sGame, sGame->commandParams);\n\n    UpdateGame(sGame);\n}\n\nstatic void SetNamesAndTextSpeed(struct BerryCrushGame *game)\n{\n    u8 i;\n\n    for (i = 0; i < game->playerCount; i++)\n    {\n        StringCopy(game->players[i].name, gLinkPlayers[i].name);\n        game->players[i].name[PLAYER_NAME_LENGTH] = EOS;\n    }\n    for (; i < 5; i++)\n    {\n        memset(game->players[i].name, 1, PLAYER_NAME_LENGTH);\n        game->players[i].name[PLAYER_NAME_LENGTH] = EOS;\n    }\n\n    switch (gSaveBlock2Ptr->optionsTextSpeed)\n    {\n    case OPTIONS_TEXT_SPEED_SLOW:\n        game->textSpeed = 8;\n        break;\n    case OPTIONS_TEXT_SPEED_MID:\n        game->textSpeed = 4;\n        break;\n    case OPTIONS_TEXT_SPEED_FAST:\n    case OPTIONS_TEXT_SPEED_INSTANT:\n        game->textSpeed = 1;\n        break;\n    }\n}\n\n// GF file break\n\nstatic void RunOrScheduleCommand(u16 command, u8 runMode, u8 *args)\n{\n    struct BerryCrushGame * game = GetBerryCrushGame();\n\n    if (command >= NELEMS(sBerryCrushCommands))\n        command = CMD_NONE;\n    switch (runMode)\n    {\n    case RUN_CMD:\n        // Call now and set followup to game->nextCmd\n        if (command != CMD_NONE)\n            sBerryCrushCommands[command](game, args);\n        if (game->nextCmd >= NELEMS(sBerryCrushCommands))\n            game->nextCmd = CMD_NONE;\n        game->cmdCallback = sBerryCrushCommands[game->nextCmd];\n        break;\n    case SCHEDULE_CMD:\n        // Schedule for next frame\n        game->cmdCallback = sBerryCrushCommands[command];\n        break;\n    }\n}\n\nstatic u32 Cmd_BeginNormalPaletteFade(struct BerryCrushGame * game, u8 *args)\n{\n    // args points to packed values:\n    // bytes 0-3: selectedPals (bitfield)\n    // byte 4: delay\n    // byte 5: startY\n    // byte 6: stopY\n    // bytes 7-8: fade color\n    // byte 9: if TRUE, communicate on fade complete\n\n    u16 color;\n    u32 selectedPals[2];\n\n    selectedPals[0] = (u32)bSelectedPals(0);\n\n    selectedPals[1] = (u32)bSelectedPals(1);\n    selectedPals[1] <<= 8;\n    selectedPals[0] |= selectedPals[1];\n\n    selectedPals[1] = (u32)bSelectedPals(2);\n    selectedPals[1] <<= 16;\n    selectedPals[0] |= selectedPals[1];\n\n    selectedPals[1] = (u32)bSelectedPals(3);\n    selectedPals[1] <<= 24;\n    selectedPals[0] |= selectedPals[1];\n\n    bWaitFadeCommAfter = bCommunicateAfter;\n\n    color = bPalette(1);\n    color <<= 8;\n    color |= bPalette(0);\n\n    gPaletteFade.bufferTransferDisabled = FALSE;\n    BeginNormalPaletteFade(selectedPals[0], bDelay, bStartY, bTargetY, color);\n    UpdatePaletteFade();\n    game->nextCmd = CMD_WAIT_FADE;\n    return 0;\n}\n\nstatic u32 Cmd_WaitPaletteFade(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game->cmdState)\n    {\n    case 0:\n        if (UpdatePaletteFade())\n            return 0;\n        if (bWaitFadeCommAfter)\n            ++game->cmdState;\n        else\n            game->cmdState = 3;\n        return 0;\n    case 1:\n        Rfu_SetLinkStandbyCallback();\n        ++game->cmdState;\n        return 0;\n    case 2:\n        if (IsLinkTaskFinished())\n        {\n            ++game->cmdState;\n            return 0;\n        }\n        return 0;\n    case 3:\n        RunOrScheduleCommand(game->afterPalFadeCmd, SCHEDULE_CMD, NULL);\n        game->cmdState = 0;\n        return 0;\n    default:\n        ++game->cmdState;\n        return 0;\n    }\n}\n\nstatic u32 Cmd_PrintMessage(struct BerryCrushGame * game, u8 *args)\n{\n    // args[0]: msg id\n    // args[1]: flags\n    // args[2]: keys lo\n    // args[3]: keys hi\n    // args[4]: follow-up cmd state\n\n    u16 keys;\n\n    keys  = bKeys(1);\n    keys <<= 8;\n    keys |= bKeys(0) << 0;\n\n    switch (game->cmdState)\n    {\n    case 0:\n        DrawDialogueFrame(0, FALSE);\n        if (bFlags & F_MSG_EXPAND)\n        {\n            StringExpandPlaceholders(gStringVar4, sMessages[bMsgId]);\n            AddTextPrinterParameterized2(0, FONT_NORMAL, gStringVar4, game->textSpeed, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n        }\n        else\n        {\n            AddTextPrinterParameterized2(0, FONT_NORMAL, sMessages[bMsgId], game->textSpeed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n        }\n        CopyWindowToVram(0, COPYWIN_FULL);\n        break;\n    case 1:\n        if (!IsTextPrinterActive(0))\n        {\n            if (keys == 0)\n                ++game->cmdState;\n            break;\n        }\n        return 0;\n    case 2:\n        if (!JOY_NEW(keys))\n            return 0;\n        break;\n    case 3:\n        if (bFlags & F_MSG_CLEAR)\n            ClearDialogWindowAndFrame(0, TRUE);\n        RunOrScheduleCommand(game->nextCmd, SCHEDULE_CMD, NULL);\n        game->cmdState = bNextCmdState;\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_ShowGameDisplay(struct BerryCrushGame * game, u8 *args)\n{\n    if (ShowGameDisplay())\n        RunOrScheduleCommand(game->nextCmd, RUN_CMD, game->commandParams);\n    return 0;\n}\n\nstatic u32 Cmd_HideGameDisplay(struct BerryCrushGame * game, u8 *args)\n{\n    if (HideGameDisplay())\n        RunOrScheduleCommand(game->nextCmd, RUN_CMD, game->commandParams);\n    return 0;\n}\n\nstatic u32 Cmd_SignalReadyToBegin(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game->cmdState)\n    {\n    case 0:\n        Rfu_SetLinkStandbyCallback();\n        break;\n    case 1:\n        if (IsLinkTaskFinished())\n        {\n            PlayNewMapMusic(MUS_GAME_CORNER);\n            RunOrScheduleCommand(CMD_ASK_PICK_BERRY, SCHEDULE_CMD, NULL);\n            game->gameState = STATE_PICK_BERRY;\n            game->cmdState = 0;\n        }\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_AskPickBerry(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game->cmdState)\n    {\n    default:\n        ++game->cmdState;\n        break;\n    case 0:\n        ResetGame(game);\n        SetPrintMessageArgs(args, MSG_PICK_BERRY, F_MSG_CLEAR, 0, CMD_FADE);\n        game->nextCmd = CMD_ASK_PICK_BERRY;\n        RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL);\n        break;\n    case 1:\n        game->nextCmd = CMD_PICK_BERRY;\n        RunOrScheduleCommand(CMD_HIDE_GAME, SCHEDULE_CMD, NULL);\n        game->cmdState = 2;\n        break;\n    }\n    return 0;\n}\n\nstatic u32 Cmd_GoToBerryPouch(struct BerryCrushGame * game, u8 *args)\n{\n    game->cmdCallback = NULL;\n    SetMainCallback2(ChooseBerry);\n    return 0;\n}\n\nstatic u32 Cmd_WaitForOthersToPickBerries(struct BerryCrushGame * game, u8 *args)\n{\n    u8 i;\n\n    switch (game->cmdState)\n    {\n    case 0:\n        SetPrintMessageArgs(args, MSG_WAIT_PICK, 0, 0, CMD_FADE);\n        game->nextCmd = CMD_WAIT_BERRIES;\n        RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL);\n        return 0;\n    case 1:\n        Rfu_SetLinkStandbyCallback();\n        break;\n    case 2:\n        if (!IsLinkTaskFinished())\n            return 0;\n        memset(game->sendCmd, 0, sizeof(game->sendCmd));\n        game->sendCmd[0] = game->players[game->localId].berryId;\n        SendBlock(0, game->sendCmd, 2);\n        break;\n    case 3:\n        if (!IsLinkTaskFinished())\n            return 0;\n        game->cmdTimer = 0;\n        break;\n    case 4:\n        if (GetBlockReceivedStatus() != sReceivedPlayerBitmasks[game->playerCount - 2])\n            return 0;\n        for (i = 0; i < game->playerCount; ++i)\n        {\n            game->players[i].berryId = gBlockRecvBuffer[i][0];\n            if (game->players[i].berryId > LAST_BERRY_INDEX + 1)\n                game->players[i].berryId = 0;\n            game->targetAPresses += gBerryCrush_BerryData[game->players[i].berryId].difficulty;\n            game->powder += gBerryCrush_BerryData[game->players[i].berryId].powder;\n        }\n        game->cmdTimer = 0;\n        ResetBlockReceivedFlags();\n        game->targetDepth = Q_24_8_div(Q_24_8(game->targetAPresses), Q_24_8(32));\n        break;\n    case 5:\n        ClearDialogWindowAndFrame(0, TRUE);\n        RunOrScheduleCommand(CMD_DROP_BERRIES, SCHEDULE_CMD, NULL);\n        game->gameState = STATE_DROP_BERRIES;\n        game->cmdState = 0;\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_DropBerriesIntoCrusher(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game->cmdState)\n    {\n    case 0:\n        CreateBerrySprites(game, &game->gfx);\n        Rfu_SetLinkStandbyCallback();\n        break;\n    case 1:\n        if (!IsLinkTaskFinished())\n            return 0;\n        game->gfx.counter = 0;\n        game->gfx.vibrationIdx = 0;\n        game->gfx.numVibrations = 0;\n        game->gfx.vibrating = 0;\n        break;\n    case 2:\n        game->gfx.berrySprites[game->gfx.counter]->callback = SpriteCB_DropBerryIntoCrusher;\n        game->gfx.berrySprites[game->gfx.counter]->affineAnimPaused = FALSE;\n        PlaySE(SE_BALL_THROW);\n        break;\n    case 3:\n        if (game->gfx.berrySprites[game->gfx.counter]->callback == SpriteCB_DropBerryIntoCrusher)\n            return 0;\n        game->gfx.berrySprites[game->gfx.counter] = NULL;\n        ++game->gfx.counter;\n        Rfu_SetLinkStandbyCallback();\n        break;\n    case 4:\n        if (!IsLinkTaskFinished())\n            return 0;\n        if (game->gfx.counter < game->playerCount)\n        {\n            game->cmdState = 2;\n            return 0;\n        }\n        game->gfx.counter = 0;\n        break;\n    case 5:\n        BerryCrushFreeBerrySpriteGfx(game, &game->gfx);\n        Rfu_SetLinkStandbyCallback();\n        break;\n    case 6:\n        if (!IsLinkTaskFinished())\n            return 0;\n        PlaySE(SE_FALL);\n        RunOrScheduleCommand(CMD_DROP_LID, SCHEDULE_CMD, NULL);\n        game->gameState = STATE_DROP_LID;\n        game->cmdState = 0;\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_DropLid(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game->cmdState)\n    {\n    case 0:\n        game->depth += 4;\n        if (game->depth < 0)\n            return 0;\n        game->depth = 0;\n        game->gfx.vibrationIdx = 4;\n        game->gfx.counter = 0;\n        game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0];\n        PlaySE(SE_M_STRENGTH);\n        break;\n    case 1:\n        game->vibration = sIntroOutroVibrationData[game->gfx.vibrationIdx][game->gfx.counter];\n        SetGpuReg(REG_OFFSET_BG0VOFS, -game->vibration);\n        SetGpuReg(REG_OFFSET_BG2VOFS, -game->vibration);\n        SetGpuReg(REG_OFFSET_BG3VOFS, -game->vibration);\n        ++game->gfx.counter;\n        if (game->gfx.counter < game->gfx.numVibrations)\n            return 0;\n        if (game->gfx.vibrationIdx == 0)\n            break;\n        --game->gfx.vibrationIdx;\n        game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0];\n        game->gfx.counter = 0;\n        return 0;\n    case 2:\n        game->vibration = 0;\n        SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG3VOFS, 0);\n        Rfu_SetLinkStandbyCallback();\n        break;\n    case 3:\n        if (!IsLinkTaskFinished())\n            return 0;\n        RunOrScheduleCommand(CMD_COUNTDOWN, SCHEDULE_CMD, NULL);\n        game->gameState = STATE_COUNTDOWN;\n        game->cmdState = 0;\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_Countdown(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game-> cmdState)\n    {\n    case 0:\n        Rfu_SetLinkStandbyCallback();\n        break;\n    case 1:\n        if (!IsLinkTaskFinished())\n            return 0;\n        StartMinigameCountdown(TAG_COUNTDOWN, TAG_COUNTDOWN, 120, 80, 0);\n        break;\n    case 2:\n        if (IsMinigameCountdownRunning())\n            return 0;\n        Rfu_SetLinkStandbyCallback();\n        break;\n    case 3:\n        if (!IsLinkTaskFinished())\n            return 0;\n        game->gfx.counter = 0;\n        game->gfx.vibrationIdx = 0;\n        game->gfx.numVibrations = 0;\n        game->gfx.vibrating = FALSE;\n        game->cmdTimer = 0;\n        if (game->localId == 0)\n            RunOrScheduleCommand(CMD_PLAY_GAME_LEADER, SCHEDULE_CMD, NULL);\n        else\n            RunOrScheduleCommand(CMD_PLAY_GAME_MEMBER, SCHEDULE_CMD, NULL);\n        game->gameState = STATE_PLAYING;\n        game->cmdState = 0;\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic void HandlePartnerInput(struct BerryCrushGame * game)\n{\n    u8 numPlayersPressed = 0;\n    u8 i = 0;\n    u16 timeDiff;\n    s32 temp = 0;\n    struct BerryCrushGame_LinkState *linkState;\n\n    for (i = 0; i < game->playerCount; ++i)\n    {\n        linkState = (struct BerryCrushGame_LinkState *)gRecvCmds[i];\n\n        if ((linkState->rfuCmd & 0xFF00) != RFUCMD_SEND_PACKET)\n            continue;\n        if (linkState->sendFlag != SEND_GAME_STATE)\n            continue;\n\n        if (linkState->pushedAButton)\n        {\n            game->localState.playerPressedAFlags |= sBitTable[i];\n            game->players[i].inputState = 1;\n            ++game->players[i].numAPresses;\n            ++numPlayersPressed;\n            timeDiff = game->timer - game->players[i].inputTime;\n\n            // If the interval between inputs is regular, the input is considered \"neat\"\n            // This counts toward the player's neatness score\n            if (timeDiff >= game->players[i].timeSincePrevInput - 1\n             && timeDiff <= game->players[i].timeSincePrevInput + 1)\n            {\n                // On neat input streak\n                ++game->players[i].neatInputStreak;\n                game->players[i].timeSincePrevInput = timeDiff;\n                if (game->players[i].neatInputStreak > game->players[i].maxNeatInputStreak)\n                    game->players[i].maxNeatInputStreak = game->players[i].neatInputStreak;\n            }\n            else\n            {\n                // End neat input streak\n                game->players[i].neatInputStreak = 0;\n                game->players[i].timeSincePrevInput = timeDiff;\n            }\n\n            game->players[i].inputTime = game->timer;\n            ++game->players[i].inputFlags;\n            if (game->players[i].inputFlags > F_INPUT_HIT_B)\n                game->players[i].inputFlags = 0;\n        }\n        else\n        {\n            game->players[i].inputState = INPUT_STATE_NONE;\n        }\n    }\n    if (numPlayersPressed > 1)\n    {\n        // For each player that pressed A, flag their input as synchronous\n        // This is used to change their impact sprite to a big impact\n        for (i = 0; i < game->playerCount; ++i)\n        {\n            if (game->players[i].inputState == INPUT_STATE_NONE)\n                continue;\n            game->players[i].inputState |= INPUT_STATE_HIT_SYNC;\n            ++game->players[i].numSyncedAPresses;\n        }\n    }\n    if (numPlayersPressed == 0)\n        return;\n\n    game->bigSparkleCounter += numPlayersPressed;\n    numPlayersPressed += sSyncPressBonus[numPlayersPressed - 1];\n    game->sparkleCounter += numPlayersPressed;\n    game->totalAPresses += numPlayersPressed;\n    if (game->targetAPresses - game->totalAPresses > 0)\n    {\n        temp = game->totalAPresses;\n        temp = Q_24_8(temp);\n        temp = Q_24_8_div(temp, game->targetDepth);\n        temp = Q_24_8_TO_INT(temp);\n        game->newDepth = (u8)temp;\n        return;\n    }\n\n    // Target number of A presses has been reached, game is complete\n    game->newDepth = 32;\n    game->localState.endGame = TRUE;\n}\n\nstatic void BerryCrush_BuildLocalState(struct BerryCrushGame * game)\n{\n    u8 numPlayersPressed = 0;\n    u16 r1 = 0;\n    u8 i = 0;\n\n    for (i = 0; i < game->playerCount; ++i)\n    {\n        if (game->players[i].inputState != 0)\n        {\n            ++numPlayersPressed;\n            r1 = game->players[i].inputFlags + 1;\n            if (game->players[i].inputState & 2)\n                r1 |= 4;\n            r1 <<= 3 * i;\n            game->localState.inputFlags |= r1;\n        }\n    }\n    game->localState.depth = game->newDepth;\n    if (numPlayersPressed == 0)\n    {\n        if (game->gfx.vibrating != 0)\n            ++game->gfx.counter;\n    }\n    else if (game->gfx.vibrating != 0)\n    {\n        if (numPlayersPressed != game->gfx.vibrationIdx)\n        {\n            game->gfx.vibrationIdx = numPlayersPressed - 1;\n            game->gfx.numVibrations = sVibrationData[numPlayersPressed - 1][0];\n        }\n        else\n        {\n            ++game->gfx.counter;\n        }\n    }\n    else\n    {\n        game->gfx.counter = 0;\n        game->gfx.vibrationIdx = numPlayersPressed - 1;\n        game->gfx.numVibrations = sVibrationData[numPlayersPressed - 1][0];\n        game->gfx.vibrating = 1;\n    }\n\n    if (game->gfx.vibrating != 0)\n    {\n        if (game->gfx.counter >= game->gfx.numVibrations)\n        {\n            game->gfx.counter = 0;\n            game->gfx.vibrationIdx = 0;\n            game->gfx.numVibrations = 0;\n            game->gfx.vibrating = 0;\n            r1 = 0;\n        }\n        else\n        {\n            r1 = sVibrationData[game->gfx.vibrationIdx][game->gfx.counter + 1];\n        }\n        game->localState.vibration = r1;\n    }\n    else\n    {\n        game->localState.vibration = 0;\n    }\n    game->localState.timer = game->leaderTimer;\n}\n\nstatic void HandlePlayerInput(struct BerryCrushGame * game)\n{\n    if (JOY_NEW(A_BUTTON))\n        game->localState.pushedAButton = TRUE;\n\n    if (JOY_HELD(A_BUTTON))\n    {\n        if (game->players[game->localId].timePressingA < game->timer)\n            ++game->players[game->localId].timePressingA;\n    }\n\n    // Only send data to other players if you are the leader or you pressed A\n    if (game->localId != 0 && !game->localState.pushedAButton)\n        return;\n    game->localState.sendFlag = SEND_GAME_STATE;\n\n    // Every 30 frames, check whether the sparkles produced should be big,\n    // depending on how many A presses there were in that time\n    if (game->timer % 30 == 0)\n    {\n        if (game->bigSparkleCounter > sBigSparkleThresholds[game->playerCount - 2])\n        {\n            ++game->numBigSparkles;\n            game->bigSparkle = TRUE;\n        }\n        else\n        {\n            game->bigSparkle = FALSE;\n        }\n        game->bigSparkleCounter = 0;\n        ++game->numBigSparkleChecks;\n    }\n\n    // Every 15 frames, update the amount of sparkles that should be produced,\n    // depending on how many A presses there were in that time (including the bonus)\n    if (game->timer % 15 == 0)\n    {\n        // BUG: The wrong field is used twice below\n        // As a result, only a sparkleAmount of 0, 1, or 4 is attainable\n#ifdef BUGFIX\n#define field sparkleAmount\n#else\n#define field sparkleCounter\n#endif\n        if (game->sparkleCounter < sSparkleThresholds[game->playerCount - 2][0])\n            game->sparkleAmount = 0;\n        else if (game->sparkleCounter < sSparkleThresholds[game->playerCount - 2][1])\n            game->sparkleAmount = 1;\n        else if (game->sparkleCounter < sSparkleThresholds[game->playerCount - 2][2])\n            game->field = 2;\n        else if (game->sparkleCounter < sSparkleThresholds[game->playerCount - 2][3])\n            game->field = 3;\n        else\n            game->sparkleAmount = 4;\n        game->sparkleCounter = 0;\n#undef field\n    }\n    else\n    {\n        ++game->cmdTimer;\n        if (game->cmdTimer > 60)\n        {\n            if (game->cmdTimer > 70)\n            {\n                ClearRecvCommands();\n                game->cmdTimer = 0;\n            }\n            else if (game->localState.playerPressedAFlags == 0)\n            {\n                ClearRecvCommands();\n                game->cmdTimer = 0;\n            }\n        }\n\n    }\n    if (game->timer >= MAX_TIME)\n        game->localState.endGame = TRUE;\n    game->localState.bigSparkle = game->bigSparkle;\n    game->localState.sparkleAmount = game->sparkleAmount;\n    memcpy(&game->sendCmd, &game->localState, sizeof(game->sendCmd));\n    Rfu_SendPacket(game->sendCmd);\n}\n\nstatic void RecvLinkData(struct BerryCrushGame * game)\n{\n    u8 i = 0;\n    struct BerryCrushGame_LinkState * linkState = NULL;\n\n    for (i = 0; i < game->playerCount; ++i)\n        game->players[i].inputState = INPUT_STATE_NONE;\n\n    if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET)\n    {\n        game->playedSound = FALSE;\n        return;\n    }\n\n    if (gRecvCmds[0][1] != SEND_GAME_STATE)\n    {\n        game->playedSound = FALSE;\n        return;\n    }\n\n    memcpy(game->recvCmd, gRecvCmds[0], sizeof(game->recvCmd));\n    linkState = (struct BerryCrushGame_LinkState *)&game->recvCmd;\n    game->depth = linkState->depth;\n    game->vibration = linkState->vibration;\n    game->timer = linkState->timer;\n    UpdateInputEffects(game, &game->gfx);\n\n    if (linkState->endGame)\n        game->endGame = TRUE;\n}\n\nstatic u32 Cmd_PlayGame_Leader(struct BerryCrushGame * game, u8 *args)\n{\n    memset(&game->localState, 0, sizeof(game->localState));\n    memset(&game->recvCmd, 0, sizeof(game->recvCmd));\n    RecvLinkData(game);\n    SetGpuReg(REG_OFFSET_BG0VOFS, -game->vibration);\n    SetGpuReg(REG_OFFSET_BG2VOFS, -game->vibration);\n    SetGpuReg(REG_OFFSET_BG3VOFS, -game->vibration);\n    if (game->endGame)\n    {\n        if (game->timer >= MAX_TIME)\n        {\n            game->timer = MAX_TIME;\n            RunOrScheduleCommand(CMD_TIMES_UP, SCHEDULE_CMD, NULL);\n        }\n        else\n        {\n            RunOrScheduleCommand(CMD_FINISH_GAME, SCHEDULE_CMD, NULL);\n        }\n        game->cmdTimer = 0;\n        game->cmdState = 0;\n        return 0;\n    }\n    else\n    {\n        ++game->leaderTimer;\n        HandlePartnerInput(game);\n        BerryCrush_BuildLocalState(game);\n        HandlePlayerInput(game);\n        return 0;\n    }\n}\n\nstatic u32 Cmd_PlayGame_Member(struct BerryCrushGame * game, u8 *args)\n{\n    memset(&game->localState, 0, sizeof(game->localState));\n    memset(&game->recvCmd, 0, sizeof(game->recvCmd));\n    RecvLinkData(game);\n    SetGpuReg(REG_OFFSET_BG0VOFS, -game->vibration);\n    SetGpuReg(REG_OFFSET_BG2VOFS, -game->vibration);\n    SetGpuReg(REG_OFFSET_BG3VOFS, -game->vibration);\n    if (game->endGame)\n    {\n        if (game->timer >= MAX_TIME)\n        {\n            game->timer = MAX_TIME;\n            RunOrScheduleCommand(CMD_TIMES_UP, SCHEDULE_CMD, NULL);\n        }\n        else\n        {\n            RunOrScheduleCommand(CMD_FINISH_GAME, SCHEDULE_CMD, NULL);\n        }\n        game->cmdTimer = 0;\n        game->cmdState = 0;\n        return 0;\n    }\n    else\n    {\n        HandlePlayerInput(game);\n        return 0;\n    }\n}\n\n// Game was 'won', crusher was pushed down fully before time was up\nstatic u32 Cmd_FinishGame(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game->cmdState)\n    {\n    case 0:\n        game->gameState = STATE_FINISHED;\n        PlaySE(SE_M_STRENGTH);\n        BlendPalettes(PALETTES_ALL, 8, RGB(31, 31, 0));\n        game->gfx.counter = 2;\n        break;\n    case 1:\n        if (--game->gfx.counter != UINT8_MAX)\n            return 0;\n        BlendPalettes(PALETTES_ALL, 0, RGB(31, 31, 0));\n        game->gfx.vibrationIdx = 4;\n        game->gfx.counter = 0;\n        game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0];\n        break;\n    case 2:\n        game->vibration = sIntroOutroVibrationData[game->gfx.vibrationIdx][game->gfx.counter];\n        SetGpuReg(REG_OFFSET_BG0VOFS, -game->vibration);\n        SetGpuReg(REG_OFFSET_BG2VOFS, -game->vibration);\n        SetGpuReg(REG_OFFSET_BG3VOFS, -game->vibration);\n        if (++game->gfx.counter < game->gfx.numVibrations)\n            return 0;\n        if (game->gfx.vibrationIdx != 0)\n        {\n            --game->gfx.vibrationIdx;\n            game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0];\n            game->gfx.counter = 0;\n            return 0;\n        }\n        break;\n    case 3:\n        game->vibration = 0;\n        SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG3VOFS, 0);\n        break;\n    case 4:\n        if (!AreEffectsFinished(game, &game->gfx))\n            return 0;\n        Rfu_SetLinkStandbyCallback();\n        game->cmdTimer = 0;\n        break;\n    case 5:\n        if (!IsLinkTaskFinished())\n            return 0;\n        RunOrScheduleCommand(CMD_CALC_RESULTS, SCHEDULE_CMD, NULL);\n        game->cmdTimer = 0;\n        game->cmdState = 0;\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_HandleTimeUp(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game->cmdState)\n    {\n    case 0:\n        game->gameState = STATE_TIMES_UP;\n        PlaySE(SE_FAILURE);\n        BlendPalettes(PALETTES_ALL, 8, RGB(31, 0, 0));\n        game->gfx.counter = 4;\n        break;\n    case 1:\n        if (--game->gfx.counter != UINT8_MAX)\n            return 0;\n        BlendPalettes(PALETTES_ALL, 0, RGB(31, 0, 0));\n        game->gfx.counter = 0;\n        break;\n    case 2:\n        if (!AreEffectsFinished(game, &game->gfx))\n            return 0;\n        Rfu_SetLinkStandbyCallback();\n        game->cmdTimer = 0;\n        SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG3VOFS, 0);\n        break;\n    case 3:\n        if (!IsLinkTaskFinished())\n            return 0;\n        ConvertIntToDecimalStringN(gStringVar1, game->powder, STR_CONV_MODE_LEFT_ALIGN, 6);\n        SetPrintMessageArgs(args, MSG_TIMES_UP, F_MSG_CLEAR, 0, CMD_NONE);\n        game->nextCmd = CMD_SAVE;\n        RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL);\n        game->cmdTimer = 0;\n        game->cmdState = 0;\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_TabulateResults(struct BerryCrushGame * game, u8 *args)\n{\n    u8 i, j, tempPlayerId;\n    s32 temp1, temp2;\n    u16 tempStat;\n\n    switch (game->cmdState)\n    {\n    case 0:\n        memset(game->sendCmd, 0, 2 * sizeof(u16));\n        if (game->players[game->localId].timePressingA > game->timer)\n            game->players[game->localId].timePressingA = game->timer;\n        game->sendCmd[0] = game->players[game->localId].timePressingA;\n        SendBlock(0, game->sendCmd, 2);\n        break;\n    case 1:\n        if (!IsLinkTaskFinished())\n            return 0;\n        game->cmdTimer = 0;\n        break;\n    case 2:\n        if (GetBlockReceivedStatus() != sReceivedPlayerBitmasks[game->playerCount - 2])\n            return 0;\n        for (i = 0; i < game->playerCount; ++i)\n            game->players[i].timePressingA = gBlockRecvBuffer[i][0];\n        game->cmdTimer = 0;\n        game->sendCmd[0] = 0;\n        ResetBlockReceivedFlags();\n\n        // If player is not leader, skip the steps\n        // where the results are calculated and sent.\n        // Group members just read the results sent\n        // to them by the leader.\n        if (game->localId == 0)\n            game->cmdState = 3;\n        else\n            game->cmdState = 6;\n        return 0;\n    case 3:\n        memset(&game->results, 0, sizeof(struct BerryCrushGame_Results));\n        game->results.time = game->timer;\n        game->results.targetPressesPerSec = game->targetAPresses / (game->timer / 60);\n\n        // Calculate silkiness\n        // Silkiness is the percentage of times big sparkles were produced when possible,\n        // which itself depends on the number of A presses every 30 frames\n        // (numBigSparkles * 50 / numBigSparkleChecks) + 50\n        temp1 = Q_24_8_mul(Q_24_8(game->numBigSparkles), Q_24_8(50));\n        temp1 = Q_24_8_div(temp1, Q_24_8(game->numBigSparkleChecks)) + Q_24_8(50);\n        temp1 = Q_24_8_TO_INT(temp1);\n        game->results.silkiness = temp1 & 0x7F;\n\n        // Calculate amount of powder\n        temp1 = Q_24_8(temp1);\n        temp1 = Q_24_8_div(temp1, Q_24_8(100));\n        temp2 = Q_24_8(game->powder * game->playerCount);\n        temp2 = Q_24_8_mul(temp2, temp1);\n        game->results.powder = Q_24_8_TO_INT(temp2);\n\n        // Choose random second results page\n        game->results.randomPageId = Random() % NUM_RANDOM_RESULTS_PAGES;\n        for (i = 0; i < game->playerCount; ++i)\n        {\n            game->results.playerIdsRanked[0][i] = i;\n            game->results.playerIdsRanked[1][i] = i;\n            game->results.stats[RESULTS_PAGE_PRESSES][i] = game->players[i].numAPresses;\n            game->results.totalAPresses += game->results.stats[RESULTS_PAGE_PRESSES][i];\n\n            // Calculate value for random second results page\n            switch (game->results.randomPageId)\n            {\n            case RESULTS_PAGE_NEATNESS:\n                if (game->players[i].numAPresses != 0)\n                {\n                    // Calculate percentage of inputs that were in largest \"neat\" streak\n                    // \"Neat\" inputs are those done at a regular interval\n                    temp1 = game->players[i].maxNeatInputStreak;\n                    temp1 = Q_24_8(temp1);\n                    temp1 = Q_24_8_mul(temp1, Q_24_8(100));\n                    temp2 = game->players[i].numAPresses;\n                    temp2 = Q_24_8(temp2);\n                    temp2 = Q_24_8_div(temp1, temp2);\n                }\n                else\n                {\n                    temp2 = 0;\n                }\n                break;\n            case RESULTS_PAGE_COOPERATIVE:\n                if (game->players[i].numAPresses != 0)\n                {\n                    // Calculate percentage of inputs that were\n                    // done at the same time as another player\n                    temp1 = game->players[i].numSyncedAPresses;\n                    temp1 = Q_24_8(temp1);\n                    temp1 = Q_24_8_mul(temp1, Q_24_8(100));\n                    temp2 = game->players[i].numAPresses;\n                    temp2 = Q_24_8(temp2);\n                    temp2 = Q_24_8_div(temp1, temp2);\n                }\n                else\n                {\n                    temp2 = 0;\n                }\n                break;\n            case RESULTS_PAGE_POWER:\n                if (game->players[i].numAPresses == 0)\n                {\n                    temp2 = 0;\n                }\n                else if (game->players[i].timePressingA >= game->timer)\n                {\n                    // Spent 100% of the time pressing A\n                    temp2 = Q_24_8(100);\n                }\n                else\n                {\n                    // Calculate percentage of time the\n                    // player spent pressing A\n                    temp1 = game->players[i].timePressingA;\n                    temp1 = Q_24_8(temp1);\n                    temp1 = Q_24_8_mul(temp1, Q_24_8(100));\n                    temp2 = game->timer;\n                    temp2 = Q_24_8(temp2);\n                    temp2 = Q_24_8_div(temp1, temp2);\n                }\n                break;\n            }\n            temp2 >>= 4;\n            game->results.stats[RESULTS_PAGE_RANDOM][i] = temp2;\n        }\n        break;\n    case 4:\n        for (i = 0; i < game->playerCount - 1; ++i)\n        {\n            for (j = game->playerCount - 1; j > i; --j)\n            {\n                if (game->results.stats[RESULTS_PAGE_PRESSES][j - 1] < game->results.stats[RESULTS_PAGE_PRESSES][j])\n                {\n                    SWAP(game->results.stats[RESULTS_PAGE_PRESSES][j], game->results.stats[RESULTS_PAGE_PRESSES][j - 1], tempStat);\n                    SWAP(game->results.playerIdsRanked[0][j], game->results.playerIdsRanked[0][j - 1], tempPlayerId);\n                }\n                if (game->results.stats[RESULTS_PAGE_RANDOM][j - 1] < game->results.stats[RESULTS_PAGE_RANDOM][j])\n                {\n                    SWAP(game->results.stats[RESULTS_PAGE_RANDOM][j], game->results.stats[RESULTS_PAGE_RANDOM][j - 1], tempStat);\n                    SWAP(game->results.playerIdsRanked[1][j], game->results.playerIdsRanked[1][j - 1], tempPlayerId);\n                }\n            }\n        }\n        SendBlock(0, &game->results, sizeof(struct BerryCrushGame_Results));\n        break;\n    case 5:\n        if (!IsLinkTaskFinished())\n            return 0;\n        game->cmdTimer = 0;\n        break;\n    case 6:\n        if (GetBlockReceivedStatus() != 1)\n            return 0;\n        memset(&game->results, 0, sizeof(struct BerryCrushGame_Results));\n        memcpy(&game->results, gBlockRecvBuffer, sizeof(struct BerryCrushGame_Results));\n        ResetBlockReceivedFlags();\n        game->cmdTimer = 0;\n        break;\n    case 7:\n        SaveResults();\n        RunOrScheduleCommand(CMD_SHOW_RESULTS, SCHEDULE_CMD, NULL);\n        game->gameState = STATE_RESULTS_PRESSES;\n        game->cmdState = 0;\n        game->newDepth = 0;\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_ShowResults(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game->cmdState)\n    {\n    case 0:\n        if (!OpenResultsWindow(game, &game->gfx))\n            return 0;\n        break;\n    case 1:\n        CopyBgTilemapBufferToVram(0);\n        game->gfx.counter = 30;\n        break;\n    case 2:\n        if (game->gfx.counter != 0)\n        {\n            --game->gfx.counter;\n            return 0;\n        }\n        if (!JOY_NEW(A_BUTTON))\n            return 0;\n        PlaySE(SE_SELECT);\n        CloseResultsWindow(game);\n        break;\n    case 3:\n        if (game->gameState <= STATE_RESULTS_RANDOM)\n        {\n            ++game->gameState;\n            game->cmdState = 0;\n            return 0;\n        }\n        break;\n    case 4:\n        ConvertIntToDecimalStringN(gStringVar1, game->powder, STR_CONV_MODE_LEFT_ALIGN, 6);\n        ConvertIntToDecimalStringN(gStringVar2, GetBerryPowder(), STR_CONV_MODE_LEFT_ALIGN, 6);\n        SetPrintMessageArgs(args, MSG_POWDER, F_MSG_CLEAR | F_MSG_EXPAND, 0, CMD_NONE);\n        game->nextCmd = CMD_SAVE;\n        RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL);\n        game->cmdState = 0;\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_SaveGame(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game->cmdState)\n    {\n    case 0:\n        if (game->timer >= MAX_TIME)\n            HideTimer(&game->gfx);\n        SetPrintMessageArgs(args, MSG_COMM_STANDBY, 0, 0, CMD_FADE);\n        game->nextCmd = CMD_SAVE;\n        RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL);\n        game->cmdState = 0;\n        return 0;\n    case 1:\n        Rfu_SetLinkStandbyCallback();\n        break;\n    case 2:\n        if (!IsLinkTaskFinished())\n            return 0;\n        DrawDialogueFrame(0, FALSE);\n        AddTextPrinterParameterized2(0, FONT_NORMAL, gText_SavingDontTurnOffThePower2, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n        CopyWindowToVram(0, COPYWIN_FULL);\n        CreateTask(Task_LinkFullSave, 0);\n        break;\n    case 3:\n        if (FuncIsActiveTask(Task_LinkFullSave))\n            return 0;\n        break;\n    case 4:\n        RunOrScheduleCommand(CMD_ASK_PLAY_AGAIN, SCHEDULE_CMD, NULL);\n        game->gameState = STATE_PLAY_AGAIN;\n        game->cmdState = 0;\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_AskPlayAgain(struct BerryCrushGame * game, u8 *args)\n{\n    s8 input = 0;\n\n    switch (game->cmdState)\n    {\n    case 0:\n        SetPrintMessageArgs(args, MSG_PLAY_AGAIN, 0, 0, CMD_FADE);\n        game->nextCmd = CMD_ASK_PLAY_AGAIN;\n        RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL);\n        game->cmdState = 0; // State is progressed by CMD_PRINT_MSG\n        return 0;\n    case 1:\n        DisplayYesNoMenuDefaultYes();\n        break;\n    case 2:\n        input = Menu_ProcessInputNoWrapClearOnChoose();\n        if (input != LIST_CANCEL)\n        {\n            memset(game->sendCmd, 0, sizeof(game->sendCmd));\n            if (input == 0)\n            {\n                if (HasAtLeastOneBerry())\n                    game->playAgainState = PLAY_AGAIN_YES;\n                else\n                    game->playAgainState = PLAY_AGAIN_NO_BERRIES;\n            }\n            else\n            {\n                game->playAgainState = PLAY_AGAIN_NO;\n            }\n            ClearDialogWindowAndFrame(0, TRUE);\n            SetPrintMessageArgs(args, MSG_COMM_STANDBY, 0, 0, CMD_NONE);\n            game->nextCmd = CMD_COMM_PLAY_AGAIN;\n            RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL);\n            game->cmdState = 0;\n        }\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_CommunicatePlayAgainResponses(struct BerryCrushGame * game, u8 *args)\n{\n    u8 i = 0;\n\n    switch (game->cmdState)\n    {\n    case 0:\n        Rfu_SetLinkStandbyCallback();\n        break;\n    case 1:\n        if (!IsLinkTaskFinished())\n            return 0;\n\n        // Send player's Yes/No response to partners\n        game->sendCmd[0] = game->playAgainState;\n        game->recvCmd[0] = 0;\n        SendBlock(0, game->sendCmd, sizeof(u16));\n        break;\n    case 2:\n        if (!IsLinkTaskFinished())\n            return 0;\n        game->cmdTimer = 0;\n        break;\n    case 3:\n        // Wait for partners responses\n        if (GetBlockReceivedStatus() != sReceivedPlayerBitmasks[game->playerCount - 2])\n            return 0;\n\n        // Read partners responses\n        for (i = 0; i < game->playerCount; ++i)\n            game->recvCmd[0] += gBlockRecvBuffer[i][0];\n\n        if (game->recvCmd[0] != PLAY_AGAIN_YES)\n            RunOrScheduleCommand(CMD_PLAY_AGAIN_NO, SCHEDULE_CMD, NULL);\n        else\n            RunOrScheduleCommand(CMD_PLAY_AGAIN_YES, SCHEDULE_CMD, NULL);\n        ResetBlockReceivedFlags();\n        game->sendCmd[0] = 0;\n        game->recvCmd[0] = 0;\n        game->cmdTimer = 0;\n        game->cmdState = 0;\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_PlayAgain(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game->cmdState)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 1, 0, 0x10, RGB_BLACK);\n        UpdatePaletteFade();\n        break;\n    case 1:\n        if (UpdatePaletteFade())\n            return 0;\n        break;\n    case 2:\n        ClearDialogWindowAndFrame(0, TRUE);\n        ResetCrusherPos(game);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        UpdatePaletteFade();\n        break;\n    case 3:\n        if (UpdatePaletteFade())\n            return 0;\n        RunOrScheduleCommand(CMD_ASK_PICK_BERRY, SCHEDULE_CMD, NULL);\n        game->gameState = STATE_PICK_BERRY;\n        game->cmdState = 0;\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_StopGame(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game->cmdState)\n    {\n    case 0:\n        DrawDialogueFrame(0, FALSE);\n        if (game->playAgainState == PLAY_AGAIN_NO_BERRIES)\n            AddTextPrinterParameterized2(0, FONT_NORMAL, sMessages[MSG_NO_BERRIES], game->textSpeed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n        else\n            AddTextPrinterParameterized2(0, FONT_NORMAL, sMessages[MSG_DROPPED], game->textSpeed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n        CopyWindowToVram(0, COPYWIN_FULL);\n        break;\n    case 1:\n        if (IsTextPrinterActive(0))\n            return 0;\n        game->gfx.counter = 120;\n        break;\n    case 2:\n        if (game->gfx.counter != 0)\n            --game->gfx.counter;\n        else\n        {\n            RunOrScheduleCommand(CMD_CLOSE_LINK, SCHEDULE_CMD, NULL);\n            game->cmdState = 0;\n        }\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_CloseLink(struct BerryCrushGame * game, u8 *args)\n{\n    switch (game->cmdState)\n    {\n    case 0:\n        Rfu_SetLinkStandbyCallback();\n        break;\n    case 1:\n        if (!IsLinkTaskFinished())\n            return 0;\n        SetCloseLinkCallback();\n        break;\n    case 2:\n        if (gReceivedRemoteLinkPlayers)\n            return 0;\n        game->nextCmd = CMD_QUIT;\n        RunOrScheduleCommand(CMD_HIDE_GAME, SCHEDULE_CMD, NULL);\n        game->cmdState = 2; // State is not progressed\n        return 0;\n    }\n    ++game->cmdState;\n    return 0;\n}\n\nstatic u32 Cmd_Quit(struct BerryCrushGame * game, u8 *args)\n{\n    QuitBerryCrush(NULL);\n    return 0;\n}\n\nstatic void ResetGame(struct BerryCrushGame * game)\n{\n    u8 i = 0;\n\n    IncrementGameStat(GAME_STAT_BERRY_CRUSH_POINTS);\n    game->unused = 0;\n    game->cmdTimer = 0;\n    game->gameState = STATE_RESET;\n    game->playAgainState = PLAY_AGAIN_YES;\n    game->powder = 0;\n    game->targetAPresses = 0;\n    game->totalAPresses = 0;\n    game->targetDepth = 0;\n    game->newDepth = 0;\n    game->noRoomForPowder = FALSE;\n    game->newRecord = FALSE;\n    game->playedSound = FALSE;\n    game->endGame = FALSE;\n    game->bigSparkle = FALSE;\n    game->sparkleAmount = 0;\n    game->leaderTimer = 0;\n    game->timer = 0;\n    game->bigSparkleCounter = 0;\n    game->numBigSparkleChecks = -1;\n    game->numBigSparkles = 0;\n    game->sparkleCounter = 0;\n    for (i = 0; i < MAX_RFU_PLAYERS; ++i)\n    {\n        game->players[i].berryId = -1;\n        game->players[i].inputTime = 0;\n        game->players[i].neatInputStreak = 0;\n        game->players[i].timeSincePrevInput = 1;\n        game->players[i].maxNeatInputStreak = 0;\n        game->players[i].numAPresses = 0;\n        game->players[i].numSyncedAPresses = 0;\n        game->players[i].timePressingA = 0;\n        game->players[i].inputFlags = 0;\n        game->players[i].inputState = INPUT_STATE_NONE;\n    }\n}\n\nstatic void SetPaletteFadeArgs(u8 *args, bool8 communicateAfter, u32 selectedPals, s8 delay, u8 startY, u8 targetY, u16 palette)\n{\n    bSelectedPals(0) = ((u8 *)&selectedPals)[0];\n    bSelectedPals(1) = ((u8 *)&selectedPals)[1];\n    bSelectedPals(2) = ((u8 *)&selectedPals)[2];\n    bSelectedPals(3) = ((u8 *)&selectedPals)[3];\n    bDelay = delay;\n    bStartY = startY;\n    bTargetY = targetY;\n    bPalette(0) = ((u8 *)&palette)[0];\n    bPalette(1) = ((u8 *)&palette)[1];\n    bCommunicateAfter = communicateAfter;\n}\n\nstatic void SetPrintMessageArgs(u8 *args, u8 stringId, u8 flags, u16 waitKeys, u8 followupCmd)\n{\n    bMsgId = stringId;\n    bFlags = flags;\n    bKeys(0) = ((u8 *)&waitKeys)[0];\n    bKeys(1) = ((u8 *)&waitKeys)[1];\n    bNextCmdState = followupCmd;\n}\n\n// GF file break\n\nstatic s32 ShowGameDisplay(void)\n{\n    struct BerryCrushGame * game = GetBerryCrushGame();\n    if (game == NULL)\n        return -1;\n\n    switch (game->cmdState)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        SetHBlankCallback(NULL);\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        ScanlineEffect_Stop();\n        ResetTempTileDataBuffers();\n        break;\n    case 1:\n        CpuFill16(0, (void *)OAM, OAM_SIZE);\n        gReservedSpritePaletteCount = 0;\n        DigitObjUtil_Init(3);\n        break;\n    case 2:\n        ResetPaletteFade();\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        break;\n    case 3:\n        ResetBgsAndClearDma3BusyFlags(FALSE);\n        InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));\n        SetBgTilemapBuffer(1, game->gfx.bgBuffers[0]);\n        SetBgTilemapBuffer(2, game->gfx.bgBuffers[2]);\n        SetBgTilemapBuffer(3, game->gfx.bgBuffers[3]);\n        ChangeBgX(0, 0, 0);\n        ChangeBgY(0, 0, 0);\n        ChangeBgX(2, 0, 0);\n        ChangeBgY(2, 0, 0);\n        ChangeBgX(3, 0, 0);\n        ChangeBgY(3, 0, 0);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        break;\n    case 4:\n        FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 64);\n        FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 32);\n        FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32);\n        break;\n    case 5:\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(3);\n        DecompressAndCopyTileDataToVram(1, gBerryCrush_Crusher_Gfx, 0, 0, 0);\n        break;\n    case 6:\n        if (FreeTempTileDataBuffersIfPossible())\n            return 0;\n\n        InitStandardTextBoxWindows();\n        InitTextBoxGfxAndPrinters();\n        CreatePlayerNameWindows(game);\n        DrawPlayerNameWindows(game);\n        gPaletteFade.bufferTransferDisabled = TRUE;\n        break;\n    case 7:\n        LoadPalette(gBerryCrush_Crusher_Pal, BG_PLTT_ID(0), 12 * PLTT_SIZE_4BPP);\n        CopyToBgTilemapBuffer(1, sCrusherTop_Tilemap, 0, 0);\n        CopyToBgTilemapBuffer(2, sContainerCap_Tilemap, 0, 0);\n        CopyToBgTilemapBuffer(3, sBg_Tilemap, 0, 0);\n        CopyPlayerNameWindowGfxToBg(game);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(3);\n        break;\n    case 8:\n        LoadWirelessStatusIndicatorSpriteGfx();\n        CreateWirelessStatusIndicatorSprite(0,  0);\n        CreateGameSprites(game);\n        SetGpuReg(REG_OFFSET_BG1VOFS, -gSpriteCoordOffsetY);\n        ChangeBgX(1, 0, 0);\n        ChangeBgY(1, 0, 0);\n        break;\n    case 9:\n        gPaletteFade.bufferTransferDisabled = FALSE;\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        ShowBg(0);\n        ShowBg(1);\n        ShowBg(2);\n        ShowBg(3);\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);\n        BerryCrush_SetVBlankCallback();\n        game->cmdState = 0;\n        return 1;\n    }\n\n    game->cmdState++;\n    return 0;\n}\n\nstatic s32 HideGameDisplay(void)\n{\n    struct BerryCrushGame * game = GetBerryCrushGame();\n    if (!game)\n        return -1;\n\n    switch (game->cmdState)\n    {\n    case 0:\n        Rfu_SetLinkStandbyCallback();\n        break;\n    case 1:\n        if (!IsLinkTaskFinished())\n            return 0;\n        // fall through. The original author forgot to use \"break\" here\n        // because this will call BeginNormalPaletteFade() twice.\n    case 2:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        UpdatePaletteFade();\n        break;\n    case 3:\n        if (UpdatePaletteFade())\n            return 0;\n        break;\n    case 4:\n        FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 32);\n        FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 32);\n        FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32);\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(3);\n        break;\n    case 5:\n        FreeAllWindowBuffers();\n        HideBg(0);\n        UnsetBgTilemapBuffer(0);\n        HideBg(1);\n        UnsetBgTilemapBuffer(1);\n        HideBg(2);\n        UnsetBgTilemapBuffer(2);\n        HideBg(3);\n        UnsetBgTilemapBuffer(3);\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);\n        break;\n    case 6:\n        DestroyWirelessStatusIndicatorSprite();\n        DestroyGameSprites(game);\n        DigitObjUtil_Free();\n        break;\n    case 7:\n        game->cmdState = 0;\n        return 1;\n    }\n\n    game->cmdState++;\n    return 0;\n}\n\nstatic s32 UpdateGame(struct BerryCrushGame * game)\n{\n    gSpriteCoordOffsetY = game->depth + game->vibration;\n    SetGpuReg(REG_OFFSET_BG1VOFS, -gSpriteCoordOffsetY);\n    if (game->gameState == STATE_PLAYING)\n    {\n        PrintTimer(&game->gfx, game->timer);\n    }\n\n    return 0;\n}\n\nstatic void ResetCrusherPos(struct BerryCrushGame * game)\n{\n    game->depth = CRUSHER_START_Y;\n    game->vibration = 0;\n    gSpriteCoordOffsetX = 0;\n    gSpriteCoordOffsetY = CRUSHER_START_Y;\n}\n\n// Sprite data for berry sprites. Identical to fields for sparkle sprites\n#define sX         data[0]\n#define sYSpeed    data[1]\n#define sYAccel    data[2]\n#define sXSpeed    data[3]\n#define sSinIdx    data[4]\n#define sSinSpeed  data[5]\n#define sAmplitude data[6]\n// The last element (data[7]) is a bitfield.\n// The first 15 bits are the y coord to stop at.\n// The last bit is a flag for whether or not to move horizontally too\n#define sBitfield  data[7]\n#define MASK_TARGET_Y 0x7FFF\n#define F_MOVE_HORIZ  0x8000\n\nstatic void CreateBerrySprites(struct BerryCrushGame * game, struct BerryCrushGame_Gfx * spritesManager)\n{\n    u8 i;\n    u8 spriteId;\n    s16 distance, var1;\n    s16 *data;\n    s32 amplitude;\n    s16 speed;\n    u32 var2;\n\n    for (i = 0; i < game->playerCount; i++)\n    {\n        spriteId = AddItemIconObjectWithCustomObjectTemplate(\n            &sSpriteTemplate_PlayerBerry,\n            sPlayerBerrySpriteTags[i],\n            sPlayerBerrySpriteTags[i],\n            game->players[i].berryId + FIRST_BERRY_INDEX);\n        spritesManager->berrySprites[i] = &gSprites[spriteId];\n        spritesManager->berrySprites[i]->oam.priority = 3;\n        spritesManager->berrySprites[i]->affineAnimPaused = TRUE;\n        spritesManager->berrySprites[i]->x = spritesManager->playerCoords[i]->berryXOffset + 120;\n        spritesManager->berrySprites[i]->y = -16;\n        data = spritesManager->berrySprites[i]->data;\n        speed = Q_8_8(2.0);\n        sYSpeed = speed;\n        sYAccel = Q_8_8(0.125);\n        sBitfield = 112; // Setting bits in MASK_TARGET_Y\n        distance = spritesManager->playerCoords[i]->berryXDest - spritesManager->playerCoords[i]->berryXOffset;\n        amplitude = distance;\n        if (distance < 0)\n            amplitude += 3;\n\n        sAmplitude = amplitude >> 2;\n        distance = Q_N_S(7, distance);\n        var2 = speed + Q_8_8(0.125);\n        var2 = var2 / 2; // go from Q8.8 to Q9.7\n        var1 = Q_N_S_div(7, Q_N_S(7, 127), var2);\n        sX = Q_N_S(7, (u16)spritesManager->berrySprites[i]->x);\n        sXSpeed = Q_N_S_div(7, distance, var1);\n        var1 = Q_N_S_mul(7, var1, Q_N_S(7, 0.666666667));\n        sSinIdx = 0;\n        sSinSpeed = Q_N_S_div(7, Q_N_S(7, 127), var1);\n        sBitfield |= F_MOVE_HORIZ;\n        if (spritesManager->playerCoords[i]->berryXOffset < 0)\n            StartSpriteAffineAnim(spritesManager->berrySprites[i], 1);\n    }\n}\n\nstatic void SpriteCB_DropBerryIntoCrusher(struct Sprite *sprite)\n{\n    s16 *data = sprite->data;\n\n    sYSpeed += sYAccel;\n    sprite->y2 += Q_8_8_TO_INT(sYSpeed);\n    if (sBitfield & F_MOVE_HORIZ)\n    {\n        sprite->sX += sXSpeed;\n        sSinIdx += sSinSpeed;\n        sprite->x2 = Sin(Q_N_S_TO_INT(7, sSinIdx), sAmplitude);\n        if ((sBitfield & F_MOVE_HORIZ) && Q_N_S_TO_INT(7, sSinIdx) > 126)\n        {\n            sprite->x2 = 0;\n            sBitfield &= MASK_TARGET_Y;\n        }\n    }\n\n    sprite->x = Q_N_S_TO_INT(7, sX);\n    if (sprite->y + sprite->y2 >= (sBitfield & MASK_TARGET_Y))\n    {\n        sprite->callback = SpriteCallbackDummy;\n        FreeSpriteOamMatrix(sprite);\n        DestroySprite(sprite);\n    }\n}\n\n#undef sX\n#undef sYSpeed\n#undef sYAccel\n#undef sXSpeed\n#undef sSinIdx\n#undef sSinSpeed\n#undef sAmplitude\n#undef sBitfield\n#undef MASK_TARGET_Y\n#undef F_MOVE_HORIZ\n\nstatic void BerryCrushFreeBerrySpriteGfx(struct BerryCrushGame * game, struct BerryCrushGame_Gfx * gfx)\n{\n    u8 i;\n    for (i = 0; i < game->playerCount; i++)\n    {\n        FreeSpritePaletteByTag(sPlayerBerrySpriteTags[i]);\n        FreeSpriteTilesByTag(sPlayerBerrySpriteTags[i]);\n    }\n}\n\nstatic void UpdateInputEffects(struct BerryCrushGame * game, struct BerryCrushGame_Gfx * gfx)\n{\n    u8 numPlayersPressed;\n    struct BerryCrushGame_LinkState * linkState;\n    u8 i;\n    u16 temp1, xModifier;\n\n    numPlayersPressed = 0;\n    linkState = (struct BerryCrushGame_LinkState *)&game->recvCmd;\n    for (i = 0; i < game->playerCount; i++)\n    {\n#define flags temp1\n        flags = linkState->inputFlags >> (i * INPUT_FLAGS_PER_PLAYER);\n        flags &= INPUT_FLAG_MASK;\n        if (flags)\n        {\n            numPlayersPressed++;\n            if (flags & F_INPUT_HIT_SYNC)\n                StartSpriteAnim(gfx->impactSprites[i], 1);\n            else\n                StartSpriteAnim(gfx->impactSprites[i], 0);\n\n            gfx->impactSprites[i]->invisible = FALSE;\n            gfx->impactSprites[i]->animPaused = FALSE;\n            gfx->impactSprites[i]->x2 = sImpactCoords[(flags % (NELEMS(sImpactCoords) + 1)) - 1][0];\n            gfx->impactSprites[i]->y2 = sImpactCoords[(flags % (NELEMS(sImpactCoords) + 1)) - 1][1];\n#undef flags\n        }\n    }\n\n    if (numPlayersPressed == 0)\n    {\n        game->playedSound = FALSE;\n    }\n    else\n    {\n#define yModifier temp1\n        yModifier = (u8)(game->timer % 3);\n        xModifier = yModifier;\n        for (i = 0; i < linkState->sparkleAmount * 2 + 3; i++)\n        {\n            if (gfx->sparkleSprites[i]->invisible)\n            {\n                gfx->sparkleSprites[i]->callback = SpriteCB_Sparkle_Init;\n                gfx->sparkleSprites[i]->x = sSparkleCoords[i][0] + 120;\n                gfx->sparkleSprites[i]->y = sSparkleCoords[i][1] + 136 - (yModifier * 4);\n                gfx->sparkleSprites[i]->x2 = sSparkleCoords[i][0] + (sSparkleCoords[i][0] / (xModifier * 4));\n                gfx->sparkleSprites[i]->y2 = sSparkleCoords[i][1];\n                if (linkState->bigSparkle)\n                    StartSpriteAnim(gfx->sparkleSprites[i], 1);\n                else\n                    StartSpriteAnim(gfx->sparkleSprites[i], 0);\n\n                yModifier++;\n                if (yModifier > 3)\n                    yModifier = 0;\n            }\n        }\n\n#undef yModifier\n\n        if (game->playedSound)\n        {\n            game->playedSound = FALSE;\n        }\n        else\n        {\n            if (numPlayersPressed == 1)\n                PlaySE(SE_MUD_BALL);\n            else\n                PlaySE(SE_BREAKABLE_DOOR);\n\n            game->playedSound = TRUE;\n        }\n    }\n}\n\nstatic bool32 AreEffectsFinished(struct BerryCrushGame * game, struct BerryCrushGame_Gfx * gfx)\n{\n    u8 i;\n\n    for (i = 0; i < game->playerCount; i++)\n    {\n        if (!gfx->impactSprites[i]->invisible)\n            return FALSE;\n    }\n\n    for (i = 0; i < NELEMS(gfx->sparkleSprites); i++)\n    {\n        if (!gfx->sparkleSprites[i]->invisible)\n            return FALSE;\n    }\n\n    if (game->vibration != 0)\n        game->vibration = 0;\n\n    return TRUE;\n}\n\nstatic void FramesToMinSec(struct BerryCrushGame_Gfx * gfx, u16 frames)\n{\n    u8 i = 0;\n    u32 fractionalFrames = 0;\n    s16 frac_secs = 0;\n\n    gfx->minutes = frames / 3600;\n    gfx->secondsInt = (frames % 3600) / 60;\n    frac_secs = Q_8_8_mul(Q_8_8(frames % 60), Q_8_8(0.016666667));\n\n    for (i = 0; i < 8; i++)\n    {\n        if ((frac_secs >> (7 - i)) & 1)\n            fractionalFrames += sPressingSpeedConversionTable[i];\n    }\n\n    gfx->secondsFrac = fractionalFrames / 1000000;\n}\n\nstatic void PrintTextCentered(u8 windowId, u8 left, u8 colorId, const u8 *string)\n{\n    left = (left * 4) - (GetStringWidth(FONT_NORMAL, string, -1) / 2u);\n    AddTextPrinterParameterized3(windowId, FONT_NORMAL, left, 0, sBerryCrushTextColorTable[colorId], 0, string);\n}\n\nstatic void PrintResultsText(struct BerryCrushGame * game, u8 command, u8 x, u8 y)\n{\n    u8 i = 0;\n    u8 linkPlayerId = 0;\n    u8 linkIdToPrint = 0;\n    u8 j;\n    s32 score;\n    u8 realX;\n    struct BerryCrushGame_Results * bcPlayers = &game->results;\n    s32 realX2;\n\n    for (i = 0; i < game->playerCount; i++)\n    {\n        DynamicPlaceholderTextUtil_Reset();\n        switch (command)\n        {\n        case RESULTS_PAGE_PRESSES:\n            // Number of presses\n            linkPlayerId = bcPlayers->playerIdsRanked[command][i];\n            if (i != 0 && bcPlayers->stats[command][i] != bcPlayers->stats[command][i - 1])\n                linkIdToPrint = i;\n            ConvertIntToDecimalStringN(gStringVar1, bcPlayers->stats[command][i], STR_CONV_MODE_RIGHT_ALIGN, 4);\n            realX = x - GetStringWidth(FONT_NORMAL, sBCRankingHeaders[command], -1) - 4;\n            AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, realX, y + 14 * i, sBerryCrushTextColorTable[COLORID_GRAY], 0, sBCRankingHeaders[command]);\n            AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, realX - 24, y + 14 * i, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar1);\n            break;\n        case RESULTS_PAGE_RANDOM:\n            // Neatness\n            linkPlayerId = bcPlayers->playerIdsRanked[command][i];\n            if (i != 0 && bcPlayers->stats[command][i] != bcPlayers->stats[command][i - 1])\n                linkIdToPrint = i;\n            ConvertIntToDecimalStringN(gStringVar1, bcPlayers->stats[command][i] >> 4, STR_CONV_MODE_RIGHT_ALIGN, 3);\n            score = 0;\n            realX = bcPlayers->stats[command][i] & 15;\n            for (j = 0; j < 4; j++)\n            {\n                if ((realX >> (3 - j)) & 1)\n                    score += sPressingSpeedConversionTable[j];\n            }\n            realX = score / 1000000u;\n            ConvertIntToDecimalStringN(gStringVar2, realX, STR_CONV_MODE_LEADING_ZEROS, 2);\n            StringExpandPlaceholders(gStringVar4, sBCRankingHeaders[command]);\n            realX2 = x - 4;\n            AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, realX2 - GetStringWidth(FONT_NORMAL, gStringVar4, 0), y + 14 * i, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4);\n            break;\n        case RESULTS_PAGE_CRUSHING:\n            // Berry names\n            linkPlayerId = i;\n            linkIdToPrint = i;\n            j = game->players[i].berryId;\n            if (j >= LAST_BERRY_INDEX - FIRST_BERRY_INDEX + 2)\n                j = 0;\n            StringCopy(gStringVar1, gBerries[j].name);\n            StringExpandPlaceholders(gStringVar4, sBCRankingHeaders[command]);\n            AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x - GetStringWidth(FONT_NORMAL, gStringVar4, -1) - 4, y + 14 * i, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4);\n            break;\n        }\n        if (linkPlayerId == game->localId)\n            StringCopy(gStringVar3, gText_1_ClrBluShdwLtBlu_Dynamic0);\n        else\n            StringCopy(gStringVar3, gText_1_Dynamic0);\n        gStringVar3[0] = linkIdToPrint + CHAR_1;\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, game->players[linkPlayerId].name);\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gStringVar3);\n        AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, 4, y + 14 * i, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4);\n    }\n}\n\nstatic void printCrushingResults(struct BerryCrushGame * game)\n{\n    u8 i = 0;\n    u8 x = 0;\n    u32 score = 0;\n    struct BerryCrushGame_Results *players = &game->results;\n    u8 y = GetWindowAttribute(game->gfx.resultsWindowId, WINDOW_HEIGHT) * 8 - 42;\n\n    FramesToMinSec(&game->gfx, players->time);\n    AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, 2, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gText_TimeColon);\n\n    x = 190 - (u8)GetStringWidth(FONT_NORMAL, gText_SpaceSec, 0);\n    AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gText_SpaceSec);\n\n    x -= 32;\n    ConvertIntToDecimalStringN(gStringVar1, game->gfx.secondsInt, STR_CONV_MODE_LEADING_ZEROS, 2);\n    ConvertIntToDecimalStringN(gStringVar2, game->gfx.secondsFrac, STR_CONV_MODE_LEADING_ZEROS, 2);\n    StringExpandPlaceholders(gStringVar4, gText_XDotY2);\n    AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4);\n\n    x -= (u8)GetStringWidth(FONT_NORMAL, gText_SpaceMin, 0) + 3;\n    AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gText_SpaceMin);\n\n    x -= 9;\n    ConvertIntToDecimalStringN(gStringVar1, game->gfx.minutes, STR_CONV_MODE_LEADING_ZEROS, 1);\n    StringExpandPlaceholders(gStringVar4, gText_StrVar1);\n    AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4);\n\n    y += 14;\n    AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, 2, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gText_PressingSpeed);\n\n    x = 190 - (u8)GetStringWidth(FONT_NORMAL, gText_TimesPerSec, 0);\n    AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL_COPY_2, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gText_TimesPerSec);\n\n    for (i = 0; i < 8; ++i)\n        if (((u8)game->pressingSpeed >> (7 - i)) & 1)\n            score += *(i + sPressingSpeedConversionTable); // It's accessed in a different way here for unknown reason\n    ConvertIntToDecimalStringN(gStringVar1, game->pressingSpeed >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3);\n    ConvertIntToDecimalStringN(gStringVar2, score / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2);\n    StringExpandPlaceholders(gStringVar4, gText_XDotY3);\n    x -= 38;\n    if (game->newRecord)\n        AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_RED], 0, gStringVar4);\n    else\n        AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4);\n\n    y += 14;\n    AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, 2, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gText_Silkiness);\n\n    ConvertIntToDecimalStringN(gStringVar1, players->silkiness, STR_CONV_MODE_RIGHT_ALIGN, 3);\n    StringExpandPlaceholders(gStringVar4, gText_Var1Percent);\n    x = 190 - (u8)GetStringWidth(FONT_NORMAL, gStringVar4, 0);\n    AddTextPrinterParameterized3(game->gfx.resultsWindowId, FONT_NORMAL, x, y, sBerryCrushTextColorTable[COLORID_GRAY], 0, gStringVar4);\n}\n\nstatic bool32 OpenResultsWindow(struct BerryCrushGame * game, struct BerryCrushGame_Gfx * spriteManager)\n{\n    u8 playerCountMinus2;\n    struct WindowTemplate template;\n\n    switch (spriteManager->resultsState)\n    {\n    case 0:\n        playerCountMinus2 = game->playerCount - 2;\n        HideTimer(spriteManager);\n//        template = sWindowTemplates_Results[game->gameState - STATE_RESULTS_PRESSES];\n        memcpy(&template, &sWindowTemplates_Results[game->gameState - STATE_RESULTS_PRESSES], sizeof(struct WindowTemplate));\n        if (game->gameState == STATE_RESULTS_CRUSHING)\n            template.height = sResultsWindowHeights[1][playerCountMinus2];\n        else\n            template.height = sResultsWindowHeights[0][playerCountMinus2];\n        spriteManager->resultsWindowId = AddWindow(&template);\n        break;\n    case 1:\n        PutWindowTilemap(spriteManager->resultsWindowId);\n        FillWindowPixelBuffer(spriteManager->resultsWindowId, PIXEL_FILL(0));\n        break;\n    case 2:\n        LoadStdWindowGfx(spriteManager->resultsWindowId, 0x21D, BG_PLTT_ID(13));\n        DrawStdFrameWithCustomTileAndPalette(spriteManager->resultsWindowId, FALSE, 541, 13);\n        break;\n    case 3:\n        playerCountMinus2 = game->playerCount - 2;\n        switch (game->gameState)\n        {\n        case STATE_RESULTS_PRESSES:\n            PrintTextCentered(spriteManager->resultsWindowId, 22, COLORID_BLUE, gText_PressesRankings);\n            PrintResultsText(game, RESULTS_PAGE_PRESSES, 0xB0, 8 * sResultsWindowHeights[0][playerCountMinus2] - game->playerCount * 14);\n            spriteManager->resultsState = 5;\n            return FALSE;\n        case STATE_RESULTS_RANDOM:\n            PrintTextCentered(spriteManager->resultsWindowId, 22, COLORID_GREEN, sBCRankingHeaders[game->results.randomPageId + 3]);\n            PrintResultsText(game, RESULTS_PAGE_RANDOM, 0xB0, 8 * sResultsWindowHeights[0][playerCountMinus2] - game->playerCount * 14);\n            spriteManager->resultsState = 5;\n            return FALSE;\n        case STATE_RESULTS_CRUSHING:\n            PrintTextCentered(spriteManager->resultsWindowId, 24, COLORID_BLUE, gText_CrushingResults);\n            PrintResultsText(game, RESULTS_PAGE_CRUSHING, 0xC0, 0x10);\n            break;\n        }\n        break;\n    case 4:\n        printCrushingResults(game);\n        break;\n    case 5:\n        CopyWindowToVram(spriteManager->resultsWindowId, COPYWIN_FULL);\n        spriteManager->resultsState = 0;\n        return TRUE;\n    }\n    ++spriteManager->resultsState;\n    return FALSE;\n}\n\nstatic void CloseResultsWindow(struct BerryCrushGame * game)\n{\n    ClearStdWindowAndFrameToTransparent(game->gfx.resultsWindowId, TRUE);\n    RemoveWindow(game->gfx.resultsWindowId);\n    DrawPlayerNameWindows(game);\n}\n\n#define tState             data[0]\n#define tWindowId          data[1]\n#define tPressingSpeeds(i) data[2 + (i)] // data[2]-[5], for different group sizes\n\nstatic void Task_ShowBerryCrushRankings(u8 taskId)\n{\n    u8 i = 0, j, xPos, yPos;\n    u32 score = 0;\n    s16 *data = gTasks[taskId].data;\n    u8 *str;\n\n    switch (tState)\n    {\n    case 0:\n        tWindowId = AddWindow(&sWindowTemplate_BerryCrushRankings);\n        PutWindowTilemap(tWindowId);\n        FillWindowPixelBuffer(tWindowId, PIXEL_FILL(0));\n        LoadStdWindowGfx(tWindowId, 0x21D, BG_PLTT_ID(13));\n        DrawStdFrameWithCustomTileAndPalette(tWindowId, 0, 0x21D, 13);\n        break;\n    case 1:\n        xPos = 96 - GetStringWidth(FONT_NORMAL, gText_BerryCrush2, -1) / 2u;\n        AddTextPrinterParameterized3(\n            tWindowId,\n            FONT_NORMAL,\n            xPos,\n            2,\n            sBerryCrushTextColorTable[COLORID_BLUE],\n            0,\n            gText_BerryCrush2\n        );\n        xPos = 96 - GetStringWidth(FONT_NORMAL, gText_PressingSpeedRankings, -1) / 2u;\n        AddTextPrinterParameterized3(\n            tWindowId,\n            FONT_NORMAL,\n            xPos,\n            18,\n            sBerryCrushTextColorTable[COLORID_BLUE],\n            0,\n            gText_PressingSpeedRankings\n        );\n        yPos = 42;\n        for (i = 0; i < 4; ++i)\n        {\n            ConvertIntToDecimalStringN(gStringVar1, i + 2, STR_CONV_MODE_LEFT_ALIGN, 1);\n            StringExpandPlaceholders(gStringVar4, gText_Var1Players);\n            AddTextPrinterParameterized3(\n                tWindowId,\n                FONT_NORMAL,\n                4,\n                yPos,\n                sBerryCrushTextColorTable[COLORID_GRAY],\n                0,\n                gStringVar4\n            );\n            for (j = 0; j < 8; ++j)\n            {\n                if (((tPressingSpeeds(i) & 0xFF) >> (7 - j)) & 1)\n                    score += sPressingSpeedConversionTable[j];\n            }\n            ConvertIntToDecimalStringN(gStringVar1, (u16)tPressingSpeeds(i) >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3);\n            ConvertIntToDecimalStringN(gStringVar2, score / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2);\n            str = StringExpandPlaceholders(gStringVar4, gText_XDotY3);\n            *str++ = CHAR_SPACE;\n            StringCopy(str, gText_TimesPerSec);\n            xPos = 192 - (u8)GetStringWidth(FONT_NORMAL_COPY_2, gStringVar4, 0);\n            AddTextPrinterParameterized3(\n                tWindowId,\n                FONT_NORMAL_COPY_2,\n                xPos,\n                yPos,\n                sBerryCrushTextColorTable[COLORID_GRAY],\n                0,\n                gStringVar4\n            );\n            yPos += 14;\n            score = 0;\n        }\n        CopyWindowToVram(tWindowId, COPYWIN_FULL);\n        break;\n    case 2:\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n            break;\n        else\n            return;\n    case 3:\n        ClearStdWindowAndFrameToTransparent(tWindowId, TRUE);\n        ClearWindowTilemap(tWindowId);\n        RemoveWindow(tWindowId);\n        DestroyTask(taskId);\n        ScriptContext_Enable();\n        UnlockPlayerFieldControls();\n        tState = 0;\n        return;\n    }\n    ++tState;\n}\n\nvoid ShowBerryCrushRankings(void)\n{\n    u8 taskId;\n\n    LockPlayerFieldControls();\n    taskId = CreateTask(Task_ShowBerryCrushRankings, 0);\n    gTasks[taskId].tPressingSpeeds(0) = gSaveBlock2Ptr->berryCrush.pressingSpeeds[0];\n    gTasks[taskId].tPressingSpeeds(1) = gSaveBlock2Ptr->berryCrush.pressingSpeeds[1];\n    gTasks[taskId].tPressingSpeeds(2) = gSaveBlock2Ptr->berryCrush.pressingSpeeds[2];\n    gTasks[taskId].tPressingSpeeds(3) = gSaveBlock2Ptr->berryCrush.pressingSpeeds[3];\n}\n\nstatic void PrintTimer(struct BerryCrushGame_Gfx * gfx, u16 frames)\n{\n    FramesToMinSec(gfx, frames);\n    DigitObjUtil_PrintNumOn(0, gfx->minutes);\n    DigitObjUtil_PrintNumOn(1, gfx->secondsInt);\n    DigitObjUtil_PrintNumOn(2, gfx->secondsFrac);\n}\n\nstatic void HideTimer(struct BerryCrushGame_Gfx * gfx)\n{\n    gfx->timerSprites[0]->invisible = TRUE;\n    gfx->timerSprites[1]->invisible = TRUE;\n    DigitObjUtil_HideOrShow(2, 1);\n    DigitObjUtil_HideOrShow(1, 1);\n    DigitObjUtil_HideOrShow(0, 1);\n}\n\nstatic void CreatePlayerNameWindows(struct BerryCrushGame * game)\n{\n    u8 i;\n\n    for (i = 0; i < game->playerCount; ++i)\n    {\n        game->gfx.playerCoords[i] = &sPlayerCoords[sPlayerIdToPosId[game->playerCount - 2][i]];\n        game->gfx.nameWindowIds[i] = AddWindow(&sWindowTemplates_PlayerNames[game->gfx.playerCoords[i]->playerId]);\n        PutWindowTilemap(game->gfx.nameWindowIds[i]);\n        FillWindowPixelBuffer(game->gfx.nameWindowIds[i], PIXEL_FILL(0));\n    }\n}\n\nstatic void DrawPlayerNameWindows(struct BerryCrushGame * game)\n{\n    u8 i;\n\n    for (i = 0; i < game->playerCount; ++i)\n    {\n        PutWindowTilemap(game->gfx.nameWindowIds[i]);\n        if (i == game->localId)\n        {\n            AddTextPrinterParameterized4(\n                game->gfx.nameWindowIds[i],\n                FONT_NORMAL,\n                36 - GetStringWidth(FONT_NORMAL, game->players[i].name, 0) / 2u,\n                1,\n                0,\n                0,\n                sBerryCrushTextColorTable[COLORID_BLACK],\n                0,\n                game->players[i].name\n            );\n        }\n        else\n        {\n            AddTextPrinterParameterized4(\n                game->gfx.nameWindowIds[i],\n                FONT_NORMAL,\n                36 - GetStringWidth(FONT_NORMAL, game->players[i].name, 0) / 2u,\n                1,\n                0,\n                0,\n                sBerryCrushTextColorTable[COLORID_LIGHT_GRAY],\n                0,\n                game->players[i].name\n            );\n        }\n        CopyWindowToVram(game->gfx.nameWindowIds[i], COPYWIN_FULL);\n    }\n    CopyBgTilemapBufferToVram(0);\n}\n\n// Each player name window border uses a color that corresponds to a slot of the crusher lid\nstatic void CopyPlayerNameWindowGfxToBg(struct BerryCrushGame * game)\n{\n    u8 i = 0;\n    u8 *crusherGfx;\n\n    LZ77UnCompWram(gBerryCrush_TextWindows_Tilemap, gDecompressionBuffer);\n    for (crusherGfx = gDecompressionBuffer; i < game->playerCount; ++i)\n    {\n        CopyToBgTilemapBufferRect(\n            3,\n            &crusherGfx[game->gfx.playerCoords[i]->playerId * 40],\n            game->gfx.playerCoords[i]->windowGfxX,\n            game->gfx.playerCoords[i]->windowGfxY,\n            10,\n            2\n        );\n    }\n    CopyBgTilemapBufferToVram(3);\n}\n\nstatic void CreateGameSprites(struct BerryCrushGame * game)\n{\n    u8 i = 0;\n    u8 spriteId;\n\n    game->depth = CRUSHER_START_Y;\n    game->vibration = 0;\n    gSpriteCoordOffsetX = 0;\n    gSpriteCoordOffsetY = CRUSHER_START_Y;\n    for (i = 0; i < NELEMS(sSpriteSheets) - 1; ++i)\n        LoadCompressedSpriteSheet(&sSpriteSheets[i]);\n    LoadSpritePalettes(sSpritePals);\n\n    // Create sprite for crusher base\n    spriteId = CreateSprite(&sSpriteTemplate_BerryCrushCore, 120, 88, 5);\n    game->gfx.coreSprite = &gSprites[spriteId];\n    game->gfx.coreSprite->oam.priority = 3;\n    game->gfx.coreSprite->coordOffsetEnabled = TRUE;\n    game->gfx.coreSprite->animPaused = TRUE;\n\n    // Create sprites for the impact effect\n    for (i = 0; i < game->playerCount; ++i)\n    {\n        spriteId = CreateSprite(\n            &sSpriteTemplate_BerryCrushImpact,\n            game->gfx.playerCoords[i]->impactXOffset + 120,\n            game->gfx.playerCoords[i]->impactYOffset + 32,\n            0\n        );\n        game->gfx.impactSprites[i] = &gSprites[spriteId];\n        game->gfx.impactSprites[i]->oam.priority = 1;\n        game->gfx.impactSprites[i]->invisible = TRUE;\n        game->gfx.impactSprites[i]->coordOffsetEnabled = TRUE;\n        game->gfx.impactSprites[i]->animPaused = TRUE;\n    }\n\n    // Create sprites for sparkle effect\n    for (i = 0; i < NELEMS(game->gfx.sparkleSprites); ++i)\n    {\n        spriteId = CreateSprite(\n            &sSpriteTemplate_BerryCrushPowderSparkles,\n            sSparkleCoords[i][0] + 120,\n            sSparkleCoords[i][1] + 136,\n            6\n        );\n        game->gfx.sparkleSprites[i] = &gSprites[spriteId];\n        game->gfx.sparkleSprites[i]->oam.priority = 3;\n        game->gfx.sparkleSprites[i]->invisible = TRUE;\n        game->gfx.sparkleSprites[i]->animPaused = TRUE;\n        game->gfx.sparkleSprites[i]->data[0] = i;\n    }\n\n    // Create sprites for timer\n    for (i = 0; i < NELEMS(game->gfx.timerSprites); ++i)\n    {\n        spriteId = CreateSprite(\n            &sSpriteTemplate_BerryCrushTimer,\n            24 * i + 176,\n            8,\n            0\n        );\n        game->gfx.timerSprites[i] = &gSprites[spriteId];\n        game->gfx.timerSprites[i]->oam.priority = 0;\n        game->gfx.timerSprites[i]->invisible = FALSE;\n        game->gfx.timerSprites[i]->animPaused = FALSE;\n    }\n    DigitObjUtil_CreatePrinter(0, 0, &sDigitObjTemplates[0]);\n    DigitObjUtil_CreatePrinter(1, 0, &sDigitObjTemplates[1]);\n    DigitObjUtil_CreatePrinter(2, 0, &sDigitObjTemplates[2]);\n\n    if (game->gameState == STATE_INIT)\n        HideTimer(&game->gfx);\n}\n\nstatic void DestroyGameSprites(struct BerryCrushGame * game)\n{\n    u8 i = 0;\n\n    FreeSpriteTilesByTag(TAG_TIMER_DIGITS);\n    FreeSpriteTilesByTag(GFXTAG_SPARKLE);\n    FreeSpriteTilesByTag(GFXTAG_IMPACT);\n    FreeSpriteTilesByTag(TAG_CRUSHER_BASE);\n    FreeSpritePaletteByTag(TAG_TIMER_DIGITS);\n    FreeSpritePaletteByTag(PALTAG_EFFECT);\n    FreeSpritePaletteByTag(TAG_CRUSHER_BASE);\n    for (; i < NELEMS(game->gfx.timerSprites); ++i)\n        DestroySprite(game->gfx.timerSprites[i]);\n    DigitObjUtil_DeletePrinter(2);\n    DigitObjUtil_DeletePrinter(1);\n    DigitObjUtil_DeletePrinter(0);\n    for (i = 0; i < NELEMS(game->gfx.sparkleSprites); ++i)\n        DestroySprite(game->gfx.sparkleSprites[i]);\n    for (i = 0; i < game->playerCount; ++i)\n        DestroySprite(game->gfx.impactSprites[i]);\n    if (game->gfx.coreSprite->inUse)\n        DestroySprite(game->gfx.coreSprite);\n}\n\nstatic void SpriteCB_Impact(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n    {\n        sprite->invisible = TRUE;\n        sprite->animPaused = TRUE;\n    }\n}\n\nstatic void SpriteCB_Sparkle_End(struct Sprite *sprite)\n{\n    u8 r1 = 0;\n    SpriteCallback r5 = SpriteCallbackDummy;\n\n    for (; r1 < NELEMS(sprite->data); ++r1)\n        sprite->data[r1] = 0;\n    sprite->x2 = 0;\n    sprite->y2 = 0;\n    sprite->invisible = TRUE;\n    sprite->animPaused = TRUE;\n    sprite->callback = r5;\n}\n\n// Redefining from above\n#define sX         data[0]\n#define sYSpeed    data[1]\n#define sYAccel    data[2]\n#define sXSpeed    data[3]\n#define sSinIdx    data[4]\n#define sSinSpeed  data[5]\n#define sAmplitude data[6]\n// The last element (data[7]) is a bitfield.\n// The first 15 bits are the y coord to stop at.\n// The last bit is a flag for whether or not to move on the x too\n#define sBitfield  data[7]\n#define MASK_TARGET_Y 0x7FFF\n#define F_MOVE_HORIZ  0x8000\n\nstatic void SpriteCB_Sparkle(struct Sprite *sprite)\n{\n    s16 *data = sprite->data;\n\n    sYSpeed += sYAccel;\n    sprite->y2 += Q_8_8_TO_INT(sYSpeed);\n    if (sBitfield & F_MOVE_HORIZ)\n    {\n        sprite->sX += sXSpeed;\n        sSinIdx += sSinSpeed;\n        sprite->x2 = Sin(Q_N_S_TO_INT(7, sSinIdx), sAmplitude);\n        if ((sBitfield & F_MOVE_HORIZ) && Q_N_S_TO_INT(7, sSinIdx) > 126)\n        {\n            sprite->x2 = 0;\n            sBitfield &= MASK_TARGET_Y;\n        }\n    }\n    sprite->x = Q_N_S_TO_INT(7, sX);\n    if (sprite->y + sprite->y2 > (sBitfield & MASK_TARGET_Y))\n        sprite->callback = SpriteCB_Sparkle_End;\n}\n\nstatic void SpriteCB_Sparkle_Init(struct Sprite *sprite)\n{\n    s16 *data = sprite->data;\n    s16 xMult, var;\n    s16 targetY;\n    s32 speed;\n    u32 zero = 0;\n\n    speed = Q_8_8(2.5);\n    sYSpeed = speed;\n    sYAccel = Q_8_8(0.125);\n    targetY = 168;\n    sBitfield = targetY;\n    xMult = Q_N_S(7, sprite->x2);\n    var = Q_N_S_div(7, Q_N_S(7, targetY - (u16) sprite->y), (speed + Q_8_8(0.125)) >> 1);\n    sprite->sX = Q_N_S(7, (u16)sprite->x);\n    sXSpeed = Q_N_S_div(7, xMult, var);\n    speed = Q_N_S_mul(7, var, Q_N_S(7, 0.666666667));\n    sSinIdx = zero;\n    sSinSpeed = Q_N_S_div(7, Q_N_S(7, 127), speed);\n    sAmplitude = sprite->x2 / 4;\n    sBitfield |= F_MOVE_HORIZ;\n    sprite->y2 = zero;\n    sprite->x2 = zero;\n    sprite->callback = SpriteCB_Sparkle;\n    sprite->animPaused = FALSE;\n    sprite->invisible = FALSE;\n}\n\n#undef sX\n#undef sYSpeed\n#undef sYAccel\n#undef sXSpeed\n#undef sSinIdx\n#undef sSinSpeed\n#undef sAmplitude\n#undef sBitfield\n#undef MASK_TARGET_Y\n#undef F_MOVE_HORIZ\n"
  },
  {
    "path": "src/berry_fix_program.c",
    "content": "#include \"global.h\"\n#include \"gpu_regs.h\"\n#include \"multiboot.h\"\n#include \"graphics.h\"\n#include \"main.h\"\n#include \"sprite.h\"\n#include \"task.h\"\n#include \"scanline_effect.h\"\n#include \"help_system.h\"\n#include \"m4a.h\"\n\nenum {\n    SCENE_ENSURE_CONNECT,\n    SCENE_TURN_OFF_POWER,\n    SCENE_TRANSMITTING,\n    SCENE_FOLLOW_INSTRUCT,\n    SCENE_TRANSMIT_FAILED,\n    SCENE_BEGIN,\n};\n\nenum {\n    STATE_BEGIN,\n    STATE_CONNECT,\n    STATE_TURN_OFF_POWER,\n    STATE_UNUSED,\n    STATE_INIT_MULTIBOOT,\n    STATE_MULTIBOOT,\n    STATE_TRANSMIT,\n    STATE_SUCCEEDED,\n    STATE_EXIT,\n    STATE_FAILED,\n    STATE_RETRY,\n};\n\nconst void *gMultibootStart;\nint gMultibootStatus;\nsize_t gMultibootSize;\nstruct MultiBootParam gMultibootParam;\n\nstatic void CB2_BerryFix(void);\nstatic void Task_BerryFixMain(u8 taskId);\n\nstatic const void *const sBerryFixGraphics[][3] = {\n    [SCENE_ENSURE_CONNECT] = {\n        gBerryFixGameboy_Gfx,\n        gBerryFixGameboy_Tilemap,\n        gBerryFixGameboy_Pal\n    },\n    [SCENE_TURN_OFF_POWER] = {\n        gBerryFixGameboyLogo_Gfx,\n        gBerryFixGameboyLogo_Tilemap,\n        gBerryFixGameboyLogo_Pal\n    },\n    [SCENE_TRANSMITTING] = {\n        gBerryFixGbaTransfer_Gfx,\n        gBerryFixGbaTransfer_Tilemap,\n        gBerryFixGbaTransfer_Pal\n    },\n    [SCENE_FOLLOW_INSTRUCT] = {\n        gBerryFixGbaTransferHighlight_Gfx,\n        gBerryFixGbaTransferHighlight_Tilemap,\n        gBerryFixGbaTransferHighlight_Pal\n    },\n    [SCENE_TRANSMIT_FAILED] = {\n        gBerryFixGbaTransferError_Gfx,\n        gBerryFixGbaTransferError_Tilemap,\n        gBerryFixGbaTransferError_Pal\n    },\n    [SCENE_BEGIN] = {\n        gBerryFixWindow_Gfx,\n        gBerryFixWindow_Tilemap,\n        gBerryFixWindow_Pal\n    },\n};\n\nextern const u8 gMultiBootProgram_BerryGlitchFix_Start[0x3BF4];\nextern const u8 gMultiBootProgram_BerryGlitchFix_End[];\n\nstatic void SetScene(int scene)\n{\n    REG_DISPCNT = 0;\n    REG_BG0HOFS = 0;\n    REG_BG0VOFS = 0;\n    REG_BLDCNT = 0;\n    LZ77UnCompVram(sBerryFixGraphics[scene][0], (void *)BG_CHAR_ADDR(0));\n    LZ77UnCompVram(sBerryFixGraphics[scene][1], (void *)BG_SCREEN_ADDR(31));\n    CpuCopy16(sBerryFixGraphics[scene][2], (void *)BG_PLTT, 0x200);\n    REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(31) | BGCNT_TXT256x256;\n    REG_DISPCNT = DISPCNT_BG0_ON;\n}\n\n#define tState data[0]\n#define tTimer data[1]\n\nvoid CB2_InitBerryFixProgram(void)\n{\n    u8 taskId;\n    DisableInterrupts(0xFFFF);\n    EnableInterrupts(INTR_FLAG_VBLANK);\n    m4aSoundVSyncOff();\n    SetVBlankCallback(NULL);\n    DmaFill32(3, 0, (void *)VRAM, VRAM_SIZE);\n    DmaFill32(3, 0, (void *)PLTT, PLTT_SIZE);\n    ResetSpriteData();\n    ResetTasks();\n    ScanlineEffect_Stop();\n    gHelpSystemEnabled = FALSE;\n    taskId = CreateTask(Task_BerryFixMain, 0);\n    gTasks[taskId].tState = STATE_BEGIN;\n    SetMainCallback2(CB2_BerryFix);\n}\n\nstatic void CB2_BerryFix(void)\n{\n    RunTasks();\n}\n\nstatic void Task_BerryFixMain(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    switch (tState)\n    {\n    case STATE_BEGIN:\n        SetScene(SCENE_BEGIN);\n        tState = STATE_CONNECT;\n        break;\n    case STATE_CONNECT:\n        if (JOY_NEW(A_BUTTON))\n        {\n            SetScene(SCENE_ENSURE_CONNECT);\n            tState = STATE_TURN_OFF_POWER;\n        }\n        break;\n    case STATE_TURN_OFF_POWER:\n        if (JOY_NEW(A_BUTTON))\n        {\n            SetScene(SCENE_TURN_OFF_POWER);\n            tState = STATE_INIT_MULTIBOOT;\n        }\n        break;\n    case STATE_INIT_MULTIBOOT:\n        gMultibootStart = gMultiBootProgram_BerryGlitchFix_Start;\n        gMultibootSize = gMultiBootProgram_BerryGlitchFix_End - gMultiBootProgram_BerryGlitchFix_Start;\n        gMultibootParam.masterp = (void *)gMultiBootProgram_BerryGlitchFix_Start;\n        gMultibootParam.server_type = MULTIBOOT_SERVER_TYPE_NORMAL;\n        MultiBootInit(&gMultibootParam);\n        tTimer = 0;\n        tState = STATE_MULTIBOOT;\n        break;\n    case STATE_MULTIBOOT:\n        if (gMultibootParam.probe_count == 0 && gMultibootParam.response_bit & 0x2 && gMultibootParam.client_bit & 0x2)\n        {\n            if (++tTimer > 180)\n            {\n                SetScene(SCENE_TRANSMITTING);\n                MultiBootStartMaster(&gMultibootParam, gMultibootStart + MULTIBOOT_HEADER_SIZE, gMultibootSize - MULTIBOOT_HEADER_SIZE, 4, 1);\n                tTimer = 0;\n                tState = STATE_TRANSMIT;\n            }\n            else\n            {\n                gMultibootStatus = MultiBootMain(&gMultibootParam);\n            }\n        }\n        else\n        {\n            tTimer = 0;\n            gMultibootStatus = MultiBootMain(&gMultibootParam);\n        }\n        break;\n    case STATE_TRANSMIT:\n        gMultibootStatus = MultiBootMain(&gMultibootParam);\n        if (MultiBootCheckComplete(&gMultibootParam))\n        {\n            SetScene(SCENE_FOLLOW_INSTRUCT);\n            tState = STATE_SUCCEEDED;\n        }\n        else if (!(gMultibootParam.client_bit & 2))\n        {\n            tState = STATE_FAILED;\n        }\n        break;\n    case STATE_SUCCEEDED:\n        tState = STATE_EXIT;\n        break;\n    case STATE_EXIT:\n        if (JOY_NEW(A_BUTTON))\n        {\n            DestroyTask(taskId);\n            DoSoftReset();\n        }\n        break;\n    case STATE_FAILED:\n        SetScene(SCENE_TRANSMIT_FAILED);\n        tState = STATE_RETRY;\n        break;\n    case STATE_RETRY:\n        if (JOY_NEW(A_BUTTON))\n            tState = STATE_BEGIN;\n        break;\n    }\n}\n"
  },
  {
    "path": "src/berry_pouch.c",
    "content": "#include \"global.h\"\n#include \"malloc.h\"\n#include \"bg.h\"\n#include \"decompress.h\"\n#include \"gpu_regs.h\"\n#include \"palette.h\"\n#include \"text.h\"\n#include \"berry_pouch.h\"\n#include \"item_menu.h\"\n#include \"menu_helpers.h\"\n#include \"new_menu_helpers.h\"\n#include \"scanline_effect.h\"\n#include \"item_menu_icons.h\"\n#include \"list_menu.h\"\n#include \"graphics.h\"\n#include \"berry.h\"\n#include \"item.h\"\n#include \"item_use.h\"\n#include \"party_menu.h\"\n#include \"text_window.h\"\n#include \"strings.h\"\n#include \"string_util.h\"\n#include \"sound.h\"\n#include \"link.h\"\n#include \"money.h\"\n#include \"shop.h\"\n#include \"menu.h\"\n#include \"menu_indicators.h\"\n#include \"pokemon_storage_system.h\"\n#include \"constants/items.h\"\n#include \"constants/songs.h\"\n#include \"constants/quest_log.h\"\n\nstruct BerryPouchStruct_203F36C\n{\n    void (*exitCallback)(void);\n    u16 indicatorOffset;\n    u8 indicatorTaskId;\n    u8 listMenuNumItems;\n    u8 listMenuMaxShowed;\n    u8 itemMenuIconId;\n    u8 ALIGNED(4) bg1TilemapBuffer[BG_SCREEN_SIZE];\n    s16 data[4];\n};\n\nstruct BerryPouchStruct_203F370\n{\n    void (*savedCallback)(void);\n    u8 type;\n    u8 allowSelect;\n    u8 unused_06;\n    u16 listMenuSelectedRow;\n    u16 listMenuScrollOffset;\n};\n\nenum\n{\n    BP_ACTION_USE = 0,\n    BP_ACTION_TOSS,\n    BP_ACTION_GIVE,\n    BP_ACTION_EXIT,\n    BP_ACTION_DUMMY\n};\n\nstatic EWRAM_DATA struct BerryPouchStruct_203F36C *sResources = NULL;\nstatic EWRAM_DATA struct BerryPouchStruct_203F370 sStaticCnt = {};\nstatic EWRAM_DATA struct ListMenuItem *sListMenuItems = NULL;\nstatic EWRAM_DATA u8 * sListMenuStrbuf = NULL;\nstatic EWRAM_DATA const u8 * sContextMenuOptions = NULL;\nstatic EWRAM_DATA u8 sContextMenuNumOptions = 0;\nstatic ALIGNED(4) EWRAM_DATA u8 sVariableWindowIds[14] = {};\nstatic ALIGNED(4) EWRAM_DATA u8 sBerryPouchSpriteId = 0;\n\nstatic void CB2_InitBerryPouch(void);\nstatic bool8 RunBerryPouchInit(void);\nstatic void AbortBerryPouchLoading(void);\nstatic void Task_AbortBerryPouchLoading_WaitFade(u8 taskId);\nstatic void BerryPouchInitBgs(void);\nstatic bool8 BerryPouchLoadGfx(void);\nstatic bool8 AllocateListMenuBuffers(void);\nstatic void SetUpListMenuTemplate(void);\nstatic void GetBerryNameAndIndexForMenu(u8 * dest, u16 itemId);\nstatic void BerryPouchMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list);\nstatic void BerryPouchItemPrintFunc(u8 windowId, u32 itemId, u8 y);\nstatic void BerryPouchSetArrowCursorAt(u8 y, u8 colorIdx);\nstatic void PrintSelectedBerryDescription(s32 itemIndex);\nstatic void CreateScrollIndicatorArrows_BerryPouchList(void);\nstatic void PrintBerryPouchHeaderCentered(void);\nstatic void SanitizeListMenuSelectionParams(void);\nstatic void UpdateListMenuScrollOffset(void);\nstatic void BerryPouch_DestroyResources(void);\nstatic void Task_BerryPouchFadeToExitCallback(u8 taskId);\nstatic void SortAndCountBerries(void);\nstatic void Task_BerryPouchMain(u8 taskId);\nstatic void Task_NormalContextMenu(u8 taskId);\nstatic void Task_NormalContextMenu_HandleInput(u8 taskId);\nstatic void Task_BerryPouch_Use(u8 taskId);\nstatic void Task_BerryPouch_Toss(u8 taskId);\nstatic void Task_AskTossMultiple(u8 taskId);\nstatic void Task_TossNo(u8 taskId);\nstatic void Task_Toss_SelectMultiple(u8 taskId);\nstatic void Task_TossYes(u8 taskId);\nstatic void Task_WaitButtonThenTossBerries(u8 taskId);\nstatic void Task_BerryPouch_Give(u8 taskId);\nstatic void Task_Give_PrintThereIsNoPokemon(u8 taskId);\nstatic void Task_WaitButtonBeforeDialogueWindowDestruction(u8 taskId);\nstatic void Task_BerryPouch_Exit(u8 taskId);\nstatic void Task_ContextMenu_FromPartyGiveMenu(u8 taskId);\nstatic void Task_ContextMenu_FromPokemonPC(u8 taskId);\nstatic void Task_ContextMenu_Sell(u8 taskId);\nstatic void Task_AskSellMultiple(u8 taskId);\nstatic void Task_SellMultiple_CreateYesNoMenu(u8 taskId);\nstatic void Task_SellNo(u8 taskId);\nstatic void Task_Sell_PrintSelectMultipleUI(u8 taskId);\nstatic void SellMultiple_UpdateSellPriceDisplay(s32 price);\nstatic void Task_Sell_SelectMultiple(u8 taskId);\nstatic void Task_SellYes(u8 taskId);\nstatic void Task_SellBerries_PlaySfxAndRemoveBerries(u8 taskId);\nstatic void Task_SellBerries_WaitButton(u8 taskId);\nstatic void BerryPouchInitWindows(void);\nstatic void BerryPouchPrint(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx);\nstatic u8 GetOrCreateVariableWindow(u8 winIdx);\nstatic void DestroyVariableWindow(u8 winIdx);\nstatic void TryDestroyVariableWindow(u8 winIdx);\nstatic u8 GetVariableWindowId(u8 winIdx);\nstatic void CreateYesNoMenuWin3(u8 taskId, const struct YesNoFuncTable *ptrs);\nstatic void CreateYesNoMenuWin4(u8 taskId, const struct YesNoFuncTable *ptrs);\nstatic void PrintMoneyInWin2(void);\nstatic void CreateBerryPouchSprite(void);\nstatic void StartBerryPouchSpriteWobbleAnim(void);\nstatic void SpriteCB_BerryPouchWaitWobbleAnim(struct Sprite *sprite);\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }\n};\n\nstatic const TaskFunc sBerryPouchContextMenuTasks[] = {\n    Task_NormalContextMenu,\n    Task_ContextMenu_FromPartyGiveMenu,\n    Task_ContextMenu_Sell,\n    Task_ContextMenu_FromPokemonPC,\n    Task_NormalContextMenu\n};\n\nstatic const struct YesNoFuncTable sYesNoFuncs_Toss = {\n    .yesFunc = Task_TossYes,\n    .noFunc  = Task_TossNo\n};\n\nstatic const struct YesNoFuncTable sYesNoFuncs_Sell = {\n    .yesFunc = Task_SellYes,\n    .noFunc  = Task_SellNo\n};\n\nstatic const struct MenuAction sContextMenuActions[] = {\n    {gOtherText_Use,  Task_BerryPouch_Use},\n    {gOtherText_Toss, Task_BerryPouch_Toss},\n    {gOtherText_Give, Task_BerryPouch_Give},\n    {gOtherText_Exit, Task_BerryPouch_Exit},\n    {gString_Dummy,   NULL}\n};\n\nstatic const u8 sOptions_UseGiveTossExit[] = {\n    BP_ACTION_USE,\n    BP_ACTION_GIVE,\n    BP_ACTION_TOSS,\n    BP_ACTION_EXIT\n};\n\nstatic const u8 sOptions_GiveExit[] = {\n    BP_ACTION_GIVE,\n    BP_ACTION_EXIT,\n    BP_ACTION_DUMMY,\n    BP_ACTION_DUMMY\n};\n\nstatic const u8 sOptions_Exit[] = {\n    BP_ACTION_EXIT,\n    BP_ACTION_DUMMY,\n    BP_ACTION_DUMMY,\n    BP_ACTION_DUMMY\n};\n\nstatic const u8 sOptions_UseToss_Exit[] = {\n    BP_ACTION_USE,\n    BP_ACTION_TOSS,\n    BP_ACTION_EXIT,\n    BP_ACTION_DUMMY\n};\n\nstatic const u8 sText_Space[] = _(\" \");\n\nstatic const struct WindowTemplate sWindowTemplates_Main[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 1,\n        .width = 18,\n        .height = 14,\n        .paletteNum = 15,\n        .baseBlock = 0x027\n    }, {\n        .bg = 0,\n        .tilemapLeft = 5,\n        .tilemapTop = 16,\n        .width = 25,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x123\n    }, {\n        .bg = 2,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 9,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x187\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sWindowTemplates_Variable[] = {\n    {\n        .bg = 2,\n        .tilemapLeft = 24,\n        .tilemapTop = 15,\n        .width = 5,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x1d1\n    }, {\n        .bg = 2,\n        .tilemapLeft = 17,\n        .tilemapTop = 9,\n        .width = 12,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x1d1\n    }, {\n        .bg = 2,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 8,\n        .height = 3,\n        .paletteNum = 12,\n        .baseBlock = 0x201\n    }, {\n        .bg = 2,\n        .tilemapLeft = 23,\n        .tilemapTop = 15,\n        .width = 6,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x219\n    }, {\n        .bg = 2,\n        .tilemapLeft = 21,\n        .tilemapTop = 9,\n        .width = 6,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x219\n    }, {\n        .bg = 2,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x231\n    }, {\n        .bg = 2,\n        .tilemapLeft = 6,\n        .tilemapTop = 15,\n        .width = 14,\n        .height = 4,\n        .paletteNum = 12,\n        .baseBlock = 0x231\n    }, {\n        .bg = 2,\n        .tilemapLeft = 6,\n        .tilemapTop = 15,\n        .width = 15,\n        .height = 4,\n        .paletteNum = 12,\n        .baseBlock = 0x269\n    }, {\n        .bg = 2,\n        .tilemapLeft = 6,\n        .tilemapTop = 15,\n        .width = 16,\n        .height = 4,\n        .paletteNum = 12,\n        .baseBlock = 0x2a5\n    }, {\n        .bg = 2,\n        .tilemapLeft = 6,\n        .tilemapTop = 15,\n        .width = 23,\n        .height = 4,\n        .paletteNum = 12,\n        .baseBlock = 0x2e5\n    }, {\n        .bg = 2,\n        .tilemapLeft = 22,\n        .tilemapTop = 17,\n        .width = 7,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x199\n    }, {\n        .bg = 2,\n        .tilemapLeft = 22,\n        .tilemapTop = 15,\n        .width = 7,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x199\n    }, {\n        .bg = 2,\n        .tilemapLeft = 22,\n        .tilemapTop = 13,\n        .width = 7,\n        .height = 6,\n        .paletteNum = 15,\n        .baseBlock = 0x199\n    }, {\n        .bg = 2,\n        .tilemapLeft = 22,\n        .tilemapTop = 11,\n        .width = 7,\n        .height = 8,\n        .paletteNum = 15,\n        .baseBlock = 0x199\n    }\n};\n\nstatic const u8 sTextColors[][3] = {\n    { 0, 1, 2 },\n    { 0, 2, 3 },\n    { 0, 3, 2 }\n};\n\nstatic const struct OamData sOamData = {\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .shape = ST_OAM_SQUARE,\n    .size = ST_OAM_SIZE_3,\n    .priority = 1\n};\n\nstatic const union AnimCmd sSpriteAnim_Dummy[] = {\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable[] = {\n    sSpriteAnim_Dummy\n};\n\nstatic const union AffineAnimCmd sSpriteAffineAnim_Static[] = {\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sSpriteAffineAnim_Wobble[] = {\n    AFFINEANIMCMD_FRAME(0, 0, -2, 2),\n    AFFINEANIMCMD_FRAME(0, 0,  2, 4),\n    AFFINEANIMCMD_FRAME(0, 0, -2, 4),\n    AFFINEANIMCMD_FRAME(0, 0,  2, 2),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sSpriteAffineAnimTable[] = {\n    sSpriteAffineAnim_Static,\n    sSpriteAffineAnim_Wobble\n};\n\nstatic const struct CompressedSpriteSheet sBerryPouchSpriteSheet = {\n    gBerryPouchSpriteTiles, 0x800, 100\n};\n\nstatic const struct CompressedSpritePalette sBerryPouchSpritePal = {\n    gBerryPouchSpritePalette, 100\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_BerryPouch = {\n    100, 100, &sOamData, sSpriteAnimTable, NULL, sSpriteAffineAnimTable, SpriteCallbackDummy\n};\n\nvoid InitBerryPouch(u8 type, void (*savedCallback)(void), u8 allowSelect)\n{\n    u32 i;\n\n    sResources = Alloc(sizeof(struct BerryPouchStruct_203F36C));\n    if (sResources == NULL)\n    {\n        SetMainCallback2(savedCallback);\n    }\n    else\n    {\n        if (type != BERRYPOUCH_NA)\n            sStaticCnt.type = type;\n        if (allowSelect != 0xFF)\n            sStaticCnt.allowSelect = allowSelect;\n        if (savedCallback != NULL)\n            sStaticCnt.savedCallback = savedCallback;\n        sResources->exitCallback = NULL;\n        sResources->itemMenuIconId = 0;\n        sResources->indicatorTaskId = 0xFF;\n        for (i = 0; i < 4; i++)\n            sResources->data[i] = 0;\n        gTextFlags.autoScroll = FALSE;\n        gSpecialVar_ItemId = ITEM_NONE;\n        SetMainCallback2(CB2_InitBerryPouch);\n    }\n}\n\nstatic void CB2_BerryPouchIdle(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    DoScheduledBgTilemapCopiesToVram();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB_BerryPouchIdle(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void CB2_InitBerryPouch(void)\n{\n    while (1)\n    {\n        if (IsActiveOverworldLinkBusy() == TRUE)\n            break;\n        if (RunBerryPouchInit() == TRUE)\n            break;\n        if (MenuHelpers_IsLinkActive() == TRUE)\n            break;\n    }\n}\n\nstatic bool8 RunBerryPouchInit(void)\n{\n    u8 taskId;\n\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankHBlankCallbacksToNull();\n        ClearScheduledBgCopiesToVram();\n        gMain.state++;\n        break;\n    case 1:\n        ScanlineEffect_Stop();\n        gMain.state++;\n        break;\n    case 2:\n        FreeAllSpritePalettes();\n        gMain.state++;\n        break;\n    case 3:\n        ResetPaletteFade();\n        gMain.state++;\n        break;\n    case 4:\n        ResetSpriteData();\n        gMain.state++;\n        break;\n    case 5:\n        ResetItemMenuIconState();\n        gMain.state++;\n        break;\n    case 6:\n        if (!MenuHelpers_IsLinkActive())\n            ResetTasks();\n        gMain.state++;\n        break;\n    case 7:\n        BerryPouchInitBgs();\n        sResources->data[0] = 0;\n        gMain.state++;\n        break;\n    case 8:\n        if (BerryPouchLoadGfx())\n            gMain.state++;\n        break;\n    case 9:\n        BerryPouchInitWindows();\n        gMain.state++;\n        break;\n    case 10:\n        SortAndCountBerries();\n        SanitizeListMenuSelectionParams();\n        UpdateListMenuScrollOffset();\n        gMain.state++;\n        break;\n    case 11:\n        if (!AllocateListMenuBuffers())\n        {\n            AbortBerryPouchLoading();\n            return TRUE;\n        }\n        gMain.state++;\n        break;\n    case 12:\n        SetUpListMenuTemplate();\n        gMain.state++;\n        break;\n    case 13:\n        PrintBerryPouchHeaderCentered();\n        gMain.state++;\n        break;\n    case 14:\n        taskId = CreateTask(Task_BerryPouchMain, 0);\n        gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sStaticCnt.listMenuScrollOffset, sStaticCnt.listMenuSelectedRow);\n        gTasks[taskId].data[8] = 0;\n        gMain.state++;\n        break;\n    case 15:\n        CreateBerryPouchSprite();\n        gMain.state++;\n        break;\n    case 16:\n        CreateScrollIndicatorArrows_BerryPouchList();\n        gMain.state++;\n        break;\n    case 17:\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        gMain.state++;\n        break;\n    case 18:\n        BeginNormalPaletteFade(PALETTES_ALL, -2, 16, 0, RGB_BLACK);\n        gMain.state++;\n        break;\n    default:\n        SetVBlankCallback(VBlankCB_BerryPouchIdle);\n        SetMainCallback2(CB2_BerryPouchIdle);\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic void AbortBerryPouchLoading(void)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK);\n    CreateTask(Task_AbortBerryPouchLoading_WaitFade, 0);\n    SetVBlankCallback(VBlankCB_BerryPouchIdle);\n    SetMainCallback2(CB2_BerryPouchIdle);\n}\n\nstatic void Task_AbortBerryPouchLoading_WaitFade(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        SetMainCallback2(sStaticCnt.savedCallback);\n        BerryPouch_DestroyResources();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void BerryPouchInitBgs(void)\n{\n    ResetAllBgsCoordinatesAndBgCntRegs();\n    memset(sResources->bg1TilemapBuffer, 0, BG_SCREEN_SIZE);\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));\n    SetBgTilemapBuffer(1, sResources->bg1TilemapBuffer);\n    ScheduleBgCopyTilemapToVram(1);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n}\n\nstatic bool8 BerryPouchLoadGfx(void)\n{\n    switch (sResources->data[0])\n    {\n    case 0:\n        ResetTempTileDataBuffers();\n        DecompressAndCopyTileDataToVram(1, gBerryPouchBgGfx, 0, 0, 0);\n        sResources->data[0]++;\n        break;\n    case 1:\n        if (FreeTempTileDataBuffersIfPossible() != TRUE)\n        {\n            LZDecompressWram(gBerryPouchBg1Tilemap, sResources->bg1TilemapBuffer);\n            sResources->data[0]++;\n        }\n        break;\n    case 2:\n        LoadCompressedPalette(gBerryPouchBgPals, BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP);\n        if (gSaveBlock2Ptr->playerGender != MALE)\n            LoadCompressedPalette(gBerryPouchBgPal0FemaleOverride, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n        sResources->data[0]++;\n        break;\n    case 3:\n        LoadCompressedSpriteSheet(&sBerryPouchSpriteSheet);\n        sResources->data[0]++;\n        break;\n    default:\n        LoadCompressedSpritePalette(&sBerryPouchSpritePal);\n        sResources->data[0] = 0;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 AllocateListMenuBuffers(void)\n{\n    sListMenuItems = Alloc(NUM_BERRIES * sizeof(struct ListMenuItem));\n    if (sListMenuItems == NULL)\n        return FALSE;\n    sListMenuStrbuf = Alloc(sResources->listMenuNumItems * 27);\n    if (sListMenuStrbuf == NULL)\n        return FALSE;\n    return TRUE;\n}\n\nstatic void SetUpListMenuTemplate(void)\n{\n    u32 i;\n    struct BagPocket *pocket = &gBagPockets[POCKET_BERRY_POUCH - 1];\n    for (i = 0; i < sResources->listMenuNumItems; i++)\n    {\n        GetBerryNameAndIndexForMenu(&sListMenuStrbuf[i * 27], pocket->itemSlots[i].itemId);\n        sListMenuItems[i].label = &sListMenuStrbuf[i * 27];\n        sListMenuItems[i].index = i;\n    }\n    sListMenuItems[i].label = gText_Close;\n    sListMenuItems[i].index = i;\n    gMultiuseListMenuTemplate.items = sListMenuItems;\n    if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH)\n        gMultiuseListMenuTemplate.totalItems = sResources->listMenuNumItems + 1;\n    else\n        gMultiuseListMenuTemplate.totalItems = sResources->listMenuNumItems;\n    gMultiuseListMenuTemplate.windowId = 0;\n    gMultiuseListMenuTemplate.header_X = 0;\n    gMultiuseListMenuTemplate.item_X = 9;\n    gMultiuseListMenuTemplate.cursor_X = 1;\n    gMultiuseListMenuTemplate.lettersSpacing = 0;\n    gMultiuseListMenuTemplate.itemVerticalPadding = 2;\n    gMultiuseListMenuTemplate.upText_Y = 2;\n    gMultiuseListMenuTemplate.maxShowed = sResources->listMenuMaxShowed;\n    gMultiuseListMenuTemplate.fontId = FONT_NORMAL;\n    gMultiuseListMenuTemplate.cursorPal = 2;\n    gMultiuseListMenuTemplate.fillValue = 0;\n    gMultiuseListMenuTemplate.cursorShadowPal = 3;\n    gMultiuseListMenuTemplate.moveCursorFunc = BerryPouchMoveCursorFunc;\n    gMultiuseListMenuTemplate.itemPrintFunc = BerryPouchItemPrintFunc;\n    gMultiuseListMenuTemplate.cursorKind = 0;\n    gMultiuseListMenuTemplate.scrollMultiple = LIST_MULTIPLE_SCROLL_DPAD;\n}\n\nstatic void GetBerryNameAndIndexForMenu(u8 * dest, u16 itemId)\n{\n    StringCopy(gStringVar4, gText_FontSmall);\n    StringAppend(gStringVar4, gText_NumberClear01);\n    ConvertIntToDecimalStringN(gStringVar1, itemId - FIRST_BERRY_INDEX + 1, STR_CONV_MODE_LEADING_ZEROS, 2);\n    StringAppend(gStringVar4, gStringVar1);\n    CopyItemName(itemId, gStringVar1);\n    StringAppend(gStringVar4, sText_Space);\n    StringAppend(gStringVar4, gText_FontNormal);\n    StringAppend(gStringVar4, gStringVar1);\n    StringCopy(dest, gStringVar4);\n}\n\nstatic void CopySelectedListMenuItemName(s16 itemIdx, u8 * dest)\n{\n    StringCopy(dest, &sListMenuStrbuf[itemIdx * 27]);\n}\n\nstatic void BerryPouchMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)\n{\n    if (onInit != TRUE)\n    {\n        PlaySE(SE_BAG_CURSOR);\n        StartBerryPouchSpriteWobbleAnim();\n    }\n    DestroyItemMenuIcon(sResources->itemMenuIconId ^ 1);\n    if (sResources->listMenuNumItems != itemIndex)\n        CreateBerryPouchItemIcon(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, itemIndex), sResources->itemMenuIconId);\n    else\n        CreateBerryPouchItemIcon(ITEMS_COUNT, sResources->itemMenuIconId);\n    sResources->itemMenuIconId ^= 1;\n    PrintSelectedBerryDescription(itemIndex);\n}\n\nstatic void BerryPouchItemPrintFunc(u8 windowId, u32 itemId, u8 y)\n{\n    u16 unused;\n    u16 itemQuantity;\n    if (itemId != -2 && sResources->listMenuNumItems != itemId)\n    {\n        unused = BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, itemId);\n        itemQuantity = BagGetQuantityByPocketPosition(POCKET_BERRY_POUCH, itemId);\n        ConvertIntToDecimalStringN(gStringVar1, itemQuantity, STR_CONV_MODE_RIGHT_ALIGN, 3);\n        StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n        BerryPouchPrint(windowId, FONT_SMALL, gStringVar4, 110, y, 0, 0, 0xFF, 1);\n    }\n}\n\nstatic void BerryPouchSetArrowCursorFromListMenu(u8 taskId, u8 colorIdx)\n{\n    BerryPouchSetArrowCursorAt(ListMenuGetYCoordForPrintingArrowCursor(taskId), colorIdx);\n}\n\nstatic void BerryPouchSetArrowCursorAt(u8 y, u8 colorIdx)\n{\n    u8 width;\n    u8 height;\n    if (colorIdx == 0xFF)\n    {\n        width = GetMenuCursorDimensionByFont(FONT_NORMAL, 0);\n        height = GetMenuCursorDimensionByFont(FONT_NORMAL, 1);\n        FillWindowPixelRect(0, 0, 1, y, width, height);\n        CopyWindowToVram(0, COPYWIN_GFX);\n    }\n    else\n    {\n        BerryPouchPrint(0, FONT_NORMAL, gText_SelectorArrow2, 1, y, 0, 0, 0, colorIdx);\n    }\n}\n\nstatic void PrintSelectedBerryDescription(s32 itemIdx)\n{\n    const u8 * str;\n    if (itemIdx != sResources->listMenuNumItems)\n        str = ItemId_GetDescription(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, itemIdx));\n    else\n        str = gText_TheBerryPouchWillBePutAway;\n    FillWindowPixelBuffer(1, PIXEL_FILL(0));\n    BerryPouchPrint(1, FONT_NORMAL, str, 0, 2, 2, 0, 0, 0);\n}\n\nstatic void SetDescriptionWindowBorderPalette(s32 pal)\n{\n    SetBgTilemapPalette(1, 0, 16, 30, 4, pal + 1);\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nstatic void CreateScrollIndicatorArrows_BerryPouchList(void)\n{\n    if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH)\n        sResources->indicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 160, 8, 120, sResources->listMenuNumItems - sResources->listMenuMaxShowed + 1, 110, 110, &sStaticCnt.listMenuScrollOffset);\n    else\n        sResources->indicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 160, 8, 120, sResources->listMenuNumItems - sResources->listMenuMaxShowed, 110, 110, &sStaticCnt.listMenuScrollOffset);\n}\n\nstatic void CreateScrollIndicatorArrows_TossQuantity(void)\n{\n    sResources->indicatorOffset = 1;\n    sResources->indicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 212, 120, 152, 2, 110, 110, &sResources->indicatorOffset);\n}\n\nstatic void CreateScrollIndicatorArrows_SellQuantity(void)\n{\n    sResources->indicatorOffset = 1;\n    sResources->indicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 152, 72, 104, 2, 110, 110, &sResources->indicatorOffset);\n}\n\nstatic void DestroyScrollIndicatorArrows(void)\n{\n    if (sResources->indicatorTaskId != 0xFF)\n    {\n        RemoveScrollIndicatorArrowPair(sResources->indicatorTaskId);\n        sResources->indicatorTaskId = 0xFF;\n    }\n}\n\nstatic void PrintBerryPouchHeaderCentered(void)\n{\n    u32 slack = 72 - GetStringWidth(FONT_NORMAL_COPY_1, gText_BerryPouch, 0);\n    BerryPouchPrint(2, FONT_NORMAL_COPY_1, gText_BerryPouch, slack / 2, 1, 0, 0, 0, 0);\n}\n\nvoid BerryPouch_CursorResetToTop(void)\n{\n    sStaticCnt.listMenuSelectedRow = 0;\n    sStaticCnt.listMenuScrollOffset = 0;\n}\n\nstatic void SanitizeListMenuSelectionParams(void)\n{\n    s32 r2;\n    if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH)\n        r2 = sResources->listMenuNumItems + 1;\n    else\n        r2 = sResources->listMenuNumItems;\n    if (sStaticCnt.listMenuScrollOffset != 0 && sStaticCnt.listMenuScrollOffset + sResources->listMenuMaxShowed > r2)\n        sStaticCnt.listMenuScrollOffset = r2 - sResources->listMenuMaxShowed;\n    if (sStaticCnt.listMenuScrollOffset + sStaticCnt.listMenuSelectedRow >= r2)\n    {\n        if (r2 == 0 || r2 == 1)\n            sStaticCnt.listMenuSelectedRow = 0;\n        else\n            sStaticCnt.listMenuSelectedRow = r2 - 1;\n    }\n}\n\nstatic void UpdateListMenuScrollOffset(void)\n{\n    u8 lim;\n    u32 i;\n    if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH)\n        lim = sResources->listMenuNumItems + 1;\n    else\n        lim = sResources->listMenuNumItems;\n    if (sStaticCnt.listMenuSelectedRow > 4)\n    {\n        for (i = 0; i <= sStaticCnt.listMenuSelectedRow - 4; sStaticCnt.listMenuSelectedRow--, sStaticCnt.listMenuScrollOffset++, i++)\n        {\n            if (sStaticCnt.listMenuScrollOffset + sResources->listMenuMaxShowed == lim)\n                break;\n        }\n    }\n}\n\nstatic void BerryPouch_DestroyResources(void)\n{\n    if (sResources != NULL)\n        Free(sResources);\n    if (sListMenuItems != NULL)\n        Free(sListMenuItems);\n    if (sListMenuStrbuf != NULL)\n        Free(sListMenuStrbuf);\n    FreeAllWindowBuffers();\n}\n\nvoid BerryPouch_StartFadeToExitCallback(u8 taskId)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK);\n    gTasks[taskId].func = Task_BerryPouchFadeToExitCallback;\n}\n\nstatic void Task_BerryPouchFadeToExitCallback(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    if (!gPaletteFade.active)\n    {\n        DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow);\n        if (sResources->exitCallback != NULL)\n            SetMainCallback2(sResources->exitCallback);\n        else\n            SetMainCallback2(sStaticCnt.savedCallback);\n        DestroyScrollIndicatorArrows();\n        BerryPouch_DestroyResources();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void SortAndCountBerries(void)\n{\n    u32 i;\n    u32 r2;\n    struct BagPocket *pocket = &gBagPockets[POCKET_BERRY_POUCH - 1];\n    SortAndCompactBagPocket(pocket);\n    sResources->listMenuNumItems = 0;\n    for (i = 0; i < pocket->capacity; i++)\n    {\n        if (pocket->itemSlots[i].itemId == ITEM_NONE)\n            break;\n        sResources->listMenuNumItems++;\n    }\n    if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH)\n        r2 = sResources->listMenuNumItems + 1;\n    else\n        r2 = sResources->listMenuNumItems;\n    if (r2 > 7)\n        sResources->listMenuMaxShowed = 7;\n    else\n        sResources->listMenuMaxShowed = r2;\n}\n\nvoid BerryPouch_SetExitCallback(void (*callback)(void))\n{\n    sResources->exitCallback = callback;\n}\n\nvoid InitTossQuantitySelectUI(u8 taskId, const u8 * str)\n{\n    s16 * data = gTasks[taskId].data;\n    u8 windowId = GetOrCreateVariableWindow(8);\n    u8 windowId2;\n    CopySelectedListMenuItemName(data[1], gStringVar1);\n    StringExpandPlaceholders(gStringVar4, str);\n    BerryPouchPrint(windowId, FONT_NORMAL, gStringVar4, 0, 2, 1, 2, 0, 1);\n    windowId2 = GetOrCreateVariableWindow(0);\n    ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 3);\n    StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n    BerryPouchPrint(windowId2, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0, 1);\n}\n\nstatic void PrintxQuantityOnWindow(u8 whichWindow, s16 quantity, u8 ndigits)\n{\n    u8 windowId = GetVariableWindowId(whichWindow);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_LEADING_ZEROS, ndigits);\n    StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n    BerryPouchPrint(windowId, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0, 1);\n}\n\nstatic void Task_BerryPouchMain(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    s32 menuInput;\n    if (!gPaletteFade.active && IsActiveOverworldLinkBusy() != TRUE)\n    {\n        menuInput = ListMenu_ProcessInput(data[0]);\n        ListMenuGetScrollAndRow(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow);\n        if (JOY_NEW(SELECT_BUTTON) && sStaticCnt.allowSelect == 1)\n        {\n            PlaySE(SE_SELECT);\n            gSpecialVar_ItemId = 0;\n            BerryPouch_StartFadeToExitCallback(taskId);\n        }\n        else\n        {\n            switch (menuInput)\n            {\n            case -1:\n                return;\n            case -2:\n                if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH)\n                {\n                    PlaySE(SE_SELECT);\n                    gSpecialVar_ItemId = 0;\n                    BerryPouch_StartFadeToExitCallback(taskId);\n                }\n                break;\n            default:\n                PlaySE(SE_SELECT);\n                if (sStaticCnt.type == BERRYPOUCH_FROMBERRYCRUSH)\n                {\n                    gSpecialVar_ItemId = BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, menuInput);\n                    BerryPouch_StartFadeToExitCallback(taskId);\n                }\n                else if (menuInput == sResources->listMenuNumItems)\n                {\n                    gSpecialVar_ItemId = 0;\n                    BerryPouch_StartFadeToExitCallback(taskId);\n                }\n                else\n                {\n                    DestroyScrollIndicatorArrows();\n                    SetDescriptionWindowBorderPalette(1);\n                    BerryPouchSetArrowCursorFromListMenu(data[0], 2);\n                    data[1] = menuInput;\n                    data[2] = BagGetQuantityByPocketPosition(POCKET_BERRY_POUCH, menuInput);\n                    gSpecialVar_ItemId = BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, menuInput);\n                    gTasks[taskId].func = sBerryPouchContextMenuTasks[sStaticCnt.type];\n                }\n                break;\n            }\n        }\n    }\n}\n\nstatic void Task_CleanUpAndReturnToMain(u8 taskId)\n{\n    SetDescriptionWindowBorderPalette(0);\n    CreateScrollIndicatorArrows_BerryPouchList();\n    gTasks[taskId].func = Task_BerryPouchMain;\n}\n\nstatic void CreateNormalContextMenu(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    u8 windowId;\n    u8 windowId2;\n\n    if (sStaticCnt.type == BERRYPOUCH_FROMBATTLE)\n    {\n        sContextMenuOptions = sOptions_UseToss_Exit;\n        sContextMenuNumOptions = 3;\n    }\n    else if (MenuHelpers_IsLinkActive() == TRUE || InUnionRoom() == TRUE)\n    {\n        if (!IsHoldingItemAllowed(gSpecialVar_ItemId))\n        {\n            sContextMenuOptions = sOptions_Exit;\n            sContextMenuNumOptions = 1;\n        }\n        else\n        {\n            sContextMenuOptions = sOptions_GiveExit;\n            sContextMenuNumOptions = 2;\n        }\n    }\n    else\n    {\n        sContextMenuOptions = sOptions_UseGiveTossExit;\n        sContextMenuNumOptions = 4;\n    }\n    windowId = GetOrCreateVariableWindow(sContextMenuNumOptions + 9);\n    AddItemMenuActionTextPrinters(windowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING), GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumOptions, sContextMenuActions, sContextMenuOptions);\n    Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumOptions, 0);\n    windowId2 = GetOrCreateVariableWindow(6);\n    CopySelectedListMenuItemName(data[1], gStringVar1);\n    StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected);\n    BerryPouchPrint(windowId2, FONT_NORMAL, gStringVar4, 0, 2, 1, 2, 0, 1);\n}\n\nstatic void Task_NormalContextMenu(u8 taskId)\n{\n    CreateNormalContextMenu(taskId);\n    gTasks[taskId].func = Task_NormalContextMenu_HandleInput;\n}\n\nstatic void Task_NormalContextMenu_HandleInput(u8 taskId)\n{\n    s8 input;\n    if (IsActiveOverworldLinkBusy() != TRUE)\n    {\n        input = Menu_ProcessInputNoWrapAround();\n        switch (input)\n        {\n        case -2:\n            break;\n        case -1:\n            PlaySE(SE_SELECT);\n            sContextMenuActions[BP_ACTION_EXIT].func.void_u8(taskId);\n            break;\n        default:\n            PlaySE(SE_SELECT);\n            sContextMenuActions[sContextMenuOptions[input]].func.void_u8(taskId);\n            break;\n        }\n    }\n}\n\nstatic void Task_BerryPouch_Use(u8 taskId)\n{\n    DestroyVariableWindow(sContextMenuNumOptions + 9);\n    DestroyVariableWindow(6);\n    PutWindowTilemap(0);\n    PutWindowTilemap(1);\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(2);\n    if (sStaticCnt.type == BERRYPOUCH_FROMBATTLE)\n    {\n        if (ItemId_GetBattleFunc(gSpecialVar_ItemId) == NULL)\n            FieldUseFunc_OakStopsYou(taskId);\n        else\n            ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId);\n    }\n    else if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == ITEM_TYPE_PARTY_MENU)\n        Task_Give_PrintThereIsNoPokemon(taskId);\n    else\n        ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);\n}\n\nstatic void Task_BerryPouch_Toss(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    ClearWindowTilemap(GetVariableWindowId(sContextMenuNumOptions + 9));\n    ClearWindowTilemap(GetVariableWindowId(6));\n    DestroyVariableWindow(sContextMenuNumOptions + 9);\n    DestroyVariableWindow(6);\n    PutWindowTilemap(0);\n    data[8] = 1;\n    if (data[2] == 1)\n        Task_AskTossMultiple(taskId);\n    else\n    {\n        InitTossQuantitySelectUI(taskId, gText_TossOutHowManyStrVar1s);\n        CreateScrollIndicatorArrows_TossQuantity();\n        gTasks[taskId].func = Task_Toss_SelectMultiple;\n    }\n}\n\nstatic void Task_AskTossMultiple(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);\n    StringExpandPlaceholders(gStringVar4, gText_ThrowAwayStrVar2OfThisItemQM);\n    BerryPouchPrint(GetOrCreateVariableWindow(7), FONT_NORMAL, gStringVar4, 0, 2, 1, 2, 0, 1);\n    CreateYesNoMenuWin3(taskId, &sYesNoFuncs_Toss);\n}\n\nstatic void Task_TossNo(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    DestroyVariableWindow(7);\n    PutWindowTilemap(1);\n    PutWindowTilemap(0);\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(2);\n    BerryPouchSetArrowCursorFromListMenu(data[0], 1);\n    Task_CleanUpAndReturnToMain(taskId);\n}\n\nstatic void Task_Toss_SelectMultiple(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)\n        PrintxQuantityOnWindow(0, data[8], 3);\n    else if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        ClearWindowTilemap(GetVariableWindowId(8));\n        DestroyVariableWindow(8);\n        DestroyVariableWindow(0);\n        ScheduleBgCopyTilemapToVram(0);\n        ScheduleBgCopyTilemapToVram(2);\n        DestroyScrollIndicatorArrows();\n        Task_AskTossMultiple(taskId);\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        DestroyVariableWindow(8);\n        DestroyVariableWindow(0);\n        PutWindowTilemap(0);\n        PutWindowTilemap(1);\n        ScheduleBgCopyTilemapToVram(0);\n        ScheduleBgCopyTilemapToVram(2);\n        BerryPouchSetArrowCursorFromListMenu(data[0], 1);\n        DestroyScrollIndicatorArrows();\n        Task_CleanUpAndReturnToMain(taskId);\n    }\n}\n\nstatic void Task_TossYes(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    DestroyVariableWindow(7);\n    CopySelectedListMenuItemName(data[1], gStringVar1);\n    ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);\n    StringExpandPlaceholders(gStringVar4, gText_ThrewAwayStrVar2StrVar1s);\n    BerryPouchPrint(GetOrCreateVariableWindow(9), FONT_NORMAL, gStringVar4, 0, 2, 1, 2, 0, 1);\n    gTasks[taskId].func = Task_WaitButtonThenTossBerries;\n}\n\nstatic void Task_WaitButtonThenTossBerries(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        RemoveBagItem(gSpecialVar_ItemId, data[8]);\n        DestroyVariableWindow(9);\n        DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow);\n        SortAndCountBerries();\n        SanitizeListMenuSelectionParams();\n        SetUpListMenuTemplate();\n        data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sStaticCnt.listMenuScrollOffset, sStaticCnt.listMenuSelectedRow);\n        PutWindowTilemap(1);\n        ScheduleBgCopyTilemapToVram(0);\n        BerryPouchSetArrowCursorFromListMenu(data[0], 1);\n        Task_CleanUpAndReturnToMain(taskId);\n    }\n}\n\nstatic void Task_BerryPouch_Give(u8 taskId)\n{\n    DestroyVariableWindow(sContextMenuNumOptions + 9);\n    DestroyVariableWindow(6);\n    PutWindowTilemap(0);\n    PutWindowTilemap(1);\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(2);\n    if (CalculatePlayerPartyCount() == 0)\n        Task_Give_PrintThereIsNoPokemon(taskId);\n    else\n    {\n        sResources->exitCallback = CB2_ChooseMonToGiveItem;\n        gTasks[taskId].func = BerryPouch_StartFadeToExitCallback;\n    }\n}\n\nstatic void Task_Give_PrintThereIsNoPokemon(u8 taskId)\n{\n    DisplayItemMessageInBerryPouch(taskId, FONT_NORMAL, gText_ThereIsNoPokemon, Task_WaitButtonBeforeDialogueWindowDestruction);\n}\n\nstatic void Task_WaitButtonBeforeDialogueWindowDestruction(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu(taskId);\n    }\n}\n\nvoid Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    TryDestroyVariableWindow(5);\n    DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow);\n    SortAndCountBerries();\n    SanitizeListMenuSelectionParams();\n    SetUpListMenuTemplate();\n    data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sStaticCnt.listMenuScrollOffset, sStaticCnt.listMenuSelectedRow);\n    ScheduleBgCopyTilemapToVram(0);\n    BerryPouchSetArrowCursorFromListMenu(data[0], 1);\n    Task_CleanUpAndReturnToMain(taskId);\n}\n\nstatic void Task_BerryPouch_Exit(u8 taskId)\n{\n    DestroyVariableWindow(sContextMenuNumOptions + 9);\n    DestroyVariableWindow(6);\n    PutWindowTilemap(0);\n    PutWindowTilemap(1);\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(2);\n    BerryPouchSetArrowCursorFromListMenu(gTasks[taskId].data[0], 1);\n    Task_CleanUpAndReturnToMain(taskId);\n}\n\nstatic void Task_ContextMenu_FromPartyGiveMenu(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    u16 itemId = BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1]);\n    if (!IsHoldingItemAllowed(itemId))\n    {\n        CopyItemName(itemId, gStringVar1);\n        StringExpandPlaceholders(gStringVar4, gText_TheStrVar1CantBeHeldHere);\n        DisplayItemMessageInBerryPouch(taskId, FONT_NORMAL, gStringVar4, Task_WaitButtonBeforeDialogueWindowDestruction);\n    }\n    else\n    {\n        sResources->exitCallback = CB2_GiveHoldItem;\n        gTasks[taskId].func = BerryPouch_StartFadeToExitCallback;\n    }\n}\n\nstatic void Task_ContextMenu_FromPokemonPC(u8 taskId)\n{\n    sResources->exitCallback = CB2_ReturnToPokeStorage;\n    gTasks[taskId].func = BerryPouch_StartFadeToExitCallback;\n}\n\nstatic void Task_ContextMenu_Sell(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    if (ItemId_GetPrice(gSpecialVar_ItemId) == 0)\n    {\n        CopyItemName(gSpecialVar_ItemId, gStringVar1);\n        StringExpandPlaceholders(gStringVar4, gText_OhNoICantBuyThat);\n        DisplayItemMessageInBerryPouch(taskId, GetDialogBoxFontId(), gStringVar4, Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu);\n    }\n    else\n    {\n        data[8] = 1;\n        if (data[2] == 1)\n        {\n            PrintMoneyInWin2();\n            Task_AskSellMultiple(taskId);\n        }\n        else\n        {\n            if (data[2] > 99)\n                data[2] = 99;\n            CopyItemName(gSpecialVar_ItemId, gStringVar1);\n            StringExpandPlaceholders(gStringVar4, gText_HowManyWouldYouLikeToSell);\n            DisplayItemMessageInBerryPouch(taskId, GetDialogBoxFontId(), gStringVar4, Task_Sell_PrintSelectMultipleUI);\n        }\n    }\n}\n\nstatic void Task_AskSellMultiple(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    ConvertIntToDecimalStringN(gStringVar3, ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6);\n    StringExpandPlaceholders(gStringVar4, gText_ICanPayThisMuch_WouldThatBeOkay);\n    DisplayItemMessageInBerryPouch(taskId, GetDialogBoxFontId(), gStringVar4, Task_SellMultiple_CreateYesNoMenu);\n}\n\nstatic void Task_SellMultiple_CreateYesNoMenu(u8 taskId)\n{\n    CreateYesNoMenuWin4(taskId, &sYesNoFuncs_Sell);\n}\n\nstatic void Task_SellNo(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    DestroyVariableWindow(2);\n    TryDestroyVariableWindow(5);\n    PutWindowTilemap(2);\n    PutWindowTilemap(0);\n    PutWindowTilemap(1);\n    ScheduleBgCopyTilemapToVram(0);\n    BerryPouchSetArrowCursorFromListMenu(data[0], 1);\n    Task_CleanUpAndReturnToMain(taskId);\n}\n\nstatic void Task_Sell_PrintSelectMultipleUI(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    u8 windowId = GetOrCreateVariableWindow(1);\n    ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 2);\n    StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n    BerryPouchPrint(windowId, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0xFF, 1);\n    SellMultiple_UpdateSellPriceDisplay(ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8]);\n    PrintMoneyInWin2();\n    CreateScrollIndicatorArrows_SellQuantity();\n    gTasks[taskId].func = Task_Sell_SelectMultiple;\n}\n\nstatic void SellMultiple_UpdateSellPriceDisplay(s32 price)\n{\n    PrintMoneyAmount(GetVariableWindowId(1), 56, 10, price, 0);\n}\n\nstatic void Task_Sell_SelectMultiple(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)\n    {\n        PrintxQuantityOnWindow(1, data[8], 2);\n        SellMultiple_UpdateSellPriceDisplay(ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8]);\n    }\n    else if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        DestroyVariableWindow(1);\n        PutWindowTilemap(0);\n        ScheduleBgCopyTilemapToVram(0);\n        DestroyScrollIndicatorArrows();\n        Task_AskSellMultiple(taskId);\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        DestroyVariableWindow(1);\n        DestroyVariableWindow(2);\n        TryDestroyVariableWindow(5);\n        PutWindowTilemap(2);\n        PutWindowTilemap(0);\n        PutWindowTilemap(1);\n        ScheduleBgCopyTilemapToVram(0);\n        DestroyScrollIndicatorArrows();\n        BerryPouchSetArrowCursorFromListMenu(data[0], 1);\n        Task_CleanUpAndReturnToMain(taskId);\n    }\n}\n\nstatic void Task_SellYes(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    PutWindowTilemap(0);\n    ScheduleBgCopyTilemapToVram(0);\n    CopyItemName(gSpecialVar_ItemId, gStringVar1);\n    ConvertIntToDecimalStringN(gStringVar3, ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6);\n    StringExpandPlaceholders(gStringVar4, gText_TurnedOverItemsWorthYen);\n    DisplayItemMessageInBerryPouch(taskId, FONT_NORMAL, gStringVar4, Task_SellBerries_PlaySfxAndRemoveBerries);\n}\n\nstatic void Task_SellBerries_PlaySfxAndRemoveBerries(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    PlaySE(SE_SHOP);\n    RemoveBagItem(gSpecialVar_ItemId, data[8]);\n    AddMoney(&gSaveBlock1Ptr->money, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * data[8]);\n    RecordItemTransaction(gSpecialVar_ItemId, data[8], QL_EVENT_SOLD_ITEM - QL_EVENT_USED_POKEMART);\n    DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow);\n    SortAndCountBerries();\n    SanitizeListMenuSelectionParams();\n    SetUpListMenuTemplate();\n    data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sStaticCnt.listMenuScrollOffset, sStaticCnt.listMenuSelectedRow);\n    BerryPouchSetArrowCursorFromListMenu(data[0], 2);\n    PrintMoneyAmountInMoneyBox(GetVariableWindowId(2), GetMoney(&gSaveBlock1Ptr->money), 0);\n    gTasks[taskId].func = Task_SellBerries_WaitButton;\n}\n\nstatic void Task_SellBerries_WaitButton(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        DestroyVariableWindow(2);\n        PutWindowTilemap(2);\n        Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu(taskId);\n    }\n}\n\nstatic void BerryPouchInitWindows(void)\n{\n    u32 i;\n    InitWindows(sWindowTemplates_Main);\n    DeactivateAllTextPrinters();\n    LoadUserWindowGfx(0, 0x001, BG_PLTT_ID(14));\n    LoadMenuMessageWindowGfx(0, 0x013, BG_PLTT_ID(13));\n    LoadStdWindowGfx(0, 0x00A, BG_PLTT_ID(12));\n    LoadPalette(gStandardMenuPalette, BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n    for (i = 0; i < 3; i++)\n        FillWindowPixelBuffer(i, PIXEL_FILL(0));\n    PutWindowTilemap(0);\n    PutWindowTilemap(1);\n    PutWindowTilemap(2);\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(2);\n    for (i = 0; i < 14; i++)\n        sVariableWindowIds[i] = 0xFF;\n}\n\nstatic void BerryPouchPrint(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx)\n{\n    AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, sTextColors[colorIdx], speed, str);\n}\n\nstatic u8 GetOrCreateVariableWindow(u8 winIdx)\n{\n    u8 retval = sVariableWindowIds[winIdx];\n    if (retval == 0xFF)\n    {\n        sVariableWindowIds[winIdx] = AddWindow(&sWindowTemplates_Variable[winIdx]);\n        if (winIdx == 2 || winIdx == 6 || winIdx == 7 || winIdx == 8 || winIdx == 9)\n            DrawStdFrameWithCustomTileAndPalette(sVariableWindowIds[winIdx], FALSE, 0x00A, 12);\n        else\n            DrawStdFrameWithCustomTileAndPalette(sVariableWindowIds[winIdx], FALSE, 0x001, 14);\n        ScheduleBgCopyTilemapToVram(2);\n        retval = sVariableWindowIds[winIdx];\n    }\n    return retval;\n}\n\nstatic void VariableWindowSetAltFrameTileAndPalette(u8 winIdx)\n{\n    DrawStdFrameWithCustomTileAndPalette(sVariableWindowIds[winIdx], FALSE, 0x001, 14);\n}\n\nstatic void DestroyVariableWindow(u8 winIdx)\n{\n    ClearStdWindowAndFrameToTransparent(sVariableWindowIds[winIdx], FALSE);\n    ClearWindowTilemap(sVariableWindowIds[winIdx]);\n    RemoveWindow(sVariableWindowIds[winIdx]);\n    ScheduleBgCopyTilemapToVram(2);\n    sVariableWindowIds[winIdx] = 0xFF;\n}\n\nstatic void TryDestroyVariableWindow(u8 winIdx)\n{\n    if (sVariableWindowIds[winIdx] != 0xFF)\n    {\n        ClearDialogWindowAndFrameToTransparent(sVariableWindowIds[winIdx], FALSE);\n        ClearWindowTilemap(sVariableWindowIds[winIdx]);\n        RemoveWindow(sVariableWindowIds[winIdx]);\n        PutWindowTilemap(1);\n        ScheduleBgCopyTilemapToVram(0);\n        ScheduleBgCopyTilemapToVram(2);\n        sVariableWindowIds[winIdx] = 0xFF;\n    }\n}\n\nstatic u8 GetVariableWindowId(u8 winIdx)\n{\n    return sVariableWindowIds[winIdx];\n}\n\nvoid DisplayItemMessageInBerryPouch(u8 taskId, u8 fontId, const u8 * str, TaskFunc followUpFunc)\n{\n    if (sVariableWindowIds[5] == 0xFF)\n        sVariableWindowIds[5] = AddWindow(&sWindowTemplates_Variable[5]);\n    DisplayMessageAndContinueTask(taskId, sVariableWindowIds[5], 0x013, 0xD, fontId, GetTextSpeedSetting(), str, followUpFunc);\n    ScheduleBgCopyTilemapToVram(2);\n}\n\nstatic void CreateYesNoMenuWin3(u8 taskId, const struct YesNoFuncTable *ptrs)\n{\n    CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates_Variable[3], FONT_NORMAL, 0, 2, 0x001, 14, ptrs);\n}\n\nstatic void CreateYesNoMenuWin4(u8 taskId, const struct YesNoFuncTable *ptrs)\n{\n    CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates_Variable[4], FONT_NORMAL, 0, 2, 0x001, 14, ptrs);\n}\n\nstatic void PrintMoneyInWin2(void)\n{\n    PrintMoneyAmountInMoneyBoxWithBorder(GetOrCreateVariableWindow(2), 0x00A, 0xC, GetMoney(&gSaveBlock1Ptr->money));\n}\n\nstatic void CreateBerryPouchSprite(void)\n{\n    sBerryPouchSpriteId = CreateSprite(&sSpriteTemplate_BerryPouch, 40, 76, 0);\n}\n\nstatic void StartBerryPouchSpriteWobbleAnim(void)\n{\n    struct Sprite *sprite = &gSprites[sBerryPouchSpriteId];\n    if (sprite->affineAnimEnded)\n    {\n        StartSpriteAffineAnim(sprite, 1);\n        sprite->callback = SpriteCB_BerryPouchWaitWobbleAnim;\n    }\n}\n\nstatic void SpriteCB_BerryPouchWaitWobbleAnim(struct Sprite *sprite)\n{\n    if (sprite->affineAnimEnded)\n    {\n        StartSpriteAffineAnim(sprite, 0);\n        sprite->callback = SpriteCallbackDummy;\n    }\n}\n"
  },
  {
    "path": "src/berry_powder.c",
    "content": "#include \"global.h\"\n#include \"event_data.h\"\n#include \"load_save.h\"\n#include \"menu.h\"\n#include \"palette.h\"\n#include \"quest_log.h\"\n#include \"script_menu.h\"\n#include \"string_util.h\"\n#include \"strings.h\"\n#include \"text.h\"\n#include \"text_window.h\"\n\n#define MAX_BERRY_POWDER 99999\n\nstatic EWRAM_DATA u8 sBerryPowderVendorWindowId = 0;\n\nu32 DecryptBerryPowder(u32 *powder)\n{\n    return *powder ^ gSaveBlock2Ptr->encryptionKey;\n}\n\nvoid SetBerryPowder(u32 *powder, u32 amount)\n{\n    *powder = amount ^ gSaveBlock2Ptr->encryptionKey;\n}\n\nvoid ApplyNewEncryptionKeyToBerryPowder(u32 encryptionKey)\n{\n    ApplyNewEncryptionKeyToWord(&gSaveBlock2Ptr->berryCrush.berryPowderAmount, encryptionKey);\n}\n\nstatic bool8 HasEnoughBerryPowder(u32 cost)\n{\n    if (DecryptBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount) < cost)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nbool8 Script_HasEnoughBerryPowder(void)\n{\n    if (DecryptBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount) < gSpecialVar_0x8004)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nbool8 GiveBerryPowder(u32 amountToAdd)\n{\n    u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;\n    u32 amount = DecryptBerryPowder(powder) + amountToAdd;\n    if (amount > MAX_BERRY_POWDER)\n    {\n        SetBerryPowder(powder, MAX_BERRY_POWDER);\n        return FALSE;\n    }\n    else\n    {\n        SetBerryPowder(powder, amount);\n        return TRUE;\n    }\n}\n\nstatic bool8 TakeBerryPowder(u32 cost)\n{\n    u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;\n    if (!HasEnoughBerryPowder(cost))\n        return FALSE;\n    else\n    {\n        u32 amount = DecryptBerryPowder(powder);\n        SetBerryPowder(powder, amount - cost);\n        return TRUE;\n    }\n}\n\nbool8 Script_TakeBerryPowder(void)\n{\n    u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;\n    if (!HasEnoughBerryPowder(gSpecialVar_0x8004))\n        return FALSE;\n    else\n    {\n        u32 amount = DecryptBerryPowder(powder);\n        SetBerryPowder(powder, amount - gSpecialVar_0x8004);\n        return TRUE;\n    }\n}\n\nu32 GetBerryPowder(void)\n{\n    return DecryptBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount);\n}\n\nstatic void PrintBerryPowderAmount(u8 windowId, u32 amount, u8 x, u8 y, u8 speed)\n{\n    ConvertIntToDecimalStringN(gStringVar1, amount, STR_CONV_MODE_RIGHT_ALIGN, 5);\n    AddTextPrinterParameterized(windowId, FONT_SMALL, gStringVar1, x, y, speed, NULL);\n}\n\nstatic void DrawPlayerPowderAmount(u8 windowId, u16 baseBlock, u8 palette, u32 amount)\n{\n    DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, baseBlock, palette);\n    AddTextPrinterParameterized(windowId, FONT_SMALL, gOtherText_Powder, 0, 0, -1, NULL);\n    PrintBerryPowderAmount(windowId, amount, 39, 12, 0);\n}\n\nvoid PrintPlayerBerryPowderAmount(void)\n{\n    PrintBerryPowderAmount(sBerryPowderVendorWindowId, GetBerryPowder(), 39, 12, 0);\n}\n\nvoid DisplayBerryPowderVendorMenu(void)\n{\n    struct WindowTemplate template;\n\n    if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)\n        return;\n\n    template = SetWindowTemplateFields(0, 1, 1, 8, 3, 15, 32);\n    sBerryPowderVendorWindowId = AddWindow(&template);\n    FillWindowPixelBuffer(sBerryPowderVendorWindowId, 0);\n    PutWindowTilemap(sBerryPowderVendorWindowId);\n    LoadStdWindowGfx(sBerryPowderVendorWindowId, 0x21D, BG_PLTT_ID(13));\n    DrawPlayerPowderAmount(sBerryPowderVendorWindowId, 0x21D, 13, GetBerryPowder());\n}\n\nvoid RemoveBerryPowderVendorMenu(void)\n{\n    ClearWindowTilemap(sBerryPowderVendorWindowId);\n    ClearStdWindowAndFrameToTransparent(sBerryPowderVendorWindowId, 1);\n    RemoveWindow(sBerryPowderVendorWindowId);\n}\n"
  },
  {
    "path": "src/bg.c",
    "content": "#include <limits.h>\n#include \"global.h\"\n#include \"bg.h\"\n#include \"dma3.h\"\n#include \"gpu_regs.h\"\n\n#define DISPCNT_ALL_BG_AND_MODE_BITS    (DISPCNT_BG_ALL_ON | 0x7)\n\nstruct BgControl\n{\n    struct BgConfig {\n        u16 visible:1;\n        u16 unknown_1:1;\n        u16 screenSize:2;\n        u16 priority:2;\n        u16 mosaic:1;\n        u16 wraparound:1;\n\n        u16 charBaseIndex:2;\n        u16 mapBaseIndex:5;\n        u16 paletteMode:1;\n\n        u8 unknown_2;\n        u8 unknown_3;\n    } configs[4];\n\n    u16 bgVisibilityAndMode;\n};\n\nstruct BgConfig2\n{\n    u32 baseTile:10;\n    u32 basePalette:4;\n    u32 unk_3:18;\n\n    void *tilemap;\n    u32 bg_x;\n    u32 bg_y;\n};\n\nstatic struct BgControl sGpuBgConfigs;\nstatic struct BgConfig2 sGpuBgConfigs2[4];\nstatic u32 sDmaBusyBitfield[4];\nstatic u8 gpu_tile_allocation_map_bg[0x100];\n\nbool32 gWindowTileAutoAllocEnabled;\n\nstatic const struct BgConfig sZeroedBgControlStruct = { 0 };\n\nvoid ResetBgs(void)\n{\n    ResetBgControlStructs();\n    sGpuBgConfigs.bgVisibilityAndMode = 0;\n    SetTextModeAndHideBgs();\n}\n\nvoid SetBgModeInternal(u8 bgMode)\n{\n    sGpuBgConfigs.bgVisibilityAndMode &= 0xFFF8;\n    sGpuBgConfigs.bgVisibilityAndMode |= bgMode;\n}\n\nu8 GetBgMode(void)\n{\n    return sGpuBgConfigs.bgVisibilityAndMode & 0x7;\n}\n\nvoid ResetBgControlStructs(void)\n{\n    struct BgConfig* bgConfigs = &sGpuBgConfigs.configs[0];\n    struct BgConfig zeroedConfig = sZeroedBgControlStruct;\n    int i;\n\n    for (i = 0; i < 4; i++)\n    {\n        bgConfigs[i] = zeroedConfig;\n    }\n}\n\nvoid Unused_ResetBgControlStruct(u8 bg)\n{\n    if (IsInvalidBg(bg) == FALSE)\n    {\n        sGpuBgConfigs.configs[bg] = sZeroedBgControlStruct;\n    }\n}\n\nvoid SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound)\n{\n    if (IsInvalidBg(bg) == FALSE)\n    {\n        if (charBaseIndex != 0xFF)\n        {\n            sGpuBgConfigs.configs[bg].charBaseIndex = charBaseIndex & 0x3;\n        }\n\n        if (mapBaseIndex != 0xFF)\n        {\n            sGpuBgConfigs.configs[bg].mapBaseIndex = mapBaseIndex & 0x1F;\n        }\n\n        if (screenSize != 0xFF)\n        {\n            sGpuBgConfigs.configs[bg].screenSize = screenSize & 0x3;\n        }\n\n        if (paletteMode != 0xFF)\n        {\n            sGpuBgConfigs.configs[bg].paletteMode = paletteMode;\n        }\n\n        if (priority != 0xFF)\n        {\n            sGpuBgConfigs.configs[bg].priority = priority & 0x3;\n        }\n\n        if (mosaic != 0xFF)\n        {\n            sGpuBgConfigs.configs[bg].mosaic = mosaic & 0x1;\n        }\n\n        if (wraparound != 0xFF)\n        {\n            sGpuBgConfigs.configs[bg].wraparound = wraparound;\n        }\n\n        sGpuBgConfigs.configs[bg].unknown_2 = 0;\n        sGpuBgConfigs.configs[bg].unknown_3 = 0;\n\n        sGpuBgConfigs.configs[bg].visible = 1;\n    }\n}\n\nu16 GetBgControlAttribute(u8 bg, u8 attributeId)\n{\n    if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE)\n    {\n        switch (attributeId)\n        {\n            case BG_CTRL_ATTR_VISIBLE:\n                return sGpuBgConfigs.configs[bg].visible;\n            case BG_CTRL_ATTR_CHARBASEINDEX:\n                return sGpuBgConfigs.configs[bg].charBaseIndex;\n            case BG_CTRL_ATTR_MAPBASEINDEX:\n                return sGpuBgConfigs.configs[bg].mapBaseIndex;\n            case BG_CTRL_ATTR_SCREENSIZE:\n                return sGpuBgConfigs.configs[bg].screenSize;\n            case BG_CTRL_ATTR_PALETTEMODE:\n                return sGpuBgConfigs.configs[bg].paletteMode;\n            case BG_CTRL_ATTR_PRIORITY:\n                return sGpuBgConfigs.configs[bg].priority;\n            case BG_CTRL_ATTR_MOSAIC:\n                return sGpuBgConfigs.configs[bg].mosaic;\n            case BG_CTRL_ATTR_WRAPAROUND:\n                return sGpuBgConfigs.configs[bg].wraparound;\n        }\n    }\n\n    return 0xFF;\n}\n\nu8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode)\n{\n    u16 offset;\n    s8 cursor;\n\n    if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE)\n    {\n        switch (mode)\n        {\n            case 0x1:\n                offset = sGpuBgConfigs.configs[bg].charBaseIndex * BG_CHAR_SIZE;\n                break;\n            case 0x2:\n                offset = sGpuBgConfigs.configs[bg].mapBaseIndex * BG_SCREEN_SIZE;\n                break;\n            default:\n                cursor = -1;\n                goto end;\n        }\n\n        offset = destOffset + offset;\n\n        cursor = RequestDma3Copy(src, (void *)(offset + BG_VRAM), size, DMA3_16BIT);\n\n        if (cursor == -1)\n        {\n            return -1;\n        }\n    }\n    else\n    {\n       return -1;\n    }\n\nend:\n    return cursor;\n}\n\nvoid ShowBgInternal(u8 bg)\n{\n    u16 value;\n    if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE)\n    {\n        value = sGpuBgConfigs.configs[bg].priority |\n                (sGpuBgConfigs.configs[bg].charBaseIndex << 2) |\n                (sGpuBgConfigs.configs[bg].mosaic << 6) |\n                (sGpuBgConfigs.configs[bg].paletteMode << 7) |\n                (sGpuBgConfigs.configs[bg].mapBaseIndex << 8) |\n                (sGpuBgConfigs.configs[bg].wraparound << 13) |\n                (sGpuBgConfigs.configs[bg].screenSize << 14);\n\n        SetGpuReg((bg << 1) + 0x8, value);\n\n        sGpuBgConfigs.bgVisibilityAndMode |= 1 << (bg + 8);\n        sGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS;\n    }\n}\n\nstatic void HideBgInternal(u8 bg)\n{\n    if (IsInvalidBg(bg) == FALSE)\n    {\n        sGpuBgConfigs.bgVisibilityAndMode &= ~(1 << (bg + 8));\n        sGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS;\n    }\n}\n\nstatic void SyncBgVisibilityAndMode(void)\n{\n    SetGpuReg(0, (GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS) | sGpuBgConfigs.bgVisibilityAndMode);\n}\n\nvoid SetTextModeAndHideBgs(void)\n{\n    SetGpuReg(0, GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS);\n}\n\nstatic void SetBgAffineInternal(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle)\n{\n    struct BgAffineSrcData src;\n    struct BgAffineDstData dest;\n\n    switch (sGpuBgConfigs.bgVisibilityAndMode & 0x7)\n    {\n        case 1:\n            if (bg != 2)\n                return;\n            break;\n        case 2:\n            if (bg < 2 || bg > 3)\n                return;\n            break;\n        case 0:\n        default:\n            return;\n    }\n\n    src.texX = srcCenterX;\n    src.texY = srcCenterY;\n    src.scrX = dispCenterX;\n    src.scrY = dispCenterY;\n    src.sx = scaleX;\n    src.sy = scaleY;\n    src.alpha = rotationAngle;\n\n    BgAffineSet(&src, &dest, 1);\n\n    SetGpuReg(REG_OFFSET_BG2PA, dest.pa);\n    SetGpuReg(REG_OFFSET_BG2PB, dest.pb);\n    SetGpuReg(REG_OFFSET_BG2PC, dest.pc);\n    SetGpuReg(REG_OFFSET_BG2PD, dest.pd);\n    SetGpuReg(REG_OFFSET_BG2PA, dest.pa);\n    SetGpuReg(REG_OFFSET_BG2X_L, (s16)(dest.dx));\n    SetGpuReg(REG_OFFSET_BG2X_H, (s16)(dest.dx >> 16));\n    SetGpuReg(REG_OFFSET_BG2Y_L, (s16)(dest.dy));\n    SetGpuReg(REG_OFFSET_BG2Y_H, (s16)(dest.dy >> 16));\n}\n\nbool8 IsInvalidBg(u8 bg)\n{\n    if (bg > 3)\n        return TRUE;\n    return FALSE;\n}\n\nint BgTileAllocOp(int bg, int offset, int count, int mode)\n{\n    int start, end;\n    int blockSize;\n    int blockStart;\n    int i;\n\n    switch (mode)\n    {\n    case BG_TILE_FIND_FREE_SPACE:\n        start = GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX) * (BG_CHAR_SIZE / TILE_SIZE_4BPP);\n        end = start + 0x400;\n        if (end > 0x800)\n            end = 0x800;\n        blockSize = 0;\n        blockStart = 0;\n        for (i = start, offset = 0; i < end; i++, offset++)\n        {\n            if (!((gpu_tile_allocation_map_bg[i / 8] >> (i % 8)) & 1))\n            {\n                if (blockSize)\n                {\n                    blockSize++;\n                    if (blockSize == count)\n                        return blockStart;\n                }\n                else\n                {\n                    blockStart = offset;\n                    blockSize = 1;\n                }\n            }\n            else\n            {\n                blockSize = 0;\n            }\n        }\n        return -1;\n    case BG_TILE_ALLOC:\n        start = GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX) * (BG_CHAR_SIZE / TILE_SIZE_4BPP) + offset;\n        end = start + count;\n        for (i = start; i < end; i++)\n            gpu_tile_allocation_map_bg[i / 8] |= 1 << (i % 8);\n        break;\n    case BG_TILE_FREE:\n        start = GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX) * (BG_CHAR_SIZE / TILE_SIZE_4BPP) + offset;\n        end = start + count;\n        for (i = start; i < end; i++)\n            gpu_tile_allocation_map_bg[i / 8] &= ~(1 << (i % 8));\n        break;\n    }\n\n    return 0;\n}\n\nvoid ResetBgsAndClearDma3BusyFlags(bool32 enableWindowTileAutoAlloc)\n{\n    int i;\n    ResetBgs();\n\n    for (i = 0; i < 4; i++)\n    {\n        sDmaBusyBitfield[i] = 0;\n    }\n\n    gWindowTileAutoAllocEnabled = enableWindowTileAutoAlloc;\n\n    for (i = 0; i < 0x100; i++)\n    {\n        gpu_tile_allocation_map_bg[i] = 0;\n    }\n}\n\nvoid InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates)\n{\n    int i;\n    u8 bg;\n\n    SetBgModeInternal(bgMode);\n    ResetBgControlStructs();\n\n    for (i = 0; i < numTemplates; i++)\n    {\n        bg = templates[i].bg;\n        if (bg < 4) {\n            SetBgControlAttributes(bg,\n                                   templates[i].charBaseIndex,\n                                   templates[i].mapBaseIndex,\n                                   templates[i].screenSize,\n                                   templates[i].paletteMode,\n                                   templates[i].priority,\n                                   0,\n                                   0);\n\n            sGpuBgConfigs2[bg].baseTile = templates[i].baseTile;\n            sGpuBgConfigs2[bg].basePalette = 0;\n            sGpuBgConfigs2[bg].unk_3 = 0;\n\n            sGpuBgConfigs2[bg].tilemap = NULL;\n            sGpuBgConfigs2[bg].bg_x = 0;\n            sGpuBgConfigs2[bg].bg_y = 0;\n\n            gpu_tile_allocation_map_bg[(templates[i].charBaseIndex * (BG_CHAR_SIZE / TILE_SIZE_4BPP)) / 8] = 1;\n        }\n    }\n}\n\nvoid InitBgFromTemplate(const struct BgTemplate *template)\n{\n    u8 bg = template->bg;\n\n    if (bg < 4)\n    {\n        SetBgControlAttributes(bg,\n                               template->charBaseIndex,\n                               template->mapBaseIndex,\n                               template->screenSize,\n                               template->paletteMode,\n                               template->priority,\n                               0,\n                               0);\n\n        sGpuBgConfigs2[bg].baseTile = template->baseTile;\n        sGpuBgConfigs2[bg].basePalette = 0;\n        sGpuBgConfigs2[bg].unk_3 = 0;\n\n        sGpuBgConfigs2[bg].tilemap = NULL;\n        sGpuBgConfigs2[bg].bg_x = 0;\n        sGpuBgConfigs2[bg].bg_y = 0;\n\n        gpu_tile_allocation_map_bg[(template->charBaseIndex * (BG_CHAR_SIZE / TILE_SIZE_4BPP)) / 8] = 1;\n    }\n}\n\nu16 LoadBgTiles(u8 bg, const void *src, u16 size, u16 destOffset)\n{\n    u16 tileOffset;\n    u8 cursor;\n\n    if (GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE) == 0)\n    {\n        tileOffset = (sGpuBgConfigs2[bg].baseTile + destOffset) * 0x20;\n    }\n    else\n    {\n        tileOffset = (sGpuBgConfigs2[bg].baseTile + destOffset) * 0x40;\n    }\n\n    cursor = LoadBgVram(bg, src, size, tileOffset, DISPCNT_MODE_1);\n\n    if (cursor == 0xFF)\n    {\n        return -1;\n    }\n\n    sDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20));\n\n    if (gWindowTileAutoAllocEnabled == TRUE)\n    {\n        BgTileAllocOp(bg, tileOffset / 0x20, size / 0x20, BG_TILE_ALLOC);\n    }\n\n    return cursor;\n}\n\nu16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset)\n{\n    u8 cursor;\n\n    cursor = LoadBgVram(bg, src, size, destOffset * 32, DISPCNT_MODE_2);\n\n    if (cursor == 0xFF)\n    {\n        return -1;\n    }\n\n    sDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20));\n\n    return cursor;\n}\n\nu16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset)\n{\n    u16 paletteOffset;\n    s8 cursor;\n\n    if (IsInvalidBg32(bg) == FALSE)\n    {\n        paletteOffset = (sGpuBgConfigs2[bg].basePalette * 0x20) + (destOffset * 2);\n        cursor = RequestDma3Copy(src, (void *)(paletteOffset + BG_PLTT), size, DMA3_16BIT);\n\n        if (cursor == -1)\n        {\n            return -1;\n        }\n    }\n    else\n    {\n        return -1;\n    }\n\n    sDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20));\n\n    return (u8)cursor;\n}\n\nbool8 IsDma3ManagerBusyWithBgCopy(void)\n{\n    int i;\n\n    for (i = 0; i < 0x80; i++)\n    {\n        u8 div = i / 0x20;\n        u8 mod = i % 0x20;\n\n        if ((sDmaBusyBitfield[div] & (1 << mod)))\n        {\n            s8 reqSpace = WaitDma3Request(i);\n            if (reqSpace == -1)\n                return TRUE;\n            sDmaBusyBitfield[div] &= ~(1 << mod);\n        }\n    }\n    return FALSE;\n}\n\nvoid ShowBg(u8 bg)\n{\n    ShowBgInternal(bg);\n    SyncBgVisibilityAndMode();\n}\n\nvoid HideBg(u8 bg)\n{\n    HideBgInternal(bg);\n    SyncBgVisibilityAndMode();\n}\n\nvoid SetBgAttribute(u8 bg, u8 attributeId, u8 value)\n{\n    switch (attributeId)\n    {\n        case 1:\n            SetBgControlAttributes(bg, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF);\n            break;\n        case 2:\n            SetBgControlAttributes(bg, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF);\n            break;\n        case 3:\n            SetBgControlAttributes(bg, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF);\n            break;\n        case 4:\n            SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF);\n            break;\n        case 7:\n            SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF);\n            break;\n        case 5:\n            SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF);\n            break;\n        case 6:\n            SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value);\n            break;\n    }\n}\n\nu16 GetBgAttribute(u8 bg, u8 attributeId)\n{\n    switch (attributeId)\n    {\n        case BG_ATTR_CHARBASEINDEX:\n            return GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX);\n        case BG_ATTR_MAPBASEINDEX:\n            return GetBgControlAttribute(bg, BG_CTRL_ATTR_MAPBASEINDEX);\n        case BG_ATTR_SCREENSIZE:\n            return GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);\n        case BG_ATTR_PALETTEMODE:\n            return GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE);\n        case BG_ATTR_PRIORITY:\n            return GetBgControlAttribute(bg, BG_CTRL_ATTR_PRIORITY);\n        case BG_ATTR_MOSAIC:\n            return GetBgControlAttribute(bg, BG_CTRL_ATTR_MOSAIC);\n        case BG_ATTR_WRAPAROUND:\n            return GetBgControlAttribute(bg, BG_CTRL_ATTR_WRAPAROUND);\n        case BG_ATTR_MAPSIZE:\n            switch (GetBgType(bg))\n            {\n                case 0:\n                    return GetBgMetricTextMode(bg, 0) * 0x800;\n                case 1:\n                    return GetBgMetricAffineMode(bg, 0) * 0x100;\n                default:\n                    return 0;\n            }\n        case BG_ATTR_BGTYPE:\n            return GetBgType(bg);\n        case BG_ATTR_BASETILE:\n            return sGpuBgConfigs2[bg].baseTile;\n        default:\n            return -1;\n    }\n}\n\nu32 ChangeBgX(u8 bg, u32 value, u8 op)\n{\n    u8 mode;\n    u16 temp1;\n    u16 temp2;\n\n    if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)\n    {\n        return -1;\n    }\n\n    switch (op)\n    {\n    case BG_COORD_SET:\n    default:\n        sGpuBgConfigs2[bg].bg_x = value;\n        break;\n    case BG_COORD_ADD:\n        sGpuBgConfigs2[bg].bg_x += value;\n        break;\n    case BG_COORD_SUB:\n        sGpuBgConfigs2[bg].bg_x -= value;\n        break;\n    }\n\n    mode = GetBgMode();\n\n    switch (bg)\n    {\n    case 0:\n        temp1 = sGpuBgConfigs2[0].bg_x >> 0x8;\n        SetGpuReg(REG_OFFSET_BG0HOFS, temp1);\n        break;\n    case 1:\n        temp1 = sGpuBgConfigs2[1].bg_x >> 0x8;\n        SetGpuReg(REG_OFFSET_BG1HOFS, temp1);\n        break;\n    case 2:\n        if (mode == 0)\n        {\n            temp1 = sGpuBgConfigs2[2].bg_x >> 0x8;\n            SetGpuReg(REG_OFFSET_BG2HOFS, temp1);\n        }\n        else\n        {\n            temp1 = sGpuBgConfigs2[2].bg_x >> 0x10;\n            temp2 = sGpuBgConfigs2[2].bg_x & 0xFFFF;\n            SetGpuReg(REG_OFFSET_BG2X_H, temp1);\n            SetGpuReg(REG_OFFSET_BG2X_L, temp2);\n        }\n        break;\n    case 3:\n        if (mode == 0)\n        {\n            temp1 = sGpuBgConfigs2[3].bg_x >> 0x8;\n            SetGpuReg(REG_OFFSET_BG3HOFS, temp1);\n        }\n        else if (mode == 2)\n        {\n            temp1 = sGpuBgConfigs2[3].bg_x >> 0x10;\n            temp2 = sGpuBgConfigs2[3].bg_x & 0xFFFF;\n            SetGpuReg(REG_OFFSET_BG3X_H, temp1);\n            SetGpuReg(REG_OFFSET_BG3X_L, temp2);\n        }\n        break;\n    }\n\n    return sGpuBgConfigs2[bg].bg_x;\n}\n\nu32 GetBgX(u8 bg)\n{\n    if (IsInvalidBg32(bg) != FALSE)\n        return -1;\n    if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)\n        return -1;\n    return sGpuBgConfigs2[bg].bg_x;\n}\n\nu32 ChangeBgY(u8 bg, u32 value, u8 op)\n{\n    u8 mode;\n    u16 temp1;\n    u16 temp2;\n\n    if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)\n    {\n        return -1;\n    }\n\n    switch (op)\n    {\n    case BG_COORD_SET:\n    default:\n        sGpuBgConfigs2[bg].bg_y = value;\n        break;\n    case BG_COORD_ADD:\n        sGpuBgConfigs2[bg].bg_y += value;\n        break;\n    case BG_COORD_SUB:\n        sGpuBgConfigs2[bg].bg_y -= value;\n        break;\n    }\n\n    mode = GetBgMode();\n\n    switch (bg)\n    {\n    case 0:\n        temp1 = sGpuBgConfigs2[0].bg_y >> 0x8;\n        SetGpuReg(REG_OFFSET_BG0VOFS, temp1);\n        break;\n    case 1:\n        temp1 = sGpuBgConfigs2[1].bg_y >> 0x8;\n        SetGpuReg(REG_OFFSET_BG1VOFS, temp1);\n        break;\n    case 2:\n        if (mode == 0)\n        {\n            temp1 = sGpuBgConfigs2[2].bg_y >> 0x8;\n            SetGpuReg(REG_OFFSET_BG2VOFS, temp1);\n        }\n        else\n        {\n            temp1 = sGpuBgConfigs2[2].bg_y >> 0x10;\n            temp2 = sGpuBgConfigs2[2].bg_y & 0xFFFF;\n            SetGpuReg(REG_OFFSET_BG2Y_H, temp1);\n            SetGpuReg(REG_OFFSET_BG2Y_L, temp2);\n        }\n        break;\n    case 3:\n        if (mode == 0)\n        {\n            temp1 = sGpuBgConfigs2[3].bg_y >> 0x8;\n            SetGpuReg(REG_OFFSET_BG3VOFS, temp1);\n        }\n        else if (mode == 2)\n        {\n            temp1 = sGpuBgConfigs2[3].bg_y >> 0x10;\n            temp2 = sGpuBgConfigs2[3].bg_y & 0xFFFF;\n            SetGpuReg(REG_OFFSET_BG3Y_H, temp1);\n            SetGpuReg(REG_OFFSET_BG3Y_L, temp2);\n        }\n        break;\n    }\n\n    return sGpuBgConfigs2[bg].bg_y;\n}\n\nu32 GetBgY(u8 bg)\n{\n    if (IsInvalidBg32(bg) != FALSE)\n        return -1;\n    if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)\n        return -1;\n    return sGpuBgConfigs2[bg].bg_y;\n}\n\nvoid SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle)\n{\n    SetBgAffineInternal(bg, srcCenterX, srcCenterY, dispCenterX, dispCenterY, scaleX, scaleY, rotationAngle);\n}\n\nu8 AdjustBgMosaic(u8 value, u8 mode)\n{\n    u16 mosaicSize;\n    s16 bgMosaicH;\n    s16 bgMosaicV;\n    mosaicSize = GetGpuReg(REG_OFFSET_MOSAIC);\n    bgMosaicH = mosaicSize & 0xF;\n    bgMosaicV = (mosaicSize >> 4) & 0xF;\n    mosaicSize &= 0xFF00;\n\n    switch (mode)\n    {\n    case BG_MOSAIC_SET:\n    default:\n        bgMosaicH = value & 0xF;\n        bgMosaicV = value >> 0x4;\n        break;\n    case BG_MOSAIC_SET_H:\n        bgMosaicH = value & 0xF;\n        break;\n    case BG_MOSAIC_INC_H:\n        if ((bgMosaicH + value) > 0xF)\n            bgMosaicH = 0xF;\n        else\n            bgMosaicH += value;\n        break;\n    case BG_MOSAIC_DEC_H:\n        if ((bgMosaicH - value) < 0)\n            bgMosaicH = 0x0;\n        else\n            bgMosaicH -= value;\n        break;\n    case BG_MOSAIC_SET_V:\n        bgMosaicV = value & 0xF;\n        break;\n    case BG_MOSAIC_INC_V:\n        if ((bgMosaicV + value) > 0xF)\n            bgMosaicV = 0xF;\n        else\n            bgMosaicV += value;\n        break;\n    case BG_MOSAIC_DEC_V:\n        if ((bgMosaicV - value) < 0)\n            bgMosaicV = 0x0;\n        else\n            bgMosaicV -= value;\n        break;\n    }\n    mosaicSize |= ((bgMosaicV << 0x4) & 0xF0);\n    mosaicSize |= (bgMosaicH & 0xF);\n    SetGpuReg(REG_OFFSET_MOSAIC, mosaicSize);\n    return mosaicSize;\n}\n\nvoid SetBgTilemapBuffer(u8 bg, void *tilemap)\n{\n    if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0)\n    {\n        sGpuBgConfigs2[bg].tilemap = tilemap;\n    }\n}\n\nvoid UnsetBgTilemapBuffer(u8 bg)\n{\n    if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0)\n    {\n        sGpuBgConfigs2[bg].tilemap = NULL;\n    }\n}\n\nvoid *GetBgTilemapBuffer(u8 bg)\n{\n    if (IsInvalidBg32(bg) != FALSE)\n        return NULL;\n    if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)\n        return NULL;\n    return sGpuBgConfigs2[bg].tilemap;\n}\n\nvoid CopyToBgTilemapBuffer(u8 bg, const void *src, u16 mode, u16 destOffset)\n{\n    if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)\n    {\n        if (mode != 0)\n        {\n            CpuCopy16(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 32)), mode);\n        }\n        else\n        {\n            LZ77UnCompWram(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 32)));\n        }\n    }\n}\n\nvoid CopyBgTilemapBufferToVram(u8 bg)\n{\n    u16 sizeToLoad;\n\n    if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)\n    {\n        switch (GetBgType(bg))\n        {\n            case 0:\n                sizeToLoad = GetBgMetricTextMode(bg, 0) * 0x800;\n                break;\n            case 1:\n                sizeToLoad = GetBgMetricAffineMode(bg, 0) * 0x100;\n                break;\n            default:\n                sizeToLoad = 0;\n                break;\n        }\n        LoadBgVram(bg, sGpuBgConfigs2[bg].tilemap, sizeToLoad, 0, 2);\n    }\n}\n\nvoid CopyToBgTilemapBufferRect(u8 bg, const void *src, u8 destX, u8 destY, u8 width, u8 height)\n{\n    u16 destX16;\n    u16 destY16;\n    u16 mode;\n\n    if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)\n    {\n        switch (GetBgType(bg))\n        {\n            case 0:\n            {\n                const u16 * srcCopy = src;\n                for (destY16 = destY; destY16 < (destY + height); destY16++)\n                {\n                    for (destX16 = destX; destX16 < (destX + width); destX16++)\n                    {\n                        ((u16 *)sGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *(srcCopy)++;\n                    }\n                }\n                break;\n            }\n            case 1:\n            {\n                const u8 * srcCopy = src;\n                mode = GetBgMetricAffineMode(bg, 0x1);\n                for (destY16 = destY; destY16 < (destY + height); destY16++)\n                {\n                    for (destX16 = destX; destX16 < (destX + width); destX16++)\n                    {\n                        ((u8 *)sGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *(srcCopy)++;\n                    }\n                }\n                break;\n            }\n        }\n    }\n}\n\nvoid CopyToBgTilemapBufferRect_ChangePalette(u8 bg, const void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette)\n{\n    CopyRectToBgTilemapBufferRect(bg, src, 0, 0, rectWidth, rectHeight, destX, destY, rectWidth, rectHeight, palette, 0, 0);\n}\n\nvoid CopyRectToBgTilemapBufferRect(u8 bg, const void *src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, s16 tileOffset, s16 palette2)\n{\n    u16 screenWidth, screenHeight, screenSize;\n    u16 var;\n    const void *srcPtr;\n    u16 i, j;\n\n    if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg))\n    {\n        screenSize = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);\n        screenWidth = GetBgMetricTextMode(bg, 0x1) * 0x20;\n        screenHeight = GetBgMetricTextMode(bg, 0x2) * 0x20;\n        switch (GetBgType(bg))\n        {\n        case 0:\n            srcPtr = src + ((srcY * srcWidth) + srcX) * 2;\n            for (i = destY; i < (destY + rectHeight); i++)\n            {\n                for (j = destX; j < (destX + rectWidth); j++)\n                {\n                    u16 index = GetTileMapIndexFromCoords(j, i, screenSize, screenWidth, screenHeight);\n                    CopyTileMapEntry(srcPtr, sGpuBgConfigs2[bg].tilemap + (index * 2), palette1, tileOffset, palette2);\n                    srcPtr += 2;\n                }\n                srcPtr += (srcWidth - rectWidth) * 2;\n            }\n            break;\n        case 1:\n            srcPtr = src + ((srcY * srcWidth) + srcX);\n            var = GetBgMetricAffineMode(bg, 0x1);\n            for (i = destY; i < (destY + rectHeight); i++)\n            {\n                for (j = destX; j < (destX + rectWidth); j++)\n                {\n                    *(u8 *)(sGpuBgConfigs2[bg].tilemap + ((var * i) + j)) = *(u8 *)(srcPtr) + tileOffset;\n                    srcPtr++;\n                }\n                srcPtr += (srcWidth - rectWidth);\n            }\n            break;\n        }\n    }\n}\n\nvoid FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height)\n{\n    u16 x16;\n    u16 y16;\n    u16 mode;\n\n    if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)\n    {\n        switch (GetBgType(bg))\n        {\n            case 0:\n                for (y16 = y; y16 < (y + height); y16++)\n                {\n                    for (x16 = x; x16 < (x + width); x16++)\n                    {\n                        ((u16 *)sGpuBgConfigs2[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum;\n                    }\n                }\n                break;\n            case 1:\n                mode = GetBgMetricAffineMode(bg, 0x1);\n                for (y16 = y; y16 < (y + height); y16++)\n                {\n                    for (x16 = x; x16 < (x + width); x16++)\n                    {\n                        ((u8 *)sGpuBgConfigs2[bg].tilemap)[((y16 * mode) + x16)] = tileNum;\n                    }\n                }\n                break;\n        }\n    }\n}\n\nvoid FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette)\n{\n    WriteSequenceToBgTilemapBuffer(bg, tileNum, x, y, width, height, palette, 0);\n}\n\nvoid WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta)\n{\n    u16 mode;\n    u16 mode2;\n    u16 attribute;\n    u16 mode3;\n\n    u16 x16;\n    u16 y16;\n\n    if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)\n    {\n        attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);\n        mode = GetBgMetricTextMode(bg, 0x1) * 0x20;\n        mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20;\n        switch (GetBgType(bg))\n        {\n            case 0:\n                for (y16 = y; y16 < (y + height); y16++)\n                {\n                    for (x16 = x; x16 < (x + width); x16++)\n                    {\n                        CopyTileMapEntry(&firstTileNum, &((u16 *)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0);\n                        firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF);\n                    }\n                }\n                break;\n            case 1:\n                mode3 = GetBgMetricAffineMode(bg, 0x1);\n                for (y16 = y; y16 < (y + height); y16++)\n                {\n                    for (x16 = x; x16 < (x + width); x16++)\n                    {\n                        ((u8 *)sGpuBgConfigs2[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum;\n                        firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF);\n                    }\n                }\n                break;\n        }\n    }\n}\n\nu16 GetBgMetricTextMode(u8 bg, u8 whichMetric)\n{\n    u8 attribute;\n\n    attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);\n\n    switch (whichMetric)\n    {\n        case 0:\n            switch (attribute)\n            {\n                case 0:\n                    return 1;\n                case 1:\n                case 2:\n                    return 2;\n                case 3:\n                    return 4;\n            }\n            break;\n        case 1:\n            switch (attribute)\n            {\n                case 0:\n                    return 1;\n                case 1:\n                    return 2;\n                case 2:\n                    return 1;\n                case 3:\n                    return 2;\n            }\n            break;\n        case 2:\n            switch (attribute)\n            {\n                case 0:\n                case 1:\n                    return 1;\n                case 2:\n                case 3:\n                    return 2;\n            }\n            break;\n    }\n    return 0;\n}\n\nu32 GetBgMetricAffineMode(u8 bg, u8 whichMetric)\n{\n    u8 attribute;\n\n    attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);\n\n    switch (whichMetric)\n    {\n        case 0:\n            switch (attribute)\n            {\n                case 0:\n                    return 0x1;\n                case 1:\n                    return 0x4;\n                case 2:\n                    return 0x10;\n                case 3:\n                    return 0x40;\n            }\n            break;\n        case 1:\n        case 2:\n            return 0x10 << attribute;\n    }\n    return 0;\n}\n\nu32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32 screenHeight)\n{\n    x = x & (screenWidth - 1);\n    y = y & (screenHeight - 1);\n\n    switch (screenSize)\n    {\n        case 0:\n        case 2:\n            break;\n        case 3:\n            if (y >= 0x20)\n                y += 0x20;\n        case 1:\n            if (x >= 0x20)\n            {\n                x -= 0x20;\n                y += 0x20;\n            }\n    }\n    return (y * 0x20) + x;\n}\n\nvoid CopyTileMapEntry(const u16 *src, u16 *dest, s32 palette1, s32 tileOffset, s32 palette2)\n{\n    u16 var;\n\n    switch (palette1)\n    {\n    case 0 ... 15:\n        var = ((*src + tileOffset) & 0xFFF) + ((palette1 + palette2) << 12);\n        break;\n    case 16:\n        var = *dest;\n        var &= 0xFC00;\n        var += palette2 << 12;\n        var |= (*src + tileOffset) & 0x3FF;\n        break;\n    default:\n    case 17 ... INT_MAX:\n        var = *src + tileOffset + (palette2 << 12);\n        break;\n    }\n    *dest = var;\n}\n\nu32 GetBgType(u8 bg)\n{\n    u8 mode;\n\n    mode = GetBgMode();\n\n\n    switch (bg)\n    {\n        case 0:\n        case 1:\n            switch (mode)\n            {\n                case 0:\n                case 1:\n                    return 0;\n            }\n            break;\n        case 2:\n            switch (mode)\n            {\n                case 0:\n                    return 0;\n                case 1:\n                case 2:\n                    return 1;\n            }\n            break;\n        case 3:\n            switch (mode)\n            {\n                case 0:\n                    return 0;\n                case 2:\n                    return 1;\n            }\n            break;\n    }\n\n    return 0xFFFF;\n}\n\nbool32 IsInvalidBg32(u8 bg)\n{\n    if (bg > 3)\n        return TRUE;\n    return FALSE;\n}\n\nbool32 IsTileMapOutsideWram(u8 bg)\n{\n    if (sGpuBgConfigs2[bg].tilemap > (void *)IWRAM_END)\n        return TRUE;\n    if (sGpuBgConfigs2[bg].tilemap == 0x0)\n        return TRUE;\n    return FALSE;\n}\n"
  },
  {
    "path": "src/bg_regs.c",
    "content": "#include \"global.h\"\n\nvu16 *const gBGControlRegs[] =\n{\n    &REG_BG0CNT,\n    &REG_BG1CNT,\n    &REG_BG2CNT,\n    &REG_BG3CNT,\n};\n\nvu16 *const gBGHOffsetRegs[] =\n{\n    &REG_BG0HOFS,\n    &REG_BG1HOFS,\n    &REG_BG2HOFS,\n    &REG_BG3HOFS,\n};\n\nvu16 *const gBGVOffsetRegs[] =\n{\n    &REG_BG0VOFS,\n    &REG_BG1VOFS,\n    &REG_BG2VOFS,\n    &REG_BG3VOFS,\n};\n\nconst u16 gDISPCNTBGFlags[] = { DISPCNT_BG0_ON, DISPCNT_BG1_ON, DISPCNT_BG2_ON, DISPCNT_BG3_ON };\nconst u16 gOverworldBackgroundLayerFlags[] = { BLDCNT_TGT2_BG0, BLDCNT_TGT2_BG1, BLDCNT_TGT2_BG2, BLDCNT_TGT2_BG3 };\nconst u16 gBLDCNTTarget1BGFlags[] = { BLDCNT_TGT1_BG0, BLDCNT_TGT1_BG1, BLDCNT_TGT1_BG2, BLDCNT_TGT1_BG3 };\n\nconst u8 gBGControlRegOffsets[] =\n{\n    REG_OFFSET_BG0CNT,\n    REG_OFFSET_BG1CNT,\n    REG_OFFSET_BG2CNT,\n    REG_OFFSET_BG3CNT,\n};\n\nconst u8 gBGHOffsetRegOffsets[] =\n{\n    REG_OFFSET_BG0HOFS,\n    REG_OFFSET_BG1HOFS,\n    REG_OFFSET_BG2HOFS,\n    REG_OFFSET_BG3HOFS,\n};\n\nconst u8 gBGVOffsetRegOffsets[] =\n{\n    REG_OFFSET_BG0VOFS,\n    REG_OFFSET_BG1VOFS,\n    REG_OFFSET_BG2VOFS,\n    REG_OFFSET_BG3VOFS,\n};\n"
  },
  {
    "path": "src/bike.c",
    "content": "#include \"global.h\"\n#include \"bike.h\"\n#include \"field_player_avatar.h\"\n#include \"metatile_behavior.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"fieldmap.h\"\n#include \"field_camera.h\"\n#include \"overworld.h\"\n#include \"constants/map_types.h\"\n#include \"constants/songs.h\"\n#include \"constants/flags.h\"\n\nstatic u8 GetBikeTransitionId(u8 *, u16, u16);\nstatic void Bike_SetBikeStill(void);\nstatic u8 CanBikeFaceDirectionOnRail(u8 direction, u8 metatileBehavior);\nstatic u8 GetBikeCollision(u8);\nstatic u8 GetBikeCollisionAt(struct ObjectEvent *playerObjEvent, s16 x, s16 y, u8 direction, u8 metatileBehavior);\nstatic bool8 MetatileBehaviorForbidsBiking(u8);\nstatic void BikeTransition_FaceDirection(u8);\nstatic void BikeTransition_TurnDirection(u8);\nstatic void BikeTransition_MoveDirection(u8);\nstatic void BikeTransition_Downhill(u8);\nstatic void BikeTransition_Uphill(u8);\nstatic u8 BikeInputHandler_Normal(u8 *, u16, u16);\nstatic u8 BikeInputHandler_Turning(u8 *, u16, u16);\nstatic u8 BikeInputHandler_Slope(u8 *, u16, u16);\n\nstatic void (*const sBikeTransitions[])(u8) =\n{\n    [BIKE_TRANS_FACE_DIRECTION] = BikeTransition_FaceDirection,\n    [BIKE_TRANS_TURNING]        = BikeTransition_TurnDirection,\n    [BIKE_TRANS_MOVE]           = BikeTransition_MoveDirection,\n    [BIKE_TRANS_DOWNHILL]       = BikeTransition_Downhill,\n    [BIKE_TRANS_UPHILL]         = BikeTransition_Uphill,\n};\n\nstatic u8 (*const sBikeInputHandlers[])(u8 *, u16, u16) =\n{\n    [BIKE_STATE_NORMAL]  = BikeInputHandler_Normal,\n    [BIKE_STATE_TURNING] = BikeInputHandler_Turning,\n    [BIKE_STATE_SLOPE]   = BikeInputHandler_Slope,\n};\n\nvoid MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys)\n{\n    sBikeTransitions[GetBikeTransitionId(&direction, newKeys, heldKeys)](direction);\n}\n\nstatic u8 GetBikeTransitionId(u8 *direction, u16 newKeys, u16 heldKeys)\n{\n    return sBikeInputHandlers[gPlayerAvatar.acroBikeState](direction, newKeys, heldKeys);\n}\n\nstatic u8 BikeInputHandler_Normal(u8 *direction_p, u16 newKeys, u16 heldKeys)\n{\n    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    u8 direction = GetPlayerMovementDirection();\n\n    gPlayerAvatar.bikeFrameCounter = 0;\n    if (MetatileBehavior_IsCyclingRoadPullDownTile(playerObjEvent->currentMetatileBehavior) == TRUE)\n    {\n        if (!JOY_HELD(B_BUTTON))\n        {\n            gPlayerAvatar.acroBikeState = BIKE_STATE_SLOPE;\n            gPlayerAvatar.runningState = MOVING;\n            if (*direction_p < DIR_NORTH)\n                return BIKE_TRANS_DOWNHILL;\n            else\n                return BIKE_TRANS_UPHILL;\n        }\n        else\n        {\n            if (*direction_p != DIR_NONE)\n            {\n                gPlayerAvatar.acroBikeState = BIKE_STATE_SLOPE;\n                gPlayerAvatar.runningState = MOVING;\n                return BIKE_TRANS_UPHILL;\n            }\n        }\n    }\n    if (*direction_p == DIR_NONE)\n    {\n        *direction_p = direction;\n        gPlayerAvatar.runningState = NOT_MOVING;\n        return BIKE_TRANS_FACE_DIRECTION;\n    }\n    else\n    {\n        if (*direction_p != direction && gPlayerAvatar.runningState != MOVING)\n        {\n            gPlayerAvatar.acroBikeState = BIKE_STATE_TURNING;\n            gPlayerAvatar.newDirBackup = *direction_p;\n            gPlayerAvatar.runningState = NOT_MOVING;\n            return GetBikeTransitionId(direction_p, newKeys, heldKeys);\n        }\n        else\n        {\n            gPlayerAvatar.runningState = MOVING;\n            return BIKE_TRANS_MOVE;\n        }\n    }\n}\n\nstatic u8 BikeInputHandler_Turning(u8 *direction_p, u16 newKeys, u16 heldKeys)\n{\n    *direction_p = gPlayerAvatar.newDirBackup;\n    gPlayerAvatar.runningState = TURN_DIRECTION;\n    gPlayerAvatar.acroBikeState = BIKE_STATE_NORMAL;\n    Bike_SetBikeStill();\n    return BIKE_TRANS_TURNING;\n}\n\nstatic u8 BikeInputHandler_Slope(u8 *direction_p, u16 newKeys, u16 heldKeys)\n{\n    u8 direction = GetPlayerMovementDirection();\n    u8 playerObjEventId = gPlayerAvatar.objectEventId;\n    if (MetatileBehavior_IsCyclingRoadPullDownTile(playerObjEventId[gObjectEvents].currentMetatileBehavior) == TRUE)\n    {\n        if (*direction_p != direction)\n        {\n            gPlayerAvatar.acroBikeState = BIKE_STATE_TURNING;\n            gPlayerAvatar.newDirBackup = *direction_p;\n            gPlayerAvatar.runningState = NOT_MOVING;\n            return GetBikeTransitionId(direction_p, newKeys, heldKeys);\n        }\n        else\n        {\n            gPlayerAvatar.runningState = MOVING;\n            gPlayerAvatar.acroBikeState = BIKE_STATE_SLOPE;\n            if (*direction_p < DIR_NORTH)\n                return BIKE_TRANS_DOWNHILL;\n            else\n                return BIKE_TRANS_UPHILL;\n        }\n    }\n    gPlayerAvatar.acroBikeState = BIKE_STATE_NORMAL;\n    if (*direction_p == DIR_NONE)\n    {\n        *direction_p = direction;\n        gPlayerAvatar.runningState = NOT_MOVING;\n        return BIKE_TRANS_FACE_DIRECTION;\n    }\n    else\n    {\n        gPlayerAvatar.runningState = MOVING;\n        return BIKE_TRANS_MOVE;\n    }\n}\n\nstatic void BikeTransition_FaceDirection(u8 direction)\n{\n    PlayerFaceDirection(direction);\n}\n\nstatic void BikeTransition_TurnDirection(u8 direction)\n{\n    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n    if (!CanBikeFaceDirectionOnRail(direction, playerObjEvent->currentMetatileBehavior))\n        direction = playerObjEvent->movementDirection;\n    PlayerFaceDirection(direction);\n}\n\nstatic void BikeTransition_MoveDirection(u8 direction)\n{\n    struct ObjectEvent *playerObjEvent;\n    \n    playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (!CanBikeFaceDirectionOnRail(direction, playerObjEvent->currentMetatileBehavior))\n    {\n        BikeTransition_FaceDirection(playerObjEvent->movementDirection);\n    }\n    else\n    {\n        u8 collision = GetBikeCollision(direction);\n\n        if (collision > COLLISION_NONE && collision <= COLLISION_ISOLATED_HORIZONTAL_RAIL)\n        {\n            if (collision == COLLISION_LEDGE_JUMP)\n                PlayerJumpLedge(direction);\n            else if (collision != COLLISION_STOP_SURFING\n                  && collision != COLLISION_LEDGE_JUMP\n                  && collision != COLLISION_PUSHED_BOULDER\n                  && collision != COLLISION_DIRECTIONAL_STAIR_WARP)\n                PlayerOnBikeCollide(direction);\n        }\n        else\n        {\n            if(!FlagGet(FLAG_BIKE_GEAR)) //if not set, FRLG speed\n            {\n                if (collision == COLLISION_COUNT)\n                    PlayerWalkFast(direction);\n                else if (PlayerIsMovingOnRockStairs(direction))\n                    PlayerWalkFast(direction);\n                else\n                    PlayerRideWaterCurrent(direction);\n            }\n            else\n            {\n                if (collision == COLLISION_COUNT)\n                    PlayerRideWaterCurrent(direction);\n                else if (PlayerIsMovingOnRockStairs(direction))\n                    PlayerRideWaterCurrent(direction);\n                else\n                    PlayerWalkFaster(direction);\n            }\n        }\n    }\n}\n\nstatic void BikeTransition_Downhill(u8 v)\n{\n    u8 collision = GetBikeCollision(DIR_SOUTH);\n\n    if (collision == COLLISION_NONE)\n        PlayerWalkFaster(DIR_SOUTH);\n    else if (collision == COLLISION_LEDGE_JUMP)\n        PlayerJumpLedge(DIR_SOUTH);\n}\n\nstatic void BikeTransition_Uphill(u8 direction)\n{\n    if (GetBikeCollision(direction) == COLLISION_NONE)\n        PlayerWalkNormal(direction);\n}\n\nstatic u8 GetBikeCollision(u8 direction)\n{\n    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    s16 x, y;\n    u8 metatileBehavior;\n\n    x = playerObjEvent->currentCoords.x;\n    y = playerObjEvent->currentCoords.y;\n    MoveCoords(direction, &x, &y);\n    metatileBehavior = MapGridGetMetatileBehaviorAt(x, y);\n    return GetBikeCollisionAt(playerObjEvent, x, y, direction, metatileBehavior);\n}\n\nstatic u8 GetBikeCollisionAt(struct ObjectEvent *playerObjEvent, s16 x, s16 y, u8 direction, u8 metatileBehavior)\n{\n    u8 retVal = CheckForObjectEventCollision(playerObjEvent, x, y, direction, metatileBehavior);\n\n    if (retVal <= COLLISION_OBJECT_EVENT)\n    {\n        bool8 isCrackedIce = MetatileBehavior_IsCrackedIce(metatileBehavior);\n        if (isCrackedIce == TRUE)\n            return COLLISION_COUNT;\n        if (retVal == COLLISION_NONE && MetatileBehaviorForbidsBiking(metatileBehavior))\n            retVal = COLLISION_IMPASSABLE;\n    }\n    return retVal;\n}\n\nbool8 RS_IsRunningDisallowed(u8 r0)\n{\n    if (MetatileBehaviorForbidsBiking(r0))\n        return TRUE;\n    if (gMapHeader.mapType != MAP_TYPE_INDOOR)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nbool32 IsRunningDisallowed(u8 metatileBehavior)\n{\n    if (MetatileBehaviorForbidsBiking(metatileBehavior) != TRUE)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic bool8 MetatileBehaviorForbidsBiking(u8 metatileBehavior)\n{\n    if(MetatileBehavior_IsLongGrass(metatileBehavior))\n        return TRUE;\n    if (MetatileBehavior_IsRunningDisallowed(metatileBehavior))\n        return TRUE;\n    if (!MetatileBehavior_IsFortreeBridge(metatileBehavior))\n        return FALSE;\n    if (PlayerGetElevation() & 1)\n        return FALSE;\n    return TRUE;\n}\n\nstatic bool8 CanBikeFaceDirectionOnRail(u8 direction, u8 metatileBehavior)\n{\n    if (direction == DIR_EAST || direction == DIR_WEST)\n    {\n        if (MetatileBehavior_IsIsolatedVerticalRail(metatileBehavior) || MetatileBehavior_IsVerticalRail(metatileBehavior))\n            return FALSE;\n    }\n    else\n    {\n        if (MetatileBehavior_IsIsolatedHorizontalRail(metatileBehavior) || MetatileBehavior_IsHorizontalRail(metatileBehavior))\n            return FALSE;\n    }\n    return TRUE;\n}\n\nbool8 IsBikingDisallowedByPlayer(void)\n{\n    s16 x, y;\n    u8 metatileBehavior;\n\n    if (!(gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_UNDERWATER | PLAYER_AVATAR_FLAG_SURFING)))\n    {\n        PlayerGetDestCoords(&x, &y);\n        metatileBehavior = MapGridGetMetatileBehaviorAt(x, y);\n        if (!MetatileBehaviorForbidsBiking(metatileBehavior))\n            return FALSE;\n    }\n    return TRUE;\n}\n\nbool8 IsPlayerNotUsingAcroBikeOnBumpySlope(void)\n{\n    if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE))\n    {\n        if (MetatileBehavior_IsBumpySlope(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior))\n            return FALSE;\n    }\n    return TRUE;\n}\n\nvoid GetOnOffBike(u8 flags)\n{\n    gBikeCameraAheadPanback = FALSE;\n    if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))\n    {\n        SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);\n        Overworld_ClearSavedMusic();\n        Overworld_PlaySpecialMapMusic();\n    }\n    else\n    {\n        SetPlayerAvatarTransitionFlags(flags);\n        if (Overworld_MusicCanOverrideMapMusic(MUS_CYCLING))\n        {\n            Overworld_SetSavedMusic(MUS_CYCLING);\n            Overworld_ChangeMusicTo(MUS_CYCLING);\n        }\n    }\n}\n\nvoid BikeClearState(u32 directionHistory, u32 abStartSelectHistory)\n{\n    u32 i;\n\n    gPlayerAvatar.acroBikeState = BIKE_STATE_NORMAL;\n    gPlayerAvatar.newDirBackup = 0;\n    gPlayerAvatar.bikeFrameCounter = 0;\n    gPlayerAvatar.bikeSpeed = PLAYER_SPEED_STANDING;\n    gPlayerAvatar.directionHistory = directionHistory;\n    gPlayerAvatar.abStartSelectHistory = abStartSelectHistory;\n    gPlayerAvatar.lastSpinTile = 0;\n    for (i = 0; i < NELEMS(gPlayerAvatar.dirTimerHistory); ++i)\n            gPlayerAvatar.dirTimerHistory[i] = 0;\n}\n\nvoid Bike_UpdateBikeCounterSpeed(u8 counter)\n{\n    gPlayerAvatar.bikeFrameCounter = counter;\n    gPlayerAvatar.bikeSpeed = counter + (gPlayerAvatar.bikeFrameCounter >> 1);\n}\n\nstatic void Bike_SetBikeStill(void)\n{\n    gPlayerAvatar.bikeFrameCounter = 0;\n    gPlayerAvatar.bikeSpeed = PLAYER_SPEED_STANDING;\n}\n\ns16 GetPlayerSpeed(void)\n{\n    s16 machBikeSpeeds[] = { PLAYER_SPEED_NORMAL, PLAYER_SPEED_FAST, PLAYER_SPEED_FASTEST };\n\n    if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE)\n        return machBikeSpeeds[gPlayerAvatar.bikeFrameCounter];\n    else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)\n        return PLAYER_SPEED_FASTER;\n    else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_DASH))\n        return PLAYER_SPEED_FAST;\n    else\n        return PLAYER_SPEED_NORMAL;\n}\n\nvoid Bike_HandleBumpySlopeJump(void)\n{\n    s16 x, y;\n    u8 tileBehavior;\n\n    if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)\n    {\n        PlayerGetDestCoords(&x, &y);\n        tileBehavior = MapGridGetMetatileBehaviorAt(x, y);\n        if (MetatileBehavior_IsBumpySlope(tileBehavior))\n        {\n            gPlayerAvatar.acroBikeState = BIKE_STATE_SLOPE;\n            PlayerUseAcroBikeOnBumpySlope(GetPlayerMovementDirection());\n        }\n    }\n}\n\n// R/S leftover\n\n// the struct below is used for checking button combinations of the last input so that the acro can potentially perform a side/turn jump.\n// its possible that at some point Game Freak intended for the acro bike to have more complex tricks: but only the acro jump combinations can be seen in the final ROM.\nstruct BikeHistoryInputInfo\n{\n    u32 dirHistoryMatch; // the direction you need to press\n    u32 abStartSelectHistoryMatch; // the button you need to press\n    u32 dirHistoryMask; // mask applied so that way only the recent nybble (the recent input) is checked\n    u32 abStartSelectHistoryMask; // mask applied so that way only the recent nybble (the recent input) is checked\n    const u8 *dirTimerHistoryList; // list of timers to check for direction before the button+dir combination can be verified.\n    const u8 *abStartSelectHistoryList; // list of timers to check for buttons before the button+dir combination can be verified.\n    u32 direction; // direction to jump\n};\n\n// this is a list of timers to compare against later, terminated with 0. the only timer being compared against is 4 frames in this list.\nstatic const u8 sAcroBikeJumpTimerList[] = {4, 0};\n\n// this is a list of history inputs to do in order to do the check to retrieve a jump direction for acro bike. it seems to be an extensible list, so its possible that Game Freak may have intended for the Acro Bike to have more complex tricks at some point. The final list only has the acro jump.\nstatic const struct BikeHistoryInputInfo sAcroBikeTricksList[] =\n{\n    // the 0xF is a mask performed with each byte of the array in order to perform the check on only the last entry of the history list, otherwise the check wouldn't work as there can be 0xF0 as opposed to 0x0F.\n    {DIR_SOUTH, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_SOUTH},\n    {DIR_NORTH, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_NORTH},\n    {DIR_WEST, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_WEST},\n    {DIR_EAST, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_EAST},\n};\n"
  },
  {
    "path": "src/blend_palette.c",
    "content": "#include \"global.h\"\n#include \"blend_palette.h\"\n#include \"palette.h\"\n\nvoid BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor)\n{\n    u32 i;\n    for (i = 0; i < numEntries; i++)\n    {\n        u16 index = i + palOffset;\n        struct PlttData *data1 = (struct PlttData *)&gPlttBufferUnfaded[index];\n        s8 r = data1->r;\n        s8 g = data1->g;\n        s8 b = data1->b;\n        struct PlttData *data2 = (struct PlttData *)&blendColor;\n        gPlttBufferFaded[index] = ((r + (((data2->r - r) * coeff) >> 4)) << 0)\n                                | ((g + (((data2->g - g) * coeff) >> 4)) << 5)\n                                | ((b + (((data2->b - b) * coeff) >> 4)) << 10);\n    }\n}\n\nvoid BlendPalettesAt(u16 * palbuff, u16 blend_pal, u32 coefficient, s32 size)\n{\n    if (coefficient == 16)\n    {\n        while (--size != -1)\n        {\n            *palbuff++ = blend_pal;\n        }\n    }\n    else\n    {\n        u16 r = (blend_pal >>  0) & 0x1F;\n        u16 g = (blend_pal >>  5) & 0x1F;\n        u16 b = (blend_pal >> 10) & 0x1F;\n        while (--size != -1)\n        {\n            u16 r2 = (*palbuff >>  0) & 0x1F;\n            u16 g2 = (*palbuff >>  5) & 0x1F;\n            u16 b2 = (*palbuff >> 10) & 0x1F;\n            *palbuff++ = ((r2 + (((r - r2) * coefficient) >> 4)) <<  0)\n                       | ((g2 + (((g - g2) * coefficient) >> 4)) <<  5)\n                       | ((b2 + (((b - b2) * coefficient) >> 4)) << 10);\n        }\n    }\n}\n"
  },
  {
    "path": "src/blit.c",
    "content": "#include \"global.h\"\n#include \"blit.h\"\n\nvoid BlitBitmapRect4BitWithoutColorKey(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height)\n{\n    BlitBitmapRect4Bit(src, dst, srcX, srcY, dstX, dstY, width, height, 0xFF);\n}\n\nvoid BlitBitmapRect4Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey)\n{\n    s32 xEnd;\n    s32 yEnd;\n    s32 multiplierSrcY;\n    s32 multiplierDstY;\n    s32 loopSrcY, loopDstY;\n    s32 loopSrcX, loopDstX;\n    const u8 *pixelsSrc;\n    u8 *pixelsDst;\n    s32 toOrr;\n    s32 toAnd;\n    s32 toShift;\n\n    if (dst->width - dstX < width)\n        xEnd = (dst->width - dstX) + srcX;\n    else\n        xEnd = srcX + width;\n\n    if (dst->height - dstY < height)\n        yEnd = (dst->height - dstY) + srcY;\n    else\n        yEnd = height + srcY;\n\n    multiplierSrcY = (src->width + (src->width & 7)) >> 3;\n    multiplierDstY = (dst->width + (dst->width & 7)) >> 3;\n\n    if (colorKey == 0xFF)\n    {\n        for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)\n        {\n            for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)\n            {\n                pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B);\n                pixelsDst = dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + (((loopDstY >> 3) * multiplierDstY) << 5) + ((u32)(loopDstY << 0x1d) >> 0x1B);\n                toOrr = ((*pixelsSrc >> ((loopSrcX & 1) << 2)) & 0xF);\n                toShift = ((loopDstX & 1) << 2);\n                toOrr <<= toShift;\n                toAnd = 0xF0 >> (toShift);\n                *pixelsDst = toOrr | (*pixelsDst & toAnd);\n            }\n        }\n    }\n    else\n    {\n        for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)\n        {\n            for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)\n            {\n                pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B);\n                pixelsDst = dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + (((loopDstY >> 3) * multiplierDstY) << 5) + ((u32)(loopDstY << 0x1d) >> 0x1B);\n                toOrr = ((*pixelsSrc >> ((loopSrcX & 1) << 2)) & 0xF);\n                if (toOrr != colorKey)\n                {\n                    toShift = ((loopDstX & 1) << 2);\n                    toOrr <<= toShift;\n                    toAnd = 0xF0 >> (toShift);\n                    *pixelsDst = toOrr | (*pixelsDst & toAnd);\n                }\n            }\n        }\n    }\n}\n\nvoid FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue)\n{\n    s32 xEnd;\n    s32 yEnd;\n    s32 multiplierY;\n    s32 loopX, loopY;\n\n    xEnd = x + width;\n    if (xEnd > surface->width)\n        xEnd = surface->width;\n\n    yEnd = y + height;\n    if (yEnd > surface->height)\n        yEnd = surface->height;\n\n    multiplierY = (surface->width + (surface->width & 7)) >> 3;\n\n    for (loopY = y; loopY < yEnd; loopY++)\n    {\n        for (loopX = x; loopX < xEnd; loopX++)\n        {\n            u8 *pixels = surface->pixels + ((loopX >> 1) & 3) + ((loopX >> 3) << 5) + (((loopY >> 3) * multiplierY) << 5) + ((u32)(loopY << 0x1d) >> 0x1B);\n            if ((loopX & 1) != 0)\n            {\n                *pixels &= 0xF;\n                *pixels |= fillValue << 4;\n            }\n            else\n            {\n                *pixels &= 0xF0;\n                *pixels |= fillValue;\n            }\n        }\n    }\n}\n\nvoid BlitBitmapRect4BitTo8Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey, u8 paletteOffset)\n{\n    s32 palOffsetBits;\n    s32 xEnd;\n    s32 yEnd;\n    s32 multiplierSrcY;\n    s32 multiplierDstY;\n    s32 loopSrcY, loopDstY;\n    s32 loopSrcX, loopDstX;\n    const u8 *pixelsSrc;\n    u8 *pixelsDst;\n    s32 colorKeyBits;\n\n    palOffsetBits = (u32)(paletteOffset << 0x1C) >> 0x18;\n    colorKeyBits = (u32)(colorKey << 0x1C) >> 0x18;\n\n    if (dst->width - dstX < width)\n        xEnd = (dst->width - dstX) + srcX;\n    else\n        xEnd = width + srcX;\n\n    if (dst->height - dstY < height)\n        yEnd = (srcY + dst->height) - dstY;\n    else\n        yEnd = srcY + height;\n\n    multiplierSrcY = (src->width + (src->width & 7)) >> 3;\n    multiplierDstY = (dst->width + (dst->width & 7)) >> 3;\n\n    if (colorKey == 0xFF)\n    {\n        for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)\n        {\n            pixelsSrc = src->pixels + ((srcX >> 1) & 3) + ((srcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);\n            for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)\n            {\n                pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a);\n                if (loopSrcX & 1)\n                {\n                    *pixelsDst = palOffsetBits + (*pixelsSrc >> 4);\n                }\n                else\n                {\n                    pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);\n                    *pixelsDst = palOffsetBits + (*pixelsSrc & 0xF);\n                }\n            }\n        }\n    }\n    else\n    {\n        for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)\n        {\n            pixelsSrc = src->pixels + ((srcX >> 1) & 3) + ((srcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);\n            for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)\n            {\n                if (loopSrcX & 1)\n                {\n                    if ((*pixelsSrc & 0xF0) != colorKeyBits)\n                    {\n                        pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a);\n                        *pixelsDst = palOffsetBits + (*pixelsSrc >> 4);\n                    }\n                }\n                else\n                {\n                    pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);\n                    if ((*pixelsSrc & 0xF) != colorKey)\n                    {\n                        pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a);\n                        *pixelsDst = palOffsetBits + (*pixelsSrc & 0xF);\n                    }\n                }\n            }\n        }\n    }\n}\n\nvoid FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue)\n{\n    s32 xEnd;\n    s32 yEnd;\n    s32 multiplierY;\n    s32 loopX, loopY;\n\n    xEnd = x + width;\n    if (xEnd > surface->width)\n        xEnd = surface->width;\n\n    yEnd = y + height;\n    if (yEnd > surface->height)\n        yEnd = surface->height;\n\n    multiplierY = (surface->width + (surface->width & 7)) >> 3;\n\n    for (loopY = y; loopY < yEnd; loopY++)\n    {\n        for (loopX = x; loopX < xEnd; loopX++)\n        {\n            u8 *pixels = surface->pixels + (loopX & 7) + ((loopX >> 3) << 6) + (((loopY >> 3) * multiplierY) << 6) + ((u32)(loopY << 0x1d) >> 0x1a);\n            *pixels = fillValue;\n        }\n    }\n}\n"
  },
  {
    "path": "src/braille_text.c",
    "content": "#include \"global.h\"\n#include \"main.h\"\n#include \"window.h\"\n#include \"text.h\"\n#include \"sound.h\"\n\n// This file handles the braille font.\n// For printing braille messages, see ScrCmd_braillemessage\n\nstatic const u8 sScrollDistances[] = {\n    [OPTIONS_TEXT_SPEED_SLOW] = 1,\n    [OPTIONS_TEXT_SPEED_MID] = 2,\n    [OPTIONS_TEXT_SPEED_FAST] = 4,\n};\nstatic const u16 sBrailleGlyphs[] = INCBIN_U16(\"graphics/fonts/braille.fwjpnfont\");\n\nstatic void DecompressGlyph_Braille(u16);\n\nu16 FontFunc_Braille(struct TextPrinter *textPrinter)\n{\n    u16 char_;\n    struct TextPrinterSubStruct *sub = &textPrinter->subUnion.sub;\n\n    switch (textPrinter->state)\n    {\n    case RENDER_STATE_HANDLE_CHAR:\n        if (JOY_HELD(A_BUTTON | B_BUTTON) && sub->hasPrintBeenSpedUp)\n        {\n            textPrinter->delayCounter = 0;\n        }\n        if (textPrinter->delayCounter && textPrinter->textSpeed)\n        {\n            textPrinter->delayCounter--;\n            if (gTextFlags.canABSpeedUpPrint && JOY_NEW(A_BUTTON | B_BUTTON))\n            {\n                sub->hasPrintBeenSpedUp = TRUE;\n                textPrinter->delayCounter = 0;\n            }\n            return RENDER_UPDATE;\n        }\n        if (gTextFlags.autoScroll)\n            textPrinter->delayCounter = 1;\n        else\n            textPrinter->delayCounter = textPrinter->textSpeed;\n\n        char_ = *textPrinter->printerTemplate.currentChar++;\n        switch (char_)\n        {\n        case EOS:\n            return RENDER_FINISH;\n        case CHAR_NEWLINE:\n            textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x;\n            textPrinter->printerTemplate.currentY += gFonts[textPrinter->printerTemplate.fontId].maxLetterHeight + textPrinter->printerTemplate.lineSpacing;\n            return RENDER_REPEAT;\n        case PLACEHOLDER_BEGIN:\n            textPrinter->printerTemplate.currentChar++;\n            return RENDER_REPEAT;\n        case EXT_CTRL_CODE_BEGIN:\n            char_ = *textPrinter->printerTemplate.currentChar++;\n            switch (char_)\n            {\n            case EXT_CTRL_CODE_COLOR:\n                textPrinter->printerTemplate.fgColor = *textPrinter->printerTemplate.currentChar++;\n                GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor);\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_HIGHLIGHT:\n                textPrinter->printerTemplate.bgColor = *textPrinter->printerTemplate.currentChar++;\n                GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor);\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_SHADOW:\n                textPrinter->printerTemplate.shadowColor = *textPrinter->printerTemplate.currentChar++;\n                GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor);\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW:\n                textPrinter->printerTemplate.fgColor = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.bgColor = *++textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.shadowColor = *++textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n\n                GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor);\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_PALETTE:\n                textPrinter->printerTemplate.currentChar++;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_FONT:\n                sub->glyphId = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_RESET_FONT:\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_PAUSE:\n                textPrinter->delayCounter = *textPrinter->printerTemplate.currentChar++;\n                textPrinter->state = RENDER_STATE_PAUSE;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_PAUSE_UNTIL_PRESS:\n                textPrinter->state = RENDER_STATE_WAIT;\n                if (gTextFlags.autoScroll)\n                    sub->autoScrollDelay = 0;\n                return RENDER_UPDATE;\n            case EXT_CTRL_CODE_WAIT_SE:\n                textPrinter->state = RENDER_STATE_WAIT_SE;\n                return RENDER_UPDATE;\n            case EXT_CTRL_CODE_PLAY_BGM:\n            case EXT_CTRL_CODE_PLAY_SE:\n                textPrinter->printerTemplate.currentChar += 2;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_ESCAPE:\n                char_ = *++textPrinter->printerTemplate.currentChar;\n                break;\n            case EXT_CTRL_CODE_SHIFT_RIGHT:\n                textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x + *textPrinter->printerTemplate.currentChar++;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_SHIFT_DOWN:\n                textPrinter->printerTemplate.currentY = textPrinter->printerTemplate.y + *textPrinter->printerTemplate.currentChar++;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_FILL_WINDOW:\n                FillWindowPixelBuffer(textPrinter->printerTemplate.windowId, PIXEL_FILL(textPrinter->printerTemplate.bgColor));\n                return RENDER_REPEAT;\n            }\n            break;\n        case CHAR_PROMPT_CLEAR:\n            textPrinter->state = RENDER_STATE_CLEAR;\n            TextPrinterInitDownArrowCounters(textPrinter);\n            return RENDER_UPDATE;\n        case CHAR_PROMPT_SCROLL:\n            textPrinter->state = RENDER_STATE_SCROLL_START;\n            TextPrinterInitDownArrowCounters(textPrinter);\n            return RENDER_UPDATE;\n        case CHAR_EXTRA_SYMBOL:\n            char_ = *textPrinter->printerTemplate.currentChar++| 0x100;\n            break;\n        case CHAR_KEYPAD_ICON:\n            textPrinter->printerTemplate.currentChar++;\n            return RENDER_PRINT;\n        }\n        DecompressGlyph_Braille(char_);\n        CopyGlyphToWindow(textPrinter);\n        textPrinter->printerTemplate.currentX += gGlyphInfo.width + textPrinter->printerTemplate.letterSpacing;\n        return RENDER_PRINT;\n    case RENDER_STATE_WAIT:\n        if (TextPrinterWait(textPrinter))\n            textPrinter->state = RENDER_STATE_HANDLE_CHAR;\n        return RENDER_UPDATE;\n    case RENDER_STATE_CLEAR:\n        if (TextPrinterWaitWithDownArrow(textPrinter))\n        {\n            FillWindowPixelBuffer(textPrinter->printerTemplate.windowId, PIXEL_FILL(textPrinter->printerTemplate.bgColor));\n            textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x;\n            textPrinter->printerTemplate.currentY = textPrinter->printerTemplate.y;\n            textPrinter->state = RENDER_STATE_HANDLE_CHAR;\n        }\n        return RENDER_UPDATE;\n    case RENDER_STATE_SCROLL_START:\n        if (TextPrinterWaitWithDownArrow(textPrinter))\n        {\n            TextPrinterClearDownArrow(textPrinter);\n            textPrinter->scrollDistance = gFonts[textPrinter->printerTemplate.fontId].maxLetterHeight + textPrinter->printerTemplate.lineSpacing;\n            textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x;\n            textPrinter->state = RENDER_STATE_SCROLL;\n        }\n        return RENDER_UPDATE;\n    case RENDER_STATE_SCROLL:\n        if (textPrinter->scrollDistance)\n        {\n            if (textPrinter->scrollDistance < sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed])\n            {\n                ScrollWindow(textPrinter->printerTemplate.windowId, 0, textPrinter->scrollDistance, PIXEL_FILL(textPrinter->printerTemplate.bgColor));\n                textPrinter->scrollDistance = 0;\n            }\n            else\n            {\n                ScrollWindow(textPrinter->printerTemplate.windowId, 0, sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed], PIXEL_FILL(textPrinter->printerTemplate.bgColor));\n                textPrinter->scrollDistance -= sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed];\n            }\n            CopyWindowToVram(textPrinter->printerTemplate.windowId, COPYWIN_GFX);\n        }\n        else\n        {\n            textPrinter->state = RENDER_STATE_HANDLE_CHAR;\n        }\n        return RENDER_UPDATE;\n    case RENDER_STATE_WAIT_SE:\n        if (!IsSEPlaying())\n            textPrinter->state = RENDER_STATE_HANDLE_CHAR;\n        return RENDER_UPDATE;\n    case RENDER_STATE_PAUSE:\n        if (textPrinter->delayCounter)\n            textPrinter->delayCounter--;\n        else\n            textPrinter->state = RENDER_STATE_HANDLE_CHAR;\n        return RENDER_UPDATE;\n    }\n    return RENDER_FINISH;\n}\n\nstatic void DecompressGlyph_Braille(u16 glyph)\n{\n    const u16 *glyphs;\n\n    glyphs = sBrailleGlyphs + 0x100 * (glyph / 8) + 0x10 * (glyph % 8);\n    DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n    DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20));\n    DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40));\n    DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60));\n    gGlyphInfo.width = 16;\n    gGlyphInfo.height = 16;\n}\n\ns32 GetGlyphWidth_Braille(u16 font_type, bool32 isJapanese)\n{\n    return 16;\n}\n"
  },
  {
    "path": "src/buy_menu_helpers.c",
    "content": "#include \"global.h\"\n#include \"task.h\"\n#include \"text.h\"\n#include \"window.h\"\n#include \"text_window.h\"\n#include \"money.h\"\n#include \"menu_helpers.h\"\n#include \"new_menu_helpers.h\"\n#include \"menu.h\"\n#include \"shop.h\"\n#include \"palette.h\"\n\nstatic const struct WindowTemplate sShopBuyMenuWindowTemplatesNormal[] =\n{\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 8,\n        .height = 3,\n        .paletteNum = 15,\n        .baseBlock = 0x27,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 11,\n        .width = 13,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x3F,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 14,\n        .baseBlock = 0x59,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 17,\n        .tilemapTop = 9,\n        .width = 12,\n        .height = 4,\n        .paletteNum = 14,\n        .baseBlock = 0xC1,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 1,\n        .width = 17,\n        .height = 12,\n        .paletteNum = 14,\n        .baseBlock = 0xF1,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 5,\n        .tilemapTop = 14,\n        .width = 25,\n        .height = 6,\n        .paletteNum = 15,\n        .baseBlock = 0x1BD,\n    },\n    DUMMY_WIN_TEMPLATE,\n};\n\n// firered uses different layout when selling TMs\nstatic const struct WindowTemplate sShopBuyMenuWindowTemplatesTM[] =\n{\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 8,\n        .height = 3,\n        .paletteNum = 15,\n        .baseBlock = 0x27,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 11,\n        .width = 13,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x3F,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 14,\n        .baseBlock = 0x59,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 17,\n        .tilemapTop = 9,\n        .width = 12,\n        .height = 4,\n        .paletteNum = 14,\n        .baseBlock = 0xC1,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 1,\n        .width = 17,\n        .height = 10,\n        .paletteNum = 14,\n        .baseBlock = 0xF1,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 12,\n        .width = 18,\n        .height = 8,\n        .paletteNum = 14,\n        .baseBlock = 0x19B,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 14,\n        .width = 10,\n        .height = 4,\n        .paletteNum = 14,\n        .baseBlock = 0x22B,\n    },\n    DUMMY_WIN_TEMPLATE,\n};\n\nstatic const struct WindowTemplate sShopBuyMenuYesNoWindowTemplate =\n{\n    .bg = 0,\n    .tilemapLeft = 21,\n    .tilemapTop = 9,\n    .width = 6,\n    .height = 4,\n    .paletteNum = 14,\n    .baseBlock = 0xC1,\n};\n\nstatic const u8 sShopBuyMenuTextColors[][3] =\n{\n    {0, 1, 2},\n    {0, 2, 3},\n    {0, 3, 2}\n};\n\nvoid BuyMenuInitWindows(bool32 isSellingTM)\n{\n    if (isSellingTM != TRUE)\n        InitWindows(sShopBuyMenuWindowTemplatesNormal);\n    else\n        InitWindows(sShopBuyMenuWindowTemplatesTM);\n    DeactivateAllTextPrinters();\n    LoadUserWindowGfx(0, 0x1, BG_PLTT_ID(13));\n    LoadMenuMessageWindowGfx(0, 0x13, BG_PLTT_ID(14));\n    LoadStdWindowGfx(0, 0xA, BG_PLTT_ID(15));\n    PutWindowTilemap(0);\n    PutWindowTilemap(4);\n    PutWindowTilemap(5);\n    if (isSellingTM == TRUE)\n        PutWindowTilemap(6);\n}\n\nvoid BuyMenuDrawMoneyBox(void)\n{\n    PrintMoneyAmountInMoneyBoxWithBorder(0, 0xA, 0xF, GetMoney(&gSaveBlock1Ptr->money));\n}\n\nvoid BuyMenuPrint(u8 windowId, u8 font, const u8 *text, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 color)\n{\n    AddTextPrinterParameterized4(windowId, font, x, y, letterSpacing, lineSpacing, sShopBuyMenuTextColors[color], speed, text);\n}\n\nvoid BuyMenuDisplayMessage(u8 taskId, const u8 *text, TaskFunc callback)\n{\n    DisplayMessageAndContinueTask(taskId, 2, 0x13, 0xE, GetMartFontId(), GetTextSpeedSetting(), text, callback);\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nvoid BuyMenuQuantityBoxNormalBorder(u8 windowId, bool8 copyToVram)\n{\n    DrawStdFrameWithCustomTileAndPalette(windowId, copyToVram, 0x1, 13);\n}\n\nvoid BuyMenuQuantityBoxThinBorder(u8 windowId, bool8 copyToVram)\n{\n    DrawStdFrameWithCustomTileAndPalette(windowId, copyToVram, 0xA, 15);\n}\n\nvoid BuyMenuConfirmPurchase(u8 taskId, const struct YesNoFuncTable *yesNo)\n{\n    CreateYesNoMenuWithCallbacks(taskId, &sShopBuyMenuYesNoWindowTemplate, FONT_NORMAL, 0, 2, 1, 13, yesNo);\n}\n"
  },
  {
    "path": "src/cable_car.c",
    "content": "#include \"global.h\"\n#include \"bg.h\"\n#include \"decompress.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"field_weather.h\"\n#include \"gpu_regs.h\"\n#include \"graphics.h\"\n#include \"malloc.h\"\n#include \"main.h\"\n#include \"new_menu_helpers.h\"\n#include \"menu.h\"\n#include \"overworld.h\"\n#include \"palette.h\"\n#include \"random.h\"\n#include \"scanline_effect.h\"\n#include \"script.h\"\n#include \"sound.h\"\n#include \"sprite.h\"\n#include \"task.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/rgb.h\"\n#include \"constants/songs.h\"\n#include \"constants/weather.h\"\n\n#define GOING_DOWN gSpecialVar_0x8004\n\n#define STATE_END 0xFF\n\n#define TAG_CABLE_CAR 1\n#define TAG_DOOR      2\n#define TAG_CABLE     3\n\nstruct CableCar\n{\n    u8 bgTaskId;\n    u8 state;\n    u8 weather;\n    u16 weatherDelay;\n    u16 timer;\n    u8 bg0HorizontalOffset;\n    u8 bg0VerticalOffset;\n    u8 unused0[2];\n    u8 bg1HorizontalOffset;\n    u8 bg1VerticalOffset;\n    u8 unused1[6];\n    u8 bg3HorizontalOffset;\n    u8 bg3VerticalOffset;\n    u8 unused2[2];\n    u8 groundTileIdx;\n    u8 groundSegmentXStart;\n    u8 groundSegmentYStart;\n    u8 groundTilemapOffset;\n    u8 groundTimer; // Incremented, but does nothing\n    u8 groundXOffset;\n    u8 groundYOffset;\n    u8 groundXBase;\n    u8 groundYBase;\n    u16 groundTileBuffer[9][12];\n    u8 unused3[2];\n    u16 bgTilemapBuffers[4][BG_SCREEN_SIZE];\n    u16 *groundTilemap;\n    u16 *treesTilemap;\n    u16 *bgMountainsTilemap;\n    const u16 *pylonHookTilemapEntries;\n    u8 *pylonStemTilemap;\n};\n\nstatic EWRAM_DATA struct CableCar *sCableCar = NULL;\nstatic EWRAM_DATA u8 sGroundX_Up = 0;\nstatic EWRAM_DATA u8 sGroundY_Up = 0;\nstatic EWRAM_DATA u8 sGroundSegmentY_Up = 0;\nstatic EWRAM_DATA u8 sGroundX_Down = 0;\nstatic EWRAM_DATA u8 sGroundY_Down = 0;\nstatic EWRAM_DATA u8 sGroundSegmentY_Down = 0;\n\nstatic void CB2_LoadCableCar(void);\nstatic void SetBgRegs(bool8);\nstatic void CreateCableCarSprites(void);\nstatic void InitGroundTilemapData(bool8);\nstatic void Task_CableCar(u8);\nstatic void Task_AnimateBgGoingUp(u8);\nstatic void Task_AnimateBgGoingDown(u8);\nstatic void VBlankCB_CableCar(void);\nstatic void CB2_CableCar(void);\nstatic void AnimateGroundGoingUp(void);\nstatic void AnimateGroundGoingDown(void);\nstatic void SpriteCB_CableCar(struct Sprite *);\nstatic void SpriteCB_Cable(struct Sprite *);\nstatic void DrawNextGroundSegmentGoingUp(void);\nstatic void DrawNextGroundSegmentGoingDown(void);\n\nstatic const struct BgTemplate sBgTemplates[4] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 28,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0\n    },\n    {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0\n    },\n    {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0\n    },\n    {\n        .bg = 3,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0\n    },\n};\n\nstatic const u8 sGround_Tilemap[] = INCBIN_U8(\"graphics/cable_car/ground.bin.lz\");\nstatic const u8 sTrees_Tilemap[] = INCBIN_U8(\"graphics/cable_car/trees.bin.lz\");\nstatic const u8 sBgMountains_Tilemap[] = INCBIN_U8(\"graphics/cable_car/bg_mountains.bin.lz\");\n\nstatic const u16 sPylonHook_TilemapEntries[] = {\n    0x3000,\n    0x3001,\n    0x3002,\n    0x3003,\n    0x3004,\n    0x3005,\n    0x3006,\n    0x3007,\n    0x3008,\n    0x3009,\n};\n\nstatic const u8 sPylonStems_Tilemap[] = INCBIN_U8(\"graphics/cable_car/pylons.bin.lz\");\n\nstatic const struct CompressedSpriteSheet sSpriteSheets[] = {\n    { gCableCar_Gfx,      0x800, TAG_CABLE_CAR },\n    { gCableCarDoor_Gfx,   0x40, TAG_DOOR },\n    { gCableCarCable_Gfx,  0x80, TAG_CABLE },\n    { },\n};\n\nstatic const struct SpritePalette sSpritePalettes[] = {\n    { gCableCar_Pal, TAG_CABLE_CAR },\n    { }\n};\n\nstatic const struct OamData sOam_CableCar =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nstatic const struct OamData sOam_CableCarDoor =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x8),\n    .x = 0,\n    .size = SPRITE_SIZE(16x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nstatic const struct OamData sOam_Cable =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_CableCar[] =\n{\n    {\n        .tileTag = TAG_CABLE_CAR,\n        .paletteTag = TAG_CABLE_CAR,\n        .oam = &sOam_CableCar,\n        .anims = gDummySpriteAnimTable,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_CableCar,\n    },\n    {\n        .tileTag = TAG_DOOR,\n        .paletteTag = TAG_CABLE_CAR,\n        .oam = &sOam_CableCarDoor,\n        .anims = gDummySpriteAnimTable,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_CableCar,\n    },\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Cable = {\n    .tileTag = TAG_CABLE,\n    .paletteTag = TAG_CABLE_CAR,\n    .oam = &sOam_Cable,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_Cable,\n};\n\nstatic void Task_LoadCableCar(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        SetMainCallback2(CB2_LoadCableCar);\n        DestroyTask(taskId);\n    }\n}\n\nvoid CableCar(void)\n{\n    LockPlayerFieldControls();\n    CreateTask(Task_LoadCableCar, 1);\n    BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0));\n}\n\nstatic void CB2_LoadCableCar(void)\n{\n    u16 imebak;\n    u8 i = 0;\n    u32 sizeOut = 0;\n\n    switch (gMain.state)\n    {\n    case 0:\n    default:\n        SetVBlankCallback(NULL);\n        SetBgRegs(FALSE);\n        ScanlineEffect_Stop();\n        DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000);\n        DmaFill32Defvars(3, 0, (void *)OAM, OAM_SIZE);\n        DmaFill16Defvars(3, 0, (void *)PLTT, PLTT_SIZE);\n        sCableCar = AllocZeroed(sizeof(*sCableCar));\n        gMain.state++;\n        break;\n    case 1:\n        ResetSpriteData();\n        ResetTasks();\n        FreeAllSpritePalettes();\n        ResetPaletteFade();\n        ResetTempTileDataBuffers();\n        StartWeather();\n        for (i = 0; i < NUM_ASH_SPRITES; i++)\n            gWeatherPtr->sprites.s2.ashSprites[i] = NULL;\n\n        InitMapMusic();\n        ResetMapMusic();\n        ResetBgsAndClearDma3BusyFlags(0);\n        InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));\n        SetBgTilemapBuffer(0, sCableCar->bgTilemapBuffers[0]);\n        SetBgTilemapBuffer(1, sCableCar->bgTilemapBuffers[1]);\n        SetBgTilemapBuffer(2, sCableCar->bgTilemapBuffers[2]);\n        SetBgTilemapBuffer(3, sCableCar->bgTilemapBuffers[3]);\n        gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0;\n        gMain.state++;\n        break;\n    case 2:\n        for (i = 0; i < NELEMS(sSpriteSheets) - 1; i++)\n            LoadCompressedSpriteSheet(&sSpriteSheets[i]);\n\n        LoadSpritePalettes(sSpritePalettes);\n        sCableCar->groundTilemap = MallocAndDecompress(sGround_Tilemap, &sizeOut);\n        sCableCar->treesTilemap = MallocAndDecompress(sTrees_Tilemap, &sizeOut);\n        sCableCar->bgMountainsTilemap = MallocAndDecompress(sBgMountains_Tilemap, &sizeOut);\n        sCableCar->pylonStemTilemap = MallocAndDecompress(sPylonStems_Tilemap, &sizeOut);\n        sCableCar->pylonHookTilemapEntries = sPylonHook_TilemapEntries;\n        DecompressAndCopyTileDataToVram(0, gCableCarBg_Gfx, 0, 0, 0);\n        gMain.state++;\n        break;\n    case 3:\n        if (!FreeTempTileDataBuffersIfPossible())\n        {\n            LoadPalette(gCableCarBg_Pal, 0, 0x80);\n            gMain.state++;\n        }\n        break;\n    case 4:\n        CreateCableCarSprites();\n        RunTasks();\n        gMain.state++;\n        break;\n    case 5:\n        if (sCableCar->weather == WEATHER_VOLCANIC_ASH)\n        {\n            gMain.state++;\n        }\n        else if (gWeatherPtr->sprites.s2.ashSprites[0])\n        {\n            for (i = 0; i < NUM_ASH_SPRITES; i++)\n            {\n                if (gWeatherPtr->sprites.s2.ashSprites[i])\n                    gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0;\n            }\n\n            gMain.state++;\n        }\n        break;\n    case 6:\n        CopyToBgTilemapBufferRect_ChangePalette(1, sCableCar->treesTilemap, 0, 17, 32, 15, 17);\n        CopyToBgTilemapBufferRect_ChangePalette(2, sCableCar->bgMountainsTilemap, 0, 0, 30, 20, 17);\n        CopyToBgTilemapBufferRect_ChangePalette(3, sCableCar->pylonHookTilemapEntries, 0, 0, 5, 2, 17);\n        CopyToBgTilemapBufferRect_ChangePalette(3, sCableCar->pylonStemTilemap, 0, 2, 2, 20, 17);\n        gMain.state++;\n        break;\n    case 7:\n        InitGroundTilemapData(GOING_DOWN);\n        CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap +  0x48,  0, 14, 12, 3, 17);\n        CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap +  0x6C, 12, 17, 12, 3, 17);\n        CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap +  0x90, 24, 20, 12, 3, 17);\n        CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap +   0x0,  0, 17, 12, 3, 17);\n        CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap +  0x24,  0, 20, 12, 3, 17);\n        CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap +   0x0, 12, 20, 12, 3, 17);\n        CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap +  0x24, 12, 23, 12, 3, 17);\n        CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap +   0x0, 24, 23, 12, 3, 17);\n        gMain.state++;\n        break;\n    case 8:\n        BeginNormalPaletteFade(0xFFFFFFFF, 3, 16, 0, RGB(0, 0, 0));\n        FadeInNewBGM(MUS_CABLE_CAR, 1);\n        SetBgRegs(TRUE);\n        gMain.state++;\n        break;\n    case 9:\n        imebak = REG_IME;\n        REG_IME = 0;\n        REG_IE |= INTR_FLAG_VBLANK;\n        REG_IME = imebak;\n        SetVBlankCallback(VBlankCB_CableCar);\n        SetMainCallback2(CB2_CableCar);\n        CreateTask(Task_CableCar, 0);\n        if (!GOING_DOWN)\n            sCableCar->bgTaskId = CreateTask(Task_AnimateBgGoingUp, 1);\n        else\n            sCableCar->bgTaskId = CreateTask(Task_AnimateBgGoingDown, 1);\n        break;\n    }\n}\n\nstatic void CB2_CableCar(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n    MapMusicMain();\n}\n\nstatic void CB2_EndCableCar(void)\n{\n    u8 i = 0;\n\n    HideBg(0);\n    HideBg(1);\n    HideBg(2);\n    HideBg(3);\n    SetBgRegs(FALSE);\n    gSpriteCoordOffsetX = 0;\n    SetCurrentAndNextWeatherNoDelay(WEATHER_NONE);\n    for (i = 0; i < NUM_ASH_SPRITES; i++)\n        gWeatherPtr->sprites.s2.ashSprites[i] = NULL;\n\n    ResetTasks();\n    ResetSpriteData();\n    ResetPaletteFade();\n    UnsetBgTilemapBuffer(0);\n    UnsetBgTilemapBuffer(1);\n    UnsetBgTilemapBuffer(2);\n    UnsetBgTilemapBuffer(3);\n    ResetBgsAndClearDma3BusyFlags(0);\n    sCableCar->pylonHookTilemapEntries = NULL;\n    FREE_AND_SET_NULL(sCableCar->pylonStemTilemap);\n    FREE_AND_SET_NULL(sCableCar->bgMountainsTilemap);\n    FREE_AND_SET_NULL(sCableCar->treesTilemap);\n    FREE_AND_SET_NULL(sCableCar->groundTilemap);\n    FREE_AND_SET_NULL(sCableCar);\n    DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000);\n    DmaFill32Defvars(3, 0, (void *)OAM, OAM_SIZE);\n    DmaFill16Defvars(3, 0, (void *)PLTT, PLTT_SIZE);\n    WarpIntoMap();\n    gFieldCallback = NULL;\n    SetMainCallback2(CB2_LoadMap);\n}\n\nstatic void Task_CableCar(u8 taskId)\n{\n    u8 i = 0;\n\n    sCableCar->timer++;\n    switch (sCableCar->state)\n    {\n    case 0:\n        // Wait to change weather\n        if (sCableCar->timer == sCableCar->weatherDelay)\n        {\n            SetNextWeather(sCableCar->weather);\n            sCableCar->state = 1;\n        }\n        break;\n    case 1:\n        // Update ash sprites\n        switch (sCableCar->weather)\n        {\n        case WEATHER_VOLCANIC_ASH:\n            if (gWeatherPtr->sprites.s2.ashSprites[0] != NULL && gWeatherPtr->sprites.s2.ashSprites[0]->oam.priority != 0)\n            {\n                for (; i < NUM_ASH_SPRITES; i++)\n                {\n                    if (gWeatherPtr->sprites.s2.ashSprites[i])\n                        gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0;\n                }\n\n                sCableCar->state = 2;\n            }\n            break;\n        case WEATHER_SUNNY:\n            if (gWeatherPtr->currWeather == WEATHER_SUNNY)\n            {\n                sCableCar->state = 2;\n            }\n            else if (sCableCar->timer >= sCableCar->weatherDelay + 8)\n            {\n                for (; i < NUM_ASH_SPRITES; i++)\n                {\n                    if (gWeatherPtr->sprites.s2.ashSprites[i])\n                        gWeatherPtr->sprites.s2.ashSprites[i]->invisible ^= 1;\n                }\n            }\n            break;\n        }\n        break;\n    case 2:\n        // Wait to fade out\n        if (sCableCar->timer == 570)\n        {\n            sCableCar->state = 3;\n            BeginNormalPaletteFade(0xFFFFFFFF, 3, 0, 16, RGB(0, 0, 0));\n            FadeOutBGM(4);\n        }\n        break;\n    case 3:\n        // Wait for fade out\n        if (!gPaletteFade.active)\n            sCableCar->state = STATE_END;\n        break;\n    case STATE_END:\n        SetVBlankCallback(NULL);\n        DestroyTask(taskId);\n        DestroyTask(sCableCar->bgTaskId);\n        SetMainCallback2(CB2_EndCableCar);\n        break;\n    }\n}\n\nstatic void Task_AnimateBgGoingUp(u8 taskId)\n{\n    if (sCableCar->state != STATE_END)\n    {\n        sCableCar->bg3HorizontalOffset--;\n        if ((sCableCar->timer % 2) == 0)\n            sCableCar->bg3VerticalOffset--;\n\n        if ((sCableCar->timer % 8) == 0)\n        {\n            sCableCar->bg1HorizontalOffset--;\n            sCableCar->bg1VerticalOffset--;\n        }\n\n        switch (sCableCar->bg3HorizontalOffset)\n        {\n        case 175:\n            FillBgTilemapBufferRect(3, 0, 0, 22, 2, 10, 17);\n            break;\n        case 40:\n            FillBgTilemapBufferRect(3, 0, 3, 0, 2, 2, 17);\n            break;\n        case 32:\n            FillBgTilemapBufferRect(3, 0, 2, 0, 1, 2, 17);\n            break;\n        case 16:\n            CopyToBgTilemapBufferRect_ChangePalette(3, sCableCar->pylonHookTilemapEntries, 0, 0, 5,  2, 17);\n            CopyToBgTilemapBufferRect_ChangePalette(3, sCableCar->pylonStemTilemap, 0, 2, 2, 30, 17);\n            sCableCar->bg3VerticalOffset = 64;\n            break;\n        }\n    }\n\n    AnimateGroundGoingUp();\n    gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 1) % 128;\n}\n\nstatic void Task_AnimateBgGoingDown(u8 taskId)\n{\n    if (sCableCar->state != STATE_END)\n    {\n        sCableCar->bg3HorizontalOffset++;\n        if ((sCableCar->timer % 2) == 0)\n            sCableCar->bg3VerticalOffset++;\n\n        if ((sCableCar->timer % 8) == 0)\n        {\n            sCableCar->bg1HorizontalOffset++;\n            sCableCar->bg1VerticalOffset++;\n        }\n\n        switch (sCableCar->bg3HorizontalOffset)\n        {\n        case 176:\n            CopyToBgTilemapBufferRect_ChangePalette(3, sCableCar->pylonStemTilemap, 0, 2, 2, 30, 17);\n            break;\n        case 16:\n            FillBgTilemapBufferRect(3, 0, 2,  0, 3,  2, 17);\n            FillBgTilemapBufferRect(3, 0, 0, 22, 2, 10, 17);\n            sCableCar->bg3VerticalOffset = 192;\n            break;\n        case 32:\n            FillBgTilemapBufferRect(3, sCableCar->pylonHookTilemapEntries[2], 2, 0, 1, 1, 17);\n            FillBgTilemapBufferRect(3, sCableCar->pylonHookTilemapEntries[3], 3, 0, 1, 1, 17);\n            FillBgTilemapBufferRect(3, sCableCar->pylonHookTilemapEntries[7], 2, 1, 1, 1, 17);\n            FillBgTilemapBufferRect(3, sCableCar->pylonHookTilemapEntries[8], 3, 1, 1, 1, 17);\n            break;\n        case 40:\n            FillBgTilemapBufferRect(3, sCableCar->pylonHookTilemapEntries[4], 4, 0, 1, 1, 17);\n            FillBgTilemapBufferRect(3, sCableCar->pylonHookTilemapEntries[9], 4, 1, 1, 1, 17);\n            break;\n        }\n    }\n\n    AnimateGroundGoingDown();\n    if (sCableCar->timer < sCableCar->weatherDelay)\n        gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 247) % 248;\n    else\n        gWeatherPtr->ashBaseSpritesX = (gWeatherPtr->ashBaseSpritesX + 247) % 248;\n}\n\nstatic void VBlankCB_CableCar(void)\n{\n    CopyBgTilemapBufferToVram(0);\n    CopyBgTilemapBufferToVram(3);\n    SetGpuReg(REG_OFFSET_BG3HOFS, sCableCar->bg3HorizontalOffset);\n    SetGpuReg(REG_OFFSET_BG3VOFS, sCableCar->bg3VerticalOffset);\n    SetGpuReg(REG_OFFSET_BG1HOFS, sCableCar->bg1HorizontalOffset);\n    SetGpuReg(REG_OFFSET_BG1VOFS, sCableCar->bg1VerticalOffset);\n    SetGpuReg(REG_OFFSET_BG0HOFS, sCableCar->bg0HorizontalOffset);\n    SetGpuReg(REG_OFFSET_BG0VOFS, sCableCar->bg0VerticalOffset);\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void SpriteCB_Cable(struct Sprite *sprite)\n{\n\n}\n\n#define sXPos  data[0]\n#define sYPos  data[1]\n\nstatic void SpriteCB_CableCar(struct Sprite *sprite)\n{\n    if (sCableCar->state != STATE_END)\n    {\n        if (!GOING_DOWN)\n        {\n            sprite->x = sprite->sXPos - (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer));\n            sprite->y = sprite->sYPos - (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer));\n        }\n        else\n        {\n            sprite->x = sprite->sXPos + (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer));\n            sprite->y = sprite->sYPos + (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer));\n        }\n    }\n}\n\n#define sState data[2]\n#define sTimer data[3]\n\nstatic void SpriteCB_Player(struct Sprite *sprite)\n{\n    if (sCableCar->state != STATE_END)\n    {\n        // Move along with cable car\n        if (!GOING_DOWN)\n        {\n            sprite->x = sprite->sXPos - (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer));\n            sprite->y = sprite->sYPos - (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer));\n        }\n        else\n        {\n            sprite->x = sprite->sXPos + (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer));\n            sprite->y = sprite->sYPos + (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer));\n        }\n\n        // Bounce up and down\n        switch (sprite->sState)\n        {\n        case 0:\n            sprite->y2 = 17;\n            if (sprite->sTimer++ > 9)\n            {\n                sprite->sTimer = 0;\n                sprite->sState++;\n            }\n            break;\n        default:\n            sprite->y2 = 16;\n            if (sprite->sTimer++ > 9)\n            {\n                sprite->sTimer = 0;\n                sprite->sState = 0;\n            }\n            break;\n        }\n    }\n}\n\n#undef sState\n#undef sTimer\n\n#define sTimer      data[0]\n#define sSameDir    data[1] // Whether or not the hiker is headed the same dir as the Cable Car\n#define sDelay      data[2]\n\nstatic void SpriteCB_HikerGoingUp(struct Sprite *sprite)\n{\n    if (sprite->sTimer == 0)\n    {\n        sprite->x += 2 * sprite->centerToCornerVecX;\n        sprite->y += 16 + sprite->centerToCornerVecY;\n    }\n\n    if (++sprite->sTimer >= sprite->sDelay)\n    {\n        switch (sprite->sSameDir)\n        {\n        case FALSE:\n            sprite->x++;\n            if ((sprite->sTimer % 4) == 0)\n                sprite->y++;\n            break;\n        case TRUE:\n            // Hiker moves slower if travelling with the Cable Car\n            if ((sprite->sTimer % 2) != 0)\n            {\n                sprite->x++;\n                if ((sprite->x % 4) == 0)\n                    sprite->y++;\n            }\n            break;\n        }\n\n        if (sprite->y > 160)\n            DestroySprite(sprite);\n    }\n}\n\nstatic void SpriteCB_HikerGoingDown(struct Sprite *sprite)\n{\n    if (sprite->sTimer == 0)\n        sprite->y += 16 + sprite->centerToCornerVecY;\n\n    if (++sprite->sTimer >= sprite->sDelay)\n    {\n        switch (sprite->sSameDir)\n        {\n        case FALSE:\n            sprite->x--;\n            if ((sprite->sTimer % 4) == 0)\n                sprite->y--;\n            break;\n        case TRUE:\n            // Hiker moves slower if travelling with the Cable Car\n            if ((sprite->sTimer % 2) != 0)\n            {\n                sprite->x--;\n                if ((sprite->x % 4) == 0)\n                    sprite->y--;\n            }\n            break;\n        }\n\n        if (sprite->y < 80)\n            DestroySprite(sprite);\n    }\n}\n\n#undef sTimer\n\nstatic void SetBgRegs(bool8 active)\n{\n    switch (active)\n    {\n    case FALSE:\n    default:\n        SetGpuReg(REG_OFFSET_WININ, 0);\n        SetGpuReg(REG_OFFSET_WINOUT, 0);\n        SetGpuReg(REG_OFFSET_WIN0H, 0);\n        SetGpuReg(REG_OFFSET_WIN1H, 0);\n        SetGpuReg(REG_OFFSET_WIN0V, 0);\n        SetGpuReg(REG_OFFSET_WIN1V, 0);\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        SetGpuReg(REG_OFFSET_BG3CNT, 0);\n        SetGpuReg(REG_OFFSET_BG2CNT, 0);\n        SetGpuReg(REG_OFFSET_BG1CNT, 0);\n        SetGpuReg(REG_OFFSET_BG0CNT, 0);\n        SetGpuReg(REG_OFFSET_BG3HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG3VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG2HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG1VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        break;\n    case TRUE:\n        SetGpuReg(REG_OFFSET_WININ, 0);\n        SetGpuReg(REG_OFFSET_WINOUT, 0);\n        SetGpuReg(REG_OFFSET_WIN0H, 0);\n        SetGpuReg(REG_OFFSET_WIN1H, 0);\n        SetGpuReg(REG_OFFSET_WIN0V, 0);\n        SetGpuReg(REG_OFFSET_WIN1V, 0);\n        if (!GOING_DOWN)\n        {\n            sCableCar->bg3HorizontalOffset = 176;\n            sCableCar->bg3VerticalOffset = 16;\n            sCableCar->bg1HorizontalOffset = 0;\n            sCableCar->bg1VerticalOffset = 80;\n            sCableCar->bg0VerticalOffset = 0;\n            sCableCar->bg0VerticalOffset = 0;\n        }\n        else\n        {\n            sCableCar->bg3HorizontalOffset = 96;\n            sCableCar->bg3VerticalOffset = 232;\n            sCableCar->bg1HorizontalOffset = 0;\n            sCableCar->bg1VerticalOffset = 4;\n            sCableCar->bg0VerticalOffset = 0;\n            sCableCar->bg0VerticalOffset = 0;\n        }\n\n        SetGpuReg(REG_OFFSET_BG3HOFS, sCableCar->bg3HorizontalOffset);\n        SetGpuReg(REG_OFFSET_BG3VOFS, sCableCar->bg3VerticalOffset);\n        SetGpuReg(REG_OFFSET_BG2HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG1HOFS, sCableCar->bg1HorizontalOffset);\n        SetGpuReg(REG_OFFSET_BG1VOFS, sCableCar->bg1VerticalOffset);\n        SetGpuReg(REG_OFFSET_BG0HOFS, sCableCar->bg0HorizontalOffset);\n        SetGpuReg(REG_OFFSET_BG0VOFS, sCableCar->bg0VerticalOffset);\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(2);\n        ShowBg(0);\n        ShowBg(1);\n        ShowBg(2);\n        ShowBg(3);\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL);\n        break;\n    }\n}\n\nstatic void CreateCableCarSprites(void)\n{\n    u8 spriteId;\n    u8 i;\n\n    u8 playerGraphicsIds[2] = {\n        [MALE]   = OBJ_EVENT_GFX_RED_NORMAL,\n        [FEMALE] = OBJ_EVENT_GFX_GREEN_NORMAL\n    };\n    u16 rval = Random();\n    u8 hikerGraphicsIds[4] = {\n        OBJ_EVENT_GFX_HIKER,\n        OBJ_EVENT_GFX_CAMPER,\n        OBJ_EVENT_GFX_PICNICKER,\n        OBJ_EVENT_GFX_HIKER\n    };\n    s16 hikerCoords[2][2] = {\n        {   0,  80 }, // Going up\n        { 240, 146 }  // Going down\n    };\n    u8 hikerMovementDelayTable[4] = { 0, 60, 120, 170};\n    void (*hikerCallbacks[2])(struct Sprite *) = {\n        SpriteCB_HikerGoingUp,\n        SpriteCB_HikerGoingDown\n    };\n\n    switch (GOING_DOWN)\n    {\n        case FALSE:\n        default:\n            // Create player sprite\n            spriteId = CreateObjectGraphicsSprite(playerGraphicsIds[gSaveBlock2Ptr->playerGender], SpriteCB_Player, 200, 73, 102);\n            if (spriteId != MAX_SPRITES)\n            {\n                gSprites[spriteId].oam.priority = 2;\n                gSprites[spriteId].x2 = 8;\n                gSprites[spriteId].y2 = 16;\n                gSprites[spriteId].sXPos = 200;\n                gSprites[spriteId].sYPos = 73;\n            }\n            // Create car sprite\n            spriteId = CreateSprite(&sSpriteTemplate_CableCar[0], 176, 43, 0x67);\n            gSprites[spriteId].x2 = gSprites[spriteId].y2 = 32;\n            gSprites[spriteId].sXPos = 176;\n            gSprites[spriteId].sYPos = 43;\n            // Create door sprite\n            spriteId = CreateSprite(&sSpriteTemplate_CableCar[1], 200, 99, 0x65);\n            gSprites[spriteId].x2 = 8;\n            gSprites[spriteId].y2 = 4;\n            gSprites[spriteId].sXPos = 200;\n            gSprites[spriteId].sYPos = 99;\n            // Init weather\n            sCableCar->weather = WEATHER_VOLCANIC_ASH;\n            sCableCar->weatherDelay = 350;\n            SetCurrentAndNextWeatherNoDelay(WEATHER_SUNNY);\n            break;\n        case TRUE:\n            CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x24, 24, 26, 12, 3, 17);\n            // Create player sprite\n            spriteId = CreateObjectGraphicsSprite(playerGraphicsIds[gSaveBlock2Ptr->playerGender], SpriteCB_Player, 128, 39, 102);\n            if (spriteId != MAX_SPRITES)\n            {\n                gSprites[spriteId].oam.priority = 2;\n                gSprites[spriteId].x2 = 8;\n                gSprites[spriteId].y2 = 16;\n                gSprites[spriteId].sXPos = 128;\n                gSprites[spriteId].sYPos = 39;\n            }\n            // Create car sprite\n            spriteId = CreateSprite(&sSpriteTemplate_CableCar[0], 104, 9, 0x67);\n            gSprites[spriteId].x2 = gSprites[spriteId].y2 = 32;\n            gSprites[spriteId].sXPos = 104;\n            gSprites[spriteId].sYPos = 9;\n            // Create door sprite\n            spriteId = CreateSprite(&sSpriteTemplate_CableCar[1], 128, 65, 0x65);\n            gSprites[spriteId].x2 = 8;\n            gSprites[spriteId].y2 = 4;\n            gSprites[spriteId].sXPos = 128;\n            gSprites[spriteId].sYPos = 65;\n            // Init weather\n            sCableCar->weather = WEATHER_SUNNY;\n            sCableCar->weatherDelay = 265;\n            SetCurrentAndNextWeatherNoDelay(WEATHER_VOLCANIC_ASH);\n            break;\n    }\n    for (i = 0; i < 9; i++)\n    {\n        spriteId = CreateSprite(&sSpriteTemplate_Cable, 16 * i + 96, 8 * i - 8, 0x68);\n        gSprites[spriteId].x2 = 8;\n        gSprites[spriteId].y2 = 8;\n    }\n\n    // 1/64 chance for an NPC to appear hiking on the ground below the Cable Car\n    if ((rval % 64) == 0)\n    {\n        // Unclear if this was intentional, but the - 1 in the below NELEMS means the Zigzagoon is never used\n        spriteId = CreateObjectGraphicsSprite(hikerGraphicsIds[rval % (NELEMS(hikerGraphicsIds) - 1)], hikerCallbacks[GOING_DOWN], hikerCoords[GOING_DOWN][0], hikerCoords[GOING_DOWN][1], 106);\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].oam.priority = 2;\n            gSprites[spriteId].x2 = -gSprites[spriteId].centerToCornerVecX;\n            gSprites[spriteId].y2 = -gSprites[spriteId].centerToCornerVecY;\n            \n            // Randomly choose which direction the NPC is going\n            if (!GOING_DOWN)\n            {\n                if (rval % 2)\n                {\n                    // Do walking west anim\n                    StartSpriteAnim(&gSprites[spriteId], 6);\n                    gSprites[spriteId].sSameDir = TRUE;\n                    gSprites[spriteId].y += 2;\n                }\n                else\n                {\n                    // Do walking east anim\n                    StartSpriteAnim(&gSprites[spriteId], 7);\n                    gSprites[spriteId].sSameDir = FALSE;\n                }\n            }\n            else\n            {\n                if (rval % 2)\n                {\n                    // Do walking east anim\n                    StartSpriteAnim(&gSprites[spriteId], 7);\n                    gSprites[spriteId].sSameDir = TRUE;\n                    gSprites[spriteId].y += 2;\n                }\n                else\n                {\n                    // Do walking west anim\n                    StartSpriteAnim(&gSprites[spriteId], 6);\n                    gSprites[spriteId].sSameDir = FALSE;\n                }\n            }\n            gSprites[spriteId].sDelay = hikerMovementDelayTable[rval % NELEMS(hikerMovementDelayTable)];\n        }\n    }\n}\n\nstatic void BufferNextGroundSegment(void)\n{\n    u8 i, j, k;\n    u8 offset;\n\n    for (i = 0, k = 0, offset = 0x24 * (sCableCar->groundTilemapOffset + 2); i < 3; i++)\n    {\n        for (j = 0; j < NELEMS(sCableCar->groundTileBuffer[0]); j++)\n        {\n            sCableCar->groundTileBuffer[i][j] = sCableCar->groundTilemap[offset++];\n            sCableCar->groundTileBuffer[i + 3][j] = sCableCar->groundTilemap[k];\n            sCableCar->groundTileBuffer[i + 6][j] = (sCableCar->groundTilemap + 0x24)[k];\n            k++;\n        }\n    }\n\n    sCableCar->groundTilemapOffset = (sCableCar->groundTilemapOffset + 1) % 3;\n}\n\nstatic void AnimateGroundGoingUp(void)\n{\n    sCableCar->groundTimer = (sCableCar->groundTimer + 1) % 96;\n    sCableCar->bg0HorizontalOffset = sCableCar->groundXBase - sCableCar->groundXOffset;\n    sCableCar->bg0VerticalOffset = sCableCar->groundYBase - sCableCar->groundYOffset;\n    sCableCar->groundXOffset++;\n    if ((sCableCar->groundXOffset % 4) == 0)\n        sCableCar->groundYOffset++;\n\n    if (sCableCar->groundXOffset > 16)\n        DrawNextGroundSegmentGoingUp();\n}\n\nstatic void AnimateGroundGoingDown(void)\n{\n    sCableCar->groundTimer = (sCableCar->groundTimer + 1) % 96;\n    sCableCar->bg0HorizontalOffset = sCableCar->groundXBase + sCableCar->groundXOffset;\n    sCableCar->bg0VerticalOffset = sCableCar->groundYBase + sCableCar->groundYOffset;\n    sCableCar->groundXOffset++;\n    if ((sCableCar->groundXOffset % 4) == 0)\n        sCableCar->groundYOffset++;\n\n    if (sCableCar->groundXOffset > 16)\n        DrawNextGroundSegmentGoingDown();\n}\n\nstatic void DrawNextGroundSegmentGoingUp(void)\n{\n    u8 i = 0;\n\n    sCableCar->groundXOffset = sCableCar->groundYOffset = 0;\n    sCableCar->groundXBase = sCableCar->bg0HorizontalOffset;\n    sCableCar->groundYBase = sCableCar->bg0VerticalOffset;\n    sCableCar->groundSegmentXStart = (sCableCar->groundSegmentXStart + 30) % 32;\n    sCableCar->groundTileIdx -= 2;\n    sGroundSegmentY_Up = (sCableCar->groundSegmentYStart + 23) % 32;\n\n    // Draw next segment\n    for (i = 0; i < NELEMS(sCableCar->groundTileBuffer); i++)\n    {\n        sGroundX_Up = sCableCar->groundSegmentXStart;\n        sGroundY_Up = (sGroundSegmentY_Up + i) % 32;\n        FillBgTilemapBufferRect(0, sCableCar->groundTileBuffer[i][sCableCar->groundTileIdx], sGroundX_Up, sGroundY_Up, 1, 1, 17);\n        sGroundX_Up = (sGroundX_Up + 1) % 32;\n        FillBgTilemapBufferRect(0, sCableCar->groundTileBuffer[i][sCableCar->groundTileIdx + 1], sGroundX_Up, sGroundY_Up, 1, 1, 17);\n    }\n\n    // Erase old segment\n    sGroundX_Up = (sCableCar->groundSegmentXStart + 30) % 32;\n    FillBgTilemapBufferRect(0, 0, sGroundX_Up, 0, 2, 32, 17);\n    if (sCableCar->groundTileIdx == 0)\n    {\n        sCableCar->groundSegmentYStart = (sCableCar->groundSegmentYStart + 29) % 32;\n        sCableCar->groundTileIdx = 12;\n        BufferNextGroundSegment();\n        sGroundX_Up = (sCableCar->groundSegmentYStart + 1) % 32;\n        FillBgTilemapBufferRect(0, 0, 0, sGroundX_Up, 32, 9, 17);\n    }\n}\n\nstatic void DrawNextGroundSegmentGoingDown(void)\n{\n    u8 i = 0;\n\n    sCableCar->groundXOffset = sCableCar->groundYOffset = 0;\n    sCableCar->groundXBase = sCableCar->bg0HorizontalOffset;\n    sCableCar->groundYBase = sCableCar->bg0VerticalOffset;\n    sCableCar->groundSegmentXStart = (sCableCar->groundSegmentXStart + 2) % 32;\n    sCableCar->groundTileIdx += 2;\n    sGroundSegmentY_Down = sCableCar->groundSegmentYStart;\n    \n    // Draw next segment\n    for (i = 0; i < NELEMS(sCableCar->groundTileBuffer); i++)\n    {\n        sGroundX_Down = sCableCar->groundSegmentXStart;\n        sGroundY_Down = (sGroundSegmentY_Down + i) % 32;\n        FillBgTilemapBufferRect(0, sCableCar->groundTileBuffer[i][sCableCar->groundTileIdx], sGroundX_Down, sGroundY_Down, 1, 1, 17);\n        sGroundX_Down = (sGroundX_Down + 1) % 32;\n        FillBgTilemapBufferRect(0, sCableCar->groundTileBuffer[i][sCableCar->groundTileIdx + 1], sGroundX_Down, sGroundY_Down, 1, 1, 17);\n    }\n\n    // Erase old segment\n    sGroundY_Down = (sCableCar->groundSegmentYStart + 23) % 32;\n    FillBgTilemapBufferRect(0, 0, sCableCar->groundSegmentXStart, sGroundY_Down, 2, 9, 17);\n    if (sCableCar->groundTileIdx == 10)\n    {\n        sCableCar->groundSegmentYStart = (sCableCar->groundSegmentYStart + 3) % 32;\n        sCableCar->groundTileIdx = -2;\n        BufferNextGroundSegment();\n    }\n}\n\nstatic void InitGroundTilemapData(bool8 goingDown)\n{\n    switch (goingDown)\n    {\n        case FALSE:\n        default:\n            sCableCar->groundTilemapOffset = 2;\n            sCableCar->groundSegmentXStart = 0;\n            sCableCar->groundSegmentYStart = 20;\n            sCableCar->groundTileIdx = 12;\n            BufferNextGroundSegment();\n            DrawNextGroundSegmentGoingUp();\n            break;\n        case TRUE:\n            sCableCar->groundTilemapOffset = 2;\n            sCableCar->groundSegmentXStart = 28;\n            sCableCar->groundSegmentYStart = 20;\n            sCableCar->groundTileIdx = 4;\n            BufferNextGroundSegment();\n            DrawNextGroundSegmentGoingDown();\n            break;\n    }\n\n    sCableCar->groundTimer = 0;\n}\n"
  },
  {
    "path": "src/cable_car_util.c",
    "content": "#include \"global.h\"\n\nstatic void CableCarUtil_FillWrapped(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height)\n{\n    u32 i;\n    u32 j;\n    u8 x;\n    u8 y;\n\n    for (i = 0, y = top; i < height; i++)\n    {\n        for (x = left, j = 0; j < width; j++)\n        {\n            *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = value;\n            x = (x + 1) % 32;\n        }\n        y = (y + 1) % 32;\n    }\n}\n\nstatic void CableCarUtil_CopyWrapped(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height)\n{\n    u32 i;\n    u32 j;\n    u8 x;\n    u8 y;\n    const u16 *_src;\n\n    for (i = 0, _src = src, y = top; i < height; i++)\n    {\n        for (x = left, j = 0; j < width; j++)\n        {\n            *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = *_src++;\n            x = (x + 1) % 32;\n        }\n        y = (y + 1) % 32;\n    }\n}\n"
  },
  {
    "path": "src/cable_club.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_records.h\"\n#include \"cable_club.h\"\n#include \"event_data.h\"\n#include \"event_scripts.h\"\n#include \"field_message_box.h\"\n#include \"field_weather.h\"\n#include \"link.h\"\n#include \"load_save.h\"\n#include \"m4a.h\"\n#include \"mystery_gift.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"quest_log.h\"\n#include \"script.h\"\n#include \"script_pokemon_util.h\"\n#include \"start_menu.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"trade.h\"\n#include \"trainer_card.h\"\n#include \"union_room.h\"\n#include \"constants/songs.h\"\n#include \"constants/cable_club.h\"\n#include \"constants/field_weather.h\"\n#include \"constants/maps.h\"\n\nu32 UnusedVarNeededToMatch[8];\n\nstatic void Task_LinkupStart(u8 taskId);\nstatic void Task_LinkupAwaitConnection(u8 taskId);\nstatic void Task_LinkupConfirmWhenReady(u8 taskId);\nstatic void Task_LinkupAwaitConfirmation(u8 taskId);\nstatic void Task_LinkupTryConfirmation(u8 taskId);\nstatic void Task_LinkupConfirm(u8 taskId);\nstatic void Task_LinkupExchangeDataWithLeader(u8 taskId);\nstatic void Task_LinkupCheckStatusAfterConfirm(u8 taskId);\nstatic void Task_LinkupAwaitTrainerCardData(u8 taskId);\nstatic void Task_StopLinkup(u8 taskId);\nstatic void Task_LinkupFailed(u8 taskId);\nstatic void Task_LinkupConnectionError(u8 taskId);\nstatic bool8 TryLinkTimeout(u8 taskId);\nstatic void Task_ReestablishLink(u8 taskId);\nstatic void Task_ReestablishLinkAwaitConnection(u8 taskId);\nstatic void Task_ReestablishLinkLeader(u8 taskId);\nstatic void Task_ReestablishLinkAwaitConfirmation(u8 taskId);\n\n#define tState      data[0]\n\n\n#define tMinPlayers data[1]\n#define tMaxPlayers data[2]\n#define tNumPlayers data[3]\n#define tTimer      data[4]\n#define tWindowId   data[5]\n\nstatic const struct WindowTemplate sWindowTemplate_LinkPlayerCount = {\n    .bg = 0,\n    .tilemapLeft = 16,\n    .tilemapTop = 11,\n    .width = 11,\n    .height = 2,\n    .paletteNum = 15,\n    .baseBlock = 0x125\n};\n\nstatic const u8 *const sTrainerCardColorNames[] = {\n    gText_BronzeCard,\n    gText_CopperCard,\n    gText_SilverCard,\n    gText_GoldCard\n};\n\nstatic void CreateLinkupTask(u8 minPlayers, u8 maxPlayers)\n{\n    u8 taskId;\n    if (FindTaskIdByFunc(Task_LinkupStart) == TASK_NONE)\n    {\n        taskId = CreateTask(Task_LinkupStart, 80);\n        gTasks[taskId].tMinPlayers = minPlayers;\n        gTasks[taskId].tMaxPlayers = maxPlayers;\n    }\n}\n\nstatic void PrintNumPlayersInLink(u16 windowId, s32 numPlayers)\n{\n    ConvertIntToDecimalStringN(gStringVar1, numPlayers, STR_CONV_MODE_LEFT_ALIGN, 1);\n    SetStdWindowBorderStyle(windowId, FALSE);\n    StringExpandPlaceholders(gStringVar4, gText_NumPlayerLink);\n    AddTextPrinterParameterized(windowId, FONT_NORMAL, gStringVar4, 0, 0, TEXT_SKIP_DRAW, NULL);\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void ClearLinkPlayerCountWindow(u16 windowId)\n{\n    ClearStdWindowAndFrame(windowId, FALSE);\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void UpdateLinkPlayerCountDisplay(u8 taskId, u8 numPlayers)\n{\n    s16 *data = gTasks[taskId].data;\n    if (numPlayers != tNumPlayers)\n    {\n        if (numPlayers < 2)\n            ClearLinkPlayerCountWindow(tWindowId);\n        else\n            PrintNumPlayersInLink(tWindowId, numPlayers);\n        tNumPlayers = numPlayers;\n    }\n}\n\nstatic u16 ExchangeDataAndGetLinkupStatus(u8 minPlayers, u8 maxPlayers)\n{\n    switch (GetLinkPlayerDataExchangeStatusTimed(minPlayers, maxPlayers))\n    {\n    case EXCHANGE_COMPLETE:\n        return LINKUP_SUCCESS;\n    case EXCHANGE_DIFF_SELECTIONS:\n        return LINKUP_DIFF_SELECTIONS;\n    case EXCHANGE_PLAYER_NOT_READY:\n        return LINKUP_PLAYER_NOT_READY;\n    case EXCHANGE_PARTNER_NOT_READY:\n        return LINKUP_PARTNER_NOT_READY;\n    case EXCHANGE_WRONG_NUM_PLAYERS:\n        ConvertIntToDecimalStringN(gStringVar1, GetLinkPlayerCount_2(), STR_CONV_MODE_LEFT_ALIGN, 1);\n        return LINKUP_WRONG_NUM_PLAYERS;\n    default:\n        return LINKUP_ONGOING;\n    }\n}\n\nstatic bool32 CheckLinkErrored(u8 taskId)\n{\n    if (HasLinkErrorOccurred() == TRUE)\n    {\n        gTasks[taskId].func = Task_LinkupConnectionError;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool32 CheckLinkCanceledBeforeConnection(u8 taskId)\n{\n    if (JOY_NEW(B_BUTTON) && !IsLinkConnectionEstablished())\n    {\n        gLinkType = 0;\n        gTasks[taskId].func = Task_LinkupFailed;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool32 CheckLinkCanceled(u8 taskId)\n{\n    if (IsLinkConnectionEstablished())\n        SetSuppressLinkErrorMessage(TRUE);\n\n    if (JOY_NEW(B_BUTTON))\n    {\n        gLinkType = 0;\n        gTasks[taskId].func = Task_LinkupFailed;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool32 CheckSioErrored(u8 taskId)\n{\n    if (GetSioMultiSI() == TRUE)\n    {\n        gTasks[taskId].func = Task_LinkupConnectionError;\n        return TRUE;\n    }\n    return FALSE;\n}\n\n// Unused\nstatic void Task_DelayedBlockRequest(u8 taskId)\n{\n    gTasks[taskId].data[0]++;\n    if (gTasks[taskId].data[0] == 10)\n    {\n        SendBlockRequest(BLOCK_REQ_SIZE_100);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_LinkupStart(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (data[0] == 0)\n    {\n        OpenLinkTimed();\n        ResetLinkPlayerCount();\n        ResetLinkPlayers();\n        tWindowId = AddWindow(&sWindowTemplate_LinkPlayerCount);\n    }\n    else if (data[0] > 9)\n    {\n        gTasks[taskId].func = Task_LinkupAwaitConnection;\n    }\n    data[0]++;\n}\n\nstatic void Task_LinkupAwaitConnection(u8 taskId)\n{\n    u8 playerCount = GetLinkPlayerCount_2();\n    if (CheckLinkCanceledBeforeConnection(taskId) == TRUE\n     || CheckLinkCanceled(taskId) == TRUE\n     || playerCount < 2)\n        return;\n\n    SetSuppressLinkErrorMessage(TRUE);\n    gTasks[taskId].data[3] = 0;\n    if (IsLinkMaster() == TRUE)\n    {\n        PlaySE(SE_PIN);\n        ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel);\n        gTasks[taskId].func = Task_LinkupConfirmWhenReady;\n    }\n    else\n    {\n        PlaySE(SE_BOO);\n        ShowFieldAutoScrollMessage(CableClub_Text_AwaitingLinkupBCancel);\n        gTasks[taskId].func = Task_LinkupExchangeDataWithLeader;\n    }\n}\n\nstatic void Task_LinkupConfirmWhenReady(u8 taskId)\n{\n    if (CheckLinkCanceledBeforeConnection(taskId) == TRUE\n     || CheckSioErrored(taskId) == TRUE\n     || CheckLinkErrored(taskId) == TRUE)\n        return;\n\n    if (GetFieldMessageBoxType() == FIELD_MESSAGE_BOX_HIDDEN)\n    {\n        gTasks[taskId].tNumPlayers = 0;\n        gTasks[taskId].func = Task_LinkupAwaitConfirmation;\n    }\n}\n\nstatic void Task_LinkupAwaitConfirmation(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    s32 linkPlayerCount = GetLinkPlayerCount_2();\n\n    if (CheckLinkCanceledBeforeConnection(taskId) == TRUE\n     || CheckSioErrored(taskId) == TRUE\n     || CheckLinkErrored(taskId) == TRUE)\n        return;\n\n    UpdateLinkPlayerCountDisplay(taskId, linkPlayerCount);\n    if (JOY_NEW(A_BUTTON) && linkPlayerCount >= tMinPlayers)\n    {\n        SaveLinkPlayers(linkPlayerCount);\n        ClearLinkPlayerCountWindow(tWindowId);\n        ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1);\n        ShowFieldAutoScrollMessage(CableClub_Text_StartLinkWithXPlayersAConfirmBCancel);\n        gTasks[taskId].func = Task_LinkupTryConfirmation;\n    }\n\n}\n\nstatic void Task_LinkupTryConfirmation(u8 taskId)\n{\n    if (CheckLinkCanceledBeforeConnection(taskId) == TRUE\n     || CheckSioErrored(taskId) == TRUE\n     || CheckLinkErrored(taskId) == TRUE)\n        return;\n\n    if (GetFieldMessageBoxType() == FIELD_MESSAGE_BOX_HIDDEN)\n    {\n        if (GetSavedPlayerCount() != GetLinkPlayerCount_2())\n        {\n            ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel);\n            gTasks[taskId].func = Task_LinkupConfirmWhenReady;\n        }\n        else if (JOY_HELD(B_BUTTON))\n        {\n            ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel);\n            gTasks[taskId].func = Task_LinkupConfirmWhenReady;\n        }\n        else if (JOY_HELD(A_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            CheckShouldAdvanceLinkState();\n            gTasks[taskId].func = Task_LinkupConfirm;\n        }\n    }\n}\n\nstatic void Task_LinkupConfirm(u8 taskId)\n{\n    u8 minPlayers = gTasks[taskId].tMinPlayers;\n    u8 maxPlayers = gTasks[taskId].tMaxPlayers;\n\n    if (CheckLinkErrored(taskId) == TRUE\n     || TryLinkTimeout(taskId) == TRUE)\n        return;\n\n    if (GetLinkPlayerCount_2() != GetSavedPlayerCount())\n    {\n        gTasks[taskId].func = Task_LinkupConnectionError;\n    }\n    else\n    {\n        u16 *result = &gSpecialVar_Result;\n        *result = ExchangeDataAndGetLinkupStatus(minPlayers, maxPlayers);\n        if (*result)\n            gTasks[taskId].func = Task_LinkupCheckStatusAfterConfirm;\n    }\n}\n\nstatic void Task_LinkupExchangeDataWithLeader(u8 taskId)\n{\n    u8 minPlayers = gTasks[taskId].tMinPlayers;\n    u8 maxPlayers = gTasks[taskId].tMaxPlayers;\n    u16 *result;\n\n    if (CheckLinkCanceledBeforeConnection(taskId) == TRUE\n     || CheckLinkErrored(taskId) == TRUE)\n        return;\n\n    result = &gSpecialVar_Result;\n    *result = ExchangeDataAndGetLinkupStatus(minPlayers, maxPlayers);\n    if (*result == LINKUP_ONGOING)\n        return;\n    if (*result == LINKUP_DIFF_SELECTIONS\n     || *result == LINKUP_WRONG_NUM_PLAYERS)\n    {\n        SetCloseLinkCallback();\n        HideFieldMessageBox();\n        gTasks[taskId].func = Task_StopLinkup;\n    }\n    else if (*result == LINKUP_PLAYER_NOT_READY\n          || *result == LINKUP_PARTNER_NOT_READY)\n    {\n        CloseLink();\n        HideFieldMessageBox();\n        gTasks[taskId].func = Task_StopLinkup;\n    }\n    else\n    {\n        gFieldLinkPlayerCount = GetLinkPlayerCount_2();\n        gLocalLinkPlayerId = GetMultiplayerId();\n        SaveLinkPlayers(gFieldLinkPlayerCount);\n        TrainerCard_GenerateCardForLinkPlayer((void *)gBlockSendBuffer);\n        gTasks[taskId].func = Task_LinkupAwaitTrainerCardData;\n    }\n}\n\nstatic bool32 AnyConnectedPartnersPlayingRS(void)\n{\n    int i;\n    u16 version;\n\n    for (i = 0; i < GetLinkPlayerCount(); i++)\n    {\n        version = gLinkPlayers[i].version & 0xFF;\n        if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void Task_LinkupCheckStatusAfterConfirm(u8 taskId)\n{\n    if (CheckLinkErrored(taskId) == TRUE)\n        return;\n\n    if (gSpecialVar_Result == LINKUP_WRONG_NUM_PLAYERS)\n    {\n        if (AnyConnectedPartnersPlayingRS() == TRUE)\n            CloseLink();\n        else\n            SetCloseLinkCallback();\n        HideFieldMessageBox();\n        gTasks[taskId].func = Task_StopLinkup;\n    }\n    else if (gSpecialVar_Result == LINKUP_DIFF_SELECTIONS)\n    {\n        SetCloseLinkCallback();\n        HideFieldMessageBox();\n        gTasks[taskId].func = Task_StopLinkup;\n    }\n    else if (gSpecialVar_Result == LINKUP_PLAYER_NOT_READY\n          || gSpecialVar_Result == LINKUP_PARTNER_NOT_READY)\n    {\n        CloseLink();\n        HideFieldMessageBox();\n        gTasks[taskId].func = Task_StopLinkup;\n    }\n    else\n    {\n        gFieldLinkPlayerCount = GetLinkPlayerCount_2();\n        gLocalLinkPlayerId = GetMultiplayerId();\n        SaveLinkPlayers(gFieldLinkPlayerCount);\n        TrainerCard_GenerateCardForLinkPlayer((void *)gBlockSendBuffer);\n        gTasks[taskId].func = Task_LinkupAwaitTrainerCardData;\n        SendBlockRequest(BLOCK_REQ_SIZE_100);\n    }\n}\n\nstatic void Task_LinkupAwaitTrainerCardData(u8 taskId)\n{\n    u8 i;\n    u16 version;\n    u8 * dest;\n\n    if (CheckLinkErrored(taskId) == TRUE)\n        return;\n\n    if (GetBlockReceivedStatus() != GetSavedLinkPlayerCountAsBitFlags())\n        return;\n\n    for (i = 0; i < GetLinkPlayerCount(); i++)\n    {\n        version = gLinkPlayers[i].version & 0xFF;\n        if (version != VERSION_FIRE_RED && version != VERSION_LEAF_GREEN)\n        {\n            const struct TrainerCardRSE * src = (const struct TrainerCardRSE *)gBlockRecvBuffer[i];\n            gTrainerCards[i].rse = *src;\n            gTrainerCards[i].version = gLinkPlayers[i].version;\n        }\n        else\n        {\n            const struct TrainerCard * src = (const struct TrainerCard *)gBlockRecvBuffer[i];\n            gTrainerCards[i] = *src;\n        }\n    }\n    SetSuppressLinkErrorMessage(FALSE);\n    ResetBlockReceivedFlags();\n    HideFieldMessageBox();\n    if (gSpecialVar_Result == LINKUP_SUCCESS)\n    {\n        // Dumb trick required to match\n        if (gLinkType == LINKTYPE_BERRY_BLENDER_SETUP)\n            *UnusedVarNeededToMatch += 0;\n        ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId);\n        ScriptContext_Enable();\n        DestroyTask(taskId);\n    }\n    else\n    {\n        SetCloseLinkCallback();\n        gTasks[taskId].func = Task_StopLinkup;\n    }\n}\n\nstatic void Task_StopLinkup(u8 taskId)\n{\n    if (!gReceivedRemoteLinkPlayers)\n    {\n        ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId);\n        ScriptContext_Enable();\n        RemoveWindow(gTasks[taskId].tWindowId);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_LinkupFailed(u8 taskId)\n{\n    gSpecialVar_Result = LINKUP_FAILED;\n    ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId);\n    HideFieldMessageBox();\n    ScriptContext_Enable();\n    DestroyTask(taskId);\n}\n\nstatic void Task_LinkupConnectionError(u8 taskId)\n{\n    gSpecialVar_Result = LINKUP_CONNECTION_ERROR;\n    ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId);\n    HideFieldMessageBox();\n    ScriptContext_Enable();\n    DestroyTask(taskId);\n}\n\nstatic bool8 TryLinkTimeout(u8 taskId)\n{\n    if (++gTasks[taskId].tTimer > 600)\n    {\n        gTasks[taskId].func = Task_LinkupConnectionError;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid TryBattleLinkup(void)\n{\n    u8 minPlayers = 2;\n    u8 maxPlayers = 2;\n\n    switch (gSpecialVar_0x8004)\n    {\n    case USING_SINGLE_BATTLE:\n        minPlayers = 2;\n        maxPlayers = 2;\n        gLinkType = LINKTYPE_SINGLE_BATTLE;\n        break;\n    case USING_DOUBLE_BATTLE:\n        minPlayers = 2;\n        maxPlayers = 2;\n        gLinkType = LINKTYPE_DOUBLE_BATTLE;\n        break;\n    case USING_MULTI_BATTLE:\n        minPlayers = 4;\n        maxPlayers = 4;\n        gLinkType = LINKTYPE_MULTI_BATTLE;\n        break;\n    }\n    CreateLinkupTask(minPlayers, maxPlayers);\n}\n\n#undef tMinPlayers\n#undef tMaxPlayers\n#undef tNumPlayers\n#undef tTimer\n#undef tWindowId\n\nvoid TryTradeLinkup(void)\n{\n    gLinkType = LINKTYPE_TRADE_SETUP;\n    gBattleTypeFlags = 0;\n    CreateLinkupTask(2, 2);\n}\n\nvoid TryRecordMixLinkup(void)\n{\n    gSpecialVar_Result = LINKUP_ONGOING;\n    gLinkType = LINKTYPE_RECORD_MIX_BEFORE;\n    gBattleTypeFlags = 0;\n    CreateLinkupTask(2, 4);\n}\n\nvoid TryContestLinkup(void)\n{\n    gLinkType = LINKTYPE_CONTEST_GMODE;\n    gBattleTypeFlags = 0;\n    CreateLinkupTask(4, 4);\n}\n\nu8 CreateTask_ReestablishCableClubLink(void)\n{\n    if (FuncIsActiveTask(Task_ReestablishLink))\n        return TASK_NONE;\n\n    switch (gSpecialVar_0x8004)\n    {\n    case USING_SINGLE_BATTLE:\n        gLinkType = LINKTYPE_SINGLE_BATTLE;\n        break;\n    case USING_DOUBLE_BATTLE:\n        gLinkType = LINKTYPE_DOUBLE_BATTLE;\n        break;\n    case USING_MULTI_BATTLE:\n        gLinkType = LINKTYPE_MULTI_BATTLE;\n        break;\n    case USING_TRADE_CENTER:\n        gLinkType = LINKTYPE_TRADE;\n        break;\n    case USING_RECORD_CORNER:\n        gLinkType = LINKTYPE_RECORD_MIX_AFTER;\n        break;\n    }\n    return CreateTask(Task_ReestablishLink, 80);\n}\n\nstatic void Task_ReestablishLink(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (data[0] == 0)\n    {\n        OpenLink();\n        ResetLinkPlayers();\n        CreateTask(Task_WaitForLinkPlayerConnection, 80);\n    }\n    else if (data[0] > 9)\n    {\n        gTasks[taskId].func = Task_ReestablishLinkAwaitConnection;\n    }\n    data[0]++;\n}\n\nstatic void Task_ReestablishLinkAwaitConnection(u8 taskId)\n{\n    if (GetLinkPlayerCount_2() >= 2)\n    {\n        if (IsLinkMaster() == TRUE)\n            gTasks[taskId].func = Task_ReestablishLinkLeader;\n        else\n            gTasks[taskId].func = Task_ReestablishLinkAwaitConfirmation;\n    }\n}\n\nstatic void Task_ReestablishLinkLeader(u8 taskId)\n{\n    if (GetSavedPlayerCount() == GetLinkPlayerCount_2())\n    {\n        CheckShouldAdvanceLinkState();\n        gTasks[taskId].func = Task_ReestablishLinkAwaitConfirmation;\n    }\n}\n\nstatic void Task_ReestablishLinkAwaitConfirmation(u8 taskId)\n{\n    if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)\n    {\n        CheckLinkPlayersMatchSaved();\n        StartSendingKeysToLink();\n        DestroyTask(taskId);\n    }\n}\n\n// Unused\nvoid CableClub_AskSaveTheGame(void)\n{\n    Field_AskSaveTheGame();\n}\n\n#define tTimer data[1]\n\nstatic void Task_StartWiredCableClubBattle(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->tState)\n    {\n    case 0:\n        FadeScreen(FADE_TO_BLACK, 0);\n        gLinkType = LINKTYPE_BATTLE;\n        ClearLinkCallback_2();\n        task->tState++;\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n            task->tState++;\n        break;\n    case 2:\n        if (++task->tTimer > 20)\n            task->tState++;\n        break;\n    case 3:\n        SetCloseLinkCallback();\n        task->tState++;\n        break;\n    case 4:\n        if (!gReceivedRemoteLinkPlayers)\n            task->tState++;\n        break;\n    case 5:\n        if (gLinkPlayers[0].trainerId & 1)\n            PlayMapChosenOrBattleBGM(MUS_RS_VS_GYM_LEADER);\n        else\n            PlayMapChosenOrBattleBGM(MUS_RS_VS_TRAINER);\n        switch (gSpecialVar_0x8004)\n        {\n        case USING_SINGLE_BATTLE:\n            gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK;\n            break;\n        case USING_DOUBLE_BATTLE:\n            gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE;\n            break;\n        case USING_MULTI_BATTLE:\n            ReducePlayerPartyToThree();\n            gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI;\n            break;\n        }\n        CleanupOverworldWindowsAndTilemaps();\n        gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT;\n        SetMainCallback2(CB2_InitBattle);\n        gMain.savedCallback = CB2_ReturnFromCableClubBattle;\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void Task_StartWirelessCableClubBattle(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    int i;\n\n    switch (tState)\n    {\n    case 0:\n        FadeScreen(FADE_TO_BLACK, 0);\n        gLinkType = LINKTYPE_BATTLE;\n        ClearLinkCallback_2();\n        tState = 1;\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n            tState = 2;\n        break;\n    case 2:\n        SendBlock(0, &gLocalLinkPlayer, sizeof(gLocalLinkPlayer));\n        tState = 3;\n        break;\n    case 3:\n        if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags())\n        {\n            for (i = 0; i < GetLinkPlayerCount(); i++)\n            {\n                gLinkPlayers[i] = *(struct LinkPlayer *)gBlockRecvBuffer[i];\n                ConvertLinkPlayerName(&gLinkPlayers[i]);\n                ResetBlockReceivedFlag(i);\n            }\n            tState = 4;\n        }\n        break;\n    case 4:\n        if (++tTimer > 20)\n            tState = 5;\n        break;\n    case 5:\n        SetLinkStandbyCallback();\n        tState = 6;\n        break;\n    case 6:\n        if (IsLinkTaskFinished())\n            tState = 7;\n        break;\n    case 7:\n        if (gLinkPlayers[0].trainerId & 1)\n            PlayMapChosenOrBattleBGM(MUS_RS_VS_GYM_LEADER);\n        else\n            PlayMapChosenOrBattleBGM(MUS_RS_VS_TRAINER);\n        gLinkPlayers[0].linkType = LINKTYPE_BATTLE;\n        switch (gSpecialVar_0x8004)\n        {\n        case USING_SINGLE_BATTLE:\n            gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK;\n            break;\n        case USING_DOUBLE_BATTLE:\n            gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE;\n            break;\n        case USING_MULTI_BATTLE:\n            ReducePlayerPartyToThree();\n            gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI;\n            break;\n        }\n        CleanupOverworldWindowsAndTilemaps();\n        gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT;\n        SetMainCallback2(CB2_InitBattle);\n        gMain.savedCallback = CB2_ReturnFromCableClubBattle;\n        DestroyTask(taskId);\n        break;\n    }\n}\n\n#undef tTimer\n\nstatic void CB2_ReturnFromUnionRoomBattle(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        SetCloseLinkCallback();\n        gMain.state++;\n        break;\n    case 1:\n        if (IsLinkTaskFinished())\n            SetMainCallback2(CB2_ReturnToField);\n        break;\n    }\n}\n\nvoid CB2_ReturnFromCableClubBattle(void)\n{\n    gBattleTypeFlags &= (u16)~BATTLE_TYPE_LINK_IN_BATTLE;\n    Overworld_ResetMapMusic();\n    LoadPlayerParty();\n    SavePlayerBag();\n    Special_UpdateTrainerFansAfterLinkBattle();\n\n    if (gSpecialVar_0x8004 != USING_MULTI_BATTLE)\n    {\n        UpdatePlayerLinkBattleRecords(gLocalLinkPlayerId ^ 1);\n        if (gWirelessCommType != 0)\n        {\n            switch (gBattleOutcome)\n            {\n            case B_OUTCOME_WON:\n                MysteryGift_TryIncrementStat(CARD_STAT_BATTLES_WON, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);\n                break;\n            case B_OUTCOME_LOST:\n                MysteryGift_TryIncrementStat(CARD_STAT_BATTLES_LOST, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);\n                break;\n            }\n        }\n    }\n\n    if (InUnionRoom() == TRUE)\n        gMain.savedCallback = CB2_ReturnFromUnionRoomBattle;\n    else\n        gMain.savedCallback = CB2_ReturnToFieldFromMultiplayer;\n\n    SetMainCallback2(CB2_SetUpSaveAfterLinkBattle);\n}\n\nvoid CleanupLinkRoomState(void)\n{\n    if (gSpecialVar_0x8004 == USING_SINGLE_BATTLE\n     || gSpecialVar_0x8004 == USING_DOUBLE_BATTLE\n     || gSpecialVar_0x8004 == USING_MULTI_BATTLE)\n    {\n        LoadPlayerParty();\n        SavePlayerBag();\n    }\n    SetWarpDestinationToDynamicWarp(WARP_ID_DYNAMIC);\n}\n\nvoid ExitLinkRoom(void)\n{\n    QueueExitLinkRoomKey();\n}\n\n// Note: gSpecialVar_0x8005 contains the id of the seat the player entered\nstatic void Task_EnterCableClubSeat(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->tState)\n    {\n    case 0:\n        ShowFieldMessage(CableClub_Text_PleaseWaitBCancel);\n        task->tState = 1;\n        break;\n    case 1:\n        if (IsFieldMessageBoxHidden())\n        {\n            SetInCableClubSeat();\n            SetLocalLinkPlayerId(gSpecialVar_0x8005);\n            task->tState = 2;\n        }\n        break;\n    case 2:\n        switch (GetCableClubPartnersReady())\n        {\n        case CABLE_SEAT_WAITING:\n            break;\n        case CABLE_SEAT_SUCCESS:\n            // Partners linked and ready, switch to relevant link function\n            HideFieldMessageBox();\n            task->tState = 0;\n            SetStartedCableClubActivity();\n            SwitchTaskToFollowupFunc(taskId);\n            break;\n        case CABLE_SEAT_FAILED:\n            task->tState = 3;\n            break;\n        }\n        break;\n    case 3:\n        // Exit, failure\n        SetLinkWaitingForScript();\n        EraseFieldMessageBox(TRUE);\n        DestroyTask(taskId);\n        ScriptContext_Enable();\n        break;\n    }\n}\n\nstatic void CreateTask_EnterCableClubSeat(TaskFunc followUpFunc)\n{\n    u8 taskId = CreateTask(Task_EnterCableClubSeat, 80);\n    SetTaskFuncWithFollowupFunc(taskId, Task_EnterCableClubSeat, followUpFunc);\n    ScriptContext_Stop();\n}\n\nstatic void Task_StartWiredTrade(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->tState)\n    {\n    case 0:\n        LockPlayerFieldControls();\n        FadeScreen(FADE_TO_BLACK, 0);\n        ClearLinkCallback_2();\n        task->tState++;\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n            task->tState++;\n        break;\n    case 2:\n        gSelectedTradeMonPositions[TRADE_PLAYER] = 0;\n        gSelectedTradeMonPositions[TRADE_PARTNER] = 0;\n        m4aMPlayAllStop();\n        SetCloseLinkCallback();\n        task->tState++;\n        break;\n    case 3:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            SetMainCallback2(CB2_StartCreateTradeMenu);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void Task_StartWirelessTrade(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    switch (tState)\n    {\n    case 0:\n        LockPlayerFieldControls();\n        FadeScreen(FADE_TO_BLACK, 0);\n        ClearLinkRfuCallback();\n        tState++;\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n            tState++;\n        break;\n    case 2:\n        gSelectedTradeMonPositions[TRADE_PLAYER] = 0;\n        gSelectedTradeMonPositions[TRADE_PARTNER] = 0;\n        m4aMPlayAllStop();\n        SetLinkStandbyCallback();\n        tState++;\n        break;\n    case 3:\n        if (IsLinkTaskFinished())\n        {\n            CreateTask_CreateTradeMenu();\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nvoid EnterTradeSeat(void)\n{\n    if (gWirelessCommType)\n        CreateTask_EnterCableClubSeat(Task_StartWirelessTrade);\n    else\n        CreateTask_EnterCableClubSeat(Task_StartWiredTrade);\n}\n\nstatic void CreateTask_StartWiredTrade(void)\n{\n    CreateTask(Task_StartWiredTrade, 80);\n}\n\nvoid StartWiredCableClubTrade(void)\n{\n    CreateTask_StartWiredTrade();\n    ScriptContext_Stop();\n}\n\nvoid EnterColosseumPlayerSpot(void)\n{\n    gLinkType = LINKTYPE_BATTLE;\n    if (gWirelessCommType)\n        CreateTask_EnterCableClubSeat(Task_StartWirelessCableClubBattle);\n    else\n        CreateTask_EnterCableClubSeat(Task_StartWiredCableClubBattle);\n}\n\n// Unused\nstatic void CreateTask_EnterCableClubSeatNoFollowup(void)\n{\n    CreateTask(Task_EnterCableClubSeat, 80);\n    ScriptContext_Stop();\n}\n\nvoid Script_ShowLinkTrainerCard(void)\n{\n    ShowTrainerCardInLink(gSpecialVar_0x8006, CB2_ReturnToFieldContinueScriptPlayMapMusic);\n}\n\nbool32 GetSeeingLinkPlayerCardMsg(u8 linkPlayerIndex)\n{\n    u8 numStars;\n\n    gSpecialVar_0x8006 = linkPlayerIndex;\n    StringCopy(gStringVar1, gLinkPlayers[linkPlayerIndex].name);\n\n    numStars = GetTrainerCardStars(linkPlayerIndex);\n    if (numStars == 0)\n        return FALSE;\n\n    StringCopy(gStringVar2, sTrainerCardColorNames[numStars - 1]);\n    return TRUE;\n}\n\n#define tTimer data[0]\n\nvoid Task_WaitForLinkPlayerConnection(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    if (++task->tTimer > 300)\n    {\n        CloseLink();\n        SetMainCallback2(CB2_LinkError);\n        DestroyTask(taskId);\n    }\n\n    if (gReceivedRemoteLinkPlayers)\n        DestroyTask(taskId);\n}\n\n#undef tTimer\n\nstatic void Task_WaitExitToScript(u8 taskId)\n{\n    if (!gReceivedRemoteLinkPlayers)\n    {\n        ScriptContext_Enable();\n        DestroyTask(taskId);\n    }\n}\n\n// Unused\nstatic void ExitLinkToScript(u8 taskId)\n{\n    SetCloseLinkCallback();\n    gTasks[taskId].func = Task_WaitExitToScript;\n}\n"
  },
  {
    "path": "src/cereader_tool.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"util.h\"\n#include \"save.h\"\n#include \"cereader_tool.h\"\n\n#define SEC30_SIZE  (offsetof(struct EReaderTrainerTowerSet, floors[4]))\n#define SEC31_SIZE  (sizeof(struct EReaderTrainerTowerSet) - SEC30_SIZE)\n\n// The trainer tower data exceeds SECTOR_DATA_SIZE. They're allowed to use the full save sector up to the counter field.\nSTATIC_ASSERT(SEC30_SIZE + SEC31_SIZE <= SECTOR_COUNTER_OFFSET * 2, EReaderTrainerTowerSetFreeSpace);\n\nstatic u8 GetTrainerHillUnkVal(void)\n{\n    return (gSaveBlock1Ptr->trainerTower[0].unk9 + 1) % 256;\n}\n\nstatic bool32 ValidateTrainerTowerTrainer(struct TrainerTowerFloor * floor)\n{\n    if (floor->floorIdx < 1 || floor->floorIdx > MAX_TRAINER_TOWER_FLOORS)\n        return FALSE;\n    if (floor->challengeType > CHALLENGE_TYPE_KNOCKOUT)\n        return FALSE;\n    if (CalcByteArraySum((const u8 *)floor, offsetof(typeof(*floor), checksum)) != floor->checksum)\n        return FALSE;\n    return TRUE;\n}\n\nbool32 ValidateTrainerTowerData(struct EReaderTrainerTowerSet * ttdata)\n{\n    u32 numFloors = ttdata->numFloors;\n    s32 i;\n    if (numFloors < 1 || numFloors > MAX_TRAINER_TOWER_FLOORS)\n        return FALSE;\n    for (i = 0; i < numFloors; i++)\n    {\n        if (!ValidateTrainerTowerTrainer(&ttdata->floors[i]))\n            return FALSE;\n    }\n    if (CalcByteArraySum((const u8 *)ttdata->floors, numFloors * sizeof(ttdata->floors[0])) != ttdata->checksum)\n        return FALSE;\n    return TRUE;\n}\n\nstatic bool32 CEReaderTool_SaveTrainerTower_r(struct EReaderTrainerTowerSet * ttdata, u8 * buffer)\n{\n    AGB_ASSERT_EX(ttdata->dummy == 0, ABSPATH(\"cereader_tool.c\"), 198);\n    AGB_ASSERT_EX(ttdata->id == 0, ABSPATH(\"cereader_tool.c\"), 199)\n\n    memset(buffer, 0, SECTOR_SIZE);\n    memcpy(buffer, ttdata, SEC30_SIZE);\n    buffer[1] = GetTrainerHillUnkVal();\n    if (TryWriteSpecialSaveSector(SECTOR_ID_TRAINER_TOWER_1, buffer) != TRUE)\n        return FALSE;\n    memset(buffer, 0, SECTOR_SIZE);\n    memcpy(buffer, (u8 *)ttdata + SEC30_SIZE, SEC31_SIZE);\n    if (TryWriteSpecialSaveSector(SECTOR_ID_TRAINER_TOWER_2, buffer) != TRUE)\n        return FALSE;\n    return TRUE;\n}\n\nbool32 CEReaderTool_SaveTrainerTower(struct EReaderTrainerTowerSet * ttdata)\n{\n    u8 * buffer = AllocZeroed(SECTOR_SIZE);\n    bool32 result = CEReaderTool_SaveTrainerTower_r(ttdata, buffer);\n    Free(buffer);\n    return result;\n}\n\nstatic bool32 CEReaderTool_LoadTrainerTower_r(struct EReaderTrainerTowerSet * ttdata, void *buffer)\n{\n    if (TryReadSpecialSaveSector(SECTOR_ID_TRAINER_TOWER_1, buffer) != 1)\n        return FALSE;\n    memcpy(ttdata + 0x000, buffer, SEC30_SIZE);\n\n    if (TryReadSpecialSaveSector(SECTOR_ID_TRAINER_TOWER_2, buffer) != 1)\n        return FALSE;\n    memcpy((u8 *)ttdata + SEC30_SIZE, buffer, SEC31_SIZE);\n\n    if (!ValidateTrainerTowerData(ttdata))\n        return FALSE;\n    return TRUE;\n}\n\nbool32 CEReaderTool_LoadTrainerTower(struct EReaderTrainerTowerSet * ttdata)\n{\n    void *buffer = AllocZeroed(SECTOR_SIZE);\n    bool32 success = CEReaderTool_LoadTrainerTower_r(ttdata, buffer);\n    Free(buffer);\n    return success;\n}\n\nbool32 ReadTrainerTowerAndValidate(void)\n{\n    // Stubbed out. Populated in Emerald\n    return FALSE;\n}\n"
  },
  {
    "path": "src/clear_save_data_screen.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"menu.h\"\n#include \"save.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"text_window.h\"\n#include \"constants/songs.h\"\n\nstruct ClearSaveDataStruct {\n    u8 unk0;\n    u8 unk1;\n    u8 unk2;\n};\n\nstatic EWRAM_DATA struct ClearSaveDataStruct * sClearSaveDataState = NULL;\n\nstatic void Task_DrawClearSaveDataScreen(u8 taskId);\nstatic void Task_HandleYesNoMenu(u8 taskId);\nstatic void Task_CleanUpAndSoftReset(u8 taskId);\nstatic void CB2_Sub_SaveClearScreen_Init(void);\nstatic void SaveClearScreen_GpuInit(void);\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 5,\n        .width = 6,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x00A\n    }, {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 15,\n        .width = 23,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x022\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const u8 sTextColor[] = {\n    TEXT_COLOR_WHITE,\n    TEXT_COLOR_DARK_GRAY,\n    TEXT_COLOR_LIGHT_GRAY\n};\n\nstatic void CB2_RunClearSaveDataScreen(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB_WaitYesNo(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid CB2_SaveClearScreen_Init(void)\n{\n    sClearSaveDataState = AllocZeroed(sizeof(struct ClearSaveDataStruct));\n    sClearSaveDataState->unk1 = 0;\n    sClearSaveDataState->unk0 = 0;\n    sClearSaveDataState->unk2 = 0;\n    CB2_Sub_SaveClearScreen_Init();\n    CreateTask(Task_DrawClearSaveDataScreen, 0);\n    SetMainCallback2(CB2_RunClearSaveDataScreen);\n}\n\nstatic void Task_DrawClearSaveDataScreen(u8 taskId)\n{\n    switch (sClearSaveDataState->unk1)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        break;\n    case 1:\n        if (gPaletteFade.active)\n            return;\n        SetVBlankCallback(NULL);\n        break;\n    case 2:\n        SaveClearScreen_GpuInit();\n        break;\n    case 3:\n        LoadStdWindowGfx(0, 0x001, BG_PLTT_ID(15));\n        LoadStdWindowGfx(1, 0x001, BG_PLTT_ID(15));\n        break;\n    case 4:\n        DrawStdFrameWithCustomTileAndPalette(1, TRUE, 0x001, 15);\n        AddTextPrinterParameterized4(1, FONT_NORMAL, 0, 3, 1, 1, sTextColor, 0, gText_ClearAllSaveData);\n        CopyWindowToVram(1, COPYWIN_GFX);\n        break;\n    case 5:\n        CreateYesNoMenu(&sWindowTemplates[0], FONT_NORMAL, 0, 2, 0x001, 15, 1);\n        CopyBgTilemapBufferToVram(0);\n        break;\n    default:\n        BeginNormalPaletteFade(0xFFFF, 0, 16, 0, RGB_WHITEALPHA);\n        SetVBlankCallback(VBlankCB_WaitYesNo);\n        gTasks[taskId].func = Task_HandleYesNoMenu;\n        break;\n    }\n    sClearSaveDataState->unk1++;\n}\n\nstatic void Task_HandleYesNoMenu(u8 taskId)\n{\n    // agbcc refuses to keep &sClearSaveDataState in a register\n    // unless explicitly told to do so as such:\n    struct ClearSaveDataStruct ** r5 = &sClearSaveDataState;\n    if ((*r5)->unk0 == 0)\n    {\n        switch (Menu_ProcessInputNoWrapClearOnChoose())\n        {\n        case MENU_B_PRESSED:\n        case 1:\n            PlaySE(SE_SELECT);\n            break;\n        case 0:\n            PlaySE(SE_SELECT);\n            FillWindowPixelBuffer(1, PIXEL_FILL(1));\n            AddTextPrinterParameterized4(1, FONT_NORMAL, 0, 3, 1, 1, sTextColor, 0, gText_ClearingData);\n            CopyWindowToVram(1, COPYWIN_FULL);\n            ClearSaveData();\n            break;\n        case MENU_NOTHING_CHOSEN:\n        default:\n            return;\n        }\n        (*r5)->unk0++;\n    }\n    else\n    {\n        Task_CleanUpAndSoftReset(taskId);\n    }\n}\n\nstatic void Task_CleanUpAndSoftReset(u8 taskId)\n{\n    switch (sClearSaveDataState->unk2)\n    {\n    case 0:\n        BeginNormalPaletteFade(0xFFFF, 0, 0, 16, RGB_WHITEALPHA);\n        sClearSaveDataState->unk2++;\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n        {\n            DestroyYesNoMenu();\n            DestroyTask(taskId);\n            FreeAllWindowBuffers();\n            FREE_AND_SET_NULL(sClearSaveDataState);\n            DoSoftReset();\n            // noreturn\n        }\n        break;\n    }\n}\n\nstatic void CB2_Sub_SaveClearScreen_Init(void)\n{\n    ResetSpriteData();\n    ResetPaletteFade();\n    ResetTasks();\n}\n\nstatic void SaveClearScreen_GpuInit(void)\n{\n    DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);\n    DmaClear32(3, (void *)OAM, OAM_SIZE);\n    DmaClear16(3, (void *)PLTT, PLTT_SIZE);\n\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n    InitWindows(sWindowTemplates);\n    DeactivateAllTextPrinters();\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n    ShowBg(0);\n}\n"
  },
  {
    "path": "src/coins.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"string_util.h\"\n#include \"menu.h\"\n#include \"text_window.h\"\n#include \"strings.h\"\n#include \"constants/coins.h\"\n\nEWRAM_DATA static u8 sCoinsWindowId = 0;\n\nu16 GetCoins(void)\n{\n    return gSaveBlock1Ptr->coins ^ gSaveBlock2Ptr->encryptionKey;\n}\n\nvoid SetCoins(u16 coinAmount)\n{\n    gSaveBlock1Ptr->coins = coinAmount ^ gSaveBlock2Ptr->encryptionKey;\n}\n\nbool8 AddCoins(u16 toAdd)\n{\n    u16 coins = GetCoins();\n    if (coins >= MAX_COINS)\n        return FALSE;\n    // check overflow, can't have less coins than previously\n    if (coins <= coins + toAdd)\n    {\n        coins += toAdd;\n        if (coins > MAX_COINS)\n            coins = MAX_COINS;\n    }\n    else\n    {\n        coins = MAX_COINS;\n    }\n    SetCoins(coins);\n    return TRUE;\n}\n\nbool8 RemoveCoins(u16 toSub)\n{\n    u16 coins = GetCoins();\n    if (coins >= toSub)\n    {\n        SetCoins(coins - toSub);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void PrintCoinsString_Parameterized(u8 windowId, u32 coinAmount, u8 x, u8 y, u8 speed)\n{\n    ConvertIntToDecimalStringN(gStringVar1, coinAmount, STR_CONV_MODE_RIGHT_ALIGN, 4);\n    StringExpandPlaceholders(gStringVar4, gText_Coins);\n    AddTextPrinterParameterized(windowId, FONT_SMALL, gStringVar4, x, y, speed, NULL);\n}\n\n// Unused\nstatic void ShowCoinsWindow_Parameterized(u8 windowId, u16 tileStart, u8 palette, u32 coinAmount)\n{\n    DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, tileStart, palette);\n    AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_Coins_2, 0, 0, 0xFF, 0);\n    PrintCoinsString_Parameterized(windowId, coinAmount, 0x10, 0xC, 0);\n}\n\nvoid PrintCoinsString(u32 coinAmount)\n{\n    u8 windowId;\n    int width;\n\n    ConvertIntToDecimalStringN(gStringVar1, coinAmount, STR_CONV_MODE_RIGHT_ALIGN, 4);\n    StringExpandPlaceholders(gStringVar4, gText_Coins);\n    width = GetStringWidth(FONT_SMALL, gStringVar4, 0);\n    windowId = sCoinsWindowId;\n    AddTextPrinterParameterized(windowId, FONT_SMALL, gStringVar4, 64 - width, 0xC, 0, NULL);\n}\n\nvoid ShowCoinsWindow(u32 coinAmount, u8 x, u8 y)\n{\n    struct WindowTemplate template;\n\n    template = SetWindowTemplateFields(0, x + 1, y + 1, 8, 3, 0xF, 0x20);\n    sCoinsWindowId = AddWindow(&template);\n    FillWindowPixelBuffer(sCoinsWindowId, 0);\n    PutWindowTilemap(sCoinsWindowId);\n    LoadStdWindowGfx(sCoinsWindowId, 0x21D, BG_PLTT_ID(13));\n    DrawStdFrameWithCustomTileAndPalette(sCoinsWindowId, FALSE, 0x21D, 13);\n    AddTextPrinterParameterized(sCoinsWindowId, FONT_NORMAL, gText_Coins_2, 0, 0, 0xFF, 0);\n    PrintCoinsString(coinAmount);\n}\n\nvoid HideCoinsWindow(void)\n{\n    ClearWindowTilemap(sCoinsWindowId);\n    ClearStdWindowAndFrameToTransparent(sCoinsWindowId, TRUE);\n    RemoveWindow(sCoinsWindowId);\n}\n"
  },
  {
    "path": "src/coord_event_weather.c",
    "content": "#include \"global.h\"\n#include \"constants/weather.h\"\n\n// These were all dummied out because it's always sunny in Viridian\nvoid WeatherCoordEvent_SunnyClouds(void) {}\nvoid WeatherCoordEvent_Sunny(void) {}\nvoid WeatherCoordEvent_Rain(void) {}\nvoid WeatherCoordEvent_Snow(void) {}\nvoid WeatherCoordEvent_RainThunderstorm(void) {}\nvoid WeatherCoordEvent_FogHorizontal(void) {}\nvoid WeatherCoordEvent_VolcanicAsh(void) {}\nvoid WeatherCoordEvent_Sandstorm(void) {}\nvoid WeatherCoordEvent_FogDiagonal(void) {}\nvoid WeatherCoordEvent_Underwater(void) {}\nvoid WeatherCoordEvent_Shade(void) {}\nvoid WeatherCoordEvent_Route119Cycle(void) {}\nvoid WeatherCoordEvent_Route123Cycle(void) {}\n\nstatic struct {\n    u8 weatherId;\n    void (*callback)(void);\n} const sWeatherCoordEventFuncs[] = {\n    {WEATHER_SUNNY_CLOUDS,      WeatherCoordEvent_SunnyClouds     },\n    {WEATHER_SUNNY,             WeatherCoordEvent_Sunny           },\n    {WEATHER_RAIN,              WeatherCoordEvent_Rain            },\n    {WEATHER_SNOW,              WeatherCoordEvent_Snow            },\n    {WEATHER_RAIN_THUNDERSTORM, WeatherCoordEvent_RainThunderstorm},\n    {WEATHER_FOG_HORIZONTAL,    WeatherCoordEvent_FogHorizontal   },\n    {WEATHER_VOLCANIC_ASH,      WeatherCoordEvent_VolcanicAsh     },\n    {WEATHER_SANDSTORM,         WeatherCoordEvent_Sandstorm       },\n    {WEATHER_FOG_DIAGONAL,      WeatherCoordEvent_FogDiagonal     },\n    {WEATHER_UNDERWATER,        WeatherCoordEvent_Underwater      },\n    {WEATHER_SHADE,             WeatherCoordEvent_Shade           },\n    {WEATHER_ROUTE119_CYCLE,    WeatherCoordEvent_Route119Cycle   },\n    {WEATHER_ROUTE123_CYCLE,    WeatherCoordEvent_Route123Cycle   }\n};\n\nvoid DoCoordEventWeather(u8 weatherId)\n{\n    u32 i;\n    for (i = 0; i < NELEMS(sWeatherCoordEventFuncs); i++)\n    {\n        if (sWeatherCoordEventFuncs[i].weatherId == weatherId)\n        {\n            sWeatherCoordEventFuncs[i].callback();\n            return;\n        }\n    }\n}\n"
  },
  {
    "path": "src/credits.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"credits.h\"\n#include \"task.h\"\n#include \"overworld.h\"\n#include \"event_data.h\"\n#include \"new_menu_helpers.h\"\n#include \"decompress.h\"\n#include \"graphics.h\"\n#include \"strings.h\"\n#include \"trainer_pokemon_sprites.h\"\n#include \"menu.h\"\n#include \"field_weather.h\"\n#include \"quest_log.h\"\n#include \"constants/maps.h\"\n#include \"constants/field_weather.h\"\n#include \"constants/sound.h\"\n\nenum CreditsSceneIdx\n{\n    CREDITSSCENE_INIT_WIN0 = 0,\n    CREDITSSCENE_SETUP_DARKEN_EFFECT,\n    CREDITSSCENE_OPEN_WIN0,\n    CREDITSSCENE_LOAD_PLAYER_SPRITE_AT_INDIGO,\n    CREDITSSCENE_PRINT_TITLE_STAFF,\n    CREDITSSCENE_WAIT_TITLE_STAFF,\n    CREDITSSCENE_EXEC_CMD,\n    CREDITSSCENE_PRINT_ADDPRINTER1,\n    CREDITSSCENE_PRINT_ADDPRINTER2,\n    CREDITSSCENE_PRINT_DELAY,\n    CREDITSSCENE_MAPNEXT_DESTROYWINDOW,\n    CREDITSSCENE_MAPNEXT_LOADMAP,\n    CREDITSSCENE_MAP_LOADMAP_CREATESPRITES,\n    CREDITSSCENE_MON_DESTROY_ASSETS,\n    CREDITSSCENE_MON_SHOW,\n    CREDITSSCENE_THEEND_DESTROY_ASSETS,\n    CREDITSSCENE_THEEND_SHOW,\n    CREDITSSCENE_WAITBUTTON,\n    CREDITSSCENE_TERMINATE,\n};\n\nenum CreditsScrCmd\n{\n    CREDITSSCRCMD_PRINT = 0,\n    CREDITSSCRCMD_MAPNEXT,\n    CREDITSSCRCMD_MAP,\n    CREDITSSCRCMD_MON,\n    CREDITSSCRCMD_THEENDGFX,\n    CREDITSSCRCMD_WAITBUTTON\n};\n\nenum CreditsMon\n{\n    CREDITSMON_CHARIZARD = 0,\n    CREDITSMON_VENUSAUR,\n    CREDITSMON_BLASTOISE,\n    CREDITSMON_PIKACHU\n};\n\nenum CreditsClosingText\n{\n    CREDITSCLOSING_ALLRIGHTSRESERVED = 0,\n    CREDITSCLOSING_THEEND\n};\n\nenum CreditsString\n{\n    CREDITS_STRING_DIRECTOR = 0,\n    CREDITS_STRING_ART_DIRECTOR_BATTLE_DIRECTOR,\n    CREDITS_STRING_PROGRAM_LEADER_PLANNING_LEADER_GRAPHIC_DESIGN_LEADER,\n    CREDITS_STRING_PROGRAMMERS,\n    CREDITS_STRING_SYSTEM_PROGRAMMERS,\n    CREDITS_STRING_GRAPHIC_DESIGNERS,\n    CREDITS_STRING_GRAPHIC_DESIGNERS_2,\n    CREDITS_STRING_MUSIC_COMPOSITION,\n    CREDITS_STRING_SOUND_EFFECTS,\n    CREDITS_STRING_GAME_DESIGNERS,\n    CREDITS_STRING_GAME_DESIGNERS_2,\n    CREDITS_STRING_GAME_SCENARIO,\n    CREDITS_STRING_SCRIPT_DESIGNER_MAP_DESIGNER,\n    CREDITS_STRING_PARAMETRIC_DESIGNERS,\n    CREDITS_STRING_POKEDEX_TEXT,\n    CREDITS_STRING_POKEMON_DESIGNERS,\n    CREDITS_STRING_POKEMON_DESIGNERS_2,\n    CREDITS_STRING_POKEMON_DESIGNERS_3,\n    CREDITS_STRING_SUPPORTING_PROGRAMMERS,\n    CREDITS_STRING_NCL_PRODUCT_TESTING,\n    CREDITS_STRING_SPECIAL_THANKS,\n    CREDITS_STRING_SPECIAL_THANKS_2,\n    CREDITS_STRING_SPECIAL_THANKS_3,\n    CREDITS_STRING_BRAILLE_CODE_CHECK,\n    CREDITS_STRING_INFORMATION_SUPERVISORS,\n    CREDITS_STRING_COORDINATORS,\n    CREDITS_STRING_TASK_MANAGERS,\n    CREDITS_STRING_PRODUCERS,\n    CREDITS_STRING_EXECUTIVE_DIRECTOR,\n    CREDITS_STRING_EXECUTIVE_PRODUCER,\n    CREDITS_STRING_EXECUTIVE_PRODUCER_2,\n    CREDITS_STRING_ENGLISH_VERSION_COORDINATORS,\n    CREDITS_STRING_TRANSLATOR_TEXT_EDITOR,\n    CREDITS_STRING_PROGRAMMERS_2,\n    CREDITS_STRING_ENVIRONMENT_TOOL_PROGRAMMERS,\n    CREDITS_STRING_NOA_PRODUCT_TESTING,\n    CREDITS_STRING_BRAILLE_CODE_CHECK_2,\n    CREDITS_STRING_BRAILLE_CODE_CHECK_3,\n    CREDITS_STRING_SPECIAL_THANKS_4,\n    CREDITS_STRING_SPECIAL_THANKS_5,\n    CREDITS_STRING_BRAILLE_CODE_CHECK_4,\n    CREDITS_STRING_GRAPHIC_DESIGNER,\n    CREDITS_STRING_DUMMY\n};\n\nenum CreditsMap\n{\n    CREDITS_MAP_ROUTE23 = 0,\n    CREDITS_MAP_VIRIDIAN_CITY,\n    CREDITS_MAP_PEWTER_CITY,\n    CREDITS_MAP_CERULEAN_CITY,\n    CREDITS_MAP_ROUTE25,\n    CREDITS_MAP_VERMILION_CITY,\n    CREDITS_MAP_ROUTE10,\n    CREDITS_MAP_CELADON_CITY,\n    CREDITS_MAP_SAFFRON_CITY,\n    CREDITS_MAP_ROUTE17,\n    CREDITS_MAP_FUCHSIA_CITY,\n    CREDITS_MAP_CINNABAR_ISLAND,\n    CREDITS_MAP_ROUTE21_NORTH\n};\n\nenum {\n    GFXTAG_CHARACTER = 0x2000, // Player/Rival\n    GFXTAG_GROUND,\n};\n\nstruct CreditsResources\n{\n    u8 mainseqno;\n    u8 subseqno;\n    u8 taskId;\n    u16 timer;\n    u16 scrcmdidx;\n    bool8 canSpeedThrough;\n    u8 whichMon;\n    u8 windowId;\n    bool8 windowIsActive;\n    u16 creditsMonTimer;\n    u16 unk_0E;\n    u8 filler_10[12];\n    u8 ovwldseqno;\n    u8 unk_1D;\n};\n\nstruct CreditsScrcmd\n{\n    u8 cmd;\n    u8 param;\n    u16 duration;\n};\n\nstruct CreditsTextHeader\n{\n    const u8 * title;\n    const u8 * names;\n    bool8 unused;\n};\n\nstruct CompressedGraphicsHeader\n{\n    const u8 * tiles;\n    const u8 * map;\n    const u16 * palette;\n};\n\nstruct CreditsTaskData\n{\n    u8 spriteMoveCmd;\n    u8 characterSpriteId; // Player or rival\n    u16 characterTilesTag;\n    u16 characterPalTag;\n    u8 groundSpriteId;\n    u16 groundTilesTag;\n    u16 groundPalTag;\n};\n\nstatic EWRAM_DATA struct CreditsResources * sCreditsMgr = NULL;\nEWRAM_DATA bool8 gHasHallOfFameRecords = FALSE;\n\nstatic void CB2_Credits(void);\nstatic s32 RollCredits(void);\nstatic bool32 DoCreditsMonScene(void);\nstatic bool32 DoCopyrightOrTheEndGfxScene(void);\nstatic void DestroyPlayerOrRivalSprite(void);\nstatic void LoadPlayerOrRivalSprite(u8 a0);\n\nstatic const struct BgTemplate sBgTemplates_MonSceneOrTheEnd[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 15,\n        .screenSize = 0,\n        .paletteMode = FALSE,\n        .priority = 0,\n        .baseTile = 0x0\n    }, {\n        .bg = 1,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 23,\n        .screenSize = 0,\n        .paletteMode = FALSE,\n        .priority = 1,\n        .baseTile = 0x0\n    }, {\n        .bg = 2,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 31,\n        .screenSize = 1,\n        .paletteMode = TRUE,\n        .priority = 2,\n        .baseTile = 0x0\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates_Charizard[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 6,\n        .width = 8,\n        .height = 8,\n        .paletteNum = 10,\n        .baseBlock = 0x0008\n    }, {\n        .bg = 0,\n        .tilemapLeft = 10,\n        .tilemapTop = 5,\n        .width = 10,\n        .height = 10,\n        .paletteNum = 10,\n        .baseBlock = 0x0048\n    }, {\n        .bg = 0,\n        .tilemapLeft = 9,\n        .tilemapTop = 3,\n        .width = 12,\n        .height = 13,\n        .paletteNum = 10,\n        .baseBlock = 0x00ac\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sWindowTemplates_Venusaur[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 6,\n        .width = 8,\n        .height = 8,\n        .paletteNum = 10,\n        .baseBlock = 0x0008\n    }, {\n        .bg = 0,\n        .tilemapLeft = 10,\n        .tilemapTop = 5,\n        .width = 10,\n        .height = 10,\n        .paletteNum = 10,\n        .baseBlock = 0x0048\n    }, {\n        .bg = 0,\n        .tilemapLeft = 9,\n        .tilemapTop = 5,\n        .width = 12,\n        .height = 10,\n        .paletteNum = 10,\n        .baseBlock = 0x00ac\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sWindowTemplates_Blastoise[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 6,\n        .width = 8,\n        .height = 8,\n        .paletteNum = 10,\n        .baseBlock = 0x0008\n    }, {\n        .bg = 0,\n        .tilemapLeft = 10,\n        .tilemapTop = 5,\n        .width = 10,\n        .height = 10,\n        .paletteNum = 10,\n        .baseBlock = 0x0048\n    }, {\n        .bg = 0,\n        .tilemapLeft = 10,\n        .tilemapTop = 4,\n        .width = 10,\n        .height = 12,\n        .paletteNum = 10,\n        .baseBlock = 0x00ac\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sWindowTemplates_Pikachu[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 6,\n        .width = 8,\n        .height = 8,\n        .paletteNum = 10,\n        .baseBlock = 0x0008\n    }, {\n        .bg = 0,\n        .tilemapLeft = 10,\n        .tilemapTop = 5,\n        .width = 10,\n        .height = 10,\n        .paletteNum = 10,\n        .baseBlock = 0x0048\n    }, {\n        .bg = 0,\n        .tilemapLeft = 9,\n        .tilemapTop = 4,\n        .width = 12,\n        .height = 12,\n        .paletteNum = 10,\n        .baseBlock = 0x00ac\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const u16 sCreditsMonCircle_Pal[] = INCBIN_U16(\"graphics/credits/white_circle.gbapal\");\nstatic const u32 sCreditsMonCircle_Tiles[] = INCBIN_U32(\"graphics/credits/white_circle.8bpp.lz\");\nstatic const u32 sCreditsMonCircle_Tilemap[] = INCBIN_U32(\"graphics/credits/white_circle.bin.lz\");\n\nstatic const u32 sCharizard1_Tiles[] = INCBIN_U32(\"graphics/credits/charizard_1.4bpp.lz\");\nstatic const u32 sCharizard2_Tiles[] = INCBIN_U32(\"graphics/credits/charizard_2.4bpp.lz\");\n\nstatic const u32 sVenusaurUnused_Tiles[] = INCBIN_U32(\"graphics/credits/venusaur_unused.4bpp.lz\");\nstatic const u32 sVenusaur1_Tiles[] = INCBIN_U32(\"graphics/credits/venusaur_1.4bpp.lz\");\nstatic const u32 sVenusaur2_Tiles[] = INCBIN_U32(\"graphics/credits/venusaur_2.4bpp.lz\");\n\nstatic const u32 sBlastoise1_Tiles[] = INCBIN_U32(\"graphics/credits/blastoise_1.4bpp.lz\");\nstatic const u32 sBlastoise2_Tiles[] = INCBIN_U32(\"graphics/credits/blastoise_2.4bpp.lz\");\n\nstatic const u32 sPikachu1_Tiles[] = INCBIN_U32(\"graphics/credits/pikachu_1.4bpp.lz\");\nstatic const u32 sPikachu2_Tiles[] = INCBIN_U32(\"graphics/credits/pikachu_2.4bpp.lz\");\n\nstatic const u32 sUnused = 0xF0;\n\nstatic const u16 sTheEnd_Pal[] = INCBIN_U16(\"graphics/credits/the_end.gbapal\");\nstatic const u8 sTheEnd_Tiles[] = INCBIN_U8(\"graphics/credits/the_end.4bpp.lz\");\nstatic const u8 sTheEnd_Tilemap[] = INCBIN_U8(\"graphics/credits/the_end.bin.lz\");\n\nstatic const struct CompressedGraphicsHeader sCopyrightOrTheEndGfxHeaders[] = {\n    {\n        .tiles = gCreditsCopyright_Tiles,\n        .map = gCreditsCopyright_Tilemap,\n        .palette = gCreditsCopyright_Pal\n    }, {\n        .tiles = sTheEnd_Tiles,\n        .map = sTheEnd_Tilemap,\n        .palette = sTheEnd_Pal\n    }\n};\n\n#define CREDITS_PRINT(text, duration) { CREDITSSCRCMD_PRINT, CREDITS_STRING_##text, duration }\n#define CREDITS_MAPNEXT(map, duration) { CREDITSSCRCMD_MAPNEXT, CREDITS_MAP_##map, duration }\n#define CREDITS_MAP(map, duration) { CREDITSSCRCMD_MAP, CREDITS_MAP_##map, duration }\n#define CREDITS_MON(mon) { CREDITSSCRCMD_MON, CREDITSMON_##mon }\n#define CREDITS_THEENDGFX(idx, duration) { CREDITSSCRCMD_THEENDGFX, CREDITSCLOSING_##idx, duration }\n#define CREDITS_WAITBUTTON(time) { CREDITSSCRCMD_WAITBUTTON, .duration = time }\n\nstatic const struct CreditsScrcmd sCreditsScript[] = {\n    CREDITS_MAPNEXT(ROUTE23, 16),\n    CREDITS_PRINT(DIRECTOR, 300),\n    CREDITS_PRINT(ART_DIRECTOR_BATTLE_DIRECTOR, 300),\n    CREDITS_PRINT(PROGRAM_LEADER_PLANNING_LEADER_GRAPHIC_DESIGN_LEADER, 300),\n    CREDITS_PRINT(DUMMY, 60),\n    CREDITS_MAPNEXT(VIRIDIAN_CITY, 0),\n    CREDITS_PRINT(PROGRAMMERS, 211),\n    CREDITS_PRINT(SYSTEM_PROGRAMMERS, 211),\n    CREDITS_PRINT(GRAPHIC_DESIGNERS, 211),\n    CREDITS_MAPNEXT(PEWTER_CITY, 0),\n    CREDITS_PRINT(GRAPHIC_DESIGNERS_2, 211),\n    CREDITS_PRINT(MUSIC_COMPOSITION, 210),\n    CREDITS_PRINT(SOUND_EFFECTS, 210),\n    CREDITS_MON(CHARIZARD),\n    CREDITS_MAP(CERULEAN_CITY, 16),\n    CREDITS_PRINT(GAME_DESIGNERS, 211),\n    CREDITS_PRINT(GAME_DESIGNERS_2, 210),\n    CREDITS_PRINT(GAME_SCENARIO, 210),\n    CREDITS_MAPNEXT(ROUTE25, 16),\n    CREDITS_PRINT(SCRIPT_DESIGNER_MAP_DESIGNER, 211),\n    CREDITS_PRINT(PARAMETRIC_DESIGNERS, 210),\n    CREDITS_PRINT(POKEDEX_TEXT, 210),\n    CREDITS_MAPNEXT(VERMILION_CITY, 16),\n    CREDITS_PRINT(POKEMON_DESIGNERS, 211),\n    CREDITS_PRINT(POKEMON_DESIGNERS_2, 210),\n    CREDITS_PRINT(POKEMON_DESIGNERS_3, 210),\n    CREDITS_MON(VENUSAUR),\n    CREDITS_MAP(ROUTE10, 16),\n    CREDITS_PRINT(SUPPORTING_PROGRAMMERS, 211),\n    CREDITS_PRINT(NCL_PRODUCT_TESTING, 210),\n    CREDITS_PRINT(SPECIAL_THANKS, 210),\n    CREDITS_MAPNEXT(CELADON_CITY, 16),\n    CREDITS_PRINT(SPECIAL_THANKS_2, 221),\n    CREDITS_PRINT(SPECIAL_THANKS_3, 221),\n    CREDITS_PRINT(BRAILLE_CODE_CHECK, 221),\n    CREDITS_PRINT(INFORMATION_SUPERVISORS, 221),\n    CREDITS_PRINT(DUMMY, 51),\n    CREDITS_MAPNEXT(SAFFRON_CITY, 16),\n    CREDITS_PRINT(COORDINATORS, 211),\n    CREDITS_PRINT(TASK_MANAGERS, 210),\n    CREDITS_PRINT(PRODUCERS, 210),\n    CREDITS_MON(BLASTOISE),\n    CREDITS_MAP(ROUTE17, 16),\n    CREDITS_PRINT(EXECUTIVE_DIRECTOR, 331),\n    CREDITS_PRINT(EXECUTIVE_PRODUCER, 331),\n    CREDITS_PRINT(EXECUTIVE_PRODUCER_2, 331),\n    CREDITS_MAPNEXT(FUCHSIA_CITY, 16),\n    CREDITS_PRINT(ENGLISH_VERSION_COORDINATORS, 221),\n    CREDITS_PRINT(TRANSLATOR_TEXT_EDITOR, 221),\n    CREDITS_PRINT(PROGRAMMERS_2, 221),\n    CREDITS_PRINT(ENVIRONMENT_TOOL_PROGRAMMERS, 221),\n    CREDITS_PRINT(DUMMY, 52),\n    CREDITS_MAPNEXT(CINNABAR_ISLAND, 16),\n    CREDITS_PRINT(GRAPHIC_DESIGNER, 210),\n    CREDITS_PRINT(NOA_PRODUCT_TESTING, 210),\n    CREDITS_PRINT(BRAILLE_CODE_CHECK_2, 211),\n    CREDITS_MON(PIKACHU),\n    CREDITS_MAP(ROUTE21_NORTH, 16),\n    CREDITS_PRINT(BRAILLE_CODE_CHECK_3, 221),\n    CREDITS_PRINT(BRAILLE_CODE_CHECK_4, 221),\n    CREDITS_PRINT(SPECIAL_THANKS_4, 221),\n    CREDITS_PRINT(SPECIAL_THANKS_5, 221),\n    CREDITS_PRINT(DUMMY, 52),\n    CREDITS_THEENDGFX(ALLRIGHTSRESERVED, 224),\n    CREDITS_THEENDGFX(THEEND, 240),\n    CREDITS_WAITBUTTON(600)\n};\n\nstatic const ALIGNED(4) u8 sTextColor_Unused[3] = {0, 1, 2};\nstatic const ALIGNED(4) u8 sTextColor_Header[3] = {0, 5, 2};\nstatic const ALIGNED(4) u8 sTextColor_Regular[3] = {0, 1, 2};\n\nstatic const struct WindowTemplate sCreditsWindowTemplate = {\n    .bg = 0,\n    .tilemapLeft = 0,\n    .tilemapTop = 4,\n    .width = 30,\n    .height = 12,\n    .paletteNum = 15,\n    .baseBlock = 0x008\n};\n\nstatic const u16 sPlayerMale_Pal[]     = INCBIN_U16(\"graphics/credits/player_male.gbapal\");\nstatic const u32 sPlayerMale_Tiles[]   = INCBIN_U32(\"graphics/credits/player_male.4bpp.lz\");\nstatic const u16 sPlayerFemale_Pal[]   = INCBIN_U16(\"graphics/credits/player_female.gbapal\");\nstatic const u32 sPlayerFemale_Tiles[] = INCBIN_U32(\"graphics/credits/player_female.4bpp.lz\");\nstatic const u16 sRival_Pal[]          = INCBIN_U16(\"graphics/credits/rival.gbapal\");\nstatic const u32 sRival_Tiles[]        = INCBIN_U32(\"graphics/credits/rival.4bpp.lz\");\nstatic const u16 sGround_Grass_Pal[]   = INCBIN_U16(\"graphics/credits/ground_grass.gbapal\");\nstatic const u32 sGround_Grass_Tiles[] = INCBIN_U32(\"graphics/credits/ground_grass.4bpp.lz\");\nstatic const u16 sGround_Dirt_Pal[]    = INCBIN_U16(\"graphics/credits/ground_dirt.gbapal\");\nstatic const u32 sGround_Dirt_Tiles[]  = INCBIN_U32(\"graphics/credits/ground_dirt.4bpp.lz\");\nstatic const u16 sGround_City_Pal[]    = INCBIN_U16(\"graphics/credits/ground_city.gbapal\");\nstatic const u32 sGround_City_Tiles[]  = INCBIN_U32(\"graphics/credits/ground_city.4bpp.lz\");\n\nstatic const u16 sPlayerRivalSpriteParams[][3] = {\n    { 0, 3, 1 },\n    { 0, 2, 0 },\n    { 0, 3, 0 },\n    { 1, 1, 2 },\n    { 0, 0, 3 }\n};\n\nstatic const struct OamData sOamData_PlayerOrRival = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .mosaic = FALSE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = ST_OAM_SQUARE,\n    .size = ST_OAM_SIZE_3,\n    .tileNum = 0x000,\n    .priority = 0,\n    .paletteNum = 15\n};\n\nconst union AnimCmd sAnimCmds_PlayerOrRival[] = {\n    ANIMCMD_FRAME(0x000, 8),\n    ANIMCMD_FRAME(0x040, 8),\n    ANIMCMD_FRAME(0x080, 8),\n    ANIMCMD_FRAME(0x0C0, 8),\n    ANIMCMD_FRAME(0x100, 8),\n    ANIMCMD_FRAME(0x140, 8),\n    ANIMCMD_JUMP(0)\n};\n\nconst union AnimCmd *const sAnimCmdTable_PlayerOrRival[] = {\n    sAnimCmds_PlayerOrRival\n};\n\nstatic const struct SpriteTemplate sPlayerOrRivalSpriteTemplate = {\n    .oam = &sOamData_PlayerOrRival,\n    .anims = sAnimCmdTable_PlayerOrRival,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_Ground = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .mosaic = FALSE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = ST_OAM_H_RECTANGLE,\n    .size = ST_OAM_SIZE_3,\n    .tileNum = 0x000,\n    .priority = 0,\n    .paletteNum = 14\n};\n\nconst union AnimCmd sAnimCmds_GroundRunning[] = {\n    ANIMCMD_FRAME(0x00, 8),\n    ANIMCMD_FRAME(0x20, 8),\n    ANIMCMD_FRAME(0x40, 8),\n    ANIMCMD_FRAME(0x60, 8),\n    ANIMCMD_FRAME(0x80, 8),\n    ANIMCMD_FRAME(0xA0, 8),\n    ANIMCMD_FRAME(0xC0, 8),\n    ANIMCMD_FRAME(0xE0, 8),\n    ANIMCMD_JUMP(0)\n};\n\nconst union AnimCmd sAnimCmds_GroundStatic[] = {\n    ANIMCMD_FRAME(0x00, 8),\n    ANIMCMD_JUMP(0)\n};\n\nconst union AnimCmd *const sAnimCmdTable_GroundRunning[] = {\n    sAnimCmds_GroundRunning\n};\n\nconst union AnimCmd *const sAnimCmdTable_GroundStatic[] = {\n    sAnimCmds_GroundStatic\n};\n\nstatic const struct SpriteTemplate sGroundSpriteTemplate_Running = {\n    .oam = &sOamData_Ground,\n    .anims = sAnimCmdTable_GroundRunning,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sGroundSpriteTemplate_Static = {\n    .oam = &sOamData_Ground,\n    .anims = sAnimCmdTable_GroundStatic,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_Route23[] = {\n    CREDITSOVWLDLOADMAP(ROUTE23, 11, 107, 1),\n    CREDITSOVWLDSCROLL(0, 1, 0x0500), // Scroll down\n    CREDITSOVWLDEND\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_ViridianCity[] = {\n    CREDITSOVWLDLOADMAP(VIRIDIAN_CITY, 30, 34, 1),\n    CREDITSOVWLDSCROLL(0, -1, 0x0500), // Scroll up\n    CREDITSOVWLDEND\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_PewterCity[] = {\n    CREDITSOVWLDLOADMAP(PEWTER_CITY, 20, 26, 1),\n    CREDITSOVWLDSCROLL(0, -1, 0x0500), // Scroll up\n    CREDITSOVWLDEND\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_CeruleanCity[] = {\n    CREDITSOVWLDLOADMAP(CERULEAN_CITY, 8, 6, 1),\n    CREDITSOVWLDSCROLL(1, 1, 0x0500), // Scroll right and down\n    CREDITSOVWLDEND\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_Route25[] = {\n    CREDITSOVWLDLOADMAP(ROUTE25, 25, 6, 1),\n    CREDITSOVWLDSCROLL(1, 0, 0x0500), // Scroll right\n    CREDITSOVWLDEND\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_VermilionCity[] = {\n    CREDITSOVWLDLOADMAP(VERMILION_CITY, 9, 7, 1),\n    CREDITSOVWLDSCROLL(1, 1, 0x0500), // Scroll right and down\n    CREDITSOVWLDEND\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_Route10[] = {\n    CREDITSOVWLDLOADMAP(ROUTE10, 11, 68, 1),\n    CREDITSOVWLDSCROLL(0, 1, 0x0500), // Scroll down\n    CREDITSOVWLDEND\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_CeladonCity[] = {\n    CREDITSOVWLDLOADMAP(CELADON_CITY, 48, 16, 1),\n    CREDITSOVWLDSCROLL(-1, 0, 0x0500), // Scroll left\n    CREDITSOVWLDEND\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_SaffronCity[] = {\n    CREDITSOVWLDLOADMAP(SAFFRON_CITY, 39, 5, 1),\n    CREDITSOVWLDSCROLL(0, 1, 0x0500), // Scroll down\n    CREDITSOVWLDEND\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_Route17[] = {\n    CREDITSOVWLDLOADMAP(ROUTE17, 7, 43, 1),\n    CREDITSOVWLDSCROLL(0, 1, 0x0500), // Scroll down\n    CREDITSOVWLDEND\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_FuchsiaCity[] = {\n    CREDITSOVWLDLOADMAP(FUCHSIA_CITY, 28, 5, 1),\n    CREDITSOVWLDSCROLL(0, 1, 0x0500), // Scroll down\n    CREDITSOVWLDEND\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_CinnabarIsland[] = {\n    CREDITSOVWLDLOADMAP(CINNABAR_ISLAND, 13, 17, 1),\n    CREDITSOVWLDSCROLL(0, -1, 0x0500), // Scroll up\n    CREDITSOVWLDEND\n};\n\nstatic const struct CreditsOverworldCmd sOverworldCmd_Route21[] = {\n    CREDITSOVWLDLOADMAP(ROUTE21_NORTH, 8, 20, 1),\n    CREDITSOVWLDSCROLL(0, -1, 0x0500), // Scroll up\n    CREDITSOVWLDEND,\n};\n\nstatic const struct CreditsOverworldCmd *const sOverworldMapScenes[] = {\n    sOverworldCmd_Route23,\n    sOverworldCmd_ViridianCity,\n    sOverworldCmd_PewterCity,\n    sOverworldCmd_CeruleanCity,\n    sOverworldCmd_Route25,\n    sOverworldCmd_VermilionCity,\n    sOverworldCmd_Route10,\n    sOverworldCmd_CeladonCity,\n    sOverworldCmd_SaffronCity,\n    sOverworldCmd_Route17,\n    sOverworldCmd_FuchsiaCity,\n    sOverworldCmd_CinnabarIsland,\n    sOverworldCmd_Route21\n};\n\nstatic const struct CreditsTextHeader sCreditsTexts[] = {\n    { gCreditsString_Director, gCreditsString_Junichi_Masuda, FALSE },\n    { gCreditsString_Art_Director_Battle_Director, gCreditsString_Ken_Sugimori_Shigeki_Morimoto, FALSE },\n    { gCreditsString_Program_Leader_Planning_Leader_Graphic_Design_Leader, gCreditsString_Tetsuya_Watanabe_Koji_Nishino_Takao_Unno, FALSE },\n    { gCreditsString_Programmers, gCreditsString_Hiroyuki_Nakamura_Masao_Taya_Satoshi_Nohara_Miyuki_Iwasawa_Daisuke_Goto, FALSE },\n    { gCreditsString_System_Programmers, gCreditsString_Tetsuya_Watanabe_Akito_Mori_Hisashi_Sogabe_Sousuke_Tamada, TRUE  },\n    { gCreditsString_Graphic_Designers, gCreditsString_Takao_Unno_Asuka_Iwashita_Kanako_Eo_Hiroki_Fuchino, TRUE  },\n    { gCreditsString_Graphic_Designers_2, gCreditsString_Ken_Sugimori_Hironobu_Yoshida, TRUE  },\n    { gCreditsString_Music_Composition, gCreditsString_Go_Ichinose_Junichi_Masuda, TRUE  },\n    { gCreditsString_Sound_Effects, gCreditsString_Go_Ichinose, FALSE },\n    { gCreditsString_Game_Designers, gCreditsString_Junichi_Masuda_Koji_Nishino_Tetsuji_Ohta, FALSE },\n    { gCreditsString_Game_Designers_2, gCreditsString_Hitomi_Sato_Shigeru_Ohmori_Tadashi_Takahashi, FALSE },\n    { gCreditsString_Game_Scenario, gCreditsString_Hitomi_Sato_Satoshi_Tajiri, TRUE  },\n    { gCreditsString_Script_Designer_Map_Designer, gCreditsString_Satoshi_Nohara_Shigeru_Ohmori, FALSE },\n    { gCreditsString_Parametric_Designers, gCreditsString_Koji_Nishino_Tetsuji_Ohta_Shigeki_Morimoto, FALSE },\n    { gCreditsString_POKeDEX_Text, gCreditsString_Kenji_Matsushima, FALSE },\n    { gCreditsString_POKeMON_Designers, gCreditsString_Ken_Sugimori_Motofumi_Fujiwara_Shigeki_Morimoto_Hironobu_Yoshida, TRUE  },\n    { gCreditsString_POKeMON_Designers_2, gCreditsString_Satoshi_Ohta_Asuka_Iwashita_Takao_Unno_Kanako_Eo_Aimi_Tomita, FALSE },\n    { gCreditsString_POKeMON_Designers_3, gCreditsString_Atsuko_Nishida_Muneo_Saito_Rena_Yoshikawa_Jun_Okutani, TRUE  },\n    { gCreditsString_Supporting_Programmers, gCreditsString_Teruyuki_Yoshioka_Takao_Nakano_Satoshi_Mitsuhara_Daisuke_Hoshino, FALSE },\n    { gCreditsString_NCL_Product_Testing, gCreditsString_NCL_Super_Mario_Club, FALSE },\n    { gCreditsString_Special_Thanks, gCreditsString_Hiro_Nakamura_Hiroyuki_Uesugi_Teruki_Murakawa_Kazuya_Suyama, FALSE },\n    { gCreditsString_Special_Thanks_2, gCreditsString_Kenji_Tominaga_Kenjiro_Ito_Tomotaka_Komura_Michiko_Takizawa, FALSE },\n    { gCreditsString_Special_Thanks_3, gCreditsString_Makiko_Takada_Mikiko_Ohashi_Shusaku_Egami_Takanao_Kondo_Rui_Kawaguchi, FALSE },\n    { gCreditsString_Braille_Code_Check, gCreditsString_Japan_Braille_Library, FALSE },\n    { gCreditsString_Information_Supervisors, gCreditsString_Hiroki_Enomoto_Kazuyuki_Terada_Yuri_Sakurai_Yumi_Funasaka_Naoko_Yanase, FALSE },\n    { gCreditsString_Coordinators, gCreditsString_Azusa_Tajima_Akira_Kinashi_Kazuki_Yoshihara_Retsuji_Nomoto, FALSE },\n    { gCreditsString_Task_Managers, gCreditsString_Hitoshi_Yamagami_Gakuji_Nomoto, TRUE  },\n    { gCreditsString_Producers, gCreditsString_Hiroyuki_Jinnai_Takehiro_Izushi_Hiroaki_Tsuru, FALSE },\n    { gCreditsString_Executive_Director, gCreditsString_Satoshi_Tajiri, FALSE },\n    { gCreditsString_Executive_Producer, gCreditsString_Satoru_Iwata, FALSE },\n    { gCreditsString_Executive_Producer_2, gCreditsString_Tsunekaz_Ishihara, FALSE },\n    { gCreditsString_English_Version_Coordinators, gCreditsString_Hiro_Nakamura_Seth_McMahill, FALSE },\n    { gCreditsString_Translator_Text_Editor, gCreditsString_Nob_Ogasawara_Teresa_Lillygren, FALSE },\n    { gCreditsString_Programmers_2, gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Yuichiro_Ito_Akira_Kinashi, FALSE },\n    { gCreditsString_Environment_Tool_Programmers, gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Kimiko_Nakamichi, TRUE  },\n    { gCreditsString_NOA_Product_Testing, gCreditsString_Thomas_Hertzog_Kathy_Huguenard_Mika_Kurosawa, TRUE  },\n    { gCreditsString_Braille_Code_Check_2, gCreditsString_National_Federation_of_the_Blind_Patricia_A_Maurer_Japan_Braille_Library_European_Blind_Union, TRUE  },\n    { gCreditsString_Braille_Code_Check_3, gCreditsString_National_Information_Library_Service_Margaret_Campion, TRUE  },\n    { gCreditsString_Special_Thanks_4, gCreditsString_Takehiro_Izushi_Motoyasu_Tojima_Hitoshi_Yamagami_Hiroyuki_Uesugi, FALSE },\n    { gCreditsString_Special_Thanks_5, gCreditsString_Nicola_Pratt_Barlow_Shellie_Dow_Anthony_Howitt_Naoko_Saeki_Kyoko_Onishi, FALSE },\n    { gCreditsString_Braille_Code_Check_4, gCreditsString_The_Royal_New_Zealand_Foundation_of_the_Blind_Greg_Moran, FALSE },\n    { gCreditsString_Graphic_Designer, gCreditsString_Akira_Kinashi, FALSE },\n    { gString_Dummy, gString_Dummy, FALSE }\n};\n\nvoid DoCredits(void)\n{\n    sCreditsMgr = AllocZeroed(sizeof(*sCreditsMgr));\n    ResetTasks();\n    sCreditsMgr->taskId = TASK_NONE;\n    sCreditsMgr->unk_1D = 0;\n    ResetSpriteData();\n    SetMainCallback2(CB2_Credits);\n}\n\nstatic void CB2_Credits(void)\n{\n    switch (RollCredits())\n    {\n    case 0:\n        RunTasks();\n        AnimateSprites();\n        BuildOamBuffer();\n        UpdatePaletteFade();\n        break;\n    case 1:\n        if (sCreditsMgr->unk_1D & 1)\n        {\n            Overworld_CreditsMainCB();\n        }\n        else\n        {\n            RunTasks();\n            AnimateSprites();\n            BuildOamBuffer();\n            UpdatePaletteFade();\n        }\n        sCreditsMgr->unk_1D++;\n        break;\n    case 2:\n        FlagClear(FLAG_DONT_SHOW_MAP_NAME_POPUP);\n        gDisableMapMusicChangeOnMapLoad = MUSIC_DISABLE_OFF;\n        Free(sCreditsMgr);\n        SoftReset(RESET_ALL);\n        // noreturn\n    }\n}\n\nstatic void SwitchWin1OffWin0On(void)\n{\n    ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n    SetGpuReg(REG_OFFSET_WININ, 0x1F3F);\n    SetGpuReg(REG_OFFSET_WINOUT, 0x000E);\n}\n\nstatic void InitBgDarkenEffect(void)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 4));\n    SetGpuReg(REG_OFFSET_BLDY, 10);\n}\n\nstatic void CreateCreditsWindow(void)\n{\n    sCreditsMgr->windowId = AddWindow(&sCreditsWindowTemplate);\n    FillWindowPixelBuffer(sCreditsMgr->windowId, PIXEL_FILL(0));\n    PutWindowTilemap(sCreditsMgr->windowId);\n    CopyWindowToVram(sCreditsMgr->windowId, COPYWIN_FULL);\n    sCreditsMgr->windowIsActive = TRUE;\n}\n\nstatic void DestroyCreditsWindow(void)\n{\n    if (sCreditsMgr->windowIsActive)\n    {\n        RemoveWindow(sCreditsMgr->windowId);\n        CleanupOverworldWindowsAndTilemaps();\n        sCreditsMgr->windowIsActive = FALSE;\n    }\n}\n\nstatic bool32 DoOverworldMapScrollScene(u8 whichMon)\n{\n    switch (sCreditsMgr->subseqno)\n    {\n    case 0:\n        FlagSet(FLAG_DONT_SHOW_MAP_NAME_POPUP);\n        gDisableMapMusicChangeOnMapLoad = MUSIC_DISABLE_KEEP;\n        sCreditsMgr->ovwldseqno = 0;\n        sCreditsMgr->subseqno++;\n        // fallthrough\n    case 1:\n        if (!Overworld_DoScrollSceneForCredits(&sCreditsMgr->ovwldseqno, sOverworldMapScenes[sCreditsMgr->whichMon], QL_TINT_NONE))\n            return FALSE;\n        CreateCreditsWindow();\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH));\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(36, DISPLAY_HEIGHT - 36));\n        SwitchWin1OffWin0On();\n        InitBgDarkenEffect();\n        Menu_LoadStdPalAt(BG_PLTT_ID(15));\n        gPlttBufferUnfaded[BG_PLTT_ID(15) + 15] = RGB_BLACK;\n        gPlttBufferFaded[BG_PLTT_ID(15) + 15] = RGB_BLACK;\n        return TRUE;\n    default:\n        return FALSE;\n    }\n}\n\nstatic s32 RollCredits(void)\n{\n    u16 win0v[8];\n\n    switch (sCreditsMgr->mainseqno)\n    {\n    case CREDITSSCENE_INIT_WIN0:\n        SwitchWin1OffWin0On();\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH));\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(DISPLAY_HEIGHT / 2 - 1, DISPLAY_HEIGHT / 2 + 1));\n        sCreditsMgr->mainseqno = CREDITSSCENE_SETUP_DARKEN_EFFECT;\n        return 0;\n    case CREDITSSCENE_SETUP_DARKEN_EFFECT:\n        InitBgDarkenEffect();\n        CreateCreditsWindow();\n        Menu_LoadStdPalAt(BG_PLTT_ID(15));\n        gPlttBufferUnfaded[BG_PLTT_ID(15) + 15] = RGB_BLACK;\n        gPlttBufferFaded[BG_PLTT_ID(15) + 15] = RGB_BLACK;\n        sCreditsMgr->mainseqno = CREDITSSCENE_OPEN_WIN0;\n        return 0;\n    case CREDITSSCENE_OPEN_WIN0:\n        win0v[0] = GetGpuReg(REG_OFFSET_WIN0V) >> 8;\n        win0v[1] = GetGpuReg(REG_OFFSET_WIN0V) & 0xFF;\n        if (win0v[0] == 0x24)\n        {\n            sCreditsMgr->timer = 0;\n            sCreditsMgr->mainseqno = CREDITSSCENE_LOAD_PLAYER_SPRITE_AT_INDIGO;\n        }\n        else\n        {\n            win0v[0]--;\n            win0v[1]++;\n            SetGpuReg(REG_OFFSET_WIN0V, (win0v[0] << 8) + win0v[1]);\n        }\n        return 0;\n    case CREDITSSCENE_LOAD_PLAYER_SPRITE_AT_INDIGO:\n        if (sCreditsMgr->timer)\n        {\n            sCreditsMgr->timer--;\n            return 0;\n        }\n        LoadPlayerOrRivalSprite(0);\n        sCreditsMgr->timer = 100;\n        sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_TITLE_STAFF;\n        return 0;\n    case CREDITSSCENE_PRINT_TITLE_STAFF:\n        if (sCreditsMgr->timer)\n        {\n            sCreditsMgr->timer--;\n            return 0;\n        }\n        sCreditsMgr->timer = 360;\n        if(gSaveBlock1Ptr->keyFlags.version == 0) //FR\n            AddTextPrinterParameterized4(sCreditsMgr->windowId, FONT_NORMAL_COPY_1, 0x08, 0x29, 1, 2, sTextColor_Header, 0, gString_PokemonFireRed_Staff);\n        else //LG\n            AddTextPrinterParameterized4(sCreditsMgr->windowId, FONT_NORMAL_COPY_1, 0x08, 0x29, 1, 2, sTextColor_Header, 0, gString_PokemonLeafGreen_Staff);\n        sCreditsMgr->mainseqno = CREDITSSCENE_WAIT_TITLE_STAFF;\n        return 0;\n    case CREDITSSCENE_WAIT_TITLE_STAFF:\n        if (sCreditsMgr->timer)\n        {\n            sCreditsMgr->timer--;\n            return 0;\n        }\n        DestroyCreditsWindow();\n        sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD;\n        sCreditsMgr->timer = 0;\n        sCreditsMgr->scrcmdidx = 0;\n        return 0;\n    case CREDITSSCENE_EXEC_CMD:\n        if (sCreditsMgr->timer != 0)\n        {\n            sCreditsMgr->timer--;\n            return sCreditsMgr->canSpeedThrough;\n        }\n        switch (sCreditsScript[sCreditsMgr->scrcmdidx].cmd)\n        {\n        case CREDITSSCRCMD_PRINT:\n            BeginNormalPaletteFade(0x00008000, 0, 0, 16, RGB_BLACK);\n            sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_ADDPRINTER1;\n            FillWindowPixelBuffer(sCreditsMgr->windowId, PIXEL_FILL(0));\n            return sCreditsMgr->canSpeedThrough;\n        case CREDITSSCRCMD_MAPNEXT:\n            sCreditsMgr->mainseqno = CREDITSSCENE_MAPNEXT_DESTROYWINDOW;\n            sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;\n            FadeSelectedPals(1, 0, 0x3FFFFFFF);\n            break;\n        case CREDITSSCRCMD_MAP:\n            sCreditsMgr->mainseqno = CREDITSSCENE_MAP_LOADMAP_CREATESPRITES;\n            sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;\n            break;\n        case CREDITSSCRCMD_MON:\n            sCreditsMgr->mainseqno = CREDITSSCENE_MON_DESTROY_ASSETS;\n            sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;\n            FadeScreen(FADE_TO_BLACK, 0);\n            break;\n        case CREDITSSCRCMD_THEENDGFX:\n            sCreditsMgr->mainseqno = CREDITSSCENE_THEEND_DESTROY_ASSETS;\n            sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;\n            BeginNormalPaletteFade(PALETTES_ALL, 4, 0, 16, RGB_BLACK);\n            break;\n        case CREDITSSCRCMD_WAITBUTTON:\n            sCreditsMgr->mainseqno = CREDITSSCENE_WAITBUTTON;\n            break;\n        }\n        sCreditsMgr->timer = sCreditsScript[sCreditsMgr->scrcmdidx].duration;\n        sCreditsMgr->scrcmdidx++;\n        return 0;\n    case CREDITSSCENE_PRINT_ADDPRINTER1:\n        if (gPaletteFade.active)\n            return sCreditsMgr->canSpeedThrough;\n        win0v[0] = sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].unused;\n        AddTextPrinterParameterized4(sCreditsMgr->windowId, FONT_NORMAL_COPY_1, 2, 6, 0, 0, sTextColor_Header, -1, sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].title);\n        sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_ADDPRINTER2;\n        return sCreditsMgr->canSpeedThrough;\n    case CREDITSSCENE_PRINT_ADDPRINTER2:\n        win0v[0] = sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].unused;\n        AddTextPrinterParameterized4(sCreditsMgr->windowId, FONT_NORMAL, 8, 6, 0, 0, sTextColor_Regular, -1, sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].names);\n        sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_DELAY;\n        return sCreditsMgr->canSpeedThrough;\n    case CREDITSSCENE_PRINT_DELAY:\n        CopyWindowToVram(sCreditsMgr->windowId, COPYWIN_GFX);\n        sCreditsMgr->timer = sCreditsScript[sCreditsMgr->scrcmdidx].duration;\n        sCreditsMgr->scrcmdidx++;\n        BeginNormalPaletteFade(0x00008000, 0, 16, 0, RGB_BLACK);\n        sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD;\n        return sCreditsMgr->canSpeedThrough;\n    case CREDITSSCENE_MAPNEXT_DESTROYWINDOW:\n        if (!gPaletteFade.active)\n        {\n            DestroyCreditsWindow();\n            sCreditsMgr->subseqno = 0;\n            sCreditsMgr->mainseqno = CREDITSSCENE_MAPNEXT_LOADMAP;\n        }\n        return 0;\n    case CREDITSSCENE_MAPNEXT_LOADMAP:\n        if (DoOverworldMapScrollScene(sCreditsMgr->whichMon))\n        {\n            sCreditsMgr->canSpeedThrough = TRUE;\n            sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD;\n        }\n        return 0;\n    case CREDITSSCENE_MAP_LOADMAP_CREATESPRITES:\n        if (!gPaletteFade.active)\n        {\n            DestroyCreditsWindow();\n            sCreditsMgr->subseqno = 0;\n            while (!DoOverworldMapScrollScene(sCreditsMgr->whichMon)){};\n            switch (sCreditsMgr->whichMon)\n            {\n            default:\n            case 3:\n                win0v[0] = 1;\n                break;\n            case 6:\n                win0v[0] = 2;\n                break;\n            case 9:\n                win0v[0] = 3;\n                break;\n            case 12:\n                win0v[0] = 4;\n                break;\n            }\n            LoadPlayerOrRivalSprite(win0v[0]);\n            sCreditsMgr->canSpeedThrough = TRUE;\n            sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD;\n        }\n        return 0;\n    case CREDITSSCENE_MON_DESTROY_ASSETS:\n        if (!gPaletteFade.active)\n        {\n            DestroyPlayerOrRivalSprite();\n            DestroyCreditsWindow();\n            sCreditsMgr->subseqno = 0;\n            sCreditsMgr->canSpeedThrough = FALSE;\n            sCreditsMgr->mainseqno = CREDITSSCENE_MON_SHOW;\n        }\n        return 0;\n    case CREDITSSCENE_MON_SHOW:\n        if (DoCreditsMonScene())\n        {\n            sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD;\n        }\n        return 0;\n    case CREDITSSCENE_THEEND_DESTROY_ASSETS:\n        if (!gPaletteFade.active)\n        {\n            DestroyCreditsWindow();\n            sCreditsMgr->subseqno = 0;\n            sCreditsMgr->canSpeedThrough = FALSE;\n            sCreditsMgr->mainseqno = CREDITSSCENE_THEEND_SHOW;\n        }\n        return 0;\n    case CREDITSSCENE_THEEND_SHOW:\n        if (DoCopyrightOrTheEndGfxScene())\n        {\n            sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD;\n        }\n        return 0;\n    case CREDITSSCENE_WAITBUTTON:\n        if (JOY_NEW(A_BUTTON))\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITE);\n            sCreditsMgr->mainseqno = CREDITSSCENE_TERMINATE;\n            return 0;\n        }\n        if (sCreditsMgr->timer)\n        {\n            sCreditsMgr->timer--;\n        }\n        else\n        {\n            sCreditsMgr->mainseqno = CREDITSSCENE_TERMINATE;\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITE);\n        }\n        return 0;\n    case CREDITSSCENE_TERMINATE:\n        if (!gPaletteFade.active)\n            DestroyCreditsWindow();\n        break;\n    }\n    return 2;\n}\n\nstatic void VBlankCB(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void LoadCreditsMonPic(u8 whichMon)\n{\n    switch (whichMon)\n    {\n    case CREDITSMON_CHARIZARD:\n        InitWindows(sWindowTemplates_Charizard);\n        FillWindowPixelBuffer(0, PIXEL_FILL(0));\n        LoadMonPicInWindow(SPECIES_CHARIZARD, SHINY_ODDS, 0, TRUE, 10, 0);\n        CopyToWindowPixelBuffer(1, (const void *)sCharizard1_Tiles, 0, 0);\n        CopyToWindowPixelBuffer(2, (const void *)sCharizard2_Tiles, 0, 0);\n        break;\n    case CREDITSMON_VENUSAUR:\n        InitWindows(sWindowTemplates_Venusaur);\n        FillWindowPixelBuffer(0, PIXEL_FILL(0));\n        LoadMonPicInWindow(SPECIES_VENUSAUR, SHINY_ODDS, 0, TRUE, 10, 0);\n        CopyToWindowPixelBuffer(1, (const void *)sVenusaur1_Tiles, 0, 0);\n        CopyToWindowPixelBuffer(2, (const void *)sVenusaur2_Tiles, 0, 0);\n        break;\n    case CREDITSMON_BLASTOISE:\n        InitWindows(sWindowTemplates_Blastoise);\n        FillWindowPixelBuffer(0, PIXEL_FILL(0));\n        LoadMonPicInWindow(SPECIES_BLASTOISE, SHINY_ODDS, 0, TRUE, 10, 0);\n        CopyToWindowPixelBuffer(1, (const void *)sBlastoise1_Tiles, 0, 0);\n        CopyToWindowPixelBuffer(2, (const void *)sBlastoise2_Tiles, 0, 0);\n        break;\n    case CREDITSMON_PIKACHU:\n        InitWindows(sWindowTemplates_Pikachu);\n        FillWindowPixelBuffer(0, PIXEL_FILL(0));\n        LoadMonPicInWindow(SPECIES_PIKACHU, SHINY_ODDS, 0, TRUE, 10, 0);\n        CopyToWindowPixelBuffer(1, (const void *)sPikachu1_Tiles, 0, 0);\n        CopyToWindowPixelBuffer(2, (const void *)sPikachu2_Tiles, 0, 0);\n        break;\n    }\n    CopyWindowToVram(0, COPYWIN_GFX);\n    CopyWindowToVram(1, COPYWIN_GFX);\n    CopyWindowToVram(2, COPYWIN_GFX);\n}\n\nstatic u16 GetCreditsMonSpecies(u8 whichMon)\n{\n    switch (whichMon)\n    {\n    case CREDITSMON_CHARIZARD:\n        return SPECIES_CHARIZARD;\n    case CREDITSMON_VENUSAUR:\n        return SPECIES_VENUSAUR;\n    case CREDITSMON_BLASTOISE:\n        return SPECIES_BLASTOISE;\n    case CREDITSMON_PIKACHU:\n        return SPECIES_PIKACHU;\n    default:\n        return SPECIES_NONE;\n    }\n}\n\nstatic bool32 DoCreditsMonScene(void)\n{\n    switch (sCreditsMgr->subseqno)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        SetHBlankCallback(NULL);\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);\n        SetGpuReg(REG_OFFSET_WININ, 0);\n        SetGpuReg(REG_OFFSET_WINOUT, 0);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        ResetPaletteFade();\n        ResetSpriteData();\n        ResetTasks();\n        ResetBgsAndClearDma3BusyFlags(1);\n        InitBgsFromTemplates(1, sBgTemplates_MonSceneOrTheEnd, NELEMS(sBgTemplates_MonSceneOrTheEnd));\n        SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE));\n        ChangeBgX(0, 0, BG_COORD_SET);\n        ChangeBgY(0, 0, BG_COORD_SET);\n        ChangeBgX(1, 0, BG_COORD_SET);\n        ChangeBgY(1, 0, BG_COORD_SET);\n        sCreditsMgr->creditsMonTimer = 0;\n        sCreditsMgr->unk_0E = 0;\n        SetBgAffine(2, 0x8000, 0x8000, 0x78, 0x50, sCreditsMgr->creditsMonTimer, sCreditsMgr->creditsMonTimer, 0);\n        DecompressAndLoadBgGfxUsingHeap(1, gCreditsMonPokeball_Tiles, 0x2000, 0, 0);\n        DecompressAndLoadBgGfxUsingHeap(2, sCreditsMonCircle_Tiles, 0x2000, 0, 0);\n        DecompressAndLoadBgGfxUsingHeap(1, gCreditsMonPokeball_Tilemap, 0x500, 0, 1);\n        DecompressAndLoadBgGfxUsingHeap(2, sCreditsMonCircle_Tilemap, 0x400, 0, 1);\n        LoadPalette(gCreditsMonPokeball_Pals[sCreditsMgr->whichMon], BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n        LoadPalette(sCreditsMonCircle_Pal, BG_PLTT_ID(15), sizeof(sCreditsMonCircle_Pal));\n        LoadCreditsMonPic(sCreditsMgr->whichMon);\n        SetVBlankCallback(VBlankCB);\n        EnableInterrupts(INTR_FLAG_VBLANK);\n        sCreditsMgr->subseqno++;\n        break;\n    case 1:\n        FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 17);\n        PutWindowTilemap(0);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(0);\n        sCreditsMgr->subseqno++;\n        break;\n    case 2:\n        ShowBg(2);\n        ShowBg(0);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        sCreditsMgr->creditsMonTimer = 40;\n        sCreditsMgr->subseqno++;\n        break;\n    case 3:\n        if (sCreditsMgr->creditsMonTimer != 0)\n            sCreditsMgr->creditsMonTimer--;\n        else\n            sCreditsMgr->subseqno++;\n        break;\n    case 4:\n        if (!gPaletteFade.active)\n        {\n            sCreditsMgr->creditsMonTimer = 8;\n            sCreditsMgr->unk_0E = 1;\n            sCreditsMgr->subseqno++;\n        }\n        break;\n    case 5:\n        if (sCreditsMgr->creditsMonTimer != 0)\n            sCreditsMgr->creditsMonTimer--;\n        else\n        {\n            if (sCreditsMgr->unk_0E < 3)\n            {\n                PutWindowTilemap(sCreditsMgr->unk_0E);\n                CopyBgTilemapBufferToVram(0);\n                sCreditsMgr->creditsMonTimer = 4;\n                sCreditsMgr->unk_0E++;\n            }\n            else\n                sCreditsMgr->subseqno++;\n        }\n        break;\n    case 6:\n        if (sCreditsMgr->creditsMonTimer < 256)\n        {\n            sCreditsMgr->creditsMonTimer += 16;\n            SetBgAffine(2, 0x8000, 0x8000, 0x78, 0x50, sCreditsMgr->creditsMonTimer, sCreditsMgr->creditsMonTimer, 0);\n        }\n        else\n        {\n            SetBgAffine(2, 0x8000, 0x8000, 0x78, 0x50, 0x100, 0x100, 0);\n            sCreditsMgr->creditsMonTimer = 32;\n            sCreditsMgr->subseqno++;\n        }\n        break;\n    case 7:\n        if (sCreditsMgr->creditsMonTimer != 0)\n            sCreditsMgr->creditsMonTimer--;\n        else\n        {\n            HideBg(2);\n            ShowBg(1);\n            PlayCry_NormalNoDucking(GetCreditsMonSpecies(sCreditsMgr->whichMon), 0, CRY_VOLUME_RS, CRY_PRIORITY_NORMAL);\n            sCreditsMgr->creditsMonTimer = 128;\n            sCreditsMgr->subseqno++;\n        }\n        break;\n    case 8:\n        if (sCreditsMgr->creditsMonTimer != 0)\n            sCreditsMgr->creditsMonTimer--;\n        else\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            sCreditsMgr->subseqno++;\n        }\n        break;\n    case 9:\n        if (!gPaletteFade.active)\n        {\n            FreeAllWindowBuffers();\n            Free(GetBgTilemapBuffer(0));\n            sCreditsMgr->subseqno = 0;\n            return TRUE;\n        }\n        break;\n    }\n    return FALSE;\n}\n\nstatic bool32 DoCopyrightOrTheEndGfxScene(void)\n{\n    switch (sCreditsMgr->subseqno)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        SetHBlankCallback(NULL);\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);\n        SetGpuReg(REG_OFFSET_WININ, 0);\n        SetGpuReg(REG_OFFSET_WINOUT, 0);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        ResetPaletteFade();\n        ResetSpriteData();\n        ResetTasks();\n        ResetBgsAndClearDma3BusyFlags(1);\n        InitBgsFromTemplates(0, sBgTemplates_MonSceneOrTheEnd, 1);\n        ChangeBgX(0, 0, BG_COORD_SET);\n        ChangeBgY(0, 0, BG_COORD_SET);\n        DecompressAndLoadBgGfxUsingHeap(0, sCopyrightOrTheEndGfxHeaders[sCreditsMgr->whichMon].tiles, 0x2000, 0, 0);\n        DecompressAndLoadBgGfxUsingHeap(0, sCopyrightOrTheEndGfxHeaders[sCreditsMgr->whichMon].map, 0x800, 0, 1);\n        LoadPalette(sCopyrightOrTheEndGfxHeaders[sCreditsMgr->whichMon].palette, BG_PLTT_ID(0), 16 * PLTT_SIZE_4BPP);\n        SetVBlankCallback(VBlankCB);\n        EnableInterrupts(INTR_FLAG_VBLANK);\n        sCreditsMgr->subseqno++;\n        break;\n    case 1:\n        CopyBgTilemapBufferToVram(0);\n        sCreditsMgr->subseqno++;\n        break;\n    case 2:\n        ShowBg(0);\n        if (sCreditsMgr->whichMon != 0)\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0, RGB_BLACK);\n        else\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        sCreditsMgr->subseqno++;\n        break;\n    case 3:\n        if (!gPaletteFade.active)\n        {\n            sCreditsMgr->subseqno = 0;\n            return TRUE;\n        }\n        break;\n    }\n    return FALSE;\n}\n\nstatic void Task_MovePlayerAndGroundSprites(u8 taskId)\n{\n    struct CreditsTaskData * data = (struct CreditsTaskData*)gTasks[taskId].data;\n    switch (data->spriteMoveCmd)\n    {\n    case 0:\n        break;\n    case 1:\n        if (gSprites[data->characterSpriteId].x != 0xD0)\n        {\n            gSprites[data->characterSpriteId].x--;\n            gSprites[data->groundSpriteId].x--;\n        }\n        else\n        {\n            data->spriteMoveCmd = 0;\n        }\n        break;\n    case 2:\n        if (sCreditsMgr->unk_1D & 1)\n        {\n            if (gSprites[data->characterSpriteId].y != 0x50)\n            {\n                gSprites[data->characterSpriteId].y--;\n                gSprites[data->groundSpriteId].y--;\n            }\n            else\n            {\n                data->spriteMoveCmd = 0;\n            }\n        }\n        break;\n    case 3:\n        if (sCreditsMgr->mainseqno == 15)\n        {\n            gSprites[data->characterSpriteId].x--;\n            gSprites[data->groundSpriteId].x--;\n        }\n        break;\n    }\n}\n\nstatic void DestroyPlayerOrRivalSprite(void)\n{\n    if (sCreditsMgr->taskId != TASK_NONE)\n    {\n        struct CreditsTaskData * data = (void *)gTasks[sCreditsMgr->taskId].data;\n        FreeSpriteTilesByTag(data->characterTilesTag);\n        DestroySprite(&gSprites[data->characterSpriteId]);\n        FreeSpriteTilesByTag(data->groundTilesTag);\n        DestroySprite(&gSprites[data->groundSpriteId]);\n        DestroyTask(sCreditsMgr->taskId);\n        sCreditsMgr->taskId = TASK_NONE;\n    }\n}\n\nstatic void LoadPlayerOrRivalSprite(u8 whichScene)\n{\n    u8 taskId;\n    struct CreditsTaskData * data;\n    s32 x, y;\n    struct SpriteTemplate sprTemplate;\n    struct CompressedSpriteSheet sprSheet;\n\n    if (sCreditsMgr->taskId == TASK_NONE)\n    {\n        taskId = CreateTask(Task_MovePlayerAndGroundSprites, 0);\n        data = (struct CreditsTaskData *)gTasks[taskId].data;\n        sCreditsMgr->taskId = taskId;\n        switch (sPlayerRivalSpriteParams[whichScene][2])\n        {\n        default:\n        case 0:\n            x = DISPLAY_WIDTH - 32;\n            y = DISPLAY_HEIGHT / 2;\n            break;\n        case 1:\n            x = DISPLAY_WIDTH + 32;\n            y = DISPLAY_HEIGHT / 2;\n            break;\n        case 2:\n            x = DISPLAY_WIDTH - 32;\n            y = DISPLAY_HEIGHT;\n            break;\n        }\n        data->spriteMoveCmd = sPlayerRivalSpriteParams[whichScene][2];\n        data->characterTilesTag = GFXTAG_CHARACTER;\n        data->characterPalTag = TAG_NONE;\n        switch (sPlayerRivalSpriteParams[whichScene][0])\n        {\n        case 0:\n            // Player\n            if (gSaveBlock2Ptr->playerGender == MALE)\n            {\n                sprSheet.data = sPlayerMale_Tiles;\n                sprSheet.size = 0x3000;\n                sprSheet.tag = data->characterTilesTag;\n                LoadCompressedSpriteSheet(&sprSheet);\n                LoadPalette(sPlayerMale_Pal, OBJ_PLTT_ID(15), sizeof(sPlayerMale_Pal));\n            }\n            else\n            {\n                sprSheet.data = sPlayerFemale_Tiles;\n                sprSheet.size = 0x3000;\n                sprSheet.tag = data->characterTilesTag;\n                LoadCompressedSpriteSheet(&sprSheet);\n                LoadPalette(sPlayerFemale_Pal, OBJ_PLTT_ID(15), sizeof(sPlayerFemale_Pal));\n            }\n            break;\n        case 1:\n            // Rival\n            sprSheet.data = sRival_Tiles;\n            sprSheet.size = 0x3000;\n            sprSheet.tag = data->characterTilesTag;\n            LoadCompressedSpriteSheet(&sprSheet);\n            LoadPalette(sRival_Pal, OBJ_PLTT_ID(15), sizeof(sRival_Pal));\n            break;\n        }\n        sprTemplate = sPlayerOrRivalSpriteTemplate;\n        sprTemplate.tileTag = data->characterTilesTag;\n        data->characterSpriteId = CreateSprite(&sprTemplate, x, y, 0);\n        gSprites[data->characterSpriteId].oam.paletteNum = 15;\n        gSprites[data->characterSpriteId].subpriority = 0;\n\n        data->groundTilesTag = GFXTAG_GROUND;\n        data->groundPalTag = TAG_NONE;\n        switch (sPlayerRivalSpriteParams[whichScene][1])\n        {\n        case 0:\n            sprSheet.data = sGround_Grass_Tiles;\n            sprSheet.size = 0x3000;\n            sprSheet.tag = data->groundTilesTag;\n            LoadCompressedSpriteSheet(&sprSheet);\n            LoadPalette(sGround_Grass_Pal, OBJ_PLTT_ID(14), sizeof(sGround_Grass_Pal));\n            sprTemplate = sGroundSpriteTemplate_Running;\n            break;\n        case 1:\n            sprSheet.data = sGround_Grass_Tiles;\n            sprSheet.size = 0x3000;\n            sprSheet.tag = data->groundTilesTag;\n            LoadCompressedSpriteSheet(&sprSheet);\n            LoadPalette(sGround_Grass_Pal, OBJ_PLTT_ID(14), sizeof(sGround_Grass_Pal));\n            sprTemplate = sGroundSpriteTemplate_Static;\n            break;\n        case 2:\n            sprSheet.data = sGround_Dirt_Tiles;\n            sprSheet.size = 0x3000;\n            sprSheet.tag = data->groundTilesTag;\n            LoadCompressedSpriteSheet(&sprSheet);\n            LoadPalette(sGround_Dirt_Pal, OBJ_PLTT_ID(14), sizeof(sGround_Dirt_Pal));\n            sprTemplate = sGroundSpriteTemplate_Running;\n            break;\n        case 3:\n            sprSheet.data = sGround_City_Tiles;\n            sprSheet.size = 0x3000;\n            sprSheet.tag = data->groundTilesTag;\n            LoadCompressedSpriteSheet(&sprSheet);\n            LoadPalette(sGround_City_Pal, OBJ_PLTT_ID(14), sizeof(sGround_City_Pal));\n            sprTemplate = sGroundSpriteTemplate_Running;\n            break;\n        }\n        sprTemplate.tileTag = data->groundTilesTag;\n        data->groundSpriteId = CreateSprite(&sprTemplate, x, y + 38, 0);\n        gSprites[data->groundSpriteId].oam.paletteNum = 14;\n        gSprites[data->groundSpriteId].subpriority = 1;\n    }\n}\n"
  },
  {
    "path": "src/crt0.s",
    "content": "\t.include \"constants/gba_constants.inc\"\n\t.include \"constants/misc_constants.inc\"\n\n\t.syntax unified\n\n\t.arm\n\t.align 2, 0\n\t.global start_vector\nstart_vector:\n\tmov r0, #PSR_IRQ_MODE\n\tmsr cpsr_cf, r0\n\tldr sp, sp_irq\n\tmov r0, #PSR_SYS_MODE\n\tmsr cpsr_cf, r0\n\tldr sp, sp_usr\n\tldr r1, =INTR_VECTOR\n\tadr r0, intr_main\n\tstr r0, [r1]\n\tldr r1, =AgbMain\n\tmov lr, pc\n\tbx r1\n\tb start_vector\n\n\t.align 2, 0\nsp_usr: .word IWRAM_END - 0x1C0\nsp_irq: .word IWRAM_END - 0x60\n\n\t.pool\n\n\t.arm\n\t.align 2, 0\n\t.global intr_main\nintr_main:\n\tmov r3, #REG_BASE\n\tadd r3, r3, #OFFSET_REG_IE\n\tldr r2, [r3]\n\tldrh r1, [r3, #REG_IME - REG_IE]\n\tmrs r0, spsr\n\tstmdb sp!, {r0-r3,lr}\n\tmov r0, #0\n\tstrh r0, [r3, #REG_IME - REG_IE]\n\tand r1, r2, r2, lsr #16\n\tmov r12, #0\n\tands r0, r1, #INTR_FLAG_VCOUNT\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tmov r0, 0x1\n\tstrh r0, [r3, #REG_IME - REG_IE]\n\tands r0, r1, #INTR_FLAG_SERIAL\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tands r0, r1, #INTR_FLAG_TIMER3\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tands r0, r1, #INTR_FLAG_HBLANK\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tands r0, r1, #INTR_FLAG_VBLANK\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tands r0, r1, #INTR_FLAG_TIMER0\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tands r0, r1, #INTR_FLAG_TIMER1\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tands r0, r1, #INTR_FLAG_TIMER2\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tands r0, r1, #INTR_FLAG_DMA0\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tands r0, r1, #INTR_FLAG_DMA1\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tands r0, r1, #INTR_FLAG_DMA2\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tands r0, r1, #INTR_FLAG_DMA3\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tands r0, r1, #INTR_FLAG_KEYPAD\n\tbne jump_intr\n\tadd r12, r12, 0x4\n\tands r0, r1, #INTR_FLAG_GAMEPAK\n\tstrbne r0, [r3, #REG_SOUNDCNT_X - REG_IE]\nloop:\n\tbne loop @ spin\njump_intr:\n\tstrh r0, [r3, #REG_IF - REG_IE]\n\tbic r2, r2, r0\n\tldr r0, =gSTWIStatus\n\tldr r0, [r0]\n\tldrb r0, [r0, 0xA]\n\tmov r1, #INTR_FLAG_TIMER0\n\tlsl r0, r1, r0\n\torr r0, r0, #INTR_FLAG_GAMEPAK\n\torr r1, r0, #INTR_FLAG_SERIAL | INTR_FLAG_TIMER3 | INTR_FLAG_VCOUNT | INTR_FLAG_HBLANK\n\tand r1, r1, r2\n\tstrh r1, [r3, #0]\n\tmrs r3, cpsr\n\tbic r3, r3, #PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK\n\torr r3, r3, #PSR_SYS_MODE\n\tmsr cpsr_cf, r3\n\tldr r1, =gIntrTable\n\tadd r1, r1, r12\n\tldr r0, [r1]\n\tstmdb sp!, {lr}\n\tadr lr, intr_return\n\tbx r0\nintr_return:\n\tldmia sp!, {lr}\n\tmrs r3, cpsr\n\tbic r3, r3, #PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK\n\torr r3, r3, #PSR_I_BIT | PSR_IRQ_MODE\n\tmsr cpsr_cf, r3\n\tldmia sp!, {r0-r3,lr}\n\tstrh r2, [r3, #0]\n\tstrh r1, [r3, #REG_IME - REG_IE]\n\tmsr spsr_cf, r0\n\tbx lr\n\n\t.pool\n\n\t.align 2, 0 @ Don't pad with nop.\n"
  },
  {
    "path": "src/data/battle_anim.h",
    "content": "const struct OamData gOamData_AffineOff_ObjNormal_8x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\n\nconst struct OamData gOamData_AffineOff_ObjNormal_16x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjNormal_32x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x32),\n    .x = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjNormal_64x64 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjNormal_16x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x8),\n    .x = 0,\n    .size = SPRITE_SIZE(16x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjNormal_32x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x8),\n    .x = 0,\n    .size = SPRITE_SIZE(32x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjNormal_32x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x16),\n    .x = 0,\n    .size = SPRITE_SIZE(32x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjNormal_64x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x32),\n    .x = 0,\n    .size = SPRITE_SIZE(64x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjNormal_8x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x16),\n    .x = 0,\n    .size = SPRITE_SIZE(8x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjNormal_8x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x32),\n    .x = 0,\n    .size = SPRITE_SIZE(8x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjNormal_16x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x32),\n    .x = 0,\n    .size = SPRITE_SIZE(16x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjNormal_32x64 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x64),\n    .x = 0,\n    .size = SPRITE_SIZE(32x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjNormal_8x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjNormal_16x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjNormal_32x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x32),\n    .x = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjNormal_64x64 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjNormal_16x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x8),\n    .x = 0,\n    .size = SPRITE_SIZE(16x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjNormal_32x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x8),\n    .x = 0,\n    .size = SPRITE_SIZE(32x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjNormal_32x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x16),\n    .x = 0,\n    .size = SPRITE_SIZE(32x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjNormal_64x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x32),\n    .x = 0,\n    .size = SPRITE_SIZE(64x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjNormal_8x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x16),\n    .x = 0,\n    .size = SPRITE_SIZE(8x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjNormal_8x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x32),\n    .x = 0,\n    .size = SPRITE_SIZE(8x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjNormal_16x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x32),\n    .x = 0,\n    .size = SPRITE_SIZE(16x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjNormal_32x64 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x64),\n    .x = 0,\n    .size = SPRITE_SIZE(32x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjNormal_8x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjNormal_16x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjNormal_32x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x32),\n    .x = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjNormal_64x64 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjNormal_16x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x8),\n    .x = 0,\n    .size = SPRITE_SIZE(16x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjNormal_32x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x8),\n    .x = 0,\n    .size = SPRITE_SIZE(32x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjNormal_32x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x16),\n    .x = 0,\n    .size = SPRITE_SIZE(32x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjNormal_64x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x32),\n    .x = 0,\n    .size = SPRITE_SIZE(64x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjNormal_8x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x16),\n    .x = 0,\n    .size = SPRITE_SIZE(8x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjNormal_8x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x32),\n    .x = 0,\n    .size = SPRITE_SIZE(8x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjNormal_16x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x32),\n    .x = 0,\n    .size = SPRITE_SIZE(16x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjNormal_32x64 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x64),\n    .x = 0,\n    .size = SPRITE_SIZE(32x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjBlend_8x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjBlend_16x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjBlend_32x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x32),\n    .x = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjBlend_64x64 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjBlend_16x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x8),\n    .x = 0,\n    .size = SPRITE_SIZE(16x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjBlend_32x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x8),\n    .x = 0,\n    .size = SPRITE_SIZE(32x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjBlend_32x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x16),\n    .x = 0,\n    .size = SPRITE_SIZE(32x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjBlend_64x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x32),\n    .x = 0,\n    .size = SPRITE_SIZE(64x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjBlend_8x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x16),\n    .x = 0,\n    .size = SPRITE_SIZE(8x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjBlend_8x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x32),\n    .x = 0,\n    .size = SPRITE_SIZE(8x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjBlend_16x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x32),\n    .x = 0,\n    .size = SPRITE_SIZE(16x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineOff_ObjBlend_32x64 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x64),\n    .x = 0,\n    .size = SPRITE_SIZE(32x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjBlend_8x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjBlend_16x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjBlend_32x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x32),\n    .x = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjBlend_64x64 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjBlend_16x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x8),\n    .x = 0,\n    .size = SPRITE_SIZE(16x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjBlend_32x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x8),\n    .x = 0,\n    .size = SPRITE_SIZE(32x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjBlend_32x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x16),\n    .x = 0,\n    .size = SPRITE_SIZE(32x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjBlend_64x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x32),\n    .x = 0,\n    .size = SPRITE_SIZE(64x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjBlend_8x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x16),\n    .x = 0,\n    .size = SPRITE_SIZE(8x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjBlend_8x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x32),\n    .x = 0,\n    .size = SPRITE_SIZE(8x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjBlend_16x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x32),\n    .x = 0,\n    .size = SPRITE_SIZE(16x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineNormal_ObjBlend_32x64 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x64),\n    .x = 0,\n    .size = SPRITE_SIZE(32x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjBlend_8x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjBlend_16x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjBlend_32x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x32),\n    .x = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjBlend_64x64 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjBlend_16x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x8),\n    .x = 0,\n    .size = SPRITE_SIZE(16x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjBlend_32x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x8),\n    .x = 0,\n    .size = SPRITE_SIZE(32x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjBlend_32x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x16),\n    .x = 0,\n    .size = SPRITE_SIZE(32x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjBlend_64x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x32),\n    .x = 0,\n    .size = SPRITE_SIZE(64x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjBlend_8x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x16),\n    .x = 0,\n    .size = SPRITE_SIZE(8x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjBlend_8x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x32),\n    .x = 0,\n    .size = SPRITE_SIZE(8x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjBlend_16x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x32),\n    .x = 0,\n    .size = SPRITE_SIZE(16x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct OamData gOamData_AffineDouble_ObjBlend_32x64 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x64),\n    .x = 0,\n    .size = SPRITE_SIZE(32x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nconst struct CompressedSpriteSheet gBattleAnimPicTable[] =\n{\n    {gBattleAnimSpriteGfx_Bone, 0x0200, ANIM_TAG_BONE},\n    {gBattleAnimSpriteGfx_Spark, 0x0300, ANIM_TAG_SPARK},\n    {gBattleAnimSpriteGfx_Pencil, 0x0200, ANIM_TAG_PENCIL},\n    {gBattleAnimSpriteGfx_AirWave, 0x0100, ANIM_TAG_AIR_WAVE},\n    {gBattleAnimSpriteGfx_Orb, 0x0200, ANIM_TAG_ORB},\n    {gBattleAnimSpriteGfx_Sword, 0x0400, ANIM_TAG_SWORD},\n    {gBattleAnimSpriteGfx_Seed, 0x0180, ANIM_TAG_SEED},\n    {gBattleAnimSpriteGfx_Explosion6, 0x0800, ANIM_TAG_EXPLOSION_6},\n    {gBattleAnimSpriteGfx_PinkOrb, 0x0020, ANIM_TAG_PINK_ORB},\n    {gBattleAnimSpriteGfx_Gust, 0x0400, ANIM_TAG_GUST},\n    {gBattleAnimSpriteGfx_IceCube, 0x1200, ANIM_TAG_ICE_CUBE},\n    {gBattleAnimSpriteGfx_Spark2, 0x0180, ANIM_TAG_SPARK_2},\n    {gBattleAnimSpriteGfx_Orange, 0x0080, ANIM_TAG_ORANGE},\n    {gBattleAnimSpriteGfx_YellowBall, 0x0080, ANIM_TAG_YELLOW_BALL},\n    {gBattleAnimSpriteGfx_LockOn, 0x0280, ANIM_TAG_LOCK_ON},\n    {gBattleAnimSpriteGfx_TiedBag, 0x0080, ANIM_TAG_TIED_BAG},\n    {gBattleAnimSpriteGfx_BlackSmoke, 0x0100, ANIM_TAG_BLACK_SMOKE},\n    {gBattleAnimSpriteGfx_BlackBall, 0x0020, ANIM_TAG_BLACK_BALL},\n    {gBattleAnimSpriteGfx_Conversion, 0x0080, ANIM_TAG_CONVERSION},\n    {gBattleAnimSpriteGfx_Glass, 0x0400, ANIM_TAG_GLASS},\n    {gBattleAnimSpriteGfx_HornHit, 0x0200, ANIM_TAG_HORN_HIT},\n    {gBattleAnimSpriteGfx_Hit, 0x0A00, ANIM_TAG_HIT},\n    {gBattleAnimSpriteGfx_Hit, 0x0A00, ANIM_TAG_HIT_2},\n    {gBattleAnimSpriteGfx_BlueShards, 0x0380, ANIM_TAG_BLUE_SHARDS},\n    {gBattleAnimSpriteGfx_ClosingEye, 0x0300, ANIM_TAG_CLOSING_EYE},\n    {gBattleAnimSpriteGfx_WavingHand, 0x0A00, ANIM_TAG_WAVING_HAND},\n    {gBattleAnimSpriteGfx_HitDuplicate, 0x0A00, ANIM_TAG_HIT_DUPLICATE},\n    {gBattleAnimSpriteGfx_Leer, 0x0A00, ANIM_TAG_LEER},\n    {gBattleAnimSpriteGfx_BlueBurst, 0x0A00, ANIM_TAG_BLUE_BURST},\n    {gBattleAnimSpriteGfx_SmallEmber, 0x0A00, ANIM_TAG_SMALL_EMBER},\n    {gBattleAnimSpriteGfx_GraySmoke, 0x0A00, ANIM_TAG_GRAY_SMOKE},\n    {gBattleAnimSpriteGfx_BlueStar, 0x0E00, ANIM_TAG_BLUE_STAR},\n    {gBattleAnimSpriteGfx_BubbleBurst, 0x0380, ANIM_TAG_BUBBLE_BURST},\n    {gBattleAnimSpriteGfx_Fire, 0x1000, ANIM_TAG_FIRE},\n    {gBattleAnimSpriteGfx_SpinningFire, 0x0800, ANIM_TAG_SPINNING_FIRE},\n    {gBattleAnimSpriteGfx_FirePlume, 0x0A00, ANIM_TAG_FIRE_PLUME},\n    {gBattleAnimSpriteGfx_Lightning2, 0x0800, ANIM_TAG_LIGHTNING_2},\n    {gBattleAnimSpriteGfx_Lightning, 0x0A00, ANIM_TAG_LIGHTNING},\n    {gBattleAnimSpriteGfx_ClawSlash2, 0x0A00, ANIM_TAG_CLAW_SLASH_2},\n    {gBattleAnimSpriteGfx_ClawSlash, 0x0A00, ANIM_TAG_CLAW_SLASH},\n    {gBattleAnimSpriteGfx_Scratch3, 0x0A00, ANIM_TAG_SCRATCH_3},\n    {gBattleAnimSpriteGfx_Scratch2, 0x0A00, ANIM_TAG_SCRATCH_2},\n    {gBattleAnimSpriteGfx_BubbleBurst2, 0x0A00, ANIM_TAG_BUBBLE_BURST_2},\n    {gBattleAnimSpriteGfx_IceChunk, 0x0A00, ANIM_TAG_ICE_CHUNK},\n    {gBattleAnimSpriteGfx_Glass2, 0x0A00, ANIM_TAG_GLASS_2},\n    {gBattleAnimSpriteGfx_PinkHeart2, 0x0A00, ANIM_TAG_PINK_HEART_2},\n    {gBattleAnimSpriteGfx_SapDrip, 0x1000, ANIM_TAG_SAP_DRIP},\n    {gBattleAnimSpriteGfx_SapDrip, 0x1000, ANIM_TAG_SAP_DRIP_2},\n    {gBattleAnimSpriteGfx_Sparkle1, 0x1000, ANIM_TAG_SPARKLE_1},\n    {gBattleAnimSpriteGfx_Sparkle1, 0x1000, ANIM_TAG_SPARKLE_2},\n    {gBattleAnimSpriteGfx_HumanoidFoot, 0x0200, ANIM_TAG_HUMANOID_FOOT},\n    {gBattleAnimSpriteGfx_MonsterFoot, 0x0200, ANIM_TAG_MONSTER_FOOT},\n    {gBattleAnimSpriteGfx_HumanoidHand, 0x0200, ANIM_TAG_HUMANOID_HAND},\n    {gBattleAnimSpriteGfx_NoiseLine, 0x0800, ANIM_TAG_NOISE_LINE},\n    {gBattleAnimSpriteGfx_YellowUnk, 0x0080, ANIM_TAG_YELLOW_UNK},\n    {gBattleAnimSpriteGfx_RedFist, 0x0200, ANIM_TAG_RED_FIST},\n    {gBattleAnimSpriteGfx_SlamHit, 0x1000, ANIM_TAG_SLAM_HIT},\n    {gBattleAnimSpriteGfx_Ring, 0x0180, ANIM_TAG_RING},\n    {gBattleAnimSpriteGfx_Rocks, 0x0C00, ANIM_TAG_ROCKS},\n    {gBattleAnimSpriteGfx_Z, 0x0100, ANIM_TAG_Z},\n    {gBattleAnimSpriteGfx_YellowUnk2, 0x0040, ANIM_TAG_YELLOW_UNK_2},\n    {gBattleAnimSpriteGfx_AirSlash, 0x0180, ANIM_TAG_AIR_SLASH},\n    {gBattleAnimSpriteGfx_SpinningGreenOrbs, 0x0800, ANIM_TAG_SPINNING_GREEN_ORBS},\n    {gBattleAnimSpriteGfx_Leaf, 0x0480, ANIM_TAG_LEAF},\n    {gBattleAnimSpriteGfx_Finger, 0x0200, ANIM_TAG_FINGER},\n    {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_POISON_POWDER},\n    {gBattleAnimSpriteGfx_BrownTriangle, 0x0100, ANIM_TAG_BROWN_TRIANGLE},\n    {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_SLEEP_POWDER},\n    {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_STUN_SPORE},\n    {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_POWDER},\n    {gBattleAnimSpriteGfx_Sparkle3, 0x0200, ANIM_TAG_SPARKLE_3},\n    {gBattleAnimSpriteGfx_Sparkle4, 0x0A00, ANIM_TAG_SPARKLE_4},\n    {gBattleAnimSpriteGfx_MusicNotes, 0x0300, ANIM_TAG_MUSIC_NOTES},\n    {gBattleAnimSpriteGfx_Duck, 0x0180, ANIM_TAG_DUCK},\n    {gBattleAnimSpriteGfx_MudSand, 0x00A0, ANIM_TAG_MUD_SAND},\n    {gBattleAnimSpriteGfx_Alert, 0x0700, ANIM_TAG_ALERT},\n    {gBattleAnimSpriteGfx_BlueFlames, 0x0400, ANIM_TAG_BLUE_FLAMES},\n    {gBattleAnimSpriteGfx_BlueFlames2, 0x0200, ANIM_TAG_BLUE_FLAMES_2},\n    {gBattleAnimSpriteGfx_Shock4, 0x0300, ANIM_TAG_SHOCK_4},\n    {gBattleAnimSpriteGfx_Shock, 0x0C00, ANIM_TAG_SHOCK},\n    {gBattleAnimSpriteGfx_Bell2, 0x0A00, ANIM_TAG_BELL_2},\n    {gBattleAnimSpriteGfx_PinkGlove, 0x0080, ANIM_TAG_PINK_GLOVE},\n    {gBattleAnimSpriteGfx_BlueLines, 0x0040, ANIM_TAG_BLUE_LINES},\n    {gBattleAnimSpriteGfx_Impact3, 0x0E00, ANIM_TAG_IMPACT_3},\n    {gBattleAnimSpriteGfx_Impact2, 0x0E00, ANIM_TAG_IMPACT_2},\n    {gBattleAnimSpriteGfx_Reticle, 0x0280, ANIM_TAG_RETICLE},\n    {gBattleAnimSpriteGfx_Breath, 0x0200, ANIM_TAG_BREATH},\n    {gBattleAnimSpriteGfx_Anger, 0x0080, ANIM_TAG_ANGER},\n    {gBattleAnimSpriteGfx_Snowball, 0x00C0, ANIM_TAG_SNOWBALL},\n    {gBattleAnimSpriteGfx_Vine, 0x0A00, ANIM_TAG_VINE},\n    {gBattleAnimSpriteGfx_Sword2, 0x0200, ANIM_TAG_SWORD_2},\n    {gBattleAnimSpriteGfx_Clapping, 0x0180, ANIM_TAG_CLAPPING},\n    {gBattleAnimSpriteGfx_RedTube, 0x0080, ANIM_TAG_RED_TUBE},\n    {gBattleAnimSpriteGfx_Amnesia, 0x1000, ANIM_TAG_AMNESIA},\n    {gBattleAnimSpriteGfx_String2, 0x0A00, ANIM_TAG_STRING_2},\n    {gBattleAnimSpriteGfx_Pencil2, 0x0180, ANIM_TAG_PENCIL_2},\n    {gBattleAnimSpriteGfx_Petal, 0x0380, ANIM_TAG_PETAL},\n    {gBattleAnimSpriteGfx_BentSpoon, 0x0C00, ANIM_TAG_BENT_SPOON},\n    {gBattleAnimSpriteGfx_Web, 0x0200, ANIM_TAG_WEB},\n    {gBattleAnimSpriteGfx_MilkBottle, 0x0200, ANIM_TAG_MILK_BOTTLE},\n    {gBattleAnimSpriteGfx_Coin, 0x0200, ANIM_TAG_COIN},\n    {gBattleAnimSpriteGfx_CrackedEgg, 0x0200, ANIM_TAG_CRACKED_EGG},\n    {gBattleAnimSpriteGfx_HatchedEgg, 0x0400, ANIM_TAG_HATCHED_EGG},\n    {gBattleAnimSpriteGfx_FreshEgg, 0x0080, ANIM_TAG_FRESH_EGG},\n    {gBattleAnimSpriteGfx_Fangs, 0x0400, ANIM_TAG_FANGS},\n    {gBattleAnimSpriteGfx_Explosion2, 0x0c00, ANIM_TAG_EXPLOSION_2},\n    {gBattleAnimSpriteGfx_Explosion3, 0x0200, ANIM_TAG_EXPLOSION_3},\n    {gBattleAnimSpriteGfx_WaterDroplet, 0x1000, ANIM_TAG_WATER_DROPLET},\n    {gBattleAnimSpriteGfx_WaterDroplet2, 0x0a00, ANIM_TAG_WATER_DROPLET_2},\n    {gBattleAnimSpriteGfx_Seed2, 0x0020, ANIM_TAG_SEED_2},\n    {gBattleAnimSpriteGfx_Sprout, 0x0e00, ANIM_TAG_SPROUT},\n    {gBattleAnimSpriteGfx_RedWand, 0x0080, ANIM_TAG_RED_WAND},\n    {gBattleAnimSpriteGfx_PurpleGreenUnk, 0x0a00, ANIM_TAG_PURPLE_GREEN_UNK},\n    {gBattleAnimSpriteGfx_WaterColumn, 0x0400, ANIM_TAG_WATER_COLUMN},\n    {gBattleAnimSpriteGfx_MudUnk, 0x0200, ANIM_TAG_MUD_UNK},\n    {gBattleAnimSpriteGfx_RainDrops, 0x0700, ANIM_TAG_RAIN_DROPS},\n    {gBattleAnimSpriteGfx_FurySwipes, 0x0800, ANIM_TAG_FURY_SWIPES},\n    {gBattleAnimSpriteGfx_Vine2, 0x0a00, ANIM_TAG_VINE_2},\n    {gBattleAnimSpriteGfx_Teeth, 0x0600, ANIM_TAG_TEETH},\n    {gBattleAnimSpriteGfx_Bone2, 0x0800, ANIM_TAG_BONE_2},\n    {gBattleAnimSpriteGfx_WhiteBag, 0x0200, ANIM_TAG_WHITE_BAG},\n    {gBattleAnimSpriteGfx_Unknown, 0x0040, ANIM_TAG_UNKNOWN},\n    {gBattleAnimSpriteGfx_PurpleCoral, 0x0180, ANIM_TAG_PURPLE_CORAL},\n    {gBattleAnimSpriteGfx_PurpleDroplet, 0x0600, ANIM_TAG_PURPLE_DROPLET},\n    {gBattleAnimSpriteGfx_Shock2, 0x0600, ANIM_TAG_SHOCK_2},\n    {gBattleAnimSpriteGfx_ClosingEye2, 0x0200, ANIM_TAG_CLOSING_EYE_2},\n    {gBattleAnimSpriteGfx_MetalBall, 0x0080, ANIM_TAG_METAL_BALL},\n    {gBattleAnimSpriteGfx_MonsterDoll, 0x0200, ANIM_TAG_MONSTER_DOLL},\n    {gBattleAnimSpriteGfx_Whirlwind, 0x0800, ANIM_TAG_WHIRLWIND},\n    {gBattleAnimSpriteGfx_Whirlwind2, 0x0080, ANIM_TAG_WHIRLWIND_2},\n    {gBattleAnimSpriteGfx_Explosion4, 0x0a00, ANIM_TAG_EXPLOSION_4},\n    {gBattleAnimSpriteGfx_Explosion5, 0x0280, ANIM_TAG_EXPLOSION_5},\n    {gBattleAnimSpriteGfx_Tongue, 0x0280, ANIM_TAG_TONGUE},\n    {gBattleAnimSpriteGfx_Smoke, 0x0100, ANIM_TAG_SMOKE},\n    {gBattleAnimSpriteGfx_Smoke2, 0x0200, ANIM_TAG_SMOKE_2},\n    {gBattleAnimSpriteGfx_Impact, 0x0200, ANIM_TAG_IMPACT},\n    {gBattleAnimSpriteGfx_CircleImpact, 0x0020, ANIM_TAG_CIRCLE_IMPACT},\n    {gBattleAnimSpriteGfx_Scratch, 0x0a00, ANIM_TAG_SCRATCH},\n    {gBattleAnimSpriteGfx_Cut, 0x0800, ANIM_TAG_CUT},\n    {gBattleAnimSpriteGfx_SharpTeeth, 0x0800, ANIM_TAG_SHARP_TEETH},\n    {gBattleAnimSpriteGfx_RainbowRings, 0x00c0, ANIM_TAG_RAINBOW_RINGS},\n    {gBattleAnimSpriteGfx_IceCrystals, 0x01c0, ANIM_TAG_ICE_CRYSTALS},\n    {gBattleAnimSpriteGfx_IceSpikes, 0x0100, ANIM_TAG_ICE_SPIKES},\n    {gBattleAnimSpriteGfx_HandsAndFeet, 0x0800, ANIM_TAG_HANDS_AND_FEET},\n    {gBattleAnimSpriteGfx_MistCloud, 0x0200, ANIM_TAG_MIST_CLOUD},\n    {gBattleAnimSpriteGfx_Clamp, 0x0800, ANIM_TAG_CLAMP},\n    {gBattleAnimSpriteGfx_Bubble, 0x0180, ANIM_TAG_BUBBLE},\n    {gBattleAnimSpriteGfx_Orbs, 0x0180, ANIM_TAG_ORBS},\n    {gBattleAnimSpriteGfx_WaterImpact, 0x0200, ANIM_TAG_WATER_IMPACT},\n    {gBattleAnimSpriteGfx_WaterOrb, 0x0200, ANIM_TAG_WATER_ORB},\n    {gBattleAnimSpriteGfx_PoisonBubble, 0x0180, ANIM_TAG_POISON_BUBBLE},\n    {gBattleAnimSpriteGfx_ToxicBubble, 0x0400, ANIM_TAG_TOXIC_BUBBLE},\n    {gBattleAnimSpriteGfx_Spikes, 0x0080, ANIM_TAG_SPIKES},\n    {gBattleAnimSpriteGfx_HornHit2, 0x0100, ANIM_TAG_HORN_HIT_2},\n    {gBattleAnimSpriteGfx_AirWave2, 0x0100, ANIM_TAG_AIR_WAVE_2},\n    {gBattleAnimSpriteGfx_SmallBubbles, 0x0140, ANIM_TAG_SMALL_BUBBLES},\n    {gBattleAnimSpriteGfx_RoundShadow, 0x0800, ANIM_TAG_ROUND_SHADOW},\n    {gBattleAnimSpriteGfx_Sunlight, 0x0200, ANIM_TAG_SUNLIGHT},\n    {gBattleAnimSpriteGfx_Spore, 0x0100, ANIM_TAG_SPORE},\n    {gBattleAnimSpriteGfx_Flower, 0x00a0, ANIM_TAG_FLOWER},\n    {gBattleAnimSpriteGfx_RazorLeaf, 0x0100, ANIM_TAG_RAZOR_LEAF},\n    {gBattleAnimSpriteGfx_Needle, 0x0080, ANIM_TAG_NEEDLE},\n    {gBattleAnimSpriteGfx_WhirlwindLines, 0x0300, ANIM_TAG_WHIRLWIND_LINES},\n    {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_GOLD_RING},\n    {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_PURPLE_RING},\n    {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_BLUE_RING},\n    {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_GREEN_LIGHT_WALL},\n    {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_BLUE_LIGHT_WALL},\n    {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_RED_LIGHT_WALL},\n    {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_GRAY_LIGHT_WALL},\n    {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_ORANGE_LIGHT_WALL},\n    {gBattleAnimSpriteGfx_BlackBall2, 0x0080, ANIM_TAG_BLACK_BALL_2},\n    {gBattleAnimSpriteGfx_MistCloud, 0x0200, ANIM_TAG_PURPLE_GAS_CLOUD},\n    {gBattleAnimSpriteGfx_SparkH, 0x0200, ANIM_TAG_SPARK_H},\n    {gBattleAnimSpriteGfx_YellowStar, 0x0200, ANIM_TAG_YELLOW_STAR},\n    {gBattleAnimSpriteGfx_LargeFreshEgg, 0x0080, ANIM_TAG_LARGE_FRESH_EGG},\n    {gBattleAnimSpriteGfx_ShadowBall, 0x0200, ANIM_TAG_SHADOW_BALL},\n    {gBattleAnimSpriteGfx_Lick, 0x0500, ANIM_TAG_LICK},\n    {gBattleAnimSpriteGfx_VoidLines, 0x0800, ANIM_TAG_VOID_LINES},\n    {gBattleAnimSpriteGfx_String, 0x0400, ANIM_TAG_STRING},\n    {gBattleAnimSpriteGfx_WebThread, 0x0020, ANIM_TAG_WEB_THREAD},\n    {gBattleAnimSpriteGfx_SpiderWeb, 0x0800, ANIM_TAG_SPIDER_WEB},\n    {gBattleAnimSpriteGfx_Lightbulb, 0x0100, ANIM_TAG_LIGHTBULB},\n    {gBattleAnimSpriteGfx_Slash, 0x0800, ANIM_TAG_SLASH},\n    {gBattleAnimSpriteGfx_FocusEnergy, 0x0400, ANIM_TAG_FOCUS_ENERGY},\n    {gBattleAnimSpriteGfx_SphereToCube, 0x0a00, ANIM_TAG_SPHERE_TO_CUBE},\n    {gBattleAnimSpriteGfx_Tendrils, 0x1000, ANIM_TAG_TENDRILS},\n    {gBattleAnimSpriteGfx_Eye, 0x0800, ANIM_TAG_EYE},\n    {gBattleAnimSpriteGfx_WhiteShadow, 0x0400, ANIM_TAG_WHITE_SHADOW},\n    {gBattleAnimSpriteGfx_TealAlert, 0x0200, ANIM_TAG_TEAL_ALERT},\n    {gBattleAnimSpriteGfx_OpeningEye, 0x0800, ANIM_TAG_OPENING_EYE},\n    {gBattleAnimSpriteGfx_RoundWhiteHalo, 0x0800, ANIM_TAG_ROUND_WHITE_HALO},\n    {gBattleAnimSpriteGfx_FangAttack, 0x0800, ANIM_TAG_FANG_ATTACK},\n    {gBattleAnimSpriteGfx_PurpleHandOutline, 0x0200, ANIM_TAG_PURPLE_HAND_OUTLINE},\n    {gBattleAnimSpriteGfx_Moon, 0x0800, ANIM_TAG_MOON},\n    {gBattleAnimSpriteGfx_GreenSparkle, 0x0200, ANIM_TAG_GREEN_SPARKLE},\n    {gBattleAnimSpriteGfx_Spiral, 0x0800, ANIM_TAG_SPIRAL},\n    {gBattleAnimSpriteGfx_SnoreZ, 0x0200, ANIM_TAG_SNORE_Z},\n    {gBattleAnimSpriteGfx_Explosion, 0x0800, ANIM_TAG_EXPLOSION},\n    {gBattleAnimSpriteGfx_Nail, 0x0400, ANIM_TAG_NAIL},\n    {gBattleAnimSpriteGfx_GhostlySpirit, 0x0200, ANIM_TAG_GHOSTLY_SPIRIT},\n    {gBattleAnimSpriteGfx_WarmRock, 0x0a80, ANIM_TAG_WARM_ROCK},\n    {gBattleAnimSpriteGfx_BreakingEgg, 0x0600, ANIM_TAG_BREAKING_EGG},\n    {gBattleAnimSpriteGfx_ThinRing, 0x0800, ANIM_TAG_THIN_RING},\n    {gBattleAnimSpriteGfx_PunchImpact, 0x0200, ANIM_TAG_PUNCH_IMPACT},\n    {gBattleAnimSpriteGfx_Bell, 0x0600, ANIM_TAG_BELL},\n    {gBattleAnimSpriteGfx_MusicNotes2, 0x0800, ANIM_TAG_MUSIC_NOTES_2},\n    {gBattleAnimSpriteGfx_SpeedDust, 0x0180, ANIM_TAG_SPEED_DUST},\n    {gBattleAnimSpriteGfx_TornMetal, 0x0800, ANIM_TAG_TORN_METAL},\n    {gBattleAnimSpriteGfx_ThoughtBubble, 0x0800, ANIM_TAG_THOUGHT_BUBBLE},\n    {gBattleAnimSpriteGfx_MagentaHeart, 0x0080, ANIM_TAG_MAGENTA_HEART},\n    {gBattleAnimSpriteGfx_ElectricOrbs, 0x0080, ANIM_TAG_ELECTRIC_ORBS},\n    {gBattleAnimSpriteGfx_CircleOfLight, 0x0800, ANIM_TAG_CIRCLE_OF_LIGHT},\n    {gBattleAnimSpriteGfx_Electricity, 0x0800, ANIM_TAG_ELECTRICITY},\n    {gBattleAnimSpriteGfx_Finger2, 0x0600, ANIM_TAG_FINGER_2},\n    {gBattleAnimSpriteGfx_MovementWaves, 0x0600, ANIM_TAG_MOVEMENT_WAVES},\n    {gBattleAnimSpriteGfx_MagentaHeart, 0x0080, ANIM_TAG_RED_HEART},\n    {gBattleAnimSpriteGfx_RedOrb, 0x0080, ANIM_TAG_RED_ORB},\n    {gBattleAnimSpriteGfx_EyeSparkle, 0x0180, ANIM_TAG_EYE_SPARKLE},\n    {gBattleAnimSpriteGfx_MagentaHeart, 0x0080, ANIM_TAG_PINK_HEART},\n    {gBattleAnimSpriteGfx_Angel, 0x0200, ANIM_TAG_ANGEL},\n    {gBattleAnimSpriteGfx_Devil, 0x0400, ANIM_TAG_DEVIL},\n    {gBattleAnimSpriteGfx_Swipe, 0x0a00, ANIM_TAG_SWIPE},\n    {gBattleAnimSpriteGfx_Roots, 0x0800, ANIM_TAG_ROOTS},\n    {gBattleAnimSpriteGfx_ItemBag, 0x0200, ANIM_TAG_ITEM_BAG},\n    {gBattleAnimSpriteGfx_JaggedMusicNote, 0x0400, ANIM_TAG_JAGGED_MUSIC_NOTE},\n    {gBattleAnimSpriteGfx_Pokeball, 0x0080, ANIM_TAG_POKEBALL},\n    {gBattleAnimSpriteGfx_Spotlight, 0x0800, ANIM_TAG_SPOTLIGHT},\n    {gBattleAnimSpriteGfx_LetterZ, 0x0200, ANIM_TAG_LETTER_Z},\n    {gBattleAnimSpriteGfx_RapidSpin, 0x0300, ANIM_TAG_RAPID_SPIN},\n    {gBattleAnimSpriteGfx_TriAttackTriangle, 0x0800, ANIM_TAG_TRI_ATTACK_TRIANGLE},\n    {gBattleAnimSpriteGfx_WispOrb, 0x0380, ANIM_TAG_WISP_ORB},\n    {gBattleAnimSpriteGfx_WispFire, 0x0800, ANIM_TAG_WISP_FIRE},\n    {gBattleAnimSpriteGfx_GoldStars, 0x00c0, ANIM_TAG_GOLD_STARS},\n    {gBattleAnimSpriteGfx_EclipsingOrb, 0x0800, ANIM_TAG_ECLIPSING_ORB},\n    {gBattleAnimSpriteGfx_GrayOrb, 0x0060, ANIM_TAG_GRAY_ORB},\n    {gBattleAnimSpriteGfx_GrayOrb, 0x0060, ANIM_TAG_BLUE_ORB},\n    {gBattleAnimSpriteGfx_GrayOrb, 0x0060, ANIM_TAG_RED_ORB_2},\n    {gBattleAnimSpriteGfx_PinkPetal, 0x0080, ANIM_TAG_PINK_PETAL},\n    {gBattleAnimSpriteGfx_PainSplit, 0x0180, ANIM_TAG_PAIN_SPLIT},\n    {gBattleAnimSpriteGfx_Confetti, 0x0180, ANIM_TAG_CONFETTI},\n    {gBattleAnimSpriteGfx_GreenStar, 0x0200, ANIM_TAG_GREEN_STAR},\n    {gBattleAnimSpriteGfx_PinkCloud, 0x0200, ANIM_TAG_PINK_CLOUD},\n    {gBattleAnimSpriteGfx_SweatDrop, 0x0020, ANIM_TAG_SWEAT_DROP},\n    {gBattleAnimSpriteGfx_GuardRing, 0x0400, ANIM_TAG_GUARD_RING},\n    {gBattleAnimSpriteGfx_PurpleScratch, 0x0600, ANIM_TAG_PURPLE_SCRATCH},\n    {gBattleAnimSpriteGfx_PurpleSwipe, 0x1000, ANIM_TAG_PURPLE_SWIPE},\n    {gBattleAnimSpriteGfx_TagHand, 0x0400, ANIM_TAG_TAG_HAND},\n    {gBattleAnimSpriteGfx_SmallRedEye, 0x0020, ANIM_TAG_SMALL_RED_EYE},\n    {gBattleAnimSpriteGfx_HollowOrb, 0x0080, ANIM_TAG_HOLLOW_ORB},\n    {gBattleAnimSpriteGfx_XSign, 0x0800, ANIM_TAG_X_SIGN},\n    {gBattleAnimSpriteGfx_BluegreenOrb, 0x0080, ANIM_TAG_BLUEGREEN_ORB},\n    {gBattleAnimSpriteGfx_PawPrint, 0x0200, ANIM_TAG_PAW_PRINT},\n    {gBattleAnimSpriteGfx_PurpleFlame, 0x0400, ANIM_TAG_PURPLE_FLAME},\n    {gBattleAnimSpriteGfx_RedBall, 0x0200, ANIM_TAG_RED_BALL},\n    {gBattleAnimSpriteGfx_SmellingsaltEffect, 0x0200, ANIM_TAG_SMELLINGSALT_EFFECT},\n    {gBattleAnimSpriteGfx_Meteor, 0x0800, ANIM_TAG_METEOR},\n    {gBattleAnimSpriteGfx_FlatRock, 0x0280, ANIM_TAG_FLAT_ROCK},\n    {gBattleAnimSpriteGfx_MagnifyingGlass, 0x0200, ANIM_TAG_MAGNIFYING_GLASS},\n    {gBattleAnimSpriteGfx_WaterOrb, 0x0200, ANIM_TAG_BROWN_ORB},\n    {gBattleAnimSpriteGfx_MetalSoundWaves, 0x0400, ANIM_TAG_METAL_SOUND_WAVES},\n    {gBattleAnimSpriteGfx_FlyingDirt, 0x0200, ANIM_TAG_FLYING_DIRT},\n    {gBattleAnimSpriteGfx_IcicleSpear, 0x0200, ANIM_TAG_ICICLE_SPEAR},\n    {gBattleAnimSpriteGfx_Hail, 0x0080, ANIM_TAG_HAIL},\n    {gBattleAnimSpriteGfx_GlowyRedOrb, 0x0020, ANIM_TAG_GLOWY_RED_ORB},\n    {gBattleAnimSpriteGfx_GlowyRedOrb, 0x0020, ANIM_TAG_GLOWY_GREEN_ORB},\n    {gBattleAnimSpriteGfx_GreenSpike, 0x0080, ANIM_TAG_GREEN_SPIKE},\n    {gBattleAnimSpriteGfx_CircleOfLight, 0x0800, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT},\n    {gBattleAnimSpriteGfx_GlowyRedOrb, 0x0020, ANIM_TAG_GLOWY_BLUE_ORB},\n    {gBattleAnimSpriteGfx_SafariBait, 0x0080, ANIM_TAG_SAFARI_BAIT},\n    {gBattleAnimSpriteGfx_WhiteFeather, 0x0400, ANIM_TAG_WHITE_FEATHER},\n    {gBattleAnimSpriteGfx_Sparkle6, 0x0080, ANIM_TAG_SPARKLE_6},\n    {gBattleAnimSpriteGfx_Splash, 0x0800, ANIM_TAG_SPLASH},\n    {gBattleAnimSpriteGfx_SweatBead, 0x0020, ANIM_TAG_SWEAT_BEAD},\n    {gBattleAnimSpriteGfx_Gem1, 0x0800, ANIM_TAG_GEM_1},\n    {gBattleAnimSpriteGfx_Gem2, 0x0800, ANIM_TAG_GEM_2},\n    {gBattleAnimSpriteGfx_Gem3, 0x0800, ANIM_TAG_GEM_3},\n    {gBattleAnimSpriteGfx_SlamHit2, 0x1000, ANIM_TAG_SLAM_HIT_2},\n    {gBattleAnimSpriteGfx_Recycle, 0x0800, ANIM_TAG_RECYCLE},\n    {gBattleAnimSpriteGfx_RedParticles, 0x00a0, ANIM_TAG_RED_PARTICLES},\n    {gBattleAnimSpriteGfx_Protect, 0x0800, ANIM_TAG_PROTECT},\n    {gBattleAnimSpriteGfx_DirtMound, 0x0200, ANIM_TAG_DIRT_MOUND},\n    {gBattleAnimSpriteGfx_Shock3, 0x0600, ANIM_TAG_SHOCK_3},\n    {gBattleAnimSpriteGfx_WeatherBall, 0x0200, ANIM_TAG_WEATHER_BALL},\n    {gBattleAnimSpriteGfx_Bird, 0x0800, ANIM_TAG_BIRD},\n    {gBattleAnimSpriteGfx_CrossImpact, 0x0200, ANIM_TAG_CROSS_IMPACT},\n    {gBattleAnimSpriteGfx_Slash, 0x0800, ANIM_TAG_SLASH_2},\n    {gBattleAnimSpriteGfx_SlamHit, 0x1000, ANIM_TAG_WHIP_HIT},\n    {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_BLUE_RING_2},\n};\n\nconst struct CompressedSpritePalette gBattleAnimPaletteTable[] =\n{\n    {gBattleAnimSpritePal_Bone, ANIM_TAG_BONE},\n    {gBattleAnimSpritePal_Spark, ANIM_TAG_SPARK},\n    {gBattleAnimSpritePal_Pencil, ANIM_TAG_PENCIL},\n    {gBattleAnimSpritePal_AirWave, ANIM_TAG_AIR_WAVE},\n    {gBattleAnimSpritePal_Orb, ANIM_TAG_ORB},\n    {gBattleAnimSpritePal_Sword, ANIM_TAG_SWORD},\n    {gBattleAnimSpritePal_Seed, ANIM_TAG_SEED},\n    {gBattleAnimSpritePal_Explosion6, ANIM_TAG_EXPLOSION_6},\n    {gBattleAnimSpritePal_PinkOrb, ANIM_TAG_PINK_ORB},\n    {gBattleAnimSpritePal_Gust, ANIM_TAG_GUST},\n    {gBattleAnimSpritePal_IceCube, ANIM_TAG_ICE_CUBE},\n    {gBattleAnimSpritePal_Spark2, ANIM_TAG_SPARK_2},\n    {gBattleAnimSpritePal_Orange, ANIM_TAG_ORANGE},\n    {gBattleAnimSpritePal_YellowBall, ANIM_TAG_YELLOW_BALL},\n    {gBattleAnimSpritePal_LockOn, ANIM_TAG_LOCK_ON},\n    {gBattleAnimSpritePal_TiedBag, ANIM_TAG_TIED_BAG},\n    {gBattleAnimSpritePal_BlackSmoke, ANIM_TAG_BLACK_SMOKE},\n    {gBattleAnimSpritePal_BlackSmoke, ANIM_TAG_BLACK_BALL},\n    {gBattleAnimSpritePal_Conversion, ANIM_TAG_CONVERSION},\n    {gBattleAnimSpritePal_Glass, ANIM_TAG_GLASS},\n    {gBattleAnimSpritePal_HornHit, ANIM_TAG_HORN_HIT},\n    {gBattleAnimSpritePal_Hit, ANIM_TAG_HIT},\n    {gBattleAnimSpritePal_Hit2, ANIM_TAG_HIT_2},\n    {gBattleAnimSpritePal_BlueShards, ANIM_TAG_BLUE_SHARDS},\n    {gBattleAnimSpritePal_ClosingEye, ANIM_TAG_CLOSING_EYE},\n    {gBattleAnimSpritePal_WavingHand, ANIM_TAG_WAVING_HAND},\n    {gBattleAnimSpritePal_HitDuplicate, ANIM_TAG_HIT_DUPLICATE},\n    {gBattleAnimSpritePal_Leer, ANIM_TAG_LEER},\n    {gBattleAnimSpritePal_BlueBurst, ANIM_TAG_BLUE_BURST},\n    {gBattleAnimSpritePal_SmallEmber, ANIM_TAG_SMALL_EMBER},\n    {gBattleAnimSpritePal_GraySmoke, ANIM_TAG_GRAY_SMOKE},\n    {gBattleAnimSpritePal_BlueStar, ANIM_TAG_BLUE_STAR},\n    {gBattleAnimSpritePal_BubbleBurst, ANIM_TAG_BUBBLE_BURST},\n    {gBattleAnimSpritePal_Fire, ANIM_TAG_FIRE},\n    {gBattleAnimSpritePal_Fire, ANIM_TAG_SPINNING_FIRE},\n    {gBattleAnimSpritePal_Fire, ANIM_TAG_FIRE_PLUME},\n    {gBattleAnimSpritePal_Lightning2, ANIM_TAG_LIGHTNING_2},\n    {gBattleAnimSpritePal_Lightning2, ANIM_TAG_LIGHTNING},\n    {gBattleAnimSpritePal_ClawSlash2, ANIM_TAG_CLAW_SLASH_2},\n    {gBattleAnimSpritePal_ClawSlash, ANIM_TAG_CLAW_SLASH},\n    {gBattleAnimSpritePal_ClawSlash2, ANIM_TAG_SCRATCH_3},\n    {gBattleAnimSpritePal_ClawSlash2, ANIM_TAG_SCRATCH_2},\n    {gBattleAnimSpritePal_BubbleBurst2, ANIM_TAG_BUBBLE_BURST_2},\n    {gBattleAnimSpritePal_IceChunk, ANIM_TAG_ICE_CHUNK},\n    {gBattleAnimSpritePal_Glass2, ANIM_TAG_GLASS_2},\n    {gBattleAnimSpritePal_PinkHeart2, ANIM_TAG_PINK_HEART_2},\n    {gBattleAnimSpritePal_SapDrip, ANIM_TAG_SAP_DRIP},\n    {gBattleAnimSpritePal_SapDrip2, ANIM_TAG_SAP_DRIP},\n    {gBattleAnimSpritePal_Sparkle1, ANIM_TAG_SPARKLE_1},\n    {gBattleAnimSpritePal_Sparkle2, ANIM_TAG_SPARKLE_2},\n    {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_HUMANOID_FOOT},\n    {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_MONSTER_FOOT},\n    {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_HUMANOID_HAND},\n    {gBattleAnimSpritePal_HitDuplicate, ANIM_TAG_NOISE_LINE},\n    {gBattleAnimSpritePal_YellowUnk, ANIM_TAG_YELLOW_UNK},\n    {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_RED_FIST},\n    {gBattleAnimSpritePal_SlamHit, ANIM_TAG_SLAM_HIT},\n    {gBattleAnimSpritePal_Ring, ANIM_TAG_RING},\n    {gBattleAnimSpritePal_Rocks, ANIM_TAG_ROCKS},\n    {gBattleAnimSpritePal_Z, ANIM_TAG_Z},\n    {gBattleAnimSpritePal_YellowUnk2, ANIM_TAG_YELLOW_UNK_2},\n    {gBattleAnimSpritePal_AirSlash, ANIM_TAG_AIR_SLASH},\n    {gBattleAnimSpritePal_SpinningGreenOrbs, ANIM_TAG_SPINNING_GREEN_ORBS},\n    {gBattleAnimSpritePal_Leaf, ANIM_TAG_LEAF},\n    {gBattleAnimSpritePal_Finger, ANIM_TAG_FINGER},\n    {gBattleAnimSpritePal_PoisonPowder, ANIM_TAG_POISON_POWDER},\n    {gBattleAnimSpritePal_BrownTriangle, ANIM_TAG_BROWN_TRIANGLE},\n    {gBattleAnimSpritePal_SleepPowder, ANIM_TAG_SLEEP_POWDER},\n    {gBattleAnimSpritePal_StunSpore, ANIM_TAG_STUN_SPORE},\n    {gBattleAnimSpritePal_PoisonPowder, ANIM_TAG_POWDER},\n    {gBattleAnimSpritePal_Sparkle3, ANIM_TAG_SPARKLE_3},\n    {gBattleAnimSpritePal_Sparkle3, ANIM_TAG_SPARKLE_4},\n    {gBattleAnimSpritePal_MusicNotes, ANIM_TAG_MUSIC_NOTES},\n    {gBattleAnimSpritePal_Duck, ANIM_TAG_DUCK},\n    {gBattleAnimSpritePal_MudSand, ANIM_TAG_MUD_SAND},\n    {gBattleAnimSpritePal_Alert, ANIM_TAG_ALERT},\n    {gBattleAnimSpritePal_BlueFlames, ANIM_TAG_BLUE_FLAMES},\n    {gBattleAnimSpritePal_BlueFlames, ANIM_TAG_BLUE_FLAMES_2},\n    {gBattleAnimSpritePal_Shock4, ANIM_TAG_SHOCK_4},\n    {gBattleAnimSpritePal_Shock4, ANIM_TAG_SHOCK},\n    {gBattleAnimSpritePal_Bell2, ANIM_TAG_BELL_2},\n    {gBattleAnimSpritePal_PinkGlove, ANIM_TAG_PINK_GLOVE},\n    {gBattleAnimSpritePal_BlueLines, ANIM_TAG_BLUE_LINES},\n    {gBattleAnimSpritePal_Impact3, ANIM_TAG_IMPACT_3},\n    {gBattleAnimSpritePal_Impact2, ANIM_TAG_IMPACT_2},\n    {gBattleAnimSpritePal_Reticle, ANIM_TAG_RETICLE},\n    {gBattleAnimSpritePal_Breath, ANIM_TAG_BREATH},\n    {gBattleAnimSpritePal_Anger, ANIM_TAG_ANGER},\n    {gBattleAnimSpritePal_Snowball, ANIM_TAG_SNOWBALL},\n    {gBattleAnimSpritePal_Vine, ANIM_TAG_VINE},\n    {gBattleAnimSpritePal_Sword2, ANIM_TAG_SWORD_2},\n    {gBattleAnimSpritePal_Clapping, ANIM_TAG_CLAPPING},\n    {gBattleAnimSpritePal_RedTube, ANIM_TAG_RED_TUBE},\n    {gBattleAnimSpritePal_Amnesia, ANIM_TAG_AMNESIA},\n    {gBattleAnimSpritePal_String2, ANIM_TAG_STRING_2},\n    {gBattleAnimSpritePal_Pencil2, ANIM_TAG_PENCIL_2},\n    {gBattleAnimSpritePal_Petal, ANIM_TAG_PETAL},\n    {gBattleAnimSpritePal_BentSpoon, ANIM_TAG_BENT_SPOON},\n    {gBattleAnimSpritePal_String2, ANIM_TAG_WEB},\n    {gBattleAnimSpritePal_MilkBottle, ANIM_TAG_MILK_BOTTLE},\n    {gBattleAnimSpritePal_Coin, ANIM_TAG_COIN},\n    {gBattleAnimSpritePal_CrackedEgg, ANIM_TAG_CRACKED_EGG},\n    {gBattleAnimSpritePal_CrackedEgg, ANIM_TAG_HATCHED_EGG},\n    {gBattleAnimSpritePal_FreshEgg, ANIM_TAG_FRESH_EGG},\n    {gBattleAnimSpritePal_Fangs, ANIM_TAG_FANGS},\n    {gBattleAnimSpritePal_Explosion2, ANIM_TAG_EXPLOSION_2},\n    {gBattleAnimSpritePal_Explosion2, ANIM_TAG_EXPLOSION_3},\n    {gBattleAnimSpritePal_WaterDroplet, ANIM_TAG_WATER_DROPLET},\n    {gBattleAnimSpritePal_WaterDroplet, ANIM_TAG_WATER_DROPLET_2},\n    {gBattleAnimSpritePal_Seed2, ANIM_TAG_SEED_2},\n    {gBattleAnimSpritePal_Seed2, ANIM_TAG_SPROUT},\n    {gBattleAnimSpritePal_RedWand, ANIM_TAG_RED_WAND},\n    {gBattleAnimSpritePal_PurpleGreenUnk, ANIM_TAG_PURPLE_GREEN_UNK},\n    {gBattleAnimSpritePal_WaterColumn, ANIM_TAG_WATER_COLUMN},\n    {gBattleAnimSpritePal_MudUnk, ANIM_TAG_MUD_UNK},\n    {gBattleAnimSpritePal_RainDrops, ANIM_TAG_RAIN_DROPS},\n    {gBattleAnimSpritePal_FurySwipes, ANIM_TAG_FURY_SWIPES},\n    {gBattleAnimSpritePal_Vine2, ANIM_TAG_VINE_2},\n    {gBattleAnimSpritePal_Teeth, ANIM_TAG_TEETH},\n    {gBattleAnimSpritePal_Bone2, ANIM_TAG_BONE_2},\n    {gBattleAnimSpritePal_WhiteBag, ANIM_TAG_WHITE_BAG},\n    {gBattleAnimSpritePal_Unknown, ANIM_TAG_UNKNOWN},\n    {gBattleAnimSpritePal_PurpleCoral, ANIM_TAG_PURPLE_CORAL},\n    {gBattleAnimSpritePal_PurpleCoral, ANIM_TAG_PURPLE_DROPLET},\n    {gBattleAnimSpritePal_Shock2, ANIM_TAG_SHOCK_2},\n    {gBattleAnimSpritePal_ClosingEye2, ANIM_TAG_CLOSING_EYE_2},\n    {gBattleAnimSpritePal_MetalBall, ANIM_TAG_METAL_BALL},\n    {gBattleAnimSpritePal_MonsterDoll, ANIM_TAG_MONSTER_DOLL},\n    {gBattleAnimSpritePal_Whirlwind, ANIM_TAG_WHIRLWIND},\n    {gBattleAnimSpritePal_Whirlwind, ANIM_TAG_WHIRLWIND_2},\n    {gBattleAnimSpritePal_Explosion4, ANIM_TAG_EXPLOSION_4},\n    {gBattleAnimSpritePal_Explosion4, ANIM_TAG_EXPLOSION_5},\n    {gBattleAnimSpritePal_Tongue, ANIM_TAG_TONGUE},\n    {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE},\n    {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE_2},\n    {gBattleAnimSpritePal_Impact, ANIM_TAG_IMPACT},\n    {gBattleAnimSpritePal_CircleImpact, ANIM_TAG_CIRCLE_IMPACT},\n    {gBattleAnimSpritePal_Impact, ANIM_TAG_SCRATCH},\n    {gBattleAnimSpritePal_Impact, ANIM_TAG_CUT},\n    {gBattleAnimSpritePal_SharpTeeth, ANIM_TAG_SHARP_TEETH},\n    {gBattleAnimSpritePal_RainbowRings, ANIM_TAG_RAINBOW_RINGS},\n    {gBattleAnimSpritePal_IceCrystals, ANIM_TAG_ICE_CRYSTALS},\n    {gBattleAnimSpritePal_IceCrystals, ANIM_TAG_ICE_SPIKES},\n    {gBattleAnimSpritePal_HandsAndFeet, ANIM_TAG_HANDS_AND_FEET},\n    {gBattleAnimSpritePal_MistCloud, ANIM_TAG_MIST_CLOUD},\n    {gBattleAnimSpritePal_SharpTeeth, ANIM_TAG_CLAMP},\n    {gBattleAnimSpritePal_RainDrops, ANIM_TAG_BUBBLE},\n    {gBattleAnimSpritePal_Orbs, ANIM_TAG_ORBS},\n    {gBattleAnimSpritePal_WaterImpact, ANIM_TAG_WATER_IMPACT},\n    {gBattleAnimSpritePal_WaterImpact, ANIM_TAG_WATER_ORB},\n    {gBattleAnimSpritePal_PoisonBubble, ANIM_TAG_POISON_BUBBLE},\n    {gBattleAnimSpritePal_PoisonBubble, ANIM_TAG_TOXIC_BUBBLE},\n    {gBattleAnimSpritePal_Spikes, ANIM_TAG_SPIKES},\n    {gBattleAnimSpritePal_HornHit2, ANIM_TAG_HORN_HIT_2},\n    {gBattleAnimSpritePal_AirWave2, ANIM_TAG_AIR_WAVE_2},\n    {gBattleAnimSpritePal_SmallBubbles, ANIM_TAG_SMALL_BUBBLES},\n    {gBattleAnimSpritePal_RoundShadow, ANIM_TAG_ROUND_SHADOW},\n    {gBattleAnimSpritePal_Sunlight, ANIM_TAG_SUNLIGHT},\n    {gBattleAnimSpritePal_Spore, ANIM_TAG_SPORE},\n    {gBattleAnimSpritePal_Flower, ANIM_TAG_FLOWER},\n    {gBattleAnimSpritePal_RazorLeaf, ANIM_TAG_RAZOR_LEAF},\n    {gBattleAnimSpritePal_Needle, ANIM_TAG_NEEDLE},\n    {gBattleAnimSpritePal_WhirlwindLines, ANIM_TAG_WHIRLWIND_LINES},\n    {gBattleAnimSpritePal_GoldRing, ANIM_TAG_GOLD_RING},\n    {gBattleAnimSpritePal_PurpleRing, ANIM_TAG_PURPLE_RING},\n    {gBattleAnimSpritePal_BlueRing, ANIM_TAG_BLUE_RING},\n    {gBattleAnimSpritePal_GreenLightWall, ANIM_TAG_GREEN_LIGHT_WALL},\n    {gBattleAnimSpritePal_BlueLightWall, ANIM_TAG_BLUE_LIGHT_WALL},\n    {gBattleAnimSpritePal_RedLightWall, ANIM_TAG_RED_LIGHT_WALL},\n    {gBattleAnimSpritePal_GrayLightWall, ANIM_TAG_GRAY_LIGHT_WALL},\n    {gBattleAnimSpritePal_OrangeLightWall, ANIM_TAG_ORANGE_LIGHT_WALL},\n    {gBattleAnimSpritePal_BlackBall2, ANIM_TAG_BLACK_BALL_2},\n    {gBattleAnimSpritePal_PurpleGasCloud, ANIM_TAG_PURPLE_GAS_CLOUD},\n    {gBattleAnimSpritePal_Spark, ANIM_TAG_SPARK_H},\n    {gBattleAnimSpritePal_YellowStar, ANIM_TAG_YELLOW_STAR},\n    {gBattleAnimSpritePal_LargeFreshEgg, ANIM_TAG_LARGE_FRESH_EGG},\n    {gBattleAnimSpritePal_ShadowBall, ANIM_TAG_SHADOW_BALL},\n    {gBattleAnimSpritePal_Lick, ANIM_TAG_LICK},\n    {gBattleAnimSpritePal_VoidLines, ANIM_TAG_VOID_LINES},\n    {gBattleAnimSpritePal_String, ANIM_TAG_STRING},\n    {gBattleAnimSpritePal_String, ANIM_TAG_WEB_THREAD},\n    {gBattleAnimSpritePal_String, ANIM_TAG_SPIDER_WEB},\n    {gBattleAnimSpritePal_Lightbulb, ANIM_TAG_LIGHTBULB},\n    {gBattleAnimSpritePal_Slash, ANIM_TAG_SLASH},\n    {gBattleAnimSpritePal_FocusEnergy, ANIM_TAG_FOCUS_ENERGY},\n    {gBattleAnimSpritePal_SphereToCube, ANIM_TAG_SPHERE_TO_CUBE},\n    {gBattleAnimSpritePal_Tendrils, ANIM_TAG_TENDRILS},\n    {gBattleAnimSpritePal_Eye, ANIM_TAG_EYE},\n    {gBattleAnimSpritePal_WhiteShadow, ANIM_TAG_WHITE_SHADOW},\n    {gBattleAnimSpritePal_TealAlert, ANIM_TAG_TEAL_ALERT},\n    {gBattleAnimSpritePal_OpeningEye, ANIM_TAG_OPENING_EYE},\n    {gBattleAnimSpritePal_RoundWhiteHalo, ANIM_TAG_ROUND_WHITE_HALO},\n    {gBattleAnimSpritePal_FangAttack, ANIM_TAG_FANG_ATTACK},\n    {gBattleAnimSpritePal_PurpleHandOutline, ANIM_TAG_PURPLE_HAND_OUTLINE},\n    {gBattleAnimSpritePal_Moon, ANIM_TAG_MOON},\n    {gBattleAnimSpritePal_GreenSparkle, ANIM_TAG_GREEN_SPARKLE},\n    {gBattleAnimSpritePal_Spiral, ANIM_TAG_SPIRAL},\n    {gBattleAnimSpritePal_SnoreZ, ANIM_TAG_SNORE_Z},\n    {gBattleAnimSpritePal_Explosion, ANIM_TAG_EXPLOSION},\n    {gBattleAnimSpritePal_Nail, ANIM_TAG_NAIL},\n    {gBattleAnimSpritePal_GhostlySpirit, ANIM_TAG_GHOSTLY_SPIRIT},\n    {gBattleAnimSpritePal_WarmRock, ANIM_TAG_WARM_ROCK},\n    {gBattleAnimSpritePal_BreakingEgg, ANIM_TAG_BREAKING_EGG},\n    {gBattleAnimSpritePal_ThinRing, ANIM_TAG_THIN_RING},\n    {gBattleAnimSpritePal_PunchImpact, ANIM_TAG_PUNCH_IMPACT},\n    {gBattleAnimSpritePal_Bell, ANIM_TAG_BELL},\n    {gBattleAnimSpritePal_MusicNotes2, ANIM_TAG_MUSIC_NOTES_2},\n    {gBattleAnimSpritePal_SpeedDust, ANIM_TAG_SPEED_DUST},\n    {gBattleAnimSpritePal_BlueLightWall, ANIM_TAG_TORN_METAL},\n    {gBattleAnimSpritePal_ThoughtBubble, ANIM_TAG_THOUGHT_BUBBLE},\n    {gBattleAnimSpritePal_MagentaHeart, ANIM_TAG_MAGENTA_HEART},\n    {gBattleAnimSpritePal_ElectricOrbs, ANIM_TAG_ELECTRIC_ORBS},\n    {gBattleAnimSpritePal_ElectricOrbs, ANIM_TAG_CIRCLE_OF_LIGHT},\n    {gBattleAnimSpritePal_ElectricOrbs, ANIM_TAG_ELECTRICITY},\n    {gBattleAnimSpritePal_Finger, ANIM_TAG_FINGER_2},\n    {gBattleAnimSpritePal_MovementWaves, ANIM_TAG_MOVEMENT_WAVES},\n    {gBattleAnimSpritePal_RedHeart, ANIM_TAG_RED_HEART},\n    {gBattleAnimSpritePal_RedOrb, ANIM_TAG_RED_ORB},\n    {gBattleAnimSpritePal_EyeSparkle, ANIM_TAG_EYE_SPARKLE},\n    {gBattleAnimSpritePal_PinkHeart, ANIM_TAG_PINK_HEART},\n    {gBattleAnimSpritePal_Angel, ANIM_TAG_ANGEL},\n    {gBattleAnimSpritePal_Devil, ANIM_TAG_DEVIL},\n    {gBattleAnimSpritePal_Swipe, ANIM_TAG_SWIPE},\n    {gBattleAnimSpritePal_Roots, ANIM_TAG_ROOTS},\n    {gBattleAnimSpritePal_ItemBag, ANIM_TAG_ITEM_BAG},\n    {gBattleAnimSpritePal_JaggedMusicNote, ANIM_TAG_JAGGED_MUSIC_NOTE},\n    {gBattleAnimSpritePal_Pokeball, ANIM_TAG_POKEBALL},\n    {gBattleAnimSpritePal_Pokeball, ANIM_TAG_SPOTLIGHT},\n    {gBattleAnimSpritePal_LetterZ, ANIM_TAG_LETTER_Z},\n    {gBattleAnimSpritePal_RapidSpin, ANIM_TAG_RAPID_SPIN},\n    {gBattleAnimSpritePal_TriAttackTriangle, ANIM_TAG_TRI_ATTACK_TRIANGLE},\n    {gBattleAnimSpritePal_WispOrb, ANIM_TAG_WISP_ORB},\n    {gBattleAnimSpritePal_WispOrb, ANIM_TAG_WISP_FIRE},\n    {gBattleAnimSpritePal_GoldStars, ANIM_TAG_GOLD_STARS},\n    {gBattleAnimSpritePal_EclipsingOrb, ANIM_TAG_ECLIPSING_ORB},\n    {gBattleAnimSpritePal_GrayOrb, ANIM_TAG_GRAY_ORB},\n    {gBattleAnimSpritePal_BlueOrb, ANIM_TAG_BLUE_ORB},\n    {gBattleAnimSpritePal_RedOrb2, ANIM_TAG_RED_ORB_2},\n    {gBattleAnimSpritePal_PinkPetal, ANIM_TAG_PINK_PETAL},\n    {gBattleAnimSpritePal_PainSplit, ANIM_TAG_PAIN_SPLIT},\n    {gBattleAnimSpritePal_Confetti, ANIM_TAG_CONFETTI},\n    {gBattleAnimSpritePal_GreenStar, ANIM_TAG_GREEN_STAR},\n    {gBattleAnimSpritePal_PinkCloud, ANIM_TAG_PINK_CLOUD},\n    {gBattleAnimSpritePal_SweatDrop, ANIM_TAG_SWEAT_DROP},\n    {gBattleAnimSpritePal_GuardRing, ANIM_TAG_GUARD_RING},\n    {gBattleAnimSpritePal_PurpleScratch, ANIM_TAG_PURPLE_SCRATCH},\n    {gBattleAnimSpritePal_PurpleScratch, ANIM_TAG_PURPLE_SWIPE},\n    {gBattleAnimSpritePal_Finger, ANIM_TAG_TAG_HAND},\n    {gBattleAnimSpritePal_SmallRedEye, ANIM_TAG_SMALL_RED_EYE},\n    {gBattleAnimSpritePal_HollowOrb, ANIM_TAG_HOLLOW_ORB},\n    {gBattleAnimSpritePal_HollowOrb, ANIM_TAG_X_SIGN},\n    {gBattleAnimSpritePal_BluegreenOrb, ANIM_TAG_BLUEGREEN_ORB},\n    {gBattleAnimSpritePal_PawPrint, ANIM_TAG_PAW_PRINT},\n    {gBattleAnimSpritePal_PurpleFlame, ANIM_TAG_PURPLE_FLAME},\n    {gBattleAnimSpritePal_RedBall, ANIM_TAG_RED_BALL},\n    {gBattleAnimSpritePal_SmellingsaltEffect, ANIM_TAG_SMELLINGSALT_EFFECT},\n    {gBattleAnimSpritePal_Meteor, ANIM_TAG_METEOR},\n    {gBattleAnimSpritePal_FlatRock, ANIM_TAG_FLAT_ROCK},\n    {gBattleAnimSpritePal_MagnifyingGlass, ANIM_TAG_MAGNIFYING_GLASS},\n    {gBattleAnimSpritePal_BrownOrb, ANIM_TAG_BROWN_ORB},\n    {gBattleAnimSpritePal_MetalSoundWaves, ANIM_TAG_METAL_SOUND_WAVES},\n    {gBattleAnimSpritePal_FlyingDirt, ANIM_TAG_FLYING_DIRT},\n    {gBattleAnimSpritePal_IcicleSpear, ANIM_TAG_ICICLE_SPEAR},\n    {gBattleAnimSpritePal_Hail, ANIM_TAG_HAIL},\n    {gBattleAnimSpritePal_GlowyRedOrb, ANIM_TAG_GLOWY_RED_ORB},\n    {gBattleAnimSpritePal_GlowyGreenOrb, ANIM_TAG_GLOWY_GREEN_ORB},\n    {gBattleAnimSpritePal_GreenSpike, ANIM_TAG_GREEN_SPIKE},\n    {gBattleAnimSpritePal_WhiteCircleOfLight, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT},\n    {gBattleAnimSpritePal_GlowyBlueOrb, ANIM_TAG_GLOWY_BLUE_ORB},\n    {gBattleAnimSpritePal_SafariBait, ANIM_TAG_SAFARI_BAIT},\n    {gBattleAnimSpritePal_WhiteFeather, ANIM_TAG_WHITE_FEATHER},\n    {gBattleAnimSpritePal_Sparkle6, ANIM_TAG_SPARKLE_6},\n    {gBattleAnimSpritePal_Splash, ANIM_TAG_SPLASH},\n    {gBattleAnimSpritePal_Splash, ANIM_TAG_SWEAT_BEAD},\n    {gBattleAnimSpritePal_Gem1, ANIM_TAG_GEM_1},\n    {gBattleAnimSpritePal_Gem1, ANIM_TAG_GEM_2},\n    {gBattleAnimSpritePal_Gem1, ANIM_TAG_GEM_3},\n    {gBattleAnimSpritePal_SlamHit2, ANIM_TAG_SLAM_HIT_2},\n    {gBattleAnimSpritePal_Recycle, ANIM_TAG_RECYCLE},\n    {gBattleAnimSpritePal_RedParticles, ANIM_TAG_RED_PARTICLES},\n    {gBattleAnimSpritePal_Protect, ANIM_TAG_PROTECT},\n    {gBattleAnimSpritePal_DirtMound, ANIM_TAG_DIRT_MOUND},\n    {gBattleAnimSpritePal_Shock3, ANIM_TAG_SHOCK_3},\n    {gBattleAnimSpritePal_WeatherBall, ANIM_TAG_WEATHER_BALL},\n    {gBattleAnimSpritePal_Bird, ANIM_TAG_BIRD},\n    {gBattleAnimSpritePal_CrossImpact, ANIM_TAG_CROSS_IMPACT},\n    {gBattleAnimSpritePal_Slash2, ANIM_TAG_SLASH_2},\n    {gBattleAnimSpritePal_WhipHit, ANIM_TAG_WHIP_HIT},\n    {gBattleAnimSpritePal_BlueRing2, ANIM_TAG_BLUE_RING_2},\n};\n\nconst struct BattleAnimBackground gBattleAnimBackgroundTable[] =\n{\n    [BG_NONE]                = {gBattleAnimBgImage_Dark,       gBattleAnimBgPalette_Dark,       gBattleAnimBgTilemap_Dark},\n    [BG_DARK]                = {gBattleAnimBgImage_Dark,       gBattleAnimBgPalette_Dark,       gBattleAnimBgTilemap_Dark},\n    [BG_GHOST]               = {gBattleAnimBgImage_Ghost,      gBattleAnimBgPalette_Ghost,      gBattleAnimBgTilemap_Ghost},\n    [BG_PSYCHIC]             = {gBattleAnimBgImage_Psychic,    gBattleAnimBgPalette_Psychic,    gBattleAnimBgTilemap_Psychic},\n    [BG_IMPACT_OPPONENT]     = {gBattleAnimBgImage_Impact,     gBattleAnimBgPalette_Impact,     gBattleAnimBgTilemap_ImpactOpponent},\n    [BG_IMPACT_PLAYER]       = {gBattleAnimBgImage_Impact,     gBattleAnimBgPalette_Impact,     gBattleAnimBgTilemap_ImpactPlayer},\n    [BG_IMPACT_CONTESTS]     = {gBattleAnimBgImage_Impact,     gBattleAnimBgPalette_Impact,     gBattleAnimBgTilemap_ImpactContests},\n    [BG_DRILL]               = {gBattleAnimBgImage_Drill,      gBattleAnimBgPalette_Drill,      gBattleAnimBgTilemap_Drill},\n    [BG_DRILL_CONTESTS]      = {gBattleAnimBgImage_Drill,      gBattleAnimBgPalette_Drill,      gBattleAnimBgTilemap_DrillContests},\n    [BG_HIGHSPEED_OPPONENT]  = {gBattleAnimBgImage_Highspeed,  gBattleAnimBgPalette_Highspeed,  gBattleAnimBgTilemap_HighspeedOpponent},\n    [BG_HIGHSPEED_PLAYER]    = {gBattleAnimBgImage_Highspeed,  gBattleAnimBgPalette_Highspeed,  gBattleAnimBgTilemap_HighspeedPlayer},\n    [BG_THUNDER]             = {gBattleAnimBgImage_Thunder,    gBattleAnimBgPalette_Thunder,    gBattleAnimBgTilemap_Thunder},\n    [BG_GUILLOTINE_OPPONENT] = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotineOpponent},\n    [BG_GUILLOTINE_PLAYER]   = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotinePlayer},\n    [BG_GUILLOTINE_CONTESTS] = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotineContests},\n    [BG_ICE]                 = {gBattleAnimBgImage_Ice,        gBattleAnimBgPalette_Ice,        gBattleAnimBgTilemap_Ice},\n    [BG_COSMIC]              = {gBattleAnimBgImage_Cosmic,     gBattleAnimBgPalette_Cosmic,     gBattleAnimBgTilemap_Cosmic},\n    [BG_IN_AIR]              = {gBattleAnimBgImage_InAir,      gBattleAnimBgPalette_InAir,      gBattleAnimBgTilemap_InAir},\n    [BG_SKY]                 = {gBattleAnimBgImage_Drill,      gBattleAnimBgPalette_Sky,        gBattleAnimBgTilemap_Drill},\n    [BG_SKY_CONTESTS]        = {gBattleAnimBgImage_Drill,      gBattleAnimBgPalette_Sky,        gBattleAnimBgTilemap_DrillContests},\n    [BG_AURORA]              = {gBattleAnimBgImage_Aurora,     gBattleAnimBgPalette_Aurora,     gBattleAnimBgTilemap_Aurora},\n    [BG_FISSURE]             = {gBattleAnimBgImage_Fissure,    gBattleAnimBgPalette_Fissure,    gBattleAnimBgTilemap_Fissure},\n    [BG_BUG_OPPONENT]        = {gBattleAnimBgImage_Highspeed,  gBattleAnimBgPalette_Bug,        gBattleAnimBgTilemap_HighspeedOpponent},\n    [BG_BUG_PLAYER]          = {gBattleAnimBgImage_Highspeed,  gBattleAnimBgPalette_Bug,        gBattleAnimBgTilemap_HighspeedPlayer},\n    [BG_SOLAR_BEAM_OPPONENT] = {gBattleAnimBgImage_Impact,     gBattleAnimBgPalette_SolarBeam,  gBattleAnimBgTilemap_ImpactOpponent},\n    [BG_SOLAR_BEAM_PLAYER]   = {gBattleAnimBgImage_Impact,     gBattleAnimBgPalette_SolarBeam,  gBattleAnimBgTilemap_ImpactPlayer},\n    [BG_SOLAR_BEAM_CONTESTS] = {gBattleAnimBgImage_Impact,     gBattleAnimBgPalette_SolarBeam,  gBattleAnimBgTilemap_ImpactContests},\n};\n"
  },
  {
    "path": "src/data/battle_moves.h",
    "content": "const struct BattleMove gBattleMoves[MOVES_COUNT] =\n{\n    [MOVE_NONE] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 0,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_POUND] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 40,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 35,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_KARATE_CHOP] =\n    {\n        .effect = EFFECT_HIGH_CRITICAL,\n        .power = 50,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 25,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_DOUBLE_SLAP] =\n    {\n        .effect = EFFECT_MULTI_HIT,\n        .power = 15,\n        .type = TYPE_NORMAL,\n        .accuracy = 85,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_COMET_PUNCH] =\n    {\n        .effect = EFFECT_MULTI_HIT,\n        .power = 18,\n        .type = TYPE_NORMAL,\n        .accuracy = 85,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_MEGA_PUNCH] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 80,\n        .type = TYPE_NORMAL,\n        .accuracy = 85,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_PAY_DAY] =\n    {\n        .effect = EFFECT_PAY_DAY,\n        .power = 40,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_FIRE_PUNCH] =\n    {\n        .effect = EFFECT_BURN_HIT,\n        .power = 75,\n        .type = TYPE_FIRE,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_ICE_PUNCH] =\n    {\n        .effect = EFFECT_FREEZE_HIT,\n        .power = 75,\n        .type = TYPE_ICE,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_THUNDER_PUNCH] =\n    {\n        .effect = EFFECT_PARALYZE_HIT,\n        .power = 75,\n        .type = TYPE_ELECTRIC,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SCRATCH] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 40,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 35,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_VICE_GRIP] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 55,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_GUILLOTINE] =\n    {\n        .effect = EFFECT_OHKO,\n        .power = 1,\n        .type = TYPE_NORMAL,\n        .accuracy = 30,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_RAZOR_WIND] =\n    {\n        .effect = EFFECT_RAZOR_WIND,\n        .power = 80,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SWORDS_DANCE] =\n    {\n        .effect = EFFECT_ATTACK_UP_2,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_CUT] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 50,\n        .type = TYPE_NORMAL,\n        .accuracy = 95,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_GUST] =\n    {\n        .effect = EFFECT_GUST,\n        .power = 40,\n        .type = TYPE_FLYING,\n        .accuracy = 100,\n        .pp = 35,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_WING_ATTACK] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 60,\n        .type = TYPE_FLYING,\n        .accuracy = 100,\n        .pp = 35,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_WHIRLWIND] =\n    {\n        .effect = EFFECT_ROAR,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = -6,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FLY] =\n    {\n        .effect = EFFECT_SEMI_INVULNERABLE,\n        .power = 70,\n        .type = TYPE_FLYING,\n        .accuracy = 95,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_BIND] =\n    {\n        .effect = EFFECT_TRAP,\n        .power = 15,\n        .type = TYPE_NORMAL,\n        .accuracy = 75,\n        .pp = 20,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SLAM] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 80,\n        .type = TYPE_NORMAL,\n        .accuracy = 75,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_VINE_WHIP] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 35,\n        .type = TYPE_GRASS,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_STOMP] =\n    {\n        .effect = EFFECT_FLINCH_MINIMIZE_HIT,\n        .power = 65,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_DOUBLE_KICK] =\n    {\n        .effect = EFFECT_DOUBLE_HIT,\n        .power = 30,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_MEGA_KICK] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 120,\n        .type = TYPE_NORMAL,\n        .accuracy = 75,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_JUMP_KICK] =\n    {\n        .effect = EFFECT_RECOIL_IF_MISS,\n        .power = 70,\n        .type = TYPE_FIGHTING,\n        .accuracy = 95,\n        .pp = 25,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_ROLLING_KICK] =\n    {\n        .effect = EFFECT_FLINCH_HIT,\n        .power = 60,\n        .type = TYPE_FIGHTING,\n        .accuracy = 85,\n        .pp = 15,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SAND_ATTACK] =\n    {\n        .effect = EFFECT_ACCURACY_DOWN,\n        .power = 0,\n        .type = TYPE_GROUND,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_HEADBUTT] =\n    {\n        .effect = EFFECT_FLINCH_HIT,\n        .power = 70,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_HORN_ATTACK] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 65,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 25,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_FURY_ATTACK] =\n    {\n        .effect = EFFECT_MULTI_HIT,\n        .power = 15,\n        .type = TYPE_NORMAL,\n        .accuracy = 85,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_HORN_DRILL] =\n    {\n        .effect = EFFECT_OHKO,\n        .power = 1,\n        .type = TYPE_NORMAL,\n        .accuracy = 30,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_TACKLE] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 35,\n        .type = TYPE_NORMAL,\n        .accuracy = 95,\n        .pp = 35,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_BODY_SLAM] =\n    {\n        .effect = EFFECT_PARALYZE_HIT,\n        .power = 85,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_WRAP] =\n    {\n        .effect = EFFECT_TRAP,\n        .power = 15,\n        .type = TYPE_NORMAL,\n        .accuracy = 85,\n        .pp = 20,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_TAKE_DOWN] =\n    {\n        .effect = EFFECT_RECOIL,\n        .power = 90,\n        .type = TYPE_NORMAL,\n        .accuracy = 85,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_THRASH] =\n    {\n        .effect = EFFECT_RAMPAGE,\n        .power = 90,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_RANDOM,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_DOUBLE_EDGE] =\n    {\n        .effect = EFFECT_DOUBLE_EDGE,\n        .power = 120,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_TAIL_WHIP] =\n    {\n        .effect = EFFECT_DEFENSE_DOWN,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_POISON_STING] =\n    {\n        .effect = EFFECT_POISON_HIT,\n        .power = 15,\n        .type = TYPE_POISON,\n        .accuracy = 100,\n        .pp = 35,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_TWINEEDLE] =\n    {\n        .effect = EFFECT_TWINEEDLE,\n        .power = 25,\n        .type = TYPE_BUG,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 20,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_PIN_MISSILE] =\n    {\n        .effect = EFFECT_MULTI_HIT,\n        .power = 14,\n        .type = TYPE_BUG,\n        .accuracy = 85,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_LEER] =\n    {\n        .effect = EFFECT_DEFENSE_DOWN,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_BITE] =\n    {\n        .effect = EFFECT_FLINCH_HIT,\n        .power = 60,\n        .type = TYPE_DARK,\n        .accuracy = 100,\n        .pp = 25,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_GROWL] =\n    {\n        .effect = EFFECT_ATTACK_DOWN,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_ROAR] =\n    {\n        .effect = EFFECT_ROAR,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = -6,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SING] =\n    {\n        .effect = EFFECT_SLEEP,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 55,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SUPERSONIC] =\n    {\n        .effect = EFFECT_CONFUSE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 55,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SONIC_BOOM] =\n    {\n        .effect = EFFECT_SONICBOOM,\n        .power = 1,\n        .type = TYPE_NORMAL,\n        .accuracy = 90,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_DISABLE] =\n    {\n        .effect = EFFECT_DISABLE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 55,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_ACID] =\n    {\n        .effect = EFFECT_DEFENSE_DOWN_HIT,\n        .power = 40,\n        .type = TYPE_POISON,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_EMBER] =\n    {\n        .effect = EFFECT_BURN_HIT,\n        .power = 40,\n        .type = TYPE_FIRE,\n        .accuracy = 100,\n        .pp = 25,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FLAMETHROWER] =\n    {\n        .effect = EFFECT_BURN_HIT,\n        .power = 95,\n        .type = TYPE_FIRE,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MIST] =\n    {\n        .effect = EFFECT_MIST,\n        .power = 0,\n        .type = TYPE_ICE,\n        .accuracy = 0,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_WATER_GUN] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 40,\n        .type = TYPE_WATER,\n        .accuracy = 100,\n        .pp = 25,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_HYDRO_PUMP] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 120,\n        .type = TYPE_WATER,\n        .accuracy = 80,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SURF] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 95,\n        .type = TYPE_WATER,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_ICE_BEAM] =\n    {\n        .effect = EFFECT_FREEZE_HIT,\n        .power = 95,\n        .type = TYPE_ICE,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_BLIZZARD] =\n    {\n        .effect = EFFECT_FREEZE_HIT,\n        .power = 120,\n        .type = TYPE_ICE,\n        .accuracy = 70,\n        .pp = 5,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_PSYBEAM] =\n    {\n        .effect = EFFECT_CONFUSE_HIT,\n        .power = 65,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_BUBBLE_BEAM] =\n    {\n        .effect = EFFECT_SPEED_DOWN_HIT,\n        .power = 65,\n        .type = TYPE_WATER,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_AURORA_BEAM] =\n    {\n        .effect = EFFECT_ATTACK_DOWN_HIT,\n        .power = 65,\n        .type = TYPE_ICE,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_HYPER_BEAM] =\n    {\n        .effect = EFFECT_RECHARGE,\n        .power = 150,\n        .type = TYPE_NORMAL,\n        .accuracy = 90,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_PECK] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 35,\n        .type = TYPE_FLYING,\n        .accuracy = 100,\n        .pp = 35,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_DRILL_PECK] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 80,\n        .type = TYPE_FLYING,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SUBMISSION] =\n    {\n        .effect = EFFECT_RECOIL,\n        .power = 80,\n        .type = TYPE_FIGHTING,\n        .accuracy = 80,\n        .pp = 25,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_LOW_KICK] =\n    {\n        .effect = EFFECT_LOW_KICK,\n        .power = 1,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_COUNTER] =\n    {\n        .effect = EFFECT_COUNTER,\n        .power = 1,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_DEPENDS,\n        .priority = -5,\n        .flags = FLAG_MAKES_CONTACT | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SEISMIC_TOSS] =\n    {\n        .effect = EFFECT_LEVEL_DAMAGE,\n        .power = 1,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_STRENGTH] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 80,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_ABSORB] =\n    {\n        .effect = EFFECT_ABSORB,\n        .power = 20,\n        .type = TYPE_GRASS,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MEGA_DRAIN] =\n    {\n        .effect = EFFECT_ABSORB,\n        .power = 40,\n        .type = TYPE_GRASS,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_LEECH_SEED] =\n    {\n        .effect = EFFECT_LEECH_SEED,\n        .power = 0,\n        .type = TYPE_GRASS,\n        .accuracy = 90,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_GROWTH] =\n    {\n        .effect = EFFECT_SPECIAL_ATTACK_UP,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_RAZOR_LEAF] =\n    {\n        .effect = EFFECT_HIGH_CRITICAL,\n        .power = 55,\n        .type = TYPE_GRASS,\n        .accuracy = 95,\n        .pp = 25,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SOLAR_BEAM] =\n    {\n        .effect = EFFECT_SOLAR_BEAM,\n        .power = 120,\n        .type = TYPE_GRASS,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_POISON_POWDER] =\n    {\n        .effect = EFFECT_POISON,\n        .power = 0,\n        .type = TYPE_POISON,\n        .accuracy = 75,\n        .pp = 35,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_STUN_SPORE] =\n    {\n        .effect = EFFECT_PARALYZE,\n        .power = 0,\n        .type = TYPE_GRASS,\n        .accuracy = 75,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SLEEP_POWDER] =\n    {\n        .effect = EFFECT_SLEEP,\n        .power = 0,\n        .type = TYPE_GRASS,\n        .accuracy = 75,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_PETAL_DANCE] =\n    {\n        .effect = EFFECT_RAMPAGE,\n        .power = 70,\n        .type = TYPE_GRASS,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_RANDOM,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_STRING_SHOT] =\n    {\n        .effect = EFFECT_SPEED_DOWN,\n        .power = 0,\n        .type = TYPE_BUG,\n        .accuracy = 95,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_DRAGON_RAGE] =\n    {\n        .effect = EFFECT_DRAGON_RAGE,\n        .power = 1,\n        .type = TYPE_DRAGON,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_FIRE_SPIN] =\n    {\n        .effect = EFFECT_TRAP,\n        .power = 15,\n        .type = TYPE_FIRE,\n        .accuracy = 70,\n        .pp = 15,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_THUNDER_SHOCK] =\n    {\n        .effect = EFFECT_PARALYZE_HIT,\n        .power = 40,\n        .type = TYPE_ELECTRIC,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_THUNDERBOLT] =\n    {\n        .effect = EFFECT_PARALYZE_HIT,\n        .power = 95,\n        .type = TYPE_ELECTRIC,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_THUNDER_WAVE] =\n    {\n        .effect = EFFECT_PARALYZE,\n        .power = 0,\n        .type = TYPE_ELECTRIC,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_THUNDER] =\n    {\n        .effect = EFFECT_THUNDER,\n        .power = 120,\n        .type = TYPE_ELECTRIC,\n        .accuracy = 70,\n        .pp = 10,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_ROCK_THROW] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 50,\n        .type = TYPE_ROCK,\n        .accuracy = 90,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_EARTHQUAKE] =\n    {\n        .effect = EFFECT_EARTHQUAKE,\n        .power = 100,\n        .type = TYPE_GROUND,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_FOES_AND_ALLY,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_FISSURE] =\n    {\n        .effect = EFFECT_OHKO,\n        .power = 1,\n        .type = TYPE_GROUND,\n        .accuracy = 30,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_DIG] =\n    {\n        .effect = EFFECT_SEMI_INVULNERABLE,\n        .power = 60,\n        .type = TYPE_GROUND,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_TOXIC] =\n    {\n        .effect = EFFECT_TOXIC,\n        .power = 0,\n        .type = TYPE_POISON,\n        .accuracy = 85,\n        .pp = 10,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_CONFUSION] =\n    {\n        .effect = EFFECT_CONFUSE_HIT,\n        .power = 50,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 100,\n        .pp = 25,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_PSYCHIC] =\n    {\n        .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT,\n        .power = 90,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_HYPNOSIS] =\n    {\n        .effect = EFFECT_SLEEP,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 60,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MEDITATE] =\n    {\n        .effect = EFFECT_ATTACK_UP,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_AGILITY] =\n    {\n        .effect = EFFECT_SPEED_UP_2,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_QUICK_ATTACK] =\n    {\n        .effect = EFFECT_QUICK_ATTACK,\n        .power = 40,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 1,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_RAGE] =\n    {\n        .effect = EFFECT_RAGE,\n        .power = 20,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_TELEPORT] =\n    {\n        .effect = EFFECT_TELEPORT,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_NIGHT_SHADE] =\n    {\n        .effect = EFFECT_LEVEL_DAMAGE,\n        .power = 1,\n        .type = TYPE_GHOST,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_MIMIC] =\n    {\n        .effect = EFFECT_MIMIC,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED,\n    },\n\n    [MOVE_SCREECH] =\n    {\n        .effect = EFFECT_DEFENSE_DOWN_2,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 85,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_DOUBLE_TEAM] =\n    {\n        .effect = EFFECT_EVASION_UP,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_RECOVER] =\n    {\n        .effect = EFFECT_RESTORE_HP,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_HARDEN] =\n    {\n        .effect = EFFECT_DEFENSE_UP,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_MINIMIZE] =\n    {\n        .effect = EFFECT_MINIMIZE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_SMOKESCREEN] =\n    {\n        .effect = EFFECT_ACCURACY_DOWN,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_CONFUSE_RAY] =\n    {\n        .effect = EFFECT_CONFUSE,\n        .power = 0,\n        .type = TYPE_GHOST,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_WITHDRAW] =\n    {\n        .effect = EFFECT_DEFENSE_UP,\n        .power = 0,\n        .type = TYPE_WATER,\n        .accuracy = 0,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_DEFENSE_CURL] =\n    {\n        .effect = EFFECT_DEFENSE_CURL,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_BARRIER] =\n    {\n        .effect = EFFECT_DEFENSE_UP_2,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_LIGHT_SCREEN] =\n    {\n        .effect = EFFECT_LIGHT_SCREEN,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_HAZE] =\n    {\n        .effect = EFFECT_HAZE,\n        .power = 0,\n        .type = TYPE_ICE,\n        .accuracy = 0,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED,\n    },\n\n    [MOVE_REFLECT] =\n    {\n        .effect = EFFECT_REFLECT,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_FOCUS_ENERGY] =\n    {\n        .effect = EFFECT_FOCUS_ENERGY,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_BIDE] =\n    {\n        .effect = EFFECT_BIDE,\n        .power = 1,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_METRONOME] =\n    {\n        .effect = EFFECT_METRONOME,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_DEPENDS,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_MIRROR_MOVE] =\n    {\n        .effect = EFFECT_MIRROR_MOVE,\n        .power = 0,\n        .type = TYPE_FLYING,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_DEPENDS,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_SELF_DESTRUCT] =\n    {\n        .effect = EFFECT_EXPLOSION,\n        .power = 200,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_FOES_AND_ALLY,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_EGG_BOMB] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 100,\n        .type = TYPE_NORMAL,\n        .accuracy = 75,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_LICK] =\n    {\n        .effect = EFFECT_PARALYZE_HIT,\n        .power = 20,\n        .type = TYPE_GHOST,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SMOG] =\n    {\n        .effect = EFFECT_POISON_HIT,\n        .power = 20,\n        .type = TYPE_POISON,\n        .accuracy = 70,\n        .pp = 20,\n        .secondaryEffectChance = 40,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SLUDGE] =\n    {\n        .effect = EFFECT_POISON_HIT,\n        .power = 65,\n        .type = TYPE_POISON,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_BONE_CLUB] =\n    {\n        .effect = EFFECT_FLINCH_HIT,\n        .power = 65,\n        .type = TYPE_GROUND,\n        .accuracy = 85,\n        .pp = 20,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FIRE_BLAST] =\n    {\n        .effect = EFFECT_BURN_HIT,\n        .power = 120,\n        .type = TYPE_FIRE,\n        .accuracy = 85,\n        .pp = 5,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_WATERFALL] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 80,\n        .type = TYPE_WATER,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_CLAMP] =\n    {\n        .effect = EFFECT_TRAP,\n        .power = 35,\n        .type = TYPE_WATER,\n        .accuracy = 75,\n        .pp = 10,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SWIFT] =\n    {\n        .effect = EFFECT_ALWAYS_HIT,\n        .power = 60,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SKULL_BASH] =\n    {\n        .effect = EFFECT_SKULL_BASH,\n        .power = 100,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SPIKE_CANNON] =\n    {\n        .effect = EFFECT_MULTI_HIT,\n        .power = 20,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_CONSTRICT] =\n    {\n        .effect = EFFECT_SPEED_DOWN_HIT,\n        .power = 10,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 35,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_AMNESIA] =\n    {\n        .effect = EFFECT_SPECIAL_DEFENSE_UP_2,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_KINESIS] =\n    {\n        .effect = EFFECT_ACCURACY_DOWN,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 80,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SOFT_BOILED] =\n    {\n        .effect = EFFECT_SOFTBOILED,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_HI_JUMP_KICK] =\n    {\n        .effect = EFFECT_RECOIL_IF_MISS,\n        .power = 85,\n        .type = TYPE_FIGHTING,\n        .accuracy = 90,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_GLARE] =\n    {\n        .effect = EFFECT_PARALYZE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 75,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_DREAM_EATER] =\n    {\n        .effect = EFFECT_DREAM_EATER,\n        .power = 100,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_POISON_GAS] =\n    {\n        .effect = EFFECT_POISON,\n        .power = 0,\n        .type = TYPE_POISON,\n        .accuracy = 55,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_BARRAGE] =\n    {\n        .effect = EFFECT_MULTI_HIT,\n        .power = 15,\n        .type = TYPE_NORMAL,\n        .accuracy = 85,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_LEECH_LIFE] =\n    {\n        .effect = EFFECT_ABSORB,\n        .power = 20,\n        .type = TYPE_BUG,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_LOVELY_KISS] =\n    {\n        .effect = EFFECT_SLEEP,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 75,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SKY_ATTACK] =\n    {\n        .effect = EFFECT_SKY_ATTACK,\n        .power = 140,\n        .type = TYPE_FLYING,\n        .accuracy = 90,\n        .pp = 5,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_TRANSFORM] =\n    {\n        .effect = EFFECT_TRANSFORM,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_BUBBLE] =\n    {\n        .effect = EFFECT_SPEED_DOWN_HIT,\n        .power = 20,\n        .type = TYPE_WATER,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_DIZZY_PUNCH] =\n    {\n        .effect = EFFECT_CONFUSE_HIT,\n        .power = 70,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 20,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SPORE] =\n    {\n        .effect = EFFECT_SLEEP,\n        .power = 0,\n        .type = TYPE_GRASS,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FLASH] =\n    {\n        .effect = EFFECT_ACCURACY_DOWN,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 70,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_PSYWAVE] =\n    {\n        .effect = EFFECT_PSYWAVE,\n        .power = 1,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 80,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SPLASH] =\n    {\n        .effect = EFFECT_SPLASH,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_ACID_ARMOR] =\n    {\n        .effect = EFFECT_DEFENSE_UP_2,\n        .power = 0,\n        .type = TYPE_POISON,\n        .accuracy = 0,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_CRABHAMMER] =\n    {\n        .effect = EFFECT_HIGH_CRITICAL,\n        .power = 90,\n        .type = TYPE_WATER,\n        .accuracy = 85,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_EXPLOSION] =\n    {\n        .effect = EFFECT_EXPLOSION,\n        .power = 250,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_FOES_AND_ALLY,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_FURY_SWIPES] =\n    {\n        .effect = EFFECT_MULTI_HIT,\n        .power = 18,\n        .type = TYPE_NORMAL,\n        .accuracy = 80,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_BONEMERANG] =\n    {\n        .effect = EFFECT_DOUBLE_HIT,\n        .power = 50,\n        .type = TYPE_GROUND,\n        .accuracy = 90,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_REST] =\n    {\n        .effect = EFFECT_REST,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_ROCK_SLIDE] =\n    {\n        .effect = EFFECT_FLINCH_HIT,\n        .power = 75,\n        .type = TYPE_ROCK,\n        .accuracy = 90,\n        .pp = 10,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_HYPER_FANG] =\n    {\n        .effect = EFFECT_FLINCH_HIT,\n        .power = 80,\n        .type = TYPE_NORMAL,\n        .accuracy = 90,\n        .pp = 15,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SHARPEN] =\n    {\n        .effect = EFFECT_ATTACK_UP,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_CONVERSION] =\n    {\n        .effect = EFFECT_CONVERSION,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_TRI_ATTACK] =\n    {\n        .effect = EFFECT_TRI_ATTACK,\n        .power = 80,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 20,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SUPER_FANG] =\n    {\n        .effect = EFFECT_SUPER_FANG,\n        .power = 1,\n        .type = TYPE_NORMAL,\n        .accuracy = 90,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SLASH] =\n    {\n        .effect = EFFECT_HIGH_CRITICAL,\n        .power = 70,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SUBSTITUTE] =\n    {\n        .effect = EFFECT_SUBSTITUTE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_STRUGGLE] =\n    {\n        .effect = EFFECT_RECOIL,\n        .power = 50,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 1,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SKETCH] =\n    {\n        .effect = EFFECT_SKETCH,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 1,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_TRIPLE_KICK] =\n    {\n        .effect = EFFECT_TRIPLE_KICK,\n        .power = 10,\n        .type = TYPE_FIGHTING,\n        .accuracy = 90,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_THIEF] =\n    {\n        .effect = EFFECT_THIEF,\n        .power = 40,\n        .type = TYPE_DARK,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SPIDER_WEB] =\n    {\n        .effect = EFFECT_MEAN_LOOK,\n        .power = 0,\n        .type = TYPE_BUG,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MIND_READER] =\n    {\n        .effect = EFFECT_LOCK_ON,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_NIGHTMARE] =\n    {\n        .effect = EFFECT_NIGHTMARE,\n        .power = 0,\n        .type = TYPE_GHOST,\n        .accuracy = 0,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FLAME_WHEEL] =\n    {\n        .effect = EFFECT_THAW_HIT,\n        .power = 60,\n        .type = TYPE_FIRE,\n        .accuracy = 100,\n        .pp = 25,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SNORE] =\n    {\n        .effect = EFFECT_SNORE,\n        .power = 40,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_CURSE] =\n    {\n        .effect = EFFECT_CURSE,\n        .power = 0,\n        .type = TYPE_MYSTERY,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_FLAIL] =\n    {\n        .effect = EFFECT_FLAIL,\n        .power = 1,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_CONVERSION_2] =\n    {\n        .effect = EFFECT_CONVERSION_2,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_AEROBLAST] =\n    {\n        .effect = EFFECT_HIGH_CRITICAL,\n        .power = 100,\n        .type = TYPE_FLYING,\n        .accuracy = 95,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_COTTON_SPORE] =\n    {\n        .effect = EFFECT_SPEED_DOWN_2,\n        .power = 0,\n        .type = TYPE_GRASS,\n        .accuracy = 85,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_REVERSAL] =\n    {\n        .effect = EFFECT_FLAIL,\n        .power = 1,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SPITE] =\n    {\n        .effect = EFFECT_SPITE,\n        .power = 0,\n        .type = TYPE_GHOST,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_POWDER_SNOW] =\n    {\n        .effect = EFFECT_FREEZE_HIT,\n        .power = 40,\n        .type = TYPE_ICE,\n        .accuracy = 100,\n        .pp = 25,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_PROTECT] =\n    {\n        .effect = EFFECT_PROTECT,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 3,\n        .flags = 0,\n    },\n\n    [MOVE_MACH_PUNCH] =\n    {\n        .effect = EFFECT_QUICK_ATTACK,\n        .power = 40,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 1,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SCARY_FACE] =\n    {\n        .effect = EFFECT_SPEED_DOWN_2,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 90,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FAINT_ATTACK] =\n    {\n        .effect = EFFECT_ALWAYS_HIT,\n        .power = 60,\n        .type = TYPE_DARK,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SWEET_KISS] =\n    {\n        .effect = EFFECT_CONFUSE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 75,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_BELLY_DRUM] =\n    {\n        .effect = EFFECT_BELLY_DRUM,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_SLUDGE_BOMB] =\n    {\n        .effect = EFFECT_POISON_HIT,\n        .power = 90,\n        .type = TYPE_POISON,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MUD_SLAP] =\n    {\n        .effect = EFFECT_ACCURACY_DOWN_HIT,\n        .power = 20,\n        .type = TYPE_GROUND,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_OCTAZOOKA] =\n    {\n        .effect = EFFECT_ACCURACY_DOWN_HIT,\n        .power = 65,\n        .type = TYPE_WATER,\n        .accuracy = 85,\n        .pp = 10,\n        .secondaryEffectChance = 50,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SPIKES] =\n    {\n        .effect = EFFECT_SPIKES,\n        .power = 0,\n        .type = TYPE_GROUND,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_OPPONENTS_FIELD,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_ZAP_CANNON] =\n    {\n        .effect = EFFECT_PARALYZE_HIT,\n        .power = 100,\n        .type = TYPE_ELECTRIC,\n        .accuracy = 50,\n        .pp = 5,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FORESIGHT] =\n    {\n        .effect = EFFECT_FORESIGHT,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_DESTINY_BOND] =\n    {\n        .effect = EFFECT_DESTINY_BOND,\n        .power = 0,\n        .type = TYPE_GHOST,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_PERISH_SONG] =\n    {\n        .effect = EFFECT_PERISH_SONG,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_ICY_WIND] =\n    {\n        .effect = EFFECT_SPEED_DOWN_HIT,\n        .power = 55,\n        .type = TYPE_ICE,\n        .accuracy = 95,\n        .pp = 15,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_DETECT] =\n    {\n        .effect = EFFECT_PROTECT,\n        .power = 0,\n        .type = TYPE_FIGHTING,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 3,\n        .flags = 0,\n    },\n\n    [MOVE_BONE_RUSH] =\n    {\n        .effect = EFFECT_MULTI_HIT,\n        .power = 25,\n        .type = TYPE_GROUND,\n        .accuracy = 80,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_LOCK_ON] =\n    {\n        .effect = EFFECT_LOCK_ON,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_OUTRAGE] =\n    {\n        .effect = EFFECT_RAMPAGE,\n        .power = 90,\n        .type = TYPE_DRAGON,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_RANDOM,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SANDSTORM] =\n    {\n        .effect = EFFECT_SANDSTORM,\n        .power = 0,\n        .type = TYPE_ROCK,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_GIGA_DRAIN] =\n    {\n        .effect = EFFECT_ABSORB,\n        .power = 60,\n        .type = TYPE_GRASS,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_ENDURE] =\n    {\n        .effect = EFFECT_ENDURE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 3,\n        .flags = 0,\n    },\n\n    [MOVE_CHARM] =\n    {\n        .effect = EFFECT_ATTACK_DOWN_2,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_ROLLOUT] =\n    {\n        .effect = EFFECT_ROLLOUT,\n        .power = 30,\n        .type = TYPE_ROCK,\n        .accuracy = 90,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_FALSE_SWIPE] =\n    {\n        .effect = EFFECT_FALSE_SWIPE,\n        .power = 40,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SWAGGER] =\n    {\n        .effect = EFFECT_SWAGGER,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 90,\n        .pp = 15,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MILK_DRINK] =\n    {\n        .effect = EFFECT_SOFTBOILED,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_SPARK] =\n    {\n        .effect = EFFECT_PARALYZE_HIT,\n        .power = 65,\n        .type = TYPE_ELECTRIC,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FURY_CUTTER] =\n    {\n        .effect = EFFECT_FURY_CUTTER,\n        .power = 10,\n        .type = TYPE_BUG,\n        .accuracy = 95,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_STEEL_WING] =\n    {\n        .effect = EFFECT_DEFENSE_UP_HIT,\n        .power = 70,\n        .type = TYPE_STEEL,\n        .accuracy = 90,\n        .pp = 25,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_MEAN_LOOK] =\n    {\n        .effect = EFFECT_MEAN_LOOK,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_ATTRACT] =\n    {\n        .effect = EFFECT_ATTRACT,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SLEEP_TALK] =\n    {\n        .effect = EFFECT_SLEEP_TALK,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_DEPENDS,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_HEAL_BELL] =\n    {\n        .effect = EFFECT_HEAL_BELL,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_RETURN] =\n    {\n        .effect = EFFECT_RETURN,\n        .power = 1,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_PRESENT] =\n    {\n        .effect = EFFECT_PRESENT,\n        .power = 1,\n        .type = TYPE_NORMAL,\n        .accuracy = 90,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FRUSTRATION] =\n    {\n        .effect = EFFECT_FRUSTRATION,\n        .power = 1,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SAFEGUARD] =\n    {\n        .effect = EFFECT_SAFEGUARD,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 25,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_PAIN_SPLIT] =\n    {\n        .effect = EFFECT_PAIN_SPLIT,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SACRED_FIRE] =\n    {\n        .effect = EFFECT_THAW_HIT,\n        .power = 100,\n        .type = TYPE_FIRE,\n        .accuracy = 95,\n        .pp = 5,\n        .secondaryEffectChance = 50,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MAGNITUDE] =\n    {\n        .effect = EFFECT_MAGNITUDE,\n        .power = 1,\n        .type = TYPE_GROUND,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_FOES_AND_ALLY,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_DYNAMIC_PUNCH] =\n    {\n        .effect = EFFECT_CONFUSE_HIT,\n        .power = 100,\n        .type = TYPE_FIGHTING,\n        .accuracy = 50,\n        .pp = 5,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MEGAHORN] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 120,\n        .type = TYPE_BUG,\n        .accuracy = 85,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_DRAGON_BREATH] =\n    {\n        .effect = EFFECT_PARALYZE_HIT,\n        .power = 60,\n        .type = TYPE_DRAGON,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_BATON_PASS] =\n    {\n        .effect = EFFECT_BATON_PASS,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_ENCORE] =\n    {\n        .effect = EFFECT_ENCORE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_PURSUIT] =\n    {\n        .effect = EFFECT_PURSUIT,\n        .power = 40,\n        .type = TYPE_DARK,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_RAPID_SPIN] =\n    {\n        .effect = EFFECT_RAPID_SPIN,\n        .power = 20,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SWEET_SCENT] =\n    {\n        .effect = EFFECT_EVASION_DOWN,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_IRON_TAIL] =\n    {\n        .effect = EFFECT_DEFENSE_DOWN_HIT,\n        .power = 100,\n        .type = TYPE_STEEL,\n        .accuracy = 75,\n        .pp = 15,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_METAL_CLAW] =\n    {\n        .effect = EFFECT_ATTACK_UP_HIT,\n        .power = 50,\n        .type = TYPE_STEEL,\n        .accuracy = 95,\n        .pp = 35,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_VITAL_THROW] =\n    {\n        .effect = EFFECT_VITAL_THROW,\n        .power = 70,\n        .type = TYPE_FIGHTING,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = -1,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_MORNING_SUN] =\n    {\n        .effect = EFFECT_MORNING_SUN,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_SYNTHESIS] =\n    {\n        .effect = EFFECT_SYNTHESIS,\n        .power = 0,\n        .type = TYPE_GRASS,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_MOONLIGHT] =\n    {\n        .effect = EFFECT_MOONLIGHT,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_HIDDEN_POWER] =\n    {\n        .effect = EFFECT_HIDDEN_POWER,\n        .power = 1,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_CROSS_CHOP] =\n    {\n        .effect = EFFECT_HIGH_CRITICAL,\n        .power = 100,\n        .type = TYPE_FIGHTING,\n        .accuracy = 80,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_TWISTER] =\n    {\n        .effect = EFFECT_TWISTER,\n        .power = 40,\n        .type = TYPE_DRAGON,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 20,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_RAIN_DANCE] =\n    {\n        .effect = EFFECT_RAIN_DANCE,\n        .power = 0,\n        .type = TYPE_WATER,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_SUNNY_DAY] =\n    {\n        .effect = EFFECT_SUNNY_DAY,\n        .power = 0,\n        .type = TYPE_FIRE,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_CRUNCH] =\n    {\n        .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT,\n        .power = 80,\n        .type = TYPE_DARK,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 20,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MIRROR_COAT] =\n    {\n        .effect = EFFECT_MIRROR_COAT,\n        .power = 1,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_DEPENDS,\n        .priority = -5,\n        .flags = FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_PSYCH_UP] =\n    {\n        .effect = EFFECT_PSYCH_UP,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_EXTREME_SPEED] =\n    {\n        .effect = EFFECT_QUICK_ATTACK,\n        .power = 80,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 1,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_ANCIENT_POWER] =\n    {\n        .effect = EFFECT_ALL_STATS_UP_HIT,\n        .power = 60,\n        .type = TYPE_ROCK,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SHADOW_BALL] =\n    {\n        .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT,\n        .power = 80,\n        .type = TYPE_GHOST,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 20,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FUTURE_SIGHT] =\n    {\n        .effect = EFFECT_FUTURE_SIGHT,\n        .power = 80,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 90,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_ROCK_SMASH] =\n    {\n        .effect = EFFECT_DEFENSE_DOWN_HIT,\n        .power = 20,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 50,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_WHIRLPOOL] =\n    {\n        .effect = EFFECT_TRAP,\n        .power = 15,\n        .type = TYPE_WATER,\n        .accuracy = 70,\n        .pp = 15,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_BEAT_UP] =\n    {\n        .effect = EFFECT_BEAT_UP,\n        .power = 10,\n        .type = TYPE_DARK,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_FAKE_OUT] =\n    {\n        .effect = EFFECT_FAKE_OUT,\n        .power = 40,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 1,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_UPROAR] =\n    {\n        .effect = EFFECT_UPROAR,\n        .power = 50,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_RANDOM,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_STOCKPILE] =\n    {\n        .effect = EFFECT_STOCKPILE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_SPIT_UP] =\n    {\n        .effect = EFFECT_SPIT_UP,\n        .power = 100,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SWALLOW] =\n    {\n        .effect = EFFECT_SWALLOW,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_HEAT_WAVE] =\n    {\n        .effect = EFFECT_BURN_HIT,\n        .power = 100,\n        .type = TYPE_FIRE,\n        .accuracy = 90,\n        .pp = 10,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_HAIL] =\n    {\n        .effect = EFFECT_HAIL,\n        .power = 0,\n        .type = TYPE_ICE,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED,\n    },\n\n    [MOVE_TORMENT] =\n    {\n        .effect = EFFECT_TORMENT,\n        .power = 0,\n        .type = TYPE_DARK,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FLATTER] =\n    {\n        .effect = EFFECT_FLATTER,\n        .power = 0,\n        .type = TYPE_DARK,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_WILL_O_WISP] =\n    {\n        .effect = EFFECT_WILL_O_WISP,\n        .power = 0,\n        .type = TYPE_FIRE,\n        .accuracy = 75,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MEMENTO] =\n    {\n        .effect = EFFECT_MEMENTO,\n        .power = 0,\n        .type = TYPE_DARK,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FACADE] =\n    {\n        .effect = EFFECT_FACADE,\n        .power = 70,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FOCUS_PUNCH] =\n    {\n        .effect = EFFECT_FOCUS_PUNCH,\n        .power = 150,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = -3,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED,\n    },\n\n    [MOVE_SMELLING_SALT] =\n    {\n        .effect = EFFECT_SMELLINGSALT,\n        .power = 60,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FOLLOW_ME] =\n    {\n        .effect = EFFECT_FOLLOW_ME,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 3,\n        .flags = 0,\n    },\n\n    [MOVE_NATURE_POWER] =\n    {\n        .effect = EFFECT_NATURE_POWER,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_DEPENDS,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_CHARGE] =\n    {\n        .effect = EFFECT_CHARGE,\n        .power = 0,\n        .type = TYPE_ELECTRIC,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_TAUNT] =\n    {\n        .effect = EFFECT_TAUNT,\n        .power = 0,\n        .type = TYPE_DARK,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED,\n    },\n\n    [MOVE_HELPING_HAND] =\n    {\n        .effect = EFFECT_HELPING_HAND,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 5,\n        .flags = 0,\n    },\n\n    [MOVE_TRICK] =\n    {\n        .effect = EFFECT_TRICK,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_ROLE_PLAY] =\n    {\n        .effect = EFFECT_ROLE_PLAY,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_WISH] =\n    {\n        .effect = EFFECT_WISH,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED,\n    },\n\n    [MOVE_ASSIST] =\n    {\n        .effect = EFFECT_ASSIST,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_DEPENDS,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_INGRAIN] =\n    {\n        .effect = EFFECT_INGRAIN,\n        .power = 0,\n        .type = TYPE_GRASS,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_SUPERPOWER] =\n    {\n        .effect = EFFECT_SUPERPOWER,\n        .power = 120,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MAGIC_COAT] =\n    {\n        .effect = EFFECT_MAGIC_COAT,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_DEPENDS,\n        .priority = 4,\n        .flags = 0,\n    },\n\n    [MOVE_RECYCLE] =\n    {\n        .effect = EFFECT_RECYCLE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_REVENGE] =\n    {\n        .effect = EFFECT_REVENGE,\n        .power = 60,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = -4,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_BRICK_BREAK] =\n    {\n        .effect = EFFECT_BRICK_BREAK,\n        .power = 75,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_YAWN] =\n    {\n        .effect = EFFECT_YAWN,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_KNOCK_OFF] =\n    {\n        .effect = EFFECT_KNOCK_OFF,\n        .power = 20,\n        .type = TYPE_DARK,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_ENDEAVOR] =\n    {\n        .effect = EFFECT_ENDEAVOR,\n        .power = 1,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_ERUPTION] =\n    {\n        .effect = EFFECT_ERUPTION,\n        .power = 150,\n        .type = TYPE_FIRE,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SKILL_SWAP] =\n    {\n        .effect = EFFECT_SKILL_SWAP,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_IMPRISON] =\n    {\n        .effect = EFFECT_IMPRISON,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED,\n    },\n\n    [MOVE_REFRESH] =\n    {\n        .effect = EFFECT_REFRESH,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_GRUDGE] =\n    {\n        .effect = EFFECT_GRUDGE,\n        .power = 0,\n        .type = TYPE_GHOST,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SNATCH] =\n    {\n        .effect = EFFECT_SNATCH,\n        .power = 0,\n        .type = TYPE_DARK,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_DEPENDS,\n        .priority = 4,\n        .flags = 0,\n    },\n\n    [MOVE_SECRET_POWER] =\n    {\n        .effect = EFFECT_SECRET_POWER,\n        .power = 70,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_DIVE] =\n    {\n        .effect = EFFECT_SEMI_INVULNERABLE,\n        .power = 60,\n        .type = TYPE_WATER,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_ARM_THRUST] =\n    {\n        .effect = EFFECT_MULTI_HIT,\n        .power = 15,\n        .type = TYPE_FIGHTING,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_CAMOUFLAGE] =\n    {\n        .effect = EFFECT_CAMOUFLAGE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_TAIL_GLOW] =\n    {\n        .effect = EFFECT_SPECIAL_ATTACK_UP_2,\n        .power = 0,\n        .type = TYPE_BUG,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_LUSTER_PURGE] =\n    {\n        .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT,\n        .power = 70,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 50,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MIST_BALL] =\n    {\n        .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT,\n        .power = 70,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 50,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_FEATHER_DANCE] =\n    {\n        .effect = EFFECT_ATTACK_DOWN_2,\n        .power = 0,\n        .type = TYPE_FLYING,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_TEETER_DANCE] =\n    {\n        .effect = EFFECT_TEETER_DANCE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_FOES_AND_ALLY,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED,\n    },\n\n    [MOVE_BLAZE_KICK] =\n    {\n        .effect = EFFECT_BLAZE_KICK,\n        .power = 85,\n        .type = TYPE_FIRE,\n        .accuracy = 90,\n        .pp = 10,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MUD_SPORT] =\n    {\n        .effect = EFFECT_MUD_SPORT,\n        .power = 0,\n        .type = TYPE_GROUND,\n        .accuracy = 0,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_ICE_BALL] =\n    {\n        .effect = EFFECT_ROLLOUT,\n        .power = 30,\n        .type = TYPE_ICE,\n        .accuracy = 90,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_NEEDLE_ARM] =\n    {\n        .effect = EFFECT_FLINCH_MINIMIZE_HIT,\n        .power = 60,\n        .type = TYPE_GRASS,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SLACK_OFF] =\n    {\n        .effect = EFFECT_RESTORE_HP,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_HYPER_VOICE] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 90,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_POISON_FANG] =\n    {\n        .effect = EFFECT_POISON_FANG,\n        .power = 50,\n        .type = TYPE_POISON,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_CRUSH_CLAW] =\n    {\n        .effect = EFFECT_DEFENSE_DOWN_HIT,\n        .power = 75,\n        .type = TYPE_NORMAL,\n        .accuracy = 95,\n        .pp = 10,\n        .secondaryEffectChance = 50,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_BLAST_BURN] =\n    {\n        .effect = EFFECT_RECHARGE,\n        .power = 150,\n        .type = TYPE_FIRE,\n        .accuracy = 90,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_HYDRO_CANNON] =\n    {\n        .effect = EFFECT_RECHARGE,\n        .power = 150,\n        .type = TYPE_WATER,\n        .accuracy = 90,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_METEOR_MASH] =\n    {\n        .effect = EFFECT_ATTACK_UP_HIT,\n        .power = 100,\n        .type = TYPE_STEEL,\n        .accuracy = 85,\n        .pp = 10,\n        .secondaryEffectChance = 20,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_ASTONISH] =\n    {\n        .effect = EFFECT_FLINCH_MINIMIZE_HIT,\n        .power = 30,\n        .type = TYPE_GHOST,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_WEATHER_BALL] =\n    {\n        .effect = EFFECT_WEATHER_BALL,\n        .power = 50,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_AROMATHERAPY] =\n    {\n        .effect = EFFECT_HEAL_BELL,\n        .power = 0,\n        .type = TYPE_GRASS,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_FAKE_TEARS] =\n    {\n        .effect = EFFECT_SPECIAL_DEFENSE_DOWN_2,\n        .power = 0,\n        .type = TYPE_DARK,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_AIR_CUTTER] =\n    {\n        .effect = EFFECT_HIGH_CRITICAL,\n        .power = 55,\n        .type = TYPE_FLYING,\n        .accuracy = 95,\n        .pp = 25,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_OVERHEAT] =\n    {\n        .effect = EFFECT_OVERHEAT,\n        .power = 140,\n        .type = TYPE_FIRE,\n        .accuracy = 90,\n        .pp = 5,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_ODOR_SLEUTH] =\n    {\n        .effect = EFFECT_FORESIGHT,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_ROCK_TOMB] =\n    {\n        .effect = EFFECT_SPEED_DOWN_HIT,\n        .power = 50,\n        .type = TYPE_ROCK,\n        .accuracy = 80,\n        .pp = 10,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SILVER_WIND] =\n    {\n        .effect = EFFECT_ALL_STATS_UP_HIT,\n        .power = 60,\n        .type = TYPE_BUG,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_METAL_SOUND] =\n    {\n        .effect = EFFECT_SPECIAL_DEFENSE_DOWN_2,\n        .power = 0,\n        .type = TYPE_STEEL,\n        .accuracy = 85,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_GRASS_WHISTLE] =\n    {\n        .effect = EFFECT_SLEEP,\n        .power = 0,\n        .type = TYPE_GRASS,\n        .accuracy = 55,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_TICKLE] =\n    {\n        .effect = EFFECT_TICKLE,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_COSMIC_POWER] =\n    {\n        .effect = EFFECT_COSMIC_POWER,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_WATER_SPOUT] =\n    {\n        .effect = EFFECT_ERUPTION,\n        .power = 150,\n        .type = TYPE_WATER,\n        .accuracy = 100,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SIGNAL_BEAM] =\n    {\n        .effect = EFFECT_CONFUSE_HIT,\n        .power = 75,\n        .type = TYPE_BUG,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SHADOW_PUNCH] =\n    {\n        .effect = EFFECT_ALWAYS_HIT,\n        .power = 60,\n        .type = TYPE_GHOST,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_EXTRASENSORY] =\n    {\n        .effect = EFFECT_FLINCH_MINIMIZE_HIT,\n        .power = 80,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_SKY_UPPERCUT] =\n    {\n        .effect = EFFECT_SKY_UPPERCUT,\n        .power = 85,\n        .type = TYPE_FIGHTING,\n        .accuracy = 90,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SAND_TOMB] =\n    {\n        .effect = EFFECT_TRAP,\n        .power = 15,\n        .type = TYPE_GROUND,\n        .accuracy = 70,\n        .pp = 15,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SHEER_COLD] =\n    {\n        .effect = EFFECT_OHKO,\n        .power = 1,\n        .type = TYPE_ICE,\n        .accuracy = 30,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_MUDDY_WATER] =\n    {\n        .effect = EFFECT_ACCURACY_DOWN_HIT,\n        .power = 95,\n        .type = TYPE_WATER,\n        .accuracy = 85,\n        .pp = 10,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_BOTH,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_BULLET_SEED] =\n    {\n        .effect = EFFECT_MULTI_HIT,\n        .power = 10,\n        .type = TYPE_GRASS,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_AERIAL_ACE] =\n    {\n        .effect = EFFECT_ALWAYS_HIT,\n        .power = 60,\n        .type = TYPE_FLYING,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_ICICLE_SPEAR] =\n    {\n        .effect = EFFECT_MULTI_HIT,\n        .power = 10,\n        .type = TYPE_ICE,\n        .accuracy = 100,\n        .pp = 30,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_IRON_DEFENSE] =\n    {\n        .effect = EFFECT_DEFENSE_UP_2,\n        .power = 0,\n        .type = TYPE_STEEL,\n        .accuracy = 0,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_BLOCK] =\n    {\n        .effect = EFFECT_MEAN_LOOK,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGIC_COAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_HOWL] =\n    {\n        .effect = EFFECT_ATTACK_UP,\n        .power = 0,\n        .type = TYPE_NORMAL,\n        .accuracy = 0,\n        .pp = 40,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_DRAGON_CLAW] =\n    {\n        .effect = EFFECT_HIT,\n        .power = 80,\n        .type = TYPE_DRAGON,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_FRENZY_PLANT] =\n    {\n        .effect = EFFECT_RECHARGE,\n        .power = 150,\n        .type = TYPE_GRASS,\n        .accuracy = 90,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_BULK_UP] =\n    {\n        .effect = EFFECT_BULK_UP,\n        .power = 0,\n        .type = TYPE_FIGHTING,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_BOUNCE] =\n    {\n        .effect = EFFECT_SEMI_INVULNERABLE,\n        .power = 85,\n        .type = TYPE_FLYING,\n        .accuracy = 85,\n        .pp = 5,\n        .secondaryEffectChance = 30,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_MUD_SHOT] =\n    {\n        .effect = EFFECT_SPEED_DOWN_HIT,\n        .power = 55,\n        .type = TYPE_GROUND,\n        .accuracy = 95,\n        .pp = 15,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_POISON_TAIL] =\n    {\n        .effect = EFFECT_POISON_TAIL,\n        .power = 50,\n        .type = TYPE_POISON,\n        .accuracy = 100,\n        .pp = 25,\n        .secondaryEffectChance = 10,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_COVET] =\n    {\n        .effect = EFFECT_THIEF,\n        .power = 40,\n        .type = TYPE_NORMAL,\n        .accuracy = 100,\n        .pp = 40,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,\n    },\n\n    [MOVE_VOLT_TACKLE] =\n    {\n        .effect = EFFECT_DOUBLE_EDGE,\n        .power = 120,\n        .type = TYPE_ELECTRIC,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_MAGICAL_LEAF] =\n    {\n        .effect = EFFECT_ALWAYS_HIT,\n        .power = 60,\n        .type = TYPE_GRASS,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_WATER_SPORT] =\n    {\n        .effect = EFFECT_WATER_SPORT,\n        .power = 0,\n        .type = TYPE_WATER,\n        .accuracy = 0,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_CALM_MIND] =\n    {\n        .effect = EFFECT_CALM_MIND,\n        .power = 0,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_LEAF_BLADE] =\n    {\n        .effect = EFFECT_HIGH_CRITICAL,\n        .power = 70,\n        .type = TYPE_GRASS,\n        .accuracy = 100,\n        .pp = 15,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_DRAGON_DANCE] =\n    {\n        .effect = EFFECT_DRAGON_DANCE,\n        .power = 0,\n        .type = TYPE_DRAGON,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_USER,\n        .priority = 0,\n        .flags = FLAG_SNATCH_AFFECTED,\n    },\n\n    [MOVE_ROCK_BLAST] =\n    {\n        .effect = EFFECT_MULTI_HIT,\n        .power = 25,\n        .type = TYPE_ROCK,\n        .accuracy = 80,\n        .pp = 10,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_SHOCK_WAVE] =\n    {\n        .effect = EFFECT_ALWAYS_HIT,\n        .power = 60,\n        .type = TYPE_ELECTRIC,\n        .accuracy = 0,\n        .pp = 20,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_WATER_PULSE] =\n    {\n        .effect = EFFECT_CONFUSE_HIT,\n        .power = 60,\n        .type = TYPE_WATER,\n        .accuracy = 100,\n        .pp = 20,\n        .secondaryEffectChance = 20,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n\n    [MOVE_DOOM_DESIRE] =\n    {\n        .effect = EFFECT_FUTURE_SIGHT,\n        .power = 120,\n        .type = TYPE_STEEL,\n        .accuracy = 85,\n        .pp = 5,\n        .secondaryEffectChance = 0,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = 0,\n    },\n\n    [MOVE_PSYCHO_BOOST] =\n    {\n        .effect = EFFECT_OVERHEAT,\n        .power = 140,\n        .type = TYPE_PSYCHIC,\n        .accuracy = 90,\n        .pp = 5,\n        .secondaryEffectChance = 100,\n        .target = MOVE_TARGET_SELECTED,\n        .priority = 0,\n        .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED,\n    },\n};\n"
  },
  {
    "path": "src/data/battle_tower/level_100_mons.h",
    "content": "const struct BattleTowerPokemonTemplate gBattleTowerLevel100Mons[] =\n{\n\t{\n\t\t.species = SPECIES_LINOONE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_GROWL,\n\t\t\tMOVE_TAIL_WHIP,\n\t\t\tMOVE_SAND_ATTACK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_MIGHTYENA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_BITE,\n\t\t\tMOVE_HOWL,\n\t\t\tMOVE_ODOR_SLEUTH,\n\t\t\tMOVE_SCARY_FACE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_BEAUTIFLY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_GUST,\n\t\t\tMOVE_STUN_SPORE,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_DUSTOX,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_PSYBEAM,\n\t\t\tMOVE_GUST,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_SILVER_WIND\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_LOMBRE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_ASTONISH,\n\t\t\tMOVE_GROWL,\n\t\t\tMOVE_MEGA_DRAIN,\n\t\t\tMOVE_SURF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LONELY,\n\t},\n\t{\n\t\t.species = SPECIES_NUZLEAF,\n\t\t.heldItem = BATTLE_TOWER_ITEM_WHITE_HERB,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_BULLET_SEED,\n\t\t\tMOVE_RAZOR_WIND,\n\t\t\tMOVE_FAINT_ATTACK,\n\t\t\tMOVE_GROWTH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SWELLOW,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_AERIAL_ACE,\n\t\t\tMOVE_GROWL,\n\t\t\tMOVE_ENDEAVOR,\n\t\t\tMOVE_FOCUS_ENERGY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_PELIPPER,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER,\n\t\t.teamFlags = 0x02,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_WATER_SPORT,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_SUPERSONIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_MILD,\n\t},\n\t{\n\t\t.species = SPECIES_BRELOOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_MACH_PUNCH,\n\t\t\tMOVE_MEGA_DRAIN,\n\t\t\tMOVE_HEADBUTT,\n\t\t\tMOVE_STUN_SPORE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_NINJASK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_SCRATCH,\n\t\t\tMOVE_SCREECH,\n\t\t\tMOVE_LEECH_LIFE,\n\t\t\tMOVE_FLASH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_CROBAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_BITE,\n\t\t\tMOVE_FLY,\n\t\t\tMOVE_SUPERSONIC,\n\t\t\tMOVE_HAZE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_IMPISH,\n\t},\n\t{\n\t\t.species = SPECIES_MAWILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_METAL_COAT,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_VICE_GRIP,\n\t\t\tMOVE_SWEET_SCENT,\n\t\t\tMOVE_ASTONISH,\n\t\t\tMOVE_STRENGTH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_NOSEPASS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_ROCK_THROW,\n\t\t\tMOVE_SANDSTORM,\n\t\t\tMOVE_HARDEN,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_IMPISH,\n\t},\n\t{\n\t\t.species = SPECIES_DELCATTY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_SLAP,\n\t\t\tMOVE_TAIL_WHIP,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_CHARM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_CAMERUPT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHARCOAL,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_EMBER,\n\t\t\tMOVE_TAKE_DOWN,\n\t\t\tMOVE_GROWL,\n\t\t\tMOVE_SANDSTORM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_MUK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_ORAN_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_POISON_GAS,\n\t\t\tMOVE_MINIMIZE,\n\t\t\tMOVE_SLUDGE,\n\t\t\tMOVE_SCREECH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CALM,\n\t},\n\t{\n\t\t.species = SPECIES_SANDSLASH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SOFT_SAND,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_SAND_ATTACK,\n\t\t\tMOVE_DEFENSE_CURL,\n\t\t\tMOVE_SWIFT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SPINDA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SILK_SCARF,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_UPROAR,\n\t\t\tMOVE_WATER_PULSE,\n\t\t\tMOVE_THRASH,\n\t\t\tMOVE_SAFEGUARD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_WHISCASH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_TICKLE,\n\t\t\tMOVE_MUD_SPORT,\n\t\t\tMOVE_WATER_GUN,\n\t\t\tMOVE_WATER_SPORT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_CACTURNE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_POISON_BARB,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_POISON_STING,\n\t\t\tMOVE_PIN_MISSILE,\n\t\t\tMOVE_ABSORB,\n\t\t\tMOVE_COTTON_SPORE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_JIGGLYPUFF,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_SING,\n\t\t\tMOVE_ROLLOUT,\n\t\t\tMOVE_POUND,\n\t\t\tMOVE_LIGHT_SCREEN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MARILL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_BUBBLE_BEAM,\n\t\t\tMOVE_DEFENSE_CURL,\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_IRON_TAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_MAGNETON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER_SHOCK,\n\t\t\tMOVE_SUPERSONIC,\n\t\t\tMOVE_FLASH,\n\t\t\tMOVE_SCREECH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_CARVANHA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_BITE,\n\t\t\tMOVE_RAGE,\n\t\t\tMOVE_SCARY_FACE,\n\t\t\tMOVE_LEER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_QUIRKY,\n\t},\n\t{\n\t\t.species = SPECIES_KECLEON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_THIEF,\n\t\t\tMOVE_LICK,\n\t\t\tMOVE_BIND,\n\t\t\tMOVE_FURY_SWIPES\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_NINETALES,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHARCOAL,\n\t\t.teamFlags = 0x02,\n\t\t.moves = {\n\t\t\tMOVE_EMBER,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_FIRE_SPIN,\n\t\t\tMOVE_SAFEGUARD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_LONELY,\n\t},\n\t{\n\t\t.species = SPECIES_RAICHU,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_SHOCK_WAVE,\n\t\t\tMOVE_GROWL,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_LIGHT_SCREEN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_SEALEO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_ICE_BALL,\n\t\t\tMOVE_WATER_GUN,\n\t\t\tMOVE_ENCORE,\n\t\t\tMOVE_HAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_GRAVELER,\n\t\t.heldItem = BATTLE_TOWER_ITEM_HARD_STONE,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_ROCK_THROW,\n\t\t\tMOVE_MUD_SPORT,\n\t\t\tMOVE_SANDSTORM,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_SHUPPET,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SPELL_TAG,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_NIGHT_SHADE,\n\t\t\tMOVE_WILL_O_WISP,\n\t\t\tMOVE_SCREECH,\n\t\t\tMOVE_KNOCK_OFF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_LUVDISC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_FLAIL,\n\t\t\tMOVE_SWEET_KISS,\n\t\t\tMOVE_WATER_PULSE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_LANTURN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_SUPERSONIC,\n\t\t\tMOVE_WATER_GUN,\n\t\t\tMOVE_SPARK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_CORSOLA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_BUBBLE,\n\t\t\tMOVE_HARDEN,\n\t\t\tMOVE_LIGHT_SCREEN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_WAILMER,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ROAR,\n\t\t\tMOVE_GROWL,\n\t\t\tMOVE_MIST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_RHYDON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_TAKE_DOWN,\n\t\t\tMOVE_SCARY_FACE,\n\t\t\tMOVE_TAIL_WHIP,\n\t\t\tMOVE_ROAR\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_DODRIO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_FURY_ATTACK,\n\t\t\tMOVE_PURSUIT,\n\t\t\tMOVE_AERIAL_ACE,\n\t\t\tMOVE_AGILITY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_GOLDUCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_FURY_SWIPES,\n\t\t\tMOVE_TAIL_WHIP,\n\t\t\tMOVE_DISABLE,\n\t\t\tMOVE_PSYCH_UP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_BELLOSSOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_POISON_POWDER,\n\t\t\tMOVE_STUN_SPORE,\n\t\t\tMOVE_ACID\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_TROPIUS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_STOMP,\n\t\t\tMOVE_RAZOR_LEAF,\n\t\t\tMOVE_GUST,\n\t\t\tMOVE_SYNTHESIS\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SABLEYE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SPELL_TAG,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_NIGHT_SHADE,\n\t\t\tMOVE_FAKE_OUT,\n\t\t\tMOVE_PSYCH_UP,\n\t\t\tMOVE_DETECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ELECTRODE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_SONIC_BOOM,\n\t\t\tMOVE_SCREECH,\n\t\t\tMOVE_SPARK,\n\t\t\tMOVE_SELF_DESTRUCT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_QUIRKY,\n\t},\n\t{\n\t\t.species = SPECIES_TENTACRUEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_POISON_BARB,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_ACID,\n\t\t\tMOVE_WATER_PULSE,\n\t\t\tMOVE_BARRIER,\n\t\t\tMOVE_WRAP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_CLAYDOL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SOFT_SAND,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_ANCIENT_POWER,\n\t\t\tMOVE_MUD_SLAP,\n\t\t\tMOVE_RAPID_SPIN,\n\t\t\tMOVE_CONFUSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_GRUMPIG,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_PSYBEAM,\n\t\t\tMOVE_PSYCH_UP,\n\t\t\tMOVE_BOUNCE,\n\t\t\tMOVE_MAGIC_COAT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_CRAWDAUNT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_CRABHAMMER,\n\t\t\tMOVE_BUBBLE_BEAM,\n\t\t\tMOVE_BRICK_BREAK,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_CALM,\n\t},\n\t{\n\t\t.species = SPECIES_SEVIPER,\n\t\t.heldItem = BATTLE_TOWER_ITEM_POISON_BARB,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_POISON_TAIL,\n\t\t\tMOVE_GLARE,\n\t\t\tMOVE_WRAP,\n\t\t\tMOVE_THIEF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_ZANGOOSE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_FURY_CUTTER,\n\t\t\tMOVE_LEER,\n\t\t\tMOVE_QUICK_ATTACK,\n\t\t\tMOVE_DETECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ALTARIA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_BREATH,\n\t\t\tMOVE_SING,\n\t\t\tMOVE_SAFEGUARD,\n\t\t\tMOVE_TAKE_DOWN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ROSELIA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_LEECH_SEED,\n\t\t\tMOVE_MEGA_DRAIN,\n\t\t\tMOVE_GROWTH,\n\t\t\tMOVE_STUN_SPORE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_VOLBEAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_SIGNAL_BEAM,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_LIGHT_SCREEN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ILLUMISE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_CHARM,\n\t\t\tMOVE_ENCORE,\n\t\t\tMOVE_SOLAR_BEAM,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_MANECTRIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MAGNET,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_BITE,\n\t\t\tMOVE_HOWL,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_SPARK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_MAWILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_IRON_DEFENSE,\n\t\t\tMOVE_TORMENT,\n\t\t\tMOVE_SANDSTORM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_HARIYAMA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_ARM_THRUST,\n\t\t\tMOVE_FAKE_OUT,\n\t\t\tMOVE_WHIRLWIND,\n\t\t\tMOVE_REVERSAL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_SKARMORY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_METAL_COAT,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_STEEL_WING,\n\t\t\tMOVE_AGILITY,\n\t\t\tMOVE_TAUNT,\n\t\t\tMOVE_FLY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_TORKOAL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_FIRE_SPIN,\n\t\t\tMOVE_SMOKESCREEN,\n\t\t\tMOVE_BODY_SLAM,\n\t\t\tMOVE_AMNESIA\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_MILD,\n\t},\n\t{\n\t\t.species = SPECIES_GYARADOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_THRASH,\n\t\t\tMOVE_DRAGON_RAGE,\n\t\t\tMOVE_TWISTER,\n\t\t\tMOVE_HYDRO_PUMP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIRKY,\n\t},\n\t{\n\t\t.species = SPECIES_MIGHTYENA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_HOWL,\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_TORMENT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_QUIRKY,\n\t},\n\t{\n\t\t.species = SPECIES_LINOONE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY,\n\t\t.teamFlags = 0x06,\n\t\t.moves = {\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_SHOCK_WAVE,\n\t\t\tMOVE_TOXIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MASQUERAIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_STUN_SPORE,\n\t\t\tMOVE_SUNNY_DAY,\n\t\t\tMOVE_SOLAR_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_SCEPTILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x06,\n\t\t.moves = {\n\t\t\tMOVE_BULLET_SEED,\n\t\t\tMOVE_SLAM,\n\t\t\tMOVE_SCREECH,\n\t\t\tMOVE_DETECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_BLAZIKEN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x06,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_KICK,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_ROAR\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_SWAMPERT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x49,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_MUD_SHOT,\n\t\t\tMOVE_MUD_SPORT,\n\t\t\tMOVE_RAIN_DANCE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SALAMENCE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG,\n\t\t.teamFlags = 0x49,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_BREATH,\n\t\t\tMOVE_FLY,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CALM,\n\t},\n\t{\n\t\t.species = SPECIES_KINGDRA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x49,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_SMOKESCREEN,\n\t\t\tMOVE_RAIN_DANCE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_CORSOLA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_ANCIENT_POWER,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_SAFEGUARD,\n\t\t\tMOVE_REFLECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_RHYDON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_ROAR,\n\t\t\tMOVE_THUNDERBOLT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_HERACROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x06,\n\t\t.moves = {\n\t\t\tMOVE_MEGAHORN,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_LEER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_GIRAFARIG,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_BATON_PASS,\n\t\t\tMOVE_AGILITY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_XATU,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_FLY,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_TOXIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_DODRIO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_DRILL_PECK,\n\t\t\tMOVE_TRI_ATTACK,\n\t\t\tMOVE_PURSUIT,\n\t\t\tMOVE_TORMENT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_VILEPLUME,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x89,\n\t\t.moves = {\n\t\t\tMOVE_POISON_POWDER,\n\t\t\tMOVE_STUN_SPORE,\n\t\t\tMOVE_SLEEP_POWDER,\n\t\t\tMOVE_PETAL_DANCE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_MODEST,\n\t},\n\t{\n\t\t.species = SPECIES_MEDICHAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON,\n\t\t.teamFlags = 0x06,\n\t\t.moves = {\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_LIGHT_SCREEN,\n\t\t\tMOVE_BULK_UP,\n\t\t\tMOVE_PSYCHIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_ABSOL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x06,\n\t\t.moves = {\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_SWORDS_DANCE,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_DUSCLOPS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SPELL_TAG,\n\t\t.teamFlags = 0x4B,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_WILL_O_WISP,\n\t\t\tMOVE_NIGHT_SHADE,\n\t\t\tMOVE_DISABLE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_SHUPPET,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SPELL_TAG,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_GRUDGE,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_CURSE,\n\t\t\tMOVE_KNOCK_OFF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_IMPISH,\n\t},\n\t{\n\t\t.species = SPECIES_CASTFORM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x82,\n\t\t.moves = {\n\t\t\tMOVE_WEATHER_BALL,\n\t\t\tMOVE_HAIL,\n\t\t\tMOVE_SUNNY_DAY,\n\t\t\tMOVE_RAIN_DANCE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_MODEST,\n\t},\n\t{\n\t\t.species = SPECIES_MILOTIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG,\n\t\t.teamFlags = 0x02,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_REFRESH,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_RAIN_DANCE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_SHARPEDO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_FOCUS_ENERGY,\n\t\t\tMOVE_SCARY_FACE,\n\t\t\tMOVE_SCREECH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_FLYGON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY,\n\t\t.teamFlags = 0x06,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SAND_ATTACK,\n\t\t\tMOVE_DRAGON_BREATH,\n\t\t\tMOVE_SAND_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_TRAPINCH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_SAND_TOMB,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_LUNATONE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_ROCK_THROW,\n\t\t\tMOVE_HYPNOSIS,\n\t\t\tMOVE_LIGHT_SCREEN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SOLROCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_SOLAR_BEAM,\n\t\t\tMOVE_SUNNY_DAY,\n\t\t\tMOVE_COSMIC_POWER,\n\t\t\tMOVE_CALM_MIND\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_BALTOY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_REFLECT,\n\t\t\tMOVE_SELF_DESTRUCT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_CRAWDAUNT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x06,\n\t\t.moves = {\n\t\t\tMOVE_CRABHAMMER,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_BRICK_BREAK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_WHISCASH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY,\n\t\t.teamFlags = 0x06,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_TICKLE,\n\t\t\tMOVE_AMNESIA,\n\t\t\tMOVE_SURF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SEVIPER,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_POISON_TAIL,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_HAZE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_MAGCARGO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x89,\n\t\t.moves = {\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_LIGHT_SCREEN,\n\t\t\tMOVE_AMNESIA,\n\t\t\tMOVE_ROCK_SLIDE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_MACHAMP,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BLACK_BELT,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_KARATE_CHOP,\n\t\t\tMOVE_SEISMIC_TOSS,\n\t\t\tMOVE_BRICK_BREAK,\n\t\t\tMOVE_LOW_KICK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_SWALOT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x86,\n\t\t.moves = {\n\t\t\tMOVE_YAWN,\n\t\t\tMOVE_WATER_PULSE,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_SLUDGE_BOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_SCEPTILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x0C,\n\t\t.moves = {\n\t\t\tMOVE_LEAF_BLADE,\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_FURY_CUTTER,\n\t\t\tMOVE_DETECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_BLAZIKEN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x0C,\n\t\t.moves = {\n\t\t\tMOVE_BLAZE_KICK,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_QUICK_ATTACK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SWAMPERT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x4C,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_MUD_SHOT,\n\t\t\tMOVE_MUD_SLAP,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MIGHTYENA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES,\n\t\t.teamFlags = 0x04,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_HOWL,\n\t\t\tMOVE_SWAGGER,\n\t\t\tMOVE_SHADOW_BALL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CALM,\n\t},\n\t{\n\t\t.species = SPECIES_LINOONE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x04,\n\t\t.moves = {\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_REST,\n\t\t\tMOVE_BELLY_DRUM,\n\t\t\tMOVE_THUNDERBOLT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_MILD,\n\t},\n\t{\n\t\t.species = SPECIES_BEAUTIFLY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x08,\n\t\t.moves = {\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_MORNING_SUN,\n\t\t\tMOVE_STUN_SPORE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_DUSTOX,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x08,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_SILVER_WIND,\n\t\t\tMOVE_MOONLIGHT,\n\t\t\tMOVE_TOXIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_LUDICOLO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x0C,\n\t\t.moves = {\n\t\t\tMOVE_FAKE_OUT,\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_UPROAR\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_SHIFTRY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x0C,\n\t\t.moves = {\n\t\t\tMOVE_FRUSTRATION,\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_TORMENT,\n\t\t\tMOVE_SWAGGER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_SWELLOW,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x88,\n\t\t.moves = {\n\t\t\tMOVE_FLY,\n\t\t\tMOVE_ENDEAVOR,\n\t\t\tMOVE_AERIAL_ACE,\n\t\t\tMOVE_TOXIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_GARDEVOIR,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES,\n\t\t.teamFlags = 0x4A,\n\t\t.moves = {\n\t\t\tMOVE_HYPNOSIS,\n\t\t\tMOVE_DREAM_EATER,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_BRELOOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x0C,\n\t\t.moves = {\n\t\t\tMOVE_DYNAMIC_PUNCH,\n\t\t\tMOVE_MIND_READER,\n\t\t\tMOVE_SNATCH,\n\t\t\tMOVE_MEGA_DRAIN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_VIGOROTH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x04,\n\t\t.moves = {\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_UPROAR,\n\t\t\tMOVE_ENCORE,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CALM,\n\t},\n\t{\n\t\t.species = SPECIES_NINJASK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER,\n\t\t.teamFlags = 0x04,\n\t\t.moves = {\n\t\t\tMOVE_FURY_CUTTER,\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_SWORDS_DANCE,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_SHEDINJA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0xCA,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_SOLAR_BEAM,\n\t\t\tMOVE_SUNNY_DAY,\n\t\t\tMOVE_GRUDGE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_LOUDRED,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY,\n\t\t.teamFlags = 0x04,\n\t\t.moves = {\n\t\t\tMOVE_HYPER_VOICE,\n\t\t\tMOVE_HOWL,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_TORMENT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_HARIYAMA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x04,\n\t\t.moves = {\n\t\t\tMOVE_ARM_THRUST,\n\t\t\tMOVE_BULK_UP,\n\t\t\tMOVE_BRICK_BREAK,\n\t\t\tMOVE_HIDDEN_POWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_ALAKAZAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON,\n\t\t.teamFlags = 0x88,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_FUTURE_SIGHT,\n\t\t\tMOVE_DISABLE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_CROBAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY,\n\t\t.teamFlags = 0x88,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_MEAN_LOOK,\n\t\t\tMOVE_SNATCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MAWILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_METAL_COAT,\n\t\t.teamFlags = 0x04,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_IRON_DEFENSE,\n\t\t\tMOVE_FAKE_TEARS,\n\t\t\tMOVE_POISON_FANG\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_AGGRON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_METAL_COAT,\n\t\t.teamFlags = 0x45,\n\t\t.moves = {\n\t\t\tMOVE_METAL_CLAW,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_METAL_SOUND,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_GOLEM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SOFT_SAND,\n\t\t.teamFlags = 0xC5,\n\t\t.moves = {\n\t\t\tMOVE_ROLLOUT,\n\t\t\tMOVE_DEFENSE_CURL,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_SELF_DESTRUCT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MANECTRIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MAGNET,\n\t\t.teamFlags = 0x04,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER,\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_CHARGE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_VOLBEAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER,\n\t\t.teamFlags = 0x08,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_SIGNAL_BEAM,\n\t\t\tMOVE_MOONLIGHT,\n\t\t\tMOVE_TAIL_GLOW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_ILLUMISE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER,\n\t\t.teamFlags = 0x08,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_FLATTER,\n\t\t\tMOVE_WISH,\n\t\t\tMOVE_ENCORE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_MASQUERAIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x88,\n\t\t.moves = {\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_SILVER_WIND,\n\t\t\tMOVE_STUN_SPORE,\n\t\t\tMOVE_TOXIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_ROSELIA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED,\n\t\t.teamFlags = 0x08,\n\t\t.moves = {\n\t\t\tMOVE_PETAL_DANCE,\n\t\t\tMOVE_GROWTH,\n\t\t\tMOVE_SYNTHESIS,\n\t\t\tMOVE_GRASS_WHISTLE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_IMPISH,\n\t},\n\t{\n\t\t.species = SPECIES_DELCATTY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x08,\n\t\t.moves = {\n\t\t\tMOVE_SING,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_DOUBLE_SLAP,\n\t\t\tMOVE_HEAL_BELL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_SEAKING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER,\n\t\t.teamFlags = 0x88,\n\t\t.moves = {\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_GYARADOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG,\n\t\t.teamFlags = 0x8C,\n\t\t.moves = {\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_DRAGON_RAGE,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CALM,\n\t},\n\t{\n\t\t.species = SPECIES_SWALOT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_STOCKPILE,\n\t\t\tMOVE_SWALLOW,\n\t\t\tMOVE_SPIT_UP,\n\t\t\tMOVE_YAWN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_MAGCARGO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_FIRE_BLAST,\n\t\t\tMOVE_BODY_SLAM,\n\t\t\tMOVE_LIGHT_SCREEN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LONELY,\n\t},\n\t{\n\t\t.species = SPECIES_MUK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_POISON_BARB,\n\t\t.teamFlags = 0xC3,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_ACID_ARMOR,\n\t\t\tMOVE_DISABLE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_SPINDA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SILK_SCARF,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_DIZZY_PUNCH,\n\t\t\tMOVE_TEETER_DANCE,\n\t\t\tMOVE_PSYCH_UP,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_MODEST,\n\t},\n\t{\n\t\t.species = SPECIES_ALTARIA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_DRAGON_BREATH,\n\t\t\tMOVE_DRAGON_DANCE,\n\t\t\tMOVE_REFRESH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_ZANGOOSE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_CRUSH_CLAW,\n\t\t\tMOVE_TAUNT,\n\t\t\tMOVE_SWORDS_DANCE,\n\t\t\tMOVE_DETECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIRKY,\n\t},\n\t{\n\t\t.species = SPECIES_SEVIPER,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_SWAGGER,\n\t\t\tMOVE_TAUNT,\n\t\t\tMOVE_GLARE,\n\t\t\tMOVE_POISON_TAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_GRUMPIG,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_BOUNCE,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_CACTURNE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_NEEDLE_ARM,\n\t\t\tMOVE_INGRAIN,\n\t\t\tMOVE_SPIKES,\n\t\t\tMOVE_COTTON_SPORE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_CLAYDOL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SANDSTORM,\n\t\t\tMOVE_COSMIC_POWER,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_TENTACRUEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB,\n\t\t.teamFlags = 0xC1,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_BARRIER,\n\t\t\tMOVE_SUPERSONIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WIGGLYTUFF,\n\t\t.heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY,\n\t\t.teamFlags = 0xC3,\n\t\t.moves = {\n\t\t\tMOVE_SING,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_DISABLE,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_AZUMARILL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY,\n\t\t.teamFlags = 0xC2,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_DEFENSE_CURL,\n\t\t\tMOVE_ROLLOUT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_ELECTRODE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY,\n\t\t.teamFlags = 0xC3,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_LIGHT_SCREEN,\n\t\t\tMOVE_SELF_DESTRUCT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MILOTIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_REFRESH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_KECLEON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_SKILL_SWAP,\n\t\t\tMOVE_ANCIENT_POWER,\n\t\t\tMOVE_WATER_PULSE,\n\t\t\tMOVE_THUNDERBOLT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_DUSCLOPS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_CURSE,\n\t\t\tMOVE_REST,\n\t\t\tMOVE_MEAN_LOOK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_ABSOL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_SWORDS_DANCE,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_SNATCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_NINETALES,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0xC2,\n\t\t.moves = {\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_WILL_O_WISP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_PIKACHU,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIGHT_BALL,\n\t\t.teamFlags = 0xC2,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_THUNDER,\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_VILEPLUME,\n\t\t.heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY,\n\t\t.teamFlags = 0xC3,\n\t\t.moves = {\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_SLEEP_POWDER,\n\t\t\tMOVE_MOONLIGHT,\n\t\t\tMOVE_SLUDGE_BOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_DONPHAN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_DOUBLE_EDGE,\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_FISSURE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIRKY,\n\t},\n\t{\n\t\t.species = SPECIES_STARMIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY,\n\t\t.teamFlags = 0xC3,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_WALREIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_BODY_SLAM,\n\t\t\tMOVE_ENCORE,\n\t\t\tMOVE_HAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_RELICANTH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_YAWN,\n\t\t\tMOVE_MUD_SPORT,\n\t\t\tMOVE_DOUBLE_EDGE,\n\t\t\tMOVE_SANDSTORM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LONELY,\n\t},\n\t{\n\t\t.species = SPECIES_KINGDRA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_AGILITY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_CRADILY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_INGRAIN,\n\t\t\tMOVE_ANCIENT_POWER,\n\t\t\tMOVE_GIGA_DRAIN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_MILD,\n\t},\n\t{\n\t\t.species = SPECIES_ARMALDO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_WATER_PULSE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_METAGROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_METAL_COAT,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_METAL_CLAW,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_LIGHT_SCREEN,\n\t\t\tMOVE_AGILITY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_SALAMENCE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_BREATH,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_AERIAL_ACE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_MIGHTYENA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_YAWN,\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_HOWL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_LINOONE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x02,\n\t\t.moves = {\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_TRICK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_LUDICOLO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_FAKE_OUT,\n\t\t\tMOVE_SYNTHESIS\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_EXPLOUD,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_UPROAR,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SWELLOW,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LANSAT_BERRY,\n\t\t.teamFlags = 0x02,\n\t\t.moves = {\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_SUPERSONIC,\n\t\t\tMOVE_WING_ATTACK,\n\t\t\tMOVE_ENDEAVOR\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_PELIPPER,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x82,\n\t\t.moves = {\n\t\t\tMOVE_STOCKPILE,\n\t\t\tMOVE_SWALLOW,\n\t\t\tMOVE_SPIT_UP,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_BRELOOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_DYNAMIC_PUNCH,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_BULK_UP,\n\t\t\tMOVE_MIND_READER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SHEDINJA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_RETURN,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_SHADOW_BALL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_EXPLOUD,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_SUPERSONIC,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_HARIYAMA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_FAKE_OUT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_ALAKAZAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x83,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_ENCORE,\n\t\t\tMOVE_DISABLE,\n\t\t\tMOVE_RECOVER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_CROBAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x81,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_AIR_CUTTER,\n\t\t\tMOVE_TORMENT,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SABLEYE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x83,\n\t\t.moves = {\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_DETECT,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_TORMENT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_MAWILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x02,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_SWORDS_DANCE,\n\t\t\tMOVE_IRON_DEFENSE,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_AGGRON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_EDGE,\n\t\t\tMOVE_IRON_DEFENSE,\n\t\t\tMOVE_ROAR,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_GOLEM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_NOSEPASS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x81,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_TORMENT,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_MANECTRIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x02,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_QUICK_ATTACK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_ROSELIA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x82,\n\t\t.moves = {\n\t\t\tMOVE_GRASS_WHISTLE,\n\t\t\tMOVE_LEECH_SEED,\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_GROWTH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_DELCATTY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_STARF_BERRY,\n\t\t.teamFlags = 0x02,\n\t\t.moves = {\n\t\t\tMOVE_ASSIST,\n\t\t\tMOVE_SING,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_SUBSTITUTE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_TROPIUS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0xC2,\n\t\t.moves = {\n\t\t\tMOVE_RAZOR_LEAF,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_SYNTHESIS\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_SWALOT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_YAWN,\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_MACHAMP,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BLACK_BELT,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_BULK_UP,\n\t\t\tMOVE_LOW_KICK,\n\t\t\tMOVE_BRICK_BREAK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_CAMERUPT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x40,\n\t\t.moves = {\n\t\t\tMOVE_ERUPTION,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_OVERHEAT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_MAGCARGO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_REFLECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WEEZING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x81,\n\t\t.moves = {\n\t\t\tMOVE_WILL_O_WISP,\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_DESTINY_BOND\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_SPINDA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND,\n\t\t.teamFlags = 0x82,\n\t\t.moves = {\n\t\t\tMOVE_TRICK,\n\t\t\tMOVE_TEETER_DANCE,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_SKARMORY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_DRILL_PECK,\n\t\t\tMOVE_STEEL_WING,\n\t\t\tMOVE_TORMENT,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ALTARIA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x02,\n\t\t.moves = {\n\t\t\tMOVE_SING,\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_GRUMPIG,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x82,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_CALM_MIND,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_SHIFTRY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x20,\n\t\t.moves = {\n\t\t\tMOVE_SWAGGER,\n\t\t\tMOVE_FRUSTRATION,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_CLAYDOL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x20,\n\t\t.moves = {\n\t\t\tMOVE_COSMIC_POWER,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_HARIYAMA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x33,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_BELLY_DRUM,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_NOSEPASS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x20,\n\t\t.moves = {\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_DUSCLOPS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x33,\n\t\t.moves = {\n\t\t\tMOVE_SHADOW_PUNCH,\n\t\t\tMOVE_WILL_O_WISP,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_DESTINY_BOND\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_SEAKING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY,\n\t\t.teamFlags = 0x20,\n\t\t.moves = {\n\t\t\tMOVE_HORN_DRILL,\n\t\t\tMOVE_AGILITY,\n\t\t\tMOVE_SLEEP_TALK,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_CAMERUPT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x73,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ERUPTION,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_FISSURE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_LANTURN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x13,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_CONFUSE_RAY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_WEEZING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x33,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_FIRE_BLAST,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WHISCASH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY,\n\t\t.teamFlags = 0x20,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_SPARK,\n\t\t\tMOVE_FISSURE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_AGGRON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x51,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_EDGE,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_KECLEON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND,\n\t\t.teamFlags = 0x12,\n\t\t.moves = {\n\t\t\tMOVE_TRICK,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_SNATCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_MILD,\n\t},\n\t{\n\t\t.species = SPECIES_SHARPEDO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x11,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_DOUBLE_EDGE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_SWAGGER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ABSOL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x12,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_EDGE,\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_SWORDS_DANCE,\n\t\t\tMOVE_QUICK_ATTACK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WAILORD,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY,\n\t\t.teamFlags = 0x72,\n\t\t.moves = {\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_FISSURE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_TENTACRUEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x20,\n\t\t.moves = {\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_BARRIER,\n\t\t\tMOVE_MIRROR_COAT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_SABLEYE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x32,\n\t\t.moves = {\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WOBBUFFET,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x20,\n\t\t.moves = {\n\t\t\tMOVE_ENCORE,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_DESTINY_BOND\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_MILD,\n\t},\n\t{\n\t\t.species = SPECIES_RHYDON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x71,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_MEGAHORN,\n\t\t\tMOVE_BRICK_BREAK,\n\t\t\tMOVE_HORN_DRILL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_GLALIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x31,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_HAIL,\n\t\t\tMOVE_SHEER_COLD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_SCEPTILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x8C,\n\t\t.moves = {\n\t\t\tMOVE_LEAF_BLADE,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_BLAZIKEN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x8C,\n\t\t.moves = {\n\t\t\tMOVE_BLAZE_KICK,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_ENDURE,\n\t\t\tMOVE_REVERSAL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SWAMPERT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x8C,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_BLIZZARD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_GARDEVOIR,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x1A,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_DESTINY_BOND,\n\t\t\tMOVE_SNATCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_BRELOOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x15,\n\t\t.moves = {\n\t\t\tMOVE_SPORE,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_MACH_PUNCH,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ALAKAZAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x58,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_FIRE_PUNCH,\n\t\t\tMOVE_ICE_PUNCH,\n\t\t\tMOVE_RECOVER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_HARIYAMA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x15,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_FAKE_OUT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_GYARADOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x55,\n\t\t.moves = {\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_CROBAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x58,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_AIR_CUTTER,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MACHAMP,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x5D,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_SLIDE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MANECTRIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x1A,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_ROAR,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_ELECTRODE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x60,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_MUK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x64,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_FLYGON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x1C,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_STARMIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x5C,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_CONFUSE_RAY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_NINETALES,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x4A,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_FIRE_SPIN,\n\t\t\tMOVE_HEAT_WAVE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_RAICHU,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x5A,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_REVERSAL,\n\t\t\tMOVE_IRON_TAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_GOLDUCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x55,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_DIG\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_HERACROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x5D,\n\t\t.moves = {\n\t\t\tMOVE_MEGAHORN,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ENDURE,\n\t\t\tMOVE_REVERSAL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WALREIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x26,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SHEER_COLD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_KINGDRA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x5B,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_DRAGON_BREATH,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_SALAMENCE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x0D,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_FIRE_BLAST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_METAGROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x3D,\n\t\t.moves = {\n\t\t\tMOVE_METEOR_MASH,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_REGIROCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x3C,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ANCIENT_POWER,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_REGICE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE,\n\t\t.teamFlags = 0x3C,\n\t\t.moves = {\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_REGISTEEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x3C,\n\t\t.moves = {\n\t\t\tMOVE_METAL_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_LATIAS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x0E,\n\t\t.moves = {\n\t\t\tMOVE_MIST_BALL,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_LATIOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x0D,\n\t\t.moves = {\n\t\t\tMOVE_LUSTER_PURGE,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_MILOTIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x1A,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_MIRROR_COAT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_SLAKING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x15,\n\t\t.moves = {\n\t\t\tMOVE_YAWN,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_SLACK_OFF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SCEPTILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x8C,\n\t\t.moves = {\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_LEECH_SEED,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_BLAZIKEN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x8C,\n\t\t.moves = {\n\t\t\tMOVE_BLAZE_KICK,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_QUICK_ATTACK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SWAMPERT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x8C,\n\t\t.moves = {\n\t\t\tMOVE_MUDDY_WATER,\n\t\t\tMOVE_MUD_SHOT,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_GARDEVOIR,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_HYPNOSIS,\n\t\t\tMOVE_DREAM_EATER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_BRELOOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_SPORE,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_SKY_UPPERCUT,\n\t\t\tMOVE_GIGA_DRAIN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_ALAKAZAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x58,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_THUNDER_PUNCH,\n\t\t\tMOVE_FIRE_PUNCH,\n\t\t\tMOVE_RECOVER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_HARIYAMA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x04,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_ENDURE,\n\t\t\tMOVE_REVERSAL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_GYARADOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x44,\n\t\t.moves = {\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_CROBAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x48,\n\t\t.moves = {\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_FLY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MACHAMP,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x5D,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MANECTRIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_QUICK_ATTACK,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_ELECTRODE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x60,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_LIGHT_SCREEN,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_MUK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x64,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_FLYGON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x1C,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_STARMIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0x5C,\n\t\t.moves = {\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_RECOVER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_DODRIO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x5A,\n\t\t.moves = {\n\t\t\tMOVE_DRILL_PECK,\n\t\t\tMOVE_TRI_ATTACK,\n\t\t\tMOVE_AGILITY,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_RAICHU,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x4A,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_FOCUS_PUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_GOLDUCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x45,\n\t\t.moves = {\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_HERACROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x5D,\n\t\t.moves = {\n\t\t\tMOVE_MEGAHORN,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_REVERSAL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WALREIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x26,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_SHEER_COLD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_KINGDRA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x5C,\n\t\t.moves = {\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_DRAGON_BREATH,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_SALAMENCE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x1D,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_METAGROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x3D,\n\t\t.moves = {\n\t\t\tMOVE_METEOR_MASH,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SHADOW_BALL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_REGIROCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x3C,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_REGICE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x3C,\n\t\t.moves = {\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_HAIL,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_REGISTEEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x3C,\n\t\t.moves = {\n\t\t\tMOVE_METAL_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ANCIENT_POWER,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_LATIAS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x1E,\n\t\t.moves = {\n\t\t\tMOVE_MIST_BALL,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_LATIOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE,\n\t\t.teamFlags = 0x1D,\n\t\t.moves = {\n\t\t\tMOVE_LUSTER_PURGE,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_MILOTIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x1A,\n\t\t.moves = {\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_MIRROR_COAT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_SLAKING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x15,\n\t\t.moves = {\n\t\t\tMOVE_YAWN,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_PURSUIT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SCEPTILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x8C,\n\t\t.moves = {\n\t\t\tMOVE_LEAF_BLADE,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_BLAZIKEN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY,\n\t\t.teamFlags = 0x8C,\n\t\t.moves = {\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_SWAGGER,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SWAMPERT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x8C,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_GARDEVOIR,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_WILL_O_WISP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_BRELOOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_SPORE,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_MACH_PUNCH,\n\t\t\tMOVE_COUNTER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ALAKAZAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND,\n\t\t.teamFlags = 0x58,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_TRICK,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_SNATCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_HARIYAMA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_REVENGE,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_REVERSAL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_LUDICOLO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_LEECH_SEED,\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_DIVE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_CROBAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x48,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_SNATCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MACHAMP,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x5D,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_FIRE_BLAST,\n\t\t\tMOVE_LOW_KICK,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MANECTRIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x08,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_ELECTRODE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x60,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER,\n\t\t\tMOVE_SWIFT,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_MUK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x64,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_SHADOW_PUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_FLYGON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE,\n\t\t.teamFlags = 0x0C,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FIRE_BLAST,\n\t\t\tMOVE_SANDSTORM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_STARMIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x4C,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_PSYCHIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_LUDICOLO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x4A,\n\t\t.moves = {\n\t\t\tMOVE_LEECH_SEED,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_SKARMORY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x4B,\n\t\t.moves = {\n\t\t\tMOVE_DRILL_PECK,\n\t\t\tMOVE_STEEL_WING,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_PURSUIT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_GOLDUCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x49,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_CROSS_CHOP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_HERACROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x5D,\n\t\t.moves = {\n\t\t\tMOVE_MEGAHORN,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WALREIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY,\n\t\t.teamFlags = 0x26,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_FISSURE,\n\t\t\tMOVE_SHEER_COLD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_KINGDRA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x5C,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_FLAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_SALAMENCE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x1D,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FIRE_BLAST,\n\t\t\tMOVE_HYDRO_PUMP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_METAGROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x3D,\n\t\t.moves = {\n\t\t\tMOVE_METEOR_MASH,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_HYPER_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_REGIROCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x3C,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_SUPERPOWER,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_REGICE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE,\n\t\t.teamFlags = 0x3C,\n\t\t.moves = {\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_ANCIENT_POWER,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_REGISTEEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x3C,\n\t\t.moves = {\n\t\t\tMOVE_METAL_CLAW,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_LATIAS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0x1E,\n\t\t.moves = {\n\t\t\tMOVE_MIST_BALL,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_LATIOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY,\n\t\t.teamFlags = 0x1D,\n\t\t.moves = {\n\t\t\tMOVE_LUSTER_PURGE,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_MILOTIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0x1A,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_ALTARIA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_SING,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_SCEPTILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x9C,\n\t\t.moves = {\n\t\t\tMOVE_LEAF_BLADE,\n\t\t\tMOVE_DETECT,\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_BLAZIKEN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x9C,\n\t\t.moves = {\n\t\t\tMOVE_BLAZE_KICK,\n\t\t\tMOVE_SKY_UPPERCUT,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_SLIDE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SWAMPERT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x9C,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SHEDINJA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x20,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_GRUDGE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_METAGROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x1D,\n\t\t.moves = {\n\t\t\tMOVE_METEOR_MASH,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_ALAKAZAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x58,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_THUNDER_PUNCH,\n\t\t\tMOVE_ICE_PUNCH,\n\t\t\tMOVE_FIRE_PUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_LATIAS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x1E,\n\t\t.moves = {\n\t\t\tMOVE_MIST_BALL,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_LATIOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x1D,\n\t\t.moves = {\n\t\t\tMOVE_LUSTER_PURGE,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SALAMENCE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x1D,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_AERIAL_ACE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_MACHAMP,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x5D,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_LOW_KICK,\n\t\t\tMOVE_ROCK_SLIDE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n};\n"
  },
  {
    "path": "src/data/battle_tower/level_50_mons.h",
    "content": "const struct BattleTowerPokemonTemplate gBattleTowerLevel50Mons[] =\n{\n\t{\n\t\t.species = SPECIES_PIKACHU,\n\t\t.heldItem = BATTLE_TOWER_ITEM_ORAN_BERRY,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_QUICK_ATTACK,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_THUNDER_SHOCK,\n\t\t\tMOVE_GROWL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_BEAUTIFLY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_ABSORB,\n\t\t\tMOVE_STUN_SPORE,\n\t\t\tMOVE_GUST,\n\t\t\tMOVE_SAFEGUARD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_SWELLOW,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_PECK,\n\t\t\tMOVE_WING_ATTACK,\n\t\t\tMOVE_AERIAL_ACE,\n\t\t\tMOVE_AGILITY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_WALREIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_HAIL,\n\t\t\tMOVE_ENCORE,\n\t\t\tMOVE_ICE_BALL,\n\t\t\tMOVE_TOXIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_SEAKING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_PECK,\n\t\t\tMOVE_FLAIL,\n\t\t\tMOVE_FURY_ATTACK,\n\t\t\tMOVE_SURF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_TORCHIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_FIRE_SPIN,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_SAND_ATTACK,\n\t\t\tMOVE_SLASH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_MASQUERAIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_WHITE_HERB,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_STUN_SPORE,\n\t\t\tMOVE_WATER_SPORT,\n\t\t\tMOVE_QUICK_ATTACK,\n\t\t\tMOVE_GUST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_IMPISH,\n\t},\n\t{\n\t\t.species = SPECIES_ILLUMISE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_NONE,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_FLATTER,\n\t\t\tMOVE_COVET,\n\t\t\tMOVE_WISH,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_DELCATTY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SILK_SCARF,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_TAIL_WHIP,\n\t\t\tMOVE_FAINT_ATTACK,\n\t\t\tMOVE_DIG\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LONELY,\n\t},\n\t{\n\t\t.species = SPECIES_KECLEON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_TAIL_WHIP,\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_LICK,\n\t\t\tMOVE_SCREECH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_MIGHTYENA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_BITE,\n\t\t\tMOVE_TAKE_DOWN,\n\t\t\tMOVE_ROAR,\n\t\t\tMOVE_HOWL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SLAKING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_FAINT_ATTACK,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_SCRATCH,\n\t\t\tMOVE_TAUNT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_MACHOKE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_LEER,\n\t\t\tMOVE_DIG,\n\t\t\tMOVE_LOW_KICK,\n\t\t\tMOVE_FOCUS_PUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_RHYDON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_STRENGTH,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_STOMP,\n\t\t\tMOVE_ROCK_SMASH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIRKY,\n\t},\n\t{\n\t\t.species = SPECIES_CACTURNE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_POISON_BARB,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_POISON_STING,\n\t\t\tMOVE_GROWTH,\n\t\t\tMOVE_ABSORB,\n\t\t\tMOVE_SOLAR_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ZIGZAGOON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_FLAIL,\n\t\t\tMOVE_SAND_ATTACK,\n\t\t\tMOVE_REST,\n\t\t\tMOVE_SURF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_DODRIO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_PURSUIT,\n\t\t\tMOVE_TRI_ATTACK,\n\t\t\tMOVE_GROWL,\n\t\t\tMOVE_AGILITY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_WHISCASH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_WATER_GUN,\n\t\t\tMOVE_AMNESIA,\n\t\t\tMOVE_MAGNITUDE,\n\t\t\tMOVE_MUD_SLAP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_NINJASK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_SAND_ATTACK,\n\t\t\tMOVE_FURY_CUTTER,\n\t\t\tMOVE_AGILITY,\n\t\t\tMOVE_HARDEN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_DUSCLOPS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_NIGHT_SHADE,\n\t\t\tMOVE_ASTONISH,\n\t\t\tMOVE_WILL_O_WISP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_CAMERUPT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHARCOAL,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_DIG,\n\t\t\tMOVE_EMBER,\n\t\t\tMOVE_GROWL,\n\t\t\tMOVE_ROCK_SMASH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_SPINDA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY,\n\t\t.teamFlags = 0x4A,\n\t\t.moves = {\n\t\t\tMOVE_TEETER_DANCE,\n\t\t\tMOVE_FLAIL,\n\t\t\tMOVE_PSYCH_UP,\n\t\t\tMOVE_DOUBLE_EDGE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CALM,\n\t},\n\t{\n\t\t.species = SPECIES_SEVIPER,\n\t\t.heldItem = BATTLE_TOWER_ITEM_POISON_BARB,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_SCREECH,\n\t\t\tMOVE_GLARE,\n\t\t\tMOVE_DIG,\n\t\t\tMOVE_POISON_FANG\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_FLYGON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x49,\n\t\t.moves = {\n\t\t\tMOVE_SAND_ATTACK,\n\t\t\tMOVE_SAND_TOMB,\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_TOXIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_AZUMARILL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_WHITE_HERB,\n\t\t.teamFlags = 0x42,\n\t\t.moves = {\n\t\t\tMOVE_BUBBLE_BEAM,\n\t\t\tMOVE_TAIL_WHIP,\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_ROLLOUT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ZANGOOSE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_STRENGTH,\n\t\t\tMOVE_TAUNT,\n\t\t\tMOVE_CRUSH_CLAW,\n\t\t\tMOVE_DETECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MEDICHAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_REVERSAL,\n\t\t\tMOVE_MEDITATE,\n\t\t\tMOVE_CONFUSION,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_ROSELIA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_GROWTH,\n\t\t\tMOVE_MEGA_DRAIN,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_CUT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_SWALOT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_STOCKPILE,\n\t\t\tMOVE_SPIT_UP,\n\t\t\tMOVE_SLUDGE,\n\t\t\tMOVE_POISON_GAS\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MAGNETON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MAGNET,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_SUPERSONIC,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_SCREECH,\n\t\t\tMOVE_TRI_ATTACK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_GARDEVOIR,\n\t\t.heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSION,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_TORMENT,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_RELICANTH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ANCIENT_POWER,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_HARDEN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_NINETALES,\n\t\t.heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_FIRE_SPIN,\n\t\t\tMOVE_QUICK_ATTACK,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_SHARPEDO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_BITE,\n\t\t\tMOVE_SKULL_BASH,\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_SURF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_GIRAFARIG,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_STRENGTH,\n\t\t\tMOVE_PSYBEAM,\n\t\t\tMOVE_AGILITY,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_IMPISH,\n\t},\n\t{\n\t\t.species = SPECIES_PELIPPER,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_MIST,\n\t\t\tMOVE_STOCKPILE,\n\t\t\tMOVE_SWALLOW,\n\t\t\tMOVE_SPIT_UP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_QUIRKY,\n\t},\n\t{\n\t\t.species = SPECIES_SABLEYE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_NIGHT_SHADE,\n\t\t\tMOVE_SNATCH,\n\t\t\tMOVE_FAKE_OUT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_LUNATONE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_HARD_STONE,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_COSMIC_POWER,\n\t\t\tMOVE_SANDSTORM,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_ROCK_THROW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_LUDICOLO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_NONE,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_THIEF,\n\t\t\tMOVE_FAKE_OUT,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_RAIN_DANCE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_GRUMPIG,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_ODOR_SLEUTH,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_MAGIC_COAT,\n\t\t\tMOVE_PSYCHIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_BRELOOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_CUT,\n\t\t\tMOVE_LEECH_SEED,\n\t\t\tMOVE_MEGA_DRAIN,\n\t\t\tMOVE_STUN_SPORE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_WAILORD,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_WATER_SPOUT,\n\t\t\tMOVE_ROLLOUT,\n\t\t\tMOVE_MIST,\n\t\t\tMOVE_RAIN_DANCE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_WEEZING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_POISON_BARB,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_SMOG,\n\t\t\tMOVE_SELF_DESTRUCT,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_SLUDGE_BOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_KADABRA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_FUTURE_SIGHT,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_SKILL_SWAP,\n\t\t\tMOVE_SNATCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_MANECTRIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MAGNET,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_BITE,\n\t\t\tMOVE_SPARK,\n\t\t\tMOVE_QUICK_ATTACK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_RAICHU,\n\t\t.heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_QUICK_ATTACK,\n\t\t\tMOVE_AGILITY,\n\t\t\tMOVE_LIGHT_SCREEN,\n\t\t\tMOVE_THUNDERBOLT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_XATU,\n\t\t.heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_NIGHT_SHADE,\n\t\t\tMOVE_PECK,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_FUTURE_SIGHT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_LOUDRED,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_UPROAR,\n\t\t\tMOVE_STOMP,\n\t\t\tMOVE_SCREECH,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_MODEST,\n\t},\n\t{\n\t\t.species = SPECIES_SOLROCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_ROCK_THROW,\n\t\t\tMOVE_SUNNY_DAY,\n\t\t\tMOVE_SOLAR_BEAM,\n\t\t\tMOVE_SANDSTORM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_MILD,\n\t},\n\t{\n\t\t.species = SPECIES_CLAYDOL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_SANDSTORM,\n\t\t\tMOVE_REFLECT,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_STRENGTH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_CRAWDAUNT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_WATER_PULSE,\n\t\t\tMOVE_KNOCK_OFF,\n\t\t\tMOVE_HARDEN,\n\t\t\tMOVE_CUT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_HP,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_GOLBAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_WHITE_HERB,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_WING_ATTACK,\n\t\t\tMOVE_MEAN_LOOK,\n\t\t\tMOVE_BITE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_BELLOSSOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_SOLAR_BEAM,\n\t\t\tMOVE_PETAL_DANCE,\n\t\t\tMOVE_SWEET_SCENT,\n\t\t\tMOVE_BULLET_SEED\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_DONPHAN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_ROCK_SMASH,\n\t\t\tMOVE_RAPID_SPIN,\n\t\t\tMOVE_FLAIL,\n\t\t\tMOVE_HORN_ATTACK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_IMPISH,\n\t},\n\t{\n\t\t.species = SPECIES_NOSEPASS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_SANDSTORM,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_BLOCK,\n\t\t\tMOVE_THUNDER_WAVE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_PINSIR,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_SWORDS_DANCE,\n\t\t\tMOVE_HARDEN,\n\t\t\tMOVE_CUT,\n\t\t\tMOVE_SEISMIC_TOSS\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_GOLDUCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_DISABLE,\n\t\t\tMOVE_PSYCH_UP,\n\t\t\tMOVE_WATER_PULSE,\n\t\t\tMOVE_BRICK_BREAK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SHIFTRY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_TORMENT,\n\t\t\tMOVE_EXTRASENSORY,\n\t\t\tMOVE_SOLAR_BEAM,\n\t\t\tMOVE_AERIAL_ACE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_DUSTOX,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSION,\n\t\t\tMOVE_SILVER_WIND,\n\t\t\tMOVE_PSYBEAM,\n\t\t\tMOVE_WHIRLWIND\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_SHUPPET,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_WILL_O_WISP,\n\t\t\tMOVE_NIGHT_SHADE,\n\t\t\tMOVE_FAINT_ATTACK,\n\t\t\tMOVE_CURSE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SEAKING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_HORN_ATTACK,\n\t\t\tMOVE_HORN_DRILL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE,\n\t\t.nature = NATURE_LONELY,\n\t},\n\t{\n\t\t.species = SPECIES_SKARMORY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_STEEL_WING,\n\t\t\tMOVE_SAND_ATTACK,\n\t\t\tMOVE_SWIFT,\n\t\t\tMOVE_AGILITY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_TORKOAL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_IRON_DEFENSE,\n\t\t\tMOVE_BODY_SLAM,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_GOLEM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SOFT_SAND,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_MAGNITUDE,\n\t\t\tMOVE_EXPLOSION,\n\t\t\tMOVE_STRENGTH,\n\t\t\tMOVE_SANDSTORM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_GARDEVOIR,\n\t\t.heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_REFLECT,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_IMPRISON,\n\t\t\tMOVE_TOXIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_SANDSLASH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_SANDSTORM,\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SWIFT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_WOBBUFFET,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_SAFEGUARD,\n\t\t\tMOVE_DESTINY_BOND\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CALM,\n\t},\n\t{\n\t\t.species = SPECIES_TENTACRUEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_CONSTRICT,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_SCREECH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_IMPISH,\n\t},\n\t{\n\t\t.species = SPECIES_TROPIUS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_SUNNY_DAY,\n\t\t\tMOVE_SOLAR_BEAM,\n\t\t\tMOVE_SYNTHESIS,\n\t\t\tMOVE_RAZOR_LEAF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_MAWILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_METAL_COAT,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_IRON_DEFENSE,\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_STRENGTH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_CALM,\n\t},\n\t{\n\t\t.species = SPECIES_MUK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE,\n\t\t\tMOVE_ACID_ARMOR,\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_DISABLE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MAGCARGO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHARCOAL,\n\t\t.teamFlags = 0x0D,\n\t\t.moves = {\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_ROCK_THROW,\n\t\t\tMOVE_HARDEN,\n\t\t\tMOVE_AMNESIA\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_LINOONE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_HEADBUTT,\n\t\t\tMOVE_TAIL_WHIP,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_DIG\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_QUIRKY,\n\t},\n\t{\n\t\t.species = SPECIES_ELECTRODE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_LIGHT_SCREEN,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_SWIFT,\n\t\t\tMOVE_ROLLOUT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_DUSCLOPS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SPELL_TAG,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_MEAN_LOOK,\n\t\t\tMOVE_NIGHT_SHADE,\n\t\t\tMOVE_SKILL_SWAP,\n\t\t\tMOVE_SHADOW_BALL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_VILEPLUME,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_MOONLIGHT,\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_STUN_SPORE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_CROBAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_BITE,\n\t\t\tMOVE_HAZE,\n\t\t\tMOVE_WING_ATTACK,\n\t\t\tMOVE_STEEL_WING\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_CORSOLA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_HAIL,\n\t\t\tMOVE_SURF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_STARMIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_RAPID_SPIN,\n\t\t\tMOVE_WATER_PULSE,\n\t\t\tMOVE_REFLECT,\n\t\t\tMOVE_SKILL_SWAP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_EXPLOUD,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_HOWL,\n\t\t\tMOVE_UPROAR,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ALAKAZAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_PSYBEAM,\n\t\t\tMOVE_SNATCH,\n\t\t\tMOVE_REFLECT,\n\t\t\tMOVE_HYPER_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_HERACROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_HORN_ATTACK,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_REVERSAL,\n\t\t\tMOVE_LEER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_CASTFORM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_WEATHER_BALL,\n\t\t\tMOVE_SUNNY_DAY,\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_HAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_VIGOROTH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_REVERSAL,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_TAUNT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_DUSKULL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_WILL_O_WISP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_LANTURN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_FLAIL,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_SPARK,\n\t\t\tMOVE_TAKE_DOWN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_HARIYAMA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_STRENGTH,\n\t\t\tMOVE_FAKE_OUT,\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_SAND_ATTACK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_KINGDRA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_AGILITY,\n\t\t\tMOVE_DIVE,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_GYARADOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_WATER_PULSE,\n\t\t\tMOVE_HYPER_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_IMPISH,\n\t},\n\t{\n\t\t.species = SPECIES_AGGRON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_METAL_COAT,\n\t\t.teamFlags = 0x45,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_BRICK_BREAK,\n\t\t\tMOVE_METAL_CLAW,\n\t\t\tMOVE_ROAR\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_ABSOL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0xC7,\n\t\t.moves = {\n\t\t\tMOVE_SWORDS_DANCE,\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_SWELLOW,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK,\n\t\t.teamFlags = 0x0F,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_FLY,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_STEEL_WING\n\t\t},\n\t\t.evSpread = 0,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_MACHAMP,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BLACK_BELT,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_STRENGTH,\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_SWAMPERT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_SURF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SCEPTILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_LEAF_BLADE,\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_AGILITY,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_BLAZIKEN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHARCOAL,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_BLAZE_KICK,\n\t\t\tMOVE_MIRROR_MOVE,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_ALTARIA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_DRAGON_DANCE,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_LUDICOLO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BLACK_BELT,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_BRICK_BREAK,\n\t\t\tMOVE_WATER_PULSE,\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_FOCUS_PUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_SABLEYE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SPELL_TAG,\n\t\t.teamFlags = 0x49,\n\t\t.moves = {\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_SNATCH,\n\t\t\tMOVE_DIG,\n\t\t\tMOVE_CONFUSE_RAY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ZANGOOSE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES,\n\t\t.teamFlags = 0x0F,\n\t\t.moves = {\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_CRUSH_CLAW,\n\t\t\tMOVE_DETECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CALM,\n\t},\n\t{\n\t\t.species = SPECIES_LINOONE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x0F,\n\t\t.moves = {\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_HEADBUTT,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WHISCASH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SOFT_SAND,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_MUD_SLAP,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_AMNESIA\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_SOLROCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_HARD_STONE,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_LIGHT_SCREEN,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_CONFUSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_STARMIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_CONFUSE_RAY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_CACTURNE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x0F,\n\t\t.moves = {\n\t\t\tMOVE_INGRAIN,\n\t\t\tMOVE_LEECH_SEED,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_FRUSTRATION\n\t\t},\n\t\t.evSpread = 0,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SHIFTRY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_FRUSTRATION,\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_TORMENT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_MANECTRIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MAGNET,\n\t\t.teamFlags = 0x0F,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_ROAR\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_KECLEON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0xC3,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_PINSIR,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SOFT_SAND,\n\t\t.teamFlags = 0x8D,\n\t\t.moves = {\n\t\t\tMOVE_GUILLOTINE,\n\t\t\tMOVE_SUBMISSION,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_METANG,\n\t\t.heldItem = BATTLE_TOWER_ITEM_METAL_COAT,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_METEOR_MASH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_IMPISH,\n\t},\n\t{\n\t\t.species = SPECIES_CLAYDOL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SELF_DESTRUCT,\n\t\t\tMOVE_SANDSTORM,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_MASQUERAIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_SILVER_WIND,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_RELICANTH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0xC5,\n\t\t.moves = {\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_DOUBLE_EDGE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WALREIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x0D,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ENCORE,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_HYPER_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WAILORD,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_WATER_SPOUT,\n\t\t\tMOVE_REST,\n\t\t\tMOVE_AMNESIA,\n\t\t\tMOVE_HAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_GIRAFARIG,\n\t\t.heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY,\n\t\t.teamFlags = 0x4F,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MEDICHAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0x4B,\n\t\t.moves = {\n\t\t\tMOVE_CALM_MIND,\n\t\t\tMOVE_REVERSAL,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_PSYCHIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_TROPIUS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB,\n\t\t.teamFlags = 0xC7,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SYNTHESIS,\n\t\t\tMOVE_RAZOR_LEAF,\n\t\t\tMOVE_HYPER_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_NINJASK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_SWORDS_DANCE,\n\t\t\tMOVE_LEECH_LIFE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_CAMERUPT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHARCOAL,\n\t\t.teamFlags = 0x0D,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_OVERHEAT,\n\t\t\tMOVE_SUNNY_DAY,\n\t\t\tMOVE_ROCK_SLIDE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_SHARPEDO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WIGGLYTUFF,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x0E,\n\t\t.moves = {\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_DIG\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_SEVIPER,\n\t\t.heldItem = BATTLE_TOWER_ITEM_POISON_BARB,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_HAZE,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_CRADILY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0xC1,\n\t\t.moves = {\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_INGRAIN,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_ARMALDO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY,\n\t\t.teamFlags = 0xC1,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SANDSTORM,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_SLASH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MAGNETON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY,\n\t\t.teamFlags = 0x0D,\n\t\t.moves = {\n\t\t\tMOVE_ZAP_CANNON,\n\t\t\tMOVE_SUPERSONIC,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_LANTURN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x06,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_RAIN_DANCE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_SWALOT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY,\n\t\t.teamFlags = 0x8B,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_SNATCH,\n\t\t\tMOVE_ENCORE,\n\t\t\tMOVE_BODY_SLAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_SKARMORY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_METAL_COAT,\n\t\t.teamFlags = 0x81,\n\t\t.moves = {\n\t\t\tMOVE_STEEL_WING,\n\t\t\tMOVE_AGILITY,\n\t\t\tMOVE_TORMENT,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_DONPHAN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_WHITE_HERB,\n\t\t.teamFlags = 0x0D,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FLAIL,\n\t\t\tMOVE_ROAR,\n\t\t\tMOVE_IRON_TAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_HERACROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_REVERSAL,\n\t\t\tMOVE_MEGAHORN,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_BANETTE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x83,\n\t\t.moves = {\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_SKILL_SWAP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_SANDSLASH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x0F,\n\t\t.moves = {\n\t\t\tMOVE_SANDSTORM,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_CRAWDAUNT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_GUILLOTINE,\n\t\t\tMOVE_CRABHAMMER,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_SLUDGE_BOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_GRUMPIG,\n\t\t.heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON,\n\t\t.teamFlags = 0x8B,\n\t\t.moves = {\n\t\t\tMOVE_MAGIC_COAT,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_REFLECT,\n\t\t\tMOVE_CONFUSE_RAY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LONELY,\n\t},\n\t{\n\t\t.species = SPECIES_RHYDON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND,\n\t\t.teamFlags = 0x45,\n\t\t.moves = {\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_FIRE_BLAST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_ALAKAZAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x8B,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_REFLECT,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_SKILL_SWAP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_DUSCLOPS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_WILL_O_WISP,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_PSYCHIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_TORKOAL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_AMNESIA,\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_ELECTRODE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_SCREECH,\n\t\t\tMOVE_EXPLOSION,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_BRELOOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_LEECH_SEED\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_MUK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_POISON_BARB,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_FOCUS_PUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_WEEZING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_EXPLOSION,\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_RAICHU,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x4E,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_TENTACRUEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER,\n\t\t.teamFlags = 0x09,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_SLUDGE_BOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_EXPLOUD,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_RETURN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_XATU,\n\t\t.heldItem = BATTLE_TOWER_ITEM_WHITE_HERB,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_REST,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_TOXIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_GOLEM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_EXPLOSION,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_IMPISH,\n\t},\n\t{\n\t\t.species = SPECIES_GOLDUCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY,\n\t\t.teamFlags = 0x83,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_CALM_MIND,\n\t\t\tMOVE_BLIZZARD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_NINETALES,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHARCOAL,\n\t\t.teamFlags = 0x4A,\n\t\t.moves = {\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_CONFUSE_RAY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_KINGDRA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x13,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_REST,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_DRAGON_BREATH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_SLAKING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_CURSE,\n\t\t\tMOVE_AMNESIA,\n\t\t\tMOVE_YAWN,\n\t\t\tMOVE_FOCUS_PUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_GYARADOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_RAIN_DANCE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_HARIYAMA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x21,\n\t\t.moves = {\n\t\t\tMOVE_BELLY_DRUM,\n\t\t\tMOVE_ENDURE,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_REVERSAL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_ABSOL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0xC3,\n\t\t.moves = {\n\t\t\tMOVE_FAINT_ATTACK,\n\t\t\tMOVE_DOUBLE_EDGE,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_ALTARIA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x83,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_DANCE,\n\t\t\tMOVE_MIRROR_MOVE,\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_MACHAMP,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BLACK_BELT,\n\t\t.teamFlags = 0x11,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_ENCORE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_FLYGON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG,\n\t\t.teamFlags = 0x43,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_BLAZIKEN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x33,\n\t\t.moves = {\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_GLALIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE,\n\t\t.teamFlags = 0x81,\n\t\t.moves = {\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_ICY_WIND,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_JOLLY,\n\t},\n\t{\n\t\t.species = SPECIES_HUNTAIL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER,\n\t\t.teamFlags = 0xA1,\n\t\t.moves = {\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_BLIZZARD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_MILOTIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY,\n\t\t.teamFlags = 0xD3,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_TOXIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_GOREBYSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY,\n\t\t.teamFlags = 0x83,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_SHADOW_BALL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_SCEPTILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x53,\n\t\t.moves = {\n\t\t\tMOVE_LEAF_BLADE,\n\t\t\tMOVE_ENDEAVOR,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_SWAMPERT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x53,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_MUD_SHOT,\n\t\t\tMOVE_BLIZZARD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_AGGRON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_EDGE,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_BLIZZARD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_CRADILY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0xE1,\n\t\t.moves = {\n\t\t\tMOVE_STOCKPILE,\n\t\t\tMOVE_SPIT_UP,\n\t\t\tMOVE_SWALLOW,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_ARMALDO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0xC1,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_SWORDS_DANCE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_BRELOOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x82,\n\t\t.moves = {\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_MACH_PUNCH,\n\t\t\tMOVE_SNATCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_LUDICOLO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x83,\n\t\t.moves = {\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_TOXIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_SHIFTRY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_TORMENT,\n\t\t\tMOVE_FAINT_ATTACK,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_TROPIUS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0xC3,\n\t\t.moves = {\n\t\t\tMOVE_SUNNY_DAY,\n\t\t\tMOVE_SYNTHESIS,\n\t\t\tMOVE_SOLAR_BEAM,\n\t\t\tMOVE_LEECH_SEED\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_GRUMPIG,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MACHO_BRACE,\n\t\t.teamFlags = 0x23,\n\t\t.moves = {\n\t\t\tMOVE_TRICK,\n\t\t\tMOVE_SKILL_SWAP,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_TORKOAL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x81,\n\t\t.moves = {\n\t\t\tMOVE_IRON_DEFENSE,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_REST,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_MANECTRIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_NONE,\n\t\t.teamFlags = 0x03,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_ROAR,\n\t\t\tMOVE_THIEF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_PINSIR,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY,\n\t\t.teamFlags = 0x61,\n\t\t.moves = {\n\t\t\tMOVE_GUILLOTINE,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_STARMIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x93,\n\t\t.moves = {\n\t\t\tMOVE_LIGHT_SCREEN,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_HERACROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x51,\n\t\t.moves = {\n\t\t\tMOVE_MEGAHORN,\n\t\t\tMOVE_REVERSAL,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_COUNTER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WALREIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE,\n\t\t.teamFlags = 0x83,\n\t\t.moves = {\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ROCK_SLIDE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_ALAKAZAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x13,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_ENCORE,\n\t\t\tMOVE_SNATCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_MILOTIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0x93,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_REGICE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x11,\n\t\t.moves = {\n\t\t\tMOVE_REST,\n\t\t\tMOVE_CURSE,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_MILD,\n\t},\n\t{\n\t\t.species = SPECIES_REGISTEEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x11,\n\t\t.moves = {\n\t\t\tMOVE_REST,\n\t\t\tMOVE_IRON_DEFENSE,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_MILD,\n\t},\n\t{\n\t\t.species = SPECIES_REGIROCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x91,\n\t\t.moves = {\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_DUSCLOPS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SPELL_TAG,\n\t\t.teamFlags = 0x20,\n\t\t.moves = {\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_DESTINY_BOND\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_SEAKING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY,\n\t\t.teamFlags = 0xB2,\n\t\t.moves = {\n\t\t\tMOVE_HORN_DRILL,\n\t\t\tMOVE_AGILITY,\n\t\t\tMOVE_SLEEP_TALK,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_CAMERUPT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x00,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ERUPTION,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_LANTURN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x82,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_BLIZZARD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_WEEZING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x20,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_FIRE_BLAST,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_WHISCASH,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x41,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_AGGRON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x11,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_EDGE,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_CACTURNE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x63,\n\t\t.moves = {\n\t\t\tMOVE_DYNAMIC_PUNCH,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_FAINT_ATTACK,\n\t\t\tMOVE_GIGA_DRAIN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_SHARPEDO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x01,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_DOUBLE_EDGE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_SWAGGER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_ABSOL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x82,\n\t\t.moves = {\n\t\t\tMOVE_DOUBLE_EDGE,\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_SWORDS_DANCE,\n\t\t\tMOVE_QUICK_ATTACK\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WAILORD,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY,\n\t\t.teamFlags = 0x23,\n\t\t.moves = {\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_FISSURE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_TENTACRUEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x21,\n\t\t.moves = {\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_MIRROR_COAT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_LUDICOLO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0xA2,\n\t\t.moves = {\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WOBBUFFET,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x23,\n\t\t.moves = {\n\t\t\tMOVE_ENCORE,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_DESTINY_BOND\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_RHYDON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x21,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_MEGAHORN,\n\t\t\tMOVE_HORN_DRILL,\n\t\t\tMOVE_ROCK_SLIDE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_GLALIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x21,\n\t\t.moves = {\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_HAIL,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_SCEPTILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x13,\n\t\t.moves = {\n\t\t\tMOVE_LEAF_BLADE,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_BLAZIKEN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x17,\n\t\t.moves = {\n\t\t\tMOVE_BLAZE_KICK,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_ENDURE,\n\t\t\tMOVE_REVERSAL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_SWAMPERT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x17,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_MUD_SHOT,\n\t\t\tMOVE_BLIZZARD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_GARDEVOIR,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x19,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_DESTINY_BOND,\n\t\t\tMOVE_WILL_O_WISP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_BRELOOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0xF6,\n\t\t.moves = {\n\t\t\tMOVE_SPORE,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_BRICK_BREAK,\n\t\t\tMOVE_SLUDGE_BOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_ALAKAZAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY,\n\t\t.teamFlags = 0x1B,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_THUNDER_PUNCH,\n\t\t\tMOVE_REFLECT,\n\t\t\tMOVE_RECOVER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_SHIFTRY,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x89,\n\t\t.moves = {\n\t\t\tMOVE_FAINT_ATTACK,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_HARIYAMA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x85,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_FAKE_OUT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_CROBAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x49,\n\t\t.moves = {\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_BITE,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_MACHAMP,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x15,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_SLIDE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MANECTRIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x0B,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_ROAR,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_ELECTRODE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x27,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_MUK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_FLYGON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x4D,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_STARMIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0x1B,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_CONFUSE_RAY\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_DODRIO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x2B,\n\t\t.moves = {\n\t\t\tMOVE_DRILL_PECK,\n\t\t\tMOVE_TRI_ATTACK,\n\t\t\tMOVE_AGILITY,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_RAICHU,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_REVERSAL,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_GOLDUCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_HYPER_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_HERACROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x54,\n\t\t.moves = {\n\t\t\tMOVE_MEGAHORN,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_ENDURE,\n\t\t\tMOVE_REVERSAL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_WALREIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x06,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_NAIVE,\n\t},\n\t{\n\t\t.species = SPECIES_KINGDRA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x1D,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_SALAMENCE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x9C,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_CRUNCH,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_METAGROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x15,\n\t\t.moves = {\n\t\t\tMOVE_METEOR_MASH,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_LIGHT_SCREEN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_REGIROCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0xB5,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ANCIENT_POWER,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_REGICE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x96,\n\t\t.moves = {\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_REGISTEEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x94,\n\t\t.moves = {\n\t\t\tMOVE_METAL_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_LATIAS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x96,\n\t\t.moves = {\n\t\t\tMOVE_MIST_BALL,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_REST,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_MILD,\n\t},\n\t{\n\t\t.species = SPECIES_LATIOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0x95,\n\t\t.moves = {\n\t\t\tMOVE_LUSTER_PURGE,\n\t\t\tMOVE_REFLECT,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_MILOTIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x96,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_MIRROR_COAT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_SLAKING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_NONE,\n\t\t\tMOVE_NONE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_SCEPTILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x1F,\n\t\t.moves = {\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_LEECH_SEED,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_BLAZIKEN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x17,\n\t\t.moves = {\n\t\t\tMOVE_BLAZE_KICK,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_SWAMPERT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x17,\n\t\t.moves = {\n\t\t\tMOVE_MUDDY_WATER,\n\t\t\tMOVE_MUD_SHOT,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_GARDEVOIR,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x7B,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_DESTINY_BOND,\n\t\t\tMOVE_SNATCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_RELAXED,\n\t},\n\t{\n\t\t.species = SPECIES_BRELOOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x56,\n\t\t.moves = {\n\t\t\tMOVE_SPORE,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_GIGA_DRAIN\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_ALAKAZAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_THUNDER_PUNCH,\n\t\t\tMOVE_FIRE_PUNCH,\n\t\t\tMOVE_RECOVER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_HARIYAMA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND,\n\t\t.teamFlags = 0x05,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_ENDURE,\n\t\t\tMOVE_REVERSAL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_GYARADOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x0C,\n\t\t.moves = {\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_BOLD,\n\t},\n\t{\n\t\t.species = SPECIES_CROBAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x49,\n\t\t.moves = {\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MACHAMP,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x15,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FACADE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_MANECTRIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x63,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_REST,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_ELECTRODE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x07,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_SCREECH,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_MODEST,\n\t},\n\t{\n\t\t.species = SPECIES_MUK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x45,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_GIGA_DRAIN,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_FLYGON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x4D,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_IMPISH,\n\t},\n\t{\n\t\t.species = SPECIES_STARMIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x1B,\n\t\t.moves = {\n\t\t\tMOVE_LIGHT_SCREEN,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_NINETALES,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_OVERHEAT,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_IRON_TAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_GOLEM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x25,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROAR,\n\t\t\tMOVE_FIRE_BLAST,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_GOLDUCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x27,\n\t\t.moves = {\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_PSYCH_UP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_HERACROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x55,\n\t\t.moves = {\n\t\t\tMOVE_MEGAHORN,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_REVERSAL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WALREIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x36,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_SHEER_COLD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_KINGDRA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x5C,\n\t\t.moves = {\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_DRAGON_BREATH,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_SALAMENCE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x9D,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_METAGROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x15,\n\t\t.moves = {\n\t\t\tMOVE_METEOR_MASH,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_HYPER_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_REGIROCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x95,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_REGICE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x96,\n\t\t.moves = {\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_HAIL,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_CAREFUL,\n\t},\n\t{\n\t\t.species = SPECIES_REGISTEEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x94,\n\t\t.moves = {\n\t\t\tMOVE_METAL_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ANCIENT_POWER,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_LATIAS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0x96,\n\t\t.moves = {\n\t\t\tMOVE_MIST_BALL,\n\t\t\tMOVE_REFLECT,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_LATIOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x95,\n\t\t.moves = {\n\t\t\tMOVE_LUSTER_PURGE,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_MILOTIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0xD6,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_DOUBLE_TEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_KECLEON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND,\n\t\t.teamFlags = 0x69,\n\t\t.moves = {\n\t\t\tMOVE_TRICK,\n\t\t\tMOVE_REST,\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_DISABLE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIRKY,\n\t},\n\t{\n\t\t.species = SPECIES_SCEPTILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x5F,\n\t\t.moves = {\n\t\t\tMOVE_LEAF_BLADE,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_REST,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_BLAZIKEN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x7F,\n\t\t.moves = {\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_SWAGGER,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_SWAMPERT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x57,\n\t\t.moves = {\n\t\t\tMOVE_IRON_TAIL,\n\t\t\tMOVE_CURSE,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_GARDEVOIR,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY,\n\t\t.teamFlags = 0x3B,\n\t\t.moves = {\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_REST,\n\t\t\tMOVE_IMPRISON\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_BRELOOM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x56,\n\t\t.moves = {\n\t\t\tMOVE_SPORE,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_IRON_TAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_ALAKAZAM,\n\t\t.heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND,\n\t\t.teamFlags = 0x1A,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_TRICK,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_SNATCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HASTY,\n\t},\n\t{\n\t\t.species = SPECIES_HARIYAMA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x65,\n\t\t.moves = {\n\t\t\tMOVE_REVENGE,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_FOCUS_PUNCH,\n\t\t\tMOVE_REVERSAL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_LUDICOLO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x54,\n\t\t.moves = {\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_SURF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_CROBAT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0x4B,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_BITE,\n\t\t\tMOVE_AIR_CUTTER,\n\t\t\tMOVE_SHADOW_BALL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_MACHAMP,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x75,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_ROCK_SLIDE,\n\t\t\tMOVE_DYNAMIC_PUNCH,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_MANECTRIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_THUNDER_WAVE,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_ELECTRODE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x64,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER,\n\t\t\tMOVE_DOUBLE_TEAM,\n\t\t\tMOVE_MIRROR_COAT,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_BASHFUL,\n\t},\n\t{\n\t\t.species = SPECIES_MUK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x49,\n\t\t.moves = {\n\t\t\tMOVE_SLUDGE_BOMB,\n\t\t\tMOVE_FLAMETHROWER,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_SHADOW_PUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_GENTLE,\n\t},\n\t{\n\t\t.species = SPECIES_FLYGON,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0xCD,\n\t\t.moves = {\n\t\t\tMOVE_PROTECT,\n\t\t\tMOVE_DIG,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_SANDSTORM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_STARMIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x5B,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_PSYCHIC\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_LUDICOLO,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0x1A,\n\t\t.moves = {\n\t\t\tMOVE_RAIN_DANCE,\n\t\t\tMOVE_LEECH_SEED,\n\t\t\tMOVE_DIVE,\n\t\t\tMOVE_PROTECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_RAICHU,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x4A,\n\t\t.moves = {\n\t\t\tMOVE_THUNDER,\n\t\t\tMOVE_REVERSAL,\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_IRON_TAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_TIMID,\n\t},\n\t{\n\t\t.species = SPECIES_GOLDUCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x0A,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_IRON_TAIL\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_HERACROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0x15,\n\t\t.moves = {\n\t\t\tMOVE_MEGAHORN,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FACADE,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_WALREIN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY,\n\t\t.teamFlags = 0x26,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_FISSURE,\n\t\t\tMOVE_SHEER_COLD\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_KINGDRA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x4D,\n\t\t.moves = {\n\t\t\tMOVE_HYDRO_PUMP,\n\t\t\tMOVE_BLIZZARD,\n\t\t\tMOVE_HYPER_BEAM,\n\t\t\tMOVE_DISABLE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_SALAMENCE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x9C,\n\t\t.moves = {\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_FIRE_BLAST,\n\t\t\tMOVE_HYDRO_PUMP\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_NAUGHTY,\n\t},\n\t{\n\t\t.species = SPECIES_METAGROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY,\n\t\t.teamFlags = 0xB5,\n\t\t.moves = {\n\t\t\tMOVE_METEOR_MASH,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_PURSUIT,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_REGIROCK,\n\t\t.heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY,\n\t\t.teamFlags = 0x95,\n\t\t.moves = {\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_SUPERPOWER,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SERIOUS,\n\t},\n\t{\n\t\t.species = SPECIES_REGICE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE,\n\t\t.teamFlags = 0x96,\n\t\t.moves = {\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_ANCIENT_POWER,\n\t\t\tMOVE_EXPLOSION\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE,\n\t\t.nature = NATURE_RASH,\n\t},\n\t{\n\t\t.species = SPECIES_REGISTEEL,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LEFTOVERS,\n\t\t.teamFlags = 0xB4,\n\t\t.moves = {\n\t\t\tMOVE_CURSE,\n\t\t\tMOVE_AMNESIA,\n\t\t\tMOVE_RETURN,\n\t\t\tMOVE_REST\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_LAX,\n\t},\n\t{\n\t\t.species = SPECIES_LATIAS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x92,\n\t\t.moves = {\n\t\t\tMOVE_MIST_BALL,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_LATIOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0x91,\n\t\t.moves = {\n\t\t\tMOVE_LUSTER_PURGE,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_SURF\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_MILOTIC,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0xB2,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_ATTRACT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_BRAVE,\n\t},\n\t{\n\t\t.species = SPECIES_SLAKING,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0x65,\n\t\t.moves = {\n\t\t\tMOVE_YAWN,\n\t\t\tMOVE_SLASH,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_HYPER_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SCEPTILE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SHELL_BELL,\n\t\t.teamFlags = 0xDF,\n\t\t.moves = {\n\t\t\tMOVE_LEAF_BLADE,\n\t\t\tMOVE_DETECT,\n\t\t\tMOVE_DRAGON_CLAW,\n\t\t\tMOVE_CRUNCH\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_BLAZIKEN,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY,\n\t\t.teamFlags = 0xD7,\n\t\t.moves = {\n\t\t\tMOVE_BLAZE_KICK,\n\t\t\tMOVE_SKY_UPPERCUT,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ROCK_SLIDE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_DOCILE,\n\t},\n\t{\n\t\t.species = SPECIES_SWAMPERT,\n\t\t.heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY,\n\t\t.teamFlags = 0x5F,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_EARTHQUAKE,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_ROCK_TOMB\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_SASSY,\n\t},\n\t{\n\t\t.species = SPECIES_SHEDINJA,\n\t\t.heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER,\n\t\t.teamFlags = 0xDB,\n\t\t.moves = {\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_TOXIC,\n\t\t\tMOVE_HYPER_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_METAGROSS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW,\n\t\t.teamFlags = 0x94,\n\t\t.moves = {\n\t\t\tMOVE_METEOR_MASH,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_SHADOW_BALL,\n\t\t\tMOVE_EARTHQUAKE\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_GRUMPIG,\n\t\t.heldItem = BATTLE_TOWER_ITEM_MACHO_BRACE,\n\t\t.teamFlags = 0x4B,\n\t\t.moves = {\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_CONFUSE_RAY,\n\t\t\tMOVE_TRICK,\n\t\t\tMOVE_REFLECT\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_LATIAS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x92,\n\t\t.moves = {\n\t\t\tMOVE_MIST_BALL,\n\t\t\tMOVE_RECOVER,\n\t\t\tMOVE_ATTRACT,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_ADAMANT,\n\t},\n\t{\n\t\t.species = SPECIES_LATIOS,\n\t\t.heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK,\n\t\t.teamFlags = 0x91,\n\t\t.moves = {\n\t\t\tMOVE_LUSTER_PURGE,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_ICE_BEAM,\n\t\t\tMOVE_DRAGON_CLAW\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_HARDY,\n\t},\n\t{\n\t\t.species = SPECIES_STARMIE,\n\t\t.heldItem = BATTLE_TOWER_ITEM_LUM_BERRY,\n\t\t.teamFlags = 0x1A,\n\t\t.moves = {\n\t\t\tMOVE_SURF,\n\t\t\tMOVE_THUNDERBOLT,\n\t\t\tMOVE_PSYCHIC,\n\t\t\tMOVE_ICE_BEAM\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED,\n\t\t.nature = NATURE_QUIET,\n\t},\n\t{\n\t\t.species = SPECIES_MACHAMP,\n\t\t.heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS,\n\t\t.teamFlags = 0x14,\n\t\t.moves = {\n\t\t\tMOVE_CROSS_CHOP,\n\t\t\tMOVE_COUNTER,\n\t\t\tMOVE_ROCK_TOMB,\n\t\t\tMOVE_FLAMETHROWER\n\t\t},\n\t\t.evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP,\n\t\t.nature = NATURE_HARDY,\n\t},\n};\n"
  },
  {
    "path": "src/data/battle_tower/trainers.h",
    "content": "const struct BattleTowerTrainer gBattleTowerTrainers[] =\n{\n    {\n        .trainerClass = FACILITY_CLASS_YOUNGSTER,\n        .name = _(\"ALVIN\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_ARE,\n            EC_WORD_YOU,\n            EC_WORD_READY,\n            EC_WORD_QUES,\n            EC_WORD_HERE_I_COME,\n            EC_WORD_EXCL,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BIRD_KEEPER,\n        .name = _(\"DIRK\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_OKAY,\n            EC_WORD_I_AM,\n            EC_WORD_GOING,\n            EC_WORD_FOR,\n            EC_WORD_IT,\n            EC_WORD_EXCL,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_LADY,\n        .name = _(\"CYBIL\"),\n        .teamFlags = 0x02,\n        .greeting = {\n            EC_WORD_YOU_RE,\n            EC_WORD_A,\n            EC_WORD_PUSHOVER,\n            EC_WORD_LET_S,\n            EC_WORD_GET,\n            EC_WORD_GOING,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BLACK_BELT,\n        .name = _(\"CHEN\"),\n        .teamFlags = 0x05,\n        .greeting = {\n            EC_WORD_MY,\n            EC_WORD_SPIRIT,\n            EC_WORD_IS,\n            EC_WORD_ENOUGH,\n            EC_WORD_SNORT,\n            EC_WORD_ARRGH,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_NINJA_BOY,\n        .name = _(\"YOSHI\"),\n        .teamFlags = 0x05,\n        .greeting = {\n            EC_WORD_GO,\n            EC_WORD_MY,\n            EC_WORD_POKEMON,\n            EC_WORD_FIGHT,\n            EC_WORD_THE,\n            EC_WORD_BATTLE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_LASS,\n        .name = _(\"TINA\"),\n        .teamFlags = 0x0A,\n        .greeting = {\n            EC_WORD_STUDY,\n            EC_WORD_IS,\n            EC_WORD_BORING,\n            EC_WORD_LET_S,\n            EC_WORD_BATTLE,\n            EC_WORD_NOW,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BUG_MANIAC,\n        .name = _(\"COREY\"),\n        .teamFlags = 0x41,\n        .greeting = {\n            EC_WORD_HEY,\n            EC_WORD_I,\n            EC_WORD_WILL,\n            EC_MOVE2(TRANSFORM),\n            EC_WORD_FOR,\n            EC_MOVE(STRENGTH),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_FISHERMAN,\n        .name = _(\"GORDON\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_NEED,\n            EC_WORD_A,\n            EC_WORD_VACATION,\n            EC_WORD_RIGHT,\n            EC_WORD_NOW,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_TUBER,\n        .name = _(\"ANN\"),\n        .teamFlags = 0x02,\n        .greeting = {\n            EC_WORD_WE,\n            EC_WORD_ALL,\n            EC_WORD_ADORE,\n            EC_WORD_POKEMON,\n            EC_WORD_ABSOLUTELY,\n            EC_WORD_TRULY,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_POKEFAN_F,\n        .name = _(\"JULIA\"),\n        .teamFlags = 0x42,\n        .greeting = {\n            EC_WORD_I_AM,\n            EC_WORD_A,\n            EC_WORD_CUTE,\n            EC_WORD_LADY,\n            EC_WORD_YES,\n            EC_WORD_I_AM,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_GENTLEMAN,\n        .name = _(\"GREGORY\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_THINK,\n            EC_WORD_WE,\n            EC_WORD_SHOULD,\n            EC_WORD_START,\n            EC_WORD_TODAY,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_CAMPER,\n        .name = _(\"KEITH\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_YOU_RE,\n            EC_WORD_MY,\n            EC_WORD_FRIEND,\n            EC_WORD_FROM,\n            EC_WORD_NOW,\n            EC_WORD_ON,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BATTLE_GIRL,\n        .name = _(\"KENDRA\"),\n        .teamFlags = 0x0A,\n        .greeting = {\n            EC_WORD_I_AM,\n            EC_MOVE(SWIFT),\n            EC_WORD_HOW,\n            EC_WORD_ABOUT,\n            EC_WORD_YOU,\n            EC_WORD_QUES,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_HIKER,\n        .name = _(\"DEV\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_WAHAHAHA,\n            EC_WORD_I_AM,\n            EC_WORD_FEELING,\n            EC_WORD_LIKE,\n            EC_WORD_IT_S,\n            EC_MOVE2(PAY_DAY),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BATTLE_GIRL,\n        .name = _(\"CASSIE\"),\n        .teamFlags = 0x0A,\n        .greeting = {\n            EC_WORD_YOU_RE,\n            EC_WORD_STRONG,\n            EC_WORD_AREN_T,\n            0xFFFF,\n            EC_WORD_YOU,\n            EC_WORD_QUES,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PSYCHIC_M,\n        .name = _(\"JULIAN\"),\n        .teamFlags = 0x05,\n        .greeting = {\n            EC_WORD_FUFUFU,\n            0xFFFF,\n            EC_WORD_YOU,\n            EC_WORD_CAN_T,\n            EC_WORD_WIN,\n            EC_WORD_KID,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_LASS,\n        .name = _(\"JOYCE\"),\n        .teamFlags = 0x02,\n        .greeting = {\n            EC_WORD_BE,\n            EC_WORD_KIND,\n            EC_WORD_TO,\n            EC_WORD_THE,\n            EC_WORD_DIGITAL,\n            EC_WORD_IDOL,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_GUITARIST,\n        .name = _(\"LES\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_I_AM,\n            EC_WORD_GREAT,\n            EC_WORD_YOU_RE,\n            EC_WORD_JUST,\n            EC_WORD_RATHER,\n            EC_WORD_OKAY,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_RICH_BOY,\n        .name = _(\"CLINTON\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_HAVE,\n            EC_WORD_ROUGH_SKIN,\n            EC_WORD_I,\n            EC_WORD_NEED,\n            EC_WORD_NATURAL_CURE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BUG_CATCHER,\n        .name = _(\"LEWIS\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_THIS,\n            EC_WORD_IS,\n            EC_WORD_EXCITING,\n            EC_WORD_CAN,\n            EC_WORD_I,\n            EC_WORD_WIN,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PICNICKER,\n        .name = _(\"RACHAEL\"),\n        .teamFlags = 0x02,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_LIKE,\n            EC_WORD_WALKING,\n            EC_WORD_WITH,\n            EC_WORD_MY,\n            EC_WORD_POKEMON,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_COLLECTOR,\n        .name = _(\"HAROLD\"),\n        .teamFlags = 0x09,\n        .greeting = {\n            EC_WORD_HERE,\n            EC_WORD_THEY,\n            EC_WORD_COME,\n            EC_WORD_MY,\n            EC_MOVE2(SUPERPOWER),\n            EC_WORD_POKEMON,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_TUBER,\n        .name = _(\"KIPP\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_I_AM,\n            EC_WORD_A,\n            EC_WORD_GENIUS,\n            EC_WORD_I,\n            EC_WORD_SHOULD,\n            EC_WORD_WIN,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_KINDLER,\n        .name = _(\"IRWIN\"),\n        .teamFlags = 0x05,\n        .greeting = {\n            EC_WORD_YOU,\n            EC_WORD_WILL,\n            EC_WORD_BE,\n            EC_WORD_FEELING,\n            EC_WORD_MY,\n            EC_WORD_FIRE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PSYCHIC_F,\n        .name = _(\"EILEEN\"),\n        .teamFlags = 0x0A,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_WILL,\n            EC_MOVE(ASTONISH),\n            EC_WORD_YOU,\n            EC_WORD_IN,\n            EC_WORD_BATTLE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_SWIMMER_F,\n        .name = _(\"ANNE\"),\n        .teamFlags = 0x02,\n        .greeting = {\n            EC_WORD_SORRY,\n            EC_WORD_BUT,\n            EC_WORD_YOU,\n            EC_WORD_WILL,\n            EC_WORD_NOT,\n            EC_WORD_WIN,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BATTLE_GIRL,\n        .name = _(\"RUTH\"),\n        .teamFlags = 0x06,\n        .greeting = {\n            EC_WORD_A,\n            EC_WORD_STRONG,\n            EC_WORD_GIRL,\n            EC_WORD_WANTS,\n            EC_WORD_TOUGH,\n            EC_WORD_POKEMON,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_POKEMANIAC,\n        .name = _(\"JEREMY\"),\n        .teamFlags = 0x40,\n        .greeting = {\n            EC_WORD_MY,\n            EC_WORD_POKEMON,\n            EC_WORD_ARE,\n            EC_WORD_COOL,\n            EC_WORD_YOURS,\n            EC_WORD_CAN_T_WIN,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_SAILOR,\n        .name = _(\"TREVOR\"),\n        .teamFlags = 0x09,\n        .greeting = {\n            EC_WORD_MY,\n            EC_WORD_OPPONENT,\n            EC_WORD_IS,\n            EC_WORD_FINALLY,\n            EC_WORD_HERE,\n            EC_WORD_EXCELLENT,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PKMN_BREEDER,\n        .name = _(\"COLETTE\"),\n        .teamFlags = 0x06,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_AM,\n            EC_WORD_HUNGRY,\n            EC_MOVE2(POUND),\n            EC_WORD_MY,\n            EC_MOVE2(BELLY_DRUM),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_HEX_MANIAC,\n        .name = _(\"PAULA\"),\n        .teamFlags = 0x42,\n        .greeting = {\n            EC_WORD_IT_S,\n            EC_WORD_HARD,\n            EC_WORD_TO,\n            EC_WORD_TAKE,\n            EC_WORD_UGLY,\n            EC_MOVE(SPITE),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_RUIN_MANIAC,\n        .name = _(\"STANLY\"),\n        .teamFlags = 0x41,\n        .greeting = {\n            EC_WORD_ADVENTURE,\n            EC_WORD_AND,\n            EC_WORD_BATTLE,\n            EC_WORD_ARE,\n            EC_WORD_MY,\n            EC_WORD_LIKES,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_SWIMMER_M,\n        .name = _(\"TROY\"),\n        .teamFlags = 0x09,\n        .greeting = {\n            EC_WORD_YOU,\n            EC_WORD_CAN_T,\n            EC_WORD_LOSE,\n            EC_WORD_TO,\n            EC_WORD_A,\n            EC_WORD_KID,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_YOUNGSTER,\n        .name = _(\"ED\"),\n        .teamFlags = 0x08,\n        .greeting = {\n            EC_WORD_POKEMON,\n            EC_WORD_DAILY,\n            EC_WORD_AT,\n            EC_WORD_SCHOOL,\n            EC_WORD_IT_S,\n            EC_WORD_AWESOME,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PKMN_RANGER_F,\n        .name = _(\"ELLEN\"),\n        .teamFlags = 0x04,\n        .greeting = {\n            EC_WORD_ARE,\n            EC_WORD_YOU,\n            EC_WORD_KIND,\n            EC_WORD_TO,\n            EC_WORD_YOUR,\n            EC_WORD_POKEMON,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_SWIMMER_M,\n        .name = _(\"ARNIE\"),\n        .teamFlags = 0x09,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_BATTLE,\n            EC_WORD_SERIOUSLY,\n            EC_WORD_BEAUTIFUL,\n            EC_WORD_YOU,\n            EC_MOVE(DIG),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BLACK_BELT,\n        .name = _(\"HAL\"),\n        .teamFlags = 0x09,\n        .greeting = {\n            EC_WORD_BOY,\n            EC_WORD_I_AM,\n            EC_WORD_TIRED,\n            EC_WORD_READY,\n            EC_WORD_FOR,\n            EC_WORD_SLEEP,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BEAUTY,\n        .name = _(\"LAUREN\"),\n        .teamFlags = 0x06,\n        .greeting = {\n            EC_WORD_A,\n            EC_WORD_TRAINER,\n            EC_WORD_LIKE,\n            EC_WORD_YOU,\n            EC_WORD_IS,\n            EC_WORD_EXCITING,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_AROMA_LADY,\n        .name = _(\"STACY\"),\n        .teamFlags = 0x06,\n        .greeting = {\n            EC_WORD_HAVE,\n            EC_WORD_YOU,\n            EC_WORD_A,\n            EC_WORD_STENCH,\n            EC_WORD_OR,\n            EC_MOVE(SWEET_SCENT),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_COLLECTOR,\n        .name = _(\"DARYL\"),\n        .teamFlags = 0x81,\n        .greeting = {\n            EC_WORD_YOUR,\n            EC_WORD_POKEMON,\n            EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS,\n            EC_WORD_I,\n            EC_WORD_WANT,\n            EC_WORD_IT,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_SWIMMER_F,\n        .name = _(\"KATHY\"),\n        .teamFlags = 0x04,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_WILL,\n            EC_WORD_TRY,\n            EC_WORD_MY,\n            EC_WORD_BEST,\n            EC_WORD_TODAY,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PKMN_RANGER_M,\n        .name = _(\"HARRIS\"),\n        .teamFlags = 0x0C,\n        .greeting = {\n            EC_WORD_WAAAH,\n            EC_WORD_WAAAH,\n            EC_WORD_WAAAH,\n            EC_WORD_WAAAH,\n            EC_WORD_EHEHE,\n            EC_MOVE(FAKE_TEARS),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_POKEFAN_M,\n        .name = _(\"GLENN\"),\n        .teamFlags = 0x80,\n        .greeting = {\n            EC_WORD_LISTEN,\n            EC_WORD_TO,\n            EC_WORD_MY,\n            EC_WORD_LOUSY,\n            EC_WORD_ANIME,\n            EC_WORD_SONG,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BIKER,\n        .name = _(\"NICO\"),\n        .teamFlags = 0x04,\n        .greeting = {\n            EC_WORD_DON_T,\n            EC_WORD_JUST,\n            EC_WORD_BATTLE,\n            EC_WORD_DO,\n            EC_WORD_SOMETHING,\n            EC_WORD_ELSE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_RS_PKMN_BREEDER_M,\n        .name = _(\"BAILEY\"),\n        .teamFlags = 0x41,\n        .greeting = {\n            EC_WORD_ARE,\n            EC_WORD_YOU,\n            EC_WORD_BUSY,\n            EC_WORD_GET,\n            EC_WORD_WITH,\n            EC_WORD_IT,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PARASOL_LADY,\n        .name = _(\"ABBIE\"),\n        .teamFlags = 0x08,\n        .greeting = {\n            EC_WORD_THE,\n            EC_MOVE(MORNING_SUN),\n            EC_WORD_HAS,\n            EC_WORD_SO,\n            EC_WORD_MUCH,\n            EC_MOVE(COSMIC_POWER),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_CAMPER,\n        .name = _(\"AL\"),\n        .teamFlags = 0x0C,\n        .greeting = {\n            EC_WORD_LET_S,\n            EC_WORD_HAVE,\n            EC_WORD_AN,\n            EC_WORD_EXCITING,\n            EC_WORD_BATTLE,\n            EC_WORD_YEEHAW_EXCL,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_LASS,\n        .name = _(\"PEGGY\"),\n        .teamFlags = 0x42,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_WANT,\n            EC_WORD_TO,\n            EC_WORD_SEE,\n            EC_WORD_SOME,\n            EC_MOVE(GROWTH),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BEAUTY,\n        .name = _(\"NAOMI\"),\n        .teamFlags = 0x04,\n        .greeting = {\n            EC_WORD_IT,\n            EC_WORD_WAS,\n            EC_WORD_GREAT,\n            EC_WORD_TO,\n            EC_WORD_BE,\n            EC_WORD_YOUNG,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_NINJA_BOY,\n        .name = _(\"KENJI\"),\n        .teamFlags = 0x0C,\n        .greeting = {\n            EC_WORD_PLEASE,\n            0xFFFF,\n            EC_WORD_DON_T,\n            EC_WORD_BE,\n            EC_WORD_MEAN,\n            EC_WORD_TO_ME,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BIKER,\n        .name = _(\"ROSS\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_WAKE_UP,\n            EC_WORD_MY,\n            EC_MOVE2(HIDDEN_POWER),\n            EC_WORD_AND,\n            EC_MOVE(ASTONISH),\n            EC_WORD_ME,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PKMN_RANGER_F,\n        .name = _(\"EDNA\"),\n        .teamFlags = 0x02,\n        .greeting = {\n            EC_WORD_BATTLE_TOWER,\n            EC_WORD_IS,\n            EC_WORD_SO,\n            EC_WORD_ENTERTAINING,\n            EC_WORD_IT_S,\n            EC_WORD_AWESOME,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_RUIN_MANIAC,\n        .name = _(\"ANTON\"),\n        .teamFlags = 0x41,\n        .greeting = {\n            EC_WORD_BLEND,\n            EC_WORD_THICK_FAT,\n            EC_WORD_AND,\n            EC_WORD_CHLOROPHYLL,\n            EC_WORD_IT_S,\n            EC_WORD_TASTY,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_SWIMMER_M,\n        .name = _(\"MITCH\"),\n        .teamFlags = 0x81,\n        .greeting = {\n            EC_WORD_NEXT,\n            EC_WORD_A,\n            EC_WORD_GIRL,\n            EC_WORD_WITH,\n            EC_WORD_A,\n            EC_MOVE(SCARY_FACE),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_HEX_MANIAC,\n        .name = _(\"ROD\"),\n        .teamFlags = 0x42,\n        .greeting = {\n            EC_WORD_GIMME,\n            EC_WORD_A,\n            EC_WORD_TOUGH,\n            EC_WORD_BATTLE,\n            EC_WORD_NOT,\n            EC_WORD_WIMPY,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BLACK_BELT,\n        .name = _(\"RICH\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_TASTY,\n            EC_WORD_WATER,\n            EC_WORD_IS,\n            EC_WORD_HIP_AND,\n            EC_WORD_HAPPENING,\n            EC_WORD_YES_SIR_EXCL,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_POKEFAN_M,\n        .name = _(\"DANIEL\"),\n        .teamFlags = 0x80,\n        .greeting = {\n            EC_WORD_GO,\n            EC_WORD_FOR,\n            EC_WORD_IT,\n            EC_WORD_MY,\n            EC_WORD_LOVEY_DOVEY,\n            EC_WORD_POKEMON,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PSYCHIC_F,\n        .name = _(\"GLORIA\"),\n        .teamFlags = 0x82,\n        .greeting = {\n            EC_WORD_LET_S,\n            EC_WORD_GET,\n            EC_WORD_THIS,\n            EC_WORD_FIERY,\n            EC_WORD_BATTLE,\n            EC_WORD_HAPPENING,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_GUITARIST,\n        .name = _(\"NELSON\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_MUSIC,\n            EC_WORD_IS,\n            EC_WORD_MY,\n            EC_WORD_ALL,\n            EC_WORD_MY,\n            EC_WORD_DESTINY,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_KINDLER,\n        .name = _(\"FERRIS\"),\n        .teamFlags = 0x41,\n        .greeting = {\n            EC_WORD_GOOD,\n            EC_WORD_IT,\n            EC_WORD_IS,\n            EC_WORD_SO,\n            EC_WORD_VERY,\n            EC_WORD_GOOD,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_AROMA_LADY,\n        .name = _(\"AMANDA\"),\n        .teamFlags = 0x82,\n        .greeting = {\n            EC_WORD_WHAT,\n            EC_WORD_KIND,\n            EC_WORD_OF,\n            EC_WORD_TRAINER,\n            EC_WORD_ARE,\n            EC_WORD_YOU,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_SWIMMER_M,\n        .name = _(\"MASON\"),\n        .teamFlags = 0x10,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_DON_T,\n            EC_WORD_KNOW,\n            EC_WORD_HOW,\n            EC_WORD_TO,\n            EC_WORD_LOSE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_DRAGON_TAMER,\n        .name = _(\"NATE\"),\n        .teamFlags = 0x10,\n        .greeting = {\n            EC_WORD_DRAGON,\n            EC_WORD_POKEMON,\n            EC_WORD_ARE,\n            EC_WORD_ALL,\n            EC_WORD_THE,\n            EC_MOVE(RAGE),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_LASS,\n        .name = _(\"MIRIAM\"),\n        .teamFlags = 0x82,\n        .greeting = {\n            EC_WORD_YOU_RE,\n            EC_WORD_TOO_STRONG,\n            EC_WORD_SERIOUSLY,\n            EC_WORD_IT_S,\n            EC_WORD_BAD,\n            EC_WORD_NEWS,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_POKEMANIAC,\n        .name = _(\"THEO\"),\n        .teamFlags = 0x40,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_ADORE,\n            EC_WORD_MY,\n            EC_WORD_MEGA,\n            EC_WORD_CUTE,\n            EC_WORD_PLUSH_DOLL,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_SWIMMER_F,\n        .name = _(\"PAMELA\"),\n        .teamFlags = 0x10,\n        .greeting = {\n            EC_WORD_HERE_I_COME,\n            EC_WORD_I_AM,\n            EC_WORD_THE,\n            EC_WORD_CUTE,\n            EC_MOVE2(WATER_SPORT),\n            EC_WORD_IDOL,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_POKEFAN_F,\n        .name = _(\"ALISSA\"),\n        .teamFlags = 0x20,\n        .greeting = {\n            EC_WORD_IT_S,\n            EC_WORD_A,\n            EC_WORD_PREPOSTEROUS,\n            EC_WORD_MATCH,\n            EC_WORD_I_AM,\n            EC_WORD_SHOCKED,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_GENTLEMAN,\n        .name = _(\"ARTHUR\"),\n        .teamFlags = 0x20,\n        .greeting = {\n            EC_WORD_PLEASE,\n            EC_WORD_GIVE,\n            EC_WORD_ME,\n            EC_WORD_A,\n            EC_WORD_GOOD,\n            EC_WORD_BATTLE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_SWIMMER_F,\n        .name = _(\"MARCY\"),\n        .teamFlags = 0x82,\n        .greeting = {\n            EC_WORD_I_AM,\n            EC_WORD_BEAUTIFUL,\n            EC_WORD_YOU,\n            EC_WORD_CAN_T,\n            EC_WORD_BEAT,\n            EC_WORD_ME,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_COOLTRAINER_M,\n        .name = _(\"MILLER\"),\n        .teamFlags = 0x10,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_BATTLE,\n            EC_WORD_DAILY,\n            EC_WORD_I,\n            EC_WORD_WON_T,\n            EC_WORD_LOSE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BIRD_KEEPER,\n        .name = _(\"OLIVER\"),\n        .teamFlags = 0x11,\n        .greeting = {\n            EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS,\n            EC_WORD_GIGGLE,\n            EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS,\n            0xFFFF,\n            0xFFFF,\n            0xFFFF,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BATTLE_GIRL,\n        .name = _(\"MOLLY\"),\n        .teamFlags = 0x12,\n        .greeting = {\n            EC_WORD_HOW,\n            EC_WORD_ARE,\n            EC_WORD_YOU,\n            EC_WORD_ON,\n            EC_WORD_MONDAY,\n            EC_WORD_MORNING,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BUG_MANIAC,\n        .name = _(\"JASON\"),\n        .teamFlags = 0x40,\n        .greeting = {\n            EC_WORD_WATER,\n            EC_WORD_AND,\n            EC_WORD_BUG,\n            EC_WORD_POKEMON,\n            EC_WORD_ARE,\n            EC_WORD_GREAT,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BATTLE_GIRL,\n        .name = _(\"AVA\"),\n        .teamFlags = 0x20,\n        .greeting = {\n            EC_WORD_WHAT,\n            EC_WORD_IS,\n            EC_WORD_THIS,\n            EC_WORD_PRESSURE,\n            EC_WORD_ELLIPSIS,\n            EC_WORD_STATIC,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_FISHERMAN,\n        .name = _(\"HANK\"),\n        .teamFlags = 0x10,\n        .greeting = {\n            EC_WORD_YOU_RE,\n            EC_WORD_A,\n            EC_WORD_KID,\n            EC_WORD_YOU,\n            EC_WORD_CAN_T,\n            EC_WORD_WIN,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_SAILOR,\n        .name = _(\"PETER\"),\n        .teamFlags = 0x20,\n        .greeting = {\n            EC_WORD_IT_S,\n            EC_WORD_SERIOUSLY,\n            EC_WORD_TERRIBLE,\n            EC_WORD_I,\n            EC_WORD_REALLY,\n            EC_WORD_THINK,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_EXPERT_F,\n        .name = _(\"MINDY\"),\n        .teamFlags = 0x20,\n        .greeting = {\n            EC_WORD_YOU,\n            EC_WORD_APPEAR,\n            EC_WORD_TO,\n            EC_WORD_TRAIN,\n            EC_WORD_VERY,\n            EC_WORD_WELL,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BUG_MANIAC,\n        .name = _(\"DWIGHT\"),\n        .teamFlags = 0x11,\n        .greeting = {\n            EC_WORD_ARE,\n            EC_WORD_YOU,\n            EC_WORD_STRONG,\n            EC_WORD_YOU,\n            EC_WORD_ARE,\n            EC_WORD_SCARY,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PKMN_BREEDER,\n        .name = _(\"REENA\"),\n        .teamFlags = 0x12,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_ALWAYS,\n            EC_WORD_LOSE,\n            EC_WORD_MAYBE,\n            EC_WORD_TODAY,\n            EC_WORD_ELLIPSIS,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PARASOL_LADY,\n        .name = _(\"MEGAN\"),\n        .teamFlags = 0x10,\n        .greeting = {\n            EC_WORD_DON_T,\n            EC_WORD_MAKE,\n            EC_WORD_THAT,\n            EC_MOVE(SCARY_FACE),\n            EC_WORD_AT,\n            EC_WORD_ME,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BATTLE_GIRL,\n        .name = _(\"SIERRA\"),\n        .teamFlags = 0x04,\n        .greeting = {\n            EC_WORD_I_VE,\n            EC_WORD_RUN,\n            EC_WORD_A_LOT,\n            EC_WORD_SO,\n            EC_WORD_I_AM,\n            EC_WORD_HEALTHY,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PKMN_RANGER_M,\n        .name = _(\"ARNOLD\"),\n        .teamFlags = 0x08,\n        .greeting = {\n            EC_WORD_I_AM,\n            EC_WORD_FEELING,\n            EC_WORD_AWESOME,\n            EC_WORD_MY,\n            EC_WORD_POKEMON,\n            EC_WORD_ROCK,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BLACK_BELT,\n        .name = _(\"XIN\"),\n        .teamFlags = 0x04,\n        .greeting = {\n            EC_WORD_HOO_HAH,\n            EC_WORD_ARE,\n            EC_WORD_YOU,\n            EC_WORD_READY,\n            EC_WORD_TO,\n            EC_WORD_ROCK,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_COOLTRAINER_F,\n        .name = _(\"KELLY\"),\n        .teamFlags = 0x02,\n        .greeting = {\n            EC_WORD_YOU,\n            EC_WORD_COULDN_T,\n            EC_WORD_BEAT,\n            EC_WORD_ME,\n            EC_WORD_EVER,\n            EC_WORD_KID,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_COLLECTOR,\n        .name = _(\"VANCE\"),\n        .teamFlags = 0x80,\n        .greeting = {\n            EC_WORD_POKEMON,\n            EC_WORD_ALL,\n            EC_WORD_OVER,\n            EC_WORD_THE,\n            EC_WORD_PLACE,\n            EC_WORD_WOWEE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_SWIMMER_M,\n        .name = _(\"TOBY\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_THIS,\n            EC_WORD_ISN_T,\n            EC_WORD_SPORTS,\n            EC_WORD_IT_S,\n            EC_WORD_A,\n            EC_WORD_BATTLE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_GENTLEMAN,\n        .name = _(\"NORTON\"),\n        .teamFlags = 0x20,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_HAVE,\n            EC_WORD_TO,\n            EC_WORD_WIN,\n            EC_WORD_PLEASE,\n            EC_WORD_LOSE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BATTLE_GIRL,\n        .name = _(\"ZOE\"),\n        .teamFlags = 0x02,\n        .greeting = {\n            EC_WORD_THIS,\n            EC_WORD_IS,\n            EC_WORD_SCARY,\n            EC_WORD_PLEASE,\n            EC_WORD_BE,\n            EC_WORD_NICE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_BEAUTY,\n        .name = _(\"EMMA\"),\n        .teamFlags = 0x20,\n        .greeting = {\n            EC_WORD_DON_T,\n            EC_WORD_YOU,\n            EC_MOVE(FLAIL),\n            EC_WORD_YOU,\n            EC_WORD_CAN_T,\n            EC_MOVE(WITHDRAW),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_HIKER,\n        .name = _(\"VINCE\"),\n        .teamFlags = 0x04,\n        .greeting = {\n            EC_WORD_YAHOO,\n            EC_WORD_YAHOO,\n            EC_WORD_ARE,\n            EC_WORD_YOU,\n            EC_WORD_LISTENING,\n            EC_WORD_QUES,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_EXPERT_M,\n        .name = _(\"MARV\"),\n        .teamFlags = 0x10,\n        .greeting = {\n            EC_WORD_LEARN,\n            EC_WORD_TO,\n            EC_WORD_BATTLE,\n            EC_WORD_THE,\n            EC_WORD_CORRECT,\n            EC_WORD_WAY,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_RS_PKMN_BREEDER_M,\n        .name = _(\"TODD\"),\n        .teamFlags = 0x40,\n        .greeting = {\n            EC_WORD_THE,\n            EC_WORD_WAY,\n            EC_WORD_YOU,\n            EC_WORD_BATTLE,\n            EC_WORD_IT_S,\n            EC_WORD_CHILD_S_PLAY,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_GUITARIST,\n        .name = _(\"GAVIN\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_BABY,\n            EC_WORD_BABY,\n            EC_WORD_BABY,\n            EC_WORD_ROCK,\n            EC_WORD_ME,\n            EC_WORD_HARD,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_PSYCHIC_M,\n        .name = _(\"QUINN\"),\n        .teamFlags = 0x08,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_HAVE,\n            EC_WORD_A,\n            EC_WORD_STICKY_HOLD,\n            EC_WORD_ON,\n            EC_WORD_YOU,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_COOLTRAINER_F,\n        .name = _(\"JENN\"),\n        .teamFlags = 0x02,\n        .greeting = {\n            EC_WORD_I_AM,\n            EC_WORD_ON,\n            EC_WORD_A,\n            EC_WORD_TOUGH,\n            EC_WORD_TRAINER,\n            EC_WORD_SEARCH,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_EXPERT_M,\n        .name = _(\"JOEL\"),\n        .teamFlags = 0x10,\n        .greeting = {\n            EC_WORD_BELIEVE,\n            EC_WORD_IN,\n            EC_WORD_YOUR,\n            EC_WORD_POKEMON,\n            EC_WORD_AND,\n            EC_WORD_WIN,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_DRAGON_TAMER,\n        .name = _(\"KYLE\"),\n        .teamFlags = 0x0C,\n        .greeting = {\n            EC_WORD_I,\n            EC_WORD_LIKE,\n            EC_WORD_A,\n            EC_WORD_GIRL,\n            EC_WORD_WITH,\n            EC_MOVE2(FORESIGHT),\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_COOLTRAINER_M,\n        .name = _(\"BRET\"),\n        .teamFlags = 0x01,\n        .greeting = {\n            EC_WORD_TAKE,\n            EC_WORD_MY,\n            EC_WORD_OVERWHELMING,\n            EC_WORD_POWER,\n            EC_WORD_AND,\n            EC_WORD_DISAPPEAR,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_EXPERT_F,\n        .name = _(\"CARRIE\"),\n        .teamFlags = 0x10,\n        .greeting = {\n            EC_WORD_TRAINER,\n            EC_WORD_I,\n            EC_WORD_SEE,\n            EC_WORD_YOU,\n            EC_WORD_ARE,\n            EC_WORD_CAPABLE,\n        },\n    },\n    {\n        .trainerClass = FACILITY_CLASS_LADY,\n        .name = _(\"GILLIAN\"),\n        .teamFlags = 0x02,\n        .greeting = {\n            EC_WORD_COME_ON,\n            EC_WORD_SHOW,\n            EC_WORD_ME,\n            EC_WORD_AN,\n            EC_WORD_EXCELLENT,\n            EC_WORD_TIME,\n        },\n    },\n};\n"
  },
  {
    "path": "src/data/decoration/description.h",
    "content": "const u8 DecorDesc_SMALL_DESK[] = _(\n    \"A small desk built\\n\"\n        \"for one.\");\n\nconst u8 DecorDesc_POKEMON_DESK[] = _(\n    \"A small desk built in\\n\"\n        \"the shape of a POKé\\n\"\n        \"BALL.\");\n\nconst u8 DecorDesc_HEAVY_DESK[] = _(\n    \"A large desk made\\n\"\n        \"of steel. Put some\\n\"\n        \"decorations on it.\");\n\nconst u8 DecorDesc_RAGGED_DESK[] = _(\n    \"A large desk made\\n\"\n        \"of wood. Put some\\n\"\n        \"decorations on it.\");\n\nconst u8 DecorDesc_COMFORT_DESK[] = _(\n    \"A large desk made\\n\"\n        \"of leaves. Put some\\n\"\n        \"decorations on it.\");\n\nconst u8 DecorDesc_PRETTY_DESK[] = _(\n    \"A huge desk made\\n\"\n        \"of glass. Holds lots\\n\"\n        \"of decorations.\");\n\nconst u8 DecorDesc_BRICK_DESK[] = _(\n    \"A huge desk made\\n\"\n        \"of brick. Holds lots\\n\"\n        \"of decorations.\");\n\nconst u8 DecorDesc_CAMP_DESK[] = _(\n    \"A huge desk made\\n\"\n        \"of logs. Put lots of\\n\"\n        \"decorations on it.\");\n\nconst u8 DecorDesc_HARD_DESK[] = _(\n    \"A huge desk made\\n\"\n        \"of rocks. Holds\\n\"\n        \"many decorations.\");\n\nconst u8 DecorDesc_SMALL_CHAIR[] = _(\n    \"A small chair made\\n\"\n        \"for one.\");\n\nconst u8 DecorDesc_POKEMON_CHAIR[] = _(\n    \"A small chair built\\n\"\n        \"in the shape of a\\n\"\n        \"POKé BALL.\");\n\nconst u8 DecorDesc_HEAVY_CHAIR[] = _(\n    \"A small chair made\\n\"\n        \"of steel.\");\n\nconst u8 DecorDesc_PRETTY_CHAIR[] = _(\n    \"A small chair made\\n\"\n        \"of glass.\");\n\nconst u8 DecorDesc_COMFORT_CHAIR[] = _(\n    \"A small chair made\\n\"\n        \"of leaves.\");\n\nconst u8 DecorDesc_RAGGED_CHAIR[] = _(\n    \"A small chair made\\n\"\n        \"of wood.\");\n\nconst u8 DecorDesc_BRICK_CHAIR[] = _(\n    \"A small chair made\\n\"\n        \"of brick.\");\n\nconst u8 DecorDesc_CAMP_CHAIR[] = _(\n    \"A small chair made\\n\"\n        \"of logs.\");\n\nconst u8 DecorDesc_HARD_CHAIR[] = _(\n    \"A small chair made\\n\"\n        \"of rock.\");\n\nconst u8 DecorDesc_RED_PLANT[] = _(\n    \"A vivid red potted\\n\"\n        \"plant.\");\n\nconst u8 DecorDesc_TROPICAL_PLANT[] = _(\n    \"A flowering tropical\\n\"\n        \"plant in a pot.\");\n\nconst u8 DecorDesc_PRETTY_FLOWERS[] = _(\n    \"A pot of cute\\n\"\n        \"flowers.\");\n\nconst u8 DecorDesc_COLORFUL_PLANT[] = _(\n    \"A large pot with\\n\"\n        \"many colorful\\n\"\n        \"flowers.\");\n\nconst u8 DecorDesc_BIG_PLANT[] = _(\n    \"A large, umbrella-\\n\"\n        \"shaped plant in a\\n\"\n        \"big pot.\");\n\nconst u8 DecorDesc_GORGEOUS_PLANT[] = _(\n    \"A large, impressive\\n\"\n        \"plant in a big pot.\");\n\nconst u8 DecorDesc_RED_BRICK[] = _(\n    \"A red-colored brick.\\n\"\n        \"Decorations can be\\n\"\n        \"placed on top.\");\n\nconst u8 DecorDesc_YELLOW_BRICK[] = _(\n    \"A yellow-colored\\n\"\n        \"brick. Put some\\n\"\n        \"decorations on top.\");\n\nconst u8 DecorDesc_BLUE_BRICK[] = _(\n    \"A blue-colored\\n\"\n        \"brick. Put some\\n\"\n        \"decorations on top.\");\n\nconst u8 DecorDesc_RED_BALLOON[] = _(\n    \"A red balloon filled\\n\"\n        \"with water. Bursts\\n\"\n        \"if stepped on.\");\n\nconst u8 DecorDesc_BLUE_BALLOON[] = _(\n    \"A blue balloon filled\\n\"\n        \"with water. Bursts\\n\"\n        \"if stepped on.\");\n\nconst u8 DecorDesc_YELLOW_BALLOON[] = _(\n    \"A yellow balloon\\n\"\n        \"filled with water.\\n\"\n        \"Pops if stepped on.\");\n\nconst u8 DecorDesc_RED_TENT[] = _(\n    \"A large red tent.\\n\"\n        \"You can hide inside\\n\"\n        \"it.\");\n\nconst u8 DecorDesc_BLUE_TENT[] = _(\n    \"A large blue tent.\\n\"\n        \"You can hide inside\\n\"\n        \"it.\");\n\nconst u8 DecorDesc_SOLID_BOARD[] = _(\n    \"Place over a hole to\\n\"\n        \"cross to the other\\n\"\n        \"side.\");\n\nconst u8 DecorDesc_SLIDE[] = _(\n    \"Use to slide down\\n\"\n        \"from the platform.\");\n\nconst u8 DecorDesc_FENCE_LENGTH[] = _(\n    \"A small fence that\\n\"\n        \"blocks passage.\");\n\nconst u8 DecorDesc_FENCE_WIDTH[] = _(\n    \"A small fence that\\n\"\n        \"blocks passage.\");\n\nconst u8 DecorDesc_TIRE[] = _(\n    \"An old large tire.\\n\"\n        \"Decorations can be\\n\"\n        \"placed on top.\");\n\nconst u8 DecorDesc_STAND[] = _(\n    \"A large pedestal\\n\"\n        \"with steps.\");\n\nconst u8 DecorDesc_MUD_BALL[] = _(\n    \"A large ball of mud.\\n\"\n        \"Crumbles if stepped\\n\"\n        \"on.\");\n\nconst u8 DecorDesc_BREAKABLE_DOOR[] = _(\n    \"A weird door that\\n\"\n        \"people can walk\\n\"\n        \"right through.\");\n\nconst u8 DecorDesc_SAND_ORNAMENT[] = _(\n    \"An ornament made\\n\"\n        \"of sand. Crumbles if\\n\"\n        \"touched.\");\n\nconst u8 DecorDesc_SILVER_SHIELD[] = _(\n    \"Awarded for 50\\n\"\n        \"straight wins at\\n\"\n        \"the BATTLE TOWER.\");\n\nconst u8 DecorDesc_GOLD_SHIELD[] = _(\n    \"Awarded for 100\\n\"\n        \"straight wins at\\n\"\n        \"the BATTLE TOWER.\");\n\nconst u8 DecorDesc_GLASS_ORNAMENT[] = _(\n    \"A glass replica of\\n\"\n        \"a famous sculpture\\n\"\n        \"at the ART MUSEUM.\");\n\nconst u8 DecorDesc_TV[] = _(\n    \"A small, gray-\\n\"\n        \"colored toy TV.\");\n\nconst u8 DecorDesc_ROUND_TV[] = _(\n    \"A toy TV modeled\\n\"\n        \"in the image of a\\n\"\n        \"SEEDOT.\");\n\nconst u8 DecorDesc_CUTE_TV[] = _(\n    \"A toy TV modeled\\n\"\n        \"in the image of a\\n\"\n        \"SKITTY.\");\n\nconst u8 DecorDesc_GLITTER_MAT[] = _(\n    \"An odd mat that\\n\"\n        \"glitters if stepped\\n\"\n        \"on.\");\n\nconst u8 DecorDesc_JUMP_MAT[] = _(\n    \"A trick mat that\\n\"\n        \"jumps when it is\\n\"\n        \"stepped on.\");\n\nconst u8 DecorDesc_SPIN_MAT[] = _(\n    \"A trick mat that\\n\"\n        \"spins around when\\n\"\n        \"stepped on.\");\n\nconst u8 DecorDesc_C_LOW_NOTE_MAT[] = _(\n    \"A mat that plays\\n\"\n        \"a low C note when\\n\"\n        \"stepped on.\");\n\nconst u8 DecorDesc_D_NOTE_MAT[] = _(\n    \"A mat that plays\\n\"\n        \"a D note when\\n\"\n        \"stepped on.\");\n\nconst u8 DecorDesc_E_NOTE_MAT[] = _(\n    \"A mat that plays\\n\"\n        \"an E note when\\n\"\n        \"stepped on.\");\n\nconst u8 DecorDesc_F_NOTE_MAT[] = _(\n    \"A mat that plays\\n\"\n        \"an F note when\\n\"\n        \"stepped on.\");\n\nconst u8 DecorDesc_G_NOTE_MAT[] = _(\n    \"A mat that plays\\n\"\n        \"a G note when\\n\"\n        \"stepped on.\");\n\nconst u8 DecorDesc_A_NOTE_MAT[] = _(\n    \"A mat that plays\\n\"\n        \"an A note when\\n\"\n        \"stepped on.\");\n\nconst u8 DecorDesc_B_NOTE_MAT[] = _(\n    \"A mat that plays\\n\"\n        \"a B note when\\n\"\n        \"stepped on.\");\n\nconst u8 DecorDesc_C_HIGH_NOTE_MAT[] = _(\n    \"A mat that plays\\n\"\n        \"a high C note when\\n\"\n        \"stepped on.\");\n\nconst u8 DecorDesc_SURF_MAT[] = _(\n    \"A mat designed with\\n\"\n        \"a SURF image.\\n\"\n        \"Put items on top.\");\n\nconst u8 DecorDesc_THUNDER_MAT[] = _(\n    \"A mat designed with\\n\"\n        \"a THUNDER image.\\n\"\n        \"Put items on top.\");\n\nconst u8 DecorDesc_FIRE_BLAST_MAT[] = _(\n    \"A mat designed with\\n\"\n        \"a FIRE BLAST image.\\n\"\n        \"Put items on top.\");\n\nconst u8 DecorDesc_POWDER_SNOW_MAT[] = _(\n    \"A mat with a POWDER\\n\"\n        \"SNOW image design.\\n\"\n        \"Put items on top.\");\n\nconst u8 DecorDesc_ATTRACT_MAT[] = _(\n    \"A mat designed with\\n\"\n        \"an ATTRACT image.\\n\"\n        \"Put items on top.\");\n\nconst u8 DecorDesc_FISSURE_MAT[] = _(\n    \"A mat designed with\\n\"\n        \"a FISSURE image.\\n\"\n        \"Put items on top.\");\n\nconst u8 DecorDesc_SPIKES_MAT[] = _(\n    \"A mat designed with\\n\"\n        \"a SPIKES image.\\n\"\n        \"Put items on top.\");\n\nconst u8 DecorDesc_BALL_POSTER[] = _(\n    \"A small poster\\n\"\n        \"printed with POKé\\n\"\n        \"BALLS.\");\n\nconst u8 DecorDesc_GREEN_POSTER[] = _(\n    \"A small poster with\\n\"\n        \"a TREECKO print.\");\n\nconst u8 DecorDesc_RED_POSTER[] = _(\n    \"A small poster with\\n\"\n        \"a TORCHIC print.\");\n\nconst u8 DecorDesc_BLUE_POSTER[] = _(\n    \"A small poster with\\n\"\n        \"a MUDKIP print.\");\n\nconst u8 DecorDesc_CUTE_POSTER[] = _(\n    \"A small poster with\\n\"\n        \"an AZURILL print.\");\n\nconst u8 DecorDesc_PIKA_POSTER[] = _(\n    \"A large poster with\\n\"\n        \"a PIKACHU and\\n\"\n        \"PICHU print.\");\n\nconst u8 DecorDesc_LONG_POSTER[] = _(\n    \"A large poster with\\n\"\n        \"a SEVIPER print.\");\n\nconst u8 DecorDesc_SEA_POSTER[] = _(\n    \"A large poster with\\n\"\n        \"a RELICANTH print.\");\n\nconst u8 DecorDesc_SKY_POSTER[] = _(\n    \"A large poster with\\n\"\n        \"a WINGULL print.\");\n\nconst u8 DecorDesc_KISS_POSTER[] = _(\n    \"A large poster with\\n\"\n        \"a SMOOCHUM print.\");\n\nconst u8 DecorDesc_PICHU_DOLL[] = _(\n    \"A PICHU doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_PIKACHU_DOLL[] = _(\n    \"A PIKACHU doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_MARILL_DOLL[] = _(\n    \"A MARILL doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_TOGEPI_DOLL[] = _(\n    \"A TOGEPI doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_CYNDAQUIL_DOLL[] = _(\n    \"A CYNDAQUIL doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_CHIKORITA_DOLL[] = _(\n    \"A CHIKORITA doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_TOTODILE_DOLL[] = _(\n    \"A TOTODILE doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_JIGGLYPUFF_DOLL[] = _(\n    \"A JIGGLYPUFF doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_MEOWTH_DOLL[] = _(\n    \"A MEOWTH doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_CLEFAIRY_DOLL[] = _(\n    \"A CLEFAIRY doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_DITTO_DOLL[] = _(\n    \"A DITTO doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_SMOOCHUM_DOLL[] = _(\n    \"A SMOOCHUM doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_TREECKO_DOLL[] = _(\n    \"A TREECKO doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_TORCHIC_DOLL[] = _(\n    \"A TORCHIC doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_MUDKIP_DOLL[] = _(\n    \"A MUDKIP doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_DUSKULL_DOLL[] = _(\n    \"A DUSKULL doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_WYNAUT_DOLL[] = _(\n    \"A WYNAUT doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_BALTOY_DOLL[] = _(\n    \"A BALTOY doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_KECLEON_DOLL[] = _(\n    \"A KECLEON doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_AZURILL_DOLL[] = _(\n    \"An AZURILL doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_SKITTY_DOLL[] = _(\n    \"A SKITTY doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_SWABLU_DOLL[] = _(\n    \"A SWABLU doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_GULPIN_DOLL[] = _(\n    \"A GULPIN doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_LOTAD_DOLL[] = _(\n    \"A LOTAD doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_SEEDOT_DOLL[] = _(\n    \"A SEEDOT doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_PIKA_CUSHION[] = _(\n    \"A PIKACHU cushion.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_ROUND_CUSHION[] = _(\n    \"A MARILL cushion.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_KISS_CUSHION[] = _(\n    \"A SMOOCHUM\\n\"\n        \"cushion. Place it on\\n\"\n        \"a mat or a desk.\");\n\nconst u8 DecorDesc_ZIGZAG_CUSHION[] = _(\n    \"A ZIGZAGOON\\n\"\n        \"cushion. Place it on\\n\"\n        \"a mat or a desk.\");\n\nconst u8 DecorDesc_SPIN_CUSHION[] = _(\n    \"A SPINDA cushion.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_DIAMOND_CUSHION[] = _(\n    \"A SABLEYE cushion.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_BALL_CUSHION[] = _(\n    \"A BALL cushion.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_GRASS_CUSHION[] = _(\n    \"A grass-mark\\n\"\n        \"cushion. Place it on\\n\"\n        \"a mat or a desk.\");\n\nconst u8 DecorDesc_FIRE_CUSHION[] = _(\n    \"A fire-mark\\n\"\n        \"cushion. Place it on\\n\"\n        \"a mat or a desk.\");\n\nconst u8 DecorDesc_WATER_CUSHION[] = _(\n    \"A water-mark\\n\"\n        \"cushion. Place it on\\n\"\n        \"a mat or a desk.\");\n\nconst u8 DecorDesc_SNORLAX_DOLL[] = _(\n    \"A large doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_RHYDON_DOLL[] = _(\n    \"A large doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_LAPRAS_DOLL[] = _(\n    \"A large doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_VENUSAUR_DOLL[] = _(\n    \"A large doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_CHARIZARD_DOLL[] = _(\n    \"A large doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_BLASTOISE_DOLL[] = _(\n    \"A large doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_WAILMER_DOLL[] = _(\n    \"A large doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_REGIROCK_DOLL[] = _(\n    \"A large doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_REGICE_DOLL[] = _(\n    \"A large doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n\nconst u8 DecorDesc_REGISTEEL_DOLL[] = _(\n    \"A large doll.\\n\"\n        \"Place it on a mat\\n\"\n        \"or a desk.\");\n"
  },
  {
    "path": "src/data/decoration/header.h",
    "content": "const struct Decoration gDecorations[] = {\n    {\n        DECOR_NONE,\n        _(\"SMALL DESK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_DESK,\n        0,\n        DecorDesc_SMALL_DESK,\n        DecorGfx_SMALL_DESK\n    }, {\n        DECOR_SMALL_DESK,\n        _(\"SMALL DESK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_DESK,\n        3000,\n        DecorDesc_SMALL_DESK,\n        DecorGfx_SMALL_DESK\n    }, {\n        DECOR_POKEMON_DESK,\n        _(\"POKéMON DESK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_DESK,\n        3000,\n        DecorDesc_POKEMON_DESK,\n        DecorGfx_POKEMON_DESK\n    }, {\n        DECOR_HEAVY_DESK,\n        _(\"HEAVY DESK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_3x2,\n        DECORCAT_DESK,\n        6000,\n        DecorDesc_HEAVY_DESK,\n        DecorGfx_HEAVY_DESK\n    }, {\n        DECOR_RAGGED_DESK,\n        _(\"RAGGED DESK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_3x2,\n        DECORCAT_DESK,\n        6000,\n        DecorDesc_RAGGED_DESK,\n        DecorGfx_RAGGED_DESK\n    }, {\n        DECOR_COMFORT_DESK,\n        _(\"COMFORT DESK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_3x2,\n        DECORCAT_DESK,\n        6000,\n        DecorDesc_COMFORT_DESK,\n        DecorGfx_COMFORT_DESK\n    }, {\n        DECOR_PRETTY_DESK,\n        _(\"PRETTY DESK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_DESK,\n        9000,\n        DecorDesc_PRETTY_DESK,\n        DecorGfx_PRETTY_DESK\n    }, {\n        DECOR_BRICK_DESK,\n        _(\"BRICK DESK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_DESK,\n        9000,\n        DecorDesc_BRICK_DESK,\n        DecorGfx_BRICK_DESK\n    }, {\n        DECOR_CAMP_DESK,\n        _(\"CAMP DESK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_DESK,\n        9000,\n        DecorDesc_CAMP_DESK,\n        DecorGfx_CAMP_DESK\n    }, {\n        DECOR_HARD_DESK,\n        _(\"HARD DESK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_DESK,\n        9000,\n        DecorDesc_HARD_DESK,\n        DecorGfx_HARD_DESK\n    }, {\n        DECOR_SMALL_CHAIR,\n        _(\"SMALL CHAIR\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_CHAIR,\n        2000,\n        DecorDesc_SMALL_CHAIR,\n        DecorGfx_SMALL_CHAIR\n    }, {\n        DECOR_POKEMON_CHAIR,\n        _(\"POKéMON CHAIR\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_CHAIR,\n        2000,\n        DecorDesc_POKEMON_CHAIR,\n        DecorGfx_POKEMON_CHAIR\n    }, {\n        DECOR_HEAVY_CHAIR,\n        _(\"HEAVY CHAIR\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_CHAIR,\n        2000,\n        DecorDesc_HEAVY_CHAIR,\n        DecorGfx_HEAVY_CHAIR\n    }, {\n        DECOR_PRETTY_CHAIR,\n        _(\"PRETTY CHAIR\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_CHAIR,\n        2000,\n        DecorDesc_PRETTY_CHAIR,\n        DecorGfx_PRETTY_CHAIR\n    }, {\n        DECOR_COMFORT_CHAIR,\n        _(\"COMFORT CHAIR\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_CHAIR,\n        2000,\n        DecorDesc_COMFORT_CHAIR,\n        DecorGfx_COMFORT_CHAIR\n    }, {\n        DECOR_RAGGED_CHAIR,\n        _(\"RAGGED CHAIR\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_CHAIR,\n        2000,\n        DecorDesc_RAGGED_CHAIR,\n        DecorGfx_RAGGED_CHAIR\n    }, {\n        DECOR_BRICK_CHAIR,\n        _(\"BRICK CHAIR\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_CHAIR,\n        2000,\n        DecorDesc_BRICK_CHAIR,\n        DecorGfx_BRICK_CHAIR\n    }, {\n        DECOR_CAMP_CHAIR,\n        _(\"CAMP CHAIR\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_CHAIR,\n        2000,\n        DecorDesc_CAMP_CHAIR,\n        DecorGfx_CAMP_CHAIR\n    }, {\n        DECOR_HARD_CHAIR,\n        _(\"HARD CHAIR\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_CHAIR,\n        2000,\n        DecorDesc_HARD_CHAIR,\n        DecorGfx_HARD_CHAIR\n    }, {\n        DECOR_RED_PLANT,\n        _(\"RED PLANT\"),\n        DECORPERM_BEHIND_FLOOR,\n        DECORSHAPE_1x2,\n        DECORCAT_PLANT,\n        3000,\n        DecorDesc_RED_PLANT,\n        DecorGfx_RED_PLANT\n    }, {\n        DECOR_TROPICAL_PLANT,\n        _(\"TROPICAL PLANT\"),\n        DECORPERM_BEHIND_FLOOR,\n        DECORSHAPE_1x2,\n        DECORCAT_PLANT,\n        3000,\n        DecorDesc_TROPICAL_PLANT,\n        DecorGfx_TROPICAL_PLANT\n    }, {\n        DECOR_PRETTY_FLOWERS,\n        _(\"PRETTY FLOWERS\"),\n        DECORPERM_BEHIND_FLOOR,\n        DECORSHAPE_1x2,\n        DECORCAT_PLANT,\n        3000,\n        DecorDesc_PRETTY_FLOWERS,\n        DecorGfx_PRETTY_FLOWERS\n    }, {\n        DECOR_COLORFUL_PLANT,\n        _(\"COLORFUL PLANT\"),\n        DECORPERM_BEHIND_FLOOR,\n        DECORSHAPE_2x2,\n        DECORCAT_PLANT,\n        5000,\n        DecorDesc_COLORFUL_PLANT,\n        DecorGfx_COLORFUL_PLANT\n    }, {\n        DECOR_BIG_PLANT,\n        _(\"BIG PLANT\"),\n        DECORPERM_BEHIND_FLOOR,\n        DECORSHAPE_2x2,\n        DECORCAT_PLANT,\n        5000,\n        DecorDesc_BIG_PLANT,\n        DecorGfx_BIG_PLANT\n    }, {\n        DECOR_GORGEOUS_PLANT,\n        _(\"GORGEOUS PLANT\"),\n        DECORPERM_BEHIND_FLOOR,\n        DECORSHAPE_2x2,\n        DECORCAT_PLANT,\n        5000,\n        DecorDesc_GORGEOUS_PLANT,\n        DecorGfx_GORGEOUS_PLANT\n    }, {\n        DECOR_RED_BRICK,\n        _(\"RED BRICK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_1x2,\n        DECORCAT_ORNAMENT,\n        500,\n        DecorDesc_RED_BRICK,\n        DecorGfx_RED_BRICK\n    }, {\n        DECOR_YELLOW_BRICK,\n        _(\"YELLOW BRICK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_1x2,\n        DECORCAT_ORNAMENT,\n        500,\n        DecorDesc_YELLOW_BRICK,\n        DecorGfx_YELLOW_BRICK\n    }, {\n        DECOR_BLUE_BRICK,\n        _(\"BLUE BRICK\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_1x2,\n        DECORCAT_ORNAMENT,\n        500,\n        DecorDesc_BLUE_BRICK,\n        DecorGfx_BLUE_BRICK\n    }, {\n        DECOR_RED_BALLOON,\n        _(\"RED BALLOON\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_ORNAMENT,\n        500,\n        DecorDesc_RED_BALLOON,\n        DecorGfx_RED_BALLOON\n    }, {\n        DECOR_BLUE_BALLOON,\n        _(\"BLUE BALLOON\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_ORNAMENT,\n        500,\n        DecorDesc_BLUE_BALLOON,\n        DecorGfx_BLUE_BALLOON\n    }, {\n        DECOR_YELLOW_BALLOON,\n        _(\"YELLOW BALLOON\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_ORNAMENT,\n        500,\n        DecorDesc_YELLOW_BALLOON,\n        DecorGfx_YELLOW_BALLOON\n    }, {\n        DECOR_RED_TENT,\n        _(\"RED TENT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_ORNAMENT,\n        10000,\n        DecorDesc_RED_TENT,\n        DecorGfx_RED_TENT\n    }, {\n        DECOR_BLUE_TENT,\n        _(\"BLUE TENT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_ORNAMENT,\n        10000,\n        DecorDesc_BLUE_TENT,\n        DecorGfx_BLUE_TENT\n    }, {\n        DECOR_SOLID_BOARD,\n        _(\"SOLID BOARD\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x2,\n        DECORCAT_ORNAMENT,\n        3000,\n        DecorDesc_SOLID_BOARD,\n        DecorGfx_SOLID_BOARD\n    }, {\n        DECOR_SLIDE,\n        _(\"SLIDE\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_2x4,\n        DECORCAT_ORNAMENT,\n        8000,\n        DecorDesc_SLIDE,\n        DecorGfx_SLIDE\n    }, {\n        DECOR_FENCE_LENGTH,\n        _(\"FENCE LENGTH\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_ORNAMENT,\n        500,\n        DecorDesc_FENCE_LENGTH,\n        DecorGfx_FENCE_LENGTH\n    }, {\n        DECOR_FENCE_WIDTH,\n        _(\"FENCE WIDTH\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_ORNAMENT,\n        500,\n        DecorDesc_FENCE_WIDTH,\n        DecorGfx_FENCE_WIDTH\n    }, {\n        DECOR_TIRE,\n        _(\"TIRE\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_2x2,\n        DECORCAT_ORNAMENT,\n        800,\n        DecorDesc_TIRE,\n        DecorGfx_TIRE\n    }, {\n        DECOR_STAND,\n        _(\"STAND\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_4x2,\n        DECORCAT_ORNAMENT,\n        7000,\n        DecorDesc_STAND,\n        DecorGfx_STAND\n    }, {\n        DECOR_MUD_BALL,\n        _(\"MUD BALL\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_ORNAMENT,\n        200,\n        DecorDesc_MUD_BALL,\n        DecorGfx_MUD_BALL\n    }, {\n        DECOR_BREAKABLE_DOOR,\n        _(\"BREAKABLE DOOR\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x2,\n        DECORCAT_ORNAMENT,\n        3000,\n        DecorDesc_BREAKABLE_DOOR,\n        DecorGfx_BREAKABLE_DOOR\n    }, {\n        DECOR_SAND_ORNAMENT,\n        _(\"SAND ORNAMENT\"),\n        DECORPERM_BEHIND_FLOOR,\n        DECORSHAPE_1x2,\n        DECORCAT_ORNAMENT,\n        3000,\n        DecorDesc_SAND_ORNAMENT,\n        DecorGfx_SAND_ORNAMENT\n    }, {\n        DECOR_SILVER_SHIELD,\n        _(\"SILVER SHIELD\"),\n        DECORPERM_BEHIND_FLOOR,\n        DECORSHAPE_1x2,\n        DECORCAT_ORNAMENT,\n        0,\n        DecorDesc_SILVER_SHIELD,\n        DecorGfx_SILVER_SHIELD\n    }, {\n        DECOR_GOLD_SHIELD,\n        _(\"GOLD SHIELD\"),\n        DECORPERM_BEHIND_FLOOR,\n        DECORSHAPE_1x2,\n        DECORCAT_ORNAMENT,\n        0,\n        DecorDesc_GOLD_SHIELD,\n        DecorGfx_GOLD_SHIELD\n    }, {\n        DECOR_GLASS_ORNAMENT,\n        _(\"GLASS ORNAMENT\"),\n        DECORPERM_BEHIND_FLOOR,\n        DECORSHAPE_1x2,\n        DECORCAT_ORNAMENT,\n        0,\n        DecorDesc_GLASS_ORNAMENT,\n        DecorGfx_GLASS_ORNAMENT\n    }, {\n        DECOR_TV,\n        _(\"TV\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_ORNAMENT,\n        3000,\n        DecorDesc_TV,\n        DecorGfx_TV\n    }, {\n        DECOR_ROUND_TV,\n        _(\"ROUND TV\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_ORNAMENT,\n        4000,\n        DecorDesc_ROUND_TV,\n        DecorGfx_ROUND_TV\n    }, {\n        DECOR_CUTE_TV,\n        _(\"CUTE TV\"),\n        DECORPERM_SOLID_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_ORNAMENT,\n        4000,\n        DecorDesc_CUTE_TV,\n        DecorGfx_CUTE_TV\n    }, {\n        DECOR_GLITTER_MAT,\n        _(\"GLITTER MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_MAT,\n        2000,\n        DecorDesc_GLITTER_MAT,\n        DecorGfx_GLITTER_MAT\n    }, {\n        DECOR_JUMP_MAT,\n        _(\"JUMP MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_MAT,\n        2000,\n        DecorDesc_JUMP_MAT,\n        DecorGfx_JUMP_MAT\n    }, {\n        DECOR_SPIN_MAT,\n        _(\"SPIN MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_MAT,\n        2000,\n        DecorDesc_SPIN_MAT,\n        DecorGfx_SPIN_MAT\n    }, {\n        DECOR_C_LOW_NOTE_MAT,\n        _(\"C Low NOTE MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_MAT,\n        500,\n        DecorDesc_C_LOW_NOTE_MAT,\n        DecorGfx_C_LOW_NOTE_MAT\n    }, {\n        DECOR_D_NOTE_MAT,\n        _(\"D NOTE MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_MAT,\n        500,\n        DecorDesc_D_NOTE_MAT,\n        DecorGfx_D_NOTE_MAT\n    }, {\n        DECOR_E_NOTE_MAT,\n        _(\"E NOTE MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_MAT,\n        500,\n        DecorDesc_E_NOTE_MAT,\n        DecorGfx_E_NOTE_MAT\n    }, {\n        DECOR_F_NOTE_MAT,\n        _(\"F NOTE MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_MAT,\n        500,\n        DecorDesc_F_NOTE_MAT,\n        DecorGfx_F_NOTE_MAT\n    }, {\n        DECOR_G_NOTE_MAT,\n        _(\"G NOTE MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_MAT,\n        500,\n        DecorDesc_G_NOTE_MAT,\n        DecorGfx_G_NOTE_MAT\n    }, {\n        DECOR_A_NOTE_MAT,\n        _(\"A NOTE MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_MAT,\n        500,\n        DecorDesc_A_NOTE_MAT,\n        DecorGfx_A_NOTE_MAT\n    }, {\n        DECOR_B_NOTE_MAT,\n        _(\"B NOTE MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_MAT,\n        500,\n        DecorDesc_B_NOTE_MAT,\n        DecorGfx_B_NOTE_MAT\n    }, {\n        DECOR_C_HIGH_NOTE_MAT,\n        _(\"C High NOTE MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_1x1,\n        DECORCAT_MAT,\n        500,\n        DecorDesc_C_HIGH_NOTE_MAT,\n        DecorGfx_C_HIGH_NOTE_MAT\n    }, {\n        DECOR_SURF_MAT,\n        _(\"SURF MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_MAT,\n        4000,\n        DecorDesc_SURF_MAT,\n        DecorGfx_SURF_MAT\n    }, {\n        DECOR_THUNDER_MAT,\n        _(\"THUNDER MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_MAT,\n        4000,\n        DecorDesc_THUNDER_MAT,\n        DecorGfx_THUNDER_MAT\n    }, {\n        DECOR_FIRE_BLAST_MAT,\n        _(\"FIRE BLAST MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_MAT,\n        4000,\n        DecorDesc_FIRE_BLAST_MAT,\n        DecorGfx_FIRE_BLAST_MAT\n    }, {\n        DECOR_POWDER_SNOW_MAT,\n        _(\"POWDER SNOW MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_MAT,\n        4000,\n        DecorDesc_POWDER_SNOW_MAT,\n        DecorGfx_POWDER_SNOW_MAT\n    }, {\n        DECOR_ATTRACT_MAT,\n        _(\"ATTRACT MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_MAT,\n        4000,\n        DecorDesc_ATTRACT_MAT,\n        DecorGfx_ATTRACT_MAT\n    }, {\n        DECOR_FISSURE_MAT,\n        _(\"FISSURE MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_MAT,\n        4000,\n        DecorDesc_FISSURE_MAT,\n        DecorGfx_FISSURE_MAT\n    }, {\n        DECOR_SPIKES_MAT,\n        _(\"SPIKES MAT\"),\n        DECORPERM_PASS_FLOOR,\n        DECORSHAPE_3x3,\n        DECORCAT_MAT,\n        4000,\n        DecorDesc_SPIKES_MAT,\n        DecorGfx_SPIKES_MAT\n    }, {\n        DECOR_BALL_POSTER,\n        _(\"BALL POSTER\"),\n        DECORPERM_NA_WALL,\n        DECORSHAPE_1x1,\n        DECORCAT_POSTER,\n        1000,\n        DecorDesc_BALL_POSTER,\n        DecorGfx_BALL_POSTER\n    }, {\n        DECOR_GREEN_POSTER,\n        _(\"GREEN POSTER\"),\n        DECORPERM_NA_WALL,\n        DECORSHAPE_1x1,\n        DECORCAT_POSTER,\n        1000,\n        DecorDesc_GREEN_POSTER,\n        DecorGfx_GREEN_POSTER\n    }, {\n        DECOR_RED_POSTER,\n        _(\"RED POSTER\"),\n        DECORPERM_NA_WALL,\n        DECORSHAPE_1x1,\n        DECORCAT_POSTER,\n        1000,\n        DecorDesc_RED_POSTER,\n        DecorGfx_RED_POSTER\n    }, {\n        DECOR_BLUE_POSTER,\n        _(\"BLUE POSTER\"),\n        DECORPERM_NA_WALL,\n        DECORSHAPE_1x1,\n        DECORCAT_POSTER,\n        1000,\n        DecorDesc_BLUE_POSTER,\n        DecorGfx_BLUE_POSTER\n    }, {\n        DECOR_CUTE_POSTER,\n        _(\"CUTE POSTER\"),\n        DECORPERM_NA_WALL,\n        DECORSHAPE_1x1,\n        DECORCAT_POSTER,\n        1000,\n        DecorDesc_CUTE_POSTER,\n        DecorGfx_CUTE_POSTER\n    }, {\n        DECOR_PIKA_POSTER,\n        _(\"PIKA POSTER\"),\n        DECORPERM_NA_WALL,\n        DECORSHAPE_2x1,\n        DECORCAT_POSTER,\n        1500,\n        DecorDesc_PIKA_POSTER,\n        DecorGfx_PIKA_POSTER\n    }, {\n        DECOR_LONG_POSTER,\n        _(\"LONG POSTER\"),\n        DECORPERM_NA_WALL,\n        DECORSHAPE_2x1,\n        DECORCAT_POSTER,\n        1500,\n        DecorDesc_LONG_POSTER,\n        DecorGfx_LONG_POSTER\n    }, {\n        DECOR_SEA_POSTER,\n        _(\"SEA POSTER\"),\n        DECORPERM_NA_WALL,\n        DECORSHAPE_2x1,\n        DECORCAT_POSTER,\n        1500,\n        DecorDesc_SEA_POSTER,\n        DecorGfx_SEA_POSTER\n    }, {\n        DECOR_SKY_POSTER,\n        _(\"SKY POSTER\"),\n        DECORPERM_NA_WALL,\n        DECORSHAPE_2x1,\n        DECORCAT_POSTER,\n        1500,\n        DecorDesc_SKY_POSTER,\n        DecorGfx_SKY_POSTER\n    }, {\n        DECOR_KISS_POSTER,\n        _(\"KISS POSTER\"),\n        DECORPERM_NA_WALL,\n        DECORSHAPE_2x1,\n        DECORCAT_POSTER,\n        1500,\n        DecorDesc_KISS_POSTER,\n        DecorGfx_KISS_POSTER\n    }, {\n        DECOR_PICHU_DOLL,\n        _(\"PICHU DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_PICHU_DOLL,\n        DecorGfx_PICHU_DOLL\n    }, {\n        DECOR_PIKACHU_DOLL,\n        _(\"PIKACHU DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_PIKACHU_DOLL,\n        DecorGfx_PIKACHU_DOLL\n    }, {\n        DECOR_MARILL_DOLL,\n        _(\"MARILL DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_MARILL_DOLL,\n        DecorGfx_MARILL_DOLL\n    }, {\n        DECOR_TOGEPI_DOLL,\n        _(\"TOGEPI DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_TOGEPI_DOLL,\n        DecorGfx_TOGEPI_DOLL\n    }, {\n        DECOR_CYNDAQUIL_DOLL,\n        _(\"CYNDAQUIL DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_CYNDAQUIL_DOLL,\n        DecorGfx_CYNDAQUIL_DOLL\n    }, {\n        DECOR_CHIKORITA_DOLL,\n        _(\"CHIKORITA DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_CHIKORITA_DOLL,\n        DecorGfx_CHIKORITA_DOLL\n    }, {\n        DECOR_TOTODILE_DOLL,\n        _(\"TOTODILE DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_TOTODILE_DOLL,\n        DecorGfx_TOTODILE_DOLL\n    }, {\n        DECOR_JIGGLYPUFF_DOLL,\n        _(\"JIGGLYPUFF DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_JIGGLYPUFF_DOLL,\n        DecorGfx_JIGGLYPUFF_DOLL\n    }, {\n        DECOR_MEOWTH_DOLL,\n        _(\"MEOWTH DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_MEOWTH_DOLL,\n        DecorGfx_MEOWTH_DOLL\n    }, {\n        DECOR_CLEFAIRY_DOLL,\n        _(\"CLEFAIRY DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_CLEFAIRY_DOLL,\n        DecorGfx_CLEFAIRY_DOLL\n    }, {\n        DECOR_DITTO_DOLL,\n        _(\"DITTO DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_DITTO_DOLL,\n        DecorGfx_DITTO_DOLL\n    }, {\n        DECOR_SMOOCHUM_DOLL,\n        _(\"SMOOCHUM DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_SMOOCHUM_DOLL,\n        DecorGfx_SMOOCHUM_DOLL\n    }, {\n        DECOR_TREECKO_DOLL,\n        _(\"TREECKO DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_TREECKO_DOLL,\n        DecorGfx_TREECKO_DOLL\n    }, {\n        DECOR_TORCHIC_DOLL,\n        _(\"TORCHIC DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_TORCHIC_DOLL,\n        DecorGfx_TORCHIC_DOLL\n    }, {\n        DECOR_MUDKIP_DOLL,\n        _(\"MUDKIP DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_MUDKIP_DOLL,\n        DecorGfx_MUDKIP_DOLL\n    }, {\n        DECOR_DUSKULL_DOLL,\n        _(\"DUSKULL DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_DUSKULL_DOLL,\n        DecorGfx_DUSKULL_DOLL\n    }, {\n        DECOR_WYNAUT_DOLL,\n        _(\"WYNAUT DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_WYNAUT_DOLL,\n        DecorGfx_WYNAUT_DOLL\n    }, {\n        DECOR_BALTOY_DOLL,\n        _(\"BALTOY DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_BALTOY_DOLL,\n        DecorGfx_BALTOY_DOLL\n    }, {\n        DECOR_KECLEON_DOLL,\n        _(\"KECLEON DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_KECLEON_DOLL,\n        DecorGfx_KECLEON_DOLL\n    }, {\n        DECOR_AZURILL_DOLL,\n        _(\"AZURILL DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_AZURILL_DOLL,\n        DecorGfx_AZURILL_DOLL\n    }, {\n        DECOR_SKITTY_DOLL,\n        _(\"SKITTY DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_SKITTY_DOLL,\n        DecorGfx_SKITTY_DOLL\n    }, {\n        DECOR_SWABLU_DOLL,\n        _(\"SWABLU DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_SWABLU_DOLL,\n        DecorGfx_SWABLU_DOLL\n    }, {\n        DECOR_GULPIN_DOLL,\n        _(\"GULPIN DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_GULPIN_DOLL,\n        DecorGfx_GULPIN_DOLL\n    }, {\n        DECOR_LOTAD_DOLL,\n        _(\"LOTAD DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_LOTAD_DOLL,\n        DecorGfx_LOTAD_DOLL\n    }, {\n        DECOR_SEEDOT_DOLL,\n        _(\"SEEDOT DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_DOLL,\n        3000,\n        DecorDesc_SEEDOT_DOLL,\n        DecorGfx_SEEDOT_DOLL\n    }, {\n        DECOR_PIKA_CUSHION,\n        _(\"PIKA CUSHION\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_CUSHION,\n        2000,\n        DecorDesc_PIKA_CUSHION,\n        DecorGfx_PIKA_CUSHION\n    }, {\n        DECOR_ROUND_CUSHION,\n        _(\"ROUND CUSHION\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_CUSHION,\n        2000,\n        DecorDesc_ROUND_CUSHION,\n        DecorGfx_ROUND_CUSHION\n    }, {\n        DECOR_KISS_CUSHION,\n        _(\"KISS CUSHION\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_CUSHION,\n        2000,\n        DecorDesc_KISS_CUSHION,\n        DecorGfx_KISS_CUSHION\n    }, {\n        DECOR_ZIGZAG_CUSHION,\n        _(\"ZIGZAG CUSHION\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_CUSHION,\n        2000,\n        DecorDesc_ZIGZAG_CUSHION,\n        DecorGfx_ZIGZAG_CUSHION\n    }, {\n        DECOR_SPIN_CUSHION,\n        _(\"SPIN CUSHION\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_CUSHION,\n        2000,\n        DecorDesc_SPIN_CUSHION,\n        DecorGfx_SPIN_CUSHION\n    }, {\n        DECOR_DIAMOND_CUSHION,\n        _(\"DIAMOND CUSHION\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_CUSHION,\n        2000,\n        DecorDesc_DIAMOND_CUSHION,\n        DecorGfx_DIAMOND_CUSHION\n    }, {\n        DECOR_BALL_CUSHION,\n        _(\"BALL CUSHION\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_CUSHION,\n        2000,\n        DecorDesc_BALL_CUSHION,\n        DecorGfx_BALL_CUSHION\n    }, {\n        DECOR_GRASS_CUSHION,\n        _(\"GRASS CUSHION\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_CUSHION,\n        2000,\n        DecorDesc_GRASS_CUSHION,\n        DecorGfx_GRASS_CUSHION\n    }, {\n        DECOR_FIRE_CUSHION,\n        _(\"FIRE CUSHION\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_CUSHION,\n        2000,\n        DecorDesc_FIRE_CUSHION,\n        DecorGfx_FIRE_CUSHION\n    }, {\n        DECOR_WATER_CUSHION,\n        _(\"WATER CUSHION\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x1,\n        DECORCAT_CUSHION,\n        2000,\n        DecorDesc_WATER_CUSHION,\n        DecorGfx_WATER_CUSHION\n    }, {\n        DECOR_SNORLAX_DOLL,\n        _(\"SNORLAX DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x2,\n        DECORCAT_DOLL,\n        10000,\n        DecorDesc_SNORLAX_DOLL,\n        DecorGfx_SNORLAX_DOLL\n    }, {\n        DECOR_RHYDON_DOLL,\n        _(\"RHYDON DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x2,\n        DECORCAT_DOLL,\n        10000,\n        DecorDesc_RHYDON_DOLL,\n        DecorGfx_RHYDON_DOLL\n    }, {\n        DECOR_LAPRAS_DOLL,\n        _(\"LAPRAS DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x2,\n        DECORCAT_DOLL,\n        10000,\n        DecorDesc_LAPRAS_DOLL,\n        DecorGfx_LAPRAS_DOLL\n    }, {\n        DECOR_VENUSAUR_DOLL,\n        _(\"VENUSAUR DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x2,\n        DECORCAT_DOLL,\n        10000,\n        DecorDesc_VENUSAUR_DOLL,\n        DecorGfx_VENUSAUR_DOLL\n    }, {\n        DECOR_CHARIZARD_DOLL,\n        _(\"CHARIZARD DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x2,\n        DECORCAT_DOLL,\n        10000,\n        DecorDesc_CHARIZARD_DOLL,\n        DecorGfx_CHARIZARD_DOLL\n    }, {\n        DECOR_BLASTOISE_DOLL,\n        _(\"BLASTOISE DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x2,\n        DECORCAT_DOLL,\n        10000,\n        DecorDesc_BLASTOISE_DOLL,\n        DecorGfx_BLASTOISE_DOLL\n    }, {\n        DECOR_WAILMER_DOLL,\n        _(\"WAILMER DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x2,\n        DECORCAT_DOLL,\n        10000,\n        DecorDesc_WAILMER_DOLL,\n        DecorGfx_WAILMER_DOLL\n    }, {\n        DECOR_REGIROCK_DOLL,\n        _(\"REGIROCK DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x2,\n        DECORCAT_DOLL,\n        10000,\n        DecorDesc_REGIROCK_DOLL,\n        DecorGfx_REGIROCK_DOLL\n    }, {\n        DECOR_REGICE_DOLL,\n        _(\"REGICE DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x2,\n        DECORCAT_DOLL,\n        10000,\n        DecorDesc_REGICE_DOLL,\n        DecorGfx_REGICE_DOLL\n    }, {\n        DECOR_REGISTEEL_DOLL,\n        _(\"REGISTEEL DOLL\"),\n        DECORPERM_SPRITE,\n        DECORSHAPE_1x2,\n        DECORCAT_DOLL,\n        10000,\n        DecorDesc_REGISTEEL_DOLL,\n        DecorGfx_REGISTEEL_DOLL}\n};\n"
  },
  {
    "path": "src/data/decoration/tiles.h",
    "content": "#include \"constants/event_objects.h\"\n\nconst u16 DecorGfx_SMALL_DESK[] = {\n    0x87\n};\n\nconst u16 DecorGfx_POKEMON_DESK[] = {\n    0x8F\n};\n\nconst u16 DecorGfx_HEAVY_DESK[] = {\n    0x90,\n    0x91,\n    0x92,\n    0x98,\n    0x99,\n    0x9A\n};\n\nconst u16 DecorGfx_RAGGED_DESK[] = {\n    0x93,\n    0x94,\n    0x95,\n    0x9B,\n    0x9C,\n    0x9D\n};\n\nconst u16 DecorGfx_COMFORT_DESK[] = {\n    0x96,\n    0x97,\n    0xA3,\n    0x9E,\n    0x9F,\n    0xAB\n};\n\nconst u16 DecorGfx_PRETTY_DESK[] = {\n    0xBD,\n    0xBE,\n    0xBF,\n    0xC5,\n    0xC6,\n    0xC7,\n    0xCD,\n    0xCE,\n    0xCF\n};\n\nconst u16 DecorGfx_BRICK_DESK[] = {\n    0xA0,\n    0xA1,\n    0xA2,\n    0xA8,\n    0xA9,\n    0xAA,\n    0xB0,\n    0xB1,\n    0xB2\n};\n\nconst u16 DecorGfx_CAMP_DESK[] = {\n    0xA4,\n    0xA5,\n    0xA6,\n    0xAC,\n    0xAD,\n    0xAE,\n    0xB4,\n    0xB5,\n    0xB6\n};\n\nconst u16 DecorGfx_HARD_DESK[] = {\n    0xA7,\n    0xBB,\n    0xBC,\n    0xAF,\n    0xC3,\n    0xC4,\n    0xB7,\n    0xCB,\n    0xCC\n};\n\nconst u16 DecorGfx_SMALL_CHAIR[] = {\n    0xB8\n};\n\nconst u16 DecorGfx_POKEMON_CHAIR[] = {\n    0xB9\n};\n\nconst u16 DecorGfx_HEAVY_CHAIR[] = {\n    0xBA\n};\n\nconst u16 DecorGfx_PRETTY_CHAIR[] = {\n    0xC0\n};\n\nconst u16 DecorGfx_COMFORT_CHAIR[] = {\n    0xC1\n};\n\nconst u16 DecorGfx_RAGGED_CHAIR[] = {\n    0xC2\n};\n\nconst u16 DecorGfx_BRICK_CHAIR[] = {\n    0xC8\n};\n\nconst u16 DecorGfx_CAMP_CHAIR[] = {\n    0xC9\n};\n\nconst u16 DecorGfx_HARD_CHAIR[] = {\n    0xCA\n};\n\nconst u16 DecorGfx_RED_PLANT[] = {\n    0xD0,\n    0xD8\n};\n\nconst u16 DecorGfx_TROPICAL_PLANT[] = {\n    0xD2,\n    0xDA\n};\n\nconst u16 DecorGfx_PRETTY_FLOWERS[] = {\n    0xD4,\n    0xDC\n};\n\nconst u16 DecorGfx_COLORFUL_PLANT[] = {\n    0xE0,\n    0xE2,\n    0xE8,\n    0xE9\n};\n\nconst u16 DecorGfx_BIG_PLANT[] = {\n    0xE4,\n    0xE6,\n    0xEC,\n    0xED\n};\n\nconst u16 DecorGfx_GORGEOUS_PLANT[] = {\n    0xF0,\n    0xF2,\n    0xF8,\n    0xF9\n};\n\nconst u16 DecorGfx_RED_BRICK[] = {\n    0x25,\n    0x2D\n};\n\nconst u16 DecorGfx_YELLOW_BRICK[] = {\n    0x26,\n    0x2E\n};\n\nconst u16 DecorGfx_BLUE_BRICK[] = {\n    0x27,\n    0x2F\n};\n\nconst u16 DecorGfx_RED_BALLOON[] = {\n    0x138\n};\n\nconst u16 DecorGfx_BLUE_BALLOON[] = {\n    0x13C\n};\n\nconst u16 DecorGfx_YELLOW_BALLOON[] = {\n    0x140\n};\n\nconst u16 DecorGfx_RED_TENT[] = {\n    0x30,\n    0x31,\n    0x32,\n    0x38,\n    0x39,\n    0x3A,\n    0x40,\n    0x41,\n    0x3B\n};\n\nconst u16 DecorGfx_BLUE_TENT[] = {\n    0x48,\n    0x49,\n    0x68,\n    0x50,\n    0x51,\n    0x70,\n    0x58,\n    0x59,\n    0x69\n};\n\nconst u16 DecorGfx_SOLID_BOARD[] = {\n    0x34,\n    0x3C\n};\n\nconst u16 DecorGfx_SLIDE[] = {\n    0x35,\n    0x36,\n    0x3D,\n    0x3E,\n    0x63,\n    0x64,\n    0x6F,\n    0x77\n};\n\nconst u16 DecorGfx_FENCE_LENGTH[] = {\n    0x33\n};\n\nconst u16 DecorGfx_FENCE_WIDTH[] = {\n    0x2C\n};\n\nconst u16 DecorGfx_TIRE[] = {\n    0x80,\n    0x81,\n    0x88,\n    0x89\n};\n\nconst u16 DecorGfx_STAND[] = {\n    0x6A,\n    0x6B,\n    0x6C,\n    0x6D,\n    0x72,\n    0x73,\n    0x74,\n    0x75\n};\n\nconst u16 DecorGfx_MUD_BALL[] = {\n    0x28\n};\n\nconst u16 DecorGfx_BREAKABLE_DOOR[] = {\n    0x37,\n    0x3F\n};\n\nconst u16 DecorGfx_SAND_ORNAMENT[] = {\n    0x85,\n    0x8D\n};\n\nconst u16 DecorGfx_SILVER_SHIELD[] = {\n    0xD6,\n    0xDE\n};\n\nconst u16 DecorGfx_GOLD_SHIELD[] = {\n    0x12E,\n    0x136\n};\n\nconst u16 DecorGfx_GLASS_ORNAMENT[] = {\n    0x82,\n    0x8A\n};\n\nconst u16 DecorGfx_TV[] = {\n    0xF4\n};\n\nconst u16 DecorGfx_ROUND_TV[] = {\n    0xF5\n};\n\nconst u16 DecorGfx_CUTE_TV[] = {\n    0xF6\n};\n\nconst u16 DecorGfx_GLITTER_MAT[] = {\n    0x60\n};\n\nconst u16 DecorGfx_JUMP_MAT[] = {\n    0x61\n};\n\nconst u16 DecorGfx_SPIN_MAT[] = {\n    0x62\n};\n\nconst u16 DecorGfx_C_LOW_NOTE_MAT[] = {\n    0x78\n};\n\nconst u16 DecorGfx_D_NOTE_MAT[] = {\n    0x79\n};\n\nconst u16 DecorGfx_E_NOTE_MAT[] = {\n    0x7A\n};\n\nconst u16 DecorGfx_F_NOTE_MAT[] = {\n    0x7B\n};\n\nconst u16 DecorGfx_G_NOTE_MAT[] = {\n    0x7C\n};\n\nconst u16 DecorGfx_A_NOTE_MAT[] = {\n    0x7D\n};\n\nconst u16 DecorGfx_B_NOTE_MAT[] = {\n    0x7E\n};\n\nconst u16 DecorGfx_C_HIGH_NOTE_MAT[] = {\n    0xB3\n};\n\nconst u16 DecorGfx_SURF_MAT[] = {\n    0x42,\n    0x43,\n    0x44,\n    0x4A,\n    0x4B,\n    0x4C,\n    0x52,\n    0x53,\n    0x54\n};\n\nconst u16 DecorGfx_THUNDER_MAT[] = {\n    0x45,\n    0x46,\n    0x47,\n    0x4D,\n    0x4E,\n    0x4F,\n    0x55,\n    0x56,\n    0x57\n};\n\nconst u16 DecorGfx_FIRE_BLAST_MAT[] = {\n    0x5A,\n    0x5B,\n    0x5C,\n    0x5D,\n    0x5E,\n    0x5F,\n    0x65,\n    0x66,\n    0x67\n};\n\nconst u16 DecorGfx_POWDER_SNOW_MAT[] = {\n    0x100,\n    0x101,\n    0x102,\n    0x108,\n    0x109,\n    0x10A,\n    0x110,\n    0x111,\n    0x112\n};\n\nconst u16 DecorGfx_ATTRACT_MAT[] = {\n    0x103,\n    0x104,\n    0x105,\n    0x10B,\n    0x10C,\n    0x10D,\n    0x113,\n    0x114,\n    0x115\n};\n\nconst u16 DecorGfx_FISSURE_MAT[] = {\n    0x106,\n    0x107,\n    0x118,\n    0x10E,\n    0x10F,\n    0x120,\n    0x116,\n    0x117,\n    0x128\n};\n\nconst u16 DecorGfx_SPIKES_MAT[] = {\n    0x119,\n    0x11A,\n    0x11B,\n    0x121,\n    0x122,\n    0x123,\n    0x129,\n    0x12A,\n    0x12B\n};\n\nconst u16 DecorGfx_BALL_POSTER[] = {\n    0x130\n};\n\nconst u16 DecorGfx_GREEN_POSTER[] = {\n    0x131\n};\n\nconst u16 DecorGfx_RED_POSTER[] = {\n    0x132\n};\n\nconst u16 DecorGfx_BLUE_POSTER[] = {\n    0x133\n};\n\nconst u16 DecorGfx_CUTE_POSTER[] = {\n    0x134\n};\n\nconst u16 DecorGfx_PIKA_POSTER[] = {\n    0x11C,\n    0x11D\n};\n\nconst u16 DecorGfx_LONG_POSTER[] = {\n    0x11E,\n    0x11F\n};\n\nconst u16 DecorGfx_SEA_POSTER[] = {\n    0x124,\n    0x125\n};\n\nconst u16 DecorGfx_SKY_POSTER[] = {\n    0x126,\n    0x127\n};\n\nconst u16 DecorGfx_KISS_POSTER[] = {\n    0x12C,\n    0x12D\n};\n\nconst u16 DecorGfx_PICHU_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_PIKACHU_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_MARILL_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_TOGEPI_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_CYNDAQUIL_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_CHIKORITA_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_TOTODILE_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_JIGGLYPUFF_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_MEOWTH_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_CLEFAIRY_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_DITTO_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_SMOOCHUM_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_TREECKO_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_TORCHIC_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_MUDKIP_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_DUSKULL_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_WYNAUT_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_BALTOY_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_KECLEON_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_AZURILL_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_SKITTY_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_SWABLU_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_GULPIN_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_LOTAD_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_SEEDOT_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_PIKA_CUSHION[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_ROUND_CUSHION[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_KISS_CUSHION[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_ZIGZAG_CUSHION[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_SPIN_CUSHION[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_DIAMOND_CUSHION[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_BALL_CUSHION[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_GRASS_CUSHION[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_FIRE_CUSHION[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_WATER_CUSHION[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_SNORLAX_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_RHYDON_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_LAPRAS_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_VENUSAUR_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_CHARIZARD_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_BLASTOISE_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_WAILMER_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_REGIROCK_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_REGICE_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n\nconst u16 DecorGfx_REGISTEEL_DOLL[] = {\n    OBJ_EVENT_GFX_ITEM_BALL\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_actions.h",
    "content": "\nstatic const u8 sEasyChatWord_Meets[] = _(\"MEETS\");\nstatic const u8 sEasyChatWord_Concede[] = _(\"CONCEDE\");\nstatic const u8 sEasyChatWord_Give[] = _(\"GIVE\");\nstatic const u8 sEasyChatWord_Gives[] = _(\"GIVES\");\nstatic const u8 sEasyChatWord_Played[] = _(\"PLAYED\");\nstatic const u8 sEasyChatWord_Plays[] = _(\"PLAYS\");\nstatic const u8 sEasyChatWord_Collect[] = _(\"COLLECT\");\nstatic const u8 sEasyChatWord_Walking[] = _(\"WALKING\");\nstatic const u8 sEasyChatWord_Walks[] = _(\"WALKS\");\nstatic const u8 sEasyChatWord_Says[] = _(\"SAYS\");\nstatic const u8 sEasyChatWord_Went[] = _(\"WENT\");\nstatic const u8 sEasyChatWord_Said[] = _(\"SAID\");\nstatic const u8 sEasyChatWord_WakeUp[] = _(\"WAKE UP\");\nstatic const u8 sEasyChatWord_WakesUp[] = _(\"WAKES UP\");\nstatic const u8 sEasyChatWord_Angers[] = _(\"ANGERS\");\nstatic const u8 sEasyChatWord_Teach[] = _(\"TEACH\");\nstatic const u8 sEasyChatWord_Teaches[] = _(\"TEACHES\");\nstatic const u8 sEasyChatWord_Please[] = _(\"PLEASE\");\nstatic const u8 sEasyChatWord_Learn[] = _(\"LEARN\");\nstatic const u8 sEasyChatWord_Change[] = _(\"CHANGE\");\nstatic const u8 sEasyChatWord_Story[] = _(\"STORY\");\nstatic const u8 sEasyChatWord_Trust[] = _(\"TRUST\");\nstatic const u8 sEasyChatWord_Lavish[] = _(\"LAVISH\");\nstatic const u8 sEasyChatWord_Listens[] = _(\"LISTENS\");\nstatic const u8 sEasyChatWord_Hearing[] = _(\"HEARING\");\nstatic const u8 sEasyChatWord_Trains[] = _(\"TRAINS\");\nstatic const u8 sEasyChatWord_Choose[] = _(\"CHOOSE\");\nstatic const u8 sEasyChatWord_Come[] = _(\"COME\");\nstatic const u8 sEasyChatWord_Came[] = _(\"CAME\");\nstatic const u8 sEasyChatWord_Search[] = _(\"SEARCH\");\nstatic const u8 sEasyChatWord_Make[] = _(\"MAKE\");\nstatic const u8 sEasyChatWord_Cause[] = _(\"CAUSE\");\nstatic const u8 sEasyChatWord_Know[] = _(\"KNOW\");\nstatic const u8 sEasyChatWord_Knows[] = _(\"KNOWS\");\nstatic const u8 sEasyChatWord_Refuse[] = _(\"REFUSE\");\nstatic const u8 sEasyChatWord_Stores[] = _(\"STORES\");\nstatic const u8 sEasyChatWord_Brag[] = _(\"BRAG\");\nstatic const u8 sEasyChatWord_Ignorant[] = _(\"IGNORANT\");\nstatic const u8 sEasyChatWord_Thinks[] = _(\"THINKS\");\nstatic const u8 sEasyChatWord_Believe[] = _(\"BELIEVE\");\nstatic const u8 sEasyChatWord_Slide[] = _(\"SLIDE\");\nstatic const u8 sEasyChatWord_Eats[] = _(\"EATS\");\nstatic const u8 sEasyChatWord_Use[] = _(\"USE\");\nstatic const u8 sEasyChatWord_Uses[] = _(\"USES\");\nstatic const u8 sEasyChatWord_Using[] = _(\"USING\");\nstatic const u8 sEasyChatWord_Couldnt[] = _(\"COULDN'T\");\nstatic const u8 sEasyChatWord_Capable[] = _(\"CAPABLE\");\nstatic const u8 sEasyChatWord_Disappear[] = _(\"DISAPPEAR\");\nstatic const u8 sEasyChatWord_Appear[] = _(\"APPEAR\");\nstatic const u8 sEasyChatWord_Throw[] = _(\"THROW\");\nstatic const u8 sEasyChatWord_Worry[] = _(\"WORRY\");\nstatic const u8 sEasyChatWord_Slept[] = _(\"SLEPT\");\nstatic const u8 sEasyChatWord_Sleep[] = _(\"SLEEP\");\nstatic const u8 sEasyChatWord_Release[] = _(\"RELEASE\");\nstatic const u8 sEasyChatWord_Drinks[] = _(\"DRINKS\");\nstatic const u8 sEasyChatWord_Runs[] = _(\"RUNS\");\nstatic const u8 sEasyChatWord_Run[] = _(\"RUN\");\nstatic const u8 sEasyChatWord_Works[] = _(\"WORKS\");\nstatic const u8 sEasyChatWord_Working[] = _(\"WORKING\");\nstatic const u8 sEasyChatWord_Talking[] = _(\"TALKING\");\nstatic const u8 sEasyChatWord_Talk[] = _(\"TALK\");\nstatic const u8 sEasyChatWord_Sink[] = _(\"SINK\");\nstatic const u8 sEasyChatWord_Smack[] = _(\"SMACK\");\nstatic const u8 sEasyChatWord_Pretend[] = _(\"PRETEND\");\nstatic const u8 sEasyChatWord_Praise[] = _(\"PRAISE\");\nstatic const u8 sEasyChatWord_Overdo[] = _(\"OVERDO\");\nstatic const u8 sEasyChatWord_Show[] = _(\"SHOW\");\nstatic const u8 sEasyChatWord_Looks[] = _(\"LOOKS\");\nstatic const u8 sEasyChatWord_Sees[] = _(\"SEES\");\nstatic const u8 sEasyChatWord_Seek[] = _(\"SEEK\");\nstatic const u8 sEasyChatWord_Own[] = _(\"OWN\");\nstatic const u8 sEasyChatWord_Take[] = _(\"TAKE\");\nstatic const u8 sEasyChatWord_Allow[] = _(\"ALLOW\");\nstatic const u8 sEasyChatWord_Forget[] = _(\"FORGET\");\nstatic const u8 sEasyChatWord_Forgets[] = _(\"FORGETS\");\nstatic const u8 sEasyChatWord_Appears[] = _(\"APPEARS\");\nstatic const u8 sEasyChatWord_Faint[] = _(\"FAINT\");\nstatic const u8 sEasyChatWord_Fainted[] = _(\"FAINTED\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Actions[] = {\n    {\n        .text = sEasyChatWord_Meets,\n        .alphabeticalOrder = 72,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Concede,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Give,\n        .alphabeticalOrder = 48,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Gives,\n        .alphabeticalOrder = 75,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Played,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Plays,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Collect,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Walking,\n        .alphabeticalOrder = 46,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Walks,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Says,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Went,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Said,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WakeUp,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WakesUp,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Angers,\n        .alphabeticalOrder = 45,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Teach,\n        .alphabeticalOrder = 47,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Teaches,\n        .alphabeticalOrder = 54,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Please,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Learn,\n        .alphabeticalOrder = 76,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Change,\n        .alphabeticalOrder = 77,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Story,\n        .alphabeticalOrder = 73,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Trust,\n        .alphabeticalOrder = 74,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lavish,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Listens,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hearing,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Trains,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Choose,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Come,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Came,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Search,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Make,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Cause,\n        .alphabeticalOrder = 67,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Know,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Knows,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Refuse,\n        .alphabeticalOrder = 65,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Stores,\n        .alphabeticalOrder = 70,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Brag,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ignorant,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Thinks,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Believe,\n        .alphabeticalOrder = 64,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Slide,\n        .alphabeticalOrder = 63,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Eats,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Use,\n        .alphabeticalOrder = 53,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Uses,\n        .alphabeticalOrder = 56,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Using,\n        .alphabeticalOrder = 55,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Couldnt,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Capable,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Disappear,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Appear,\n        .alphabeticalOrder = 69,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Throw,\n        .alphabeticalOrder = 68,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Worry,\n        .alphabeticalOrder = 66,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Slept,\n        .alphabeticalOrder = 61,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sleep,\n        .alphabeticalOrder = 52,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Release,\n        .alphabeticalOrder = 51,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Drinks,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Runs,\n        .alphabeticalOrder = 62,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Run,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Works,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Working,\n        .alphabeticalOrder = 71,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Talking,\n        .alphabeticalOrder = 60,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Talk,\n        .alphabeticalOrder = 59,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sink,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Smack,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Pretend,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Praise,\n        .alphabeticalOrder = 49,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Overdo,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Show,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Looks,\n        .alphabeticalOrder = 42,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sees,\n        .alphabeticalOrder = 43,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Seek,\n        .alphabeticalOrder = 44,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Own,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Take,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Allow,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Forget,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Forgets,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Appears,\n        .alphabeticalOrder = 58,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Faint,\n        .alphabeticalOrder = 57,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fainted,\n        .alphabeticalOrder = 50,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_adjectives.h",
    "content": "\nstatic const u8 sEasyChatWord_Wandering[] = _(\"WANDERING\");\nstatic const u8 sEasyChatWord_Rickety[] = _(\"RICKETY\");\nstatic const u8 sEasyChatWord_RockSolid[] = _(\"ROCK-SOLID\");\nstatic const u8 sEasyChatWord_Hungry[] = _(\"HUNGRY\");\nstatic const u8 sEasyChatWord_Tight[] = _(\"TIGHT\");\nstatic const u8 sEasyChatWord_Ticklish[] = _(\"TICKLISH\");\nstatic const u8 sEasyChatWord_Twirling[] = _(\"TWIRLING\");\nstatic const u8 sEasyChatWord_Spiraling[] = _(\"SPIRALING\");\nstatic const u8 sEasyChatWord_Thirsty[] = _(\"THIRSTY\");\nstatic const u8 sEasyChatWord_Lolling[] = _(\"LOLLING\");\nstatic const u8 sEasyChatWord_Silky[] = _(\"SILKY\");\nstatic const u8 sEasyChatWord_Sadly[] = _(\"SADLY\");\nstatic const u8 sEasyChatWord_Hopeless[] = _(\"HOPELESS\");\nstatic const u8 sEasyChatWord_Useless[] = _(\"USELESS\");\nstatic const u8 sEasyChatWord_Drooling[] = _(\"DROOLING\");\nstatic const u8 sEasyChatWord_Exciting[] = _(\"EXCITING\");\nstatic const u8 sEasyChatWord_Thick[] = _(\"THICK\");\nstatic const u8 sEasyChatWord_Smooth[] = _(\"SMOOTH\");\nstatic const u8 sEasyChatWord_Slimy[] = _(\"SLIMY\");\nstatic const u8 sEasyChatWord_Thin[] = _(\"THIN\");\nstatic const u8 sEasyChatWord_Break[] = _(\"BREAK\");\nstatic const u8 sEasyChatWord_Voracious[] = _(\"VORACIOUS\");\nstatic const u8 sEasyChatWord_Scatter[] = _(\"SCATTER\");\nstatic const u8 sEasyChatWord_Awesome[] = _(\"AWESOME\");\nstatic const u8 sEasyChatWord_Wimpy[] = _(\"WIMPY\");\nstatic const u8 sEasyChatWord_Wobbly[] = _(\"WOBBLY\");\nstatic const u8 sEasyChatWord_Shaky[] = _(\"SHAKY\");\nstatic const u8 sEasyChatWord_Ripped[] = _(\"RIPPED\");\nstatic const u8 sEasyChatWord_Shredded[] = _(\"SHREDDED\");\nstatic const u8 sEasyChatWord_Increasing[] = _(\"INCREASING\");\nstatic const u8 sEasyChatWord_Yet[] = _(\"YET\");\nstatic const u8 sEasyChatWord_Destroyed[] = _(\"DESTROYED\");\nstatic const u8 sEasyChatWord_Fiery[] = _(\"FIERY\");\nstatic const u8 sEasyChatWord_LoveyDovey[] = _(\"LOVEY-DOVEY\");\nstatic const u8 sEasyChatWord_Happily[] = _(\"HAPPILY\");\nstatic const u8 sEasyChatWord_Anticipation[] = _(\"ANTICIPATION\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Adjectives[] = {\n    {\n        .text = sEasyChatWord_Wandering,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Rickety,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_RockSolid,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hungry,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Tight,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ticklish,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Twirling,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Spiraling,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Thirsty,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lolling,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Silky,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sadly,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hopeless,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Useless,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Drooling,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Exciting,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Thick,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Smooth,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Slimy,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Thin,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Break,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Voracious,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Scatter,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Awesome,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wimpy,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wobbly,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Shaky,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ripped,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Shredded,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Increasing,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Yet,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Destroyed,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fiery,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_LoveyDovey,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Happily,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Anticipation,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_battle.h",
    "content": "\nstatic const u8 sEasyChatWord_MatchUp[] = _(\"MATCH UP\");\nstatic const u8 sEasyChatWord_Go[] = _(\"GO\");\nstatic const u8 sEasyChatWord_No1[] = _(\"NO. 1\");\nstatic const u8 sEasyChatWord_Decide[] = _(\"DECIDE\");\nstatic const u8 sEasyChatWord_LetMeWin[] = _(\"LET ME WIN\");\nstatic const u8 sEasyChatWord_Wins[] = _(\"WINS\");\nstatic const u8 sEasyChatWord_Win[] = _(\"WIN\");\nstatic const u8 sEasyChatWord_Won[] = _(\"WON\");\nstatic const u8 sEasyChatWord_IfIWin[] = _(\"IF I WIN\");\nstatic const u8 sEasyChatWord_WhenIWin[] = _(\"WHEN I WIN\");\nstatic const u8 sEasyChatWord_CantWin[] = _(\"CAN'T WIN\");\nstatic const u8 sEasyChatWord_CanWin[] = _(\"CAN WIN\");\nstatic const u8 sEasyChatWord_NoMatch[] = _(\"NO MATCH\");\nstatic const u8 sEasyChatWord_Spirit[] = _(\"SPIRIT\");\nstatic const u8 sEasyChatWord_Decided[] = _(\"DECIDED\");\nstatic const u8 sEasyChatWord_TrumpCard[] = _(\"TRUMP CARD\");\nstatic const u8 sEasyChatWord_TakeThat[] = _(\"TAKE THAT\");\nstatic const u8 sEasyChatWord_ComeOn[] = _(\"COME ON\");\nstatic const u8 sEasyChatWord_Attack[] = _(\"ATTACK\");\nstatic const u8 sEasyChatWord_Surrender[] = _(\"SURRENDER\");\nstatic const u8 sEasyChatWord_Gutsy[] = _(\"GUTSY\");\nstatic const u8 sEasyChatWord_Talent[] = _(\"TALENT\");\nstatic const u8 sEasyChatWord_Strategy[] = _(\"STRATEGY\");\nstatic const u8 sEasyChatWord_Smite[] = _(\"SMITE\");\nstatic const u8 sEasyChatWord_Match[] = _(\"MATCH\");\nstatic const u8 sEasyChatWord_Victory[] = _(\"VICTORY\");\nstatic const u8 sEasyChatWord_Offensive[] = _(\"OFFENSIVE\");\nstatic const u8 sEasyChatWord_Sense[] = _(\"SENSE\");\nstatic const u8 sEasyChatWord_Versus[] = _(\"VERSUS\");\nstatic const u8 sEasyChatWord_Fights[] = _(\"FIGHTS\");\nstatic const u8 sEasyChatWord_Power[] = _(\"POWER\");\nstatic const u8 sEasyChatWord_Challenge[] = _(\"CHALLENGE\");\nstatic const u8 sEasyChatWord_Strong[] = _(\"STRONG\");\nstatic const u8 sEasyChatWord_TooStrong[] = _(\"TOO STRONG\");\nstatic const u8 sEasyChatWord_GoEasy[] = _(\"GO EASY\");\nstatic const u8 sEasyChatWord_Foe[] = _(\"FOE\");\nstatic const u8 sEasyChatWord_Genius[] = _(\"GENIUS\");\nstatic const u8 sEasyChatWord_Legend[] = _(\"LEGEND\");\nstatic const u8 sEasyChatWord_Escape[] = _(\"ESCAPE\");\nstatic const u8 sEasyChatWord_Aim[] = _(\"AIM\");\nstatic const u8 sEasyChatWord_Battle[] = _(\"BATTLE\");\nstatic const u8 sEasyChatWord_Fight[] = _(\"FIGHT\");\nstatic const u8 sEasyChatWord_Resuscitate[] = _(\"RESUSCITATE\");\nstatic const u8 sEasyChatWord_Points[] = _(\"POINTS\");\nstatic const u8 sEasyChatWord_Serious[] = _(\"SERIOUS\");\nstatic const u8 sEasyChatWord_GiveUp[] = _(\"GIVE UP\");\nstatic const u8 sEasyChatWord_Loss[] = _(\"LOSS\");\nstatic const u8 sEasyChatWord_IfILose[] = _(\"IF I LOSE\");\nstatic const u8 sEasyChatWord_Lost[] = _(\"LOST\");\nstatic const u8 sEasyChatWord_Lose[] = _(\"LOSE\");\nstatic const u8 sEasyChatWord_Guard[] = _(\"GUARD\");\nstatic const u8 sEasyChatWord_Partner[] = _(\"PARTNER\");\nstatic const u8 sEasyChatWord_Reject[] = _(\"REJECT\");\nstatic const u8 sEasyChatWord_Accept[] = _(\"ACCEPT\");\nstatic const u8 sEasyChatWord_Invincible[] = _(\"INVINCIBLE\");\nstatic const u8 sEasyChatWord_Received[] = _(\"RECEIVED\");\nstatic const u8 sEasyChatWord_Easy[] = _(\"EASY\");\nstatic const u8 sEasyChatWord_Weak[] = _(\"WEAK\");\nstatic const u8 sEasyChatWord_TooWeak[] = _(\"TOO WEAK\");\nstatic const u8 sEasyChatWord_Pushover[] = _(\"PUSHOVER\");\nstatic const u8 sEasyChatWord_Leader[] = _(\"LEADER\");\nstatic const u8 sEasyChatWord_Rule[] = _(\"RULE\");\nstatic const u8 sEasyChatWord_Move[] = _(\"MOVE\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Battle[] = {\n    {\n        .text = sEasyChatWord_MatchUp,\n        .alphabeticalOrder = 53,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Go,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_No1,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Decide,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_LetMeWin,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wins,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Win,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Won,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_IfIWin,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WhenIWin,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_CantWin,\n        .alphabeticalOrder = 56,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_CanWin,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_NoMatch,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Spirit,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Decided,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_TrumpCard,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_TakeThat,\n        .alphabeticalOrder = 45,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ComeOn,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Attack,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Surrender,\n        .alphabeticalOrder = 50,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Gutsy,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Talent,\n        .alphabeticalOrder = 47,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Strategy,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Smite,\n        .alphabeticalOrder = 54,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Match,\n        .alphabeticalOrder = 60,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Victory,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Offensive,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sense,\n        .alphabeticalOrder = 49,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Versus,\n        .alphabeticalOrder = 46,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fights,\n        .alphabeticalOrder = 48,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Power,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Challenge,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Strong,\n        .alphabeticalOrder = 62,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_TooStrong,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_GoEasy,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Foe,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Genius,\n        .alphabeticalOrder = 51,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Legend,\n        .alphabeticalOrder = 43,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Escape,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Aim,\n        .alphabeticalOrder = 59,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Battle,\n        .alphabeticalOrder = 55,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fight,\n        .alphabeticalOrder = 52,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Resuscitate,\n        .alphabeticalOrder = 42,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Points,\n        .alphabeticalOrder = 61,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Serious,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_GiveUp,\n        .alphabeticalOrder = 44,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Loss,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_IfILose,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lost,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lose,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Guard,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Partner,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Reject,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Accept,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Invincible,\n        .alphabeticalOrder = 58,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Received,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Easy,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Weak,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_TooWeak,\n        .alphabeticalOrder = 57,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Pushover,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Leader,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Rule,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Move,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_conditions.h",
    "content": "\nstatic const u8 sEasyChatWord_Hot[] = _(\"HOT\");\nstatic const u8 sEasyChatWord_Exists[] = _(\"EXISTS\");\nstatic const u8 sEasyChatWord_Excess[] = _(\"EXCESS\");\nstatic const u8 sEasyChatWord_Approved[] = _(\"APPROVED\");\nstatic const u8 sEasyChatWord_Has[] = _(\"HAS\");\nstatic const u8 sEasyChatWord_Good[] = _(\"GOOD\");\nstatic const u8 sEasyChatWord_Less[] = _(\"LESS\");\nstatic const u8 sEasyChatWord_Momentum[] = _(\"MOMENTUM\");\nstatic const u8 sEasyChatWord_Going[] = _(\"GOING\");\nstatic const u8 sEasyChatWord_Weird[] = _(\"WEIRD\");\nstatic const u8 sEasyChatWord_Busy[] = _(\"BUSY\");\nstatic const u8 sEasyChatWord_Together[] = _(\"TOGETHER\");\nstatic const u8 sEasyChatWord_Full[] = _(\"FULL\");\nstatic const u8 sEasyChatWord_Absent[] = _(\"ABSENT\");\nstatic const u8 sEasyChatWord_Being[] = _(\"BEING\");\nstatic const u8 sEasyChatWord_Need[] = _(\"NEED\");\nstatic const u8 sEasyChatWord_Tasty[] = _(\"TASTY\");\nstatic const u8 sEasyChatWord_Skilled[] = _(\"SKILLED\");\nstatic const u8 sEasyChatWord_Noisy[] = _(\"NOISY\");\nstatic const u8 sEasyChatWord_Big[] = _(\"BIG\");\nstatic const u8 sEasyChatWord_Late[] = _(\"LATE\");\nstatic const u8 sEasyChatWord_Close[] = _(\"CLOSE\");\nstatic const u8 sEasyChatWord_Docile[] = _(\"DOCILE\");\nstatic const u8 sEasyChatWord_Amusing[] = _(\"AMUSING\");\nstatic const u8 sEasyChatWord_Entertaining[] = _(\"ENTERTAINING\");\nstatic const u8 sEasyChatWord_Perfection[] = _(\"PERFECTION\");\nstatic const u8 sEasyChatWord_Pretty[] = _(\"PRETTY\");\nstatic const u8 sEasyChatWord_Healthy[] = _(\"HEALTHY\");\nstatic const u8 sEasyChatWord_Excellent[] = _(\"EXCELLENT\");\nstatic const u8 sEasyChatWord_UpsideDown[] = _(\"UPSIDE DOWN\");\nstatic const u8 sEasyChatWord_Cold[] = _(\"COLD\");\nstatic const u8 sEasyChatWord_Refreshing[] = _(\"REFRESHING\");\nstatic const u8 sEasyChatWord_Unavoidable[] = _(\"UNAVOIDABLE\");\nstatic const u8 sEasyChatWord_Much[] = _(\"MUCH\");\nstatic const u8 sEasyChatWord_Overwhelming[] = _(\"OVERWHELMING\");\nstatic const u8 sEasyChatWord_Fabulous[] = _(\"FABULOUS\");\nstatic const u8 sEasyChatWord_Else[] = _(\"ELSE\");\nstatic const u8 sEasyChatWord_Expensive[] = _(\"EXPENSIVE\");\nstatic const u8 sEasyChatWord_Correct[] = _(\"CORRECT\");\nstatic const u8 sEasyChatWord_Impossible[] = _(\"IMPOSSIBLE\");\nstatic const u8 sEasyChatWord_Small[] = _(\"SMALL\");\nstatic const u8 sEasyChatWord_Different[] = _(\"DIFFERENT\");\nstatic const u8 sEasyChatWord_Tired[] = _(\"TIRED\");\nstatic const u8 sEasyChatWord_Skill[] = _(\"SKILL\");\nstatic const u8 sEasyChatWord_Top[] = _(\"TOP\");\nstatic const u8 sEasyChatWord_NonStop[] = _(\"NON-STOP\");\nstatic const u8 sEasyChatWord_Preposterous[] = _(\"PREPOSTEROUS\");\nstatic const u8 sEasyChatWord_None[] = _(\"NONE\");\nstatic const u8 sEasyChatWord_Nothing[] = _(\"NOTHING\");\nstatic const u8 sEasyChatWord_Natural[] = _(\"NATURAL\");\nstatic const u8 sEasyChatWord_Becomes[] = _(\"BECOMES\");\nstatic const u8 sEasyChatWord_Lukewarm[] = _(\"LUKEWARM\");\nstatic const u8 sEasyChatWord_Fast[] = _(\"FAST\");\nstatic const u8 sEasyChatWord_Low[] = _(\"LOW\");\nstatic const u8 sEasyChatWord_Awful[] = _(\"AWFUL\");\nstatic const u8 sEasyChatWord_Alone[] = _(\"ALONE\");\nstatic const u8 sEasyChatWord_Bored[] = _(\"BORED\");\nstatic const u8 sEasyChatWord_Secret[] = _(\"SECRET\");\nstatic const u8 sEasyChatWord_Mystery[] = _(\"MYSTERY\");\nstatic const u8 sEasyChatWord_Lacks[] = _(\"LACKS\");\nstatic const u8 sEasyChatWord_Best[] = _(\"BEST\");\nstatic const u8 sEasyChatWord_Lousy[] = _(\"LOUSY\");\nstatic const u8 sEasyChatWord_Mistake[] = _(\"MISTAKE\");\nstatic const u8 sEasyChatWord_Kind[] = _(\"KIND\");\nstatic const u8 sEasyChatWord_Well[] = _(\"WELL\");\nstatic const u8 sEasyChatWord_Weakened[] = _(\"WEAKENED\");\nstatic const u8 sEasyChatWord_Simple[] = _(\"SIMPLE\");\nstatic const u8 sEasyChatWord_Seems[] = _(\"SEEMS\");\nstatic const u8 sEasyChatWord_Badly[] = _(\"BADLY\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Conditions[] = {\n    {\n        .text = sEasyChatWord_Hot,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Exists,\n        .alphabeticalOrder = 55,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Excess,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Approved,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Has,\n        .alphabeticalOrder = 54,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Good,\n        .alphabeticalOrder = 68,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Less,\n        .alphabeticalOrder = 50,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Momentum,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Going,\n        .alphabeticalOrder = 60,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Weird,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Busy,\n        .alphabeticalOrder = 56,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Together,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Full,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Absent,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Being,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Need,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Tasty,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Skilled,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Noisy,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Big,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Late,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Close,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Docile,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Amusing,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Entertaining,\n        .alphabeticalOrder = 52,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Perfection,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Pretty,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Healthy,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Excellent,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_UpsideDown,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Cold,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Refreshing,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Unavoidable,\n        .alphabeticalOrder = 63,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Much,\n        .alphabeticalOrder = 59,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Overwhelming,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fabulous,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Else,\n        .alphabeticalOrder = 61,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Expensive,\n        .alphabeticalOrder = 53,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Correct,\n        .alphabeticalOrder = 51,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Impossible,\n        .alphabeticalOrder = 62,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Small,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Different,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Tired,\n        .alphabeticalOrder = 58,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Skill,\n        .alphabeticalOrder = 49,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Top,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_NonStop,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Preposterous,\n        .alphabeticalOrder = 45,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_None,\n        .alphabeticalOrder = 47,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Nothing,\n        .alphabeticalOrder = 48,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Natural,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Becomes,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lukewarm,\n        .alphabeticalOrder = 46,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fast,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Low,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Awful,\n        .alphabeticalOrder = 57,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Alone,\n        .alphabeticalOrder = 67,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Bored,\n        .alphabeticalOrder = 66,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Secret,\n        .alphabeticalOrder = 43,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Mystery,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lacks,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Best,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lousy,\n        .alphabeticalOrder = 42,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Mistake,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Kind,\n        .alphabeticalOrder = 44,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Well,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Weakened,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Simple,\n        .alphabeticalOrder = 65,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Seems,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Badly,\n        .alphabeticalOrder = 64,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_endings.h",
    "content": "\nstatic const u8 sEasyChatWord_Will[] = _(\"WILL\");\nstatic const u8 sEasyChatWord_WillBeHere[] = _(\"WILL BE HERE\");\nstatic const u8 sEasyChatWord_Or[] = _(\"OR\");\nstatic const u8 sEasyChatWord_Times[] = _(\"TIMES\");\nstatic const u8 sEasyChatWord_Wonder[] = _(\"WONDER\");\nstatic const u8 sEasyChatWord_IsItQues[] = _(\"IS IT?\");\nstatic const u8 sEasyChatWord_Be[] = _(\"BE\");\nstatic const u8 sEasyChatWord_Gimme[] = _(\"GIMME\");\nstatic const u8 sEasyChatWord_Could[] = _(\"COULD\");\nstatic const u8 sEasyChatWord_LikelyTo[] = _(\"LIKELY TO\");\nstatic const u8 sEasyChatWord_Would[] = _(\"WOULD\");\nstatic const u8 sEasyChatWord_Is[] = _(\"IS\");\nstatic const u8 sEasyChatWord_IsntItQues[] = _(\"ISN'T IT?\");\nstatic const u8 sEasyChatWord_Lets[] = _(\"LET'S\");\nstatic const u8 sEasyChatWord_Other[] = _(\"OTHER\");\nstatic const u8 sEasyChatWord_Are[] = _(\"ARE\");\nstatic const u8 sEasyChatWord_Was[] = _(\"WAS\");\nstatic const u8 sEasyChatWord_Were[] = _(\"WERE\");\nstatic const u8 sEasyChatWord_Those[] = _(\"THOSE\");\nstatic const u8 sEasyChatWord_Isnt[] = _(\"ISN'T\");\nstatic const u8 sEasyChatWord_Wont[] = _(\"WON'T\");\nstatic const u8 sEasyChatWord_Cant[] = _(\"CAN'T\");\nstatic const u8 sEasyChatWord_Can[] = _(\"CAN\");\nstatic const u8 sEasyChatWord_Dont[] = _(\"DON'T\");\nstatic const u8 sEasyChatWord_Do[] = _(\"DO\");\nstatic const u8 sEasyChatWord_Does[] = _(\"DOES\");\nstatic const u8 sEasyChatWord_Whom[] = _(\"WHOM\");\nstatic const u8 sEasyChatWord_Which[] = _(\"WHICH\");\nstatic const u8 sEasyChatWord_Wasnt[] = _(\"WASN'T\");\nstatic const u8 sEasyChatWord_Werent[] = _(\"WEREN'T\");\nstatic const u8 sEasyChatWord_Have[] = _(\"HAVE\");\nstatic const u8 sEasyChatWord_Havent[] = _(\"HAVEN'T\");\nstatic const u8 sEasyChatWord_A[] = _(\"A\");\nstatic const u8 sEasyChatWord_An[] = _(\"AN\");\nstatic const u8 sEasyChatWord_Not[] = _(\"NOT\");\nstatic const u8 sEasyChatWord_There[] = _(\"THERE\");\nstatic const u8 sEasyChatWord_OkQues[] = _(\"OK?\");\nstatic const u8 sEasyChatWord_So[] = _(\"SO\");\nstatic const u8 sEasyChatWord_Maybe[] = _(\"MAYBE\");\nstatic const u8 sEasyChatWord_About[] = _(\"ABOUT\");\nstatic const u8 sEasyChatWord_Over[] = _(\"OVER\");\nstatic const u8 sEasyChatWord_It[] = _(\"IT\");\nstatic const u8 sEasyChatWord_All[] = _(\"ALL\");\nstatic const u8 sEasyChatWord_For[] = _(\"FOR\");\nstatic const u8 sEasyChatWord_On[] = _(\"ON\");\nstatic const u8 sEasyChatWord_Off[] = _(\"OFF\");\nstatic const u8 sEasyChatWord_As[] = _(\"AS\");\nstatic const u8 sEasyChatWord_To[] = _(\"TO\");\nstatic const u8 sEasyChatWord_With[] = _(\"WITH\");\nstatic const u8 sEasyChatWord_Better[] = _(\"BETTER\");\nstatic const u8 sEasyChatWord_Ever[] = _(\"EVER\");\nstatic const u8 sEasyChatWord_Since[] = _(\"SINCE\");\nstatic const u8 sEasyChatWord_Of[] = _(\"OF\");\nstatic const u8 sEasyChatWord_BelongsTo[] = _(\"BELONGS TO\");\nstatic const u8 sEasyChatWord_At[] = _(\"AT\");\nstatic const u8 sEasyChatWord_In[] = _(\"IN\");\nstatic const u8 sEasyChatWord_Out[] = _(\"OUT\");\nstatic const u8 sEasyChatWord_Too[] = _(\"TOO\");\nstatic const u8 sEasyChatWord_Like[] = _(\"LIKE\");\nstatic const u8 sEasyChatWord_Did[] = _(\"DID\");\nstatic const u8 sEasyChatWord_Didnt[] = _(\"DIDN'T\");\nstatic const u8 sEasyChatWord_Doesnt[] = _(\"DOESN'T\");\nstatic const u8 sEasyChatWord_Without[] = _(\"WITHOUT\");\nstatic const u8 sEasyChatWord_After[] = _(\"AFTER\");\nstatic const u8 sEasyChatWord_Before[] = _(\"BEFORE\");\nstatic const u8 sEasyChatWord_While[] = _(\"WHILE\");\nstatic const u8 sEasyChatWord_Than[] = _(\"THAN\");\nstatic const u8 sEasyChatWord_Once[] = _(\"ONCE\");\nstatic const u8 sEasyChatWord_Anywhere[] = _(\"ANYWHERE\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Endings[] = {\n    {\n        .text = sEasyChatWord_Will,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WillBeHere,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Or,\n        .alphabeticalOrder = 63,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Times,\n        .alphabeticalOrder = 42,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wonder,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_IsItQues,\n        .alphabeticalOrder = 68,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Be,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Gimme,\n        .alphabeticalOrder = 46,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Could,\n        .alphabeticalOrder = 54,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_LikelyTo,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Would,\n        .alphabeticalOrder = 64,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Is,\n        .alphabeticalOrder = 53,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_IsntItQues,\n        .alphabeticalOrder = 49,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lets,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Other,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Are,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Was,\n        .alphabeticalOrder = 59,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Were,\n        .alphabeticalOrder = 60,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Those,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Isnt,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wont,\n        .alphabeticalOrder = 61,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Cant,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Can,\n        .alphabeticalOrder = 50,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Dont,\n        .alphabeticalOrder = 43,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Do,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Does,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Whom,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Which,\n        .alphabeticalOrder = 55,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wasnt,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Werent,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Have,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Havent,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_A,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_An,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Not,\n        .alphabeticalOrder = 58,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_There,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_OkQues,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_So,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Maybe,\n        .alphabeticalOrder = 52,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_About,\n        .alphabeticalOrder = 45,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Over,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_It,\n        .alphabeticalOrder = 44,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_All,\n        .alphabeticalOrder = 67,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_For,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_On,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Off,\n        .alphabeticalOrder = 56,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_As,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_To,\n        .alphabeticalOrder = 51,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_With,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Better,\n        .alphabeticalOrder = 66,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ever,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Since,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Of,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_BelongsTo,\n        .alphabeticalOrder = 47,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_At,\n        .alphabeticalOrder = 57,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_In,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Out,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Too,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Like,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Did,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Didnt,\n        .alphabeticalOrder = 65,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Doesnt,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Without,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_After,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Before,\n        .alphabeticalOrder = 48,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_While,\n        .alphabeticalOrder = 62,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Than,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Once,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Anywhere,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_events.h",
    "content": "\nstatic const u8 sEasyChatWord_Appeal[] = _(\"APPEAL\");\nstatic const u8 sEasyChatWord_Events[] = _(\"EVENTS\");\nstatic const u8 sEasyChatWord_StayAtHome[] = _(\"STAY-AT-HOME\");\nstatic const u8 sEasyChatWord_Berry[] = _(\"BERRY\");\nstatic const u8 sEasyChatWord_Contest[] = _(\"CONTEST\");\nstatic const u8 sEasyChatWord_Mc[] = _(\"MC\");\nstatic const u8 sEasyChatWord_Judge[] = _(\"JUDGE\");\nstatic const u8 sEasyChatWord_Super[] = _(\"SUPER\");\nstatic const u8 sEasyChatWord_Stage[] = _(\"STAGE\");\nstatic const u8 sEasyChatWord_HallOfFame[] = _(\"HALL OF FAME\");\nstatic const u8 sEasyChatWord_Evolution[] = _(\"EVOLUTION\");\nstatic const u8 sEasyChatWord_Hyper[] = _(\"HYPER\");\nstatic const u8 sEasyChatWord_BattleTower[] = _(\"BATTLE TOWER\");\nstatic const u8 sEasyChatWord_Leaders[] = _(\"LEADERS\");\nstatic const u8 sEasyChatWord_BattleRoom[] = _(\"BATTLE ROOM\");\nstatic const u8 sEasyChatWord_Hidden[] = _(\"HIDDEN\");\nstatic const u8 sEasyChatWord_SecretBase[] = _(\"SECRET BASE\");\nstatic const u8 sEasyChatWord_Blend[] = _(\"BLEND\");\nstatic const u8 sEasyChatWord_POKEBLOCK[] = _(\"{POKEBLOCK}\");\nstatic const u8 sEasyChatWord_Master[] = _(\"MASTER\");\nstatic const u8 sEasyChatWord_Rank[] = _(\"RANK\");\nstatic const u8 sEasyChatWord_Ribbon[] = _(\"RIBBON\");\nstatic const u8 sEasyChatWord_Crush[] = _(\"CRUSH\");\nstatic const u8 sEasyChatWord_Direct[] = _(\"DIRECT\");\nstatic const u8 sEasyChatWord_Tower[] = _(\"TOWER\");\nstatic const u8 sEasyChatWord_Union[] = _(\"UNION\");\nstatic const u8 sEasyChatWord_Room[] = _(\"ROOM\");\nstatic const u8 sEasyChatWord_Wireless[] = _(\"WIRELESS\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Events[] = {\n    {\n        .text = sEasyChatWord_Appeal,\n        .alphabeticalOrder = 0,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Events,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_StayAtHome,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Berry,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Contest,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Mc,\n        .alphabeticalOrder = 4,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Judge,\n        .alphabeticalOrder = 22,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Super,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Stage,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_HallOfFame,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Evolution,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hyper,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_BattleTower,\n        .alphabeticalOrder = 11,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Leaders,\n        .alphabeticalOrder = 6,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_BattleRoom,\n        .alphabeticalOrder = 13,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Hidden,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_SecretBase,\n        .alphabeticalOrder = 5,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Blend,\n        .alphabeticalOrder = 18,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_POKEBLOCK,\n        .alphabeticalOrder = 20,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Master,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Rank,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ribbon,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Crush,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Direct,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Tower,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Union,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Room,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wireless,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_feelings.h",
    "content": "\nstatic const u8 sEasyChatWord_Meet[] = _(\"MEET\");\nstatic const u8 sEasyChatWord_Play[] = _(\"PLAY\");\nstatic const u8 sEasyChatWord_Hurried[] = _(\"HURRIED\");\nstatic const u8 sEasyChatWord_Goes[] = _(\"GOES\");\nstatic const u8 sEasyChatWord_Giddy[] = _(\"GIDDY\");\nstatic const u8 sEasyChatWord_Happy[] = _(\"HAPPY\");\nstatic const u8 sEasyChatWord_Happiness[] = _(\"HAPPINESS\");\nstatic const u8 sEasyChatWord_Excite[] = _(\"EXCITE\");\nstatic const u8 sEasyChatWord_Important[] = _(\"IMPORTANT\");\nstatic const u8 sEasyChatWord_Funny[] = _(\"FUNNY\");\nstatic const u8 sEasyChatWord_Got[] = _(\"GOT\");\nstatic const u8 sEasyChatWord_GoHome[] = _(\"GO HOME\");\nstatic const u8 sEasyChatWord_Disappointed[] = _(\"DISAPPOINTED\");\nstatic const u8 sEasyChatWord_Disappoints[] = _(\"DISAPPOINTS\");\nstatic const u8 sEasyChatWord_Sad[] = _(\"SAD\");\nstatic const u8 sEasyChatWord_Try[] = _(\"TRY\");\nstatic const u8 sEasyChatWord_Tries[] = _(\"TRIES\");\nstatic const u8 sEasyChatWord_Hears[] = _(\"HEARS\");\nstatic const u8 sEasyChatWord_Think[] = _(\"THINK\");\nstatic const u8 sEasyChatWord_Hear[] = _(\"HEAR\");\nstatic const u8 sEasyChatWord_Wants[] = _(\"WANTS\");\nstatic const u8 sEasyChatWord_Misheard[] = _(\"MISHEARD\");\nstatic const u8 sEasyChatWord_Dislike[] = _(\"DISLIKE\");\nstatic const u8 sEasyChatWord_Angry[] = _(\"ANGRY\");\nstatic const u8 sEasyChatWord_Anger[] = _(\"ANGER\");\nstatic const u8 sEasyChatWord_Scary[] = _(\"SCARY\");\nstatic const u8 sEasyChatWord_Lonesome[] = _(\"LONESOME\");\nstatic const u8 sEasyChatWord_Disappoint[] = _(\"DISAPPOINT\");\nstatic const u8 sEasyChatWord_Joy[] = _(\"JOY\");\nstatic const u8 sEasyChatWord_Gets[] = _(\"GETS\");\nstatic const u8 sEasyChatWord_Never[] = _(\"NEVER\");\nstatic const u8 sEasyChatWord_Darn[] = _(\"DARN\");\nstatic const u8 sEasyChatWord_Downcast[] = _(\"DOWNCAST\");\nstatic const u8 sEasyChatWord_Incredible[] = _(\"INCREDIBLE\");\nstatic const u8 sEasyChatWord_Likes[] = _(\"LIKES\");\nstatic const u8 sEasyChatWord_Dislikes[] = _(\"DISLIKES\");\nstatic const u8 sEasyChatWord_Boring[] = _(\"BORING\");\nstatic const u8 sEasyChatWord_Care[] = _(\"CARE\");\nstatic const u8 sEasyChatWord_Cares[] = _(\"CARES\");\nstatic const u8 sEasyChatWord_AllRight[] = _(\"ALL RIGHT\");\nstatic const u8 sEasyChatWord_Adore[] = _(\"ADORE\");\nstatic const u8 sEasyChatWord_Disaster[] = _(\"DISASTER\");\nstatic const u8 sEasyChatWord_Enjoy[] = _(\"ENJOY\");\nstatic const u8 sEasyChatWord_Enjoys[] = _(\"ENJOYS\");\nstatic const u8 sEasyChatWord_Eat[] = _(\"EAT\");\nstatic const u8 sEasyChatWord_Lacking[] = _(\"LACKING\");\nstatic const u8 sEasyChatWord_Bad[] = _(\"BAD\");\nstatic const u8 sEasyChatWord_Hard[] = _(\"HARD\");\nstatic const u8 sEasyChatWord_Terrible[] = _(\"TERRIBLE\");\nstatic const u8 sEasyChatWord_Should[] = _(\"SHOULD\");\nstatic const u8 sEasyChatWord_Nice[] = _(\"NICE\");\nstatic const u8 sEasyChatWord_Drink[] = _(\"DRINK\");\nstatic const u8 sEasyChatWord_Surprise[] = _(\"SURPRISE\");\nstatic const u8 sEasyChatWord_Fear[] = _(\"FEAR\");\nstatic const u8 sEasyChatWord_Want[] = _(\"WANT\");\nstatic const u8 sEasyChatWord_Wait[] = _(\"WAIT\");\nstatic const u8 sEasyChatWord_Satisfied[] = _(\"SATISFIED\");\nstatic const u8 sEasyChatWord_See[] = _(\"SEE\");\nstatic const u8 sEasyChatWord_Rare[] = _(\"RARE\");\nstatic const u8 sEasyChatWord_Negative[] = _(\"NEGATIVE\");\nstatic const u8 sEasyChatWord_Done[] = _(\"DONE\");\nstatic const u8 sEasyChatWord_Danger[] = _(\"DANGER\");\nstatic const u8 sEasyChatWord_Defeated[] = _(\"DEFEATED\");\nstatic const u8 sEasyChatWord_Beat[] = _(\"BEAT\");\nstatic const u8 sEasyChatWord_Great[] = _(\"GREAT\");\nstatic const u8 sEasyChatWord_Romantic[] = _(\"ROMANTIC\");\nstatic const u8 sEasyChatWord_Question[] = _(\"QUESTION\");\nstatic const u8 sEasyChatWord_Understand[] = _(\"UNDERSTAND\");\nstatic const u8 sEasyChatWord_Understands[] = _(\"UNDERSTANDS\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Feelings[] = {\n    {\n        .text = sEasyChatWord_Meet,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Play,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hurried,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Goes,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Giddy,\n        .alphabeticalOrder = 46,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Happy,\n        .alphabeticalOrder = 63,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Happiness,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Excite,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Important,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Funny,\n        .alphabeticalOrder = 61,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Got,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_GoHome,\n        .alphabeticalOrder = 62,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Disappointed,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Disappoints,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sad,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Try,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Tries,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hears,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Think,\n        .alphabeticalOrder = 60,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hear,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wants,\n        .alphabeticalOrder = 51,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Misheard,\n        .alphabeticalOrder = 44,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Dislike,\n        .alphabeticalOrder = 42,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Angry,\n        .alphabeticalOrder = 43,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Anger,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Scary,\n        .alphabeticalOrder = 53,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lonesome,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Disappoint,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Joy,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Gets,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Never,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Darn,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Downcast,\n        .alphabeticalOrder = 64,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Incredible,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Likes,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Dislikes,\n        .alphabeticalOrder = 47,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Boring,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Care,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Cares,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_AllRight,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Adore,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Disaster,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Enjoy,\n        .alphabeticalOrder = 45,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Enjoys,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Eat,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lacking,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Bad,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hard,\n        .alphabeticalOrder = 59,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Terrible,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Should,\n        .alphabeticalOrder = 50,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Nice,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Drink,\n        .alphabeticalOrder = 66,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Surprise,\n        .alphabeticalOrder = 58,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fear,\n        .alphabeticalOrder = 65,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Want,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wait,\n        .alphabeticalOrder = 56,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Satisfied,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_See,\n        .alphabeticalOrder = 57,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Rare,\n        .alphabeticalOrder = 49,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Negative,\n        .alphabeticalOrder = 52,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Done,\n        .alphabeticalOrder = 48,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Danger,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Defeated,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Beat,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Great,\n        .alphabeticalOrder = 67,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Romantic,\n        .alphabeticalOrder = 68,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Question,\n        .alphabeticalOrder = 55,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Understand,\n        .alphabeticalOrder = 54,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Understands,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_greetings.h",
    "content": "\nstatic const u8 sEasyChatWord_Thanks[] = _(\"THANKS\");\nstatic const u8 sEasyChatWord_Yes[] = _(\"YES\");\nstatic const u8 sEasyChatWord_HereGoes[] = _(\"HERE GOES\");\nstatic const u8 sEasyChatWord_HereICome[] = _(\"HERE I COME\");\nstatic const u8 sEasyChatWord_HereItIs[] = _(\"HERE IT IS\");\nstatic const u8 sEasyChatWord_Yeah[] = _(\"YEAH\");\nstatic const u8 sEasyChatWord_Welcome[] = _(\"WELCOME\");\nstatic const u8 sEasyChatWord_Oi[] = _(\"OI\");\nstatic const u8 sEasyChatWord_HowDo[] = _(\"HOW DO\");\nstatic const u8 sEasyChatWord_Congrats[] = _(\"CONGRATS\");\nstatic const u8 sEasyChatWord_GiveMe[] = _(\"GIVE ME\");\nstatic const u8 sEasyChatWord_Sorry[] = _(\"SORRY\");\nstatic const u8 sEasyChatWord_Apologize[] = _(\"APOLOGIZE\");\nstatic const u8 sEasyChatWord_Forgive[] = _(\"FORGIVE\");\nstatic const u8 sEasyChatWord_HeyThere[] = _(\"HEY, THERE\");\nstatic const u8 sEasyChatWord_Hello[] = _(\"HELLO\");\nstatic const u8 sEasyChatWord_GoodBye[] = _(\"GOOD-BYE\");\nstatic const u8 sEasyChatWord_ThankYou[] = _(\"THANK YOU\");\nstatic const u8 sEasyChatWord_IveArrived[] = _(\"I'VE ARRIVED\");\nstatic const u8 sEasyChatWord_Pardon[] = _(\"PARDON\");\nstatic const u8 sEasyChatWord_Excuse[] = _(\"EXCUSE\");\nstatic const u8 sEasyChatWord_SeeYa[] = _(\"SEE YA\");\nstatic const u8 sEasyChatWord_ExcuseMe[] = _(\"EXCUSE ME\");\nstatic const u8 sEasyChatWord_WellThen[] = _(\"WELL, THEN\");\nstatic const u8 sEasyChatWord_GoAhead[] = _(\"GO AHEAD\");\nstatic const u8 sEasyChatWord_Appreciate[] = _(\"APPRECIATE\");\nstatic const u8 sEasyChatWord_HeyQues[] = _(\"HEY?\");\nstatic const u8 sEasyChatWord_WhatsUpQues[] = _(\"WHAT'S UP?\");\nstatic const u8 sEasyChatWord_HuhQues[] = _(\"HUH?\");\nstatic const u8 sEasyChatWord_No[] = _(\"NO\");\nstatic const u8 sEasyChatWord_Hi[] = _(\"HI\");\nstatic const u8 sEasyChatWord_YeahYeah[] = _(\"YEAH, YEAH\");\nstatic const u8 sEasyChatWord_ByeBye[] = _(\"BYE-BYE\");\nstatic const u8 sEasyChatWord_MeetYou[] = _(\"MEET YOU\");\nstatic const u8 sEasyChatWord_Hey[] = _(\"HEY\");\nstatic const u8 sEasyChatWord_Smell[] = _(\"SMELL\");\nstatic const u8 sEasyChatWord_Listening[] = _(\"LISTENING\");\nstatic const u8 sEasyChatWord_HooHah[] = _(\"HOO-HAH\");\nstatic const u8 sEasyChatWord_Yahoo[] = _(\"YAHOO\");\nstatic const u8 sEasyChatWord_Yo[] = _(\"YO\");\nstatic const u8 sEasyChatWord_ComeOver[] = _(\"COME OVER\");\nstatic const u8 sEasyChatWord_CountOn[] = _(\"COUNT ON\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Greetings[] = {\n    {\n        .text = sEasyChatWord_Thanks,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Yes,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_HereGoes,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_HereICome,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_HereItIs,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Yeah,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Welcome,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Oi,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_HowDo,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Congrats,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_GiveMe,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sorry,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Apologize,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Forgive,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_HeyThere,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hello,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_GoodBye,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ThankYou,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_IveArrived,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Pardon,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Excuse,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_SeeYa,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ExcuseMe,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WellThen,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_GoAhead,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Appreciate,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_HeyQues,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WhatsUpQues,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_HuhQues,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_No,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hi,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_YeahYeah,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ByeBye,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_MeetYou,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hey,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Smell,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Listening,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_HooHah,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Yahoo,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Yo,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ComeOver,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_CountOn,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_hobbies.h",
    "content": "\nstatic const u8 sEasyChatWord_Idol[] = _(\"IDOL\");\nstatic const u8 sEasyChatWord_Anime[] = _(\"ANIME\");\nstatic const u8 sEasyChatWord_Song[] = _(\"SONG\");\nstatic const u8 sEasyChatWord_Movie[] = _(\"MOVIE\");\nstatic const u8 sEasyChatWord_Sweets[] = _(\"SWEETS\");\nstatic const u8 sEasyChatWord_Chat[] = _(\"CHAT\");\nstatic const u8 sEasyChatWord_ChildsPlay[] = _(\"CHILD'S PLAY\");\nstatic const u8 sEasyChatWord_Toys[] = _(\"TOYS\");\nstatic const u8 sEasyChatWord_Music[] = _(\"MUSIC\");\nstatic const u8 sEasyChatWord_Cards[] = _(\"CARDS\");\nstatic const u8 sEasyChatWord_Shopping[] = _(\"SHOPPING\");\nstatic const u8 sEasyChatWord_Camera[] = _(\"CAMERA\");\nstatic const u8 sEasyChatWord_Viewing[] = _(\"VIEWING\");\nstatic const u8 sEasyChatWord_Spectator[] = _(\"SPECTATOR\");\nstatic const u8 sEasyChatWord_Gourmet[] = _(\"GOURMET\");\nstatic const u8 sEasyChatWord_Game[] = _(\"GAME\");\nstatic const u8 sEasyChatWord_Rpg[] = _(\"RPG\");\nstatic const u8 sEasyChatWord_Collection[] = _(\"COLLECTION\");\nstatic const u8 sEasyChatWord_Complete[] = _(\"COMPLETE\");\nstatic const u8 sEasyChatWord_Magazine[] = _(\"MAGAZINE\");\nstatic const u8 sEasyChatWord_Walk[] = _(\"WALK\");\nstatic const u8 sEasyChatWord_Bike[] = _(\"BIKE\");\nstatic const u8 sEasyChatWord_Hobby[] = _(\"HOBBY\");\nstatic const u8 sEasyChatWord_Sports[] = _(\"SPORTS\");\nstatic const u8 sEasyChatWord_Software[] = _(\"SOFTWARE\");\nstatic const u8 sEasyChatWord_Songs[] = _(\"SONGS\");\nstatic const u8 sEasyChatWord_Diet[] = _(\"DIET\");\nstatic const u8 sEasyChatWord_Treasure[] = _(\"TREASURE\");\nstatic const u8 sEasyChatWord_Travel[] = _(\"TRAVEL\");\nstatic const u8 sEasyChatWord_Dance[] = _(\"DANCE\");\nstatic const u8 sEasyChatWord_Channel[] = _(\"CHANNEL\");\nstatic const u8 sEasyChatWord_Making[] = _(\"MAKING\");\nstatic const u8 sEasyChatWord_Fishing[] = _(\"FISHING\");\nstatic const u8 sEasyChatWord_Date[] = _(\"DATE\");\nstatic const u8 sEasyChatWord_Design[] = _(\"DESIGN\");\nstatic const u8 sEasyChatWord_Locomotive[] = _(\"LOCOMOTIVE\");\nstatic const u8 sEasyChatWord_PlushDoll[] = _(\"PLUSH DOLL\");\nstatic const u8 sEasyChatWord_Pc[] = _(\"PC\");\nstatic const u8 sEasyChatWord_Flowers[] = _(\"FLOWERS\");\nstatic const u8 sEasyChatWord_Hero[] = _(\"HERO\");\nstatic const u8 sEasyChatWord_Nap[] = _(\"NAP\");\nstatic const u8 sEasyChatWord_Heroine[] = _(\"HEROINE\");\nstatic const u8 sEasyChatWord_Fashion[] = _(\"FASHION\");\nstatic const u8 sEasyChatWord_Adventure[] = _(\"ADVENTURE\");\nstatic const u8 sEasyChatWord_Board[] = _(\"BOARD\");\nstatic const u8 sEasyChatWord_Ball[] = _(\"BALL\");\nstatic const u8 sEasyChatWord_Book[] = _(\"BOOK\");\nstatic const u8 sEasyChatWord_Festival[] = _(\"FESTIVAL\");\nstatic const u8 sEasyChatWord_Comics[] = _(\"COMICS\");\nstatic const u8 sEasyChatWord_Holiday[] = _(\"HOLIDAY\");\nstatic const u8 sEasyChatWord_Plans[] = _(\"PLANS\");\nstatic const u8 sEasyChatWord_Trendy[] = _(\"TRENDY\");\nstatic const u8 sEasyChatWord_Vacation[] = _(\"VACATION\");\nstatic const u8 sEasyChatWord_Look[] = _(\"LOOK\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Hobbies[] = {\n    {\n        .text = sEasyChatWord_Idol,\n        .alphabeticalOrder = 43,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Anime,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Song,\n        .alphabeticalOrder = 45,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Movie,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sweets,\n        .alphabeticalOrder = 44,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Chat,\n        .alphabeticalOrder = 46,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ChildsPlay,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Toys,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Music,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Cards,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Shopping,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Camera,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Viewing,\n        .alphabeticalOrder = 48,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Spectator,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Gourmet,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Game,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Rpg,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Collection,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Complete,\n        .alphabeticalOrder = 42,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Magazine,\n        .alphabeticalOrder = 47,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Walk,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Bike,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hobby,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sports,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Software,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Songs,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Diet,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Treasure,\n        .alphabeticalOrder = 49,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Travel,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Dance,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Channel,\n        .alphabeticalOrder = 53,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Making,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fishing,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Date,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Design,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Locomotive,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_PlushDoll,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Pc,\n        .alphabeticalOrder = 50,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Flowers,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hero,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Nap,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Heroine,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fashion,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Adventure,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Board,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ball,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Book,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Festival,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Comics,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Holiday,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Plans,\n        .alphabeticalOrder = 51,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Trendy,\n        .alphabeticalOrder = 52,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Vacation,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Look,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_lifestyle.h",
    "content": "\nstatic const u8 sEasyChatWord_Chores[] = _(\"CHORES\");\nstatic const u8 sEasyChatWord_Home[] = _(\"HOME\");\nstatic const u8 sEasyChatWord_Money[] = _(\"MONEY\");\nstatic const u8 sEasyChatWord_Allowance[] = _(\"ALLOWANCE\");\nstatic const u8 sEasyChatWord_Bath[] = _(\"BATH\");\nstatic const u8 sEasyChatWord_Conversation[] = _(\"CONVERSATION\");\nstatic const u8 sEasyChatWord_School[] = _(\"SCHOOL\");\nstatic const u8 sEasyChatWord_Commemorate[] = _(\"COMMEMORATE\");\nstatic const u8 sEasyChatWord_Habit[] = _(\"HABIT\");\nstatic const u8 sEasyChatWord_Group[] = _(\"GROUP\");\nstatic const u8 sEasyChatWord_Word[] = _(\"WORD\");\nstatic const u8 sEasyChatWord_Store[] = _(\"STORE\");\nstatic const u8 sEasyChatWord_Service[] = _(\"SERVICE\");\nstatic const u8 sEasyChatWord_Work[] = _(\"WORK\");\nstatic const u8 sEasyChatWord_System[] = _(\"SYSTEM\");\nstatic const u8 sEasyChatWord_Train[] = _(\"TRAIN\");\nstatic const u8 sEasyChatWord_Class[] = _(\"CLASS\");\nstatic const u8 sEasyChatWord_Lessons[] = _(\"LESSONS\");\nstatic const u8 sEasyChatWord_Information[] = _(\"INFORMATION\");\nstatic const u8 sEasyChatWord_Living[] = _(\"LIVING\");\nstatic const u8 sEasyChatWord_Teacher[] = _(\"TEACHER\");\nstatic const u8 sEasyChatWord_Tournament[] = _(\"TOURNAMENT\");\nstatic const u8 sEasyChatWord_Letter[] = _(\"LETTER\");\nstatic const u8 sEasyChatWord_Event[] = _(\"EVENT\");\nstatic const u8 sEasyChatWord_Digital[] = _(\"DIGITAL\");\nstatic const u8 sEasyChatWord_Test[] = _(\"TEST\");\nstatic const u8 sEasyChatWord_DeptStore[] = _(\"DEPT. STORE\");\nstatic const u8 sEasyChatWord_Television[] = _(\"TELEVISION\");\nstatic const u8 sEasyChatWord_Phone[] = _(\"PHONE\");\nstatic const u8 sEasyChatWord_Item[] = _(\"ITEM\");\nstatic const u8 sEasyChatWord_Name[] = _(\"NAME\");\nstatic const u8 sEasyChatWord_News[] = _(\"NEWS\");\nstatic const u8 sEasyChatWord_Popular[] = _(\"POPULAR\");\nstatic const u8 sEasyChatWord_Party[] = _(\"PARTY\");\nstatic const u8 sEasyChatWord_Study[] = _(\"STUDY\");\nstatic const u8 sEasyChatWord_Machine[] = _(\"MACHINE\");\nstatic const u8 sEasyChatWord_Mail[] = _(\"MAIL\");\nstatic const u8 sEasyChatWord_Message[] = _(\"MESSAGE\");\nstatic const u8 sEasyChatWord_Promise[] = _(\"PROMISE\");\nstatic const u8 sEasyChatWord_Dream[] = _(\"DREAM\");\nstatic const u8 sEasyChatWord_Kindergarten[] = _(\"KINDERGARTEN\");\nstatic const u8 sEasyChatWord_Life[] = _(\"LIFE\");\nstatic const u8 sEasyChatWord_Radio[] = _(\"RADIO\");\nstatic const u8 sEasyChatWord_Rental[] = _(\"RENTAL\");\nstatic const u8 sEasyChatWord_World[] = _(\"WORLD\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Lifestyle[] = {\n    {\n        .text = sEasyChatWord_Chores,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Home,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Money,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Allowance,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Bath,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Conversation,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_School,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Commemorate,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Habit,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Group,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Word,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Store,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Service,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Work,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_System,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Train,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Class,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lessons,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Information,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Living,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Teacher,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Tournament,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Letter,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Event,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Digital,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Test,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_DeptStore,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Television,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Phone,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Item,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Name,\n        .alphabeticalOrder = 42,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_News,\n        .alphabeticalOrder = 43,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Popular,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Party,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Study,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Machine,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Mail,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Message,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Promise,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Dream,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Kindergarten,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Life,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Radio,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Rental,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_World,\n        .alphabeticalOrder = 44,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_misc.h",
    "content": "\nstatic const u8 sEasyChatWord_Highs[] = _(\"HIGHS\");\nstatic const u8 sEasyChatWord_Lows[] = _(\"LOWS\");\nstatic const u8 sEasyChatWord_Um[] = _(\"UM\");\nstatic const u8 sEasyChatWord_Rear[] = _(\"REAR\");\nstatic const u8 sEasyChatWord_Things[] = _(\"THINGS\");\nstatic const u8 sEasyChatWord_Thing[] = _(\"THING\");\nstatic const u8 sEasyChatWord_Below[] = _(\"BELOW\");\nstatic const u8 sEasyChatWord_Above[] = _(\"ABOVE\");\nstatic const u8 sEasyChatWord_Back[] = _(\"BACK\");\nstatic const u8 sEasyChatWord_High[] = _(\"HIGH\");\nstatic const u8 sEasyChatWord_Here[] = _(\"HERE\");\nstatic const u8 sEasyChatWord_Inside[] = _(\"INSIDE\");\nstatic const u8 sEasyChatWord_Outside[] = _(\"OUTSIDE\");\nstatic const u8 sEasyChatWord_Beside[] = _(\"BESIDE\");\nstatic const u8 sEasyChatWord_ThisIsItExcl[] = _(\"THIS IS IT!\");\nstatic const u8 sEasyChatWord_This[] = _(\"THIS\");\nstatic const u8 sEasyChatWord_Every[] = _(\"EVERY\");\nstatic const u8 sEasyChatWord_These[] = _(\"THESE\");\nstatic const u8 sEasyChatWord_TheseWere[] = _(\"THESE WERE\");\nstatic const u8 sEasyChatWord_Down[] = _(\"DOWN\");\nstatic const u8 sEasyChatWord_That[] = _(\"THAT\");\nstatic const u8 sEasyChatWord_ThoseAre[] = _(\"THOSE ARE\");\nstatic const u8 sEasyChatWord_ThoseWere[] = _(\"THOSE WERE\");\nstatic const u8 sEasyChatWord_ThatsItExcl[] = _(\"THAT'S IT!\");\nstatic const u8 sEasyChatWord_Am[] = _(\"AM\");\nstatic const u8 sEasyChatWord_ThatWas[] = _(\"THAT WAS\");\nstatic const u8 sEasyChatWord_Front[] = _(\"FRONT\");\nstatic const u8 sEasyChatWord_Up[] = _(\"UP\");\nstatic const u8 sEasyChatWord_Choice[] = _(\"CHOICE\");\nstatic const u8 sEasyChatWord_Far[] = _(\"FAR\");\nstatic const u8 sEasyChatWord_Away[] = _(\"AWAY\");\nstatic const u8 sEasyChatWord_Near[] = _(\"NEAR\");\nstatic const u8 sEasyChatWord_Where[] = _(\"WHERE\");\nstatic const u8 sEasyChatWord_When[] = _(\"WHEN\");\nstatic const u8 sEasyChatWord_What[] = _(\"WHAT\");\nstatic const u8 sEasyChatWord_Deep[] = _(\"DEEP\");\nstatic const u8 sEasyChatWord_Shallow[] = _(\"SHALLOW\");\nstatic const u8 sEasyChatWord_Why[] = _(\"WHY\");\nstatic const u8 sEasyChatWord_Confused[] = _(\"CONFUSED\");\nstatic const u8 sEasyChatWord_Opposite[] = _(\"OPPOSITE\");\nstatic const u8 sEasyChatWord_Left[] = _(\"LEFT\");\nstatic const u8 sEasyChatWord_Right[] = _(\"RIGHT\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Misc[] = {\n    {\n        .text = sEasyChatWord_Highs,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lows,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Um,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Rear,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Things,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Thing,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Below,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Above,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Back,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_High,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Here,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Inside,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Outside,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Beside,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ThisIsItExcl,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_This,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Every,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_These,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_TheseWere,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Down,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_That,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ThoseAre,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ThoseWere,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ThatsItExcl,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Am,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ThatWas,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Front,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Up,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Choice,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Far,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Away,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Near,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Where,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_When,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_What,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Deep,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Shallow,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Why,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Confused,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Opposite,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Left,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Right,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_move_1.h",
    "content": "#include \"constants/moves.h\"\n\nstatic const u16 sEasyChatGroup_Move1[] = {\n    MOVE_ABSORB,\n    MOVE_AEROBLAST,\n    MOVE_AGILITY,\n    MOVE_AIR_CUTTER,\n    MOVE_ANCIENT_POWER,\n    MOVE_AROMATHERAPY,\n    MOVE_ASTONISH,\n    MOVE_AURORA_BEAM,\n    MOVE_BIDE,\n    MOVE_BIND,\n    MOVE_BITE,\n    MOVE_BRICK_BREAK,\n    MOVE_BUBBLE,\n    MOVE_CHARGE,\n    MOVE_CHARM,\n    MOVE_CLAMP,\n    MOVE_CONFUSE_RAY,\n    MOVE_CONSTRICT,\n    MOVE_COSMIC_POWER,\n    MOVE_COUNTER,\n    MOVE_CRABHAMMER,\n    MOVE_CROSS_CHOP,\n    MOVE_CRUNCH,\n    MOVE_CUT,\n    MOVE_DIG,\n    MOVE_DISABLE,\n    MOVE_DOUBLE_TEAM,\n    MOVE_DOUBLE_EDGE,\n    MOVE_DOUBLE_SLAP,\n    MOVE_EARTHQUAKE,\n    MOVE_ENCORE,\n    MOVE_ENDEAVOR,\n    MOVE_ENDURE,\n    MOVE_EXTRASENSORY,\n    MOVE_EXTREME_SPEED,\n    MOVE_FACADE,\n    MOVE_FAKE_TEARS,\n    MOVE_FISSURE,\n    MOVE_FLAIL,\n    MOVE_FLAME_WHEEL,\n    MOVE_FLAMETHROWER,\n    MOVE_FLATTER,\n    MOVE_FLY,\n    MOVE_FOCUS_ENERGY,\n    MOVE_FOCUS_PUNCH,\n    MOVE_FOLLOW_ME,\n    MOVE_GIGA_DRAIN,\n    MOVE_GRASS_WHISTLE,\n    MOVE_GROWTH,\n    MOVE_GRUDGE,\n    MOVE_GUST,\n    MOVE_HAIL,\n    MOVE_HARDEN,\n    MOVE_HAZE,\n    MOVE_HEADBUTT,\n    MOVE_HEAL_BELL,\n    MOVE_HYPNOSIS,\n    MOVE_ICE_BALL,\n    MOVE_ICY_WIND,\n    MOVE_IRON_TAIL,\n    MOVE_KARATE_CHOP,\n    MOVE_KINESIS,\n    MOVE_LEECH_LIFE,\n    MOVE_LICK,\n    MOVE_LOVELY_KISS,\n    MOVE_LOW_KICK,\n    MOVE_MEAN_LOOK,\n    MOVE_MEMENTO,\n    MOVE_METAL_SOUND,\n    MOVE_METEOR_MASH,\n    MOVE_MIND_READER,\n    MOVE_MIRROR_MOVE,\n    MOVE_MIST,\n    MOVE_MORNING_SUN,\n    MOVE_NATURE_POWER,\n    MOVE_NIGHTMARE,\n    MOVE_OCTAZOOKA,\n    MOVE_ODOR_SLEUTH,\n    MOVE_OUTRAGE,\n    MOVE_OVERHEAT,\n    MOVE_PAIN_SPLIT,\n    MOVE_POWDER_SNOW,\n    MOVE_PSYBEAM,\n    MOVE_PSYCH_UP,\n    MOVE_PSYCHIC,\n    MOVE_PSYCHO_BOOST,\n    MOVE_PSYWAVE,\n    MOVE_PURSUIT,\n    MOVE_RAGE,\n    MOVE_RAIN_DANCE,\n    MOVE_RAPID_SPIN,\n    MOVE_RAZOR_WIND,\n    MOVE_RECOVER,\n    MOVE_RETURN,\n    MOVE_REVERSAL,\n    MOVE_ROCK_SLIDE,\n    MOVE_ROCK_SMASH,\n    MOVE_ROCK_THROW,\n    MOVE_ROCK_TOMB,\n    MOVE_ROLLOUT,\n    MOVE_SACRED_FIRE,\n    MOVE_SAFEGUARD,\n    MOVE_SAND_TOMB,\n    MOVE_SAND_ATTACK,\n    MOVE_SANDSTORM,\n    MOVE_SCARY_FACE,\n    MOVE_SCREECH,\n    MOVE_SELF_DESTRUCT,\n    MOVE_SHADOW_BALL,\n    MOVE_SHADOW_PUNCH,\n    MOVE_SHARPEN,\n    MOVE_SHEER_COLD,\n    MOVE_SIGNAL_BEAM,\n    MOVE_SILVER_WIND,\n    MOVE_SING,\n    MOVE_SKETCH,\n    MOVE_SKILL_SWAP,\n    MOVE_SKY_ATTACK,\n    MOVE_SKY_UPPERCUT,\n    MOVE_SLASH,\n    MOVE_SMELLING_SALT,\n    MOVE_SMOG,\n    MOVE_SMOKESCREEN,\n    MOVE_SNORE,\n    MOVE_SOLAR_BEAM,\n    MOVE_SONIC_BOOM,\n    MOVE_SPARK,\n    MOVE_SPIDER_WEB,\n    MOVE_SPITE,\n    MOVE_SPORE,\n    MOVE_STRENGTH,\n    MOVE_STRING_SHOT,\n    MOVE_STUN_SPORE,\n    MOVE_SUBMISSION,\n    MOVE_SUPER_FANG,\n    MOVE_SWAGGER,\n    MOVE_SWEET_SCENT,\n    MOVE_SWIFT,\n    MOVE_SYNTHESIS,\n    MOVE_TAIL_WHIP,\n    MOVE_THRASH,\n    MOVE_THUNDER,\n    MOVE_THUNDERBOLT,\n    MOVE_THUNDER_PUNCH,\n    MOVE_TICKLE,\n    MOVE_TORMENT,\n    MOVE_UPROAR,\n    MOVE_VITAL_THROW,\n    MOVE_WATER_SPOUT,\n    MOVE_WEATHER_BALL,\n    MOVE_WHIRLPOOL,\n    MOVE_WILL_O_WISP,\n    MOVE_WITHDRAW,\n    MOVE_YAWN,\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_move_2.h",
    "content": "#include \"constants/moves.h\"\n\nstatic const u16 sEasyChatGroup_Move2[] = {\n    MOVE_ACID,\n    MOVE_ACID_ARMOR,\n    MOVE_AERIAL_ACE,\n    MOVE_AMNESIA,\n    MOVE_ARM_THRUST,\n    MOVE_ASSIST,\n    MOVE_ATTRACT,\n    MOVE_BARRAGE,\n    MOVE_BARRIER,\n    MOVE_BATON_PASS,\n    MOVE_BEAT_UP,\n    MOVE_BELLY_DRUM,\n    MOVE_BLAST_BURN,\n    MOVE_BLAZE_KICK,\n    MOVE_BLIZZARD,\n    MOVE_BLOCK,\n    MOVE_BODY_SLAM,\n    MOVE_BONE_CLUB,\n    MOVE_BONE_RUSH,\n    MOVE_BONEMERANG,\n    MOVE_BOUNCE,\n    MOVE_BUBBLE_BEAM,\n    MOVE_BULK_UP,\n    MOVE_BULLET_SEED,\n    MOVE_CALM_MIND,\n    MOVE_CAMOUFLAGE,\n    MOVE_COMET_PUNCH,\n    MOVE_CONFUSION,\n    MOVE_CONVERSION,\n    MOVE_CONVERSION_2,\n    MOVE_COTTON_SPORE,\n    MOVE_COVET,\n    MOVE_CRUSH_CLAW,\n    MOVE_CURSE,\n    MOVE_DEFENSE_CURL,\n    MOVE_DESTINY_BOND,\n    MOVE_DETECT,\n    MOVE_DIVE,\n    MOVE_DIZZY_PUNCH,\n    MOVE_DOOM_DESIRE,\n    MOVE_DOUBLE_KICK,\n    MOVE_DRAGON_CLAW,\n    MOVE_DRAGON_DANCE,\n    MOVE_DRAGON_RAGE,\n    MOVE_DRAGON_BREATH,\n    MOVE_DREAM_EATER,\n    MOVE_DRILL_PECK,\n    MOVE_DYNAMIC_PUNCH,\n    MOVE_EGG_BOMB,\n    MOVE_EMBER,\n    MOVE_ERUPTION,\n    MOVE_EXPLOSION,\n    MOVE_FAINT_ATTACK,\n    MOVE_FAKE_OUT,\n    MOVE_FALSE_SWIPE,\n    MOVE_FEATHER_DANCE,\n    MOVE_FIRE_BLAST,\n    MOVE_FIRE_PUNCH,\n    MOVE_FIRE_SPIN,\n    MOVE_FLASH,\n    MOVE_FORESIGHT,\n    MOVE_FRENZY_PLANT,\n    MOVE_FRUSTRATION,\n    MOVE_FURY_ATTACK,\n    MOVE_FURY_CUTTER,\n    MOVE_FURY_SWIPES,\n    MOVE_FUTURE_SIGHT,\n    MOVE_GLARE,\n    MOVE_GROWL,\n    MOVE_GUILLOTINE,\n    MOVE_HEAT_WAVE,\n    MOVE_HELPING_HAND,\n    MOVE_HI_JUMP_KICK,\n    MOVE_HIDDEN_POWER,\n    MOVE_HORN_ATTACK,\n    MOVE_HORN_DRILL,\n    MOVE_HOWL,\n    MOVE_HYDRO_CANNON,\n    MOVE_HYDRO_PUMP,\n    MOVE_HYPER_BEAM,\n    MOVE_HYPER_FANG,\n    MOVE_HYPER_VOICE,\n    MOVE_ICE_BEAM,\n    MOVE_ICE_PUNCH,\n    MOVE_ICICLE_SPEAR,\n    MOVE_IMPRISON,\n    MOVE_INGRAIN,\n    MOVE_IRON_DEFENSE,\n    MOVE_JUMP_KICK,\n    MOVE_KNOCK_OFF,\n    MOVE_LEAF_BLADE,\n    MOVE_LEECH_SEED,\n    MOVE_LEER,\n    MOVE_LIGHT_SCREEN,\n    MOVE_LOCK_ON,\n    MOVE_LUSTER_PURGE,\n    MOVE_MACH_PUNCH,\n    MOVE_MAGIC_COAT,\n    MOVE_MAGICAL_LEAF,\n    MOVE_MAGNITUDE,\n    MOVE_MEDITATE,\n    MOVE_MEGA_DRAIN,\n    MOVE_MEGA_KICK,\n    MOVE_MEGA_PUNCH,\n    MOVE_MEGAHORN,\n    MOVE_METAL_CLAW,\n    MOVE_METRONOME,\n    MOVE_MILK_DRINK,\n    MOVE_MIMIC,\n    MOVE_MINIMIZE,\n    MOVE_MIRROR_COAT,\n    MOVE_MIST_BALL,\n    MOVE_MOONLIGHT,\n    MOVE_MUD_SHOT,\n    MOVE_MUD_SPORT,\n    MOVE_MUD_SLAP,\n    MOVE_MUDDY_WATER,\n    MOVE_NEEDLE_ARM,\n    MOVE_NIGHT_SHADE,\n    MOVE_PAY_DAY,\n    MOVE_PECK,\n    MOVE_PERISH_SONG,\n    MOVE_PETAL_DANCE,\n    MOVE_PIN_MISSILE,\n    MOVE_POISON_FANG,\n    MOVE_POISON_GAS,\n    MOVE_POISON_STING,\n    MOVE_POISON_TAIL,\n    MOVE_POISON_POWDER,\n    MOVE_POUND,\n    MOVE_PRESENT,\n    MOVE_PROTECT,\n    MOVE_QUICK_ATTACK,\n    MOVE_RAZOR_LEAF,\n    MOVE_RECYCLE,\n    MOVE_REFLECT,\n    MOVE_REFRESH,\n    MOVE_REST,\n    MOVE_REVENGE,\n    MOVE_ROAR,\n    MOVE_ROCK_BLAST,\n    MOVE_ROLE_PLAY,\n    MOVE_ROLLING_KICK,\n    MOVE_SCRATCH,\n    MOVE_SECRET_POWER,\n    MOVE_SEISMIC_TOSS,\n    MOVE_SHOCK_WAVE,\n    MOVE_SKULL_BASH,\n    MOVE_SLACK_OFF,\n    MOVE_SLAM,\n    MOVE_SLEEP_POWDER,\n    MOVE_SLEEP_TALK,\n    MOVE_SLUDGE,\n    MOVE_SLUDGE_BOMB,\n    MOVE_SNATCH,\n    MOVE_SOFT_BOILED,\n    MOVE_SPIKE_CANNON,\n    MOVE_SPIKES,\n    MOVE_SPIT_UP,\n    MOVE_SPLASH,\n    MOVE_STEEL_WING,\n    MOVE_STOCKPILE,\n    MOVE_STOMP,\n    MOVE_STRUGGLE,\n    MOVE_SUBSTITUTE,\n    MOVE_SUNNY_DAY,\n    MOVE_SUPERPOWER,\n    MOVE_SUPERSONIC,\n    MOVE_SURF,\n    MOVE_SWALLOW,\n    MOVE_SWEET_KISS,\n    MOVE_SWORDS_DANCE,\n    MOVE_TACKLE,\n    MOVE_TAIL_GLOW,\n    MOVE_TAKE_DOWN,\n    MOVE_TAUNT,\n    MOVE_TEETER_DANCE,\n    MOVE_TELEPORT,\n    MOVE_THIEF,\n    MOVE_THUNDER_WAVE,\n    MOVE_THUNDER_SHOCK,\n    MOVE_TOXIC,\n    MOVE_TRANSFORM,\n    MOVE_TRI_ATTACK,\n    MOVE_TRICK,\n    MOVE_TRIPLE_KICK,\n    MOVE_TWINEEDLE,\n    MOVE_TWISTER,\n    MOVE_VICE_GRIP,\n    MOVE_VINE_WHIP,\n    MOVE_VOLT_TACKLE,\n    MOVE_WATER_GUN,\n    MOVE_WATER_PULSE,\n    MOVE_WATER_SPORT,\n    MOVE_WATERFALL,\n    MOVE_WHIRLWIND,\n    MOVE_WING_ATTACK,\n    MOVE_WISH,\n    MOVE_WRAP,\n    MOVE_ZAP_CANNON,\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_people.h",
    "content": "\nstatic const u8 sEasyChatWord_Opponent[] = _(\"OPPONENT\");\nstatic const u8 sEasyChatWord_I[] = _(\"I\");\nstatic const u8 sEasyChatWord_You[] = _(\"YOU\");\nstatic const u8 sEasyChatWord_Yours[] = _(\"YOURS\");\nstatic const u8 sEasyChatWord_Son[] = _(\"SON\");\nstatic const u8 sEasyChatWord_Your[] = _(\"YOUR\");\nstatic const u8 sEasyChatWord_Youre[] = _(\"YOU'RE\");\nstatic const u8 sEasyChatWord_Youve[] = _(\"YOU'VE\");\nstatic const u8 sEasyChatWord_Mother[] = _(\"MOTHER\");\nstatic const u8 sEasyChatWord_Grandfather[] = _(\"GRANDFATHER\");\nstatic const u8 sEasyChatWord_Uncle[] = _(\"UNCLE\");\nstatic const u8 sEasyChatWord_Father[] = _(\"FATHER\");\nstatic const u8 sEasyChatWord_Boy[] = _(\"BOY\");\nstatic const u8 sEasyChatWord_Adult[] = _(\"ADULT\");\nstatic const u8 sEasyChatWord_Brother[] = _(\"BROTHER\");\nstatic const u8 sEasyChatWord_Sister[] = _(\"SISTER\");\nstatic const u8 sEasyChatWord_Grandmother[] = _(\"GRANDMOTHER\");\nstatic const u8 sEasyChatWord_Aunt[] = _(\"AUNT\");\nstatic const u8 sEasyChatWord_Parent[] = _(\"PARENT\");\nstatic const u8 sEasyChatWord_Man[] = _(\"MAN\");\nstatic const u8 sEasyChatWord_Me[] = _(\"ME\");\nstatic const u8 sEasyChatWord_Girl[] = _(\"GIRL\");\nstatic const u8 sEasyChatWord_Babe[] = _(\"BABE\");\nstatic const u8 sEasyChatWord_Family[] = _(\"FAMILY\");\nstatic const u8 sEasyChatWord_Her[] = _(\"HER\");\nstatic const u8 sEasyChatWord_Him[] = _(\"HIM\");\nstatic const u8 sEasyChatWord_He[] = _(\"HE\");\nstatic const u8 sEasyChatWord_Place[] = _(\"PLACE\");\nstatic const u8 sEasyChatWord_Daughter[] = _(\"DAUGHTER\");\nstatic const u8 sEasyChatWord_His[] = _(\"HIS\");\nstatic const u8 sEasyChatWord_Hes[] = _(\"HE'S\");\nstatic const u8 sEasyChatWord_Arent[] = _(\"AREN'T\");\nstatic const u8 sEasyChatWord_Siblings[] = _(\"SIBLINGS\");\nstatic const u8 sEasyChatWord_Kid[] = _(\"KID\");\nstatic const u8 sEasyChatWord_Children[] = _(\"CHILDREN\");\nstatic const u8 sEasyChatWord_Mr[] = _(\"MR.\");\nstatic const u8 sEasyChatWord_Mrs[] = _(\"MRS.\");\nstatic const u8 sEasyChatWord_Myself[] = _(\"MYSELF\");\nstatic const u8 sEasyChatWord_IWas[] = _(\"I WAS\");\nstatic const u8 sEasyChatWord_ToMe[] = _(\"TO ME\");\nstatic const u8 sEasyChatWord_My[] = _(\"MY\");\nstatic const u8 sEasyChatWord_IAm[] = _(\"I AM\");\nstatic const u8 sEasyChatWord_Ive[] = _(\"I'VE\");\nstatic const u8 sEasyChatWord_Who[] = _(\"WHO\");\nstatic const u8 sEasyChatWord_Someone[] = _(\"SOMEONE\");\nstatic const u8 sEasyChatWord_WhoWas[] = _(\"WHO WAS\");\nstatic const u8 sEasyChatWord_ToWhom[] = _(\"TO WHOM\");\nstatic const u8 sEasyChatWord_Whose[] = _(\"WHOSE\");\nstatic const u8 sEasyChatWord_WhoIs[] = _(\"WHO IS\");\nstatic const u8 sEasyChatWord_Its[] = _(\"IT'S\");\nstatic const u8 sEasyChatWord_Lady[] = _(\"LADY\");\nstatic const u8 sEasyChatWord_Friend[] = _(\"FRIEND\");\nstatic const u8 sEasyChatWord_Ally[] = _(\"ALLY\");\nstatic const u8 sEasyChatWord_Person[] = _(\"PERSON\");\nstatic const u8 sEasyChatWord_Dude[] = _(\"DUDE\");\nstatic const u8 sEasyChatWord_They[] = _(\"THEY\");\nstatic const u8 sEasyChatWord_TheyWere[] = _(\"THEY WERE\");\nstatic const u8 sEasyChatWord_ToThem[] = _(\"TO THEM\");\nstatic const u8 sEasyChatWord_Their[] = _(\"THEIR\");\nstatic const u8 sEasyChatWord_Theyre[] = _(\"THEY'RE\");\nstatic const u8 sEasyChatWord_Theyve[] = _(\"THEY'VE\");\nstatic const u8 sEasyChatWord_We[] = _(\"WE\");\nstatic const u8 sEasyChatWord_Been[] = _(\"BEEN\");\nstatic const u8 sEasyChatWord_ToUs[] = _(\"TO US\");\nstatic const u8 sEasyChatWord_Our[] = _(\"OUR\");\nstatic const u8 sEasyChatWord_WeAre[] = _(\"WE'RE\");\nstatic const u8 sEasyChatWord_Rival[] = _(\"RIVAL\");\nstatic const u8 sEasyChatWord_Weve[] = _(\"WE'VE\");\nstatic const u8 sEasyChatWord_Woman[] = _(\"WOMAN\");\nstatic const u8 sEasyChatWord_She[] = _(\"SHE\");\nstatic const u8 sEasyChatWord_SheWas[] = _(\"SHE WAS\");\nstatic const u8 sEasyChatWord_ToHer[] = _(\"TO HER\");\nstatic const u8 sEasyChatWord_Hers[] = _(\"HERS\");\nstatic const u8 sEasyChatWord_SheIs[] = _(\"SHE IS\");\nstatic const u8 sEasyChatWord_Some[] = _(\"SOME\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_People[] = {\n    {\n        .text = sEasyChatWord_Opponent,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_I,\n        .alphabeticalOrder = 52,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_You,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Yours,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Son,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Your,\n        .alphabeticalOrder = 62,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Youre,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Youve,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Mother,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Grandfather,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Uncle,\n        .alphabeticalOrder = 54,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Father,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Boy,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Adult,\n        .alphabeticalOrder = 51,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Brother,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sister,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Grandmother,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Aunt,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Parent,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Man,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Me,\n        .alphabeticalOrder = 72,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Girl,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Babe,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Family,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Her,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Him,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_He,\n        .alphabeticalOrder = 42,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Place,\n        .alphabeticalOrder = 49,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Daughter,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_His,\n        .alphabeticalOrder = 50,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hes,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Arent,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Siblings,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Kid,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Children,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Mr,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Mrs,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Myself,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_IWas,\n        .alphabeticalOrder = 64,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ToMe,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_My,\n        .alphabeticalOrder = 53,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_IAm,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ive,\n        .alphabeticalOrder = 66,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Who,\n        .alphabeticalOrder = 69,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Someone,\n        .alphabeticalOrder = 73,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WhoWas,\n        .alphabeticalOrder = 70,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ToWhom,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Whose,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WhoIs,\n        .alphabeticalOrder = 74,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Its,\n        .alphabeticalOrder = 44,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lady,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Friend,\n        .alphabeticalOrder = 58,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ally,\n        .alphabeticalOrder = 55,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Person,\n        .alphabeticalOrder = 56,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Dude,\n        .alphabeticalOrder = 59,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_They,\n        .alphabeticalOrder = 60,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_TheyWere,\n        .alphabeticalOrder = 71,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ToThem,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Their,\n        .alphabeticalOrder = 57,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Theyre,\n        .alphabeticalOrder = 63,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Theyve,\n        .alphabeticalOrder = 46,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_We,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Been,\n        .alphabeticalOrder = 61,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ToUs,\n        .alphabeticalOrder = 65,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Our,\n        .alphabeticalOrder = 67,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WeAre,\n        .alphabeticalOrder = 43,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Rival,\n        .alphabeticalOrder = 48,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Weve,\n        .alphabeticalOrder = 45,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Woman,\n        .alphabeticalOrder = 47,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_She,\n        .alphabeticalOrder = 68,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_SheWas,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ToHer,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hers,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_SheIs,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Some,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_pokemon.h",
    "content": "static const u16 sEasyChatGroup_Pokemon[] = {\n    SPECIES_ABRA,\n    SPECIES_ABSOL,\n    SPECIES_AGGRON,\n    SPECIES_ALAKAZAM,\n    SPECIES_ALTARIA,\n    SPECIES_ANORITH,\n    SPECIES_ARMALDO,\n    SPECIES_ARON,\n    SPECIES_AZUMARILL,\n    SPECIES_AZURILL,\n    SPECIES_BAGON,\n    SPECIES_BALTOY,\n    SPECIES_BANETTE,\n    SPECIES_BARBOACH,\n    SPECIES_BEAUTIFLY,\n    SPECIES_BELDUM,\n    SPECIES_BELLOSSOM,\n    SPECIES_BLAZIKEN,\n    SPECIES_BRELOOM,\n    SPECIES_CACNEA,\n    SPECIES_CACTURNE,\n    SPECIES_CAMERUPT,\n    SPECIES_CARVANHA,\n    SPECIES_CASCOON,\n    SPECIES_CASTFORM,\n    SPECIES_CHIMECHO,\n    SPECIES_CHINCHOU,\n    SPECIES_CLAMPERL,\n    SPECIES_CLAYDOL,\n    SPECIES_COMBUSKEN,\n    SPECIES_CORPHISH,\n    SPECIES_CORSOLA,\n    SPECIES_CRADILY,\n    SPECIES_CRAWDAUNT,\n    SPECIES_CROBAT,\n    SPECIES_DELCATTY,\n    SPECIES_DEOXYS,\n    SPECIES_DODRIO,\n    SPECIES_DODUO,\n    SPECIES_DONPHAN,\n    SPECIES_DUSCLOPS,\n    SPECIES_DUSKULL,\n    SPECIES_DUSTOX,\n    SPECIES_ELECTRIKE,\n    SPECIES_ELECTRODE,\n    SPECIES_EXPLOUD,\n    SPECIES_FEEBAS,\n    SPECIES_FLYGON,\n    SPECIES_GARDEVOIR,\n    SPECIES_GEODUDE,\n    SPECIES_GIRAFARIG,\n    SPECIES_GLALIE,\n    SPECIES_GLOOM,\n    SPECIES_GOLBAT,\n    SPECIES_GOLDEEN,\n    SPECIES_GOLDUCK,\n    SPECIES_GOLEM,\n    SPECIES_GOREBYSS,\n    SPECIES_GRAVELER,\n    SPECIES_GRIMER,\n    SPECIES_GROUDON,\n    SPECIES_GROVYLE,\n    SPECIES_GRUMPIG,\n    SPECIES_GULPIN,\n    SPECIES_GYARADOS,\n    SPECIES_HARIYAMA,\n    SPECIES_HERACROSS,\n    SPECIES_HORSEA,\n    SPECIES_HUNTAIL,\n    SPECIES_IGGLYBUFF,\n    SPECIES_ILLUMISE,\n    SPECIES_JIGGLYPUFF,\n    SPECIES_JIRACHI,\n    SPECIES_KADABRA,\n    SPECIES_KECLEON,\n    SPECIES_KINGDRA,\n    SPECIES_KIRLIA,\n    SPECIES_KOFFING,\n    SPECIES_KYOGRE,\n    SPECIES_LAIRON,\n    SPECIES_LANTURN,\n    SPECIES_LATIAS,\n    SPECIES_LATIOS,\n    SPECIES_LILEEP,\n    SPECIES_LINOONE,\n    SPECIES_LOMBRE,\n    SPECIES_LOTAD,\n    SPECIES_LOUDRED,\n    SPECIES_LUDICOLO,\n    SPECIES_LUNATONE,\n    SPECIES_LUVDISC,\n    SPECIES_MACHAMP,\n    SPECIES_MACHOKE,\n    SPECIES_MACHOP,\n    SPECIES_MAGCARGO,\n    SPECIES_MAGIKARP,\n    SPECIES_MAGNEMITE,\n    SPECIES_MAGNETON,\n    SPECIES_MAKUHITA,\n    SPECIES_MANECTRIC,\n    SPECIES_MARILL,\n    SPECIES_MARSHTOMP,\n    SPECIES_MASQUERAIN,\n    SPECIES_MAWILE,\n    SPECIES_MEDICHAM,\n    SPECIES_MEDITITE,\n    SPECIES_METAGROSS,\n    SPECIES_METANG,\n    SPECIES_MIGHTYENA,\n    SPECIES_MILOTIC,\n    SPECIES_MINUN,\n    SPECIES_MUDKIP,\n    SPECIES_MUK,\n    SPECIES_NATU,\n    SPECIES_NINCADA,\n    SPECIES_NINETALES,\n    SPECIES_NINJASK,\n    SPECIES_NOSEPASS,\n    SPECIES_NUMEL,\n    SPECIES_NUZLEAF,\n    SPECIES_ODDISH,\n    SPECIES_PELIPPER,\n    SPECIES_PHANPY,\n    SPECIES_PICHU,\n    SPECIES_PIKACHU,\n    SPECIES_PINSIR,\n    SPECIES_PLUSLE,\n    SPECIES_POOCHYENA,\n    SPECIES_PSYDUCK,\n    SPECIES_RAICHU,\n    SPECIES_RALTS,\n    SPECIES_RAYQUAZA,\n    SPECIES_REGICE,\n    SPECIES_REGIROCK,\n    SPECIES_REGISTEEL,\n    SPECIES_RELICANTH,\n    SPECIES_RHYDON,\n    SPECIES_RHYHORN,\n    SPECIES_ROSELIA,\n    SPECIES_SABLEYE,\n    SPECIES_SALAMENCE,\n    SPECIES_SANDSHREW,\n    SPECIES_SANDSLASH,\n    SPECIES_SCEPTILE,\n    SPECIES_SEADRA,\n    SPECIES_SEAKING,\n    SPECIES_SEALEO,\n    SPECIES_SEEDOT,\n    SPECIES_SEVIPER,\n    SPECIES_SHARPEDO,\n    SPECIES_SHEDINJA,\n    SPECIES_SHELGON,\n    SPECIES_SHIFTRY,\n    SPECIES_SHROOMISH,\n    SPECIES_SHUPPET,\n    SPECIES_SILCOON,\n    SPECIES_SKARMORY,\n    SPECIES_SKITTY,\n    SPECIES_SLAKING,\n    SPECIES_SLAKOTH,\n    SPECIES_SLUGMA,\n    SPECIES_SNORUNT,\n    SPECIES_SOLROCK,\n    SPECIES_SPHEAL,\n    SPECIES_SPINDA,\n    SPECIES_SPOINK,\n    SPECIES_STARMIE,\n    SPECIES_STARYU,\n    SPECIES_SURSKIT,\n    SPECIES_SWABLU,\n    SPECIES_SWALOT,\n    SPECIES_SWAMPERT,\n    SPECIES_SWELLOW,\n    SPECIES_TAILLOW,\n    SPECIES_TENTACOOL,\n    SPECIES_TENTACRUEL,\n    SPECIES_TORCHIC,\n    SPECIES_TORKOAL,\n    SPECIES_TRAPINCH,\n    SPECIES_TREECKO,\n    SPECIES_TROPIUS,\n    SPECIES_VIBRAVA,\n    SPECIES_VIGOROTH,\n    SPECIES_VILEPLUME,\n    SPECIES_VOLBEAT,\n    SPECIES_VOLTORB,\n    SPECIES_VULPIX,\n    SPECIES_WAILMER,\n    SPECIES_WAILORD,\n    SPECIES_WALREIN,\n    SPECIES_WEEZING,\n    SPECIES_WHISCASH,\n    SPECIES_WHISMUR,\n    SPECIES_WIGGLYTUFF,\n    SPECIES_WINGULL,\n    SPECIES_WOBBUFFET,\n    SPECIES_WURMPLE,\n    SPECIES_WYNAUT,\n    SPECIES_XATU,\n    SPECIES_ZANGOOSE,\n    SPECIES_ZIGZAGOON,\n    SPECIES_ZUBAT,\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_pokemon2.h",
    "content": "static const u16 sEasyChatGroup_Pokemon2[] = {\n\tSPECIES_ABRA,\n\tSPECIES_AERODACTYL,\n\tSPECIES_AIPOM,\n\tSPECIES_ALAKAZAM,\n\tSPECIES_AMPHAROS,\n\tSPECIES_ARBOK,\n\tSPECIES_ARCANINE,\n\tSPECIES_ARIADOS,\n\tSPECIES_ARTICUNO,\n\tSPECIES_AZUMARILL,\n\tSPECIES_BAYLEEF,\n\tSPECIES_BEEDRILL,\n\tSPECIES_BELLOSSOM,\n\tSPECIES_BELLSPROUT,\n\tSPECIES_BLASTOISE,\n\tSPECIES_BLISSEY,\n\tSPECIES_BULBASAUR,\n\tSPECIES_BUTTERFREE,\n\tSPECIES_CATERPIE,\n\tSPECIES_CELEBI,\n\tSPECIES_CHANSEY,\n\tSPECIES_CHARIZARD,\n\tSPECIES_CHARMANDER,\n\tSPECIES_CHARMELEON,\n\tSPECIES_CHIKORITA,\n\tSPECIES_CHINCHOU,\n\tSPECIES_CLEFABLE,\n\tSPECIES_CLEFAIRY,\n\tSPECIES_CLEFFA,\n\tSPECIES_CLOYSTER,\n\tSPECIES_CORSOLA,\n\tSPECIES_CROBAT,\n\tSPECIES_CROCONAW,\n\tSPECIES_CUBONE,\n\tSPECIES_CYNDAQUIL,\n\tSPECIES_DELIBIRD,\n\tSPECIES_DEWGONG,\n\tSPECIES_DIGLETT,\n\tSPECIES_DITTO,\n\tSPECIES_DODRIO,\n\tSPECIES_DODUO,\n\tSPECIES_DONPHAN,\n\tSPECIES_DRAGONAIR,\n\tSPECIES_DRAGONITE,\n\tSPECIES_DRATINI,\n\tSPECIES_DROWZEE,\n\tSPECIES_DUGTRIO,\n\tSPECIES_DUNSPARCE,\n\tSPECIES_EEVEE,\n\tSPECIES_EKANS,\n\tSPECIES_ELECTABUZZ,\n\tSPECIES_ELECTRODE,\n\tSPECIES_ELEKID,\n\tSPECIES_ENTEI,\n\tSPECIES_ESPEON,\n\tSPECIES_EXEGGCUTE,\n\tSPECIES_EXEGGUTOR,\n\tSPECIES_FARFETCHD,\n\tSPECIES_FEAROW,\n\tSPECIES_FERALIGATR,\n\tSPECIES_FLAAFFY,\n\tSPECIES_FLAREON,\n\tSPECIES_FORRETRESS,\n\tSPECIES_FURRET,\n\tSPECIES_GASTLY,\n\tSPECIES_GENGAR,\n\tSPECIES_GEODUDE,\n\tSPECIES_GIRAFARIG,\n\tSPECIES_GLIGAR,\n\tSPECIES_GLOOM,\n\tSPECIES_GOLBAT,\n\tSPECIES_GOLDEEN,\n\tSPECIES_GOLDUCK,\n\tSPECIES_GOLEM,\n\tSPECIES_GRANBULL,\n\tSPECIES_GRAVELER,\n\tSPECIES_GRIMER,\n\tSPECIES_GROWLITHE,\n\tSPECIES_GYARADOS,\n\tSPECIES_HAUNTER,\n\tSPECIES_HERACROSS,\n\tSPECIES_HITMONCHAN,\n\tSPECIES_HITMONLEE,\n\tSPECIES_HITMONTOP,\n\tSPECIES_HO_OH,\n\tSPECIES_HOOTHOOT,\n\tSPECIES_HOPPIP,\n\tSPECIES_HORSEA,\n\tSPECIES_HOUNDOOM,\n\tSPECIES_HOUNDOUR,\n\tSPECIES_HYPNO,\n\tSPECIES_IGGLYBUFF,\n\tSPECIES_IVYSAUR,\n\tSPECIES_JIGGLYPUFF,\n\tSPECIES_JOLTEON,\n\tSPECIES_JUMPLUFF,\n\tSPECIES_JYNX,\n\tSPECIES_KABUTO,\n\tSPECIES_KABUTOPS,\n\tSPECIES_KADABRA,\n\tSPECIES_KAKUNA,\n\tSPECIES_KANGASKHAN,\n\tSPECIES_KINGDRA,\n\tSPECIES_KINGLER,\n\tSPECIES_KOFFING,\n\tSPECIES_KRABBY,\n\tSPECIES_LANTURN,\n\tSPECIES_LAPRAS,\n\tSPECIES_LARVITAR,\n\tSPECIES_LEDIAN,\n\tSPECIES_LEDYBA,\n\tSPECIES_LICKITUNG,\n\tSPECIES_LUGIA,\n\tSPECIES_MACHAMP,\n\tSPECIES_MACHOKE,\n\tSPECIES_MACHOP,\n\tSPECIES_MAGBY,\n\tSPECIES_MAGCARGO,\n\tSPECIES_MAGIKARP,\n\tSPECIES_MAGMAR,\n\tSPECIES_MAGNEMITE,\n\tSPECIES_MAGNETON,\n\tSPECIES_MANKEY,\n\tSPECIES_MANTINE,\n\tSPECIES_MAREEP,\n\tSPECIES_MARILL,\n\tSPECIES_MAROWAK,\n\tSPECIES_MEGANIUM,\n\tSPECIES_MEOWTH,\n\tSPECIES_METAPOD,\n\tSPECIES_MEW,\n\tSPECIES_MEWTWO,\n\tSPECIES_MILTANK,\n\tSPECIES_MISDREAVUS,\n\tSPECIES_MOLTRES,\n\tSPECIES_MR_MIME,\n\tSPECIES_MUK,\n\tSPECIES_MURKROW,\n\tSPECIES_NATU,\n\tSPECIES_NIDOKING,\n\tSPECIES_NIDOQUEEN,\n\tSPECIES_NIDORAN_F,\n\tSPECIES_NIDORAN_M,\n\tSPECIES_NIDORINA,\n\tSPECIES_NIDORINO,\n\tSPECIES_NINETALES,\n\tSPECIES_NOCTOWL,\n\tSPECIES_OCTILLERY,\n\tSPECIES_ODDISH,\n\tSPECIES_OMANYTE,\n\tSPECIES_OMASTAR,\n\tSPECIES_ONIX,\n\tSPECIES_PARAS,\n\tSPECIES_PARASECT,\n\tSPECIES_PERSIAN,\n\tSPECIES_PHANPY,\n\tSPECIES_PICHU,\n\tSPECIES_PIDGEOT,\n\tSPECIES_PIDGEOTTO,\n\tSPECIES_PIDGEY,\n\tSPECIES_PIKACHU,\n\tSPECIES_PILOSWINE,\n\tSPECIES_PINECO,\n\tSPECIES_PINSIR,\n\tSPECIES_POLITOED,\n\tSPECIES_POLIWAG,\n\tSPECIES_POLIWHIRL,\n\tSPECIES_POLIWRATH,\n\tSPECIES_PONYTA,\n\tSPECIES_PORYGON,\n\tSPECIES_PORYGON2,\n\tSPECIES_PRIMEAPE,\n\tSPECIES_PSYDUCK,\n\tSPECIES_PUPITAR,\n\tSPECIES_QUAGSIRE,\n\tSPECIES_QUILAVA,\n\tSPECIES_QWILFISH,\n\tSPECIES_RAICHU,\n\tSPECIES_RAIKOU,\n\tSPECIES_RAPIDASH,\n\tSPECIES_RATICATE,\n\tSPECIES_RATTATA,\n\tSPECIES_REMORAID,\n\tSPECIES_RHYDON,\n\tSPECIES_RHYHORN,\n\tSPECIES_SANDSHREW,\n\tSPECIES_SANDSLASH,\n\tSPECIES_SCIZOR,\n\tSPECIES_SCYTHER,\n\tSPECIES_SEADRA,\n\tSPECIES_SEAKING,\n\tSPECIES_SEEL,\n\tSPECIES_SENTRET,\n\tSPECIES_SHELLDER,\n\tSPECIES_SHUCKLE,\n\tSPECIES_SKARMORY,\n\tSPECIES_SKIPLOOM,\n\tSPECIES_SLOWBRO,\n\tSPECIES_SLOWKING,\n\tSPECIES_SLOWPOKE,\n\tSPECIES_SLUGMA,\n\tSPECIES_SMEARGLE,\n\tSPECIES_SMOOCHUM,\n\tSPECIES_SNEASEL,\n\tSPECIES_SNORLAX,\n\tSPECIES_SNUBBULL,\n\tSPECIES_SPEAROW,\n\tSPECIES_SPINARAK,\n\tSPECIES_SQUIRTLE,\n\tSPECIES_STANTLER,\n\tSPECIES_STARMIE,\n\tSPECIES_STARYU,\n\tSPECIES_STEELIX,\n\tSPECIES_SUDOWOODO,\n\tSPECIES_SUICUNE,\n\tSPECIES_SUNFLORA,\n\tSPECIES_SUNKERN,\n\tSPECIES_SWINUB,\n\tSPECIES_TANGELA,\n\tSPECIES_TAUROS,\n\tSPECIES_TEDDIURSA,\n\tSPECIES_TENTACOOL,\n\tSPECIES_TENTACRUEL,\n\tSPECIES_TOGEPI,\n\tSPECIES_TOGETIC,\n\tSPECIES_TOTODILE,\n\tSPECIES_TYPHLOSION,\n\tSPECIES_TYRANITAR,\n\tSPECIES_TYROGUE,\n\tSPECIES_UMBREON,\n\tSPECIES_UNOWN,\n\tSPECIES_URSARING,\n\tSPECIES_VAPOREON,\n\tSPECIES_VENOMOTH,\n\tSPECIES_VENONAT,\n\tSPECIES_VENUSAUR,\n\tSPECIES_VICTREEBEL,\n\tSPECIES_VILEPLUME,\n\tSPECIES_VOLTORB,\n\tSPECIES_VULPIX,\n\tSPECIES_WARTORTLE,\n\tSPECIES_WEEDLE,\n\tSPECIES_WEEPINBELL,\n\tSPECIES_WEEZING,\n\tSPECIES_WIGGLYTUFF,\n\tSPECIES_WOBBUFFET,\n\tSPECIES_WOOPER,\n\tSPECIES_XATU,\n\tSPECIES_YANMA,\n\tSPECIES_ZAPDOS,\n\tSPECIES_ZUBAT,\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_speech.h",
    "content": "\nstatic const u8 sEasyChatWord_Listen[] = _(\"LISTEN\");\nstatic const u8 sEasyChatWord_NotVery[] = _(\"NOT VERY\");\nstatic const u8 sEasyChatWord_Mean[] = _(\"MEAN\");\nstatic const u8 sEasyChatWord_Lie[] = _(\"LIE\");\nstatic const u8 sEasyChatWord_Lay[] = _(\"LAY\");\nstatic const u8 sEasyChatWord_Recommend[] = _(\"RECOMMEND\");\nstatic const u8 sEasyChatWord_Nitwit[] = _(\"NITWIT\");\nstatic const u8 sEasyChatWord_Quite[] = _(\"QUITE\");\nstatic const u8 sEasyChatWord_From[] = _(\"FROM\");\nstatic const u8 sEasyChatWord_Feeling[] = _(\"FEELING\");\nstatic const u8 sEasyChatWord_But[] = _(\"BUT\");\nstatic const u8 sEasyChatWord_However[] = _(\"HOWEVER\");\nstatic const u8 sEasyChatWord_Case[] = _(\"CASE\");\nstatic const u8 sEasyChatWord_The[] = _(\"THE\");\nstatic const u8 sEasyChatWord_Miss[] = _(\"MISS\");\nstatic const u8 sEasyChatWord_How[] = _(\"HOW\");\nstatic const u8 sEasyChatWord_Hit[] = _(\"HIT\");\nstatic const u8 sEasyChatWord_Enough[] = _(\"ENOUGH\");\nstatic const u8 sEasyChatWord_ALot[] = _(\"A LOT\");\nstatic const u8 sEasyChatWord_ALittle[] = _(\"A LITTLE\");\nstatic const u8 sEasyChatWord_Absolutely[] = _(\"ABSOLUTELY\");\nstatic const u8 sEasyChatWord_And[] = _(\"AND\");\nstatic const u8 sEasyChatWord_Only[] = _(\"ONLY\");\nstatic const u8 sEasyChatWord_Around[] = _(\"AROUND\");\nstatic const u8 sEasyChatWord_Probably[] = _(\"PROBABLY\");\nstatic const u8 sEasyChatWord_If[] = _(\"IF\");\nstatic const u8 sEasyChatWord_Very[] = _(\"VERY\");\nstatic const u8 sEasyChatWord_ATinyBit[] = _(\"A TINY BIT\");\nstatic const u8 sEasyChatWord_Wild[] = _(\"WILD\");\nstatic const u8 sEasyChatWord_Thats[] = _(\"THAT'S\");\nstatic const u8 sEasyChatWord_Just[] = _(\"JUST\");\nstatic const u8 sEasyChatWord_EvenSo[] = _(\"EVEN SO,\");\nstatic const u8 sEasyChatWord_MustBe[] = _(\"MUST BE\");\nstatic const u8 sEasyChatWord_Naturally[] = _(\"NATURALLY\");\nstatic const u8 sEasyChatWord_ForNow[] = _(\"FOR NOW,\");\nstatic const u8 sEasyChatWord_Understood[] = _(\"UNDERSTOOD\");\nstatic const u8 sEasyChatWord_Joking[] = _(\"JOKING\");\nstatic const u8 sEasyChatWord_Ready[] = _(\"READY\");\nstatic const u8 sEasyChatWord_Something[] = _(\"SOMETHING\");\nstatic const u8 sEasyChatWord_Somehow[] = _(\"SOMEHOW\");\nstatic const u8 sEasyChatWord_Although[] = _(\"ALTHOUGH\");\nstatic const u8 sEasyChatWord_Also[] = _(\"ALSO\");\nstatic const u8 sEasyChatWord_Perfect[] = _(\"PERFECT\");\nstatic const u8 sEasyChatWord_AsMuchAs[] = _(\"AS MUCH AS\");\nstatic const u8 sEasyChatWord_Really[] = _(\"REALLY\");\nstatic const u8 sEasyChatWord_Truly[] = _(\"TRULY\");\nstatic const u8 sEasyChatWord_Seriously[] = _(\"SERIOUSLY\");\nstatic const u8 sEasyChatWord_Totally[] = _(\"TOTALLY\");\nstatic const u8 sEasyChatWord_Until[] = _(\"UNTIL\");\nstatic const u8 sEasyChatWord_AsIf[] = _(\"AS IF\");\nstatic const u8 sEasyChatWord_Mood[] = _(\"MOOD\");\nstatic const u8 sEasyChatWord_Rather[] = _(\"RATHER\");\nstatic const u8 sEasyChatWord_Awfully[] = _(\"AWFULLY\");\nstatic const u8 sEasyChatWord_Mode[] = _(\"MODE\");\nstatic const u8 sEasyChatWord_More[] = _(\"MORE\");\nstatic const u8 sEasyChatWord_TooLate[] = _(\"TOO LATE\");\nstatic const u8 sEasyChatWord_Finally[] = _(\"FINALLY\");\nstatic const u8 sEasyChatWord_Any[] = _(\"ANY\");\nstatic const u8 sEasyChatWord_Instead[] = _(\"INSTEAD\");\nstatic const u8 sEasyChatWord_Fantastic[] = _(\"FANTASTIC\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Speech[] = {\n    {\n        .text = sEasyChatWord_Listen,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_NotVery,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Mean,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lie,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lay,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Recommend,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Nitwit,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Quite,\n        .alphabeticalOrder = 57,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_From,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Feeling,\n        .alphabeticalOrder = 49,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_But,\n        .alphabeticalOrder = 43,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_However,\n        .alphabeticalOrder = 52,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Case,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_The,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Miss,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_How,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hit,\n        .alphabeticalOrder = 59,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Enough,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ALot,\n        .alphabeticalOrder = 56,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ALittle,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Absolutely,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_And,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Only,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Around,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Probably,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_If,\n        .alphabeticalOrder = 58,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Very,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ATinyBit,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wild,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Thats,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Just,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_EvenSo,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_MustBe,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Naturally,\n        .alphabeticalOrder = 53,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ForNow,\n        .alphabeticalOrder = 50,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Understood,\n        .alphabeticalOrder = 54,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Joking,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ready,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Something,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Somehow,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Although,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Also,\n        .alphabeticalOrder = 42,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Perfect,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_AsMuchAs,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Really,\n        .alphabeticalOrder = 51,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Truly,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Seriously,\n        .alphabeticalOrder = 44,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Totally,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Until,\n        .alphabeticalOrder = 46,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_AsIf,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Mood,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Rather,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Awfully,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Mode,\n        .alphabeticalOrder = 55,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_More,\n        .alphabeticalOrder = 47,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_TooLate,\n        .alphabeticalOrder = 45,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Finally,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Any,\n        .alphabeticalOrder = 48,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Instead,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fantastic,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_status.h",
    "content": "\nstatic const u8 sEasyChatWord_Dark[] = _(\"DARK\");\nstatic const u8 sEasyChatWord_Stench[] = _(\"STENCH\");\nstatic const u8 sEasyChatWord_ThickFat[] = _(\"THICK FAT\");\nstatic const u8 sEasyChatWord_RainDish[] = _(\"RAIN DISH\");\nstatic const u8 sEasyChatWord_Drizzle[] = _(\"DRIZZLE\");\nstatic const u8 sEasyChatWord_ArenaTrap[] = _(\"ARENA TRAP\");\nstatic const u8 sEasyChatWord_Intimidate[] = _(\"INTIMIDATE\");\nstatic const u8 sEasyChatWord_RockHead[] = _(\"ROCK HEAD\");\nstatic const u8 sEasyChatWord_Color[] = _(\"COLOR\");\nstatic const u8 sEasyChatWord_AltColor[] = _(\"ALT. COLOR\");\nstatic const u8 sEasyChatWord_Rock[] = _(\"ROCK\");\nstatic const u8 sEasyChatWord_Beautiful[] = _(\"BEAUTIFUL\");\nstatic const u8 sEasyChatWord_Beauty[] = _(\"BEAUTY\");\nstatic const u8 sEasyChatWord_AirLock[] = _(\"AIR LOCK\");\nstatic const u8 sEasyChatWord_Psychic[] = _(\"PSYCHIC\");\nstatic const u8 sEasyChatWord_HyperCutter[] = _(\"HYPER CUTTER\");\nstatic const u8 sEasyChatWord_Fighting[] = _(\"FIGHTING\");\nstatic const u8 sEasyChatWord_ShadowTag[] = _(\"SHADOW TAG\");\nstatic const u8 sEasyChatWord_Smart[] = _(\"SMART\");\nstatic const u8 sEasyChatWord_Smartness[] = _(\"SMARTNESS\");\nstatic const u8 sEasyChatWord_SpeedBoost[] = _(\"SPEED BOOST\");\nstatic const u8 sEasyChatWord_Cool[] = _(\"COOL\");\nstatic const u8 sEasyChatWord_Coolness[] = _(\"COOLNESS\");\nstatic const u8 sEasyChatWord_BattleArmor[] = _(\"BATTLE ARMOR\");\nstatic const u8 sEasyChatWord_Cute[] = _(\"CUTE\");\nstatic const u8 sEasyChatWord_Cuteness[] = _(\"CUTENESS\");\nstatic const u8 sEasyChatWord_Sturdy[] = _(\"STURDY\");\nstatic const u8 sEasyChatWord_SuctionCups[] = _(\"SUCTION CUPS\");\nstatic const u8 sEasyChatWord_Grass[] = _(\"GRASS\");\nstatic const u8 sEasyChatWord_ClearBody[] = _(\"CLEAR BODY\");\nstatic const u8 sEasyChatWord_Torrent[] = _(\"TORRENT\");\nstatic const u8 sEasyChatWord_Ghost[] = _(\"GHOST\");\nstatic const u8 sEasyChatWord_Ice[] = _(\"ICE\");\nstatic const u8 sEasyChatWord_Guts[] = _(\"GUTS\");\nstatic const u8 sEasyChatWord_RoughSkin[] = _(\"ROUGH SKIN\");\nstatic const u8 sEasyChatWord_ShellArmor[] = _(\"SHELL ARMOR\");\nstatic const u8 sEasyChatWord_NaturalCure[] = _(\"NATURAL CURE\");\nstatic const u8 sEasyChatWord_Damp[] = _(\"DAMP\");\nstatic const u8 sEasyChatWord_Ground[] = _(\"GROUND\");\nstatic const u8 sEasyChatWord_Limber[] = _(\"LIMBER\");\nstatic const u8 sEasyChatWord_MagnetPull[] = _(\"MAGNET PULL\");\nstatic const u8 sEasyChatWord_WhiteSmoke[] = _(\"WHITE SMOKE\");\nstatic const u8 sEasyChatWord_Synchronize[] = _(\"SYNCHRONIZE\");\nstatic const u8 sEasyChatWord_Overgrow[] = _(\"OVERGROW\");\nstatic const u8 sEasyChatWord_SwiftSwim[] = _(\"SWIFT SWIM\");\nstatic const u8 sEasyChatWord_SandStream[] = _(\"SAND STREAM\");\nstatic const u8 sEasyChatWord_SandVeil[] = _(\"SAND VEIL\");\nstatic const u8 sEasyChatWord_KeenEye[] = _(\"KEEN EYE\");\nstatic const u8 sEasyChatWord_InnerFocus[] = _(\"INNER FOCUS\");\nstatic const u8 sEasyChatWord_Static[] = _(\"STATIC\");\nstatic const u8 sEasyChatWord_Type[] = _(\"TYPE\");\nstatic const u8 sEasyChatWord_Tough[] = _(\"TOUGH\");\nstatic const u8 sEasyChatWord_Toughness[] = _(\"TOUGHNESS\");\nstatic const u8 sEasyChatWord_ShedSkin[] = _(\"SHED SKIN\");\nstatic const u8 sEasyChatWord_HugePower[] = _(\"HUGE POWER\");\nstatic const u8 sEasyChatWord_VoltAbsorb[] = _(\"VOLT ABSORB\");\nstatic const u8 sEasyChatWord_WaterAbsorb[] = _(\"WATER ABSORB\");\nstatic const u8 sEasyChatWord_Electric[] = _(\"ELECTRIC\");\nstatic const u8 sEasyChatWord_Forecast[] = _(\"FORECAST\");\nstatic const u8 sEasyChatWord_SereneGrace[] = _(\"SERENE GRACE\");\nstatic const u8 sEasyChatWord_Poison[] = _(\"POISON\");\nstatic const u8 sEasyChatWord_PoisonPoint[] = _(\"POISON POINT\");\nstatic const u8 sEasyChatWord_Dragon[] = _(\"DRAGON\");\nstatic const u8 sEasyChatWord_Trace[] = _(\"TRACE\");\nstatic const u8 sEasyChatWord_Oblivious[] = _(\"OBLIVIOUS\");\nstatic const u8 sEasyChatWord_Truant[] = _(\"TRUANT\");\nstatic const u8 sEasyChatWord_RunAway[] = _(\"RUN AWAY\");\nstatic const u8 sEasyChatWord_StickyHold[] = _(\"STICKY HOLD\");\nstatic const u8 sEasyChatWord_CloudNine[] = _(\"CLOUD NINE\");\nstatic const u8 sEasyChatWord_Normal[] = _(\"NORMAL\");\nstatic const u8 sEasyChatWord_Steel[] = _(\"STEEL\");\nstatic const u8 sEasyChatWord_Illuminate[] = _(\"ILLUMINATE\");\nstatic const u8 sEasyChatWord_EarlyBird[] = _(\"EARLY BIRD\");\nstatic const u8 sEasyChatWord_Hustle[] = _(\"HUSTLE\");\nstatic const u8 sEasyChatWord_Shine[] = _(\"SHINE\");\nstatic const u8 sEasyChatWord_Flying[] = _(\"FLYING\");\nstatic const u8 sEasyChatWord_Drought[] = _(\"DROUGHT\");\nstatic const u8 sEasyChatWord_Lightningrod[] = _(\"LIGHTNINGROD\");\nstatic const u8 sEasyChatWord_Compoundeyes[] = _(\"COMPOUNDEYES\");\nstatic const u8 sEasyChatWord_MarvelScale[] = _(\"MARVEL SCALE\");\nstatic const u8 sEasyChatWord_WonderGuard[] = _(\"WONDER GUARD\");\nstatic const u8 sEasyChatWord_Insomnia[] = _(\"INSOMNIA\");\nstatic const u8 sEasyChatWord_Levitate[] = _(\"LEVITATE\");\nstatic const u8 sEasyChatWord_Plus[] = _(\"PLUS\");\nstatic const u8 sEasyChatWord_Pressure[] = _(\"PRESSURE\");\nstatic const u8 sEasyChatWord_LiquidOoze[] = _(\"LIQUID OOZE\");\nstatic const u8 sEasyChatWord_ColorChange[] = _(\"COLOR CHANGE\");\nstatic const u8 sEasyChatWord_Soundproof[] = _(\"SOUNDPROOF\");\nstatic const u8 sEasyChatWord_EffectSpore[] = _(\"EFFECT SPORE\");\nstatic const u8 sEasyChatWord_Pkrs[] = _(\"{PK}RS\");\nstatic const u8 sEasyChatWord_Fire[] = _(\"FIRE\");\nstatic const u8 sEasyChatWord_FlameBody[] = _(\"FLAME BODY\");\nstatic const u8 sEasyChatWord_Minus[] = _(\"MINUS\");\nstatic const u8 sEasyChatWord_OwnTempo[] = _(\"OWN TEMPO\");\nstatic const u8 sEasyChatWord_MagmaArmor[] = _(\"MAGMA ARMOR\");\nstatic const u8 sEasyChatWord_Water[] = _(\"WATER\");\nstatic const u8 sEasyChatWord_WaterVeil[] = _(\"WATER VEIL\");\nstatic const u8 sEasyChatWord_Bug[] = _(\"BUG\");\nstatic const u8 sEasyChatWord_Swarm[] = _(\"SWARM\");\nstatic const u8 sEasyChatWord_CuteCharm[] = _(\"CUTE CHARM\");\nstatic const u8 sEasyChatWord_Immunity[] = _(\"IMMUNITY\");\nstatic const u8 sEasyChatWord_Blaze[] = _(\"BLAZE\");\nstatic const u8 sEasyChatWord_Pickup[] = _(\"PICKUP\");\nstatic const u8 sEasyChatWord_Pattern[] = _(\"PATTERN\");\nstatic const u8 sEasyChatWord_FlashFire[] = _(\"FLASH FIRE\");\nstatic const u8 sEasyChatWord_VitalSpirit[] = _(\"VITAL SPIRIT\");\nstatic const u8 sEasyChatWord_Chlorophyll[] = _(\"CHLOROPHYLL\");\nstatic const u8 sEasyChatWord_PurePower[] = _(\"PURE POWER\");\nstatic const u8 sEasyChatWord_ShieldDust[] = _(\"SHIELD DUST\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Status[] = {\n    {\n        .text = sEasyChatWord_Dark,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Stench,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ThickFat,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_RainDish,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Drizzle,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ArenaTrap,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Intimidate,\n        .alphabeticalOrder = 101,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_RockHead,\n        .alphabeticalOrder = 97,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Color,\n        .alphabeticalOrder = 106,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_AltColor,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Rock,\n        .alphabeticalOrder = 68,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Beautiful,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Beauty,\n        .alphabeticalOrder = 86,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_AirLock,\n        .alphabeticalOrder = 78,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Psychic,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_HyperCutter,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fighting,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ShadowTag,\n        .alphabeticalOrder = 99,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Smart,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Smartness,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_SpeedBoost,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Cool,\n        .alphabeticalOrder = 62,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Coolness,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_BattleArmor,\n        .alphabeticalOrder = 76,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Cute,\n        .alphabeticalOrder = 72,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Cuteness,\n        .alphabeticalOrder = 88,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sturdy,\n        .alphabeticalOrder = 57,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_SuctionCups,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Grass,\n        .alphabeticalOrder = 90,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ClearBody,\n        .alphabeticalOrder = 91,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Torrent,\n        .alphabeticalOrder = 104,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ghost,\n        .alphabeticalOrder = 75,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ice,\n        .alphabeticalOrder = 58,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Guts,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_RoughSkin,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ShellArmor,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_NaturalCure,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Damp,\n        .alphabeticalOrder = 54,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ground,\n        .alphabeticalOrder = 73,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Limber,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_MagnetPull,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WhiteSmoke,\n        .alphabeticalOrder = 71,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Synchronize,\n        .alphabeticalOrder = 100,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Overgrow,\n        .alphabeticalOrder = 48,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_SwiftSwim,\n        .alphabeticalOrder = 81,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_SandStream,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_SandVeil,\n        .alphabeticalOrder = 47,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_KeenEye,\n        .alphabeticalOrder = 82,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_InnerFocus,\n        .alphabeticalOrder = 77,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Static,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Type,\n        .alphabeticalOrder = 85,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Tough,\n        .alphabeticalOrder = 94,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Toughness,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ShedSkin,\n        .alphabeticalOrder = 79,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_HugePower,\n        .alphabeticalOrder = 92,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_VoltAbsorb,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WaterAbsorb,\n        .alphabeticalOrder = 69,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Electric,\n        .alphabeticalOrder = 64,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Forecast,\n        .alphabeticalOrder = 43,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_SereneGrace,\n        .alphabeticalOrder = 93,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Poison,\n        .alphabeticalOrder = 103,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_PoisonPoint,\n        .alphabeticalOrder = 102,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Dragon,\n        .alphabeticalOrder = 89,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Trace,\n        .alphabeticalOrder = 83,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Oblivious,\n        .alphabeticalOrder = 60,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Truant,\n        .alphabeticalOrder = 61,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_RunAway,\n        .alphabeticalOrder = 84,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_StickyHold,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_CloudNine,\n        .alphabeticalOrder = 107,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Normal,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Steel,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Illuminate,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_EarlyBird,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hustle,\n        .alphabeticalOrder = 66,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Shine,\n        .alphabeticalOrder = 45,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Flying,\n        .alphabeticalOrder = 46,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Drought,\n        .alphabeticalOrder = 59,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lightningrod,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Compoundeyes,\n        .alphabeticalOrder = 53,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_MarvelScale,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WonderGuard,\n        .alphabeticalOrder = 108,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Insomnia,\n        .alphabeticalOrder = 74,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Levitate,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Plus,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Pressure,\n        .alphabeticalOrder = 87,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_LiquidOoze,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ColorChange,\n        .alphabeticalOrder = 49,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Soundproof,\n        .alphabeticalOrder = 70,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_EffectSpore,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Pkrs,\n        .alphabeticalOrder = 67,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fire,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_FlameBody,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Minus,\n        .alphabeticalOrder = 98,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_OwnTempo,\n        .alphabeticalOrder = 44,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_MagmaArmor,\n        .alphabeticalOrder = 42,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Water,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WaterVeil,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Bug,\n        .alphabeticalOrder = 51,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Swarm,\n        .alphabeticalOrder = 52,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_CuteCharm,\n        .alphabeticalOrder = 63,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Immunity,\n        .alphabeticalOrder = 65,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Blaze,\n        .alphabeticalOrder = 50,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Pickup,\n        .alphabeticalOrder = 105,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Pattern,\n        .alphabeticalOrder = 55,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_FlashFire,\n        .alphabeticalOrder = 95,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_VitalSpirit,\n        .alphabeticalOrder = 56,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Chlorophyll,\n        .alphabeticalOrder = 96,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_PurePower,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ShieldDust,\n        .alphabeticalOrder = 80,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_time.h",
    "content": "\nstatic const u8 sEasyChatWord_Fall[] = _(\"FALL\");\nstatic const u8 sEasyChatWord_Morning[] = _(\"MORNING\");\nstatic const u8 sEasyChatWord_Tomorrow[] = _(\"TOMORROW\");\nstatic const u8 sEasyChatWord_Last[] = _(\"LAST\");\nstatic const u8 sEasyChatWord_Day[] = _(\"DAY\");\nstatic const u8 sEasyChatWord_Sometime[] = _(\"SOMETIME\");\nstatic const u8 sEasyChatWord_Always[] = _(\"ALWAYS\");\nstatic const u8 sEasyChatWord_Current[] = _(\"CURRENT\");\nstatic const u8 sEasyChatWord_Forever[] = _(\"FOREVER\");\nstatic const u8 sEasyChatWord_Days[] = _(\"DAYS\");\nstatic const u8 sEasyChatWord_End[] = _(\"END\");\nstatic const u8 sEasyChatWord_Tuesday[] = _(\"TUESDAY\");\nstatic const u8 sEasyChatWord_Yesterday[] = _(\"YESTERDAY\");\nstatic const u8 sEasyChatWord_Today[] = _(\"TODAY\");\nstatic const u8 sEasyChatWord_Friday[] = _(\"FRIDAY\");\nstatic const u8 sEasyChatWord_Monday[] = _(\"MONDAY\");\nstatic const u8 sEasyChatWord_Later[] = _(\"LATER\");\nstatic const u8 sEasyChatWord_Earlier[] = _(\"EARLIER\");\nstatic const u8 sEasyChatWord_Another[] = _(\"ANOTHER\");\nstatic const u8 sEasyChatWord_Time[] = _(\"TIME\");\nstatic const u8 sEasyChatWord_Finish[] = _(\"FINISH\");\nstatic const u8 sEasyChatWord_Wednesday[] = _(\"WEDNESDAY\");\nstatic const u8 sEasyChatWord_Soon[] = _(\"SOON\");\nstatic const u8 sEasyChatWord_Start[] = _(\"START\");\nstatic const u8 sEasyChatWord_Month[] = _(\"MONTH\");\nstatic const u8 sEasyChatWord_Stop[] = _(\"STOP\");\nstatic const u8 sEasyChatWord_Now[] = _(\"NOW\");\nstatic const u8 sEasyChatWord_Final[] = _(\"FINAL\");\nstatic const u8 sEasyChatWord_Next[] = _(\"NEXT\");\nstatic const u8 sEasyChatWord_Age[] = _(\"AGE\");\nstatic const u8 sEasyChatWord_Saturday[] = _(\"SATURDAY\");\nstatic const u8 sEasyChatWord_Summer[] = _(\"SUMMER\");\nstatic const u8 sEasyChatWord_Sunday[] = _(\"SUNDAY\");\nstatic const u8 sEasyChatWord_Beginning[] = _(\"BEGINNING\");\nstatic const u8 sEasyChatWord_Spring[] = _(\"SPRING\");\nstatic const u8 sEasyChatWord_Daytime[] = _(\"DAYTIME\");\nstatic const u8 sEasyChatWord_Winter[] = _(\"WINTER\");\nstatic const u8 sEasyChatWord_Daily[] = _(\"DAILY\");\nstatic const u8 sEasyChatWord_Olden[] = _(\"OLDEN\");\nstatic const u8 sEasyChatWord_Almost[] = _(\"ALMOST\");\nstatic const u8 sEasyChatWord_Nearly[] = _(\"NEARLY\");\nstatic const u8 sEasyChatWord_Thursday[] = _(\"THURSDAY\");\nstatic const u8 sEasyChatWord_Nighttime[] = _(\"NIGHTTIME\");\nstatic const u8 sEasyChatWord_Night[] = _(\"NIGHT\");\nstatic const u8 sEasyChatWord_Week[] = _(\"WEEK\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Time[] = {\n    {\n        .text = sEasyChatWord_Fall,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Morning,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Tomorrow,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Last,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Day,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sometime,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Always,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Current,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Forever,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Days,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_End,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Tuesday,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Yesterday,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Today,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Friday,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Monday,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Later,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Earlier,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Another,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Time,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Finish,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wednesday,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Soon,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Start,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Month,\n        .alphabeticalOrder = 43,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Stop,\n        .alphabeticalOrder = 42,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Now,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Final,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Next,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Age,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Saturday,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Summer,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sunday,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Beginning,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Spring,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Daytime,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Winter,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Daily,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Olden,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Almost,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Nearly,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Thursday,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Nighttime,\n        .alphabeticalOrder = 44,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Night,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Week,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_trainer.h",
    "content": "\nstatic const u8 sEasyChatWord_IChooseYou[] = _(\"I CHOOSE YOU\");\nstatic const u8 sEasyChatWord_Gotcha[] = _(\"GOTCHA\");\nstatic const u8 sEasyChatWord_Trade[] = _(\"TRADE\");\nstatic const u8 sEasyChatWord_Sapphire[] = _(\"SAPPHIRE\");\nstatic const u8 sEasyChatWord_Evolve[] = _(\"EVOLVE\");\nstatic const u8 sEasyChatWord_Encyclopedia[] = _(\"ENCYCLOPEDIA\");\nstatic const u8 sEasyChatWord_Nature[] = _(\"NATURE\");\nstatic const u8 sEasyChatWord_Center[] = _(\"CENTER\");\nstatic const u8 sEasyChatWord_Egg[] = _(\"EGG\");\nstatic const u8 sEasyChatWord_Link[] = _(\"LINK\");\nstatic const u8 sEasyChatWord_SpAbility[] = _(\"SP. ABILITY\");\nstatic const u8 sEasyChatWord_Trainer[] = _(\"TRAINER\");\nstatic const u8 sEasyChatWord_Version[] = _(\"VERSION\");\nstatic const u8 sEasyChatWord_Pokenav[] = _(\"POKéNAV\");\nstatic const u8 sEasyChatWord_Pokemon[] = _(\"POKéMON\");\nstatic const u8 sEasyChatWord_Get[] = _(\"GET\");\nstatic const u8 sEasyChatWord_Pokedex[] = _(\"POKéDEX\");\nstatic const u8 sEasyChatWord_Ruby[] = _(\"RUBY\");\nstatic const u8 sEasyChatWord_Level[] = _(\"LEVEL\");\nstatic const u8 sEasyChatWord_Red[] = _(\"RED\");\nstatic const u8 sEasyChatWord_Green[] = _(\"GREEN\");\nstatic const u8 sEasyChatWord_Bag[] = _(\"BAG\");\nstatic const u8 sEasyChatWord_Flame[] = _(\"FLAME\");\nstatic const u8 sEasyChatWord_Gold[] = _(\"GOLD\");\nstatic const u8 sEasyChatWord_Leaf[] = _(\"LEAF\");\nstatic const u8 sEasyChatWord_Silver[] = _(\"SILVER\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Trainer[] = {\n    {\n        .text = sEasyChatWord_IChooseYou,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Gotcha,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Trade,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sapphire,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Evolve,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Encyclopedia,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Nature,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Center,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Egg,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Link,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_SpAbility,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Trainer,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Version,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Pokenav,\n        .alphabeticalOrder = 9,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Pokemon,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Get,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Pokedex,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ruby,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Level,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Red,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Green,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Bag,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Flame,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Gold,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Leaf,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Silver,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_trendy_saying.h",
    "content": "\nstatic const u8 sEasyChatWord_KthxBye[] = _(\"KTHX, BYE.\");\nstatic const u8 sEasyChatWord_YesSirExcl[] = _(\"YES, SIR!\");\nstatic const u8 sEasyChatWord_AvantGarde[] = _(\"AVANT GARDE\");\nstatic const u8 sEasyChatWord_Couple[] = _(\"COUPLE\");\nstatic const u8 sEasyChatWord_MuchObliged[] = _(\"MUCH OBLIGED\");\nstatic const u8 sEasyChatWord_YeehawExcl[] = _(\"YEEHAW!\");\nstatic const u8 sEasyChatWord_Mega[] = _(\"MEGA\");\nstatic const u8 sEasyChatWord_1HitKOExcl[] = _(\"1-HIT KO!\");\nstatic const u8 sEasyChatWord_Destiny[] = _(\"DESTINY\");\nstatic const u8 sEasyChatWord_Cancel[] = _(\"CANCEL\");\nstatic const u8 sEasyChatWord_New[] = _(\"NEW\");\nstatic const u8 sEasyChatWord_Flatten[] = _(\"FLATTEN\");\nstatic const u8 sEasyChatWord_Kidding[] = _(\"KIDDING\");\nstatic const u8 sEasyChatWord_Loser[] = _(\"LOSER\");\nstatic const u8 sEasyChatWord_Losing[] = _(\"LOSING\");\nstatic const u8 sEasyChatWord_Happening[] = _(\"HAPPENING\");\nstatic const u8 sEasyChatWord_HipAnd[] = _(\"HIP AND\");\nstatic const u8 sEasyChatWord_Shake[] = _(\"SHAKE\");\nstatic const u8 sEasyChatWord_Shady[] = _(\"SHADY\");\nstatic const u8 sEasyChatWord_Upbeat[] = _(\"UPBEAT\");\nstatic const u8 sEasyChatWord_Modern[] = _(\"MODERN\");\nstatic const u8 sEasyChatWord_SmellYa[] = _(\"SMELL YA\");\nstatic const u8 sEasyChatWord_Bang[] = _(\"BANG\");\nstatic const u8 sEasyChatWord_Knockout[] = _(\"KNOCKOUT\");\nstatic const u8 sEasyChatWord_Hassle[] = _(\"HASSLE\");\nstatic const u8 sEasyChatWord_Winner[] = _(\"WINNER\");\nstatic const u8 sEasyChatWord_Fever[] = _(\"FEVER\");\nstatic const u8 sEasyChatWord_Wannabe[] = _(\"WANNABE\");\nstatic const u8 sEasyChatWord_Baby[] = _(\"BABY\");\nstatic const u8 sEasyChatWord_Heart[] = _(\"HEART\");\nstatic const u8 sEasyChatWord_Old[] = _(\"OLD\");\nstatic const u8 sEasyChatWord_Young[] = _(\"YOUNG\");\nstatic const u8 sEasyChatWord_Ugly[] = _(\"UGLY\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_TrendySaying[] = {\n    {\n        .text = sEasyChatWord_KthxBye,\n        .alphabeticalOrder = 7,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_YesSirExcl,\n        .alphabeticalOrder = 2,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_AvantGarde,\n        .alphabeticalOrder = 28,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Couple,\n        .alphabeticalOrder = 22,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_MuchObliged,\n        .alphabeticalOrder = 9,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_YeehawExcl,\n        .alphabeticalOrder = 3,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Mega,\n        .alphabeticalOrder = 8,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_1HitKOExcl,\n        .alphabeticalOrder = 26,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Destiny,\n        .alphabeticalOrder = 11,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Cancel,\n        .alphabeticalOrder = 15,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_New,\n        .alphabeticalOrder = 24,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Flatten,\n        .alphabeticalOrder = 29,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Kidding,\n        .alphabeticalOrder = 16,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Loser,\n        .alphabeticalOrder = 12,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Losing,\n        .alphabeticalOrder = 23,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Happening,\n        .alphabeticalOrder = 0,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_HipAnd,\n        .alphabeticalOrder = 13,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Shake,\n        .alphabeticalOrder = 14,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Shady,\n        .alphabeticalOrder = 6,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Upbeat,\n        .alphabeticalOrder = 20,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Modern,\n        .alphabeticalOrder = 4,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_SmellYa,\n        .alphabeticalOrder = 10,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Bang,\n        .alphabeticalOrder = 30,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Knockout,\n        .alphabeticalOrder = 18,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Hassle,\n        .alphabeticalOrder = 17,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Winner,\n        .alphabeticalOrder = 21,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Fever,\n        .alphabeticalOrder = 32,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Wannabe,\n        .alphabeticalOrder = 19,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Baby,\n        .alphabeticalOrder = 27,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Heart,\n        .alphabeticalOrder = 25,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Old,\n        .alphabeticalOrder = 5,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Young,\n        .alphabeticalOrder = 1,\n        .enabled = FALSE\n    },\n    {\n        .text = sEasyChatWord_Ugly,\n        .alphabeticalOrder = 31,\n        .enabled = FALSE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_group_voices.h",
    "content": "\nstatic const u8 sEasyChatWord_Excl[] = _(\"!\");\nstatic const u8 sEasyChatWord_ExclExcl[] = _(\"!!\");\nstatic const u8 sEasyChatWord_QuesExcl[] = _(\"?!\");\nstatic const u8 sEasyChatWord_Ques[] = _(\"?\");\nstatic const u8 sEasyChatWord_Ellipsis[] = _(\"…\");\nstatic const u8 sEasyChatWord_EllipsisExcl[] = _(\"…!\");\nstatic const u8 sEasyChatWord_EllipsisEllipsisEllipsis[] = _(\"………\");\nstatic const u8 sEasyChatWord_Dash[] = _(\"-\");\nstatic const u8 sEasyChatWord_DashDashDash[] = _(\"- - -\");\nstatic const u8 sEasyChatWord_UhOh[] = _(\"UH-OH\");\nstatic const u8 sEasyChatWord_Waaah[] = _(\"WAAAH\");\nstatic const u8 sEasyChatWord_Ahaha[] = _(\"AHAHA\");\nstatic const u8 sEasyChatWord_OhQues[] = _(\"OH?\");\nstatic const u8 sEasyChatWord_Nope[] = _(\"NOPE\");\nstatic const u8 sEasyChatWord_Urgh[] = _(\"URGH\");\nstatic const u8 sEasyChatWord_Hmm[] = _(\"HMM\");\nstatic const u8 sEasyChatWord_Whoah[] = _(\"WHOAH\");\nstatic const u8 sEasyChatWord_WroooaarExcl[] = _(\"WROOOAAR!\");\nstatic const u8 sEasyChatWord_Wow[] = _(\"WOW\");\nstatic const u8 sEasyChatWord_Giggle[] = _(\"GIGGLE\");\nstatic const u8 sEasyChatWord_Sigh[] = _(\"SIGH\");\nstatic const u8 sEasyChatWord_Unbelievable[] = _(\"UNBELIEVABLE\");\nstatic const u8 sEasyChatWord_Cries[] = _(\"CRIES\");\nstatic const u8 sEasyChatWord_Agree[] = _(\"AGREE\");\nstatic const u8 sEasyChatWord_EhQues[] = _(\"EH?\");\nstatic const u8 sEasyChatWord_Cry[] = _(\"CRY\");\nstatic const u8 sEasyChatWord_Ehehe[] = _(\"EHEHE\");\nstatic const u8 sEasyChatWord_OiOiOi[] = _(\"OI, OI, OI\");\nstatic const u8 sEasyChatWord_OhYeah[] = _(\"OH, YEAH\");\nstatic const u8 sEasyChatWord_Oh[] = _(\"OH\");\nstatic const u8 sEasyChatWord_Oops[] = _(\"OOPS\");\nstatic const u8 sEasyChatWord_Shocked[] = _(\"SHOCKED\");\nstatic const u8 sEasyChatWord_Eek[] = _(\"EEK\");\nstatic const u8 sEasyChatWord_Graaah[] = _(\"GRAAAH\");\nstatic const u8 sEasyChatWord_Gwahahaha[] = _(\"GWAHAHAHA\");\nstatic const u8 sEasyChatWord_Way[] = _(\"WAY\");\nstatic const u8 sEasyChatWord_Tch[] = _(\"TCH\");\nstatic const u8 sEasyChatWord_Hehe[] = _(\"HEHE\");\nstatic const u8 sEasyChatWord_Hah[] = _(\"HAH\");\nstatic const u8 sEasyChatWord_Yup[] = _(\"YUP\");\nstatic const u8 sEasyChatWord_Hahaha[] = _(\"HAHAHA\");\nstatic const u8 sEasyChatWord_Aiyeeh[] = _(\"AIYEEH\");\nstatic const u8 sEasyChatWord_Hiyah[] = _(\"HIYAH\");\nstatic const u8 sEasyChatWord_Fufufu[] = _(\"FUFUFU\");\nstatic const u8 sEasyChatWord_Lol[] = _(\"LOL\");\nstatic const u8 sEasyChatWord_Snort[] = _(\"SNORT\");\nstatic const u8 sEasyChatWord_Humph[] = _(\"HUMPH\");\nstatic const u8 sEasyChatWord_Hehehe[] = _(\"HEHEHE\");\nstatic const u8 sEasyChatWord_Heh[] = _(\"HEH\");\nstatic const u8 sEasyChatWord_Hohoho[] = _(\"HOHOHO\");\nstatic const u8 sEasyChatWord_UhHuh[] = _(\"UH-HUH\");\nstatic const u8 sEasyChatWord_OhDear[] = _(\"OH, DEAR\");\nstatic const u8 sEasyChatWord_Arrgh[] = _(\"ARRGH\");\nstatic const u8 sEasyChatWord_Mufufu[] = _(\"MUFUFU\");\nstatic const u8 sEasyChatWord_Mmm[] = _(\"MMM\");\nstatic const u8 sEasyChatWord_OhKay[] = _(\"OH-KAY\");\nstatic const u8 sEasyChatWord_Okay[] = _(\"OKAY\");\nstatic const u8 sEasyChatWord_Lalala[] = _(\"LALALA\");\nstatic const u8 sEasyChatWord_Yay[] = _(\"YAY\");\nstatic const u8 sEasyChatWord_Aww[] = _(\"AWW\");\nstatic const u8 sEasyChatWord_Wowee[] = _(\"WOWEE\");\nstatic const u8 sEasyChatWord_Gwah[] = _(\"GWAH\");\nstatic const u8 sEasyChatWord_Wahahaha[] = _(\"WAHAHAHA\");\n\nstatic const struct EasyChatWordInfo sEasyChatGroup_Voices[] = {\n    {\n        .text = sEasyChatWord_Excl,\n        .alphabeticalOrder = 0,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_ExclExcl,\n        .alphabeticalOrder = 1,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_QuesExcl,\n        .alphabeticalOrder = 7,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ques,\n        .alphabeticalOrder = 8,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ellipsis,\n        .alphabeticalOrder = 4,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_EllipsisExcl,\n        .alphabeticalOrder = 5,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_EllipsisEllipsisEllipsis,\n        .alphabeticalOrder = 6,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Dash,\n        .alphabeticalOrder = 3,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_DashDashDash,\n        .alphabeticalOrder = 2,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_UhOh,\n        .alphabeticalOrder = 23,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Waaah,\n        .alphabeticalOrder = 11,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ahaha,\n        .alphabeticalOrder = 41,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_OhQues,\n        .alphabeticalOrder = 52,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Nope,\n        .alphabeticalOrder = 59,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Urgh,\n        .alphabeticalOrder = 22,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hmm,\n        .alphabeticalOrder = 25,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Whoah,\n        .alphabeticalOrder = 32,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_WroooaarExcl,\n        .alphabeticalOrder = 24,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wow,\n        .alphabeticalOrder = 26,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Giggle,\n        .alphabeticalOrder = 43,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Sigh,\n        .alphabeticalOrder = 19,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Unbelievable,\n        .alphabeticalOrder = 33,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Cries,\n        .alphabeticalOrder = 61,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Agree,\n        .alphabeticalOrder = 34,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_EhQues,\n        .alphabeticalOrder = 38,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Cry,\n        .alphabeticalOrder = 40,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Ehehe,\n        .alphabeticalOrder = 48,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_OiOiOi,\n        .alphabeticalOrder = 37,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_OhYeah,\n        .alphabeticalOrder = 47,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Oh,\n        .alphabeticalOrder = 42,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Oops,\n        .alphabeticalOrder = 15,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Shocked,\n        .alphabeticalOrder = 49,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Eek,\n        .alphabeticalOrder = 46,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Graaah,\n        .alphabeticalOrder = 57,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Gwahahaha,\n        .alphabeticalOrder = 44,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Way,\n        .alphabeticalOrder = 54,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Tch,\n        .alphabeticalOrder = 53,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hehe,\n        .alphabeticalOrder = 13,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hah,\n        .alphabeticalOrder = 29,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Yup,\n        .alphabeticalOrder = 51,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hahaha,\n        .alphabeticalOrder = 28,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Aiyeeh,\n        .alphabeticalOrder = 55,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hiyah,\n        .alphabeticalOrder = 12,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Fufufu,\n        .alphabeticalOrder = 27,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lol,\n        .alphabeticalOrder = 56,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Snort,\n        .alphabeticalOrder = 30,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Humph,\n        .alphabeticalOrder = 31,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hehehe,\n        .alphabeticalOrder = 20,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Heh,\n        .alphabeticalOrder = 45,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Hohoho,\n        .alphabeticalOrder = 36,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_UhHuh,\n        .alphabeticalOrder = 50,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_OhDear,\n        .alphabeticalOrder = 9,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Arrgh,\n        .alphabeticalOrder = 21,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Mufufu,\n        .alphabeticalOrder = 14,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Mmm,\n        .alphabeticalOrder = 10,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_OhKay,\n        .alphabeticalOrder = 62,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Okay,\n        .alphabeticalOrder = 35,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Lalala,\n        .alphabeticalOrder = 16,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Yay,\n        .alphabeticalOrder = 18,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Aww,\n        .alphabeticalOrder = 60,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wowee,\n        .alphabeticalOrder = 17,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Gwah,\n        .alphabeticalOrder = 58,\n        .enabled = TRUE\n    },\n    {\n        .text = sEasyChatWord_Wahahaha,\n        .alphabeticalOrder = 39,\n        .enabled = TRUE\n    }\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_groups.h",
    "content": "#include \"easy_chat.h\"\n\n#include \"easy_chat_group_pokemon.h\"\n#include \"easy_chat_group_trainer.h\"\n#include \"easy_chat_group_status.h\"\n#include \"easy_chat_group_battle.h\"\n#include \"easy_chat_group_greetings.h\"\n#include \"easy_chat_group_people.h\"\n#include \"easy_chat_group_voices.h\"\n#include \"easy_chat_group_speech.h\"\n#include \"easy_chat_group_endings.h\"\n#include \"easy_chat_group_feelings.h\"\n#include \"easy_chat_group_conditions.h\"\n#include \"easy_chat_group_actions.h\"\n#include \"easy_chat_group_lifestyle.h\"\n#include \"easy_chat_group_hobbies.h\"\n#include \"easy_chat_group_time.h\"\n#include \"easy_chat_group_misc.h\"\n#include \"easy_chat_group_adjectives.h\"\n#include \"easy_chat_group_events.h\"\n#include \"easy_chat_group_move_1.h\"\n#include \"easy_chat_group_move_2.h\"\n#include \"easy_chat_group_trendy_saying.h\"\n#include \"easy_chat_group_pokemon2.h\"\n\nstatic const struct EasyChatGroup sEasyChatGroups[] = {\n    {\n        .wordData = {.valueList = sEasyChatGroup_Pokemon},\n        .numWords = 202,\n        .numEnabledWords = 202\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Trainer},\n        .numWords = 26,\n        .numEnabledWords = 25\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Status},\n        .numWords = 109,\n        .numEnabledWords = 109\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Battle},\n        .numWords = 63,\n        .numEnabledWords = 63\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Greetings},\n        .numWords = 42,\n        .numEnabledWords = 42\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_People},\n        .numWords = 75,\n        .numEnabledWords = 75\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Voices},\n        .numWords = 63,\n        .numEnabledWords = 63\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Speech},\n        .numWords = 60,\n        .numEnabledWords = 60\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Endings},\n        .numWords = 69,\n        .numEnabledWords = 69\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Feelings},\n        .numWords = 69,\n        .numEnabledWords = 69\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Conditions},\n        .numWords = 69,\n        .numEnabledWords = 69\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Actions},\n        .numWords = 78,\n        .numEnabledWords = 78\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Lifestyle},\n        .numWords = 45,\n        .numEnabledWords = 45\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Hobbies},\n        .numWords = 54,\n        .numEnabledWords = 54\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Time},\n        .numWords = 45,\n        .numEnabledWords = 45\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Misc},\n        .numWords = 42,\n        .numEnabledWords = 42\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Adjectives},\n        .numWords = 36,\n        .numEnabledWords = 36\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_Events},\n        .numWords = 28,\n        .numEnabledWords = 19\n    },\n    {\n        .wordData = {.valueList = sEasyChatGroup_Move1},\n        .numWords = 154,\n        .numEnabledWords = 154\n    },\n    {\n        .wordData = {.valueList = sEasyChatGroup_Move2},\n        .numWords = 200,\n        .numEnabledWords = 200\n    },\n    {\n        .wordData = {.words = sEasyChatGroup_TrendySaying},\n        .numWords = 33,\n        .numEnabledWords = 0\n    },\n    {\n        .wordData = {.valueList = sEasyChatGroup_Pokemon2},\n        .numWords = 251,\n        .numEnabledWords = 251\n    },\n};\n"
  },
  {
    "path": "src/data/easy_chat/easy_chat_words_by_letter.h",
    "content": "#include \"easy_chat.h\"\n#include \"constants/easy_chat.h\"\n\nstatic const u16 sEasyChatWordsByLetter_Others[] = {\n    EC_WORD_EXCL,\n    EC_WORD_EXCL_EXCL,\n    EC_WORD_DASH,\n    EC_WORD_DASH_DASH_DASH,\n    EC_WORD_ELLIPSIS,\n    EC_WORD_ELLIPSIS_EXCL,\n    EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS,\n    EC_WORD_1_HIT_KO_EXCL,\n    EC_WORD_QUES,\n    EC_WORD_QUES_EXCL,\n};\n\nstatic const u16 sEasyChatWordsByLetter_A[] = {\n    EC_WORD_A,\n    EC_WORD_A_LITTLE,\n    EC_WORD_A_LOT,\n    EC_WORD_A_TINY_BIT,\n    EC_WORD_ABOUT,\n    EC_WORD_ABOVE,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(ABRA),\n    EC_POKEMON(ABRA),\n    EC_WORD_ABSENT,\n    EC_POKEMON2(ABSOL),\n    EC_WORD_ABSOLUTELY,\n    EC_MOVE(ABSORB),\n    EC_WORD_ACCEPT,\n    EC_MOVE2(ACID),\n    EC_MOVE2(ACID_ARMOR),\n    EC_WORD_ADORE,\n    EC_WORD_ADULT,\n    EC_WORD_ADVENTURE,\n    EC_MOVE2(AERIAL_ACE),\n    EC_MOVE(AEROBLAST),\n    EC_POKEMON(AERODACTYL),\n    EC_WORD_AFTER,\n    EC_WORD_AGE,\n    EC_POKEMON2(AGGRON),\n    EC_MOVE(AGILITY),\n    EC_WORD_AGREE,\n    EC_WORD_AHAHA,\n    EC_WORD_AIM,\n    EC_POKEMON(AIPOM),\n    EC_MOVE(AIR_CUTTER),\n    EC_WORD_AIR_LOCK,\n    EC_WORD_AIYEEH,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(ALAKAZAM),\n    EC_POKEMON(ALAKAZAM),\n    EC_WORD_ALL,\n    EC_WORD_ALL_RIGHT,\n    EC_WORD_ALLOW,\n    EC_WORD_ALLOWANCE,\n    EC_WORD_ALLY,\n    EC_WORD_ALMOST,\n    EC_WORD_ALONE,\n    EC_WORD_ALSO,\n    EC_WORD_ALT_COLOR,\n    EC_POKEMON2(ALTARIA),\n    EC_WORD_ALTHOUGH,\n    EC_WORD_ALWAYS,\n    EC_WORD_AM,\n    EC_MOVE2(AMNESIA),\n    EC_POKEMON(AMPHAROS),\n    EC_WORD_AMUSING,\n    EC_WORD_AN,\n    EC_MOVE(ANCIENT_POWER),\n    EC_WORD_AND,\n    EC_WORD_ANGER,\n    EC_WORD_ANGERS,\n    EC_WORD_ANGRY,\n    EC_WORD_ANIME,\n    EC_POKEMON2(ANORITH),\n    EC_WORD_ANOTHER,\n    EC_WORD_ANTICIPATION,\n    EC_WORD_ANY,\n    EC_WORD_ANYWHERE,\n    EC_WORD_APOLOGIZE,\n    EC_WORD_APPEAL,\n    EC_WORD_APPEAR,\n    EC_WORD_APPEARS,\n    EC_WORD_APPRECIATE,\n    EC_WORD_APPROVED,\n    EC_POKEMON(ARBOK),\n    EC_POKEMON(ARCANINE),\n    EC_WORD_ARE,\n    EC_WORD_AREN_T,\n    EC_WORD_ARENA_TRAP,\n    EC_POKEMON(ARIADOS),\n    EC_MOVE2(ARM_THRUST),\n    EC_POKEMON2(ARMALDO),\n    EC_MOVE(AROMATHERAPY),\n    EC_POKEMON2(ARON),\n    EC_WORD_AROUND,\n    EC_WORD_ARRGH,\n    EC_POKEMON(ARTICUNO),\n    EC_WORD_AS,\n    EC_WORD_AS_IF,\n    EC_WORD_AS_MUCH_AS,\n    EC_MOVE2(ASSIST),\n    EC_MOVE(ASTONISH),\n    EC_WORD_AT,\n    EC_WORD_ATTACK,\n    EC_MOVE2(ATTRACT),\n    EC_WORD_AUNT,\n    EC_MOVE(AURORA_BEAM),\n    EC_WORD_AVANT_GARDE,\n    EC_WORD_AWAY,\n    EC_WORD_AWESOME,\n    EC_WORD_AWFUL,\n    EC_WORD_AWFULLY,\n    EC_WORD_AWW,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(AZUMARILL),\n    EC_POKEMON(AZUMARILL),\n    EC_POKEMON2(AZURILL),\n};\n\nstatic const u16 sEasyChatWordsByLetter_B[] = {\n    EC_WORD_BABE,\n    EC_WORD_BABY,\n    EC_WORD_BACK,\n    EC_WORD_BAD,\n    EC_WORD_BADLY,\n    EC_WORD_BAG,\n    EC_POKEMON2(BAGON),\n    EC_WORD_BALL,\n    EC_POKEMON2(BALTOY),\n    EC_POKEMON2(BANETTE),\n    EC_WORD_BANG,\n    EC_POKEMON2(BARBOACH),\n    EC_MOVE2(BARRAGE),\n    EC_MOVE2(BARRIER),\n    EC_WORD_BATH,\n    EC_MOVE2(BATON_PASS),\n    EC_WORD_BATTLE,\n    EC_WORD_BATTLE_ARMOR,\n    EC_WORD_BATTLE_ROOM,\n    EC_WORD_BATTLE_TOWER,\n    EC_POKEMON(BAYLEEF),\n    EC_WORD_BE,\n    EC_WORD_BEAT,\n    EC_MOVE2(BEAT_UP),\n    EC_POKEMON2(BEAUTIFLY),\n    EC_WORD_BEAUTIFUL,\n    EC_WORD_BEAUTY,\n    EC_WORD_BECOMES,\n    EC_POKEMON(BEEDRILL),\n    EC_WORD_BEEN,\n    EC_WORD_BEFORE,\n    EC_WORD_BEGINNING,\n    EC_WORD_BEING,\n    EC_POKEMON2(BELDUM),\n    EC_WORD_BELIEVE,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(BELLOSSOM),\n    EC_POKEMON(BELLOSSOM),\n    EC_POKEMON(BELLSPROUT),\n    EC_MOVE2(BELLY_DRUM),\n    EC_WORD_BELONGS_TO,\n    EC_WORD_BELOW,\n    EC_WORD_BERRY,\n    EC_WORD_BESIDE,\n    EC_WORD_BEST,\n    EC_WORD_BETTER,\n    EC_MOVE(BIDE),\n    EC_WORD_BIG,\n    EC_WORD_BIKE,\n    EC_MOVE(BIND),\n    EC_MOVE(BITE),\n    EC_MOVE2(BLAST_BURN),\n    EC_POKEMON(BLASTOISE),\n    EC_WORD_BLAZE,\n    EC_MOVE2(BLAZE_KICK),\n    EC_POKEMON2(BLAZIKEN),\n    EC_WORD_BLEND,\n    EC_POKEMON(BLISSEY),\n    EC_MOVE2(BLIZZARD),\n    EC_MOVE2(BLOCK),\n    EC_WORD_BOARD,\n    EC_MOVE2(BODY_SLAM),\n    EC_MOVE2(BONE_CLUB),\n    EC_MOVE2(BONE_RUSH),\n    EC_MOVE2(BONEMERANG),\n    EC_WORD_BOOK,\n    EC_WORD_BORED,\n    EC_WORD_BORING,\n    EC_MOVE2(BOUNCE),\n    EC_WORD_BOY,\n    EC_WORD_BRAG,\n    EC_WORD_BREAK,\n    EC_POKEMON2(BRELOOM),\n    EC_MOVE(BRICK_BREAK),\n    EC_WORD_BROTHER,\n    EC_MOVE(BUBBLE),\n    EC_MOVE2(BUBBLE_BEAM),\n    EC_WORD_BUG,\n    EC_POKEMON(BULBASAUR),\n    EC_MOVE2(BULK_UP),\n    EC_MOVE2(BULLET_SEED),\n    EC_WORD_BUSY,\n    EC_WORD_BUT,\n    EC_POKEMON(BUTTERFREE),\n    EC_WORD_BYE_BYE,\n};\n\nstatic const u16 sEasyChatWordsByLetter_C[] = {\n    EC_POKEMON2(CACNEA),\n    EC_POKEMON2(CACTURNE),\n    EC_MOVE2(CALM_MIND),\n    EC_WORD_CAME,\n    EC_WORD_CAMERA,\n    EC_POKEMON2(CAMERUPT),\n    EC_MOVE2(CAMOUFLAGE),\n    EC_WORD_CAN,\n    EC_WORD_CAN_WIN,\n    EC_WORD_CAN_T,\n    EC_WORD_CAN_T_WIN,\n    EC_WORD_CANCEL,\n    EC_WORD_CAPABLE,\n    EC_WORD_CARDS,\n    EC_WORD_CARE,\n    EC_WORD_CARES,\n    EC_POKEMON2(CARVANHA),\n    EC_POKEMON2(CASCOON),\n    EC_WORD_CASE,\n    EC_POKEMON2(CASTFORM),\n    EC_POKEMON(CATERPIE),\n    EC_WORD_CAUSE,\n    EC_POKEMON(CELEBI),\n    EC_WORD_CENTER,\n    EC_WORD_CHALLENGE,\n    EC_WORD_CHANGE,\n    EC_WORD_CHANNEL,\n    EC_POKEMON(CHANSEY),\n    EC_MOVE(CHARGE),\n    EC_POKEMON(CHARIZARD),\n    EC_MOVE(CHARM),\n    EC_POKEMON(CHARMANDER),\n    EC_POKEMON(CHARMELEON),\n    EC_WORD_CHAT,\n    EC_POKEMON(CHIKORITA),\n    EC_WORD_CHILD_S_PLAY,\n    EC_WORD_CHILDREN,\n    EC_POKEMON2(CHIMECHO),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(CHINCHOU),\n    EC_POKEMON(CHINCHOU),\n    EC_WORD_CHLOROPHYLL,\n    EC_WORD_CHOICE,\n    EC_WORD_CHOOSE,\n    EC_WORD_CHORES,\n    EC_MOVE(CLAMP),\n    EC_POKEMON2(CLAMPERL),\n    EC_WORD_CLASS,\n    EC_POKEMON2(CLAYDOL),\n    EC_WORD_CLEAR_BODY,\n    EC_POKEMON(CLEFABLE),\n    EC_POKEMON(CLEFAIRY),\n    EC_POKEMON(CLEFFA),\n    EC_WORD_CLOSE,\n    EC_WORD_CLOUD_NINE,\n    EC_POKEMON(CLOYSTER),\n    EC_WORD_COLD,\n    EC_WORD_COLLECT,\n    EC_WORD_COLLECTION,\n    EC_WORD_COLOR,\n    EC_WORD_COLOR_CHANGE,\n    EC_POKEMON2(COMBUSKEN),\n    EC_WORD_COME,\n    EC_WORD_COME_ON,\n    EC_WORD_COME_OVER,\n    EC_MOVE2(COMET_PUNCH),\n    EC_WORD_COMICS,\n    EC_WORD_COMMEMORATE,\n    EC_WORD_COMPLETE,\n    EC_WORD_COMPOUNDEYES,\n    EC_WORD_CONCEDE,\n    EC_MOVE(CONFUSE_RAY),\n    EC_WORD_CONFUSED,\n    EC_MOVE2(CONFUSION),\n    EC_WORD_CONGRATS,\n    EC_MOVE(CONSTRICT),\n    EC_WORD_CONTEST,\n    EC_WORD_CONVERSATION,\n    EC_MOVE2(CONVERSION),\n    EC_MOVE2(CONVERSION_2),\n    EC_WORD_COOL,\n    EC_WORD_COOLNESS,\n    EC_POKEMON2(CORPHISH),\n    EC_WORD_CORRECT,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(CORSOLA),\n    EC_POKEMON(CORSOLA),\n    EC_MOVE(COSMIC_POWER),\n    EC_MOVE2(COTTON_SPORE),\n    EC_WORD_COULD,\n    EC_WORD_COULDN_T,\n    EC_WORD_COUNT_ON,\n    EC_MOVE(COUNTER),\n    EC_WORD_COUPLE,\n    EC_MOVE2(COVET),\n    EC_MOVE(CRABHAMMER),\n    EC_POKEMON2(CRADILY),\n    EC_POKEMON2(CRAWDAUNT),\n    EC_WORD_CRIES,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(CROBAT),\n    EC_POKEMON(CROBAT),\n    EC_POKEMON(CROCONAW),\n    EC_MOVE(CROSS_CHOP),\n    EC_MOVE(CRUNCH),\n    EC_WORD_CRUSH,\n    EC_MOVE2(CRUSH_CLAW),\n    EC_WORD_CRY,\n    EC_POKEMON(CUBONE),\n    EC_WORD_CURRENT,\n    EC_MOVE2(CURSE),\n    EC_MOVE(CUT),\n    EC_WORD_CUTE,\n    EC_WORD_CUTE_CHARM,\n    EC_WORD_CUTENESS,\n    EC_POKEMON(CYNDAQUIL),\n};\n\nstatic const u16 sEasyChatWordsByLetter_D[] = {\n    EC_WORD_DAILY,\n    EC_WORD_DAMP,\n    EC_WORD_DANCE,\n    EC_WORD_DANGER,\n    EC_WORD_DARK,\n    EC_WORD_DARN,\n    EC_WORD_DATE,\n    EC_WORD_DAUGHTER,\n    EC_WORD_DAY,\n    EC_WORD_DAYS,\n    EC_WORD_DAYTIME,\n    EC_WORD_DECIDE,\n    EC_WORD_DECIDED,\n    EC_WORD_DEEP,\n    EC_WORD_DEFEATED,\n    EC_MOVE2(DEFENSE_CURL),\n    EC_POKEMON2(DELCATTY),\n    EC_POKEMON(DELIBIRD),\n    EC_POKEMON2(DEOXYS),\n    EC_WORD_DEPT_STORE,\n    EC_WORD_DESIGN,\n    EC_WORD_DESTINY,\n    EC_MOVE2(DESTINY_BOND),\n    EC_WORD_DESTROYED,\n    EC_MOVE2(DETECT),\n    EC_POKEMON(DEWGONG),\n    EC_WORD_DID,\n    EC_WORD_DIDN_T,\n    EC_WORD_DIET,\n    EC_WORD_DIFFERENT,\n    EC_MOVE(DIG),\n    EC_WORD_DIGITAL,\n    EC_POKEMON(DIGLETT),\n    EC_WORD_DIRECT,\n    EC_MOVE(DISABLE),\n    EC_WORD_DISAPPEAR,\n    EC_WORD_DISAPPOINT,\n    EC_WORD_DISAPPOINTED,\n    EC_WORD_DISAPPOINTS,\n    EC_WORD_DISASTER,\n    EC_WORD_DISLIKE,\n    EC_WORD_DISLIKES,\n    EC_POKEMON(DITTO),\n    EC_MOVE2(DIVE),\n    EC_MOVE2(DIZZY_PUNCH),\n    EC_WORD_DO,\n    EC_WORD_DOCILE,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(DODRIO),\n    EC_POKEMON(DODRIO),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(DODUO),\n    EC_POKEMON(DODUO),\n    EC_WORD_DOES,\n    EC_WORD_DOESN_T,\n    EC_WORD_DON_T,\n    EC_WORD_DONE,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(DONPHAN),\n    EC_POKEMON(DONPHAN),\n    EC_MOVE2(DOOM_DESIRE),\n    EC_MOVE2(DOUBLE_KICK),\n    EC_MOVE(DOUBLE_TEAM),\n    EC_MOVE(DOUBLE_EDGE),\n    EC_MOVE(DOUBLE_SLAP),\n    EC_WORD_DOWN,\n    EC_WORD_DOWNCAST,\n    EC_WORD_DRAGON,\n    EC_MOVE2(DRAGON_CLAW),\n    EC_MOVE2(DRAGON_DANCE),\n    EC_MOVE2(DRAGON_RAGE),\n    EC_POKEMON(DRAGONAIR),\n    EC_MOVE2(DRAGON_BREATH),\n    EC_POKEMON(DRAGONITE),\n    EC_POKEMON(DRATINI),\n    EC_WORD_DREAM,\n    EC_MOVE2(DREAM_EATER),\n    EC_MOVE2(DRILL_PECK),\n    EC_WORD_DRINK,\n    EC_WORD_DRINKS,\n    EC_WORD_DRIZZLE,\n    EC_WORD_DROOLING,\n    EC_WORD_DROUGHT,\n    EC_POKEMON(DROWZEE),\n    EC_WORD_DUDE,\n    EC_POKEMON(DUGTRIO),\n    EC_POKEMON(DUNSPARCE),\n    EC_POKEMON2(DUSCLOPS),\n    EC_POKEMON2(DUSKULL),\n    EC_POKEMON2(DUSTOX),\n    EC_MOVE2(DYNAMIC_PUNCH),\n};\n\nstatic const u16 sEasyChatWordsByLetter_E[] = {\n    EC_WORD_EARLIER,\n    EC_WORD_EARLY_BIRD,\n    EC_MOVE(EARTHQUAKE),\n    EC_WORD_EASY,\n    EC_WORD_EAT,\n    EC_WORD_EATS,\n    EC_WORD_EEK,\n    EC_POKEMON(EEVEE),\n    EC_WORD_EFFECT_SPORE,\n    EC_WORD_EGG,\n    EC_MOVE2(EGG_BOMB),\n    EC_WORD_EH_QUES,\n    EC_WORD_EHEHE,\n    EC_POKEMON(EKANS),\n    EC_POKEMON(ELECTABUZZ),\n    EC_WORD_ELECTRIC,\n    EC_POKEMON2(ELECTRIKE),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(ELECTRODE),\n    EC_POKEMON(ELECTRODE),\n    EC_POKEMON(ELEKID),\n    EC_WORD_ELSE,\n    EC_MOVE2(EMBER),\n    EC_MOVE(ENCORE),\n    EC_WORD_ENCYCLOPEDIA,\n    EC_WORD_END,\n    EC_MOVE(ENDEAVOR),\n    EC_MOVE(ENDURE),\n    EC_WORD_ENJOY,\n    EC_WORD_ENJOYS,\n    EC_WORD_ENOUGH,\n    EC_POKEMON(ENTEI),\n    EC_WORD_ENTERTAINING,\n    EC_MOVE2(ERUPTION),\n    EC_WORD_ESCAPE,\n    EC_POKEMON(ESPEON),\n    EC_WORD_EVEN_SO,\n    EC_WORD_EVENT,\n    EC_WORD_EVENTS,\n    EC_WORD_EVER,\n    EC_WORD_EVERY,\n    EC_WORD_EVOLUTION,\n    EC_WORD_EVOLVE,\n    EC_WORD_EXCELLENT,\n    EC_WORD_EXCESS,\n    EC_WORD_EXCITE,\n    EC_WORD_EXCITING,\n    EC_WORD_EXCUSE,\n    EC_WORD_EXCUSE_ME,\n    EC_POKEMON(EXEGGCUTE),\n    EC_POKEMON(EXEGGUTOR),\n    EC_WORD_EXISTS,\n    EC_WORD_EXPENSIVE,\n    EC_MOVE2(EXPLOSION),\n    EC_POKEMON2(EXPLOUD),\n    EC_MOVE(EXTRASENSORY),\n    EC_MOVE(EXTREME_SPEED),\n};\n\nstatic const u16 sEasyChatWordsByLetter_F[] = {\n    EC_WORD_FABULOUS,\n    EC_MOVE(FACADE),\n    EC_WORD_FAINT,\n    EC_MOVE2(FAINT_ATTACK),\n    EC_WORD_FAINTED,\n    EC_MOVE2(FAKE_OUT),\n    EC_MOVE(FAKE_TEARS),\n    EC_WORD_FALL,\n    EC_MOVE2(FALSE_SWIPE),\n    EC_WORD_FAMILY,\n    EC_WORD_FANTASTIC,\n    EC_WORD_FAR,\n    EC_POKEMON(FARFETCHD),\n    EC_WORD_FASHION,\n    EC_WORD_FAST,\n    EC_WORD_FATHER,\n    EC_WORD_FEAR,\n    EC_POKEMON(FEAROW),\n    EC_MOVE2(FEATHER_DANCE),\n    EC_POKEMON2(FEEBAS),\n    EC_WORD_FEELING,\n    EC_POKEMON(FERALIGATR),\n    EC_WORD_FESTIVAL,\n    EC_WORD_FEVER,\n    EC_WORD_FIERY,\n    EC_WORD_FIGHT,\n    EC_WORD_FIGHTING,\n    EC_WORD_FIGHTS,\n    EC_WORD_FINAL,\n    EC_WORD_FINALLY,\n    EC_WORD_FINISH,\n    EC_WORD_FIRE,\n    EC_MOVE2(FIRE_BLAST),\n    EC_MOVE2(FIRE_PUNCH),\n    EC_MOVE2(FIRE_SPIN),\n    EC_WORD_FISHING,\n    EC_MOVE(FISSURE),\n    EC_POKEMON(FLAAFFY),\n    EC_MOVE(FLAIL),\n    EC_WORD_FLAME,\n    EC_WORD_FLAME_BODY,\n    EC_MOVE(FLAME_WHEEL),\n    EC_MOVE(FLAMETHROWER),\n    EC_POKEMON(FLAREON),\n    EC_MOVE2(FLASH),\n    EC_WORD_FLASH_FIRE,\n    EC_WORD_FLATTEN,\n    EC_MOVE(FLATTER),\n    EC_WORD_FLOWERS,\n    EC_MOVE(FLY),\n    EC_POKEMON2(FLYGON),\n    EC_WORD_FLYING,\n    EC_MOVE(FOCUS_ENERGY),\n    EC_MOVE(FOCUS_PUNCH),\n    EC_WORD_FOE,\n    EC_MOVE(FOLLOW_ME),\n    EC_WORD_FOR,\n    EC_WORD_FOR_NOW,\n    EC_WORD_FORECAST,\n    EC_MOVE2(FORESIGHT),\n    EC_WORD_FOREVER,\n    EC_WORD_FORGET,\n    EC_WORD_FORGETS,\n    EC_WORD_FORGIVE,\n    EC_POKEMON(FORRETRESS),\n    EC_MOVE2(FRENZY_PLANT),\n    EC_WORD_FRIDAY,\n    EC_WORD_FRIEND,\n    EC_WORD_FROM,\n    EC_WORD_FRONT,\n    EC_MOVE2(FRUSTRATION),\n    EC_WORD_FUFUFU,\n    EC_WORD_FULL,\n    EC_WORD_FUNNY,\n    EC_POKEMON(FURRET),\n    EC_MOVE2(FURY_ATTACK),\n    EC_MOVE2(FURY_CUTTER),\n    EC_MOVE2(FURY_SWIPES),\n    EC_MOVE2(FUTURE_SIGHT),\n};\n\nstatic const u16 sEasyChatWordsByLetter_G[] = {\n    EC_WORD_GAME,\n    EC_POKEMON2(GARDEVOIR),\n    EC_POKEMON(GASTLY),\n    EC_POKEMON(GENGAR),\n    EC_WORD_GENIUS,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(GEODUDE),\n    EC_POKEMON(GEODUDE),\n    EC_WORD_GET,\n    EC_WORD_GETS,\n    EC_WORD_GHOST,\n    EC_WORD_GIDDY,\n    EC_MOVE(GIGA_DRAIN),\n    EC_WORD_GIGGLE,\n    EC_WORD_GIMME,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(GIRAFARIG),\n    EC_POKEMON(GIRAFARIG),\n    EC_WORD_GIRL,\n    EC_WORD_GIVE,\n    EC_WORD_GIVE_ME,\n    EC_WORD_GIVE_UP,\n    EC_WORD_GIVES,\n    EC_POKEMON2(GLALIE),\n    EC_MOVE2(GLARE),\n    EC_POKEMON(GLIGAR),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(GLOOM),\n    EC_POKEMON(GLOOM),\n    EC_WORD_GO,\n    EC_WORD_GO_AHEAD,\n    EC_WORD_GO_EASY,\n    EC_WORD_GO_HOME,\n    EC_WORD_GOES,\n    EC_WORD_GOING,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(GOLBAT),\n    EC_POKEMON(GOLBAT),\n    EC_WORD_GOLD,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(GOLDEEN),\n    EC_POKEMON(GOLDEEN),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(GOLDUCK),\n    EC_POKEMON(GOLDUCK),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(GOLEM),\n    EC_POKEMON(GOLEM),\n    EC_WORD_GOOD,\n    EC_WORD_GOOD_BYE,\n    EC_POKEMON2(GOREBYSS),\n    EC_WORD_GOT,\n    EC_WORD_GOTCHA,\n    EC_WORD_GOURMET,\n    EC_WORD_GRAAAH,\n    EC_POKEMON(GRANBULL),\n    EC_WORD_GRANDFATHER,\n    EC_WORD_GRANDMOTHER,\n    EC_WORD_GRASS,\n    EC_MOVE(GRASS_WHISTLE),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(GRAVELER),\n    EC_POKEMON(GRAVELER),\n    EC_WORD_GREAT,\n    EC_WORD_GREEN,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(GRIMER),\n    EC_POKEMON(GRIMER),\n    EC_POKEMON2(GROUDON),\n    EC_WORD_GROUND,\n    EC_WORD_GROUP,\n    EC_POKEMON2(GROVYLE),\n    EC_MOVE2(GROWL),\n    EC_POKEMON(GROWLITHE),\n    EC_MOVE(GROWTH),\n    EC_MOVE(GRUDGE),\n    EC_POKEMON2(GRUMPIG),\n    EC_WORD_GUARD,\n    EC_MOVE2(GUILLOTINE),\n    EC_POKEMON2(GULPIN),\n    EC_MOVE(GUST),\n    EC_WORD_GUTS,\n    EC_WORD_GUTSY,\n    EC_WORD_GWAH,\n    EC_WORD_GWAHAHAHA,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(GYARADOS),\n    EC_POKEMON(GYARADOS),\n};\n\nstatic const u16 sEasyChatWordsByLetter_H[] = {\n    EC_WORD_HABIT,\n    EC_WORD_HAH,\n    EC_WORD_HAHAHA,\n    EC_MOVE(HAIL),\n    EC_WORD_HALL_OF_FAME,\n    EC_WORD_HAPPENING,\n    EC_WORD_HAPPILY,\n    EC_WORD_HAPPINESS,\n    EC_WORD_HAPPY,\n    EC_WORD_HARD,\n    EC_MOVE(HARDEN),\n    EC_POKEMON2(HARIYAMA),\n    EC_WORD_HAS,\n    EC_WORD_HASSLE,\n    EC_POKEMON(HAUNTER),\n    EC_WORD_HAVE,\n    EC_WORD_HAVEN_T,\n    EC_MOVE(HAZE),\n    EC_WORD_HE,\n    EC_WORD_HE_S,\n    EC_MOVE(HEADBUTT),\n    EC_MOVE(HEAL_BELL),\n    EC_WORD_HEALTHY,\n    EC_WORD_HEAR,\n    EC_WORD_HEARING,\n    EC_WORD_HEARS,\n    EC_WORD_HEART,\n    EC_MOVE2(HEAT_WAVE),\n    EC_WORD_HEH,\n    EC_WORD_HEHE,\n    EC_WORD_HEHEHE,\n    EC_WORD_HELLO,\n    EC_MOVE2(HELPING_HAND),\n    EC_WORD_HER,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(HERACROSS),\n    EC_POKEMON(HERACROSS),\n    EC_WORD_HERE,\n    EC_WORD_HERE_GOES,\n    EC_WORD_HERE_I_COME,\n    EC_WORD_HERE_IT_IS,\n    EC_WORD_HERO,\n    EC_WORD_HEROINE,\n    EC_WORD_HERS,\n    EC_WORD_HEY,\n    EC_WORD_HEY_THERE,\n    EC_WORD_HEY_QUES,\n    EC_WORD_HI,\n    EC_MOVE2(HI_JUMP_KICK),\n    EC_WORD_HIDDEN,\n    EC_MOVE2(HIDDEN_POWER),\n    EC_WORD_HIGH,\n    EC_WORD_HIGHS,\n    EC_WORD_HIM,\n    EC_WORD_HIP_AND,\n    EC_WORD_HIS,\n    EC_WORD_HIT,\n    EC_POKEMON(HITMONCHAN),\n    EC_POKEMON(HITMONLEE),\n    EC_POKEMON(HITMONTOP),\n    EC_WORD_HIYAH,\n    EC_WORD_HMM,\n    EC_POKEMON(HO_OH),\n    EC_WORD_HOBBY,\n    EC_WORD_HOHOHO,\n    EC_WORD_HOLIDAY,\n    EC_WORD_HOME,\n    EC_WORD_HOO_HAH,\n    EC_POKEMON(HOOTHOOT),\n    EC_WORD_HOPELESS,\n    EC_POKEMON(HOPPIP),\n    EC_MOVE2(HORN_ATTACK),\n    EC_MOVE2(HORN_DRILL),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(HORSEA),\n    EC_POKEMON(HORSEA),\n    EC_WORD_HOT,\n    EC_POKEMON(HOUNDOOM),\n    EC_POKEMON(HOUNDOUR),\n    EC_WORD_HOW,\n    EC_WORD_HOW_DO,\n    EC_WORD_HOWEVER,\n    EC_MOVE2(HOWL),\n    EC_WORD_HUGE_POWER,\n    EC_WORD_HUH_QUES,\n    EC_WORD_HUMPH,\n    EC_WORD_HUNGRY,\n    EC_POKEMON2(HUNTAIL),\n    EC_WORD_HURRIED,\n    EC_WORD_HUSTLE,\n    EC_MOVE2(HYDRO_CANNON),\n    EC_MOVE2(HYDRO_PUMP),\n    EC_WORD_HYPER,\n    EC_MOVE2(HYPER_BEAM),\n    EC_WORD_HYPER_CUTTER,\n    EC_MOVE2(HYPER_FANG),\n    EC_MOVE2(HYPER_VOICE),\n    EC_POKEMON(HYPNO),\n    EC_MOVE(HYPNOSIS),\n};\n\nstatic const u16 sEasyChatWordsByLetter_I[] = {\n    EC_WORD_I,\n    EC_WORD_I_AM,\n    EC_WORD_I_CHOOSE_YOU,\n    EC_WORD_I_WAS,\n    EC_WORD_I_VE,\n    EC_WORD_I_VE_ARRIVED,\n    EC_WORD_ICE,\n    EC_MOVE(ICE_BALL),\n    EC_MOVE2(ICE_BEAM),\n    EC_MOVE2(ICE_PUNCH),\n    EC_MOVE2(ICICLE_SPEAR),\n    EC_MOVE(ICY_WIND),\n    EC_WORD_IDOL,\n    EC_WORD_IF,\n    EC_WORD_IF_I_LOSE,\n    EC_WORD_IF_I_WIN,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(IGGLYBUFF),\n    EC_POKEMON(IGGLYBUFF),\n    EC_WORD_IGNORANT,\n    EC_WORD_ILLUMINATE,\n    EC_POKEMON2(ILLUMISE),\n    EC_WORD_IMMUNITY,\n    EC_WORD_IMPORTANT,\n    EC_WORD_IMPOSSIBLE,\n    EC_MOVE2(IMPRISON),\n    EC_WORD_IN,\n    EC_WORD_INCREASING,\n    EC_WORD_INCREDIBLE,\n    EC_WORD_INFORMATION,\n    EC_MOVE2(INGRAIN),\n    EC_WORD_INNER_FOCUS,\n    EC_WORD_INSIDE,\n    EC_WORD_INSOMNIA,\n    EC_WORD_INSTEAD,\n    EC_WORD_INTIMIDATE,\n    EC_WORD_INVINCIBLE,\n    EC_MOVE2(IRON_DEFENSE),\n    EC_MOVE(IRON_TAIL),\n    EC_WORD_IS,\n    EC_WORD_IS_IT_QUES,\n    EC_WORD_ISN_T,\n    EC_WORD_ISN_T_IT_QUES,\n    EC_WORD_IT,\n    EC_WORD_IT_S,\n    EC_WORD_ITEM,\n    EC_POKEMON(IVYSAUR),\n};\n\nstatic const u16 sEasyChatWordsByLetter_J[] = {\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(JIGGLYPUFF),\n    EC_POKEMON(JIGGLYPUFF),\n    EC_POKEMON2(JIRACHI),\n    EC_WORD_JOKING,\n    EC_POKEMON(JOLTEON),\n    EC_WORD_JOY,\n    EC_WORD_JUDGE,\n    EC_MOVE2(JUMP_KICK),\n    EC_POKEMON(JUMPLUFF),\n    EC_WORD_JUST,\n    EC_POKEMON(JYNX),\n};\n\nstatic const u16 sEasyChatWordsByLetter_K[] = {\n    EC_POKEMON(KABUTO),\n    EC_POKEMON(KABUTOPS),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(KADABRA),\n    EC_POKEMON(KADABRA),\n    EC_POKEMON(KAKUNA),\n    EC_POKEMON(KANGASKHAN),\n    EC_MOVE(KARATE_CHOP),\n    EC_POKEMON2(KECLEON),\n    EC_WORD_KEEN_EYE,\n    EC_WORD_KID,\n    EC_WORD_KIDDING,\n    EC_WORD_KIND,\n    EC_WORD_KINDERGARTEN,\n    EC_MOVE(KINESIS),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(KINGDRA),\n    EC_POKEMON(KINGDRA),\n    EC_POKEMON(KINGLER),\n    EC_POKEMON2(KIRLIA),\n    EC_MOVE2(KNOCK_OFF),\n    EC_WORD_KNOCKOUT,\n    EC_WORD_KNOW,\n    EC_WORD_KNOWS,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(KOFFING),\n    EC_POKEMON(KOFFING),\n    EC_POKEMON(KRABBY),\n    EC_WORD_KTHX_BYE,\n    EC_POKEMON2(KYOGRE),\n};\n\nstatic const u16 sEasyChatWordsByLetter_L[] = {\n    EC_WORD_LACKING,\n    EC_WORD_LACKS,\n    EC_WORD_LADY,\n    EC_POKEMON2(LAIRON),\n    EC_WORD_LALALA,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(LANTURN),\n    EC_POKEMON(LANTURN),\n    EC_POKEMON(LAPRAS),\n    EC_POKEMON(LARVITAR),\n    EC_WORD_LAST,\n    EC_WORD_LATE,\n    EC_WORD_LATER,\n    EC_POKEMON2(LATIAS),\n    EC_POKEMON2(LATIOS),\n    EC_WORD_LAVISH,\n    EC_WORD_LAY,\n    EC_WORD_LEADER,\n    EC_WORD_LEADERS,\n    EC_WORD_LEAF,\n    EC_MOVE2(LEAF_BLADE),\n    EC_WORD_LEARN,\n    EC_POKEMON(LEDIAN),\n    EC_POKEMON(LEDYBA),\n    EC_MOVE(LEECH_LIFE),\n    EC_MOVE2(LEECH_SEED),\n    EC_MOVE2(LEER),\n    EC_WORD_LEFT,\n    EC_WORD_LEGEND,\n    EC_WORD_LESS,\n    EC_WORD_LESSONS,\n    EC_WORD_LET_ME_WIN,\n    EC_WORD_LET_S,\n    EC_WORD_LETTER,\n    EC_WORD_LEVEL,\n    EC_WORD_LEVITATE,\n    EC_MOVE(LICK),\n    EC_POKEMON(LICKITUNG),\n    EC_WORD_LIE,\n    EC_WORD_LIFE,\n    EC_MOVE2(LIGHT_SCREEN),\n    EC_WORD_LIGHTNINGROD,\n    EC_WORD_LIKE,\n    EC_WORD_LIKELY_TO,\n    EC_WORD_LIKES,\n    EC_POKEMON2(LILEEP),\n    EC_WORD_LIMBER,\n    EC_WORD_LINK,\n    EC_POKEMON2(LINOONE),\n    EC_WORD_LIQUID_OOZE,\n    EC_WORD_LISTEN,\n    EC_WORD_LISTENING,\n    EC_WORD_LISTENS,\n    EC_WORD_LIVING,\n    EC_MOVE2(LOCK_ON),\n    EC_WORD_LOCOMOTIVE,\n    EC_WORD_LOL,\n    EC_WORD_LOLLING,\n    EC_POKEMON2(LOMBRE),\n    EC_WORD_LONESOME,\n    EC_WORD_LOOK,\n    EC_WORD_LOOKS,\n    EC_WORD_LOSE,\n    EC_WORD_LOSER,\n    EC_WORD_LOSING,\n    EC_WORD_LOSS,\n    EC_WORD_LOST,\n    EC_POKEMON2(LOTAD),\n    EC_POKEMON2(LOUDRED),\n    EC_WORD_LOUSY,\n    EC_MOVE(LOVELY_KISS),\n    EC_WORD_LOVEY_DOVEY,\n    EC_WORD_LOW,\n    EC_MOVE(LOW_KICK),\n    EC_WORD_LOWS,\n    EC_POKEMON2(LUDICOLO),\n    EC_POKEMON(LUGIA),\n    EC_WORD_LUKEWARM,\n    EC_POKEMON2(LUNATONE),\n    EC_MOVE2(LUSTER_PURGE),\n    EC_POKEMON2(LUVDISC),\n};\n\nstatic const u16 sEasyChatWordsByLetter_M[] = {\n    EC_MOVE2(MACH_PUNCH),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(MACHAMP),\n    EC_POKEMON(MACHAMP),\n    EC_WORD_MACHINE,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(MACHOKE),\n    EC_POKEMON(MACHOKE),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(MACHOP),\n    EC_POKEMON(MACHOP),\n    EC_WORD_MAGAZINE,\n    EC_POKEMON(MAGBY),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(MAGCARGO),\n    EC_POKEMON(MAGCARGO),\n    EC_MOVE2(MAGIC_COAT),\n    EC_MOVE2(MAGICAL_LEAF),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(MAGIKARP),\n    EC_POKEMON(MAGIKARP),\n    EC_WORD_MAGMA_ARMOR,\n    EC_POKEMON(MAGMAR),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(MAGNEMITE),\n    EC_POKEMON(MAGNEMITE),\n    EC_WORD_MAGNET_PULL,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(MAGNETON),\n    EC_POKEMON(MAGNETON),\n    EC_MOVE2(MAGNITUDE),\n    EC_WORD_MAIL,\n    EC_WORD_MAKE,\n    EC_WORD_MAKING,\n    EC_POKEMON2(MAKUHITA),\n    EC_WORD_MAN,\n    EC_POKEMON2(MANECTRIC),\n    EC_POKEMON(MANKEY),\n    EC_POKEMON(MANTINE),\n    EC_POKEMON(MAREEP),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(MARILL),\n    EC_POKEMON(MARILL),\n    EC_POKEMON(MAROWAK),\n    EC_POKEMON2(MARSHTOMP),\n    EC_WORD_MARVEL_SCALE,\n    EC_POKEMON2(MASQUERAIN),\n    EC_WORD_MASTER,\n    EC_WORD_MATCH,\n    EC_WORD_MATCH_UP,\n    EC_POKEMON2(MAWILE),\n    EC_WORD_MAYBE,\n    EC_WORD_MC,\n    EC_WORD_ME,\n    EC_WORD_MEAN,\n    EC_MOVE(MEAN_LOOK),\n    EC_POKEMON2(MEDICHAM),\n    EC_MOVE2(MEDITATE),\n    EC_POKEMON2(MEDITITE),\n    EC_WORD_MEET,\n    EC_WORD_MEET_YOU,\n    EC_WORD_MEETS,\n    EC_WORD_MEGA,\n    EC_MOVE2(MEGA_DRAIN),\n    EC_MOVE2(MEGA_KICK),\n    EC_MOVE2(MEGA_PUNCH),\n    EC_MOVE2(MEGAHORN),\n    EC_POKEMON(MEGANIUM),\n    EC_MOVE(MEMENTO),\n    EC_POKEMON(MEOWTH),\n    EC_WORD_MESSAGE,\n    EC_POKEMON2(METAGROSS),\n    EC_MOVE2(METAL_CLAW),\n    EC_MOVE(METAL_SOUND),\n    EC_POKEMON2(METANG),\n    EC_POKEMON(METAPOD),\n    EC_MOVE(METEOR_MASH),\n    EC_MOVE2(METRONOME),\n    EC_POKEMON(MEW),\n    EC_POKEMON(MEWTWO),\n    EC_POKEMON2(MIGHTYENA),\n    EC_MOVE2(MILK_DRINK),\n    EC_POKEMON2(MILOTIC),\n    EC_POKEMON(MILTANK),\n    EC_MOVE2(MIMIC),\n    EC_MOVE(MIND_READER),\n    EC_MOVE2(MINIMIZE),\n    EC_POKEMON2(MINUN),\n    EC_WORD_MINUS,\n    EC_MOVE2(MIRROR_COAT),\n    EC_MOVE(MIRROR_MOVE),\n    EC_POKEMON(MISDREAVUS),\n    EC_WORD_MISHEARD,\n    EC_WORD_MISS,\n    EC_MOVE(MIST),\n    EC_MOVE2(MIST_BALL),\n    EC_WORD_MISTAKE,\n    EC_WORD_MMM,\n    EC_WORD_MODE,\n    EC_WORD_MODERN,\n    EC_POKEMON(MOLTRES),\n    EC_WORD_MOMENTUM,\n    EC_WORD_MONDAY,\n    EC_WORD_MONEY,\n    EC_WORD_MONTH,\n    EC_WORD_MOOD,\n    EC_MOVE2(MOONLIGHT),\n    EC_WORD_MORE,\n    EC_WORD_MORNING,\n    EC_MOVE(MORNING_SUN),\n    EC_WORD_MOTHER,\n    EC_WORD_MOVE,\n    EC_WORD_MOVIE,\n    EC_WORD_MR,\n    EC_POKEMON(MR_MIME),\n    EC_WORD_MRS,\n    EC_WORD_MUCH,\n    EC_WORD_MUCH_OBLIGED,\n    EC_MOVE2(MUD_SHOT),\n    EC_MOVE2(MUD_SPORT),\n    EC_MOVE2(MUD_SLAP),\n    EC_MOVE2(MUDDY_WATER),\n    EC_POKEMON2(MUDKIP),\n    EC_WORD_MUFUFU,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(MUK),\n    EC_POKEMON(MUK),\n    EC_POKEMON(MURKROW),\n    EC_WORD_MUSIC,\n    EC_WORD_MUST_BE,\n    EC_WORD_MY,\n    EC_WORD_MYSELF,\n    EC_WORD_MYSTERY,\n};\n\nstatic const u16 sEasyChatWordsByLetter_N[] = {\n    EC_WORD_NAME,\n    EC_WORD_NAP,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(NATU),\n    EC_POKEMON(NATU),\n    EC_WORD_NATURAL,\n    EC_WORD_NATURAL_CURE,\n    EC_WORD_NATURALLY,\n    EC_WORD_NATURE,\n    EC_MOVE(NATURE_POWER),\n    EC_WORD_NEAR,\n    EC_WORD_NEARLY,\n    EC_WORD_NEED,\n    EC_MOVE2(NEEDLE_ARM),\n    EC_WORD_NEGATIVE,\n    EC_WORD_NEVER,\n    EC_WORD_NEW,\n    EC_WORD_NEWS,\n    EC_WORD_NEXT,\n    EC_WORD_NICE,\n    EC_POKEMON(NIDOKING),\n    EC_POKEMON(NIDOQUEEN),\n    EC_POKEMON(NIDORAN_F),\n    EC_POKEMON(NIDORAN_M),\n    EC_POKEMON(NIDORINA),\n    EC_POKEMON(NIDORINO),\n    EC_WORD_NIGHT,\n    EC_MOVE2(NIGHT_SHADE),\n    EC_MOVE(NIGHTMARE),\n    EC_WORD_NIGHTTIME,\n    EC_POKEMON2(NINCADA),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(NINETALES),\n    EC_POKEMON(NINETALES),\n    EC_POKEMON2(NINJASK),\n    EC_WORD_NITWIT,\n    EC_WORD_NO,\n    EC_WORD_NO_MATCH,\n    EC_WORD_NO_1,\n    EC_POKEMON(NOCTOWL),\n    EC_WORD_NOISY,\n    EC_WORD_NON_STOP,\n    EC_WORD_NONE,\n    EC_WORD_NOPE,\n    EC_WORD_NORMAL,\n    EC_POKEMON2(NOSEPASS),\n    EC_WORD_NOT,\n    EC_WORD_NOT_VERY,\n    EC_WORD_NOTHING,\n    EC_WORD_NOW,\n    EC_POKEMON2(NUMEL),\n    EC_POKEMON2(NUZLEAF),\n};\n\nstatic const u16 sEasyChatWordsByLetter_O[] = {\n    EC_WORD_OBLIVIOUS,\n    EC_MOVE(OCTAZOOKA),\n    EC_POKEMON(OCTILLERY),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(ODDISH),\n    EC_POKEMON(ODDISH),\n    EC_MOVE(ODOR_SLEUTH),\n    EC_WORD_OF,\n    EC_WORD_OFF,\n    EC_WORD_OFFENSIVE,\n    EC_WORD_OH,\n    EC_WORD_OH_DEAR,\n    EC_WORD_OH_YEAH,\n    EC_WORD_OH_KAY,\n    EC_WORD_OH_QUES,\n    EC_WORD_OI,\n    EC_WORD_OI_OI_OI,\n    EC_WORD_OK_QUES,\n    EC_WORD_OKAY,\n    EC_WORD_OLD,\n    EC_WORD_OLDEN,\n    EC_POKEMON(OMANYTE),\n    EC_POKEMON(OMASTAR),\n    EC_WORD_ON,\n    EC_WORD_ONCE,\n    EC_POKEMON(ONIX),\n    EC_WORD_ONLY,\n    EC_WORD_OOPS,\n    EC_WORD_OPPONENT,\n    EC_WORD_OPPOSITE,\n    EC_WORD_OR,\n    EC_WORD_OTHER,\n    EC_WORD_OUR,\n    EC_WORD_OUT,\n    EC_MOVE(OUTRAGE),\n    EC_WORD_OUTSIDE,\n    EC_WORD_OVER,\n    EC_WORD_OVERDO,\n    EC_WORD_OVERGROW,\n    EC_MOVE(OVERHEAT),\n    EC_WORD_OVERWHELMING,\n    EC_WORD_OWN,\n    EC_WORD_OWN_TEMPO,\n};\n\nstatic const u16 sEasyChatWordsByLetter_P[] = {\n    EC_MOVE(PAIN_SPLIT),\n    EC_POKEMON(PARAS),\n    EC_POKEMON(PARASECT),\n    EC_WORD_PARDON,\n    EC_WORD_PARENT,\n    EC_WORD_PARTNER,\n    EC_WORD_PARTY,\n    EC_WORD_PATTERN,\n    EC_MOVE2(PAY_DAY),\n    EC_WORD_PC,\n    EC_MOVE2(PECK),\n    EC_POKEMON2(PELIPPER),\n    EC_WORD_PERFECT,\n    EC_WORD_PERFECTION,\n    EC_MOVE2(PERISH_SONG),\n    EC_POKEMON(PERSIAN),\n    EC_WORD_PERSON,\n    EC_MOVE2(PETAL_DANCE),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(PHANPY),\n    EC_POKEMON(PHANPY),\n    EC_WORD_PHONE,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(PICHU),\n    EC_POKEMON(PICHU),\n    EC_WORD_PICKUP,\n    EC_POKEMON(PIDGEOT),\n    EC_POKEMON(PIDGEOTTO),\n    EC_POKEMON(PIDGEY),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(PIKACHU),\n    EC_POKEMON(PIKACHU),\n    EC_POKEMON(PILOSWINE),\n    EC_MOVE2(PIN_MISSILE),\n    EC_POKEMON(PINECO),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(PINSIR),\n    EC_POKEMON(PINSIR),\n    EC_WORD_PKRS,\n    EC_WORD_PLACE,\n    EC_WORD_PLANS,\n    EC_WORD_PLAY,\n    EC_WORD_PLAYED,\n    EC_WORD_PLAYS,\n    EC_WORD_PLEASE,\n    EC_WORD_PLUS,\n    EC_WORD_PLUSH_DOLL,\n    EC_POKEMON2(PLUSLE),\n    EC_WORD_POINTS,\n    EC_WORD_POISON,\n    EC_MOVE2(POISON_FANG),\n    EC_MOVE2(POISON_GAS),\n    EC_WORD_POISON_POINT,\n    EC_MOVE2(POISON_STING),\n    EC_MOVE2(POISON_TAIL),\n    EC_MOVE2(POISON_POWDER),\n    EC_WORD_POKEBLOCK,\n    EC_WORD_POKEDEX,\n    EC_WORD_POKEMON,\n    EC_WORD_POKENAV,\n    EC_POKEMON(POLITOED),\n    EC_POKEMON(POLIWAG),\n    EC_POKEMON(POLIWHIRL),\n    EC_POKEMON(POLIWRATH),\n    EC_POKEMON(PONYTA),\n    EC_POKEMON2(POOCHYENA),\n    EC_WORD_POPULAR,\n    EC_POKEMON(PORYGON),\n    EC_POKEMON(PORYGON2),\n    EC_MOVE2(POUND),\n    EC_MOVE(POWDER_SNOW),\n    EC_WORD_POWER,\n    EC_WORD_PRAISE,\n    EC_WORD_PREPOSTEROUS,\n    EC_MOVE2(PRESENT),\n    EC_WORD_PRESSURE,\n    EC_WORD_PRETEND,\n    EC_WORD_PRETTY,\n    EC_POKEMON(PRIMEAPE),\n    EC_WORD_PROBABLY,\n    EC_WORD_PROMISE,\n    EC_MOVE2(PROTECT),\n    EC_MOVE(PSYBEAM),\n    EC_MOVE(PSYCH_UP),\n    -1, 2, // Doubled pokemon species name\n    EC_WORD_PSYCHIC,\n    EC_MOVE(PSYCHIC),\n    EC_MOVE(PSYCHO_BOOST),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(PSYDUCK),\n    EC_POKEMON(PSYDUCK),\n    EC_MOVE(PSYWAVE),\n    EC_POKEMON(PUPITAR),\n    EC_WORD_PURE_POWER,\n    EC_MOVE(PURSUIT),\n    EC_WORD_PUSHOVER,\n};\n\nstatic const u16 sEasyChatWordsByLetter_Q[] = {\n    EC_POKEMON(QUAGSIRE),\n    EC_WORD_QUESTION,\n    EC_MOVE2(QUICK_ATTACK),\n    EC_POKEMON(QUILAVA),\n    EC_WORD_QUITE,\n    EC_POKEMON(QWILFISH),\n};\n\nstatic const u16 sEasyChatWordsByLetter_R[] = {\n    EC_WORD_RADIO,\n    EC_MOVE(RAGE),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(RAICHU),\n    EC_POKEMON(RAICHU),\n    EC_POKEMON(RAIKOU),\n    EC_MOVE(RAIN_DANCE),\n    EC_WORD_RAIN_DISH,\n    EC_POKEMON2(RALTS),\n    EC_WORD_RANK,\n    EC_MOVE(RAPID_SPIN),\n    EC_POKEMON(RAPIDASH),\n    EC_WORD_RARE,\n    EC_WORD_RATHER,\n    EC_POKEMON(RATICATE),\n    EC_POKEMON(RATTATA),\n    EC_POKEMON2(RAYQUAZA),\n    EC_MOVE2(RAZOR_LEAF),\n    EC_MOVE(RAZOR_WIND),\n    EC_WORD_READY,\n    EC_WORD_REALLY,\n    EC_WORD_REAR,\n    EC_WORD_RECEIVED,\n    EC_WORD_RECOMMEND,\n    EC_MOVE(RECOVER),\n    EC_MOVE2(RECYCLE),\n    EC_WORD_RED,\n    EC_MOVE2(REFLECT),\n    EC_MOVE2(REFRESH),\n    EC_WORD_REFRESHING,\n    EC_WORD_REFUSE,\n    EC_POKEMON2(REGICE),\n    EC_POKEMON2(REGIROCK),\n    EC_POKEMON2(REGISTEEL),\n    EC_WORD_REJECT,\n    EC_WORD_RELEASE,\n    EC_POKEMON2(RELICANTH),\n    EC_POKEMON(REMORAID),\n    EC_WORD_RENTAL,\n    EC_MOVE2(REST),\n    EC_WORD_RESUSCITATE,\n    EC_MOVE(RETURN),\n    EC_MOVE2(REVENGE),\n    EC_MOVE(REVERSAL),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(RHYDON),\n    EC_POKEMON(RHYDON),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(RHYHORN),\n    EC_POKEMON(RHYHORN),\n    EC_WORD_RIBBON,\n    EC_WORD_RICKETY,\n    EC_WORD_RIGHT,\n    EC_WORD_RIPPED,\n    EC_WORD_RIVAL,\n    EC_MOVE2(ROAR),\n    EC_WORD_ROCK,\n    EC_MOVE2(ROCK_BLAST),\n    EC_WORD_ROCK_HEAD,\n    EC_MOVE(ROCK_SLIDE),\n    EC_MOVE(ROCK_SMASH),\n    EC_MOVE(ROCK_THROW),\n    EC_MOVE(ROCK_TOMB),\n    EC_WORD_ROCK_SOLID,\n    EC_MOVE2(ROLE_PLAY),\n    EC_MOVE2(ROLLING_KICK),\n    EC_MOVE(ROLLOUT),\n    EC_WORD_ROMANTIC,\n    EC_WORD_ROOM,\n    EC_POKEMON2(ROSELIA),\n    EC_WORD_ROUGH_SKIN,\n    EC_WORD_RPG,\n    EC_WORD_RUBY,\n    EC_WORD_RULE,\n    EC_WORD_RUN,\n    EC_WORD_RUN_AWAY,\n    EC_WORD_RUNS,\n};\n\nstatic const u16 sEasyChatWordsByLetter_S[] = {\n    EC_POKEMON2(SABLEYE),\n    EC_MOVE(SACRED_FIRE),\n    EC_WORD_SAD,\n    EC_WORD_SADLY,\n    EC_MOVE(SAFEGUARD),\n    EC_WORD_SAID,\n    EC_POKEMON2(SALAMENCE),\n    EC_WORD_SAND_STREAM,\n    EC_MOVE(SAND_TOMB),\n    EC_WORD_SAND_VEIL,\n    EC_MOVE(SAND_ATTACK),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(SANDSHREW),\n    EC_POKEMON(SANDSHREW),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(SANDSLASH),\n    EC_POKEMON(SANDSLASH),\n    EC_MOVE(SANDSTORM),\n    EC_WORD_SAPPHIRE,\n    EC_WORD_SATISFIED,\n    EC_WORD_SATURDAY,\n    EC_WORD_SAYS,\n    EC_WORD_SCARY,\n    EC_MOVE(SCARY_FACE),\n    EC_WORD_SCATTER,\n    EC_POKEMON2(SCEPTILE),\n    EC_WORD_SCHOOL,\n    EC_POKEMON(SCIZOR),\n    EC_MOVE2(SCRATCH),\n    EC_MOVE(SCREECH),\n    EC_POKEMON(SCYTHER),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(SEADRA),\n    EC_POKEMON(SEADRA),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(SEAKING),\n    EC_POKEMON(SEAKING),\n    EC_POKEMON2(SEALEO),\n    EC_WORD_SEARCH,\n    EC_WORD_SECRET,\n    EC_WORD_SECRET_BASE,\n    EC_MOVE2(SECRET_POWER),\n    EC_WORD_SEE,\n    EC_WORD_SEE_YA,\n    EC_POKEMON2(SEEDOT),\n    EC_WORD_SEEK,\n    EC_POKEMON(SEEL),\n    EC_WORD_SEEMS,\n    EC_WORD_SEES,\n    EC_MOVE2(SEISMIC_TOSS),\n    EC_MOVE(SELF_DESTRUCT),\n    EC_WORD_SENSE,\n    EC_POKEMON(SENTRET),\n    EC_WORD_SERENE_GRACE,\n    EC_WORD_SERIOUS,\n    EC_WORD_SERIOUSLY,\n    EC_WORD_SERVICE,\n    EC_POKEMON2(SEVIPER),\n    EC_MOVE(SHADOW_BALL),\n    EC_MOVE(SHADOW_PUNCH),\n    EC_WORD_SHADOW_TAG,\n    EC_WORD_SHADY,\n    EC_WORD_SHAKE,\n    EC_WORD_SHAKY,\n    EC_WORD_SHALLOW,\n    EC_POKEMON2(SHARPEDO),\n    EC_MOVE(SHARPEN),\n    EC_WORD_SHE,\n    EC_WORD_SHE_IS,\n    EC_WORD_SHE_WAS,\n    EC_WORD_SHED_SKIN,\n    EC_POKEMON2(SHEDINJA),\n    EC_MOVE(SHEER_COLD),\n    EC_POKEMON2(SHELGON),\n    EC_WORD_SHELL_ARMOR,\n    EC_POKEMON(SHELLDER),\n    EC_WORD_SHIELD_DUST,\n    EC_POKEMON2(SHIFTRY),\n    EC_WORD_SHINE,\n    EC_MOVE2(SHOCK_WAVE),\n    EC_WORD_SHOCKED,\n    EC_WORD_SHOPPING,\n    EC_WORD_SHOULD,\n    EC_WORD_SHOW,\n    EC_WORD_SHREDDED,\n    EC_POKEMON2(SHROOMISH),\n    EC_POKEMON(SHUCKLE),\n    EC_POKEMON2(SHUPPET),\n    EC_WORD_SIBLINGS,\n    EC_WORD_SIGH,\n    EC_MOVE(SIGNAL_BEAM),\n    EC_POKEMON2(SILCOON),\n    EC_WORD_SILKY,\n    EC_WORD_SILVER,\n    EC_MOVE(SILVER_WIND),\n    EC_WORD_SIMPLE,\n    EC_WORD_SINCE,\n    EC_MOVE(SING),\n    EC_WORD_SINK,\n    EC_WORD_SISTER,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(SKARMORY),\n    EC_POKEMON(SKARMORY),\n    EC_MOVE(SKETCH),\n    EC_WORD_SKILL,\n    EC_MOVE(SKILL_SWAP),\n    EC_WORD_SKILLED,\n    EC_POKEMON(SKIPLOOM),\n    EC_POKEMON2(SKITTY),\n    EC_MOVE2(SKULL_BASH),\n    EC_MOVE(SKY_ATTACK),\n    EC_MOVE(SKY_UPPERCUT),\n    EC_MOVE2(SLACK_OFF),\n    EC_POKEMON2(SLAKING),\n    EC_POKEMON2(SLAKOTH),\n    EC_MOVE2(SLAM),\n    EC_MOVE(SLASH),\n    EC_WORD_SLEEP,\n    EC_MOVE2(SLEEP_POWDER),\n    EC_MOVE2(SLEEP_TALK),\n    EC_WORD_SLEPT,\n    EC_WORD_SLIDE,\n    EC_WORD_SLIMY,\n    EC_POKEMON(SLOWBRO),\n    EC_POKEMON(SLOWKING),\n    EC_POKEMON(SLOWPOKE),\n    EC_MOVE2(SLUDGE),\n    EC_MOVE2(SLUDGE_BOMB),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(SLUGMA),\n    EC_POKEMON(SLUGMA),\n    EC_WORD_SMACK,\n    EC_WORD_SMALL,\n    EC_WORD_SMART,\n    EC_WORD_SMARTNESS,\n    EC_POKEMON(SMEARGLE),\n    EC_WORD_SMELL,\n    EC_WORD_SMELL_YA,\n    EC_MOVE(SMELLING_SALT),\n    EC_WORD_SMITE,\n    EC_MOVE(SMOG),\n    EC_MOVE(SMOKESCREEN),\n    EC_POKEMON(SMOOCHUM),\n    EC_WORD_SMOOTH,\n    EC_MOVE2(SNATCH),\n    EC_POKEMON(SNEASEL),\n    EC_MOVE(SNORE),\n    EC_POKEMON(SNORLAX),\n    EC_WORD_SNORT,\n    EC_POKEMON2(SNORUNT),\n    EC_POKEMON(SNUBBULL),\n    EC_WORD_SO,\n    EC_MOVE2(SOFT_BOILED),\n    EC_WORD_SOFTWARE,\n    EC_MOVE(SOLAR_BEAM),\n    EC_POKEMON2(SOLROCK),\n    EC_WORD_SOME,\n    EC_WORD_SOMEHOW,\n    EC_WORD_SOMEONE,\n    EC_WORD_SOMETHING,\n    EC_WORD_SOMETIME,\n    EC_WORD_SON,\n    EC_WORD_SONG,\n    EC_WORD_SONGS,\n    EC_MOVE(SONIC_BOOM),\n    EC_WORD_SOON,\n    EC_WORD_SORRY,\n    EC_WORD_SOUNDPROOF,\n    EC_WORD_SP_ABILITY,\n    EC_MOVE(SPARK),\n    EC_POKEMON(SPEAROW),\n    EC_WORD_SPECTATOR,\n    EC_WORD_SPEED_BOOST,\n    EC_POKEMON2(SPHEAL),\n    EC_MOVE(SPIDER_WEB),\n    EC_MOVE2(SPIKE_CANNON),\n    EC_MOVE2(SPIKES),\n    EC_POKEMON(SPINARAK),\n    EC_POKEMON2(SPINDA),\n    EC_WORD_SPIRALING,\n    EC_WORD_SPIRIT,\n    EC_MOVE2(SPIT_UP),\n    EC_MOVE(SPITE),\n    EC_MOVE2(SPLASH),\n    EC_POKEMON2(SPOINK),\n    EC_MOVE(SPORE),\n    EC_WORD_SPORTS,\n    EC_WORD_SPRING,\n    EC_POKEMON(SQUIRTLE),\n    EC_WORD_STAGE,\n    EC_POKEMON(STANTLER),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(STARMIE),\n    EC_POKEMON(STARMIE),\n    EC_WORD_START,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(STARYU),\n    EC_POKEMON(STARYU),\n    EC_WORD_STATIC,\n    EC_WORD_STAY_AT_HOME,\n    EC_WORD_STEEL,\n    EC_MOVE2(STEEL_WING),\n    EC_POKEMON(STEELIX),\n    EC_WORD_STENCH,\n    EC_WORD_STICKY_HOLD,\n    EC_MOVE2(STOCKPILE),\n    EC_MOVE2(STOMP),\n    EC_WORD_STOP,\n    EC_WORD_STORE,\n    EC_WORD_STORES,\n    EC_WORD_STORY,\n    EC_WORD_STRATEGY,\n    EC_MOVE(STRENGTH),\n    EC_MOVE(STRING_SHOT),\n    EC_WORD_STRONG,\n    EC_MOVE2(STRUGGLE),\n    EC_WORD_STUDY,\n    EC_MOVE(STUN_SPORE),\n    EC_WORD_STURDY,\n    EC_MOVE(SUBMISSION),\n    EC_MOVE2(SUBSTITUTE),\n    EC_WORD_SUCTION_CUPS,\n    EC_POKEMON(SUDOWOODO),\n    EC_POKEMON(SUICUNE),\n    EC_WORD_SUMMER,\n    EC_WORD_SUNDAY,\n    EC_POKEMON(SUNFLORA),\n    EC_POKEMON(SUNKERN),\n    EC_MOVE2(SUNNY_DAY),\n    EC_WORD_SUPER,\n    EC_MOVE(SUPER_FANG),\n    EC_MOVE2(SUPERPOWER),\n    EC_MOVE2(SUPERSONIC),\n    EC_MOVE2(SURF),\n    EC_WORD_SURPRISE,\n    EC_WORD_SURRENDER,\n    EC_POKEMON2(SURSKIT),\n    EC_POKEMON2(SWABLU),\n    EC_MOVE(SWAGGER),\n    EC_MOVE2(SWALLOW),\n    EC_POKEMON2(SWALOT),\n    EC_POKEMON2(SWAMPERT),\n    EC_WORD_SWARM,\n    EC_MOVE2(SWEET_KISS),\n    EC_MOVE(SWEET_SCENT),\n    EC_WORD_SWEETS,\n    EC_POKEMON2(SWELLOW),\n    EC_MOVE(SWIFT),\n    EC_WORD_SWIFT_SWIM,\n    EC_POKEMON(SWINUB),\n    EC_MOVE2(SWORDS_DANCE),\n    EC_WORD_SYNCHRONIZE,\n    EC_MOVE(SYNTHESIS),\n    EC_WORD_SYSTEM,\n};\n\nstatic const u16 sEasyChatWordsByLetter_T[] = {\n    EC_MOVE2(TACKLE),\n    EC_MOVE2(TAIL_GLOW),\n    EC_MOVE(TAIL_WHIP),\n    EC_POKEMON2(TAILLOW),\n    EC_WORD_TAKE,\n    EC_MOVE2(TAKE_DOWN),\n    EC_WORD_TAKE_THAT,\n    EC_WORD_TALENT,\n    EC_WORD_TALK,\n    EC_WORD_TALKING,\n    EC_POKEMON(TANGELA),\n    EC_WORD_TASTY,\n    EC_MOVE2(TAUNT),\n    EC_POKEMON(TAUROS),\n    EC_WORD_TCH,\n    EC_WORD_TEACH,\n    EC_WORD_TEACHER,\n    EC_WORD_TEACHES,\n    EC_POKEMON(TEDDIURSA),\n    EC_MOVE2(TEETER_DANCE),\n    EC_MOVE2(TELEPORT),\n    EC_WORD_TELEVISION,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(TENTACOOL),\n    EC_POKEMON(TENTACOOL),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(TENTACRUEL),\n    EC_POKEMON(TENTACRUEL),\n    EC_WORD_TERRIBLE,\n    EC_WORD_TEST,\n    EC_WORD_THAN,\n    EC_WORD_THANK_YOU,\n    EC_WORD_THANKS,\n    EC_WORD_THAT,\n    EC_WORD_THAT_WAS,\n    EC_WORD_THAT_S,\n    EC_WORD_THAT_S_IT_EXCL,\n    EC_WORD_THE,\n    EC_WORD_THEIR,\n    EC_WORD_THERE,\n    EC_WORD_THESE,\n    EC_WORD_THESE_WERE,\n    EC_WORD_THEY,\n    EC_WORD_THEY_WERE,\n    EC_WORD_THEY_RE,\n    EC_WORD_THEY_VE,\n    EC_WORD_THICK,\n    EC_WORD_THICK_FAT,\n    EC_MOVE2(THIEF),\n    EC_WORD_THIN,\n    EC_WORD_THING,\n    EC_WORD_THINGS,\n    EC_WORD_THINK,\n    EC_WORD_THINKS,\n    EC_WORD_THIRSTY,\n    EC_WORD_THIS,\n    EC_WORD_THIS_IS_IT_EXCL,\n    EC_WORD_THOSE,\n    EC_WORD_THOSE_ARE,\n    EC_WORD_THOSE_WERE,\n    EC_MOVE(THRASH),\n    EC_WORD_THROW,\n    EC_MOVE(THUNDER),\n    EC_MOVE2(THUNDER_WAVE),\n    EC_MOVE(THUNDERBOLT),\n    EC_MOVE(THUNDER_PUNCH),\n    EC_MOVE2(THUNDER_SHOCK),\n    EC_WORD_THURSDAY,\n    EC_MOVE(TICKLE),\n    EC_WORD_TICKLISH,\n    EC_WORD_TIGHT,\n    EC_WORD_TIME,\n    EC_WORD_TIMES,\n    EC_WORD_TIRED,\n    EC_WORD_TO,\n    EC_WORD_TO_HER,\n    EC_WORD_TO_ME,\n    EC_WORD_TO_THEM,\n    EC_WORD_TO_US,\n    EC_WORD_TO_WHOM,\n    EC_WORD_TODAY,\n    EC_POKEMON(TOGEPI),\n    EC_WORD_TOGETHER,\n    EC_POKEMON(TOGETIC),\n    EC_WORD_TOMORROW,\n    EC_WORD_TOO,\n    EC_WORD_TOO_LATE,\n    EC_WORD_TOO_STRONG,\n    EC_WORD_TOO_WEAK,\n    EC_WORD_TOP,\n    EC_POKEMON2(TORCHIC),\n    EC_POKEMON2(TORKOAL),\n    EC_MOVE(TORMENT),\n    EC_WORD_TORRENT,\n    EC_WORD_TOTALLY,\n    EC_POKEMON(TOTODILE),\n    EC_WORD_TOUGH,\n    EC_WORD_TOUGHNESS,\n    EC_WORD_TOURNAMENT,\n    EC_WORD_TOWER,\n    EC_MOVE2(TOXIC),\n    EC_WORD_TOYS,\n    EC_WORD_TRACE,\n    EC_WORD_TRADE,\n    EC_WORD_TRAIN,\n    EC_WORD_TRAINER,\n    EC_WORD_TRAINS,\n    EC_MOVE2(TRANSFORM),\n    EC_POKEMON2(TRAPINCH),\n    EC_WORD_TRAVEL,\n    EC_WORD_TREASURE,\n    EC_POKEMON2(TREECKO),\n    EC_WORD_TRENDY,\n    EC_MOVE2(TRI_ATTACK),\n    EC_MOVE2(TRICK),\n    EC_WORD_TRIES,\n    EC_MOVE2(TRIPLE_KICK),\n    EC_POKEMON2(TROPIUS),\n    EC_WORD_TRUANT,\n    EC_WORD_TRULY,\n    EC_WORD_TRUMP_CARD,\n    EC_WORD_TRUST,\n    EC_WORD_TRY,\n    EC_WORD_TUESDAY,\n    EC_MOVE2(TWINEEDLE),\n    EC_WORD_TWIRLING,\n    EC_MOVE2(TWISTER),\n    EC_WORD_TYPE,\n    EC_POKEMON(TYPHLOSION),\n    EC_POKEMON(TYRANITAR),\n    EC_POKEMON(TYROGUE),\n};\n\nstatic const u16 sEasyChatWordsByLetter_U[] = {\n    EC_WORD_UGLY,\n    EC_WORD_UH_HUH,\n    EC_WORD_UH_OH,\n    EC_WORD_UM,\n    EC_POKEMON(UMBREON),\n    EC_WORD_UNAVOIDABLE,\n    EC_WORD_UNBELIEVABLE,\n    EC_WORD_UNCLE,\n    EC_WORD_UNDERSTAND,\n    EC_WORD_UNDERSTANDS,\n    EC_WORD_UNDERSTOOD,\n    EC_WORD_UNION,\n    EC_POKEMON(UNOWN),\n    EC_WORD_UNTIL,\n    EC_WORD_UP,\n    EC_WORD_UPBEAT,\n    EC_MOVE(UPROAR),\n    EC_WORD_UPSIDE_DOWN,\n    EC_WORD_URGH,\n    EC_POKEMON(URSARING),\n    EC_WORD_USE,\n    EC_WORD_USELESS,\n    EC_WORD_USES,\n    EC_WORD_USING,\n};\n\nstatic const u16 sEasyChatWordsByLetter_V[] = {\n    EC_WORD_VACATION,\n    EC_POKEMON(VAPOREON),\n    EC_POKEMON(VENOMOTH),\n    EC_POKEMON(VENONAT),\n    EC_POKEMON(VENUSAUR),\n    EC_WORD_VERSION,\n    EC_WORD_VERSUS,\n    EC_WORD_VERY,\n    EC_POKEMON2(VIBRAVA),\n    EC_MOVE2(VICE_GRIP),\n    EC_WORD_VICTORY,\n    EC_POKEMON(VICTREEBEL),\n    EC_WORD_VIEWING,\n    EC_POKEMON2(VIGOROTH),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(VILEPLUME),\n    EC_POKEMON(VILEPLUME),\n    EC_MOVE2(VINE_WHIP),\n    EC_WORD_VITAL_SPIRIT,\n    EC_MOVE(VITAL_THROW),\n    EC_POKEMON2(VOLBEAT),\n    EC_WORD_VOLT_ABSORB,\n    EC_MOVE2(VOLT_TACKLE),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(VOLTORB),\n    EC_POKEMON(VOLTORB),\n    EC_WORD_VORACIOUS,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(VULPIX),\n    EC_POKEMON(VULPIX),\n};\n\nstatic const u16 sEasyChatWordsByLetter_W[] = {\n    EC_WORD_WAAAH,\n    EC_WORD_WAHAHAHA,\n    EC_POKEMON2(WAILMER),\n    EC_POKEMON2(WAILORD),\n    EC_WORD_WAIT,\n    EC_WORD_WAKE_UP,\n    EC_WORD_WAKES_UP,\n    EC_WORD_WALK,\n    EC_WORD_WALKING,\n    EC_WORD_WALKS,\n    EC_POKEMON2(WALREIN),\n    EC_WORD_WANDERING,\n    EC_WORD_WANNABE,\n    EC_WORD_WANT,\n    EC_WORD_WANTS,\n    EC_POKEMON(WARTORTLE),\n    EC_WORD_WAS,\n    EC_WORD_WASN_T,\n    EC_WORD_WATER,\n    EC_WORD_WATER_ABSORB,\n    EC_MOVE2(WATER_GUN),\n    EC_MOVE2(WATER_PULSE),\n    EC_MOVE2(WATER_SPORT),\n    EC_MOVE(WATER_SPOUT),\n    EC_WORD_WATER_VEIL,\n    EC_MOVE2(WATERFALL),\n    EC_WORD_WAY,\n    EC_WORD_WE,\n    EC_WORD_WE_RE,\n    EC_WORD_WE_VE,\n    EC_WORD_WEAK,\n    EC_WORD_WEAKENED,\n    EC_MOVE(WEATHER_BALL),\n    EC_WORD_WEDNESDAY,\n    EC_POKEMON(WEEDLE),\n    EC_WORD_WEEK,\n    EC_POKEMON(WEEPINBELL),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(WEEZING),\n    EC_POKEMON(WEEZING),\n    EC_WORD_WEIRD,\n    EC_WORD_WELCOME,\n    EC_WORD_WELL,\n    EC_WORD_WELL_THEN,\n    EC_WORD_WENT,\n    EC_WORD_WERE,\n    EC_WORD_WEREN_T,\n    EC_WORD_WHAT,\n    EC_WORD_WHAT_S_UP_QUES,\n    EC_WORD_WHEN,\n    EC_WORD_WHEN_I_WIN,\n    EC_WORD_WHERE,\n    EC_WORD_WHICH,\n    EC_WORD_WHILE,\n    EC_MOVE(WHIRLPOOL),\n    EC_MOVE2(WHIRLWIND),\n    EC_POKEMON2(WHISCASH),\n    EC_POKEMON2(WHISMUR),\n    EC_WORD_WHITE_SMOKE,\n    EC_WORD_WHO,\n    EC_WORD_WHO_IS,\n    EC_WORD_WHO_WAS,\n    EC_WORD_WHOAH,\n    EC_WORD_WHOM,\n    EC_WORD_WHOSE,\n    EC_WORD_WHY,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(WIGGLYTUFF),\n    EC_POKEMON(WIGGLYTUFF),\n    EC_WORD_WILD,\n    EC_WORD_WILL,\n    EC_WORD_WILL_BE_HERE,\n    EC_MOVE(WILL_O_WISP),\n    EC_WORD_WIMPY,\n    EC_WORD_WIN,\n    EC_MOVE2(WING_ATTACK),\n    EC_POKEMON2(WINGULL),\n    EC_WORD_WINNER,\n    EC_WORD_WINS,\n    EC_WORD_WINTER,\n    EC_WORD_WIRELESS,\n    EC_MOVE2(WISH),\n    EC_WORD_WITH,\n    EC_MOVE(WITHDRAW),\n    EC_WORD_WITHOUT,\n    EC_WORD_WOBBLY,\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(WOBBUFFET),\n    EC_POKEMON(WOBBUFFET),\n    EC_WORD_WOMAN,\n    EC_WORD_WON,\n    EC_WORD_WON_T,\n    EC_WORD_WONDER,\n    EC_WORD_WONDER_GUARD,\n    EC_POKEMON(WOOPER),\n    EC_WORD_WORD,\n    EC_WORD_WORK,\n    EC_WORD_WORKING,\n    EC_WORD_WORKS,\n    EC_WORD_WORLD,\n    EC_WORD_WORRY,\n    EC_WORD_WOULD,\n    EC_WORD_WOW,\n    EC_WORD_WOWEE,\n    EC_MOVE2(WRAP),\n    EC_WORD_WROOOAAR_EXCL,\n    EC_POKEMON2(WURMPLE),\n    EC_POKEMON2(WYNAUT),\n};\n\nstatic const u16 sEasyChatWordsByLetter_X[] = {\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(XATU),\n    EC_POKEMON(XATU),\n};\n\nstatic const u16 sEasyChatWordsByLetter_Y[] = {\n    EC_WORD_YAHOO,\n    EC_POKEMON(YANMA),\n    EC_MOVE(YAWN),\n    EC_WORD_YAY,\n    EC_WORD_YEAH,\n    EC_WORD_YEAH_YEAH,\n    EC_WORD_YEEHAW_EXCL,\n    EC_WORD_YES,\n    EC_WORD_YES_SIR_EXCL,\n    EC_WORD_YESTERDAY,\n    EC_WORD_YET,\n    EC_WORD_YO,\n    EC_WORD_YOU,\n    EC_WORD_YOU_RE,\n    EC_WORD_YOU_VE,\n    EC_WORD_YOUNG,\n    EC_WORD_YOUR,\n    EC_WORD_YOURS,\n    EC_WORD_YUP,\n};\n\nstatic const u16 sEasyChatWordsByLetter_Z[] = {\n    EC_POKEMON2(ZANGOOSE),\n    EC_MOVE2(ZAP_CANNON),\n    EC_POKEMON(ZAPDOS),\n    EC_POKEMON2(ZIGZAGOON),\n    -1, 2, // Doubled pokemon species name\n    EC_POKEMON2(ZUBAT),\n    EC_POKEMON(ZUBAT),\n};\n\nstatic const struct EasyChatWordsByLetter sEasyChatWordsByLetterPointers[] = {\n    {\n        .words = sEasyChatWordsByLetter_Others,\n        .numWords = 10,\n    },\n    {\n        .words = sEasyChatWordsByLetter_A,\n        .numWords = 106,\n    },\n    {\n        .words = sEasyChatWordsByLetter_B,\n        .numWords = 86,\n    },\n    {\n        .words = sEasyChatWordsByLetter_C,\n        .numWords = 119,\n    },\n    {\n        .words = sEasyChatWordsByLetter_D,\n        .numWords = 94,\n    },\n    {\n        .words = sEasyChatWordsByLetter_E,\n        .numWords = 58,\n    },\n    {\n        .words = sEasyChatWordsByLetter_F,\n        .numWords = 79,\n    },\n    {\n        .words = sEasyChatWordsByLetter_G,\n        .numWords = 98,\n    },\n    {\n        .words = sEasyChatWordsByLetter_H,\n        .numWords = 101,\n    },\n    {\n        .words = sEasyChatWordsByLetter_I,\n        .numWords = 48,\n    },\n    {\n        .words = sEasyChatWordsByLetter_J,\n        .numWords = 13,\n    },\n    {\n        .words = sEasyChatWordsByLetter_K,\n        .numWords = 33,\n    },\n    {\n        .words = sEasyChatWordsByLetter_L,\n        .numWords = 82,\n    },\n    {\n        .words = sEasyChatWordsByLetter_M,\n        .numWords = 142,\n    },\n    {\n        .words = sEasyChatWordsByLetter_N,\n        .numWords = 54,\n    },\n    {\n        .words = sEasyChatWordsByLetter_O,\n        .numWords = 44,\n    },\n    {\n        .words = sEasyChatWordsByLetter_P,\n        .numWords = 102,\n    },\n    {\n        .words = sEasyChatWordsByLetter_Q,\n        .numWords = 6,\n    },\n    {\n        .words = sEasyChatWordsByLetter_R,\n        .numWords = 80,\n    },\n    {\n        .words = sEasyChatWordsByLetter_S,\n        .numWords = 262,\n    },\n    {\n        .words = sEasyChatWordsByLetter_T,\n        .numWords = 133,\n    },\n    {\n        .words = sEasyChatWordsByLetter_U,\n        .numWords = 24,\n    },\n    {\n        .words = sEasyChatWordsByLetter_V,\n        .numWords = 33,\n    },\n    {\n        .words = sEasyChatWordsByLetter_W,\n        .numWords = 111,\n    },\n    {\n        .words = sEasyChatWordsByLetter_X,\n        .numWords = 4,\n    },\n    {\n        .words = sEasyChatWordsByLetter_Y,\n        .numWords = 19,\n    },\n    {\n        .words = sEasyChatWordsByLetter_Z,\n        .numWords = 8,\n    },\n};\n"
  },
  {
    "path": "src/data/field_effects/field_effect_object_template_pointers.h",
    "content": "const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Ripple;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Ash;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Arrow;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_JumpTallGrass;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_JumpBigSplash;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Splash;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_JumpSmallSplash;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_JumpLongGrass;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass2;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_UnusedSand;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_WaterSurfacing;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_ReflectionDistortion;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints;\n/*const struct SpriteTemplate gFieldEffectObjectTemplate_Sparkle;*/\nconst struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Bird;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_SandPile;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_AshPuff;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_AshLaunch;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles;\nconst struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle;\nconst struct SpriteTemplate gUnknown_TallGrass_OneIsland;\nconst struct SpriteTemplate gUnknown_TallGrass_SevenIsland;\n\nconst struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = {\n    [FLDEFFOBJ_SHADOW_S]              = &gFieldEffectObjectTemplate_ShadowSmall,\n    [FLDEFFOBJ_SHADOW_M]              = &gFieldEffectObjectTemplate_ShadowMedium,\n    [FLDEFFOBJ_SHADOW_L]              = &gFieldEffectObjectTemplate_ShadowLarge,\n    [FLDEFFOBJ_SHADOW_XL]             = &gFieldEffectObjectTemplate_ShadowExtraLarge,\n    [FLDEFFOBJ_TALL_GRASS]            = &gFieldEffectObjectTemplate_TallGrass,\n    [FLDEFFOBJ_RIPPLE]                = &gFieldEffectObjectTemplate_Ripple,\n    [FLDEFFOBJ_ASH]                   = &gFieldEffectObjectTemplate_Ash,\n    [FLDEFFOBJ_SURF_BLOB]             = &gFieldEffectObjectTemplate_SurfBlob,\n    [FLDEFFOBJ_ARROW]                 = &gFieldEffectObjectTemplate_Arrow,\n    [FLDEFFOBJ_GROUND_IMPACT_DUST]    = &gFieldEffectObjectTemplate_GroundImpactDust,\n    [FLDEFFOBJ_JUMP_TALL_GRASS]       = &gFieldEffectObjectTemplate_JumpTallGrass,\n    [FLDEFFOBJ_SAND_FOOTPRINTS]       = &gFieldEffectObjectTemplate_SandFootprints,\n    [FLDEFFOBJ_JUMP_BIG_SPLASH]       = &gFieldEffectObjectTemplate_JumpBigSplash,\n    [FLDEFFOBJ_SPLASH]                = &gFieldEffectObjectTemplate_Splash,\n    [FLDEFFOBJ_JUMP_SMALL_SPLASH]     = &gFieldEffectObjectTemplate_JumpSmallSplash,\n    [FLDEFFOBJ_LONG_GRASS]            = &gFieldEffectObjectTemplate_LongGrass,\n    [FLDEFFOBJ_JUMP_LONG_GRASS]       = &gFieldEffectObjectTemplate_JumpLongGrass,\n    [FLDEFFOBJ_UNUSED_GRASS]          = &gFieldEffectObjectTemplate_UnusedGrass,\n    [FLDEFFOBJ_UNUSED_GRASS_2]        = &gFieldEffectObjectTemplate_UnusedGrass2,\n    [FLDEFFOBJ_UNUSED_SAND]           = &gFieldEffectObjectTemplate_UnusedSand,\n    [FLDEFFOBJ_WATER_SURFACING]       = &gFieldEffectObjectTemplate_WaterSurfacing,\n    [FLDEFFOBJ_REFLECTION_DISTORTION] = &gFieldEffectObjectTemplate_ReflectionDistortion,\n    [FLDEFFOBJ_SPARKLE]               = NULL,\n    [FLDEFFOBJ_DEEP_SAND_FOOTPRINTS]  = &gFieldEffectObjectTemplate_DeepSandFootprints,\n    [FLDEFFOBJ_TREE_DISGUISE]         = &gFieldEffectObjectTemplate_TreeDisguise,\n    [FLDEFFOBJ_MOUNTAIN_DISGUISE]     = &gFieldEffectObjectTemplate_MountainDisguise,\n    [FLDEFFOBJ_BIRD]                  = &gFieldEffectObjectTemplate_Bird,\n    [FLDEFFOBJ_BIKE_TIRE_TRACKS]      = &gFieldEffectObjectTemplate_BikeTireTracks,\n    [FLDEFFOBJ_SAND_DISGUISE]         = &gFieldEffectObjectTemplate_SandDisguisePlaceholder,\n    [FLDEFFOBJ_SAND_PILE]             = &gFieldEffectObjectTemplate_SandPile,\n    [FLDEFFOBJ_SHORT_GRASS]           = &gFieldEffectObjectTemplate_ShortGrass,\n    [FLDEFFOBJ_HOT_SPRINGS_WATER]     = &gFieldEffectObjectTemplate_HotSpringsWater,\n    [FLDEFFOBJ_ASH_PUFF]              = &gFieldEffectObjectTemplate_AshPuff,\n    [FLDEFFOBJ_ASH_LAUNCH]            = &gFieldEffectObjectTemplate_AshLaunch,\n    [FLDEFFOBJ_BUBBLES]               = &gFieldEffectObjectTemplate_Bubbles,\n    [FLDEFFOBJ_SMALL_SPARKLE]         = &gFieldEffectObjectTemplate_SmallSparkle,\n    [FLDEFFOBJ_SMALL_SPARKLE + 1]     = &gUnknown_TallGrass_OneIsland,\n    [FLDEFFOBJ_SMALL_SPARKLE + 2]     = &gUnknown_TallGrass_SevenIsland,\n};\n"
  },
  {
    "path": "src/data/field_effects/field_effect_objects.h",
    "content": "const struct SpritePalette gSpritePalette_GeneralFieldEffect0 = { .data = gFieldEffectObjectPalette0, .tag = FLDEFF_PAL_TAG_GENERAL_0 }; //sand footprints pal\nconst struct SpritePalette gSpritePalette_GeneralFieldEffect1 = { .data = gFieldEffectObjectPalette1, .tag = FLDEFF_PAL_TAG_GENERAL_1 }; //tall grass pal\nconst struct SpritePalette gBlackSandFootprintsPal = { .data = gBlackSandFootPrints_Pal, .tag = FLDEFF_PAL_TAG_GENERAL_0 }; \nconst struct SpritePalette gThreeIslandGrassPal = { .data = gThreeIslandGrass_Pal, .tag = FLDEFF_PAL_TAG_GENERAL_1 };\nconst struct SpritePalette gSnowFootprintsPal = { .data = gSnowFootPrints_Pal, .tag = FLDEFF_PAL_TAG_GENERAL_0 };\n\nstatic const union AnimCmd sAnim_Shadow[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_Shadow[] =\n{\n    sAnim_Shadow,\n};\n\nstatic const struct SpriteFrameImage sPicTable_ShadowSmall[] = {obj_frame_tiles(gFieldEffectObjectPic_ShadowSmall) };\nstatic const struct SpriteFrameImage sPicTable_ShadowMedium[] = {obj_frame_tiles(gFieldEffectObjectPic_ShadowMedium) };\nstatic const struct SpriteFrameImage sPicTable_ShadowLarge[] = {obj_frame_tiles(gFieldEffectObjectPic_ShadowLarge) };\nstatic const struct SpriteFrameImage sPicTable_ShadowExtraLarge[] = { obj_frame_tiles(gFieldEffectObjectPic_ShadowExtraLarge) };\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = TAG_NONE,\n    .oam = &gObjectEventBaseOam_8x8,\n    .anims = sAnimTable_Shadow,\n    .images = sPicTable_ShadowSmall,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateShadowFieldEffect,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = TAG_NONE,\n    .oam = &gObjectEventBaseOam_16x8,\n    .anims = sAnimTable_Shadow,\n    .images = sPicTable_ShadowMedium,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateShadowFieldEffect,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = TAG_NONE,\n    .oam = &gObjectEventBaseOam_32x8,\n    .anims = sAnimTable_Shadow,\n    .images = sPicTable_ShadowLarge,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateShadowFieldEffect,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = TAG_NONE,\n    .oam = &gObjectEventBaseOam_64x32,\n    .anims = sAnimTable_Shadow,\n    .images = sPicTable_ShadowExtraLarge,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateShadowFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_TallGrass[] =\n{\n    overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 3),\n    overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 4),\n};\n\nconst struct SpriteFrameImage gSevenIsland_Grass_SpriteFrameImage[] =\n{\n    overworld_frame(gSevenIsland_Grass, 2, 2, 0),\n    overworld_frame(gSevenIsland_Grass, 2, 2, 1),\n    overworld_frame(gSevenIsland_Grass, 2, 2, 2),\n    overworld_frame(gSevenIsland_Grass, 2, 2, 3),\n    overworld_frame(gSevenIsland_Grass, 2, 2, 4),\n};\n\nconst struct SpriteFrameImage gUnknown_83A53DC_OneIsland[] = //also Three Island\n{\n    overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 5),\n    overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 5),\n    overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 6),\n    overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 7),\n    overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 8),\n};\n\nconst union AnimCmd sAnim_TallGrass[] =\n{\n    ANIMCMD_FRAME(1, 10),\n    ANIMCMD_FRAME(2, 10),\n    ANIMCMD_FRAME(3, 10),\n    ANIMCMD_FRAME(4, 10),\n    ANIMCMD_FRAME(0, 10),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_TallGrass[] =\n{\n    sAnim_TallGrass,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_1,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_TallGrass,\n    .images = sPicTable_TallGrass,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateTallGrassFieldEffect,\n};\n\nconst struct SpriteTemplate gUnknown_TallGrass_OneIsland =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_1,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_TallGrass,\n    .images = gUnknown_83A53DC_OneIsland,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateTallGrassFieldEffect,\n};\n\nconst struct SpriteTemplate gUnknown_TallGrass_SevenIsland =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_1,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_TallGrass,\n    .images = gSevenIsland_Grass_SpriteFrameImage,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateTallGrassFieldEffect,\n};\n\nconst struct SpriteFrameImage sPicTable_Ripple[] =\n{\n    overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 3),\n    overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 4),\n};\n\nstatic const union AnimCmd sAnim_Ripple[] =\n{\n    ANIMCMD_FRAME(0, 12),\n    ANIMCMD_FRAME(1, 9),\n    ANIMCMD_FRAME(2, 9),\n    ANIMCMD_FRAME(3, 9),\n    ANIMCMD_FRAME(0, 9),\n    ANIMCMD_FRAME(1, 9),\n    ANIMCMD_FRAME(2, 11),\n    ANIMCMD_FRAME(4, 11),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_Ripple[] =\n{\n    sAnim_Ripple,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Ripple =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_1,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_Ripple,\n    .images = sPicTable_Ripple,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = WaitFieldEffectSpriteAnim,\n};\n\nstatic const struct SpriteFrameImage sPicTable_Ash[] =\n{\n    overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 3),\n    overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 4),\n};\n\nstatic const union AnimCmd sAnim_Ash[] =\n{\n    ANIMCMD_FRAME(0, 12),\n    ANIMCMD_FRAME(1, 12),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_FRAME(3, 12),\n    ANIMCMD_FRAME(4, 12),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_Ash[] =\n{\n    sAnim_Ash,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Ash =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_1,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_Ash,\n    .images = sPicTable_Ash,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateAshFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_SurfBlob[] =\n{\n    overworld_frame(gObjectEventPic_SurfBlob, 2, 8, 0),\n    overworld_frame(gObjectEventPic_SurfBlob, 2, 8, 1),\n    overworld_frame(gObjectEventPic_SurfBlob, 2, 8, 2),\n    overworld_frame(gObjectEventPic_SurfBlob, 2, 8, 3),\n    overworld_frame(gObjectEventPic_SurfBlob, 2, 8, 4),\n    overworld_frame(gObjectEventPic_SurfBlob, 2, 8, 5),\n};\n\nstatic const union AnimCmd sSurfBlobAnim_FaceSouth[] =\n{\n    ANIMCMD_FRAME(0, 48),\n    ANIMCMD_FRAME(1, 48),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sSurfBlobAnim_FaceNorth[] =\n{\n    ANIMCMD_FRAME(2, 48),\n    ANIMCMD_FRAME(3, 48),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sSurfBlobAnim_FaceWest[] =\n{\n    ANIMCMD_FRAME(4, 48),\n    ANIMCMD_FRAME(5, 48),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sSurfBlobAnim_FaceEast[] =\n{\n    ANIMCMD_FRAME(4, 48, .hFlip = TRUE),\n    ANIMCMD_FRAME(5, 48, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnimTable_SurfBlob[] =\n{\n    [DIR_SOUTH - 1] = sSurfBlobAnim_FaceSouth,\n    [DIR_NORTH - 1] = sSurfBlobAnim_FaceNorth,\n    [DIR_WEST  - 1] = sSurfBlobAnim_FaceWest,\n    [DIR_EAST  - 1] = sSurfBlobAnim_FaceEast,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = TAG_NONE,\n    .oam = &gObjectEventBaseOam_32x32,\n    .anims = sAnimTable_SurfBlob,\n    .images = sPicTable_SurfBlob,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateSurfBlobFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_Arrow[] =\n{\n    overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 3),\n    overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 4),\n    overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 5),\n    overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 6),\n    overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 7),\n};\n\nstatic const union AnimCmd sArrowAnim_South[] =\n{\n    ANIMCMD_FRAME(2, 32),\n    ANIMCMD_FRAME(3, 32),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sArrowAnim_North[] =\n{\n    ANIMCMD_FRAME(0, 32),\n    ANIMCMD_FRAME(1, 32),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sArrowAnim_West[] =\n{\n    ANIMCMD_FRAME(4, 32),\n    ANIMCMD_FRAME(5, 32),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sArrowAnim_East[] =\n{\n    ANIMCMD_FRAME(6, 32),\n    ANIMCMD_FRAME(7, 32),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnimTable_Arrow[] =\n{\n    [DIR_SOUTH - 1] = sArrowAnim_South,\n    [DIR_NORTH - 1] = sArrowAnim_North,\n    [DIR_WEST  - 1] = sArrowAnim_West,\n    [DIR_EAST  - 1] = sArrowAnim_East,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Arrow =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = TAG_NONE,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_Arrow,\n    .images = sPicTable_Arrow,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const struct SpriteFrameImage sPicTable_GroundImpactDust[] =\n{\n    overworld_frame(gFieldEffectObjectPic_GroundImpactDust, 2, 1, 0),\n    overworld_frame(gFieldEffectObjectPic_GroundImpactDust, 2, 1, 1),\n    overworld_frame(gFieldEffectObjectPic_GroundImpactDust, 2, 1, 2),\n};\n\nstatic const union AnimCmd sAnim_GroundImpactDust[] =\n{\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_GroundImpactDust[] =\n{\n    sAnim_GroundImpactDust,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_0,\n    .oam = &gObjectEventBaseOam_16x8,\n    .anims = sAnimTable_GroundImpactDust,\n    .images = sPicTable_GroundImpactDust,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateJumpImpactEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_JumpTallGrass[] =\n{\n    overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 0),\n    overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 1),\n    overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 2),\n    overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 3),\n};\n\nstatic const union AnimCmd sAnim_JumpTallGrass[] =\n{\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_FRAME(3, 8),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_JumpTallGrass[] =\n{\n    sAnim_JumpTallGrass,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_JumpTallGrass =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_1,\n    .oam = &gObjectEventBaseOam_16x8,\n    .anims = sAnimTable_JumpTallGrass,\n    .images = sPicTable_JumpTallGrass,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateJumpImpactEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_SandFootprints[] =\n{\n    overworld_frame(gFieldEffectObjectPic_SandFootprints, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_SandFootprints, 2, 2, 1),\n};\n\nstatic const union AnimCmd sSandFootprintsAnim_South[] =\n{\n    ANIMCMD_FRAME(0, 1, .vFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSandFootprintsAnim_North[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSandFootprintsAnim_West[] =\n{\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSandFootprintsAnim_East[] =\n{\n    ANIMCMD_FRAME(1, 1, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_SandFootprints[] =\n{\n    [DIR_NONE]  = sSandFootprintsAnim_South,\n    [DIR_SOUTH] = sSandFootprintsAnim_South,\n    [DIR_NORTH] = sSandFootprintsAnim_North,\n    [DIR_WEST]  = sSandFootprintsAnim_West,\n    [DIR_EAST]  = sSandFootprintsAnim_East,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_0,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_SandFootprints,\n    .images = sPicTable_SandFootprints,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateFootprintsTireTracksFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_DeepSandFootprints[] =\n{\n    overworld_frame(gFieldEffectObjectPic_DeepSandFootprints, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_DeepSandFootprints, 2, 2, 1),\n};\n\nstatic const union AnimCmd sDeepSandFootprintsAnim_South[] =\n{\n    ANIMCMD_FRAME(0, 1, .vFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sDeepSandFootprintsAnim_North[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sDeepSandFootprintsAnim_West[] =\n{\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sDeepSandFootprintsAnim_East[] =\n{\n    ANIMCMD_FRAME(1, 1, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_DeepSandFootprints[] =\n{\n    [DIR_NONE]  = sDeepSandFootprintsAnim_South,\n    [DIR_SOUTH] = sDeepSandFootprintsAnim_South,\n    [DIR_NORTH] = sDeepSandFootprintsAnim_North,\n    [DIR_WEST]  = sDeepSandFootprintsAnim_West,\n    [DIR_EAST]  = sDeepSandFootprintsAnim_East,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_0,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_DeepSandFootprints,\n    .images = sPicTable_DeepSandFootprints,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateFootprintsTireTracksFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_BikeTireTracks[] =\n{\n    overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 3),\n};\n\nstatic const union AnimCmd sBikeTireTracksAnim_South[] =\n{\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sBikeTireTracksAnim_North[] =\n{\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sBikeTireTracksAnim_West[] =\n{\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sBikeTireTracksAnim_East[] =\n{\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sBikeTireTracksAnim_SECornerTurn[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sBikeTireTracksAnim_SWCornerTurn[] =\n{\n    ANIMCMD_FRAME(0, 1, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sBikeTireTracksAnim_NWCornerTurn[] =\n{\n    ANIMCMD_FRAME(3, 1, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sBikeTireTracksAnim_NECornerTurn[] =\n{\n    ANIMCMD_FRAME(3, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_BikeTireTracks[] =\n{\n    [DIR_NONE]      = sBikeTireTracksAnim_South,\n    [DIR_SOUTH]     = sBikeTireTracksAnim_South,\n    [DIR_NORTH]     = sBikeTireTracksAnim_North,\n    [DIR_WEST]      = sBikeTireTracksAnim_West,\n    [DIR_EAST]      = sBikeTireTracksAnim_East,\n    [DIR_SOUTHWEST] = sBikeTireTracksAnim_SECornerTurn,\n    [DIR_SOUTHEAST] = sBikeTireTracksAnim_SWCornerTurn,\n    [DIR_NORTHWEST] = sBikeTireTracksAnim_NWCornerTurn,\n    [DIR_NORTHEAST] = sBikeTireTracksAnim_NECornerTurn,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_0,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_BikeTireTracks,\n    .images = sPicTable_BikeTireTracks,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateFootprintsTireTracksFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_JumpBigSplash[] =\n{\n    overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 3),\n};\n\nstatic const union AnimCmd sAnim_JumpBigSplash[] =\n{\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_FRAME(3, 8),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_JumpBigSplash[] =\n{\n    sAnim_JumpBigSplash,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_JumpBigSplash =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_0,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_JumpBigSplash,\n    .images = sPicTable_JumpBigSplash,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateJumpImpactEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_Splash[] =\n{\n    overworld_frame(gFieldEffectObjectPic_Splash, 2, 1, 0),\n    overworld_frame(gFieldEffectObjectPic_Splash, 2, 1, 1),\n};\n\nstatic const union AnimCmd sAnim_Splash_0[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Splash_1[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(1, 6),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(1, 6),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnimTable_Splash[] =\n{\n    sAnim_Splash_0,\n    sAnim_Splash_1,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Splash =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_0,\n    .oam = &gObjectEventBaseOam_16x8,\n    .anims = sAnimTable_Splash,\n    .images = sPicTable_Splash,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateSplashFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_JumpSmallSplash[] =\n{\n    overworld_frame(gFieldEffectObjectPic_JumpSmallSplash, 2, 1, 0),\n    overworld_frame(gFieldEffectObjectPic_JumpSmallSplash, 2, 1, 1),\n    overworld_frame(gFieldEffectObjectPic_JumpSmallSplash, 2, 1, 2),\n};\n\nstatic const union AnimCmd sAnim_JumpSmallSplash[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_JumpSmallSplash[] =\n{\n    sAnim_JumpSmallSplash,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_JumpSmallSplash =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_0,\n    .oam = &gObjectEventBaseOam_16x8,\n    .anims = sAnimTable_JumpSmallSplash,\n    .images = sPicTable_JumpSmallSplash,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateJumpImpactEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_LongGrass[] =\n{\n    overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 3),\n};\n\nstatic const union AnimCmd sAnim_LongGrass[] =\n{\n    ANIMCMD_FRAME(1, 3),\n    ANIMCMD_FRAME(2, 3),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_LongGrass[] =\n{\n    sAnim_LongGrass,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_1,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_LongGrass,\n    .images = sPicTable_LongGrass,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateLongGrassFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_JumpLongGrass[] =\n{\n    overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 3),\n    overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 4),\n    overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 6),\n};\n\nstatic const union AnimCmd sAnim_JumpLongGrass[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_FRAME(3, 8),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(5, 8),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_JumpLongGrass[] =\n{\n    sAnim_JumpLongGrass,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_JumpLongGrass =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_1,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_JumpLongGrass,\n    .images = sPicTable_JumpLongGrass,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateJumpImpactEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_UnusedGrass[] =\n{\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 3),\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 4),\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 5),\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 6),\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 7),\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass, 2, 2, 8),\n};\n\nstatic const union AnimCmd sAnim_UnusedGrass[] =\n{\n    ANIMCMD_FRAME(0, 10),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(5, 4),\n    ANIMCMD_FRAME(6, 4),\n    ANIMCMD_FRAME(7, 4),\n    ANIMCMD_FRAME(8, 4),\n    ANIMCMD_JUMP(7),\n};\n\nstatic const union AnimCmd *const sAnimTable_UnusedGrass[] =\n{\n    sAnim_UnusedGrass,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_1,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_UnusedGrass,\n    .images = sPicTable_UnusedGrass,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = WaitFieldEffectSpriteAnim,\n};\n\nstatic const struct SpriteFrameImage sPicTable_UnusedGrass2[] =\n{\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 3),\n};\n\nstatic const union AnimCmd sAnim_UnusedGrass2[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnimTable_UnusedGrass2[] =\n{\n    sAnim_UnusedGrass2,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass2 =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_1,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_UnusedGrass2,\n    .images = sPicTable_UnusedGrass2,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = WaitFieldEffectSpriteAnim,\n};\n\nstatic const struct SpriteFrameImage sPicTable_UnusedSand[] =\n{\n    overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 3),\n};\n\nstatic const union AnimCmd sAnim_UnusedSand[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnimTable_UnusedSand[] =\n{\n    sAnim_UnusedSand,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_UnusedSand =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_0,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_UnusedSand,\n    .images = sPicTable_UnusedSand,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = WaitFieldEffectSpriteAnim,\n};\n\nstatic const struct SpriteFrameImage sPicTable_SandPile[] =\n{\n    overworld_frame(gFieldEffectObjectPic_SandPile, 2, 1, 0),\n    overworld_frame(gFieldEffectObjectPic_SandPile, 2, 1, 1),\n    overworld_frame(gFieldEffectObjectPic_SandPile, 2, 1, 2),\n};\n\nstatic const union AnimCmd sAnim_SandPile[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_SandPile[] =\n{\n    sAnim_SandPile,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_SandPile =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_0,\n    .oam = &gObjectEventBaseOam_16x8,\n    .anims = sAnimTable_SandPile,\n    .images = sPicTable_SandPile,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateSandPileFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_WaterSurfacing[] =\n{\n    overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 3),\n};\n\nstatic const union AnimCmd sAnim_WaterSurfacing[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnimTable_WaterSurfacing[] =\n{\n    sAnim_WaterSurfacing,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_WaterSurfacing =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_0,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_WaterSurfacing,\n    .images = sPicTable_WaterSurfacing,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = WaitFieldEffectSpriteAnim,\n};\n\nconst union AffineAnimCmd sAffineAnim_ReflectionDistortion_0[] =\n{\n    AFFINEANIMCMD_FRAME(-256, 256, 128, 0),\n    AFFINEANIMCMD_FRAME(1, 0, 0, 4),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 8),\n    AFFINEANIMCMD_FRAME(-1, 0, 0, 4),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 8),\n    AFFINEANIMCMD_FRAME(-1, 0, 0, 4),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 8),\n    AFFINEANIMCMD_FRAME(1, 0, 0, 4),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 8),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nconst union AffineAnimCmd sAffineAnim_ReflectionDistortion_1[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, 128, 0),\n    AFFINEANIMCMD_FRAME(-1, 0, 0, 4),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 8),\n    AFFINEANIMCMD_FRAME(1, 0, 0, 4),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 8),\n    AFFINEANIMCMD_FRAME(1, 0, 0, 4),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 8),\n    AFFINEANIMCMD_FRAME(-1, 0, 0, 4),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 8),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nconst union AffineAnimCmd *const sAffineAnims_ReflectionDistortion[] =\n{\n    sAffineAnim_ReflectionDistortion_0,\n    sAffineAnim_ReflectionDistortion_1,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_ReflectionDistortion =\n{\n    .tileTag = 0x0,\n    .paletteTag = TAG_NONE,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_ReflectionDistortion,\n    .callback = SpriteCallbackDummy,\n};\n\n/*\nstatic const struct SpriteFrameImage sPicTable_Sparkle[] = {\n    overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 3),\n    overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 4),\n    overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 5),\n};\n\nstatic const union AnimCmd sAnim_Sparkle[] =\n{\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_FRAME(3, 8),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(5, 8),\n    ANIMCMD_LOOP(0),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(5, 4),\n    ANIMCMD_LOOP(3),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_FRAME(3, 8),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(5, 8),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_Sparkle[] =\n{\n    sAnim_Sparkle,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Sparkle = {\n    .tileTag = 0xFFFF,\n    .paletteTag = 0xFFFF,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_Sparkle,\n    .images = sPicTable_Sparkle,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = WaitFieldEffectSpriteAnim,\n};\n*/\n\nstatic const struct SpriteFrameImage sPicTable_TreeDisguise[] =\n{\n    overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 0),\n    overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 1),\n    overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 2),\n    overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 3),\n    overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 4),\n    overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 5),\n    overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 6),\n};\n\nstatic const union AnimCmd sAnim_TreeDisguise[] =\n{\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_TreeDisguiseReveal[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(5, 4),\n    ANIMCMD_FRAME(6, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_TreeDisguise[] =\n{\n    sAnim_TreeDisguise,\n    sAnim_TreeDisguiseReveal,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = TAG_NONE,\n    .oam = &gObjectEventBaseOam_16x32,\n    .anims = sAnimTable_TreeDisguise,\n    .images = sPicTable_TreeDisguise,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateDisguiseFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_MountainDisguise[] =\n{\n    overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 0),\n    overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 1),\n    overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 2),\n    overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 3),\n    overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 4),\n    overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 5),\n    overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 6),\n};\n\nstatic const union AnimCmd sAnim_MountainDisguise[] =\n{\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MountainDisguiseReveal[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(5, 4),\n    ANIMCMD_FRAME(6, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_MountainDisguise[] =\n{\n    sAnim_MountainDisguise,\n    sAnim_MountainDisguiseReveal,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = TAG_NONE,\n    .oam = &gObjectEventBaseOam_16x32,\n    .anims = sAnimTable_MountainDisguise,\n    .images = sPicTable_MountainDisguise,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateDisguiseFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_SandDisguisePlaceholder[] =\n{\n    overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 0),\n    overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 1),\n    overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 2),\n    overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 3),\n    overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 4),\n    overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 5),\n    overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 6),\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = TAG_NONE,\n    .oam = &gObjectEventBaseOam_16x32,\n    .anims = sAnimTable_TreeDisguise,\n    .images = sPicTable_SandDisguisePlaceholder,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateDisguiseFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_Bird[] =\n{\n    overworld_frame(gFieldEffectObjectPic_Bird, 8, 8, 0),\n    overworld_frame(gFieldEffectObjectPic_Bird, 8, 8, 1),\n    overworld_frame(gFieldEffectObjectPic_Bird, 8, 8, 2),\n    overworld_frame(gFieldEffectObjectPic_Bird, 8, 8, 3),\n    overworld_frame(gFieldEffectObjectPic_Bird, 8, 8, 4),\n};\n\nstatic const union AnimCmd sAnim_Bird_WithoutPlayer[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Bird_Red_FlyOut[] =\n{\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Bird_Red_FlyIn[] =\n{\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Bird_Green_FlyOut[] =\n{\n    ANIMCMD_FRAME(3, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Bird_Green_FlyIn[] =\n{\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_Bird[] =\n{\n    sAnim_Bird_WithoutPlayer,\n    sAnim_Bird_Red_FlyOut,\n    sAnim_Bird_Red_FlyIn,\n    sAnim_Bird_Green_FlyOut,\n    sAnim_Bird_Green_FlyIn,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Bird =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = TAG_NONE,\n    .oam = &gObjectEventBaseOam_64x64,\n    .anims = sAnimTable_Bird,\n    .images = sPicTable_Bird,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const struct SpriteFrameImage sPicTable_ShortGrass[] =\n{\n    overworld_frame(gFieldEffectObjectPic_ShortGrass, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_ShortGrass, 2, 2, 1),\n};\n\nstatic const union AnimCmd sAnim_ShortGrass[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_ShortGrass[] =\n{\n    sAnim_ShortGrass,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_1,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_ShortGrass,\n    .images = sPicTable_ShortGrass,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateShortGrassFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_HotSpringsWater[] =\n{\n    obj_frame_tiles(gFieldEffectObjectPic_HotSpringsWater),\n};\n\nstatic const union AnimCmd sAnim_HotSpringsWater[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_HotSpringsWater[] =\n{\n    sAnim_HotSpringsWater,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_1,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_HotSpringsWater,\n    .images = sPicTable_HotSpringsWater,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateHotSpringsWaterFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_AshPuff[] =\n{\n    overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 3),\n    overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 4),\n};\n\nstatic const union AnimCmd sAnim_AshPuff[] =\n{\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(1, 6),\n    ANIMCMD_FRAME(2, 6),\n    ANIMCMD_FRAME(3, 6),\n    ANIMCMD_FRAME(4, 6),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_AshPuff[] =\n{\n    sAnim_AshPuff,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_AshPuff =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_ASH,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_AshPuff,\n    .images = sPicTable_AshPuff,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_PopOutOfAsh,\n};\n\nconst struct SpritePalette gSpritePalette_Ash = { .data = gFieldEffectPal_Ash, .tag = FLDEFF_PAL_TAG_ASH };\n\nstatic const struct SpriteFrameImage sPicTable_AshLaunch[] =\n{\n    overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 1),\n    overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 2),\n    overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 3),\n    overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 4),\n};\n\nstatic const union AnimCmd sAnim_AshLaunch[] =\n{\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(1, 6),\n    ANIMCMD_FRAME(2, 6),\n    ANIMCMD_FRAME(3, 6),\n    ANIMCMD_FRAME(4, 6),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_AshLaunch[] =\n{\n    sAnim_AshLaunch,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_AshLaunch =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_ASH,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_AshLaunch,\n    .images = sPicTable_AshLaunch,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_AshLaunch,\n};\n\nstatic const struct SpriteFrameImage sPicTable_Bubbles[] =\n{\n    overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 0),\n    overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 1),\n    overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 2),\n    overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 3),\n    overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 4),\n    overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 5),\n    overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 6),\n    overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 7),\n};\n\nstatic const union AnimCmd sAnim_Bubbles[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(3, 6),\n    ANIMCMD_FRAME(4, 6),\n    ANIMCMD_FRAME(5, 4),\n    ANIMCMD_FRAME(6, 4),\n    ANIMCMD_FRAME(7, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_Bubbles[] =\n{\n    sAnim_Bubbles,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_GENERAL_0,\n    .oam = &gObjectEventBaseOam_16x32,\n    .anims = sAnimTable_Bubbles,\n    .images = sPicTable_Bubbles,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateBubblesFieldEffect,\n};\n\nstatic const struct SpriteFrameImage sPicTable_SmallSparkle[] =\n{\n    overworld_frame(gFieldEffectObjectPic_SmallSparkle, 2, 2, 0),\n    overworld_frame(gFieldEffectObjectPic_SmallSparkle, 2, 2, 1),\n};\n\nstatic const union AnimCmd sAnim_SmallSparkle[] =\n{\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(1, 5),\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnimTable_SmallSparkle[] =\n{\n    sAnim_SmallSparkle,\n};\n\nconst struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = FLDEFF_PAL_TAG_SMALL_SPARKLE,\n    .oam = &gObjectEventBaseOam_16x16,\n    .anims = sAnimTable_SmallSparkle,\n    .images = sPicTable_SmallSparkle,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateSparkleFieldEffect,\n};\n\nconst struct SpritePalette gSpritePalette_SmallSparkle = { .data = gFieldEffectPal_SmallSparkle, .tag = FLDEFF_PAL_TAG_SMALL_SPARKLE };\n"
  },
  {
    "path": "src/data/graphics/battle_terrain_unused.h",
    "content": "\n// All graphics in this file go completely unused.\n\nconst u32 gUnusedBattleTerrain_Plain_Palette[] = INCBIN_U32(\"graphics/battle_terrain/unused/plain.gbapal.lz\");\n\nconst u32 gUnusedBattleTerrain_Building_Tiles_Sheet[] = INCBIN_U32(\"graphics/battle_terrain/unused/building/tiles.4bpp.lz\");\n\nconst u32 gUnusedBattleTerrain_Stadium_Battle_Frontier_Palette[] = INCBIN_U32(\"graphics/battle_terrain/unused/stadium/battle_frontier.gbapal.lz\");\n\nconst u32 gUnusedBattleTerrain_Building_Map_Tilemap[] = INCBIN_U32(\"graphics/battle_terrain/unused/building/map.bin.lz\");\n\nconst u32 gUnusedBattleTerrain_Stadium_Tiles_Sheet[] = INCBIN_U32(\"graphics/battle_terrain/unused/stadium/tiles.4bpp.lz\");\nconst u32 gUnusedBattleTerrain_Stadium_Map_Tilemap[] = INCBIN_U32(\"graphics/battle_terrain/unused/stadium/map.bin.lz\");\n\nconst u32 gUnusedBattleTerrain_Building_Palette[] = INCBIN_U32(\"graphics/battle_terrain/unused/building/palette.gbapal.lz\");\n\nconst u32 gUnusedBattleTerrain_Kyogre_Palette[] = INCBIN_U32(\"graphics/battle_terrain/unused/kyogre.gbapal.lz\");\nconst u32 gUnusedBattleTerrain_Groudon_Palette[] = INCBIN_U32(\"graphics/battle_terrain/unused/groudon.gbapal.lz\");\n\nconst u32 gUnusedBattleTerrain_Building_Palette2[] = INCBIN_U32(\"graphics/battle_terrain/unused/building/palette2.gbapal.lz\");\nconst u32 gUnusedBattleTerrain_Building_Palette3[] = INCBIN_U32(\"graphics/battle_terrain/unused/building/palette3.gbapal.lz\");\n\nconst u32 gUnusedBattleTerrain_Stadium_Palette1[] = INCBIN_U32(\"graphics/battle_terrain/unused/stadium/palette1.gbapal.lz\");\nconst u32 gUnusedBattleTerrain_Stadium_Palette2[] = INCBIN_U32(\"graphics/battle_terrain/unused/stadium/palette2.gbapal.lz\");\nconst u32 gUnusedBattleTerrain_Stadium_Palette3[] = INCBIN_U32(\"graphics/battle_terrain/unused/stadium/palette3.gbapal.lz\");\nconst u32 gUnusedBattleTerrain_Stadium_Palette4[] = INCBIN_U32(\"graphics/battle_terrain/unused/stadium/palette4.gbapal.lz\");\nconst u32 gUnusedBattleTerrain_Stadium_Palette5[] = INCBIN_U32(\"graphics/battle_terrain/unused/stadium/palette5.gbapal.lz\");\nconst u32 gUnusedBattleTerrain_Stadium_Palette6[] = INCBIN_U32(\"graphics/battle_terrain/unused/stadium/palette6.gbapal.lz\");\nconst u32 gUnusedBattleTerrain_Stadium_Palette7[] = INCBIN_U32(\"graphics/battle_terrain/unused/stadium/palette7.gbapal.lz\");\n\nconst u32 gUnusedBattleTerrain_Building_Anim_Tiles_Sheet[] = INCBIN_U32(\"graphics/battle_terrain/unused/building/anim_tiles.4bpp.lz\");\nconst u32 gUnusedBattleTerrain_Building_Anim_Map_Tilemap[] = INCBIN_U32(\"graphics/battle_terrain/unused/building/anim_map.bin.lz\");\n"
  },
  {
    "path": "src/data/graphics/interface_pokeballs.h",
    "content": "const u32 gBallGfx_Poke[] = INCBIN_U32(\"graphics/interface/ball/poke.4bpp.lz\");\nconst u32 gBallPal_Poke[] = INCBIN_U32(\"graphics/interface/ball/poke.gbapal.lz\");\n\nconst u32 gBallGfx_Great[] = INCBIN_U32(\"graphics/interface/ball/great.4bpp.lz\");\nconst u32 gBallPal_Great[] = INCBIN_U32(\"graphics/interface/ball/great.gbapal.lz\");\n\nconst u32 gBallGfx_Safari[] = INCBIN_U32(\"graphics/interface/ball/safari.4bpp.lz\");\nconst u32 gBallPal_Safari[] = INCBIN_U32(\"graphics/interface/ball/safari.gbapal.lz\");\n\nconst u32 gBallGfx_Ultra[] = INCBIN_U32(\"graphics/interface/ball/ultra.4bpp.lz\");\nconst u32 gBallPal_Ultra[] = INCBIN_U32(\"graphics/interface/ball/ultra.gbapal.lz\");\n\nconst u32 gBallGfx_Master[] = INCBIN_U32(\"graphics/interface/ball/master.4bpp.lz\");\nconst u32 gBallPal_Master[] = INCBIN_U32(\"graphics/interface/ball/master.gbapal.lz\");\n\nconst u32 gBallGfx_Net[] = INCBIN_U32(\"graphics/interface/ball/net.4bpp.lz\");\nconst u32 gBallPal_Net[] = INCBIN_U32(\"graphics/interface/ball/net.gbapal.lz\");\n\nconst u32 gBallGfx_Dive[] = INCBIN_U32(\"graphics/interface/ball/dive.4bpp.lz\");\nconst u32 gBallPal_Dive[] = INCBIN_U32(\"graphics/interface/ball/dive.gbapal.lz\");\n\nconst u32 gBallGfx_Nest[] = INCBIN_U32(\"graphics/interface/ball/nest.4bpp.lz\");\nconst u32 gBallPal_Nest[] = INCBIN_U32(\"graphics/interface/ball/nest.gbapal.lz\");\n\nconst u32 gBallGfx_Repeat[] = INCBIN_U32(\"graphics/interface/ball/repeat.4bpp.lz\");\nconst u32 gBallPal_Repeat[] = INCBIN_U32(\"graphics/interface/ball/repeat.gbapal.lz\");\n\nconst u32 gBallGfx_Timer[] = INCBIN_U32(\"graphics/interface/ball/timer.4bpp.lz\");\nconst u32 gBallPal_Timer[] = INCBIN_U32(\"graphics/interface/ball/timer.gbapal.lz\");\n\nconst u32 gBallGfx_Luxury[] = INCBIN_U32(\"graphics/interface/ball/luxury.4bpp.lz\");\nconst u32 gBallPal_Luxury[] = INCBIN_U32(\"graphics/interface/ball/luxury.gbapal.lz\");\n\nconst u32 gBallGfx_Premier[] = INCBIN_U32(\"graphics/interface/ball/premier.4bpp.lz\");\nconst u32 gBallPal_Premier[] = INCBIN_U32(\"graphics/interface/ball/premier.gbapal.lz\");\n\nconst u32 gOpenPokeballGfx[] = INCBIN_U32(\"graphics/interface/ball_open.4bpp.lz\");\n"
  },
  {
    "path": "src/data/graphics/items.h",
    "content": "const u32 gItemIcon_QuestionMark[] = INCBIN_U32(\"graphics/items/icons/question_mark.4bpp.lz\");\nconst u32 gItemIconPalette_QuestionMark[] = INCBIN_U32(\"graphics/items/icon_palettes/question_mark.gbapal.lz\");\n\nconst u32 gItemIcon_ReturnToFieldArrow[] = INCBIN_U32(\"graphics/items/icons/return_to_field_arrow.4bpp.lz\");\nconst u32 gItemIconPalette_ReturnToFieldArrow[] = INCBIN_U32(\"graphics/items/icon_palettes/return_to_field_arrow.gbapal.lz\");\n\n// Pokeballs\n\nconst u32 gItemIcon_MasterBall[] = INCBIN_U32(\"graphics/items/icons/master_ball.4bpp.lz\");\nconst u32 gItemIconPalette_MasterBall[] = INCBIN_U32(\"graphics/items/icon_palettes/master_ball.gbapal.lz\");\n\nconst u32 gItemIcon_UltraBall[] = INCBIN_U32(\"graphics/items/icons/ultra_ball.4bpp.lz\");\nconst u32 gItemIconPalette_UltraBall[] = INCBIN_U32(\"graphics/items/icon_palettes/ultra_ball.gbapal.lz\");\n\nconst u32 gItemIcon_GreatBall[] = INCBIN_U32(\"graphics/items/icons/great_ball.4bpp.lz\");\nconst u32 gItemIconPalette_GreatBall[] = INCBIN_U32(\"graphics/items/icon_palettes/great_ball.gbapal.lz\");\n\nconst u32 gItemIcon_PokeBall[] = INCBIN_U32(\"graphics/items/icons/poke_ball.4bpp.lz\");\nconst u32 gItemIconPalette_PokeBall[] = INCBIN_U32(\"graphics/items/icon_palettes/poke_ball.gbapal.lz\");\n\nconst u32 gItemIcon_SafariBall[] = INCBIN_U32(\"graphics/items/icons/safari_ball.4bpp.lz\");\nconst u32 gItemIconPalette_SafariBall[] = INCBIN_U32(\"graphics/items/icon_palettes/safari_ball.gbapal.lz\");\n\nconst u32 gItemIcon_NetBall[] = INCBIN_U32(\"graphics/items/icons/net_ball.4bpp.lz\");\nconst u32 gItemIconPalette_NetBall[] = INCBIN_U32(\"graphics/items/icon_palettes/net_ball.gbapal.lz\");\n\nconst u32 gItemIcon_DiveBall[] = INCBIN_U32(\"graphics/items/icons/dive_ball.4bpp.lz\");\nconst u32 gItemIconPalette_DiveBall[] = INCBIN_U32(\"graphics/items/icon_palettes/dive_ball.gbapal.lz\");\n\nconst u32 gItemIcon_NestBall[] = INCBIN_U32(\"graphics/items/icons/nest_ball.4bpp.lz\");\nconst u32 gItemIconPalette_NestBall[] = INCBIN_U32(\"graphics/items/icon_palettes/nest_ball.gbapal.lz\");\n\nconst u32 gItemIcon_RepeatBall[] = INCBIN_U32(\"graphics/items/icons/repeat_ball.4bpp.lz\");\nconst u32 gItemIconPalette_RepeatBall[] = INCBIN_U32(\"graphics/items/icon_palettes/repeat_ball.gbapal.lz\");\n\nconst u32 gItemIcon_TimerBall[] = INCBIN_U32(\"graphics/items/icons/timer_ball.4bpp.lz\");\n\nconst u32 gItemIcon_LuxuryBall[] = INCBIN_U32(\"graphics/items/icons/luxury_ball.4bpp.lz\");\nconst u32 gItemIconPalette_LuxuryBall[] = INCBIN_U32(\"graphics/items/icon_palettes/luxury_ball.gbapal.lz\");\n\nconst u32 gItemIcon_PremierBall[] = INCBIN_U32(\"graphics/items/icons/premier_ball.4bpp.lz\");\n\n// Medicine\n\nconst u32 gItemIcon_Potion[] = INCBIN_U32(\"graphics/items/icons/potion.4bpp.lz\");\nconst u32 gItemIconPalette_Potion[] = INCBIN_U32(\"graphics/items/icon_palettes/potion.gbapal.lz\");\n\nconst u32 gItemIcon_Antidote[] = INCBIN_U32(\"graphics/items/icons/antidote.4bpp.lz\");\nconst u32 gItemIconPalette_Antidote[] = INCBIN_U32(\"graphics/items/icon_palettes/antidote.gbapal.lz\");\n\nconst u32 gItemIconPalette_BurnHeal[] = INCBIN_U32(\"graphics/items/icon_palettes/burn_heal.gbapal.lz\");\nconst u32 gItemIconPalette_IceHeal[] = INCBIN_U32(\"graphics/items/icon_palettes/ice_heal.gbapal.lz\");\nconst u32 gItemIcon_StatusHeal[] = INCBIN_U32(\"graphics/items/icons/status_heal.4bpp.lz\");\nconst u32 gItemIconPalette_Awakening[] = INCBIN_U32(\"graphics/items/icon_palettes/awakening.gbapal.lz\");\nconst u32 gItemIconPalette_ParalyzeHeal[] = INCBIN_U32(\"graphics/items/icon_palettes/paralyze_heal.gbapal.lz\");\n\nconst u32 gItemIcon_LargePotion[] = INCBIN_U32(\"graphics/items/icons/large_potion.4bpp.lz\");\nconst u32 gItemIconPalette_FullRestore[] = INCBIN_U32(\"graphics/items/icon_palettes/full_restore.gbapal.lz\");\nconst u32 gItemIconPalette_MaxPotion[] = INCBIN_U32(\"graphics/items/icon_palettes/max_potion.gbapal.lz\");\n\nconst u32 gItemIconPalette_HyperPotion[] = INCBIN_U32(\"graphics/items/icon_palettes/hyper_potion.gbapal.lz\");\n\nconst u32 gItemIconPalette_SuperPotion[] = INCBIN_U32(\"graphics/items/icon_palettes/super_potion.gbapal.lz\");\n\nconst u32 gItemIcon_FullHeal[] = INCBIN_U32(\"graphics/items/icons/full_heal.4bpp.lz\");\nconst u32 gItemIconPalette_FullHeal[] = INCBIN_U32(\"graphics/items/icon_palettes/full_heal.gbapal.lz\");\n\nconst u32 gItemIcon_Revive[] = INCBIN_U32(\"graphics/items/icons/revive.4bpp.lz\");\n\nconst u32 gItemIcon_MaxRevive[] = INCBIN_U32(\"graphics/items/icons/max_revive.4bpp.lz\");\n\nconst u32 gItemIconPalette_Revive[] = INCBIN_U32(\"graphics/items/icon_palettes/revive.gbapal.lz\");\n\nconst u32 gItemIcon_FreshWater[] = INCBIN_U32(\"graphics/items/icons/fresh_water.4bpp.lz\");\nconst u32 gItemIconPalette_FreshWater[] = INCBIN_U32(\"graphics/items/icon_palettes/fresh_water.gbapal.lz\");\n\nconst u32 gItemIcon_SodaPop[] = INCBIN_U32(\"graphics/items/icons/soda_pop.4bpp.lz\");\nconst u32 gItemIconPalette_SodaPop[] = INCBIN_U32(\"graphics/items/icon_palettes/soda_pop.gbapal.lz\");\n\nconst u32 gItemIcon_Lemonade[] = INCBIN_U32(\"graphics/items/icons/lemonade.4bpp.lz\");\nconst u32 gItemIconPalette_Lemonade[] = INCBIN_U32(\"graphics/items/icon_palettes/lemonade.gbapal.lz\");\n\nconst u32 gItemIcon_MoomooMilk[] = INCBIN_U32(\"graphics/items/icons/moomoo_milk.4bpp.lz\");\nconst u32 gItemIconPalette_MoomooMilk[] = INCBIN_U32(\"graphics/items/icon_palettes/moomoo_milk.gbapal.lz\");\n\nconst u32 gItemIcon_Powder[] = INCBIN_U32(\"graphics/items/icons/powder.4bpp.lz\");\nconst u32 gItemIconPalette_EnergyPowder[] = INCBIN_U32(\"graphics/items/icon_palettes/energy_powder.gbapal.lz\");\n\nconst u32 gItemIcon_EnergyRoot[] = INCBIN_U32(\"graphics/items/icons/energy_root.4bpp.lz\");\nconst u32 gItemIconPalette_EnergyRoot[] = INCBIN_U32(\"graphics/items/icon_palettes/energy_root.gbapal.lz\");\n\nconst u32 gItemIconPalette_HealPowder[] = INCBIN_U32(\"graphics/items/icon_palettes/heal_powder.gbapal.lz\");\n\nconst u32 gItemIcon_RevivalHerb[] = INCBIN_U32(\"graphics/items/icons/revival_herb.4bpp.lz\");\nconst u32 gItemIconPalette_RevivalHerb[] = INCBIN_U32(\"graphics/items/icon_palettes/revival_herb.gbapal.lz\");\n\nconst u32 gItemIcon_Ether[] = INCBIN_U32(\"graphics/items/icons/ether.4bpp.lz\");\nconst u32 gItemIconPalette_Ether[] = INCBIN_U32(\"graphics/items/icon_palettes/ether.gbapal.lz\");\nconst u32 gItemIconPalette_MaxEther[] = INCBIN_U32(\"graphics/items/icon_palettes/max_ether.gbapal.lz\");\nconst u32 gItemIconPalette_Elixir[] = INCBIN_U32(\"graphics/items/icon_palettes/elixir.gbapal.lz\");\nconst u32 gItemIconPalette_MaxElixir[] = INCBIN_U32(\"graphics/items/icon_palettes/max_elixir.gbapal.lz\");\n\nconst u32 gItemIcon_LavaCookie[] = INCBIN_U32(\"graphics/items/icons/lava_cookie.4bpp.lz\");\nconst u32 gItemIconPalette_LavaCookieAndLetter[] = INCBIN_U32(\"graphics/items/icon_palettes/lava_cookie_and_letter.gbapal.lz\");\n\nconst u32 gItemIcon_Flute[] = INCBIN_U32(\"graphics/items/icons/flute.4bpp.lz\");\nconst u32 gItemIconPalette_BlueFlute[] = INCBIN_U32(\"graphics/items/icon_palettes/blue_flute.gbapal.lz\");\nconst u32 gItemIconPalette_YellowFlute[] = INCBIN_U32(\"graphics/items/icon_palettes/yellow_flute.gbapal.lz\");\nconst u32 gItemIconPalette_RedFlute[] = INCBIN_U32(\"graphics/items/icon_palettes/red_flute.gbapal.lz\");\nconst u32 gItemIconPalette_BlackFlute[] = INCBIN_U32(\"graphics/items/icon_palettes/black_flute.gbapal.lz\");\nconst u32 gItemIconPalette_WhiteFlute[] = INCBIN_U32(\"graphics/items/icon_palettes/white_flute.gbapal.lz\");\n\nconst u32 gItemIcon_BerryJuice[] = INCBIN_U32(\"graphics/items/icons/berry_juice.4bpp.lz\");\nconst u32 gItemIconPalette_BerryJuice[] = INCBIN_U32(\"graphics/items/icon_palettes/berry_juice.gbapal.lz\");\n\nconst u32 gItemIcon_SacredAsh[] = INCBIN_U32(\"graphics/items/icons/sacred_ash.4bpp.lz\");\nconst u32 gItemIconPalette_SacredAsh[] = INCBIN_U32(\"graphics/items/icon_palettes/sacred_ash.gbapal.lz\");\n\n// Collectibles\n\nconst u32 gItemIconPalette_ShoalSalt[] = INCBIN_U32(\"graphics/items/icon_palettes/shoal_salt.gbapal.lz\");\n\nconst u32 gItemIcon_ShoalShell[] = INCBIN_U32(\"graphics/items/icons/shoal_shell.4bpp.lz\");\nconst u32 gItemIconPalette_Shell[] = INCBIN_U32(\"graphics/items/icon_palettes/shell.gbapal.lz\");\n\nconst u32 gItemIcon_Shard[] = INCBIN_U32(\"graphics/items/icons/shard.4bpp.lz\");\nconst u32 gItemIconPalette_RedShard[] = INCBIN_U32(\"graphics/items/icon_palettes/red_shard.gbapal.lz\");\nconst u32 gItemIconPalette_BlueShard[] = INCBIN_U32(\"graphics/items/icon_palettes/blue_shard.gbapal.lz\");\nconst u32 gItemIconPalette_YellowShard[] = INCBIN_U32(\"graphics/items/icon_palettes/yellow_shard.gbapal.lz\");\nconst u32 gItemIconPalette_GreenShard[] = INCBIN_U32(\"graphics/items/icon_palettes/green_shard.gbapal.lz\");\n\n// Vitamins\n\nconst u32 gItemIcon_HPUp[] = INCBIN_U32(\"graphics/items/icons/hp_up.4bpp.lz\");\nconst u32 gItemIconPalette_HPUp[] = INCBIN_U32(\"graphics/items/icon_palettes/hp_up.gbapal.lz\");\n\nconst u32 gItemIcon_Vitamin[] = INCBIN_U32(\"graphics/items/icons/vitamin.4bpp.lz\");\nconst u32 gItemIconPalette_Protein[] = INCBIN_U32(\"graphics/items/icon_palettes/protein.gbapal.lz\");\nconst u32 gItemIconPalette_Iron[] = INCBIN_U32(\"graphics/items/icon_palettes/iron.gbapal.lz\");\nconst u32 gItemIconPalette_Carbos[] = INCBIN_U32(\"graphics/items/icon_palettes/carbos.gbapal.lz\");\nconst u32 gItemIconPalette_Calcium[] = INCBIN_U32(\"graphics/items/icon_palettes/calcium.gbapal.lz\");\n\nconst u32 gItemIcon_RareCandy[] = INCBIN_U32(\"graphics/items/icons/rare_candy.4bpp.lz\");\nconst u32 gItemIconPalette_RareCandy[] = INCBIN_U32(\"graphics/items/icon_palettes/rare_candy.gbapal.lz\");\n\nconst u32 gItemIcon_PPUp[] = INCBIN_U32(\"graphics/items/icons/pp_up.4bpp.lz\");\nconst u32 gItemIconPalette_PPUp[] = INCBIN_U32(\"graphics/items/icon_palettes/pp_up.gbapal.lz\");\n\nconst u32 gItemIconPalette_Zinc[] = INCBIN_U32(\"graphics/items/icon_palettes/zinc.gbapal.lz\");\n\nconst u32 gItemIcon_PPMax[] = INCBIN_U32(\"graphics/items/icons/pp_max.4bpp.lz\");\nconst u32 gItemIconPalette_PPMax[] = INCBIN_U32(\"graphics/items/icon_palettes/pp_max.gbapal.lz\");\n\n// Battle items\n\nconst u32 gItemIconPalette_GuardSpec[] = INCBIN_U32(\"graphics/items/icon_palettes/guard_spec.gbapal.lz\");\nconst u32 gItemIconPalette_DireHit[] = INCBIN_U32(\"graphics/items/icon_palettes/dire_hit.gbapal.lz\");\nconst u32 gItemIconPalette_XAttack[] = INCBIN_U32(\"graphics/items/icon_palettes/x_attack.gbapal.lz\");\nconst u32 gItemIcon_BattleStatItem[] = INCBIN_U32(\"graphics/items/icons/battle_stat_item.4bpp.lz\");\nconst u32 gItemIconPalette_XDefend[] = INCBIN_U32(\"graphics/items/icon_palettes/x_defend.gbapal.lz\");\nconst u32 gItemIconPalette_XSpeed[] = INCBIN_U32(\"graphics/items/icon_palettes/x_speed.gbapal.lz\");\nconst u32 gItemIconPalette_XAccuracy[] = INCBIN_U32(\"graphics/items/icon_palettes/x_accuracy.gbapal.lz\");\nconst u32 gItemIconPalette_XSpecial[] = INCBIN_U32(\"graphics/items/icon_palettes/x_special.gbapal.lz\");\n\nconst u32 gItemIcon_PokeDoll[] = INCBIN_U32(\"graphics/items/icons/poke_doll.4bpp.lz\");\nconst u32 gItemIconPalette_PokeDoll[] = INCBIN_U32(\"graphics/items/icon_palettes/poke_doll.gbapal.lz\");\n\nconst u32 gItemIcon_FluffyTail[] = INCBIN_U32(\"graphics/items/icons/fluffy_tail.4bpp.lz\");\nconst u32 gItemIconPalette_FluffyTail[] = INCBIN_U32(\"graphics/items/icon_palettes/fluffy_tail.gbapal.lz\");\n\n// Field items\n\nconst u32 gItemIcon_Repel[] = INCBIN_U32(\"graphics/items/icons/repel.4bpp.lz\");\nconst u32 gItemIconPalette_SuperRepel[] = INCBIN_U32(\"graphics/items/icon_palettes/super_repel.gbapal.lz\");\nconst u32 gItemIconPalette_MaxRepel[] = INCBIN_U32(\"graphics/items/icon_palettes/max_repel.gbapal.lz\");\n\nconst u32 gItemIcon_EscapeRope[] = INCBIN_U32(\"graphics/items/icons/escape_rope.4bpp.lz\");\n\nconst u32 gItemIconPalette_EscapeRope[] = INCBIN_U32(\"graphics/items/icon_palettes/escape_rope.gbapal.lz\");\n\nconst u32 gItemIconPalette_Repel[] = INCBIN_U32(\"graphics/items/icon_palettes/repel.gbapal.lz\");\n\n// Evolution stones\n\nconst u32 gItemIcon_SunStone[] = INCBIN_U32(\"graphics/items/icons/sun_stone.4bpp.lz\");\nconst u32 gItemIconPalette_SunStone[] = INCBIN_U32(\"graphics/items/icon_palettes/sun_stone.gbapal.lz\");\n\nconst u32 gItemIcon_MoonStone[] = INCBIN_U32(\"graphics/items/icons/moon_stone.4bpp.lz\");\nconst u32 gItemIconPalette_MoonStone[] = INCBIN_U32(\"graphics/items/icon_palettes/moon_stone.gbapal.lz\");\n\nconst u32 gItemIcon_FireStone[] = INCBIN_U32(\"graphics/items/icons/fire_stone.4bpp.lz\");\nconst u32 gItemIconPalette_FireStone[] = INCBIN_U32(\"graphics/items/icon_palettes/fire_stone.gbapal.lz\");\n\nconst u32 gItemIcon_ThunderStone[] = INCBIN_U32(\"graphics/items/icons/thunder_stone.4bpp.lz\");\nconst u32 gItemIconPalette_ThunderStone[] = INCBIN_U32(\"graphics/items/icon_palettes/thunder_stone.gbapal.lz\");\n\nconst u32 gItemIcon_WaterStone[] = INCBIN_U32(\"graphics/items/icons/water_stone.4bpp.lz\");\nconst u32 gItemIconPalette_WaterStone[] = INCBIN_U32(\"graphics/items/icon_palettes/water_stone.gbapal.lz\");\n\nconst u32 gItemIcon_LeafStone[] = INCBIN_U32(\"graphics/items/icons/leaf_stone.4bpp.lz\");\nconst u32 gItemIconPalette_LeafStone[] = INCBIN_U32(\"graphics/items/icon_palettes/leaf_stone.gbapal.lz\");\n\n// Valuables\n\nconst u32 gItemIcon_TinyMushroom[] = INCBIN_U32(\"graphics/items/icons/tiny_mushroom.4bpp.lz\");\nconst u32 gItemIcon_BigMushroom[] = INCBIN_U32(\"graphics/items/icons/big_mushroom.4bpp.lz\");\nconst u32 gItemIconPalette_Mushroom[] = INCBIN_U32(\"graphics/items/icon_palettes/mushroom.gbapal.lz\");\n\nconst u32 gItemIcon_Pearl[] = INCBIN_U32(\"graphics/items/icons/pearl.4bpp.lz\");\nconst u32 gItemIconPalette_Pearl[] = INCBIN_U32(\"graphics/items/icon_palettes/pearl.gbapal.lz\");\nconst u32 gItemIcon_BigPearl[] = INCBIN_U32(\"graphics/items/icons/big_pearl.4bpp.lz\");\n\nconst u32 gItemIcon_Stardust[] = INCBIN_U32(\"graphics/items/icons/stardust.4bpp.lz\");\nconst u32 gItemIconPalette_Star[] = INCBIN_U32(\"graphics/items/icon_palettes/star.gbapal.lz\");\nconst u32 gItemIcon_StarPiece[] = INCBIN_U32(\"graphics/items/icons/star_piece.4bpp.lz\");\n\nconst u32 gItemIcon_Nugget[] = INCBIN_U32(\"graphics/items/icons/nugget.4bpp.lz\");\nconst u32 gItemIconPalette_Nugget[] = INCBIN_U32(\"graphics/items/icon_palettes/nugget.gbapal.lz\");\n\nconst u32 gItemIcon_HeartScale[] = INCBIN_U32(\"graphics/items/icons/heart_scale.4bpp.lz\");\nconst u32 gItemIconPalette_HeartScale[] = INCBIN_U32(\"graphics/items/icon_palettes/heart_scale.gbapal.lz\");\n\n// Mail\n\nconst u32 gItemIcon_OrangeMail[] = INCBIN_U32(\"graphics/items/icons/orange_mail.4bpp.lz\");\nconst u32 gItemIconPalette_OrangeMail[] = INCBIN_U32(\"graphics/items/icon_palettes/orange_mail.gbapal.lz\");\n\nconst u32 gItemIcon_HarborMail[] = INCBIN_U32(\"graphics/items/icons/harbor_mail.4bpp.lz\");\nconst u32 gItemIconPalette_HarborMail[] = INCBIN_U32(\"graphics/items/icon_palettes/harbor_mail.gbapal.lz\");\n\nconst u32 gItemIcon_GlitterMail[] = INCBIN_U32(\"graphics/items/icons/glitter_mail.4bpp.lz\");\nconst u32 gItemIconPalette_GlitterMail[] = INCBIN_U32(\"graphics/items/icon_palettes/glitter_mail.gbapal.lz\");\n\nconst u32 gItemIcon_MechMail[] = INCBIN_U32(\"graphics/items/icons/mech_mail.4bpp.lz\");\nconst u32 gItemIconPalette_MechMail[] = INCBIN_U32(\"graphics/items/icon_palettes/mech_mail.gbapal.lz\");\n\nconst u32 gItemIcon_WoodMail[] = INCBIN_U32(\"graphics/items/icons/wood_mail.4bpp.lz\");\nconst u32 gItemIconPalette_WoodMail[] = INCBIN_U32(\"graphics/items/icon_palettes/wood_mail.gbapal.lz\");\n\nconst u32 gItemIcon_WaveMail[] = INCBIN_U32(\"graphics/items/icons/wave_mail.4bpp.lz\");\nconst u32 gItemIconPalette_WaveMail[] = INCBIN_U32(\"graphics/items/icon_palettes/wave_mail.gbapal.lz\");\n\nconst u32 gItemIcon_BeadMail[] = INCBIN_U32(\"graphics/items/icons/bead_mail.4bpp.lz\");\nconst u32 gItemIconPalette_BeadMail[] = INCBIN_U32(\"graphics/items/icon_palettes/bead_mail.gbapal.lz\");\n\nconst u32 gItemIcon_ShadowMail[] = INCBIN_U32(\"graphics/items/icons/shadow_mail.4bpp.lz\");\nconst u32 gItemIconPalette_ShadowMail[] = INCBIN_U32(\"graphics/items/icon_palettes/shadow_mail.gbapal.lz\");\n\nconst u32 gItemIcon_TropicMail[] = INCBIN_U32(\"graphics/items/icons/tropic_mail.4bpp.lz\");\nconst u32 gItemIconPalette_TropicMail[] = INCBIN_U32(\"graphics/items/icon_palettes/tropic_mail.gbapal.lz\");\n\nconst u32 gItemIcon_DreamMail[] = INCBIN_U32(\"graphics/items/icons/dream_mail.4bpp.lz\");\nconst u32 gItemIconPalette_DreamMail[] = INCBIN_U32(\"graphics/items/icon_palettes/dream_mail.gbapal.lz\");\n\nconst u32 gItemIcon_FabMail[] = INCBIN_U32(\"graphics/items/icons/fab_mail.4bpp.lz\");\nconst u32 gItemIconPalette_FabMail[] = INCBIN_U32(\"graphics/items/icon_palettes/fab_mail.gbapal.lz\");\n\nconst u32 gItemIcon_RetroMail[] = INCBIN_U32(\"graphics/items/icons/retro_mail.4bpp.lz\");\nconst u32 gItemIconPalette_RetroMail[] = INCBIN_U32(\"graphics/items/icon_palettes/retro_mail.gbapal.lz\");\n\n// Berries\n\nconst u32 gItemIcon_CheriBerry[] = INCBIN_U32(\"graphics/items/icons/cheri_berry.4bpp.lz\");\nconst u32 gItemIconPalette_CheriBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/cheri_berry.gbapal.lz\");\n\nconst u32 gItemIcon_ChestoBerry[] = INCBIN_U32(\"graphics/items/icons/chesto_berry.4bpp.lz\");\nconst u32 gItemIconPalette_ChestoBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/chesto_berry.gbapal.lz\");\n\nconst u32 gItemIcon_PechaBerry[] = INCBIN_U32(\"graphics/items/icons/pecha_berry.4bpp.lz\");\nconst u32 gItemIconPalette_PechaBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/pecha_berry.gbapal.lz\");\n\nconst u32 gItemIcon_RawstBerry[] = INCBIN_U32(\"graphics/items/icons/rawst_berry.4bpp.lz\");\nconst u32 gItemIconPalette_RawstBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/rawst_berry.gbapal.lz\");\n\nconst u32 gItemIcon_AspearBerry[] = INCBIN_U32(\"graphics/items/icons/aspear_berry.4bpp.lz\");\nconst u32 gItemIconPalette_AspearBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/aspear_berry.gbapal.lz\");\n\nconst u32 gItemIcon_LeppaBerry[] = INCBIN_U32(\"graphics/items/icons/leppa_berry.4bpp.lz\");\nconst u32 gItemIconPalette_LeppaBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/leppa_berry.gbapal.lz\");\n\nconst u32 gItemIcon_OranBerry[] = INCBIN_U32(\"graphics/items/icons/oran_berry.4bpp.lz\");\nconst u32 gItemIconPalette_OranBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/oran_berry.gbapal.lz\");\n\nconst u32 gItemIcon_PersimBerry[] = INCBIN_U32(\"graphics/items/icons/persim_berry.4bpp.lz\");\nconst u32 gItemIconPalette_PersimBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/persim_berry.gbapal.lz\");\n\nconst u32 gItemIcon_LumBerry[] = INCBIN_U32(\"graphics/items/icons/lum_berry.4bpp.lz\");\nconst u32 gItemIconPalette_LumBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/lum_berry.gbapal.lz\");\n\nconst u32 gItemIcon_SitrusBerry[] = INCBIN_U32(\"graphics/items/icons/sitrus_berry.4bpp.lz\");\nconst u32 gItemIconPalette_SitrusBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/sitrus_berry.gbapal.lz\");\n\nconst u32 gItemIcon_FigyBerry[] = INCBIN_U32(\"graphics/items/icons/figy_berry.4bpp.lz\");\nconst u32 gItemIconPalette_FigyBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/figy_berry.gbapal.lz\");\n\nconst u32 gItemIcon_WikiBerry[] = INCBIN_U32(\"graphics/items/icons/wiki_berry.4bpp.lz\");\nconst u32 gItemIconPalette_WikiBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/wiki_berry.gbapal.lz\");\n\nconst u32 gItemIcon_MagoBerry[] = INCBIN_U32(\"graphics/items/icons/mago_berry.4bpp.lz\");\nconst u32 gItemIconPalette_MagoBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/mago_berry.gbapal.lz\");\n\nconst u32 gItemIcon_AguavBerry[] = INCBIN_U32(\"graphics/items/icons/aguav_berry.4bpp.lz\");\nconst u32 gItemIconPalette_AguavBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/aguav_berry.gbapal.lz\");\n\nconst u32 gItemIcon_IapapaBerry[] = INCBIN_U32(\"graphics/items/icons/iapapa_berry.4bpp.lz\");\nconst u32 gItemIconPalette_IapapaBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/iapapa_berry.gbapal.lz\");\n\nconst u32 gItemIcon_RazzBerry[] = INCBIN_U32(\"graphics/items/icons/razz_berry.4bpp.lz\");\nconst u32 gItemIconPalette_RazzBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/razz_berry.gbapal.lz\");\n\nconst u32 gItemIcon_BlukBerry[] = INCBIN_U32(\"graphics/items/icons/bluk_berry.4bpp.lz\");\nconst u32 gItemIconPalette_BlukBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/bluk_berry.gbapal.lz\");\n\nconst u32 gItemIcon_NanabBerry[] = INCBIN_U32(\"graphics/items/icons/nanab_berry.4bpp.lz\");\nconst u32 gItemIconPalette_NanabBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/nanab_berry.gbapal.lz\");\n\nconst u32 gItemIcon_WepearBerry[] = INCBIN_U32(\"graphics/items/icons/wepear_berry.4bpp.lz\");\nconst u32 gItemIconPalette_WepearBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/wepear_berry.gbapal.lz\");\n\nconst u32 gItemIcon_PinapBerry[] = INCBIN_U32(\"graphics/items/icons/pinap_berry.4bpp.lz\");\nconst u32 gItemIconPalette_PinapBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/pinap_berry.gbapal.lz\");\n\nconst u32 gItemIcon_PomegBerry[] = INCBIN_U32(\"graphics/items/icons/pomeg_berry.4bpp.lz\");\nconst u32 gItemIconPalette_PomegBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/pomeg_berry.gbapal.lz\");\n\nconst u32 gItemIcon_KelpsyBerry[] = INCBIN_U32(\"graphics/items/icons/kelpsy_berry.4bpp.lz\");\nconst u32 gItemIconPalette_KelpsyBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/kelpsy_berry.gbapal.lz\");\n\nconst u32 gItemIcon_QualotBerry[] = INCBIN_U32(\"graphics/items/icons/qualot_berry.4bpp.lz\");\nconst u32 gItemIconPalette_QualotBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/qualot_berry.gbapal.lz\");\n\nconst u32 gItemIcon_HondewBerry[] = INCBIN_U32(\"graphics/items/icons/hondew_berry.4bpp.lz\");\nconst u32 gItemIconPalette_HondewBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/hondew_berry.gbapal.lz\");\n\nconst u32 gItemIcon_GrepaBerry[] = INCBIN_U32(\"graphics/items/icons/grepa_berry.4bpp.lz\");\nconst u32 gItemIconPalette_GrepaBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/grepa_berry.gbapal.lz\");\n\nconst u32 gItemIcon_TamatoBerry[] = INCBIN_U32(\"graphics/items/icons/tamato_berry.4bpp.lz\");\nconst u32 gItemIconPalette_TamatoBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/tamato_berry.gbapal.lz\");\n\nconst u32 gItemIcon_CornnBerry[] = INCBIN_U32(\"graphics/items/icons/cornn_berry.4bpp.lz\");\nconst u32 gItemIconPalette_CornnBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/cornn_berry.gbapal.lz\");\n\nconst u32 gItemIcon_MagostBerry[] = INCBIN_U32(\"graphics/items/icons/magost_berry.4bpp.lz\");\nconst u32 gItemIconPalette_MagostBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/magost_berry.gbapal.lz\");\n\nconst u32 gItemIcon_RabutaBerry[] = INCBIN_U32(\"graphics/items/icons/rabuta_berry.4bpp.lz\");\nconst u32 gItemIconPalette_RabutaBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/rabuta_berry.gbapal.lz\");\n\nconst u32 gItemIcon_NomelBerry[] = INCBIN_U32(\"graphics/items/icons/nomel_berry.4bpp.lz\");\nconst u32 gItemIconPalette_NomelBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/nomel_berry.gbapal.lz\");\n\nconst u32 gItemIcon_SpelonBerry[] = INCBIN_U32(\"graphics/items/icons/spelon_berry.4bpp.lz\");\nconst u32 gItemIconPalette_SpelonBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/spelon_berry.gbapal.lz\");\n\nconst u32 gItemIcon_PamtreBerry[] = INCBIN_U32(\"graphics/items/icons/pamtre_berry.4bpp.lz\");\nconst u32 gItemIconPalette_PamtreBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/pamtre_berry.gbapal.lz\");\n\nconst u32 gItemIcon_WatmelBerry[] = INCBIN_U32(\"graphics/items/icons/watmel_berry.4bpp.lz\");\nconst u32 gItemIconPalette_WatmelBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/watmel_berry.gbapal.lz\");\n\nconst u32 gItemIcon_DurinBerry[] = INCBIN_U32(\"graphics/items/icons/durin_berry.4bpp.lz\");\nconst u32 gItemIconPalette_DurinBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/durin_berry.gbapal.lz\");\n\nconst u32 gItemIcon_BelueBerry[] = INCBIN_U32(\"graphics/items/icons/belue_berry.4bpp.lz\");\nconst u32 gItemIconPalette_BelueBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/belue_berry.gbapal.lz\");\n\nconst u32 gItemIcon_LiechiBerry[] = INCBIN_U32(\"graphics/items/icons/liechi_berry.4bpp.lz\");\nconst u32 gItemIconPalette_LiechiBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/liechi_berry.gbapal.lz\");\n\nconst u32 gItemIcon_GanlonBerry[] = INCBIN_U32(\"graphics/items/icons/ganlon_berry.4bpp.lz\");\nconst u32 gItemIconPalette_GanlonBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/ganlon_berry.gbapal.lz\");\n\nconst u32 gItemIcon_SalacBerry[] = INCBIN_U32(\"graphics/items/icons/salac_berry.4bpp.lz\");\nconst u32 gItemIconPalette_SalacBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/salac_berry.gbapal.lz\");\n\nconst u32 gItemIcon_PetayaBerry[] = INCBIN_U32(\"graphics/items/icons/petaya_berry.4bpp.lz\");\nconst u32 gItemIconPalette_PetayaBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/petaya_berry.gbapal.lz\");\n\nconst u32 gItemIcon_ApicotBerry[] = INCBIN_U32(\"graphics/items/icons/apicot_berry.4bpp.lz\");\nconst u32 gItemIconPalette_ApicotBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/apicot_berry.gbapal.lz\");\n\nconst u32 gItemIcon_LansatBerry[] = INCBIN_U32(\"graphics/items/icons/lansat_berry.4bpp.lz\");\nconst u32 gItemIconPalette_LansatBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/lansat_berry.gbapal.lz\");\n\nconst u32 gItemIcon_StarfBerry[] = INCBIN_U32(\"graphics/items/icons/starf_berry.4bpp.lz\");\nconst u32 gItemIconPalette_StarfBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/starf_berry.gbapal.lz\");\n\nconst u32 gItemIcon_EnigmaBerry[] = INCBIN_U32(\"graphics/items/icons/enigma_berry.4bpp.lz\");\nconst u32 gItemIconPalette_EnigmaBerry[] = INCBIN_U32(\"graphics/items/icon_palettes/enigma_berry.gbapal.lz\");\n\n// Hold items\n\nconst u32 gItemIcon_BrightPowder[] = INCBIN_U32(\"graphics/items/icons/bright_powder.4bpp.lz\");\nconst u32 gItemIconPalette_BrightPowder[] = INCBIN_U32(\"graphics/items/icon_palettes/bright_powder.gbapal.lz\");\n\nconst u32 gItemIcon_InBattleHerb[] = INCBIN_U32(\"graphics/items/icons/in_battle_herb.4bpp.lz\");\nconst u32 gItemIconPalette_WhiteHerb[] = INCBIN_U32(\"graphics/items/icon_palettes/white_herb.gbapal.lz\");\n\nconst u32 gItemIcon_MachoBrace[] = INCBIN_U32(\"graphics/items/icons/macho_brace.4bpp.lz\");\nconst u32 gItemIconPalette_MachoBrace[] = INCBIN_U32(\"graphics/items/icon_palettes/macho_brace.gbapal.lz\");\n\nconst u32 gItemIcon_ExpShare[] = INCBIN_U32(\"graphics/items/icons/exp_share.4bpp.lz\");\nconst u32 gItemIconPalette_ExpShare[] = INCBIN_U32(\"graphics/items/icon_palettes/exp_share.gbapal.lz\");\n\nconst u32 gItemIcon_QuickClaw[] = INCBIN_U32(\"graphics/items/icons/quick_claw.4bpp.lz\");\nconst u32 gItemIconPalette_QuickClaw[] = INCBIN_U32(\"graphics/items/icon_palettes/quick_claw.gbapal.lz\");\n\nconst u32 gItemIcon_SootheBell[] = INCBIN_U32(\"graphics/items/icons/soothe_bell.4bpp.lz\");\nconst u32 gItemIconPalette_SootheBell[] = INCBIN_U32(\"graphics/items/icon_palettes/soothe_bell.gbapal.lz\");\n\nconst u32 gItemIconPalette_MentalHerb[] = INCBIN_U32(\"graphics/items/icon_palettes/mental_herb.gbapal.lz\");\n\nconst u32 gItemIcon_ChoiceBand[] = INCBIN_U32(\"graphics/items/icons/choice_band.4bpp.lz\");\nconst u32 gItemIconPalette_ChoiceBand[] = INCBIN_U32(\"graphics/items/icon_palettes/choice_band.gbapal.lz\");\n\nconst u32 gItemIcon_KingsRock[] = INCBIN_U32(\"graphics/items/icons/kings_rock.4bpp.lz\");\nconst u32 gItemIconPalette_KingsRock[] = INCBIN_U32(\"graphics/items/icon_palettes/kings_rock.gbapal.lz\");\n\nconst u32 gItemIcon_SilverPowder[] = INCBIN_U32(\"graphics/items/icons/silver_powder.4bpp.lz\");\nconst u32 gItemIconPalette_SilverPowder[] = INCBIN_U32(\"graphics/items/icon_palettes/silver_powder.gbapal.lz\");\n\nconst u32 gItemIcon_AmuletCoin[] = INCBIN_U32(\"graphics/items/icons/amulet_coin.4bpp.lz\");\nconst u32 gItemIconPalette_AmuletCoin[] = INCBIN_U32(\"graphics/items/icon_palettes/amulet_coin.gbapal.lz\");\n\nconst u32 gItemIcon_CleanseTag[] = INCBIN_U32(\"graphics/items/icons/cleanse_tag.4bpp.lz\");\nconst u32 gItemIconPalette_CleanseTag[] = INCBIN_U32(\"graphics/items/icon_palettes/cleanse_tag.gbapal.lz\");\n\nconst u32 gItemIcon_SoulDew[] = INCBIN_U32(\"graphics/items/icons/soul_dew.4bpp.lz\");\nconst u32 gItemIconPalette_SoulDew[] = INCBIN_U32(\"graphics/items/icon_palettes/soul_dew.gbapal.lz\");\n\nconst u32 gItemIcon_DeepSeaTooth[] = INCBIN_U32(\"graphics/items/icons/deep_sea_tooth.4bpp.lz\");\nconst u32 gItemIconPalette_DeepSeaTooth[] = INCBIN_U32(\"graphics/items/icon_palettes/deep_sea_tooth.gbapal.lz\");\n\nconst u32 gItemIcon_DeepSeaScale[] = INCBIN_U32(\"graphics/items/icons/deep_sea_scale.4bpp.lz\");\nconst u32 gItemIconPalette_DeepSeaScale[] = INCBIN_U32(\"graphics/items/icon_palettes/deep_sea_scale.gbapal.lz\");\n\nconst u32 gItemIcon_SmokeBall[] = INCBIN_U32(\"graphics/items/icons/smoke_ball.4bpp.lz\");\nconst u32 gItemIconPalette_SmokeBall[] = INCBIN_U32(\"graphics/items/icon_palettes/smoke_ball.gbapal.lz\");\n\nconst u32 gItemIcon_Everstone[] = INCBIN_U32(\"graphics/items/icons/everstone.4bpp.lz\");\nconst u32 gItemIconPalette_Everstone[] = INCBIN_U32(\"graphics/items/icon_palettes/everstone.gbapal.lz\");\n\nconst u32 gItemIcon_FocusBand[] = INCBIN_U32(\"graphics/items/icons/focus_band.4bpp.lz\");\nconst u32 gItemIconPalette_FocusBand[] = INCBIN_U32(\"graphics/items/icon_palettes/focus_band.gbapal.lz\");\n\nconst u32 gItemIcon_LuckyEgg[] = INCBIN_U32(\"graphics/items/icons/lucky_egg.4bpp.lz\");\nconst u32 gItemIconPalette_LuckyEgg[] = INCBIN_U32(\"graphics/items/icon_palettes/lucky_egg.gbapal.lz\");\n\nconst u32 gItemIcon_ScopeLens[] = INCBIN_U32(\"graphics/items/icons/scope_lens.4bpp.lz\");\nconst u32 gItemIconPalette_ScopeLens[] = INCBIN_U32(\"graphics/items/icon_palettes/scope_lens.gbapal.lz\");\n\nconst u32 gItemIcon_MetalCoat[] = INCBIN_U32(\"graphics/items/icons/metal_coat.4bpp.lz\");\nconst u32 gItemIconPalette_MetalCoat[] = INCBIN_U32(\"graphics/items/icon_palettes/metal_coat.gbapal.lz\");\n\nconst u32 gItemIcon_Leftovers[] = INCBIN_U32(\"graphics/items/icons/leftovers.4bpp.lz\");\nconst u32 gItemIconPalette_Leftovers[] = INCBIN_U32(\"graphics/items/icon_palettes/leftovers.gbapal.lz\");\n\nconst u32 gItemIcon_DragonScale[] = INCBIN_U32(\"graphics/items/icons/dragon_scale.4bpp.lz\");\nconst u32 gItemIconPalette_DragonScale[] = INCBIN_U32(\"graphics/items/icon_palettes/dragon_scale.gbapal.lz\");\n\nconst u32 gItemIcon_LightBall[] = INCBIN_U32(\"graphics/items/icons/light_ball.4bpp.lz\");\nconst u32 gItemIconPalette_LightBall[] = INCBIN_U32(\"graphics/items/icon_palettes/light_ball.gbapal.lz\");\n\nconst u32 gItemIcon_SoftSand[] = INCBIN_U32(\"graphics/items/icons/soft_sand.4bpp.lz\");\nconst u32 gItemIconPalette_SoftSand[] = INCBIN_U32(\"graphics/items/icon_palettes/soft_sand.gbapal.lz\");\n\nconst u32 gItemIcon_HardStone[] = INCBIN_U32(\"graphics/items/icons/hard_stone.4bpp.lz\");\nconst u32 gItemIconPalette_HardStone[] = INCBIN_U32(\"graphics/items/icon_palettes/hard_stone.gbapal.lz\");\n\nconst u32 gItemIcon_MiracleSeed[] = INCBIN_U32(\"graphics/items/icons/miracle_seed.4bpp.lz\");\nconst u32 gItemIconPalette_MiracleSeed[] = INCBIN_U32(\"graphics/items/icon_palettes/miracle_seed.gbapal.lz\");\n\nconst u32 gItemIcon_BlackGlasses[] = INCBIN_U32(\"graphics/items/icons/black_glasses.4bpp.lz\");\nconst u32 gItemIconPalette_BlackTypeEnhancingItem[] = INCBIN_U32(\"graphics/items/icon_palettes/black_type_enhancing_item.gbapal.lz\");\n\nconst u32 gItemIcon_BlackBelt[] = INCBIN_U32(\"graphics/items/icons/black_belt.4bpp.lz\");\n\nconst u32 gItemIcon_Magnet[] = INCBIN_U32(\"graphics/items/icons/magnet.4bpp.lz\");\nconst u32 gItemIconPalette_Magnet[] = INCBIN_U32(\"graphics/items/icon_palettes/magnet.gbapal.lz\");\n\nconst u32 gItemIcon_MysticWater[] = INCBIN_U32(\"graphics/items/icons/mystic_water.4bpp.lz\");\nconst u32 gItemIconPalette_MysticWater[] = INCBIN_U32(\"graphics/items/icon_palettes/mystic_water.gbapal.lz\");\n\nconst u32 gItemIcon_SharpBeak[] = INCBIN_U32(\"graphics/items/icons/sharp_beak.4bpp.lz\");\nconst u32 gItemIconPalette_SharpBeak[] = INCBIN_U32(\"graphics/items/icon_palettes/sharp_beak.gbapal.lz\");\n\nconst u32 gItemIcon_PoisonBarb[] = INCBIN_U32(\"graphics/items/icons/poison_barb.4bpp.lz\");\nconst u32 gItemIconPalette_PoisonBarb[] = INCBIN_U32(\"graphics/items/icon_palettes/poison_barb.gbapal.lz\");\n\nconst u32 gItemIcon_NeverMeltIce[] = INCBIN_U32(\"graphics/items/icons/never_melt_ice.4bpp.lz\");\nconst u32 gItemIconPalette_NeverMeltIce[] = INCBIN_U32(\"graphics/items/icon_palettes/never_melt_ice.gbapal.lz\");\n\nconst u32 gItemIcon_SpellTag[] = INCBIN_U32(\"graphics/items/icons/spell_tag.4bpp.lz\");\nconst u32 gItemIconPalette_SpellTag[] = INCBIN_U32(\"graphics/items/icon_palettes/spell_tag.gbapal.lz\");\n\nconst u32 gItemIcon_TwistedSpoon[] = INCBIN_U32(\"graphics/items/icons/twisted_spoon.4bpp.lz\");\nconst u32 gItemIconPalette_TwistedSpoon[] = INCBIN_U32(\"graphics/items/icon_palettes/twisted_spoon.gbapal.lz\");\n\nconst u32 gItemIcon_Charcoal[] = INCBIN_U32(\"graphics/items/icons/charcoal.4bpp.lz\");\nconst u32 gItemIconPalette_Charcoal[] = INCBIN_U32(\"graphics/items/icon_palettes/charcoal.gbapal.lz\");\n\nconst u32 gItemIcon_DragonFang[] = INCBIN_U32(\"graphics/items/icons/dragon_fang.4bpp.lz\");\nconst u32 gItemIconPalette_DragonFang[] = INCBIN_U32(\"graphics/items/icon_palettes/dragon_fang.gbapal.lz\");\n\nconst u32 gItemIcon_SilkScarf[] = INCBIN_U32(\"graphics/items/icons/silk_scarf.4bpp.lz\");\nconst u32 gItemIconPalette_SilkScarf[] = INCBIN_U32(\"graphics/items/icon_palettes/silk_scarf.gbapal.lz\");\n\nconst u32 gItemIcon_UpGrade[] = INCBIN_U32(\"graphics/items/icons/up_grade.4bpp.lz\");\nconst u32 gItemIconPalette_UpGrade[] = INCBIN_U32(\"graphics/items/icon_palettes/up_grade.gbapal.lz\");\n\nconst u32 gItemIcon_ShellBell[] = INCBIN_U32(\"graphics/items/icons/shell_bell.4bpp.lz\");\n\nconst u32 gItemIcon_SeaIncense[] = INCBIN_U32(\"graphics/items/icons/sea_incense.4bpp.lz\");\nconst u32 gItemIconPalette_SeaIncense[] = INCBIN_U32(\"graphics/items/icon_palettes/sea_incense.gbapal.lz\");\n\nconst u32 gItemIcon_LaxIncense[] = INCBIN_U32(\"graphics/items/icons/lax_incense.4bpp.lz\");\nconst u32 gItemIconPalette_LaxIncense[] = INCBIN_U32(\"graphics/items/icon_palettes/lax_incense.gbapal.lz\");\n\nconst u32 gItemIcon_LuckyPunch[] = INCBIN_U32(\"graphics/items/icons/lucky_punch.4bpp.lz\");\nconst u32 gItemIconPalette_LuckyPunch[] = INCBIN_U32(\"graphics/items/icon_palettes/lucky_punch.gbapal.lz\");\n\nconst u32 gItemIcon_MetalPowder[] = INCBIN_U32(\"graphics/items/icons/metal_powder.4bpp.lz\");\nconst u32 gItemIconPalette_MetalPowder[] = INCBIN_U32(\"graphics/items/icon_palettes/metal_powder.gbapal.lz\");\n\nconst u32 gItemIcon_ThickClub[] = INCBIN_U32(\"graphics/items/icons/thick_club.4bpp.lz\");\nconst u32 gItemIconPalette_ThickClub[] = INCBIN_U32(\"graphics/items/icon_palettes/thick_club.gbapal.lz\");\n\nconst u32 gItemIcon_Stick[] = INCBIN_U32(\"graphics/items/icons/stick.4bpp.lz\");\nconst u32 gItemIconPalette_Stick[] = INCBIN_U32(\"graphics/items/icon_palettes/stick.gbapal.lz\");\n\nconst u32 gItemIcon_Scarf[] = INCBIN_U32(\"graphics/items/icons/scarf.4bpp.lz\");\nconst u32 gItemIconPalette_RedScarf[] = INCBIN_U32(\"graphics/items/icon_palettes/red_scarf.gbapal.lz\");\nconst u32 gItemIconPalette_BlueScarf[] = INCBIN_U32(\"graphics/items/icon_palettes/blue_scarf.gbapal.lz\");\nconst u32 gItemIconPalette_PinkScarf[] = INCBIN_U32(\"graphics/items/icon_palettes/pink_scarf.gbapal.lz\");\nconst u32 gItemIconPalette_GreenScarf[] = INCBIN_U32(\"graphics/items/icon_palettes/green_scarf.gbapal.lz\");\nconst u32 gItemIconPalette_YellowScarf[] = INCBIN_U32(\"graphics/items/icon_palettes/yellow_scarf.gbapal.lz\");\n\n// Key items\n\nconst u32 gItemIcon_MachBike[] = INCBIN_U32(\"graphics/items/icons/mach_bike.4bpp.lz\");\nconst u32 gItemIconPalette_MachBike[] = INCBIN_U32(\"graphics/items/icon_palettes/mach_bike.gbapal.lz\");\n\nconst u32 gItemIcon_CoinCase[] = INCBIN_U32(\"graphics/items/icons/coin_case.4bpp.lz\");\nconst u32 gItemIconPalette_CoinCase[] = INCBIN_U32(\"graphics/items/icon_palettes/coin_case.gbapal.lz\");\n\nconst u32 gItemIcon_Itemfinder[] = INCBIN_U32(\"graphics/items/icons/itemfinder.4bpp.lz\");\nconst u32 gItemIconPalette_Itemfinder[] = INCBIN_U32(\"graphics/items/icon_palettes/itemfinder.gbapal.lz\");\n\nconst u32 gItemIcon_OldRod[] = INCBIN_U32(\"graphics/items/icons/old_rod.4bpp.lz\");\nconst u32 gItemIconPalette_OldRod[] = INCBIN_U32(\"graphics/items/icon_palettes/old_rod.gbapal.lz\");\n\nconst u32 gItemIcon_GoodRod[] = INCBIN_U32(\"graphics/items/icons/good_rod.4bpp.lz\");\nconst u32 gItemIconPalette_GoodRod[] = INCBIN_U32(\"graphics/items/icon_palettes/good_rod.gbapal.lz\");\n\nconst u32 gItemIcon_SuperRod[] = INCBIN_U32(\"graphics/items/icons/super_rod.4bpp.lz\");\nconst u32 gItemIconPalette_SuperRod[] = INCBIN_U32(\"graphics/items/icon_palettes/super_rod.gbapal.lz\");\n\nconst u32 gItemIcon_SSTicket[] = INCBIN_U32(\"graphics/items/icons/ss_ticket.4bpp.lz\");\nconst u32 gItemIconPalette_SSTicket[] = INCBIN_U32(\"graphics/items/icon_palettes/ss_ticket.gbapal.lz\");\n\nconst u32 gItemIcon_ContestPass[] = INCBIN_U32(\"graphics/items/icons/contest_pass.4bpp.lz\");\nconst u32 gItemIconPalette_ContestPass[] = INCBIN_U32(\"graphics/items/icon_palettes/contest_pass.gbapal.lz\");\n\nconst u32 gItemIcon_WailmerPail[] = INCBIN_U32(\"graphics/items/icons/wailmer_pail.4bpp.lz\");\nconst u32 gItemIconPalette_WailmerPail[] = INCBIN_U32(\"graphics/items/icon_palettes/wailmer_pail.gbapal.lz\");\n\nconst u32 gItemIcon_DevonGoods[] = INCBIN_U32(\"graphics/items/icons/devon_goods.4bpp.lz\");\nconst u32 gItemIconPalette_DevonGoods[] = INCBIN_U32(\"graphics/items/icon_palettes/devon_goods.gbapal.lz\");\n\nconst u32 gItemIcon_SootSack[] = INCBIN_U32(\"graphics/items/icons/soot_sack.4bpp.lz\");\nconst u32 gItemIconPalette_SootSack[] = INCBIN_U32(\"graphics/items/icon_palettes/soot_sack.gbapal.lz\");\n\nconst u32 gItemIcon_BasementKey[] = INCBIN_U32(\"graphics/items/icons/basement_key.4bpp.lz\");\nconst u32 gItemIconPalette_OldKey[] = INCBIN_U32(\"graphics/items/icon_palettes/old_key.gbapal.lz\");\n\nconst u32 gItemIcon_AcroBike[] = INCBIN_U32(\"graphics/items/icons/acro_bike.4bpp.lz\");\nconst u32 gItemIconPalette_AcroBike[] = INCBIN_U32(\"graphics/items/icon_palettes/acro_bike.gbapal.lz\");\n\nconst u32 gItemIcon_PokeblockCase[] = INCBIN_U32(\"graphics/items/icons/pokeblock_case.4bpp.lz\");\nconst u32 gItemIconPalette_PokeblockCase[] = INCBIN_U32(\"graphics/items/icon_palettes/pokeblock_case.gbapal.lz\");\n\nconst u32 gItemIcon_Letter[] = INCBIN_U32(\"graphics/items/icons/letter.4bpp.lz\");\nconst u32 gItemIcon_EonTicket[] = INCBIN_U32(\"graphics/items/icons/eon_ticket.4bpp.lz\");\n\nconst u32 gItemIconPalette_EonTicket[] = INCBIN_U32(\"graphics/items/icon_palettes/eon_ticket.gbapal.lz\");\n\nconst u32 gItemIcon_Orb[] = INCBIN_U32(\"graphics/items/icons/orb.4bpp.lz\");\nconst u32 gItemIconPalette_RedOrb[] = INCBIN_U32(\"graphics/items/icon_palettes/red_orb.gbapal.lz\");\nconst u32 gItemIconPalette_BlueOrb[] = INCBIN_U32(\"graphics/items/icon_palettes/blue_orb.gbapal.lz\");\n\nconst u32 gItemIcon_Scanner[] = INCBIN_U32(\"graphics/items/icons/scanner.4bpp.lz\");\nconst u32 gItemIconPalette_Scanner[] = INCBIN_U32(\"graphics/items/icon_palettes/scanner.gbapal.lz\");\n\nconst u32 gItemIcon_GoGoggles[] = INCBIN_U32(\"graphics/items/icons/go_goggles.4bpp.lz\");\nconst u32 gItemIconPalette_GoGoggles[] = INCBIN_U32(\"graphics/items/icon_palettes/go_goggles.gbapal.lz\");\n\nconst u32 gItemIcon_Meteorite[] = INCBIN_U32(\"graphics/items/icons/meteorite.4bpp.lz\");\nconst u32 gItemIconPalette_Meteorite[] = INCBIN_U32(\"graphics/items/icon_palettes/meteorite.gbapal.lz\");\n\nconst u32 gItemIcon_Room1Key[] = INCBIN_U32(\"graphics/items/icons/room1_key.4bpp.lz\");\n\nconst u32 gItemIcon_Room2Key[] = INCBIN_U32(\"graphics/items/icons/room2_key.4bpp.lz\");\n\nconst u32 gItemIcon_Room4Key[] = INCBIN_U32(\"graphics/items/icons/room4_key.4bpp.lz\");\n\nconst u32 gItemIcon_Room6Key[] = INCBIN_U32(\"graphics/items/icons/room6_key.4bpp.lz\");\n\nconst u32 gItemIcon_StorageKey[] = INCBIN_U32(\"graphics/items/icons/storage_key.4bpp.lz\");\n\nconst u32 gItemIcon_RootFossil[] = INCBIN_U32(\"graphics/items/icons/root_fossil.4bpp.lz\");\nconst u32 gItemIconPalette_HoennFossil[] = INCBIN_U32(\"graphics/items/icon_palettes/hoenn_fossil.gbapal.lz\");\nconst u32 gItemIcon_ClawFossil[] = INCBIN_U32(\"graphics/items/icons/claw_fossil.4bpp.lz\");\n\nconst u32 gItemIcon_DevonScope[] = INCBIN_U32(\"graphics/items/icons/devon_scope.4bpp.lz\");\nconst u32 gItemIconPalette_DevonScope[] = INCBIN_U32(\"graphics/items/icon_palettes/devon_scope.gbapal.lz\");\n\n// TMs/HMs\n\nconst u32 gItemIcon_TMHM[] = INCBIN_U32(\"graphics/items/icons/tm_hm.4bpp.lz\");\n\nconst u32 gItemIconPalette_FightingTMHM[] = INCBIN_U32(\"graphics/items/icon_palettes/fighting_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_DragonTMHM[]   = INCBIN_U32(\"graphics/items/icon_palettes/dragon_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_WaterTMHM[]    = INCBIN_U32(\"graphics/items/icon_palettes/water_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_PsychicTMHM[]  = INCBIN_U32(\"graphics/items/icon_palettes/psychic_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_NormalTMHM[]   = INCBIN_U32(\"graphics/items/icon_palettes/normal_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_PoisonTMHM[]   = INCBIN_U32(\"graphics/items/icon_palettes/poison_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_IceTMHM[]      = INCBIN_U32(\"graphics/items/icon_palettes/ice_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_GrassTMHM[]    = INCBIN_U32(\"graphics/items/icon_palettes/grass_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_FireTMHM[]     = INCBIN_U32(\"graphics/items/icon_palettes/fire_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_DarkTMHM[]     = INCBIN_U32(\"graphics/items/icon_palettes/dark_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_SteelTMHM[]    = INCBIN_U32(\"graphics/items/icon_palettes/steel_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_ElectricTMHM[] = INCBIN_U32(\"graphics/items/icon_palettes/electric_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_GroundTMHM[]   = INCBIN_U32(\"graphics/items/icon_palettes/ground_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_GhostTMHM[]    = INCBIN_U32(\"graphics/items/icon_palettes/ghost_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_RockTMHM[]     = INCBIN_U32(\"graphics/items/icon_palettes/rock_tm_hm.gbapal.lz\");\nconst u32 gItemIconPalette_FlyingTMHM[]   = INCBIN_U32(\"graphics/items/icon_palettes/flying_tm_hm.gbapal.lz\");\n\n// FireRed/LeafGreen key items\n\nconst u32 gItemIcon_OaksParcel[] = INCBIN_U32(\"graphics/items/icons/oaks_parcel.4bpp.lz\");\nconst u32 gItemIconPalette_OaksParcel[] = INCBIN_U32(\"graphics/items/icon_palettes/oaks_parcel.gbapal.lz\");\n\nconst u32 gItemIcon_PokeFlute[] = INCBIN_U32(\"graphics/items/icons/poke_flute.4bpp.lz\");\nconst u32 gItemIconPalette_PokeFlute[] = INCBIN_U32(\"graphics/items/icon_palettes/poke_flute.gbapal.lz\");\n\nconst u32 gItemIcon_SecretKey[] = INCBIN_U32(\"graphics/items/icons/secret_key.4bpp.lz\");\nconst u32 gItemIconPalette_SecretKey[] = INCBIN_U32(\"graphics/items/icon_palettes/secret_key.gbapal.lz\");\n\nconst u32 gItemIcon_BikeVoucher[] = INCBIN_U32(\"graphics/items/icons/bike_voucher.4bpp.lz\");\nconst u32 gItemIconPalette_BikeVoucher[] = INCBIN_U32(\"graphics/items/icon_palettes/bike_voucher.gbapal.lz\");\n\nconst u32 gItemIcon_GoldTeeth[] = INCBIN_U32(\"graphics/items/icons/gold_teeth.4bpp.lz\");\nconst u32 gItemIconPalette_GoldTeeth[] = INCBIN_U32(\"graphics/items/icon_palettes/gold_teeth.gbapal.lz\");\n\nconst u32 gItemIcon_OldAmber[] = INCBIN_U32(\"graphics/items/icons/old_amber.4bpp.lz\");\nconst u32 gItemIconPalette_OldAmber[] = INCBIN_U32(\"graphics/items/icon_palettes/old_amber.gbapal.lz\");\n\nconst u32 gItemIcon_CardKey[] = INCBIN_U32(\"graphics/items/icons/card_key.4bpp.lz\");\nconst u32 gItemIconPalette_CardKey[] = INCBIN_U32(\"graphics/items/icon_palettes/card_key.gbapal.lz\");\n\nconst u32 gItemIcon_LiftKey[] = INCBIN_U32(\"graphics/items/icons/lift_key.4bpp.lz\");\nconst u32 gItemIconPalette_Key[] = INCBIN_U32(\"graphics/items/icon_palettes/key.gbapal.lz\");\n\nconst u32 gItemIcon_HelixFossil[] = INCBIN_U32(\"graphics/items/icons/helix_fossil.4bpp.lz\");\nconst u32 gItemIconPalette_KantoFossil[] = INCBIN_U32(\"graphics/items/icon_palettes/kanto_fossil.gbapal.lz\");\nconst u32 gItemIcon_DomeFossil[] = INCBIN_U32(\"graphics/items/icons/dome_fossil.4bpp.lz\");\n\nconst u32 gItemIcon_SilphScope[] = INCBIN_U32(\"graphics/items/icons/silph_scope.4bpp.lz\");\nconst u32 gItemIconPalette_SilphScope[] = INCBIN_U32(\"graphics/items/icon_palettes/silph_scope.gbapal.lz\");\n\nconst u32 gItemIcon_Bicycle[] = INCBIN_U32(\"graphics/items/icons/bicycle.4bpp.lz\");\nconst u32 gItemIconPalette_Bicycle[] = INCBIN_U32(\"graphics/items/icon_palettes/bicycle.gbapal.lz\");\n\nconst u32 gItemIcon_TownMap[] = INCBIN_U32(\"graphics/items/icons/town_map.4bpp.lz\");\nconst u32 gItemIconPalette_TownMap[] = INCBIN_U32(\"graphics/items/icon_palettes/town_map.gbapal.lz\");\n\nconst u32 gItemIcon_VSSeeker[] = INCBIN_U32(\"graphics/items/icons/vs_seeker.4bpp.lz\");\nconst u32 gItemIconPalette_VSSeeker[] = INCBIN_U32(\"graphics/items/icon_palettes/vs_seeker.gbapal.lz\");\n\nconst u32 gItemIcon_FameChecker[] = INCBIN_U32(\"graphics/items/icons/fame_checker.4bpp.lz\");\nconst u32 gItemIconPalette_FameChecker[] = INCBIN_U32(\"graphics/items/icon_palettes/fame_checker.gbapal.lz\");\n\nconst u32 gItemIcon_TMCase[] = INCBIN_U32(\"graphics/items/icons/tm_case.4bpp.lz\");\nconst u32 gItemIconPalette_TMCase[] = INCBIN_U32(\"graphics/items/icon_palettes/tm_case.gbapal.lz\");\n\nconst u32 gItemIcon_BerryPouch[] = INCBIN_U32(\"graphics/items/icons/berry_pouch.4bpp.lz\");\nconst u32 gItemIconPalette_BerryPouch[] = INCBIN_U32(\"graphics/items/icon_palettes/berry_pouch.gbapal.lz\");\n\nconst u32 gItemIcon_TeachyTV[] = INCBIN_U32(\"graphics/items/icons/teachy_tv.4bpp.lz\");\nconst u32 gItemIconPalette_TeachyTV[] = INCBIN_U32(\"graphics/items/icon_palettes/teachy_tv.gbapal.lz\");\n\nconst u32 gItemIcon_TriPass[] = INCBIN_U32(\"graphics/items/icons/tri_pass.4bpp.lz\");\nconst u32 gItemIconPalette_TriPass[] = INCBIN_U32(\"graphics/items/icon_palettes/tri_pass.gbapal.lz\");\n\nconst u32 gItemIcon_RainbowPass[] = INCBIN_U32(\"graphics/items/icons/rainbow_pass.4bpp.lz\");\nconst u32 gItemIconPalette_RainbowPass[] = INCBIN_U32(\"graphics/items/icon_palettes/rainbow_pass.gbapal.lz\");\n\nconst u32 gItemIcon_Tea[] = INCBIN_U32(\"graphics/items/icons/tea.4bpp.lz\");\nconst u32 gItemIconPalette_Tea[] = INCBIN_U32(\"graphics/items/icon_palettes/tea.gbapal.lz\");\n\nconst u32 gItemIcon_MysticTicket[] = INCBIN_U32(\"graphics/items/icons/mystic_ticket.4bpp.lz\");\nconst u32 gItemIconPalette_MysticTicket[] = INCBIN_U32(\"graphics/items/icon_palettes/mystic_ticket.gbapal.lz\");\n\nconst u32 gItemIcon_AuroraTicket[] = INCBIN_U32(\"graphics/items/icons/aurora_ticket.4bpp.lz\");\nconst u32 gItemIconPalette_AuroraTicket[] = INCBIN_U32(\"graphics/items/icon_palettes/aurora_ticket.gbapal.lz\");\n\nconst u32 gItemIcon_PowderJar[] = INCBIN_U32(\"graphics/items/icons/powder_jar.4bpp.lz\");\nconst u32 gItemIconPalette_PowderJar[] = INCBIN_U32(\"graphics/items/icon_palettes/powder_jar.gbapal.lz\");\n\nconst u32 gItemIconPalette_Ruby[] = INCBIN_U32(\"graphics/items/icon_palettes/ruby.gbapal.lz\");\nconst u32 gItemIcon_Gem[] = INCBIN_U32(\"graphics/items/icons/gem.4bpp.lz\");\nconst u32 gItemIconPalette_Sapphire[] = INCBIN_U32(\"graphics/items/icon_palettes/sapphire.gbapal.lz\");\n\nconst u32 gItemIcon_MagmaEmblem[] = INCBIN_U32(\"graphics/items/icons/magma_emblem.4bpp.lz\");\nconst u32 gItemIconPalette_MagmaEmblem[] = INCBIN_U32(\"graphics/items/icon_palettes/magma_emblem.gbapal.lz\");\n\nconst u32 gItemIcon_OldSeaMap[] = INCBIN_U32(\"graphics/items/icons/old_sea_map.4bpp.lz\");\nconst u32 gItemIconPalette_OldSeaMap[] = INCBIN_U32(\"graphics/items/icon_palettes/old_sea_map.gbapal.lz\");\n\nconst u32 gItemIcon_LinkBracelet[] = INCBIN_U32(\"graphics/items/icons/link_bracelet.4bpp.lz\");\nconst u32 gItemIconPalette_LinkBracelet[] = INCBIN_U32(\"graphics/items/icon_palettes/link_bracelet.gbapal.lz\");\n"
  },
  {
    "path": "src/data/graphics/mail.h",
    "content": "const u16 gFile_graphics_mail_orange_palette_pal[] = INCBIN_U16(\"graphics/mail/orange/palette.gbapal\");\nconst u16 gFile_graphics_mail_harbor_palette_pal[] = INCBIN_U16(\"graphics/mail/harbor/palette.gbapal\");\nconst u16 gFile_graphics_mail_glitter_palette_pal[] = INCBIN_U16(\"graphics/mail/glitter/palette.gbapal\");\nconst u16 gFile_graphics_mail_mech_palette_pal[] = INCBIN_U16(\"graphics/mail/mech/palette.gbapal\");\nconst u16 gFile_graphics_mail_wood_palette_pal[] = INCBIN_U16(\"graphics/mail/wood/palette.gbapal\");\nconst u16 gFile_graphics_mail_wave_palette_pal[] = INCBIN_U16(\"graphics/mail/wave/palette.gbapal\");\nconst u16 gFile_graphics_mail_bead_palette_pal[] = INCBIN_U16(\"graphics/mail/bead/palette.gbapal\");\nconst u16 gFile_graphics_mail_shadow_palette_pal[] = INCBIN_U16(\"graphics/mail/shadow/palette.gbapal\");\nconst u16 gFile_graphics_mail_tropic_palette_pal[] = INCBIN_U16(\"graphics/mail/tropic/palette.gbapal\");\nconst u16 gFile_graphics_mail_dream_palette_pal[] = INCBIN_U16(\"graphics/mail/dream/palette.gbapal\");\nconst u16 gFile_graphics_mail_fab_palette_pal[] = INCBIN_U16(\"graphics/mail/fab/palette.gbapal\");\nconst u16 gFile_graphics_mail_retro_palette_pal[] = INCBIN_U16(\"graphics/mail/retro/palette.gbapal\");\n\nconst u32 gFile_graphics_mail_orange_tiles_sheet[] = INCBIN_U32(\"graphics/mail/orange/tiles.4bpp.lz\");\nconst u32 gFile_graphics_mail_harbor_tiles_sheet[] = INCBIN_U32(\"graphics/mail/harbor/tiles.4bpp.lz\");\nconst u32 gFile_graphics_mail_glitter_tiles_sheet[] = INCBIN_U32(\"graphics/mail/glitter/tiles.4bpp.lz\");\nconst u32 gFile_graphics_mail_mech_tiles_sheet[] = INCBIN_U32(\"graphics/mail/mech/tiles.4bpp.lz\");\nconst u32 gFile_graphics_mail_wood_tiles_sheet[] = INCBIN_U32(\"graphics/mail/wood/tiles.4bpp.lz\");\nconst u32 gFile_graphics_mail_wave_tiles_sheet[] = INCBIN_U32(\"graphics/mail/wave/tiles.4bpp.lz\");\nconst u32 gFile_graphics_mail_bead_tiles_sheet[] = INCBIN_U32(\"graphics/mail/bead/tiles.4bpp.lz\");\nconst u32 gFile_graphics_mail_shadow_tiles_sheet[] = INCBIN_U32(\"graphics/mail/shadow/tiles.4bpp.lz\");\nconst u32 gFile_graphics_mail_tropic_tiles_sheet[] = INCBIN_U32(\"graphics/mail/tropic/tiles.4bpp.lz\");\nconst u32 gFile_graphics_mail_dream_tiles_sheet[] = INCBIN_U32(\"graphics/mail/dream/tiles.4bpp.lz\");\nconst u32 gFile_graphics_mail_fab_tiles_sheet[] = INCBIN_U32(\"graphics/mail/fab/tiles.4bpp.lz\");\nconst u32 gFile_graphics_mail_retro_tiles_sheet[] = INCBIN_U32(\"graphics/mail/retro/tiles.4bpp.lz\");\n\nconst u32 gFile_graphics_mail_orange_map_tilemap[] = INCBIN_U32(\"graphics/mail/orange/map.bin.lz\");\nconst u32 gFile_graphics_mail_harbor_map_tilemap[] = INCBIN_U32(\"graphics/mail/harbor/map.bin.lz\");\nconst u32 gFile_graphics_mail_glitter_map_tilemap[] = INCBIN_U32(\"graphics/mail/glitter/map.bin.lz\");\nconst u32 gFile_graphics_mail_mech_map_tilemap[] = INCBIN_U32(\"graphics/mail/mech/map.bin.lz\");\nconst u32 gFile_graphics_mail_wood_map_tilemap[] = INCBIN_U32(\"graphics/mail/wood/map.bin.lz\");\nconst u32 gFile_graphics_mail_wave_map_tilemap[] = INCBIN_U32(\"graphics/mail/wave/map.bin.lz\");\nconst u32 gFile_graphics_mail_bead_map_tilemap[] = INCBIN_U32(\"graphics/mail/bead/map.bin.lz\");\nconst u32 gFile_graphics_mail_shadow_map_tilemap[] = INCBIN_U32(\"graphics/mail/shadow/map.bin.lz\");\nconst u32 gFile_graphics_mail_tropic_map_tilemap[] = INCBIN_U32(\"graphics/mail/tropic/map.bin.lz\");\nconst u32 gFile_graphics_mail_dream_map_tilemap[] = INCBIN_U32(\"graphics/mail/dream/map.bin.lz\");\nconst u32 gFile_graphics_mail_fab_map_tilemap[] = INCBIN_U32(\"graphics/mail/fab/map.bin.lz\");\nconst u32 gFile_graphics_mail_retro_map_tilemap[] = INCBIN_U32(\"graphics/mail/retro/map.bin.lz\");\n"
  },
  {
    "path": "src/data/graphics/pokemon.h",
    "content": "const u32 gMonFrontPic_Bulbasaur[] = INCBIN_U32(\"graphics/pokemon/bulbasaur/front.4bpp.lz\");\nconst u32 gMonPalette_Bulbasaur[] = INCBIN_U32(\"graphics/pokemon/bulbasaur/normal.gbapal.lz\");\nconst u32 gMonBackPic_Bulbasaur[] = INCBIN_U32(\"graphics/pokemon/bulbasaur/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Bulbasaur[] = INCBIN_U32(\"graphics/pokemon/bulbasaur/shiny.gbapal.lz\");\nconst u8 gMonIcon_Bulbasaur[] = INCBIN_U8(\"graphics/pokemon/bulbasaur/icon.4bpp\");\nconst u8 gMonFootprint_Bulbasaur[] = INCBIN_U8(\"graphics/pokemon/bulbasaur/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ivysaur[] = INCBIN_U32(\"graphics/pokemon/ivysaur/front.4bpp.lz\");\nconst u32 gMonPalette_Ivysaur[] = INCBIN_U32(\"graphics/pokemon/ivysaur/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ivysaur[] = INCBIN_U32(\"graphics/pokemon/ivysaur/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ivysaur[] = INCBIN_U32(\"graphics/pokemon/ivysaur/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ivysaur[] = INCBIN_U8(\"graphics/pokemon/ivysaur/icon.4bpp\");\nconst u8 gMonFootprint_Ivysaur[] = INCBIN_U8(\"graphics/pokemon/ivysaur/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Venusaur[] = INCBIN_U32(\"graphics/pokemon/venusaur/front.4bpp.lz\");\nconst u32 gMonPalette_Venusaur[] = INCBIN_U32(\"graphics/pokemon/venusaur/normal.gbapal.lz\");\nconst u32 gMonBackPic_Venusaur[] = INCBIN_U32(\"graphics/pokemon/venusaur/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Venusaur[] = INCBIN_U32(\"graphics/pokemon/venusaur/shiny.gbapal.lz\");\nconst u8 gMonIcon_Venusaur[] = INCBIN_U8(\"graphics/pokemon/venusaur/icon.4bpp\");\nconst u8 gMonFootprint_Venusaur[] = INCBIN_U8(\"graphics/pokemon/venusaur/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Charmander[] = INCBIN_U32(\"graphics/pokemon/charmander/front.4bpp.lz\");\nconst u32 gMonPalette_Charmander[] = INCBIN_U32(\"graphics/pokemon/charmander/normal.gbapal.lz\");\nconst u32 gMonBackPic_Charmander[] = INCBIN_U32(\"graphics/pokemon/charmander/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Charmander[] = INCBIN_U32(\"graphics/pokemon/charmander/shiny.gbapal.lz\");\nconst u8 gMonIcon_Charmander[] = INCBIN_U8(\"graphics/pokemon/charmander/icon.4bpp\");\nconst u8 gMonFootprint_Charmander[] = INCBIN_U8(\"graphics/pokemon/charmander/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Charmeleon[] = INCBIN_U32(\"graphics/pokemon/charmeleon/front.4bpp.lz\");\nconst u32 gMonPalette_Charmeleon[] = INCBIN_U32(\"graphics/pokemon/charmeleon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Charmeleon[] = INCBIN_U32(\"graphics/pokemon/charmeleon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Charmeleon[] = INCBIN_U32(\"graphics/pokemon/charmeleon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Charmeleon[] = INCBIN_U8(\"graphics/pokemon/charmeleon/icon.4bpp\");\nconst u8 gMonFootprint_Charmeleon[] = INCBIN_U8(\"graphics/pokemon/charmeleon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Charizard[] = INCBIN_U32(\"graphics/pokemon/charizard/front.4bpp.lz\");\nconst u32 gMonPalette_Charizard[] = INCBIN_U32(\"graphics/pokemon/charizard/normal.gbapal.lz\");\nconst u32 gMonBackPic_Charizard[] = INCBIN_U32(\"graphics/pokemon/charizard/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Charizard[] = INCBIN_U32(\"graphics/pokemon/charizard/shiny.gbapal.lz\");\nconst u8 gMonIcon_Charizard[] = INCBIN_U8(\"graphics/pokemon/charizard/icon.4bpp\");\nconst u8 gMonFootprint_Charizard[] = INCBIN_U8(\"graphics/pokemon/charizard/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Squirtle[] = INCBIN_U32(\"graphics/pokemon/squirtle/front.4bpp.lz\");\nconst u32 gMonPalette_Squirtle[] = INCBIN_U32(\"graphics/pokemon/squirtle/normal.gbapal.lz\");\nconst u32 gMonBackPic_Squirtle[] = INCBIN_U32(\"graphics/pokemon/squirtle/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Squirtle[] = INCBIN_U32(\"graphics/pokemon/squirtle/shiny.gbapal.lz\");\nconst u8 gMonIcon_Squirtle[] = INCBIN_U8(\"graphics/pokemon/squirtle/icon.4bpp\");\nconst u8 gMonFootprint_Squirtle[] = INCBIN_U8(\"graphics/pokemon/squirtle/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Wartortle[] = INCBIN_U32(\"graphics/pokemon/wartortle/front.4bpp.lz\");\nconst u32 gMonPalette_Wartortle[] = INCBIN_U32(\"graphics/pokemon/wartortle/normal.gbapal.lz\");\nconst u32 gMonBackPic_Wartortle[] = INCBIN_U32(\"graphics/pokemon/wartortle/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Wartortle[] = INCBIN_U32(\"graphics/pokemon/wartortle/shiny.gbapal.lz\");\nconst u8 gMonIcon_Wartortle[] = INCBIN_U8(\"graphics/pokemon/wartortle/icon.4bpp\");\nconst u8 gMonFootprint_Wartortle[] = INCBIN_U8(\"graphics/pokemon/wartortle/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Blastoise[] = INCBIN_U32(\"graphics/pokemon/blastoise/front.4bpp.lz\");\nconst u32 gMonPalette_Blastoise[] = INCBIN_U32(\"graphics/pokemon/blastoise/normal.gbapal.lz\");\nconst u32 gMonBackPic_Blastoise[] = INCBIN_U32(\"graphics/pokemon/blastoise/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Blastoise[] = INCBIN_U32(\"graphics/pokemon/blastoise/shiny.gbapal.lz\");\nconst u8 gMonIcon_Blastoise[] = INCBIN_U8(\"graphics/pokemon/blastoise/icon.4bpp\");\nconst u8 gMonFootprint_Blastoise[] = INCBIN_U8(\"graphics/pokemon/blastoise/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Caterpie[] = INCBIN_U32(\"graphics/pokemon/caterpie/front.4bpp.lz\");\nconst u32 gMonPalette_Caterpie[] = INCBIN_U32(\"graphics/pokemon/caterpie/normal.gbapal.lz\");\nconst u32 gMonBackPic_Caterpie[] = INCBIN_U32(\"graphics/pokemon/caterpie/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Caterpie[] = INCBIN_U32(\"graphics/pokemon/caterpie/shiny.gbapal.lz\");\nconst u8 gMonIcon_Caterpie[] = INCBIN_U8(\"graphics/pokemon/caterpie/icon.4bpp\");\nconst u8 gMonFootprint_Caterpie[] = INCBIN_U8(\"graphics/pokemon/caterpie/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Metapod[] = INCBIN_U32(\"graphics/pokemon/metapod/front.4bpp.lz\");\nconst u32 gMonPalette_Metapod[] = INCBIN_U32(\"graphics/pokemon/metapod/normal.gbapal.lz\");\nconst u32 gMonBackPic_Metapod[] = INCBIN_U32(\"graphics/pokemon/metapod/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Metapod[] = INCBIN_U32(\"graphics/pokemon/metapod/shiny.gbapal.lz\");\nconst u8 gMonIcon_Metapod[] = INCBIN_U8( \"graphics/pokemon/metapod/icon.4bpp\");\nconst u8 gMonFootprint_Metapod[] = INCBIN_U8(\"graphics/pokemon/metapod/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Butterfree[] = INCBIN_U32(\"graphics/pokemon/butterfree/front.4bpp.lz\");\nconst u32 gMonPalette_Butterfree[] = INCBIN_U32(\"graphics/pokemon/butterfree/normal.gbapal.lz\");\nconst u32 gMonBackPic_Butterfree[] = INCBIN_U32(\"graphics/pokemon/butterfree/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Butterfree[] = INCBIN_U32(\"graphics/pokemon/butterfree/shiny.gbapal.lz\");\nconst u8 gMonIcon_Butterfree[] = INCBIN_U8(\"graphics/pokemon/butterfree/icon.4bpp\");\nconst u8 gMonFootprint_Butterfree[] = INCBIN_U8(\"graphics/pokemon/butterfree/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Weedle[] = INCBIN_U32(\"graphics/pokemon/weedle/front.4bpp.lz\");\nconst u32 gMonPalette_Weedle[] = INCBIN_U32(\"graphics/pokemon/weedle/normal.gbapal.lz\");\nconst u32 gMonBackPic_Weedle[] = INCBIN_U32(\"graphics/pokemon/weedle/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Weedle[] = INCBIN_U32(\"graphics/pokemon/weedle/shiny.gbapal.lz\");\nconst u8 gMonIcon_Weedle[] = INCBIN_U8(\"graphics/pokemon/weedle/icon.4bpp\");\nconst u8 gMonFootprint_Weedle[] = INCBIN_U8(\"graphics/pokemon/weedle/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Kakuna[] = INCBIN_U32(\"graphics/pokemon/kakuna/front.4bpp.lz\");\nconst u32 gMonPalette_Kakuna[] = INCBIN_U32(\"graphics/pokemon/kakuna/normal.gbapal.lz\");\nconst u32 gMonBackPic_Kakuna[] = INCBIN_U32(\"graphics/pokemon/kakuna/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Kakuna[] = INCBIN_U32(\"graphics/pokemon/kakuna/shiny.gbapal.lz\");\nconst u8 gMonIcon_Kakuna[] = INCBIN_U8(\"graphics/pokemon/kakuna/icon.4bpp\");\nconst u8 gMonFootprint_Kakuna[] = INCBIN_U8(\"graphics/pokemon/kakuna/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Beedrill[] = INCBIN_U32(\"graphics/pokemon/beedrill/front.4bpp.lz\");\nconst u32 gMonPalette_Beedrill[] = INCBIN_U32(\"graphics/pokemon/beedrill/normal.gbapal.lz\");\nconst u32 gMonBackPic_Beedrill[] = INCBIN_U32(\"graphics/pokemon/beedrill/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Beedrill[] = INCBIN_U32(\"graphics/pokemon/beedrill/shiny.gbapal.lz\");\nconst u8 gMonIcon_Beedrill[] = INCBIN_U8(\"graphics/pokemon/beedrill/icon.4bpp\");\nconst u8 gMonFootprint_Beedrill[] = INCBIN_U8(\"graphics/pokemon/beedrill/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Pidgey[] = INCBIN_U32(\"graphics/pokemon/pidgey/front.4bpp.lz\");\nconst u32 gMonPalette_Pidgey[] = INCBIN_U32(\"graphics/pokemon/pidgey/normal.gbapal.lz\");\nconst u32 gMonBackPic_Pidgey[] = INCBIN_U32(\"graphics/pokemon/pidgey/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Pidgey[] = INCBIN_U32(\"graphics/pokemon/pidgey/shiny.gbapal.lz\");\nconst u8 gMonIcon_Pidgey[] = INCBIN_U8(\"graphics/pokemon/pidgey/icon.4bpp\");\nconst u8 gMonFootprint_Pidgey[] = INCBIN_U8(\"graphics/pokemon/pidgey/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Pidgeotto[] = INCBIN_U32(\"graphics/pokemon/pidgeotto/front.4bpp.lz\");\nconst u32 gMonPalette_Pidgeotto[] = INCBIN_U32(\"graphics/pokemon/pidgeotto/normal.gbapal.lz\");\nconst u32 gMonBackPic_Pidgeotto[] = INCBIN_U32(\"graphics/pokemon/pidgeotto/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Pidgeotto[] = INCBIN_U32(\"graphics/pokemon/pidgeotto/shiny.gbapal.lz\");\nconst u8 gMonIcon_Pidgeotto[] = INCBIN_U8(\"graphics/pokemon/pidgeotto/icon.4bpp\");\nconst u8 gMonFootprint_Pidgeotto[] = INCBIN_U8(\"graphics/pokemon/pidgeotto/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Pidgeot[] = INCBIN_U32(\"graphics/pokemon/pidgeot/front.4bpp.lz\");\nconst u32 gMonPalette_Pidgeot[] = INCBIN_U32(\"graphics/pokemon/pidgeot/normal.gbapal.lz\");\nconst u32 gMonBackPic_Pidgeot[] = INCBIN_U32(\"graphics/pokemon/pidgeot/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Pidgeot[] = INCBIN_U32(\"graphics/pokemon/pidgeot/shiny.gbapal.lz\");\nconst u8 gMonIcon_Pidgeot[] = INCBIN_U8(\"graphics/pokemon/pidgeot/icon.4bpp\");\nconst u8 gMonFootprint_Pidgeot[] = INCBIN_U8(\"graphics/pokemon/pidgeot/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Rattata[] = INCBIN_U32(\"graphics/pokemon/rattata/front.4bpp.lz\");\nconst u32 gMonPalette_Rattata[] = INCBIN_U32(\"graphics/pokemon/rattata/normal.gbapal.lz\");\nconst u32 gMonBackPic_Rattata[] = INCBIN_U32(\"graphics/pokemon/rattata/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Rattata[] = INCBIN_U32(\"graphics/pokemon/rattata/shiny.gbapal.lz\");\nconst u8 gMonIcon_Rattata[] = INCBIN_U8(\"graphics/pokemon/rattata/icon.4bpp\");\nconst u8 gMonFootprint_Rattata[] = INCBIN_U8(\"graphics/pokemon/rattata/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Raticate[] = INCBIN_U32(\"graphics/pokemon/raticate/front.4bpp.lz\");\nconst u32 gMonPalette_Raticate[] = INCBIN_U32(\"graphics/pokemon/raticate/normal.gbapal.lz\");\nconst u32 gMonBackPic_Raticate[] = INCBIN_U32(\"graphics/pokemon/raticate/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Raticate[] = INCBIN_U32(\"graphics/pokemon/raticate/shiny.gbapal.lz\");\nconst u8 gMonIcon_Raticate[] = INCBIN_U8(\"graphics/pokemon/raticate/icon.4bpp\");\nconst u8 gMonFootprint_Raticate[] = INCBIN_U8(\"graphics/pokemon/raticate/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Spearow[] = INCBIN_U32(\"graphics/pokemon/spearow/front.4bpp.lz\");\nconst u32 gMonPalette_Spearow[] = INCBIN_U32(\"graphics/pokemon/spearow/normal.gbapal.lz\");\nconst u32 gMonBackPic_Spearow[] = INCBIN_U32(\"graphics/pokemon/spearow/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Spearow[] = INCBIN_U32(\"graphics/pokemon/spearow/shiny.gbapal.lz\");\nconst u8 gMonIcon_Spearow[] = INCBIN_U8(\"graphics/pokemon/spearow/icon.4bpp\");\nconst u8 gMonFootprint_Spearow[] = INCBIN_U8(\"graphics/pokemon/spearow/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Fearow[] = INCBIN_U32(\"graphics/pokemon/fearow/front.4bpp.lz\");\nconst u32 gMonPalette_Fearow[] = INCBIN_U32(\"graphics/pokemon/fearow/normal.gbapal.lz\");\nconst u32 gMonBackPic_Fearow[] = INCBIN_U32(\"graphics/pokemon/fearow/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Fearow[] = INCBIN_U32(\"graphics/pokemon/fearow/shiny.gbapal.lz\");\nconst u8 gMonIcon_Fearow[] = INCBIN_U8(\"graphics/pokemon/fearow/icon.4bpp\");\nconst u8 gMonFootprint_Fearow[] = INCBIN_U8(\"graphics/pokemon/fearow/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ekans[] = INCBIN_U32(\"graphics/pokemon/ekans/front.4bpp.lz\");\nconst u32 gMonPalette_Ekans[] = INCBIN_U32(\"graphics/pokemon/ekans/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ekans[] = INCBIN_U32(\"graphics/pokemon/ekans/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ekans[] = INCBIN_U32(\"graphics/pokemon/ekans/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ekans[] = INCBIN_U8(\"graphics/pokemon/ekans/icon.4bpp\");\nconst u8 gMonFootprint_Ekans[] = INCBIN_U8(\"graphics/pokemon/ekans/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Arbok[] = INCBIN_U32(\"graphics/pokemon/arbok/front.4bpp.lz\");\nconst u32 gMonPalette_Arbok[] = INCBIN_U32(\"graphics/pokemon/arbok/normal.gbapal.lz\");\nconst u32 gMonBackPic_Arbok[] = INCBIN_U32(\"graphics/pokemon/arbok/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Arbok[] = INCBIN_U32(\"graphics/pokemon/arbok/shiny.gbapal.lz\");\nconst u8 gMonIcon_Arbok[] = INCBIN_U8(\"graphics/pokemon/arbok/icon.4bpp\");\nconst u8 gMonFootprint_Arbok[] = INCBIN_U8(\"graphics/pokemon/arbok/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Pikachu[] = INCBIN_U32(\"graphics/pokemon/pikachu/front.4bpp.lz\");\nconst u32 gMonPalette_Pikachu[] = INCBIN_U32(\"graphics/pokemon/pikachu/normal.gbapal.lz\");\nconst u32 gMonBackPic_Pikachu[] = INCBIN_U32(\"graphics/pokemon/pikachu/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Pikachu[] = INCBIN_U32(\"graphics/pokemon/pikachu/shiny.gbapal.lz\");\nconst u8 gMonIcon_Pikachu[] = INCBIN_U8(\"graphics/pokemon/pikachu/icon.4bpp\");\nconst u8 gMonFootprint_Pikachu[] = INCBIN_U8(\"graphics/pokemon/pikachu/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Raichu[] = INCBIN_U32(\"graphics/pokemon/raichu/front.4bpp.lz\");\nconst u32 gMonPalette_Raichu[] = INCBIN_U32(\"graphics/pokemon/raichu/normal.gbapal.lz\");\nconst u32 gMonBackPic_Raichu[] = INCBIN_U32(\"graphics/pokemon/raichu/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Raichu[] = INCBIN_U32(\"graphics/pokemon/raichu/shiny.gbapal.lz\");\nconst u8 gMonIcon_Raichu[] = INCBIN_U8(\"graphics/pokemon/raichu/icon.4bpp\");\nconst u8 gMonFootprint_Raichu[] = INCBIN_U8(\"graphics/pokemon/raichu/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Sandshrew[] = INCBIN_U32(\"graphics/pokemon/sandshrew/front.4bpp.lz\");\nconst u32 gMonPalette_Sandshrew[] = INCBIN_U32(\"graphics/pokemon/sandshrew/normal.gbapal.lz\");\nconst u32 gMonBackPic_Sandshrew[] = INCBIN_U32(\"graphics/pokemon/sandshrew/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Sandshrew[] = INCBIN_U32(\"graphics/pokemon/sandshrew/shiny.gbapal.lz\");\nconst u8 gMonIcon_Sandshrew[] = INCBIN_U8(\"graphics/pokemon/sandshrew/icon.4bpp\");\nconst u8 gMonFootprint_Sandshrew[] = INCBIN_U8(\"graphics/pokemon/sandshrew/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Sandslash[] = INCBIN_U32(\"graphics/pokemon/sandslash/front.4bpp.lz\");\nconst u32 gMonPalette_Sandslash[] = INCBIN_U32(\"graphics/pokemon/sandslash/normal.gbapal.lz\");\nconst u32 gMonBackPic_Sandslash[] = INCBIN_U32(\"graphics/pokemon/sandslash/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Sandslash[] = INCBIN_U32(\"graphics/pokemon/sandslash/shiny.gbapal.lz\");\nconst u8 gMonIcon_Sandslash[] = INCBIN_U8(\"graphics/pokemon/sandslash/icon.4bpp\");\nconst u8 gMonFootprint_Sandslash[] = INCBIN_U8(\"graphics/pokemon/sandslash/footprint.1bpp\");\n\nconst u32 gMonFrontPic_NidoranF[] = INCBIN_U32(\"graphics/pokemon/nidoran_f/front.4bpp.lz\");\nconst u32 gMonPalette_NidoranF[] = INCBIN_U32(\"graphics/pokemon/nidoran_f/normal.gbapal.lz\");\nconst u32 gMonBackPic_NidoranF[] = INCBIN_U32(\"graphics/pokemon/nidoran_f/back.4bpp.lz\");\nconst u32 gMonShinyPalette_NidoranF[] = INCBIN_U32(\"graphics/pokemon/nidoran_f/shiny.gbapal.lz\");\nconst u8 gMonIcon_NidoranF[] = INCBIN_U8(\"graphics/pokemon/nidoran_f/icon.4bpp\");\nconst u8 gMonFootprint_NidoranF[] = INCBIN_U8(\"graphics/pokemon/nidoran_f/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Nidorina[] = INCBIN_U32(\"graphics/pokemon/nidorina/front.4bpp.lz\");\nconst u32 gMonPalette_Nidorina[] = INCBIN_U32(\"graphics/pokemon/nidorina/normal.gbapal.lz\");\nconst u32 gMonBackPic_Nidorina[] = INCBIN_U32(\"graphics/pokemon/nidorina/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Nidorina[] = INCBIN_U32(\"graphics/pokemon/nidorina/shiny.gbapal.lz\");\nconst u8 gMonIcon_Nidorina[] = INCBIN_U8(\"graphics/pokemon/nidorina/icon.4bpp\");\nconst u8 gMonFootprint_Nidorina[] = INCBIN_U8(\"graphics/pokemon/nidorina/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Nidoqueen[] = INCBIN_U32(\"graphics/pokemon/nidoqueen/front.4bpp.lz\");\nconst u32 gMonPalette_Nidoqueen[] = INCBIN_U32(\"graphics/pokemon/nidoqueen/normal.gbapal.lz\");\nconst u32 gMonBackPic_Nidoqueen[] = INCBIN_U32(\"graphics/pokemon/nidoqueen/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Nidoqueen[] = INCBIN_U32(\"graphics/pokemon/nidoqueen/shiny.gbapal.lz\");\nconst u8 gMonIcon_Nidoqueen[] = INCBIN_U8(\"graphics/pokemon/nidoqueen/icon.4bpp\");\nconst u8 gMonFootprint_Nidoqueen[] = INCBIN_U8(\"graphics/pokemon/nidoqueen/footprint.1bpp\");\n\nconst u32 gMonFrontPic_NidoranM[] = INCBIN_U32(\"graphics/pokemon/nidoran_m/front.4bpp.lz\");\nconst u32 gMonPalette_NidoranM[] = INCBIN_U32(\"graphics/pokemon/nidoran_m/normal.gbapal.lz\");\nconst u32 gMonBackPic_NidoranM[] = INCBIN_U32(\"graphics/pokemon/nidoran_m/back.4bpp.lz\");\nconst u32 gMonShinyPalette_NidoranM[] = INCBIN_U32(\"graphics/pokemon/nidoran_m/shiny.gbapal.lz\");\nconst u8 gMonIcon_NidoranM[] = INCBIN_U8(\"graphics/pokemon/nidoran_m/icon.4bpp\");\nconst u8 gMonFootprint_NidoranM[] = INCBIN_U8(\"graphics/pokemon/nidoran_m/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Nidorino[] = INCBIN_U32(\"graphics/pokemon/nidorino/front.4bpp.lz\");\nconst u32 gMonPalette_Nidorino[] = INCBIN_U32(\"graphics/pokemon/nidorino/normal.gbapal.lz\");\nconst u32 gMonBackPic_Nidorino[] = INCBIN_U32(\"graphics/pokemon/nidorino/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Nidorino[] = INCBIN_U32(\"graphics/pokemon/nidorino/shiny.gbapal.lz\");\nconst u8 gMonIcon_Nidorino[] = INCBIN_U8(\"graphics/pokemon/nidorino/icon.4bpp\");\nconst u8 gMonFootprint_Nidorino[] = INCBIN_U8(\"graphics/pokemon/nidorino/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Nidoking[] = INCBIN_U32(\"graphics/pokemon/nidoking/front.4bpp.lz\");\nconst u32 gMonPalette_Nidoking[] = INCBIN_U32(\"graphics/pokemon/nidoking/normal.gbapal.lz\");\nconst u32 gMonBackPic_Nidoking[] = INCBIN_U32(\"graphics/pokemon/nidoking/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Nidoking[] = INCBIN_U32(\"graphics/pokemon/nidoking/shiny.gbapal.lz\");\nconst u8 gMonIcon_Nidoking[] = INCBIN_U8(\"graphics/pokemon/nidoking/icon.4bpp\");\nconst u8 gMonFootprint_Nidoking[] = INCBIN_U8(\"graphics/pokemon/nidoking/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Clefairy[] = INCBIN_U32(\"graphics/pokemon/clefairy/front.4bpp.lz\");\nconst u32 gMonPalette_Clefairy[] = INCBIN_U32(\"graphics/pokemon/clefairy/normal.gbapal.lz\");\nconst u32 gMonBackPic_Clefairy[] = INCBIN_U32(\"graphics/pokemon/clefairy/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Clefairy[] = INCBIN_U32(\"graphics/pokemon/clefairy/shiny.gbapal.lz\");\nconst u8 gMonIcon_Clefairy[] = INCBIN_U8(\"graphics/pokemon/clefairy/icon.4bpp\");\nconst u8 gMonFootprint_Clefairy[] = INCBIN_U8(\"graphics/pokemon/clefairy/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Clefable[] = INCBIN_U32(\"graphics/pokemon/clefable/front.4bpp.lz\");\nconst u32 gMonPalette_Clefable[] = INCBIN_U32(\"graphics/pokemon/clefable/normal.gbapal.lz\");\nconst u32 gMonBackPic_Clefable[] = INCBIN_U32(\"graphics/pokemon/clefable/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Clefable[] = INCBIN_U32(\"graphics/pokemon/clefable/shiny.gbapal.lz\");\nconst u8 gMonIcon_Clefable[] = INCBIN_U8(\"graphics/pokemon/clefable/icon.4bpp\");\nconst u8 gMonFootprint_Clefable[] = INCBIN_U8(\"graphics/pokemon/clefable/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Vulpix[] = INCBIN_U32(\"graphics/pokemon/vulpix/front.4bpp.lz\");\nconst u32 gMonPalette_Vulpix[] = INCBIN_U32(\"graphics/pokemon/vulpix/normal.gbapal.lz\");\nconst u32 gMonBackPic_Vulpix[] = INCBIN_U32(\"graphics/pokemon/vulpix/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Vulpix[] = INCBIN_U32(\"graphics/pokemon/vulpix/shiny.gbapal.lz\");\nconst u8 gMonIcon_Vulpix[] = INCBIN_U8(\"graphics/pokemon/vulpix/icon.4bpp\");\nconst u8 gMonFootprint_Vulpix[] = INCBIN_U8(\"graphics/pokemon/vulpix/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ninetales[] = INCBIN_U32(\"graphics/pokemon/ninetales/front.4bpp.lz\");\nconst u32 gMonPalette_Ninetales[] = INCBIN_U32(\"graphics/pokemon/ninetales/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ninetales[] = INCBIN_U32(\"graphics/pokemon/ninetales/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ninetales[] = INCBIN_U32(\"graphics/pokemon/ninetales/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ninetales[] = INCBIN_U8(\"graphics/pokemon/ninetales/icon.4bpp\");\nconst u8 gMonFootprint_Ninetales[] = INCBIN_U8(\"graphics/pokemon/ninetales/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Jigglypuff[] = INCBIN_U32(\"graphics/pokemon/jigglypuff/front.4bpp.lz\");\nconst u32 gMonPalette_Jigglypuff[] = INCBIN_U32(\"graphics/pokemon/jigglypuff/normal.gbapal.lz\");\nconst u32 gMonBackPic_Jigglypuff[] = INCBIN_U32(\"graphics/pokemon/jigglypuff/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Jigglypuff[] = INCBIN_U32(\"graphics/pokemon/jigglypuff/shiny.gbapal.lz\");\nconst u8 gMonIcon_Jigglypuff[] = INCBIN_U8(\"graphics/pokemon/jigglypuff/icon.4bpp\");\nconst u8 gMonFootprint_Jigglypuff[] = INCBIN_U8(\"graphics/pokemon/jigglypuff/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Wigglytuff[] = INCBIN_U32(\"graphics/pokemon/wigglytuff/front.4bpp.lz\");\nconst u32 gMonPalette_Wigglytuff[] = INCBIN_U32(\"graphics/pokemon/wigglytuff/normal.gbapal.lz\");\nconst u32 gMonBackPic_Wigglytuff[] = INCBIN_U32(\"graphics/pokemon/wigglytuff/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Wigglytuff[] = INCBIN_U32(\"graphics/pokemon/wigglytuff/shiny.gbapal.lz\");\nconst u8 gMonIcon_Wigglytuff[] = INCBIN_U8(\"graphics/pokemon/wigglytuff/icon.4bpp\");\nconst u8 gMonFootprint_Wigglytuff[] = INCBIN_U8(\"graphics/pokemon/wigglytuff/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Zubat[] = INCBIN_U32(\"graphics/pokemon/zubat/front.4bpp.lz\");\nconst u32 gMonPalette_Zubat[] = INCBIN_U32(\"graphics/pokemon/zubat/normal.gbapal.lz\");\nconst u32 gMonBackPic_Zubat[] = INCBIN_U32(\"graphics/pokemon/zubat/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Zubat[] = INCBIN_U32(\"graphics/pokemon/zubat/shiny.gbapal.lz\");\nconst u8 gMonIcon_Zubat[] = INCBIN_U8(\"graphics/pokemon/zubat/icon.4bpp\");\nconst u8 gMonFootprint_Zubat[] = INCBIN_U8(\"graphics/pokemon/zubat/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Golbat[] = INCBIN_U32(\"graphics/pokemon/golbat/front.4bpp.lz\");\nconst u32 gMonPalette_Golbat[] = INCBIN_U32(\"graphics/pokemon/golbat/normal.gbapal.lz\");\nconst u32 gMonBackPic_Golbat[] = INCBIN_U32(\"graphics/pokemon/golbat/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Golbat[] = INCBIN_U32(\"graphics/pokemon/golbat/shiny.gbapal.lz\");\nconst u8 gMonIcon_Golbat[] = INCBIN_U8(\"graphics/pokemon/golbat/icon.4bpp\");\nconst u8 gMonFootprint_Golbat[] = INCBIN_U8(\"graphics/pokemon/golbat/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Oddish[] = INCBIN_U32(\"graphics/pokemon/oddish/front.4bpp.lz\");\nconst u32 gMonPalette_Oddish[] = INCBIN_U32(\"graphics/pokemon/oddish/normal.gbapal.lz\");\nconst u32 gMonBackPic_Oddish[] = INCBIN_U32(\"graphics/pokemon/oddish/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Oddish[] = INCBIN_U32(\"graphics/pokemon/oddish/shiny.gbapal.lz\");\nconst u8 gMonIcon_Oddish[] = INCBIN_U8(\"graphics/pokemon/oddish/icon.4bpp\");\nconst u8 gMonFootprint_Oddish[] = INCBIN_U8(\"graphics/pokemon/oddish/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Gloom[] = INCBIN_U32(\"graphics/pokemon/gloom/front.4bpp.lz\");\nconst u32 gMonPalette_Gloom[] = INCBIN_U32(\"graphics/pokemon/gloom/normal.gbapal.lz\");\nconst u32 gMonBackPic_Gloom[] = INCBIN_U32(\"graphics/pokemon/gloom/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Gloom[] = INCBIN_U32(\"graphics/pokemon/gloom/shiny.gbapal.lz\");\nconst u8 gMonIcon_Gloom[] = INCBIN_U8(\"graphics/pokemon/gloom/icon.4bpp\");\nconst u8 gMonFootprint_Gloom[] = INCBIN_U8(\"graphics/pokemon/gloom/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Vileplume[] = INCBIN_U32(\"graphics/pokemon/vileplume/front.4bpp.lz\");\nconst u32 gMonPalette_Vileplume[] = INCBIN_U32(\"graphics/pokemon/vileplume/normal.gbapal.lz\");\nconst u32 gMonBackPic_Vileplume[] = INCBIN_U32(\"graphics/pokemon/vileplume/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Vileplume[] = INCBIN_U32(\"graphics/pokemon/vileplume/shiny.gbapal.lz\");\nconst u8 gMonIcon_Vileplume[] = INCBIN_U8(\"graphics/pokemon/vileplume/icon.4bpp\");\nconst u8 gMonFootprint_Vileplume[] = INCBIN_U8(\"graphics/pokemon/vileplume/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Paras[] = INCBIN_U32(\"graphics/pokemon/paras/front.4bpp.lz\");\nconst u32 gMonPalette_Paras[] = INCBIN_U32(\"graphics/pokemon/paras/normal.gbapal.lz\");\nconst u32 gMonBackPic_Paras[] = INCBIN_U32(\"graphics/pokemon/paras/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Paras[] = INCBIN_U32(\"graphics/pokemon/paras/shiny.gbapal.lz\");\nconst u8 gMonIcon_Paras[] = INCBIN_U8(\"graphics/pokemon/paras/icon.4bpp\");\nconst u8 gMonFootprint_Paras[] = INCBIN_U8(\"graphics/pokemon/paras/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Parasect[] = INCBIN_U32(\"graphics/pokemon/parasect/front.4bpp.lz\");\nconst u32 gMonPalette_Parasect[] = INCBIN_U32(\"graphics/pokemon/parasect/normal.gbapal.lz\");\nconst u32 gMonBackPic_Parasect[] = INCBIN_U32(\"graphics/pokemon/parasect/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Parasect[] = INCBIN_U32(\"graphics/pokemon/parasect/shiny.gbapal.lz\");\nconst u8 gMonIcon_Parasect[] = INCBIN_U8(\"graphics/pokemon/parasect/icon.4bpp\");\nconst u8 gMonFootprint_Parasect[] = INCBIN_U8(\"graphics/pokemon/parasect/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Venonat[] = INCBIN_U32(\"graphics/pokemon/venonat/front.4bpp.lz\");\nconst u32 gMonPalette_Venonat[] = INCBIN_U32(\"graphics/pokemon/venonat/normal.gbapal.lz\");\nconst u32 gMonBackPic_Venonat[] = INCBIN_U32(\"graphics/pokemon/venonat/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Venonat[] = INCBIN_U32(\"graphics/pokemon/venonat/shiny.gbapal.lz\");\nconst u8 gMonIcon_Venonat[] = INCBIN_U8(\"graphics/pokemon/venonat/icon.4bpp\");\nconst u8 gMonFootprint_Venonat[] = INCBIN_U8(\"graphics/pokemon/venonat/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Venomoth[] = INCBIN_U32(\"graphics/pokemon/venomoth/front.4bpp.lz\");\nconst u32 gMonPalette_Venomoth[] = INCBIN_U32(\"graphics/pokemon/venomoth/normal.gbapal.lz\");\nconst u32 gMonBackPic_Venomoth[] = INCBIN_U32(\"graphics/pokemon/venomoth/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Venomoth[] = INCBIN_U32(\"graphics/pokemon/venomoth/shiny.gbapal.lz\");\nconst u8 gMonIcon_Venomoth[] = INCBIN_U8(\"graphics/pokemon/venomoth/icon.4bpp\");\nconst u8 gMonFootprint_Venomoth[] = INCBIN_U8(\"graphics/pokemon/venomoth/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Diglett[] = INCBIN_U32(\"graphics/pokemon/diglett/front.4bpp.lz\");\nconst u32 gMonPalette_Diglett[] = INCBIN_U32(\"graphics/pokemon/diglett/normal.gbapal.lz\");\nconst u32 gMonBackPic_Diglett[] = INCBIN_U32(\"graphics/pokemon/diglett/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Diglett[] = INCBIN_U32(\"graphics/pokemon/diglett/shiny.gbapal.lz\");\nconst u8 gMonIcon_Diglett[] = INCBIN_U8(\"graphics/pokemon/diglett/icon.4bpp\");\nconst u8 gMonFootprint_Diglett[] = INCBIN_U8(\"graphics/pokemon/diglett/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Dugtrio[] = INCBIN_U32(\"graphics/pokemon/dugtrio/front.4bpp.lz\");\nconst u32 gMonPalette_Dugtrio[] = INCBIN_U32(\"graphics/pokemon/dugtrio/normal.gbapal.lz\");\nconst u32 gMonBackPic_Dugtrio[] = INCBIN_U32(\"graphics/pokemon/dugtrio/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Dugtrio[] = INCBIN_U32(\"graphics/pokemon/dugtrio/shiny.gbapal.lz\");\nconst u8 gMonIcon_Dugtrio[] = INCBIN_U8(\"graphics/pokemon/dugtrio/icon.4bpp\");\nconst u8 gMonFootprint_Dugtrio[] = INCBIN_U8(\"graphics/pokemon/dugtrio/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Meowth[] = INCBIN_U32(\"graphics/pokemon/meowth/front.4bpp.lz\");\nconst u32 gMonPalette_Meowth[] = INCBIN_U32(\"graphics/pokemon/meowth/normal.gbapal.lz\");\nconst u32 gMonBackPic_Meowth[] = INCBIN_U32(\"graphics/pokemon/meowth/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Meowth[] = INCBIN_U32(\"graphics/pokemon/meowth/shiny.gbapal.lz\");\nconst u8 gMonIcon_Meowth[] = INCBIN_U8(\"graphics/pokemon/meowth/icon.4bpp\");\nconst u8 gMonFootprint_Meowth[] = INCBIN_U8(\"graphics/pokemon/meowth/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Persian[] = INCBIN_U32(\"graphics/pokemon/persian/front.4bpp.lz\");\nconst u32 gMonPalette_Persian[] = INCBIN_U32(\"graphics/pokemon/persian/normal.gbapal.lz\");\nconst u32 gMonBackPic_Persian[] = INCBIN_U32(\"graphics/pokemon/persian/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Persian[] = INCBIN_U32(\"graphics/pokemon/persian/shiny.gbapal.lz\");\nconst u8 gMonIcon_Persian[] = INCBIN_U8(\"graphics/pokemon/persian/icon.4bpp\");\nconst u8 gMonFootprint_Persian[] = INCBIN_U8(\"graphics/pokemon/persian/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Psyduck[] = INCBIN_U32(\"graphics/pokemon/psyduck/front.4bpp.lz\");\nconst u32 gMonPalette_Psyduck[] = INCBIN_U32(\"graphics/pokemon/psyduck/normal.gbapal.lz\");\nconst u32 gMonBackPic_Psyduck[] = INCBIN_U32(\"graphics/pokemon/psyduck/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Psyduck[] = INCBIN_U32(\"graphics/pokemon/psyduck/shiny.gbapal.lz\");\nconst u8 gMonIcon_Psyduck[] = INCBIN_U8(\"graphics/pokemon/psyduck/icon.4bpp\");\nconst u8 gMonFootprint_Psyduck[] = INCBIN_U8(\"graphics/pokemon/psyduck/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Golduck[] = INCBIN_U32(\"graphics/pokemon/golduck/front.4bpp.lz\");\nconst u32 gMonPalette_Golduck[] = INCBIN_U32(\"graphics/pokemon/golduck/normal.gbapal.lz\");\nconst u32 gMonBackPic_Golduck[] = INCBIN_U32(\"graphics/pokemon/golduck/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Golduck[] = INCBIN_U32(\"graphics/pokemon/golduck/shiny.gbapal.lz\");\nconst u8 gMonIcon_Golduck[] = INCBIN_U8(\"graphics/pokemon/golduck/icon.4bpp\");\nconst u8 gMonFootprint_Golduck[] = INCBIN_U8(\"graphics/pokemon/golduck/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Mankey[] = INCBIN_U32(\"graphics/pokemon/mankey/front.4bpp.lz\");\nconst u32 gMonPalette_Mankey[] = INCBIN_U32(\"graphics/pokemon/mankey/normal.gbapal.lz\");\nconst u32 gMonBackPic_Mankey[] = INCBIN_U32(\"graphics/pokemon/mankey/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Mankey[] = INCBIN_U32(\"graphics/pokemon/mankey/shiny.gbapal.lz\");\nconst u8 gMonIcon_Mankey[] = INCBIN_U8(\"graphics/pokemon/mankey/icon.4bpp\");\nconst u8 gMonFootprint_Mankey[] = INCBIN_U8(\"graphics/pokemon/mankey/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Primeape[] = INCBIN_U32(\"graphics/pokemon/primeape/front.4bpp.lz\");\nconst u32 gMonPalette_Primeape[] = INCBIN_U32(\"graphics/pokemon/primeape/normal.gbapal.lz\");\nconst u32 gMonBackPic_Primeape[] = INCBIN_U32(\"graphics/pokemon/primeape/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Primeape[] = INCBIN_U32(\"graphics/pokemon/primeape/shiny.gbapal.lz\");\nconst u8 gMonIcon_Primeape[] = INCBIN_U8(\"graphics/pokemon/primeape/icon.4bpp\");\nconst u8 gMonFootprint_Primeape[] = INCBIN_U8(\"graphics/pokemon/primeape/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Growlithe[] = INCBIN_U32(\"graphics/pokemon/growlithe/front.4bpp.lz\");\nconst u32 gMonPalette_Growlithe[] = INCBIN_U32(\"graphics/pokemon/growlithe/normal.gbapal.lz\");\nconst u32 gMonBackPic_Growlithe[] = INCBIN_U32(\"graphics/pokemon/growlithe/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Growlithe[] = INCBIN_U32(\"graphics/pokemon/growlithe/shiny.gbapal.lz\");\nconst u8 gMonIcon_Growlithe[] = INCBIN_U8(\"graphics/pokemon/growlithe/icon.4bpp\");\nconst u8 gMonFootprint_Growlithe[] = INCBIN_U8(\"graphics/pokemon/growlithe/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Arcanine[] = INCBIN_U32(\"graphics/pokemon/arcanine/front.4bpp.lz\");\nconst u32 gMonPalette_Arcanine[] = INCBIN_U32(\"graphics/pokemon/arcanine/normal.gbapal.lz\");\nconst u32 gMonBackPic_Arcanine[] = INCBIN_U32(\"graphics/pokemon/arcanine/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Arcanine[] = INCBIN_U32(\"graphics/pokemon/arcanine/shiny.gbapal.lz\");\nconst u8 gMonIcon_Arcanine[] = INCBIN_U8(\"graphics/pokemon/arcanine/icon.4bpp\");\nconst u8 gMonFootprint_Arcanine[] = INCBIN_U8(\"graphics/pokemon/arcanine/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Poliwag[] = INCBIN_U32(\"graphics/pokemon/poliwag/front.4bpp.lz\");\nconst u32 gMonPalette_Poliwag[] = INCBIN_U32(\"graphics/pokemon/poliwag/normal.gbapal.lz\");\nconst u32 gMonBackPic_Poliwag[] = INCBIN_U32(\"graphics/pokemon/poliwag/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Poliwag[] = INCBIN_U32(\"graphics/pokemon/poliwag/shiny.gbapal.lz\");\nconst u8 gMonIcon_Poliwag[] = INCBIN_U8(\"graphics/pokemon/poliwag/icon.4bpp\");\nconst u8 gMonFootprint_Poliwag[] = INCBIN_U8(\"graphics/pokemon/poliwag/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Poliwhirl[] = INCBIN_U32(\"graphics/pokemon/poliwhirl/front.4bpp.lz\");\nconst u32 gMonPalette_Poliwhirl[] = INCBIN_U32(\"graphics/pokemon/poliwhirl/normal.gbapal.lz\");\nconst u32 gMonBackPic_Poliwhirl[] = INCBIN_U32(\"graphics/pokemon/poliwhirl/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Poliwhirl[] = INCBIN_U32(\"graphics/pokemon/poliwhirl/shiny.gbapal.lz\");\nconst u8 gMonIcon_Poliwhirl[] = INCBIN_U8(\"graphics/pokemon/poliwhirl/icon.4bpp\");\nconst u8 gMonFootprint_Poliwhirl[] = INCBIN_U8(\"graphics/pokemon/poliwhirl/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Poliwrath[] = INCBIN_U32(\"graphics/pokemon/poliwrath/front.4bpp.lz\");\nconst u32 gMonPalette_Poliwrath[] = INCBIN_U32(\"graphics/pokemon/poliwrath/normal.gbapal.lz\");\nconst u32 gMonBackPic_Poliwrath[] = INCBIN_U32(\"graphics/pokemon/poliwrath/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Poliwrath[] = INCBIN_U32(\"graphics/pokemon/poliwrath/shiny.gbapal.lz\");\nconst u8 gMonIcon_Poliwrath[] = INCBIN_U8(\"graphics/pokemon/poliwrath/icon.4bpp\");\nconst u8 gMonFootprint_Poliwrath[] = INCBIN_U8(\"graphics/pokemon/poliwrath/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Abra[] = INCBIN_U32(\"graphics/pokemon/abra/front.4bpp.lz\");\nconst u32 gMonPalette_Abra[] = INCBIN_U32(\"graphics/pokemon/abra/normal.gbapal.lz\");\nconst u32 gMonBackPic_Abra[] = INCBIN_U32(\"graphics/pokemon/abra/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Abra[] = INCBIN_U32(\"graphics/pokemon/abra/shiny.gbapal.lz\");\nconst u8 gMonIcon_Abra[] = INCBIN_U8(\"graphics/pokemon/abra/icon.4bpp\");\nconst u8 gMonFootprint_Abra[] = INCBIN_U8(\"graphics/pokemon/abra/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Kadabra[] = INCBIN_U32(\"graphics/pokemon/kadabra/front.4bpp.lz\");\nconst u32 gMonPalette_Kadabra[] = INCBIN_U32(\"graphics/pokemon/kadabra/normal.gbapal.lz\");\nconst u32 gMonBackPic_Kadabra[] = INCBIN_U32(\"graphics/pokemon/kadabra/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Kadabra[] = INCBIN_U32(\"graphics/pokemon/kadabra/shiny.gbapal.lz\");\nconst u8 gMonIcon_Kadabra[] = INCBIN_U8(\"graphics/pokemon/kadabra/icon.4bpp\");\nconst u8 gMonFootprint_Kadabra[] = INCBIN_U8(\"graphics/pokemon/kadabra/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Alakazam[] = INCBIN_U32(\"graphics/pokemon/alakazam/front.4bpp.lz\");\nconst u32 gMonPalette_Alakazam[] = INCBIN_U32(\"graphics/pokemon/alakazam/normal.gbapal.lz\");\nconst u32 gMonBackPic_Alakazam[] = INCBIN_U32(\"graphics/pokemon/alakazam/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Alakazam[] = INCBIN_U32(\"graphics/pokemon/alakazam/shiny.gbapal.lz\");\nconst u8 gMonIcon_Alakazam[] = INCBIN_U8(\"graphics/pokemon/alakazam/icon.4bpp\");\nconst u8 gMonFootprint_Alakazam[] = INCBIN_U8(\"graphics/pokemon/alakazam/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Machop[] = INCBIN_U32(\"graphics/pokemon/machop/front.4bpp.lz\");\nconst u32 gMonPalette_Machop[] = INCBIN_U32(\"graphics/pokemon/machop/normal.gbapal.lz\");\nconst u32 gMonBackPic_Machop[] = INCBIN_U32(\"graphics/pokemon/machop/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Machop[] = INCBIN_U32(\"graphics/pokemon/machop/shiny.gbapal.lz\");\nconst u8 gMonIcon_Machop[] = INCBIN_U8(\"graphics/pokemon/machop/icon.4bpp\");\nconst u8 gMonFootprint_Machop[] = INCBIN_U8(\"graphics/pokemon/machop/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Machoke[] = INCBIN_U32(\"graphics/pokemon/machoke/front.4bpp.lz\");\nconst u32 gMonPalette_Machoke[] = INCBIN_U32(\"graphics/pokemon/machoke/normal.gbapal.lz\");\nconst u32 gMonBackPic_Machoke[] = INCBIN_U32(\"graphics/pokemon/machoke/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Machoke[] = INCBIN_U32(\"graphics/pokemon/machoke/shiny.gbapal.lz\");\nconst u8 gMonIcon_Machoke[] = INCBIN_U8(\"graphics/pokemon/machoke/icon.4bpp\");\nconst u8 gMonFootprint_Machoke[] = INCBIN_U8(\"graphics/pokemon/machoke/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Machamp[] = INCBIN_U32(\"graphics/pokemon/machamp/front.4bpp.lz\");\nconst u32 gMonPalette_Machamp[] = INCBIN_U32(\"graphics/pokemon/machamp/normal.gbapal.lz\");\nconst u32 gMonBackPic_Machamp[] = INCBIN_U32(\"graphics/pokemon/machamp/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Machamp[] = INCBIN_U32(\"graphics/pokemon/machamp/shiny.gbapal.lz\");\nconst u8 gMonIcon_Machamp[] = INCBIN_U8(\"graphics/pokemon/machamp/icon.4bpp\");\nconst u8 gMonFootprint_Machamp[] = INCBIN_U8(\"graphics/pokemon/machamp/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Bellsprout[] = INCBIN_U32(\"graphics/pokemon/bellsprout/front.4bpp.lz\");\nconst u32 gMonPalette_Bellsprout[] = INCBIN_U32(\"graphics/pokemon/bellsprout/normal.gbapal.lz\");\nconst u32 gMonBackPic_Bellsprout[] = INCBIN_U32(\"graphics/pokemon/bellsprout/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Bellsprout[] = INCBIN_U32(\"graphics/pokemon/bellsprout/shiny.gbapal.lz\");\nconst u8 gMonIcon_Bellsprout[] = INCBIN_U8(\"graphics/pokemon/bellsprout/icon.4bpp\");\nconst u8 gMonFootprint_Bellsprout[] = INCBIN_U8(\"graphics/pokemon/bellsprout/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Weepinbell[] = INCBIN_U32(\"graphics/pokemon/weepinbell/front.4bpp.lz\");\nconst u32 gMonPalette_Weepinbell[] = INCBIN_U32(\"graphics/pokemon/weepinbell/normal.gbapal.lz\");\nconst u32 gMonBackPic_Weepinbell[] = INCBIN_U32(\"graphics/pokemon/weepinbell/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Weepinbell[] = INCBIN_U32(\"graphics/pokemon/weepinbell/shiny.gbapal.lz\");\nconst u8 gMonIcon_Weepinbell[] = INCBIN_U8(\"graphics/pokemon/weepinbell/icon.4bpp\");\nconst u8 gMonFootprint_Weepinbell[] = INCBIN_U8(\"graphics/pokemon/weepinbell/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Victreebel[] = INCBIN_U32(\"graphics/pokemon/victreebel/front.4bpp.lz\");\nconst u32 gMonPalette_Victreebel[] = INCBIN_U32(\"graphics/pokemon/victreebel/normal.gbapal.lz\");\nconst u32 gMonBackPic_Victreebel[] = INCBIN_U32(\"graphics/pokemon/victreebel/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Victreebel[] = INCBIN_U32(\"graphics/pokemon/victreebel/shiny.gbapal.lz\");\nconst u8 gMonIcon_Victreebel[] = INCBIN_U8(\"graphics/pokemon/victreebel/icon.4bpp\");\nconst u8 gMonFootprint_Victreebel[] = INCBIN_U8(\"graphics/pokemon/victreebel/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Tentacool[] = INCBIN_U32(\"graphics/pokemon/tentacool/front.4bpp.lz\");\nconst u32 gMonPalette_Tentacool[] = INCBIN_U32(\"graphics/pokemon/tentacool/normal.gbapal.lz\");\nconst u32 gMonBackPic_Tentacool[] = INCBIN_U32(\"graphics/pokemon/tentacool/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Tentacool[] = INCBIN_U32(\"graphics/pokemon/tentacool/shiny.gbapal.lz\");\nconst u8 gMonIcon_Tentacool[] = INCBIN_U8(\"graphics/pokemon/tentacool/icon.4bpp\");\nconst u8 gMonFootprint_Tentacool[] = INCBIN_U8(\"graphics/pokemon/tentacool/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Tentacruel[] = INCBIN_U32(\"graphics/pokemon/tentacruel/front.4bpp.lz\");\nconst u32 gMonPalette_Tentacruel[] = INCBIN_U32(\"graphics/pokemon/tentacruel/normal.gbapal.lz\");\nconst u32 gMonBackPic_Tentacruel[] = INCBIN_U32(\"graphics/pokemon/tentacruel/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Tentacruel[] = INCBIN_U32(\"graphics/pokemon/tentacruel/shiny.gbapal.lz\");\nconst u8 gMonIcon_Tentacruel[] = INCBIN_U8(\"graphics/pokemon/tentacruel/icon.4bpp\");\nconst u8 gMonFootprint_Tentacruel[] = INCBIN_U8(\"graphics/pokemon/tentacruel/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Geodude[] = INCBIN_U32(\"graphics/pokemon/geodude/front.4bpp.lz\");\nconst u32 gMonPalette_Geodude[] = INCBIN_U32(\"graphics/pokemon/geodude/normal.gbapal.lz\");\nconst u32 gMonBackPic_Geodude[] = INCBIN_U32(\"graphics/pokemon/geodude/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Geodude[] = INCBIN_U32(\"graphics/pokemon/geodude/shiny.gbapal.lz\");\nconst u8 gMonIcon_Geodude[] = INCBIN_U8(\"graphics/pokemon/geodude/icon.4bpp\");\nconst u8 gMonFootprint_Geodude[] = INCBIN_U8(\"graphics/pokemon/geodude/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Graveler[] = INCBIN_U32(\"graphics/pokemon/graveler/front.4bpp.lz\");\nconst u32 gMonPalette_Graveler[] = INCBIN_U32(\"graphics/pokemon/graveler/normal.gbapal.lz\");\nconst u32 gMonBackPic_Graveler[] = INCBIN_U32(\"graphics/pokemon/graveler/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Graveler[] = INCBIN_U32(\"graphics/pokemon/graveler/shiny.gbapal.lz\");\nconst u8 gMonIcon_Graveler[] = INCBIN_U8(\"graphics/pokemon/graveler/icon.4bpp\");\nconst u8 gMonFootprint_Graveler[] = INCBIN_U8(\"graphics/pokemon/graveler/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Golem[] = INCBIN_U32(\"graphics/pokemon/golem/front.4bpp.lz\");\nconst u32 gMonPalette_Golem[] = INCBIN_U32(\"graphics/pokemon/golem/normal.gbapal.lz\");\nconst u32 gMonBackPic_Golem[] = INCBIN_U32(\"graphics/pokemon/golem/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Golem[] = INCBIN_U32(\"graphics/pokemon/golem/shiny.gbapal.lz\");\nconst u8 gMonIcon_Golem[] = INCBIN_U8(\"graphics/pokemon/golem/icon.4bpp\");\nconst u8 gMonFootprint_Golem[] = INCBIN_U8(\"graphics/pokemon/golem/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ponyta[] = INCBIN_U32(\"graphics/pokemon/ponyta/front.4bpp.lz\");\nconst u32 gMonPalette_Ponyta[] = INCBIN_U32(\"graphics/pokemon/ponyta/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ponyta[] = INCBIN_U32(\"graphics/pokemon/ponyta/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ponyta[] = INCBIN_U32(\"graphics/pokemon/ponyta/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ponyta[] = INCBIN_U8(\"graphics/pokemon/ponyta/icon.4bpp\");\nconst u8 gMonFootprint_Ponyta[] = INCBIN_U8(\"graphics/pokemon/ponyta/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Rapidash[] = INCBIN_U32(\"graphics/pokemon/rapidash/front.4bpp.lz\");\nconst u32 gMonPalette_Rapidash[] = INCBIN_U32(\"graphics/pokemon/rapidash/normal.gbapal.lz\");\nconst u32 gMonBackPic_Rapidash[] = INCBIN_U32(\"graphics/pokemon/rapidash/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Rapidash[] = INCBIN_U32(\"graphics/pokemon/rapidash/shiny.gbapal.lz\");\nconst u8 gMonIcon_Rapidash[] = INCBIN_U8(\"graphics/pokemon/rapidash/icon.4bpp\");\nconst u8 gMonFootprint_Rapidash[] = INCBIN_U8(\"graphics/pokemon/rapidash/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Slowpoke[] = INCBIN_U32(\"graphics/pokemon/slowpoke/front.4bpp.lz\");\nconst u32 gMonPalette_Slowpoke[] = INCBIN_U32(\"graphics/pokemon/slowpoke/normal.gbapal.lz\");\nconst u32 gMonBackPic_Slowpoke[] = INCBIN_U32(\"graphics/pokemon/slowpoke/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Slowpoke[] = INCBIN_U32(\"graphics/pokemon/slowpoke/shiny.gbapal.lz\");\nconst u8 gMonIcon_Slowpoke[] = INCBIN_U8(\"graphics/pokemon/slowpoke/icon.4bpp\");\nconst u8 gMonFootprint_Slowpoke[] = INCBIN_U8(\"graphics/pokemon/slowpoke/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Slowbro[] = INCBIN_U32(\"graphics/pokemon/slowbro/front.4bpp.lz\");\nconst u32 gMonPalette_Slowbro[] = INCBIN_U32(\"graphics/pokemon/slowbro/normal.gbapal.lz\");\nconst u32 gMonBackPic_Slowbro[] = INCBIN_U32(\"graphics/pokemon/slowbro/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Slowbro[] = INCBIN_U32(\"graphics/pokemon/slowbro/shiny.gbapal.lz\");\nconst u8 gMonIcon_Slowbro[] = INCBIN_U8(\"graphics/pokemon/slowbro/icon.4bpp\");\nconst u8 gMonFootprint_Slowbro[] = INCBIN_U8(\"graphics/pokemon/slowbro/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Magnemite[] = INCBIN_U32(\"graphics/pokemon/magnemite/front.4bpp.lz\");\nconst u32 gMonPalette_Magnemite[] = INCBIN_U32(\"graphics/pokemon/magnemite/normal.gbapal.lz\");\nconst u32 gMonBackPic_Magnemite[] = INCBIN_U32(\"graphics/pokemon/magnemite/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Magnemite[] = INCBIN_U32(\"graphics/pokemon/magnemite/shiny.gbapal.lz\");\nconst u8 gMonIcon_Magnemite[] = INCBIN_U8(\"graphics/pokemon/magnemite/icon.4bpp\");\nconst u8 gMonFootprint_Magnemite[] = INCBIN_U8(\"graphics/pokemon/magnemite/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Magneton[] = INCBIN_U32(\"graphics/pokemon/magneton/front.4bpp.lz\");\nconst u32 gMonPalette_Magneton[] = INCBIN_U32(\"graphics/pokemon/magneton/normal.gbapal.lz\");\nconst u32 gMonBackPic_Magneton[] = INCBIN_U32(\"graphics/pokemon/magneton/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Magneton[] = INCBIN_U32(\"graphics/pokemon/magneton/shiny.gbapal.lz\");\nconst u8 gMonIcon_Magneton[] = INCBIN_U8(\"graphics/pokemon/magneton/icon.4bpp\");\nconst u8 gMonFootprint_Magneton[] = INCBIN_U8(\"graphics/pokemon/magneton/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Farfetchd[] = INCBIN_U32(\"graphics/pokemon/farfetchd/front.4bpp.lz\");\nconst u32 gMonPalette_Farfetchd[] = INCBIN_U32(\"graphics/pokemon/farfetchd/normal.gbapal.lz\");\nconst u32 gMonBackPic_Farfetchd[] = INCBIN_U32(\"graphics/pokemon/farfetchd/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Farfetchd[] = INCBIN_U32(\"graphics/pokemon/farfetchd/shiny.gbapal.lz\");\nconst u8 gMonIcon_Farfetchd[] = INCBIN_U8(\"graphics/pokemon/farfetchd/icon.4bpp\");\nconst u8 gMonFootprint_Farfetchd[] = INCBIN_U8(\"graphics/pokemon/farfetchd/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Doduo[] = INCBIN_U32(\"graphics/pokemon/doduo/front.4bpp.lz\");\nconst u32 gMonPalette_Doduo[] = INCBIN_U32(\"graphics/pokemon/doduo/normal.gbapal.lz\");\nconst u32 gMonBackPic_Doduo[] = INCBIN_U32(\"graphics/pokemon/doduo/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Doduo[] = INCBIN_U32(\"graphics/pokemon/doduo/shiny.gbapal.lz\");\nconst u8 gMonIcon_Doduo[] = INCBIN_U8(\"graphics/pokemon/doduo/icon.4bpp\");\nconst u8 gMonFootprint_Doduo[] = INCBIN_U8(\"graphics/pokemon/doduo/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Dodrio[] = INCBIN_U32(\"graphics/pokemon/dodrio/front.4bpp.lz\");\nconst u32 gMonPalette_Dodrio[] = INCBIN_U32(\"graphics/pokemon/dodrio/normal.gbapal.lz\");\nconst u32 gMonBackPic_Dodrio[] = INCBIN_U32(\"graphics/pokemon/dodrio/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Dodrio[] = INCBIN_U32(\"graphics/pokemon/dodrio/shiny.gbapal.lz\");\nconst u8 gMonIcon_Dodrio[] = INCBIN_U8(\"graphics/pokemon/dodrio/icon.4bpp\");\nconst u8 gMonFootprint_Dodrio[] = INCBIN_U8(\"graphics/pokemon/dodrio/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Seel[] = INCBIN_U32(\"graphics/pokemon/seel/front.4bpp.lz\");\nconst u32 gMonPalette_Seel[] = INCBIN_U32(\"graphics/pokemon/seel/normal.gbapal.lz\");\nconst u32 gMonBackPic_Seel[] = INCBIN_U32(\"graphics/pokemon/seel/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Seel[] = INCBIN_U32(\"graphics/pokemon/seel/shiny.gbapal.lz\");\nconst u8 gMonIcon_Seel[] = INCBIN_U8(\"graphics/pokemon/seel/icon.4bpp\");\nconst u8 gMonFootprint_Seel[] = INCBIN_U8(\"graphics/pokemon/seel/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Dewgong[] = INCBIN_U32(\"graphics/pokemon/dewgong/front.4bpp.lz\");\nconst u32 gMonPalette_Dewgong[] = INCBIN_U32(\"graphics/pokemon/dewgong/normal.gbapal.lz\");\nconst u32 gMonBackPic_Dewgong[] = INCBIN_U32(\"graphics/pokemon/dewgong/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Dewgong[] = INCBIN_U32(\"graphics/pokemon/dewgong/shiny.gbapal.lz\");\nconst u8 gMonIcon_Dewgong[] = INCBIN_U8(\"graphics/pokemon/dewgong/icon.4bpp\");\nconst u8 gMonFootprint_Dewgong[] = INCBIN_U8(\"graphics/pokemon/dewgong/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Grimer[] = INCBIN_U32(\"graphics/pokemon/grimer/front.4bpp.lz\");\nconst u32 gMonPalette_Grimer[] = INCBIN_U32(\"graphics/pokemon/grimer/normal.gbapal.lz\");\nconst u32 gMonBackPic_Grimer[] = INCBIN_U32(\"graphics/pokemon/grimer/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Grimer[] = INCBIN_U32(\"graphics/pokemon/grimer/shiny.gbapal.lz\");\nconst u8 gMonIcon_Grimer[] = INCBIN_U8(\"graphics/pokemon/grimer/icon.4bpp\");\nconst u8 gMonFootprint_Grimer[] = INCBIN_U8(\"graphics/pokemon/grimer/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Muk[] = INCBIN_U32(\"graphics/pokemon/muk/front.4bpp.lz\");\nconst u32 gMonPalette_Muk[] = INCBIN_U32(\"graphics/pokemon/muk/normal.gbapal.lz\");\nconst u32 gMonBackPic_Muk[] = INCBIN_U32(\"graphics/pokemon/muk/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Muk[] = INCBIN_U32(\"graphics/pokemon/muk/shiny.gbapal.lz\");\nconst u8 gMonIcon_Muk[] = INCBIN_U8(\"graphics/pokemon/muk/icon.4bpp\");\nconst u8 gMonFootprint_Muk[] = INCBIN_U8(\"graphics/pokemon/muk/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Shellder[] = INCBIN_U32(\"graphics/pokemon/shellder/front.4bpp.lz\");\nconst u32 gMonPalette_Shellder[] = INCBIN_U32(\"graphics/pokemon/shellder/normal.gbapal.lz\");\nconst u32 gMonBackPic_Shellder[] = INCBIN_U32(\"graphics/pokemon/shellder/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Shellder[] = INCBIN_U32(\"graphics/pokemon/shellder/shiny.gbapal.lz\");\nconst u8 gMonIcon_Shellder[] = INCBIN_U8(\"graphics/pokemon/shellder/icon.4bpp\");\nconst u8 gMonFootprint_Shellder[] = INCBIN_U8(\"graphics/pokemon/shellder/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Cloyster[] = INCBIN_U32(\"graphics/pokemon/cloyster/front.4bpp.lz\");\nconst u32 gMonPalette_Cloyster[] = INCBIN_U32(\"graphics/pokemon/cloyster/normal.gbapal.lz\");\nconst u32 gMonBackPic_Cloyster[] = INCBIN_U32(\"graphics/pokemon/cloyster/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Cloyster[] = INCBIN_U32(\"graphics/pokemon/cloyster/shiny.gbapal.lz\");\nconst u8 gMonIcon_Cloyster[] = INCBIN_U8(\"graphics/pokemon/cloyster/icon.4bpp\");\nconst u8 gMonFootprint_Cloyster[] = INCBIN_U8(\"graphics/pokemon/cloyster/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Gastly[] = INCBIN_U32(\"graphics/pokemon/gastly/front.4bpp.lz\");\nconst u32 gMonPalette_Gastly[] = INCBIN_U32(\"graphics/pokemon/gastly/normal.gbapal.lz\");\nconst u32 gMonBackPic_Gastly[] = INCBIN_U32(\"graphics/pokemon/gastly/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Gastly[] = INCBIN_U32(\"graphics/pokemon/gastly/shiny.gbapal.lz\");\nconst u8 gMonIcon_Gastly[] = INCBIN_U8(\"graphics/pokemon/gastly/icon.4bpp\");\nconst u8 gMonFootprint_Gastly[] = INCBIN_U8(\"graphics/pokemon/gastly/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Haunter[] = INCBIN_U32(\"graphics/pokemon/haunter/front.4bpp.lz\");\nconst u32 gMonPalette_Haunter[] = INCBIN_U32(\"graphics/pokemon/haunter/normal.gbapal.lz\");\nconst u32 gMonBackPic_Haunter[] = INCBIN_U32(\"graphics/pokemon/haunter/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Haunter[] = INCBIN_U32(\"graphics/pokemon/haunter/shiny.gbapal.lz\");\nconst u8 gMonIcon_Haunter[] = INCBIN_U8(\"graphics/pokemon/haunter/icon.4bpp\");\nconst u8 gMonFootprint_Haunter[] = INCBIN_U8(\"graphics/pokemon/haunter/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Gengar[] = INCBIN_U32(\"graphics/pokemon/gengar/front.4bpp.lz\");\nconst u32 gMonPalette_Gengar[] = INCBIN_U32(\"graphics/pokemon/gengar/normal.gbapal.lz\");\nconst u32 gMonBackPic_Gengar[] = INCBIN_U32(\"graphics/pokemon/gengar/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Gengar[] = INCBIN_U32(\"graphics/pokemon/gengar/shiny.gbapal.lz\");\nconst u8 gMonIcon_Gengar[] = INCBIN_U8(\"graphics/pokemon/gengar/icon.4bpp\");\nconst u8 gMonFootprint_Gengar[] = INCBIN_U8(\"graphics/pokemon/gengar/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Onix[] = INCBIN_U32(\"graphics/pokemon/onix/front.4bpp.lz\");\nconst u32 gMonPalette_Onix[] = INCBIN_U32(\"graphics/pokemon/onix/normal.gbapal.lz\");\nconst u32 gMonBackPic_Onix[] = INCBIN_U32(\"graphics/pokemon/onix/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Onix[] = INCBIN_U32(\"graphics/pokemon/onix/shiny.gbapal.lz\");\nconst u8 gMonIcon_Onix[] = INCBIN_U8(\"graphics/pokemon/onix/icon.4bpp\");\nconst u8 gMonFootprint_Onix[] = INCBIN_U8(\"graphics/pokemon/onix/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Drowzee[] = INCBIN_U32(\"graphics/pokemon/drowzee/front.4bpp.lz\");\nconst u32 gMonPalette_Drowzee[] = INCBIN_U32(\"graphics/pokemon/drowzee/normal.gbapal.lz\");\nconst u32 gMonBackPic_Drowzee[] = INCBIN_U32(\"graphics/pokemon/drowzee/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Drowzee[] = INCBIN_U32(\"graphics/pokemon/drowzee/shiny.gbapal.lz\");\nconst u8 gMonIcon_Drowzee[] = INCBIN_U8(\"graphics/pokemon/drowzee/icon.4bpp\");\nconst u8 gMonFootprint_Drowzee[] = INCBIN_U8(\"graphics/pokemon/drowzee/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Hypno[] = INCBIN_U32(\"graphics/pokemon/hypno/front.4bpp.lz\");\nconst u32 gMonPalette_Hypno[] = INCBIN_U32(\"graphics/pokemon/hypno/normal.gbapal.lz\");\nconst u32 gMonBackPic_Hypno[] = INCBIN_U32(\"graphics/pokemon/hypno/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Hypno[] = INCBIN_U32(\"graphics/pokemon/hypno/shiny.gbapal.lz\");\nconst u8 gMonIcon_Hypno[] = INCBIN_U8(\"graphics/pokemon/hypno/icon.4bpp\");\nconst u8 gMonFootprint_Hypno[] = INCBIN_U8(\"graphics/pokemon/hypno/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Krabby[] = INCBIN_U32(\"graphics/pokemon/krabby/front.4bpp.lz\");\nconst u32 gMonPalette_Krabby[] = INCBIN_U32(\"graphics/pokemon/krabby/normal.gbapal.lz\");\nconst u32 gMonBackPic_Krabby[] = INCBIN_U32(\"graphics/pokemon/krabby/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Krabby[] = INCBIN_U32(\"graphics/pokemon/krabby/shiny.gbapal.lz\");\nconst u8 gMonIcon_Krabby[] = INCBIN_U8(\"graphics/pokemon/krabby/icon.4bpp\");\nconst u8 gMonFootprint_Krabby[] = INCBIN_U8(\"graphics/pokemon/krabby/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Kingler[] = INCBIN_U32(\"graphics/pokemon/kingler/front.4bpp.lz\");\nconst u32 gMonPalette_Kingler[] = INCBIN_U32(\"graphics/pokemon/kingler/normal.gbapal.lz\");\nconst u32 gMonBackPic_Kingler[] = INCBIN_U32(\"graphics/pokemon/kingler/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Kingler[] = INCBIN_U32(\"graphics/pokemon/kingler/shiny.gbapal.lz\");\nconst u8 gMonIcon_Kingler[] = INCBIN_U8(\"graphics/pokemon/kingler/icon.4bpp\");\nconst u8 gMonFootprint_Kingler[] = INCBIN_U8(\"graphics/pokemon/kingler/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Voltorb[] = INCBIN_U32(\"graphics/pokemon/voltorb/front.4bpp.lz\");\nconst u32 gMonPalette_Voltorb[] = INCBIN_U32(\"graphics/pokemon/voltorb/normal.gbapal.lz\");\nconst u32 gMonBackPic_Voltorb[] = INCBIN_U32(\"graphics/pokemon/voltorb/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Voltorb[] = INCBIN_U32(\"graphics/pokemon/voltorb/shiny.gbapal.lz\");\nconst u8 gMonIcon_Voltorb[] = INCBIN_U8(\"graphics/pokemon/voltorb/icon.4bpp\");\nconst u8 gMonFootprint_Voltorb[] = INCBIN_U8(\"graphics/pokemon/voltorb/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Electrode[] = INCBIN_U32(\"graphics/pokemon/electrode/front.4bpp.lz\");\nconst u32 gMonPalette_Electrode[] = INCBIN_U32(\"graphics/pokemon/electrode/normal.gbapal.lz\");\nconst u32 gMonBackPic_Electrode[] = INCBIN_U32(\"graphics/pokemon/electrode/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Electrode[] = INCBIN_U32(\"graphics/pokemon/electrode/shiny.gbapal.lz\");\nconst u8 gMonIcon_Electrode[] = INCBIN_U8(\"graphics/pokemon/electrode/icon.4bpp\");\nconst u8 gMonFootprint_Electrode[] = INCBIN_U8(\"graphics/pokemon/electrode/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Exeggcute[] = INCBIN_U32(\"graphics/pokemon/exeggcute/front.4bpp.lz\");\nconst u32 gMonPalette_Exeggcute[] = INCBIN_U32(\"graphics/pokemon/exeggcute/normal.gbapal.lz\");\nconst u32 gMonBackPic_Exeggcute[] = INCBIN_U32(\"graphics/pokemon/exeggcute/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Exeggcute[] = INCBIN_U32(\"graphics/pokemon/exeggcute/shiny.gbapal.lz\");\nconst u8 gMonIcon_Exeggcute[] = INCBIN_U8(\"graphics/pokemon/exeggcute/icon.4bpp\");\nconst u8 gMonFootprint_Exeggcute[] = INCBIN_U8(\"graphics/pokemon/exeggcute/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Exeggutor[] = INCBIN_U32(\"graphics/pokemon/exeggutor/front.4bpp.lz\");\nconst u32 gMonPalette_Exeggutor[] = INCBIN_U32(\"graphics/pokemon/exeggutor/normal.gbapal.lz\");\nconst u32 gMonBackPic_Exeggutor[] = INCBIN_U32(\"graphics/pokemon/exeggutor/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Exeggutor[] = INCBIN_U32(\"graphics/pokemon/exeggutor/shiny.gbapal.lz\");\nconst u8 gMonIcon_Exeggutor[] = INCBIN_U8(\"graphics/pokemon/exeggutor/icon.4bpp\");\nconst u8 gMonFootprint_Exeggutor[] = INCBIN_U8(\"graphics/pokemon/exeggutor/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Cubone[] = INCBIN_U32(\"graphics/pokemon/cubone/front.4bpp.lz\");\nconst u32 gMonPalette_Cubone[] = INCBIN_U32(\"graphics/pokemon/cubone/normal.gbapal.lz\");\nconst u32 gMonBackPic_Cubone[] = INCBIN_U32(\"graphics/pokemon/cubone/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Cubone[] = INCBIN_U32(\"graphics/pokemon/cubone/shiny.gbapal.lz\");\nconst u8 gMonIcon_Cubone[] = INCBIN_U8(\"graphics/pokemon/cubone/icon.4bpp\");\nconst u8 gMonFootprint_Cubone[] = INCBIN_U8(\"graphics/pokemon/cubone/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Marowak[] = INCBIN_U32(\"graphics/pokemon/marowak/front.4bpp.lz\");\nconst u32 gMonPalette_Marowak[] = INCBIN_U32(\"graphics/pokemon/marowak/normal.gbapal.lz\");\nconst u32 gMonBackPic_Marowak[] = INCBIN_U32(\"graphics/pokemon/marowak/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Marowak[] = INCBIN_U32(\"graphics/pokemon/marowak/shiny.gbapal.lz\");\nconst u8 gMonIcon_Marowak[] = INCBIN_U8(\"graphics/pokemon/marowak/icon.4bpp\");\nconst u8 gMonFootprint_Marowak[] = INCBIN_U8(\"graphics/pokemon/marowak/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Hitmonlee[] = INCBIN_U32(\"graphics/pokemon/hitmonlee/front.4bpp.lz\");\nconst u32 gMonPalette_Hitmonlee[] = INCBIN_U32(\"graphics/pokemon/hitmonlee/normal.gbapal.lz\");\nconst u32 gMonBackPic_Hitmonlee[] = INCBIN_U32(\"graphics/pokemon/hitmonlee/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Hitmonlee[] = INCBIN_U32(\"graphics/pokemon/hitmonlee/shiny.gbapal.lz\");\nconst u8 gMonIcon_Hitmonlee[] = INCBIN_U8(\"graphics/pokemon/hitmonlee/icon.4bpp\");\nconst u8 gMonFootprint_Hitmonlee[] = INCBIN_U8(\"graphics/pokemon/hitmonlee/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Hitmonchan[] = INCBIN_U32(\"graphics/pokemon/hitmonchan/front.4bpp.lz\");\nconst u32 gMonPalette_Hitmonchan[] = INCBIN_U32(\"graphics/pokemon/hitmonchan/normal.gbapal.lz\");\nconst u32 gMonBackPic_Hitmonchan[] = INCBIN_U32(\"graphics/pokemon/hitmonchan/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Hitmonchan[] = INCBIN_U32(\"graphics/pokemon/hitmonchan/shiny.gbapal.lz\");\nconst u8 gMonIcon_Hitmonchan[] = INCBIN_U8(\"graphics/pokemon/hitmonchan/icon.4bpp\");\nconst u8 gMonFootprint_Hitmonchan[] = INCBIN_U8(\"graphics/pokemon/hitmonchan/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Lickitung[] = INCBIN_U32(\"graphics/pokemon/lickitung/front.4bpp.lz\");\nconst u32 gMonPalette_Lickitung[] = INCBIN_U32(\"graphics/pokemon/lickitung/normal.gbapal.lz\");\nconst u32 gMonBackPic_Lickitung[] = INCBIN_U32(\"graphics/pokemon/lickitung/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Lickitung[] = INCBIN_U32(\"graphics/pokemon/lickitung/shiny.gbapal.lz\");\nconst u8 gMonIcon_Lickitung[] = INCBIN_U8(\"graphics/pokemon/lickitung/icon.4bpp\");\nconst u8 gMonFootprint_Lickitung[] = INCBIN_U8(\"graphics/pokemon/lickitung/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Koffing[] = INCBIN_U32(\"graphics/pokemon/koffing/front.4bpp.lz\");\nconst u32 gMonPalette_Koffing[] = INCBIN_U32(\"graphics/pokemon/koffing/normal.gbapal.lz\");\nconst u32 gMonBackPic_Koffing[] = INCBIN_U32(\"graphics/pokemon/koffing/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Koffing[] = INCBIN_U32(\"graphics/pokemon/koffing/shiny.gbapal.lz\");\nconst u8 gMonIcon_Koffing[] = INCBIN_U8(\"graphics/pokemon/koffing/icon.4bpp\");\nconst u8 gMonFootprint_Koffing[] = INCBIN_U8(\"graphics/pokemon/koffing/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Weezing[] = INCBIN_U32(\"graphics/pokemon/weezing/front.4bpp.lz\");\nconst u32 gMonPalette_Weezing[] = INCBIN_U32(\"graphics/pokemon/weezing/normal.gbapal.lz\");\nconst u32 gMonBackPic_Weezing[] = INCBIN_U32(\"graphics/pokemon/weezing/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Weezing[] = INCBIN_U32(\"graphics/pokemon/weezing/shiny.gbapal.lz\");\nconst u8 gMonIcon_Weezing[] = INCBIN_U8(\"graphics/pokemon/weezing/icon.4bpp\");\nconst u8 gMonFootprint_Weezing[] = INCBIN_U8(\"graphics/pokemon/weezing/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Rhyhorn[] = INCBIN_U32(\"graphics/pokemon/rhyhorn/front.4bpp.lz\");\nconst u32 gMonPalette_Rhyhorn[] = INCBIN_U32(\"graphics/pokemon/rhyhorn/normal.gbapal.lz\");\nconst u32 gMonBackPic_Rhyhorn[] = INCBIN_U32(\"graphics/pokemon/rhyhorn/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Rhyhorn[] = INCBIN_U32(\"graphics/pokemon/rhyhorn/shiny.gbapal.lz\");\nconst u8 gMonIcon_Rhyhorn[] = INCBIN_U8(\"graphics/pokemon/rhyhorn/icon.4bpp\");\nconst u8 gMonFootprint_Rhyhorn[] = INCBIN_U8(\"graphics/pokemon/rhyhorn/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Rhydon[] = INCBIN_U32(\"graphics/pokemon/rhydon/front.4bpp.lz\");\nconst u32 gMonPalette_Rhydon[] = INCBIN_U32(\"graphics/pokemon/rhydon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Rhydon[] = INCBIN_U32(\"graphics/pokemon/rhydon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Rhydon[] = INCBIN_U32(\"graphics/pokemon/rhydon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Rhydon[] = INCBIN_U8(\"graphics/pokemon/rhydon/icon.4bpp\");\nconst u8 gMonFootprint_Rhydon[] = INCBIN_U8(\"graphics/pokemon/rhydon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Chansey[] = INCBIN_U32(\"graphics/pokemon/chansey/front.4bpp.lz\");\nconst u32 gMonPalette_Chansey[] = INCBIN_U32(\"graphics/pokemon/chansey/normal.gbapal.lz\");\nconst u32 gMonBackPic_Chansey[] = INCBIN_U32(\"graphics/pokemon/chansey/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Chansey[] = INCBIN_U32(\"graphics/pokemon/chansey/shiny.gbapal.lz\");\nconst u8 gMonIcon_Chansey[] = INCBIN_U8(\"graphics/pokemon/chansey/icon.4bpp\");\nconst u8 gMonFootprint_Chansey[] = INCBIN_U8(\"graphics/pokemon/chansey/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Tangela[] = INCBIN_U32(\"graphics/pokemon/tangela/front.4bpp.lz\");\nconst u32 gMonPalette_Tangela[] = INCBIN_U32(\"graphics/pokemon/tangela/normal.gbapal.lz\");\nconst u32 gMonBackPic_Tangela[] = INCBIN_U32(\"graphics/pokemon/tangela/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Tangela[] = INCBIN_U32(\"graphics/pokemon/tangela/shiny.gbapal.lz\");\nconst u8 gMonIcon_Tangela[] = INCBIN_U8(\"graphics/pokemon/tangela/icon.4bpp\");\nconst u8 gMonFootprint_Tangela[] = INCBIN_U8(\"graphics/pokemon/tangela/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Kangaskhan[] = INCBIN_U32(\"graphics/pokemon/kangaskhan/front.4bpp.lz\");\nconst u32 gMonPalette_Kangaskhan[] = INCBIN_U32(\"graphics/pokemon/kangaskhan/normal.gbapal.lz\");\nconst u32 gMonBackPic_Kangaskhan[] = INCBIN_U32(\"graphics/pokemon/kangaskhan/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Kangaskhan[] = INCBIN_U32(\"graphics/pokemon/kangaskhan/shiny.gbapal.lz\");\nconst u8 gMonIcon_Kangaskhan[] = INCBIN_U8(\"graphics/pokemon/kangaskhan/icon.4bpp\");\nconst u8 gMonFootprint_Kangaskhan[] = INCBIN_U8(\"graphics/pokemon/kangaskhan/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Horsea[] = INCBIN_U32(\"graphics/pokemon/horsea/front.4bpp.lz\");\nconst u32 gMonPalette_Horsea[] = INCBIN_U32(\"graphics/pokemon/horsea/normal.gbapal.lz\");\nconst u32 gMonBackPic_Horsea[] = INCBIN_U32(\"graphics/pokemon/horsea/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Horsea[] = INCBIN_U32(\"graphics/pokemon/horsea/shiny.gbapal.lz\");\nconst u8 gMonIcon_Horsea[] = INCBIN_U8(\"graphics/pokemon/horsea/icon.4bpp\");\nconst u8 gMonFootprint_Horsea[] = INCBIN_U8(\"graphics/pokemon/horsea/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Seadra[] = INCBIN_U32(\"graphics/pokemon/seadra/front.4bpp.lz\");\nconst u32 gMonPalette_Seadra[] = INCBIN_U32(\"graphics/pokemon/seadra/normal.gbapal.lz\");\nconst u32 gMonBackPic_Seadra[] = INCBIN_U32(\"graphics/pokemon/seadra/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Seadra[] = INCBIN_U32(\"graphics/pokemon/seadra/shiny.gbapal.lz\");\nconst u8 gMonIcon_Seadra[] = INCBIN_U8(\"graphics/pokemon/seadra/icon.4bpp\");\nconst u8 gMonFootprint_Seadra[] = INCBIN_U8(\"graphics/pokemon/seadra/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Goldeen[] = INCBIN_U32(\"graphics/pokemon/goldeen/front.4bpp.lz\");\nconst u32 gMonPalette_Goldeen[] = INCBIN_U32(\"graphics/pokemon/goldeen/normal.gbapal.lz\");\nconst u32 gMonBackPic_Goldeen[] = INCBIN_U32(\"graphics/pokemon/goldeen/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Goldeen[] = INCBIN_U32(\"graphics/pokemon/goldeen/shiny.gbapal.lz\");\nconst u8 gMonIcon_Goldeen[] = INCBIN_U8(\"graphics/pokemon/goldeen/icon.4bpp\");\nconst u8 gMonFootprint_Goldeen[] = INCBIN_U8(\"graphics/pokemon/goldeen/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Seaking[] = INCBIN_U32(\"graphics/pokemon/seaking/front.4bpp.lz\");\nconst u32 gMonPalette_Seaking[] = INCBIN_U32(\"graphics/pokemon/seaking/normal.gbapal.lz\");\nconst u32 gMonBackPic_Seaking[] = INCBIN_U32(\"graphics/pokemon/seaking/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Seaking[] = INCBIN_U32(\"graphics/pokemon/seaking/shiny.gbapal.lz\");\nconst u8 gMonIcon_Seaking[] = INCBIN_U8(\"graphics/pokemon/seaking/icon.4bpp\");\nconst u8 gMonFootprint_Seaking[] = INCBIN_U8(\"graphics/pokemon/seaking/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Staryu[] = INCBIN_U32(\"graphics/pokemon/staryu/front.4bpp.lz\");\nconst u32 gMonPalette_Staryu[] = INCBIN_U32(\"graphics/pokemon/staryu/normal.gbapal.lz\");\nconst u32 gMonBackPic_Staryu[] = INCBIN_U32(\"graphics/pokemon/staryu/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Staryu[] = INCBIN_U32(\"graphics/pokemon/staryu/shiny.gbapal.lz\");\nconst u8 gMonIcon_Staryu[] = INCBIN_U8(\"graphics/pokemon/staryu/icon.4bpp\");\nconst u8 gMonFootprint_Staryu[] = INCBIN_U8(\"graphics/pokemon/staryu/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Starmie[] = INCBIN_U32(\"graphics/pokemon/starmie/front.4bpp.lz\");\nconst u32 gMonPalette_Starmie[] = INCBIN_U32(\"graphics/pokemon/starmie/normal.gbapal.lz\");\nconst u32 gMonBackPic_Starmie[] = INCBIN_U32(\"graphics/pokemon/starmie/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Starmie[] = INCBIN_U32(\"graphics/pokemon/starmie/shiny.gbapal.lz\");\nconst u8 gMonIcon_Starmie[] = INCBIN_U8(\"graphics/pokemon/starmie/icon.4bpp\");\nconst u8 gMonFootprint_Starmie[] = INCBIN_U8(\"graphics/pokemon/starmie/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Mrmime[] = INCBIN_U32(\"graphics/pokemon/mr_mime/front.4bpp.lz\");\nconst u32 gMonPalette_Mrmime[] = INCBIN_U32(\"graphics/pokemon/mr_mime/normal.gbapal.lz\");\nconst u32 gMonBackPic_Mrmime[] = INCBIN_U32(\"graphics/pokemon/mr_mime/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Mrmime[] = INCBIN_U32(\"graphics/pokemon/mr_mime/shiny.gbapal.lz\");\nconst u8 gMonIcon_Mrmime[] = INCBIN_U8(\"graphics/pokemon/mr_mime/icon.4bpp\");\nconst u8 gMonFootprint_Mrmime[] = INCBIN_U8(\"graphics/pokemon/mr_mime/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Scyther[] = INCBIN_U32(\"graphics/pokemon/scyther/front.4bpp.lz\");\nconst u32 gMonPalette_Scyther[] = INCBIN_U32(\"graphics/pokemon/scyther/normal.gbapal.lz\");\nconst u32 gMonBackPic_Scyther[] = INCBIN_U32(\"graphics/pokemon/scyther/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Scyther[] = INCBIN_U32(\"graphics/pokemon/scyther/shiny.gbapal.lz\");\nconst u8 gMonIcon_Scyther[] = INCBIN_U8(\"graphics/pokemon/scyther/icon.4bpp\");\nconst u8 gMonFootprint_Scyther[] = INCBIN_U8(\"graphics/pokemon/scyther/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Jynx[] = INCBIN_U32(\"graphics/pokemon/jynx/front.4bpp.lz\");\nconst u32 gMonPalette_Jynx[] = INCBIN_U32(\"graphics/pokemon/jynx/normal.gbapal.lz\");\nconst u32 gMonBackPic_Jynx[] = INCBIN_U32(\"graphics/pokemon/jynx/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Jynx[] = INCBIN_U32(\"graphics/pokemon/jynx/shiny.gbapal.lz\");\nconst u8 gMonIcon_Jynx[] = INCBIN_U8(\"graphics/pokemon/jynx/icon.4bpp\");\nconst u8 gMonFootprint_Jynx[] = INCBIN_U8(\"graphics/pokemon/jynx/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Electabuzz[] = INCBIN_U32(\"graphics/pokemon/electabuzz/front.4bpp.lz\");\nconst u32 gMonPalette_Electabuzz[] = INCBIN_U32(\"graphics/pokemon/electabuzz/normal.gbapal.lz\");\nconst u32 gMonBackPic_Electabuzz[] = INCBIN_U32(\"graphics/pokemon/electabuzz/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Electabuzz[] = INCBIN_U32(\"graphics/pokemon/electabuzz/shiny.gbapal.lz\");\nconst u8 gMonIcon_Electabuzz[] = INCBIN_U8(\"graphics/pokemon/electabuzz/icon.4bpp\");\nconst u8 gMonFootprint_Electabuzz[] = INCBIN_U8(\"graphics/pokemon/electabuzz/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Magmar[] = INCBIN_U32(\"graphics/pokemon/magmar/front.4bpp.lz\");\nconst u32 gMonPalette_Magmar[] = INCBIN_U32(\"graphics/pokemon/magmar/normal.gbapal.lz\");\nconst u32 gMonBackPic_Magmar[] = INCBIN_U32(\"graphics/pokemon/magmar/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Magmar[] = INCBIN_U32(\"graphics/pokemon/magmar/shiny.gbapal.lz\");\nconst u8 gMonIcon_Magmar[] = INCBIN_U8(\"graphics/pokemon/magmar/icon.4bpp\");\nconst u8 gMonFootprint_Magmar[] = INCBIN_U8(\"graphics/pokemon/magmar/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Pinsir[] = INCBIN_U32(\"graphics/pokemon/pinsir/front.4bpp.lz\");\nconst u32 gMonPalette_Pinsir[] = INCBIN_U32(\"graphics/pokemon/pinsir/normal.gbapal.lz\");\nconst u32 gMonBackPic_Pinsir[] = INCBIN_U32(\"graphics/pokemon/pinsir/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Pinsir[] = INCBIN_U32(\"graphics/pokemon/pinsir/shiny.gbapal.lz\");\nconst u8 gMonIcon_Pinsir[] = INCBIN_U8(\"graphics/pokemon/pinsir/icon.4bpp\");\nconst u8 gMonFootprint_Pinsir[] = INCBIN_U8(\"graphics/pokemon/pinsir/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Tauros[] = INCBIN_U32(\"graphics/pokemon/tauros/front.4bpp.lz\");\nconst u32 gMonPalette_Tauros[] = INCBIN_U32(\"graphics/pokemon/tauros/normal.gbapal.lz\");\nconst u32 gMonBackPic_Tauros[] = INCBIN_U32(\"graphics/pokemon/tauros/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Tauros[] = INCBIN_U32(\"graphics/pokemon/tauros/shiny.gbapal.lz\");\nconst u8 gMonIcon_Tauros[] = INCBIN_U8(\"graphics/pokemon/tauros/icon.4bpp\");\nconst u8 gMonFootprint_Tauros[] = INCBIN_U8(\"graphics/pokemon/tauros/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Magikarp[] = INCBIN_U32(\"graphics/pokemon/magikarp/front.4bpp.lz\");\nconst u32 gMonPalette_Magikarp[] = INCBIN_U32(\"graphics/pokemon/magikarp/normal.gbapal.lz\");\nconst u32 gMonBackPic_Magikarp[] = INCBIN_U32(\"graphics/pokemon/magikarp/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Magikarp[] = INCBIN_U32(\"graphics/pokemon/magikarp/shiny.gbapal.lz\");\nconst u8 gMonIcon_Magikarp[] = INCBIN_U8(\"graphics/pokemon/magikarp/icon.4bpp\");\nconst u8 gMonFootprint_Magikarp[] = INCBIN_U8(\"graphics/pokemon/magikarp/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Gyarados[] = INCBIN_U32(\"graphics/pokemon/gyarados/front.4bpp.lz\");\nconst u32 gMonPalette_Gyarados[] = INCBIN_U32(\"graphics/pokemon/gyarados/normal.gbapal.lz\");\nconst u32 gMonBackPic_Gyarados[] = INCBIN_U32(\"graphics/pokemon/gyarados/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Gyarados[] = INCBIN_U32(\"graphics/pokemon/gyarados/shiny.gbapal.lz\");\nconst u8 gMonIcon_Gyarados[] = INCBIN_U8(\"graphics/pokemon/gyarados/icon.4bpp\");\nconst u8 gMonFootprint_Gyarados[] = INCBIN_U8(\"graphics/pokemon/gyarados/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Lapras[] = INCBIN_U32(\"graphics/pokemon/lapras/front.4bpp.lz\");\nconst u32 gMonPalette_Lapras[] = INCBIN_U32(\"graphics/pokemon/lapras/normal.gbapal.lz\");\nconst u32 gMonBackPic_Lapras[] = INCBIN_U32(\"graphics/pokemon/lapras/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Lapras[] = INCBIN_U32(\"graphics/pokemon/lapras/shiny.gbapal.lz\");\nconst u8 gMonIcon_Lapras[] = INCBIN_U8(\"graphics/pokemon/lapras/icon.4bpp\");\nconst u8 gMonFootprint_Lapras[] = INCBIN_U8(\"graphics/pokemon/lapras/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ditto[] = INCBIN_U32(\"graphics/pokemon/ditto/front.4bpp.lz\");\nconst u32 gMonPalette_Ditto[] = INCBIN_U32(\"graphics/pokemon/ditto/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ditto[] = INCBIN_U32(\"graphics/pokemon/ditto/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ditto[] = INCBIN_U32(\"graphics/pokemon/ditto/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ditto[] = INCBIN_U8(\"graphics/pokemon/ditto/icon.4bpp\");\nconst u8 gMonFootprint_Ditto[] = INCBIN_U8(\"graphics/pokemon/ditto/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Eevee[] = INCBIN_U32(\"graphics/pokemon/eevee/front.4bpp.lz\");\nconst u32 gMonPalette_Eevee[] = INCBIN_U32(\"graphics/pokemon/eevee/normal.gbapal.lz\");\nconst u32 gMonBackPic_Eevee[] = INCBIN_U32(\"graphics/pokemon/eevee/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Eevee[] = INCBIN_U32(\"graphics/pokemon/eevee/shiny.gbapal.lz\");\nconst u8 gMonIcon_Eevee[] = INCBIN_U8(\"graphics/pokemon/eevee/icon.4bpp\");\nconst u8 gMonFootprint_Eevee[] = INCBIN_U8(\"graphics/pokemon/eevee/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Vaporeon[] = INCBIN_U32(\"graphics/pokemon/vaporeon/front.4bpp.lz\");\nconst u32 gMonPalette_Vaporeon[] = INCBIN_U32(\"graphics/pokemon/vaporeon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Vaporeon[] = INCBIN_U32(\"graphics/pokemon/vaporeon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Vaporeon[] = INCBIN_U32(\"graphics/pokemon/vaporeon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Vaporeon[] = INCBIN_U8(\"graphics/pokemon/vaporeon/icon.4bpp\");\nconst u8 gMonFootprint_Vaporeon[] = INCBIN_U8(\"graphics/pokemon/vaporeon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Jolteon[] = INCBIN_U32(\"graphics/pokemon/jolteon/front.4bpp.lz\");\nconst u32 gMonPalette_Jolteon[] = INCBIN_U32(\"graphics/pokemon/jolteon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Jolteon[] = INCBIN_U32(\"graphics/pokemon/jolteon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Jolteon[] = INCBIN_U32(\"graphics/pokemon/jolteon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Jolteon[] = INCBIN_U8(\"graphics/pokemon/jolteon/icon.4bpp\");\nconst u8 gMonFootprint_Jolteon[] = INCBIN_U8(\"graphics/pokemon/jolteon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Flareon[] = INCBIN_U32(\"graphics/pokemon/flareon/front.4bpp.lz\");\nconst u32 gMonPalette_Flareon[] = INCBIN_U32(\"graphics/pokemon/flareon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Flareon[] = INCBIN_U32(\"graphics/pokemon/flareon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Flareon[] = INCBIN_U32(\"graphics/pokemon/flareon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Flareon[] = INCBIN_U8(\"graphics/pokemon/flareon/icon.4bpp\");\nconst u8 gMonFootprint_Flareon[] = INCBIN_U8(\"graphics/pokemon/flareon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Porygon[] = INCBIN_U32(\"graphics/pokemon/porygon/front.4bpp.lz\");\nconst u32 gMonPalette_Porygon[] = INCBIN_U32(\"graphics/pokemon/porygon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Porygon[] = INCBIN_U32(\"graphics/pokemon/porygon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Porygon[] = INCBIN_U32(\"graphics/pokemon/porygon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Porygon[] = INCBIN_U8(\"graphics/pokemon/porygon/icon.4bpp\");\nconst u8 gMonFootprint_Porygon[] = INCBIN_U8(\"graphics/pokemon/porygon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Omanyte[] = INCBIN_U32(\"graphics/pokemon/omanyte/front.4bpp.lz\");\nconst u32 gMonPalette_Omanyte[] = INCBIN_U32(\"graphics/pokemon/omanyte/normal.gbapal.lz\");\nconst u32 gMonBackPic_Omanyte[] = INCBIN_U32(\"graphics/pokemon/omanyte/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Omanyte[] = INCBIN_U32(\"graphics/pokemon/omanyte/shiny.gbapal.lz\");\nconst u8 gMonIcon_Omanyte[] = INCBIN_U8(\"graphics/pokemon/omanyte/icon.4bpp\");\nconst u8 gMonFootprint_Omanyte[] = INCBIN_U8(\"graphics/pokemon/omanyte/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Omastar[] = INCBIN_U32(\"graphics/pokemon/omastar/front.4bpp.lz\");\nconst u32 gMonPalette_Omastar[] = INCBIN_U32(\"graphics/pokemon/omastar/normal.gbapal.lz\");\nconst u32 gMonBackPic_Omastar[] = INCBIN_U32(\"graphics/pokemon/omastar/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Omastar[] = INCBIN_U32(\"graphics/pokemon/omastar/shiny.gbapal.lz\");\nconst u8 gMonIcon_Omastar[] = INCBIN_U8(\"graphics/pokemon/omastar/icon.4bpp\");\nconst u8 gMonFootprint_Omastar[] = INCBIN_U8(\"graphics/pokemon/omastar/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Kabuto[] = INCBIN_U32(\"graphics/pokemon/kabuto/front.4bpp.lz\");\nconst u32 gMonPalette_Kabuto[] = INCBIN_U32(\"graphics/pokemon/kabuto/normal.gbapal.lz\");\nconst u32 gMonBackPic_Kabuto[] = INCBIN_U32(\"graphics/pokemon/kabuto/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Kabuto[] = INCBIN_U32(\"graphics/pokemon/kabuto/shiny.gbapal.lz\");\nconst u8 gMonIcon_Kabuto[] = INCBIN_U8(\"graphics/pokemon/kabuto/icon.4bpp\");\nconst u8 gMonFootprint_Kabuto[] = INCBIN_U8(\"graphics/pokemon/kabuto/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Kabutops[] = INCBIN_U32(\"graphics/pokemon/kabutops/front.4bpp.lz\");\nconst u32 gMonPalette_Kabutops[] = INCBIN_U32(\"graphics/pokemon/kabutops/normal.gbapal.lz\");\nconst u32 gMonBackPic_Kabutops[] = INCBIN_U32(\"graphics/pokemon/kabutops/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Kabutops[] = INCBIN_U32(\"graphics/pokemon/kabutops/shiny.gbapal.lz\");\nconst u8 gMonIcon_Kabutops[] = INCBIN_U8(\"graphics/pokemon/kabutops/icon.4bpp\");\nconst u8 gMonFootprint_Kabutops[] = INCBIN_U8(\"graphics/pokemon/kabutops/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Aerodactyl[] = INCBIN_U32(\"graphics/pokemon/aerodactyl/front.4bpp.lz\");\nconst u32 gMonPalette_Aerodactyl[] = INCBIN_U32(\"graphics/pokemon/aerodactyl/normal.gbapal.lz\");\nconst u32 gMonBackPic_Aerodactyl[] = INCBIN_U32(\"graphics/pokemon/aerodactyl/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Aerodactyl[] = INCBIN_U32(\"graphics/pokemon/aerodactyl/shiny.gbapal.lz\");\nconst u8 gMonIcon_Aerodactyl[] = INCBIN_U8(\"graphics/pokemon/aerodactyl/icon.4bpp\");\nconst u8 gMonFootprint_Aerodactyl[] = INCBIN_U8(\"graphics/pokemon/aerodactyl/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Snorlax[] = INCBIN_U32(\"graphics/pokemon/snorlax/front.4bpp.lz\");\nconst u32 gMonPalette_Snorlax[] = INCBIN_U32(\"graphics/pokemon/snorlax/normal.gbapal.lz\");\nconst u32 gMonBackPic_Snorlax[] = INCBIN_U32(\"graphics/pokemon/snorlax/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Snorlax[] = INCBIN_U32(\"graphics/pokemon/snorlax/shiny.gbapal.lz\");\nconst u8 gMonIcon_Snorlax[] = INCBIN_U8(\"graphics/pokemon/snorlax/icon.4bpp\");\nconst u8 gMonFootprint_Snorlax[] = INCBIN_U8(\"graphics/pokemon/snorlax/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Articuno[] = INCBIN_U32(\"graphics/pokemon/articuno/front.4bpp.lz\");\nconst u32 gMonPalette_Articuno[] = INCBIN_U32(\"graphics/pokemon/articuno/normal.gbapal.lz\");\nconst u32 gMonBackPic_Articuno[] = INCBIN_U32(\"graphics/pokemon/articuno/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Articuno[] = INCBIN_U32(\"graphics/pokemon/articuno/shiny.gbapal.lz\");\nconst u8 gMonIcon_Articuno[] = INCBIN_U8(\"graphics/pokemon/articuno/icon.4bpp\");\nconst u8 gMonFootprint_Articuno[] = INCBIN_U8(\"graphics/pokemon/articuno/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Zapdos[] = INCBIN_U32(\"graphics/pokemon/zapdos/front.4bpp.lz\");\nconst u32 gMonPalette_Zapdos[] = INCBIN_U32(\"graphics/pokemon/zapdos/normal.gbapal.lz\");\nconst u32 gMonBackPic_Zapdos[] = INCBIN_U32(\"graphics/pokemon/zapdos/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Zapdos[] = INCBIN_U32(\"graphics/pokemon/zapdos/shiny.gbapal.lz\");\nconst u8 gMonIcon_Zapdos[] = INCBIN_U8(\"graphics/pokemon/zapdos/icon.4bpp\");\nconst u8 gMonFootprint_Zapdos[] = INCBIN_U8(\"graphics/pokemon/zapdos/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Moltres[] = INCBIN_U32(\"graphics/pokemon/moltres/front.4bpp.lz\");\nconst u32 gMonPalette_Moltres[] = INCBIN_U32(\"graphics/pokemon/moltres/normal.gbapal.lz\");\nconst u32 gMonBackPic_Moltres[] = INCBIN_U32(\"graphics/pokemon/moltres/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Moltres[] = INCBIN_U32(\"graphics/pokemon/moltres/shiny.gbapal.lz\");\nconst u8 gMonIcon_Moltres[] = INCBIN_U8(\"graphics/pokemon/moltres/icon.4bpp\");\nconst u8 gMonFootprint_Moltres[] = INCBIN_U8(\"graphics/pokemon/moltres/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Dratini[] = INCBIN_U32(\"graphics/pokemon/dratini/front.4bpp.lz\");\nconst u32 gMonPalette_Dratini[] = INCBIN_U32(\"graphics/pokemon/dratini/normal.gbapal.lz\");\nconst u32 gMonBackPic_Dratini[] = INCBIN_U32(\"graphics/pokemon/dratini/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Dratini[] = INCBIN_U32(\"graphics/pokemon/dratini/shiny.gbapal.lz\");\nconst u8 gMonIcon_Dratini[] = INCBIN_U8(\"graphics/pokemon/dratini/icon.4bpp\");\nconst u8 gMonFootprint_Dratini[] = INCBIN_U8(\"graphics/pokemon/dratini/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Dragonair[] = INCBIN_U32(\"graphics/pokemon/dragonair/front.4bpp.lz\");\nconst u32 gMonPalette_Dragonair[] = INCBIN_U32(\"graphics/pokemon/dragonair/normal.gbapal.lz\");\nconst u32 gMonBackPic_Dragonair[] = INCBIN_U32(\"graphics/pokemon/dragonair/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Dragonair[] = INCBIN_U32(\"graphics/pokemon/dragonair/shiny.gbapal.lz\");\nconst u8 gMonIcon_Dragonair[] = INCBIN_U8(\"graphics/pokemon/dragonair/icon.4bpp\");\nconst u8 gMonFootprint_Dragonair[] = INCBIN_U8(\"graphics/pokemon/dragonair/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Dragonite[] = INCBIN_U32(\"graphics/pokemon/dragonite/front.4bpp.lz\");\nconst u32 gMonPalette_Dragonite[] = INCBIN_U32(\"graphics/pokemon/dragonite/normal.gbapal.lz\");\nconst u32 gMonBackPic_Dragonite[] = INCBIN_U32(\"graphics/pokemon/dragonite/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Dragonite[] = INCBIN_U32(\"graphics/pokemon/dragonite/shiny.gbapal.lz\");\nconst u8 gMonIcon_Dragonite[] = INCBIN_U8(\"graphics/pokemon/dragonite/icon.4bpp\");\nconst u8 gMonFootprint_Dragonite[] = INCBIN_U8(\"graphics/pokemon/dragonite/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Mewtwo[] = INCBIN_U32(\"graphics/pokemon/mewtwo/front.4bpp.lz\");\nconst u32 gMonPalette_Mewtwo[] = INCBIN_U32(\"graphics/pokemon/mewtwo/normal.gbapal.lz\");\nconst u32 gMonBackPic_Mewtwo[] = INCBIN_U32(\"graphics/pokemon/mewtwo/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Mewtwo[] = INCBIN_U32(\"graphics/pokemon/mewtwo/shiny.gbapal.lz\");\nconst u8 gMonIcon_Mewtwo[] = INCBIN_U8(\"graphics/pokemon/mewtwo/icon.4bpp\");\nconst u8 gMonFootprint_Mewtwo[] = INCBIN_U8(\"graphics/pokemon/mewtwo/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Mew[] = INCBIN_U32(\"graphics/pokemon/mew/front.4bpp.lz\");\nconst u32 gMonPalette_Mew[] = INCBIN_U32(\"graphics/pokemon/mew/normal.gbapal.lz\");\nconst u32 gMonBackPic_Mew[] = INCBIN_U32(\"graphics/pokemon/mew/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Mew[] = INCBIN_U32(\"graphics/pokemon/mew/shiny.gbapal.lz\");\nconst u8 gMonIcon_Mew[] = INCBIN_U8(\"graphics/pokemon/mew/icon.4bpp\");\nconst u8 gMonFootprint_Mew[] = INCBIN_U8(\"graphics/pokemon/mew/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Chikorita[] = INCBIN_U32(\"graphics/pokemon/chikorita/front.4bpp.lz\");\nconst u32 gMonPalette_Chikorita[] = INCBIN_U32(\"graphics/pokemon/chikorita/normal.gbapal.lz\");\nconst u32 gMonBackPic_Chikorita[] = INCBIN_U32(\"graphics/pokemon/chikorita/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Chikorita[] = INCBIN_U32(\"graphics/pokemon/chikorita/shiny.gbapal.lz\");\nconst u8 gMonIcon_Chikorita[] = INCBIN_U8(\"graphics/pokemon/chikorita/icon.4bpp\");\nconst u8 gMonFootprint_Chikorita[] = INCBIN_U8(\"graphics/pokemon/chikorita/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Bayleef[] = INCBIN_U32(\"graphics/pokemon/bayleef/front.4bpp.lz\");\nconst u32 gMonPalette_Bayleef[] = INCBIN_U32(\"graphics/pokemon/bayleef/normal.gbapal.lz\");\nconst u32 gMonBackPic_Bayleef[] = INCBIN_U32(\"graphics/pokemon/bayleef/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Bayleef[] = INCBIN_U32(\"graphics/pokemon/bayleef/shiny.gbapal.lz\");\nconst u8 gMonIcon_Bayleef[] = INCBIN_U8(\"graphics/pokemon/bayleef/icon.4bpp\");\nconst u8 gMonFootprint_Bayleef[] = INCBIN_U8(\"graphics/pokemon/bayleef/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Meganium[] = INCBIN_U32(\"graphics/pokemon/meganium/front.4bpp.lz\");\nconst u32 gMonPalette_Meganium[] = INCBIN_U32(\"graphics/pokemon/meganium/normal.gbapal.lz\");\nconst u32 gMonBackPic_Meganium[] = INCBIN_U32(\"graphics/pokemon/meganium/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Meganium[] = INCBIN_U32(\"graphics/pokemon/meganium/shiny.gbapal.lz\");\nconst u8 gMonIcon_Meganium[] = INCBIN_U8(\"graphics/pokemon/meganium/icon.4bpp\");\nconst u8 gMonFootprint_Meganium[] = INCBIN_U8(\"graphics/pokemon/meganium/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Cyndaquil[] = INCBIN_U32(\"graphics/pokemon/cyndaquil/front.4bpp.lz\");\nconst u32 gMonPalette_Cyndaquil[] = INCBIN_U32(\"graphics/pokemon/cyndaquil/normal.gbapal.lz\");\nconst u32 gMonBackPic_Cyndaquil[] = INCBIN_U32(\"graphics/pokemon/cyndaquil/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Cyndaquil[] = INCBIN_U32(\"graphics/pokemon/cyndaquil/shiny.gbapal.lz\");\nconst u8 gMonIcon_Cyndaquil[] = INCBIN_U8(\"graphics/pokemon/cyndaquil/icon.4bpp\");\nconst u8 gMonFootprint_Cyndaquil[] = INCBIN_U8(\"graphics/pokemon/cyndaquil/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Quilava[] = INCBIN_U32(\"graphics/pokemon/quilava/front.4bpp.lz\");\nconst u32 gMonPalette_Quilava[] = INCBIN_U32(\"graphics/pokemon/quilava/normal.gbapal.lz\");\nconst u32 gMonBackPic_Quilava[] = INCBIN_U32(\"graphics/pokemon/quilava/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Quilava[] = INCBIN_U32(\"graphics/pokemon/quilava/shiny.gbapal.lz\");\nconst u8 gMonIcon_Quilava[] = INCBIN_U8(\"graphics/pokemon/quilava/icon.4bpp\");\nconst u8 gMonFootprint_Quilava[] = INCBIN_U8(\"graphics/pokemon/quilava/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Typhlosion[] = INCBIN_U32(\"graphics/pokemon/typhlosion/front.4bpp.lz\");\nconst u32 gMonPalette_Typhlosion[] = INCBIN_U32(\"graphics/pokemon/typhlosion/normal.gbapal.lz\");\nconst u32 gMonBackPic_Typhlosion[] = INCBIN_U32(\"graphics/pokemon/typhlosion/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Typhlosion[] = INCBIN_U32(\"graphics/pokemon/typhlosion/shiny.gbapal.lz\");\nconst u8 gMonIcon_Typhlosion[] = INCBIN_U8(\"graphics/pokemon/typhlosion/icon.4bpp\");\nconst u8 gMonFootprint_Typhlosion[] = INCBIN_U8(\"graphics/pokemon/typhlosion/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Totodile[] = INCBIN_U32(\"graphics/pokemon/totodile/front.4bpp.lz\");\nconst u32 gMonPalette_Totodile[] = INCBIN_U32(\"graphics/pokemon/totodile/normal.gbapal.lz\");\nconst u32 gMonBackPic_Totodile[] = INCBIN_U32(\"graphics/pokemon/totodile/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Totodile[] = INCBIN_U32(\"graphics/pokemon/totodile/shiny.gbapal.lz\");\nconst u8 gMonIcon_Totodile[] = INCBIN_U8(\"graphics/pokemon/totodile/icon.4bpp\");\nconst u8 gMonFootprint_Totodile[] = INCBIN_U8(\"graphics/pokemon/totodile/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Croconaw[] = INCBIN_U32(\"graphics/pokemon/croconaw/front.4bpp.lz\");\nconst u32 gMonPalette_Croconaw[] = INCBIN_U32(\"graphics/pokemon/croconaw/normal.gbapal.lz\");\nconst u32 gMonBackPic_Croconaw[] = INCBIN_U32(\"graphics/pokemon/croconaw/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Croconaw[] = INCBIN_U32(\"graphics/pokemon/croconaw/shiny.gbapal.lz\");\nconst u8 gMonIcon_Croconaw[] = INCBIN_U8(\"graphics/pokemon/croconaw/icon.4bpp\");\nconst u8 gMonFootprint_Croconaw[] = INCBIN_U8(\"graphics/pokemon/croconaw/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Feraligatr[] = INCBIN_U32(\"graphics/pokemon/feraligatr/front.4bpp.lz\");\nconst u32 gMonPalette_Feraligatr[] = INCBIN_U32(\"graphics/pokemon/feraligatr/normal.gbapal.lz\");\nconst u32 gMonBackPic_Feraligatr[] = INCBIN_U32(\"graphics/pokemon/feraligatr/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Feraligatr[] = INCBIN_U32(\"graphics/pokemon/feraligatr/shiny.gbapal.lz\");\nconst u8 gMonIcon_Feraligatr[] = INCBIN_U8(\"graphics/pokemon/feraligatr/icon.4bpp\");\nconst u8 gMonFootprint_Feraligatr[] = INCBIN_U8(\"graphics/pokemon/feraligatr/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Sentret[] = INCBIN_U32(\"graphics/pokemon/sentret/front.4bpp.lz\");\nconst u32 gMonPalette_Sentret[] = INCBIN_U32(\"graphics/pokemon/sentret/normal.gbapal.lz\");\nconst u32 gMonBackPic_Sentret[] = INCBIN_U32(\"graphics/pokemon/sentret/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Sentret[] = INCBIN_U32(\"graphics/pokemon/sentret/shiny.gbapal.lz\");\nconst u8 gMonIcon_Sentret[] = INCBIN_U8(\"graphics/pokemon/sentret/icon.4bpp\");\nconst u8 gMonFootprint_Sentret[] = INCBIN_U8(\"graphics/pokemon/sentret/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Furret[] = INCBIN_U32(\"graphics/pokemon/furret/front.4bpp.lz\");\nconst u32 gMonPalette_Furret[] = INCBIN_U32(\"graphics/pokemon/furret/normal.gbapal.lz\");\nconst u32 gMonBackPic_Furret[] = INCBIN_U32(\"graphics/pokemon/furret/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Furret[] = INCBIN_U32(\"graphics/pokemon/furret/shiny.gbapal.lz\");\nconst u8 gMonIcon_Furret[] = INCBIN_U8(\"graphics/pokemon/furret/icon.4bpp\");\nconst u8 gMonFootprint_Furret[] = INCBIN_U8(\"graphics/pokemon/furret/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Hoothoot[] = INCBIN_U32(\"graphics/pokemon/hoothoot/front.4bpp.lz\");\nconst u32 gMonPalette_Hoothoot[] = INCBIN_U32(\"graphics/pokemon/hoothoot/normal.gbapal.lz\");\nconst u32 gMonBackPic_Hoothoot[] = INCBIN_U32(\"graphics/pokemon/hoothoot/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Hoothoot[] = INCBIN_U32(\"graphics/pokemon/hoothoot/shiny.gbapal.lz\");\nconst u8 gMonIcon_Hoothoot[] = INCBIN_U8(\"graphics/pokemon/hoothoot/icon.4bpp\");\nconst u8 gMonFootprint_Hoothoot[] = INCBIN_U8(\"graphics/pokemon/hoothoot/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Noctowl[] = INCBIN_U32(\"graphics/pokemon/noctowl/front.4bpp.lz\");\nconst u32 gMonPalette_Noctowl[] = INCBIN_U32(\"graphics/pokemon/noctowl/normal.gbapal.lz\");\nconst u32 gMonBackPic_Noctowl[] = INCBIN_U32(\"graphics/pokemon/noctowl/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Noctowl[] = INCBIN_U32(\"graphics/pokemon/noctowl/shiny.gbapal.lz\");\nconst u8 gMonIcon_Noctowl[] = INCBIN_U8(\"graphics/pokemon/noctowl/icon.4bpp\");\nconst u8 gMonFootprint_Noctowl[] = INCBIN_U8(\"graphics/pokemon/noctowl/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ledyba[] = INCBIN_U32(\"graphics/pokemon/ledyba/front.4bpp.lz\");\nconst u32 gMonPalette_Ledyba[] = INCBIN_U32(\"graphics/pokemon/ledyba/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ledyba[] = INCBIN_U32(\"graphics/pokemon/ledyba/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ledyba[] = INCBIN_U32(\"graphics/pokemon/ledyba/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ledyba[] = INCBIN_U8(\"graphics/pokemon/ledyba/icon.4bpp\");\nconst u8 gMonFootprint_Ledyba[] = INCBIN_U8(\"graphics/pokemon/ledyba/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ledian[] = INCBIN_U32(\"graphics/pokemon/ledian/front.4bpp.lz\");\nconst u32 gMonPalette_Ledian[] = INCBIN_U32(\"graphics/pokemon/ledian/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ledian[] = INCBIN_U32(\"graphics/pokemon/ledian/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ledian[] = INCBIN_U32(\"graphics/pokemon/ledian/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ledian[] = INCBIN_U8(\"graphics/pokemon/ledian/icon.4bpp\");\nconst u8 gMonFootprint_Ledian[] = INCBIN_U8(\"graphics/pokemon/ledian/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Spinarak[] = INCBIN_U32(\"graphics/pokemon/spinarak/front.4bpp.lz\");\nconst u32 gMonPalette_Spinarak[] = INCBIN_U32(\"graphics/pokemon/spinarak/normal.gbapal.lz\");\nconst u32 gMonBackPic_Spinarak[] = INCBIN_U32(\"graphics/pokemon/spinarak/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Spinarak[] = INCBIN_U32(\"graphics/pokemon/spinarak/shiny.gbapal.lz\");\nconst u8 gMonIcon_Spinarak[] = INCBIN_U8(\"graphics/pokemon/spinarak/icon.4bpp\");\nconst u8 gMonFootprint_Spinarak[] = INCBIN_U8(\"graphics/pokemon/spinarak/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ariados[] = INCBIN_U32(\"graphics/pokemon/ariados/front.4bpp.lz\");\nconst u32 gMonPalette_Ariados[] = INCBIN_U32(\"graphics/pokemon/ariados/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ariados[] = INCBIN_U32(\"graphics/pokemon/ariados/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ariados[] = INCBIN_U32(\"graphics/pokemon/ariados/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ariados[] = INCBIN_U8(\"graphics/pokemon/ariados/icon.4bpp\");\nconst u8 gMonFootprint_Ariados[] = INCBIN_U8(\"graphics/pokemon/ariados/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Crobat[] = INCBIN_U32(\"graphics/pokemon/crobat/front.4bpp.lz\");\nconst u32 gMonPalette_Crobat[] = INCBIN_U32(\"graphics/pokemon/crobat/normal.gbapal.lz\");\nconst u32 gMonBackPic_Crobat[] = INCBIN_U32(\"graphics/pokemon/crobat/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Crobat[] = INCBIN_U32(\"graphics/pokemon/crobat/shiny.gbapal.lz\");\nconst u8 gMonIcon_Crobat[] = INCBIN_U8(\"graphics/pokemon/crobat/icon.4bpp\");\nconst u8 gMonFootprint_Crobat[] = INCBIN_U8(\"graphics/pokemon/crobat/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Chinchou[] = INCBIN_U32(\"graphics/pokemon/chinchou/front.4bpp.lz\");\nconst u32 gMonPalette_Chinchou[] = INCBIN_U32(\"graphics/pokemon/chinchou/normal.gbapal.lz\");\nconst u32 gMonBackPic_Chinchou[] = INCBIN_U32(\"graphics/pokemon/chinchou/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Chinchou[] = INCBIN_U32(\"graphics/pokemon/chinchou/shiny.gbapal.lz\");\nconst u8 gMonIcon_Chinchou[] = INCBIN_U8(\"graphics/pokemon/chinchou/icon.4bpp\");\nconst u8 gMonFootprint_Chinchou[] = INCBIN_U8(\"graphics/pokemon/chinchou/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Lanturn[] = INCBIN_U32(\"graphics/pokemon/lanturn/front.4bpp.lz\");\nconst u32 gMonPalette_Lanturn[] = INCBIN_U32(\"graphics/pokemon/lanturn/normal.gbapal.lz\");\nconst u32 gMonBackPic_Lanturn[] = INCBIN_U32(\"graphics/pokemon/lanturn/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Lanturn[] = INCBIN_U32(\"graphics/pokemon/lanturn/shiny.gbapal.lz\");\nconst u8 gMonIcon_Lanturn[] = INCBIN_U8(\"graphics/pokemon/lanturn/icon.4bpp\");\nconst u8 gMonFootprint_Lanturn[] = INCBIN_U8(\"graphics/pokemon/lanturn/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Pichu[] = INCBIN_U32(\"graphics/pokemon/pichu/front.4bpp.lz\");\nconst u32 gMonPalette_Pichu[] = INCBIN_U32(\"graphics/pokemon/pichu/normal.gbapal.lz\");\nconst u32 gMonBackPic_Pichu[] = INCBIN_U32(\"graphics/pokemon/pichu/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Pichu[] = INCBIN_U32(\"graphics/pokemon/pichu/shiny.gbapal.lz\");\nconst u8 gMonIcon_Pichu[] = INCBIN_U8(\"graphics/pokemon/pichu/icon.4bpp\");\nconst u8 gMonFootprint_Pichu[] = INCBIN_U8(\"graphics/pokemon/pichu/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Cleffa[] = INCBIN_U32(\"graphics/pokemon/cleffa/front.4bpp.lz\");\nconst u32 gMonPalette_Cleffa[] = INCBIN_U32(\"graphics/pokemon/cleffa/normal.gbapal.lz\");\nconst u32 gMonBackPic_Cleffa[] = INCBIN_U32(\"graphics/pokemon/cleffa/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Cleffa[] = INCBIN_U32(\"graphics/pokemon/cleffa/shiny.gbapal.lz\");\nconst u8 gMonIcon_Cleffa[] = INCBIN_U8(\"graphics/pokemon/cleffa/icon.4bpp\");\nconst u8 gMonFootprint_Cleffa[] = INCBIN_U8(\"graphics/pokemon/cleffa/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Igglybuff[] = INCBIN_U32(\"graphics/pokemon/igglybuff/front.4bpp.lz\");\nconst u32 gMonPalette_Igglybuff[] = INCBIN_U32(\"graphics/pokemon/igglybuff/normal.gbapal.lz\");\nconst u32 gMonBackPic_Igglybuff[] = INCBIN_U32(\"graphics/pokemon/igglybuff/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Igglybuff[] = INCBIN_U32(\"graphics/pokemon/igglybuff/shiny.gbapal.lz\");\nconst u8 gMonIcon_Igglybuff[] = INCBIN_U8(\"graphics/pokemon/igglybuff/icon.4bpp\");\nconst u8 gMonFootprint_Igglybuff[] = INCBIN_U8(\"graphics/pokemon/igglybuff/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Togepi[] = INCBIN_U32(\"graphics/pokemon/togepi/front.4bpp.lz\");\nconst u32 gMonPalette_Togepi[] = INCBIN_U32(\"graphics/pokemon/togepi/normal.gbapal.lz\");\nconst u32 gMonBackPic_Togepi[] = INCBIN_U32(\"graphics/pokemon/togepi/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Togepi[] = INCBIN_U32(\"graphics/pokemon/togepi/shiny.gbapal.lz\");\nconst u8 gMonIcon_Togepi[] = INCBIN_U8(\"graphics/pokemon/togepi/icon.4bpp\");\nconst u8 gMonFootprint_Togepi[] = INCBIN_U8(\"graphics/pokemon/togepi/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Togetic[] = INCBIN_U32(\"graphics/pokemon/togetic/front.4bpp.lz\");\nconst u32 gMonPalette_Togetic[] = INCBIN_U32(\"graphics/pokemon/togetic/normal.gbapal.lz\");\nconst u32 gMonBackPic_Togetic[] = INCBIN_U32(\"graphics/pokemon/togetic/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Togetic[] = INCBIN_U32(\"graphics/pokemon/togetic/shiny.gbapal.lz\");\nconst u8 gMonIcon_Togetic[] = INCBIN_U8(\"graphics/pokemon/togetic/icon.4bpp\");\nconst u8 gMonFootprint_Togetic[] = INCBIN_U8(\"graphics/pokemon/togetic/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Natu[] = INCBIN_U32(\"graphics/pokemon/natu/front.4bpp.lz\");\nconst u32 gMonPalette_Natu[] = INCBIN_U32(\"graphics/pokemon/natu/normal.gbapal.lz\");\nconst u32 gMonBackPic_Natu[] = INCBIN_U32(\"graphics/pokemon/natu/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Natu[] = INCBIN_U32(\"graphics/pokemon/natu/shiny.gbapal.lz\");\nconst u8 gMonIcon_Natu[] = INCBIN_U8(\"graphics/pokemon/natu/icon.4bpp\");\nconst u8 gMonFootprint_Natu[] = INCBIN_U8(\"graphics/pokemon/natu/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Xatu[] = INCBIN_U32(\"graphics/pokemon/xatu/front.4bpp.lz\");\nconst u32 gMonPalette_Xatu[] = INCBIN_U32(\"graphics/pokemon/xatu/normal.gbapal.lz\");\nconst u32 gMonBackPic_Xatu[] = INCBIN_U32(\"graphics/pokemon/xatu/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Xatu[] = INCBIN_U32(\"graphics/pokemon/xatu/shiny.gbapal.lz\");\nconst u8 gMonIcon_Xatu[] = INCBIN_U8(\"graphics/pokemon/xatu/icon.4bpp\");\nconst u8 gMonFootprint_Xatu[] = INCBIN_U8(\"graphics/pokemon/xatu/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Mareep[] = INCBIN_U32(\"graphics/pokemon/mareep/front.4bpp.lz\");\nconst u32 gMonPalette_Mareep[] = INCBIN_U32(\"graphics/pokemon/mareep/normal.gbapal.lz\");\nconst u32 gMonBackPic_Mareep[] = INCBIN_U32(\"graphics/pokemon/mareep/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Mareep[] = INCBIN_U32(\"graphics/pokemon/mareep/shiny.gbapal.lz\");\nconst u8 gMonIcon_Mareep[] = INCBIN_U8(\"graphics/pokemon/mareep/icon.4bpp\");\nconst u8 gMonFootprint_Mareep[] = INCBIN_U8(\"graphics/pokemon/mareep/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Flaaffy[] = INCBIN_U32(\"graphics/pokemon/flaaffy/front.4bpp.lz\");\nconst u32 gMonPalette_Flaaffy[] = INCBIN_U32(\"graphics/pokemon/flaaffy/normal.gbapal.lz\");\nconst u32 gMonBackPic_Flaaffy[] = INCBIN_U32(\"graphics/pokemon/flaaffy/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Flaaffy[] = INCBIN_U32(\"graphics/pokemon/flaaffy/shiny.gbapal.lz\");\nconst u8 gMonIcon_Flaaffy[] = INCBIN_U8(\"graphics/pokemon/flaaffy/icon.4bpp\");\nconst u8 gMonFootprint_Flaaffy[] = INCBIN_U8(\"graphics/pokemon/flaaffy/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ampharos[] = INCBIN_U32(\"graphics/pokemon/ampharos/front.4bpp.lz\");\nconst u32 gMonPalette_Ampharos[] = INCBIN_U32(\"graphics/pokemon/ampharos/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ampharos[] = INCBIN_U32(\"graphics/pokemon/ampharos/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ampharos[] = INCBIN_U32(\"graphics/pokemon/ampharos/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ampharos[] = INCBIN_U8(\"graphics/pokemon/ampharos/icon.4bpp\");\nconst u8 gMonFootprint_Ampharos[] = INCBIN_U8(\"graphics/pokemon/ampharos/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Bellossom[] = INCBIN_U32(\"graphics/pokemon/bellossom/front.4bpp.lz\");\nconst u32 gMonPalette_Bellossom[] = INCBIN_U32(\"graphics/pokemon/bellossom/normal.gbapal.lz\");\nconst u32 gMonBackPic_Bellossom[] = INCBIN_U32(\"graphics/pokemon/bellossom/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Bellossom[] = INCBIN_U32(\"graphics/pokemon/bellossom/shiny.gbapal.lz\");\nconst u8 gMonIcon_Bellossom[] = INCBIN_U8(\"graphics/pokemon/bellossom/icon.4bpp\");\nconst u8 gMonFootprint_Bellossom[] = INCBIN_U8(\"graphics/pokemon/bellossom/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Marill[] = INCBIN_U32(\"graphics/pokemon/marill/front.4bpp.lz\");\nconst u32 gMonPalette_Marill[] = INCBIN_U32(\"graphics/pokemon/marill/normal.gbapal.lz\");\nconst u32 gMonBackPic_Marill[] = INCBIN_U32(\"graphics/pokemon/marill/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Marill[] = INCBIN_U32(\"graphics/pokemon/marill/shiny.gbapal.lz\");\nconst u8 gMonIcon_Marill[] = INCBIN_U8(\"graphics/pokemon/marill/icon.4bpp\");\nconst u8 gMonFootprint_Marill[] = INCBIN_U8(\"graphics/pokemon/marill/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Azumarill[] = INCBIN_U32(\"graphics/pokemon/azumarill/front.4bpp.lz\");\nconst u32 gMonPalette_Azumarill[] = INCBIN_U32(\"graphics/pokemon/azumarill/normal.gbapal.lz\");\nconst u32 gMonBackPic_Azumarill[] = INCBIN_U32(\"graphics/pokemon/azumarill/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Azumarill[] = INCBIN_U32(\"graphics/pokemon/azumarill/shiny.gbapal.lz\");\nconst u8 gMonIcon_Azumarill[] = INCBIN_U8(\"graphics/pokemon/azumarill/icon.4bpp\");\nconst u8 gMonFootprint_Azumarill[] = INCBIN_U8(\"graphics/pokemon/azumarill/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Sudowoodo[] = INCBIN_U32(\"graphics/pokemon/sudowoodo/front.4bpp.lz\");\nconst u32 gMonPalette_Sudowoodo[] = INCBIN_U32(\"graphics/pokemon/sudowoodo/normal.gbapal.lz\");\nconst u32 gMonBackPic_Sudowoodo[] = INCBIN_U32(\"graphics/pokemon/sudowoodo/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Sudowoodo[] = INCBIN_U32(\"graphics/pokemon/sudowoodo/shiny.gbapal.lz\");\nconst u8 gMonIcon_Sudowoodo[] = INCBIN_U8(\"graphics/pokemon/sudowoodo/icon.4bpp\");\nconst u8 gMonFootprint_Sudowoodo[] = INCBIN_U8(\"graphics/pokemon/sudowoodo/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Politoed[] = INCBIN_U32(\"graphics/pokemon/politoed/front.4bpp.lz\");\nconst u32 gMonPalette_Politoed[] = INCBIN_U32(\"graphics/pokemon/politoed/normal.gbapal.lz\");\nconst u32 gMonBackPic_Politoed[] = INCBIN_U32(\"graphics/pokemon/politoed/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Politoed[] = INCBIN_U32(\"graphics/pokemon/politoed/shiny.gbapal.lz\");\nconst u8 gMonIcon_Politoed[] = INCBIN_U8(\"graphics/pokemon/politoed/icon.4bpp\");\nconst u8 gMonFootprint_Politoed[] = INCBIN_U8(\"graphics/pokemon/politoed/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Hoppip[] = INCBIN_U32(\"graphics/pokemon/hoppip/front.4bpp.lz\");\nconst u32 gMonPalette_Hoppip[] = INCBIN_U32(\"graphics/pokemon/hoppip/normal.gbapal.lz\");\nconst u32 gMonBackPic_Hoppip[] = INCBIN_U32(\"graphics/pokemon/hoppip/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Hoppip[] = INCBIN_U32(\"graphics/pokemon/hoppip/shiny.gbapal.lz\");\nconst u8 gMonIcon_Hoppip[] = INCBIN_U8(\"graphics/pokemon/hoppip/icon.4bpp\");\nconst u8 gMonFootprint_Hoppip[] = INCBIN_U8(\"graphics/pokemon/hoppip/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Skiploom[] = INCBIN_U32(\"graphics/pokemon/skiploom/front.4bpp.lz\");\nconst u32 gMonPalette_Skiploom[] = INCBIN_U32(\"graphics/pokemon/skiploom/normal.gbapal.lz\");\nconst u32 gMonBackPic_Skiploom[] = INCBIN_U32(\"graphics/pokemon/skiploom/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Skiploom[] = INCBIN_U32(\"graphics/pokemon/skiploom/shiny.gbapal.lz\");\nconst u8 gMonIcon_Skiploom[] = INCBIN_U8(\"graphics/pokemon/skiploom/icon.4bpp\");\nconst u8 gMonFootprint_Skiploom[] = INCBIN_U8(\"graphics/pokemon/skiploom/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Jumpluff[] = INCBIN_U32(\"graphics/pokemon/jumpluff/front.4bpp.lz\");\nconst u32 gMonPalette_Jumpluff[] = INCBIN_U32(\"graphics/pokemon/jumpluff/normal.gbapal.lz\");\nconst u32 gMonBackPic_Jumpluff[] = INCBIN_U32(\"graphics/pokemon/jumpluff/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Jumpluff[] = INCBIN_U32(\"graphics/pokemon/jumpluff/shiny.gbapal.lz\");\nconst u8 gMonIcon_Jumpluff[] = INCBIN_U8(\"graphics/pokemon/jumpluff/icon.4bpp\");\nconst u8 gMonFootprint_Jumpluff[] = INCBIN_U8(\"graphics/pokemon/jumpluff/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Aipom[] = INCBIN_U32(\"graphics/pokemon/aipom/front.4bpp.lz\");\nconst u32 gMonPalette_Aipom[] = INCBIN_U32(\"graphics/pokemon/aipom/normal.gbapal.lz\");\nconst u32 gMonBackPic_Aipom[] = INCBIN_U32(\"graphics/pokemon/aipom/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Aipom[] = INCBIN_U32(\"graphics/pokemon/aipom/shiny.gbapal.lz\");\nconst u8 gMonIcon_Aipom[] = INCBIN_U8(\"graphics/pokemon/aipom/icon.4bpp\");\nconst u8 gMonFootprint_Aipom[] = INCBIN_U8(\"graphics/pokemon/aipom/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Sunkern[] = INCBIN_U32(\"graphics/pokemon/sunkern/front.4bpp.lz\");\nconst u32 gMonPalette_Sunkern[] = INCBIN_U32(\"graphics/pokemon/sunkern/normal.gbapal.lz\");\nconst u32 gMonBackPic_Sunkern[] = INCBIN_U32(\"graphics/pokemon/sunkern/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Sunkern[] = INCBIN_U32(\"graphics/pokemon/sunkern/shiny.gbapal.lz\");\nconst u8 gMonIcon_Sunkern[] = INCBIN_U8(\"graphics/pokemon/sunkern/icon.4bpp\");\nconst u8 gMonFootprint_Sunkern[] = INCBIN_U8(\"graphics/pokemon/sunkern/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Sunflora[] = INCBIN_U32(\"graphics/pokemon/sunflora/front.4bpp.lz\");\nconst u32 gMonPalette_Sunflora[] = INCBIN_U32(\"graphics/pokemon/sunflora/normal.gbapal.lz\");\nconst u32 gMonBackPic_Sunflora[] = INCBIN_U32(\"graphics/pokemon/sunflora/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Sunflora[] = INCBIN_U32(\"graphics/pokemon/sunflora/shiny.gbapal.lz\");\nconst u8 gMonIcon_Sunflora[] = INCBIN_U8(\"graphics/pokemon/sunflora/icon.4bpp\");\nconst u8 gMonFootprint_Sunflora[] = INCBIN_U8(\"graphics/pokemon/sunflora/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Yanma[] = INCBIN_U32(\"graphics/pokemon/yanma/front.4bpp.lz\");\nconst u32 gMonPalette_Yanma[] = INCBIN_U32(\"graphics/pokemon/yanma/normal.gbapal.lz\");\nconst u32 gMonBackPic_Yanma[] = INCBIN_U32(\"graphics/pokemon/yanma/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Yanma[] = INCBIN_U32(\"graphics/pokemon/yanma/shiny.gbapal.lz\");\nconst u8 gMonIcon_Yanma[] = INCBIN_U8(\"graphics/pokemon/yanma/icon.4bpp\");\nconst u8 gMonFootprint_Yanma[] = INCBIN_U8(\"graphics/pokemon/yanma/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Wooper[] = INCBIN_U32(\"graphics/pokemon/wooper/front.4bpp.lz\");\nconst u32 gMonPalette_Wooper[] = INCBIN_U32(\"graphics/pokemon/wooper/normal.gbapal.lz\");\nconst u32 gMonBackPic_Wooper[] = INCBIN_U32(\"graphics/pokemon/wooper/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Wooper[] = INCBIN_U32(\"graphics/pokemon/wooper/shiny.gbapal.lz\");\nconst u8 gMonIcon_Wooper[] = INCBIN_U8(\"graphics/pokemon/wooper/icon.4bpp\");\nconst u8 gMonFootprint_Wooper[] = INCBIN_U8(\"graphics/pokemon/wooper/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Quagsire[] = INCBIN_U32(\"graphics/pokemon/quagsire/front.4bpp.lz\");\nconst u32 gMonPalette_Quagsire[] = INCBIN_U32(\"graphics/pokemon/quagsire/normal.gbapal.lz\");\nconst u32 gMonBackPic_Quagsire[] = INCBIN_U32(\"graphics/pokemon/quagsire/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Quagsire[] = INCBIN_U32(\"graphics/pokemon/quagsire/shiny.gbapal.lz\");\nconst u8 gMonIcon_Quagsire[] = INCBIN_U8(\"graphics/pokemon/quagsire/icon.4bpp\");\nconst u8 gMonFootprint_Quagsire[] = INCBIN_U8(\"graphics/pokemon/quagsire/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Espeon[] = INCBIN_U32(\"graphics/pokemon/espeon/front.4bpp.lz\");\nconst u32 gMonPalette_Espeon[] = INCBIN_U32(\"graphics/pokemon/espeon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Espeon[] = INCBIN_U32(\"graphics/pokemon/espeon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Espeon[] = INCBIN_U32(\"graphics/pokemon/espeon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Espeon[] = INCBIN_U8(\"graphics/pokemon/espeon/icon.4bpp\");\nconst u8 gMonFootprint_Espeon[] = INCBIN_U8(\"graphics/pokemon/espeon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Umbreon[] = INCBIN_U32(\"graphics/pokemon/umbreon/front.4bpp.lz\");\nconst u32 gMonPalette_Umbreon[] = INCBIN_U32(\"graphics/pokemon/umbreon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Umbreon[] = INCBIN_U32(\"graphics/pokemon/umbreon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Umbreon[] = INCBIN_U32(\"graphics/pokemon/umbreon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Umbreon[] = INCBIN_U8(\"graphics/pokemon/umbreon/icon.4bpp\");\nconst u8 gMonFootprint_Umbreon[] = INCBIN_U8(\"graphics/pokemon/umbreon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Murkrow[] = INCBIN_U32(\"graphics/pokemon/murkrow/front.4bpp.lz\");\nconst u32 gMonPalette_Murkrow[] = INCBIN_U32(\"graphics/pokemon/murkrow/normal.gbapal.lz\");\nconst u32 gMonBackPic_Murkrow[] = INCBIN_U32(\"graphics/pokemon/murkrow/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Murkrow[] = INCBIN_U32(\"graphics/pokemon/murkrow/shiny.gbapal.lz\");\nconst u8 gMonIcon_Murkrow[] = INCBIN_U8(\"graphics/pokemon/murkrow/icon.4bpp\");\nconst u8 gMonFootprint_Murkrow[] = INCBIN_U8(\"graphics/pokemon/murkrow/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Slowking[] = INCBIN_U32(\"graphics/pokemon/slowking/front.4bpp.lz\");\nconst u32 gMonPalette_Slowking[] = INCBIN_U32(\"graphics/pokemon/slowking/normal.gbapal.lz\");\nconst u32 gMonBackPic_Slowking[] = INCBIN_U32(\"graphics/pokemon/slowking/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Slowking[] = INCBIN_U32(\"graphics/pokemon/slowking/shiny.gbapal.lz\");\nconst u8 gMonIcon_Slowking[] = INCBIN_U8(\"graphics/pokemon/slowking/icon.4bpp\");\nconst u8 gMonFootprint_Slowking[] = INCBIN_U8(\"graphics/pokemon/slowking/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Misdreavus[] = INCBIN_U32(\"graphics/pokemon/misdreavus/front.4bpp.lz\");\nconst u32 gMonPalette_Misdreavus[] = INCBIN_U32(\"graphics/pokemon/misdreavus/normal.gbapal.lz\");\nconst u32 gMonBackPic_Misdreavus[] = INCBIN_U32(\"graphics/pokemon/misdreavus/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Misdreavus[] = INCBIN_U32(\"graphics/pokemon/misdreavus/shiny.gbapal.lz\");\nconst u8 gMonIcon_Misdreavus[] = INCBIN_U8(\"graphics/pokemon/misdreavus/icon.4bpp\");\nconst u8 gMonFootprint_Misdreavus[] = INCBIN_U8(\"graphics/pokemon/misdreavus/footprint.1bpp\");\n\nconst u32 gMonFrontPic_UnownA[] = INCBIN_U32(\"graphics/pokemon/unown/a/front.4bpp.lz\");\nconst u32 gMonPalette_Unown[] = INCBIN_U32(\"graphics/pokemon/unown/normal.gbapal.lz\");\nconst u32 gMonBackPic_UnownA[] = INCBIN_U32(\"graphics/pokemon/unown/a/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Unown[] = INCBIN_U32(\"graphics/pokemon/unown/shiny.gbapal.lz\");\nconst u8 gMonIcon_UnownA[] = INCBIN_U8(\"graphics/pokemon/unown/a/icon.4bpp\");\nconst u8 gMonFootprint_Unown[] = INCBIN_U8(\"graphics/pokemon/unown/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Wobbuffet[] = INCBIN_U32(\"graphics/pokemon/wobbuffet/front.4bpp.lz\");\nconst u32 gMonPalette_Wobbuffet[] = INCBIN_U32(\"graphics/pokemon/wobbuffet/normal.gbapal.lz\");\nconst u32 gMonBackPic_Wobbuffet[] = INCBIN_U32(\"graphics/pokemon/wobbuffet/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Wobbuffet[] = INCBIN_U32(\"graphics/pokemon/wobbuffet/shiny.gbapal.lz\");\nconst u8 gMonIcon_Wobbuffet[] = INCBIN_U8(\"graphics/pokemon/wobbuffet/icon.4bpp\");\nconst u8 gMonFootprint_Wobbuffet[] = INCBIN_U8(\"graphics/pokemon/wobbuffet/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Girafarig[] = INCBIN_U32(\"graphics/pokemon/girafarig/front.4bpp.lz\");\nconst u32 gMonPalette_Girafarig[] = INCBIN_U32(\"graphics/pokemon/girafarig/normal.gbapal.lz\");\nconst u32 gMonBackPic_Girafarig[] = INCBIN_U32(\"graphics/pokemon/girafarig/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Girafarig[] = INCBIN_U32(\"graphics/pokemon/girafarig/shiny.gbapal.lz\");\nconst u8 gMonIcon_Girafarig[] = INCBIN_U8(\"graphics/pokemon/girafarig/icon.4bpp\");\nconst u8 gMonFootprint_Girafarig[] = INCBIN_U8(\"graphics/pokemon/girafarig/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Pineco[] = INCBIN_U32(\"graphics/pokemon/pineco/front.4bpp.lz\");\nconst u32 gMonPalette_Pineco[] = INCBIN_U32(\"graphics/pokemon/pineco/normal.gbapal.lz\");\nconst u32 gMonBackPic_Pineco[] = INCBIN_U32(\"graphics/pokemon/pineco/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Pineco[] = INCBIN_U32(\"graphics/pokemon/pineco/shiny.gbapal.lz\");\nconst u8 gMonIcon_Pineco[] = INCBIN_U8(\"graphics/pokemon/pineco/icon.4bpp\");\nconst u8 gMonFootprint_Pineco[] = INCBIN_U8(\"graphics/pokemon/pineco/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Forretress[] = INCBIN_U32(\"graphics/pokemon/forretress/front.4bpp.lz\");\nconst u32 gMonPalette_Forretress[] = INCBIN_U32(\"graphics/pokemon/forretress/normal.gbapal.lz\");\nconst u32 gMonBackPic_Forretress[] = INCBIN_U32(\"graphics/pokemon/forretress/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Forretress[] = INCBIN_U32(\"graphics/pokemon/forretress/shiny.gbapal.lz\");\nconst u8 gMonIcon_Forretress[] = INCBIN_U8(\"graphics/pokemon/forretress/icon.4bpp\");\nconst u8 gMonFootprint_Forretress[] = INCBIN_U8(\"graphics/pokemon/forretress/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Dunsparce[] = INCBIN_U32(\"graphics/pokemon/dunsparce/front.4bpp.lz\");\nconst u32 gMonPalette_Dunsparce[] = INCBIN_U32(\"graphics/pokemon/dunsparce/normal.gbapal.lz\");\nconst u32 gMonBackPic_Dunsparce[] = INCBIN_U32(\"graphics/pokemon/dunsparce/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Dunsparce[] = INCBIN_U32(\"graphics/pokemon/dunsparce/shiny.gbapal.lz\");\nconst u8 gMonIcon_Dunsparce[] = INCBIN_U8(\"graphics/pokemon/dunsparce/icon.4bpp\");\nconst u8 gMonFootprint_Dunsparce[] = INCBIN_U8(\"graphics/pokemon/dunsparce/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Gligar[] = INCBIN_U32(\"graphics/pokemon/gligar/front.4bpp.lz\");\nconst u32 gMonPalette_Gligar[] = INCBIN_U32(\"graphics/pokemon/gligar/normal.gbapal.lz\");\nconst u32 gMonBackPic_Gligar[] = INCBIN_U32(\"graphics/pokemon/gligar/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Gligar[] = INCBIN_U32(\"graphics/pokemon/gligar/shiny.gbapal.lz\");\nconst u8 gMonIcon_Gligar[] = INCBIN_U8(\"graphics/pokemon/gligar/icon.4bpp\");\nconst u8 gMonFootprint_Gligar[] = INCBIN_U8(\"graphics/pokemon/gligar/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Steelix[] = INCBIN_U32(\"graphics/pokemon/steelix/front.4bpp.lz\");\nconst u32 gMonPalette_Steelix[] = INCBIN_U32(\"graphics/pokemon/steelix/normal.gbapal.lz\");\nconst u32 gMonBackPic_Steelix[] = INCBIN_U32(\"graphics/pokemon/steelix/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Steelix[] = INCBIN_U32(\"graphics/pokemon/steelix/shiny.gbapal.lz\");\nconst u8 gMonIcon_Steelix[] = INCBIN_U8(\"graphics/pokemon/steelix/icon.4bpp\");\nconst u8 gMonFootprint_Steelix[] = INCBIN_U8(\"graphics/pokemon/steelix/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Snubbull[] = INCBIN_U32(\"graphics/pokemon/snubbull/front.4bpp.lz\");\nconst u32 gMonPalette_Snubbull[] = INCBIN_U32(\"graphics/pokemon/snubbull/normal.gbapal.lz\");\nconst u32 gMonBackPic_Snubbull[] = INCBIN_U32(\"graphics/pokemon/snubbull/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Snubbull[] = INCBIN_U32(\"graphics/pokemon/snubbull/shiny.gbapal.lz\");\nconst u8 gMonIcon_Snubbull[] = INCBIN_U8(\"graphics/pokemon/snubbull/icon.4bpp\");\nconst u8 gMonFootprint_Snubbull[] = INCBIN_U8(\"graphics/pokemon/snubbull/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Granbull[] = INCBIN_U32(\"graphics/pokemon/granbull/front.4bpp.lz\");\nconst u32 gMonPalette_Granbull[] = INCBIN_U32(\"graphics/pokemon/granbull/normal.gbapal.lz\");\nconst u32 gMonBackPic_Granbull[] = INCBIN_U32(\"graphics/pokemon/granbull/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Granbull[] = INCBIN_U32(\"graphics/pokemon/granbull/shiny.gbapal.lz\");\nconst u8 gMonIcon_Granbull[] = INCBIN_U8(\"graphics/pokemon/granbull/icon.4bpp\");\nconst u8 gMonFootprint_Granbull[] = INCBIN_U8(\"graphics/pokemon/granbull/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Qwilfish[] = INCBIN_U32(\"graphics/pokemon/qwilfish/front.4bpp.lz\");\nconst u32 gMonPalette_Qwilfish[] = INCBIN_U32(\"graphics/pokemon/qwilfish/normal.gbapal.lz\");\nconst u32 gMonBackPic_Qwilfish[] = INCBIN_U32(\"graphics/pokemon/qwilfish/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Qwilfish[] = INCBIN_U32(\"graphics/pokemon/qwilfish/shiny.gbapal.lz\");\nconst u8 gMonIcon_Qwilfish[] = INCBIN_U8(\"graphics/pokemon/qwilfish/icon.4bpp\");\nconst u8 gMonFootprint_Qwilfish[] = INCBIN_U8(\"graphics/pokemon/qwilfish/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Scizor[] = INCBIN_U32(\"graphics/pokemon/scizor/front.4bpp.lz\");\nconst u32 gMonPalette_Scizor[] = INCBIN_U32(\"graphics/pokemon/scizor/normal.gbapal.lz\");\nconst u32 gMonBackPic_Scizor[] = INCBIN_U32(\"graphics/pokemon/scizor/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Scizor[] = INCBIN_U32(\"graphics/pokemon/scizor/shiny.gbapal.lz\");\nconst u8 gMonIcon_Scizor[] = INCBIN_U8(\"graphics/pokemon/scizor/icon.4bpp\");\nconst u8 gMonFootprint_Scizor[] = INCBIN_U8(\"graphics/pokemon/scizor/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Shuckle[] = INCBIN_U32(\"graphics/pokemon/shuckle/front.4bpp.lz\");\nconst u32 gMonPalette_Shuckle[] = INCBIN_U32(\"graphics/pokemon/shuckle/normal.gbapal.lz\");\nconst u32 gMonBackPic_Shuckle[] = INCBIN_U32(\"graphics/pokemon/shuckle/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Shuckle[] = INCBIN_U32(\"graphics/pokemon/shuckle/shiny.gbapal.lz\");\nconst u8 gMonIcon_Shuckle[] = INCBIN_U8(\"graphics/pokemon/shuckle/icon.4bpp\");\nconst u8 gMonFootprint_Shuckle[] = INCBIN_U8(\"graphics/pokemon/shuckle/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Heracross[] = INCBIN_U32(\"graphics/pokemon/heracross/front.4bpp.lz\");\nconst u32 gMonPalette_Heracross[] = INCBIN_U32(\"graphics/pokemon/heracross/normal.gbapal.lz\");\nconst u32 gMonBackPic_Heracross[] = INCBIN_U32(\"graphics/pokemon/heracross/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Heracross[] = INCBIN_U32(\"graphics/pokemon/heracross/shiny.gbapal.lz\");\nconst u8 gMonIcon_Heracross[] = INCBIN_U8(\"graphics/pokemon/heracross/icon.4bpp\");\nconst u8 gUnknown_heracross_icon[] = INCBIN_U8(\"graphics/pokemon/heracross/unk_icon.4bpp\");\nconst u8 gMonFootprint_Heracross[] = INCBIN_U8(\"graphics/pokemon/heracross/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Sneasel[] = INCBIN_U32(\"graphics/pokemon/sneasel/front.4bpp.lz\");\nconst u32 gMonPalette_Sneasel[] = INCBIN_U32(\"graphics/pokemon/sneasel/normal.gbapal.lz\");\nconst u32 gMonBackPic_Sneasel[] = INCBIN_U32(\"graphics/pokemon/sneasel/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Sneasel[] = INCBIN_U32(\"graphics/pokemon/sneasel/shiny.gbapal.lz\");\nconst u8 gMonIcon_Sneasel[] = INCBIN_U8(\"graphics/pokemon/sneasel/icon.4bpp\");\nconst u8 gMonFootprint_Sneasel[] = INCBIN_U8(\"graphics/pokemon/sneasel/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Teddiursa[] = INCBIN_U32(\"graphics/pokemon/teddiursa/front.4bpp.lz\");\nconst u32 gMonPalette_Teddiursa[] = INCBIN_U32(\"graphics/pokemon/teddiursa/normal.gbapal.lz\");\nconst u32 gMonBackPic_Teddiursa[] = INCBIN_U32(\"graphics/pokemon/teddiursa/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Teddiursa[] = INCBIN_U32(\"graphics/pokemon/teddiursa/shiny.gbapal.lz\");\nconst u8 gMonIcon_Teddiursa[] = INCBIN_U8(\"graphics/pokemon/teddiursa/icon.4bpp\");\nconst u8 gMonFootprint_Teddiursa[] = INCBIN_U8(\"graphics/pokemon/teddiursa/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ursaring[] = INCBIN_U32(\"graphics/pokemon/ursaring/front.4bpp.lz\");\nconst u32 gMonPalette_Ursaring[] = INCBIN_U32(\"graphics/pokemon/ursaring/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ursaring[] = INCBIN_U32(\"graphics/pokemon/ursaring/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ursaring[] = INCBIN_U32(\"graphics/pokemon/ursaring/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ursaring[] = INCBIN_U8(\"graphics/pokemon/ursaring/icon.4bpp\");\nconst u8 gMonFootprint_Ursaring[] = INCBIN_U8(\"graphics/pokemon/ursaring/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Slugma[] = INCBIN_U32(\"graphics/pokemon/slugma/front.4bpp.lz\");\nconst u32 gMonPalette_Slugma[] = INCBIN_U32(\"graphics/pokemon/slugma/normal.gbapal.lz\");\nconst u32 gMonBackPic_Slugma[] = INCBIN_U32(\"graphics/pokemon/slugma/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Slugma[] = INCBIN_U32(\"graphics/pokemon/slugma/shiny.gbapal.lz\");\nconst u8 gMonIcon_Slugma[] = INCBIN_U8(\"graphics/pokemon/slugma/icon.4bpp\");\nconst u8 gMonFootprint_Slugma[] = INCBIN_U8(\"graphics/pokemon/slugma/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Magcargo[] = INCBIN_U32(\"graphics/pokemon/magcargo/front.4bpp.lz\");\nconst u32 gMonPalette_Magcargo[] = INCBIN_U32(\"graphics/pokemon/magcargo/normal.gbapal.lz\");\nconst u32 gMonBackPic_Magcargo[] = INCBIN_U32(\"graphics/pokemon/magcargo/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Magcargo[] = INCBIN_U32(\"graphics/pokemon/magcargo/shiny.gbapal.lz\");\nconst u8 gMonIcon_Magcargo[] = INCBIN_U8(\"graphics/pokemon/magcargo/icon.4bpp\");\nconst u8 gMonFootprint_Magcargo[] = INCBIN_U8(\"graphics/pokemon/magcargo/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Swinub[] = INCBIN_U32(\"graphics/pokemon/swinub/front.4bpp.lz\");\nconst u32 gMonPalette_Swinub[] = INCBIN_U32(\"graphics/pokemon/swinub/normal.gbapal.lz\");\nconst u32 gMonBackPic_Swinub[] = INCBIN_U32(\"graphics/pokemon/swinub/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Swinub[] = INCBIN_U32(\"graphics/pokemon/swinub/shiny.gbapal.lz\");\nconst u8 gMonIcon_Swinub[] = INCBIN_U8(\"graphics/pokemon/swinub/icon.4bpp\");\nconst u8 gMonFootprint_Swinub[] = INCBIN_U8(\"graphics/pokemon/swinub/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Piloswine[] = INCBIN_U32(\"graphics/pokemon/piloswine/front.4bpp.lz\");\nconst u32 gMonPalette_Piloswine[] = INCBIN_U32(\"graphics/pokemon/piloswine/normal.gbapal.lz\");\nconst u32 gMonBackPic_Piloswine[] = INCBIN_U32(\"graphics/pokemon/piloswine/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Piloswine[] = INCBIN_U32(\"graphics/pokemon/piloswine/shiny.gbapal.lz\");\nconst u8 gMonIcon_Piloswine[] = INCBIN_U8(\"graphics/pokemon/piloswine/icon.4bpp\");\nconst u8 gMonFootprint_Piloswine[] = INCBIN_U8(\"graphics/pokemon/piloswine/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Corsola[] = INCBIN_U32(\"graphics/pokemon/corsola/front.4bpp.lz\");\nconst u32 gMonPalette_Corsola[] = INCBIN_U32(\"graphics/pokemon/corsola/normal.gbapal.lz\");\nconst u32 gMonBackPic_Corsola[] = INCBIN_U32(\"graphics/pokemon/corsola/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Corsola[] = INCBIN_U32(\"graphics/pokemon/corsola/shiny.gbapal.lz\");\nconst u8 gMonIcon_Corsola[] = INCBIN_U8(\"graphics/pokemon/corsola/icon.4bpp\");\nconst u8 gMonFootprint_Corsola[] = INCBIN_U8(\"graphics/pokemon/corsola/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Remoraid[] = INCBIN_U32(\"graphics/pokemon/remoraid/front.4bpp.lz\");\nconst u32 gMonPalette_Remoraid[] = INCBIN_U32(\"graphics/pokemon/remoraid/normal.gbapal.lz\");\nconst u32 gMonBackPic_Remoraid[] = INCBIN_U32(\"graphics/pokemon/remoraid/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Remoraid[] = INCBIN_U32(\"graphics/pokemon/remoraid/shiny.gbapal.lz\");\nconst u8 gMonIcon_Remoraid[] = INCBIN_U8(\"graphics/pokemon/remoraid/icon.4bpp\");\nconst u8 gMonFootprint_Remoraid[] = INCBIN_U8(\"graphics/pokemon/remoraid/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Octillery[] = INCBIN_U32(\"graphics/pokemon/octillery/front.4bpp.lz\");\nconst u32 gMonPalette_Octillery[] = INCBIN_U32(\"graphics/pokemon/octillery/normal.gbapal.lz\");\nconst u32 gMonBackPic_Octillery[] = INCBIN_U32(\"graphics/pokemon/octillery/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Octillery[] = INCBIN_U32(\"graphics/pokemon/octillery/shiny.gbapal.lz\");\nconst u8 gMonIcon_Octillery[] = INCBIN_U8(\"graphics/pokemon/octillery/icon.4bpp\");\nconst u8 gMonFootprint_Octillery[] = INCBIN_U8(\"graphics/pokemon/octillery/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Delibird[] = INCBIN_U32(\"graphics/pokemon/delibird/front.4bpp.lz\");\nconst u32 gMonPalette_Delibird[] = INCBIN_U32(\"graphics/pokemon/delibird/normal.gbapal.lz\");\nconst u32 gMonBackPic_Delibird[] = INCBIN_U32(\"graphics/pokemon/delibird/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Delibird[] = INCBIN_U32(\"graphics/pokemon/delibird/shiny.gbapal.lz\");\nconst u8 gMonIcon_Delibird[] = INCBIN_U8(\"graphics/pokemon/delibird/icon.4bpp\");\nconst u8 gMonFootprint_Delibird[] = INCBIN_U8(\"graphics/pokemon/delibird/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Mantine[] = INCBIN_U32(\"graphics/pokemon/mantine/front.4bpp.lz\");\nconst u32 gMonPalette_Mantine[] = INCBIN_U32(\"graphics/pokemon/mantine/normal.gbapal.lz\");\nconst u32 gMonBackPic_Mantine[] = INCBIN_U32(\"graphics/pokemon/mantine/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Mantine[] = INCBIN_U32(\"graphics/pokemon/mantine/shiny.gbapal.lz\");\nconst u8 gMonIcon_Mantine[] = INCBIN_U8(\"graphics/pokemon/mantine/icon.4bpp\");\nconst u8 gMonFootprint_Mantine[] = INCBIN_U8(\"graphics/pokemon/mantine/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Skarmory[] = INCBIN_U32(\"graphics/pokemon/skarmory/front.4bpp.lz\");\nconst u32 gMonPalette_Skarmory[] = INCBIN_U32(\"graphics/pokemon/skarmory/normal.gbapal.lz\");\nconst u32 gMonBackPic_Skarmory[] = INCBIN_U32(\"graphics/pokemon/skarmory/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Skarmory[] = INCBIN_U32(\"graphics/pokemon/skarmory/shiny.gbapal.lz\");\nconst u8 gMonIcon_Skarmory[] = INCBIN_U8(\"graphics/pokemon/skarmory/icon.4bpp\");\nconst u8 gMonFootprint_Skarmory[] = INCBIN_U8(\"graphics/pokemon/skarmory/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Houndour[] = INCBIN_U32(\"graphics/pokemon/houndour/front.4bpp.lz\");\nconst u32 gMonPalette_Houndour[] = INCBIN_U32(\"graphics/pokemon/houndour/normal.gbapal.lz\");\nconst u32 gMonBackPic_Houndour[] = INCBIN_U32(\"graphics/pokemon/houndour/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Houndour[] = INCBIN_U32(\"graphics/pokemon/houndour/shiny.gbapal.lz\");\nconst u8 gMonIcon_Houndour[] = INCBIN_U8(\"graphics/pokemon/houndour/icon.4bpp\");\nconst u8 gMonFootprint_Houndour[] = INCBIN_U8(\"graphics/pokemon/houndour/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Houndoom[] = INCBIN_U32(\"graphics/pokemon/houndoom/front.4bpp.lz\");\nconst u32 gMonPalette_Houndoom[] = INCBIN_U32(\"graphics/pokemon/houndoom/normal.gbapal.lz\");\nconst u32 gMonBackPic_Houndoom[] = INCBIN_U32(\"graphics/pokemon/houndoom/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Houndoom[] = INCBIN_U32(\"graphics/pokemon/houndoom/shiny.gbapal.lz\");\nconst u8 gMonIcon_Houndoom[] = INCBIN_U8(\"graphics/pokemon/houndoom/icon.4bpp\");\nconst u8 gMonFootprint_Houndoom[] = INCBIN_U8(\"graphics/pokemon/houndoom/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Kingdra[] = INCBIN_U32(\"graphics/pokemon/kingdra/front.4bpp.lz\");\nconst u32 gMonPalette_Kingdra[] = INCBIN_U32(\"graphics/pokemon/kingdra/normal.gbapal.lz\");\nconst u32 gMonBackPic_Kingdra[] = INCBIN_U32(\"graphics/pokemon/kingdra/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Kingdra[] = INCBIN_U32(\"graphics/pokemon/kingdra/shiny.gbapal.lz\");\nconst u8 gMonIcon_Kingdra[] = INCBIN_U8(\"graphics/pokemon/kingdra/icon.4bpp\");\nconst u8 gMonFootprint_Kingdra[] = INCBIN_U8(\"graphics/pokemon/kingdra/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Phanpy[] = INCBIN_U32(\"graphics/pokemon/phanpy/front.4bpp.lz\");\nconst u32 gMonPalette_Phanpy[] = INCBIN_U32(\"graphics/pokemon/phanpy/normal.gbapal.lz\");\nconst u32 gMonBackPic_Phanpy[] = INCBIN_U32(\"graphics/pokemon/phanpy/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Phanpy[] = INCBIN_U32(\"graphics/pokemon/phanpy/shiny.gbapal.lz\");\nconst u8 gMonIcon_Phanpy[] = INCBIN_U8(\"graphics/pokemon/phanpy/icon.4bpp\");\nconst u8 gMonFootprint_Phanpy[] = INCBIN_U8(\"graphics/pokemon/phanpy/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Donphan[] = INCBIN_U32(\"graphics/pokemon/donphan/front.4bpp.lz\");\nconst u32 gMonPalette_Donphan[] = INCBIN_U32(\"graphics/pokemon/donphan/normal.gbapal.lz\");\nconst u32 gMonBackPic_Donphan[] = INCBIN_U32(\"graphics/pokemon/donphan/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Donphan[] = INCBIN_U32(\"graphics/pokemon/donphan/shiny.gbapal.lz\");\nconst u8 gMonIcon_Donphan[] = INCBIN_U8(\"graphics/pokemon/donphan/icon.4bpp\");\nconst u8 gMonFootprint_Donphan[] = INCBIN_U8(\"graphics/pokemon/donphan/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Porygon2[] = INCBIN_U32(\"graphics/pokemon/porygon2/front.4bpp.lz\");\nconst u32 gMonPalette_Porygon2[] = INCBIN_U32(\"graphics/pokemon/porygon2/normal.gbapal.lz\");\nconst u32 gMonBackPic_Porygon2[] = INCBIN_U32(\"graphics/pokemon/porygon2/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Porygon2[] = INCBIN_U32(\"graphics/pokemon/porygon2/shiny.gbapal.lz\");\nconst u8 gMonIcon_Porygon2[] = INCBIN_U8(\"graphics/pokemon/porygon2/icon.4bpp\");\nconst u8 gMonFootprint_Porygon2[] = INCBIN_U8(\"graphics/pokemon/porygon2/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Stantler[] = INCBIN_U32(\"graphics/pokemon/stantler/front.4bpp.lz\");\nconst u32 gMonPalette_Stantler[] = INCBIN_U32(\"graphics/pokemon/stantler/normal.gbapal.lz\");\nconst u32 gMonBackPic_Stantler[] = INCBIN_U32(\"graphics/pokemon/stantler/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Stantler[] = INCBIN_U32(\"graphics/pokemon/stantler/shiny.gbapal.lz\");\nconst u8 gMonIcon_Stantler[] = INCBIN_U8(\"graphics/pokemon/stantler/icon.4bpp\");\nconst u8 gMonFootprint_Stantler[] = INCBIN_U8(\"graphics/pokemon/stantler/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Smeargle[] = INCBIN_U32(\"graphics/pokemon/smeargle/front.4bpp.lz\");\nconst u32 gMonPalette_Smeargle[] = INCBIN_U32(\"graphics/pokemon/smeargle/normal.gbapal.lz\");\nconst u32 gMonBackPic_Smeargle[] = INCBIN_U32(\"graphics/pokemon/smeargle/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Smeargle[] = INCBIN_U32(\"graphics/pokemon/smeargle/shiny.gbapal.lz\");\nconst u8 gMonIcon_Smeargle[] = INCBIN_U8(\"graphics/pokemon/smeargle/icon.4bpp\");\nconst u8 gMonFootprint_Smeargle[] = INCBIN_U8(\"graphics/pokemon/smeargle/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Tyrogue[] = INCBIN_U32(\"graphics/pokemon/tyrogue/front.4bpp.lz\");\nconst u32 gMonPalette_Tyrogue[] = INCBIN_U32(\"graphics/pokemon/tyrogue/normal.gbapal.lz\");\nconst u32 gMonBackPic_Tyrogue[] = INCBIN_U32(\"graphics/pokemon/tyrogue/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Tyrogue[] = INCBIN_U32(\"graphics/pokemon/tyrogue/shiny.gbapal.lz\");\nconst u8 gMonIcon_Tyrogue[] = INCBIN_U8(\"graphics/pokemon/tyrogue/icon.4bpp\");\nconst u8 gMonFootprint_Tyrogue[] = INCBIN_U8(\"graphics/pokemon/tyrogue/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Hitmontop[] = INCBIN_U32(\"graphics/pokemon/hitmontop/front.4bpp.lz\");\nconst u32 gMonPalette_Hitmontop[] = INCBIN_U32(\"graphics/pokemon/hitmontop/normal.gbapal.lz\");\nconst u32 gMonBackPic_Hitmontop[] = INCBIN_U32(\"graphics/pokemon/hitmontop/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Hitmontop[] = INCBIN_U32(\"graphics/pokemon/hitmontop/shiny.gbapal.lz\");\nconst u8 gMonIcon_Hitmontop[] = INCBIN_U8(\"graphics/pokemon/hitmontop/icon.4bpp\");\n\n// This might be undefined memory garbage. Its all 00s except for 1 0F. Its also not referenced.\nconst u32 gUnusedGarbage[] = INCBIN_U32(\"graphics/pokemon/hitmontop/unused_garbage.bin\");\n\nconst u8 gMonFootprint_Hitmontop[] = INCBIN_U8(\"graphics/pokemon/hitmontop/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Smoochum[] = INCBIN_U32(\"graphics/pokemon/smoochum/front.4bpp.lz\");\nconst u32 gMonPalette_Smoochum[] = INCBIN_U32(\"graphics/pokemon/smoochum/normal.gbapal.lz\");\nconst u32 gMonBackPic_Smoochum[] = INCBIN_U32(\"graphics/pokemon/smoochum/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Smoochum[] = INCBIN_U32(\"graphics/pokemon/smoochum/shiny.gbapal.lz\");\nconst u8 gMonIcon_Smoochum[] = INCBIN_U8(\"graphics/pokemon/smoochum/icon.4bpp\");\nconst u8 gMonFootprint_Smoochum[] = INCBIN_U8(\"graphics/pokemon/smoochum/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Elekid[] = INCBIN_U32(\"graphics/pokemon/elekid/front.4bpp.lz\");\nconst u32 gMonPalette_Elekid[] = INCBIN_U32(\"graphics/pokemon/elekid/normal.gbapal.lz\");\nconst u32 gMonBackPic_Elekid[] = INCBIN_U32(\"graphics/pokemon/elekid/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Elekid[] = INCBIN_U32(\"graphics/pokemon/elekid/shiny.gbapal.lz\");\nconst u8 gMonIcon_Elekid[] = INCBIN_U8(\"graphics/pokemon/elekid/icon.4bpp\");\nconst u8 gMonFootprint_Elekid[] = INCBIN_U8(\"graphics/pokemon/elekid/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Magby[] = INCBIN_U32(\"graphics/pokemon/magby/front.4bpp.lz\");\nconst u32 gMonPalette_Magby[] = INCBIN_U32(\"graphics/pokemon/magby/normal.gbapal.lz\");\nconst u32 gMonBackPic_Magby[] = INCBIN_U32(\"graphics/pokemon/magby/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Magby[] = INCBIN_U32(\"graphics/pokemon/magby/shiny.gbapal.lz\");\nconst u8 gMonIcon_Magby[] = INCBIN_U8(\"graphics/pokemon/magby/icon.4bpp\");\nconst u8 gMonFootprint_Magby[] = INCBIN_U8(\"graphics/pokemon/magby/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Miltank[] = INCBIN_U32(\"graphics/pokemon/miltank/front.4bpp.lz\");\nconst u32 gMonPalette_Miltank[] = INCBIN_U32(\"graphics/pokemon/miltank/normal.gbapal.lz\");\nconst u32 gMonBackPic_Miltank[] = INCBIN_U32(\"graphics/pokemon/miltank/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Miltank[] = INCBIN_U32(\"graphics/pokemon/miltank/shiny.gbapal.lz\");\nconst u8 gMonIcon_Miltank[] = INCBIN_U8(\"graphics/pokemon/miltank/icon.4bpp\");\nconst u8 gMonFootprint_Miltank[] = INCBIN_U8(\"graphics/pokemon/miltank/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Blissey[] = INCBIN_U32(\"graphics/pokemon/blissey/front.4bpp.lz\");\nconst u32 gMonPalette_Blissey[] = INCBIN_U32(\"graphics/pokemon/blissey/normal.gbapal.lz\");\nconst u32 gMonBackPic_Blissey[] = INCBIN_U32(\"graphics/pokemon/blissey/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Blissey[] = INCBIN_U32(\"graphics/pokemon/blissey/shiny.gbapal.lz\");\nconst u8 gMonIcon_Blissey[] = INCBIN_U8(\"graphics/pokemon/blissey/icon.4bpp\");\nconst u8 gMonFootprint_Blissey[] = INCBIN_U8(\"graphics/pokemon/blissey/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Raikou[] = INCBIN_U32(\"graphics/pokemon/raikou/front.4bpp.lz\");\nconst u32 gMonPalette_Raikou[] = INCBIN_U32(\"graphics/pokemon/raikou/normal.gbapal.lz\");\nconst u32 gMonBackPic_Raikou[] = INCBIN_U32(\"graphics/pokemon/raikou/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Raikou[] = INCBIN_U32(\"graphics/pokemon/raikou/shiny.gbapal.lz\");\nconst u8 gMonIcon_Raikou[] = INCBIN_U8(\"graphics/pokemon/raikou/icon.4bpp\");\nconst u8 gMonFootprint_Raikou[] = INCBIN_U8(\"graphics/pokemon/raikou/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Entei[] = INCBIN_U32(\"graphics/pokemon/entei/front.4bpp.lz\");\nconst u32 gMonPalette_Entei[] = INCBIN_U32(\"graphics/pokemon/entei/normal.gbapal.lz\");\nconst u32 gMonBackPic_Entei[] = INCBIN_U32(\"graphics/pokemon/entei/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Entei[] = INCBIN_U32(\"graphics/pokemon/entei/shiny.gbapal.lz\");\nconst u8 gMonIcon_Entei[] = INCBIN_U8(\"graphics/pokemon/entei/icon.4bpp\");\nconst u8 gMonFootprint_Entei[] = INCBIN_U8(\"graphics/pokemon/entei/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Suicune[] = INCBIN_U32(\"graphics/pokemon/suicune/front.4bpp.lz\");\nconst u32 gMonPalette_Suicune[] = INCBIN_U32(\"graphics/pokemon/suicune/normal.gbapal.lz\");\nconst u32 gMonBackPic_Suicune[] = INCBIN_U32(\"graphics/pokemon/suicune/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Suicune[] = INCBIN_U32(\"graphics/pokemon/suicune/shiny.gbapal.lz\");\nconst u8 gMonIcon_Suicune[] = INCBIN_U8(\"graphics/pokemon/suicune/icon.4bpp\");\nconst u8 gMonFootprint_Suicune[] = INCBIN_U8(\"graphics/pokemon/suicune/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Larvitar[] = INCBIN_U32(\"graphics/pokemon/larvitar/front.4bpp.lz\");\nconst u32 gMonPalette_Larvitar[] = INCBIN_U32(\"graphics/pokemon/larvitar/normal.gbapal.lz\");\nconst u32 gMonBackPic_Larvitar[] = INCBIN_U32(\"graphics/pokemon/larvitar/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Larvitar[] = INCBIN_U32(\"graphics/pokemon/larvitar/shiny.gbapal.lz\");\nconst u8 gMonIcon_Larvitar[] = INCBIN_U8(\"graphics/pokemon/larvitar/icon.4bpp\");\nconst u8 gMonFootprint_Larvitar[] = INCBIN_U8(\"graphics/pokemon/larvitar/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Pupitar[] = INCBIN_U32(\"graphics/pokemon/pupitar/front.4bpp.lz\");\nconst u32 gMonPalette_Pupitar[] = INCBIN_U32(\"graphics/pokemon/pupitar/normal.gbapal.lz\");\nconst u32 gMonBackPic_Pupitar[] = INCBIN_U32(\"graphics/pokemon/pupitar/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Pupitar[] = INCBIN_U32(\"graphics/pokemon/pupitar/shiny.gbapal.lz\");\nconst u8 gMonIcon_Pupitar[] = INCBIN_U8(\"graphics/pokemon/pupitar/icon.4bpp\");\nconst u8 gMonFootprint_Pupitar[] = INCBIN_U8(\"graphics/pokemon/pupitar/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Tyranitar[] = INCBIN_U32(\"graphics/pokemon/tyranitar/front.4bpp.lz\");\nconst u32 gMonPalette_Tyranitar[] = INCBIN_U32(\"graphics/pokemon/tyranitar/normal.gbapal.lz\");\nconst u32 gMonBackPic_Tyranitar[] = INCBIN_U32(\"graphics/pokemon/tyranitar/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Tyranitar[] = INCBIN_U32(\"graphics/pokemon/tyranitar/shiny.gbapal.lz\");\nconst u8 gMonIcon_Tyranitar[] = INCBIN_U8(\"graphics/pokemon/tyranitar/icon.4bpp\");\nconst u8 gMonFootprint_Tyranitar[] = INCBIN_U8(\"graphics/pokemon/tyranitar/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Lugia[] = INCBIN_U32(\"graphics/pokemon/lugia/front.4bpp.lz\");\nconst u32 gMonPalette_Lugia[] = INCBIN_U32(\"graphics/pokemon/lugia/normal.gbapal.lz\");\nconst u32 gMonBackPic_Lugia[] = INCBIN_U32(\"graphics/pokemon/lugia/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Lugia[] = INCBIN_U32(\"graphics/pokemon/lugia/shiny.gbapal.lz\");\nconst u8 gMonIcon_Lugia[] = INCBIN_U8(\"graphics/pokemon/lugia/icon.4bpp\");\nconst u8 gMonFootprint_Lugia[] = INCBIN_U8(\"graphics/pokemon/lugia/footprint.1bpp\");\n\nconst u32 gMonFrontPic_HoOh[] = INCBIN_U32(\"graphics/pokemon/ho_oh/front.4bpp.lz\");\nconst u32 gMonPalette_HoOh[] = INCBIN_U32(\"graphics/pokemon/ho_oh/normal.gbapal.lz\");\nconst u32 gMonBackPic_HoOh[] = INCBIN_U32(\"graphics/pokemon/ho_oh/back.4bpp.lz\");\nconst u32 gMonShinyPalette_HoOh[] = INCBIN_U32(\"graphics/pokemon/ho_oh/shiny.gbapal.lz\");\nconst u8 gMonIcon_HoOh[] = INCBIN_U8(\"graphics/pokemon/ho_oh/icon.4bpp\");\nconst u8 gMonFootprint_HoOh[] = INCBIN_U8(\"graphics/pokemon/ho_oh/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Celebi[] = INCBIN_U32(\"graphics/pokemon/celebi/front.4bpp.lz\");\nconst u32 gMonPalette_Celebi[] = INCBIN_U32(\"graphics/pokemon/celebi/normal.gbapal.lz\");\nconst u32 gMonBackPic_Celebi[] = INCBIN_U32(\"graphics/pokemon/celebi/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Celebi[] = INCBIN_U32(\"graphics/pokemon/celebi/shiny.gbapal.lz\");\nconst u8 gMonIcon_Celebi[] = INCBIN_U8(\"graphics/pokemon/celebi/icon.4bpp\");\nconst u8 gMonFootprint_Celebi[] = INCBIN_U8(\"graphics/pokemon/celebi/footprint.1bpp\");\n\nconst u32 gMonFrontPic_DoubleQuestionMark[] = INCBIN_U32(\"graphics/pokemon/question_mark/double/front.4bpp.lz\");\nconst u32 gMonPalette_DoubleQuestionMark[] = INCBIN_U32(\"graphics/pokemon/question_mark/double/normal.gbapal.lz\");\nconst u32 gMonBackPic_DoubleQuestionMark[] = INCBIN_U32(\"graphics/pokemon/question_mark/double/back.4bpp.lz\");\nconst u32 gMonShinyPalette_DoubleQuestionMark[] = INCBIN_U32(\"graphics/pokemon/question_mark/double/shiny.gbapal.lz\");\n\nconst u32 gMonFrontPic_Treecko[] = INCBIN_U32(\"graphics/pokemon/treecko/front.4bpp.lz\");\nconst u32 gMonPalette_Treecko[] = INCBIN_U32(\"graphics/pokemon/treecko/normal.gbapal.lz\");\nconst u32 gMonBackPic_Treecko[] = INCBIN_U32(\"graphics/pokemon/treecko/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Treecko[] = INCBIN_U32(\"graphics/pokemon/treecko/shiny.gbapal.lz\");\nconst u8 gMonIcon_Treecko[] = INCBIN_U8(\"graphics/pokemon/treecko/icon.4bpp\");\nconst u8 gMonFootprint_Treecko[] = INCBIN_U8(\"graphics/pokemon/treecko/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Grovyle[] = INCBIN_U32(\"graphics/pokemon/grovyle/front.4bpp.lz\");\nconst u32 gMonPalette_Grovyle[] = INCBIN_U32(\"graphics/pokemon/grovyle/normal.gbapal.lz\");\nconst u32 gMonBackPic_Grovyle[] = INCBIN_U32(\"graphics/pokemon/grovyle/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Grovyle[] = INCBIN_U32(\"graphics/pokemon/grovyle/shiny.gbapal.lz\");\nconst u8 gMonIcon_Grovyle[] = INCBIN_U8(\"graphics/pokemon/grovyle/icon.4bpp\");\nconst u8 gMonFootprint_Grovyle[] = INCBIN_U8(\"graphics/pokemon/grovyle/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Sceptile[] = INCBIN_U32(\"graphics/pokemon/sceptile/front.4bpp.lz\");\nconst u32 gMonPalette_Sceptile[] = INCBIN_U32(\"graphics/pokemon/sceptile/normal.gbapal.lz\");\nconst u32 gMonBackPic_Sceptile[] = INCBIN_U32(\"graphics/pokemon/sceptile/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Sceptile[] = INCBIN_U32(\"graphics/pokemon/sceptile/shiny.gbapal.lz\");\nconst u8 gMonIcon_Sceptile[] = INCBIN_U8(\"graphics/pokemon/sceptile/icon.4bpp\");\nconst u8 gMonFootprint_Sceptile[] = INCBIN_U8(\"graphics/pokemon/sceptile/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Torchic[] = INCBIN_U32(\"graphics/pokemon/torchic/front.4bpp.lz\");\nconst u32 gMonPalette_Torchic[] = INCBIN_U32(\"graphics/pokemon/torchic/normal.gbapal.lz\");\nconst u32 gMonBackPic_Torchic[] = INCBIN_U32(\"graphics/pokemon/torchic/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Torchic[] = INCBIN_U32(\"graphics/pokemon/torchic/shiny.gbapal.lz\");\nconst u8 gMonIcon_Torchic[] = INCBIN_U8(\"graphics/pokemon/torchic/icon.4bpp\");\nconst u8 gMonFootprint_Torchic[] = INCBIN_U8(\"graphics/pokemon/torchic/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Combusken[] = INCBIN_U32(\"graphics/pokemon/combusken/front.4bpp.lz\");\nconst u32 gMonPalette_Combusken[] = INCBIN_U32(\"graphics/pokemon/combusken/normal.gbapal.lz\");\nconst u32 gMonBackPic_Combusken[] = INCBIN_U32(\"graphics/pokemon/combusken/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Combusken[] = INCBIN_U32(\"graphics/pokemon/combusken/shiny.gbapal.lz\");\nconst u8 gMonIcon_Combusken[] = INCBIN_U8(\"graphics/pokemon/combusken/icon.4bpp\");\nconst u8 gMonFootprint_Combusken[] = INCBIN_U8(\"graphics/pokemon/combusken/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Blaziken[] = INCBIN_U32(\"graphics/pokemon/blaziken/front.4bpp.lz\");\nconst u32 gMonPalette_Blaziken[] = INCBIN_U32(\"graphics/pokemon/blaziken/normal.gbapal.lz\");\nconst u32 gMonBackPic_Blaziken[] = INCBIN_U32(\"graphics/pokemon/blaziken/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Blaziken[] = INCBIN_U32(\"graphics/pokemon/blaziken/shiny.gbapal.lz\");\nconst u8 gMonIcon_Blaziken[] = INCBIN_U8(\"graphics/pokemon/blaziken/icon.4bpp\");\nconst u8 gMonFootprint_Blaziken[] = INCBIN_U8(\"graphics/pokemon/blaziken/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Mudkip[] = INCBIN_U32(\"graphics/pokemon/mudkip/front.4bpp.lz\");\nconst u32 gMonPalette_Mudkip[] = INCBIN_U32(\"graphics/pokemon/mudkip/normal.gbapal.lz\");\nconst u32 gMonBackPic_Mudkip[] = INCBIN_U32(\"graphics/pokemon/mudkip/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Mudkip[] = INCBIN_U32(\"graphics/pokemon/mudkip/shiny.gbapal.lz\");\nconst u8 gMonIcon_Mudkip[] = INCBIN_U8(\"graphics/pokemon/mudkip/icon.4bpp\");\nconst u8 gMonFootprint_Mudkip[] = INCBIN_U8(\"graphics/pokemon/mudkip/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Marshtomp[] = INCBIN_U32(\"graphics/pokemon/marshtomp/front.4bpp.lz\");\nconst u32 gMonPalette_Marshtomp[] = INCBIN_U32(\"graphics/pokemon/marshtomp/normal.gbapal.lz\");\nconst u32 gMonBackPic_Marshtomp[] = INCBIN_U32(\"graphics/pokemon/marshtomp/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Marshtomp[] = INCBIN_U32(\"graphics/pokemon/marshtomp/shiny.gbapal.lz\");\nconst u8 gMonIcon_Marshtomp[] = INCBIN_U8(\"graphics/pokemon/marshtomp/icon.4bpp\");\nconst u8 gMonFootprint_Marshtomp[] = INCBIN_U8(\"graphics/pokemon/marshtomp/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Swampert[] = INCBIN_U32(\"graphics/pokemon/swampert/front.4bpp.lz\");\nconst u32 gMonPalette_Swampert[] = INCBIN_U32(\"graphics/pokemon/swampert/normal.gbapal.lz\");\nconst u32 gMonBackPic_Swampert[] = INCBIN_U32(\"graphics/pokemon/swampert/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Swampert[] = INCBIN_U32(\"graphics/pokemon/swampert/shiny.gbapal.lz\");\nconst u8 gMonIcon_Swampert[] = INCBIN_U8(\"graphics/pokemon/swampert/icon.4bpp\");\nconst u8 gMonFootprint_Swampert[] = INCBIN_U8(\"graphics/pokemon/swampert/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Poochyena[] = INCBIN_U32(\"graphics/pokemon/poochyena/front.4bpp.lz\");\nconst u32 gMonPalette_Poochyena[] = INCBIN_U32(\"graphics/pokemon/poochyena/normal.gbapal.lz\");\nconst u32 gMonBackPic_Poochyena[] = INCBIN_U32(\"graphics/pokemon/poochyena/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Poochyena[] = INCBIN_U32(\"graphics/pokemon/poochyena/shiny.gbapal.lz\");\nconst u8 gMonIcon_Poochyena[] = INCBIN_U8(\"graphics/pokemon/poochyena/icon.4bpp\");\nconst u8 gMonFootprint_Poochyena[] = INCBIN_U8(\"graphics/pokemon/poochyena/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Mightyena[] = INCBIN_U32(\"graphics/pokemon/mightyena/front.4bpp.lz\");\nconst u32 gMonPalette_Mightyena[] = INCBIN_U32(\"graphics/pokemon/mightyena/normal.gbapal.lz\");\nconst u32 gMonBackPic_Mightyena[] = INCBIN_U32(\"graphics/pokemon/mightyena/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Mightyena[] = INCBIN_U32(\"graphics/pokemon/mightyena/shiny.gbapal.lz\");\nconst u8 gMonIcon_Mightyena[] = INCBIN_U8(\"graphics/pokemon/mightyena/icon.4bpp\");\nconst u8 gMonFootprint_Mightyena[] = INCBIN_U8(\"graphics/pokemon/mightyena/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Zigzagoon[] = INCBIN_U32(\"graphics/pokemon/zigzagoon/front.4bpp.lz\");\nconst u32 gMonPalette_Zigzagoon[] = INCBIN_U32(\"graphics/pokemon/zigzagoon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Zigzagoon[] = INCBIN_U32(\"graphics/pokemon/zigzagoon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Zigzagoon[] = INCBIN_U32(\"graphics/pokemon/zigzagoon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Zigzagoon[] = INCBIN_U8(\"graphics/pokemon/zigzagoon/icon.4bpp\");\nconst u8 gMonFootprint_Zigzagoon[] = INCBIN_U8(\"graphics/pokemon/zigzagoon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Linoone[] = INCBIN_U32(\"graphics/pokemon/linoone/front.4bpp.lz\");\nconst u32 gMonPalette_Linoone[] = INCBIN_U32(\"graphics/pokemon/linoone/normal.gbapal.lz\");\nconst u32 gMonBackPic_Linoone[] = INCBIN_U32(\"graphics/pokemon/linoone/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Linoone[] = INCBIN_U32(\"graphics/pokemon/linoone/shiny.gbapal.lz\");\nconst u8 gMonIcon_Linoone[] = INCBIN_U8(\"graphics/pokemon/linoone/icon.4bpp\");\nconst u8 gMonFootprint_Linoone[] = INCBIN_U8(\"graphics/pokemon/linoone/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Wurmple[] = INCBIN_U32(\"graphics/pokemon/wurmple/front.4bpp.lz\");\nconst u32 gMonPalette_Wurmple[] = INCBIN_U32(\"graphics/pokemon/wurmple/normal.gbapal.lz\");\nconst u32 gMonBackPic_Wurmple[] = INCBIN_U32(\"graphics/pokemon/wurmple/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Wurmple[] = INCBIN_U32(\"graphics/pokemon/wurmple/shiny.gbapal.lz\");\nconst u8 gMonIcon_Wurmple[] = INCBIN_U8(\"graphics/pokemon/wurmple/icon.4bpp\");\nconst u8 gMonFootprint_Wurmple[] = INCBIN_U8(\"graphics/pokemon/wurmple/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Silcoon[] = INCBIN_U32(\"graphics/pokemon/silcoon/front.4bpp.lz\");\nconst u32 gMonPalette_Silcoon[] = INCBIN_U32(\"graphics/pokemon/silcoon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Silcoon[] = INCBIN_U32(\"graphics/pokemon/silcoon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Silcoon[] = INCBIN_U32(\"graphics/pokemon/silcoon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Silcoon[] = INCBIN_U8(\"graphics/pokemon/silcoon/icon.4bpp\");\nconst u8 gMonFootprint_Silcoon[] = INCBIN_U8(\"graphics/pokemon/silcoon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Beautifly[] = INCBIN_U32(\"graphics/pokemon/beautifly/front.4bpp.lz\");\nconst u32 gMonPalette_Beautifly[] = INCBIN_U32(\"graphics/pokemon/beautifly/normal.gbapal.lz\");\nconst u32 gMonBackPic_Beautifly[] = INCBIN_U32(\"graphics/pokemon/beautifly/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Beautifly[] = INCBIN_U32(\"graphics/pokemon/beautifly/shiny.gbapal.lz\");\nconst u8 gMonIcon_Beautifly[] = INCBIN_U8(\"graphics/pokemon/beautifly/icon.4bpp\");\nconst u8 gMonFootprint_Beautifly[] = INCBIN_U8(\"graphics/pokemon/beautifly/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Cascoon[] = INCBIN_U32(\"graphics/pokemon/cascoon/front.4bpp.lz\");\nconst u32 gMonPalette_Cascoon[] = INCBIN_U32(\"graphics/pokemon/cascoon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Cascoon[] = INCBIN_U32(\"graphics/pokemon/cascoon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Cascoon[] = INCBIN_U32(\"graphics/pokemon/cascoon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Cascoon[] = INCBIN_U8(\"graphics/pokemon/cascoon/icon.4bpp\");\nconst u8 gMonFootprint_Cascoon[] = INCBIN_U8(\"graphics/pokemon/cascoon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Dustox[] = INCBIN_U32(\"graphics/pokemon/dustox/front.4bpp.lz\");\nconst u32 gMonPalette_Dustox[] = INCBIN_U32(\"graphics/pokemon/dustox/normal.gbapal.lz\");\nconst u32 gMonBackPic_Dustox[] = INCBIN_U32(\"graphics/pokemon/dustox/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Dustox[] = INCBIN_U32(\"graphics/pokemon/dustox/shiny.gbapal.lz\");\nconst u8 gMonIcon_Dustox[] = INCBIN_U8(\"graphics/pokemon/dustox/icon.4bpp\");\nconst u8 gMonFootprint_Dustox[] = INCBIN_U8(\"graphics/pokemon/dustox/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Lotad[] = INCBIN_U32(\"graphics/pokemon/lotad/front.4bpp.lz\");\nconst u32 gMonPalette_Lotad[] = INCBIN_U32(\"graphics/pokemon/lotad/normal.gbapal.lz\");\nconst u32 gMonBackPic_Lotad[] = INCBIN_U32(\"graphics/pokemon/lotad/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Lotad[] = INCBIN_U32(\"graphics/pokemon/lotad/shiny.gbapal.lz\");\nconst u8 gMonIcon_Lotad[] = INCBIN_U8(\"graphics/pokemon/lotad/icon.4bpp\");\nconst u8 gMonFootprint_Lotad[] = INCBIN_U8(\"graphics/pokemon/lotad/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Lombre[] = INCBIN_U32(\"graphics/pokemon/lombre/front.4bpp.lz\");\nconst u32 gMonPalette_Lombre[] = INCBIN_U32(\"graphics/pokemon/lombre/normal.gbapal.lz\");\nconst u32 gMonBackPic_Lombre[] = INCBIN_U32(\"graphics/pokemon/lombre/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Lombre[] = INCBIN_U32(\"graphics/pokemon/lombre/shiny.gbapal.lz\");\nconst u8 gMonIcon_Lombre[] = INCBIN_U8(\"graphics/pokemon/lombre/icon.4bpp\");\nconst u8 gMonFootprint_Lombre[] = INCBIN_U8(\"graphics/pokemon/lombre/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ludicolo[] = INCBIN_U32(\"graphics/pokemon/ludicolo/front.4bpp.lz\");\nconst u32 gMonPalette_Ludicolo[] = INCBIN_U32(\"graphics/pokemon/ludicolo/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ludicolo[] = INCBIN_U32(\"graphics/pokemon/ludicolo/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ludicolo[] = INCBIN_U32(\"graphics/pokemon/ludicolo/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ludicolo[] = INCBIN_U8(\"graphics/pokemon/ludicolo/icon.4bpp\");\nconst u8 gMonFootprint_Ludicolo[] = INCBIN_U8(\"graphics/pokemon/ludicolo/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Seedot[] = INCBIN_U32(\"graphics/pokemon/seedot/front.4bpp.lz\");\nconst u32 gMonPalette_Seedot[] = INCBIN_U32(\"graphics/pokemon/seedot/normal.gbapal.lz\");\nconst u32 gMonBackPic_Seedot[] = INCBIN_U32(\"graphics/pokemon/seedot/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Seedot[] = INCBIN_U32(\"graphics/pokemon/seedot/shiny.gbapal.lz\");\nconst u8 gMonIcon_Seedot[] = INCBIN_U8(\"graphics/pokemon/seedot/icon.4bpp\");\nconst u8 gMonFootprint_Seedot[] = INCBIN_U8(\"graphics/pokemon/seedot/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Nuzleaf[] = INCBIN_U32(\"graphics/pokemon/nuzleaf/front.4bpp.lz\");\nconst u32 gMonPalette_Nuzleaf[] = INCBIN_U32(\"graphics/pokemon/nuzleaf/normal.gbapal.lz\");\nconst u32 gMonBackPic_Nuzleaf[] = INCBIN_U32(\"graphics/pokemon/nuzleaf/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Nuzleaf[] = INCBIN_U32(\"graphics/pokemon/nuzleaf/shiny.gbapal.lz\");\nconst u8 gMonIcon_Nuzleaf[] = INCBIN_U8(\"graphics/pokemon/nuzleaf/icon.4bpp\");\nconst u8 gMonFootprint_Nuzleaf[] = INCBIN_U8(\"graphics/pokemon/nuzleaf/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Shiftry[] = INCBIN_U32(\"graphics/pokemon/shiftry/front.4bpp.lz\");\nconst u32 gMonPalette_Shiftry[] = INCBIN_U32(\"graphics/pokemon/shiftry/normal.gbapal.lz\");\nconst u32 gMonBackPic_Shiftry[] = INCBIN_U32(\"graphics/pokemon/shiftry/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Shiftry[] = INCBIN_U32(\"graphics/pokemon/shiftry/shiny.gbapal.lz\");\nconst u8 gMonIcon_Shiftry[] = INCBIN_U8(\"graphics/pokemon/shiftry/icon.4bpp\");\nconst u8 gMonFootprint_Shiftry[] = INCBIN_U8(\"graphics/pokemon/shiftry/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Nincada[] = INCBIN_U32(\"graphics/pokemon/nincada/front.4bpp.lz\");\nconst u32 gMonPalette_Nincada[] = INCBIN_U32(\"graphics/pokemon/nincada/normal.gbapal.lz\");\nconst u32 gMonBackPic_Nincada[] = INCBIN_U32(\"graphics/pokemon/nincada/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Nincada[] = INCBIN_U32(\"graphics/pokemon/nincada/shiny.gbapal.lz\");\nconst u8 gMonIcon_Nincada[] = INCBIN_U8(\"graphics/pokemon/nincada/icon.4bpp\");\nconst u8 gMonFootprint_Nincada[] = INCBIN_U8(\"graphics/pokemon/nincada/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ninjask[] = INCBIN_U32(\"graphics/pokemon/ninjask/front.4bpp.lz\");\nconst u32 gMonPalette_Ninjask[] = INCBIN_U32(\"graphics/pokemon/ninjask/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ninjask[] = INCBIN_U32(\"graphics/pokemon/ninjask/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ninjask[] = INCBIN_U32(\"graphics/pokemon/ninjask/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ninjask[] = INCBIN_U8(\"graphics/pokemon/ninjask/icon.4bpp\");\nconst u8 gMonFootprint_Ninjask[] = INCBIN_U8(\"graphics/pokemon/ninjask/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Shedinja[] = INCBIN_U32(\"graphics/pokemon/shedinja/front.4bpp.lz\");\nconst u32 gMonPalette_Shedinja[] = INCBIN_U32(\"graphics/pokemon/shedinja/normal.gbapal.lz\");\nconst u32 gMonBackPic_Shedinja[] = INCBIN_U32(\"graphics/pokemon/shedinja/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Shedinja[] = INCBIN_U32(\"graphics/pokemon/shedinja/shiny.gbapal.lz\");\nconst u8 gMonIcon_Shedinja[] = INCBIN_U8(\"graphics/pokemon/shedinja/icon.4bpp\");\nconst u8 gMonFootprint_Shedinja[] = INCBIN_U8(\"graphics/pokemon/shedinja/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Taillow[] = INCBIN_U32(\"graphics/pokemon/taillow/front.4bpp.lz\");\nconst u32 gMonPalette_Taillow[] = INCBIN_U32(\"graphics/pokemon/taillow/normal.gbapal.lz\");\nconst u32 gMonBackPic_Taillow[] = INCBIN_U32(\"graphics/pokemon/taillow/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Taillow[] = INCBIN_U32(\"graphics/pokemon/taillow/shiny.gbapal.lz\");\nconst u8 gMonIcon_Taillow[] = INCBIN_U8(\"graphics/pokemon/taillow/icon.4bpp\");\nconst u8 gMonFootprint_Taillow[] = INCBIN_U8(\"graphics/pokemon/taillow/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Swellow[] = INCBIN_U32(\"graphics/pokemon/swellow/front.4bpp.lz\");\nconst u32 gMonPalette_Swellow[] = INCBIN_U32(\"graphics/pokemon/swellow/normal.gbapal.lz\");\nconst u32 gMonBackPic_Swellow[] = INCBIN_U32(\"graphics/pokemon/swellow/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Swellow[] = INCBIN_U32(\"graphics/pokemon/swellow/shiny.gbapal.lz\");\nconst u8 gMonIcon_Swellow[] = INCBIN_U8(\"graphics/pokemon/swellow/icon.4bpp\");\nconst u8 gMonFootprint_Swellow[] = INCBIN_U8(\"graphics/pokemon/swellow/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Shroomish[] = INCBIN_U32(\"graphics/pokemon/shroomish/front.4bpp.lz\");\nconst u32 gMonPalette_Shroomish[] = INCBIN_U32(\"graphics/pokemon/shroomish/normal.gbapal.lz\");\nconst u32 gMonBackPic_Shroomish[] = INCBIN_U32(\"graphics/pokemon/shroomish/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Shroomish[] = INCBIN_U32(\"graphics/pokemon/shroomish/shiny.gbapal.lz\");\nconst u8 gMonIcon_Shroomish[] = INCBIN_U8(\"graphics/pokemon/shroomish/icon.4bpp\");\nconst u8 gMonFootprint_Shroomish[] = INCBIN_U8(\"graphics/pokemon/shroomish/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Breloom[] = INCBIN_U32(\"graphics/pokemon/breloom/front.4bpp.lz\");\nconst u32 gMonPalette_Breloom[] = INCBIN_U32(\"graphics/pokemon/breloom/normal.gbapal.lz\");\nconst u32 gMonBackPic_Breloom[] = INCBIN_U32(\"graphics/pokemon/breloom/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Breloom[] = INCBIN_U32(\"graphics/pokemon/breloom/shiny.gbapal.lz\");\nconst u8 gMonIcon_Breloom[] = INCBIN_U8(\"graphics/pokemon/breloom/icon.4bpp\");\nconst u8 gMonFootprint_Breloom[] = INCBIN_U8(\"graphics/pokemon/breloom/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Spinda[] = INCBIN_U32(\"graphics/pokemon/spinda/front.4bpp.lz\");\nconst u32 gMonPalette_Spinda[] = INCBIN_U32(\"graphics/pokemon/spinda/normal.gbapal.lz\");\nconst u32 gMonBackPic_Spinda[] = INCBIN_U32(\"graphics/pokemon/spinda/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Spinda[] = INCBIN_U32(\"graphics/pokemon/spinda/shiny.gbapal.lz\");\nconst u8 gMonIcon_Spinda[] = INCBIN_U8(\"graphics/pokemon/spinda/icon.4bpp\");\nconst u8 gMonFootprint_Spinda[] = INCBIN_U8(\"graphics/pokemon/spinda/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Wingull[] = INCBIN_U32(\"graphics/pokemon/wingull/front.4bpp.lz\");\nconst u32 gMonPalette_Wingull[] = INCBIN_U32(\"graphics/pokemon/wingull/normal.gbapal.lz\");\nconst u32 gMonBackPic_Wingull[] = INCBIN_U32(\"graphics/pokemon/wingull/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Wingull[] = INCBIN_U32(\"graphics/pokemon/wingull/shiny.gbapal.lz\");\nconst u8 gMonIcon_Wingull[] = INCBIN_U8(\"graphics/pokemon/wingull/icon.4bpp\");\nconst u8 gMonFootprint_Wingull[] = INCBIN_U8(\"graphics/pokemon/wingull/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Pelipper[] = INCBIN_U32(\"graphics/pokemon/pelipper/front.4bpp.lz\");\nconst u32 gMonPalette_Pelipper[] = INCBIN_U32(\"graphics/pokemon/pelipper/normal.gbapal.lz\");\nconst u32 gMonBackPic_Pelipper[] = INCBIN_U32(\"graphics/pokemon/pelipper/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Pelipper[] = INCBIN_U32(\"graphics/pokemon/pelipper/shiny.gbapal.lz\");\nconst u8 gMonIcon_Pelipper[] = INCBIN_U8(\"graphics/pokemon/pelipper/icon.4bpp\");\nconst u8 gMonFootprint_Pelipper[] = INCBIN_U8(\"graphics/pokemon/pelipper/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Surskit[] = INCBIN_U32(\"graphics/pokemon/surskit/front.4bpp.lz\");\nconst u32 gMonPalette_Surskit[] = INCBIN_U32(\"graphics/pokemon/surskit/normal.gbapal.lz\");\nconst u32 gMonBackPic_Surskit[] = INCBIN_U32(\"graphics/pokemon/surskit/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Surskit[] = INCBIN_U32(\"graphics/pokemon/surskit/shiny.gbapal.lz\");\nconst u8 gMonIcon_Surskit[] = INCBIN_U8(\"graphics/pokemon/surskit/icon.4bpp\");\nconst u8 gMonFootprint_Surskit[] = INCBIN_U8(\"graphics/pokemon/surskit/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Masquerain[] = INCBIN_U32(\"graphics/pokemon/masquerain/front.4bpp.lz\");\nconst u32 gMonPalette_Masquerain[] = INCBIN_U32(\"graphics/pokemon/masquerain/normal.gbapal.lz\");\nconst u32 gMonBackPic_Masquerain[] = INCBIN_U32(\"graphics/pokemon/masquerain/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Masquerain[] = INCBIN_U32(\"graphics/pokemon/masquerain/shiny.gbapal.lz\");\nconst u8 gMonIcon_Masquerain[] = INCBIN_U8(\"graphics/pokemon/masquerain/icon.4bpp\");\nconst u8 gMonFootprint_Masquerain[] = INCBIN_U8(\"graphics/pokemon/masquerain/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Wailmer[] = INCBIN_U32(\"graphics/pokemon/wailmer/front.4bpp.lz\");\nconst u32 gMonPalette_Wailmer[] = INCBIN_U32(\"graphics/pokemon/wailmer/normal.gbapal.lz\");\nconst u32 gMonBackPic_Wailmer[] = INCBIN_U32(\"graphics/pokemon/wailmer/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Wailmer[] = INCBIN_U32(\"graphics/pokemon/wailmer/shiny.gbapal.lz\");\nconst u8 gMonIcon_Wailmer[] = INCBIN_U8(\"graphics/pokemon/wailmer/icon.4bpp\");\nconst u8 gMonFootprint_Wailmer[] = INCBIN_U8(\"graphics/pokemon/wailmer/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Wailord[] = INCBIN_U32(\"graphics/pokemon/wailord/front.4bpp.lz\");\nconst u32 gMonPalette_Wailord[] = INCBIN_U32(\"graphics/pokemon/wailord/normal.gbapal.lz\");\nconst u32 gMonBackPic_Wailord[] = INCBIN_U32(\"graphics/pokemon/wailord/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Wailord[] = INCBIN_U32(\"graphics/pokemon/wailord/shiny.gbapal.lz\");\nconst u8 gMonIcon_Wailord[] = INCBIN_U8(\"graphics/pokemon/wailord/icon.4bpp\");\nconst u8 gMonFootprint_Wailord[] = INCBIN_U8(\"graphics/pokemon/wailord/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Skitty[] = INCBIN_U32(\"graphics/pokemon/skitty/front.4bpp.lz\");\nconst u32 gMonPalette_Skitty[] = INCBIN_U32(\"graphics/pokemon/skitty/normal.gbapal.lz\");\nconst u32 gMonBackPic_Skitty[] = INCBIN_U32(\"graphics/pokemon/skitty/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Skitty[] = INCBIN_U32(\"graphics/pokemon/skitty/shiny.gbapal.lz\");\nconst u8 gMonIcon_Skitty[] = INCBIN_U8(\"graphics/pokemon/skitty/icon.4bpp\");\nconst u8 gMonFootprint_Skitty[] = INCBIN_U8(\"graphics/pokemon/skitty/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Delcatty[] = INCBIN_U32(\"graphics/pokemon/delcatty/front.4bpp.lz\");\nconst u32 gMonPalette_Delcatty[] = INCBIN_U32(\"graphics/pokemon/delcatty/normal.gbapal.lz\");\nconst u32 gMonBackPic_Delcatty[] = INCBIN_U32(\"graphics/pokemon/delcatty/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Delcatty[] = INCBIN_U32(\"graphics/pokemon/delcatty/shiny.gbapal.lz\");\nconst u8 gMonIcon_Delcatty[] = INCBIN_U8(\"graphics/pokemon/delcatty/icon.4bpp\");\nconst u8 gMonFootprint_Delcatty[] = INCBIN_U8(\"graphics/pokemon/delcatty/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Kecleon[] = INCBIN_U32(\"graphics/pokemon/kecleon/front.4bpp.lz\");\nconst u32 gMonPalette_Kecleon[] = INCBIN_U32(\"graphics/pokemon/kecleon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Kecleon[] = INCBIN_U32(\"graphics/pokemon/kecleon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Kecleon[] = INCBIN_U32(\"graphics/pokemon/kecleon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Kecleon[] = INCBIN_U8(\"graphics/pokemon/kecleon/icon.4bpp\");\nconst u8 gMonFootprint_Kecleon[] = INCBIN_U8(\"graphics/pokemon/kecleon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Baltoy[] = INCBIN_U32(\"graphics/pokemon/baltoy/front.4bpp.lz\");\nconst u32 gMonPalette_Baltoy[] = INCBIN_U32(\"graphics/pokemon/baltoy/normal.gbapal.lz\");\nconst u32 gMonBackPic_Baltoy[] = INCBIN_U32(\"graphics/pokemon/baltoy/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Baltoy[] = INCBIN_U32(\"graphics/pokemon/baltoy/shiny.gbapal.lz\");\nconst u8 gMonIcon_Baltoy[] = INCBIN_U8(\"graphics/pokemon/baltoy/icon.4bpp\");\nconst u8 gMonFootprint_Baltoy[] = INCBIN_U8(\"graphics/pokemon/baltoy/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Claydol[] = INCBIN_U32(\"graphics/pokemon/claydol/front.4bpp.lz\");\nconst u32 gMonPalette_Claydol[] = INCBIN_U32(\"graphics/pokemon/claydol/normal.gbapal.lz\");\nconst u32 gMonBackPic_Claydol[] = INCBIN_U32(\"graphics/pokemon/claydol/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Claydol[] = INCBIN_U32(\"graphics/pokemon/claydol/shiny.gbapal.lz\");\nconst u8 gMonIcon_Claydol[] = INCBIN_U8(\"graphics/pokemon/claydol/icon.4bpp\");\nconst u8 gMonFootprint_Claydol[] = INCBIN_U8(\"graphics/pokemon/claydol/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Nosepass[] = INCBIN_U32(\"graphics/pokemon/nosepass/front.4bpp.lz\");\nconst u32 gMonPalette_Nosepass[] = INCBIN_U32(\"graphics/pokemon/nosepass/normal.gbapal.lz\");\nconst u32 gMonBackPic_Nosepass[] = INCBIN_U32(\"graphics/pokemon/nosepass/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Nosepass[] = INCBIN_U32(\"graphics/pokemon/nosepass/shiny.gbapal.lz\");\nconst u8 gMonIcon_Nosepass[] = INCBIN_U8(\"graphics/pokemon/nosepass/icon.4bpp\");\nconst u8 gMonFootprint_Nosepass[] = INCBIN_U8(\"graphics/pokemon/nosepass/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Torkoal[] = INCBIN_U32(\"graphics/pokemon/torkoal/front.4bpp.lz\");\nconst u32 gMonPalette_Torkoal[] = INCBIN_U32(\"graphics/pokemon/torkoal/normal.gbapal.lz\");\nconst u32 gMonBackPic_Torkoal[] = INCBIN_U32(\"graphics/pokemon/torkoal/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Torkoal[] = INCBIN_U32(\"graphics/pokemon/torkoal/shiny.gbapal.lz\");\nconst u8 gMonIcon_Torkoal[] = INCBIN_U8(\"graphics/pokemon/torkoal/icon.4bpp\");\nconst u8 gMonFootprint_Torkoal[] = INCBIN_U8(\"graphics/pokemon/torkoal/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Sableye[] = INCBIN_U32(\"graphics/pokemon/sableye/front.4bpp.lz\");\nconst u32 gMonPalette_Sableye[] = INCBIN_U32(\"graphics/pokemon/sableye/normal.gbapal.lz\");\nconst u32 gMonBackPic_Sableye[] = INCBIN_U32(\"graphics/pokemon/sableye/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Sableye[] = INCBIN_U32(\"graphics/pokemon/sableye/shiny.gbapal.lz\");\nconst u8 gMonIcon_Sableye[] = INCBIN_U8(\"graphics/pokemon/sableye/icon.4bpp\");\nconst u8 gMonFootprint_Sableye[] = INCBIN_U8(\"graphics/pokemon/sableye/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Barboach[] = INCBIN_U32(\"graphics/pokemon/barboach/front.4bpp.lz\");\nconst u32 gMonPalette_Barboach[] = INCBIN_U32(\"graphics/pokemon/barboach/normal.gbapal.lz\");\nconst u32 gMonBackPic_Barboach[] = INCBIN_U32(\"graphics/pokemon/barboach/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Barboach[] = INCBIN_U32(\"graphics/pokemon/barboach/shiny.gbapal.lz\");\nconst u8 gMonIcon_Barboach[] = INCBIN_U8(\"graphics/pokemon/barboach/icon.4bpp\");\nconst u8 gMonFootprint_Barboach[] = INCBIN_U8(\"graphics/pokemon/barboach/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Whiscash[] = INCBIN_U32(\"graphics/pokemon/whiscash/front.4bpp.lz\");\nconst u32 gMonPalette_Whiscash[] = INCBIN_U32(\"graphics/pokemon/whiscash/normal.gbapal.lz\");\nconst u32 gMonBackPic_Whiscash[] = INCBIN_U32(\"graphics/pokemon/whiscash/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Whiscash[] = INCBIN_U32(\"graphics/pokemon/whiscash/shiny.gbapal.lz\");\nconst u8 gMonIcon_Whiscash[] = INCBIN_U8(\"graphics/pokemon/whiscash/icon.4bpp\");\nconst u8 gMonFootprint_Whiscash[] = INCBIN_U8(\"graphics/pokemon/whiscash/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Luvdisc[] = INCBIN_U32(\"graphics/pokemon/luvdisc/front.4bpp.lz\");\nconst u32 gMonPalette_Luvdisc[] = INCBIN_U32(\"graphics/pokemon/luvdisc/normal.gbapal.lz\");\nconst u32 gMonBackPic_Luvdisc[] = INCBIN_U32(\"graphics/pokemon/luvdisc/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Luvdisc[] = INCBIN_U32(\"graphics/pokemon/luvdisc/shiny.gbapal.lz\");\nconst u8 gMonIcon_Luvdisc[] = INCBIN_U8(\"graphics/pokemon/luvdisc/icon.4bpp\");\nconst u8 gMonFootprint_Luvdisc[] = INCBIN_U8(\"graphics/pokemon/luvdisc/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Corphish[] = INCBIN_U32(\"graphics/pokemon/corphish/front.4bpp.lz\");\nconst u32 gMonPalette_Corphish[] = INCBIN_U32(\"graphics/pokemon/corphish/normal.gbapal.lz\");\nconst u32 gMonBackPic_Corphish[] = INCBIN_U32(\"graphics/pokemon/corphish/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Corphish[] = INCBIN_U32(\"graphics/pokemon/corphish/shiny.gbapal.lz\");\nconst u8 gMonIcon_Corphish[] = INCBIN_U8(\"graphics/pokemon/corphish/icon.4bpp\");\nconst u8 gMonFootprint_Corphish[] = INCBIN_U8(\"graphics/pokemon/corphish/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Crawdaunt[] = INCBIN_U32(\"graphics/pokemon/crawdaunt/front.4bpp.lz\");\nconst u32 gMonPalette_Crawdaunt[] = INCBIN_U32(\"graphics/pokemon/crawdaunt/normal.gbapal.lz\");\nconst u32 gMonBackPic_Crawdaunt[] = INCBIN_U32(\"graphics/pokemon/crawdaunt/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Crawdaunt[] = INCBIN_U32(\"graphics/pokemon/crawdaunt/shiny.gbapal.lz\");\nconst u8 gMonIcon_Crawdaunt[] = INCBIN_U8(\"graphics/pokemon/crawdaunt/icon.4bpp\");\nconst u8 gMonFootprint_Crawdaunt[] = INCBIN_U8(\"graphics/pokemon/crawdaunt/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Feebas[] = INCBIN_U32(\"graphics/pokemon/feebas/front.4bpp.lz\");\nconst u32 gMonPalette_Feebas[] = INCBIN_U32(\"graphics/pokemon/feebas/normal.gbapal.lz\");\nconst u32 gMonBackPic_Feebas[] = INCBIN_U32(\"graphics/pokemon/feebas/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Feebas[] = INCBIN_U32(\"graphics/pokemon/feebas/shiny.gbapal.lz\");\nconst u8 gMonIcon_Feebas[] = INCBIN_U8(\"graphics/pokemon/feebas/icon.4bpp\");\nconst u8 gMonFootprint_Feebas[] = INCBIN_U8(\"graphics/pokemon/feebas/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Milotic[] = INCBIN_U32(\"graphics/pokemon/milotic/front.4bpp.lz\");\nconst u32 gMonPalette_Milotic[] = INCBIN_U32(\"graphics/pokemon/milotic/normal.gbapal.lz\");\nconst u32 gMonBackPic_Milotic[] = INCBIN_U32(\"graphics/pokemon/milotic/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Milotic[] = INCBIN_U32(\"graphics/pokemon/milotic/shiny.gbapal.lz\");\nconst u8 gMonIcon_Milotic[] = INCBIN_U8(\"graphics/pokemon/milotic/icon.4bpp\");\nconst u8 gMonFootprint_Milotic[] = INCBIN_U8(\"graphics/pokemon/milotic/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Carvanha[] = INCBIN_U32(\"graphics/pokemon/carvanha/front.4bpp.lz\");\nconst u32 gMonPalette_Carvanha[] = INCBIN_U32(\"graphics/pokemon/carvanha/normal.gbapal.lz\");\nconst u32 gMonBackPic_Carvanha[] = INCBIN_U32(\"graphics/pokemon/carvanha/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Carvanha[] = INCBIN_U32(\"graphics/pokemon/carvanha/shiny.gbapal.lz\");\nconst u8 gMonIcon_Carvanha[] = INCBIN_U8(\"graphics/pokemon/carvanha/icon.4bpp\");\nconst u8 gMonFootprint_Carvanha[] = INCBIN_U8(\"graphics/pokemon/carvanha/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Sharpedo[] = INCBIN_U32(\"graphics/pokemon/sharpedo/front.4bpp.lz\");\nconst u32 gMonPalette_Sharpedo[] = INCBIN_U32(\"graphics/pokemon/sharpedo/normal.gbapal.lz\");\nconst u32 gMonBackPic_Sharpedo[] = INCBIN_U32(\"graphics/pokemon/sharpedo/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Sharpedo[] = INCBIN_U32(\"graphics/pokemon/sharpedo/shiny.gbapal.lz\");\nconst u8 gMonIcon_Sharpedo[] = INCBIN_U8(\"graphics/pokemon/sharpedo/icon.4bpp\");\nconst u8 gMonFootprint_Sharpedo[] = INCBIN_U8(\"graphics/pokemon/sharpedo/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Trapinch[] = INCBIN_U32(\"graphics/pokemon/trapinch/front.4bpp.lz\");\nconst u32 gMonPalette_Trapinch[] = INCBIN_U32(\"graphics/pokemon/trapinch/normal.gbapal.lz\");\nconst u32 gMonBackPic_Trapinch[] = INCBIN_U32(\"graphics/pokemon/trapinch/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Trapinch[] = INCBIN_U32(\"graphics/pokemon/trapinch/shiny.gbapal.lz\");\nconst u8 gMonIcon_Trapinch[] = INCBIN_U8(\"graphics/pokemon/trapinch/icon.4bpp\");\nconst u8 gMonFootprint_Trapinch[] = INCBIN_U8(\"graphics/pokemon/trapinch/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Vibrava[] = INCBIN_U32(\"graphics/pokemon/vibrava/front.4bpp.lz\");\nconst u32 gMonPalette_Vibrava[] = INCBIN_U32(\"graphics/pokemon/vibrava/normal.gbapal.lz\");\nconst u32 gMonBackPic_Vibrava[] = INCBIN_U32(\"graphics/pokemon/vibrava/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Vibrava[] = INCBIN_U32(\"graphics/pokemon/vibrava/shiny.gbapal.lz\");\nconst u8 gMonIcon_Vibrava[] = INCBIN_U8(\"graphics/pokemon/vibrava/icon.4bpp\");\nconst u8 gMonFootprint_Vibrava[] = INCBIN_U8(\"graphics/pokemon/vibrava/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Flygon[] = INCBIN_U32(\"graphics/pokemon/flygon/front.4bpp.lz\");\nconst u32 gMonPalette_Flygon[] = INCBIN_U32(\"graphics/pokemon/flygon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Flygon[] = INCBIN_U32(\"graphics/pokemon/flygon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Flygon[] = INCBIN_U32(\"graphics/pokemon/flygon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Flygon[] = INCBIN_U8(\"graphics/pokemon/flygon/icon.4bpp\");\nconst u8 gMonFootprint_Flygon[] = INCBIN_U8(\"graphics/pokemon/flygon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Makuhita[] = INCBIN_U32(\"graphics/pokemon/makuhita/front.4bpp.lz\");\nconst u32 gMonPalette_Makuhita[] = INCBIN_U32(\"graphics/pokemon/makuhita/normal.gbapal.lz\");\nconst u32 gMonBackPic_Makuhita[] = INCBIN_U32(\"graphics/pokemon/makuhita/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Makuhita[] = INCBIN_U32(\"graphics/pokemon/makuhita/shiny.gbapal.lz\");\nconst u8 gMonIcon_Makuhita[] = INCBIN_U8(\"graphics/pokemon/makuhita/icon.4bpp\");\nconst u8 gMonFootprint_Makuhita[] = INCBIN_U8(\"graphics/pokemon/makuhita/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Hariyama[] = INCBIN_U32(\"graphics/pokemon/hariyama/front.4bpp.lz\");\nconst u32 gMonPalette_Hariyama[] = INCBIN_U32(\"graphics/pokemon/hariyama/normal.gbapal.lz\");\nconst u32 gMonBackPic_Hariyama[] = INCBIN_U32(\"graphics/pokemon/hariyama/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Hariyama[] = INCBIN_U32(\"graphics/pokemon/hariyama/shiny.gbapal.lz\");\nconst u8 gMonIcon_Hariyama[] = INCBIN_U8(\"graphics/pokemon/hariyama/icon.4bpp\");\nconst u8 gMonFootprint_Hariyama[] = INCBIN_U8(\"graphics/pokemon/hariyama/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Electrike[] = INCBIN_U32(\"graphics/pokemon/electrike/front.4bpp.lz\");\nconst u32 gMonPalette_Electrike[] = INCBIN_U32(\"graphics/pokemon/electrike/normal.gbapal.lz\");\nconst u32 gMonBackPic_Electrike[] = INCBIN_U32(\"graphics/pokemon/electrike/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Electrike[] = INCBIN_U32(\"graphics/pokemon/electrike/shiny.gbapal.lz\");\nconst u8 gMonIcon_Electrike[] = INCBIN_U8(\"graphics/pokemon/electrike/icon.4bpp\");\nconst u8 gMonFootprint_Electrike[] = INCBIN_U8(\"graphics/pokemon/electrike/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Manectric[] = INCBIN_U32(\"graphics/pokemon/manectric/front.4bpp.lz\");\nconst u32 gMonPalette_Manectric[] = INCBIN_U32(\"graphics/pokemon/manectric/normal.gbapal.lz\");\nconst u32 gMonBackPic_Manectric[] = INCBIN_U32(\"graphics/pokemon/manectric/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Manectric[] = INCBIN_U32(\"graphics/pokemon/manectric/shiny.gbapal.lz\");\nconst u8 gMonIcon_Manectric[] = INCBIN_U8(\"graphics/pokemon/manectric/icon.4bpp\");\nconst u8 gMonFootprint_Manectric[] = INCBIN_U8(\"graphics/pokemon/manectric/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Numel[] = INCBIN_U32(\"graphics/pokemon/numel/front.4bpp.lz\");\nconst u32 gMonPalette_Numel[] = INCBIN_U32(\"graphics/pokemon/numel/normal.gbapal.lz\");\nconst u32 gMonBackPic_Numel[] = INCBIN_U32(\"graphics/pokemon/numel/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Numel[] = INCBIN_U32(\"graphics/pokemon/numel/shiny.gbapal.lz\");\nconst u8 gMonIcon_Numel[] = INCBIN_U8(\"graphics/pokemon/numel/icon.4bpp\");\nconst u8 gMonFootprint_Numel[] = INCBIN_U8(\"graphics/pokemon/numel/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Camerupt[] = INCBIN_U32(\"graphics/pokemon/camerupt/front.4bpp.lz\");\nconst u32 gMonPalette_Camerupt[] = INCBIN_U32(\"graphics/pokemon/camerupt/normal.gbapal.lz\");\nconst u32 gMonBackPic_Camerupt[] = INCBIN_U32(\"graphics/pokemon/camerupt/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Camerupt[] = INCBIN_U32(\"graphics/pokemon/camerupt/shiny.gbapal.lz\");\nconst u8 gMonIcon_Camerupt[] = INCBIN_U8(\"graphics/pokemon/camerupt/icon.4bpp\");\nconst u8 gMonFootprint_Camerupt[] = INCBIN_U8(\"graphics/pokemon/camerupt/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Spheal[] = INCBIN_U32(\"graphics/pokemon/spheal/front.4bpp.lz\");\nconst u32 gMonPalette_Spheal[] = INCBIN_U32(\"graphics/pokemon/spheal/normal.gbapal.lz\");\nconst u32 gMonBackPic_Spheal[] = INCBIN_U32(\"graphics/pokemon/spheal/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Spheal[] = INCBIN_U32(\"graphics/pokemon/spheal/shiny.gbapal.lz\");\nconst u8 gMonIcon_Spheal[] = INCBIN_U8(\"graphics/pokemon/spheal/icon.4bpp\");\nconst u8 gMonFootprint_Spheal[] = INCBIN_U8(\"graphics/pokemon/spheal/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Sealeo[] = INCBIN_U32(\"graphics/pokemon/sealeo/front.4bpp.lz\");\nconst u32 gMonPalette_Sealeo[] = INCBIN_U32(\"graphics/pokemon/sealeo/normal.gbapal.lz\");\nconst u32 gMonBackPic_Sealeo[] = INCBIN_U32(\"graphics/pokemon/sealeo/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Sealeo[] = INCBIN_U32(\"graphics/pokemon/sealeo/shiny.gbapal.lz\");\nconst u8 gMonIcon_Sealeo[] = INCBIN_U8(\"graphics/pokemon/sealeo/icon.4bpp\");\nconst u8 gMonFootprint_Sealeo[] = INCBIN_U8(\"graphics/pokemon/sealeo/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Walrein[] = INCBIN_U32(\"graphics/pokemon/walrein/front.4bpp.lz\");\nconst u32 gMonPalette_Walrein[] = INCBIN_U32(\"graphics/pokemon/walrein/normal.gbapal.lz\");\nconst u32 gMonBackPic_Walrein[] = INCBIN_U32(\"graphics/pokemon/walrein/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Walrein[] = INCBIN_U32(\"graphics/pokemon/walrein/shiny.gbapal.lz\");\nconst u8 gMonIcon_Walrein[] = INCBIN_U8(\"graphics/pokemon/walrein/icon.4bpp\");\nconst u8 gMonFootprint_Walrein[] = INCBIN_U8(\"graphics/pokemon/walrein/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Cacnea[] = INCBIN_U32(\"graphics/pokemon/cacnea/front.4bpp.lz\");\nconst u32 gMonPalette_Cacnea[] = INCBIN_U32(\"graphics/pokemon/cacnea/normal.gbapal.lz\");\nconst u32 gMonBackPic_Cacnea[] = INCBIN_U32(\"graphics/pokemon/cacnea/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Cacnea[] = INCBIN_U32(\"graphics/pokemon/cacnea/shiny.gbapal.lz\");\nconst u8 gMonIcon_Cacnea[] = INCBIN_U8(\"graphics/pokemon/cacnea/icon.4bpp\");\nconst u8 gMonFootprint_Cacnea[] = INCBIN_U8(\"graphics/pokemon/cacnea/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Cacturne[] = INCBIN_U32(\"graphics/pokemon/cacturne/front.4bpp.lz\");\nconst u32 gMonPalette_Cacturne[] = INCBIN_U32(\"graphics/pokemon/cacturne/normal.gbapal.lz\");\nconst u32 gMonBackPic_Cacturne[] = INCBIN_U32(\"graphics/pokemon/cacturne/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Cacturne[] = INCBIN_U32(\"graphics/pokemon/cacturne/shiny.gbapal.lz\");\nconst u8 gMonIcon_Cacturne[] = INCBIN_U8(\"graphics/pokemon/cacturne/icon.4bpp\");\nconst u8 gMonFootprint_Cacturne[] = INCBIN_U8(\"graphics/pokemon/cacturne/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Snorunt[] = INCBIN_U32(\"graphics/pokemon/snorunt/front.4bpp.lz\");\nconst u32 gMonPalette_Snorunt[] = INCBIN_U32(\"graphics/pokemon/snorunt/normal.gbapal.lz\");\nconst u32 gMonBackPic_Snorunt[] = INCBIN_U32(\"graphics/pokemon/snorunt/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Snorunt[] = INCBIN_U32(\"graphics/pokemon/snorunt/shiny.gbapal.lz\");\nconst u8 gMonIcon_Snorunt[] = INCBIN_U8(\"graphics/pokemon/snorunt/icon.4bpp\");\nconst u8 gMonFootprint_Snorunt[] = INCBIN_U8(\"graphics/pokemon/snorunt/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Glalie[] = INCBIN_U32(\"graphics/pokemon/glalie/front.4bpp.lz\");\nconst u32 gMonPalette_Glalie[] = INCBIN_U32(\"graphics/pokemon/glalie/normal.gbapal.lz\");\nconst u32 gMonBackPic_Glalie[] = INCBIN_U32(\"graphics/pokemon/glalie/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Glalie[] = INCBIN_U32(\"graphics/pokemon/glalie/shiny.gbapal.lz\");\nconst u8 gMonIcon_Glalie[] = INCBIN_U8(\"graphics/pokemon/glalie/icon.4bpp\");\nconst u8 gMonFootprint_Glalie[] = INCBIN_U8(\"graphics/pokemon/glalie/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Lunatone[] = INCBIN_U32(\"graphics/pokemon/lunatone/front.4bpp.lz\");\nconst u32 gMonPalette_Lunatone[] = INCBIN_U32(\"graphics/pokemon/lunatone/normal.gbapal.lz\");\nconst u32 gMonBackPic_Lunatone[] = INCBIN_U32(\"graphics/pokemon/lunatone/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Lunatone[] = INCBIN_U32(\"graphics/pokemon/lunatone/shiny.gbapal.lz\");\nconst u8 gMonIcon_Lunatone[] = INCBIN_U8(\"graphics/pokemon/lunatone/icon.4bpp\");\nconst u8 gMonFootprint_Lunatone[] = INCBIN_U8(\"graphics/pokemon/lunatone/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Solrock[] = INCBIN_U32(\"graphics/pokemon/solrock/front.4bpp.lz\");\nconst u32 gMonPalette_Solrock[] = INCBIN_U32(\"graphics/pokemon/solrock/normal.gbapal.lz\");\nconst u32 gMonBackPic_Solrock[] = INCBIN_U32(\"graphics/pokemon/solrock/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Solrock[] = INCBIN_U32(\"graphics/pokemon/solrock/shiny.gbapal.lz\");\nconst u8 gMonIcon_Solrock[] = INCBIN_U8(\"graphics/pokemon/solrock/icon.4bpp\");\nconst u8 gMonFootprint_Solrock[] = INCBIN_U8(\"graphics/pokemon/solrock/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Azurill[] = INCBIN_U32(\"graphics/pokemon/azurill/front.4bpp.lz\");\nconst u32 gMonPalette_Azurill[] = INCBIN_U32(\"graphics/pokemon/azurill/normal.gbapal.lz\");\nconst u32 gMonBackPic_Azurill[] = INCBIN_U32(\"graphics/pokemon/azurill/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Azurill[] = INCBIN_U32(\"graphics/pokemon/azurill/shiny.gbapal.lz\");\nconst u8 gMonIcon_Azurill[] = INCBIN_U8(\"graphics/pokemon/azurill/icon.4bpp\");\nconst u8 gMonFootprint_Azurill[] = INCBIN_U8(\"graphics/pokemon/azurill/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Spoink[] = INCBIN_U32(\"graphics/pokemon/spoink/front.4bpp.lz\");\nconst u32 gMonPalette_Spoink[] = INCBIN_U32(\"graphics/pokemon/spoink/normal.gbapal.lz\");\nconst u32 gMonBackPic_Spoink[] = INCBIN_U32(\"graphics/pokemon/spoink/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Spoink[] = INCBIN_U32(\"graphics/pokemon/spoink/shiny.gbapal.lz\");\nconst u8 gMonIcon_Spoink[] = INCBIN_U8(\"graphics/pokemon/spoink/icon.4bpp\");\nconst u8 gMonFootprint_Spoink[] = INCBIN_U8(\"graphics/pokemon/spoink/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Grumpig[] = INCBIN_U32(\"graphics/pokemon/grumpig/front.4bpp.lz\");\nconst u32 gMonPalette_Grumpig[] = INCBIN_U32(\"graphics/pokemon/grumpig/normal.gbapal.lz\");\nconst u32 gMonBackPic_Grumpig[] = INCBIN_U32(\"graphics/pokemon/grumpig/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Grumpig[] = INCBIN_U32(\"graphics/pokemon/grumpig/shiny.gbapal.lz\");\nconst u8 gMonIcon_Grumpig[] = INCBIN_U8(\"graphics/pokemon/grumpig/icon.4bpp\");\nconst u8 gMonFootprint_Grumpig[] = INCBIN_U8(\"graphics/pokemon/grumpig/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Plusle[] = INCBIN_U32(\"graphics/pokemon/plusle/front.4bpp.lz\");\nconst u32 gMonPalette_Plusle[] = INCBIN_U32(\"graphics/pokemon/plusle/normal.gbapal.lz\");\nconst u32 gMonBackPic_Plusle[] = INCBIN_U32(\"graphics/pokemon/plusle/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Plusle[] = INCBIN_U32(\"graphics/pokemon/plusle/shiny.gbapal.lz\");\nconst u8 gMonIcon_Plusle[] = INCBIN_U8(\"graphics/pokemon/plusle/icon.4bpp\");\nconst u8 gMonFootprint_Plusle[] = INCBIN_U8(\"graphics/pokemon/plusle/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Minun[] = INCBIN_U32(\"graphics/pokemon/minun/front.4bpp.lz\");\nconst u32 gMonPalette_Minun[] = INCBIN_U32(\"graphics/pokemon/minun/normal.gbapal.lz\");\nconst u32 gMonBackPic_Minun[] = INCBIN_U32(\"graphics/pokemon/minun/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Minun[] = INCBIN_U32(\"graphics/pokemon/minun/shiny.gbapal.lz\");\nconst u8 gMonIcon_Minun[] = INCBIN_U8(\"graphics/pokemon/minun/icon.4bpp\");\nconst u8 gMonFootprint_Minun[] = INCBIN_U8(\"graphics/pokemon/minun/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Mawile[] = INCBIN_U32(\"graphics/pokemon/mawile/front.4bpp.lz\");\nconst u32 gMonPalette_Mawile[] = INCBIN_U32(\"graphics/pokemon/mawile/normal.gbapal.lz\");\nconst u32 gMonBackPic_Mawile[] = INCBIN_U32(\"graphics/pokemon/mawile/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Mawile[] = INCBIN_U32(\"graphics/pokemon/mawile/shiny.gbapal.lz\");\nconst u8 gMonIcon_Mawile[] = INCBIN_U8(\"graphics/pokemon/mawile/icon.4bpp\");\nconst u8 gMonFootprint_Mawile[] = INCBIN_U8(\"graphics/pokemon/mawile/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Meditite[] = INCBIN_U32(\"graphics/pokemon/meditite/front.4bpp.lz\");\nconst u32 gMonPalette_Meditite[] = INCBIN_U32(\"graphics/pokemon/meditite/normal.gbapal.lz\");\nconst u32 gMonBackPic_Meditite[] = INCBIN_U32(\"graphics/pokemon/meditite/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Meditite[] = INCBIN_U32(\"graphics/pokemon/meditite/shiny.gbapal.lz\");\nconst u8 gMonIcon_Meditite[] = INCBIN_U8(\"graphics/pokemon/meditite/icon.4bpp\");\nconst u8 gMonFootprint_Meditite[] = INCBIN_U8(\"graphics/pokemon/meditite/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Medicham[] = INCBIN_U32(\"graphics/pokemon/medicham/front.4bpp.lz\");\nconst u32 gMonPalette_Medicham[] = INCBIN_U32(\"graphics/pokemon/medicham/normal.gbapal.lz\");\nconst u32 gMonBackPic_Medicham[] = INCBIN_U32(\"graphics/pokemon/medicham/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Medicham[] = INCBIN_U32(\"graphics/pokemon/medicham/shiny.gbapal.lz\");\nconst u8 gMonIcon_Medicham[] = INCBIN_U8(\"graphics/pokemon/medicham/icon.4bpp\");\nconst u8 gMonFootprint_Medicham[] = INCBIN_U8(\"graphics/pokemon/medicham/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Swablu[] = INCBIN_U32(\"graphics/pokemon/swablu/front.4bpp.lz\");\nconst u32 gMonPalette_Swablu[] = INCBIN_U32(\"graphics/pokemon/swablu/normal.gbapal.lz\");\nconst u32 gMonBackPic_Swablu[] = INCBIN_U32(\"graphics/pokemon/swablu/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Swablu[] = INCBIN_U32(\"graphics/pokemon/swablu/shiny.gbapal.lz\");\nconst u8 gMonIcon_Swablu[] = INCBIN_U8(\"graphics/pokemon/swablu/icon.4bpp\");\nconst u8 gMonFootprint_Swablu[] = INCBIN_U8(\"graphics/pokemon/swablu/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Altaria[] = INCBIN_U32(\"graphics/pokemon/altaria/front.4bpp.lz\");\nconst u32 gMonPalette_Altaria[] = INCBIN_U32(\"graphics/pokemon/altaria/normal.gbapal.lz\");\nconst u32 gMonBackPic_Altaria[] = INCBIN_U32(\"graphics/pokemon/altaria/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Altaria[] = INCBIN_U32(\"graphics/pokemon/altaria/shiny.gbapal.lz\");\nconst u8 gMonIcon_Altaria[] = INCBIN_U8(\"graphics/pokemon/altaria/icon.4bpp\");\nconst u8 gMonFootprint_Altaria[] = INCBIN_U8(\"graphics/pokemon/altaria/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Wynaut[] = INCBIN_U32(\"graphics/pokemon/wynaut/front.4bpp.lz\");\nconst u32 gMonPalette_Wynaut[] = INCBIN_U32(\"graphics/pokemon/wynaut/normal.gbapal.lz\");\nconst u32 gMonBackPic_Wynaut[] = INCBIN_U32(\"graphics/pokemon/wynaut/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Wynaut[] = INCBIN_U32(\"graphics/pokemon/wynaut/shiny.gbapal.lz\");\nconst u8 gMonIcon_Wynaut[] = INCBIN_U8(\"graphics/pokemon/wynaut/icon.4bpp\");\nconst u8 gMonFootprint_Wynaut[] = INCBIN_U8(\"graphics/pokemon/wynaut/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Duskull[] = INCBIN_U32(\"graphics/pokemon/duskull/front.4bpp.lz\");\nconst u32 gMonPalette_Duskull[] = INCBIN_U32(\"graphics/pokemon/duskull/normal.gbapal.lz\");\nconst u32 gMonBackPic_Duskull[] = INCBIN_U32(\"graphics/pokemon/duskull/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Duskull[] = INCBIN_U32(\"graphics/pokemon/duskull/shiny.gbapal.lz\");\nconst u8 gMonIcon_Duskull[] = INCBIN_U8(\"graphics/pokemon/duskull/icon.4bpp\");\nconst u8 gMonFootprint_Duskull[] = INCBIN_U8(\"graphics/pokemon/duskull/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Dusclops[] = INCBIN_U32(\"graphics/pokemon/dusclops/front.4bpp.lz\");\nconst u32 gMonPalette_Dusclops[] = INCBIN_U32(\"graphics/pokemon/dusclops/normal.gbapal.lz\");\nconst u32 gMonBackPic_Dusclops[] = INCBIN_U32(\"graphics/pokemon/dusclops/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Dusclops[] = INCBIN_U32(\"graphics/pokemon/dusclops/shiny.gbapal.lz\");\nconst u8 gMonIcon_Dusclops[] = INCBIN_U8(\"graphics/pokemon/dusclops/icon.4bpp\");\nconst u8 gMonFootprint_Dusclops[] = INCBIN_U8(\"graphics/pokemon/dusclops/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Roselia[] = INCBIN_U32(\"graphics/pokemon/roselia/front.4bpp.lz\");\nconst u32 gMonPalette_Roselia[] = INCBIN_U32(\"graphics/pokemon/roselia/normal.gbapal.lz\");\nconst u32 gMonBackPic_Roselia[] = INCBIN_U32(\"graphics/pokemon/roselia/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Roselia[] = INCBIN_U32(\"graphics/pokemon/roselia/shiny.gbapal.lz\");\nconst u8 gMonIcon_Roselia[] = INCBIN_U8(\"graphics/pokemon/roselia/icon.4bpp\");\nconst u8 gMonFootprint_Roselia[] = INCBIN_U8(\"graphics/pokemon/roselia/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Slakoth[] = INCBIN_U32(\"graphics/pokemon/slakoth/front.4bpp.lz\");\nconst u32 gMonPalette_Slakoth[] = INCBIN_U32(\"graphics/pokemon/slakoth/normal.gbapal.lz\");\nconst u32 gMonBackPic_Slakoth[] = INCBIN_U32(\"graphics/pokemon/slakoth/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Slakoth[] = INCBIN_U32(\"graphics/pokemon/slakoth/shiny.gbapal.lz\");\nconst u8 gMonIcon_Slakoth[] = INCBIN_U8(\"graphics/pokemon/slakoth/icon.4bpp\");\nconst u8 gMonFootprint_Slakoth[] = INCBIN_U8(\"graphics/pokemon/slakoth/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Vigoroth[] = INCBIN_U32(\"graphics/pokemon/vigoroth/front.4bpp.lz\");\nconst u32 gMonPalette_Vigoroth[] = INCBIN_U32(\"graphics/pokemon/vigoroth/normal.gbapal.lz\");\nconst u32 gMonBackPic_Vigoroth[] = INCBIN_U32(\"graphics/pokemon/vigoroth/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Vigoroth[] = INCBIN_U32(\"graphics/pokemon/vigoroth/shiny.gbapal.lz\");\nconst u8 gMonIcon_Vigoroth[] = INCBIN_U8(\"graphics/pokemon/vigoroth/icon.4bpp\");\nconst u8 gMonFootprint_Vigoroth[] = INCBIN_U8(\"graphics/pokemon/vigoroth/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Slaking[] = INCBIN_U32(\"graphics/pokemon/slaking/front.4bpp.lz\");\nconst u32 gMonPalette_Slaking[] = INCBIN_U32(\"graphics/pokemon/slaking/normal.gbapal.lz\");\nconst u32 gMonBackPic_Slaking[] = INCBIN_U32(\"graphics/pokemon/slaking/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Slaking[] = INCBIN_U32(\"graphics/pokemon/slaking/shiny.gbapal.lz\");\nconst u8 gMonIcon_Slaking[] = INCBIN_U8(\"graphics/pokemon/slaking/icon.4bpp\");\nconst u8 gMonFootprint_Slaking[] = INCBIN_U8(\"graphics/pokemon/slaking/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Gulpin[] = INCBIN_U32(\"graphics/pokemon/gulpin/front.4bpp.lz\");\nconst u32 gMonPalette_Gulpin[] = INCBIN_U32(\"graphics/pokemon/gulpin/normal.gbapal.lz\");\nconst u32 gMonBackPic_Gulpin[] = INCBIN_U32(\"graphics/pokemon/gulpin/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Gulpin[] = INCBIN_U32(\"graphics/pokemon/gulpin/shiny.gbapal.lz\");\nconst u8 gMonIcon_Gulpin[] = INCBIN_U8(\"graphics/pokemon/gulpin/icon.4bpp\");\nconst u8 gMonFootprint_Gulpin[] = INCBIN_U8(\"graphics/pokemon/gulpin/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Swalot[] = INCBIN_U32(\"graphics/pokemon/swalot/front.4bpp.lz\");\nconst u32 gMonPalette_Swalot[] = INCBIN_U32(\"graphics/pokemon/swalot/normal.gbapal.lz\");\nconst u32 gMonBackPic_Swalot[] = INCBIN_U32(\"graphics/pokemon/swalot/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Swalot[] = INCBIN_U32(\"graphics/pokemon/swalot/shiny.gbapal.lz\");\nconst u8 gMonIcon_Swalot[] = INCBIN_U8(\"graphics/pokemon/swalot/icon.4bpp\");\nconst u8 gMonFootprint_Swalot[] = INCBIN_U8(\"graphics/pokemon/swalot/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Tropius[] = INCBIN_U32(\"graphics/pokemon/tropius/front.4bpp.lz\");\nconst u32 gMonPalette_Tropius[] = INCBIN_U32(\"graphics/pokemon/tropius/normal.gbapal.lz\");\nconst u32 gMonBackPic_Tropius[] = INCBIN_U32(\"graphics/pokemon/tropius/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Tropius[] = INCBIN_U32(\"graphics/pokemon/tropius/shiny.gbapal.lz\");\nconst u8 gMonIcon_Tropius[] = INCBIN_U8(\"graphics/pokemon/tropius/icon.4bpp\");\nconst u8 gMonFootprint_Tropius[] = INCBIN_U8(\"graphics/pokemon/tropius/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Whismur[] = INCBIN_U32(\"graphics/pokemon/whismur/front.4bpp.lz\");\nconst u32 gMonPalette_Whismur[] = INCBIN_U32(\"graphics/pokemon/whismur/normal.gbapal.lz\");\nconst u32 gMonBackPic_Whismur[] = INCBIN_U32(\"graphics/pokemon/whismur/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Whismur[] = INCBIN_U32(\"graphics/pokemon/whismur/shiny.gbapal.lz\");\nconst u8 gMonIcon_Whismur[] = INCBIN_U8(\"graphics/pokemon/whismur/icon.4bpp\");\nconst u8 gMonFootprint_Whismur[] = INCBIN_U8(\"graphics/pokemon/whismur/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Loudred[] = INCBIN_U32(\"graphics/pokemon/loudred/front.4bpp.lz\");\nconst u32 gMonPalette_Loudred[] = INCBIN_U32(\"graphics/pokemon/loudred/normal.gbapal.lz\");\nconst u32 gMonBackPic_Loudred[] = INCBIN_U32(\"graphics/pokemon/loudred/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Loudred[] = INCBIN_U32(\"graphics/pokemon/loudred/shiny.gbapal.lz\");\nconst u8 gMonIcon_Loudred[] = INCBIN_U8(\"graphics/pokemon/loudred/icon.4bpp\");\nconst u8 gMonFootprint_Loudred[] = INCBIN_U8(\"graphics/pokemon/loudred/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Exploud[] = INCBIN_U32(\"graphics/pokemon/exploud/front.4bpp.lz\");\nconst u32 gMonPalette_Exploud[] = INCBIN_U32(\"graphics/pokemon/exploud/normal.gbapal.lz\");\nconst u32 gMonBackPic_Exploud[] = INCBIN_U32(\"graphics/pokemon/exploud/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Exploud[] = INCBIN_U32(\"graphics/pokemon/exploud/shiny.gbapal.lz\");\nconst u8 gMonIcon_Exploud[] = INCBIN_U8(\"graphics/pokemon/exploud/icon.4bpp\");\nconst u8 gMonFootprint_Exploud[] = INCBIN_U8(\"graphics/pokemon/exploud/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Clamperl[] = INCBIN_U32(\"graphics/pokemon/clamperl/front.4bpp.lz\");\nconst u32 gMonPalette_Clamperl[] = INCBIN_U32(\"graphics/pokemon/clamperl/normal.gbapal.lz\");\nconst u32 gMonBackPic_Clamperl[] = INCBIN_U32(\"graphics/pokemon/clamperl/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Clamperl[] = INCBIN_U32(\"graphics/pokemon/clamperl/shiny.gbapal.lz\");\nconst u8 gMonIcon_Clamperl[] = INCBIN_U8(\"graphics/pokemon/clamperl/icon.4bpp\");\nconst u8 gMonFootprint_Clamperl[] = INCBIN_U8(\"graphics/pokemon/clamperl/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Huntail[] = INCBIN_U32(\"graphics/pokemon/huntail/front.4bpp.lz\");\nconst u32 gMonPalette_Huntail[] = INCBIN_U32(\"graphics/pokemon/huntail/normal.gbapal.lz\");\nconst u32 gMonBackPic_Huntail[] = INCBIN_U32(\"graphics/pokemon/huntail/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Huntail[] = INCBIN_U32(\"graphics/pokemon/huntail/shiny.gbapal.lz\");\nconst u8 gMonIcon_Huntail[] = INCBIN_U8(\"graphics/pokemon/huntail/icon.4bpp\");\nconst u8 gMonFootprint_Huntail[] = INCBIN_U8(\"graphics/pokemon/huntail/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Gorebyss[] = INCBIN_U32(\"graphics/pokemon/gorebyss/front.4bpp.lz\");\nconst u32 gMonPalette_Gorebyss[] = INCBIN_U32(\"graphics/pokemon/gorebyss/normal.gbapal.lz\");\nconst u32 gMonBackPic_Gorebyss[] = INCBIN_U32(\"graphics/pokemon/gorebyss/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Gorebyss[] = INCBIN_U32(\"graphics/pokemon/gorebyss/shiny.gbapal.lz\");\nconst u8 gMonIcon_Gorebyss[] = INCBIN_U8(\"graphics/pokemon/gorebyss/icon.4bpp\");\nconst u8 gMonFootprint_Gorebyss[] = INCBIN_U8(\"graphics/pokemon/gorebyss/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Absol[] = INCBIN_U32(\"graphics/pokemon/absol/front.4bpp.lz\");\nconst u32 gMonPalette_Absol[] = INCBIN_U32(\"graphics/pokemon/absol/normal.gbapal.lz\");\nconst u32 gMonBackPic_Absol[] = INCBIN_U32(\"graphics/pokemon/absol/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Absol[] = INCBIN_U32(\"graphics/pokemon/absol/shiny.gbapal.lz\");\nconst u8 gMonIcon_Absol[] = INCBIN_U8(\"graphics/pokemon/absol/icon.4bpp\");\nconst u8 gMonFootprint_Absol[] = INCBIN_U8(\"graphics/pokemon/absol/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Shuppet[] = INCBIN_U32(\"graphics/pokemon/shuppet/front.4bpp.lz\");\nconst u32 gMonPalette_Shuppet[] = INCBIN_U32(\"graphics/pokemon/shuppet/normal.gbapal.lz\");\nconst u32 gMonBackPic_Shuppet[] = INCBIN_U32(\"graphics/pokemon/shuppet/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Shuppet[] = INCBIN_U32(\"graphics/pokemon/shuppet/shiny.gbapal.lz\");\nconst u8 gMonIcon_Shuppet[] = INCBIN_U8(\"graphics/pokemon/shuppet/icon.4bpp\");\nconst u8 gMonFootprint_Shuppet[] = INCBIN_U8(\"graphics/pokemon/shuppet/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Banette[] = INCBIN_U32(\"graphics/pokemon/banette/front.4bpp.lz\");\nconst u32 gMonPalette_Banette[] = INCBIN_U32(\"graphics/pokemon/banette/normal.gbapal.lz\");\nconst u32 gMonBackPic_Banette[] = INCBIN_U32(\"graphics/pokemon/banette/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Banette[] = INCBIN_U32(\"graphics/pokemon/banette/shiny.gbapal.lz\");\nconst u8 gMonIcon_Banette[] = INCBIN_U8(\"graphics/pokemon/banette/icon.4bpp\");\nconst u8 gMonFootprint_Banette[] = INCBIN_U8(\"graphics/pokemon/banette/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Seviper[] = INCBIN_U32(\"graphics/pokemon/seviper/front.4bpp.lz\");\nconst u32 gMonPalette_Seviper[] = INCBIN_U32(\"graphics/pokemon/seviper/normal.gbapal.lz\");\nconst u32 gMonBackPic_Seviper[] = INCBIN_U32(\"graphics/pokemon/seviper/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Seviper[] = INCBIN_U32(\"graphics/pokemon/seviper/shiny.gbapal.lz\");\nconst u8 gMonIcon_Seviper[] = INCBIN_U8(\"graphics/pokemon/seviper/icon.4bpp\");\nconst u8 gMonFootprint_Seviper[] = INCBIN_U8(\"graphics/pokemon/seviper/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Zangoose[] = INCBIN_U32(\"graphics/pokemon/zangoose/front.4bpp.lz\");\nconst u32 gMonPalette_Zangoose[] = INCBIN_U32(\"graphics/pokemon/zangoose/normal.gbapal.lz\");\nconst u32 gMonBackPic_Zangoose[] = INCBIN_U32(\"graphics/pokemon/zangoose/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Zangoose[] = INCBIN_U32(\"graphics/pokemon/zangoose/shiny.gbapal.lz\");\nconst u8 gMonIcon_Zangoose[] = INCBIN_U8(\"graphics/pokemon/zangoose/icon.4bpp\");\nconst u8 gMonFootprint_Zangoose[] = INCBIN_U8(\"graphics/pokemon/zangoose/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Relicanth[] = INCBIN_U32(\"graphics/pokemon/relicanth/front.4bpp.lz\");\nconst u32 gMonPalette_Relicanth[] = INCBIN_U32(\"graphics/pokemon/relicanth/normal.gbapal.lz\");\nconst u32 gMonBackPic_Relicanth[] = INCBIN_U32(\"graphics/pokemon/relicanth/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Relicanth[] = INCBIN_U32(\"graphics/pokemon/relicanth/shiny.gbapal.lz\");\nconst u8 gMonIcon_Relicanth[] = INCBIN_U8(\"graphics/pokemon/relicanth/icon.4bpp\");\nconst u8 gMonFootprint_Relicanth[] = INCBIN_U8(\"graphics/pokemon/relicanth/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Aron[] = INCBIN_U32(\"graphics/pokemon/aron/front.4bpp.lz\");\nconst u32 gMonPalette_Aron[] = INCBIN_U32(\"graphics/pokemon/aron/normal.gbapal.lz\");\nconst u32 gMonBackPic_Aron[] = INCBIN_U32(\"graphics/pokemon/aron/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Aron[] = INCBIN_U32(\"graphics/pokemon/aron/shiny.gbapal.lz\");\nconst u8 gMonIcon_Aron[] = INCBIN_U8(\"graphics/pokemon/aron/icon.4bpp\");\nconst u8 gMonFootprint_Aron[] = INCBIN_U8(\"graphics/pokemon/aron/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Lairon[] = INCBIN_U32(\"graphics/pokemon/lairon/front.4bpp.lz\");\nconst u32 gMonPalette_Lairon[] = INCBIN_U32(\"graphics/pokemon/lairon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Lairon[] = INCBIN_U32(\"graphics/pokemon/lairon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Lairon[] = INCBIN_U32(\"graphics/pokemon/lairon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Lairon[] = INCBIN_U8(\"graphics/pokemon/lairon/icon.4bpp\");\nconst u8 gMonFootprint_Lairon[] = INCBIN_U8(\"graphics/pokemon/lairon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Aggron[] = INCBIN_U32(\"graphics/pokemon/aggron/front.4bpp.lz\");\nconst u32 gMonPalette_Aggron[] = INCBIN_U32(\"graphics/pokemon/aggron/normal.gbapal.lz\");\nconst u32 gMonBackPic_Aggron[] = INCBIN_U32(\"graphics/pokemon/aggron/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Aggron[] = INCBIN_U32(\"graphics/pokemon/aggron/shiny.gbapal.lz\");\nconst u8 gMonIcon_Aggron[] = INCBIN_U8(\"graphics/pokemon/aggron/icon.4bpp\");\nconst u8 gMonFootprint_Aggron[] = INCBIN_U8(\"graphics/pokemon/aggron/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Castform[] = INCBIN_U32(\"graphics/pokemon/castform/front.4bpp.lz\");\nconst u32 gMonPalette_Castform[] = INCBIN_U32(\"graphics/pokemon/castform/normal.gbapal.lz\");\nconst u32 gMonBackPic_Castform[] = INCBIN_U32(\"graphics/pokemon/castform/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Castform[] = INCBIN_U32(\"graphics/pokemon/castform/shiny.gbapal.lz\");\nconst u8 gMonIcon_Castform[] = INCBIN_U8(\"graphics/pokemon/castform/icon.4bpp\");\nconst u8 gMonFootprint_Castform[] = INCBIN_U8(\"graphics/pokemon/castform/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Volbeat[] = INCBIN_U32(\"graphics/pokemon/volbeat/front.4bpp.lz\");\nconst u32 gMonPalette_Volbeat[] = INCBIN_U32(\"graphics/pokemon/volbeat/normal.gbapal.lz\");\nconst u32 gMonBackPic_Volbeat[] = INCBIN_U32(\"graphics/pokemon/volbeat/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Volbeat[] = INCBIN_U32(\"graphics/pokemon/volbeat/shiny.gbapal.lz\");\nconst u8 gMonIcon_Volbeat[] = INCBIN_U8(\"graphics/pokemon/volbeat/icon.4bpp\");\nconst u8 gMonFootprint_Volbeat[] = INCBIN_U8(\"graphics/pokemon/volbeat/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Illumise[] = INCBIN_U32(\"graphics/pokemon/illumise/front.4bpp.lz\");\nconst u32 gMonPalette_Illumise[] = INCBIN_U32(\"graphics/pokemon/illumise/normal.gbapal.lz\");\nconst u32 gMonBackPic_Illumise[] = INCBIN_U32(\"graphics/pokemon/illumise/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Illumise[] = INCBIN_U32(\"graphics/pokemon/illumise/shiny.gbapal.lz\");\nconst u8 gMonIcon_Illumise[] = INCBIN_U8(\"graphics/pokemon/illumise/icon.4bpp\");\nconst u8 gMonFootprint_Illumise[] = INCBIN_U8(\"graphics/pokemon/illumise/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Lileep[] = INCBIN_U32(\"graphics/pokemon/lileep/front.4bpp.lz\");\nconst u32 gMonPalette_Lileep[] = INCBIN_U32(\"graphics/pokemon/lileep/normal.gbapal.lz\");\nconst u32 gMonBackPic_Lileep[] = INCBIN_U32(\"graphics/pokemon/lileep/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Lileep[] = INCBIN_U32(\"graphics/pokemon/lileep/shiny.gbapal.lz\");\nconst u8 gMonIcon_Lileep[] = INCBIN_U8(\"graphics/pokemon/lileep/icon.4bpp\");\nconst u8 gMonFootprint_Lileep[] = INCBIN_U8(\"graphics/pokemon/lileep/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Cradily[] = INCBIN_U32(\"graphics/pokemon/cradily/front.4bpp.lz\");\nconst u32 gMonPalette_Cradily[] = INCBIN_U32(\"graphics/pokemon/cradily/normal.gbapal.lz\");\nconst u32 gMonBackPic_Cradily[] = INCBIN_U32(\"graphics/pokemon/cradily/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Cradily[] = INCBIN_U32(\"graphics/pokemon/cradily/shiny.gbapal.lz\");\nconst u8 gMonIcon_Cradily[] = INCBIN_U8(\"graphics/pokemon/cradily/icon.4bpp\");\nconst u8 gMonFootprint_Cradily[] = INCBIN_U8(\"graphics/pokemon/cradily/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Anorith[] = INCBIN_U32(\"graphics/pokemon/anorith/front.4bpp.lz\");\nconst u32 gMonPalette_Anorith[] = INCBIN_U32(\"graphics/pokemon/anorith/normal.gbapal.lz\");\nconst u32 gMonBackPic_Anorith[] = INCBIN_U32(\"graphics/pokemon/anorith/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Anorith[] = INCBIN_U32(\"graphics/pokemon/anorith/shiny.gbapal.lz\");\nconst u8 gMonIcon_Anorith[] = INCBIN_U8(\"graphics/pokemon/anorith/icon.4bpp\");\nconst u8 gMonFootprint_Anorith[] = INCBIN_U8(\"graphics/pokemon/anorith/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Armaldo[] = INCBIN_U32(\"graphics/pokemon/armaldo/front.4bpp.lz\");\nconst u32 gMonPalette_Armaldo[] = INCBIN_U32(\"graphics/pokemon/armaldo/normal.gbapal.lz\");\nconst u32 gMonBackPic_Armaldo[] = INCBIN_U32(\"graphics/pokemon/armaldo/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Armaldo[] = INCBIN_U32(\"graphics/pokemon/armaldo/shiny.gbapal.lz\");\nconst u8 gMonIcon_Armaldo[] = INCBIN_U8(\"graphics/pokemon/armaldo/icon.4bpp\");\nconst u8 gMonFootprint_Armaldo[] = INCBIN_U8(\"graphics/pokemon/armaldo/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Ralts[] = INCBIN_U32(\"graphics/pokemon/ralts/front.4bpp.lz\");\nconst u32 gMonPalette_Ralts[] = INCBIN_U32(\"graphics/pokemon/ralts/normal.gbapal.lz\");\nconst u32 gMonBackPic_Ralts[] = INCBIN_U32(\"graphics/pokemon/ralts/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Ralts[] = INCBIN_U32(\"graphics/pokemon/ralts/shiny.gbapal.lz\");\nconst u8 gMonIcon_Ralts[] = INCBIN_U8(\"graphics/pokemon/ralts/icon.4bpp\");\nconst u8 gMonFootprint_Ralts[] = INCBIN_U8(\"graphics/pokemon/ralts/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Kirlia[] = INCBIN_U32(\"graphics/pokemon/kirlia/front.4bpp.lz\");\nconst u32 gMonPalette_Kirlia[] = INCBIN_U32(\"graphics/pokemon/kirlia/normal.gbapal.lz\");\nconst u32 gMonBackPic_Kirlia[] = INCBIN_U32(\"graphics/pokemon/kirlia/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Kirlia[] = INCBIN_U32(\"graphics/pokemon/kirlia/shiny.gbapal.lz\");\nconst u8 gMonIcon_Kirlia[] = INCBIN_U8(\"graphics/pokemon/kirlia/icon.4bpp\");\nconst u8 gMonFootprint_Kirlia[] = INCBIN_U8(\"graphics/pokemon/kirlia/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Gardevoir[] = INCBIN_U32(\"graphics/pokemon/gardevoir/front.4bpp.lz\");\nconst u32 gMonPalette_Gardevoir[] = INCBIN_U32(\"graphics/pokemon/gardevoir/normal.gbapal.lz\");\nconst u32 gMonBackPic_Gardevoir[] = INCBIN_U32(\"graphics/pokemon/gardevoir/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Gardevoir[] = INCBIN_U32(\"graphics/pokemon/gardevoir/shiny.gbapal.lz\");\nconst u8 gMonIcon_Gardevoir[] = INCBIN_U8(\"graphics/pokemon/gardevoir/icon.4bpp\");\nconst u8 gMonFootprint_Gardevoir[] = INCBIN_U8(\"graphics/pokemon/gardevoir/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Bagon[] = INCBIN_U32(\"graphics/pokemon/bagon/front.4bpp.lz\");\nconst u32 gMonPalette_Bagon[] = INCBIN_U32(\"graphics/pokemon/bagon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Bagon[] = INCBIN_U32(\"graphics/pokemon/bagon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Bagon[] = INCBIN_U32(\"graphics/pokemon/bagon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Bagon[] = INCBIN_U8(\"graphics/pokemon/bagon/icon.4bpp\");\nconst u8 gMonFootprint_Bagon[] = INCBIN_U8(\"graphics/pokemon/bagon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Shelgon[] = INCBIN_U32(\"graphics/pokemon/shelgon/front.4bpp.lz\");\nconst u32 gMonPalette_Shelgon[] = INCBIN_U32(\"graphics/pokemon/shelgon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Shelgon[] = INCBIN_U32(\"graphics/pokemon/shelgon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Shelgon[] = INCBIN_U32(\"graphics/pokemon/shelgon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Shelgon[] = INCBIN_U8(\"graphics/pokemon/shelgon/icon.4bpp\");\nconst u8 gMonFootprint_Shelgon[] = INCBIN_U8(\"graphics/pokemon/shelgon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Salamence[] = INCBIN_U32(\"graphics/pokemon/salamence/front.4bpp.lz\");\nconst u32 gMonPalette_Salamence[] = INCBIN_U32(\"graphics/pokemon/salamence/normal.gbapal.lz\");\nconst u32 gMonBackPic_Salamence[] = INCBIN_U32(\"graphics/pokemon/salamence/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Salamence[] = INCBIN_U32(\"graphics/pokemon/salamence/shiny.gbapal.lz\");\nconst u8 gMonIcon_Salamence[] = INCBIN_U8(\"graphics/pokemon/salamence/icon.4bpp\");\nconst u8 gMonFootprint_Salamence[] = INCBIN_U8(\"graphics/pokemon/salamence/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Beldum[] = INCBIN_U32(\"graphics/pokemon/beldum/front.4bpp.lz\");\nconst u32 gMonPalette_Beldum[] = INCBIN_U32(\"graphics/pokemon/beldum/normal.gbapal.lz\");\nconst u32 gMonBackPic_Beldum[] = INCBIN_U32(\"graphics/pokemon/beldum/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Beldum[] = INCBIN_U32(\"graphics/pokemon/beldum/shiny.gbapal.lz\");\nconst u8 gMonIcon_Beldum[] = INCBIN_U8(\"graphics/pokemon/beldum/icon.4bpp\");\nconst u8 gMonFootprint_Beldum[] = INCBIN_U8(\"graphics/pokemon/beldum/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Metang[] = INCBIN_U32(\"graphics/pokemon/metang/front.4bpp.lz\");\nconst u32 gMonPalette_Metang[] = INCBIN_U32(\"graphics/pokemon/metang/normal.gbapal.lz\");\nconst u32 gMonBackPic_Metang[] = INCBIN_U32(\"graphics/pokemon/metang/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Metang[] = INCBIN_U32(\"graphics/pokemon/metang/shiny.gbapal.lz\");\nconst u8 gMonIcon_Metang[] = INCBIN_U8(\"graphics/pokemon/metang/icon.4bpp\");\nconst u8 gMonFootprint_Metang[] = INCBIN_U8(\"graphics/pokemon/metang/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Metagross[] = INCBIN_U32(\"graphics/pokemon/metagross/front.4bpp.lz\");\nconst u32 gMonPalette_Metagross[] = INCBIN_U32(\"graphics/pokemon/metagross/normal.gbapal.lz\");\nconst u32 gMonBackPic_Metagross[] = INCBIN_U32(\"graphics/pokemon/metagross/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Metagross[] = INCBIN_U32(\"graphics/pokemon/metagross/shiny.gbapal.lz\");\nconst u8 gMonIcon_Metagross[] = INCBIN_U8(\"graphics/pokemon/metagross/icon.4bpp\");\nconst u8 gMonFootprint_Metagross[] = INCBIN_U8(\"graphics/pokemon/metagross/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Regirock[] = INCBIN_U32(\"graphics/pokemon/regirock/front.4bpp.lz\");\nconst u32 gMonPalette_Regirock[] = INCBIN_U32(\"graphics/pokemon/regirock/normal.gbapal.lz\");\nconst u32 gMonBackPic_Regirock[] = INCBIN_U32(\"graphics/pokemon/regirock/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Regirock[] = INCBIN_U32(\"graphics/pokemon/regirock/shiny.gbapal.lz\");\nconst u8 gMonIcon_Regirock[] = INCBIN_U8(\"graphics/pokemon/regirock/icon.4bpp\");\nconst u8 gMonFootprint_Regirock[] = INCBIN_U8(\"graphics/pokemon/regirock/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Regice[] = INCBIN_U32(\"graphics/pokemon/regice/front.4bpp.lz\");\nconst u32 gMonPalette_Regice[] = INCBIN_U32(\"graphics/pokemon/regice/normal.gbapal.lz\");\nconst u32 gMonBackPic_Regice[] = INCBIN_U32(\"graphics/pokemon/regice/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Regice[] = INCBIN_U32(\"graphics/pokemon/regice/shiny.gbapal.lz\");\nconst u8 gMonIcon_Regice[] = INCBIN_U8(\"graphics/pokemon/regice/icon.4bpp\");\nconst u8 gMonFootprint_Regice[] = INCBIN_U8(\"graphics/pokemon/regice/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Registeel[] = INCBIN_U32(\"graphics/pokemon/registeel/front.4bpp.lz\");\nconst u32 gMonPalette_Registeel[] = INCBIN_U32(\"graphics/pokemon/registeel/normal.gbapal.lz\");\nconst u32 gMonBackPic_Registeel[] = INCBIN_U32(\"graphics/pokemon/registeel/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Registeel[] = INCBIN_U32(\"graphics/pokemon/registeel/shiny.gbapal.lz\");\nconst u8 gMonIcon_Registeel[] = INCBIN_U8(\"graphics/pokemon/registeel/icon.4bpp\");\nconst u8 gMonFootprint_Registeel[] = INCBIN_U8(\"graphics/pokemon/registeel/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Kyogre[] = INCBIN_U32(\"graphics/pokemon/kyogre/front.4bpp.lz\");\nconst u32 gMonPalette_Kyogre[] = INCBIN_U32(\"graphics/pokemon/kyogre/normal.gbapal.lz\");\nconst u32 gMonBackPic_Kyogre[] = INCBIN_U32(\"graphics/pokemon/kyogre/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Kyogre[] = INCBIN_U32(\"graphics/pokemon/kyogre/shiny.gbapal.lz\");\nconst u8 gMonIcon_Kyogre[] = INCBIN_U8(\"graphics/pokemon/kyogre/icon.4bpp\");\nconst u8 gMonFootprint_Kyogre[] = INCBIN_U8(\"graphics/pokemon/kyogre/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Groudon[] = INCBIN_U32(\"graphics/pokemon/groudon/front.4bpp.lz\");\nconst u32 gMonPalette_Groudon[] = INCBIN_U32(\"graphics/pokemon/groudon/normal.gbapal.lz\");\nconst u32 gMonBackPic_Groudon[] = INCBIN_U32(\"graphics/pokemon/groudon/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Groudon[] = INCBIN_U32(\"graphics/pokemon/groudon/shiny.gbapal.lz\");\nconst u8 gMonIcon_Groudon[] = INCBIN_U8(\"graphics/pokemon/groudon/icon.4bpp\");\nconst u8 gMonFootprint_Groudon[] = INCBIN_U8(\"graphics/pokemon/groudon/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Rayquaza[] = INCBIN_U32(\"graphics/pokemon/rayquaza/front.4bpp.lz\");\nconst u32 gMonPalette_Rayquaza[] = INCBIN_U32(\"graphics/pokemon/rayquaza/normal.gbapal.lz\");\nconst u32 gMonBackPic_Rayquaza[] = INCBIN_U32(\"graphics/pokemon/rayquaza/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Rayquaza[] = INCBIN_U32(\"graphics/pokemon/rayquaza/shiny.gbapal.lz\");\nconst u8 gMonIcon_Rayquaza[] = INCBIN_U8(\"graphics/pokemon/rayquaza/icon.4bpp\");\nconst u8 gMonFootprint_Rayquaza[] = INCBIN_U8(\"graphics/pokemon/rayquaza/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Latias[] = INCBIN_U32(\"graphics/pokemon/latias/front.4bpp.lz\");\nconst u32 gMonPalette_Latias[] = INCBIN_U32(\"graphics/pokemon/latias/normal.gbapal.lz\");\nconst u32 gMonBackPic_Latias[] = INCBIN_U32(\"graphics/pokemon/latias/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Latias[] = INCBIN_U32(\"graphics/pokemon/latias/shiny.gbapal.lz\");\nconst u8 gMonIcon_Latias[] = INCBIN_U8(\"graphics/pokemon/latias/icon.4bpp\");\nconst u8 gMonFootprint_Latias[] = INCBIN_U8(\"graphics/pokemon/latias/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Latios[] = INCBIN_U32(\"graphics/pokemon/latios/front.4bpp.lz\");\nconst u32 gMonPalette_Latios[] = INCBIN_U32(\"graphics/pokemon/latios/normal.gbapal.lz\");\nconst u32 gMonBackPic_Latios[] = INCBIN_U32(\"graphics/pokemon/latios/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Latios[] = INCBIN_U32(\"graphics/pokemon/latios/shiny.gbapal.lz\");\nconst u8 gMonIcon_Latios[] = INCBIN_U8(\"graphics/pokemon/latios/icon.4bpp\");\nconst u8 gMonFootprint_Latios[] = INCBIN_U8(\"graphics/pokemon/latios/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Jirachi[] = INCBIN_U32(\"graphics/pokemon/jirachi/front.4bpp.lz\");\nconst u32 gMonPalette_Jirachi[] = INCBIN_U32(\"graphics/pokemon/jirachi/normal.gbapal.lz\");\nconst u32 gMonBackPic_Jirachi[] = INCBIN_U32(\"graphics/pokemon/jirachi/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Jirachi[] = INCBIN_U32(\"graphics/pokemon/jirachi/shiny.gbapal.lz\");\nconst u8 gMonIcon_Jirachi[] = INCBIN_U8(\"graphics/pokemon/jirachi/icon.4bpp\");\nconst u8 gMonFootprint_Jirachi[] = INCBIN_U8(\"graphics/pokemon/jirachi/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Deoxys[] = INCBIN_U32(\"graphics/pokemon/deoxys/front.4bpp.lz\");\nconst u32 gMonPalette_Deoxys[] = INCBIN_U32(\"graphics/pokemon/deoxys/normal.gbapal.lz\");\nconst u32 gMonBackPic_Deoxys[] = INCBIN_U32(\"graphics/pokemon/deoxys/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Deoxys[] = INCBIN_U32(\"graphics/pokemon/deoxys/shiny.gbapal.lz\");\nconst u8 gMonIcon_Deoxys[] = INCBIN_U8(\"graphics/pokemon/deoxys/icon.4bpp\", \"graphics/pokemon/deoxys/icon_attack.4bpp\", \"graphics/pokemon/deoxys/icon_defense.4bpp\", \"graphics/pokemon/deoxys/icon_speed.4bpp\");\nconst u8 gMonFootprint_Deoxys[] = INCBIN_U8(\"graphics/pokemon/deoxys/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Chimecho[] = INCBIN_U32(\"graphics/pokemon/chimecho/front.4bpp.lz\");\nconst u32 gMonPalette_Chimecho[] = INCBIN_U32(\"graphics/pokemon/chimecho/normal.gbapal.lz\");\nconst u32 gMonBackPic_Chimecho[] = INCBIN_U32(\"graphics/pokemon/chimecho/back.4bpp.lz\");\nconst u32 gMonShinyPalette_Chimecho[] = INCBIN_U32(\"graphics/pokemon/chimecho/shiny.gbapal.lz\");\nconst u8 gMonIcon_Chimecho[] = INCBIN_U8(\"graphics/pokemon/chimecho/icon.4bpp\");\nconst u8 gMonFootprint_Chimecho[] = INCBIN_U8(\"graphics/pokemon/chimecho/footprint.1bpp\");\n\nconst u32 gMonFrontPic_Egg[] = INCBIN_U32(\"graphics/pokemon/egg/front.4bpp.lz\");\nconst u32 gMonPalette_Egg[] = INCBIN_U32(\"graphics/pokemon/egg/normal.gbapal.lz\");\n\nconst u32 gMonFrontPic_UnownB[] = INCBIN_U32(\"graphics/pokemon/unown/b/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownB[] = INCBIN_U32(\"graphics/pokemon/unown/b/back.4bpp.lz\");\nconst u8 gMonIcon_UnownB[] = INCBIN_U8(\"graphics/pokemon/unown/b/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownC[] = INCBIN_U32(\"graphics/pokemon/unown/c/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownC[] = INCBIN_U32(\"graphics/pokemon/unown/c/back.4bpp.lz\");\nconst u8 gMonIcon_UnownC[] = INCBIN_U8(\"graphics/pokemon/unown/c/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownD[] = INCBIN_U32(\"graphics/pokemon/unown/d/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownD[] = INCBIN_U32(\"graphics/pokemon/unown/d/back.4bpp.lz\");\nconst u8 gMonIcon_UnownD[] = INCBIN_U8(\"graphics/pokemon/unown/d/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownE[] = INCBIN_U32(\"graphics/pokemon/unown/e/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownE[] = INCBIN_U32(\"graphics/pokemon/unown/e/back.4bpp.lz\");\nconst u8 gMonIcon_UnownE[] = INCBIN_U8(\"graphics/pokemon/unown/e/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownF[] = INCBIN_U32(\"graphics/pokemon/unown/f/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownF[] = INCBIN_U32(\"graphics/pokemon/unown/f/back.4bpp.lz\");\nconst u8 gMonIcon_UnownF[] = INCBIN_U8(\"graphics/pokemon/unown/f/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownG[] = INCBIN_U32(\"graphics/pokemon/unown/g/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownG[] = INCBIN_U32(\"graphics/pokemon/unown/g/back.4bpp.lz\");\nconst u8 gMonIcon_UnownG[] = INCBIN_U8(\"graphics/pokemon/unown/g/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownH[] = INCBIN_U32(\"graphics/pokemon/unown/h/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownH[] = INCBIN_U32(\"graphics/pokemon/unown/h/back.4bpp.lz\");\nconst u8 gMonIcon_UnownH[] = INCBIN_U8(\"graphics/pokemon/unown/h/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownI[] = INCBIN_U32(\"graphics/pokemon/unown/i/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownI[] = INCBIN_U32(\"graphics/pokemon/unown/i/back.4bpp.lz\");\nconst u8 gMonIcon_UnownI[] = INCBIN_U8(\"graphics/pokemon/unown/i/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownJ[] = INCBIN_U32(\"graphics/pokemon/unown/j/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownJ[] = INCBIN_U32(\"graphics/pokemon/unown/j/back.4bpp.lz\");\nconst u8 gMonIcon_UnownJ[] = INCBIN_U8(\"graphics/pokemon/unown/j/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownK[] = INCBIN_U32(\"graphics/pokemon/unown/k/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownK[] = INCBIN_U32(\"graphics/pokemon/unown/k/back.4bpp.lz\");\nconst u8 gMonIcon_UnownK[] = INCBIN_U8(\"graphics/pokemon/unown/k/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownL[] = INCBIN_U32(\"graphics/pokemon/unown/l/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownL[] = INCBIN_U32(\"graphics/pokemon/unown/l/back.4bpp.lz\");\nconst u8 gMonIcon_UnownL[] = INCBIN_U8(\"graphics/pokemon/unown/l/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownM[] = INCBIN_U32(\"graphics/pokemon/unown/m/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownM[] = INCBIN_U32(\"graphics/pokemon/unown/m/back.4bpp.lz\");\nconst u8 gMonIcon_UnownM[] = INCBIN_U8(\"graphics/pokemon/unown/m/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownN[] = INCBIN_U32(\"graphics/pokemon/unown/n/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownN[] = INCBIN_U32(\"graphics/pokemon/unown/n/back.4bpp.lz\");\nconst u8 gMonIcon_UnownN[] = INCBIN_U8(\"graphics/pokemon/unown/n/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownO[] = INCBIN_U32(\"graphics/pokemon/unown/o/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownO[] = INCBIN_U32(\"graphics/pokemon/unown/o/back.4bpp.lz\");\nconst u8 gMonIcon_UnownO[] = INCBIN_U8(\"graphics/pokemon/unown/o/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownP[] = INCBIN_U32(\"graphics/pokemon/unown/p/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownP[] = INCBIN_U32(\"graphics/pokemon/unown/p/back.4bpp.lz\");\nconst u8 gMonIcon_UnownP[] = INCBIN_U8(\"graphics/pokemon/unown/p/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownQ[] = INCBIN_U32(\"graphics/pokemon/unown/q/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownQ[] = INCBIN_U32(\"graphics/pokemon/unown/q/back.4bpp.lz\");\nconst u8 gMonIcon_UnownQ[] = INCBIN_U8(\"graphics/pokemon/unown/q/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownR[] = INCBIN_U32(\"graphics/pokemon/unown/r/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownR[] = INCBIN_U32(\"graphics/pokemon/unown/r/back.4bpp.lz\");\nconst u8 gMonIcon_UnownR[] = INCBIN_U8(\"graphics/pokemon/unown/r/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownS[] = INCBIN_U32(\"graphics/pokemon/unown/s/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownS[] = INCBIN_U32(\"graphics/pokemon/unown/s/back.4bpp.lz\");\nconst u8 gMonIcon_UnownS[] = INCBIN_U8(\"graphics/pokemon/unown/s/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownT[] = INCBIN_U32(\"graphics/pokemon/unown/t/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownT[] = INCBIN_U32(\"graphics/pokemon/unown/t/back.4bpp.lz\");\nconst u8 gMonIcon_UnownT[] = INCBIN_U8(\"graphics/pokemon/unown/t/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownU[] = INCBIN_U32(\"graphics/pokemon/unown/u/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownU[] = INCBIN_U32(\"graphics/pokemon/unown/u/back.4bpp.lz\");\nconst u8 gMonIcon_UnownU[] = INCBIN_U8(\"graphics/pokemon/unown/u/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownV[] = INCBIN_U32(\"graphics/pokemon/unown/v/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownV[] = INCBIN_U32(\"graphics/pokemon/unown/v/back.4bpp.lz\");\nconst u8 gMonIcon_UnownV[] = INCBIN_U8(\"graphics/pokemon/unown/v/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownW[] = INCBIN_U32(\"graphics/pokemon/unown/w/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownW[] = INCBIN_U32(\"graphics/pokemon/unown/w/back.4bpp.lz\");\nconst u8 gMonIcon_UnownW[] = INCBIN_U8(\"graphics/pokemon/unown/w/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownX[] = INCBIN_U32(\"graphics/pokemon/unown/x/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownX[] = INCBIN_U32(\"graphics/pokemon/unown/x/back.4bpp.lz\");\nconst u8 gMonIcon_UnownX[] = INCBIN_U8(\"graphics/pokemon/unown/x/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownY[] = INCBIN_U32(\"graphics/pokemon/unown/y/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownY[] = INCBIN_U32(\"graphics/pokemon/unown/y/back.4bpp.lz\");\nconst u8 gMonIcon_UnownY[] = INCBIN_U8(\"graphics/pokemon/unown/y/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownZ[] = INCBIN_U32(\"graphics/pokemon/unown/z/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownZ[] = INCBIN_U32(\"graphics/pokemon/unown/z/back.4bpp.lz\");\nconst u8 gMonIcon_UnownZ[] = INCBIN_U8(\"graphics/pokemon/unown/z/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownExclamationMark[] = INCBIN_U32(\"graphics/pokemon/unown/exclamation_mark/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownExclamationMark[] = INCBIN_U32(\"graphics/pokemon/unown/exclamation_mark/back.4bpp.lz\");\nconst u8 gMonIcon_UnownExclamationMark[] = INCBIN_U8(\"graphics/pokemon/unown/exclamation_mark/icon.4bpp\");\n\nconst u32 gMonFrontPic_UnownQuestionMark[] = INCBIN_U32(\"graphics/pokemon/unown/question_mark/front.4bpp.lz\");\nconst u32 gMonBackPic_UnownQuestionMark[] = INCBIN_U32(\"graphics/pokemon/unown/question_mark/back.4bpp.lz\");\nconst u8 gMonIcon_UnownQuestionMark[] = INCBIN_U8(\"graphics/pokemon/unown/question_mark/icon.4bpp\");\n"
  },
  {
    "path": "src/data/graphics/trainers.h",
    "content": "const u32 gTrainerFrontPic_AquaLeaderArchie[] = INCBIN_U32(\"graphics/trainers/front_pics/aqua_leader_archie_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_AquaLeaderArchie[] = INCBIN_U32(\"graphics/trainers/palettes/aqua_leader_archie.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_AquaGruntM[] = INCBIN_U32(\"graphics/trainers/front_pics/aqua_grunt_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_AquaGruntM[] = INCBIN_U32(\"graphics/trainers/palettes/aqua_grunt_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_AquaGruntF[] = INCBIN_U32(\"graphics/trainers/front_pics/aqua_grunt_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_AquaGruntF[] = INCBIN_U32(\"graphics/trainers/palettes/aqua_grunt_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSAromaLady[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_aroma_lady_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSAromaLady[] = INCBIN_U32(\"graphics/trainers/palettes/rs_aroma_lady.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSRuinManiac[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_ruin_maniac_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSRuinManiac[] = INCBIN_U32(\"graphics/trainers/palettes/rs_ruin_maniac.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Interviewer[] = INCBIN_U32(\"graphics/trainers/front_pics/interviewer_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Interviewer[] = INCBIN_U32(\"graphics/trainers/palettes/interviewer.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSTuberF[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_tuber_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSTuberF[] = INCBIN_U32(\"graphics/trainers/palettes/rs_tuber_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_TuberM[] = INCBIN_U32(\"graphics/trainers/front_pics/tuber_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_TuberM[] = INCBIN_U32(\"graphics/trainers/palettes/tuber_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSCooltrainerM[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_cool_trainer_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSCooltrainerM[] = INCBIN_U32(\"graphics/trainers/palettes/rs_cool_trainer_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSCooltrainerF[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_cool_trainer_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSCooltrainerF[] = INCBIN_U32(\"graphics/trainers/palettes/rs_cool_trainer_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_HexManiac[] = INCBIN_U32(\"graphics/trainers/front_pics/hex_maniac_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_HexManiac[] = INCBIN_U32(\"graphics/trainers/palettes/hex_maniac.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSLady[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_lady_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSLady[] = INCBIN_U32(\"graphics/trainers/palettes/rs_lady.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSBeauty[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_beauty_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSBeauty[] = INCBIN_U32(\"graphics/trainers/palettes/rs_beauty.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RichBoy[] = INCBIN_U32(\"graphics/trainers/front_pics/rich_boy_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RichBoy[] = INCBIN_U32(\"graphics/trainers/palettes/rich_boy.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSPokeManiac[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_pokemaniac_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSPokeManiac[] = INCBIN_U32(\"graphics/trainers/palettes/rs_pokemaniac.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSSwimmerM[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_swimmer_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSSwimmerM[] = INCBIN_U32(\"graphics/trainers/palettes/rs_swimmer_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSBlackBelt[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_black_belt_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSBlackBelt[] = INCBIN_U32(\"graphics/trainers/palettes/rs_black_belt.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Guitarist[] = INCBIN_U32(\"graphics/trainers/front_pics/guitarist_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Guitarist[] = INCBIN_U32(\"graphics/trainers/palettes/guitarist.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Kindler[] = INCBIN_U32(\"graphics/trainers/front_pics/kindler_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Kindler[] = INCBIN_U32(\"graphics/trainers/palettes/kindler.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSCamper[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_camper_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSCamper[] = INCBIN_U32(\"graphics/trainers/palettes/rs_camper.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_BugManiac[] = INCBIN_U32(\"graphics/trainers/front_pics/bug_maniac_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_BugManiac[] = INCBIN_U32(\"graphics/trainers/palettes/bug_maniac.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSPsychicM[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_psychic_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSPsychicM[] = INCBIN_U32(\"graphics/trainers/palettes/rs_psychic_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSPsychicF[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_psychic_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSPsychicF[] = INCBIN_U32(\"graphics/trainers/palettes/rs_psychic_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSGentleman[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_gentleman_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSGentleman[] = INCBIN_U32(\"graphics/trainers/palettes/rs_gentleman.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_EliteFourSidney[] = INCBIN_U32(\"graphics/trainers/front_pics/elite_four_sidney_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_EliteFourSidney[] = INCBIN_U32(\"graphics/trainers/palettes/elite_four_sidney.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_EliteFourPhoebe[] = INCBIN_U32(\"graphics/trainers/front_pics/elite_four_phoebe_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_EliteFourPhoebe[] = INCBIN_U32(\"graphics/trainers/palettes/elite_four_phoebe.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderRoxanne[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_roxanne_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderRoxanne[] = INCBIN_U32(\"graphics/trainers/palettes/leader_roxanne.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderBrawly[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_brawly_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderBrawly[] = INCBIN_U32(\"graphics/trainers/palettes/leader_brawly.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderTateAndLiza[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_tate_and_liza_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderTateAndLiza[] = INCBIN_U32(\"graphics/trainers/palettes/leader_tate_and_liza.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_SchoolKidM[] = INCBIN_U32(\"graphics/trainers/front_pics/school_kid_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_SchoolKidM[] = INCBIN_U32(\"graphics/trainers/palettes/school_kid_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_SchoolKidF[] = INCBIN_U32(\"graphics/trainers/front_pics/school_kid_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_SchoolKidF[] = INCBIN_U32(\"graphics/trainers/palettes/school_kid_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_SrAndJr[] = INCBIN_U32(\"graphics/trainers/front_pics/sr_and_jr_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_SrAndJr[] = INCBIN_U32(\"graphics/trainers/palettes/sr_and_jr.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_PokefanM[] = INCBIN_U32(\"graphics/trainers/front_pics/pokefan_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_PokefanM[] = INCBIN_U32(\"graphics/trainers/palettes/pokefan_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_PokefanF[] = INCBIN_U32(\"graphics/trainers/front_pics/pokefan_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_PokefanF[] = INCBIN_U32(\"graphics/trainers/palettes/pokefan_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_ExpertM[] = INCBIN_U32(\"graphics/trainers/front_pics/expert_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_ExpertM[] = INCBIN_U32(\"graphics/trainers/palettes/expert_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_ExpertF[] = INCBIN_U32(\"graphics/trainers/front_pics/expert_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_ExpertF[] = INCBIN_U32(\"graphics/trainers/palettes/expert_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSYoungster[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_youngster_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSYoungster[] = INCBIN_U32(\"graphics/trainers/palettes/rs_youngster.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_ChampionSteven[] = INCBIN_U32(\"graphics/trainers/front_pics/champion_steven_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_ChampionSteven[] = INCBIN_U32(\"graphics/trainers/palettes/champion_steven.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSFisherman[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_fisherman_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSFisherman[] = INCBIN_U32(\"graphics/trainers/palettes/rs_fisherman.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_CyclingTriathleteM[] = INCBIN_U32(\"graphics/trainers/front_pics/cycling_triathlete_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_CyclingTriathleteM[] = INCBIN_U32(\"graphics/trainers/palettes/cycling_triathlete_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_CyclingTriathleteF[] = INCBIN_U32(\"graphics/trainers/front_pics/cycling_triathlete_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_CyclingTriathleteF[] = INCBIN_U32(\"graphics/trainers/palettes/cycling_triathlete_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RunningTriathleteM[] = INCBIN_U32(\"graphics/trainers/front_pics/running_triathlete_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RunningTriathleteM[] = INCBIN_U32(\"graphics/trainers/palettes/running_triathlete_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RunningTriathleteF[] = INCBIN_U32(\"graphics/trainers/front_pics/running_triathlete_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RunningTriathleteF[] = INCBIN_U32(\"graphics/trainers/palettes/running_triathlete_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_SwimmingTriathleteM[] = INCBIN_U32(\"graphics/trainers/front_pics/swimming_triathlete_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_SwimmingTriathleteM[] = INCBIN_U32(\"graphics/trainers/palettes/swimming_triathlete_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_SwimmingTriathleteF[] = INCBIN_U32(\"graphics/trainers/front_pics/swimming_triathlete_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_SwimmingTriathleteF[] = INCBIN_U32(\"graphics/trainers/palettes/swimming_triathlete_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_DragonTamer[] = INCBIN_U32(\"graphics/trainers/front_pics/dragon_tamer_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_DragonTamer[] = INCBIN_U32(\"graphics/trainers/palettes/dragon_tamer.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSBirdKeeper[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_bird_keeper_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSBirdKeeper[] = INCBIN_U32(\"graphics/trainers/palettes/rs_bird_keeper.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_NinjaBoy[] = INCBIN_U32(\"graphics/trainers/front_pics/ninja_boy_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_NinjaBoy[] = INCBIN_U32(\"graphics/trainers/palettes/ninja_boy.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_BattleGirl[] = INCBIN_U32(\"graphics/trainers/front_pics/battle_girl_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_BattleGirl[] = INCBIN_U32(\"graphics/trainers/palettes/battle_girl.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_ParasolLady[] = INCBIN_U32(\"graphics/trainers/front_pics/parasol_lady_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_ParasolLady[] = INCBIN_U32(\"graphics/trainers/palettes/parasol_lady.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSSwimmerF[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_swimmer_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSSwimmerF[] = INCBIN_U32(\"graphics/trainers/palettes/rs_swimmer_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSPicnicker[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_picnicker_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSPicnicker[] = INCBIN_U32(\"graphics/trainers/palettes/rs_picnicker.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSTwins[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_twins_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSTwins[] = INCBIN_U32(\"graphics/trainers/palettes/rs_twins.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSSailor[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_sailor_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSSailor[] = INCBIN_U32(\"graphics/trainers/palettes/rs_sailor.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Collector[] = INCBIN_U32(\"graphics/trainers/front_pics/collector_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Collector[] = INCBIN_U32(\"graphics/trainers/palettes/collector.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Wally[] = INCBIN_U32(\"graphics/trainers/front_pics/wally_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Wally[] = INCBIN_U32(\"graphics/trainers/palettes/wally.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSBrendan1[] = INCBIN_U32(\"graphics/trainers/front_pics/ruby_sapphire_brendan_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSBrendan1[] = INCBIN_U32(\"graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSMay1[] = INCBIN_U32(\"graphics/trainers/front_pics/ruby_sapphire_may_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSMay1[] = INCBIN_U32(\"graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSPokemonBreederM[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_pokemon_breeder_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSPokemonBreederM[] = INCBIN_U32(\"graphics/trainers/palettes/rs_pokemon_breeder_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSPokemonBreederF[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_pokemon_breeder_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSPokemonBreederF[] = INCBIN_U32(\"graphics/trainers/palettes/rs_pokemon_breeder_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSPokemonRangerM[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_pokemon_ranger_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSPokemonRangerM[] = INCBIN_U32(\"graphics/trainers/palettes/rs_pokemon_ranger_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSPokemonRangerF[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_pokemon_ranger_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSPokemonRangerF[] = INCBIN_U32(\"graphics/trainers/palettes/rs_pokemon_ranger_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MagmaLeaderMaxie[] = INCBIN_U32(\"graphics/trainers/front_pics/magma_leader_maxie_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MagmaLeaderMaxie[] = INCBIN_U32(\"graphics/trainers/palettes/magma_leader_maxie.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MagmaGruntM[] = INCBIN_U32(\"graphics/trainers/front_pics/magma_grunt_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MagmaGruntM[] = INCBIN_U32(\"graphics/trainers/palettes/magma_grunt_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MagmaGruntF[] = INCBIN_U32(\"graphics/trainers/front_pics/magma_grunt_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MagmaGruntF[] = INCBIN_U32(\"graphics/trainers/palettes/magma_grunt_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSLass[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_lass_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSLass[] = INCBIN_U32(\"graphics/trainers/palettes/rs_lass.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSBugCatcher[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_bug_catcher_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSBugCatcher[] = INCBIN_U32(\"graphics/trainers/palettes/rs_bug_catcher.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSHiker[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_hiker_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSHiker[] = INCBIN_U32(\"graphics/trainers/palettes/rs_hiker.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSYoungCouple[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_young_couple_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSYoungCouple[] = INCBIN_U32(\"graphics/trainers/palettes/rs_young_couple.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_OldCouple[] = INCBIN_U32(\"graphics/trainers/front_pics/old_couple_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_OldCouple[] = INCBIN_U32(\"graphics/trainers/palettes/old_couple.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSSisAndBro[] = INCBIN_U32(\"graphics/trainers/front_pics/rs_sis_and_bro_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSSisAndBro[] = INCBIN_U32(\"graphics/trainers/palettes/rs_sis_and_bro.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_AquaAdminM[] = INCBIN_U32(\"graphics/trainers/front_pics/aqua_admin_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_AquaAdminM[] = INCBIN_U32(\"graphics/trainers/palettes/aqua_admin_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_AquaAdminF[] = INCBIN_U32(\"graphics/trainers/front_pics/aqua_admin_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_AquaAdminF[] = INCBIN_U32(\"graphics/trainers/palettes/aqua_admin_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MagmaAdminM[] = INCBIN_U32(\"graphics/trainers/front_pics/magma_admin_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MagmaAdminM[] = INCBIN_U32(\"graphics/trainers/palettes/magma_admin_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MagmaAdminF[] = INCBIN_U32(\"graphics/trainers/front_pics/magma_admin_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MagmaAdminF[] = INCBIN_U32(\"graphics/trainers/palettes/magma_admin_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderWattson[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_wattson_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderWattson[] = INCBIN_U32(\"graphics/trainers/palettes/leader_wattson.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderFlannery[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_flannery_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderFlannery[] = INCBIN_U32(\"graphics/trainers/palettes/leader_flannery.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderNorman[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_norman_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderNorman[] = INCBIN_U32(\"graphics/trainers/palettes/leader_norman.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderWinona[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_winona_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderWinona[] = INCBIN_U32(\"graphics/trainers/palettes/leader_winona.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderWallace[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_wallace_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderWallace[] = INCBIN_U32(\"graphics/trainers/palettes/leader_wallace.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_EliteFourGlacia[] = INCBIN_U32(\"graphics/trainers/front_pics/elite_four_glacia_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_EliteFourGlacia[] = INCBIN_U32(\"graphics/trainers/palettes/elite_four_glacia.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_EliteFourDrake[] = INCBIN_U32(\"graphics/trainers/front_pics/elite_four_drake_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_EliteFourDrake[] = INCBIN_U32(\"graphics/trainers/palettes/elite_four_drake.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Youngster[] = INCBIN_U32(\"graphics/trainers/front_pics/youngster_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Youngster[] = INCBIN_U32(\"graphics/trainers/palettes/youngster.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_BugCatcher[] = INCBIN_U32(\"graphics/trainers/front_pics/bug_catcher_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_BugCatcher[] = INCBIN_U32(\"graphics/trainers/palettes/bug_catcher.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Lass[] = INCBIN_U32(\"graphics/trainers/front_pics/lass_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Lass[] = INCBIN_U32(\"graphics/trainers/palettes/lass.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Sailor[] = INCBIN_U32(\"graphics/trainers/front_pics/sailor_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Sailor[] = INCBIN_U32(\"graphics/trainers/palettes/sailor.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Camper[] = INCBIN_U32(\"graphics/trainers/front_pics/camper_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Camper[] = INCBIN_U32(\"graphics/trainers/palettes/camper.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Picnicker[] = INCBIN_U32(\"graphics/trainers/front_pics/picnicker_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Picnicker[] = INCBIN_U32(\"graphics/trainers/palettes/picnicker.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_PokeManiac[] = INCBIN_U32(\"graphics/trainers/front_pics/pokemaniac_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_PokeManiac[] = INCBIN_U32(\"graphics/trainers/palettes/pokemaniac.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_SuperNerd[] = INCBIN_U32(\"graphics/trainers/front_pics/super_nerd_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_SuperNerd[] = INCBIN_U32(\"graphics/trainers/palettes/super_nerd.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Hiker[] = INCBIN_U32(\"graphics/trainers/front_pics/hiker_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Hiker[] = INCBIN_U32(\"graphics/trainers/palettes/hiker.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Biker[] = INCBIN_U32(\"graphics/trainers/front_pics/biker_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Biker[] = INCBIN_U32(\"graphics/trainers/palettes/biker.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Burglar[] = INCBIN_U32(\"graphics/trainers/front_pics/burglar_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Burglar[] = INCBIN_U32(\"graphics/trainers/palettes/burglar.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Engineer[] = INCBIN_U32(\"graphics/trainers/front_pics/engineer_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Engineer[] = INCBIN_U32(\"graphics/trainers/palettes/engineer.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Fisherman[] = INCBIN_U32(\"graphics/trainers/front_pics/fisherman_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Fisherman[] = INCBIN_U32(\"graphics/trainers/palettes/fisherman.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_SwimmerM[] = INCBIN_U32(\"graphics/trainers/front_pics/swimmer_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_SwimmerM[] = INCBIN_U32(\"graphics/trainers/palettes/swimmer_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_CueBall[] = INCBIN_U32(\"graphics/trainers/front_pics/cue_ball_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_CueBall[] = INCBIN_U32(\"graphics/trainers/palettes/cue_ball.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Gamer[] = INCBIN_U32(\"graphics/trainers/front_pics/gamer_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Gamer[] = INCBIN_U32(\"graphics/trainers/palettes/gamer.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Beauty[] = INCBIN_U32(\"graphics/trainers/front_pics/beauty_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Beauty[] = INCBIN_U32(\"graphics/trainers/palettes/beauty.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_SwimmerF[] = INCBIN_U32(\"graphics/trainers/front_pics/swimmer_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_SwimmerF[] = INCBIN_U32(\"graphics/trainers/palettes/swimmer_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_PsychicM[] = INCBIN_U32(\"graphics/trainers/front_pics/psychic_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_PsychicM[] = INCBIN_U32(\"graphics/trainers/palettes/psychic_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Rocker[] = INCBIN_U32(\"graphics/trainers/front_pics/rocker_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Rocker[] = INCBIN_U32(\"graphics/trainers/palettes/rocker.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Juggler[] = INCBIN_U32(\"graphics/trainers/front_pics/juggler_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Juggler[] = INCBIN_U32(\"graphics/trainers/palettes/juggler.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Tamer[] = INCBIN_U32(\"graphics/trainers/front_pics/tamer_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Tamer[] = INCBIN_U32(\"graphics/trainers/palettes/tamer.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_BirdKeeper[] = INCBIN_U32(\"graphics/trainers/front_pics/bird_keeper_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_BirdKeeper[] = INCBIN_U32(\"graphics/trainers/palettes/bird_keeper.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_BlackBelt[] = INCBIN_U32(\"graphics/trainers/front_pics/black_belt_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_BlackBelt[] = INCBIN_U32(\"graphics/trainers/palettes/black_belt.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RivalEarly[] = INCBIN_U32(\"graphics/trainers/front_pics/rival_early_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RivalEarly[] = INCBIN_U32(\"graphics/trainers/palettes/rival_early.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Scientist[] = INCBIN_U32(\"graphics/trainers/front_pics/scientist_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Scientist[] = INCBIN_U32(\"graphics/trainers/palettes/scientist.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderGiovanni[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_giovanni_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderGiovanni[] = INCBIN_U32(\"graphics/trainers/palettes/leader_giovanni.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RocketGruntM[] = INCBIN_U32(\"graphics/trainers/front_pics/rocket_grunt_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RocketGruntM[] = INCBIN_U32(\"graphics/trainers/palettes/rocket_grunt_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_CooltrainerM[] = INCBIN_U32(\"graphics/trainers/front_pics/cool_trainer_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_CooltrainerM[] = INCBIN_U32(\"graphics/trainers/palettes/cool_trainer_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_CooltrainerF[] = INCBIN_U32(\"graphics/trainers/front_pics/cool_trainer_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_CooltrainerF[] = INCBIN_U32(\"graphics/trainers/palettes/cool_trainer_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_EliteFourLorelei[] = INCBIN_U32(\"graphics/trainers/front_pics/elite_four_lorelei_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_EliteFourLorelei[] = INCBIN_U32(\"graphics/trainers/palettes/elite_four_lorelei.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_EliteFourBruno[] = INCBIN_U32(\"graphics/trainers/front_pics/elite_four_bruno_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_EliteFourBruno[] = INCBIN_U32(\"graphics/trainers/palettes/elite_four_bruno.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_EliteFourAgatha[] = INCBIN_U32(\"graphics/trainers/front_pics/elite_four_agatha_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_EliteFourAgatha[] = INCBIN_U32(\"graphics/trainers/palettes/elite_four_agatha.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_EliteFourLance[] = INCBIN_U32(\"graphics/trainers/front_pics/elite_four_lance_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_EliteFourLance[] = INCBIN_U32(\"graphics/trainers/palettes/elite_four_lance.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderBrock[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_brock_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderBrock[] = INCBIN_U32(\"graphics/trainers/palettes/leader_brock.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderMisty[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_misty_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderMisty[] = INCBIN_U32(\"graphics/trainers/palettes/leader_misty.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderLtSurge[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_lt_surge_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderLtSurge[] = INCBIN_U32(\"graphics/trainers/palettes/leader_lt_surge.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderErika[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_erika_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderErika[] = INCBIN_U32(\"graphics/trainers/palettes/leader_erika.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderKoga[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_koga_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderKoga[] = INCBIN_U32(\"graphics/trainers/palettes/leader_koga.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderBlaine[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_blaine_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderBlaine[] = INCBIN_U32(\"graphics/trainers/palettes/leader_blaine.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_LeaderSabrina[] = INCBIN_U32(\"graphics/trainers/front_pics/leader_sabrina_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_LeaderSabrina[] = INCBIN_U32(\"graphics/trainers/palettes/leader_sabrina.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Gentleman[] = INCBIN_U32(\"graphics/trainers/front_pics/gentleman_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Gentleman[] = INCBIN_U32(\"graphics/trainers/palettes/gentleman.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RivalLate[] = INCBIN_U32(\"graphics/trainers/front_pics/rival_late_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RivalLate[] = INCBIN_U32(\"graphics/trainers/palettes/rival_late.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_ChampionRival[] = INCBIN_U32(\"graphics/trainers/front_pics/champion_rival_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_ChampionRival[] = INCBIN_U32(\"graphics/trainers/palettes/champion_rival.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Channeler[] = INCBIN_U32(\"graphics/trainers/front_pics/channeler_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Channeler[] = INCBIN_U32(\"graphics/trainers/palettes/channeler.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Twins[] = INCBIN_U32(\"graphics/trainers/front_pics/twins_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Twins[] = INCBIN_U32(\"graphics/trainers/palettes/twins.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_CoolCouple[] = INCBIN_U32(\"graphics/trainers/front_pics/cool_couple_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_CoolCouple[] = INCBIN_U32(\"graphics/trainers/palettes/cool_couple.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_YoungCouple[] = INCBIN_U32(\"graphics/trainers/front_pics/young_couple_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_YoungCouple[] = INCBIN_U32(\"graphics/trainers/palettes/young_couple.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_CrushKin[] = INCBIN_U32(\"graphics/trainers/front_pics/crush_kin_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_CrushKin[] = INCBIN_U32(\"graphics/trainers/palettes/crush_kin.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_SisAndBro[] = INCBIN_U32(\"graphics/trainers/front_pics/sis_and_bro_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_SisAndBro[] = INCBIN_U32(\"graphics/trainers/palettes/sis_and_bro.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_ProfessorOak[] = INCBIN_U32(\"graphics/trainers/front_pics/professor_oak_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_ProfessorOak[] = INCBIN_U32(\"graphics/trainers/palettes/professor_oak.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSBrendan2[] = INCBIN_U32(\"graphics/trainers/front_pics/ruby_sapphire_brendan_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSBrendan2[] = INCBIN_U32(\"graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RSMay2[] = INCBIN_U32(\"graphics/trainers/front_pics/ruby_sapphire_may_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RSMay2[] = INCBIN_U32(\"graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Red[] = INCBIN_U32(\"graphics/trainers/front_pics/red_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Red[] = INCBIN_U32(\"graphics/trainers/palettes/red.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Leaf[] = INCBIN_U32(\"graphics/trainers/front_pics/leaf_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Leaf[] = INCBIN_U32(\"graphics/trainers/palettes/leaf.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RocketGruntF[] = INCBIN_U32(\"graphics/trainers/front_pics/rocket_grunt_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RocketGruntF[] = INCBIN_U32(\"graphics/trainers/palettes/rocket_grunt_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_PsychicF[] = INCBIN_U32(\"graphics/trainers/front_pics/psychic_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_PsychicF[] = INCBIN_U32(\"graphics/trainers/palettes/psychic_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_CrushGirl[] = INCBIN_U32(\"graphics/trainers/front_pics/crush_girl_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_CrushGirl[] = INCBIN_U32(\"graphics/trainers/palettes/crush_girl.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_TuberF[] = INCBIN_U32(\"graphics/trainers/front_pics/tuber_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_TuberF[] = INCBIN_U32(\"graphics/trainers/palettes/tuber_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_PokemonBreeder[] = INCBIN_U32(\"graphics/trainers/front_pics/pokemon_breeder_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_PokemonBreeder[] = INCBIN_U32(\"graphics/trainers/palettes/pokemon_breeder.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_PokemonRangerM[] = INCBIN_U32(\"graphics/trainers/front_pics/pokemon_ranger_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_PokemonRangerM[] = INCBIN_U32(\"graphics/trainers/palettes/pokemon_ranger_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_PokemonRangerF[] = INCBIN_U32(\"graphics/trainers/front_pics/pokemon_ranger_f_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_PokemonRangerF[] = INCBIN_U32(\"graphics/trainers/palettes/pokemon_ranger_f.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_AromaLady[] = INCBIN_U32(\"graphics/trainers/front_pics/aroma_lady_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_AromaLady[] = INCBIN_U32(\"graphics/trainers/palettes/aroma_lady.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_RuinManiac[] = INCBIN_U32(\"graphics/trainers/front_pics/ruin_maniac_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_RuinManiac[] = INCBIN_U32(\"graphics/trainers/palettes/ruin_maniac.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Lady[] = INCBIN_U32(\"graphics/trainers/front_pics/lady_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Lady[] = INCBIN_U32(\"graphics/trainers/palettes/lady.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_Painter[] = INCBIN_U32(\"graphics/trainers/front_pics/painter_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_Painter[] = INCBIN_U32(\"graphics/trainers/palettes/painter.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_EmBrendan[] = INCBIN_U32(\"graphics/trainers/front_pics/emerald_brendan_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_EmBrendan[] = INCBIN_U32(\"graphics/trainers/palettes/emerald_brendan.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_EmMay[] = INCBIN_U32(\"graphics/trainers/front_pics/emerald_may_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_EmMay[] = INCBIN_U32(\"graphics/trainers/palettes/emerald_may.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MasterBeauty[] = INCBIN_U32(\"graphics/trainers/front_pics/master_beauty_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MasterBeauty[] = INCBIN_U32(\"graphics/trainers/palettes/master_beauty.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MasterBirdKeeper[] = INCBIN_U32(\"graphics/trainers/front_pics/master_bird_keeper_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MasterBirdKeeper[] = INCBIN_U32(\"graphics/trainers/palettes/master_bird_keeper.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MasterBlackBelt[] = INCBIN_U32(\"graphics/trainers/front_pics/master_black_belt_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MasterBlackBelt[] = INCBIN_U32(\"graphics/trainers/palettes/master_black_belt.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MasterBugCatcher[] = INCBIN_U32(\"graphics/trainers/front_pics/master_bug_catcher_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MasterBugCatcher[] = INCBIN_U32(\"graphics/trainers/palettes/master_bug_catcher.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MasterCooltrainerM[] = INCBIN_U32(\"graphics/trainers/front_pics/master_cool_trainer_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MasterCooltrainerM[] = INCBIN_U32(\"graphics/trainers/palettes/master_cool_trainer_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MasterHiker[] = INCBIN_U32(\"graphics/trainers/front_pics/master_hiker_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MasterHiker[] = INCBIN_U32(\"graphics/trainers/palettes/master_hiker.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MasterLass[] = INCBIN_U32(\"graphics/trainers/front_pics/master_lass_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MasterLass[] = INCBIN_U32(\"graphics/trainers/palettes/master_lass.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MasterPsychicM[] = INCBIN_U32(\"graphics/trainers/front_pics/master_psychic_m_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MasterPsychicM[] = INCBIN_U32(\"graphics/trainers/palettes/master_psychic_m.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MasterScientist[] = INCBIN_U32(\"graphics/trainers/front_pics/master_scientist_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MasterScientist[] = INCBIN_U32(\"graphics/trainers/palettes/master_scientist.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MasterYoungster[] = INCBIN_U32(\"graphics/trainers/front_pics/master_youngster_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MasterYoungster[] = INCBIN_U32(\"graphics/trainers/palettes/master_youngster.gbapal.lz\");\n\nconst u32 gTrainerFrontPic_MasterSwimmer[] = INCBIN_U32(\"graphics/trainers/front_pics/master_swimmer_front_pic.4bpp.lz\");\nconst u32 gTrainerPalette_MasterSwimmer[] = INCBIN_U32(\"graphics/trainers/palettes/master_swimmer.gbapal.lz\");\n\nconst u8 gTrainerBackPic_Red[] = INCBIN_U8(\"graphics/trainers/back_pics/red_back_pic.4bpp\");\nconst u8 gTrainerBackPic_Leaf[] = INCBIN_U8(\"graphics/trainers/back_pics/leaf_back_pic.4bpp\");\nconst u8 gTrainerBackPic_Pokedude[] = INCBIN_U8(\"graphics/trainers/back_pics/pokedude_back_pic.4bpp\");\nconst u8 gTrainerBackPic_OldMan[] = INCBIN_U8(\"graphics/trainers/back_pics/old_man_back_pic.4bpp\");\n\nconst u8 gTrainerBackPic_RSBrendan[] = INCBIN_U8(\"graphics/trainers/back_pics/ruby_sapphire_brendan_back_pic.4bpp\");\nconst u8 gTrainerBackPic_RSMay[] = INCBIN_U8(\"graphics/trainers/back_pics/ruby_sapphire_may_back_pic.4bpp\");\nconst u8 gTrainerBackPic_EmBrendan[] = INCBIN_U8(\"graphics/trainers/back_pics/emerald_brendan_back_pic.4bpp\");\nconst u8 gTrainerBackPic_EmMay[] = INCBIN_U8(\"graphics/trainers/back_pics/emerald_may_back_pic.4bpp\");\n\nconst u32 gTrainerPalette_RedBackPic[] = INCBIN_U32(\"graphics/trainers/palettes/red_back_pic.gbapal.lz\");\nconst u32 gTrainerPalette_LeafBackPic[] = INCBIN_U32(\"graphics/trainers/palettes/leaf_back_pic.gbapal.lz\");\nconst u32 gTrainerPalette_PokedudeBackPic[] = INCBIN_U32(\"graphics/trainers/palettes/pokedude_back_pic.gbapal.lz\");\nconst u32 gTrainerPalette_OldManBackPic[] = INCBIN_U32(\"graphics/trainers/palettes/old_man_back_pic.gbapal.lz\");\n"
  },
  {
    "path": "src/data/heal_locations.h",
    "content": "static const struct HealLocation sSpawnPoints[] =\n{\n    [SPAWN_PALLET_TOWN - 1] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 6, 8},\n    [SPAWN_VIRIDIAN_CITY - 1] = {MAP_GROUP(VIRIDIAN_CITY), MAP_NUM(VIRIDIAN_CITY), 26, 27},\n    [SPAWN_PEWTER_CITY - 1] = {MAP_GROUP(PEWTER_CITY), MAP_NUM(PEWTER_CITY), 17, 26},\n    [SPAWN_CERULEAN_CITY - 1] = {MAP_GROUP(CERULEAN_CITY), MAP_NUM(CERULEAN_CITY), 22, 20},\n    [SPAWN_LAVENDER_TOWN - 1] = {MAP_GROUP(LAVENDER_TOWN), MAP_NUM(LAVENDER_TOWN), 6, 6},\n    [SPAWN_VERMILION_CITY - 1] = {MAP_GROUP(VERMILION_CITY), MAP_NUM(VERMILION_CITY), 15, 7},\n    [SPAWN_CELADON_CITY - 1] = {MAP_GROUP(CELADON_CITY), MAP_NUM(CELADON_CITY), 48, 12},\n    [SPAWN_FUCHSIA_CITY - 1] = {MAP_GROUP(FUCHSIA_CITY), MAP_NUM(FUCHSIA_CITY), 25, 32},\n    [SPAWN_CINNABAR_ISLAND - 1] = {MAP_GROUP(CINNABAR_ISLAND), MAP_NUM(CINNABAR_ISLAND), 14, 12},\n    [SPAWN_INDIGO_PLATEAU - 1] = {MAP_GROUP(INDIGO_PLATEAU_EXTERIOR), MAP_NUM(INDIGO_PLATEAU_EXTERIOR), 11, 7},\n    [SPAWN_SAFFRON_CITY - 1] = {MAP_GROUP(SAFFRON_CITY), MAP_NUM(SAFFRON_CITY), 24, 39},\n    [SPAWN_ROUTE4 - 1] = {MAP_GROUP(ROUTE4), MAP_NUM(ROUTE4), 12, 6},\n    [SPAWN_ROUTE10 - 1] = {MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10), 13, 21},\n    [SPAWN_ONE_ISLAND - 1] = {MAP_GROUP(ONE_ISLAND), MAP_NUM(ONE_ISLAND), 14, 6},\n    [SPAWN_TWO_ISLAND - 1] = {MAP_GROUP(TWO_ISLAND), MAP_NUM(TWO_ISLAND), 21, 8},\n    [SPAWN_THREE_ISLAND - 1] = {MAP_GROUP(THREE_ISLAND), MAP_NUM(THREE_ISLAND), 14, 28},\n    [SPAWN_FOUR_ISLAND - 1] = {MAP_GROUP(FOUR_ISLAND), MAP_NUM(FOUR_ISLAND), 18, 21},\n    [SPAWN_FIVE_ISLAND - 1] = {MAP_GROUP(FIVE_ISLAND), MAP_NUM(FIVE_ISLAND), 13, 7},\n    [SPAWN_SEVEN_ISLAND - 1] = {MAP_GROUP(SEVEN_ISLAND), MAP_NUM(SEVEN_ISLAND), 12, 4},\n    [SPAWN_SIX_ISLAND - 1] = {MAP_GROUP(SIX_ISLAND), MAP_NUM(SIX_ISLAND), 12, 12},\n    [SPAWN_BATTLE_FRONTIER - 1] = {MAP_GROUP(BATTLE_FRONTIER_OUTSIDE_EAST), MAP_NUM(BATTLE_FRONTIER_OUTSIDE_EAST), 4, 52},\n};\n\nstatic const u16 sWhiteoutRespawnHealCenterMapIdxs[][2] =\n{\n    [SPAWN_PALLET_TOWN - 1] = {MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F), MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)},\n    [SPAWN_VIRIDIAN_CITY - 1] = {MAP_GROUP(VIRIDIAN_CITY_POKEMON_CENTER_1F), MAP_NUM(VIRIDIAN_CITY_POKEMON_CENTER_1F)},\n    [SPAWN_PEWTER_CITY - 1] = {MAP_GROUP(PEWTER_CITY_POKEMON_CENTER_1F), MAP_NUM(PEWTER_CITY_POKEMON_CENTER_1F)},\n    [SPAWN_CERULEAN_CITY - 1] = {MAP_GROUP(CERULEAN_CITY_POKEMON_CENTER_1F), MAP_NUM(CERULEAN_CITY_POKEMON_CENTER_1F)},\n    [SPAWN_LAVENDER_TOWN - 1] = {MAP_GROUP(LAVENDER_TOWN_POKEMON_CENTER_1F), MAP_NUM(LAVENDER_TOWN_POKEMON_CENTER_1F)},\n    [SPAWN_VERMILION_CITY - 1] = {MAP_GROUP(VERMILION_CITY_POKEMON_CENTER_1F), MAP_NUM(VERMILION_CITY_POKEMON_CENTER_1F)},\n    [SPAWN_CELADON_CITY - 1] = {MAP_GROUP(CELADON_CITY_POKEMON_CENTER_1F), MAP_NUM(CELADON_CITY_POKEMON_CENTER_1F)},\n    [SPAWN_FUCHSIA_CITY - 1] = {MAP_GROUP(FUCHSIA_CITY_POKEMON_CENTER_1F), MAP_NUM(FUCHSIA_CITY_POKEMON_CENTER_1F)},\n    [SPAWN_CINNABAR_ISLAND - 1] = {MAP_GROUP(CINNABAR_ISLAND_POKEMON_CENTER_1F), MAP_NUM(CINNABAR_ISLAND_POKEMON_CENTER_1F)},\n    [SPAWN_INDIGO_PLATEAU - 1] = {MAP_GROUP(INDIGO_PLATEAU_POKEMON_CENTER_1F), MAP_NUM(INDIGO_PLATEAU_POKEMON_CENTER_1F)},\n    [SPAWN_SAFFRON_CITY - 1] = {MAP_GROUP(SAFFRON_CITY_POKEMON_CENTER_1F), MAP_NUM(SAFFRON_CITY_POKEMON_CENTER_1F)},\n    [SPAWN_ROUTE4 - 1] = {MAP_GROUP(ROUTE4_POKEMON_CENTER_1F), MAP_NUM(ROUTE4_POKEMON_CENTER_1F)},\n    [SPAWN_ROUTE10 - 1] = {MAP_GROUP(ROUTE10_POKEMON_CENTER_1F), MAP_NUM(ROUTE10_POKEMON_CENTER_1F)},\n    [SPAWN_ONE_ISLAND - 1] = {MAP_GROUP(ONE_ISLAND_POKEMON_CENTER_1F), MAP_NUM(ONE_ISLAND_POKEMON_CENTER_1F)},\n    [SPAWN_TWO_ISLAND - 1] = {MAP_GROUP(TWO_ISLAND_POKEMON_CENTER_1F), MAP_NUM(TWO_ISLAND_POKEMON_CENTER_1F)},\n    [SPAWN_THREE_ISLAND - 1] = {MAP_GROUP(THREE_ISLAND_POKEMON_CENTER_1F), MAP_NUM(THREE_ISLAND_POKEMON_CENTER_1F)},\n    [SPAWN_FOUR_ISLAND - 1] = {MAP_GROUP(FOUR_ISLAND_POKEMON_CENTER_1F), MAP_NUM(FOUR_ISLAND_POKEMON_CENTER_1F)},\n    [SPAWN_FIVE_ISLAND - 1] = {MAP_GROUP(FIVE_ISLAND_POKEMON_CENTER_1F), MAP_NUM(FIVE_ISLAND_POKEMON_CENTER_1F)},\n    [SPAWN_SEVEN_ISLAND - 1] = {MAP_GROUP(SEVEN_ISLAND_POKEMON_CENTER_1F), MAP_NUM(SEVEN_ISLAND_POKEMON_CENTER_1F)},\n    [SPAWN_SIX_ISLAND - 1] = {MAP_GROUP(SIX_ISLAND_POKEMON_CENTER_1F), MAP_NUM(SIX_ISLAND_POKEMON_CENTER_1F)},\n    [SPAWN_BATTLE_FRONTIER - 1] = {MAP_GROUP(BATTLE_FRONTIER_POKEMON_CENTER_1F), MAP_NUM(BATTLE_FRONTIER_POKEMON_CENTER_1F)},\n};\n\nstatic const u8 sWhiteoutRespawnHealerNpcIds[] =\n{\n    [SPAWN_PALLET_TOWN - 1] = 1,\n    [SPAWN_VIRIDIAN_CITY - 1] = 1,\n    [SPAWN_PEWTER_CITY - 1] = 3,\n    [SPAWN_CERULEAN_CITY - 1] = 1,\n    [SPAWN_LAVENDER_TOWN - 1] = 1,\n    [SPAWN_VERMILION_CITY - 1] = 1,\n    [SPAWN_CELADON_CITY - 1] = 1,\n    [SPAWN_FUCHSIA_CITY - 1] = 1,\n    [SPAWN_CINNABAR_ISLAND - 1] = 1,\n    [SPAWN_INDIGO_PLATEAU - 1] = 2,\n    [SPAWN_SAFFRON_CITY - 1] = 1,\n    [SPAWN_ROUTE4 - 1] = 1,\n    [SPAWN_ROUTE10 - 1] = 1,\n    [SPAWN_ONE_ISLAND - 1] = 1,\n    [SPAWN_TWO_ISLAND - 1] = 1,\n    [SPAWN_THREE_ISLAND - 1] = 1,\n    [SPAWN_FOUR_ISLAND - 1] = 1,\n    [SPAWN_FIVE_ISLAND - 1] = 1,\n    [SPAWN_SEVEN_ISLAND - 1] = 1,\n    [SPAWN_SIX_ISLAND - 1] = 1,\n    [SPAWN_BATTLE_FRONTIER - 1] = 1,\n};\n"
  },
  {
    "path": "src/data/ingame_trades.h",
    "content": "static const struct InGameTrade sInGameTrades[] = {\n    [INGAME_TRADE_MR_MIME] = \n    {\n        .nickname = _(\"MIMIEN\"),\n        .species = SPECIES_MR_MIME,\n        .ivs = {20, 15, 17, 24, 23, 22},\n        .abilityNum = 0,\n        .otId = 1985,\n        .conditions = {5, 5, 5, 30, 5},\n        .personality = 0x00009cae,\n        .heldItem = ITEM_NONE,\n        .mailNum = 255,\n        .otName = _(\"REYLEY\"),\n        .otGender = MALE,\n        .sheen = 10,\n        .requestedSpecies = SPECIES_ABRA\n    }, \n    [INGAME_TRADE_JYNX] = \n    {\n        .nickname = _(\"ZYNX\"),\n        .species = SPECIES_JYNX,\n        .ivs = {18, 17, 18, 22, 25, 21},\n        .abilityNum = 0,\n        .otId = 36728,\n        .conditions = {5, 30, 5, 5, 5},\n        .personality = 0x498a2e1d,\n        .heldItem = ITEM_FAB_MAIL,\n        .mailNum = 0,\n        .otName = _(\"DONTAE\"),\n        .otGender = MALE,\n        .sheen = 10,\n        .requestedSpecies = SPECIES_POLIWHIRL\n    }, \n    [INGAME_TRADE_NIDORAN_F_FR] = \n    {\n        .nickname = _(\"MS. NIDO\"),\n        .species = SPECIES_NIDORAN_F,\n        .ivs = {22, 18, 25, 19, 15, 22},\n        .abilityNum = 0,\n        .otId = 63184,\n        .conditions = {5, 5, 5, 5, 30},\n        .personality = 0x4c970b89,\n        .heldItem = ITEM_TINY_MUSHROOM,\n        .mailNum = 255,\n        .otName = _(\"SAIGE\"),\n        .otGender = FEMALE,\n        .sheen = 10,\n        .requestedSpecies = SPECIES_NIDORAN_M\n    }, \n    [INGAME_TRADE_FARFETCHD] = \n    {\n        .nickname = _(\"CH'DING\"),\n        .species = SPECIES_FARFETCHD,\n        .ivs = {20, 25, 21, 24, 15, 20},\n        .abilityNum = 0,\n        .otId = 8810,\n        .conditions = {30, 5, 5, 5, 5},\n        .personality = 0x151943d7,\n        .heldItem = ITEM_STICK,\n        .mailNum = 255,\n        .otName = _(\"ELYSSA\"),\n        .otGender = MALE,\n        .sheen = 10,\n        .requestedSpecies = SPECIES_SPEAROW\n    }, \n    [INGAME_TRADE_NIDORINA_FR] = \n    {\n        .nickname = _(\"NINA\"),\n        .species = SPECIES_NIDORINA,\n        .ivs = {22, 25, 18, 19, 22, 15},\n        .abilityNum = 0,\n        .otId = 13637,\n        .conditions = {5, 5, 30, 5, 5},\n        .personality = 0x00eeca15,\n        .heldItem = ITEM_NONE,\n        .mailNum = 255,\n        .otName = _(\"TURNER\"),\n        .otGender = MALE,\n        .sheen = 10,\n        .requestedSpecies = SPECIES_NIDORINO\n    }, \n    [INGAME_TRADE_LICKITUNG] = \n    {\n        .nickname = _(\"MARC\"),\n        .species = SPECIES_LICKITUNG,\n        .ivs = {24, 19, 21, 15, 23, 21},\n        .abilityNum = 0,\n        .otId = 1239,\n        .conditions = {5, 5, 5, 5, 30},\n        .personality = 0x451308ab,\n        .heldItem = ITEM_NONE,\n        .mailNum = 255,\n        .otName = _(\"HADEN\"),\n        .otGender = MALE,\n        .sheen = 10,\n        .requestedSpecies = SPECIES_GOLDUCK\n    }, \n    [INGAME_TRADE_ELECTRODE] = \n    {\n        .nickname = _(\"ESPHERE\"),\n        .species = SPECIES_ELECTRODE,\n        .ivs = {19, 16, 18, 25, 25, 19},\n        .abilityNum = 1,\n        .otId = 50298,\n        .conditions = {30, 5, 5, 5, 5},\n        .personality = 0x06341016,\n        .heldItem = ITEM_NONE,\n        .mailNum = 255,\n        .otName = _(\"CLIFTON\"),\n        .otGender = MALE,\n        .sheen = 10,\n        .requestedSpecies = SPECIES_RAICHU\n    }, \n    [INGAME_TRADE_TANGELA] = \n    {\n        .nickname = _(\"TANGENY\"),\n        .species = SPECIES_TANGELA,\n        .ivs = {22, 17, 25, 16, 23, 20},\n        .abilityNum = 0,\n        .otId = 60042,\n        .conditions = {5, 5, 30, 5, 5},\n        .personality = 0x5c77ecfa,\n        .heldItem = ITEM_STARDUST,\n        .mailNum = 255,\n        .otName = _(\"NORMA\"),\n        .otGender = FEMALE,\n        .sheen = 10,\n        .requestedSpecies = SPECIES_VENONAT\n    },\n    [INGAME_TRADE_SEEL] = \n    {\n        .nickname = _(\"SEELOR\"),\n        .species = SPECIES_SEEL,\n        .ivs = {24, 15, 22, 16, 23, 22},\n        .abilityNum = 0,\n        .otId = 9853,\n        .conditions = {5, 5, 5, 5, 30},\n        .personality = 0x482cac89,\n        .heldItem = ITEM_NONE,\n        .mailNum = 255,\n        .otName = _(\"GARETT\"),\n        .otGender = MALE,\n        .sheen = 10,\n        .requestedSpecies = SPECIES_PONYTA\n    },\n    [INGAME_TRADE_NIDORAN_M_LG] = \n    {\n        .nickname = _(\"MR. NIDO\"),\n        .species = SPECIES_NIDORAN_M,\n        .ivs = {19, 25, 18, 22, 22, 15},\n        .abilityNum = 0,\n        .otId = 63184,\n        .conditions = {30, 5, 5, 5, 5},\n        .personality = 0x4c970b9e,\n        .heldItem = ITEM_TINY_MUSHROOM,\n        .mailNum = 255,\n        .otName = _(\"SAIGE\"),\n        .otGender = FEMALE,\n        .sheen = 10,\n        .requestedSpecies = SPECIES_NIDORAN_F\n    },\n    [INGAME_TRADE_NIDORINO_LG] = \n    {\n        .nickname = _(\"NINO\"),\n        .species = SPECIES_NIDORINO,\n        .ivs = {19, 18, 25, 22, 15, 22},\n        .abilityNum = 0,\n        .otId = 13637,\n        .conditions = {5, 5, 5, 5, 30},\n        .personality = 0x00eeca19,\n        .heldItem = ITEM_NONE,\n        .mailNum = 255,\n        .otName = _(\"TURNER\"),\n        .otGender = MALE,\n        .sheen = 10,\n        .requestedSpecies = SPECIES_NIDORINA\n    }\n};\n\nstatic const u16 sInGameTradeMailMessages[][10] = {\n    {\n        EC_WORD_THAT_S,\n        EC_WORD_A,\n        EC_WORD_HEALTHY,\n        EC_POKEMON(JYNX),\n        EC_WORD_EXCL,\n        EC_WORD_BE,\n        EC_WORD_KIND,\n        EC_WORD_TO,\n        EC_WORD_IT\n    }\n};\n"
  },
  {
    "path": "src/data/item_icon_table.h",
    "content": "static const u32 *const sItemIconTable[ITEMS_COUNT + 1][2] =\n{\n    [ITEM_NONE]           = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    // Pokeballs\n    [ITEM_MASTER_BALL]    = {gItemIcon_MasterBall, gItemIconPalette_MasterBall},\n    [ITEM_ULTRA_BALL]     = {gItemIcon_UltraBall, gItemIconPalette_UltraBall},\n    [ITEM_GREAT_BALL]     = {gItemIcon_GreatBall, gItemIconPalette_GreatBall},\n    [ITEM_POKE_BALL]      = {gItemIcon_PokeBall, gItemIconPalette_PokeBall},\n    [ITEM_SAFARI_BALL]    = {gItemIcon_SafariBall, gItemIconPalette_SafariBall},\n    [ITEM_NET_BALL]       = {gItemIcon_NetBall, gItemIconPalette_NetBall},\n    [ITEM_DIVE_BALL]      = {gItemIcon_DiveBall, gItemIconPalette_DiveBall},\n    [ITEM_NEST_BALL]      = {gItemIcon_NestBall, gItemIconPalette_NestBall},\n    [ITEM_REPEAT_BALL]    = {gItemIcon_RepeatBall, gItemIconPalette_RepeatBall},\n    [ITEM_TIMER_BALL]     = {gItemIcon_TimerBall, gItemIconPalette_RepeatBall},\n    [ITEM_LUXURY_BALL]    = {gItemIcon_LuxuryBall, gItemIconPalette_LuxuryBall},\n    [ITEM_PREMIER_BALL]   = {gItemIcon_PremierBall, gItemIconPalette_LuxuryBall},\n    // Medicine\n    [ITEM_POTION]         = {gItemIcon_Potion, gItemIconPalette_Potion},\n    [ITEM_ANTIDOTE]       = {gItemIcon_Antidote, gItemIconPalette_Antidote},\n    [ITEM_BURN_HEAL]      = {gItemIcon_StatusHeal, gItemIconPalette_BurnHeal},\n    [ITEM_ICE_HEAL]       = {gItemIcon_StatusHeal, gItemIconPalette_IceHeal},\n    [ITEM_AWAKENING]      = {gItemIcon_StatusHeal, gItemIconPalette_Awakening},\n    [ITEM_PARALYZE_HEAL]  = {gItemIcon_StatusHeal, gItemIconPalette_ParalyzeHeal},\n    [ITEM_FULL_RESTORE]   = {gItemIcon_LargePotion, gItemIconPalette_FullRestore},\n    [ITEM_MAX_POTION]     = {gItemIcon_LargePotion, gItemIconPalette_MaxPotion},\n    [ITEM_HYPER_POTION]   = {gItemIcon_Potion, gItemIconPalette_HyperPotion},\n    [ITEM_SUPER_POTION]   = {gItemIcon_Potion, gItemIconPalette_SuperPotion},\n    [ITEM_FULL_HEAL]      = {gItemIcon_FullHeal, gItemIconPalette_FullHeal},\n    [ITEM_REVIVE]         = {gItemIcon_Revive, gItemIconPalette_Revive},\n    [ITEM_MAX_REVIVE]     = {gItemIcon_MaxRevive, gItemIconPalette_Revive},\n    [ITEM_FRESH_WATER]    = {gItemIcon_FreshWater, gItemIconPalette_FreshWater},\n    [ITEM_SODA_POP]       = {gItemIcon_SodaPop, gItemIconPalette_SodaPop},\n    [ITEM_LEMONADE]       = {gItemIcon_Lemonade, gItemIconPalette_Lemonade},\n    [ITEM_MOOMOO_MILK]    = {gItemIcon_MoomooMilk, gItemIconPalette_MoomooMilk},\n    [ITEM_ENERGY_POWDER]  = {gItemIcon_Powder, gItemIconPalette_EnergyPowder},\n    [ITEM_ENERGY_ROOT]    = {gItemIcon_EnergyRoot, gItemIconPalette_EnergyRoot},\n    [ITEM_HEAL_POWDER]    = {gItemIcon_Powder, gItemIconPalette_HealPowder},\n    [ITEM_REVIVAL_HERB]   = {gItemIcon_RevivalHerb, gItemIconPalette_RevivalHerb},\n    [ITEM_ETHER]          = {gItemIcon_Ether, gItemIconPalette_Ether},\n    [ITEM_MAX_ETHER]      = {gItemIcon_Ether, gItemIconPalette_MaxEther},\n    [ITEM_ELIXIR]         = {gItemIcon_Ether, gItemIconPalette_Elixir},\n    [ITEM_MAX_ELIXIR]     = {gItemIcon_Ether, gItemIconPalette_MaxElixir},\n    [ITEM_LAVA_COOKIE]    = {gItemIcon_LavaCookie, gItemIconPalette_LavaCookieAndLetter},\n    [ITEM_BLUE_FLUTE]     = {gItemIcon_Flute, gItemIconPalette_BlueFlute},\n    [ITEM_YELLOW_FLUTE]   = {gItemIcon_Flute, gItemIconPalette_YellowFlute},\n    [ITEM_RED_FLUTE]      = {gItemIcon_Flute, gItemIconPalette_RedFlute},\n    [ITEM_BLACK_FLUTE]    = {gItemIcon_Flute, gItemIconPalette_BlackFlute},\n    [ITEM_WHITE_FLUTE]    = {gItemIcon_Flute, gItemIconPalette_WhiteFlute},\n    [ITEM_BERRY_JUICE]    = {gItemIcon_BerryJuice, gItemIconPalette_BerryJuice},\n    [ITEM_SACRED_ASH]     = {gItemIcon_SacredAsh, gItemIconPalette_SacredAsh},\n    // Collectibles\n    [ITEM_SHOAL_SALT]     = {gItemIcon_Powder, gItemIconPalette_ShoalSalt},\n    [ITEM_SHOAL_SHELL]    = {gItemIcon_ShoalShell, gItemIconPalette_Shell},\n    [ITEM_RED_SHARD]      = {gItemIcon_Shard, gItemIconPalette_RedShard},\n    [ITEM_BLUE_SHARD]     = {gItemIcon_Shard, gItemIconPalette_BlueShard},\n    [ITEM_YELLOW_SHARD]   = {gItemIcon_Shard, gItemIconPalette_YellowShard},\n    [ITEM_GREEN_SHARD]    = {gItemIcon_Shard, gItemIconPalette_GreenShard},\n    // ????????\n    [ITEM_034]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_035]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_036]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_037]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_038]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_039]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_03A]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_03B]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_03C]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_03D]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_03E]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    // Vitamins\n    [ITEM_HP_UP]          = {gItemIcon_HPUp, gItemIconPalette_HPUp},\n    [ITEM_PROTEIN]        = {gItemIcon_Vitamin, gItemIconPalette_Protein},\n    [ITEM_IRON]           = {gItemIcon_Vitamin, gItemIconPalette_Iron},\n    [ITEM_CARBOS]         = {gItemIcon_Vitamin, gItemIconPalette_Carbos},\n    [ITEM_CALCIUM]        = {gItemIcon_Vitamin, gItemIconPalette_Calcium},\n    [ITEM_RARE_CANDY]     = {gItemIcon_RareCandy, gItemIconPalette_RareCandy},\n    [ITEM_PP_UP]          = {gItemIcon_PPUp, gItemIconPalette_PPUp},\n    [ITEM_ZINC]           = {gItemIcon_Vitamin, gItemIconPalette_Zinc},\n    [ITEM_PP_MAX]         = {gItemIcon_PPMax, gItemIconPalette_PPMax},\n    // ????????\n    [ITEM_048]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    // Battle items\n    [ITEM_GUARD_SPEC]     = {gItemIcon_BattleStatItem, gItemIconPalette_GuardSpec},\n    [ITEM_DIRE_HIT]       = {gItemIcon_BattleStatItem, gItemIconPalette_DireHit},\n    [ITEM_X_ATTACK]       = {gItemIcon_BattleStatItem, gItemIconPalette_XAttack},\n    [ITEM_X_DEFEND]       = {gItemIcon_BattleStatItem, gItemIconPalette_XDefend},\n    [ITEM_X_SPEED]        = {gItemIcon_BattleStatItem, gItemIconPalette_XSpeed},\n    [ITEM_X_ACCURACY]     = {gItemIcon_BattleStatItem, gItemIconPalette_XAccuracy},\n    [ITEM_X_SPECIAL]      = {gItemIcon_BattleStatItem, gItemIconPalette_XSpecial},\n    [ITEM_POKE_DOLL]      = {gItemIcon_PokeDoll, gItemIconPalette_PokeDoll},\n    [ITEM_FLUFFY_TAIL]    = {gItemIcon_FluffyTail, gItemIconPalette_FluffyTail},\n    // ????????\n    [ITEM_052]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    // Field items\n    [ITEM_SUPER_REPEL]    = {gItemIcon_Repel, gItemIconPalette_SuperRepel},\n    [ITEM_MAX_REPEL]      = {gItemIcon_Repel, gItemIconPalette_MaxRepel},\n    [ITEM_ESCAPE_ROPE]    = {gItemIcon_EscapeRope, gItemIconPalette_EscapeRope},\n    [ITEM_REPEL]          = {gItemIcon_Repel, gItemIconPalette_Repel},\n    // ????????\n    [ITEM_057]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_058]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_059]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_05A]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_05B]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_05C]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    // Evolution stones\n    [ITEM_SUN_STONE]      = {gItemIcon_SunStone, gItemIconPalette_SunStone},\n    [ITEM_MOON_STONE]     = {gItemIcon_MoonStone, gItemIconPalette_MoonStone},\n    [ITEM_FIRE_STONE]     = {gItemIcon_FireStone, gItemIconPalette_FireStone},\n    [ITEM_THUNDER_STONE]  = {gItemIcon_ThunderStone, gItemIconPalette_ThunderStone},\n    [ITEM_WATER_STONE]    = {gItemIcon_WaterStone, gItemIconPalette_WaterStone},\n    [ITEM_LEAF_STONE]     = {gItemIcon_LeafStone, gItemIconPalette_LeafStone},\n    // ????????\n    [ITEM_063]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_064]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_065]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_066]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    // Valuables\n    [ITEM_TINY_MUSHROOM]  = {gItemIcon_TinyMushroom, gItemIconPalette_Mushroom},\n    [ITEM_BIG_MUSHROOM]   = {gItemIcon_BigMushroom, gItemIconPalette_Mushroom},\n    [ITEM_069]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_PEARL]          = {gItemIcon_Pearl, gItemIconPalette_Pearl},\n    [ITEM_BIG_PEARL]      = {gItemIcon_BigPearl, gItemIconPalette_Pearl},\n    [ITEM_STARDUST]       = {gItemIcon_Stardust, gItemIconPalette_Star},\n    [ITEM_STAR_PIECE]     = {gItemIcon_StarPiece, gItemIconPalette_Star},\n    [ITEM_NUGGET]         = {gItemIcon_Nugget, gItemIconPalette_Nugget},\n    [ITEM_HEART_SCALE]    = {gItemIcon_HeartScale, gItemIconPalette_HeartScale},\n    // ????????\n    [ITEM_LINK_BRACELET]  = {gItemIcon_LinkBracelet, gItemIconPalette_LinkBracelet},\n    [ITEM_071]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_072]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_073]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_074]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_075]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_076]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_077]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_078]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    // Mail\n    [ITEM_ORANGE_MAIL]    = {gItemIcon_OrangeMail, gItemIconPalette_OrangeMail},\n    [ITEM_HARBOR_MAIL]    = {gItemIcon_HarborMail, gItemIconPalette_HarborMail},\n    [ITEM_GLITTER_MAIL]   = {gItemIcon_GlitterMail, gItemIconPalette_GlitterMail},\n    [ITEM_MECH_MAIL]      = {gItemIcon_MechMail, gItemIconPalette_MechMail},\n    [ITEM_WOOD_MAIL]      = {gItemIcon_WoodMail, gItemIconPalette_WoodMail},\n    [ITEM_WAVE_MAIL]      = {gItemIcon_WaveMail, gItemIconPalette_WaveMail},\n    [ITEM_BEAD_MAIL]      = {gItemIcon_BeadMail, gItemIconPalette_BeadMail},\n    [ITEM_SHADOW_MAIL]    = {gItemIcon_ShadowMail, gItemIconPalette_ShadowMail},\n    [ITEM_TROPIC_MAIL]    = {gItemIcon_TropicMail, gItemIconPalette_TropicMail},\n    [ITEM_DREAM_MAIL]     = {gItemIcon_DreamMail, gItemIconPalette_DreamMail},\n    [ITEM_FAB_MAIL]       = {gItemIcon_FabMail, gItemIconPalette_FabMail},\n    [ITEM_RETRO_MAIL]     = {gItemIcon_RetroMail, gItemIconPalette_RetroMail},\n    // Berries\n    [ITEM_CHERI_BERRY]    = {gItemIcon_CheriBerry, gItemIconPalette_CheriBerry},\n    [ITEM_CHESTO_BERRY]   = {gItemIcon_ChestoBerry, gItemIconPalette_ChestoBerry},\n    [ITEM_PECHA_BERRY]    = {gItemIcon_PechaBerry, gItemIconPalette_PechaBerry},\n    [ITEM_RAWST_BERRY]    = {gItemIcon_RawstBerry, gItemIconPalette_RawstBerry},\n    [ITEM_ASPEAR_BERRY]   = {gItemIcon_AspearBerry, gItemIconPalette_AspearBerry},\n    [ITEM_LEPPA_BERRY]    = {gItemIcon_LeppaBerry, gItemIconPalette_LeppaBerry},\n    [ITEM_ORAN_BERRY]     = {gItemIcon_OranBerry, gItemIconPalette_OranBerry},\n    [ITEM_PERSIM_BERRY]   = {gItemIcon_PersimBerry, gItemIconPalette_PersimBerry},\n    [ITEM_LUM_BERRY]      = {gItemIcon_LumBerry, gItemIconPalette_LumBerry},\n    [ITEM_SITRUS_BERRY]   = {gItemIcon_SitrusBerry, gItemIconPalette_SitrusBerry},\n    [ITEM_FIGY_BERRY]     = {gItemIcon_FigyBerry, gItemIconPalette_FigyBerry},\n    [ITEM_WIKI_BERRY]     = {gItemIcon_WikiBerry, gItemIconPalette_WikiBerry},\n    [ITEM_MAGO_BERRY]     = {gItemIcon_MagoBerry, gItemIconPalette_MagoBerry},\n    [ITEM_AGUAV_BERRY]    = {gItemIcon_AguavBerry, gItemIconPalette_AguavBerry},\n    [ITEM_IAPAPA_BERRY]   = {gItemIcon_IapapaBerry, gItemIconPalette_IapapaBerry},\n    [ITEM_RAZZ_BERRY]     = {gItemIcon_RazzBerry, gItemIconPalette_RazzBerry},\n    [ITEM_BLUK_BERRY]     = {gItemIcon_BlukBerry, gItemIconPalette_BlukBerry},\n    [ITEM_NANAB_BERRY]    = {gItemIcon_NanabBerry, gItemIconPalette_NanabBerry},\n    [ITEM_WEPEAR_BERRY]   = {gItemIcon_WepearBerry, gItemIconPalette_WepearBerry},\n    [ITEM_PINAP_BERRY]    = {gItemIcon_PinapBerry, gItemIconPalette_PinapBerry},\n    [ITEM_POMEG_BERRY]    = {gItemIcon_PomegBerry, gItemIconPalette_PomegBerry},\n    [ITEM_KELPSY_BERRY]   = {gItemIcon_KelpsyBerry, gItemIconPalette_KelpsyBerry},\n    [ITEM_QUALOT_BERRY]   = {gItemIcon_QualotBerry, gItemIconPalette_QualotBerry},\n    [ITEM_HONDEW_BERRY]   = {gItemIcon_HondewBerry, gItemIconPalette_HondewBerry},\n    [ITEM_GREPA_BERRY]    = {gItemIcon_GrepaBerry, gItemIconPalette_GrepaBerry},\n    [ITEM_TAMATO_BERRY]   = {gItemIcon_TamatoBerry, gItemIconPalette_TamatoBerry},\n    [ITEM_CORNN_BERRY]    = {gItemIcon_CornnBerry, gItemIconPalette_CornnBerry},\n    [ITEM_MAGOST_BERRY]   = {gItemIcon_MagostBerry, gItemIconPalette_MagostBerry},\n    [ITEM_RABUTA_BERRY]   = {gItemIcon_RabutaBerry, gItemIconPalette_RabutaBerry},\n    [ITEM_NOMEL_BERRY]    = {gItemIcon_NomelBerry, gItemIconPalette_NomelBerry},\n    [ITEM_SPELON_BERRY]   = {gItemIcon_SpelonBerry, gItemIconPalette_SpelonBerry},\n    [ITEM_PAMTRE_BERRY]   = {gItemIcon_PamtreBerry, gItemIconPalette_PamtreBerry},\n    [ITEM_WATMEL_BERRY]   = {gItemIcon_WatmelBerry, gItemIconPalette_WatmelBerry},\n    [ITEM_DURIN_BERRY]    = {gItemIcon_DurinBerry, gItemIconPalette_DurinBerry},\n    [ITEM_BELUE_BERRY]    = {gItemIcon_BelueBerry, gItemIconPalette_BelueBerry},\n    [ITEM_LIECHI_BERRY]   = {gItemIcon_LiechiBerry, gItemIconPalette_LiechiBerry},\n    [ITEM_GANLON_BERRY]   = {gItemIcon_GanlonBerry, gItemIconPalette_GanlonBerry},\n    [ITEM_SALAC_BERRY]    = {gItemIcon_SalacBerry, gItemIconPalette_SalacBerry},\n    [ITEM_PETAYA_BERRY]   = {gItemIcon_PetayaBerry, gItemIconPalette_PetayaBerry},\n    [ITEM_APICOT_BERRY]   = {gItemIcon_ApicotBerry, gItemIconPalette_ApicotBerry},\n    [ITEM_LANSAT_BERRY]   = {gItemIcon_LansatBerry, gItemIconPalette_LansatBerry},\n    [ITEM_STARF_BERRY]    = {gItemIcon_StarfBerry, gItemIconPalette_StarfBerry},\n    [ITEM_ENIGMA_BERRY]   = {gItemIcon_EnigmaBerry, gItemIconPalette_EnigmaBerry},\n    [ITEM_UNUSED_BERRY_1] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_UNUSED_BERRY_2] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_UNUSED_BERRY_3] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    // Hold items\n    [ITEM_BRIGHT_POWDER]  = {gItemIcon_BrightPowder, gItemIconPalette_BrightPowder},\n    [ITEM_WHITE_HERB]     = {gItemIcon_InBattleHerb, gItemIconPalette_WhiteHerb},\n    [ITEM_MACHO_BRACE]    = {gItemIcon_MachoBrace, gItemIconPalette_MachoBrace},\n    [ITEM_EXP_SHARE]      = {gItemIcon_ExpShare, gItemIconPalette_ExpShare},\n    [ITEM_QUICK_CLAW]     = {gItemIcon_QuickClaw, gItemIconPalette_QuickClaw},\n    [ITEM_SOOTHE_BELL]    = {gItemIcon_SootheBell, gItemIconPalette_SootheBell},\n    [ITEM_MENTAL_HERB]    = {gItemIcon_InBattleHerb, gItemIconPalette_MentalHerb},\n    [ITEM_CHOICE_BAND]    = {gItemIcon_ChoiceBand, gItemIconPalette_ChoiceBand},\n    [ITEM_KINGS_ROCK]     = {gItemIcon_KingsRock, gItemIconPalette_KingsRock},\n    [ITEM_SILVER_POWDER]  = {gItemIcon_SilverPowder, gItemIconPalette_SilverPowder},\n    [ITEM_AMULET_COIN]    = {gItemIcon_AmuletCoin, gItemIconPalette_AmuletCoin},\n    [ITEM_CLEANSE_TAG]    = {gItemIcon_CleanseTag, gItemIconPalette_CleanseTag},\n    [ITEM_SOUL_DEW]       = {gItemIcon_SoulDew, gItemIconPalette_SoulDew},\n    [ITEM_DEEP_SEA_TOOTH] = {gItemIcon_DeepSeaTooth, gItemIconPalette_DeepSeaTooth},\n    [ITEM_DEEP_SEA_SCALE] = {gItemIcon_DeepSeaScale, gItemIconPalette_DeepSeaScale},\n    [ITEM_SMOKE_BALL]     = {gItemIcon_SmokeBall, gItemIconPalette_SmokeBall},\n    [ITEM_EVERSTONE]      = {gItemIcon_Everstone, gItemIconPalette_Everstone},\n    [ITEM_FOCUS_BAND]     = {gItemIcon_FocusBand, gItemIconPalette_FocusBand},\n    [ITEM_LUCKY_EGG]      = {gItemIcon_LuckyEgg, gItemIconPalette_LuckyEgg},\n    [ITEM_SCOPE_LENS]     = {gItemIcon_ScopeLens, gItemIconPalette_ScopeLens},\n    [ITEM_METAL_COAT]     = {gItemIcon_MetalCoat, gItemIconPalette_MetalCoat},\n    [ITEM_LEFTOVERS]      = {gItemIcon_Leftovers, gItemIconPalette_Leftovers},\n    [ITEM_DRAGON_SCALE]   = {gItemIcon_DragonScale, gItemIconPalette_DragonScale},\n    [ITEM_LIGHT_BALL]     = {gItemIcon_LightBall, gItemIconPalette_LightBall},\n    [ITEM_SOFT_SAND]      = {gItemIcon_SoftSand, gItemIconPalette_SoftSand},\n    [ITEM_HARD_STONE]     = {gItemIcon_HardStone, gItemIconPalette_HardStone},\n    [ITEM_MIRACLE_SEED]   = {gItemIcon_MiracleSeed, gItemIconPalette_MiracleSeed},\n    [ITEM_BLACK_GLASSES]  = {gItemIcon_BlackGlasses, gItemIconPalette_BlackTypeEnhancingItem},\n    [ITEM_BLACK_BELT]     = {gItemIcon_BlackBelt, gItemIconPalette_BlackTypeEnhancingItem},\n    [ITEM_MAGNET]         = {gItemIcon_Magnet, gItemIconPalette_Magnet},\n    [ITEM_MYSTIC_WATER]   = {gItemIcon_MysticWater, gItemIconPalette_MysticWater},\n    [ITEM_SHARP_BEAK]     = {gItemIcon_SharpBeak, gItemIconPalette_SharpBeak},\n    [ITEM_POISON_BARB]    = {gItemIcon_PoisonBarb, gItemIconPalette_PoisonBarb},\n    [ITEM_NEVER_MELT_ICE] = {gItemIcon_NeverMeltIce, gItemIconPalette_NeverMeltIce},\n    [ITEM_SPELL_TAG]      = {gItemIcon_SpellTag, gItemIconPalette_SpellTag},\n    [ITEM_TWISTED_SPOON]  = {gItemIcon_TwistedSpoon, gItemIconPalette_TwistedSpoon},\n    [ITEM_CHARCOAL]       = {gItemIcon_Charcoal, gItemIconPalette_Charcoal},\n    [ITEM_DRAGON_FANG]    = {gItemIcon_DragonFang, gItemIconPalette_DragonFang},\n    [ITEM_SILK_SCARF]     = {gItemIcon_SilkScarf, gItemIconPalette_SilkScarf},\n    [ITEM_UP_GRADE]       = {gItemIcon_UpGrade, gItemIconPalette_UpGrade},\n    [ITEM_SHELL_BELL]     = {gItemIcon_ShellBell, gItemIconPalette_Shell},\n    [ITEM_SEA_INCENSE]    = {gItemIcon_SeaIncense, gItemIconPalette_SeaIncense},\n    [ITEM_LAX_INCENSE]    = {gItemIcon_LaxIncense, gItemIconPalette_LaxIncense},\n    [ITEM_LUCKY_PUNCH]    = {gItemIcon_LuckyPunch, gItemIconPalette_LuckyPunch},\n    [ITEM_METAL_POWDER]   = {gItemIcon_MetalPowder, gItemIconPalette_MetalPowder},\n    [ITEM_THICK_CLUB]     = {gItemIcon_ThickClub, gItemIconPalette_ThickClub},\n    [ITEM_STICK]          = {gItemIcon_Stick, gItemIconPalette_Stick},\n    // ????????\n    [ITEM_0E2]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0E3]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0E4]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0E5]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0E6]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0E7]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0E8]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0E9]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0EA]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0EB]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0EC]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0ED]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0EE]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0EF]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0F0]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0F1]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0F2]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0F3]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0F4]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0F5]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0F6]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0F7]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0F8]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0F9]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0FA]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0FB]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0FC]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_0FD]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    // Contest hold items\n    [ITEM_RED_SCARF]      = {gItemIcon_Scarf, gItemIconPalette_RedScarf},\n    [ITEM_BLUE_SCARF]     = {gItemIcon_Scarf, gItemIconPalette_BlueScarf},\n    [ITEM_PINK_SCARF]     = {gItemIcon_Scarf, gItemIconPalette_PinkScarf},\n    [ITEM_GREEN_SCARF]    = {gItemIcon_Scarf, gItemIconPalette_GreenScarf},\n    [ITEM_YELLOW_SCARF]   = {gItemIcon_Scarf, gItemIconPalette_YellowScarf},\n    // Key items\n    [ITEM_MACH_BIKE]      = {gItemIcon_MachBike, gItemIconPalette_MachBike},\n    [ITEM_COIN_CASE]      = {gItemIcon_CoinCase, gItemIconPalette_CoinCase},\n    [ITEM_ITEMFINDER]     = {gItemIcon_Itemfinder, gItemIconPalette_Itemfinder},\n    [ITEM_OLD_ROD]        = {gItemIcon_OldRod, gItemIconPalette_OldRod},\n    [ITEM_GOOD_ROD]       = {gItemIcon_GoodRod, gItemIconPalette_GoodRod},\n    [ITEM_SUPER_ROD]      = {gItemIcon_SuperRod, gItemIconPalette_SuperRod},\n    [ITEM_SS_TICKET]      = {gItemIcon_SSTicket, gItemIconPalette_SSTicket},\n    [ITEM_CONTEST_PASS]   = {gItemIcon_ContestPass, gItemIconPalette_ContestPass},\n    [ITEM_10B]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_WAILMER_PAIL]   = {gItemIcon_WailmerPail, gItemIconPalette_WailmerPail},\n    [ITEM_DEVON_GOODS]    = {gItemIcon_DevonGoods, gItemIconPalette_DevonGoods},\n    [ITEM_SOOT_SACK]      = {gItemIcon_SootSack, gItemIconPalette_SootSack},\n    [ITEM_BASEMENT_KEY]   = {gItemIcon_BasementKey, gItemIconPalette_OldKey},\n    [ITEM_ACRO_BIKE]      = {gItemIcon_AcroBike, gItemIconPalette_AcroBike},\n    [ITEM_POKEBLOCK_CASE] = {gItemIcon_PokeblockCase, gItemIconPalette_PokeblockCase},\n    [ITEM_LETTER]         = {gItemIcon_Letter, gItemIconPalette_LavaCookieAndLetter},\n    [ITEM_EON_TICKET]     = {gItemIcon_EonTicket, gItemIconPalette_EonTicket},\n    [ITEM_RED_ORB]        = {gItemIcon_Orb, gItemIconPalette_RedOrb},\n    [ITEM_BLUE_ORB]       = {gItemIcon_Orb, gItemIconPalette_BlueOrb},\n    [ITEM_SCANNER]        = {gItemIcon_Scanner, gItemIconPalette_Scanner},\n    [ITEM_GO_GOGGLES]     = {gItemIcon_GoGoggles, gItemIconPalette_GoGoggles},\n    [ITEM_METEORITE]      = {gItemIcon_Meteorite, gItemIconPalette_Meteorite},\n    [ITEM_ROOM_1_KEY]     = {gItemIcon_Room1Key, gItemIconPalette_Key},\n    [ITEM_ROOM_2_KEY]     = {gItemIcon_Room2Key, gItemIconPalette_Key},\n    [ITEM_ROOM_4_KEY]     = {gItemIcon_Room4Key, gItemIconPalette_Key},\n    [ITEM_ROOM_6_KEY]     = {gItemIcon_Room6Key, gItemIconPalette_Key},\n    [ITEM_STORAGE_KEY]    = {gItemIcon_StorageKey, gItemIconPalette_OldKey},\n    [ITEM_ROOT_FOSSIL]    = {gItemIcon_RootFossil, gItemIconPalette_HoennFossil},\n    [ITEM_CLAW_FOSSIL]    = {gItemIcon_ClawFossil, gItemIconPalette_HoennFossil},\n    [ITEM_DEVON_SCOPE]    = {gItemIcon_DevonScope, gItemIconPalette_DevonScope},\n    // TMs / HMs\n    [ITEM_TM01]           = {gItemIcon_TMHM, gItemIconPalette_FightingTMHM},\n    [ITEM_TM02]           = {gItemIcon_TMHM, gItemIconPalette_DragonTMHM},\n    [ITEM_TM03]           = {gItemIcon_TMHM, gItemIconPalette_WaterTMHM},\n    [ITEM_TM04]           = {gItemIcon_TMHM, gItemIconPalette_PsychicTMHM},\n    [ITEM_TM05]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_TM06]           = {gItemIcon_TMHM, gItemIconPalette_PoisonTMHM},\n    [ITEM_TM07]           = {gItemIcon_TMHM, gItemIconPalette_IceTMHM},\n    [ITEM_TM08]           = {gItemIcon_TMHM, gItemIconPalette_FightingTMHM},\n    [ITEM_TM09]           = {gItemIcon_TMHM, gItemIconPalette_GrassTMHM},\n    [ITEM_TM10]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_TM11]           = {gItemIcon_TMHM, gItemIconPalette_FireTMHM},\n    [ITEM_TM12]           = {gItemIcon_TMHM, gItemIconPalette_DarkTMHM},\n    [ITEM_TM13]           = {gItemIcon_TMHM, gItemIconPalette_IceTMHM},\n    [ITEM_TM14]           = {gItemIcon_TMHM, gItemIconPalette_IceTMHM},\n    [ITEM_TM15]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_TM16]           = {gItemIcon_TMHM, gItemIconPalette_PsychicTMHM},\n    [ITEM_TM17]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_TM18]           = {gItemIcon_TMHM, gItemIconPalette_WaterTMHM},\n    [ITEM_TM19]           = {gItemIcon_TMHM, gItemIconPalette_GrassTMHM},\n    [ITEM_TM20]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_TM21]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_TM22]           = {gItemIcon_TMHM, gItemIconPalette_GrassTMHM},\n    [ITEM_TM23]           = {gItemIcon_TMHM, gItemIconPalette_SteelTMHM},\n    [ITEM_TM24]           = {gItemIcon_TMHM, gItemIconPalette_ElectricTMHM},\n    [ITEM_TM25]           = {gItemIcon_TMHM, gItemIconPalette_ElectricTMHM},\n    [ITEM_TM26]           = {gItemIcon_TMHM, gItemIconPalette_GroundTMHM},\n    [ITEM_TM27]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_TM28]           = {gItemIcon_TMHM, gItemIconPalette_GroundTMHM},\n    [ITEM_TM29]           = {gItemIcon_TMHM, gItemIconPalette_PsychicTMHM},\n    [ITEM_TM30]           = {gItemIcon_TMHM, gItemIconPalette_GhostTMHM},\n    [ITEM_TM31]           = {gItemIcon_TMHM, gItemIconPalette_FightingTMHM},\n    [ITEM_TM32]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_TM33]           = {gItemIcon_TMHM, gItemIconPalette_PsychicTMHM},\n    [ITEM_TM34]           = {gItemIcon_TMHM, gItemIconPalette_ElectricTMHM},\n    [ITEM_TM35]           = {gItemIcon_TMHM, gItemIconPalette_FireTMHM},\n    [ITEM_TM36]           = {gItemIcon_TMHM, gItemIconPalette_PoisonTMHM},\n    [ITEM_TM37]           = {gItemIcon_TMHM, gItemIconPalette_RockTMHM},\n    [ITEM_TM38]           = {gItemIcon_TMHM, gItemIconPalette_FireTMHM},\n    [ITEM_TM39]           = {gItemIcon_TMHM, gItemIconPalette_RockTMHM},\n    [ITEM_TM40]           = {gItemIcon_TMHM, gItemIconPalette_FlyingTMHM},\n    [ITEM_TM41]           = {gItemIcon_TMHM, gItemIconPalette_DarkTMHM},\n    [ITEM_TM42]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_TM43]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_TM44]           = {gItemIcon_TMHM, gItemIconPalette_PsychicTMHM},\n    [ITEM_TM45]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_TM46]           = {gItemIcon_TMHM, gItemIconPalette_DarkTMHM},\n    [ITEM_TM47]           = {gItemIcon_TMHM, gItemIconPalette_SteelTMHM},\n    [ITEM_TM48]           = {gItemIcon_TMHM, gItemIconPalette_PsychicTMHM},\n    [ITEM_TM49]           = {gItemIcon_TMHM, gItemIconPalette_DarkTMHM},\n    [ITEM_TM50]           = {gItemIcon_TMHM, gItemIconPalette_FireTMHM},\n    [ITEM_HM01]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_HM02]           = {gItemIcon_TMHM, gItemIconPalette_FlyingTMHM},\n    [ITEM_HM03]           = {gItemIcon_TMHM, gItemIconPalette_WaterTMHM},\n    [ITEM_HM04]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_HM05]           = {gItemIcon_TMHM, gItemIconPalette_NormalTMHM},\n    [ITEM_HM06]           = {gItemIcon_TMHM, gItemIconPalette_FightingTMHM},\n    [ITEM_HM07]           = {gItemIcon_TMHM, gItemIconPalette_WaterTMHM},\n    [ITEM_HM08]           = {gItemIcon_TMHM, gItemIconPalette_WaterTMHM},\n    // ????????\n    [ITEM_15B]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    [ITEM_15C]            = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},\n    // FireRed/LeafGreen key items\n    [ITEM_OAKS_PARCEL]    = {gItemIcon_OaksParcel, gItemIconPalette_OaksParcel},\n    [ITEM_POKE_FLUTE]     = {gItemIcon_PokeFlute, gItemIconPalette_PokeFlute},\n    [ITEM_SECRET_KEY]     = {gItemIcon_SecretKey, gItemIconPalette_SecretKey},\n    [ITEM_BIKE_VOUCHER]   = {gItemIcon_BikeVoucher, gItemIconPalette_BikeVoucher},\n    [ITEM_GOLD_TEETH]     = {gItemIcon_GoldTeeth, gItemIconPalette_GoldTeeth},\n    [ITEM_OLD_AMBER]      = {gItemIcon_OldAmber, gItemIconPalette_OldAmber},\n    [ITEM_CARD_KEY]       = {gItemIcon_CardKey, gItemIconPalette_CardKey},\n    [ITEM_LIFT_KEY]       = {gItemIcon_LiftKey, gItemIconPalette_Key},\n    [ITEM_HELIX_FOSSIL]   = {gItemIcon_HelixFossil, gItemIconPalette_KantoFossil},\n    [ITEM_DOME_FOSSIL]    = {gItemIcon_DomeFossil, gItemIconPalette_KantoFossil},\n    [ITEM_SILPH_SCOPE]    = {gItemIcon_SilphScope, gItemIconPalette_SilphScope},\n    [ITEM_BICYCLE]        = {gItemIcon_Bicycle, gItemIconPalette_Bicycle},\n    [ITEM_TOWN_MAP]       = {gItemIcon_TownMap, gItemIconPalette_TownMap},\n    [ITEM_VS_SEEKER]      = {gItemIcon_VSSeeker, gItemIconPalette_VSSeeker},\n    [ITEM_FAME_CHECKER]   = {gItemIcon_FameChecker, gItemIconPalette_FameChecker},\n    [ITEM_TM_CASE]        = {gItemIcon_TMCase, gItemIconPalette_TMCase},\n    [ITEM_BERRY_POUCH]    = {gItemIcon_BerryPouch, gItemIconPalette_BerryPouch},\n    [ITEM_TEACHY_TV]      = {gItemIcon_TeachyTV, gItemIconPalette_TeachyTV},\n    [ITEM_TRI_PASS]       = {gItemIcon_TriPass, gItemIconPalette_TriPass},\n    [ITEM_RAINBOW_PASS]   = {gItemIcon_RainbowPass, gItemIconPalette_RainbowPass},\n    [ITEM_TEA]            = {gItemIcon_Tea, gItemIconPalette_Tea},\n    [ITEM_MYSTIC_TICKET]  = {gItemIcon_MysticTicket, gItemIconPalette_MysticTicket},\n    [ITEM_AURORA_TICKET]  = {gItemIcon_AuroraTicket, gItemIconPalette_AuroraTicket},\n    [ITEM_POWDER_JAR]     = {gItemIcon_PowderJar, gItemIconPalette_PowderJar},\n    [ITEM_RUBY]           = {gItemIcon_Gem, gItemIconPalette_Ruby},\n    [ITEM_SAPPHIRE]       = {gItemIcon_Gem, gItemIconPalette_Sapphire},\n    [ITEM_MAGMA_EMBLEM]   = {gItemIcon_MagmaEmblem, gItemIconPalette_MagmaEmblem},\n    [ITEM_OLD_SEA_MAP]    = {gItemIcon_OldSeaMap, gItemIconPalette_OldSeaMap},\n    // Return to field arrow\n    [ITEMS_COUNT]         = {gItemIcon_ReturnToFieldArrow, gItemIconPalette_ReturnToFieldArrow},\n};\n"
  },
  {
    "path": "src/data/items.json",
    "content": "{\n  \"items\": [\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MASTER BALL\",\n      \"itemId\": \"ITEM_MASTER_BALL\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The best BALL with the ultimate\\\\nperformance. It will catch any wild\\\\nPOKéMON without fail.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_POKE_BALLS\",\n      \"type\": 0,\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeBallEtc\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ULTRA BALL\",\n      \"itemId\": \"ITEM_ULTRA_BALL\",\n      \"price\": 1200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A very high-grade BALL that offers\\\\na higher POKéMON catch rate than\\\\na GREAT BALL.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_POKE_BALLS\",\n      \"type\": 1,\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeBallEtc\",\n      \"secondaryId\": 1\n    },\n    {\n      \"english\": \"GREAT BALL\",\n      \"itemId\": \"ITEM_GREAT_BALL\",\n      \"price\": 600,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A good, quality BALL that offers\\\\na higher POKéMON catch rate than\\\\na standard POKé BALL.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_POKE_BALLS\",\n      \"type\": 2,\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeBallEtc\",\n      \"secondaryId\": 2\n    },\n    {\n      \"english\": \"POK\\u00e9 BALL\",\n      \"itemId\": \"ITEM_POKE_BALL\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A BALL thrown to catch a wild\\\\nPOKéMON. It is designed in a\\\\ncapsule style.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_POKE_BALLS\",\n      \"type\": 3,\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeBallEtc\",\n      \"secondaryId\": 3\n    },\n    {\n      \"english\": \"SAFARI BALL\",\n      \"itemId\": \"ITEM_SAFARI_BALL\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A special BALL that is used only in\\\\nthe SAFARI ZONE. It is finished in\\\\na camouflage pattern.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_POKE_BALLS\",\n      \"type\": 4,\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeBallEtc\",\n      \"secondaryId\": 4\n    },\n    {\n      \"english\": \"NET BALL\",\n      \"itemId\": \"ITEM_NET_BALL\",\n      \"price\": 1000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A somewhat different BALL that\\\\nworks especially well on WATER- and\\\\nBUG-type POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_POKE_BALLS\",\n      \"type\": 5,\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeBallEtc\",\n      \"secondaryId\": 5\n    },\n    {\n      \"english\": \"DIVE BALL\",\n      \"itemId\": \"ITEM_DIVE_BALL\",\n      \"price\": 1000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A somewhat different BALL that\\\\nworks especially well on POKéMON\\\\ndeep in the sea.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_POKE_BALLS\",\n      \"type\": 6,\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeBallEtc\",\n      \"secondaryId\": 6\n    },\n    {\n      \"english\": \"NEST BALL\",\n      \"itemId\": \"ITEM_NEST_BALL\",\n      \"price\": 1000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A somewhat different BALL that\\\\nworks especially well on weaker\\\\nPOKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_POKE_BALLS\",\n      \"type\": 7,\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeBallEtc\",\n      \"secondaryId\": 7\n    },\n    {\n      \"english\": \"REPEAT BALL\",\n      \"itemId\": \"ITEM_REPEAT_BALL\",\n      \"price\": 1000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A somewhat different BALL that\\\\nworks especially well on POKéMON\\\\ncaught before.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_POKE_BALLS\",\n      \"type\": 8,\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeBallEtc\",\n      \"secondaryId\": 8\n    },\n    {\n      \"english\": \"TIMER BALL\",\n      \"itemId\": \"ITEM_TIMER_BALL\",\n      \"price\": 1000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A somewhat different BALL that\\\\nbecomes progressively better the\\\\nmore turns there are in a battle.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_POKE_BALLS\",\n      \"type\": 9,\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeBallEtc\",\n      \"secondaryId\": 9\n    },\n    {\n      \"english\": \"LUXURY BALL\",\n      \"itemId\": \"ITEM_LUXURY_BALL\",\n      \"price\": 1000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A comfortable BALL that makes a\\\\ncaptured wild POKéMON quickly grow\\\\nfriendly.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_POKE_BALLS\",\n      \"type\": 10,\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeBallEtc\",\n      \"secondaryId\": 10\n    },\n    {\n      \"english\": \"PREMIER BALL\",\n      \"itemId\": \"ITEM_PREMIER_BALL\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A rare BALL that has been\\\\nspecially made to commemorate an\\\\nevent of some sort.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_POKE_BALLS\",\n      \"type\": 11,\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeBallEtc\",\n      \"secondaryId\": 11\n    },\n    {\n      \"english\": \"POTION\",\n      \"itemId\": \"ITEM_POTION\",\n      \"price\": 300,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 20,\n      \"description_english\": \"A spray-type wound medicine.\\\\nIt restores the HP of one POKéMON\\\\nby 20 points.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ANTIDOTE\",\n      \"itemId\": \"ITEM_ANTIDOTE\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A spray-type medicine.\\\\nIt heals one POKéMON from a\\\\npoisoning.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BURN HEAL\",\n      \"itemId\": \"ITEM_BURN_HEAL\",\n      \"price\": 250,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A spray-type medicine.\\\\nIt heals one POKéMON of a burn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ICE HEAL\",\n      \"itemId\": \"ITEM_ICE_HEAL\",\n      \"price\": 250,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A spray-type medicine.\\\\nIt defrosts a frozen POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"AWAKENING\",\n      \"itemId\": \"ITEM_AWAKENING\",\n      \"price\": 250,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A spray-type medicine.\\\\nIt awakens a sleeping POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"PARLYZ HEAL\",\n      \"itemId\": \"ITEM_PARALYZE_HEAL\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A spray-type medicine.\\\\nIt heals one POKéMON from\\\\nparalysis.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"FULL RESTORE\",\n      \"itemId\": \"ITEM_FULL_RESTORE\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 255,\n      \"description_english\": \"A medicine that fully restores the\\\\nHP and heals any status problems\\\\nof one POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MAX POTION\",\n      \"itemId\": \"ITEM_MAX_POTION\",\n      \"price\": 2500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 255,\n      \"description_english\": \"A spray-type wound medicine.\\\\nIt fully restores the HP of one\\\\nPOKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"HYPER POTION\",\n      \"itemId\": \"ITEM_HYPER_POTION\",\n      \"price\": 1200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 200,\n      \"description_english\": \"A spray-type wound medicine.\\\\nIt restores the HP of one POKéMON\\\\nby 200 points.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SUPER POTION\",\n      \"itemId\": \"ITEM_SUPER_POTION\",\n      \"price\": 700,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 50,\n      \"description_english\": \"A spray-type wound medicine.\\\\nIt restores the HP of one POKéMON\\\\nby 50 points.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"FULL HEAL\",\n      \"itemId\": \"ITEM_FULL_HEAL\",\n      \"price\": 600,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A spray-type medicine.\\\\nIt heals all the status problems of\\\\none POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"REVIVE\",\n      \"itemId\": \"ITEM_REVIVE\",\n      \"price\": 1500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A medicine that revives a fainted\\\\nPOKéMON, restoring HP by half the\\\\nmaximum amount.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MAX REVIVE\",\n      \"itemId\": \"ITEM_MAX_REVIVE\",\n      \"price\": 4000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A medicine that revives a fainted\\\\nPOKéMON, restoring HP fully.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"FRESH WATER\",\n      \"itemId\": \"ITEM_FRESH_WATER\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 50,\n      \"description_english\": \"Water with a high mineral content.\\\\nIt restores the HP of one POKéMON\\\\nby 50 points.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SODA POP\",\n      \"itemId\": \"ITEM_SODA_POP\",\n      \"price\": 300,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 60,\n      \"description_english\": \"A fizzy soda drink.\\\\nIt restores the HP of one POKéMON\\\\nby 60 points.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LEMONADE\",\n      \"itemId\": \"ITEM_LEMONADE\",\n      \"price\": 350,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 80,\n      \"description_english\": \"A very sweet drink.\\\\nIt restores the HP of one POKéMON\\\\nby 80 points.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MOOMOO MILK\",\n      \"itemId\": \"ITEM_MOOMOO_MILK\",\n      \"price\": 500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 100,\n      \"description_english\": \"Highly nutritious milk.\\\\nIt restores the HP of one POKéMON\\\\nby 100 points.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ENERGYPOWDER\",\n      \"itemId\": \"ITEM_ENERGY_POWDER\",\n      \"price\": 500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A very bitter medicine powder.\\\\nIt restores the HP of one POKéMON\\\\nby 50 points.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ENERGY ROOT\",\n      \"itemId\": \"ITEM_ENERGY_ROOT\",\n      \"price\": 800,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A very bitter root.\\\\nIt restores the HP of one POKéMON\\\\nby 200 points.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"HEAL POWDER\",\n      \"itemId\": \"ITEM_HEAL_POWDER\",\n      \"price\": 450,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A very bitter medicine powder.\\\\nIt heals all the status problems of\\\\none POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"REVIVAL HERB\",\n      \"itemId\": \"ITEM_REVIVAL_HERB\",\n      \"price\": 2800,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A very bitter medicinal herb.\\\\nIt revives a fainted POKéMON,\\\\nrestoring HP fully.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ETHER\",\n      \"itemId\": \"ITEM_ETHER\",\n      \"price\": 1200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"Restores a selected move's PP by\\\\n10 points for one POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Ether\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Ether\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MAX ETHER\",\n      \"itemId\": \"ITEM_MAX_ETHER\",\n      \"price\": 2000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 255,\n      \"description_english\": \"Fully restores a selected move's PP\\\\nfor one POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Ether\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Ether\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ELIXIR\",\n      \"itemId\": \"ITEM_ELIXIR\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"Restores the PP of all moves for\\\\none POKéMON by 10 points each.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Ether\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Ether\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MAX ELIXIR\",\n      \"itemId\": \"ITEM_MAX_ELIXIR\",\n      \"price\": 4500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 255,\n      \"description_english\": \"Fully restores the PP of all moves\\\\nfor one POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Ether\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Ether\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LAVA COOKIE\",\n      \"itemId\": \"ITEM_LAVA_COOKIE\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"LAVARIDGE TOWN's local specialty.\\\\nIt heals all the status problems of\\\\none POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BLUE FLUTE\",\n      \"itemId\": \"ITEM_BLUE_FLUTE\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A blue glass flute that awakens\\\\na sleeping POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"YELLOW FLUTE\",\n      \"itemId\": \"ITEM_YELLOW_FLUTE\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A yellow glass flute that snaps one\\\\nPOKéMON out of confusion.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RED FLUTE\",\n      \"itemId\": \"ITEM_RED_FLUTE\",\n      \"price\": 300,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A red glass flute that snaps one\\\\nPOKéMON out of infatuation.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BLACK FLUTE\",\n      \"itemId\": \"ITEM_BLACK_FLUTE\",\n      \"price\": 400,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 50,\n      \"description_english\": \"A black glass flute.\\\\nWhen blown, it makes wild POKéMON\\\\nless likely to appear.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_BlackWhiteFlute\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"WHITE FLUTE\",\n      \"itemId\": \"ITEM_WHITE_FLUTE\",\n      \"price\": 500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 150,\n      \"description_english\": \"A white glass flute.\\\\nWhen blown, it makes wild POKéMON\\\\nmore likely to appear.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_BlackWhiteFlute\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BERRY JUICE\",\n      \"itemId\": \"ITEM_BERRY_JUICE\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_RESTORE_HP\",\n      \"holdEffectParam\": 20,\n      \"description_english\": \"A 100% pure juice.\\\\nIt restores the HP of one POKéMON\\\\nby 20 points.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SACRED ASH\",\n      \"itemId\": \"ITEM_SACRED_ASH\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Revives all fainted POKéMON,\\\\nrestoring HP fully.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_SacredAsh\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SHOAL SALT\",\n      \"itemId\": \"ITEM_SHOAL_SALT\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Pure salt obtained from deep inside\\\\nthe SHOAL CAVE. It is extremely\\\\nsalty.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SHOAL SHELL\",\n      \"itemId\": \"ITEM_SHOAL_SHELL\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A pretty seashell found deep inside\\\\nthe SHOAL CAVE. It is striped in\\\\nblue and white.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RED SHARD\",\n      \"itemId\": \"ITEM_RED_SHARD\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A small red shard.\\\\nIt appears to be from some sort of\\\\na tool made long ago.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BLUE SHARD\",\n      \"itemId\": \"ITEM_BLUE_SHARD\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A small blue shard.\\\\nIt appears to be from some sort of\\\\na tool made long ago.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"YELLOW SHARD\",\n      \"itemId\": \"ITEM_YELLOW_SHARD\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A small yellow shard.\\\\nIt appears to be from some sort of\\\\na tool made long ago.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"GREEN SHARD\",\n      \"itemId\": \"ITEM_GREEN_SHARD\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A small green shard.\\\\nIt appears to be from some sort of\\\\na tool made long ago.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"HP UP\",\n      \"itemId\": \"ITEM_HP_UP\",\n      \"price\": 9800,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A nutritious drink for POKéMON.\\\\nIt raises the base HP of one\\\\nPOKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"PROTEIN\",\n      \"itemId\": \"ITEM_PROTEIN\",\n      \"price\": 9800,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A nutritious drink for POKéMON.\\\\nIt raises the base ATTACK stat of\\\\none POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"IRON\",\n      \"itemId\": \"ITEM_IRON\",\n      \"price\": 9800,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A nutritious drink for POKéMON.\\\\nIt raises the base DEFENSE stat of\\\\none POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"CARBOS\",\n      \"itemId\": \"ITEM_CARBOS\",\n      \"price\": 9800,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A nutritious drink for POKéMON.\\\\nIt raises the base SPEED stat of\\\\none POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"CALCIUM\",\n      \"itemId\": \"ITEM_CALCIUM\",\n      \"price\": 9800,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A nutritious drink for POKéMON.\\\\nIt raises the base SP. ATK stat\\\\nof one POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RARE CANDY\",\n      \"itemId\": \"ITEM_RARE_CANDY\",\n      \"price\": 4800,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A candy that is packed with energy.\\\\nIt raises the level of a POKéMON\\\\nby one.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_RareCandy\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"PP UP\",\n      \"itemId\": \"ITEM_PP_UP\",\n      \"price\": 9800,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Slightly raises the maximum PP of\\\\na selected move for one POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_PpUp\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ZINC\",\n      \"itemId\": \"ITEM_ZINC\",\n      \"price\": 9800,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A nutritious drink for POKéMON.\\\\nIt raises the base SP. DEF stat\\\\nof one POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"PP MAX\",\n      \"itemId\": \"ITEM_PP_MAX\",\n      \"price\": 9800,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Raises the PP of a selected move\\\\nto its maximum level for one\\\\nPOKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_MEDICINE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_PpUp\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"GUARD SPEC.\",\n      \"itemId\": \"ITEM_GUARD_SPEC\",\n      \"price\": 700,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item that prevents stat reduction\\\\namong party POKéMON for five turns\\\\nafter use.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_StatBooster\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"DIRE HIT\",\n      \"itemId\": \"ITEM_DIRE_HIT\",\n      \"price\": 650,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Raises the critical-hit ratio of\\\\nPOKéMON in battle. Wears off if the\\\\nPOKéMON is withdrawn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_StatBooster\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"X ATTACK\",\n      \"itemId\": \"ITEM_X_ATTACK\",\n      \"price\": 500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Raises the ATTACK stat of POKéMON\\\\nin battle. Wears off if the POKéMON\\\\nis withdrawn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_StatBooster\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"X DEFEND\",\n      \"itemId\": \"ITEM_X_DEFEND\",\n      \"price\": 550,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Raises the DEFENSE stat of POKéMON\\\\nin battle. Wears off if the POKéMON\\\\nis withdrawn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_StatBooster\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"X SPEED\",\n      \"itemId\": \"ITEM_X_SPEED\",\n      \"price\": 350,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Raises the SPEED stat of POKéMON\\\\nin battle. Wears off if the POKéMON\\\\nis withdrawn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_StatBooster\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"X ACCURACY\",\n      \"itemId\": \"ITEM_X_ACCURACY\",\n      \"price\": 950,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Raises the accuracy stat of\\\\nPOKéMON in battle. Wears off if the\\\\nPOKéMON is withdrawn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_StatBooster\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"X SPECIAL\",\n      \"itemId\": \"ITEM_X_SPECIAL\",\n      \"price\": 350,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Raises the SP. ATK stat of\\\\nPOKéMON in battle. Wears off if the\\\\nPOKéMON is withdrawn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_StatBooster\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"POK\\u00e9 DOLL\",\n      \"itemId\": \"ITEM_POKE_DOLL\",\n      \"price\": 1000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An attractive doll.\\\\nUse it to flee from any battle with\\\\na wild POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeDoll\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"FLUFFY TAIL\",\n      \"itemId\": \"ITEM_FLUFFY_TAIL\",\n      \"price\": 1000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An attractive item.\\\\nUse it to flee from any battle with\\\\na wild POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeDoll\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SUPER REPEL\",\n      \"itemId\": \"ITEM_SUPER_REPEL\",\n      \"price\": 500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 200,\n      \"description_english\": \"Prevents weak wild POKéMON from\\\\nappearing for 200 steps.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Repel\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MAX REPEL\",\n      \"itemId\": \"ITEM_MAX_REPEL\",\n      \"price\": 700,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 250,\n      \"description_english\": \"Prevents weak wild POKéMON from\\\\nappearing for 250 steps.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Repel\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ESCAPE ROPE\",\n      \"itemId\": \"ITEM_ESCAPE_ROPE\",\n      \"price\": 550,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A long, durable rope.\\\\nUse it to escape instantly from a\\\\ncave or a dungeon.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_FIELD\",\n      \"fieldUseFunc\": \"ItemUseOutOfBattle_EscapeRope\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"REPEL\",\n      \"itemId\": \"ITEM_REPEL\",\n      \"price\": 350,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 100,\n      \"description_english\": \"Prevents weak wild POKéMON from\\\\nappearing for 100 steps.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Repel\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SUN STONE\",\n      \"itemId\": \"ITEM_SUN_STONE\",\n      \"price\": 2100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A peculiar stone that makes certain\\\\nspecies of POKéMON evolve.\\\\nIt is as red as the sun.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_EvoItem\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MOON STONE\",\n      \"itemId\": \"ITEM_MOON_STONE\",\n      \"price\": 2100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A peculiar stone that makes certain\\\\nspecies of POKéMON evolve.\\\\nIt is as black as the night sky.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_EvoItem\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"FIRE STONE\",\n      \"itemId\": \"ITEM_FIRE_STONE\",\n      \"price\": 2100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A peculiar stone that makes certain\\\\nspecies of POKéMON evolve.\\\\nIt is colored orange.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_EvoItem\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"THUNDERSTONE\",\n      \"itemId\": \"ITEM_THUNDER_STONE\",\n      \"price\": 2100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A peculiar stone that makes certain\\\\nspecies of POKéMON evolve.\\\\nIt has a thunderbolt pattern.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_EvoItem\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"WATER STONE\",\n      \"itemId\": \"ITEM_WATER_STONE\",\n      \"price\": 2100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A peculiar stone that makes certain\\\\nspecies of POKéMON evolve.\\\\nIt is a clear light blue.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_EvoItem\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LEAF STONE\",\n      \"itemId\": \"ITEM_LEAF_STONE\",\n      \"price\": 2100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A peculiar stone that makes certain\\\\nspecies of POKéMON evolve.\\\\nIt has a leaf pattern.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_EvoItem\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"TINYMUSHROOM\",\n      \"itemId\": \"ITEM_TINY_MUSHROOM\",\n      \"price\": 500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A small and rare mushroom.\\\\nIt is quite popular among certain\\\\npeople.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BIG MUSHROOM\",\n      \"itemId\": \"ITEM_BIG_MUSHROOM\",\n      \"price\": 5000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A large and rare mushroom.\\\\nIt is very popular among certain\\\\npeople.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"PEARL\",\n      \"itemId\": \"ITEM_PEARL\",\n      \"price\": 1400,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A relatively small pearl that\\\\nsparkles in a pretty silver color.\\\\nIt can be sold cheaply.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BIG PEARL\",\n      \"itemId\": \"ITEM_BIG_PEARL\",\n      \"price\": 7500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A quite-large pearl that sparkles\\\\nin a pretty silver color.\\\\nIt can be sold at a high price.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"STARDUST\",\n      \"itemId\": \"ITEM_STARDUST\",\n      \"price\": 2000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A pretty red sand with a loose,\\\\nsilky feel.\\\\nIt can be sold at a high price.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"STAR PIECE\",\n      \"itemId\": \"ITEM_STAR_PIECE\",\n      \"price\": 9800,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A shard of a pretty gem that\\\\nsparkles in a red color.\\\\nIt can be sold at a high price.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"NUGGET\",\n      \"itemId\": \"ITEM_NUGGET\",\n      \"price\": 10000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A nugget of pure gold that gives\\\\noff a lustrous gleam.\\\\nIt can be sold at a high price.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"HEART SCALE\",\n      \"itemId\": \"ITEM_HEART_SCALE\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A pretty, heart-shaped scale that\\\\nis extremely rare. It glows faintly\\\\nin the colors of a rainbow.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LINKBRACELET\",\n      \"itemId\": \"ITEM_LINK_BRACELET\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A bracelet signifying your link with\\\\n{RIVAL}. Wearing it makes certain\\\\nspecies of POKéMON evolve.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_EvoItem\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ORANGE MAIL\",\n      \"itemId\": \"ITEM_ORANGE_MAIL\",\n      \"price\": 50,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of MAIL featuring a cute\\\\nZIGZAGOON print.\\\\nIt is to be held by a POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_MAIL\",\n      \"fieldUseFunc\": \"FieldUseFunc_Mail\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"HARBOR MAIL\",\n      \"itemId\": \"ITEM_HARBOR_MAIL\",\n      \"price\": 50,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of MAIL featuring a cute\\\\nWINGULL print.\\\\nIt is to be held by a POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_MAIL\",\n      \"fieldUseFunc\": \"FieldUseFunc_Mail\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 1\n    },\n    {\n      \"english\": \"GLITTER MAIL\",\n      \"itemId\": \"ITEM_GLITTER_MAIL\",\n      \"price\": 50,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of MAIL featuring a cute\\\\nPIKACHU print.\\\\nIt is to be held by a POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_MAIL\",\n      \"fieldUseFunc\": \"FieldUseFunc_Mail\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 2\n    },\n    {\n      \"english\": \"MECH MAIL\",\n      \"itemId\": \"ITEM_MECH_MAIL\",\n      \"price\": 50,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of MAIL featuring a cute\\\\nMAGNEMITE print.\\\\nIt is to be held by a POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_MAIL\",\n      \"fieldUseFunc\": \"FieldUseFunc_Mail\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 3\n    },\n    {\n      \"english\": \"WOOD MAIL\",\n      \"itemId\": \"ITEM_WOOD_MAIL\",\n      \"price\": 50,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of MAIL featuring a cute\\\\nSLAKOTH print.\\\\nIt is to be held by a POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_MAIL\",\n      \"fieldUseFunc\": \"FieldUseFunc_Mail\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 4\n    },\n    {\n      \"english\": \"WAVE MAIL\",\n      \"itemId\": \"ITEM_WAVE_MAIL\",\n      \"price\": 50,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of MAIL featuring a cute\\\\nWAILMER print.\\\\nIt is to be held by a POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_MAIL\",\n      \"fieldUseFunc\": \"FieldUseFunc_Mail\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 5\n    },\n    {\n      \"english\": \"BEAD MAIL\",\n      \"itemId\": \"ITEM_BEAD_MAIL\",\n      \"price\": 50,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of MAIL to be held by a\\\\nPOKéMON. It will bear the print of\\\\nthe POKéMON holding it.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_MAIL\",\n      \"fieldUseFunc\": \"FieldUseFunc_Mail\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 6\n    },\n    {\n      \"english\": \"SHADOW MAIL\",\n      \"itemId\": \"ITEM_SHADOW_MAIL\",\n      \"price\": 50,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of MAIL featuring a cute\\\\nDUSKULL print.\\\\nIt is to be held by a POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_MAIL\",\n      \"fieldUseFunc\": \"FieldUseFunc_Mail\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 7\n    },\n    {\n      \"english\": \"TROPIC MAIL\",\n      \"itemId\": \"ITEM_TROPIC_MAIL\",\n      \"price\": 50,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of MAIL featuring a cute\\\\nBELLOSSOM print.\\\\nIt is to be held by a POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_MAIL\",\n      \"fieldUseFunc\": \"FieldUseFunc_Mail\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 8\n    },\n    {\n      \"english\": \"DREAM MAIL\",\n      \"itemId\": \"ITEM_DREAM_MAIL\",\n      \"price\": 50,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of MAIL to be held by a\\\\nPOKéMON. It will bear the print of\\\\nthe POKéMON holding it.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_MAIL\",\n      \"fieldUseFunc\": \"FieldUseFunc_Mail\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 9\n    },\n    {\n      \"english\": \"FAB MAIL\",\n      \"itemId\": \"ITEM_FAB_MAIL\",\n      \"price\": 50,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of MAIL featuring a\\\\ngorgeous, extravagant print.\\\\nIt is to be held by a POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_MAIL\",\n      \"fieldUseFunc\": \"FieldUseFunc_Mail\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 10\n    },\n    {\n      \"english\": \"RETRO MAIL\",\n      \"itemId\": \"ITEM_RETRO_MAIL\",\n      \"price\": 50,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of MAIL featuring a print\\\\nof three cute POKéMON.\\\\nIt is to be held by a POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_MAIL\",\n      \"fieldUseFunc\": \"FieldUseFunc_Mail\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 11\n    },\n    {\n      \"english\": \"CHERI BERRY\",\n      \"itemId\": \"ITEM_CHERI_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CURE_PAR\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"When held by a POKéMON, it will be\\\\nused in battle to heal paralysis.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"CHESTO BERRY\",\n      \"itemId\": \"ITEM_CHESTO_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CURE_SLP\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"When held by a POKéMON, it will be\\\\nused in battle to wake up.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"PECHA BERRY\",\n      \"itemId\": \"ITEM_PECHA_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CURE_PSN\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"When held by a POKéMON, it will be\\\\nused in battle to cure poison.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RAWST BERRY\",\n      \"itemId\": \"ITEM_RAWST_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CURE_BRN\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"When held by a POKéMON, it will be\\\\nused in battle to heal a burn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ASPEAR BERRY\",\n      \"itemId\": \"ITEM_ASPEAR_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CURE_FRZ\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"When held by a POKéMON, it will be\\\\nused in battle for defrosting.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LEPPA BERRY\",\n      \"itemId\": \"ITEM_LEPPA_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_RESTORE_PP\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"When held by a POKéMON, it will be\\\\nused in battle to restore 10 PP.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Ether\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Ether\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ORAN BERRY\",\n      \"itemId\": \"ITEM_ORAN_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_RESTORE_HP\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"When held by a POKéMON, it will be\\\\nused in battle to restore 10 HP.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"PERSIM BERRY\",\n      \"itemId\": \"ITEM_PERSIM_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CURE_CONFUSION\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"When held by a POKéMON, it will be\\\\nused in battle to lift confusion.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LUM BERRY\",\n      \"itemId\": \"ITEM_LUM_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CURE_STATUS\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"When held by a POKéMON, it will be\\\\nused in battle to heal any problem.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SITRUS BERRY\",\n      \"itemId\": \"ITEM_SITRUS_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_RESTORE_HP\",\n      \"holdEffectParam\": 30,\n      \"description_english\": \"When held by a POKéMON, it will be\\\\nused in battle to restore 30 HP.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_Medicine\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"BattleUseFunc_Medicine\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"FIGY BERRY\",\n      \"itemId\": \"ITEM_FIGY_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CONFUSE_SPICY\",\n      \"holdEffectParam\": 8,\n      \"description_english\": \"A hold item that restores HP but\\\\nmay cause confusion when used.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"WIKI BERRY\",\n      \"itemId\": \"ITEM_WIKI_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CONFUSE_DRY\",\n      \"holdEffectParam\": 8,\n      \"description_english\": \"A hold item that restores HP but\\\\nmay cause confusion when used.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MAGO BERRY\",\n      \"itemId\": \"ITEM_MAGO_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CONFUSE_SWEET\",\n      \"holdEffectParam\": 8,\n      \"description_english\": \"A hold item that restores HP but\\\\nmay cause confusion when used.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"AGUAV BERRY\",\n      \"itemId\": \"ITEM_AGUAV_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CONFUSE_BITTER\",\n      \"holdEffectParam\": 8,\n      \"description_english\": \"A hold item that restores HP but\\\\nmay cause confusion when used.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"IAPAPA BERRY\",\n      \"itemId\": \"ITEM_IAPAPA_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CONFUSE_SOUR\",\n      \"holdEffectParam\": 8,\n      \"description_english\": \"A hold item that restores HP but\\\\nmay cause confusion when used.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RAZZ BERRY\",\n      \"itemId\": \"ITEM_RAZZ_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BLUK BERRY\",\n      \"itemId\": \"ITEM_BLUK_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"NANAB BERRY\",\n      \"itemId\": \"ITEM_NANAB_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"WEPEAR BERRY\",\n      \"itemId\": \"ITEM_WEPEAR_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"PINAP BERRY\",\n      \"itemId\": \"ITEM_PINAP_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"POMEG BERRY\",\n      \"itemId\": \"ITEM_POMEG_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Makes a POKéMON friendly but\\\\nlowers base HP.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"ItemUseOutOfBattle_ReduceEV\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"KELPSY BERRY\",\n      \"itemId\": \"ITEM_KELPSY_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Makes a POKéMON friendly but\\\\nlowers base ATTACK.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"ItemUseOutOfBattle_ReduceEV\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"QUALOT BERRY\",\n      \"itemId\": \"ITEM_QUALOT_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Makes a POKéMON friendly but\\\\nlowers base DEFENSE.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"ItemUseOutOfBattle_ReduceEV\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"HONDEW BERRY\",\n      \"itemId\": \"ITEM_HONDEW_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Makes a POKéMON friendly but\\\\nlowers base SP. ATK.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"ItemUseOutOfBattle_ReduceEV\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"GREPA BERRY\",\n      \"itemId\": \"ITEM_GREPA_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Makes a POKéMON friendly but\\\\nlowers base SP. DEF.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"ItemUseOutOfBattle_ReduceEV\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"TAMATO BERRY\",\n      \"itemId\": \"ITEM_TAMATO_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Makes a POKéMON friendly but\\\\nlowers base SPEED.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"ItemUseOutOfBattle_ReduceEV\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"CORNN BERRY\",\n      \"itemId\": \"ITEM_CORNN_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MAGOST BERRY\",\n      \"itemId\": \"ITEM_MAGOST_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RABUTA BERRY\",\n      \"itemId\": \"ITEM_RABUTA_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"NOMEL BERRY\",\n      \"itemId\": \"ITEM_NOMEL_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SPELON BERRY\",\n      \"itemId\": \"ITEM_SPELON_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"PAMTRE BERRY\",\n      \"itemId\": \"ITEM_PAMTRE_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"WATMEL BERRY\",\n      \"itemId\": \"ITEM_WATMEL_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"DURIN BERRY\",\n      \"itemId\": \"ITEM_DURIN_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BELUE BERRY\",\n      \"itemId\": \"ITEM_BELUE_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LIECHI BERRY\",\n      \"itemId\": \"ITEM_LIECHI_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_ATTACK_UP\",\n      \"holdEffectParam\": 4,\n      \"description_english\": \"When held by a POKéMON, it raises\\\\nthe ATTACK stat in a pinch.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"GANLON BERRY\",\n      \"itemId\": \"ITEM_GANLON_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_DEFENSE_UP\",\n      \"holdEffectParam\": 4,\n      \"description_english\": \"When held by a POKéMON, it raises\\\\nthe DEFENSE stat in a pinch.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SALAC BERRY\",\n      \"itemId\": \"ITEM_SALAC_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_SPEED_UP\",\n      \"holdEffectParam\": 4,\n      \"description_english\": \"When held by a POKéMON, it raises\\\\nthe SPEED stat in a pinch.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"PETAYA BERRY\",\n      \"itemId\": \"ITEM_PETAYA_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_SP_ATTACK_UP\",\n      \"holdEffectParam\": 4,\n      \"description_english\": \"When held by a POKéMON, it raises\\\\nthe SP. ATK stat in a pinch.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"APICOT BERRY\",\n      \"itemId\": \"ITEM_APICOT_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_SP_DEFENSE_UP\",\n      \"holdEffectParam\": 4,\n      \"description_english\": \"When held by a POKéMON, it raises\\\\nthe SP. DEF stat in a pinch.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LANSAT BERRY\",\n      \"itemId\": \"ITEM_LANSAT_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_CRITICAL_UP\",\n      \"holdEffectParam\": 4,\n      \"description_english\": \"When held by a POKéMON, it raises\\\\nthe critical-hit ratio in a pinch.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"STARF BERRY\",\n      \"itemId\": \"ITEM_STARF_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_RANDOM_STAT_UP\",\n      \"holdEffectParam\": 4,\n      \"description_english\": \"When held by a POKéMON, it sharply\\\\nraises one stat in a pinch.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ENIGMA BERRY\",\n      \"itemId\": \"ITEM_ENIGMA_BERRY\",\n      \"price\": 20,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Can be ground up into a powder as\\\\nan ingredient for medicine.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_BERRY_POUCH\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"ItemUseOutOfBattle_EnigmaBerry\",\n      \"battleUsage\": 1,\n      \"battleUseFunc\": \"ItemUseInBattle_EnigmaBerry\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BRIGHTPOWDER\",\n      \"itemId\": \"ITEM_BRIGHT_POWDER\",\n      \"price\": 10,\n      \"holdEffect\": \"HOLD_EFFECT_EVASION_UP\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt casts a tricky glare that lowers\\\\nthe opponent's accuracy.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"WHITE HERB\",\n      \"itemId\": \"ITEM_WHITE_HERB\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_RESTORE_STATS\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt restores any lowered stat in\\\\nbattle. It can be used only once.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MACHO BRACE\",\n      \"itemId\": \"ITEM_MACHO_BRACE\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_MACHO_BRACE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt promotes strong growth but\\\\nlowers SPEED while it is held.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"EXP. SHARE\",\n      \"itemId\": \"ITEM_EXP_SHARE\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_EXP_SHARE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nThe holder gets a share of EXP.\\\\npoints without having to battle.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"QUICK CLAW\",\n      \"itemId\": \"ITEM_QUICK_CLAW\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_QUICK_CLAW\",\n      \"holdEffectParam\": 20,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA light and sharp claw. The holder\\\\nmay be able to strike first.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SOOTHE BELL\",\n      \"itemId\": \"ITEM_SOOTHE_BELL\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_FRIENDSHIP_UP\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA bell with a comforting chime that\\\\nmakes the holder calm and friendly.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MENTAL HERB\",\n      \"itemId\": \"ITEM_MENTAL_HERB\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_CURE_ATTRACT\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt snaps the holder out of\\\\ninfatuation. It can be used once.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"CHOICE BAND\",\n      \"itemId\": \"ITEM_CHOICE_BAND\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_CHOICE_BAND\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt powers up one move, which\\\\nbecomes the only usable one.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"KING'S ROCK\",\n      \"itemId\": \"ITEM_KINGS_ROCK\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_FLINCH\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt may cause the foe to flinch\\\\nupon taking damage.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SILVERPOWDER\",\n      \"itemId\": \"ITEM_SILVER_POWDER\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_BUG_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA shiny silver powder that boosts\\\\nthe power of BUG-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"AMULET COIN\",\n      \"itemId\": \"ITEM_AMULET_COIN\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_DOUBLE_PRIZE\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt doubles the battle money if the\\\\nholding POKéMON takes part.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"CLEANSE TAG\",\n      \"itemId\": \"ITEM_CLEANSE_TAG\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_REPEL\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt repels wild POKéMON if the\\\\nholder is first in the party.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SOUL DEW\",\n      \"itemId\": \"ITEM_SOUL_DEW\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_SOUL_DEW\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An orb to be held by a LATIOS or\\\\nLATIAS. It raises the SP. ATK\\\\nand SP. DEF stats.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"DEEPSEATOOTH\",\n      \"itemId\": \"ITEM_DEEP_SEA_TOOTH\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_DEEP_SEA_TOOTH\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA fang that gleams a sharp silver.\\\\nIt raises the SP. ATK stat.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"DEEPSEASCALE\",\n      \"itemId\": \"ITEM_DEEP_SEA_SCALE\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_DEEP_SEA_SCALE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA scale that shines a faint pink.\\\\nIt raises the SP. DEF stat.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SMOKE BALL\",\n      \"itemId\": \"ITEM_SMOKE_BALL\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_CAN_ALWAYS_RUN\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nThe holding POKéMON can flee from\\\\nany wild POKéMON for sure.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"EVERSTONE\",\n      \"itemId\": \"ITEM_EVERSTONE\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_PREVENT_EVOLVE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nThe holding POKéMON is prevented\\\\nfrom evolving.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"FOCUS BAND\",\n      \"itemId\": \"ITEM_FOCUS_BAND\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_FOCUS_BAND\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nThe holding POKéMON may endure an\\\\nattack, leaving just 1 HP.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LUCKY EGG\",\n      \"itemId\": \"ITEM_LUCKY_EGG\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_LUCKY_EGG\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nAn egg filled with happiness that\\\\nearns extra EXP. points in battle.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SCOPE LENS\",\n      \"itemId\": \"ITEM_SCOPE_LENS\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_SCOPE_LENS\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA lens that boosts the critical-hit\\\\nratio of the holding POKéMON.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"METAL COAT\",\n      \"itemId\": \"ITEM_METAL_COAT\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_STEEL_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA special metallic film that boosts\\\\nthe power of STEEL-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LEFTOVERS\",\n      \"itemId\": \"ITEM_LEFTOVERS\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_LEFTOVERS\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nThe holding POKéMON gradually\\\\nregains HP during battle.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"DRAGON SCALE\",\n      \"itemId\": \"ITEM_DRAGON_SCALE\",\n      \"price\": 2100,\n      \"holdEffect\": \"HOLD_EFFECT_DRAGON_SCALE\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"A thick and tough scale.\\\\nA DRAGON-type POKéMON may be\\\\nholding it.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LIGHT BALL\",\n      \"itemId\": \"ITEM_LIGHT_BALL\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_LIGHT_BALL\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An orb to be held by a PIKACHU\\\\nthat raises the SP. ATK stat.\\\\nTouching it may cause a shock.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SOFT SAND\",\n      \"itemId\": \"ITEM_SOFT_SAND\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_GROUND_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA loose, silky sand that boosts the\\\\npower of GROUND-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"HARD STONE\",\n      \"itemId\": \"ITEM_HARD_STONE\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_ROCK_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nAn unbreakable stone that boosts\\\\nthe power of ROCK-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MIRACLE SEED\",\n      \"itemId\": \"ITEM_MIRACLE_SEED\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_GRASS_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA seed imbued with life that boosts\\\\nthe power of GRASS-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BLACKGLASSES\",\n      \"itemId\": \"ITEM_BLACK_GLASSES\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_DARK_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA shady-looking pair of glasses\\\\nthat boosts DARK-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BLACK BELT\",\n      \"itemId\": \"ITEM_BLACK_BELT\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_FIGHTING_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA belt that boosts determination\\\\nand FIGHTING-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MAGNET\",\n      \"itemId\": \"ITEM_MAGNET\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_ELECTRIC_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA powerful magnet that boosts the\\\\npower of ELECTRIC-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MYSTIC WATER\",\n      \"itemId\": \"ITEM_MYSTIC_WATER\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_WATER_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA teardrop-shaped gem that boosts\\\\nthe power of WATER-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SHARP BEAK\",\n      \"itemId\": \"ITEM_SHARP_BEAK\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_FLYING_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA long, sharp beak that boosts the\\\\npower of FLYING-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"POISON BARB\",\n      \"itemId\": \"ITEM_POISON_BARB\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_POISON_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA small, poisonous barb that boosts\\\\nthe power of POISON-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"NEVERMELTICE\",\n      \"itemId\": \"ITEM_NEVER_MELT_ICE\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_ICE_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA piece of ice that repels heat\\\\nand boosts ICE-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SPELL TAG\",\n      \"itemId\": \"ITEM_SPELL_TAG\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_GHOST_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA sinister, eerie tag that boosts\\\\nGHOST-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"TWISTEDSPOON\",\n      \"itemId\": \"ITEM_TWISTED_SPOON\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_PSYCHIC_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA spoon imbued with telekinetic\\\\npower boosts PSYCHIC-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"CHARCOAL\",\n      \"itemId\": \"ITEM_CHARCOAL\",\n      \"price\": 9800,\n      \"holdEffect\": \"HOLD_EFFECT_FIRE_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA combustible fuel that boosts the\\\\npower of FIRE-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"DRAGON FANG\",\n      \"itemId\": \"ITEM_DRAGON_FANG\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_DRAGON_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA hard and sharp fang that boosts\\\\nthe power of DRAGON-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SILK SCARF\",\n      \"itemId\": \"ITEM_SILK_SCARF\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_NORMAL_POWER\",\n      \"holdEffectParam\": 10,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nA sumptuous scarf that boosts the\\\\npower of NORMAL-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"UP-GRADE\",\n      \"itemId\": \"ITEM_UP_GRADE\",\n      \"price\": 2100,\n      \"holdEffect\": \"HOLD_EFFECT_UP_GRADE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A transparent device filled with all\\\\nsorts of data.\\\\nIt is made by SILPH CO.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SHELL BELL\",\n      \"itemId\": \"ITEM_SHELL_BELL\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_SHELL_BELL\",\n      \"holdEffectParam\": 8,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nThe holding POKéMON regains some\\\\nHP upon striking the foe.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SEA INCENSE\",\n      \"itemId\": \"ITEM_SEA_INCENSE\",\n      \"price\": 9600,\n      \"holdEffect\": \"HOLD_EFFECT_WATER_POWER\",\n      \"holdEffectParam\": 5,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt slightly boosts the power of\\\\nWATER-type moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LAX INCENSE\",\n      \"itemId\": \"ITEM_LAX_INCENSE\",\n      \"price\": 9600,\n      \"holdEffect\": \"HOLD_EFFECT_EVASION_UP\",\n      \"holdEffectParam\": 5,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIts tricky aroma slightly reduces\\\\nthe foe's accuracy.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LUCKY PUNCH\",\n      \"itemId\": \"ITEM_LUCKY_PUNCH\",\n      \"price\": 10,\n      \"holdEffect\": \"HOLD_EFFECT_LUCKY_PUNCH\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A glove to be held by a CHANSEY.\\\\nIt raises CHANSEY's critical-hit\\\\nratio.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"METAL POWDER\",\n      \"itemId\": \"ITEM_METAL_POWDER\",\n      \"price\": 10,\n      \"holdEffect\": \"HOLD_EFFECT_METAL_POWDER\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A fine, hard powder to be held by\\\\na DITTO.\\\\nIt raises DITTO's DEFENSE stat.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"THICK CLUB\",\n      \"itemId\": \"ITEM_THICK_CLUB\",\n      \"price\": 500,\n      \"holdEffect\": \"HOLD_EFFECT_THICK_CLUB\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A hard bone of some sort to be\\\\nheld by a CUBONE or MAROWAK.\\\\nIt raises the ATTACK stat.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"STICK\",\n      \"itemId\": \"ITEM_STICK\",\n      \"price\": 200,\n      \"holdEffect\": \"HOLD_EFFECT_STICK\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A stick of leek to be held by a\\\\nFARFETCH'D. It raises FARFETCH'D's\\\\ncritical-hit ratio.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RED SCARF\",\n      \"itemId\": \"ITEM_RED_SCARF\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt boosts the holding POKéMON's\\\\nCOOL condition in CONTESTS.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BLUE SCARF\",\n      \"itemId\": \"ITEM_BLUE_SCARF\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt boosts the holding POKéMON's\\\\nBEAUTY condition in CONTESTS.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"PINK SCARF\",\n      \"itemId\": \"ITEM_PINK_SCARF\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt boosts the holding POKéMON's\\\\nCUTE condition in CONTESTS.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"GREEN SCARF\",\n      \"itemId\": \"ITEM_GREEN_SCARF\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt boosts the holding POKéMON's\\\\nSMART condition in CONTESTS.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"YELLOW SCARF\",\n      \"itemId\": \"ITEM_YELLOW_SCARF\",\n      \"price\": 100,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An item to be held by a POKéMON.\\\\nIt boosts the holding POKéMON's\\\\nTOUGH condition in CONTESTS.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_HELD_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MACH BIKE\",\n      \"itemId\": \"ITEM_MACH_BIKE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A folding bicycle that is at least\\\\ntwice as fast as walking.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_FIELD\",\n      \"fieldUseFunc\": \"FieldUseFunc_Bike\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"COIN CASE\",\n      \"itemId\": \"ITEM_COIN_CASE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A case for holding COINS obtained\\\\nat the GAME CORNER.\\\\nIt holds up to 9,999 COINS.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_CoinCase\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ITEMFINDER\",\n      \"itemId\": \"ITEM_ITEMFINDER\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A device used for finding items.\\\\nIf there is a hidden item nearby\\\\nwhen it is used, it emits a signal.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_FIELD\",\n      \"fieldUseFunc\": \"ItemUseOutOfBattle_Itemfinder\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"OLD ROD\",\n      \"itemId\": \"ITEM_OLD_ROD\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An old and beat-up fishing rod.\\\\nUse it by any body of water to \\\\nfish for wild POKéMON.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_FIELD\",\n      \"fieldUseFunc\": \"FieldUseFunc_Rod\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": \"OLD_ROD\"\n    },\n    {\n      \"english\": \"GOOD ROD\",\n      \"itemId\": \"ITEM_GOOD_ROD\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A new, good-quality fishing rod.\\\\nUse it by any body of water to \\\\nfish for wild POKéMON.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_FIELD\",\n      \"fieldUseFunc\": \"FieldUseFunc_Rod\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": \"GOOD_ROD\"\n    },\n    {\n      \"english\": \"SUPER ROD\",\n      \"itemId\": \"ITEM_SUPER_ROD\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An awesome, high-tech fishing rod.\\\\nUse it by any body of water to fish\\\\nfor wild POKéMON.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_FIELD\",\n      \"fieldUseFunc\": \"FieldUseFunc_Rod\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": \"SUPER_ROD\"\n    },\n    {\n      \"english\": \"S.S. TICKET\",\n      \"itemId\": \"ITEM_SS_TICKET\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The ticket required for sailing on\\\\nthe ferry S.S. ANNE.\\\\nIt has a drawing of a ship on it.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"CONTEST PASS\",\n      \"itemId\": \"ITEM_CONTEST_PASS\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The pass required for entering\\\\nPOKéMON CONTESTS. It has a\\\\ndrawing of an award ribbon on it.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"WAILMER PAIL\",\n      \"itemId\": \"ITEM_WAILMER_PAIL\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A nifty watering pail.\\\\nUse it to promote strong growth in\\\\nBERRIES planted in soft soil.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"DEVON GOODS\",\n      \"itemId\": \"ITEM_DEVON_GOODS\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A package that contains mechanical\\\\nparts of some sort made by the\\\\nDEVON CORPORATION.\",\n      \"importance\": 2,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SOOT SACK\",\n      \"itemId\": \"ITEM_SOOT_SACK\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A sack used to collect volcanic\\\\nash automatically during walks\\\\nover deep ash.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_SootSack\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BASEMENT KEY\",\n      \"itemId\": \"ITEM_BASEMENT_KEY\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The key to NEW MAUVILLE, which\\\\nwas constructed beneath MAUVILLE\\\\nCITY.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ACRO BIKE\",\n      \"itemId\": \"ITEM_ACRO_BIKE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A folding bicycle that is capable\\\\nof stunts like jumps and wheelies.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_FIELD\",\n      \"fieldUseFunc\": \"FieldUseFunc_Bike\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 1\n    },\n    {\n      \"english\": \"{POKEBLOCK} CASE\",\n      \"itemId\": \"ITEM_POKEBLOCK_CASE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A case for holding {POKEBLOCK}S made\\\\nwith a BERRY BLENDER. It releases\\\\none {POKEBLOCK} when shaken.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LETTER\",\n      \"itemId\": \"ITEM_LETTER\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An extremely important letter to\\\\nSTEVEN from the PRESIDENT of the\\\\nDEVON CORPORATION.\",\n      \"importance\": 2,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"EON TICKET\",\n      \"itemId\": \"ITEM_EON_TICKET\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The ticket required for sailing on a\\\\nferry to a distant southern island.\\\\nIt features a drawing of an island.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 1\n    },\n    {\n      \"english\": \"RED ORB\",\n      \"itemId\": \"ITEM_RED_ORB\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An orb that glows red.\\\\nIt is said to contain an incredible\\\\npower from ancient times.\",\n      \"importance\": 2,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BLUE ORB\",\n      \"itemId\": \"ITEM_BLUE_ORB\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An orb that glows blue.\\\\nIt is said to contain an incredible\\\\npower from ancient times.\",\n      \"importance\": 2,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SCANNER\",\n      \"itemId\": \"ITEM_SCANNER\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A device used to search for\\\\nlife-forms in water.\\\\nIt looks too difficult to use.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"GO-GOGGLES\",\n      \"itemId\": \"ITEM_GO_GOGGLES\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A pair of protective goggles.\\\\nThey enable a TRAINER to travel\\\\nthrough even desert sandstorms.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"METEORITE\",\n      \"itemId\": \"ITEM_METEORITE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A meteorite that fell from space\\\\nonto MT. MOON long ago.\\\\nIt is very lumpy and hard.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RM. 1 KEY\",\n      \"itemId\": \"ITEM_ROOM_1_KEY\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A key that opens the door to Room\\\\n1 inside the ABANDONED SHIP.\\\\nIt is old and looks easily broken.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RM. 2 KEY\",\n      \"itemId\": \"ITEM_ROOM_2_KEY\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A key that opens the door to Room\\\\n2 inside the ABANDONED SHIP.\\\\nIt is old and looks easily broken.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RM. 4 KEY\",\n      \"itemId\": \"ITEM_ROOM_4_KEY\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A key that opens the door to Room\\\\n4 inside the ABANDONED SHIP.\\\\nIt is old and looks easily broken.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RM. 6 KEY\",\n      \"itemId\": \"ITEM_ROOM_6_KEY\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A key that opens the door to Room\\\\n6 inside the ABANDONED SHIP.\\\\nIt is old and looks easily broken.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"STORAGE KEY\",\n      \"itemId\": \"ITEM_STORAGE_KEY\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A key that opens the storage hold\\\\ninside the ABANDONED SHIP.\\\\nIt is old and looks easily broken.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"ROOT FOSSIL\",\n      \"itemId\": \"ITEM_ROOT_FOSSIL\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A fossil of an ancient, seafloor-\\\\ndwelling POKéMON. It appears to be\\\\npart of a plant root.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"CLAW FOSSIL\",\n      \"itemId\": \"ITEM_CLAW_FOSSIL\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A fossil of an ancient, seafloor-\\\\ndwelling POKéMON. It appears to be\\\\npart of a claw.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"DEVON SCOPE\",\n      \"itemId\": \"ITEM_DEVON_SCOPE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A scope that signals the presence\\\\nof any unseeable POKéMON.\\\\nIt is made by the DEVON CORP.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"TM01\",\n      \"itemId\": \"ITEM_TM01\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An extremely powerful attack.\\\\nHowever, if the user is hit before\\\\nusing the move, they will flinch.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"FocusPunch\"\n    },\n    {\n      \"english\": \"TM02\",\n      \"itemId\": \"ITEM_TM02\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Sharp, huge claws hook and slash\\\\nthe foe quickly and with great\\\\npower.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"DragonClaw\"\n    },\n    {\n      \"english\": \"TM03\",\n      \"itemId\": \"ITEM_TM03\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The foe is hit with a pulsing blast\\\\nof water. It may also confuse the\\\\ntarget.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"WaterPulse\"\n    },\n    {\n      \"english\": \"TM04\",\n      \"itemId\": \"ITEM_TM04\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The user calms its spirit and\\\\nfocuses its mind to raise its\\\\nSP. ATK and SP. DEF stats.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"CalmMind\"\n    },\n    {\n      \"english\": \"TM05\",\n      \"itemId\": \"ITEM_TM05\",\n      \"price\": 10000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A savage roar that causes the foe\\\\nto switch out of battle. In the\\\\nwild, ROAR ends the battle.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Roar\"\n    },\n    {\n      \"english\": \"TM06\",\n      \"itemId\": \"ITEM_TM06\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A move that leaves the foe badly\\\\npoisoned. Its poison damage worsens\\\\nevery turn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Toxic\"\n    },\n    {\n      \"english\": \"TM07\",\n      \"itemId\": \"ITEM_TM07\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Summons a hailstorm that lasts for\\\\nfive turns. The hailstorm damages\\\\nall types except the ICE type.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Hail\"\n    },\n    {\n      \"english\": \"TM08\",\n      \"itemId\": \"ITEM_TM08\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The user tightens all its muscles\\\\nand bulks up, boosting both its\\\\nATTACK and DEFENSE stats.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"BulkUp\"\n    },\n    {\n      \"english\": \"TM09\",\n      \"itemId\": \"ITEM_TM09\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The user shoots seeds at the foe\\\\nin rapid succession. Two to five\\\\nseeds are shot at once.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"BulletSeed\"\n    },\n    {\n      \"english\": \"TM10\",\n      \"itemId\": \"ITEM_TM10\",\n      \"price\": 10000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A variable move that changes type\\\\nand power depending on the POKéMON\\\\nusing it.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"HiddenPower\"\n    },\n    {\n      \"english\": \"TM11\",\n      \"itemId\": \"ITEM_TM11\",\n      \"price\": 2000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The weather is turned sunny for\\\\nfive turns. Over that time, FIRE-\\\\ntype moves are powered up.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"SunnyDay\"\n    },\n    {\n      \"english\": \"TM12\",\n      \"itemId\": \"ITEM_TM12\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A taunted foe may become enraged.\\\\nIt will then only be able to use\\\\nattack moves.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Taunt\"\n    },\n    {\n      \"english\": \"TM13\",\n      \"itemId\": \"ITEM_TM13\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An icy-cold beam is shot at the\\\\nfoe. It may leave the target\\\\nfrozen.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"IceBeam\"\n    },\n    {\n      \"english\": \"TM14\",\n      \"itemId\": \"ITEM_TM14\",\n      \"price\": 5500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A vicious snow-and-wind attack that\\\\nstrikes all foes in battle. It may\\\\ncause freezing.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Blizzard\"\n    },\n    {\n      \"english\": \"TM15\",\n      \"itemId\": \"ITEM_TM15\",\n      \"price\": 50000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A harsh attack that inflicts severe\\\\ndamage on the foe. However, the\\\\nuser must rest the next turn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"HyperBeam\"\n    },\n    {\n      \"english\": \"TM16\",\n      \"itemId\": \"ITEM_TM16\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A wall of light is created over\\\\nfive turns. It reduces damage from\\\\nSP. ATK attacks.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"LightScreen\"\n    },\n    {\n      \"english\": \"TM17\",\n      \"itemId\": \"ITEM_TM17\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The user is completely protected\\\\nfrom attack in the turn it is used.\\\\nIt may fail if used in succession.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Protect\"\n    },\n    {\n      \"english\": \"TM18\",\n      \"itemId\": \"ITEM_TM18\",\n      \"price\": 2000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A heavy rain is summoned for five\\\\nturns. Over that time, WATER-type\\\\nmoves are powered up.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"RainDance\"\n    },\n    {\n      \"english\": \"TM19\",\n      \"itemId\": \"ITEM_TM19\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The user strikes the foe with\\\\ntentacles or roots, stealing the\\\\ntarget's HP and healing itself.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"GigaDrain\"\n    },\n    {\n      \"english\": \"TM20\",\n      \"itemId\": \"ITEM_TM20\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Protects the party with a shield\\\\nagainst all status problems over\\\\nfive turns.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Safeguard\"\n    },\n    {\n      \"english\": \"TM21\",\n      \"itemId\": \"ITEM_TM21\",\n      \"price\": 1000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"This attack move grows more\\\\npowerful the more the POKéMON\\\\ndislikes its TRAINER.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Frustration\"\n    },\n    {\n      \"english\": \"TM22\",\n      \"itemId\": \"ITEM_TM22\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A 2-turn attack that uses the first\\\\nturn for absorbing sunlight, then\\\\nblasting the foe in the next turn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"SolarBeam\"\n    },\n    {\n      \"english\": \"TM23\",\n      \"itemId\": \"ITEM_TM23\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The foe is slammed with a sturdy\\\\ntail of steel. It may lower the\\\\ntarget's DEFENSE stat.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"IronTail\"\n    },\n    {\n      \"english\": \"TM24\",\n      \"itemId\": \"ITEM_TM24\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A massive jolt of electricity is\\\\nlaunched at the foe. It may cause\\\\nparalysis.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Thunderbolt\"\n    },\n    {\n      \"english\": \"TM25\",\n      \"itemId\": \"ITEM_TM25\",\n      \"price\": 5500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Strikes the foe with a huge\\\\nthunderbolt. It may cause\\\\nparalysis.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Thunder\"\n    },\n    {\n      \"english\": \"TM26\",\n      \"itemId\": \"ITEM_TM26\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Causes an earthquake that strikes\\\\nall POKéMON in battle, excluding\\\\nthe user.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Earthquake\"\n    },\n    {\n      \"english\": \"TM27\",\n      \"itemId\": \"ITEM_TM27\",\n      \"price\": 1000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"This attack move grows more\\\\npowerful the more the POKéMON\\\\nlikes its TRAINER.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Return\"\n    },\n    {\n      \"english\": \"TM28\",\n      \"itemId\": \"ITEM_TM28\",\n      \"price\": 10000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A 2-turn attack in which the user\\\\ndigs underground, then strikes.\\\\nIt can be used to exit dungeons.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Dig\"\n    },\n    {\n      \"english\": \"TM29\",\n      \"itemId\": \"ITEM_TM29\",\n      \"price\": 2000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A powerful blast of telekinetic\\\\nenergy strikes the foe. It may\\\\nlower the target's SP. DEF stat.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Psychic\"\n    },\n    {\n      \"english\": \"TM30\",\n      \"itemId\": \"ITEM_TM30\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The foe is attacked with a shadowy\\\\nlump. It may lower the target's\\\\nSP. DEF stat.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"ShadowBall\"\n    },\n    {\n      \"english\": \"TM31\",\n      \"itemId\": \"ITEM_TM31\",\n      \"price\": 10000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Strikes the foe with a rock-hard\\\\nfist, etc. It shatters barriers such\\\\nas REFLECT and LIGHT SCREEN.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"BrickBreak\"\n    },\n    {\n      \"english\": \"TM32\",\n      \"itemId\": \"ITEM_TM32\",\n      \"price\": 2000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The user begins moving so quickly\\\\nthat it creates illusory copies to\\\\nraise its evasiveness.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"DoubleTeam\"\n    },\n    {\n      \"english\": \"TM33\",\n      \"itemId\": \"ITEM_TM33\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A tough barrier is put up over five\\\\nturns. It reduces damage from\\\\nphysical attacks over that time.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Reflect\"\n    },\n    {\n      \"english\": \"TM34\",\n      \"itemId\": \"ITEM_TM34\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A rapid jolt of electricity strikes\\\\nthe foe. This attack is impossible\\\\nto evade.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"ShockWave\"\n    },\n    {\n      \"english\": \"TM35\",\n      \"itemId\": \"ITEM_TM35\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The foe is roasted with a heavy\\\\nblast of fire. It may leave the\\\\ntarget with a burn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Flamethrower\"\n    },\n    {\n      \"english\": \"TM36\",\n      \"itemId\": \"ITEM_TM36\",\n      \"price\": 1000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Toxic sludge is hurled at the foe\\\\nwith great force. It may also\\\\npoison the target.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"SludgeBomb\"\n    },\n    {\n      \"english\": \"TM37\",\n      \"itemId\": \"ITEM_TM37\",\n      \"price\": 2000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Summons a sandstorm that lasts for\\\\nfive turns. It damages all types\\\\nexcept ROCK, GROUND, and STEEL.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Sandstorm\"\n    },\n    {\n      \"english\": \"TM38\",\n      \"itemId\": \"ITEM_TM38\",\n      \"price\": 5500,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The foe is incinerated with an\\\\nintense flame. It may leave the\\\\ntarget with a burn.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"FireBlast\"\n    },\n    {\n      \"english\": \"TM39\",\n      \"itemId\": \"ITEM_TM39\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Boulders are hurled at the foe.\\\\nIt also lowers the target's SPEED\\\\nstat if it hits.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"RockTomb\"\n    },\n    {\n      \"english\": \"TM40\",\n      \"itemId\": \"ITEM_TM40\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An extremely fast attack against\\\\none target. It is impossible to\\\\nevade.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"AerialAce\"\n    },\n    {\n      \"english\": \"TM41\",\n      \"itemId\": \"ITEM_TM41\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"If enraged by this move, the target\\\\nbecomes incapable of using the same\\\\nmove twice in a row.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Torment\"\n    },\n    {\n      \"english\": \"TM42\",\n      \"itemId\": \"ITEM_TM42\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An attack move that becomes very\\\\npowerful if the user is poisoned,\\\\nburned, or paralyzed.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Facade\"\n    },\n    {\n      \"english\": \"TM43\",\n      \"itemId\": \"ITEM_TM43\",\n      \"price\": 10000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An attack move that may have an\\\\nadditional effect depending on the\\\\nbattle terrain.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"SecretPower\"\n    },\n    {\n      \"english\": \"TM44\",\n      \"itemId\": \"ITEM_TM44\",\n      \"price\": 10000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A move that makes the user fall\\\\nasleep over two turns to restore HP\\\\nand heal any status problems.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Rest\"\n    },\n    {\n      \"english\": \"TM45\",\n      \"itemId\": \"ITEM_TM45\",\n      \"price\": 10000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The foe, if it is the opposite\\\\ngender as the user, becomes\\\\ninfatuated and may not attack.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Attract\"\n    },\n    {\n      \"english\": \"TM46\",\n      \"itemId\": \"ITEM_TM46\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An attack that gives the user an\\\\nopportunity to steal the foe's hold\\\\nitem.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Thief\"\n    },\n    {\n      \"english\": \"TM47\",\n      \"itemId\": \"ITEM_TM47\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The foe is struck with steel-hard\\\\nwings. It may also raise the user's\\\\nDEFENSE stat.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"SteelWing\"\n    },\n    {\n      \"english\": \"TM48\",\n      \"itemId\": \"ITEM_TM48\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A special power is transmitted to\\\\nthe foe, causing it to switch\\\\nabilities with the user.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"SkillSwap\"\n    },\n    {\n      \"english\": \"TM49\",\n      \"itemId\": \"ITEM_TM49\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A move that steals the effects of\\\\nany status-changing or healing move\\\\nthat the foe tries to use.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Snatch\"\n    },\n    {\n      \"english\": \"TM50\",\n      \"itemId\": \"ITEM_TM50\",\n      \"price\": 3000,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A maximum-power attack of great\\\\nferocity, but one that also sharply\\\\nreduces the user's SP. ATK stat.\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Overheat\"\n    },\n    {\n      \"english\": \"HM01\",\n      \"itemId\": \"ITEM_HM01\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Attacks the foe with sharp blades\\\\nor claws. It can also cut down thin\\\\ntrees and grass outside of battle.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Cut\"\n    },\n    {\n      \"english\": \"HM02\",\n      \"itemId\": \"ITEM_HM02\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The user flies up on the first turn,\\\\nthen attacks next turn. It can be\\\\nused to fly to any known town.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Fly\"\n    },\n    {\n      \"english\": \"HM03\",\n      \"itemId\": \"ITEM_HM03\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Creates a huge wave, then crashes\\\\nit down on the foe. It can be used\\\\nfor traveling on water.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Surf\"\n    },\n    {\n      \"english\": \"HM04\",\n      \"itemId\": \"ITEM_HM04\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The user builds enormous power,\\\\nthen slams the foe. It can be used\\\\nfor moving large, round boulders.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Strength\"\n    },\n    {\n      \"english\": \"HM05\",\n      \"itemId\": \"ITEM_HM05\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Looses a powerful blast of light\\\\nthat reduces the foe's accuracy.\\\\nIt also lights up dark caves.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Flash\"\n    },\n    {\n      \"english\": \"HM06\",\n      \"itemId\": \"ITEM_HM06\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Hits the foe with a rock-crushingly\\\\ntough attack. It can smash cracked\\\\nboulders.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"RockSmash\"\n    },\n    {\n      \"english\": \"HM07\",\n      \"itemId\": \"ITEM_HM07\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A powerful charge attack. It can\\\\nbe used for climbing a torrential\\\\nwaterfall.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Waterfall\"\n    },\n    {\n      \"english\": \"HM08\",\n      \"itemId\": \"ITEM_HM08\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A 2-turn attack in which the user\\\\ndives underwater on the first turn,\\\\nthen strikes in the next turn.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_TM_CASE\",\n      \"type\": \"ITEM_TYPE_PARTY_MENU\",\n      \"fieldUseFunc\": \"NULL\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0,\n      \"moveId\": \"Dive\"\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"????????\",\n      \"itemId\": \"ITEM_NONE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"?????\",\n      \"importance\": 0,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"OAK'S PARCEL\",\n      \"itemId\": \"ITEM_OAKS_PARCEL\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A parcel to be delivered to PROF.\\\\nOAK from VIRIDIAN CITY's POKéMON\\\\nMART.\",\n      \"importance\": 2,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"POK\\u00e9 FLUTE\",\n      \"itemId\": \"ITEM_POKE_FLUTE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A flute that is said to instantly\\\\nawaken any POKéMON. It has a\\\\nlovely tone.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_PokeFlute\",\n      \"battleUsage\": 2,\n      \"battleUseFunc\": \"BattleUseFunc_PokeFlute\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SECRET KEY\",\n      \"itemId\": \"ITEM_SECRET_KEY\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"The key to CINNABAR ISLAND GYM's\\\\nfront door. It is colored red and\\\\ndecorated.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BIKE VOUCHER\",\n      \"itemId\": \"ITEM_BIKE_VOUCHER\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"Take this voucher to the BIKE SHOP\\\\nin CERULEAN CITY and exchange it\\\\nfor a bicycle.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"GOLD TEETH\",\n      \"itemId\": \"ITEM_GOLD_TEETH\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A set of false teeth lost by the\\\\nSAFARI ZONE'S WARDEN. It makes his\\\\nsmile sparkle.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"OLD AMBER\",\n      \"itemId\": \"ITEM_OLD_AMBER\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A piece of amber that contains\\\\nthe genes of an ancient POKéMON.\\\\nIt is clear with a reddish tint.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"CARD KEY\",\n      \"itemId\": \"ITEM_CARD_KEY\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A card-type key that unlocks doors\\\\nin SILPH CO.'s HEAD OFFICE in\\\\nSAFFRON CITY.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"LIFT KEY\",\n      \"itemId\": \"ITEM_LIFT_KEY\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A key that operates the elevator\\\\nin TEAM ROCKET's HIDEOUT.\\\\nIt bears the TEAM ROCKET logo.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"HELIX FOSSIL\",\n      \"itemId\": \"ITEM_HELIX_FOSSIL\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A fossil of an ancient, seafloor-\\\\ndwelling POKéMON. It appears to be\\\\npart of a seashell.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"DOME FOSSIL\",\n      \"itemId\": \"ITEM_DOME_FOSSIL\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A fossil of an ancient, seafloor-\\\\ndwelling POKéMON. It appears to be\\\\npart of a shell.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SILPH SCOPE\",\n      \"itemId\": \"ITEM_SILPH_SCOPE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A scope that makes unseeable\\\\nPOKéMON visible.\\\\nIt is made by SILPH CO.\",\n      \"importance\": 1,\n      \"registrability\": 0,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BICYCLE\",\n      \"itemId\": \"ITEM_BICYCLE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A folding bicycle that allows\\\\nfaster movement than the RUNNING\\\\nSHOES.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_FIELD\",\n      \"fieldUseFunc\": \"FieldUseFunc_Bike\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"TOWN MAP\",\n      \"itemId\": \"ITEM_TOWN_MAP\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A very convenient map that can be\\\\nviewed anytime. It even shows your \\\\npresent location.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_TownMap\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"VS SEEKER\",\n      \"itemId\": \"ITEM_VS_SEEKER\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A device that indicates TRAINERS\\\\nwho want to battle. The battery\\\\ncharges while traveling.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_FIELD\",\n      \"fieldUseFunc\": \"FieldUseFunc_VsSeeker\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"FAME CHECKER\",\n      \"itemId\": \"ITEM_FAME_CHECKER\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A device that enables you to\\\\nrecall what you've heard and seen\\\\nabout famous people.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_FameChecker\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"TM CASE\",\n      \"itemId\": \"ITEM_TM_CASE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A case that holds TMs and HMs.\\\\nIt is attached to the BAG's\\\\ncompartment for important items.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_TmCase\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"BERRY POUCH\",\n      \"itemId\": \"ITEM_BERRY_POUCH\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A pouch for carrying BERRIES.\\\\nIt is attached to the BAG's\\\\ncompartment for important items.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_BerryPouch\",\n      \"battleUsage\": 3,\n      \"battleUseFunc\": \"BattleUseFunc_BerryPouch\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"TEACHY TV\",\n      \"itemId\": \"ITEM_TEACHY_TV\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A television set that is tuned to\\\\na program with useful tips for\\\\nnovice TRAINERS.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_FIELD\",\n      \"fieldUseFunc\": \"FieldUseFunc_TeachyTv\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"TRI-PASS\",\n      \"itemId\": \"ITEM_TRI_PASS\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A pass for ferries between ONE,\\\\nTWO, and THREE ISLAND.\\\\nIt has a drawing of three islands.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RAINBOW PASS\",\n      \"itemId\": \"ITEM_RAINBOW_PASS\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A pass for ferries between\\\\nVERMILION and the SEVII ISLANDS.\\\\nIt features a drawing of a rainbow.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"TEA\",\n      \"itemId\": \"ITEM_TEA\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An aromatic tea prepared by an old\\\\nlady. It will slake even the worst\\\\nthirst.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MYSTICTICKET\",\n      \"itemId\": \"ITEM_MYSTIC_TICKET\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A ticket required to board the ship\\\\nto NAVEL ROCK.\\\\nIt glows with a mystic light.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"AURORATICKET\",\n      \"itemId\": \"ITEM_AURORA_TICKET\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A ticket required to board the ship\\\\nto BIRTH ISLAND.\\\\nIt glows beautifully.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"POWDER JAR\",\n      \"itemId\": \"ITEM_POWDER_JAR\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A jar for storing BERRY POWDER\\\\nmade using a BERRY CRUSHER.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_PowderJar\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"RUBY\",\n      \"itemId\": \"ITEM_RUBY\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An exquisitely beautiful gem that\\\\nhas a red glow.\\\\nIt symbolizes passion.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"SAPPHIRE\",\n      \"itemId\": \"ITEM_SAPPHIRE\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"An exquisitely beautiful gem that\\\\nhas a blue glow.\\\\nIt symbolizes honesty.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": \"ITEM_TYPE_BAG_MENU\",\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"MAGMA EMBLEM\",\n      \"itemId\": \"ITEM_MAGMA_EMBLEM\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A medal-like item in the same shape\\\\nas TEAM MAGMA's mark.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": 4,\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    },\n    {\n      \"english\": \"OLD SEA MAP\",\n      \"itemId\": \"ITEM_OLD_SEA_MAP\",\n      \"price\": 0,\n      \"holdEffect\": \"HOLD_EFFECT_NONE\",\n      \"holdEffectParam\": 0,\n      \"description_english\": \"A faded sea chart that shows the\\\\nway to a certain island.\\\\nIt is yellow with age.\",\n      \"importance\": 1,\n      \"registrability\": 1,\n      \"pocket\": \"POCKET_KEY_ITEMS\",\n      \"type\": 4,\n      \"fieldUseFunc\": \"FieldUseFunc_OakStopsYou\",\n      \"battleUsage\": 0,\n      \"battleUseFunc\": \"NULL\",\n      \"secondaryId\": 0\n    }\n  ]\n}\n"
  },
  {
    "path": "src/data/items.json.txt",
    "content": "{{ doNotModifyHeader }}\n## for item in items\n## if item.pocket == \"POCKET_TM_CASE\"\nextern const u8 gMoveDescription_{{ item.moveId }}[];\n## endif\n{% if item.itemId != \"ITEM_NONE\" %}const u8 gItemDescription_{{ item.itemId }}[] = _(\"{{ item.description_english }}\");{% endif %}\n## endfor\nconst u8 gItemDescription_ITEM_NONE[] = _(\"?????\");\n\nconst struct Item gItems[] = {\n    {% for item in items %}{\n        .name = _(\"{{ item.english }}\"),\n        .itemId = {{ item.itemId }},\n        .price = {{ item.price }},\n        .holdEffect = {{ item.holdEffect }},\n        .holdEffectParam = {{ item.holdEffectParam }},\n## if item.pocket == \"POCKET_TM_CASE\"\n        .description = gMoveDescription_{{ item.moveId }},\n## else\n        .description = gItemDescription_{{ item.itemId }},\n## endif\n        .importance = {{ item.importance }},\n        .registrability = {{ item.registrability }},\n        .pocket = {{ item.pocket }},\n        .type = {{ item.type }},\n        .fieldUseFunc = {{ item.fieldUseFunc }},\n        .battleUsage = {{ item.battleUsage }},\n        .battleUseFunc = {{ item.battleUseFunc }},\n        .secondaryId = {{ item.secondaryId }}\n    }, {% endfor %}\n};\n"
  },
  {
    "path": "src/data/master_trainer_parties.h",
    "content": "static const struct TrainerMonItemCustomMovesEVs sParty_MasterBulbasaur[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_BULBASAUR,\n        .heldItem = ITEM_LUM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_LIGHT_SCREEN, MOVE_ATTRACT, MOVE_BODY_SLAM, MOVE_SWORDS_DANCE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterIvysaur[] = {\n    {\n        .iv = 3, //flying\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_CAREFUL,\n        .species = SPECIES_IVYSAUR,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_LIGHT_SCREEN, MOVE_HIDDEN_POWER, MOVE_REST, MOVE_CURSE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterVenusaur[] = {\n    {\n        .iv = 9, //fire\n        .lvl = 60,\n        .evs = { 152, 0, 100, 0, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_VENUSAUR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SUNNY_DAY, MOVE_HIDDEN_POWER, MOVE_SYNTHESIS, MOVE_LIGHT_SCREEN},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterCharmander[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 152, 0, 0, 100},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_CHARMANDER,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_DIG, MOVE_SMOKESCREEN, MOVE_AERIAL_ACE, MOVE_FACADE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterCharmeleon[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 152, 0, 0, 100},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_CHARMELEON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ANCIENT_POWER, MOVE_MUD_SLAP, MOVE_MEGA_KICK, MOVE_DRAGON_DANCE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterCharizard[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 104, 0, 252, 100, 0, 54},\n        .nature = NATURE_CAREFUL,\n        .species = SPECIES_CHARIZARD,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_BELLY_DRUM, MOVE_ROCK_SLIDE, MOVE_REST, MOVE_HYPER_BEAM},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterSquirtle[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 0, 4, 0, 0, 252},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_SQUIRTLE,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_YAWN, MOVE_SUBSTITUTE, MOVE_BODY_SLAM, MOVE_TOXIC},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterWartortle[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 0, 4, 0, 0, 252},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_WARTORTLE,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_REST, MOVE_SUBSTITUTE, MOVE_RETURN, MOVE_TOXIC},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterBlastoise[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 252, 0, 0, 0, 4},\n        .nature = NATURE_CAREFUL,\n        .species = SPECIES_BLASTOISE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ATTRACT, MOVE_EARTHQUAKE, MOVE_ROLLOUT, MOVE_TOXIC},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterCaterpie[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_CATERPIE,\n        .heldItem = ITEM_SILK_SCARF,\n        .abilityNum = 0,\n        .moves = {MOVE_TACKLE, MOVE_STRING_SHOT, MOVE_NONE, MOVE_NONE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMetapod[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_METAPOD,\n        .heldItem = ITEM_LIECHI_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_TACKLE, MOVE_STRING_SHOT, MOVE_HARDEN, MOVE_NONE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterButterfree[] = {\n    {\n        .iv = 6, //rock\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_BUTTERFREE,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_SUBSTITUTE, MOVE_SLEEP_POWDER, MOVE_AERIAL_ACE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterWeedle[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_WEEDLE,\n        .heldItem = ITEM_POISON_BARB,\n        .abilityNum = 0,\n        .moves = {MOVE_POISON_STING, MOVE_STRING_SHOT, MOVE_NONE, MOVE_NONE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterKakuna[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_KAKUNA,\n        .heldItem = ITEM_LIECHI_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_POISON_STING, MOVE_STRING_SHOT, MOVE_HARDEN, MOVE_NONE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterBeedrill[] = {\n    {\n        .iv = 6, //rock\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_BEEDRILL,\n        .heldItem = ITEM_SCOPE_LENS,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_SWORDS_DANCE, MOVE_FOCUS_ENERGY, MOVE_AERIAL_ACE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPidgey[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_PIDGEY,\n        .heldItem = ITEM_METAL_COAT,\n        .abilityNum = 0,\n        .moves = {MOVE_FEATHER_DANCE, MOVE_STEEL_WING, MOVE_FLY, MOVE_DOUBLE_TEAM},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPidgeotto[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_PIDGEOTTO,\n        .heldItem = ITEM_LIECHI_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_FEATHER_DANCE, MOVE_STEEL_WING, MOVE_SWIFT, MOVE_TOXIC},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPidgeot[] = {\n    {\n        .iv = 6, //rock\n        .lvl = 60,\n        .evs = { 4, 252, 248, 4, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_PIDGEOT,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_DOUBLE_TEAM, MOVE_AERIAL_ACE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterRattata[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 152, 252, 0, 0, 100},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_RATTATA,\n        .heldItem = ITEM_SCOPE_LENS,\n        .abilityNum = 1,\n        .moves = {MOVE_FOCUS_ENERGY, MOVE_HYPER_FANG, MOVE_SCREECH, MOVE_THUNDER_WAVE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterRaticate[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 248, 4, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_RATICATE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_SUPER_FANG, MOVE_RETURN, MOVE_FOCUS_ENERGY, MOVE_ATTRACT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterSpearow[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 248, 4, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_SPEAROW,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_DRILL_PECK, MOVE_TRI_ATTACK, MOVE_PROTECT, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterFearow[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 0, 252, 100, 156, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_FEAROW,\n        .heldItem = ITEM_KINGS_ROCK,\n        .abilityNum = 0,\n        .moves = {MOVE_SKY_ATTACK, MOVE_SUBSTITUTE, MOVE_AGILITY, MOVE_DRILL_PECK},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterEkans[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_EKANS,\n        .heldItem = ITEM_SOFT_SAND,\n        .abilityNum = 0,\n        .moves = {MOVE_DIG, MOVE_TORMENT, MOVE_SCREECH, MOVE_GLARE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterArbok[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 0, 252, 252, 4, 0, 0},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_ARBOK,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_EARTHQUAKE, MOVE_PROTECT, MOVE_SCREECH, MOVE_GLARE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPikachu[] = {\n    {\n        .iv = 8, //ice\n        .lvl = 60,\n        .evs = { 4, 0, 100, 0, 252, 152},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_PIKACHU,\n        .heldItem = ITEM_LIGHT_BALL,\n        .abilityNum = 0,\n        .moves = {MOVE_WISH, MOVE_PROTECT, MOVE_VOLT_TACKLE, MOVE_HIDDEN_POWER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterRaichu[] = {\n    {\n        .iv = 2, //ground\n        .lvl = 60,\n        .evs = { 4, 252, 100, 0, 0, 152},\n        .nature = NATURE_HASTY,\n        .species = SPECIES_RAICHU,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_TOXIC, MOVE_LIGHT_SCREEN, MOVE_RETURN},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterSandshrew[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_SANDSHREW,\n        .heldItem = ITEM_LUM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_PROTECT, MOVE_TOXIC},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterSandslash[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 0, 252, 252, 4, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_SANDSLASH,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SWORDS_DANCE, MOVE_EARTHQUAKE, MOVE_CRUSH_CLAW, MOVE_PROTECT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterNidoranF[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_NIDORAN_F,\n        .heldItem = ITEM_LUM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_DIG, MOVE_MUD_SLAP, MOVE_FLATTER, MOVE_CHARM},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterNidorina[] = {\n    {\n        .iv = 2, //ground\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_NIDORINA,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_MUD_SLAP, MOVE_FLATTER, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterNidoqueen[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 252, 0, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_NIDOQUEEN,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SURF, MOVE_DISABLE, MOVE_FOCUS_ENERGY, MOVE_PROTECT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterNidoranM[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_NIDORAN_M,\n        .heldItem = ITEM_SCOPE_LENS,\n        .abilityNum = 0,\n        .moves = {MOVE_DIG, MOVE_DOUBLE_KICK, MOVE_FOCUS_ENERGY, MOVE_CHARM},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterNidorino[] = {\n    {\n        .iv = 2, //ground\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_NIDORINO,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_FLATTER, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterNidoking[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 0, 252, 0, 4, 0},\n        .nature = NATURE_BOLD,\n        .species = SPECIES_NIDOKING,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_AMNESIA, MOVE_HORN_DRILL, MOVE_PROTECT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterClefairy[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 252, 0, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_CLEFAIRY,\n        .heldItem = ITEM_MAGNET,\n        .abilityNum = 0,\n        .moves = {MOVE_RAIN_DANCE, MOVE_THUNDER, MOVE_SWEET_KISS, MOVE_COSMIC_POWER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterClefable[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 4, 252, 0, 0, 0},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_CLEFABLE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_COSMIC_POWER, MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH, MOVE_SOFT_BOILED},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterVulpix[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_VULPIX,\n        .heldItem = ITEM_LUM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_CONFUSE_RAY, MOVE_HYPNOSIS, MOVE_DIG, MOVE_RETURN},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterNinetales[] = {\n    {\n        .iv = 11, //water\n        .lvl = 60,\n        .evs = { 252, 0, 0, 100, 252, 152},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_NINETALES,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CONFUSE_RAY, MOVE_HIDDEN_POWER, MOVE_DISABLE, MOVE_IMPRISON},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterJigglypuff[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 252, 0, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_JIGGLYPUFF,\n        .heldItem = ITEM_CHARCOAL,\n        .abilityNum = 0,\n        .moves = {MOVE_FAKE_TEARS, MOVE_SUNNY_DAY, MOVE_FLAMETHROWER, MOVE_SING},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterWigglytuff[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 4, 252, 0, 0, 0},\n        .nature = NATURE_CAREFUL,\n        .species = SPECIES_WIGGLYTUFF,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_LIGHT_SCREEN, MOVE_TICKLE, MOVE_BRICK_BREAK, MOVE_WISH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterZubat[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_ZUBAT,\n        .heldItem = ITEM_SPELL_TAG,\n        .abilityNum = 0,\n        .moves = {MOVE_SHADOW_BALL, MOVE_AERIAL_ACE, MOVE_TORMENT, MOVE_CONFUSE_RAY},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterGolbat[] = {\n    {\n        .iv = 6, //rock\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_CAREFUL,\n        .species = SPECIES_GOLBAT,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SCREECH, MOVE_HIDDEN_POWER, MOVE_CONFUSE_RAY, MOVE_AERIAL_ACE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterOddish[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_ODDISH,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_ENDURE, MOVE_FLAIL, MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterGloom[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_GLOOM,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_CHARM, MOVE_SLUDGE_BOMB, MOVE_SWORDS_DANCE, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterVileplume[] = {\n    {\n        .iv = 9, //fire\n        .lvl = 60,\n        .evs = { 252, 0, 0, 0, 4, 252},\n        .nature = NATURE_BOLD,\n        .species = SPECIES_VILEPLUME,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_INGRAIN, MOVE_SUNNY_DAY, MOVE_HIDDEN_POWER, MOVE_SYNTHESIS},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterParas[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_PARAS,\n        .heldItem = ITEM_SHARP_BEAK,\n        .abilityNum = 0,\n        .moves = {MOVE_SPORE, MOVE_AERIAL_ACE, MOVE_SWORDS_DANCE, MOVE_SLUDGE_BOMB},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterParasect[] = {\n    {\n        .iv = 3, //flying\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_PARASECT,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SPORE, MOVE_HIDDEN_POWER, MOVE_SWORDS_DANCE, MOVE_SUBSTITUTE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterVenonat[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_VENONAT,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_DISABLE, MOVE_THIEF, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterVenomoth[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_VENOMOTH,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_SWAGGER, MOVE_SCREECH, MOVE_DISABLE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterDiglett[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_DIGLETT,\n        .heldItem = ITEM_BRIGHT_POWDER,\n        .abilityNum = 0,\n        .moves = {MOVE_EARTHQUAKE, MOVE_TOXIC, MOVE_SUBSTITUTE, MOVE_MUD_SLAP},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterDugtrio[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_DUGTRIO,\n        .heldItem = ITEM_CHOICE_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_EARTHQUAKE, MOVE_TRI_ATTACK, MOVE_AERIAL_ACE, MOVE_HYPER_BEAM},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMeowth[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_MEOWTH,\n        .heldItem = ITEM_SILK_SCARF,\n        .abilityNum = 0,\n        .moves = {MOVE_FAKE_OUT, MOVE_CHARM, MOVE_RETURN, MOVE_SCREECH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPersian[] = {\n    {\n        .iv = 4, //fighting\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_PERSIAN,\n        .heldItem = ITEM_LIECHI_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_FAKE_OUT, MOVE_SUBSTITUTE, MOVE_HIDDEN_POWER, MOVE_THIEF},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPsyduck[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 252, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_PSYDUCK,\n        .heldItem = ITEM_TWISTED_SPOON,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPNOSIS, MOVE_LIGHT_SCREEN, MOVE_CALM_MIND, MOVE_PSYCHIC},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterGolduck[] = {\n    {\n        .iv = 10, //electric\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_GOLDUCK,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPNOSIS, MOVE_SUBSTITUTE, MOVE_TOXIC, MOVE_HIDDEN_POWER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMankey[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_BRAVE,\n        .species = SPECIES_MANKEY,\n        .heldItem = ITEM_SCOPE_LENS,\n        .abilityNum = 0,\n        .moves = {MOVE_FOCUS_ENERGY, MOVE_TAUNT, MOVE_REVENGE, MOVE_SCREECH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPrimeape[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_BRAVE,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_FOCUS_ENERGY, MOVE_CROSS_CHOP, MOVE_BULK_UP, MOVE_REVENGE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterGrowlithe[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_GROWLITHE,\n        .heldItem = ITEM_SOFT_SAND,\n        .abilityNum = 0,\n        .moves = {MOVE_HOWL, MOVE_DIG, MOVE_BODY_SLAM, MOVE_CHARM},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterArcanine[] = {\n    {\n        .iv = 6, //rock\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_WHITE_HERB,\n        .abilityNum = 0,\n        .moves = {MOVE_EXTREME_SPEED, MOVE_HYPER_BEAM, MOVE_HIDDEN_POWER, MOVE_BODY_SLAM},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPoliwag[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 252, 0, 0, 252},\n        .nature = NATURE_BOLD,\n        .species = SPECIES_POLIWAG,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_DEFENSE_CURL, MOVE_ICE_BALL, MOVE_PSYCHIC, MOVE_DOUBLE_TEAM},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPoliwhirl[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_POLIWHIRL,\n        .heldItem = ITEM_SOFT_SAND,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPNOSIS, MOVE_COUNTER, MOVE_BODY_SLAM, MOVE_EARTHQUAKE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPoliwrath[] = {\n    {\n        .iv = 3, //flying\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_POLIWRATH,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SUBSTITUTE, MOVE_BELLY_DRUM, MOVE_HIDDEN_POWER, MOVE_HYPNOSIS},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterAbra[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_ABRA,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_LIGHT_SCREEN, MOVE_THIEF, MOVE_CALM_MIND, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterKadabra[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_KADABRA,\n        .heldItem = ITEM_PETAYA_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_FUTURE_SIGHT, MOVE_RECOVER, MOVE_THIEF, MOVE_TORMENT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterAlakazam[] = {\n    {\n        .iv = 255, //dark\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_CALM_MIND, MOVE_RECOVER, MOVE_THUNDER_WAVE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMachop[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_BRAVE,\n        .species = SPECIES_MACHOP,\n        .heldItem = ITEM_MACHO_BRACE,\n        .abilityNum = 0,\n        .moves = {MOVE_FOCUS_ENERGY, MOVE_REVENGE, MOVE_COUNTER, MOVE_ENCORE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMachoke[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_BRAVE,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_FOCUS_ENERGY, MOVE_CROSS_CHOP, MOVE_BULK_UP, MOVE_ENCORE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMachamp[] = {\n    {\n        .iv = 3, //flying\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_MACHAMP,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_REST, MOVE_SLEEP_TALK, MOVE_CROSS_CHOP, MOVE_HIDDEN_POWER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterBellsprout[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 4, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_BELLSPROUT,\n        .heldItem = ITEM_LUM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_REFLECT, MOVE_SLEEP_POWDER, MOVE_SWORDS_DANCE, MOVE_DOUBLE_EDGE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterWeepinbell[] = {\n    {\n        .iv = 3, //flying\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_WEEPINBELL,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SYNTHESIS, MOVE_SUNNY_DAY, MOVE_HIDDEN_POWER, MOVE_ENCORE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterVictreebel[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 252, 0, 4, 0, 0},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_VICTREEBEL,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_INGRAIN, MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_DOUBLE_EDGE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterTentacool[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_TENTACOOL,\n        .heldItem = ITEM_LIECHI_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SWORDS_DANCE, MOVE_RETURN, MOVE_CONFUSE_RAY, MOVE_THIEF},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterTentacruel[] = {\n    {\n        .iv = 2, //ground\n        .lvl = 60,\n        .evs = { 252, 252, 4, 0, 0, 0},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_TENTACRUEL,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SWORDS_DANCE, MOVE_SUBSTITUTE, MOVE_HIDDEN_POWER, MOVE_BARRIER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterGeodude[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 4, 252, 0, 0, 0},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_GEODUDE,\n        .heldItem = ITEM_LUM_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_TOXIC, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_PROTECT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterGraveler[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_GRAVELER,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_SWAGGER, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterGolem[] = {\n    {\n        .iv = 7, //grass\n        .lvl = 60,\n        .evs = { 4, 0, 252, 252, 0, 0},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_GOLEM,\n        .heldItem = ITEM_PETAYA_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_REST, MOVE_SLEEP_TALK, MOVE_SUBSTITUTE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPonyta[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_PONYTA,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_CHARM, MOVE_BODY_SLAM, MOVE_AGILITY, MOVE_PROTECT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterRapidash[] = {\n    {\n        .iv = 2, //ground\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_RAPIDASH,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_HYPNOSIS, MOVE_HIDDEN_POWER, MOVE_CHARM, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterSlowpoke[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_SLOWPOKE,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_BELLY_DRUM, MOVE_REST, MOVE_BODY_SLAM, MOVE_AMNESIA},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterSlowbro[] = {\n    {\n        .iv = 5, //bug\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_SLOWBRO,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_CURSE, MOVE_HIDDEN_POWER, MOVE_THUNDER_WAVE, MOVE_AMNESIA},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMagnemite[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 252, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_MAGNEMITE,\n        .heldItem = ITEM_MAGNET,\n        .abilityNum = 1,\n        .moves = {MOVE_METAL_SOUND, MOVE_RAIN_DANCE, MOVE_THUNDER, MOVE_SWAGGER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMagneton[] = {\n    {\n        .iv = 9, //fire\n        .lvl = 60,\n        .evs = { 4, 0, 0, 252, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_MAGNETON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_METAL_SOUND, MOVE_HIDDEN_POWER, MOVE_THUNDER_WAVE, MOVE_SUBSTITUTE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterFarfetchd[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_FARFETCHD,\n        .heldItem = ITEM_STICK,\n        .abilityNum = 0,\n        .moves = {MOVE_SWORDS_DANCE, MOVE_SLASH, MOVE_KNOCK_OFF, MOVE_FEATHER_DANCE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterDoduo[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 252, 4, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_DODUO,\n        .heldItem = ITEM_LIECHI_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_ENDURE, MOVE_ENDEAVOR, MOVE_QUICK_ATTACK, MOVE_SUBSTITUTE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterDodrio[] = {\n    {\n        .iv = 6, //rock\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_DODRIO,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_REST, MOVE_HIDDEN_POWER, MOVE_TORMENT, MOVE_TOXIC},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterSeel[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_SEEL,\n        .heldItem = ITEM_KINGS_ROCK,\n        .abilityNum = 0,\n        .moves = {MOVE_PERISH_SONG, MOVE_FAKE_OUT, MOVE_HEADBUTT, MOVE_ICICLE_SPEAR},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterDewgong[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_DEWGONG,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_BODY_SLAM, MOVE_FAKE_OUT, MOVE_SHEER_COLD, MOVE_ENCORE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterGrimer[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_GRIMER,\n        .heldItem = ITEM_LUM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_ACID_ARMOR, MOVE_BODY_SLAM, MOVE_SCREECH, MOVE_MINIMIZE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMuk[] = {\n    {\n        .iv = 2, //ground\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_MUK,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CURSE, MOVE_SHADOW_PUNCH, MOVE_HIDDEN_POWER, MOVE_DISABLE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterShellder[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 0, 0, 252},\n        .nature = NATURE_CAREFUL,\n        .species = SPECIES_SHELLDER,\n        .heldItem = ITEM_LUM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SCREECH, MOVE_DOUBLE_EDGE, MOVE_SWAGGER, MOVE_TOXIC},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterCloyster[] = {\n    {\n        .iv = 10, //electric\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_CALM,\n        .species = SPECIES_CLOYSTER,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_PROTECT, MOVE_TORMENT, MOVE_TOXIC, MOVE_HIDDEN_POWER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterGastly[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_GASTLY,\n        .heldItem = ITEM_LUM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_CURSE, MOVE_SWAGGER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterHaunter[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_HAUNTER,\n        .heldItem = ITEM_PETAYA_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SUBSTITUTE, MOVE_PSYCHIC, MOVE_THIEF, MOVE_TAUNT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterGengar[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_GENGAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPNOSIS, MOVE_WILL_O_WISP, MOVE_PSYCHIC, MOVE_DESTINY_BOND},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterOnix[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_ONIX,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_TORMENT, MOVE_SCREECH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterDrowzee[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_DROWZEE,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_BELLY_DRUM, MOVE_RETURN, MOVE_THIEF, MOVE_DISABLE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterHypno[] = {\n    {\n        .iv = 255, //dark\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_HYPNO,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_REFLECT, MOVE_TOXIC, MOVE_HIDDEN_POWER, MOVE_DISABLE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterKrabby[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 152, 0, 100},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_KRABBY,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_SWORDS_DANCE, MOVE_ENDURE, MOVE_FLAIL, MOVE_RETURN},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterKingler[] = {\n    {\n        .iv = 10, //electric\n        .lvl = 60,\n        .evs = { 4, 0, 252, 0, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_KINGLER,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_AMNESIA, MOVE_KNOCK_OFF, MOVE_GUILLOTINE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterVoltorb[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 0, 0, 252},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_VOLTORB,\n        .heldItem = ITEM_HARD_STONE,\n        .abilityNum = 0,\n        .moves = {MOVE_LIGHT_SCREEN, MOVE_ROLLOUT, MOVE_SUBSTITUTE, MOVE_TAUNT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterElectrode[] = {\n    {\n        .iv = 2, //ground\n        .lvl = 60,\n        .evs = { 4, 252, 0, 0, 0, 252},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_ELECTRODE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_SUBSTITUTE, MOVE_LIGHT_SCREEN, MOVE_SWAGGER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterExeggcute[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 0, 0, 252},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_EXEGGCUTE,\n        .heldItem = ITEM_POISON_BARB,\n        .abilityNum = 0,\n        .moves = {MOVE_LIGHT_SCREEN, MOVE_SLEEP_POWDER, MOVE_SLUDGE_BOMB, MOVE_SYNTHESIS},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterExeggutor[] = {\n    {\n        .iv = 9, //fire\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_EXEGGUTOR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SLEEP_POWDER, MOVE_SUBSTITUTE, MOVE_INGRAIN, MOVE_HIDDEN_POWER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterCubone[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_CUBONE,\n        .heldItem = ITEM_THICK_CLUB,\n        .abilityNum = 0,\n        .moves = {MOVE_DOUBLE_EDGE, MOVE_FOCUS_ENERGY, MOVE_SWORDS_DANCE, MOVE_BODY_SLAM},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMarowak[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_MAROWAK,\n        .heldItem = ITEM_THICK_CLUB,\n        .abilityNum = 0,\n        .moves = {MOVE_SWORDS_DANCE, MOVE_BONEMERANG, MOVE_FOCUS_ENERGY, MOVE_SWAGGER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterHitmonlee[] = {\n    {\n        .iv = 3, //flying\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SUBSTITUTE, MOVE_HIDDEN_POWER, MOVE_MACH_PUNCH, MOVE_BULK_UP},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterHitmonchan[] = {\n    {\n        .iv = 3, //flying\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_AGILITY, MOVE_HIDDEN_POWER, MOVE_MACH_PUNCH, MOVE_TOXIC},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterLickitung[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_LICKITUNG,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_BRICK_BREAK, MOVE_CURSE, MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterKoffing[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_KOFFING,\n        .heldItem = ITEM_LUM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYBEAM, MOVE_WILL_O_WISP, MOVE_TORMENT, MOVE_SMOKESCREEN},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterWeezing[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_WEEZING,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYBEAM, MOVE_WILL_O_WISP, MOVE_SUBSTITUTE, MOVE_DESTINY_BOND},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterRhyhorn[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_RHYHORN,\n        .heldItem = ITEM_SOFT_SAND,\n        .abilityNum = 1,\n        .moves = {MOVE_HORN_DRILL, MOVE_MUD_SLAP, MOVE_SWORDS_DANCE, MOVE_EARTHQUAKE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterRhydon[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 100, 0, 252, 152},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_RHYDON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_SURF, MOVE_TOXIC, MOVE_COUNTER, MOVE_RAIN_DANCE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterChansey[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 152, 100, 252, 0, 0, 4},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_CHANSEY,\n        .heldItem = ITEM_LUCKY_PUNCH,\n        .abilityNum = 1,\n        .moves = {MOVE_AROMATHERAPY, MOVE_TOXIC, MOVE_SOFT_BOILED, MOVE_ROCK_SMASH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterTangela[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 252, 4, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_TANGELA,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SLEEP_POWDER, MOVE_INGRAIN, MOVE_SLUDGE_BOMB, MOVE_SWORDS_DANCE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterKangaskhan[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_KANGASKHAN,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_REST, MOVE_BRICK_BREAK, MOVE_FAKE_OUT, MOVE_SUBSTITUTE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterHorsea[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_HORSEA,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_ENDURE, MOVE_FLAIL, MOVE_DRAGON_DANCE, MOVE_RETURN},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterSeadra[] = {\n    {\n        .iv = 10, //electric\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_SEADRA,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_DISABLE, MOVE_SUBSTITUTE, MOVE_DRAGON_BREATH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterGoldeen[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_GOLDEEN,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_TOXIC, MOVE_RETURN, MOVE_ENDURE, MOVE_FLAIL},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterSeaking[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_SEAKING,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HORN_DRILL, MOVE_RETURN, MOVE_SWAGGER, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterStaryu[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_STARYU,\n        .heldItem = ITEM_LUM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_CAMOUFLAGE, MOVE_SURF}, //Camo to Ground type; neutralize enemy T-bolt\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterStarmie[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_STARMIE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_RECOVER, MOVE_SURF, MOVE_COSMIC_POWER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMrMime[] = {\n    {\n        .iv = 5, //bug\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_MR_MIME,\n        .heldItem = ITEM_CHOICE_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_TRICK, MOVE_MEDITATE, MOVE_HIDDEN_POWER, MOVE_BRICK_BREAK},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterScyther[] = {\n    {\n        .iv = 3, //flying\n        .lvl = 60,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_SCYTHER,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_STEEL_WING, MOVE_SWORDS_DANCE, MOVE_QUICK_ATTACK},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterJynx[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 0, 0, 252},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_JYNX,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SHADOW_BALL, MOVE_LOVELY_KISS, MOVE_FAKE_OUT, MOVE_TORMENT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterElectabuzz[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 0, 0, 0, 252},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_ELECTABUZZ,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CROSS_CHOP, MOVE_SCREECH, MOVE_QUICK_ATTACK, MOVE_LIGHT_SCREEN},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMagmar[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 152, 0, 0, 100},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_MAGMAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CROSS_CHOP, MOVE_SCREECH, MOVE_TOXIC, MOVE_CONFUSE_RAY},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPinsir[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_PINSIR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SWORDS_DANCE, MOVE_ROCK_SLIDE, MOVE_HYPER_BEAM, MOVE_FOCUS_ENERGY},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterTauros[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_TAUROS,\n        .heldItem = ITEM_WHITE_HERB,\n        .abilityNum = 0,\n        .moves = {MOVE_RETURN, MOVE_HYPER_BEAM, MOVE_REST, MOVE_SLEEP_TALK},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterMagikarp[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_MAGIKARP,\n        .heldItem = ITEM_FOCUS_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_FLAIL, MOVE_TACKLE, MOVE_SPLASH, MOVE_NONE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterGyarados[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 252, 0, 0, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDER, MOVE_RAIN_DANCE, MOVE_SUBSTITUTE, MOVE_TORMENT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterLapras[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 252, 0, 0, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_LAPRAS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_RAIN_DANCE, MOVE_THUNDER, MOVE_TOXIC, MOVE_SHEER_COLD},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterEevee[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_EEVEE,\n        .heldItem = ITEM_LUM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_CURSE, MOVE_RETURN, MOVE_TICKLE, MOVE_WISH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterVaporeon[] = {\n    {\n        .iv = 10, //electric\n        .lvl = 60,\n        .evs = { 252, 0, 4, 0, 0, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_VAPOREON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ACID_ARMOR, MOVE_HIDDEN_POWER, MOVE_SUBSTITUTE, MOVE_WISH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterJolteon[] = {\n    {\n        .iv = 2, //ground\n        .lvl = 60,\n        .evs = { 4, 252, 0, 0, 0, 252},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_JOLTEON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_QUICK_ATTACK, MOVE_CURSE, MOVE_WISH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterFlareon[] = {\n    {\n        .iv = 2, //ground\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_FLAREON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_CURSE, MOVE_WISH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterPorygon[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 0, 4, 0, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_PORYGON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_CONVERSION, MOVE_RECOVER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterOmanyte[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 252, 4, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_OMANYTE,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_MUD_SHOT, MOVE_TOXIC, MOVE_PROTECT, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterOmastar[] = {\n    {\n        .iv = 7, //grass\n        .lvl = 60,\n        .evs = { 252, 0, 4, 0, 0, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_OMASTAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_TOXIC, MOVE_SWAGGER, MOVE_ICY_WIND},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterKabuto[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 252, 0, 4, 0, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_KABUTO,\n        .heldItem = ITEM_MIRACLE_SEED,\n        .abilityNum = 1,\n        .moves = {MOVE_KNOCK_OFF, MOVE_MEGA_DRAIN, MOVE_METAL_SOUND, MOVE_PROTECT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterKabutops[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 0, 0, 4, 0, 252, 252},\n        .nature = NATURE_CALM,\n        .species = SPECIES_KABUTOPS,\n        .heldItem = ITEM_SHELL_BELL,\n        .abilityNum = 1,\n        .moves = {MOVE_GIGA_DRAIN, MOVE_CONFUSE_RAY, MOVE_KNOCK_OFF, MOVE_ICY_WIND},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterAerodactyl[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_AERODACTYL,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_ROCK_SLIDE, MOVE_TORMENT, MOVE_IRON_TAIL, MOVE_AGILITY},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterSnorlax[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 252, 252, 0, 0, 0},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_SNORLAX,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_YAWN, MOVE_BELLY_DRUM, MOVE_REST, MOVE_BRICK_BREAK},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterDratini[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_CALM,\n        .species = SPECIES_DRATINI,\n        .heldItem = ITEM_PERSIM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_OUTRAGE, MOVE_ICY_WIND, MOVE_REST, MOVE_LIGHT_SCREEN},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterDragonair[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_DRAGONAIR,\n        .heldItem = ITEM_PERSIM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_OUTRAGE, MOVE_AGILITY, MOVE_REST, MOVE_SUBSTITUTE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterDragonite[] = {\n    {\n        .iv = 255,\n        .lvl = 60,\n        .evs = { 4, 0, 0, 0, 252, 252},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_DRAGONITE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, MOVE_TOXIC, MOVE_PROTECT},\n    },\n};"
  },
  {
    "path": "src/data/master_trainers.h",
    "content": "const struct Trainer gMasterTrainers[] = {\n    [TRAINER_NONE] = {\n        .partyFlags = 0,\n        .trainerClass = TRAINER_CLASS_PKMN_TRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_AQUA_LEADER_ARCHIE,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = 0,\n        .partySize = 0,\n        .party = NULL\n    },\n    [MASTER_BULBASAUR] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"RENA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterBulbasaur),\n    },\n    [MASTER_IVYSAUR] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"KATRINA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterIvysaur),\n    },\n    [MASTER_VENUSAUR] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"SAL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterVenusaur),\n    },\n    [MASTER_CHARMANDER] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"TIM\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterCharmander),\n    },\n    [MASTER_CHARMELEON] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"CHRISTOPHER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterCharmeleon),\n    },\n    [MASTER_CHARIZARD] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"EDMUND\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterCharizard),\n    },\n    [MASTER_SQUIRTLE] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_BEAUTY,\n        .trainerName = _(\"SUZY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterSquirtle),\n    },\n    [MASTER_WARTORTLE] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_SWIMMER,\n        .trainerName = _(\"PRITA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterWartortle),\n    },\n    [MASTER_BLASTOISE] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_SWIMMER,\n        .trainerName = _(\"TESSA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterBlastoise),\n    },\n    [MASTER_CATERPIE] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER,\n        .trainerName = _(\"JAKE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterCaterpie),\n    },\n    [MASTER_METAPOD] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER,\n        .trainerName = _(\"BRYSON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMetapod),\n    },\n    [MASTER_BUTTERFREE] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER,\n        .trainerName = _(\"BOBBY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterButterfree),\n    },\n    [MASTER_WEEDLE] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER,\n        .trainerName = _(\"SCOTT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterWeedle),\n    },\n    [MASTER_KAKUNA] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER,\n        .trainerName = _(\"KENNY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterKakuna),\n    },\n    [MASTER_BEEDRILL] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterBeedrill),\n    },\n    [MASTER_PIDGEY] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER,\n        .trainerName = _(\"LOUEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPidgey),\n    },\n    [MASTER_PIDGEOTTO] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER,\n        .trainerName = _(\"HOWIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPidgeotto),\n    },\n    [MASTER_PIDGEOT] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER,\n        .trainerName = _(\"WYATT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPidgeot),\n    },\n    [MASTER_RATTATA] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_YOUNGSTER,\n        .trainerName = _(\"BRET\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterRattata),\n    },\n    [MASTER_RATICATE] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_YOUNGSTER,\n        .trainerName = _(\"DENIS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterRaticate),\n    },\n    [MASTER_SPEAROW] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER,\n        .trainerName = _(\"RALPH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterSpearow),\n    },\n    [MASTER_FEAROW] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER,\n        .trainerName = _(\"THEO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterFearow),\n    },\n    [MASTER_EKANS] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"HERBERT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterEkans),\n    },\n    [MASTER_ARBOK] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"ADAM\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterArbok),\n    },\n    [MASTER_PIKACHU] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"IKUE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPikachu),\n    },\n    [MASTER_RAICHU] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"CHARLOTTE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterRaichu),\n    },\n    [MASTER_SANDSHREW] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"PAUL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterSandshrew),\n    },\n    [MASTER_SANDSLASH] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"BENJAMIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterSandslash),\n    },\n    [MASTER_NIDORAN_F] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"RONNIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterNidoranF),\n    },\n    [MASTER_NIDORINA] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"FRED\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterNidorina),\n    },\n    [MASTER_NIDOQUEEN] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"PERCY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterNidoqueen),\n    },\n    [MASTER_NIDORAN_M] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"ALVIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterNidoranM),\n    },\n    [MASTER_NIDORINO] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"DAVE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterNidorino),\n    },\n    [MASTER_NIDOKING] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"CARLTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterNidoking),\n    },\n    [MASTER_CLEFAIRY] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"CHEL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterClefairy),\n    },\n    [MASTER_CLEFABLE] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"ALEXANDRA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterClefable),\n    },\n    [MASTER_VULPIX] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"FINN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterVulpix),\n    },\n    [MASTER_NINETALES] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"ARNOLD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterNinetales),\n    },\n    [MASTER_JIGGLYPUFF] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"MARGE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterJigglypuff),\n    },\n    [MASTER_WIGGLYTUFF] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"YUMI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterWigglytuff),\n    },\n    [MASTER_ZUBAT] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"WEST\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterZubat),\n    },\n    [MASTER_GOLBAT] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"KEATON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterGolbat),\n    },\n    [MASTER_ODDISH] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"AMY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterOddish),\n    },\n    [MASTER_GLOOM] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"EMMA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterGloom),\n    },\n    [MASTER_VILEPLUME] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"SATOKO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterVileplume),\n    },\n    [MASTER_PARAS] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER,\n        .trainerName = _(\"EVAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterParas),\n    },\n    [MASTER_PARASECT] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER,\n        .trainerName = _(\"HANS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterParasect),\n    },\n    [MASTER_VENONAT] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER,\n        .trainerName = _(\"OLLY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterVenonat),\n    },\n    [MASTER_VENOMOTH] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER,\n        .trainerName = _(\"LAJOS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterVenomoth),\n    },\n    [MASTER_DIGLETT] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"COLIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterDiglett),\n    },\n    [MASTER_DUGTRIO] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"DEXTER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterDugtrio),\n    },\n    [MASTER_MEOWTH] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_YOUNGSTER,\n        .trainerName = _(\"KEN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMeowth),\n    },\n    [MASTER_PERSIAN] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_YOUNGSTER,\n        .trainerName = _(\"SHAWN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPersian),\n    },\n    [MASTER_PSYDUCK] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_SWIMMER,\n        .trainerName = _(\"NICOLE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPsyduck),\n    },\n    [MASTER_GOLDUCK] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_SWIMMER,\n        .trainerName = _(\"CAMILLE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterGolduck),\n    },\n    [MASTER_MANKEY] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT,\n        .trainerName = _(\"TADASHI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMankey),\n    },\n    [MASTER_PRIMEAPE] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT,\n        .trainerName = _(\"KANO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPrimeape),\n    },\n    [MASTER_GROWLITHE] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"AUSTIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterGrowlithe),\n    },\n    [MASTER_ARCANINE] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"SATCH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterArcanine),\n    },\n    [MASTER_POLIWAG] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"VICKY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPoliwag),\n    },\n    [MASTER_POLIWHIRL] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"KIMBERLY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPoliwhirl),\n    },\n    [MASTER_POLIWRATH] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT,\n        .trainerName = _(\"YUEN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPoliwrath),\n    },\n    [MASTER_ABRA] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M,\n        .trainerName = _(\"ANGELO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterAbra),\n    },\n    [MASTER_KADABRA] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M,\n        .trainerName = _(\"JAIME\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterKadabra),\n    },\n    [MASTER_ALAKAZAM] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M,\n        .trainerName = _(\"FRASIER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterAlakazam),\n    },\n    [MASTER_MACHOP] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT,\n        .trainerName = _(\"MASAHIRO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMachop),\n    },\n    [MASTER_MACHOKE] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT,\n        .trainerName = _(\"RYUJI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMachoke),\n    },\n    [MASTER_MACHAMP] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT,\n        .trainerName = _(\"RANDY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMachamp),\n    },\n    [MASTER_BELLSPROUT] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"HANA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterBellsprout),\n    },\n    [MASTER_WEEPINBELL] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"EMILY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterWeepinbell),\n    },\n    [MASTER_VICTREEBEL] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"DIANNE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterVictreebel),\n    },\n    [MASTER_TENTACOOL] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"FRANCIS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterTentacool),\n    },\n    [MASTER_TENTACRUEL] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"MELVIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterTentacruel),\n    },\n    [MASTER_GEODUDE] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"IRWIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterGeodude),\n    },\n    [MASTER_GRAVELER] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"DILLAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterGraveler),\n    },\n    [MASTER_GOLEM] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"VALENTINO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterGolem),\n    },\n    [MASTER_PONYTA] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"GARRET\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPonyta),\n    },\n    [MASTER_RAPIDASH] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"RAYMOND\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterRapidash),\n    },\n    [MASTER_SLOWPOKE] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_BEAUTY,\n        .trainerName = _(\"JILL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterSlowpoke),\n    },\n    [MASTER_SLOWBRO] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_BEAUTY,\n        .trainerName = _(\"HARUKA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterSlowbro),\n    },\n    [MASTER_MAGNEMITE] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"MURRAY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMagnemite),\n    },\n    [MASTER_MAGNETON] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"JULIAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMagneton),\n    },\n    [MASTER_FARFETCHD] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER,\n        .trainerName = _(\"MOE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterFarfetchd),\n    },\n    [MASTER_DODUO] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER,\n        .trainerName = _(\"BARNEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterDoduo),\n    },\n    [MASTER_DODRIO] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_BIRD_KEEPER,\n        .trainerName = _(\"SEYMOUR\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterDodrio),\n    },\n    [MASTER_SEEL] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_BEAUTY,\n        .trainerName = _(\"AINA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterSeel),\n    },\n    [MASTER_DEWGONG] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_BEAUTY,\n        .trainerName = _(\"LOIS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterDewgong),\n    },\n    [MASTER_GRIMER] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"CORY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterGrimer),\n    },\n    [MASTER_MUK] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"GORDON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMuk),\n    },\n    [MASTER_SHELLDER] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_SWIMMER,\n        .trainerName = _(\"SHELLY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterShellder),\n    },\n    [MASTER_CLOYSTER] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_SWIMMER,\n        .trainerName = _(\"ROSE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterCloyster),\n    },\n    [MASTER_GASTLY] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M,\n        .trainerName = _(\"ARIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterGastly),\n    },\n    [MASTER_HAUNTER] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M,\n        .trainerName = _(\"DANNY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterHaunter),\n    },\n    [MASTER_GENGAR] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M,\n        .trainerName = _(\"ROSS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterGengar),\n    },\n    [MASTER_ONIX] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"JIM\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterOnix),\n    },\n    [MASTER_DROWZEE] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M,\n        .trainerName = _(\"ANTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterDrowzee),\n    },\n    [MASTER_HYPNO] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M,\n        .trainerName = _(\"VLAD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterHypno),\n    },\n    [MASTER_KRABBY] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"CARL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterKrabby),\n    },\n    [MASTER_KINGLER] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"LEOPOLD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterKingler),\n    },\n    [MASTER_VOLTORB] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"HUMPHREY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterVoltorb),\n    },\n    [MASTER_ELECTRODE] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"ELTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterElectrode),\n    },\n    [MASTER_EXEGGCUTE] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"SUMMER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterExeggcute),\n    },\n    [MASTER_EXEGGUTOR] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"CINDY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterExeggutor),\n    },\n    [MASTER_CUBONE] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"RICHTER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterCubone),\n    },\n    [MASTER_MAROWAK] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"JULIUS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMarowak),\n    },\n    [MASTER_HITMONLEE] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT,\n        .trainerName = _(\"CHENG\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterHitmonlee),\n    },\n    [MASTER_HITMONCHAN] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_BLACK_BELT,\n        .trainerName = _(\"WONG\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterHitmonchan),\n    },\n    [MASTER_LICKITUNG] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_YOUNGSTER,\n        .trainerName = _(\"CID\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterLickitung),\n    },\n    [MASTER_KOFFING] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"ALBERT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterKoffing),\n    },\n    [MASTER_WEEZING] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"DONNIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterWeezing),\n    },\n    [MASTER_RHYHORN] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"FARKAS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterRhyhorn),\n    },\n    [MASTER_RHYDON] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"EUGGINE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterRhydon),\n    },\n    [MASTER_CHANSEY] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"MIZUKI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterChansey),\n    },\n    [MASTER_TANGELA] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"HARLEEN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterTangela),\n    },\n    [MASTER_KANGASKHAN] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"MAC\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterKangaskhan),\n    },\n    [MASTER_HORSEA] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_SWIMMER,\n        .trainerName = _(\"BEVERLY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterHorsea),\n    },\n    [MASTER_SEADRA] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_SWIMMER,\n        .trainerName = _(\"LUCY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterSeadra),\n    },\n    [MASTER_GOLDEEN] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_SWIMMER,\n        .trainerName = _(\"EVETTE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterGoldeen),\n    },\n    [MASTER_SEAKING] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_SWIMMER,\n        .trainerName = _(\"ARIANNA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterSeaking),\n    },\n    [MASTER_STARYU] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_BEAUTY,\n        .trainerName = _(\"JO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterStaryu),\n    },\n    [MASTER_STARMIE] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M,\n        .trainerName = _(\"HARRISON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterStarmie),\n    },\n    [MASTER_MR_MIME] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M,\n        .trainerName = _(\"RUI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMrMime),\n    },\n    [MASTER_SCYTHER] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER,\n        .trainerName = _(\"LOUIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterScyther),\n    },\n    [MASTER_JYNX] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_MASTER_PSYCHIC_M,\n        .trainerName = _(\"AVERY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterJynx),\n    },\n    [MASTER_ELECTABUZZ] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"LEVI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterElectabuzz),\n    },\n    [MASTER_MAGMAR] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"JACE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMagmar),\n    },\n    [MASTER_PINSIR] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_BUG_CATCHER,\n        .trainerName = _(\"RYOUTA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPinsir),\n    },\n    [MASTER_TAUROS] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"JAXSON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterTauros),\n    },\n    [MASTER_MAGIKARP] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_MASTER_YOUNGSTER,\n        .trainerName = _(\"EASTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterMagikarp),\n    },\n    [MASTER_GYARADOS] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"DOMINIC\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterGyarados),\n    },\n    [MASTER_LAPRAS] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"HAZEL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterLapras),\n    },\n    //DITTO\n    [MASTER_EEVEE] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"AOI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterEevee),\n    },\n    [MASTER_VAPOREON] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_MASTER_LASS,\n        .trainerName = _(\"YUE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterVaporeon),\n    },\n    [MASTER_JOLTEON] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"ALPHONSE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterJolteon),\n    },\n    [MASTER_FLAREON] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"DAX\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterFlareon),\n    },\n    [MASTER_PORYGON] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_MASTER_SCIENTIST,\n        .trainerName = _(\"JORDAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterPorygon),\n    },\n    [MASTER_OMANYTE] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"COLSON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterOmanyte),\n    },\n    [MASTER_OMASTAR] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"LIONEL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterOmastar),\n    },\n    [MASTER_KABUTO] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"BARNABY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterKabuto),\n    },\n    [MASTER_KABUTOPS] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"KENJI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterKabutops),\n    },\n    [MASTER_AERODACTYL] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_MASTER_HIKER,\n        .trainerName = _(\"HISATO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterAerodactyl),\n    },\n    [MASTER_SNORLAX] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"JAY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterSnorlax),\n    },\n    //ARTICUNO\n    //ZAPDOS\n    //MOLTRES\n    [MASTER_DRATINI] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"JIRARD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterDratini),\n    },\n    [MASTER_DRAGONAIR] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"ARJUN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterDragonair),\n    },\n    [MASTER_DRAGONITE] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_MASTER_COOLTRAINER_M,\n        .trainerName = _(\"GRAYSON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterDragonite),\n    },\n    //MEWTWO\n    //MEW\n};"
  },
  {
    "path": "src/data/object_events/base_oam.h",
    "content": "const struct OamData gObjectEventBaseOam_8x8 = {\n    .shape = SPRITE_SHAPE(8x8),\n    .size = SPRITE_SIZE(8x8),\n    .priority = 2\n};\n\nconst struct OamData gObjectEventBaseOam_16x8 = {\n    .shape = SPRITE_SHAPE(16x8),\n    .size = SPRITE_SIZE(16x8),\n    .priority = 2\n};\n\nconst struct OamData gObjectEventBaseOam_16x16 = {\n    .shape = SPRITE_SHAPE(16x16),\n    .size = SPRITE_SIZE(16x16),\n    .priority = 2\n};\n\nconst struct OamData gObjectEventBaseOam_32x16 = {\n    .shape = SPRITE_SHAPE(32x16),\n    .size = SPRITE_SIZE(32x16),\n    .priority = 2\n};\n\nconst struct OamData gObjectEventBaseOam_32x8 = {\n    .shape = SPRITE_SHAPE(32x8),\n    .size = SPRITE_SIZE(32x8),\n    .priority = 2\n};\n\nconst struct OamData gObjectEventBaseOam_64x32 = {\n    .shape = SPRITE_SHAPE(64x32),\n    .size = SPRITE_SIZE(64x32),\n    .priority = 2\n};\n\nconst struct OamData gObjectEventBaseOam_16x32 = {\n    .shape = SPRITE_SHAPE(16x32),\n    .size = SPRITE_SIZE(16x32),\n    .priority = 2\n};\n\nconst struct OamData gObjectEventBaseOam_32x32 = {\n    .shape = SPRITE_SHAPE(32x32),\n    .size = SPRITE_SIZE(32x32),\n    .priority = 2\n};\n\nconst struct OamData gObjectEventBaseOam_64x64 = {\n    .shape = SPRITE_SHAPE(64x64),\n    .size = SPRITE_SIZE(64x64),\n    .priority = 2\n};\n"
  },
  {
    "path": "src/data/object_events/movement_action_func_tables.h",
    "content": "static bool8 MovementAction_FaceDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FaceUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FaceLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FaceRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_PauseSpriteAnim(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FaceDownFast_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FaceUpFast_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FaceLeftFast_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FaceRightFast_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowerDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowerDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowerUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowerUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowerLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowerLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowerRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowerRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkNormalDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkNormalDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkNormalUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkNormalUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkNormalLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkNormalLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkNormalRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkNormalRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceSlowDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceSlowUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceSlowLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceSlowRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceSlow_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceNormalDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceNormalUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceNormalLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceNormalRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlace_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceFastDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceFastUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceFastLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceFastRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceFasterDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceFasterUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceFasterLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkInPlaceFasterRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Jump2Down_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Jump2Down_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Jump2Up_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Jump2Up_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Jump2Left_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Jump2Left_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Jump2Right_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Jump2Right_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Delay1_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Delay2_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Delay4_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Delay8_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Delay16_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Delay_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFastDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFastDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFastUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFastUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFastLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFastLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFastRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFastRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RideWaterCurrentDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RideWaterCurrentDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RideWaterCurrentUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RideWaterCurrentUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RideWaterCurrentLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RideWaterCurrentLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RideWaterCurrentRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RideWaterCurrentRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFasterDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFasterDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFasterUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFasterUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFasterLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFasterLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFasterRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkFasterRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SlideDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SlideDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SlideUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SlideUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SlideLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SlideLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SlideRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SlideRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_PlayerRunDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_PlayerRunDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_PlayerRunUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_PlayerRunUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_PlayerRunLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_PlayerRunLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_PlayerRunRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_PlayerRunRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RunDownSlow_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RunDownSlow_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RunUpSlow_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RunUpSlow_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RunLeftSlow_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RunLeftSlow_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RunRightSlow_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RunRightSlow_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_StartAnimInDirection_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FacePlayer_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FaceAwayPlayer_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_LockFacingDirection_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_UnlockFacingDirection_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceDownUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceDownUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceUpDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceUpDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceLeftRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceLeftRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceRightLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpInPlaceRightLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FaceOriginalDirection_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_NurseJoyBowDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_EnableJumpLandingGroundEffect_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_DisableJumpLandingGroundEffect_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_DisableAnimation_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RestoreAnimation_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SetInvisible_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SetVisible_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_EmoteExclamationMark_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_EmoteQuestionMark_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_EmoteX_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_EmoteDoubleExclamationMark_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_EmoteSmile_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RevealTrainer_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RevealTrainer_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RockSmashBreak_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RockSmashBreak_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RockSmashBreak_Step2(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_CutTree_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_CutTree_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_CutTree_Step2(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SetFixedPriority_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_ClearFixedPriority_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_InitAffineAnim_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_ClearAffineAnim_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkDownStartAffine_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkDownStartAffine_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkDownAffine_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkDownAffine_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieFaceDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieFaceUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieFaceLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieFaceRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroEndWheelieFaceDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroEndWheelieFaceUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroEndWheelieFaceLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroEndWheelieFaceRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_UnusedAcroActionDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_UnusedAcroActionUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_UnusedAcroActionLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_UnusedAcroActionRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopFaceDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopFaceDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopFaceUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopFaceUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopFaceLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopFaceRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopFaceRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieHopRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieJumpDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieJumpDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieJumpUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieJumpUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieJumpLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieJumpRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieJumpRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieInPlaceDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieInPlaceUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieInPlaceLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieInPlaceRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieMoveDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieMoveDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieMoveUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieMoveUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieMoveLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieMoveRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroPopWheelieMoveRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieMoveDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieMoveDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieMoveUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieMoveUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieMoveLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieMoveLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieMoveRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_AcroWheelieMoveRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SpinDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SpinDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SpinUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SpinUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SpinLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SpinLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SpinRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_SpinRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RaiseHand_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RaiseHandAndStop_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RaiseHandAndJump_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_RaiseHandAndSwim_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowestDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowestDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowestUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowestUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowestLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowestLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowestRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WalkSlowestRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_ShakeHeadOrWalkInPlace_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_ShakeHeadOrWalkInPlace_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_GlideDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_GlideDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_GlideUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_GlideUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_GlideLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_GlideLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_GlideRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_GlideRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FlyUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FlyUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FlyUp_Step2(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FlyDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_FlyDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialWithEffectDown_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialWithEffectDown_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialWithEffectUp_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialWithEffectUp_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialWithEffectLeft_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialWithEffectLeft_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialWithEffectRight_Step0(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_JumpSpecialWithEffectRight_Step1(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_WaitSpriteAnim(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementAction_Finish(struct ObjectEvent *, struct Sprite *);\n\nstatic bool8 (*const sMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_FaceUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_FaceLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_FaceRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_FaceDownFast[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_FaceUpFast[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_FaceLeftFast[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_FaceRightFast[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkSlowerDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkSlowerUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkSlowerLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkSlowerRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkSlowUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkSlowDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkSlowLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkSlowRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkNormalDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkNormalUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkNormalLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkNormalRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_Jump2Down[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_Jump2Up[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_Jump2Left[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_Jump2Right[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_Delay1[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_Delay2[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_Delay4[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_Delay8[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_Delay16[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkFastDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkFastUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkFastLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkFastRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceSlowDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceSlowUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceSlowLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceSlowRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceNormalDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceNormalUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceNormalLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceNormalRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFastDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFastUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFastLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFastRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFasterDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFasterUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFasterLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFasterRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_RideWaterCurrentDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_RideWaterCurrentUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_RideWaterCurrentLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_RideWaterCurrentRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkFasterDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkFasterUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkFasterLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkFasterRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_SlideDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_SlideUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_SlideLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_SlideRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_PlayerRunDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_PlayerRunUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_PlayerRunLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_PlayerRunRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_PlayerRunDownSlow[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_PlayerRunUpSlow[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_PlayerRunLeftSlow[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_PlayerRunRightSlow[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_StartAnimInDirection[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_FacePlayer[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_FaceAwayPlayer[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_LockFacingDirection[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_UnlockFacingDirection[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceDownUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceUpDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceLeftRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceRightLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_FaceOriginalDirection[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_NurseJoyBowDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_EnableJumpLandingGroundEffect[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_DisableJumpLandingGroundEffect[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_DisableAnimation[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_RestoreAnimation[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_SetInvisible[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_SetVisible[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_EmoteExclamationMark[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_EmoteQuestionMark[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_EmoteX[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_EmoteDoubleExclMark[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_EmoteSmile[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_RevealTrainer[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_RockSmashBreak[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_CutTree[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_SetFixedPriority[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_ClearFixedPriority[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_InitAffineAnim[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_ClearAffineAnim[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkDownStartAffine[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkDownAffine[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieFaceDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieFaceUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieFaceLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieFaceRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieJumpDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieJumpUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieJumpLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieJumpRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieMoveDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieMoveUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieMoveLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieMoveRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_SpinDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_SpinUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_SpinLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_SpinRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_RaiseHandAndStop[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_RaiseHandAndJump[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_RaiseHandAndSwim[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkSlowestDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkSlowestUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkSlowestLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_WalkSlowestRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_ShakeHeadOrWalkInPlace[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_GlideDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_GlideUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_GlideLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_GlideRight[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_FlyUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_FlyDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectDown[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectUp[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectLeft[])(struct ObjectEvent *, struct Sprite *);\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectRight[])(struct ObjectEvent *, struct Sprite *);\n\nstatic u8 GetMoveDirectionFastAnimNum(u8 direction);\nstatic u8 GetMoveDirectionFasterAnimNum(u8 direction);\nstatic u8 GetMoveDirectionFastestAnimNum(u8 direction);\n\nstatic bool8 (*const *const sMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) = {\n    [MOVEMENT_ACTION_FACE_DOWN]                          = sMovementActionFuncs_FaceDown,\n    [MOVEMENT_ACTION_FACE_UP]                            = sMovementActionFuncs_FaceUp,\n    [MOVEMENT_ACTION_FACE_LEFT]                          = sMovementActionFuncs_FaceLeft,\n    [MOVEMENT_ACTION_FACE_RIGHT]                         = sMovementActionFuncs_FaceRight,\n    [MOVEMENT_ACTION_FACE_DOWN_FAST]                     = sMovementActionFuncs_FaceDownFast,\n    [MOVEMENT_ACTION_FACE_UP_FAST]                       = sMovementActionFuncs_FaceUpFast,\n    [MOVEMENT_ACTION_FACE_LEFT_FAST]                     = sMovementActionFuncs_FaceLeftFast,\n    [MOVEMENT_ACTION_FACE_RIGHT_FAST]                    = sMovementActionFuncs_FaceRightFast,\n    [MOVEMENT_ACTION_WALK_SLOWER_DOWN]                   = sMovementActionFuncs_WalkSlowerDown,\n    [MOVEMENT_ACTION_WALK_SLOWER_UP]                     = sMovementActionFuncs_WalkSlowerUp,\n    [MOVEMENT_ACTION_WALK_SLOWER_LEFT]                   = sMovementActionFuncs_WalkSlowerLeft,\n    [MOVEMENT_ACTION_WALK_SLOWER_RIGHT]                  = sMovementActionFuncs_WalkSlowerRight,\n    [MOVEMENT_ACTION_WALK_SLOW_DOWN]                     = sMovementActionFuncs_WalkSlowDown,\n    [MOVEMENT_ACTION_WALK_SLOW_UP]                       = sMovementActionFuncs_WalkSlowUp,\n    [MOVEMENT_ACTION_WALK_SLOW_LEFT]                     = sMovementActionFuncs_WalkSlowLeft,\n    [MOVEMENT_ACTION_WALK_SLOW_RIGHT]                    = sMovementActionFuncs_WalkSlowRight,\n    [MOVEMENT_ACTION_WALK_NORMAL_DOWN]                   = sMovementActionFuncs_WalkNormalDown,\n    [MOVEMENT_ACTION_WALK_NORMAL_UP]                     = sMovementActionFuncs_WalkNormalUp,\n    [MOVEMENT_ACTION_WALK_NORMAL_LEFT]                   = sMovementActionFuncs_WalkNormalLeft,\n    [MOVEMENT_ACTION_WALK_NORMAL_RIGHT]                  = sMovementActionFuncs_WalkNormalRight,\n    [MOVEMENT_ACTION_JUMP_2_DOWN]                        = sMovementActionFuncs_Jump2Down,\n    [MOVEMENT_ACTION_JUMP_2_UP]                          = sMovementActionFuncs_Jump2Up,\n    [MOVEMENT_ACTION_JUMP_2_LEFT]                        = sMovementActionFuncs_Jump2Left,\n    [MOVEMENT_ACTION_JUMP_2_RIGHT]                       = sMovementActionFuncs_Jump2Right,\n    [MOVEMENT_ACTION_DELAY_1]                            = sMovementActionFuncs_Delay1,\n    [MOVEMENT_ACTION_DELAY_2]                            = sMovementActionFuncs_Delay2,\n    [MOVEMENT_ACTION_DELAY_4]                            = sMovementActionFuncs_Delay4,\n    [MOVEMENT_ACTION_DELAY_8]                            = sMovementActionFuncs_Delay8,\n    [MOVEMENT_ACTION_DELAY_16]                           = sMovementActionFuncs_Delay16,\n    [MOVEMENT_ACTION_WALK_FAST_DOWN]                     = sMovementActionFuncs_WalkFastDown,\n    [MOVEMENT_ACTION_WALK_FAST_UP]                       = sMovementActionFuncs_WalkFastUp,\n    [MOVEMENT_ACTION_WALK_FAST_LEFT]                     = sMovementActionFuncs_WalkFastLeft,\n    [MOVEMENT_ACTION_WALK_FAST_RIGHT]                    = sMovementActionFuncs_WalkFastRight,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN]            = sMovementActionFuncs_WalkInPlaceSlowDown,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP]              = sMovementActionFuncs_WalkInPlaceSlowUp,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT]            = sMovementActionFuncs_WalkInPlaceSlowLeft,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT]           = sMovementActionFuncs_WalkInPlaceSlowRight,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN]          = sMovementActionFuncs_WalkInPlaceNormalDown,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP]            = sMovementActionFuncs_WalkInPlaceNormalUp,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT]          = sMovementActionFuncs_WalkInPlaceNormalLeft,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT]         = sMovementActionFuncs_WalkInPlaceNormalRight,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN]            = sMovementActionFuncs_WalkInPlaceFastDown,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP]              = sMovementActionFuncs_WalkInPlaceFastUp,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT]            = sMovementActionFuncs_WalkInPlaceFastLeft,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT]           = sMovementActionFuncs_WalkInPlaceFastRight,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN]          = sMovementActionFuncs_WalkInPlaceFasterDown,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_UP]            = sMovementActionFuncs_WalkInPlaceFasterUp,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT]          = sMovementActionFuncs_WalkInPlaceFasterLeft,\n    [MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT]         = sMovementActionFuncs_WalkInPlaceFasterRight,\n    [MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN]            = sMovementActionFuncs_RideWaterCurrentDown,\n    [MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP]              = sMovementActionFuncs_RideWaterCurrentUp,\n    [MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT]            = sMovementActionFuncs_RideWaterCurrentLeft,\n    [MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT]           = sMovementActionFuncs_RideWaterCurrentRight,\n    [MOVEMENT_ACTION_WALK_FASTER_DOWN]                   = sMovementActionFuncs_WalkFasterDown,\n    [MOVEMENT_ACTION_WALK_FASTER_UP]                     = sMovementActionFuncs_WalkFasterUp,\n    [MOVEMENT_ACTION_WALK_FASTER_LEFT]                   = sMovementActionFuncs_WalkFasterLeft,\n    [MOVEMENT_ACTION_WALK_FASTER_RIGHT]                  = sMovementActionFuncs_WalkFasterRight,\n    [MOVEMENT_ACTION_SLIDE_DOWN]                         = sMovementActionFuncs_SlideDown,\n    [MOVEMENT_ACTION_SLIDE_UP]                           = sMovementActionFuncs_SlideUp,\n    [MOVEMENT_ACTION_SLIDE_LEFT]                         = sMovementActionFuncs_SlideLeft,\n    [MOVEMENT_ACTION_SLIDE_RIGHT]                        = sMovementActionFuncs_SlideRight,\n    [MOVEMENT_ACTION_PLAYER_RUN_DOWN]                    = sMovementActionFuncs_PlayerRunDown,\n    [MOVEMENT_ACTION_PLAYER_RUN_UP]                      = sMovementActionFuncs_PlayerRunUp,\n    [MOVEMENT_ACTION_PLAYER_RUN_LEFT]                    = sMovementActionFuncs_PlayerRunLeft,\n    [MOVEMENT_ACTION_PLAYER_RUN_RIGHT]                   = sMovementActionFuncs_PlayerRunRight,\n    [MOVEMENT_ACTION_PLAYER_RUN_DOWN_SLOW]               = sMovementActionFuncs_PlayerRunDownSlow,\n    [MOVEMENT_ACTION_PLAYER_RUN_UP_SLOW]                 = sMovementActionFuncs_PlayerRunUpSlow,\n    [MOVEMENT_ACTION_PLAYER_RUN_LEFT_SLOW]               = sMovementActionFuncs_PlayerRunLeftSlow,\n    [MOVEMENT_ACTION_PLAYER_RUN_RIGHT_SLOW]              = sMovementActionFuncs_PlayerRunRightSlow,\n    [MOVEMENT_ACTION_START_ANIM_IN_DIRECTION]            = sMovementActionFuncs_StartAnimInDirection,\n    [MOVEMENT_ACTION_JUMP_SPECIAL_DOWN]                  = sMovementActionFuncs_JumpSpecialDown,\n    [MOVEMENT_ACTION_JUMP_SPECIAL_UP]                    = sMovementActionFuncs_JumpSpecialUp,\n    [MOVEMENT_ACTION_JUMP_SPECIAL_LEFT]                  = sMovementActionFuncs_JumpSpecialLeft,\n    [MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT]                 = sMovementActionFuncs_JumpSpecialRight,\n    [MOVEMENT_ACTION_FACE_PLAYER]                        = sMovementActionFuncs_FacePlayer,\n    [MOVEMENT_ACTION_FACE_AWAY_PLAYER]                   = sMovementActionFuncs_FaceAwayPlayer,\n    [MOVEMENT_ACTION_LOCK_FACING_DIRECTION]              = sMovementActionFuncs_LockFacingDirection,\n    [MOVEMENT_ACTION_UNLOCK_FACING_DIRECTION]            = sMovementActionFuncs_UnlockFacingDirection,\n    [MOVEMENT_ACTION_JUMP_DOWN]                          = sMovementActionFuncs_JumpDown,\n    [MOVEMENT_ACTION_JUMP_UP]                            = sMovementActionFuncs_JumpUp,\n    [MOVEMENT_ACTION_JUMP_LEFT]                          = sMovementActionFuncs_JumpLeft,\n    [MOVEMENT_ACTION_JUMP_RIGHT]                         = sMovementActionFuncs_JumpRight,\n    [MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN]                 = sMovementActionFuncs_JumpInPlaceDown,\n    [MOVEMENT_ACTION_JUMP_IN_PLACE_UP]                   = sMovementActionFuncs_JumpInPlaceUp,\n    [MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT]                 = sMovementActionFuncs_JumpInPlaceLeft,\n    [MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT]                = sMovementActionFuncs_JumpInPlaceRight,\n    [MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP]              = sMovementActionFuncs_JumpInPlaceDownUp,\n    [MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN]              = sMovementActionFuncs_JumpInPlaceUpDown,\n    [MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT]           = sMovementActionFuncs_JumpInPlaceLeftRight,\n    [MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT]           = sMovementActionFuncs_JumpInPlaceRightLeft,\n    [MOVEMENT_ACTION_FACE_ORIGINAL_DIRECTION]            = sMovementActionFuncs_FaceOriginalDirection,\n    [MOVEMENT_ACTION_NURSE_JOY_BOW_DOWN]                 = sMovementActionFuncs_NurseJoyBowDown,\n    [MOVEMENT_ACTION_ENABLE_JUMP_LANDING_GROUND_EFFECT]  = sMovementActionFuncs_EnableJumpLandingGroundEffect,\n    [MOVEMENT_ACTION_DISABLE_JUMP_LANDING_GROUND_EFFECT] = sMovementActionFuncs_DisableJumpLandingGroundEffect,\n    [MOVEMENT_ACTION_DISABLE_ANIMATION]                  = sMovementActionFuncs_DisableAnimation,\n    [MOVEMENT_ACTION_RESTORE_ANIMATION]                  = sMovementActionFuncs_RestoreAnimation,\n    [MOVEMENT_ACTION_SET_INVISIBLE]                      = sMovementActionFuncs_SetInvisible,\n    [MOVEMENT_ACTION_SET_VISIBLE]                        = sMovementActionFuncs_SetVisible,\n    [MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK]             = sMovementActionFuncs_EmoteExclamationMark,\n    [MOVEMENT_ACTION_EMOTE_QUESTION_MARK]                = sMovementActionFuncs_EmoteQuestionMark,\n    [MOVEMENT_ACTION_EMOTE_X]                            = sMovementActionFuncs_EmoteX,\n    [MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK]             = sMovementActionFuncs_EmoteDoubleExclMark,\n    [MOVEMENT_ACTION_EMOTE_SMILE]                        = sMovementActionFuncs_EmoteSmile,\n    [MOVEMENT_ACTION_REVEAL_TRAINER]                     = sMovementActionFuncs_RevealTrainer,\n    [MOVEMENT_ACTION_ROCK_SMASH_BREAK]                   = sMovementActionFuncs_RockSmashBreak,\n    [MOVEMENT_ACTION_CUT_TREE]                           = sMovementActionFuncs_CutTree,\n    [MOVEMENT_ACTION_SET_FIXED_PRIORITY]                 = sMovementActionFuncs_SetFixedPriority,\n    [MOVEMENT_ACTION_CLEAR_FIXED_PRIORITY]               = sMovementActionFuncs_ClearFixedPriority,\n    [MOVEMENT_ACTION_INIT_AFFINE_ANIM]                   = sMovementActionFuncs_InitAffineAnim,\n    [MOVEMENT_ACTION_CLEAR_AFFINE_ANIM]                  = sMovementActionFuncs_ClearAffineAnim,\n    [MOVEMENT_ACTION_WALK_DOWN_START_AFFINE]             = sMovementActionFuncs_WalkDownStartAffine,\n    [MOVEMENT_ACTION_WALK_DOWN_AFFINE]                   = sMovementActionFuncs_WalkDownAffine,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN]             = sMovementActionFuncs_AcroWheelieFaceDown,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP]               = sMovementActionFuncs_AcroWheelieFaceUp,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT]             = sMovementActionFuncs_AcroWheelieFaceLeft,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT]            = sMovementActionFuncs_AcroWheelieFaceRight,\n    [MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN]              = sMovementActionFuncs_AcroPopWheelieDown,\n    [MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP]                = sMovementActionFuncs_AcroPopWheelieUp,\n    [MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT]              = sMovementActionFuncs_AcroPopWheelieLeft,\n    [MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT]             = sMovementActionFuncs_AcroPopWheelieRight,\n    [MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN]         = sMovementActionFuncs_AcroEndWheelieFaceDown,\n    [MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP]           = sMovementActionFuncs_AcroEndWheelieFaceUp,\n    [MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT]         = sMovementActionFuncs_AcroEndWheelieFaceLeft,\n    [MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT]        = sMovementActionFuncs_AcroEndWheelieFaceRight,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN]         = sMovementActionFuncs_AcroWheelieHopFaceDown,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP]           = sMovementActionFuncs_AcroWheelieHopFaceUp,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT]         = sMovementActionFuncs_AcroWheelieHopFaceLeft,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT]        = sMovementActionFuncs_AcroWheelieHopFaceRight,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN]              = sMovementActionFuncs_AcroWheelieHopDown,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP]                = sMovementActionFuncs_AcroWheelieHopUp,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT]              = sMovementActionFuncs_AcroWheelieHopLeft,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT]             = sMovementActionFuncs_AcroWheelieHopRight,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN]             = sMovementActionFuncs_AcroWheelieJumpDown,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP]               = sMovementActionFuncs_AcroWheelieJumpUp,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT]             = sMovementActionFuncs_AcroWheelieJumpLeft,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT]            = sMovementActionFuncs_AcroWheelieJumpRight,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN]         = sMovementActionFuncs_AcroWheelieInPlaceDown,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP]           = sMovementActionFuncs_AcroWheelieInPlaceUp,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT]         = sMovementActionFuncs_AcroWheelieInPlaceLeft,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT]        = sMovementActionFuncs_AcroWheelieInPlaceRight,\n    [MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN]         = sMovementActionFuncs_AcroPopWheelieMoveDown,\n    [MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP]           = sMovementActionFuncs_AcroPopWheelieMoveUp,\n    [MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT]         = sMovementActionFuncs_AcroPopWheelieMoveLeft,\n    [MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT]        = sMovementActionFuncs_AcroPopWheelieMoveRight,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN]             = sMovementActionFuncs_AcroWheelieMoveDown,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP]               = sMovementActionFuncs_AcroWheelieMoveUp,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT]             = sMovementActionFuncs_AcroWheelieMoveLeft,\n    [MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT]            = sMovementActionFuncs_AcroWheelieMoveRight,\n    [MOVEMENT_ACTION_SPIN_DOWN]                          = sMovementActionFuncs_SpinDown,\n    [MOVEMENT_ACTION_SPIN_UP]                            = sMovementActionFuncs_SpinUp,\n    [MOVEMENT_ACTION_SPIN_LEFT]                          = sMovementActionFuncs_SpinLeft,\n    [MOVEMENT_ACTION_SPIN_RIGHT]                         = sMovementActionFuncs_SpinRight,\n    [MOVEMENT_ACTION_RAISE_HAND_AND_STOP]                = sMovementActionFuncs_RaiseHandAndStop,\n    [MOVEMENT_ACTION_RAISE_HAND_AND_JUMP]                = sMovementActionFuncs_RaiseHandAndJump,\n    [MOVEMENT_ACTION_RAISE_HAND_AND_SWIM]                = sMovementActionFuncs_RaiseHandAndSwim,\n    [MOVEMENT_ACTION_WALK_SLOWEST_DOWN]                  = sMovementActionFuncs_WalkSlowestDown,\n    [MOVEMENT_ACTION_WALK_SLOWEST_UP]                    = sMovementActionFuncs_WalkSlowestUp,\n    [MOVEMENT_ACTION_WALK_SLOWEST_LEFT]                  = sMovementActionFuncs_WalkSlowestLeft,\n    [MOVEMENT_ACTION_WALK_SLOWEST_RIGHT]                 = sMovementActionFuncs_WalkSlowestRight,\n    [MOVEMENT_ACTION_SHAKE_HEAD_OR_WALK_IN_PLACE]        = sMovementActionFuncs_ShakeHeadOrWalkInPlace,\n    [MOVEMENT_ACTION_GLIDE_DOWN]                         = sMovementActionFuncs_GlideDown,\n    [MOVEMENT_ACTION_GLIDE_UP]                           = sMovementActionFuncs_GlideUp,\n    [MOVEMENT_ACTION_GLIDE_LEFT]                         = sMovementActionFuncs_GlideLeft,\n    [MOVEMENT_ACTION_GLIDE_RIGHT]                        = sMovementActionFuncs_GlideRight,\n    [MOVEMENT_ACTION_FLY_UP]                             = sMovementActionFuncs_FlyUp,\n    [MOVEMENT_ACTION_FLY_DOWN]                           = sMovementActionFuncs_FlyDown,\n    [MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_DOWN]      = sMovementActionFuncs_JumpSpecialWithEffectDown,\n    [MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_UP]        = sMovementActionFuncs_JumpSpecialWithEffectUp,\n    [MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_LEFT]      = sMovementActionFuncs_JumpSpecialWithEffectLeft,\n    [MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_RIGHT]     = sMovementActionFuncs_JumpSpecialWithEffectRight,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FaceDown_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FaceUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FaceUp_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FaceLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FaceLeft_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FaceRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FaceRight_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sDirectionAnimFuncsBySpeed[])(u8) = {\n    [MOVE_SPEED_NORMAL] = GetMoveDirectionAnimNum,\n    [MOVE_SPEED_FAST_1] = GetMoveDirectionFastAnimNum,\n    [MOVE_SPEED_FAST_2] = GetMoveDirectionFastAnimNum,\n    [MOVE_SPEED_FASTER] = GetMoveDirectionFasterAnimNum,\n    [MOVE_SPEED_FASTEST] = GetMoveDirectionFastestAnimNum,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkSlowestDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkSlowestDown_Step0,\n    MovementAction_WalkSlowestDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkSlowestUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkSlowestUp_Step0,\n    MovementAction_WalkSlowestUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkSlowestLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkSlowestLeft_Step0,\n    MovementAction_WalkSlowestLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkSlowestRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkSlowestRight_Step0,\n    MovementAction_WalkSlowestRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkSlowerDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkSlowerDown_Step0,\n    MovementAction_WalkSlowerDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkSlowerUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkSlowerUp_Step0,\n    MovementAction_WalkSlowerUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkSlowerLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkSlowerLeft_Step0,\n    MovementAction_WalkSlowerLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkSlowerRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkSlowerRight_Step0,\n    MovementAction_WalkSlowerRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkSlowUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkSlowUp_Step0,\n    MovementAction_WalkSlowUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkSlowDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkSlowDown_Step0,\n    MovementAction_WalkSlowDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkSlowLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkSlowLeft_Step0,\n    MovementAction_WalkSlowLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkSlowRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkSlowRight_Step0,\n    MovementAction_WalkSlowRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkNormalDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkNormalDown_Step0,\n    MovementAction_WalkNormalDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkNormalUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkNormalUp_Step0,\n    MovementAction_WalkNormalUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkNormalLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkNormalLeft_Step0,\n    MovementAction_WalkNormalLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkNormalRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkNormalRight_Step0,\n    MovementAction_WalkNormalRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic const s16 sJumpInitDisplacements[] = {\n    [JUMP_DISTANCE_IN_PLACE] = 0,\n    [JUMP_DISTANCE_NORMAL] = 1,\n    [JUMP_DISTANCE_FAR] = 1,\n};\n\nstatic const s16 sJumpDisplacements[] = {\n    [JUMP_DISTANCE_IN_PLACE] = 0,\n    [JUMP_DISTANCE_NORMAL] = 0,\n    [JUMP_DISTANCE_FAR] = 1,\n};\n\nstatic bool8 (*const sMovementActionFuncs_Jump2Down[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_Jump2Down_Step0,\n    MovementAction_Jump2Down_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_Jump2Up[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_Jump2Up_Step0,\n    MovementAction_Jump2Up_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_Jump2Left[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_Jump2Left_Step0,\n    MovementAction_Jump2Left_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_Jump2Right[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_Jump2Right_Step0,\n    MovementAction_Jump2Right_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_Delay1[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_Delay1_Step0,\n    MovementAction_Delay_Step1,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_Delay2[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_Delay2_Step0,\n    MovementAction_Delay_Step1,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_Delay4[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_Delay4_Step0,\n    MovementAction_Delay_Step1,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_Delay8[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_Delay8_Step0,\n    MovementAction_Delay_Step1,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_Delay16[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_Delay16_Step0,\n    MovementAction_Delay_Step1,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkFastDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkFastDown_Step0,\n    MovementAction_WalkFastDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkFastUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkFastUp_Step0,\n    MovementAction_WalkFastUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkFastLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkFastLeft_Step0,\n    MovementAction_WalkFastLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkFastRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkFastRight_Step0,\n    MovementAction_WalkFastRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_GlideDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_GlideDown_Step0,\n    MovementAction_GlideDown_Step1,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_GlideUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_GlideUp_Step0,\n    MovementAction_GlideUp_Step1,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_GlideLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_GlideLeft_Step0,\n    MovementAction_GlideLeft_Step1,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_GlideRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_GlideRight_Step0,\n    MovementAction_GlideRight_Step1,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FaceDownFast[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FaceDownFast_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FaceUpFast[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FaceUpFast_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FaceLeftFast[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FaceLeftFast_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FaceRightFast[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FaceRightFast_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceSlowDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceSlowDown_Step0,\n    MovementAction_WalkInPlaceSlow_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceSlowUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceSlowUp_Step0,\n    MovementAction_WalkInPlaceSlow_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceSlowLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceSlowLeft_Step0,\n    MovementAction_WalkInPlaceSlow_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceSlowRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceSlowRight_Step0,\n    MovementAction_WalkInPlaceSlow_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceNormalDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceNormalDown_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceNormalUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceNormalUp_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceNormalLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceNormalLeft_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceNormalRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceNormalRight_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFastDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceFastDown_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFastUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceFastUp_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFastLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceFastLeft_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFastRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceFastRight_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFasterDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceFasterDown_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFasterUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceFasterUp_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFasterLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceFasterLeft_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkInPlaceFasterRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkInPlaceFasterRight_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_RideWaterCurrentDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RideWaterCurrentDown_Step0,\n    MovementAction_RideWaterCurrentDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_RideWaterCurrentUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RideWaterCurrentUp_Step0,\n    MovementAction_RideWaterCurrentUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_RideWaterCurrentLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RideWaterCurrentLeft_Step0,\n    MovementAction_RideWaterCurrentLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_RideWaterCurrentRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RideWaterCurrentRight_Step0,\n    MovementAction_RideWaterCurrentRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkFasterDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkFasterDown_Step0,\n    MovementAction_WalkFasterDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkFasterUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkFasterUp_Step0,\n    MovementAction_WalkFasterUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkFasterLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkFasterLeft_Step0,\n    MovementAction_WalkFasterLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkFasterRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkFasterRight_Step0,\n    MovementAction_WalkFasterRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_SlideDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_SlideDown_Step0,\n    MovementAction_SlideDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_SlideUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_SlideUp_Step0,\n    MovementAction_SlideUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_SlideLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_SlideLeft_Step0,\n    MovementAction_SlideLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_SlideRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_SlideRight_Step0,\n    MovementAction_SlideRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_PlayerRunDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_PlayerRunDown_Step0,\n    MovementAction_PlayerRunDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_PlayerRunUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_PlayerRunUp_Step0,\n    MovementAction_PlayerRunUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_PlayerRunLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_PlayerRunLeft_Step0,\n    MovementAction_PlayerRunLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_PlayerRunRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_PlayerRunRight_Step0,\n    MovementAction_PlayerRunRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_PlayerRunDownSlow[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RunDownSlow_Step0,\n    MovementAction_RunDownSlow_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_PlayerRunUpSlow[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RunUpSlow_Step0,\n    MovementAction_RunUpSlow_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_PlayerRunLeftSlow[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RunLeftSlow_Step0,\n    MovementAction_RunLeftSlow_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_PlayerRunRightSlow[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RunRightSlow_Step0,\n    MovementAction_RunRightSlow_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_StartAnimInDirection[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_StartAnimInDirection_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpSpecialDown_Step0,\n    MovementAction_JumpSpecialDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpSpecialUp_Step0,\n    MovementAction_JumpSpecialUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpSpecialLeft_Step0,\n    MovementAction_JumpSpecialLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpSpecialRight_Step0,\n    MovementAction_JumpSpecialRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpSpecialWithEffectDown_Step0,\n    MovementAction_JumpSpecialWithEffectDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpSpecialWithEffectUp_Step0,\n    MovementAction_JumpSpecialWithEffectUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpSpecialWithEffectLeft_Step0,\n    MovementAction_JumpSpecialWithEffectLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpSpecialWithEffectRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpSpecialWithEffectRight_Step0,\n    MovementAction_JumpSpecialWithEffectRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FacePlayer[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FacePlayer_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FaceAwayPlayer[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FaceAwayPlayer_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_LockFacingDirection[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_LockFacingDirection_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_UnlockFacingDirection[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_UnlockFacingDirection_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpDown_Step0,\n    MovementAction_JumpDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpUp_Step0,\n    MovementAction_JumpUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpLeft_Step0,\n    MovementAction_JumpLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpRight_Step0,\n    MovementAction_JumpRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpInPlaceDown_Step0,\n    MovementAction_JumpInPlaceDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpInPlaceUp_Step0,\n    MovementAction_JumpInPlaceUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpInPlaceLeft_Step0,\n    MovementAction_JumpInPlaceLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpInPlaceRight_Step0,\n    MovementAction_JumpInPlaceRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceDownUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpInPlaceDownUp_Step0,\n    MovementAction_JumpInPlaceDownUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceUpDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpInPlaceUpDown_Step0,\n    MovementAction_JumpInPlaceUpDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceLeftRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpInPlaceLeftRight_Step0,\n    MovementAction_JumpInPlaceLeftRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_JumpInPlaceRightLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_JumpInPlaceRightLeft_Step0,\n    MovementAction_JumpInPlaceRightLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FaceOriginalDirection[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FaceOriginalDirection_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_NurseJoyBowDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_NurseJoyBowDown_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_EnableJumpLandingGroundEffect[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_EnableJumpLandingGroundEffect_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_DisableJumpLandingGroundEffect[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_DisableJumpLandingGroundEffect_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_DisableAnimation[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_DisableAnimation_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_RestoreAnimation[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RestoreAnimation_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_SetInvisible[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_SetInvisible_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_SetVisible[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_SetVisible_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_EmoteExclamationMark[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_EmoteExclamationMark_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_EmoteQuestionMark[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_EmoteQuestionMark_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_EmoteX[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_EmoteX_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_EmoteDoubleExclMark[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_EmoteDoubleExclamationMark_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_EmoteSmile[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_EmoteSmile_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_RevealTrainer[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RevealTrainer_Step0,\n    MovementAction_RevealTrainer_Step1,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_RockSmashBreak[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RockSmashBreak_Step0,\n    MovementAction_RockSmashBreak_Step1,\n    MovementAction_RockSmashBreak_Step2,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_CutTree[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_CutTree_Step0,\n    MovementAction_CutTree_Step1,\n    MovementAction_CutTree_Step2,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_SetFixedPriority[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_SetFixedPriority_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_ClearFixedPriority[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_ClearFixedPriority_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_InitAffineAnim[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_InitAffineAnim_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_ClearAffineAnim[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_ClearAffineAnim_Step0,\n    MovementAction_Finish,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkDownStartAffine[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkDownStartAffine_Step0,\n    MovementAction_WalkDownStartAffine_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_WalkDownAffine[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_WalkDownAffine_Step0,\n    MovementAction_WalkDownAffine_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieFaceDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieFaceDown_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieFaceUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieFaceUp_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieFaceLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieFaceLeft_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieFaceRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieFaceRight_Step0,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroPopWheelieDown_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroPopWheelieUp_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroPopWheelieLeft_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroPopWheelieRight_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroEndWheelieFaceDown_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroEndWheelieFaceUp_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroEndWheelieFaceLeft_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroEndWheelieFaceRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroEndWheelieFaceRight_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const MovementActionFuncs_UnusedAcroActionDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_UnusedAcroActionDown_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const MovementActionFuncs_UnusedAcroActionUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_UnusedAcroActionUp_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const MovementActionFuncs_UnusedAcroActionLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_UnusedAcroActionLeft_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const MovementActionFuncs_UnusedAcroActionRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_UnusedAcroActionRight_Step0,\n    MovementAction_WaitSpriteAnim,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieHopFaceDown_Step0,\n    MovementAction_AcroWheelieHopFaceDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieHopFaceUp_Step0,\n    MovementAction_AcroWheelieHopFaceUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieHopFaceLeft_Step0,\n    MovementAction_AcroWheelieHopFaceLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopFaceRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieHopFaceRight_Step0,\n    MovementAction_AcroWheelieHopFaceRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieHopDown_Step0,\n    MovementAction_AcroWheelieHopDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieHopUp_Step0,\n    MovementAction_AcroWheelieHopUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieHopLeft_Step0,\n    MovementAction_AcroWheelieHopLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieHopRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieHopRight_Step0,\n    MovementAction_AcroWheelieHopRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieJumpDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieJumpDown_Step0,\n    MovementAction_AcroWheelieJumpDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieJumpUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieJumpUp_Step0,\n    MovementAction_AcroWheelieJumpUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieJumpLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieJumpLeft_Step0,\n    MovementAction_AcroWheelieJumpLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieJumpRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieJumpRight_Step0,\n    MovementAction_AcroWheelieJumpRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieInPlaceDown_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieInPlaceUp_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieInPlaceLeft_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieInPlaceRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieInPlaceRight_Step0,\n    MovementAction_WalkInPlace_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroPopWheelieMoveDown_Step0,\n    MovementAction_AcroPopWheelieMoveDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroPopWheelieMoveUp_Step0,\n    MovementAction_AcroPopWheelieMoveUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroPopWheelieMoveLeft_Step0,\n    MovementAction_AcroPopWheelieMoveLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroPopWheelieMoveRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroPopWheelieMoveRight_Step0,\n    MovementAction_AcroPopWheelieMoveRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieMoveDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieMoveDown_Step0,\n    MovementAction_AcroWheelieMoveDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieMoveUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieMoveUp_Step0,\n    MovementAction_AcroWheelieMoveUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieMoveLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieMoveLeft_Step0,\n    MovementAction_AcroWheelieMoveLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_AcroWheelieMoveRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_AcroWheelieMoveRight_Step0,\n    MovementAction_AcroWheelieMoveRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_SpinDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_SpinDown_Step0,\n    MovementAction_SpinDown_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_SpinUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_SpinUp_Step0,\n    MovementAction_SpinUp_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_SpinLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_SpinLeft_Step0,\n    MovementAction_SpinLeft_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_SpinRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_SpinRight_Step0,\n    MovementAction_SpinRight_Step1,\n    MovementAction_PauseSpriteAnim,\n};\n\nstatic bool8 (*const sMovementActionFuncs_RaiseHandAndStop[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RaiseHand_Step0,\n    MovementAction_RaiseHandAndStop_Step1,\n};\n\nstatic bool8 (*const sMovementActionFuncs_RaiseHandAndJump[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RaiseHand_Step0,\n    MovementAction_RaiseHandAndJump_Step1,\n};\n\nstatic bool8 (*const sMovementActionFuncs_RaiseHandAndSwim[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_RaiseHand_Step0,\n    MovementAction_RaiseHandAndSwim_Step1,\n};\n\nstatic bool8 (*const sMovementActionFuncs_ShakeHeadOrWalkInPlace[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_ShakeHeadOrWalkInPlace_Step0,\n    MovementAction_ShakeHeadOrWalkInPlace_Step1,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FlyUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FlyUp_Step0,\n    MovementAction_FlyUp_Step1,\n    MovementAction_FlyUp_Step2,\n};\n\nstatic bool8 (*const sMovementActionFuncs_FlyDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementAction_FlyDown_Step0,\n    MovementAction_FlyDown_Step1,\n    MovementAction_FlyUp_Step2,\n};\n"
  },
  {
    "path": "src/data/object_events/movement_type_func_tables.h",
    "content": "static bool8 MovementType_WanderAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderAround_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderAround_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderAround_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderAround_Step5Slower(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderAround_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_LookAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_LookAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_LookAround_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_LookAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_LookAround_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderUpAndDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderUpAndDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderUpAndDown_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderUpAndDown_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderLeftAndRight_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WanderLeftAndRight_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDirection_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDirection_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndUp_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndUp_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndUp_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownUpAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownUpAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownUpAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceUpLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_FaceDownLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RotateCounterclockwise_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RotateCounterclockwise_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RotateCounterclockwise_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RotateCounterclockwise_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RotateClockwise_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RotateClockwise_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RotateClockwise_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RotateClockwise_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkBackAndForth_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkBackAndForth_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkBackAndForth_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkBackAndForth_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequence_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequence_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceUpRightLeftDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceRightLeftDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceDownUpRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceLeftDownUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceUpLeftRightDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceLeftRightDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceDownUpLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceRightDownUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceLeftUpDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceUpDownRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceRightLeftUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceDownRightLeftUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceRightUpDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceUpDownLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceLeftRightUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceDownLeftRightUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceUpLeftDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceDownRightUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceLeftDownRightUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceRightUpLeftDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceUpRightDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceDownLeftUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceLeftUpRightDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkSequenceRightDownLeftUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_CopyPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_CopyPlayer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_CopyPlayer_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 CopyablePlayerMovement_None(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8));\nstatic bool8 CopyablePlayerMovement_FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8));\nstatic bool8 CopyablePlayerMovement_GoSpeed0(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8));\nstatic bool8 CopyablePlayerMovement_GoSpeed1(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8));\nstatic bool8 CopyablePlayerMovement_GoSpeed2(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8));\nstatic bool8 CopyablePlayerMovement_Slide(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8));\nstatic bool8 cph_IM_DIFFERENT(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8));\nstatic bool8 CopyablePlayerMovement_GoSpeed4(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8));\nstatic bool8 CopyablePlayerMovement_Jump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8));\nstatic bool8 MovementType_CopyPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_CopyPlayerInGrass_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_CopyPlayer_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_Buried_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_WalkInPlaceFast_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_JogInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_Invisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_Invisible_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_Invisible_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RaiseHandAndStop_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RaiseHandAndStop_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RaiseHandAndStop_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RaiseHandAndJump_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RaiseHandAndSwim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);\nstatic bool8 MovementType_RaiseHandAndMove_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);\n\nstatic u8 GetVectorDirection(s16 dx, s16 dy, s16 absdx, s16 absdy);\nstatic u8 GetLimitedVectorDirection_SouthNorth(s16 dx, s16 dy, s16 absdx, s16 absdy);\nstatic u8 GetLimitedVectorDirection_WestEast(s16 dx, s16 dy, s16 absdx, s16 absdy);\nstatic u8 GetLimitedVectorDirection_WestNorth(s16 dx, s16 dy, s16 absdx, s16 absdy);\nstatic u8 GetLimitedVectorDirection_EastNorth(s16 dx, s16 dy, s16 absdx, s16 absdy);\nstatic u8 GetLimitedVectorDirection_WestSouth(s16 dx, s16 dy, s16 absdx, s16 absdy);\nstatic u8 GetLimitedVectorDirection_EastSouth(s16 dx, s16 dy, s16 absdx, s16 absdy);\nstatic u8 GetLimitedVectorDirection_SouthNorthWest(s16 dx, s16 dy, s16 absdx, s16 absdy);\nstatic u8 GetLimitedVectorDirection_SouthNorthEast(s16 dx, s16 dy, s16 absdx, s16 absdy);\nstatic u8 GetLimitedVectorDirection_NorthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy);\nstatic u8 GetLimitedVectorDirection_SouthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy);\n\nu8 (*const gMovementTypeFuncs_WanderAround[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WanderAround_Step0,\n    MovementType_WanderAround_Step1,\n    MovementType_WanderAround_Step2,\n    MovementType_WanderAround_Step3,\n    MovementType_WanderAround_Step4,\n    MovementType_WanderAround_Step5,\n    MovementType_WanderAround_Step6,\n};\n\nu8 (*const gMovementTypeFuncs_WanderAroundSlower[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WanderAround_Step0,\n    MovementType_WanderAround_Step1,\n    MovementType_WanderAround_Step2,\n    MovementType_WanderAround_Step3,\n    MovementType_WanderAround_Step4,\n    MovementType_WanderAround_Step5Slower,\n    MovementType_WanderAround_Step6,\n};\n\nconst u8 gStandardDirections[] = {DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST};\n\nu8 (*const gGetVectorDirectionFuncs[])(s16, s16, s16, s16) = {\n    GetVectorDirection,\n    GetLimitedVectorDirection_SouthNorth,\n    GetLimitedVectorDirection_WestEast,\n    GetLimitedVectorDirection_WestNorth,\n    GetLimitedVectorDirection_EastNorth,\n    GetLimitedVectorDirection_WestSouth,\n    GetLimitedVectorDirection_EastSouth,\n    GetLimitedVectorDirection_SouthNorthWest,\n    GetLimitedVectorDirection_SouthNorthEast,\n    GetLimitedVectorDirection_NorthWestEast,\n    GetLimitedVectorDirection_SouthWestEast,\n};\n\nu8 (*const gMovementTypeFuncs_LookAround[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_LookAround_Step0,\n    MovementType_LookAround_Step1,\n    MovementType_LookAround_Step2,\n    MovementType_LookAround_Step3,\n    MovementType_LookAround_Step4,\n};\n\nu8 (*const gMovementTypeFuncs_WanderUpAndDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WanderUpAndDown_Step0,\n    MovementType_WanderUpAndDown_Step1,\n    MovementType_WanderUpAndDown_Step2,\n    MovementType_WanderUpAndDown_Step3,\n    MovementType_WanderUpAndDown_Step4,\n    MovementType_WanderUpAndDown_Step5,\n    MovementType_WanderUpAndDown_Step6,\n};\n\nconst u8 gUpAndDownDirections[] = {DIR_SOUTH, DIR_NORTH};\n\nu8 (*const gMovementTypeFuncs_WanderLeftAndRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WanderLeftAndRight_Step0,\n    MovementType_WanderLeftAndRight_Step1,\n    MovementType_WanderLeftAndRight_Step2,\n    MovementType_WanderLeftAndRight_Step3,\n    MovementType_WanderLeftAndRight_Step4,\n    MovementType_WanderLeftAndRight_Step5,\n    MovementType_WanderLeftAndRight_Step6,\n};\n\nconst u8 gLeftAndRightDirections[] = {DIR_WEST, DIR_EAST};\n\nu8 (*const gMovementTypeFuncs_FaceDirection[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_FaceDirection_Step0,\n    MovementType_FaceDirection_Step1,\n    MovementType_FaceDirection_Step2,\n};\n\nu8 (*const gMovementTypeFuncs_FaceDownAndUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_FaceDownAndUp_Step0,\n    MovementType_FaceDownAndUp_Step1,\n    MovementType_FaceDownAndUp_Step2,\n    MovementType_FaceDownAndUp_Step3,\n    MovementType_FaceDownAndUp_Step4,\n};\n\nu8 (*const gMovementTypeFuncs_FaceLeftAndRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_FaceLeftAndRight_Step0,\n    MovementType_FaceLeftAndRight_Step1,\n    MovementType_FaceLeftAndRight_Step2,\n    MovementType_FaceLeftAndRight_Step3,\n    MovementType_FaceLeftAndRight_Step4,\n};\n\nu8 (*const gMovementTypeFuncs_FaceUpAndLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_FaceUpAndLeft_Step0,\n    MovementType_FaceUpAndLeft_Step1,\n    MovementType_FaceUpAndLeft_Step2,\n    MovementType_FaceUpAndLeft_Step3,\n    MovementType_FaceUpAndLeft_Step4,\n};\n\nconst u8 gUpAndLeftDirections[] = {DIR_NORTH, DIR_WEST};\n\nu8 (*const gMovementTypeFuncs_FaceUpAndRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_FaceUpAndRight_Step0,\n    MovementType_FaceUpAndRight_Step1,\n    MovementType_FaceUpAndRight_Step2,\n    MovementType_FaceUpAndRight_Step3,\n    MovementType_FaceUpAndRight_Step4,\n};\n\nconst u8 gUpAndRightDirections[] = {DIR_NORTH, DIR_EAST};\n\nu8 (*const gMovementTypeFuncs_FaceDownAndLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_FaceDownAndLeft_Step0,\n    MovementType_FaceDownAndLeft_Step1,\n    MovementType_FaceDownAndLeft_Step2,\n    MovementType_FaceDownAndLeft_Step3,\n    MovementType_FaceDownAndLeft_Step4,\n};\n\nconst u8 gDownAndLeftDirections[] = {DIR_SOUTH, DIR_WEST};\n\nu8 (*const gMovementTypeFuncs_FaceDownAndRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_FaceDownAndRight_Step0,\n    MovementType_FaceDownAndRight_Step1,\n    MovementType_FaceDownAndRight_Step2,\n    MovementType_FaceDownAndRight_Step3,\n    MovementType_FaceDownAndRight_Step4,\n};\n\nconst u8 gDownAndRightDirections[] = {DIR_SOUTH, DIR_EAST};\n\nu8 (*const gMovementTypeFuncs_FaceDownUpAndLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_FaceDownUpAndLeft_Step0,\n    MovementType_FaceDownUpAndLeft_Step1,\n    MovementType_FaceDownUpAndLeft_Step2,\n    MovementType_FaceDownUpAndLeft_Step3,\n    MovementType_FaceDownUpAndLeft_Step4,\n};\n\nconst u8 gDownUpAndLeftDirections[] = {DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_SOUTH};\n\nu8 (*const gMovementTypeFuncs_FaceDownUpAndRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_FaceDownUpAndRight_Step0,\n    MovementType_FaceDownUpAndRight_Step1,\n    MovementType_FaceDownUpAndRight_Step2,\n    MovementType_FaceDownUpAndRight_Step3,\n    MovementType_FaceDownUpAndRight_Step4,\n};\n\nconst u8 gDownUpAndRightDirections[] = {DIR_SOUTH, DIR_NORTH, DIR_EAST, DIR_SOUTH};\n\nu8 (*const gMovementTypeFuncs_FaceUpLeftAndRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_FaceUpLeftAndRight_Step0,\n    MovementType_FaceUpLeftAndRight_Step1,\n    MovementType_FaceUpLeftAndRight_Step2,\n    MovementType_FaceUpLeftAndRight_Step3,\n    MovementType_FaceUpLeftAndRight_Step4,\n};\n\nconst u8 gUpLeftAndRightDirections[] = {DIR_NORTH, DIR_WEST, DIR_EAST, DIR_NORTH};\n\nu8 (*const gMovementTypeFuncs_FaceDownLeftAndRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_FaceDownLeftAndRight_Step0,\n    MovementType_FaceDownLeftAndRight_Step1,\n    MovementType_FaceDownLeftAndRight_Step2,\n    MovementType_FaceDownLeftAndRight_Step3,\n    MovementType_FaceDownLeftAndRight_Step4,\n};\n\nconst u8 gDownLeftAndRightDirections[] = {DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH};\n\nu8 (*const gMovementTypeFuncs_RotateCounterclockwise[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_RotateCounterclockwise_Step0,\n    MovementType_RotateCounterclockwise_Step1,\n    MovementType_RotateCounterclockwise_Step2,\n    MovementType_RotateCounterclockwise_Step3,\n};\n\nconst u8 gCounterclockwiseDirections[] = {DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_SOUTH, DIR_NORTH};\n\nu8 (*const gMovementTypeFuncs_RotateClockwise[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_RotateClockwise_Step0,\n    MovementType_RotateClockwise_Step1,\n    MovementType_RotateClockwise_Step2,\n    MovementType_RotateClockwise_Step3,\n};\n\nconst u8 gClockwiseDirections[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};\n\nu8 (*const gMovementTypeFuncs_WalkBackAndForth[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkBackAndForth_Step0,\n    MovementType_WalkBackAndForth_Step1,\n    MovementType_WalkBackAndForth_Step2,\n    MovementType_WalkBackAndForth_Step3,\n};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceUpRightLeftDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceUpRightLeftDown_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gUpRightLeftDownDirections[] = {DIR_NORTH, DIR_EAST, DIR_WEST, DIR_SOUTH};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceRightLeftDownUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceRightLeftDownUp_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gRightLeftDownUpDirections[] = {DIR_EAST, DIR_WEST, DIR_SOUTH, DIR_NORTH};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceDownUpRightLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceDownUpRightLeft_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gDownUpRightLeftDirections[] = {DIR_SOUTH, DIR_NORTH, DIR_EAST, DIR_WEST};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceLeftDownUpRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceLeftDownUpRight_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gLeftDownUpRightDirections[] = {DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_EAST};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceUpLeftRightDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceUpLeftRightDown_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gUpLeftRightDownDirections[] = {DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceLeftRightDownUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceLeftRightDownUp_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gLeftRightDownUpDirections[] = {DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceDownUpLeftRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceDownUpLeftRight_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceRightDownUpLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceRightDownUpLeft_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gRightDownUpLeftDirections[] = {DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceLeftUpDownRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceLeftUpDownRight_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gLeftUpDownRightDirections[] = {DIR_WEST, DIR_NORTH, DIR_SOUTH, DIR_EAST};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceUpDownRightLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceUpDownRightLeft_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gUpDownRightLeftDirections[] = {DIR_NORTH, DIR_SOUTH, DIR_EAST, DIR_WEST};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceRightLeftUpDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceRightLeftUpDown_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gRightLeftUpDownDirections[] = {DIR_EAST, DIR_WEST, DIR_NORTH, DIR_SOUTH};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceDownRightLeftUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceDownRightLeftUp_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gDownRightLeftUpDirections[] = {DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceRightUpDownLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceRightUpDownLeft_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gRightUpDownLeftDirections[] = {DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceUpDownLeftRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceUpDownLeftRight_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gUpDownLeftRightDirections[] = {DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceLeftRightUpDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceLeftRightUpDown_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gLeftRightUpDownDirections[] = {DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceDownLeftRightUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceDownLeftRightUp_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gDownLeftRightUpDirections[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceUpLeftDownRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceUpLeftDownRight_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gUpLeftDownRightDirections[] = {DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceDownRightUpLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceDownRightUpLeft_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gDownRightUpLeftDirections[] = {DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceLeftDownRightUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceLeftDownRightUp_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gLeftDownRightUpDirections[] = {DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_NORTH};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceRightUpLeftDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceRightUpLeftDown_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gRightUpLeftDownDirections[] = {DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceUpRightDownLeft[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceUpRightDownLeft_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gUpRightDownLeftDirections[] = {DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceDownLeftUpRight[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceDownLeftUpRight_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gDownLeftUpRightDirections[] = {DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_EAST};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceLeftUpRightDown[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceLeftUpRightDown_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gLeftUpRightDownDirections[] = {DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH};\n\nu8 (*const gMovementTypeFuncs_WalkSequenceRightDownLeftUp[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkSequence_Step0,\n    MovementType_WalkSequenceRightDownLeftUp_Step1,\n    MovementType_WalkSequence_Step2,\n};\n\nconst u8 gRightDownLeftUpDirections[] = {DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH};\n\nu8 (*const gMovementTypeFuncs_CopyPlayer[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_CopyPlayer_Step0,\n    MovementType_CopyPlayer_Step1,\n    MovementType_CopyPlayer_Step2,\n};\n\nbool8 (*const gCopyPlayerMovementFuncs[])(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)) = {\n    CopyablePlayerMovement_None,\n    CopyablePlayerMovement_FaceDirection,\n    CopyablePlayerMovement_GoSpeed0,\n    CopyablePlayerMovement_GoSpeed1,\n    CopyablePlayerMovement_GoSpeed2,\n    CopyablePlayerMovement_Slide,\n    cph_IM_DIFFERENT,\n    CopyablePlayerMovement_GoSpeed4,\n    CopyablePlayerMovement_Jump,\n    CopyablePlayerMovement_None,\n    CopyablePlayerMovement_None,\n};\n\nu8 (*const gMovementTypeFuncs_CopyPlayerInGrass[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_CopyPlayer_Step0,\n    MovementType_CopyPlayerInGrass_Step1,\n    MovementType_CopyPlayer_Step2,\n};\n\nu8 (*const gMovementTypeFuncs_Buried[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_Buried_Step0,\n};\n\nu8 (*const gMovementTypeFuncs_WalkInPlace[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkInPlace_Step0,\n    MovementType_MoveInPlace_Step1,\n};\n\nu8 (*const gMovementTypeFuncs_WalkInPlaceFast[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_WalkInPlaceFast_Step0,\n    MovementType_MoveInPlace_Step1,\n};\n\nu8 (*const gMovementTypeFuncs_JogInPlace[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_JogInPlace_Step0,\n    MovementType_MoveInPlace_Step1,\n};\n\nu8 (*const gMovementTypeFuncs_Invisible[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_Invisible_Step0,\n    MovementType_Invisible_Step1,\n    MovementType_Invisible_Step2,\n};\n\nu8 (*const gMovementTypeFuncs_RaiseHandAndStop[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_RaiseHandAndStop_Step0,\n    MovementType_RaiseHandAndStop_Step1,\n    MovementType_RaiseHandAndStop_Step2,\n};\n\nu8 (*const gMovementTypeFuncs_RaiseHandAndJump[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_RaiseHandAndJump_Step0,\n    MovementType_RaiseHandAndMove_Step1,\n};\n\nu8 (*const gMovementTypeFuncs_RaiseHandAndSwim[])(struct ObjectEvent *, struct Sprite *) = {\n    MovementType_RaiseHandAndSwim_Step0,\n    MovementType_RaiseHandAndMove_Step1,\n};\n"
  },
  {
    "path": "src/data/object_events/object_event_anims.h",
    "content": "static const union AnimCmd sAnim_StayStill[] = {\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpFaceSouth[] = {\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpFaceNorth[] = {\n    ANIMCMD_FRAME(1, 16),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpFaceWest[] = {\n    ANIMCMD_FRAME(2, 16),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpFaceEast[] = {\n    ANIMCMD_FRAME(2, 16, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoSouth[] = {\n    ANIMCMD_FRAME(3, 8),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(3, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoNorth[] = {\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(4, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoWest[] = {\n    ANIMCMD_FRAME(5, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_FRAME(6, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoEast[] = {\n    ANIMCMD_FRAME(5, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(6, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 8, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoFastSouth[] = {\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(3, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoFastNorth[] = {\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(4, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoFastWest[] = {\n    ANIMCMD_FRAME(5, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(6, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoFastEast[] = {\n    ANIMCMD_FRAME(5, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(6, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 4, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoFasterSouth[] = {\n    ANIMCMD_FRAME(3, 2),\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(3, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoFasterNorth[] = {\n    ANIMCMD_FRAME(4, 2),\n    ANIMCMD_FRAME(1, 2),\n    ANIMCMD_FRAME(4, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(1, 2),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoFasterWest[] = {\n    ANIMCMD_FRAME(5, 2),\n    ANIMCMD_FRAME(2, 2),\n    ANIMCMD_FRAME(6, 2),\n    ANIMCMD_FRAME(2, 2),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoFasterEast[] = {\n    ANIMCMD_FRAME(5, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(6, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 2, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoFastestSouth[] = {\n    ANIMCMD_FRAME(3, 1),\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_FRAME(3, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoFastestNorth[] = {\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_FRAME(4, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoFastestWest[] = {\n    ANIMCMD_FRAME(5, 1),\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_FRAME(6, 1),\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_QuintyPlumpGoFastestEast[] = {\n    ANIMCMD_FRAME(5, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(6, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 1, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_FaceSouth[] = {\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_FaceNorth[] = {\n    ANIMCMD_FRAME(1, 16),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_FaceWest[] = {\n    ANIMCMD_FRAME(2, 16),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_FaceEast[] = {\n    ANIMCMD_FRAME(2, 16, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoSouth[] = {\n    ANIMCMD_FRAME(3, 8),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoNorth[] = {\n    ANIMCMD_FRAME(5, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(6, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoWest[] = {\n    ANIMCMD_FRAME(7, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_FRAME(8, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoEast[] = {\n    ANIMCMD_FRAME(7, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 8, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 8, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoFastSouth[] = {\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoFastNorth[] = {\n    ANIMCMD_FRAME(5, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(6, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoFastWest[] = {\n    ANIMCMD_FRAME(7, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(8, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoFastEast[] = {\n    ANIMCMD_FRAME(7, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 4, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoFasterSouth[] = {\n    ANIMCMD_FRAME(3, 2),\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(4, 2),\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoFasterNorth[] = {\n    ANIMCMD_FRAME(5, 2),\n    ANIMCMD_FRAME(1, 2),\n    ANIMCMD_FRAME(6, 2),\n    ANIMCMD_FRAME(1, 2),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoFasterWest[] = {\n    ANIMCMD_FRAME(7, 2),\n    ANIMCMD_FRAME(2, 2),\n    ANIMCMD_FRAME(8, 2),\n    ANIMCMD_FRAME(2, 2),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoFasterEast[] = {\n    ANIMCMD_FRAME(7, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 2, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoFastestSouth[] = {\n    ANIMCMD_FRAME(3, 1),\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoFastestNorth[] = {\n    ANIMCMD_FRAME(5, 1),\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_FRAME(6, 1),\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoFastestWest[] = {\n    ANIMCMD_FRAME(7, 1),\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_FRAME(8, 1),\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GoFastestEast[] = {\n    ANIMCMD_FRAME(7, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(8, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 1, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\n// For indicating a VS Seeker rematch\nstatic const union AnimCmd sAnim_RaiseHand[] = {\n    ANIMCMD_FRAME(9, 0),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_HoOhFlapWings[] = {\n    ANIMCMD_FRAME(3, 8),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(3, 8),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_HoOhStayStill[] = {\n    ANIMCMD_FRAME(3, 16),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_SurfFaceSouth[] = {\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_SurfFaceNorth[] = {\n    ANIMCMD_FRAME(1, 60),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_SurfFaceWest[] = {\n    ANIMCMD_FRAME(2, 60),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_SurfFaceEast[] = {\n    ANIMCMD_FRAME(2, 60, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownFaceSouth[] = {\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownFaceNorth[] = {\n    ANIMCMD_FRAME(1, 16),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownFaceWest[] = {\n    ANIMCMD_FRAME(2, 16),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownFaceEast[] = {\n    ANIMCMD_FRAME(2, 16, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoSouth[] = {\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(5, 4),\n    ANIMCMD_FRAME(6, 4),\n    ANIMCMD_FRAME(5, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoNorth[] = {\n    ANIMCMD_FRAME(7, 4),\n    ANIMCMD_FRAME(8, 4),\n    ANIMCMD_FRAME(7, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(9, 4),\n    ANIMCMD_FRAME(10, 4),\n    ANIMCMD_FRAME(9, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoWest[] = {\n    ANIMCMD_FRAME(11, 4),\n    ANIMCMD_FRAME(12, 4),\n    ANIMCMD_FRAME(11, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(13, 4),\n    ANIMCMD_FRAME(14, 4),\n    ANIMCMD_FRAME(13, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoEast[] = {\n    ANIMCMD_FRAME(11, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(12, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(11, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(13, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(14, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(13, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 4, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoFastNorth[] = {\n    ANIMCMD_FRAME(3, 2),\n    ANIMCMD_FRAME(4, 2),\n    ANIMCMD_FRAME(3, 2),\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(5, 2),\n    ANIMCMD_FRAME(6, 2),\n    ANIMCMD_FRAME(5, 2),\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoFastSouth[] = {\n    ANIMCMD_FRAME(7, 2),\n    ANIMCMD_FRAME(8, 2),\n    ANIMCMD_FRAME(7, 2),\n    ANIMCMD_FRAME(1, 2),\n    ANIMCMD_FRAME(9, 2),\n    ANIMCMD_FRAME(10, 2),\n    ANIMCMD_FRAME(9, 2),\n    ANIMCMD_FRAME(1, 2),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoFastWest[] = {\n    ANIMCMD_FRAME(11, 2),\n    ANIMCMD_FRAME(12, 2),\n    ANIMCMD_FRAME(11, 2),\n    ANIMCMD_FRAME(2, 2),\n    ANIMCMD_FRAME(13, 2),\n    ANIMCMD_FRAME(14, 2),\n    ANIMCMD_FRAME(13, 2),\n    ANIMCMD_FRAME(2, 2),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoFastEast[] = {\n    ANIMCMD_FRAME(11, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(12, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(11, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(13, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(14, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(13, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 2, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoFasterNorth[] = {\n    ANIMCMD_FRAME(3, 1),\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_FRAME(3, 1),\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_FRAME(5, 1),\n    ANIMCMD_FRAME(6, 1),\n    ANIMCMD_FRAME(5, 1),\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoFasterSouth[] = {\n    ANIMCMD_FRAME(7, 1),\n    ANIMCMD_FRAME(8, 1),\n    ANIMCMD_FRAME(7, 1),\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_FRAME(9, 1),\n    ANIMCMD_FRAME(10, 1),\n    ANIMCMD_FRAME(9, 1),\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoFasterWest[] = {\n    ANIMCMD_FRAME(11, 1),\n    ANIMCMD_FRAME(12, 1),\n    ANIMCMD_FRAME(11, 1),\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_FRAME(13, 1),\n    ANIMCMD_FRAME(14, 1),\n    ANIMCMD_FRAME(13, 1),\n    ANIMCMD_FRAME(2, 1),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoFasterEast[] = {\n    ANIMCMD_FRAME(11, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(12, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(11, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(13, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(14, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(13, 1, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 1, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoFastestNorth[] = {\n    ANIMCMD_FRAME(3, 0),\n    ANIMCMD_FRAME(4, 0),\n    ANIMCMD_FRAME(3, 0),\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_FRAME(5, 0),\n    ANIMCMD_FRAME(6, 0),\n    ANIMCMD_FRAME(5, 0),\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoFastestSouth[] = {\n    ANIMCMD_FRAME(7, 0),\n    ANIMCMD_FRAME(8, 0),\n    ANIMCMD_FRAME(7, 0),\n    ANIMCMD_FRAME(1, 0),\n    ANIMCMD_FRAME(9, 0),\n    ANIMCMD_FRAME(10, 0),\n    ANIMCMD_FRAME(9, 0),\n    ANIMCMD_FRAME(1, 0),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoFastestWest[] = {\n    ANIMCMD_FRAME(11, 0),\n    ANIMCMD_FRAME(12, 0),\n    ANIMCMD_FRAME(11, 0),\n    ANIMCMD_FRAME(2, 0),\n    ANIMCMD_FRAME(13, 0),\n    ANIMCMD_FRAME(14, 0),\n    ANIMCMD_FRAME(13, 0),\n    ANIMCMD_FRAME(2, 0),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_UnknownGoFastestEast[] = {\n    ANIMCMD_FRAME(11, 0, .hFlip = TRUE),\n    ANIMCMD_FRAME(12, 0, .hFlip = TRUE),\n    ANIMCMD_FRAME(11, 0, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 0, .hFlip = TRUE),\n    ANIMCMD_FRAME(13, 0, .hFlip = TRUE),\n    ANIMCMD_FRAME(14, 0, .hFlip = TRUE),\n    ANIMCMD_FRAME(13, 0, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 0, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_SpinSouth[] = {\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(2, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(1, 2),\n    ANIMCMD_FRAME(2, 2),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_SpinNorth[] = {\n    ANIMCMD_FRAME(1, 2),\n    ANIMCMD_FRAME(2, 2),\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(2, 2, .hFlip = TRUE),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_SpinWest[] = {\n    ANIMCMD_FRAME(2, 2, .hFlip = TRUE), // Starts by facing East?\n    ANIMCMD_FRAME(1, 2),\n    ANIMCMD_FRAME(2, 2),\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_SpinEast[] = {\n    ANIMCMD_FRAME(2, 2), // Starts by facing West?\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(2, 2, .hFlip = TRUE),\n    ANIMCMD_FRAME(1, 2),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_ShakeHeadOrWalkInPlace[] = {\n    ANIMCMD_FRAME(18, 16),\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_FRAME(19, 16),\n    ANIMCMD_FRAME(0, 32),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_RunSouth[] = {\n    ANIMCMD_FRAME(9, 5),\n    ANIMCMD_FRAME(10, 3),\n    ANIMCMD_FRAME(9, 5),\n    ANIMCMD_FRAME(11, 3),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_RunNorth[] = {\n    ANIMCMD_FRAME(12, 5),\n    ANIMCMD_FRAME(13, 3),\n    ANIMCMD_FRAME(12, 5),\n    ANIMCMD_FRAME(14, 3),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_RunWest[] = {\n    ANIMCMD_FRAME(15, 5),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(15, 5),\n    ANIMCMD_FRAME(17, 3),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_RunEast[] = {\n    ANIMCMD_FRAME(15, 5, .hFlip = TRUE),\n    ANIMCMD_FRAME(16, 3, .hFlip = TRUE),\n    ANIMCMD_FRAME(15, 5, .hFlip = TRUE),\n    ANIMCMD_FRAME(17, 3, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_FieldMove[] = {\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_VSSeeker[] = {\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(5, 4),\n    ANIMCMD_FRAME(6, 4),\n    ANIMCMD_LOOP(0),\n    ANIMCMD_FRAME(7, 4),\n    ANIMCMD_FRAME(8, 4),\n    ANIMCMD_LOOP(6),\n    ANIMCMD_FRAME(6, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_VSSeekerBike[] = {\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_LOOP(0),\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(5, 4),\n    ANIMCMD_LOOP(6),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_GetOnOffSurfSouth[] = {\n    ANIMCMD_FRAME(9, 32),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GetOnOffSurfNorth[] = {\n    ANIMCMD_FRAME(10, 32),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GetOnOffSurfWest[] = {\n    ANIMCMD_FRAME(11, 32),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_GetOnOffSurfEast[] = {\n    ANIMCMD_FRAME(11, 32, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_BunnyHopBackWheelSouth[] = {\n    ANIMCMD_FRAME(15, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BunnyHopBackWheelNorth[] = {\n    ANIMCMD_FRAME(19, 4),\n    ANIMCMD_FRAME(20, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BunnyHopBackWheelWest[] = {\n    ANIMCMD_FRAME(23, 4),\n    ANIMCMD_FRAME(24, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BunnyHopBackWheelEast[] = {\n    ANIMCMD_FRAME(23, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(24, 4, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BunnyHopFrontWheelSouth[] = {\n    ANIMCMD_FRAME(17, 4),\n    ANIMCMD_FRAME(18, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BunnyHopFrontWheelNorth[] = {\n    ANIMCMD_FRAME(21, 4),\n    ANIMCMD_FRAME(22, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BunnyHopFrontWheelWest[] = {\n    ANIMCMD_FRAME(25, 4),\n    ANIMCMD_FRAME(26, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BunnyHopFrontWheelEast[] = {\n    ANIMCMD_FRAME(25, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(26, 4, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_StandingWheelieBackWheelSouth[] = {\n    ANIMCMD_FRAME(15, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_StandingWheelieBackWheelNorth[] = {\n    ANIMCMD_FRAME(19, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_StandingWheelieBackWheelWest[] = {\n    ANIMCMD_FRAME(23, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_StandingWheelieBackWheelEast[] = {\n    ANIMCMD_FRAME(23, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 4, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_StandingWheelieFrontWheelSouth[] = {\n    ANIMCMD_FRAME(17, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_StandingWheelieFrontWheelNorth[] = {\n    ANIMCMD_FRAME(21, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_StandingWheelieFrontWheelWest[] = {\n    ANIMCMD_FRAME(25, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_StandingWheelieFrontWheelEast[] = {\n    ANIMCMD_FRAME(25, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 4, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MovingWheelieSouth[] = {\n    ANIMCMD_FRAME(27, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_FRAME(28, 4),\n    ANIMCMD_FRAME(16, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_MovingWheelieNorth[] = {\n    ANIMCMD_FRAME(29, 4),\n    ANIMCMD_FRAME(20, 4),\n    ANIMCMD_FRAME(30, 4),\n    ANIMCMD_FRAME(20, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_MovingWheelieWest[] = {\n    ANIMCMD_FRAME(31, 4),\n    ANIMCMD_FRAME(24, 4),\n    ANIMCMD_FRAME(32, 4),\n    ANIMCMD_FRAME(24, 4),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_MovingWheelieEast[] = {\n    ANIMCMD_FRAME(31, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(24, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(32, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(24, 4, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_BerryTreeStage0[] = {\n    ANIMCMD_FRAME(0, 32),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BerryTreeStage1[] = {\n    ANIMCMD_FRAME(1, 32),\n    ANIMCMD_FRAME(2, 32),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BerryTreeStage2[] = {\n    ANIMCMD_FRAME(3, 48),\n    ANIMCMD_FRAME(4, 48),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BerryTreeStage3[] = {\n    ANIMCMD_FRAME(5, 32),\n    ANIMCMD_FRAME(5, 32),\n    ANIMCMD_FRAME(6, 32),\n    ANIMCMD_FRAME(6, 32),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_BerryTreeStage4[] = {\n    ANIMCMD_FRAME(7, 48),\n    ANIMCMD_FRAME(7, 48),\n    ANIMCMD_FRAME(8, 48),\n    ANIMCMD_FRAME(8, 48),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_NurseBow[] = {\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(9, 32),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_RockBreak[] = {\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_FRAME(3, 8),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_TreeCut[] = {\n    ANIMCMD_FRAME(0, 6),\n    ANIMCMD_FRAME(1, 6),\n    ANIMCMD_FRAME(2, 6),\n    ANIMCMD_FRAME(3, 6),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_TakeOutRodSouth[] = {\n    ANIMCMD_FRAME(8, 4),\n    ANIMCMD_FRAME(9, 4),\n    ANIMCMD_FRAME(10, 4),\n    ANIMCMD_FRAME(11, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_TakeOutRodNorth[] = {\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(5, 4),\n    ANIMCMD_FRAME(6, 4),\n    ANIMCMD_FRAME(7, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_TakeOutRodWest[] = {\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_TakeOutRodEast[] = {\n    ANIMCMD_FRAME(0, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(1, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(3, 4, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_PutAwayRodSouth[] = {\n    ANIMCMD_FRAME(11, 4),\n    ANIMCMD_FRAME(10, 6),\n    ANIMCMD_FRAME(9, 6),\n    ANIMCMD_FRAME(8, 6),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_PutAwayRodNorth[] = {\n    ANIMCMD_FRAME(7, 4),\n    ANIMCMD_FRAME(6, 6),\n    ANIMCMD_FRAME(5, 6),\n    ANIMCMD_FRAME(4, 6),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_PutAwayRodWest[] = {\n    ANIMCMD_FRAME(3, 4),\n    ANIMCMD_FRAME(2, 4),\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_PutAwayRodEast[] = {\n    ANIMCMD_FRAME(3, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(2, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(1, 4, .hFlip = TRUE),\n    ANIMCMD_FRAME(0, 4, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_HookedPokemonSouth[] = {\n    ANIMCMD_FRAME(10, 6),\n    ANIMCMD_FRAME(11, 6),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_FRAME(11, 30),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_HookedPokemonNorth[] = {\n    ANIMCMD_FRAME(6, 6),\n    ANIMCMD_FRAME(7, 6),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_FRAME(7, 30),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_HookedPokemonWest[] = {\n    ANIMCMD_FRAME(2, 6),\n    ANIMCMD_FRAME(3, 6),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_FRAME(3, 30),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sAnim_HookedPokemonEast[] = {\n    ANIMCMD_FRAME(2, 6, .hFlip = TRUE),\n    ANIMCMD_FRAME(3, 6, .hFlip = TRUE),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_FRAME(3, 30, .hFlip = TRUE),\n    ANIMCMD_JUMP(0),\n};\n\n// Unused\nstatic const union AffineAnimCmd sAffineAnim_KyogreGroudon_GoSouthStart[] = {\n    AFFINEANIMCMD_FRAME(0, 0, 1, 1),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 1),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 1),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 1),\n    AFFINEANIMCMD_LOOP(7),\n    AFFINEANIMCMD_JUMP(0),\n};\n\n// Unused\nstatic const union AffineAnimCmd sAffineAnim_KyogreGroudon_GoSouth[] = {\n    AFFINEANIMCMD_FRAME(0, 0, -1, 1),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 1),\n    AFFINEANIMCMD_LOOP(15),\n    AFFINEANIMCMD_FRAME(0, 0, 1, 1),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 1),\n    AFFINEANIMCMD_LOOP(15),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAnimTable_Inanimate[] = {\n    [ANIM_STAY_STILL] = sAnim_StayStill\n};\n\n// Leftover from Ruby/Sapphire\nstatic const union AnimCmd *const sAnimTable_QuintyPlump[] = {\n    [ANIM_STD_FACE_SOUTH] = sAnim_QuintyPlumpFaceSouth,\n    [ANIM_STD_FACE_NORTH] = sAnim_QuintyPlumpFaceNorth,\n    [ANIM_STD_FACE_WEST] = sAnim_QuintyPlumpFaceWest,\n    [ANIM_STD_FACE_EAST] = sAnim_QuintyPlumpFaceEast,\n    [ANIM_STD_GO_SOUTH] = sAnim_QuintyPlumpGoSouth,\n    [ANIM_STD_GO_NORTH] = sAnim_QuintyPlumpGoNorth,\n    [ANIM_STD_GO_WEST] = sAnim_QuintyPlumpGoWest,\n    [ANIM_STD_GO_EAST] = sAnim_QuintyPlumpGoEast,\n    [ANIM_STD_GO_FAST_SOUTH] = sAnim_QuintyPlumpGoFastSouth,\n    [ANIM_STD_GO_FAST_NORTH] = sAnim_QuintyPlumpGoFastNorth,\n    [ANIM_STD_GO_FAST_WEST] = sAnim_QuintyPlumpGoFastWest,\n    [ANIM_STD_GO_FAST_EAST] = sAnim_QuintyPlumpGoFastEast,\n    [ANIM_STD_GO_FASTER_SOUTH] = sAnim_QuintyPlumpGoFasterSouth,\n    [ANIM_STD_GO_FASTER_NORTH] = sAnim_QuintyPlumpGoFasterNorth,\n    [ANIM_STD_GO_FASTER_WEST] = sAnim_QuintyPlumpGoFasterWest,\n    [ANIM_STD_GO_FASTER_EAST] = sAnim_QuintyPlumpGoFasterEast,\n    [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_QuintyPlumpGoFastestSouth,\n    [ANIM_STD_GO_FASTEST_NORTH] = sAnim_QuintyPlumpGoFastestNorth,\n    [ANIM_STD_GO_FASTEST_WEST] = sAnim_QuintyPlumpGoFastestWest,\n    [ANIM_STD_GO_FASTEST_EAST] = sAnim_QuintyPlumpGoFastestEast,\n};\n\nstatic const union AnimCmd *const sAnimTable_Standard[] = {\n    [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth,\n    [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth,\n    [ANIM_STD_FACE_WEST] = sAnim_FaceWest,\n    [ANIM_STD_FACE_EAST] = sAnim_FaceEast,\n    [ANIM_STD_GO_SOUTH] = sAnim_GoSouth,\n    [ANIM_STD_GO_NORTH] = sAnim_GoNorth,\n    [ANIM_STD_GO_WEST] = sAnim_GoWest,\n    [ANIM_STD_GO_EAST] = sAnim_GoEast,\n    [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth,\n    [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth,\n    [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest,\n    [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast,\n    [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth,\n    [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth,\n    [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest,\n    [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast,\n    [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth,\n    [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth,\n    [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest,\n    [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast,\n    [ANIM_RAISE_HAND] = sAnim_RaiseHand,\n};\n\nstatic const union AnimCmd *const sAnimTable_HoOh[] = {\n    [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth,\n    [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth,\n    [ANIM_STD_FACE_WEST] = sAnim_FaceWest,\n    [ANIM_STD_FACE_EAST] = sAnim_FaceEast,\n    [ANIM_STD_GO_SOUTH] = sAnim_HoOhFlapWings,\n    [ANIM_STD_GO_NORTH] = sAnim_HoOhStayStill,\n    [ANIM_STD_GO_WEST] = sAnim_GoWest,\n    [ANIM_STD_GO_EAST] = sAnim_GoEast,\n    [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth,\n    [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth,\n    [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest,\n    [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast,\n    [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth,\n    [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth,\n    [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest,\n    [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast,\n    [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth,\n    [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth,\n    [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest,\n    [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast,\n    [ANIM_RAISE_HAND] = sAnim_RaiseHand,\n};\n\nstatic const union AnimCmd *const sAnimTable_Unknown[] = {\n    [ANIM_STD_FACE_SOUTH] = sAnim_UnknownFaceSouth,\n    [ANIM_STD_FACE_NORTH] = sAnim_UnknownFaceNorth,\n    [ANIM_STD_FACE_WEST] = sAnim_UnknownFaceWest,\n    [ANIM_STD_FACE_EAST] = sAnim_UnknownFaceEast,\n    [ANIM_STD_GO_SOUTH] = sAnim_UnknownGoSouth,\n    [ANIM_STD_GO_NORTH] = sAnim_UnknownGoNorth,\n    [ANIM_STD_GO_WEST] = sAnim_UnknownGoWest,\n    [ANIM_STD_GO_EAST] = sAnim_UnknownGoEast,\n    [ANIM_STD_GO_FAST_SOUTH] = sAnim_UnknownGoFastNorth,\n    [ANIM_STD_GO_FAST_NORTH] = sAnim_UnknownGoFastSouth,\n    [ANIM_STD_GO_FAST_WEST] = sAnim_UnknownGoFastWest,\n    [ANIM_STD_GO_FAST_EAST] = sAnim_UnknownGoFastEast,\n    [ANIM_STD_GO_FASTER_SOUTH] = sAnim_UnknownGoFasterNorth,\n    [ANIM_STD_GO_FASTER_NORTH] = sAnim_UnknownGoFasterSouth,\n    [ANIM_STD_GO_FASTER_WEST] = sAnim_UnknownGoFasterWest,\n    [ANIM_STD_GO_FASTER_EAST] = sAnim_UnknownGoFasterEast,\n    [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_UnknownGoFastestNorth,\n    [ANIM_STD_GO_FASTEST_NORTH] = sAnim_UnknownGoFastestSouth,\n    [ANIM_STD_GO_FASTEST_WEST] = sAnim_UnknownGoFastestWest,\n    [ANIM_STD_GO_FASTEST_EAST] = sAnim_UnknownGoFastestEast,\n    [ANIM_RUN_SOUTH] = sAnim_RunSouth,\n    [ANIM_RUN_NORTH] = sAnim_RunNorth,\n    [ANIM_RUN_WEST] = sAnim_RunWest,\n    [ANIM_RUN_EAST] = sAnim_RunEast,\n};\n\nstatic const union AnimCmd *const sAnimTable_RedGreenNormal[] = {\n    [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth,\n    [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth,\n    [ANIM_STD_FACE_WEST] = sAnim_FaceWest,\n    [ANIM_STD_FACE_EAST] = sAnim_FaceEast,\n    [ANIM_STD_GO_SOUTH] = sAnim_GoSouth,\n    [ANIM_STD_GO_NORTH] = sAnim_GoNorth,\n    [ANIM_STD_GO_WEST] = sAnim_GoWest,\n    [ANIM_STD_GO_EAST] = sAnim_GoEast,\n    [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth,\n    [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth,\n    [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest,\n    [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast,\n    [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth,\n    [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth,\n    [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest,\n    [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast,\n    [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth,\n    [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth,\n    [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest,\n    [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast,\n    [ANIM_RUN_SOUTH] = sAnim_RunSouth,\n    [ANIM_RUN_NORTH] = sAnim_RunNorth,\n    [ANIM_RUN_WEST] = sAnim_RunWest,\n    [ANIM_RUN_EAST] = sAnim_RunEast,\n    [ANIM_SPIN_SOUTH] = sAnim_SpinSouth,\n    [ANIM_SPIN_NORTH] = sAnim_SpinNorth,\n    [ANIM_SPIN_WEST] = sAnim_SpinWest,\n    [ANIM_SPIN_EAST] = sAnim_SpinEast,\n    [ANIM_SHAKE_HEAD_OR_WALK_IN_PLACE] = sAnim_ShakeHeadOrWalkInPlace,\n};\n\n// Leftover from Ruby/Sapphire\nstatic const union AnimCmd *const sAnimTable_AcroBike[] = {\n    [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth,\n    [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth,\n    [ANIM_STD_FACE_WEST] = sAnim_FaceWest,\n    [ANIM_STD_FACE_EAST] = sAnim_FaceEast,\n    [ANIM_STD_GO_SOUTH] = sAnim_GoSouth,\n    [ANIM_STD_GO_NORTH] = sAnim_GoNorth,\n    [ANIM_STD_GO_WEST] = sAnim_GoWest,\n    [ANIM_STD_GO_EAST] = sAnim_GoEast,\n    [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth,\n    [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth,\n    [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest,\n    [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast,\n    [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth,\n    [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth,\n    [ANIM_STD_GO_FASTER_WEST] = sAnim_GoFasterWest,\n    [ANIM_STD_GO_FASTER_EAST] = sAnim_GoFasterEast,\n    [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth,\n    [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth,\n    [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest,\n    [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast,\n    [ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH] = sAnim_BunnyHopBackWheelSouth,\n    [ANIM_BUNNY_HOP_BACK_WHEEL_NORTH] = sAnim_BunnyHopBackWheelNorth,\n    [ANIM_BUNNY_HOP_BACK_WHEEL_WEST] = sAnim_BunnyHopBackWheelWest,\n    [ANIM_BUNNY_HOP_BACK_WHEEL_EAST] = sAnim_BunnyHopBackWheelEast,\n    [ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH] = sAnim_BunnyHopFrontWheelSouth,\n    [ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH] = sAnim_BunnyHopFrontWheelNorth,\n    [ANIM_BUNNY_HOP_FRONT_WHEEL_WEST] = sAnim_BunnyHopFrontWheelWest,\n    [ANIM_BUNNY_HOP_FRONT_WHEEL_EAST] = sAnim_BunnyHopFrontWheelEast,\n    [ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH] = sAnim_StandingWheelieBackWheelSouth,\n    [ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH] = sAnim_StandingWheelieBackWheelNorth,\n    [ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST] = sAnim_StandingWheelieBackWheelWest,\n    [ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST] = sAnim_StandingWheelieBackWheelEast,\n    [ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH] = sAnim_StandingWheelieFrontWheelSouth,\n    [ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH] = sAnim_StandingWheelieFrontWheelNorth,\n    [ANIM_STANDING_WHEELIE_FRONT_WHEEL_WEST] = sAnim_StandingWheelieFrontWheelWest,\n    [ANIM_STANDING_WHEELIE_FRONT_WHEEL_EAST] = sAnim_StandingWheelieFrontWheelEast,\n    [ANIM_MOVING_WHEELIE_SOUTH] = sAnim_MovingWheelieSouth,\n    [ANIM_MOVING_WHEELIE_NORTH] = sAnim_MovingWheelieNorth,\n    [ANIM_MOVING_WHEELIE_WEST] = sAnim_MovingWheelieWest,\n    [ANIM_MOVING_WHEELIE_EAST] = sAnim_MovingWheelieEast,\n};\n\nstatic const union AnimCmd *const sAnimTable_RedGreenSurf[] = {\n    [ANIM_STD_FACE_SOUTH] = sAnim_SurfFaceSouth,\n    [ANIM_STD_FACE_NORTH] = sAnim_SurfFaceNorth,\n    [ANIM_STD_FACE_WEST] = sAnim_SurfFaceWest,\n    [ANIM_STD_FACE_EAST] = sAnim_SurfFaceEast,\n    [ANIM_STD_GO_SOUTH] = sAnim_SurfFaceSouth,\n    [ANIM_STD_GO_NORTH] = sAnim_SurfFaceNorth,\n    [ANIM_STD_GO_WEST] = sAnim_SurfFaceWest,\n    [ANIM_STD_GO_EAST] = sAnim_SurfFaceEast,\n    [ANIM_STD_GO_FAST_SOUTH] = sAnim_SurfFaceSouth,\n    [ANIM_STD_GO_FAST_NORTH] = sAnim_SurfFaceNorth,\n    [ANIM_STD_GO_FAST_WEST] = sAnim_SurfFaceWest,\n    [ANIM_STD_GO_FAST_EAST] = sAnim_SurfFaceEast,\n    [ANIM_STD_GO_FASTER_SOUTH] = sAnim_SurfFaceSouth,\n    [ANIM_STD_GO_FASTER_NORTH] = sAnim_SurfFaceNorth,\n    [ANIM_STD_GO_FASTER_WEST] = sAnim_SurfFaceWest,\n    [ANIM_STD_GO_FASTER_EAST] = sAnim_SurfFaceEast,\n    [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_SurfFaceSouth,\n    [ANIM_STD_GO_FASTEST_NORTH] = sAnim_SurfFaceNorth,\n    [ANIM_STD_GO_FASTEST_WEST] = sAnim_SurfFaceWest,\n    [ANIM_STD_GO_FASTEST_EAST] = sAnim_SurfFaceEast,\n    [ANIM_GET_ON_OFF_POKEMON_SOUTH] = sAnim_GetOnOffSurfSouth,\n    [ANIM_GET_ON_OFF_POKEMON_NORTH] = sAnim_GetOnOffSurfNorth,\n    [ANIM_GET_ON_OFF_POKEMON_WEST] = sAnim_GetOnOffSurfWest,\n    [ANIM_GET_ON_OFF_POKEMON_EAST] = sAnim_GetOnOffSurfEast,\n};\n\nstatic const union AnimCmd *const sAnimTable_Nurse[] = {\n    [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth,\n    [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth,\n    [ANIM_STD_FACE_WEST] = sAnim_FaceWest,\n    [ANIM_STD_FACE_EAST] = sAnim_FaceEast,\n    [ANIM_STD_GO_SOUTH] = sAnim_GoSouth,\n    [ANIM_STD_GO_NORTH] = sAnim_GoNorth,\n    [ANIM_STD_GO_WEST] = sAnim_GoWest,\n    [ANIM_STD_GO_EAST] = sAnim_GoEast,\n    [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth,\n    [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth,\n    [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest,\n    [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast,\n    [ANIM_STD_GO_FASTER_SOUTH] = sAnim_GoFasterSouth,\n    [ANIM_STD_GO_FASTER_NORTH] = sAnim_GoFasterNorth,\n    [ANIM_STD_GO_FASTER_WEST]  = sAnim_GoFasterWest,\n    [ANIM_STD_GO_FASTER_EAST]  = sAnim_GoFasterEast,\n    [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_GoFastestSouth,\n    [ANIM_STD_GO_FASTEST_NORTH] = sAnim_GoFastestNorth,\n    [ANIM_STD_GO_FASTEST_WEST] = sAnim_GoFastestWest,\n    [ANIM_STD_GO_FASTEST_EAST] = sAnim_GoFastestEast,\n    [ANIM_NURSE_BOW] = sAnim_NurseBow,\n};\n\nstatic const union AnimCmd *const sAnimTable_RedGreenFieldMove[] = {\n    [ANIM_FIELD_MOVE] = sAnim_FieldMove,\n};\n\nstatic const union AnimCmd *const sAnimTable_RedGreenVSSeeker[] = {\n    [ANIM_VS_SEEKER] = sAnim_VSSeeker,\n};\n\nstatic const union AnimCmd *const sAnimTable_RedGreenVSSeekerBike[] = {\n    [ANIM_VS_SEEKER] = sAnim_VSSeekerBike,\n};\n\n// Unused\nstatic const union AnimCmd *const sAnimTable_BerryTree[] = {\n    sAnim_BerryTreeStage0,\n    sAnim_BerryTreeStage1,\n    sAnim_BerryTreeStage2,\n    sAnim_BerryTreeStage3,\n    sAnim_BerryTreeStage4,\n};\n\nstatic const union AnimCmd *const sAnimTable_RockSmashRock[] = {\n    [ANIM_STAY_STILL] = sAnim_StayStill,\n    [ANIM_REMOVE_OBSTACLE] = sAnim_RockBreak,\n};\n\nstatic const union AnimCmd *const sAnimTable_CutTree[] = {\n    [ANIM_STAY_STILL] = sAnim_StayStill,\n    [ANIM_REMOVE_OBSTACLE] = sAnim_TreeCut,\n};\n\nstatic const union AnimCmd *const sAnimTable_RedGreenFish[] = {\n    [ANIM_TAKE_OUT_ROD_SOUTH] = sAnim_TakeOutRodSouth,\n    [ANIM_TAKE_OUT_ROD_NORTH] = sAnim_TakeOutRodNorth,\n    [ANIM_TAKE_OUT_ROD_WEST] = sAnim_TakeOutRodWest,\n    [ANIM_TAKE_OUT_ROD_EAST] = sAnim_TakeOutRodEast,\n    [ANIM_PUT_AWAY_ROD_SOUTH] = sAnim_PutAwayRodSouth,\n    [ANIM_PUT_AWAY_ROD_NORTH] = sAnim_PutAwayRodNorth,\n    [ANIM_PUT_AWAY_ROD_WEST] = sAnim_PutAwayRodWest,\n    [ANIM_PUT_AWAY_ROD_EAST] = sAnim_PutAwayRodEast,\n    [ANIM_HOOKED_POKEMON_SOUTH] = sAnim_HookedPokemonSouth,\n    [ANIM_HOOKED_POKEMON_NORTH] = sAnim_HookedPokemonNorth,\n    [ANIM_HOOKED_POKEMON_WEST] = sAnim_HookedPokemonWest,\n    [ANIM_HOOKED_POKEMON_EAST] = sAnim_HookedPokemonEast,\n};\n\nstatic const struct StepAnimTable sStepAnimTables[] = {\n    {\n        .anims = sAnimTable_QuintyPlump,\n        .animPos = {1, 3, 0, 2},\n    },\n    {\n        .anims = sAnimTable_Standard,\n        .animPos = {1, 3, 0, 2},\n    },\n    {\n        .anims = sAnimTable_RedGreenNormal,\n        .animPos = {1, 3, 0, 2},\n    },\n    {\n        .anims = sAnimTable_AcroBike,\n        .animPos = {1, 3, 0, 2},\n    },\n    {\n        .anims = sAnimTable_RedGreenSurf,\n        .animPos = {1, 3, 0, 2},\n    },\n    {\n        .anims = sAnimTable_Nurse,\n        .animPos = {1, 3, 0, 2},\n    },\n    {\n        .anims = sAnimTable_RedGreenFish,\n        .animPos = {1, 3, 0, 2},\n    },\n    {\n        .anims = sAnimTable_Unknown,\n        .animPos = {3, 7, 0, 4},\n    },\n    {}\n};\n"
  },
  {
    "path": "src/data/object_events/object_event_graphics.h",
    "content": "const u16 gObjectEventPal_Player[] = INCBIN_U16(\"graphics/object_events/palettes/player.gbapal\");\nconst u16 gObjectEventPal_PlayerUnused[] = INCBIN_U16(\"graphics/object_events/palettes/player_unused.gbapal\"); // Identical except for the transparency\nconst u16 gObjectEventPaletteNull1[16] = {};\nconst u16 gObjectEventPaletteNull2[16] = {};\nconst u16 gObjectEventPaletteNull3[16] = {};\nconst u16 gObjectEventPaletteNull4[16] = {};\nconst u16 gObjectEventPaletteNull5[16] = {};\nconst u16 gObjectEventPaletteNull6[16] = {};\nconst u16 gObjectEventPaletteNull7[16] = {};\nconst u16 gObjectEventPaletteNull8[16] = {};\nconst u16 gObjectEventPaletteNull9[16] = {};\nconst u16 gObjectEventPaletteNull10[16] = {};\nconst u16 gObjectEventPaletteNull11[16] = {};\nconst u16 gObjectEventPaletteNull12[16] = {};\nconst u16 gObjectEventPaletteNull13[16] = {};\nconst u16 gObjectEventPaletteNull14[16] = {};\nconst u16 gObjectEventPic_RedNormal[] = INCBIN_U16(\"graphics/object_events/pics/people/red_normal.4bpp\");\nconst u16 gObjectEventPic_RedSurfRun[] = INCBIN_U16(\"graphics/object_events/pics/people/red_surf_run.4bpp\");\nconst u16 gObjectEventPic_GreenNormal[] = INCBIN_U16(\"graphics/object_events/pics/people/green_normal.4bpp\");\nconst u16 gObjectEventPic_GreenSurfRun[] = INCBIN_U16(\"graphics/object_events/pics/people/green_surf_run.4bpp\");\nconst u16 gObjectEventPal_PlayerReflection[] = INCBIN_U16(\"graphics/object_events/palettes/player_reflection.gbapal\");\nconst u16 gObjectEventPal_BridgeReflection[] = INCBIN_U16(\"graphics/object_events/palettes/bridge_reflection.gbapal\");\nconst u16 gObjectEventPic_RedItem[] = INCBIN_U16(\"graphics/object_events/pics/people/red_item.4bpp\");\nconst u16 gObjectEventPic_GreenItem[] = INCBIN_U16(\"graphics/object_events/pics/people/green_item.4bpp\");\nconst u16 gObjectEventPic_RedSurf[] = INCBIN_U16(\"graphics/object_events/pics/people/red_surf.4bpp\");\nconst u16 gObjectEventPic_GreenSurf[] = INCBIN_U16(\"graphics/object_events/pics/people/green_surf.4bpp\");\nconst u16 gObjectEventPic_RedBike[] = INCBIN_U16(\"graphics/object_events/pics/people/red_bike.4bpp\");\nconst u16 gObjectEventPic_RedVSSeekerBike[] = INCBIN_U16(\"graphics/object_events/pics/people/red_vs_seeker_bike.4bpp\");\nconst u16 gObjectEventPic_GreenBike[] = INCBIN_U16(\"graphics/object_events/pics/people/green_bike.4bpp\");\nconst u16 gObjectEventPic_GreenVSSeekerBike[] = INCBIN_U16(\"graphics/object_events/pics/people/green_vs_seeker_bike.4bpp\");\nconst u16 gObjectEventPic_RSBrendan[] = INCBIN_U16(\"graphics/object_events/pics/people/rs_brendan.4bpp\");\nconst u16 gObjectEventPic_RSMay[] = INCBIN_U16(\"graphics/object_events/pics/people/rs_may.4bpp\");\nconst u16 gObjectEventPic_RedFish[] = INCBIN_U16(\"graphics/object_events/pics/people/red_fish.4bpp\");\nconst u16 gObjectEventPic_GreenFish[] = INCBIN_U16(\"graphics/object_events/pics/people/green_fish.4bpp\");\nconst u16 gObjectEventPic_Pokedex[] = INCBIN_U16(\"graphics/object_events/pics/misc/pokedex.4bpp\");\nconst u16 gObjectEventPic_TownMap[] = INCBIN_U16(\"graphics/object_events/pics/misc/town_map.4bpp\");\nconst u16 gObjectEventPic_UnusedMan[] = INCBIN_U16(\"graphics/object_events/pics/people/unused_man.4bpp\"); // Unused\nconst u16 gObjectEventPic_Giovanni[] = INCBIN_U16(\"graphics/object_events/pics/people/giovanni.4bpp\");\nconst u16 gObjectEventPic_Blaine[] = INCBIN_U16(\"graphics/object_events/pics/people/blaine.4bpp\");\nconst u16 gObjectEventPic_Sabrina[] = INCBIN_U16(\"graphics/object_events/pics/people/sabrina.4bpp\");\nconst u16 gObjectEventPic_Daisy[] = INCBIN_U16(\"graphics/object_events/pics/people/daisy.4bpp\");\nconst u16 gObjectEventPic_Lorelei[] = INCBIN_U16(\"graphics/object_events/pics/people/lorelei.4bpp\");\nconst u16 gObjectEventPic_Erika[] = INCBIN_U16(\"graphics/object_events/pics/people/erika.4bpp\");\nconst u16 gObjectEventPic_Koga[] = INCBIN_U16(\"graphics/object_events/pics/people/koga.4bpp\");\nconst u16 gObjectEventPic_Brock[] = INCBIN_U16(\"graphics/object_events/pics/people/brock.4bpp\");\nconst u16 gObjectEventPic_LtSurge[] = INCBIN_U16(\"graphics/object_events/pics/people/lt_surge.4bpp\");\nconst u16 gObjectEventPic_Bill[] = INCBIN_U16(\"graphics/object_events/pics/people/bill.4bpp\");\nconst u16 gObjectEventPal_NpcBlue[] = INCBIN_U16(\"graphics/object_events/palettes/npc_blue.gbapal\");\nconst u16 gObjectEventPal_NpcPink[] = INCBIN_U16(\"graphics/object_events/palettes/npc_pink.gbapal\");\nconst u16 gObjectEventPal_NpcGreen[] = INCBIN_U16(\"graphics/object_events/palettes/npc_green.gbapal\");\nconst u16 gObjectEventPal_NpcWhite[] = INCBIN_U16(\"graphics/object_events/palettes/npc_white.gbapal\");\nconst u16 gObjectEventPal_NpcBlueReflection[] = INCBIN_U16(\"graphics/object_events/palettes/npc_blue_reflection.gbapal\");\nconst u16 gObjectEventPal_NpcPinkReflection[] = INCBIN_U16(\"graphics/object_events/palettes/npc_pink_reflection.gbapal\");\nconst u16 gObjectEventPal_NpcGreenReflection[] = INCBIN_U16(\"graphics/object_events/palettes/npc_green_reflection.gbapal\");\nconst u16 gObjectEventPal_NpcWhiteReflection[] = INCBIN_U16(\"graphics/object_events/palettes/npc_white_reflection.gbapal\");\nconst u16 gUnderwaterEventObjectPalette[] = INCBIN_U16(\"graphics/object_events/palettes/underwater_sprites.gbapal\");\nconst u16 gObjectEventPic_LittleBoy[] = INCBIN_U16(\"graphics/object_events/pics/people/little_boy.4bpp\");\nconst u16 gObjectEventPic_LittleGirl[] = INCBIN_U16(\"graphics/object_events/pics/people/little_girl.4bpp\");\nconst u16 gObjectEventPic_SittingBoy[] = INCBIN_U16(\"graphics/object_events/pics/people/sitting_boy.4bpp\");\nconst u16 gObjectEventPic_Lass[] = INCBIN_U16(\"graphics/object_events/pics/people/lass.4bpp\");\nconst u16 gObjectEventPic_Youngster[] = INCBIN_U16(\"graphics/object_events/pics/people/youngster.4bpp\");\nconst u16 gObjectEventPic_Boy[] = INCBIN_U16(\"graphics/object_events/pics/people/boy.4bpp\");\nconst u16 gObjectEventPic_Woman1[] = INCBIN_U16(\"graphics/object_events/pics/people/woman_1.4bpp\");\nconst u16 gObjectEventPic_Woman3[] = INCBIN_U16(\"graphics/object_events/pics/people/woman_3.4bpp\");\nconst u16 gObjectEventPic_BugCatcher[] = INCBIN_U16(\"graphics/object_events/pics/people/bug_catcher.4bpp\");\nconst u16 gObjectEventPic_BattleGirl[] = INCBIN_U16(\"graphics/object_events/pics/people/battle_girl.4bpp\");\nconst u16 gObjectEventPic_RichBoy[] = INCBIN_U16(\"graphics/object_events/pics/people/rich_boy.4bpp\"); // Unused\nconst u16 gObjectEventPic_FatMan[] = INCBIN_U16(\"graphics/object_events/pics/people/fat_man.4bpp\");\nconst u16 gObjectEventPic_BaldingMan[] = INCBIN_U16(\"graphics/object_events/pics/people/balding_man.4bpp\");\nconst u16 gObjectEventPic_Woman2[] = INCBIN_U16(\"graphics/object_events/pics/people/woman_2.4bpp\");\nconst u16 gObjectEventPic_OldMan1[] = INCBIN_U16(\"graphics/object_events/pics/people/old_man_1.4bpp\");\nconst u16 gObjectEventPic_OldManLyingDown[] = INCBIN_U16(\"graphics/object_events/pics/people/old_man_lying_down.4bpp\");\nconst u16 gObjectEventPic_WorkerM[] = INCBIN_U16(\"graphics/object_events/pics/people/worker_m.4bpp\");\nconst u16 gObjectEventPic_WorkerF[] = INCBIN_U16(\"graphics/object_events/pics/people/worker_f.4bpp\");\nconst u16 gObjectEventPic_Beauty[] = INCBIN_U16(\"graphics/object_events/pics/people/beauty.4bpp\");\nconst u16 gObjectEventPic_Chef[] = INCBIN_U16(\"graphics/object_events/pics/people/chef.4bpp\");\nconst u16 gObjectEventPic_OldMan2[] = INCBIN_U16(\"graphics/object_events/pics/people/old_man_2.4bpp\");\nconst u16 gObjectEventPic_OldWoman[] = INCBIN_U16(\"graphics/object_events/pics/people/old_woman.4bpp\");\nconst u16 gObjectEventPic_Camper[] = INCBIN_U16(\"graphics/object_events/pics/people/camper.4bpp\");\nconst u16 gObjectEventPic_Picnicker[] = INCBIN_U16(\"graphics/object_events/pics/people/picnicker.4bpp\");\nconst u16 gObjectEventPic_CooltrainerM[] = INCBIN_U16(\"graphics/object_events/pics/people/cooltrainer_m.4bpp\");\nconst u16 gObjectEventPic_CooltrainerF[] = INCBIN_U16(\"graphics/object_events/pics/people/cooltrainer_f.4bpp\");\nconst u16 gObjectEventPic_Psyduck[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/psyduck.4bpp\");\nconst u16 gObjectEventPic_SuperNerd[] = INCBIN_U16(\"graphics/object_events/pics/people/super_nerd.4bpp\");\nconst u16 gObjectEventPic_Channeler[] = INCBIN_U16(\"graphics/object_events/pics/people/channeler.4bpp\");\nconst u16 gObjectEventPic_RocketF[] = INCBIN_U16(\"graphics/object_events/pics/people/rocket_f.4bpp\");\nconst u16 gObjectEventPic_SwimmerMWater[] = INCBIN_U16(\"graphics/object_events/pics/people/swimmer_m_water.4bpp\");\nconst u16 gObjectEventPic_SwimmerFWater[] = INCBIN_U16(\"graphics/object_events/pics/people/swimmer_f_water.4bpp\");\nconst u16 gObjectEventPic_SwimmerMLand[] = INCBIN_U16(\"graphics/object_events/pics/people/swimmer_m_land.4bpp\");\nconst u16 gObjectEventPic_SwimmerFLand[] = INCBIN_U16(\"graphics/object_events/pics/people/swimmer_f_land.4bpp\");\nconst u16 gObjectEventPic_Blackbelt[] = INCBIN_U16(\"graphics/object_events/pics/people/blackbelt.4bpp\");\nconst u16 gObjectEventPic_Scientist[] = INCBIN_U16(\"graphics/object_events/pics/people/scientist.4bpp\");\nconst u16 gObjectEventPic_Gentleman[] = INCBIN_U16(\"graphics/object_events/pics/people/gentleman.4bpp\");\nconst u16 gObjectEventPic_Sailor[] = INCBIN_U16(\"graphics/object_events/pics/people/sailor.4bpp\");\nconst u16 gObjectEventPic_Captain[] = INCBIN_U16(\"graphics/object_events/pics/people/captain.4bpp\");\nconst u16 gObjectEventPic_Fisher[] = INCBIN_U16(\"graphics/object_events/pics/people/fisher.4bpp\");\nconst u16 gObjectEventPic_TeachyTVHost[] = INCBIN_U16(\"graphics/object_events/pics/people/teachy_tv_host.4bpp\");\nconst u16 gObjectEventPic_UnusedWoman[] = INCBIN_U16(\"graphics/object_events/pics/people/unused_woman.4bpp\");\nconst u16 gObjectEventPic_TuberF[] = INCBIN_U16(\"graphics/object_events/pics/people/tuber_f.4bpp\");\nconst u16 gObjectEventPic_TuberMWater[] = INCBIN_U16(\"graphics/object_events/pics/people/tuber_m_water.4bpp\");\nconst u16 gObjectEventPic_TuberMLand[] = INCBIN_U16(\"graphics/object_events/pics/people/tuber_m_land.4bpp\");\nconst u16 gObjectEventPic_Hiker[] = INCBIN_U16(\"graphics/object_events/pics/people/hiker.4bpp\");\nconst u16 gObjectEventPic_Biker[] = INCBIN_U16(\"graphics/object_events/pics/people/biker.4bpp\");\nconst u16 gObjectEventPic_GymGuy[] = INCBIN_U16(\"graphics/object_events/pics/people/gym_guy.4bpp\");\nconst u16 gObjectEventPic_Man[] = INCBIN_U16(\"graphics/object_events/pics/people/man.4bpp\");\nconst u16 gObjectEventPic_Rocker[] = INCBIN_U16(\"graphics/object_events/pics/people/rocker.4bpp\");\nconst u16 gObjectEventPic_ProfOak[] = INCBIN_U16(\"graphics/object_events/pics/people/prof_oak.4bpp\");\nconst u16 gObjectEventPic_Blue[] = INCBIN_U16(\"graphics/object_events/pics/people/blue.4bpp\");\nconst u16 gObjectEventPic_Nurse[] = INCBIN_U16(\"graphics/object_events/pics/people/nurse.4bpp\");\nconst u16 gObjectEventPic_CableClubReceptionist[] = INCBIN_U16(\"graphics/object_events/pics/people/cable_club_receptionist.4bpp\");\nconst u16 gObjectEventPic_UnionRoomReceptionist[] = INCBIN_U16(\"graphics/object_events/pics/people/union_room_receptionist.4bpp\");\nconst u16 gObjectEventPic_UnusedMaleReceptionist[] = INCBIN_U16(\"graphics/object_events/pics/people/unused_male_receptionist.4bpp\");\nconst u16 gObjectEventPic_ItemBall[] = INCBIN_U16(\"graphics/object_events/pics/misc/item_ball.4bpp\");\nconst u16 gObjectEventPic_MrFuji[] = INCBIN_U16(\"graphics/object_events/pics/people/mr_fuji.4bpp\");\nconst u16 gObjectEventPic_Bruno[] = INCBIN_U16(\"graphics/object_events/pics/people/bruno.4bpp\");\nconst u16 gObjectEventPic_Clerk[] = INCBIN_U16(\"graphics/object_events/pics/people/clerk.4bpp\");\nconst u16 gObjectEventPic_MGDeliveryman[] = INCBIN_U16(\"graphics/object_events/pics/people/mg_deliveryman.4bpp\");\nconst u16 gObjectEventPic_TrainerTowerDude[] = INCBIN_U16(\"graphics/object_events/pics/people/trainer_tower_dude.4bpp\");\nconst u16 gObjectEventPic_Cameraman[] = INCBIN_U16(\"graphics/object_events/pics/people/cameraman.4bpp\"); // Unused\nconst u16 gObjectEventPic_RocketM[] = INCBIN_U16(\"graphics/object_events/pics/people/rocket_m.4bpp\");\nconst u16 gObjectEventPic_Celio[] = INCBIN_U16(\"graphics/object_events/pics/people/celio.4bpp\");\nconst u16 gObjectEventPic_Lapras[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/lapras.4bpp\");\nconst u16 gObjectEventPic_Zapdos[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/zapdos.4bpp\");\nconst u16 gObjectEventPic_Moltres[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/moltres.4bpp\");\nconst u16 gObjectEventPic_Articuno[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/articuno.4bpp\");\nconst u16 gObjectEventPic_Mewtwo[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/mewtwo.4bpp\");\nconst u16 gObjectEventPic_Mew[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/mew.4bpp\");\nconst u16 gObjectEventPic_Entei[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/entei.4bpp\");\nconst u16 gObjectEventPic_Raikou[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/raikou.4bpp\");\nconst u16 gObjectEventPic_Suicune[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/suicune.4bpp\");\nconst u16 gObjectEventPic_Lugia[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/lugia.4bpp\");\nconst u16 gObjectEventPic_HoOh[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/ho_oh.4bpp\");\nconst u16 gObjectEventPic_Celebi[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/celebi.4bpp\");\nconst u16 gObjectEventPic_DeoxysD[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/deoxys_d.4bpp\");\nconst u16 gObjectEventPic_DeoxysA[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/deoxys_a.4bpp\");\nconst u16 gObjectEventPic_DeoxysN[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/deoxys_n.4bpp\");\nconst u16 gObjectEventPic_Agatha[] = INCBIN_U16(\"graphics/object_events/pics/people/agatha.4bpp\");\nconst u16 gObjectEventPic_Misty[] = INCBIN_U16(\"graphics/object_events/pics/people/misty.4bpp\");\nconst u16 gObjectEventPic_Lance[] = INCBIN_U16(\"graphics/object_events/pics/people/lance.4bpp\");\nconst u16 gObjectEventPic_GBAKid[] = INCBIN_U16(\"graphics/object_events/pics/people/gba_kid.4bpp\");\nconst u16 gObjectEventPic_Mom[] = INCBIN_U16(\"graphics/object_events/pics/people/mom.4bpp\");\nconst u16 gObjectEventPic_Pidgeot[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/pidgeot.4bpp\");\nconst u16 gObjectEventPic_Omanyte[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/omanyte.4bpp\");\nconst u16 gObjectEventPic_Kangaskhan[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/kangaskhan.4bpp\");\nconst u16 gObjectEventPic_NidoranF[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/nidoran_f.4bpp\");\nconst u16 gObjectEventPic_NidoranM[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/nidoran_m.4bpp\");\nconst u16 gObjectEventPic_Nidorino[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/nidorino.4bpp\");\nconst u16 gObjectEventPic_Meowth[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/meowth.4bpp\");\nconst u16 gObjectEventPic_Seel[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/seel.4bpp\");\nconst u16 gObjectEventPic_Voltorb[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/voltorb.4bpp\");\nconst u16 gObjectEventPic_Slowpoke[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/slowpoke.4bpp\");\nconst u16 gObjectEventPic_Slowbro[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/slowbro.4bpp\");\nconst u16 gObjectEventPic_Machop[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/machop.4bpp\");\nconst u16 gObjectEventPic_Wigglytuff[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/wigglytuff.4bpp\");\nconst u16 gObjectEventPic_Doduo[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/doduo.4bpp\");\nconst u16 gObjectEventPic_Fearow[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/fearow.4bpp\");\nconst u16 gObjectEventPic_Kabuto[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/kabuto.4bpp\");\nconst u16 gObjectEventPic_Machoke[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/machoke.4bpp\");\nconst u16 gObjectEventPic_Snorlax[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/snorlax.4bpp\");\nconst u16 gObjectEventPic_Spearow[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/spearow.4bpp\");\nconst u16 gObjectEventPic_Cubone[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/cubone.4bpp\");\nconst u16 gObjectEventPic_Poliwrath[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/poliwrath.4bpp\");\nconst u16 gObjectEventPic_Chansey[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/chansey.4bpp\");\nconst u16 gObjectEventPic_Pikachu[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/pikachu.4bpp\");\nconst u16 gObjectEventPic_Jigglypuff[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/jigglypuff.4bpp\");\nconst u16 gObjectEventPic_Pidgey[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/pidgey.4bpp\");\nconst u16 gObjectEventPic_Clefairy[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/clefairy.4bpp\");\nconst u16 gObjectEventPic_CutTree[] = INCBIN_U16(\"graphics/object_events/pics/misc/cut_tree.4bpp\");\nconst u16 gObjectEventPic_RockSmashRock[] = INCBIN_U16(\"graphics/object_events/pics/misc/rock_smash_rock.4bpp\");\nconst u16 gObjectEventPic_StrengthBoulder[] = INCBIN_U16(\"graphics/object_events/pics/misc/strength_boulder.4bpp\");\nconst u16 gObjectEventPic_Fossil[] = INCBIN_U16(\"graphics/object_events/pics/misc/fossil.4bpp\");\nconst u16 gObjectEventPic_Ruby[] = INCBIN_U16(\"graphics/object_events/pics/misc/ruby.4bpp\");\nconst u16 gObjectEventPic_Sapphire[] = INCBIN_U16(\"graphics/object_events/pics/misc/sapphire.4bpp\");\nconst u16 gObjectEventPic_OldAmber[] = INCBIN_U16(\"graphics/object_events/pics/misc/old_amber.4bpp\");\nconst u16 gObjectEventPic_GymSign[] = INCBIN_U16(\"graphics/object_events/pics/misc/gym_sign.4bpp\");\nconst u16 gObjectEventPic_Sign[] = INCBIN_U16(\"graphics/object_events/pics/misc/sign.4bpp\");\nconst u16 gObjectEventPic_WoodenSign[] = INCBIN_U16(\"graphics/object_events/pics/misc/wooden_sign.4bpp\");\nconst u16 gObjectEventPic_Clipboard[] = INCBIN_U16(\"graphics/object_events/pics/misc/clipboard.4bpp\");\nconst u16 gObjectEventPic_CableCar[] = INCBIN_U16(\"graphics/object_events/pics/misc/cable_car.4bpp\");\nconst u16 gObjectEventPal_CableCar[] = INCBIN_U16(\"graphics/object_events/palettes/cable_car.gbapal\");\nconst u16 gObjectEventPic_Sudowoodo[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/sudowoodo.4bpp\");\nconst u16 gObjectEventPic_Abra[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/abra.4bpp\");\nconst u16 gObjectEventPic_SwimmerFWater2[] = INCBIN_U16(\"graphics/object_events/pics/people/swimmer_f_water_2.4bpp\");\nconst u16 gObjectEventPal_Meteorite[] = INCBIN_U16(\"graphics/object_events/palettes/meteorite.gbapal\");\nconst u16 gObjectEventPic_BirthIslandStone[] = INCBIN_U16(\"graphics/object_events/pics/misc/birth_island_stone.4bpp\");\nconst u16 gObjectEventPic_LaprasDoll[] = INCBIN_U16(\"graphics/object_events/pics/misc/lapras_doll.4bpp\");\nconst u16 gObjectEventPal_Seagallop[] = INCBIN_U16(\"graphics/object_events/palettes/seagallop.gbapal\");\nconst u16 gObjectEventPic_Seagallop[] = INCBIN_U16(\"graphics/object_events/pics/misc/seagallop.4bpp\");\nconst u16 gObjectEventPal_SSAnne[] = INCBIN_U16(\"graphics/object_events/palettes/ss_anne.gbapal\");\nconst u16 gEmBrendanPalette[] = INCBIN_U16(\"graphics/object_events/palettes/22.gbapal\");\nconst u16 gEmMayPalette[] = INCBIN_U16(\"graphics/object_events/palettes/23.gbapal\");\nconst u16 gObjectEventPic_SSAnne[] = INCBIN_U16(\"graphics/object_events/pics/misc/ss_anne.4bpp\");\nconst u16 gObjectEventPic_SurfBlob[] = INCBIN_U16(\"graphics/object_events/pics/misc/surf_blob.4bpp\");\nconst u16 gObjectEventPic_Policeman[] = INCBIN_U16(\"graphics/object_events/pics/people/policeman.4bpp\");\nconst u16 gObjectEventPic_CueBall[] = INCBIN_U16(\"graphics/object_events/pics/people/cue_ball.4bpp\");\nconst u16 gObjectEventPic_Painter[] = INCBIN_U16(\"graphics/object_events/pics/people/painter.4bpp\");\nconst u16 gObjectEventPic_BirdKeeper[] = INCBIN_U16(\"graphics/object_events/pics/people/bird_keeper.4bpp\");\nconst u16 gObjectEventPic_Burglar[] = INCBIN_U16(\"graphics/object_events/pics/people/burglar.4bpp\");\nconst u16 gObjectEventPic_PokemonRangerF[] = INCBIN_U16(\"graphics/object_events/pics/people/pokemon_ranger_f.4bpp\");\nconst u16 gObjectEventPic_PokemonRangerM[] = INCBIN_U16(\"graphics/object_events/pics/people/pokemon_ranger_m.4bpp\");\nconst u16 gObjectEventPic_RuinManiac[] = INCBIN_U16(\"graphics/object_events/pics/people/ruin_maniac.4bpp\");\nconst u16 gObjectEventPic_PokeManiac[] = INCBIN_U16(\"graphics/object_events/pics/people/pokemaniac.4bpp\");\nconst u16 gObjectEventPic_PsychicM[] = INCBIN_U16(\"graphics/object_events/pics/people/psychic_m.4bpp\");\nconst u16 gObjectEventPic_PsychicF[] = INCBIN_U16(\"graphics/object_events/pics/people/psychic_f.4bpp\");\nconst u16 gObjectEventPic_AromaLady[] = INCBIN_U16(\"graphics/object_events/pics/people/aroma_lady.4bpp\");\nconst u16 gObjectEventPic_Twin[] = INCBIN_U16(\"graphics/object_events/pics/people/twin.4bpp\");\nconst u16 gObjectEventPic_YoungCoupleM[] = INCBIN_U16(\"graphics/object_events/pics/people/young_couple_m.4bpp\");\nconst u16 gObjectEventPic_YoungCoupleF[] = INCBIN_U16(\"graphics/object_events/pics/people/young_couple_f.4bpp\");\nconst u16 gObjectEventPic_Engineer[] = INCBIN_U16(\"graphics/object_events/pics/people/engineer.4bpp\");\nconst u16 gObjectEventPic_Juggler[] = INCBIN_U16(\"graphics/object_events/pics/people/juggler.4bpp\");\nconst u16 gObjectEventPic_Tamer[] = INCBIN_U16(\"graphics/object_events/pics/people/tamer.4bpp\");\nconst u16 gObjectEventPic_PokemonBreeder[] = INCBIN_U16(\"graphics/object_events/pics/people/pokemon_breeder.4bpp\");\nconst u16 gObjectEventPic_RedUnderwater[] = INCBIN_U16(\"graphics/object_events/pics/people/red_underwater.4bpp\");\nconst u16 gObjectEventPic_GreenUnderwater[] = INCBIN_U16(\"graphics/object_events/pics/people/green_underwater.4bpp\");\nconst u16 gObjectEventPic_Scott[] = INCBIN_U16(\"graphics/object_events/pics/people/scott.4bpp\");\nconst u16 gObjectEventPic_Bulbasaur[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/bulbasaur.4bpp\");\nconst u16 gObjectEventPic_Charmander[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/charmander.4bpp\");\nconst u16 gObjectEventPic_Squirtle[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/squirtle.4bpp\");\nconst u16 gObjectEventPic_Latias[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/latias.4bpp\");\nconst u16 gObjectEventPic_Latios[] = INCBIN_U16(\"graphics/object_events/pics/pokemon/latios.4bpp\");\nconst u16 gObjectEventPic_EmBrendan[] = INCBIN_U16(\"graphics/object_events/pics/people/em_brendan.4bpp\");\nconst u16 gObjectEventPic_EmMay[] = INCBIN_U16(\"graphics/object_events/pics/people/em_may.4bpp\");\nconst u16 gObjectEventPic_MasterBeauty[] = INCBIN_U16(\"graphics/object_events/pics/people/master_beauty.4bpp\");\nconst u16 gObjectEventPic_MasterBirdKeeper[] = INCBIN_U16(\"graphics/object_events/pics/people/master_bird_keeper.4bpp\");\nconst u16 gObjectEventPic_MasterBlackbelt[] = INCBIN_U16(\"graphics/object_events/pics/people/master_blackbelt.4bpp\");\nconst u16 gObjectEventPic_MasterBugCatcher[] = INCBIN_U16(\"graphics/object_events/pics/people/master_bug_catcher.4bpp\");\nconst u16 gObjectEventPic_MasterCooltrainerM[] = INCBIN_U16(\"graphics/object_events/pics/people/master_cooltrainer_m.4bpp\");\nconst u16 gObjectEventPic_MasterHiker[] = INCBIN_U16(\"graphics/object_events/pics/people/master_hiker.4bpp\");\nconst u16 gObjectEventPic_MasterLass[] = INCBIN_U16(\"graphics/object_events/pics/people/master_lass.4bpp\");\nconst u16 gObjectEventPic_MasterPsychicM[] = INCBIN_U16(\"graphics/object_events/pics/people/master_psychic_m.4bpp\");\nconst u16 gObjectEventPic_MasterScientist[] = INCBIN_U16(\"graphics/object_events/pics/people/master_scientist.4bpp\");\nconst u16 gObjectEventPic_MasterYoungster[] = INCBIN_U16(\"graphics/object_events/pics/people/master_youngster.4bpp\");\nconst u16 gObjectEventPal_RSQuintyPlump[] = INCBIN_U16(\"graphics/object_events/palettes/rs_quinty_plump.gbapal\");\nconst u16 gObjectEventPal_RSQuintyPlumpReflection[] = INCBIN_U16(\"graphics/object_events/palettes/rs_quinty_plump_reflection.gbapal\");\nconst u16 gObjectEventPic_Lady[] = INCBIN_U16(\"graphics/object_events/pics/people/lady.4bpp\");\nconst u16 gObjectEventPal_Lady[] = INCBIN_U16(\"graphics/object_events/palettes/lady.gbapal\");\nconst u16 gObjectEventPic_Rocker2[] = INCBIN_U16(\"graphics/object_events/pics/people/rocker_2.4bpp\");\nconst u16 gObjectEventPic_Anabel[] = INCBIN_U16(\"graphics/object_events/pics/people/anabel.4bpp\");\nconst u16 gObjectEventPic_Tucker[] = INCBIN_U16(\"graphics/object_events/pics/people/tucker.4bpp\");\nconst u16 gObjectEventPic_Greta[] = INCBIN_U16(\"graphics/object_events/pics/people/greta.4bpp\");\nconst u16 gObjectEventPic_Spenser[] = INCBIN_U16(\"graphics/object_events/pics/people/spenser.4bpp\");\nconst u16 gObjectEventPic_Noland[] = INCBIN_U16(\"graphics/object_events/pics/people/noland.4bpp\");\nconst u16 gObjectEventPic_Lucy[] = INCBIN_U16(\"graphics/object_events/pics/people/lucy.4bpp\");\nconst u16 gObjectEventPic_Brandon[] = INCBIN_U16(\"graphics/object_events/pics/people/brandon.4bpp\");\nconst u16 gFieldEffectObjectPic_ShadowSmall[] = INCBIN_U16(\"graphics/field_effects/pics/shadow_small.4bpp\");\nconst u16 gFieldEffectObjectPic_ShadowMedium[] = INCBIN_U16(\"graphics/field_effects/pics/shadow_medium.4bpp\");\nconst u16 gFieldEffectObjectPic_ShadowLarge[] = INCBIN_U16(\"graphics/field_effects/pics/shadow_large.4bpp\");\nconst u16 gFieldEffectObjectPic_ShadowExtraLarge[] = INCBIN_U16(\"graphics/field_effects/pics/shadow_extra_large.4bpp\");\nconst u16 sFiller1[0x90] = {};\nconst u16 gFieldEffectObjectPic_CutGrass[] = INCBIN_U16(\"graphics/field_effects/fldeff_cut.4bpp\");\nconst u16 gFieldEffectObjectPic_CutGrass2[] = INCBIN_U16(\"graphics/field_effects/fldeff_cut.4bpp\"); // Unused\nconst u16 gFieldEffectPal_CutGrass[] = INCBIN_U16(\"graphics/field_effects/fldeff_cut.gbapal\");\nconst u16 gFieldEffectObjectPic_Ripple[] = INCBIN_U16(\"graphics/field_effects/pics/ripple.4bpp\");\nconst u16 gFieldEffectObjectPic_Ash[] = INCBIN_U16(\"graphics/field_effects/pics/ash.4bpp\");\nconst u16 gFieldEffectObjectPic_Arrow[] = INCBIN_U16(\"graphics/field_effects/pics/arrow.4bpp\");\nconst u16 gFieldEffectObjectPalette0[] = INCBIN_U16(\"graphics/field_effects/palettes/general_0.gbapal\");\nconst u16 gFieldEffectObjectPalette1[] = INCBIN_U16(\"graphics/field_effects/palettes/general_1.gbapal\");\nconst u16 sFiller2[0x10] = {};\nconst u16 gFieldEffectObjectPic_GroundImpactDust[] = INCBIN_U16(\"graphics/field_effects/pics/ground_impact_dust.4bpp\");\nconst u16 gFieldEffectObjectPic_UnusedGrass3[] = INCBIN_U16(\"graphics/field_effects/pics/unused_grass_3.4bpp\"); // Unused\nconst u16 gFieldEffectObjectPic_JumpTallGrass[] = INCBIN_U16(\"graphics/field_effects/pics/jump_tall_grass.4bpp\");\nconst u16 gFieldEffectObjectPic_UnusedGrass4[] = INCBIN_U16(\"graphics/field_effects/pics/unused_grass_4.4bpp\"); // Unused\nconst u16 gFieldEffectObjectPic_JumpLongGrass[] = INCBIN_U16(\"graphics/field_effects/pics/jump_long_grass.4bpp\");\nconst u16 gFieldEffectObjectPic_UnusedGrass[] = INCBIN_U16(\"graphics/field_effects/pics/unused_grass.4bpp\");\nconst u16 gFieldEffectObjectPic_UnusedGrass2[] = INCBIN_U16(\"graphics/field_effects/pics/unused_grass_2.4bpp\");\nconst u16 gFieldEffectObjectPic_LongGrass[] = INCBIN_U16(\"graphics/field_effects/pics/long_grass.4bpp\");\nconst u16 gFieldEffectObjectPic_TallGrass[] = INCBIN_U16(\"graphics/field_effects/pics/tall_grass.4bpp\");\nconst u16 gFieldEffectObjectPic_ShortGrass[] = INCBIN_U16(\"graphics/field_effects/pics/short_grass.4bpp\");\nconst u16 gFieldEffectObjectPic_SandFootprints[] = INCBIN_U16(\"graphics/field_effects/pics/sand_footprints.4bpp\");\nconst u16 gFieldEffectObjectPic_DeepSandFootprints[] = INCBIN_U16(\"graphics/field_effects/pics/deep_sand_footprints.4bpp\");\nconst u16 gFieldEffectObjectPic_BikeTireTracks[] = INCBIN_U16(\"graphics/field_effects/pics/bike_tire_tracks.4bpp\");\nconst u16 gFieldEffectObjectPic_UnusedSand[] = INCBIN_U16(\"graphics/field_effects/pics/unused_sand.4bpp\");\nconst u16 gFieldEffectObjectPic_SandPile[] = INCBIN_U16(\"graphics/field_effects/pics/sand_pile.4bpp\");\nconst u16 gFieldEffectObjectPic_JumpBigSplash[] = INCBIN_U16(\"graphics/field_effects/pics/jump_big_splash.4bpp\");\nconst u16 gFieldEffectObjectPic_Splash[] = INCBIN_U16(\"graphics/field_effects/pics/splash.4bpp\");\nconst u16 gFieldEffectObjectPic_JumpSmallSplash[] = INCBIN_U16(\"graphics/field_effects/pics/jump_small_splash.4bpp\");\nconst u16 gFieldEffectObjectPic_WaterSurfacing[] = INCBIN_U16(\"graphics/field_effects/pics/water_surfacing.4bpp\");\nconst u16 gFieldEffectObjectPic_TreeDisguise[] = INCBIN_U16(\"graphics/field_effects/pics/tree_disguise.4bpp\");\nconst u16 gFieldEffectObjectPic_MountainDisguise[] = INCBIN_U16(\"graphics/field_effects/pics/mountain_disguise.4bpp\");\nconst u16 gFieldEffectObjectPic_SandDisguisePlaceholder[] = INCBIN_U16(\"graphics/field_effects/pics/sand_disguise.4bpp\");\nconst u16 gFieldEffectObjectPic_HotSpringsWater[] = INCBIN_U16(\"graphics/field_effects/pics/hot_springs_water.4bpp\");\nconst u16 gFieldEffectPal_Ash[] = INCBIN_U16(\"graphics/field_effects/palettes/ash.gbapal\");\nconst u16 gFieldEffectObjectPic_AshPuff[] = INCBIN_U16(\"graphics/field_effects/pics/pop_out_of_ash.4bpp\");\nconst u16 gFieldEffectObjectPic_AshLaunch[] = INCBIN_U16(\"graphics/field_effects/pics/lavaridge_warp.4bpp\");\nconst u16 gFieldEffectObjectPic_Bubbles[] = INCBIN_U16(\"graphics/field_effects/pics/underwater_bubbles.4bpp\");\nconst u16 gFieldEffectObjectPic_SmallSparkle[] = INCBIN_U16(\"graphics/field_effects/pics/small_sparkle.4bpp\");\nconst u16 gFieldEffectPal_SmallSparkle[] = INCBIN_U16(\"graphics/field_effects/palettes/small_sparkle.gbapal\");\nconst u16 gFieldEffectObjectPic_Bird[] = INCBIN_U16(\"graphics/field_effects/pics/bird.4bpp\");\nconst u16 gSevenIsland_Grass[] = INCBIN_U16(\"graphics/object_events/pics/unknown/SevenIsland_Grass.4bpp\");\nconst u16 gBlackSandFootPrints_Pal[] = INCBIN_U16(\"graphics/object_events/palettes/black_sand_footprints.gbapal\");\nconst u16 gSnowFootPrints_Pal[] = INCBIN_U16(\"graphics/object_events/palettes/snow_footprints.gbapal\");\nconst u16 gThreeIslandGrass_Pal[] = INCBIN_U16(\"graphics/object_events/palettes/three_island_grass.gbapal\");\n"
  },
  {
    "path": "src/data/object_events/object_event_graphics_info.h",
    "content": "const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedNormal = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 512,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_RedGreenNormal,\n\t.images = sPicTable_RedNormal,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedBike = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_BIKE_TIRE,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_RedBike,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedSurf = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = TRUE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_RedGreenSurf,\n\t.images = sPicTable_RedSurf,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedFieldMove = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_RedGreenFieldMove,\n\t.images = sPicTable_RedItem,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Policeman = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Policeman,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RSBrendan = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_RSBrendan,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RSMay = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_RSMay,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleBoy = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_LittleBoy,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleGirl = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_LittleGirl,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SittingBoy = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_SittingBoy,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lass = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Lass,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Youngster = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Youngster,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman1 = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Woman1,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman3 = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Woman3,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Boy = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Boy,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BattleGirl = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_BattleGirl,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BugCatcher = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_BugCatcher,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_FatMan = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_FatMan,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BaldingMan = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_BaldingMan,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman2 = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Woman2,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldMan1 = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_OldMan1,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_WorkerM = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_WorkerM,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_WorkerF = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_WorkerF,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Beauty = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Beauty,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Chef = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Chef,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldMan2 = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_OldMan2,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldWoman = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_OldWoman,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Camper = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Camper,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Picnicker = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Picnicker,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CooltrainerM = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_CooltrainerM,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CooltrainerF = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_CooltrainerF,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SuperNerd = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_SuperNerd,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Channeler = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Channeler,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RocketF = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_RocketF,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerMWater = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_SwimmerMWater,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerFWater = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_SwimmerFWater,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerMLand = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_SwimmerMLand,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerFLand = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_SwimmerFLand,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Blackbelt = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Blackbelt,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scientist = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Scientist,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Gentleman = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Gentleman,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sailor = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Sailor,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Captain = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Captain,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fisher = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Fisher,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TeachyTVHost = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_TeachyTVHost,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedWoman = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_UnusedWoman,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberF = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_TuberF,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberMWater = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_TuberMWater,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberMLand = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_TuberMLand,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Hiker = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Hiker,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Biker = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_BIKE_TIRE,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Biker,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GymGuy = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_BIKE_TIRE,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_GymGuy,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Nurse = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Nurse,\n\t.images = sPicTable_Nurse,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMaleReceptionist = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_UnusedMaleReceptionist,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ItemBall = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_ItemBall,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ProfOak = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_ProfOak,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Man,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rocker = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Rocker,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MrFuji = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_MrFuji,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bruno = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Bruno,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldManLyingDown = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_OldManLyingDown,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CutTree = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_CutTree,\n\t.images = sPicTable_CutTree,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Clerk = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Clerk,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MGDeliveryman = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_MGDeliveryman,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TrainerTowerDude = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_TrainerTowerDude,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CableClubReceptionist = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_CableClubReceptionist,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnionRoomReceptionist = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_UnionRoomReceptionist,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RockSmashRock = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_RockSmashRock,\n\t.images = sPicTable_RockSmashRock,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_StrengthBoulder = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_StrengthBoulder,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenNormal = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 512,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_RedGreenNormal,\n\t.images = sPicTable_GreenNormal,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenBike = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_BIKE_TIRE,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_GreenBike,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenSurf = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = TRUE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_RedGreenSurf,\n\t.images = sPicTable_GreenSurf,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenFieldMove = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_RedGreenFieldMove,\n\t.images = sPicTable_GreenItem,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedBikeAlt = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_SPECIAL,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_BIKE_TIRE,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_RedBike,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RocketM = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_RocketM,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Celio = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Celio,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Agatha = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Agatha,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Brock = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Brock,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Misty = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Misty,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LtSurge = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_LtSurge,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Erika = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Erika,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Koga = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Koga,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Giovanni = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Giovanni,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Blaine = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Blaine,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sabrina = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Sabrina,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bill = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Bill,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Daisy = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Daisy,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lorelei = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Lorelei,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lance = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Lance,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Blue = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Blue,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedFish = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_RedGreenFish,\n\t.images = sPicTable_RedFish,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenFish = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_RedGreenFish,\n\t.images = sPicTable_GreenFish,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedVSSeeker = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_RedGreenVSSeeker,\n\t.images = sPicTable_RedItem,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedVSSeekerBike = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_RedGreenVSSeekerBike,\n\t.images = sPicTable_RedVSSeekerBike,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenVSSeeker = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_RedGreenVSSeeker,\n\t.images = sPicTable_GreenItem,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenVSSeekerBike = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_PLAYER_RED,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_RedGreenVSSeekerBike,\n\t.images = sPicTable_GreenVSSeekerBike,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TownMap = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 32,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_32x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_TownMap,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pokedex = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_Pokedex,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GBAKid = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_GBAKid,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Snorlax = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Snorlax,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fossil = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_Fossil,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Ruby = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_Ruby,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sapphire = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_Sapphire,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldAmber = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_OldAmber,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GymSign = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_GymSign,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sign = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_Sign,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TrainerTips = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_WoodenSign,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Clipboard = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_Clipboard,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Meteorite = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_METEORITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_SPECIAL,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_BirthIslandStone,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LaprasDoll = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_S,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_LaprasDoll,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Spearow = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Spearow,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Omanyte = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Omanyte,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kangaskhan = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Kangaskhan,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Psyduck = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Psyduck,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_NidoranF = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_NidoranF,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_NidoranM = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_NidoranM,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Nidorino = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Nidorino,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Meowth = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Meowth,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Seel = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Seel,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Voltorb = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Voltorb,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Slowpoke = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Slowpoke,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Slowbro = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Slowbro,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Machop = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Machop,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Wigglytuff = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Wigglytuff,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Doduo = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Doduo,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fearow = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Fearow,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lapras = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Lapras,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Zapdos = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Zapdos,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Moltres = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Moltres,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Articuno = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Articuno,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DeoxysD = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_DeoxysD,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DeoxysA = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_DeoxysA,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DeoxysN = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_DeoxysN,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mewtwo = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Mewtwo,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mew = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Mew,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Entei = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Entei,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Raikou = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Raikou,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Suicune = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Suicune,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lugia = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Lugia,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_HoOh,\n\t.images = sPicTable_HoOh,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Celebi = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Celebi,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Cubone = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Cubone,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Machoke = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Machoke,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kabuto = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Kabuto,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Poliwrath = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Poliwrath,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pidgeot = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Pidgeot,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Chansey = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Chansey,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pikachu = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Pikachu,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Jigglypuff = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Jigglypuff,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pidgey = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Pidgey,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Clefairy = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Clefairy,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mom = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Mom,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Seagallop = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_SEAGALLOP,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 2048,\n\t.width = 64,\n\t.height = 64,\n\t.paletteSlot = PALSLOT_NPC_SPECIAL,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_64x64,\n\t.subspriteTables = gObjectEventSpriteOamTables_64x64,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Seagallop,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SSAnne = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_SS_ANNE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 4096,\n\t.width = 128,\n\t.height = 64,\n\t.paletteSlot = PALSLOT_NPC_SPECIAL,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_8x8,\n\t.subspriteTables = gObjectEventSpriteOamTables_128x64,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_SSAnne,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CueBall = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_BIKE_TIRE,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_CueBall,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Painter = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Painter,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BirdKeeper = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_BirdKeeper,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Burglar = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Burglar,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokemonRangerF = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_PokemonRangerF,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokemonRangerM = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_PokemonRangerM,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RuinManiac = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_RuinManiac,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokeManiac = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_PokeManiac,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PsychicM = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_PsychicM,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PsychicF = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_PsychicF,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AromaLady = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_AromaLady,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Twin = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Twin,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_YoungCoupleM = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_YoungCoupleM,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_YoungCoupleF = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_YoungCoupleF,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Engineer = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Engineer,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Juggler = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Juggler,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Tamer = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Tamer,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokemonBreeder = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_PokemonBreeder,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedUnderwater = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_27,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = TRUE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_RedUnderwater,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenUnderwater = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_27,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_PLAYER,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = TRUE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_GreenUnderwater,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scott = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Scott,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bulbasaur = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Bulbasaur,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Charmander = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Charmander,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Squirtle = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Squirtle,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Latias = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Latias,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Latios = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Latios,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_EmBrendan = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_28,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_EmBrendan,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_EmMay = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_29,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_EmMay,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CableCar = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_CABLE_CAR,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 2048,\n\t.width = 64,\n\t.height = 64,\n\t.paletteSlot = PALSLOT_NPC_SPECIAL,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = TRUE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_NONE,\n\t.oam = &gObjectEventBaseOam_64x64,\n\t.subspriteTables = gObjectEventSpriteOamTables_64x64,\n\t.anims = sAnimTable_Inanimate,\n\t.images = sPicTable_CableCar,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sudowoodo = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Sudowoodo,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Abra = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 128,\n\t.width = 16,\n\t.height = 16,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x16,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x16,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Abra,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerFWater2 = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_SwimmerFWater2,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBeauty = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_MasterBeauty,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBirdKeeper = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_MasterBirdKeeper,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBlackbelt = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_MasterBlackbelt,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBugCatcher = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_MasterBugCatcher,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterCooltrainerM = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_MasterCooltrainerM,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterHiker = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_MasterHiker,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterLass = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_MasterLass,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterPsychicM = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_MasterPsychicM,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterScientist = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_MasterScientist,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterYoungster = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_MasterYoungster,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lady = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_LADY,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_SPECIAL,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Lady,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rocker2 = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Rocker2,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Anabel = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Anabel,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Tucker = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 512,\n\t.width = 32,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_32x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_32x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Tucker,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Greta = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_BLUE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_1,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Greta,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Spenser = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Spenser,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Noland = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_WHITE,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_4,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Noland,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lucy = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_PINK,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_2,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Lucy,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Brandon = {\n\t.tileTag = TAG_NONE,\n\t.paletteTag = OBJ_EVENT_PAL_TAG_NPC_GREEN,\n\t.reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE,\n\t.size = 256,\n\t.width = 16,\n\t.height = 32,\n\t.paletteSlot = PALSLOT_NPC_3,\n\t.shadowSize = SHADOW_SIZE_M,\n\t.inanimate = FALSE,\n\t.disableReflectionPaletteLoad = FALSE,\n\t.tracks = TRACKS_FOOT,\n\t.oam = &gObjectEventBaseOam_16x32,\n\t.subspriteTables = gObjectEventSpriteOamTables_16x32,\n\t.anims = sAnimTable_Standard,\n\t.images = sPicTable_Brandon,\n\t.affineAnims = gDummySpriteAffineAnimTable,\n};\n\n"
  },
  {
    "path": "src/data/object_events/object_event_graphics_info_pointers.h",
    "content": "const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedNormal;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedBike;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedSurf;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedFieldMove;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedFish;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedVSSeeker;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedVSSeekerBike;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenNormal;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenBike;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenSurf;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenFieldMove;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenFish;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenVSSeeker;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenVSSeekerBike;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RSBrendan;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RSMay;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleBoy;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleGirl;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Youngster;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Boy;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BugCatcher;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SittingBoy;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lass;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman1;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BattleGirl;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rocker;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_FatMan;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman2;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Beauty;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BaldingMan;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman3;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldMan1;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldMan2;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldManLyingDown;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldWoman;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberMWater;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberF;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberMLand;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Camper;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Picnicker;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CooltrainerM;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CooltrainerF;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerMWater;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerFWater;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerMLand;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerFLand;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_WorkerM;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_WorkerF;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RocketM;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RocketF;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GBAKid;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SuperNerd;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Biker;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Blackbelt;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scientist;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Hiker;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fisher;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Channeler;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Chef;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Policeman;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Gentleman;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sailor;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Captain;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Nurse;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CableClubReceptionist;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnionRoomReceptionist;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMaleReceptionist;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Clerk;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MGDeliveryman;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TrainerTowerDude;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ProfOak;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Blue;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bill;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lance;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Agatha;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Daisy;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lorelei;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MrFuji;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bruno;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Brock;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Misty;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LtSurge;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Erika;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Koga;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sabrina;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Blaine;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Giovanni;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mom;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Celio;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TeachyTVHost;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GymGuy;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ItemBall;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TownMap;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pokedex;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CutTree;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RockSmashRock;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_StrengthBoulder;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fossil;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Ruby;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sapphire;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldAmber;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GymSign;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sign;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TrainerTips;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Clipboard;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Meteorite;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LaprasDoll;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Seagallop;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Snorlax;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Spearow;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Cubone;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Poliwrath;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Clefairy;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pidgeot;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Jigglypuff;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pidgey;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Chansey;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Omanyte;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kangaskhan;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pikachu;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Psyduck;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_NidoranF;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_NidoranM;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Nidorino;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Meowth;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Seel;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Voltorb;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Slowpoke;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Slowbro;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Machop;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Wigglytuff;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Doduo;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fearow;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Machoke;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lapras;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Zapdos;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Moltres;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Articuno;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mewtwo;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mew;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Entei;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Suicune;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Raikou;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lugia;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Celebi;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kabuto;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DeoxysD;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DeoxysA;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DeoxysN;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SSAnne;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CueBall;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Painter;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BirdKeeper;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Burglar;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokemonRangerF;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokemonRangerM;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RuinManiac;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokeManiac;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PsychicM;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PsychicF;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AromaLady;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Twin;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_YoungCoupleM;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_YoungCoupleF;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Engineer;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Juggler;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Tamer;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokemonBreeder;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedUnderwater;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenUnderwater;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scott;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bulbasaur;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Charmander;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Squirtle;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Latias;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Latios;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_EmBrendan;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_EmMay;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CableCar;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sudowoodo;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Abra;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerFWater2;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBeauty;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBirdKeeper;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBlackbelt;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterBugCatcher;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterCooltrainerM;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterHiker;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterLass;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterPsychicM;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterScientist;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MasterYoungster;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lady;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rocker2;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Anabel;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Tucker;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Greta;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Spenser;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Noland;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lucy;\nconst struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Brandon;\n\nconst struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM_OBJ_EVENT_GFX] = {\n    [OBJ_EVENT_GFX_RED_NORMAL]               = &gObjectEventGraphicsInfo_RedNormal,\n    [OBJ_EVENT_GFX_RED_BIKE]                 = &gObjectEventGraphicsInfo_RedBike,\n    [OBJ_EVENT_GFX_RED_SURF]                 = &gObjectEventGraphicsInfo_RedSurf,\n    [OBJ_EVENT_GFX_RED_FIELD_MOVE]           = &gObjectEventGraphicsInfo_RedFieldMove,\n    [OBJ_EVENT_GFX_RED_FISH]                 = &gObjectEventGraphicsInfo_RedFish,\n    [OBJ_EVENT_GFX_RED_VS_SEEKER]            = &gObjectEventGraphicsInfo_RedVSSeeker,\n    [OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE]       = &gObjectEventGraphicsInfo_RedVSSeekerBike,\n    [OBJ_EVENT_GFX_GREEN_NORMAL]             = &gObjectEventGraphicsInfo_GreenNormal,\n    [OBJ_EVENT_GFX_GREEN_BIKE]               = &gObjectEventGraphicsInfo_GreenBike,\n    [OBJ_EVENT_GFX_GREEN_SURF]               = &gObjectEventGraphicsInfo_GreenSurf,\n    [OBJ_EVENT_GFX_GREEN_FIELD_MOVE]         = &gObjectEventGraphicsInfo_GreenFieldMove,\n    [OBJ_EVENT_GFX_GREEN_FISH]               = &gObjectEventGraphicsInfo_GreenFish,\n    [OBJ_EVENT_GFX_GREEN_VS_SEEKER]          = &gObjectEventGraphicsInfo_GreenVSSeeker,\n    [OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE]     = &gObjectEventGraphicsInfo_GreenVSSeekerBike,\n    [OBJ_EVENT_GFX_RS_BRENDAN]               = &gObjectEventGraphicsInfo_RSBrendan,\n    [OBJ_EVENT_GFX_RS_MAY]                   = &gObjectEventGraphicsInfo_RSMay,\n    [OBJ_EVENT_GFX_LITTLE_BOY]               = &gObjectEventGraphicsInfo_LittleBoy,\n    [OBJ_EVENT_GFX_LITTLE_GIRL]              = &gObjectEventGraphicsInfo_LittleGirl,\n    [OBJ_EVENT_GFX_YOUNGSTER]                = &gObjectEventGraphicsInfo_Youngster,\n    [OBJ_EVENT_GFX_BOY]                      = &gObjectEventGraphicsInfo_Boy,\n    [OBJ_EVENT_GFX_BUG_CATCHER]              = &gObjectEventGraphicsInfo_BugCatcher,\n    [OBJ_EVENT_GFX_SITTING_BOY]              = &gObjectEventGraphicsInfo_SittingBoy,\n    [OBJ_EVENT_GFX_LASS]                     = &gObjectEventGraphicsInfo_Lass,\n    [OBJ_EVENT_GFX_WOMAN_1]                  = &gObjectEventGraphicsInfo_Woman1,\n    [OBJ_EVENT_GFX_BATTLE_GIRL]              = &gObjectEventGraphicsInfo_BattleGirl,\n    [OBJ_EVENT_GFX_MAN]                      = &gObjectEventGraphicsInfo_Man,\n    [OBJ_EVENT_GFX_ROCKER]                   = &gObjectEventGraphicsInfo_Rocker,\n    [OBJ_EVENT_GFX_FAT_MAN]                  = &gObjectEventGraphicsInfo_FatMan,\n    [OBJ_EVENT_GFX_WOMAN_2]                  = &gObjectEventGraphicsInfo_Woman2,\n    [OBJ_EVENT_GFX_BEAUTY]                   = &gObjectEventGraphicsInfo_Beauty,\n    [OBJ_EVENT_GFX_BALDING_MAN]              = &gObjectEventGraphicsInfo_BaldingMan,\n    [OBJ_EVENT_GFX_WOMAN_3]                  = &gObjectEventGraphicsInfo_Woman3,\n    [OBJ_EVENT_GFX_OLD_MAN_1]                = &gObjectEventGraphicsInfo_OldMan1,\n    [OBJ_EVENT_GFX_OLD_MAN_2]                = &gObjectEventGraphicsInfo_OldMan2,\n    [OBJ_EVENT_GFX_OLD_MAN_LYING_DOWN]       = &gObjectEventGraphicsInfo_OldManLyingDown,\n    [OBJ_EVENT_GFX_OLD_WOMAN]                = &gObjectEventGraphicsInfo_OldWoman,\n    [OBJ_EVENT_GFX_TUBER_M_WATER]            = &gObjectEventGraphicsInfo_TuberMWater,\n    [OBJ_EVENT_GFX_TUBER_F]                  = &gObjectEventGraphicsInfo_TuberF,\n    [OBJ_EVENT_GFX_TUBER_M_LAND]             = &gObjectEventGraphicsInfo_TuberMLand,\n    [OBJ_EVENT_GFX_CAMPER]                   = &gObjectEventGraphicsInfo_Camper,\n    [OBJ_EVENT_GFX_PICNICKER]                = &gObjectEventGraphicsInfo_Picnicker,\n    [OBJ_EVENT_GFX_COOLTRAINER_M]            = &gObjectEventGraphicsInfo_CooltrainerM,\n    [OBJ_EVENT_GFX_COOLTRAINER_F]            = &gObjectEventGraphicsInfo_CooltrainerF,\n    [OBJ_EVENT_GFX_SWIMMER_M_WATER]          = &gObjectEventGraphicsInfo_SwimmerMWater,\n    [OBJ_EVENT_GFX_SWIMMER_F_WATER]          = &gObjectEventGraphicsInfo_SwimmerFWater,\n    [OBJ_EVENT_GFX_SWIMMER_M_LAND]           = &gObjectEventGraphicsInfo_SwimmerMLand,\n    [OBJ_EVENT_GFX_SWIMMER_F_LAND]           = &gObjectEventGraphicsInfo_SwimmerFLand,\n    [OBJ_EVENT_GFX_WORKER_M]                 = &gObjectEventGraphicsInfo_WorkerM,\n    [OBJ_EVENT_GFX_WORKER_F]                 = &gObjectEventGraphicsInfo_WorkerF,\n    [OBJ_EVENT_GFX_ROCKET_M]                 = &gObjectEventGraphicsInfo_RocketM,\n    [OBJ_EVENT_GFX_ROCKET_F]                 = &gObjectEventGraphicsInfo_RocketF,\n    [OBJ_EVENT_GFX_GBA_KID]                  = &gObjectEventGraphicsInfo_GBAKid,\n    [OBJ_EVENT_GFX_SUPER_NERD]               = &gObjectEventGraphicsInfo_SuperNerd,\n    [OBJ_EVENT_GFX_BIKER]                    = &gObjectEventGraphicsInfo_Biker,\n    [OBJ_EVENT_GFX_BLACKBELT]                = &gObjectEventGraphicsInfo_Blackbelt,\n    [OBJ_EVENT_GFX_SCIENTIST]                = &gObjectEventGraphicsInfo_Scientist,\n    [OBJ_EVENT_GFX_HIKER]                    = &gObjectEventGraphicsInfo_Hiker,\n    [OBJ_EVENT_GFX_FISHER]                   = &gObjectEventGraphicsInfo_Fisher,\n    [OBJ_EVENT_GFX_CHANNELER]                = &gObjectEventGraphicsInfo_Channeler,\n    [OBJ_EVENT_GFX_CHEF]                     = &gObjectEventGraphicsInfo_Chef,\n    [OBJ_EVENT_GFX_POLICEMAN]                = &gObjectEventGraphicsInfo_Policeman,\n    [OBJ_EVENT_GFX_GENTLEMAN]                = &gObjectEventGraphicsInfo_Gentleman,\n    [OBJ_EVENT_GFX_SAILOR]                   = &gObjectEventGraphicsInfo_Sailor,\n    [OBJ_EVENT_GFX_CAPTAIN]                  = &gObjectEventGraphicsInfo_Captain,\n    [OBJ_EVENT_GFX_NURSE]                    = &gObjectEventGraphicsInfo_Nurse,\n    [OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST]  = &gObjectEventGraphicsInfo_CableClubReceptionist,\n    [OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST]  = &gObjectEventGraphicsInfo_UnionRoomReceptionist,\n    [OBJ_EVENT_GFX_UNUSED_MALE_RECEPTIONIST] = &gObjectEventGraphicsInfo_UnusedMaleReceptionist,\n    [OBJ_EVENT_GFX_CLERK]                    = &gObjectEventGraphicsInfo_Clerk,\n    [OBJ_EVENT_GFX_MG_DELIVERYMAN]           = &gObjectEventGraphicsInfo_MGDeliveryman,\n    [OBJ_EVENT_GFX_TRAINER_TOWER_DUDE]       = &gObjectEventGraphicsInfo_TrainerTowerDude,\n    [OBJ_EVENT_GFX_PROF_OAK]                 = &gObjectEventGraphicsInfo_ProfOak,\n    [OBJ_EVENT_GFX_BLUE]                     = &gObjectEventGraphicsInfo_Blue,\n    [OBJ_EVENT_GFX_BILL]                     = &gObjectEventGraphicsInfo_Bill,\n    [OBJ_EVENT_GFX_LANCE]                    = &gObjectEventGraphicsInfo_Lance,\n    [OBJ_EVENT_GFX_AGATHA]                   = &gObjectEventGraphicsInfo_Agatha,\n    [OBJ_EVENT_GFX_DAISY]                    = &gObjectEventGraphicsInfo_Daisy,\n    [OBJ_EVENT_GFX_LORELEI]                  = &gObjectEventGraphicsInfo_Lorelei,\n    [OBJ_EVENT_GFX_MR_FUJI]                  = &gObjectEventGraphicsInfo_MrFuji,\n    [OBJ_EVENT_GFX_BRUNO]                    = &gObjectEventGraphicsInfo_Bruno,\n    [OBJ_EVENT_GFX_BROCK]                    = &gObjectEventGraphicsInfo_Brock,\n    [OBJ_EVENT_GFX_MISTY]                    = &gObjectEventGraphicsInfo_Misty,\n    [OBJ_EVENT_GFX_LT_SURGE]                 = &gObjectEventGraphicsInfo_LtSurge,\n    [OBJ_EVENT_GFX_ERIKA]                    = &gObjectEventGraphicsInfo_Erika,\n    [OBJ_EVENT_GFX_KOGA]                     = &gObjectEventGraphicsInfo_Koga,\n    [OBJ_EVENT_GFX_SABRINA]                  = &gObjectEventGraphicsInfo_Sabrina,\n    [OBJ_EVENT_GFX_BLAINE]                   = &gObjectEventGraphicsInfo_Blaine,\n    [OBJ_EVENT_GFX_GIOVANNI]                 = &gObjectEventGraphicsInfo_Giovanni,\n    [OBJ_EVENT_GFX_MOM]                      = &gObjectEventGraphicsInfo_Mom,\n    [OBJ_EVENT_GFX_CELIO]                    = &gObjectEventGraphicsInfo_Celio,\n    [OBJ_EVENT_GFX_TEACHY_TV_HOST]           = &gObjectEventGraphicsInfo_TeachyTVHost,\n    [OBJ_EVENT_GFX_GYM_GUY]                  = &gObjectEventGraphicsInfo_GymGuy,\n    [OBJ_EVENT_GFX_ITEM_BALL]                = &gObjectEventGraphicsInfo_ItemBall,\n    [OBJ_EVENT_GFX_TOWN_MAP]                 = &gObjectEventGraphicsInfo_TownMap,\n    [OBJ_EVENT_GFX_POKEDEX]                  = &gObjectEventGraphicsInfo_Pokedex,\n    [OBJ_EVENT_GFX_CUT_TREE]                 = &gObjectEventGraphicsInfo_CutTree,\n    [OBJ_EVENT_GFX_ROCK_SMASH_ROCK]          = &gObjectEventGraphicsInfo_RockSmashRock,\n    [OBJ_EVENT_GFX_PUSHABLE_BOULDER]         = &gObjectEventGraphicsInfo_StrengthBoulder,\n    [OBJ_EVENT_GFX_FOSSIL]                   = &gObjectEventGraphicsInfo_Fossil,\n    [OBJ_EVENT_GFX_RUBY]                     = &gObjectEventGraphicsInfo_Ruby,\n    [OBJ_EVENT_GFX_SAPPHIRE]                 = &gObjectEventGraphicsInfo_Sapphire,\n    [OBJ_EVENT_GFX_OLD_AMBER]                = &gObjectEventGraphicsInfo_OldAmber,\n    [OBJ_EVENT_GFX_GYM_SIGN]                 = &gObjectEventGraphicsInfo_GymSign,\n    [OBJ_EVENT_GFX_SIGN]                     = &gObjectEventGraphicsInfo_Sign,\n    [OBJ_EVENT_GFX_TRAINER_TIPS]             = &gObjectEventGraphicsInfo_TrainerTips,\n    [OBJ_EVENT_GFX_CLIPBOARD]                = &gObjectEventGraphicsInfo_Clipboard,\n    [OBJ_EVENT_GFX_METEORITE]                = &gObjectEventGraphicsInfo_Meteorite,\n    [OBJ_EVENT_GFX_LAPRAS_DOLL]              = &gObjectEventGraphicsInfo_LaprasDoll,\n    [OBJ_EVENT_GFX_SEAGALLOP]                = &gObjectEventGraphicsInfo_Seagallop,\n    [OBJ_EVENT_GFX_SNORLAX]                  = &gObjectEventGraphicsInfo_Snorlax,\n    [OBJ_EVENT_GFX_SPEAROW]                  = &gObjectEventGraphicsInfo_Spearow,\n    [OBJ_EVENT_GFX_CUBONE]                   = &gObjectEventGraphicsInfo_Cubone,\n    [OBJ_EVENT_GFX_POLIWRATH]                = &gObjectEventGraphicsInfo_Poliwrath,\n    [OBJ_EVENT_GFX_CLEFAIRY]                 = &gObjectEventGraphicsInfo_Clefairy,\n    [OBJ_EVENT_GFX_PIDGEOT]                  = &gObjectEventGraphicsInfo_Pidgeot,\n    [OBJ_EVENT_GFX_JIGGLYPUFF]               = &gObjectEventGraphicsInfo_Jigglypuff,\n    [OBJ_EVENT_GFX_PIDGEY]                   = &gObjectEventGraphicsInfo_Pidgey,\n    [OBJ_EVENT_GFX_CHANSEY]                  = &gObjectEventGraphicsInfo_Chansey,\n    [OBJ_EVENT_GFX_OMANYTE]                  = &gObjectEventGraphicsInfo_Omanyte,\n    [OBJ_EVENT_GFX_KANGASKHAN]               = &gObjectEventGraphicsInfo_Kangaskhan,\n    [OBJ_EVENT_GFX_PIKACHU]                  = &gObjectEventGraphicsInfo_Pikachu,\n    [OBJ_EVENT_GFX_PSYDUCK]                  = &gObjectEventGraphicsInfo_Psyduck,\n    [OBJ_EVENT_GFX_NIDORAN_F]                = &gObjectEventGraphicsInfo_NidoranF,\n    [OBJ_EVENT_GFX_NIDORAN_M]                = &gObjectEventGraphicsInfo_NidoranM,\n    [OBJ_EVENT_GFX_NIDORINO]                 = &gObjectEventGraphicsInfo_Nidorino,\n    [OBJ_EVENT_GFX_MEOWTH]                   = &gObjectEventGraphicsInfo_Meowth,\n    [OBJ_EVENT_GFX_SEEL]                     = &gObjectEventGraphicsInfo_Seel,\n    [OBJ_EVENT_GFX_VOLTORB]                  = &gObjectEventGraphicsInfo_Voltorb,\n    [OBJ_EVENT_GFX_SLOWPOKE]                 = &gObjectEventGraphicsInfo_Slowpoke,\n    [OBJ_EVENT_GFX_SLOWBRO]                  = &gObjectEventGraphicsInfo_Slowbro,\n    [OBJ_EVENT_GFX_MACHOP]                   = &gObjectEventGraphicsInfo_Machop,\n    [OBJ_EVENT_GFX_WIGGLYTUFF]               = &gObjectEventGraphicsInfo_Wigglytuff,\n    [OBJ_EVENT_GFX_DODUO]                    = &gObjectEventGraphicsInfo_Doduo,\n    [OBJ_EVENT_GFX_FEAROW]                   = &gObjectEventGraphicsInfo_Fearow,\n    [OBJ_EVENT_GFX_MACHOKE]                  = &gObjectEventGraphicsInfo_Machoke,\n    [OBJ_EVENT_GFX_LAPRAS]                   = &gObjectEventGraphicsInfo_Lapras,\n    [OBJ_EVENT_GFX_ZAPDOS]                   = &gObjectEventGraphicsInfo_Zapdos,\n    [OBJ_EVENT_GFX_MOLTRES]                  = &gObjectEventGraphicsInfo_Moltres,\n    [OBJ_EVENT_GFX_ARTICUNO]                 = &gObjectEventGraphicsInfo_Articuno,\n    [OBJ_EVENT_GFX_MEWTWO]                   = &gObjectEventGraphicsInfo_Mewtwo,\n    [OBJ_EVENT_GFX_MEW]                      = &gObjectEventGraphicsInfo_Mew,\n    [OBJ_EVENT_GFX_ENTEI]                    = &gObjectEventGraphicsInfo_Entei,\n    [OBJ_EVENT_GFX_SUICUNE]                  = &gObjectEventGraphicsInfo_Suicune,\n    [OBJ_EVENT_GFX_RAIKOU]                   = &gObjectEventGraphicsInfo_Raikou,\n    [OBJ_EVENT_GFX_LUGIA]                    = &gObjectEventGraphicsInfo_Lugia,\n    [OBJ_EVENT_GFX_HO_OH]                    = &gObjectEventGraphicsInfo_HoOh,\n    [OBJ_EVENT_GFX_CELEBI]                   = &gObjectEventGraphicsInfo_Celebi,\n    [OBJ_EVENT_GFX_KABUTO]                   = &gObjectEventGraphicsInfo_Kabuto,\n    [OBJ_EVENT_GFX_DEOXYS_D]                 = &gObjectEventGraphicsInfo_DeoxysD,\n    [OBJ_EVENT_GFX_DEOXYS_A]                 = &gObjectEventGraphicsInfo_DeoxysA,\n    [OBJ_EVENT_GFX_DEOXYS_N]                 = &gObjectEventGraphicsInfo_DeoxysN,\n    [OBJ_EVENT_GFX_SS_ANNE]                  = &gObjectEventGraphicsInfo_SSAnne,\n    [OBJ_EVENT_GFX_CUE_BALL]                 = &gObjectEventGraphicsInfo_CueBall,\n    [OBJ_EVENT_GFX_PAINTER]                  = &gObjectEventGraphicsInfo_Painter,\n    [OBJ_EVENT_GFX_BIRD_KEEPER]              = &gObjectEventGraphicsInfo_BirdKeeper,\n    [OBJ_EVENT_GFX_BURGLAR]                  = &gObjectEventGraphicsInfo_Burglar,\n    [OBJ_EVENT_GFX_POKEMON_RANGER_F]         = &gObjectEventGraphicsInfo_PokemonRangerF,\n    [OBJ_EVENT_GFX_POKEMON_RANGER_M]         = &gObjectEventGraphicsInfo_PokemonRangerM,\n    [OBJ_EVENT_GFX_RUIN_MANIAC]              = &gObjectEventGraphicsInfo_RuinManiac,\n    [OBJ_EVENT_GFX_POKE_MANIAC]              = &gObjectEventGraphicsInfo_PokeManiac,\n    [OBJ_EVENT_GFX_PSYCHIC_M]                = &gObjectEventGraphicsInfo_PsychicM,\n    [OBJ_EVENT_GFX_PSYCHIC_F]                = &gObjectEventGraphicsInfo_PsychicF,\n    [OBJ_EVENT_GFX_AROMA_LADY]               = &gObjectEventGraphicsInfo_AromaLady,\n    [OBJ_EVENT_GFX_TWIN]                     = &gObjectEventGraphicsInfo_Twin,\n    [OBJ_EVENT_GFX_YOUNG_COUPLE_M]           = &gObjectEventGraphicsInfo_YoungCoupleM,\n    [OBJ_EVENT_GFX_YOUNG_COUPLE_F]           = &gObjectEventGraphicsInfo_YoungCoupleF,\n    [OBJ_EVENT_GFX_ENGINEER]                 = &gObjectEventGraphicsInfo_Engineer,\n    [OBJ_EVENT_GFX_JUGGLER]                  = &gObjectEventGraphicsInfo_Juggler,\n    [OBJ_EVENT_GFX_TAMER]                    = &gObjectEventGraphicsInfo_Tamer,\n    [OBJ_EVENT_GFX_POKEMON_BREEDER]          = &gObjectEventGraphicsInfo_PokemonBreeder,\n    [OBJ_EVENT_GFX_RED_UNDERWATER]           = &gObjectEventGraphicsInfo_RedUnderwater,\n    [OBJ_EVENT_GFX_GREEN_UNDERWATER]         = &gObjectEventGraphicsInfo_GreenUnderwater,\n    [OBJ_EVENT_GFX_SCOTT]                    = &gObjectEventGraphicsInfo_Scott,\n    [OBJ_EVENT_GFX_BULBASAUR]                = &gObjectEventGraphicsInfo_Bulbasaur,\n    [OBJ_EVENT_GFX_CHARMANDER]               = &gObjectEventGraphicsInfo_Charmander,\n    [OBJ_EVENT_GFX_SQUIRTLE]                 = &gObjectEventGraphicsInfo_Squirtle,\n    [OBJ_EVENT_GFX_LATIAS]                   = &gObjectEventGraphicsInfo_Latias,\n    [OBJ_EVENT_GFX_LATIOS]                   = &gObjectEventGraphicsInfo_Latios,\n    [OBJ_EVENT_GFX_EM_BRENDAN]               = &gObjectEventGraphicsInfo_EmBrendan,\n    [OBJ_EVENT_GFX_EM_MAY]                   = &gObjectEventGraphicsInfo_EmMay,\n    [OBJ_EVENT_GFX_CABLE_CAR]                = &gObjectEventGraphicsInfo_CableCar,\n    [OBJ_EVENT_GFX_SUDOWOODO]                = &gObjectEventGraphicsInfo_Sudowoodo,\n    [OBJ_EVENT_GFX_ABRA]                     = &gObjectEventGraphicsInfo_Abra,\n    [OBJ_EVENT_GFX_SWIMMER_F_WATER_2]        = &gObjectEventGraphicsInfo_SwimmerFWater2,\n    [OBJ_EVENT_GFX_MASTER_BEAUTY]            = &gObjectEventGraphicsInfo_MasterBeauty,\n    [OBJ_EVENT_GFX_MASTER_BIRD_KEEPER]       = &gObjectEventGraphicsInfo_MasterBirdKeeper,\n    [OBJ_EVENT_GFX_MASTER_BLACK_BELT]        = &gObjectEventGraphicsInfo_MasterBlackbelt,\n    [OBJ_EVENT_GFX_MASTER_BUG_CATCHER]       = &gObjectEventGraphicsInfo_MasterBugCatcher,\n    [OBJ_EVENT_GFX_MASTER_COOLTRAINER_M]     = &gObjectEventGraphicsInfo_MasterCooltrainerM,\n    [OBJ_EVENT_GFX_MASTER_HIKER]             = &gObjectEventGraphicsInfo_MasterHiker,\n    [OBJ_EVENT_GFX_MASTER_LASS]              = &gObjectEventGraphicsInfo_MasterLass,\n    [OBJ_EVENT_GFX_MASTER_PSYCHIC_M]         = &gObjectEventGraphicsInfo_MasterPsychicM,\n    [OBJ_EVENT_GFX_MASTER_SCIENTIST]         = &gObjectEventGraphicsInfo_MasterScientist,\n    [OBJ_EVENT_GFX_MASTER_YOUNGSTER]         = &gObjectEventGraphicsInfo_MasterYoungster,\n    [OBJ_EVENT_GFX_LADY]                     = &gObjectEventGraphicsInfo_Lady,\n    [OBJ_EVENT_GFX_ROCKER_2]                 = &gObjectEventGraphicsInfo_Rocker2,\n    [OBJ_EVENT_GFX_ANABEL]                   = &gObjectEventGraphicsInfo_Anabel,\n    [OBJ_EVENT_GFX_TUCKER]                   = &gObjectEventGraphicsInfo_Tucker,\n    [OBJ_EVENT_GFX_GRETA]                    = &gObjectEventGraphicsInfo_Greta,\n    [OBJ_EVENT_GFX_SPENSER]                  = &gObjectEventGraphicsInfo_Spenser,\n    [OBJ_EVENT_GFX_NOLAND]                   = &gObjectEventGraphicsInfo_Noland,\n    [OBJ_EVENT_GFX_LUCY]                     = &gObjectEventGraphicsInfo_Lucy,\n    [OBJ_EVENT_GFX_BRANDON]                  = &gObjectEventGraphicsInfo_Brandon,\n};\n"
  },
  {
    "path": "src/data/object_events/object_event_pic_tables.h",
    "content": "static const struct SpriteFrameImage sPicTable_RedNormal[] = {\n    overworld_frame(gObjectEventPic_RedNormal, 2, 4, 0),\n    overworld_frame(gObjectEventPic_RedNormal, 2, 4, 1),\n    overworld_frame(gObjectEventPic_RedNormal, 2, 4, 2),\n    overworld_frame(gObjectEventPic_RedNormal, 2, 4, 3),\n    overworld_frame(gObjectEventPic_RedNormal, 2, 4, 4),\n    overworld_frame(gObjectEventPic_RedNormal, 2, 4, 5),\n    overworld_frame(gObjectEventPic_RedNormal, 2, 4, 6),\n    overworld_frame(gObjectEventPic_RedNormal, 2, 4, 7),\n    overworld_frame(gObjectEventPic_RedNormal, 2, 4, 8),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 3),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 4),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 5),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 6),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 7),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 8),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 9),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 10),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 11),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 12),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 13),\n};\n\nstatic const struct SpriteFrameImage sPicTable_RedBike[] = {\n    overworld_frame(gObjectEventPic_RedBike, 4, 4, 0),\n    overworld_frame(gObjectEventPic_RedBike, 4, 4, 1),\n    overworld_frame(gObjectEventPic_RedBike, 4, 4, 2),\n    overworld_frame(gObjectEventPic_RedBike, 4, 4, 3),\n    overworld_frame(gObjectEventPic_RedBike, 4, 4, 4),\n    overworld_frame(gObjectEventPic_RedBike, 4, 4, 5),\n    overworld_frame(gObjectEventPic_RedBike, 4, 4, 6),\n    overworld_frame(gObjectEventPic_RedBike, 4, 4, 7),\n    overworld_frame(gObjectEventPic_RedBike, 4, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_GreenNormal[] = {\n    overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 0),\n    overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 1),\n    overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 2),\n    overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 3),\n    overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 4),\n    overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 5),\n    overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 6),\n    overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 7),\n    overworld_frame(gObjectEventPic_GreenNormal, 2, 4, 8),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 3),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 4),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 5),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 6),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 7),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 8),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 9),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 10),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 11),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 12),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 13),\n};\n\nstatic const struct SpriteFrameImage sPicTable_GreenBike[] = {\n    overworld_frame(gObjectEventPic_GreenBike, 4, 4, 0),\n    overworld_frame(gObjectEventPic_GreenBike, 4, 4, 1),\n    overworld_frame(gObjectEventPic_GreenBike, 4, 4, 2),\n    overworld_frame(gObjectEventPic_GreenBike, 4, 4, 3),\n    overworld_frame(gObjectEventPic_GreenBike, 4, 4, 4),\n    overworld_frame(gObjectEventPic_GreenBike, 4, 4, 5),\n    overworld_frame(gObjectEventPic_GreenBike, 4, 4, 6),\n    overworld_frame(gObjectEventPic_GreenBike, 4, 4, 7),\n    overworld_frame(gObjectEventPic_GreenBike, 4, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_RedSurf[] = {\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 0),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 1),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 2),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 0),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 0),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 1),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 1),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 2),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 2),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 0),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 1),\n    overworld_frame(gObjectEventPic_RedSurfRun, 2, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_GreenSurf[] = {\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 0),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 1),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 2),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 0),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 0),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 1),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 1),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 2),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 2),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 0),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 1),\n    overworld_frame(gObjectEventPic_GreenSurfRun, 2, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_RedItem[] = {\n    overworld_frame(gObjectEventPic_RedItem, 2, 4, 0),\n    overworld_frame(gObjectEventPic_RedItem, 2, 4, 1),\n    overworld_frame(gObjectEventPic_RedItem, 2, 4, 2),\n    overworld_frame(gObjectEventPic_RedItem, 2, 4, 3),\n    overworld_frame(gObjectEventPic_RedItem, 2, 4, 4),\n    overworld_frame(gObjectEventPic_RedItem, 2, 4, 5),\n    overworld_frame(gObjectEventPic_RedItem, 2, 4, 6),\n    overworld_frame(gObjectEventPic_RedItem, 2, 4, 7),\n    overworld_frame(gObjectEventPic_RedItem, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_GreenItem[] = {\n    overworld_frame(gObjectEventPic_GreenItem, 2, 4, 0),\n    overworld_frame(gObjectEventPic_GreenItem, 2, 4, 1),\n    overworld_frame(gObjectEventPic_GreenItem, 2, 4, 2),\n    overworld_frame(gObjectEventPic_GreenItem, 2, 4, 3),\n    overworld_frame(gObjectEventPic_GreenItem, 2, 4, 4),\n    overworld_frame(gObjectEventPic_GreenItem, 2, 4, 5),\n    overworld_frame(gObjectEventPic_GreenItem, 2, 4, 6),\n    overworld_frame(gObjectEventPic_GreenItem, 2, 4, 7),\n    overworld_frame(gObjectEventPic_GreenItem, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_RedVSSeekerBike[] = {\n    overworld_frame(gObjectEventPic_RedVSSeekerBike, 4, 4, 0),\n    overworld_frame(gObjectEventPic_RedVSSeekerBike, 4, 4, 1),\n    overworld_frame(gObjectEventPic_RedVSSeekerBike, 4, 4, 2),\n    overworld_frame(gObjectEventPic_RedVSSeekerBike, 4, 4, 3),\n    overworld_frame(gObjectEventPic_RedVSSeekerBike, 4, 4, 4),\n    overworld_frame(gObjectEventPic_RedVSSeekerBike, 4, 4, 5),\n};\n\nstatic const struct SpriteFrameImage sPicTable_GreenVSSeekerBike[] = {\n    overworld_frame(gObjectEventPic_GreenVSSeekerBike, 4, 4, 0),\n    overworld_frame(gObjectEventPic_GreenVSSeekerBike, 4, 4, 1),\n    overworld_frame(gObjectEventPic_GreenVSSeekerBike, 4, 4, 2),\n    overworld_frame(gObjectEventPic_GreenVSSeekerBike, 4, 4, 3),\n    overworld_frame(gObjectEventPic_GreenVSSeekerBike, 4, 4, 4),\n    overworld_frame(gObjectEventPic_GreenVSSeekerBike, 4, 4, 5),\n};\n\nstatic const struct SpriteFrameImage sPicTable_RedUnderwater[] = {\n    overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 0),\n    overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 1),\n    overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 2),\n    overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 0),\n    overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 0),\n    overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 1),\n    overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 1),\n    overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 2),\n    overworld_frame(gObjectEventPic_RedUnderwater, 4, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_GreenUnderwater[] = {\n    overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 0),\n    overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 1),\n    overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 2),\n    overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 0),\n    overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 0),\n    overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 1),\n    overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 1),\n    overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 2),\n    overworld_frame(gObjectEventPic_GreenUnderwater, 4, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_RSBrendan[] = {\n    overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 0),\n    overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 1),\n    overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 2),\n    overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 3),\n    overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 4),\n    overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 5),\n    overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 6),\n    overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 7),\n    overworld_frame(gObjectEventPic_RSBrendan, 2, 4, 8),\n    overworld_frame(gObjectEventPic_RSMay, 2, 4, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_RSMay[] = {\n    overworld_frame(gObjectEventPic_RSMay, 2, 4, 0),\n    overworld_frame(gObjectEventPic_RSMay, 2, 4, 1),\n    overworld_frame(gObjectEventPic_RSMay, 2, 4, 2),\n    overworld_frame(gObjectEventPic_RSMay, 2, 4, 3),\n    overworld_frame(gObjectEventPic_RSMay, 2, 4, 4),\n    overworld_frame(gObjectEventPic_RSMay, 2, 4, 5),\n    overworld_frame(gObjectEventPic_RSMay, 2, 4, 6),\n    overworld_frame(gObjectEventPic_RSMay, 2, 4, 7),\n    overworld_frame(gObjectEventPic_RSMay, 2, 4, 8),\n    overworld_frame(gObjectEventPic_RedFish, 2, 4, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Policeman[] = {\n    overworld_frame(gObjectEventPic_Policeman, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Policeman, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Policeman, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Policeman, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Policeman, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Policeman, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Policeman, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Policeman, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Policeman, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_LittleBoy[] = {\n    overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 0),\n    overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 1),\n    overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 2),\n    overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 3),\n    overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 4),\n    overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 5),\n    overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 6),\n    overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 7),\n    overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_LittleGirl[] = {\n    overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 0),\n    overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 1),\n    overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 2),\n    overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 3),\n    overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 4),\n    overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 5),\n    overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 6),\n    overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 7),\n    overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 8),\n    overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Twin[] = {\n    overworld_frame(gObjectEventPic_Twin, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Twin, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Twin, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Twin, 2, 2, 3),\n    overworld_frame(gObjectEventPic_Twin, 2, 2, 4),\n    overworld_frame(gObjectEventPic_Twin, 2, 2, 5),\n    overworld_frame(gObjectEventPic_Twin, 2, 2, 6),\n    overworld_frame(gObjectEventPic_Twin, 2, 2, 7),\n    overworld_frame(gObjectEventPic_Twin, 2, 2, 8),\n    overworld_frame(gObjectEventPic_Twin, 2, 2, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_SittingBoy[] = {\n    overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 0),\n    overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 2),\n    overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 1),\n    overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 0),\n    overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 0),\n    overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 2),\n    overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 2),\n    overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 1),\n    overworld_frame(gObjectEventPic_SittingBoy, 2, 4, 1),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Lass[] = {\n    overworld_frame(gObjectEventPic_Lass, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Lass, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Lass, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Lass, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Lass, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Lass, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Lass, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Lass, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Lass, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Lass, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Youngster[] = {\n    overworld_frame(gObjectEventPic_Youngster, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Youngster, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Youngster, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Youngster, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Youngster, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Youngster, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Youngster, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Youngster, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Youngster, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Youngster, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Woman1[] = {\n    overworld_frame(gObjectEventPic_Woman1, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Woman1, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Woman1, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Woman1, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Woman1, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Woman1, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Woman1, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Woman1, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Woman1, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Woman1, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Woman3[] = {\n    overworld_frame(gObjectEventPic_Woman3, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Woman3, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Woman3, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Woman3, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Woman3, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Woman3, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Woman3, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Woman3, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Woman3, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_BattleGirl[] = {\n    overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 0),\n    overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 1),\n    overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 2),\n    overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 3),\n    overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 4),\n    overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 5),\n    overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 6),\n    overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 7),\n    overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 8),\n    overworld_frame(gObjectEventPic_BattleGirl, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Painter[] = {\n    overworld_frame(gObjectEventPic_Painter, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Painter, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Painter, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Painter, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Painter, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Painter, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Painter, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Painter, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Painter, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Painter, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_BugCatcher[] = {\n    overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 0),\n    overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 1),\n    overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 2),\n    overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 3),\n    overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 4),\n    overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 5),\n    overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 6),\n    overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 7),\n    overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 8),\n    overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_FatMan[] = {\n    overworld_frame(gObjectEventPic_FatMan, 2, 4, 0),\n    overworld_frame(gObjectEventPic_FatMan, 2, 4, 1),\n    overworld_frame(gObjectEventPic_FatMan, 2, 4, 2),\n    overworld_frame(gObjectEventPic_FatMan, 2, 4, 3),\n    overworld_frame(gObjectEventPic_FatMan, 2, 4, 4),\n    overworld_frame(gObjectEventPic_FatMan, 2, 4, 5),\n    overworld_frame(gObjectEventPic_FatMan, 2, 4, 6),\n    overworld_frame(gObjectEventPic_FatMan, 2, 4, 7),\n    overworld_frame(gObjectEventPic_FatMan, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Scott[] = {\n    overworld_frame(gObjectEventPic_Scott, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Scott, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Scott, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Scott, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Scott, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Scott, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Scott, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Scott, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Scott, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_BaldingMan[] = {\n    overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 0),\n    overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 1),\n    overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 2),\n    overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 3),\n    overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 4),\n    overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 5),\n    overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 6),\n    overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 7),\n    overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 8),\n    overworld_frame(gObjectEventPic_BaldingMan, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Woman2[] = {\n    overworld_frame(gObjectEventPic_Woman2, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Woman2, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Woman2, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Woman2, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Woman2, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Woman2, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Woman2, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Woman2, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Woman2, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Woman2, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_OldMan1[] = {\n    overworld_frame(gObjectEventPic_OldMan1, 2, 4, 0),\n    overworld_frame(gObjectEventPic_OldMan1, 2, 4, 1),\n    overworld_frame(gObjectEventPic_OldMan1, 2, 4, 2),\n    overworld_frame(gObjectEventPic_OldMan1, 2, 4, 3),\n    overworld_frame(gObjectEventPic_OldMan1, 2, 4, 4),\n    overworld_frame(gObjectEventPic_OldMan1, 2, 4, 5),\n    overworld_frame(gObjectEventPic_OldMan1, 2, 4, 6),\n    overworld_frame(gObjectEventPic_OldMan1, 2, 4, 7),\n    overworld_frame(gObjectEventPic_OldMan1, 2, 4, 8),\n    overworld_frame(gObjectEventPic_OldMan1, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_WorkerM[] = {\n    overworld_frame(gObjectEventPic_WorkerM, 2, 4, 0),\n    overworld_frame(gObjectEventPic_WorkerM, 2, 4, 1),\n    overworld_frame(gObjectEventPic_WorkerM, 2, 4, 2),\n    overworld_frame(gObjectEventPic_WorkerM, 2, 4, 3),\n    overworld_frame(gObjectEventPic_WorkerM, 2, 4, 4),\n    overworld_frame(gObjectEventPic_WorkerM, 2, 4, 5),\n    overworld_frame(gObjectEventPic_WorkerM, 2, 4, 6),\n    overworld_frame(gObjectEventPic_WorkerM, 2, 4, 7),\n    overworld_frame(gObjectEventPic_WorkerM, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_WorkerF[] = {\n    overworld_frame(gObjectEventPic_WorkerF, 2, 4, 0),\n    overworld_frame(gObjectEventPic_WorkerF, 2, 4, 1),\n    overworld_frame(gObjectEventPic_WorkerF, 2, 4, 2),\n    overworld_frame(gObjectEventPic_WorkerF, 2, 4, 3),\n    overworld_frame(gObjectEventPic_WorkerF, 2, 4, 4),\n    overworld_frame(gObjectEventPic_WorkerF, 2, 4, 5),\n    overworld_frame(gObjectEventPic_WorkerF, 2, 4, 6),\n    overworld_frame(gObjectEventPic_WorkerF, 2, 4, 7),\n    overworld_frame(gObjectEventPic_WorkerF, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Beauty[] = {\n    overworld_frame(gObjectEventPic_Beauty, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Beauty, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Beauty, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Beauty, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Beauty, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Beauty, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Beauty, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Beauty, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Beauty, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Beauty, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Chef[] = {\n    overworld_frame(gObjectEventPic_Chef, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Chef, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Chef, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Chef, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Chef, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Chef, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Chef, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Chef, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Chef, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_OldMan2[] = {\n    overworld_frame(gObjectEventPic_OldMan2, 2, 4, 0),\n    overworld_frame(gObjectEventPic_OldMan2, 2, 4, 1),\n    overworld_frame(gObjectEventPic_OldMan2, 2, 4, 2),\n    overworld_frame(gObjectEventPic_OldMan2, 2, 4, 0),\n    overworld_frame(gObjectEventPic_OldMan2, 2, 4, 0),\n    overworld_frame(gObjectEventPic_OldMan2, 2, 4, 1),\n    overworld_frame(gObjectEventPic_OldMan2, 2, 4, 1),\n    overworld_frame(gObjectEventPic_OldMan2, 2, 4, 2),\n    overworld_frame(gObjectEventPic_OldMan2, 2, 4, 2),\n    overworld_frame(gObjectEventPic_OldWoman, 2, 4, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_OldManLyingDown[] = {\n    overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0),\n    overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0),\n    overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0),\n    overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0),\n    overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0),\n    overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0),\n    overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0),\n    overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0),\n    overworld_frame(gObjectEventPic_OldManLyingDown, 4, 4, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_OldWoman[] = {\n    overworld_frame(gObjectEventPic_OldWoman, 2, 4, 0),\n    overworld_frame(gObjectEventPic_OldWoman, 2, 4, 1),\n    overworld_frame(gObjectEventPic_OldWoman, 2, 4, 2),\n    overworld_frame(gObjectEventPic_OldWoman, 2, 4, 3),\n    overworld_frame(gObjectEventPic_OldWoman, 2, 4, 4),\n    overworld_frame(gObjectEventPic_OldWoman, 2, 4, 5),\n    overworld_frame(gObjectEventPic_OldWoman, 2, 4, 6),\n    overworld_frame(gObjectEventPic_OldWoman, 2, 4, 7),\n    overworld_frame(gObjectEventPic_OldWoman, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Camper[] = {\n    overworld_frame(gObjectEventPic_Camper, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Camper, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Camper, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Camper, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Camper, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Camper, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Camper, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Camper, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Camper, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Camper, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Picnicker[] = {\n    overworld_frame(gObjectEventPic_Picnicker, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Picnicker, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Picnicker, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Picnicker, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Picnicker, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Picnicker, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Picnicker, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Picnicker, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Picnicker, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Picnicker, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_CooltrainerM[] = {\n    overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 0),\n    overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 1),\n    overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 2),\n    overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 3),\n    overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 4),\n    overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 5),\n    overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 6),\n    overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 7),\n    overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 8),\n    overworld_frame(gObjectEventPic_CooltrainerM, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_CooltrainerF[] = {\n    overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 0),\n    overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 1),\n    overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 2),\n    overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 3),\n    overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 4),\n    overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 5),\n    overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 6),\n    overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 7),\n    overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 8),\n    overworld_frame(gObjectEventPic_CooltrainerF, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Boy[] = {\n    overworld_frame(gObjectEventPic_Boy, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Boy, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Boy, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Boy, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Boy, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Boy, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Boy, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Boy, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Boy, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Boy, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_SuperNerd[] = {\n    overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 0),\n    overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 1),\n    overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 2),\n    overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 3),\n    overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 4),\n    overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 5),\n    overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 6),\n    overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 7),\n    overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 8),\n    overworld_frame(gObjectEventPic_SuperNerd, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Channeler[] = {\n    overworld_frame(gObjectEventPic_Channeler, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Channeler, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Channeler, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Channeler, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Channeler, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Channeler, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Channeler, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Channeler, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Channeler, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Channeler, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_RocketF[] = {\n    overworld_frame(gObjectEventPic_RocketF, 2, 4, 0),\n    overworld_frame(gObjectEventPic_RocketF, 2, 4, 1),\n    overworld_frame(gObjectEventPic_RocketF, 2, 4, 2),\n    overworld_frame(gObjectEventPic_RocketF, 2, 4, 3),\n    overworld_frame(gObjectEventPic_RocketF, 2, 4, 4),\n    overworld_frame(gObjectEventPic_RocketF, 2, 4, 5),\n    overworld_frame(gObjectEventPic_RocketF, 2, 4, 6),\n    overworld_frame(gObjectEventPic_RocketF, 2, 4, 7),\n    overworld_frame(gObjectEventPic_RocketF, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_SwimmerMWater[] = {\n    overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 0),\n    overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 1),\n    overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 2),\n    overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 3),\n    overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 4),\n    overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 5),\n    overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 6),\n    overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 7),\n    overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 8),\n    overworld_frame(gObjectEventPic_SwimmerMWater, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_SwimmerFWater[] = {\n    overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 0),\n    overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 1),\n    overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 2),\n    overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 3),\n    overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 4),\n    overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 5),\n    overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 6),\n    overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 7),\n    overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 8),\n    overworld_frame(gObjectEventPic_SwimmerFWater, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_SwimmerMLand[] = {\n    overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 0),\n    overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 1),\n    overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 2),\n    overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 3),\n    overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 4),\n    overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 5),\n    overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 6),\n    overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 7),\n    overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 8),\n    overworld_frame(gObjectEventPic_SwimmerMLand, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_SwimmerFLand[] = {\n    overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 0),\n    overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 1),\n    overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 2),\n    overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 3),\n    overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 4),\n    overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 5),\n    overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 6),\n    overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 7),\n    overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 8),\n    overworld_frame(gObjectEventPic_SwimmerFLand, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Blackbelt[] = {\n    overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Blackbelt, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Scientist[] = {\n    overworld_frame(gObjectEventPic_Scientist, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Scientist, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Scientist, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Scientist, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Scientist, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Scientist, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Scientist, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Scientist, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Scientist, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Scientist, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Gentleman[] = {\n    overworld_frame(gObjectEventPic_Gentleman, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Gentleman, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Gentleman, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Gentleman, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Gentleman, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Gentleman, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Gentleman, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Gentleman, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Gentleman, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Gentleman, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Sailor[] = {\n    overworld_frame(gObjectEventPic_Sailor, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Sailor, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Sailor, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Sailor, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Sailor, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Sailor, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Sailor, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Sailor, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Sailor, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Sailor, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Captain[] = {\n    overworld_frame(gObjectEventPic_Captain, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Captain, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Captain, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Captain, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Captain, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Captain, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Captain, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Captain, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Captain, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Fisher[] = {\n    overworld_frame(gObjectEventPic_Fisher, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Fisher, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Fisher, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Fisher, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Fisher, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Fisher, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Fisher, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Fisher, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Fisher, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Fisher, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_TeachyTVHost[] = {\n    overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 0),\n    overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 1),\n    overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 2),\n    overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 3),\n    overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 4),\n    overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 5),\n    overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 6),\n    overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 7),\n    overworld_frame(gObjectEventPic_TeachyTVHost, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_UnusedWoman[] = {\n    overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 0),\n    overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 1),\n    overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 2),\n    overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 3),\n    overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 4),\n    overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 5),\n    overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 6),\n    overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 7),\n    overworld_frame(gObjectEventPic_UnusedWoman, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_TuberF[] = {\n    overworld_frame(gObjectEventPic_TuberF, 2, 2, 0),\n    overworld_frame(gObjectEventPic_TuberF, 2, 2, 1),\n    overworld_frame(gObjectEventPic_TuberF, 2, 2, 2),\n    overworld_frame(gObjectEventPic_TuberF, 2, 2, 3),\n    overworld_frame(gObjectEventPic_TuberF, 2, 2, 4),\n    overworld_frame(gObjectEventPic_TuberF, 2, 2, 5),\n    overworld_frame(gObjectEventPic_TuberF, 2, 2, 6),\n    overworld_frame(gObjectEventPic_TuberF, 2, 2, 7),\n    overworld_frame(gObjectEventPic_TuberF, 2, 2, 8),\n    overworld_frame(gObjectEventPic_TuberF, 2, 2, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_TuberMWater[] = {\n    overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 0),\n    overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 1),\n    overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 2),\n    overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 3),\n    overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 4),\n    overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 5),\n    overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 6),\n    overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 7),\n    overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 8),\n    overworld_frame(gObjectEventPic_TuberMWater, 2, 2, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_TuberMLand[] = {\n    overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 0),\n    overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 1),\n    overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 2),\n    overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 3),\n    overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 4),\n    overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 5),\n    overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 6),\n    overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 7),\n    overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 8),\n    overworld_frame(gObjectEventPic_TuberMLand, 2, 2, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Hiker[] = {\n    overworld_frame(gObjectEventPic_Hiker, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Hiker, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Hiker, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Hiker, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Hiker, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Hiker, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Hiker, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Hiker, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Hiker, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Hiker, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_BirdKeeper[] = {\n    overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 0),\n    overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 1),\n    overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 2),\n    overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 3),\n    overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 4),\n    overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 5),\n    overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 6),\n    overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 7),\n    overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 8),\n    overworld_frame(gObjectEventPic_BirdKeeper, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_PokemonRangerF[] = {\n    overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 0),\n    overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 1),\n    overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 2),\n    overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 3),\n    overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 4),\n    overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 5),\n    overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 6),\n    overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 7),\n    overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 8),\n    overworld_frame(gObjectEventPic_PokemonRangerF, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_PokemonRangerM[] = {\n    overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 0),\n    overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 1),\n    overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 2),\n    overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 3),\n    overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 4),\n    overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 5),\n    overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 6),\n    overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 7),\n    overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 8),\n    overworld_frame(gObjectEventPic_PokemonRangerM, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Burglar[] = {\n    overworld_frame(gObjectEventPic_Burglar, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Burglar, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Burglar, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Burglar, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Burglar, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Burglar, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Burglar, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Burglar, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Burglar, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Burglar, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_RuinManiac[] = {\n    overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 0),\n    overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 1),\n    overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 2),\n    overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 3),\n    overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 4),\n    overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 5),\n    overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 6),\n    overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 7),\n    overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 8),\n    overworld_frame(gObjectEventPic_RuinManiac, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_PsychicM[] = {\n    overworld_frame(gObjectEventPic_PsychicM, 2, 4, 0),\n    overworld_frame(gObjectEventPic_PsychicM, 2, 4, 1),\n    overworld_frame(gObjectEventPic_PsychicM, 2, 4, 2),\n    overworld_frame(gObjectEventPic_PsychicM, 2, 4, 3),\n    overworld_frame(gObjectEventPic_PsychicM, 2, 4, 4),\n    overworld_frame(gObjectEventPic_PsychicM, 2, 4, 5),\n    overworld_frame(gObjectEventPic_PsychicM, 2, 4, 6),\n    overworld_frame(gObjectEventPic_PsychicM, 2, 4, 7),\n    overworld_frame(gObjectEventPic_PsychicM, 2, 4, 8),\n    overworld_frame(gObjectEventPic_PsychicM, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_PsychicF[] = {\n    overworld_frame(gObjectEventPic_PsychicF, 2, 4, 0),\n    overworld_frame(gObjectEventPic_PsychicF, 2, 4, 1),\n    overworld_frame(gObjectEventPic_PsychicF, 2, 4, 2),\n    overworld_frame(gObjectEventPic_PsychicF, 2, 4, 3),\n    overworld_frame(gObjectEventPic_PsychicF, 2, 4, 4),\n    overworld_frame(gObjectEventPic_PsychicF, 2, 4, 5),\n    overworld_frame(gObjectEventPic_PsychicF, 2, 4, 6),\n    overworld_frame(gObjectEventPic_PsychicF, 2, 4, 7),\n    overworld_frame(gObjectEventPic_PsychicF, 2, 4, 8),\n    overworld_frame(gObjectEventPic_PsychicF, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_AromaLady[] = {\n    overworld_frame(gObjectEventPic_AromaLady, 2, 4, 0),\n    overworld_frame(gObjectEventPic_AromaLady, 2, 4, 1),\n    overworld_frame(gObjectEventPic_AromaLady, 2, 4, 2),\n    overworld_frame(gObjectEventPic_AromaLady, 2, 4, 3),\n    overworld_frame(gObjectEventPic_AromaLady, 2, 4, 4),\n    overworld_frame(gObjectEventPic_AromaLady, 2, 4, 5),\n    overworld_frame(gObjectEventPic_AromaLady, 2, 4, 6),\n    overworld_frame(gObjectEventPic_AromaLady, 2, 4, 7),\n    overworld_frame(gObjectEventPic_AromaLady, 2, 4, 8),\n    overworld_frame(gObjectEventPic_AromaLady, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_PokeManiac[] = {\n    overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 0),\n    overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 1),\n    overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 2),\n    overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 3),\n    overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 4),\n    overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 5),\n    overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 6),\n    overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 7),\n    overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 8),\n    overworld_frame(gObjectEventPic_PokeManiac, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Juggler[] = {\n    overworld_frame(gObjectEventPic_Juggler, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Juggler, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Juggler, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Juggler, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Juggler, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Juggler, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Juggler, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Juggler, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Juggler, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Juggler, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_PokemonBreeder[] = {\n    overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 0),\n    overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 1),\n    overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 2),\n    overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 3),\n    overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 4),\n    overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 5),\n    overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 6),\n    overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 7),\n    overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 8),\n    overworld_frame(gObjectEventPic_PokemonBreeder, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Tamer[] = {\n    overworld_frame(gObjectEventPic_Tamer, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Tamer, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Tamer, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Tamer, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Tamer, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Tamer, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Tamer, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Tamer, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Tamer, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Tamer, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Engineer[] = {\n    overworld_frame(gObjectEventPic_Engineer, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Engineer, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Engineer, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Engineer, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Engineer, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Engineer, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Engineer, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Engineer, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Engineer, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Engineer, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_YoungCoupleM[] = {\n    overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 0),\n    overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 1),\n    overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 2),\n    overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 3),\n    overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 4),\n    overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 5),\n    overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 6),\n    overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 7),\n    overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 8),\n    overworld_frame(gObjectEventPic_YoungCoupleM, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_YoungCoupleF[] = {\n    overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 0),\n    overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 1),\n    overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 2),\n    overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 3),\n    overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 4),\n    overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 5),\n    overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 6),\n    overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 7),\n    overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 8),\n    overworld_frame(gObjectEventPic_YoungCoupleF, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_CueBall[] = {\n    overworld_frame(gObjectEventPic_CueBall, 4, 4, 0),\n    overworld_frame(gObjectEventPic_CueBall, 4, 4, 1),\n    overworld_frame(gObjectEventPic_CueBall, 4, 4, 2),\n    overworld_frame(gObjectEventPic_CueBall, 4, 4, 3),\n    overworld_frame(gObjectEventPic_CueBall, 4, 4, 4),\n    overworld_frame(gObjectEventPic_CueBall, 4, 4, 5),\n    overworld_frame(gObjectEventPic_CueBall, 4, 4, 6),\n    overworld_frame(gObjectEventPic_CueBall, 4, 4, 7),\n    overworld_frame(gObjectEventPic_CueBall, 4, 4, 8),\n    overworld_frame(gObjectEventPic_CueBall, 4, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Biker[] = {\n    overworld_frame(gObjectEventPic_Biker, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Biker, 4, 4, 1),\n    overworld_frame(gObjectEventPic_Biker, 4, 4, 2),\n    overworld_frame(gObjectEventPic_Biker, 4, 4, 3),\n    overworld_frame(gObjectEventPic_Biker, 4, 4, 4),\n    overworld_frame(gObjectEventPic_Biker, 4, 4, 5),\n    overworld_frame(gObjectEventPic_Biker, 4, 4, 6),\n    overworld_frame(gObjectEventPic_Biker, 4, 4, 7),\n    overworld_frame(gObjectEventPic_Biker, 4, 4, 8),\n    overworld_frame(gObjectEventPic_Biker, 4, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_GymGuy[] = {\n    overworld_frame(gObjectEventPic_GymGuy, 2, 4, 0),\n    overworld_frame(gObjectEventPic_GymGuy, 2, 4, 1),\n    overworld_frame(gObjectEventPic_GymGuy, 2, 4, 2),\n    overworld_frame(gObjectEventPic_GymGuy, 2, 4, 3),\n    overworld_frame(gObjectEventPic_GymGuy, 2, 4, 4),\n    overworld_frame(gObjectEventPic_GymGuy, 2, 4, 5),\n    overworld_frame(gObjectEventPic_GymGuy, 2, 4, 6),\n    overworld_frame(gObjectEventPic_GymGuy, 2, 4, 7),\n    overworld_frame(gObjectEventPic_GymGuy, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Nurse[] = {\n    overworld_frame(gObjectEventPic_Nurse, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Nurse, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Nurse, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Nurse, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Nurse, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Nurse, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Nurse, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Nurse, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Nurse, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Nurse, 2, 4, 3),\n};\n\nstatic const struct SpriteFrameImage sPicTable_UnusedMaleReceptionist[] = {\n    overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 0),\n    overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 1),\n    overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 2),\n    overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 0),\n    overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 0),\n    overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 1),\n    overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 1),\n    overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 2),\n    overworld_frame(gObjectEventPic_UnusedMaleReceptionist, 2, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_ItemBall[] = {\n    overworld_frame(gObjectEventPic_ItemBall, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_ProfOak[] = {\n    overworld_frame(gObjectEventPic_ProfOak, 2, 4, 0),\n    overworld_frame(gObjectEventPic_ProfOak, 2, 4, 1),\n    overworld_frame(gObjectEventPic_ProfOak, 2, 4, 2),\n    overworld_frame(gObjectEventPic_ProfOak, 2, 4, 3),\n    overworld_frame(gObjectEventPic_ProfOak, 2, 4, 4),\n    overworld_frame(gObjectEventPic_ProfOak, 2, 4, 5),\n    overworld_frame(gObjectEventPic_ProfOak, 2, 4, 6),\n    overworld_frame(gObjectEventPic_ProfOak, 2, 4, 7),\n    overworld_frame(gObjectEventPic_ProfOak, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Man[] = {\n    overworld_frame(gObjectEventPic_Man, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Man, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Man, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Man, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Man, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Man, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Man, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Man, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Man, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Man, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Rocker[] = {\n    overworld_frame(gObjectEventPic_Rocker, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Rocker, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Rocker, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Rocker, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Rocker, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Rocker, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Rocker, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Rocker, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Rocker, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Rocker, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_MrFuji[] = {\n    overworld_frame(gObjectEventPic_MrFuji, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MrFuji, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MrFuji, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MrFuji, 2, 4, 3),\n    overworld_frame(gObjectEventPic_MrFuji, 2, 4, 4),\n    overworld_frame(gObjectEventPic_MrFuji, 2, 4, 5),\n    overworld_frame(gObjectEventPic_MrFuji, 2, 4, 6),\n    overworld_frame(gObjectEventPic_MrFuji, 2, 4, 7),\n    overworld_frame(gObjectEventPic_MrFuji, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Bruno[] = {\n    overworld_frame(gObjectEventPic_Bruno, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Bruno, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Bruno, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Bruno, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Bruno, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Bruno, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Bruno, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Bruno, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Bruno, 2, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_CutTree[] = {\n    overworld_frame(gObjectEventPic_CutTree, 2, 2, 0),\n    overworld_frame(gObjectEventPic_CutTree, 2, 2, 1),\n    overworld_frame(gObjectEventPic_CutTree, 2, 2, 2),\n    overworld_frame(gObjectEventPic_CutTree, 2, 2, 3),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Clerk[] = {\n    overworld_frame(gObjectEventPic_Clerk, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Clerk, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Clerk, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Clerk, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Clerk, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Clerk, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Clerk, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Clerk, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Clerk, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_MGDeliveryman[] = {\n    overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MGDeliveryman, 2, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_TrainerTowerDude[] = {\n    overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 0),\n    overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 1),\n    overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 2),\n    overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 0),\n    overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 0),\n    overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 1),\n    overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 1),\n    overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 2),\n    overworld_frame(gObjectEventPic_TrainerTowerDude, 2, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_CableClubReceptionist[] = {\n    overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 0),\n    overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 1),\n    overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 2),\n    overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 3),\n    overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 4),\n    overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 5),\n    overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 6),\n    overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 7),\n    overworld_frame(gObjectEventPic_CableClubReceptionist, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_UnionRoomReceptionist[] = {\n    overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 0),\n    overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 1),\n    overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 2),\n    overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 0),\n    overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 0),\n    overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 1),\n    overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 1),\n    overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 2),\n    overworld_frame(gObjectEventPic_UnionRoomReceptionist, 2, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_RockSmashRock[] = {\n    overworld_frame(gObjectEventPic_RockSmashRock, 2, 2, 0),\n    overworld_frame(gObjectEventPic_RockSmashRock, 2, 2, 1),\n    overworld_frame(gObjectEventPic_RockSmashRock, 2, 2, 2),\n    overworld_frame(gObjectEventPic_RockSmashRock, 2, 2, 3),\n};\n\nstatic const struct SpriteFrameImage sPicTable_StrengthBoulder[] = {\n    overworld_frame(gObjectEventPic_StrengthBoulder, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_RocketM[] = {\n    overworld_frame(gObjectEventPic_RocketM, 2, 4, 0),\n    overworld_frame(gObjectEventPic_RocketM, 2, 4, 1),\n    overworld_frame(gObjectEventPic_RocketM, 2, 4, 2),\n    overworld_frame(gObjectEventPic_RocketM, 2, 4, 3),\n    overworld_frame(gObjectEventPic_RocketM, 2, 4, 4),\n    overworld_frame(gObjectEventPic_RocketM, 2, 4, 5),\n    overworld_frame(gObjectEventPic_RocketM, 2, 4, 6),\n    overworld_frame(gObjectEventPic_RocketM, 2, 4, 7),\n    overworld_frame(gObjectEventPic_RocketM, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Celio[] = {\n    overworld_frame(gObjectEventPic_Celio, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Celio, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Celio, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Celio, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Celio, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Celio, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Celio, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Celio, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Celio, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Agatha[] = {\n    overworld_frame(gObjectEventPic_Agatha, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Agatha, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Agatha, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Agatha, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Agatha, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Agatha, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Agatha, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Agatha, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Agatha, 2, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Brock[] = {\n    overworld_frame(gObjectEventPic_Brock, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Brock, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Brock, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Brock, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Brock, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Brock, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Brock, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Brock, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Brock, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Misty[] = {\n    overworld_frame(gObjectEventPic_Misty, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Misty, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Misty, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Misty, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Misty, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Misty, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Misty, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Misty, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Misty, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_LtSurge[] = {\n    overworld_frame(gObjectEventPic_LtSurge, 2, 4, 0),\n    overworld_frame(gObjectEventPic_LtSurge, 2, 4, 1),\n    overworld_frame(gObjectEventPic_LtSurge, 2, 4, 2),\n    overworld_frame(gObjectEventPic_LtSurge, 2, 4, 3),\n    overworld_frame(gObjectEventPic_LtSurge, 2, 4, 4),\n    overworld_frame(gObjectEventPic_LtSurge, 2, 4, 5),\n    overworld_frame(gObjectEventPic_LtSurge, 2, 4, 6),\n    overworld_frame(gObjectEventPic_LtSurge, 2, 4, 7),\n    overworld_frame(gObjectEventPic_LtSurge, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Erika[] = {\n    overworld_frame(gObjectEventPic_Erika, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Erika, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Erika, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Erika, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Erika, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Erika, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Erika, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Erika, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Erika, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Koga[] = {\n    overworld_frame(gObjectEventPic_Koga, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Koga, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Koga, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Koga, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Koga, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Koga, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Koga, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Koga, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Koga, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Giovanni[] = {\n    overworld_frame(gObjectEventPic_Giovanni, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Giovanni, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Giovanni, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Giovanni, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Giovanni, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Giovanni, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Giovanni, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Giovanni, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Giovanni, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Blaine[] = {\n    overworld_frame(gObjectEventPic_Blaine, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Blaine, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Blaine, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Blaine, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Blaine, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Blaine, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Blaine, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Blaine, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Blaine, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Sabrina[] = {\n    overworld_frame(gObjectEventPic_Sabrina, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Sabrina, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Sabrina, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Sabrina, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Sabrina, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Sabrina, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Sabrina, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Sabrina, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Sabrina, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Bill[] = {\n    overworld_frame(gObjectEventPic_Bill, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Bill, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Bill, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Bill, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Bill, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Bill, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Bill, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Bill, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Bill, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Daisy[] = {\n    overworld_frame(gObjectEventPic_Daisy, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Daisy, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Daisy, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Daisy, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Daisy, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Daisy, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Daisy, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Daisy, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Daisy, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Lorelei[] = {\n    overworld_frame(gObjectEventPic_Lorelei, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Lorelei, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Lorelei, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Lorelei, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Lorelei, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Lorelei, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Lorelei, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Lorelei, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Lorelei, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Lance[] = {\n    overworld_frame(gObjectEventPic_Lance, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Lance, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Lance, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Lance, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Lance, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Lance, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Lance, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Lance, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Lance, 2, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Blue[] = {\n    overworld_frame(gObjectEventPic_Blue, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Blue, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Blue, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Blue, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Blue, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Blue, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Blue, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Blue, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Blue, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_RedFish[] = {\n    overworld_frame(gObjectEventPic_RedFish, 4, 4, 0),\n    overworld_frame(gObjectEventPic_RedFish, 4, 4, 1),\n    overworld_frame(gObjectEventPic_RedFish, 4, 4, 2),\n    overworld_frame(gObjectEventPic_RedFish, 4, 4, 3),\n    overworld_frame(gObjectEventPic_RedFish, 4, 4, 4),\n    overworld_frame(gObjectEventPic_RedFish, 4, 4, 5),\n    overworld_frame(gObjectEventPic_RedFish, 4, 4, 6),\n    overworld_frame(gObjectEventPic_RedFish, 4, 4, 7),\n    overworld_frame(gObjectEventPic_RedFish, 4, 4, 8),\n    overworld_frame(gObjectEventPic_RedFish, 4, 4, 9),\n    overworld_frame(gObjectEventPic_RedFish, 4, 4, 10),\n    overworld_frame(gObjectEventPic_RedFish, 4, 4, 11),\n};\n\nstatic const struct SpriteFrameImage sPicTable_GreenFish[] = {\n    overworld_frame(gObjectEventPic_GreenFish, 4, 4, 0),\n    overworld_frame(gObjectEventPic_GreenFish, 4, 4, 1),\n    overworld_frame(gObjectEventPic_GreenFish, 4, 4, 2),\n    overworld_frame(gObjectEventPic_GreenFish, 4, 4, 3),\n    overworld_frame(gObjectEventPic_GreenFish, 4, 4, 4),\n    overworld_frame(gObjectEventPic_GreenFish, 4, 4, 5),\n    overworld_frame(gObjectEventPic_GreenFish, 4, 4, 6),\n    overworld_frame(gObjectEventPic_GreenFish, 4, 4, 7),\n    overworld_frame(gObjectEventPic_GreenFish, 4, 4, 8),\n    overworld_frame(gObjectEventPic_GreenFish, 4, 4, 9),\n    overworld_frame(gObjectEventPic_GreenFish, 4, 4, 10),\n    overworld_frame(gObjectEventPic_GreenFish, 4, 4, 11),\n};\n\nstatic const struct SpriteFrameImage sPicTable_TownMap[] = {\n    overworld_frame(gObjectEventPic_TownMap, 2, 4, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Pokedex[] = {\n    overworld_frame(gObjectEventPic_Pokedex, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_GBAKid[] = {\n    overworld_frame(gObjectEventPic_GBAKid, 2, 4, 0),\n    overworld_frame(gObjectEventPic_GBAKid, 2, 4, 1),\n    overworld_frame(gObjectEventPic_GBAKid, 2, 4, 2),\n    overworld_frame(gObjectEventPic_GBAKid, 2, 4, 0),\n    overworld_frame(gObjectEventPic_GBAKid, 2, 4, 0),\n    overworld_frame(gObjectEventPic_GBAKid, 2, 4, 1),\n    overworld_frame(gObjectEventPic_GBAKid, 2, 4, 1),\n    overworld_frame(gObjectEventPic_GBAKid, 2, 4, 2),\n    overworld_frame(gObjectEventPic_GBAKid, 2, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Fossil[] = {\n    overworld_frame(gObjectEventPic_Fossil, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Ruby[] = {\n    overworld_frame(gObjectEventPic_Ruby, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Sapphire[] = {\n    overworld_frame(gObjectEventPic_Sapphire, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_OldAmber[] = {\n    overworld_frame(gObjectEventPic_OldAmber, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_GymSign[] = {\n    overworld_frame(gObjectEventPic_GymSign, 2, 4, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Sign[] = {\n    overworld_frame(gObjectEventPic_Sign, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_WoodenSign[] = {\n    overworld_frame(gObjectEventPic_WoodenSign, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Clipboard[] = {\n    overworld_frame(gObjectEventPic_Clipboard, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_BirthIslandStone[] = {\n    overworld_frame(gObjectEventPic_BirthIslandStone, 4, 4, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_LaprasDoll[] = {\n    overworld_frame(gObjectEventPic_LaprasDoll, 4, 4, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Seagallop[] = {\n    overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0),\n    overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0),\n    overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0),\n    overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0),\n    overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0),\n    overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0),\n    overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0),\n    overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0),\n    overworld_frame(gObjectEventPic_Seagallop, 4, 16, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_SSAnne[] = {\n    overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0),\n    overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0),\n    overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0),\n    overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0),\n    overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0),\n    overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0),\n    overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0),\n    overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0),\n    overworld_frame(gObjectEventPic_SSAnne, 8, 16, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Snorlax[] = {\n    overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Snorlax, 4, 4, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Spearow[] = {\n    overworld_frame(gObjectEventPic_Spearow, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Spearow, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Spearow, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Spearow, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Spearow, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Spearow, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Spearow, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Spearow, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Spearow, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Pidgeot[] = {\n    overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Pidgeot, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Omanyte[] = {\n    overworld_frame(gObjectEventPic_Omanyte, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Omanyte, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Omanyte, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Omanyte, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Omanyte, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Omanyte, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Omanyte, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Omanyte, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Omanyte, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Kangaskhan[] = {\n    overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Kangaskhan, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Psyduck[] = {\n    overworld_frame(gObjectEventPic_Psyduck, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Psyduck, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Psyduck, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Psyduck, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Psyduck, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Psyduck, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Psyduck, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Psyduck, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Psyduck, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_NidoranF[] = {\n    overworld_frame(gObjectEventPic_NidoranF, 2, 2, 0),\n    overworld_frame(gObjectEventPic_NidoranF, 2, 2, 1),\n    overworld_frame(gObjectEventPic_NidoranF, 2, 2, 2),\n    overworld_frame(gObjectEventPic_NidoranF, 2, 2, 0),\n    overworld_frame(gObjectEventPic_NidoranF, 2, 2, 0),\n    overworld_frame(gObjectEventPic_NidoranF, 2, 2, 1),\n    overworld_frame(gObjectEventPic_NidoranF, 2, 2, 1),\n    overworld_frame(gObjectEventPic_NidoranF, 2, 2, 2),\n    overworld_frame(gObjectEventPic_NidoranF, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_NidoranM[] = {\n    overworld_frame(gObjectEventPic_NidoranM, 2, 2, 0),\n    overworld_frame(gObjectEventPic_NidoranM, 2, 2, 1),\n    overworld_frame(gObjectEventPic_NidoranM, 2, 2, 2),\n    overworld_frame(gObjectEventPic_NidoranM, 2, 2, 0),\n    overworld_frame(gObjectEventPic_NidoranM, 2, 2, 0),\n    overworld_frame(gObjectEventPic_NidoranM, 2, 2, 1),\n    overworld_frame(gObjectEventPic_NidoranM, 2, 2, 1),\n    overworld_frame(gObjectEventPic_NidoranM, 2, 2, 2),\n    overworld_frame(gObjectEventPic_NidoranM, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Nidorino[] = {\n    overworld_frame(gObjectEventPic_Nidorino, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Nidorino, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Nidorino, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Nidorino, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Nidorino, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Nidorino, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Nidorino, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Nidorino, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Nidorino, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Meowth[] = {\n    overworld_frame(gObjectEventPic_Meowth, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Meowth, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Meowth, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Meowth, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Meowth, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Meowth, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Meowth, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Meowth, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Meowth, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Seel[] = {\n    overworld_frame(gObjectEventPic_Seel, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Seel, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Seel, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Seel, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Seel, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Seel, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Seel, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Seel, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Seel, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Voltorb[] = {\n    overworld_frame(gObjectEventPic_Voltorb, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Voltorb, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Voltorb, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Voltorb, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Voltorb, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Voltorb, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Voltorb, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Voltorb, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Voltorb, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Slowpoke[] = {\n    overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Slowpoke, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Slowbro[] = {\n    overworld_frame(gObjectEventPic_Slowbro, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Slowbro, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Slowbro, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Slowbro, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Slowbro, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Slowbro, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Slowbro, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Slowbro, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Slowbro, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Machop[] = {\n    overworld_frame(gObjectEventPic_Machop, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Machop, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Machop, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Machop, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Machop, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Machop, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Machop, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Machop, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Machop, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Wigglytuff[] = {\n    overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Wigglytuff, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Doduo[] = {\n    overworld_frame(gObjectEventPic_Doduo, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Doduo, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Doduo, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Doduo, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Doduo, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Doduo, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Doduo, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Doduo, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Doduo, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Fearow[] = {\n    overworld_frame(gObjectEventPic_Fearow, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Fearow, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Fearow, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Fearow, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Fearow, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Fearow, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Fearow, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Fearow, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Fearow, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Lapras[] = {\n    overworld_frame(gObjectEventPic_Lapras, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Lapras, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Lapras, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Lapras, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Lapras, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Lapras, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Lapras, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Lapras, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Lapras, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Zapdos[] = {\n    overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Zapdos, 4, 4, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Moltres[] = {\n    overworld_frame(gObjectEventPic_Moltres, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Moltres, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Moltres, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Moltres, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Moltres, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Moltres, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Moltres, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Moltres, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Moltres, 4, 4, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Articuno[] = {\n    overworld_frame(gObjectEventPic_Articuno, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Articuno, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Articuno, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Articuno, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Articuno, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Articuno, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Articuno, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Articuno, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Articuno, 4, 4, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_DeoxysD[] = {\n    overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 1),\n    overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 1),\n    overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysD, 4, 4, 1),\n};\n\nstatic const struct SpriteFrameImage sPicTable_DeoxysA[] = {\n    overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 1),\n    overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 1),\n    overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysA, 4, 4, 1),\n};\n\nstatic const struct SpriteFrameImage sPicTable_DeoxysN[] = {\n    overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 1),\n    overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 1),\n    overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 0),\n    overworld_frame(gObjectEventPic_DeoxysN, 4, 4, 1),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Mewtwo[] = {\n    overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Mewtwo, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Mew[] = {\n    overworld_frame(gObjectEventPic_Mew, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Mew, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Mew, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Mew, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Mew, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Mew, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Mew, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Mew, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Mew, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Entei[] = {\n    overworld_frame(gObjectEventPic_Entei, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Entei, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Entei, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Entei, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Entei, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Entei, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Entei, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Entei, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Entei, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Raikou[] = {\n    overworld_frame(gObjectEventPic_Raikou, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Raikou, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Raikou, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Raikou, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Raikou, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Raikou, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Raikou, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Raikou, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Raikou, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Suicune[] = {\n    overworld_frame(gObjectEventPic_Suicune, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Suicune, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Suicune, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Suicune, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Suicune, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Suicune, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Suicune, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Suicune, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Suicune, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Bulbasaur[] = {\n    overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Bulbasaur, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Charmander[] = {\n    overworld_frame(gObjectEventPic_Charmander, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Charmander, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Charmander, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Charmander, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Charmander, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Charmander, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Charmander, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Charmander, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Charmander, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Squirtle[] = {\n    overworld_frame(gObjectEventPic_Squirtle, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Squirtle, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Squirtle, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Squirtle, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Squirtle, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Squirtle, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Squirtle, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Squirtle, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Squirtle, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Lugia[] = {\n    overworld_frame(gObjectEventPic_Lugia, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Lugia, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Lugia, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Lugia, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Lugia, 4, 4, 1),\n    overworld_frame(gObjectEventPic_Lugia, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Lugia, 4, 4, 1),\n    overworld_frame(gObjectEventPic_Lugia, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Lugia, 4, 4, 1),\n};\n\nstatic const struct SpriteFrameImage sPicTable_HoOh[] = {\n    overworld_frame(gObjectEventPic_HoOh, 4, 4, 0),\n    overworld_frame(gObjectEventPic_HoOh, 4, 4, 0),\n    overworld_frame(gObjectEventPic_HoOh, 4, 4, 0),\n    overworld_frame(gObjectEventPic_HoOh, 4, 4, 0),\n    overworld_frame(gObjectEventPic_HoOh, 4, 4, 1),\n    overworld_frame(gObjectEventPic_HoOh, 4, 4, 0),\n    overworld_frame(gObjectEventPic_HoOh, 4, 4, 1),\n    overworld_frame(gObjectEventPic_HoOh, 4, 4, 0),\n    overworld_frame(gObjectEventPic_HoOh, 4, 4, 1),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Celebi[] = {\n    overworld_frame(gObjectEventPic_Celebi, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Celebi, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Celebi, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Celebi, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Celebi, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Celebi, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Celebi, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Celebi, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Celebi, 2, 2, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Cubone[] = {\n    overworld_frame(gObjectEventPic_Cubone, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Cubone, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Cubone, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Cubone, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Cubone, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Cubone, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Cubone, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Cubone, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Cubone, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Poliwrath[] = {\n    overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Poliwrath, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Chansey[] = {\n    overworld_frame(gObjectEventPic_Chansey, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Chansey, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Chansey, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Chansey, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Chansey, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Chansey, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Chansey, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Chansey, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Chansey, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Pikachu[] = {\n    overworld_frame(gObjectEventPic_Pikachu, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Pikachu, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Pikachu, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Pikachu, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Pikachu, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Pikachu, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Pikachu, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Pikachu, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Pikachu, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Jigglypuff[] = {\n    overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Jigglypuff, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Pidgey[] = {\n    overworld_frame(gObjectEventPic_Pidgey, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Pidgey, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Pidgey, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Pidgey, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Pidgey, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Pidgey, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Pidgey, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Pidgey, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Pidgey, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Clefairy[] = {\n    overworld_frame(gObjectEventPic_Clefairy, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Clefairy, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Clefairy, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Clefairy, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Clefairy, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Clefairy, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Clefairy, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Clefairy, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Clefairy, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Machoke[] = {\n    overworld_frame(gObjectEventPic_Machoke, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Machoke, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Machoke, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Machoke, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Machoke, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Machoke, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Machoke, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Machoke, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Machoke, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Kabuto[] = {\n    overworld_frame(gObjectEventPic_Kabuto, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Kabuto, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Kabuto, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Kabuto, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Kabuto, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Kabuto, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Kabuto, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Kabuto, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Kabuto, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Mom[] = {\n    overworld_frame(gObjectEventPic_Mom, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Mom, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Mom, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Mom, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Mom, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Mom, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Mom, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Mom, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Mom, 2, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Latias[] = {\n    overworld_frame(gObjectEventPic_Latias, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Latias, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Latias, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Latias, 4, 4, 1),\n    overworld_frame(gObjectEventPic_Latias, 4, 4, 2),\n    overworld_frame(gObjectEventPic_Latias, 4, 4, 1),\n    overworld_frame(gObjectEventPic_Latias, 4, 4, 2),\n    overworld_frame(gObjectEventPic_Latias, 4, 4, 1),\n    overworld_frame(gObjectEventPic_Latias, 4, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Latios[] = {\n    overworld_frame(gObjectEventPic_Latios, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Latios, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Latios, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Latios, 4, 4, 1),\n    overworld_frame(gObjectEventPic_Latios, 4, 4, 2),\n    overworld_frame(gObjectEventPic_Latios, 4, 4, 1),\n    overworld_frame(gObjectEventPic_Latios, 4, 4, 2),\n    overworld_frame(gObjectEventPic_Latios, 4, 4, 1),\n    overworld_frame(gObjectEventPic_Latios, 4, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_EmBrendan[] = {\n    overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 0),\n    overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 1),\n    overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 2),\n    overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 3),\n    overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 4),\n    overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 5),\n    overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 6),\n    overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 7),\n    overworld_frame(gObjectEventPic_EmBrendan, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_EmMay[] = {\n    overworld_frame(gObjectEventPic_EmMay, 2, 4, 0),\n    overworld_frame(gObjectEventPic_EmMay, 2, 4, 1),\n    overworld_frame(gObjectEventPic_EmMay, 2, 4, 2),\n    overworld_frame(gObjectEventPic_EmMay, 2, 4, 3),\n    overworld_frame(gObjectEventPic_EmMay, 2, 4, 4),\n    overworld_frame(gObjectEventPic_EmMay, 2, 4, 5),\n    overworld_frame(gObjectEventPic_EmMay, 2, 4, 6),\n    overworld_frame(gObjectEventPic_EmMay, 2, 4, 7),\n    overworld_frame(gObjectEventPic_EmMay, 2, 4, 8),\n};\n\nstatic const struct SpriteFrameImage sPicTable_CableCar[] = {\n    overworld_frame(gObjectEventPic_CableCar, 4, 16, 0),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Sudowoodo[] = {\n    overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Abra[] = {\n    overworld_frame(gObjectEventPic_Abra, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Abra, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Abra, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Abra, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Abra, 2, 2, 0),\n    overworld_frame(gObjectEventPic_Abra, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Abra, 2, 2, 1),\n    overworld_frame(gObjectEventPic_Abra, 2, 2, 2),\n    overworld_frame(gObjectEventPic_Abra, 2, 2, 2),\n};\n\nstatic const struct SpriteFrameImage sPicTable_SwimmerFWater2[] = {\n    overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 0),\n    overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 1),\n    overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 2),\n    overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 3),\n    overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 4),\n    overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 5),\n    overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 6),\n    overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 7),\n    overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 8),\n    overworld_frame(gObjectEventPic_SwimmerFWater2, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_MasterBeauty[] = {\n    overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 3),\n    overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 4),\n    overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 5),\n    overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 6),\n    overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 7),\n    overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 8),\n    overworld_frame(gObjectEventPic_MasterBeauty, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_MasterBirdKeeper[] = {\n    overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 3),\n    overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 4),\n    overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 5),\n    overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 6),\n    overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 7),\n    overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 8),\n    overworld_frame(gObjectEventPic_MasterBirdKeeper, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_MasterBlackbelt[] = {\n    overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 3),\n    overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 4),\n    overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 5),\n    overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 6),\n    overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 7),\n    overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 8),\n    overworld_frame(gObjectEventPic_MasterBlackbelt, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_MasterBugCatcher[] = {\n    overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 3),\n    overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 4),\n    overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 5),\n    overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 6),\n    overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 7),\n    overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 8),\n    overworld_frame(gObjectEventPic_MasterBugCatcher, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_MasterCooltrainerM[] = {\n    overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 3),\n    overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 4),\n    overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 5),\n    overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 6),\n    overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 7),\n    overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 8),\n    overworld_frame(gObjectEventPic_MasterCooltrainerM, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_MasterHiker[] = {\n    overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 3),\n    overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 4),\n    overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 5),\n    overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 6),\n    overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 7),\n    overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 8),\n    overworld_frame(gObjectEventPic_MasterHiker, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_MasterLass[] = {\n    overworld_frame(gObjectEventPic_MasterLass, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MasterLass, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MasterLass, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MasterLass, 2, 4, 3),\n    overworld_frame(gObjectEventPic_MasterLass, 2, 4, 4),\n    overworld_frame(gObjectEventPic_MasterLass, 2, 4, 5),\n    overworld_frame(gObjectEventPic_MasterLass, 2, 4, 6),\n    overworld_frame(gObjectEventPic_MasterLass, 2, 4, 7),\n    overworld_frame(gObjectEventPic_MasterLass, 2, 4, 8),\n    overworld_frame(gObjectEventPic_MasterLass, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_MasterPsychicM[] = {\n    overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 3),\n    overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 4),\n    overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 5),\n    overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 6),\n    overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 7),\n    overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 8),\n    overworld_frame(gObjectEventPic_MasterPsychicM, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_MasterScientist[] = {\n    overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 3),\n    overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 4),\n    overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 5),\n    overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 6),\n    overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 7),\n    overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 8),\n    overworld_frame(gObjectEventPic_MasterScientist, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_MasterYoungster[] = {\n    overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 0),\n    overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 1),\n    overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 2),\n    overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 3),\n    overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 4),\n    overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 5),\n    overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 6),\n    overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 7),\n    overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 8),\n    overworld_frame(gObjectEventPic_MasterYoungster, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Lady[] = {\n    overworld_frame(gObjectEventPic_Lady, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Lady, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Lady, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Lady, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Lady, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Lady, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Lady, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Lady, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Lady, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Lady, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Rocker2[] = {\n    overworld_frame(gObjectEventPic_Rocker2, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Rocker2, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Rocker2, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Rocker2, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Rocker2, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Rocker2, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Rocker2, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Rocker2, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Rocker2, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Rocker2, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Anabel[] = {\n    overworld_frame(gObjectEventPic_Anabel, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Anabel, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Anabel, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Anabel, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Anabel, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Anabel, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Anabel, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Anabel, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Anabel, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Anabel, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Tucker[] = {\n    overworld_frame(gObjectEventPic_Tucker, 4, 4, 0),\n    overworld_frame(gObjectEventPic_Tucker, 4, 4, 1),\n    overworld_frame(gObjectEventPic_Tucker, 4, 4, 2),\n    overworld_frame(gObjectEventPic_Tucker, 4, 4, 3),\n    overworld_frame(gObjectEventPic_Tucker, 4, 4, 4),\n    overworld_frame(gObjectEventPic_Tucker, 4, 4, 5),\n    overworld_frame(gObjectEventPic_Tucker, 4, 4, 6),\n    overworld_frame(gObjectEventPic_Tucker, 4, 4, 7),\n    overworld_frame(gObjectEventPic_Tucker, 4, 4, 8),\n    overworld_frame(gObjectEventPic_Tucker, 4, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Greta[] = {\n    overworld_frame(gObjectEventPic_Greta, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Greta, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Greta, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Greta, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Greta, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Greta, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Greta, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Greta, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Greta, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Greta, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Spenser[] = {\n    overworld_frame(gObjectEventPic_Spenser, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Spenser, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Spenser, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Spenser, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Spenser, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Spenser, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Spenser, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Spenser, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Spenser, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Spenser, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Noland[] = {\n    overworld_frame(gObjectEventPic_Noland, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Noland, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Noland, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Noland, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Noland, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Noland, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Noland, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Noland, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Noland, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Noland, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Lucy[] = {\n    overworld_frame(gObjectEventPic_Lucy, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Lucy, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Lucy, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Lucy, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Lucy, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Lucy, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Lucy, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Lucy, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Lucy, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Lucy, 2, 4, 9),\n};\n\nstatic const struct SpriteFrameImage sPicTable_Brandon[] = {\n    overworld_frame(gObjectEventPic_Brandon, 2, 4, 0),\n    overworld_frame(gObjectEventPic_Brandon, 2, 4, 1),\n    overworld_frame(gObjectEventPic_Brandon, 2, 4, 2),\n    overworld_frame(gObjectEventPic_Brandon, 2, 4, 3),\n    overworld_frame(gObjectEventPic_Brandon, 2, 4, 4),\n    overworld_frame(gObjectEventPic_Brandon, 2, 4, 5),\n    overworld_frame(gObjectEventPic_Brandon, 2, 4, 6),\n    overworld_frame(gObjectEventPic_Brandon, 2, 4, 7),\n    overworld_frame(gObjectEventPic_Brandon, 2, 4, 8),\n    overworld_frame(gObjectEventPic_Brandon, 2, 4, 9),\n};"
  },
  {
    "path": "src/data/object_events/object_event_subsprites.h",
    "content": "const struct Subsprite gObjectEventSpriteOamTable_16x16_0[] = {\n    {\n        .x = -8,\n        .y = -8,\n        .shape = SPRITE_SHAPE(16x16),\n        .size = SPRITE_SIZE(16x16),\n        .tileOffset = 0,\n        .priority = 2\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_16x16_1[] = {\n    {\n        .x = -8,\n        .y = -8,\n        .shape = SPRITE_SHAPE(16x16),\n        .size = SPRITE_SIZE(16x16),\n        .tileOffset = 0,\n        .priority = 1\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_16x16_2[] = {\n    {\n        .x = -8,\n        .y = -8,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 0,\n        .priority = 2\n    },\n    {\n        .x = -8,\n        .y = 0,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 2,\n        .priority = 3\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_16x16_3[] = {\n    {\n        .x = -8,\n        .y = -8,\n        .shape = SPRITE_SHAPE(16x16),\n        .size = SPRITE_SIZE(16x16),\n        .tileOffset = 0,\n        .priority = 2\n    },\n    {\n        .x = -8,\n        .y = -8,\n        .shape = SPRITE_SHAPE(16x16),\n        .size = SPRITE_SIZE(16x16),\n        .tileOffset = 0,\n        .priority = 3\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_16x16_4[] = {\n    {\n        .x = -8,\n        .y = -8,\n        .shape = SPRITE_SHAPE(16x16),\n        .size = SPRITE_SIZE(16x16),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = -8,\n        .y = -8,\n        .shape = SPRITE_SHAPE(16x16),\n        .size = SPRITE_SIZE(16x16),\n        .tileOffset = 0,\n        .priority = 3\n    }\n};\n\nconst struct SubspriteTable gObjectEventSpriteOamTables_16x16[] = {\n    {0, NULL},\n    {1, gObjectEventSpriteOamTable_16x16_0},\n    {1, gObjectEventSpriteOamTable_16x16_1},\n    {2, gObjectEventSpriteOamTable_16x16_2},\n    {2, gObjectEventSpriteOamTable_16x16_3},\n    {2, gObjectEventSpriteOamTable_16x16_4},\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_16x32_0[] = {\n    {\n        .x = -8,\n        .y = -16,\n        .shape = SPRITE_SHAPE(16x32),\n        .size = SPRITE_SIZE(16x32),\n        .tileOffset = 0,\n        .priority = 2\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_16x32_1[] = {\n    {\n        .x = -8,\n        .y = -16,\n        .shape = SPRITE_SHAPE(16x32),\n        .size = SPRITE_SIZE(16x32),\n        .tileOffset = 0,\n        .priority = 1\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_16x32_2[] = {\n    {\n        .x = -8,\n        .y = -16,\n        .shape = SPRITE_SHAPE(16x16),\n        .size = SPRITE_SIZE(16x16),\n        .tileOffset = 0,\n        .priority = 2\n    },\n    {\n        .x = -8,\n        .y = 0,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 4,\n        .priority = 2\n    },\n    {\n        .x = -8,\n        .y = 8,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 6,\n        .priority = 3\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_16x32_3[] = {\n    {\n        .x = -8,\n        .y = -16,\n        .shape = SPRITE_SHAPE(16x16),\n        .size = SPRITE_SIZE(16x16),\n        .tileOffset = 0,\n        .priority = 2\n    },\n    {\n        .x = -8,\n        .y = 0,\n        .shape = SPRITE_SHAPE(16x16),\n        .size = SPRITE_SIZE(16x16),\n        .tileOffset = 4,\n        .priority = 3\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_16x32_4[] = {\n    {\n        .x = -8,\n        .y = -16,\n        .shape = SPRITE_SHAPE(16x16),\n        .size = SPRITE_SIZE(16x16),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = -8,\n        .y = 0,\n        .shape = SPRITE_SHAPE(16x16),\n        .size = SPRITE_SIZE(16x16),\n        .tileOffset = 4,\n        .priority = 3\n    }\n};\n\nconst struct SubspriteTable gObjectEventSpriteOamTables_16x32[] = {\n    {0, NULL},\n    {1, gObjectEventSpriteOamTable_16x32_0},\n    {1, gObjectEventSpriteOamTable_16x32_1},\n    {3, gObjectEventSpriteOamTable_16x32_2},\n    {2, gObjectEventSpriteOamTable_16x32_3},\n    {2, gObjectEventSpriteOamTable_16x32_4},\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_32x32_0[] = {\n    {\n        .x = -16,\n        .y = -16,\n        .shape = SPRITE_SHAPE(32x32),\n        .size = SPRITE_SIZE(32x32),\n        .tileOffset = 0,\n        .priority = 2\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_32x32_1[] = {\n    {\n        .x = -16,\n        .y = -16,\n        .shape = SPRITE_SHAPE(32x32),\n        .size = SPRITE_SIZE(32x32),\n        .tileOffset = 0,\n        .priority = 1\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_32x32_2[] = {\n    {\n        .x = -16,\n        .y = -16,\n        .shape = SPRITE_SHAPE(32x16),\n        .size = SPRITE_SIZE(32x16),\n        .tileOffset = 0,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 8,\n        .priority = 2\n    },\n    {\n        .x = -16, \n        .y = 8, \n        .shape = SPRITE_SHAPE(32x8), \n        .size = SPRITE_SIZE(32x8), \n        .tileOffset = 12, \n        .priority = 3\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_32x32_3[] = {\n    {\n        .x = -16,\n        .y = -16,\n        .shape = SPRITE_SHAPE(32x16),\n        .size = SPRITE_SIZE(32x16),\n        .tileOffset = 0,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x16),\n        .size = SPRITE_SIZE(32x16),\n        .tileOffset = 8,\n        .priority = 3\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_32x32_4[] = {\n    {\n        .x = -16,\n        .y = -16,\n        .shape = SPRITE_SHAPE(32x16),\n        .size = SPRITE_SIZE(32x16),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x16),\n        .size = SPRITE_SIZE(32x16),\n        .tileOffset = 8,\n        .priority = 3\n    }\n};\n\nconst struct SubspriteTable gObjectEventSpriteOamTables_32x32[] = {\n    {0, NULL},\n    {1, gObjectEventSpriteOamTable_32x32_0},\n    {1, gObjectEventSpriteOamTable_32x32_1},\n    {3, gObjectEventSpriteOamTable_32x32_2},\n    {2, gObjectEventSpriteOamTable_32x32_3},\n    {2, gObjectEventSpriteOamTable_32x32_4},\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_48x48[] = {\n    {\n        .x = -24,\n        .y = -24,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 2\n    },\n    {\n        .x = 8,\n        .y = -24,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 4,\n        .priority = 2\n    },\n    {\n        .x = -24,\n        .y = -16,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 6,\n        .priority = 2\n    },\n    {\n        .x = 8,\n        .y = -16,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 10,\n        .priority = 2\n    },\n    {\n        .x = -24,\n        .y = -8,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 12,\n        .priority = 2\n    },\n    {\n        .x = 8,\n        .y = -8,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 16,\n        .priority = 2\n    },\n    {\n        .x = -24,\n        .y = 0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 18,\n        .priority = 2\n    },\n    {\n        .x = 8,\n        .y = 0,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 22,\n        .priority = 2\n    },\n    {\n        .x = -24,\n        .y = 8,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 24,\n        .priority = 2\n    },\n    {\n        .x = 8,\n        .y = 8,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 28,\n        .priority = 2\n    },\n    {\n        .x = -24,\n        .y = 16,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 30,\n        .priority = 2\n    },\n    {\n        .x = 8,\n        .y = 16,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 34,\n        .priority = 2\n    }\n};\n\n// Unused. Used by the moving truck in RS\nconst struct SubspriteTable gObjectEventSpriteOamTables_48x48[] = {\n    {12, gObjectEventSpriteOamTable_48x48},\n    {12, gObjectEventSpriteOamTable_48x48},\n    {12, gObjectEventSpriteOamTable_48x48},\n    {12, gObjectEventSpriteOamTable_48x48},\n    {12, gObjectEventSpriteOamTable_48x48},\n    {12, gObjectEventSpriteOamTable_48x48},\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_64x32_0[] = {\n    {\n        .x = -32,\n        .y = -16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 0,\n        .priority = 2\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_64x32_1[] = {\n    {\n        .x = -32,\n        .y = -16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 0,\n        .priority = 1\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_64x32_2[] = {\n    {\n        .x = -32,\n        .y = -16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 0,\n        .priority = 2\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_64x32_3[] = {\n    {\n        .x = -32,\n        .y = -16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 0,\n        .priority = 2\n    }\n};\n\n// Unused\nconst struct SubspriteTable gObjectEventSpriteOamTables_64x32[] = {\n    {0, NULL},\n    {1, gObjectEventSpriteOamTable_64x32_0},\n    {1, gObjectEventSpriteOamTable_64x32_1},\n    {1, gObjectEventSpriteOamTable_64x32_2},\n    {1, gObjectEventSpriteOamTable_64x32_3},\n    {1, gObjectEventSpriteOamTable_64x32_3},\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_64x64_0[] = {\n    {\n        .x = -32,\n        .y = -32,\n        .shape = SPRITE_SHAPE(64x64),\n        .size = SPRITE_SIZE(64x64),\n        .tileOffset = 0,\n        .priority = 2\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_64x64_1[] = {\n    {\n        .x = -32,\n        .y = -32,\n        .shape = SPRITE_SHAPE(64x64),\n        .size = SPRITE_SIZE(64x64),\n        .tileOffset = 0,\n        .priority = 1\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_64x64_2[] = {\n    {\n        .x = -32,\n        .y = -32,\n        .shape = SPRITE_SHAPE(64x64),\n        .size = SPRITE_SIZE(64x64),\n        .tileOffset = 0,\n        .priority = 2\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_64x64_3[] = {\n    {\n        .x = -32,\n        .y = -32,\n        .shape = SPRITE_SHAPE(64x64),\n        .size = SPRITE_SIZE(64x64),\n        .tileOffset = 0,\n        .priority = 2\n    }\n};\n\nconst struct SubspriteTable gObjectEventSpriteOamTables_64x64[] = {\n    {0, NULL},\n    {1, gObjectEventSpriteOamTable_64x64_0},\n    {1, gObjectEventSpriteOamTable_64x64_1},\n    {1, gObjectEventSpriteOamTable_64x64_2},\n    {1, gObjectEventSpriteOamTable_64x64_3},\n    {1, gObjectEventSpriteOamTable_64x64_3},\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_96x40_0[] = {\n    {\n        .x = -48,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 8,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 12,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 16,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 20,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 24,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 28,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 32,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 36,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 40,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 44,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = 12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 48,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = 12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 52,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = 12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 56,\n        .priority = 2\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_96x40_1[] = {\n    {\n        .x = -48,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 8,\n        .priority = 1\n    },\n    {\n        .x = -48,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 12,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 16,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 20,\n        .priority = 1\n    },\n    {\n        .x = -48,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 24,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 28,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 32,\n        .priority = 1\n    },\n    {\n        .x = -48,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 36,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 40,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 44,\n        .priority = 1\n    },\n    {\n        .x = -48,\n        .y = 12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 48,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = 12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 52,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = 12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 56,\n        .priority = 1\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_96x40_2[] = {\n    {\n        .x = -48,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 8,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 12,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 16,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 20,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 24,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 28,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 32,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 36,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 40,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 44,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = 12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 48,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = 12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 52,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = 12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 56,\n        .priority = 2\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_96x40_3[] = {\n    {\n        .x = -48,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 8,\n        .priority = 1\n    },\n    {\n        .x = -48,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 12,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 16,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 20,\n        .priority = 1\n    },\n    {\n        .x = -48,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 24,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 28,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 32,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 36,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 40,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 44,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = 12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 48,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = 12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 52,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = 12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 56,\n        .priority = 2\n    }\n};\n\n// Unused. Used by the SS Tidal in RS\nconst struct SubspriteTable gObjectEventSpriteOamTables_96x40[] = {\n    {15, gObjectEventSpriteOamTable_96x40_0},\n    {15, gObjectEventSpriteOamTable_96x40_0},\n    {15, gObjectEventSpriteOamTable_96x40_1},\n    {15, gObjectEventSpriteOamTable_96x40_2},\n    {15, gObjectEventSpriteOamTable_96x40_3},\n    {15, gObjectEventSpriteOamTable_96x40_3},\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_128x64_0[] = {\n    {\n        .x = -32,\n        .y = -16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 0,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = -16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 32,\n        .priority = 2\n    },\n    {\n        .x = -32,\n        .y = 16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 64,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = 16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 96,\n        .priority = 2\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_128x64_1[] = {\n    {\n        .x = -32,\n        .y = -16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = 32,\n        .y = -16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 32,\n        .priority = 1\n    },\n    {\n        .x = -32,\n        .y = 16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 64,\n        .priority = 1\n    },\n    {\n        .x = 32,\n        .y = 16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 96,\n        .priority = 1\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_128x64_2[] = {\n    {\n        .x = -32,\n        .y = -16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = 32,\n        .y = -16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 32,\n        .priority = 1\n    },\n    {\n        .x = -32,\n        .y = 16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 64,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = 16,\n        .shape = SPRITE_SHAPE(64x32),\n        .size = SPRITE_SIZE(64x32),\n        .tileOffset = 96,\n        .priority = 2\n    }\n};\n\nconst struct SubspriteTable gObjectEventSpriteOamTables_128x64[] = {\n    {4, gObjectEventSpriteOamTable_128x64_0},\n    {4, gObjectEventSpriteOamTable_128x64_0},\n    {4, gObjectEventSpriteOamTable_128x64_1},\n    {4, gObjectEventSpriteOamTable_128x64_2},\n    {4, gObjectEventSpriteOamTable_128x64_2},\n    {4, gObjectEventSpriteOamTable_128x64_2},\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_88x32_0[] = {\n    {\n        .x = -48,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 8,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = -20,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 10,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 11,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 15,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 19,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = -12,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 21,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 22,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 26,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 30,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = -4,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 32,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 33,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 37,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 41,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = 4,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 43,\n        .priority = 2\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_88x32_1[] = {\n    {\n        .x = -48,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 8,\n        .priority = 1\n    },\n    {\n        .x = 32,\n        .y = -20,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 10,\n        .priority = 1\n    },\n    {\n        .x = -48,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 11,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 15,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 19,\n        .priority = 1\n    },\n    {\n        .x = 32,\n        .y = -12,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 21,\n        .priority = 1\n    },\n    {\n        .x = -48,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 22,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 26,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 30,\n        .priority = 1\n    },\n    {\n        .x = 32,\n        .y = -4,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 32,\n        .priority = 1\n    },\n    {\n        .x = -48,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 33,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 37,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 41,\n        .priority = 1\n    },\n    {\n        .x = 32,\n        .y = 4,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 43,\n        .priority = 1\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_88x32_2[] = {\n    {\n        .x = -48,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 8,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = -20,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 10,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 11,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 15,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 19,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = -12,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 21,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 22,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 26,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 30,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = -4,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 32,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 33,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 37,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 41,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = 4,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 43,\n        .priority = 2\n    }\n};\n\nconst struct Subsprite gObjectEventSpriteOamTable_88x32_3[] = {\n    {\n        .x = -48,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = -20,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 8,\n        .priority = 1\n    },\n    {\n        .x = 32,\n        .y = -20,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 10,\n        .priority = 1\n    },\n    {\n        .x = -48,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 11,\n        .priority = 1\n    },\n    {\n        .x = -16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 15,\n        .priority = 1\n    },\n    {\n        .x = 16,\n        .y = -12,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 19,\n        .priority = 1\n    },\n    {\n        .x = 32,\n        .y = -12,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 21,\n        .priority = 1\n    },\n    {\n        .x = -48,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 22,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 26,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = -4,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 30,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = -4,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 32,\n        .priority = 2\n    },\n    {\n        .x = -48,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 33,\n        .priority = 2\n    },\n    {\n        .x = -16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 37,\n        .priority = 2\n    },\n    {\n        .x = 16,\n        .y = 4,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 41,\n        .priority = 2\n    },\n    {\n        .x = 32,\n        .y = 4,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 43,\n        .priority = 2\n    }\n};\n\n// Unused. Used by the submarine shadow in RS\nconst struct SubspriteTable gObjectEventSpriteOamTables_88x32[] = {\n    {16, gObjectEventSpriteOamTable_88x32_0},\n    {16, gObjectEventSpriteOamTable_88x32_0},\n    {16, gObjectEventSpriteOamTable_88x32_1},\n    {16, gObjectEventSpriteOamTable_88x32_2},\n    {16, gObjectEventSpriteOamTable_88x32_3},\n    {16, gObjectEventSpriteOamTable_88x32_3},\n};\n"
  },
  {
    "path": "src/data/party_menu.h",
    "content": "static const struct BgTemplate sPartyMenuBgTemplates[] =\n{\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0\n    },\n    {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0\n    },\n    {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 28,\n        .screenSize = 1,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0\n    },\n};\n\nenum\n{\n    PARTY_BOX_LEFT_COLUMN,\n    PARTY_BOX_RIGHT_COLUMN,\n};\n\nstatic const struct PartyMenuBoxInfoRects sPartyBoxInfoRects[] =\n{\n    [PARTY_BOX_LEFT_COLUMN] = \n    {\n        BlitBitmapToPartyWindow_LeftColumn, \n        {\n            // The below are the x, y, width, and height for each of the following info\n            24, 11, 40, 13, // Nickname\n            32, 20, 32,  8, // Level\n            64, 20,  8,  8, // Gender\n            38, 36, 24,  8, // HP\n            53, 36, 24,  8, // Max HP\n            24, 35, 48,  3  // HP bar\n        },\n        12, 34, 64, 16      // Description text (e.g. NO USE)\n    },\n    [PARTY_BOX_RIGHT_COLUMN] = \n    {\n        BlitBitmapToPartyWindow_RightColumn, \n        {\n             // The below are the x, y, width, and height for each of the following info\n             22,  3, 40, 13, // Nickname\n             32, 12, 32,  8, // Level\n             64, 12,  8,  8, // Gender\n            102, 12, 24,  8, // HP\n            117, 12, 24,  8, // Max HP\n             88, 10, 48,  3  // HP bar\n        }, \n        77, 4, 64, 16        // Description text\n    },\n};\n\nstatic const u8 sPartyMenuSpriteCoords[PARTY_LAYOUT_COUNT][PARTY_SIZE][4 * 2] =\n{\n    [PARTY_LAYOUT_SINGLE] = \n    {\n        // pokemon coords, held item coords, status coords, pokeball coords\n        { 16,  40,  20,  50,  56,  52,  16,  34},\n        {104,  18, 108,  28, 144,  27, 102,  25},\n        {104,  42, 108,  52, 144,  51, 102,  49},\n        {104,  66, 108,  76, 144,  75, 102,  73},\n        {104,  90, 108, 100, 144,  99, 102,  97},\n        {104, 114, 108, 124, 144, 123, 102, 121},\n    },\n    [PARTY_LAYOUT_DOUBLE] = \n    {\n        { 16,  24,  20,  34,  56,  36,  16,  18},\n        { 16,  80,  20,  90,  56,  92,  16,  74},\n        {104,  18, 108,  28, 144,  27, 102,  25},\n        {104,  50, 108,  60, 144,  59, 102,  57},\n        {104,  82, 108,  92, 144,  91, 102,  89},\n        {104, 114, 108, 124, 144, 123, 102, 121},\n    },\n    [PARTY_LAYOUT_MULTI] = \n    {\n        { 16,  24,  20,  34,  56,  36,  16,  18},\n        { 16,  80,  20,  90,  56,  92,  16,  74},\n        {104,  26, 106,  36, 144,  35, 102,  33},\n        {104,  50, 106,  60, 144,  59, 102,  57},\n        {104,  82, 106,  92, 144,  91, 102,  89},\n        {104, 106, 106, 116, 144, 115, 102, 113},\n    },\n    [PARTY_LAYOUT_MULTI_SHOWCASE] = \n    {\n        { 16,  32,  20,  42,  56,  44,  16,  26},\n        {104,  34, 106,  44, 144,  43, 102,  41},\n        {104,  58, 106,  68, 144,  67, 102,  65},\n        { 16, 104,  20, 114,  56, 116,  16,  98},\n        {104, 106, 106, 116, 144, 115, 102, 113},\n        {104, 130, 106, 140, 144, 139, 102, 137},\n    },\n};\n\nstatic const u32 sConfirmButton_Tilemap[] = INCBIN_U32(\"graphics/party_menu/confirm_button.bin\");\nstatic const u32 sCancelButton_Tilemap[] = INCBIN_U32(\"graphics/party_menu/cancel_button.bin\");\n\nstatic const u8 sFontColorTable[][3] =\n{\n    {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_DARK_GRAY},  // Default\n    {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE,      TEXT_COLOR_GREEN},      // Unused\n    {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_2,  TEXT_DYNAMIC_COLOR_3},  // Gender symbol\n    {TEXT_COLOR_WHITE,       TEXT_COLOR_DARK_GRAY,  TEXT_COLOR_LIGHT_GRAY}, // Selection actions\n    {TEXT_COLOR_WHITE,       TEXT_COLOR_BLUE,       TEXT_COLOR_LIGHT_BLUE}, // Field moves\n    {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE,      TEXT_COLOR_DARK_GRAY},  // Unused\n};\n\nstatic const struct WindowTemplate sSinglePartyMenuWindowTemplate[] =\n{\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 3,\n        .width = 10,\n        .height = 7,\n        .paletteNum = 3,\n        .baseBlock = 0x63,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 1,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 4,\n        .baseBlock = 0xA9,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 4,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 5,\n        .baseBlock = 0xDF,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 7,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 6,\n        .baseBlock = 0x115,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 10,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 7,\n        .baseBlock = 0x14B,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 13,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 8,\n        .baseBlock = 0x181,\n    },\n    {\n        .bg = 2,\n        .tilemapLeft = 1,\n        .tilemapTop = 15,\n        .width = 28,\n        .height = 4,\n        .paletteNum = 14,\n        .baseBlock = 0x1DF,\n    },\n    DUMMY_WIN_TEMPLATE,\n};\n\nstatic const struct WindowTemplate sDoublePartyMenuWindowTemplate[] =\n{\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 10,\n        .height = 7,\n        .paletteNum = 3,\n        .baseBlock = 0x63,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 8,\n        .width = 10,\n        .height = 7,\n        .paletteNum = 4,\n        .baseBlock = 0xA9,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 1,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 5,\n        .baseBlock = 0xEF,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 5,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 6,\n        .baseBlock = 0x125,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 9,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 7,\n        .baseBlock = 0x15B,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 13,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 8,\n        .baseBlock = 0x191,\n    },\n    {\n        .bg = 2,\n        .tilemapLeft = 1,\n        .tilemapTop = 15,\n        .width = 28,\n        .height = 4,\n        .paletteNum = 14,\n        .baseBlock = 0x1DF,\n    },\n    DUMMY_WIN_TEMPLATE,\n};\n\nstatic const struct WindowTemplate sMultiPartyMenuWindowTemplate[] =\n{\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 10,\n        .height = 7,\n        .paletteNum = 3,\n        .baseBlock = 0x63,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 8,\n        .width = 10,\n        .height = 7,\n        .paletteNum = 4,\n        .baseBlock = 0xA9,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 2,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 5,\n        .baseBlock = 0xEF,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 5,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 6,\n        .baseBlock = 0x125,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 9,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 7,\n        .baseBlock = 0x15B,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 12,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 8,\n        .baseBlock = 0x191,\n    },\n    {\n        .bg = 2,\n        .tilemapLeft = 1,\n        .tilemapTop = 15,\n        .width = 28,\n        .height = 4,\n        .paletteNum = 14,\n        .baseBlock = 0x1DF,\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sShowcaseMultiPartyMenuWindowTemplate[] =\n{\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 2,\n        .width = 10,\n        .height = 7,\n        .paletteNum = 3,\n        .baseBlock = 0x63,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 3,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 5,\n        .baseBlock = 0xA9,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 6,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 6,\n        .baseBlock = 0xDF,\n    },\n    {\n        .bg = 2,\n        .tilemapLeft = 1,\n        .tilemapTop = 11,\n        .width = 10,\n        .height = 7,\n        .paletteNum = 4,\n        .baseBlock = 0x115,\n    },\n    {\n        .bg = 2,\n        .tilemapLeft = 12,\n        .tilemapTop = 12,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 7,\n        .baseBlock = 0x16B,\n    },\n    {\n        .bg = 2,\n        .tilemapLeft = 12,\n        .tilemapTop = 15,\n        .width = 18,\n        .height = 3,\n        .paletteNum = 8,\n        .baseBlock = 0x1A1,\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sCancelButtonWindowTemplate =\n{\n    .bg = 0,\n    .tilemapLeft = 24,\n    .tilemapTop = 17,\n    .width = 6,\n    .height = 2,\n    .paletteNum = 3,\n    .baseBlock = 0x1C7,\n};\n\nstatic const struct WindowTemplate sMultiCancelButtonWindowTemplate =\n{\n    .bg = 0,\n    .tilemapLeft = 24,\n    .tilemapTop = 18,\n    .width = 6,\n    .height = 2,\n    .paletteNum = 3,\n    .baseBlock = 0x1C7,\n};\n\nstatic const struct WindowTemplate sConfirmButtonWindowTemplate =\n{\n    .bg = 0,\n    .tilemapLeft = 24,\n    .tilemapTop = 16,\n    .width = 6,\n    .height = 2,\n    .paletteNum = 3,\n    .baseBlock = 0x1D3,\n};\n\nstatic const struct WindowTemplate sDefaultPartyMsgWindowTemplate =\n{\n    .bg = 2,\n    .tilemapLeft = 1,\n    .tilemapTop = 17,\n    .width = 21,\n    .height = 2,\n    .paletteNum = 15,\n    .baseBlock = 0x24F,\n};\n\nstatic const struct WindowTemplate sDoWhatWithMonMsgWindowTemplate =\n{\n    .bg = 2,\n    .tilemapLeft = 1,\n    .tilemapTop = 17,\n    .width = 16,\n    .height = 2,\n    .paletteNum = 15,\n    .baseBlock = 0x279,\n};\n\nstatic const struct WindowTemplate sDoWhatWithItemMsgWindowTemplate =\n{\n    .bg = 2,\n    .tilemapLeft = 1,\n    .tilemapTop = 17,\n    .width = 19,\n    .height = 2,\n    .paletteNum = 15,\n    .baseBlock = 0x299,\n};\n\nstatic const struct WindowTemplate sDoWhatWithMailMsgWindowTemplate =\n{\n    .bg = 2,\n    .tilemapLeft = 1,\n    .tilemapTop = 17,\n    .width = 16,\n    .height = 2,\n    .paletteNum = 15,\n    .baseBlock = 0x299,\n};\n\nstatic const struct WindowTemplate sWhichMoveMsgWindowTemplate =\n{\n    .bg = 2,\n    .tilemapLeft = 1,\n    .tilemapTop = 17,\n    .width = 15,\n    .height = 2,\n    .paletteNum = 15,\n    .baseBlock = 0x299,\n};\n\nstatic const struct WindowTemplate sItemGiveTakeWindowTemplate =\n{\n    .bg = 2,\n    .tilemapLeft = 22,\n    .tilemapTop = 13,\n    .width = 7,\n    .height = 6,\n    .paletteNum = 14,\n    .baseBlock = 0x373,\n};\n\nstatic const struct WindowTemplate sMailReadTakeWindowTemplate =\n{\n    .bg = 2,\n    .tilemapLeft = 19,\n    .tilemapTop = 13,\n    .width = 10,\n    .height = 6,\n    .paletteNum = 14,\n    .baseBlock = 0x373,\n};\n\nstatic const struct WindowTemplate sMoveSelectWindowTemplate =\n{\n    .bg = 2,\n    .tilemapLeft = 18,\n    .tilemapTop = 11,\n    .width = 11,\n    .height = 8,\n    .paletteNum = 14,\n    .baseBlock = 0x2BF,\n};\n\nstatic const struct WindowTemplate sPartyMenuYesNoWindowTemplate =\n{\n    .bg = 2,\n    .tilemapLeft = 21,\n    .tilemapTop = 9,\n    .width = 6,\n    .height = 4,\n    .paletteNum = 14,\n    .baseBlock = 0x2BF,\n};\n\nstatic const struct WindowTemplate sLevelUpStatsWindowTemplate =\n{\n    .bg = 2,\n    .tilemapLeft = 19,\n    .tilemapTop = 1,\n    .width = 10,\n    .height = 11,\n    .paletteNum = 14,\n    .baseBlock = 0x2BF,\n};\n\nstatic const struct WindowTemplate sWindowTemplate_FirstBattleOakVoiceover =\n{\n    .bg = 2,\n    .tilemapLeft = 2,\n    .tilemapTop = 15,\n    .width = 26,\n    .height = 4,\n    .paletteNum = 14,\n    .baseBlock = 0x1DF,\n};\n\nstatic const struct WindowTemplate sFieldMoveDescriptionWindowTemplate =\n{\n    .bg = 2,\n    .tilemapLeft = 0,\n    .tilemapTop = 13,\n    .width = 18,\n    .height = 3,\n    .paletteNum = 12,\n    .baseBlock = 0x373,\n};\n\n// Plain tilemaps for party menu slots.\n// The versions with no HP bar are used by eggs, and in certain displays like registering at a battle facility.\n// There is no empty version of the main slot because it shouldn't ever be empty.\nstatic const u8 sSlotTilemap_Main[]      = INCBIN_U8(\"graphics/party_menu/slot_main.bin\");\nstatic const u8 sSlotTilemap_MainNoHP[]  = INCBIN_U8(\"graphics/party_menu/slot_main_no_hp.bin\");\nstatic const u8 sSlotTilemap_Wide[]      = INCBIN_U8(\"graphics/party_menu/slot_wide.bin\");\nstatic const u8 sSlotTilemap_WideNoHP[]  = INCBIN_U8(\"graphics/party_menu/slot_wide_no_hp.bin\");\nstatic const u8 sSlotTilemap_WideEmpty[] = INCBIN_U8(\"graphics/party_menu/slot_wide_empty.bin\");\n\nstatic const u8 sGenderPalOffsets[] = {11, 12};\n\nstatic const u8 sHPBarPalOffsets[] = {9, 10};\n\nstatic const u8 sPartyBoxPalOffsets1[] = {4, 5, 6};\n\nstatic const u8 sPartyBoxPalOffsets2[] = {1, 7, 8};\n\nstatic const u8 sGenderMalePalIds[] = {59, 60};\n\nstatic const u8 sGenderFemalePalIds[] = {75, 76};\n\nstatic const u8 sHPBarGreenPalIds[] = {57, 58};\n\nstatic const u8 sHPBarYellowPalIds[] = {73, 74};\n\nstatic const u8 sHPBarRedPalIds[] = {89, 90};\n\nstatic const u8 sPartyBoxEmptySlotPalIds1[] = {52, 53, 54};\n\nstatic const u8 sPartyBoxMultiPalIds1[] = {68, 69, 70};\n\nstatic const u8 sPartyBoxFaintedPalIds1[] = {84, 85, 86};\n\nstatic const u8 sPartyBoxCurrSelectionPalIds1[] = {116, 117, 118};\n\nstatic const u8 sPartyBoxCurrSelectionMultiPalIds[] = {132, 133, 134};\n\nstatic const u8 sPartyBoxCurrSelectionFaintedPalIds[] = {148, 149, 150};\n\nstatic const u8 sPartyBoxSelectedForActionPalIds1[] = {100, 101, 102};\n\nstatic const u8 sPartyBoxEmptySlotPalIds2[] = {49, 55, 56};\n\nstatic const u8 sPartyBoxMultiPalIds2[] = {65, 71, 72};\n\nstatic const u8 sPartyBoxFaintedPalIds2[] = {81, 87, 88};\n\nstatic const u8 sPartyBoxCurrSelectionPalIds2[] = {97, 103, 104};\n\nstatic const u8 sPartyBoxSelectedForActionPalIds2[] = {161, 167, 168};\n\nstatic const u8 *const sActionStringTable[] =\n{\n    [PARTY_MSG_CHOOSE_MON]             = gText_ChoosePokemon,\n    [PARTY_MSG_CHOOSE_MON_OR_CANCEL]   = gText_ChoosePokemonCancel,\n    [PARTY_MSG_CHOOSE_MON_AND_CONFIRM] = gText_ChoosePokemonConfirm,\n    [PARTY_MSG_MOVE_TO_WHERE]          = gText_MoveToWhere,\n    [PARTY_MSG_TEACH_WHICH_MON]        = gText_TeachWhichPokemon,\n    [PARTY_MSG_USE_ON_WHICH_MON]       = gText_UseOnWhichPokemon,\n    [PARTY_MSG_GIVE_TO_WHICH_MON]      = gText_GiveToWhichPokemon,\n    [PARTY_MSG_NOTHING_TO_CUT]         = gText_NothingToCut,\n    [PARTY_MSG_CANT_SURF_HERE]         = gText_CantSurfHere,\n    [PARTY_MSG_ALREADY_SURFING]        = gText_AlreadySurfing,\n    [PARTY_MSG_CURRENT_TOO_FAST]       = gText_CurrentIsTooFast,\n    [PARTY_MSG_ENJOY_CYCLING]          = gText_EnjoyCycling,\n    [PARTY_MSG_ALREADY_IN_USE]         = gText_InUseAlready_PM,\n    [PARTY_MSG_CANT_USE_HERE]          = gText_CantUseHere,\n    [PARTY_MSG_NO_MON_FOR_BATTLE]      = gText_NoPokemonForBattle,\n    [PARTY_MSG_CHOOSE_MON_2]           = gText_ChoosePokemon2,\n    [PARTY_MSG_NOT_ENOUGH_HP]          = gText_NotEnoughHp,\n    [PARTY_MSG_THREE_MONS_ARE_NEEDED]  = gText_ThreePkmnAreNeeded,\n    [PARTY_MSG_TWO_MONS_ARE_NEEDED]    = gText_TwoPokemonAreNeeded,\n    [PARTY_MSG_MONS_CANT_BE_SAME]      = gText_PokemonCantBeSame,\n    [PARTY_MSG_NO_SAME_HOLD_ITEMS]     = gText_NoIdenticalHoldItems,\n    [PARTY_MSG_UNUSED]                 = gString_Dummy,\n    [PARTY_MSG_DO_WHAT_WITH_MON]       = gText_DoWhatWithPokemon,\n    [PARTY_MSG_RESTORE_WHICH_MOVE]     = gText_RestoreWhichMove,\n    [PARTY_MSG_BOOST_PP_WHICH_MOVE]    = gText_BoostPp,\n    [PARTY_MSG_DO_WHAT_WITH_ITEM]      = gText_DoWhatWithItem,\n    [PARTY_MSG_DO_WHAT_WITH_MAIL]      = gText_DoWhatWithMail,\n};\n\nstatic const u8 *const sDescriptionStringTable[] =\n{\n    [PARTYBOX_DESC_NO_USE]     = gText_NoUse,\n    [PARTYBOX_DESC_ABLE_3]     = gText_Able,\n    [PARTYBOX_DESC_FIRST]      = gText_First_PM,\n    [PARTYBOX_DESC_SECOND]     = gText_Second_PM,\n    [PARTYBOX_DESC_THIRD]      = gText_Third_PM,\n    [PARTYBOX_DESC_ABLE]       = gText_Able2,\n    [PARTYBOX_DESC_NOT_ABLE]   = gText_NotAble,\n    [PARTYBOX_DESC_ABLE_2]     = gText_Able3,\n    [PARTYBOX_DESC_NOT_ABLE_2] = gText_NotAble2,\n    [PARTYBOX_DESC_LEARNED]    = gText_Learned,\n};\n\nstatic const u8 *const sFieldMoveDescriptionTable[] =\n{\n    [FIELD_MOVE_FLASH]       = gText_LightUpDarkness,\n    [FIELD_MOVE_CUT]         = gText_CutATreeOrGrass,\n    [FIELD_MOVE_FLY]         = gText_FlyToAKnownTown,\n    [FIELD_MOVE_STRENGTH]    = gText_MoveHeavyBoulders,\n    [FIELD_MOVE_SURF]        = gText_TravelOnWater,\n    [FIELD_MOVE_ROCK_SMASH]  = gText_ShatterACrackedRock,\n    [FIELD_MOVE_WATERFALL]   = gText_ClimbAWaterfall,\n    [FIELD_MOVE_TELEPORT]    = gText_ReturnToAHealingSpot,\n    [FIELD_MOVE_DIG]         = gText_EscapeFromHere,\n    [FIELD_MOVE_MILK_DRINK]  = gText_ShareHp,\n    [FIELD_MOVE_SOFT_BOILED] = gText_ShareHp,\n    [FIELD_MOVE_SWEET_SCENT] = gText_LureWildPokemon,\n    [FIELD_MOVE_DIVE]        = gText_DiveUnderwater,\n};\n\nstatic const u32 sHeldItemGfx[] = INCBIN_U32(\"graphics/party_menu/hold_icons.4bpp\");\nstatic const u16 sHeldItemPalette[] = INCBIN_U16(\"graphics/party_menu/hold_icons.gbapal\");\n\nstatic const struct OamData sOamData_HeldItem =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = 0,\n    .mosaic = FALSE,\n    .bpp = 0,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sSpriteAnim_HeldItem[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_HeldMail[] =\n{\n    ANIMCMD_FRAME(1, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_HeldItem[] =\n{\n    sSpriteAnim_HeldItem,\n    sSpriteAnim_HeldMail,\n};\n\nstatic const struct SpriteSheet sSpriteSheet_HeldItem =\n{\n    sHeldItemGfx, sizeof(sHeldItemGfx), 0xD750\n};\n\nstatic const struct SpritePalette sSpritePalette_HeldItem =\n{\n    sHeldItemPalette, 0xD750\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_HeldItem =\n{\n    0xD750,\n    0xD750,\n    &sOamData_HeldItem,\n    sSpriteAnimTable_HeldItem,\n    NULL,\n    gDummySpriteAffineAnimTable,\n    SpriteCallbackDummy,\n};\n\nstatic const struct OamData sOamData_MenuPokeball =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = 0,\n    .mosaic = FALSE,\n    .bpp = 0,\n    .shape = SPRITE_SHAPE(32x32),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sPokeballAnim_Closed[] =\n{\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sPokeballAnim_Open[] =\n{\n    ANIMCMD_FRAME(16, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_MenuPokeball[] =\n{\n    sPokeballAnim_Closed,\n    sPokeballAnim_Open,\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_MenuPokeball =\n{\n    gPartyMenuPokeball_Gfx, 0x400, 0x04b0\n};\n\nstatic const struct CompressedSpritePalette sSpritePalette_MenuPokeball =\n{\n    gPartyMenuPokeball_Pal, 0x04b0\n};\n\n// Used for the pokeball sprite on each party slot / Cancel button\nstatic const struct SpriteTemplate sSpriteTemplate_MenuPokeball =\n{\n    .tileTag = 0x04b0,\n    .paletteTag = 0x04b0,\n    .oam = &sOamData_MenuPokeball,\n    .anims = sSpriteAnimTable_MenuPokeball,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const struct OamData sOamData_MenuPokeballSmall =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = 0,\n    .mosaic = FALSE,\n    .bpp = 0,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sSmallPokeballAnim_Closed[] =\n{\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSmallPokeballAnim_Open[] =\n{\n    ANIMCMD_FRAME(4, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSmallPokeballAnim_Blank1[] =\n{\n    ANIMCMD_FRAME(8, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSmallPokeballAnim_Blank2[] =\n{\n    ANIMCMD_FRAME(12, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSmallPokeballAnim_Blank3[] =\n{\n    ANIMCMD_FRAME(16, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSmallPokeballAnim_Blank4[] =\n{\n    ANIMCMD_FRAME(20, 0),\n    ANIMCMD_END\n};\n\n// The blanks below are never used. See SpriteCB_BounceConfirmCancelButton, where they were intended to be used\nstatic const union AnimCmd *const sSpriteAnimTable_MenuPokeballSmall[] =\n{\n    sSmallPokeballAnim_Closed,\n    sSmallPokeballAnim_Open,\n    sSmallPokeballAnim_Blank1,\n    sSmallPokeballAnim_Blank2,\n    sSmallPokeballAnim_Blank3,\n    sSmallPokeballAnim_Blank4,\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_MenuPokeballSmall =\n{\n    gPartyMenuPokeballSmall_Gfx, 0x0300, 0x04b1\n};\n\n// Used for the pokeball sprite next to Cancel and Confirm when both are present, otherwise sSpriteTemplate_MenuPokeball is used\nstatic const struct SpriteTemplate sSpriteTemplate_MenuPokeballSmall =\n{\n    .tileTag = 1201,\n    .paletteTag = 1200,\n    .oam = &sOamData_MenuPokeballSmall,\n    .anims = sSpriteAnimTable_MenuPokeballSmall,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const struct OamData sOamData_StatusCondition =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = 0,\n    .mosaic = FALSE,\n    .bpp = 0,\n    .shape = SPRITE_SHAPE(32x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x8),\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sSpriteAnim_StatusPoison[] =\n{\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_StatusParalyzed[] =\n{\n    ANIMCMD_FRAME(4, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_StatusSleep[] =\n{\n    ANIMCMD_FRAME(8, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_StatusFrozen[] =\n{\n    ANIMCMD_FRAME(12, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_StatusBurn[] =\n{\n    ANIMCMD_FRAME(16, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_StatusPokerus[] =\n{\n    ANIMCMD_FRAME(20, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_StatusFaint[] =\n{\n    ANIMCMD_FRAME(24, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_Blank[] =\n{\n    ANIMCMD_FRAME(28, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteTemplate_StatusCondition[] =\n{\n    sSpriteAnim_StatusPoison,\n    sSpriteAnim_StatusParalyzed,\n    sSpriteAnim_StatusSleep,\n    sSpriteAnim_StatusFrozen,\n    sSpriteAnim_StatusBurn,\n    sSpriteAnim_StatusPokerus,\n    sSpriteAnim_StatusFaint,\n    sSpriteAnim_Blank,\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_StatusIcons =\n{\n    gStatusGfx_Icons, 0x400, 1202\n};\n\nstatic const struct CompressedSpritePalette sSpritePalette_StatusIcons =\n{\n    gStatusPal_Icons, 1202\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_StatusIcons =\n{\n    .tileTag = 1202,\n    .paletteTag = 1202,\n    .oam = &sOamData_StatusCondition,\n    .anims = sSpriteTemplate_StatusCondition,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const bool8 sMultiBattlePartnersPartyMask[PARTY_SIZE + 2] = \n{\n    FALSE, \n    TRUE, \n    FALSE, \n    FALSE, \n    TRUE, \n    TRUE, \n    FALSE,\n};\n\nenum\n{\n    CURSOR_OPTION_SUMMARY,\n    CURSOR_OPTION_SWITCH,\n    CURSOR_OPTION_CANCEL1,\n    CURSOR_OPTION_ITEM,\n    CURSOR_OPTION_GIVE,\n    CURSOR_OPTION_TAKE_ITEM,\n    CURSOR_OPTION_MAIL,\n    CURSOR_OPTION_TAKE_MAIL,\n    CURSOR_OPTION_READ,\n    CURSOR_OPTION_CANCEL2,\n    CURSOR_OPTION_SHIFT,\n    CURSOR_OPTION_SEND_OUT,\n    CURSOR_OPTION_ENTER,\n    CURSOR_OPTION_NO_ENTRY,\n    CURSOR_OPTION_STORE,\n    CURSOR_OPTION_REGISTER,\n    CURSOR_OPTION_TRADE1,\n    CURSOR_OPTION_TRADE2,\n    CURSOR_OPTION_FIELD_MOVES,\n};\n\nstatic struct\n{\n    const u8 *text;\n    TaskFunc func;\n} const sCursorOptions[] =\n{\n    [CURSOR_OPTION_SUMMARY]                              = {gText_Summary5,               CursorCB_Summary  },\n    [CURSOR_OPTION_SWITCH]                               = {gText_Switch2,                CursorCB_Switch   },\n    [CURSOR_OPTION_CANCEL1]                              = {gFameCheckerText_Cancel,      CursorCB_Cancel1  },\n    [CURSOR_OPTION_ITEM]                                 = {gText_Item,                   CursorCB_Item     },\n    [CURSOR_OPTION_GIVE]                                 = {gOtherText_Give,              CursorCB_Give     },\n    [CURSOR_OPTION_TAKE_ITEM]                            = {gText_Take,                   CursorCB_TakeItem },\n    [CURSOR_OPTION_MAIL]                                 = {gText_Mail,                   CursorCB_Mail     },\n    [CURSOR_OPTION_TAKE_MAIL]                            = {gText_Take2,                  CursorCB_TakeMail },\n    [CURSOR_OPTION_READ]                                 = {gText_Read2,                  CursorCB_Read     },\n    [CURSOR_OPTION_CANCEL2]                              = {gFameCheckerText_Cancel,      CursorCB_Cancel2  },\n    [CURSOR_OPTION_SHIFT]                                = {gText_Shift,                  CursorCB_SendMon  },\n    [CURSOR_OPTION_SEND_OUT]                             = {gText_SendOut,                CursorCB_SendMon  },\n    [CURSOR_OPTION_ENTER]                                = {gText_Enter,                  CursorCB_Enter    },\n    [CURSOR_OPTION_NO_ENTRY]                             = {gText_NoEntry,                CursorCB_NoEntry  },\n    [CURSOR_OPTION_STORE]                                = {gText_Store,                  CursorCB_Store    },\n    [CURSOR_OPTION_REGISTER]                             = {gText_Register,               CursorCB_Register },\n    [CURSOR_OPTION_TRADE1]                               = {gText_Trade4,                 CursorCB_Trade1   },\n    [CURSOR_OPTION_TRADE2]                               = {gText_Trade4,                 CursorCB_Trade2   },\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_FLASH]       = {gMoveNames[MOVE_FLASH],       CursorCB_FieldMove},\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_CUT]         = {gMoveNames[MOVE_CUT],         CursorCB_FieldMove},\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_FLY]         = {gMoveNames[MOVE_FLY],         CursorCB_FieldMove},\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_STRENGTH]    = {gMoveNames[MOVE_STRENGTH],    CursorCB_FieldMove},\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_SURF]        = {gMoveNames[MOVE_SURF],        CursorCB_FieldMove},\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_ROCK_SMASH]  = {gMoveNames[MOVE_ROCK_SMASH],  CursorCB_FieldMove},\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_WATERFALL]   = {gMoveNames[MOVE_WATERFALL],   CursorCB_FieldMove},\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_TELEPORT]    = {gMoveNames[MOVE_TELEPORT],    CursorCB_FieldMove},\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_DIG]         = {gMoveNames[MOVE_DIG],         CursorCB_FieldMove},\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_MILK_DRINK]  = {gMoveNames[MOVE_MILK_DRINK],  CursorCB_FieldMove},\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_SOFT_BOILED] = {gMoveNames[MOVE_SOFT_BOILED], CursorCB_FieldMove},\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_SWEET_SCENT] = {gMoveNames[MOVE_SWEET_SCENT], CursorCB_FieldMove},\n    [CURSOR_OPTION_FIELD_MOVES + FIELD_MOVE_DIVE]        = {gMoveNames[MOVE_DIVE],        CursorCB_FieldMove},\n};\n\nstatic const u8 sPartyMenuAction_SummarySwitchCancel[]   = {CURSOR_OPTION_SUMMARY,  CURSOR_OPTION_SWITCH,    CURSOR_OPTION_CANCEL1};\nstatic const u8 sPartyMenuAction_ShiftSummaryCancel[]    = {CURSOR_OPTION_SHIFT,    CURSOR_OPTION_SUMMARY,   CURSOR_OPTION_CANCEL1};\nstatic const u8 sPartyMenuAction_SendOutSummaryCancel[]  = {CURSOR_OPTION_SEND_OUT, CURSOR_OPTION_SUMMARY,   CURSOR_OPTION_CANCEL1};\nstatic const u8 sPartyMenuAction_SummaryCancel[]         = {CURSOR_OPTION_SUMMARY,  CURSOR_OPTION_CANCEL1};\nstatic const u8 sPartyMenuAction_EnterSummaryCancel[]    = {CURSOR_OPTION_ENTER,    CURSOR_OPTION_SUMMARY,   CURSOR_OPTION_CANCEL1};\nstatic const u8 sPartyMenuAction_NoEntrySummaryCancel[]  = {CURSOR_OPTION_NO_ENTRY, CURSOR_OPTION_SUMMARY,   CURSOR_OPTION_CANCEL1};\nstatic const u8 sPartyMenuAction_StoreSummaryCancel[]    = {CURSOR_OPTION_STORE,    CURSOR_OPTION_SUMMARY,   CURSOR_OPTION_CANCEL1};\nstatic const u8 sPartyMenuAction_GiveTakeItemCancel[]    = {CURSOR_OPTION_GIVE,     CURSOR_OPTION_TAKE_ITEM, CURSOR_OPTION_CANCEL2};\nstatic const u8 sPartyMenuAction_ReadTakeMailCancel[]    = {CURSOR_OPTION_READ,     CURSOR_OPTION_TAKE_MAIL, CURSOR_OPTION_CANCEL2};\nstatic const u8 sPartyMenuAction_RegisterSummaryCancel[] = {CURSOR_OPTION_REGISTER, CURSOR_OPTION_SUMMARY,   CURSOR_OPTION_CANCEL1};\nstatic const u8 sPartyMenuAction_TradeSummaryCancel1[]   = {CURSOR_OPTION_TRADE1,   CURSOR_OPTION_SUMMARY,   CURSOR_OPTION_CANCEL1};\nstatic const u8 sPartyMenuAction_TradeSummaryCancel2[]   = {CURSOR_OPTION_TRADE2,   CURSOR_OPTION_SUMMARY,   CURSOR_OPTION_CANCEL1};\n\n// IDs for the action lists that appear when a party mon is selected\nenum\n{\n    ACTIONS_NONE,\n    ACTIONS_SWITCH,\n    ACTIONS_SHIFT,\n    ACTIONS_SEND_OUT,\n    ACTIONS_ENTER,\n    ACTIONS_NO_ENTRY,\n    ACTIONS_STORE,\n    ACTIONS_SUMMARY_ONLY,\n    ACTIONS_ITEM,\n    ACTIONS_MAIL,\n    ACTIONS_REGISTER,\n    ACTIONS_TRADE,\n    ACTIONS_SPIN_TRADE,\n};\n\nstatic const u8 *const sPartyMenuActions[] =\n{\n    [ACTIONS_NONE]          = NULL,\n    [ACTIONS_SWITCH]        = sPartyMenuAction_SummarySwitchCancel,\n    [ACTIONS_SHIFT]         = sPartyMenuAction_ShiftSummaryCancel,\n    [ACTIONS_SEND_OUT]      = sPartyMenuAction_SendOutSummaryCancel,\n    [ACTIONS_ENTER]         = sPartyMenuAction_EnterSummaryCancel,\n    [ACTIONS_NO_ENTRY]      = sPartyMenuAction_NoEntrySummaryCancel,\n    [ACTIONS_STORE]         = sPartyMenuAction_StoreSummaryCancel,\n    [ACTIONS_SUMMARY_ONLY]  = sPartyMenuAction_SummaryCancel,\n    [ACTIONS_ITEM]          = sPartyMenuAction_GiveTakeItemCancel,\n    [ACTIONS_MAIL]          = sPartyMenuAction_ReadTakeMailCancel,\n    [ACTIONS_REGISTER]      = sPartyMenuAction_RegisterSummaryCancel,\n    [ACTIONS_TRADE]         = sPartyMenuAction_TradeSummaryCancel1,\n    [ACTIONS_SPIN_TRADE]    = sPartyMenuAction_TradeSummaryCancel2,\n};\n\nstatic const u8 sPartyMenuActionCounts[] =\n{\n    [ACTIONS_NONE]          = 0,\n    [ACTIONS_SWITCH]        = NELEMS(sPartyMenuAction_SummarySwitchCancel),\n    [ACTIONS_SHIFT]         = NELEMS(sPartyMenuAction_ShiftSummaryCancel),\n    [ACTIONS_SEND_OUT]      = NELEMS(sPartyMenuAction_SendOutSummaryCancel),\n    [ACTIONS_ENTER]         = NELEMS(sPartyMenuAction_EnterSummaryCancel),\n    [ACTIONS_NO_ENTRY]      = NELEMS(sPartyMenuAction_NoEntrySummaryCancel),\n    [ACTIONS_STORE]         = NELEMS(sPartyMenuAction_StoreSummaryCancel),\n    [ACTIONS_SUMMARY_ONLY]  = NELEMS(sPartyMenuAction_SummaryCancel),\n    [ACTIONS_ITEM]          = NELEMS(sPartyMenuAction_GiveTakeItemCancel),\n    [ACTIONS_MAIL]          = NELEMS(sPartyMenuAction_ReadTakeMailCancel),\n    [ACTIONS_REGISTER]      = NELEMS(sPartyMenuAction_RegisterSummaryCancel),\n    [ACTIONS_TRADE]         = NELEMS(sPartyMenuAction_TradeSummaryCancel1),\n    [ACTIONS_SPIN_TRADE]    = NELEMS(sPartyMenuAction_TradeSummaryCancel2),\n};\n\nstatic const u16 sFieldMoves[] =\n{\n    MOVE_FLASH,\n    MOVE_CUT, \n    MOVE_FLY, \n    MOVE_STRENGTH, \n    MOVE_SURF, \n    MOVE_ROCK_SMASH, \n    MOVE_WATERFALL, \n    MOVE_TELEPORT,\n    MOVE_DIG, \n    MOVE_MILK_DRINK, \n    MOVE_SOFT_BOILED, \n    MOVE_SWEET_SCENT, \n    MOVE_DIVE, \n    FIELD_MOVE_END // this may be misuse of enum. same in emerald\n};\n\nstatic struct\n{\n    bool8 (*fieldMoveFunc)(void);\n    u8 msgId;\n} const sFieldMoveCursorCallbacks[] =\n{\n    [FIELD_MOVE_FLASH]        = {SetUpFieldMove_Flash,       PARTY_MSG_CANT_USE_HERE},\n    [FIELD_MOVE_CUT]          = {SetUpFieldMove_Cut,         PARTY_MSG_NOTHING_TO_CUT},\n    [FIELD_MOVE_FLY]          = {SetUpFieldMove_Fly,         PARTY_MSG_CANT_USE_HERE},\n    [FIELD_MOVE_STRENGTH]     = {SetUpFieldMove_Strength,    PARTY_MSG_CANT_USE_HERE},\n    [FIELD_MOVE_SURF]         = {SetUpFieldMove_Surf,        PARTY_MSG_CANT_SURF_HERE},\n    [FIELD_MOVE_ROCK_SMASH]   = {SetUpFieldMove_RockSmash,   PARTY_MSG_CANT_USE_HERE},\n    [FIELD_MOVE_WATERFALL]    = {SetUpFieldMove_Waterfall,   PARTY_MSG_CANT_USE_HERE},\n    [FIELD_MOVE_TELEPORT]     = {SetUpFieldMove_Teleport,    PARTY_MSG_CANT_USE_HERE},\n    [FIELD_MOVE_DIG]          = {SetUpFieldMove_Dig,         PARTY_MSG_CANT_USE_HERE},\n    [FIELD_MOVE_MILK_DRINK]   = {SetUpFieldMove_SoftBoiled,  PARTY_MSG_NOT_ENOUGH_HP},\n    [FIELD_MOVE_SOFT_BOILED]  = {SetUpFieldMove_SoftBoiled,  PARTY_MSG_NOT_ENOUGH_HP},\n    [FIELD_MOVE_SWEET_SCENT]  = {SetUpFieldMove_SweetScent,  PARTY_MSG_CANT_USE_HERE},\n    [FIELD_MOVE_DIVE]         = {SetUpFieldMove_Dive,        PARTY_MSG_CANT_USE_HERE},\n};\n\nstatic const u8 *const sUnionRoomTradeMessages[] =\n{\n    [UR_TRADE_MSG_NOT_MON_PARTNER_WANTS - 1]       = gText_NotPkmnOtherTrainerWants,\n    [UR_TRADE_MSG_NOT_EGG - 1]                     = gText_ThatIsntAnEgg,\n    [UR_TRADE_MSG_MON_CANT_BE_TRADED_1 - 1]        = gText_PkmnCantBeTradedNow,\n    [UR_TRADE_MSG_MON_CANT_BE_TRADED_2 - 1]        = gText_PkmnCantBeTradedNow,\n    [UR_TRADE_MSG_PARTNERS_MON_CANT_BE_TRADED - 1] = gText_OtherTrainersPkmnCantBeTraded,\n    [UR_TRADE_MSG_EGG_CANT_BE_TRADED -1]           = gText_EggCantBeTradedNow,\n    [UR_TRADE_MSG_PARTNER_CANT_ACCEPT_MON - 1]     = gText_OtherTrainerCantAcceptPkmn,\n    [UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_1 - 1]   = gText_CantTradeWithTrainer,\n    [UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_2 - 1]   = gText_CantTradeWithTrainer,\n};\n\nconst u16 sTMHMMoves[TMHM_COUNT] =\n{\n    MOVE_FOCUS_PUNCH,\n    MOVE_DRAGON_CLAW,\n    MOVE_WATER_PULSE,\n    MOVE_CALM_MIND,\n    MOVE_ROAR,\n    MOVE_TOXIC,\n    MOVE_HAIL,\n    MOVE_BULK_UP,\n    MOVE_BULLET_SEED,\n    MOVE_HIDDEN_POWER,\n    MOVE_SUNNY_DAY,\n    MOVE_TAUNT,\n    MOVE_ICE_BEAM,\n    MOVE_BLIZZARD,\n    MOVE_HYPER_BEAM,\n    MOVE_LIGHT_SCREEN,\n    MOVE_PROTECT,\n    MOVE_RAIN_DANCE,\n    MOVE_GIGA_DRAIN,\n    MOVE_SAFEGUARD,\n    MOVE_FRUSTRATION,\n    MOVE_SOLAR_BEAM,\n    MOVE_IRON_TAIL,\n    MOVE_THUNDERBOLT,\n    MOVE_THUNDER,\n    MOVE_EARTHQUAKE,\n    MOVE_RETURN,\n    MOVE_DIG,\n    MOVE_PSYCHIC,\n    MOVE_SHADOW_BALL,\n    MOVE_BRICK_BREAK,\n    MOVE_DOUBLE_TEAM,\n    MOVE_REFLECT,\n    MOVE_SHOCK_WAVE,\n    MOVE_FLAMETHROWER,\n    MOVE_SLUDGE_BOMB,\n    MOVE_SANDSTORM,\n    MOVE_FIRE_BLAST,\n    MOVE_ROCK_TOMB,\n    MOVE_AERIAL_ACE,\n    MOVE_TORMENT,\n    MOVE_FACADE,\n    MOVE_SECRET_POWER,\n    MOVE_REST,\n    MOVE_ATTRACT,\n    MOVE_THIEF,\n    MOVE_STEEL_WING,\n    MOVE_SKILL_SWAP,\n    MOVE_SNATCH,\n    MOVE_OVERHEAT,\n    MOVE_CUT,\n    MOVE_FLY,\n    MOVE_SURF,\n    MOVE_STRENGTH,\n    MOVE_FLASH,\n    MOVE_ROCK_SMASH,\n    MOVE_WATERFALL,\n    MOVE_DIVE,\n};\n"
  },
  {
    "path": "src/data/pokemon/cry_ids.h",
    "content": "#define HOENN_MON_SPECIES_START 277\n\nstatic const u16 sHoennSpeciesIdToCryId[] =\n{\n    [SPECIES_TREECKO - HOENN_MON_SPECIES_START] = CRY_TREECKO,\n    [SPECIES_GROVYLE - HOENN_MON_SPECIES_START] = CRY_GROVYLE,\n    [SPECIES_SCEPTILE - HOENN_MON_SPECIES_START] = CRY_SCEPTILE,\n    [SPECIES_TORCHIC - HOENN_MON_SPECIES_START] = CRY_TORCHIC,\n    [SPECIES_COMBUSKEN - HOENN_MON_SPECIES_START] = CRY_COMBUSKEN,\n    [SPECIES_BLAZIKEN - HOENN_MON_SPECIES_START] = CRY_BLAZIKEN,\n    [SPECIES_MUDKIP - HOENN_MON_SPECIES_START] = CRY_MUDKIP,\n    [SPECIES_MARSHTOMP - HOENN_MON_SPECIES_START] = CRY_MARSHTOMP,\n    [SPECIES_SWAMPERT - HOENN_MON_SPECIES_START] = CRY_SWAMPERT,\n    [SPECIES_POOCHYENA - HOENN_MON_SPECIES_START] = CRY_POOCHYENA,\n    [SPECIES_MIGHTYENA - HOENN_MON_SPECIES_START] = CRY_MIGHTYENA,\n    [SPECIES_ZIGZAGOON - HOENN_MON_SPECIES_START] = CRY_ZIGZAGOON,\n    [SPECIES_LINOONE - HOENN_MON_SPECIES_START] = CRY_LINOONE,\n    [SPECIES_WURMPLE - HOENN_MON_SPECIES_START] = CRY_WURMPLE,\n    [SPECIES_SILCOON - HOENN_MON_SPECIES_START] = CRY_SILCOON,\n    [SPECIES_BEAUTIFLY - HOENN_MON_SPECIES_START] = CRY_BEAUTIFLY,\n    [SPECIES_CASCOON - HOENN_MON_SPECIES_START] = CRY_CASCOON,\n    [SPECIES_DUSTOX - HOENN_MON_SPECIES_START] = CRY_DUSTOX,\n    [SPECIES_LOTAD - HOENN_MON_SPECIES_START] = CRY_LOTAD,\n    [SPECIES_LOMBRE - HOENN_MON_SPECIES_START] = CRY_LOMBRE,\n    [SPECIES_LUDICOLO - HOENN_MON_SPECIES_START] = CRY_LUDICOLO,\n    [SPECIES_SEEDOT - HOENN_MON_SPECIES_START] = CRY_SEEDOT,\n    [SPECIES_NUZLEAF - HOENN_MON_SPECIES_START] = CRY_NUZLEAF,\n    [SPECIES_SHIFTRY - HOENN_MON_SPECIES_START] = CRY_SHIFTRY,\n    [SPECIES_NINCADA - HOENN_MON_SPECIES_START] = CRY_NINCADA,\n    [SPECIES_NINJASK - HOENN_MON_SPECIES_START] = CRY_NINJASK,\n    [SPECIES_SHEDINJA - HOENN_MON_SPECIES_START] = CRY_SHEDINJA,\n    [SPECIES_TAILLOW - HOENN_MON_SPECIES_START] = CRY_TAILLOW,\n    [SPECIES_SWELLOW - HOENN_MON_SPECIES_START] = CRY_SWELLOW,\n    [SPECIES_SHROOMISH - HOENN_MON_SPECIES_START] = CRY_SHROOMISH,\n    [SPECIES_BRELOOM - HOENN_MON_SPECIES_START] = CRY_BRELOOM,\n    [SPECIES_SPINDA - HOENN_MON_SPECIES_START] = CRY_SPINDA,\n    [SPECIES_WINGULL - HOENN_MON_SPECIES_START] = CRY_WINGULL,\n    [SPECIES_PELIPPER - HOENN_MON_SPECIES_START] = CRY_PELIPPER,\n    [SPECIES_SURSKIT - HOENN_MON_SPECIES_START] = CRY_SURSKIT,\n    [SPECIES_MASQUERAIN - HOENN_MON_SPECIES_START] = CRY_MASQUERAIN,\n    [SPECIES_WAILMER - HOENN_MON_SPECIES_START] = CRY_WAILMER,\n    [SPECIES_WAILORD - HOENN_MON_SPECIES_START] = CRY_WAILORD,\n    [SPECIES_SKITTY - HOENN_MON_SPECIES_START] = CRY_SKITTY,\n    [SPECIES_DELCATTY - HOENN_MON_SPECIES_START] = CRY_DELCATTY,\n    [SPECIES_KECLEON - HOENN_MON_SPECIES_START] = CRY_KECLEON,\n    [SPECIES_BALTOY - HOENN_MON_SPECIES_START] = CRY_BALTOY,\n    [SPECIES_CLAYDOL - HOENN_MON_SPECIES_START] = CRY_CLAYDOL,\n    [SPECIES_NOSEPASS - HOENN_MON_SPECIES_START] = CRY_NOSEPASS,\n    [SPECIES_TORKOAL - HOENN_MON_SPECIES_START] = CRY_TORKOAL,\n    [SPECIES_SABLEYE - HOENN_MON_SPECIES_START] = CRY_SABLEYE,\n    [SPECIES_BARBOACH - HOENN_MON_SPECIES_START] = CRY_BARBOACH,\n    [SPECIES_WHISCASH - HOENN_MON_SPECIES_START] = CRY_WHISCASH,\n    [SPECIES_LUVDISC - HOENN_MON_SPECIES_START] = CRY_LUVDISC,\n    [SPECIES_CORPHISH - HOENN_MON_SPECIES_START] = CRY_CORPHISH,\n    [SPECIES_CRAWDAUNT - HOENN_MON_SPECIES_START] = CRY_CRAWDAUNT,\n    [SPECIES_FEEBAS - HOENN_MON_SPECIES_START] = CRY_FEEBAS,\n    [SPECIES_MILOTIC - HOENN_MON_SPECIES_START] = CRY_MILOTIC,\n    [SPECIES_CARVANHA - HOENN_MON_SPECIES_START] = CRY_CARVANHA,\n    [SPECIES_SHARPEDO - HOENN_MON_SPECIES_START] = CRY_SHARPEDO,\n    [SPECIES_TRAPINCH - HOENN_MON_SPECIES_START] = CRY_TRAPINCH,\n    [SPECIES_VIBRAVA - HOENN_MON_SPECIES_START] = CRY_VIBRAVA,\n    [SPECIES_FLYGON - HOENN_MON_SPECIES_START] = CRY_FLYGON,\n    [SPECIES_MAKUHITA - HOENN_MON_SPECIES_START] = CRY_MAKUHITA,\n    [SPECIES_HARIYAMA - HOENN_MON_SPECIES_START] = CRY_HARIYAMA,\n    [SPECIES_ELECTRIKE - HOENN_MON_SPECIES_START] = CRY_ELECTRIKE,\n    [SPECIES_MANECTRIC - HOENN_MON_SPECIES_START] = CRY_MANECTRIC,\n    [SPECIES_NUMEL - HOENN_MON_SPECIES_START] = CRY_NUMEL,\n    [SPECIES_CAMERUPT - HOENN_MON_SPECIES_START] = CRY_CAMERUPT,\n    [SPECIES_SPHEAL - HOENN_MON_SPECIES_START] = CRY_SPHEAL,\n    [SPECIES_SEALEO - HOENN_MON_SPECIES_START] = CRY_SEALEO,\n    [SPECIES_WALREIN - HOENN_MON_SPECIES_START] = CRY_WALREIN,\n    [SPECIES_CACNEA - HOENN_MON_SPECIES_START] = CRY_CACNEA,\n    [SPECIES_CACTURNE - HOENN_MON_SPECIES_START] = CRY_CACTURNE,\n    [SPECIES_SNORUNT - HOENN_MON_SPECIES_START] = CRY_SNORUNT,\n    [SPECIES_GLALIE - HOENN_MON_SPECIES_START] = CRY_GLALIE,\n    [SPECIES_LUNATONE - HOENN_MON_SPECIES_START] = CRY_LUNATONE,\n    [SPECIES_SOLROCK - HOENN_MON_SPECIES_START] = CRY_SOLROCK,\n    [SPECIES_AZURILL - HOENN_MON_SPECIES_START] = CRY_AZURILL,\n    [SPECIES_SPOINK - HOENN_MON_SPECIES_START] = CRY_SPOINK,\n    [SPECIES_GRUMPIG - HOENN_MON_SPECIES_START] = CRY_GRUMPIG,\n    [SPECIES_PLUSLE - HOENN_MON_SPECIES_START] = CRY_PLUSLE,\n    [SPECIES_MINUN - HOENN_MON_SPECIES_START] = CRY_MINUN,\n    [SPECIES_MAWILE - HOENN_MON_SPECIES_START] = CRY_MAWILE,\n    [SPECIES_MEDITITE - HOENN_MON_SPECIES_START] = CRY_MEDITITE,\n    [SPECIES_MEDICHAM - HOENN_MON_SPECIES_START] = CRY_MEDICHAM,\n    [SPECIES_SWABLU - HOENN_MON_SPECIES_START] = CRY_SWABLU,\n    [SPECIES_ALTARIA - HOENN_MON_SPECIES_START] = CRY_ALTARIA,\n    [SPECIES_WYNAUT - HOENN_MON_SPECIES_START] = CRY_WYNAUT,\n    [SPECIES_DUSKULL - HOENN_MON_SPECIES_START] = CRY_DUSKULL,\n    [SPECIES_DUSCLOPS - HOENN_MON_SPECIES_START] = CRY_DUSCLOPS,\n    [SPECIES_ROSELIA - HOENN_MON_SPECIES_START] = CRY_ROSELIA,\n    [SPECIES_SLAKOTH - HOENN_MON_SPECIES_START] = CRY_SLAKOTH,\n    [SPECIES_VIGOROTH - HOENN_MON_SPECIES_START] = CRY_VIGOROTH,\n    [SPECIES_SLAKING - HOENN_MON_SPECIES_START] = CRY_SLAKING,\n    [SPECIES_GULPIN - HOENN_MON_SPECIES_START] = CRY_GULPIN,\n    [SPECIES_SWALOT - HOENN_MON_SPECIES_START] = CRY_SWALOT,\n    [SPECIES_TROPIUS - HOENN_MON_SPECIES_START] = CRY_TROPIUS,\n    [SPECIES_WHISMUR - HOENN_MON_SPECIES_START] = CRY_WHISMUR,\n    [SPECIES_LOUDRED - HOENN_MON_SPECIES_START] = CRY_LOUDRED,\n    [SPECIES_EXPLOUD - HOENN_MON_SPECIES_START] = CRY_EXPLOUD,\n    [SPECIES_CLAMPERL - HOENN_MON_SPECIES_START] = CRY_CLAMPERL,\n    [SPECIES_HUNTAIL - HOENN_MON_SPECIES_START] = CRY_HUNTAIL,\n    [SPECIES_GOREBYSS - HOENN_MON_SPECIES_START] = CRY_GOREBYSS,\n    [SPECIES_ABSOL - HOENN_MON_SPECIES_START] = CRY_ABSOL,\n    [SPECIES_SHUPPET - HOENN_MON_SPECIES_START] = CRY_SHUPPET,\n    [SPECIES_BANETTE - HOENN_MON_SPECIES_START] = CRY_BANETTE,\n    [SPECIES_SEVIPER - HOENN_MON_SPECIES_START] = CRY_SEVIPER,\n    [SPECIES_ZANGOOSE - HOENN_MON_SPECIES_START] = CRY_ZANGOOSE,\n    [SPECIES_RELICANTH - HOENN_MON_SPECIES_START] = CRY_RELICANTH,\n    [SPECIES_ARON - HOENN_MON_SPECIES_START] = CRY_ARON,\n    [SPECIES_LAIRON - HOENN_MON_SPECIES_START] = CRY_LAIRON,\n    [SPECIES_AGGRON - HOENN_MON_SPECIES_START] = CRY_AGGRON,\n    [SPECIES_CASTFORM - HOENN_MON_SPECIES_START] = CRY_CASTFORM,\n    [SPECIES_VOLBEAT - HOENN_MON_SPECIES_START] = CRY_VOLBEAT,\n    [SPECIES_ILLUMISE - HOENN_MON_SPECIES_START] = CRY_ILLUMISE,\n    [SPECIES_LILEEP - HOENN_MON_SPECIES_START] = CRY_LILEEP,\n    [SPECIES_CRADILY - HOENN_MON_SPECIES_START] = CRY_CRADILY,\n    [SPECIES_ANORITH - HOENN_MON_SPECIES_START] = CRY_ANORITH,\n    [SPECIES_ARMALDO - HOENN_MON_SPECIES_START] = CRY_ARMALDO,\n    [SPECIES_RALTS - HOENN_MON_SPECIES_START] = CRY_RALTS,\n    [SPECIES_KIRLIA - HOENN_MON_SPECIES_START] = CRY_KIRLIA,\n    [SPECIES_GARDEVOIR - HOENN_MON_SPECIES_START] = CRY_GARDEVOIR,\n    [SPECIES_BAGON - HOENN_MON_SPECIES_START] = CRY_BAGON,\n    [SPECIES_SHELGON - HOENN_MON_SPECIES_START] = CRY_SHELGON,\n    [SPECIES_SALAMENCE - HOENN_MON_SPECIES_START] = CRY_SALAMENCE,\n    [SPECIES_BELDUM - HOENN_MON_SPECIES_START] = CRY_BELDUM,\n    [SPECIES_METANG - HOENN_MON_SPECIES_START] = CRY_METANG,\n    [SPECIES_METAGROSS - HOENN_MON_SPECIES_START] = CRY_METAGROSS,\n    [SPECIES_REGIROCK - HOENN_MON_SPECIES_START] = CRY_REGIROCK,\n    [SPECIES_REGICE - HOENN_MON_SPECIES_START] = CRY_REGICE,\n    [SPECIES_REGISTEEL - HOENN_MON_SPECIES_START] = CRY_REGISTEEL,\n    [SPECIES_KYOGRE - HOENN_MON_SPECIES_START] = CRY_KYOGRE,\n    [SPECIES_GROUDON - HOENN_MON_SPECIES_START] = CRY_GROUDON,\n    [SPECIES_RAYQUAZA - HOENN_MON_SPECIES_START] = CRY_RAYQUAZA,\n    [SPECIES_LATIAS - HOENN_MON_SPECIES_START] = CRY_LATIAS,\n    [SPECIES_LATIOS - HOENN_MON_SPECIES_START] = CRY_LATIOS,\n    [SPECIES_JIRACHI - HOENN_MON_SPECIES_START] = CRY_JIRACHI,\n    [SPECIES_DEOXYS - HOENN_MON_SPECIES_START] = CRY_DEOXYS,\n    [SPECIES_CHIMECHO - HOENN_MON_SPECIES_START] = CRY_CHIMECHO,\n};\n"
  },
  {
    "path": "src/data/pokemon/egg_moves.h",
    "content": "#define EGG_MOVES_SPECIES_OFFSET 20000\n#define EGG_MOVES_TERMINATOR 0xFFFF\n#define egg_moves(species, moves...) (SPECIES_##species + EGG_MOVES_SPECIES_OFFSET), moves\n\nconst u16 gEggMoves[] = {\n    egg_moves(BULBASAUR,\n              MOVE_LIGHT_SCREEN,\n              MOVE_SKULL_BASH,\n              MOVE_SAFEGUARD,\n              MOVE_CHARM,\n              MOVE_PETAL_DANCE,\n              MOVE_MAGICAL_LEAF,\n              MOVE_GRASS_WHISTLE,\n              MOVE_CURSE),\n\n    egg_moves(CHARMANDER,\n              MOVE_BELLY_DRUM,\n              MOVE_ANCIENT_POWER,\n              MOVE_ROCK_SLIDE,\n              MOVE_BITE,\n              MOVE_OUTRAGE,\n              MOVE_BEAT_UP,\n              MOVE_SWORDS_DANCE,\n              MOVE_DRAGON_DANCE),\n\n    egg_moves(SQUIRTLE,\n              MOVE_MIRROR_COAT,\n              MOVE_HAZE,\n              MOVE_MIST,\n              MOVE_FORESIGHT,\n              MOVE_FLAIL,\n              MOVE_REFRESH,\n              MOVE_MUD_SPORT,\n              MOVE_YAWN),\n\n    egg_moves(PIDGEY,\n              MOVE_PURSUIT,\n              MOVE_FAINT_ATTACK,\n              MOVE_FORESIGHT,\n              MOVE_STEEL_WING,\n              MOVE_AIR_CUTTER),\n\n    egg_moves(RATTATA,\n              MOVE_SCREECH,\n              MOVE_FLAME_WHEEL,\n              MOVE_FURY_SWIPES,\n              MOVE_BITE,\n              MOVE_COUNTER,\n              MOVE_REVERSAL,\n              MOVE_UPROAR,\n              MOVE_SWAGGER),\n\n    egg_moves(SPEAROW,\n              MOVE_FAINT_ATTACK,\n              MOVE_FALSE_SWIPE,\n              MOVE_SCARY_FACE,\n              MOVE_QUICK_ATTACK,\n              MOVE_TRI_ATTACK,\n              MOVE_ASTONISH,\n              MOVE_SKY_ATTACK),\n\n    egg_moves(EKANS,\n              MOVE_PURSUIT,\n              MOVE_SLAM,\n              MOVE_SPITE,\n              MOVE_BEAT_UP,\n              MOVE_POISON_FANG),\n\n    egg_moves(SANDSHREW,\n              MOVE_FLAIL,\n              MOVE_SAFEGUARD,\n              MOVE_COUNTER,\n              MOVE_RAPID_SPIN,\n              MOVE_ROCK_SLIDE,\n              MOVE_METAL_CLAW,\n              MOVE_SWORDS_DANCE,\n              MOVE_CRUSH_CLAW),\n\n    egg_moves(NIDORAN_F,\n              MOVE_SUPERSONIC,\n              MOVE_DISABLE,\n              MOVE_TAKE_DOWN,\n              MOVE_FOCUS_ENERGY,\n              MOVE_CHARM,\n              MOVE_COUNTER,\n              MOVE_BEAT_UP),\n\n    egg_moves(NIDORAN_M,\n              MOVE_COUNTER,\n              MOVE_DISABLE,\n              MOVE_SUPERSONIC,\n              MOVE_TAKE_DOWN,\n              MOVE_AMNESIA,\n              MOVE_CONFUSION,\n              MOVE_BEAT_UP),\n\n    egg_moves(VULPIX,\n              MOVE_FAINT_ATTACK,\n              MOVE_HYPNOSIS,\n              MOVE_FLAIL,\n              MOVE_SPITE,\n              MOVE_DISABLE,\n              MOVE_HOWL,\n              MOVE_PSYCH_UP,\n              MOVE_HEAT_WAVE),\n\n    egg_moves(ZUBAT,\n              MOVE_QUICK_ATTACK,\n              MOVE_PURSUIT,\n              MOVE_FAINT_ATTACK,\n              MOVE_GUST,\n              MOVE_WHIRLWIND,\n              MOVE_CURSE),\n\n    egg_moves(ODDISH,\n              MOVE_SWORDS_DANCE,\n              MOVE_RAZOR_LEAF,\n              MOVE_FLAIL,\n              MOVE_SYNTHESIS,\n              MOVE_CHARM,\n              MOVE_INGRAIN),\n\n    egg_moves(PARAS,\n              MOVE_FALSE_SWIPE,\n              MOVE_SCREECH,\n              MOVE_COUNTER,\n              MOVE_PSYBEAM,\n              MOVE_FLAIL,\n              MOVE_SWEET_SCENT,\n              MOVE_LIGHT_SCREEN,\n              MOVE_PURSUIT),\n\n    egg_moves(VENONAT,\n              MOVE_BATON_PASS,\n              MOVE_SCREECH,\n              MOVE_GIGA_DRAIN,\n              MOVE_SIGNAL_BEAM),\n\n    egg_moves(DIGLETT,\n              MOVE_FAINT_ATTACK,\n              MOVE_SCREECH,\n              MOVE_ANCIENT_POWER,\n              MOVE_PURSUIT,\n              MOVE_BEAT_UP,\n              MOVE_UPROAR,\n              MOVE_ROCK_SLIDE),\n\n    egg_moves(MEOWTH,\n              MOVE_SPITE,\n              MOVE_CHARM,\n              MOVE_HYPNOSIS,\n              MOVE_AMNESIA,\n              MOVE_PSYCH_UP,\n              MOVE_ASSIST),\n\n    egg_moves(PSYDUCK,\n              MOVE_HYPNOSIS,\n              MOVE_PSYBEAM,\n              MOVE_FORESIGHT,\n              MOVE_LIGHT_SCREEN,\n              MOVE_FUTURE_SIGHT,\n              MOVE_PSYCHIC,\n              MOVE_CROSS_CHOP,\n              MOVE_REFRESH),\n\n    egg_moves(MANKEY,\n              MOVE_ROCK_SLIDE,\n              MOVE_FORESIGHT,\n              MOVE_MEDITATE,\n              MOVE_COUNTER,\n              MOVE_REVERSAL,\n              MOVE_BEAT_UP,\n              MOVE_REVENGE,\n              MOVE_SMELLING_SALT),\n\n    egg_moves(GROWLITHE,\n              MOVE_BODY_SLAM,\n              MOVE_SAFEGUARD,\n              MOVE_CRUNCH,\n              MOVE_THRASH,\n              MOVE_FIRE_SPIN,\n              MOVE_HOWL,\n              MOVE_HEAT_WAVE),\n\n    egg_moves(POLIWAG,\n              MOVE_MIST,\n              MOVE_SPLASH,\n              MOVE_BUBBLE_BEAM,\n              MOVE_HAZE,\n              MOVE_MIND_READER,\n              MOVE_WATER_SPORT,\n              MOVE_ICE_BALL),\n\n    egg_moves(ABRA,\n              MOVE_ENCORE,\n              MOVE_BARRIER,\n              MOVE_KNOCK_OFF,\n              MOVE_FIRE_PUNCH,\n              MOVE_THUNDER_PUNCH,\n              MOVE_ICE_PUNCH),\n\n    egg_moves(MACHOP,\n              MOVE_LIGHT_SCREEN,\n              MOVE_MEDITATE,\n              MOVE_ROLLING_KICK,\n              MOVE_ENCORE,\n              MOVE_SMELLING_SALT,\n              MOVE_COUNTER,\n              MOVE_ROCK_SLIDE),\n\n    egg_moves(BELLSPROUT,\n              MOVE_SWORDS_DANCE,\n              MOVE_ENCORE,\n              MOVE_REFLECT,\n              MOVE_SYNTHESIS,\n              MOVE_LEECH_LIFE,\n              MOVE_INGRAIN,\n              MOVE_MAGICAL_LEAF),\n\n    egg_moves(TENTACOOL,\n              MOVE_AURORA_BEAM,\n              MOVE_MIRROR_COAT,\n              MOVE_RAPID_SPIN,\n              MOVE_HAZE,\n              MOVE_SAFEGUARD,\n              MOVE_CONFUSE_RAY),\n\n    egg_moves(GEODUDE,\n              MOVE_MEGA_PUNCH,\n              MOVE_ROCK_SLIDE,\n              MOVE_BLOCK),\n\n    egg_moves(PONYTA,\n              MOVE_FLAME_WHEEL,\n              MOVE_THRASH,\n              MOVE_DOUBLE_KICK,\n              MOVE_HYPNOSIS,\n              MOVE_CHARM,\n              MOVE_DOUBLE_EDGE),\n\n    egg_moves(SLOWPOKE,\n              MOVE_SAFEGUARD,\n              MOVE_BELLY_DRUM,\n              MOVE_FUTURE_SIGHT,\n              MOVE_STOMP,\n              MOVE_MUD_SPORT,\n              MOVE_SLEEP_TALK,\n              MOVE_SNORE),\n\n    egg_moves(FARFETCHD,\n              MOVE_STEEL_WING,\n              MOVE_FORESIGHT,\n              MOVE_MIRROR_MOVE,\n              MOVE_GUST,\n              MOVE_QUICK_ATTACK,\n              MOVE_FLAIL,\n              MOVE_FEATHER_DANCE,\n              MOVE_CURSE),\n\n    egg_moves(DODUO,\n              MOVE_QUICK_ATTACK,\n              MOVE_SUPERSONIC,\n              MOVE_HAZE,\n              MOVE_FAINT_ATTACK,\n              MOVE_FLAIL,\n              MOVE_ENDEAVOR),\n\n    egg_moves(SEEL,\n              MOVE_LICK,\n              MOVE_PERISH_SONG,\n              MOVE_DISABLE,\n              MOVE_HORN_DRILL,\n              MOVE_SLAM,\n              MOVE_ENCORE,\n              MOVE_FAKE_OUT,\n              MOVE_ICICLE_SPEAR),\n\n    egg_moves(GRIMER,\n              MOVE_HAZE,\n              MOVE_MEAN_LOOK,\n              MOVE_LICK,\n              MOVE_IMPRISON,\n              MOVE_CURSE,\n              MOVE_SHADOW_PUNCH,\n              MOVE_EXPLOSION),\n\n    egg_moves(SHELLDER,\n              MOVE_BUBBLE_BEAM,\n              MOVE_TAKE_DOWN,\n              MOVE_BARRIER,\n              MOVE_RAPID_SPIN,\n              MOVE_SCREECH,\n              MOVE_ICICLE_SPEAR),\n\n    egg_moves(GASTLY,\n              MOVE_PSYWAVE,\n              MOVE_PERISH_SONG,\n              MOVE_HAZE,\n              MOVE_ASTONISH,\n              MOVE_WILL_O_WISP,\n              MOVE_GRUDGE,\n              MOVE_EXPLOSION),\n\n    egg_moves(ONIX,\n              MOVE_ROCK_SLIDE,\n              MOVE_FLAIL,\n              MOVE_EXPLOSION,\n              MOVE_BLOCK),\n\n    egg_moves(DROWZEE,\n              MOVE_BARRIER,\n              MOVE_ASSIST,\n              MOVE_ROLE_PLAY,\n              MOVE_FIRE_PUNCH,\n              MOVE_THUNDER_PUNCH,\n              MOVE_ICE_PUNCH),\n\n    egg_moves(KRABBY,\n              MOVE_DIG,\n              MOVE_HAZE,\n              MOVE_AMNESIA,\n              MOVE_FLAIL,\n              MOVE_SLAM,\n              MOVE_KNOCK_OFF,\n              MOVE_SWORDS_DANCE),\n\n    egg_moves(EXEGGCUTE,\n              MOVE_SYNTHESIS,\n              MOVE_MOONLIGHT,\n              MOVE_REFLECT,\n              MOVE_ANCIENT_POWER,\n              MOVE_PSYCH_UP,\n              MOVE_INGRAIN,\n              MOVE_CURSE),\n\n    egg_moves(CUBONE,\n              MOVE_ROCK_SLIDE,\n              MOVE_ANCIENT_POWER,\n              MOVE_BELLY_DRUM,\n              MOVE_SCREECH,\n              MOVE_SKULL_BASH,\n              MOVE_PERISH_SONG,\n              MOVE_SWORDS_DANCE),\n\n    egg_moves(LICKITUNG,\n              MOVE_BELLY_DRUM,\n              MOVE_MAGNITUDE,\n              MOVE_BODY_SLAM,\n              MOVE_CURSE,\n              MOVE_SMELLING_SALT,\n              MOVE_SLEEP_TALK,\n              MOVE_SNORE,\n              MOVE_SUBSTITUTE),\n\n    egg_moves(KOFFING,\n              MOVE_SCREECH,\n              MOVE_PSYWAVE,\n              MOVE_PSYBEAM,\n              MOVE_DESTINY_BOND,\n              MOVE_PAIN_SPLIT,\n              MOVE_WILL_O_WISP),\n\n    egg_moves(RHYHORN,\n              MOVE_CRUNCH,\n              MOVE_REVERSAL,\n              MOVE_ROCK_SLIDE,\n              MOVE_COUNTER,\n              MOVE_MAGNITUDE,\n              MOVE_SWORDS_DANCE,\n              MOVE_CURSE,\n              MOVE_CRUSH_CLAW),\n\n    egg_moves(CHANSEY,\n              MOVE_PRESENT,\n              MOVE_METRONOME,\n              MOVE_HEAL_BELL,\n              MOVE_AROMATHERAPY,\n              MOVE_SUBSTITUTE),\n\n    egg_moves(TANGELA,\n              MOVE_FLAIL,\n              MOVE_CONFUSION,\n              MOVE_MEGA_DRAIN,\n              MOVE_REFLECT,\n              MOVE_AMNESIA,\n              MOVE_LEECH_SEED,\n              MOVE_NATURE_POWER),\n\n    egg_moves(KANGASKHAN,\n              MOVE_STOMP,\n              MOVE_FORESIGHT,\n              MOVE_FOCUS_ENERGY,\n              MOVE_SAFEGUARD,\n              MOVE_DISABLE,\n              MOVE_COUNTER,\n              MOVE_CRUSH_CLAW,\n              MOVE_SUBSTITUTE),\n\n    egg_moves(HORSEA,\n              MOVE_FLAIL,\n              MOVE_AURORA_BEAM,\n              MOVE_OCTAZOOKA,\n              MOVE_DISABLE,\n              MOVE_SPLASH,\n              MOVE_DRAGON_RAGE,\n              MOVE_DRAGON_BREATH),\n\n    egg_moves(GOLDEEN,\n              MOVE_PSYBEAM,\n              MOVE_HAZE,\n              MOVE_HYDRO_PUMP,\n              MOVE_SLEEP_TALK,\n              MOVE_MUD_SPORT),\n\n    egg_moves(MR_MIME,\n              MOVE_FUTURE_SIGHT,\n              MOVE_HYPNOSIS,\n              MOVE_MIMIC,\n              MOVE_PSYCH_UP,\n              MOVE_FAKE_OUT,\n              MOVE_TRICK),\n\n    egg_moves(SCYTHER,\n              MOVE_COUNTER,\n              MOVE_SAFEGUARD,\n              MOVE_BATON_PASS,\n              MOVE_RAZOR_WIND,\n              MOVE_REVERSAL,\n              MOVE_LIGHT_SCREEN,\n              MOVE_ENDURE,\n              MOVE_SILVER_WIND),\n\n    egg_moves(PINSIR,\n              MOVE_FURY_ATTACK,\n              MOVE_FLAIL,\n              MOVE_FALSE_SWIPE,\n              MOVE_FAINT_ATTACK),\n\n    egg_moves(LAPRAS,\n              MOVE_FORESIGHT,\n              MOVE_SUBSTITUTE,\n              MOVE_TICKLE,\n              MOVE_REFRESH,\n              MOVE_DRAGON_DANCE,\n              MOVE_CURSE,\n              MOVE_SLEEP_TALK,\n              MOVE_HORN_DRILL),\n\n    egg_moves(EEVEE,\n              MOVE_CHARM,\n              MOVE_FLAIL,\n              MOVE_ENDURE,\n              MOVE_CURSE,\n              MOVE_TICKLE,\n              MOVE_WISH),\n\n    egg_moves(OMANYTE,\n              MOVE_BUBBLE_BEAM,\n              MOVE_AURORA_BEAM,\n              MOVE_SLAM,\n              MOVE_SUPERSONIC,\n              MOVE_HAZE,\n              MOVE_ROCK_SLIDE,\n              MOVE_SPIKES),\n\n    egg_moves(KABUTO,\n              MOVE_BUBBLE_BEAM,\n              MOVE_AURORA_BEAM,\n              MOVE_RAPID_SPIN,\n              MOVE_DIG,\n              MOVE_FLAIL,\n              MOVE_KNOCK_OFF,\n              MOVE_CONFUSE_RAY),\n\n    egg_moves(AERODACTYL,\n              MOVE_WHIRLWIND,\n              MOVE_PURSUIT,\n              MOVE_FORESIGHT,\n              MOVE_STEEL_WING,\n              MOVE_DRAGON_BREATH,\n              MOVE_CURSE),\n\n    egg_moves(SNORLAX,\n              MOVE_LICK,\n              MOVE_CHARM,\n              MOVE_DOUBLE_EDGE,\n              MOVE_CURSE,\n              MOVE_FISSURE,\n              MOVE_SUBSTITUTE),\n\n    egg_moves(DRATINI,\n              MOVE_LIGHT_SCREEN,\n              MOVE_MIST,\n              MOVE_HAZE,\n              MOVE_SUPERSONIC,\n              MOVE_DRAGON_BREATH,\n              MOVE_DRAGON_DANCE),\n\n    egg_moves(CHIKORITA,\n              MOVE_VINE_WHIP,\n              MOVE_LEECH_SEED,\n              MOVE_COUNTER,\n              MOVE_ANCIENT_POWER,\n              MOVE_FLAIL,\n              MOVE_NATURE_POWER,\n              MOVE_INGRAIN,\n              MOVE_GRASS_WHISTLE),\n\n    egg_moves(CYNDAQUIL,\n              MOVE_FURY_SWIPES,\n              MOVE_QUICK_ATTACK,\n              MOVE_REVERSAL,\n              MOVE_THRASH,\n              MOVE_FORESIGHT,\n              MOVE_COVET,\n              MOVE_HOWL,\n              MOVE_CRUSH_CLAW),\n\n    egg_moves(TOTODILE,\n              MOVE_CRUNCH,\n              MOVE_THRASH,\n              MOVE_HYDRO_PUMP,\n              MOVE_ANCIENT_POWER,\n              MOVE_ROCK_SLIDE,\n              MOVE_MUD_SPORT,\n              MOVE_WATER_SPORT,\n              MOVE_DRAGON_CLAW),\n\n    egg_moves(SENTRET,\n              MOVE_DOUBLE_EDGE,\n              MOVE_PURSUIT,\n              MOVE_SLASH,\n              MOVE_FOCUS_ENERGY,\n              MOVE_REVERSAL,\n              MOVE_SUBSTITUTE,\n              MOVE_TRICK,\n              MOVE_ASSIST),\n\n    egg_moves(HOOTHOOT,\n              MOVE_MIRROR_MOVE,\n              MOVE_SUPERSONIC,\n              MOVE_FAINT_ATTACK,\n              MOVE_WING_ATTACK,\n              MOVE_WHIRLWIND,\n              MOVE_SKY_ATTACK,\n              MOVE_FEATHER_DANCE),\n\n    egg_moves(LEDYBA,\n              MOVE_PSYBEAM,\n              MOVE_BIDE,\n              MOVE_SILVER_WIND),\n\n    egg_moves(SPINARAK,\n              MOVE_PSYBEAM,\n              MOVE_DISABLE,\n              MOVE_SONIC_BOOM,\n              MOVE_BATON_PASS,\n              MOVE_PURSUIT,\n              MOVE_SIGNAL_BEAM),\n\n    egg_moves(CHINCHOU,\n              MOVE_FLAIL,\n              MOVE_SCREECH,\n              MOVE_AMNESIA),\n\n    egg_moves(PICHU,\n              MOVE_REVERSAL,\n              MOVE_BIDE,\n              MOVE_PRESENT,\n              MOVE_ENCORE,\n              MOVE_DOUBLE_SLAP,\n              MOVE_WISH,\n              MOVE_CHARGE),\n\n    egg_moves(CLEFFA,\n              MOVE_PRESENT,\n              MOVE_METRONOME,\n              MOVE_AMNESIA,\n              MOVE_BELLY_DRUM,\n              MOVE_SPLASH,\n              MOVE_MIMIC,\n              MOVE_WISH,\n              MOVE_SUBSTITUTE),\n\n    egg_moves(IGGLYBUFF,\n              MOVE_PERISH_SONG,\n              MOVE_PRESENT,\n              MOVE_FAINT_ATTACK,\n              MOVE_WISH,\n              MOVE_FAKE_TEARS),\n\n    egg_moves(TOGEPI,\n              MOVE_PRESENT,\n              MOVE_MIRROR_MOVE,\n              MOVE_PECK,\n              MOVE_FORESIGHT,\n              MOVE_FUTURE_SIGHT,\n              MOVE_SUBSTITUTE,\n              MOVE_PSYCH_UP),\n\n    egg_moves(NATU,\n              MOVE_HAZE,\n              MOVE_DRILL_PECK,\n              MOVE_QUICK_ATTACK,\n              MOVE_FAINT_ATTACK,\n              MOVE_STEEL_WING,\n              MOVE_PSYCH_UP,\n              MOVE_FEATHER_DANCE,\n              MOVE_REFRESH),\n\n    egg_moves(MAREEP,\n              MOVE_TAKE_DOWN,\n              MOVE_BODY_SLAM,\n              MOVE_SAFEGUARD,\n              MOVE_SCREECH,\n              MOVE_REFLECT,\n              MOVE_ODOR_SLEUTH,\n              MOVE_CHARGE),\n\n    egg_moves(MARILL,\n              MOVE_LIGHT_SCREEN,\n              MOVE_PRESENT,\n              MOVE_AMNESIA,\n              MOVE_FUTURE_SIGHT,\n              MOVE_BELLY_DRUM,\n              MOVE_PERISH_SONG,\n              MOVE_SUPERSONIC,\n              MOVE_SUBSTITUTE),\n\n    egg_moves(SUDOWOODO,\n              MOVE_SELF_DESTRUCT),\n\n    egg_moves(HOPPIP,\n              MOVE_CONFUSION,\n              MOVE_ENCORE,\n              MOVE_DOUBLE_EDGE,\n              MOVE_REFLECT,\n              MOVE_AMNESIA,\n              MOVE_HELPING_HAND,\n              MOVE_PSYCH_UP),\n\n    egg_moves(AIPOM,\n              MOVE_COUNTER,\n              MOVE_SCREECH,\n              MOVE_PURSUIT,\n              MOVE_AGILITY,\n              MOVE_SPITE,\n              MOVE_SLAM,\n              MOVE_DOUBLE_SLAP,\n              MOVE_BEAT_UP),\n\n    egg_moves(SUNKERN,\n              MOVE_GRASS_WHISTLE,\n              MOVE_ENCORE,\n              MOVE_LEECH_SEED,\n              MOVE_NATURE_POWER,\n              MOVE_CURSE,\n              MOVE_HELPING_HAND),\n\n    egg_moves(YANMA,\n              MOVE_WHIRLWIND,\n              MOVE_REVERSAL,\n              MOVE_LEECH_LIFE,\n              MOVE_SIGNAL_BEAM,\n              MOVE_SILVER_WIND),\n\n    egg_moves(WOOPER,\n              MOVE_BODY_SLAM,\n              MOVE_ANCIENT_POWER,\n              MOVE_SAFEGUARD,\n              MOVE_CURSE,\n              MOVE_MUD_SPORT,\n              MOVE_STOCKPILE,\n              MOVE_SWALLOW,\n              MOVE_SPIT_UP),\n\n    egg_moves(MURKROW,\n              MOVE_WHIRLWIND,\n              MOVE_DRILL_PECK,\n              MOVE_MIRROR_MOVE,\n              MOVE_WING_ATTACK,\n              MOVE_SKY_ATTACK,\n              MOVE_CONFUSE_RAY,\n              MOVE_FEATHER_DANCE,\n              MOVE_PERISH_SONG),\n\n    egg_moves(MISDREAVUS,\n              MOVE_SCREECH,\n              MOVE_DESTINY_BOND,\n              MOVE_PSYCH_UP,\n              MOVE_IMPRISON),\n\n    egg_moves(GIRAFARIG,\n              MOVE_TAKE_DOWN,\n              MOVE_AMNESIA,\n              MOVE_FORESIGHT,\n              MOVE_FUTURE_SIGHT,\n              MOVE_BEAT_UP,\n              MOVE_PSYCH_UP,\n              MOVE_WISH,\n              MOVE_MAGIC_COAT),\n\n    egg_moves(PINECO,\n              MOVE_REFLECT,\n              MOVE_PIN_MISSILE,\n              MOVE_FLAIL,\n              MOVE_SWIFT,\n              MOVE_COUNTER,\n              MOVE_SAND_TOMB),\n\n    egg_moves(DUNSPARCE,\n              MOVE_BIDE,\n              MOVE_ANCIENT_POWER,\n              MOVE_ROCK_SLIDE,\n              MOVE_BITE,\n              MOVE_HEADBUTT,\n              MOVE_ASTONISH,\n              MOVE_CURSE),\n\n    egg_moves(GLIGAR,\n              MOVE_METAL_CLAW,\n              MOVE_WING_ATTACK,\n              MOVE_RAZOR_WIND,\n              MOVE_COUNTER,\n              MOVE_SAND_TOMB),\n\n    egg_moves(SNUBBULL,\n              MOVE_METRONOME,\n              MOVE_FAINT_ATTACK,\n              MOVE_REFLECT,\n              MOVE_PRESENT,\n              MOVE_CRUNCH,\n              MOVE_HEAL_BELL,\n              MOVE_SNORE,\n              MOVE_SMELLING_SALT),\n\n    egg_moves(QWILFISH,\n              MOVE_FLAIL,\n              MOVE_HAZE,\n              MOVE_BUBBLE_BEAM,\n              MOVE_SUPERSONIC,\n              MOVE_ASTONISH),\n\n    egg_moves(SHUCKLE,\n              MOVE_SWEET_SCENT),\n\n    egg_moves(HERACROSS,\n              MOVE_HARDEN,\n              MOVE_BIDE,\n              MOVE_FLAIL,\n              MOVE_FALSE_SWIPE),\n\n    egg_moves(SNEASEL,\n              MOVE_COUNTER,\n              MOVE_SPITE,\n              MOVE_FORESIGHT,\n              MOVE_REFLECT,\n              MOVE_BITE,\n              MOVE_CRUSH_CLAW,\n              MOVE_FAKE_OUT),\n\n    egg_moves(TEDDIURSA,\n              MOVE_CRUNCH,\n              MOVE_TAKE_DOWN,\n              MOVE_SEISMIC_TOSS,\n              MOVE_COUNTER,\n              MOVE_METAL_CLAW,\n              MOVE_FAKE_TEARS,\n              MOVE_YAWN,\n              MOVE_SLEEP_TALK),\n\n    egg_moves(SLUGMA,\n              MOVE_ACID_ARMOR,\n              MOVE_HEAT_WAVE),\n\n    egg_moves(SWINUB,\n              MOVE_TAKE_DOWN,\n              MOVE_BITE,\n              MOVE_BODY_SLAM,\n              MOVE_ROCK_SLIDE,\n              MOVE_ANCIENT_POWER,\n              MOVE_MUD_SHOT,\n              MOVE_ICICLE_SPEAR,\n              MOVE_DOUBLE_EDGE),\n\n    egg_moves(CORSOLA,\n              MOVE_ROCK_SLIDE,\n              MOVE_SCREECH,\n              MOVE_MIST,\n              MOVE_AMNESIA,\n              MOVE_BARRIER,\n              MOVE_INGRAIN,\n              MOVE_CONFUSE_RAY,\n              MOVE_ICICLE_SPEAR),\n\n    egg_moves(REMORAID,\n              MOVE_AURORA_BEAM,\n              MOVE_OCTAZOOKA,\n              MOVE_SUPERSONIC,\n              MOVE_HAZE,\n              MOVE_SCREECH,\n              MOVE_THUNDER_WAVE,\n              MOVE_ROCK_BLAST),\n\n    egg_moves(DELIBIRD,\n              MOVE_AURORA_BEAM,\n              MOVE_QUICK_ATTACK,\n              MOVE_FUTURE_SIGHT,\n              MOVE_SPLASH,\n              MOVE_RAPID_SPIN,\n              MOVE_ICE_BALL),\n\n    egg_moves(MANTINE,\n              MOVE_TWISTER,\n              MOVE_HYDRO_PUMP,\n              MOVE_HAZE,\n              MOVE_SLAM,\n              MOVE_MUD_SPORT,\n              MOVE_ROCK_SLIDE),\n\n    egg_moves(SKARMORY,\n              MOVE_DRILL_PECK,\n              MOVE_PURSUIT,\n              MOVE_WHIRLWIND,\n              MOVE_SKY_ATTACK,\n              MOVE_CURSE),\n\n    egg_moves(HOUNDOUR,\n              MOVE_FIRE_SPIN,\n              MOVE_RAGE,\n              MOVE_PURSUIT,\n              MOVE_COUNTER,\n              MOVE_SPITE,\n              MOVE_REVERSAL,\n              MOVE_BEAT_UP,\n              MOVE_WILL_O_WISP),\n\n    egg_moves(PHANPY,\n              MOVE_FOCUS_ENERGY,\n              MOVE_BODY_SLAM,\n              MOVE_ANCIENT_POWER,\n              MOVE_SNORE,\n              MOVE_COUNTER,\n              MOVE_FISSURE),\n\n    egg_moves(STANTLER,\n              MOVE_SPITE,\n              MOVE_DISABLE,\n              MOVE_BITE,\n              MOVE_SWAGGER,\n              MOVE_PSYCH_UP,\n              MOVE_EXTRASENSORY),\n\n    egg_moves(TYROGUE,\n              MOVE_RAPID_SPIN,\n              MOVE_HI_JUMP_KICK,\n              MOVE_MACH_PUNCH,\n              MOVE_MIND_READER,\n              MOVE_HELPING_HAND),\n\n    egg_moves(SMOOCHUM,\n              MOVE_MEDITATE,\n              MOVE_PSYCH_UP,\n              MOVE_FAKE_OUT,\n              MOVE_WISH,\n              MOVE_ICE_PUNCH),\n\n    egg_moves(ELEKID,\n              MOVE_KARATE_CHOP,\n              MOVE_BARRIER,\n              MOVE_ROLLING_KICK,\n              MOVE_MEDITATE,\n              MOVE_CROSS_CHOP,\n              MOVE_FIRE_PUNCH,\n              MOVE_ICE_PUNCH),\n\n    egg_moves(MAGBY,\n              MOVE_KARATE_CHOP,\n              MOVE_MEGA_PUNCH,\n              MOVE_BARRIER,\n              MOVE_SCREECH,\n              MOVE_CROSS_CHOP,\n              MOVE_THUNDER_PUNCH),\n\n    egg_moves(MILTANK,\n              MOVE_PRESENT,\n              MOVE_REVERSAL,\n              MOVE_SEISMIC_TOSS,\n              MOVE_ENDURE,\n              MOVE_PSYCH_UP,\n              MOVE_CURSE,\n              MOVE_HELPING_HAND,\n              MOVE_SLEEP_TALK),\n\n    egg_moves(LARVITAR,\n              MOVE_PURSUIT,\n              MOVE_STOMP,\n              MOVE_OUTRAGE,\n              MOVE_FOCUS_ENERGY,\n              MOVE_ANCIENT_POWER,\n              MOVE_DRAGON_DANCE,\n              MOVE_CURSE),\n\n    egg_moves(TREECKO,\n              MOVE_CRUNCH,\n              MOVE_MUD_SPORT,\n              MOVE_ENDEAVOR,\n              MOVE_LEECH_SEED,\n              MOVE_DRAGON_BREATH,\n              MOVE_CRUSH_CLAW),\n\n    egg_moves(TORCHIC,\n              MOVE_COUNTER,\n              MOVE_REVERSAL,\n              MOVE_ENDURE,\n              MOVE_SWAGGER,\n              MOVE_ROCK_SLIDE,\n              MOVE_SMELLING_SALT),\n\n    egg_moves(MUDKIP,\n              MOVE_REFRESH,\n              MOVE_UPROAR,\n              MOVE_CURSE,\n              MOVE_STOMP,\n              MOVE_ICE_BALL,\n              MOVE_MIRROR_COAT),\n\n    egg_moves(POOCHYENA,\n              MOVE_ASTONISH,\n              MOVE_POISON_FANG,\n              MOVE_COVET,\n              MOVE_LEER,\n              MOVE_YAWN),\n\n    egg_moves(ZIGZAGOON,\n              MOVE_CHARM,\n              MOVE_PURSUIT,\n              MOVE_SUBSTITUTE,\n              MOVE_TICKLE,\n              MOVE_TRICK),\n\n    egg_moves(LOTAD,\n              MOVE_SYNTHESIS,\n              MOVE_RAZOR_LEAF,\n              MOVE_SWEET_SCENT,\n              MOVE_LEECH_SEED,\n              MOVE_FLAIL,\n              MOVE_WATER_GUN),\n\n    egg_moves(SEEDOT,\n              MOVE_LEECH_SEED,\n              MOVE_AMNESIA,\n              MOVE_QUICK_ATTACK,\n              MOVE_RAZOR_WIND,\n              MOVE_TAKE_DOWN,\n              MOVE_FALSE_SWIPE),\n\n    egg_moves(NINCADA,\n              MOVE_ENDURE,\n              MOVE_FAINT_ATTACK,\n              MOVE_GUST,\n              MOVE_SILVER_WIND),\n\n    egg_moves(TAILLOW,\n              MOVE_PURSUIT,\n              MOVE_SUPERSONIC,\n              MOVE_REFRESH,\n              MOVE_MIRROR_MOVE,\n              MOVE_RAGE,\n              MOVE_SKY_ATTACK),\n\n    egg_moves(SHROOMISH,\n              MOVE_FAKE_TEARS,\n              MOVE_SWAGGER,\n              MOVE_CHARM,\n              MOVE_FALSE_SWIPE,\n              MOVE_HELPING_HAND),\n\n    egg_moves(SPINDA,\n              MOVE_ENCORE,\n              MOVE_ROCK_SLIDE,\n              MOVE_ASSIST,\n              MOVE_DISABLE,\n              MOVE_BATON_PASS,\n              MOVE_WISH,\n              MOVE_TRICK,\n              MOVE_SMELLING_SALT),\n\n    egg_moves(WINGULL,\n              MOVE_MIST,\n              MOVE_TWISTER,\n              MOVE_AGILITY,\n              MOVE_GUST,\n              MOVE_WATER_SPORT),\n\n    egg_moves(SURSKIT,\n              MOVE_FORESIGHT,\n              MOVE_MUD_SHOT,\n              MOVE_PSYBEAM,\n              MOVE_HYDRO_PUMP,\n              MOVE_MIND_READER),\n\n    egg_moves(WAILMER,\n              MOVE_DOUBLE_EDGE,\n              MOVE_THRASH,\n              MOVE_SWAGGER,\n              MOVE_SNORE,\n              MOVE_SLEEP_TALK,\n              MOVE_CURSE,\n              MOVE_FISSURE,\n              MOVE_TICKLE),\n\n    egg_moves(SKITTY,\n              MOVE_HELPING_HAND,\n              MOVE_PSYCH_UP,\n              MOVE_UPROAR,\n              MOVE_FAKE_TEARS,\n              MOVE_WISH,\n              MOVE_BATON_PASS,\n              MOVE_SUBSTITUTE,\n              MOVE_TICKLE),\n\n    egg_moves(KECLEON,\n              MOVE_DISABLE,\n              MOVE_MAGIC_COAT,\n              MOVE_TRICK),\n\n    egg_moves(NOSEPASS,\n              MOVE_MAGNITUDE,\n              MOVE_ROLLOUT,\n              MOVE_EXPLOSION),\n\n    egg_moves(TORKOAL,\n              MOVE_ERUPTION,\n              MOVE_ENDURE,\n              MOVE_SLEEP_TALK,\n              MOVE_YAWN),\n\n    egg_moves(SABLEYE,\n              MOVE_PSYCH_UP,\n              MOVE_RECOVER,\n              MOVE_MOONLIGHT),\n\n    egg_moves(BARBOACH,\n              MOVE_THRASH,\n              MOVE_WHIRLPOOL,\n              MOVE_SPARK),\n\n    egg_moves(LUVDISC,\n              MOVE_SPLASH,\n              MOVE_SUPERSONIC,\n              MOVE_WATER_SPORT,\n              MOVE_MUD_SPORT),\n\n    egg_moves(CORPHISH,\n              MOVE_MUD_SPORT,\n              MOVE_ENDEAVOR,\n              MOVE_BODY_SLAM,\n              MOVE_ANCIENT_POWER),\n\n    egg_moves(FEEBAS,\n              MOVE_MIRROR_COAT,\n              MOVE_DRAGON_BREATH,\n              MOVE_MUD_SPORT,\n              MOVE_HYPNOSIS,\n              MOVE_LIGHT_SCREEN,\n              MOVE_CONFUSE_RAY),\n\n    egg_moves(CARVANHA,\n              MOVE_HYDRO_PUMP,\n              MOVE_DOUBLE_EDGE,\n              MOVE_THRASH),\n\n    egg_moves(TRAPINCH,\n              MOVE_FOCUS_ENERGY,\n              MOVE_QUICK_ATTACK,\n              MOVE_GUST),\n\n    egg_moves(MAKUHITA,\n              MOVE_FAINT_ATTACK,\n              MOVE_DETECT,\n              MOVE_FORESIGHT,\n              MOVE_HELPING_HAND,\n              MOVE_CROSS_CHOP,\n              MOVE_REVENGE,\n              MOVE_DYNAMIC_PUNCH,\n              MOVE_COUNTER),\n\n    egg_moves(ELECTRIKE,\n              MOVE_CRUNCH,\n              MOVE_HEADBUTT,\n              MOVE_UPROAR,\n              MOVE_CURSE,\n              MOVE_SWIFT),\n\n    egg_moves(NUMEL,\n              MOVE_HOWL,\n              MOVE_SCARY_FACE,\n              MOVE_BODY_SLAM,\n              MOVE_ROLLOUT,\n              MOVE_DEFENSE_CURL,\n              MOVE_STOMP),\n\n    egg_moves(SPHEAL,\n              MOVE_WATER_SPORT,\n              MOVE_STOCKPILE,\n              MOVE_SWALLOW,\n              MOVE_SPIT_UP,\n              MOVE_YAWN,\n              MOVE_ROCK_SLIDE,\n              MOVE_CURSE,\n              MOVE_FISSURE),\n\n    egg_moves(CACNEA,\n              MOVE_GRASS_WHISTLE,\n              MOVE_ACID,\n              MOVE_TEETER_DANCE,\n              MOVE_DYNAMIC_PUNCH,\n              MOVE_COUNTER),\n\n    egg_moves(SNORUNT,\n              MOVE_BLOCK,\n              MOVE_SPIKES),\n\n    egg_moves(AZURILL,\n              MOVE_ENCORE,\n              MOVE_SING,\n              MOVE_REFRESH,\n              MOVE_SLAM,\n              MOVE_TICKLE),\n\n    egg_moves(SPOINK,\n              MOVE_FUTURE_SIGHT,\n              MOVE_EXTRASENSORY,\n              MOVE_SUBSTITUTE,\n              MOVE_TRICK),\n\n    egg_moves(PLUSLE,\n              MOVE_SUBSTITUTE,\n              MOVE_WISH),\n\n    egg_moves(MINUN,\n              MOVE_SUBSTITUTE,\n              MOVE_WISH),\n\n    egg_moves(MAWILE,\n              MOVE_SWORDS_DANCE,\n              MOVE_FALSE_SWIPE,\n              MOVE_POISON_FANG,\n              MOVE_PSYCH_UP,\n              MOVE_ANCIENT_POWER,\n              MOVE_TICKLE),\n\n    egg_moves(MEDITITE,\n              MOVE_FIRE_PUNCH,\n              MOVE_THUNDER_PUNCH,\n              MOVE_ICE_PUNCH,\n              MOVE_FORESIGHT,\n              MOVE_FAKE_OUT,\n              MOVE_BATON_PASS,\n              MOVE_DYNAMIC_PUNCH),\n\n    egg_moves(SWABLU,\n              MOVE_AGILITY,\n              MOVE_HAZE,\n              MOVE_PURSUIT,\n              MOVE_RAGE),\n\n    egg_moves(DUSKULL,\n              MOVE_IMPRISON,\n              MOVE_DESTINY_BOND,\n              MOVE_PAIN_SPLIT,\n              MOVE_GRUDGE,\n              MOVE_MEMENTO,\n              MOVE_FAINT_ATTACK),\n\n    egg_moves(ROSELIA,\n              MOVE_SPIKES,\n              MOVE_SYNTHESIS,\n              MOVE_PIN_MISSILE,\n              MOVE_COTTON_SPORE),\n\n    egg_moves(SLAKOTH,\n              MOVE_PURSUIT,\n              MOVE_SLASH,\n              MOVE_BODY_SLAM,\n              MOVE_SNORE,\n              MOVE_CRUSH_CLAW,\n              MOVE_CURSE,\n              MOVE_SLEEP_TALK),\n\n    egg_moves(GULPIN,\n              MOVE_DREAM_EATER,\n              MOVE_ACID_ARMOR,\n              MOVE_SMOG,\n              MOVE_PAIN_SPLIT),\n\n    egg_moves(TROPIUS,\n              MOVE_HEADBUTT,\n              MOVE_SLAM,\n              MOVE_RAZOR_WIND,\n              MOVE_LEECH_SEED,\n              MOVE_NATURE_POWER),\n\n    egg_moves(WHISMUR,\n              MOVE_TAKE_DOWN,\n              MOVE_SNORE,\n              MOVE_SWAGGER,\n              MOVE_EXTRASENSORY,\n              MOVE_SMELLING_SALT),\n\n    egg_moves(CLAMPERL,\n              MOVE_REFRESH,\n              MOVE_MUD_SPORT,\n              MOVE_BODY_SLAM,\n              MOVE_SUPERSONIC,\n              MOVE_BARRIER,\n              MOVE_CONFUSE_RAY),\n\n    egg_moves(ABSOL,\n              MOVE_BATON_PASS,\n              MOVE_FAINT_ATTACK,\n              MOVE_DOUBLE_EDGE,\n              MOVE_MAGIC_COAT,\n              MOVE_CURSE,\n              MOVE_SUBSTITUTE),\n\n    egg_moves(SHUPPET,\n              MOVE_DISABLE,\n              MOVE_DESTINY_BOND,\n              MOVE_FORESIGHT,\n              MOVE_ASTONISH,\n              MOVE_IMPRISON),\n\n    egg_moves(SEVIPER,\n              MOVE_STOCKPILE,\n              MOVE_SWALLOW,\n              MOVE_SPIT_UP,\n              MOVE_BODY_SLAM),\n\n    egg_moves(ZANGOOSE,\n              MOVE_FLAIL,\n              MOVE_DOUBLE_KICK,\n              MOVE_RAZOR_WIND,\n              MOVE_COUNTER,\n              MOVE_ROAR,\n              MOVE_CURSE),\n\n    egg_moves(RELICANTH,\n              MOVE_MAGNITUDE,\n              MOVE_SKULL_BASH,\n              MOVE_WATER_SPORT,\n              MOVE_AMNESIA,\n              MOVE_SLEEP_TALK,\n              MOVE_ROCK_SLIDE),\n\n    egg_moves(ARON,\n              MOVE_ENDEAVOR,\n              MOVE_BODY_SLAM,\n              MOVE_STOMP,\n              MOVE_SMELLING_SALT),\n\n    egg_moves(CASTFORM,\n              MOVE_FUTURE_SIGHT,\n              MOVE_PSYCH_UP),\n\n    egg_moves(VOLBEAT,\n              MOVE_BATON_PASS,\n              MOVE_SILVER_WIND,\n              MOVE_TRICK),\n\n    egg_moves(ILLUMISE,\n              MOVE_BATON_PASS,\n              MOVE_SILVER_WIND,\n              MOVE_GROWTH),\n\n    egg_moves(LILEEP,\n              MOVE_BARRIER,\n              MOVE_RECOVER,\n              MOVE_MIRROR_COAT,\n              MOVE_ROCK_SLIDE),\n\n    egg_moves(ANORITH,\n              MOVE_RAPID_SPIN,\n              MOVE_KNOCK_OFF,\n              MOVE_SWORDS_DANCE,\n              MOVE_ROCK_SLIDE),\n\n    egg_moves(RALTS,\n              MOVE_DISABLE,\n              MOVE_WILL_O_WISP,\n              MOVE_MEAN_LOOK,\n              MOVE_MEMENTO,\n              MOVE_DESTINY_BOND),\n\n    egg_moves(BAGON,\n              MOVE_HYDRO_PUMP,\n              MOVE_THRASH,\n              MOVE_DRAGON_RAGE,\n              MOVE_TWISTER,\n              MOVE_DRAGON_DANCE),\n\n    egg_moves(CHIMECHO,\n              MOVE_DISABLE,\n              MOVE_CURSE,\n              MOVE_HYPNOSIS,\n              MOVE_DREAM_EATER),\n\n    EGG_MOVES_TERMINATOR\n};\n"
  },
  {
    "path": "src/data/pokemon/evolution.h",
    "content": "const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] =\n{\n    [SPECIES_BULBASAUR]  = {{EVO_LEVEL, 16, SPECIES_IVYSAUR, 0}},\n    [SPECIES_IVYSAUR]    = {{EVO_LEVEL, 32, SPECIES_VENUSAUR, 0}},\n    [SPECIES_CHARMANDER] = {{EVO_LEVEL, 16, SPECIES_CHARMELEON, 0}},\n    [SPECIES_CHARMELEON] = {{EVO_LEVEL, 36, SPECIES_CHARIZARD, 0}},\n    [SPECIES_SQUIRTLE]   = {{EVO_LEVEL, 16, SPECIES_WARTORTLE, 0}},\n    [SPECIES_WARTORTLE]  = {{EVO_LEVEL, 36, SPECIES_BLASTOISE, 0}},\n    [SPECIES_CATERPIE]   = {{EVO_LEVEL,  7, SPECIES_METAPOD, 0}},\n    [SPECIES_METAPOD]    = {{EVO_LEVEL, 10, SPECIES_BUTTERFREE, 0}},\n    [SPECIES_WEEDLE]     = {{EVO_LEVEL,  7, SPECIES_KAKUNA, 0}},\n    [SPECIES_KAKUNA]     = {{EVO_LEVEL, 10, SPECIES_BEEDRILL, 0}},\n    [SPECIES_PIDGEY]     = {{EVO_LEVEL, 18, SPECIES_PIDGEOTTO, 0}},\n    [SPECIES_PIDGEOTTO]  = {{EVO_LEVEL, 36, SPECIES_PIDGEOT, 0}},\n    [SPECIES_RATTATA]    = {{EVO_LEVEL, 20, SPECIES_RATICATE, 0}},\n    [SPECIES_SPEAROW]    = {{EVO_LEVEL, 20, SPECIES_FEAROW, 0}},\n    [SPECIES_EKANS]      = {{EVO_LEVEL, 22, SPECIES_ARBOK, 0}},\n    [SPECIES_PIKACHU]    = {{EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU, 0}},\n    [SPECIES_SANDSHREW]  = {{EVO_LEVEL, 22, SPECIES_SANDSLASH, 0}},\n    [SPECIES_NIDORAN_F]  = {{EVO_LEVEL, 16, SPECIES_NIDORINA, 0}},\n    [SPECIES_NIDORINA]   = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOQUEEN, 0}},\n    [SPECIES_NIDORAN_M]  = {{EVO_LEVEL, 16, SPECIES_NIDORINO, 0}},\n    [SPECIES_NIDORINO]   = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOKING, 0}},\n    [SPECIES_CLEFAIRY]   = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_CLEFABLE, 0}},\n    [SPECIES_VULPIX]     = {{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_NINETALES, 0}},\n    [SPECIES_JIGGLYPUFF] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_WIGGLYTUFF, 0}},\n    [SPECIES_ZUBAT]      = {{EVO_LEVEL, 22, SPECIES_GOLBAT, 0}},\n    [SPECIES_GOLBAT]     = {{EVO_FRIENDSHIP, 0, SPECIES_CROBAT, 0}},\n    [SPECIES_ODDISH]     = {{EVO_LEVEL, 21, SPECIES_GLOOM, 0}},\n    [SPECIES_GLOOM]      = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VILEPLUME, 0},\n                            {EVO_ITEM, ITEM_SUN_STONE, SPECIES_BELLOSSOM, 0}},\n    [SPECIES_PARAS]      = {{EVO_LEVEL, 24, SPECIES_PARASECT, 0}},\n    [SPECIES_VENONAT]    = {{EVO_LEVEL, 31, SPECIES_VENOMOTH, 0}},\n    [SPECIES_DIGLETT]    = {{EVO_LEVEL, 26, SPECIES_DUGTRIO, 0}},\n    [SPECIES_MEOWTH]     = {{EVO_LEVEL, 28, SPECIES_PERSIAN, 0}},\n    [SPECIES_PSYDUCK]    = {{EVO_LEVEL, 33, SPECIES_GOLDUCK, 0}},\n    [SPECIES_MANKEY]     = {{EVO_LEVEL, 28, SPECIES_PRIMEAPE, 0}},\n    [SPECIES_GROWLITHE]  = {{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_ARCANINE, 0}},\n    [SPECIES_POLIWAG]    = {{EVO_LEVEL, 25, SPECIES_POLIWHIRL, 0}},\n    [SPECIES_POLIWHIRL]  = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_POLIWRATH, 0},\n                            {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED, 0},\n                            {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_POLITOED, ITEM_KINGS_ROCK}},\n    [SPECIES_ABRA]       = {{EVO_LEVEL, 16, SPECIES_KADABRA, 0}},\n    [SPECIES_KADABRA]    = {{EVO_TRADE, 0, SPECIES_ALAKAZAM, 0},\n                            {EVO_ITEM, ITEM_LINK_BRACELET, SPECIES_ALAKAZAM, 0}},\n    [SPECIES_MACHOP]     = {{EVO_LEVEL, 28, SPECIES_MACHOKE, 0}},\n    [SPECIES_MACHOKE]    = {{EVO_TRADE, 0, SPECIES_MACHAMP, 0},\n                            {EVO_ITEM, ITEM_LINK_BRACELET, SPECIES_MACHAMP, 0}},\n    [SPECIES_BELLSPROUT] = {{EVO_LEVEL, 21, SPECIES_WEEPINBELL, 0}},\n    [SPECIES_WEEPINBELL] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VICTREEBEL, 0}},\n    [SPECIES_TENTACOOL]  = {{EVO_LEVEL, 30, SPECIES_TENTACRUEL, 0}},\n    [SPECIES_GEODUDE]    = {{EVO_LEVEL, 25, SPECIES_GRAVELER, 0}},\n    [SPECIES_GRAVELER]   = {{EVO_TRADE, 0, SPECIES_GOLEM, 0},\n                            {EVO_ITEM, ITEM_LINK_BRACELET, SPECIES_GOLEM, 0}},\n    [SPECIES_PONYTA]     = {{EVO_LEVEL, 40, SPECIES_RAPIDASH, 0}},\n    [SPECIES_SLOWPOKE]   = {{EVO_LEVEL, 37, SPECIES_SLOWBRO, 0},\n                            {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING, 0},\n                            {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_SLOWKING, ITEM_KINGS_ROCK}},\n    [SPECIES_MAGNEMITE]  = {{EVO_LEVEL, 30, SPECIES_MAGNETON, 0}},\n    [SPECIES_DODUO]      = {{EVO_LEVEL, 31, SPECIES_DODRIO, 0}},\n    [SPECIES_SEEL]       = {{EVO_LEVEL, 34, SPECIES_DEWGONG, 0}},\n    [SPECIES_GRIMER]     = {{EVO_LEVEL, 38, SPECIES_MUK, 0}},\n    [SPECIES_SHELLDER]   = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_CLOYSTER, 0}},\n    [SPECIES_GASTLY]     = {{EVO_LEVEL, 25, SPECIES_HAUNTER, 0}},\n    [SPECIES_HAUNTER]    = {{EVO_TRADE, 0, SPECIES_GENGAR, 0},\n                            {EVO_ITEM, ITEM_LINK_BRACELET, SPECIES_GENGAR, 0}},\n    [SPECIES_ONIX]       = {{EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_STEELIX, 0},\n                            {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_STEELIX, ITEM_METAL_COAT}},\n    [SPECIES_DROWZEE]    = {{EVO_LEVEL, 26, SPECIES_HYPNO, 0}},\n    [SPECIES_KRABBY]     = {{EVO_LEVEL, 28, SPECIES_KINGLER, 0}},\n    [SPECIES_VOLTORB]    = {{EVO_LEVEL, 30, SPECIES_ELECTRODE, 0}},\n    [SPECIES_EXEGGCUTE]  = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR, 0}},\n    [SPECIES_CUBONE]     = {{EVO_LEVEL, 28, SPECIES_MAROWAK, 0}},\n    [SPECIES_KOFFING]    = {{EVO_LEVEL, 35, SPECIES_WEEZING, 0}},\n    [SPECIES_RHYHORN]    = {{EVO_LEVEL, 42, SPECIES_RHYDON, 0}},\n    [SPECIES_CHANSEY]    = {{EVO_FRIENDSHIP, 0, SPECIES_BLISSEY, 0}},\n    [SPECIES_HORSEA]     = {{EVO_LEVEL, 32, SPECIES_SEADRA, 0}},\n    [SPECIES_SEADRA]     = {{EVO_TRADE_ITEM, ITEM_DRAGON_SCALE, SPECIES_KINGDRA, 0},\n                            {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_KINGDRA, ITEM_DRAGON_SCALE}},\n    [SPECIES_GOLDEEN]    = {{EVO_LEVEL, 33, SPECIES_SEAKING, 0}},\n    [SPECIES_STARYU]     = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_STARMIE, 0}},\n    [SPECIES_SCYTHER]    = {{EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR, 0},\n                            {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_SCIZOR, ITEM_METAL_COAT}},\n    [SPECIES_MAGIKARP]   = {{EVO_LEVEL, 20, SPECIES_GYARADOS, 0}},\n    [SPECIES_EEVEE]      = {{EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_JOLTEON, 0},\n                            {EVO_ITEM, ITEM_WATER_STONE, SPECIES_VAPOREON, 0},\n                            {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON, 0},\n                            {EVO_FRIENDSHIP_DAY, 0, SPECIES_ESPEON, 0},\n                            {EVO_FRIENDSHIP_NIGHT, 0, SPECIES_UMBREON, 0}},\n    [SPECIES_PORYGON]    = {{EVO_TRADE_ITEM, ITEM_UP_GRADE, SPECIES_PORYGON2, 0},\n                            {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_PORYGON2, ITEM_UP_GRADE}},\n    [SPECIES_OMANYTE]    = {{EVO_LEVEL, 40, SPECIES_OMASTAR, 0}},\n    [SPECIES_KABUTO]     = {{EVO_LEVEL, 40, SPECIES_KABUTOPS, 0}},\n    [SPECIES_DRATINI]    = {{EVO_LEVEL, 30, SPECIES_DRAGONAIR, 0}},\n    [SPECIES_DRAGONAIR]  = {{EVO_LEVEL, 55, SPECIES_DRAGONITE, 0}},\n    [SPECIES_CHIKORITA]  = {{EVO_LEVEL, 16, SPECIES_BAYLEEF, 0}},\n    [SPECIES_BAYLEEF]    = {{EVO_LEVEL, 32, SPECIES_MEGANIUM, 0}},\n    [SPECIES_CYNDAQUIL]  = {{EVO_LEVEL, 14, SPECIES_QUILAVA, 0}},\n    [SPECIES_QUILAVA]    = {{EVO_LEVEL, 36, SPECIES_TYPHLOSION, 0}},\n    [SPECIES_TOTODILE]   = {{EVO_LEVEL, 18, SPECIES_CROCONAW, 0}},\n    [SPECIES_CROCONAW]   = {{EVO_LEVEL, 30, SPECIES_FERALIGATR, 0}},\n    [SPECIES_SENTRET]    = {{EVO_LEVEL, 15, SPECIES_FURRET, 0}},\n    [SPECIES_HOOTHOOT]   = {{EVO_LEVEL, 20, SPECIES_NOCTOWL, 0}},\n    [SPECIES_LEDYBA]     = {{EVO_LEVEL, 18, SPECIES_LEDIAN, 0}},\n    [SPECIES_SPINARAK]   = {{EVO_LEVEL, 22, SPECIES_ARIADOS, 0}},\n    [SPECIES_CHINCHOU]   = {{EVO_LEVEL, 27, SPECIES_LANTURN, 0}},\n    [SPECIES_PICHU]      = {{EVO_FRIENDSHIP, 0, SPECIES_PIKACHU, 0}},\n    [SPECIES_CLEFFA]     = {{EVO_FRIENDSHIP, 0, SPECIES_CLEFAIRY, 0}},\n    [SPECIES_IGGLYBUFF]  = {{EVO_FRIENDSHIP, 0, SPECIES_JIGGLYPUFF, 0}},\n    [SPECIES_TOGEPI]     = {{EVO_FRIENDSHIP, 0, SPECIES_TOGETIC, 0}},\n    [SPECIES_NATU]       = {{EVO_LEVEL, 25, SPECIES_XATU, 0}},\n    [SPECIES_MAREEP]     = {{EVO_LEVEL, 15, SPECIES_FLAAFFY, 0}},\n    [SPECIES_FLAAFFY]    = {{EVO_LEVEL, 30, SPECIES_AMPHAROS, 0}},\n    [SPECIES_MARILL]     = {{EVO_LEVEL, 18, SPECIES_AZUMARILL, 0}},\n    [SPECIES_HOPPIP]     = {{EVO_LEVEL, 18, SPECIES_SKIPLOOM, 0}},\n    [SPECIES_SKIPLOOM]   = {{EVO_LEVEL, 27, SPECIES_JUMPLUFF, 0}},\n    [SPECIES_SUNKERN]    = {{EVO_ITEM, ITEM_SUN_STONE, SPECIES_SUNFLORA, 0}},\n    [SPECIES_WOOPER]     = {{EVO_LEVEL, 20, SPECIES_QUAGSIRE, 0}},\n    [SPECIES_PINECO]     = {{EVO_LEVEL, 31, SPECIES_FORRETRESS, 0}},\n    [SPECIES_SNUBBULL]   = {{EVO_LEVEL, 23, SPECIES_GRANBULL, 0}},\n    [SPECIES_TEDDIURSA]  = {{EVO_LEVEL, 30, SPECIES_URSARING, 0}},\n    [SPECIES_SLUGMA]     = {{EVO_LEVEL, 38, SPECIES_MAGCARGO, 0}},\n    [SPECIES_SWINUB]     = {{EVO_LEVEL, 33, SPECIES_PILOSWINE, 0}},\n    [SPECIES_REMORAID]   = {{EVO_LEVEL, 25, SPECIES_OCTILLERY, 0}},\n    [SPECIES_HOUNDOUR]   = {{EVO_LEVEL, 24, SPECIES_HOUNDOOM, 0}},\n    [SPECIES_PHANPY]     = {{EVO_LEVEL, 25, SPECIES_DONPHAN, 0}},\n    [SPECIES_TYROGUE]    = {{EVO_LEVEL_ATK_LT_DEF, 20, SPECIES_HITMONCHAN, 0},\n                            {EVO_LEVEL_ATK_GT_DEF, 20, SPECIES_HITMONLEE, 0},\n                            {EVO_LEVEL_ATK_EQ_DEF, 20, SPECIES_HITMONTOP, 0}},\n    [SPECIES_SMOOCHUM]   = {{EVO_LEVEL, 30, SPECIES_JYNX, 0}},\n    [SPECIES_ELEKID]     = {{EVO_LEVEL, 30, SPECIES_ELECTABUZZ, 0}},\n    [SPECIES_MAGBY]      = {{EVO_LEVEL, 30, SPECIES_MAGMAR, 0}},\n    [SPECIES_LARVITAR]   = {{EVO_LEVEL, 30, SPECIES_PUPITAR, 0}},\n    [SPECIES_PUPITAR]    = {{EVO_LEVEL, 55, SPECIES_TYRANITAR, 0}},\n    [SPECIES_TREECKO]    = {{EVO_LEVEL, 16, SPECIES_GROVYLE, 0}},\n    [SPECIES_GROVYLE]    = {{EVO_LEVEL, 36, SPECIES_SCEPTILE, 0}},\n    [SPECIES_TORCHIC]    = {{EVO_LEVEL, 16, SPECIES_COMBUSKEN, 0}},\n    [SPECIES_COMBUSKEN]  = {{EVO_LEVEL, 36, SPECIES_BLAZIKEN, 0}},\n    [SPECIES_MUDKIP]     = {{EVO_LEVEL, 16, SPECIES_MARSHTOMP, 0}},\n    [SPECIES_MARSHTOMP]  = {{EVO_LEVEL, 36, SPECIES_SWAMPERT, 0}},\n    [SPECIES_POOCHYENA]  = {{EVO_LEVEL, 18, SPECIES_MIGHTYENA, 0}},\n    [SPECIES_ZIGZAGOON]  = {{EVO_LEVEL, 20, SPECIES_LINOONE, 0}},\n    [SPECIES_WURMPLE]    = {{EVO_LEVEL_SILCOON, 7, SPECIES_SILCOON, 0},\n                            {EVO_LEVEL_CASCOON, 7, SPECIES_CASCOON, 0}},\n    [SPECIES_SILCOON]    = {{EVO_LEVEL, 10, SPECIES_BEAUTIFLY, 0}},\n    [SPECIES_CASCOON]    = {{EVO_LEVEL, 10, SPECIES_DUSTOX, 0}},\n    [SPECIES_LOTAD]      = {{EVO_LEVEL, 14, SPECIES_LOMBRE, 0}},\n    [SPECIES_LOMBRE]     = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_LUDICOLO, 0}},\n    [SPECIES_SEEDOT]     = {{EVO_LEVEL, 14, SPECIES_NUZLEAF, 0}},\n    [SPECIES_NUZLEAF]    = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_SHIFTRY, 0}},\n    [SPECIES_NINCADA]    = {{EVO_LEVEL_NINJASK, 20, SPECIES_NINJASK, 0},\n                            {EVO_LEVEL_SHEDINJA, 20, SPECIES_SHEDINJA, 0}},\n    [SPECIES_TAILLOW]    = {{EVO_LEVEL, 22, SPECIES_SWELLOW, 0}},\n    [SPECIES_SHROOMISH]  = {{EVO_LEVEL, 23, SPECIES_BRELOOM, 0}},\n    [SPECIES_WINGULL]    = {{EVO_LEVEL, 25, SPECIES_PELIPPER, 0}},\n    [SPECIES_SURSKIT]    = {{EVO_LEVEL, 22, SPECIES_MASQUERAIN, 0}},\n    [SPECIES_WAILMER]    = {{EVO_LEVEL, 40, SPECIES_WAILORD, 0}},\n    [SPECIES_SKITTY]     = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_DELCATTY, 0}},\n    [SPECIES_BALTOY]     = {{EVO_LEVEL, 36, SPECIES_CLAYDOL, 0}},\n    [SPECIES_BARBOACH]   = {{EVO_LEVEL, 30, SPECIES_WHISCASH, 0}},\n    [SPECIES_CORPHISH]   = {{EVO_LEVEL, 30, SPECIES_CRAWDAUNT, 0}},\n    [SPECIES_FEEBAS]     = {{EVO_BEAUTY, 170, SPECIES_MILOTIC, 0}},\n    [SPECIES_CARVANHA]   = {{EVO_LEVEL, 30, SPECIES_SHARPEDO, 0}},\n    [SPECIES_TRAPINCH]   = {{EVO_LEVEL, 35, SPECIES_VIBRAVA, 0}},\n    [SPECIES_VIBRAVA]    = {{EVO_LEVEL, 45, SPECIES_FLYGON, 0}},\n    [SPECIES_MAKUHITA]   = {{EVO_LEVEL, 24, SPECIES_HARIYAMA, 0}},\n    [SPECIES_ELECTRIKE]  = {{EVO_LEVEL, 26, SPECIES_MANECTRIC, 0}},\n    [SPECIES_NUMEL]      = {{EVO_LEVEL, 33, SPECIES_CAMERUPT, 0}},\n    [SPECIES_SPHEAL]     = {{EVO_LEVEL, 32, SPECIES_SEALEO, 0}},\n    [SPECIES_SEALEO]     = {{EVO_LEVEL, 44, SPECIES_WALREIN, 0}},\n    [SPECIES_CACNEA]     = {{EVO_LEVEL, 32, SPECIES_CACTURNE, 0}},\n    [SPECIES_SNORUNT]    = {{EVO_LEVEL, 42, SPECIES_GLALIE, 0}},\n    [SPECIES_AZURILL]    = {{EVO_FRIENDSHIP, 0, SPECIES_MARILL, 0}},\n    [SPECIES_SPOINK]     = {{EVO_LEVEL, 32, SPECIES_GRUMPIG, 0}},\n    [SPECIES_MEDITITE]   = {{EVO_LEVEL, 37, SPECIES_MEDICHAM, 0}},\n    [SPECIES_SWABLU]     = {{EVO_LEVEL, 35, SPECIES_ALTARIA, 0}},\n    [SPECIES_WYNAUT]     = {{EVO_LEVEL, 15, SPECIES_WOBBUFFET, 0}},\n    [SPECIES_DUSKULL]    = {{EVO_LEVEL, 37, SPECIES_DUSCLOPS, 0}},\n    [SPECIES_SLAKOTH]    = {{EVO_LEVEL, 18, SPECIES_VIGOROTH, 0}},\n    [SPECIES_VIGOROTH]   = {{EVO_LEVEL, 36, SPECIES_SLAKING, 0}},\n    [SPECIES_GULPIN]     = {{EVO_LEVEL, 26, SPECIES_SWALOT, 0}},\n    [SPECIES_WHISMUR]    = {{EVO_LEVEL, 20, SPECIES_LOUDRED, 0}},\n    [SPECIES_LOUDRED]    = {{EVO_LEVEL, 40, SPECIES_EXPLOUD, 0}},\n    [SPECIES_CLAMPERL]   = {{EVO_TRADE_ITEM, ITEM_DEEP_SEA_TOOTH, SPECIES_HUNTAIL, 0},\n                            {EVO_TRADE_ITEM, ITEM_DEEP_SEA_SCALE, SPECIES_GOREBYSS, 0},\n                            {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_HUNTAIL, ITEM_DEEP_SEA_TOOTH},\n                            {EVO_STONE_HELD, ITEM_LINK_BRACELET, SPECIES_GOREBYSS, ITEM_DEEP_SEA_SCALE}},\n    [SPECIES_SHUPPET]    = {{EVO_LEVEL, 37, SPECIES_BANETTE, 0}},\n    [SPECIES_ARON]       = {{EVO_LEVEL, 32, SPECIES_LAIRON, 0}},\n    [SPECIES_LAIRON]     = {{EVO_LEVEL, 42, SPECIES_AGGRON, 0}},\n    [SPECIES_LILEEP]     = {{EVO_LEVEL, 40, SPECIES_CRADILY, 0}},\n    [SPECIES_ANORITH]    = {{EVO_LEVEL, 40, SPECIES_ARMALDO, 0}},\n    [SPECIES_RALTS]      = {{EVO_LEVEL, 20, SPECIES_KIRLIA, 0}},\n    [SPECIES_KIRLIA]     = {{EVO_LEVEL, 30, SPECIES_GARDEVOIR, 0}},\n    [SPECIES_BAGON]      = {{EVO_LEVEL, 30, SPECIES_SHELGON, 0}},\n    [SPECIES_SHELGON]    = {{EVO_LEVEL, 50, SPECIES_SALAMENCE, 0}},\n    [SPECIES_BELDUM]     = {{EVO_LEVEL, 20, SPECIES_METANG, 0}},\n    [SPECIES_METANG]     = {{EVO_LEVEL, 45, SPECIES_METAGROSS, 0}},\n};\n"
  },
  {
    "path": "src/data/pokemon/experience_tables.h",
    "content": "#define SQUARE(n)((n) * (n))\n#define CUBE(n)((n) * (n) * (n))\n\n#define EXP_SLOW(n)((5 * CUBE(n)) / 4) // (5 * (n)^3) / 4\n#define EXP_FAST(n)((4 * CUBE(n)) / 5) // (4 * (n)^3) / 5\n#define EXP_MEDIUM_FAST(n)(CUBE(n)) // (n)^3\n#define EXP_MEDIUM_SLOW(n)((6 * CUBE(n)) / 5 - (15 * SQUARE(n)) + (100 * n) - 140)    // (6 * (n)^3) / 5 - (15 * (n)^2) + (100 * n) - 140\n#define EXP_ERRATIC(n)                                      \\\n     (n <= 50) ? ((100 - n) * CUBE(n) /  50)                \\\n    :(n <= 68) ? ((150 - n) * CUBE(n) / 100)                \\\n    :(n <= 98) ? (((1911 - 10 * n) / 3) * CUBE(n) / 500)    \\\n    :            ((160 - n) * CUBE(n) / 100)\n#define EXP_FLUCTUATING(n)                                  \\\n     (n <= 15) ? (((n + 1) / 3 + 24) * CUBE(n) / 50)        \\\n    :(n <= 36) ? ((n + 14)           * CUBE(n) / 50)        \\\n    :            (((n / 2) + 32)     * CUBE(n) / 50)\n\nconst u32 gExperienceTables[][MAX_LEVEL + 1] =\n{\n    { // Medium Fast\n        0, // 0\n        1, // 1\n        EXP_MEDIUM_FAST(2),\n        EXP_MEDIUM_FAST(3),\n        EXP_MEDIUM_FAST(4),\n        EXP_MEDIUM_FAST(5),\n        EXP_MEDIUM_FAST(6),\n        EXP_MEDIUM_FAST(7),\n        EXP_MEDIUM_FAST(8),\n        EXP_MEDIUM_FAST(9),\n        EXP_MEDIUM_FAST(10),\n        EXP_MEDIUM_FAST(11),\n        EXP_MEDIUM_FAST(12),\n        EXP_MEDIUM_FAST(13),\n        EXP_MEDIUM_FAST(14),\n        EXP_MEDIUM_FAST(15),\n        EXP_MEDIUM_FAST(16),\n        EXP_MEDIUM_FAST(17),\n        EXP_MEDIUM_FAST(18),\n        EXP_MEDIUM_FAST(19),\n        EXP_MEDIUM_FAST(20),\n        EXP_MEDIUM_FAST(21),\n        EXP_MEDIUM_FAST(22),\n        EXP_MEDIUM_FAST(23),\n        EXP_MEDIUM_FAST(24),\n        EXP_MEDIUM_FAST(25),\n        EXP_MEDIUM_FAST(26),\n        EXP_MEDIUM_FAST(27),\n        EXP_MEDIUM_FAST(28),\n        EXP_MEDIUM_FAST(29),\n        EXP_MEDIUM_FAST(30),\n        EXP_MEDIUM_FAST(31),\n        EXP_MEDIUM_FAST(32),\n        EXP_MEDIUM_FAST(33),\n        EXP_MEDIUM_FAST(34),\n        EXP_MEDIUM_FAST(35),\n        EXP_MEDIUM_FAST(36),\n        EXP_MEDIUM_FAST(37),\n        EXP_MEDIUM_FAST(38),\n        EXP_MEDIUM_FAST(39),\n        EXP_MEDIUM_FAST(40),\n        EXP_MEDIUM_FAST(41),\n        EXP_MEDIUM_FAST(42),\n        EXP_MEDIUM_FAST(43),\n        EXP_MEDIUM_FAST(44),\n        EXP_MEDIUM_FAST(45),\n        EXP_MEDIUM_FAST(46),\n        EXP_MEDIUM_FAST(47),\n        EXP_MEDIUM_FAST(48),\n        EXP_MEDIUM_FAST(49),\n        EXP_MEDIUM_FAST(50),\n        EXP_MEDIUM_FAST(51),\n        EXP_MEDIUM_FAST(52),\n        EXP_MEDIUM_FAST(53),\n        EXP_MEDIUM_FAST(54),\n        EXP_MEDIUM_FAST(55),\n        EXP_MEDIUM_FAST(56),\n        EXP_MEDIUM_FAST(57),\n        EXP_MEDIUM_FAST(58),\n        EXP_MEDIUM_FAST(59),\n        EXP_MEDIUM_FAST(60),\n        EXP_MEDIUM_FAST(61),\n        EXP_MEDIUM_FAST(62),\n        EXP_MEDIUM_FAST(63),\n        EXP_MEDIUM_FAST(64),\n        EXP_MEDIUM_FAST(65),\n        EXP_MEDIUM_FAST(66),\n        EXP_MEDIUM_FAST(67),\n        EXP_MEDIUM_FAST(68),\n        EXP_MEDIUM_FAST(69),\n        EXP_MEDIUM_FAST(70),\n        EXP_MEDIUM_FAST(71),\n        EXP_MEDIUM_FAST(72),\n        EXP_MEDIUM_FAST(73),\n        EXP_MEDIUM_FAST(74),\n        EXP_MEDIUM_FAST(75),\n        EXP_MEDIUM_FAST(76),\n        EXP_MEDIUM_FAST(77),\n        EXP_MEDIUM_FAST(78),\n        EXP_MEDIUM_FAST(79),\n        EXP_MEDIUM_FAST(80),\n        EXP_MEDIUM_FAST(81),\n        EXP_MEDIUM_FAST(82),\n        EXP_MEDIUM_FAST(83),\n        EXP_MEDIUM_FAST(84),\n        EXP_MEDIUM_FAST(85),\n        EXP_MEDIUM_FAST(86),\n        EXP_MEDIUM_FAST(87),\n        EXP_MEDIUM_FAST(88),\n        EXP_MEDIUM_FAST(89),\n        EXP_MEDIUM_FAST(90),\n        EXP_MEDIUM_FAST(91),\n        EXP_MEDIUM_FAST(92),\n        EXP_MEDIUM_FAST(93),\n        EXP_MEDIUM_FAST(94),\n        EXP_MEDIUM_FAST(95),\n        EXP_MEDIUM_FAST(96),\n        EXP_MEDIUM_FAST(97),\n        EXP_MEDIUM_FAST(98),\n        EXP_MEDIUM_FAST(99),\n        EXP_MEDIUM_FAST(100),\n    },\n    { // Erratic\n        0, // 0\n        1, // 1\n        EXP_ERRATIC(2),\n        EXP_ERRATIC(3),\n        EXP_ERRATIC(4),\n        EXP_ERRATIC(5),\n        EXP_ERRATIC(6),\n        EXP_ERRATIC(7),\n        EXP_ERRATIC(8),\n        EXP_ERRATIC(9),\n        EXP_ERRATIC(10),\n        EXP_ERRATIC(11),\n        EXP_ERRATIC(12),\n        EXP_ERRATIC(13),\n        EXP_ERRATIC(14),\n        EXP_ERRATIC(15),\n        EXP_ERRATIC(16),\n        EXP_ERRATIC(17),\n        EXP_ERRATIC(18),\n        EXP_ERRATIC(19),\n        EXP_ERRATIC(20),\n        EXP_ERRATIC(21),\n        EXP_ERRATIC(22),\n        EXP_ERRATIC(23),\n        EXP_ERRATIC(24),\n        EXP_ERRATIC(25),\n        EXP_ERRATIC(26),\n        EXP_ERRATIC(27),\n        EXP_ERRATIC(28),\n        EXP_ERRATIC(29),\n        EXP_ERRATIC(30),\n        EXP_ERRATIC(31),\n        EXP_ERRATIC(32),\n        EXP_ERRATIC(33),\n        EXP_ERRATIC(34),\n        EXP_ERRATIC(35),\n        EXP_ERRATIC(36),\n        EXP_ERRATIC(37),\n        EXP_ERRATIC(38),\n        EXP_ERRATIC(39),\n        EXP_ERRATIC(40),\n        EXP_ERRATIC(41),\n        EXP_ERRATIC(42),\n        EXP_ERRATIC(43),\n        EXP_ERRATIC(44),\n        EXP_ERRATIC(45),\n        EXP_ERRATIC(46),\n        EXP_ERRATIC(47),\n        EXP_ERRATIC(48),\n        EXP_ERRATIC(49),\n        EXP_ERRATIC(50),\n        EXP_ERRATIC(51),\n        EXP_ERRATIC(52),\n        EXP_ERRATIC(53),\n        EXP_ERRATIC(54),\n        EXP_ERRATIC(55),\n        EXP_ERRATIC(56),\n        EXP_ERRATIC(57),\n        EXP_ERRATIC(58),\n        EXP_ERRATIC(59),\n        EXP_ERRATIC(60),\n        EXP_ERRATIC(61),\n        EXP_ERRATIC(62),\n        EXP_ERRATIC(63),\n        EXP_ERRATIC(64),\n        EXP_ERRATIC(65),\n        EXP_ERRATIC(66),\n        EXP_ERRATIC(67),\n        EXP_ERRATIC(68),\n        EXP_ERRATIC(69),\n        EXP_ERRATIC(70),\n        EXP_ERRATIC(71),\n        EXP_ERRATIC(72),\n        EXP_ERRATIC(73),\n        EXP_ERRATIC(74),\n        EXP_ERRATIC(75),\n        EXP_ERRATIC(76),\n        EXP_ERRATIC(77),\n        EXP_ERRATIC(78),\n        EXP_ERRATIC(79),\n        EXP_ERRATIC(80),\n        EXP_ERRATIC(81),\n        EXP_ERRATIC(82),\n        EXP_ERRATIC(83),\n        EXP_ERRATIC(84),\n        EXP_ERRATIC(85),\n        EXP_ERRATIC(86),\n        EXP_ERRATIC(87),\n        EXP_ERRATIC(88),\n        EXP_ERRATIC(89),\n        EXP_ERRATIC(90),\n        EXP_ERRATIC(91),\n        EXP_ERRATIC(92),\n        EXP_ERRATIC(93),\n        EXP_ERRATIC(94),\n        EXP_ERRATIC(95),\n        EXP_ERRATIC(96),\n        EXP_ERRATIC(97),\n        EXP_ERRATIC(98),\n        EXP_ERRATIC(99),\n        EXP_ERRATIC(100),\n    },\n    { // Fluctuating\n        0, // 0\n        1, // 1\n        EXP_FLUCTUATING(2),\n        EXP_FLUCTUATING(3),\n        EXP_FLUCTUATING(4),\n        EXP_FLUCTUATING(5),\n        EXP_FLUCTUATING(6),\n        EXP_FLUCTUATING(7),\n        EXP_FLUCTUATING(8),\n        EXP_FLUCTUATING(9),\n        EXP_FLUCTUATING(10),\n        EXP_FLUCTUATING(11),\n        EXP_FLUCTUATING(12),\n        EXP_FLUCTUATING(13),\n        EXP_FLUCTUATING(14),\n        EXP_FLUCTUATING(15),\n        EXP_FLUCTUATING(16),\n        EXP_FLUCTUATING(17),\n        EXP_FLUCTUATING(18),\n        EXP_FLUCTUATING(19),\n        EXP_FLUCTUATING(20),\n        EXP_FLUCTUATING(21),\n        EXP_FLUCTUATING(22),\n        EXP_FLUCTUATING(23),\n        EXP_FLUCTUATING(24),\n        EXP_FLUCTUATING(25),\n        EXP_FLUCTUATING(26),\n        EXP_FLUCTUATING(27),\n        EXP_FLUCTUATING(28),\n        EXP_FLUCTUATING(29),\n        EXP_FLUCTUATING(30),\n        EXP_FLUCTUATING(31),\n        EXP_FLUCTUATING(32),\n        EXP_FLUCTUATING(33),\n        EXP_FLUCTUATING(34),\n        EXP_FLUCTUATING(35),\n        EXP_FLUCTUATING(36),\n        EXP_FLUCTUATING(37),\n        EXP_FLUCTUATING(38),\n        EXP_FLUCTUATING(39),\n        EXP_FLUCTUATING(40),\n        EXP_FLUCTUATING(41),\n        EXP_FLUCTUATING(42),\n        EXP_FLUCTUATING(43),\n        EXP_FLUCTUATING(44),\n        EXP_FLUCTUATING(45),\n        EXP_FLUCTUATING(46),\n        EXP_FLUCTUATING(47),\n        EXP_FLUCTUATING(48),\n        EXP_FLUCTUATING(49),\n        EXP_FLUCTUATING(50),\n        EXP_FLUCTUATING(51),\n        EXP_FLUCTUATING(52),\n        EXP_FLUCTUATING(53),\n        EXP_FLUCTUATING(54),\n        EXP_FLUCTUATING(55),\n        EXP_FLUCTUATING(56),\n        EXP_FLUCTUATING(57),\n        EXP_FLUCTUATING(58),\n        EXP_FLUCTUATING(59),\n        EXP_FLUCTUATING(60),\n        EXP_FLUCTUATING(61),\n        EXP_FLUCTUATING(62),\n        EXP_FLUCTUATING(63),\n        EXP_FLUCTUATING(64),\n        EXP_FLUCTUATING(65),\n        EXP_FLUCTUATING(66),\n        EXP_FLUCTUATING(67),\n        EXP_FLUCTUATING(68),\n        EXP_FLUCTUATING(69),\n        EXP_FLUCTUATING(70),\n        EXP_FLUCTUATING(71),\n        EXP_FLUCTUATING(72),\n        EXP_FLUCTUATING(73),\n        EXP_FLUCTUATING(74),\n        EXP_FLUCTUATING(75),\n        EXP_FLUCTUATING(76),\n        EXP_FLUCTUATING(77),\n        EXP_FLUCTUATING(78),\n        EXP_FLUCTUATING(79),\n        EXP_FLUCTUATING(80),\n        EXP_FLUCTUATING(81),\n        EXP_FLUCTUATING(82),\n        EXP_FLUCTUATING(83),\n        EXP_FLUCTUATING(84),\n        EXP_FLUCTUATING(85),\n        EXP_FLUCTUATING(86),\n        EXP_FLUCTUATING(87),\n        EXP_FLUCTUATING(88),\n        EXP_FLUCTUATING(89),\n        EXP_FLUCTUATING(90),\n        EXP_FLUCTUATING(91),\n        EXP_FLUCTUATING(92),\n        EXP_FLUCTUATING(93),\n        EXP_FLUCTUATING(94),\n        EXP_FLUCTUATING(95),\n        EXP_FLUCTUATING(96),\n        EXP_FLUCTUATING(97),\n        EXP_FLUCTUATING(98),\n        EXP_FLUCTUATING(99),\n        EXP_FLUCTUATING(100),\n    },\n    { // Medium Slow\n        0, // 0\n        1, // 1\n        EXP_MEDIUM_SLOW(2),\n        EXP_MEDIUM_SLOW(3),\n        EXP_MEDIUM_SLOW(4),\n        EXP_MEDIUM_SLOW(5),\n        EXP_MEDIUM_SLOW(6),\n        EXP_MEDIUM_SLOW(7),\n        EXP_MEDIUM_SLOW(8),\n        EXP_MEDIUM_SLOW(9),\n        EXP_MEDIUM_SLOW(10),\n        EXP_MEDIUM_SLOW(11),\n        EXP_MEDIUM_SLOW(12),\n        EXP_MEDIUM_SLOW(13),\n        EXP_MEDIUM_SLOW(14),\n        EXP_MEDIUM_SLOW(15),\n        EXP_MEDIUM_SLOW(16),\n        EXP_MEDIUM_SLOW(17),\n        EXP_MEDIUM_SLOW(18),\n        EXP_MEDIUM_SLOW(19),\n        EXP_MEDIUM_SLOW(20),\n        EXP_MEDIUM_SLOW(21),\n        EXP_MEDIUM_SLOW(22),\n        EXP_MEDIUM_SLOW(23),\n        EXP_MEDIUM_SLOW(24),\n        EXP_MEDIUM_SLOW(25),\n        EXP_MEDIUM_SLOW(26),\n        EXP_MEDIUM_SLOW(27),\n        EXP_MEDIUM_SLOW(28),\n        EXP_MEDIUM_SLOW(29),\n        EXP_MEDIUM_SLOW(30),\n        EXP_MEDIUM_SLOW(31),\n        EXP_MEDIUM_SLOW(32),\n        EXP_MEDIUM_SLOW(33),\n        EXP_MEDIUM_SLOW(34),\n        EXP_MEDIUM_SLOW(35),\n        EXP_MEDIUM_SLOW(36),\n        EXP_MEDIUM_SLOW(37),\n        EXP_MEDIUM_SLOW(38),\n        EXP_MEDIUM_SLOW(39),\n        EXP_MEDIUM_SLOW(40),\n        EXP_MEDIUM_SLOW(41),\n        EXP_MEDIUM_SLOW(42),\n        EXP_MEDIUM_SLOW(43),\n        EXP_MEDIUM_SLOW(44),\n        EXP_MEDIUM_SLOW(45),\n        EXP_MEDIUM_SLOW(46),\n        EXP_MEDIUM_SLOW(47),\n        EXP_MEDIUM_SLOW(48),\n        EXP_MEDIUM_SLOW(49),\n        EXP_MEDIUM_SLOW(50),\n        EXP_MEDIUM_SLOW(51),\n        EXP_MEDIUM_SLOW(52),\n        EXP_MEDIUM_SLOW(53),\n        EXP_MEDIUM_SLOW(54),\n        EXP_MEDIUM_SLOW(55),\n        EXP_MEDIUM_SLOW(56),\n        EXP_MEDIUM_SLOW(57),\n        EXP_MEDIUM_SLOW(58),\n        EXP_MEDIUM_SLOW(59),\n        EXP_MEDIUM_SLOW(60),\n        EXP_MEDIUM_SLOW(61),\n        EXP_MEDIUM_SLOW(62),\n        EXP_MEDIUM_SLOW(63),\n        EXP_MEDIUM_SLOW(64),\n        EXP_MEDIUM_SLOW(65),\n        EXP_MEDIUM_SLOW(66),\n        EXP_MEDIUM_SLOW(67),\n        EXP_MEDIUM_SLOW(68),\n        EXP_MEDIUM_SLOW(69),\n        EXP_MEDIUM_SLOW(70),\n        EXP_MEDIUM_SLOW(71),\n        EXP_MEDIUM_SLOW(72),\n        EXP_MEDIUM_SLOW(73),\n        EXP_MEDIUM_SLOW(74),\n        EXP_MEDIUM_SLOW(75),\n        EXP_MEDIUM_SLOW(76),\n        EXP_MEDIUM_SLOW(77),\n        EXP_MEDIUM_SLOW(78),\n        EXP_MEDIUM_SLOW(79),\n        EXP_MEDIUM_SLOW(80),\n        EXP_MEDIUM_SLOW(81),\n        EXP_MEDIUM_SLOW(82),\n        EXP_MEDIUM_SLOW(83),\n        EXP_MEDIUM_SLOW(84),\n        EXP_MEDIUM_SLOW(85),\n        EXP_MEDIUM_SLOW(86),\n        EXP_MEDIUM_SLOW(87),\n        EXP_MEDIUM_SLOW(88),\n        EXP_MEDIUM_SLOW(89),\n        EXP_MEDIUM_SLOW(90),\n        EXP_MEDIUM_SLOW(91),\n        EXP_MEDIUM_SLOW(92),\n        EXP_MEDIUM_SLOW(93),\n        EXP_MEDIUM_SLOW(94),\n        EXP_MEDIUM_SLOW(95),\n        EXP_MEDIUM_SLOW(96),\n        EXP_MEDIUM_SLOW(97),\n        EXP_MEDIUM_SLOW(98),\n        EXP_MEDIUM_SLOW(99),\n        EXP_MEDIUM_SLOW(100),\n    },\n    { // Fast\n        0, // 0\n        1, // 1\n        EXP_FAST(2),\n        EXP_FAST(3),\n        EXP_FAST(4),\n        EXP_FAST(5),\n        EXP_FAST(6),\n        EXP_FAST(7),\n        EXP_FAST(8),\n        EXP_FAST(9),\n        EXP_FAST(10),\n        EXP_FAST(11),\n        EXP_FAST(12),\n        EXP_FAST(13),\n        EXP_FAST(14),\n        EXP_FAST(15),\n        EXP_FAST(16),\n        EXP_FAST(17),\n        EXP_FAST(18),\n        EXP_FAST(19),\n        EXP_FAST(20),\n        EXP_FAST(21),\n        EXP_FAST(22),\n        EXP_FAST(23),\n        EXP_FAST(24),\n        EXP_FAST(25),\n        EXP_FAST(26),\n        EXP_FAST(27),\n        EXP_FAST(28),\n        EXP_FAST(29),\n        EXP_FAST(30),\n        EXP_FAST(31),\n        EXP_FAST(32),\n        EXP_FAST(33),\n        EXP_FAST(34),\n        EXP_FAST(35),\n        EXP_FAST(36),\n        EXP_FAST(37),\n        EXP_FAST(38),\n        EXP_FAST(39),\n        EXP_FAST(40),\n        EXP_FAST(41),\n        EXP_FAST(42),\n        EXP_FAST(43),\n        EXP_FAST(44),\n        EXP_FAST(45),\n        EXP_FAST(46),\n        EXP_FAST(47),\n        EXP_FAST(48),\n        EXP_FAST(49),\n        EXP_FAST(50),\n        EXP_FAST(51),\n        EXP_FAST(52),\n        EXP_FAST(53),\n        EXP_FAST(54),\n        EXP_FAST(55),\n        EXP_FAST(56),\n        EXP_FAST(57),\n        EXP_FAST(58),\n        EXP_FAST(59),\n        EXP_FAST(60),\n        EXP_FAST(61),\n        EXP_FAST(62),\n        EXP_FAST(63),\n        EXP_FAST(64),\n        EXP_FAST(65),\n        EXP_FAST(66),\n        EXP_FAST(67),\n        EXP_FAST(68),\n        EXP_FAST(69),\n        EXP_FAST(70),\n        EXP_FAST(71),\n        EXP_FAST(72),\n        EXP_FAST(73),\n        EXP_FAST(74),\n        EXP_FAST(75),\n        EXP_FAST(76),\n        EXP_FAST(77),\n        EXP_FAST(78),\n        EXP_FAST(79),\n        EXP_FAST(80),\n        EXP_FAST(81),\n        EXP_FAST(82),\n        EXP_FAST(83),\n        EXP_FAST(84),\n        EXP_FAST(85),\n        EXP_FAST(86),\n        EXP_FAST(87),\n        EXP_FAST(88),\n        EXP_FAST(89),\n        EXP_FAST(90),\n        EXP_FAST(91),\n        EXP_FAST(92),\n        EXP_FAST(93),\n        EXP_FAST(94),\n        EXP_FAST(95),\n        EXP_FAST(96),\n        EXP_FAST(97),\n        EXP_FAST(98),\n        EXP_FAST(99),\n        EXP_FAST(100),\n    },\n    { // Slow\n        0, // 0\n        1, // 1\n        EXP_SLOW(2),\n        EXP_SLOW(3),\n        EXP_SLOW(4),\n        EXP_SLOW(5),\n        EXP_SLOW(6),\n        EXP_SLOW(7),\n        EXP_SLOW(8),\n        EXP_SLOW(9),\n        EXP_SLOW(10),\n        EXP_SLOW(11),\n        EXP_SLOW(12),\n        EXP_SLOW(13),\n        EXP_SLOW(14),\n        EXP_SLOW(15),\n        EXP_SLOW(16),\n        EXP_SLOW(17),\n        EXP_SLOW(18),\n        EXP_SLOW(19),\n        EXP_SLOW(20),\n        EXP_SLOW(21),\n        EXP_SLOW(22),\n        EXP_SLOW(23),\n        EXP_SLOW(24),\n        EXP_SLOW(25),\n        EXP_SLOW(26),\n        EXP_SLOW(27),\n        EXP_SLOW(28),\n        EXP_SLOW(29),\n        EXP_SLOW(30),\n        EXP_SLOW(31),\n        EXP_SLOW(32),\n        EXP_SLOW(33),\n        EXP_SLOW(34),\n        EXP_SLOW(35),\n        EXP_SLOW(36),\n        EXP_SLOW(37),\n        EXP_SLOW(38),\n        EXP_SLOW(39),\n        EXP_SLOW(40),\n        EXP_SLOW(41),\n        EXP_SLOW(42),\n        EXP_SLOW(43),\n        EXP_SLOW(44),\n        EXP_SLOW(45),\n        EXP_SLOW(46),\n        EXP_SLOW(47),\n        EXP_SLOW(48),\n        EXP_SLOW(49),\n        EXP_SLOW(50),\n        EXP_SLOW(51),\n        EXP_SLOW(52),\n        EXP_SLOW(53),\n        EXP_SLOW(54),\n        EXP_SLOW(55),\n        EXP_SLOW(56),\n        EXP_SLOW(57),\n        EXP_SLOW(58),\n        EXP_SLOW(59),\n        EXP_SLOW(60),\n        EXP_SLOW(61),\n        EXP_SLOW(62),\n        EXP_SLOW(63),\n        EXP_SLOW(64),\n        EXP_SLOW(65),\n        EXP_SLOW(66),\n        EXP_SLOW(67),\n        EXP_SLOW(68),\n        EXP_SLOW(69),\n        EXP_SLOW(70),\n        EXP_SLOW(71),\n        EXP_SLOW(72),\n        EXP_SLOW(73),\n        EXP_SLOW(74),\n        EXP_SLOW(75),\n        EXP_SLOW(76),\n        EXP_SLOW(77),\n        EXP_SLOW(78),\n        EXP_SLOW(79),\n        EXP_SLOW(80),\n        EXP_SLOW(81),\n        EXP_SLOW(82),\n        EXP_SLOW(83),\n        EXP_SLOW(84),\n        EXP_SLOW(85),\n        EXP_SLOW(86),\n        EXP_SLOW(87),\n        EXP_SLOW(88),\n        EXP_SLOW(89),\n        EXP_SLOW(90),\n        EXP_SLOW(91),\n        EXP_SLOW(92),\n        EXP_SLOW(93),\n        EXP_SLOW(94),\n        EXP_SLOW(95),\n        EXP_SLOW(96),\n        EXP_SLOW(97),\n        EXP_SLOW(98),\n        EXP_SLOW(99),\n        EXP_SLOW(100),\n    },\n    { // Medium Fast copy 2 (unused? to-do: investigate)\n        0, // 0\n        1, // 1\n        EXP_MEDIUM_FAST(2),\n        EXP_MEDIUM_FAST(3),\n        EXP_MEDIUM_FAST(4),\n        EXP_MEDIUM_FAST(5),\n        EXP_MEDIUM_FAST(6),\n        EXP_MEDIUM_FAST(7),\n        EXP_MEDIUM_FAST(8),\n        EXP_MEDIUM_FAST(9),\n        EXP_MEDIUM_FAST(10),\n        EXP_MEDIUM_FAST(11),\n        EXP_MEDIUM_FAST(12),\n        EXP_MEDIUM_FAST(13),\n        EXP_MEDIUM_FAST(14),\n        EXP_MEDIUM_FAST(15),\n        EXP_MEDIUM_FAST(16),\n        EXP_MEDIUM_FAST(17),\n        EXP_MEDIUM_FAST(18),\n        EXP_MEDIUM_FAST(19),\n        EXP_MEDIUM_FAST(20),\n        EXP_MEDIUM_FAST(21),\n        EXP_MEDIUM_FAST(22),\n        EXP_MEDIUM_FAST(23),\n        EXP_MEDIUM_FAST(24),\n        EXP_MEDIUM_FAST(25),\n        EXP_MEDIUM_FAST(26),\n        EXP_MEDIUM_FAST(27),\n        EXP_MEDIUM_FAST(28),\n        EXP_MEDIUM_FAST(29),\n        EXP_MEDIUM_FAST(30),\n        EXP_MEDIUM_FAST(31),\n        EXP_MEDIUM_FAST(32),\n        EXP_MEDIUM_FAST(33),\n        EXP_MEDIUM_FAST(34),\n        EXP_MEDIUM_FAST(35),\n        EXP_MEDIUM_FAST(36),\n        EXP_MEDIUM_FAST(37),\n        EXP_MEDIUM_FAST(38),\n        EXP_MEDIUM_FAST(39),\n        EXP_MEDIUM_FAST(40),\n        EXP_MEDIUM_FAST(41),\n        EXP_MEDIUM_FAST(42),\n        EXP_MEDIUM_FAST(43),\n        EXP_MEDIUM_FAST(44),\n        EXP_MEDIUM_FAST(45),\n        EXP_MEDIUM_FAST(46),\n        EXP_MEDIUM_FAST(47),\n        EXP_MEDIUM_FAST(48),\n        EXP_MEDIUM_FAST(49),\n        EXP_MEDIUM_FAST(50),\n        EXP_MEDIUM_FAST(51),\n        EXP_MEDIUM_FAST(52),\n        EXP_MEDIUM_FAST(53),\n        EXP_MEDIUM_FAST(54),\n        EXP_MEDIUM_FAST(55),\n        EXP_MEDIUM_FAST(56),\n        EXP_MEDIUM_FAST(57),\n        EXP_MEDIUM_FAST(58),\n        EXP_MEDIUM_FAST(59),\n        EXP_MEDIUM_FAST(60),\n        EXP_MEDIUM_FAST(61),\n        EXP_MEDIUM_FAST(62),\n        EXP_MEDIUM_FAST(63),\n        EXP_MEDIUM_FAST(64),\n        EXP_MEDIUM_FAST(65),\n        EXP_MEDIUM_FAST(66),\n        EXP_MEDIUM_FAST(67),\n        EXP_MEDIUM_FAST(68),\n        EXP_MEDIUM_FAST(69),\n        EXP_MEDIUM_FAST(70),\n        EXP_MEDIUM_FAST(71),\n        EXP_MEDIUM_FAST(72),\n        EXP_MEDIUM_FAST(73),\n        EXP_MEDIUM_FAST(74),\n        EXP_MEDIUM_FAST(75),\n        EXP_MEDIUM_FAST(76),\n        EXP_MEDIUM_FAST(77),\n        EXP_MEDIUM_FAST(78),\n        EXP_MEDIUM_FAST(79),\n        EXP_MEDIUM_FAST(80),\n        EXP_MEDIUM_FAST(81),\n        EXP_MEDIUM_FAST(82),\n        EXP_MEDIUM_FAST(83),\n        EXP_MEDIUM_FAST(84),\n        EXP_MEDIUM_FAST(85),\n        EXP_MEDIUM_FAST(86),\n        EXP_MEDIUM_FAST(87),\n        EXP_MEDIUM_FAST(88),\n        EXP_MEDIUM_FAST(89),\n        EXP_MEDIUM_FAST(90),\n        EXP_MEDIUM_FAST(91),\n        EXP_MEDIUM_FAST(92),\n        EXP_MEDIUM_FAST(93),\n        EXP_MEDIUM_FAST(94),\n        EXP_MEDIUM_FAST(95),\n        EXP_MEDIUM_FAST(96),\n        EXP_MEDIUM_FAST(97),\n        EXP_MEDIUM_FAST(98),\n        EXP_MEDIUM_FAST(99),\n        EXP_MEDIUM_FAST(100),\n    },\n    { // Medium Fast copy 3 (unused? to-do: investigate)\n        0, // 0\n        1, // 1\n        EXP_MEDIUM_FAST(2),\n        EXP_MEDIUM_FAST(3),\n        EXP_MEDIUM_FAST(4),\n        EXP_MEDIUM_FAST(5),\n        EXP_MEDIUM_FAST(6),\n        EXP_MEDIUM_FAST(7),\n        EXP_MEDIUM_FAST(8),\n        EXP_MEDIUM_FAST(9),\n        EXP_MEDIUM_FAST(10),\n        EXP_MEDIUM_FAST(11),\n        EXP_MEDIUM_FAST(12),\n        EXP_MEDIUM_FAST(13),\n        EXP_MEDIUM_FAST(14),\n        EXP_MEDIUM_FAST(15),\n        EXP_MEDIUM_FAST(16),\n        EXP_MEDIUM_FAST(17),\n        EXP_MEDIUM_FAST(18),\n        EXP_MEDIUM_FAST(19),\n        EXP_MEDIUM_FAST(20),\n        EXP_MEDIUM_FAST(21),\n        EXP_MEDIUM_FAST(22),\n        EXP_MEDIUM_FAST(23),\n        EXP_MEDIUM_FAST(24),\n        EXP_MEDIUM_FAST(25),\n        EXP_MEDIUM_FAST(26),\n        EXP_MEDIUM_FAST(27),\n        EXP_MEDIUM_FAST(28),\n        EXP_MEDIUM_FAST(29),\n        EXP_MEDIUM_FAST(30),\n        EXP_MEDIUM_FAST(31),\n        EXP_MEDIUM_FAST(32),\n        EXP_MEDIUM_FAST(33),\n        EXP_MEDIUM_FAST(34),\n        EXP_MEDIUM_FAST(35),\n        EXP_MEDIUM_FAST(36),\n        EXP_MEDIUM_FAST(37),\n        EXP_MEDIUM_FAST(38),\n        EXP_MEDIUM_FAST(39),\n        EXP_MEDIUM_FAST(40),\n        EXP_MEDIUM_FAST(41),\n        EXP_MEDIUM_FAST(42),\n        EXP_MEDIUM_FAST(43),\n        EXP_MEDIUM_FAST(44),\n        EXP_MEDIUM_FAST(45),\n        EXP_MEDIUM_FAST(46),\n        EXP_MEDIUM_FAST(47),\n        EXP_MEDIUM_FAST(48),\n        EXP_MEDIUM_FAST(49),\n        EXP_MEDIUM_FAST(50),\n        EXP_MEDIUM_FAST(51),\n        EXP_MEDIUM_FAST(52),\n        EXP_MEDIUM_FAST(53),\n        EXP_MEDIUM_FAST(54),\n        EXP_MEDIUM_FAST(55),\n        EXP_MEDIUM_FAST(56),\n        EXP_MEDIUM_FAST(57),\n        EXP_MEDIUM_FAST(58),\n        EXP_MEDIUM_FAST(59),\n        EXP_MEDIUM_FAST(60),\n        EXP_MEDIUM_FAST(61),\n        EXP_MEDIUM_FAST(62),\n        EXP_MEDIUM_FAST(63),\n        EXP_MEDIUM_FAST(64),\n        EXP_MEDIUM_FAST(65),\n        EXP_MEDIUM_FAST(66),\n        EXP_MEDIUM_FAST(67),\n        EXP_MEDIUM_FAST(68),\n        EXP_MEDIUM_FAST(69),\n        EXP_MEDIUM_FAST(70),\n        EXP_MEDIUM_FAST(71),\n        EXP_MEDIUM_FAST(72),\n        EXP_MEDIUM_FAST(73),\n        EXP_MEDIUM_FAST(74),\n        EXP_MEDIUM_FAST(75),\n        EXP_MEDIUM_FAST(76),\n        EXP_MEDIUM_FAST(77),\n        EXP_MEDIUM_FAST(78),\n        EXP_MEDIUM_FAST(79),\n        EXP_MEDIUM_FAST(80),\n        EXP_MEDIUM_FAST(81),\n        EXP_MEDIUM_FAST(82),\n        EXP_MEDIUM_FAST(83),\n        EXP_MEDIUM_FAST(84),\n        EXP_MEDIUM_FAST(85),\n        EXP_MEDIUM_FAST(86),\n        EXP_MEDIUM_FAST(87),\n        EXP_MEDIUM_FAST(88),\n        EXP_MEDIUM_FAST(89),\n        EXP_MEDIUM_FAST(90),\n        EXP_MEDIUM_FAST(91),\n        EXP_MEDIUM_FAST(92),\n        EXP_MEDIUM_FAST(93),\n        EXP_MEDIUM_FAST(94),\n        EXP_MEDIUM_FAST(95),\n        EXP_MEDIUM_FAST(96),\n        EXP_MEDIUM_FAST(97),\n        EXP_MEDIUM_FAST(98),\n        EXP_MEDIUM_FAST(99),\n        EXP_MEDIUM_FAST(100),\n    }\n};\n"
  },
  {
    "path": "src/data/pokemon/item_effects.h",
    "content": "static const u8 sItemEffect_Potion[7] = {\n    [4] = ITEM4_HEAL_HP,\n    [6] = 20, // Amount of HP to recover\n};\n\nstatic const u8 sItemEffect_Antidote[6] = {\n    [3] = ITEM3_POISON,\n};\n\nstatic const u8 sItemEffect_BurnHeal[6] = {\n    [3] = ITEM3_BURN,\n};\n\nstatic const u8 sItemEffect_IceHeal[6] = {\n    [3] = ITEM3_FREEZE,\n};\n\nstatic const u8 sItemEffect_Awakening[6] = {\n    [3] = ITEM3_SLEEP,\n};\n\nstatic const u8 sItemEffect_ParalyzeHeal[6] = {\n    [3] = ITEM3_PARALYSIS,\n};\n\nstatic const u8 sItemEffect_FullRestore[7] = {\n    [3] = ITEM3_STATUS_ALL,\n    [4] = ITEM4_HEAL_HP,\n    [6] = ITEM6_HEAL_HP_FULL,\n};\n\nstatic const u8 sItemEffect_MaxPotion[7] = {\n    [4] = ITEM4_HEAL_HP,\n    [6] = ITEM6_HEAL_HP_FULL,\n};\n\nstatic const u8 sItemEffect_HyperPotion[7] = {\n    [4] = ITEM4_HEAL_HP,\n    [6] = 200, // Amount of HP to recover\n};\n\nstatic const u8 sItemEffect_SuperPotion[7] = {\n    [4] = ITEM4_HEAL_HP,\n    [6] = 50, // Amount of HP to recover\n};\n\nstatic const u8 sItemEffect_FullHeal[6] = {\n    [3] = ITEM3_STATUS_ALL,\n};\n\nstatic const u8 sItemEffect_Revive[7] = {\n    [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,\n    [6] = ITEM6_HEAL_HP_HALF,\n};\n\nstatic const u8 sItemEffect_MaxRevive[7] = {\n    [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,\n    [6] = ITEM6_HEAL_HP_FULL,\n};\n\nstatic const u8 sItemEffect_FreshWater[7] = {\n    [4] = ITEM4_HEAL_HP,\n    [6] = 50, // Amount of HP to recover\n};\n\nstatic const u8 sItemEffect_SodaPop[7] = {\n    [4] = ITEM4_HEAL_HP,\n    [6] = 60, // Amount of HP to recover\n};\n\nstatic const u8 sItemEffect_Lemonade[7] = {\n    [4] = ITEM4_HEAL_HP,\n    [6] = 80, // Amount of HP to recover\n};\n\nstatic const u8 sItemEffect_MoomooMilk[7] = {\n    [4] = ITEM4_HEAL_HP,\n    [6] = 100, // Amount of HP to recover\n};\n\nstatic const u8 sItemEffect_EnergyPowder[10] = {\n    [4] = ITEM4_HEAL_HP,\n    [5] = ITEM5_FRIENDSHIP_ALL,\n    [6] = 50,  // Amount of HP to recover\n    [7] = -5,  // Friendship change, low\n    [8] = -5,  // Friendship change, mid\n    [9] = -10, // Friendship change, high\n};\n\nstatic const u8 sItemEffect_EnergyRoot[10] = {\n    [4] = ITEM4_HEAL_HP,\n    [5] = ITEM5_FRIENDSHIP_ALL,\n    [6] = 200, // Amount of HP to recover\n    [7] = -10, // Friendship change, low\n    [8] = -10, // Friendship change, mid\n    [9] = -15, // Friendship change, high\n};\n\nstatic const u8 sItemEffect_HealPowder[9] = {\n    [3] = ITEM3_STATUS_ALL,\n    [5] = ITEM5_FRIENDSHIP_ALL,\n    [6] = -5,  // Friendship change, low\n    [7] = -5,  // Friendship change, mid\n    [8] = -10, // Friendship change, high\n};\n\nstatic const u8 sItemEffect_RevivalHerb[10] = {\n    [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,\n    [5] = ITEM5_FRIENDSHIP_ALL,\n    [6] = ITEM6_HEAL_HP_FULL,\n    [7] = -15, // Friendship change, low\n    [8] = -15, // Friendship change, mid\n    [9] = -20, // Friendship change, high\n};\n\nstatic const u8 sItemEffect_Ether[7] = {\n    [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL,\n    [6] = 10, // Amount of PP to recover\n};\n\nstatic const u8 sItemEffect_MaxEther[7] = {\n    [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL,\n    [6] = ITEM6_HEAL_PP_FULL,\n};\n\nstatic const u8 sItemEffect_Elixir[7] = {\n    [4] = ITEM4_HEAL_PP_ALL,\n    [6] = 10, // Amount of PP to recover\n};\n\nstatic const u8 sItemEffect_MaxElixir[7] = {\n    [4] = ITEM4_HEAL_PP_ALL,\n    [6] = ITEM6_HEAL_PP_FULL,\n};\n\nstatic const u8 sItemEffect_LavaCookie[6] = {\n    [3] = ITEM3_STATUS_ALL,\n};\n\nstatic const u8 sItemEffect_BlueFlute[6] = {\n    [3] = ITEM3_SLEEP,\n};\n\nstatic const u8 sItemEffect_YellowFlute[6] = {\n    [3] = ITEM3_CONFUSION,\n};\n\nstatic const u8 sItemEffect_RedFlute[6] = {\n    [0] = ITEM0_INFATUATION,\n};\n\nstatic const u8 sItemEffect_BerryJuice[7] = {\n    [4] = ITEM4_HEAL_HP,\n    [6] = 20, // Amount of HP to recover\n};\n\nstatic const u8 sItemEffect_SacredAsh[7] = {\n    [0] = ITEM0_SACRED_ASH,\n    [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,\n    [6] = ITEM6_HEAL_HP_FULL,\n};\n\n#define VITAMIN_FRIENDSHIP_CHANGE(i)             \\\n    [(i) + 0] = 5, /* Friendship change, low */  \\\n    [(i) + 1] = 3, /* Friendship change, mid */  \\\n    [(i) + 2] = 2  /* Friendship change, high */\n\nstatic const u8 sItemEffect_HPUp[10] = {\n    [4] = ITEM4_EV_HP,\n    [5] = ITEM5_FRIENDSHIP_ALL,\n    [6] = ITEM6_ADD_EV,\n    VITAMIN_FRIENDSHIP_CHANGE(7),\n};\n\nstatic const u8 sItemEffect_Protein[10] = {\n    [4] = ITEM4_EV_ATK,\n    [5] = ITEM5_FRIENDSHIP_ALL,\n    [6] = ITEM6_ADD_EV,\n    VITAMIN_FRIENDSHIP_CHANGE(7),\n};\n\nstatic const u8 sItemEffect_Iron[10] = {\n    [5] = ITEM5_EV_DEF | ITEM5_FRIENDSHIP_ALL,\n    [6] = ITEM6_ADD_EV,\n    VITAMIN_FRIENDSHIP_CHANGE(7),\n};\n\nstatic const u8 sItemEffect_Carbos[10] = {\n    [5] = ITEM5_EV_SPEED | ITEM5_FRIENDSHIP_ALL,\n    [6] = ITEM6_ADD_EV,\n    VITAMIN_FRIENDSHIP_CHANGE(7),\n};\n\nstatic const u8 sItemEffect_Calcium[10] = {\n    [5] = ITEM5_EV_SPATK | ITEM5_FRIENDSHIP_ALL,\n    [6] = ITEM6_ADD_EV,\n    VITAMIN_FRIENDSHIP_CHANGE(7),\n};\n\nstatic const u8 sItemEffect_RareCandy[10] = {\n    [3] = ITEM3_LEVEL_UP,\n    [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,\n    [5] = ITEM5_FRIENDSHIP_ALL,\n    [6] = ITEM6_HEAL_HP_LVL_UP,\n    VITAMIN_FRIENDSHIP_CHANGE(7),\n};\n\nstatic const u8 sItemEffect_PPUp[9] = {\n    [4] = ITEM4_PP_UP,\n    [5] = ITEM5_FRIENDSHIP_ALL,\n    VITAMIN_FRIENDSHIP_CHANGE(6),\n};\n\nstatic const u8 sItemEffect_Zinc[10] = {\n    [5] = ITEM5_EV_SPDEF | ITEM5_FRIENDSHIP_ALL,\n    [6] = ITEM6_ADD_EV,\n    VITAMIN_FRIENDSHIP_CHANGE(7),\n};\n\nstatic const u8 sItemEffect_PPMax[9] = {\n    [5] = ITEM5_PP_MAX | ITEM5_FRIENDSHIP_ALL,\n    VITAMIN_FRIENDSHIP_CHANGE(6),\n};\n\n#define STAT_BOOST_FRIENDSHIP_CHANGE      \\\n    [6] = 1, /* Friendship change, low */ \\\n    [7] = 1  /* Friendship change, mid */\n\nstatic const u8 sItemEffect_GuardSpec[8] = {\n    [3] = ITEM3_GUARD_SPEC,\n    [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,\n    STAT_BOOST_FRIENDSHIP_CHANGE\n};\n\nstatic const u8 sItemEffect_DireHit[8] = {\n    [0] = 2 << 4, // ITEM0_DIRE_HIT\n    [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,\n    STAT_BOOST_FRIENDSHIP_CHANGE\n};\n\nstatic const u8 sItemEffect_XAttack[8] = {\n    [0] = 1, // ITEM0_X_ATTACK\n    [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,\n    STAT_BOOST_FRIENDSHIP_CHANGE\n};\n\nstatic const u8 sItemEffect_XDefend[8] = {\n    [1] = 1 << 4, /// ITEM1_X_DEFEND\n    [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,\n    STAT_BOOST_FRIENDSHIP_CHANGE,\n};\n\nstatic const u8 sItemEffect_XSpeed[8] = {\n    [1] = 1, // ITEM1_X_SPEED\n    [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,\n    STAT_BOOST_FRIENDSHIP_CHANGE,\n};\n\nstatic const u8 sItemEffect_XAccuracy[8] = {\n    [2] = 1 << 4, // ITEM2_X_ACCURACY\n    [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,\n    STAT_BOOST_FRIENDSHIP_CHANGE,\n};\n\nstatic const u8 sItemEffect_XSpecial[8] = {\n    [2] = 1, // ITEM2_X_SPATK\n    [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,\n    STAT_BOOST_FRIENDSHIP_CHANGE,\n};\n\nstatic const u8 sItemEffect_SunStone[6] = {\n    [4] = ITEM4_EVO_STONE,\n};\n\nstatic const u8 sItemEffect_MoonStone[6] = {\n    [4] = ITEM4_EVO_STONE,\n};\n\nstatic const u8 sItemEffect_FireStone[6] = {\n    [4] = ITEM4_EVO_STONE,\n};\n\nstatic const u8 sItemEffect_ThunderStone[6] = {\n    [4] = ITEM4_EVO_STONE,\n};\n\nstatic const u8 sItemEffect_WaterStone[6] = {\n    [4] = ITEM4_EVO_STONE,\n};\n\nstatic const u8 sItemEffect_LeafStone[6] = {\n    [4] = ITEM4_EVO_STONE,\n};\n\nstatic const u8 sItemEffect_CheriBerry[6] = {\n    [3] = ITEM3_PARALYSIS,\n};\n\nstatic const u8 sItemEffect_ChestoBerry[6] = {\n    [3] = ITEM3_SLEEP,\n};\n\nstatic const u8 sItemEffect_PechaBerry[6] = {\n    [3] = ITEM3_POISON,\n};\n\nstatic const u8 sItemEffect_RawstBerry[6] = {\n    [3] = ITEM3_BURN,\n};\n\nstatic const u8 sItemEffect_AspearBerry[6] = {\n    [3] = ITEM3_FREEZE,\n};\n\nstatic const u8 sItemEffect_LeppaBerry[7] = {\n    [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL,\n    [6] = 10, // Amount of PP to recover\n};\n\nstatic const u8 sItemEffect_OranBerry[7] = {\n    [4] = ITEM4_HEAL_HP,\n    [6] = 10, // Amount of HP to recover\n};\n\nstatic const u8 sItemEffect_PersimBerry[6] = {\n    [3] = ITEM3_CONFUSION,\n};\n\nstatic const u8 sItemEffect_LumBerry[6] = {\n    [3] = ITEM3_STATUS_ALL,\n};\n\nstatic const u8 sItemEffect_SitrusBerry[7] = {\n    [4] = ITEM4_HEAL_HP,\n    [6] = 30, // Amount of HP to recover\n};\n\nconst u8 gItemEffect_PomegBerry[10] = {\n    [4] = ITEM4_EV_HP,\n    [5] = ITEM5_FRIENDSHIP_ALL,\n    [6] = 201,\n    [7] = 10,\n    [8] = 5,\n    [9] = 2,\n};\n\nconst u8 gItemEffect_KelpsyBerry[10] = {\n    [4] = ITEM4_EV_ATK,\n    [5] = ITEM5_FRIENDSHIP_ALL,\n    [6] = 201,\n    [7] = 10,\n    [8] = 5,\n    [9] = 2,\n};\n\nconst u8 gItemEffect_QualotBerry[10] = {\n    [5] = ITEM5_EV_DEF | ITEM5_FRIENDSHIP_ALL,\n    [6] = 201,\n    [7] = 10,\n    [8] = 5,\n    [9] = 2,\n};\n\nconst u8 gItemEffect_HondewBerry[10] = {\n    [5] = ITEM5_EV_SPATK | ITEM5_FRIENDSHIP_ALL,\n    [6] = 201,\n    [7] = 10,\n    [8] = 5,\n    [9] = 2,\n};\n\nconst u8 gItemEffect_GrepaBerry[10] = {\n    [5] = ITEM5_EV_SPDEF | ITEM5_FRIENDSHIP_ALL,\n    [6] = 201,\n    [7] = 10,\n    [8] = 5,\n    [9] = 2,\n};\n\nconst u8 gItemEffect_TamatoBerry[10] = {\n    [5] = ITEM5_EV_SPEED | ITEM5_FRIENDSHIP_ALL,\n    [6] = 201,\n    [7] = 10,\n    [8] = 5,\n    [9] = 2,\n};\n\nstatic const u8 sItemEffect_LinkBracelet[6] = {\n    [4] = ITEM4_EVO_STONE,\n};\n\nconst u8 *const gItemEffectTable[] =\n{\n    [ITEM_POTION - ITEM_POTION]        = sItemEffect_Potion,\n    [ITEM_ANTIDOTE - ITEM_POTION]      = sItemEffect_Antidote,\n    [ITEM_BURN_HEAL - ITEM_POTION]     = sItemEffect_BurnHeal,\n    [ITEM_ICE_HEAL - ITEM_POTION]      = sItemEffect_IceHeal,\n    [ITEM_AWAKENING - ITEM_POTION]     = sItemEffect_Awakening,\n    [ITEM_PARALYZE_HEAL - ITEM_POTION] = sItemEffect_ParalyzeHeal,\n    [ITEM_FULL_RESTORE - ITEM_POTION]  = sItemEffect_FullRestore,\n    [ITEM_MAX_POTION - ITEM_POTION]    = sItemEffect_MaxPotion,\n    [ITEM_HYPER_POTION - ITEM_POTION]  = sItemEffect_HyperPotion,\n    [ITEM_SUPER_POTION - ITEM_POTION]  = sItemEffect_SuperPotion,\n    [ITEM_FULL_HEAL - ITEM_POTION]     = sItemEffect_FullHeal,\n    [ITEM_REVIVE - ITEM_POTION]        = sItemEffect_Revive,\n    [ITEM_MAX_REVIVE - ITEM_POTION]    = sItemEffect_MaxRevive,\n    [ITEM_FRESH_WATER - ITEM_POTION]   = sItemEffect_FreshWater,\n    [ITEM_SODA_POP - ITEM_POTION]      = sItemEffect_SodaPop,\n    [ITEM_LEMONADE - ITEM_POTION]      = sItemEffect_Lemonade,\n    [ITEM_MOOMOO_MILK - ITEM_POTION]   = sItemEffect_MoomooMilk,\n    [ITEM_ENERGY_POWDER - ITEM_POTION] = sItemEffect_EnergyPowder,\n    [ITEM_ENERGY_ROOT - ITEM_POTION]   = sItemEffect_EnergyRoot,\n    [ITEM_HEAL_POWDER - ITEM_POTION]   = sItemEffect_HealPowder,\n    [ITEM_REVIVAL_HERB - ITEM_POTION]  = sItemEffect_RevivalHerb,\n    [ITEM_ETHER - ITEM_POTION]         = sItemEffect_Ether,\n    [ITEM_MAX_ETHER - ITEM_POTION]     = sItemEffect_MaxEther,\n    [ITEM_ELIXIR - ITEM_POTION]        = sItemEffect_Elixir,\n    [ITEM_MAX_ELIXIR - ITEM_POTION]    = sItemEffect_MaxElixir,\n    [ITEM_LAVA_COOKIE - ITEM_POTION]   = sItemEffect_LavaCookie,\n    [ITEM_BLUE_FLUTE - ITEM_POTION]    = sItemEffect_BlueFlute,\n    [ITEM_YELLOW_FLUTE - ITEM_POTION]  = sItemEffect_YellowFlute,\n    [ITEM_RED_FLUTE - ITEM_POTION]     = sItemEffect_RedFlute,\n    [ITEM_BERRY_JUICE - ITEM_POTION]   = sItemEffect_BerryJuice,\n    [ITEM_SACRED_ASH - ITEM_POTION]    = sItemEffect_SacredAsh,\n    [ITEM_HP_UP - ITEM_POTION]         = sItemEffect_HPUp,\n    [ITEM_PROTEIN - ITEM_POTION]       = sItemEffect_Protein,\n    [ITEM_IRON - ITEM_POTION]          = sItemEffect_Iron,\n    [ITEM_CARBOS - ITEM_POTION]        = sItemEffect_Carbos,\n    [ITEM_CALCIUM - ITEM_POTION]       = sItemEffect_Calcium,\n    [ITEM_RARE_CANDY - ITEM_POTION]    = sItemEffect_RareCandy,\n    [ITEM_PP_UP - ITEM_POTION]         = sItemEffect_PPUp,\n    [ITEM_ZINC - ITEM_POTION]          = sItemEffect_Zinc,\n    [ITEM_PP_MAX - ITEM_POTION]        = sItemEffect_PPMax,\n    [ITEM_GUARD_SPEC - ITEM_POTION]    = sItemEffect_GuardSpec,\n    [ITEM_DIRE_HIT - ITEM_POTION]      = sItemEffect_DireHit,\n    [ITEM_X_ATTACK - ITEM_POTION]      = sItemEffect_XAttack,\n    [ITEM_X_DEFEND - ITEM_POTION]      = sItemEffect_XDefend,\n    [ITEM_X_SPEED - ITEM_POTION]       = sItemEffect_XSpeed,\n    [ITEM_X_ACCURACY - ITEM_POTION]    = sItemEffect_XAccuracy,\n    [ITEM_X_SPECIAL - ITEM_POTION]     = sItemEffect_XSpecial,\n    [ITEM_SUN_STONE - ITEM_POTION]     = sItemEffect_SunStone,\n    [ITEM_MOON_STONE - ITEM_POTION]    = sItemEffect_MoonStone,\n    [ITEM_FIRE_STONE - ITEM_POTION]    = sItemEffect_FireStone,\n    [ITEM_THUNDER_STONE - ITEM_POTION] = sItemEffect_ThunderStone,\n    [ITEM_WATER_STONE - ITEM_POTION]   = sItemEffect_WaterStone,\n    [ITEM_LEAF_STONE - ITEM_POTION]    = sItemEffect_LeafStone,\n    [ITEM_CHERI_BERRY - ITEM_POTION]   = sItemEffect_CheriBerry,\n    [ITEM_CHESTO_BERRY - ITEM_POTION]  = sItemEffect_ChestoBerry,\n    [ITEM_PECHA_BERRY - ITEM_POTION]   = sItemEffect_PechaBerry,\n    [ITEM_RAWST_BERRY - ITEM_POTION]   = sItemEffect_RawstBerry,\n    [ITEM_ASPEAR_BERRY - ITEM_POTION]  = sItemEffect_AspearBerry,\n    [ITEM_LEPPA_BERRY - ITEM_POTION]   = sItemEffect_LeppaBerry,\n    [ITEM_ORAN_BERRY - ITEM_POTION]    = sItemEffect_OranBerry,\n    [ITEM_PERSIM_BERRY - ITEM_POTION]  = sItemEffect_PersimBerry,\n    [ITEM_LUM_BERRY - ITEM_POTION]     = sItemEffect_LumBerry,\n    [ITEM_SITRUS_BERRY - ITEM_POTION]  = sItemEffect_SitrusBerry,\n    [ITEM_POMEG_BERRY - ITEM_POTION]   = gItemEffect_PomegBerry,\n    [ITEM_KELPSY_BERRY - ITEM_POTION]  = gItemEffect_KelpsyBerry,\n    [ITEM_QUALOT_BERRY - ITEM_POTION]  = gItemEffect_QualotBerry,\n    [ITEM_HONDEW_BERRY - ITEM_POTION]  = gItemEffect_HondewBerry,\n    [ITEM_GREPA_BERRY - ITEM_POTION]   = gItemEffect_GrepaBerry,\n    [ITEM_TAMATO_BERRY - ITEM_POTION]  = gItemEffect_TamatoBerry,\n    [ITEM_LINK_BRACELET - ITEM_POTION] = sItemEffect_LinkBracelet,\n    [LAST_BERRY_INDEX - ITEM_POTION]   = NULL,\n};\n"
  },
  {
    "path": "src/data/pokemon/level_up_learnset_pointers.h",
    "content": "const u16 *const gLevelUpLearnsets[NUM_SPECIES] =\n{\n    [SPECIES_NONE] = sBulbasaurLevelUpLearnset,\n    [SPECIES_BULBASAUR] = sBulbasaurLevelUpLearnset,\n    [SPECIES_IVYSAUR] = sIvysaurLevelUpLearnset,\n    [SPECIES_VENUSAUR] = sVenusaurLevelUpLearnset,\n    [SPECIES_CHARMANDER] = sCharmanderLevelUpLearnset,\n    [SPECIES_CHARMELEON] = sCharmeleonLevelUpLearnset,\n    [SPECIES_CHARIZARD] = sCharizardLevelUpLearnset,\n    [SPECIES_SQUIRTLE] = sSquirtleLevelUpLearnset,\n    [SPECIES_WARTORTLE] = sWartortleLevelUpLearnset,\n    [SPECIES_BLASTOISE] = sBlastoiseLevelUpLearnset,\n    [SPECIES_CATERPIE] = sCaterpieLevelUpLearnset,\n    [SPECIES_METAPOD] = sMetapodLevelUpLearnset,\n    [SPECIES_BUTTERFREE] = sButterfreeLevelUpLearnset,\n    [SPECIES_WEEDLE] = sWeedleLevelUpLearnset,\n    [SPECIES_KAKUNA] = sKakunaLevelUpLearnset,\n    [SPECIES_BEEDRILL] = sBeedrillLevelUpLearnset,\n    [SPECIES_PIDGEY] = sPidgeyLevelUpLearnset,\n    [SPECIES_PIDGEOTTO] = sPidgeottoLevelUpLearnset,\n    [SPECIES_PIDGEOT] = sPidgeotLevelUpLearnset,\n    [SPECIES_RATTATA] = sRattataLevelUpLearnset,\n    [SPECIES_RATICATE] = sRaticateLevelUpLearnset,\n    [SPECIES_SPEAROW] = sSpearowLevelUpLearnset,\n    [SPECIES_FEAROW] = sFearowLevelUpLearnset,\n    [SPECIES_EKANS] = sEkansLevelUpLearnset,\n    [SPECIES_ARBOK] = sArbokLevelUpLearnset,\n    [SPECIES_PIKACHU] = sPikachuLevelUpLearnset,\n    [SPECIES_RAICHU] = sRaichuLevelUpLearnset,\n    [SPECIES_SANDSHREW] = sSandshrewLevelUpLearnset,\n    [SPECIES_SANDSLASH] = sSandslashLevelUpLearnset,\n    [SPECIES_NIDORAN_F] = sNidoranFLevelUpLearnset,\n    [SPECIES_NIDORINA] = sNidorinaLevelUpLearnset,\n    [SPECIES_NIDOQUEEN] = sNidoqueenLevelUpLearnset,\n    [SPECIES_NIDORAN_M] = sNidoranMLevelUpLearnset,\n    [SPECIES_NIDORINO] = sNidorinoLevelUpLearnset,\n    [SPECIES_NIDOKING] = sNidokingLevelUpLearnset,\n    [SPECIES_CLEFAIRY] = sClefairyLevelUpLearnset,\n    [SPECIES_CLEFABLE] = sClefableLevelUpLearnset,\n    [SPECIES_VULPIX] = sVulpixLevelUpLearnset,\n    [SPECIES_NINETALES] = sNinetalesLevelUpLearnset,\n    [SPECIES_JIGGLYPUFF] = sJigglypuffLevelUpLearnset,\n    [SPECIES_WIGGLYTUFF] = sWigglytuffLevelUpLearnset,\n    [SPECIES_ZUBAT] = sZubatLevelUpLearnset,\n    [SPECIES_GOLBAT] = sGolbatLevelUpLearnset,\n    [SPECIES_ODDISH] = sOddishLevelUpLearnset,\n    [SPECIES_GLOOM] = sGloomLevelUpLearnset,\n    [SPECIES_VILEPLUME] = sVileplumeLevelUpLearnset,\n    [SPECIES_PARAS] = sParasLevelUpLearnset,\n    [SPECIES_PARASECT] = sParasectLevelUpLearnset,\n    [SPECIES_VENONAT] = sVenonatLevelUpLearnset,\n    [SPECIES_VENOMOTH] = sVenomothLevelUpLearnset,\n    [SPECIES_DIGLETT] = sDiglettLevelUpLearnset,\n    [SPECIES_DUGTRIO] = sDugtrioLevelUpLearnset,\n    [SPECIES_MEOWTH] = sMeowthLevelUpLearnset,\n    [SPECIES_PERSIAN] = sPersianLevelUpLearnset,\n    [SPECIES_PSYDUCK] = sPsyduckLevelUpLearnset,\n    [SPECIES_GOLDUCK] = sGolduckLevelUpLearnset,\n    [SPECIES_MANKEY] = sMankeyLevelUpLearnset,\n    [SPECIES_PRIMEAPE] = sPrimeapeLevelUpLearnset,\n    [SPECIES_GROWLITHE] = sGrowlitheLevelUpLearnset,\n    [SPECIES_ARCANINE] = sArcanineLevelUpLearnset,\n    [SPECIES_POLIWAG] = sPoliwagLevelUpLearnset,\n    [SPECIES_POLIWHIRL] = sPoliwhirlLevelUpLearnset,\n    [SPECIES_POLIWRATH] = sPoliwrathLevelUpLearnset,\n    [SPECIES_ABRA] = sAbraLevelUpLearnset,\n    [SPECIES_KADABRA] = sKadabraLevelUpLearnset,\n    [SPECIES_ALAKAZAM] = sAlakazamLevelUpLearnset,\n    [SPECIES_MACHOP] = sMachopLevelUpLearnset,\n    [SPECIES_MACHOKE] = sMachokeLevelUpLearnset,\n    [SPECIES_MACHAMP] = sMachampLevelUpLearnset,\n    [SPECIES_BELLSPROUT] = sBellsproutLevelUpLearnset,\n    [SPECIES_WEEPINBELL] = sWeepinbellLevelUpLearnset,\n    [SPECIES_VICTREEBEL] = sVictreebelLevelUpLearnset,\n    [SPECIES_TENTACOOL] = sTentacoolLevelUpLearnset,\n    [SPECIES_TENTACRUEL] = sTentacruelLevelUpLearnset,\n    [SPECIES_GEODUDE] = sGeodudeLevelUpLearnset,\n    [SPECIES_GRAVELER] = sGravelerLevelUpLearnset,\n    [SPECIES_GOLEM] = sGolemLevelUpLearnset,\n    [SPECIES_PONYTA] = sPonytaLevelUpLearnset,\n    [SPECIES_RAPIDASH] = sRapidashLevelUpLearnset,\n    [SPECIES_SLOWPOKE] = sSlowpokeLevelUpLearnset,\n    [SPECIES_SLOWBRO] = sSlowbroLevelUpLearnset,\n    [SPECIES_MAGNEMITE] = sMagnemiteLevelUpLearnset,\n    [SPECIES_MAGNETON] = sMagnetonLevelUpLearnset,\n    [SPECIES_FARFETCHD] = sFarfetchdLevelUpLearnset,\n    [SPECIES_DODUO] = sDoduoLevelUpLearnset,\n    [SPECIES_DODRIO] = sDodrioLevelUpLearnset,\n    [SPECIES_SEEL] = sSeelLevelUpLearnset,\n    [SPECIES_DEWGONG] = sDewgongLevelUpLearnset,\n    [SPECIES_GRIMER] = sGrimerLevelUpLearnset,\n    [SPECIES_MUK] = sMukLevelUpLearnset,\n    [SPECIES_SHELLDER] = sShellderLevelUpLearnset,\n    [SPECIES_CLOYSTER] = sCloysterLevelUpLearnset,\n    [SPECIES_GASTLY] = sGastlyLevelUpLearnset,\n    [SPECIES_HAUNTER] = sHaunterLevelUpLearnset,\n    [SPECIES_GENGAR] = sGengarLevelUpLearnset,\n    [SPECIES_ONIX] = sOnixLevelUpLearnset,\n    [SPECIES_DROWZEE] = sDrowzeeLevelUpLearnset,\n    [SPECIES_HYPNO] = sHypnoLevelUpLearnset,\n    [SPECIES_KRABBY] = sKrabbyLevelUpLearnset,\n    [SPECIES_KINGLER] = sKinglerLevelUpLearnset,\n    [SPECIES_VOLTORB] = sVoltorbLevelUpLearnset,\n    [SPECIES_ELECTRODE] = sElectrodeLevelUpLearnset,\n    [SPECIES_EXEGGCUTE] = sExeggcuteLevelUpLearnset,\n    [SPECIES_EXEGGUTOR] = sExeggutorLevelUpLearnset,\n    [SPECIES_CUBONE] = sCuboneLevelUpLearnset,\n    [SPECIES_MAROWAK] = sMarowakLevelUpLearnset,\n    [SPECIES_HITMONLEE] = sHitmonleeLevelUpLearnset,\n    [SPECIES_HITMONCHAN] = sHitmonchanLevelUpLearnset,\n    [SPECIES_LICKITUNG] = sLickitungLevelUpLearnset,\n    [SPECIES_KOFFING] = sKoffingLevelUpLearnset,\n    [SPECIES_WEEZING] = sWeezingLevelUpLearnset,\n    [SPECIES_RHYHORN] = sRhyhornLevelUpLearnset,\n    [SPECIES_RHYDON] = sRhydonLevelUpLearnset,\n    [SPECIES_CHANSEY] = sChanseyLevelUpLearnset,\n    [SPECIES_TANGELA] = sTangelaLevelUpLearnset,\n    [SPECIES_KANGASKHAN] = sKangaskhanLevelUpLearnset,\n    [SPECIES_HORSEA] = sHorseaLevelUpLearnset,\n    [SPECIES_SEADRA] = sSeadraLevelUpLearnset,\n    [SPECIES_GOLDEEN] = sGoldeenLevelUpLearnset,\n    [SPECIES_SEAKING] = sSeakingLevelUpLearnset,\n    [SPECIES_STARYU] = sStaryuLevelUpLearnset,\n    [SPECIES_STARMIE] = sStarmieLevelUpLearnset,\n    [SPECIES_MR_MIME] = sMrMimeLevelUpLearnset,\n    [SPECIES_SCYTHER] = sScytherLevelUpLearnset,\n    [SPECIES_JYNX] = sJynxLevelUpLearnset,\n    [SPECIES_ELECTABUZZ] = sElectabuzzLevelUpLearnset,\n    [SPECIES_MAGMAR] = sMagmarLevelUpLearnset,\n    [SPECIES_PINSIR] = sPinsirLevelUpLearnset,\n    [SPECIES_TAUROS] = sTaurosLevelUpLearnset,\n    [SPECIES_MAGIKARP] = sMagikarpLevelUpLearnset,\n    [SPECIES_GYARADOS] = sGyaradosLevelUpLearnset,\n    [SPECIES_LAPRAS] = sLaprasLevelUpLearnset,\n    [SPECIES_DITTO] = sDittoLevelUpLearnset,\n    [SPECIES_EEVEE] = sEeveeLevelUpLearnset,\n    [SPECIES_VAPOREON] = sVaporeonLevelUpLearnset,\n    [SPECIES_JOLTEON] = sJolteonLevelUpLearnset,\n    [SPECIES_FLAREON] = sFlareonLevelUpLearnset,\n    [SPECIES_PORYGON] = sPorygonLevelUpLearnset,\n    [SPECIES_OMANYTE] = sOmanyteLevelUpLearnset,\n    [SPECIES_OMASTAR] = sOmastarLevelUpLearnset,\n    [SPECIES_KABUTO] = sKabutoLevelUpLearnset,\n    [SPECIES_KABUTOPS] = sKabutopsLevelUpLearnset,\n    [SPECIES_AERODACTYL] = sAerodactylLevelUpLearnset,\n    [SPECIES_SNORLAX] = sSnorlaxLevelUpLearnset,\n    [SPECIES_ARTICUNO] = sArticunoLevelUpLearnset,\n    [SPECIES_ZAPDOS] = sZapdosLevelUpLearnset,\n    [SPECIES_MOLTRES] = sMoltresLevelUpLearnset,\n    [SPECIES_DRATINI] = sDratiniLevelUpLearnset,\n    [SPECIES_DRAGONAIR] = sDragonairLevelUpLearnset,\n    [SPECIES_DRAGONITE] = sDragoniteLevelUpLearnset,\n    [SPECIES_MEWTWO] = sMewtwoLevelUpLearnset,\n    [SPECIES_MEW] = sMewLevelUpLearnset,\n    [SPECIES_CHIKORITA] = sChikoritaLevelUpLearnset,\n    [SPECIES_BAYLEEF] = sBayleefLevelUpLearnset,\n    [SPECIES_MEGANIUM] = sMeganiumLevelUpLearnset,\n    [SPECIES_CYNDAQUIL] = sCyndaquilLevelUpLearnset,\n    [SPECIES_QUILAVA] = sQuilavaLevelUpLearnset,\n    [SPECIES_TYPHLOSION] = sTyphlosionLevelUpLearnset,\n    [SPECIES_TOTODILE] = sTotodileLevelUpLearnset,\n    [SPECIES_CROCONAW] = sCroconawLevelUpLearnset,\n    [SPECIES_FERALIGATR] = sFeraligatrLevelUpLearnset,\n    [SPECIES_SENTRET] = sSentretLevelUpLearnset,\n    [SPECIES_FURRET] = sFurretLevelUpLearnset,\n    [SPECIES_HOOTHOOT] = sHoothootLevelUpLearnset,\n    [SPECIES_NOCTOWL] = sNoctowlLevelUpLearnset,\n    [SPECIES_LEDYBA] = sLedybaLevelUpLearnset,\n    [SPECIES_LEDIAN] = sLedianLevelUpLearnset,\n    [SPECIES_SPINARAK] = sSpinarakLevelUpLearnset,\n    [SPECIES_ARIADOS] = sAriadosLevelUpLearnset,\n    [SPECIES_CROBAT] = sCrobatLevelUpLearnset,\n    [SPECIES_CHINCHOU] = sChinchouLevelUpLearnset,\n    [SPECIES_LANTURN] = sLanturnLevelUpLearnset,\n    [SPECIES_PICHU] = sPichuLevelUpLearnset,\n    [SPECIES_CLEFFA] = sCleffaLevelUpLearnset,\n    [SPECIES_IGGLYBUFF] = sIgglybuffLevelUpLearnset,\n    [SPECIES_TOGEPI] = sTogepiLevelUpLearnset,\n    [SPECIES_TOGETIC] = sTogeticLevelUpLearnset,\n    [SPECIES_NATU] = sNatuLevelUpLearnset,\n    [SPECIES_XATU] = sXatuLevelUpLearnset,\n    [SPECIES_MAREEP] = sMareepLevelUpLearnset,\n    [SPECIES_FLAAFFY] = sFlaaffyLevelUpLearnset,\n    [SPECIES_AMPHAROS] = sAmpharosLevelUpLearnset,\n    [SPECIES_BELLOSSOM] = sBellossomLevelUpLearnset,\n    [SPECIES_MARILL] = sMarillLevelUpLearnset,\n    [SPECIES_AZUMARILL] = sAzumarillLevelUpLearnset,\n    [SPECIES_SUDOWOODO] = sSudowoodoLevelUpLearnset,\n    [SPECIES_POLITOED] = sPolitoedLevelUpLearnset,\n    [SPECIES_HOPPIP] = sHoppipLevelUpLearnset,\n    [SPECIES_SKIPLOOM] = sSkiploomLevelUpLearnset,\n    [SPECIES_JUMPLUFF] = sJumpluffLevelUpLearnset,\n    [SPECIES_AIPOM] = sAipomLevelUpLearnset,\n    [SPECIES_SUNKERN] = sSunkernLevelUpLearnset,\n    [SPECIES_SUNFLORA] = sSunfloraLevelUpLearnset,\n    [SPECIES_YANMA] = sYanmaLevelUpLearnset,\n    [SPECIES_WOOPER] = sWooperLevelUpLearnset,\n    [SPECIES_QUAGSIRE] = sQuagsireLevelUpLearnset,\n    [SPECIES_ESPEON] = sEspeonLevelUpLearnset,\n    [SPECIES_UMBREON] = sUmbreonLevelUpLearnset,\n    [SPECIES_MURKROW] = sMurkrowLevelUpLearnset,\n    [SPECIES_SLOWKING] = sSlowkingLevelUpLearnset,\n    [SPECIES_MISDREAVUS] = sMisdreavusLevelUpLearnset,\n    [SPECIES_UNOWN] = sUnownLevelUpLearnset,\n    [SPECIES_WOBBUFFET] = sWobbuffetLevelUpLearnset,\n    [SPECIES_GIRAFARIG] = sGirafarigLevelUpLearnset,\n    [SPECIES_PINECO] = sPinecoLevelUpLearnset,\n    [SPECIES_FORRETRESS] = sForretressLevelUpLearnset,\n    [SPECIES_DUNSPARCE] = sDunsparceLevelUpLearnset,\n    [SPECIES_GLIGAR] = sGligarLevelUpLearnset,\n    [SPECIES_STEELIX] = sSteelixLevelUpLearnset,\n    [SPECIES_SNUBBULL] = sSnubbullLevelUpLearnset,\n    [SPECIES_GRANBULL] = sGranbullLevelUpLearnset,\n    [SPECIES_QWILFISH] = sQwilfishLevelUpLearnset,\n    [SPECIES_SCIZOR] = sScizorLevelUpLearnset,\n    [SPECIES_SHUCKLE] = sShuckleLevelUpLearnset,\n    [SPECIES_HERACROSS] = sHeracrossLevelUpLearnset,\n    [SPECIES_SNEASEL] = sSneaselLevelUpLearnset,\n    [SPECIES_TEDDIURSA] = sTeddiursaLevelUpLearnset,\n    [SPECIES_URSARING] = sUrsaringLevelUpLearnset,\n    [SPECIES_SLUGMA] = sSlugmaLevelUpLearnset,\n    [SPECIES_MAGCARGO] = sMagcargoLevelUpLearnset,\n    [SPECIES_SWINUB] = sSwinubLevelUpLearnset,\n    [SPECIES_PILOSWINE] = sPiloswineLevelUpLearnset,\n    [SPECIES_CORSOLA] = sCorsolaLevelUpLearnset,\n    [SPECIES_REMORAID] = sRemoraidLevelUpLearnset,\n    [SPECIES_OCTILLERY] = sOctilleryLevelUpLearnset,\n    [SPECIES_DELIBIRD] = sDelibirdLevelUpLearnset,\n    [SPECIES_MANTINE] = sMantineLevelUpLearnset,\n    [SPECIES_SKARMORY] = sSkarmoryLevelUpLearnset,\n    [SPECIES_HOUNDOUR] = sHoundourLevelUpLearnset,\n    [SPECIES_HOUNDOOM] = sHoundoomLevelUpLearnset,\n    [SPECIES_KINGDRA] = sKingdraLevelUpLearnset,\n    [SPECIES_PHANPY] = sPhanpyLevelUpLearnset,\n    [SPECIES_DONPHAN] = sDonphanLevelUpLearnset,\n    [SPECIES_PORYGON2] = sPorygon2LevelUpLearnset,\n    [SPECIES_STANTLER] = sStantlerLevelUpLearnset,\n    [SPECIES_SMEARGLE] = sSmeargleLevelUpLearnset,\n    [SPECIES_TYROGUE] = sTyrogueLevelUpLearnset,\n    [SPECIES_HITMONTOP] = sHitmontopLevelUpLearnset,\n    [SPECIES_SMOOCHUM] = sSmoochumLevelUpLearnset,\n    [SPECIES_ELEKID] = sElekidLevelUpLearnset,\n    [SPECIES_MAGBY] = sMagbyLevelUpLearnset,\n    [SPECIES_MILTANK] = sMiltankLevelUpLearnset,\n    [SPECIES_BLISSEY] = sBlisseyLevelUpLearnset,\n    [SPECIES_RAIKOU] = sRaikouLevelUpLearnset,\n    [SPECIES_ENTEI] = sEnteiLevelUpLearnset,\n    [SPECIES_SUICUNE] = sSuicuneLevelUpLearnset,\n    [SPECIES_LARVITAR] = sLarvitarLevelUpLearnset,\n    [SPECIES_PUPITAR] = sPupitarLevelUpLearnset,\n    [SPECIES_TYRANITAR] = sTyranitarLevelUpLearnset,\n    [SPECIES_LUGIA] = sLugiaLevelUpLearnset,\n    [SPECIES_HO_OH] = sHoOhLevelUpLearnset,\n    [SPECIES_CELEBI] = sCelebiLevelUpLearnset,\n    [SPECIES_OLD_UNOWN_B] = sSpecies252LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_C] = sSpecies253LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_D] = sSpecies254LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_E] = sSpecies255LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_F] = sSpecies256LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_G] = sSpecies257LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_H] = sSpecies258LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_I] = sSpecies259LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_J] = sSpecies260LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_K] = sSpecies261LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_L] = sSpecies262LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_M] = sSpecies263LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_N] = sSpecies264LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_O] = sSpecies265LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_P] = sSpecies266LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_Q] = sSpecies267LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_R] = sSpecies268LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_S] = sSpecies269LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_T] = sSpecies270LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_U] = sSpecies271LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_V] = sSpecies272LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_W] = sSpecies273LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_X] = sSpecies274LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_Y] = sSpecies275LevelUpLearnset,\n    [SPECIES_OLD_UNOWN_Z] = sSpecies276LevelUpLearnset,\n    [SPECIES_TREECKO] = sTreeckoLevelUpLearnset,\n    [SPECIES_GROVYLE] = sGrovyleLevelUpLearnset,\n    [SPECIES_SCEPTILE] = sSceptileLevelUpLearnset,\n    [SPECIES_TORCHIC] = sTorchicLevelUpLearnset,\n    [SPECIES_COMBUSKEN] = sCombuskenLevelUpLearnset,\n    [SPECIES_BLAZIKEN] = sBlazikenLevelUpLearnset,\n    [SPECIES_MUDKIP] = sMudkipLevelUpLearnset,\n    [SPECIES_MARSHTOMP] = sMarshtompLevelUpLearnset,\n    [SPECIES_SWAMPERT] = sSwampertLevelUpLearnset,\n    [SPECIES_POOCHYENA] = sPoochyenaLevelUpLearnset,\n    [SPECIES_MIGHTYENA] = sMightyenaLevelUpLearnset,\n    [SPECIES_ZIGZAGOON] = sZigzagoonLevelUpLearnset,\n    [SPECIES_LINOONE] = sLinooneLevelUpLearnset,\n    [SPECIES_WURMPLE] = sWurmpleLevelUpLearnset,\n    [SPECIES_SILCOON] = sSilcoonLevelUpLearnset,\n    [SPECIES_BEAUTIFLY] = sBeautiflyLevelUpLearnset,\n    [SPECIES_CASCOON] = sCascoonLevelUpLearnset,\n    [SPECIES_DUSTOX] = sDustoxLevelUpLearnset,\n    [SPECIES_LOTAD] = sLotadLevelUpLearnset,\n    [SPECIES_LOMBRE] = sLombreLevelUpLearnset,\n    [SPECIES_LUDICOLO] = sLudicoloLevelUpLearnset,\n    [SPECIES_SEEDOT] = sSeedotLevelUpLearnset,\n    [SPECIES_NUZLEAF] = sNuzleafLevelUpLearnset,\n    [SPECIES_SHIFTRY] = sShiftryLevelUpLearnset,\n    [SPECIES_NINCADA] = sNincadaLevelUpLearnset,\n    [SPECIES_NINJASK] = sNinjaskLevelUpLearnset,\n    [SPECIES_SHEDINJA] = sShedinjaLevelUpLearnset,\n    [SPECIES_TAILLOW] = sTaillowLevelUpLearnset,\n    [SPECIES_SWELLOW] = sSwellowLevelUpLearnset,\n    [SPECIES_SHROOMISH] = sShroomishLevelUpLearnset,\n    [SPECIES_BRELOOM] = sBreloomLevelUpLearnset,\n    [SPECIES_SPINDA] = sSpindaLevelUpLearnset,\n    [SPECIES_WINGULL] = sWingullLevelUpLearnset,\n    [SPECIES_PELIPPER] = sPelipperLevelUpLearnset,\n    [SPECIES_SURSKIT] = sSurskitLevelUpLearnset,\n    [SPECIES_MASQUERAIN] = sMasquerainLevelUpLearnset,\n    [SPECIES_WAILMER] = sWailmerLevelUpLearnset,\n    [SPECIES_WAILORD] = sWailordLevelUpLearnset,\n    [SPECIES_SKITTY] = sSkittyLevelUpLearnset,\n    [SPECIES_DELCATTY] = sDelcattyLevelUpLearnset,\n    [SPECIES_KECLEON] = sKecleonLevelUpLearnset,\n    [SPECIES_BALTOY] = sBaltoyLevelUpLearnset,\n    [SPECIES_CLAYDOL] = sClaydolLevelUpLearnset,\n    [SPECIES_NOSEPASS] = sNosepassLevelUpLearnset,\n    [SPECIES_TORKOAL] = sTorkoalLevelUpLearnset,\n    [SPECIES_SABLEYE] = sSableyeLevelUpLearnset,\n    [SPECIES_BARBOACH] = sBarboachLevelUpLearnset,\n    [SPECIES_WHISCASH] = sWhiscashLevelUpLearnset,\n    [SPECIES_LUVDISC] = sLuvdiscLevelUpLearnset,\n    [SPECIES_CORPHISH] = sCorphishLevelUpLearnset,\n    [SPECIES_CRAWDAUNT] = sCrawdauntLevelUpLearnset,\n    [SPECIES_FEEBAS] = sFeebasLevelUpLearnset,\n    [SPECIES_MILOTIC] = sMiloticLevelUpLearnset,\n    [SPECIES_CARVANHA] = sCarvanhaLevelUpLearnset,\n    [SPECIES_SHARPEDO] = sSharpedoLevelUpLearnset,\n    [SPECIES_TRAPINCH] = sTrapinchLevelUpLearnset,\n    [SPECIES_VIBRAVA] = sVibravaLevelUpLearnset,\n    [SPECIES_FLYGON] = sFlygonLevelUpLearnset,\n    [SPECIES_MAKUHITA] = sMakuhitaLevelUpLearnset,\n    [SPECIES_HARIYAMA] = sHariyamaLevelUpLearnset,\n    [SPECIES_ELECTRIKE] = sElectrikeLevelUpLearnset,\n    [SPECIES_MANECTRIC] = sManectricLevelUpLearnset,\n    [SPECIES_NUMEL] = sNumelLevelUpLearnset,\n    [SPECIES_CAMERUPT] = sCameruptLevelUpLearnset,\n    [SPECIES_SPHEAL] = sSphealLevelUpLearnset,\n    [SPECIES_SEALEO] = sSealeoLevelUpLearnset,\n    [SPECIES_WALREIN] = sWalreinLevelUpLearnset,\n    [SPECIES_CACNEA] = sCacneaLevelUpLearnset,\n    [SPECIES_CACTURNE] = sCacturneLevelUpLearnset,\n    [SPECIES_SNORUNT] = sSnoruntLevelUpLearnset,\n    [SPECIES_GLALIE] = sGlalieLevelUpLearnset,\n    [SPECIES_LUNATONE] = sLunatoneLevelUpLearnset,\n    [SPECIES_SOLROCK] = sSolrockLevelUpLearnset,\n    [SPECIES_AZURILL] = sAzurillLevelUpLearnset,\n    [SPECIES_SPOINK] = sSpoinkLevelUpLearnset,\n    [SPECIES_GRUMPIG] = sGrumpigLevelUpLearnset,\n    [SPECIES_PLUSLE] = sPlusleLevelUpLearnset,\n    [SPECIES_MINUN] = sMinunLevelUpLearnset,\n    [SPECIES_MAWILE] = sMawileLevelUpLearnset,\n    [SPECIES_MEDITITE] = sMedititeLevelUpLearnset,\n    [SPECIES_MEDICHAM] = sMedichamLevelUpLearnset,\n    [SPECIES_SWABLU] = sSwabluLevelUpLearnset,\n    [SPECIES_ALTARIA] = sAltariaLevelUpLearnset,\n    [SPECIES_WYNAUT] = sWynautLevelUpLearnset,\n    [SPECIES_DUSKULL] = sDuskullLevelUpLearnset,\n    [SPECIES_DUSCLOPS] = sDusclopsLevelUpLearnset,\n    [SPECIES_ROSELIA] = sRoseliaLevelUpLearnset,\n    [SPECIES_SLAKOTH] = sSlakothLevelUpLearnset,\n    [SPECIES_VIGOROTH] = sVigorothLevelUpLearnset,\n    [SPECIES_SLAKING] = sSlakingLevelUpLearnset,\n    [SPECIES_GULPIN] = sGulpinLevelUpLearnset,\n    [SPECIES_SWALOT] = sSwalotLevelUpLearnset,\n    [SPECIES_TROPIUS] = sTropiusLevelUpLearnset,\n    [SPECIES_WHISMUR] = sWhismurLevelUpLearnset,\n    [SPECIES_LOUDRED] = sLoudredLevelUpLearnset,\n    [SPECIES_EXPLOUD] = sExploudLevelUpLearnset,\n    [SPECIES_CLAMPERL] = sClamperlLevelUpLearnset,\n    [SPECIES_HUNTAIL] = sHuntailLevelUpLearnset,\n    [SPECIES_GOREBYSS] = sGorebyssLevelUpLearnset,\n    [SPECIES_ABSOL] = sAbsolLevelUpLearnset,\n    [SPECIES_SHUPPET] = sShuppetLevelUpLearnset,\n    [SPECIES_BANETTE] = sBanetteLevelUpLearnset,\n    [SPECIES_SEVIPER] = sSeviperLevelUpLearnset,\n    [SPECIES_ZANGOOSE] = sZangooseLevelUpLearnset,\n    [SPECIES_RELICANTH] = sRelicanthLevelUpLearnset,\n    [SPECIES_ARON] = sAronLevelUpLearnset,\n    [SPECIES_LAIRON] = sLaironLevelUpLearnset,\n    [SPECIES_AGGRON] = sAggronLevelUpLearnset,\n    [SPECIES_CASTFORM] = sCastformLevelUpLearnset,\n    [SPECIES_VOLBEAT] = sVolbeatLevelUpLearnset,\n    [SPECIES_ILLUMISE] = sIllumiseLevelUpLearnset,\n    [SPECIES_LILEEP] = sLileepLevelUpLearnset,\n    [SPECIES_CRADILY] = sCradilyLevelUpLearnset,\n    [SPECIES_ANORITH] = sAnorithLevelUpLearnset,\n    [SPECIES_ARMALDO] = sArmaldoLevelUpLearnset,\n    [SPECIES_RALTS] = sRaltsLevelUpLearnset,\n    [SPECIES_KIRLIA] = sKirliaLevelUpLearnset,\n    [SPECIES_GARDEVOIR] = sGardevoirLevelUpLearnset,\n    [SPECIES_BAGON] = sBagonLevelUpLearnset,\n    [SPECIES_SHELGON] = sShelgonLevelUpLearnset,\n    [SPECIES_SALAMENCE] = sSalamenceLevelUpLearnset,\n    [SPECIES_BELDUM] = sBeldumLevelUpLearnset,\n    [SPECIES_METANG] = sMetangLevelUpLearnset,\n    [SPECIES_METAGROSS] = sMetagrossLevelUpLearnset,\n    [SPECIES_REGIROCK] = sRegirockLevelUpLearnset,\n    [SPECIES_REGICE] = sRegiceLevelUpLearnset,\n    [SPECIES_REGISTEEL] = sRegisteelLevelUpLearnset,\n    [SPECIES_KYOGRE] = sKyogreLevelUpLearnset,\n    [SPECIES_GROUDON] = sGroudonLevelUpLearnset,\n    [SPECIES_RAYQUAZA] = sRayquazaLevelUpLearnset,\n    [SPECIES_LATIAS] = sLatiasLevelUpLearnset,\n    [SPECIES_LATIOS] = sLatiosLevelUpLearnset,\n    [SPECIES_JIRACHI] = sJirachiLevelUpLearnset,\n    [SPECIES_DEOXYS] = sDeoxysLevelUpLearnset,\n    [SPECIES_CHIMECHO] = sChimechoLevelUpLearnset,\n};\n"
  },
  {
    "path": "src/data/pokemon/level_up_learnsets.h",
    "content": "#define LEVEL_UP_MOVE(lvl, move) ((lvl << 9) | move)\n#define LEVEL_UP_END 0xFFFF\n\nstatic const u16 sBulbasaurLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(4, MOVE_GROWL),\n    LEVEL_UP_MOVE(7, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(10, MOVE_VINE_WHIP),\n    LEVEL_UP_MOVE(15, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(20, MOVE_RAZOR_LEAF),\n    LEVEL_UP_MOVE(25, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(32, MOVE_GROWTH),\n    LEVEL_UP_MOVE(39, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(46, MOVE_SOLAR_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sIvysaurLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(4, MOVE_GROWL),\n    LEVEL_UP_MOVE(7, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(10, MOVE_VINE_WHIP),\n    LEVEL_UP_MOVE(15, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(22, MOVE_RAZOR_LEAF),\n    LEVEL_UP_MOVE(29, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(38, MOVE_GROWTH),\n    LEVEL_UP_MOVE(47, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(56, MOVE_SOLAR_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sVenusaurLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(1, MOVE_VINE_WHIP),\n    LEVEL_UP_MOVE(4, MOVE_GROWL),\n    LEVEL_UP_MOVE(7, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(10, MOVE_VINE_WHIP),\n    LEVEL_UP_MOVE(15, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(22, MOVE_RAZOR_LEAF),\n    LEVEL_UP_MOVE(29, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(41, MOVE_GROWTH),\n    LEVEL_UP_MOVE(53, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(65, MOVE_SOLAR_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCharmanderLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(7, MOVE_EMBER),\n    LEVEL_UP_MOVE(13, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(19, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(25, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(31, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(37, MOVE_SLASH),\n    LEVEL_UP_MOVE(43, MOVE_DRAGON_RAGE),\n    LEVEL_UP_MOVE(49, MOVE_FIRE_SPIN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCharmeleonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(7, MOVE_EMBER),\n    LEVEL_UP_MOVE(13, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(20, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(27, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(34, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(41, MOVE_SLASH),\n    LEVEL_UP_MOVE(48, MOVE_DRAGON_RAGE),\n    LEVEL_UP_MOVE(55, MOVE_FIRE_SPIN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCharizardLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HEAT_WAVE),\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(1, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(7, MOVE_EMBER),\n    LEVEL_UP_MOVE(13, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(20, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(27, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(34, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(36, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(44, MOVE_SLASH),\n    LEVEL_UP_MOVE(54, MOVE_DRAGON_RAGE),\n    LEVEL_UP_MOVE(64, MOVE_FIRE_SPIN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSquirtleLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(7, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(10, MOVE_WITHDRAW),\n    LEVEL_UP_MOVE(13, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(18, MOVE_BITE),\n    LEVEL_UP_MOVE(23, MOVE_RAPID_SPIN),\n    LEVEL_UP_MOVE(28, MOVE_PROTECT),\n    LEVEL_UP_MOVE(33, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(40, MOVE_SKULL_BASH),\n    LEVEL_UP_MOVE(47, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWartortleLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(7, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(10, MOVE_WITHDRAW),\n    LEVEL_UP_MOVE(13, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(19, MOVE_BITE),\n    LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN),\n    LEVEL_UP_MOVE(31, MOVE_PROTECT),\n    LEVEL_UP_MOVE(37, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(45, MOVE_SKULL_BASH),\n    LEVEL_UP_MOVE(53, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBlastoiseLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(1, MOVE_WITHDRAW),\n    LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(7, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(10, MOVE_WITHDRAW),\n    LEVEL_UP_MOVE(13, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(19, MOVE_BITE),\n    LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN),\n    LEVEL_UP_MOVE(31, MOVE_PROTECT),\n    LEVEL_UP_MOVE(42, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(55, MOVE_SKULL_BASH),\n    LEVEL_UP_MOVE(68, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCaterpieLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_STRING_SHOT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMetapodLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(7, MOVE_HARDEN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sButterfreeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(10, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(13, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(14, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(18, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(23, MOVE_WHIRLWIND),\n    LEVEL_UP_MOVE(28, MOVE_GUST),\n    LEVEL_UP_MOVE(34, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(40, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(47, MOVE_SILVER_WIND),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWeedleLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(1, MOVE_STRING_SHOT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sKakunaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(7, MOVE_HARDEN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBeedrillLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(10, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(15, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(20, MOVE_TWINEEDLE),\n    LEVEL_UP_MOVE(25, MOVE_RAGE),\n    LEVEL_UP_MOVE(30, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(35, MOVE_PIN_MISSILE),\n    LEVEL_UP_MOVE(40, MOVE_AGILITY),\n    LEVEL_UP_MOVE(45, MOVE_ENDEAVOR),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPidgeyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(5, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(9, MOVE_GUST),\n    LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(19, MOVE_WHIRLWIND),\n    LEVEL_UP_MOVE(25, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(31, MOVE_FEATHER_DANCE),\n    LEVEL_UP_MOVE(39, MOVE_AGILITY),\n    LEVEL_UP_MOVE(47, MOVE_MIRROR_MOVE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPidgeottoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_GUST),\n    LEVEL_UP_MOVE(5, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(9, MOVE_GUST),\n    LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(20, MOVE_WHIRLWIND),\n    LEVEL_UP_MOVE(27, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(34, MOVE_FEATHER_DANCE),\n    LEVEL_UP_MOVE(43, MOVE_AGILITY),\n    LEVEL_UP_MOVE(52, MOVE_MIRROR_MOVE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPidgeotLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_GUST),\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(5, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(9, MOVE_GUST),\n    LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(20, MOVE_WHIRLWIND),\n    LEVEL_UP_MOVE(27, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(34, MOVE_FEATHER_DANCE),\n    LEVEL_UP_MOVE(48, MOVE_AGILITY),\n    LEVEL_UP_MOVE(62, MOVE_MIRROR_MOVE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRattataLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_HYPER_FANG),\n    LEVEL_UP_MOVE(20, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(27, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(34, MOVE_SUPER_FANG),\n    LEVEL_UP_MOVE(41, MOVE_ENDEAVOR),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRaticateLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_HYPER_FANG),\n    LEVEL_UP_MOVE(20, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(30, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(40, MOVE_SUPER_FANG),\n    LEVEL_UP_MOVE(50, MOVE_ENDEAVOR),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpearowLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(7, MOVE_LEER),\n    LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(19, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(25, MOVE_AERIAL_ACE),\n    LEVEL_UP_MOVE(31, MOVE_MIRROR_MOVE),\n    LEVEL_UP_MOVE(37, MOVE_DRILL_PECK),\n    LEVEL_UP_MOVE(43, MOVE_AGILITY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sFearowLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(7, MOVE_LEER),\n    LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(26, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(32, MOVE_MIRROR_MOVE),\n    LEVEL_UP_MOVE(40, MOVE_DRILL_PECK),\n    LEVEL_UP_MOVE(47, MOVE_AGILITY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sEkansLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WRAP),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(8, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(13, MOVE_BITE),\n    LEVEL_UP_MOVE(20, MOVE_GLARE),\n    LEVEL_UP_MOVE(25, MOVE_SCREECH),\n    LEVEL_UP_MOVE(32, MOVE_ACID),\n    LEVEL_UP_MOVE(37, MOVE_STOCKPILE),\n    LEVEL_UP_MOVE(37, MOVE_SWALLOW),\n    LEVEL_UP_MOVE(37, MOVE_SPIT_UP),\n    LEVEL_UP_MOVE(44, MOVE_HAZE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sArbokLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WRAP),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(8, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(13, MOVE_BITE),\n    LEVEL_UP_MOVE(20, MOVE_GLARE),\n    LEVEL_UP_MOVE(28, MOVE_SCREECH),\n    LEVEL_UP_MOVE(38, MOVE_ACID),\n    LEVEL_UP_MOVE(46, MOVE_STOCKPILE),\n    LEVEL_UP_MOVE(46, MOVE_SWALLOW),\n    LEVEL_UP_MOVE(46, MOVE_SPIT_UP),\n    LEVEL_UP_MOVE(56, MOVE_HAZE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPikachuLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(15, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(20, MOVE_SLAM),\n    LEVEL_UP_MOVE(26, MOVE_THUNDERBOLT),\n    LEVEL_UP_MOVE(33, MOVE_AGILITY),\n    LEVEL_UP_MOVE(41, MOVE_THUNDER),\n    LEVEL_UP_MOVE(50, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRaichuLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_THUNDERBOLT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSandshrewLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(6, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(11, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(17, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(23, MOVE_SLASH),\n    LEVEL_UP_MOVE(30, MOVE_SWIFT),\n    LEVEL_UP_MOVE(37, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(45, MOVE_SAND_TOMB),\n    LEVEL_UP_MOVE(53, MOVE_SANDSTORM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSandslashLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(6, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(11, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(17, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(24, MOVE_SLASH),\n    LEVEL_UP_MOVE(33, MOVE_SWIFT),\n    LEVEL_UP_MOVE(42, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(52, MOVE_SAND_TOMB),\n    LEVEL_UP_MOVE(62, MOVE_SANDSTORM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNidoranFLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(8, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK),\n    LEVEL_UP_MOVE(17, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(20, MOVE_BITE),\n    LEVEL_UP_MOVE(23, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(30, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(38, MOVE_FLATTER),\n    LEVEL_UP_MOVE(47, MOVE_CRUNCH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNidorinaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(8, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK),\n    LEVEL_UP_MOVE(18, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(22, MOVE_BITE),\n    LEVEL_UP_MOVE(26, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(34, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(43, MOVE_FLATTER),\n    LEVEL_UP_MOVE(53, MOVE_CRUNCH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNidoqueenLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_DOUBLE_KICK),\n    LEVEL_UP_MOVE(1, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(22, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(43, MOVE_SUPERPOWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNidoranMLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(8, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK),\n    LEVEL_UP_MOVE(17, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(20, MOVE_HORN_ATTACK),\n    LEVEL_UP_MOVE(23, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(30, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(38, MOVE_FLATTER),\n    LEVEL_UP_MOVE(47, MOVE_HORN_DRILL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNidorinoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(8, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK),\n    LEVEL_UP_MOVE(18, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(22, MOVE_HORN_ATTACK),\n    LEVEL_UP_MOVE(26, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(34, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(43, MOVE_FLATTER),\n    LEVEL_UP_MOVE(53, MOVE_HORN_DRILL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNidokingLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(1, MOVE_DOUBLE_KICK),\n    LEVEL_UP_MOVE(1, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(22, MOVE_THRASH),\n    LEVEL_UP_MOVE(43, MOVE_MEGAHORN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sClefairyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(5, MOVE_ENCORE),\n    LEVEL_UP_MOVE(9, MOVE_SING),\n    LEVEL_UP_MOVE(13, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_MOVE(17, MOVE_FOLLOW_ME),\n    LEVEL_UP_MOVE(21, MOVE_MINIMIZE),\n    LEVEL_UP_MOVE(25, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(29, MOVE_METRONOME),\n    LEVEL_UP_MOVE(33, MOVE_COSMIC_POWER),\n    LEVEL_UP_MOVE(37, MOVE_MOONLIGHT),\n    LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(45, MOVE_METEOR_MASH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sClefableLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SING),\n    LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_MOVE(1, MOVE_MINIMIZE),\n    LEVEL_UP_MOVE(1, MOVE_METRONOME),\n    LEVEL_UP_END\n};\n\nstatic const u16 sVulpixLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(9, MOVE_ROAR),\n    LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(17, MOVE_WILL_O_WISP),\n    LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(25, MOVE_IMPRISON),\n    LEVEL_UP_MOVE(29, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(33, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(37, MOVE_GRUDGE),\n    LEVEL_UP_MOVE(41, MOVE_FIRE_SPIN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNinetalesLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(1, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(45, MOVE_FIRE_SPIN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sJigglypuffLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SING),\n    LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(9, MOVE_POUND),\n    LEVEL_UP_MOVE(14, MOVE_DISABLE),\n    LEVEL_UP_MOVE(19, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(24, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_MOVE(29, MOVE_REST),\n    LEVEL_UP_MOVE(34, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(39, MOVE_MIMIC),\n    LEVEL_UP_MOVE(44, MOVE_HYPER_VOICE),\n    LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWigglytuffLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SING),\n    LEVEL_UP_MOVE(1, MOVE_DISABLE),\n    LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sZubatLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(6, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(11, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(16, MOVE_BITE),\n    LEVEL_UP_MOVE(21, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(26, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(31, MOVE_AIR_CUTTER),\n    LEVEL_UP_MOVE(36, MOVE_MEAN_LOOK),\n    LEVEL_UP_MOVE(41, MOVE_POISON_FANG),\n    LEVEL_UP_MOVE(46, MOVE_HAZE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGolbatLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCREECH),\n    LEVEL_UP_MOVE(1, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(1, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(6, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(11, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(16, MOVE_BITE),\n    LEVEL_UP_MOVE(21, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(28, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(35, MOVE_AIR_CUTTER),\n    LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK),\n    LEVEL_UP_MOVE(49, MOVE_POISON_FANG),\n    LEVEL_UP_MOVE(56, MOVE_HAZE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sOddishLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(7, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(14, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(16, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(18, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(23, MOVE_ACID),\n    LEVEL_UP_MOVE(32, MOVE_MOONLIGHT),\n    LEVEL_UP_MOVE(39, MOVE_PETAL_DANCE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGloomLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(1, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(1, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(7, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(14, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(16, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(18, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(24, MOVE_ACID),\n    LEVEL_UP_MOVE(35, MOVE_MOONLIGHT),\n    LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sVileplumeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(1, MOVE_AROMATHERAPY),\n    LEVEL_UP_MOVE(1, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(1, MOVE_MEGA_DRAIN),\n    LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sParasLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(7, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(13, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(19, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(25, MOVE_SPORE),\n    LEVEL_UP_MOVE(31, MOVE_SLASH),\n    LEVEL_UP_MOVE(37, MOVE_GROWTH),\n    LEVEL_UP_MOVE(43, MOVE_GIGA_DRAIN),\n    LEVEL_UP_MOVE(49, MOVE_AROMATHERAPY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sParasectLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(1, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(7, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(13, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(19, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(27, MOVE_SPORE),\n    LEVEL_UP_MOVE(35, MOVE_SLASH),\n    LEVEL_UP_MOVE(43, MOVE_GROWTH),\n    LEVEL_UP_MOVE(51, MOVE_GIGA_DRAIN),\n    LEVEL_UP_MOVE(59, MOVE_AROMATHERAPY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sVenonatLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_DISABLE),\n    LEVEL_UP_MOVE(1, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(9, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(17, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(20, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(28, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(33, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(36, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(41, MOVE_PSYCHIC),\n    LEVEL_UP_END\n};\n\nstatic const u16 sVenomothLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SILVER_WIND),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_DISABLE),\n    LEVEL_UP_MOVE(1, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(9, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(17, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(20, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(28, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(31, MOVE_GUST),\n    LEVEL_UP_MOVE(36, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(42, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(52, MOVE_PSYCHIC),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDiglettLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(5, MOVE_GROWL),\n    LEVEL_UP_MOVE(9, MOVE_MAGNITUDE),\n    LEVEL_UP_MOVE(17, MOVE_DIG),\n    LEVEL_UP_MOVE(21, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(25, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(33, MOVE_SLASH),\n    LEVEL_UP_MOVE(41, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(49, MOVE_FISSURE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDugtrioLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TRI_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(5, MOVE_GROWL),\n    LEVEL_UP_MOVE(9, MOVE_MAGNITUDE),\n    LEVEL_UP_MOVE(17, MOVE_DIG),\n    LEVEL_UP_MOVE(21, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(25, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(26, MOVE_SAND_TOMB),\n    LEVEL_UP_MOVE(38, MOVE_SLASH),\n    LEVEL_UP_MOVE(51, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(64, MOVE_FISSURE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMeowthLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(10, MOVE_BITE),\n    LEVEL_UP_MOVE(18, MOVE_PAY_DAY),\n    LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(31, MOVE_SCREECH),\n    LEVEL_UP_MOVE(36, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(40, MOVE_SLASH),\n    LEVEL_UP_MOVE(43, MOVE_FAKE_OUT),\n    LEVEL_UP_MOVE(45, MOVE_SWAGGER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPersianLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(10, MOVE_BITE),\n    LEVEL_UP_MOVE(18, MOVE_PAY_DAY),\n    LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(34, MOVE_SCREECH),\n    LEVEL_UP_MOVE(42, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(49, MOVE_SLASH),\n    LEVEL_UP_MOVE(55, MOVE_FAKE_OUT),\n    LEVEL_UP_MOVE(61, MOVE_SWAGGER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPsyduckLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(10, MOVE_DISABLE),\n    LEVEL_UP_MOVE(16, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(23, MOVE_SCREECH),\n    LEVEL_UP_MOVE(31, MOVE_PSYCH_UP),\n    LEVEL_UP_MOVE(40, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGolduckLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_DISABLE),\n    LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(10, MOVE_DISABLE),\n    LEVEL_UP_MOVE(16, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(23, MOVE_SCREECH),\n    LEVEL_UP_MOVE(31, MOVE_PSYCH_UP),\n    LEVEL_UP_MOVE(44, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(58, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMankeyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(6, MOVE_LOW_KICK),\n    LEVEL_UP_MOVE(11, MOVE_KARATE_CHOP),\n    LEVEL_UP_MOVE(16, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(26, MOVE_SEISMIC_TOSS),\n    LEVEL_UP_MOVE(31, MOVE_CROSS_CHOP),\n    LEVEL_UP_MOVE(36, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(41, MOVE_SCREECH),\n    LEVEL_UP_MOVE(46, MOVE_THRASH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPrimeapeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_LOW_KICK),\n    LEVEL_UP_MOVE(1, MOVE_RAGE),\n    LEVEL_UP_MOVE(6, MOVE_LOW_KICK),\n    LEVEL_UP_MOVE(11, MOVE_KARATE_CHOP),\n    LEVEL_UP_MOVE(16, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(26, MOVE_SEISMIC_TOSS),\n    LEVEL_UP_MOVE(28, MOVE_RAGE),\n    LEVEL_UP_MOVE(35, MOVE_CROSS_CHOP),\n    LEVEL_UP_MOVE(44, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(53, MOVE_SCREECH),\n    LEVEL_UP_MOVE(62, MOVE_THRASH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGrowlitheLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_ROAR),\n    LEVEL_UP_MOVE(7, MOVE_EMBER),\n    LEVEL_UP_MOVE(13, MOVE_LEER),\n    LEVEL_UP_MOVE(19, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL),\n    LEVEL_UP_MOVE(37, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(43, MOVE_AGILITY),\n    LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sArcanineLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_ROAR),\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(49, MOVE_EXTREME_SPEED),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPoliwagLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(7, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(13, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(19, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_MOVE(25, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(31, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(37, MOVE_BELLY_DRUM),\n    LEVEL_UP_MOVE(43, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPoliwhirlLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(7, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(13, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(19, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_MOVE(27, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(35, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(43, MOVE_BELLY_DRUM),\n    LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPoliwrathLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_MOVE(1, MOVE_SUBMISSION),\n    LEVEL_UP_MOVE(35, MOVE_SUBMISSION),\n    LEVEL_UP_MOVE(51, MOVE_MIND_READER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAbraLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TELEPORT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sKadabraLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TELEPORT),\n    LEVEL_UP_MOVE(1, MOVE_KINESIS),\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(16, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(18, MOVE_DISABLE),\n    LEVEL_UP_MOVE(21, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(23, MOVE_REFLECT),\n    LEVEL_UP_MOVE(25, MOVE_RECOVER),\n    LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(33, MOVE_ROLE_PLAY),\n    LEVEL_UP_MOVE(36, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(43, MOVE_TRICK),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAlakazamLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TELEPORT),\n    LEVEL_UP_MOVE(1, MOVE_KINESIS),\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(16, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(18, MOVE_DISABLE),\n    LEVEL_UP_MOVE(21, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(23, MOVE_REFLECT),\n    LEVEL_UP_MOVE(25, MOVE_RECOVER),\n    LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(33, MOVE_CALM_MIND),\n    LEVEL_UP_MOVE(36, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(43, MOVE_TRICK),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMachopLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LOW_KICK),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP),\n    LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS),\n    LEVEL_UP_MOVE(22, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(25, MOVE_REVENGE),\n    LEVEL_UP_MOVE(31, MOVE_VITAL_THROW),\n    LEVEL_UP_MOVE(37, MOVE_SUBMISSION),\n    LEVEL_UP_MOVE(40, MOVE_CROSS_CHOP),\n    LEVEL_UP_MOVE(43, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(49, MOVE_DYNAMIC_PUNCH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMachokeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LOW_KICK),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP),\n    LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS),\n    LEVEL_UP_MOVE(22, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(25, MOVE_REVENGE),\n    LEVEL_UP_MOVE(33, MOVE_VITAL_THROW),\n    LEVEL_UP_MOVE(41, MOVE_SUBMISSION),\n    LEVEL_UP_MOVE(46, MOVE_CROSS_CHOP),\n    LEVEL_UP_MOVE(51, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(59, MOVE_DYNAMIC_PUNCH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMachampLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LOW_KICK),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP),\n    LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS),\n    LEVEL_UP_MOVE(22, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(25, MOVE_REVENGE),\n    LEVEL_UP_MOVE(33, MOVE_VITAL_THROW),\n    LEVEL_UP_MOVE(41, MOVE_SUBMISSION),\n    LEVEL_UP_MOVE(46, MOVE_CROSS_CHOP),\n    LEVEL_UP_MOVE(51, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(59, MOVE_DYNAMIC_PUNCH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBellsproutLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_VINE_WHIP),\n    LEVEL_UP_MOVE(6, MOVE_GROWTH),\n    LEVEL_UP_MOVE(11, MOVE_WRAP),\n    LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(17, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(19, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(23, MOVE_ACID),\n    LEVEL_UP_MOVE(30, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(37, MOVE_RAZOR_LEAF),\n    LEVEL_UP_MOVE(45, MOVE_SLAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWeepinbellLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_VINE_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_GROWTH),\n    LEVEL_UP_MOVE(1, MOVE_WRAP),\n    LEVEL_UP_MOVE(6, MOVE_GROWTH),\n    LEVEL_UP_MOVE(11, MOVE_WRAP),\n    LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(17, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(19, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(24, MOVE_ACID),\n    LEVEL_UP_MOVE(33, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(42, MOVE_RAZOR_LEAF),\n    LEVEL_UP_MOVE(54, MOVE_SLAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sVictreebelLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_STOCKPILE),\n    LEVEL_UP_MOVE(1, MOVE_SPIT_UP),\n    LEVEL_UP_MOVE(1, MOVE_SWALLOW),\n    LEVEL_UP_MOVE(1, MOVE_VINE_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(1, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(1, MOVE_RAZOR_LEAF),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTentacoolLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(6, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(12, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(19, MOVE_ACID),\n    LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(30, MOVE_WRAP),\n    LEVEL_UP_MOVE(36, MOVE_BARRIER),\n    LEVEL_UP_MOVE(43, MOVE_SCREECH),\n    LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTentacruelLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(1, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(6, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(12, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(19, MOVE_ACID),\n    LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(30, MOVE_WRAP),\n    LEVEL_UP_MOVE(38, MOVE_BARRIER),\n    LEVEL_UP_MOVE(47, MOVE_SCREECH),\n    LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGeodudeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(6, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(11, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(16, MOVE_MAGNITUDE),\n    LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(26, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(31, MOVE_ROCK_BLAST),\n    LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(41, MOVE_EXPLOSION),\n    LEVEL_UP_MOVE(46, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGravelerLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(1, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(1, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(6, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(11, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(16, MOVE_MAGNITUDE),\n    LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(29, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(37, MOVE_ROCK_BLAST),\n    LEVEL_UP_MOVE(45, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(53, MOVE_EXPLOSION),\n    LEVEL_UP_MOVE(62, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGolemLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(1, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(1, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(6, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(11, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(16, MOVE_MAGNITUDE),\n    LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(29, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(37, MOVE_ROCK_BLAST),\n    LEVEL_UP_MOVE(45, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(53, MOVE_EXPLOSION),\n    LEVEL_UP_MOVE(62, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPonytaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(5, MOVE_GROWL),\n    LEVEL_UP_MOVE(9, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(14, MOVE_EMBER),\n    LEVEL_UP_MOVE(19, MOVE_STOMP),\n    LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN),\n    LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(38, MOVE_AGILITY),\n    LEVEL_UP_MOVE(45, MOVE_BOUNCE),\n    LEVEL_UP_MOVE(53, MOVE_FIRE_BLAST),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRapidashLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(5, MOVE_GROWL),\n    LEVEL_UP_MOVE(9, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(14, MOVE_EMBER),\n    LEVEL_UP_MOVE(19, MOVE_STOMP),\n    LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN),\n    LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(38, MOVE_AGILITY),\n    LEVEL_UP_MOVE(40, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(50, MOVE_BOUNCE),\n    LEVEL_UP_MOVE(63, MOVE_FIRE_BLAST),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSlowpokeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CURSE),\n    LEVEL_UP_MOVE(1, MOVE_YAWN),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(6, MOVE_GROWL),\n    LEVEL_UP_MOVE(13, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(17, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(24, MOVE_DISABLE),\n    LEVEL_UP_MOVE(29, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(36, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(40, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(47, MOVE_PSYCH_UP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSlowbroLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CURSE),\n    LEVEL_UP_MOVE(1, MOVE_YAWN),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(6, MOVE_GROWL),\n    LEVEL_UP_MOVE(13, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(17, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(24, MOVE_DISABLE),\n    LEVEL_UP_MOVE(29, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(36, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(37, MOVE_WITHDRAW),\n    LEVEL_UP_MOVE(44, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(55, MOVE_PSYCH_UP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMagnemiteLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_METAL_SOUND),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(6, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(11, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(16, MOVE_SONIC_BOOM),\n    LEVEL_UP_MOVE(21, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(26, MOVE_SPARK),\n    LEVEL_UP_MOVE(32, MOVE_LOCK_ON),\n    LEVEL_UP_MOVE(38, MOVE_SWIFT),\n    LEVEL_UP_MOVE(44, MOVE_SCREECH),\n    LEVEL_UP_MOVE(50, MOVE_ZAP_CANNON),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMagnetonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_METAL_SOUND),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(6, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(11, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(16, MOVE_SONIC_BOOM),\n    LEVEL_UP_MOVE(21, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(26, MOVE_SPARK),\n    LEVEL_UP_MOVE(35, MOVE_LOCK_ON),\n    LEVEL_UP_MOVE(44, MOVE_TRI_ATTACK),\n    LEVEL_UP_MOVE(53, MOVE_SCREECH),\n    LEVEL_UP_MOVE(62, MOVE_ZAP_CANNON),\n    LEVEL_UP_END\n};\n\nstatic const u16 sFarfetchdLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(6, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(11, MOVE_LEER),\n    LEVEL_UP_MOVE(16, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(21, MOVE_KNOCK_OFF),\n    LEVEL_UP_MOVE(26, MOVE_FURY_CUTTER),\n    LEVEL_UP_MOVE(31, MOVE_SWORDS_DANCE),\n    LEVEL_UP_MOVE(36, MOVE_AGILITY),\n    LEVEL_UP_MOVE(41, MOVE_SLASH),\n    LEVEL_UP_MOVE(46, MOVE_FALSE_SWIPE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDoduoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(9, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(21, MOVE_TRI_ATTACK),\n    LEVEL_UP_MOVE(25, MOVE_RAGE),\n    LEVEL_UP_MOVE(33, MOVE_UPROAR),\n    LEVEL_UP_MOVE(37, MOVE_DRILL_PECK),\n    LEVEL_UP_MOVE(45, MOVE_AGILITY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDodrioLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(1, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(9, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(21, MOVE_TRI_ATTACK),\n    LEVEL_UP_MOVE(25, MOVE_RAGE),\n    LEVEL_UP_MOVE(38, MOVE_UPROAR),\n    LEVEL_UP_MOVE(47, MOVE_DRILL_PECK),\n    LEVEL_UP_MOVE(60, MOVE_AGILITY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSeelLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(9, MOVE_GROWL),\n    LEVEL_UP_MOVE(17, MOVE_ICY_WIND),\n    LEVEL_UP_MOVE(21, MOVE_AURORA_BEAM),\n    LEVEL_UP_MOVE(29, MOVE_REST),\n    LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(41, MOVE_ICE_BEAM),\n    LEVEL_UP_MOVE(49, MOVE_SAFEGUARD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDewgongLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SIGNAL_BEAM),\n    LEVEL_UP_MOVE(1, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_ICY_WIND),\n    LEVEL_UP_MOVE(1, MOVE_AURORA_BEAM),\n    LEVEL_UP_MOVE(9, MOVE_GROWL),\n    LEVEL_UP_MOVE(17, MOVE_ICY_WIND),\n    LEVEL_UP_MOVE(21, MOVE_AURORA_BEAM),\n    LEVEL_UP_MOVE(29, MOVE_REST),\n    LEVEL_UP_MOVE(34, MOVE_SHEER_COLD),\n    LEVEL_UP_MOVE(42, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(51, MOVE_ICE_BEAM),\n    LEVEL_UP_MOVE(64, MOVE_SAFEGUARD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGrimerLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POISON_GAS),\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(4, MOVE_HARDEN),\n    LEVEL_UP_MOVE(8, MOVE_DISABLE),\n    LEVEL_UP_MOVE(13, MOVE_SLUDGE),\n    LEVEL_UP_MOVE(19, MOVE_MINIMIZE),\n    LEVEL_UP_MOVE(26, MOVE_SCREECH),\n    LEVEL_UP_MOVE(34, MOVE_ACID_ARMOR),\n    LEVEL_UP_MOVE(43, MOVE_SLUDGE_BOMB),\n    LEVEL_UP_MOVE(53, MOVE_MEMENTO),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMukLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POISON_GAS),\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(4, MOVE_HARDEN),\n    LEVEL_UP_MOVE(8, MOVE_DISABLE),\n    LEVEL_UP_MOVE(13, MOVE_SLUDGE),\n    LEVEL_UP_MOVE(19, MOVE_MINIMIZE),\n    LEVEL_UP_MOVE(26, MOVE_SCREECH),\n    LEVEL_UP_MOVE(34, MOVE_ACID_ARMOR),\n    LEVEL_UP_MOVE(47, MOVE_SLUDGE_BOMB),\n    LEVEL_UP_MOVE(61, MOVE_MEMENTO),\n    LEVEL_UP_END\n};\n\nstatic const u16 sShellderLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_WITHDRAW),\n    LEVEL_UP_MOVE(8, MOVE_ICICLE_SPEAR),\n    LEVEL_UP_MOVE(15, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM),\n    LEVEL_UP_MOVE(29, MOVE_PROTECT),\n    LEVEL_UP_MOVE(36, MOVE_LEER),\n    LEVEL_UP_MOVE(43, MOVE_CLAMP),\n    LEVEL_UP_MOVE(50, MOVE_ICE_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCloysterLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WITHDRAW),\n    LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(1, MOVE_AURORA_BEAM),\n    LEVEL_UP_MOVE(1, MOVE_PROTECT),\n    LEVEL_UP_MOVE(36, MOVE_SPIKES),\n    LEVEL_UP_MOVE(43, MOVE_SPIKE_CANNON),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGastlyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(1, MOVE_LICK),\n    LEVEL_UP_MOVE(8, MOVE_SPITE),\n    LEVEL_UP_MOVE(13, MOVE_CURSE),\n    LEVEL_UP_MOVE(16, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(28, MOVE_DREAM_EATER),\n    LEVEL_UP_MOVE(33, MOVE_DESTINY_BOND),\n    LEVEL_UP_MOVE(36, MOVE_SHADOW_BALL),\n    LEVEL_UP_MOVE(41, MOVE_NIGHTMARE),\n    LEVEL_UP_MOVE(48, MOVE_MEAN_LOOK),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHaunterLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(1, MOVE_LICK),\n    LEVEL_UP_MOVE(1, MOVE_SPITE),\n    LEVEL_UP_MOVE(8, MOVE_SPITE),\n    LEVEL_UP_MOVE(13, MOVE_CURSE),\n    LEVEL_UP_MOVE(16, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(25, MOVE_SHADOW_PUNCH),\n    LEVEL_UP_MOVE(31, MOVE_DREAM_EATER),\n    LEVEL_UP_MOVE(39, MOVE_DESTINY_BOND),\n    LEVEL_UP_MOVE(45, MOVE_SHADOW_BALL),\n    LEVEL_UP_MOVE(53, MOVE_NIGHTMARE),\n    LEVEL_UP_MOVE(64, MOVE_MEAN_LOOK),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGengarLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(1, MOVE_LICK),\n    LEVEL_UP_MOVE(1, MOVE_SPITE),\n    LEVEL_UP_MOVE(8, MOVE_SPITE),\n    LEVEL_UP_MOVE(13, MOVE_CURSE),\n    LEVEL_UP_MOVE(16, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(25, MOVE_SHADOW_PUNCH),\n    LEVEL_UP_MOVE(31, MOVE_DREAM_EATER),\n    LEVEL_UP_MOVE(39, MOVE_DESTINY_BOND),\n    LEVEL_UP_MOVE(45, MOVE_SHADOW_BALL),\n    LEVEL_UP_MOVE(53, MOVE_NIGHTMARE),\n    LEVEL_UP_MOVE(64, MOVE_MEAN_LOOK),\n    LEVEL_UP_END\n};\n\nstatic const u16 sOnixLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_SCREECH),\n    LEVEL_UP_MOVE(8, MOVE_BIND),\n    LEVEL_UP_MOVE(12, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(19, MOVE_HARDEN),\n    LEVEL_UP_MOVE(23, MOVE_RAGE),\n    LEVEL_UP_MOVE(30, MOVE_DRAGON_BREATH),\n    LEVEL_UP_MOVE(34, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(41, MOVE_SLAM),\n    LEVEL_UP_MOVE(45, MOVE_IRON_TAIL),\n    LEVEL_UP_MOVE(52, MOVE_SAND_TOMB),\n    LEVEL_UP_MOVE(56, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDrowzeeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(7, MOVE_DISABLE),\n    LEVEL_UP_MOVE(11, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(17, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(21, MOVE_POISON_GAS),\n    LEVEL_UP_MOVE(27, MOVE_MEDITATE),\n    LEVEL_UP_MOVE(31, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(37, MOVE_PSYCH_UP),\n    LEVEL_UP_MOVE(41, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(47, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHypnoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_NIGHTMARE),\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(1, MOVE_DISABLE),\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(7, MOVE_DISABLE),\n    LEVEL_UP_MOVE(11, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(17, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(21, MOVE_POISON_GAS),\n    LEVEL_UP_MOVE(29, MOVE_MEDITATE),\n    LEVEL_UP_MOVE(35, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(43, MOVE_PSYCH_UP),\n    LEVEL_UP_MOVE(49, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(57, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sKrabbyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(5, MOVE_LEER),\n    LEVEL_UP_MOVE(12, MOVE_VICE_GRIP),\n    LEVEL_UP_MOVE(16, MOVE_HARDEN),\n    LEVEL_UP_MOVE(23, MOVE_MUD_SHOT),\n    LEVEL_UP_MOVE(27, MOVE_STOMP),\n    LEVEL_UP_MOVE(34, MOVE_GUILLOTINE),\n    LEVEL_UP_MOVE(38, MOVE_PROTECT),\n    LEVEL_UP_MOVE(45, MOVE_CRABHAMMER),\n    LEVEL_UP_MOVE(49, MOVE_FLAIL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sKinglerLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_VICE_GRIP),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(5, MOVE_LEER),\n    LEVEL_UP_MOVE(12, MOVE_VICE_GRIP),\n    LEVEL_UP_MOVE(16, MOVE_HARDEN),\n    LEVEL_UP_MOVE(23, MOVE_MUD_SHOT),\n    LEVEL_UP_MOVE(27, MOVE_STOMP),\n    LEVEL_UP_MOVE(38, MOVE_GUILLOTINE),\n    LEVEL_UP_MOVE(42, MOVE_PROTECT),\n    LEVEL_UP_MOVE(57, MOVE_CRABHAMMER),\n    LEVEL_UP_MOVE(65, MOVE_FLAIL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sVoltorbLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CHARGE),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(8, MOVE_SCREECH),\n    LEVEL_UP_MOVE(15, MOVE_SONIC_BOOM),\n    LEVEL_UP_MOVE(21, MOVE_SPARK),\n    LEVEL_UP_MOVE(27, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(32, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(37, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(42, MOVE_SWIFT),\n    LEVEL_UP_MOVE(46, MOVE_EXPLOSION),\n    LEVEL_UP_MOVE(49, MOVE_MIRROR_COAT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sElectrodeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CHARGE),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_SCREECH),\n    LEVEL_UP_MOVE(1, MOVE_SONIC_BOOM),\n    LEVEL_UP_MOVE(8, MOVE_SCREECH),\n    LEVEL_UP_MOVE(15, MOVE_SONIC_BOOM),\n    LEVEL_UP_MOVE(21, MOVE_SPARK),\n    LEVEL_UP_MOVE(27, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(34, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(48, MOVE_SWIFT),\n    LEVEL_UP_MOVE(54, MOVE_EXPLOSION),\n    LEVEL_UP_MOVE(59, MOVE_MIRROR_COAT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sExeggcuteLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BARRAGE),\n    LEVEL_UP_MOVE(1, MOVE_UPROAR),\n    LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(7, MOVE_REFLECT),\n    LEVEL_UP_MOVE(13, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(19, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(25, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(31, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(37, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(43, MOVE_SOLAR_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sExeggutorLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BARRAGE),\n    LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(19, MOVE_STOMP),\n    LEVEL_UP_MOVE(31, MOVE_EGG_BOMB),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCuboneLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(9, MOVE_BONE_CLUB),\n    LEVEL_UP_MOVE(13, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(17, MOVE_LEER),\n    LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(25, MOVE_BONEMERANG),\n    LEVEL_UP_MOVE(29, MOVE_RAGE),\n    LEVEL_UP_MOVE(33, MOVE_FALSE_SWIPE),\n    LEVEL_UP_MOVE(37, MOVE_THRASH),\n    LEVEL_UP_MOVE(41, MOVE_BONE_RUSH),\n    LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMarowakLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_BONE_CLUB),\n    LEVEL_UP_MOVE(1, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(9, MOVE_BONE_CLUB),\n    LEVEL_UP_MOVE(13, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(17, MOVE_LEER),\n    LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(25, MOVE_BONEMERANG),\n    LEVEL_UP_MOVE(32, MOVE_RAGE),\n    LEVEL_UP_MOVE(39, MOVE_FALSE_SWIPE),\n    LEVEL_UP_MOVE(46, MOVE_THRASH),\n    LEVEL_UP_MOVE(53, MOVE_BONE_RUSH),\n    LEVEL_UP_MOVE(61, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHitmonleeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_REVENGE),\n    LEVEL_UP_MOVE(1, MOVE_DOUBLE_KICK),\n    LEVEL_UP_MOVE(6, MOVE_MEDITATE),\n    LEVEL_UP_MOVE(11, MOVE_ROLLING_KICK),\n    LEVEL_UP_MOVE(16, MOVE_JUMP_KICK),\n    LEVEL_UP_MOVE(20, MOVE_BRICK_BREAK),\n    LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(26, MOVE_HI_JUMP_KICK),\n    LEVEL_UP_MOVE(31, MOVE_MIND_READER),\n    LEVEL_UP_MOVE(36, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(41, MOVE_ENDURE),\n    LEVEL_UP_MOVE(46, MOVE_MEGA_KICK),\n    LEVEL_UP_MOVE(51, MOVE_REVERSAL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHitmonchanLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_REVENGE),\n    LEVEL_UP_MOVE(1, MOVE_COMET_PUNCH),\n    LEVEL_UP_MOVE(7, MOVE_AGILITY),\n    LEVEL_UP_MOVE(13, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(20, MOVE_MACH_PUNCH),\n    LEVEL_UP_MOVE(26, MOVE_THUNDER_PUNCH),\n    LEVEL_UP_MOVE(26, MOVE_ICE_PUNCH),\n    LEVEL_UP_MOVE(26, MOVE_FIRE_PUNCH),\n    LEVEL_UP_MOVE(32, MOVE_SKY_UPPERCUT),\n    LEVEL_UP_MOVE(38, MOVE_MEGA_PUNCH),\n    LEVEL_UP_MOVE(44, MOVE_DETECT),\n    LEVEL_UP_MOVE(50, MOVE_COUNTER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLickitungLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LICK),\n    LEVEL_UP_MOVE(7, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(12, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(18, MOVE_KNOCK_OFF),\n    LEVEL_UP_MOVE(23, MOVE_STOMP),\n    LEVEL_UP_MOVE(29, MOVE_WRAP),\n    LEVEL_UP_MOVE(34, MOVE_DISABLE),\n    LEVEL_UP_MOVE(40, MOVE_SLAM),\n    LEVEL_UP_MOVE(45, MOVE_SCREECH),\n    LEVEL_UP_MOVE(51, MOVE_REFRESH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sKoffingLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POISON_GAS),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(9, MOVE_SMOG),\n    LEVEL_UP_MOVE(17, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(21, MOVE_SLUDGE),\n    LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(33, MOVE_HAZE),\n    LEVEL_UP_MOVE(41, MOVE_EXPLOSION),\n    LEVEL_UP_MOVE(45, MOVE_DESTINY_BOND),\n    LEVEL_UP_MOVE(49, MOVE_MEMENTO),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWeezingLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POISON_GAS),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_SMOG),\n    LEVEL_UP_MOVE(1, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(9, MOVE_SMOG),\n    LEVEL_UP_MOVE(17, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(21, MOVE_SLUDGE),\n    LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(33, MOVE_HAZE),\n    LEVEL_UP_MOVE(44, MOVE_EXPLOSION),\n    LEVEL_UP_MOVE(51, MOVE_DESTINY_BOND),\n    LEVEL_UP_MOVE(58, MOVE_MEMENTO),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRhyhornLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HORN_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(10, MOVE_STOMP),\n    LEVEL_UP_MOVE(15, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(24, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(29, MOVE_ROCK_BLAST),\n    LEVEL_UP_MOVE(38, MOVE_HORN_DRILL),\n    LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(52, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(57, MOVE_MEGAHORN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRhydonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HORN_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_STOMP),\n    LEVEL_UP_MOVE(1, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(10, MOVE_STOMP),\n    LEVEL_UP_MOVE(15, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(24, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(29, MOVE_ROCK_BLAST),\n    LEVEL_UP_MOVE(38, MOVE_HORN_DRILL),\n    LEVEL_UP_MOVE(46, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(58, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(66, MOVE_MEGAHORN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sChanseyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(9, MOVE_REFRESH),\n    LEVEL_UP_MOVE(13, MOVE_SOFT_BOILED),\n    LEVEL_UP_MOVE(17, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_MOVE(23, MOVE_MINIMIZE),\n    LEVEL_UP_MOVE(29, MOVE_SING),\n    LEVEL_UP_MOVE(35, MOVE_EGG_BOMB),\n    LEVEL_UP_MOVE(41, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(49, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTangelaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_INGRAIN),\n    LEVEL_UP_MOVE(1, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(4, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(10, MOVE_ABSORB),\n    LEVEL_UP_MOVE(13, MOVE_GROWTH),\n    LEVEL_UP_MOVE(19, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(22, MOVE_VINE_WHIP),\n    LEVEL_UP_MOVE(28, MOVE_BIND),\n    LEVEL_UP_MOVE(31, MOVE_MEGA_DRAIN),\n    LEVEL_UP_MOVE(37, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(40, MOVE_SLAM),\n    LEVEL_UP_MOVE(46, MOVE_TICKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sKangaskhanLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_COMET_PUNCH),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(7, MOVE_BITE),\n    LEVEL_UP_MOVE(13, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(19, MOVE_FAKE_OUT),\n    LEVEL_UP_MOVE(25, MOVE_MEGA_PUNCH),\n    LEVEL_UP_MOVE(31, MOVE_RAGE),\n    LEVEL_UP_MOVE(37, MOVE_ENDURE),\n    LEVEL_UP_MOVE(43, MOVE_DIZZY_PUNCH),\n    LEVEL_UP_MOVE(49, MOVE_REVERSAL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHorseaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(8, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(15, MOVE_LEER),\n    LEVEL_UP_MOVE(22, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(29, MOVE_TWISTER),\n    LEVEL_UP_MOVE(36, MOVE_AGILITY),\n    LEVEL_UP_MOVE(43, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSeadraLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(1, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(8, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(15, MOVE_LEER),\n    LEVEL_UP_MOVE(22, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(29, MOVE_TWISTER),\n    LEVEL_UP_MOVE(40, MOVE_AGILITY),\n    LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(62, MOVE_DRAGON_DANCE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGoldeenLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(10, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(15, MOVE_HORN_ATTACK),\n    LEVEL_UP_MOVE(24, MOVE_FLAIL),\n    LEVEL_UP_MOVE(29, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(38, MOVE_WATERFALL),\n    LEVEL_UP_MOVE(43, MOVE_HORN_DRILL),\n    LEVEL_UP_MOVE(52, MOVE_AGILITY),\n    LEVEL_UP_MOVE(57, MOVE_MEGAHORN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSeakingLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(10, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(15, MOVE_HORN_ATTACK),\n    LEVEL_UP_MOVE(24, MOVE_FLAIL),\n    LEVEL_UP_MOVE(29, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(41, MOVE_WATERFALL),\n    LEVEL_UP_MOVE(49, MOVE_HORN_DRILL),\n    LEVEL_UP_MOVE(61, MOVE_AGILITY),\n    LEVEL_UP_MOVE(69, MOVE_MEGAHORN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sStaryuLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(6, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(10, MOVE_RAPID_SPIN),\n    LEVEL_UP_MOVE(15, MOVE_RECOVER),\n    LEVEL_UP_MOVE(19, MOVE_CAMOUFLAGE),\n    LEVEL_UP_MOVE(24, MOVE_SWIFT),\n    LEVEL_UP_MOVE(28, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(33, MOVE_MINIMIZE),\n    LEVEL_UP_MOVE(37, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(42, MOVE_COSMIC_POWER),\n    LEVEL_UP_MOVE(46, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sStarmieLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(1, MOVE_RAPID_SPIN),\n    LEVEL_UP_MOVE(1, MOVE_RECOVER),\n    LEVEL_UP_MOVE(1, MOVE_SWIFT),\n    LEVEL_UP_MOVE(33, MOVE_CONFUSE_RAY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMrMimeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BARRIER),\n    LEVEL_UP_MOVE(5, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(8, MOVE_SUBSTITUTE),\n    LEVEL_UP_MOVE(12, MOVE_MEDITATE),\n    LEVEL_UP_MOVE(15, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_MOVE(19, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(19, MOVE_REFLECT),\n    LEVEL_UP_MOVE(22, MOVE_MAGICAL_LEAF),\n    LEVEL_UP_MOVE(26, MOVE_ENCORE),\n    LEVEL_UP_MOVE(29, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(33, MOVE_RECYCLE),\n    LEVEL_UP_MOVE(36, MOVE_TRICK),\n    LEVEL_UP_MOVE(40, MOVE_ROLE_PLAY),\n    LEVEL_UP_MOVE(43, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(47, MOVE_BATON_PASS),\n    LEVEL_UP_MOVE(50, MOVE_SAFEGUARD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sScytherLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(6, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(11, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(16, MOVE_FALSE_SWIPE),\n    LEVEL_UP_MOVE(21, MOVE_AGILITY),\n    LEVEL_UP_MOVE(26, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(31, MOVE_SLASH),\n    LEVEL_UP_MOVE(36, MOVE_SWORDS_DANCE),\n    LEVEL_UP_MOVE(41, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sJynxLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_LICK),\n    LEVEL_UP_MOVE(1, MOVE_LOVELY_KISS),\n    LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(9, MOVE_LOVELY_KISS),\n    LEVEL_UP_MOVE(13, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(21, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_MOVE(25, MOVE_ICE_PUNCH),\n    LEVEL_UP_MOVE(35, MOVE_MEAN_LOOK),\n    LEVEL_UP_MOVE(41, MOVE_FAKE_TEARS),\n    LEVEL_UP_MOVE(51, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(57, MOVE_PERISH_SONG),\n    LEVEL_UP_MOVE(67, MOVE_BLIZZARD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sElectabuzzLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_PUNCH),\n    LEVEL_UP_MOVE(9, MOVE_THUNDER_PUNCH),\n    LEVEL_UP_MOVE(17, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(25, MOVE_SWIFT),\n    LEVEL_UP_MOVE(36, MOVE_SCREECH),\n    LEVEL_UP_MOVE(47, MOVE_THUNDERBOLT),\n    LEVEL_UP_MOVE(58, MOVE_THUNDER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMagmarLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_SMOG),\n    LEVEL_UP_MOVE(1, MOVE_FIRE_PUNCH),\n    LEVEL_UP_MOVE(7, MOVE_LEER),\n    LEVEL_UP_MOVE(13, MOVE_SMOG),\n    LEVEL_UP_MOVE(19, MOVE_FIRE_PUNCH),\n    LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(33, MOVE_SUNNY_DAY),\n    LEVEL_UP_MOVE(41, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(49, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(57, MOVE_FIRE_BLAST),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPinsirLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_VICE_GRIP),\n    LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(7, MOVE_BIND),\n    LEVEL_UP_MOVE(13, MOVE_SEISMIC_TOSS),\n    LEVEL_UP_MOVE(19, MOVE_HARDEN),\n    LEVEL_UP_MOVE(25, MOVE_REVENGE),\n    LEVEL_UP_MOVE(31, MOVE_BRICK_BREAK),\n    LEVEL_UP_MOVE(37, MOVE_GUILLOTINE),\n    LEVEL_UP_MOVE(43, MOVE_SUBMISSION),\n    LEVEL_UP_MOVE(49, MOVE_SWORDS_DANCE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTaurosLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(4, MOVE_RAGE),\n    LEVEL_UP_MOVE(8, MOVE_HORN_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(19, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(26, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(34, MOVE_REST),\n    LEVEL_UP_MOVE(43, MOVE_THRASH),\n    LEVEL_UP_MOVE(53, MOVE_TAKE_DOWN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMagikarpLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SPLASH),\n    LEVEL_UP_MOVE(15, MOVE_TACKLE),\n    LEVEL_UP_MOVE(30, MOVE_FLAIL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGyaradosLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_THRASH),\n    LEVEL_UP_MOVE(20, MOVE_BITE),\n    LEVEL_UP_MOVE(25, MOVE_DRAGON_RAGE),\n    LEVEL_UP_MOVE(30, MOVE_LEER),\n    LEVEL_UP_MOVE(35, MOVE_TWISTER),\n    LEVEL_UP_MOVE(40, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(45, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE),\n    LEVEL_UP_MOVE(55, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLaprasLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_SING),\n    LEVEL_UP_MOVE(7, MOVE_MIST),\n    LEVEL_UP_MOVE(13, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(19, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(25, MOVE_PERISH_SONG),\n    LEVEL_UP_MOVE(31, MOVE_ICE_BEAM),\n    LEVEL_UP_MOVE(37, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(43, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(55, MOVE_SHEER_COLD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDittoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TRANSFORM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sEeveeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(16, MOVE_GROWL),\n    LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(30, MOVE_BITE),\n    LEVEL_UP_MOVE(36, MOVE_BATON_PASS),\n    LEVEL_UP_MOVE(42, MOVE_TAKE_DOWN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sVaporeonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(16, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(30, MOVE_BITE),\n    LEVEL_UP_MOVE(36, MOVE_AURORA_BEAM),\n    LEVEL_UP_MOVE(42, MOVE_HAZE),\n    LEVEL_UP_MOVE(47, MOVE_ACID_ARMOR),\n    LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sJolteonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(16, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(30, MOVE_DOUBLE_KICK),\n    LEVEL_UP_MOVE(36, MOVE_PIN_MISSILE),\n    LEVEL_UP_MOVE(42, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(47, MOVE_AGILITY),\n    LEVEL_UP_MOVE(52, MOVE_THUNDER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sFlareonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(16, MOVE_EMBER),\n    LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(30, MOVE_BITE),\n    LEVEL_UP_MOVE(36, MOVE_FIRE_SPIN),\n    LEVEL_UP_MOVE(42, MOVE_SMOG),\n    LEVEL_UP_MOVE(47, MOVE_LEER),\n    LEVEL_UP_MOVE(52, MOVE_FLAMETHROWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPorygonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CONVERSION_2),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_CONVERSION),\n    LEVEL_UP_MOVE(9, MOVE_AGILITY),\n    LEVEL_UP_MOVE(12, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(20, MOVE_RECOVER),\n    LEVEL_UP_MOVE(24, MOVE_SHARPEN),\n    LEVEL_UP_MOVE(32, MOVE_LOCK_ON),\n    LEVEL_UP_MOVE(36, MOVE_TRI_ATTACK),\n    LEVEL_UP_MOVE(44, MOVE_RECYCLE),\n    LEVEL_UP_MOVE(48, MOVE_ZAP_CANNON),\n    LEVEL_UP_END\n};\n\nstatic const u16 sOmanyteLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(1, MOVE_WITHDRAW),\n    LEVEL_UP_MOVE(13, MOVE_BITE),\n    LEVEL_UP_MOVE(19, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(25, MOVE_MUD_SHOT),\n    LEVEL_UP_MOVE(31, MOVE_LEER),\n    LEVEL_UP_MOVE(37, MOVE_PROTECT),\n    LEVEL_UP_MOVE(43, MOVE_TICKLE),\n    LEVEL_UP_MOVE(49, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sOmastarLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(1, MOVE_WITHDRAW),\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(13, MOVE_BITE),\n    LEVEL_UP_MOVE(19, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(25, MOVE_MUD_SHOT),\n    LEVEL_UP_MOVE(31, MOVE_LEER),\n    LEVEL_UP_MOVE(37, MOVE_PROTECT),\n    LEVEL_UP_MOVE(40, MOVE_SPIKE_CANNON),\n    LEVEL_UP_MOVE(46, MOVE_TICKLE),\n    LEVEL_UP_MOVE(55, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(65, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sKabutoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(13, MOVE_ABSORB),\n    LEVEL_UP_MOVE(19, MOVE_LEER),\n    LEVEL_UP_MOVE(25, MOVE_MUD_SHOT),\n    LEVEL_UP_MOVE(31, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(37, MOVE_ENDURE),\n    LEVEL_UP_MOVE(43, MOVE_METAL_SOUND),\n    LEVEL_UP_MOVE(49, MOVE_MEGA_DRAIN),\n    LEVEL_UP_MOVE(55, MOVE_ANCIENT_POWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sKabutopsLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_FURY_CUTTER),\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(13, MOVE_ABSORB),\n    LEVEL_UP_MOVE(19, MOVE_LEER),\n    LEVEL_UP_MOVE(25, MOVE_MUD_SHOT),\n    LEVEL_UP_MOVE(31, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(37, MOVE_ENDURE),\n    LEVEL_UP_MOVE(40, MOVE_SLASH),\n    LEVEL_UP_MOVE(46, MOVE_METAL_SOUND),\n    LEVEL_UP_MOVE(55, MOVE_MEGA_DRAIN),\n    LEVEL_UP_MOVE(65, MOVE_ANCIENT_POWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAerodactylLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(8, MOVE_AGILITY),\n    LEVEL_UP_MOVE(15, MOVE_BITE),\n    LEVEL_UP_MOVE(22, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(29, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(36, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSnorlaxLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(5, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(9, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(13, MOVE_BELLY_DRUM),\n    LEVEL_UP_MOVE(17, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(21, MOVE_YAWN),\n    LEVEL_UP_MOVE(25, MOVE_REST),\n    LEVEL_UP_MOVE(29, MOVE_SNORE),\n    LEVEL_UP_MOVE(33, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(37, MOVE_SLEEP_TALK),\n    LEVEL_UP_MOVE(41, MOVE_BLOCK),\n    LEVEL_UP_MOVE(45, MOVE_COVET),\n    LEVEL_UP_MOVE(49, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(53, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sArticunoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GUST),\n    LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(13, MOVE_MIST),\n    LEVEL_UP_MOVE(25, MOVE_AGILITY),\n    LEVEL_UP_MOVE(37, MOVE_MIND_READER),\n    LEVEL_UP_MOVE(49, MOVE_ICE_BEAM),\n    LEVEL_UP_MOVE(61, MOVE_REFLECT),\n    LEVEL_UP_MOVE(73, MOVE_BLIZZARD),\n    LEVEL_UP_MOVE(85, MOVE_SHEER_COLD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sZapdosLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(13, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(25, MOVE_AGILITY),\n    LEVEL_UP_MOVE(37, MOVE_DETECT),\n    LEVEL_UP_MOVE(49, MOVE_DRILL_PECK),\n    LEVEL_UP_MOVE(61, MOVE_CHARGE),\n    LEVEL_UP_MOVE(73, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(85, MOVE_THUNDER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMoltresLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(13, MOVE_FIRE_SPIN),\n    LEVEL_UP_MOVE(25, MOVE_AGILITY),\n    LEVEL_UP_MOVE(37, MOVE_ENDURE),\n    LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(61, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(73, MOVE_HEAT_WAVE),\n    LEVEL_UP_MOVE(85, MOVE_SKY_ATTACK),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDratiniLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WRAP),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(15, MOVE_TWISTER),\n    LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE),\n    LEVEL_UP_MOVE(29, MOVE_SLAM),\n    LEVEL_UP_MOVE(36, MOVE_AGILITY),\n    LEVEL_UP_MOVE(43, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(50, MOVE_OUTRAGE),\n    LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDragonairLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WRAP),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(1, MOVE_TWISTER),\n    LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(15, MOVE_TWISTER),\n    LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE),\n    LEVEL_UP_MOVE(29, MOVE_SLAM),\n    LEVEL_UP_MOVE(38, MOVE_AGILITY),\n    LEVEL_UP_MOVE(47, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(56, MOVE_OUTRAGE),\n    LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDragoniteLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WRAP),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(1, MOVE_TWISTER),\n    LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(15, MOVE_TWISTER),\n    LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE),\n    LEVEL_UP_MOVE(29, MOVE_SLAM),\n    LEVEL_UP_MOVE(38, MOVE_AGILITY),\n    LEVEL_UP_MOVE(47, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(55, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(61, MOVE_OUTRAGE),\n    LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMewtwoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(1, MOVE_DISABLE),\n    LEVEL_UP_MOVE(11, MOVE_BARRIER),\n    LEVEL_UP_MOVE(22, MOVE_MIST),\n    LEVEL_UP_MOVE(33, MOVE_SWIFT),\n    LEVEL_UP_MOVE(44, MOVE_RECOVER),\n    LEVEL_UP_MOVE(55, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(66, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(77, MOVE_PSYCH_UP),\n    LEVEL_UP_MOVE(88, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(99, MOVE_AMNESIA),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMewLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(10, MOVE_TRANSFORM),\n    LEVEL_UP_MOVE(20, MOVE_MEGA_PUNCH),\n    LEVEL_UP_MOVE(30, MOVE_METRONOME),\n    LEVEL_UP_MOVE(40, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(50, MOVE_ANCIENT_POWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sChikoritaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(8, MOVE_RAZOR_LEAF),\n    LEVEL_UP_MOVE(12, MOVE_REFLECT),\n    LEVEL_UP_MOVE(15, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(22, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(29, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(36, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(43, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(50, MOVE_SOLAR_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBayleefLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_RAZOR_LEAF),\n    LEVEL_UP_MOVE(1, MOVE_REFLECT),\n    LEVEL_UP_MOVE(8, MOVE_RAZOR_LEAF),\n    LEVEL_UP_MOVE(12, MOVE_REFLECT),\n    LEVEL_UP_MOVE(15, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(23, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(31, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(39, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(47, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(55, MOVE_SOLAR_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMeganiumLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_RAZOR_LEAF),\n    LEVEL_UP_MOVE(1, MOVE_REFLECT),\n    LEVEL_UP_MOVE(8, MOVE_RAZOR_LEAF),\n    LEVEL_UP_MOVE(12, MOVE_REFLECT),\n    LEVEL_UP_MOVE(15, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(23, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(31, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(51, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(61, MOVE_SOLAR_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCyndaquilLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(6, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(12, MOVE_EMBER),\n    LEVEL_UP_MOVE(19, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(27, MOVE_FLAME_WHEEL),\n    LEVEL_UP_MOVE(36, MOVE_SWIFT),\n    LEVEL_UP_MOVE(46, MOVE_FLAMETHROWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sQuilavaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(6, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(12, MOVE_EMBER),\n    LEVEL_UP_MOVE(21, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL),\n    LEVEL_UP_MOVE(42, MOVE_SWIFT),\n    LEVEL_UP_MOVE(54, MOVE_FLAMETHROWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTyphlosionLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(6, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(12, MOVE_EMBER),\n    LEVEL_UP_MOVE(21, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL),\n    LEVEL_UP_MOVE(45, MOVE_SWIFT),\n    LEVEL_UP_MOVE(60, MOVE_FLAMETHROWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTotodileLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(7, MOVE_RAGE),\n    LEVEL_UP_MOVE(13, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(20, MOVE_BITE),\n    LEVEL_UP_MOVE(27, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(35, MOVE_SLASH),\n    LEVEL_UP_MOVE(43, MOVE_SCREECH),\n    LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCroconawLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_RAGE),\n    LEVEL_UP_MOVE(7, MOVE_RAGE),\n    LEVEL_UP_MOVE(13, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(21, MOVE_BITE),\n    LEVEL_UP_MOVE(28, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(37, MOVE_SLASH),\n    LEVEL_UP_MOVE(45, MOVE_SCREECH),\n    LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sFeraligatrLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_RAGE),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(7, MOVE_RAGE),\n    LEVEL_UP_MOVE(13, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(21, MOVE_BITE),\n    LEVEL_UP_MOVE(28, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(38, MOVE_SLASH),\n    LEVEL_UP_MOVE(47, MOVE_SCREECH),\n    LEVEL_UP_MOVE(58, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSentretLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(17, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(24, MOVE_SLAM),\n    LEVEL_UP_MOVE(31, MOVE_FOLLOW_ME),\n    LEVEL_UP_MOVE(40, MOVE_REST),\n    LEVEL_UP_MOVE(49, MOVE_AMNESIA),\n    LEVEL_UP_END\n};\n\nstatic const u16 sFurretLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(19, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(28, MOVE_SLAM),\n    LEVEL_UP_MOVE(37, MOVE_FOLLOW_ME),\n    LEVEL_UP_MOVE(48, MOVE_REST),\n    LEVEL_UP_MOVE(59, MOVE_AMNESIA),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHoothootLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(6, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(11, MOVE_PECK),\n    LEVEL_UP_MOVE(16, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(22, MOVE_REFLECT),\n    LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(34, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(48, MOVE_DREAM_EATER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNoctowlLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(6, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(11, MOVE_PECK),\n    LEVEL_UP_MOVE(16, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(25, MOVE_REFLECT),\n    LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(41, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(57, MOVE_DREAM_EATER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLedybaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(8, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(15, MOVE_COMET_PUNCH),\n    LEVEL_UP_MOVE(22, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(22, MOVE_REFLECT),\n    LEVEL_UP_MOVE(22, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(29, MOVE_BATON_PASS),\n    LEVEL_UP_MOVE(36, MOVE_SWIFT),\n    LEVEL_UP_MOVE(43, MOVE_AGILITY),\n    LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLedianLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(8, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(15, MOVE_COMET_PUNCH),\n    LEVEL_UP_MOVE(24, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(24, MOVE_REFLECT),\n    LEVEL_UP_MOVE(24, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(33, MOVE_BATON_PASS),\n    LEVEL_UP_MOVE(42, MOVE_SWIFT),\n    LEVEL_UP_MOVE(51, MOVE_AGILITY),\n    LEVEL_UP_MOVE(60, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpinarakLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(1, MOVE_STRING_SHOT),\n    LEVEL_UP_MOVE(6, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(11, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(17, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(23, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(30, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(37, MOVE_SPIDER_WEB),\n    LEVEL_UP_MOVE(45, MOVE_AGILITY),\n    LEVEL_UP_MOVE(53, MOVE_PSYCHIC),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAriadosLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(1, MOVE_STRING_SHOT),\n    LEVEL_UP_MOVE(1, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(1, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(6, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(11, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(17, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(34, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(43, MOVE_SPIDER_WEB),\n    LEVEL_UP_MOVE(53, MOVE_AGILITY),\n    LEVEL_UP_MOVE(63, MOVE_PSYCHIC),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCrobatLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCREECH),\n    LEVEL_UP_MOVE(1, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(1, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(6, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(11, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(16, MOVE_BITE),\n    LEVEL_UP_MOVE(21, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(28, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(35, MOVE_AIR_CUTTER),\n    LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK),\n    LEVEL_UP_MOVE(49, MOVE_POISON_FANG),\n    LEVEL_UP_MOVE(56, MOVE_HAZE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sChinchouLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(5, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(13, MOVE_FLAIL),\n    LEVEL_UP_MOVE(17, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(25, MOVE_SPARK),\n    LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(41, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(49, MOVE_CHARGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLanturnLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(5, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(13, MOVE_FLAIL),\n    LEVEL_UP_MOVE(17, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(25, MOVE_SPARK),\n    LEVEL_UP_MOVE(32, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(61, MOVE_CHARGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPichuLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(1, MOVE_CHARM),\n    LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(11, MOVE_SWEET_KISS),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCleffaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_CHARM),\n    LEVEL_UP_MOVE(4, MOVE_ENCORE),\n    LEVEL_UP_MOVE(8, MOVE_SING),\n    LEVEL_UP_MOVE(13, MOVE_SWEET_KISS),\n    LEVEL_UP_MOVE(17, MOVE_MAGICAL_LEAF),\n    LEVEL_UP_END\n};\n\nstatic const u16 sIgglybuffLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SING),\n    LEVEL_UP_MOVE(1, MOVE_CHARM),\n    LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(9, MOVE_POUND),\n    LEVEL_UP_MOVE(14, MOVE_SWEET_KISS),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTogepiLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_CHARM),\n    LEVEL_UP_MOVE(4, MOVE_METRONOME),\n    LEVEL_UP_MOVE(9, MOVE_SWEET_KISS),\n    LEVEL_UP_MOVE(13, MOVE_YAWN),\n    LEVEL_UP_MOVE(17, MOVE_ENCORE),\n    LEVEL_UP_MOVE(21, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(25, MOVE_FOLLOW_ME),\n    LEVEL_UP_MOVE(29, MOVE_WISH),\n    LEVEL_UP_MOVE(33, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_MOVE(41, MOVE_BATON_PASS),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTogeticLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_MAGICAL_LEAF),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_CHARM),\n    LEVEL_UP_MOVE(1, MOVE_METRONOME),\n    LEVEL_UP_MOVE(1, MOVE_SWEET_KISS),\n    LEVEL_UP_MOVE(4, MOVE_METRONOME),\n    LEVEL_UP_MOVE(9, MOVE_SWEET_KISS),\n    LEVEL_UP_MOVE(13, MOVE_YAWN),\n    LEVEL_UP_MOVE(17, MOVE_ENCORE),\n    LEVEL_UP_MOVE(21, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(25, MOVE_FOLLOW_ME),\n    LEVEL_UP_MOVE(29, MOVE_WISH),\n    LEVEL_UP_MOVE(33, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_MOVE(41, MOVE_BATON_PASS),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNatuLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(10, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(20, MOVE_TELEPORT),\n    LEVEL_UP_MOVE(30, MOVE_WISH),\n    LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(40, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(50, MOVE_PSYCHIC),\n    LEVEL_UP_END\n};\n\nstatic const u16 sXatuLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(10, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(20, MOVE_TELEPORT),\n    LEVEL_UP_MOVE(35, MOVE_WISH),\n    LEVEL_UP_MOVE(35, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(50, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(65, MOVE_PSYCHIC),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMareepLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(9, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(16, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(23, MOVE_COTTON_SPORE),\n    LEVEL_UP_MOVE(30, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(37, MOVE_THUNDER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sFlaaffyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(9, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(18, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(27, MOVE_COTTON_SPORE),\n    LEVEL_UP_MOVE(36, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(45, MOVE_THUNDER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAmpharosLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(9, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(18, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(27, MOVE_COTTON_SPORE),\n    LEVEL_UP_MOVE(30, MOVE_THUNDER_PUNCH),\n    LEVEL_UP_MOVE(42, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(57, MOVE_THUNDER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBellossomLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(1, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(1, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(1, MOVE_MAGICAL_LEAF),\n    LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE),\n    LEVEL_UP_MOVE(55, MOVE_SOLAR_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMarillLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(3, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(10, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(15, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(21, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(28, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_MOVE(36, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(45, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAzumarillLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(3, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(10, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(15, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(24, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(34, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_MOVE(45, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(57, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSudowoodoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(1, MOVE_MIMIC),\n    LEVEL_UP_MOVE(9, MOVE_FLAIL),\n    LEVEL_UP_MOVE(17, MOVE_LOW_KICK),\n    LEVEL_UP_MOVE(25, MOVE_ROCK_SLIDE),\n    LEVEL_UP_MOVE(33, MOVE_BLOCK),\n    LEVEL_UP_MOVE(41, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(49, MOVE_SLAM),\n    LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPolitoedLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_MOVE(1, MOVE_PERISH_SONG),\n    LEVEL_UP_MOVE(35, MOVE_PERISH_SONG),\n    LEVEL_UP_MOVE(51, MOVE_SWAGGER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHoppipLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SPLASH),\n    LEVEL_UP_MOVE(5, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(10, MOVE_TACKLE),\n    LEVEL_UP_MOVE(13, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(15, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(20, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(25, MOVE_COTTON_SPORE),\n    LEVEL_UP_MOVE(30, MOVE_MEGA_DRAIN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSkiploomLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SPLASH),\n    LEVEL_UP_MOVE(1, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(5, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(10, MOVE_TACKLE),\n    LEVEL_UP_MOVE(13, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(15, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(22, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(29, MOVE_COTTON_SPORE),\n    LEVEL_UP_MOVE(36, MOVE_MEGA_DRAIN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sJumpluffLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SPLASH),\n    LEVEL_UP_MOVE(1, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(5, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(10, MOVE_TACKLE),\n    LEVEL_UP_MOVE(13, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(15, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER),\n    LEVEL_UP_MOVE(22, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(33, MOVE_COTTON_SPORE),\n    LEVEL_UP_MOVE(44, MOVE_MEGA_DRAIN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAipomLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(6, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(18, MOVE_BATON_PASS),\n    LEVEL_UP_MOVE(25, MOVE_TICKLE),\n    LEVEL_UP_MOVE(31, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(38, MOVE_SWIFT),\n    LEVEL_UP_MOVE(43, MOVE_SCREECH),\n    LEVEL_UP_MOVE(50, MOVE_AGILITY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSunkernLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(6, MOVE_GROWTH),\n    LEVEL_UP_MOVE(13, MOVE_MEGA_DRAIN),\n    LEVEL_UP_MOVE(18, MOVE_INGRAIN),\n    LEVEL_UP_MOVE(25, MOVE_ENDEAVOR),\n    LEVEL_UP_MOVE(30, MOVE_SUNNY_DAY),\n    LEVEL_UP_MOVE(37, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(42, MOVE_GIGA_DRAIN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSunfloraLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(6, MOVE_GROWTH),\n    LEVEL_UP_MOVE(13, MOVE_RAZOR_LEAF),\n    LEVEL_UP_MOVE(18, MOVE_INGRAIN),\n    LEVEL_UP_MOVE(25, MOVE_BULLET_SEED),\n    LEVEL_UP_MOVE(30, MOVE_SUNNY_DAY),\n    LEVEL_UP_MOVE(37, MOVE_PETAL_DANCE),\n    LEVEL_UP_MOVE(42, MOVE_SOLAR_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sYanmaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(6, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(12, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(17, MOVE_SONIC_BOOM),\n    LEVEL_UP_MOVE(23, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(28, MOVE_DETECT),\n    LEVEL_UP_MOVE(34, MOVE_UPROAR),\n    LEVEL_UP_MOVE(39, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(45, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(50, MOVE_SCREECH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWooperLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(11, MOVE_SLAM),\n    LEVEL_UP_MOVE(16, MOVE_MUD_SHOT),\n    LEVEL_UP_MOVE(21, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(31, MOVE_YAWN),\n    LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(41, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(51, MOVE_MIST),\n    LEVEL_UP_MOVE(51, MOVE_HAZE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sQuagsireLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(11, MOVE_SLAM),\n    LEVEL_UP_MOVE(16, MOVE_MUD_SHOT),\n    LEVEL_UP_MOVE(23, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(35, MOVE_YAWN),\n    LEVEL_UP_MOVE(42, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(49, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(61, MOVE_MIST),\n    LEVEL_UP_MOVE(61, MOVE_HAZE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sEspeonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(16, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(30, MOVE_SWIFT),\n    LEVEL_UP_MOVE(36, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(42, MOVE_PSYCH_UP),\n    LEVEL_UP_MOVE(47, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(52, MOVE_MORNING_SUN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sUmbreonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(16, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(30, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(36, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK),\n    LEVEL_UP_MOVE(47, MOVE_SCREECH),\n    LEVEL_UP_MOVE(52, MOVE_MOONLIGHT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMurkrowLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(9, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(14, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(22, MOVE_HAZE),\n    LEVEL_UP_MOVE(27, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(35, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(40, MOVE_TAUNT),\n    LEVEL_UP_MOVE(48, MOVE_MEAN_LOOK),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSlowkingLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CURSE),\n    LEVEL_UP_MOVE(1, MOVE_YAWN),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(6, MOVE_GROWL),\n    LEVEL_UP_MOVE(13, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(17, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(24, MOVE_DISABLE),\n    LEVEL_UP_MOVE(29, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(36, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(40, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(47, MOVE_PSYCH_UP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMisdreavusLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_PSYWAVE),\n    LEVEL_UP_MOVE(6, MOVE_SPITE),\n    LEVEL_UP_MOVE(11, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(17, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(23, MOVE_MEAN_LOOK),\n    LEVEL_UP_MOVE(30, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(37, MOVE_PAIN_SPLIT),\n    LEVEL_UP_MOVE(45, MOVE_PERISH_SONG),\n    LEVEL_UP_MOVE(53, MOVE_GRUDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sUnownLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HIDDEN_POWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWobbuffetLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_COUNTER),\n    LEVEL_UP_MOVE(1, MOVE_MIRROR_COAT),\n    LEVEL_UP_MOVE(1, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(1, MOVE_DESTINY_BOND),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGirafarigLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(7, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(13, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(19, MOVE_STOMP),\n    LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(31, MOVE_AGILITY),\n    LEVEL_UP_MOVE(37, MOVE_BATON_PASS),\n    LEVEL_UP_MOVE(43, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(49, MOVE_CRUNCH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPinecoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_PROTECT),\n    LEVEL_UP_MOVE(8, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(22, MOVE_RAPID_SPIN),\n    LEVEL_UP_MOVE(29, MOVE_BIDE),\n    LEVEL_UP_MOVE(36, MOVE_EXPLOSION),\n    LEVEL_UP_MOVE(43, MOVE_SPIKES),\n    LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sForretressLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_PROTECT),\n    LEVEL_UP_MOVE(1, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(8, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(22, MOVE_RAPID_SPIN),\n    LEVEL_UP_MOVE(29, MOVE_BIDE),\n    LEVEL_UP_MOVE(31, MOVE_ZAP_CANNON),\n    LEVEL_UP_MOVE(39, MOVE_EXPLOSION),\n    LEVEL_UP_MOVE(49, MOVE_SPIKES),\n    LEVEL_UP_MOVE(59, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDunsparceLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_RAGE),\n    LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(11, MOVE_YAWN),\n    LEVEL_UP_MOVE(14, MOVE_GLARE),\n    LEVEL_UP_MOVE(21, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(24, MOVE_SPITE),\n    LEVEL_UP_MOVE(31, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(34, MOVE_SCREECH),\n    LEVEL_UP_MOVE(41, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(44, MOVE_FLAIL),\n    LEVEL_UP_MOVE(51, MOVE_ENDEAVOR),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGligarLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(6, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_HARDEN),\n    LEVEL_UP_MOVE(20, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(28, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(36, MOVE_SLASH),\n    LEVEL_UP_MOVE(44, MOVE_SCREECH),\n    LEVEL_UP_MOVE(52, MOVE_GUILLOTINE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSteelixLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_SCREECH),\n    LEVEL_UP_MOVE(8, MOVE_BIND),\n    LEVEL_UP_MOVE(12, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(19, MOVE_HARDEN),\n    LEVEL_UP_MOVE(23, MOVE_RAGE),\n    LEVEL_UP_MOVE(30, MOVE_DRAGON_BREATH),\n    LEVEL_UP_MOVE(34, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(41, MOVE_SLAM),\n    LEVEL_UP_MOVE(45, MOVE_IRON_TAIL),\n    LEVEL_UP_MOVE(52, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(56, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSnubbullLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(8, MOVE_CHARM),\n    LEVEL_UP_MOVE(13, MOVE_BITE),\n    LEVEL_UP_MOVE(19, MOVE_LICK),\n    LEVEL_UP_MOVE(26, MOVE_ROAR),\n    LEVEL_UP_MOVE(34, MOVE_RAGE),\n    LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(53, MOVE_CRUNCH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGranbullLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(8, MOVE_CHARM),\n    LEVEL_UP_MOVE(13, MOVE_BITE),\n    LEVEL_UP_MOVE(19, MOVE_LICK),\n    LEVEL_UP_MOVE(28, MOVE_ROAR),\n    LEVEL_UP_MOVE(38, MOVE_RAGE),\n    LEVEL_UP_MOVE(49, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(61, MOVE_CRUNCH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sQwilfishLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SPIKES),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(9, MOVE_HARDEN),\n    LEVEL_UP_MOVE(9, MOVE_MINIMIZE),\n    LEVEL_UP_MOVE(13, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE),\n    LEVEL_UP_MOVE(25, MOVE_REVENGE),\n    LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(37, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(45, MOVE_DESTINY_BOND),\n    LEVEL_UP_END\n};\n\nstatic const u16 sScizorLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(6, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(11, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(16, MOVE_FALSE_SWIPE),\n    LEVEL_UP_MOVE(21, MOVE_AGILITY),\n    LEVEL_UP_MOVE(26, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(31, MOVE_SLASH),\n    LEVEL_UP_MOVE(36, MOVE_SWORDS_DANCE),\n    LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE),\n    LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sShuckleLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(1, MOVE_WITHDRAW),\n    LEVEL_UP_MOVE(9, MOVE_WRAP),\n    LEVEL_UP_MOVE(14, MOVE_ENCORE),\n    LEVEL_UP_MOVE(23, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(28, MOVE_BIDE),\n    LEVEL_UP_MOVE(37, MOVE_REST),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHeracrossLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(6, MOVE_HORN_ATTACK),\n    LEVEL_UP_MOVE(11, MOVE_ENDURE),\n    LEVEL_UP_MOVE(17, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(23, MOVE_BRICK_BREAK),\n    LEVEL_UP_MOVE(30, MOVE_COUNTER),\n    LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(45, MOVE_REVERSAL),\n    LEVEL_UP_MOVE(53, MOVE_MEGAHORN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSneaselLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_TAUNT),\n    LEVEL_UP_MOVE(8, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(15, MOVE_SCREECH),\n    LEVEL_UP_MOVE(22, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(29, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(36, MOVE_AGILITY),\n    LEVEL_UP_MOVE(43, MOVE_ICY_WIND),\n    LEVEL_UP_MOVE(50, MOVE_SLASH),\n    LEVEL_UP_MOVE(57, MOVE_BEAT_UP),\n    LEVEL_UP_MOVE(64, MOVE_METAL_CLAW),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTeddiursaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(7, MOVE_LICK),\n    LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(19, MOVE_FAKE_TEARS),\n    LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(31, MOVE_REST),\n    LEVEL_UP_MOVE(37, MOVE_SLASH),\n    LEVEL_UP_MOVE(43, MOVE_SNORE),\n    LEVEL_UP_MOVE(49, MOVE_THRASH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sUrsaringLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_LICK),\n    LEVEL_UP_MOVE(1, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(7, MOVE_LICK),\n    LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(19, MOVE_FAKE_TEARS),\n    LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(31, MOVE_REST),\n    LEVEL_UP_MOVE(37, MOVE_SLASH),\n    LEVEL_UP_MOVE(43, MOVE_SNORE),\n    LEVEL_UP_MOVE(49, MOVE_THRASH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSlugmaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_YAWN),\n    LEVEL_UP_MOVE(1, MOVE_SMOG),\n    LEVEL_UP_MOVE(8, MOVE_EMBER),\n    LEVEL_UP_MOVE(15, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(22, MOVE_HARDEN),\n    LEVEL_UP_MOVE(29, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(43, MOVE_ROCK_SLIDE),\n    LEVEL_UP_MOVE(50, MOVE_BODY_SLAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMagcargoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_YAWN),\n    LEVEL_UP_MOVE(1, MOVE_SMOG),\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(1, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(8, MOVE_EMBER),\n    LEVEL_UP_MOVE(15, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(22, MOVE_HARDEN),\n    LEVEL_UP_MOVE(29, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(48, MOVE_ROCK_SLIDE),\n    LEVEL_UP_MOVE(60, MOVE_BODY_SLAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSwinubLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(19, MOVE_ENDURE),\n    LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(37, MOVE_MIST),\n    LEVEL_UP_MOVE(46, MOVE_BLIZZARD),\n    LEVEL_UP_MOVE(55, MOVE_AMNESIA),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPiloswineLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HORN_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(1, MOVE_ENDURE),\n    LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(19, MOVE_ENDURE),\n    LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(33, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(42, MOVE_MIST),\n    LEVEL_UP_MOVE(56, MOVE_BLIZZARD),\n    LEVEL_UP_MOVE(70, MOVE_AMNESIA),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCorsolaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(6, MOVE_HARDEN),\n    LEVEL_UP_MOVE(12, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(17, MOVE_RECOVER),\n    LEVEL_UP_MOVE(17, MOVE_REFRESH),\n    LEVEL_UP_MOVE(23, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(28, MOVE_SPIKE_CANNON),\n    LEVEL_UP_MOVE(34, MOVE_ROCK_BLAST),\n    LEVEL_UP_MOVE(39, MOVE_MIRROR_COAT),\n    LEVEL_UP_MOVE(45, MOVE_ANCIENT_POWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRemoraidLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(11, MOVE_LOCK_ON),\n    LEVEL_UP_MOVE(22, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM),\n    LEVEL_UP_MOVE(22, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(33, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(44, MOVE_ICE_BEAM),\n    LEVEL_UP_MOVE(55, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sOctilleryLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(11, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(22, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM),\n    LEVEL_UP_MOVE(22, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(25, MOVE_OCTAZOOKA),\n    LEVEL_UP_MOVE(38, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(54, MOVE_ICE_BEAM),\n    LEVEL_UP_MOVE(70, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDelibirdLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PRESENT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMantineLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(8, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(15, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(22, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(29, MOVE_AGILITY),\n    LEVEL_UP_MOVE(36, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(43, MOVE_WATER_PULSE),\n    LEVEL_UP_MOVE(50, MOVE_CONFUSE_RAY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSkarmoryLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(10, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_SWIFT),\n    LEVEL_UP_MOVE(16, MOVE_AGILITY),\n    LEVEL_UP_MOVE(26, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(29, MOVE_AIR_CUTTER),\n    LEVEL_UP_MOVE(32, MOVE_STEEL_WING),\n    LEVEL_UP_MOVE(42, MOVE_SPIKES),\n    LEVEL_UP_MOVE(45, MOVE_METAL_SOUND),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHoundourLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(7, MOVE_HOWL),\n    LEVEL_UP_MOVE(13, MOVE_SMOG),\n    LEVEL_UP_MOVE(19, MOVE_ROAR),\n    LEVEL_UP_MOVE(25, MOVE_BITE),\n    LEVEL_UP_MOVE(31, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(37, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(43, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(49, MOVE_CRUNCH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHoundoomLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(1, MOVE_HOWL),\n    LEVEL_UP_MOVE(7, MOVE_HOWL),\n    LEVEL_UP_MOVE(13, MOVE_SMOG),\n    LEVEL_UP_MOVE(19, MOVE_ROAR),\n    LEVEL_UP_MOVE(27, MOVE_BITE),\n    LEVEL_UP_MOVE(35, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(43, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(51, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(59, MOVE_CRUNCH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sKingdraLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(1, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(8, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(15, MOVE_LEER),\n    LEVEL_UP_MOVE(22, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(29, MOVE_TWISTER),\n    LEVEL_UP_MOVE(40, MOVE_AGILITY),\n    LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(62, MOVE_DRAGON_DANCE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPhanpyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(9, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(17, MOVE_FLAIL),\n    LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(33, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(41, MOVE_ENDURE),\n    LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDonphanLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(1, MOVE_HORN_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(9, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(17, MOVE_FLAIL),\n    LEVEL_UP_MOVE(25, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(33, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(41, MOVE_RAPID_SPIN),\n    LEVEL_UP_MOVE(49, MOVE_EARTHQUAKE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPorygon2LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CONVERSION_2),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_CONVERSION),\n    LEVEL_UP_MOVE(9, MOVE_AGILITY),\n    LEVEL_UP_MOVE(12, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(20, MOVE_RECOVER),\n    LEVEL_UP_MOVE(24, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(32, MOVE_LOCK_ON),\n    LEVEL_UP_MOVE(36, MOVE_TRI_ATTACK),\n    LEVEL_UP_MOVE(44, MOVE_RECYCLE),\n    LEVEL_UP_MOVE(48, MOVE_ZAP_CANNON),\n    LEVEL_UP_END\n};\n\nstatic const u16 sStantlerLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(7, MOVE_LEER),\n    LEVEL_UP_MOVE(11, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(17, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(21, MOVE_STOMP),\n    LEVEL_UP_MOVE(27, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(31, MOVE_ROLE_PLAY),\n    LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(41, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(47, MOVE_CALM_MIND),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSmeargleLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SKETCH),\n    LEVEL_UP_MOVE(11, MOVE_SKETCH),\n    LEVEL_UP_MOVE(21, MOVE_SKETCH),\n    LEVEL_UP_MOVE(31, MOVE_SKETCH),\n    LEVEL_UP_MOVE(41, MOVE_SKETCH),\n    LEVEL_UP_MOVE(51, MOVE_SKETCH),\n    LEVEL_UP_MOVE(61, MOVE_SKETCH),\n    LEVEL_UP_MOVE(71, MOVE_SKETCH),\n    LEVEL_UP_MOVE(81, MOVE_SKETCH),\n    LEVEL_UP_MOVE(91, MOVE_SKETCH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTyrogueLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHitmontopLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_REVENGE),\n    LEVEL_UP_MOVE(1, MOVE_ROLLING_KICK),\n    LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(13, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(19, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(20, MOVE_TRIPLE_KICK),\n    LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN),\n    LEVEL_UP_MOVE(31, MOVE_COUNTER),\n    LEVEL_UP_MOVE(37, MOVE_AGILITY),\n    LEVEL_UP_MOVE(43, MOVE_DETECT),\n    LEVEL_UP_MOVE(49, MOVE_ENDEAVOR),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSmoochumLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_LICK),\n    LEVEL_UP_MOVE(9, MOVE_SWEET_KISS),\n    LEVEL_UP_MOVE(13, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(21, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(25, MOVE_SING),\n    LEVEL_UP_MOVE(33, MOVE_MEAN_LOOK),\n    LEVEL_UP_MOVE(37, MOVE_FAKE_TEARS),\n    LEVEL_UP_MOVE(45, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(49, MOVE_PERISH_SONG),\n    LEVEL_UP_MOVE(57, MOVE_BLIZZARD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sElekidLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(9, MOVE_THUNDER_PUNCH),\n    LEVEL_UP_MOVE(17, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(25, MOVE_SWIFT),\n    LEVEL_UP_MOVE(33, MOVE_SCREECH),\n    LEVEL_UP_MOVE(41, MOVE_THUNDERBOLT),\n    LEVEL_UP_MOVE(49, MOVE_THUNDER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMagbyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(7, MOVE_LEER),\n    LEVEL_UP_MOVE(13, MOVE_SMOG),\n    LEVEL_UP_MOVE(19, MOVE_FIRE_PUNCH),\n    LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(31, MOVE_SUNNY_DAY),\n    LEVEL_UP_MOVE(37, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(43, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(49, MOVE_FIRE_BLAST),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMiltankLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(4, MOVE_GROWL),\n    LEVEL_UP_MOVE(8, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(13, MOVE_STOMP),\n    LEVEL_UP_MOVE(19, MOVE_MILK_DRINK),\n    LEVEL_UP_MOVE(26, MOVE_BIDE),\n    LEVEL_UP_MOVE(34, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(43, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(53, MOVE_HEAL_BELL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBlisseyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(7, MOVE_REFRESH),\n    LEVEL_UP_MOVE(10, MOVE_SOFT_BOILED),\n    LEVEL_UP_MOVE(13, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_MOVE(18, MOVE_MINIMIZE),\n    LEVEL_UP_MOVE(23, MOVE_SING),\n    LEVEL_UP_MOVE(28, MOVE_EGG_BOMB),\n    LEVEL_UP_MOVE(33, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(40, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(47, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRaikouLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(11, MOVE_THUNDER_SHOCK),\n    LEVEL_UP_MOVE(21, MOVE_ROAR),\n    LEVEL_UP_MOVE(31, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(41, MOVE_SPARK),\n    LEVEL_UP_MOVE(51, MOVE_REFLECT),\n    LEVEL_UP_MOVE(61, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(71, MOVE_THUNDER),\n    LEVEL_UP_MOVE(81, MOVE_CALM_MIND),\n    LEVEL_UP_END\n};\n\nstatic const u16 sEnteiLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(11, MOVE_EMBER),\n    LEVEL_UP_MOVE(21, MOVE_ROAR),\n    LEVEL_UP_MOVE(31, MOVE_FIRE_SPIN),\n    LEVEL_UP_MOVE(41, MOVE_STOMP),\n    LEVEL_UP_MOVE(51, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(61, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(71, MOVE_FIRE_BLAST),\n    LEVEL_UP_MOVE(81, MOVE_CALM_MIND),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSuicuneLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(11, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(21, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(31, MOVE_GUST),\n    LEVEL_UP_MOVE(41, MOVE_AURORA_BEAM),\n    LEVEL_UP_MOVE(51, MOVE_MIST),\n    LEVEL_UP_MOVE(61, MOVE_MIRROR_COAT),\n    LEVEL_UP_MOVE(71, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(81, MOVE_CALM_MIND),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLarvitarLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(8, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(15, MOVE_SCREECH),\n    LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE),\n    LEVEL_UP_MOVE(29, MOVE_THRASH),\n    LEVEL_UP_MOVE(36, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(43, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(50, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPupitarLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(1, MOVE_SCREECH),\n    LEVEL_UP_MOVE(8, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(15, MOVE_SCREECH),\n    LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE),\n    LEVEL_UP_MOVE(29, MOVE_THRASH),\n    LEVEL_UP_MOVE(38, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(47, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(56, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTyranitarLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(1, MOVE_SCREECH),\n    LEVEL_UP_MOVE(8, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(15, MOVE_SCREECH),\n    LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE),\n    LEVEL_UP_MOVE(29, MOVE_THRASH),\n    LEVEL_UP_MOVE(38, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(47, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(61, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLugiaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WHIRLWIND),\n    LEVEL_UP_MOVE(11, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(22, MOVE_GUST),\n    LEVEL_UP_MOVE(33, MOVE_RECOVER),\n    LEVEL_UP_MOVE(44, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(55, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(66, MOVE_SWIFT),\n    LEVEL_UP_MOVE(77, MOVE_AEROBLAST),\n    LEVEL_UP_MOVE(88, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(99, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHoOhLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WHIRLWIND),\n    LEVEL_UP_MOVE(11, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(22, MOVE_GUST),\n    LEVEL_UP_MOVE(33, MOVE_RECOVER),\n    LEVEL_UP_MOVE(44, MOVE_FIRE_BLAST),\n    LEVEL_UP_MOVE(55, MOVE_SUNNY_DAY),\n    LEVEL_UP_MOVE(66, MOVE_SWIFT),\n    LEVEL_UP_MOVE(77, MOVE_SACRED_FIRE),\n    LEVEL_UP_MOVE(88, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(99, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCelebiLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(1, MOVE_RECOVER),\n    LEVEL_UP_MOVE(1, MOVE_HEAL_BELL),\n    LEVEL_UP_MOVE(10, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(20, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(40, MOVE_BATON_PASS),\n    LEVEL_UP_MOVE(50, MOVE_PERISH_SONG),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies252LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies253LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies254LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies255LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies256LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies257LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies258LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies259LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies260LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies261LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies262LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies263LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies264LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies265LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies266LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies267LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies268LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies269LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies270LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies271LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies272LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies273LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies274LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies275LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpecies276LevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTreeckoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(6, MOVE_ABSORB),\n    LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(16, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(21, MOVE_SCREECH),\n    LEVEL_UP_MOVE(26, MOVE_MEGA_DRAIN),\n    LEVEL_UP_MOVE(31, MOVE_AGILITY),\n    LEVEL_UP_MOVE(36, MOVE_SLAM),\n    LEVEL_UP_MOVE(41, MOVE_DETECT),\n    LEVEL_UP_MOVE(46, MOVE_GIGA_DRAIN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGrovyleLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(6, MOVE_ABSORB),\n    LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(16, MOVE_FURY_CUTTER),\n    LEVEL_UP_MOVE(17, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(23, MOVE_SCREECH),\n    LEVEL_UP_MOVE(29, MOVE_LEAF_BLADE),\n    LEVEL_UP_MOVE(35, MOVE_AGILITY),\n    LEVEL_UP_MOVE(41, MOVE_SLAM),\n    LEVEL_UP_MOVE(47, MOVE_DETECT),\n    LEVEL_UP_MOVE(53, MOVE_FALSE_SWIPE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSceptileLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(6, MOVE_ABSORB),\n    LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(16, MOVE_FURY_CUTTER),\n    LEVEL_UP_MOVE(17, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(23, MOVE_SCREECH),\n    LEVEL_UP_MOVE(29, MOVE_LEAF_BLADE),\n    LEVEL_UP_MOVE(35, MOVE_AGILITY),\n    LEVEL_UP_MOVE(43, MOVE_SLAM),\n    LEVEL_UP_MOVE(51, MOVE_DETECT),\n    LEVEL_UP_MOVE(59, MOVE_FALSE_SWIPE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTorchicLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(10, MOVE_EMBER),\n    LEVEL_UP_MOVE(16, MOVE_PECK),\n    LEVEL_UP_MOVE(19, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN),\n    LEVEL_UP_MOVE(28, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(34, MOVE_SLASH),\n    LEVEL_UP_MOVE(37, MOVE_MIRROR_MOVE),\n    LEVEL_UP_MOVE(43, MOVE_FLAMETHROWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCombuskenLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(13, MOVE_EMBER),\n    LEVEL_UP_MOVE(16, MOVE_DOUBLE_KICK),\n    LEVEL_UP_MOVE(17, MOVE_PECK),\n    LEVEL_UP_MOVE(21, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(28, MOVE_BULK_UP),\n    LEVEL_UP_MOVE(32, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(39, MOVE_SLASH),\n    LEVEL_UP_MOVE(43, MOVE_MIRROR_MOVE),\n    LEVEL_UP_MOVE(50, MOVE_SKY_UPPERCUT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBlazikenLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_FIRE_PUNCH),\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(13, MOVE_EMBER),\n    LEVEL_UP_MOVE(16, MOVE_DOUBLE_KICK),\n    LEVEL_UP_MOVE(17, MOVE_PECK),\n    LEVEL_UP_MOVE(21, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(28, MOVE_BULK_UP),\n    LEVEL_UP_MOVE(32, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(36, MOVE_BLAZE_KICK),\n    LEVEL_UP_MOVE(42, MOVE_SLASH),\n    LEVEL_UP_MOVE(49, MOVE_MIRROR_MOVE),\n    LEVEL_UP_MOVE(59, MOVE_SKY_UPPERCUT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMudkipLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(6, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(10, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(15, MOVE_BIDE),\n    LEVEL_UP_MOVE(19, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(24, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(33, MOVE_WHIRLPOOL),\n    LEVEL_UP_MOVE(37, MOVE_PROTECT),\n    LEVEL_UP_MOVE(42, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(46, MOVE_ENDEAVOR),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMarshtompLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(6, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(10, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(15, MOVE_BIDE),\n    LEVEL_UP_MOVE(16, MOVE_MUD_SHOT),\n    LEVEL_UP_MOVE(20, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(25, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(37, MOVE_MUDDY_WATER),\n    LEVEL_UP_MOVE(42, MOVE_PROTECT),\n    LEVEL_UP_MOVE(46, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(53, MOVE_ENDEAVOR),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSwampertLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(6, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(10, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(15, MOVE_BIDE),\n    LEVEL_UP_MOVE(16, MOVE_MUD_SHOT),\n    LEVEL_UP_MOVE(20, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(25, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(39, MOVE_MUDDY_WATER),\n    LEVEL_UP_MOVE(46, MOVE_PROTECT),\n    LEVEL_UP_MOVE(52, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(61, MOVE_ENDEAVOR),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPoochyenaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(5, MOVE_HOWL),\n    LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_BITE),\n    LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(21, MOVE_ROAR),\n    LEVEL_UP_MOVE(25, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(29, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(37, MOVE_TAUNT),\n    LEVEL_UP_MOVE(41, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(45, MOVE_THIEF),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMightyenaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_HOWL),\n    LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(5, MOVE_HOWL),\n    LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_BITE),\n    LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(22, MOVE_ROAR),\n    LEVEL_UP_MOVE(27, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(32, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(42, MOVE_TAUNT),\n    LEVEL_UP_MOVE(47, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(52, MOVE_THIEF),\n    LEVEL_UP_END\n};\n\nstatic const u16 sZigzagoonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(9, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(13, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(21, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(25, MOVE_PIN_MISSILE),\n    LEVEL_UP_MOVE(29, MOVE_COVET),\n    LEVEL_UP_MOVE(33, MOVE_FLAIL),\n    LEVEL_UP_MOVE(37, MOVE_REST),\n    LEVEL_UP_MOVE(41, MOVE_BELLY_DRUM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLinooneLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(9, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(13, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(23, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(29, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(35, MOVE_COVET),\n    LEVEL_UP_MOVE(41, MOVE_SLASH),\n    LEVEL_UP_MOVE(47, MOVE_REST),\n    LEVEL_UP_MOVE(53, MOVE_BELLY_DRUM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWurmpleLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_STRING_SHOT),\n    LEVEL_UP_MOVE(5, MOVE_POISON_STING),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSilcoonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(7, MOVE_HARDEN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBeautiflyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(10, MOVE_ABSORB),\n    LEVEL_UP_MOVE(13, MOVE_GUST),\n    LEVEL_UP_MOVE(17, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(20, MOVE_MORNING_SUN),\n    LEVEL_UP_MOVE(24, MOVE_MEGA_DRAIN),\n    LEVEL_UP_MOVE(27, MOVE_WHIRLWIND),\n    LEVEL_UP_MOVE(31, MOVE_ATTRACT),\n    LEVEL_UP_MOVE(34, MOVE_SILVER_WIND),\n    LEVEL_UP_MOVE(38, MOVE_GIGA_DRAIN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCascoonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(7, MOVE_HARDEN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDustoxLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(10, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(13, MOVE_GUST),\n    LEVEL_UP_MOVE(17, MOVE_PROTECT),\n    LEVEL_UP_MOVE(20, MOVE_MOONLIGHT),\n    LEVEL_UP_MOVE(24, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(27, MOVE_WHIRLWIND),\n    LEVEL_UP_MOVE(31, MOVE_LIGHT_SCREEN),\n    LEVEL_UP_MOVE(34, MOVE_SILVER_WIND),\n    LEVEL_UP_MOVE(38, MOVE_TOXIC),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLotadLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(3, MOVE_GROWL),\n    LEVEL_UP_MOVE(7, MOVE_ABSORB),\n    LEVEL_UP_MOVE(13, MOVE_NATURE_POWER),\n    LEVEL_UP_MOVE(21, MOVE_MIST),\n    LEVEL_UP_MOVE(31, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(43, MOVE_MEGA_DRAIN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLombreLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(3, MOVE_GROWL),\n    LEVEL_UP_MOVE(7, MOVE_ABSORB),\n    LEVEL_UP_MOVE(13, MOVE_NATURE_POWER),\n    LEVEL_UP_MOVE(19, MOVE_FAKE_OUT),\n    LEVEL_UP_MOVE(25, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(31, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(37, MOVE_THIEF),\n    LEVEL_UP_MOVE(43, MOVE_UPROAR),\n    LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLudicoloLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(1, MOVE_NATURE_POWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSeedotLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BIDE),\n    LEVEL_UP_MOVE(3, MOVE_HARDEN),\n    LEVEL_UP_MOVE(7, MOVE_GROWTH),\n    LEVEL_UP_MOVE(13, MOVE_NATURE_POWER),\n    LEVEL_UP_MOVE(21, MOVE_SYNTHESIS),\n    LEVEL_UP_MOVE(31, MOVE_SUNNY_DAY),\n    LEVEL_UP_MOVE(43, MOVE_EXPLOSION),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNuzleafLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(3, MOVE_HARDEN),\n    LEVEL_UP_MOVE(7, MOVE_GROWTH),\n    LEVEL_UP_MOVE(13, MOVE_NATURE_POWER),\n    LEVEL_UP_MOVE(19, MOVE_FAKE_OUT),\n    LEVEL_UP_MOVE(25, MOVE_TORMENT),\n    LEVEL_UP_MOVE(31, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(37, MOVE_RAZOR_WIND),\n    LEVEL_UP_MOVE(43, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(49, MOVE_EXTRASENSORY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sShiftryLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(1, MOVE_GROWTH),\n    LEVEL_UP_MOVE(1, MOVE_NATURE_POWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNincadaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(5, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(19, MOVE_MIND_READER),\n    LEVEL_UP_MOVE(25, MOVE_FALSE_SWIPE),\n    LEVEL_UP_MOVE(31, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(38, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(45, MOVE_DIG),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNinjaskLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(1, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(5, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(19, MOVE_MIND_READER),\n    LEVEL_UP_MOVE(20, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(20, MOVE_FURY_CUTTER),\n    LEVEL_UP_MOVE(20, MOVE_SCREECH),\n    LEVEL_UP_MOVE(25, MOVE_SWORDS_DANCE),\n    LEVEL_UP_MOVE(31, MOVE_SLASH),\n    LEVEL_UP_MOVE(38, MOVE_AGILITY),\n    LEVEL_UP_MOVE(45, MOVE_BATON_PASS),\n    LEVEL_UP_END\n};\n\nstatic const u16 sShedinjaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(5, MOVE_LEECH_LIFE),\n    LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(19, MOVE_MIND_READER),\n    LEVEL_UP_MOVE(25, MOVE_SPITE),\n    LEVEL_UP_MOVE(31, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(38, MOVE_SHADOW_BALL),\n    LEVEL_UP_MOVE(45, MOVE_GRUDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTaillowLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(4, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(8, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(19, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(26, MOVE_ENDEAVOR),\n    LEVEL_UP_MOVE(34, MOVE_AERIAL_ACE),\n    LEVEL_UP_MOVE(43, MOVE_AGILITY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSwellowLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(4, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(8, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(19, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(28, MOVE_ENDEAVOR),\n    LEVEL_UP_MOVE(38, MOVE_AERIAL_ACE),\n    LEVEL_UP_MOVE(49, MOVE_AGILITY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sShroomishLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(4, MOVE_TACKLE),\n    LEVEL_UP_MOVE(7, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(10, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(16, MOVE_MEGA_DRAIN),\n    LEVEL_UP_MOVE(22, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(28, MOVE_POISON_POWDER),\n    LEVEL_UP_MOVE(36, MOVE_GROWTH),\n    LEVEL_UP_MOVE(45, MOVE_GIGA_DRAIN),\n    LEVEL_UP_MOVE(54, MOVE_SPORE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBreloomLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(1, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(4, MOVE_TACKLE),\n    LEVEL_UP_MOVE(7, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(10, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(16, MOVE_MEGA_DRAIN),\n    LEVEL_UP_MOVE(22, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(23, MOVE_MACH_PUNCH),\n    LEVEL_UP_MOVE(28, MOVE_COUNTER),\n    LEVEL_UP_MOVE(36, MOVE_SKY_UPPERCUT),\n    LEVEL_UP_MOVE(45, MOVE_MIND_READER),\n    LEVEL_UP_MOVE(54, MOVE_DYNAMIC_PUNCH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpindaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(5, MOVE_UPROAR),\n    LEVEL_UP_MOVE(12, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(16, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(23, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(27, MOVE_DIZZY_PUNCH),\n    LEVEL_UP_MOVE(34, MOVE_TEETER_DANCE),\n    LEVEL_UP_MOVE(38, MOVE_PSYCH_UP),\n    LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_MOVE(49, MOVE_FLAIL),\n    LEVEL_UP_MOVE(56, MOVE_THRASH),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWingullLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(7, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(13, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(21, MOVE_MIST),\n    LEVEL_UP_MOVE(31, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(43, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(55, MOVE_AGILITY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPelipperLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(1, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(3, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(7, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(13, MOVE_WING_ATTACK),\n    LEVEL_UP_MOVE(21, MOVE_MIST),\n    LEVEL_UP_MOVE(25, MOVE_PROTECT),\n    LEVEL_UP_MOVE(33, MOVE_STOCKPILE),\n    LEVEL_UP_MOVE(33, MOVE_SWALLOW),\n    LEVEL_UP_MOVE(47, MOVE_SPIT_UP),\n    LEVEL_UP_MOVE(61, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSurskitLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(19, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(31, MOVE_AGILITY),\n    LEVEL_UP_MOVE(37, MOVE_MIST),\n    LEVEL_UP_MOVE(37, MOVE_HAZE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMasquerainLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(19, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(26, MOVE_GUST),\n    LEVEL_UP_MOVE(33, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(40, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(47, MOVE_SILVER_WIND),\n    LEVEL_UP_MOVE(53, MOVE_WHIRLWIND),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWailmerLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SPLASH),\n    LEVEL_UP_MOVE(5, MOVE_GROWL),\n    LEVEL_UP_MOVE(10, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(14, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(19, MOVE_WHIRLPOOL),\n    LEVEL_UP_MOVE(23, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(28, MOVE_WATER_PULSE),\n    LEVEL_UP_MOVE(32, MOVE_MIST),\n    LEVEL_UP_MOVE(37, MOVE_REST),\n    LEVEL_UP_MOVE(41, MOVE_WATER_SPOUT),\n    LEVEL_UP_MOVE(46, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWailordLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SPLASH),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(1, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(5, MOVE_GROWL),\n    LEVEL_UP_MOVE(10, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(14, MOVE_ROLLOUT),\n    LEVEL_UP_MOVE(19, MOVE_WHIRLPOOL),\n    LEVEL_UP_MOVE(23, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(28, MOVE_WATER_PULSE),\n    LEVEL_UP_MOVE(32, MOVE_MIST),\n    LEVEL_UP_MOVE(37, MOVE_REST),\n    LEVEL_UP_MOVE(44, MOVE_WATER_SPOUT),\n    LEVEL_UP_MOVE(52, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(59, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSkittyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(3, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(7, MOVE_ATTRACT),\n    LEVEL_UP_MOVE(13, MOVE_SING),\n    LEVEL_UP_MOVE(15, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_MOVE(19, MOVE_ASSIST),\n    LEVEL_UP_MOVE(25, MOVE_CHARM),\n    LEVEL_UP_MOVE(27, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(31, MOVE_COVET),\n    LEVEL_UP_MOVE(37, MOVE_HEAL_BELL),\n    LEVEL_UP_MOVE(39, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDelcattyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_ATTRACT),\n    LEVEL_UP_MOVE(1, MOVE_SING),\n    LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sKecleonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_THIEF),\n    LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(1, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(1, MOVE_LICK),\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(4, MOVE_BIND),\n    LEVEL_UP_MOVE(7, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(17, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(24, MOVE_SCREECH),\n    LEVEL_UP_MOVE(31, MOVE_SLASH),\n    LEVEL_UP_MOVE(40, MOVE_SUBSTITUTE),\n    LEVEL_UP_MOVE(49, MOVE_ANCIENT_POWER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBaltoyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(3, MOVE_HARDEN),\n    LEVEL_UP_MOVE(5, MOVE_RAPID_SPIN),\n    LEVEL_UP_MOVE(7, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(11, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB),\n    LEVEL_UP_MOVE(19, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(25, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(31, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(37, MOVE_COSMIC_POWER),\n    LEVEL_UP_MOVE(45, MOVE_EXPLOSION),\n    LEVEL_UP_END\n};\n\nstatic const u16 sClaydolLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TELEPORT),\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(1, MOVE_RAPID_SPIN),\n    LEVEL_UP_MOVE(3, MOVE_HARDEN),\n    LEVEL_UP_MOVE(5, MOVE_RAPID_SPIN),\n    LEVEL_UP_MOVE(7, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(11, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB),\n    LEVEL_UP_MOVE(19, MOVE_SELF_DESTRUCT),\n    LEVEL_UP_MOVE(25, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(31, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(36, MOVE_HYPER_BEAM),\n    LEVEL_UP_MOVE(42, MOVE_COSMIC_POWER),\n    LEVEL_UP_MOVE(55, MOVE_EXPLOSION),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNosepassLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(7, MOVE_HARDEN),\n    LEVEL_UP_MOVE(13, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(16, MOVE_BLOCK),\n    LEVEL_UP_MOVE(22, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(28, MOVE_ROCK_SLIDE),\n    LEVEL_UP_MOVE(31, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(37, MOVE_REST),\n    LEVEL_UP_MOVE(43, MOVE_ZAP_CANNON),\n    LEVEL_UP_MOVE(46, MOVE_LOCK_ON),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTorkoalLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(4, MOVE_SMOG),\n    LEVEL_UP_MOVE(7, MOVE_CURSE),\n    LEVEL_UP_MOVE(14, MOVE_SMOKESCREEN),\n    LEVEL_UP_MOVE(17, MOVE_FIRE_SPIN),\n    LEVEL_UP_MOVE(20, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(27, MOVE_PROTECT),\n    LEVEL_UP_MOVE(30, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(33, MOVE_IRON_DEFENSE),\n    LEVEL_UP_MOVE(40, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(43, MOVE_FLAIL),\n    LEVEL_UP_MOVE(46, MOVE_HEAT_WAVE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSableyeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(5, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(9, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(13, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(17, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(21, MOVE_FAKE_OUT),\n    LEVEL_UP_MOVE(25, MOVE_DETECT),\n    LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(33, MOVE_KNOCK_OFF),\n    LEVEL_UP_MOVE(37, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(41, MOVE_SHADOW_BALL),\n    LEVEL_UP_MOVE(45, MOVE_MEAN_LOOK),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBarboachLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(6, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(6, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(11, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(16, MOVE_MAGNITUDE),\n    LEVEL_UP_MOVE(21, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(26, MOVE_REST),\n    LEVEL_UP_MOVE(26, MOVE_SNORE),\n    LEVEL_UP_MOVE(31, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(36, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(41, MOVE_FISSURE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWhiscashLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TICKLE),\n    LEVEL_UP_MOVE(1, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(1, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(6, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(6, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(11, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(16, MOVE_MAGNITUDE),\n    LEVEL_UP_MOVE(21, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(26, MOVE_REST),\n    LEVEL_UP_MOVE(26, MOVE_SNORE),\n    LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(46, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(56, MOVE_FISSURE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLuvdiscLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(4, MOVE_CHARM),\n    LEVEL_UP_MOVE(12, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(16, MOVE_AGILITY),\n    LEVEL_UP_MOVE(24, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(28, MOVE_ATTRACT),\n    LEVEL_UP_MOVE(36, MOVE_SWEET_KISS),\n    LEVEL_UP_MOVE(40, MOVE_FLAIL),\n    LEVEL_UP_MOVE(48, MOVE_SAFEGUARD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCorphishLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(7, MOVE_HARDEN),\n    LEVEL_UP_MOVE(10, MOVE_VICE_GRIP),\n    LEVEL_UP_MOVE(13, MOVE_LEER),\n    LEVEL_UP_MOVE(19, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(22, MOVE_PROTECT),\n    LEVEL_UP_MOVE(25, MOVE_KNOCK_OFF),\n    LEVEL_UP_MOVE(31, MOVE_TAUNT),\n    LEVEL_UP_MOVE(34, MOVE_CRABHAMMER),\n    LEVEL_UP_MOVE(37, MOVE_SWORDS_DANCE),\n    LEVEL_UP_MOVE(43, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(46, MOVE_GUILLOTINE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCrawdauntLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(1, MOVE_VICE_GRIP),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(7, MOVE_HARDEN),\n    LEVEL_UP_MOVE(10, MOVE_VICE_GRIP),\n    LEVEL_UP_MOVE(13, MOVE_LEER),\n    LEVEL_UP_MOVE(19, MOVE_BUBBLE_BEAM),\n    LEVEL_UP_MOVE(22, MOVE_PROTECT),\n    LEVEL_UP_MOVE(25, MOVE_KNOCK_OFF),\n    LEVEL_UP_MOVE(33, MOVE_TAUNT),\n    LEVEL_UP_MOVE(38, MOVE_CRABHAMMER),\n    LEVEL_UP_MOVE(43, MOVE_SWORDS_DANCE),\n    LEVEL_UP_MOVE(51, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(56, MOVE_GUILLOTINE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sFeebasLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SPLASH),\n    LEVEL_UP_MOVE(15, MOVE_TACKLE),\n    LEVEL_UP_MOVE(30, MOVE_FLAIL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMiloticLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(5, MOVE_WRAP),\n    LEVEL_UP_MOVE(10, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(15, MOVE_REFRESH),\n    LEVEL_UP_MOVE(20, MOVE_WATER_PULSE),\n    LEVEL_UP_MOVE(25, MOVE_TWISTER),\n    LEVEL_UP_MOVE(30, MOVE_RECOVER),\n    LEVEL_UP_MOVE(35, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(40, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(45, MOVE_ATTRACT),\n    LEVEL_UP_MOVE(50, MOVE_SAFEGUARD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCarvanhaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(7, MOVE_RAGE),\n    LEVEL_UP_MOVE(13, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(16, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(22, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(28, MOVE_SCREECH),\n    LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(37, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(43, MOVE_AGILITY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSharpedoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_RAGE),\n    LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(7, MOVE_RAGE),\n    LEVEL_UP_MOVE(13, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(16, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(22, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(28, MOVE_SCREECH),\n    LEVEL_UP_MOVE(33, MOVE_SLASH),\n    LEVEL_UP_MOVE(38, MOVE_TAUNT),\n    LEVEL_UP_MOVE(43, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(48, MOVE_SKULL_BASH),\n    LEVEL_UP_MOVE(53, MOVE_AGILITY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTrapinchLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(25, MOVE_SAND_TOMB),\n    LEVEL_UP_MOVE(33, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(41, MOVE_DIG),\n    LEVEL_UP_MOVE(49, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sVibravaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_SAND_TOMB),\n    LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(25, MOVE_SAND_TOMB),\n    LEVEL_UP_MOVE(33, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH),\n    LEVEL_UP_MOVE(41, MOVE_SCREECH),\n    LEVEL_UP_MOVE(49, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sFlygonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_SAND_TOMB),\n    LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(25, MOVE_SAND_TOMB),\n    LEVEL_UP_MOVE(33, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH),\n    LEVEL_UP_MOVE(41, MOVE_SCREECH),\n    LEVEL_UP_MOVE(53, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMakuhitaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(4, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(10, MOVE_ARM_THRUST),\n    LEVEL_UP_MOVE(13, MOVE_VITAL_THROW),\n    LEVEL_UP_MOVE(19, MOVE_FAKE_OUT),\n    LEVEL_UP_MOVE(22, MOVE_WHIRLWIND),\n    LEVEL_UP_MOVE(28, MOVE_KNOCK_OFF),\n    LEVEL_UP_MOVE(31, MOVE_SMELLING_SALT),\n    LEVEL_UP_MOVE(37, MOVE_BELLY_DRUM),\n    LEVEL_UP_MOVE(40, MOVE_ENDURE),\n    LEVEL_UP_MOVE(46, MOVE_SEISMIC_TOSS),\n    LEVEL_UP_MOVE(49, MOVE_REVERSAL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHariyamaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(1, MOVE_ARM_THRUST),\n    LEVEL_UP_MOVE(4, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(10, MOVE_ARM_THRUST),\n    LEVEL_UP_MOVE(13, MOVE_VITAL_THROW),\n    LEVEL_UP_MOVE(19, MOVE_FAKE_OUT),\n    LEVEL_UP_MOVE(22, MOVE_WHIRLWIND),\n    LEVEL_UP_MOVE(29, MOVE_KNOCK_OFF),\n    LEVEL_UP_MOVE(33, MOVE_SMELLING_SALT),\n    LEVEL_UP_MOVE(40, MOVE_BELLY_DRUM),\n    LEVEL_UP_MOVE(44, MOVE_ENDURE),\n    LEVEL_UP_MOVE(51, MOVE_SEISMIC_TOSS),\n    LEVEL_UP_MOVE(55, MOVE_REVERSAL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sElectrikeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(4, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(9, MOVE_LEER),\n    LEVEL_UP_MOVE(12, MOVE_HOWL),\n    LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(20, MOVE_SPARK),\n    LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(28, MOVE_ROAR),\n    LEVEL_UP_MOVE(33, MOVE_BITE),\n    LEVEL_UP_MOVE(36, MOVE_THUNDER),\n    LEVEL_UP_MOVE(41, MOVE_CHARGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sManectricLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_HOWL),\n    LEVEL_UP_MOVE(4, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(9, MOVE_LEER),\n    LEVEL_UP_MOVE(12, MOVE_HOWL),\n    LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(20, MOVE_SPARK),\n    LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(31, MOVE_ROAR),\n    LEVEL_UP_MOVE(39, MOVE_BITE),\n    LEVEL_UP_MOVE(45, MOVE_THUNDER),\n    LEVEL_UP_MOVE(53, MOVE_CHARGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sNumelLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(11, MOVE_EMBER),\n    LEVEL_UP_MOVE(19, MOVE_MAGNITUDE),\n    LEVEL_UP_MOVE(25, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(31, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(35, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(41, MOVE_FLAMETHROWER),\n    LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCameruptLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_EMBER),\n    LEVEL_UP_MOVE(1, MOVE_MAGNITUDE),\n    LEVEL_UP_MOVE(11, MOVE_EMBER),\n    LEVEL_UP_MOVE(19, MOVE_MAGNITUDE),\n    LEVEL_UP_MOVE(25, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(31, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(33, MOVE_ROCK_SLIDE),\n    LEVEL_UP_MOVE(37, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(45, MOVE_ERUPTION),\n    LEVEL_UP_MOVE(55, MOVE_FISSURE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSphealLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(7, MOVE_ENCORE),\n    LEVEL_UP_MOVE(13, MOVE_ICE_BALL),\n    LEVEL_UP_MOVE(19, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM),\n    LEVEL_UP_MOVE(31, MOVE_HAIL),\n    LEVEL_UP_MOVE(37, MOVE_REST),\n    LEVEL_UP_MOVE(37, MOVE_SNORE),\n    LEVEL_UP_MOVE(43, MOVE_BLIZZARD),\n    LEVEL_UP_MOVE(49, MOVE_SHEER_COLD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSealeoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(7, MOVE_ENCORE),\n    LEVEL_UP_MOVE(13, MOVE_ICE_BALL),\n    LEVEL_UP_MOVE(19, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM),\n    LEVEL_UP_MOVE(31, MOVE_HAIL),\n    LEVEL_UP_MOVE(39, MOVE_REST),\n    LEVEL_UP_MOVE(39, MOVE_SNORE),\n    LEVEL_UP_MOVE(47, MOVE_BLIZZARD),\n    LEVEL_UP_MOVE(55, MOVE_SHEER_COLD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWalreinLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(7, MOVE_ENCORE),\n    LEVEL_UP_MOVE(13, MOVE_ICE_BALL),\n    LEVEL_UP_MOVE(19, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM),\n    LEVEL_UP_MOVE(31, MOVE_HAIL),\n    LEVEL_UP_MOVE(39, MOVE_REST),\n    LEVEL_UP_MOVE(39, MOVE_SNORE),\n    LEVEL_UP_MOVE(50, MOVE_BLIZZARD),\n    LEVEL_UP_MOVE(61, MOVE_SHEER_COLD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCacneaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(5, MOVE_ABSORB),\n    LEVEL_UP_MOVE(9, MOVE_GROWTH),\n    LEVEL_UP_MOVE(13, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(17, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE),\n    LEVEL_UP_MOVE(25, MOVE_INGRAIN),\n    LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(33, MOVE_SPIKES),\n    LEVEL_UP_MOVE(37, MOVE_NEEDLE_ARM),\n    LEVEL_UP_MOVE(41, MOVE_COTTON_SPORE),\n    LEVEL_UP_MOVE(45, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(49, MOVE_DESTINY_BOND),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCacturneLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_REVENGE),\n    LEVEL_UP_MOVE(1, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(1, MOVE_GROWTH),\n    LEVEL_UP_MOVE(5, MOVE_ABSORB),\n    LEVEL_UP_MOVE(9, MOVE_GROWTH),\n    LEVEL_UP_MOVE(13, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(17, MOVE_SAND_ATTACK),\n    LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE),\n    LEVEL_UP_MOVE(25, MOVE_INGRAIN),\n    LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(35, MOVE_SPIKES),\n    LEVEL_UP_MOVE(41, MOVE_NEEDLE_ARM),\n    LEVEL_UP_MOVE(47, MOVE_COTTON_SPORE),\n    LEVEL_UP_MOVE(53, MOVE_SANDSTORM),\n    LEVEL_UP_MOVE(59, MOVE_DESTINY_BOND),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSnoruntLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(7, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(10, MOVE_BITE),\n    LEVEL_UP_MOVE(16, MOVE_ICY_WIND),\n    LEVEL_UP_MOVE(19, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(25, MOVE_PROTECT),\n    LEVEL_UP_MOVE(28, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(34, MOVE_ICE_BEAM),\n    LEVEL_UP_MOVE(37, MOVE_HAIL),\n    LEVEL_UP_MOVE(43, MOVE_BLIZZARD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGlalieLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(7, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(10, MOVE_BITE),\n    LEVEL_UP_MOVE(16, MOVE_ICY_WIND),\n    LEVEL_UP_MOVE(19, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(25, MOVE_PROTECT),\n    LEVEL_UP_MOVE(28, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(34, MOVE_ICE_BEAM),\n    LEVEL_UP_MOVE(42, MOVE_HAIL),\n    LEVEL_UP_MOVE(53, MOVE_BLIZZARD),\n    LEVEL_UP_MOVE(61, MOVE_SHEER_COLD),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLunatoneLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(7, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(13, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(19, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(25, MOVE_PSYWAVE),\n    LEVEL_UP_MOVE(31, MOVE_COSMIC_POWER),\n    LEVEL_UP_MOVE(37, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(43, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(49, MOVE_EXPLOSION),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSolrockLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(7, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(13, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(19, MOVE_FIRE_SPIN),\n    LEVEL_UP_MOVE(25, MOVE_PSYWAVE),\n    LEVEL_UP_MOVE(31, MOVE_COSMIC_POWER),\n    LEVEL_UP_MOVE(37, MOVE_ROCK_SLIDE),\n    LEVEL_UP_MOVE(43, MOVE_SOLAR_BEAM),\n    LEVEL_UP_MOVE(49, MOVE_EXPLOSION),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAzurillLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SPLASH),\n    LEVEL_UP_MOVE(3, MOVE_CHARM),\n    LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP),\n    LEVEL_UP_MOVE(10, MOVE_BUBBLE),\n    LEVEL_UP_MOVE(15, MOVE_SLAM),\n    LEVEL_UP_MOVE(21, MOVE_WATER_GUN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSpoinkLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SPLASH),\n    LEVEL_UP_MOVE(7, MOVE_PSYWAVE),\n    LEVEL_UP_MOVE(10, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(16, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(19, MOVE_PSYCH_UP),\n    LEVEL_UP_MOVE(25, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(28, MOVE_MAGIC_COAT),\n    LEVEL_UP_MOVE(34, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(37, MOVE_REST),\n    LEVEL_UP_MOVE(37, MOVE_SNORE),\n    LEVEL_UP_MOVE(43, MOVE_BOUNCE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGrumpigLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SPLASH),\n    LEVEL_UP_MOVE(1, MOVE_PSYWAVE),\n    LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(1, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(7, MOVE_PSYWAVE),\n    LEVEL_UP_MOVE(10, MOVE_ODOR_SLEUTH),\n    LEVEL_UP_MOVE(16, MOVE_PSYBEAM),\n    LEVEL_UP_MOVE(19, MOVE_PSYCH_UP),\n    LEVEL_UP_MOVE(25, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(28, MOVE_MAGIC_COAT),\n    LEVEL_UP_MOVE(37, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(43, MOVE_REST),\n    LEVEL_UP_MOVE(43, MOVE_SNORE),\n    LEVEL_UP_MOVE(55, MOVE_BOUNCE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sPlusleLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(4, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(19, MOVE_SPARK),\n    LEVEL_UP_MOVE(22, MOVE_ENCORE),\n    LEVEL_UP_MOVE(28, MOVE_FAKE_TEARS),\n    LEVEL_UP_MOVE(31, MOVE_CHARGE),\n    LEVEL_UP_MOVE(37, MOVE_THUNDER),\n    LEVEL_UP_MOVE(40, MOVE_BATON_PASS),\n    LEVEL_UP_MOVE(47, MOVE_AGILITY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMinunLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(4, MOVE_THUNDER_WAVE),\n    LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(13, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(19, MOVE_SPARK),\n    LEVEL_UP_MOVE(22, MOVE_ENCORE),\n    LEVEL_UP_MOVE(28, MOVE_CHARM),\n    LEVEL_UP_MOVE(31, MOVE_CHARGE),\n    LEVEL_UP_MOVE(37, MOVE_THUNDER),\n    LEVEL_UP_MOVE(40, MOVE_BATON_PASS),\n    LEVEL_UP_MOVE(47, MOVE_AGILITY),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMawileLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(6, MOVE_FAKE_TEARS),\n    LEVEL_UP_MOVE(11, MOVE_BITE),\n    LEVEL_UP_MOVE(16, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(21, MOVE_VICE_GRIP),\n    LEVEL_UP_MOVE(26, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(31, MOVE_BATON_PASS),\n    LEVEL_UP_MOVE(36, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE),\n    LEVEL_UP_MOVE(46, MOVE_STOCKPILE),\n    LEVEL_UP_MOVE(46, MOVE_SWALLOW),\n    LEVEL_UP_MOVE(46, MOVE_SPIT_UP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMedititeLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BIDE),\n    LEVEL_UP_MOVE(4, MOVE_MEDITATE),\n    LEVEL_UP_MOVE(9, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(12, MOVE_DETECT),\n    LEVEL_UP_MOVE(17, MOVE_HIDDEN_POWER),\n    LEVEL_UP_MOVE(20, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(25, MOVE_MIND_READER),\n    LEVEL_UP_MOVE(28, MOVE_CALM_MIND),\n    LEVEL_UP_MOVE(33, MOVE_HI_JUMP_KICK),\n    LEVEL_UP_MOVE(36, MOVE_PSYCH_UP),\n    LEVEL_UP_MOVE(41, MOVE_REVERSAL),\n    LEVEL_UP_MOVE(44, MOVE_RECOVER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMedichamLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_FIRE_PUNCH),\n    LEVEL_UP_MOVE(1, MOVE_THUNDER_PUNCH),\n    LEVEL_UP_MOVE(1, MOVE_ICE_PUNCH),\n    LEVEL_UP_MOVE(1, MOVE_BIDE),\n    LEVEL_UP_MOVE(1, MOVE_MEDITATE),\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(1, MOVE_DETECT),\n    LEVEL_UP_MOVE(4, MOVE_MEDITATE),\n    LEVEL_UP_MOVE(9, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(12, MOVE_DETECT),\n    LEVEL_UP_MOVE(17, MOVE_HIDDEN_POWER),\n    LEVEL_UP_MOVE(20, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(25, MOVE_MIND_READER),\n    LEVEL_UP_MOVE(28, MOVE_CALM_MIND),\n    LEVEL_UP_MOVE(33, MOVE_HI_JUMP_KICK),\n    LEVEL_UP_MOVE(36, MOVE_PSYCH_UP),\n    LEVEL_UP_MOVE(47, MOVE_REVERSAL),\n    LEVEL_UP_MOVE(56, MOVE_RECOVER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSwabluLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(8, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(11, MOVE_SING),\n    LEVEL_UP_MOVE(18, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(21, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(28, MOVE_MIST),\n    LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(38, MOVE_MIRROR_MOVE),\n    LEVEL_UP_MOVE(41, MOVE_REFRESH),\n    LEVEL_UP_MOVE(48, MOVE_PERISH_SONG),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAltariaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PECK),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(1, MOVE_SING),\n    LEVEL_UP_MOVE(8, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(11, MOVE_SING),\n    LEVEL_UP_MOVE(18, MOVE_FURY_ATTACK),\n    LEVEL_UP_MOVE(21, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(28, MOVE_MIST),\n    LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH),\n    LEVEL_UP_MOVE(40, MOVE_DRAGON_DANCE),\n    LEVEL_UP_MOVE(45, MOVE_REFRESH),\n    LEVEL_UP_MOVE(54, MOVE_PERISH_SONG),\n    LEVEL_UP_MOVE(59, MOVE_SKY_ATTACK),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWynautLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SPLASH),\n    LEVEL_UP_MOVE(1, MOVE_CHARM),\n    LEVEL_UP_MOVE(1, MOVE_ENCORE),\n    LEVEL_UP_MOVE(15, MOVE_COUNTER),\n    LEVEL_UP_MOVE(15, MOVE_MIRROR_COAT),\n    LEVEL_UP_MOVE(15, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(15, MOVE_DESTINY_BOND),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDuskullLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(5, MOVE_DISABLE),\n    LEVEL_UP_MOVE(12, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(16, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(27, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(34, MOVE_CURSE),\n    LEVEL_UP_MOVE(38, MOVE_WILL_O_WISP),\n    LEVEL_UP_MOVE(45, MOVE_MEAN_LOOK),\n    LEVEL_UP_MOVE(49, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sDusclopsLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_BIND),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(1, MOVE_DISABLE),\n    LEVEL_UP_MOVE(5, MOVE_DISABLE),\n    LEVEL_UP_MOVE(12, MOVE_FORESIGHT),\n    LEVEL_UP_MOVE(16, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(27, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(34, MOVE_CURSE),\n    LEVEL_UP_MOVE(37, MOVE_SHADOW_PUNCH),\n    LEVEL_UP_MOVE(41, MOVE_WILL_O_WISP),\n    LEVEL_UP_MOVE(51, MOVE_MEAN_LOOK),\n    LEVEL_UP_MOVE(58, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRoseliaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ABSORB),\n    LEVEL_UP_MOVE(5, MOVE_GROWTH),\n    LEVEL_UP_MOVE(9, MOVE_POISON_STING),\n    LEVEL_UP_MOVE(13, MOVE_STUN_SPORE),\n    LEVEL_UP_MOVE(17, MOVE_MEGA_DRAIN),\n    LEVEL_UP_MOVE(21, MOVE_LEECH_SEED),\n    LEVEL_UP_MOVE(25, MOVE_MAGICAL_LEAF),\n    LEVEL_UP_MOVE(29, MOVE_GRASS_WHISTLE),\n    LEVEL_UP_MOVE(33, MOVE_GIGA_DRAIN),\n    LEVEL_UP_MOVE(37, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(41, MOVE_INGRAIN),\n    LEVEL_UP_MOVE(45, MOVE_TOXIC),\n    LEVEL_UP_MOVE(49, MOVE_PETAL_DANCE),\n    LEVEL_UP_MOVE(53, MOVE_AROMATHERAPY),\n    LEVEL_UP_MOVE(57, MOVE_SYNTHESIS),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSlakothLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_YAWN),\n    LEVEL_UP_MOVE(7, MOVE_ENCORE),\n    LEVEL_UP_MOVE(13, MOVE_SLACK_OFF),\n    LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(25, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(31, MOVE_COVET),\n    LEVEL_UP_MOVE(37, MOVE_COUNTER),\n    LEVEL_UP_MOVE(43, MOVE_FLAIL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sVigorothLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(1, MOVE_ENCORE),\n    LEVEL_UP_MOVE(1, MOVE_UPROAR),\n    LEVEL_UP_MOVE(7, MOVE_ENCORE),\n    LEVEL_UP_MOVE(13, MOVE_UPROAR),\n    LEVEL_UP_MOVE(19, MOVE_FURY_SWIPES),\n    LEVEL_UP_MOVE(25, MOVE_ENDURE),\n    LEVEL_UP_MOVE(31, MOVE_SLASH),\n    LEVEL_UP_MOVE(37, MOVE_COUNTER),\n    LEVEL_UP_MOVE(43, MOVE_FOCUS_PUNCH),\n    LEVEL_UP_MOVE(49, MOVE_REVERSAL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSlakingLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_YAWN),\n    LEVEL_UP_MOVE(1, MOVE_ENCORE),\n    LEVEL_UP_MOVE(1, MOVE_SLACK_OFF),\n    LEVEL_UP_MOVE(7, MOVE_ENCORE),\n    LEVEL_UP_MOVE(13, MOVE_SLACK_OFF),\n    LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(25, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(31, MOVE_COVET),\n    LEVEL_UP_MOVE(36, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(37, MOVE_COUNTER),\n    LEVEL_UP_MOVE(43, MOVE_FLAIL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGulpinLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(6, MOVE_YAWN),\n    LEVEL_UP_MOVE(9, MOVE_POISON_GAS),\n    LEVEL_UP_MOVE(14, MOVE_SLUDGE),\n    LEVEL_UP_MOVE(17, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(23, MOVE_ENCORE),\n    LEVEL_UP_MOVE(28, MOVE_TOXIC),\n    LEVEL_UP_MOVE(34, MOVE_STOCKPILE),\n    LEVEL_UP_MOVE(34, MOVE_SPIT_UP),\n    LEVEL_UP_MOVE(34, MOVE_SWALLOW),\n    LEVEL_UP_MOVE(39, MOVE_SLUDGE_BOMB),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSwalotLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_YAWN),\n    LEVEL_UP_MOVE(1, MOVE_POISON_GAS),\n    LEVEL_UP_MOVE(1, MOVE_SLUDGE),\n    LEVEL_UP_MOVE(6, MOVE_YAWN),\n    LEVEL_UP_MOVE(9, MOVE_POISON_GAS),\n    LEVEL_UP_MOVE(14, MOVE_SLUDGE),\n    LEVEL_UP_MOVE(17, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(23, MOVE_ENCORE),\n    LEVEL_UP_MOVE(26, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(31, MOVE_TOXIC),\n    LEVEL_UP_MOVE(40, MOVE_STOCKPILE),\n    LEVEL_UP_MOVE(40, MOVE_SPIT_UP),\n    LEVEL_UP_MOVE(40, MOVE_SWALLOW),\n    LEVEL_UP_MOVE(48, MOVE_SLUDGE_BOMB),\n    LEVEL_UP_END\n};\n\nstatic const u16 sTropiusLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_GUST),\n    LEVEL_UP_MOVE(7, MOVE_GROWTH),\n    LEVEL_UP_MOVE(11, MOVE_RAZOR_LEAF),\n    LEVEL_UP_MOVE(17, MOVE_STOMP),\n    LEVEL_UP_MOVE(21, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(27, MOVE_WHIRLWIND),\n    LEVEL_UP_MOVE(31, MOVE_MAGICAL_LEAF),\n    LEVEL_UP_MOVE(37, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(41, MOVE_SOLAR_BEAM),\n    LEVEL_UP_MOVE(47, MOVE_SYNTHESIS),\n    LEVEL_UP_END\n};\n\nstatic const u16 sWhismurLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(5, MOVE_UPROAR),\n    LEVEL_UP_MOVE(11, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(15, MOVE_HOWL),\n    LEVEL_UP_MOVE(21, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(25, MOVE_STOMP),\n    LEVEL_UP_MOVE(31, MOVE_SCREECH),\n    LEVEL_UP_MOVE(35, MOVE_ROAR),\n    LEVEL_UP_MOVE(41, MOVE_REST),\n    LEVEL_UP_MOVE(41, MOVE_SLEEP_TALK),\n    LEVEL_UP_MOVE(45, MOVE_HYPER_VOICE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLoudredLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_UPROAR),\n    LEVEL_UP_MOVE(1, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(1, MOVE_HOWL),\n    LEVEL_UP_MOVE(5, MOVE_UPROAR),\n    LEVEL_UP_MOVE(11, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(15, MOVE_HOWL),\n    LEVEL_UP_MOVE(23, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(29, MOVE_STOMP),\n    LEVEL_UP_MOVE(37, MOVE_SCREECH),\n    LEVEL_UP_MOVE(43, MOVE_ROAR),\n    LEVEL_UP_MOVE(51, MOVE_REST),\n    LEVEL_UP_MOVE(51, MOVE_SLEEP_TALK),\n    LEVEL_UP_MOVE(57, MOVE_HYPER_VOICE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sExploudLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_POUND),\n    LEVEL_UP_MOVE(1, MOVE_UPROAR),\n    LEVEL_UP_MOVE(1, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(1, MOVE_HOWL),\n    LEVEL_UP_MOVE(5, MOVE_UPROAR),\n    LEVEL_UP_MOVE(11, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(15, MOVE_HOWL),\n    LEVEL_UP_MOVE(23, MOVE_SUPERSONIC),\n    LEVEL_UP_MOVE(29, MOVE_STOMP),\n    LEVEL_UP_MOVE(37, MOVE_SCREECH),\n    LEVEL_UP_MOVE(40, MOVE_HYPER_BEAM),\n    LEVEL_UP_MOVE(45, MOVE_ROAR),\n    LEVEL_UP_MOVE(55, MOVE_REST),\n    LEVEL_UP_MOVE(55, MOVE_SLEEP_TALK),\n    LEVEL_UP_MOVE(63, MOVE_HYPER_VOICE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sClamperlLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_CLAMP),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(1, MOVE_WHIRLPOOL),\n    LEVEL_UP_MOVE(1, MOVE_IRON_DEFENSE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sHuntailLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WHIRLPOOL),\n    LEVEL_UP_MOVE(8, MOVE_BITE),\n    LEVEL_UP_MOVE(15, MOVE_SCREECH),\n    LEVEL_UP_MOVE(22, MOVE_WATER_PULSE),\n    LEVEL_UP_MOVE(29, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(36, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(43, MOVE_BATON_PASS),\n    LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGorebyssLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WHIRLPOOL),\n    LEVEL_UP_MOVE(8, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(15, MOVE_AGILITY),\n    LEVEL_UP_MOVE(22, MOVE_WATER_PULSE),\n    LEVEL_UP_MOVE(29, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(36, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(43, MOVE_BATON_PASS),\n    LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAbsolLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(5, MOVE_LEER),\n    LEVEL_UP_MOVE(9, MOVE_TAUNT),\n    LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(17, MOVE_RAZOR_WIND),\n    LEVEL_UP_MOVE(21, MOVE_BITE),\n    LEVEL_UP_MOVE(26, MOVE_SWORDS_DANCE),\n    LEVEL_UP_MOVE(31, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(36, MOVE_SLASH),\n    LEVEL_UP_MOVE(41, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(46, MOVE_PERISH_SONG),\n    LEVEL_UP_END\n};\n\nstatic const u16 sShuppetLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_KNOCK_OFF),\n    LEVEL_UP_MOVE(8, MOVE_SCREECH),\n    LEVEL_UP_MOVE(13, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(20, MOVE_CURSE),\n    LEVEL_UP_MOVE(25, MOVE_SPITE),\n    LEVEL_UP_MOVE(32, MOVE_WILL_O_WISP),\n    LEVEL_UP_MOVE(37, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(44, MOVE_SHADOW_BALL),\n    LEVEL_UP_MOVE(49, MOVE_SNATCH),\n    LEVEL_UP_MOVE(56, MOVE_GRUDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBanetteLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_KNOCK_OFF),\n    LEVEL_UP_MOVE(1, MOVE_SCREECH),\n    LEVEL_UP_MOVE(1, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(1, MOVE_CURSE),\n    LEVEL_UP_MOVE(8, MOVE_SCREECH),\n    LEVEL_UP_MOVE(13, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(20, MOVE_CURSE),\n    LEVEL_UP_MOVE(25, MOVE_SPITE),\n    LEVEL_UP_MOVE(32, MOVE_WILL_O_WISP),\n    LEVEL_UP_MOVE(39, MOVE_FAINT_ATTACK),\n    LEVEL_UP_MOVE(48, MOVE_SHADOW_BALL),\n    LEVEL_UP_MOVE(55, MOVE_SNATCH),\n    LEVEL_UP_MOVE(64, MOVE_GRUDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSeviperLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WRAP),\n    LEVEL_UP_MOVE(7, MOVE_LICK),\n    LEVEL_UP_MOVE(10, MOVE_BITE),\n    LEVEL_UP_MOVE(16, MOVE_POISON_TAIL),\n    LEVEL_UP_MOVE(19, MOVE_SCREECH),\n    LEVEL_UP_MOVE(25, MOVE_GLARE),\n    LEVEL_UP_MOVE(28, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(34, MOVE_POISON_FANG),\n    LEVEL_UP_MOVE(37, MOVE_SWAGGER),\n    LEVEL_UP_MOVE(43, MOVE_HAZE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sZangooseLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(4, MOVE_LEER),\n    LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(10, MOVE_SWORDS_DANCE),\n    LEVEL_UP_MOVE(13, MOVE_FURY_CUTTER),\n    LEVEL_UP_MOVE(19, MOVE_SLASH),\n    LEVEL_UP_MOVE(25, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(31, MOVE_CRUSH_CLAW),\n    LEVEL_UP_MOVE(37, MOVE_TAUNT),\n    LEVEL_UP_MOVE(46, MOVE_DETECT),\n    LEVEL_UP_MOVE(55, MOVE_FALSE_SWIPE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRelicanthLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(8, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB),\n    LEVEL_UP_MOVE(22, MOVE_YAWN),\n    LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(36, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(43, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(50, MOVE_REST),\n    LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_MOVE(64, MOVE_HYDRO_PUMP),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAronLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(4, MOVE_HARDEN),\n    LEVEL_UP_MOVE(7, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(10, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(13, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE),\n    LEVEL_UP_MOVE(21, MOVE_ROAR),\n    LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(29, MOVE_IRON_TAIL),\n    LEVEL_UP_MOVE(34, MOVE_PROTECT),\n    LEVEL_UP_MOVE(39, MOVE_METAL_SOUND),\n    LEVEL_UP_MOVE(44, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLaironLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(1, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(1, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(4, MOVE_HARDEN),\n    LEVEL_UP_MOVE(7, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(10, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(13, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE),\n    LEVEL_UP_MOVE(21, MOVE_ROAR),\n    LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(29, MOVE_IRON_TAIL),\n    LEVEL_UP_MOVE(37, MOVE_PROTECT),\n    LEVEL_UP_MOVE(45, MOVE_METAL_SOUND),\n    LEVEL_UP_MOVE(53, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAggronLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(1, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(1, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(4, MOVE_HARDEN),\n    LEVEL_UP_MOVE(7, MOVE_MUD_SLAP),\n    LEVEL_UP_MOVE(10, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(13, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE),\n    LEVEL_UP_MOVE(21, MOVE_ROAR),\n    LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(29, MOVE_IRON_TAIL),\n    LEVEL_UP_MOVE(37, MOVE_PROTECT),\n    LEVEL_UP_MOVE(50, MOVE_METAL_SOUND),\n    LEVEL_UP_MOVE(63, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCastformLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(10, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(10, MOVE_EMBER),\n    LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW),\n    LEVEL_UP_MOVE(20, MOVE_RAIN_DANCE),\n    LEVEL_UP_MOVE(20, MOVE_SUNNY_DAY),\n    LEVEL_UP_MOVE(20, MOVE_HAIL),\n    LEVEL_UP_MOVE(30, MOVE_WEATHER_BALL),\n    LEVEL_UP_END\n};\n\nstatic const u16 sVolbeatLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(5, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(9, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(13, MOVE_MOONLIGHT),\n    LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(21, MOVE_TAIL_GLOW),\n    LEVEL_UP_MOVE(25, MOVE_SIGNAL_BEAM),\n    LEVEL_UP_MOVE(29, MOVE_PROTECT),\n    LEVEL_UP_MOVE(33, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sIllumiseLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TACKLE),\n    LEVEL_UP_MOVE(5, MOVE_SWEET_SCENT),\n    LEVEL_UP_MOVE(9, MOVE_CHARM),\n    LEVEL_UP_MOVE(13, MOVE_MOONLIGHT),\n    LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK),\n    LEVEL_UP_MOVE(21, MOVE_WISH),\n    LEVEL_UP_MOVE(25, MOVE_ENCORE),\n    LEVEL_UP_MOVE(29, MOVE_FLATTER),\n    LEVEL_UP_MOVE(33, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(37, MOVE_COVET),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLileepLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(8, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(15, MOVE_ACID),\n    LEVEL_UP_MOVE(22, MOVE_INGRAIN),\n    LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(36, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(43, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(50, MOVE_STOCKPILE),\n    LEVEL_UP_MOVE(50, MOVE_SPIT_UP),\n    LEVEL_UP_MOVE(50, MOVE_SWALLOW),\n    LEVEL_UP_END\n};\n\nstatic const u16 sCradilyLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(1, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(1, MOVE_ACID),\n    LEVEL_UP_MOVE(1, MOVE_INGRAIN),\n    LEVEL_UP_MOVE(8, MOVE_CONSTRICT),\n    LEVEL_UP_MOVE(15, MOVE_ACID),\n    LEVEL_UP_MOVE(22, MOVE_INGRAIN),\n    LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY),\n    LEVEL_UP_MOVE(36, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(48, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(60, MOVE_STOCKPILE),\n    LEVEL_UP_MOVE(60, MOVE_SPIT_UP),\n    LEVEL_UP_MOVE(60, MOVE_SWALLOW),\n    LEVEL_UP_END\n};\n\nstatic const u16 sAnorithLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(7, MOVE_HARDEN),\n    LEVEL_UP_MOVE(13, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(19, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(25, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(31, MOVE_PROTECT),\n    LEVEL_UP_MOVE(37, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(43, MOVE_FURY_CUTTER),\n    LEVEL_UP_MOVE(49, MOVE_SLASH),\n    LEVEL_UP_MOVE(55, MOVE_ROCK_BLAST),\n    LEVEL_UP_END\n};\n\nstatic const u16 sArmaldoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_SCRATCH),\n    LEVEL_UP_MOVE(1, MOVE_HARDEN),\n    LEVEL_UP_MOVE(1, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(1, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(7, MOVE_HARDEN),\n    LEVEL_UP_MOVE(13, MOVE_MUD_SPORT),\n    LEVEL_UP_MOVE(19, MOVE_WATER_GUN),\n    LEVEL_UP_MOVE(25, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(31, MOVE_PROTECT),\n    LEVEL_UP_MOVE(37, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER),\n    LEVEL_UP_MOVE(55, MOVE_SLASH),\n    LEVEL_UP_MOVE(64, MOVE_ROCK_BLAST),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRaltsLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(6, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(16, MOVE_TELEPORT),\n    LEVEL_UP_MOVE(21, MOVE_CALM_MIND),\n    LEVEL_UP_MOVE(26, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(31, MOVE_IMPRISON),\n    LEVEL_UP_MOVE(36, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(41, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(46, MOVE_DREAM_EATER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sKirliaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_MAGICAL_LEAF),\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(1, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(1, MOVE_TELEPORT),\n    LEVEL_UP_MOVE(6, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(16, MOVE_TELEPORT),\n    LEVEL_UP_MOVE(21, MOVE_CALM_MIND),\n    LEVEL_UP_MOVE(26, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(33, MOVE_IMPRISON),\n    LEVEL_UP_MOVE(40, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(47, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(54, MOVE_DREAM_EATER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGardevoirLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_GROWL),\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(1, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(1, MOVE_TELEPORT),\n    LEVEL_UP_MOVE(6, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM),\n    LEVEL_UP_MOVE(16, MOVE_TELEPORT),\n    LEVEL_UP_MOVE(21, MOVE_CALM_MIND),\n    LEVEL_UP_MOVE(26, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(33, MOVE_IMPRISON),\n    LEVEL_UP_MOVE(42, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(51, MOVE_HYPNOSIS),\n    LEVEL_UP_MOVE(60, MOVE_DREAM_EATER),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBagonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_RAGE),\n    LEVEL_UP_MOVE(5, MOVE_BITE),\n    LEVEL_UP_MOVE(9, MOVE_LEER),\n    LEVEL_UP_MOVE(17, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(25, MOVE_EMBER),\n    LEVEL_UP_MOVE(33, MOVE_DRAGON_BREATH),\n    LEVEL_UP_MOVE(37, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(41, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(49, MOVE_DRAGON_CLAW),\n    LEVEL_UP_MOVE(53, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sShelgonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_RAGE),\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(5, MOVE_BITE),\n    LEVEL_UP_MOVE(9, MOVE_LEER),\n    LEVEL_UP_MOVE(17, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(25, MOVE_EMBER),\n    LEVEL_UP_MOVE(30, MOVE_PROTECT),\n    LEVEL_UP_MOVE(38, MOVE_DRAGON_BREATH),\n    LEVEL_UP_MOVE(47, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(56, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(69, MOVE_DRAGON_CLAW),\n    LEVEL_UP_MOVE(78, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sSalamenceLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_RAGE),\n    LEVEL_UP_MOVE(1, MOVE_BITE),\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(5, MOVE_BITE),\n    LEVEL_UP_MOVE(9, MOVE_LEER),\n    LEVEL_UP_MOVE(17, MOVE_HEADBUTT),\n    LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),\n    LEVEL_UP_MOVE(25, MOVE_EMBER),\n    LEVEL_UP_MOVE(30, MOVE_PROTECT),\n    LEVEL_UP_MOVE(38, MOVE_DRAGON_BREATH),\n    LEVEL_UP_MOVE(47, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(50, MOVE_FLY),\n    LEVEL_UP_MOVE(61, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(79, MOVE_DRAGON_CLAW),\n    LEVEL_UP_MOVE(93, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sBeldumLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TAKE_DOWN),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMetangLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(20, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(20, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(26, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(32, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(38, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(44, MOVE_IRON_DEFENSE),\n    LEVEL_UP_MOVE(50, MOVE_METEOR_MASH),\n    LEVEL_UP_MOVE(56, MOVE_AGILITY),\n    LEVEL_UP_MOVE(62, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sMetagrossLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(1, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(1, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(20, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(20, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(26, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(32, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(38, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(44, MOVE_IRON_DEFENSE),\n    LEVEL_UP_MOVE(55, MOVE_METEOR_MASH),\n    LEVEL_UP_MOVE(66, MOVE_AGILITY),\n    LEVEL_UP_MOVE(77, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRegirockLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_EXPLOSION),\n    LEVEL_UP_MOVE(9, MOVE_ROCK_THROW),\n    LEVEL_UP_MOVE(17, MOVE_CURSE),\n    LEVEL_UP_MOVE(25, MOVE_SUPERPOWER),\n    LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE),\n    LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON),\n    LEVEL_UP_MOVE(57, MOVE_LOCK_ON),\n    LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRegiceLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_EXPLOSION),\n    LEVEL_UP_MOVE(9, MOVE_ICY_WIND),\n    LEVEL_UP_MOVE(17, MOVE_CURSE),\n    LEVEL_UP_MOVE(25, MOVE_SUPERPOWER),\n    LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(41, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON),\n    LEVEL_UP_MOVE(57, MOVE_LOCK_ON),\n    LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRegisteelLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_EXPLOSION),\n    LEVEL_UP_MOVE(9, MOVE_METAL_CLAW),\n    LEVEL_UP_MOVE(17, MOVE_CURSE),\n    LEVEL_UP_MOVE(25, MOVE_SUPERPOWER),\n    LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE),\n    LEVEL_UP_MOVE(41, MOVE_AMNESIA),\n    LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON),\n    LEVEL_UP_MOVE(57, MOVE_LOCK_ON),\n    LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sKyogreLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WATER_PULSE),\n    LEVEL_UP_MOVE(5, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(20, MOVE_BODY_SLAM),\n    LEVEL_UP_MOVE(30, MOVE_CALM_MIND),\n    LEVEL_UP_MOVE(35, MOVE_ICE_BEAM),\n    LEVEL_UP_MOVE(45, MOVE_HYDRO_PUMP),\n    LEVEL_UP_MOVE(50, MOVE_REST),\n    LEVEL_UP_MOVE(60, MOVE_SHEER_COLD),\n    LEVEL_UP_MOVE(65, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_MOVE(75, MOVE_WATER_SPOUT),\n    LEVEL_UP_END\n};\n\nstatic const u16 sGroudonLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_MUD_SHOT),\n    LEVEL_UP_MOVE(5, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(20, MOVE_SLASH),\n    LEVEL_UP_MOVE(30, MOVE_BULK_UP),\n    LEVEL_UP_MOVE(35, MOVE_EARTHQUAKE),\n    LEVEL_UP_MOVE(45, MOVE_FIRE_BLAST),\n    LEVEL_UP_MOVE(50, MOVE_REST),\n    LEVEL_UP_MOVE(60, MOVE_FISSURE),\n    LEVEL_UP_MOVE(65, MOVE_SOLAR_BEAM),\n    LEVEL_UP_MOVE(75, MOVE_ERUPTION),\n    LEVEL_UP_END\n};\n\nstatic const u16 sRayquazaLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_TWISTER),\n    LEVEL_UP_MOVE(5, MOVE_SCARY_FACE),\n    LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER),\n    LEVEL_UP_MOVE(20, MOVE_DRAGON_CLAW),\n    LEVEL_UP_MOVE(30, MOVE_DRAGON_DANCE),\n    LEVEL_UP_MOVE(35, MOVE_CRUNCH),\n    LEVEL_UP_MOVE(45, MOVE_FLY),\n    LEVEL_UP_MOVE(50, MOVE_REST),\n    LEVEL_UP_MOVE(60, MOVE_EXTREME_SPEED),\n    LEVEL_UP_MOVE(65, MOVE_OUTRAGE),\n    LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLatiasLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PSYWAVE),\n    LEVEL_UP_MOVE(5, MOVE_WISH),\n    LEVEL_UP_MOVE(10, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(15, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(20, MOVE_DRAGON_BREATH),\n    LEVEL_UP_MOVE(25, MOVE_WATER_SPORT),\n    LEVEL_UP_MOVE(30, MOVE_REFRESH),\n    LEVEL_UP_MOVE(35, MOVE_MIST_BALL),\n    LEVEL_UP_MOVE(40, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(45, MOVE_RECOVER),\n    LEVEL_UP_MOVE(50, MOVE_CHARM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sLatiosLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_PSYWAVE),\n    LEVEL_UP_MOVE(5, MOVE_MEMENTO),\n    LEVEL_UP_MOVE(10, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(15, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(20, MOVE_DRAGON_BREATH),\n    LEVEL_UP_MOVE(25, MOVE_PROTECT),\n    LEVEL_UP_MOVE(30, MOVE_REFRESH),\n    LEVEL_UP_MOVE(35, MOVE_LUSTER_PURGE),\n    LEVEL_UP_MOVE(40, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(45, MOVE_RECOVER),\n    LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE),\n    LEVEL_UP_END\n};\n\nstatic const u16 sJirachiLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WISH),\n    LEVEL_UP_MOVE(1, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(5, MOVE_REST),\n    LEVEL_UP_MOVE(10, MOVE_SWIFT),\n    LEVEL_UP_MOVE(15, MOVE_HELPING_HAND),\n    LEVEL_UP_MOVE(20, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(25, MOVE_REFRESH),\n    LEVEL_UP_MOVE(30, MOVE_REST),\n    LEVEL_UP_MOVE(35, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_MOVE(40, MOVE_FUTURE_SIGHT),\n    LEVEL_UP_MOVE(45, MOVE_COSMIC_POWER),\n    LEVEL_UP_MOVE(50, MOVE_DOOM_DESIRE),\n    LEVEL_UP_END\n};\n// overwritten in pokemon.c where formes are handled.\nstatic const u16 sDeoxysLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_LEER),\n    LEVEL_UP_MOVE(1, MOVE_WRAP),\n    LEVEL_UP_MOVE(5, MOVE_NIGHT_SHADE),\n    LEVEL_UP_MOVE(10, MOVE_TELEPORT),\n    LEVEL_UP_MOVE(15, MOVE_TAUNT),\n    LEVEL_UP_MOVE(20, MOVE_PURSUIT),\n    LEVEL_UP_MOVE(25, MOVE_PSYCHIC),\n    LEVEL_UP_MOVE(30, MOVE_SUPERPOWER),\n    LEVEL_UP_MOVE(35, MOVE_COSMIC_POWER),\n    LEVEL_UP_MOVE(40, MOVE_ZAP_CANNON),\n    LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST),\n    LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM),\n    LEVEL_UP_END\n};\n\nstatic const u16 sChimechoLevelUpLearnset[] = {\n    LEVEL_UP_MOVE(1, MOVE_WRAP),\n    LEVEL_UP_MOVE(6, MOVE_GROWL),\n    LEVEL_UP_MOVE(9, MOVE_ASTONISH),\n    LEVEL_UP_MOVE(14, MOVE_CONFUSION),\n    LEVEL_UP_MOVE(17, MOVE_TAKE_DOWN),\n    LEVEL_UP_MOVE(22, MOVE_UPROAR),\n    LEVEL_UP_MOVE(25, MOVE_YAWN),\n    LEVEL_UP_MOVE(30, MOVE_PSYWAVE),\n    LEVEL_UP_MOVE(33, MOVE_DOUBLE_EDGE),\n    LEVEL_UP_MOVE(38, MOVE_HEAL_BELL),\n    LEVEL_UP_MOVE(41, MOVE_SAFEGUARD),\n    LEVEL_UP_MOVE(46, MOVE_PSYCHIC),\n    LEVEL_UP_END\n};\n"
  },
  {
    "path": "src/data/pokemon/pokedex_categories.h",
    "content": "static const u16 sDexCategory_GrasslandPkmn_Page1[] = {\n    SPECIES_RATTATA,\n    SPECIES_RATICATE,\n    SPECIES_SENTRET,\n    SPECIES_FURRET,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page2[] = {\n    SPECIES_ZIGZAGOON,\n    SPECIES_LINOONE,\n    SPECIES_POOCHYENA,\n    SPECIES_MIGHTYENA,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page3[] = {\n    SPECIES_NIDORAN_F,\n    SPECIES_NIDORINA,\n    SPECIES_NIDOQUEEN,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page4[] = {\n    SPECIES_NIDORAN_M,\n    SPECIES_NIDORINO,\n    SPECIES_NIDOKING,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page5[] = {\n    SPECIES_DODUO,\n    SPECIES_DODRIO,\n    SPECIES_TAILLOW,\n    SPECIES_SWELLOW,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page6[] = {\n    SPECIES_TANGELA,\n    SPECIES_ROSELIA,\n    SPECIES_SUNKERN,\n    SPECIES_SUNFLORA,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page7[] = {\n    SPECIES_HOPPIP,\n    SPECIES_SKIPLOOM,\n    SPECIES_JUMPLUFF,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page8[] = {\n    SPECIES_ODDISH,\n    SPECIES_GLOOM,\n    SPECIES_VILEPLUME,\n    SPECIES_BELLOSSOM,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page9[] = {\n    SPECIES_EKANS,\n    SPECIES_ARBOK,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page10[] = {\n    SPECIES_IGGLYBUFF,\n    SPECIES_JIGGLYPUFF,\n    SPECIES_WIGGLYTUFF,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page11[] = {\n    SPECIES_MAREEP,\n    SPECIES_FLAAFFY,\n    SPECIES_AMPHAROS,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page12[] = {\n    SPECIES_FARFETCHD,\n    SPECIES_LICKITUNG,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page13[] = {\n    SPECIES_SCYTHER,\n    SPECIES_SCIZOR,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page14[] = {\n    SPECIES_DROWZEE,\n    SPECIES_HYPNO,\n    SPECIES_GULPIN,\n    SPECIES_SWALOT,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page15[] = {\n    SPECIES_KANGASKHAN,\n    SPECIES_GIRAFARIG,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page16[] = {\n    SPECIES_TAUROS,\n    SPECIES_MILTANK,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page17[] = {\n    SPECIES_VULPIX,\n    SPECIES_NINETALES,\n    SPECIES_PONYTA,\n    SPECIES_RAPIDASH,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page18[] = {\n    SPECIES_ELEKID,\n    SPECIES_ELECTABUZZ,\n    SPECIES_ELECTRIKE,\n    SPECIES_MANECTRIC,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page19[] = {\n    SPECIES_ZANGOOSE,\n    SPECIES_SEVIPER,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page20[] = {\n    SPECIES_PLUSLE,\n    SPECIES_MINUN,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page21[] = {\n    SPECIES_GROWLITHE,\n    SPECIES_ARCANINE,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page22[] = {\n    SPECIES_CASTFORM,\n    SPECIES_CHIMECHO,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page23[] = {\n    SPECIES_BULBASAUR,\n    SPECIES_IVYSAUR,\n    SPECIES_VENUSAUR,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page24[] = {\n    SPECIES_CHIKORITA,\n    SPECIES_BAYLEEF,\n    SPECIES_MEGANIUM,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page25[] = {\n    SPECIES_CYNDAQUIL,\n    SPECIES_QUILAVA,\n    SPECIES_TYPHLOSION,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page26[] = {\n    SPECIES_TORCHIC,\n    SPECIES_COMBUSKEN,\n    SPECIES_BLAZIKEN,\n};\n\nstatic const u16 sDexCategory_GrasslandPkmn_Page27[] = {\n    SPECIES_RAIKOU,\n    SPECIES_ENTEI,\n    SPECIES_SUICUNE,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page1[] = {\n    SPECIES_CATERPIE,\n    SPECIES_METAPOD,\n    SPECIES_BUTTERFREE,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page2[] = {\n    SPECIES_WEEDLE,\n    SPECIES_KAKUNA,\n    SPECIES_BEEDRILL,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page3[] = {\n    SPECIES_WURMPLE,\n    SPECIES_SILCOON,\n    SPECIES_BEAUTIFLY,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page4[] = {\n    SPECIES_CASCOON,\n    SPECIES_DUSTOX,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page5[] = {\n    SPECIES_PIDGEY,\n    SPECIES_PIDGEOTTO,\n    SPECIES_PIDGEOT,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page6[] = {\n    SPECIES_HOOTHOOT,\n    SPECIES_NOCTOWL,\n    SPECIES_NATU,\n    SPECIES_XATU,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page7[] = {\n    SPECIES_PICHU,\n    SPECIES_PIKACHU,\n    SPECIES_RAICHU,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page8[] = {\n    SPECIES_BELLSPROUT,\n    SPECIES_WEEPINBELL,\n    SPECIES_VICTREEBEL,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page9[] = {\n    SPECIES_PARAS,\n    SPECIES_PARASECT,\n    SPECIES_SHROOMISH,\n    SPECIES_BRELOOM,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page10[] = {\n    SPECIES_SEEDOT,\n    SPECIES_NUZLEAF,\n    SPECIES_SHIFTRY,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page11[] = {\n    SPECIES_VENONAT,\n    SPECIES_VENOMOTH,\n    SPECIES_YANMA,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page12[] = {\n    SPECIES_LEDYBA,\n    SPECIES_LEDIAN,\n    SPECIES_SPINARAK,\n    SPECIES_ARIADOS,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page13[] = {\n    SPECIES_NINCADA,\n    SPECIES_NINJASK,\n    SPECIES_SHEDINJA,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page14[] = {\n    SPECIES_VOLBEAT,\n    SPECIES_ILLUMISE,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page15[] = {\n    SPECIES_PINECO,\n    SPECIES_FORRETRESS,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page16[] = {\n    SPECIES_SLAKOTH,\n    SPECIES_VIGOROTH,\n    SPECIES_SLAKING,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page17[] = {\n    SPECIES_SKITTY,\n    SPECIES_DELCATTY,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page18[] = {\n    SPECIES_MURKROW,\n    SPECIES_SNEASEL,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page19[] = {\n    SPECIES_EXEGGCUTE,\n    SPECIES_EXEGGUTOR,\n    SPECIES_SUDOWOODO,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page20[] = {\n    SPECIES_AIPOM,\n    SPECIES_STANTLER,\n    SPECIES_KECLEON,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page21[] = {\n    SPECIES_PINSIR,\n    SPECIES_HERACROSS,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page22[] = {\n    SPECIES_SWABLU,\n    SPECIES_ALTARIA,\n    SPECIES_TROPIUS,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page23[] = {\n    SPECIES_DUSKULL,\n    SPECIES_DUSCLOPS,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page24[] = {\n    SPECIES_TOGEPI,\n    SPECIES_TOGETIC,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page25[] = {\n    SPECIES_TREECKO,\n    SPECIES_GROVYLE,\n    SPECIES_SCEPTILE,\n};\n\nstatic const u16 sDexCategory_ForestPkmn_Page26[] = {\n    SPECIES_CELEBI,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page1[] = {\n    SPECIES_GOLDEEN,\n    SPECIES_SEAKING,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page2[] = {\n    SPECIES_MAGIKARP,\n    SPECIES_GYARADOS,\n    SPECIES_KRABBY,\n    SPECIES_KINGLER,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page3[] = {\n    SPECIES_CORPHISH,\n    SPECIES_CRAWDAUNT,\n    SPECIES_BARBOACH,\n    SPECIES_WHISCASH,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page4[] = {\n    SPECIES_LOTAD,\n    SPECIES_LOMBRE,\n    SPECIES_LUDICOLO,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page5[] = {\n    SPECIES_SURSKIT,\n    SPECIES_MASQUERAIN,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page6[] = {\n    SPECIES_PSYDUCK,\n    SPECIES_GOLDUCK,\n    SPECIES_WOOPER,\n    SPECIES_QUAGSIRE,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page7[] = {\n    SPECIES_POLIWAG,\n    SPECIES_POLIWHIRL,\n    SPECIES_POLIWRATH,\n    SPECIES_POLITOED,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page8[] = {\n    SPECIES_AZURILL,\n    SPECIES_MARILL,\n    SPECIES_AZUMARILL,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page9[] = {\n    SPECIES_SLOWPOKE,\n    SPECIES_SLOWBRO,\n    SPECIES_SLOWKING,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page10[] = {\n    SPECIES_FEEBAS,\n    SPECIES_MILOTIC,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page11[] = {\n    SPECIES_ANORITH,\n    SPECIES_ARMALDO,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page12[] = {\n    SPECIES_DRATINI,\n    SPECIES_DRAGONAIR,\n    SPECIES_DRAGONITE,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page13[] = {\n    SPECIES_SQUIRTLE,\n    SPECIES_WARTORTLE,\n    SPECIES_BLASTOISE,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page14[] = {\n    SPECIES_TOTODILE,\n    SPECIES_CROCONAW,\n    SPECIES_FERALIGATR,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page15[] = {\n    SPECIES_MUDKIP,\n    SPECIES_MARSHTOMP,\n    SPECIES_SWAMPERT,\n};\n\nstatic const u16 sDexCategory_WatersEdgePkmn_Page16[] = {\n    SPECIES_LATIAS,\n    SPECIES_LATIOS,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page1[] = {\n    SPECIES_TENTACOOL,\n    SPECIES_TENTACRUEL,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page2[] = {\n    SPECIES_WINGULL,\n    SPECIES_PELIPPER,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page3[] = {\n    SPECIES_STARYU,\n    SPECIES_STARMIE,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page4[] = {\n    SPECIES_CHINCHOU,\n    SPECIES_LANTURN,\n    SPECIES_REMORAID,\n    SPECIES_OCTILLERY,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page5[] = {\n    SPECIES_SHELLDER,\n    SPECIES_CLOYSTER,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page6[] = {\n    SPECIES_CLAMPERL,\n    SPECIES_HUNTAIL,\n    SPECIES_GOREBYSS,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page7[] = {\n    SPECIES_QWILFISH,\n    SPECIES_CORSOLA,\n    SPECIES_MANTINE,\n    SPECIES_LUVDISC,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page8[] = {\n    SPECIES_SEEL,\n    SPECIES_DEWGONG,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page9[] = {\n    SPECIES_SPHEAL,\n    SPECIES_SEALEO,\n    SPECIES_WALREIN,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page10[] = {\n    SPECIES_CARVANHA,\n    SPECIES_SHARPEDO,\n    SPECIES_WAILMER,\n    SPECIES_WAILORD,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page11[] = {\n    SPECIES_HORSEA,\n    SPECIES_SEADRA,\n    SPECIES_KINGDRA,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page12[] = {\n    SPECIES_RELICANTH,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page13[] = {\n    SPECIES_LAPRAS,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page14[] = {\n    SPECIES_OMANYTE,\n    SPECIES_OMASTAR,\n    SPECIES_KABUTO,\n    SPECIES_KABUTOPS,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page15[] = {\n    SPECIES_LILEEP,\n    SPECIES_CRADILY,\n};\n\nstatic const u16 sDexCategory_SeaPkmn_Page16[] = {\n    SPECIES_KYOGRE,\n};\n\nstatic const u16 sDexCategory_CavePkmn_Page1[] = {\n    SPECIES_ZUBAT,\n    SPECIES_GOLBAT,\n    SPECIES_CROBAT,\n};\n\nstatic const u16 sDexCategory_CavePkmn_Page2[] = {\n    SPECIES_DIGLETT,\n    SPECIES_DUGTRIO,\n    SPECIES_ONIX,\n    SPECIES_STEELIX,\n};\n\nstatic const u16 sDexCategory_CavePkmn_Page3[] = {\n    SPECIES_SWINUB,\n    SPECIES_PILOSWINE,\n    SPECIES_SNORUNT,\n    SPECIES_GLALIE,\n};\n\nstatic const u16 sDexCategory_CavePkmn_Page4[] = {\n    SPECIES_WHISMUR,\n    SPECIES_LOUDRED,\n    SPECIES_EXPLOUD,\n};\n\nstatic const u16 sDexCategory_CavePkmn_Page5[] = {\n    SPECIES_MISDREAVUS,\n    SPECIES_DUNSPARCE,\n    SPECIES_NOSEPASS,\n};\n\nstatic const u16 sDexCategory_CavePkmn_Page6[] = {\n    SPECIES_SABLEYE,\n    SPECIES_MAWILE,\n};\n\nstatic const u16 sDexCategory_CavePkmn_Page7[] = {\n    SPECIES_GASTLY,\n    SPECIES_HAUNTER,\n    SPECIES_GENGAR,\n};\n\nstatic const u16 sDexCategory_CavePkmn_Page8[] = {\n    SPECIES_WYNAUT,\n    SPECIES_WOBBUFFET,\n};\n\nstatic const u16 sDexCategory_CavePkmn_Page9[] = {\n    SPECIES_LUNATONE,\n    SPECIES_SOLROCK,\n};\n\nstatic const u16 sDexCategory_CavePkmn_Page10[] = {\n    SPECIES_REGIROCK,\n    SPECIES_REGICE,\n    SPECIES_REGISTEEL,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page1[] = {\n    SPECIES_GEODUDE,\n    SPECIES_GRAVELER,\n    SPECIES_GOLEM,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page2[] = {\n    SPECIES_MANKEY,\n    SPECIES_PRIMEAPE,\n    SPECIES_SPOINK,\n    SPECIES_GRUMPIG,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page3[] = {\n    SPECIES_MACHOP,\n    SPECIES_MACHOKE,\n    SPECIES_MACHAMP,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page4[] = {\n    SPECIES_CLEFFA,\n    SPECIES_CLEFAIRY,\n    SPECIES_CLEFABLE,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page5[] = {\n    SPECIES_CUBONE,\n    SPECIES_MAROWAK,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page6[] = {\n    SPECIES_SLUGMA,\n    SPECIES_MAGCARGO,\n    SPECIES_NUMEL,\n    SPECIES_CAMERUPT,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page7[] = {\n    SPECIES_MAKUHITA,\n    SPECIES_HARIYAMA,\n    SPECIES_MEDITITE,\n    SPECIES_MEDICHAM,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page8[] = {\n    SPECIES_SHUCKLE,\n    SPECIES_TEDDIURSA,\n    SPECIES_URSARING,\n    SPECIES_DELIBIRD,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page9[] = {\n    SPECIES_GLIGAR,\n    SPECIES_SPINDA,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page10[] = {\n    SPECIES_MAGBY,\n    SPECIES_MAGMAR,\n    SPECIES_TORKOAL,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page11[] = {\n    SPECIES_ARON,\n    SPECIES_LAIRON,\n    SPECIES_AGGRON,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page12[] = {\n    SPECIES_LARVITAR,\n    SPECIES_PUPITAR,\n    SPECIES_TYRANITAR,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page13[] = {\n    SPECIES_SNORLAX,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page14[] = {\n    SPECIES_ABSOL,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page15[] = {\n    SPECIES_AERODACTYL,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page16[] = {\n    SPECIES_CHARMANDER,\n    SPECIES_CHARMELEON,\n    SPECIES_CHARIZARD,\n};\n\nstatic const u16 sDexCategory_MountainPkmn_Page17[] = {\n    SPECIES_JIRACHI,\n};\n\nstatic const u16 sDexCategory_RoughTerrainPkmn_Page1[] = {\n    SPECIES_SPEAROW,\n    SPECIES_FEAROW,\n};\n\nstatic const u16 sDexCategory_RoughTerrainPkmn_Page2[] = {\n    SPECIES_SANDSHREW,\n    SPECIES_SANDSLASH,\n    SPECIES_RHYHORN,\n    SPECIES_RHYDON,\n};\n\nstatic const u16 sDexCategory_RoughTerrainPkmn_Page3[] = {\n    SPECIES_MAGNEMITE,\n    SPECIES_MAGNETON,\n};\n\nstatic const u16 sDexCategory_RoughTerrainPkmn_Page4[] = {\n    SPECIES_HOUNDOUR,\n    SPECIES_HOUNDOOM,\n    SPECIES_PHANPY,\n    SPECIES_DONPHAN,\n};\n\nstatic const u16 sDexCategory_RoughTerrainPkmn_Page5[] = {\n    SPECIES_CACNEA,\n    SPECIES_CACTURNE,\n};\n\nstatic const u16 sDexCategory_RoughTerrainPkmn_Page6[] = {\n    SPECIES_TRAPINCH,\n    SPECIES_VIBRAVA,\n    SPECIES_FLYGON,\n};\n\nstatic const u16 sDexCategory_RoughTerrainPkmn_Page7[] = {\n    SPECIES_SKARMORY,\n};\n\nstatic const u16 sDexCategory_RoughTerrainPkmn_Page8[] = {\n    SPECIES_BALTOY,\n    SPECIES_CLAYDOL,\n};\n\nstatic const u16 sDexCategory_RoughTerrainPkmn_Page9[] = {\n    SPECIES_BAGON,\n    SPECIES_SHELGON,\n    SPECIES_SALAMENCE,\n};\n\nstatic const u16 sDexCategory_RoughTerrainPkmn_Page10[] = {\n    SPECIES_BELDUM,\n    SPECIES_METANG,\n    SPECIES_METAGROSS,\n};\n\nstatic const u16 sDexCategory_RoughTerrainPkmn_Page11[] = {\n    SPECIES_GROUDON,\n};\n\nstatic const u16 sDexCategory_UrbanPkmn_Page1[] = {\n    SPECIES_MEOWTH,\n    SPECIES_PERSIAN,\n    SPECIES_SNUBBULL,\n    SPECIES_GRANBULL,\n};\n\nstatic const u16 sDexCategory_UrbanPkmn_Page2[] = {\n    SPECIES_GRIMER,\n    SPECIES_MUK,\n    SPECIES_KOFFING,\n    SPECIES_WEEZING,\n};\n\nstatic const u16 sDexCategory_UrbanPkmn_Page3[] = {\n    SPECIES_SHUPPET,\n    SPECIES_BANETTE,\n};\n\nstatic const u16 sDexCategory_UrbanPkmn_Page4[] = {\n    SPECIES_ABRA,\n    SPECIES_KADABRA,\n    SPECIES_ALAKAZAM,\n};\n\nstatic const u16 sDexCategory_UrbanPkmn_Page5[] = {\n    SPECIES_RALTS,\n    SPECIES_KIRLIA,\n    SPECIES_GARDEVOIR,\n};\n\nstatic const u16 sDexCategory_UrbanPkmn_Page6[] = {\n    SPECIES_SMOOCHUM,\n    SPECIES_JYNX,\n    SPECIES_MR_MIME,\n    SPECIES_SMEARGLE,\n};\n\nstatic const u16 sDexCategory_UrbanPkmn_Page7[] = {\n    SPECIES_TYROGUE,\n    SPECIES_HITMONLEE,\n    SPECIES_HITMONCHAN,\n    SPECIES_HITMONTOP,\n};\n\nstatic const u16 sDexCategory_UrbanPkmn_Page8[] = {\n    SPECIES_CHANSEY,\n    SPECIES_BLISSEY,\n};\n\nstatic const u16 sDexCategory_UrbanPkmn_Page9[] = {\n    SPECIES_VOLTORB,\n    SPECIES_ELECTRODE,\n    SPECIES_PORYGON,\n    SPECIES_PORYGON2,\n};\n\nstatic const u16 sDexCategory_UrbanPkmn_Page10[] = {\n    SPECIES_DITTO,\n};\n\nstatic const u16 sDexCategory_UrbanPkmn_Page11[] = {\n    SPECIES_EEVEE,\n    SPECIES_VAPOREON,\n    SPECIES_JOLTEON,\n    SPECIES_FLAREON,\n};\n\nstatic const u16 sDexCategory_UrbanPkmn_Page12[] = {\n    SPECIES_ESPEON,\n    SPECIES_UMBREON,\n};\n\nstatic const u16 sDexCategory_RarePkmn_Page1[] = {\n    SPECIES_UNOWN,\n};\n\nstatic const u16 sDexCategory_RarePkmn_Page2[] = {\n    SPECIES_ARTICUNO,\n    SPECIES_ZAPDOS,\n    SPECIES_MOLTRES,\n};\n\nstatic const u16 sDexCategory_RarePkmn_Page3[] = {\n    SPECIES_LUGIA,\n};\n\nstatic const u16 sDexCategory_RarePkmn_Page4[] = {\n    SPECIES_HO_OH,\n};\n\nstatic const u16 sDexCategory_RarePkmn_Page5[] = {\n    SPECIES_RAYQUAZA,\n};\n\nstatic const u16 sDexCategory_RarePkmn_Page6[] = {\n    SPECIES_DEOXYS,\n};\n\nstatic const u16 sDexCategory_RarePkmn_Page7[] = {\n    SPECIES_MEWTWO,\n};\n\nstatic const u16 sDexCategory_RarePkmn_Page8[] = {\n    SPECIES_MEW,\n};\n\n#define DEX_CATEGORY(name){sDexCategory_##name, NELEMS(sDexCategory_##name)}\n\nstatic const struct PokedexCategoryPage sDexCategory_GrasslandPkmn[] = {\n    DEX_CATEGORY(GrasslandPkmn_Page1),\n    DEX_CATEGORY(GrasslandPkmn_Page2),\n    DEX_CATEGORY(GrasslandPkmn_Page3),\n    DEX_CATEGORY(GrasslandPkmn_Page4),\n    DEX_CATEGORY(GrasslandPkmn_Page5),\n    DEX_CATEGORY(GrasslandPkmn_Page6),\n    DEX_CATEGORY(GrasslandPkmn_Page7),\n    DEX_CATEGORY(GrasslandPkmn_Page8),\n    DEX_CATEGORY(GrasslandPkmn_Page9),\n    DEX_CATEGORY(GrasslandPkmn_Page10),\n    DEX_CATEGORY(GrasslandPkmn_Page11),\n    DEX_CATEGORY(GrasslandPkmn_Page12),\n    DEX_CATEGORY(GrasslandPkmn_Page13),\n    DEX_CATEGORY(GrasslandPkmn_Page14),\n    DEX_CATEGORY(GrasslandPkmn_Page15),\n    DEX_CATEGORY(GrasslandPkmn_Page16),\n    DEX_CATEGORY(GrasslandPkmn_Page17),\n    DEX_CATEGORY(GrasslandPkmn_Page18),\n    DEX_CATEGORY(GrasslandPkmn_Page19),\n    DEX_CATEGORY(GrasslandPkmn_Page20),\n    DEX_CATEGORY(GrasslandPkmn_Page21),\n    DEX_CATEGORY(GrasslandPkmn_Page22),\n    DEX_CATEGORY(GrasslandPkmn_Page23),\n    DEX_CATEGORY(GrasslandPkmn_Page24),\n    DEX_CATEGORY(GrasslandPkmn_Page25),\n    DEX_CATEGORY(GrasslandPkmn_Page26),\n    DEX_CATEGORY(GrasslandPkmn_Page27),\n};\n\nstatic const struct PokedexCategoryPage sDexCategory_ForestPkmn[] = {\n    DEX_CATEGORY(ForestPkmn_Page1),\n    DEX_CATEGORY(ForestPkmn_Page2),\n    DEX_CATEGORY(ForestPkmn_Page3),\n    DEX_CATEGORY(ForestPkmn_Page4),\n    DEX_CATEGORY(ForestPkmn_Page5),\n    DEX_CATEGORY(ForestPkmn_Page6),\n    DEX_CATEGORY(ForestPkmn_Page7),\n    DEX_CATEGORY(ForestPkmn_Page8),\n    DEX_CATEGORY(ForestPkmn_Page9),\n    DEX_CATEGORY(ForestPkmn_Page10),\n    DEX_CATEGORY(ForestPkmn_Page11),\n    DEX_CATEGORY(ForestPkmn_Page12),\n    DEX_CATEGORY(ForestPkmn_Page13),\n    DEX_CATEGORY(ForestPkmn_Page14),\n    DEX_CATEGORY(ForestPkmn_Page15),\n    DEX_CATEGORY(ForestPkmn_Page16),\n    DEX_CATEGORY(ForestPkmn_Page17),\n    DEX_CATEGORY(ForestPkmn_Page18),\n    DEX_CATEGORY(ForestPkmn_Page19),\n    DEX_CATEGORY(ForestPkmn_Page20),\n    DEX_CATEGORY(ForestPkmn_Page21),\n    DEX_CATEGORY(ForestPkmn_Page22),\n    DEX_CATEGORY(ForestPkmn_Page23),\n    DEX_CATEGORY(ForestPkmn_Page24),\n    DEX_CATEGORY(ForestPkmn_Page25),\n    DEX_CATEGORY(ForestPkmn_Page26),\n};\n\nstatic const struct PokedexCategoryPage sDexCategory_WatersEdgePkmn[] = {\n    DEX_CATEGORY(WatersEdgePkmn_Page1),\n    DEX_CATEGORY(WatersEdgePkmn_Page2),\n    DEX_CATEGORY(WatersEdgePkmn_Page3),\n    DEX_CATEGORY(WatersEdgePkmn_Page4),\n    DEX_CATEGORY(WatersEdgePkmn_Page5),\n    DEX_CATEGORY(WatersEdgePkmn_Page6),\n    DEX_CATEGORY(WatersEdgePkmn_Page7),\n    DEX_CATEGORY(WatersEdgePkmn_Page8),\n    DEX_CATEGORY(WatersEdgePkmn_Page9),\n    DEX_CATEGORY(WatersEdgePkmn_Page10),\n    DEX_CATEGORY(WatersEdgePkmn_Page11),\n    DEX_CATEGORY(WatersEdgePkmn_Page12),\n    DEX_CATEGORY(WatersEdgePkmn_Page13),\n    DEX_CATEGORY(WatersEdgePkmn_Page14),\n    DEX_CATEGORY(WatersEdgePkmn_Page15),\n    DEX_CATEGORY(WatersEdgePkmn_Page16),\n};\n\nstatic const struct PokedexCategoryPage sDexCategory_SeaPkmn[] = {\n    DEX_CATEGORY(SeaPkmn_Page1),\n    DEX_CATEGORY(SeaPkmn_Page2),\n    DEX_CATEGORY(SeaPkmn_Page3),\n    DEX_CATEGORY(SeaPkmn_Page4),\n    DEX_CATEGORY(SeaPkmn_Page5),\n    DEX_CATEGORY(SeaPkmn_Page6),\n    DEX_CATEGORY(SeaPkmn_Page7),\n    DEX_CATEGORY(SeaPkmn_Page8),\n    DEX_CATEGORY(SeaPkmn_Page9),\n    DEX_CATEGORY(SeaPkmn_Page10),\n    DEX_CATEGORY(SeaPkmn_Page11),\n    DEX_CATEGORY(SeaPkmn_Page12),\n    DEX_CATEGORY(SeaPkmn_Page13),\n    DEX_CATEGORY(SeaPkmn_Page14),\n    DEX_CATEGORY(SeaPkmn_Page15),\n    DEX_CATEGORY(SeaPkmn_Page16),\n};\n\nstatic const struct PokedexCategoryPage sDexCategory_CavePkmn[] = {\n    DEX_CATEGORY(CavePkmn_Page1),\n    DEX_CATEGORY(CavePkmn_Page2),\n    DEX_CATEGORY(CavePkmn_Page3),\n    DEX_CATEGORY(CavePkmn_Page4),\n    DEX_CATEGORY(CavePkmn_Page5),\n    DEX_CATEGORY(CavePkmn_Page6),\n    DEX_CATEGORY(CavePkmn_Page7),\n    DEX_CATEGORY(CavePkmn_Page8),\n    DEX_CATEGORY(CavePkmn_Page9),\n    DEX_CATEGORY(CavePkmn_Page10),\n};\n\nstatic const struct PokedexCategoryPage sDexCategory_MountainPkmn[] = {\n    DEX_CATEGORY(MountainPkmn_Page1),\n    DEX_CATEGORY(MountainPkmn_Page2),\n    DEX_CATEGORY(MountainPkmn_Page3),\n    DEX_CATEGORY(MountainPkmn_Page4),\n    DEX_CATEGORY(MountainPkmn_Page5),\n    DEX_CATEGORY(MountainPkmn_Page6),\n    DEX_CATEGORY(MountainPkmn_Page7),\n    DEX_CATEGORY(MountainPkmn_Page8),\n    DEX_CATEGORY(MountainPkmn_Page9),\n    DEX_CATEGORY(MountainPkmn_Page10),\n    DEX_CATEGORY(MountainPkmn_Page11),\n    DEX_CATEGORY(MountainPkmn_Page12),\n    DEX_CATEGORY(MountainPkmn_Page13),\n    DEX_CATEGORY(MountainPkmn_Page14),\n    DEX_CATEGORY(MountainPkmn_Page15),\n    DEX_CATEGORY(MountainPkmn_Page16),\n    DEX_CATEGORY(MountainPkmn_Page17),\n};\n\nstatic const struct PokedexCategoryPage sDexCategory_RoughTerrainPkmn[] = {\n    DEX_CATEGORY(RoughTerrainPkmn_Page1),\n    DEX_CATEGORY(RoughTerrainPkmn_Page2),\n    DEX_CATEGORY(RoughTerrainPkmn_Page3),\n    DEX_CATEGORY(RoughTerrainPkmn_Page4),\n    DEX_CATEGORY(RoughTerrainPkmn_Page5),\n    DEX_CATEGORY(RoughTerrainPkmn_Page6),\n    DEX_CATEGORY(RoughTerrainPkmn_Page7),\n    DEX_CATEGORY(RoughTerrainPkmn_Page8),\n    DEX_CATEGORY(RoughTerrainPkmn_Page9),\n    DEX_CATEGORY(RoughTerrainPkmn_Page10),\n    DEX_CATEGORY(RoughTerrainPkmn_Page11),\n};\n\nstatic const struct PokedexCategoryPage sDexCategory_UrbanPkmn[] = {\n    DEX_CATEGORY(UrbanPkmn_Page1),\n    DEX_CATEGORY(UrbanPkmn_Page2),\n    DEX_CATEGORY(UrbanPkmn_Page3),\n    DEX_CATEGORY(UrbanPkmn_Page4),\n    DEX_CATEGORY(UrbanPkmn_Page5),\n    DEX_CATEGORY(UrbanPkmn_Page6),\n    DEX_CATEGORY(UrbanPkmn_Page7),\n    DEX_CATEGORY(UrbanPkmn_Page8),\n    DEX_CATEGORY(UrbanPkmn_Page9),\n    DEX_CATEGORY(UrbanPkmn_Page10),\n    DEX_CATEGORY(UrbanPkmn_Page11),\n    DEX_CATEGORY(UrbanPkmn_Page12),\n};\n\nstatic const struct PokedexCategoryPage sDexCategory_RarePkmn[] = {\n    DEX_CATEGORY(RarePkmn_Page1),\n    DEX_CATEGORY(RarePkmn_Page2),\n    DEX_CATEGORY(RarePkmn_Page3),\n    DEX_CATEGORY(RarePkmn_Page4),\n    DEX_CATEGORY(RarePkmn_Page5),\n    DEX_CATEGORY(RarePkmn_Page6),\n    DEX_CATEGORY(RarePkmn_Page7),\n    DEX_CATEGORY(RarePkmn_Page8),\n};\n\nstruct {\n    const struct PokedexCategoryPage * page;\n    u8 count;\n} const gDexCategories[] = {\n    DEX_CATEGORY(GrasslandPkmn),\n    DEX_CATEGORY(ForestPkmn),\n    DEX_CATEGORY(WatersEdgePkmn),\n    DEX_CATEGORY(SeaPkmn),\n    DEX_CATEGORY(CavePkmn),\n    DEX_CATEGORY(MountainPkmn),\n    DEX_CATEGORY(RoughTerrainPkmn),\n    DEX_CATEGORY(UrbanPkmn),\n    DEX_CATEGORY(RarePkmn),\n};\n"
  },
  {
    "path": "src/data/pokemon/pokedex_entries.h",
    "content": "const struct PokedexEntry gPokedexEntries[] =\n{\n    [NATIONAL_DEX_NONE] =\n    {\n        .categoryName = _(\"UNKNOWN\"),\n        .height = 0,\n        .weight = 0,\n        .description_FR = gDummyPokedexText_FR,\n        .description_LG = gDummyPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 0,\n        .trainerScale = 256,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_BULBASAUR] =\n    {\n        .categoryName = _(\"SEED\"),\n        .height = 7,\n        .weight = 69,\n        .description_FR = gBulbasaurPokedexText_FR,\n        .description_LG = gBulbasaurPokedexText_LG,\n        .pokemonScale = 356,\n        .pokemonOffset = 16,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_IVYSAUR] =\n    {\n        .categoryName = _(\"SEED\"),\n        .height = 10,\n        .weight = 130,\n        .description_FR = gIvysaurPokedexText_FR,\n        .description_LG = gIvysaurPokedexText_LG,\n        .pokemonScale = 332,\n        .pokemonOffset = 11,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_VENUSAUR] =\n    {\n        .categoryName = _(\"SEED\"),\n        .height = 20,\n        .weight = 1000,\n        .description_FR = gVenusaurPokedexText_FR,\n        .description_LG = gVenusaurPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 1,\n        .trainerScale = 375,\n        .trainerOffset = 6,\n    },\n\n    [NATIONAL_DEX_CHARMANDER] =\n    {\n        .categoryName = _(\"LIZARD\"),\n        .height = 6,\n        .weight = 85,\n        .description_FR = gCharmanderPokedexText_FR,\n        .description_LG = gCharmanderPokedexText_LG,\n        .pokemonScale = 410,\n        .pokemonOffset = 16,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CHARMELEON] =\n    {\n        .categoryName = _(\"FLAME\"),\n        .height = 11,\n        .weight = 190,\n        .description_FR = gCharmeleonPokedexText_FR,\n        .description_LG = gCharmeleonPokedexText_LG,\n        .pokemonScale = 294,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CHARIZARD] =\n    {\n        .categoryName = _(\"FLAME\"),\n        .height = 17,\n        .weight = 905,\n        .description_FR = gCharizardPokedexText_FR,\n        .description_LG = gCharizardPokedexText_LG,\n        .pokemonScale = 271,\n        .pokemonOffset = 0,\n        .trainerScale = 317,\n        .trainerOffset = 3,\n    },\n\n    [NATIONAL_DEX_SQUIRTLE] =\n    {\n        .categoryName = _(\"TINY TURTLE\"),\n        .height = 5,\n        .weight = 90,\n        .description_FR = gSquirtlePokedexText_FR,\n        .description_LG = gSquirtlePokedexText_LG,\n        .pokemonScale = 412,\n        .pokemonOffset = 16,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WARTORTLE] =\n    {\n        .categoryName = _(\"TURTLE\"),\n        .height = 10,\n        .weight = 225,\n        .description_FR = gWartortlePokedexText_FR,\n        .description_LG = gWartortlePokedexText_LG,\n        .pokemonScale = 334,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_BLASTOISE] =\n    {\n        .categoryName = _(\"SHELLFISH\"),\n        .height = 16,\n        .weight = 855,\n        .description_FR = gBlastoisePokedexText_FR,\n        .description_LG = gBlastoisePokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 1,\n        .trainerScale = 329,\n        .trainerOffset = 3,\n    },\n\n    [NATIONAL_DEX_CATERPIE] =\n    {\n        .categoryName = _(\"WORM\"),\n        .height = 3,\n        .weight = 29,\n        .description_FR = gCaterpiePokedexText_FR,\n        .description_LG = gCaterpiePokedexText_LG,\n        .pokemonScale = 549,\n        .pokemonOffset = 20,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_METAPOD] =\n    {\n        .categoryName = _(\"COCOON\"),\n        .height = 7,\n        .weight = 99,\n        .description_FR = gMetapodPokedexText_FR,\n        .description_LG = gMetapodPokedexText_LG,\n        .pokemonScale = 350,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_BUTTERFREE] =\n    {\n        .categoryName = _(\"BUTTERFLY\"),\n        .height = 11,\n        .weight = 320,\n        .description_FR = gButterfreePokedexText_FR,\n        .description_LG = gButterfreePokedexText_LG,\n        .pokemonScale = 312,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WEEDLE] =\n    {\n        .categoryName = _(\"HAIRY BUG\"),\n        .height = 3,\n        .weight = 32,\n        .description_FR = gWeedlePokedexText_FR,\n        .description_LG = gWeedlePokedexText_LG,\n        .pokemonScale = 455,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_KAKUNA] =\n    {\n        .categoryName = _(\"COCOON\"),\n        .height = 6,\n        .weight = 100,\n        .description_FR = gKakunaPokedexText_FR,\n        .description_LG = gKakunaPokedexText_LG,\n        .pokemonScale = 424,\n        .pokemonOffset = 14,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_BEEDRILL] =\n    {\n        .categoryName = _(\"POISON BEE\"),\n        .height = 10,\n        .weight = 295,\n        .description_FR = gBeedrillPokedexText_FR,\n        .description_LG = gBeedrillPokedexText_LG,\n        .pokemonScale = 366,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PIDGEY] =\n    {\n        .categoryName = _(\"TINY BIRD\"),\n        .height = 3,\n        .weight = 18,\n        .description_FR = gPidgeyPokedexText_FR,\n        .description_LG = gPidgeyPokedexText_LG,\n        .pokemonScale = 492,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PIDGEOTTO] =\n    {\n        .categoryName = _(\"BIRD\"),\n        .height = 11,\n        .weight = 300,\n        .description_FR = gPidgeottoPokedexText_FR,\n        .description_LG = gPidgeottoPokedexText_LG,\n        .pokemonScale = 334,\n        .pokemonOffset = 11,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PIDGEOT] =\n    {\n        .categoryName = _(\"BIRD\"),\n        .height = 15,\n        .weight = 395,\n        .description_FR = gPidgeotPokedexText_FR,\n        .description_LG = gPidgeotPokedexText_LG,\n        .pokemonScale = 269,\n        .pokemonOffset = -2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_RATTATA] =\n    {\n        .categoryName = _(\"MOUSE\"),\n        .height = 3,\n        .weight = 35,\n        .description_FR = gRattataPokedexText_FR,\n        .description_LG = gRattataPokedexText_LG,\n        .pokemonScale = 481,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_RATICATE] =\n    {\n        .categoryName = _(\"MOUSE\"),\n        .height = 7,\n        .weight = 185,\n        .description_FR = gRaticatePokedexText_FR,\n        .description_LG = gRaticatePokedexText_LG,\n        .pokemonScale = 401,\n        .pokemonOffset = 14,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SPEAROW] =\n    {\n        .categoryName = _(\"TINY BIRD\"),\n        .height = 3,\n        .weight = 20,\n        .description_FR = gSpearowPokedexText_FR,\n        .description_LG = gSpearowPokedexText_LG,\n        .pokemonScale = 571,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_FEAROW] =\n    {\n        .categoryName = _(\"BEAK\"),\n        .height = 12,\n        .weight = 380,\n        .description_FR = gFearowPokedexText_FR,\n        .description_LG = gFearowPokedexText_LG,\n        .pokemonScale = 282,\n        .pokemonOffset = -1,\n        .trainerScale = 272,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_EKANS] =\n    {\n        .categoryName = _(\"SNAKE\"),\n        .height = 20,\n        .weight = 69,\n        .description_FR = gEkansPokedexText_FR,\n        .description_LG = gEkansPokedexText_LG,\n        .pokemonScale = 298,\n        .pokemonOffset = 13,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ARBOK] =\n    {\n        .categoryName = _(\"COBRA\"),\n        .height = 35,\n        .weight = 650,\n        .description_FR = gArbokPokedexText_FR,\n        .description_LG = gArbokPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 0,\n        .trainerScale = 296,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_PIKACHU] =\n    {\n        .categoryName = _(\"MOUSE\"),\n        .height = 4,\n        .weight = 60,\n        .description_FR = gPikachuPokedexText_FR,\n        .description_LG = gPikachuPokedexText_LG,\n        .pokemonScale = 479,\n        .pokemonOffset = 16,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_RAICHU] =\n    {\n        .categoryName = _(\"MOUSE\"),\n        .height = 8,\n        .weight = 300,\n        .description_FR = gRaichuPokedexText_FR,\n        .description_LG = gRaichuPokedexText_LG,\n        .pokemonScale = 426,\n        .pokemonOffset = 10,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SANDSHREW] =\n    {\n        .categoryName = _(\"MOUSE\"),\n        .height = 6,\n        .weight = 120,\n        .description_FR = gSandshrewPokedexText_FR,\n        .description_LG = gSandshrewPokedexText_LG,\n        .pokemonScale = 370,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SANDSLASH] =\n    {\n        .categoryName = _(\"MOUSE\"),\n        .height = 10,\n        .weight = 295,\n        .description_FR = gSandslashPokedexText_FR,\n        .description_LG = gSandslashPokedexText_LG,\n        .pokemonScale = 341,\n        .pokemonOffset = 10,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_NIDORAN_F] =\n    {\n        .categoryName = _(\"POISON PIN\"),\n        .height = 4,\n        .weight = 70,\n        .description_FR = gNidoranFPokedexText_FR,\n        .description_LG = gNidoranFPokedexText_LG,\n        .pokemonScale = 488,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_NIDORINA] =\n    {\n        .categoryName = _(\"POISON PIN\"),\n        .height = 8,\n        .weight = 200,\n        .description_FR = gNidorinaPokedexText_FR,\n        .description_LG = gNidorinaPokedexText_LG,\n        .pokemonScale = 381,\n        .pokemonOffset = 13,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_NIDOQUEEN] =\n    {\n        .categoryName = _(\"DRILL\"),\n        .height = 13,\n        .weight = 600,\n        .description_FR = gNidoqueenPokedexText_FR,\n        .description_LG = gNidoqueenPokedexText_LG,\n        .pokemonScale = 283,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_NIDORAN_M] =\n    {\n        .categoryName = _(\"POISON PIN\"),\n        .height = 5,\n        .weight = 90,\n        .description_FR = gNidoranMPokedexText_FR,\n        .description_LG = gNidoranMPokedexText_LG,\n        .pokemonScale = 480,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_NIDORINO] =\n    {\n        .categoryName = _(\"POISON PIN\"),\n        .height = 9,\n        .weight = 195,\n        .description_FR = gNidorinoPokedexText_FR,\n        .description_LG = gNidorinoPokedexText_LG,\n        .pokemonScale = 408,\n        .pokemonOffset = 13,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_NIDOKING] =\n    {\n        .categoryName = _(\"DRILL\"),\n        .height = 14,\n        .weight = 620,\n        .description_FR = gNidokingPokedexText_FR,\n        .description_LG = gNidokingPokedexText_LG,\n        .pokemonScale = 304,\n        .pokemonOffset = 3,\n        .trainerScale = 323,\n        .trainerOffset = 2,\n    },\n\n    [NATIONAL_DEX_CLEFAIRY] =\n    {\n        .categoryName = _(\"FAIRY\"),\n        .height = 6,\n        .weight = 75,\n        .description_FR = gClefairyPokedexText_FR,\n        .description_LG = gClefairyPokedexText_LG,\n        .pokemonScale = 425,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CLEFABLE] =\n    {\n        .categoryName = _(\"FAIRY\"),\n        .height = 13,\n        .weight = 400,\n        .description_FR = gClefablePokedexText_FR,\n        .description_LG = gClefablePokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 3,\n        .trainerScale = 272,\n        .trainerOffset = -1,\n    },\n\n    [NATIONAL_DEX_VULPIX] =\n    {\n        .categoryName = _(\"FOX\"),\n        .height = 6,\n        .weight = 99,\n        .description_FR = gVulpixPokedexText_FR,\n        .description_LG = gVulpixPokedexText_LG,\n        .pokemonScale = 497,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_NINETALES] =\n    {\n        .categoryName = _(\"FOX\"),\n        .height = 11,\n        .weight = 199,\n        .description_FR = gNinetalesPokedexText_FR,\n        .description_LG = gNinetalesPokedexText_LG,\n        .pokemonScale = 339,\n        .pokemonOffset = 6,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_JIGGLYPUFF] =\n    {\n        .categoryName = _(\"BALLOON\"),\n        .height = 5,\n        .weight = 55,\n        .description_FR = gJigglypuffPokedexText_FR,\n        .description_LG = gJigglypuffPokedexText_LG,\n        .pokemonScale = 419,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WIGGLYTUFF] =\n    {\n        .categoryName = _(\"BALLOON\"),\n        .height = 10,\n        .weight = 120,\n        .description_FR = gWigglytuffPokedexText_FR,\n        .description_LG = gWigglytuffPokedexText_LG,\n        .pokemonScale = 328,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ZUBAT] =\n    {\n        .categoryName = _(\"BAT\"),\n        .height = 8,\n        .weight = 75,\n        .description_FR = gZubatPokedexText_FR,\n        .description_LG = gZubatPokedexText_LG,\n        .pokemonScale = 355,\n        .pokemonOffset = -4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GOLBAT] =\n    {\n        .categoryName = _(\"BAT\"),\n        .height = 16,\n        .weight = 550,\n        .description_FR = gGolbatPokedexText_FR,\n        .description_LG = gGolbatPokedexText_LG,\n        .pokemonScale = 291,\n        .pokemonOffset = 0,\n        .trainerScale = 296,\n        .trainerOffset = 2,\n    },\n\n    [NATIONAL_DEX_ODDISH] =\n    {\n        .categoryName = _(\"WEED\"),\n        .height = 5,\n        .weight = 54,\n        .description_FR = gOddishPokedexText_FR,\n        .description_LG = gOddishPokedexText_LG,\n        .pokemonScale = 423,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GLOOM] =\n    {\n        .categoryName = _(\"WEED\"),\n        .height = 8,\n        .weight = 86,\n        .description_FR = gGloomPokedexText_FR,\n        .description_LG = gGloomPokedexText_LG,\n        .pokemonScale = 329,\n        .pokemonOffset = 10,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_VILEPLUME] =\n    {\n        .categoryName = _(\"FLOWER\"),\n        .height = 12,\n        .weight = 186,\n        .description_FR = gVileplumePokedexText_FR,\n        .description_LG = gVileplumePokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 4,\n        .trainerScale = 272,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PARAS] =\n    {\n        .categoryName = _(\"MUSHROOM\"),\n        .height = 3,\n        .weight = 54,\n        .description_FR = gParasPokedexText_FR,\n        .description_LG = gParasPokedexText_LG,\n        .pokemonScale = 546,\n        .pokemonOffset = 21,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PARASECT] =\n    {\n        .categoryName = _(\"MUSHROOM\"),\n        .height = 10,\n        .weight = 295,\n        .description_FR = gParasectPokedexText_FR,\n        .description_LG = gParasectPokedexText_LG,\n        .pokemonScale = 307,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_VENONAT] =\n    {\n        .categoryName = _(\"INSECT\"),\n        .height = 10,\n        .weight = 300,\n        .description_FR = gVenonatPokedexText_FR,\n        .description_LG = gVenonatPokedexText_LG,\n        .pokemonScale = 360,\n        .pokemonOffset = 14,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_VENOMOTH] =\n    {\n        .categoryName = _(\"POISON MOTH\"),\n        .height = 15,\n        .weight = 125,\n        .description_FR = gVenomothPokedexText_FR,\n        .description_LG = gVenomothPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 3,\n        .trainerScale = 293,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_DIGLETT] =\n    {\n        .categoryName = _(\"MOLE\"),\n        .height = 2,\n        .weight = 8,\n        .description_FR = gDiglettPokedexText_FR,\n        .description_LG = gDiglettPokedexText_LG,\n        .pokemonScale = 706,\n        .pokemonOffset = 22,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_DUGTRIO] =\n    {\n        .categoryName = _(\"MOLE\"),\n        .height = 7,\n        .weight = 333,\n        .description_FR = gDugtrioPokedexText_FR,\n        .description_LG = gDugtrioPokedexText_LG,\n        .pokemonScale = 384,\n        .pokemonOffset = 14,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MEOWTH] =\n    {\n        .categoryName = _(\"SCRATCH CAT\"),\n        .height = 4,\n        .weight = 42,\n        .description_FR = gMeowthPokedexText_FR,\n        .description_LG = gMeowthPokedexText_LG,\n        .pokemonScale = 480,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PERSIAN] =\n    {\n        .categoryName = _(\"CLASSY CAT\"),\n        .height = 10,\n        .weight = 320,\n        .description_FR = gPersianPokedexText_FR,\n        .description_LG = gPersianPokedexText_LG,\n        .pokemonScale = 320,\n        .pokemonOffset = 10,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PSYDUCK] =\n    {\n        .categoryName = _(\"DUCK\"),\n        .height = 8,\n        .weight = 196,\n        .description_FR = gPsyduckPokedexText_FR,\n        .description_LG = gPsyduckPokedexText_LG,\n        .pokemonScale = 347,\n        .pokemonOffset = 11,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GOLDUCK] =\n    {\n        .categoryName = _(\"DUCK\"),\n        .height = 17,\n        .weight = 766,\n        .description_FR = gGolduckPokedexText_FR,\n        .description_LG = gGolduckPokedexText_LG,\n        .pokemonScale = 272,\n        .pokemonOffset = 4,\n        .trainerScale = 287,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_MANKEY] =\n    {\n        .categoryName = _(\"PIG MONKEY\"),\n        .height = 5,\n        .weight = 280,\n        .description_FR = gMankeyPokedexText_FR,\n        .description_LG = gMankeyPokedexText_LG,\n        .pokemonScale = 388,\n        .pokemonOffset = 16,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PRIMEAPE] =\n    {\n        .categoryName = _(\"PIG MONKEY\"),\n        .height = 10,\n        .weight = 320,\n        .description_FR = gPrimeapePokedexText_FR,\n        .description_LG = gPrimeapePokedexText_LG,\n        .pokemonScale = 326,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GROWLITHE] =\n    {\n        .categoryName = _(\"PUPPY\"),\n        .height = 7,\n        .weight = 190,\n        .description_FR = gGrowlithePokedexText_FR,\n        .description_LG = gGrowlithePokedexText_LG,\n        .pokemonScale = 346,\n        .pokemonOffset = 14,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ARCANINE] =\n    {\n        .categoryName = _(\"LEGENDARY\"),\n        .height = 19,\n        .weight = 1550,\n        .description_FR = gArcaninePokedexText_FR,\n        .description_LG = gArcaninePokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = -1,\n        .trainerScale = 312,\n        .trainerOffset = 2,\n    },\n\n    [NATIONAL_DEX_POLIWAG] =\n    {\n        .categoryName = _(\"TADPOLE\"),\n        .height = 6,\n        .weight = 124,\n        .description_FR = gPoliwagPokedexText_FR,\n        .description_LG = gPoliwagPokedexText_LG,\n        .pokemonScale = 353,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_POLIWHIRL] =\n    {\n        .categoryName = _(\"TADPOLE\"),\n        .height = 10,\n        .weight = 200,\n        .description_FR = gPoliwhirlPokedexText_FR,\n        .description_LG = gPoliwhirlPokedexText_LG,\n        .pokemonScale = 288,\n        .pokemonOffset = 10,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_POLIWRATH] =\n    {\n        .categoryName = _(\"TADPOLE\"),\n        .height = 13,\n        .weight = 540,\n        .description_FR = gPoliwrathPokedexText_FR,\n        .description_LG = gPoliwrathPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 5,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ABRA] =\n    {\n        .categoryName = _(\"PSI\"),\n        .height = 9,\n        .weight = 195,\n        .description_FR = gAbraPokedexText_FR,\n        .description_LG = gAbraPokedexText_LG,\n        .pokemonScale = 374,\n        .pokemonOffset = 14,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_KADABRA] =\n    {\n        .categoryName = _(\"PSI\"),\n        .height = 13,\n        .weight = 565,\n        .description_FR = gKadabraPokedexText_FR,\n        .description_LG = gKadabraPokedexText_LG,\n        .pokemonScale = 272,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ALAKAZAM] =\n    {\n        .categoryName = _(\"PSI\"),\n        .height = 15,\n        .weight = 480,\n        .description_FR = gAlakazamPokedexText_FR,\n        .description_LG = gAlakazamPokedexText_LG,\n        .pokemonScale = 272,\n        .pokemonOffset = -1,\n        .trainerScale = 271,\n        .trainerOffset = -1,\n    },\n\n    [NATIONAL_DEX_MACHOP] =\n    {\n        .categoryName = _(\"SUPERPOWER\"),\n        .height = 8,\n        .weight = 195,\n        .description_FR = gMachopPokedexText_FR,\n        .description_LG = gMachopPokedexText_LG,\n        .pokemonScale = 320,\n        .pokemonOffset = 12,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MACHOKE] =\n    {\n        .categoryName = _(\"SUPERPOWER\"),\n        .height = 15,\n        .weight = 705,\n        .description_FR = gMachokePokedexText_FR,\n        .description_LG = gMachokePokedexText_LG,\n        .pokemonScale = 304,\n        .pokemonOffset = 6,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MACHAMP] =\n    {\n        .categoryName = _(\"SUPERPOWER\"),\n        .height = 16,\n        .weight = 1300,\n        .description_FR = gMachampPokedexText_FR,\n        .description_LG = gMachampPokedexText_LG,\n        .pokemonScale = 278,\n        .pokemonOffset = 2,\n        .trainerScale = 283,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_BELLSPROUT] =\n    {\n        .categoryName = _(\"FLOWER\"),\n        .height = 7,\n        .weight = 40,\n        .description_FR = gBellsproutPokedexText_FR,\n        .description_LG = gBellsproutPokedexText_LG,\n        .pokemonScale = 354,\n        .pokemonOffset = 16,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WEEPINBELL] =\n    {\n        .categoryName = _(\"FLYCATCHER\"),\n        .height = 10,\n        .weight = 64,\n        .description_FR = gWeepinbellPokedexText_FR,\n        .description_LG = gWeepinbellPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = -1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_VICTREEBEL] =\n    {\n        .categoryName = _(\"FLYCATCHER\"),\n        .height = 17,\n        .weight = 155,\n        .description_FR = gVictreebelPokedexText_FR,\n        .description_LG = gVictreebelPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 2,\n        .trainerScale = 302,\n        .trainerOffset = 2,\n    },\n\n    [NATIONAL_DEX_TENTACOOL] =\n    {\n        .categoryName = _(\"JELLYFISH\"),\n        .height = 9,\n        .weight = 455,\n        .description_FR = gTentacoolPokedexText_FR,\n        .description_LG = gTentacoolPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 0,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_TENTACRUEL] =\n    {\n        .categoryName = _(\"JELLYFISH\"),\n        .height = 16,\n        .weight = 550,\n        .description_FR = gTentacruelPokedexText_FR,\n        .description_LG = gTentacruelPokedexText_LG,\n        .pokemonScale = 272,\n        .pokemonOffset = -1,\n        .trainerScale = 312,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_GEODUDE] =\n    {\n        .categoryName = _(\"ROCK\"),\n        .height = 4,\n        .weight = 200,\n        .description_FR = gGeodudePokedexText_FR,\n        .description_LG = gGeodudePokedexText_LG,\n        .pokemonScale = 330,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GRAVELER] =\n    {\n        .categoryName = _(\"ROCK\"),\n        .height = 10,\n        .weight = 1050,\n        .description_FR = gGravelerPokedexText_FR,\n        .description_LG = gGravelerPokedexText_LG,\n        .pokemonScale = 272,\n        .pokemonOffset = 8,\n        .trainerScale = 305,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_GOLEM] =\n    {\n        .categoryName = _(\"MEGATON\"),\n        .height = 14,\n        .weight = 3000,\n        .description_FR = gGolemPokedexText_FR,\n        .description_LG = gGolemPokedexText_LG,\n        .pokemonScale = 266,\n        .pokemonOffset = 3,\n        .trainerScale = 298,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_PONYTA] =\n    {\n        .categoryName = _(\"FIRE HORSE\"),\n        .height = 10,\n        .weight = 300,\n        .description_FR = gPonytaPokedexText_FR,\n        .description_LG = gPonytaPokedexText_LG,\n        .pokemonScale = 288,\n        .pokemonOffset = 7,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_RAPIDASH] =\n    {\n        .categoryName = _(\"FIRE HORSE\"),\n        .height = 17,\n        .weight = 950,\n        .description_FR = gRapidashPokedexText_FR,\n        .description_LG = gRapidashPokedexText_LG,\n        .pokemonScale = 282,\n        .pokemonOffset = -1,\n        .trainerScale = 312,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_SLOWPOKE] =\n    {\n        .categoryName = _(\"DOPEY\"),\n        .height = 12,\n        .weight = 360,\n        .description_FR = gSlowpokePokedexText_FR,\n        .description_LG = gSlowpokePokedexText_LG,\n        .pokemonScale = 271,\n        .pokemonOffset = 10,\n        .trainerScale = 272,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SLOWBRO] =\n    {\n        .categoryName = _(\"HERMIT CRAB\"),\n        .height = 16,\n        .weight = 785,\n        .description_FR = gSlowbroPokedexText_FR,\n        .description_LG = gSlowbroPokedexText_LG,\n        .pokemonScale = 257,\n        .pokemonOffset = -2,\n        .trainerScale = 312,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_MAGNEMITE] =\n    {\n        .categoryName = _(\"MAGNET\"),\n        .height = 3,\n        .weight = 60,\n        .description_FR = gMagnemitePokedexText_FR,\n        .description_LG = gMagnemitePokedexText_LG,\n        .pokemonScale = 294,\n        .pokemonOffset = -8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MAGNETON] =\n    {\n        .categoryName = _(\"MAGNET\"),\n        .height = 10,\n        .weight = 600,\n        .description_FR = gMagnetonPokedexText_FR,\n        .description_LG = gMagnetonPokedexText_LG,\n        .pokemonScale = 293,\n        .pokemonOffset = -4,\n        .trainerScale = 273,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_FARFETCHD] =\n    {\n        .categoryName = _(\"WILD DUCK\"),\n        .height = 8,\n        .weight = 150,\n        .description_FR = gFarfetchdPokedexText_FR,\n        .description_LG = gFarfetchdPokedexText_LG,\n        .pokemonScale = 317,\n        .pokemonOffset = -2,\n        .trainerScale = 256,\n        .trainerOffset = -3,\n    },\n\n    [NATIONAL_DEX_DODUO] =\n    {\n        .categoryName = _(\"TWIN BIRD\"),\n        .height = 14,\n        .weight = 392,\n        .description_FR = gDoduoPokedexText_FR,\n        .description_LG = gDoduoPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 3,\n        .trainerScale = 287,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_DODRIO] =\n    {\n        .categoryName = _(\"TRIPLE BIRD\"),\n        .height = 18,\n        .weight = 852,\n        .description_FR = gDodrioPokedexText_FR,\n        .description_LG = gDodrioPokedexText_LG,\n        .pokemonScale = 272,\n        .pokemonOffset = -2,\n        .trainerScale = 296,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_SEEL] =\n    {\n        .categoryName = _(\"SEA LION\"),\n        .height = 11,\n        .weight = 900,\n        .description_FR = gSeelPokedexText_FR,\n        .description_LG = gSeelPokedexText_LG,\n        .pokemonScale = 298,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_DEWGONG] =\n    {\n        .categoryName = _(\"SEA LION\"),\n        .height = 17,\n        .weight = 1200,\n        .description_FR = gDewgongPokedexText_FR,\n        .description_LG = gDewgongPokedexText_LG,\n        .pokemonScale = 288,\n        .pokemonOffset = 1,\n        .trainerScale = 306,\n        .trainerOffset = -1,\n    },\n\n    [NATIONAL_DEX_GRIMER] =\n    {\n        .categoryName = _(\"SLUDGE\"),\n        .height = 9,\n        .weight = 300,\n        .description_FR = gGrimerPokedexText_FR,\n        .description_LG = gGrimerPokedexText_LG,\n        .pokemonScale = 258,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MUK] =\n    {\n        .categoryName = _(\"SLUDGE\"),\n        .height = 12,\n        .weight = 300,\n        .description_FR = gMukPokedexText_FR,\n        .description_LG = gMukPokedexText_LG,\n        .pokemonScale = 288,\n        .pokemonOffset = 7,\n        .trainerScale = 288,\n        .trainerOffset = -1,\n    },\n\n    [NATIONAL_DEX_SHELLDER] =\n    {\n        .categoryName = _(\"BIVALVE\"),\n        .height = 3,\n        .weight = 40,\n        .description_FR = gShellderPokedexText_FR,\n        .description_LG = gShellderPokedexText_LG,\n        .pokemonScale = 643,\n        .pokemonOffset = 21,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CLOYSTER] =\n    {\n        .categoryName = _(\"BIVALVE\"),\n        .height = 15,\n        .weight = 1325,\n        .description_FR = gCloysterPokedexText_FR,\n        .description_LG = gCloysterPokedexText_LG,\n        .pokemonScale = 264,\n        .pokemonOffset = 0,\n        .trainerScale = 288,\n        .trainerOffset = -1,\n    },\n\n    [NATIONAL_DEX_GASTLY] =\n    {\n        .categoryName = _(\"GAS\"),\n        .height = 13,\n        .weight = 1,\n        .description_FR = gGastlyPokedexText_FR,\n        .description_LG = gGastlyPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 0,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_HAUNTER] =\n    {\n        .categoryName = _(\"GAS\"),\n        .height = 16,\n        .weight = 1,\n        .description_FR = gHaunterPokedexText_FR,\n        .description_LG = gHaunterPokedexText_LG,\n        .pokemonScale = 269,\n        .pokemonOffset = 2,\n        .trainerScale = 308,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_GENGAR] =\n    {\n        .categoryName = _(\"SHADOW\"),\n        .height = 15,\n        .weight = 405,\n        .description_FR = gGengarPokedexText_FR,\n        .description_LG = gGengarPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 4,\n        .trainerScale = 317,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_ONIX] =\n    {\n        .categoryName = _(\"ROCK SNAKE\"),\n        .height = 88,\n        .weight = 2100,\n        .description_FR = gOnixPokedexText_FR,\n        .description_LG = gOnixPokedexText_LG,\n        .pokemonScale = 257,\n        .pokemonOffset = 0,\n        .trainerScale = 515,\n        .trainerOffset = 12,\n    },\n\n    [NATIONAL_DEX_DROWZEE] =\n    {\n        .categoryName = _(\"HYPNOSIS\"),\n        .height = 10,\n        .weight = 324,\n        .description_FR = gDrowzeePokedexText_FR,\n        .description_LG = gDrowzeePokedexText_LG,\n        .pokemonScale = 274,\n        .pokemonOffset = 7,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_HYPNO] =\n    {\n        .categoryName = _(\"HYPNOSIS\"),\n        .height = 16,\n        .weight = 756,\n        .description_FR = gHypnoPokedexText_FR,\n        .description_LG = gHypnoPokedexText_LG,\n        .pokemonScale = 298,\n        .pokemonOffset = 3,\n        .trainerScale = 310,\n        .trainerOffset = 2,\n    },\n\n    [NATIONAL_DEX_KRABBY] =\n    {\n        .categoryName = _(\"RIVER CRAB\"),\n        .height = 4,\n        .weight = 65,\n        .description_FR = gKrabbyPokedexText_FR,\n        .description_LG = gKrabbyPokedexText_LG,\n        .pokemonScale = 469,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_KINGLER] =\n    {\n        .categoryName = _(\"PINCER\"),\n        .height = 13,\n        .weight = 600,\n        .description_FR = gKinglerPokedexText_FR,\n        .description_LG = gKinglerPokedexText_LG,\n        .pokemonScale = 287,\n        .pokemonOffset = 3,\n        .trainerScale = 308,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_VOLTORB] =\n    {\n        .categoryName = _(\"BALL\"),\n        .height = 5,\n        .weight = 104,\n        .description_FR = gVoltorbPokedexText_FR,\n        .description_LG = gVoltorbPokedexText_LG,\n        .pokemonScale = 364,\n        .pokemonOffset = -8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ELECTRODE] =\n    {\n        .categoryName = _(\"BALL\"),\n        .height = 12,\n        .weight = 666,\n        .description_FR = gElectrodePokedexText_FR,\n        .description_LG = gElectrodePokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 0,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_EXEGGCUTE] =\n    {\n        .categoryName = _(\"EGG\"),\n        .height = 4,\n        .weight = 25,\n        .description_FR = gExeggcutePokedexText_FR,\n        .description_LG = gExeggcutePokedexText_LG,\n        .pokemonScale = 495,\n        .pokemonOffset = -4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_EXEGGUTOR] =\n    {\n        .categoryName = _(\"COCONUT\"),\n        .height = 20,\n        .weight = 1200,\n        .description_FR = gExeggutorPokedexText_FR,\n        .description_LG = gExeggutorPokedexText_LG,\n        .pokemonScale = 283,\n        .pokemonOffset = 0,\n        .trainerScale = 376,\n        .trainerOffset = 7,\n    },\n\n    [NATIONAL_DEX_CUBONE] =\n    {\n        .categoryName = _(\"LONELY\"),\n        .height = 4,\n        .weight = 65,\n        .description_FR = gCubonePokedexText_FR,\n        .description_LG = gCubonePokedexText_LG,\n        .pokemonScale = 545,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MAROWAK] =\n    {\n        .categoryName = _(\"BONE KEEPER\"),\n        .height = 10,\n        .weight = 450,\n        .description_FR = gMarowakPokedexText_FR,\n        .description_LG = gMarowakPokedexText_LG,\n        .pokemonScale = 293,\n        .pokemonOffset = 12,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_HITMONLEE] =\n    {\n        .categoryName = _(\"KICKING\"),\n        .height = 15,\n        .weight = 498,\n        .description_FR = gHitmonleePokedexText_FR,\n        .description_LG = gHitmonleePokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 0,\n        .trainerScale = 273,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_HITMONCHAN] =\n    {\n        .categoryName = _(\"PUNCHING\"),\n        .height = 14,\n        .weight = 502,\n        .description_FR = gHitmonchanPokedexText_FR,\n        .description_LG = gHitmonchanPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 1,\n        .trainerScale = 264,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LICKITUNG] =\n    {\n        .categoryName = _(\"LICKING\"),\n        .height = 12,\n        .weight = 655,\n        .description_FR = gLickitungPokedexText_FR,\n        .description_LG = gLickitungPokedexText_LG,\n        .pokemonScale = 272,\n        .pokemonOffset = 3,\n        .trainerScale = 272,\n        .trainerOffset = -3,\n    },\n\n    [NATIONAL_DEX_KOFFING] =\n    {\n        .categoryName = _(\"POISON GAS\"),\n        .height = 6,\n        .weight = 10,\n        .description_FR = gKoffingPokedexText_FR,\n        .description_LG = gKoffingPokedexText_LG,\n        .pokemonScale = 369,\n        .pokemonOffset = -1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WEEZING] =\n    {\n        .categoryName = _(\"POISON GAS\"),\n        .height = 12,\n        .weight = 95,\n        .description_FR = gWeezingPokedexText_FR,\n        .description_LG = gWeezingPokedexText_LG,\n        .pokemonScale = 321,\n        .pokemonOffset = -1,\n        .trainerScale = 276,\n        .trainerOffset = -1,\n    },\n\n    [NATIONAL_DEX_RHYHORN] =\n    {\n        .categoryName = _(\"SPIKES\"),\n        .height = 10,\n        .weight = 1150,\n        .description_FR = gRhyhornPokedexText_FR,\n        .description_LG = gRhyhornPokedexText_LG,\n        .pokemonScale = 291,\n        .pokemonOffset = 7,\n        .trainerScale = 276,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_RHYDON] =\n    {\n        .categoryName = _(\"DRILL\"),\n        .height = 19,\n        .weight = 1200,\n        .description_FR = gRhydonPokedexText_FR,\n        .description_LG = gRhydonPokedexText_LG,\n        .pokemonScale = 272,\n        .pokemonOffset = -1,\n        .trainerScale = 344,\n        .trainerOffset = 3,\n    },\n\n    [NATIONAL_DEX_CHANSEY] =\n    {\n        .categoryName = _(\"EGG\"),\n        .height = 11,\n        .weight = 346,\n        .description_FR = gChanseyPokedexText_FR,\n        .description_LG = gChanseyPokedexText_LG,\n        .pokemonScale = 257,\n        .pokemonOffset = 6,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_TANGELA] =\n    {\n        .categoryName = _(\"VINE\"),\n        .height = 10,\n        .weight = 350,\n        .description_FR = gTangelaPokedexText_FR,\n        .description_LG = gTangelaPokedexText_LG,\n        .pokemonScale = 320,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_KANGASKHAN] =\n    {\n        .categoryName = _(\"PARENT\"),\n        .height = 22,\n        .weight = 800,\n        .description_FR = gKangaskhanPokedexText_FR,\n        .description_LG = gKangaskhanPokedexText_LG,\n        .pokemonScale = 257,\n        .pokemonOffset = -3,\n        .trainerScale = 349,\n        .trainerOffset = 5,\n    },\n\n    [NATIONAL_DEX_HORSEA] =\n    {\n        .categoryName = _(\"DRAGON\"),\n        .height = 4,\n        .weight = 80,\n        .description_FR = gHorseaPokedexText_FR,\n        .description_LG = gHorseaPokedexText_LG,\n        .pokemonScale = 399,\n        .pokemonOffset = -1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SEADRA] =\n    {\n        .categoryName = _(\"DRAGON\"),\n        .height = 12,\n        .weight = 250,\n        .description_FR = gSeadraPokedexText_FR,\n        .description_LG = gSeadraPokedexText_LG,\n        .pokemonScale = 296,\n        .pokemonOffset = 3,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GOLDEEN] =\n    {\n        .categoryName = _(\"GOLDFISH\"),\n        .height = 6,\n        .weight = 150,\n        .description_FR = gGoldeenPokedexText_FR,\n        .description_LG = gGoldeenPokedexText_LG,\n        .pokemonScale = 379,\n        .pokemonOffset = 4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SEAKING] =\n    {\n        .categoryName = _(\"GOLDFISH\"),\n        .height = 13,\n        .weight = 390,\n        .description_FR = gSeakingPokedexText_FR,\n        .description_LG = gSeakingPokedexText_LG,\n        .pokemonScale = 304,\n        .pokemonOffset = 1,\n        .trainerScale = 288,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_STARYU] =\n    {\n        .categoryName = _(\"STAR SHAPE\"),\n        .height = 8,\n        .weight = 345,\n        .description_FR = gStaryuPokedexText_FR,\n        .description_LG = gStaryuPokedexText_LG,\n        .pokemonScale = 326,\n        .pokemonOffset = 1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_STARMIE] =\n    {\n        .categoryName = _(\"MYSTERIOUS\"),\n        .height = 11,\n        .weight = 800,\n        .description_FR = gStarmiePokedexText_FR,\n        .description_LG = gStarmiePokedexText_LG,\n        .pokemonScale = 301,\n        .pokemonOffset = 3,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MR_MIME] =\n    {\n        .categoryName = _(\"BARRIER\"),\n        .height = 13,\n        .weight = 545,\n        .description_FR = gMrmimePokedexText_FR,\n        .description_LG = gMrmimePokedexText_LG,\n        .pokemonScale = 258,\n        .pokemonOffset = 4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SCYTHER] =\n    {\n        .categoryName = _(\"MANTIS\"),\n        .height = 15,\n        .weight = 560,\n        .description_FR = gScytherPokedexText_FR,\n        .description_LG = gScytherPokedexText_LG,\n        .pokemonScale = 272,\n        .pokemonOffset = 0,\n        .trainerScale = 293,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_JYNX] =\n    {\n        .categoryName = _(\"HUMAN SHAPE\"),\n        .height = 14,\n        .weight = 406,\n        .description_FR = gJynxPokedexText_FR,\n        .description_LG = gJynxPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 3,\n        .trainerScale = 300,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_ELECTABUZZ] =\n    {\n        .categoryName = _(\"ELECTRIC\"),\n        .height = 11,\n        .weight = 300,\n        .description_FR = gElectabuzzPokedexText_FR,\n        .description_LG = gElectabuzzPokedexText_LG,\n        .pokemonScale = 330,\n        .pokemonOffset = 7,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MAGMAR] =\n    {\n        .categoryName = _(\"SPITFIRE\"),\n        .height = 13,\n        .weight = 445,\n        .description_FR = gMagmarPokedexText_FR,\n        .description_LG = gMagmarPokedexText_LG,\n        .pokemonScale = 293,\n        .pokemonOffset = 4,\n        .trainerScale = 272,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PINSIR] =\n    {\n        .categoryName = _(\"STAG BEETLE\"),\n        .height = 15,\n        .weight = 550,\n        .description_FR = gPinsirPokedexText_FR,\n        .description_LG = gPinsirPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 1,\n        .trainerScale = 257,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_TAUROS] =\n    {\n        .categoryName = _(\"WILD BULL\"),\n        .height = 14,\n        .weight = 884,\n        .description_FR = gTaurosPokedexText_FR,\n        .description_LG = gTaurosPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 2,\n        .trainerScale = 312,\n        .trainerOffset = 3,\n    },\n\n    [NATIONAL_DEX_MAGIKARP] =\n    {\n        .categoryName = _(\"FISH\"),\n        .height = 9,\n        .weight = 100,\n        .description_FR = gMagikarpPokedexText_FR,\n        .description_LG = gMagikarpPokedexText_LG,\n        .pokemonScale = 317,\n        .pokemonOffset = 4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GYARADOS] =\n    {\n        .categoryName = _(\"ATROCIOUS\"),\n        .height = 65,\n        .weight = 2350,\n        .description_FR = gGyaradosPokedexText_FR,\n        .description_LG = gGyaradosPokedexText_LG,\n        .pokemonScale = 288,\n        .pokemonOffset = -1,\n        .trainerScale = 512,\n        .trainerOffset = 11,\n    },\n\n    [NATIONAL_DEX_LAPRAS] =\n    {\n        .categoryName = _(\"TRANSPORT\"),\n        .height = 25,\n        .weight = 2200,\n        .description_FR = gLaprasPokedexText_FR,\n        .description_LG = gLaprasPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 0,\n        .trainerScale = 425,\n        .trainerOffset = 8,\n    },\n\n    [NATIONAL_DEX_DITTO] =\n    {\n        .categoryName = _(\"TRANSFORM\"),\n        .height = 3,\n        .weight = 40,\n        .description_FR = gDittoPokedexText_FR,\n        .description_LG = gDittoPokedexText_LG,\n        .pokemonScale = 602,\n        .pokemonOffset = 21,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_EEVEE] =\n    {\n        .categoryName = _(\"EVOLUTION\"),\n        .height = 3,\n        .weight = 65,\n        .description_FR = gEeveePokedexText_FR,\n        .description_LG = gEeveePokedexText_LG,\n        .pokemonScale = 476,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_VAPOREON] =\n    {\n        .categoryName = _(\"BUBBLE JET\"),\n        .height = 10,\n        .weight = 290,\n        .description_FR = gVaporeonPokedexText_FR,\n        .description_LG = gVaporeonPokedexText_LG,\n        .pokemonScale = 316,\n        .pokemonOffset = 7,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_JOLTEON] =\n    {\n        .categoryName = _(\"LIGHTNING\"),\n        .height = 8,\n        .weight = 245,\n        .description_FR = gJolteonPokedexText_FR,\n        .description_LG = gJolteonPokedexText_LG,\n        .pokemonScale = 283,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_FLAREON] =\n    {\n        .categoryName = _(\"FLAME\"),\n        .height = 9,\n        .weight = 250,\n        .description_FR = gFlareonPokedexText_FR,\n        .description_LG = gFlareonPokedexText_LG,\n        .pokemonScale = 302,\n        .pokemonOffset = 11,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PORYGON] =\n    {\n        .categoryName = _(\"VIRTUAL\"),\n        .height = 8,\n        .weight = 365,\n        .description_FR = gPorygonPokedexText_FR,\n        .description_LG = gPorygonPokedexText_LG,\n        .pokemonScale = 328,\n        .pokemonOffset = 7,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_OMANYTE] =\n    {\n        .categoryName = _(\"SPIRAL\"),\n        .height = 4,\n        .weight = 75,\n        .description_FR = gOmanytePokedexText_FR,\n        .description_LG = gOmanytePokedexText_LG,\n        .pokemonScale = 521,\n        .pokemonOffset = 20,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_OMASTAR] =\n    {\n        .categoryName = _(\"SPIRAL\"),\n        .height = 10,\n        .weight = 350,\n        .description_FR = gOmastarPokedexText_FR,\n        .description_LG = gOmastarPokedexText_LG,\n        .pokemonScale = 307,\n        .pokemonOffset = 5,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_KABUTO] =\n    {\n        .categoryName = _(\"SHELLFISH\"),\n        .height = 5,\n        .weight = 115,\n        .description_FR = gKabutoPokedexText_FR,\n        .description_LG = gKabutoPokedexText_LG,\n        .pokemonScale = 438,\n        .pokemonOffset = 21,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_KABUTOPS] =\n    {\n        .categoryName = _(\"SHELLFISH\"),\n        .height = 13,\n        .weight = 405,\n        .description_FR = gKabutopsPokedexText_FR,\n        .description_LG = gKabutopsPokedexText_LG,\n        .pokemonScale = 271,\n        .pokemonOffset = 1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_AERODACTYL] =\n    {\n        .categoryName = _(\"FOSSIL\"),\n        .height = 18,\n        .weight = 590,\n        .description_FR = gAerodactylPokedexText_FR,\n        .description_LG = gAerodactylPokedexText_LG,\n        .pokemonScale = 275,\n        .pokemonOffset = -1,\n        .trainerScale = 317,\n        .trainerOffset = 2,\n    },\n\n    [NATIONAL_DEX_SNORLAX] =\n    {\n        .categoryName = _(\"SLEEPING\"),\n        .height = 21,\n        .weight = 4600,\n        .description_FR = gSnorlaxPokedexText_FR,\n        .description_LG = gSnorlaxPokedexText_LG,\n        .pokemonScale = 275,\n        .pokemonOffset = 1,\n        .trainerScale = 408,\n        .trainerOffset = 7,\n    },\n\n    [NATIONAL_DEX_ARTICUNO] =\n    {\n        .categoryName = _(\"FREEZE\"),\n        .height = 17,\n        .weight = 554,\n        .description_FR = gArticunoPokedexText_FR,\n        .description_LG = gArticunoPokedexText_LG,\n        .pokemonScale = 278,\n        .pokemonOffset = 0,\n        .trainerScale = 308,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_ZAPDOS] =\n    {\n        .categoryName = _(\"ELECTRIC\"),\n        .height = 16,\n        .weight = 526,\n        .description_FR = gZapdosPokedexText_FR,\n        .description_LG = gZapdosPokedexText_LG,\n        .pokemonScale = 275,\n        .pokemonOffset = 1,\n        .trainerScale = 330,\n        .trainerOffset = 3,\n    },\n\n    [NATIONAL_DEX_MOLTRES] =\n    {\n        .categoryName = _(\"FLAME\"),\n        .height = 20,\n        .weight = 600,\n        .description_FR = gMoltresPokedexText_FR,\n        .description_LG = gMoltresPokedexText_LG,\n        .pokemonScale = 270,\n        .pokemonOffset = 1,\n        .trainerScale = 379,\n        .trainerOffset = 6,\n    },\n\n    [NATIONAL_DEX_DRATINI] =\n    {\n        .categoryName = _(\"DRAGON\"),\n        .height = 18,\n        .weight = 33,\n        .description_FR = gDratiniPokedexText_FR,\n        .description_LG = gDratiniPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 8,\n        .trainerScale = 386,\n        .trainerOffset = 6,\n    },\n\n    [NATIONAL_DEX_DRAGONAIR] =\n    {\n        .categoryName = _(\"DRAGON\"),\n        .height = 40,\n        .weight = 165,\n        .description_FR = gDragonairPokedexText_FR,\n        .description_LG = gDragonairPokedexText_LG,\n        .pokemonScale = 274,\n        .pokemonOffset = 0,\n        .trainerScale = 423,\n        .trainerOffset = 6,\n    },\n\n    [NATIONAL_DEX_DRAGONITE] =\n    {\n        .categoryName = _(\"DRAGON\"),\n        .height = 22,\n        .weight = 2100,\n        .description_FR = gDragonitePokedexText_FR,\n        .description_LG = gDragonitePokedexText_LG,\n        .pokemonScale = 283,\n        .pokemonOffset = -1,\n        .trainerScale = 342,\n        .trainerOffset = 4,\n    },\n\n    [NATIONAL_DEX_MEWTWO] =\n    {\n        .categoryName = _(\"GENETIC\"),\n        .height = 20,\n        .weight = 1220,\n        .description_FR = gMewtwoPokedexText_FR,\n        .description_LG = gMewtwoPokedexText_LG,\n        .pokemonScale = 276,\n        .pokemonOffset = -1,\n        .trainerScale = 342,\n        .trainerOffset = 5,\n    },\n\n    [NATIONAL_DEX_MEW] =\n    {\n        .categoryName = _(\"NEW SPECIES\"),\n        .height = 4,\n        .weight = 40,\n        .description_FR = gMewPokedexText_FR,\n        .description_LG = gMewPokedexText_LG,\n        .pokemonScale = 460,\n        .pokemonOffset = -2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CHIKORITA] =\n    {\n        .categoryName = _(\"LEAF\"),\n        .height = 9,\n        .weight = 64,\n        .description_FR = gChikoritaPokedexText_FR,\n        .description_LG = gChikoritaPokedexText_LG,\n        .pokemonScale = 512,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_BAYLEEF] =\n    {\n        .categoryName = _(\"LEAF\"),\n        .height = 12,\n        .weight = 158,\n        .description_FR = gBayleefPokedexText_FR,\n        .description_LG = gBayleefPokedexText_LG,\n        .pokemonScale = 296,\n        .pokemonOffset = 4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MEGANIUM] =\n    {\n        .categoryName = _(\"HERB\"),\n        .height = 18,\n        .weight = 1005,\n        .description_FR = gMeganiumPokedexText_FR,\n        .description_LG = gMeganiumPokedexText_LG,\n        .pokemonScale = 286,\n        .pokemonOffset = 0,\n        .trainerScale = 317,\n        .trainerOffset = 2,\n    },\n\n    [NATIONAL_DEX_CYNDAQUIL] =\n    {\n        .categoryName = _(\"FIRE MOUSE\"),\n        .height = 5,\n        .weight = 79,\n        .description_FR = gCyndaquilPokedexText_FR,\n        .description_LG = gCyndaquilPokedexText_LG,\n        .pokemonScale = 539,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_QUILAVA] =\n    {\n        .categoryName = _(\"VOLCANO\"),\n        .height = 9,\n        .weight = 190,\n        .description_FR = gQuilavaPokedexText_FR,\n        .description_LG = gQuilavaPokedexText_LG,\n        .pokemonScale = 329,\n        .pokemonOffset = 10,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_TYPHLOSION] =\n    {\n        .categoryName = _(\"VOLCANO\"),\n        .height = 17,\n        .weight = 795,\n        .description_FR = gTyphlosionPokedexText_FR,\n        .description_LG = gTyphlosionPokedexText_LG,\n        .pokemonScale = 284,\n        .pokemonOffset = -1,\n        .trainerScale = 287,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_TOTODILE] =\n    {\n        .categoryName = _(\"BIG JAW\"),\n        .height = 6,\n        .weight = 95,\n        .description_FR = gTotodilePokedexText_FR,\n        .description_LG = gTotodilePokedexText_LG,\n        .pokemonScale = 487,\n        .pokemonOffset = 20,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CROCONAW] =\n    {\n        .categoryName = _(\"BIG JAW\"),\n        .height = 11,\n        .weight = 250,\n        .description_FR = gCroconawPokedexText_FR,\n        .description_LG = gCroconawPokedexText_LG,\n        .pokemonScale = 378,\n        .pokemonOffset = 11,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_FERALIGATR] =\n    {\n        .categoryName = _(\"BIG JAW\"),\n        .height = 23,\n        .weight = 888,\n        .description_FR = gFeraligatrPokedexText_FR,\n        .description_LG = gFeraligatrPokedexText_LG,\n        .pokemonScale = 282,\n        .pokemonOffset = -1,\n        .trainerScale = 375,\n        .trainerOffset = 6,\n    },\n\n    [NATIONAL_DEX_SENTRET] =\n    {\n        .categoryName = _(\"SCOUT\"),\n        .height = 8,\n        .weight = 60,\n        .description_FR = gSentretPokedexText_FR,\n        .description_LG = gSentretPokedexText_LG,\n        .pokemonScale = 439,\n        .pokemonOffset = 12,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_FURRET] =\n    {\n        .categoryName = _(\"LONG BODY\"),\n        .height = 18,\n        .weight = 325,\n        .description_FR = gFurretPokedexText_FR,\n        .description_LG = gFurretPokedexText_LG,\n        .pokemonScale = 346,\n        .pokemonOffset = 10,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_HOOTHOOT] =\n    {\n        .categoryName = _(\"OWL\"),\n        .height = 7,\n        .weight = 212,\n        .description_FR = gHoothootPokedexText_FR,\n        .description_LG = gHoothootPokedexText_LG,\n        .pokemonScale = 380,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_NOCTOWL] =\n    {\n        .categoryName = _(\"OWL\"),\n        .height = 16,\n        .weight = 408,\n        .description_FR = gNoctowlPokedexText_FR,\n        .description_LG = gNoctowlPokedexText_LG,\n        .pokemonScale = 278,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LEDYBA] =\n    {\n        .categoryName = _(\"FIVE STAR\"),\n        .height = 10,\n        .weight = 108,\n        .description_FR = gLedybaPokedexText_FR,\n        .description_LG = gLedybaPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LEDIAN] =\n    {\n        .categoryName = _(\"FIVE STAR\"),\n        .height = 14,\n        .weight = 356,\n        .description_FR = gLedianPokedexText_FR,\n        .description_LG = gLedianPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SPINARAK] =\n    {\n        .categoryName = _(\"STRING SPIT\"),\n        .height = 5,\n        .weight = 85,\n        .description_FR = gSpinarakPokedexText_FR,\n        .description_LG = gSpinarakPokedexText_LG,\n        .pokemonScale = 414,\n        .pokemonOffset = 20,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ARIADOS] =\n    {\n        .categoryName = _(\"LONG LEG\"),\n        .height = 11,\n        .weight = 335,\n        .description_FR = gAriadosPokedexText_FR,\n        .description_LG = gAriadosPokedexText_LG,\n        .pokemonScale = 316,\n        .pokemonOffset = 7,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CROBAT] =\n    {\n        .categoryName = _(\"BAT\"),\n        .height = 18,\n        .weight = 750,\n        .description_FR = gCrobatPokedexText_FR,\n        .description_LG = gCrobatPokedexText_LG,\n        .pokemonScale = 279,\n        .pokemonOffset = -1,\n        .trainerScale = 313,\n        .trainerOffset = 2,\n    },\n\n    [NATIONAL_DEX_CHINCHOU] =\n    {\n        .categoryName = _(\"ANGLER\"),\n        .height = 5,\n        .weight = 120,\n        .description_FR = gChinchouPokedexText_FR,\n        .description_LG = gChinchouPokedexText_LG,\n        .pokemonScale = 424,\n        .pokemonOffset = -2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LANTURN] =\n    {\n        .categoryName = _(\"LIGHT\"),\n        .height = 12,\n        .weight = 225,\n        .description_FR = gLanturnPokedexText_FR,\n        .description_LG = gLanturnPokedexText_LG,\n        .pokemonScale = 269,\n        .pokemonOffset = 6,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PICHU] =\n    {\n        .categoryName = _(\"TINY MOUSE\"),\n        .height = 3,\n        .weight = 20,\n        .description_FR = gPichuPokedexText_FR,\n        .description_LG = gPichuPokedexText_LG,\n        .pokemonScale = 508,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CLEFFA] =\n    {\n        .categoryName = _(\"STAR SHAPE\"),\n        .height = 3,\n        .weight = 30,\n        .description_FR = gCleffaPokedexText_FR,\n        .description_LG = gCleffaPokedexText_LG,\n        .pokemonScale = 462,\n        .pokemonOffset = 22,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_IGGLYBUFF] =\n    {\n        .categoryName = _(\"BALLOON\"),\n        .height = 3,\n        .weight = 10,\n        .description_FR = gIgglybuffPokedexText_FR,\n        .description_LG = gIgglybuffPokedexText_LG,\n        .pokemonScale = 457,\n        .pokemonOffset = -1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_TOGEPI] =\n    {\n        .categoryName = _(\"SPIKE BALL\"),\n        .height = 3,\n        .weight = 15,\n        .description_FR = gTogepiPokedexText_FR,\n        .description_LG = gTogepiPokedexText_LG,\n        .pokemonScale = 507,\n        .pokemonOffset = 21,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_TOGETIC] =\n    {\n        .categoryName = _(\"HAPPINESS\"),\n        .height = 6,\n        .weight = 32,\n        .description_FR = gTogeticPokedexText_FR,\n        .description_LG = gTogeticPokedexText_LG,\n        .pokemonScale = 424,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_NATU] =\n    {\n        .categoryName = _(\"TINY BIRD\"),\n        .height = 2,\n        .weight = 20,\n        .description_FR = gNatuPokedexText_FR,\n        .description_LG = gNatuPokedexText_LG,\n        .pokemonScale = 610,\n        .pokemonOffset = 23,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_XATU] =\n    {\n        .categoryName = _(\"MYSTIC\"),\n        .height = 15,\n        .weight = 150,\n        .description_FR = gXatuPokedexText_FR,\n        .description_LG = gXatuPokedexText_LG,\n        .pokemonScale = 258,\n        .pokemonOffset = 4,\n        .trainerScale = 317,\n        .trainerOffset = 3,\n    },\n\n    [NATIONAL_DEX_MAREEP] =\n    {\n        .categoryName = _(\"WOOL\"),\n        .height = 6,\n        .weight = 78,\n        .description_FR = gMareepPokedexText_FR,\n        .description_LG = gMareepPokedexText_LG,\n        .pokemonScale = 379,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_FLAAFFY] =\n    {\n        .categoryName = _(\"WOOL\"),\n        .height = 8,\n        .weight = 133,\n        .description_FR = gFlaaffyPokedexText_FR,\n        .description_LG = gFlaaffyPokedexText_LG,\n        .pokemonScale = 372,\n        .pokemonOffset = 13,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_AMPHAROS] =\n    {\n        .categoryName = _(\"LIGHT\"),\n        .height = 14,\n        .weight = 615,\n        .description_FR = gAmpharosPokedexText_FR,\n        .description_LG = gAmpharosPokedexText_LG,\n        .pokemonScale = 275,\n        .pokemonOffset = 2,\n        .trainerScale = 283,\n        .trainerOffset = -1,\n    },\n\n    [NATIONAL_DEX_BELLOSSOM] =\n    {\n        .categoryName = _(\"FLOWER\"),\n        .height = 4,\n        .weight = 58,\n        .description_FR = gBellossomPokedexText_FR,\n        .description_LG = gBellossomPokedexText_LG,\n        .pokemonScale = 472,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MARILL] =\n    {\n        .categoryName = _(\"AQUA MOUSE\"),\n        .height = 4,\n        .weight = 85,\n        .description_FR = gMarillPokedexText_FR,\n        .description_LG = gMarillPokedexText_LG,\n        .pokemonScale = 476,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_AZUMARILL] =\n    {\n        .categoryName = _(\"AQUA RABBIT\"),\n        .height = 8,\n        .weight = 285,\n        .description_FR = gAzumarillPokedexText_FR,\n        .description_LG = gAzumarillPokedexText_LG,\n        .pokemonScale = 448,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SUDOWOODO] =\n    {\n        .categoryName = _(\"IMITATION\"),\n        .height = 12,\n        .weight = 380,\n        .description_FR = gSudowoodoPokedexText_FR,\n        .description_LG = gSudowoodoPokedexText_LG,\n        .pokemonScale = 305,\n        .pokemonOffset = 7,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_POLITOED] =\n    {\n        .categoryName = _(\"FROG\"),\n        .height = 11,\n        .weight = 339,\n        .description_FR = gPolitoedPokedexText_FR,\n        .description_LG = gPolitoedPokedexText_LG,\n        .pokemonScale = 289,\n        .pokemonOffset = 5,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_HOPPIP] =\n    {\n        .categoryName = _(\"COTTONWEED\"),\n        .height = 4,\n        .weight = 5,\n        .description_FR = gHoppipPokedexText_FR,\n        .description_LG = gHoppipPokedexText_LG,\n        .pokemonScale = 562,\n        .pokemonOffset = -7,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SKIPLOOM] =\n    {\n        .categoryName = _(\"COTTONWEED\"),\n        .height = 6,\n        .weight = 10,\n        .description_FR = gSkiploomPokedexText_FR,\n        .description_LG = gSkiploomPokedexText_LG,\n        .pokemonScale = 387,\n        .pokemonOffset = 0,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_JUMPLUFF] =\n    {\n        .categoryName = _(\"COTTONWEED\"),\n        .height = 8,\n        .weight = 30,\n        .description_FR = gJumpluffPokedexText_FR,\n        .description_LG = gJumpluffPokedexText_LG,\n        .pokemonScale = 418,\n        .pokemonOffset = -4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_AIPOM] =\n    {\n        .categoryName = _(\"LONG TAIL\"),\n        .height = 8,\n        .weight = 115,\n        .description_FR = gAipomPokedexText_FR,\n        .description_LG = gAipomPokedexText_LG,\n        .pokemonScale = 363,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SUNKERN] =\n    {\n        .categoryName = _(\"SEED\"),\n        .height = 3,\n        .weight = 18,\n        .description_FR = gSunkernPokedexText_FR,\n        .description_LG = gSunkernPokedexText_LG,\n        .pokemonScale = 541,\n        .pokemonOffset = 0,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SUNFLORA] =\n    {\n        .categoryName = _(\"SUN\"),\n        .height = 8,\n        .weight = 85,\n        .description_FR = gSunfloraPokedexText_FR,\n        .description_LG = gSunfloraPokedexText_LG,\n        .pokemonScale = 374,\n        .pokemonOffset = 12,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_YANMA] =\n    {\n        .categoryName = _(\"CLEAR WING\"),\n        .height = 12,\n        .weight = 380,\n        .description_FR = gYanmaPokedexText_FR,\n        .description_LG = gYanmaPokedexText_LG,\n        .pokemonScale = 274,\n        .pokemonOffset = -4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WOOPER] =\n    {\n        .categoryName = _(\"WATER FISH\"),\n        .height = 4,\n        .weight = 85,\n        .description_FR = gWooperPokedexText_FR,\n        .description_LG = gWooperPokedexText_LG,\n        .pokemonScale = 479,\n        .pokemonOffset = 20,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_QUAGSIRE] =\n    {\n        .categoryName = _(\"WATER FISH\"),\n        .height = 14,\n        .weight = 750,\n        .description_FR = gQuagsirePokedexText_FR,\n        .description_LG = gQuagsirePokedexText_LG,\n        .pokemonScale = 273,\n        .pokemonOffset = 4,\n        .trainerScale = 273,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ESPEON] =\n    {\n        .categoryName = _(\"SUN\"),\n        .height = 9,\n        .weight = 265,\n        .description_FR = gEspeonPokedexText_FR,\n        .description_LG = gEspeonPokedexText_LG,\n        .pokemonScale = 363,\n        .pokemonOffset = 12,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_UMBREON] =\n    {\n        .categoryName = _(\"MOONLIGHT\"),\n        .height = 10,\n        .weight = 270,\n        .description_FR = gUmbreonPokedexText_FR,\n        .description_LG = gUmbreonPokedexText_LG,\n        .pokemonScale = 317,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MURKROW] =\n    {\n        .categoryName = _(\"DARKNESS\"),\n        .height = 5,\n        .weight = 21,\n        .description_FR = gMurkrowPokedexText_FR,\n        .description_LG = gMurkrowPokedexText_LG,\n        .pokemonScale = 401,\n        .pokemonOffset = -8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SLOWKING] =\n    {\n        .categoryName = _(\"ROYAL\"),\n        .height = 20,\n        .weight = 795,\n        .description_FR = gSlowkingPokedexText_FR,\n        .description_LG = gSlowkingPokedexText_LG,\n        .pokemonScale = 265,\n        .pokemonOffset = -1,\n        .trainerScale = 330,\n        .trainerOffset = 4,\n    },\n\n    [NATIONAL_DEX_MISDREAVUS] =\n    {\n        .categoryName = _(\"SCREECH\"),\n        .height = 7,\n        .weight = 10,\n        .description_FR = gMisdreavusPokedexText_FR,\n        .description_LG = gMisdreavusPokedexText_LG,\n        .pokemonScale = 407,\n        .pokemonOffset = -8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_UNOWN] =\n    {\n        .categoryName = _(\"SYMBOL\"),\n        .height = 5,\n        .weight = 50,\n        .description_FR = gUnownPokedexText_FR,\n        .description_LG = gUnownPokedexText_LG,\n        .pokemonScale = 411,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WOBBUFFET] =\n    {\n        .categoryName = _(\"PATIENT\"),\n        .height = 13,\n        .weight = 285,\n        .description_FR = gWobbuffetPokedexText_FR,\n        .description_LG = gWobbuffetPokedexText_LG,\n        .pokemonScale = 274,\n        .pokemonOffset = 4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GIRAFARIG] =\n    {\n        .categoryName = _(\"LONG NECK\"),\n        .height = 15,\n        .weight = 415,\n        .description_FR = gGirafarigPokedexText_FR,\n        .description_LG = gGirafarigPokedexText_LG,\n        .pokemonScale = 281,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PINECO] =\n    {\n        .categoryName = _(\"BAGWORM\"),\n        .height = 6,\n        .weight = 72,\n        .description_FR = gPinecoPokedexText_FR,\n        .description_LG = gPinecoPokedexText_LG,\n        .pokemonScale = 445,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_FORRETRESS] =\n    {\n        .categoryName = _(\"BAGWORM\"),\n        .height = 12,\n        .weight = 1258,\n        .description_FR = gForretressPokedexText_FR,\n        .description_LG = gForretressPokedexText_LG,\n        .pokemonScale = 293,\n        .pokemonOffset = 5,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_DUNSPARCE] =\n    {\n        .categoryName = _(\"LAND SNAKE\"),\n        .height = 15,\n        .weight = 140,\n        .description_FR = gDunsparcePokedexText_FR,\n        .description_LG = gDunsparcePokedexText_LG,\n        .pokemonScale = 284,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GLIGAR] =\n    {\n        .categoryName = _(\"FLYSCORPION\"),\n        .height = 11,\n        .weight = 648,\n        .description_FR = gGligarPokedexText_FR,\n        .description_LG = gGligarPokedexText_LG,\n        .pokemonScale = 350,\n        .pokemonOffset = -1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_STEELIX] =\n    {\n        .categoryName = _(\"IRON SNAKE\"),\n        .height = 92,\n        .weight = 4000,\n        .description_FR = gSteelixPokedexText_FR,\n        .description_LG = gSteelixPokedexText_LG,\n        .pokemonScale = 278,\n        .pokemonOffset = -1,\n        .trainerScale = 557,\n        .trainerOffset = 13,\n    },\n\n    [NATIONAL_DEX_SNUBBULL] =\n    {\n        .categoryName = _(\"FAIRY\"),\n        .height = 6,\n        .weight = 78,\n        .description_FR = gSnubbullPokedexText_FR,\n        .description_LG = gSnubbullPokedexText_LG,\n        .pokemonScale = 465,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GRANBULL] =\n    {\n        .categoryName = _(\"FAIRY\"),\n        .height = 14,\n        .weight = 487,\n        .description_FR = gGranbullPokedexText_FR,\n        .description_LG = gGranbullPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 3,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_QWILFISH] =\n    {\n        .categoryName = _(\"BALLOON\"),\n        .height = 5,\n        .weight = 39,\n        .description_FR = gQwilfishPokedexText_FR,\n        .description_LG = gQwilfishPokedexText_LG,\n        .pokemonScale = 430,\n        .pokemonOffset = 0,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SCIZOR] =\n    {\n        .categoryName = _(\"PINCER\"),\n        .height = 18,\n        .weight = 1180,\n        .description_FR = gScizorPokedexText_FR,\n        .description_LG = gScizorPokedexText_LG,\n        .pokemonScale = 282,\n        .pokemonOffset = 0,\n        .trainerScale = 282,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_SHUCKLE] =\n    {\n        .categoryName = _(\"MOLD\"),\n        .height = 6,\n        .weight = 205,\n        .description_FR = gShucklePokedexText_FR,\n        .description_LG = gShucklePokedexText_LG,\n        .pokemonScale = 485,\n        .pokemonOffset = 16,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_HERACROSS] =\n    {\n        .categoryName = _(\"SINGLE HORN\"),\n        .height = 15,\n        .weight = 540,\n        .description_FR = gHeracrossPokedexText_FR,\n        .description_LG = gHeracrossPokedexText_LG,\n        .pokemonScale = 285,\n        .pokemonOffset = 0,\n        .trainerScale = 283,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SNEASEL] =\n    {\n        .categoryName = _(\"SHARP CLAW\"),\n        .height = 9,\n        .weight = 280,\n        .description_FR = gSneaselPokedexText_FR,\n        .description_LG = gSneaselPokedexText_LG,\n        .pokemonScale = 413,\n        .pokemonOffset = -3,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_TEDDIURSA] =\n    {\n        .categoryName = _(\"LITTLE BEAR\"),\n        .height = 6,\n        .weight = 88,\n        .description_FR = gTeddiursaPokedexText_FR,\n        .description_LG = gTeddiursaPokedexText_LG,\n        .pokemonScale = 455,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_URSARING] =\n    {\n        .categoryName = _(\"HIBERNATOR\"),\n        .height = 18,\n        .weight = 1258,\n        .description_FR = gUrsaringPokedexText_FR,\n        .description_LG = gUrsaringPokedexText_LG,\n        .pokemonScale = 275,\n        .pokemonOffset = 0,\n        .trainerScale = 280,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_SLUGMA] =\n    {\n        .categoryName = _(\"LAVA\"),\n        .height = 7,\n        .weight = 350,\n        .description_FR = gSlugmaPokedexText_FR,\n        .description_LG = gSlugmaPokedexText_LG,\n        .pokemonScale = 329,\n        .pokemonOffset = 14,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MAGCARGO] =\n    {\n        .categoryName = _(\"LAVA\"),\n        .height = 8,\n        .weight = 550,\n        .description_FR = gMagcargoPokedexText_FR,\n        .description_LG = gMagcargoPokedexText_LG,\n        .pokemonScale = 332,\n        .pokemonOffset = 14,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SWINUB] =\n    {\n        .categoryName = _(\"PIG\"),\n        .height = 4,\n        .weight = 65,\n        .description_FR = gSwinubPokedexText_FR,\n        .description_LG = gSwinubPokedexText_LG,\n        .pokemonScale = 324,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PILOSWINE] =\n    {\n        .categoryName = _(\"SWINE\"),\n        .height = 11,\n        .weight = 558,\n        .description_FR = gPiloswinePokedexText_FR,\n        .description_LG = gPiloswinePokedexText_LG,\n        .pokemonScale = 306,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CORSOLA] =\n    {\n        .categoryName = _(\"CORAL\"),\n        .height = 6,\n        .weight = 50,\n        .description_FR = gCorsolaPokedexText_FR,\n        .description_LG = gCorsolaPokedexText_LG,\n        .pokemonScale = 410,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_REMORAID] =\n    {\n        .categoryName = _(\"JET\"),\n        .height = 6,\n        .weight = 120,\n        .description_FR = gRemoraidPokedexText_FR,\n        .description_LG = gRemoraidPokedexText_LG,\n        .pokemonScale = 316,\n        .pokemonOffset = 4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_OCTILLERY] =\n    {\n        .categoryName = _(\"JET\"),\n        .height = 9,\n        .weight = 285,\n        .description_FR = gOctilleryPokedexText_FR,\n        .description_LG = gOctilleryPokedexText_LG,\n        .pokemonScale = 296,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_DELIBIRD] =\n    {\n        .categoryName = _(\"DELIVERY\"),\n        .height = 9,\n        .weight = 160,\n        .description_FR = gDelibirdPokedexText_FR,\n        .description_LG = gDelibirdPokedexText_LG,\n        .pokemonScale = 293,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MANTINE] =\n    {\n        .categoryName = _(\"KITE\"),\n        .height = 21,\n        .weight = 2200,\n        .description_FR = gMantinePokedexText_FR,\n        .description_LG = gMantinePokedexText_LG,\n        .pokemonScale = 275,\n        .pokemonOffset = 0,\n        .trainerScale = 360,\n        .trainerOffset = 6,\n    },\n\n    [NATIONAL_DEX_SKARMORY] =\n    {\n        .categoryName = _(\"ARMOR BIRD\"),\n        .height = 17,\n        .weight = 505,\n        .description_FR = gSkarmoryPokedexText_FR,\n        .description_LG = gSkarmoryPokedexText_LG,\n        .pokemonScale = 285,\n        .pokemonOffset = 0,\n        .trainerScale = 276,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_HOUNDOUR] =\n    {\n        .categoryName = _(\"DARK\"),\n        .height = 6,\n        .weight = 108,\n        .description_FR = gHoundourPokedexText_FR,\n        .description_LG = gHoundourPokedexText_LG,\n        .pokemonScale = 393,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_HOUNDOOM] =\n    {\n        .categoryName = _(\"DARK\"),\n        .height = 14,\n        .weight = 350,\n        .description_FR = gHoundoomPokedexText_FR,\n        .description_LG = gHoundoomPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_KINGDRA] =\n    {\n        .categoryName = _(\"DRAGON\"),\n        .height = 18,\n        .weight = 1520,\n        .description_FR = gKingdraPokedexText_FR,\n        .description_LG = gKingdraPokedexText_LG,\n        .pokemonScale = 257,\n        .pokemonOffset = 1,\n        .trainerScale = 293,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_PHANPY] =\n    {\n        .categoryName = _(\"LONG NOSE\"),\n        .height = 5,\n        .weight = 335,\n        .description_FR = gPhanpyPokedexText_FR,\n        .description_LG = gPhanpyPokedexText_LG,\n        .pokemonScale = 465,\n        .pokemonOffset = 20,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_DONPHAN] =\n    {\n        .categoryName = _(\"ARMOR\"),\n        .height = 11,\n        .weight = 1200,\n        .description_FR = gDonphanPokedexText_FR,\n        .description_LG = gDonphanPokedexText_LG,\n        .pokemonScale = 313,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PORYGON2] =\n    {\n        .categoryName = _(\"VIRTUAL\"),\n        .height = 6,\n        .weight = 325,\n        .description_FR = gPorygon2PokedexText_FR,\n        .description_LG = gPorygon2PokedexText_LG,\n        .pokemonScale = 320,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_STANTLER] =\n    {\n        .categoryName = _(\"BIG HORN\"),\n        .height = 14,\n        .weight = 712,\n        .description_FR = gStantlerPokedexText_FR,\n        .description_LG = gStantlerPokedexText_LG,\n        .pokemonScale = 277,\n        .pokemonOffset = -1,\n        .trainerScale = 277,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_SMEARGLE] =\n    {\n        .categoryName = _(\"PAINTER\"),\n        .height = 12,\n        .weight = 580,\n        .description_FR = gSmearglePokedexText_FR,\n        .description_LG = gSmearglePokedexText_LG,\n        .pokemonScale = 287,\n        .pokemonOffset = 5,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_TYROGUE] =\n    {\n        .categoryName = _(\"SCUFFLE\"),\n        .height = 7,\n        .weight = 210,\n        .description_FR = gTyroguePokedexText_FR,\n        .description_LG = gTyroguePokedexText_LG,\n        .pokemonScale = 292,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_HITMONTOP] =\n    {\n        .categoryName = _(\"HANDSTAND\"),\n        .height = 14,\n        .weight = 480,\n        .description_FR = gHitmontopPokedexText_FR,\n        .description_LG = gHitmontopPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 2,\n        .trainerScale = 257,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SMOOCHUM] =\n    {\n        .categoryName = _(\"KISS\"),\n        .height = 4,\n        .weight = 60,\n        .description_FR = gSmoochumPokedexText_FR,\n        .description_LG = gSmoochumPokedexText_LG,\n        .pokemonScale = 440,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ELEKID] =\n    {\n        .categoryName = _(\"ELECTRIC\"),\n        .height = 6,\n        .weight = 235,\n        .description_FR = gElekidPokedexText_FR,\n        .description_LG = gElekidPokedexText_LG,\n        .pokemonScale = 363,\n        .pokemonOffset = 13,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MAGBY] =\n    {\n        .categoryName = _(\"LIVE COAL\"),\n        .height = 7,\n        .weight = 214,\n        .description_FR = gMagbyPokedexText_FR,\n        .description_LG = gMagbyPokedexText_LG,\n        .pokemonScale = 284,\n        .pokemonOffset = 11,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MILTANK] =\n    {\n        .categoryName = _(\"MILK COW\"),\n        .height = 12,\n        .weight = 755,\n        .description_FR = gMiltankPokedexText_FR,\n        .description_LG = gMiltankPokedexText_LG,\n        .pokemonScale = 280,\n        .pokemonOffset = 3,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_BLISSEY] =\n    {\n        .categoryName = _(\"HAPPINESS\"),\n        .height = 15,\n        .weight = 468,\n        .description_FR = gBlisseyPokedexText_FR,\n        .description_LG = gBlisseyPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 3,\n        .trainerScale = 310,\n        .trainerOffset = 3,\n    },\n\n    [NATIONAL_DEX_RAIKOU] =\n    {\n        .categoryName = _(\"THUNDER\"),\n        .height = 19,\n        .weight = 1780,\n        .description_FR = gRaikouPokedexText_FR,\n        .description_LG = gRaikouPokedexText_LG,\n        .pokemonScale = 283,\n        .pokemonOffset = 0,\n        .trainerScale = 359,\n        .trainerOffset = 6,\n    },\n\n    [NATIONAL_DEX_ENTEI] =\n    {\n        .categoryName = _(\"VOLCANO\"),\n        .height = 21,\n        .weight = 1980,\n        .description_FR = gEnteiPokedexText_FR,\n        .description_LG = gEnteiPokedexText_LG,\n        .pokemonScale = 283,\n        .pokemonOffset = 0,\n        .trainerScale = 370,\n        .trainerOffset = 7,\n    },\n\n    [NATIONAL_DEX_SUICUNE] =\n    {\n        .categoryName = _(\"AURORA\"),\n        .height = 20,\n        .weight = 1870,\n        .description_FR = gSuicunePokedexText_FR,\n        .description_LG = gSuicunePokedexText_LG,\n        .pokemonScale = 286,\n        .pokemonOffset = 0,\n        .trainerScale = 371,\n        .trainerOffset = 7,\n    },\n\n    [NATIONAL_DEX_LARVITAR] =\n    {\n        .categoryName = _(\"ROCK SKIN\"),\n        .height = 6,\n        .weight = 720,\n        .description_FR = gLarvitarPokedexText_FR,\n        .description_LG = gLarvitarPokedexText_LG,\n        .pokemonScale = 472,\n        .pokemonOffset = 16,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PUPITAR] =\n    {\n        .categoryName = _(\"HARD SHELL\"),\n        .height = 12,\n        .weight = 1520,\n        .description_FR = gPupitarPokedexText_FR,\n        .description_LG = gPupitarPokedexText_LG,\n        .pokemonScale = 292,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_TYRANITAR] =\n    {\n        .categoryName = _(\"ARMOR\"),\n        .height = 20,\n        .weight = 2020,\n        .description_FR = gTyranitarPokedexText_FR,\n        .description_LG = gTyranitarPokedexText_LG,\n        .pokemonScale = 285,\n        .pokemonOffset = 0,\n        .trainerScale = 383,\n        .trainerOffset = 7,\n    },\n\n    [NATIONAL_DEX_LUGIA] =\n    {\n        .categoryName = _(\"DIVING\"),\n        .height = 52,\n        .weight = 2160,\n        .description_FR = gLugiaPokedexText_FR,\n        .description_LG = gLugiaPokedexText_LG,\n        .pokemonScale = 283,\n        .pokemonOffset = 0,\n        .trainerScale = 742,\n        .trainerOffset = 18,\n    },\n\n    [NATIONAL_DEX_HO_OH] =\n    {\n        .categoryName = _(\"RAINBOW\"),\n        .height = 38,\n        .weight = 1990,\n        .description_FR = gHoOhPokedexText_FR,\n        .description_LG = gHoOhPokedexText_LG,\n        .pokemonScale = 283,\n        .pokemonOffset = 0,\n        .trainerScale = 620,\n        .trainerOffset = 16,\n    },\n\n    [NATIONAL_DEX_CELEBI] =\n    {\n        .categoryName = _(\"TIME TRAVEL\"),\n        .height = 6,\n        .weight = 50,\n        .description_FR = gCelebiPokedexText_FR,\n        .description_LG = gCelebiPokedexText_LG,\n        .pokemonScale = 393,\n        .pokemonOffset = -10,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_TREECKO] =\n    {\n        .categoryName = _(\"WOOD GECKO\"),\n        .height = 5,\n        .weight = 50,\n        .description_FR = gTreeckoPokedexText_FR,\n        .description_LG = gTreeckoPokedexText_LG,\n        .pokemonScale = 541,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GROVYLE] =\n    {\n        .categoryName = _(\"WOOD GECKO\"),\n        .height = 9,\n        .weight = 216,\n        .description_FR = gGrovylePokedexText_FR,\n        .description_LG = gGrovylePokedexText_LG,\n        .pokemonScale = 360,\n        .pokemonOffset = 5,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SCEPTILE] =\n    {\n        .categoryName = _(\"FOREST\"),\n        .height = 17,\n        .weight = 522,\n        .description_FR = gSceptilePokedexText_FR,\n        .description_LG = gSceptilePokedexText_LG,\n        .pokemonScale = 282,\n        .pokemonOffset = -1,\n        .trainerScale = 313,\n        .trainerOffset = 3,\n    },\n\n    [NATIONAL_DEX_TORCHIC] =\n    {\n        .categoryName = _(\"CHICK\"),\n        .height = 4,\n        .weight = 25,\n        .description_FR = gTorchicPokedexText_FR,\n        .description_LG = gTorchicPokedexText_LG,\n        .pokemonScale = 566,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_COMBUSKEN] =\n    {\n        .categoryName = _(\"YOUNG FOWL\"),\n        .height = 9,\n        .weight = 195,\n        .description_FR = gCombuskenPokedexText_FR,\n        .description_LG = gCombuskenPokedexText_LG,\n        .pokemonScale = 343,\n        .pokemonOffset = 5,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_BLAZIKEN] =\n    {\n        .categoryName = _(\"BLAZE\"),\n        .height = 19,\n        .weight = 520,\n        .description_FR = gBlazikenPokedexText_FR,\n        .description_LG = gBlazikenPokedexText_LG,\n        .pokemonScale = 275,\n        .pokemonOffset = -1,\n        .trainerScale = 314,\n        .trainerOffset = 3,\n    },\n\n    [NATIONAL_DEX_MUDKIP] =\n    {\n        .categoryName = _(\"MUD FISH\"),\n        .height = 4,\n        .weight = 76,\n        .description_FR = gMudkipPokedexText_FR,\n        .description_LG = gMudkipPokedexText_LG,\n        .pokemonScale = 535,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MARSHTOMP] =\n    {\n        .categoryName = _(\"MUD FISH\"),\n        .height = 7,\n        .weight = 280,\n        .description_FR = gMarshtompPokedexText_FR,\n        .description_LG = gMarshtompPokedexText_LG,\n        .pokemonScale = 340,\n        .pokemonOffset = 7,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SWAMPERT] =\n    {\n        .categoryName = _(\"MUD FISH\"),\n        .height = 15,\n        .weight = 819,\n        .description_FR = gSwampertPokedexText_FR,\n        .description_LG = gSwampertPokedexText_LG,\n        .pokemonScale = 276,\n        .pokemonOffset = -1,\n        .trainerScale = 282,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_POOCHYENA] =\n    {\n        .categoryName = _(\"BITE\"),\n        .height = 5,\n        .weight = 136,\n        .description_FR = gPoochyenaPokedexText_FR,\n        .description_LG = gPoochyenaPokedexText_LG,\n        .pokemonScale = 481,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MIGHTYENA] =\n    {\n        .categoryName = _(\"BITE\"),\n        .height = 10,\n        .weight = 370,\n        .description_FR = gMightyenaPokedexText_FR,\n        .description_LG = gMightyenaPokedexText_LG,\n        .pokemonScale = 359,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ZIGZAGOON] =\n    {\n        .categoryName = _(\"TINYRACCOON\"),\n        .height = 4,\n        .weight = 175,\n        .description_FR = gZigzagoonPokedexText_FR,\n        .description_LG = gZigzagoonPokedexText_LG,\n        .pokemonScale = 560,\n        .pokemonOffset = 21,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LINOONE] =\n    {\n        .categoryName = _(\"RUSHING\"),\n        .height = 5,\n        .weight = 325,\n        .description_FR = gLinoonePokedexText_FR,\n        .description_LG = gLinoonePokedexText_LG,\n        .pokemonScale = 321,\n        .pokemonOffset = 5,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WURMPLE] =\n    {\n        .categoryName = _(\"WORM\"),\n        .height = 3,\n        .weight = 36,\n        .description_FR = gWurmplePokedexText_FR,\n        .description_LG = gWurmplePokedexText_LG,\n        .pokemonScale = 711,\n        .pokemonOffset = 22,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SILCOON] =\n    {\n        .categoryName = _(\"COCOON\"),\n        .height = 6,\n        .weight = 100,\n        .description_FR = gSilcoonPokedexText_FR,\n        .description_LG = gSilcoonPokedexText_LG,\n        .pokemonScale = 431,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_BEAUTIFLY] =\n    {\n        .categoryName = _(\"BUTTERFLY\"),\n        .height = 10,\n        .weight = 284,\n        .description_FR = gBeautiflyPokedexText_FR,\n        .description_LG = gBeautiflyPokedexText_LG,\n        .pokemonScale = 298,\n        .pokemonOffset = -1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CASCOON] =\n    {\n        .categoryName = _(\"COCOON\"),\n        .height = 7,\n        .weight = 115,\n        .description_FR = gCascoonPokedexText_FR,\n        .description_LG = gCascoonPokedexText_LG,\n        .pokemonScale = 391,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_DUSTOX] =\n    {\n        .categoryName = _(\"POISON MOTH\"),\n        .height = 12,\n        .weight = 316,\n        .description_FR = gDustoxPokedexText_FR,\n        .description_LG = gDustoxPokedexText_LG,\n        .pokemonScale = 269,\n        .pokemonOffset = 1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LOTAD] =\n    {\n        .categoryName = _(\"WATER WEED\"),\n        .height = 5,\n        .weight = 26,\n        .description_FR = gLotadPokedexText_FR,\n        .description_LG = gLotadPokedexText_LG,\n        .pokemonScale = 406,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LOMBRE] =\n    {\n        .categoryName = _(\"JOLLY\"),\n        .height = 12,\n        .weight = 325,\n        .description_FR = gLombrePokedexText_FR,\n        .description_LG = gLombrePokedexText_LG,\n        .pokemonScale = 277,\n        .pokemonOffset = 7,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LUDICOLO] =\n    {\n        .categoryName = _(\"CAREFREE\"),\n        .height = 15,\n        .weight = 550,\n        .description_FR = gLudicoloPokedexText_FR,\n        .description_LG = gLudicoloPokedexText_LG,\n        .pokemonScale = 283,\n        .pokemonOffset = 0,\n        .trainerScale = 282,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_SEEDOT] =\n    {\n        .categoryName = _(\"ACORN\"),\n        .height = 5,\n        .weight = 40,\n        .description_FR = gSeedotPokedexText_FR,\n        .description_LG = gSeedotPokedexText_LG,\n        .pokemonScale = 472,\n        .pokemonOffset = 20,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_NUZLEAF] =\n    {\n        .categoryName = _(\"WILY\"),\n        .height = 10,\n        .weight = 280,\n        .description_FR = gNuzleafPokedexText_FR,\n        .description_LG = gNuzleafPokedexText_LG,\n        .pokemonScale = 299,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SHIFTRY] =\n    {\n        .categoryName = _(\"WICKED\"),\n        .height = 13,\n        .weight = 596,\n        .description_FR = gShiftryPokedexText_FR,\n        .description_LG = gShiftryPokedexText_LG,\n        .pokemonScale = 290,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_TAILLOW] =\n    {\n        .categoryName = _(\"TINYSWALLOW\"),\n        .height = 3,\n        .weight = 23,\n        .description_FR = gTaillowPokedexText_FR,\n        .description_LG = gTaillowPokedexText_LG,\n        .pokemonScale = 465,\n        .pokemonOffset = 20,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SWELLOW] =\n    {\n        .categoryName = _(\"SWALLOW\"),\n        .height = 7,\n        .weight = 198,\n        .description_FR = gSwellowPokedexText_FR,\n        .description_LG = gSwellowPokedexText_LG,\n        .pokemonScale = 428,\n        .pokemonOffset = 13,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WINGULL] =\n    {\n        .categoryName = _(\"SEAGULL\"),\n        .height = 6,\n        .weight = 95,\n        .description_FR = gWingullPokedexText_FR,\n        .description_LG = gWingullPokedexText_LG,\n        .pokemonScale = 295,\n        .pokemonOffset = -2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PELIPPER] =\n    {\n        .categoryName = _(\"WATER BIRD\"),\n        .height = 12,\n        .weight = 280,\n        .description_FR = gPelipperPokedexText_FR,\n        .description_LG = gPelipperPokedexText_LG,\n        .pokemonScale = 288,\n        .pokemonOffset = 1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_RALTS] =\n    {\n        .categoryName = _(\"FEELING\"),\n        .height = 4,\n        .weight = 66,\n        .description_FR = gRaltsPokedexText_FR,\n        .description_LG = gRaltsPokedexText_LG,\n        .pokemonScale = 457,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_KIRLIA] =\n    {\n        .categoryName = _(\"EMOTION\"),\n        .height = 8,\n        .weight = 202,\n        .description_FR = gKirliaPokedexText_FR,\n        .description_LG = gKirliaPokedexText_LG,\n        .pokemonScale = 354,\n        .pokemonOffset = 10,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GARDEVOIR] =\n    {\n        .categoryName = _(\"EMBRACE\"),\n        .height = 16,\n        .weight = 484,\n        .description_FR = gGardevoirPokedexText_FR,\n        .description_LG = gGardevoirPokedexText_LG,\n        .pokemonScale = 277,\n        .pokemonOffset = 0,\n        .trainerScale = 276,\n        .trainerOffset = -1,\n    },\n\n    [NATIONAL_DEX_SURSKIT] =\n    {\n        .categoryName = _(\"POND SKATER\"),\n        .height = 5,\n        .weight = 17,\n        .description_FR = gSurskitPokedexText_FR,\n        .description_LG = gSurskitPokedexText_LG,\n        .pokemonScale = 375,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MASQUERAIN] =\n    {\n        .categoryName = _(\"EYEBALL\"),\n        .height = 8,\n        .weight = 36,\n        .description_FR = gMasquerainPokedexText_FR,\n        .description_LG = gMasquerainPokedexText_LG,\n        .pokemonScale = 378,\n        .pokemonOffset = -1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SHROOMISH] =\n    {\n        .categoryName = _(\"MUSHROOM\"),\n        .height = 4,\n        .weight = 45,\n        .description_FR = gShroomishPokedexText_FR,\n        .description_LG = gShroomishPokedexText_LG,\n        .pokemonScale = 513,\n        .pokemonOffset = 20,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_BRELOOM] =\n    {\n        .categoryName = _(\"MUSHROOM\"),\n        .height = 12,\n        .weight = 392,\n        .description_FR = gBreloomPokedexText_FR,\n        .description_LG = gBreloomPokedexText_LG,\n        .pokemonScale = 324,\n        .pokemonOffset = 6,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SLAKOTH] =\n    {\n        .categoryName = _(\"SLACKER\"),\n        .height = 8,\n        .weight = 240,\n        .description_FR = gSlakothPokedexText_FR,\n        .description_LG = gSlakothPokedexText_LG,\n        .pokemonScale = 291,\n        .pokemonOffset = 16,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_VIGOROTH] =\n    {\n        .categoryName = _(\"WILD MONKEY\"),\n        .height = 14,\n        .weight = 465,\n        .description_FR = gVigorothPokedexText_FR,\n        .description_LG = gVigorothPokedexText_LG,\n        .pokemonScale = 301,\n        .pokemonOffset = 1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SLAKING] =\n    {\n        .categoryName = _(\"LAZY\"),\n        .height = 20,\n        .weight = 1305,\n        .description_FR = gSlakingPokedexText_FR,\n        .description_LG = gSlakingPokedexText_LG,\n        .pokemonScale = 277,\n        .pokemonOffset = 5,\n        .trainerScale = 326,\n        .trainerOffset = 3,\n    },\n\n    [NATIONAL_DEX_NINCADA] =\n    {\n        .categoryName = _(\"TRAINEE\"),\n        .height = 5,\n        .weight = 55,\n        .description_FR = gNincadaPokedexText_FR,\n        .description_LG = gNincadaPokedexText_LG,\n        .pokemonScale = 405,\n        .pokemonOffset = 20,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_NINJASK] =\n    {\n        .categoryName = _(\"NINJA\"),\n        .height = 8,\n        .weight = 120,\n        .description_FR = gNinjaskPokedexText_FR,\n        .description_LG = gNinjaskPokedexText_LG,\n        .pokemonScale = 383,\n        .pokemonOffset = -9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SHEDINJA] =\n    {\n        .categoryName = _(\"SHED\"),\n        .height = 8,\n        .weight = 12,\n        .description_FR = gShedinjaPokedexText_FR,\n        .description_LG = gShedinjaPokedexText_LG,\n        .pokemonScale = 372,\n        .pokemonOffset = -8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WHISMUR] =\n    {\n        .categoryName = _(\"WHISPER\"),\n        .height = 6,\n        .weight = 163,\n        .description_FR = gWhismurPokedexText_FR,\n        .description_LG = gWhismurPokedexText_LG,\n        .pokemonScale = 373,\n        .pokemonOffset = 16,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LOUDRED] =\n    {\n        .categoryName = _(\"BIG VOICE\"),\n        .height = 10,\n        .weight = 405,\n        .description_FR = gLoudredPokedexText_FR,\n        .description_LG = gLoudredPokedexText_LG,\n        .pokemonScale = 356,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_EXPLOUD] =\n    {\n        .categoryName = _(\"LOUD NOISE\"),\n        .height = 15,\n        .weight = 840,\n        .description_FR = gExploudPokedexText_FR,\n        .description_LG = gExploudPokedexText_LG,\n        .pokemonScale = 284,\n        .pokemonOffset = 1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MAKUHITA] =\n    {\n        .categoryName = _(\"GUTS\"),\n        .height = 10,\n        .weight = 864,\n        .description_FR = gMakuhitaPokedexText_FR,\n        .description_LG = gMakuhitaPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_HARIYAMA] =\n    {\n        .categoryName = _(\"ARM THRUST\"),\n        .height = 23,\n        .weight = 2538,\n        .description_FR = gHariyamaPokedexText_FR,\n        .description_LG = gHariyamaPokedexText_LG,\n        .pokemonScale = 268,\n        .pokemonOffset = -1,\n        .trainerScale = 375,\n        .trainerOffset = 6,\n    },\n\n    [NATIONAL_DEX_AZURILL] =\n    {\n        .categoryName = _(\"POLKA DOT\"),\n        .height = 2,\n        .weight = 20,\n        .description_FR = gAzurillPokedexText_FR,\n        .description_LG = gAzurillPokedexText_LG,\n        .pokemonScale = 603,\n        .pokemonOffset = 21,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_NOSEPASS] =\n    {\n        .categoryName = _(\"COMPASS\"),\n        .height = 10,\n        .weight = 970,\n        .description_FR = gNosepassPokedexText_FR,\n        .description_LG = gNosepassPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 9,\n        .trainerScale = 289,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_SKITTY] =\n    {\n        .categoryName = _(\"KITTEN\"),\n        .height = 6,\n        .weight = 110,\n        .description_FR = gSkittyPokedexText_FR,\n        .description_LG = gSkittyPokedexText_LG,\n        .pokemonScale = 492,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_DELCATTY] =\n    {\n        .categoryName = _(\"PRIM\"),\n        .height = 11,\n        .weight = 326,\n        .description_FR = gDelcattyPokedexText_FR,\n        .description_LG = gDelcattyPokedexText_LG,\n        .pokemonScale = 322,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SABLEYE] =\n    {\n        .categoryName = _(\"DARKNESS\"),\n        .height = 5,\n        .weight = 110,\n        .description_FR = gSableyePokedexText_FR,\n        .description_LG = gSableyePokedexText_LG,\n        .pokemonScale = 451,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MAWILE] =\n    {\n        .categoryName = _(\"DECEIVER\"),\n        .height = 6,\n        .weight = 115,\n        .description_FR = gMawilePokedexText_FR,\n        .description_LG = gMawilePokedexText_LG,\n        .pokemonScale = 466,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -3,\n    },\n\n    [NATIONAL_DEX_ARON] =\n    {\n        .categoryName = _(\"IRON ARMOR\"),\n        .height = 4,\n        .weight = 600,\n        .description_FR = gAronPokedexText_FR,\n        .description_LG = gAronPokedexText_LG,\n        .pokemonScale = 419,\n        .pokemonOffset = 21,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LAIRON] =\n    {\n        .categoryName = _(\"IRON ARMOR\"),\n        .height = 9,\n        .weight = 1200,\n        .description_FR = gLaironPokedexText_FR,\n        .description_LG = gLaironPokedexText_LG,\n        .pokemonScale = 275,\n        .pokemonOffset = 11,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_AGGRON] =\n    {\n        .categoryName = _(\"IRON ARMOR\"),\n        .height = 21,\n        .weight = 3600,\n        .description_FR = gAggronPokedexText_FR,\n        .description_LG = gAggronPokedexText_LG,\n        .pokemonScale = 274,\n        .pokemonOffset = -1,\n        .trainerScale = 374,\n        .trainerOffset = 7,\n    },\n\n    [NATIONAL_DEX_MEDITITE] =\n    {\n        .categoryName = _(\"MEDITATE\"),\n        .height = 6,\n        .weight = 112,\n        .description_FR = gMedititePokedexText_FR,\n        .description_LG = gMedititePokedexText_LG,\n        .pokemonScale = 465,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MEDICHAM] =\n    {\n        .categoryName = _(\"MEDITATE\"),\n        .height = 13,\n        .weight = 315,\n        .description_FR = gMedichamPokedexText_FR,\n        .description_LG = gMedichamPokedexText_LG,\n        .pokemonScale = 298,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ELECTRIKE] =\n    {\n        .categoryName = _(\"LIGHTNING\"),\n        .height = 6,\n        .weight = 152,\n        .description_FR = gElectrikePokedexText_FR,\n        .description_LG = gElectrikePokedexText_LG,\n        .pokemonScale = 290,\n        .pokemonOffset = 16,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MANECTRIC] =\n    {\n        .categoryName = _(\"DISCHARGE\"),\n        .height = 15,\n        .weight = 402,\n        .description_FR = gManectricPokedexText_FR,\n        .description_LG = gManectricPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 1,\n        .trainerScale = 257,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_PLUSLE] =\n    {\n        .categoryName = _(\"CHEERING\"),\n        .height = 4,\n        .weight = 42,\n        .description_FR = gPluslePokedexText_FR,\n        .description_LG = gPluslePokedexText_LG,\n        .pokemonScale = 515,\n        .pokemonOffset = -9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MINUN] =\n    {\n        .categoryName = _(\"CHEERING\"),\n        .height = 4,\n        .weight = 42,\n        .description_FR = gMinunPokedexText_FR,\n        .description_LG = gMinunPokedexText_LG,\n        .pokemonScale = 512,\n        .pokemonOffset = -7,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_VOLBEAT] =\n    {\n        .categoryName = _(\"FIREFLY\"),\n        .height = 7,\n        .weight = 177,\n        .description_FR = gVolbeatPokedexText_FR,\n        .description_LG = gVolbeatPokedexText_LG,\n        .pokemonScale = 442,\n        .pokemonOffset = -4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ILLUMISE] =\n    {\n        .categoryName = _(\"FIREFLY\"),\n        .height = 6,\n        .weight = 177,\n        .description_FR = gIllumisePokedexText_FR,\n        .description_LG = gIllumisePokedexText_LG,\n        .pokemonScale = 572,\n        .pokemonOffset = -4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ROSELIA] =\n    {\n        .categoryName = _(\"THORN\"),\n        .height = 3,\n        .weight = 20,\n        .description_FR = gRoseliaPokedexText_FR,\n        .description_LG = gRoseliaPokedexText_LG,\n        .pokemonScale = 677,\n        .pokemonOffset = 20,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GULPIN] =\n    {\n        .categoryName = _(\"STOMACH\"),\n        .height = 4,\n        .weight = 103,\n        .description_FR = gGulpinPokedexText_FR,\n        .description_LG = gGulpinPokedexText_LG,\n        .pokemonScale = 593,\n        .pokemonOffset = 22,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SWALOT] =\n    {\n        .categoryName = _(\"POISON BAG\"),\n        .height = 17,\n        .weight = 800,\n        .description_FR = gSwalotPokedexText_FR,\n        .description_LG = gSwalotPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 5,\n        .trainerScale = 345,\n        .trainerOffset = 4,\n    },\n\n    [NATIONAL_DEX_CARVANHA] =\n    {\n        .categoryName = _(\"SAVAGE\"),\n        .height = 8,\n        .weight = 208,\n        .description_FR = gCarvanhaPokedexText_FR,\n        .description_LG = gCarvanhaPokedexText_LG,\n        .pokemonScale = 362,\n        .pokemonOffset = 0,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SHARPEDO] =\n    {\n        .categoryName = _(\"BRUTAL\"),\n        .height = 18,\n        .weight = 888,\n        .description_FR = gSharpedoPokedexText_FR,\n        .description_LG = gSharpedoPokedexText_LG,\n        .pokemonScale = 265,\n        .pokemonOffset = 0,\n        .trainerScale = 342,\n        .trainerOffset = 4,\n    },\n\n    [NATIONAL_DEX_WAILMER] =\n    {\n        .categoryName = _(\"BALL WHALE\"),\n        .height = 20,\n        .weight = 1300,\n        .description_FR = gWailmerPokedexText_FR,\n        .description_LG = gWailmerPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 10,\n        .trainerScale = 493,\n        .trainerOffset = 10,\n    },\n\n    [NATIONAL_DEX_WAILORD] =\n    {\n        .categoryName = _(\"FLOAT WHALE\"),\n        .height = 145,\n        .weight = 3980,\n        .description_FR = gWailordPokedexText_FR,\n        .description_LG = gWailordPokedexText_LG,\n        .pokemonScale = 276,\n        .pokemonOffset = -1,\n        .trainerScale = 1428,\n        .trainerOffset = 20,\n    },\n\n    [NATIONAL_DEX_NUMEL] =\n    {\n        .categoryName = _(\"NUMB\"),\n        .height = 7,\n        .weight = 240,\n        .description_FR = gNumelPokedexText_FR,\n        .description_LG = gNumelPokedexText_LG,\n        .pokemonScale = 310,\n        .pokemonOffset = 14,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CAMERUPT] =\n    {\n        .categoryName = _(\"ERUPTION\"),\n        .height = 19,\n        .weight = 2200,\n        .description_FR = gCameruptPokedexText_FR,\n        .description_LG = gCameruptPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 6,\n        .trainerScale = 345,\n        .trainerOffset = 4,\n    },\n\n    [NATIONAL_DEX_TORKOAL] =\n    {\n        .categoryName = _(\"COAL\"),\n        .height = 5,\n        .weight = 804,\n        .description_FR = gTorkoalPokedexText_FR,\n        .description_LG = gTorkoalPokedexText_LG,\n        .pokemonScale = 392,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SPOINK] =\n    {\n        .categoryName = _(\"BOUNCE\"),\n        .height = 7,\n        .weight = 306,\n        .description_FR = gSpoinkPokedexText_FR,\n        .description_LG = gSpoinkPokedexText_LG,\n        .pokemonScale = 423,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GRUMPIG] =\n    {\n        .categoryName = _(\"MANIPULATE\"),\n        .height = 9,\n        .weight = 715,\n        .description_FR = gGrumpigPokedexText_FR,\n        .description_LG = gGrumpigPokedexText_LG,\n        .pokemonScale = 358,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SPINDA] =\n    {\n        .categoryName = _(\"SPOT PANDA\"),\n        .height = 11,\n        .weight = 50,\n        .description_FR = gSpindaPokedexText_FR,\n        .description_LG = gSpindaPokedexText_LG,\n        .pokemonScale = 321,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_TRAPINCH] =\n    {\n        .categoryName = _(\"ANT PIT\"),\n        .height = 7,\n        .weight = 150,\n        .description_FR = gTrapinchPokedexText_FR,\n        .description_LG = gTrapinchPokedexText_LG,\n        .pokemonScale = 298,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_VIBRAVA] =\n    {\n        .categoryName = _(\"VIBRATION\"),\n        .height = 11,\n        .weight = 153,\n        .description_FR = gVibravaPokedexText_FR,\n        .description_LG = gVibravaPokedexText_LG,\n        .pokemonScale = 370,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_FLYGON] =\n    {\n        .categoryName = _(\"MYSTIC\"),\n        .height = 20,\n        .weight = 820,\n        .description_FR = gFlygonPokedexText_FR,\n        .description_LG = gFlygonPokedexText_LG,\n        .pokemonScale = 280,\n        .pokemonOffset = 0,\n        .trainerScale = 299,\n        .trainerOffset = 2,\n    },\n\n    [NATIONAL_DEX_CACNEA] =\n    {\n        .categoryName = _(\"CACTUS\"),\n        .height = 4,\n        .weight = 513,\n        .description_FR = gCacneaPokedexText_FR,\n        .description_LG = gCacneaPokedexText_LG,\n        .pokemonScale = 455,\n        .pokemonOffset = 19,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CACTURNE] =\n    {\n        .categoryName = _(\"SCARECROW\"),\n        .height = 13,\n        .weight = 774,\n        .description_FR = gCacturnePokedexText_FR,\n        .description_LG = gCacturnePokedexText_LG,\n        .pokemonScale = 327,\n        .pokemonOffset = 3,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SWABLU] =\n    {\n        .categoryName = _(\"COTTON BIRD\"),\n        .height = 4,\n        .weight = 12,\n        .description_FR = gSwabluPokedexText_FR,\n        .description_LG = gSwabluPokedexText_LG,\n        .pokemonScale = 422,\n        .pokemonOffset = -8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ALTARIA] =\n    {\n        .categoryName = _(\"HUMMING\"),\n        .height = 11,\n        .weight = 206,\n        .description_FR = gAltariaPokedexText_FR,\n        .description_LG = gAltariaPokedexText_LG,\n        .pokemonScale = 327,\n        .pokemonOffset = 0,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ZANGOOSE] =\n    {\n        .categoryName = _(\"CAT FERRET\"),\n        .height = 13,\n        .weight = 403,\n        .description_FR = gZangoosePokedexText_FR,\n        .description_LG = gZangoosePokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SEVIPER] =\n    {\n        .categoryName = _(\"FANG SNAKE\"),\n        .height = 27,\n        .weight = 525,\n        .description_FR = gSeviperPokedexText_FR,\n        .description_LG = gSeviperPokedexText_LG,\n        .pokemonScale = 275,\n        .pokemonOffset = 6,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LUNATONE] =\n    {\n        .categoryName = _(\"METEORITE\"),\n        .height = 10,\n        .weight = 1680,\n        .description_FR = gLunatonePokedexText_FR,\n        .description_LG = gLunatonePokedexText_LG,\n        .pokemonScale = 300,\n        .pokemonOffset = 1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SOLROCK] =\n    {\n        .categoryName = _(\"METEORITE\"),\n        .height = 12,\n        .weight = 1540,\n        .description_FR = gSolrockPokedexText_FR,\n        .description_LG = gSolrockPokedexText_LG,\n        .pokemonScale = 328,\n        .pokemonOffset = -3,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_BARBOACH] =\n    {\n        .categoryName = _(\"WHISKERS\"),\n        .height = 4,\n        .weight = 19,\n        .description_FR = gBarboachPokedexText_FR,\n        .description_LG = gBarboachPokedexText_LG,\n        .pokemonScale = 581,\n        .pokemonOffset = -2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WHISCASH] =\n    {\n        .categoryName = _(\"WHISKERS\"),\n        .height = 9,\n        .weight = 236,\n        .description_FR = gWhiscashPokedexText_FR,\n        .description_LG = gWhiscashPokedexText_LG,\n        .pokemonScale = 317,\n        .pokemonOffset = 1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CORPHISH] =\n    {\n        .categoryName = _(\"RUFFIAN\"),\n        .height = 6,\n        .weight = 115,\n        .description_FR = gCorphishPokedexText_FR,\n        .description_LG = gCorphishPokedexText_LG,\n        .pokemonScale = 484,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CRAWDAUNT] =\n    {\n        .categoryName = _(\"ROGUE\"),\n        .height = 11,\n        .weight = 328,\n        .description_FR = gCrawdauntPokedexText_FR,\n        .description_LG = gCrawdauntPokedexText_LG,\n        .pokemonScale = 365,\n        .pokemonOffset = 7,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_BALTOY] =\n    {\n        .categoryName = _(\"CLAY DOLL\"),\n        .height = 5,\n        .weight = 215,\n        .description_FR = gBaltoyPokedexText_FR,\n        .description_LG = gBaltoyPokedexText_LG,\n        .pokemonScale = 384,\n        .pokemonOffset = 18,\n        .trainerScale = 256,\n        .trainerOffset = -3,\n    },\n\n    [NATIONAL_DEX_CLAYDOL] =\n    {\n        .categoryName = _(\"CLAY DOLL\"),\n        .height = 15,\n        .weight = 1080,\n        .description_FR = gClaydolPokedexText_FR,\n        .description_LG = gClaydolPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 3,\n        .trainerScale = 280,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_LILEEP] =\n    {\n        .categoryName = _(\"SEA LILY\"),\n        .height = 10,\n        .weight = 238,\n        .description_FR = gLileepPokedexText_FR,\n        .description_LG = gLileepPokedexText_LG,\n        .pokemonScale = 305,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_CRADILY] =\n    {\n        .categoryName = _(\"BARNACLE\"),\n        .height = 15,\n        .weight = 604,\n        .description_FR = gCradilyPokedexText_FR,\n        .description_LG = gCradilyPokedexText_LG,\n        .pokemonScale = 275,\n        .pokemonOffset = -1,\n        .trainerScale = 269,\n        .trainerOffset = -1,\n    },\n\n    [NATIONAL_DEX_ANORITH] =\n    {\n        .categoryName = _(\"OLD SHRIMP\"),\n        .height = 7,\n        .weight = 125,\n        .description_FR = gAnorithPokedexText_FR,\n        .description_LG = gAnorithPokedexText_LG,\n        .pokemonScale = 296,\n        .pokemonOffset = 4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ARMALDO] =\n    {\n        .categoryName = _(\"PLATE\"),\n        .height = 15,\n        .weight = 682,\n        .description_FR = gArmaldoPokedexText_FR,\n        .description_LG = gArmaldoPokedexText_LG,\n        .pokemonScale = 312,\n        .pokemonOffset = 2,\n        .trainerScale = 271,\n        .trainerOffset = -1,\n    },\n\n    [NATIONAL_DEX_FEEBAS] =\n    {\n        .categoryName = _(\"FISH\"),\n        .height = 6,\n        .weight = 74,\n        .description_FR = gFeebasPokedexText_FR,\n        .description_LG = gFeebasPokedexText_LG,\n        .pokemonScale = 423,\n        .pokemonOffset = 3,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_MILOTIC] =\n    {\n        .categoryName = _(\"TENDER\"),\n        .height = 62,\n        .weight = 1620,\n        .description_FR = gMiloticPokedexText_FR,\n        .description_LG = gMiloticPokedexText_LG,\n        .pokemonScale = 282,\n        .pokemonOffset = -1,\n        .trainerScale = 382,\n        .trainerOffset = 7,\n    },\n\n    [NATIONAL_DEX_CASTFORM] =\n    {\n        .categoryName = _(\"WEATHER\"),\n        .height = 3,\n        .weight = 8,\n        .description_FR = gCastformPokedexText_FR,\n        .description_LG = gCastformPokedexText_LG,\n        .pokemonScale = 435,\n        .pokemonOffset = -5,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_KECLEON] =\n    {\n        .categoryName = _(\"COLOR SWAP\"),\n        .height = 10,\n        .weight = 220,\n        .description_FR = gKecleonPokedexText_FR,\n        .description_LG = gKecleonPokedexText_LG,\n        .pokemonScale = 316,\n        .pokemonOffset = 8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SHUPPET] =\n    {\n        .categoryName = _(\"PUPPET\"),\n        .height = 6,\n        .weight = 23,\n        .description_FR = gShuppetPokedexText_FR,\n        .description_LG = gShuppetPokedexText_LG,\n        .pokemonScale = 440,\n        .pokemonOffset = -3,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_BANETTE] =\n    {\n        .categoryName = _(\"MARIONETTE\"),\n        .height = 11,\n        .weight = 125,\n        .description_FR = gBanettePokedexText_FR,\n        .description_LG = gBanettePokedexText_LG,\n        .pokemonScale = 262,\n        .pokemonOffset = 9,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_DUSKULL] =\n    {\n        .categoryName = _(\"REQUIEM\"),\n        .height = 8,\n        .weight = 150,\n        .description_FR = gDuskullPokedexText_FR,\n        .description_LG = gDuskullPokedexText_LG,\n        .pokemonScale = 376,\n        .pokemonOffset = 13,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_DUSCLOPS] =\n    {\n        .categoryName = _(\"BECKON\"),\n        .height = 16,\n        .weight = 306,\n        .description_FR = gDusclopsPokedexText_FR,\n        .description_LG = gDusclopsPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 2,\n        .trainerScale = 299,\n        .trainerOffset = 2,\n    },\n\n    [NATIONAL_DEX_TROPIUS] =\n    {\n        .categoryName = _(\"FRUIT\"),\n        .height = 20,\n        .weight = 1000,\n        .description_FR = gTropiusPokedexText_FR,\n        .description_LG = gTropiusPokedexText_LG,\n        .pokemonScale = 283,\n        .pokemonOffset = -1,\n        .trainerScale = 371,\n        .trainerOffset = 6,\n    },\n\n    [NATIONAL_DEX_CHIMECHO] =\n    {\n        .categoryName = _(\"WIND CHIME\"),\n        .height = 6,\n        .weight = 10,\n        .description_FR = gChimechoPokedexText_FR,\n        .description_LG = gChimechoPokedexText_LG,\n        .pokemonScale = 505,\n        .pokemonOffset = -4,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_ABSOL] =\n    {\n        .categoryName = _(\"DISASTER\"),\n        .height = 12,\n        .weight = 470,\n        .description_FR = gAbsolPokedexText_FR,\n        .description_LG = gAbsolPokedexText_LG,\n        .pokemonScale = 301,\n        .pokemonOffset = 1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WYNAUT] =\n    {\n        .categoryName = _(\"BRIGHT\"),\n        .height = 6,\n        .weight = 140,\n        .description_FR = gWynautPokedexText_FR,\n        .description_LG = gWynautPokedexText_LG,\n        .pokemonScale = 453,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SNORUNT] =\n    {\n        .categoryName = _(\"SNOW HAT\"),\n        .height = 7,\n        .weight = 168,\n        .description_FR = gSnoruntPokedexText_FR,\n        .description_LG = gSnoruntPokedexText_LG,\n        .pokemonScale = 380,\n        .pokemonOffset = 14,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GLALIE] =\n    {\n        .categoryName = _(\"FACE\"),\n        .height = 15,\n        .weight = 2565,\n        .description_FR = gGlaliePokedexText_FR,\n        .description_LG = gGlaliePokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 3,\n        .trainerScale = 344,\n        .trainerOffset = 2,\n    },\n\n    [NATIONAL_DEX_SPHEAL] =\n    {\n        .categoryName = _(\"CLAP\"),\n        .height = 8,\n        .weight = 395,\n        .description_FR = gSphealPokedexText_FR,\n        .description_LG = gSphealPokedexText_LG,\n        .pokemonScale = 315,\n        .pokemonOffset = 15,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SEALEO] =\n    {\n        .categoryName = _(\"BALL ROLL\"),\n        .height = 11,\n        .weight = 876,\n        .description_FR = gSealeoPokedexText_FR,\n        .description_LG = gSealeoPokedexText_LG,\n        .pokemonScale = 338,\n        .pokemonOffset = 12,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_WALREIN] =\n    {\n        .categoryName = _(\"ICE BREAK\"),\n        .height = 14,\n        .weight = 1506,\n        .description_FR = gWalreinPokedexText_FR,\n        .description_LG = gWalreinPokedexText_LG,\n        .pokemonScale = 305,\n        .pokemonOffset = 2,\n        .trainerScale = 277,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_CLAMPERL] =\n    {\n        .categoryName = _(\"BIVALVE\"),\n        .height = 4,\n        .weight = 525,\n        .description_FR = gClamperlPokedexText_FR,\n        .description_LG = gClamperlPokedexText_LG,\n        .pokemonScale = 691,\n        .pokemonOffset = 22,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_HUNTAIL] =\n    {\n        .categoryName = _(\"DEEP SEA\"),\n        .height = 17,\n        .weight = 270,\n        .description_FR = gHuntailPokedexText_FR,\n        .description_LG = gHuntailPokedexText_LG,\n        .pokemonScale = 307,\n        .pokemonOffset = 1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_GOREBYSS] =\n    {\n        .categoryName = _(\"SOUTH SEA\"),\n        .height = 18,\n        .weight = 226,\n        .description_FR = gGorebyssPokedexText_FR,\n        .description_LG = gGorebyssPokedexText_LG,\n        .pokemonScale = 278,\n        .pokemonOffset = 5,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_RELICANTH] =\n    {\n        .categoryName = _(\"LONGEVITY\"),\n        .height = 10,\n        .weight = 234,\n        .description_FR = gRelicanthPokedexText_FR,\n        .description_LG = gRelicanthPokedexText_LG,\n        .pokemonScale = 316,\n        .pokemonOffset = 5,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LUVDISC] =\n    {\n        .categoryName = _(\"RENDEZVOUS\"),\n        .height = 6,\n        .weight = 87,\n        .description_FR = gLuvdiscPokedexText_FR,\n        .description_LG = gLuvdiscPokedexText_LG,\n        .pokemonScale = 371,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_BAGON] =\n    {\n        .categoryName = _(\"ROCK HEAD\"),\n        .height = 6,\n        .weight = 421,\n        .description_FR = gBagonPokedexText_FR,\n        .description_LG = gBagonPokedexText_LG,\n        .pokemonScale = 448,\n        .pokemonOffset = 17,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SHELGON] =\n    {\n        .categoryName = _(\"ENDURANCE\"),\n        .height = 11,\n        .weight = 1105,\n        .description_FR = gShelgonPokedexText_FR,\n        .description_LG = gShelgonPokedexText_LG,\n        .pokemonScale = 311,\n        .pokemonOffset = 10,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_SALAMENCE] =\n    {\n        .categoryName = _(\"DRAGON\"),\n        .height = 15,\n        .weight = 1026,\n        .description_FR = gSalamencePokedexText_FR,\n        .description_LG = gSalamencePokedexText_LG,\n        .pokemonScale = 272,\n        .pokemonOffset = 2,\n        .trainerScale = 307,\n        .trainerOffset = 0,\n    },\n\n    [NATIONAL_DEX_BELDUM] =\n    {\n        .categoryName = _(\"IRON BALL\"),\n        .height = 6,\n        .weight = 952,\n        .description_FR = gBeldumPokedexText_FR,\n        .description_LG = gBeldumPokedexText_LG,\n        .pokemonScale = 414,\n        .pokemonOffset = -1,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_METANG] =\n    {\n        .categoryName = _(\"IRON CLAW\"),\n        .height = 12,\n        .weight = 2025,\n        .description_FR = gMetangPokedexText_FR,\n        .description_LG = gMetangPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 3,\n        .trainerScale = 272,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_METAGROSS] =\n    {\n        .categoryName = _(\"IRON LEG\"),\n        .height = 16,\n        .weight = 5500,\n        .description_FR = gMetagrossPokedexText_FR,\n        .description_LG = gMetagrossPokedexText_LG,\n        .pokemonScale = 272,\n        .pokemonOffset = 3,\n        .trainerScale = 461,\n        .trainerOffset = 4,\n    },\n\n    [NATIONAL_DEX_REGIROCK] =\n    {\n        .categoryName = _(\"ROCK PEAK\"),\n        .height = 17,\n        .weight = 2300,\n        .description_FR = gRegirockPokedexText_FR,\n        .description_LG = gRegirockPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 1,\n        .trainerScale = 309,\n        .trainerOffset = 1,\n    },\n\n    [NATIONAL_DEX_REGICE] =\n    {\n        .categoryName = _(\"ICEBERG\"),\n        .height = 18,\n        .weight = 1750,\n        .description_FR = gRegicePokedexText_FR,\n        .description_LG = gRegicePokedexText_LG,\n        .pokemonScale = 265,\n        .pokemonOffset = 0,\n        .trainerScale = 317,\n        .trainerOffset = 3,\n    },\n\n    [NATIONAL_DEX_REGISTEEL] =\n    {\n        .categoryName = _(\"IRON\"),\n        .height = 19,\n        .weight = 2050,\n        .description_FR = gRegisteelPokedexText_FR,\n        .description_LG = gRegisteelPokedexText_LG,\n        .pokemonScale = 256,\n        .pokemonOffset = 0,\n        .trainerScale = 359,\n        .trainerOffset = 6,\n    },\n\n    [NATIONAL_DEX_LATIAS] =\n    {\n        .categoryName = _(\"EON\"),\n        .height = 14,\n        .weight = 400,\n        .description_FR = gLatiasPokedexText_FR,\n        .description_LG = gLatiasPokedexText_LG,\n        .pokemonScale = 291,\n        .pokemonOffset = 2,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_LATIOS] =\n    {\n        .categoryName = _(\"EON\"),\n        .height = 20,\n        .weight = 600,\n        .description_FR = gLatiosPokedexText_FR,\n        .description_LG = gLatiosPokedexText_LG,\n        .pokemonScale = 273,\n        .pokemonOffset = 0,\n        .trainerScale = 313,\n        .trainerOffset = 3,\n    },\n\n    [NATIONAL_DEX_KYOGRE] =\n    {\n        .categoryName = _(\"SEA BASIN\"),\n        .height = 45,\n        .weight = 3520,\n        .description_FR = gKyogrePokedexText_FR,\n        .description_LG = gKyogrePokedexText_LG,\n        .pokemonScale = 272,\n        .pokemonOffset = 1,\n        .trainerScale = 639,\n        .trainerOffset = 13,\n    },\n\n    [NATIONAL_DEX_GROUDON] =\n    {\n        .categoryName = _(\"CONTINENT\"),\n        .height = 35,\n        .weight = 9500,\n        .description_FR = gGroudonPokedexText_FR,\n        .description_LG = gGroudonPokedexText_LG,\n        .pokemonScale = 276,\n        .pokemonOffset = 0,\n        .trainerScale = 530,\n        .trainerOffset = 12,\n    },\n\n    [NATIONAL_DEX_RAYQUAZA] =\n    {\n        .categoryName = _(\"SKY HIGH\"),\n        .height = 70,\n        .weight = 2065,\n        .description_FR = gRayquazaPokedexText_FR,\n        .description_LG = gRayquazaPokedexText_LG,\n        .pokemonScale = 286,\n        .pokemonOffset = -1,\n        .trainerScale = 483,\n        .trainerOffset = 9,\n    },\n\n    [NATIONAL_DEX_JIRACHI] =\n    {\n        .categoryName = _(\"WISH\"),\n        .height = 3,\n        .weight = 11,\n        .description_FR = gJirachiPokedexText_FR,\n        .description_LG = gJirachiPokedexText_LG,\n        .pokemonScale = 608,\n        .pokemonOffset = -8,\n        .trainerScale = 256,\n        .trainerOffset = -2,\n    },\n\n    [NATIONAL_DEX_DEOXYS] =\n    {\n        .categoryName = _(\"DNA\"),\n        .height = 17,\n        .weight = 608,\n        .description_FR = gDeoxysPokedexText_FR,\n        .description_LG = gDeoxysPokedexText_LG,\n        .pokemonScale = 293,\n        .pokemonOffset = 0,\n        .trainerScale = 337,\n        .trainerOffset = 2,\n    },\n};\n"
  },
  {
    "path": "src/data/pokemon/pokedex_orders.h",
    "content": "const u16 gPokedexOrder_Alphabetical[] =\n{\n    NATIONAL_DEX_OLD_UNOWN_B,\n    NATIONAL_DEX_OLD_UNOWN_C,\n    NATIONAL_DEX_OLD_UNOWN_D,\n    NATIONAL_DEX_OLD_UNOWN_E,\n    NATIONAL_DEX_OLD_UNOWN_F,\n    NATIONAL_DEX_OLD_UNOWN_G,\n    NATIONAL_DEX_OLD_UNOWN_H,\n    NATIONAL_DEX_OLD_UNOWN_I,\n    NATIONAL_DEX_OLD_UNOWN_J,\n    NATIONAL_DEX_OLD_UNOWN_K,\n    NATIONAL_DEX_OLD_UNOWN_L,\n    NATIONAL_DEX_OLD_UNOWN_M,\n    NATIONAL_DEX_OLD_UNOWN_N,\n    NATIONAL_DEX_OLD_UNOWN_O,\n    NATIONAL_DEX_OLD_UNOWN_P,\n    NATIONAL_DEX_OLD_UNOWN_Q,\n    NATIONAL_DEX_OLD_UNOWN_R,\n    NATIONAL_DEX_OLD_UNOWN_S,\n    NATIONAL_DEX_OLD_UNOWN_T,\n    NATIONAL_DEX_OLD_UNOWN_U,\n    NATIONAL_DEX_OLD_UNOWN_V,\n    NATIONAL_DEX_OLD_UNOWN_W,\n    NATIONAL_DEX_OLD_UNOWN_X,\n    NATIONAL_DEX_OLD_UNOWN_Y,\n    NATIONAL_DEX_OLD_UNOWN_Z,\n    // Actual pokemon start here.\n    NATIONAL_DEX_ABRA,\n    NATIONAL_DEX_ABSOL,\n    NATIONAL_DEX_AERODACTYL,\n    NATIONAL_DEX_AGGRON,\n    NATIONAL_DEX_AIPOM,\n    NATIONAL_DEX_ALAKAZAM,\n    NATIONAL_DEX_ALTARIA,\n    NATIONAL_DEX_AMPHAROS,\n    NATIONAL_DEX_ANORITH,\n    NATIONAL_DEX_ARBOK,\n    NATIONAL_DEX_ARCANINE,\n    NATIONAL_DEX_ARIADOS,\n    NATIONAL_DEX_ARMALDO,\n    NATIONAL_DEX_ARON,\n    NATIONAL_DEX_ARTICUNO,\n    NATIONAL_DEX_AZUMARILL,\n    NATIONAL_DEX_AZURILL,\n    NATIONAL_DEX_BAGON,\n    NATIONAL_DEX_BALTOY,\n    NATIONAL_DEX_BANETTE,\n    NATIONAL_DEX_BARBOACH,\n    NATIONAL_DEX_BAYLEEF,\n    NATIONAL_DEX_BEAUTIFLY,\n    NATIONAL_DEX_BEEDRILL,\n    NATIONAL_DEX_BELDUM,\n    NATIONAL_DEX_BELLOSSOM,\n    NATIONAL_DEX_BELLSPROUT,\n    NATIONAL_DEX_BLASTOISE,\n    NATIONAL_DEX_BLAZIKEN,\n    NATIONAL_DEX_BLISSEY,\n    NATIONAL_DEX_BRELOOM,\n    NATIONAL_DEX_BULBASAUR,\n    NATIONAL_DEX_BUTTERFREE,\n    NATIONAL_DEX_CACNEA,\n    NATIONAL_DEX_CACTURNE,\n    NATIONAL_DEX_CAMERUPT,\n    NATIONAL_DEX_CARVANHA,\n    NATIONAL_DEX_CASCOON,\n    NATIONAL_DEX_CASTFORM,\n    NATIONAL_DEX_CATERPIE,\n    NATIONAL_DEX_CELEBI,\n    NATIONAL_DEX_CHANSEY,\n    NATIONAL_DEX_CHARIZARD,\n    NATIONAL_DEX_CHARMANDER,\n    NATIONAL_DEX_CHARMELEON,\n    NATIONAL_DEX_CHIKORITA,\n    NATIONAL_DEX_CHIMECHO,\n    NATIONAL_DEX_CHINCHOU,\n    NATIONAL_DEX_CLAMPERL,\n    NATIONAL_DEX_CLAYDOL,\n    NATIONAL_DEX_CLEFABLE,\n    NATIONAL_DEX_CLEFAIRY,\n    NATIONAL_DEX_CLEFFA,\n    NATIONAL_DEX_CLOYSTER,\n    NATIONAL_DEX_COMBUSKEN,\n    NATIONAL_DEX_CORPHISH,\n    NATIONAL_DEX_CORSOLA,\n    NATIONAL_DEX_CRADILY,\n    NATIONAL_DEX_CRAWDAUNT,\n    NATIONAL_DEX_CROBAT,\n    NATIONAL_DEX_CROCONAW,\n    NATIONAL_DEX_CUBONE,\n    NATIONAL_DEX_CYNDAQUIL,\n    NATIONAL_DEX_DELCATTY,\n    NATIONAL_DEX_DELIBIRD,\n    NATIONAL_DEX_DEOXYS,\n    NATIONAL_DEX_DEWGONG,\n    NATIONAL_DEX_DIGLETT,\n    NATIONAL_DEX_DITTO,\n    NATIONAL_DEX_DODRIO,\n    NATIONAL_DEX_DODUO,\n    NATIONAL_DEX_DONPHAN,\n    NATIONAL_DEX_DRAGONAIR,\n    NATIONAL_DEX_DRAGONITE,\n    NATIONAL_DEX_DRATINI,\n    NATIONAL_DEX_DROWZEE,\n    NATIONAL_DEX_DUGTRIO,\n    NATIONAL_DEX_DUNSPARCE,\n    NATIONAL_DEX_DUSCLOPS,\n    NATIONAL_DEX_DUSKULL,\n    NATIONAL_DEX_DUSTOX,\n    NATIONAL_DEX_EEVEE,\n    NATIONAL_DEX_EKANS,\n    NATIONAL_DEX_ELECTABUZZ,\n    NATIONAL_DEX_ELECTRIKE,\n    NATIONAL_DEX_ELECTRODE,\n    NATIONAL_DEX_ELEKID,\n    NATIONAL_DEX_ENTEI,\n    NATIONAL_DEX_ESPEON,\n    NATIONAL_DEX_EXEGGCUTE,\n    NATIONAL_DEX_EXEGGUTOR,\n    NATIONAL_DEX_EXPLOUD,\n    NATIONAL_DEX_FARFETCHD,\n    NATIONAL_DEX_FEAROW,\n    NATIONAL_DEX_FEEBAS,\n    NATIONAL_DEX_FERALIGATR,\n    NATIONAL_DEX_FLAAFFY,\n    NATIONAL_DEX_FLAREON,\n    NATIONAL_DEX_FLYGON,\n    NATIONAL_DEX_FORRETRESS,\n    NATIONAL_DEX_FURRET,\n    NATIONAL_DEX_GARDEVOIR,\n    NATIONAL_DEX_GASTLY,\n    NATIONAL_DEX_GENGAR,\n    NATIONAL_DEX_GEODUDE,\n    NATIONAL_DEX_GIRAFARIG,\n    NATIONAL_DEX_GLALIE,\n    NATIONAL_DEX_GLIGAR,\n    NATIONAL_DEX_GLOOM,\n    NATIONAL_DEX_GOLBAT,\n    NATIONAL_DEX_GOLDEEN,\n    NATIONAL_DEX_GOLDUCK,\n    NATIONAL_DEX_GOLEM,\n    NATIONAL_DEX_GOREBYSS,\n    NATIONAL_DEX_GRANBULL,\n    NATIONAL_DEX_GRAVELER,\n    NATIONAL_DEX_GRIMER,\n    NATIONAL_DEX_GROUDON,\n    NATIONAL_DEX_GROVYLE,\n    NATIONAL_DEX_GROWLITHE,\n    NATIONAL_DEX_GRUMPIG,\n    NATIONAL_DEX_GULPIN,\n    NATIONAL_DEX_GYARADOS,\n    NATIONAL_DEX_HARIYAMA,\n    NATIONAL_DEX_HAUNTER,\n    NATIONAL_DEX_HERACROSS,\n    NATIONAL_DEX_HITMONCHAN,\n    NATIONAL_DEX_HITMONLEE,\n    NATIONAL_DEX_HITMONTOP,\n    NATIONAL_DEX_HO_OH,\n    NATIONAL_DEX_HOOTHOOT,\n    NATIONAL_DEX_HOPPIP,\n    NATIONAL_DEX_HORSEA,\n    NATIONAL_DEX_HOUNDOOM,\n    NATIONAL_DEX_HOUNDOUR,\n    NATIONAL_DEX_HUNTAIL,\n    NATIONAL_DEX_HYPNO,\n    NATIONAL_DEX_IGGLYBUFF,\n    NATIONAL_DEX_ILLUMISE,\n    NATIONAL_DEX_IVYSAUR,\n    NATIONAL_DEX_JIGGLYPUFF,\n    NATIONAL_DEX_JIRACHI,\n    NATIONAL_DEX_JOLTEON,\n    NATIONAL_DEX_JUMPLUFF,\n    NATIONAL_DEX_JYNX,\n    NATIONAL_DEX_KABUTO,\n    NATIONAL_DEX_KABUTOPS,\n    NATIONAL_DEX_KADABRA,\n    NATIONAL_DEX_KAKUNA,\n    NATIONAL_DEX_KANGASKHAN,\n    NATIONAL_DEX_KECLEON,\n    NATIONAL_DEX_KINGDRA,\n    NATIONAL_DEX_KINGLER,\n    NATIONAL_DEX_KIRLIA,\n    NATIONAL_DEX_KOFFING,\n    NATIONAL_DEX_KRABBY,\n    NATIONAL_DEX_KYOGRE,\n    NATIONAL_DEX_LAIRON,\n    NATIONAL_DEX_LANTURN,\n    NATIONAL_DEX_LAPRAS,\n    NATIONAL_DEX_LARVITAR,\n    NATIONAL_DEX_LATIAS,\n    NATIONAL_DEX_LATIOS,\n    NATIONAL_DEX_LEDIAN,\n    NATIONAL_DEX_LEDYBA,\n    NATIONAL_DEX_LICKITUNG,\n    NATIONAL_DEX_LILEEP,\n    NATIONAL_DEX_LINOONE,\n    NATIONAL_DEX_LOMBRE,\n    NATIONAL_DEX_LOTAD,\n    NATIONAL_DEX_LOUDRED,\n    NATIONAL_DEX_LUDICOLO,\n    NATIONAL_DEX_LUGIA,\n    NATIONAL_DEX_LUNATONE,\n    NATIONAL_DEX_LUVDISC,\n    NATIONAL_DEX_MACHAMP,\n    NATIONAL_DEX_MACHOKE,\n    NATIONAL_DEX_MACHOP,\n    NATIONAL_DEX_MAGBY,\n    NATIONAL_DEX_MAGCARGO,\n    NATIONAL_DEX_MAGIKARP,\n    NATIONAL_DEX_MAGMAR,\n    NATIONAL_DEX_MAGNEMITE,\n    NATIONAL_DEX_MAGNETON,\n    NATIONAL_DEX_MAKUHITA,\n    NATIONAL_DEX_MANECTRIC,\n    NATIONAL_DEX_MANKEY,\n    NATIONAL_DEX_MANTINE,\n    NATIONAL_DEX_MAREEP,\n    NATIONAL_DEX_MARILL,\n    NATIONAL_DEX_MAROWAK,\n    NATIONAL_DEX_MARSHTOMP,\n    NATIONAL_DEX_MASQUERAIN,\n    NATIONAL_DEX_MAWILE,\n    NATIONAL_DEX_MEDICHAM,\n    NATIONAL_DEX_MEDITITE,\n    NATIONAL_DEX_MEGANIUM,\n    NATIONAL_DEX_MEOWTH,\n    NATIONAL_DEX_METAGROSS,\n    NATIONAL_DEX_METANG,\n    NATIONAL_DEX_METAPOD,\n    NATIONAL_DEX_MEW,\n    NATIONAL_DEX_MEWTWO,\n    NATIONAL_DEX_MIGHTYENA,\n    NATIONAL_DEX_MILOTIC,\n    NATIONAL_DEX_MILTANK,\n    NATIONAL_DEX_MINUN,\n    NATIONAL_DEX_MISDREAVUS,\n    NATIONAL_DEX_MOLTRES,\n    NATIONAL_DEX_MR_MIME,\n    NATIONAL_DEX_MUDKIP,\n    NATIONAL_DEX_MUK,\n    NATIONAL_DEX_MURKROW,\n    NATIONAL_DEX_NATU,\n    NATIONAL_DEX_NIDOKING,\n    NATIONAL_DEX_NIDOQUEEN,\n    NATIONAL_DEX_NIDORAN_F,\n    NATIONAL_DEX_NIDORAN_M,\n    NATIONAL_DEX_NIDORINA,\n    NATIONAL_DEX_NIDORINO,\n    NATIONAL_DEX_NINCADA,\n    NATIONAL_DEX_NINETALES,\n    NATIONAL_DEX_NINJASK,\n    NATIONAL_DEX_NOCTOWL,\n    NATIONAL_DEX_NOSEPASS,\n    NATIONAL_DEX_NUMEL,\n    NATIONAL_DEX_NUZLEAF,\n    NATIONAL_DEX_OCTILLERY,\n    NATIONAL_DEX_ODDISH,\n    NATIONAL_DEX_OMANYTE,\n    NATIONAL_DEX_OMASTAR,\n    NATIONAL_DEX_ONIX,\n    NATIONAL_DEX_PARAS,\n    NATIONAL_DEX_PARASECT,\n    NATIONAL_DEX_PELIPPER,\n    NATIONAL_DEX_PERSIAN,\n    NATIONAL_DEX_PHANPY,\n    NATIONAL_DEX_PICHU,\n    NATIONAL_DEX_PIDGEOT,\n    NATIONAL_DEX_PIDGEOTTO,\n    NATIONAL_DEX_PIDGEY,\n    NATIONAL_DEX_PIKACHU,\n    NATIONAL_DEX_PILOSWINE,\n    NATIONAL_DEX_PINECO,\n    NATIONAL_DEX_PINSIR,\n    NATIONAL_DEX_PLUSLE,\n    NATIONAL_DEX_POLITOED,\n    NATIONAL_DEX_POLIWAG,\n    NATIONAL_DEX_POLIWHIRL,\n    NATIONAL_DEX_POLIWRATH,\n    NATIONAL_DEX_PONYTA,\n    NATIONAL_DEX_POOCHYENA,\n    NATIONAL_DEX_PORYGON,\n    NATIONAL_DEX_PORYGON2,\n    NATIONAL_DEX_PRIMEAPE,\n    NATIONAL_DEX_PSYDUCK,\n    NATIONAL_DEX_PUPITAR,\n    NATIONAL_DEX_QUAGSIRE,\n    NATIONAL_DEX_QUILAVA,\n    NATIONAL_DEX_QWILFISH,\n    NATIONAL_DEX_RAICHU,\n    NATIONAL_DEX_RAIKOU,\n    NATIONAL_DEX_RALTS,\n    NATIONAL_DEX_RAPIDASH,\n    NATIONAL_DEX_RATICATE,\n    NATIONAL_DEX_RATTATA,\n    NATIONAL_DEX_RAYQUAZA,\n    NATIONAL_DEX_REGICE,\n    NATIONAL_DEX_REGIROCK,\n    NATIONAL_DEX_REGISTEEL,\n    NATIONAL_DEX_RELICANTH,\n    NATIONAL_DEX_REMORAID,\n    NATIONAL_DEX_RHYDON,\n    NATIONAL_DEX_RHYHORN,\n    NATIONAL_DEX_ROSELIA,\n    NATIONAL_DEX_SABLEYE,\n    NATIONAL_DEX_SALAMENCE,\n    NATIONAL_DEX_SANDSHREW,\n    NATIONAL_DEX_SANDSLASH,\n    NATIONAL_DEX_SCEPTILE,\n    NATIONAL_DEX_SCIZOR,\n    NATIONAL_DEX_SCYTHER,\n    NATIONAL_DEX_SEADRA,\n    NATIONAL_DEX_SEAKING,\n    NATIONAL_DEX_SEALEO,\n    NATIONAL_DEX_SEEDOT,\n    NATIONAL_DEX_SEEL,\n    NATIONAL_DEX_SENTRET,\n    NATIONAL_DEX_SEVIPER,\n    NATIONAL_DEX_SHARPEDO,\n    NATIONAL_DEX_SHEDINJA,\n    NATIONAL_DEX_SHELGON,\n    NATIONAL_DEX_SHELLDER,\n    NATIONAL_DEX_SHIFTRY,\n    NATIONAL_DEX_SHROOMISH,\n    NATIONAL_DEX_SHUCKLE,\n    NATIONAL_DEX_SHUPPET,\n    NATIONAL_DEX_SILCOON,\n    NATIONAL_DEX_SKARMORY,\n    NATIONAL_DEX_SKIPLOOM,\n    NATIONAL_DEX_SKITTY,\n    NATIONAL_DEX_SLAKING,\n    NATIONAL_DEX_SLAKOTH,\n    NATIONAL_DEX_SLOWBRO,\n    NATIONAL_DEX_SLOWKING,\n    NATIONAL_DEX_SLOWPOKE,\n    NATIONAL_DEX_SLUGMA,\n    NATIONAL_DEX_SMEARGLE,\n    NATIONAL_DEX_SMOOCHUM,\n    NATIONAL_DEX_SNEASEL,\n    NATIONAL_DEX_SNORLAX,\n    NATIONAL_DEX_SNORUNT,\n    NATIONAL_DEX_SNUBBULL,\n    NATIONAL_DEX_SOLROCK,\n    NATIONAL_DEX_SPEAROW,\n    NATIONAL_DEX_SPHEAL,\n    NATIONAL_DEX_SPINARAK,\n    NATIONAL_DEX_SPINDA,\n    NATIONAL_DEX_SPOINK,\n    NATIONAL_DEX_SQUIRTLE,\n    NATIONAL_DEX_STANTLER,\n    NATIONAL_DEX_STARMIE,\n    NATIONAL_DEX_STARYU,\n    NATIONAL_DEX_STEELIX,\n    NATIONAL_DEX_SUDOWOODO,\n    NATIONAL_DEX_SUICUNE,\n    NATIONAL_DEX_SUNFLORA,\n    NATIONAL_DEX_SUNKERN,\n    NATIONAL_DEX_SURSKIT,\n    NATIONAL_DEX_SWABLU,\n    NATIONAL_DEX_SWALOT,\n    NATIONAL_DEX_SWAMPERT,\n    NATIONAL_DEX_SWELLOW,\n    NATIONAL_DEX_SWINUB,\n    NATIONAL_DEX_TAILLOW,\n    NATIONAL_DEX_TANGELA,\n    NATIONAL_DEX_TAUROS,\n    NATIONAL_DEX_TEDDIURSA,\n    NATIONAL_DEX_TENTACOOL,\n    NATIONAL_DEX_TENTACRUEL,\n    NATIONAL_DEX_TOGEPI,\n    NATIONAL_DEX_TOGETIC,\n    NATIONAL_DEX_TORCHIC,\n    NATIONAL_DEX_TORKOAL,\n    NATIONAL_DEX_TOTODILE,\n    NATIONAL_DEX_TRAPINCH,\n    NATIONAL_DEX_TREECKO,\n    NATIONAL_DEX_TROPIUS,\n    NATIONAL_DEX_TYPHLOSION,\n    NATIONAL_DEX_TYRANITAR,\n    NATIONAL_DEX_TYROGUE,\n    NATIONAL_DEX_UMBREON,\n    NATIONAL_DEX_UNOWN,\n    NATIONAL_DEX_URSARING,\n    NATIONAL_DEX_VAPOREON,\n    NATIONAL_DEX_VENOMOTH,\n    NATIONAL_DEX_VENONAT,\n    NATIONAL_DEX_VENUSAUR,\n    NATIONAL_DEX_VIBRAVA,\n    NATIONAL_DEX_VICTREEBEL,\n    NATIONAL_DEX_VIGOROTH,\n    NATIONAL_DEX_VILEPLUME,\n    NATIONAL_DEX_VOLBEAT,\n    NATIONAL_DEX_VOLTORB,\n    NATIONAL_DEX_VULPIX,\n    NATIONAL_DEX_WAILMER,\n    NATIONAL_DEX_WAILORD,\n    NATIONAL_DEX_WALREIN,\n    NATIONAL_DEX_WARTORTLE,\n    NATIONAL_DEX_WEEDLE,\n    NATIONAL_DEX_WEEPINBELL,\n    NATIONAL_DEX_WEEZING,\n    NATIONAL_DEX_WHISCASH,\n    NATIONAL_DEX_WHISMUR,\n    NATIONAL_DEX_WIGGLYTUFF,\n    NATIONAL_DEX_WINGULL,\n    NATIONAL_DEX_WOBBUFFET,\n    NATIONAL_DEX_WOOPER,\n    NATIONAL_DEX_WURMPLE,\n    NATIONAL_DEX_WYNAUT,\n    NATIONAL_DEX_XATU,\n    NATIONAL_DEX_YANMA,\n    NATIONAL_DEX_ZANGOOSE,\n    NATIONAL_DEX_ZAPDOS,\n    NATIONAL_DEX_ZIGZAGOON,\n    NATIONAL_DEX_ZUBAT\n};\n\nconst u16 gPokedexOrder_Weight[] =\n{\n    NATIONAL_DEX_GASTLY,\n    NATIONAL_DEX_HAUNTER,\n    NATIONAL_DEX_HOPPIP,\n    NATIONAL_DEX_DIGLETT,\n    NATIONAL_DEX_CASTFORM,\n    NATIONAL_DEX_KOFFING,\n    NATIONAL_DEX_IGGLYBUFF,\n    NATIONAL_DEX_MISDREAVUS,\n    NATIONAL_DEX_CHIMECHO,\n    NATIONAL_DEX_SKIPLOOM,\n    NATIONAL_DEX_JIRACHI,\n    NATIONAL_DEX_SWABLU,\n    NATIONAL_DEX_SHEDINJA,\n    NATIONAL_DEX_TOGEPI,\n    NATIONAL_DEX_SURSKIT,\n    NATIONAL_DEX_PIDGEY,\n    NATIONAL_DEX_SUNKERN,\n    NATIONAL_DEX_BARBOACH,\n    NATIONAL_DEX_PICHU,\n    NATIONAL_DEX_AZURILL,\n    NATIONAL_DEX_ROSELIA,\n    NATIONAL_DEX_NATU,\n    NATIONAL_DEX_SPEAROW,\n    NATIONAL_DEX_MURKROW,\n    NATIONAL_DEX_SHUPPET,\n    NATIONAL_DEX_TAILLOW,\n    NATIONAL_DEX_EXEGGCUTE,\n    NATIONAL_DEX_TORCHIC,\n    NATIONAL_DEX_LOTAD,\n    NATIONAL_DEX_CATERPIE,\n    NATIONAL_DEX_JUMPLUFF,\n    NATIONAL_DEX_CLEFFA,\n    NATIONAL_DEX_WEEDLE,\n    NATIONAL_DEX_TOGETIC,\n    NATIONAL_DEX_DRATINI,\n    NATIONAL_DEX_RATTATA,\n    NATIONAL_DEX_MASQUERAIN,\n    NATIONAL_DEX_WURMPLE,\n    NATIONAL_DEX_QWILFISH,\n    NATIONAL_DEX_MEW,\n    NATIONAL_DEX_SHELLDER,\n    NATIONAL_DEX_SEEDOT,\n    NATIONAL_DEX_DITTO,\n    NATIONAL_DEX_BELLSPROUT,\n    NATIONAL_DEX_PLUSLE,\n    NATIONAL_DEX_MEOWTH,\n    NATIONAL_DEX_MINUN,\n    NATIONAL_DEX_SHROOMISH,\n    NATIONAL_DEX_CELEBI,\n    NATIONAL_DEX_CORSOLA,\n    NATIONAL_DEX_TREECKO,\n    NATIONAL_DEX_SPINDA,\n    NATIONAL_DEX_UNOWN,\n    NATIONAL_DEX_PARAS,\n    NATIONAL_DEX_ODDISH,\n    NATIONAL_DEX_JIGGLYPUFF,\n    NATIONAL_DEX_NINCADA,\n    NATIONAL_DEX_BELLOSSOM,\n    NATIONAL_DEX_MAGNEMITE,\n    NATIONAL_DEX_PIKACHU,\n    NATIONAL_DEX_SMOOCHUM,\n    NATIONAL_DEX_SENTRET,\n    NATIONAL_DEX_WEEPINBELL,\n    NATIONAL_DEX_CHIKORITA,\n    NATIONAL_DEX_SWINUB,\n    NATIONAL_DEX_EEVEE,\n    NATIONAL_DEX_KRABBY,\n    NATIONAL_DEX_CUBONE,\n    NATIONAL_DEX_RALTS,\n    NATIONAL_DEX_BULBASAUR,\n    NATIONAL_DEX_EKANS,\n    NATIONAL_DEX_NIDORAN_F,\n    NATIONAL_DEX_PINECO,\n    NATIONAL_DEX_FEEBAS,\n    NATIONAL_DEX_OMANYTE,\n    NATIONAL_DEX_ZUBAT,\n    NATIONAL_DEX_CLEFAIRY,\n    NATIONAL_DEX_MUDKIP,\n    NATIONAL_DEX_SNUBBULL,\n    NATIONAL_DEX_MAREEP,\n    NATIONAL_DEX_CYNDAQUIL,\n    NATIONAL_DEX_HORSEA,\n    NATIONAL_DEX_CHARMANDER,\n    NATIONAL_DEX_SUNFLORA,\n    NATIONAL_DEX_MARILL,\n    NATIONAL_DEX_WOOPER,\n    NATIONAL_DEX_SPINARAK,\n    NATIONAL_DEX_GLOOM,\n    NATIONAL_DEX_LUVDISC,\n    NATIONAL_DEX_TEDDIURSA,\n    NATIONAL_DEX_NIDORAN_M,\n    NATIONAL_DEX_SQUIRTLE,\n    NATIONAL_DEX_WINGULL,\n    NATIONAL_DEX_TOTODILE,\n    NATIONAL_DEX_WEEZING,\n    NATIONAL_DEX_VULPIX,\n    NATIONAL_DEX_METAPOD,\n    NATIONAL_DEX_SILCOON,\n    NATIONAL_DEX_MAGIKARP,\n    NATIONAL_DEX_KAKUNA,\n    NATIONAL_DEX_GULPIN,\n    NATIONAL_DEX_VOLTORB,\n    NATIONAL_DEX_LEDYBA,\n    NATIONAL_DEX_HOUNDOUR,\n    NATIONAL_DEX_SKITTY,\n    NATIONAL_DEX_SABLEYE,\n    NATIONAL_DEX_MEDITITE,\n    NATIONAL_DEX_CORPHISH,\n    NATIONAL_DEX_AIPOM,\n    NATIONAL_DEX_CASCOON,\n    NATIONAL_DEX_MAWILE,\n    NATIONAL_DEX_KABUTO,\n    NATIONAL_DEX_WIGGLYTUFF,\n    NATIONAL_DEX_SANDSHREW,\n    NATIONAL_DEX_REMORAID,\n    NATIONAL_DEX_NINJASK,\n    NATIONAL_DEX_CHINCHOU,\n    NATIONAL_DEX_POLIWAG,\n    NATIONAL_DEX_ANORITH,\n    NATIONAL_DEX_VENOMOTH,\n    NATIONAL_DEX_BANETTE,\n    NATIONAL_DEX_IVYSAUR,\n    NATIONAL_DEX_FLAAFFY,\n    NATIONAL_DEX_POOCHYENA,\n    NATIONAL_DEX_WYNAUT,\n    NATIONAL_DEX_DUNSPARCE,\n    NATIONAL_DEX_XATU,\n    NATIONAL_DEX_DUSKULL,\n    NATIONAL_DEX_FARFETCHD,\n    NATIONAL_DEX_TRAPINCH,\n    NATIONAL_DEX_GOLDEEN,\n    NATIONAL_DEX_ELECTRIKE,\n    NATIONAL_DEX_VIBRAVA,\n    NATIONAL_DEX_VICTREEBEL,\n    NATIONAL_DEX_BAYLEEF,\n    NATIONAL_DEX_DELIBIRD,\n    NATIONAL_DEX_WHISMUR,\n    NATIONAL_DEX_DRAGONAIR,\n    NATIONAL_DEX_SNORUNT,\n    NATIONAL_DEX_ZIGZAGOON,\n    NATIONAL_DEX_ILLUMISE,\n    NATIONAL_DEX_VOLBEAT,\n    NATIONAL_DEX_RATICATE,\n    NATIONAL_DEX_VILEPLUME,\n    NATIONAL_DEX_QUILAVA,\n    NATIONAL_DEX_CHARMELEON,\n    NATIONAL_DEX_GROWLITHE,\n    NATIONAL_DEX_COMBUSKEN,\n    NATIONAL_DEX_MACHOP,\n    NATIONAL_DEX_ABRA,\n    NATIONAL_DEX_NIDORINO,\n    NATIONAL_DEX_PSYDUCK,\n    NATIONAL_DEX_SWELLOW,\n    NATIONAL_DEX_NINETALES,\n    NATIONAL_DEX_NIDORINA,\n    NATIONAL_DEX_POLIWHIRL,\n    NATIONAL_DEX_GEODUDE,\n    NATIONAL_DEX_KIRLIA,\n    NATIONAL_DEX_SHUCKLE,\n    NATIONAL_DEX_ALTARIA,\n    NATIONAL_DEX_CARVANHA,\n    NATIONAL_DEX_TYROGUE,\n    NATIONAL_DEX_HOOTHOOT,\n    NATIONAL_DEX_MAGBY,\n    NATIONAL_DEX_BALTOY,\n    NATIONAL_DEX_GROVYLE,\n    NATIONAL_DEX_KECLEON,\n    NATIONAL_DEX_LANTURN,\n    NATIONAL_DEX_WARTORTLE,\n    NATIONAL_DEX_GOREBYSS,\n    NATIONAL_DEX_RELICANTH,\n    NATIONAL_DEX_ELEKID,\n    NATIONAL_DEX_WHISCASH,\n    NATIONAL_DEX_LILEEP,\n    NATIONAL_DEX_NUMEL,\n    NATIONAL_DEX_SLAKOTH,\n    NATIONAL_DEX_JOLTEON,\n    NATIONAL_DEX_CROCONAW,\n    NATIONAL_DEX_FLAREON,\n    NATIONAL_DEX_SEADRA,\n    NATIONAL_DEX_ESPEON,\n    NATIONAL_DEX_HUNTAIL,\n    NATIONAL_DEX_UMBREON,\n    NATIONAL_DEX_MARSHTOMP,\n    NATIONAL_DEX_NUZLEAF,\n    NATIONAL_DEX_SNEASEL,\n    NATIONAL_DEX_MANKEY,\n    NATIONAL_DEX_PELIPPER,\n    NATIONAL_DEX_BEAUTIFLY,\n    NATIONAL_DEX_OCTILLERY,\n    NATIONAL_DEX_AZUMARILL,\n    NATIONAL_DEX_WOBBUFFET,\n    NATIONAL_DEX_VAPOREON,\n    NATIONAL_DEX_SANDSLASH,\n    NATIONAL_DEX_PARASECT,\n    NATIONAL_DEX_BEEDRILL,\n    NATIONAL_DEX_MUK,\n    NATIONAL_DEX_PIDGEOTTO,\n    NATIONAL_DEX_GRIMER,\n    NATIONAL_DEX_RAICHU,\n    NATIONAL_DEX_PONYTA,\n    NATIONAL_DEX_ELECTABUZZ,\n    NATIONAL_DEX_VENONAT,\n    NATIONAL_DEX_SPOINK,\n    NATIONAL_DEX_DUSCLOPS,\n    NATIONAL_DEX_MEDICHAM,\n    NATIONAL_DEX_DUSTOX,\n    NATIONAL_DEX_PERSIAN,\n    NATIONAL_DEX_BUTTERFREE,\n    NATIONAL_DEX_PRIMEAPE,\n    NATIONAL_DEX_DROWZEE,\n    NATIONAL_DEX_FURRET,\n    NATIONAL_DEX_PORYGON2,\n    NATIONAL_DEX_LOMBRE,\n    NATIONAL_DEX_LINOONE,\n    NATIONAL_DEX_DELCATTY,\n    NATIONAL_DEX_CRAWDAUNT,\n    NATIONAL_DEX_DUGTRIO,\n    NATIONAL_DEX_ARIADOS,\n    NATIONAL_DEX_PHANPY,\n    NATIONAL_DEX_POLITOED,\n    NATIONAL_DEX_STARYU,\n    NATIONAL_DEX_CHANSEY,\n    NATIONAL_DEX_OMASTAR,\n    NATIONAL_DEX_TANGELA,\n    NATIONAL_DEX_SLUGMA,\n    NATIONAL_DEX_HOUNDOOM,\n    NATIONAL_DEX_LEDIAN,\n    NATIONAL_DEX_SLOWPOKE,\n    NATIONAL_DEX_PORYGON,\n    NATIONAL_DEX_MIGHTYENA,\n    NATIONAL_DEX_YANMA,\n    NATIONAL_DEX_FEAROW,\n    NATIONAL_DEX_SUDOWOODO,\n    NATIONAL_DEX_SEAKING,\n    NATIONAL_DEX_BRELOOM,\n    NATIONAL_DEX_DODUO,\n    NATIONAL_DEX_PIDGEOT,\n    NATIONAL_DEX_SPHEAL,\n    NATIONAL_DEX_CLEFABLE,\n    NATIONAL_DEX_LATIAS,\n    NATIONAL_DEX_MANECTRIC,\n    NATIONAL_DEX_ZANGOOSE,\n    NATIONAL_DEX_KABUTOPS,\n    NATIONAL_DEX_GENGAR,\n    NATIONAL_DEX_LOUDRED,\n    NATIONAL_DEX_JYNX,\n    NATIONAL_DEX_NOCTOWL,\n    NATIONAL_DEX_GIRAFARIG,\n    NATIONAL_DEX_BAGON,\n    NATIONAL_DEX_MAGMAR,\n    NATIONAL_DEX_MAROWAK,\n    NATIONAL_DEX_TENTACOOL,\n    NATIONAL_DEX_VIGOROTH,\n    NATIONAL_DEX_BLISSEY,\n    NATIONAL_DEX_ABSOL,\n    NATIONAL_DEX_ALAKAZAM,\n    NATIONAL_DEX_HITMONTOP,\n    NATIONAL_DEX_GARDEVOIR,\n    NATIONAL_DEX_GRANBULL,\n    NATIONAL_DEX_HITMONLEE,\n    NATIONAL_DEX_HITMONCHAN,\n    NATIONAL_DEX_SKARMORY,\n    NATIONAL_DEX_CACNEA,\n    NATIONAL_DEX_BLAZIKEN,\n    NATIONAL_DEX_SCEPTILE,\n    NATIONAL_DEX_SEVIPER,\n    NATIONAL_DEX_CLAMPERL,\n    NATIONAL_DEX_ZAPDOS,\n    NATIONAL_DEX_HERACROSS,\n    NATIONAL_DEX_POLIWRATH,\n    NATIONAL_DEX_MR_MIME,\n    NATIONAL_DEX_PINSIR,\n    NATIONAL_DEX_LUDICOLO,\n    NATIONAL_DEX_TENTACRUEL,\n    NATIONAL_DEX_GOLBAT,\n    NATIONAL_DEX_MAGCARGO,\n    NATIONAL_DEX_ARTICUNO,\n    NATIONAL_DEX_PILOSWINE,\n    NATIONAL_DEX_SCYTHER,\n    NATIONAL_DEX_KADABRA,\n    NATIONAL_DEX_SMEARGLE,\n    NATIONAL_DEX_AERODACTYL,\n    NATIONAL_DEX_SHIFTRY,\n    NATIONAL_DEX_KINGLER,\n    NATIONAL_DEX_NIDOQUEEN,\n    NATIONAL_DEX_MAGNETON,\n    NATIONAL_DEX_ARON,\n    NATIONAL_DEX_LATIOS,\n    NATIONAL_DEX_MOLTRES,\n    NATIONAL_DEX_CRADILY,\n    NATIONAL_DEX_DEOXYS,\n    NATIONAL_DEX_AMPHAROS,\n    NATIONAL_DEX_NIDOKING,\n    NATIONAL_DEX_GLIGAR,\n    NATIONAL_DEX_ARBOK,\n    NATIONAL_DEX_LICKITUNG,\n    NATIONAL_DEX_ELECTRODE,\n    NATIONAL_DEX_ARMALDO,\n    NATIONAL_DEX_MACHOKE,\n    NATIONAL_DEX_STANTLER,\n    NATIONAL_DEX_GRUMPIG,\n    NATIONAL_DEX_LARVITAR,\n    NATIONAL_DEX_CROBAT,\n    NATIONAL_DEX_QUAGSIRE,\n    NATIONAL_DEX_MILTANK,\n    NATIONAL_DEX_HYPNO,\n    NATIONAL_DEX_GOLDUCK,\n    NATIONAL_DEX_CACTURNE,\n    NATIONAL_DEX_SLOWBRO,\n    NATIONAL_DEX_TYPHLOSION,\n    NATIONAL_DEX_SLOWKING,\n    NATIONAL_DEX_KANGASKHAN,\n    NATIONAL_DEX_STARMIE,\n    NATIONAL_DEX_SWALOT,\n    NATIONAL_DEX_TORKOAL,\n    NATIONAL_DEX_SWAMPERT,\n    NATIONAL_DEX_FLYGON,\n    NATIONAL_DEX_EXPLOUD,\n    NATIONAL_DEX_DODRIO,\n    NATIONAL_DEX_BLASTOISE,\n    NATIONAL_DEX_MAKUHITA,\n    NATIONAL_DEX_SEALEO,\n    NATIONAL_DEX_TAUROS,\n    NATIONAL_DEX_SHARPEDO,\n    NATIONAL_DEX_FERALIGATR,\n    NATIONAL_DEX_SEEL,\n    NATIONAL_DEX_CHARIZARD,\n    NATIONAL_DEX_RAPIDASH,\n    NATIONAL_DEX_BELDUM,\n    NATIONAL_DEX_NOSEPASS,\n    NATIONAL_DEX_VENUSAUR,\n    NATIONAL_DEX_TROPIUS,\n    NATIONAL_DEX_MEGANIUM,\n    NATIONAL_DEX_SALAMENCE,\n    NATIONAL_DEX_GRAVELER,\n    NATIONAL_DEX_CLAYDOL,\n    NATIONAL_DEX_SHELGON,\n    NATIONAL_DEX_RHYHORN,\n    NATIONAL_DEX_SCIZOR,\n    NATIONAL_DEX_DEWGONG,\n    NATIONAL_DEX_RHYDON,\n    NATIONAL_DEX_DONPHAN,\n    NATIONAL_DEX_EXEGGUTOR,\n    NATIONAL_DEX_LAIRON,\n    NATIONAL_DEX_MEWTWO,\n    NATIONAL_DEX_URSARING,\n    NATIONAL_DEX_FORRETRESS,\n    NATIONAL_DEX_MACHAMP,\n    NATIONAL_DEX_WAILMER,\n    NATIONAL_DEX_SLAKING,\n    NATIONAL_DEX_CLOYSTER,\n    NATIONAL_DEX_WALREIN,\n    NATIONAL_DEX_PUPITAR,\n    NATIONAL_DEX_KINGDRA,\n    NATIONAL_DEX_SOLROCK,\n    NATIONAL_DEX_ARCANINE,\n    NATIONAL_DEX_MILOTIC,\n    NATIONAL_DEX_LUNATONE,\n    NATIONAL_DEX_REGICE,\n    NATIONAL_DEX_RAIKOU,\n    NATIONAL_DEX_SUICUNE,\n    NATIONAL_DEX_ENTEI,\n    NATIONAL_DEX_HO_OH,\n    NATIONAL_DEX_TYRANITAR,\n    NATIONAL_DEX_METANG,\n    NATIONAL_DEX_REGISTEEL,\n    NATIONAL_DEX_RAYQUAZA,\n    NATIONAL_DEX_ONIX,\n    NATIONAL_DEX_DRAGONITE,\n    NATIONAL_DEX_LUGIA,\n    NATIONAL_DEX_LAPRAS,\n    NATIONAL_DEX_CAMERUPT,\n    NATIONAL_DEX_MANTINE,\n    NATIONAL_DEX_REGIROCK,\n    NATIONAL_DEX_GYARADOS,\n    NATIONAL_DEX_HARIYAMA,\n    NATIONAL_DEX_GLALIE,\n    NATIONAL_DEX_GOLEM,\n    NATIONAL_DEX_KYOGRE,\n    NATIONAL_DEX_AGGRON,\n    NATIONAL_DEX_WAILORD,\n    NATIONAL_DEX_STEELIX,\n    NATIONAL_DEX_SNORLAX,\n    NATIONAL_DEX_METAGROSS,\n    NATIONAL_DEX_GROUDON\n};\n\nconst u16 gPokedexOrder_Height[] =\n{\n    NATIONAL_DEX_DIGLETT,\n    NATIONAL_DEX_AZURILL,\n    NATIONAL_DEX_NATU,\n    NATIONAL_DEX_WEEDLE,\n    NATIONAL_DEX_PICHU,\n    NATIONAL_DEX_CLEFFA,\n    NATIONAL_DEX_TOGEPI,\n    NATIONAL_DEX_CASTFORM,\n    NATIONAL_DEX_IGGLYBUFF,\n    NATIONAL_DEX_CATERPIE,\n    NATIONAL_DEX_TAILLOW,\n    NATIONAL_DEX_DITTO,\n    NATIONAL_DEX_EEVEE,\n    NATIONAL_DEX_ROSELIA,\n    NATIONAL_DEX_SPEAROW,\n    NATIONAL_DEX_PIDGEY,\n    NATIONAL_DEX_SUNKERN,\n    NATIONAL_DEX_SHELLDER,\n    NATIONAL_DEX_RATTATA,\n    NATIONAL_DEX_MAGNEMITE,\n    NATIONAL_DEX_PARAS,\n    NATIONAL_DEX_WURMPLE,\n    NATIONAL_DEX_JIRACHI,\n    NATIONAL_DEX_CUBONE,\n    NATIONAL_DEX_MUDKIP,\n    NATIONAL_DEX_WOOPER,\n    NATIONAL_DEX_HORSEA,\n    NATIONAL_DEX_MEOWTH,\n    NATIONAL_DEX_NIDORAN_F,\n    NATIONAL_DEX_SWINUB,\n    NATIONAL_DEX_MEW,\n    NATIONAL_DEX_SWABLU,\n    NATIONAL_DEX_ARON,\n    NATIONAL_DEX_PLUSLE,\n    NATIONAL_DEX_MINUN,\n    NATIONAL_DEX_EXEGGCUTE,\n    NATIONAL_DEX_PIKACHU,\n    NATIONAL_DEX_BELLOSSOM,\n    NATIONAL_DEX_GULPIN,\n    NATIONAL_DEX_ZIGZAGOON,\n    NATIONAL_DEX_SHROOMISH,\n    NATIONAL_DEX_OMANYTE,\n    NATIONAL_DEX_CACNEA,\n    NATIONAL_DEX_KRABBY,\n    NATIONAL_DEX_RALTS,\n    NATIONAL_DEX_HOPPIP,\n    NATIONAL_DEX_TORCHIC,\n    NATIONAL_DEX_CLAMPERL,\n    NATIONAL_DEX_GEODUDE,\n    NATIONAL_DEX_MARILL,\n    NATIONAL_DEX_BARBOACH,\n    NATIONAL_DEX_SMOOCHUM,\n    NATIONAL_DEX_VOLTORB,\n    NATIONAL_DEX_NINCADA,\n    NATIONAL_DEX_SABLEYE,\n    NATIONAL_DEX_MURKROW,\n    NATIONAL_DEX_QWILFISH,\n    NATIONAL_DEX_SQUIRTLE,\n    NATIONAL_DEX_TREECKO,\n    NATIONAL_DEX_BALTOY,\n    NATIONAL_DEX_ODDISH,\n    NATIONAL_DEX_LOTAD,\n    NATIONAL_DEX_JIGGLYPUFF,\n    NATIONAL_DEX_SURSKIT,\n    NATIONAL_DEX_CYNDAQUIL,\n    NATIONAL_DEX_KABUTO,\n    NATIONAL_DEX_LINOONE,\n    NATIONAL_DEX_TORKOAL,\n    NATIONAL_DEX_NIDORAN_M,\n    NATIONAL_DEX_SPINARAK,\n    NATIONAL_DEX_MANKEY,\n    NATIONAL_DEX_SEEDOT,\n    NATIONAL_DEX_POOCHYENA,\n    NATIONAL_DEX_PHANPY,\n    NATIONAL_DEX_UNOWN,\n    NATIONAL_DEX_CHINCHOU,\n    NATIONAL_DEX_PORYGON2,\n    NATIONAL_DEX_POLIWAG,\n    NATIONAL_DEX_BAGON,\n    NATIONAL_DEX_FEEBAS,\n    NATIONAL_DEX_SHUPPET,\n    NATIONAL_DEX_TOTODILE,\n    NATIONAL_DEX_CELEBI,\n    NATIONAL_DEX_WYNAUT,\n    NATIONAL_DEX_SANDSHREW,\n    NATIONAL_DEX_CHIMECHO,\n    NATIONAL_DEX_LUVDISC,\n    NATIONAL_DEX_HOUNDOUR,\n    NATIONAL_DEX_SILCOON,\n    NATIONAL_DEX_ELECTRIKE,\n    NATIONAL_DEX_CHARMANDER,\n    NATIONAL_DEX_MEDITITE,\n    NATIONAL_DEX_WINGULL,\n    NATIONAL_DEX_REMORAID,\n    NATIONAL_DEX_CORPHISH,\n    NATIONAL_DEX_CORSOLA,\n    NATIONAL_DEX_ILLUMISE,\n    NATIONAL_DEX_SNUBBULL,\n    NATIONAL_DEX_VULPIX,\n    NATIONAL_DEX_LARVITAR,\n    NATIONAL_DEX_BELDUM,\n    NATIONAL_DEX_WHISMUR,\n    NATIONAL_DEX_PINECO,\n    NATIONAL_DEX_ELEKID,\n    NATIONAL_DEX_CLEFAIRY,\n    NATIONAL_DEX_SHUCKLE,\n    NATIONAL_DEX_TEDDIURSA,\n    NATIONAL_DEX_KAKUNA,\n    NATIONAL_DEX_SKITTY,\n    NATIONAL_DEX_TOGETIC,\n    NATIONAL_DEX_GOLDEEN,\n    NATIONAL_DEX_MAWILE,\n    NATIONAL_DEX_MAREEP,\n    NATIONAL_DEX_SKIPLOOM,\n    NATIONAL_DEX_KOFFING,\n    NATIONAL_DEX_DUGTRIO,\n    NATIONAL_DEX_CASCOON,\n    NATIONAL_DEX_NUMEL,\n    NATIONAL_DEX_ANORITH,\n    NATIONAL_DEX_VOLBEAT,\n    NATIONAL_DEX_HOOTHOOT,\n    NATIONAL_DEX_TRAPINCH,\n    NATIONAL_DEX_SPOINK,\n    NATIONAL_DEX_METAPOD,\n    NATIONAL_DEX_BELLSPROUT,\n    NATIONAL_DEX_SNORUNT,\n    NATIONAL_DEX_RATICATE,\n    NATIONAL_DEX_MARSHTOMP,\n    NATIONAL_DEX_SWELLOW,\n    NATIONAL_DEX_MAGBY,\n    NATIONAL_DEX_GROWLITHE,\n    NATIONAL_DEX_MISDREAVUS,\n    NATIONAL_DEX_BULBASAUR,\n    NATIONAL_DEX_TYROGUE,\n    NATIONAL_DEX_SLUGMA,\n    NATIONAL_DEX_SLAKOTH,\n    NATIONAL_DEX_KIRLIA,\n    NATIONAL_DEX_AIPOM,\n    NATIONAL_DEX_JOLTEON,\n    NATIONAL_DEX_NIDORINA,\n    NATIONAL_DEX_AZUMARILL,\n    NATIONAL_DEX_SHEDINJA,\n    NATIONAL_DEX_MACHOP,\n    NATIONAL_DEX_NINJASK,\n    NATIONAL_DEX_MASQUERAIN,\n    NATIONAL_DEX_DUSKULL,\n    NATIONAL_DEX_SUNFLORA,\n    NATIONAL_DEX_JUMPLUFF,\n    NATIONAL_DEX_STARYU,\n    NATIONAL_DEX_FLAAFFY,\n    NATIONAL_DEX_SPHEAL,\n    NATIONAL_DEX_PSYDUCK,\n    NATIONAL_DEX_MAGCARGO,\n    NATIONAL_DEX_FARFETCHD,\n    NATIONAL_DEX_ZUBAT,\n    NATIONAL_DEX_PORYGON,\n    NATIONAL_DEX_SENTRET,\n    NATIONAL_DEX_CARVANHA,\n    NATIONAL_DEX_GLOOM,\n    NATIONAL_DEX_RAICHU,\n    NATIONAL_DEX_MAGIKARP,\n    NATIONAL_DEX_SNEASEL,\n    NATIONAL_DEX_LAIRON,\n    NATIONAL_DEX_COMBUSKEN,\n    NATIONAL_DEX_OCTILLERY,\n    NATIONAL_DEX_NIDORINO,\n    NATIONAL_DEX_FLAREON,\n    NATIONAL_DEX_DELIBIRD,\n    NATIONAL_DEX_TENTACOOL,\n    NATIONAL_DEX_ABRA,\n    NATIONAL_DEX_GROVYLE,\n    NATIONAL_DEX_WHISCASH,\n    NATIONAL_DEX_QUILAVA,\n    NATIONAL_DEX_ESPEON,\n    NATIONAL_DEX_GRIMER,\n    NATIONAL_DEX_CHIKORITA,\n    NATIONAL_DEX_GRUMPIG,\n    NATIONAL_DEX_NOSEPASS,\n    NATIONAL_DEX_PERSIAN,\n    NATIONAL_DEX_MIGHTYENA,\n    NATIONAL_DEX_VENONAT,\n    NATIONAL_DEX_MAGNETON,\n    NATIONAL_DEX_PONYTA,\n    NATIONAL_DEX_MAKUHITA,\n    NATIONAL_DEX_LUNATONE,\n    NATIONAL_DEX_SANDSLASH,\n    NATIONAL_DEX_DROWZEE,\n    NATIONAL_DEX_TANGELA,\n    NATIONAL_DEX_PRIMEAPE,\n    NATIONAL_DEX_LEDYBA,\n    NATIONAL_DEX_WIGGLYTUFF,\n    NATIONAL_DEX_PARASECT,\n    NATIONAL_DEX_OMASTAR,\n    NATIONAL_DEX_LOUDRED,\n    NATIONAL_DEX_WARTORTLE,\n    NATIONAL_DEX_GRAVELER,\n    NATIONAL_DEX_UMBREON,\n    NATIONAL_DEX_LILEEP,\n    NATIONAL_DEX_POLIWHIRL,\n    NATIONAL_DEX_VAPOREON,\n    NATIONAL_DEX_BEEDRILL,\n    NATIONAL_DEX_MAROWAK,\n    NATIONAL_DEX_WEEPINBELL,\n    NATIONAL_DEX_RELICANTH,\n    NATIONAL_DEX_RHYHORN,\n    NATIONAL_DEX_IVYSAUR,\n    NATIONAL_DEX_KECLEON,\n    NATIONAL_DEX_NUZLEAF,\n    NATIONAL_DEX_BEAUTIFLY,\n    NATIONAL_DEX_PIDGEOTTO,\n    NATIONAL_DEX_ARIADOS,\n    NATIONAL_DEX_SEEL,\n    NATIONAL_DEX_POLITOED,\n    NATIONAL_DEX_CROCONAW,\n    NATIONAL_DEX_CHANSEY,\n    NATIONAL_DEX_BANETTE,\n    NATIONAL_DEX_DONPHAN,\n    NATIONAL_DEX_STARMIE,\n    NATIONAL_DEX_CHARMELEON,\n    NATIONAL_DEX_PILOSWINE,\n    NATIONAL_DEX_BUTTERFREE,\n    NATIONAL_DEX_VIBRAVA,\n    NATIONAL_DEX_ELECTABUZZ,\n    NATIONAL_DEX_CRAWDAUNT,\n    NATIONAL_DEX_DELCATTY,\n    NATIONAL_DEX_ALTARIA,\n    NATIONAL_DEX_SHELGON,\n    NATIONAL_DEX_NINETALES,\n    NATIONAL_DEX_GLIGAR,\n    NATIONAL_DEX_SEALEO,\n    NATIONAL_DEX_SPINDA,\n    NATIONAL_DEX_PUPITAR,\n    NATIONAL_DEX_SLOWPOKE,\n    NATIONAL_DEX_SOLROCK,\n    NATIONAL_DEX_MILTANK,\n    NATIONAL_DEX_FEAROW,\n    NATIONAL_DEX_VILEPLUME,\n    NATIONAL_DEX_MUK,\n    NATIONAL_DEX_FORRETRESS,\n    NATIONAL_DEX_SUDOWOODO,\n    NATIONAL_DEX_ABSOL,\n    NATIONAL_DEX_YANMA,\n    NATIONAL_DEX_DUSTOX,\n    NATIONAL_DEX_LICKITUNG,\n    NATIONAL_DEX_SMEARGLE,\n    NATIONAL_DEX_LANTURN,\n    NATIONAL_DEX_ELECTRODE,\n    NATIONAL_DEX_LOMBRE,\n    NATIONAL_DEX_BRELOOM,\n    NATIONAL_DEX_BAYLEEF,\n    NATIONAL_DEX_SEADRA,\n    NATIONAL_DEX_WEEZING,\n    NATIONAL_DEX_PELIPPER,\n    NATIONAL_DEX_METANG,\n    NATIONAL_DEX_NIDOQUEEN,\n    NATIONAL_DEX_CACTURNE,\n    NATIONAL_DEX_SHIFTRY,\n    NATIONAL_DEX_MEDICHAM,\n    NATIONAL_DEX_ZANGOOSE,\n    NATIONAL_DEX_KABUTOPS,\n    NATIONAL_DEX_KINGLER,\n    NATIONAL_DEX_KADABRA,\n    NATIONAL_DEX_SEAKING,\n    NATIONAL_DEX_CLEFABLE,\n    NATIONAL_DEX_MAGMAR,\n    NATIONAL_DEX_WOBBUFFET,\n    NATIONAL_DEX_GASTLY,\n    NATIONAL_DEX_MR_MIME,\n    NATIONAL_DEX_POLIWRATH,\n    NATIONAL_DEX_TAUROS,\n    NATIONAL_DEX_LATIAS,\n    NATIONAL_DEX_AMPHAROS,\n    NATIONAL_DEX_VIGOROTH,\n    NATIONAL_DEX_LEDIAN,\n    NATIONAL_DEX_GOLEM,\n    NATIONAL_DEX_WALREIN,\n    NATIONAL_DEX_DODUO,\n    NATIONAL_DEX_HOUNDOOM,\n    NATIONAL_DEX_NIDOKING,\n    NATIONAL_DEX_JYNX,\n    NATIONAL_DEX_HITMONCHAN,\n    NATIONAL_DEX_STANTLER,\n    NATIONAL_DEX_GRANBULL,\n    NATIONAL_DEX_HITMONTOP,\n    NATIONAL_DEX_QUAGSIRE,\n    NATIONAL_DEX_CLAYDOL,\n    NATIONAL_DEX_SWAMPERT,\n    NATIONAL_DEX_BLISSEY,\n    NATIONAL_DEX_LUDICOLO,\n    NATIONAL_DEX_EXPLOUD,\n    NATIONAL_DEX_DUNSPARCE,\n    NATIONAL_DEX_PINSIR,\n    NATIONAL_DEX_CLOYSTER,\n    NATIONAL_DEX_MACHOKE,\n    NATIONAL_DEX_GIRAFARIG,\n    NATIONAL_DEX_PIDGEOT,\n    NATIONAL_DEX_XATU,\n    NATIONAL_DEX_CRADILY,\n    NATIONAL_DEX_HITMONLEE,\n    NATIONAL_DEX_VENOMOTH,\n    NATIONAL_DEX_GENGAR,\n    NATIONAL_DEX_HERACROSS,\n    NATIONAL_DEX_GLALIE,\n    NATIONAL_DEX_SCYTHER,\n    NATIONAL_DEX_SALAMENCE,\n    NATIONAL_DEX_MANECTRIC,\n    NATIONAL_DEX_ARMALDO,\n    NATIONAL_DEX_ALAKAZAM,\n    NATIONAL_DEX_HYPNO,\n    NATIONAL_DEX_NOCTOWL,\n    NATIONAL_DEX_TENTACRUEL,\n    NATIONAL_DEX_DUSCLOPS,\n    NATIONAL_DEX_ZAPDOS,\n    NATIONAL_DEX_GOLBAT,\n    NATIONAL_DEX_METAGROSS,\n    NATIONAL_DEX_GARDEVOIR,\n    NATIONAL_DEX_BLASTOISE,\n    NATIONAL_DEX_SLOWBRO,\n    NATIONAL_DEX_HAUNTER,\n    NATIONAL_DEX_MACHAMP,\n    NATIONAL_DEX_REGIROCK,\n    NATIONAL_DEX_SWALOT,\n    NATIONAL_DEX_SCEPTILE,\n    NATIONAL_DEX_SKARMORY,\n    NATIONAL_DEX_GOLDUCK,\n    NATIONAL_DEX_DEOXYS,\n    NATIONAL_DEX_VICTREEBEL,\n    NATIONAL_DEX_RAPIDASH,\n    NATIONAL_DEX_CHARIZARD,\n    NATIONAL_DEX_HUNTAIL,\n    NATIONAL_DEX_DEWGONG,\n    NATIONAL_DEX_ARTICUNO,\n    NATIONAL_DEX_TYPHLOSION,\n    NATIONAL_DEX_AERODACTYL,\n    NATIONAL_DEX_GOREBYSS,\n    NATIONAL_DEX_URSARING,\n    NATIONAL_DEX_MEGANIUM,\n    NATIONAL_DEX_REGICE,\n    NATIONAL_DEX_SCIZOR,\n    NATIONAL_DEX_KINGDRA,\n    NATIONAL_DEX_DRATINI,\n    NATIONAL_DEX_DODRIO,\n    NATIONAL_DEX_SHARPEDO,\n    NATIONAL_DEX_CROBAT,\n    NATIONAL_DEX_FURRET,\n    NATIONAL_DEX_ARCANINE,\n    NATIONAL_DEX_RAIKOU,\n    NATIONAL_DEX_BLAZIKEN,\n    NATIONAL_DEX_CAMERUPT,\n    NATIONAL_DEX_RHYDON,\n    NATIONAL_DEX_REGISTEEL,\n    NATIONAL_DEX_EKANS,\n    NATIONAL_DEX_FLYGON,\n    NATIONAL_DEX_TROPIUS,\n    NATIONAL_DEX_LATIOS,\n    NATIONAL_DEX_SUICUNE,\n    NATIONAL_DEX_MOLTRES,\n    NATIONAL_DEX_VENUSAUR,\n    NATIONAL_DEX_EXEGGUTOR,\n    NATIONAL_DEX_SLOWKING,\n    NATIONAL_DEX_TYRANITAR,\n    NATIONAL_DEX_SLAKING,\n    NATIONAL_DEX_WAILMER,\n    NATIONAL_DEX_MEWTWO,\n    NATIONAL_DEX_AGGRON,\n    NATIONAL_DEX_SNORLAX,\n    NATIONAL_DEX_MANTINE,\n    NATIONAL_DEX_ENTEI,\n    NATIONAL_DEX_DRAGONITE,\n    NATIONAL_DEX_KANGASKHAN,\n    NATIONAL_DEX_HARIYAMA,\n    NATIONAL_DEX_FERALIGATR,\n    NATIONAL_DEX_LAPRAS,\n    NATIONAL_DEX_SEVIPER,\n    NATIONAL_DEX_ARBOK,\n    NATIONAL_DEX_GROUDON,\n    NATIONAL_DEX_HO_OH,\n    NATIONAL_DEX_DRAGONAIR,\n    NATIONAL_DEX_KYOGRE,\n    NATIONAL_DEX_LUGIA,\n    NATIONAL_DEX_MILOTIC,\n    NATIONAL_DEX_GYARADOS,\n    NATIONAL_DEX_RAYQUAZA,\n    NATIONAL_DEX_ONIX,\n    NATIONAL_DEX_STEELIX,\n    NATIONAL_DEX_WAILORD\n};\n\nconst u16 gPokedexOrder_Type[] =\n{\n    SPECIES_RATTATA,\n    SPECIES_RATICATE,\n    SPECIES_CLEFAIRY,\n    SPECIES_CLEFABLE,\n    SPECIES_JIGGLYPUFF,\n    SPECIES_WIGGLYTUFF,\n    SPECIES_MEOWTH,\n    SPECIES_PERSIAN,\n    SPECIES_LICKITUNG,\n    SPECIES_CHANSEY,\n    SPECIES_KANGASKHAN,\n    SPECIES_TAUROS,\n    SPECIES_DITTO,\n    SPECIES_EEVEE,\n    SPECIES_PORYGON,\n    SPECIES_SNORLAX,\n    SPECIES_SENTRET,\n    SPECIES_FURRET,\n    SPECIES_CLEFFA,\n    SPECIES_IGGLYBUFF,\n    SPECIES_TOGEPI,\n    SPECIES_AIPOM,\n    SPECIES_DUNSPARCE,\n    SPECIES_SNUBBULL,\n    SPECIES_GRANBULL,\n    SPECIES_TEDDIURSA,\n    SPECIES_URSARING,\n    SPECIES_PORYGON2,\n    SPECIES_STANTLER,\n    SPECIES_SMEARGLE,\n    SPECIES_MILTANK,\n    SPECIES_BLISSEY,\n    SPECIES_ZIGZAGOON,\n    SPECIES_LINOONE,\n    SPECIES_SLAKOTH,\n    SPECIES_VIGOROTH,\n    SPECIES_SLAKING,\n    SPECIES_WHISMUR,\n    SPECIES_LOUDRED,\n    SPECIES_EXPLOUD,\n    SPECIES_AZURILL,\n    SPECIES_SKITTY,\n    SPECIES_DELCATTY,\n    SPECIES_SPINDA,\n    SPECIES_ZANGOOSE,\n    SPECIES_CASTFORM,\n    SPECIES_KECLEON,\n    SPECIES_OLD_UNOWN_B,\n    SPECIES_OLD_UNOWN_C,\n    SPECIES_OLD_UNOWN_D,\n    SPECIES_OLD_UNOWN_E,\n    SPECIES_OLD_UNOWN_F,\n    SPECIES_OLD_UNOWN_G,\n    SPECIES_OLD_UNOWN_H,\n    SPECIES_OLD_UNOWN_I,\n    SPECIES_OLD_UNOWN_J,\n    SPECIES_OLD_UNOWN_K,\n    SPECIES_OLD_UNOWN_L,\n    SPECIES_OLD_UNOWN_M,\n    SPECIES_OLD_UNOWN_N,\n    SPECIES_OLD_UNOWN_O,\n    SPECIES_OLD_UNOWN_P,\n    SPECIES_OLD_UNOWN_Q,\n    SPECIES_OLD_UNOWN_R,\n    SPECIES_OLD_UNOWN_S,\n    SPECIES_OLD_UNOWN_T,\n    SPECIES_OLD_UNOWN_U,\n    SPECIES_OLD_UNOWN_V,\n    SPECIES_OLD_UNOWN_W,\n    SPECIES_OLD_UNOWN_X,\n    SPECIES_OLD_UNOWN_Y,\n    SPECIES_OLD_UNOWN_Z,\n    SPECIES_PIDGEY,\n    SPECIES_PIDGEOTTO,\n    SPECIES_PIDGEOT,\n    SPECIES_SPEAROW,\n    SPECIES_FEAROW,\n    SPECIES_FARFETCHD,\n    SPECIES_DODUO,\n    SPECIES_DODRIO,\n    SPECIES_HOOTHOOT,\n    SPECIES_NOCTOWL,\n    SPECIES_TOGETIC,\n    SPECIES_TAILLOW,\n    SPECIES_SWELLOW,\n    SPECIES_SWABLU,\n    SPECIES_GIRAFARIG,\n    SPECIES_MANKEY,\n    SPECIES_PRIMEAPE,\n    SPECIES_MACHOP,\n    SPECIES_MACHOKE,\n    SPECIES_MACHAMP,\n    SPECIES_HITMONLEE,\n    SPECIES_HITMONCHAN,\n    SPECIES_TYROGUE,\n    SPECIES_HITMONTOP,\n    SPECIES_MAKUHITA,\n    SPECIES_HARIYAMA,\n    SPECIES_MEDITITE,\n    SPECIES_MEDICHAM,\n    SPECIES_EKANS,\n    SPECIES_ARBOK,\n    SPECIES_NIDORAN_F,\n    SPECIES_NIDORINA,\n    SPECIES_NIDORAN_M,\n    SPECIES_NIDORINO,\n    SPECIES_GRIMER,\n    SPECIES_MUK,\n    SPECIES_KOFFING,\n    SPECIES_WEEZING,\n    SPECIES_GULPIN,\n    SPECIES_SWALOT,\n    SPECIES_SEVIPER,\n    SPECIES_ZUBAT,\n    SPECIES_GOLBAT,\n    SPECIES_CROBAT,\n    SPECIES_NIDOQUEEN,\n    SPECIES_NIDOKING,\n    SPECIES_SANDSHREW,\n    SPECIES_SANDSLASH,\n    SPECIES_DIGLETT,\n    SPECIES_DUGTRIO,\n    SPECIES_CUBONE,\n    SPECIES_MAROWAK,\n    SPECIES_PHANPY,\n    SPECIES_DONPHAN,\n    SPECIES_TRAPINCH,\n    SPECIES_GROUDON,\n    SPECIES_GLIGAR,\n    SPECIES_RHYHORN,\n    SPECIES_RHYDON,\n    SPECIES_BALTOY,\n    SPECIES_CLAYDOL,\n    SPECIES_VIBRAVA,\n    SPECIES_FLYGON,\n    SPECIES_SUDOWOODO,\n    SPECIES_NOSEPASS,\n    SPECIES_REGIROCK,\n    SPECIES_AERODACTYL,\n    SPECIES_GEODUDE,\n    SPECIES_GRAVELER,\n    SPECIES_GOLEM,\n    SPECIES_ONIX,\n    SPECIES_LARVITAR,\n    SPECIES_PUPITAR,\n    SPECIES_ANORITH,\n    SPECIES_ARMALDO,\n    SPECIES_OMANYTE,\n    SPECIES_OMASTAR,\n    SPECIES_KABUTO,\n    SPECIES_KABUTOPS,\n    SPECIES_LILEEP,\n    SPECIES_CRADILY,\n    SPECIES_LUNATONE,\n    SPECIES_SOLROCK,\n    SPECIES_TYRANITAR,\n    SPECIES_CATERPIE,\n    SPECIES_METAPOD,\n    SPECIES_PINSIR,\n    SPECIES_PINECO,\n    SPECIES_WURMPLE,\n    SPECIES_SILCOON,\n    SPECIES_CASCOON,\n    SPECIES_VOLBEAT,\n    SPECIES_ILLUMISE,\n    SPECIES_HERACROSS,\n    SPECIES_BUTTERFREE,\n    SPECIES_SCYTHER,\n    SPECIES_LEDYBA,\n    SPECIES_LEDIAN,\n    SPECIES_YANMA,\n    SPECIES_BEAUTIFLY,\n    SPECIES_MASQUERAIN,\n    SPECIES_NINJASK,\n    SPECIES_WEEDLE,\n    SPECIES_KAKUNA,\n    SPECIES_BEEDRILL,\n    SPECIES_VENONAT,\n    SPECIES_VENOMOTH,\n    SPECIES_SPINARAK,\n    SPECIES_ARIADOS,\n    SPECIES_DUSTOX,\n    SPECIES_NINCADA,\n    SPECIES_SHUCKLE,\n    SPECIES_SHEDINJA,\n    SPECIES_FORRETRESS,\n    SPECIES_SCIZOR,\n    SPECIES_SURSKIT,\n    SPECIES_PARAS,\n    SPECIES_PARASECT,\n    SPECIES_MISDREAVUS,\n    SPECIES_SHUPPET,\n    SPECIES_BANETTE,\n    SPECIES_DUSKULL,\n    SPECIES_DUSCLOPS,\n    SPECIES_GASTLY,\n    SPECIES_HAUNTER,\n    SPECIES_GENGAR,\n    SPECIES_MAWILE,\n    SPECIES_REGISTEEL,\n    SPECIES_SKARMORY,\n    SPECIES_STEELIX,\n    SPECIES_ARON,\n    SPECIES_LAIRON,\n    SPECIES_AGGRON,\n    SPECIES_BELDUM,\n    SPECIES_METANG,\n    SPECIES_METAGROSS,\n    SPECIES_JIRACHI,\n    SPECIES_CHARMANDER,\n    SPECIES_CHARMELEON,\n    SPECIES_VULPIX,\n    SPECIES_NINETALES,\n    SPECIES_GROWLITHE,\n    SPECIES_ARCANINE,\n    SPECIES_PONYTA,\n    SPECIES_RAPIDASH,\n    SPECIES_MAGMAR,\n    SPECIES_FLAREON,\n    SPECIES_CYNDAQUIL,\n    SPECIES_QUILAVA,\n    SPECIES_TYPHLOSION,\n    SPECIES_SLUGMA,\n    SPECIES_MAGBY,\n    SPECIES_ENTEI,\n    SPECIES_TORCHIC,\n    SPECIES_TORKOAL,\n    SPECIES_COMBUSKEN,\n    SPECIES_BLAZIKEN,\n    SPECIES_CHARIZARD,\n    SPECIES_MOLTRES,\n    SPECIES_HO_OH,\n    SPECIES_NUMEL,\n    SPECIES_CAMERUPT,\n    SPECIES_MAGCARGO,\n    SPECIES_SQUIRTLE,\n    SPECIES_WARTORTLE,\n    SPECIES_BLASTOISE,\n    SPECIES_PSYDUCK,\n    SPECIES_GOLDUCK,\n    SPECIES_POLIWAG,\n    SPECIES_POLIWHIRL,\n    SPECIES_SEEL,\n    SPECIES_SHELLDER,\n    SPECIES_KRABBY,\n    SPECIES_KINGLER,\n    SPECIES_HORSEA,\n    SPECIES_SEADRA,\n    SPECIES_GOLDEEN,\n    SPECIES_SEAKING,\n    SPECIES_STARYU,\n    SPECIES_MAGIKARP,\n    SPECIES_VAPOREON,\n    SPECIES_TOTODILE,\n    SPECIES_CROCONAW,\n    SPECIES_FERALIGATR,\n    SPECIES_MARILL,\n    SPECIES_AZUMARILL,\n    SPECIES_POLITOED,\n    SPECIES_REMORAID,\n    SPECIES_OCTILLERY,\n    SPECIES_SUICUNE,\n    SPECIES_MUDKIP,\n    SPECIES_WAILMER,\n    SPECIES_WAILORD,\n    SPECIES_CORPHISH,\n    SPECIES_FEEBAS,\n    SPECIES_MILOTIC,\n    SPECIES_CLAMPERL,\n    SPECIES_HUNTAIL,\n    SPECIES_GOREBYSS,\n    SPECIES_LUVDISC,\n    SPECIES_KYOGRE,\n    SPECIES_POLIWRATH,\n    SPECIES_GYARADOS,\n    SPECIES_MANTINE,\n    SPECIES_WINGULL,\n    SPECIES_PELIPPER,\n    SPECIES_TENTACOOL,\n    SPECIES_TENTACRUEL,\n    SPECIES_QWILFISH,\n    SPECIES_WOOPER,\n    SPECIES_QUAGSIRE,\n    SPECIES_MARSHTOMP,\n    SPECIES_SWAMPERT,\n    SPECIES_BARBOACH,\n    SPECIES_WHISCASH,\n    SPECIES_CORSOLA,\n    SPECIES_RELICANTH,\n    SPECIES_LOTAD,\n    SPECIES_LOMBRE,\n    SPECIES_LUDICOLO,\n    SPECIES_CHINCHOU,\n    SPECIES_LANTURN,\n    SPECIES_SLOWPOKE,\n    SPECIES_SLOWBRO,\n    SPECIES_STARMIE,\n    SPECIES_SLOWKING,\n    SPECIES_DEWGONG,\n    SPECIES_CLOYSTER,\n    SPECIES_LAPRAS,\n    SPECIES_KINGDRA,\n    SPECIES_CARVANHA,\n    SPECIES_SHARPEDO,\n    SPECIES_CRAWDAUNT,\n    SPECIES_TANGELA,\n    SPECIES_CHIKORITA,\n    SPECIES_BAYLEEF,\n    SPECIES_MEGANIUM,\n    SPECIES_BELLOSSOM,\n    SPECIES_SUNKERN,\n    SPECIES_SUNFLORA,\n    SPECIES_TREECKO,\n    SPECIES_GROVYLE,\n    SPECIES_SCEPTILE,\n    SPECIES_SEEDOT,\n    SPECIES_SHROOMISH,\n    SPECIES_CACNEA,\n    SPECIES_BRELOOM,\n    SPECIES_HOPPIP,\n    SPECIES_SKIPLOOM,\n    SPECIES_JUMPLUFF,\n    SPECIES_TROPIUS,\n    SPECIES_BULBASAUR,\n    SPECIES_IVYSAUR,\n    SPECIES_VENUSAUR,\n    SPECIES_ODDISH,\n    SPECIES_GLOOM,\n    SPECIES_VILEPLUME,\n    SPECIES_BELLSPROUT,\n    SPECIES_WEEPINBELL,\n    SPECIES_VICTREEBEL,\n    SPECIES_ROSELIA,\n    SPECIES_EXEGGCUTE,\n    SPECIES_EXEGGUTOR,\n    SPECIES_NUZLEAF,\n    SPECIES_SHIFTRY,\n    SPECIES_CACTURNE,\n    SPECIES_PIKACHU,\n    SPECIES_RAICHU,\n    SPECIES_VOLTORB,\n    SPECIES_ELECTRODE,\n    SPECIES_ELECTABUZZ,\n    SPECIES_JOLTEON,\n    SPECIES_PICHU,\n    SPECIES_MAREEP,\n    SPECIES_FLAAFFY,\n    SPECIES_AMPHAROS,\n    SPECIES_ELEKID,\n    SPECIES_RAIKOU,\n    SPECIES_ELECTRIKE,\n    SPECIES_MANECTRIC,\n    SPECIES_PLUSLE,\n    SPECIES_MINUN,\n    SPECIES_ZAPDOS,\n    SPECIES_MAGNEMITE,\n    SPECIES_MAGNETON,\n    SPECIES_ABRA,\n    SPECIES_KADABRA,\n    SPECIES_ALAKAZAM,\n    SPECIES_DROWZEE,\n    SPECIES_HYPNO,\n    SPECIES_MR_MIME,\n    SPECIES_MEWTWO,\n    SPECIES_MEW,\n    SPECIES_ESPEON,\n    SPECIES_UNOWN,\n    SPECIES_WOBBUFFET,\n    SPECIES_RALTS,\n    SPECIES_KIRLIA,\n    SPECIES_GARDEVOIR,\n    SPECIES_SPOINK,\n    SPECIES_GRUMPIG,\n    SPECIES_CHIMECHO,\n    SPECIES_WYNAUT,\n    SPECIES_DEOXYS,\n    SPECIES_NATU,\n    SPECIES_XATU,\n    SPECIES_LUGIA,\n    SPECIES_CELEBI,\n    SPECIES_SNORUNT,\n    SPECIES_GLALIE,\n    SPECIES_REGICE,\n    SPECIES_ARTICUNO,\n    SPECIES_DELIBIRD,\n    SPECIES_SWINUB,\n    SPECIES_PILOSWINE,\n    SPECIES_SPHEAL,\n    SPECIES_SEALEO,\n    SPECIES_WALREIN,\n    SPECIES_JYNX,\n    SPECIES_SMOOCHUM,\n    SPECIES_DRATINI,\n    SPECIES_DRAGONAIR,\n    SPECIES_BAGON,\n    SPECIES_SHELGON,\n    SPECIES_DRAGONITE,\n    SPECIES_ALTARIA,\n    SPECIES_SALAMENCE,\n    SPECIES_RAYQUAZA,\n    SPECIES_LATIAS,\n    SPECIES_LATIOS,\n    SPECIES_UMBREON,\n    SPECIES_POOCHYENA,\n    SPECIES_MIGHTYENA,\n    SPECIES_ABSOL,\n    SPECIES_MURKROW,\n    SPECIES_SABLEYE,\n    SPECIES_HOUNDOUR,\n    SPECIES_HOUNDOOM,\n    SPECIES_SNEASEL\n};\n\nconst u16 gPokedexOrder_TypeExtended[] =\n{\n    SPECIES_RATTATA,\n    SPECIES_RATICATE,\n    SPECIES_CLEFFA,\n    SPECIES_CLEFAIRY,\n    SPECIES_CLEFABLE,\n    SPECIES_IGGLYBUFF,\n    SPECIES_JIGGLYPUFF,\n    SPECIES_WIGGLYTUFF,\n    SPECIES_MEOWTH,\n    SPECIES_PERSIAN,\n    SPECIES_LICKITUNG,\n    SPECIES_CHANSEY,\n    SPECIES_BLISSEY,\n    SPECIES_KANGASKHAN,\n    SPECIES_TAUROS,\n    SPECIES_DITTO,\n    SPECIES_EEVEE,\n    SPECIES_PORYGON,\n    SPECIES_PORYGON2,\n    SPECIES_SNORLAX,\n    SPECIES_SENTRET,\n    SPECIES_FURRET,\n    SPECIES_TOGEPI,\n    SPECIES_AZURILL,\n    SPECIES_AIPOM,\n    SPECIES_DUNSPARCE,\n    SPECIES_SNUBBULL,\n    SPECIES_GRANBULL,\n    SPECIES_TEDDIURSA,\n    SPECIES_URSARING,\n    SPECIES_STANTLER,\n    SPECIES_SMEARGLE,\n    SPECIES_MILTANK,\n    SPECIES_ZIGZAGOON,\n    SPECIES_LINOONE,\n    SPECIES_SLAKOTH,\n    SPECIES_VIGOROTH,\n    SPECIES_SLAKING,\n    SPECIES_WHISMUR,\n    SPECIES_LOUDRED,\n    SPECIES_EXPLOUD,\n    SPECIES_SKITTY,\n    SPECIES_DELCATTY,\n    SPECIES_SPINDA,\n    SPECIES_ZANGOOSE,\n    SPECIES_CASTFORM,\n    SPECIES_KECLEON,\n    SPECIES_OLD_UNOWN_B,\n    SPECIES_OLD_UNOWN_C,\n    SPECIES_OLD_UNOWN_D,\n    SPECIES_OLD_UNOWN_E,\n    SPECIES_OLD_UNOWN_F,\n    SPECIES_OLD_UNOWN_G,\n    SPECIES_OLD_UNOWN_H,\n    SPECIES_OLD_UNOWN_I,\n    SPECIES_OLD_UNOWN_J,\n    SPECIES_OLD_UNOWN_K,\n    SPECIES_OLD_UNOWN_L,\n    SPECIES_OLD_UNOWN_M,\n    SPECIES_OLD_UNOWN_N,\n    SPECIES_OLD_UNOWN_O,\n    SPECIES_OLD_UNOWN_P,\n    SPECIES_OLD_UNOWN_Q,\n    SPECIES_OLD_UNOWN_R,\n    SPECIES_OLD_UNOWN_S,\n    SPECIES_OLD_UNOWN_T,\n    SPECIES_OLD_UNOWN_U,\n    SPECIES_OLD_UNOWN_V,\n    SPECIES_OLD_UNOWN_W,\n    SPECIES_OLD_UNOWN_X,\n    SPECIES_OLD_UNOWN_Y,\n    SPECIES_OLD_UNOWN_Z,\n    SPECIES_PIDGEY,\n    SPECIES_PIDGEOTTO,\n    SPECIES_PIDGEOT,\n    SPECIES_SPEAROW,\n    SPECIES_FEAROW,\n    SPECIES_FARFETCHD,\n    SPECIES_DODUO,\n    SPECIES_DODRIO,\n    SPECIES_HOOTHOOT,\n    SPECIES_NOCTOWL,\n    SPECIES_TOGETIC,\n    SPECIES_TAILLOW,\n    SPECIES_SWELLOW,\n    SPECIES_SWABLU,\n    SPECIES_GIRAFARIG,\n    SPECIES_MANKEY,\n    SPECIES_PRIMEAPE,\n    SPECIES_MACHOP,\n    SPECIES_MACHOKE,\n    SPECIES_MACHAMP,\n    SPECIES_TYROGUE,\n    SPECIES_HITMONLEE,\n    SPECIES_HITMONCHAN,\n    SPECIES_HITMONTOP,\n    SPECIES_MAKUHITA,\n    SPECIES_HARIYAMA,\n    SPECIES_MEDITITE,\n    SPECIES_MEDICHAM,\n    SPECIES_EKANS,\n    SPECIES_ARBOK,\n    SPECIES_NIDORAN_F,\n    SPECIES_NIDORINA,\n    SPECIES_NIDORAN_M,\n    SPECIES_NIDORINO,\n    SPECIES_GRIMER,\n    SPECIES_MUK,\n    SPECIES_KOFFING,\n    SPECIES_WEEZING,\n    SPECIES_GULPIN,\n    SPECIES_SWALOT,\n    SPECIES_SEVIPER,\n    SPECIES_ZUBAT,\n    SPECIES_GOLBAT,\n    SPECIES_CROBAT,\n    SPECIES_NIDOQUEEN,\n    SPECIES_NIDOKING,\n    SPECIES_SANDSHREW,\n    SPECIES_SANDSLASH,\n    SPECIES_DIGLETT,\n    SPECIES_DUGTRIO,\n    SPECIES_CUBONE,\n    SPECIES_MAROWAK,\n    SPECIES_PHANPY,\n    SPECIES_DONPHAN,\n    SPECIES_TRAPINCH,\n    SPECIES_GROUDON,\n    SPECIES_GLIGAR,\n    SPECIES_RHYHORN,\n    SPECIES_RHYDON,\n    SPECIES_BALTOY,\n    SPECIES_CLAYDOL,\n    SPECIES_VIBRAVA,\n    SPECIES_FLYGON,\n    SPECIES_SUDOWOODO,\n    SPECIES_NOSEPASS,\n    SPECIES_REGIROCK,\n    SPECIES_AERODACTYL,\n    SPECIES_GEODUDE,\n    SPECIES_GRAVELER,\n    SPECIES_GOLEM,\n    SPECIES_ONIX,\n    SPECIES_LARVITAR,\n    SPECIES_PUPITAR,\n    SPECIES_ANORITH,\n    SPECIES_ARMALDO,\n    SPECIES_OMANYTE,\n    SPECIES_OMASTAR,\n    SPECIES_KABUTO,\n    SPECIES_KABUTOPS,\n    SPECIES_LILEEP,\n    SPECIES_CRADILY,\n    SPECIES_LUNATONE,\n    SPECIES_SOLROCK,\n    SPECIES_TYRANITAR,\n    SPECIES_CATERPIE,\n    SPECIES_METAPOD,\n    SPECIES_PINSIR,\n    SPECIES_PINECO,\n    SPECIES_WURMPLE,\n    SPECIES_SILCOON,\n    SPECIES_CASCOON,\n    SPECIES_VOLBEAT,\n    SPECIES_ILLUMISE,\n    SPECIES_HERACROSS,\n    SPECIES_BUTTERFREE,\n    SPECIES_SCYTHER,\n    SPECIES_LEDYBA,\n    SPECIES_LEDIAN,\n    SPECIES_YANMA,\n    SPECIES_BEAUTIFLY,\n    SPECIES_MASQUERAIN,\n    SPECIES_NINJASK,\n    SPECIES_WEEDLE,\n    SPECIES_KAKUNA,\n    SPECIES_BEEDRILL,\n    SPECIES_VENONAT,\n    SPECIES_VENOMOTH,\n    SPECIES_SPINARAK,\n    SPECIES_ARIADOS,\n    SPECIES_DUSTOX,\n    SPECIES_NINCADA,\n    SPECIES_SHUCKLE,\n    SPECIES_SHEDINJA,\n    SPECIES_SCIZOR,\n    SPECIES_FORRETRESS,\n    SPECIES_SURSKIT,\n    SPECIES_PARAS,\n    SPECIES_PARASECT,\n    SPECIES_MISDREAVUS,\n    SPECIES_SHUPPET,\n    SPECIES_BANETTE,\n    SPECIES_DUSKULL,\n    SPECIES_DUSCLOPS,\n    SPECIES_GASTLY,\n    SPECIES_HAUNTER,\n    SPECIES_GENGAR,\n    SPECIES_MAWILE,\n    SPECIES_REGISTEEL,\n    SPECIES_SKARMORY,\n    SPECIES_STEELIX,\n    SPECIES_ARON,\n    SPECIES_LAIRON,\n    SPECIES_AGGRON,\n    SPECIES_BELDUM,\n    SPECIES_METANG,\n    SPECIES_METAGROSS,\n    SPECIES_JIRACHI,\n    SPECIES_CHARMANDER,\n    SPECIES_CHARMELEON,\n    SPECIES_VULPIX,\n    SPECIES_NINETALES,\n    SPECIES_GROWLITHE,\n    SPECIES_ARCANINE,\n    SPECIES_PONYTA,\n    SPECIES_RAPIDASH,\n    SPECIES_MAGBY,\n    SPECIES_MAGMAR,\n    SPECIES_FLAREON,\n    SPECIES_CYNDAQUIL,\n    SPECIES_QUILAVA,\n    SPECIES_TYPHLOSION,\n    SPECIES_SLUGMA,\n    SPECIES_ENTEI,\n    SPECIES_TORCHIC,\n    SPECIES_TORKOAL,\n    SPECIES_COMBUSKEN,\n    SPECIES_BLAZIKEN,\n    SPECIES_CHARIZARD,\n    SPECIES_MOLTRES,\n    SPECIES_HO_OH,\n    SPECIES_NUMEL,\n    SPECIES_CAMERUPT,\n    SPECIES_MAGCARGO,\n    SPECIES_SQUIRTLE,\n    SPECIES_WARTORTLE,\n    SPECIES_BLASTOISE,\n    SPECIES_PSYDUCK,\n    SPECIES_GOLDUCK,\n    SPECIES_POLIWAG,\n    SPECIES_POLIWHIRL,\n    SPECIES_POLITOED,\n    SPECIES_SEEL,\n    SPECIES_SHELLDER,\n    SPECIES_KRABBY,\n    SPECIES_KINGLER,\n    SPECIES_HORSEA,\n    SPECIES_SEADRA,\n    SPECIES_GOLDEEN,\n    SPECIES_SEAKING,\n    SPECIES_STARYU,\n    SPECIES_MAGIKARP,\n    SPECIES_VAPOREON,\n    SPECIES_TOTODILE,\n    SPECIES_CROCONAW,\n    SPECIES_FERALIGATR,\n    SPECIES_MARILL,\n    SPECIES_AZUMARILL,\n    SPECIES_REMORAID,\n    SPECIES_OCTILLERY,\n    SPECIES_SUICUNE,\n    SPECIES_MUDKIP,\n    SPECIES_WAILMER,\n    SPECIES_WAILORD,\n    SPECIES_CORPHISH,\n    SPECIES_FEEBAS,\n    SPECIES_MILOTIC,\n    SPECIES_CLAMPERL,\n    SPECIES_HUNTAIL,\n    SPECIES_GOREBYSS,\n    SPECIES_LUVDISC,\n    SPECIES_KYOGRE,\n    SPECIES_POLIWRATH,\n    SPECIES_GYARADOS,\n    SPECIES_MANTINE,\n    SPECIES_WINGULL,\n    SPECIES_PELIPPER,\n    SPECIES_TENTACOOL,\n    SPECIES_TENTACRUEL,\n    SPECIES_QWILFISH,\n    SPECIES_WOOPER,\n    SPECIES_QUAGSIRE,\n    SPECIES_MARSHTOMP,\n    SPECIES_SWAMPERT,\n    SPECIES_BARBOACH,\n    SPECIES_WHISCASH,\n    SPECIES_CORSOLA,\n    SPECIES_RELICANTH,\n    SPECIES_LOTAD,\n    SPECIES_LOMBRE,\n    SPECIES_LUDICOLO,\n    SPECIES_CHINCHOU,\n    SPECIES_LANTURN,\n    SPECIES_SLOWPOKE,\n    SPECIES_SLOWBRO,\n    SPECIES_SLOWKING,\n    SPECIES_STARMIE,\n    SPECIES_DEWGONG,\n    SPECIES_CLOYSTER,\n    SPECIES_LAPRAS,\n    SPECIES_KINGDRA,\n    SPECIES_CARVANHA,\n    SPECIES_SHARPEDO,\n    SPECIES_CRAWDAUNT,\n    SPECIES_BELLOSSOM,\n    SPECIES_TANGELA,\n    SPECIES_CHIKORITA,\n    SPECIES_BAYLEEF,\n    SPECIES_MEGANIUM,\n    SPECIES_SUNKERN,\n    SPECIES_SUNFLORA,\n    SPECIES_TREECKO,\n    SPECIES_GROVYLE,\n    SPECIES_SCEPTILE,\n    SPECIES_SEEDOT,\n    SPECIES_SHROOMISH,\n    SPECIES_CACNEA,\n    SPECIES_BRELOOM,\n    SPECIES_HOPPIP,\n    SPECIES_SKIPLOOM,\n    SPECIES_JUMPLUFF,\n    SPECIES_TROPIUS,\n    SPECIES_BULBASAUR,\n    SPECIES_IVYSAUR,\n    SPECIES_VENUSAUR,\n    SPECIES_ODDISH,\n    SPECIES_GLOOM,\n    SPECIES_VILEPLUME,\n    SPECIES_BELLSPROUT,\n    SPECIES_WEEPINBELL,\n    SPECIES_VICTREEBEL,\n    SPECIES_ROSELIA,\n    SPECIES_EXEGGCUTE,\n    SPECIES_EXEGGUTOR,\n    SPECIES_NUZLEAF,\n    SPECIES_SHIFTRY,\n    SPECIES_CACTURNE,\n    SPECIES_PICHU,\n    SPECIES_PIKACHU,\n    SPECIES_RAICHU,\n    SPECIES_VOLTORB,\n    SPECIES_ELECTRODE,\n    SPECIES_ELEKID,\n    SPECIES_ELECTABUZZ,\n    SPECIES_JOLTEON,\n    SPECIES_MAREEP,\n    SPECIES_FLAAFFY,\n    SPECIES_AMPHAROS,\n    SPECIES_RAIKOU,\n    SPECIES_ELECTRIKE,\n    SPECIES_MANECTRIC,\n    SPECIES_PLUSLE,\n    SPECIES_MINUN,\n    SPECIES_ZAPDOS,\n    SPECIES_MAGNEMITE,\n    SPECIES_MAGNETON,\n    SPECIES_ABRA,\n    SPECIES_KADABRA,\n    SPECIES_ALAKAZAM,\n    SPECIES_DROWZEE,\n    SPECIES_HYPNO,\n    SPECIES_MR_MIME,\n    SPECIES_ESPEON,\n    SPECIES_MEWTWO,\n    SPECIES_MEW,\n    SPECIES_UNOWN,\n    SPECIES_WYNAUT,\n    SPECIES_WOBBUFFET,\n    SPECIES_RALTS,\n    SPECIES_KIRLIA,\n    SPECIES_GARDEVOIR,\n    SPECIES_SPOINK,\n    SPECIES_GRUMPIG,\n    SPECIES_CHIMECHO,\n    SPECIES_DEOXYS,\n    SPECIES_NATU,\n    SPECIES_XATU,\n    SPECIES_LUGIA,\n    SPECIES_CELEBI,\n    SPECIES_SNORUNT,\n    SPECIES_GLALIE,\n    SPECIES_REGICE,\n    SPECIES_ARTICUNO,\n    SPECIES_DELIBIRD,\n    SPECIES_SWINUB,\n    SPECIES_PILOSWINE,\n    SPECIES_SPHEAL,\n    SPECIES_SEALEO,\n    SPECIES_WALREIN,\n    SPECIES_SMOOCHUM,\n    SPECIES_JYNX,\n    SPECIES_DRATINI,\n    SPECIES_DRAGONAIR,\n    SPECIES_BAGON,\n    SPECIES_SHELGON,\n    SPECIES_DRAGONITE,\n    SPECIES_ALTARIA,\n    SPECIES_SALAMENCE,\n    SPECIES_RAYQUAZA,\n    SPECIES_LATIAS,\n    SPECIES_LATIOS,\n    SPECIES_UMBREON,\n    SPECIES_POOCHYENA,\n    SPECIES_MIGHTYENA,\n    SPECIES_ABSOL,\n    SPECIES_MURKROW,\n    SPECIES_SABLEYE,\n    SPECIES_HOUNDOUR,\n    SPECIES_HOUNDOOM,\n    SPECIES_SNEASEL\n};\n"
  },
  {
    "path": "src/data/pokemon/pokedex_text_fr.h",
    "content": "const u8 gDummyPokedexText_FR[] = _(\n    \"This is a newly discovered POKéMON. It is\\n\"\n    \"currently under investigation. No detailed\\n\"\n    \"information is available at this time.\");\n\nconst u8 gDummyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBulbasaurPokedexText_FR[] = _(\n    \"There is a plant seed on its back right\\n\"\n    \"from the day this POKéMON is born.\\n\"\n    \"The seed slowly grows larger.\");\n\nconst u8 gBulbasaurPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gIvysaurPokedexText_FR[] = _(\n    \"There is a plant bulb on its back.\\n\"\n    \"When it absorbs nutrients, the bulb is said\\n\"\n    \"to blossom into a large flower.\");\n\nconst u8 gIvysaurPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gVenusaurPokedexText_FR[] = _(\n    \"A bewitching aroma wafts from its flower.\\n\"\n    \"The fragrance becalms those engaged in\\n\"\n    \"a battle.\");\n\nconst u8 gVenusaurPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCharmanderPokedexText_FR[] = _(\n    \"From the time it is born, a flame burns\\n\"\n    \"at the tip of its tail. Its life would end\\n\"\n    \"if the flame were to go out.\");\n\nconst u8 gCharmanderPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCharmeleonPokedexText_FR[] = _(\n    \"It lashes about with its tail to knock\\n\"\n    \"down its foe. It then tears up the fallen\\n\"\n    \"opponent with sharp claws.\");\n\nconst u8 gCharmeleonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCharizardPokedexText_FR[] = _(\n    \"Its wings can carry this POKéMON close to\\n\"\n    \"an altitude of 4,600 feet. It blows out\\n\"\n    \"fire at very high temperatures.\");\n\nconst u8 gCharizardPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSquirtlePokedexText_FR[] = _(\n    \"When it retracts its long neck into its\\n\"\n    \"shell, it squirts out water with vigorous\\n\"\n    \"force.\");\n\nconst u8 gSquirtlePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWartortlePokedexText_FR[] = _(\n    \"This POKéMON is very popular as a pet.\\n\"\n    \"Its fur-covered tail is a symbol of its\\n\"\n    \"longevity.\");\n\nconst u8 gWartortlePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBlastoisePokedexText_FR[] = _(\n    \"It crushes its foe under its heavy body\\n\"\n    \"to cause fainting. In a pinch, it will\\n\"\n    \"withdraw inside its shell.\");\n\nconst u8 gBlastoisePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCaterpiePokedexText_FR[] = _(\n    \"It is covered with a green skin. When it\\n\"\n    \"grows, it sheds the skin, covers itself\\n\"\n    \"with silk, and becomes a cocoon.\");\n\nconst u8 gCaterpiePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMetapodPokedexText_FR[] = _(\n    \"Even though it is encased in a sturdy\\n\"\n    \"shell, the body inside is tender.\\n\"\n    \"It can't withstand a harsh attack.\");\n\nconst u8 gMetapodPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gButterfreePokedexText_FR[] = _(\n    \"The wings are protected by rain-repellent\\n\"\n    \"dust. As a result, this POKéMON can fly\\n\"\n    \"about even in rain.\");\n\nconst u8 gButterfreePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWeedlePokedexText_FR[] = _(\n    \"Often found in forests and grasslands.\\n\"\n    \"It has a sharp, toxic barb of around two\\n\"\n    \"inches on top of its head.\");\n\nconst u8 gWeedlePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gKakunaPokedexText_FR[] = _(\n    \"This POKéMON is in a temporary stage\\n\"\n    \"while making its body. It is almost\\n\"\n    \"completely unable to move on its own.\");\n\nconst u8 gKakunaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBeedrillPokedexText_FR[] = _(\n    \"May appear in a swarm. Flies at violent\\n\"\n    \"speeds, all the while stabbing with the\\n\"\n    \"toxic stinger on its rear.\");\n\nconst u8 gBeedrillPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPidgeyPokedexText_FR[] = _(\n    \"Does not like to fight. It hides in\\n\"\n    \"tall grass and so on, foraging for food\\n\"\n    \"such as small bugs.\");\n\nconst u8 gPidgeyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPidgeottoPokedexText_FR[] = _(\n    \"The claws on its feet are well developed.\\n\"\n    \"It can carry prey such as an EXEGGCUTE\\n\"\n    \"to its nest over 60 miles away.\");\n\nconst u8 gPidgeottoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPidgeotPokedexText_FR[] = _(\n    \"It spreads its gorgeous wings widely to\\n\"\n    \"intimidate enemies. It races through the\\n\"\n    \"skies at Mach-2 speed.\");\n\nconst u8 gPidgeotPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRattataPokedexText_FR[] = _(\n    \"Its fangs are long and very sharp.\\n\"\n    \"They grow continuously, so it gnaws on\\n\"\n    \"hard things to whittle them down.\");\n\nconst u8 gRattataPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRaticatePokedexText_FR[] = _(\n    \"Its rear feet have three toes each.\\n\"\n    \"They are webbed, enabling it to swim\\n\"\n    \"across rivers.\");\n\nconst u8 gRaticatePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSpearowPokedexText_FR[] = _(\n    \"It busily flits around here and there.\\n\"\n    \"Even if it is frail, it can be a tough\\n\"\n    \"foe that uses MIRROR MOVE.\");\n\nconst u8 gSpearowPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gFearowPokedexText_FR[] = _(\n    \"Its huge and magnificent wings can keep it\\n\"\n    \"aloft in the sky. It can remain flying a\\n\"\n    \"whole day without landing.\");\n\nconst u8 gFearowPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gEkansPokedexText_FR[] = _(\n    \"A very common sight in grassland, etc.\\n\"\n    \"It flicks its tongue in and out to sense\\n\"\n    \"danger in its surroundings.\");\n\nconst u8 gEkansPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gArbokPokedexText_FR[] = _(\n    \"The pattern on its belly appears to be a\\n\"\n    \"frightening face. Weak foes will flee just\\n\"\n    \"at the sight of the pattern.\");\n\nconst u8 gArbokPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPikachuPokedexText_FR[] = _(\n    \"It has small electric sacs on both its\\n\"\n    \"cheeks. If threatened, it looses electric\\n\"\n    \"charges from the sacs.\");\n\nconst u8 gPikachuPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRaichuPokedexText_FR[] = _(\n    \"Its electric charges can reach even\\n\"\n    \"100,000 volts. Careless contact can cause\\n\"\n    \"even an Indian elephant to faint.\");\n\nconst u8 gRaichuPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSandshrewPokedexText_FR[] = _(\n    \"It burrows and lives underground.\\n\"\n    \"If threatened, it curls itself up into a\\n\"\n    \"ball for protection.\");\n\nconst u8 gSandshrewPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSandslashPokedexText_FR[] = _(\n    \"It is adept at attacking with the spines\\n\"\n    \"on its back and its sharp claws while\\n\"\n    \"quickly scurrying about.\");\n\nconst u8 gSandslashPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNidoranFPokedexText_FR[] = _(\n    \"Though small, it must be treated with\\n\"\n    \"caution because of its powerfully toxic\\n\"\n    \"barbs. The female has smaller horns.\");\n\nconst u8 gNidoranFPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNidorinaPokedexText_FR[] = _(\n    \"The female has a gentle temperament.\\n\"\n    \"It emits ultrasonic cries that have the\\n\"\n    \"power to befuddle foes.\");\n\nconst u8 gNidorinaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNidoqueenPokedexText_FR[] = _(\n    \"The body is covered by stiff, needle-\\n\"\n    \"like scales. If it becomes excited,\\n\"\n    \"the needles bristle outwards.\");\n\nconst u8 gNidoqueenPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNidoranMPokedexText_FR[] = _(\n    \"Its large ears are flapped like wings\\n\"\n    \"when it is listening to distant sounds.\\n\"\n    \"It extends toxic barbs when angered.\");\n\nconst u8 gNidoranMPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNidorinoPokedexText_FR[] = _(\n    \"It is easily angered. By swinging its well-\\n\"\n    \"developed horn wildly, it can even punch\\n\"\n    \"through diamond.\");\n\nconst u8 gNidorinoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNidokingPokedexText_FR[] = _(\n    \"It is recognized by its rock-hard hide\\n\"\n    \"and its extended horn. Be careful with\\n\"\n    \"the horn as it contains venom.\");\n\nconst u8 gNidokingPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gClefairyPokedexText_FR[] = _(\n    \"Its adorable appearance makes it popular\\n\"\n    \"as a pet. However, it is rare and\\n\"\n    \"difficult to find.\");\n\nconst u8 gClefairyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gClefablePokedexText_FR[] = _(\n    \"It has an acute sense of hearing. It can\\n\"\n    \"easily hear a pin being dropped nearly\\n\"\n    \"1,100 yards away.\");\n\nconst u8 gClefablePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gVulpixPokedexText_FR[] = _(\n    \"While young, it has six gorgeous tails.\\n\"\n    \"When it grows, several new tails are\\n\"\n    \"sprouted.\");\n\nconst u8 gVulpixPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNinetalesPokedexText_FR[] = _(\n    \"It has nine long tails and fur that \\n\"\n    \"gleams gold. It is said to live for \\n\"\n    \"1,000 years.\");\n\nconst u8 gNinetalesPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gJigglypuffPokedexText_FR[] = _(\n    \"It captivates foes with its huge, round\\n\"\n    \"eyes, then lulls them to sleep by singing\\n\"\n    \"a soothing melody.\");\n\nconst u8 gJigglypuffPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWigglytuffPokedexText_FR[] = _(\n    \"Its fur is extremely fine, dense, and\\n\"\n    \"supple. The exquisitely pleasant fur\\n\"\n    \"conveys an image of luxury.\");\n\nconst u8 gWigglytuffPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gZubatPokedexText_FR[] = _(\n    \"It has no eyes. Instead, it relies on\\n\"\n    \"its ultrasonic cries for echo location to\\n\"\n    \"flit about in darkness.\");\n\nconst u8 gZubatPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGolbatPokedexText_FR[] = _(\n    \"It clamps down on its prey with needle-\\n\"\n    \"sharp fangs and drains over 10 ounces of\\n\"\n    \"blood in one gulp.\");\n\nconst u8 gGolbatPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gOddishPokedexText_FR[] = _(\n    \"Its scientific name is “Oddium Wanderus.”\\n\"\n    \"At night, it is said to walk nearly 1,000\\n\"\n    \"feet on its two roots.\");\n\nconst u8 gOddishPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGloomPokedexText_FR[] = _(\n    \"Its pistils exude an incredibly foul odor.\\n\"\n    \"The horrid stench can cause fainting at a\\n\"\n    \"distance of 1.25 miles.\");\n\nconst u8 gGloomPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gVileplumePokedexText_FR[] = _(\n    \"Its petals are the largest in the world.\\n\"\n    \"It fiendishly scatters allergy-causing\\n\"\n    \"pollen from its petals.\");\n\nconst u8 gVileplumePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gParasPokedexText_FR[] = _(\n    \"Growing out of the bug's back are\\n\"\n    \"mushrooms called tochukaso. The mushrooms\\n\"\n    \"grow with the bug host.\");\n\nconst u8 gParasPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gParasectPokedexText_FR[] = _(\n    \"It scatters toxic spores from the\\n\"\n    \"mushroom cap. In China, the spores are\\n\"\n    \"used as herbal medicine.\");\n\nconst u8 gParasectPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gVenonatPokedexText_FR[] = _(\n    \"Its eyes act as radar, enabling it to be\\n\"\n    \"active in darkness. The eyes can also\\n\"\n    \"shoot powerful beams.\");\n\nconst u8 gVenonatPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gVenomothPokedexText_FR[] = _(\n    \"The wings are covered with dustlike\\n\"\n    \"scales. Every time it flaps its wings, it\\n\"\n    \"looses highly toxic dust.\");\n\nconst u8 gVenomothPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDiglettPokedexText_FR[] = _(\n    \"It burrows through the ground at a\\n\"\n    \"shallow depth. It leaves raised earth in\\n\"\n    \"its wake, making it easy to spot.\");\n\nconst u8 gDiglettPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDugtrioPokedexText_FR[] = _(\n    \"In battle, it digs through the ground and\\n\"\n    \"strikes the unsuspecting foe from an\\n\"\n    \"unexpected direction.\");\n\nconst u8 gDugtrioPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMeowthPokedexText_FR[] = _(\n    \"All it does is sleep during the daytime.\\n\"\n    \"At night, it patrols its territory with its\\n\"\n    \"eyes aglow.\");\n\nconst u8 gMeowthPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPersianPokedexText_FR[] = _(\n    \"Has a vicious temperament. Beware if it\\n\"\n    \"raises its tail straight up. It is a signal\\n\"\n    \"that it is about to pounce and bite.\");\n\nconst u8 gPersianPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPsyduckPokedexText_FR[] = _(\n    \"It is constantly wracked by a headache.\\n\"\n    \"When the headache turns intense, it begins\\n\"\n    \"using mysterious powers.\");\n\nconst u8 gPsyduckPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGolduckPokedexText_FR[] = _(\n    \"The forelegs are webbed, helping to make\\n\"\n    \"it an adept swimmer. It can be seen\\n\"\n    \"swimming elegantly in lakes, etc.\");\n\nconst u8 gGolduckPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMankeyPokedexText_FR[] = _(\n    \"Light and agile on its feet, and ferocious\\n\"\n    \"in temperament. When angered, it flies into\\n\"\n    \"an uncontrollable frenzy.\");\n\nconst u8 gMankeyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPrimeapePokedexText_FR[] = _(\n    \"It is always outrageously furious. If it\\n\"\n    \"gives chase, it will tenaciously track the\\n\"\n    \"target no matter how far.\");\n\nconst u8 gPrimeapePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGrowlithePokedexText_FR[] = _(\n    \"Very friendly and faithful to people.\\n\"\n    \"It will try to repel enemies by barking\\n\"\n    \"and biting.\");\n\nconst u8 gGrowlithePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gArcaninePokedexText_FR[] = _(\n    \"A POKéMON that is described in Chinese\\n\"\n    \"legends. It is said to race at an\\n\"\n    \"unbelievable speed.\");\n\nconst u8 gArcaninePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPoliwagPokedexText_FR[] = _(\n    \"Its slick black skin is thin and damp.\\n\"\n    \"A part of its internal organs can be seen\\n\"\n    \"through the skin as a spiral pattern.\");\n\nconst u8 gPoliwagPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPoliwhirlPokedexText_FR[] = _(\n    \"Its two legs are well developed.\\n\"\n    \"Even though it can live on the ground,\\n\"\n    \"it prefers living in water.\");\n\nconst u8 gPoliwhirlPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPoliwrathPokedexText_FR[] = _(\n    \"An adept swimmer, it knows the front\\n\"\n    \"crawl, butterfly, and more. It is faster\\n\"\n    \"than the best human swimmers.\");\n\nconst u8 gPoliwrathPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAbraPokedexText_FR[] = _(\n    \"It sleeps for 18 hours a day. It uses a\\n\"\n    \"variety of extrasensory powers even\\n\"\n    \"while asleep.\");\n\nconst u8 gAbraPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gKadabraPokedexText_FR[] = _(\n    \"It happened one morning - a boy with\\n\"\n    \"extrasensory powers awoke in bed\\n\"\n    \"transformed into KADABRA.\");\n\nconst u8 gKadabraPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAlakazamPokedexText_FR[] = _(\n    \"It does not like physical attacks very \\n\"\n    \"much. Instead, it freely uses extra-\\n\"\n    \"sensory powers to defeat foes.\");\n\nconst u8 gAlakazamPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMachopPokedexText_FR[] = _(\n    \"Its whole body is composed of muscles.\\n\"\n    \"Even though it's the size of a human\\n\"\n    \"child, it can hurl 100 grown-ups.\");\n\nconst u8 gMachopPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMachokePokedexText_FR[] = _(\n    \"Its formidable body never gets tired.\\n\"\n    \"It helps people by doing work such as\\n\"\n    \"the moving of heavy goods.\");\n\nconst u8 gMachokePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMachampPokedexText_FR[] = _(\n    \"Its four ruggedly developed arms can\\n\"\n    \"launch a flurry of 1,000 punches in just\\n\"\n    \"two seconds.\");\n\nconst u8 gMachampPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBellsproutPokedexText_FR[] = _(\n    \"Its bud looks like a human face. Because\\n\"\n    \"of the bud, it is rumored to be a type of\\n\"\n    \"legendary mandrake plant.\");\n\nconst u8 gBellsproutPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWeepinbellPokedexText_FR[] = _(\n    \"The leafy parts act as cutters for\\n\"\n    \"slashing foes. It spits a fluid that\\n\"\n    \"dissolves everything.\");\n\nconst u8 gWeepinbellPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gVictreebelPokedexText_FR[] = _(\n    \"Lures prey into its mouth with a honeylike\\n\"\n    \"aroma. The helpless prey is melted with\\n\"\n    \"a dissolving fluid.\");\n\nconst u8 gVictreebelPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTentacoolPokedexText_FR[] = _(\n    \"Its eyes are as transparent as crystals.\\n\"\n    \"From them, it shoots mysterious\\n\"\n    \"beams of light.\");\n\nconst u8 gTentacoolPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTentacruelPokedexText_FR[] = _(\n    \"It has 80 tentacles that move about\\n\"\n    \"freely. They can sting, causing poisoning\\n\"\n    \"and sharp, stabbing pain.\");\n\nconst u8 gTentacruelPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGeodudePokedexText_FR[] = _(\n    \"Its round form makes it easy to pick up.\\n\"\n    \"Some people have used them to hurl\\n\"\n    \"at each other in a snowball fight.\");\n\nconst u8 gGeodudePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGravelerPokedexText_FR[] = _(\n    \"Be careful while hiking on mountain trails.\\n\"\n    \"GRAVELER may come rolling down the path\\n\"\n    \"without slowing.\");\n\nconst u8 gGravelerPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGolemPokedexText_FR[] = _(\n    \"It is enclosed in a hard shell that is as\\n\"\n    \"rugged as slabs of rock. It sheds skin\\n\"\n    \"once a year to grow larger.\");\n\nconst u8 gGolemPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPonytaPokedexText_FR[] = _(\n    \"Its body is light, and its legs are\\n\"\n    \"incredibly powerful. It can clear\\n\"\n    \"Ayers Rock in one leap.\");\n\nconst u8 gPonytaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRapidashPokedexText_FR[] = _(\n    \"It can gallop at a top speed of 150\\n\"\n    \"miles per hour. It can race as fast as a\\n\"\n    \"bullet train while ablaze.\");\n\nconst u8 gRapidashPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSlowpokePokedexText_FR[] = _(\n    \"It is always vacantly lost in thought, but\\n\"\n    \"no one knows what it is thinking about.\\n\"\n    \"It is good at fishing with its tail.\");\n\nconst u8 gSlowpokePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSlowbroPokedexText_FR[] = _(\n    \"When a SLOWPOKE went hunting in the sea,\\n\"\n    \"its tail was bitten by a SHELLDER. That\\n\"\n    \"made it evolve into SLOWBRO.\");\n\nconst u8 gSlowbroPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMagnemitePokedexText_FR[] = _(\n    \"It moves while constantly hovering.\\n\"\n    \"It discharges THUNDER WAVE and so on\\n\"\n    \"from the units at its sides.\");\n\nconst u8 gMagnemitePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMagnetonPokedexText_FR[] = _(\n    \"A linked cluster formed of several\\n\"\n    \"MAGNEMITE. It discharges powerful\\n\"\n    \"magnetic waves at high voltage.\");\n\nconst u8 gMagnetonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gFarfetchdPokedexText_FR[] = _(\n    \"It always walks about with a plant stalk\\n\"\n    \"clamped in its beak. The stalk is used for\\n\"\n    \"building its nest.\");\n\nconst u8 gFarfetchdPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDoduoPokedexText_FR[] = _(\n    \"A two-headed POKéMON that was discovered\\n\"\n    \"as a sudden mutation. It runs at a pace\\n\"\n    \"of over 60 miles per hour.\");\n\nconst u8 gDoduoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDodrioPokedexText_FR[] = _(\n    \"An odd species that is rarely found.\\n\"\n    \"The three heads respectively represent\\n\"\n    \"joy, sadness, and anger.\");\n\nconst u8 gDodrioPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSeelPokedexText_FR[] = _(\n    \"Covered with light blue fur, its hide is\\n\"\n    \"thick and tough. It is active in bitter\\n\"\n    \"cold of minus 40 degrees Fahrenheit.\");\n\nconst u8 gSeelPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDewgongPokedexText_FR[] = _(\n    \"Its body is covered with a pure white\\n\"\n    \"fur. The colder the weather, the more\\n\"\n    \"active it becomes.\");\n\nconst u8 gDewgongPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGrimerPokedexText_FR[] = _(\n    \"Sludge exposed to X rays from the moon\\n\"\n    \"transformed into GRIMER. It loves feeding\\n\"\n    \"on filthy things.\");\n\nconst u8 gGrimerPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMukPokedexText_FR[] = _(\n    \"It is usually undetectable because it\\n\"\n    \"blends in with the ground. Touching it can\\n\"\n    \"cause terrible poisoning.\");\n\nconst u8 gMukPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gShellderPokedexText_FR[] = _(\n    \"It is encased in a shell that is harder\\n\"\n    \"than diamond. Inside, however, it is\\n\"\n    \"surprisingly tender.\");\n\nconst u8 gShellderPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCloysterPokedexText_FR[] = _(\n    \"Its shell is extremely hard. It cannot be\\n\"\n    \"shattered, even with a bomb. The shell\\n\"\n    \"opens only when it is attacking.\");\n\nconst u8 gCloysterPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGastlyPokedexText_FR[] = _(\n    \"A being that exists as a thin gas. It can\\n\"\n    \"topple an Indian elephant by enveloping\\n\"\n    \"the prey in two seconds.\");\n\nconst u8 gGastlyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHaunterPokedexText_FR[] = _(\n    \"If you get the feeling of being watched\\n\"\n    \"in darkness when nobody is around,\\n\"\n    \"HAUNTER is there.\");\n\nconst u8 gHaunterPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGengarPokedexText_FR[] = _(\n    \"It is said to emerge from darkness to\\n\"\n    \"steal the lives of those who become lost\\n\"\n    \"in mountains.\");\n\nconst u8 gGengarPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gOnixPokedexText_FR[] = _(\n    \"It usually lives underground. It searches\\n\"\n    \"for food while boring its way through the\\n\"\n    \"ground at 50 miles per hour.\");\n\nconst u8 gOnixPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDrowzeePokedexText_FR[] = _(\n    \"A descendent of the legendary animal\\n\"\n    \"baku, which is said to eat dreams. It is\\n\"\n    \"skilled at hypnotism.\");\n\nconst u8 gDrowzeePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHypnoPokedexText_FR[] = _(\n    \"It carries a pendulum-like device. There\\n\"\n    \"once was an incident in which it took \\n\"\n    \"away a child it hypnotized.\");\n\nconst u8 gHypnoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gKrabbyPokedexText_FR[] = _(\n    \"It can be found near the sea. The large\\n\"\n    \"pincers grow back if they are torn out of\\n\"\n    \"their sockets.\");\n\nconst u8 gKrabbyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gKinglerPokedexText_FR[] = _(\n    \"Its large and hard pincer has 10,000-\\n\"\n    \"horsepower strength. However, being so\\n\"\n    \"big, it is unwieldy to move.\");\n\nconst u8 gKinglerPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gVoltorbPokedexText_FR[] = _(\n    \"A life-form whose identity is unknown.\\n\"\n    \"It is said to SCREECH or suddenly\\n\"\n    \"SELFDESTRUCT.\");\n\nconst u8 gVoltorbPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gElectrodePokedexText_FR[] = _(\n    \"It explodes in response to even minor\\n\"\n    \"stimuli. It is feared, with the nickname\\n\"\n    \"of “The Bomb Ball.”\");\n\nconst u8 gElectrodePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gExeggcutePokedexText_FR[] = _(\n    \"Even though it appears to be eggs of\\n\"\n    \"some sort, it was discovered to be a life-\\n\"\n    \"form more like plant seeds.\");\n\nconst u8 gExeggcutePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gExeggutorPokedexText_FR[] = _(\n    \"It is called “The Walking Tropical\\n\"\n    \"Rainforest.” Each of the nuts has\\n\"\n    \"a face and a will of its own.\");\n\nconst u8 gExeggutorPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCubonePokedexText_FR[] = _(\n    \"It wears the skull of its dead mother on\\n\"\n    \"its head. When it becomes lonesome, it is\\n\"\n    \"said to cry loudly.\");\n\nconst u8 gCubonePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMarowakPokedexText_FR[] = _(\n    \"It is small and was originally very weak.\\n\"\n    \"Its temperament turned ferocious when it\\n\"\n    \"began using bones.\");\n\nconst u8 gMarowakPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHitmonleePokedexText_FR[] = _(\n    \"The legs freely contract and stretch.\\n\"\n    \"The stretchy legs allow it to hit a\\n\"\n    \"distant foe with a rising kick.\");\n\nconst u8 gHitmonleePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHitmonchanPokedexText_FR[] = _(\n    \"The spirit of a pro boxer has infused this\\n\"\n    \"POKéMON. It throws punches that are\\n\"\n    \"faster than a bullet train.\");\n\nconst u8 gHitmonchanPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLickitungPokedexText_FR[] = _(\n    \"Its tongue is twice the length of its\\n\"\n    \"body. It can be moved like an arm for\\n\"\n    \"grabbing food and attacking.\");\n\nconst u8 gLickitungPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gKoffingPokedexText_FR[] = _(\n    \"Its thin, balloon-like body is inflated by\\n\"\n    \"horribly toxic gases. It reeks when it is\\n\"\n    \"nearby.\");\n\nconst u8 gKoffingPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWeezingPokedexText_FR[] = _(\n    \"Very rarely, a sudden mutation can result\\n\"\n    \"in two small KOFFING twins becoming\\n\"\n    \"conjoined as a WEEZING.\");\n\nconst u8 gWeezingPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRhyhornPokedexText_FR[] = _(\n    \"Strong, but not too bright, this POKéMON\\n\"\n    \"can shatter even a skyscraper with its\\n\"\n    \"charging TACKLES.\");\n\nconst u8 gRhyhornPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRhydonPokedexText_FR[] = _(\n    \"It begins walking on its hind legs after\\n\"\n    \"evolution. It can punch holes through\\n\"\n    \"boulders with its horn.\");\n\nconst u8 gRhydonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gChanseyPokedexText_FR[] = _(\n    \"It lays several eggs a day. The eggs are\\n\"\n    \"apparently rich in nutrients and extremely\\n\"\n    \"delicious.\");\n\nconst u8 gChanseyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTangelaPokedexText_FR[] = _(\n    \"Blue plant vines cloak the POKéMON's\\n\"\n    \"identity in a tangled mass. It entangles\\n\"\n    \"anything that gets close.\");\n\nconst u8 gTangelaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gKangaskhanPokedexText_FR[] = _(\n    \"The female raises its offspring in a pouch\\n\"\n    \"on its belly. It is skilled at attacking\\n\"\n    \"using COMET PUNCH.\");\n\nconst u8 gKangaskhanPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHorseaPokedexText_FR[] = _(\n    \"It maintains balance using its tail, which\\n\"\n    \"is wound up like a coil. It may spray ink\\n\"\n    \"from its mouth.\");\n\nconst u8 gHorseaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSeadraPokedexText_FR[] = _(\n    \"Its body bristles with sharp spikes.\\n\"\n    \"Carelessly trying to touch it could cause\\n\"\n    \"fainting from the spikes.\");\n\nconst u8 gSeadraPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGoldeenPokedexText_FR[] = _(\n    \"Its dorsal and pectoral fins are strongly\\n\"\n    \"developed like muscles. It can swim at a\\n\"\n    \"speed of five knots.\");\n\nconst u8 gGoldeenPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSeakingPokedexText_FR[] = _(\n    \"The horn on its head is sharp like a\\n\"\n    \"drill. It bores a hole in a boulder to\\n\"\n    \"make its nest.\");\n\nconst u8 gSeakingPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gStaryuPokedexText_FR[] = _(\n    \"It appears in large numbers by seashores.\\n\"\n    \"At night, its central core flashes with a\\n\"\n    \"red light.\");\n\nconst u8 gStaryuPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gStarmiePokedexText_FR[] = _(\n    \"This POKéMON has a geometric body.\\n\"\n    \"Because of its body, the locals suspect\\n\"\n    \"that it is an alien creature.\");\n\nconst u8 gStarmiePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMrmimePokedexText_FR[] = _(\n    \"It is adept at conning people. It is said\\n\"\n    \"to be able to create walls out of thin\\n\"\n    \"air by miming.\");\n\nconst u8 gMrmimePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gScytherPokedexText_FR[] = _(\n    \"It tears and shreds prey with its wickedly\\n\"\n    \"sharp scythes. It very rarely spreads its\\n\"\n    \"wings to fly.\");\n\nconst u8 gScytherPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gJynxPokedexText_FR[] = _(\n    \"It speaks using a language that sounds\\n\"\n    \"human. Research is under way to determine\\n\"\n    \"what is being said.\");\n\nconst u8 gJynxPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gElectabuzzPokedexText_FR[] = _(\n    \"It loves to feed on strong electricity.\\n\"\n    \"It occasionally appears around large\\n\"\n    \"power plants and so on.\");\n\nconst u8 gElectabuzzPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMagmarPokedexText_FR[] = _(\n    \"Found near the mouth of a volcano.\\n\"\n    \"This fire-breather's body temperature is\\n\"\n    \"nearly 2,200 degrees Fahrenheit.\");\n\nconst u8 gMagmarPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPinsirPokedexText_FR[] = _(\n    \"Its two long pincer horns are powerful.\\n\"\n    \"Once they grip an enemy, they won't\\n\"\n    \"release until the foe is torn.\");\n\nconst u8 gPinsirPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTaurosPokedexText_FR[] = _(\n    \"When it is about to TACKLE, it whips\\n\"\n    \"its body repeatedly with its three\\n\"\n    \"long tails.\");\n\nconst u8 gTaurosPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMagikarpPokedexText_FR[] = _(\n    \"It is virtually worthless in terms of both\\n\"\n    \"power and speed. It is the most weak and\\n\"\n    \"pathetic POKéMON in the world.\");\n\nconst u8 gMagikarpPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGyaradosPokedexText_FR[] = _(\n    \"It has an extremely aggressive nature.\\n\"\n    \"The HYPER BEAM it shoots from its mouth\\n\"\n    \"totally incinerates all targets.\");\n\nconst u8 gGyaradosPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLaprasPokedexText_FR[] = _(\n    \"Its high intelligence enables it to\\n\"\n    \"understand human speech. It likes to ferry\\n\"\n    \"people on its back.\");\n\nconst u8 gLaprasPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDittoPokedexText_FR[] = _(\n    \"It can freely recombine its own cellular\\n\"\n    \"structure to transform into other life-\\n\"\n    \"forms.\");\n\nconst u8 gDittoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gEeveePokedexText_FR[] = _(\n    \"An extremely rare POKéMON that may\\n\"\n    \"evolve in a number of different ways\\n\"\n    \"depending on stimuli.\");\n\nconst u8 gEeveePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gVaporeonPokedexText_FR[] = _(\n    \"Its body's cellular structure is similar to\\n\"\n    \"the molecular composition of water.\\n\"\n    \"It can melt invisibly in water.\");\n\nconst u8 gVaporeonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gJolteonPokedexText_FR[] = _(\n    \"If it is angered or startled, the fur all\\n\"\n    \"over its body bristles like sharp needles\\n\"\n    \"that pierce foes.\");\n\nconst u8 gJolteonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gFlareonPokedexText_FR[] = _(\n    \"It has a flame bag inside its body. After\\n\"\n    \"inhaling deeply, it blows out flames of\\n\"\n    \"nearly 3,100 degrees Fahrenheit.\");\n\nconst u8 gFlareonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPorygonPokedexText_FR[] = _(\n    \"Using the most advanced technologies,\\n\"\n    \"scientists finally succeeded in making the\\n\"\n    \"first artificial POKéMON.\");\n\nconst u8 gPorygonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gOmanytePokedexText_FR[] = _(\n    \"A prehistoric POKéMON that lived in the\\n\"\n    \"primordial sea, it swims by twisting its\\n\"\n    \"10 tentacles about.\");\n\nconst u8 gOmanytePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gOmastarPokedexText_FR[] = _(\n    \"Its tentacles are highly developed as if\\n\"\n    \"they are hands and feet. As soon as it\\n\"\n    \"ensnares prey, it bites.\");\n\nconst u8 gOmastarPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gKabutoPokedexText_FR[] = _(\n    \"This POKéMON was regenerated from the\\n\"\n    \"fossil of an ancient creature. It protects\\n\"\n    \"itself with a hard shell.\");\n\nconst u8 gKabutoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gKabutopsPokedexText_FR[] = _(\n    \"It swims freely through water. It catches\\n\"\n    \"prey with its scythe-like arms and drains\\n\"\n    \"the victim's fluids.\");\n\nconst u8 gKabutopsPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAerodactylPokedexText_FR[] = _(\n    \"It was regenerated from a dinosaur's\\n\"\n    \"genetic matter that was found in amber.\\n\"\n    \"It flies with high-pitched cries.\");\n\nconst u8 gAerodactylPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSnorlaxPokedexText_FR[] = _(\n    \"It is not satisfied unless it eats over 880\\n\"\n    \"pounds of food every day. When it is done\\n\"\n    \"eating, it goes promptly to sleep.\");\n\nconst u8 gSnorlaxPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gArticunoPokedexText_FR[] = _(\n    \"One of the legendary bird POKéMON.\\n\"\n    \"With its long tail trailing behind, its\\n\"\n    \"flying form is magnificent.\");\n\nconst u8 gArticunoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gZapdosPokedexText_FR[] = _(\n    \"One of the legendary bird POKéMON.\\n\"\n    \"While it is flying, it makes crackling and\\n\"\n    \"snapping sounds.\");\n\nconst u8 gZapdosPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMoltresPokedexText_FR[] = _(\n    \"One of the legendary bird POKéMON.\\n\"\n    \"Those seeing it are overwhelmed by its\\n\"\n    \"orange wings that seem to be on fire.\");\n\nconst u8 gMoltresPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDratiniPokedexText_FR[] = _(\n    \"Even the young can exceed 6.5 feet in\\n\"\n    \"length. It grows larger by repeatedly\\n\"\n    \"shedding skin.\");\n\nconst u8 gDratiniPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDragonairPokedexText_FR[] = _(\n    \"It is said to live in seas and lakes.\\n\"\n    \"Even though it has no wings, it has been\\n\"\n    \"seen flying occasionally.\");\n\nconst u8 gDragonairPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDragonitePokedexText_FR[] = _(\n    \"It can fly in spite of its big and bulky\\n\"\n    \"physique. It circles the globe in just\\n\"\n    \"16 hours.\");\n\nconst u8 gDragonitePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMewtwoPokedexText_FR[] = _(\n    \"A POKéMON whose genetic code was\\n\"\n    \"repeatedly recombined for research.\\n\"\n    \"It turned vicious as a result.\");\n\nconst u8 gMewtwoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMewPokedexText_FR[] = _(\n    \"A POKéMON of South America that was\\n\"\n    \"thought to have been extinct. It is very\\n\"\n    \"intelligent and learns any move.\");\n\nconst u8 gMewPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gChikoritaPokedexText_FR[] = _(\n    \"Its pleasantly aromatic leaf has the\\n\"\n    \"ability to check the humidity and\\n\"\n    \"temperature.\"\n);\n\nconst u8 gChikoritaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBayleefPokedexText_FR[] = _(\n    \"A spicy aroma emanates from around its\\n\"\n    \"neck. The aroma acts as a stimulant to\\n\"\n    \"restore health.\");\n\nconst u8 gBayleefPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMeganiumPokedexText_FR[] = _(\n    \"MEGANIUM's breath has the power to revive\\n\"\n    \"dead grass and plants. It can make them\\n\"\n    \"healthy again.\");\n\nconst u8 gMeganiumPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCyndaquilPokedexText_FR[] = _(\n    \"It usually stays hunched over. If it is\\n\"\n    \"angry or surprised, it shoots flames out\\n\"\n    \"of its back.\");\n\nconst u8 gCyndaquilPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gQuilavaPokedexText_FR[] = _(\n    \"This POKéMON is fully covered by\\n\"\n    \"nonflammable fur. It can withstand any\\n\"\n    \"kind of fire attack.\");\n\nconst u8 gQuilavaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTyphlosionPokedexText_FR[] = _(\n    \"It has a secret, devastating move. It\\n\"\n    \"rubs its blazing fur together to cause\\n\"\n    \"huge explosions.\");\n\nconst u8 gTyphlosionPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTotodilePokedexText_FR[] = _(\n    \"It is small but rough and tough. It won't\\n\"\n    \"hesitate to take a bite out of anything\\n\"\n    \"that moves.\");\n\nconst u8 gTotodilePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCroconawPokedexText_FR[] = _(\n    \"It opens its huge jaws wide when\\n\"\n    \"attacking. If it loses any fangs while\\n\"\n    \"biting, they grow back in.\");\n\nconst u8 gCroconawPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gFeraligatrPokedexText_FR[] = _(\n    \"It is hard for it to support its own\\n\"\n    \"weight out of water, so it gets down on\\n\"\n    \"all fours. But it moves fast.\");\n\nconst u8 gFeraligatrPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSentretPokedexText_FR[] = _(\n    \"It stands on its tail so it can see a long\\n\"\n    \"way. If it spots an enemy, it cries loudly\\n\"\n    \"to warn its kind.\");\n\nconst u8 gSentretPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gFurretPokedexText_FR[] = _(\n    \"There is no telling where its tail begins.\\n\"\n    \"Despite its short legs, it is quick at\\n\"\n    \"hunting RATTATA.\");\n\nconst u8 gFurretPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHoothootPokedexText_FR[] = _(\n    \"It has a perfect sense of time. Whatever\\n\"\n    \"happens, it keeps rhythm by precisely\\n\"\n    \"tilting its head in time.\");\n\nconst u8 gHoothootPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNoctowlPokedexText_FR[] = _(\n    \"When it needs to think, it rotates its head\\n\"\n    \"180 degrees to sharpen its intellectual\\n\"\n    \"power.\");\n\nconst u8 gNoctowlPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLedybaPokedexText_FR[] = _(\n    \"When the weather turns cold, numerous\\n\"\n    \"LEDYBA gather from everywhere to cluster\\n\"\n    \"and keep each other warm.\");\n\nconst u8 gLedybaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLedianPokedexText_FR[] = _(\n    \"The star patterns on its back grow larger\\n\"\n    \"or smaller depending on the number of\\n\"\n    \"stars in the night sky.\");\n\nconst u8 gLedianPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSpinarakPokedexText_FR[] = _(\n    \"It spins a web using fine--but durable--\\n\"\n    \"thread. It then waits patiently for prey\\n\"\n    \"to be trapped.\");\n\nconst u8 gSpinarakPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAriadosPokedexText_FR[] = _(\n    \"A single strand of a special string is\\n\"\n    \"endlessly spun out of its rear. The string\\n\"\n    \"leads back to its nest.\");\n\nconst u8 gAriadosPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCrobatPokedexText_FR[] = _(\n    \"The development of wings on its legs\\n\"\n    \"enables it to fly fast but also makes it\\n\"\n    \"tough to stop and rest.\");\n\nconst u8 gCrobatPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gChinchouPokedexText_FR[] = _(\n    \"On the dark ocean floor, its only means\\n\"\n    \"of communication is its constantly\\n\"\n    \"flashing lights.\");\n\nconst u8 gChinchouPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLanturnPokedexText_FR[] = _(\n    \"It blinds prey with an intense burst of\\n\"\n    \"light, then swallows the immobilized prey\\n\"\n    \"in a single gulp.\");\n\nconst u8 gLanturnPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPichuPokedexText_FR[] = _(\n    \"Despite its small size, it can zap even\\n\"\n    \"adult humans. However, if it does so, it\\n\"\n    \"also surprises itself.\");\n\nconst u8 gPichuPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCleffaPokedexText_FR[] = _(\n    \"When numerous meteors illuminate the\\n\"\n    \"night sky, sightings of CLEFFA strangely\\n\"\n    \"increase.\");\n\nconst u8 gCleffaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gIgglybuffPokedexText_FR[] = _(\n    \"Its extremely flexible and elastic body\\n\"\n    \"makes it bounce continuously--anytime,\\n\"\n    \"anywhere.\");\n\nconst u8 gIgglybuffPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTogepiPokedexText_FR[] = _(\n    \"A proverb claims that happiness will come\\n\"\n    \"to anyone who can make a sleeping TOGEPI\\n\"\n    \"stand up.\");\n\nconst u8 gTogepiPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTogeticPokedexText_FR[] = _(\n    \"It grows dispirited if it is not with kind\\n\"\n    \"people. It can float in midair without\\n\"\n    \"moving its wings.\");\n\nconst u8 gTogeticPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNatuPokedexText_FR[] = _(\n    \"It usually forages for food on the ground\\n\"\n    \"but may, on rare occasions, hop onto\\n\"\n    \"branches to peck at shoots.\");\n\nconst u8 gNatuPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gXatuPokedexText_FR[] = _(\n    \"In South America, it is said that its right\\n\"\n    \"eye sees the future and its left eye\\n\"\n    \"views the past.\");\n\nconst u8 gXatuPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMareepPokedexText_FR[] = _(\n    \"Its fleece grows continually. In the\\n\"\n    \"summer, the fleece is fully shed, but it\\n\"\n    \"grows back in a week.\");\n\nconst u8 gMareepPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gFlaaffyPokedexText_FR[] = _(\n    \"Its fluffy fleece easily stores\\n\"\n    \"electricity. Its rubbery hide keeps it\\n\"\n    \"from being electrocuted.\");\n\nconst u8 gFlaaffyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAmpharosPokedexText_FR[] = _(\n    \"The bright light on its tail can be seen\\n\"\n    \"far away. It has been treasured since\\n\"\n    \"ancient times as a beacon.\");\n\nconst u8 gAmpharosPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBellossomPokedexText_FR[] = _(\n    \"Plentiful in the tropics. When it dances,\\n\"\n    \"its petals rub together and make a\\n\"\n    \"pleasant ringing sound.\");\n\nconst u8 gBellossomPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMarillPokedexText_FR[] = _(\n    \"The end of its tail serves as a buoy that\\n\"\n    \"keeps it from drowning, even in a vicious\\n\"\n    \"current.\");\n\nconst u8 gMarillPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAzumarillPokedexText_FR[] = _(\n    \"When it plays in water, it rolls up its\\n\"\n    \"elongated ears to prevent their insides\\n\"\n    \"from getting wet.\");\n\nconst u8 gAzumarillPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSudowoodoPokedexText_FR[] = _(\n    \"It disguises itself as a tree to avoid\\n\"\n    \"attack. It hates water, so it will\\n\"\n    \"disappear if it starts raining.\");\n\nconst u8 gSudowoodoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPolitoedPokedexText_FR[] = _(\n    \"Whenever three or more of these get\\n\"\n    \"together, they sing in a loud voice that\\n\"\n    \"sounds like bellowing.\");\n\nconst u8 gPolitoedPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHoppipPokedexText_FR[] = _(\n    \"Its body is so light, it must grip the\\n\"\n    \"ground firmly with its feet to keep from\\n\"\n    \"being blown away.\");\n\nconst u8 gHoppipPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSkiploomPokedexText_FR[] = _(\n    \"It spreads its petals to absorb sunlight.\\n\"\n    \"It also floats in the air to get closer to\\n\"\n    \"the sun.\");\n\nconst u8 gSkiploomPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gJumpluffPokedexText_FR[] = _(\n    \"It drifts on seasonal winds and spreads\\n\"\n    \"its cotton-like spores all over the world \\n\"\n    \"to make more offspring.\");\n\nconst u8 gJumpluffPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAipomPokedexText_FR[] = _(\n    \"It lives atop tall trees. When leaping\\n\"\n    \"from branch to branch, it deftly uses its\\n\"\n    \"tail for balance.\");\n\nconst u8 gAipomPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSunkernPokedexText_FR[] = _(\n    \"It lives by drinking only dewdrops from\\n\"\n    \"under the leaves of plants. It is said\\n\"\n    \"that it eats nothing else.\");\n\nconst u8 gSunkernPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSunfloraPokedexText_FR[] = _(\n    \"In the daytime, it rushes about in a\\n\"\n    \"hectic manner, but it comes to a complete\\n\"\n    \"stop when the sun sets.\");\n\nconst u8 gSunfloraPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gYanmaPokedexText_FR[] = _(\n    \"Its large eyes can scan 360 degrees.\\n\"\n    \"It looks in all directions to seek out\\n\"\n    \"insects as its prey.\");\n\nconst u8 gYanmaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWooperPokedexText_FR[] = _(\n    \"When it walks around on the ground,\\n\"\n    \"it coats its body with a slimy, poisonous\\n\"\n    \"film.\");\n\nconst u8 gWooperPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gQuagsirePokedexText_FR[] = _(\n    \"Due to its relaxed and carefree attitude,\\n\"\n    \"it often bumps its head on boulders and\\n\"\n    \"boat hulls as it swims.\");\n\nconst u8 gQuagsirePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gEspeonPokedexText_FR[] = _(\n    \"By reading air currents, it can predict\\n\"\n    \"things such as the weather or its foe's\\n\"\n    \"next move.\");\n\nconst u8 gEspeonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gUmbreonPokedexText_FR[] = _(\n    \"When darkness falls, the rings on its body\\n\"\n    \"begin to glow, striking fear in the hearts\\n\"\n    \"of anyone nearby.\");\n\nconst u8 gUmbreonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMurkrowPokedexText_FR[] = _(\n    \"It is said that when chased, it lures its\\n\"\n    \"attacker onto dark mountain trails where\\n\"\n    \"the foe will get lost.\");\n\nconst u8 gMurkrowPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSlowkingPokedexText_FR[] = _(\n    \"When its head was bitten, toxins entered\\n\"\n    \"SLOWPOKE's head and unlocked an\\n\"\n    \"extraordinary power.\");\n\nconst u8 gSlowkingPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMisdreavusPokedexText_FR[] = _(\n    \"It loves to bite and yank people's hair\\n\"\n    \"from behind without warning, just to see\\n\"\n    \"their shocked reactions.\");\n\nconst u8 gMisdreavusPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gUnownPokedexText_FR[] = _(\n    \"Its flat, thin body is always stuck on\\n\"\n    \"walls. Its shape appears to have some\\n\"\n    \"meaning.\");\n\nconst u8 gUnownPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWobbuffetPokedexText_FR[] = _(\n    \"To keep its pitch-black tail hidden, it\\n\"\n    \"lives quietly in the darkness. It is never\\n\"\n    \"first to attack.\");\n\nconst u8 gWobbuffetPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGirafarigPokedexText_FR[] = _(\n    \"Its tail, which also contains a small\\n\"\n    \"brain, may bite on its own if it notices an\\n\"\n    \"alluring smell.\");\n\nconst u8 gGirafarigPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPinecoPokedexText_FR[] = _(\n    \"It hangs and waits for flying-insect prey\\n\"\n    \"to come near. It does not move about\\n\"\n    \"much on its own.\");\n\nconst u8 gPinecoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gForretressPokedexText_FR[] = _(\n    \"It remains immovably rooted to its tree.\\n\"\n    \"It scatters pieces of its hard shell to\\n\"\n    \"drive its enemies away.\");\n\nconst u8 gForretressPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDunsparcePokedexText_FR[] = _(\n    \"If spotted, it escapes by burrowing with\\n\"\n    \"its tail. It can hover just slightly using\\n\"\n    \"its wings.\");\n\nconst u8 gDunsparcePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGligarPokedexText_FR[] = _(\n    \"It usually clings to cliffs. When it spots\\n\"\n    \"its prey, it spreads its wings and glides\\n\"\n    \"down to attack.\");\n\nconst u8 gGligarPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSteelixPokedexText_FR[] = _(\n    \"It is said that if an ONIX lives for over\\n\"\n    \"100 years, its composition changes to\\n\"\n    \"become diamond-like.\");\n\nconst u8 gSteelixPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSnubbullPokedexText_FR[] = _(\n    \"It has an active, playful nature. Many\\n\"\n    \"women like to frolic with it because of\\n\"\n    \"its affectionate ways.\");\n\nconst u8 gSnubbullPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGranbullPokedexText_FR[] = _(\n    \"Because its fangs are too heavy, it\\n\"\n    \"always keeps its head tilted down.\\n\"\n    \"However, its BITE is powerful.\");\n\nconst u8 gGranbullPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gQwilfishPokedexText_FR[] = _(\n    \"The small spikes covering its body\\n\"\n    \"developed from scales. They inject a\\n\"\n    \"toxin that causes fainting.\");\n\nconst u8 gQwilfishPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gScizorPokedexText_FR[] = _(\n    \"Its wings are not used for flying.\\n\"\n    \"They are flapped at high speed to adjust\\n\"\n    \"its body temperature.\");\n\nconst u8 gScizorPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gShucklePokedexText_FR[] = _(\n    \"It stores BERRIES inside its shell.\\n\"\n    \"To avoid attacks, it hides beneath rocks\\n\"\n    \"and remains completely still.\");\n\nconst u8 gShucklePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHeracrossPokedexText_FR[] = _(\n    \"Usually docile, but if disturbed while\\n\"\n    \"sipping honey, it chases off the intruder\\n\"\n    \"with its horn.\");\n\nconst u8 gHeracrossPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSneaselPokedexText_FR[] = _(\n    \"Vicious in nature, it drives PIDGEY from\\n\"\n    \"their nests and feasts on the eggs that\\n\"\n    \"are left behind.\");\n\nconst u8 gSneaselPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTeddiursaPokedexText_FR[] = _(\n    \"Before food becomes scarce in wintertime,\\n\"\n    \"its habit is to hoard food in many hidden\\n\"\n    \"locations.\");\n\nconst u8 gTeddiursaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gUrsaringPokedexText_FR[] = _(\n    \"With its ability to distinguish any smell,\\n\"\n    \"it unfailingly finds all food buried deep\\n\"\n    \"underground.\");\n\nconst u8 gUrsaringPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSlugmaPokedexText_FR[] = _(\n    \"A common sight in volcanic areas, it\\n\"\n    \"slowly slithers around in a constant\\n\"\n    \"search for warm places.\");\n\nconst u8 gSlugmaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMagcargoPokedexText_FR[] = _(\n    \"Its brittle shell occasionally spouts\\n\"\n    \"intense flames that circulate throughout\\n\"\n    \"its body.\");\n\nconst u8 gMagcargoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSwinubPokedexText_FR[] = _(\n    \"If it smells something enticing, it dashes\\n\"\n    \"off headlong to find the source of the\\n\"\n    \"aroma.\");\n\nconst u8 gSwinubPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPiloswinePokedexText_FR[] = _(\n    \"If it charges at an enemy, the hairs on\\n\"\n    \"its back stand up straight. It is very\\n\"\n    \"sensitive to sound.\");\n\nconst u8 gPiloswinePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCorsolaPokedexText_FR[] = _(\n    \"In a south sea nation, the people live in\\n\"\n    \"communities that are built on groups of\\n\"\n    \"these POKéMON.\");\n\nconst u8 gCorsolaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRemoraidPokedexText_FR[] = _(\n    \"Using its dorsal fin as a suction pad, it\\n\"\n    \"clings to a MANTINE's underside to\\n\"\n    \"scavenge for leftovers.\");\n\nconst u8 gRemoraidPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gOctilleryPokedexText_FR[] = _(\n    \"It instinctively sneaks into rocky holes.\\n\"\n    \"If it gets sleepy, it steals the nest of a\\n\"\n    \"fellow OCTILLERY.\");\n\nconst u8 gOctilleryPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDelibirdPokedexText_FR[] = _(\n    \"It nests at the edge of sharp cliffs.\\n\"\n    \"It spends all day carrying food to its\\n\"\n    \"awaiting chicks.\");\n\nconst u8 gDelibirdPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMantinePokedexText_FR[] = _(\n    \"Swimming freely in open seas, it may fly\\n\"\n    \"out of the water and over the waves if it\\n\"\n    \"builds up enough speed.\");\n\nconst u8 gMantinePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSkarmoryPokedexText_FR[] = _(\n    \"After nesting in bramble bushes, the wings\\n\"\n    \"of its chicks grow hard from scratches by\\n\"\n    \"thorns.\");\n\nconst u8 gSkarmoryPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHoundourPokedexText_FR[] = _(\n    \"To corner prey, they check each other's\\n\"\n    \"location using barks that only they can\\n\"\n    \"understand.\");\n\nconst u8 gHoundourPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHoundoomPokedexText_FR[] = _(\n    \"Upon hearing its eerie howls, other\\n\"\n    \"POKéMON get the shivers and head straight\\n\"\n    \"back to their nests.\");\n\nconst u8 gHoundoomPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gKingdraPokedexText_FR[] = _(\n    \"It sleeps deep on the ocean floor to\\n\"\n    \"build its energy. It is said to cause\\n\"\n    \"tornadoes as it wakes.\");\n\nconst u8 gKingdraPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPhanpyPokedexText_FR[] = _(\n    \"As a sign of affection, it bumps with its\\n\"\n    \"snout. However, it is so strong, it may\\n\"\n    \"send you flying.\");\n\nconst u8 gPhanpyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDonphanPokedexText_FR[] = _(\n    \"The longer and bigger its tusks, the\\n\"\n    \"higher its rank in its herd. The tusks take\\n\"\n    \"a long time to grow.\");\n\nconst u8 gDonphanPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPorygon2PokedexText_FR[] = _(\n    \"Further research enhanced its abilities.\\n\"\n    \"Sometimes, it may exhibit motions that\\n\"\n    \"were not programmed.\");\n\nconst u8 gPorygon2PokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gStantlerPokedexText_FR[] = _(\n    \"Those who stare at its antlers will\\n\"\n    \"gradually lose control of their senses\\n\"\n    \"and be unable to stand.\");\n\nconst u8 gStantlerPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSmearglePokedexText_FR[] = _(\n    \"Once it becomes an adult, it has a\\n\"\n    \"tendency to let its comrades plant\\n\"\n    \"footprints on its back.\");\n\nconst u8 gSmearglePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTyroguePokedexText_FR[] = _(\n    \"Even though it is small, it can't be\\n\"\n    \"ignored because it will slug any handy\\n\"\n    \"target without warning.\");\n\nconst u8 gTyroguePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHitmontopPokedexText_FR[] = _(\n    \"It launches kicks while spinning. If it\\n\"\n    \"spins at high speed, it may bore its way\\n\"\n    \"into the ground.\");\n\nconst u8 gHitmontopPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSmoochumPokedexText_FR[] = _(\n    \"It always rocks its head slowly backwards\\n\"\n    \"and forwards as if it is trying to kiss\\n\"\n    \"someone.\");\n\nconst u8 gSmoochumPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gElekidPokedexText_FR[] = _(\n    \"Even in the most vicious storm, this\\n\"\n    \"POKéMON plays happily if thunder rumbles\\n\"\n    \"in the sky.\");\n\nconst u8 gElekidPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMagbyPokedexText_FR[] = _(\n    \"It is found in volcanic craters. Its body\\n\"\n    \"heat exceeds 1,100 degrees Fahrenheit,\\n\"\n    \"so don't underestimate it.\");\n\nconst u8 gMagbyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMiltankPokedexText_FR[] = _(\n    \"If it has just had a baby, the milk it\\n\"\n    \"produces contains much more nutrition than\\n\"\n    \"usual.\");\n\nconst u8 gMiltankPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBlisseyPokedexText_FR[] = _(\n    \"It has a very compassionate nature. If it\\n\"\n    \"sees a sick POKéMON, it will nurse the\\n\"\n    \"sufferer back to health.\");\n\nconst u8 gBlisseyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRaikouPokedexText_FR[] = _(\n    \"This POKéMON races across the\\n\"\n    \"land while barking a cry that sounds\\n\"\n    \"like crashing thunder.\");\n\nconst u8 gRaikouPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gEnteiPokedexText_FR[] = _(\n    \"A POKéMON that races across the land.\\n\"\n    \"It is said that one is born every time a\\n\"\n    \"new volcano appears.\");\n\nconst u8 gEnteiPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSuicunePokedexText_FR[] = _(\n    \"This POKéMON races across the land.\\n\"\n    \"It is said that north winds will somehow\\n\"\n    \"blow whenever it appears.\");\n\nconst u8 gSuicunePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLarvitarPokedexText_FR[] = _(\n    \"It is born deep underground. It can't\\n\"\n    \"emerge until it has entirely consumed the\\n\"\n    \"soil around it.\");\n\nconst u8 gLarvitarPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPupitarPokedexText_FR[] = _(\n    \"Even sealed in its shell, it can move\\n\"\n    \"freely. Hard and fast, it has outstanding\\n\"\n    \"destructive power.\");\n\nconst u8 gPupitarPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTyranitarPokedexText_FR[] = _(\n    \"It has an impudent nature. Having great\\n\"\n    \"strength, it can even change surrounding\\n\"\n    \"landforms.\"\n);\n\nconst u8 gTyranitarPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLugiaPokedexText_FR[] = _(\n    \"It is said to be the guardian of the seas.\\n\"\n    \"It is rumored to have been seen on the\\n\"\n    \"night of a storm.\");\n\nconst u8 gLugiaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHoOhPokedexText_FR[] = _(\n    \"A legend says that its body glows in\\n\"\n    \"seven colors. A rainbow is said to form\\n\"\n    \"behind it when it flies.\");\n\nconst u8 gHoOhPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCelebiPokedexText_FR[] = _(\n    \"When CELEBI disappears deep in a forest,\\n\"\n    \"it is said to leave behind an egg it\\n\"\n    \"brought from the future.\");\n\nconst u8 gCelebiPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTreeckoPokedexText_FR[] = _(\n    \"It quickly scales even vertical walls.\\n\"\n    \"It senses humidity with its tail to predict\\n\"\n    \"the next day's weather.\");\n\nconst u8 gTreeckoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGrovylePokedexText_FR[] = _(\n    \"Its strongly developed thigh muscles\\n\"\n    \"give it astounding agility and jumping\\n\"\n    \"performance.\");\n\nconst u8 gGrovylePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSceptilePokedexText_FR[] = _(\n    \"The leaves on its forelegs are as sharp\\n\"\n    \"as swords. It agilely leaps about the\\n\"\n    \"branches of trees to strike.\");\n\nconst u8 gSceptilePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTorchicPokedexText_FR[] = _(\n    \"It has a flame sac inside its belly that\\n\"\n    \"perpetually burns. It feels warm if it is\\n\"\n    \"hugged.\");\n\nconst u8 gTorchicPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCombuskenPokedexText_FR[] = _(\n    \"It boosts its concentration by emitting\\n\"\n    \"harsh cries. Its kicks have outstanding\\n\"\n    \"destructive power.\");\n\nconst u8 gCombuskenPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBlazikenPokedexText_FR[] = _(\n    \"When facing a tough foe, it looses flames\\n\"\n    \"from its wrists. Its powerful legs let it\\n\"\n    \"jump clear over buildings.\");\n\nconst u8 gBlazikenPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMudkipPokedexText_FR[] = _(\n    \"Its large tail fin propels it through\\n\"\n    \"water with powerful acceleration. It is\\n\"\n    \"strong in spite of its size.\");\n\nconst u8 gMudkipPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMarshtompPokedexText_FR[] = _(\n    \"It is at its best when on muddy ground\\n\"\n    \"with poor footing. It quickly overwhelms\\n\"\n    \"foes struggling in mud.\");\n\nconst u8 gMarshtompPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSwampertPokedexText_FR[] = _(\n    \"Its arms are rock-hard. With one swing,\\n\"\n    \"they can batter down its foe. It makes its\\n\"\n    \"nest on beautiful beaches.\");\n\nconst u8 gSwampertPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPoochyenaPokedexText_FR[] = _(\n    \"It has a very tenacious nature. Its acute\\n\"\n    \"sense of smell lets it chase a chosen\\n\"\n    \"prey without ever losing track.\");\n\nconst u8 gPoochyenaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMightyenaPokedexText_FR[] = _(\n    \"It will always obey the commands of a\\n\"\n    \"skilled TRAINER. Its behavior arises from\\n\"\n    \"its living in packs in ancient times.\");\n\nconst u8 gMightyenaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gZigzagoonPokedexText_FR[] = _(\n    \"A POKéMON with abundant curiosity.\\n\"\n    \"It shows an interest in everything, so it\\n\"\n    \"always zigs and zags.\");\n\nconst u8 gZigzagoonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLinoonePokedexText_FR[] = _(\n    \"When running in a straight line, it can top\\n\"\n    \"60 miles per hour. However, it has a\\n\"\n    \"tough time with curved roads.\");\n\nconst u8 gLinoonePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWurmplePokedexText_FR[] = _(\n    \"It lives amidst tall grass and in forests.\\n\"\n    \"When attacked, it resists by pointing its\\n\"\n    \"venomous spikes at the foe.\");\n\nconst u8 gWurmplePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSilcoonPokedexText_FR[] = _(\n    \"It conserves its energy by moving as\\n\"\n    \"little as possible. It awaits evolution\\n\"\n    \"while drinking only a little rainwater.\");\n\nconst u8 gSilcoonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBeautiflyPokedexText_FR[] = _(\n    \"Despite its appearance, it has an\\n\"\n    \"aggressive nature. It attacks by jabbing\\n\"\n    \"with its long, thin mouth.\");\n\nconst u8 gBeautiflyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCascoonPokedexText_FR[] = _(\n    \"Its body, which is made of soft silk,\\n\"\n    \"hardens over time. When cracks appear,\\n\"\n    \"evolution is near.\");\n\nconst u8 gCascoonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDustoxPokedexText_FR[] = _(\n    \"It scatters horribly toxic dust when it\\n\"\n    \"senses danger. They tend to gather in the\\n\"\n    \"glow of streetlamps at night.\");\n\nconst u8 gDustoxPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLotadPokedexText_FR[] = _(\n    \"It searches about for clean water. If it\\n\"\n    \"does not drink water for too long, the\\n\"\n    \"leaf on its head wilts.\");\n\nconst u8 gLotadPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLombrePokedexText_FR[] = _(\n    \"It lives at the water's edge where it is\\n\"\n    \"sunny. It sleeps on a bed of water grass\\n\"\n    \"by day and becomes active at night.\");\n\nconst u8 gLombrePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLudicoloPokedexText_FR[] = _(\n    \"The rhythm of bright, festive music\\n\"\n    \"activates LUDICOLO's cells, making it more\\n\"\n    \"powerful.\");\n\nconst u8 gLudicoloPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSeedotPokedexText_FR[] = _(\n    \"If it remains still, it becomes impossible\\n\"\n    \"to distinguish from real nuts. It delights\\n\"\n    \"in surprising foraging PIDGEY.\");\n\nconst u8 gSeedotPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNuzleafPokedexText_FR[] = _(\n    \"They live in holes bored in large trees.\\n\"\n    \"The sound of NUZLEAF's grass flute fills\\n\"\n    \"listeners with dread.\");\n\nconst u8 gNuzleafPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gShiftryPokedexText_FR[] = _(\n    \"A POKéMON that was feared as a forest\\n\"\n    \"guardian. It can read the foe's mind and\\n\"\n    \"take preemptive action.\");\n\nconst u8 gShiftryPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTaillowPokedexText_FR[] = _(\n    \"It dislikes cold seasons. They migrate to\\n\"\n    \"other lands in search of warmth, flying\\n\"\n    \"over 180 miles a day.\");\n\nconst u8 gTaillowPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSwellowPokedexText_FR[] = _(\n    \"If its two tail feathers are standing at\\n\"\n    \"attention, it is proof of good health.\\n\"\n    \"It soars elegantly in the sky.\");\n\nconst u8 gSwellowPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWingullPokedexText_FR[] = _(\n    \"It rides upon ocean winds as if it were\\n\"\n    \"a glider. In the winter, it hides food\\n\"\n    \"around its nest.\");\n\nconst u8 gWingullPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPelipperPokedexText_FR[] = _(\n    \"It is a flying transporter that carries\\n\"\n    \"small POKéMON in its beak. It bobs on the\\n\"\n    \"waves to rest its wings.\");\n\nconst u8 gPelipperPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRaltsPokedexText_FR[] = _(\n    \"It is highly attuned to the emotions of\\n\"\n    \"people and POKéMON. It hides if it senses\\n\"\n    \"hostility.\");\n\nconst u8 gRaltsPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gKirliaPokedexText_FR[] = _(\n    \"The cheerful spirit of its TRAINER gives\\n\"\n    \"it energy for its psychokinetic power.\\n\"\n    \"It spins and dances when happy.\");\n\nconst u8 gKirliaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGardevoirPokedexText_FR[] = _(\n    \"It has the power to predict the future.\\n\"\n    \"Its power peaks when it is protecting its\\n\"\n    \"TRAINER.\");\n\nconst u8 gGardevoirPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSurskitPokedexText_FR[] = _(\n    \"They usually live on ponds, but after an\\n\"\n    \"evening shower, they may appear on\\n\"\n    \"puddles in towns.\");\n\nconst u8 gSurskitPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMasquerainPokedexText_FR[] = _(\n    \"The antennae have distinctive patterns\\n\"\n    \"that look like eyes. When it rains, they\\n\"\n    \"grow heavy, making flight impossible.\");\n\nconst u8 gMasquerainPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gShroomishPokedexText_FR[] = _(\n    \"It prefers damp places. By day it remains\\n\"\n    \"still in the forest shade. It releases\\n\"\n    \"toxic powder from its head.\");\n\nconst u8 gShroomishPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBreloomPokedexText_FR[] = _(\n    \"The seeds on its tail are made of toxic\\n\"\n    \"spores. It knocks out foes with quick,\\n\"\n    \"virtually invisible punches.\");\n\nconst u8 gBreloomPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSlakothPokedexText_FR[] = _(\n    \"It sleeps for 20 hours every day. Making\\n\"\n    \"drowsy those that see it is one of\\n\"\n    \"its abilities.\");\n\nconst u8 gSlakothPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gVigorothPokedexText_FR[] = _(\n    \"It is always hungry because it won't stop\\n\"\n    \"rampaging. Even while it is eating, it\\n\"\n    \"can't keep still.\");\n\nconst u8 gVigorothPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSlakingPokedexText_FR[] = _(\n    \"It is the world's most slothful POKéMON.\\n\"\n    \"However, it can exert horrifying power by\\n\"\n    \"releasing pent-up energy all at once.\");\n\nconst u8 gSlakingPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNincadaPokedexText_FR[] = _(\n    \"Because it lived almost entirely\\n\"\n    \"underground, it is nearly blind.\\n\"\n    \"It uses its antennae instead.\");\n\nconst u8 gNincadaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNinjaskPokedexText_FR[] = _(\n    \"This POKéMON is so quick, it is said to\\n\"\n    \"be able to avoid any attack. It loves to\\n\"\n    \"feed on tree sap.\");\n\nconst u8 gNinjaskPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gShedinjaPokedexText_FR[] = _(\n    \"A most peculiar POKéMON that somehow\\n\"\n    \"appears in a POKé BALL when a NINCADA\\n\"\n    \"evolves.\");\n\nconst u8 gShedinjaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWhismurPokedexText_FR[] = _(\n    \"It usually murmurs, but starts crying\\n\"\n    \"loudly if it senses danger. It stops when\\n\"\n    \"its ear covers are shut.\");\n\nconst u8 gWhismurPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLoudredPokedexText_FR[] = _(\n    \"When it stamps its feet and bellows, it\\n\"\n    \"generates ultrasonic waves that can blow\\n\"\n    \"apart a house.\");\n\nconst u8 gLoudredPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gExploudPokedexText_FR[] = _(\n    \"It emits a variety of sounds from the \\n\"\n    \"holes all over its body. Its loud cries\\n\"\n    \"can be heard from over six miles away.\");\n\nconst u8 gExploudPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMakuhitaPokedexText_FR[] = _(\n    \"It grows stronger by enduring harsh\\n\"\n    \"training. It is a gutsy POKéMON that can\\n\"\n    \"withstand any attack.\");\n\nconst u8 gMakuhitaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHariyamaPokedexText_FR[] = _(\n    \"It stomps on the ground to build power.\\n\"\n    \"It can send a 10-ton truck flying with a\\n\"\n    \"straight-arm punch.\");\n\nconst u8 gHariyamaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAzurillPokedexText_FR[] = _(\n    \"It battles by flinging around its tail,\\n\"\n    \"which is bigger than its body. The\\n\"\n    \"tail is a flotation device in water.\");\n\nconst u8 gAzurillPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNosepassPokedexText_FR[] = _(\n    \"Its magnetic nose consistently faces\\n\"\n    \"north. Travelers check NOSEPASS to get\\n\"\n    \"their bearings.\");\n\nconst u8 gNosepassPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSkittyPokedexText_FR[] = _(\n    \"It is said to be difficult to earn its\\n\"\n    \"trust. However, it is extremely popular\\n\"\n    \"for its cute looks and behavior.\");\n\nconst u8 gSkittyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDelcattyPokedexText_FR[] = _(\n    \"The favorite of trend-conscious\\n\"\n    \"female TRAINERS, they are used in\\n\"\n    \"competition for their style and fur.\");\n\nconst u8 gDelcattyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSableyePokedexText_FR[] = _(\n    \"It feeds on gemstone crystals.\\n\"\n    \"In darkness, its eyes sparkle with the\\n\"\n    \"glitter of jewels.\");\n\nconst u8 gSableyePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMawilePokedexText_FR[] = _(\n    \"It uses its docile-looking face to lull\\n\"\n    \"foes into complacency, then bites with its\\n\"\n    \"huge, relentless jaws.\");\n\nconst u8 gMawilePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAronPokedexText_FR[] = _(\n    \"It eats iron to build its steel body.\\n\"\n    \"It is a pest that descends from mountains\\n\"\n    \"to eat bridges and train tracks.\");\n\nconst u8 gAronPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLaironPokedexText_FR[] = _(\n    \"It habitually shows off its strength with\\n\"\n    \"the size of sparks it creates by ramming\\n\"\n    \"its steel body into boulders.\");\n\nconst u8 gLaironPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAggronPokedexText_FR[] = _(\n    \"It claims a large mountain as its sole\\n\"\n    \"territory. It mercilessly thrashes those\\n\"\n    \"that violate its space.\");\n\nconst u8 gAggronPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMedititePokedexText_FR[] = _(\n    \"It never skips its daily yoga training.\\n\"\n    \"It heightens its inner strength through\\n\"\n    \"meditation.\");\n\nconst u8 gMedititePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMedichamPokedexText_FR[] = _(\n    \"It elegantly avoids attacks with dance-\\n\"\n    \"like steps, then launches a devastating\\n\"\n    \"blow in the same motion.\");\n\nconst u8 gMedichamPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gElectrikePokedexText_FR[] = _(\n    \"It stores static electricity in its fur\\n\"\n    \"for discharging. It gives off sparks if a\\n\"\n    \"storm approaches.\");\n\nconst u8 gElectrikePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gManectricPokedexText_FR[] = _(\n    \"It rarely appears before people.\\n\"\n    \"It is said to nest where lightning has\\n\"\n    \"fallen.\");\n\nconst u8 gManectricPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gPluslePokedexText_FR[] = _(\n    \"It cheers on partners while scattering\\n\"\n    \"sparks from its body. It climbs telephone\\n\"\n    \"poles to absorb electricity.\");\n\nconst u8 gPluslePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMinunPokedexText_FR[] = _(\n    \"Its dislike of water makes it take shelter\\n\"\n    \"under the eaves of houses in rain. It uses\\n\"\n    \"pom-poms made of sparks for cheering.\");\n\nconst u8 gMinunPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gVolbeatPokedexText_FR[] = _(\n    \"It lives around clean ponds. At night,\\n\"\n    \"its rear lights up. It converses with\\n\"\n    \"others by flashing its light.\");\n\nconst u8 gVolbeatPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gIllumisePokedexText_FR[] = _(\n    \"It guides VOLBEAT to draw signs in night\\n\"\n    \"skies. There are scientists that study the\\n\"\n    \"patterns it creates.\");\n\nconst u8 gIllumisePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRoseliaPokedexText_FR[] = _(\n    \"Its flowers give off a relaxing fragrance.\\n\"\n    \"The stronger its aroma, the healthier\\n\"\n    \"the ROSELIA is.\");\n\nconst u8 gRoseliaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGulpinPokedexText_FR[] = _(\n    \"There is nothing its stomach can't digest.\\n\"\n    \"While it is digesting, vile, overpowering\\n\"\n    \"gases are expelled.\");\n\nconst u8 gGulpinPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSwalotPokedexText_FR[] = _(\n    \"It can swallow a tire whole in one gulp.\\n\"\n    \"It secretes a horribly toxic fluid from\\n\"\n    \"the pores on its body.\");\n\nconst u8 gSwalotPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCarvanhaPokedexText_FR[] = _(\n    \"It lives in massive rivers that course\\n\"\n    \"through jungles. It swarms prey that\\n\"\n    \"enter its territory.\");\n\nconst u8 gCarvanhaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSharpedoPokedexText_FR[] = _(\n    \"The ruffian of the seas, it has fangs that\\n\"\n    \"crunch through iron. It swims by jetting\\n\"\n    \"water from its rear.\");\n\nconst u8 gSharpedoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWailmerPokedexText_FR[] = _(\n    \"When it sucks in a large volume of\\n\"\n    \"seawater, it becomes like a big, bouncy\\n\"\n    \"ball. It eats a ton of food daily.\");\n\nconst u8 gWailmerPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWailordPokedexText_FR[] = _(\n    \"It is among the largest of all POKéMON.\\n\"\n    \"It herds prey in a pack then swallows the\\n\"\n    \"massed prey in one gulp.\");\n\nconst u8 gWailordPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gNumelPokedexText_FR[] = _(\n    \"Magma of almost 2,200 degrees Fahrenheit\\n\"\n    \"courses through its body. When it grows\\n\"\n    \"cold, the magma hardens and slows it.\");\n\nconst u8 gNumelPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCameruptPokedexText_FR[] = _(\n    \"If angered, the humps on its back erupt\\n\"\n    \"in a shower of molten lava. It lives in\\n\"\n    \"the craters of volcanoes.\");\n\nconst u8 gCameruptPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTorkoalPokedexText_FR[] = _(\n    \"It burns coal inside its shell. If it is\\n\"\n    \"attacked, it belches thick, black smoke\\n\"\n    \"and flees.\");\n\nconst u8 gTorkoalPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSpoinkPokedexText_FR[] = _(\n    \"It apparently dies if it stops bouncing\\n\"\n    \"about. It carries a pearl from CLAMPERL\\n\"\n    \"on its head.\");\n\nconst u8 gSpoinkPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGrumpigPokedexText_FR[] = _(\n    \"It can gain control over foes by doing\\n\"\n    \"odd dance steps. The black pearls on its\\n\"\n    \"forehead are precious gems.\");\n\nconst u8 gGrumpigPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSpindaPokedexText_FR[] = _(\n    \"No two SPINDA are said to have identical\\n\"\n    \"patterns. It confuses foes with its\\n\"\n    \"stumbling motions.\");\n\nconst u8 gSpindaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTrapinchPokedexText_FR[] = _(\n    \"It lives in arid deserts. It makes a\\n\"\n    \"sloping pit trap in sand where it\\n\"\n    \"patiently awaits prey.\");\n\nconst u8 gTrapinchPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gVibravaPokedexText_FR[] = _(\n    \"It generates ultrasonic waves by violently\\n\"\n    \"flapping its wings. After making its prey\\n\"\n    \"faint, it melts the prey with acid.\");\n\nconst u8 gVibravaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gFlygonPokedexText_FR[] = _(\n    \"It hides itself by kicking up desert sand\\n\"\n    \"with its wings. Red covers shield its eyes\\n\"\n    \"from sand.\");\n\nconst u8 gFlygonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCacneaPokedexText_FR[] = _(\n    \"It prefers harsh environments such as\\n\"\n    \"deserts. It can survive for 30 days on\\n\"\n    \"water stored in its body.\");\n\nconst u8 gCacneaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCacturnePokedexText_FR[] = _(\n    \"It lives in deserts. It becomes active at\\n\"\n    \"night when it hunts for prey exhausted\\n\"\n    \"from the desert's heat.\");\n\nconst u8 gCacturnePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSwabluPokedexText_FR[] = _(\n    \"It constantly grooms its cotton-like\\n\"\n    \"wings. It takes a shower to clean\\n\"\n    \"itself if it becomes dirty.\");\n\nconst u8 gSwabluPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAltariaPokedexText_FR[] = _(\n    \"If you hear a beautiful melody trilling\\n\"\n    \"deep among mountains far from people,\\n\"\n    \"it is ALTARIA's humming.\");\n\nconst u8 gAltariaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gZangoosePokedexText_FR[] = _(\n    \"If it comes across a SEVIPER, its fur\\n\"\n    \"bristles and it assumes its battle pose.\\n\"\n    \"Its sharp claws are its best weapon.\");\n\nconst u8 gZangoosePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSeviperPokedexText_FR[] = _(\n    \"It sharpens its swordlike tail on hard\\n\"\n    \"rocks. It hides in tall grass and strikes\\n\"\n    \"unwary prey with venomous fangs.\");\n\nconst u8 gSeviperPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLunatonePokedexText_FR[] = _(\n    \"Its health ebbs and flows with the lunar\\n\"\n    \"cycle. It brims with power when exposed\\n\"\n    \"to the light of the full moon.\");\n\nconst u8 gLunatonePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSolrockPokedexText_FR[] = _(\n    \"It absorbs solar energy during the day.\\n\"\n    \"Always expressionless, it can sense what\\n\"\n    \"its foe is thinking.\");\n\nconst u8 gSolrockPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBarboachPokedexText_FR[] = _(\n    \"It probes muddy riverbeds with its two\\n\"\n    \"long whiskers. A slimy film protects its\\n\"\n    \"body.\");\n\nconst u8 gBarboachPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWhiscashPokedexText_FR[] = _(\n    \"It makes its nest at the bottom of \\n\"\n    \"swamps. It will eat anything - if it is\\n\"\n    \"alive, WHISCASH will eat it.\");\n\nconst u8 gWhiscashPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCorphishPokedexText_FR[] = _(\n    \"It came from overseas. It is a very hardy\\n\"\n    \"creature that will quickly proliferate,\\n\"\n    \"even in polluted streams.\");\n\nconst u8 gCorphishPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCrawdauntPokedexText_FR[] = _(\n    \"A rough customer that wildly flails its\\n\"\n    \"giant claws. It is said to be extremely\\n\"\n    \"hard to raise.\");\n\nconst u8 gCrawdauntPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBaltoyPokedexText_FR[] = _(\n    \"It was discovered in ancient ruins.\\n\"\n    \"While moving, it constantly spins. It\\n\"\n    \"stands on one foot even when asleep.\");\n\nconst u8 gBaltoyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gClaydolPokedexText_FR[] = _(\n    \"It appears to have been born from clay\\n\"\n    \"dolls made by ancient people. It uses\\n\"\n    \"telekinesis to float and move.\");\n\nconst u8 gClaydolPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLileepPokedexText_FR[] = _(\n    \"It became extinct roughly 100 million\\n\"\n    \"years ago. It was regenerated from a\\n\"\n    \"fossil using advanced techniques.\");\n\nconst u8 gLileepPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCradilyPokedexText_FR[] = _(\n    \"It ensnares prey with its eight tentacles.\\n\"\n    \"It then melts the prey with a strong acid\\n\"\n    \"before feeding.\");\n\nconst u8 gCradilyPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAnorithPokedexText_FR[] = _(\n    \"It is a kind of POKéMON progenitor.\\n\"\n    \"It uses its extending claws to catch prey\\n\"\n    \"hiding among rocks on the seafloor.\");\n\nconst u8 gAnorithPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gArmaldoPokedexText_FR[] = _(\n    \"Protected by a hard shell, its body is\\n\"\n    \"very sturdy. It skewers prey with its\\n\"\n    \"claws to feed.\");\n\nconst u8 gArmaldoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gFeebasPokedexText_FR[] = _(\n    \"Ridiculed for its shabby appearance,\\n\"\n    \"it is ignored by researchers. It lives in\\n\"\n    \"ponds choked with weeds.\");\n\nconst u8 gFeebasPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMiloticPokedexText_FR[] = _(\n    \"MILOTIC is breathtakingly beautiful.\\n\"\n    \"Those that see it are said to forget their\\n\"\n    \"combative spirits.\");\n\nconst u8 gMiloticPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gCastformPokedexText_FR[] = _(\n    \"It has the ability to change its form into\\n\"\n    \"the sun, the rain, or a snow cloud, \\n\"\n    \"depending on the weather.\");\n\nconst u8 gCastformPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gKecleonPokedexText_FR[] = _(\n    \"It changes body color to blend in with\\n\"\n    \"its surroundings. It also changes color if\\n\"\n    \"it is happy or sad.\");\n\nconst u8 gKecleonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gShuppetPokedexText_FR[] = _(\n    \"It loves to feed on feelings like envy and\\n\"\n    \"malice. Its upright horn catches the\\n\"\n    \"emotions of people.\");\n\nconst u8 gShuppetPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBanettePokedexText_FR[] = _(\n    \"Strong feelings of hatred turned a puppet\\n\"\n    \"into a POKéMON. If it opens its mouth,\\n\"\n    \"its cursed energy escapes.\");\n\nconst u8 gBanettePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDuskullPokedexText_FR[] = _(\n    \"Making itself invisible, it silently sneaks\\n\"\n    \"up to prey. It has the ability to slip\\n\"\n    \"through thick walls.\");\n\nconst u8 gDuskullPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDusclopsPokedexText_FR[] = _(\n    \"Its body is entirely hollow. When it opens\\n\"\n    \"its mouth, it sucks everything in as if it\\n\"\n    \"were a black hole.\");\n\nconst u8 gDusclopsPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gTropiusPokedexText_FR[] = _(\n    \"It lives in tropical jungles. The bunch of\\n\"\n    \"fruit around its neck is delicious.\\n\"\n    \"The fruit grows twice a year.\");\n\nconst u8 gTropiusPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gChimechoPokedexText_FR[] = _(\n    \"It travels by riding on winds. It cleverly\\n\"\n    \"uses its long tail to pluck nuts and\\n\"\n    \"berries, which it loves to eat.\");\n\nconst u8 gChimechoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gAbsolPokedexText_FR[] = _(\n    \"It appears when it senses an impending\\n\"\n    \"natural disaster. As a result, it was\\n\"\n    \"mistaken as a doom-bringer.\");\n\nconst u8 gAbsolPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWynautPokedexText_FR[] = _(\n    \"It tends to move in a pack with others.\\n\"\n    \"They cluster in a tight group to sleep in\\n\"\n    \"a cave.\");\n\nconst u8 gWynautPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSnoruntPokedexText_FR[] = _(\n    \"It is said that a home visited by a\\n\"\n    \"SNORUNT will prosper. It can withstand\\n\"\n    \"cold of minus 150 degrees Fahrenheit.\");\n\nconst u8 gSnoruntPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGlaliePokedexText_FR[] = _(\n    \"It has a body of ice that won't melt,\\n\"\n    \"even with fire. It can instantly freeze\\n\"\n    \"moisture in the atmosphere.\");\n\nconst u8 gGlaliePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSphealPokedexText_FR[] = _(\n    \"Its body is covered in fluffy fur. The\\n\"\n    \"fur keeps it from feeling cold while\\n\"\n    \"it is rolling on ice.\");\n\nconst u8 gSphealPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSealeoPokedexText_FR[] = _(\n    \"It touches new things with its nose to\\n\"\n    \"test for smell and feel. It plays by\\n\"\n    \"spinning SPHEAL on its nose.\");\n\nconst u8 gSealeoPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gWalreinPokedexText_FR[] = _(\n    \"It swims through icy seas while shattering\\n\"\n    \"ice floes with its large tusks. It is\\n\"\n    \"protected by its thick blubber.\");\n\nconst u8 gWalreinPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gClamperlPokedexText_FR[] = _(\n    \"It is protected by a sturdy shell.\\n\"\n    \"Once in a lifetime, it makes a magnificent\\n\"\n    \"pearl.\");\n\nconst u8 gClamperlPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gHuntailPokedexText_FR[] = _(\n    \"It lives deep in the sea where no light\\n\"\n    \"ever filters down. It lights up its small\\n\"\n    \"fishlike tail to attract prey.\");\n\nconst u8 gHuntailPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGorebyssPokedexText_FR[] = _(\n    \"Its swimming form is exquisitely elegant.\\n\"\n    \"With its thin mouth, it feeds on seaweed\\n\"\n    \"that grows between rocks.\");\n\nconst u8 gGorebyssPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRelicanthPokedexText_FR[] = _(\n    \"It has remained unchanged for 100\\n\"\n    \"million years. It was discovered\\n\"\n    \"during a deep-sea exploration.\");\n\nconst u8 gRelicanthPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLuvdiscPokedexText_FR[] = _(\n    \"During the spawning season, countless\\n\"\n    \"LUVDISC congregate at coral reefs,\\n\"\n    \"turning the waters pink.\");\n\nconst u8 gLuvdiscPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBagonPokedexText_FR[] = _(\n    \"Its steel-hard head can shatter boulders.\\n\"\n    \"It longingly hopes for wings to grow so it\\n\"\n    \"can fly.\");\n\nconst u8 gBagonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gShelgonPokedexText_FR[] = _(\n    \"Its armored body makes all attacks bounce\\n\"\n    \"off. The armor is too tough, however,\\n\"\n    \"making it heavy and somewhat sluggish.\");\n\nconst u8 gShelgonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gSalamencePokedexText_FR[] = _(\n    \"It becomes uncontrollable if it is\\n\"\n    \"enraged. It destroys everything with\\n\"\n    \"shredding claws and fire.\");\n\nconst u8 gSalamencePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gBeldumPokedexText_FR[] = _(\n    \"It uses magnetic waves to converse with\\n\"\n    \"its kind. All the cells in its body are\\n\"\n    \"magnetic.\");\n\nconst u8 gBeldumPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMetangPokedexText_FR[] = _(\n    \"It floats midair using magnetism. Its body\\n\"\n    \"is so tough, even a crash with a jet\\n\"\n    \"plane won't leave a scratch.\");\n\nconst u8 gMetangPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gMetagrossPokedexText_FR[] = _(\n    \"It is formed by two METANG fusing.\\n\"\n    \"Its four brains are said to be superior\\n\"\n    \"to a supercomputer.\");\n\nconst u8 gMetagrossPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRegirockPokedexText_FR[] = _(\n    \"It is entirely composed of rocks with no\\n\"\n    \"sign of a brain or heart. It is a mystery\\n\"\n    \"even to modern scientists.\");\n\nconst u8 gRegirockPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRegicePokedexText_FR[] = _(\n    \"Research revealed that its body is made\\n\"\n    \"of the same kind of ice that is found at\\n\"\n    \"the South Pole.\");\n\nconst u8 gRegicePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRegisteelPokedexText_FR[] = _(\n    \"It is sturdier than any kind of metal.\\n\"\n    \"It hardened due to pressure underground\\n\"\n    \"over tens of thousands of years.\");\n\nconst u8 gRegisteelPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLatiasPokedexText_FR[] = _(\n    \"It can telepathically communicate with\\n\"\n    \"people. It changes its appearance using\\n\"\n    \"its down that refracts light.\");\n\nconst u8 gLatiasPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gLatiosPokedexText_FR[] = _(\n    \"It has a docile temperament and dislikes\\n\"\n    \"fighting. Tucking in its forelegs, it can\\n\"\n    \"fly faster than a jet plane.\");\n\nconst u8 gLatiosPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gKyogrePokedexText_FR[] = _(\n    \"This POKéMON is said to have\\n\"\n    \"expanded the sea by bringing heavy rains.\\n\"\n    \"It has the power to control water.\");\n\nconst u8 gKyogrePokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gGroudonPokedexText_FR[] = _(\n    \"This legendary POKéMON is said to\\n\"\n    \"represent the land. It went to sleep after\\n\"\n    \"dueling KYOGRE.\");\n\nconst u8 gGroudonPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gRayquazaPokedexText_FR[] = _(\n    \"It has lived for hundreds of millions of\\n\"\n    \"years in the ozone layer. Its flying form\\n\"\n    \"looks like a meteor.\");\n\nconst u8 gRayquazaPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gJirachiPokedexText_FR[] = _(\n    \"It is said to make any wish come true.\\n\"\n    \"It is awake for only seven days out of\\n\"\n    \"a thousand years.\");\n\nconst u8 gJirachiPokedexTextUnused_FR[] = _(\"\");\n\nconst u8 gDeoxysPokedexText_FR[] = _(\n    \"This DEOXYS has transformed into its\\n\"\n    \"aggressive guise. It can fool enemies by\\n\"\n    \"altering its appearance.\");\n\nconst u8 gDeoxysPokedexTextUnused_FR[] = _(\"\");\n"
  },
  {
    "path": "src/data/pokemon/pokedex_text_lg.h",
    "content": "const u8 gDummyPokedexText_LG[] = _(\n    \"This is a newly discovered POKéMON. It is\\n\"\n    \"currently under investigation. No detailed\\n\"\n    \"information is available at this time.\");\n\nconst u8 gDummyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBulbasaurPokedexText_LG[] = _(\n    \"A strange seed was planted on its back at\\n\"\n    \"birth. The plant sprouts and grows with\\n\"\n    \"this POKéMON.\");\n\nconst u8 gBulbasaurPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gIvysaurPokedexText_LG[] = _(\n    \"When the bulb on its back grows large, it\\n\"\n    \"appears to lose the ability to stand on\\n\"\n    \"its hind legs.\");\n\nconst u8 gIvysaurPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gVenusaurPokedexText_LG[] = _(\n    \"Its plant blooms when it is absorbing\\n\"\n    \"solar energy. It stays on the move to\\n\"\n    \"seek sunlight.\");\n\nconst u8 gVenusaurPokedexTextUnused_LG[] = _(\n    \" \");\n\nconst u8 gCharmanderPokedexText_LG[] = _(\n    \"It has a preference for hot things.\\n\"\n    \"When it rains, steam is said to spout from\\n\"\n    \"the tip of its tail.\");\n\nconst u8 gCharmanderPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCharmeleonPokedexText_LG[] = _(\n    \"When it swings its burning tail, it\\n\"\n    \"elevates the air temperature to \\n\"\n    \"unbearably high levels.\");\n\nconst u8 gCharmeleonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCharizardPokedexText_LG[] = _(\n    \"It spits fire that is hot enough to melt\\n\"\n    \"boulders. It may cause forest fires by\\n\"\n    \"blowing flames.\");\n\nconst u8 gCharizardPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSquirtlePokedexText_LG[] = _(\n    \"After birth, its back swells and hardens\\n\"\n    \"into a shell. It powerfully sprays foam \\n\"\n    \"from its mouth.\");\n\nconst u8 gSquirtlePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWartortlePokedexText_LG[] = _(\n    \"It often hides in water to stalk unwary\\n\"\n    \"prey. For fast swimming, it moves its\\n\"\n    \"ears to maintain balance.\");\n\nconst u8 gWartortlePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBlastoisePokedexText_LG[] = _(\n    \"The pressurized water jets on this brutal\\n\"\n    \"POKéMON's shell are used for high-\\n\"\n    \"speed tackles.\");\n\nconst u8 gBlastoisePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCaterpiePokedexText_LG[] = _(\n    \"Its short feet are tipped with suction\\n\"\n    \"pads that enable it to tirelessly climb\\n\"\n    \"slopes and walls.\");\n\nconst u8 gCaterpiePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMetapodPokedexText_LG[] = _(\n    \"This POKéMON is vulnerable to attack\\n\"\n    \"while its shell is soft, exposing its weak\\n\"\n    \"and tender body.\");\n\nconst u8 gMetapodPokedexTextUnused_LG[] = _(\n    \" \");\n\nconst u8 gButterfreePokedexText_LG[] = _(\n    \"In battle, it flaps its wings at great\\n\"\n    \"speed to release highly toxic dust into\\n\"\n    \"the air.\");\n\nconst u8 gButterfreePokedexTextUnused_LG[] = _(\n    \" \");\n\nconst u8 gWeedlePokedexText_LG[] = _(\n    \"Often found in forests, eating leaves.\\n\"\n    \"It has a sharp stinger on its head that\\n\"\n    \"injects poison.\");\n\nconst u8 gWeedlePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gKakunaPokedexText_LG[] = _(\n    \"Almost incapable of moving, this POKéMON\\n\"\n    \"can only harden its shell to protect\\n\"\n    \"itself when it is in danger.\");\n\nconst u8 gKakunaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBeedrillPokedexText_LG[] = _(\n    \"It flies at high speed and attacks using \\n\"\n    \"the large venomous stingers on its\\n\"\n    \"forelegs and tail.\");\n\nconst u8 gBeedrillPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPidgeyPokedexText_LG[] = _(\n    \"A common sight in forests and woods.\\n\"\n    \"It flaps its wings at ground level to kick\\n\"\n    \"up blinding sand.\");\n\nconst u8 gPidgeyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPidgeottoPokedexText_LG[] = _(\n    \"Very protective of its sprawling\\n\"\n    \"territorial area, this POKéMON will\\n\"\n    \"fiercely peck at any intruder.\");\n\nconst u8 gPidgeottoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPidgeotPokedexText_LG[] = _(\n    \"When hunting, it skims the surface of\\n\"\n    \"water at high speed to pick off unwary\\n\"\n    \"prey such as MAGIKARP.\");\n\nconst u8 gPidgeotPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRattataPokedexText_LG[] = _(\n    \"Bites anything when it attacks. Small and\\n\"\n    \"very quick, it is a common sight in many\\n\"\n    \"places.\");\n\nconst u8 gRattataPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRaticatePokedexText_LG[] = _(\n    \"It uses its whiskers to maintain its\\n\"\n    \"balance. It apparently slows down if\\n\"\n    \"they are cut off.\");\n\nconst u8 gRaticatePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSpearowPokedexText_LG[] = _(\n    \"Eats bugs in grassy areas. It has to flap\\n\"\n    \"its short wings at high speed to stay\\n\"\n    \"airborne.\");\n\nconst u8 gSpearowPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gFearowPokedexText_LG[] = _(\n    \"With its huge and magnificent wings, it can\\n\"\n    \"keep aloft without ever having to land\\n\"\n    \"for rest.\");\n\nconst u8 gFearowPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gEkansPokedexText_LG[] = _(\n    \"Moving silently and stealthily, it eats\\n\"\n    \"the eggs of birds, such as PIDGEY\\n\"\n    \"and SPEAROW, whole.\");\n\nconst u8 gEkansPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gArbokPokedexText_LG[] = _(\n    \"It is rumored that the ferocious warning\\n\"\n    \"markings on its belly differ from area to\\n\"\n    \"area.\");\n\nconst u8 gArbokPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPikachuPokedexText_LG[] = _(\n    \"When several of these POKéMON gather,\\n\"\n    \"their electricity can build and cause\\n\"\n    \"lightning storms.\");\n\nconst u8 gPikachuPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRaichuPokedexText_LG[] = _(\n    \"Its long tail serves as a ground to\\n\"\n    \"protect itself from its own high-voltage\\n\"\n    \"power.\");\n\nconst u8 gRaichuPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSandshrewPokedexText_LG[] = _(\n    \"Burrows deep underground in arid locations\\n\"\n    \"far from water. It only emerges to hunt\\n\"\n    \"for prey.\");\n\nconst u8 gSandshrewPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSandslashPokedexText_LG[] = _(\n    \"Curls up into a spiny ball when\\n\"\n    \"threatened. It can roll while curled up\\n\"\n    \"to attack or escape.\");\n\nconst u8 gSandslashPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNidoranFPokedexText_LG[] = _(\n    \"Although small, its venomous barbs render\\n\"\n    \"this POKéMON dangerous. The female has\\n\"\n    \"smaller horns.\");\n\nconst u8 gNidoranFPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNidorinaPokedexText_LG[] = _(\n    \"The female's horns develop slowly.\\n\"\n    \"Prefers physical attacks such as clawing\\n\"\n    \"and biting.\");\n\nconst u8 gNidorinaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNidoqueenPokedexText_LG[] = _(\n    \"Its hard scales provide strong protection.\\n\"\n    \"It uses its hefty bulk to execute\\n\"\n    \"powerful moves.\");\n\nconst u8 gNidoqueenPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNidoranMPokedexText_LG[] = _(\n    \"It stiffens its ears to sense danger.\\n\"\n    \"The larger its horns, the more \\n\"\n    \"powerful its secreted venom.\");\n\nconst u8 gNidoranMPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNidorinoPokedexText_LG[] = _(\n    \"An aggressive POKéMON that is quick to\\n\"\n    \"attack. The horn on its head secretes a\\n\"\n    \"powerful venom.\");\n\nconst u8 gNidorinoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNidokingPokedexText_LG[] = _(\n    \"It uses its powerful tail in battle to\\n\"\n    \"smash, constrict, then break the prey's\\n\"\n    \"bones.\");\n\nconst u8 gNidokingPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gClefairyPokedexText_LG[] = _(\n    \"With its magical and cute appeal, it has \\n\"\n    \"many admirers. It is rare and found only\\n\"\n    \"in certain areas.\");\n\nconst u8 gClefairyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gClefablePokedexText_LG[] = _(\n    \"A timid fairy POKéMON that is rarely seen,\\n\"\n    \"it will run and hide the moment it senses\\n\"\n    \"people.\");\n\nconst u8 gClefablePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gVulpixPokedexText_LG[] = _(\n    \"When it is born, it has just one snow-\\n\"\n    \"white tail. The tail splits from its tip as\\n\"\n    \"it grows older.\");\n\nconst u8 gVulpixPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNinetalesPokedexText_LG[] = _(\n    \"Very smart and very vengeful. Grabbing\\n\"\n    \"one of its many tails could result in a\\n\"\n    \"1,000-year curse.\");\n\nconst u8 gNinetalesPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gJigglypuffPokedexText_LG[] = _(\n    \"When its huge eyes waver, it sings a\\n\"\n    \"mysteriously soothing melody that lulls\\n\"\n    \"its enemies to sleep.\");\n\nconst u8 gJigglypuffPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWigglytuffPokedexText_LG[] = _(\n    \"The body is soft and rubbery. When\\n\"\n    \"angered, it will suck in air and inflate\\n\"\n    \"itself to an enormous size.\");\n\nconst u8 gWigglytuffPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gZubatPokedexText_LG[] = _(\n    \"It forms colonies in perpetually dark \\n\"\n    \"places and uses ultrasonic waves to  \\n\"\n    \"identify and approach targets.\");\n\nconst u8 gZubatPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGolbatPokedexText_LG[] = _(\n    \"Once it bites, it will not stop draining\\n\"\n    \"energy from the victim even if it gets too\\n\"\n    \"heavy to fly.\");\n\nconst u8 gGolbatPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gOddishPokedexText_LG[] = _(\n    \"During the day, it keeps its face buried\\n\"\n    \"in the ground. At night, it wanders around\\n\"\n    \"sowing its seeds.\");\n\nconst u8 gOddishPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGloomPokedexText_LG[] = _(\n    \"The fluid that oozes from its mouth isn't\\n\"\n    \"drool. It is a nectar that is used to\\n\"\n    \"attract prey.\");\n\nconst u8 gGloomPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gVileplumePokedexText_LG[] = _(\n    \"The larger its petals, the more toxic\\n\"\n    \"pollen it contains. Its big head is heavy\\n\"\n    \"and hard to hold up.\");\n\nconst u8 gVileplumePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gParasPokedexText_LG[] = _(\n    \"Burrows to suck tree roots. The mushrooms\\n\"\n    \"on its back grow by drawing nutrients from\\n\"\n    \"the bug host.\");\n\nconst u8 gParasPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gParasectPokedexText_LG[] = _(\n    \"A host-parasite pair in which the parasite\\n\"\n    \"mushroom has taken over the host bug.\\n\"\n    \"Prefers damp places. \");\n\nconst u8 gParasectPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gVenonatPokedexText_LG[] = _(\n    \"Lives in the shadows of tall trees where\\n\"\n    \"it eats bugs. It is attracted by light\\n\"\n    \"at night.\");\n\nconst u8 gVenonatPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gVenomothPokedexText_LG[] = _(\n    \"The dustlike scales covering its wings\\n\"\n    \"are color-coded to indicate the kinds of\\n\"\n    \"poison it has.\");\n\nconst u8 gVenomothPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDiglettPokedexText_LG[] = _(\n    \"Lives about one yard underground where it\\n\"\n    \"feeds on plant roots. It sometimes appears\\n\"\n    \"aboveground.\");\n\nconst u8 gDiglettPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDugtrioPokedexText_LG[] = _(\n    \"A team of DIGLETT triplets. It triggers\\n\"\n    \"huge earthquakes by burrowing 60 miles\\n\"\n    \"underground.\");\n\nconst u8 gDugtrioPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMeowthPokedexText_LG[] = _(\n    \"Adores round objects. It wanders the\\n\"\n    \"streets on a nightly basis to look for\\n\"\n    \"dropped loose change.\");\n\nconst u8 gMeowthPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPersianPokedexText_LG[] = _(\n    \"Although its fur has many admirers, it is\\n\"\n    \"tough to raise as a pet because of its\\n\"\n    \"fickle meanness.\");\n\nconst u8 gPersianPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPsyduckPokedexText_LG[] = _(\n    \"While lulling its enemies with its vacant\\n\"\n    \"look, this wily POKéMON will use\\n\"\n    \"psychokinetic powers.\");\n\nconst u8 gPsyduckPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGolduckPokedexText_LG[] = _(\n    \"Often seen swimming elegantly by\\n\"\n    \"lakeshores. It is often mistaken for the\\n\"\n    \"Japanese monster Kappa.\");\n\nconst u8 gGolduckPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMankeyPokedexText_LG[] = _(\n    \"Extremely quick to anger. It could be\\n\"\n    \"docile one moment, then thrashing away \\n\"\n    \"the next instant.\");\n\nconst u8 gMankeyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPrimeapePokedexText_LG[] = _(\n    \"Always furious and tenacious to boot.\\n\"\n    \"It will not abandon chasing its quarry\\n\"\n    \"until it catches up.\");\n\nconst u8 gPrimeapePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGrowlithePokedexText_LG[] = _(\n    \"It is very protective of its territory.\\n\"\n    \"It will bark and bite to repel intruders\\n\"\n    \"from its space.\");\n\nconst u8 gGrowlithePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gArcaninePokedexText_LG[] = _(\n    \"A POKéMON that has long been admired\\n\"\n    \"for its beauty. It runs agilely as if\\n\"\n    \"on wings.\");\n\nconst u8 gArcaninePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPoliwagPokedexText_LG[] = _(\n    \"Its newly grown legs prevent it from\\n\"\n    \"walking well. It appears to prefer\\n\"\n    \"swimming over walking.\");\n\nconst u8 gPoliwagPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPoliwhirlPokedexText_LG[] = _(\n    \"It can live in or out of water. When out\\n\"\n    \"of water, it constantly sweats to keep its\\n\"\n    \"body slimy.\");\n\nconst u8 gPoliwhirlPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPoliwrathPokedexText_LG[] = _(\n    \"A swimmer adept at both the front crawl\\n\"\n    \"and breaststroke. Easily overtakes the\\n\"\n    \"best human swimmers.\");\n\nconst u8 gPoliwrathPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAbraPokedexText_LG[] = _(\n    \"Using its ability to read minds, it will\\n\"\n    \"sense impending danger and TELEPORT to\\n\"\n    \"safety.\");\n\nconst u8 gAbraPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gKadabraPokedexText_LG[] = _(\n    \"It emits special alpha waves from its\\n\"\n    \"body that induce headaches just by being\\n\"\n    \"close.\");\n\nconst u8 gKadabraPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAlakazamPokedexText_LG[] = _(\n    \"Its brain can outperform a supercomputer.\\n\"\n    \"Its IQ (intelligence quotient) is said to\\n\"\n    \"be around 5,000.\");\n\nconst u8 gAlakazamPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMachopPokedexText_LG[] = _(\n    \"Loves to build its muscles. It trains in\\n\"\n    \"all styles of martial arts to become even\\n\"\n    \"stronger.\");\n\nconst u8 gMachopPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMachokePokedexText_LG[] = _(\n    \"Its muscular body is so powerful, it must\\n\"\n    \"wear a power-save belt to be able to\\n\"\n    \"regulate its motions.\");\n\nconst u8 gMachokePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMachampPokedexText_LG[] = _(\n    \"Its superpowerful punches are said to\\n\"\n    \"knock the victim flying clear over the\\n\"\n    \"horizon.\");\n\nconst u8 gMachampPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBellsproutPokedexText_LG[] = _(\n    \"A carnivorous POKéMON that traps and eats\\n\"\n    \"bugs. It appears to use its root feet to\\n\"\n    \"replenish moisture.\");\n\nconst u8 gBellsproutPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWeepinbellPokedexText_LG[] = _(\n    \"It spits out POISONPOWDER to immobilize\\n\"\n    \"the enemy and then finishes it with a\\n\"\n    \"spray of ACID.\");\n\nconst u8 gWeepinbellPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gVictreebelPokedexText_LG[] = _(\n    \"Said to live in huge colonies deep in\\n\"\n    \"jungles, although no one has ever\\n\"\n    \"returned from there.\");\n\nconst u8 gVictreebelPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTentacoolPokedexText_LG[] = _(\n    \"Drifts in shallow seas. Anglers who hook\\n\"\n    \"them by accident are often punished by\\n\"\n    \"their stingers.\");\n\nconst u8 gTentacoolPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTentacruelPokedexText_LG[] = _(\n    \"The tentacles are normally kept short.\\n\"\n    \"On hunts, they are extended to ensnare\\n\"\n    \"and immobilize prey.\");\n\nconst u8 gTentacruelPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGeodudePokedexText_LG[] = _(\n    \"Found in fields and mountains. Mistaking\\n\"\n    \"them for boulders, people often step or\\n\"\n    \"trip on them.\");\n\nconst u8 gGeodudePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGravelerPokedexText_LG[] = _(\n    \"Rolls down slopes to move. It rolls over\\n\"\n    \"any obstacle without slowing or changing\\n\"\n    \"its direction.\");\n\nconst u8 gGravelerPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGolemPokedexText_LG[] = _(\n    \"Its boulder-like body is extremely hard.\\n\"\n    \"It can easily withstand dynamite blasts\\n\"\n    \"without taking damage.\");\n\nconst u8 gGolemPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPonytaPokedexText_LG[] = _(\n    \"Its hooves are ten times harder than\\n\"\n    \"diamond. It can trample anything\\n\"\n    \"completely flat in little time.\");\n\nconst u8 gPonytaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRapidashPokedexText_LG[] = _(\n    \"Very competitive, this POKéMON will chase\\n\"\n    \"anything that moves fast in the hopes of\\n\"\n    \"racing it.\");\n\nconst u8 gRapidashPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSlowpokePokedexText_LG[] = _(\n    \"Incredibly slow and dopey. It takes five\\n\"\n    \"seconds for it to feel pain when under\\n\"\n    \"attack.\");\n\nconst u8 gSlowpokePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSlowbroPokedexText_LG[] = _(\n    \"The SHELLDER that latches onto\\n\"\n    \"SLOWPOKE's tail is said to feed on the\\n\"\n    \"host's leftover scraps.\");\n\nconst u8 gSlowbroPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMagnemitePokedexText_LG[] = _(\n    \"Uses antigravity to stay suspended.\\n\"\n    \"Appears without warning and uses THUNDER\\n\"\n    \"WAVE and similar moves.\");\n\nconst u8 gMagnemitePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMagnetonPokedexText_LG[] = _(\n    \"Formed by several MAGNEMITE linked\\n\"\n    \"together. They frequently appear when\\n\"\n    \"sunspots flare up.\");\n\nconst u8 gMagnetonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gFarfetchdPokedexText_LG[] = _(\n    \"The plant stalk it holds is its weapon.\\n\"\n    \"The stalk is used like a sword to cut all\\n\"\n    \"sorts of things.\");\n\nconst u8 gFarfetchdPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDoduoPokedexText_LG[] = _(\n    \"A bird that makes up for its poor flying\\n\"\n    \"with its fast foot speed. Leaves giant\\n\"\n    \"footprints.\");\n\nconst u8 gDoduoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDodrioPokedexText_LG[] = _(\n    \"Uses its three brains to execute complex\\n\"\n    \"plans. While two heads sleep, one head is\\n\"\n    \"said to stay awake.\");\n\nconst u8 gDodrioPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSeelPokedexText_LG[] = _(\n    \"The protruding horn on its head is very\\n\"\n    \"hard. It is used for bashing through thick\\n\"\n    \"icebergs.\");\n\nconst u8 gSeelPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDewgongPokedexText_LG[] = _(\n    \"It stores thermal energy in the body.\\n\"\n    \"It swims at a steady eight knots even in\\n\"\n    \"intensely cold waters.\");\n\nconst u8 gDewgongPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGrimerPokedexText_LG[] = _(\n    \"Appears in filthy areas. It thrives by\\n\"\n    \"sucking up polluted sludge that is pumped\\n\"\n    \"out of factories.\");\n\nconst u8 gGrimerPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMukPokedexText_LG[] = _(\n    \"Thickly covered with a filthy, vile\\n\"\n    \"sludge. It is so toxic, even its footprints\\n\"\n    \"contain poison.\");\n\nconst u8 gMukPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gShellderPokedexText_LG[] = _(\n    \"Its hard shell repels any kind of attack.\\n\"\n    \"It is vulnerable only when its shell is\\n\"\n    \"open.\");\n\nconst u8 gShellderPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCloysterPokedexText_LG[] = _(\n    \"When attacked, it launches its horns in\\n\"\n    \"quick volleys. Its innards have never been\\n\"\n    \"seen.\");\n\nconst u8 gCloysterPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGastlyPokedexText_LG[] = _(\n    \"Almost invisible, this gaseous POKéMON\\n\"\n    \"cloaks the target and puts it to sleep\\n\"\n    \"without notice.\");\n\nconst u8 gGastlyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHaunterPokedexText_LG[] = _(\n    \"Because of its ability to slip through\\n\"\n    \"block walls, it is said to be from another\\n\"\n    \"dimension.\");\n\nconst u8 gHaunterPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGengarPokedexText_LG[] = _(\n    \"On the night of a full moon, if shadows\\n\"\n    \"move on their own and laugh, it must be\\n\"\n    \"GENGAR's doing.\");\n\nconst u8 gGengarPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gOnixPokedexText_LG[] = _(\n    \"As it grows, the stone portions of its\\n\"\n    \"body harden to become similar to\\n\"\n    \"black-colored diamonds.\");\n\nconst u8 gOnixPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDrowzeePokedexText_LG[] = _(\n    \"Puts enemies to sleep, then eats their\\n\"\n    \"dreams. Occasionally gets sick from eating\\n\"\n    \"only bad dreams.\");\n\nconst u8 gDrowzeePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHypnoPokedexText_LG[] = _(\n    \"When it locks eyes with an enemy, it will\\n\"\n    \"use a mix of PSI moves such as HYPNOSIS\\n\"\n    \"and CONFUSION.\");\n\nconst u8 gHypnoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gKrabbyPokedexText_LG[] = _(\n    \"Its pincers are not only powerful weapons,\\n\"\n    \"they are used for balance when walking\\n\"\n    \"sideways.\");\n\nconst u8 gKrabbyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gKinglerPokedexText_LG[] = _(\n    \"The large pincer has 10,000-horsepower\\n\"\n    \"crushing force. However, its huge size\\n\"\n    \"makes it unwieldy to use.\");\n\nconst u8 gKinglerPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gVoltorbPokedexText_LG[] = _(\n    \"Usually found in power plants. Easily\\n\"\n    \"mistaken for a POKé BALL, it has\\n\"\n    \"zapped many people.\");\n\nconst u8 gVoltorbPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gElectrodePokedexText_LG[] = _(\n    \"It stores electric energy under very high\\n\"\n    \"pressure. It often explodes with little or\\n\"\n    \"no provocation.\");\n\nconst u8 gElectrodePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gExeggcutePokedexText_LG[] = _(\n    \"It is often mistaken for eggs. When\\n\"\n    \"disturbed, they quickly gather and attack\\n\"\n    \"in swarms.\");\n\nconst u8 gExeggcutePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gExeggutorPokedexText_LG[] = _(\n    \"It is said that on rare occasions, one\\n\"\n    \"of its heads will drop off and continue on\\n\"\n    \"as an EXEGGCUTE.\");\n\nconst u8 gExeggutorPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCubonePokedexText_LG[] = _(\n    \"Because it never removes its skull helmet,\\n\"\n    \"no one has ever seen this POKéMON's real\\n\"\n    \"face.\");\n\nconst u8 gCubonePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMarowakPokedexText_LG[] = _(\n    \"The bone it holds is its key weapon.\\n\"\n    \"It throws the bone skillfully like a\\n\"\n    \"boomerang to KO targets.\");\n\nconst u8 gMarowakPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHitmonleePokedexText_LG[] = _(\n    \"When in a hurry, its legs lengthen\\n\"\n    \"progressively. It runs smoothly with\\n\"\n    \"extra-long, loping strides.\");\n\nconst u8 gHitmonleePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHitmonchanPokedexText_LG[] = _(\n    \"While apparently doing nothing, it fires\\n\"\n    \"punches in lightning-fast volleys that are\\n\"\n    \"impossible to see.\");\n\nconst u8 gHitmonchanPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLickitungPokedexText_LG[] = _(\n    \"Its tongue can be extended like a\\n\"\n    \"chameleon's. It leaves a tingling\\n\"\n    \"sensation when it licks enemies.\");\n\nconst u8 gLickitungPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gKoffingPokedexText_LG[] = _(\n    \"Because it stores several kinds of toxic\\n\"\n    \"gases in its body, it is prone to\\n\"\n    \"exploding without warning.\");\n\nconst u8 gKoffingPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWeezingPokedexText_LG[] = _(\n    \"Where two kinds of poison gases meet, two\\n\"\n    \"KOFFING can fuse into a WEEZING over\\n\"\n    \"many years.\");\n\nconst u8 gWeezingPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRhyhornPokedexText_LG[] = _(\n    \"Its massive bones are 1,000 times harder\\n\"\n    \"than human bones. Its TACKLE can knock a\\n\"\n    \"semitrailer flying.\");\n\nconst u8 gRhyhornPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRhydonPokedexText_LG[] = _(\n    \"Protected by an armor-like hide, it is\\n\"\n    \"capable of living in molten lava of 3,600\\n\"\n    \"degrees Fahrenheit.\");\n\nconst u8 gRhydonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gChanseyPokedexText_LG[] = _(\n    \"A rare and elusive POKéMON that is said\\n\"\n    \"to bring happiness to those who manage to\\n\"\n    \"catch one.\");\n\nconst u8 gChanseyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTangelaPokedexText_LG[] = _(\n    \"The whole body is swathed with wide vines\\n\"\n    \"that are similar to seaweed. The vines\\n\"\n    \"sway as it walks.\");\n\nconst u8 gTangelaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gKangaskhanPokedexText_LG[] = _(\n    \"The infant rarely ventures out of its\\n\"\n    \"mother's protective pouch until it is\\n\"\n    \"three years old.\");\n\nconst u8 gKangaskhanPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHorseaPokedexText_LG[] = _(\n    \"Known to shoot down flying bugs with\\n\"\n    \"precision blasts of ink from the surface\\n\"\n    \"of the water.\");\n\nconst u8 gHorseaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSeadraPokedexText_LG[] = _(\n    \"It is capable of swimming backwards by\\n\"\n    \"rapidly flapping its winglike pectoral fins\\n\"\n    \"and stout tail.\");\n\nconst u8 gSeadraPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGoldeenPokedexText_LG[] = _(\n    \"Its tail fin billows like an elegant\\n\"\n    \"ballroom dress, giving it the nickname of\\n\"\n    \"“The Water Queen.”\");\n\nconst u8 gGoldeenPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSeakingPokedexText_LG[] = _(\n    \"In the autumn spawning season, they can\\n\"\n    \"be seen swimming powerfully up rivers and\\n\"\n    \"creeks.\");\n\nconst u8 gSeakingPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gStaryuPokedexText_LG[] = _(\n    \"An enigmatic POKéMON that can effortlessly\\n\"\n    \"regenerate any appendage it loses in\\n\"\n    \"battle.\");\n\nconst u8 gStaryuPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gStarmiePokedexText_LG[] = _(\n    \"Its central core glows with the seven\\n\"\n    \"colors of the rainbow. Some people value\\n\"\n    \"the core as a gem.\");\n\nconst u8 gStarmiePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMrmimePokedexText_LG[] = _(\n    \"If interrupted while it is miming, it will\\n\"\n    \"suddenly DOUBLESLAP the offender with its\\n\"\n    \"broad hands.\");\n\nconst u8 gMrmimePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gScytherPokedexText_LG[] = _(\n    \"With ninja-like agility and speed, it can\\n\"\n    \"create the illusion that there is more\\n\"\n    \"than one of itself.\");\n\nconst u8 gScytherPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gJynxPokedexText_LG[] = _(\n    \"It seductively wiggles its hips as it\\n\"\n    \"walks. It can cause people to dance in\\n\"\n    \"unison with it.\");\n\nconst u8 gJynxPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gElectabuzzPokedexText_LG[] = _(\n    \"Normally found near power plants, they\\n\"\n    \"can wander away and cause major\\n\"\n    \"blackouts in cities.\");\n\nconst u8 gElectabuzzPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMagmarPokedexText_LG[] = _(\n    \"Its body always burns with an orange glow\\n\"\n    \"that enables it to hide perfectly amidst\\n\"\n    \"flames.\");\n\nconst u8 gMagmarPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPinsirPokedexText_LG[] = _(\n    \"If it fails to crush the foe in its\\n\"\n    \"pincers, it will swing around and toss\\n\"\n    \"the opponent.\");\n\nconst u8 gPinsirPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTaurosPokedexText_LG[] = _(\n    \"When it targets an enemy, it charges\\n\"\n    \"furiously while whipping its body with its\\n\"\n    \"long tails.\");\n\nconst u8 gTaurosPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMagikarpPokedexText_LG[] = _(\n    \"In the distant past, it was somewhat\\n\"\n    \"stronger than the horribly weak\\n\"\n    \"descendants that exist today.\");\n\nconst u8 gMagikarpPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGyaradosPokedexText_LG[] = _(\n    \"Rarely seen in the wild. Huge and vicious,\\n\"\n    \"it is capable of destroying entire cities\\n\"\n    \"in a rage.\");\n\nconst u8 gGyaradosPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLaprasPokedexText_LG[] = _(\n    \"A POKéMON that has been overhunted\\n\"\n    \"almost to extinction. It can ferry people\\n\"\n    \"on its back.\");\n\nconst u8 gLaprasPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDittoPokedexText_LG[] = _(\n    \"Capable of copying an opponent's genetic\\n\"\n    \"code to instantly transform itself into a\\n\"\n    \"duplicate of the enemy.\");\n\nconst u8 gDittoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gEeveePokedexText_LG[] = _(\n    \"Its genetic code is irregular. It may\\n\"\n    \"mutate if it is exposed to radiation from\\n\"\n    \"element STONES.\");\n\nconst u8 gEeveePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gVaporeonPokedexText_LG[] = _(\n    \"Lives close to water. Its long tail is\\n\"\n    \"ridged with a fin which is often mistaken\\n\"\n    \"for a mermaid's.\");\n\nconst u8 gVaporeonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gJolteonPokedexText_LG[] = _(\n    \"It accumulates negative ions in the\\n\"\n    \"atmosphere to blast out 10,000-volt\\n\"\n    \"lightning bolts.\");\n\nconst u8 gJolteonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gFlareonPokedexText_LG[] = _(\n    \"When storing thermal energy in its body,\\n\"\n    \"its temperature can soar to over 1,600\\n\"\n    \"degrees Fahrenheit.\");\n\nconst u8 gFlareonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPorygonPokedexText_LG[] = _(\n    \"A POKéMON that consists entirely of\\n\"\n    \"programming code. It is capable of moving\\n\"\n    \"freely in cyberspace.\");\n\nconst u8 gPorygonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gOmanytePokedexText_LG[] = _(\n    \"Although long extinct, in rare cases, it\\n\"\n    \"can be genetically regenerated from\\n\"\n    \"fossils.\");\n\nconst u8 gOmanytePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gOmastarPokedexText_LG[] = _(\n    \"Despite having strong fangs and tentacles,\\n\"\n    \"it went extinct when its heavy shell made\\n\"\n    \"it unable to catch prey.\");\n\nconst u8 gOmastarPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gKabutoPokedexText_LG[] = _(\n    \"A POKéMON that was regenerated from a\\n\"\n    \"fossil found in what was once the ocean\\n\"\n    \"floor long ago.\");\n\nconst u8 gKabutoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gKabutopsPokedexText_LG[] = _(\n    \"Its sleek shape is perfect for swimming.\\n\"\n    \"It slashes prey with its claws and drains\\n\"\n    \"their fluids.\");\n\nconst u8 gKabutopsPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAerodactylPokedexText_LG[] = _(\n    \"A ferocious, prehistoric POKéMON that\\n\"\n    \"goes for the enemy's throat with its\\n\"\n    \"serrated, sawlike fangs.\");\n\nconst u8 gAerodactylPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSnorlaxPokedexText_LG[] = _(\n    \"Very lazy. Just eats and sleeps. As its\\n\"\n    \"rotund bulk builds, it becomes steadily\\n\"\n    \"more slothful.\");\n\nconst u8 gSnorlaxPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gArticunoPokedexText_LG[] = _(\n    \"A legendary bird POKéMON that is said to\\n\"\n    \"appear to doomed people who are lost in\\n\"\n    \"icy mountains.\");\n\nconst u8 gArticunoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gZapdosPokedexText_LG[] = _(\n    \"A legendary bird POKéMON that is said to\\n\"\n    \"appear from clouds while dropping\\n\"\n    \"enormous lightning bolts.\");\n\nconst u8 gZapdosPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMoltresPokedexText_LG[] = _(\n    \"It is said to be the legendary bird\\n\"\n    \"POKéMON of fire. Every flap of its wings\\n\"\n    \"creates a dazzling flare of flames.\");\n\nconst u8 gMoltresPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDratiniPokedexText_LG[] = _(\n    \"Long considered a mythical POKéMON until\\n\"\n    \"recently, when a small colony was found\\n\"\n    \"living underwater.\");\n\nconst u8 gDratiniPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDragonairPokedexText_LG[] = _(\n    \"A mystical POKéMON that exudes a gentle\\n\"\n    \"aura. It is said to have the ability to\\n\"\n    \"change the weather.\");\n\nconst u8 gDragonairPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDragonitePokedexText_LG[] = _(\n    \"Only a very few people ever see this\\n\"\n    \"POKéMON. Its intelligence is said to\\n\"\n    \"match that of humans.\");\n\nconst u8 gDragonitePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMewtwoPokedexText_LG[] = _(\n    \"It was created by a scientist after years\\n\"\n    \"of horrific gene-splicing and DNA-\\n\"\n    \"engineering experiments.\");\n\nconst u8 gMewtwoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMewPokedexText_LG[] = _(\n    \"So rare that it is still said to be a\\n\"\n    \"mirage by many experts. Only a few people\\n\"\n    \"have seen it worldwide.\");\n\nconst u8 gMewPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gChikoritaPokedexText_LG[] = _(\n    \"A sweet aroma gently wafts from the leaf\\n\"\n    \"on its head. It is docile and loves to\\n\"\n    \"soak up the sun's rays.\");\n\nconst u8 gChikoritaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBayleefPokedexText_LG[] = _(\n    \"The scent of spices comes from around\\n\"\n    \"its neck. Somehow, sniffing it makes you\\n\"\n    \"want to fight.\");\n\nconst u8 gBayleefPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMeganiumPokedexText_LG[] = _(\n    \"The aroma that rises from its petals\\n\"\n    \"contains a substance that calms aggressive\\n\"\n    \"feelings.\");\n\nconst u8 gMeganiumPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCyndaquilPokedexText_LG[] = _(\n    \"It is timid and always curls itself up in\\n\"\n    \"a ball. If attacked, it flares up its back\\n\"\n    \"for protection.\");\n\nconst u8 gCyndaquilPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gQuilavaPokedexText_LG[] = _(\n    \"Be careful if it turns its back during\\n\"\n    \"battle. It means that it will attack with\\n\"\n    \"the fire on its back.\");\n\nconst u8 gQuilavaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTyphlosionPokedexText_LG[] = _(\n    \"If its rage peaks, it becomes so hot that\\n\"\n    \"anything that touches it will instantly go\\n\"\n    \"up in flames.\");\n\nconst u8 gTyphlosionPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTotodilePokedexText_LG[] = _(\n    \"Its well-developed jaws are powerful and\\n\"\n    \"capable of crushing anything. Even its\\n\"\n    \"TRAINER must be careful.\");\n\nconst u8 gTotodilePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCroconawPokedexText_LG[] = _(\n    \"If it loses a fang, a new one grows back\\n\"\n    \"in its place. There are always 48 fangs\\n\"\n    \"lining its mouth.\");\n\nconst u8 gCroconawPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gFeraligatrPokedexText_LG[] = _(\n    \"When it bites with its massive and\\n\"\n    \"powerful jaws, it shakes its head and\\n\"\n    \"savagely tears up its victim.\");\n\nconst u8 gFeraligatrPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSentretPokedexText_LG[] = _(\n    \"A very cautious POKéMON, it raises itself\\n\"\n    \"up using its tail to get a better view of\\n\"\n    \"its surroundings.\");\n\nconst u8 gSentretPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gFurretPokedexText_LG[] = _(\n    \"It makes a nest to suit its long and skinny\\n\"\n    \"body. The nest is impossible for other\\n\"\n    \"POKéMON to enter.\");\n\nconst u8 gFurretPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHoothootPokedexText_LG[] = _(\n    \"It always stands on one foot. It changes\\n\"\n    \"feet so fast, the movement can rarely be\\n\"\n    \"seen.\");\n\nconst u8 gHoothootPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNoctowlPokedexText_LG[] = _(\n    \"Its eyes are specially adapted. They\\n\"\n    \"concentrate even faint light and enable it\\n\"\n    \"to see in the dark.\");\n\nconst u8 gNoctowlPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLedybaPokedexText_LG[] = _(\n    \"It is very timid. It will be afraid to\\n\"\n    \"move if it is alone. But it will be active\\n\"\n    \"if it is in a group.\");\n\nconst u8 gLedybaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLedianPokedexText_LG[] = _(\n    \"When the stars flicker in the night sky, it\\n\"\n    \"flutters about, scattering a glowing\\n\"\n    \"powder.\");\n\nconst u8 gLedianPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSpinarakPokedexText_LG[] = _(\n    \"It lies still in the same pose for days\\n\"\n    \"in its web, waiting for its unsuspecting\\n\"\n    \"prey to wander close.\");\n\nconst u8 gSpinarakPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAriadosPokedexText_LG[] = _(\n    \"It spins string not only from its rear but\\n\"\n    \"also from its mouth. It is hard to tell\\n\"\n    \"which end is which.\");\n\nconst u8 gAriadosPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCrobatPokedexText_LG[] = _(\n    \"It flies so silently through the dark on\\n\"\n    \"its four wings that it may not be noticed\\n\"\n    \"even when nearby.\");\n\nconst u8 gCrobatPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gChinchouPokedexText_LG[] = _(\n    \"It shoots positive and negative\\n\"\n    \"electricity between the tips of its two\\n\"\n    \"antennae and zaps its enemies.\");\n\nconst u8 gChinchouPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLanturnPokedexText_LG[] = _(\n    \"The light it emits is so bright that it can\\n\"\n    \"illuminate the sea's surface from a depth\\n\"\n    \"of over three miles.\");\n\nconst u8 gLanturnPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPichuPokedexText_LG[] = _(\n    \"It is not yet skilled at storing\\n\"\n    \"electricity. It may send out a jolt if\\n\"\n    \"amused or startled.\");\n\nconst u8 gPichuPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCleffaPokedexText_LG[] = _(\n    \"Because of its unusual, starlike\\n\"\n    \"silhouette, people believe that it came\\n\"\n    \"here on a meteor.\");\n\nconst u8 gCleffaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gIgglybuffPokedexText_LG[] = _(\n    \"It has a very soft body. If it starts to\\n\"\n    \"roll, it will bounce all over and be\\n\"\n    \"impossible to stop.\");\n\nconst u8 gIgglybuffPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTogepiPokedexText_LG[] = _(\n    \"The shell seems to be filled with joy.\\n\"\n    \"It is said that it will share good luck\\n\"\n    \"when treated kindly.\");\n\nconst u8 gTogepiPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTogeticPokedexText_LG[] = _(\n    \"They say that it will appear before\\n\"\n    \"kindhearted, caring people and shower\\n\"\n    \"them with happiness.\");\n\nconst u8 gTogeticPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNatuPokedexText_LG[] = _(\n    \"Because its wings aren't yet fully grown,\\n\"\n    \"it has to hop to get around. It is always\\n\"\n    \"staring at something.\");\n\nconst u8 gNatuPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gXatuPokedexText_LG[] = _(\n    \"They say that it stays still and quiet\\n\"\n    \"because it is seeing both the past and\\n\"\n    \"future at the same time.\");\n\nconst u8 gXatuPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMareepPokedexText_LG[] = _(\n    \"If static electricity builds in its body,\\n\"\n    \"its fleece doubles in volume. Touching\\n\"\n    \"it will shock you.\");\n\nconst u8 gMareepPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gFlaaffyPokedexText_LG[] = _(\n    \"As a result of storing too much\\n\"\n    \"electricity, it developed patches where\\n\"\n    \"even downy wool won't grow.\");\n\nconst u8 gFlaaffyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAmpharosPokedexText_LG[] = _(\n    \"The tail's tip shines brightly and can be\\n\"\n    \"seen from far away. It acts as a beacon\\n\"\n    \"for lost people.\");\n\nconst u8 gAmpharosPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBellossomPokedexText_LG[] = _(\n    \"BELLOSSOM gather at times and appear to\\n\"\n    \"dance. They say that the dance is a\\n\"\n    \"ritual to summon the sun.\");\n\nconst u8 gBellossomPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMarillPokedexText_LG[] = _(\n    \"The tip of its tail, which contains oil\\n\"\n    \"that is lighter than water, lets it swim\\n\"\n    \"without drowning.\");\n\nconst u8 gMarillPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAzumarillPokedexText_LG[] = _(\n    \"By keeping still and listening intently, it\\n\"\n    \"can even tell what is in wild, fast-moving\\n\"\n    \"rivers.\");\n\nconst u8 gAzumarillPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSudowoodoPokedexText_LG[] = _(\n    \"Although it always pretends to be a tree,\\n\"\n    \"its composition appears to be closer to a\\n\"\n    \"rock than a plant.\");\n\nconst u8 gSudowoodoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPolitoedPokedexText_LG[] = _(\n    \"If POLIWAG and POLIWHIRL hear its\\n\"\n    \"echoing cry, they respond by gathering\\n\"\n    \"from far and wide.\");\n\nconst u8 gPolitoedPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHoppipPokedexText_LG[] = _(\n    \"To keep from being blown away by the\\n\"\n    \"wind, they gather in clusters. They do\\n\"\n    \"enjoy gentle breezes, though.\");\n\nconst u8 gHoppipPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSkiploomPokedexText_LG[] = _(\n    \"The bloom on top of its head opens and\\n\"\n    \"closes as the temperature fluctuates up\\n\"\n    \"and down.\");\n\nconst u8 gSkiploomPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gJumpluffPokedexText_LG[] = _(\n    \"Once it catches the wind, it deftly\\n\"\n    \"controls its cotton-puff spores to float,\\n\"\n    \"even around the world.\");\n\nconst u8 gJumpluffPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAipomPokedexText_LG[] = _(\n    \"Its tail is so powerful that it can use it\\n\"\n    \"to grab a tree branch and hold itself up\\n\"\n    \"in the air.\");\n\nconst u8 gAipomPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSunkernPokedexText_LG[] = _(\n    \"It may drop out of the sky suddenly.\\n\"\n    \"If attacked by a SPEAROW, it will\\n\"\n    \"violently shake its leaves.\");\n\nconst u8 gSunkernPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSunfloraPokedexText_LG[] = _(\n    \"It converts sunlight into energy. In the\\n\"\n    \"darkness after sunset, it closes its petals\\n\"\n    \"and becomes still.\");\n\nconst u8 gSunfloraPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gYanmaPokedexText_LG[] = _(\n    \"If it flaps its wings really fast, it can\\n\"\n    \"generate shock waves that will shatter\\n\"\n    \"windows in the area.\");\n\nconst u8 gYanmaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWooperPokedexText_LG[] = _(\n    \"This POKéMON lives in cold water. It will\\n\"\n    \"leave the water to search for food when\\n\"\n    \"it gets cold outside.\");\n\nconst u8 gWooperPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gQuagsirePokedexText_LG[] = _(\n    \"This carefree POKéMON has an easygoing\\n\"\n    \"nature. While swimming, it always bumps\\n\"\n    \"into boat hulls.\");\n\nconst u8 gQuagsirePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gEspeonPokedexText_LG[] = _(\n    \"It uses the fine hair that covers its body\\n\"\n    \"to sense air currents and predict its\\n\"\n    \"enemy's actions.\");\n\nconst u8 gEspeonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gUmbreonPokedexText_LG[] = _(\n    \"When agitated, this POKéMON protects\\n\"\n    \"itself by spraying poisonous sweat from its\\n\"\n    \"pores.\");\n\nconst u8 gUmbreonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMurkrowPokedexText_LG[] = _(\n    \"Feared and loathed by many, it is\\n\"\n    \"believed to bring misfortune to all those\\n\"\n    \"who see it at night.\");\n\nconst u8 gMurkrowPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSlowkingPokedexText_LG[] = _(\n    \"It has incredible intellect and intuition.\\n\"\n    \"Whatever the situation, it remains calm\\n\"\n    \"and collected.\");\n\nconst u8 gSlowkingPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMisdreavusPokedexText_LG[] = _(\n    \"It likes playing mischievous tricks such as\\n\"\n    \"screaming and wailing to startle people at\\n\"\n    \"night. \");\n\nconst u8 gMisdreavusPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gUnownPokedexText_LG[] = _(\n    \"Their shapes look like hieroglyphs on\\n\"\n    \"ancient tablets. It is said that the two\\n\"\n    \"are somehow related.\");\n\nconst u8 gUnownPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWobbuffetPokedexText_LG[] = _(\n    \"It hates light and shock. If attacked,\\n\"\n    \"it inflates its body to pump up its\\n\"\n    \"counterstrike.\");\n\nconst u8 gWobbuffetPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGirafarigPokedexText_LG[] = _(\n    \"Its tail has a small brain of its own.\\n\"\n    \"Beware! If you get close, it may react\\n\"\n    \"to your scent and bite.\");\n\nconst u8 gGirafarigPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPinecoPokedexText_LG[] = _(\n    \"It likes to make its shell thicker by\\n\"\n    \"adding layers of tree bark. The extra\\n\"\n    \"weight doesn't bother it.\");\n\nconst u8 gPinecoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gForretressPokedexText_LG[] = _(\n    \"Its entire body is shielded by a steel-\\n\"\n    \"hard shell. What lurks inside the armor is\\n\"\n    \"a total mystery.\");\n\nconst u8 gForretressPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDunsparcePokedexText_LG[] = _(\n    \"When spotted, this POKéMON escapes\\n\"\n    \"backward by furiously boring into the\\n\"\n    \"ground with its tail.\");\n\nconst u8 gDunsparcePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGligarPokedexText_LG[] = _(\n    \"It flies straight at its target's face,\\n\"\n    \"then clamps down on the startled\\n\"\n    \"victim to inject poison.\");\n\nconst u8 gGligarPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSteelixPokedexText_LG[] = _(\n    \"Its body has been compressed deep under\\n\"\n    \"the ground. As a result, it is even harder\\n\"\n    \"than diamond.\");\n\nconst u8 gSteelixPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSnubbullPokedexText_LG[] = _(\n    \"Although it looks frightening, it is\\n\"\n    \"actually kind and affectionate. It is very\\n\"\n    \"popular among women.\");\n\nconst u8 gSnubbullPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGranbullPokedexText_LG[] = _(\n    \"It is actually timid and easily spooked.\\n\"\n    \"If attacked, it flails about to fend off\\n\"\n    \"its attacker.\");\n\nconst u8 gGranbullPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gQwilfishPokedexText_LG[] = _(\n    \"To fire its poison spikes, it must inflate\\n\"\n    \"its body by drinking over 2.6 gallons of \\n\"\n    \"water all at once.\");\n\nconst u8 gQwilfishPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gScizorPokedexText_LG[] = _(\n    \"It swings its eye-patterned pincers up to\\n\"\n    \"scare its foes. This makes it look like it\\n\"\n    \"has three heads.\");\n\nconst u8 gScizorPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gShucklePokedexText_LG[] = _(\n    \"The BERRIES it stores in its vaselike\\n\"\n    \"shell decompose and become a gooey\\n\"\n    \"liquid.\");\n\nconst u8 gShucklePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHeracrossPokedexText_LG[] = _(\n    \"This powerful POKéMON thrusts its prized\\n\"\n    \"horn under its enemies' bellies, then lifts\\n\"\n    \"and throws them.\");\n\nconst u8 gHeracrossPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSneaselPokedexText_LG[] = _(\n    \"Its paws conceal sharp claws.\\n\"\n    \"If attacked, it suddenly extends the\\n\"\n    \"claws and startles its enemy.\");\n\nconst u8 gSneaselPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTeddiursaPokedexText_LG[] = _(\n    \"If it finds honey, its crescent mark glows.\\n\"\n    \"It always licks its paws because they are\\n\"\n    \"soaked with honey.\");\n\nconst u8 gTeddiursaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gUrsaringPokedexText_LG[] = _(\n    \"Although it is a good climber, it prefers\\n\"\n    \"to snap stout trees with its forelegs and\\n\"\n    \"eat fallen BERRIES.\");\n\nconst u8 gUrsaringPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSlugmaPokedexText_LG[] = _(\n    \"It never sleeps. It has to keep moving\\n\"\n    \"because if it stopped, its magma body\\n\"\n    \"would cool and harden.\");\n\nconst u8 gSlugmaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMagcargoPokedexText_LG[] = _(\n    \"The shell on its back is just skin that\\n\"\n    \"has cooled and hardened. It breaks easily\\n\"\n    \"with a slight touch.\");\n\nconst u8 gMagcargoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSwinubPokedexText_LG[] = _(\n    \"It rubs its snout on the ground to find\\n\"\n    \"and dig up food. It sometimes discovers\\n\"\n    \"hot springs.\");\n\nconst u8 gSwinubPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPiloswinePokedexText_LG[] = _(\n    \"Because the long hair all over its body\\n\"\n    \"obscures its sight, it just keeps charging\\n\"\n    \"repeatedly.\");\n\nconst u8 gPiloswinePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCorsolaPokedexText_LG[] = _(\n    \"It continuously sheds and grows. The tip\\n\"\n    \"of its head is prized as a treasure for\\n\"\n    \"its beauty.\");\n\nconst u8 gCorsolaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRemoraidPokedexText_LG[] = _(\n    \"It has superb accuracy. The water it\\n\"\n    \"shoots out can strike even moving prey\\n\"\n    \"from more than 100 yards.\");\n\nconst u8 gRemoraidPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gOctilleryPokedexText_LG[] = _(\n    \"It traps enemies with its suction-cupped\\n\"\n    \"tentacles, then smashes them with its\\n\"\n    \"rock-hard head.\");\n\nconst u8 gOctilleryPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDelibirdPokedexText_LG[] = _(\n    \"It carries food all day long. There are\\n\"\n    \"tales about lost people who were saved\\n\"\n    \"by the food it had.\");\n\nconst u8 gDelibirdPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMantinePokedexText_LG[] = _(\n    \"As it majestically swims, it doesn't care\\n\"\n    \"if REMORAID attach to it to scavenge\\n\"\n    \"for its leftovers.\");\n\nconst u8 gMantinePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSkarmoryPokedexText_LG[] = _(\n    \"Its sturdy wings look heavy, but its bones\\n\"\n    \"are hollow and light, allowing it to fly\\n\"\n    \"freely in the sky.\");\n\nconst u8 gSkarmoryPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHoundourPokedexText_LG[] = _(\n    \"It uses different kinds of cries for\\n\"\n    \"communicating with others of its kind and\\n\"\n    \"for pursuing prey.\");\n\nconst u8 gHoundourPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHoundoomPokedexText_LG[] = _(\n    \"If you are burned by the flames it shoots\\n\"\n    \"from its mouth, the pain will never go\\n\"\n    \"away.\");\n\nconst u8 gHoundoomPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gKingdraPokedexText_LG[] = _(\n    \"It is said that it usually hides in\\n\"\n    \"underwater caves. It can create\\n\"\n    \"whirlpools by yawning.\");\n\nconst u8 gKingdraPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPhanpyPokedexText_LG[] = _(\n    \"It swings its long snout around playfully,\\n\"\n    \"but because it is so strong, this can be\\n\"\n    \"dangerous.\");\n\nconst u8 gPhanpyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDonphanPokedexText_LG[] = _(\n    \"It has sharp, hard tusks and a rugged\\n\"\n    \"hide. Its TACKLE is strong enough to\\n\"\n    \"knock down a house.\");\n\nconst u8 gDonphanPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPorygon2PokedexText_LG[] = _(\n    \"This upgraded version of PORYGON is\\n\"\n    \"designed for space exploration. However,\\n\"\n    \"it can't even fly.\");\n\nconst u8 gPorygon2PokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gStantlerPokedexText_LG[] = _(\n    \"Its curved antlers subtly change the flow\\n\"\n    \"of air to create a strange space where\\n\"\n    \"reality is distorted.\");\n\nconst u8 gStantlerPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSmearglePokedexText_LG[] = _(\n    \"A special fluid oozes from the tip of its\\n\"\n    \"tail. It paints the fluid everywhere to\\n\"\n    \"mark its territory.\");\n\nconst u8 gSmearglePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTyroguePokedexText_LG[] = _(\n    \"It is always bursting with energy. To make\\n\"\n    \"itself stronger, it keeps on fighting even\\n\"\n    \"if it loses.\");\n\nconst u8 gTyroguePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHitmontopPokedexText_LG[] = _(\n    \"If you become enchanted by its smooth,\\n\"\n    \"elegant, dance-like kicks, you may get\\n\"\n    \"drilled hard.\");\n\nconst u8 gHitmontopPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSmoochumPokedexText_LG[] = _(\n    \"Its lips are the most sensitive parts on\\n\"\n    \"its body. It always uses its lips first to\\n\"\n    \"examine things.\");\n\nconst u8 gSmoochumPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gElekidPokedexText_LG[] = _(\n    \"It rotates its arms to generate\\n\"\n    \"electricity, but it tires easily, so it\\n\"\n    \"charges up only a little bit.\");\n\nconst u8 gElekidPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMagbyPokedexText_LG[] = _(\n    \"Each and every time it inhales and\\n\"\n    \"exhales, hot embers dribble out of its\\n\"\n    \"mouth and nostrils.\");\n\nconst u8 gMagbyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMiltankPokedexText_LG[] = _(\n    \"Its milk is packed with nutrition, making\\n\"\n    \"it the ultimate beverage for the sick or\\n\"\n    \"weary.\");\n\nconst u8 gMiltankPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBlisseyPokedexText_LG[] = _(\n    \"Anyone who takes even one bite of\\n\"\n    \"BLISSEY's egg becomes unfailingly caring\\n\"\n    \"and pleasant to everyone.\");\n\nconst u8 gBlisseyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRaikouPokedexText_LG[] = _(\n    \"The rain clouds it carries let it fire\\n\"\n    \"thunderbolts at will. They say that it\\n\"\n    \"descended with lightning.\");\n\nconst u8 gRaikouPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gEnteiPokedexText_LG[] = _(\n    \"Volcanoes erupt when it barks. Unable to\\n\"\n    \"restrain its extreme power, it races\\n\"\n    \"headlong around the land.\");\n\nconst u8 gEnteiPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSuicunePokedexText_LG[] = _(\n    \"Said to be the reincarnation of north\\n\"\n    \"winds, it can instantly purify filthy,\\n\"\n    \"murky water.\");\n\nconst u8 gSuicunePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLarvitarPokedexText_LG[] = _(\n    \"It feeds on soil. After it has eaten a\\n\"\n    \"large mountain, it will fall asleep so it\\n\"\n    \"can grow.\");\n\nconst u8 gLarvitarPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPupitarPokedexText_LG[] = _(\n    \"Its shell is as hard as sheet rock, and it\\n\"\n    \"is also very strong. Its THRASHING can\\n\"\n    \"topple a mountain.\");\n\nconst u8 gPupitarPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTyranitarPokedexText_LG[] = _(\n    \"Its body can't be harmed by any sort of\\n\"\n    \"attack, so it is very eager to make\\n\"\n    \"challenges against enemies.\");\n\nconst u8 gTyranitarPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLugiaPokedexText_LG[] = _(\n    \"It is said that it quietly spends its time\\n\"\n    \"deep at the bottom of the sea because\\n\"\n    \"its powers are too strong.\");\n\nconst u8 gLugiaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHoOhPokedexText_LG[] = _(\n    \"Legends claim this POKéMON flies the\\n\"\n    \"world's skies continuously on its\\n\"\n    \"magnificent seven-colored wings.\");\n\nconst u8 gHoOhPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCelebiPokedexText_LG[] = _(\n    \"This POKéMON wanders across time.\\n\"\n    \"Grass and trees flourish in the forests in\\n\"\n    \"which it has appeared.\");\n\nconst u8 gCelebiPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTreeckoPokedexText_LG[] = _(\n    \"It quickly scales even vertical walls.\\n\"\n    \"It senses humidity with its tail to predict\\n\"\n    \"the next day's weather.\");\n\nconst u8 gTreeckoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGrovylePokedexText_LG[] = _(\n    \"Its strongly developed thigh muscles\\n\"\n    \"give it astounding agility and jumping\\n\"\n    \"performance.\");\n\nconst u8 gGrovylePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSceptilePokedexText_LG[] = _(\n    \"The leaves on its forelegs are as sharp\\n\"\n    \"as swords. It agilely leaps about the\\n\"\n    \"branches of trees to strike.\");\n\nconst u8 gSceptilePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTorchicPokedexText_LG[] = _(\n    \"It has a flame sac inside its belly that\\n\"\n    \"perpetually burns. It feels warm if it is\\n\"\n    \"hugged.\");\n\nconst u8 gTorchicPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCombuskenPokedexText_LG[] = _(\n    \"It boosts its concentration by emitting\\n\"\n    \"harsh cries. Its kicks have outstanding\\n\"\n    \"destructive power.\");\n\nconst u8 gCombuskenPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBlazikenPokedexText_LG[] = _(\n    \"When facing a tough foe, it looses flames\\n\"\n    \"from its wrists. Its powerful legs let it\\n\"\n    \"jump clear over buildings.\");\n\nconst u8 gBlazikenPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMudkipPokedexText_LG[] = _(\n    \"Its large tail fin propels it through\\n\"\n    \"water with powerful acceleration. It is\\n\"\n    \"strong in spite of its size.\");\n\nconst u8 gMudkipPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMarshtompPokedexText_LG[] = _(\n    \"It is at its best when on muddy ground\\n\"\n    \"with poor footing. It quickly overwhelms\\n\"\n    \"foes struggling in mud.\");\n\nconst u8 gMarshtompPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSwampertPokedexText_LG[] = _(\n    \"Its arms are rock-hard. With one swing,\\n\"\n    \"they can batter down its foe. It makes its\\n\"\n    \"nest on beautiful beaches.\");\n\nconst u8 gSwampertPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPoochyenaPokedexText_LG[] = _(\n    \"It has a very tenacious nature. Its acute\\n\"\n    \"sense of smell lets it chase a chosen\\n\"\n    \"prey without ever losing track.\");\n\nconst u8 gPoochyenaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMightyenaPokedexText_LG[] = _(\n    \"It will always obey the commands of a\\n\"\n    \"skilled TRAINER. Its behavior arises from\\n\"\n    \"its living in packs in ancient times.\");\n\nconst u8 gMightyenaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gZigzagoonPokedexText_LG[] = _(\n    \"A POKéMON with abundant curiosity.\\n\"\n    \"It shows an interest in everything, so it\\n\"\n    \"always zigs and zags.\");\n\nconst u8 gZigzagoonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLinoonePokedexText_LG[] = _(\n    \"When running in a straight line, it can top\\n\"\n    \"60 miles per hour. However, it has a\\n\"\n    \"tough time with curved roads.\");\n\nconst u8 gLinoonePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWurmplePokedexText_LG[] = _(\n    \"It lives amidst tall grass and in forests.\\n\"\n    \"When attacked, it resists by pointing its\\n\"\n    \"venomous spikes at the foe.\");\n\nconst u8 gWurmplePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSilcoonPokedexText_LG[] = _(\n    \"It conserves its energy by moving as\\n\"\n    \"little as possible. It awaits evolution\\n\"\n    \"while drinking only a little rainwater.\");\n\nconst u8 gSilcoonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBeautiflyPokedexText_LG[] = _(\n    \"Despite its appearance, it has an\\n\"\n    \"aggressive nature. It attacks by jabbing\\n\"\n    \"with its long, thin mouth.\");\n\nconst u8 gBeautiflyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCascoonPokedexText_LG[] = _(\n    \"Its body, which is made of soft silk,\\n\"\n    \"hardens over time. When cracks appear,\\n\"\n    \"evolution is near.\");\n\nconst u8 gCascoonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDustoxPokedexText_LG[] = _(\n    \"It scatters horribly toxic dust when it\\n\"\n    \"senses danger. They tend to gather in the\\n\"\n    \"glow of streetlamps at night.\");\n\nconst u8 gDustoxPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLotadPokedexText_LG[] = _(\n    \"It searches about for clean water. If it\\n\"\n    \"does not drink water for too long, the\\n\"\n    \"leaf on its head wilts.\");\n\nconst u8 gLotadPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLombrePokedexText_LG[] = _(\n    \"It lives at the water's edge where it is\\n\"\n    \"sunny. It sleeps on a bed of water grass\\n\"\n    \"by day and becomes active at night.\");\n\nconst u8 gLombrePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLudicoloPokedexText_LG[] = _(\n    \"The rhythm of bright, festive music\\n\"\n    \"activates LUDICOLO's cells, making it more\\n\"\n    \"powerful.\");\n\nconst u8 gLudicoloPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSeedotPokedexText_LG[] = _(\n    \"If it remains still, it becomes impossible\\n\"\n    \"to distinguish from real nuts. It delights\\n\"\n    \"in surprising foraging PIDGEY.\");\n\nconst u8 gSeedotPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNuzleafPokedexText_LG[] = _(\n    \"They live in holes bored in large trees.\\n\"\n    \"The sound of NUZLEAF's grass flute fills\\n\"\n    \"listeners with dread.\");\n\nconst u8 gNuzleafPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gShiftryPokedexText_LG[] = _(\n    \"A POKéMON that was feared as a forest\\n\"\n    \"guardian. It can read the foe's mind and\\n\"\n    \"take preemptive action.\");\n\nconst u8 gShiftryPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTaillowPokedexText_LG[] = _(\n    \"It dislikes cold seasons. They migrate to\\n\"\n    \"other lands in search of warmth, flying\\n\"\n    \"over 180 miles a day.\");\n\nconst u8 gTaillowPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSwellowPokedexText_LG[] = _(\n    \"If its two tail feathers are standing at\\n\"\n    \"attention, it is proof of good health.\\n\"\n    \"It soars elegantly in the sky.\");\n\nconst u8 gSwellowPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWingullPokedexText_LG[] = _(\n    \"It rides upon ocean winds as if it were\\n\"\n    \"a glider. In the winter, it hides food\\n\"\n    \"around its nest.\");\n\nconst u8 gWingullPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPelipperPokedexText_LG[] = _(\n    \"It is a flying transporter that carries\\n\"\n    \"small POKéMON in its beak. It bobs on the\\n\"\n    \"waves to rest its wings.\");\n\nconst u8 gPelipperPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRaltsPokedexText_LG[] = _(\n    \"It is highly attuned to the emotions of\\n\"\n    \"people and POKéMON. It hides if it senses\\n\"\n    \"hostility.\");\n\nconst u8 gRaltsPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gKirliaPokedexText_LG[] = _(\n    \"The cheerful spirit of its TRAINER gives\\n\"\n    \"it energy for its psychokinetic power.\\n\"\n    \"It spins and dances when happy.\");\n\nconst u8 gKirliaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGardevoirPokedexText_LG[] = _(\n    \"It has the power to predict the future.\\n\"\n    \"Its power peaks when it is protecting its\\n\"\n    \"TRAINER.\");\n\nconst u8 gGardevoirPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSurskitPokedexText_LG[] = _(\n    \"They usually live on ponds, but after an\\n\"\n    \"evening shower, they may appear on\\n\"\n    \"puddles in towns.\");\n\nconst u8 gSurskitPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMasquerainPokedexText_LG[] = _(\n    \"The antennae have distinctive patterns\\n\"\n    \"that look like eyes. When it rains, they\\n\"\n    \"grow heavy, making flight impossible.\");\n\nconst u8 gMasquerainPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gShroomishPokedexText_LG[] = _(\n    \"It prefers damp places. By day it remains\\n\"\n    \"still in the forest shade. It releases\\n\"\n    \"toxic powder from its head.\");\n\nconst u8 gShroomishPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBreloomPokedexText_LG[] = _(\n    \"The seeds on its tail are made of toxic\\n\"\n    \"spores. It knocks out foes with quick,\\n\"\n    \"virtually invisible punches.\");\n\nconst u8 gBreloomPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSlakothPokedexText_LG[] = _(\n    \"It sleeps for 20 hours every day. Making\\n\"\n    \"drowsy those that see it is one of\\n\"\n    \"its abilities.\");\n\nconst u8 gSlakothPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gVigorothPokedexText_LG[] = _(\n    \"It is always hungry because it won't stop\\n\"\n    \"rampaging. Even while it is eating, it\\n\"\n    \"can't keep still.\");\n\nconst u8 gVigorothPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSlakingPokedexText_LG[] = _(\n    \"It is the world's most slothful POKéMON.\\n\"\n    \"However, it can exert horrifying power by\\n\"\n    \"releasing pent-up energy all at once.\");\n\nconst u8 gSlakingPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNincadaPokedexText_LG[] = _(\n    \"Because it lived almost entirely\\n\"\n    \"underground, it is nearly blind.\\n\"\n    \"It uses its antennae instead.\");\n\nconst u8 gNincadaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNinjaskPokedexText_LG[] = _(\n    \"This POKéMON is so quick, it is said to\\n\"\n    \"be able to avoid any attack. It loves to\\n\"\n    \"feed on tree sap.\");\n\nconst u8 gNinjaskPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gShedinjaPokedexText_LG[] = _(\n    \"A most peculiar POKéMON that somehow\\n\"\n    \"appears in a POKé BALL when a NINCADA\\n\"\n    \"evolves.\");\n\nconst u8 gShedinjaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWhismurPokedexText_LG[] = _(\n    \"It usually murmurs, but starts crying\\n\"\n    \"loudly if it senses danger. It stops when\\n\"\n    \"its ear covers are shut.\");\n\nconst u8 gWhismurPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLoudredPokedexText_LG[] = _(\n    \"When it stamps its feet and bellows, it\\n\"\n    \"generates ultrasonic waves that can blow\\n\"\n    \"apart a house.\");\n\nconst u8 gLoudredPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gExploudPokedexText_LG[] = _(\n    \"It emits a variety of sounds from the \\n\"\n    \"holes all over its body. Its loud cries\\n\"\n    \"can be heard from over six miles away.\");\n\nconst u8 gExploudPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMakuhitaPokedexText_LG[] = _(\n    \"It grows stronger by enduring harsh\\n\"\n    \"training. It is a gutsy POKéMON that can\\n\"\n    \"withstand any attack.\");\n\nconst u8 gMakuhitaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHariyamaPokedexText_LG[] = _(\n    \"It stomps on the ground to build power.\\n\"\n    \"It can send a 10-ton truck flying with a\\n\"\n    \"straight-arm punch.\");\n\nconst u8 gHariyamaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAzurillPokedexText_LG[] = _(\n    \"It battles by flinging around its tail,\\n\"\n    \"which is bigger than its body. The\\n\"\n    \"tail is a flotation device in water.\");\n\nconst u8 gAzurillPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNosepassPokedexText_LG[] = _(\n    \"Its magnetic nose consistently faces\\n\"\n    \"north. Travelers check NOSEPASS to get\\n\"\n    \"their bearings.\");\n\nconst u8 gNosepassPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSkittyPokedexText_LG[] = _(\n    \"It is said to be difficult to earn its\\n\"\n    \"trust. However, it is extremely popular\\n\"\n    \"for its cute looks and behavior.\");\n\nconst u8 gSkittyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDelcattyPokedexText_LG[] = _(\n    \"The favorite of trend-conscious\\n\"\n    \"female TRAINERS, they are used in\\n\"\n    \"competition for their style and fur.\");\n\nconst u8 gDelcattyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSableyePokedexText_LG[] = _(\n    \"It feeds on gemstone crystals.\\n\"\n    \"In darkness, its eyes sparkle with the\\n\"\n    \"glitter of jewels.\");\n\nconst u8 gSableyePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMawilePokedexText_LG[] = _(\n    \"It uses its docile-looking face to lull\\n\"\n    \"foes into complacency, then bites with its\\n\"\n    \"huge, relentless jaws.\");\n\nconst u8 gMawilePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAronPokedexText_LG[] = _(\n    \"It eats iron to build its steel body.\\n\"\n    \"It is a pest that descends from mountains\\n\"\n    \"to eat bridges and train tracks.\");\n\nconst u8 gAronPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLaironPokedexText_LG[] = _(\n    \"It habitually shows off its strength with\\n\"\n    \"the size of sparks it creates by ramming\\n\"\n    \"its steel body into boulders.\");\n\nconst u8 gLaironPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAggronPokedexText_LG[] = _(\n    \"It claims a large mountain as its sole\\n\"\n    \"territory. It mercilessly thrashes those\\n\"\n    \"that violate its space.\");\n\nconst u8 gAggronPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMedititePokedexText_LG[] = _(\n    \"It never skips its daily yoga training.\\n\"\n    \"It heightens its inner strength through\\n\"\n    \"meditation.\");\n\nconst u8 gMedititePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMedichamPokedexText_LG[] = _(\n    \"It elegantly avoids attacks with dance-\\n\"\n    \"like steps, then launches a devastating\\n\"\n    \"blow in the same motion.\");\n\nconst u8 gMedichamPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gElectrikePokedexText_LG[] = _(\n    \"It stores static electricity in its fur\\n\"\n    \"for discharging. It gives off sparks if a\\n\"\n    \"storm approaches.\");\n\nconst u8 gElectrikePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gManectricPokedexText_LG[] = _(\n    \"It rarely appears before people.\\n\"\n    \"It is said to nest where lightning has\\n\"\n    \"fallen.\");\n\nconst u8 gManectricPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gPluslePokedexText_LG[] = _(\n    \"It cheers on partners while scattering\\n\"\n    \"sparks from its body. It climbs telephone\\n\"\n    \"poles to absorb electricity.\");\n\nconst u8 gPluslePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMinunPokedexText_LG[] = _(\n    \"Its dislike of water makes it take shelter\\n\"\n    \"under the eaves of houses in rain. It uses\\n\"\n    \"pom-poms made of sparks for cheering.\");\n\nconst u8 gMinunPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gVolbeatPokedexText_LG[] = _(\n    \"It lives around clean ponds. At night,\\n\"\n    \"its rear lights up. It converses with\\n\"\n    \"others by flashing its light.\");\n\nconst u8 gVolbeatPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gIllumisePokedexText_LG[] = _(\n    \"It guides VOLBEAT to draw signs in night\\n\"\n    \"skies. There are scientists that study the\\n\"\n    \"patterns it creates.\");\n\nconst u8 gIllumisePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRoseliaPokedexText_LG[] = _(\n    \"Its flowers give off a relaxing fragrance.\\n\"\n    \"The stronger its aroma, the healthier\\n\"\n    \"the ROSELIA is.\");\n\nconst u8 gRoseliaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGulpinPokedexText_LG[] = _(\n    \"There is nothing its stomach can't digest.\\n\"\n    \"While it is digesting, vile, overpowering\\n\"\n    \"gases are expelled.\");\n\nconst u8 gGulpinPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSwalotPokedexText_LG[] = _(\n    \"It can swallow a tire whole in one gulp.\\n\"\n    \"It secretes a horribly toxic fluid from\\n\"\n    \"the pores on its body.\");\n\nconst u8 gSwalotPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCarvanhaPokedexText_LG[] = _(\n    \"It lives in massive rivers that course\\n\"\n    \"through jungles. It swarms prey that\\n\"\n    \"enter its territory.\");\n\nconst u8 gCarvanhaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSharpedoPokedexText_LG[] = _(\n    \"The ruffian of the seas, it has fangs that\\n\"\n    \"crunch through iron. It swims by jetting\\n\"\n    \"water from its rear.\");\n\nconst u8 gSharpedoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWailmerPokedexText_LG[] = _(\n    \"When it sucks in a large volume of\\n\"\n    \"seawater, it becomes like a big, bouncy\\n\"\n    \"ball. It eats a ton of food daily.\");\n\nconst u8 gWailmerPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWailordPokedexText_LG[] = _(\n    \"It is among the largest of all POKéMON.\\n\"\n    \"It herds prey in a pack then swallows the\\n\"\n    \"massed prey in one gulp.\");\n\nconst u8 gWailordPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gNumelPokedexText_LG[] = _(\n    \"Magma of almost 2,200 degrees Fahrenheit\\n\"\n    \"courses through its body. When it grows\\n\"\n    \"cold, the magma hardens and slows it.\");\n\nconst u8 gNumelPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCameruptPokedexText_LG[] = _(\n    \"If angered, the humps on its back erupt\\n\"\n    \"in a shower of molten lava. It lives in\\n\"\n    \"the craters of volcanoes.\");\n\nconst u8 gCameruptPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTorkoalPokedexText_LG[] = _(\n    \"It burns coal inside its shell. If it is\\n\"\n    \"attacked, it belches thick, black smoke\\n\"\n    \"and flees.\");\n\nconst u8 gTorkoalPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSpoinkPokedexText_LG[] = _(\n    \"It apparently dies if it stops bouncing\\n\"\n    \"about. It carries a pearl from CLAMPERL\\n\"\n    \"on its head.\");\n\nconst u8 gSpoinkPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGrumpigPokedexText_LG[] = _(\n    \"It can gain control over foes by doing\\n\"\n    \"odd dance steps. The black pearls on its\\n\"\n    \"forehead are precious gems.\");\n\nconst u8 gGrumpigPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSpindaPokedexText_LG[] = _(\n    \"No two SPINDA are said to have identical\\n\"\n    \"patterns. It confuses foes with its\\n\"\n    \"stumbling motions.\");\n\nconst u8 gSpindaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTrapinchPokedexText_LG[] = _(\n    \"It lives in arid deserts. It makes a\\n\"\n    \"sloping pit trap in sand where it\\n\"\n    \"patiently awaits prey.\");\n\nconst u8 gTrapinchPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gVibravaPokedexText_LG[] = _(\n    \"It generates ultrasonic waves by violently\\n\"\n    \"flapping its wings. After making its prey\\n\"\n    \"faint, it melts the prey with acid.\");\n\nconst u8 gVibravaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gFlygonPokedexText_LG[] = _(\n    \"It hides itself by kicking up desert sand\\n\"\n    \"with its wings. Red covers shield its eyes\\n\"\n    \"from sand.\");\n\nconst u8 gFlygonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCacneaPokedexText_LG[] = _(\n    \"It prefers harsh environments such as\\n\"\n    \"deserts. It can survive for 30 days on\\n\"\n    \"water stored in its body.\");\n\nconst u8 gCacneaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCacturnePokedexText_LG[] = _(\n    \"It lives in deserts. It becomes active at\\n\"\n    \"night when it hunts for prey exhausted\\n\"\n    \"from the desert's heat.\");\n\nconst u8 gCacturnePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSwabluPokedexText_LG[] = _(\n    \"It constantly grooms its cotton-like\\n\"\n    \"wings. It takes a shower to clean\\n\"\n    \"itself if it becomes dirty.\");\n\nconst u8 gSwabluPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAltariaPokedexText_LG[] = _(\n    \"If you hear a beautiful melody trilling\\n\"\n    \"deep among mountains far from people,\\n\"\n    \"it is ALTARIA's humming.\");\n\nconst u8 gAltariaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gZangoosePokedexText_LG[] = _(\n    \"If it comes across a SEVIPER, its fur\\n\"\n    \"bristles and it assumes its battle pose.\\n\"\n    \"Its sharp claws are its best weapon.\");\n\nconst u8 gZangoosePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSeviperPokedexText_LG[] = _(\n    \"It sharpens its swordlike tail on hard\\n\"\n    \"rocks. It hides in tall grass and strikes\\n\"\n    \"unwary prey with venomous fangs.\");\n\nconst u8 gSeviperPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLunatonePokedexText_LG[] = _(\n    \"Its health ebbs and flows with the lunar\\n\"\n    \"cycle. It brims with power when exposed\\n\"\n    \"to the light of the full moon.\");\n\nconst u8 gLunatonePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSolrockPokedexText_LG[] = _(\n    \"It absorbs solar energy during the day.\\n\"\n    \"Always expressionless, it can sense what\\n\"\n    \"its foe is thinking.\");\n\nconst u8 gSolrockPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBarboachPokedexText_LG[] = _(\n    \"It probes muddy riverbeds with its two\\n\"\n    \"long whiskers. A slimy film protects its\\n\"\n    \"body.\");\n\nconst u8 gBarboachPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWhiscashPokedexText_LG[] = _(\n    \"It makes its nest at the bottom of \\n\"\n    \"swamps. It will eat anything - if it is\\n\"\n    \"alive, WHISCASH will eat it.\");\n\nconst u8 gWhiscashPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCorphishPokedexText_LG[] = _(\n    \"It came from overseas. It is a very hardy\\n\"\n    \"creature that will quickly proliferate,\\n\"\n    \"even in polluted streams.\");\n\nconst u8 gCorphishPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCrawdauntPokedexText_LG[] = _(\n    \"A rough customer that wildly flails its\\n\"\n    \"giant claws. It is said to be extremely\\n\"\n    \"hard to raise.\");\n\nconst u8 gCrawdauntPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBaltoyPokedexText_LG[] = _(\n    \"It was discovered in ancient ruins.\\n\"\n    \"While moving, it constantly spins. It\\n\"\n    \"stands on one foot even when asleep.\");\n\nconst u8 gBaltoyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gClaydolPokedexText_LG[] = _(\n    \"It appears to have been born from clay\\n\"\n    \"dolls made by ancient people. It uses\\n\"\n    \"telekinesis to float and move.\");\n\nconst u8 gClaydolPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLileepPokedexText_LG[] = _(\n    \"It became extinct roughly 100 million\\n\"\n    \"years ago. It was regenerated from a\\n\"\n    \"fossil using advanced techniques.\");\n\nconst u8 gLileepPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCradilyPokedexText_LG[] = _(\n    \"It ensnares prey with its eight tentacles.\\n\"\n    \"It then melts the prey with a strong acid\\n\"\n    \"before feeding.\");\n\nconst u8 gCradilyPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAnorithPokedexText_LG[] = _(\n    \"It is a kind of POKéMON progenitor.\\n\"\n    \"It uses its extending claws to catch prey\\n\"\n    \"hiding among rocks on the seafloor.\");\n\nconst u8 gAnorithPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gArmaldoPokedexText_LG[] = _(\n    \"Protected by a hard shell, its body is\\n\"\n    \"very sturdy. It skewers prey with its\\n\"\n    \"claws to feed.\");\n\nconst u8 gArmaldoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gFeebasPokedexText_LG[] = _(\n    \"Ridiculed for its shabby appearance,\\n\"\n    \"it is ignored by researchers. It lives in\\n\"\n    \"ponds choked with weeds.\");\n\nconst u8 gFeebasPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMiloticPokedexText_LG[] = _(\n    \"MILOTIC is breathtakingly beautiful.\\n\"\n    \"Those that see it are said to forget their\\n\"\n    \"combative spirits.\");\n\nconst u8 gMiloticPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gCastformPokedexText_LG[] = _(\n    \"It has the ability to change its form into\\n\"\n    \"the sun, the rain, or a snow cloud, \\n\"\n    \"depending on the weather.\");\n\nconst u8 gCastformPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gKecleonPokedexText_LG[] = _(\n    \"It changes body color to blend in with\\n\"\n    \"its surroundings. It also changes color if\\n\"\n    \"it is happy or sad.\");\n\nconst u8 gKecleonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gShuppetPokedexText_LG[] = _(\n    \"It loves to feed on feelings like envy and\\n\"\n    \"malice. Its upright horn catches the\\n\"\n    \"emotions of people.\");\n\nconst u8 gShuppetPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBanettePokedexText_LG[] = _(\n    \"Strong feelings of hatred turned a puppet\\n\"\n    \"into a POKéMON. If it opens its mouth,\\n\"\n    \"its cursed energy escapes.\");\n\nconst u8 gBanettePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDuskullPokedexText_LG[] = _(\n    \"Making itself invisible, it silently sneaks\\n\"\n    \"up to prey. It has the ability to slip\\n\"\n    \"through thick walls.\");\n\nconst u8 gDuskullPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDusclopsPokedexText_LG[] = _(\n    \"Its body is entirely hollow. When it opens\\n\"\n    \"its mouth, it sucks everything in as if it\\n\"\n    \"were a black hole.\");\n\nconst u8 gDusclopsPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gTropiusPokedexText_LG[] = _(\n    \"It lives in tropical jungles. The bunch of\\n\"\n    \"fruit around its neck is delicious.\\n\"\n    \"The fruit grows twice a year.\");\n\nconst u8 gTropiusPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gChimechoPokedexText_LG[] = _(\n    \"It travels by riding on winds. It cleverly\\n\"\n    \"uses its long tail to pluck nuts and\\n\"\n    \"berries, which it loves to eat.\");\n\nconst u8 gChimechoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gAbsolPokedexText_LG[] = _(\n    \"It appears when it senses an impending\\n\"\n    \"natural disaster. As a result, it was\\n\"\n    \"mistaken as a doom-bringer.\");\n\nconst u8 gAbsolPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWynautPokedexText_LG[] = _(\n    \"It tends to move in a pack with others.\\n\"\n    \"They cluster in a tight group to sleep in\\n\"\n    \"a cave.\");\n\nconst u8 gWynautPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSnoruntPokedexText_LG[] = _(\n    \"It is said that a home visited by a\\n\"\n    \"SNORUNT will prosper. It can withstand\\n\"\n    \"cold of minus 150 degrees Fahrenheit.\");\n\nconst u8 gSnoruntPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGlaliePokedexText_LG[] = _(\n    \"It has a body of ice that won't melt,\\n\"\n    \"even with fire. It can instantly freeze\\n\"\n    \"moisture in the atmosphere.\");\n\nconst u8 gGlaliePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSphealPokedexText_LG[] = _(\n    \"Its body is covered in fluffy fur.\\n\"\n    \"The fur keeps it from feeling cold while\\n\"\n    \"it is rolling on ice.\");\n\nconst u8 gSphealPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSealeoPokedexText_LG[] = _(\n    \"It touches new things with its nose to\\n\"\n    \"test for smell and feel. It plays by\\n\"\n    \"spinning SPHEAL on its nose.\");\n\nconst u8 gSealeoPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gWalreinPokedexText_LG[] = _(\n    \"It swims through icy seas while shattering\\n\"\n    \"ice floes with its large tusks. It is\\n\"\n    \"protected by its thick blubber.\");\n\nconst u8 gWalreinPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gClamperlPokedexText_LG[] = _(\n    \"It is protected by a sturdy shell.\\n\"\n    \"Once in a lifetime, it makes a magnificent\\n\"\n    \"pearl.\");\n\nconst u8 gClamperlPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gHuntailPokedexText_LG[] = _(\n    \"It lives deep in the sea where no light\\n\"\n    \"ever filters down. It lights up its small\\n\"\n    \"fishlike tail to attract prey.\");\n\nconst u8 gHuntailPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGorebyssPokedexText_LG[] = _(\n    \"Its swimming form is exquisitely elegant.\\n\"\n    \"With its thin mouth, it feeds on seaweed\\n\"\n    \"that grows between rocks.\");\n\nconst u8 gGorebyssPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRelicanthPokedexText_LG[] = _(\n    \"It has remained unchanged for 100\\n\"\n    \"million years. It was discovered\\n\"\n    \"during a deep-sea exploration.\");\n\nconst u8 gRelicanthPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLuvdiscPokedexText_LG[] = _(\n    \"During the spawning season, countless\\n\"\n    \"LUVDISC congregate at coral reefs,\\n\"\n    \"turning the waters pink.\");\n\nconst u8 gLuvdiscPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBagonPokedexText_LG[] = _(\n    \"Its steel-hard head can shatter boulders.\\n\"\n    \"It longingly hopes for wings to grow so it\\n\"\n    \"can fly.\");\n\nconst u8 gBagonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gShelgonPokedexText_LG[] = _(\n    \"Its armored body makes all attacks bounce\\n\"\n    \"off. The armor is too tough, however,\\n\"\n    \"making it heavy and somewhat sluggish.\");\n\nconst u8 gShelgonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gSalamencePokedexText_LG[] = _(\n    \"It becomes uncontrollable if it is\\n\"\n    \"enraged. It destroys everything with\\n\"\n    \"shredding claws and fire.\");\n\nconst u8 gSalamencePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gBeldumPokedexText_LG[] = _(\n    \"It uses magnetic waves to converse with\\n\"\n    \"its kind. All the cells in its body are\\n\"\n    \"magnetic.\");\n\nconst u8 gBeldumPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMetangPokedexText_LG[] = _(\n    \"It floats midair using magnetism. Its body\\n\"\n    \"is so tough, even a crash with a jet\\n\"\n    \"plane won't leave a scratch.\");\n\nconst u8 gMetangPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gMetagrossPokedexText_LG[] = _(\n    \"It is formed by two METANG fusing.\\n\"\n    \"Its four brains are said to be superior\\n\"\n    \"to a supercomputer.\");\n\nconst u8 gMetagrossPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRegirockPokedexText_LG[] = _(\n    \"It is entirely composed of rocks with no\\n\"\n    \"sign of a brain or heart. It is a mystery\\n\"\n    \"even to modern scientists.\");\n\nconst u8 gRegirockPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRegicePokedexText_LG[] = _(\n    \"Research revealed that its body is made\\n\"\n    \"of the same kind of ice that is found at\\n\"\n    \"the South Pole.\");\n\nconst u8 gRegicePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRegisteelPokedexText_LG[] = _(\n    \"It is sturdier than any kind of metal.\\n\"\n    \"It hardened due to pressure underground\\n\"\n    \"over tens of thousands of years.\");\n\nconst u8 gRegisteelPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLatiasPokedexText_LG[] = _(\n    \"It can telepathically communicate with\\n\"\n    \"people. It changes its appearance using\\n\"\n    \"its down that refracts light.\");\n\nconst u8 gLatiasPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gLatiosPokedexText_LG[] = _(\n    \"It has a docile temperament and dislikes\\n\"\n    \"fighting. Tucking in its forelegs, it can\\n\"\n    \"fly faster than a jet plane.\");\n\nconst u8 gLatiosPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gKyogrePokedexText_LG[] = _(\n    \"This POKéMON is said to have expanded\\n\"\n    \"the sea by bringing heavy rains.\\n\"\n    \"It has the power to control water.\");\n\nconst u8 gKyogrePokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gGroudonPokedexText_LG[] = _(\n    \"This legendary POKéMON is said to\\n\"\n    \"represent the land. It went to sleep after\\n\"\n    \"dueling KYOGRE.\");\n\nconst u8 gGroudonPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gRayquazaPokedexText_LG[] = _(\n    \"It has lived for hundreds of millions of\\n\"\n    \"years in the ozone layer. Its flying form\\n\"\n    \"looks like a meteor.\");\n\nconst u8 gRayquazaPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gJirachiPokedexText_LG[] = _(\n    \"It is said to make any wish come true.\\n\"\n    \"It is awake for only seven days out of\\n\"\n    \"a thousand years.\");\n\nconst u8 gJirachiPokedexTextUnused_LG[] = _(\"\");\n\nconst u8 gDeoxysPokedexText_LG[] = _(\n    \"When it changes form, an aurora appears.\\n\"\n    \"It absorbs attacks by altering its\\n\"\n    \"cellular structure.\");\n\nconst u8 gDeoxysPokedexTextUnused_LG[] = _(\"\");\n"
  },
  {
    "path": "src/data/pokemon/species_info.h",
    "content": "// Maximum value for a female Pokémon is 254 (MON_FEMALE) which is 100% female.\n// 255 (MON_GENDERLESS) is reserved for genderless Pokémon.\n#define PERCENT_FEMALE(percent) min(254, ((percent * 255) / 100))\n\n#define OLD_UNOWN_SPECIES_INFO                                         \\\n    {                                                                  \\\n        .baseHP = 50,                                                  \\\n        .baseAttack = 150,                                             \\\n        .baseDefense = 50,                                             \\\n        .baseSpAttack = 150,                                           \\\n        .baseSpDefense = 50,                                           \\\n        .baseSpeed = 150,                                              \\\n        .types = {TYPE_NORMAL, TYPE_NORMAL},                           \\\n        .catchRate = 3,                                                \\\n        .expYield = 1,                                                 \\\n        .evYield_HP = 2,                                               \\\n        .evYield_Attack = 2,                                           \\\n        .evYield_Defense = 2,                                          \\\n        .evYield_Speed = 2,                                            \\\n        .evYield_SpAttack = 2,                                         \\\n        .evYield_SpDefense = 2,                                        \\\n        .itemCommon = ITEM_NONE,                                       \\\n        .itemRare = ITEM_NONE,                                         \\\n        .genderRatio = MON_GENDERLESS,                                 \\\n        .eggCycles = 120,                                              \\\n        .friendship = 0,                                               \\\n        .growthRate = GROWTH_MEDIUM_FAST,                              \\\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED}, \\\n        .abilities = {ABILITY_NONE, ABILITY_NONE},                     \\\n        .safariZoneFleeRate = 0,                                       \\\n        .bodyColor = BODY_COLOR_BLACK,                                 \\\n        .noFlip = FALSE,                                               \\\n    }\n\nconst struct SpeciesInfo gSpeciesInfo[] =\n{\n    [SPECIES_NONE] = {0},\n    [SPECIES_BULBASAUR] =\n    {\n        .baseHP = 45,\n        .baseAttack = 49,\n        .baseDefense = 49,\n        .baseSpeed = 45,\n        .baseSpAttack = 65,\n        .baseSpDefense = 65,\n        .types = {TYPE_GRASS, TYPE_POISON},\n        .catchRate = 45,\n        .expYield = 64,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_OVERGROW, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_IVYSAUR] =\n    {\n        .baseHP = 60,\n        .baseAttack = 62,\n        .baseDefense = 63,\n        .baseSpeed = 60,\n        .baseSpAttack = 80,\n        .baseSpDefense = 80,\n        .types = {TYPE_GRASS, TYPE_POISON},\n        .catchRate = 45,\n        .expYield = 141,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_OVERGROW, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_VENUSAUR] =\n    {\n        .baseHP = 80,\n        .baseAttack = 82,\n        .baseDefense = 83,\n        .baseSpeed = 80,\n        .baseSpAttack = 100,\n        .baseSpDefense = 100,\n        .types = {TYPE_GRASS, TYPE_POISON},\n        .catchRate = 45,\n        .expYield = 208,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_OVERGROW, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CHARMANDER] =\n    {\n        .baseHP = 39,\n        .baseAttack = 52,\n        .baseDefense = 43,\n        .baseSpeed = 65,\n        .baseSpAttack = 60,\n        .baseSpDefense = 50,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 45,\n        .expYield = 65,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_BLAZE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CHARMELEON] =\n    {\n        .baseHP = 58,\n        .baseAttack = 64,\n        .baseDefense = 58,\n        .baseSpeed = 80,\n        .baseSpAttack = 80,\n        .baseSpDefense = 65,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 45,\n        .expYield = 142,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_BLAZE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CHARIZARD] =\n    {\n        .baseHP = 78,\n        .baseAttack = 84,\n        .baseDefense = 78,\n        .baseSpeed = 100,\n        .baseSpAttack = 109,\n        .baseSpDefense = 85,\n        .types = {TYPE_FIRE, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 209,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_BLAZE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SQUIRTLE] =\n    {\n        .baseHP = 44,\n        .baseAttack = 48,\n        .baseDefense = 65,\n        .baseSpeed = 43,\n        .baseSpAttack = 50,\n        .baseSpDefense = 64,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 66,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_TORRENT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WARTORTLE] =\n    {\n        .baseHP = 59,\n        .baseAttack = 63,\n        .baseDefense = 80,\n        .baseSpeed = 58,\n        .baseSpAttack = 65,\n        .baseSpDefense = 80,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 143,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_TORRENT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BLASTOISE] =\n    {\n        .baseHP = 79,\n        .baseAttack = 83,\n        .baseDefense = 100,\n        .baseSpeed = 78,\n        .baseSpAttack = 85,\n        .baseSpDefense = 105,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 210,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 3,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_TORRENT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CATERPIE] =\n    {\n        .baseHP = 45,\n        .baseAttack = 30,\n        .baseDefense = 35,\n        .baseSpeed = 45,\n        .baseSpAttack = 20,\n        .baseSpDefense = 20,\n        .types = {TYPE_BUG, TYPE_BUG},\n        .catchRate = 255,\n        .expYield = 53,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SHIELD_DUST, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_METAPOD] =\n    {\n        .baseHP = 50,\n        .baseAttack = 20,\n        .baseDefense = 55,\n        .baseSpeed = 30,\n        .baseSpAttack = 25,\n        .baseSpDefense = 25,\n        .types = {TYPE_BUG, TYPE_BUG},\n        .catchRate = 120,\n        .expYield = 72,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BUTTERFREE] =\n    {\n        .baseHP = 60,\n        .baseAttack = 45,\n        .baseDefense = 50,\n        .baseSpeed = 70,\n        .baseSpAttack = 80,\n        .baseSpDefense = 80,\n        .types = {TYPE_BUG, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 160,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SILVER_POWDER,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_COMPOUND_EYES, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WEEDLE] =\n    {\n        .baseHP = 40,\n        .baseAttack = 35,\n        .baseDefense = 30,\n        .baseSpeed = 50,\n        .baseSpAttack = 20,\n        .baseSpDefense = 20,\n        .types = {TYPE_BUG, TYPE_POISON},\n        .catchRate = 255,\n        .expYield = 52,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SHIELD_DUST, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_KAKUNA] =\n    {\n        .baseHP = 45,\n        .baseAttack = 25,\n        .baseDefense = 50,\n        .baseSpeed = 35,\n        .baseSpAttack = 25,\n        .baseSpDefense = 25,\n        .types = {TYPE_BUG, TYPE_POISON},\n        .catchRate = 120,\n        .expYield = 71,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BEEDRILL] =\n    {\n        .baseHP = 65,\n        .baseAttack = 80,\n        .baseDefense = 40,\n        .baseSpeed = 75,\n        .baseSpAttack = 45,\n        .baseSpDefense = 80,\n        .types = {TYPE_BUG, TYPE_POISON},\n        .catchRate = 45,\n        .expYield = 159,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_POISON_BARB,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SWARM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PIDGEY] =\n    {\n        .baseHP = 40,\n        .baseAttack = 45,\n        .baseDefense = 40,\n        .baseSpeed = 56,\n        .baseSpAttack = 35,\n        .baseSpDefense = 35,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 255,\n        .expYield = 55,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PIDGEOTTO] =\n    {\n        .baseHP = 63,\n        .baseAttack = 60,\n        .baseDefense = 55,\n        .baseSpeed = 71,\n        .baseSpAttack = 50,\n        .baseSpDefense = 50,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 120,\n        .expYield = 113,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PIDGEOT] =\n    {\n        .baseHP = 83,\n        .baseAttack = 80,\n        .baseDefense = 75,\n        .baseSpeed = 91,\n        .baseSpAttack = 70,\n        .baseSpDefense = 70,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 172,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 3,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_RATTATA] =\n    {\n        .baseHP = 30,\n        .baseAttack = 56,\n        .baseDefense = 35,\n        .baseSpeed = 72,\n        .baseSpAttack = 25,\n        .baseSpDefense = 35,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 255,\n        .expYield = 57,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_RUN_AWAY, ABILITY_GUTS},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_RATICATE] =\n    {\n        .baseHP = 55,\n        .baseAttack = 81,\n        .baseDefense = 60,\n        .baseSpeed = 97,\n        .baseSpAttack = 50,\n        .baseSpDefense = 70,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 127,\n        .expYield = 116,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_ORAN_BERRY,\n        .itemRare = ITEM_SITRUS_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_RUN_AWAY, ABILITY_GUTS},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SPEAROW] =\n    {\n        .baseHP = 40,\n        .baseAttack = 60,\n        .baseDefense = 30,\n        .baseSpeed = 70,\n        .baseSpAttack = 31,\n        .baseSpDefense = 31,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 255,\n        .expYield = 58,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_FEAROW] =\n    {\n        .baseHP = 65,\n        .baseAttack = 90,\n        .baseDefense = 65,\n        .baseSpeed = 100,\n        .baseSpAttack = 61,\n        .baseSpDefense = 61,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 90,\n        .expYield = 162,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SHARP_BEAK,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_EKANS] =\n    {\n        .baseHP = 35,\n        .baseAttack = 60,\n        .baseDefense = 44,\n        .baseSpeed = 55,\n        .baseSpAttack = 40,\n        .baseSpDefense = 54,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 255,\n        .expYield = 62,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_SHED_SKIN},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ARBOK] =\n    {\n        .baseHP = 60,\n        .baseAttack = 85,\n        .baseDefense = 69,\n        .baseSpeed = 80,\n        .baseSpAttack = 65,\n        .baseSpDefense = 79,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 90,\n        .expYield = 147,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_POISON_BARB,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_SHED_SKIN},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PIKACHU] =\n    {\n        .baseHP = 35,\n        .baseAttack = 55,\n        .baseDefense = 30,\n        .baseSpeed = 90,\n        .baseSpAttack = 50,\n        .baseSpDefense = 40,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 190,\n        .expYield = 82,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 10,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_STATIC, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_RAICHU] =\n    {\n        .baseHP = 60,\n        .baseAttack = 90,\n        .baseDefense = 55,\n        .baseSpeed = 100,\n        .baseSpAttack = 90,\n        .baseSpDefense = 80,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 75,\n        .expYield = 122,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 3,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 10,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_STATIC, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SANDSHREW] =\n    {\n        .baseHP = 50,\n        .baseAttack = 75,\n        .baseDefense = 85,\n        .baseSpeed = 40,\n        .baseSpAttack = 20,\n        .baseSpDefense = 30,\n        .types = {TYPE_GROUND, TYPE_GROUND},\n        .catchRate = 255,\n        .expYield = 93,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_SAND_VEIL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SANDSLASH] =\n    {\n        .baseHP = 75,\n        .baseAttack = 100,\n        .baseDefense = 110,\n        .baseSpeed = 65,\n        .baseSpAttack = 45,\n        .baseSpDefense = 55,\n        .types = {TYPE_GROUND, TYPE_GROUND},\n        .catchRate = 90,\n        .expYield = 163,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SOFT_SAND,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_SAND_VEIL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NIDORAN_F] =\n    {\n        .baseHP = 55,\n        .baseAttack = 47,\n        .baseDefense = 52,\n        .baseSpeed = 41,\n        .baseSpAttack = 40,\n        .baseSpDefense = 40,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 235,\n        .expYield = 59,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_FEMALE,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_POISON_POINT, ABILITY_NONE},\n        .safariZoneFleeRate = 50,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NIDORINA] =\n    {\n        .baseHP = 70,\n        .baseAttack = 62,\n        .baseDefense = 67,\n        .baseSpeed = 56,\n        .baseSpAttack = 55,\n        .baseSpDefense = 55,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 120,\n        .expYield = 117,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_FEMALE,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_POISON_POINT, ABILITY_NONE},\n        .safariZoneFleeRate = 75,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NIDOQUEEN] =\n    {\n        .baseHP = 90,\n        .baseAttack = 82,\n        .baseDefense = 87,\n        .baseSpeed = 76,\n        .baseSpAttack = 75,\n        .baseSpDefense = 85,\n        .types = {TYPE_POISON, TYPE_GROUND},\n        .catchRate = 45,\n        .expYield = 194,\n        .evYield_HP = 3,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_FEMALE,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_POISON_POINT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NIDORAN_M] =\n    {\n        .baseHP = 46,\n        .baseAttack = 57,\n        .baseDefense = 40,\n        .baseSpeed = 50,\n        .baseSpAttack = 40,\n        .baseSpDefense = 40,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 235,\n        .expYield = 60,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_MALE,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_POISON_POINT, ABILITY_NONE},\n        .safariZoneFleeRate = 50,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NIDORINO] =\n    {\n        .baseHP = 61,\n        .baseAttack = 72,\n        .baseDefense = 57,\n        .baseSpeed = 65,\n        .baseSpAttack = 55,\n        .baseSpDefense = 55,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 120,\n        .expYield = 118,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_MALE,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_POISON_POINT, ABILITY_NONE},\n        .safariZoneFleeRate = 75,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NIDOKING] =\n    {\n        .baseHP = 81,\n        .baseAttack = 92,\n        .baseDefense = 77,\n        .baseSpeed = 85,\n        .baseSpAttack = 85,\n        .baseSpDefense = 75,\n        .types = {TYPE_POISON, TYPE_GROUND},\n        .catchRate = 45,\n        .expYield = 195,\n        .evYield_HP = 0,\n        .evYield_Attack = 3,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_MALE,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_POISON_POINT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CLEFAIRY] =\n    {\n        .baseHP = 70,\n        .baseAttack = 45,\n        .baseDefense = 48,\n        .baseSpeed = 35,\n        .baseSpAttack = 60,\n        .baseSpDefense = 65,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 150,\n        .expYield = 68,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_MOON_STONE,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 10,\n        .friendship = 140,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CLEFABLE] =\n    {\n        .baseHP = 95,\n        .baseAttack = 70,\n        .baseDefense = 73,\n        .baseSpeed = 60,\n        .baseSpAttack = 85,\n        .baseSpDefense = 90,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 25,\n        .expYield = 129,\n        .evYield_HP = 3,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_MOON_STONE,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 10,\n        .friendship = 140,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_VULPIX] =\n    {\n        .baseHP = 38,\n        .baseAttack = 41,\n        .baseDefense = 40,\n        .baseSpeed = 65,\n        .baseSpAttack = 50,\n        .baseSpDefense = 65,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 190,\n        .expYield = 63,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_RAWST_BERRY,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_FLASH_FIRE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NINETALES] =\n    {\n        .baseHP = 73,\n        .baseAttack = 76,\n        .baseDefense = 75,\n        .baseSpeed = 100,\n        .baseSpAttack = 81,\n        .baseSpDefense = 100,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 75,\n        .expYield = 178,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_RAWST_BERRY,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_FLASH_FIRE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_JIGGLYPUFF] =\n    {\n        .baseHP = 115,\n        .baseAttack = 45,\n        .baseDefense = 20,\n        .baseSpeed = 20,\n        .baseSpAttack = 45,\n        .baseSpDefense = 25,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 170,\n        .expYield = 76,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_ORAN_BERRY,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 10,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WIGGLYTUFF] =\n    {\n        .baseHP = 140,\n        .baseAttack = 70,\n        .baseDefense = 45,\n        .baseSpeed = 45,\n        .baseSpAttack = 75,\n        .baseSpDefense = 50,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 50,\n        .expYield = 109,\n        .evYield_HP = 3,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_ORAN_BERRY,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 10,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ZUBAT] =\n    {\n        .baseHP = 40,\n        .baseAttack = 45,\n        .baseDefense = 35,\n        .baseSpeed = 55,\n        .baseSpAttack = 30,\n        .baseSpDefense = 40,\n        .types = {TYPE_POISON, TYPE_FLYING},\n        .catchRate = 255,\n        .expYield = 54,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GOLBAT] =\n    {\n        .baseHP = 75,\n        .baseAttack = 80,\n        .baseDefense = 70,\n        .baseSpeed = 90,\n        .baseSpAttack = 65,\n        .baseSpDefense = 75,\n        .types = {TYPE_POISON, TYPE_FLYING},\n        .catchRate = 90,\n        .expYield = 171,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ODDISH] =\n    {\n        .baseHP = 45,\n        .baseAttack = 50,\n        .baseDefense = 55,\n        .baseSpeed = 30,\n        .baseSpAttack = 75,\n        .baseSpDefense = 65,\n        .types = {TYPE_GRASS, TYPE_POISON},\n        .catchRate = 255,\n        .expYield = 78,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GLOOM] =\n    {\n        .baseHP = 60,\n        .baseAttack = 65,\n        .baseDefense = 70,\n        .baseSpeed = 40,\n        .baseSpAttack = 85,\n        .baseSpDefense = 75,\n        .types = {TYPE_GRASS, TYPE_POISON},\n        .catchRate = 120,\n        .expYield = 132,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_VILEPLUME] =\n    {\n        .baseHP = 75,\n        .baseAttack = 80,\n        .baseDefense = 85,\n        .baseSpeed = 50,\n        .baseSpAttack = 100,\n        .baseSpDefense = 90,\n        .types = {TYPE_GRASS, TYPE_POISON},\n        .catchRate = 45,\n        .expYield = 184,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PARAS] =\n    {\n        .baseHP = 35,\n        .baseAttack = 70,\n        .baseDefense = 55,\n        .baseSpeed = 25,\n        .baseSpAttack = 45,\n        .baseSpDefense = 55,\n        .types = {TYPE_BUG, TYPE_GRASS},\n        .catchRate = 190,\n        .expYield = 70,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_TINY_MUSHROOM,\n        .itemRare = ITEM_BIG_MUSHROOM,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_EFFECT_SPORE, ABILITY_NONE},\n        .safariZoneFleeRate = 50,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PARASECT] =\n    {\n        .baseHP = 60,\n        .baseAttack = 95,\n        .baseDefense = 80,\n        .baseSpeed = 30,\n        .baseSpAttack = 60,\n        .baseSpDefense = 80,\n        .types = {TYPE_BUG, TYPE_GRASS},\n        .catchRate = 75,\n        .expYield = 128,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_TINY_MUSHROOM,\n        .itemRare = ITEM_BIG_MUSHROOM,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_EFFECT_SPORE, ABILITY_NONE},\n        .safariZoneFleeRate = 75,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_VENONAT] =\n    {\n        .baseHP = 60,\n        .baseAttack = 55,\n        .baseDefense = 50,\n        .baseSpeed = 45,\n        .baseSpAttack = 40,\n        .baseSpDefense = 55,\n        .types = {TYPE_BUG, TYPE_POISON},\n        .catchRate = 190,\n        .expYield = 75,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_COMPOUND_EYES, ABILITY_NONE},\n        .safariZoneFleeRate = 50,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_VENOMOTH] =\n    {\n        .baseHP = 70,\n        .baseAttack = 65,\n        .baseDefense = 60,\n        .baseSpeed = 90,\n        .baseSpAttack = 90,\n        .baseSpDefense = 75,\n        .types = {TYPE_BUG, TYPE_POISON},\n        .catchRate = 75,\n        .expYield = 138,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SILVER_POWDER,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SHIELD_DUST, ABILITY_NONE},\n        .safariZoneFleeRate = 75,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DIGLETT] =\n    {\n        .baseHP = 10,\n        .baseAttack = 55,\n        .baseDefense = 25,\n        .baseSpeed = 95,\n        .baseSpAttack = 35,\n        .baseSpDefense = 45,\n        .types = {TYPE_GROUND, TYPE_GROUND},\n        .catchRate = 255,\n        .expYield = 81,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_SAND_VEIL, ABILITY_ARENA_TRAP},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DUGTRIO] =\n    {\n        .baseHP = 35,\n        .baseAttack = 80,\n        .baseDefense = 50,\n        .baseSpeed = 120,\n        .baseSpAttack = 50,\n        .baseSpDefense = 70,\n        .types = {TYPE_GROUND, TYPE_GROUND},\n        .catchRate = 50,\n        .expYield = 153,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_SAND_VEIL, ABILITY_ARENA_TRAP},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MEOWTH] =\n    {\n        .baseHP = 40,\n        .baseAttack = 45,\n        .baseDefense = 35,\n        .baseSpeed = 90,\n        .baseSpAttack = 40,\n        .baseSpDefense = 40,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 255,\n        .expYield = 69,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NUGGET,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_PICKUP, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PERSIAN] =\n    {\n        .baseHP = 65,\n        .baseAttack = 70,\n        .baseDefense = 60,\n        .baseSpeed = 115,\n        .baseSpAttack = 65,\n        .baseSpDefense = 65,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 90,\n        .expYield = 148,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_LIMBER, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PSYDUCK] =\n    {\n        .baseHP = 50,\n        .baseAttack = 52,\n        .baseDefense = 48,\n        .baseSpeed = 55,\n        .baseSpAttack = 65,\n        .baseSpDefense = 50,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 190,\n        .expYield = 80,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_DAMP, ABILITY_CLOUD_NINE},\n        .safariZoneFleeRate = 50,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GOLDUCK] =\n    {\n        .baseHP = 80,\n        .baseAttack = 82,\n        .baseDefense = 78,\n        .baseSpeed = 85,\n        .baseSpAttack = 95,\n        .baseSpDefense = 80,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 75,\n        .expYield = 174,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_DAMP, ABILITY_CLOUD_NINE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MANKEY] =\n    {\n        .baseHP = 40,\n        .baseAttack = 80,\n        .baseDefense = 35,\n        .baseSpeed = 70,\n        .baseSpAttack = 35,\n        .baseSpDefense = 45,\n        .types = {TYPE_FIGHTING, TYPE_FIGHTING},\n        .catchRate = 190,\n        .expYield = 74,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_VITAL_SPIRIT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PRIMEAPE] =\n    {\n        .baseHP = 65,\n        .baseAttack = 105,\n        .baseDefense = 60,\n        .baseSpeed = 95,\n        .baseSpAttack = 60,\n        .baseSpDefense = 70,\n        .types = {TYPE_FIGHTING, TYPE_FIGHTING},\n        .catchRate = 75,\n        .expYield = 149,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_VITAL_SPIRIT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GROWLITHE] =\n    {\n        .baseHP = 55,\n        .baseAttack = 70,\n        .baseDefense = 45,\n        .baseSpeed = 60,\n        .baseSpAttack = 70,\n        .baseSpDefense = 50,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 190,\n        .expYield = 91,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_RAWST_BERRY,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_FLASH_FIRE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ARCANINE] =\n    {\n        .baseHP = 90,\n        .baseAttack = 110,\n        .baseDefense = 80,\n        .baseSpeed = 95,\n        .baseSpAttack = 100,\n        .baseSpDefense = 80,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 75,\n        .expYield = 213,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_RAWST_BERRY,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_FLASH_FIRE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_POLIWAG] =\n    {\n        .baseHP = 40,\n        .baseAttack = 50,\n        .baseDefense = 40,\n        .baseSpeed = 90,\n        .baseSpAttack = 40,\n        .baseSpDefense = 40,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 255,\n        .expYield = 77,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_WATER_ABSORB, ABILITY_DAMP},\n        .safariZoneFleeRate = 50,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = TRUE,\n    },\n    [SPECIES_POLIWHIRL] =\n    {\n        .baseHP = 65,\n        .baseAttack = 65,\n        .baseDefense = 65,\n        .baseSpeed = 90,\n        .baseSpAttack = 50,\n        .baseSpDefense = 50,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 120,\n        .expYield = 131,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_KINGS_ROCK,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_WATER_ABSORB, ABILITY_DAMP},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = TRUE,\n    },\n    [SPECIES_POLIWRATH] =\n    {\n        .baseHP = 90,\n        .baseAttack = 85,\n        .baseDefense = 95,\n        .baseSpeed = 70,\n        .baseSpAttack = 70,\n        .baseSpDefense = 90,\n        .types = {TYPE_WATER, TYPE_FIGHTING},\n        .catchRate = 45,\n        .expYield = 185,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 3,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_WATER_ABSORB, ABILITY_DAMP},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = TRUE,\n    },\n    [SPECIES_ABRA] =\n    {\n        .baseHP = 25,\n        .baseAttack = 20,\n        .baseDefense = 15,\n        .baseSpeed = 90,\n        .baseSpAttack = 105,\n        .baseSpDefense = 55,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 200,\n        .expYield = 73,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_TWISTED_SPOON,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_SYNCHRONIZE, ABILITY_INNER_FOCUS},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_KADABRA] =\n    {\n        .baseHP = 40,\n        .baseAttack = 35,\n        .baseDefense = 30,\n        .baseSpeed = 105,\n        .baseSpAttack = 120,\n        .baseSpDefense = 70,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 100,\n        .expYield = 145,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_TWISTED_SPOON,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_SYNCHRONIZE, ABILITY_INNER_FOCUS},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ALAKAZAM] =\n    {\n        .baseHP = 55,\n        .baseAttack = 50,\n        .baseDefense = 45,\n        .baseSpeed = 120,\n        .baseSpAttack = 135,\n        .baseSpDefense = 85,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 50,\n        .expYield = 186,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_TWISTED_SPOON,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_SYNCHRONIZE, ABILITY_INNER_FOCUS},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MACHOP] =\n    {\n        .baseHP = 70,\n        .baseAttack = 80,\n        .baseDefense = 50,\n        .baseSpeed = 35,\n        .baseSpAttack = 35,\n        .baseSpDefense = 35,\n        .types = {TYPE_FIGHTING, TYPE_FIGHTING},\n        .catchRate = 180,\n        .expYield = 88,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_GUTS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MACHOKE] =\n    {\n        .baseHP = 80,\n        .baseAttack = 100,\n        .baseDefense = 70,\n        .baseSpeed = 45,\n        .baseSpAttack = 50,\n        .baseSpDefense = 60,\n        .types = {TYPE_FIGHTING, TYPE_FIGHTING},\n        .catchRate = 90,\n        .expYield = 146,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_FOCUS_BAND,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_GUTS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MACHAMP] =\n    {\n        .baseHP = 90,\n        .baseAttack = 130,\n        .baseDefense = 80,\n        .baseSpeed = 55,\n        .baseSpAttack = 65,\n        .baseSpDefense = 85,\n        .types = {TYPE_FIGHTING, TYPE_FIGHTING},\n        .catchRate = 45,\n        .expYield = 193,\n        .evYield_HP = 0,\n        .evYield_Attack = 3,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_FOCUS_BAND,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_GUTS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BELLSPROUT] =\n    {\n        .baseHP = 50,\n        .baseAttack = 75,\n        .baseDefense = 35,\n        .baseSpeed = 40,\n        .baseSpAttack = 70,\n        .baseSpDefense = 30,\n        .types = {TYPE_GRASS, TYPE_POISON},\n        .catchRate = 255,\n        .expYield = 84,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WEEPINBELL] =\n    {\n        .baseHP = 65,\n        .baseAttack = 90,\n        .baseDefense = 50,\n        .baseSpeed = 55,\n        .baseSpAttack = 85,\n        .baseSpDefense = 45,\n        .types = {TYPE_GRASS, TYPE_POISON},\n        .catchRate = 120,\n        .expYield = 151,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_VICTREEBEL] =\n    {\n        .baseHP = 80,\n        .baseAttack = 105,\n        .baseDefense = 65,\n        .baseSpeed = 70,\n        .baseSpAttack = 100,\n        .baseSpDefense = 60,\n        .types = {TYPE_GRASS, TYPE_POISON},\n        .catchRate = 45,\n        .expYield = 191,\n        .evYield_HP = 0,\n        .evYield_Attack = 3,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TENTACOOL] =\n    {\n        .baseHP = 40,\n        .baseAttack = 40,\n        .baseDefense = 35,\n        .baseSpeed = 70,\n        .baseSpAttack = 50,\n        .baseSpDefense = 100,\n        .types = {TYPE_WATER, TYPE_POISON},\n        .catchRate = 190,\n        .expYield = 105,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_CLEAR_BODY, ABILITY_LIQUID_OOZE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TENTACRUEL] =\n    {\n        .baseHP = 80,\n        .baseAttack = 70,\n        .baseDefense = 65,\n        .baseSpeed = 100,\n        .baseSpAttack = 80,\n        .baseSpDefense = 120,\n        .types = {TYPE_WATER, TYPE_POISON},\n        .catchRate = 60,\n        .expYield = 205,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_CLEAR_BODY, ABILITY_LIQUID_OOZE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GEODUDE] =\n    {\n        .baseHP = 40,\n        .baseAttack = 80,\n        .baseDefense = 100,\n        .baseSpeed = 20,\n        .baseSpAttack = 30,\n        .baseSpDefense = 30,\n        .types = {TYPE_ROCK, TYPE_GROUND},\n        .catchRate = 255,\n        .expYield = 86,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_ROCK_HEAD, ABILITY_STURDY},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GRAVELER] =\n    {\n        .baseHP = 55,\n        .baseAttack = 95,\n        .baseDefense = 115,\n        .baseSpeed = 35,\n        .baseSpAttack = 45,\n        .baseSpDefense = 45,\n        .types = {TYPE_ROCK, TYPE_GROUND},\n        .catchRate = 120,\n        .expYield = 134,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_HARD_STONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_ROCK_HEAD, ABILITY_STURDY},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GOLEM] =\n    {\n        .baseHP = 80,\n        .baseAttack = 110,\n        .baseDefense = 130,\n        .baseSpeed = 45,\n        .baseSpAttack = 55,\n        .baseSpDefense = 65,\n        .types = {TYPE_ROCK, TYPE_GROUND},\n        .catchRate = 45,\n        .expYield = 177,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 3,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_HARD_STONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_ROCK_HEAD, ABILITY_STURDY},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PONYTA] =\n    {\n        .baseHP = 50,\n        .baseAttack = 85,\n        .baseDefense = 55,\n        .baseSpeed = 90,\n        .baseSpAttack = 65,\n        .baseSpDefense = 65,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 190,\n        .expYield = 152,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_RUN_AWAY, ABILITY_FLASH_FIRE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_RAPIDASH] =\n    {\n        .baseHP = 65,\n        .baseAttack = 100,\n        .baseDefense = 70,\n        .baseSpeed = 105,\n        .baseSpAttack = 80,\n        .baseSpDefense = 80,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 60,\n        .expYield = 192,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_RUN_AWAY, ABILITY_FLASH_FIRE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SLOWPOKE] =\n    {\n        .baseHP = 90,\n        .baseAttack = 65,\n        .baseDefense = 65,\n        .baseSpeed = 15,\n        .baseSpAttack = 40,\n        .baseSpDefense = 40,\n        .types = {TYPE_WATER, TYPE_PSYCHIC},\n        .catchRate = 190,\n        .expYield = 99,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_OBLIVIOUS, ABILITY_OWN_TEMPO},\n        .safariZoneFleeRate = 50,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SLOWBRO] =\n    {\n        .baseHP = 95,\n        .baseAttack = 75,\n        .baseDefense = 110,\n        .baseSpeed = 30,\n        .baseSpAttack = 100,\n        .baseSpDefense = 80,\n        .types = {TYPE_WATER, TYPE_PSYCHIC},\n        .catchRate = 75,\n        .expYield = 164,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_KINGS_ROCK,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_OBLIVIOUS, ABILITY_OWN_TEMPO},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MAGNEMITE] =\n    {\n        .baseHP = 25,\n        .baseAttack = 35,\n        .baseDefense = 70,\n        .baseSpeed = 45,\n        .baseSpAttack = 95,\n        .baseSpDefense = 55,\n        .types = {TYPE_ELECTRIC, TYPE_STEEL},\n        .catchRate = 190,\n        .expYield = 89,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_METAL_COAT,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_MAGNET_PULL, ABILITY_STURDY},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MAGNETON] =\n    {\n        .baseHP = 50,\n        .baseAttack = 60,\n        .baseDefense = 95,\n        .baseSpeed = 70,\n        .baseSpAttack = 120,\n        .baseSpDefense = 70,\n        .types = {TYPE_ELECTRIC, TYPE_STEEL},\n        .catchRate = 60,\n        .expYield = 161,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_MAGNET,\n        .itemRare = ITEM_METAL_COAT,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_MAGNET_PULL, ABILITY_STURDY},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_FARFETCHD] =\n    {\n        .baseHP = 52,\n        .baseAttack = 65,\n        .baseDefense = 55,\n        .baseSpeed = 60,\n        .baseSpAttack = 58,\n        .baseSpDefense = 62,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 94,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_STICK,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_KEEN_EYE, ABILITY_INNER_FOCUS},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DODUO] =\n    {\n        .baseHP = 35,\n        .baseAttack = 85,\n        .baseDefense = 45,\n        .baseSpeed = 75,\n        .baseSpAttack = 35,\n        .baseSpDefense = 35,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 190,\n        .expYield = 96,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_RUN_AWAY, ABILITY_EARLY_BIRD},\n        .safariZoneFleeRate = 50,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DODRIO] =\n    {\n        .baseHP = 60,\n        .baseAttack = 110,\n        .baseDefense = 70,\n        .baseSpeed = 100,\n        .baseSpAttack = 60,\n        .baseSpDefense = 60,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 158,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SHARP_BEAK,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_RUN_AWAY, ABILITY_EARLY_BIRD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SEEL] =\n    {\n        .baseHP = 65,\n        .baseAttack = 45,\n        .baseDefense = 55,\n        .baseSpeed = 45,\n        .baseSpAttack = 45,\n        .baseSpDefense = 70,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 190,\n        .expYield = 100,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_ASPEAR_BERRY,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DEWGONG] =\n    {\n        .baseHP = 90,\n        .baseAttack = 70,\n        .baseDefense = 80,\n        .baseSpeed = 70,\n        .baseSpAttack = 70,\n        .baseSpDefense = 95,\n        .types = {TYPE_WATER, TYPE_ICE},\n        .catchRate = 75,\n        .expYield = 176,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_ASPEAR_BERRY,\n        .itemRare = ITEM_NEVER_MELT_ICE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GRIMER] =\n    {\n        .baseHP = 80,\n        .baseAttack = 80,\n        .baseDefense = 50,\n        .baseSpeed = 25,\n        .baseSpAttack = 40,\n        .baseSpDefense = 50,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 190,\n        .expYield = 90,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_STENCH, ABILITY_STICKY_HOLD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MUK] =\n    {\n        .baseHP = 105,\n        .baseAttack = 105,\n        .baseDefense = 75,\n        .baseSpeed = 50,\n        .baseSpAttack = 65,\n        .baseSpDefense = 100,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 75,\n        .expYield = 157,\n        .evYield_HP = 1,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_STENCH, ABILITY_STICKY_HOLD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SHELLDER] =\n    {\n        .baseHP = 30,\n        .baseAttack = 65,\n        .baseDefense = 100,\n        .baseSpeed = 40,\n        .baseSpAttack = 45,\n        .baseSpDefense = 25,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 190,\n        .expYield = 97,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_PEARL,\n        .itemRare = ITEM_BIG_PEARL,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_SHELL_ARMOR, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CLOYSTER] =\n    {\n        .baseHP = 50,\n        .baseAttack = 95,\n        .baseDefense = 180,\n        .baseSpeed = 70,\n        .baseSpAttack = 85,\n        .baseSpDefense = 45,\n        .types = {TYPE_WATER, TYPE_ICE},\n        .catchRate = 60,\n        .expYield = 203,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_PEARL,\n        .itemRare = ITEM_BIG_PEARL,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_SHELL_ARMOR, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GASTLY] =\n    {\n        .baseHP = 30,\n        .baseAttack = 35,\n        .baseDefense = 30,\n        .baseSpeed = 80,\n        .baseSpAttack = 100,\n        .baseSpDefense = 35,\n        .types = {TYPE_GHOST, TYPE_POISON},\n        .catchRate = 190,\n        .expYield = 95,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HAUNTER] =\n    {\n        .baseHP = 45,\n        .baseAttack = 50,\n        .baseDefense = 45,\n        .baseSpeed = 95,\n        .baseSpAttack = 115,\n        .baseSpDefense = 55,\n        .types = {TYPE_GHOST, TYPE_POISON},\n        .catchRate = 90,\n        .expYield = 126,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SPELL_TAG,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GENGAR] =\n    {\n        .baseHP = 60,\n        .baseAttack = 65,\n        .baseDefense = 60,\n        .baseSpeed = 110,\n        .baseSpAttack = 130,\n        .baseSpDefense = 75,\n        .types = {TYPE_GHOST, TYPE_POISON},\n        .catchRate = 45,\n        .expYield = 190,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SPELL_TAG,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ONIX] =\n    {\n        .baseHP = 35,\n        .baseAttack = 45,\n        .baseDefense = 160,\n        .baseSpeed = 70,\n        .baseSpAttack = 30,\n        .baseSpDefense = 45,\n        .types = {TYPE_ROCK, TYPE_GROUND},\n        .catchRate = 45,\n        .expYield = 108,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_HARD_STONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_ROCK_HEAD, ABILITY_STURDY},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DROWZEE] =\n    {\n        .baseHP = 60,\n        .baseAttack = 48,\n        .baseDefense = 45,\n        .baseSpeed = 42,\n        .baseSpAttack = 43,\n        .baseSpDefense = 90,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 190,\n        .expYield = 102,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_INSOMNIA, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HYPNO] =\n    {\n        .baseHP = 85,\n        .baseAttack = 73,\n        .baseDefense = 70,\n        .baseSpeed = 67,\n        .baseSpAttack = 73,\n        .baseSpDefense = 115,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 75,\n        .expYield = 165,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_INSOMNIA, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_KRABBY] =\n    {\n        .baseHP = 30,\n        .baseAttack = 105,\n        .baseDefense = 90,\n        .baseSpeed = 50,\n        .baseSpAttack = 25,\n        .baseSpDefense = 25,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 225,\n        .expYield = 115,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_KINGLER] =\n    {\n        .baseHP = 55,\n        .baseAttack = 130,\n        .baseDefense = 115,\n        .baseSpeed = 75,\n        .baseSpAttack = 50,\n        .baseSpDefense = 50,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 60,\n        .expYield = 206,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = TRUE,\n    },\n    [SPECIES_VOLTORB] =\n    {\n        .baseHP = 40,\n        .baseAttack = 30,\n        .baseDefense = 50,\n        .baseSpeed = 100,\n        .baseSpAttack = 55,\n        .baseSpDefense = 55,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 190,\n        .expYield = 103,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_SOUNDPROOF, ABILITY_STATIC},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ELECTRODE] =\n    {\n        .baseHP = 60,\n        .baseAttack = 50,\n        .baseDefense = 70,\n        .baseSpeed = 140,\n        .baseSpAttack = 80,\n        .baseSpDefense = 80,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 60,\n        .expYield = 150,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_SOUNDPROOF, ABILITY_STATIC},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_EXEGGCUTE] =\n    {\n        .baseHP = 60,\n        .baseAttack = 40,\n        .baseDefense = 80,\n        .baseSpeed = 40,\n        .baseSpAttack = 60,\n        .baseSpDefense = 45,\n        .types = {TYPE_GRASS, TYPE_PSYCHIC},\n        .catchRate = 90,\n        .expYield = 98,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 75,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_EXEGGUTOR] =\n    {\n        .baseHP = 95,\n        .baseAttack = 95,\n        .baseDefense = 85,\n        .baseSpeed = 55,\n        .baseSpAttack = 125,\n        .baseSpDefense = 65,\n        .types = {TYPE_GRASS, TYPE_PSYCHIC},\n        .catchRate = 45,\n        .expYield = 212,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CUBONE] =\n    {\n        .baseHP = 50,\n        .baseAttack = 50,\n        .baseDefense = 95,\n        .baseSpeed = 35,\n        .baseSpAttack = 40,\n        .baseSpDefense = 50,\n        .types = {TYPE_GROUND, TYPE_GROUND},\n        .catchRate = 190,\n        .expYield = 87,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_THICK_CLUB,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER},\n        .abilities = {ABILITY_ROCK_HEAD, ABILITY_LIGHTNING_ROD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MAROWAK] =\n    {\n        .baseHP = 60,\n        .baseAttack = 80,\n        .baseDefense = 110,\n        .baseSpeed = 45,\n        .baseSpAttack = 50,\n        .baseSpDefense = 80,\n        .types = {TYPE_GROUND, TYPE_GROUND},\n        .catchRate = 75,\n        .expYield = 124,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_THICK_CLUB,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER},\n        .abilities = {ABILITY_ROCK_HEAD, ABILITY_LIGHTNING_ROD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HITMONLEE] =\n    {\n        .baseHP = 50,\n        .baseAttack = 120,\n        .baseDefense = 53,\n        .baseSpeed = 87,\n        .baseSpAttack = 35,\n        .baseSpDefense = 110,\n        .types = {TYPE_FIGHTING, TYPE_FIGHTING},\n        .catchRate = 45,\n        .expYield = 139,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_MALE,\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_LIMBER, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HITMONCHAN] =\n    {\n        .baseHP = 50,\n        .baseAttack = 105,\n        .baseDefense = 79,\n        .baseSpeed = 76,\n        .baseSpAttack = 35,\n        .baseSpDefense = 110,\n        .types = {TYPE_FIGHTING, TYPE_FIGHTING},\n        .catchRate = 45,\n        .expYield = 140,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_MALE,\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LICKITUNG] =\n    {\n        .baseHP = 90,\n        .baseAttack = 55,\n        .baseDefense = 75,\n        .baseSpeed = 30,\n        .baseSpAttack = 60,\n        .baseSpDefense = 75,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 127,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER},\n        .abilities = {ABILITY_OWN_TEMPO, ABILITY_OBLIVIOUS},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_KOFFING] =\n    {\n        .baseHP = 40,\n        .baseAttack = 65,\n        .baseDefense = 95,\n        .baseSpeed = 35,\n        .baseSpAttack = 60,\n        .baseSpDefense = 45,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 190,\n        .expYield = 114,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WEEZING] =\n    {\n        .baseHP = 65,\n        .baseAttack = 90,\n        .baseDefense = 120,\n        .baseSpeed = 60,\n        .baseSpAttack = 85,\n        .baseSpDefense = 70,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 60,\n        .expYield = 173,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_RHYHORN] =\n    {\n        .baseHP = 80,\n        .baseAttack = 85,\n        .baseDefense = 95,\n        .baseSpeed = 25,\n        .baseSpAttack = 30,\n        .baseSpDefense = 30,\n        .types = {TYPE_GROUND, TYPE_ROCK},\n        .catchRate = 120,\n        .expYield = 135,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_LIGHTNING_ROD, ABILITY_ROCK_HEAD},\n        .safariZoneFleeRate = 75,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_RHYDON] =\n    {\n        .baseHP = 105,\n        .baseAttack = 130,\n        .baseDefense = 120,\n        .baseSpeed = 40,\n        .baseSpAttack = 45,\n        .baseSpDefense = 45,\n        .types = {TYPE_GROUND, TYPE_ROCK},\n        .catchRate = 60,\n        .expYield = 204,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_LIGHTNING_ROD, ABILITY_ROCK_HEAD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CHANSEY] =\n    {\n        .baseHP = 250,\n        .baseAttack = 5,\n        .baseDefense = 5,\n        .baseSpeed = 50,\n        .baseSpAttack = 35,\n        .baseSpDefense = 105,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 30,\n        .expYield = 255,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_LUCKY_EGG,\n        .genderRatio = MON_FEMALE,\n        .eggCycles = 40,\n        .friendship = 140,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_NATURAL_CURE, ABILITY_SERENE_GRACE},\n        .safariZoneFleeRate = 125,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TANGELA] =\n    {\n        .baseHP = 65,\n        .baseAttack = 55,\n        .baseDefense = 115,\n        .baseSpeed = 60,\n        .baseSpAttack = 100,\n        .baseSpDefense = 40,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 45,\n        .expYield = 166,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_KANGASKHAN] =\n    {\n        .baseHP = 105,\n        .baseAttack = 95,\n        .baseDefense = 80,\n        .baseSpeed = 90,\n        .baseSpAttack = 40,\n        .baseSpDefense = 80,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 175,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_FEMALE,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER},\n        .abilities = {ABILITY_EARLY_BIRD, ABILITY_NONE},\n        .safariZoneFleeRate = 125,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HORSEA] =\n    {\n        .baseHP = 30,\n        .baseAttack = 40,\n        .baseDefense = 70,\n        .baseSpeed = 60,\n        .baseSpAttack = 70,\n        .baseSpDefense = 25,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 225,\n        .expYield = 83,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SEADRA] =\n    {\n        .baseHP = 55,\n        .baseAttack = 65,\n        .baseDefense = 95,\n        .baseSpeed = 85,\n        .baseSpAttack = 95,\n        .baseSpDefense = 45,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 75,\n        .expYield = 155,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_POISON_POINT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GOLDEEN] =\n    {\n        .baseHP = 45,\n        .baseAttack = 67,\n        .baseDefense = 60,\n        .baseSpeed = 63,\n        .baseSpAttack = 35,\n        .baseSpDefense = 50,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 225,\n        .expYield = 111,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_WATER_VEIL},\n        .safariZoneFleeRate = 50,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SEAKING] =\n    {\n        .baseHP = 80,\n        .baseAttack = 92,\n        .baseDefense = 65,\n        .baseSpeed = 68,\n        .baseSpAttack = 65,\n        .baseSpDefense = 80,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 60,\n        .expYield = 170,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_WATER_VEIL},\n        .safariZoneFleeRate = 75,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_STARYU] =\n    {\n        .baseHP = 30,\n        .baseAttack = 45,\n        .baseDefense = 55,\n        .baseSpeed = 85,\n        .baseSpAttack = 70,\n        .baseSpDefense = 55,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 225,\n        .expYield = 106,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_STARDUST,\n        .itemRare = ITEM_STAR_PIECE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_ILLUMINATE, ABILITY_NATURAL_CURE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_STARMIE] =\n    {\n        .baseHP = 60,\n        .baseAttack = 75,\n        .baseDefense = 85,\n        .baseSpeed = 115,\n        .baseSpAttack = 100,\n        .baseSpDefense = 85,\n        .types = {TYPE_WATER, TYPE_PSYCHIC},\n        .catchRate = 60,\n        .expYield = 207,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_STARDUST,\n        .itemRare = ITEM_STAR_PIECE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_ILLUMINATE, ABILITY_NATURAL_CURE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MR_MIME] =\n    {\n        .baseHP = 40,\n        .baseAttack = 45,\n        .baseDefense = 65,\n        .baseSpeed = 90,\n        .baseSpAttack = 100,\n        .baseSpDefense = 120,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 45,\n        .expYield = 136,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_SOUNDPROOF, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SCYTHER] =\n    {\n        .baseHP = 70,\n        .baseAttack = 110,\n        .baseDefense = 80,\n        .baseSpeed = 105,\n        .baseSpAttack = 55,\n        .baseSpDefense = 80,\n        .types = {TYPE_BUG, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 187,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SWARM, ABILITY_NONE},\n        .safariZoneFleeRate = 125,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_JYNX] =\n    {\n        .baseHP = 65,\n        .baseAttack = 50,\n        .baseDefense = 35,\n        .baseSpeed = 95,\n        .baseSpAttack = 115,\n        .baseSpDefense = 95,\n        .types = {TYPE_ICE, TYPE_PSYCHIC},\n        .catchRate = 45,\n        .expYield = 137,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_FEMALE,\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ELECTABUZZ] =\n    {\n        .baseHP = 65,\n        .baseAttack = 83,\n        .baseDefense = 57,\n        .baseSpeed = 105,\n        .baseSpAttack = 95,\n        .baseSpDefense = 85,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 45,\n        .expYield = 156,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_STATIC, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = TRUE,\n    },\n    [SPECIES_MAGMAR] =\n    {\n        .baseHP = 65,\n        .baseAttack = 95,\n        .baseDefense = 57,\n        .baseSpeed = 93,\n        .baseSpAttack = 100,\n        .baseSpDefense = 85,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 45,\n        .expYield = 167,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_FLAME_BODY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PINSIR] =\n    {\n        .baseHP = 65,\n        .baseAttack = 125,\n        .baseDefense = 100,\n        .baseSpeed = 85,\n        .baseSpAttack = 55,\n        .baseSpDefense = 70,\n        .types = {TYPE_BUG, TYPE_BUG},\n        .catchRate = 45,\n        .expYield = 200,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_HYPER_CUTTER, ABILITY_NONE},\n        .safariZoneFleeRate = 125,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TAUROS] =\n    {\n        .baseHP = 75,\n        .baseAttack = 100,\n        .baseDefense = 95,\n        .baseSpeed = 110,\n        .baseSpAttack = 40,\n        .baseSpDefense = 70,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 211,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_MALE,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE},\n        .safariZoneFleeRate = 125,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MAGIKARP] =\n    {\n        .baseHP = 20,\n        .baseAttack = 10,\n        .baseDefense = 55,\n        .baseSpeed = 80,\n        .baseSpAttack = 15,\n        .baseSpDefense = 20,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 255,\n        .expYield = 20,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 5,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE},\n        .safariZoneFleeRate = 25,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GYARADOS] =\n    {\n        .baseHP = 95,\n        .baseAttack = 125,\n        .baseDefense = 79,\n        .baseSpeed = 81,\n        .baseSpAttack = 60,\n        .baseSpDefense = 100,\n        .types = {TYPE_WATER, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 214,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_DEEP_SEA_TOOTH,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 5,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LAPRAS] =\n    {\n        .baseHP = 130,\n        .baseAttack = 85,\n        .baseDefense = 80,\n        .baseSpeed = 60,\n        .baseSpAttack = 85,\n        .baseSpDefense = 95,\n        .types = {TYPE_WATER, TYPE_ICE},\n        .catchRate = 45,\n        .expYield = 219,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 40,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_WATER_ABSORB, ABILITY_SHELL_ARMOR},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DITTO] =\n    {\n        .baseHP = 48,\n        .baseAttack = 48,\n        .baseDefense = 48,\n        .baseSpeed = 48,\n        .baseSpAttack = 48,\n        .baseSpDefense = 48,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 35,\n        .expYield = 61,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_METAL_POWDER,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_DITTO, EGG_GROUP_DITTO},\n        .abilities = {ABILITY_LIMBER, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_EEVEE] =\n    {\n        .baseHP = 55,\n        .baseAttack = 55,\n        .baseDefense = 50,\n        .baseSpeed = 55,\n        .baseSpAttack = 45,\n        .baseSpDefense = 65,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 92,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 35,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_RUN_AWAY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_VAPOREON] =\n    {\n        .baseHP = 130,\n        .baseAttack = 65,\n        .baseDefense = 60,\n        .baseSpeed = 65,\n        .baseSpAttack = 110,\n        .baseSpDefense = 95,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 196,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 35,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_WATER_ABSORB, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_JOLTEON] =\n    {\n        .baseHP = 65,\n        .baseAttack = 65,\n        .baseDefense = 60,\n        .baseSpeed = 130,\n        .baseSpAttack = 110,\n        .baseSpDefense = 95,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 45,\n        .expYield = 197,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 35,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_VOLT_ABSORB, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_FLAREON] =\n    {\n        .baseHP = 65,\n        .baseAttack = 130,\n        .baseDefense = 60,\n        .baseSpeed = 65,\n        .baseSpAttack = 95,\n        .baseSpDefense = 110,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 45,\n        .expYield = 198,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 35,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_FLASH_FIRE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PORYGON] =\n    {\n        .baseHP = 65,\n        .baseAttack = 60,\n        .baseDefense = 70,\n        .baseSpeed = 40,\n        .baseSpAttack = 85,\n        .baseSpDefense = 75,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 130,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_TRACE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_OMANYTE] =\n    {\n        .baseHP = 35,\n        .baseAttack = 40,\n        .baseDefense = 100,\n        .baseSpeed = 35,\n        .baseSpAttack = 90,\n        .baseSpDefense = 55,\n        .types = {TYPE_ROCK, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 120,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 30,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_SHELL_ARMOR},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_OMASTAR] =\n    {\n        .baseHP = 70,\n        .baseAttack = 60,\n        .baseDefense = 125,\n        .baseSpeed = 55,\n        .baseSpAttack = 115,\n        .baseSpDefense = 70,\n        .types = {TYPE_ROCK, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 199,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 30,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_SHELL_ARMOR},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_KABUTO] =\n    {\n        .baseHP = 30,\n        .baseAttack = 80,\n        .baseDefense = 90,\n        .baseSpeed = 55,\n        .baseSpAttack = 55,\n        .baseSpDefense = 45,\n        .types = {TYPE_ROCK, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 119,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 30,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_BATTLE_ARMOR},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_KABUTOPS] =\n    {\n        .baseHP = 60,\n        .baseAttack = 115,\n        .baseDefense = 105,\n        .baseSpeed = 80,\n        .baseSpAttack = 65,\n        .baseSpDefense = 70,\n        .types = {TYPE_ROCK, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 201,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 30,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_BATTLE_ARMOR},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_AERODACTYL] =\n    {\n        .baseHP = 80,\n        .baseAttack = 105,\n        .baseDefense = 65,\n        .baseSpeed = 130,\n        .baseSpAttack = 60,\n        .baseSpDefense = 75,\n        .types = {TYPE_ROCK, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 202,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 35,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_ROCK_HEAD, ABILITY_PRESSURE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SNORLAX] =\n    {\n        .baseHP = 160,\n        .baseAttack = 110,\n        .baseDefense = 65,\n        .baseSpeed = 30,\n        .baseSpAttack = 65,\n        .baseSpDefense = 110,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 25,\n        .expYield = 154,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_CHESTO_BERRY,\n        .itemRare = ITEM_CHESTO_BERRY,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 40,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER},\n        .abilities = {ABILITY_IMMUNITY, ABILITY_THICK_FAT},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ARTICUNO] =\n    {\n        .baseHP = 90,\n        .baseAttack = 85,\n        .baseDefense = 100,\n        .baseSpeed = 85,\n        .baseSpAttack = 95,\n        .baseSpDefense = 125,\n        .types = {TYPE_ICE, TYPE_FLYING},\n        .catchRate = 3,\n        .expYield = 215,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 3,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 80,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_PRESSURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ZAPDOS] =\n    {\n        .baseHP = 90,\n        .baseAttack = 90,\n        .baseDefense = 85,\n        .baseSpeed = 100,\n        .baseSpAttack = 125,\n        .baseSpDefense = 90,\n        .types = {TYPE_ELECTRIC, TYPE_FLYING},\n        .catchRate = 3,\n        .expYield = 216,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 80,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_PRESSURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MOLTRES] =\n    {\n        .baseHP = 90,\n        .baseAttack = 100,\n        .baseDefense = 90,\n        .baseSpeed = 90,\n        .baseSpAttack = 125,\n        .baseSpDefense = 85,\n        .types = {TYPE_FIRE, TYPE_FLYING},\n        .catchRate = 3,\n        .expYield = 217,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 80,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_PRESSURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DRATINI] =\n    {\n        .baseHP = 41,\n        .baseAttack = 64,\n        .baseDefense = 45,\n        .baseSpeed = 50,\n        .baseSpAttack = 50,\n        .baseSpDefense = 50,\n        .types = {TYPE_DRAGON, TYPE_DRAGON},\n        .catchRate = 45,\n        .expYield = 67,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_DRAGON_SCALE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 40,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE},\n        .safariZoneFleeRate = 100,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DRAGONAIR] =\n    {\n        .baseHP = 61,\n        .baseAttack = 84,\n        .baseDefense = 65,\n        .baseSpeed = 70,\n        .baseSpAttack = 70,\n        .baseSpDefense = 70,\n        .types = {TYPE_DRAGON, TYPE_DRAGON},\n        .catchRate = 45,\n        .expYield = 144,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_DRAGON_FANG,\n        .itemRare = ITEM_DRAGON_SCALE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 40,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE},\n        .safariZoneFleeRate = 125,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DRAGONITE] =\n    {\n        .baseHP = 91,\n        .baseAttack = 134,\n        .baseDefense = 95,\n        .baseSpeed = 80,\n        .baseSpAttack = 100,\n        .baseSpDefense = 100,\n        .types = {TYPE_DRAGON, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 218,\n        .evYield_HP = 0,\n        .evYield_Attack = 3,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_DRAGON_FANG,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 40,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MEWTWO] =\n    {\n        .baseHP = 106,\n        .baseAttack = 110,\n        .baseDefense = 90,\n        .baseSpeed = 130,\n        .baseSpAttack = 154,\n        .baseSpDefense = 90,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 3,\n        .expYield = 220,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 120,\n        .friendship = 0,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_PRESSURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MEW] =\n    {\n        .baseHP = 100,\n        .baseAttack = 100,\n        .baseDefense = 100,\n        .baseSpeed = 100,\n        .baseSpAttack = 100,\n        .baseSpDefense = 100,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 45,\n        .expYield = 64,\n        .evYield_HP = 3,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 120,\n        .friendship = 100,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_SYNCHRONIZE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CHIKORITA] =\n    {\n        .baseHP = 45,\n        .baseAttack = 49,\n        .baseDefense = 65,\n        .baseSpeed = 45,\n        .baseSpAttack = 49,\n        .baseSpDefense = 65,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 45,\n        .expYield = 64,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_LUM_BERRY,\n        .itemRare = ITEM_LUM_BERRY,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_OVERGROW, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BAYLEEF] =\n    {\n        .baseHP = 60,\n        .baseAttack = 62,\n        .baseDefense = 80,\n        .baseSpeed = 60,\n        .baseSpAttack = 63,\n        .baseSpDefense = 80,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 45,\n        .expYield = 141,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_OVERGROW, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MEGANIUM] =\n    {\n        .baseHP = 80,\n        .baseAttack = 82,\n        .baseDefense = 100,\n        .baseSpeed = 80,\n        .baseSpAttack = 83,\n        .baseSpDefense = 100,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 45,\n        .expYield = 208,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_OVERGROW, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CYNDAQUIL] =\n    {\n        .baseHP = 39,\n        .baseAttack = 52,\n        .baseDefense = 43,\n        .baseSpeed = 65,\n        .baseSpAttack = 60,\n        .baseSpDefense = 50,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 45,\n        .expYield = 65,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_BLAZE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_QUILAVA] =\n    {\n        .baseHP = 58,\n        .baseAttack = 64,\n        .baseDefense = 58,\n        .baseSpeed = 80,\n        .baseSpAttack = 80,\n        .baseSpDefense = 65,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 45,\n        .expYield = 142,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_BLAZE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TYPHLOSION] =\n    {\n        .baseHP = 78,\n        .baseAttack = 84,\n        .baseDefense = 78,\n        .baseSpeed = 100,\n        .baseSpAttack = 109,\n        .baseSpDefense = 85,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 45,\n        .expYield = 209,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_BLAZE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TOTODILE] =\n    {\n        .baseHP = 50,\n        .baseAttack = 65,\n        .baseDefense = 64,\n        .baseSpeed = 43,\n        .baseSpAttack = 44,\n        .baseSpDefense = 48,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 66,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_TORRENT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CROCONAW] =\n    {\n        .baseHP = 65,\n        .baseAttack = 80,\n        .baseDefense = 80,\n        .baseSpeed = 58,\n        .baseSpAttack = 59,\n        .baseSpDefense = 63,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 143,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_TORRENT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = TRUE,\n    },\n    [SPECIES_FERALIGATR] =\n    {\n        .baseHP = 85,\n        .baseAttack = 105,\n        .baseDefense = 100,\n        .baseSpeed = 78,\n        .baseSpAttack = 79,\n        .baseSpDefense = 83,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 210,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_TORRENT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SENTRET] =\n    {\n        .baseHP = 35,\n        .baseAttack = 46,\n        .baseDefense = 34,\n        .baseSpeed = 20,\n        .baseSpAttack = 35,\n        .baseSpDefense = 45,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 255,\n        .expYield = 57,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_ORAN_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_RUN_AWAY, ABILITY_KEEN_EYE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_FURRET] =\n    {\n        .baseHP = 85,\n        .baseAttack = 76,\n        .baseDefense = 64,\n        .baseSpeed = 90,\n        .baseSpAttack = 45,\n        .baseSpDefense = 55,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 90,\n        .expYield = 116,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_ORAN_BERRY,\n        .itemRare = ITEM_SITRUS_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_RUN_AWAY, ABILITY_KEEN_EYE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HOOTHOOT] =\n    {\n        .baseHP = 60,\n        .baseAttack = 30,\n        .baseDefense = 30,\n        .baseSpeed = 50,\n        .baseSpAttack = 36,\n        .baseSpDefense = 56,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 255,\n        .expYield = 58,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_INSOMNIA, ABILITY_KEEN_EYE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NOCTOWL] =\n    {\n        .baseHP = 100,\n        .baseAttack = 50,\n        .baseDefense = 50,\n        .baseSpeed = 70,\n        .baseSpAttack = 76,\n        .baseSpDefense = 96,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 90,\n        .expYield = 162,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_INSOMNIA, ABILITY_KEEN_EYE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LEDYBA] =\n    {\n        .baseHP = 40,\n        .baseAttack = 20,\n        .baseDefense = 30,\n        .baseSpeed = 55,\n        .baseSpAttack = 40,\n        .baseSpDefense = 80,\n        .types = {TYPE_BUG, TYPE_FLYING},\n        .catchRate = 255,\n        .expYield = 54,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SWARM, ABILITY_EARLY_BIRD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LEDIAN] =\n    {\n        .baseHP = 55,\n        .baseAttack = 35,\n        .baseDefense = 50,\n        .baseSpeed = 85,\n        .baseSpAttack = 55,\n        .baseSpDefense = 110,\n        .types = {TYPE_BUG, TYPE_FLYING},\n        .catchRate = 90,\n        .expYield = 134,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SWARM, ABILITY_EARLY_BIRD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SPINARAK] =\n    {\n        .baseHP = 40,\n        .baseAttack = 60,\n        .baseDefense = 40,\n        .baseSpeed = 30,\n        .baseSpAttack = 40,\n        .baseSpDefense = 40,\n        .types = {TYPE_BUG, TYPE_POISON},\n        .catchRate = 255,\n        .expYield = 54,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SWARM, ABILITY_INSOMNIA},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ARIADOS] =\n    {\n        .baseHP = 70,\n        .baseAttack = 90,\n        .baseDefense = 70,\n        .baseSpeed = 40,\n        .baseSpAttack = 60,\n        .baseSpDefense = 60,\n        .types = {TYPE_BUG, TYPE_POISON},\n        .catchRate = 90,\n        .expYield = 134,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SWARM, ABILITY_INSOMNIA},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CROBAT] =\n    {\n        .baseHP = 85,\n        .baseAttack = 90,\n        .baseDefense = 80,\n        .baseSpeed = 130,\n        .baseSpAttack = 70,\n        .baseSpDefense = 80,\n        .types = {TYPE_POISON, TYPE_FLYING},\n        .catchRate = 90,\n        .expYield = 204,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 3,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CHINCHOU] =\n    {\n        .baseHP = 75,\n        .baseAttack = 38,\n        .baseDefense = 38,\n        .baseSpeed = 67,\n        .baseSpAttack = 56,\n        .baseSpDefense = 56,\n        .types = {TYPE_WATER, TYPE_ELECTRIC},\n        .catchRate = 190,\n        .expYield = 90,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_DEEP_SEA_SCALE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_VOLT_ABSORB, ABILITY_ILLUMINATE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LANTURN] =\n    {\n        .baseHP = 125,\n        .baseAttack = 58,\n        .baseDefense = 58,\n        .baseSpeed = 67,\n        .baseSpAttack = 76,\n        .baseSpDefense = 76,\n        .types = {TYPE_WATER, TYPE_ELECTRIC},\n        .catchRate = 75,\n        .expYield = 156,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_YELLOW_SHARD,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_VOLT_ABSORB, ABILITY_ILLUMINATE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PICHU] =\n    {\n        .baseHP = 20,\n        .baseAttack = 40,\n        .baseDefense = 15,\n        .baseSpeed = 60,\n        .baseSpAttack = 35,\n        .baseSpDefense = 35,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 190,\n        .expYield = 42,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 10,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_STATIC, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CLEFFA] =\n    {\n        .baseHP = 50,\n        .baseAttack = 25,\n        .baseDefense = 28,\n        .baseSpeed = 15,\n        .baseSpAttack = 45,\n        .baseSpDefense = 55,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 150,\n        .expYield = 37,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_MOON_STONE,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 10,\n        .friendship = 140,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_IGGLYBUFF] =\n    {\n        .baseHP = 90,\n        .baseAttack = 30,\n        .baseDefense = 15,\n        .baseSpeed = 15,\n        .baseSpAttack = 40,\n        .baseSpDefense = 20,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 170,\n        .expYield = 39,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_ORAN_BERRY,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 10,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = TRUE,\n    },\n    [SPECIES_TOGEPI] =\n    {\n        .baseHP = 35,\n        .baseAttack = 20,\n        .baseDefense = 65,\n        .baseSpeed = 20,\n        .baseSpAttack = 40,\n        .baseSpDefense = 65,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 190,\n        .expYield = 74,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 10,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_HUSTLE, ABILITY_SERENE_GRACE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TOGETIC] =\n    {\n        .baseHP = 55,\n        .baseAttack = 40,\n        .baseDefense = 85,\n        .baseSpeed = 40,\n        .baseSpAttack = 80,\n        .baseSpDefense = 105,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 75,\n        .expYield = 114,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 10,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_HUSTLE, ABILITY_SERENE_GRACE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NATU] =\n    {\n        .baseHP = 40,\n        .baseAttack = 50,\n        .baseDefense = 45,\n        .baseSpeed = 70,\n        .baseSpAttack = 70,\n        .baseSpDefense = 45,\n        .types = {TYPE_PSYCHIC, TYPE_FLYING},\n        .catchRate = 190,\n        .expYield = 73,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_SYNCHRONIZE, ABILITY_EARLY_BIRD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_XATU] =\n    {\n        .baseHP = 65,\n        .baseAttack = 75,\n        .baseDefense = 70,\n        .baseSpeed = 95,\n        .baseSpAttack = 95,\n        .baseSpDefense = 70,\n        .types = {TYPE_PSYCHIC, TYPE_FLYING},\n        .catchRate = 75,\n        .expYield = 171,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_SYNCHRONIZE, ABILITY_EARLY_BIRD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MAREEP] =\n    {\n        .baseHP = 55,\n        .baseAttack = 40,\n        .baseDefense = 40,\n        .baseSpeed = 35,\n        .baseSpAttack = 65,\n        .baseSpDefense = 45,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 235,\n        .expYield = 59,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_STATIC, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_FLAAFFY] =\n    {\n        .baseHP = 70,\n        .baseAttack = 55,\n        .baseDefense = 55,\n        .baseSpeed = 45,\n        .baseSpAttack = 80,\n        .baseSpDefense = 60,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 120,\n        .expYield = 117,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_STATIC, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_AMPHAROS] =\n    {\n        .baseHP = 90,\n        .baseAttack = 75,\n        .baseDefense = 75,\n        .baseSpeed = 55,\n        .baseSpAttack = 115,\n        .baseSpDefense = 90,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 45,\n        .expYield = 194,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_STATIC, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BELLOSSOM] =\n    {\n        .baseHP = 75,\n        .baseAttack = 80,\n        .baseDefense = 85,\n        .baseSpeed = 50,\n        .baseSpAttack = 90,\n        .baseSpDefense = 100,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 45,\n        .expYield = 184,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 3,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MARILL] =\n    {\n        .baseHP = 70,\n        .baseAttack = 20,\n        .baseDefense = 50,\n        .baseSpeed = 40,\n        .baseSpAttack = 20,\n        .baseSpDefense = 50,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 190,\n        .expYield = 58,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 10,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_HUGE_POWER},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_AZUMARILL] =\n    {\n        .baseHP = 100,\n        .baseAttack = 50,\n        .baseDefense = 80,\n        .baseSpeed = 50,\n        .baseSpAttack = 50,\n        .baseSpDefense = 80,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 75,\n        .expYield = 153,\n        .evYield_HP = 3,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 10,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_HUGE_POWER},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SUDOWOODO] =\n    {\n        .baseHP = 70,\n        .baseAttack = 100,\n        .baseDefense = 115,\n        .baseSpeed = 30,\n        .baseSpAttack = 30,\n        .baseSpDefense = 65,\n        .types = {TYPE_ROCK, TYPE_ROCK},\n        .catchRate = 65,\n        .expYield = 135,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_STURDY, ABILITY_ROCK_HEAD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_POLITOED] =\n    {\n        .baseHP = 90,\n        .baseAttack = 75,\n        .baseDefense = 75,\n        .baseSpeed = 70,\n        .baseSpAttack = 90,\n        .baseSpDefense = 100,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 185,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 3,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_KINGS_ROCK,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_WATER_ABSORB, ABILITY_DAMP},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = TRUE,\n    },\n    [SPECIES_HOPPIP] =\n    {\n        .baseHP = 35,\n        .baseAttack = 35,\n        .baseDefense = 40,\n        .baseSpeed = 50,\n        .baseSpAttack = 35,\n        .baseSpDefense = 55,\n        .types = {TYPE_GRASS, TYPE_FLYING},\n        .catchRate = 255,\n        .expYield = 74,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SKIPLOOM] =\n    {\n        .baseHP = 55,\n        .baseAttack = 45,\n        .baseDefense = 50,\n        .baseSpeed = 80,\n        .baseSpAttack = 45,\n        .baseSpDefense = 65,\n        .types = {TYPE_GRASS, TYPE_FLYING},\n        .catchRate = 120,\n        .expYield = 136,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_JUMPLUFF] =\n    {\n        .baseHP = 75,\n        .baseAttack = 55,\n        .baseDefense = 70,\n        .baseSpeed = 110,\n        .baseSpAttack = 55,\n        .baseSpDefense = 85,\n        .types = {TYPE_GRASS, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 176,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 3,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_AIPOM] =\n    {\n        .baseHP = 55,\n        .baseAttack = 70,\n        .baseDefense = 55,\n        .baseSpeed = 85,\n        .baseSpAttack = 40,\n        .baseSpDefense = 55,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 94,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_RUN_AWAY, ABILITY_PICKUP},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SUNKERN] =\n    {\n        .baseHP = 30,\n        .baseAttack = 30,\n        .baseDefense = 30,\n        .baseSpeed = 30,\n        .baseSpAttack = 30,\n        .baseSpDefense = 30,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 235,\n        .expYield = 52,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SUNFLORA] =\n    {\n        .baseHP = 75,\n        .baseAttack = 75,\n        .baseDefense = 55,\n        .baseSpeed = 30,\n        .baseSpAttack = 105,\n        .baseSpDefense = 85,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 120,\n        .expYield = 146,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_YANMA] =\n    {\n        .baseHP = 65,\n        .baseAttack = 65,\n        .baseDefense = 45,\n        .baseSpeed = 95,\n        .baseSpAttack = 75,\n        .baseSpDefense = 45,\n        .types = {TYPE_BUG, TYPE_FLYING},\n        .catchRate = 75,\n        .expYield = 147,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SPEED_BOOST, ABILITY_COMPOUND_EYES},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WOOPER] =\n    {\n        .baseHP = 55,\n        .baseAttack = 45,\n        .baseDefense = 45,\n        .baseSpeed = 15,\n        .baseSpAttack = 25,\n        .baseSpDefense = 25,\n        .types = {TYPE_WATER, TYPE_GROUND},\n        .catchRate = 255,\n        .expYield = 52,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_DAMP, ABILITY_WATER_ABSORB},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_QUAGSIRE] =\n    {\n        .baseHP = 95,\n        .baseAttack = 85,\n        .baseDefense = 85,\n        .baseSpeed = 35,\n        .baseSpAttack = 65,\n        .baseSpDefense = 65,\n        .types = {TYPE_WATER, TYPE_GROUND},\n        .catchRate = 90,\n        .expYield = 137,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_DAMP, ABILITY_WATER_ABSORB},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ESPEON] =\n    {\n        .baseHP = 65,\n        .baseAttack = 65,\n        .baseDefense = 60,\n        .baseSpeed = 110,\n        .baseSpAttack = 130,\n        .baseSpDefense = 95,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 45,\n        .expYield = 197,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 35,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_SYNCHRONIZE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_UMBREON] =\n    {\n        .baseHP = 95,\n        .baseAttack = 65,\n        .baseDefense = 110,\n        .baseSpeed = 65,\n        .baseSpAttack = 60,\n        .baseSpDefense = 130,\n        .types = {TYPE_DARK, TYPE_DARK},\n        .catchRate = 45,\n        .expYield = 197,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 35,\n        .friendship = 35,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_SYNCHRONIZE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MURKROW] =\n    {\n        .baseHP = 60,\n        .baseAttack = 85,\n        .baseDefense = 42,\n        .baseSpeed = 91,\n        .baseSpAttack = 85,\n        .baseSpDefense = 42,\n        .types = {TYPE_DARK, TYPE_FLYING},\n        .catchRate = 30,\n        .expYield = 107,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 35,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_INSOMNIA, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SLOWKING] =\n    {\n        .baseHP = 95,\n        .baseAttack = 75,\n        .baseDefense = 80,\n        .baseSpeed = 30,\n        .baseSpAttack = 100,\n        .baseSpDefense = 110,\n        .types = {TYPE_WATER, TYPE_PSYCHIC},\n        .catchRate = 70,\n        .expYield = 164,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 3,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_KINGS_ROCK,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_OBLIVIOUS, ABILITY_OWN_TEMPO},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MISDREAVUS] =\n    {\n        .baseHP = 60,\n        .baseAttack = 60,\n        .baseDefense = 60,\n        .baseSpeed = 85,\n        .baseSpAttack = 85,\n        .baseSpDefense = 85,\n        .types = {TYPE_GHOST, TYPE_GHOST},\n        .catchRate = 45,\n        .expYield = 147,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SPELL_TAG,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 35,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_UNOWN] =\n    {\n        .baseHP = 48,\n        .baseAttack = 72,\n        .baseDefense = 48,\n        .baseSpeed = 48,\n        .baseSpAttack = 72,\n        .baseSpDefense = 48,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 225,\n        .expYield = 61,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 40,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = TRUE,\n    },\n    [SPECIES_WOBBUFFET] =\n    {\n        .baseHP = 190,\n        .baseAttack = 33,\n        .baseDefense = 58,\n        .baseSpeed = 33,\n        .baseSpAttack = 33,\n        .baseSpDefense = 58,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 45,\n        .expYield = 177,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_SHADOW_TAG, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GIRAFARIG] =\n    {\n        .baseHP = 70,\n        .baseAttack = 80,\n        .baseDefense = 65,\n        .baseSpeed = 85,\n        .baseSpAttack = 90,\n        .baseSpDefense = 65,\n        .types = {TYPE_NORMAL, TYPE_PSYCHIC},\n        .catchRate = 60,\n        .expYield = 149,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_PERSIM_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_INNER_FOCUS, ABILITY_EARLY_BIRD},\n        .safariZoneFleeRate = 4,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PINECO] =\n    {\n        .baseHP = 50,\n        .baseAttack = 65,\n        .baseDefense = 90,\n        .baseSpeed = 15,\n        .baseSpAttack = 35,\n        .baseSpDefense = 35,\n        .types = {TYPE_BUG, TYPE_BUG},\n        .catchRate = 190,\n        .expYield = 60,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_STURDY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_FORRETRESS] =\n    {\n        .baseHP = 75,\n        .baseAttack = 90,\n        .baseDefense = 140,\n        .baseSpeed = 40,\n        .baseSpAttack = 60,\n        .baseSpDefense = 60,\n        .types = {TYPE_BUG, TYPE_STEEL},\n        .catchRate = 75,\n        .expYield = 118,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_STURDY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DUNSPARCE] =\n    {\n        .baseHP = 100,\n        .baseAttack = 70,\n        .baseDefense = 70,\n        .baseSpeed = 45,\n        .baseSpAttack = 65,\n        .baseSpDefense = 65,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 190,\n        .expYield = 75,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_SERENE_GRACE, ABILITY_RUN_AWAY},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GLIGAR] =\n    {\n        .baseHP = 65,\n        .baseAttack = 75,\n        .baseDefense = 105,\n        .baseSpeed = 85,\n        .baseSpAttack = 35,\n        .baseSpDefense = 65,\n        .types = {TYPE_GROUND, TYPE_FLYING},\n        .catchRate = 60,\n        .expYield = 108,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SAND_VEIL},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_STEELIX] =\n    {\n        .baseHP = 75,\n        .baseAttack = 85,\n        .baseDefense = 200,\n        .baseSpeed = 30,\n        .baseSpAttack = 55,\n        .baseSpDefense = 65,\n        .types = {TYPE_STEEL, TYPE_GROUND},\n        .catchRate = 25,\n        .expYield = 196,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_METAL_COAT,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_ROCK_HEAD, ABILITY_STURDY},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SNUBBULL] =\n    {\n        .baseHP = 60,\n        .baseAttack = 80,\n        .baseDefense = 50,\n        .baseSpeed = 30,\n        .baseSpAttack = 40,\n        .baseSpDefense = 40,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 190,\n        .expYield = 63,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_RUN_AWAY},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GRANBULL] =\n    {\n        .baseHP = 90,\n        .baseAttack = 120,\n        .baseDefense = 75,\n        .baseSpeed = 45,\n        .baseSpAttack = 60,\n        .baseSpDefense = 60,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 75,\n        .expYield = 178,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_INTIMIDATE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_QWILFISH] =\n    {\n        .baseHP = 65,\n        .baseAttack = 95,\n        .baseDefense = 75,\n        .baseSpeed = 85,\n        .baseSpAttack = 55,\n        .baseSpDefense = 55,\n        .types = {TYPE_WATER, TYPE_POISON},\n        .catchRate = 45,\n        .expYield = 100,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_POISON_POINT, ABILITY_SWIFT_SWIM},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SCIZOR] =\n    {\n        .baseHP = 70,\n        .baseAttack = 130,\n        .baseDefense = 100,\n        .baseSpeed = 65,\n        .baseSpAttack = 55,\n        .baseSpDefense = 80,\n        .types = {TYPE_BUG, TYPE_STEEL},\n        .catchRate = 25,\n        .expYield = 200,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SWARM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SHUCKLE] =\n    {\n        .baseHP = 20,\n        .baseAttack = 10,\n        .baseDefense = 230,\n        .baseSpeed = 5,\n        .baseSpAttack = 10,\n        .baseSpDefense = 230,\n        .types = {TYPE_BUG, TYPE_ROCK},\n        .catchRate = 190,\n        .expYield = 80,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_ORAN_BERRY,\n        .itemRare = ITEM_SITRUS_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_STURDY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HERACROSS] =\n    {\n        .baseHP = 80,\n        .baseAttack = 125,\n        .baseDefense = 75,\n        .baseSpeed = 85,\n        .baseSpAttack = 40,\n        .baseSpDefense = 95,\n        .types = {TYPE_BUG, TYPE_FIGHTING},\n        .catchRate = 45,\n        .expYield = 200,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SWARM, ABILITY_GUTS},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SNEASEL] =\n    {\n        .baseHP = 55,\n        .baseAttack = 95,\n        .baseDefense = 55,\n        .baseSpeed = 115,\n        .baseSpAttack = 35,\n        .baseSpDefense = 75,\n        .types = {TYPE_DARK, TYPE_ICE},\n        .catchRate = 60,\n        .expYield = 132,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 35,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_INNER_FOCUS, ABILITY_KEEN_EYE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = TRUE,\n    },\n    [SPECIES_TEDDIURSA] =\n    {\n        .baseHP = 60,\n        .baseAttack = 80,\n        .baseDefense = 50,\n        .baseSpeed = 40,\n        .baseSpAttack = 50,\n        .baseSpDefense = 50,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 120,\n        .expYield = 124,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_ORAN_BERRY,\n        .itemRare = ITEM_SITRUS_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_PICKUP, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = TRUE,\n    },\n    [SPECIES_URSARING] =\n    {\n        .baseHP = 90,\n        .baseAttack = 130,\n        .baseDefense = 75,\n        .baseSpeed = 55,\n        .baseSpAttack = 75,\n        .baseSpDefense = 75,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 60,\n        .expYield = 189,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_ORAN_BERRY,\n        .itemRare = ITEM_SITRUS_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_GUTS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SLUGMA] =\n    {\n        .baseHP = 40,\n        .baseAttack = 40,\n        .baseDefense = 40,\n        .baseSpeed = 20,\n        .baseSpAttack = 70,\n        .baseSpDefense = 40,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 190,\n        .expYield = 78,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_MAGMA_ARMOR, ABILITY_FLAME_BODY},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MAGCARGO] =\n    {\n        .baseHP = 50,\n        .baseAttack = 50,\n        .baseDefense = 120,\n        .baseSpeed = 30,\n        .baseSpAttack = 80,\n        .baseSpDefense = 80,\n        .types = {TYPE_FIRE, TYPE_ROCK},\n        .catchRate = 75,\n        .expYield = 154,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_MAGMA_ARMOR, ABILITY_FLAME_BODY},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SWINUB] =\n    {\n        .baseHP = 50,\n        .baseAttack = 50,\n        .baseDefense = 40,\n        .baseSpeed = 50,\n        .baseSpAttack = 30,\n        .baseSpDefense = 30,\n        .types = {TYPE_ICE, TYPE_GROUND},\n        .catchRate = 225,\n        .expYield = 78,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_ASPEAR_BERRY,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PILOSWINE] =\n    {\n        .baseHP = 100,\n        .baseAttack = 100,\n        .baseDefense = 80,\n        .baseSpeed = 50,\n        .baseSpAttack = 60,\n        .baseSpDefense = 60,\n        .types = {TYPE_ICE, TYPE_GROUND},\n        .catchRate = 75,\n        .expYield = 160,\n        .evYield_HP = 1,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_ASPEAR_BERRY,\n        .itemRare = ITEM_NEVER_MELT_ICE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CORSOLA] =\n    {\n        .baseHP = 55,\n        .baseAttack = 55,\n        .baseDefense = 85,\n        .baseSpeed = 35,\n        .baseSpAttack = 65,\n        .baseSpDefense = 85,\n        .types = {TYPE_WATER, TYPE_ROCK},\n        .catchRate = 60,\n        .expYield = 113,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_RED_SHARD,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_HUSTLE, ABILITY_NATURAL_CURE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_REMORAID] =\n    {\n        .baseHP = 35,\n        .baseAttack = 65,\n        .baseDefense = 35,\n        .baseSpeed = 65,\n        .baseSpAttack = 65,\n        .baseSpDefense = 35,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 190,\n        .expYield = 78,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_HUSTLE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_OCTILLERY] =\n    {\n        .baseHP = 75,\n        .baseAttack = 105,\n        .baseDefense = 75,\n        .baseSpeed = 45,\n        .baseSpAttack = 105,\n        .baseSpDefense = 75,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 75,\n        .expYield = 164,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_SUCTION_CUPS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DELIBIRD] =\n    {\n        .baseHP = 45,\n        .baseAttack = 55,\n        .baseDefense = 45,\n        .baseSpeed = 75,\n        .baseSpAttack = 65,\n        .baseSpDefense = 45,\n        .types = {TYPE_ICE, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 183,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_VITAL_SPIRIT, ABILITY_HUSTLE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MANTINE] =\n    {\n        .baseHP = 65,\n        .baseAttack = 40,\n        .baseDefense = 70,\n        .baseSpeed = 70,\n        .baseSpAttack = 80,\n        .baseSpDefense = 140,\n        .types = {TYPE_WATER, TYPE_FLYING},\n        .catchRate = 25,\n        .expYield = 168,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_WATER_ABSORB},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SKARMORY] =\n    {\n        .baseHP = 65,\n        .baseAttack = 80,\n        .baseDefense = 140,\n        .baseSpeed = 70,\n        .baseSpAttack = 40,\n        .baseSpDefense = 70,\n        .types = {TYPE_STEEL, TYPE_FLYING},\n        .catchRate = 25,\n        .expYield = 168,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SHARP_BEAK,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_KEEN_EYE, ABILITY_STURDY},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HOUNDOUR] =\n    {\n        .baseHP = 45,\n        .baseAttack = 60,\n        .baseDefense = 30,\n        .baseSpeed = 65,\n        .baseSpAttack = 80,\n        .baseSpDefense = 50,\n        .types = {TYPE_DARK, TYPE_FIRE},\n        .catchRate = 120,\n        .expYield = 114,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_EARLY_BIRD, ABILITY_FLASH_FIRE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HOUNDOOM] =\n    {\n        .baseHP = 75,\n        .baseAttack = 90,\n        .baseDefense = 50,\n        .baseSpeed = 95,\n        .baseSpAttack = 110,\n        .baseSpDefense = 80,\n        .types = {TYPE_DARK, TYPE_FIRE},\n        .catchRate = 45,\n        .expYield = 204,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_EARLY_BIRD, ABILITY_FLASH_FIRE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_KINGDRA] =\n    {\n        .baseHP = 75,\n        .baseAttack = 95,\n        .baseDefense = 95,\n        .baseSpeed = 85,\n        .baseSpAttack = 95,\n        .baseSpDefense = 95,\n        .types = {TYPE_WATER, TYPE_DRAGON},\n        .catchRate = 45,\n        .expYield = 207,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_DRAGON_SCALE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PHANPY] =\n    {\n        .baseHP = 90,\n        .baseAttack = 60,\n        .baseDefense = 60,\n        .baseSpeed = 40,\n        .baseSpAttack = 40,\n        .baseSpDefense = 40,\n        .types = {TYPE_GROUND, TYPE_GROUND},\n        .catchRate = 120,\n        .expYield = 124,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_PICKUP, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DONPHAN] =\n    {\n        .baseHP = 90,\n        .baseAttack = 120,\n        .baseDefense = 120,\n        .baseSpeed = 50,\n        .baseSpAttack = 60,\n        .baseSpDefense = 60,\n        .types = {TYPE_GROUND, TYPE_GROUND},\n        .catchRate = 60,\n        .expYield = 189,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_STURDY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PORYGON2] =\n    {\n        .baseHP = 85,\n        .baseAttack = 80,\n        .baseDefense = 90,\n        .baseSpeed = 60,\n        .baseSpAttack = 105,\n        .baseSpDefense = 95,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 180,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_UP_GRADE,\n        .itemRare = ITEM_UP_GRADE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_TRACE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_STANTLER] =\n    {\n        .baseHP = 73,\n        .baseAttack = 95,\n        .baseDefense = 62,\n        .baseSpeed = 85,\n        .baseSpAttack = 85,\n        .baseSpDefense = 65,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 165,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SMEARGLE] =\n    {\n        .baseHP = 55,\n        .baseAttack = 20,\n        .baseDefense = 35,\n        .baseSpeed = 75,\n        .baseSpAttack = 20,\n        .baseSpDefense = 45,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 106,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_OWN_TEMPO, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TYROGUE] =\n    {\n        .baseHP = 35,\n        .baseAttack = 35,\n        .baseDefense = 35,\n        .baseSpeed = 35,\n        .baseSpAttack = 35,\n        .baseSpDefense = 35,\n        .types = {TYPE_FIGHTING, TYPE_FIGHTING},\n        .catchRate = 75,\n        .expYield = 91,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_MALE,\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_GUTS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HITMONTOP] =\n    {\n        .baseHP = 50,\n        .baseAttack = 95,\n        .baseDefense = 95,\n        .baseSpeed = 70,\n        .baseSpAttack = 35,\n        .baseSpDefense = 110,\n        .types = {TYPE_FIGHTING, TYPE_FIGHTING},\n        .catchRate = 45,\n        .expYield = 138,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_MALE,\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SMOOCHUM] =\n    {\n        .baseHP = 45,\n        .baseAttack = 30,\n        .baseDefense = 15,\n        .baseSpeed = 65,\n        .baseSpAttack = 85,\n        .baseSpDefense = 65,\n        .types = {TYPE_ICE, TYPE_PSYCHIC},\n        .catchRate = 45,\n        .expYield = 87,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_FEMALE,\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ELEKID] =\n    {\n        .baseHP = 45,\n        .baseAttack = 63,\n        .baseDefense = 37,\n        .baseSpeed = 95,\n        .baseSpAttack = 65,\n        .baseSpDefense = 55,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 45,\n        .expYield = 106,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_STATIC, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = TRUE,\n    },\n    [SPECIES_MAGBY] =\n    {\n        .baseHP = 45,\n        .baseAttack = 75,\n        .baseDefense = 37,\n        .baseSpeed = 83,\n        .baseSpAttack = 70,\n        .baseSpDefense = 55,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 45,\n        .expYield = 117,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_FLAME_BODY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MILTANK] =\n    {\n        .baseHP = 95,\n        .baseAttack = 80,\n        .baseDefense = 105,\n        .baseSpeed = 100,\n        .baseSpAttack = 40,\n        .baseSpDefense = 70,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 200,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_MOOMOO_MILK,\n        .itemRare = ITEM_MOOMOO_MILK,\n        .genderRatio = MON_FEMALE,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BLISSEY] =\n    {\n        .baseHP = 255,\n        .baseAttack = 10,\n        .baseDefense = 10,\n        .baseSpeed = 55,\n        .baseSpAttack = 75,\n        .baseSpDefense = 135,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 30,\n        .expYield = 255,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_LUCKY_EGG,\n        .genderRatio = MON_FEMALE,\n        .eggCycles = 40,\n        .friendship = 140,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_NATURAL_CURE, ABILITY_SERENE_GRACE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_RAIKOU] =\n    {\n        .baseHP = 90,\n        .baseAttack = 85,\n        .baseDefense = 75,\n        .baseSpeed = 115,\n        .baseSpAttack = 115,\n        .baseSpDefense = 100,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 3,\n        .expYield = 216,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 80,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_PRESSURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ENTEI] =\n    {\n        .baseHP = 115,\n        .baseAttack = 115,\n        .baseDefense = 85,\n        .baseSpeed = 100,\n        .baseSpAttack = 90,\n        .baseSpDefense = 75,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 3,\n        .expYield = 217,\n        .evYield_HP = 1,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 80,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_PRESSURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SUICUNE] =\n    {\n        .baseHP = 100,\n        .baseAttack = 75,\n        .baseDefense = 115,\n        .baseSpeed = 85,\n        .baseSpAttack = 90,\n        .baseSpDefense = 115,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 3,\n        .expYield = 215,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 80,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_PRESSURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LARVITAR] =\n    {\n        .baseHP = 50,\n        .baseAttack = 64,\n        .baseDefense = 50,\n        .baseSpeed = 41,\n        .baseSpAttack = 45,\n        .baseSpDefense = 50,\n        .types = {TYPE_ROCK, TYPE_GROUND},\n        .catchRate = 45,\n        .expYield = 67,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 40,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER},\n        .abilities = {ABILITY_GUTS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PUPITAR] =\n    {\n        .baseHP = 70,\n        .baseAttack = 84,\n        .baseDefense = 70,\n        .baseSpeed = 51,\n        .baseSpAttack = 65,\n        .baseSpDefense = 70,\n        .types = {TYPE_ROCK, TYPE_GROUND},\n        .catchRate = 45,\n        .expYield = 144,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 40,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER},\n        .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TYRANITAR] =\n    {\n        .baseHP = 100,\n        .baseAttack = 134,\n        .baseDefense = 110,\n        .baseSpeed = 61,\n        .baseSpAttack = 95,\n        .baseSpDefense = 100,\n        .types = {TYPE_ROCK, TYPE_DARK},\n        .catchRate = 45,\n        .expYield = 218,\n        .evYield_HP = 0,\n        .evYield_Attack = 3,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 40,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER},\n        .abilities = {ABILITY_SAND_STREAM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LUGIA] =\n    {\n        .baseHP = 106,\n        .baseAttack = 90,\n        .baseDefense = 130,\n        .baseSpeed = 110,\n        .baseSpAttack = 90,\n        .baseSpDefense = 154,\n        .types = {TYPE_PSYCHIC, TYPE_FLYING},\n        .catchRate = 3,\n        .expYield = 220,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 3,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 120,\n        .friendship = 0,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_PRESSURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HO_OH] =\n    {\n        .baseHP = 106,\n        .baseAttack = 130,\n        .baseDefense = 90,\n        .baseSpeed = 90,\n        .baseSpAttack = 110,\n        .baseSpDefense = 154,\n        .types = {TYPE_FIRE, TYPE_FLYING},\n        .catchRate = 3,\n        .expYield = 220,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 3,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 120,\n        .friendship = 0,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_PRESSURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CELEBI] =\n    {\n        .baseHP = 100,\n        .baseAttack = 100,\n        .baseDefense = 100,\n        .baseSpeed = 100,\n        .baseSpAttack = 100,\n        .baseSpDefense = 100,\n        .types = {TYPE_PSYCHIC, TYPE_GRASS},\n        .catchRate = 45,\n        .expYield = 64,\n        .evYield_HP = 3,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_LUM_BERRY,\n        .itemRare = ITEM_LUM_BERRY,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 120,\n        .friendship = 100,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_NATURAL_CURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_OLD_UNOWN_B] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_C] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_D] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_E] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_F] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_G] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_H] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_I] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_J] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_K] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_L] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_M] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_N] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_O] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_P] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_Q] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_R] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_S] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_T] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_U] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_V] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_W] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_X] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_Y] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_OLD_UNOWN_Z] = OLD_UNOWN_SPECIES_INFO,\n    [SPECIES_TREECKO] =\n    {\n        .baseHP = 40,\n        .baseAttack = 45,\n        .baseDefense = 35,\n        .baseSpeed = 70,\n        .baseSpAttack = 65,\n        .baseSpDefense = 55,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 45,\n        .expYield = 65,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_OVERGROW, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GROVYLE] =\n    {\n        .baseHP = 50,\n        .baseAttack = 65,\n        .baseDefense = 45,\n        .baseSpeed = 95,\n        .baseSpAttack = 85,\n        .baseSpDefense = 65,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 45,\n        .expYield = 141,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_OVERGROW, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SCEPTILE] =\n    {\n        .baseHP = 70,\n        .baseAttack = 85,\n        .baseDefense = 65,\n        .baseSpeed = 120,\n        .baseSpAttack = 105,\n        .baseSpDefense = 85,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 45,\n        .expYield = 208,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 3,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_OVERGROW, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TORCHIC] =\n    {\n        .baseHP = 45,\n        .baseAttack = 60,\n        .baseDefense = 40,\n        .baseSpeed = 45,\n        .baseSpAttack = 70,\n        .baseSpDefense = 50,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 45,\n        .expYield = 65,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_BLAZE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_COMBUSKEN] =\n    {\n        .baseHP = 60,\n        .baseAttack = 85,\n        .baseDefense = 60,\n        .baseSpeed = 55,\n        .baseSpAttack = 85,\n        .baseSpDefense = 60,\n        .types = {TYPE_FIRE, TYPE_FIGHTING},\n        .catchRate = 45,\n        .expYield = 142,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_BLAZE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BLAZIKEN] =\n    {\n        .baseHP = 80,\n        .baseAttack = 120,\n        .baseDefense = 70,\n        .baseSpeed = 80,\n        .baseSpAttack = 110,\n        .baseSpDefense = 70,\n        .types = {TYPE_FIRE, TYPE_FIGHTING},\n        .catchRate = 45,\n        .expYield = 209,\n        .evYield_HP = 0,\n        .evYield_Attack = 3,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_BLAZE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MUDKIP] =\n    {\n        .baseHP = 50,\n        .baseAttack = 70,\n        .baseDefense = 50,\n        .baseSpeed = 40,\n        .baseSpAttack = 50,\n        .baseSpDefense = 50,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 65,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_TORRENT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MARSHTOMP] =\n    {\n        .baseHP = 70,\n        .baseAttack = 85,\n        .baseDefense = 70,\n        .baseSpeed = 50,\n        .baseSpAttack = 60,\n        .baseSpDefense = 70,\n        .types = {TYPE_WATER, TYPE_GROUND},\n        .catchRate = 45,\n        .expYield = 143,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_TORRENT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SWAMPERT] =\n    {\n        .baseHP = 100,\n        .baseAttack = 110,\n        .baseDefense = 90,\n        .baseSpeed = 60,\n        .baseSpAttack = 85,\n        .baseSpDefense = 90,\n        .types = {TYPE_WATER, TYPE_GROUND},\n        .catchRate = 45,\n        .expYield = 210,\n        .evYield_HP = 0,\n        .evYield_Attack = 3,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_TORRENT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_POOCHYENA] =\n    {\n        .baseHP = 35,\n        .baseAttack = 55,\n        .baseDefense = 35,\n        .baseSpeed = 35,\n        .baseSpAttack = 30,\n        .baseSpDefense = 30,\n        .types = {TYPE_DARK, TYPE_DARK},\n        .catchRate = 255,\n        .expYield = 55,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_PECHA_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_RUN_AWAY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MIGHTYENA] =\n    {\n        .baseHP = 70,\n        .baseAttack = 90,\n        .baseDefense = 70,\n        .baseSpeed = 70,\n        .baseSpAttack = 60,\n        .baseSpDefense = 60,\n        .types = {TYPE_DARK, TYPE_DARK},\n        .catchRate = 127,\n        .expYield = 128,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_PECHA_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ZIGZAGOON] =\n    {\n        .baseHP = 38,\n        .baseAttack = 30,\n        .baseDefense = 41,\n        .baseSpeed = 60,\n        .baseSpAttack = 30,\n        .baseSpDefense = 41,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 255,\n        .expYield = 60,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_ORAN_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_PICKUP, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LINOONE] =\n    {\n        .baseHP = 78,\n        .baseAttack = 70,\n        .baseDefense = 61,\n        .baseSpeed = 100,\n        .baseSpAttack = 50,\n        .baseSpDefense = 61,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 90,\n        .expYield = 128,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_ORAN_BERRY,\n        .itemRare = ITEM_SITRUS_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_PICKUP, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WURMPLE] =\n    {\n        .baseHP = 45,\n        .baseAttack = 45,\n        .baseDefense = 35,\n        .baseSpeed = 20,\n        .baseSpAttack = 20,\n        .baseSpDefense = 30,\n        .types = {TYPE_BUG, TYPE_BUG},\n        .catchRate = 255,\n        .expYield = 54,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SHIELD_DUST, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SILCOON] =\n    {\n        .baseHP = 50,\n        .baseAttack = 35,\n        .baseDefense = 55,\n        .baseSpeed = 15,\n        .baseSpAttack = 25,\n        .baseSpDefense = 25,\n        .types = {TYPE_BUG, TYPE_BUG},\n        .catchRate = 120,\n        .expYield = 71,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BEAUTIFLY] =\n    {\n        .baseHP = 60,\n        .baseAttack = 70,\n        .baseDefense = 50,\n        .baseSpeed = 65,\n        .baseSpAttack = 90,\n        .baseSpDefense = 50,\n        .types = {TYPE_BUG, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 161,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SILVER_POWDER,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SWARM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CASCOON] =\n    {\n        .baseHP = 50,\n        .baseAttack = 35,\n        .baseDefense = 55,\n        .baseSpeed = 15,\n        .baseSpAttack = 25,\n        .baseSpDefense = 25,\n        .types = {TYPE_BUG, TYPE_BUG},\n        .catchRate = 120,\n        .expYield = 72,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DUSTOX] =\n    {\n        .baseHP = 60,\n        .baseAttack = 50,\n        .baseDefense = 70,\n        .baseSpeed = 65,\n        .baseSpAttack = 50,\n        .baseSpDefense = 90,\n        .types = {TYPE_BUG, TYPE_POISON},\n        .catchRate = 45,\n        .expYield = 160,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 3,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SILVER_POWDER,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SHIELD_DUST, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LOTAD] =\n    {\n        .baseHP = 40,\n        .baseAttack = 30,\n        .baseDefense = 30,\n        .baseSpeed = 30,\n        .baseSpAttack = 40,\n        .baseSpDefense = 50,\n        .types = {TYPE_WATER, TYPE_GRASS},\n        .catchRate = 255,\n        .expYield = 74,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_RAIN_DISH},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LOMBRE] =\n    {\n        .baseHP = 60,\n        .baseAttack = 50,\n        .baseDefense = 50,\n        .baseSpeed = 50,\n        .baseSpAttack = 60,\n        .baseSpDefense = 70,\n        .types = {TYPE_WATER, TYPE_GRASS},\n        .catchRate = 120,\n        .expYield = 141,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_RAIN_DISH},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LUDICOLO] =\n    {\n        .baseHP = 80,\n        .baseAttack = 70,\n        .baseDefense = 70,\n        .baseSpeed = 70,\n        .baseSpAttack = 90,\n        .baseSpDefense = 100,\n        .types = {TYPE_WATER, TYPE_GRASS},\n        .catchRate = 45,\n        .expYield = 181,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 3,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_RAIN_DISH},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SEEDOT] =\n    {\n        .baseHP = 40,\n        .baseAttack = 40,\n        .baseDefense = 50,\n        .baseSpeed = 30,\n        .baseSpAttack = 30,\n        .baseSpDefense = 30,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 255,\n        .expYield = 74,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_EARLY_BIRD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NUZLEAF] =\n    {\n        .baseHP = 70,\n        .baseAttack = 70,\n        .baseDefense = 40,\n        .baseSpeed = 60,\n        .baseSpAttack = 60,\n        .baseSpDefense = 40,\n        .types = {TYPE_GRASS, TYPE_DARK},\n        .catchRate = 120,\n        .expYield = 141,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_EARLY_BIRD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SHIFTRY] =\n    {\n        .baseHP = 90,\n        .baseAttack = 100,\n        .baseDefense = 60,\n        .baseSpeed = 80,\n        .baseSpAttack = 90,\n        .baseSpDefense = 60,\n        .types = {TYPE_GRASS, TYPE_DARK},\n        .catchRate = 45,\n        .expYield = 181,\n        .evYield_HP = 0,\n        .evYield_Attack = 3,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_EARLY_BIRD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NINCADA] =\n    {\n        .baseHP = 31,\n        .baseAttack = 45,\n        .baseDefense = 90,\n        .baseSpeed = 40,\n        .baseSpAttack = 30,\n        .baseSpDefense = 30,\n        .types = {TYPE_BUG, TYPE_GROUND},\n        .catchRate = 255,\n        .expYield = 65,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_COMPOUND_EYES, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NINJASK] =\n    {\n        .baseHP = 61,\n        .baseAttack = 90,\n        .baseDefense = 45,\n        .baseSpeed = 160,\n        .baseSpAttack = 50,\n        .baseSpDefense = 50,\n        .types = {TYPE_BUG, TYPE_FLYING},\n        .catchRate = 120,\n        .expYield = 155,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SPEED_BOOST, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SHEDINJA] =\n    {\n        .baseHP = 1,\n        .baseAttack = 90,\n        .baseDefense = 45,\n        .baseSpeed = 40,\n        .baseSpAttack = 30,\n        .baseSpDefense = 30,\n        .types = {TYPE_BUG, TYPE_GHOST},\n        .catchRate = 45,\n        .expYield = 95,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_WONDER_GUARD, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TAILLOW] =\n    {\n        .baseHP = 40,\n        .baseAttack = 55,\n        .baseDefense = 30,\n        .baseSpeed = 85,\n        .baseSpAttack = 30,\n        .baseSpDefense = 30,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 200,\n        .expYield = 59,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_GUTS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SWELLOW] =\n    {\n        .baseHP = 60,\n        .baseAttack = 85,\n        .baseDefense = 60,\n        .baseSpeed = 125,\n        .baseSpAttack = 50,\n        .baseSpDefense = 50,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 162,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_GUTS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SHROOMISH] =\n    {\n        .baseHP = 60,\n        .baseAttack = 40,\n        .baseDefense = 60,\n        .baseSpeed = 35,\n        .baseSpAttack = 40,\n        .baseSpDefense = 60,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 255,\n        .expYield = 65,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_FLUCTUATING,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_EFFECT_SPORE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BRELOOM] =\n    {\n        .baseHP = 60,\n        .baseAttack = 130,\n        .baseDefense = 80,\n        .baseSpeed = 70,\n        .baseSpAttack = 60,\n        .baseSpDefense = 60,\n        .types = {TYPE_GRASS, TYPE_FIGHTING},\n        .catchRate = 90,\n        .expYield = 165,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_FLUCTUATING,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_EFFECT_SPORE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SPINDA] =\n    {\n        .baseHP = 60,\n        .baseAttack = 60,\n        .baseDefense = 60,\n        .baseSpeed = 60,\n        .baseSpAttack = 60,\n        .baseSpDefense = 60,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 255,\n        .expYield = 85,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_CHESTO_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_OWN_TEMPO, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = TRUE,\n    },\n    [SPECIES_WINGULL] =\n    {\n        .baseHP = 40,\n        .baseAttack = 30,\n        .baseDefense = 30,\n        .baseSpeed = 85,\n        .baseSpAttack = 55,\n        .baseSpDefense = 30,\n        .types = {TYPE_WATER, TYPE_FLYING},\n        .catchRate = 190,\n        .expYield = 64,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PELIPPER] =\n    {\n        .baseHP = 60,\n        .baseAttack = 50,\n        .baseDefense = 100,\n        .baseSpeed = 65,\n        .baseSpAttack = 85,\n        .baseSpDefense = 70,\n        .types = {TYPE_WATER, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 164,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FLYING},\n        .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SURSKIT] =\n    {\n        .baseHP = 40,\n        .baseAttack = 30,\n        .baseDefense = 32,\n        .baseSpeed = 65,\n        .baseSpAttack = 50,\n        .baseSpDefense = 52,\n        .types = {TYPE_BUG, TYPE_WATER},\n        .catchRate = 200,\n        .expYield = 63,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_BUG},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MASQUERAIN] =\n    {\n        .baseHP = 70,\n        .baseAttack = 60,\n        .baseDefense = 62,\n        .baseSpeed = 60,\n        .baseSpAttack = 80,\n        .baseSpDefense = 82,\n        .types = {TYPE_BUG, TYPE_FLYING},\n        .catchRate = 75,\n        .expYield = 128,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SILVER_POWDER,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_BUG},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WAILMER] =\n    {\n        .baseHP = 130,\n        .baseAttack = 70,\n        .baseDefense = 35,\n        .baseSpeed = 60,\n        .baseSpAttack = 70,\n        .baseSpDefense = 35,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 125,\n        .expYield = 137,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 40,\n        .friendship = 70,\n        .growthRate = GROWTH_FLUCTUATING,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_WATER_VEIL, ABILITY_OBLIVIOUS},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WAILORD] =\n    {\n        .baseHP = 170,\n        .baseAttack = 90,\n        .baseDefense = 45,\n        .baseSpeed = 60,\n        .baseSpAttack = 90,\n        .baseSpDefense = 45,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 60,\n        .expYield = 206,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 40,\n        .friendship = 70,\n        .growthRate = GROWTH_FLUCTUATING,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_WATER_VEIL, ABILITY_OBLIVIOUS},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SKITTY] =\n    {\n        .baseHP = 50,\n        .baseAttack = 45,\n        .baseDefense = 45,\n        .baseSpeed = 50,\n        .baseSpAttack = 35,\n        .baseSpDefense = 35,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 255,\n        .expYield = 65,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_LEPPA_BERRY,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DELCATTY] =\n    {\n        .baseHP = 70,\n        .baseAttack = 65,\n        .baseDefense = 65,\n        .baseSpeed = 70,\n        .baseSpAttack = 55,\n        .baseSpDefense = 55,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 60,\n        .expYield = 138,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_LEPPA_BERRY,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_KECLEON] =\n    {\n        .baseHP = 60,\n        .baseAttack = 90,\n        .baseDefense = 70,\n        .baseSpeed = 40,\n        .baseSpAttack = 60,\n        .baseSpDefense = 120,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 200,\n        .expYield = 132,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_PERSIM_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_COLOR_CHANGE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BALTOY] =\n    {\n        .baseHP = 40,\n        .baseAttack = 40,\n        .baseDefense = 55,\n        .baseSpeed = 55,\n        .baseSpAttack = 40,\n        .baseSpDefense = 70,\n        .types = {TYPE_GROUND, TYPE_PSYCHIC},\n        .catchRate = 255,\n        .expYield = 58,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CLAYDOL] =\n    {\n        .baseHP = 60,\n        .baseAttack = 70,\n        .baseDefense = 105,\n        .baseSpeed = 75,\n        .baseSpAttack = 70,\n        .baseSpDefense = 120,\n        .types = {TYPE_GROUND, TYPE_PSYCHIC},\n        .catchRate = 90,\n        .expYield = 189,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NOSEPASS] =\n    {\n        .baseHP = 30,\n        .baseAttack = 45,\n        .baseDefense = 135,\n        .baseSpeed = 30,\n        .baseSpAttack = 45,\n        .baseSpDefense = 90,\n        .types = {TYPE_ROCK, TYPE_ROCK},\n        .catchRate = 255,\n        .expYield = 108,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_STURDY, ABILITY_MAGNET_PULL},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TORKOAL] =\n    {\n        .baseHP = 70,\n        .baseAttack = 85,\n        .baseDefense = 140,\n        .baseSpeed = 20,\n        .baseSpAttack = 85,\n        .baseSpDefense = 70,\n        .types = {TYPE_FIRE, TYPE_FIRE},\n        .catchRate = 90,\n        .expYield = 161,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_WHITE_SMOKE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SABLEYE] =\n    {\n        .baseHP = 50,\n        .baseAttack = 75,\n        .baseDefense = 75,\n        .baseSpeed = 50,\n        .baseSpAttack = 65,\n        .baseSpDefense = 65,\n        .types = {TYPE_DARK, TYPE_GHOST},\n        .catchRate = 45,\n        .expYield = 98,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 35,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_KEEN_EYE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BARBOACH] =\n    {\n        .baseHP = 50,\n        .baseAttack = 48,\n        .baseDefense = 43,\n        .baseSpeed = 60,\n        .baseSpAttack = 46,\n        .baseSpDefense = 41,\n        .types = {TYPE_WATER, TYPE_GROUND},\n        .catchRate = 190,\n        .expYield = 92,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WHISCASH] =\n    {\n        .baseHP = 110,\n        .baseAttack = 78,\n        .baseDefense = 73,\n        .baseSpeed = 60,\n        .baseSpAttack = 76,\n        .baseSpDefense = 71,\n        .types = {TYPE_WATER, TYPE_GROUND},\n        .catchRate = 75,\n        .expYield = 158,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LUVDISC] =\n    {\n        .baseHP = 43,\n        .baseAttack = 30,\n        .baseDefense = 55,\n        .baseSpeed = 97,\n        .baseSpAttack = 40,\n        .baseSpDefense = 65,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 225,\n        .expYield = 110,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_HEART_SCALE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CORPHISH] =\n    {\n        .baseHP = 43,\n        .baseAttack = 80,\n        .baseDefense = 65,\n        .baseSpeed = 35,\n        .baseSpAttack = 50,\n        .baseSpDefense = 35,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 205,\n        .expYield = 111,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_FLUCTUATING,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CRAWDAUNT] =\n    {\n        .baseHP = 63,\n        .baseAttack = 120,\n        .baseDefense = 85,\n        .baseSpeed = 55,\n        .baseSpAttack = 90,\n        .baseSpDefense = 55,\n        .types = {TYPE_WATER, TYPE_DARK},\n        .catchRate = 155,\n        .expYield = 161,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_FLUCTUATING,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_FEEBAS] =\n    {\n        .baseHP = 20,\n        .baseAttack = 15,\n        .baseDefense = 20,\n        .baseSpeed = 80,\n        .baseSpAttack = 10,\n        .baseSpDefense = 55,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 255,\n        .expYield = 61,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MILOTIC] =\n    {\n        .baseHP = 95,\n        .baseAttack = 60,\n        .baseDefense = 79,\n        .baseSpeed = 81,\n        .baseSpAttack = 100,\n        .baseSpDefense = 125,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 60,\n        .expYield = 213,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_MARVEL_SCALE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CARVANHA] =\n    {\n        .baseHP = 45,\n        .baseAttack = 90,\n        .baseDefense = 20,\n        .baseSpeed = 65,\n        .baseSpAttack = 65,\n        .baseSpDefense = 20,\n        .types = {TYPE_WATER, TYPE_DARK},\n        .catchRate = 225,\n        .expYield = 88,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_ROUGH_SKIN, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SHARPEDO] =\n    {\n        .baseHP = 70,\n        .baseAttack = 120,\n        .baseDefense = 40,\n        .baseSpeed = 95,\n        .baseSpAttack = 95,\n        .baseSpDefense = 40,\n        .types = {TYPE_WATER, TYPE_DARK},\n        .catchRate = 60,\n        .expYield = 175,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_2, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_ROUGH_SKIN, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TRAPINCH] =\n    {\n        .baseHP = 45,\n        .baseAttack = 100,\n        .baseDefense = 45,\n        .baseSpeed = 10,\n        .baseSpAttack = 45,\n        .baseSpDefense = 45,\n        .types = {TYPE_GROUND, TYPE_GROUND},\n        .catchRate = 255,\n        .expYield = 73,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SOFT_SAND,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_HYPER_CUTTER, ABILITY_ARENA_TRAP},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_VIBRAVA] =\n    {\n        .baseHP = 50,\n        .baseAttack = 70,\n        .baseDefense = 50,\n        .baseSpeed = 70,\n        .baseSpAttack = 50,\n        .baseSpDefense = 50,\n        .types = {TYPE_GROUND, TYPE_DRAGON},\n        .catchRate = 120,\n        .expYield = 126,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_LEVITATE, ABILITY_LEVITATE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_FLYGON] =\n    {\n        .baseHP = 80,\n        .baseAttack = 100,\n        .baseDefense = 80,\n        .baseSpeed = 100,\n        .baseSpAttack = 80,\n        .baseSpDefense = 80,\n        .types = {TYPE_GROUND, TYPE_DRAGON},\n        .catchRate = 45,\n        .expYield = 197,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_BUG},\n        .abilities = {ABILITY_LEVITATE, ABILITY_LEVITATE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MAKUHITA] =\n    {\n        .baseHP = 72,\n        .baseAttack = 60,\n        .baseDefense = 30,\n        .baseSpeed = 25,\n        .baseSpAttack = 20,\n        .baseSpDefense = 30,\n        .types = {TYPE_FIGHTING, TYPE_FIGHTING},\n        .catchRate = 180,\n        .expYield = 87,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FLUCTUATING,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_GUTS},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HARIYAMA] =\n    {\n        .baseHP = 144,\n        .baseAttack = 120,\n        .baseDefense = 60,\n        .baseSpeed = 50,\n        .baseSpAttack = 40,\n        .baseSpDefense = 60,\n        .types = {TYPE_FIGHTING, TYPE_FIGHTING},\n        .catchRate = 200,\n        .expYield = 184,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_KINGS_ROCK,\n        .genderRatio = PERCENT_FEMALE(25),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FLUCTUATING,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_GUTS},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ELECTRIKE] =\n    {\n        .baseHP = 40,\n        .baseAttack = 45,\n        .baseDefense = 40,\n        .baseSpeed = 65,\n        .baseSpAttack = 65,\n        .baseSpDefense = 40,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 120,\n        .expYield = 104,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_STATIC, ABILITY_LIGHTNING_ROD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MANECTRIC] =\n    {\n        .baseHP = 70,\n        .baseAttack = 75,\n        .baseDefense = 60,\n        .baseSpeed = 105,\n        .baseSpAttack = 105,\n        .baseSpDefense = 60,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 45,\n        .expYield = 168,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_STATIC, ABILITY_LIGHTNING_ROD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_NUMEL] =\n    {\n        .baseHP = 60,\n        .baseAttack = 60,\n        .baseDefense = 40,\n        .baseSpeed = 35,\n        .baseSpAttack = 65,\n        .baseSpDefense = 45,\n        .types = {TYPE_FIRE, TYPE_GROUND},\n        .catchRate = 255,\n        .expYield = 88,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_RAWST_BERRY,\n        .itemRare = ITEM_RAWST_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CAMERUPT] =\n    {\n        .baseHP = 70,\n        .baseAttack = 100,\n        .baseDefense = 70,\n        .baseSpeed = 40,\n        .baseSpAttack = 105,\n        .baseSpDefense = 75,\n        .types = {TYPE_FIRE, TYPE_GROUND},\n        .catchRate = 150,\n        .expYield = 175,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_RAWST_BERRY,\n        .itemRare = ITEM_RAWST_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_MAGMA_ARMOR, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SPHEAL] =\n    {\n        .baseHP = 70,\n        .baseAttack = 40,\n        .baseDefense = 50,\n        .baseSpeed = 25,\n        .baseSpAttack = 55,\n        .baseSpDefense = 50,\n        .types = {TYPE_ICE, TYPE_WATER},\n        .catchRate = 255,\n        .expYield = 75,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SEALEO] =\n    {\n        .baseHP = 90,\n        .baseAttack = 60,\n        .baseDefense = 70,\n        .baseSpeed = 45,\n        .baseSpAttack = 75,\n        .baseSpDefense = 70,\n        .types = {TYPE_ICE, TYPE_WATER},\n        .catchRate = 120,\n        .expYield = 128,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WALREIN] =\n    {\n        .baseHP = 110,\n        .baseAttack = 80,\n        .baseDefense = 90,\n        .baseSpeed = 65,\n        .baseSpAttack = 95,\n        .baseSpDefense = 90,\n        .types = {TYPE_ICE, TYPE_WATER},\n        .catchRate = 45,\n        .expYield = 192,\n        .evYield_HP = 3,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CACNEA] =\n    {\n        .baseHP = 50,\n        .baseAttack = 85,\n        .baseDefense = 40,\n        .baseSpeed = 35,\n        .baseSpAttack = 85,\n        .baseSpDefense = 40,\n        .types = {TYPE_GRASS, TYPE_GRASS},\n        .catchRate = 190,\n        .expYield = 97,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_POISON_BARB,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 35,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_SAND_VEIL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CACTURNE] =\n    {\n        .baseHP = 70,\n        .baseAttack = 115,\n        .baseDefense = 60,\n        .baseSpeed = 55,\n        .baseSpAttack = 115,\n        .baseSpDefense = 60,\n        .types = {TYPE_GRASS, TYPE_DARK},\n        .catchRate = 60,\n        .expYield = 177,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_POISON_BARB,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 35,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_GRASS, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_SAND_VEIL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SNORUNT] =\n    {\n        .baseHP = 50,\n        .baseAttack = 50,\n        .baseDefense = 50,\n        .baseSpeed = 50,\n        .baseSpAttack = 50,\n        .baseSpDefense = 50,\n        .types = {TYPE_ICE, TYPE_ICE},\n        .catchRate = 190,\n        .expYield = 74,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GLALIE] =\n    {\n        .baseHP = 80,\n        .baseAttack = 80,\n        .baseDefense = 80,\n        .baseSpeed = 80,\n        .baseSpAttack = 80,\n        .baseSpDefense = 80,\n        .types = {TYPE_ICE, TYPE_ICE},\n        .catchRate = 75,\n        .expYield = 187,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NEVER_MELT_ICE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_INNER_FOCUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LUNATONE] =\n    {\n        .baseHP = 70,\n        .baseAttack = 55,\n        .baseDefense = 65,\n        .baseSpeed = 70,\n        .baseSpAttack = 95,\n        .baseSpDefense = 85,\n        .types = {TYPE_ROCK, TYPE_PSYCHIC},\n        .catchRate = 45,\n        .expYield = 150,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_MOON_STONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SOLROCK] =\n    {\n        .baseHP = 70,\n        .baseAttack = 95,\n        .baseDefense = 85,\n        .baseSpeed = 70,\n        .baseSpAttack = 55,\n        .baseSpDefense = 65,\n        .types = {TYPE_ROCK, TYPE_PSYCHIC},\n        .catchRate = 45,\n        .expYield = 150,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SUN_STONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_AZURILL] =\n    {\n        .baseHP = 50,\n        .baseAttack = 20,\n        .baseDefense = 40,\n        .baseSpeed = 20,\n        .baseSpAttack = 20,\n        .baseSpDefense = 40,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 150,\n        .expYield = 33,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(75),\n        .eggCycles = 10,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_HUGE_POWER},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SPOINK] =\n    {\n        .baseHP = 60,\n        .baseAttack = 25,\n        .baseDefense = 35,\n        .baseSpeed = 60,\n        .baseSpAttack = 70,\n        .baseSpDefense = 80,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 255,\n        .expYield = 89,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_OWN_TEMPO},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GRUMPIG] =\n    {\n        .baseHP = 80,\n        .baseAttack = 45,\n        .baseDefense = 65,\n        .baseSpeed = 80,\n        .baseSpAttack = 90,\n        .baseSpDefense = 110,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 60,\n        .expYield = 164,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_THICK_FAT, ABILITY_OWN_TEMPO},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_PLUSLE] =\n    {\n        .baseHP = 60,\n        .baseAttack = 50,\n        .baseDefense = 40,\n        .baseSpeed = 95,\n        .baseSpAttack = 85,\n        .baseSpDefense = 75,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 200,\n        .expYield = 120,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_PLUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MINUN] =\n    {\n        .baseHP = 60,\n        .baseAttack = 40,\n        .baseDefense = 50,\n        .baseSpeed = 95,\n        .baseSpAttack = 75,\n        .baseSpDefense = 85,\n        .types = {TYPE_ELECTRIC, TYPE_ELECTRIC},\n        .catchRate = 200,\n        .expYield = 120,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_MINUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MAWILE] =\n    {\n        .baseHP = 50,\n        .baseAttack = 85,\n        .baseDefense = 85,\n        .baseSpeed = 50,\n        .baseSpAttack = 55,\n        .baseSpDefense = 55,\n        .types = {TYPE_STEEL, TYPE_STEEL},\n        .catchRate = 45,\n        .expYield = 98,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FAIRY},\n        .abilities = {ABILITY_HYPER_CUTTER, ABILITY_INTIMIDATE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MEDITITE] =\n    {\n        .baseHP = 30,\n        .baseAttack = 40,\n        .baseDefense = 55,\n        .baseSpeed = 60,\n        .baseSpAttack = 40,\n        .baseSpDefense = 55,\n        .types = {TYPE_FIGHTING, TYPE_PSYCHIC},\n        .catchRate = 180,\n        .expYield = 91,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_PURE_POWER, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_MEDICHAM] =\n    {\n        .baseHP = 60,\n        .baseAttack = 60,\n        .baseDefense = 75,\n        .baseSpeed = 80,\n        .baseSpAttack = 60,\n        .baseSpDefense = 75,\n        .types = {TYPE_FIGHTING, TYPE_PSYCHIC},\n        .catchRate = 90,\n        .expYield = 153,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_HUMAN_LIKE, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_PURE_POWER, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SWABLU] =\n    {\n        .baseHP = 45,\n        .baseAttack = 40,\n        .baseDefense = 60,\n        .baseSpeed = 50,\n        .baseSpAttack = 40,\n        .baseSpDefense = 75,\n        .types = {TYPE_NORMAL, TYPE_FLYING},\n        .catchRate = 255,\n        .expYield = 74,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_NATURAL_CURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ALTARIA] =\n    {\n        .baseHP = 75,\n        .baseAttack = 70,\n        .baseDefense = 90,\n        .baseSpeed = 80,\n        .baseSpAttack = 70,\n        .baseSpDefense = 105,\n        .types = {TYPE_DRAGON, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 188,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_FLYING, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_NATURAL_CURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WYNAUT] =\n    {\n        .baseHP = 95,\n        .baseAttack = 23,\n        .baseDefense = 48,\n        .baseSpeed = 23,\n        .baseSpAttack = 23,\n        .baseSpDefense = 48,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 125,\n        .expYield = 44,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_SHADOW_TAG, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DUSKULL] =\n    {\n        .baseHP = 20,\n        .baseAttack = 40,\n        .baseDefense = 90,\n        .baseSpeed = 25,\n        .baseSpAttack = 30,\n        .baseSpDefense = 90,\n        .types = {TYPE_GHOST, TYPE_GHOST},\n        .catchRate = 190,\n        .expYield = 97,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SPELL_TAG,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 35,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DUSCLOPS] =\n    {\n        .baseHP = 40,\n        .baseAttack = 70,\n        .baseDefense = 130,\n        .baseSpeed = 25,\n        .baseSpAttack = 60,\n        .baseSpDefense = 130,\n        .types = {TYPE_GHOST, TYPE_GHOST},\n        .catchRate = 90,\n        .expYield = 179,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SPELL_TAG,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 35,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_PRESSURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ROSELIA] =\n    {\n        .baseHP = 50,\n        .baseAttack = 60,\n        .baseDefense = 45,\n        .baseSpeed = 65,\n        .baseSpAttack = 100,\n        .baseSpDefense = 80,\n        .types = {TYPE_GRASS, TYPE_POISON},\n        .catchRate = 150,\n        .expYield = 152,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_POISON_BARB,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_NATURAL_CURE, ABILITY_POISON_POINT},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = TRUE,\n    },\n    [SPECIES_SLAKOTH] =\n    {\n        .baseHP = 60,\n        .baseAttack = 60,\n        .baseDefense = 60,\n        .baseSpeed = 30,\n        .baseSpAttack = 35,\n        .baseSpDefense = 35,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 255,\n        .expYield = 83,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_TRUANT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_VIGOROTH] =\n    {\n        .baseHP = 80,\n        .baseAttack = 80,\n        .baseDefense = 80,\n        .baseSpeed = 90,\n        .baseSpAttack = 55,\n        .baseSpDefense = 55,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 120,\n        .expYield = 126,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 2,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_VITAL_SPIRIT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SLAKING] =\n    {\n        .baseHP = 150,\n        .baseAttack = 160,\n        .baseDefense = 100,\n        .baseSpeed = 100,\n        .baseSpAttack = 95,\n        .baseSpDefense = 65,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 210,\n        .evYield_HP = 3,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_TRUANT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GULPIN] =\n    {\n        .baseHP = 70,\n        .baseAttack = 43,\n        .baseDefense = 53,\n        .baseSpeed = 40,\n        .baseSpAttack = 43,\n        .baseSpDefense = 53,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 225,\n        .expYield = 75,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_BIG_PEARL,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FLUCTUATING,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_LIQUID_OOZE, ABILITY_STICKY_HOLD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SWALOT] =\n    {\n        .baseHP = 100,\n        .baseAttack = 73,\n        .baseDefense = 83,\n        .baseSpeed = 55,\n        .baseSpAttack = 73,\n        .baseSpDefense = 83,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 75,\n        .expYield = 168,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_BIG_PEARL,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FLUCTUATING,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_LIQUID_OOZE, ABILITY_STICKY_HOLD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_TROPIUS] =\n    {\n        .baseHP = 99,\n        .baseAttack = 68,\n        .baseDefense = 83,\n        .baseSpeed = 51,\n        .baseSpAttack = 72,\n        .baseSpDefense = 87,\n        .types = {TYPE_GRASS, TYPE_FLYING},\n        .catchRate = 200,\n        .expYield = 169,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_GRASS},\n        .abilities = {ABILITY_CHLOROPHYLL, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_WHISMUR] =\n    {\n        .baseHP = 64,\n        .baseAttack = 51,\n        .baseDefense = 23,\n        .baseSpeed = 28,\n        .baseSpAttack = 51,\n        .baseSpDefense = 23,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 190,\n        .expYield = 68,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_CHESTO_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_SOUNDPROOF, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LOUDRED] =\n    {\n        .baseHP = 84,\n        .baseAttack = 71,\n        .baseDefense = 43,\n        .baseSpeed = 48,\n        .baseSpAttack = 71,\n        .baseSpDefense = 43,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 120,\n        .expYield = 126,\n        .evYield_HP = 2,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_CHESTO_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_SOUNDPROOF, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_EXPLOUD] =\n    {\n        .baseHP = 104,\n        .baseAttack = 91,\n        .baseDefense = 63,\n        .baseSpeed = 68,\n        .baseSpAttack = 91,\n        .baseSpDefense = 63,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 184,\n        .evYield_HP = 3,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_CHESTO_BERRY,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_SOUNDPROOF, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CLAMPERL] =\n    {\n        .baseHP = 35,\n        .baseAttack = 64,\n        .baseDefense = 85,\n        .baseSpeed = 32,\n        .baseSpAttack = 74,\n        .baseSpDefense = 55,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 255,\n        .expYield = 142,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_BLUE_SHARD,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_SHELL_ARMOR, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_HUNTAIL] =\n    {\n        .baseHP = 55,\n        .baseAttack = 104,\n        .baseDefense = 105,\n        .baseSpeed = 52,\n        .baseSpAttack = 94,\n        .baseSpDefense = 75,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 60,\n        .expYield = 178,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GOREBYSS] =\n    {\n        .baseHP = 55,\n        .baseAttack = 84,\n        .baseDefense = 105,\n        .baseSpeed = 52,\n        .baseSpAttack = 114,\n        .baseSpDefense = 75,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 60,\n        .expYield = 178,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_1},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PINK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ABSOL] =\n    {\n        .baseHP = 65,\n        .baseAttack = 130,\n        .baseDefense = 60,\n        .baseSpeed = 75,\n        .baseSpAttack = 75,\n        .baseSpDefense = 60,\n        .types = {TYPE_DARK, TYPE_DARK},\n        .catchRate = 30,\n        .expYield = 174,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 35,\n        .growthRate = GROWTH_MEDIUM_SLOW,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_PRESSURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = TRUE,\n    },\n    [SPECIES_SHUPPET] =\n    {\n        .baseHP = 44,\n        .baseAttack = 75,\n        .baseDefense = 35,\n        .baseSpeed = 45,\n        .baseSpAttack = 63,\n        .baseSpDefense = 33,\n        .types = {TYPE_GHOST, TYPE_GHOST},\n        .catchRate = 225,\n        .expYield = 97,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SPELL_TAG,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 35,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_INSOMNIA, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BANETTE] =\n    {\n        .baseHP = 64,\n        .baseAttack = 115,\n        .baseDefense = 65,\n        .baseSpeed = 65,\n        .baseSpAttack = 83,\n        .baseSpDefense = 63,\n        .types = {TYPE_GHOST, TYPE_GHOST},\n        .catchRate = 45,\n        .expYield = 179,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_SPELL_TAG,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 35,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_INSOMNIA, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SEVIPER] =\n    {\n        .baseHP = 73,\n        .baseAttack = 100,\n        .baseDefense = 60,\n        .baseSpeed = 65,\n        .baseSpAttack = 100,\n        .baseSpDefense = 60,\n        .types = {TYPE_POISON, TYPE_POISON},\n        .catchRate = 90,\n        .expYield = 165,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_FLUCTUATING,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_SHED_SKIN, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLACK,\n        .noFlip = TRUE,\n    },\n    [SPECIES_ZANGOOSE] =\n    {\n        .baseHP = 73,\n        .baseAttack = 115,\n        .baseDefense = 60,\n        .baseSpeed = 90,\n        .baseSpAttack = 60,\n        .baseSpDefense = 60,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 90,\n        .expYield = 165,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_FIELD, EGG_GROUP_FIELD},\n        .abilities = {ABILITY_IMMUNITY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = TRUE,\n    },\n    [SPECIES_RELICANTH] =\n    {\n        .baseHP = 100,\n        .baseAttack = 90,\n        .baseDefense = 130,\n        .baseSpeed = 55,\n        .baseSpAttack = 45,\n        .baseSpDefense = 65,\n        .types = {TYPE_WATER, TYPE_ROCK},\n        .catchRate = 25,\n        .expYield = 198,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_GREEN_SHARD,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 40,\n        .friendship = 70,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_WATER_1, EGG_GROUP_WATER_2},\n        .abilities = {ABILITY_SWIFT_SWIM, ABILITY_ROCK_HEAD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ARON] =\n    {\n        .baseHP = 50,\n        .baseAttack = 70,\n        .baseDefense = 100,\n        .baseSpeed = 30,\n        .baseSpAttack = 40,\n        .baseSpDefense = 40,\n        .types = {TYPE_STEEL, TYPE_ROCK},\n        .catchRate = 180,\n        .expYield = 96,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_HARD_STONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 35,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER},\n        .abilities = {ABILITY_STURDY, ABILITY_ROCK_HEAD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LAIRON] =\n    {\n        .baseHP = 60,\n        .baseAttack = 90,\n        .baseDefense = 140,\n        .baseSpeed = 40,\n        .baseSpAttack = 50,\n        .baseSpDefense = 50,\n        .types = {TYPE_STEEL, TYPE_ROCK},\n        .catchRate = 90,\n        .expYield = 152,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_HARD_STONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 35,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER},\n        .abilities = {ABILITY_STURDY, ABILITY_ROCK_HEAD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_AGGRON] =\n    {\n        .baseHP = 70,\n        .baseAttack = 110,\n        .baseDefense = 180,\n        .baseSpeed = 50,\n        .baseSpAttack = 60,\n        .baseSpDefense = 60,\n        .types = {TYPE_STEEL, TYPE_ROCK},\n        .catchRate = 45,\n        .expYield = 205,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 3,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_HARD_STONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 35,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MONSTER, EGG_GROUP_MONSTER},\n        .abilities = {ABILITY_STURDY, ABILITY_ROCK_HEAD},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CASTFORM] =\n    {\n        .baseHP = 70,\n        .baseAttack = 70,\n        .baseDefense = 70,\n        .baseSpeed = 70,\n        .baseSpAttack = 70,\n        .baseSpDefense = 70,\n        .types = {TYPE_NORMAL, TYPE_NORMAL},\n        .catchRate = 45,\n        .expYield = 145,\n        .evYield_HP = 1,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_MYSTIC_WATER,\n        .itemRare = ITEM_MYSTIC_WATER,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_MEDIUM_FAST,\n        .eggGroups = {EGG_GROUP_FAIRY, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_FORECAST, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_VOLBEAT] =\n    {\n        .baseHP = 65,\n        .baseAttack = 73,\n        .baseDefense = 55,\n        .baseSpeed = 85,\n        .baseSpAttack = 47,\n        .baseSpDefense = 75,\n        .types = {TYPE_BUG, TYPE_BUG},\n        .catchRate = 150,\n        .expYield = 146,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_MALE,\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_ILLUMINATE, ABILITY_SWARM},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ILLUMISE] =\n    {\n        .baseHP = 65,\n        .baseAttack = 47,\n        .baseDefense = 55,\n        .baseSpeed = 85,\n        .baseSpAttack = 73,\n        .baseSpDefense = 75,\n        .types = {TYPE_BUG, TYPE_BUG},\n        .catchRate = 150,\n        .expYield = 146,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_FEMALE,\n        .eggCycles = 15,\n        .friendship = 70,\n        .growthRate = GROWTH_FLUCTUATING,\n        .eggGroups = {EGG_GROUP_BUG, EGG_GROUP_HUMAN_LIKE},\n        .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LILEEP] =\n    {\n        .baseHP = 66,\n        .baseAttack = 41,\n        .baseDefense = 77,\n        .baseSpeed = 23,\n        .baseSpAttack = 61,\n        .baseSpDefense = 87,\n        .types = {TYPE_ROCK, TYPE_GRASS},\n        .catchRate = 45,\n        .expYield = 121,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 30,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_SUCTION_CUPS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_PURPLE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_CRADILY] =\n    {\n        .baseHP = 86,\n        .baseAttack = 81,\n        .baseDefense = 97,\n        .baseSpeed = 43,\n        .baseSpAttack = 81,\n        .baseSpDefense = 107,\n        .types = {TYPE_ROCK, TYPE_GRASS},\n        .catchRate = 45,\n        .expYield = 201,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 2,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 30,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_SUCTION_CUPS, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ANORITH] =\n    {\n        .baseHP = 45,\n        .baseAttack = 95,\n        .baseDefense = 50,\n        .baseSpeed = 75,\n        .baseSpAttack = 40,\n        .baseSpDefense = 50,\n        .types = {TYPE_ROCK, TYPE_BUG},\n        .catchRate = 45,\n        .expYield = 119,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 30,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_BATTLE_ARMOR, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_ARMALDO] =\n    {\n        .baseHP = 75,\n        .baseAttack = 125,\n        .baseDefense = 100,\n        .baseSpeed = 45,\n        .baseSpAttack = 70,\n        .baseSpDefense = 80,\n        .types = {TYPE_ROCK, TYPE_BUG},\n        .catchRate = 45,\n        .expYield = 200,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(12.5),\n        .eggCycles = 30,\n        .friendship = 70,\n        .growthRate = GROWTH_ERRATIC,\n        .eggGroups = {EGG_GROUP_WATER_3, EGG_GROUP_WATER_3},\n        .abilities = {ABILITY_BATTLE_ARMOR, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_RALTS] =\n    {\n        .baseHP = 28,\n        .baseAttack = 25,\n        .baseDefense = 25,\n        .baseSpeed = 40,\n        .baseSpAttack = 45,\n        .baseSpDefense = 35,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 235,\n        .expYield = 70,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_SYNCHRONIZE, ABILITY_TRACE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_KIRLIA] =\n    {\n        .baseHP = 38,\n        .baseAttack = 35,\n        .baseDefense = 35,\n        .baseSpeed = 50,\n        .baseSpAttack = 65,\n        .baseSpDefense = 55,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 120,\n        .expYield = 140,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 2,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_SYNCHRONIZE, ABILITY_TRACE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GARDEVOIR] =\n    {\n        .baseHP = 68,\n        .baseAttack = 65,\n        .baseDefense = 65,\n        .baseSpeed = 80,\n        .baseSpAttack = 125,\n        .baseSpDefense = 115,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 45,\n        .expYield = 208,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 20,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_SYNCHRONIZE, ABILITY_TRACE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BAGON] =\n    {\n        .baseHP = 45,\n        .baseAttack = 75,\n        .baseDefense = 60,\n        .baseSpeed = 50,\n        .baseSpAttack = 40,\n        .baseSpDefense = 30,\n        .types = {TYPE_DRAGON, TYPE_DRAGON},\n        .catchRate = 45,\n        .expYield = 89,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_DRAGON_SCALE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 40,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_DRAGON, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_ROCK_HEAD, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SHELGON] =\n    {\n        .baseHP = 65,\n        .baseAttack = 95,\n        .baseDefense = 100,\n        .baseSpeed = 50,\n        .baseSpAttack = 60,\n        .baseSpDefense = 50,\n        .types = {TYPE_DRAGON, TYPE_DRAGON},\n        .catchRate = 45,\n        .expYield = 144,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_DRAGON_SCALE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 40,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_DRAGON, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_ROCK_HEAD, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_WHITE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_SALAMENCE] =\n    {\n        .baseHP = 95,\n        .baseAttack = 135,\n        .baseDefense = 80,\n        .baseSpeed = 100,\n        .baseSpAttack = 110,\n        .baseSpDefense = 80,\n        .types = {TYPE_DRAGON, TYPE_FLYING},\n        .catchRate = 45,\n        .expYield = 218,\n        .evYield_HP = 0,\n        .evYield_Attack = 3,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_DRAGON_SCALE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 40,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_DRAGON, EGG_GROUP_DRAGON},\n        .abilities = {ABILITY_INTIMIDATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_BELDUM] =\n    {\n        .baseHP = 40,\n        .baseAttack = 55,\n        .baseDefense = 80,\n        .baseSpeed = 30,\n        .baseSpAttack = 35,\n        .baseSpDefense = 60,\n        .types = {TYPE_STEEL, TYPE_PSYCHIC},\n        .catchRate = 3,\n        .expYield = 103,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 1,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_METAL_COAT,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 40,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_METANG] =\n    {\n        .baseHP = 60,\n        .baseAttack = 75,\n        .baseDefense = 100,\n        .baseSpeed = 50,\n        .baseSpAttack = 55,\n        .baseSpDefense = 80,\n        .types = {TYPE_STEEL, TYPE_PSYCHIC},\n        .catchRate = 3,\n        .expYield = 153,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_METAL_COAT,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 40,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_METAGROSS] =\n    {\n        .baseHP = 80,\n        .baseAttack = 135,\n        .baseDefense = 130,\n        .baseSpeed = 70,\n        .baseSpAttack = 95,\n        .baseSpDefense = 90,\n        .types = {TYPE_STEEL, TYPE_PSYCHIC},\n        .catchRate = 3,\n        .expYield = 210,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 3,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_METAL_COAT,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 40,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_MINERAL, EGG_GROUP_MINERAL},\n        .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_REGIROCK] =\n    {\n        .baseHP = 80,\n        .baseAttack = 100,\n        .baseDefense = 200,\n        .baseSpeed = 50,\n        .baseSpAttack = 50,\n        .baseSpDefense = 100,\n        .types = {TYPE_ROCK, TYPE_ROCK},\n        .catchRate = 3,\n        .expYield = 217,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 3,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 80,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BROWN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_REGICE] =\n    {\n        .baseHP = 80,\n        .baseAttack = 50,\n        .baseDefense = 100,\n        .baseSpeed = 50,\n        .baseSpAttack = 100,\n        .baseSpDefense = 200,\n        .types = {TYPE_ICE, TYPE_ICE},\n        .catchRate = 3,\n        .expYield = 216,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 3,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 80,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_REGISTEEL] =\n    {\n        .baseHP = 80,\n        .baseAttack = 75,\n        .baseDefense = 150,\n        .baseSpeed = 50,\n        .baseSpAttack = 75,\n        .baseSpDefense = 150,\n        .types = {TYPE_STEEL, TYPE_STEEL},\n        .catchRate = 3,\n        .expYield = 215,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 2,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 80,\n        .friendship = 35,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GRAY,\n        .noFlip = FALSE,\n    },\n    [SPECIES_KYOGRE] =\n    {\n        .baseHP = 100,\n        .baseAttack = 100,\n        .baseDefense = 90,\n        .baseSpeed = 90,\n        .baseSpAttack = 150,\n        .baseSpDefense = 140,\n        .types = {TYPE_WATER, TYPE_WATER},\n        .catchRate = 5,\n        .expYield = 218,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 120,\n        .friendship = 0,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_DRIZZLE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_GROUDON] =\n    {\n        .baseHP = 100,\n        .baseAttack = 150,\n        .baseDefense = 140,\n        .baseSpeed = 90,\n        .baseSpAttack = 100,\n        .baseSpDefense = 90,\n        .types = {TYPE_GROUND, TYPE_GROUND},\n        .catchRate = 5,\n        .expYield = 218,\n        .evYield_HP = 0,\n        .evYield_Attack = 3,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 120,\n        .friendship = 0,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_DROUGHT, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_RAYQUAZA] =\n    {\n        .baseHP = 105,\n        .baseAttack = 150,\n        .baseDefense = 90,\n        .baseSpeed = 95,\n        .baseSpAttack = 150,\n        .baseSpDefense = 90,\n        .types = {TYPE_DRAGON, TYPE_FLYING},\n        .catchRate = 3,\n        .expYield = 220,\n        .evYield_HP = 0,\n        .evYield_Attack = 2,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 120,\n        .friendship = 0,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_AIR_LOCK, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_GREEN,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LATIAS] =\n    {\n        .baseHP = 80,\n        .baseAttack = 80,\n        .baseDefense = 90,\n        .baseSpeed = 110,\n        .baseSpAttack = 110,\n        .baseSpDefense = 130,\n        .types = {TYPE_DRAGON, TYPE_PSYCHIC},\n        .catchRate = 3,\n        .expYield = 211,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 3,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_FEMALE,\n        .eggCycles = 120,\n        .friendship = 90,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = FALSE,\n    },\n    [SPECIES_LATIOS] =\n    {\n        .baseHP = 80,\n        .baseAttack = 90,\n        .baseDefense = 80,\n        .baseSpeed = 110,\n        .baseSpAttack = 130,\n        .baseSpDefense = 110,\n        .types = {TYPE_DRAGON, TYPE_PSYCHIC},\n        .catchRate = 3,\n        .expYield = 211,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 3,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_MALE,\n        .eggCycles = 120,\n        .friendship = 90,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n    [SPECIES_JIRACHI] =\n    {\n        .baseHP = 100,\n        .baseAttack = 100,\n        .baseDefense = 100,\n        .baseSpeed = 100,\n        .baseSpAttack = 100,\n        .baseSpDefense = 100,\n        .types = {TYPE_STEEL, TYPE_PSYCHIC},\n        .catchRate = 3,\n        .expYield = 215,\n        .evYield_HP = 3,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 0,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_STAR_PIECE,\n        .itemRare = ITEM_STAR_PIECE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 120,\n        .friendship = 100,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_SERENE_GRACE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_YELLOW,\n        .noFlip = FALSE,\n    },\n    [SPECIES_DEOXYS] =\n    {\n        .baseHP = 50,\n        .baseAttack = 150,\n        .baseDefense = 50,\n        .baseSpeed = 150,\n        .baseSpAttack = 150,\n        .baseSpDefense = 50,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 3,\n        .expYield = 215,\n        .evYield_HP = 0,\n        .evYield_Attack = 1,\n        .evYield_Defense = 0,\n        .evYield_Speed = 1,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 0,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = MON_GENDERLESS,\n        .eggCycles = 120,\n        .friendship = 0,\n        .growthRate = GROWTH_SLOW,\n        .eggGroups = {EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED},\n        .abilities = {ABILITY_PRESSURE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_RED,\n        .noFlip = TRUE,\n    },\n    [SPECIES_CHIMECHO] =\n    {\n        .baseHP = 65,\n        .baseAttack = 50,\n        .baseDefense = 70,\n        .baseSpeed = 65,\n        .baseSpAttack = 95,\n        .baseSpDefense = 80,\n        .types = {TYPE_PSYCHIC, TYPE_PSYCHIC},\n        .catchRate = 45,\n        .expYield = 147,\n        .evYield_HP = 0,\n        .evYield_Attack = 0,\n        .evYield_Defense = 0,\n        .evYield_Speed = 0,\n        .evYield_SpAttack = 1,\n        .evYield_SpDefense = 1,\n        .itemCommon = ITEM_NONE,\n        .itemRare = ITEM_NONE,\n        .genderRatio = PERCENT_FEMALE(50),\n        .eggCycles = 25,\n        .friendship = 70,\n        .growthRate = GROWTH_FAST,\n        .eggGroups = {EGG_GROUP_AMORPHOUS, EGG_GROUP_AMORPHOUS},\n        .abilities = {ABILITY_LEVITATE, ABILITY_NONE},\n        .safariZoneFleeRate = 0,\n        .bodyColor = BODY_COLOR_BLUE,\n        .noFlip = FALSE,\n    },\n};\n"
  },
  {
    "path": "src/data/pokemon/tmhm_learnsets.h",
    "content": "//#define TMHM(moves) {(u32)(moves), ((u64)(moves) >> 32)}\n//#define TMHM) ((u64)1 << (ITEM_##tmhm - ITEM_TM01_FOCUS_PUNCH))\n\n#define TMHM(tmhm) ((u8) ((ITEM_##tmhm) - ITEM_TM01_FOCUS_PUNCH))\n\n// This table determines which TMs and HMs a species is capable of learning.\n// Each entry is a 64-bit bit array spread across two 32-bit values, with\n// each bit corresponding to a machine.\n\nstatic const u8 sNoneTMHMLearnset[] =\n{\n    0xFF\n};\n\nstatic const u8 sBulbasaurTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sIvysaurTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sVenusaurTMHMLearnset[] =\n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sCharmanderTMHMLearnset[] =\n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sCharmeleonTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sCharizardTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM47_STEEL_WING),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM01_CUT),\n    TMHM(HM02_FLY),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSquirtleTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sWartortleTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sBlastoiseTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sCaterpieTMHMLearnset[] = \n{\n    0xFF\n};\n\nstatic const u8 sMetapodTMHMLearnset[] = \n{\n    0xFF\n};\n\nstatic const u8 sButterfreeTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sWeedleTMHMLearnset[] = \n{\n    0xFF\n};\n\nstatic const u8 sKakunaTMHMLearnset[] = \n{\n    0xFF\n};\n\nstatic const u8 sBeedrillTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sPidgeyTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sPidgeottoTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sPidgeotTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sRattataTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sRaticateTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSpearowTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sFearowTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sEkansTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    0xFF,\n};\n\nstatic const u8 sArbokTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    0xFF,\n};\n\nstatic const u8 sPikachuTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sRaichuTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSandshrewTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSandslashTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sNidoranFTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sNidorinaTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sNidoqueenTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sNidoranMTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sNidorinoTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sNidokingTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sClefairyTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sClefableTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sVulpixTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    0xFF,\n};\n\nstatic const u8 sNinetalesTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    0xFF,\n};\n\nstatic const u8 sJigglypuffTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sWigglytuffTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sZubatTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(TM49_SNATCH),\n    0xFF,\n};\n\nstatic const u8 sGolbatTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(TM49_SNATCH),\n    0xFF,\n};\n\nstatic const u8 sOddishTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sGloomTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sVileplumeTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sParasTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sParasectTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sVenonatTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sVenomothTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sDiglettTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sDugtrioTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMeowthTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sPersianTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sPsyduckTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sGolduckTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sMankeyTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sPrimeapeTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sGrowlitheTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sArcanineTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sPoliwagTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sPoliwhirlTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sPoliwrathTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sAbraTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sKadabraTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sAlakazamTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sMachopTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMachokeTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMachampTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sBellsproutTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sWeepinbellTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sVictreebelTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sTentacoolTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sTentacruelTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sGeodudeTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sGravelerTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sGolemTMHMLearnset[] =\n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sPonytaTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    0xFF,\n};\n\nstatic const u8 sRapidashTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    0xFF,\n};\n\nstatic const u8 sSlowpokeTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sSlowbroTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sMagnemiteTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sMagnetonTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sFarfetchdTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM01_CUT),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sDoduoTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sDodrioTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sSeelTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sDewgongTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sGrimerTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    0xFF,\n};\n\nstatic const u8 sMukTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sShellderTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sCloysterTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sGastlyTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    0xFF,\n};\n\nstatic const u8 sHaunterTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    0xFF,\n};\n\nstatic const u8 sGengarTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sOnixTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sDrowzeeTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sHypnoTMHMLearnset[] =\n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sKrabbyTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sKinglerTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sVoltorbTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM12_TAUNT),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sElectrodeTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sExeggcuteTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sExeggutorTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sCuboneTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMarowakTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sHitmonleeTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sHitmonchanTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sLickitungTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sKoffingTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sWeezingTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sRhyhornTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sRhydonTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sChanseyTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sTangelaTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sKangaskhanTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sHorseaTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sSeadraTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sGoldeenTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sSeakingTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sStaryuTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM03_SURF),\n    TMHM(HM05_FLASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sStarmieTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM03_SURF),\n    TMHM(HM05_FLASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sMrmimeTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sScytherTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM01_CUT),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sJynxTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sElectabuzzTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMagmarTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sPinsirTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sTaurosTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMagikarpTMHMLearnset[] = \n{\n    0xFF\n};\n\nstatic const u8 sGyaradosTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sLaprasTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sDittoTMHMLearnset[] =\n{\n    0xFF\n};\n\nstatic const u8 sEeveeTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    0xFF,\n};\n\nstatic const u8 sVaporeonTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sJolteonTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sFlareonTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    0xFF,\n};\n\nstatic const u8 sPorygonTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sOmanyteTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sOmastarTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sKabutoTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    0xFF,\n};\n\nstatic const u8 sKabutopsTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sAerodactylTMHMLearnset[] = \n{\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSnorlaxTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    0xFF,\n};\n\nstatic const u8 sArticunoTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sZapdosTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMoltresTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM47_STEEL_WING),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM02_FLY),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sDratiniTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    0xFF,\n};\n\nstatic const u8 sDragonairTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    0xFF,\n};\n\nstatic const u8 sDragoniteTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM01_CUT),\n    TMHM(HM02_FLY),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sMewtwoTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMewTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM01_CUT),\n    TMHM(HM02_FLY),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sChikoritaTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sBayleefTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMeganiumTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sCyndaquilTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM01_CUT),\n    0xFF,\n};\n\nstatic const u8 sQuilavaTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sTyphlosionTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sTotodileTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sCroconawTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sFeraligatrTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sSentretTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    0xFF,\n};\n\nstatic const u8 sFurretTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sHoothootTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sNoctowlTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sLedybaTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sLedianTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sSpinarakTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sAriadosTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sCrobatTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(TM49_SNATCH),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sChinchouTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM05_FLASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sLanturnTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM05_FLASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sPichuTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sCleffaTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sIgglybuffTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sTogepiTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sTogeticTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sNatuTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sXatuTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM02_FLY),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sMareepTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sFlaaffyTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sAmpharosTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sBellossomTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sMarillTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sAzumarillTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sSudowoodoTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sPolitoedTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sHoppipTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sSkiploomTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sJumpluffTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sAipomTMHMLearnset[] =\n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSunkernTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sSunfloraTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sYanmaTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sWooperTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sQuagsireTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sEspeonTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sUmbreonTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM49_SNATCH),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sMurkrowTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(TM49_SNATCH),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sSlowkingTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sMisdreavusTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sUnownTMHMLearnset[] =\n{\n    0xFF,\n};\n\nstatic const u8 sWobbuffetTMHMLearnset[] = \n{\n    0xFF,\n};\n\nstatic const u8 sGirafarigTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sPinecoTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sForretressTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sDunsparceTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sGligarTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSteelixTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSnubbullTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sGranbullTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sQwilfishTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sScizorTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sShuckleTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sHeracrossTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSneaselTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sTeddiursaTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sUrsaringTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSlugmaTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMagcargoTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSwinubTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sPiloswineTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sCorsolaTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sRemoraidTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sOctilleryTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sDelibirdTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sMantineTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sSkarmoryTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM01_CUT),\n    TMHM(HM02_FLY),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sHoundourTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sHoundoomTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sKingdraTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sPhanpyTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sDonphanTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sPorygon2TMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sStantlerTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sSmeargleTMHMLearnset[] = \n{\n    0xFF\n};\n\nstatic const u8 sTyrogueTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sHitmontopTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSmoochumTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sElekidTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMagbyTMHMLearnset[] =\n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMiltankTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sBlisseyTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sRaikouTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sEnteiTMHMLearnset[] =\n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSuicuneTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sLarvitarTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sPupitarTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sTyranitarTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sLugiaTMHMLearnset[] =\n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM47_STEEL_WING),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM02_FLY),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sHoOhTMHMLearnset[] =\n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM47_STEEL_WING),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM02_FLY),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sCelebiTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sTreeckoTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sGrovyleTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSceptileTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sTorchicTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sCombuskenTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sBlazikenTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMudkipTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sMarshtompTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sSwampertTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sPoochyenaTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMightyenaTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sZigzagoonTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sLinooneTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sWurmpleTMHMLearnset[] = \n{\n    0xFF\n};\n\nstatic const u8 sSilcoonTMHMLearnset[] = \n{\n    0xFF\n};\n\nstatic const u8 sBeautiflyTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sCascoonTMHMLearnset[] = \n{\n    0xFF\n};\n\nstatic const u8 sDustoxTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sLotadTMHMLearnset[] =\n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sLombreTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sLudicoloTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sSeedotTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sNuzleafTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sShiftryTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sNincadaTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sNinjaskTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sShedinjaTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM46_THIEF),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sTaillowTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sSwellowTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sShroomishTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sBreloomTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM49_SNATCH),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSpindaTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sWingullTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sPelipperTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    TMHM(HM03_SURF),\n    0xFF,\n};\n\nstatic const u8 sSurskitTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sMasquerainTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sWailmerTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sWailordTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sSkittyTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sDelcattyTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sKecleonTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sBaltoyTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sClaydolTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sNosepassTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sTorkoalTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSableyeTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sBarboachTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sWhiscashTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sLuvdiscTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sCorphishTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    0xFF,\n};\n\nstatic const u8 sCrawdauntTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sFeebasTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sMiloticTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sCarvanhaTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sSharpedoTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sTrapinchTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sVibravaTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sFlygonTMHMLearnset[] = \n{\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMakuhitaTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sHariyamaTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sElectrikeTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sManectricTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sNumelTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sCameruptTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSphealTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sSealeoTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sWalreinTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sCacneaTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sCacturneTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sSnoruntTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sGlalieTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sLunatoneTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sSolrockTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sAzurillTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    0xFF,\n};\n\nstatic const u8 sSpoinkTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sGrumpigTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sPlusleTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sMinunTMHMLearnset[] =\n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sMawileTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMedititeTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMedichamTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSwabluTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    0xFF,\n};\n\nstatic const u8 sAltariaTMHMLearnset[] = \n{\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM02_FLY),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sWynautTMHMLearnset[] = \n{\n    0xFF\n};\n\nstatic const u8 sDuskullTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sDusclopsTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sRoseliaTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sSlakothTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sVigorothTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSlakingTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sGulpinTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSwalotTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sTropiusTMHMLearnset[] = \n{\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM01_CUT),\n    TMHM(HM02_FLY),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sWhismurTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    0xFF,\n};\n\nstatic const u8 sLoudredTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sExploudTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sClamperlTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sHuntailTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM49_SNATCH),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sGorebyssTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sAbsolTMHMLearnset[] =\n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sShuppetTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sBanetteTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sSeviperTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM49_SNATCH),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sZangooseTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sRelicanthTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM03_SURF),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sAronTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sLaironTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sAggronTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sCastformTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sVolbeatTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sIllumiseTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sLileepTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    0xFF,\n};\n\nstatic const u8 sCradilyTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM09_BULLET_SEED),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM19_GIGA_DRAIN),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sAnorithTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sArmaldoTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sRaltsTMHMLearnset[] =\n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sKirliaTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sGardevoirTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM46_THIEF),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sBagonTMHMLearnset[] =\n{\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sShelgonTMHMLearnset[] = \n{\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sSalamenceTMHMLearnset[] = \n{\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM01_CUT),\n    TMHM(HM02_FLY),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sBeldumTMHMLearnset[] = \n{\n    0xFF\n};\n\nstatic const u8 sMetangTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sMetagrossTMHMLearnset[] = \n{\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM36_SLUDGE_BOMB),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sRegirockTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sRegiceTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sRegisteelTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sKyogreTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM07_HAIL),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sGroudonTMHMLearnset[] = \n{\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM28_DIG),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sRayquazaTMHMLearnset[] = \n{\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM08_BULK_UP),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM14_BLIZZARD),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM23_IRON_TAIL),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM35_FLAMETHROWER),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM38_FIRE_BLAST),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM50_OVERHEAT),\n    TMHM(HM02_FLY),\n    TMHM(HM03_SURF),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM06_ROCK_SMASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sLatiasTMHMLearnset[] = \n{\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM01_CUT),\n    TMHM(HM02_FLY),\n    TMHM(HM03_SURF),\n    TMHM(HM05_FLASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sLatiosTMHMLearnset[] = \n{\n    TMHM(TM02_DRAGON_CLAW),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM05_ROAR),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM26_EARTHQUAKE),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM47_STEEL_WING),\n    TMHM(HM01_CUT),\n    TMHM(HM02_FLY),\n    TMHM(HM03_SURF),\n    TMHM(HM05_FLASH),\n    TMHM(HM07_WATERFALL),\n    TMHM(HM08_DIVE),\n    0xFF,\n};\n\nstatic const u8 sJirachiTMHMLearnset[] = \n{\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM37_SANDSTORM),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nstatic const u8 sDeoxysTMHMLearnset[] = \n{\n    TMHM(TM01_FOCUS_PUNCH),\n    TMHM(TM03_WATER_PULSE),\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM13_ICE_BEAM),\n    TMHM(TM15_HYPER_BEAM),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM22_SOLAR_BEAM),\n    TMHM(TM24_THUNDERBOLT),\n    TMHM(TM25_THUNDER),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM31_BRICK_BREAK),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM39_ROCK_TOMB),\n    TMHM(TM40_AERIAL_ACE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM01_CUT),\n    TMHM(HM04_STRENGTH),\n    TMHM(HM05_FLASH),\n    TMHM(HM06_ROCK_SMASH),\n    0xFF,\n};\n\nstatic const u8 sChimechoTMHMLearnset[] = \n{\n    TMHM(TM04_CALM_MIND),\n    TMHM(TM06_TOXIC),\n    TMHM(TM10_HIDDEN_POWER),\n    TMHM(TM11_SUNNY_DAY),\n    TMHM(TM12_TAUNT),\n    TMHM(TM16_LIGHT_SCREEN),\n    TMHM(TM17_PROTECT),\n    TMHM(TM18_RAIN_DANCE),\n    TMHM(TM20_SAFEGUARD),\n    TMHM(TM21_FRUSTRATION),\n    TMHM(TM27_RETURN),\n    TMHM(TM29_PSYCHIC),\n    TMHM(TM30_SHADOW_BALL),\n    TMHM(TM32_DOUBLE_TEAM),\n    TMHM(TM33_REFLECT),\n    TMHM(TM34_SHOCK_WAVE),\n    TMHM(TM41_TORMENT),\n    TMHM(TM42_FACADE),\n    TMHM(TM43_SECRET_POWER),\n    TMHM(TM44_REST),\n    TMHM(TM45_ATTRACT),\n    TMHM(TM48_SKILL_SWAP),\n    TMHM(TM49_SNATCH),\n    TMHM(HM05_FLASH),\n    0xFF,\n};\n\nconst u8 *const gTMHMLearnsets[] =\n{\n    [SPECIES_NONE] = sBulbasaurTMHMLearnset,\n    [SPECIES_BULBASAUR] = sBulbasaurTMHMLearnset,\n    [SPECIES_IVYSAUR] = sIvysaurTMHMLearnset,\n    [SPECIES_VENUSAUR] = sVenusaurTMHMLearnset,\n    [SPECIES_CHARMANDER] = sCharmanderTMHMLearnset,\n    [SPECIES_CHARMELEON] = sCharmeleonTMHMLearnset,\n    [SPECIES_CHARIZARD] = sCharizardTMHMLearnset,\n    [SPECIES_SQUIRTLE] = sSquirtleTMHMLearnset,\n    [SPECIES_WARTORTLE] = sWartortleTMHMLearnset,\n    [SPECIES_BLASTOISE] = sBlastoiseTMHMLearnset,\n    [SPECIES_CATERPIE] = sCaterpieTMHMLearnset,\n    [SPECIES_METAPOD] = sMetapodTMHMLearnset,\n    [SPECIES_BUTTERFREE] = sButterfreeTMHMLearnset,\n    [SPECIES_WEEDLE] = sWeedleTMHMLearnset,\n    [SPECIES_KAKUNA] = sKakunaTMHMLearnset,\n    [SPECIES_BEEDRILL] = sBeedrillTMHMLearnset,\n    [SPECIES_PIDGEY] = sPidgeyTMHMLearnset,\n    [SPECIES_PIDGEOTTO] = sPidgeottoTMHMLearnset,\n    [SPECIES_PIDGEOT] = sPidgeotTMHMLearnset,\n    [SPECIES_RATTATA] = sRattataTMHMLearnset,\n    [SPECIES_RATICATE] = sRaticateTMHMLearnset,\n    [SPECIES_SPEAROW] = sSpearowTMHMLearnset,\n    [SPECIES_FEAROW] = sFearowTMHMLearnset,\n    [SPECIES_EKANS] = sEkansTMHMLearnset,\n    [SPECIES_ARBOK] = sArbokTMHMLearnset,\n    [SPECIES_PIKACHU] = sPikachuTMHMLearnset,\n    [SPECIES_RAICHU] = sRaichuTMHMLearnset,\n    [SPECIES_SANDSHREW] = sSandshrewTMHMLearnset,\n    [SPECIES_SANDSLASH] = sSandslashTMHMLearnset,\n    [SPECIES_NIDORAN_F] = sNidoranFTMHMLearnset,\n    [SPECIES_NIDORINA] = sNidorinaTMHMLearnset,\n    [SPECIES_NIDOQUEEN] = sNidoqueenTMHMLearnset,\n    [SPECIES_NIDORAN_M] = sNidoranMTMHMLearnset,\n    [SPECIES_NIDORINO] = sNidorinoTMHMLearnset,\n    [SPECIES_NIDOKING] = sNidokingTMHMLearnset,\n    [SPECIES_CLEFAIRY] = sClefairyTMHMLearnset,\n    [SPECIES_CLEFABLE] = sClefableTMHMLearnset,\n    [SPECIES_VULPIX] = sVulpixTMHMLearnset,\n    [SPECIES_NINETALES] = sNinetalesTMHMLearnset,\n    [SPECIES_JIGGLYPUFF] = sJigglypuffTMHMLearnset,\n    [SPECIES_WIGGLYTUFF] = sWigglytuffTMHMLearnset,\n    [SPECIES_ZUBAT] = sZubatTMHMLearnset,\n    [SPECIES_GOLBAT] = sGolbatTMHMLearnset,\n    [SPECIES_ODDISH] = sOddishTMHMLearnset,\n    [SPECIES_GLOOM] = sGloomTMHMLearnset,\n    [SPECIES_VILEPLUME] = sVileplumeTMHMLearnset,\n    [SPECIES_PARAS] = sParasTMHMLearnset,\n    [SPECIES_PARASECT] = sParasectTMHMLearnset,\n    [SPECIES_VENONAT] = sVenonatTMHMLearnset,\n    [SPECIES_VENOMOTH] = sVenomothTMHMLearnset,\n    [SPECIES_DIGLETT] = sDiglettTMHMLearnset,\n    [SPECIES_DUGTRIO] = sDugtrioTMHMLearnset,\n    [SPECIES_MEOWTH] = sMeowthTMHMLearnset,\n    [SPECIES_PERSIAN] = sPersianTMHMLearnset,\n    [SPECIES_PSYDUCK] = sPsyduckTMHMLearnset,\n    [SPECIES_GOLDUCK] = sGolduckTMHMLearnset,\n    [SPECIES_MANKEY] = sMankeyTMHMLearnset,\n    [SPECIES_PRIMEAPE] = sPrimeapeTMHMLearnset,\n    [SPECIES_GROWLITHE] = sGrowlitheTMHMLearnset,\n    [SPECIES_ARCANINE] = sArcanineTMHMLearnset,\n    [SPECIES_POLIWAG] = sPoliwagTMHMLearnset,\n    [SPECIES_POLIWHIRL] = sPoliwhirlTMHMLearnset,\n    [SPECIES_POLIWRATH] = sPoliwrathTMHMLearnset,\n    [SPECIES_ABRA] = sAbraTMHMLearnset,\n    [SPECIES_KADABRA] = sKadabraTMHMLearnset,\n    [SPECIES_ALAKAZAM] = sAlakazamTMHMLearnset,\n    [SPECIES_MACHOP] = sMachopTMHMLearnset,\n    [SPECIES_MACHOKE] = sMachokeTMHMLearnset,\n    [SPECIES_MACHAMP] = sMachampTMHMLearnset,\n    [SPECIES_BELLSPROUT] = sBellsproutTMHMLearnset,\n    [SPECIES_WEEPINBELL] = sWeepinbellTMHMLearnset,\n    [SPECIES_VICTREEBEL] = sVictreebelTMHMLearnset,\n    [SPECIES_TENTACOOL] = sTentacoolTMHMLearnset,\n    [SPECIES_TENTACRUEL] = sTentacruelTMHMLearnset,\n    [SPECIES_GEODUDE] = sGeodudeTMHMLearnset,\n    [SPECIES_GRAVELER] = sGravelerTMHMLearnset,\n    [SPECIES_GOLEM] = sGolemTMHMLearnset,\n    [SPECIES_PONYTA] = sPonytaTMHMLearnset,\n    [SPECIES_RAPIDASH] = sRapidashTMHMLearnset,\n    [SPECIES_SLOWPOKE] = sSlowpokeTMHMLearnset,\n    [SPECIES_SLOWBRO] = sSlowbroTMHMLearnset,\n    [SPECIES_MAGNEMITE] = sMagnemiteTMHMLearnset,\n    [SPECIES_MAGNETON] = sMagnetonTMHMLearnset,\n    [SPECIES_FARFETCHD] = sFarfetchdTMHMLearnset,\n    [SPECIES_DODUO] = sDoduoTMHMLearnset,\n    [SPECIES_DODRIO] = sDodrioTMHMLearnset,\n    [SPECIES_SEEL] = sSeelTMHMLearnset,\n    [SPECIES_DEWGONG] = sDewgongTMHMLearnset,\n    [SPECIES_GRIMER] = sGrimerTMHMLearnset,\n    [SPECIES_MUK] = sMukTMHMLearnset,\n    [SPECIES_SHELLDER] = sShellderTMHMLearnset,\n    [SPECIES_CLOYSTER] = sCloysterTMHMLearnset,\n    [SPECIES_GASTLY] = sGastlyTMHMLearnset,\n    [SPECIES_HAUNTER] = sHaunterTMHMLearnset,\n    [SPECIES_GENGAR] = sGengarTMHMLearnset,\n    [SPECIES_ONIX] = sOnixTMHMLearnset,\n    [SPECIES_DROWZEE] = sDrowzeeTMHMLearnset,\n    [SPECIES_HYPNO] = sHypnoTMHMLearnset,\n    [SPECIES_KRABBY] = sKrabbyTMHMLearnset,\n    [SPECIES_KINGLER] = sKinglerTMHMLearnset,\n    [SPECIES_VOLTORB] = sVoltorbTMHMLearnset,\n    [SPECIES_ELECTRODE] = sElectrodeTMHMLearnset,\n    [SPECIES_EXEGGCUTE] = sExeggcuteTMHMLearnset,\n    [SPECIES_EXEGGUTOR] = sExeggutorTMHMLearnset,\n    [SPECIES_CUBONE] = sCuboneTMHMLearnset,\n    [SPECIES_MAROWAK] = sMarowakTMHMLearnset,\n    [SPECIES_HITMONLEE] = sHitmonleeTMHMLearnset,\n    [SPECIES_HITMONCHAN] = sHitmonchanTMHMLearnset,\n    [SPECIES_LICKITUNG] = sLickitungTMHMLearnset,\n    [SPECIES_KOFFING] = sKoffingTMHMLearnset,\n    [SPECIES_WEEZING] = sWeezingTMHMLearnset,\n    [SPECIES_RHYHORN] = sRhyhornTMHMLearnset,\n    [SPECIES_RHYDON] = sRhydonTMHMLearnset,\n    [SPECIES_CHANSEY] = sChanseyTMHMLearnset,\n    [SPECIES_TANGELA] = sTangelaTMHMLearnset,\n    [SPECIES_KANGASKHAN] = sKangaskhanTMHMLearnset,\n    [SPECIES_HORSEA] = sHorseaTMHMLearnset,\n    [SPECIES_SEADRA] = sSeadraTMHMLearnset,\n    [SPECIES_GOLDEEN] = sGoldeenTMHMLearnset,\n    [SPECIES_SEAKING] = sSeakingTMHMLearnset,\n    [SPECIES_STARYU] = sStaryuTMHMLearnset,\n    [SPECIES_STARMIE] = sStarmieTMHMLearnset,\n    [SPECIES_MR_MIME] = sMrmimeTMHMLearnset,\n    [SPECIES_SCYTHER] = sScytherTMHMLearnset,\n    [SPECIES_JYNX] = sJynxTMHMLearnset,\n    [SPECIES_ELECTABUZZ] = sElectabuzzTMHMLearnset,\n    [SPECIES_MAGMAR] = sMagmarTMHMLearnset,\n    [SPECIES_PINSIR] = sPinsirTMHMLearnset,\n    [SPECIES_TAUROS] = sTaurosTMHMLearnset,\n    [SPECIES_MAGIKARP] = sMagikarpTMHMLearnset,\n    [SPECIES_GYARADOS] = sGyaradosTMHMLearnset,\n    [SPECIES_LAPRAS] = sLaprasTMHMLearnset,\n    [SPECIES_DITTO] = sDittoTMHMLearnset,\n    [SPECIES_EEVEE] = sEeveeTMHMLearnset,\n    [SPECIES_VAPOREON] = sVaporeonTMHMLearnset,\n    [SPECIES_JOLTEON] = sJolteonTMHMLearnset,\n    [SPECIES_FLAREON] = sFlareonTMHMLearnset,\n    [SPECIES_PORYGON] = sPorygonTMHMLearnset,\n    [SPECIES_OMANYTE] = sOmanyteTMHMLearnset,\n    [SPECIES_OMASTAR] = sOmastarTMHMLearnset,\n    [SPECIES_KABUTO] = sKabutoTMHMLearnset,\n    [SPECIES_KABUTOPS] = sKabutopsTMHMLearnset,\n    [SPECIES_AERODACTYL] = sAerodactylTMHMLearnset,\n    [SPECIES_SNORLAX] = sSnorlaxTMHMLearnset,\n    [SPECIES_ARTICUNO] = sArticunoTMHMLearnset,\n    [SPECIES_ZAPDOS] = sZapdosTMHMLearnset,\n    [SPECIES_MOLTRES] = sMoltresTMHMLearnset,\n    [SPECIES_DRATINI] = sDratiniTMHMLearnset,\n    [SPECIES_DRAGONAIR] = sDragonairTMHMLearnset,\n    [SPECIES_DRAGONITE] = sDragoniteTMHMLearnset,\n    [SPECIES_MEWTWO] = sMewtwoTMHMLearnset,\n    [SPECIES_MEW] = sMewTMHMLearnset,\n    [SPECIES_CHIKORITA] = sChikoritaTMHMLearnset,\n    [SPECIES_BAYLEEF] = sBayleefTMHMLearnset,\n    [SPECIES_MEGANIUM] = sMeganiumTMHMLearnset,\n    [SPECIES_CYNDAQUIL] = sCyndaquilTMHMLearnset,\n    [SPECIES_QUILAVA] = sQuilavaTMHMLearnset,\n    [SPECIES_TYPHLOSION] = sTyphlosionTMHMLearnset,\n    [SPECIES_TOTODILE] = sTotodileTMHMLearnset,\n    [SPECIES_CROCONAW] = sCroconawTMHMLearnset,\n    [SPECIES_FERALIGATR] = sFeraligatrTMHMLearnset,\n    [SPECIES_SENTRET] = sSentretTMHMLearnset,\n    [SPECIES_FURRET] = sFurretTMHMLearnset,\n    [SPECIES_HOOTHOOT] = sHoothootTMHMLearnset,\n    [SPECIES_NOCTOWL] = sNoctowlTMHMLearnset,\n    [SPECIES_LEDYBA] = sLedybaTMHMLearnset,\n    [SPECIES_LEDIAN] = sLedianTMHMLearnset,\n    [SPECIES_SPINARAK] = sSpinarakTMHMLearnset,\n    [SPECIES_ARIADOS] = sAriadosTMHMLearnset,\n    [SPECIES_CROBAT] = sCrobatTMHMLearnset,\n    [SPECIES_CHINCHOU] = sChinchouTMHMLearnset,\n    [SPECIES_LANTURN] = sLanturnTMHMLearnset,\n    [SPECIES_PICHU] = sPichuTMHMLearnset,\n    [SPECIES_CLEFFA] = sCleffaTMHMLearnset,\n    [SPECIES_IGGLYBUFF] = sIgglybuffTMHMLearnset,\n    [SPECIES_TOGEPI] = sTogepiTMHMLearnset,\n    [SPECIES_TOGETIC] = sTogeticTMHMLearnset,\n    [SPECIES_NATU] = sNatuTMHMLearnset,\n    [SPECIES_XATU] = sXatuTMHMLearnset,\n    [SPECIES_MAREEP] = sMareepTMHMLearnset,\n    [SPECIES_FLAAFFY] = sFlaaffyTMHMLearnset,\n    [SPECIES_AMPHAROS] = sAmpharosTMHMLearnset,\n    [SPECIES_BELLOSSOM] = sBellossomTMHMLearnset,\n    [SPECIES_MARILL] = sMarillTMHMLearnset,\n    [SPECIES_AZUMARILL] = sAzumarillTMHMLearnset,\n    [SPECIES_SUDOWOODO] = sSudowoodoTMHMLearnset,\n    [SPECIES_POLITOED] = sPolitoedTMHMLearnset,\n    [SPECIES_HOPPIP] = sHoppipTMHMLearnset,\n    [SPECIES_SKIPLOOM] = sSkiploomTMHMLearnset,\n    [SPECIES_JUMPLUFF] = sJumpluffTMHMLearnset,\n    [SPECIES_AIPOM] = sAipomTMHMLearnset,\n    [SPECIES_SUNKERN] = sSunkernTMHMLearnset,\n    [SPECIES_SUNFLORA] = sSunfloraTMHMLearnset,\n    [SPECIES_YANMA] = sYanmaTMHMLearnset,\n    [SPECIES_WOOPER] = sWooperTMHMLearnset,\n    [SPECIES_QUAGSIRE] = sQuagsireTMHMLearnset,\n    [SPECIES_ESPEON] = sEspeonTMHMLearnset,\n    [SPECIES_UMBREON] = sUmbreonTMHMLearnset,\n    [SPECIES_MURKROW] = sMurkrowTMHMLearnset,\n    [SPECIES_SLOWKING] = sSlowkingTMHMLearnset,\n    [SPECIES_MISDREAVUS] = sMisdreavusTMHMLearnset,\n    [SPECIES_UNOWN] = sUnownTMHMLearnset,\n    [SPECIES_WOBBUFFET] = sWobbuffetTMHMLearnset,\n    [SPECIES_GIRAFARIG] = sGirafarigTMHMLearnset,\n    [SPECIES_PINECO] = sPinecoTMHMLearnset,\n    [SPECIES_FORRETRESS] = sForretressTMHMLearnset,\n    [SPECIES_DUNSPARCE] = sDunsparceTMHMLearnset,\n    [SPECIES_GLIGAR] = sGligarTMHMLearnset,\n    [SPECIES_STEELIX] = sSteelixTMHMLearnset,\n    [SPECIES_SNUBBULL] = sSnubbullTMHMLearnset,\n    [SPECIES_GRANBULL] = sGranbullTMHMLearnset,\n    [SPECIES_QWILFISH] = sQwilfishTMHMLearnset,\n    [SPECIES_SCIZOR] = sScizorTMHMLearnset,\n    [SPECIES_SHUCKLE] = sShuckleTMHMLearnset,\n    [SPECIES_HERACROSS] = sHeracrossTMHMLearnset,\n    [SPECIES_SNEASEL] = sSneaselTMHMLearnset,\n    [SPECIES_TEDDIURSA] = sTeddiursaTMHMLearnset,\n    [SPECIES_URSARING] = sUrsaringTMHMLearnset,\n    [SPECIES_SLUGMA] = sSlugmaTMHMLearnset,\n    [SPECIES_MAGCARGO] = sMagcargoTMHMLearnset,\n    [SPECIES_SWINUB] = sSwinubTMHMLearnset,\n    [SPECIES_PILOSWINE] = sPiloswineTMHMLearnset,\n    [SPECIES_CORSOLA] = sCorsolaTMHMLearnset,\n    [SPECIES_REMORAID] = sRemoraidTMHMLearnset,\n    [SPECIES_OCTILLERY] = sOctilleryTMHMLearnset,\n    [SPECIES_DELIBIRD] = sDelibirdTMHMLearnset,\n    [SPECIES_MANTINE] = sMantineTMHMLearnset,\n    [SPECIES_SKARMORY] = sSkarmoryTMHMLearnset,\n    [SPECIES_HOUNDOUR] = sHoundourTMHMLearnset,\n    [SPECIES_HOUNDOOM] = sHoundoomTMHMLearnset,\n    [SPECIES_KINGDRA] = sKingdraTMHMLearnset,\n    [SPECIES_PHANPY] = sPhanpyTMHMLearnset,\n    [SPECIES_DONPHAN] = sDonphanTMHMLearnset,\n    [SPECIES_PORYGON2] = sPorygon2TMHMLearnset,\n    [SPECIES_STANTLER] = sStantlerTMHMLearnset,\n    [SPECIES_SMEARGLE] = sSmeargleTMHMLearnset,\n    [SPECIES_TYROGUE] = sTyrogueTMHMLearnset,\n    [SPECIES_HITMONTOP] = sHitmontopTMHMLearnset,\n    [SPECIES_SMOOCHUM] = sSmoochumTMHMLearnset,\n    [SPECIES_ELEKID] = sElekidTMHMLearnset,\n    [SPECIES_MAGBY] = sMagbyTMHMLearnset,\n    [SPECIES_MILTANK] = sMiltankTMHMLearnset,\n    [SPECIES_BLISSEY] = sBlisseyTMHMLearnset,\n    [SPECIES_RAIKOU] = sRaikouTMHMLearnset,\n    [SPECIES_ENTEI] = sEnteiTMHMLearnset,\n    [SPECIES_SUICUNE] = sSuicuneTMHMLearnset,\n    [SPECIES_LARVITAR] = sLarvitarTMHMLearnset,\n    [SPECIES_PUPITAR] = sPupitarTMHMLearnset,\n    [SPECIES_TYRANITAR] = sTyranitarTMHMLearnset,\n    [SPECIES_LUGIA] = sLugiaTMHMLearnset,\n    [SPECIES_HO_OH] = sHoOhTMHMLearnset,\n    [SPECIES_CELEBI] = sCelebiTMHMLearnset,\n    [SPECIES_OLD_UNOWN_B] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_C] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_D] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_E] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_F] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_G] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_H] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_I] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_J] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_K] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_L] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_M] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_N] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_O] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_P] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_Q] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_R] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_S] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_T] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_U] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_V] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_W] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_X] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_Y] = sNoneTMHMLearnset,\n    [SPECIES_OLD_UNOWN_Z] = sNoneTMHMLearnset,\n    [SPECIES_TREECKO] = sTreeckoTMHMLearnset,\n    [SPECIES_GROVYLE] = sGrovyleTMHMLearnset,\n    [SPECIES_SCEPTILE] = sSceptileTMHMLearnset,\n    [SPECIES_TORCHIC] = sTorchicTMHMLearnset,\n    [SPECIES_COMBUSKEN] = sCombuskenTMHMLearnset,\n    [SPECIES_BLAZIKEN] = sBlazikenTMHMLearnset,\n    [SPECIES_MUDKIP] = sMudkipTMHMLearnset,\n    [SPECIES_MARSHTOMP] = sMarshtompTMHMLearnset,\n    [SPECIES_SWAMPERT] = sSwampertTMHMLearnset,\n    [SPECIES_POOCHYENA] = sPoochyenaTMHMLearnset,\n    [SPECIES_MIGHTYENA] = sMightyenaTMHMLearnset,\n    [SPECIES_ZIGZAGOON] = sZigzagoonTMHMLearnset,\n    [SPECIES_LINOONE] = sLinooneTMHMLearnset,\n    [SPECIES_WURMPLE] = sWurmpleTMHMLearnset,\n    [SPECIES_SILCOON] = sSilcoonTMHMLearnset,\n    [SPECIES_BEAUTIFLY] = sBeautiflyTMHMLearnset,\n    [SPECIES_CASCOON] = sCascoonTMHMLearnset,\n    [SPECIES_DUSTOX] = sDustoxTMHMLearnset,\n    [SPECIES_LOTAD] = sLotadTMHMLearnset,\n    [SPECIES_LOMBRE] = sLombreTMHMLearnset,\n    [SPECIES_LUDICOLO] = sLudicoloTMHMLearnset,\n    [SPECIES_SEEDOT] = sSeedotTMHMLearnset,\n    [SPECIES_NUZLEAF] = sNuzleafTMHMLearnset,\n    [SPECIES_SHIFTRY] = sShiftryTMHMLearnset,\n    [SPECIES_NINCADA] = sNincadaTMHMLearnset,\n    [SPECIES_NINJASK] = sNinjaskTMHMLearnset,\n    [SPECIES_SHEDINJA] = sShedinjaTMHMLearnset,\n    [SPECIES_TAILLOW] = sTaillowTMHMLearnset,\n    [SPECIES_SWELLOW] = sSwellowTMHMLearnset,\n    [SPECIES_SHROOMISH] = sShroomishTMHMLearnset,\n    [SPECIES_BRELOOM] = sBreloomTMHMLearnset,\n    [SPECIES_SPINDA] = sSpindaTMHMLearnset,\n    [SPECIES_WINGULL] = sWingullTMHMLearnset,\n    [SPECIES_PELIPPER] = sPelipperTMHMLearnset,\n    [SPECIES_SURSKIT] = sSurskitTMHMLearnset,\n    [SPECIES_MASQUERAIN] = sMasquerainTMHMLearnset,\n    [SPECIES_WAILMER] = sWailmerTMHMLearnset,\n    [SPECIES_WAILORD] = sWailordTMHMLearnset,\n    [SPECIES_SKITTY] = sSkittyTMHMLearnset,\n    [SPECIES_DELCATTY] = sDelcattyTMHMLearnset,\n    [SPECIES_KECLEON] = sKecleonTMHMLearnset,\n    [SPECIES_BALTOY] = sBaltoyTMHMLearnset,\n    [SPECIES_CLAYDOL] = sClaydolTMHMLearnset,\n    [SPECIES_NOSEPASS] = sNosepassTMHMLearnset,\n    [SPECIES_TORKOAL] = sTorkoalTMHMLearnset,\n    [SPECIES_SABLEYE] = sSableyeTMHMLearnset,\n    [SPECIES_BARBOACH] = sBarboachTMHMLearnset,\n    [SPECIES_WHISCASH] = sWhiscashTMHMLearnset,\n    [SPECIES_LUVDISC] = sLuvdiscTMHMLearnset,\n    [SPECIES_CORPHISH] = sCorphishTMHMLearnset,\n    [SPECIES_CRAWDAUNT] = sCrawdauntTMHMLearnset,\n    [SPECIES_FEEBAS] = sFeebasTMHMLearnset,\n    [SPECIES_MILOTIC] = sMiloticTMHMLearnset,\n    [SPECIES_CARVANHA] = sCarvanhaTMHMLearnset,\n    [SPECIES_SHARPEDO] = sSharpedoTMHMLearnset,\n    [SPECIES_TRAPINCH] = sTrapinchTMHMLearnset,\n    [SPECIES_VIBRAVA] = sVibravaTMHMLearnset,\n    [SPECIES_FLYGON] = sFlygonTMHMLearnset,\n    [SPECIES_MAKUHITA] = sMakuhitaTMHMLearnset,\n    [SPECIES_HARIYAMA] = sHariyamaTMHMLearnset,\n    [SPECIES_ELECTRIKE] = sElectrikeTMHMLearnset,\n    [SPECIES_MANECTRIC] = sManectricTMHMLearnset,\n    [SPECIES_NUMEL] = sNumelTMHMLearnset,\n    [SPECIES_CAMERUPT] = sCameruptTMHMLearnset,\n    [SPECIES_SPHEAL] = sSphealTMHMLearnset,\n    [SPECIES_SEALEO] = sSealeoTMHMLearnset,\n    [SPECIES_WALREIN] = sWalreinTMHMLearnset,\n    [SPECIES_CACNEA] = sCacneaTMHMLearnset,\n    [SPECIES_CACTURNE] = sCacturneTMHMLearnset,\n    [SPECIES_SNORUNT] = sSnoruntTMHMLearnset,\n    [SPECIES_GLALIE] = sGlalieTMHMLearnset,\n    [SPECIES_LUNATONE] = sLunatoneTMHMLearnset,\n    [SPECIES_SOLROCK] = sSolrockTMHMLearnset,\n    [SPECIES_AZURILL] = sAzurillTMHMLearnset,\n    [SPECIES_SPOINK] = sSpoinkTMHMLearnset,\n    [SPECIES_GRUMPIG] = sGrumpigTMHMLearnset,\n    [SPECIES_PLUSLE] = sPlusleTMHMLearnset,\n    [SPECIES_MINUN] = sMinunTMHMLearnset,\n    [SPECIES_MAWILE] = sMawileTMHMLearnset,\n    [SPECIES_MEDITITE] = sMedititeTMHMLearnset,\n    [SPECIES_MEDICHAM] = sMedichamTMHMLearnset,\n    [SPECIES_SWABLU] = sSwabluTMHMLearnset,\n    [SPECIES_ALTARIA] = sAltariaTMHMLearnset,\n    [SPECIES_WYNAUT] = sWynautTMHMLearnset,\n    [SPECIES_DUSKULL] = sDuskullTMHMLearnset,\n    [SPECIES_DUSCLOPS] = sDusclopsTMHMLearnset,\n    [SPECIES_ROSELIA] = sRoseliaTMHMLearnset,\n    [SPECIES_SLAKOTH] = sSlakothTMHMLearnset,\n    [SPECIES_VIGOROTH] = sVigorothTMHMLearnset,\n    [SPECIES_SLAKING] = sSlakingTMHMLearnset,\n    [SPECIES_GULPIN] = sGulpinTMHMLearnset,\n    [SPECIES_SWALOT] = sSwalotTMHMLearnset,\n    [SPECIES_TROPIUS] = sTropiusTMHMLearnset,\n    [SPECIES_WHISMUR] = sWhismurTMHMLearnset,\n    [SPECIES_LOUDRED] = sLoudredTMHMLearnset,\n    [SPECIES_EXPLOUD] = sExploudTMHMLearnset,\n    [SPECIES_CLAMPERL] = sClamperlTMHMLearnset,\n    [SPECIES_HUNTAIL] = sHuntailTMHMLearnset,\n    [SPECIES_GOREBYSS] = sGorebyssTMHMLearnset,\n    [SPECIES_ABSOL] = sAbsolTMHMLearnset,\n    [SPECIES_SHUPPET] = sShuppetTMHMLearnset,\n    [SPECIES_BANETTE] = sBanetteTMHMLearnset,\n    [SPECIES_SEVIPER] = sSeviperTMHMLearnset,\n    [SPECIES_ZANGOOSE] = sZangooseTMHMLearnset,\n    [SPECIES_RELICANTH] = sRelicanthTMHMLearnset,\n    [SPECIES_ARON] = sAronTMHMLearnset,\n    [SPECIES_LAIRON] = sLaironTMHMLearnset,\n    [SPECIES_AGGRON] = sAggronTMHMLearnset,\n    [SPECIES_CASTFORM] = sCastformTMHMLearnset,\n    [SPECIES_VOLBEAT] = sVolbeatTMHMLearnset,\n    [SPECIES_ILLUMISE] = sIllumiseTMHMLearnset,\n    [SPECIES_LILEEP] = sLileepTMHMLearnset,\n    [SPECIES_CRADILY] = sCradilyTMHMLearnset,\n    [SPECIES_ANORITH] = sAnorithTMHMLearnset,\n    [SPECIES_ARMALDO] = sArmaldoTMHMLearnset,\n    [SPECIES_RALTS] = sRaltsTMHMLearnset,\n    [SPECIES_KIRLIA] = sKirliaTMHMLearnset,\n    [SPECIES_GARDEVOIR] = sGardevoirTMHMLearnset,\n    [SPECIES_BAGON] = sBagonTMHMLearnset,\n    [SPECIES_SHELGON] = sShelgonTMHMLearnset,\n    [SPECIES_SALAMENCE] = sSalamenceTMHMLearnset,\n    [SPECIES_BELDUM] = sBeldumTMHMLearnset,\n    [SPECIES_METANG] = sMetangTMHMLearnset,\n    [SPECIES_METAGROSS] = sMetagrossTMHMLearnset,\n    [SPECIES_REGIROCK] = sRegirockTMHMLearnset,\n    [SPECIES_REGICE] = sRegiceTMHMLearnset,\n    [SPECIES_REGISTEEL] = sRegisteelTMHMLearnset,\n    [SPECIES_KYOGRE] = sKyogreTMHMLearnset,\n    [SPECIES_GROUDON] = sGroudonTMHMLearnset,\n    [SPECIES_RAYQUAZA] = sRayquazaTMHMLearnset,\n    [SPECIES_LATIAS] = sLatiasTMHMLearnset,\n    [SPECIES_LATIOS] = sLatiosTMHMLearnset,\n    [SPECIES_JIRACHI] = sJirachiTMHMLearnset,\n    [SPECIES_DEOXYS] = sDeoxysTMHMLearnset,\n    [SPECIES_CHIMECHO] = sChimechoTMHMLearnset\n};\n"
  },
  {
    "path": "src/data/pokemon/trainer_class_lookups.h",
    "content": "const u8 gFacilityClassToPicIndex[] =\n{\n    [FACILITY_CLASS_AQUA_LEADER_ARCHIE]     = TRAINER_PIC_AQUA_LEADER_ARCHIE,\n    [FACILITY_CLASS_AQUA_GRUNT_M]           = TRAINER_PIC_AQUA_GRUNT_M,\n    [FACILITY_CLASS_AQUA_GRUNT_F]           = TRAINER_PIC_AQUA_GRUNT_F,\n    [FACILITY_CLASS_RS_AROMA_LADY]          = TRAINER_PIC_RS_AROMA_LADY,\n    [FACILITY_CLASS_RS_RUIN_MANIAC]         = TRAINER_PIC_RS_RUIN_MANIAC,\n    [FACILITY_CLASS_INTERVIEWER]            = TRAINER_PIC_INTERVIEWER,\n    [FACILITY_CLASS_RS_TUBER_F]             = TRAINER_PIC_RS_TUBER_F,\n    [FACILITY_CLASS_RS_TUBER_M]             = TRAINER_PIC_RS_TUBER_M,\n    [FACILITY_CLASS_RS_COOLTRAINER_M]       = TRAINER_PIC_RS_COOLTRAINER_M,\n    [FACILITY_CLASS_RS_COOLTRAINER_F]       = TRAINER_PIC_RS_COOLTRAINER_F,\n    [FACILITY_CLASS_HEX_MANIAC]             = TRAINER_PIC_HEX_MANIAC,\n    [FACILITY_CLASS_RS_LADY]                = TRAINER_PIC_RS_LADY,\n    [FACILITY_CLASS_RS_BEAUTY]              = TRAINER_PIC_RS_BEAUTY,\n    [FACILITY_CLASS_RICH_BOY]               = TRAINER_PIC_RICH_BOY,\n    [FACILITY_CLASS_RS_POKEMANIAC]          = TRAINER_PIC_RS_POKEMANIAC,\n    [FACILITY_CLASS_RS_SWIMMER_M]           = TRAINER_PIC_RS_SWIMMER_M,\n    [FACILITY_CLASS_RS_BLACK_BELT]          = TRAINER_PIC_RS_BLACK_BELT,\n    [FACILITY_CLASS_GUITARIST]              = TRAINER_PIC_GUITARIST,\n    [FACILITY_CLASS_KINDLER]                = TRAINER_PIC_KINDLER,\n    [FACILITY_CLASS_RS_CAMPER]              = TRAINER_PIC_RS_CAMPER,\n    [FACILITY_CLASS_BUG_MANIAC]             = TRAINER_PIC_BUG_MANIAC,\n    [FACILITY_CLASS_RS_PSYCHIC_M]           = TRAINER_PIC_RS_PSYCHIC_M,\n    [FACILITY_CLASS_RS_PSYCHIC_F]           = TRAINER_PIC_RS_PSYCHIC_F,\n    [FACILITY_CLASS_RS_GENTLEMAN]           = TRAINER_PIC_RS_GENTLEMAN,\n    [FACILITY_CLASS_ELITE_FOUR_SIDNEY]      = TRAINER_PIC_ELITE_FOUR_SIDNEY,\n    [FACILITY_CLASS_ELITE_FOUR_PHOEBE]      = TRAINER_PIC_ELITE_FOUR_PHOEBE,\n    [FACILITY_CLASS_LEADER_ROXANNE]         = TRAINER_PIC_LEADER_ROXANNE,\n    [FACILITY_CLASS_LEADER_BRAWLY]          = TRAINER_PIC_LEADER_BRAWLY,\n    [FACILITY_CLASS_LEADER_TATE_AND_LIZA]   = TRAINER_PIC_LEADER_TATE_AND_LIZA,\n    [FACILITY_CLASS_SCHOOL_KID_M]           = TRAINER_PIC_SCHOOL_KID_M,\n    [FACILITY_CLASS_SCHOOL_KID_F]           = TRAINER_PIC_SCHOOL_KID_F,\n    [FACILITY_CLASS_SR_AND_JR]              = TRAINER_PIC_SR_AND_JR,\n    [FACILITY_CLASS_POKEFAN_M]              = TRAINER_PIC_POKEFAN_M,\n    [FACILITY_CLASS_POKEFAN_F]              = TRAINER_PIC_POKEFAN_F,\n    [FACILITY_CLASS_EXPERT_M]               = TRAINER_PIC_EXPERT_M,\n    [FACILITY_CLASS_EXPERT_F]               = TRAINER_PIC_EXPERT_F,\n    [FACILITY_CLASS_RS_YOUNGSTER]           = TRAINER_PIC_RS_YOUNGSTER,\n    [FACILITY_CLASS_CHAMPION_STEVEN]        = TRAINER_PIC_CHAMPION_STEVEN,\n    [FACILITY_CLASS_RS_FISHERMAN]           = TRAINER_PIC_RS_FISHERMAN,\n    [FACILITY_CLASS_CYCLING_TRIATHLETE_M]   = TRAINER_PIC_CYCLING_TRIATHLETE_M,\n    [FACILITY_CLASS_CYCLING_TRIATHLETE_F]   = TRAINER_PIC_CYCLING_TRIATHLETE_F,\n    [FACILITY_CLASS_RUNNING_TRIATHLETE_M]   = TRAINER_PIC_RUNNING_TRIATHLETE_M,\n    [FACILITY_CLASS_RUNNING_TRIATHLETE_F]   = TRAINER_PIC_RUNNING_TRIATHLETE_F,\n    [FACILITY_CLASS_SWIMMING_TRIATHLETE_M]  = TRAINER_PIC_SWIMMING_TRIATHLETE_M,\n    [FACILITY_CLASS_SWIMMING_TRIATHLETE_F]  = TRAINER_PIC_SWIMMING_TRIATHLETE_F,\n    [FACILITY_CLASS_DRAGON_TAMER]           = TRAINER_PIC_DRAGON_TAMER,\n    [FACILITY_CLASS_RS_BIRD_KEEPER]         = TRAINER_PIC_RS_BIRD_KEEPER,\n    [FACILITY_CLASS_NINJA_BOY]              = TRAINER_PIC_NINJA_BOY,\n    [FACILITY_CLASS_BATTLE_GIRL]            = TRAINER_PIC_BATTLE_GIRL,\n    [FACILITY_CLASS_PARASOL_LADY]           = TRAINER_PIC_PARASOL_LADY,\n    [FACILITY_CLASS_RS_SWIMMER_F]           = TRAINER_PIC_RS_SWIMMER_F,\n    [FACILITY_CLASS_RS_PICNICKER]           = TRAINER_PIC_RS_PICNICKER,\n    [FACILITY_CLASS_RS_TWINS]               = TRAINER_PIC_RS_TWINS,\n    [FACILITY_CLASS_RS_SAILOR]              = TRAINER_PIC_RS_SAILOR,\n    [FACILITY_CLASS_BOARDER_M]              = TRAINER_PIC_RS_YOUNGSTER,\n    [FACILITY_CLASS_BOARDER_F]              = TRAINER_PIC_RS_YOUNGSTER,\n    [FACILITY_CLASS_COLLECTOR]              = TRAINER_PIC_COLLECTOR,\n    [FACILITY_CLASS_PKMN_TRAINER_WALLY]     = TRAINER_PIC_WALLY,\n    [FACILITY_CLASS_PKMN_TRAINER_BRENDAN]   = TRAINER_PIC_RS_BRENDAN_1,\n    [FACILITY_CLASS_PKMN_TRAINER_BRENDAN_2] = TRAINER_PIC_RS_BRENDAN_1,\n    [FACILITY_CLASS_PKMN_TRAINER_BRENDAN_3] = TRAINER_PIC_RS_BRENDAN_1,\n    [FACILITY_CLASS_PKMN_TRAINER_MAY]       = TRAINER_PIC_RS_MAY_1,\n    [FACILITY_CLASS_PKMN_TRAINER_MAY_2]     = TRAINER_PIC_RS_MAY_1,\n    [FACILITY_CLASS_PKMN_TRAINER_MAY_3]     = TRAINER_PIC_RS_MAY_1,\n    [FACILITY_CLASS_RS_PKMN_BREEDER_M]      = TRAINER_PIC_RS_POKEMON_BREEDER_M,\n    [FACILITY_CLASS_RS_PKMN_BREEDER_F]      = TRAINER_PIC_RS_POKEMON_BREEDER_F,\n    [FACILITY_CLASS_RS_PKMN_RANGER_M]       = TRAINER_PIC_RS_POKEMON_RANGER_M,\n    [FACILITY_CLASS_RS_PKMN_RANGER_F]       = TRAINER_PIC_RS_POKEMON_RANGER_F,\n    [FACILITY_CLASS_MAGMA_LEADER_MAXIE]     = TRAINER_PIC_MAGMA_LEADER_MAXIE,\n    [FACILITY_CLASS_MAGMA_GRUNT_M]          = TRAINER_PIC_MAGMA_GRUNT_M,\n    [FACILITY_CLASS_MAGMA_GRUNT_F]          = TRAINER_PIC_MAGMA_GRUNT_F,\n    [FACILITY_CLASS_RS_LASS]                = TRAINER_PIC_RS_LASS,\n    [FACILITY_CLASS_RS_BUG_CATCHER]         = TRAINER_PIC_RS_BUG_CATCHER,\n    [FACILITY_CLASS_RS_HIKER]               = TRAINER_PIC_RS_HIKER,\n    [FACILITY_CLASS_RS_YOUNG_COUPLE]        = TRAINER_PIC_RS_YOUNG_COUPLE,\n    [FACILITY_CLASS_OLD_COUPLE]             = TRAINER_PIC_OLD_COUPLE,\n    [FACILITY_CLASS_RS_SIS_AND_BRO]         = TRAINER_PIC_RS_SIS_AND_BRO,\n    [FACILITY_CLASS_AQUA_ADMIN_M]           = TRAINER_PIC_AQUA_ADMIN_M,\n    [FACILITY_CLASS_AQUA_ADMIN_F]           = TRAINER_PIC_AQUA_ADMIN_F,\n    [FACILITY_CLASS_MAGMA_ADMIN_M]          = TRAINER_PIC_MAGMA_ADMIN_M,\n    [FACILITY_CLASS_MAGMA_ADMIN_F]          = TRAINER_PIC_MAGMA_ADMIN_F,\n    [FACILITY_CLASS_LEADER_WATTSON]         = TRAINER_PIC_LEADER_WATTSON,\n    [FACILITY_CLASS_LEADER_FLANNERY]        = TRAINER_PIC_LEADER_FLANNERY,\n    [FACILITY_CLASS_LEADER_NORMAN]          = TRAINER_PIC_LEADER_NORMAN,\n    [FACILITY_CLASS_LEADER_WINONA]          = TRAINER_PIC_LEADER_WINONA,\n    [FACILITY_CLASS_LEADER_WALLACE]         = TRAINER_PIC_LEADER_WALLACE,\n    [FACILITY_CLASS_ELITE_FOUR_GLACIA]      = TRAINER_PIC_ELITE_FOUR_GLACIA,\n    [FACILITY_CLASS_ELITE_FOUR_DRAKE]       = TRAINER_PIC_ELITE_FOUR_DRAKE,\n    [FACILITY_CLASS_YOUNGSTER]              = TRAINER_PIC_YOUNGSTER,\n    [FACILITY_CLASS_BUG_CATCHER]            = TRAINER_PIC_BUG_CATCHER,\n    [FACILITY_CLASS_LASS]                   = TRAINER_PIC_LASS,\n    [FACILITY_CLASS_SAILOR]                 = TRAINER_PIC_SAILOR,\n    [FACILITY_CLASS_CAMPER]                 = TRAINER_PIC_CAMPER,\n    [FACILITY_CLASS_PICNICKER]              = TRAINER_PIC_PICNICKER,\n    [FACILITY_CLASS_POKEMANIAC]             = TRAINER_PIC_POKEMANIAC,\n    [FACILITY_CLASS_SUPER_NERD]             = TRAINER_PIC_SUPER_NERD,\n    [FACILITY_CLASS_HIKER]                  = TRAINER_PIC_HIKER,\n    [FACILITY_CLASS_BIKER]                  = TRAINER_PIC_BIKER,\n    [FACILITY_CLASS_BURGLAR]                = TRAINER_PIC_BURGLAR,\n    [FACILITY_CLASS_ENGINEER]               = TRAINER_PIC_ENGINEER,\n    [FACILITY_CLASS_FISHERMAN]              = TRAINER_PIC_FISHERMAN,\n    [FACILITY_CLASS_SWIMMER_M]              = TRAINER_PIC_SWIMMER_M,\n    [FACILITY_CLASS_CUE_BALL]               = TRAINER_PIC_CUE_BALL,\n    [FACILITY_CLASS_GAMER]                  = TRAINER_PIC_GAMER,\n    [FACILITY_CLASS_BEAUTY]                 = TRAINER_PIC_BEAUTY,\n    [FACILITY_CLASS_SWIMMER_F]              = TRAINER_PIC_SWIMMER_F,\n    [FACILITY_CLASS_PSYCHIC_M]              = TRAINER_PIC_PSYCHIC_M,\n    [FACILITY_CLASS_ROCKER]                 = TRAINER_PIC_ROCKER,\n    [FACILITY_CLASS_JUGGLER]                = TRAINER_PIC_JUGGLER,\n    [FACILITY_CLASS_TAMER]                  = TRAINER_PIC_TAMER,\n    [FACILITY_CLASS_BIRD_KEEPER]            = TRAINER_PIC_BIRD_KEEPER,\n    [FACILITY_CLASS_BLACK_BELT]             = TRAINER_PIC_BLACK_BELT,\n    [FACILITY_CLASS_RIVAL_EARLY]            = TRAINER_PIC_RIVAL_EARLY,\n    [FACILITY_CLASS_SCIENTIST]              = TRAINER_PIC_SCIENTIST,\n    [FACILITY_CLASS_BOSS]                   = TRAINER_PIC_LEADER_GIOVANNI,\n    [FACILITY_CLASS_ROCKET_GRUNT_M]         = TRAINER_PIC_ROCKET_GRUNT_M,\n    [FACILITY_CLASS_COOLTRAINER_M]          = TRAINER_PIC_COOLTRAINER_M,\n    [FACILITY_CLASS_COOLTRAINER_F]          = TRAINER_PIC_COOLTRAINER_F,\n    [FACILITY_CLASS_ELITE_FOUR_LORELEI]     = TRAINER_PIC_ELITE_FOUR_LORELEI,\n    [FACILITY_CLASS_ELITE_FOUR_BRUNO]       = TRAINER_PIC_ELITE_FOUR_BRUNO,\n    [FACILITY_CLASS_LEADER_M]               = TRAINER_PIC_LEADER_BROCK,\n    [FACILITY_CLASS_LEADER_F]               = TRAINER_PIC_LEADER_MISTY,\n    [FACILITY_CLASS_GENTLEMAN]              = TRAINER_PIC_GENTLEMAN,\n    [FACILITY_CLASS_RIVAL_LATE]             = TRAINER_PIC_RIVAL_LATE,\n    [FACILITY_CLASS_CHAMPION_RIVAL]         = TRAINER_PIC_CHAMPION_RIVAL,\n    [FACILITY_CLASS_CHANNELER]              = TRAINER_PIC_CHANNELER,\n    [FACILITY_CLASS_TWINS]                  = TRAINER_PIC_TWINS,\n    [FACILITY_CLASS_COOL_COUPLE]            = TRAINER_PIC_COOL_COUPLE,\n    [FACILITY_CLASS_YOUNG_COUPLE]           = TRAINER_PIC_YOUNG_COUPLE,\n    [FACILITY_CLASS_CRUSH_KIN]              = TRAINER_PIC_CRUSH_KIN,\n    [FACILITY_CLASS_SIS_AND_BRO]            = TRAINER_PIC_SIS_AND_BRO,\n    [FACILITY_CLASS_PKMN_PROF]              = TRAINER_PIC_PROFESSOR_OAK,\n    [FACILITY_CLASS_BRENDAN]                = TRAINER_PIC_RS_BRENDAN_2,\n    [FACILITY_CLASS_MAY]                    = TRAINER_PIC_RS_MAY_2,\n    [FACILITY_CLASS_RED]                    = TRAINER_PIC_RED,\n    [FACILITY_CLASS_LEAF]                   = TRAINER_PIC_LEAF,\n    [FACILITY_CLASS_ROCKET_GRUNT_F]         = TRAINER_PIC_ROCKET_GRUNT_F,\n    [FACILITY_CLASS_PSYCHIC_F]              = TRAINER_PIC_PSYCHIC_F,\n    [FACILITY_CLASS_CRUSH_GIRL]             = TRAINER_PIC_CRUSH_GIRL,\n    [FACILITY_CLASS_TUBER]                  = TRAINER_PIC_TUBER_F,\n    [FACILITY_CLASS_PKMN_BREEDER]           = TRAINER_PIC_POKEMON_BREEDER,\n    [FACILITY_CLASS_PKMN_RANGER_M]          = TRAINER_PIC_POKEMON_RANGER_M,\n    [FACILITY_CLASS_PKMN_RANGER_F]          = TRAINER_PIC_POKEMON_RANGER_F,\n    [FACILITY_CLASS_AROMA_LADY]             = TRAINER_PIC_AROMA_LADY,\n    [FACILITY_CLASS_RUIN_MANIAC]            = TRAINER_PIC_RUIN_MANIAC,\n    [FACILITY_CLASS_LADY]                   = TRAINER_PIC_LADY,\n    [FACILITY_CLASS_PAINTER]                = TRAINER_PIC_PAINTER,\n    [FACILITY_CLASS_ELITE_FOUR_AGATHA]      = TRAINER_PIC_ELITE_FOUR_AGATHA,\n    [FACILITY_CLASS_ELITE_FOUR_LANCE]       = TRAINER_PIC_ELITE_FOUR_LANCE,\n    [FACILITY_CLASS_CHAMPION_RIVAL_2]       = TRAINER_PIC_CHAMPION_RIVAL,\n    [FACILITY_CLASS_EM_BRENDAN]             = TRAINER_PIC_EM_BRENDAN,\n    [FACILITY_CLASS_EM_MAY]                 = TRAINER_PIC_EM_MAY,\n};\n\nconst u8 gFacilityClassToTrainerClass[] =\n{\n    [FACILITY_CLASS_AQUA_LEADER_ARCHIE]     = TRAINER_CLASS_AQUA_LEADER,\n    [FACILITY_CLASS_AQUA_GRUNT_M]           = TRAINER_CLASS_TEAM_AQUA,\n    [FACILITY_CLASS_AQUA_GRUNT_F]           = TRAINER_CLASS_TEAM_AQUA,\n    [FACILITY_CLASS_RS_AROMA_LADY]          = TRAINER_CLASS_RS_AROMA_LADY,\n    [FACILITY_CLASS_RS_RUIN_MANIAC]         = TRAINER_CLASS_RS_RUIN_MANIAC,\n    [FACILITY_CLASS_INTERVIEWER]            = TRAINER_CLASS_INTERVIEWER,\n    [FACILITY_CLASS_RS_TUBER_F]             = TRAINER_CLASS_RS_TUBER_F,\n    [FACILITY_CLASS_RS_TUBER_M]             = TRAINER_CLASS_RS_TUBER_M,\n    [FACILITY_CLASS_RS_COOLTRAINER_M]       = TRAINER_CLASS_RS_COOLTRAINER,\n    [FACILITY_CLASS_RS_COOLTRAINER_F]       = TRAINER_CLASS_RS_COOLTRAINER,\n    [FACILITY_CLASS_HEX_MANIAC]             = TRAINER_CLASS_HEX_MANIAC,\n    [FACILITY_CLASS_RS_LADY]                = TRAINER_CLASS_RS_LADY,\n    [FACILITY_CLASS_RS_BEAUTY]              = TRAINER_CLASS_RS_BEAUTY,\n    [FACILITY_CLASS_RICH_BOY]               = TRAINER_CLASS_RICH_BOY,\n    [FACILITY_CLASS_RS_POKEMANIAC]          = TRAINER_CLASS_RS_POKEMANIAC,\n    [FACILITY_CLASS_RS_SWIMMER_M]           = TRAINER_CLASS_RS_SWIMMER_M,\n    [FACILITY_CLASS_RS_BLACK_BELT]          = TRAINER_CLASS_RS_BLACK_BELT,\n    [FACILITY_CLASS_GUITARIST]              = TRAINER_CLASS_GUITARIST,\n    [FACILITY_CLASS_KINDLER]                = TRAINER_CLASS_KINDLER,\n    [FACILITY_CLASS_RS_CAMPER]              = TRAINER_CLASS_RS_CAMPER,\n    [FACILITY_CLASS_BUG_MANIAC]             = TRAINER_CLASS_BUG_MANIAC,\n    [FACILITY_CLASS_RS_PSYCHIC_M]           = TRAINER_CLASS_RS_PSYCHIC,\n    [FACILITY_CLASS_RS_PSYCHIC_F]           = TRAINER_CLASS_RS_PSYCHIC,\n    [FACILITY_CLASS_RS_GENTLEMAN]           = TRAINER_CLASS_RS_GENTLEMAN,\n    [FACILITY_CLASS_ELITE_FOUR_SIDNEY]      = TRAINER_CLASS_RS_ELITE_FOUR,\n    [FACILITY_CLASS_ELITE_FOUR_PHOEBE]      = TRAINER_CLASS_RS_ELITE_FOUR,\n    [FACILITY_CLASS_LEADER_ROXANNE]         = TRAINER_CLASS_RS_LEADER,\n    [FACILITY_CLASS_LEADER_BRAWLY]          = TRAINER_CLASS_RS_LEADER,\n    [FACILITY_CLASS_LEADER_TATE_AND_LIZA]   = TRAINER_CLASS_RS_LEADER,\n    [FACILITY_CLASS_SCHOOL_KID_M]           = TRAINER_CLASS_SCHOOL_KID,\n    [FACILITY_CLASS_SCHOOL_KID_F]           = TRAINER_CLASS_SCHOOL_KID,\n    [FACILITY_CLASS_SR_AND_JR]              = TRAINER_CLASS_SR_AND_JR,\n    [FACILITY_CLASS_POKEFAN_M]              = TRAINER_CLASS_POKEFAN,\n    [FACILITY_CLASS_POKEFAN_F]              = TRAINER_CLASS_POKEFAN,\n    [FACILITY_CLASS_EXPERT_M]               = TRAINER_CLASS_EXPERT,\n    [FACILITY_CLASS_EXPERT_F]               = TRAINER_CLASS_EXPERT,\n    [FACILITY_CLASS_RS_YOUNGSTER]           = TRAINER_CLASS_RS_YOUNGSTER,\n    [FACILITY_CLASS_CHAMPION_STEVEN]        = TRAINER_CLASS_RS_CHAMPION,\n    [FACILITY_CLASS_RS_FISHERMAN]           = TRAINER_CLASS_RS_FISHERMAN,\n    [FACILITY_CLASS_CYCLING_TRIATHLETE_M]   = TRAINER_CLASS_TRIATHLETE,\n    [FACILITY_CLASS_CYCLING_TRIATHLETE_F]   = TRAINER_CLASS_TRIATHLETE,\n    [FACILITY_CLASS_RUNNING_TRIATHLETE_M]   = TRAINER_CLASS_TRIATHLETE,\n    [FACILITY_CLASS_RUNNING_TRIATHLETE_F]   = TRAINER_CLASS_TRIATHLETE,\n    [FACILITY_CLASS_SWIMMING_TRIATHLETE_M]  = TRAINER_CLASS_TRIATHLETE,\n    [FACILITY_CLASS_SWIMMING_TRIATHLETE_F]  = TRAINER_CLASS_TRIATHLETE,\n    [FACILITY_CLASS_DRAGON_TAMER]           = TRAINER_CLASS_DRAGON_TAMER,\n    [FACILITY_CLASS_RS_BIRD_KEEPER]         = TRAINER_CLASS_RS_BIRD_KEEPER,\n    [FACILITY_CLASS_NINJA_BOY]              = TRAINER_CLASS_NINJA_BOY,\n    [FACILITY_CLASS_BATTLE_GIRL]            = TRAINER_CLASS_BATTLE_GIRL,\n    [FACILITY_CLASS_PARASOL_LADY]           = TRAINER_CLASS_PARASOL_LADY,\n    [FACILITY_CLASS_RS_SWIMMER_F]           = TRAINER_CLASS_RS_SWIMMER_F,\n    [FACILITY_CLASS_RS_PICNICKER]           = TRAINER_CLASS_RS_PICNICKER,\n    [FACILITY_CLASS_RS_TWINS]               = TRAINER_CLASS_RS_TWINS,\n    [FACILITY_CLASS_RS_SAILOR]              = TRAINER_CLASS_RS_SAILOR,\n    [FACILITY_CLASS_BOARDER_M]              = TRAINER_CLASS_BOARDER,\n    [FACILITY_CLASS_BOARDER_F]              = TRAINER_CLASS_BOARDER,\n    [FACILITY_CLASS_COLLECTOR]              = TRAINER_CLASS_COLLECTOR,\n    [FACILITY_CLASS_PKMN_TRAINER_WALLY]     = TRAINER_CLASS_PKMN_TRAINER,\n    [FACILITY_CLASS_PKMN_TRAINER_BRENDAN]   = TRAINER_CLASS_PKMN_TRAINER,\n    [FACILITY_CLASS_PKMN_TRAINER_BRENDAN_2] = TRAINER_CLASS_PKMN_TRAINER,\n    [FACILITY_CLASS_PKMN_TRAINER_BRENDAN_3] = TRAINER_CLASS_PKMN_TRAINER,\n    [FACILITY_CLASS_PKMN_TRAINER_MAY]       = TRAINER_CLASS_PKMN_TRAINER,\n    [FACILITY_CLASS_PKMN_TRAINER_MAY_2]     = TRAINER_CLASS_PKMN_TRAINER,\n    [FACILITY_CLASS_PKMN_TRAINER_MAY_3]     = TRAINER_CLASS_PKMN_TRAINER,\n    [FACILITY_CLASS_RS_PKMN_BREEDER_M]      = TRAINER_CLASS_RS_PKMN_BREEDER,\n    [FACILITY_CLASS_RS_PKMN_BREEDER_F]      = TRAINER_CLASS_RS_PKMN_BREEDER,\n    [FACILITY_CLASS_RS_PKMN_RANGER_M]       = TRAINER_CLASS_RS_PKMN_RANGER,\n    [FACILITY_CLASS_RS_PKMN_RANGER_F]       = TRAINER_CLASS_RS_PKMN_RANGER,\n    [FACILITY_CLASS_MAGMA_LEADER_MAXIE]     = TRAINER_CLASS_MAGMA_LEADER,\n    [FACILITY_CLASS_MAGMA_GRUNT_M]          = TRAINER_CLASS_TEAM_MAGMA,\n    [FACILITY_CLASS_MAGMA_GRUNT_F]          = TRAINER_CLASS_TEAM_MAGMA,\n    [FACILITY_CLASS_RS_LASS]                = TRAINER_CLASS_RS_LASS,\n    [FACILITY_CLASS_RS_BUG_CATCHER]         = TRAINER_CLASS_RS_BUG_CATCHER,\n    [FACILITY_CLASS_RS_HIKER]               = TRAINER_CLASS_RS_HIKER,\n    [FACILITY_CLASS_RS_YOUNG_COUPLE]        = TRAINER_CLASS_RS_YOUNG_COUPLE,\n    [FACILITY_CLASS_OLD_COUPLE]             = TRAINER_CLASS_OLD_COUPLE,\n    [FACILITY_CLASS_RS_SIS_AND_BRO]         = TRAINER_CLASS_RS_SIS_AND_BRO,\n    [FACILITY_CLASS_AQUA_ADMIN_M]           = TRAINER_CLASS_AQUA_ADMIN,\n    [FACILITY_CLASS_AQUA_ADMIN_F]           = TRAINER_CLASS_AQUA_ADMIN,\n    [FACILITY_CLASS_MAGMA_ADMIN_M]          = TRAINER_CLASS_MAGMA_ADMIN,\n    [FACILITY_CLASS_MAGMA_ADMIN_F]          = TRAINER_CLASS_MAGMA_ADMIN,\n    [FACILITY_CLASS_LEADER_WATTSON]         = TRAINER_CLASS_RS_LEADER,\n    [FACILITY_CLASS_LEADER_FLANNERY]        = TRAINER_CLASS_RS_LEADER,\n    [FACILITY_CLASS_LEADER_NORMAN]          = TRAINER_CLASS_RS_LEADER,\n    [FACILITY_CLASS_LEADER_WINONA]          = TRAINER_CLASS_RS_LEADER,\n    [FACILITY_CLASS_LEADER_WALLACE]         = TRAINER_CLASS_RS_LEADER,\n    [FACILITY_CLASS_ELITE_FOUR_GLACIA]      = TRAINER_CLASS_RS_ELITE_FOUR,\n    [FACILITY_CLASS_ELITE_FOUR_DRAKE]       = TRAINER_CLASS_RS_ELITE_FOUR,\n    [FACILITY_CLASS_YOUNGSTER]              = TRAINER_CLASS_YOUNGSTER,\n    [FACILITY_CLASS_BUG_CATCHER]            = TRAINER_CLASS_BUG_CATCHER,\n    [FACILITY_CLASS_LASS]                   = TRAINER_CLASS_LASS,\n    [FACILITY_CLASS_SAILOR]                 = TRAINER_CLASS_SAILOR,\n    [FACILITY_CLASS_CAMPER]                 = TRAINER_CLASS_CAMPER,\n    [FACILITY_CLASS_PICNICKER]              = TRAINER_CLASS_PICNICKER,\n    [FACILITY_CLASS_POKEMANIAC]             = TRAINER_CLASS_POKEMANIAC,\n    [FACILITY_CLASS_SUPER_NERD]             = TRAINER_CLASS_SUPER_NERD,\n    [FACILITY_CLASS_HIKER]                  = TRAINER_CLASS_HIKER,\n    [FACILITY_CLASS_BIKER]                  = TRAINER_CLASS_BIKER,\n    [FACILITY_CLASS_BURGLAR]                = TRAINER_CLASS_BURGLAR,\n    [FACILITY_CLASS_ENGINEER]               = TRAINER_CLASS_ENGINEER,\n    [FACILITY_CLASS_FISHERMAN]              = TRAINER_CLASS_FISHERMAN,\n    [FACILITY_CLASS_SWIMMER_M]              = TRAINER_CLASS_SWIMMER_M,\n    [FACILITY_CLASS_CUE_BALL]               = TRAINER_CLASS_CUE_BALL,\n    [FACILITY_CLASS_GAMER]                  = TRAINER_CLASS_GAMER,\n    [FACILITY_CLASS_BEAUTY]                 = TRAINER_CLASS_BEAUTY,\n    [FACILITY_CLASS_SWIMMER_F]              = TRAINER_CLASS_SWIMMER_F,\n    [FACILITY_CLASS_PSYCHIC_M]              = TRAINER_CLASS_PSYCHIC,\n    [FACILITY_CLASS_ROCKER]                 = TRAINER_CLASS_ROCKER,\n    [FACILITY_CLASS_JUGGLER]                = TRAINER_CLASS_JUGGLER,\n    [FACILITY_CLASS_TAMER]                  = TRAINER_CLASS_TAMER,\n    [FACILITY_CLASS_BIRD_KEEPER]            = TRAINER_CLASS_BIRD_KEEPER,\n    [FACILITY_CLASS_BLACK_BELT]             = TRAINER_CLASS_BLACK_BELT,\n    [FACILITY_CLASS_RIVAL_EARLY]            = TRAINER_CLASS_RIVAL_EARLY,\n    [FACILITY_CLASS_SCIENTIST]              = TRAINER_CLASS_SCIENTIST,\n    [FACILITY_CLASS_BOSS]                   = TRAINER_CLASS_BOSS,\n    [FACILITY_CLASS_ROCKET_GRUNT_M]         = TRAINER_CLASS_TEAM_ROCKET,\n    [FACILITY_CLASS_COOLTRAINER_M]          = TRAINER_CLASS_COOLTRAINER,\n    [FACILITY_CLASS_COOLTRAINER_F]          = TRAINER_CLASS_COOLTRAINER,\n    [FACILITY_CLASS_ELITE_FOUR_LORELEI]     = TRAINER_CLASS_ELITE_FOUR,\n    [FACILITY_CLASS_ELITE_FOUR_BRUNO]       = TRAINER_CLASS_ELITE_FOUR,\n    [FACILITY_CLASS_LEADER_M]               = TRAINER_CLASS_LEADER,\n    [FACILITY_CLASS_LEADER_F]               = TRAINER_CLASS_LEADER,\n    [FACILITY_CLASS_GENTLEMAN]              = TRAINER_CLASS_GENTLEMAN,\n    [FACILITY_CLASS_RIVAL_LATE]             = TRAINER_CLASS_RIVAL_LATE,\n    [FACILITY_CLASS_CHAMPION_RIVAL]         = TRAINER_CLASS_CHAMPION,\n    [FACILITY_CLASS_CHANNELER]              = TRAINER_CLASS_CHANNELER,\n    [FACILITY_CLASS_TWINS]                  = TRAINER_CLASS_TWINS,\n    [FACILITY_CLASS_COOL_COUPLE]            = TRAINER_CLASS_COOL_COUPLE,\n    [FACILITY_CLASS_YOUNG_COUPLE]           = TRAINER_CLASS_YOUNG_COUPLE,\n    [FACILITY_CLASS_CRUSH_KIN]              = TRAINER_CLASS_CRUSH_KIN,\n    [FACILITY_CLASS_SIS_AND_BRO]            = TRAINER_CLASS_SIS_AND_BRO,\n    [FACILITY_CLASS_PKMN_PROF]              = TRAINER_CLASS_PKMN_PROF,\n    [FACILITY_CLASS_BRENDAN]                = TRAINER_CLASS_PLAYER,\n    [FACILITY_CLASS_MAY]                    = TRAINER_CLASS_PLAYER,\n    [FACILITY_CLASS_RED]                    = TRAINER_CLASS_PLAYER,\n    [FACILITY_CLASS_LEAF]                   = TRAINER_CLASS_PLAYER,\n    [FACILITY_CLASS_ROCKET_GRUNT_F]         = TRAINER_CLASS_TEAM_ROCKET,\n    [FACILITY_CLASS_PSYCHIC_F]              = TRAINER_CLASS_PSYCHIC,\n    [FACILITY_CLASS_CRUSH_GIRL]             = TRAINER_CLASS_CRUSH_GIRL,\n    [FACILITY_CLASS_TUBER]                  = TRAINER_CLASS_TUBER,\n    [FACILITY_CLASS_PKMN_BREEDER]           = TRAINER_CLASS_PKMN_BREEDER,\n    [FACILITY_CLASS_PKMN_RANGER_M]          = TRAINER_CLASS_PKMN_RANGER,\n    [FACILITY_CLASS_PKMN_RANGER_F]          = TRAINER_CLASS_PKMN_RANGER,\n    [FACILITY_CLASS_AROMA_LADY]             = TRAINER_CLASS_AROMA_LADY,\n    [FACILITY_CLASS_RUIN_MANIAC]            = TRAINER_CLASS_RUIN_MANIAC,\n    [FACILITY_CLASS_LADY]                   = TRAINER_CLASS_LADY,\n    [FACILITY_CLASS_PAINTER]                = TRAINER_CLASS_PAINTER,\n    [FACILITY_CLASS_ELITE_FOUR_AGATHA]      = TRAINER_CLASS_ELITE_FOUR,\n    [FACILITY_CLASS_ELITE_FOUR_LANCE]       = TRAINER_CLASS_ELITE_FOUR,\n    [FACILITY_CLASS_CHAMPION_RIVAL_2]       = TRAINER_CLASS_CHAMPION,\n    [FACILITY_CLASS_EM_BRENDAN]             = TRAINER_CLASS_PKMN_TRAINER,\n    [FACILITY_CLASS_EM_MAY]                 = TRAINER_CLASS_PKMN_TRAINER,\n};\n"
  },
  {
    "path": "src/data/pokemon/tutor_learnsets.h",
    "content": "const u16 sTutorMoves[TUTOR_MOVE_COUNT] =\n{\n    [TUTOR_MOVE_MEGA_PUNCH] = MOVE_MEGA_PUNCH,\n    [TUTOR_MOVE_SWORDS_DANCE] = MOVE_SWORDS_DANCE,\n    [TUTOR_MOVE_MEGA_KICK] = MOVE_MEGA_KICK,\n    [TUTOR_MOVE_BODY_SLAM] = MOVE_BODY_SLAM,\n    [TUTOR_MOVE_DOUBLE_EDGE] = MOVE_DOUBLE_EDGE,\n    [TUTOR_MOVE_COUNTER] = MOVE_COUNTER,\n    [TUTOR_MOVE_SEISMIC_TOSS] = MOVE_SEISMIC_TOSS,\n    [TUTOR_MOVE_MIMIC] = MOVE_MIMIC,\n    [TUTOR_MOVE_METRONOME] = MOVE_METRONOME,\n    [TUTOR_MOVE_SOFT_BOILED] = MOVE_SOFT_BOILED,\n    [TUTOR_MOVE_DREAM_EATER] = MOVE_DREAM_EATER,\n    [TUTOR_MOVE_THUNDER_WAVE] = MOVE_THUNDER_WAVE,\n    [TUTOR_MOVE_EXPLOSION] = MOVE_EXPLOSION,\n    [TUTOR_MOVE_ROCK_SLIDE] = MOVE_ROCK_SLIDE,\n    [TUTOR_MOVE_SUBSTITUTE] = MOVE_SUBSTITUTE,\n    [TUTOR_MOVE_DYNAMIC_PUNCH] = MOVE_DYNAMIC_PUNCH,\n    [TUTOR_MOVE_ROLLOUT] = MOVE_ROLLOUT,\n    [TUTOR_MOVE_PSYCH_UP] = MOVE_PSYCH_UP,\n    [TUTOR_MOVE_SNORE] = MOVE_SNORE,\n    [TUTOR_MOVE_ICY_WIND] = MOVE_ICY_WIND,\n    [TUTOR_MOVE_ENDURE] = MOVE_ENDURE,\n    [TUTOR_MOVE_MUD_SLAP] = MOVE_MUD_SLAP,\n    [TUTOR_MOVE_ICE_PUNCH] = MOVE_ICE_PUNCH,\n    [TUTOR_MOVE_SWAGGER] = MOVE_SWAGGER,\n    [TUTOR_MOVE_SLEEP_TALK] = MOVE_SLEEP_TALK,\n    [TUTOR_MOVE_SWIFT] = MOVE_SWIFT,\n    [TUTOR_MOVE_DEFENSE_CURL] = MOVE_DEFENSE_CURL,\n    [TUTOR_MOVE_THUNDER_PUNCH] = MOVE_THUNDER_PUNCH,\n    [TUTOR_MOVE_FIRE_PUNCH] = MOVE_FIRE_PUNCH,\n    [TUTOR_MOVE_FURY_CUTTER] = MOVE_FURY_CUTTER,\n    [TUTOR_MOVE_NIGHTMARE] = MOVE_NIGHTMARE,\n    [TUTOR_MOVE_SELF_DESTRUCT] = MOVE_SELF_DESTRUCT,\n    [TUTOR_MOVE_SKY_ATTACK] = MOVE_SKY_ATTACK,\n\n};\n\n#define TUTOR(move) ((u64)1 << (TUTOR_##move))\n\nstatic const u64 sTutorLearnsets[] =\n{\n    [SPECIES_NONE]             = (0),\n\n    [SPECIES_BULBASAUR]        = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_IVYSAUR]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_VENUSAUR]         = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_CHARMANDER]       = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_CHARMELEON]       = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_CHARIZARD]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SQUIRTLE]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_WARTORTLE]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_BLASTOISE]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_CATERPIE]         = (0),\n\n    [SPECIES_METAPOD]          = (0),\n\n    [SPECIES_BUTTERFREE]       = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_WEEDLE]           = (0),\n\n    [SPECIES_KAKUNA]           = (0),\n\n    [SPECIES_BEEDRILL]         = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_PIDGEY]           = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_PIDGEOTTO]        = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_PIDGEOT]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_RATTATA]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_RATICATE]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_SPEAROW]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_FEAROW]           = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_EKANS]            = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_ARBOK]            = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_PIKACHU]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)),\n\n    [SPECIES_RAICHU]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)),\n\n    [SPECIES_SANDSHREW]        = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SANDSLASH]        = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_NIDORAN_F]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_NIDORINA]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_NIDOQUEEN]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_NIDORAN_M]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_NIDORINO]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_NIDOKING]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_CLEFAIRY]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SOFT_BOILED)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_CLEFABLE]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SOFT_BOILED)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_VULPIX]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_NINETALES]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_JIGGLYPUFF]       = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_WIGGLYTUFF]       = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_ZUBAT]            = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_GOLBAT]           = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_ODDISH]           = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_GLOOM]            = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_VILEPLUME]        = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_PARAS]            = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_PARASECT]         = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_VENONAT]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_VENOMOTH]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_DIGLETT]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_DUGTRIO]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_MEOWTH]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_PERSIAN]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_PSYDUCK]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_GOLDUCK]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_MANKEY]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_PRIMEAPE]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_GROWLITHE]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_ARCANINE]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_POLIWAG]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_POLIWHIRL]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_POLIWRATH]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_ABRA]             = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_KADABRA]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_ALAKAZAM]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_MACHOP]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_MACHOKE]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_MACHAMP]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_BELLSPROUT]       = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_WEEPINBELL]       = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_VICTREEBEL]       = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_TENTACOOL]        = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_TENTACRUEL]       = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_GEODUDE]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_GRAVELER]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_GOLEM]            = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_PONYTA]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_RAPIDASH]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_SLOWPOKE]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_SLOWBRO]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_MAGNEMITE]        = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_MAGNETON]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_FARFETCHD]        = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_DODUO]            = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_DODRIO]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_SEEL]             = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_DEWGONG]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_GRIMER]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_MUK]              = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_SHELLDER]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_CLOYSTER]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_GASTLY]           = (TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_HAUNTER]          = (TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_GENGAR]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_ONIX]             = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_DROWZEE]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_HYPNO]            = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_KRABBY]           = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_KINGLER]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_VOLTORB]          = (TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_ELECTRODE]        = (TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_EXEGGCUTE]        = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_EXEGGUTOR]        = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_CUBONE]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_MAROWAK]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_HITMONLEE]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_HITMONCHAN]       = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_LICKITUNG]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_KOFFING]          = (TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_WEEZING]          = (TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_RHYHORN]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_RHYDON]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_CHANSEY]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SOFT_BOILED)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_TANGELA]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_KANGASKHAN]       = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_HORSEA]           = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_SEADRA]           = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_GOLDEEN]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_SEAKING]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_STARYU]           = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_STARMIE]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_MR_MIME]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_SCYTHER]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_JYNX]             = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_ELECTABUZZ]       = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_MAGMAR]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_PINSIR]           = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_TAUROS]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_MAGIKARP]         = (0),\n\n    [SPECIES_GYARADOS]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_LAPRAS]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_DITTO]            = (0),\n\n    [SPECIES_EEVEE]            = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_VAPOREON]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_JOLTEON]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_FLAREON]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_PORYGON]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_OMANYTE]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_OMASTAR]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_KABUTO]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_KABUTOPS]         = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_AERODACTYL]       = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_SNORLAX]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_ARTICUNO]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_ZAPDOS]           = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_MOLTRES]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_DRATINI]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_DRAGONAIR]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_DRAGONITE]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_MEWTWO]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_MEW]              = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SOFT_BOILED)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SELF_DESTRUCT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_CHIKORITA]        = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_BAYLEEF]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_MEGANIUM]         = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_CYNDAQUIL]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_QUILAVA]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_TYPHLOSION]       = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_TOTODILE]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_CROCONAW]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_FERALIGATR]       = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SENTRET]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_FURRET]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_HOOTHOOT]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_NOCTOWL]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_LEDYBA]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)),\n\n    [SPECIES_LEDIAN]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)),\n\n    [SPECIES_SPINARAK]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_ARIADOS]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_CROBAT]           = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_CHINCHOU]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_LANTURN]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_PICHU]            = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_CLEFFA]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SOFT_BOILED)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_IGGLYBUFF]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_TOGEPI]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SOFT_BOILED)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_TOGETIC]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SOFT_BOILED)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_NATU]             = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_XATU]             = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_MAREEP]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_FLAAFFY]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_AMPHAROS]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_BELLOSSOM]        = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_MARILL]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_AZUMARILL]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_SUDOWOODO]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_POLITOED]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_HOPPIP]           = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_SKIPLOOM]         = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_JUMPLUFF]         = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_AIPOM]            = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_SUNKERN]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_SUNFLORA]         = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_YANMA]            = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_WOOPER]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_QUAGSIRE]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_ESPEON]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_UMBREON]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_MURKROW]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_SLOWKING]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_MISDREAVUS]       = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_UNOWN]            = (0),\n\n    [SPECIES_WOBBUFFET]        = (0),\n\n    [SPECIES_GIRAFARIG]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_PINECO]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_FORRETRESS]       = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_DUNSPARCE]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_GLIGAR]           = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_STEELIX]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_SNUBBULL]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_GRANBULL]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_QWILFISH]         = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_SCIZOR]           = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SHUCKLE]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_HERACROSS]        = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SNEASEL]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_TEDDIURSA]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_URSARING]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SLUGMA]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_MAGCARGO]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_SWINUB]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_PILOSWINE]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_CORSOLA]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_REMORAID]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_OCTILLERY]        = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_DELIBIRD]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_MANTINE]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_SKARMORY]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_HOUNDOUR]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_HOUNDOOM]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_KINGDRA]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_PHANPY]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_DONPHAN]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_PORYGON2]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_STANTLER]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_SMEARGLE]         = (0),\n\n    [SPECIES_TYROGUE]          = (TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_HITMONTOP]        = (TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_SMOOCHUM]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_ELEKID]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_MAGBY]            = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_MILTANK]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_BLISSEY]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SOFT_BOILED)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_RAIKOU]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_ENTEI]            = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_SUICUNE]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_LARVITAR]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_PUPITAR]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_TYRANITAR]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_LUGIA]            = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_HO_OH]            = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_CELEBI]           = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_TREECKO]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_GROVYLE]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SCEPTILE]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_TORCHIC]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_COMBUSKEN]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_BLAZIKEN]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_MUDKIP]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_MARSHTOMP]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_SWAMPERT]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_POOCHYENA]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_MIGHTYENA]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_ZIGZAGOON]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_LINOONE]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_WURMPLE]          = (0),\n\n    [SPECIES_SILCOON]          = (0),\n\n    [SPECIES_BEAUTIFLY]        = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_CASCOON]          = (0),\n\n    [SPECIES_DUSTOX]           = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_LOTAD]            = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_LOMBRE]           = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_LUDICOLO]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_SEEDOT]           = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_NUZLEAF]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_SHIFTRY]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_NINCADA]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_NINJASK]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SHEDINJA]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_TAILLOW]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_SWELLOW]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_SHROOMISH]        = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_BRELOOM]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SPINDA]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_WINGULL]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_PELIPPER]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_SURSKIT]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_MASQUERAIN]       = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_WAILMER]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_WAILORD]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_SKITTY]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_DELCATTY]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_KECLEON]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_BALTOY]           = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_CLAYDOL]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_NOSEPASS]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_TORKOAL]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_SABLEYE]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_BARBOACH]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_WHISCASH]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_LUVDISC]          = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_CORPHISH]         = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_CRAWDAUNT]        = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_FEEBAS]           = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_MILOTIC]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_CARVANHA]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SHARPEDO]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_TRAPINCH]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_VIBRAVA]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_FLYGON]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_MAKUHITA]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_HARIYAMA]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_ELECTRIKE]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_MANECTRIC]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_NUMEL]            = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_CAMERUPT]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_SPHEAL]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_SEALEO]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_WALREIN]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_CACNEA]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_CACTURNE]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SNORUNT]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_GLALIE]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_LUNATONE]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_SOLROCK]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_AZURILL]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_SPOINK]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_GRUMPIG]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_PLUSLE]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)),\n\n    [SPECIES_MINUN]            = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)),\n\n    [SPECIES_MAWILE]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)),\n\n    [SPECIES_MEDITITE]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_MEDICHAM]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_SWABLU]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_ALTARIA]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_SKY_ATTACK)),\n\n    [SPECIES_WYNAUT]           = (0),\n\n    [SPECIES_DUSKULL]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_DUSCLOPS]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_ROSELIA]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_SLAKOTH]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_VIGOROTH]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SLAKING]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_GULPIN]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_SWALOT]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_TROPIUS]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_WHISMUR]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_LOUDRED]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_EXPLOUD]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)),\n\n    [SPECIES_CLAMPERL]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_HUNTAIL]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_GOREBYSS]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)),\n\n    [SPECIES_ABSOL]            = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_SHUPPET]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_BANETTE]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_SEVIPER]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_ZANGOOSE]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_RELICANTH]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_ARON]             = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_LAIRON]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_AGGRON]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_CASTFORM]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_VOLBEAT]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)),\n\n    [SPECIES_ILLUMISE]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)),\n\n    [SPECIES_LILEEP]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_CRADILY]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)),\n\n    [SPECIES_ANORITH]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_ARMALDO]          = (TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_RALTS]            = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_KIRLIA]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_GARDEVOIR]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_BAGON]            = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SHELGON]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_SALAMENCE]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_BELDUM]           = (0),\n\n    [SPECIES_METANG]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_METAGROSS]        = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_REGIROCK]         = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_REGICE]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_REGISTEEL]        = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_EXPLOSION)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_SELF_DESTRUCT)),\n\n    [SPECIES_KYOGRE]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)),\n\n    [SPECIES_GROUDON]          = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_SWORDS_DANCE)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_RAYQUAZA]         = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_LATIAS]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_LATIOS]           = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_FURY_CUTTER)),\n\n    [SPECIES_JIRACHI]          = (TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_METRONOME)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_DEOXYS]           = (TUTOR(MOVE_MEGA_PUNCH)\n                                | TUTOR(MOVE_MEGA_KICK)\n                                | TUTOR(MOVE_BODY_SLAM)\n                                | TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_COUNTER)\n                                | TUTOR(MOVE_SEISMIC_TOSS)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_THUNDER_WAVE)\n                                | TUTOR(MOVE_ROCK_SLIDE)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_DYNAMIC_PUNCH)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_MUD_SLAP)\n                                | TUTOR(MOVE_ICE_PUNCH)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_SWIFT)\n                                | TUTOR(MOVE_THUNDER_PUNCH)\n                                | TUTOR(MOVE_FIRE_PUNCH)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n    [SPECIES_CHIMECHO]         = (TUTOR(MOVE_DOUBLE_EDGE)\n                                | TUTOR(MOVE_MIMIC)\n                                | TUTOR(MOVE_DREAM_EATER)\n                                | TUTOR(MOVE_SUBSTITUTE)\n                                | TUTOR(MOVE_ROLLOUT)\n                                | TUTOR(MOVE_PSYCH_UP)\n                                | TUTOR(MOVE_SNORE)\n                                | TUTOR(MOVE_ICY_WIND)\n                                | TUTOR(MOVE_ENDURE)\n                                | TUTOR(MOVE_SWAGGER)\n                                | TUTOR(MOVE_SLEEP_TALK)\n                                | TUTOR(MOVE_DEFENSE_CURL)\n                                | TUTOR(MOVE_NIGHTMARE)),\n\n};\n\n"
  },
  {
    "path": "src/data/pokemon_graphics/back_pic_coordinates.h",
    "content": "const struct MonCoords gMonBackPicCoords[] =\n{\n    [SPECIES_NONE] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_BULBASAUR] =\n    {\n        .size = MON_COORDS_SIZE(48, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_IVYSAUR] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_VENUSAUR] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_CHARMANDER] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_CHARMELEON] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_CHARIZARD] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_SQUIRTLE] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_WARTORTLE] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_BLASTOISE] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_CATERPIE] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_METAPOD] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_BUTTERFREE] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_WEEDLE] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_KAKUNA] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_BEEDRILL] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_PIDGEY] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_PIDGEOTTO] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_PIDGEOT] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_RATTATA] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_RATICATE] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_SPEAROW] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_FEAROW] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_EKANS] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_ARBOK] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_PIKACHU] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_RAICHU] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_SANDSHREW] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_SANDSLASH] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_NIDORAN_F] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_NIDORINA] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_NIDOQUEEN] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_NIDORAN_M] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_NIDORINO] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_NIDOKING] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_CLEFAIRY] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_CLEFABLE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_VULPIX] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_NINETALES] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_JIGGLYPUFF] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_WIGGLYTUFF] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_ZUBAT] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_GOLBAT] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_ODDISH] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_GLOOM] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_VILEPLUME] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_PARAS] =\n    {\n        .size = MON_COORDS_SIZE(48, 24),\n        .y_offset = 20,\n    },\n    [SPECIES_PARASECT] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_VENONAT] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_VENOMOTH] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_DIGLETT] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_DUGTRIO] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_MEOWTH] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_PERSIAN] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_PSYDUCK] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_GOLDUCK] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_MANKEY] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_PRIMEAPE] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_GROWLITHE] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_ARCANINE] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_POLIWAG] =\n    {\n        .size = MON_COORDS_SIZE(56, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_POLIWHIRL] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_POLIWRATH] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_ABRA] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_KADABRA] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_ALAKAZAM] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_MACHOP] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_MACHOKE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_MACHAMP] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_BELLSPROUT] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_WEEPINBELL] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_VICTREEBEL] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_TENTACOOL] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_TENTACRUEL] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_GEODUDE] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_GRAVELER] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_GOLEM] =\n    {\n        .size = MON_COORDS_SIZE(64, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_PONYTA] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_RAPIDASH] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_SLOWPOKE] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_SLOWBRO] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_MAGNEMITE] =\n    {\n        .size = MON_COORDS_SIZE(32, 24),\n        .y_offset = 20,\n    },\n    [SPECIES_MAGNETON] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_FARFETCHD] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_DODUO] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_DODRIO] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_SEEL] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_DEWGONG] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_GRIMER] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_MUK] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_SHELLDER] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_CLOYSTER] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_GASTLY] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_HAUNTER] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_GENGAR] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_ONIX] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_DROWZEE] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_HYPNO] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_KRABBY] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_KINGLER] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_VOLTORB] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_ELECTRODE] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_EXEGGCUTE] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_EXEGGUTOR] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_CUBONE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_MAROWAK] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_HITMONLEE] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_HITMONCHAN] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_LICKITUNG] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_KOFFING] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_WEEZING] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_RHYHORN] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_RHYDON] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_CHANSEY] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_TANGELA] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_KANGASKHAN] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_HORSEA] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_SEADRA] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_GOLDEEN] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_SEAKING] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_STARYU] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_STARMIE] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_MR_MIME] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_SCYTHER] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_JYNX] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_ELECTABUZZ] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_MAGMAR] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_PINSIR] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_TAUROS] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_MAGIKARP] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_GYARADOS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_LAPRAS] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_DITTO] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_EEVEE] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_VAPOREON] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_JOLTEON] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_FLAREON] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_PORYGON] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_OMANYTE] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_OMASTAR] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_KABUTO] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_KABUTOPS] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_AERODACTYL] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_SNORLAX] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_ARTICUNO] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_ZAPDOS] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_MOLTRES] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_DRATINI] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_DRAGONAIR] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_DRAGONITE] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_MEWTWO] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_MEW] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_CHIKORITA] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_BAYLEEF] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_MEGANIUM] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_CYNDAQUIL] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_QUILAVA] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_TYPHLOSION] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_TOTODILE] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_CROCONAW] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_FERALIGATR] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_SENTRET] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_FURRET] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_HOOTHOOT] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_NOCTOWL] =\n    {\n        .size = MON_COORDS_SIZE(48, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_LEDYBA] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_LEDIAN] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_SPINARAK] =\n    {\n        .size = MON_COORDS_SIZE(56, 24),\n        .y_offset = 21,\n    },\n    [SPECIES_ARIADOS] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_CROBAT] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_CHINCHOU] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_LANTURN] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_PICHU] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_CLEFFA] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_IGGLYBUFF] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_TOGEPI] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_TOGETIC] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_NATU] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_XATU] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_MAREEP] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_FLAAFFY] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_AMPHAROS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_BELLOSSOM] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_MARILL] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_AZUMARILL] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_SUDOWOODO] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_POLITOED] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_HOPPIP] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_SKIPLOOM] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_JUMPLUFF] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_AIPOM] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_SUNKERN] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_SUNFLORA] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_YANMA] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_WOOPER] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_QUAGSIRE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_ESPEON] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_UMBREON] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_MURKROW] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_SLOWKING] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_MISDREAVUS] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_UNOWN] =\n    {\n        .size = MON_COORDS_SIZE(24, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_WOBBUFFET] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_GIRAFARIG] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_PINECO] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_FORRETRESS] =\n    {\n        .size = MON_COORDS_SIZE(64, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_DUNSPARCE] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_GLIGAR] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_STEELIX] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_SNUBBULL] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_GRANBULL] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_QWILFISH] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_SCIZOR] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_SHUCKLE] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_HERACROSS] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_SNEASEL] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_TEDDIURSA] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_URSARING] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_SLUGMA] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_MAGCARGO] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_SWINUB] =\n    {\n        .size = MON_COORDS_SIZE(48, 24),\n        .y_offset = 21,\n    },\n    [SPECIES_PILOSWINE] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_CORSOLA] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_REMORAID] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_OCTILLERY] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_DELIBIRD] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_MANTINE] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_SKARMORY] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_HOUNDOUR] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_HOUNDOOM] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_KINGDRA] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_PHANPY] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_DONPHAN] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_PORYGON2] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_STANTLER] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_SMEARGLE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_TYROGUE] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_HITMONTOP] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_SMOOCHUM] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_ELEKID] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_MAGBY] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_MILTANK] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_BLISSEY] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_RAIKOU] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_ENTEI] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_SUICUNE] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_LARVITAR] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_PUPITAR] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_TYRANITAR] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_LUGIA] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_HO_OH] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_CELEBI] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_OLD_UNOWN_B] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_C] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_D] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_E] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_F] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_G] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_H] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_I] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_J] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_K] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_L] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_M] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_N] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_O] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_P] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_Q] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_R] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_S] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_T] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_U] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_V] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_W] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_X] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_Y] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_OLD_UNOWN_Z] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_TREECKO] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_GROVYLE] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_SCEPTILE] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_TORCHIC] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_COMBUSKEN] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_BLAZIKEN] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_MUDKIP] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_MARSHTOMP] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_SWAMPERT] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_POOCHYENA] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_MIGHTYENA] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_ZIGZAGOON] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_LINOONE] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_WURMPLE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_SILCOON] =\n    {\n        .size = MON_COORDS_SIZE(64, 24),\n        .y_offset = 21,\n    },\n    [SPECIES_BEAUTIFLY] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_CASCOON] =\n    {\n        .size = MON_COORDS_SIZE(56, 24),\n        .y_offset = 20,\n    },\n    [SPECIES_DUSTOX] =\n    {\n        .size = MON_COORDS_SIZE(64, 24),\n        .y_offset = 20,\n    },\n    [SPECIES_LOTAD] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_LOMBRE] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_LUDICOLO] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_SEEDOT] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_NUZLEAF] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_SHIFTRY] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_NINCADA] =\n    {\n        .size = MON_COORDS_SIZE(64, 24),\n        .y_offset = 20,\n    },\n    [SPECIES_NINJASK] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_SHEDINJA] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_TAILLOW] =\n    {\n        .size = MON_COORDS_SIZE(48, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_SWELLOW] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_SHROOMISH] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_BRELOOM] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_SPINDA] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_WINGULL] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_PELIPPER] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_SURSKIT] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_MASQUERAIN] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_WAILMER] =\n    {\n        .size = MON_COORDS_SIZE(64, 24),\n        .y_offset = 21,\n    },\n    [SPECIES_WAILORD] =\n    {\n        .size = MON_COORDS_SIZE(64, 24),\n        .y_offset = 22,\n    },\n    [SPECIES_SKITTY] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_DELCATTY] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_KECLEON] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_BALTOY] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_CLAYDOL] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_NOSEPASS] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_TORKOAL] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_SABLEYE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_BARBOACH] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_WHISCASH] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_LUVDISC] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_CORPHISH] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_CRAWDAUNT] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_FEEBAS] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_MILOTIC] =\n    {\n        .size = MON_COORDS_SIZE(48, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_CARVANHA] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_SHARPEDO] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_TRAPINCH] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_VIBRAVA] =\n    {\n        .size = MON_COORDS_SIZE(56, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_FLYGON] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_MAKUHITA] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_HARIYAMA] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_ELECTRIKE] =\n    {\n        .size = MON_COORDS_SIZE(64, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_MANECTRIC] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_NUMEL] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_CAMERUPT] =\n    {\n        .size = MON_COORDS_SIZE(64, 32),\n        .y_offset = 19,\n    },\n    [SPECIES_SPHEAL] =\n    {\n        .size = MON_COORDS_SIZE(48, 32),\n        .y_offset = 18,\n    },\n    [SPECIES_SEALEO] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_WALREIN] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_CACNEA] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_CACTURNE] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_SNORUNT] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_GLALIE] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_LUNATONE] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_SOLROCK] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_AZURILL] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_SPOINK] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_GRUMPIG] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_PLUSLE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_MINUN] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_MAWILE] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_MEDITITE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_MEDICHAM] =\n    {\n        .size = MON_COORDS_SIZE(48, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_SWABLU] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_ALTARIA] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_WYNAUT] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_DUSKULL] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_DUSCLOPS] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_ROSELIA] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_SLAKOTH] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_VIGOROTH] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_SLAKING] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_GULPIN] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_SWALOT] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_TROPIUS] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_WHISMUR] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_LOUDRED] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_EXPLOUD] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_CLAMPERL] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_HUNTAIL] =\n    {\n        .size = MON_COORDS_SIZE(48, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_GOREBYSS] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_ABSOL] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_SHUPPET] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_BANETTE] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_SEVIPER] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_ZANGOOSE] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_RELICANTH] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_ARON] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_LAIRON] =\n    {\n        .size = MON_COORDS_SIZE(64, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_AGGRON] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_CASTFORM] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_VOLBEAT] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_ILLUMISE] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_LILEEP] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_CRADILY] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_ANORITH] =\n    {\n        .size = MON_COORDS_SIZE(64, 24),\n        .y_offset = 23,\n    },\n    [SPECIES_ARMALDO] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_RALTS] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_KIRLIA] =\n    {\n        .size = MON_COORDS_SIZE(40, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_GARDEVOIR] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_BAGON] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_SHELGON] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_SALAMENCE] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_BELDUM] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_METANG] =\n    {\n        .size = MON_COORDS_SIZE(64, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_METAGROSS] =\n    {\n        .size = MON_COORDS_SIZE(64, 24),\n        .y_offset = 20,\n    },\n    [SPECIES_REGIROCK] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_REGICE] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_REGISTEEL] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_KYOGRE] =\n    {\n        .size = MON_COORDS_SIZE(64, 32),\n        .y_offset = 19,\n    },\n    [SPECIES_GROUDON] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_RAYQUAZA] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_LATIAS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_LATIOS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_JIRACHI] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_DEOXYS] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_CHIMECHO] =\n    {\n        .size = MON_COORDS_SIZE(32, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_EGG] =\n    {\n        .size = MON_COORDS_SIZE(24, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_UNOWN_B] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_UNOWN_C] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_UNOWN_D] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_UNOWN_E] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_UNOWN_F] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_UNOWN_G] =\n    {\n        .size = MON_COORDS_SIZE(40, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_UNOWN_H] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_UNOWN_I] =\n    {\n        .size = MON_COORDS_SIZE(24, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_UNOWN_J] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_UNOWN_K] =\n    {\n        .size = MON_COORDS_SIZE(40, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_UNOWN_L] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_UNOWN_M] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_UNOWN_N] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_UNOWN_O] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_UNOWN_P] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_UNOWN_Q] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_UNOWN_R] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_UNOWN_S] =\n    {\n        .size = MON_COORDS_SIZE(40, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_UNOWN_T] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_UNOWN_U] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_UNOWN_V] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_UNOWN_W] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_UNOWN_X] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_UNOWN_Y] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_UNOWN_Z] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_UNOWN_EMARK] =\n    {\n        .size = MON_COORDS_SIZE(24, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_UNOWN_QMARK] =\n    {\n        .size = MON_COORDS_SIZE(32, 56),\n        .y_offset = 6,\n    },\n};\n\n"
  },
  {
    "path": "src/data/pokemon_graphics/back_pic_table.h",
    "content": "const struct CompressedSpriteSheet gMonBackPicTable[] =\n{\n    SPECIES_SPRITE(NONE, gMonBackPic_CircledQuestionMark),\n    SPECIES_SPRITE(BULBASAUR, gMonBackPic_Bulbasaur),\n    SPECIES_SPRITE(IVYSAUR, gMonBackPic_Ivysaur),\n    SPECIES_SPRITE(VENUSAUR, gMonBackPic_Venusaur),\n    SPECIES_SPRITE(CHARMANDER, gMonBackPic_Charmander),\n    SPECIES_SPRITE(CHARMELEON, gMonBackPic_Charmeleon),\n    SPECIES_SPRITE(CHARIZARD, gMonBackPic_Charizard),\n    SPECIES_SPRITE(SQUIRTLE, gMonBackPic_Squirtle),\n    SPECIES_SPRITE(WARTORTLE, gMonBackPic_Wartortle),\n    SPECIES_SPRITE(BLASTOISE, gMonBackPic_Blastoise),\n    SPECIES_SPRITE(CATERPIE, gMonBackPic_Caterpie),\n    SPECIES_SPRITE(METAPOD, gMonBackPic_Metapod),\n    SPECIES_SPRITE(BUTTERFREE, gMonBackPic_Butterfree),\n    SPECIES_SPRITE(WEEDLE, gMonBackPic_Weedle),\n    SPECIES_SPRITE(KAKUNA, gMonBackPic_Kakuna),\n    SPECIES_SPRITE(BEEDRILL, gMonBackPic_Beedrill),\n    SPECIES_SPRITE(PIDGEY, gMonBackPic_Pidgey),\n    SPECIES_SPRITE(PIDGEOTTO, gMonBackPic_Pidgeotto),\n    SPECIES_SPRITE(PIDGEOT, gMonBackPic_Pidgeot),\n    SPECIES_SPRITE(RATTATA, gMonBackPic_Rattata),\n    SPECIES_SPRITE(RATICATE, gMonBackPic_Raticate),\n    SPECIES_SPRITE(SPEAROW, gMonBackPic_Spearow),\n    SPECIES_SPRITE(FEAROW, gMonBackPic_Fearow),\n    SPECIES_SPRITE(EKANS, gMonBackPic_Ekans),\n    SPECIES_SPRITE(ARBOK, gMonBackPic_Arbok),\n    SPECIES_SPRITE(PIKACHU, gMonBackPic_Pikachu),\n    SPECIES_SPRITE(RAICHU, gMonBackPic_Raichu),\n    SPECIES_SPRITE(SANDSHREW, gMonBackPic_Sandshrew),\n    SPECIES_SPRITE(SANDSLASH, gMonBackPic_Sandslash),\n    SPECIES_SPRITE(NIDORAN_F, gMonBackPic_NidoranF),\n    SPECIES_SPRITE(NIDORINA, gMonBackPic_Nidorina),\n    SPECIES_SPRITE(NIDOQUEEN, gMonBackPic_Nidoqueen),\n    SPECIES_SPRITE(NIDORAN_M, gMonBackPic_NidoranM),\n    SPECIES_SPRITE(NIDORINO, gMonBackPic_Nidorino),\n    SPECIES_SPRITE(NIDOKING, gMonBackPic_Nidoking),\n    SPECIES_SPRITE(CLEFAIRY, gMonBackPic_Clefairy),\n    SPECIES_SPRITE(CLEFABLE, gMonBackPic_Clefable),\n    SPECIES_SPRITE(VULPIX, gMonBackPic_Vulpix),\n    SPECIES_SPRITE(NINETALES, gMonBackPic_Ninetales),\n    SPECIES_SPRITE(JIGGLYPUFF, gMonBackPic_Jigglypuff),\n    SPECIES_SPRITE(WIGGLYTUFF, gMonBackPic_Wigglytuff),\n    SPECIES_SPRITE(ZUBAT, gMonBackPic_Zubat),\n    SPECIES_SPRITE(GOLBAT, gMonBackPic_Golbat),\n    SPECIES_SPRITE(ODDISH, gMonBackPic_Oddish),\n    SPECIES_SPRITE(GLOOM, gMonBackPic_Gloom),\n    SPECIES_SPRITE(VILEPLUME, gMonBackPic_Vileplume),\n    SPECIES_SPRITE(PARAS, gMonBackPic_Paras),\n    SPECIES_SPRITE(PARASECT, gMonBackPic_Parasect),\n    SPECIES_SPRITE(VENONAT, gMonBackPic_Venonat),\n    SPECIES_SPRITE(VENOMOTH, gMonBackPic_Venomoth),\n    SPECIES_SPRITE(DIGLETT, gMonBackPic_Diglett),\n    SPECIES_SPRITE(DUGTRIO, gMonBackPic_Dugtrio),\n    SPECIES_SPRITE(MEOWTH, gMonBackPic_Meowth),\n    SPECIES_SPRITE(PERSIAN, gMonBackPic_Persian),\n    SPECIES_SPRITE(PSYDUCK, gMonBackPic_Psyduck),\n    SPECIES_SPRITE(GOLDUCK, gMonBackPic_Golduck),\n    SPECIES_SPRITE(MANKEY, gMonBackPic_Mankey),\n    SPECIES_SPRITE(PRIMEAPE, gMonBackPic_Primeape),\n    SPECIES_SPRITE(GROWLITHE, gMonBackPic_Growlithe),\n    SPECIES_SPRITE(ARCANINE, gMonBackPic_Arcanine),\n    SPECIES_SPRITE(POLIWAG, gMonBackPic_Poliwag),\n    SPECIES_SPRITE(POLIWHIRL, gMonBackPic_Poliwhirl),\n    SPECIES_SPRITE(POLIWRATH, gMonBackPic_Poliwrath),\n    SPECIES_SPRITE(ABRA, gMonBackPic_Abra),\n    SPECIES_SPRITE(KADABRA, gMonBackPic_Kadabra),\n    SPECIES_SPRITE(ALAKAZAM, gMonBackPic_Alakazam),\n    SPECIES_SPRITE(MACHOP, gMonBackPic_Machop),\n    SPECIES_SPRITE(MACHOKE, gMonBackPic_Machoke),\n    SPECIES_SPRITE(MACHAMP, gMonBackPic_Machamp),\n    SPECIES_SPRITE(BELLSPROUT, gMonBackPic_Bellsprout),\n    SPECIES_SPRITE(WEEPINBELL, gMonBackPic_Weepinbell),\n    SPECIES_SPRITE(VICTREEBEL, gMonBackPic_Victreebel),\n    SPECIES_SPRITE(TENTACOOL, gMonBackPic_Tentacool),\n    SPECIES_SPRITE(TENTACRUEL, gMonBackPic_Tentacruel),\n    SPECIES_SPRITE(GEODUDE, gMonBackPic_Geodude),\n    SPECIES_SPRITE(GRAVELER, gMonBackPic_Graveler),\n    SPECIES_SPRITE(GOLEM, gMonBackPic_Golem),\n    SPECIES_SPRITE(PONYTA, gMonBackPic_Ponyta),\n    SPECIES_SPRITE(RAPIDASH, gMonBackPic_Rapidash),\n    SPECIES_SPRITE(SLOWPOKE, gMonBackPic_Slowpoke),\n    SPECIES_SPRITE(SLOWBRO, gMonBackPic_Slowbro),\n    SPECIES_SPRITE(MAGNEMITE, gMonBackPic_Magnemite),\n    SPECIES_SPRITE(MAGNETON, gMonBackPic_Magneton),\n    SPECIES_SPRITE(FARFETCHD, gMonBackPic_Farfetchd),\n    SPECIES_SPRITE(DODUO, gMonBackPic_Doduo),\n    SPECIES_SPRITE(DODRIO, gMonBackPic_Dodrio),\n    SPECIES_SPRITE(SEEL, gMonBackPic_Seel),\n    SPECIES_SPRITE(DEWGONG, gMonBackPic_Dewgong),\n    SPECIES_SPRITE(GRIMER, gMonBackPic_Grimer),\n    SPECIES_SPRITE(MUK, gMonBackPic_Muk),\n    SPECIES_SPRITE(SHELLDER, gMonBackPic_Shellder),\n    SPECIES_SPRITE(CLOYSTER, gMonBackPic_Cloyster),\n    SPECIES_SPRITE(GASTLY, gMonBackPic_Gastly),\n    SPECIES_SPRITE(HAUNTER, gMonBackPic_Haunter),\n    SPECIES_SPRITE(GENGAR, gMonBackPic_Gengar),\n    SPECIES_SPRITE(ONIX, gMonBackPic_Onix),\n    SPECIES_SPRITE(DROWZEE, gMonBackPic_Drowzee),\n    SPECIES_SPRITE(HYPNO, gMonBackPic_Hypno),\n    SPECIES_SPRITE(KRABBY, gMonBackPic_Krabby),\n    SPECIES_SPRITE(KINGLER, gMonBackPic_Kingler),\n    SPECIES_SPRITE(VOLTORB, gMonBackPic_Voltorb),\n    SPECIES_SPRITE(ELECTRODE, gMonBackPic_Electrode),\n    SPECIES_SPRITE(EXEGGCUTE, gMonBackPic_Exeggcute),\n    SPECIES_SPRITE(EXEGGUTOR, gMonBackPic_Exeggutor),\n    SPECIES_SPRITE(CUBONE, gMonBackPic_Cubone),\n    SPECIES_SPRITE(MAROWAK, gMonBackPic_Marowak),\n    SPECIES_SPRITE(HITMONLEE, gMonBackPic_Hitmonlee),\n    SPECIES_SPRITE(HITMONCHAN, gMonBackPic_Hitmonchan),\n    SPECIES_SPRITE(LICKITUNG, gMonBackPic_Lickitung),\n    SPECIES_SPRITE(KOFFING, gMonBackPic_Koffing),\n    SPECIES_SPRITE(WEEZING, gMonBackPic_Weezing),\n    SPECIES_SPRITE(RHYHORN, gMonBackPic_Rhyhorn),\n    SPECIES_SPRITE(RHYDON, gMonBackPic_Rhydon),\n    SPECIES_SPRITE(CHANSEY, gMonBackPic_Chansey),\n    SPECIES_SPRITE(TANGELA, gMonBackPic_Tangela),\n    SPECIES_SPRITE(KANGASKHAN, gMonBackPic_Kangaskhan),\n    SPECIES_SPRITE(HORSEA, gMonBackPic_Horsea),\n    SPECIES_SPRITE(SEADRA, gMonBackPic_Seadra),\n    SPECIES_SPRITE(GOLDEEN, gMonBackPic_Goldeen),\n    SPECIES_SPRITE(SEAKING, gMonBackPic_Seaking),\n    SPECIES_SPRITE(STARYU, gMonBackPic_Staryu),\n    SPECIES_SPRITE(STARMIE, gMonBackPic_Starmie),\n    SPECIES_SPRITE(MR_MIME, gMonBackPic_Mrmime),\n    SPECIES_SPRITE(SCYTHER, gMonBackPic_Scyther),\n    SPECIES_SPRITE(JYNX, gMonBackPic_Jynx),\n    SPECIES_SPRITE(ELECTABUZZ, gMonBackPic_Electabuzz),\n    SPECIES_SPRITE(MAGMAR, gMonBackPic_Magmar),\n    SPECIES_SPRITE(PINSIR, gMonBackPic_Pinsir),\n    SPECIES_SPRITE(TAUROS, gMonBackPic_Tauros),\n    SPECIES_SPRITE(MAGIKARP, gMonBackPic_Magikarp),\n    SPECIES_SPRITE(GYARADOS, gMonBackPic_Gyarados),\n    SPECIES_SPRITE(LAPRAS, gMonBackPic_Lapras),\n    SPECIES_SPRITE(DITTO, gMonBackPic_Ditto),\n    SPECIES_SPRITE(EEVEE, gMonBackPic_Eevee),\n    SPECIES_SPRITE(VAPOREON, gMonBackPic_Vaporeon),\n    SPECIES_SPRITE(JOLTEON, gMonBackPic_Jolteon),\n    SPECIES_SPRITE(FLAREON, gMonBackPic_Flareon),\n    SPECIES_SPRITE(PORYGON, gMonBackPic_Porygon),\n    SPECIES_SPRITE(OMANYTE, gMonBackPic_Omanyte),\n    SPECIES_SPRITE(OMASTAR, gMonBackPic_Omastar),\n    SPECIES_SPRITE(KABUTO, gMonBackPic_Kabuto),\n    SPECIES_SPRITE(KABUTOPS, gMonBackPic_Kabutops),\n    SPECIES_SPRITE(AERODACTYL, gMonBackPic_Aerodactyl),\n    SPECIES_SPRITE(SNORLAX, gMonBackPic_Snorlax),\n    SPECIES_SPRITE(ARTICUNO, gMonBackPic_Articuno),\n    SPECIES_SPRITE(ZAPDOS, gMonBackPic_Zapdos),\n    SPECIES_SPRITE(MOLTRES, gMonBackPic_Moltres),\n    SPECIES_SPRITE(DRATINI, gMonBackPic_Dratini),\n    SPECIES_SPRITE(DRAGONAIR, gMonBackPic_Dragonair),\n    SPECIES_SPRITE(DRAGONITE, gMonBackPic_Dragonite),\n    SPECIES_SPRITE(MEWTWO, gMonBackPic_Mewtwo),\n    SPECIES_SPRITE(MEW, gMonBackPic_Mew),\n    SPECIES_SPRITE(CHIKORITA, gMonBackPic_Chikorita),\n    SPECIES_SPRITE(BAYLEEF, gMonBackPic_Bayleef),\n    SPECIES_SPRITE(MEGANIUM, gMonBackPic_Meganium),\n    SPECIES_SPRITE(CYNDAQUIL, gMonBackPic_Cyndaquil),\n    SPECIES_SPRITE(QUILAVA, gMonBackPic_Quilava),\n    SPECIES_SPRITE(TYPHLOSION, gMonBackPic_Typhlosion),\n    SPECIES_SPRITE(TOTODILE, gMonBackPic_Totodile),\n    SPECIES_SPRITE(CROCONAW, gMonBackPic_Croconaw),\n    SPECIES_SPRITE(FERALIGATR, gMonBackPic_Feraligatr),\n    SPECIES_SPRITE(SENTRET, gMonBackPic_Sentret),\n    SPECIES_SPRITE(FURRET, gMonBackPic_Furret),\n    SPECIES_SPRITE(HOOTHOOT, gMonBackPic_Hoothoot),\n    SPECIES_SPRITE(NOCTOWL, gMonBackPic_Noctowl),\n    SPECIES_SPRITE(LEDYBA, gMonBackPic_Ledyba),\n    SPECIES_SPRITE(LEDIAN, gMonBackPic_Ledian),\n    SPECIES_SPRITE(SPINARAK, gMonBackPic_Spinarak),\n    SPECIES_SPRITE(ARIADOS, gMonBackPic_Ariados),\n    SPECIES_SPRITE(CROBAT, gMonBackPic_Crobat),\n    SPECIES_SPRITE(CHINCHOU, gMonBackPic_Chinchou),\n    SPECIES_SPRITE(LANTURN, gMonBackPic_Lanturn),\n    SPECIES_SPRITE(PICHU, gMonBackPic_Pichu),\n    SPECIES_SPRITE(CLEFFA, gMonBackPic_Cleffa),\n    SPECIES_SPRITE(IGGLYBUFF, gMonBackPic_Igglybuff),\n    SPECIES_SPRITE(TOGEPI, gMonBackPic_Togepi),\n    SPECIES_SPRITE(TOGETIC, gMonBackPic_Togetic),\n    SPECIES_SPRITE(NATU, gMonBackPic_Natu),\n    SPECIES_SPRITE(XATU, gMonBackPic_Xatu),\n    SPECIES_SPRITE(MAREEP, gMonBackPic_Mareep),\n    SPECIES_SPRITE(FLAAFFY, gMonBackPic_Flaaffy),\n    SPECIES_SPRITE(AMPHAROS, gMonBackPic_Ampharos),\n    SPECIES_SPRITE(BELLOSSOM, gMonBackPic_Bellossom),\n    SPECIES_SPRITE(MARILL, gMonBackPic_Marill),\n    SPECIES_SPRITE(AZUMARILL, gMonBackPic_Azumarill),\n    SPECIES_SPRITE(SUDOWOODO, gMonBackPic_Sudowoodo),\n    SPECIES_SPRITE(POLITOED, gMonBackPic_Politoed),\n    SPECIES_SPRITE(HOPPIP, gMonBackPic_Hoppip),\n    SPECIES_SPRITE(SKIPLOOM, gMonBackPic_Skiploom),\n    SPECIES_SPRITE(JUMPLUFF, gMonBackPic_Jumpluff),\n    SPECIES_SPRITE(AIPOM, gMonBackPic_Aipom),\n    SPECIES_SPRITE(SUNKERN, gMonBackPic_Sunkern),\n    SPECIES_SPRITE(SUNFLORA, gMonBackPic_Sunflora),\n    SPECIES_SPRITE(YANMA, gMonBackPic_Yanma),\n    SPECIES_SPRITE(WOOPER, gMonBackPic_Wooper),\n    SPECIES_SPRITE(QUAGSIRE, gMonBackPic_Quagsire),\n    SPECIES_SPRITE(ESPEON, gMonBackPic_Espeon),\n    SPECIES_SPRITE(UMBREON, gMonBackPic_Umbreon),\n    SPECIES_SPRITE(MURKROW, gMonBackPic_Murkrow),\n    SPECIES_SPRITE(SLOWKING, gMonBackPic_Slowking),\n    SPECIES_SPRITE(MISDREAVUS, gMonBackPic_Misdreavus),\n    SPECIES_SPRITE(UNOWN, gMonBackPic_UnownA),\n    SPECIES_SPRITE(WOBBUFFET, gMonBackPic_Wobbuffet),\n    SPECIES_SPRITE(GIRAFARIG, gMonBackPic_Girafarig),\n    SPECIES_SPRITE(PINECO, gMonBackPic_Pineco),\n    SPECIES_SPRITE(FORRETRESS, gMonBackPic_Forretress),\n    SPECIES_SPRITE(DUNSPARCE, gMonBackPic_Dunsparce),\n    SPECIES_SPRITE(GLIGAR, gMonBackPic_Gligar),\n    SPECIES_SPRITE(STEELIX, gMonBackPic_Steelix),\n    SPECIES_SPRITE(SNUBBULL, gMonBackPic_Snubbull),\n    SPECIES_SPRITE(GRANBULL, gMonBackPic_Granbull),\n    SPECIES_SPRITE(QWILFISH, gMonBackPic_Qwilfish),\n    SPECIES_SPRITE(SCIZOR, gMonBackPic_Scizor),\n    SPECIES_SPRITE(SHUCKLE, gMonBackPic_Shuckle),\n    SPECIES_SPRITE(HERACROSS, gMonBackPic_Heracross),\n    SPECIES_SPRITE(SNEASEL, gMonBackPic_Sneasel),\n    SPECIES_SPRITE(TEDDIURSA, gMonBackPic_Teddiursa),\n    SPECIES_SPRITE(URSARING, gMonBackPic_Ursaring),\n    SPECIES_SPRITE(SLUGMA, gMonBackPic_Slugma),\n    SPECIES_SPRITE(MAGCARGO, gMonBackPic_Magcargo),\n    SPECIES_SPRITE(SWINUB, gMonBackPic_Swinub),\n    SPECIES_SPRITE(PILOSWINE, gMonBackPic_Piloswine),\n    SPECIES_SPRITE(CORSOLA, gMonBackPic_Corsola),\n    SPECIES_SPRITE(REMORAID, gMonBackPic_Remoraid),\n    SPECIES_SPRITE(OCTILLERY, gMonBackPic_Octillery),\n    SPECIES_SPRITE(DELIBIRD, gMonBackPic_Delibird),\n    SPECIES_SPRITE(MANTINE, gMonBackPic_Mantine),\n    SPECIES_SPRITE(SKARMORY, gMonBackPic_Skarmory),\n    SPECIES_SPRITE(HOUNDOUR, gMonBackPic_Houndour),\n    SPECIES_SPRITE(HOUNDOOM, gMonBackPic_Houndoom),\n    SPECIES_SPRITE(KINGDRA, gMonBackPic_Kingdra),\n    SPECIES_SPRITE(PHANPY, gMonBackPic_Phanpy),\n    SPECIES_SPRITE(DONPHAN, gMonBackPic_Donphan),\n    SPECIES_SPRITE(PORYGON2, gMonBackPic_Porygon2),\n    SPECIES_SPRITE(STANTLER, gMonBackPic_Stantler),\n    SPECIES_SPRITE(SMEARGLE, gMonBackPic_Smeargle),\n    SPECIES_SPRITE(TYROGUE, gMonBackPic_Tyrogue),\n    SPECIES_SPRITE(HITMONTOP, gMonBackPic_Hitmontop),\n    SPECIES_SPRITE(SMOOCHUM, gMonBackPic_Smoochum),\n    SPECIES_SPRITE(ELEKID, gMonBackPic_Elekid),\n    SPECIES_SPRITE(MAGBY, gMonBackPic_Magby),\n    SPECIES_SPRITE(MILTANK, gMonBackPic_Miltank),\n    SPECIES_SPRITE(BLISSEY, gMonBackPic_Blissey),\n    SPECIES_SPRITE(RAIKOU, gMonBackPic_Raikou),\n    SPECIES_SPRITE(ENTEI, gMonBackPic_Entei),\n    SPECIES_SPRITE(SUICUNE, gMonBackPic_Suicune),\n    SPECIES_SPRITE(LARVITAR, gMonBackPic_Larvitar),\n    SPECIES_SPRITE(PUPITAR, gMonBackPic_Pupitar),\n    SPECIES_SPRITE(TYRANITAR, gMonBackPic_Tyranitar),\n    SPECIES_SPRITE(LUGIA, gMonBackPic_Lugia),\n    SPECIES_SPRITE(HO_OH, gMonBackPic_HoOh),\n    SPECIES_SPRITE(CELEBI, gMonBackPic_Celebi),\n    SPECIES_SPRITE(OLD_UNOWN_B, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_C, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_D, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_E, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_F, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_G, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_H, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_I, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_J, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_K, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_L, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_M, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_N, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_O, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_P, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_Q, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_R, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_S, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_T, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_U, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_V, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_W, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_X, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_Y, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_Z, gMonBackPic_DoubleQuestionMark),\n    SPECIES_SPRITE(TREECKO, gMonBackPic_Treecko),\n    SPECIES_SPRITE(GROVYLE, gMonBackPic_Grovyle),\n    SPECIES_SPRITE(SCEPTILE, gMonBackPic_Sceptile),\n    SPECIES_SPRITE(TORCHIC, gMonBackPic_Torchic),\n    SPECIES_SPRITE(COMBUSKEN, gMonBackPic_Combusken),\n    SPECIES_SPRITE(BLAZIKEN, gMonBackPic_Blaziken),\n    SPECIES_SPRITE(MUDKIP, gMonBackPic_Mudkip),\n    SPECIES_SPRITE(MARSHTOMP, gMonBackPic_Marshtomp),\n    SPECIES_SPRITE(SWAMPERT, gMonBackPic_Swampert),\n    SPECIES_SPRITE(POOCHYENA, gMonBackPic_Poochyena),\n    SPECIES_SPRITE(MIGHTYENA, gMonBackPic_Mightyena),\n    SPECIES_SPRITE(ZIGZAGOON, gMonBackPic_Zigzagoon),\n    SPECIES_SPRITE(LINOONE, gMonBackPic_Linoone),\n    SPECIES_SPRITE(WURMPLE, gMonBackPic_Wurmple),\n    SPECIES_SPRITE(SILCOON, gMonBackPic_Silcoon),\n    SPECIES_SPRITE(BEAUTIFLY, gMonBackPic_Beautifly),\n    SPECIES_SPRITE(CASCOON, gMonBackPic_Cascoon),\n    SPECIES_SPRITE(DUSTOX, gMonBackPic_Dustox),\n    SPECIES_SPRITE(LOTAD, gMonBackPic_Lotad),\n    SPECIES_SPRITE(LOMBRE, gMonBackPic_Lombre),\n    SPECIES_SPRITE(LUDICOLO, gMonBackPic_Ludicolo),\n    SPECIES_SPRITE(SEEDOT, gMonBackPic_Seedot),\n    SPECIES_SPRITE(NUZLEAF, gMonBackPic_Nuzleaf),\n    SPECIES_SPRITE(SHIFTRY, gMonBackPic_Shiftry),\n    SPECIES_SPRITE(NINCADA, gMonBackPic_Nincada),\n    SPECIES_SPRITE(NINJASK, gMonBackPic_Ninjask),\n    SPECIES_SPRITE(SHEDINJA, gMonBackPic_Shedinja),\n    SPECIES_SPRITE(TAILLOW, gMonBackPic_Taillow),\n    SPECIES_SPRITE(SWELLOW, gMonBackPic_Swellow),\n    SPECIES_SPRITE(SHROOMISH, gMonBackPic_Shroomish),\n    SPECIES_SPRITE(BRELOOM, gMonBackPic_Breloom),\n    SPECIES_SPRITE(SPINDA, gMonBackPic_Spinda),\n    SPECIES_SPRITE(WINGULL, gMonBackPic_Wingull),\n    SPECIES_SPRITE(PELIPPER, gMonBackPic_Pelipper),\n    SPECIES_SPRITE(SURSKIT, gMonBackPic_Surskit),\n    SPECIES_SPRITE(MASQUERAIN, gMonBackPic_Masquerain),\n    SPECIES_SPRITE(WAILMER, gMonBackPic_Wailmer),\n    SPECIES_SPRITE(WAILORD, gMonBackPic_Wailord),\n    SPECIES_SPRITE(SKITTY, gMonBackPic_Skitty),\n    SPECIES_SPRITE(DELCATTY, gMonBackPic_Delcatty),\n    SPECIES_SPRITE(KECLEON, gMonBackPic_Kecleon),\n    SPECIES_SPRITE(BALTOY, gMonBackPic_Baltoy),\n    SPECIES_SPRITE(CLAYDOL, gMonBackPic_Claydol),\n    SPECIES_SPRITE(NOSEPASS, gMonBackPic_Nosepass),\n    SPECIES_SPRITE(TORKOAL, gMonBackPic_Torkoal),\n    SPECIES_SPRITE(SABLEYE, gMonBackPic_Sableye),\n    SPECIES_SPRITE(BARBOACH, gMonBackPic_Barboach),\n    SPECIES_SPRITE(WHISCASH, gMonBackPic_Whiscash),\n    SPECIES_SPRITE(LUVDISC, gMonBackPic_Luvdisc),\n    SPECIES_SPRITE(CORPHISH, gMonBackPic_Corphish),\n    SPECIES_SPRITE(CRAWDAUNT, gMonBackPic_Crawdaunt),\n    SPECIES_SPRITE(FEEBAS, gMonBackPic_Feebas),\n    SPECIES_SPRITE(MILOTIC, gMonBackPic_Milotic),\n    SPECIES_SPRITE(CARVANHA, gMonBackPic_Carvanha),\n    SPECIES_SPRITE(SHARPEDO, gMonBackPic_Sharpedo),\n    SPECIES_SPRITE(TRAPINCH, gMonBackPic_Trapinch),\n    SPECIES_SPRITE(VIBRAVA, gMonBackPic_Vibrava),\n    SPECIES_SPRITE(FLYGON, gMonBackPic_Flygon),\n    SPECIES_SPRITE(MAKUHITA, gMonBackPic_Makuhita),\n    SPECIES_SPRITE(HARIYAMA, gMonBackPic_Hariyama),\n    SPECIES_SPRITE(ELECTRIKE, gMonBackPic_Electrike),\n    SPECIES_SPRITE(MANECTRIC, gMonBackPic_Manectric),\n    SPECIES_SPRITE(NUMEL, gMonBackPic_Numel),\n    SPECIES_SPRITE(CAMERUPT, gMonBackPic_Camerupt),\n    SPECIES_SPRITE(SPHEAL, gMonBackPic_Spheal),\n    SPECIES_SPRITE(SEALEO, gMonBackPic_Sealeo),\n    SPECIES_SPRITE(WALREIN, gMonBackPic_Walrein),\n    SPECIES_SPRITE(CACNEA, gMonBackPic_Cacnea),\n    SPECIES_SPRITE(CACTURNE, gMonBackPic_Cacturne),\n    SPECIES_SPRITE(SNORUNT, gMonBackPic_Snorunt),\n    SPECIES_SPRITE(GLALIE, gMonBackPic_Glalie),\n    SPECIES_SPRITE(LUNATONE, gMonBackPic_Lunatone),\n    SPECIES_SPRITE(SOLROCK, gMonBackPic_Solrock),\n    SPECIES_SPRITE(AZURILL, gMonBackPic_Azurill),\n    SPECIES_SPRITE(SPOINK, gMonBackPic_Spoink),\n    SPECIES_SPRITE(GRUMPIG, gMonBackPic_Grumpig),\n    SPECIES_SPRITE(PLUSLE, gMonBackPic_Plusle),\n    SPECIES_SPRITE(MINUN, gMonBackPic_Minun),\n    SPECIES_SPRITE(MAWILE, gMonBackPic_Mawile),\n    SPECIES_SPRITE(MEDITITE, gMonBackPic_Meditite),\n    SPECIES_SPRITE(MEDICHAM, gMonBackPic_Medicham),\n    SPECIES_SPRITE(SWABLU, gMonBackPic_Swablu),\n    SPECIES_SPRITE(ALTARIA, gMonBackPic_Altaria),\n    SPECIES_SPRITE(WYNAUT, gMonBackPic_Wynaut),\n    SPECIES_SPRITE(DUSKULL, gMonBackPic_Duskull),\n    SPECIES_SPRITE(DUSCLOPS, gMonBackPic_Dusclops),\n    SPECIES_SPRITE(ROSELIA, gMonBackPic_Roselia),\n    SPECIES_SPRITE(SLAKOTH, gMonBackPic_Slakoth),\n    SPECIES_SPRITE(VIGOROTH, gMonBackPic_Vigoroth),\n    SPECIES_SPRITE(SLAKING, gMonBackPic_Slaking),\n    SPECIES_SPRITE(GULPIN, gMonBackPic_Gulpin),\n    SPECIES_SPRITE(SWALOT, gMonBackPic_Swalot),\n    SPECIES_SPRITE(TROPIUS, gMonBackPic_Tropius),\n    SPECIES_SPRITE(WHISMUR, gMonBackPic_Whismur),\n    SPECIES_SPRITE(LOUDRED, gMonBackPic_Loudred),\n    SPECIES_SPRITE(EXPLOUD, gMonBackPic_Exploud),\n    SPECIES_SPRITE(CLAMPERL, gMonBackPic_Clamperl),\n    SPECIES_SPRITE(HUNTAIL, gMonBackPic_Huntail),\n    SPECIES_SPRITE(GOREBYSS, gMonBackPic_Gorebyss),\n    SPECIES_SPRITE(ABSOL, gMonBackPic_Absol),\n    SPECIES_SPRITE(SHUPPET, gMonBackPic_Shuppet),\n    SPECIES_SPRITE(BANETTE, gMonBackPic_Banette),\n    SPECIES_SPRITE(SEVIPER, gMonBackPic_Seviper),\n    SPECIES_SPRITE(ZANGOOSE, gMonBackPic_Zangoose),\n    SPECIES_SPRITE(RELICANTH, gMonBackPic_Relicanth),\n    SPECIES_SPRITE(ARON, gMonBackPic_Aron),\n    SPECIES_SPRITE(LAIRON, gMonBackPic_Lairon),\n    SPECIES_SPRITE(AGGRON, gMonBackPic_Aggron),\n    SPECIES_SPRITE(CASTFORM, gMonBackPic_Castform),\n    SPECIES_SPRITE(VOLBEAT, gMonBackPic_Volbeat),\n    SPECIES_SPRITE(ILLUMISE, gMonBackPic_Illumise),\n    SPECIES_SPRITE(LILEEP, gMonBackPic_Lileep),\n    SPECIES_SPRITE(CRADILY, gMonBackPic_Cradily),\n    SPECIES_SPRITE(ANORITH, gMonBackPic_Anorith),\n    SPECIES_SPRITE(ARMALDO, gMonBackPic_Armaldo),\n    SPECIES_SPRITE(RALTS, gMonBackPic_Ralts),\n    SPECIES_SPRITE(KIRLIA, gMonBackPic_Kirlia),\n    SPECIES_SPRITE(GARDEVOIR, gMonBackPic_Gardevoir),\n    SPECIES_SPRITE(BAGON, gMonBackPic_Bagon),\n    SPECIES_SPRITE(SHELGON, gMonBackPic_Shelgon),\n    SPECIES_SPRITE(SALAMENCE, gMonBackPic_Salamence),\n    SPECIES_SPRITE(BELDUM, gMonBackPic_Beldum),\n    SPECIES_SPRITE(METANG, gMonBackPic_Metang),\n    SPECIES_SPRITE(METAGROSS, gMonBackPic_Metagross),\n    SPECIES_SPRITE(REGIROCK, gMonBackPic_Regirock),\n    SPECIES_SPRITE(REGICE, gMonBackPic_Regice),\n    SPECIES_SPRITE(REGISTEEL, gMonBackPic_Registeel),\n    SPECIES_SPRITE(KYOGRE, gMonBackPic_Kyogre),\n    SPECIES_SPRITE(GROUDON, gMonBackPic_Groudon),\n    SPECIES_SPRITE(RAYQUAZA, gMonBackPic_Rayquaza),\n    SPECIES_SPRITE(LATIAS, gMonBackPic_Latias),\n    SPECIES_SPRITE(LATIOS, gMonBackPic_Latios),\n    SPECIES_SPRITE(JIRACHI, gMonBackPic_Jirachi),\n    SPECIES_SPRITE(DEOXYS, gMonBackPic_Deoxys),\n    SPECIES_SPRITE(CHIMECHO, gMonBackPic_Chimecho),\n    SPECIES_SPRITE(EGG, gMonFrontPic_Egg),\n    SPECIES_SPRITE(UNOWN_B, gMonBackPic_UnownB),\n    SPECIES_SPRITE(UNOWN_C, gMonBackPic_UnownC),\n    SPECIES_SPRITE(UNOWN_D, gMonBackPic_UnownD),\n    SPECIES_SPRITE(UNOWN_E, gMonBackPic_UnownE),\n    SPECIES_SPRITE(UNOWN_F, gMonBackPic_UnownF),\n    SPECIES_SPRITE(UNOWN_G, gMonBackPic_UnownG),\n    SPECIES_SPRITE(UNOWN_H, gMonBackPic_UnownH),\n    SPECIES_SPRITE(UNOWN_I, gMonBackPic_UnownI),\n    SPECIES_SPRITE(UNOWN_J, gMonBackPic_UnownJ),\n    SPECIES_SPRITE(UNOWN_K, gMonBackPic_UnownK),\n    SPECIES_SPRITE(UNOWN_L, gMonBackPic_UnownL),\n    SPECIES_SPRITE(UNOWN_M, gMonBackPic_UnownM),\n    SPECIES_SPRITE(UNOWN_N, gMonBackPic_UnownN),\n    SPECIES_SPRITE(UNOWN_O, gMonBackPic_UnownO),\n    SPECIES_SPRITE(UNOWN_P, gMonBackPic_UnownP),\n    SPECIES_SPRITE(UNOWN_Q, gMonBackPic_UnownQ),\n    SPECIES_SPRITE(UNOWN_R, gMonBackPic_UnownR),\n    SPECIES_SPRITE(UNOWN_S, gMonBackPic_UnownS),\n    SPECIES_SPRITE(UNOWN_T, gMonBackPic_UnownT),\n    SPECIES_SPRITE(UNOWN_U, gMonBackPic_UnownU),\n    SPECIES_SPRITE(UNOWN_V, gMonBackPic_UnownV),\n    SPECIES_SPRITE(UNOWN_W, gMonBackPic_UnownW),\n    SPECIES_SPRITE(UNOWN_X, gMonBackPic_UnownX),\n    SPECIES_SPRITE(UNOWN_Y, gMonBackPic_UnownY),\n    SPECIES_SPRITE(UNOWN_Z, gMonBackPic_UnownZ),\n    SPECIES_SPRITE(UNOWN_EMARK, gMonBackPic_UnownExclamationMark),\n    SPECIES_SPRITE(UNOWN_QMARK, gMonBackPic_UnownQuestionMark),\n};\n"
  },
  {
    "path": "src/data/pokemon_graphics/enemy_mon_elevation.h",
    "content": "// This determines how much higher above the usual position the enemy Pokémon\n// is during battle. Species that float or fly have nonzero values.\nconst u8 gEnemyMonElevation[NUM_SPECIES] =\n{\n    [SPECIES_BUTTERFREE] = 8,\n    [SPECIES_BEEDRILL] = 8,\n    [SPECIES_PIDGEOT] = 4,\n    [SPECIES_FEAROW] = 6,\n    [SPECIES_ZUBAT] = 8,\n    [SPECIES_GOLBAT] = 8,\n    [SPECIES_VENOMOTH] = 8,\n    [SPECIES_GEODUDE] = 16,\n    [SPECIES_MAGNEMITE] = 16,\n    [SPECIES_MAGNETON] = 8,\n    [SPECIES_GASTLY] = 4,\n    [SPECIES_HAUNTER] = 4,\n    [SPECIES_VOLTORB] = 10,\n    [SPECIES_ELECTRODE] = 12,\n    [SPECIES_KOFFING] = 8,\n    [SPECIES_WEEZING] = 6,\n    [SPECIES_AERODACTYL] = 7,\n    [SPECIES_ARTICUNO] = 6,\n    [SPECIES_ZAPDOS] = 8,\n    [SPECIES_MOLTRES] = 5,\n    [SPECIES_DRAGONITE] = 6,\n    [SPECIES_MEW] = 8,\n    [SPECIES_LEDIAN] = 8,\n    [SPECIES_CROBAT] = 6,\n    [SPECIES_HOPPIP] = 11,\n    [SPECIES_SKIPLOOM] = 12,\n    [SPECIES_JUMPLUFF] = 9,\n    [SPECIES_YANMA] = 8,\n    [SPECIES_MISDREAVUS] = 8,\n    [SPECIES_UNOWN] = 8,\n    [SPECIES_GLIGAR] = 6,\n    [SPECIES_LUGIA] = 6,\n    [SPECIES_HO_OH] = 6,\n    [SPECIES_CELEBI] = 15,\n    [SPECIES_BEAUTIFLY] = 8,\n    [SPECIES_DUSTOX] = 10,\n    [SPECIES_NINJASK] = 10,\n    [SPECIES_SHEDINJA] = 8,\n    [SPECIES_WINGULL] = 16,\n    [SPECIES_PELIPPER] = 8,\n    [SPECIES_MASQUERAIN] = 10,\n    [SPECIES_BALTOY] = 4,\n    [SPECIES_CLAYDOL] = 10,\n    [SPECIES_FLYGON] = 7,\n    [SPECIES_GLALIE] = 12,\n    [SPECIES_LUNATONE] = 13,\n    [SPECIES_SOLROCK] = 4,\n    [SPECIES_SWABLU] = 12,\n    [SPECIES_ALTARIA] = 8,\n    [SPECIES_DUSKULL] = 9,\n    [SPECIES_SHUPPET] = 12,\n    [SPECIES_BANETTE] = 8,\n    [SPECIES_CASTFORM] = 16,\n    [SPECIES_BELDUM] = 8,\n    [SPECIES_RAYQUAZA] = 6,\n    [SPECIES_LATIAS] = 6,\n    [SPECIES_LATIOS] = 6,\n    [SPECIES_JIRACHI] = 12,\n    [SPECIES_DEOXYS] = 8,\n    [SPECIES_CHIMECHO] = 12,\n};\n"
  },
  {
    "path": "src/data/pokemon_graphics/footprint_table.h",
    "content": "const u8 *const gMonFootprintTable[] =\n{\n    [SPECIES_NONE] = gMonFootprint_Bulbasaur,\n    [SPECIES_BULBASAUR] = gMonFootprint_Bulbasaur,\n    [SPECIES_IVYSAUR] = gMonFootprint_Ivysaur,\n    [SPECIES_VENUSAUR] = gMonFootprint_Venusaur,\n    [SPECIES_CHARMANDER] = gMonFootprint_Charmander,\n    [SPECIES_CHARMELEON] = gMonFootprint_Charmeleon,\n    [SPECIES_CHARIZARD] = gMonFootprint_Charizard,\n    [SPECIES_SQUIRTLE] = gMonFootprint_Squirtle,\n    [SPECIES_WARTORTLE] = gMonFootprint_Wartortle,\n    [SPECIES_BLASTOISE] = gMonFootprint_Blastoise,\n    [SPECIES_CATERPIE] = gMonFootprint_Caterpie,\n    [SPECIES_METAPOD] = gMonFootprint_Metapod,\n    [SPECIES_BUTTERFREE] = gMonFootprint_Butterfree,\n    [SPECIES_WEEDLE] = gMonFootprint_Weedle,\n    [SPECIES_KAKUNA] = gMonFootprint_Kakuna,\n    [SPECIES_BEEDRILL] = gMonFootprint_Beedrill,\n    [SPECIES_PIDGEY] = gMonFootprint_Pidgey,\n    [SPECIES_PIDGEOTTO] = gMonFootprint_Pidgeotto,\n    [SPECIES_PIDGEOT] = gMonFootprint_Pidgeot,\n    [SPECIES_RATTATA] = gMonFootprint_Rattata,\n    [SPECIES_RATICATE] = gMonFootprint_Raticate,\n    [SPECIES_SPEAROW] = gMonFootprint_Spearow,\n    [SPECIES_FEAROW] = gMonFootprint_Fearow,\n    [SPECIES_EKANS] = gMonFootprint_Ekans,\n    [SPECIES_ARBOK] = gMonFootprint_Arbok,\n    [SPECIES_PIKACHU] = gMonFootprint_Pikachu,\n    [SPECIES_RAICHU] = gMonFootprint_Raichu,\n    [SPECIES_SANDSHREW] = gMonFootprint_Sandshrew,\n    [SPECIES_SANDSLASH] = gMonFootprint_Sandslash,\n    [SPECIES_NIDORAN_F] = gMonFootprint_NidoranF,\n    [SPECIES_NIDORINA] = gMonFootprint_Nidorina,\n    [SPECIES_NIDOQUEEN] = gMonFootprint_Nidoqueen,\n    [SPECIES_NIDORAN_M] = gMonFootprint_NidoranM,\n    [SPECIES_NIDORINO] = gMonFootprint_Nidorino,\n    [SPECIES_NIDOKING] = gMonFootprint_Nidoking,\n    [SPECIES_CLEFAIRY] = gMonFootprint_Clefairy,\n    [SPECIES_CLEFABLE] = gMonFootprint_Clefable,\n    [SPECIES_VULPIX] = gMonFootprint_Vulpix,\n    [SPECIES_NINETALES] = gMonFootprint_Ninetales,\n    [SPECIES_JIGGLYPUFF] = gMonFootprint_Jigglypuff,\n    [SPECIES_WIGGLYTUFF] = gMonFootprint_Wigglytuff,\n    [SPECIES_ZUBAT] = gMonFootprint_Zubat,\n    [SPECIES_GOLBAT] = gMonFootprint_Golbat,\n    [SPECIES_ODDISH] = gMonFootprint_Oddish,\n    [SPECIES_GLOOM] = gMonFootprint_Gloom,\n    [SPECIES_VILEPLUME] = gMonFootprint_Vileplume,\n    [SPECIES_PARAS] = gMonFootprint_Paras,\n    [SPECIES_PARASECT] = gMonFootprint_Parasect,\n    [SPECIES_VENONAT] = gMonFootprint_Venonat,\n    [SPECIES_VENOMOTH] = gMonFootprint_Venomoth,\n    [SPECIES_DIGLETT] = gMonFootprint_Diglett,\n    [SPECIES_DUGTRIO] = gMonFootprint_Dugtrio,\n    [SPECIES_MEOWTH] = gMonFootprint_Meowth,\n    [SPECIES_PERSIAN] = gMonFootprint_Persian,\n    [SPECIES_PSYDUCK] = gMonFootprint_Psyduck,\n    [SPECIES_GOLDUCK] = gMonFootprint_Golduck,\n    [SPECIES_MANKEY] = gMonFootprint_Mankey,\n    [SPECIES_PRIMEAPE] = gMonFootprint_Primeape,\n    [SPECIES_GROWLITHE] = gMonFootprint_Growlithe,\n    [SPECIES_ARCANINE] = gMonFootprint_Arcanine,\n    [SPECIES_POLIWAG] = gMonFootprint_Poliwag,\n    [SPECIES_POLIWHIRL] = gMonFootprint_Poliwhirl,\n    [SPECIES_POLIWRATH] = gMonFootprint_Poliwrath,\n    [SPECIES_ABRA] = gMonFootprint_Abra,\n    [SPECIES_KADABRA] = gMonFootprint_Kadabra,\n    [SPECIES_ALAKAZAM] = gMonFootprint_Alakazam,\n    [SPECIES_MACHOP] = gMonFootprint_Machop,\n    [SPECIES_MACHOKE] = gMonFootprint_Machoke,\n    [SPECIES_MACHAMP] = gMonFootprint_Machamp,\n    [SPECIES_BELLSPROUT] = gMonFootprint_Bellsprout,\n    [SPECIES_WEEPINBELL] = gMonFootprint_Weepinbell,\n    [SPECIES_VICTREEBEL] = gMonFootprint_Victreebel,\n    [SPECIES_TENTACOOL] = gMonFootprint_Tentacool,\n    [SPECIES_TENTACRUEL] = gMonFootprint_Tentacruel,\n    [SPECIES_GEODUDE] = gMonFootprint_Geodude,\n    [SPECIES_GRAVELER] = gMonFootprint_Graveler,\n    [SPECIES_GOLEM] = gMonFootprint_Golem,\n    [SPECIES_PONYTA] = gMonFootprint_Ponyta,\n    [SPECIES_RAPIDASH] = gMonFootprint_Rapidash,\n    [SPECIES_SLOWPOKE] = gMonFootprint_Slowpoke,\n    [SPECIES_SLOWBRO] = gMonFootprint_Slowbro,\n    [SPECIES_MAGNEMITE] = gMonFootprint_Magnemite,\n    [SPECIES_MAGNETON] = gMonFootprint_Magneton,\n    [SPECIES_FARFETCHD] = gMonFootprint_Farfetchd,\n    [SPECIES_DODUO] = gMonFootprint_Doduo,\n    [SPECIES_DODRIO] = gMonFootprint_Dodrio,\n    [SPECIES_SEEL] = gMonFootprint_Seel,\n    [SPECIES_DEWGONG] = gMonFootprint_Dewgong,\n    [SPECIES_GRIMER] = gMonFootprint_Grimer,\n    [SPECIES_MUK] = gMonFootprint_Muk,\n    [SPECIES_SHELLDER] = gMonFootprint_Shellder,\n    [SPECIES_CLOYSTER] = gMonFootprint_Cloyster,\n    [SPECIES_GASTLY] = gMonFootprint_Gastly,\n    [SPECIES_HAUNTER] = gMonFootprint_Haunter,\n    [SPECIES_GENGAR] = gMonFootprint_Gengar,\n    [SPECIES_ONIX] = gMonFootprint_Onix,\n    [SPECIES_DROWZEE] = gMonFootprint_Drowzee,\n    [SPECIES_HYPNO] = gMonFootprint_Hypno,\n    [SPECIES_KRABBY] = gMonFootprint_Krabby,\n    [SPECIES_KINGLER] = gMonFootprint_Kingler,\n    [SPECIES_VOLTORB] = gMonFootprint_Voltorb,\n    [SPECIES_ELECTRODE] = gMonFootprint_Electrode,\n    [SPECIES_EXEGGCUTE] = gMonFootprint_Exeggcute,\n    [SPECIES_EXEGGUTOR] = gMonFootprint_Exeggutor,\n    [SPECIES_CUBONE] = gMonFootprint_Cubone,\n    [SPECIES_MAROWAK] = gMonFootprint_Marowak,\n    [SPECIES_HITMONLEE] = gMonFootprint_Hitmonlee,\n    [SPECIES_HITMONCHAN] = gMonFootprint_Hitmonchan,\n    [SPECIES_LICKITUNG] = gMonFootprint_Lickitung,\n    [SPECIES_KOFFING] = gMonFootprint_Koffing,\n    [SPECIES_WEEZING] = gMonFootprint_Weezing,\n    [SPECIES_RHYHORN] = gMonFootprint_Rhyhorn,\n    [SPECIES_RHYDON] = gMonFootprint_Rhydon,\n    [SPECIES_CHANSEY] = gMonFootprint_Chansey,\n    [SPECIES_TANGELA] = gMonFootprint_Tangela,\n    [SPECIES_KANGASKHAN] = gMonFootprint_Kangaskhan,\n    [SPECIES_HORSEA] = gMonFootprint_Horsea,\n    [SPECIES_SEADRA] = gMonFootprint_Seadra,\n    [SPECIES_GOLDEEN] = gMonFootprint_Goldeen,\n    [SPECIES_SEAKING] = gMonFootprint_Seaking,\n    [SPECIES_STARYU] = gMonFootprint_Staryu,\n    [SPECIES_STARMIE] = gMonFootprint_Starmie,\n    [SPECIES_MR_MIME] = gMonFootprint_Mrmime,\n    [SPECIES_SCYTHER] = gMonFootprint_Scyther,\n    [SPECIES_JYNX] = gMonFootprint_Jynx,\n    [SPECIES_ELECTABUZZ] = gMonFootprint_Electabuzz,\n    [SPECIES_MAGMAR] = gMonFootprint_Magmar,\n    [SPECIES_PINSIR] = gMonFootprint_Pinsir,\n    [SPECIES_TAUROS] = gMonFootprint_Tauros,\n    [SPECIES_MAGIKARP] = gMonFootprint_Magikarp,\n    [SPECIES_GYARADOS] = gMonFootprint_Gyarados,\n    [SPECIES_LAPRAS] = gMonFootprint_Lapras,\n    [SPECIES_DITTO] = gMonFootprint_Ditto,\n    [SPECIES_EEVEE] = gMonFootprint_Eevee,\n    [SPECIES_VAPOREON] = gMonFootprint_Vaporeon,\n    [SPECIES_JOLTEON] = gMonFootprint_Jolteon,\n    [SPECIES_FLAREON] = gMonFootprint_Flareon,\n    [SPECIES_PORYGON] = gMonFootprint_Porygon,\n    [SPECIES_OMANYTE] = gMonFootprint_Omanyte,\n    [SPECIES_OMASTAR] = gMonFootprint_Omastar,\n    [SPECIES_KABUTO] = gMonFootprint_Kabuto,\n    [SPECIES_KABUTOPS] = gMonFootprint_Kabutops,\n    [SPECIES_AERODACTYL] = gMonFootprint_Aerodactyl,\n    [SPECIES_SNORLAX] = gMonFootprint_Snorlax,\n    [SPECIES_ARTICUNO] = gMonFootprint_Articuno,\n    [SPECIES_ZAPDOS] = gMonFootprint_Zapdos,\n    [SPECIES_MOLTRES] = gMonFootprint_Moltres,\n    [SPECIES_DRATINI] = gMonFootprint_Dratini,\n    [SPECIES_DRAGONAIR] = gMonFootprint_Dragonair,\n    [SPECIES_DRAGONITE] = gMonFootprint_Dragonite,\n    [SPECIES_MEWTWO] = gMonFootprint_Mewtwo,\n    [SPECIES_MEW] = gMonFootprint_Mew,\n    [SPECIES_CHIKORITA] = gMonFootprint_Chikorita,\n    [SPECIES_BAYLEEF] = gMonFootprint_Bayleef,\n    [SPECIES_MEGANIUM] = gMonFootprint_Meganium,\n    [SPECIES_CYNDAQUIL] = gMonFootprint_Cyndaquil,\n    [SPECIES_QUILAVA] = gMonFootprint_Quilava,\n    [SPECIES_TYPHLOSION] = gMonFootprint_Typhlosion,\n    [SPECIES_TOTODILE] = gMonFootprint_Totodile,\n    [SPECIES_CROCONAW] = gMonFootprint_Croconaw,\n    [SPECIES_FERALIGATR] = gMonFootprint_Feraligatr,\n    [SPECIES_SENTRET] = gMonFootprint_Sentret,\n    [SPECIES_FURRET] = gMonFootprint_Furret,\n    [SPECIES_HOOTHOOT] = gMonFootprint_Hoothoot,\n    [SPECIES_NOCTOWL] = gMonFootprint_Noctowl,\n    [SPECIES_LEDYBA] = gMonFootprint_Ledyba,\n    [SPECIES_LEDIAN] = gMonFootprint_Ledian,\n    [SPECIES_SPINARAK] = gMonFootprint_Spinarak,\n    [SPECIES_ARIADOS] = gMonFootprint_Ariados,\n    [SPECIES_CROBAT] = gMonFootprint_Crobat,\n    [SPECIES_CHINCHOU] = gMonFootprint_Chinchou,\n    [SPECIES_LANTURN] = gMonFootprint_Lanturn,\n    [SPECIES_PICHU] = gMonFootprint_Pichu,\n    [SPECIES_CLEFFA] = gMonFootprint_Cleffa,\n    [SPECIES_IGGLYBUFF] = gMonFootprint_Igglybuff,\n    [SPECIES_TOGEPI] = gMonFootprint_Togepi,\n    [SPECIES_TOGETIC] = gMonFootprint_Togetic,\n    [SPECIES_NATU] = gMonFootprint_Natu,\n    [SPECIES_XATU] = gMonFootprint_Xatu,\n    [SPECIES_MAREEP] = gMonFootprint_Mareep,\n    [SPECIES_FLAAFFY] = gMonFootprint_Flaaffy,\n    [SPECIES_AMPHAROS] = gMonFootprint_Ampharos,\n    [SPECIES_BELLOSSOM] = gMonFootprint_Bellossom,\n    [SPECIES_MARILL] = gMonFootprint_Marill,\n    [SPECIES_AZUMARILL] = gMonFootprint_Azumarill,\n    [SPECIES_SUDOWOODO] = gMonFootprint_Sudowoodo,\n    [SPECIES_POLITOED] = gMonFootprint_Politoed,\n    [SPECIES_HOPPIP] = gMonFootprint_Hoppip,\n    [SPECIES_SKIPLOOM] = gMonFootprint_Skiploom,\n    [SPECIES_JUMPLUFF] = gMonFootprint_Jumpluff,\n    [SPECIES_AIPOM] = gMonFootprint_Aipom,\n    [SPECIES_SUNKERN] = gMonFootprint_Sunkern,\n    [SPECIES_SUNFLORA] = gMonFootprint_Sunflora,\n    [SPECIES_YANMA] = gMonFootprint_Yanma,\n    [SPECIES_WOOPER] = gMonFootprint_Wooper,\n    [SPECIES_QUAGSIRE] = gMonFootprint_Quagsire,\n    [SPECIES_ESPEON] = gMonFootprint_Espeon,\n    [SPECIES_UMBREON] = gMonFootprint_Umbreon,\n    [SPECIES_MURKROW] = gMonFootprint_Murkrow,\n    [SPECIES_SLOWKING] = gMonFootprint_Slowking,\n    [SPECIES_MISDREAVUS] = gMonFootprint_Misdreavus,\n    [SPECIES_UNOWN] = gMonFootprint_Unown,\n    [SPECIES_WOBBUFFET] = gMonFootprint_Wobbuffet,\n    [SPECIES_GIRAFARIG] = gMonFootprint_Girafarig,\n    [SPECIES_PINECO] = gMonFootprint_Pineco,\n    [SPECIES_FORRETRESS] = gMonFootprint_Forretress,\n    [SPECIES_DUNSPARCE] = gMonFootprint_Dunsparce,\n    [SPECIES_GLIGAR] = gMonFootprint_Gligar,\n    [SPECIES_STEELIX] = gMonFootprint_Steelix,\n    [SPECIES_SNUBBULL] = gMonFootprint_Snubbull,\n    [SPECIES_GRANBULL] = gMonFootprint_Granbull,\n    [SPECIES_QWILFISH] = gMonFootprint_Qwilfish,\n    [SPECIES_SCIZOR] = gMonFootprint_Scizor,\n    [SPECIES_SHUCKLE] = gMonFootprint_Shuckle,\n    [SPECIES_HERACROSS] = gMonFootprint_Heracross,\n    [SPECIES_SNEASEL] = gMonFootprint_Sneasel,\n    [SPECIES_TEDDIURSA] = gMonFootprint_Teddiursa,\n    [SPECIES_URSARING] = gMonFootprint_Ursaring,\n    [SPECIES_SLUGMA] = gMonFootprint_Slugma,\n    [SPECIES_MAGCARGO] = gMonFootprint_Magcargo,\n    [SPECIES_SWINUB] = gMonFootprint_Swinub,\n    [SPECIES_PILOSWINE] = gMonFootprint_Piloswine,\n    [SPECIES_CORSOLA] = gMonFootprint_Corsola,\n    [SPECIES_REMORAID] = gMonFootprint_Remoraid,\n    [SPECIES_OCTILLERY] = gMonFootprint_Octillery,\n    [SPECIES_DELIBIRD] = gMonFootprint_Delibird,\n    [SPECIES_MANTINE] = gMonFootprint_Mantine,\n    [SPECIES_SKARMORY] = gMonFootprint_Skarmory,\n    [SPECIES_HOUNDOUR] = gMonFootprint_Houndour,\n    [SPECIES_HOUNDOOM] = gMonFootprint_Houndoom,\n    [SPECIES_KINGDRA] = gMonFootprint_Kingdra,\n    [SPECIES_PHANPY] = gMonFootprint_Phanpy,\n    [SPECIES_DONPHAN] = gMonFootprint_Donphan,\n    [SPECIES_PORYGON2] = gMonFootprint_Porygon2,\n    [SPECIES_STANTLER] = gMonFootprint_Stantler,\n    [SPECIES_SMEARGLE] = gMonFootprint_Smeargle,\n    [SPECIES_TYROGUE] = gMonFootprint_Tyrogue,\n    [SPECIES_HITMONTOP] = gMonFootprint_Hitmontop,\n    [SPECIES_SMOOCHUM] = gMonFootprint_Smoochum,\n    [SPECIES_ELEKID] = gMonFootprint_Elekid,\n    [SPECIES_MAGBY] = gMonFootprint_Magby,\n    [SPECIES_MILTANK] = gMonFootprint_Miltank,\n    [SPECIES_BLISSEY] = gMonFootprint_Blissey,\n    [SPECIES_RAIKOU] = gMonFootprint_Raikou,\n    [SPECIES_ENTEI] = gMonFootprint_Entei,\n    [SPECIES_SUICUNE] = gMonFootprint_Suicune,\n    [SPECIES_LARVITAR] = gMonFootprint_Larvitar,\n    [SPECIES_PUPITAR] = gMonFootprint_Pupitar,\n    [SPECIES_TYRANITAR] = gMonFootprint_Tyranitar,\n    [SPECIES_LUGIA] = gMonFootprint_Lugia,\n    [SPECIES_HO_OH] = gMonFootprint_HoOh,\n    [SPECIES_CELEBI] = gMonFootprint_Celebi,\n    [SPECIES_OLD_UNOWN_B] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_C] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_D] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_E] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_F] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_G] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_H] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_I] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_J] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_K] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_L] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_M] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_N] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_O] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_P] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_Q] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_R] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_S] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_T] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_U] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_V] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_W] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_X] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_Y] = gMonFootprint_QuestionMark,\n    [SPECIES_OLD_UNOWN_Z] = gMonFootprint_QuestionMark,\n    [SPECIES_TREECKO] = gMonFootprint_Treecko,\n    [SPECIES_GROVYLE] = gMonFootprint_Grovyle,\n    [SPECIES_SCEPTILE] = gMonFootprint_Sceptile,\n    [SPECIES_TORCHIC] = gMonFootprint_Torchic,\n    [SPECIES_COMBUSKEN] = gMonFootprint_Combusken,\n    [SPECIES_BLAZIKEN] = gMonFootprint_Blaziken,\n    [SPECIES_MUDKIP] = gMonFootprint_Mudkip,\n    [SPECIES_MARSHTOMP] = gMonFootprint_Marshtomp,\n    [SPECIES_SWAMPERT] = gMonFootprint_Swampert,\n    [SPECIES_POOCHYENA] = gMonFootprint_Poochyena,\n    [SPECIES_MIGHTYENA] = gMonFootprint_Mightyena,\n    [SPECIES_ZIGZAGOON] = gMonFootprint_Zigzagoon,\n    [SPECIES_LINOONE] = gMonFootprint_Linoone,\n    [SPECIES_WURMPLE] = gMonFootprint_Wurmple,\n    [SPECIES_SILCOON] = gMonFootprint_Silcoon,\n    [SPECIES_BEAUTIFLY] = gMonFootprint_Beautifly,\n    [SPECIES_CASCOON] = gMonFootprint_Cascoon,\n    [SPECIES_DUSTOX] = gMonFootprint_Dustox,\n    [SPECIES_LOTAD] = gMonFootprint_Lotad,\n    [SPECIES_LOMBRE] = gMonFootprint_Lombre,\n    [SPECIES_LUDICOLO] = gMonFootprint_Ludicolo,\n    [SPECIES_SEEDOT] = gMonFootprint_Seedot,\n    [SPECIES_NUZLEAF] = gMonFootprint_Nuzleaf,\n    [SPECIES_SHIFTRY] = gMonFootprint_Shiftry,\n    [SPECIES_NINCADA] = gMonFootprint_Nincada,\n    [SPECIES_NINJASK] = gMonFootprint_Ninjask,\n    [SPECIES_SHEDINJA] = gMonFootprint_Shedinja,\n    [SPECIES_TAILLOW] = gMonFootprint_Taillow,\n    [SPECIES_SWELLOW] = gMonFootprint_Swellow,\n    [SPECIES_SHROOMISH] = gMonFootprint_Shroomish,\n    [SPECIES_BRELOOM] = gMonFootprint_Breloom,\n    [SPECIES_SPINDA] = gMonFootprint_Spinda,\n    [SPECIES_WINGULL] = gMonFootprint_Wingull,\n    [SPECIES_PELIPPER] = gMonFootprint_Pelipper,\n    [SPECIES_SURSKIT] = gMonFootprint_Surskit,\n    [SPECIES_MASQUERAIN] = gMonFootprint_Masquerain,\n    [SPECIES_WAILMER] = gMonFootprint_Wailmer,\n    [SPECIES_WAILORD] = gMonFootprint_Wailord,\n    [SPECIES_SKITTY] = gMonFootprint_Skitty,\n    [SPECIES_DELCATTY] = gMonFootprint_Delcatty,\n    [SPECIES_KECLEON] = gMonFootprint_Kecleon,\n    [SPECIES_BALTOY] = gMonFootprint_Baltoy,\n    [SPECIES_CLAYDOL] = gMonFootprint_Claydol,\n    [SPECIES_NOSEPASS] = gMonFootprint_Nosepass,\n    [SPECIES_TORKOAL] = gMonFootprint_Torkoal,\n    [SPECIES_SABLEYE] = gMonFootprint_Sableye,\n    [SPECIES_BARBOACH] = gMonFootprint_Barboach,\n    [SPECIES_WHISCASH] = gMonFootprint_Whiscash,\n    [SPECIES_LUVDISC] = gMonFootprint_Luvdisc,\n    [SPECIES_CORPHISH] = gMonFootprint_Corphish,\n    [SPECIES_CRAWDAUNT] = gMonFootprint_Crawdaunt,\n    [SPECIES_FEEBAS] = gMonFootprint_Feebas,\n    [SPECIES_MILOTIC] = gMonFootprint_Milotic,\n    [SPECIES_CARVANHA] = gMonFootprint_Carvanha,\n    [SPECIES_SHARPEDO] = gMonFootprint_Sharpedo,\n    [SPECIES_TRAPINCH] = gMonFootprint_Trapinch,\n    [SPECIES_VIBRAVA] = gMonFootprint_Vibrava,\n    [SPECIES_FLYGON] = gMonFootprint_Flygon,\n    [SPECIES_MAKUHITA] = gMonFootprint_Makuhita,\n    [SPECIES_HARIYAMA] = gMonFootprint_Hariyama,\n    [SPECIES_ELECTRIKE] = gMonFootprint_Electrike,\n    [SPECIES_MANECTRIC] = gMonFootprint_Manectric,\n    [SPECIES_NUMEL] = gMonFootprint_Numel,\n    [SPECIES_CAMERUPT] = gMonFootprint_Camerupt,\n    [SPECIES_SPHEAL] = gMonFootprint_Spheal,\n    [SPECIES_SEALEO] = gMonFootprint_Sealeo,\n    [SPECIES_WALREIN] = gMonFootprint_Walrein,\n    [SPECIES_CACNEA] = gMonFootprint_Cacnea,\n    [SPECIES_CACTURNE] = gMonFootprint_Cacturne,\n    [SPECIES_SNORUNT] = gMonFootprint_Snorunt,\n    [SPECIES_GLALIE] = gMonFootprint_Glalie,\n    [SPECIES_LUNATONE] = gMonFootprint_Lunatone,\n    [SPECIES_SOLROCK] = gMonFootprint_Solrock,\n    [SPECIES_AZURILL] = gMonFootprint_Azurill,\n    [SPECIES_SPOINK] = gMonFootprint_Spoink,\n    [SPECIES_GRUMPIG] = gMonFootprint_Grumpig,\n    [SPECIES_PLUSLE] = gMonFootprint_Plusle,\n    [SPECIES_MINUN] = gMonFootprint_Minun,\n    [SPECIES_MAWILE] = gMonFootprint_Mawile,\n    [SPECIES_MEDITITE] = gMonFootprint_Meditite,\n    [SPECIES_MEDICHAM] = gMonFootprint_Medicham,\n    [SPECIES_SWABLU] = gMonFootprint_Swablu,\n    [SPECIES_ALTARIA] = gMonFootprint_Altaria,\n    [SPECIES_WYNAUT] = gMonFootprint_Wynaut,\n    [SPECIES_DUSKULL] = gMonFootprint_Duskull,\n    [SPECIES_DUSCLOPS] = gMonFootprint_Dusclops,\n    [SPECIES_ROSELIA] = gMonFootprint_Roselia,\n    [SPECIES_SLAKOTH] = gMonFootprint_Slakoth,\n    [SPECIES_VIGOROTH] = gMonFootprint_Vigoroth,\n    [SPECIES_SLAKING] = gMonFootprint_Slaking,\n    [SPECIES_GULPIN] = gMonFootprint_Gulpin,\n    [SPECIES_SWALOT] = gMonFootprint_Swalot,\n    [SPECIES_TROPIUS] = gMonFootprint_Tropius,\n    [SPECIES_WHISMUR] = gMonFootprint_Whismur,\n    [SPECIES_LOUDRED] = gMonFootprint_Loudred,\n    [SPECIES_EXPLOUD] = gMonFootprint_Exploud,\n    [SPECIES_CLAMPERL] = gMonFootprint_Clamperl,\n    [SPECIES_HUNTAIL] = gMonFootprint_Huntail,\n    [SPECIES_GOREBYSS] = gMonFootprint_Gorebyss,\n    [SPECIES_ABSOL] = gMonFootprint_Absol,\n    [SPECIES_SHUPPET] = gMonFootprint_Shuppet,\n    [SPECIES_BANETTE] = gMonFootprint_Banette,\n    [SPECIES_SEVIPER] = gMonFootprint_Seviper,\n    [SPECIES_ZANGOOSE] = gMonFootprint_Zangoose,\n    [SPECIES_RELICANTH] = gMonFootprint_Relicanth,\n    [SPECIES_ARON] = gMonFootprint_Aron,\n    [SPECIES_LAIRON] = gMonFootprint_Lairon,\n    [SPECIES_AGGRON] = gMonFootprint_Aggron,\n    [SPECIES_CASTFORM] = gMonFootprint_Castform,\n    [SPECIES_VOLBEAT] = gMonFootprint_Volbeat,\n    [SPECIES_ILLUMISE] = gMonFootprint_Illumise,\n    [SPECIES_LILEEP] = gMonFootprint_Lileep,\n    [SPECIES_CRADILY] = gMonFootprint_Cradily,\n    [SPECIES_ANORITH] = gMonFootprint_Anorith,\n    [SPECIES_ARMALDO] = gMonFootprint_Armaldo,\n    [SPECIES_RALTS] = gMonFootprint_Ralts,\n    [SPECIES_KIRLIA] = gMonFootprint_Kirlia,\n    [SPECIES_GARDEVOIR] = gMonFootprint_Gardevoir,\n    [SPECIES_BAGON] = gMonFootprint_Bagon,\n    [SPECIES_SHELGON] = gMonFootprint_Shelgon,\n    [SPECIES_SALAMENCE] = gMonFootprint_Salamence,\n    [SPECIES_BELDUM] = gMonFootprint_Beldum,\n    [SPECIES_METANG] = gMonFootprint_Metang,\n    [SPECIES_METAGROSS] = gMonFootprint_Metagross,\n    [SPECIES_REGIROCK] = gMonFootprint_Regirock,\n    [SPECIES_REGICE] = gMonFootprint_Regice,\n    [SPECIES_REGISTEEL] = gMonFootprint_Registeel,\n    [SPECIES_KYOGRE] = gMonFootprint_Kyogre,\n    [SPECIES_GROUDON] = gMonFootprint_Groudon,\n    [SPECIES_RAYQUAZA] = gMonFootprint_Rayquaza,\n    [SPECIES_LATIAS] = gMonFootprint_Latias,\n    [SPECIES_LATIOS] = gMonFootprint_Latios,\n    [SPECIES_JIRACHI] = gMonFootprint_Jirachi,\n    [SPECIES_DEOXYS] = gMonFootprint_Deoxys,\n    [SPECIES_CHIMECHO] = gMonFootprint_Chimecho,\n    [SPECIES_EGG] = gMonFootprint_Bulbasaur,\n};\n"
  },
  {
    "path": "src/data/pokemon_graphics/front_pic_coordinates.h",
    "content": "const struct MonCoords gMonFrontPicCoords[] =\n{\n    [SPECIES_NONE] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_BULBASAUR] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 16,\n    },\n    [SPECIES_IVYSAUR] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_VENUSAUR] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_CHARMANDER] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_CHARMELEON] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_CHARIZARD] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_SQUIRTLE] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_WARTORTLE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_BLASTOISE] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_CATERPIE] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_METAPOD] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 20,\n    },\n    [SPECIES_BUTTERFREE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_WEEDLE] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_KAKUNA] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_BEEDRILL] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_PIDGEY] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_PIDGEOTTO] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_PIDGEOT] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_RATTATA] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_RATICATE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_SPEAROW] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_FEAROW] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_EKANS] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_ARBOK] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_PIKACHU] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 9,\n    },\n    [SPECIES_RAICHU] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_SANDSHREW] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_SANDSLASH] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_NIDORAN_F] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_NIDORINA] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_NIDOQUEEN] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_NIDORAN_M] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_NIDORINO] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_NIDOKING] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_CLEFAIRY] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 16,\n    },\n    [SPECIES_CLEFABLE] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_VULPIX] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_NINETALES] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_JIGGLYPUFF] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 16,\n    },\n    [SPECIES_WIGGLYTUFF] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 8,\n    },\n    [SPECIES_ZUBAT] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 13,\n    },\n    [SPECIES_GOLBAT] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_ODDISH] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_GLOOM] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_VILEPLUME] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_PARAS] =\n    {\n        .size = MON_COORDS_SIZE(48, 32),\n        .y_offset = 18,\n    },\n    [SPECIES_PARASECT] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_VENONAT] =\n    {\n        .size = MON_COORDS_SIZE(40, 56),\n        .y_offset = 11,\n    },\n    [SPECIES_VENOMOTH] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 8,\n    },\n    [SPECIES_DIGLETT] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_DUGTRIO] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_MEOWTH] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_PERSIAN] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_PSYDUCK] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_GOLDUCK] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_MANKEY] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 14,\n    },\n    [SPECIES_PRIMEAPE] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_GROWLITHE] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_ARCANINE] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_POLIWAG] =\n    {\n        .size = MON_COORDS_SIZE(56, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_POLIWHIRL] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_POLIWRATH] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_ABRA] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_KADABRA] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_ALAKAZAM] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_MACHOP] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_MACHOKE] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_MACHAMP] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_BELLSPROUT] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 15,\n    },\n    [SPECIES_WEEPINBELL] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_VICTREEBEL] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_TENTACOOL] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_TENTACRUEL] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_GEODUDE] =\n    {\n        .size = MON_COORDS_SIZE(56, 32),\n        .y_offset = 18,\n    },\n    [SPECIES_GRAVELER] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_GOLEM] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_PONYTA] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_RAPIDASH] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_SLOWPOKE] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_SLOWBRO] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_MAGNEMITE] =\n    {\n        .size = MON_COORDS_SIZE(40, 24),\n        .y_offset = 22,\n    },\n    [SPECIES_MAGNETON] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 16,\n    },\n    [SPECIES_FARFETCHD] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_DODUO] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_DODRIO] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_SEEL] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_DEWGONG] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_GRIMER] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_MUK] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_SHELLDER] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 16,\n    },\n    [SPECIES_CLOYSTER] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_GASTLY] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_HAUNTER] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_GENGAR] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_ONIX] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_DROWZEE] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_HYPNO] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_KRABBY] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_KINGLER] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_VOLTORB] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 19,\n    },\n    [SPECIES_ELECTRODE] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_EXEGGCUTE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_EXEGGUTOR] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_CUBONE] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_MAROWAK] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 13,\n    },\n    [SPECIES_HITMONLEE] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_HITMONCHAN] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_LICKITUNG] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_KOFFING] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_WEEZING] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 7,\n    },\n    [SPECIES_RHYHORN] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_RHYDON] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_CHANSEY] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_TANGELA] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_KANGASKHAN] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_HORSEA] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 16,\n    },\n    [SPECIES_SEADRA] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_GOLDEEN] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_SEAKING] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_STARYU] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 13,\n    },\n    [SPECIES_STARMIE] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 10,\n    },\n    [SPECIES_MR_MIME] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_SCYTHER] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_JYNX] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_ELECTABUZZ] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 4,\n    },\n    [SPECIES_MAGMAR] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_PINSIR] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_TAUROS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 5,\n    },\n    [SPECIES_MAGIKARP] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 11,\n    },\n    [SPECIES_GYARADOS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_LAPRAS] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_DITTO] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_EEVEE] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 13,\n    },\n    [SPECIES_VAPOREON] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_JOLTEON] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_FLAREON] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_PORYGON] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_OMANYTE] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_OMASTAR] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_KABUTO] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 20,\n    },\n    [SPECIES_KABUTOPS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_AERODACTYL] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_SNORLAX] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_ARTICUNO] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_ZAPDOS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 4,\n    },\n    [SPECIES_MOLTRES] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_DRATINI] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_DRAGONAIR] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_DRAGONITE] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_MEWTWO] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_MEW] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 13,\n    },\n    [SPECIES_CHIKORITA] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_BAYLEEF] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_MEGANIUM] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_CYNDAQUIL] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_QUILAVA] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_TYPHLOSION] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_TOTODILE] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_CROCONAW] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_FERALIGATR] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_SENTRET] =\n    {\n        .size = MON_COORDS_SIZE(32, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_FURRET] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_HOOTHOOT] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_NOCTOWL] =\n    {\n        .size = MON_COORDS_SIZE(40, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_LEDYBA] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 12,\n    },\n    [SPECIES_LEDIAN] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_SPINARAK] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 19,\n    },\n    [SPECIES_ARIADOS] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_CROBAT] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_CHINCHOU] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 16,\n    },\n    [SPECIES_LANTURN] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 11,\n    },\n    [SPECIES_PICHU] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_CLEFFA] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 20,\n    },\n    [SPECIES_IGGLYBUFF] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 18,\n    },\n    [SPECIES_TOGEPI] =\n    {\n        .size = MON_COORDS_SIZE(24, 32),\n        .y_offset = 20,\n    },\n    [SPECIES_TOGETIC] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_NATU] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 20,\n    },\n    [SPECIES_XATU] =\n    {\n        .size = MON_COORDS_SIZE(32, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_MAREEP] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 16,\n    },\n    [SPECIES_FLAAFFY] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_AMPHAROS] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_BELLOSSOM] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_MARILL] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_AZUMARILL] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_SUDOWOODO] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_POLITOED] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_HOPPIP] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_SKIPLOOM] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_JUMPLUFF] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_AIPOM] =\n    {\n        .size = MON_COORDS_SIZE(40, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_SUNKERN] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_SUNFLORA] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_YANMA] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_WOOPER] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_QUAGSIRE] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_ESPEON] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_UMBREON] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 8,\n    },\n    [SPECIES_MURKROW] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_SLOWKING] =\n    {\n        .size = MON_COORDS_SIZE(40, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_MISDREAVUS] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_UNOWN] =\n    {\n        .size = MON_COORDS_SIZE(24, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_WOBBUFFET] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_GIRAFARIG] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_PINECO] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_FORRETRESS] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_DUNSPARCE] =\n    {\n        .size = MON_COORDS_SIZE(56, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_GLIGAR] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_STEELIX] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_SNUBBULL] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_GRANBULL] =\n    {\n        .size = MON_COORDS_SIZE(40, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_QWILFISH] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_SCIZOR] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_SHUCKLE] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_HERACROSS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_SNEASEL] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_TEDDIURSA] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_URSARING] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_SLUGMA] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_MAGCARGO] =\n    {\n        .size = MON_COORDS_SIZE(40, 56),\n        .y_offset = 13,\n    },\n    [SPECIES_SWINUB] =\n    {\n        .size = MON_COORDS_SIZE(32, 24),\n        .y_offset = 20,\n    },\n    [SPECIES_PILOSWINE] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_CORSOLA] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_REMORAID] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_OCTILLERY] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_DELIBIRD] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_MANTINE] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_SKARMORY] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_HOUNDOUR] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_HOUNDOOM] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_KINGDRA] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 4,\n    },\n    [SPECIES_PHANPY] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_DONPHAN] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_PORYGON2] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_STANTLER] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_SMEARGLE] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_TYROGUE] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_HITMONTOP] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_SMOOCHUM] =\n    {\n        .size = MON_COORDS_SIZE(24, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_ELEKID] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_MAGBY] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_MILTANK] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_BLISSEY] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_RAIKOU] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_ENTEI] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_SUICUNE] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_LARVITAR] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_PUPITAR] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_TYRANITAR] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_LUGIA] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_HO_OH] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_CELEBI] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_OLD_UNOWN_B] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_C] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_D] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_E] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_F] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_G] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_H] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_I] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_J] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_K] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_L] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_M] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_N] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_O] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_P] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_Q] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_R] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_S] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_T] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_U] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_V] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_W] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_X] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_Y] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_OLD_UNOWN_Z] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_TREECKO] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_GROVYLE] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_SCEPTILE] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_TORCHIC] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_COMBUSKEN] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_BLAZIKEN] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_MUDKIP] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 12,\n    },\n    [SPECIES_MARSHTOMP] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_SWAMPERT] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_POOCHYENA] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_MIGHTYENA] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_ZIGZAGOON] =\n    {\n        .size = MON_COORDS_SIZE(64, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_LINOONE] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_WURMPLE] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_SILCOON] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 17,\n    },\n    [SPECIES_BEAUTIFLY] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_CASCOON] =\n    {\n        .size = MON_COORDS_SIZE(56, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_DUSTOX] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 15,\n    },\n    [SPECIES_LOTAD] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_LOMBRE] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_LUDICOLO] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_SEEDOT] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 16,\n    },\n    [SPECIES_NUZLEAF] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_SHIFTRY] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_NINCADA] =\n    {\n        .size = MON_COORDS_SIZE(56, 32),\n        .y_offset = 18,\n    },\n    [SPECIES_NINJASK] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_SHEDINJA] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_TAILLOW] =\n    {\n        .size = MON_COORDS_SIZE(48, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_SWELLOW] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_SHROOMISH] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_BRELOOM] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_SPINDA] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 8,\n    },\n    [SPECIES_WINGULL] =\n    {\n        .size = MON_COORDS_SIZE(64, 32),\n        .y_offset = 24,\n    },\n    [SPECIES_PELIPPER] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_SURSKIT] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_MASQUERAIN] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_WAILMER] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_WAILORD] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 10,\n    },\n    [SPECIES_SKITTY] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_DELCATTY] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_KECLEON] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_BALTOY] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 16,\n    },\n    [SPECIES_CLAYDOL] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 6,\n    },\n    [SPECIES_NOSEPASS] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 12,\n    },\n    [SPECIES_TORKOAL] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_SABLEYE] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_BARBOACH] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_WHISCASH] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_LUVDISC] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 24,\n    },\n    [SPECIES_CORPHISH] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 12,\n    },\n    [SPECIES_CRAWDAUNT] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_FEEBAS] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 13,\n    },\n    [SPECIES_MILOTIC] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_CARVANHA] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_SHARPEDO] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_TRAPINCH] =\n    {\n        .size = MON_COORDS_SIZE(40, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_VIBRAVA] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 12,\n    },\n    [SPECIES_FLYGON] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_MAKUHITA] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_HARIYAMA] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_ELECTRIKE] =\n    {\n        .size = MON_COORDS_SIZE(48, 32),\n        .y_offset = 18,\n    },\n    [SPECIES_MANECTRIC] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_NUMEL] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_CAMERUPT] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 9,\n    },\n    [SPECIES_SPHEAL] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 16,\n    },\n    [SPECIES_SEALEO] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_WALREIN] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_CACNEA] =\n    {\n        .size = MON_COORDS_SIZE(56, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_CACTURNE] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_SNORUNT] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_GLALIE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_LUNATONE] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_SOLROCK] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_AZURILL] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_SPOINK] =\n    {\n        .size = MON_COORDS_SIZE(32, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_GRUMPIG] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_PLUSLE] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 14,\n    },\n    [SPECIES_MINUN] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 12,\n    },\n    [SPECIES_MAWILE] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_MEDITITE] =\n    {\n        .size = MON_COORDS_SIZE(48, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_MEDICHAM] =\n    {\n        .size = MON_COORDS_SIZE(48, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_SWABLU] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 17,\n    },\n    [SPECIES_ALTARIA] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_WYNAUT] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_DUSKULL] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 10,\n    },\n    [SPECIES_DUSCLOPS] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_ROSELIA] =\n    {\n        .size = MON_COORDS_SIZE(56, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_SLAKOTH] =\n    {\n        .size = MON_COORDS_SIZE(56, 32),\n        .y_offset = 18,\n    },\n    [SPECIES_VIGOROTH] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_SLAKING] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_GULPIN] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 18,\n    },\n    [SPECIES_SWALOT] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_TROPIUS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_WHISMUR] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_LOUDRED] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_EXPLOUD] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_CLAMPERL] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_HUNTAIL] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_GOREBYSS] =\n    {\n        .size = MON_COORDS_SIZE(64, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_ABSOL] =\n    {\n        .size = MON_COORDS_SIZE(48, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_SHUPPET] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 14,\n    },\n    [SPECIES_BANETTE] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_SEVIPER] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 8,\n    },\n    [SPECIES_ZANGOOSE] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 5,\n    },\n    [SPECIES_RELICANTH] =\n    {\n        .size = MON_COORDS_SIZE(56, 56),\n        .y_offset = 11,\n    },\n    [SPECIES_ARON] =\n    {\n        .size = MON_COORDS_SIZE(32, 24),\n        .y_offset = 20,\n    },\n    [SPECIES_LAIRON] =\n    {\n        .size = MON_COORDS_SIZE(56, 40),\n        .y_offset = 13,\n    },\n    [SPECIES_AGGRON] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_CASTFORM] =\n    {\n        .size = MON_COORDS_SIZE(24, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_VOLBEAT] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_ILLUMISE] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_LILEEP] =\n    {\n        .size = MON_COORDS_SIZE(48, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_CRADILY] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_ANORITH] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 8,\n    },\n    [SPECIES_ARMALDO] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_RALTS] =\n    {\n        .size = MON_COORDS_SIZE(24, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_KIRLIA] =\n    {\n        .size = MON_COORDS_SIZE(32, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_GARDEVOIR] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_BAGON] =\n    {\n        .size = MON_COORDS_SIZE(40, 48),\n        .y_offset = 11,\n    },\n    [SPECIES_SHELGON] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 9,\n    },\n    [SPECIES_SALAMENCE] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_BELDUM] =\n    {\n        .size = MON_COORDS_SIZE(40, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_METANG] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 7,\n    },\n    [SPECIES_METAGROSS] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_REGIROCK] =\n    {\n        .size = MON_COORDS_SIZE(56, 64),\n        .y_offset = 4,\n    },\n    [SPECIES_REGICE] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_REGISTEEL] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 3,\n    },\n    [SPECIES_KYOGRE] =\n    {\n        .size = MON_COORDS_SIZE(64, 56),\n        .y_offset = 4,\n    },\n    [SPECIES_GROUDON] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_RAYQUAZA] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 0,\n    },\n    [SPECIES_LATIAS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_LATIOS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 2,\n    },\n    [SPECIES_JIRACHI] =\n    {\n        .size = MON_COORDS_SIZE(48, 48),\n        .y_offset = 13,\n    },\n    [SPECIES_DEOXYS] =\n    {\n        .size = MON_COORDS_SIZE(64, 64),\n        .y_offset = 1,\n    },\n    [SPECIES_CHIMECHO] =\n    {\n        .size = MON_COORDS_SIZE(24, 56),\n        .y_offset = 6,\n    },\n    [SPECIES_EGG] =\n    {\n        .size = MON_COORDS_SIZE(24, 24),\n        .y_offset = 20,\n    },\n    [SPECIES_UNOWN_B] =\n    {\n        .size = MON_COORDS_SIZE(24, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_UNOWN_C] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_UNOWN_D] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_UNOWN_E] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_UNOWN_F] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_UNOWN_G] =\n    {\n        .size = MON_COORDS_SIZE(24, 40),\n        .y_offset = 14,\n    },\n    [SPECIES_UNOWN_H] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_UNOWN_I] =\n    {\n        .size = MON_COORDS_SIZE(24, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_UNOWN_J] =\n    {\n        .size = MON_COORDS_SIZE(24, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_UNOWN_K] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_UNOWN_L] =\n    {\n        .size = MON_COORDS_SIZE(24, 32),\n        .y_offset = 19,\n    },\n    [SPECIES_UNOWN_M] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 19,\n    },\n    [SPECIES_UNOWN_N] =\n    {\n        .size = MON_COORDS_SIZE(32, 24),\n        .y_offset = 20,\n    },\n    [SPECIES_UNOWN_O] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_UNOWN_P] =\n    {\n        .size = MON_COORDS_SIZE(24, 32),\n        .y_offset = 19,\n    },\n    [SPECIES_UNOWN_Q] =\n    {\n        .size = MON_COORDS_SIZE(32, 24),\n        .y_offset = 21,\n    },\n    [SPECIES_UNOWN_R] =\n    {\n        .size = MON_COORDS_SIZE(24, 32),\n        .y_offset = 19,\n    },\n    [SPECIES_UNOWN_S] =\n    {\n        .size = MON_COORDS_SIZE(32, 40),\n        .y_offset = 12,\n    },\n    [SPECIES_UNOWN_T] =\n    {\n        .size = MON_COORDS_SIZE(24, 32),\n        .y_offset = 18,\n    },\n    [SPECIES_UNOWN_U] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 18,\n    },\n    [SPECIES_UNOWN_V] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 18,\n    },\n    [SPECIES_UNOWN_W] =\n    {\n        .size = MON_COORDS_SIZE(32, 32),\n        .y_offset = 19,\n    },\n    [SPECIES_UNOWN_X] =\n    {\n        .size = MON_COORDS_SIZE(24, 24),\n        .y_offset = 21,\n    },\n    [SPECIES_UNOWN_Y] =\n    {\n        .size = MON_COORDS_SIZE(24, 32),\n        .y_offset = 17,\n    },\n    [SPECIES_UNOWN_Z] =\n    {\n        .size = MON_COORDS_SIZE(24, 32),\n        .y_offset = 16,\n    },\n    [SPECIES_UNOWN_EMARK] =\n    {\n        .size = MON_COORDS_SIZE(24, 40),\n        .y_offset = 15,\n    },\n    [SPECIES_UNOWN_QMARK] =\n    {\n        .size = MON_COORDS_SIZE(24, 40),\n        .y_offset = 13,\n    },\n};\n"
  },
  {
    "path": "src/data/pokemon_graphics/front_pic_table.h",
    "content": "const struct CompressedSpriteSheet gMonFrontPicTable[] =\n{\n    SPECIES_SPRITE(NONE, gMonFrontPic_CircledQuestionMark),\n    SPECIES_SPRITE(BULBASAUR, gMonFrontPic_Bulbasaur),\n    SPECIES_SPRITE(IVYSAUR, gMonFrontPic_Ivysaur),\n    SPECIES_SPRITE(VENUSAUR, gMonFrontPic_Venusaur),\n    SPECIES_SPRITE(CHARMANDER, gMonFrontPic_Charmander),\n    SPECIES_SPRITE(CHARMELEON, gMonFrontPic_Charmeleon),\n    SPECIES_SPRITE(CHARIZARD, gMonFrontPic_Charizard),\n    SPECIES_SPRITE(SQUIRTLE, gMonFrontPic_Squirtle),\n    SPECIES_SPRITE(WARTORTLE, gMonFrontPic_Wartortle),\n    SPECIES_SPRITE(BLASTOISE, gMonFrontPic_Blastoise),\n    SPECIES_SPRITE(CATERPIE, gMonFrontPic_Caterpie),\n    SPECIES_SPRITE(METAPOD, gMonFrontPic_Metapod),\n    SPECIES_SPRITE(BUTTERFREE, gMonFrontPic_Butterfree),\n    SPECIES_SPRITE(WEEDLE, gMonFrontPic_Weedle),\n    SPECIES_SPRITE(KAKUNA, gMonFrontPic_Kakuna),\n    SPECIES_SPRITE(BEEDRILL, gMonFrontPic_Beedrill),\n    SPECIES_SPRITE(PIDGEY, gMonFrontPic_Pidgey),\n    SPECIES_SPRITE(PIDGEOTTO, gMonFrontPic_Pidgeotto),\n    SPECIES_SPRITE(PIDGEOT, gMonFrontPic_Pidgeot),\n    SPECIES_SPRITE(RATTATA, gMonFrontPic_Rattata),\n    SPECIES_SPRITE(RATICATE, gMonFrontPic_Raticate),\n    SPECIES_SPRITE(SPEAROW, gMonFrontPic_Spearow),\n    SPECIES_SPRITE(FEAROW, gMonFrontPic_Fearow),\n    SPECIES_SPRITE(EKANS, gMonFrontPic_Ekans),\n    SPECIES_SPRITE(ARBOK, gMonFrontPic_Arbok),\n    SPECIES_SPRITE(PIKACHU, gMonFrontPic_Pikachu),\n    SPECIES_SPRITE(RAICHU, gMonFrontPic_Raichu),\n    SPECIES_SPRITE(SANDSHREW, gMonFrontPic_Sandshrew),\n    SPECIES_SPRITE(SANDSLASH, gMonFrontPic_Sandslash),\n    SPECIES_SPRITE(NIDORAN_F, gMonFrontPic_NidoranF),\n    SPECIES_SPRITE(NIDORINA, gMonFrontPic_Nidorina),\n    SPECIES_SPRITE(NIDOQUEEN, gMonFrontPic_Nidoqueen),\n    SPECIES_SPRITE(NIDORAN_M, gMonFrontPic_NidoranM),\n    SPECIES_SPRITE(NIDORINO, gMonFrontPic_Nidorino),\n    SPECIES_SPRITE(NIDOKING, gMonFrontPic_Nidoking),\n    SPECIES_SPRITE(CLEFAIRY, gMonFrontPic_Clefairy),\n    SPECIES_SPRITE(CLEFABLE, gMonFrontPic_Clefable),\n    SPECIES_SPRITE(VULPIX, gMonFrontPic_Vulpix),\n    SPECIES_SPRITE(NINETALES, gMonFrontPic_Ninetales),\n    SPECIES_SPRITE(JIGGLYPUFF, gMonFrontPic_Jigglypuff),\n    SPECIES_SPRITE(WIGGLYTUFF, gMonFrontPic_Wigglytuff),\n    SPECIES_SPRITE(ZUBAT, gMonFrontPic_Zubat),\n    SPECIES_SPRITE(GOLBAT, gMonFrontPic_Golbat),\n    SPECIES_SPRITE(ODDISH, gMonFrontPic_Oddish),\n    SPECIES_SPRITE(GLOOM, gMonFrontPic_Gloom),\n    SPECIES_SPRITE(VILEPLUME, gMonFrontPic_Vileplume),\n    SPECIES_SPRITE(PARAS, gMonFrontPic_Paras),\n    SPECIES_SPRITE(PARASECT, gMonFrontPic_Parasect),\n    SPECIES_SPRITE(VENONAT, gMonFrontPic_Venonat),\n    SPECIES_SPRITE(VENOMOTH, gMonFrontPic_Venomoth),\n    SPECIES_SPRITE(DIGLETT, gMonFrontPic_Diglett),\n    SPECIES_SPRITE(DUGTRIO, gMonFrontPic_Dugtrio),\n    SPECIES_SPRITE(MEOWTH, gMonFrontPic_Meowth),\n    SPECIES_SPRITE(PERSIAN, gMonFrontPic_Persian),\n    SPECIES_SPRITE(PSYDUCK, gMonFrontPic_Psyduck),\n    SPECIES_SPRITE(GOLDUCK, gMonFrontPic_Golduck),\n    SPECIES_SPRITE(MANKEY, gMonFrontPic_Mankey),\n    SPECIES_SPRITE(PRIMEAPE, gMonFrontPic_Primeape),\n    SPECIES_SPRITE(GROWLITHE, gMonFrontPic_Growlithe),\n    SPECIES_SPRITE(ARCANINE, gMonFrontPic_Arcanine),\n    SPECIES_SPRITE(POLIWAG, gMonFrontPic_Poliwag),\n    SPECIES_SPRITE(POLIWHIRL, gMonFrontPic_Poliwhirl),\n    SPECIES_SPRITE(POLIWRATH, gMonFrontPic_Poliwrath),\n    SPECIES_SPRITE(ABRA, gMonFrontPic_Abra),\n    SPECIES_SPRITE(KADABRA, gMonFrontPic_Kadabra),\n    SPECIES_SPRITE(ALAKAZAM, gMonFrontPic_Alakazam),\n    SPECIES_SPRITE(MACHOP, gMonFrontPic_Machop),\n    SPECIES_SPRITE(MACHOKE, gMonFrontPic_Machoke),\n    SPECIES_SPRITE(MACHAMP, gMonFrontPic_Machamp),\n    SPECIES_SPRITE(BELLSPROUT, gMonFrontPic_Bellsprout),\n    SPECIES_SPRITE(WEEPINBELL, gMonFrontPic_Weepinbell),\n    SPECIES_SPRITE(VICTREEBEL, gMonFrontPic_Victreebel),\n    SPECIES_SPRITE(TENTACOOL, gMonFrontPic_Tentacool),\n    SPECIES_SPRITE(TENTACRUEL, gMonFrontPic_Tentacruel),\n    SPECIES_SPRITE(GEODUDE, gMonFrontPic_Geodude),\n    SPECIES_SPRITE(GRAVELER, gMonFrontPic_Graveler),\n    SPECIES_SPRITE(GOLEM, gMonFrontPic_Golem),\n    SPECIES_SPRITE(PONYTA, gMonFrontPic_Ponyta),\n    SPECIES_SPRITE(RAPIDASH, gMonFrontPic_Rapidash),\n    SPECIES_SPRITE(SLOWPOKE, gMonFrontPic_Slowpoke),\n    SPECIES_SPRITE(SLOWBRO, gMonFrontPic_Slowbro),\n    SPECIES_SPRITE(MAGNEMITE, gMonFrontPic_Magnemite),\n    SPECIES_SPRITE(MAGNETON, gMonFrontPic_Magneton),\n    SPECIES_SPRITE(FARFETCHD, gMonFrontPic_Farfetchd),\n    SPECIES_SPRITE(DODUO, gMonFrontPic_Doduo),\n    SPECIES_SPRITE(DODRIO, gMonFrontPic_Dodrio),\n    SPECIES_SPRITE(SEEL, gMonFrontPic_Seel),\n    SPECIES_SPRITE(DEWGONG, gMonFrontPic_Dewgong),\n    SPECIES_SPRITE(GRIMER, gMonFrontPic_Grimer),\n    SPECIES_SPRITE(MUK, gMonFrontPic_Muk),\n    SPECIES_SPRITE(SHELLDER, gMonFrontPic_Shellder),\n    SPECIES_SPRITE(CLOYSTER, gMonFrontPic_Cloyster),\n    SPECIES_SPRITE(GASTLY, gMonFrontPic_Gastly),\n    SPECIES_SPRITE(HAUNTER, gMonFrontPic_Haunter),\n    SPECIES_SPRITE(GENGAR, gMonFrontPic_Gengar),\n    SPECIES_SPRITE(ONIX, gMonFrontPic_Onix),\n    SPECIES_SPRITE(DROWZEE, gMonFrontPic_Drowzee),\n    SPECIES_SPRITE(HYPNO, gMonFrontPic_Hypno),\n    SPECIES_SPRITE(KRABBY, gMonFrontPic_Krabby),\n    SPECIES_SPRITE(KINGLER, gMonFrontPic_Kingler),\n    SPECIES_SPRITE(VOLTORB, gMonFrontPic_Voltorb),\n    SPECIES_SPRITE(ELECTRODE, gMonFrontPic_Electrode),\n    SPECIES_SPRITE(EXEGGCUTE, gMonFrontPic_Exeggcute),\n    SPECIES_SPRITE(EXEGGUTOR, gMonFrontPic_Exeggutor),\n    SPECIES_SPRITE(CUBONE, gMonFrontPic_Cubone),\n    SPECIES_SPRITE(MAROWAK, gMonFrontPic_Marowak),\n    SPECIES_SPRITE(HITMONLEE, gMonFrontPic_Hitmonlee),\n    SPECIES_SPRITE(HITMONCHAN, gMonFrontPic_Hitmonchan),\n    SPECIES_SPRITE(LICKITUNG, gMonFrontPic_Lickitung),\n    SPECIES_SPRITE(KOFFING, gMonFrontPic_Koffing),\n    SPECIES_SPRITE(WEEZING, gMonFrontPic_Weezing),\n    SPECIES_SPRITE(RHYHORN, gMonFrontPic_Rhyhorn),\n    SPECIES_SPRITE(RHYDON, gMonFrontPic_Rhydon),\n    SPECIES_SPRITE(CHANSEY, gMonFrontPic_Chansey),\n    SPECIES_SPRITE(TANGELA, gMonFrontPic_Tangela),\n    SPECIES_SPRITE(KANGASKHAN, gMonFrontPic_Kangaskhan),\n    SPECIES_SPRITE(HORSEA, gMonFrontPic_Horsea),\n    SPECIES_SPRITE(SEADRA, gMonFrontPic_Seadra),\n    SPECIES_SPRITE(GOLDEEN, gMonFrontPic_Goldeen),\n    SPECIES_SPRITE(SEAKING, gMonFrontPic_Seaking),\n    SPECIES_SPRITE(STARYU, gMonFrontPic_Staryu),\n    SPECIES_SPRITE(STARMIE, gMonFrontPic_Starmie),\n    SPECIES_SPRITE(MR_MIME, gMonFrontPic_Mrmime),\n    SPECIES_SPRITE(SCYTHER, gMonFrontPic_Scyther),\n    SPECIES_SPRITE(JYNX, gMonFrontPic_Jynx),\n    SPECIES_SPRITE(ELECTABUZZ, gMonFrontPic_Electabuzz),\n    SPECIES_SPRITE(MAGMAR, gMonFrontPic_Magmar),\n    SPECIES_SPRITE(PINSIR, gMonFrontPic_Pinsir),\n    SPECIES_SPRITE(TAUROS, gMonFrontPic_Tauros),\n    SPECIES_SPRITE(MAGIKARP, gMonFrontPic_Magikarp),\n    SPECIES_SPRITE(GYARADOS, gMonFrontPic_Gyarados),\n    SPECIES_SPRITE(LAPRAS, gMonFrontPic_Lapras),\n    SPECIES_SPRITE(DITTO, gMonFrontPic_Ditto),\n    SPECIES_SPRITE(EEVEE, gMonFrontPic_Eevee),\n    SPECIES_SPRITE(VAPOREON, gMonFrontPic_Vaporeon),\n    SPECIES_SPRITE(JOLTEON, gMonFrontPic_Jolteon),\n    SPECIES_SPRITE(FLAREON, gMonFrontPic_Flareon),\n    SPECIES_SPRITE(PORYGON, gMonFrontPic_Porygon),\n    SPECIES_SPRITE(OMANYTE, gMonFrontPic_Omanyte),\n    SPECIES_SPRITE(OMASTAR, gMonFrontPic_Omastar),\n    SPECIES_SPRITE(KABUTO, gMonFrontPic_Kabuto),\n    SPECIES_SPRITE(KABUTOPS, gMonFrontPic_Kabutops),\n    SPECIES_SPRITE(AERODACTYL, gMonFrontPic_Aerodactyl),\n    SPECIES_SPRITE(SNORLAX, gMonFrontPic_Snorlax),\n    SPECIES_SPRITE(ARTICUNO, gMonFrontPic_Articuno),\n    SPECIES_SPRITE(ZAPDOS, gMonFrontPic_Zapdos),\n    SPECIES_SPRITE(MOLTRES, gMonFrontPic_Moltres),\n    SPECIES_SPRITE(DRATINI, gMonFrontPic_Dratini),\n    SPECIES_SPRITE(DRAGONAIR, gMonFrontPic_Dragonair),\n    SPECIES_SPRITE(DRAGONITE, gMonFrontPic_Dragonite),\n    SPECIES_SPRITE(MEWTWO, gMonFrontPic_Mewtwo),\n    SPECIES_SPRITE(MEW, gMonFrontPic_Mew),\n    SPECIES_SPRITE(CHIKORITA, gMonFrontPic_Chikorita),\n    SPECIES_SPRITE(BAYLEEF, gMonFrontPic_Bayleef),\n    SPECIES_SPRITE(MEGANIUM, gMonFrontPic_Meganium),\n    SPECIES_SPRITE(CYNDAQUIL, gMonFrontPic_Cyndaquil),\n    SPECIES_SPRITE(QUILAVA, gMonFrontPic_Quilava),\n    SPECIES_SPRITE(TYPHLOSION, gMonFrontPic_Typhlosion),\n    SPECIES_SPRITE(TOTODILE, gMonFrontPic_Totodile),\n    SPECIES_SPRITE(CROCONAW, gMonFrontPic_Croconaw),\n    SPECIES_SPRITE(FERALIGATR, gMonFrontPic_Feraligatr),\n    SPECIES_SPRITE(SENTRET, gMonFrontPic_Sentret),\n    SPECIES_SPRITE(FURRET, gMonFrontPic_Furret),\n    SPECIES_SPRITE(HOOTHOOT, gMonFrontPic_Hoothoot),\n    SPECIES_SPRITE(NOCTOWL, gMonFrontPic_Noctowl),\n    SPECIES_SPRITE(LEDYBA, gMonFrontPic_Ledyba),\n    SPECIES_SPRITE(LEDIAN, gMonFrontPic_Ledian),\n    SPECIES_SPRITE(SPINARAK, gMonFrontPic_Spinarak),\n    SPECIES_SPRITE(ARIADOS, gMonFrontPic_Ariados),\n    SPECIES_SPRITE(CROBAT, gMonFrontPic_Crobat),\n    SPECIES_SPRITE(CHINCHOU, gMonFrontPic_Chinchou),\n    SPECIES_SPRITE(LANTURN, gMonFrontPic_Lanturn),\n    SPECIES_SPRITE(PICHU, gMonFrontPic_Pichu),\n    SPECIES_SPRITE(CLEFFA, gMonFrontPic_Cleffa),\n    SPECIES_SPRITE(IGGLYBUFF, gMonFrontPic_Igglybuff),\n    SPECIES_SPRITE(TOGEPI, gMonFrontPic_Togepi),\n    SPECIES_SPRITE(TOGETIC, gMonFrontPic_Togetic),\n    SPECIES_SPRITE(NATU, gMonFrontPic_Natu),\n    SPECIES_SPRITE(XATU, gMonFrontPic_Xatu),\n    SPECIES_SPRITE(MAREEP, gMonFrontPic_Mareep),\n    SPECIES_SPRITE(FLAAFFY, gMonFrontPic_Flaaffy),\n    SPECIES_SPRITE(AMPHAROS, gMonFrontPic_Ampharos),\n    SPECIES_SPRITE(BELLOSSOM, gMonFrontPic_Bellossom),\n    SPECIES_SPRITE(MARILL, gMonFrontPic_Marill),\n    SPECIES_SPRITE(AZUMARILL, gMonFrontPic_Azumarill),\n    SPECIES_SPRITE(SUDOWOODO, gMonFrontPic_Sudowoodo),\n    SPECIES_SPRITE(POLITOED, gMonFrontPic_Politoed),\n    SPECIES_SPRITE(HOPPIP, gMonFrontPic_Hoppip),\n    SPECIES_SPRITE(SKIPLOOM, gMonFrontPic_Skiploom),\n    SPECIES_SPRITE(JUMPLUFF, gMonFrontPic_Jumpluff),\n    SPECIES_SPRITE(AIPOM, gMonFrontPic_Aipom),\n    SPECIES_SPRITE(SUNKERN, gMonFrontPic_Sunkern),\n    SPECIES_SPRITE(SUNFLORA, gMonFrontPic_Sunflora),\n    SPECIES_SPRITE(YANMA, gMonFrontPic_Yanma),\n    SPECIES_SPRITE(WOOPER, gMonFrontPic_Wooper),\n    SPECIES_SPRITE(QUAGSIRE, gMonFrontPic_Quagsire),\n    SPECIES_SPRITE(ESPEON, gMonFrontPic_Espeon),\n    SPECIES_SPRITE(UMBREON, gMonFrontPic_Umbreon),\n    SPECIES_SPRITE(MURKROW, gMonFrontPic_Murkrow),\n    SPECIES_SPRITE(SLOWKING, gMonFrontPic_Slowking),\n    SPECIES_SPRITE(MISDREAVUS, gMonFrontPic_Misdreavus),\n    SPECIES_SPRITE(UNOWN, gMonFrontPic_UnownA),\n    SPECIES_SPRITE(WOBBUFFET, gMonFrontPic_Wobbuffet),\n    SPECIES_SPRITE(GIRAFARIG, gMonFrontPic_Girafarig),\n    SPECIES_SPRITE(PINECO, gMonFrontPic_Pineco),\n    SPECIES_SPRITE(FORRETRESS, gMonFrontPic_Forretress),\n    SPECIES_SPRITE(DUNSPARCE, gMonFrontPic_Dunsparce),\n    SPECIES_SPRITE(GLIGAR, gMonFrontPic_Gligar),\n    SPECIES_SPRITE(STEELIX, gMonFrontPic_Steelix),\n    SPECIES_SPRITE(SNUBBULL, gMonFrontPic_Snubbull),\n    SPECIES_SPRITE(GRANBULL, gMonFrontPic_Granbull),\n    SPECIES_SPRITE(QWILFISH, gMonFrontPic_Qwilfish),\n    SPECIES_SPRITE(SCIZOR, gMonFrontPic_Scizor),\n    SPECIES_SPRITE(SHUCKLE, gMonFrontPic_Shuckle),\n    SPECIES_SPRITE(HERACROSS, gMonFrontPic_Heracross),\n    SPECIES_SPRITE(SNEASEL, gMonFrontPic_Sneasel),\n    SPECIES_SPRITE(TEDDIURSA, gMonFrontPic_Teddiursa),\n    SPECIES_SPRITE(URSARING, gMonFrontPic_Ursaring),\n    SPECIES_SPRITE(SLUGMA, gMonFrontPic_Slugma),\n    SPECIES_SPRITE(MAGCARGO, gMonFrontPic_Magcargo),\n    SPECIES_SPRITE(SWINUB, gMonFrontPic_Swinub),\n    SPECIES_SPRITE(PILOSWINE, gMonFrontPic_Piloswine),\n    SPECIES_SPRITE(CORSOLA, gMonFrontPic_Corsola),\n    SPECIES_SPRITE(REMORAID, gMonFrontPic_Remoraid),\n    SPECIES_SPRITE(OCTILLERY, gMonFrontPic_Octillery),\n    SPECIES_SPRITE(DELIBIRD, gMonFrontPic_Delibird),\n    SPECIES_SPRITE(MANTINE, gMonFrontPic_Mantine),\n    SPECIES_SPRITE(SKARMORY, gMonFrontPic_Skarmory),\n    SPECIES_SPRITE(HOUNDOUR, gMonFrontPic_Houndour),\n    SPECIES_SPRITE(HOUNDOOM, gMonFrontPic_Houndoom),\n    SPECIES_SPRITE(KINGDRA, gMonFrontPic_Kingdra),\n    SPECIES_SPRITE(PHANPY, gMonFrontPic_Phanpy),\n    SPECIES_SPRITE(DONPHAN, gMonFrontPic_Donphan),\n    SPECIES_SPRITE(PORYGON2, gMonFrontPic_Porygon2),\n    SPECIES_SPRITE(STANTLER, gMonFrontPic_Stantler),\n    SPECIES_SPRITE(SMEARGLE, gMonFrontPic_Smeargle),\n    SPECIES_SPRITE(TYROGUE, gMonFrontPic_Tyrogue),\n    SPECIES_SPRITE(HITMONTOP, gMonFrontPic_Hitmontop),\n    SPECIES_SPRITE(SMOOCHUM, gMonFrontPic_Smoochum),\n    SPECIES_SPRITE(ELEKID, gMonFrontPic_Elekid),\n    SPECIES_SPRITE(MAGBY, gMonFrontPic_Magby),\n    SPECIES_SPRITE(MILTANK, gMonFrontPic_Miltank),\n    SPECIES_SPRITE(BLISSEY, gMonFrontPic_Blissey),\n    SPECIES_SPRITE(RAIKOU, gMonFrontPic_Raikou),\n    SPECIES_SPRITE(ENTEI, gMonFrontPic_Entei),\n    SPECIES_SPRITE(SUICUNE, gMonFrontPic_Suicune),\n    SPECIES_SPRITE(LARVITAR, gMonFrontPic_Larvitar),\n    SPECIES_SPRITE(PUPITAR, gMonFrontPic_Pupitar),\n    SPECIES_SPRITE(TYRANITAR, gMonFrontPic_Tyranitar),\n    SPECIES_SPRITE(LUGIA, gMonFrontPic_Lugia),\n    SPECIES_SPRITE(HO_OH, gMonFrontPic_HoOh),\n    SPECIES_SPRITE(CELEBI, gMonFrontPic_Celebi),\n    SPECIES_SPRITE(OLD_UNOWN_B, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_C, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_D, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_E, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_F, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_G, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_H, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_I, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_J, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_K, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_L, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_M, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_N, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_O, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_P, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_Q, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_R, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_S, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_T, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_U, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_V, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_W, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_X, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_Y, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(OLD_UNOWN_Z, gMonFrontPic_DoubleQuestionMark),\n    SPECIES_SPRITE(TREECKO, gMonFrontPic_Treecko),\n    SPECIES_SPRITE(GROVYLE, gMonFrontPic_Grovyle),\n    SPECIES_SPRITE(SCEPTILE, gMonFrontPic_Sceptile),\n    SPECIES_SPRITE(TORCHIC, gMonFrontPic_Torchic),\n    SPECIES_SPRITE(COMBUSKEN, gMonFrontPic_Combusken),\n    SPECIES_SPRITE(BLAZIKEN, gMonFrontPic_Blaziken),\n    SPECIES_SPRITE(MUDKIP, gMonFrontPic_Mudkip),\n    SPECIES_SPRITE(MARSHTOMP, gMonFrontPic_Marshtomp),\n    SPECIES_SPRITE(SWAMPERT, gMonFrontPic_Swampert),\n    SPECIES_SPRITE(POOCHYENA, gMonFrontPic_Poochyena),\n    SPECIES_SPRITE(MIGHTYENA, gMonFrontPic_Mightyena),\n    SPECIES_SPRITE(ZIGZAGOON, gMonFrontPic_Zigzagoon),\n    SPECIES_SPRITE(LINOONE, gMonFrontPic_Linoone),\n    SPECIES_SPRITE(WURMPLE, gMonFrontPic_Wurmple),\n    SPECIES_SPRITE(SILCOON, gMonFrontPic_Silcoon),\n    SPECIES_SPRITE(BEAUTIFLY, gMonFrontPic_Beautifly),\n    SPECIES_SPRITE(CASCOON, gMonFrontPic_Cascoon),\n    SPECIES_SPRITE(DUSTOX, gMonFrontPic_Dustox),\n    SPECIES_SPRITE(LOTAD, gMonFrontPic_Lotad),\n    SPECIES_SPRITE(LOMBRE, gMonFrontPic_Lombre),\n    SPECIES_SPRITE(LUDICOLO, gMonFrontPic_Ludicolo),\n    SPECIES_SPRITE(SEEDOT, gMonFrontPic_Seedot),\n    SPECIES_SPRITE(NUZLEAF, gMonFrontPic_Nuzleaf),\n    SPECIES_SPRITE(SHIFTRY, gMonFrontPic_Shiftry),\n    SPECIES_SPRITE(NINCADA, gMonFrontPic_Nincada),\n    SPECIES_SPRITE(NINJASK, gMonFrontPic_Ninjask),\n    SPECIES_SPRITE(SHEDINJA, gMonFrontPic_Shedinja),\n    SPECIES_SPRITE(TAILLOW, gMonFrontPic_Taillow),\n    SPECIES_SPRITE(SWELLOW, gMonFrontPic_Swellow),\n    SPECIES_SPRITE(SHROOMISH, gMonFrontPic_Shroomish),\n    SPECIES_SPRITE(BRELOOM, gMonFrontPic_Breloom),\n    SPECIES_SPRITE(SPINDA, gMonFrontPic_Spinda),\n    SPECIES_SPRITE(WINGULL, gMonFrontPic_Wingull),\n    SPECIES_SPRITE(PELIPPER, gMonFrontPic_Pelipper),\n    SPECIES_SPRITE(SURSKIT, gMonFrontPic_Surskit),\n    SPECIES_SPRITE(MASQUERAIN, gMonFrontPic_Masquerain),\n    SPECIES_SPRITE(WAILMER, gMonFrontPic_Wailmer),\n    SPECIES_SPRITE(WAILORD, gMonFrontPic_Wailord),\n    SPECIES_SPRITE(SKITTY, gMonFrontPic_Skitty),\n    SPECIES_SPRITE(DELCATTY, gMonFrontPic_Delcatty),\n    SPECIES_SPRITE(KECLEON, gMonFrontPic_Kecleon),\n    SPECIES_SPRITE(BALTOY, gMonFrontPic_Baltoy),\n    SPECIES_SPRITE(CLAYDOL, gMonFrontPic_Claydol),\n    SPECIES_SPRITE(NOSEPASS, gMonFrontPic_Nosepass),\n    SPECIES_SPRITE(TORKOAL, gMonFrontPic_Torkoal),\n    SPECIES_SPRITE(SABLEYE, gMonFrontPic_Sableye),\n    SPECIES_SPRITE(BARBOACH, gMonFrontPic_Barboach),\n    SPECIES_SPRITE(WHISCASH, gMonFrontPic_Whiscash),\n    SPECIES_SPRITE(LUVDISC, gMonFrontPic_Luvdisc),\n    SPECIES_SPRITE(CORPHISH, gMonFrontPic_Corphish),\n    SPECIES_SPRITE(CRAWDAUNT, gMonFrontPic_Crawdaunt),\n    SPECIES_SPRITE(FEEBAS, gMonFrontPic_Feebas),\n    SPECIES_SPRITE(MILOTIC, gMonFrontPic_Milotic),\n    SPECIES_SPRITE(CARVANHA, gMonFrontPic_Carvanha),\n    SPECIES_SPRITE(SHARPEDO, gMonFrontPic_Sharpedo),\n    SPECIES_SPRITE(TRAPINCH, gMonFrontPic_Trapinch),\n    SPECIES_SPRITE(VIBRAVA, gMonFrontPic_Vibrava),\n    SPECIES_SPRITE(FLYGON, gMonFrontPic_Flygon),\n    SPECIES_SPRITE(MAKUHITA, gMonFrontPic_Makuhita),\n    SPECIES_SPRITE(HARIYAMA, gMonFrontPic_Hariyama),\n    SPECIES_SPRITE(ELECTRIKE, gMonFrontPic_Electrike),\n    SPECIES_SPRITE(MANECTRIC, gMonFrontPic_Manectric),\n    SPECIES_SPRITE(NUMEL, gMonFrontPic_Numel),\n    SPECIES_SPRITE(CAMERUPT, gMonFrontPic_Camerupt),\n    SPECIES_SPRITE(SPHEAL, gMonFrontPic_Spheal),\n    SPECIES_SPRITE(SEALEO, gMonFrontPic_Sealeo),\n    SPECIES_SPRITE(WALREIN, gMonFrontPic_Walrein),\n    SPECIES_SPRITE(CACNEA, gMonFrontPic_Cacnea),\n    SPECIES_SPRITE(CACTURNE, gMonFrontPic_Cacturne),\n    SPECIES_SPRITE(SNORUNT, gMonFrontPic_Snorunt),\n    SPECIES_SPRITE(GLALIE, gMonFrontPic_Glalie),\n    SPECIES_SPRITE(LUNATONE, gMonFrontPic_Lunatone),\n    SPECIES_SPRITE(SOLROCK, gMonFrontPic_Solrock),\n    SPECIES_SPRITE(AZURILL, gMonFrontPic_Azurill),\n    SPECIES_SPRITE(SPOINK, gMonFrontPic_Spoink),\n    SPECIES_SPRITE(GRUMPIG, gMonFrontPic_Grumpig),\n    SPECIES_SPRITE(PLUSLE, gMonFrontPic_Plusle),\n    SPECIES_SPRITE(MINUN, gMonFrontPic_Minun),\n    SPECIES_SPRITE(MAWILE, gMonFrontPic_Mawile),\n    SPECIES_SPRITE(MEDITITE, gMonFrontPic_Meditite),\n    SPECIES_SPRITE(MEDICHAM, gMonFrontPic_Medicham),\n    SPECIES_SPRITE(SWABLU, gMonFrontPic_Swablu),\n    SPECIES_SPRITE(ALTARIA, gMonFrontPic_Altaria),\n    SPECIES_SPRITE(WYNAUT, gMonFrontPic_Wynaut),\n    SPECIES_SPRITE(DUSKULL, gMonFrontPic_Duskull),\n    SPECIES_SPRITE(DUSCLOPS, gMonFrontPic_Dusclops),\n    SPECIES_SPRITE(ROSELIA, gMonFrontPic_Roselia),\n    SPECIES_SPRITE(SLAKOTH, gMonFrontPic_Slakoth),\n    SPECIES_SPRITE(VIGOROTH, gMonFrontPic_Vigoroth),\n    SPECIES_SPRITE(SLAKING, gMonFrontPic_Slaking),\n    SPECIES_SPRITE(GULPIN, gMonFrontPic_Gulpin),\n    SPECIES_SPRITE(SWALOT, gMonFrontPic_Swalot),\n    SPECIES_SPRITE(TROPIUS, gMonFrontPic_Tropius),\n    SPECIES_SPRITE(WHISMUR, gMonFrontPic_Whismur),\n    SPECIES_SPRITE(LOUDRED, gMonFrontPic_Loudred),\n    SPECIES_SPRITE(EXPLOUD, gMonFrontPic_Exploud),\n    SPECIES_SPRITE(CLAMPERL, gMonFrontPic_Clamperl),\n    SPECIES_SPRITE(HUNTAIL, gMonFrontPic_Huntail),\n    SPECIES_SPRITE(GOREBYSS, gMonFrontPic_Gorebyss),\n    SPECIES_SPRITE(ABSOL, gMonFrontPic_Absol),\n    SPECIES_SPRITE(SHUPPET, gMonFrontPic_Shuppet),\n    SPECIES_SPRITE(BANETTE, gMonFrontPic_Banette),\n    SPECIES_SPRITE(SEVIPER, gMonFrontPic_Seviper),\n    SPECIES_SPRITE(ZANGOOSE, gMonFrontPic_Zangoose),\n    SPECIES_SPRITE(RELICANTH, gMonFrontPic_Relicanth),\n    SPECIES_SPRITE(ARON, gMonFrontPic_Aron),\n    SPECIES_SPRITE(LAIRON, gMonFrontPic_Lairon),\n    SPECIES_SPRITE(AGGRON, gMonFrontPic_Aggron),\n    SPECIES_SPRITE(CASTFORM, gMonFrontPic_Castform),\n    SPECIES_SPRITE(VOLBEAT, gMonFrontPic_Volbeat),\n    SPECIES_SPRITE(ILLUMISE, gMonFrontPic_Illumise),\n    SPECIES_SPRITE(LILEEP, gMonFrontPic_Lileep),\n    SPECIES_SPRITE(CRADILY, gMonFrontPic_Cradily),\n    SPECIES_SPRITE(ANORITH, gMonFrontPic_Anorith),\n    SPECIES_SPRITE(ARMALDO, gMonFrontPic_Armaldo),\n    SPECIES_SPRITE(RALTS, gMonFrontPic_Ralts),\n    SPECIES_SPRITE(KIRLIA, gMonFrontPic_Kirlia),\n    SPECIES_SPRITE(GARDEVOIR, gMonFrontPic_Gardevoir),\n    SPECIES_SPRITE(BAGON, gMonFrontPic_Bagon),\n    SPECIES_SPRITE(SHELGON, gMonFrontPic_Shelgon),\n    SPECIES_SPRITE(SALAMENCE, gMonFrontPic_Salamence),\n    SPECIES_SPRITE(BELDUM, gMonFrontPic_Beldum),\n    SPECIES_SPRITE(METANG, gMonFrontPic_Metang),\n    SPECIES_SPRITE(METAGROSS, gMonFrontPic_Metagross),\n    SPECIES_SPRITE(REGIROCK, gMonFrontPic_Regirock),\n    SPECIES_SPRITE(REGICE, gMonFrontPic_Regice),\n    SPECIES_SPRITE(REGISTEEL, gMonFrontPic_Registeel),\n    SPECIES_SPRITE(KYOGRE, gMonFrontPic_Kyogre),\n    SPECIES_SPRITE(GROUDON, gMonFrontPic_Groudon),\n    SPECIES_SPRITE(RAYQUAZA, gMonFrontPic_Rayquaza),\n    SPECIES_SPRITE(LATIAS, gMonFrontPic_Latias),\n    SPECIES_SPRITE(LATIOS, gMonFrontPic_Latios),\n    SPECIES_SPRITE(JIRACHI, gMonFrontPic_Jirachi),\n    SPECIES_SPRITE(DEOXYS, gMonFrontPic_Deoxys),\n    SPECIES_SPRITE(CHIMECHO, gMonFrontPic_Chimecho),\n    SPECIES_SPRITE(EGG, gMonFrontPic_Egg),\n    SPECIES_SPRITE(UNOWN_B, gMonFrontPic_UnownB),\n    SPECIES_SPRITE(UNOWN_C, gMonFrontPic_UnownC),\n    SPECIES_SPRITE(UNOWN_D, gMonFrontPic_UnownD),\n    SPECIES_SPRITE(UNOWN_E, gMonFrontPic_UnownE),\n    SPECIES_SPRITE(UNOWN_F, gMonFrontPic_UnownF),\n    SPECIES_SPRITE(UNOWN_G, gMonFrontPic_UnownG),\n    SPECIES_SPRITE(UNOWN_H, gMonFrontPic_UnownH),\n    SPECIES_SPRITE(UNOWN_I, gMonFrontPic_UnownI),\n    SPECIES_SPRITE(UNOWN_J, gMonFrontPic_UnownJ),\n    SPECIES_SPRITE(UNOWN_K, gMonFrontPic_UnownK),\n    SPECIES_SPRITE(UNOWN_L, gMonFrontPic_UnownL),\n    SPECIES_SPRITE(UNOWN_M, gMonFrontPic_UnownM),\n    SPECIES_SPRITE(UNOWN_N, gMonFrontPic_UnownN),\n    SPECIES_SPRITE(UNOWN_O, gMonFrontPic_UnownO),\n    SPECIES_SPRITE(UNOWN_P, gMonFrontPic_UnownP),\n    SPECIES_SPRITE(UNOWN_Q, gMonFrontPic_UnownQ),\n    SPECIES_SPRITE(UNOWN_R, gMonFrontPic_UnownR),\n    SPECIES_SPRITE(UNOWN_S, gMonFrontPic_UnownS),\n    SPECIES_SPRITE(UNOWN_T, gMonFrontPic_UnownT),\n    SPECIES_SPRITE(UNOWN_U, gMonFrontPic_UnownU),\n    SPECIES_SPRITE(UNOWN_V, gMonFrontPic_UnownV),\n    SPECIES_SPRITE(UNOWN_W, gMonFrontPic_UnownW),\n    SPECIES_SPRITE(UNOWN_X, gMonFrontPic_UnownX),\n    SPECIES_SPRITE(UNOWN_Y, gMonFrontPic_UnownY),\n    SPECIES_SPRITE(UNOWN_Z, gMonFrontPic_UnownZ),\n    SPECIES_SPRITE(UNOWN_EMARK, gMonFrontPic_UnownExclamationMark),\n    SPECIES_SPRITE(UNOWN_QMARK, gMonFrontPic_UnownQuestionMark),\n};\n"
  },
  {
    "path": "src/data/pokemon_graphics/palette_table.h",
    "content": "const struct CompressedSpritePalette gMonPaletteTable[] =\n{\n    SPECIES_PAL(NONE, gMonPalette_CircledQuestionMark),\n    SPECIES_PAL(BULBASAUR, gMonPalette_Bulbasaur),\n    SPECIES_PAL(IVYSAUR, gMonPalette_Ivysaur),\n    SPECIES_PAL(VENUSAUR, gMonPalette_Venusaur),\n    SPECIES_PAL(CHARMANDER, gMonPalette_Charmander),\n    SPECIES_PAL(CHARMELEON, gMonPalette_Charmeleon),\n    SPECIES_PAL(CHARIZARD, gMonPalette_Charizard),\n    SPECIES_PAL(SQUIRTLE, gMonPalette_Squirtle),\n    SPECIES_PAL(WARTORTLE, gMonPalette_Wartortle),\n    SPECIES_PAL(BLASTOISE, gMonPalette_Blastoise),\n    SPECIES_PAL(CATERPIE, gMonPalette_Caterpie),\n    SPECIES_PAL(METAPOD, gMonPalette_Metapod),\n    SPECIES_PAL(BUTTERFREE, gMonPalette_Butterfree),\n    SPECIES_PAL(WEEDLE, gMonPalette_Weedle),\n    SPECIES_PAL(KAKUNA, gMonPalette_Kakuna),\n    SPECIES_PAL(BEEDRILL, gMonPalette_Beedrill),\n    SPECIES_PAL(PIDGEY, gMonPalette_Pidgey),\n    SPECIES_PAL(PIDGEOTTO, gMonPalette_Pidgeotto),\n    SPECIES_PAL(PIDGEOT, gMonPalette_Pidgeot),\n    SPECIES_PAL(RATTATA, gMonPalette_Rattata),\n    SPECIES_PAL(RATICATE, gMonPalette_Raticate),\n    SPECIES_PAL(SPEAROW, gMonPalette_Spearow),\n    SPECIES_PAL(FEAROW, gMonPalette_Fearow),\n    SPECIES_PAL(EKANS, gMonPalette_Ekans),\n    SPECIES_PAL(ARBOK, gMonPalette_Arbok),\n    SPECIES_PAL(PIKACHU, gMonPalette_Pikachu),\n    SPECIES_PAL(RAICHU, gMonPalette_Raichu),\n    SPECIES_PAL(SANDSHREW, gMonPalette_Sandshrew),\n    SPECIES_PAL(SANDSLASH, gMonPalette_Sandslash),\n    SPECIES_PAL(NIDORAN_F, gMonPalette_NidoranF),\n    SPECIES_PAL(NIDORINA, gMonPalette_Nidorina),\n    SPECIES_PAL(NIDOQUEEN, gMonPalette_Nidoqueen),\n    SPECIES_PAL(NIDORAN_M, gMonPalette_NidoranM),\n    SPECIES_PAL(NIDORINO, gMonPalette_Nidorino),\n    SPECIES_PAL(NIDOKING, gMonPalette_Nidoking),\n    SPECIES_PAL(CLEFAIRY, gMonPalette_Clefairy),\n    SPECIES_PAL(CLEFABLE, gMonPalette_Clefable),\n    SPECIES_PAL(VULPIX, gMonPalette_Vulpix),\n    SPECIES_PAL(NINETALES, gMonPalette_Ninetales),\n    SPECIES_PAL(JIGGLYPUFF, gMonPalette_Jigglypuff),\n    SPECIES_PAL(WIGGLYTUFF, gMonPalette_Wigglytuff),\n    SPECIES_PAL(ZUBAT, gMonPalette_Zubat),\n    SPECIES_PAL(GOLBAT, gMonPalette_Golbat),\n    SPECIES_PAL(ODDISH, gMonPalette_Oddish),\n    SPECIES_PAL(GLOOM, gMonPalette_Gloom),\n    SPECIES_PAL(VILEPLUME, gMonPalette_Vileplume),\n    SPECIES_PAL(PARAS, gMonPalette_Paras),\n    SPECIES_PAL(PARASECT, gMonPalette_Parasect),\n    SPECIES_PAL(VENONAT, gMonPalette_Venonat),\n    SPECIES_PAL(VENOMOTH, gMonPalette_Venomoth),\n    SPECIES_PAL(DIGLETT, gMonPalette_Diglett),\n    SPECIES_PAL(DUGTRIO, gMonPalette_Dugtrio),\n    SPECIES_PAL(MEOWTH, gMonPalette_Meowth),\n    SPECIES_PAL(PERSIAN, gMonPalette_Persian),\n    SPECIES_PAL(PSYDUCK, gMonPalette_Psyduck),\n    SPECIES_PAL(GOLDUCK, gMonPalette_Golduck),\n    SPECIES_PAL(MANKEY, gMonPalette_Mankey),\n    SPECIES_PAL(PRIMEAPE, gMonPalette_Primeape),\n    SPECIES_PAL(GROWLITHE, gMonPalette_Growlithe),\n    SPECIES_PAL(ARCANINE, gMonPalette_Arcanine),\n    SPECIES_PAL(POLIWAG, gMonPalette_Poliwag),\n    SPECIES_PAL(POLIWHIRL, gMonPalette_Poliwhirl),\n    SPECIES_PAL(POLIWRATH, gMonPalette_Poliwrath),\n    SPECIES_PAL(ABRA, gMonPalette_Abra),\n    SPECIES_PAL(KADABRA, gMonPalette_Kadabra),\n    SPECIES_PAL(ALAKAZAM, gMonPalette_Alakazam),\n    SPECIES_PAL(MACHOP, gMonPalette_Machop),\n    SPECIES_PAL(MACHOKE, gMonPalette_Machoke),\n    SPECIES_PAL(MACHAMP, gMonPalette_Machamp),\n    SPECIES_PAL(BELLSPROUT, gMonPalette_Bellsprout),\n    SPECIES_PAL(WEEPINBELL, gMonPalette_Weepinbell),\n    SPECIES_PAL(VICTREEBEL, gMonPalette_Victreebel),\n    SPECIES_PAL(TENTACOOL, gMonPalette_Tentacool),\n    SPECIES_PAL(TENTACRUEL, gMonPalette_Tentacruel),\n    SPECIES_PAL(GEODUDE, gMonPalette_Geodude),\n    SPECIES_PAL(GRAVELER, gMonPalette_Graveler),\n    SPECIES_PAL(GOLEM, gMonPalette_Golem),\n    SPECIES_PAL(PONYTA, gMonPalette_Ponyta),\n    SPECIES_PAL(RAPIDASH, gMonPalette_Rapidash),\n    SPECIES_PAL(SLOWPOKE, gMonPalette_Slowpoke),\n    SPECIES_PAL(SLOWBRO, gMonPalette_Slowbro),\n    SPECIES_PAL(MAGNEMITE, gMonPalette_Magnemite),\n    SPECIES_PAL(MAGNETON, gMonPalette_Magneton),\n    SPECIES_PAL(FARFETCHD, gMonPalette_Farfetchd),\n    SPECIES_PAL(DODUO, gMonPalette_Doduo),\n    SPECIES_PAL(DODRIO, gMonPalette_Dodrio),\n    SPECIES_PAL(SEEL, gMonPalette_Seel),\n    SPECIES_PAL(DEWGONG, gMonPalette_Dewgong),\n    SPECIES_PAL(GRIMER, gMonPalette_Grimer),\n    SPECIES_PAL(MUK, gMonPalette_Muk),\n    SPECIES_PAL(SHELLDER, gMonPalette_Shellder),\n    SPECIES_PAL(CLOYSTER, gMonPalette_Cloyster),\n    SPECIES_PAL(GASTLY, gMonPalette_Gastly),\n    SPECIES_PAL(HAUNTER, gMonPalette_Haunter),\n    SPECIES_PAL(GENGAR, gMonPalette_Gengar),\n    SPECIES_PAL(ONIX, gMonPalette_Onix),\n    SPECIES_PAL(DROWZEE, gMonPalette_Drowzee),\n    SPECIES_PAL(HYPNO, gMonPalette_Hypno),\n    SPECIES_PAL(KRABBY, gMonPalette_Krabby),\n    SPECIES_PAL(KINGLER, gMonPalette_Kingler),\n    SPECIES_PAL(VOLTORB, gMonPalette_Voltorb),\n    SPECIES_PAL(ELECTRODE, gMonPalette_Electrode),\n    SPECIES_PAL(EXEGGCUTE, gMonPalette_Exeggcute),\n    SPECIES_PAL(EXEGGUTOR, gMonPalette_Exeggutor),\n    SPECIES_PAL(CUBONE, gMonPalette_Cubone),\n    SPECIES_PAL(MAROWAK, gMonPalette_Marowak),\n    SPECIES_PAL(HITMONLEE, gMonPalette_Hitmonlee),\n    SPECIES_PAL(HITMONCHAN, gMonPalette_Hitmonchan),\n    SPECIES_PAL(LICKITUNG, gMonPalette_Lickitung),\n    SPECIES_PAL(KOFFING, gMonPalette_Koffing),\n    SPECIES_PAL(WEEZING, gMonPalette_Weezing),\n    SPECIES_PAL(RHYHORN, gMonPalette_Rhyhorn),\n    SPECIES_PAL(RHYDON, gMonPalette_Rhydon),\n    SPECIES_PAL(CHANSEY, gMonPalette_Chansey),\n    SPECIES_PAL(TANGELA, gMonPalette_Tangela),\n    SPECIES_PAL(KANGASKHAN, gMonPalette_Kangaskhan),\n    SPECIES_PAL(HORSEA, gMonPalette_Horsea),\n    SPECIES_PAL(SEADRA, gMonPalette_Seadra),\n    SPECIES_PAL(GOLDEEN, gMonPalette_Goldeen),\n    SPECIES_PAL(SEAKING, gMonPalette_Seaking),\n    SPECIES_PAL(STARYU, gMonPalette_Staryu),\n    SPECIES_PAL(STARMIE, gMonPalette_Starmie),\n    SPECIES_PAL(MR_MIME, gMonPalette_Mrmime),\n    SPECIES_PAL(SCYTHER, gMonPalette_Scyther),\n    SPECIES_PAL(JYNX, gMonPalette_Jynx),\n    SPECIES_PAL(ELECTABUZZ, gMonPalette_Electabuzz),\n    SPECIES_PAL(MAGMAR, gMonPalette_Magmar),\n    SPECIES_PAL(PINSIR, gMonPalette_Pinsir),\n    SPECIES_PAL(TAUROS, gMonPalette_Tauros),\n    SPECIES_PAL(MAGIKARP, gMonPalette_Magikarp),\n    SPECIES_PAL(GYARADOS, gMonPalette_Gyarados),\n    SPECIES_PAL(LAPRAS, gMonPalette_Lapras),\n    SPECIES_PAL(DITTO, gMonPalette_Ditto),\n    SPECIES_PAL(EEVEE, gMonPalette_Eevee),\n    SPECIES_PAL(VAPOREON, gMonPalette_Vaporeon),\n    SPECIES_PAL(JOLTEON, gMonPalette_Jolteon),\n    SPECIES_PAL(FLAREON, gMonPalette_Flareon),\n    SPECIES_PAL(PORYGON, gMonPalette_Porygon),\n    SPECIES_PAL(OMANYTE, gMonPalette_Omanyte),\n    SPECIES_PAL(OMASTAR, gMonPalette_Omastar),\n    SPECIES_PAL(KABUTO, gMonPalette_Kabuto),\n    SPECIES_PAL(KABUTOPS, gMonPalette_Kabutops),\n    SPECIES_PAL(AERODACTYL, gMonPalette_Aerodactyl),\n    SPECIES_PAL(SNORLAX, gMonPalette_Snorlax),\n    SPECIES_PAL(ARTICUNO, gMonPalette_Articuno),\n    SPECIES_PAL(ZAPDOS, gMonPalette_Zapdos),\n    SPECIES_PAL(MOLTRES, gMonPalette_Moltres),\n    SPECIES_PAL(DRATINI, gMonPalette_Dratini),\n    SPECIES_PAL(DRAGONAIR, gMonPalette_Dragonair),\n    SPECIES_PAL(DRAGONITE, gMonPalette_Dragonite),\n    SPECIES_PAL(MEWTWO, gMonPalette_Mewtwo),\n    SPECIES_PAL(MEW, gMonPalette_Mew),\n    SPECIES_PAL(CHIKORITA, gMonPalette_Chikorita),\n    SPECIES_PAL(BAYLEEF, gMonPalette_Bayleef),\n    SPECIES_PAL(MEGANIUM, gMonPalette_Meganium),\n    SPECIES_PAL(CYNDAQUIL, gMonPalette_Cyndaquil),\n    SPECIES_PAL(QUILAVA, gMonPalette_Quilava),\n    SPECIES_PAL(TYPHLOSION, gMonPalette_Typhlosion),\n    SPECIES_PAL(TOTODILE, gMonPalette_Totodile),\n    SPECIES_PAL(CROCONAW, gMonPalette_Croconaw),\n    SPECIES_PAL(FERALIGATR, gMonPalette_Feraligatr),\n    SPECIES_PAL(SENTRET, gMonPalette_Sentret),\n    SPECIES_PAL(FURRET, gMonPalette_Furret),\n    SPECIES_PAL(HOOTHOOT, gMonPalette_Hoothoot),\n    SPECIES_PAL(NOCTOWL, gMonPalette_Noctowl),\n    SPECIES_PAL(LEDYBA, gMonPalette_Ledyba),\n    SPECIES_PAL(LEDIAN, gMonPalette_Ledian),\n    SPECIES_PAL(SPINARAK, gMonPalette_Spinarak),\n    SPECIES_PAL(ARIADOS, gMonPalette_Ariados),\n    SPECIES_PAL(CROBAT, gMonPalette_Crobat),\n    SPECIES_PAL(CHINCHOU, gMonPalette_Chinchou),\n    SPECIES_PAL(LANTURN, gMonPalette_Lanturn),\n    SPECIES_PAL(PICHU, gMonPalette_Pichu),\n    SPECIES_PAL(CLEFFA, gMonPalette_Cleffa),\n    SPECIES_PAL(IGGLYBUFF, gMonPalette_Igglybuff),\n    SPECIES_PAL(TOGEPI, gMonPalette_Togepi),\n    SPECIES_PAL(TOGETIC, gMonPalette_Togetic),\n    SPECIES_PAL(NATU, gMonPalette_Natu),\n    SPECIES_PAL(XATU, gMonPalette_Xatu),\n    SPECIES_PAL(MAREEP, gMonPalette_Mareep),\n    SPECIES_PAL(FLAAFFY, gMonPalette_Flaaffy),\n    SPECIES_PAL(AMPHAROS, gMonPalette_Ampharos),\n    SPECIES_PAL(BELLOSSOM, gMonPalette_Bellossom),\n    SPECIES_PAL(MARILL, gMonPalette_Marill),\n    SPECIES_PAL(AZUMARILL, gMonPalette_Azumarill),\n    SPECIES_PAL(SUDOWOODO, gMonPalette_Sudowoodo),\n    SPECIES_PAL(POLITOED, gMonPalette_Politoed),\n    SPECIES_PAL(HOPPIP, gMonPalette_Hoppip),\n    SPECIES_PAL(SKIPLOOM, gMonPalette_Skiploom),\n    SPECIES_PAL(JUMPLUFF, gMonPalette_Jumpluff),\n    SPECIES_PAL(AIPOM, gMonPalette_Aipom),\n    SPECIES_PAL(SUNKERN, gMonPalette_Sunkern),\n    SPECIES_PAL(SUNFLORA, gMonPalette_Sunflora),\n    SPECIES_PAL(YANMA, gMonPalette_Yanma),\n    SPECIES_PAL(WOOPER, gMonPalette_Wooper),\n    SPECIES_PAL(QUAGSIRE, gMonPalette_Quagsire),\n    SPECIES_PAL(ESPEON, gMonPalette_Espeon),\n    SPECIES_PAL(UMBREON, gMonPalette_Umbreon),\n    SPECIES_PAL(MURKROW, gMonPalette_Murkrow),\n    SPECIES_PAL(SLOWKING, gMonPalette_Slowking),\n    SPECIES_PAL(MISDREAVUS, gMonPalette_Misdreavus),\n    SPECIES_PAL(UNOWN, gMonPalette_Unown),\n    SPECIES_PAL(WOBBUFFET, gMonPalette_Wobbuffet),\n    SPECIES_PAL(GIRAFARIG, gMonPalette_Girafarig),\n    SPECIES_PAL(PINECO, gMonPalette_Pineco),\n    SPECIES_PAL(FORRETRESS, gMonPalette_Forretress),\n    SPECIES_PAL(DUNSPARCE, gMonPalette_Dunsparce),\n    SPECIES_PAL(GLIGAR, gMonPalette_Gligar),\n    SPECIES_PAL(STEELIX, gMonPalette_Steelix),\n    SPECIES_PAL(SNUBBULL, gMonPalette_Snubbull),\n    SPECIES_PAL(GRANBULL, gMonPalette_Granbull),\n    SPECIES_PAL(QWILFISH, gMonPalette_Qwilfish),\n    SPECIES_PAL(SCIZOR, gMonPalette_Scizor),\n    SPECIES_PAL(SHUCKLE, gMonPalette_Shuckle),\n    SPECIES_PAL(HERACROSS, gMonPalette_Heracross),\n    SPECIES_PAL(SNEASEL, gMonPalette_Sneasel),\n    SPECIES_PAL(TEDDIURSA, gMonPalette_Teddiursa),\n    SPECIES_PAL(URSARING, gMonPalette_Ursaring),\n    SPECIES_PAL(SLUGMA, gMonPalette_Slugma),\n    SPECIES_PAL(MAGCARGO, gMonPalette_Magcargo),\n    SPECIES_PAL(SWINUB, gMonPalette_Swinub),\n    SPECIES_PAL(PILOSWINE, gMonPalette_Piloswine),\n    SPECIES_PAL(CORSOLA, gMonPalette_Corsola),\n    SPECIES_PAL(REMORAID, gMonPalette_Remoraid),\n    SPECIES_PAL(OCTILLERY, gMonPalette_Octillery),\n    SPECIES_PAL(DELIBIRD, gMonPalette_Delibird),\n    SPECIES_PAL(MANTINE, gMonPalette_Mantine),\n    SPECIES_PAL(SKARMORY, gMonPalette_Skarmory),\n    SPECIES_PAL(HOUNDOUR, gMonPalette_Houndour),\n    SPECIES_PAL(HOUNDOOM, gMonPalette_Houndoom),\n    SPECIES_PAL(KINGDRA, gMonPalette_Kingdra),\n    SPECIES_PAL(PHANPY, gMonPalette_Phanpy),\n    SPECIES_PAL(DONPHAN, gMonPalette_Donphan),\n    SPECIES_PAL(PORYGON2, gMonPalette_Porygon2),\n    SPECIES_PAL(STANTLER, gMonPalette_Stantler),\n    SPECIES_PAL(SMEARGLE, gMonPalette_Smeargle),\n    SPECIES_PAL(TYROGUE, gMonPalette_Tyrogue),\n    SPECIES_PAL(HITMONTOP, gMonPalette_Hitmontop),\n    SPECIES_PAL(SMOOCHUM, gMonPalette_Smoochum),\n    SPECIES_PAL(ELEKID, gMonPalette_Elekid),\n    SPECIES_PAL(MAGBY, gMonPalette_Magby),\n    SPECIES_PAL(MILTANK, gMonPalette_Miltank),\n    SPECIES_PAL(BLISSEY, gMonPalette_Blissey),\n    SPECIES_PAL(RAIKOU, gMonPalette_Raikou),\n    SPECIES_PAL(ENTEI, gMonPalette_Entei),\n    SPECIES_PAL(SUICUNE, gMonPalette_Suicune),\n    SPECIES_PAL(LARVITAR, gMonPalette_Larvitar),\n    SPECIES_PAL(PUPITAR, gMonPalette_Pupitar),\n    SPECIES_PAL(TYRANITAR, gMonPalette_Tyranitar),\n    SPECIES_PAL(LUGIA, gMonPalette_Lugia),\n    SPECIES_PAL(HO_OH, gMonPalette_HoOh),\n    SPECIES_PAL(CELEBI, gMonPalette_Celebi),\n    SPECIES_PAL(OLD_UNOWN_B, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_C, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_D, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_E, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_F, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_G, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_H, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_I, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_J, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_K, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_L, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_M, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_N, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_O, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_P, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_Q, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_R, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_S, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_T, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_U, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_V, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_W, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_X, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_Y, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(OLD_UNOWN_Z, gMonPalette_DoubleQuestionMark),\n    SPECIES_PAL(TREECKO, gMonPalette_Treecko),\n    SPECIES_PAL(GROVYLE, gMonPalette_Grovyle),\n    SPECIES_PAL(SCEPTILE, gMonPalette_Sceptile),\n    SPECIES_PAL(TORCHIC, gMonPalette_Torchic),\n    SPECIES_PAL(COMBUSKEN, gMonPalette_Combusken),\n    SPECIES_PAL(BLAZIKEN, gMonPalette_Blaziken),\n    SPECIES_PAL(MUDKIP, gMonPalette_Mudkip),\n    SPECIES_PAL(MARSHTOMP, gMonPalette_Marshtomp),\n    SPECIES_PAL(SWAMPERT, gMonPalette_Swampert),\n    SPECIES_PAL(POOCHYENA, gMonPalette_Poochyena),\n    SPECIES_PAL(MIGHTYENA, gMonPalette_Mightyena),\n    SPECIES_PAL(ZIGZAGOON, gMonPalette_Zigzagoon),\n    SPECIES_PAL(LINOONE, gMonPalette_Linoone),\n    SPECIES_PAL(WURMPLE, gMonPalette_Wurmple),\n    SPECIES_PAL(SILCOON, gMonPalette_Silcoon),\n    SPECIES_PAL(BEAUTIFLY, gMonPalette_Beautifly),\n    SPECIES_PAL(CASCOON, gMonPalette_Cascoon),\n    SPECIES_PAL(DUSTOX, gMonPalette_Dustox),\n    SPECIES_PAL(LOTAD, gMonPalette_Lotad),\n    SPECIES_PAL(LOMBRE, gMonPalette_Lombre),\n    SPECIES_PAL(LUDICOLO, gMonPalette_Ludicolo),\n    SPECIES_PAL(SEEDOT, gMonPalette_Seedot),\n    SPECIES_PAL(NUZLEAF, gMonPalette_Nuzleaf),\n    SPECIES_PAL(SHIFTRY, gMonPalette_Shiftry),\n    SPECIES_PAL(NINCADA, gMonPalette_Nincada),\n    SPECIES_PAL(NINJASK, gMonPalette_Ninjask),\n    SPECIES_PAL(SHEDINJA, gMonPalette_Shedinja),\n    SPECIES_PAL(TAILLOW, gMonPalette_Taillow),\n    SPECIES_PAL(SWELLOW, gMonPalette_Swellow),\n    SPECIES_PAL(SHROOMISH, gMonPalette_Shroomish),\n    SPECIES_PAL(BRELOOM, gMonPalette_Breloom),\n    SPECIES_PAL(SPINDA, gMonPalette_Spinda),\n    SPECIES_PAL(WINGULL, gMonPalette_Wingull),\n    SPECIES_PAL(PELIPPER, gMonPalette_Pelipper),\n    SPECIES_PAL(SURSKIT, gMonPalette_Surskit),\n    SPECIES_PAL(MASQUERAIN, gMonPalette_Masquerain),\n    SPECIES_PAL(WAILMER, gMonPalette_Wailmer),\n    SPECIES_PAL(WAILORD, gMonPalette_Wailord),\n    SPECIES_PAL(SKITTY, gMonPalette_Skitty),\n    SPECIES_PAL(DELCATTY, gMonPalette_Delcatty),\n    SPECIES_PAL(KECLEON, gMonPalette_Kecleon),\n    SPECIES_PAL(BALTOY, gMonPalette_Baltoy),\n    SPECIES_PAL(CLAYDOL, gMonPalette_Claydol),\n    SPECIES_PAL(NOSEPASS, gMonPalette_Nosepass),\n    SPECIES_PAL(TORKOAL, gMonPalette_Torkoal),\n    SPECIES_PAL(SABLEYE, gMonPalette_Sableye),\n    SPECIES_PAL(BARBOACH, gMonPalette_Barboach),\n    SPECIES_PAL(WHISCASH, gMonPalette_Whiscash),\n    SPECIES_PAL(LUVDISC, gMonPalette_Luvdisc),\n    SPECIES_PAL(CORPHISH, gMonPalette_Corphish),\n    SPECIES_PAL(CRAWDAUNT, gMonPalette_Crawdaunt),\n    SPECIES_PAL(FEEBAS, gMonPalette_Feebas),\n    SPECIES_PAL(MILOTIC, gMonPalette_Milotic),\n    SPECIES_PAL(CARVANHA, gMonPalette_Carvanha),\n    SPECIES_PAL(SHARPEDO, gMonPalette_Sharpedo),\n    SPECIES_PAL(TRAPINCH, gMonPalette_Trapinch),\n    SPECIES_PAL(VIBRAVA, gMonPalette_Vibrava),\n    SPECIES_PAL(FLYGON, gMonPalette_Flygon),\n    SPECIES_PAL(MAKUHITA, gMonPalette_Makuhita),\n    SPECIES_PAL(HARIYAMA, gMonPalette_Hariyama),\n    SPECIES_PAL(ELECTRIKE, gMonPalette_Electrike),\n    SPECIES_PAL(MANECTRIC, gMonPalette_Manectric),\n    SPECIES_PAL(NUMEL, gMonPalette_Numel),\n    SPECIES_PAL(CAMERUPT, gMonPalette_Camerupt),\n    SPECIES_PAL(SPHEAL, gMonPalette_Spheal),\n    SPECIES_PAL(SEALEO, gMonPalette_Sealeo),\n    SPECIES_PAL(WALREIN, gMonPalette_Walrein),\n    SPECIES_PAL(CACNEA, gMonPalette_Cacnea),\n    SPECIES_PAL(CACTURNE, gMonPalette_Cacturne),\n    SPECIES_PAL(SNORUNT, gMonPalette_Snorunt),\n    SPECIES_PAL(GLALIE, gMonPalette_Glalie),\n    SPECIES_PAL(LUNATONE, gMonPalette_Lunatone),\n    SPECIES_PAL(SOLROCK, gMonPalette_Solrock),\n    SPECIES_PAL(AZURILL, gMonPalette_Azurill),\n    SPECIES_PAL(SPOINK, gMonPalette_Spoink),\n    SPECIES_PAL(GRUMPIG, gMonPalette_Grumpig),\n    SPECIES_PAL(PLUSLE, gMonPalette_Plusle),\n    SPECIES_PAL(MINUN, gMonPalette_Minun),\n    SPECIES_PAL(MAWILE, gMonPalette_Mawile),\n    SPECIES_PAL(MEDITITE, gMonPalette_Meditite),\n    SPECIES_PAL(MEDICHAM, gMonPalette_Medicham),\n    SPECIES_PAL(SWABLU, gMonPalette_Swablu),\n    SPECIES_PAL(ALTARIA, gMonPalette_Altaria),\n    SPECIES_PAL(WYNAUT, gMonPalette_Wynaut),\n    SPECIES_PAL(DUSKULL, gMonPalette_Duskull),\n    SPECIES_PAL(DUSCLOPS, gMonPalette_Dusclops),\n    SPECIES_PAL(ROSELIA, gMonPalette_Roselia),\n    SPECIES_PAL(SLAKOTH, gMonPalette_Slakoth),\n    SPECIES_PAL(VIGOROTH, gMonPalette_Vigoroth),\n    SPECIES_PAL(SLAKING, gMonPalette_Slaking),\n    SPECIES_PAL(GULPIN, gMonPalette_Gulpin),\n    SPECIES_PAL(SWALOT, gMonPalette_Swalot),\n    SPECIES_PAL(TROPIUS, gMonPalette_Tropius),\n    SPECIES_PAL(WHISMUR, gMonPalette_Whismur),\n    SPECIES_PAL(LOUDRED, gMonPalette_Loudred),\n    SPECIES_PAL(EXPLOUD, gMonPalette_Exploud),\n    SPECIES_PAL(CLAMPERL, gMonPalette_Clamperl),\n    SPECIES_PAL(HUNTAIL, gMonPalette_Huntail),\n    SPECIES_PAL(GOREBYSS, gMonPalette_Gorebyss),\n    SPECIES_PAL(ABSOL, gMonPalette_Absol),\n    SPECIES_PAL(SHUPPET, gMonPalette_Shuppet),\n    SPECIES_PAL(BANETTE, gMonPalette_Banette),\n    SPECIES_PAL(SEVIPER, gMonPalette_Seviper),\n    SPECIES_PAL(ZANGOOSE, gMonPalette_Zangoose),\n    SPECIES_PAL(RELICANTH, gMonPalette_Relicanth),\n    SPECIES_PAL(ARON, gMonPalette_Aron),\n    SPECIES_PAL(LAIRON, gMonPalette_Lairon),\n    SPECIES_PAL(AGGRON, gMonPalette_Aggron),\n    SPECIES_PAL(CASTFORM, gMonPalette_Castform),\n    SPECIES_PAL(VOLBEAT, gMonPalette_Volbeat),\n    SPECIES_PAL(ILLUMISE, gMonPalette_Illumise),\n    SPECIES_PAL(LILEEP, gMonPalette_Lileep),\n    SPECIES_PAL(CRADILY, gMonPalette_Cradily),\n    SPECIES_PAL(ANORITH, gMonPalette_Anorith),\n    SPECIES_PAL(ARMALDO, gMonPalette_Armaldo),\n    SPECIES_PAL(RALTS, gMonPalette_Ralts),\n    SPECIES_PAL(KIRLIA, gMonPalette_Kirlia),\n    SPECIES_PAL(GARDEVOIR, gMonPalette_Gardevoir),\n    SPECIES_PAL(BAGON, gMonPalette_Bagon),\n    SPECIES_PAL(SHELGON, gMonPalette_Shelgon),\n    SPECIES_PAL(SALAMENCE, gMonPalette_Salamence),\n    SPECIES_PAL(BELDUM, gMonPalette_Beldum),\n    SPECIES_PAL(METANG, gMonPalette_Metang),\n    SPECIES_PAL(METAGROSS, gMonPalette_Metagross),\n    SPECIES_PAL(REGIROCK, gMonPalette_Regirock),\n    SPECIES_PAL(REGICE, gMonPalette_Regice),\n    SPECIES_PAL(REGISTEEL, gMonPalette_Registeel),\n    SPECIES_PAL(KYOGRE, gMonPalette_Kyogre),\n    SPECIES_PAL(GROUDON, gMonPalette_Groudon),\n    SPECIES_PAL(RAYQUAZA, gMonPalette_Rayquaza),\n    SPECIES_PAL(LATIAS, gMonPalette_Latias),\n    SPECIES_PAL(LATIOS, gMonPalette_Latios),\n    SPECIES_PAL(JIRACHI, gMonPalette_Jirachi),\n    SPECIES_PAL(DEOXYS, gMonPalette_Deoxys),\n    SPECIES_PAL(CHIMECHO, gMonPalette_Chimecho),\n    SPECIES_PAL(EGG, gMonPalette_Egg),\n    SPECIES_PAL(UNOWN_B, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_C, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_D, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_E, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_F, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_G, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_H, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_I, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_J, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_K, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_L, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_M, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_N, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_O, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_P, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_Q, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_R, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_S, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_T, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_U, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_V, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_W, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_X, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_Y, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_Z, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_EMARK, gMonPalette_Unown),\n    SPECIES_PAL(UNOWN_QMARK, gMonPalette_Unown),\n};\n"
  },
  {
    "path": "src/data/pokemon_graphics/shiny_palette_table.h",
    "content": "const struct CompressedSpritePalette gMonShinyPaletteTable[] =\n{\n    SPECIES_SHINY_PAL(NONE, gMonShinyPalette_CircledQuestionMark),\n    SPECIES_SHINY_PAL(BULBASAUR, gMonShinyPalette_Bulbasaur),\n    SPECIES_SHINY_PAL(IVYSAUR, gMonShinyPalette_Ivysaur),\n    SPECIES_SHINY_PAL(VENUSAUR, gMonShinyPalette_Venusaur),\n    SPECIES_SHINY_PAL(CHARMANDER, gMonShinyPalette_Charmander),\n    SPECIES_SHINY_PAL(CHARMELEON, gMonShinyPalette_Charmeleon),\n    SPECIES_SHINY_PAL(CHARIZARD, gMonShinyPalette_Charizard),\n    SPECIES_SHINY_PAL(SQUIRTLE, gMonShinyPalette_Squirtle),\n    SPECIES_SHINY_PAL(WARTORTLE, gMonShinyPalette_Wartortle),\n    SPECIES_SHINY_PAL(BLASTOISE, gMonShinyPalette_Blastoise),\n    SPECIES_SHINY_PAL(CATERPIE, gMonShinyPalette_Caterpie),\n    SPECIES_SHINY_PAL(METAPOD, gMonShinyPalette_Metapod),\n    SPECIES_SHINY_PAL(BUTTERFREE, gMonShinyPalette_Butterfree),\n    SPECIES_SHINY_PAL(WEEDLE, gMonShinyPalette_Weedle),\n    SPECIES_SHINY_PAL(KAKUNA, gMonShinyPalette_Kakuna),\n    SPECIES_SHINY_PAL(BEEDRILL, gMonShinyPalette_Beedrill),\n    SPECIES_SHINY_PAL(PIDGEY, gMonShinyPalette_Pidgey),\n    SPECIES_SHINY_PAL(PIDGEOTTO, gMonShinyPalette_Pidgeotto),\n    SPECIES_SHINY_PAL(PIDGEOT, gMonShinyPalette_Pidgeot),\n    SPECIES_SHINY_PAL(RATTATA, gMonShinyPalette_Rattata),\n    SPECIES_SHINY_PAL(RATICATE, gMonShinyPalette_Raticate),\n    SPECIES_SHINY_PAL(SPEAROW, gMonShinyPalette_Spearow),\n    SPECIES_SHINY_PAL(FEAROW, gMonShinyPalette_Fearow),\n    SPECIES_SHINY_PAL(EKANS, gMonShinyPalette_Ekans),\n    SPECIES_SHINY_PAL(ARBOK, gMonShinyPalette_Arbok),\n    SPECIES_SHINY_PAL(PIKACHU, gMonShinyPalette_Pikachu),\n    SPECIES_SHINY_PAL(RAICHU, gMonShinyPalette_Raichu),\n    SPECIES_SHINY_PAL(SANDSHREW, gMonShinyPalette_Sandshrew),\n    SPECIES_SHINY_PAL(SANDSLASH, gMonShinyPalette_Sandslash),\n    SPECIES_SHINY_PAL(NIDORAN_F, gMonShinyPalette_NidoranF),\n    SPECIES_SHINY_PAL(NIDORINA, gMonShinyPalette_Nidorina),\n    SPECIES_SHINY_PAL(NIDOQUEEN, gMonShinyPalette_Nidoqueen),\n    SPECIES_SHINY_PAL(NIDORAN_M, gMonShinyPalette_NidoranM),\n    SPECIES_SHINY_PAL(NIDORINO, gMonShinyPalette_Nidorino),\n    SPECIES_SHINY_PAL(NIDOKING, gMonShinyPalette_Nidoking),\n    SPECIES_SHINY_PAL(CLEFAIRY, gMonShinyPalette_Clefairy),\n    SPECIES_SHINY_PAL(CLEFABLE, gMonShinyPalette_Clefable),\n    SPECIES_SHINY_PAL(VULPIX, gMonShinyPalette_Vulpix),\n    SPECIES_SHINY_PAL(NINETALES, gMonShinyPalette_Ninetales),\n    SPECIES_SHINY_PAL(JIGGLYPUFF, gMonShinyPalette_Jigglypuff),\n    SPECIES_SHINY_PAL(WIGGLYTUFF, gMonShinyPalette_Wigglytuff),\n    SPECIES_SHINY_PAL(ZUBAT, gMonShinyPalette_Zubat),\n    SPECIES_SHINY_PAL(GOLBAT, gMonShinyPalette_Golbat),\n    SPECIES_SHINY_PAL(ODDISH, gMonShinyPalette_Oddish),\n    SPECIES_SHINY_PAL(GLOOM, gMonShinyPalette_Gloom),\n    SPECIES_SHINY_PAL(VILEPLUME, gMonShinyPalette_Vileplume),\n    SPECIES_SHINY_PAL(PARAS, gMonShinyPalette_Paras),\n    SPECIES_SHINY_PAL(PARASECT, gMonShinyPalette_Parasect),\n    SPECIES_SHINY_PAL(VENONAT, gMonShinyPalette_Venonat),\n    SPECIES_SHINY_PAL(VENOMOTH, gMonShinyPalette_Venomoth),\n    SPECIES_SHINY_PAL(DIGLETT, gMonShinyPalette_Diglett),\n    SPECIES_SHINY_PAL(DUGTRIO, gMonShinyPalette_Dugtrio),\n    SPECIES_SHINY_PAL(MEOWTH, gMonShinyPalette_Meowth),\n    SPECIES_SHINY_PAL(PERSIAN, gMonShinyPalette_Persian),\n    SPECIES_SHINY_PAL(PSYDUCK, gMonShinyPalette_Psyduck),\n    SPECIES_SHINY_PAL(GOLDUCK, gMonShinyPalette_Golduck),\n    SPECIES_SHINY_PAL(MANKEY, gMonShinyPalette_Mankey),\n    SPECIES_SHINY_PAL(PRIMEAPE, gMonShinyPalette_Primeape),\n    SPECIES_SHINY_PAL(GROWLITHE, gMonShinyPalette_Growlithe),\n    SPECIES_SHINY_PAL(ARCANINE, gMonShinyPalette_Arcanine),\n    SPECIES_SHINY_PAL(POLIWAG, gMonShinyPalette_Poliwag),\n    SPECIES_SHINY_PAL(POLIWHIRL, gMonShinyPalette_Poliwhirl),\n    SPECIES_SHINY_PAL(POLIWRATH, gMonShinyPalette_Poliwrath),\n    SPECIES_SHINY_PAL(ABRA, gMonShinyPalette_Abra),\n    SPECIES_SHINY_PAL(KADABRA, gMonShinyPalette_Kadabra),\n    SPECIES_SHINY_PAL(ALAKAZAM, gMonShinyPalette_Alakazam),\n    SPECIES_SHINY_PAL(MACHOP, gMonShinyPalette_Machop),\n    SPECIES_SHINY_PAL(MACHOKE, gMonShinyPalette_Machoke),\n    SPECIES_SHINY_PAL(MACHAMP, gMonShinyPalette_Machamp),\n    SPECIES_SHINY_PAL(BELLSPROUT, gMonShinyPalette_Bellsprout),\n    SPECIES_SHINY_PAL(WEEPINBELL, gMonShinyPalette_Weepinbell),\n    SPECIES_SHINY_PAL(VICTREEBEL, gMonShinyPalette_Victreebel),\n    SPECIES_SHINY_PAL(TENTACOOL, gMonShinyPalette_Tentacool),\n    SPECIES_SHINY_PAL(TENTACRUEL, gMonShinyPalette_Tentacruel),\n    SPECIES_SHINY_PAL(GEODUDE, gMonShinyPalette_Geodude),\n    SPECIES_SHINY_PAL(GRAVELER, gMonShinyPalette_Graveler),\n    SPECIES_SHINY_PAL(GOLEM, gMonShinyPalette_Golem),\n    SPECIES_SHINY_PAL(PONYTA, gMonShinyPalette_Ponyta),\n    SPECIES_SHINY_PAL(RAPIDASH, gMonShinyPalette_Rapidash),\n    SPECIES_SHINY_PAL(SLOWPOKE, gMonShinyPalette_Slowpoke),\n    SPECIES_SHINY_PAL(SLOWBRO, gMonShinyPalette_Slowbro),\n    SPECIES_SHINY_PAL(MAGNEMITE, gMonShinyPalette_Magnemite),\n    SPECIES_SHINY_PAL(MAGNETON, gMonShinyPalette_Magneton),\n    SPECIES_SHINY_PAL(FARFETCHD, gMonShinyPalette_Farfetchd),\n    SPECIES_SHINY_PAL(DODUO, gMonShinyPalette_Doduo),\n    SPECIES_SHINY_PAL(DODRIO, gMonShinyPalette_Dodrio),\n    SPECIES_SHINY_PAL(SEEL, gMonShinyPalette_Seel),\n    SPECIES_SHINY_PAL(DEWGONG, gMonShinyPalette_Dewgong),\n    SPECIES_SHINY_PAL(GRIMER, gMonShinyPalette_Grimer),\n    SPECIES_SHINY_PAL(MUK, gMonShinyPalette_Muk),\n    SPECIES_SHINY_PAL(SHELLDER, gMonShinyPalette_Shellder),\n    SPECIES_SHINY_PAL(CLOYSTER, gMonShinyPalette_Cloyster),\n    SPECIES_SHINY_PAL(GASTLY, gMonShinyPalette_Gastly),\n    SPECIES_SHINY_PAL(HAUNTER, gMonShinyPalette_Haunter),\n    SPECIES_SHINY_PAL(GENGAR, gMonShinyPalette_Gengar),\n    SPECIES_SHINY_PAL(ONIX, gMonShinyPalette_Onix),\n    SPECIES_SHINY_PAL(DROWZEE, gMonShinyPalette_Drowzee),\n    SPECIES_SHINY_PAL(HYPNO, gMonShinyPalette_Hypno),\n    SPECIES_SHINY_PAL(KRABBY, gMonShinyPalette_Krabby),\n    SPECIES_SHINY_PAL(KINGLER, gMonShinyPalette_Kingler),\n    SPECIES_SHINY_PAL(VOLTORB, gMonShinyPalette_Voltorb),\n    SPECIES_SHINY_PAL(ELECTRODE, gMonShinyPalette_Electrode),\n    SPECIES_SHINY_PAL(EXEGGCUTE, gMonShinyPalette_Exeggcute),\n    SPECIES_SHINY_PAL(EXEGGUTOR, gMonShinyPalette_Exeggutor),\n    SPECIES_SHINY_PAL(CUBONE, gMonShinyPalette_Cubone),\n    SPECIES_SHINY_PAL(MAROWAK, gMonShinyPalette_Marowak),\n    SPECIES_SHINY_PAL(HITMONLEE, gMonShinyPalette_Hitmonlee),\n    SPECIES_SHINY_PAL(HITMONCHAN, gMonShinyPalette_Hitmonchan),\n    SPECIES_SHINY_PAL(LICKITUNG, gMonShinyPalette_Lickitung),\n    SPECIES_SHINY_PAL(KOFFING, gMonShinyPalette_Koffing),\n    SPECIES_SHINY_PAL(WEEZING, gMonShinyPalette_Weezing),\n    SPECIES_SHINY_PAL(RHYHORN, gMonShinyPalette_Rhyhorn),\n    SPECIES_SHINY_PAL(RHYDON, gMonShinyPalette_Rhydon),\n    SPECIES_SHINY_PAL(CHANSEY, gMonShinyPalette_Chansey),\n    SPECIES_SHINY_PAL(TANGELA, gMonShinyPalette_Tangela),\n    SPECIES_SHINY_PAL(KANGASKHAN, gMonShinyPalette_Kangaskhan),\n    SPECIES_SHINY_PAL(HORSEA, gMonShinyPalette_Horsea),\n    SPECIES_SHINY_PAL(SEADRA, gMonShinyPalette_Seadra),\n    SPECIES_SHINY_PAL(GOLDEEN, gMonShinyPalette_Goldeen),\n    SPECIES_SHINY_PAL(SEAKING, gMonShinyPalette_Seaking),\n    SPECIES_SHINY_PAL(STARYU, gMonShinyPalette_Staryu),\n    SPECIES_SHINY_PAL(STARMIE, gMonShinyPalette_Starmie),\n    SPECIES_SHINY_PAL(MR_MIME, gMonShinyPalette_Mrmime),\n    SPECIES_SHINY_PAL(SCYTHER, gMonShinyPalette_Scyther),\n    SPECIES_SHINY_PAL(JYNX, gMonShinyPalette_Jynx),\n    SPECIES_SHINY_PAL(ELECTABUZZ, gMonShinyPalette_Electabuzz),\n    SPECIES_SHINY_PAL(MAGMAR, gMonShinyPalette_Magmar),\n    SPECIES_SHINY_PAL(PINSIR, gMonShinyPalette_Pinsir),\n    SPECIES_SHINY_PAL(TAUROS, gMonShinyPalette_Tauros),\n    SPECIES_SHINY_PAL(MAGIKARP, gMonShinyPalette_Magikarp),\n    SPECIES_SHINY_PAL(GYARADOS, gMonShinyPalette_Gyarados),\n    SPECIES_SHINY_PAL(LAPRAS, gMonShinyPalette_Lapras),\n    SPECIES_SHINY_PAL(DITTO, gMonShinyPalette_Ditto),\n    SPECIES_SHINY_PAL(EEVEE, gMonShinyPalette_Eevee),\n    SPECIES_SHINY_PAL(VAPOREON, gMonShinyPalette_Vaporeon),\n    SPECIES_SHINY_PAL(JOLTEON, gMonShinyPalette_Jolteon),\n    SPECIES_SHINY_PAL(FLAREON, gMonShinyPalette_Flareon),\n    SPECIES_SHINY_PAL(PORYGON, gMonShinyPalette_Porygon),\n    SPECIES_SHINY_PAL(OMANYTE, gMonShinyPalette_Omanyte),\n    SPECIES_SHINY_PAL(OMASTAR, gMonShinyPalette_Omastar),\n    SPECIES_SHINY_PAL(KABUTO, gMonShinyPalette_Kabuto),\n    SPECIES_SHINY_PAL(KABUTOPS, gMonShinyPalette_Kabutops),\n    SPECIES_SHINY_PAL(AERODACTYL, gMonShinyPalette_Aerodactyl),\n    SPECIES_SHINY_PAL(SNORLAX, gMonShinyPalette_Snorlax),\n    SPECIES_SHINY_PAL(ARTICUNO, gMonShinyPalette_Articuno),\n    SPECIES_SHINY_PAL(ZAPDOS, gMonShinyPalette_Zapdos),\n    SPECIES_SHINY_PAL(MOLTRES, gMonShinyPalette_Moltres),\n    SPECIES_SHINY_PAL(DRATINI, gMonShinyPalette_Dratini),\n    SPECIES_SHINY_PAL(DRAGONAIR, gMonShinyPalette_Dragonair),\n    SPECIES_SHINY_PAL(DRAGONITE, gMonShinyPalette_Dragonite),\n    SPECIES_SHINY_PAL(MEWTWO, gMonShinyPalette_Mewtwo),\n    SPECIES_SHINY_PAL(MEW, gMonShinyPalette_Mew),\n    SPECIES_SHINY_PAL(CHIKORITA, gMonShinyPalette_Chikorita),\n    SPECIES_SHINY_PAL(BAYLEEF, gMonShinyPalette_Bayleef),\n    SPECIES_SHINY_PAL(MEGANIUM, gMonShinyPalette_Meganium),\n    SPECIES_SHINY_PAL(CYNDAQUIL, gMonShinyPalette_Cyndaquil),\n    SPECIES_SHINY_PAL(QUILAVA, gMonShinyPalette_Quilava),\n    SPECIES_SHINY_PAL(TYPHLOSION, gMonShinyPalette_Typhlosion),\n    SPECIES_SHINY_PAL(TOTODILE, gMonShinyPalette_Totodile),\n    SPECIES_SHINY_PAL(CROCONAW, gMonShinyPalette_Croconaw),\n    SPECIES_SHINY_PAL(FERALIGATR, gMonShinyPalette_Feraligatr),\n    SPECIES_SHINY_PAL(SENTRET, gMonShinyPalette_Sentret),\n    SPECIES_SHINY_PAL(FURRET, gMonShinyPalette_Furret),\n    SPECIES_SHINY_PAL(HOOTHOOT, gMonShinyPalette_Hoothoot),\n    SPECIES_SHINY_PAL(NOCTOWL, gMonShinyPalette_Noctowl),\n    SPECIES_SHINY_PAL(LEDYBA, gMonShinyPalette_Ledyba),\n    SPECIES_SHINY_PAL(LEDIAN, gMonShinyPalette_Ledian),\n    SPECIES_SHINY_PAL(SPINARAK, gMonShinyPalette_Spinarak),\n    SPECIES_SHINY_PAL(ARIADOS, gMonShinyPalette_Ariados),\n    SPECIES_SHINY_PAL(CROBAT, gMonShinyPalette_Crobat),\n    SPECIES_SHINY_PAL(CHINCHOU, gMonShinyPalette_Chinchou),\n    SPECIES_SHINY_PAL(LANTURN, gMonShinyPalette_Lanturn),\n    SPECIES_SHINY_PAL(PICHU, gMonShinyPalette_Pichu),\n    SPECIES_SHINY_PAL(CLEFFA, gMonShinyPalette_Cleffa),\n    SPECIES_SHINY_PAL(IGGLYBUFF, gMonShinyPalette_Igglybuff),\n    SPECIES_SHINY_PAL(TOGEPI, gMonShinyPalette_Togepi),\n    SPECIES_SHINY_PAL(TOGETIC, gMonShinyPalette_Togetic),\n    SPECIES_SHINY_PAL(NATU, gMonShinyPalette_Natu),\n    SPECIES_SHINY_PAL(XATU, gMonShinyPalette_Xatu),\n    SPECIES_SHINY_PAL(MAREEP, gMonShinyPalette_Mareep),\n    SPECIES_SHINY_PAL(FLAAFFY, gMonShinyPalette_Flaaffy),\n    SPECIES_SHINY_PAL(AMPHAROS, gMonShinyPalette_Ampharos),\n    SPECIES_SHINY_PAL(BELLOSSOM, gMonShinyPalette_Bellossom),\n    SPECIES_SHINY_PAL(MARILL, gMonShinyPalette_Marill),\n    SPECIES_SHINY_PAL(AZUMARILL, gMonShinyPalette_Azumarill),\n    SPECIES_SHINY_PAL(SUDOWOODO, gMonShinyPalette_Sudowoodo),\n    SPECIES_SHINY_PAL(POLITOED, gMonShinyPalette_Politoed),\n    SPECIES_SHINY_PAL(HOPPIP, gMonShinyPalette_Hoppip),\n    SPECIES_SHINY_PAL(SKIPLOOM, gMonShinyPalette_Skiploom),\n    SPECIES_SHINY_PAL(JUMPLUFF, gMonShinyPalette_Jumpluff),\n    SPECIES_SHINY_PAL(AIPOM, gMonShinyPalette_Aipom),\n    SPECIES_SHINY_PAL(SUNKERN, gMonShinyPalette_Sunkern),\n    SPECIES_SHINY_PAL(SUNFLORA, gMonShinyPalette_Sunflora),\n    SPECIES_SHINY_PAL(YANMA, gMonShinyPalette_Yanma),\n    SPECIES_SHINY_PAL(WOOPER, gMonShinyPalette_Wooper),\n    SPECIES_SHINY_PAL(QUAGSIRE, gMonShinyPalette_Quagsire),\n    SPECIES_SHINY_PAL(ESPEON, gMonShinyPalette_Espeon),\n    SPECIES_SHINY_PAL(UMBREON, gMonShinyPalette_Umbreon),\n    SPECIES_SHINY_PAL(MURKROW, gMonShinyPalette_Murkrow),\n    SPECIES_SHINY_PAL(SLOWKING, gMonShinyPalette_Slowking),\n    SPECIES_SHINY_PAL(MISDREAVUS, gMonShinyPalette_Misdreavus),\n    SPECIES_SHINY_PAL(UNOWN, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(WOBBUFFET, gMonShinyPalette_Wobbuffet),\n    SPECIES_SHINY_PAL(GIRAFARIG, gMonShinyPalette_Girafarig),\n    SPECIES_SHINY_PAL(PINECO, gMonShinyPalette_Pineco),\n    SPECIES_SHINY_PAL(FORRETRESS, gMonShinyPalette_Forretress),\n    SPECIES_SHINY_PAL(DUNSPARCE, gMonShinyPalette_Dunsparce),\n    SPECIES_SHINY_PAL(GLIGAR, gMonShinyPalette_Gligar),\n    SPECIES_SHINY_PAL(STEELIX, gMonShinyPalette_Steelix),\n    SPECIES_SHINY_PAL(SNUBBULL, gMonShinyPalette_Snubbull),\n    SPECIES_SHINY_PAL(GRANBULL, gMonShinyPalette_Granbull),\n    SPECIES_SHINY_PAL(QWILFISH, gMonShinyPalette_Qwilfish),\n    SPECIES_SHINY_PAL(SCIZOR, gMonShinyPalette_Scizor),\n    SPECIES_SHINY_PAL(SHUCKLE, gMonShinyPalette_Shuckle),\n    SPECIES_SHINY_PAL(HERACROSS, gMonShinyPalette_Heracross),\n    SPECIES_SHINY_PAL(SNEASEL, gMonShinyPalette_Sneasel),\n    SPECIES_SHINY_PAL(TEDDIURSA, gMonShinyPalette_Teddiursa),\n    SPECIES_SHINY_PAL(URSARING, gMonShinyPalette_Ursaring),\n    SPECIES_SHINY_PAL(SLUGMA, gMonShinyPalette_Slugma),\n    SPECIES_SHINY_PAL(MAGCARGO, gMonShinyPalette_Magcargo),\n    SPECIES_SHINY_PAL(SWINUB, gMonShinyPalette_Swinub),\n    SPECIES_SHINY_PAL(PILOSWINE, gMonShinyPalette_Piloswine),\n    SPECIES_SHINY_PAL(CORSOLA, gMonShinyPalette_Corsola),\n    SPECIES_SHINY_PAL(REMORAID, gMonShinyPalette_Remoraid),\n    SPECIES_SHINY_PAL(OCTILLERY, gMonShinyPalette_Octillery),\n    SPECIES_SHINY_PAL(DELIBIRD, gMonShinyPalette_Delibird),\n    SPECIES_SHINY_PAL(MANTINE, gMonShinyPalette_Mantine),\n    SPECIES_SHINY_PAL(SKARMORY, gMonShinyPalette_Skarmory),\n    SPECIES_SHINY_PAL(HOUNDOUR, gMonShinyPalette_Houndour),\n    SPECIES_SHINY_PAL(HOUNDOOM, gMonShinyPalette_Houndoom),\n    SPECIES_SHINY_PAL(KINGDRA, gMonShinyPalette_Kingdra),\n    SPECIES_SHINY_PAL(PHANPY, gMonShinyPalette_Phanpy),\n    SPECIES_SHINY_PAL(DONPHAN, gMonShinyPalette_Donphan),\n    SPECIES_SHINY_PAL(PORYGON2, gMonShinyPalette_Porygon2),\n    SPECIES_SHINY_PAL(STANTLER, gMonShinyPalette_Stantler),\n    SPECIES_SHINY_PAL(SMEARGLE, gMonShinyPalette_Smeargle),\n    SPECIES_SHINY_PAL(TYROGUE, gMonShinyPalette_Tyrogue),\n    SPECIES_SHINY_PAL(HITMONTOP, gMonShinyPalette_Hitmontop),\n    SPECIES_SHINY_PAL(SMOOCHUM, gMonShinyPalette_Smoochum),\n    SPECIES_SHINY_PAL(ELEKID, gMonShinyPalette_Elekid),\n    SPECIES_SHINY_PAL(MAGBY, gMonShinyPalette_Magby),\n    SPECIES_SHINY_PAL(MILTANK, gMonShinyPalette_Miltank),\n    SPECIES_SHINY_PAL(BLISSEY, gMonShinyPalette_Blissey),\n    SPECIES_SHINY_PAL(RAIKOU, gMonShinyPalette_Raikou),\n    SPECIES_SHINY_PAL(ENTEI, gMonShinyPalette_Entei),\n    SPECIES_SHINY_PAL(SUICUNE, gMonShinyPalette_Suicune),\n    SPECIES_SHINY_PAL(LARVITAR, gMonShinyPalette_Larvitar),\n    SPECIES_SHINY_PAL(PUPITAR, gMonShinyPalette_Pupitar),\n    SPECIES_SHINY_PAL(TYRANITAR, gMonShinyPalette_Tyranitar),\n    SPECIES_SHINY_PAL(LUGIA, gMonShinyPalette_Lugia),\n    SPECIES_SHINY_PAL(HO_OH, gMonShinyPalette_HoOh),\n    SPECIES_SHINY_PAL(CELEBI, gMonShinyPalette_Celebi),\n    SPECIES_SHINY_PAL(OLD_UNOWN_B, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_C, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_D, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_E, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_F, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_G, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_H, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_I, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_J, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_K, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_L, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_M, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_N, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_O, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_P, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_Q, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_R, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_S, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_T, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_U, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_V, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_W, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_X, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_Y, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(OLD_UNOWN_Z, gMonShinyPalette_DoubleQuestionMark),\n    SPECIES_SHINY_PAL(TREECKO, gMonShinyPalette_Treecko),\n    SPECIES_SHINY_PAL(GROVYLE, gMonShinyPalette_Grovyle),\n    SPECIES_SHINY_PAL(SCEPTILE, gMonShinyPalette_Sceptile),\n    SPECIES_SHINY_PAL(TORCHIC, gMonShinyPalette_Torchic),\n    SPECIES_SHINY_PAL(COMBUSKEN, gMonShinyPalette_Combusken),\n    SPECIES_SHINY_PAL(BLAZIKEN, gMonShinyPalette_Blaziken),\n    SPECIES_SHINY_PAL(MUDKIP, gMonShinyPalette_Mudkip),\n    SPECIES_SHINY_PAL(MARSHTOMP, gMonShinyPalette_Marshtomp),\n    SPECIES_SHINY_PAL(SWAMPERT, gMonShinyPalette_Swampert),\n    SPECIES_SHINY_PAL(POOCHYENA, gMonShinyPalette_Poochyena),\n    SPECIES_SHINY_PAL(MIGHTYENA, gMonShinyPalette_Mightyena),\n    SPECIES_SHINY_PAL(ZIGZAGOON, gMonShinyPalette_Zigzagoon),\n    SPECIES_SHINY_PAL(LINOONE, gMonShinyPalette_Linoone),\n    SPECIES_SHINY_PAL(WURMPLE, gMonShinyPalette_Wurmple),\n    SPECIES_SHINY_PAL(SILCOON, gMonShinyPalette_Silcoon),\n    SPECIES_SHINY_PAL(BEAUTIFLY, gMonShinyPalette_Beautifly),\n    SPECIES_SHINY_PAL(CASCOON, gMonShinyPalette_Cascoon),\n    SPECIES_SHINY_PAL(DUSTOX, gMonShinyPalette_Dustox),\n    SPECIES_SHINY_PAL(LOTAD, gMonShinyPalette_Lotad),\n    SPECIES_SHINY_PAL(LOMBRE, gMonShinyPalette_Lombre),\n    SPECIES_SHINY_PAL(LUDICOLO, gMonShinyPalette_Ludicolo),\n    SPECIES_SHINY_PAL(SEEDOT, gMonShinyPalette_Seedot),\n    SPECIES_SHINY_PAL(NUZLEAF, gMonShinyPalette_Nuzleaf),\n    SPECIES_SHINY_PAL(SHIFTRY, gMonShinyPalette_Shiftry),\n    SPECIES_SHINY_PAL(NINCADA, gMonShinyPalette_Nincada),\n    SPECIES_SHINY_PAL(NINJASK, gMonShinyPalette_Ninjask),\n    SPECIES_SHINY_PAL(SHEDINJA, gMonShinyPalette_Shedinja),\n    SPECIES_SHINY_PAL(TAILLOW, gMonShinyPalette_Taillow),\n    SPECIES_SHINY_PAL(SWELLOW, gMonShinyPalette_Swellow),\n    SPECIES_SHINY_PAL(SHROOMISH, gMonShinyPalette_Shroomish),\n    SPECIES_SHINY_PAL(BRELOOM, gMonShinyPalette_Breloom),\n    SPECIES_SHINY_PAL(SPINDA, gMonShinyPalette_Spinda),\n    SPECIES_SHINY_PAL(WINGULL, gMonShinyPalette_Wingull),\n    SPECIES_SHINY_PAL(PELIPPER, gMonShinyPalette_Pelipper),\n    SPECIES_SHINY_PAL(SURSKIT, gMonShinyPalette_Surskit),\n    SPECIES_SHINY_PAL(MASQUERAIN, gMonShinyPalette_Masquerain),\n    SPECIES_SHINY_PAL(WAILMER, gMonShinyPalette_Wailmer),\n    SPECIES_SHINY_PAL(WAILORD, gMonShinyPalette_Wailord),\n    SPECIES_SHINY_PAL(SKITTY, gMonShinyPalette_Skitty),\n    SPECIES_SHINY_PAL(DELCATTY, gMonShinyPalette_Delcatty),\n    SPECIES_SHINY_PAL(KECLEON, gMonShinyPalette_Kecleon),\n    SPECIES_SHINY_PAL(BALTOY, gMonShinyPalette_Baltoy),\n    SPECIES_SHINY_PAL(CLAYDOL, gMonShinyPalette_Claydol),\n    SPECIES_SHINY_PAL(NOSEPASS, gMonShinyPalette_Nosepass),\n    SPECIES_SHINY_PAL(TORKOAL, gMonShinyPalette_Torkoal),\n    SPECIES_SHINY_PAL(SABLEYE, gMonShinyPalette_Sableye),\n    SPECIES_SHINY_PAL(BARBOACH, gMonShinyPalette_Barboach),\n    SPECIES_SHINY_PAL(WHISCASH, gMonShinyPalette_Whiscash),\n    SPECIES_SHINY_PAL(LUVDISC, gMonShinyPalette_Luvdisc),\n    SPECIES_SHINY_PAL(CORPHISH, gMonShinyPalette_Corphish),\n    SPECIES_SHINY_PAL(CRAWDAUNT, gMonShinyPalette_Crawdaunt),\n    SPECIES_SHINY_PAL(FEEBAS, gMonShinyPalette_Feebas),\n    SPECIES_SHINY_PAL(MILOTIC, gMonShinyPalette_Milotic),\n    SPECIES_SHINY_PAL(CARVANHA, gMonShinyPalette_Carvanha),\n    SPECIES_SHINY_PAL(SHARPEDO, gMonShinyPalette_Sharpedo),\n    SPECIES_SHINY_PAL(TRAPINCH, gMonShinyPalette_Trapinch),\n    SPECIES_SHINY_PAL(VIBRAVA, gMonShinyPalette_Vibrava),\n    SPECIES_SHINY_PAL(FLYGON, gMonShinyPalette_Flygon),\n    SPECIES_SHINY_PAL(MAKUHITA, gMonShinyPalette_Makuhita),\n    SPECIES_SHINY_PAL(HARIYAMA, gMonShinyPalette_Hariyama),\n    SPECIES_SHINY_PAL(ELECTRIKE, gMonShinyPalette_Electrike),\n    SPECIES_SHINY_PAL(MANECTRIC, gMonShinyPalette_Manectric),\n    SPECIES_SHINY_PAL(NUMEL, gMonShinyPalette_Numel),\n    SPECIES_SHINY_PAL(CAMERUPT, gMonShinyPalette_Camerupt),\n    SPECIES_SHINY_PAL(SPHEAL, gMonShinyPalette_Spheal),\n    SPECIES_SHINY_PAL(SEALEO, gMonShinyPalette_Sealeo),\n    SPECIES_SHINY_PAL(WALREIN, gMonShinyPalette_Walrein),\n    SPECIES_SHINY_PAL(CACNEA, gMonShinyPalette_Cacnea),\n    SPECIES_SHINY_PAL(CACTURNE, gMonShinyPalette_Cacturne),\n    SPECIES_SHINY_PAL(SNORUNT, gMonShinyPalette_Snorunt),\n    SPECIES_SHINY_PAL(GLALIE, gMonShinyPalette_Glalie),\n    SPECIES_SHINY_PAL(LUNATONE, gMonShinyPalette_Lunatone),\n    SPECIES_SHINY_PAL(SOLROCK, gMonShinyPalette_Solrock),\n    SPECIES_SHINY_PAL(AZURILL, gMonShinyPalette_Azurill),\n    SPECIES_SHINY_PAL(SPOINK, gMonShinyPalette_Spoink),\n    SPECIES_SHINY_PAL(GRUMPIG, gMonShinyPalette_Grumpig),\n    SPECIES_SHINY_PAL(PLUSLE, gMonShinyPalette_Plusle),\n    SPECIES_SHINY_PAL(MINUN, gMonShinyPalette_Minun),\n    SPECIES_SHINY_PAL(MAWILE, gMonShinyPalette_Mawile),\n    SPECIES_SHINY_PAL(MEDITITE, gMonShinyPalette_Meditite),\n    SPECIES_SHINY_PAL(MEDICHAM, gMonShinyPalette_Medicham),\n    SPECIES_SHINY_PAL(SWABLU, gMonShinyPalette_Swablu),\n    SPECIES_SHINY_PAL(ALTARIA, gMonShinyPalette_Altaria),\n    SPECIES_SHINY_PAL(WYNAUT, gMonShinyPalette_Wynaut),\n    SPECIES_SHINY_PAL(DUSKULL, gMonShinyPalette_Duskull),\n    SPECIES_SHINY_PAL(DUSCLOPS, gMonShinyPalette_Dusclops),\n    SPECIES_SHINY_PAL(ROSELIA, gMonShinyPalette_Roselia),\n    SPECIES_SHINY_PAL(SLAKOTH, gMonShinyPalette_Slakoth),\n    SPECIES_SHINY_PAL(VIGOROTH, gMonShinyPalette_Vigoroth),\n    SPECIES_SHINY_PAL(SLAKING, gMonShinyPalette_Slaking),\n    SPECIES_SHINY_PAL(GULPIN, gMonShinyPalette_Gulpin),\n    SPECIES_SHINY_PAL(SWALOT, gMonShinyPalette_Swalot),\n    SPECIES_SHINY_PAL(TROPIUS, gMonShinyPalette_Tropius),\n    SPECIES_SHINY_PAL(WHISMUR, gMonShinyPalette_Whismur),\n    SPECIES_SHINY_PAL(LOUDRED, gMonShinyPalette_Loudred),\n    SPECIES_SHINY_PAL(EXPLOUD, gMonShinyPalette_Exploud),\n    SPECIES_SHINY_PAL(CLAMPERL, gMonShinyPalette_Clamperl),\n    SPECIES_SHINY_PAL(HUNTAIL, gMonShinyPalette_Huntail),\n    SPECIES_SHINY_PAL(GOREBYSS, gMonShinyPalette_Gorebyss),\n    SPECIES_SHINY_PAL(ABSOL, gMonShinyPalette_Absol),\n    SPECIES_SHINY_PAL(SHUPPET, gMonShinyPalette_Shuppet),\n    SPECIES_SHINY_PAL(BANETTE, gMonShinyPalette_Banette),\n    SPECIES_SHINY_PAL(SEVIPER, gMonShinyPalette_Seviper),\n    SPECIES_SHINY_PAL(ZANGOOSE, gMonShinyPalette_Zangoose),\n    SPECIES_SHINY_PAL(RELICANTH, gMonShinyPalette_Relicanth),\n    SPECIES_SHINY_PAL(ARON, gMonShinyPalette_Aron),\n    SPECIES_SHINY_PAL(LAIRON, gMonShinyPalette_Lairon),\n    SPECIES_SHINY_PAL(AGGRON, gMonShinyPalette_Aggron),\n    SPECIES_SHINY_PAL(CASTFORM, gMonShinyPalette_Castform),\n    SPECIES_SHINY_PAL(VOLBEAT, gMonShinyPalette_Volbeat),\n    SPECIES_SHINY_PAL(ILLUMISE, gMonShinyPalette_Illumise),\n    SPECIES_SHINY_PAL(LILEEP, gMonShinyPalette_Lileep),\n    SPECIES_SHINY_PAL(CRADILY, gMonShinyPalette_Cradily),\n    SPECIES_SHINY_PAL(ANORITH, gMonShinyPalette_Anorith),\n    SPECIES_SHINY_PAL(ARMALDO, gMonShinyPalette_Armaldo),\n    SPECIES_SHINY_PAL(RALTS, gMonShinyPalette_Ralts),\n    SPECIES_SHINY_PAL(KIRLIA, gMonShinyPalette_Kirlia),\n    SPECIES_SHINY_PAL(GARDEVOIR, gMonShinyPalette_Gardevoir),\n    SPECIES_SHINY_PAL(BAGON, gMonShinyPalette_Bagon),\n    SPECIES_SHINY_PAL(SHELGON, gMonShinyPalette_Shelgon),\n    SPECIES_SHINY_PAL(SALAMENCE, gMonShinyPalette_Salamence),\n    SPECIES_SHINY_PAL(BELDUM, gMonShinyPalette_Beldum),\n    SPECIES_SHINY_PAL(METANG, gMonShinyPalette_Metang),\n    SPECIES_SHINY_PAL(METAGROSS, gMonShinyPalette_Metagross),\n    SPECIES_SHINY_PAL(REGIROCK, gMonShinyPalette_Regirock),\n    SPECIES_SHINY_PAL(REGICE, gMonShinyPalette_Regice),\n    SPECIES_SHINY_PAL(REGISTEEL, gMonShinyPalette_Registeel),\n    SPECIES_SHINY_PAL(KYOGRE, gMonShinyPalette_Kyogre),\n    SPECIES_SHINY_PAL(GROUDON, gMonShinyPalette_Groudon),\n    SPECIES_SHINY_PAL(RAYQUAZA, gMonShinyPalette_Rayquaza),\n    SPECIES_SHINY_PAL(LATIAS, gMonShinyPalette_Latias),\n    SPECIES_SHINY_PAL(LATIOS, gMonShinyPalette_Latios),\n    SPECIES_SHINY_PAL(JIRACHI, gMonShinyPalette_Jirachi),\n    SPECIES_SHINY_PAL(DEOXYS, gMonShinyPalette_Deoxys),\n    SPECIES_SHINY_PAL(CHIMECHO, gMonShinyPalette_Chimecho),\n    SPECIES_SHINY_PAL(EGG, gMonPalette_Egg),\n    SPECIES_SHINY_PAL(UNOWN_B, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_C, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_D, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_E, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_F, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_G, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_H, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_I, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_J, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_K, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_L, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_M, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_N, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_O, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_P, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_Q, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_R, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_S, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_T, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_U, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_V, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_W, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_X, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_Y, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_Z, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_EMARK, gMonShinyPalette_Unown),\n    SPECIES_SHINY_PAL(UNOWN_QMARK, gMonShinyPalette_Unown),\n};\n"
  },
  {
    "path": "src/data/region_map/region_map_layout_kanto.h",
    "content": "static const u8 sRegionMapSections_Kanto[LAYER_COUNT][MAP_HEIGHT][MAP_WIDTH] = {\n    [LAYER_MAP] =\n    {\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_24, MAPSEC_ROUTE_25, MAPSEC_ROUTE_25, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_24, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_INDIGO_PLATEAU, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_4_POKECENTER, MAPSEC_ROUTE_4, MAPSEC_ROUTE_4, MAPSEC_ROUTE_4, MAPSEC_ROUTE_4, MAPSEC_ROUTE_4, MAPSEC_CERULEAN_CITY, MAPSEC_ROUTE_9, MAPSEC_ROUTE_9, MAPSEC_ROUTE_9, MAPSEC_ROUTE_10_POKECENTER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_23, MAPSEC_NONE, MAPSEC_PEWTER_CITY, MAPSEC_ROUTE_3, MAPSEC_ROUTE_3, MAPSEC_ROUTE_3, MAPSEC_ROUTE_3, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_5, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_10, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_23, MAPSEC_NONE, MAPSEC_ROUTE_2, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_5, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_10, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_23, MAPSEC_NONE, MAPSEC_ROUTE_2, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_16, MAPSEC_ROUTE_16, MAPSEC_ROUTE_16, MAPSEC_ROUTE_16, MAPSEC_CELADON_CITY, MAPSEC_ROUTE_7, MAPSEC_ROUTE_7, MAPSEC_SAFFRON_CITY, MAPSEC_ROUTE_8, MAPSEC_ROUTE_8, MAPSEC_ROUTE_8, MAPSEC_LAVENDER_TOWN, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_23, MAPSEC_NONE, MAPSEC_ROUTE_2, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_6, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_22, MAPSEC_ROUTE_22, MAPSEC_VIRIDIAN_CITY, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_6, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_1, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_VERMILION_CITY, MAPSEC_ROUTE_11, MAPSEC_ROUTE_11, MAPSEC_ROUTE_11, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_1, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_PALLET_TOWN, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_14, MAPSEC_ROUTE_13, MAPSEC_ROUTE_13, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_21, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_18, MAPSEC_ROUTE_18, MAPSEC_ROUTE_18, MAPSEC_ROUTE_18, MAPSEC_ROUTE_18, MAPSEC_FUCHSIA_CITY, MAPSEC_ROUTE_15, MAPSEC_ROUTE_15, MAPSEC_ROUTE_14, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_21, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_19, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CINNABAR_ISLAND, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_19, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n    },\n    [LAYER_DUNGEON] =\n    {\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MT_MOON, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CERULEAN_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROCK_TUNNEL, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KANTO_VICTORY_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_POWER_PLANT, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_DIGLETTS_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_VIRIDIAN_FOREST, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_POKEMON_TOWER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_DIGLETTS_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KANTO_SAFARI_ZONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_POKEMON_MANSION, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SEAFOAM_ISLANDS, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n    }\n};\n"
  },
  {
    "path": "src/data/region_map/region_map_layout_sevii_123.h",
    "content": "static const u8 sRegionMapSections_Sevii123[LAYER_COUNT][MAP_HEIGHT][MAP_WIDTH] = {\n    [LAYER_MAP] =\n    {\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CAPE_BRINK, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_ONE_ISLAND, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CAPE_BRINK, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_TREASURE_BEACH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TWO_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_TREASURE_BEACH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_BOND_BRIDGE, MAPSEC_BOND_BRIDGE, MAPSEC_BOND_BRIDGE, MAPSEC_BOND_BRIDGE, MAPSEC_THREE_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_THREE_ISLE_PORT, MAPSEC_THREE_ISLE_PORT, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}\n    }, \n    [LAYER_DUNGEON] =\n    {\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MT_EMBER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_BERRY_FOREST, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}\n    }\n};\n"
  },
  {
    "path": "src/data/region_map/region_map_layout_sevii_45.h",
    "content": "static const u8 sRegionMapSections_Sevii45[LAYER_COUNT][MAP_HEIGHT][MAP_WIDTH] = {\n    [LAYER_MAP] =\n    {\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_FOUR_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NAVEL_ROCK, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_RESORT_GORGEOUS, MAPSEC_RESORT_GORGEOUS, MAPSEC_RESORT_GORGEOUS, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_WATER_LABYRINTH, MAPSEC_WATER_LABYRINTH, MAPSEC_WATER_LABYRINTH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_FIVE_ISLAND, MAPSEC_FIVE_ISLE_MEADOW, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_FIVE_ISLE_MEADOW, MAPSEC_MEMORIAL_PILLAR, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MEMORIAL_PILLAR, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MEMORIAL_PILLAR, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}\n    }, \n    [LAYER_DUNGEON] =\n    {\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ICEFALL_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_LOST_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}\n    }\n};\n"
  },
  {
    "path": "src/data/region_map/region_map_layout_sevii_67.h",
    "content": "static const u8 sRegionMapSections_Sevii67[LAYER_COUNT][MAP_HEIGHT][MAP_WIDTH] = {\n    [LAYER_MAP] =\n    {\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_OUTCAST_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_OUTCAST_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_OUTCAST_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_GREEN_PATH, MAPSEC_GREEN_PATH, MAPSEC_GREEN_PATH, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SIX_ISLAND, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TRAINER_TOWER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TRAINER_TOWER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_RUIN_VALLEY, MAPSEC_RUIN_VALLEY, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SEVEN_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_RUIN_VALLEY, MAPSEC_RUIN_VALLEY, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CANYON_ENTRANCE, MAPSEC_SEVAULT_CANYON, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SEVAULT_CANYON, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SEVAULT_CANYON, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_BIRTH_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}\n    }, \n    [LAYER_DUNGEON] =\n    {\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ALTERING_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_PATTERN_BUSH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_DOTTED_HOLE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TANOBY_CHAMBERS, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},\n        {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}\n    }\n};\n"
  },
  {
    "path": "src/data/region_map/region_map_sections.entries.json.txt",
    "content": "{{ doNotModifyHeader }}\n#ifndef GUARD_DATA_REGION_MAP_REGION_MAP_ENTRIES_H\n#define GUARD_DATA_REGION_MAP_REGION_MAP_ENTRIES_H\n\n## for map_section in map_sections\n{% if isEmptyString(getVar(map_section.name)) and not existsIn(map_section, \"name_clone\") %}{{ setVar(map_section.name, map_section.map_section) }}{% endif %}\n## endfor\n\nstatic const u8 *const sMapNames[] = {\n## for map_section in map_sections\n    [{{ map_section.map_section }}] = sMapsecName_{{ cleanString(map_section.name) }}{% if existsIn(map_section, \"name_clone\") %}_Clone{% endif %},\n## endfor\n};\n\nstatic const u16 sMapSectionTopLeftCorners[MAPSEC_COUNT][2] = {\n## for map_section in map_sections\n    [{{ map_section.map_section }}] = { {{ map_section.x }}, {{ map_section.y }} },\n## endfor\n};\n\nstatic const u16 sMapSectionDimensions[MAPSEC_COUNT][2] = {\n## for map_section in map_sections\n    [{{ map_section.map_section }}] = { {{ map_section.width }}, {{ map_section.height }} },\n## endfor\n};\n\n#endif // GUARD_DATA_REGION_MAP_REGION_MAP_ENTRIES_H\n"
  },
  {
    "path": "src/data/region_map/region_map_sections.json",
    "content": "{\n  \"map_sections\": [\n    {\n      \"map_section\": \"MAPSEC_LITTLEROOT_TOWN\",\n      \"name\": \"LITTLEROOT TOWN\",\n      \"x\": 4,\n      \"y\": 11,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_OLDALE_TOWN\",\n      \"name\": \"OLDALE TOWN\",\n      \"x\": 4,\n      \"y\": 9,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_DEWFORD_TOWN\",\n      \"name\": \"DEWFORD TOWN\",\n      \"x\": 2,\n      \"y\": 14,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_LAVARIDGE_TOWN\",\n      \"name\": \"LAVARIDGE TOWN\",\n      \"x\": 5,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_FALLARBOR_TOWN\",\n      \"name\": \"FALLARBOR TOWN\",\n      \"x\": 3,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_VERDANTURF_TOWN\",\n      \"name\": \"VERDANTURF TOWN\",\n      \"x\": 4,\n      \"y\": 6,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_PACIFIDLOG_TOWN\",\n      \"name\": \"PACIFIDLOG TOWN\",\n      \"x\": 17,\n      \"y\": 10,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_PETALBURG_CITY\",\n      \"name\": \"PETALBURG CITY\",\n      \"x\": 1,\n      \"y\": 9,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SLATEPORT_CITY\",\n      \"name\": \"SLATEPORT CITY\",\n      \"x\": 8,\n      \"y\": 10,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_MAUVILLE_CITY\",\n      \"name\": \"MAUVILLE CITY\",\n      \"x\": 8,\n      \"y\": 6,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_RUSTBORO_CITY\",\n      \"name\": \"RUSTBORO CITY\",\n      \"x\": 0,\n      \"y\": 5,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_FORTREE_CITY\",\n      \"name\": \"FORTREE CITY\",\n      \"x\": 12,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_LILYCOVE_CITY\",\n      \"name\": \"LILYCOVE CITY\",\n      \"x\": 18,\n      \"y\": 3,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_MOSSDEEP_CITY\",\n      \"name\": \"MOSSDEEP CITY\",\n      \"x\": 24,\n      \"y\": 5,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SOOTOPOLIS_CITY\",\n      \"name\": \"SOOTOPOLIS CITY\",\n      \"x\": 21,\n      \"y\": 7,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_EVER_GRANDE_CITY\",\n      \"name\": \"EVER GRANDE CITY\",\n      \"x\": 27,\n      \"y\": 8,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_101\",\n      \"name\": \"ROUTE 101\",\n      \"x\": 4,\n      \"y\": 10,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_102\",\n      \"name\": \"ROUTE 102\",\n      \"x\": 2,\n      \"y\": 9,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_103\",\n      \"name\": \"ROUTE 103\",\n      \"x\": 4,\n      \"y\": 8,\n      \"width\": 4,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_104\",\n      \"name\": \"ROUTE 104\",\n      \"x\": 0,\n      \"y\": 7,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_105\",\n      \"name\": \"ROUTE 105\",\n      \"x\": 0,\n      \"y\": 10,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_106\",\n      \"name\": \"ROUTE 106\",\n      \"x\": 0,\n      \"y\": 13,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_107\",\n      \"name\": \"ROUTE 107\",\n      \"x\": 3,\n      \"y\": 14,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_108\",\n      \"name\": \"ROUTE 108\",\n      \"x\": 6,\n      \"y\": 14,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_109\",\n      \"name\": \"ROUTE 109\",\n      \"x\": 8,\n      \"y\": 12,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_110\",\n      \"name\": \"ROUTE 110\",\n      \"x\": 8,\n      \"y\": 7,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_111\",\n      \"name\": \"ROUTE 111\",\n      \"x\": 8,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 6\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_112\",\n      \"name\": \"ROUTE 112\",\n      \"x\": 6,\n      \"y\": 3,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_113\",\n      \"name\": \"ROUTE 113\",\n      \"x\": 4,\n      \"y\": 0,\n      \"width\": 4,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_114\",\n      \"name\": \"ROUTE 114\",\n      \"x\": 1,\n      \"y\": 0,\n      \"width\": 2,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_115\",\n      \"name\": \"ROUTE 115\",\n      \"x\": 0,\n      \"y\": 2,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_116\",\n      \"name\": \"ROUTE 116\",\n      \"x\": 1,\n      \"y\": 5,\n      \"width\": 4,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_117\",\n      \"name\": \"ROUTE 117\",\n      \"x\": 5,\n      \"y\": 6,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_118\",\n      \"name\": \"ROUTE 118\",\n      \"x\": 10,\n      \"y\": 6,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_119\",\n      \"name\": \"ROUTE 119\",\n      \"x\": 11,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 6\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_120\",\n      \"name\": \"ROUTE 120\",\n      \"x\": 13,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 4\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_121\",\n      \"name\": \"ROUTE 121\",\n      \"x\": 14,\n      \"y\": 3,\n      \"width\": 4,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_122\",\n      \"name\": \"ROUTE 122\",\n      \"x\": 16,\n      \"y\": 4,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_123\",\n      \"name\": \"ROUTE 123\",\n      \"x\": 12,\n      \"y\": 6,\n      \"width\": 5,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_124\",\n      \"name\": \"ROUTE 124\",\n      \"x\": 20,\n      \"y\": 3,\n      \"width\": 4,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_125\",\n      \"name\": \"ROUTE 125\",\n      \"x\": 24,\n      \"y\": 3,\n      \"width\": 2,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_126\",\n      \"name\": \"ROUTE 126\",\n      \"x\": 20,\n      \"y\": 6,\n      \"width\": 3,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_127\",\n      \"name\": \"ROUTE 127\",\n      \"x\": 23,\n      \"y\": 6,\n      \"width\": 3,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_128\",\n      \"name\": \"ROUTE 128\",\n      \"x\": 23,\n      \"y\": 9,\n      \"width\": 4,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_129\",\n      \"name\": \"ROUTE 129\",\n      \"x\": 24,\n      \"y\": 10,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_130\",\n      \"name\": \"ROUTE 130\",\n      \"x\": 21,\n      \"y\": 10,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_131\",\n      \"name\": \"ROUTE 131\",\n      \"x\": 18,\n      \"y\": 10,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_132\",\n      \"name\": \"ROUTE 132\",\n      \"x\": 15,\n      \"y\": 10,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_133\",\n      \"name\": \"ROUTE 133\",\n      \"x\": 12,\n      \"y\": 10,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_134\",\n      \"name\": \"ROUTE 134\",\n      \"x\": 9,\n      \"y\": 10,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERWATER_124\",\n      \"name\": \"UNDERWATER\",\n      \"x\": 13,\n      \"y\": 12,\n      \"width\": 4,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERWATER_126\",\n      \"name\": \"UNDERWATER\",\n      \"x\": 20,\n      \"y\": 6,\n      \"width\": 3,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERWATER_127\",\n      \"name\": \"UNDERWATER\",\n      \"x\": 23,\n      \"y\": 6,\n      \"width\": 3,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERWATER_128\",\n      \"name\": \"UNDERWATER\",\n      \"x\": 23,\n      \"y\": 9,\n      \"width\": 4,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERWATER_SOOTOPOLIS\",\n      \"name\": \"UNDERWATER\",\n      \"x\": 21,\n      \"y\": 7,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_GRANITE_CAVE\",\n      \"name\": \"GRANITE CAVE\",\n      \"x\": 1,\n      \"y\": 13,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_MT_CHIMNEY\",\n      \"name\": \"MT. CHIMNEY\",\n      \"x\": 6,\n      \"y\": 2,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SAFARI_ZONE\",\n      \"name\": \"SAFARI ZONE\",\n      \"x\": 16,\n      \"y\": 2,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_BATTLE_FRONTIER\",\n      \"name\": \"BATTLE FRONTIER\",\n      \"x\": 22,\n      \"y\": 12,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_PETALBURG_WOODS\",\n      \"name\": \"PETALBURG WOODS\",\n      \"x\": 0,\n      \"y\": 8,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_RUSTURF_TUNNEL\",\n      \"name\": \"RUSTURF TUNNEL\",\n      \"x\": 2,\n      \"y\": 5,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ABANDONED_SHIP\",\n      \"name\": \"ABANDONED SHIP\",\n      \"x\": 6,\n      \"y\": 14,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_NEW_MAUVILLE\",\n      \"name\": \"NEW MAUVILLE\",\n      \"x\": 8,\n      \"y\": 7,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_METEOR_FALLS\",\n      \"name\": \"METEOR FALLS\",\n      \"x\": 0,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_METEOR_FALLS2\",\n      \"name\": \"METEOR FALLS\",\n      \"x\": 1,\n      \"y\": 2,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_MT_PYRE\",\n      \"name\": \"MT. PYRE\",\n      \"x\": 16,\n      \"y\": 4,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_AQUA_HIDEOUT_OLD\",\n      \"name\": \"HIDEOUT\",\n      \"name_clone\": true,\n      \"x\": 19,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SHOAL_CAVE\",\n      \"name\": \"SHOAL CAVE\",\n      \"x\": 24,\n      \"y\": 4,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SEAFLOOR_CAVERN\",\n      \"name\": \"SEAFLOOR CAVERN\",\n      \"x\": 24,\n      \"y\": 9,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERWATER_SEAFLOOR_CAVERN\",\n      \"name\": \"UNDERWATER\",\n      \"x\": 24,\n      \"y\": 9,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_VICTORY_ROAD\",\n      \"name\": \"VICTORY ROAD\",\n      \"x\": 27,\n      \"y\": 9,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_MIRAGE_ISLAND\",\n      \"name\": \"MIRAGE ISLAND\",\n      \"x\": 17,\n      \"y\": 10,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_CAVE_OF_ORIGIN\",\n      \"name\": \"CAVE OF ORIGIN\",\n      \"x\": 21,\n      \"y\": 7,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SOUTHERN_ISLAND\",\n      \"name\": \"SOUTHERN ISLAND\",\n      \"x\": 12,\n      \"y\": 14,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_FIERY_PATH\",\n      \"name\": \"FIERY PATH\",\n      \"x\": 6,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_FIERY_PATH2\",\n      \"name\": \"FIERY PATH\",\n      \"x\": 7,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_JAGGED_PASS\",\n      \"name\": \"JAGGED PASS\",\n      \"x\": 6,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_JAGGED_PASS2\",\n      \"name\": \"JAGGED PASS\",\n      \"x\": 7,\n      \"y\": 2,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SEALED_CHAMBER\",\n      \"name\": \"SEALED CHAMBER\",\n      \"x\": 11,\n      \"y\": 10,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERWATER_SEALED_CHAMBER\",\n      \"name\": \"UNDERWATER\",\n      \"x\": 11,\n      \"y\": 10,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SCORCHED_SLAB\",\n      \"name\": \"SCORCHED SLAB\",\n      \"x\": 13,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ISLAND_CAVE\",\n      \"name\": \"ISLAND CAVE\",\n      \"x\": 0,\n      \"y\": 10,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_DESERT_RUINS\",\n      \"name\": \"DESERT RUINS\",\n      \"x\": 8,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ANCIENT_TOMB\",\n      \"name\": \"ANCIENT TOMB\",\n      \"x\": 13,\n      \"y\": 2,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_INSIDE_OF_TRUCK\",\n      \"name\": \"INSIDE OF TRUCK\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SKY_PILLAR\",\n      \"name\": \"SKY PILLAR\",\n      \"x\": 19,\n      \"y\": 10,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SECRET_BASE\",\n      \"name\": \"SECRET BASE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_DYNAMIC\",\n      \"name\": \"FERRY\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_PALLET_TOWN\",\n      \"name\": \"PALLET TOWN\",\n      \"x\": 4,\n      \"y\": 11,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_VIRIDIAN_CITY\",\n      \"name\": \"VIRIDIAN CITY\",\n      \"x\": 4,\n      \"y\": 8,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_PEWTER_CITY\",\n      \"name\": \"PEWTER CITY\",\n      \"x\": 4,\n      \"y\": 4,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_CERULEAN_CITY\",\n      \"name\": \"CERULEAN CITY\",\n      \"x\": 14,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_LAVENDER_TOWN\",\n      \"name\": \"LAVENDER TOWN\",\n      \"x\": 18,\n      \"y\": 6,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_VERMILION_CITY\",\n      \"name\": \"VERMILION CITY\",\n      \"x\": 14,\n      \"y\": 9,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_CELADON_CITY\",\n      \"name\": \"CELADON CITY\",\n      \"x\": 11,\n      \"y\": 6,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_FUCHSIA_CITY\",\n      \"name\": \"FUCHSIA CITY\",\n      \"x\": 12,\n      \"y\": 12,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_CINNABAR_ISLAND\",\n      \"name\": \"CINNABAR ISLAND\",\n      \"x\": 4,\n      \"y\": 14,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_INDIGO_PLATEAU\",\n      \"name\": \"INDIGO PLATEAU\",\n      \"x\": 2,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SAFFRON_CITY\",\n      \"name\": \"SAFFRON CITY\",\n      \"x\": 14,\n      \"y\": 6,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_4_POKECENTER\",\n      \"name\": \"ROUTE 4\",\n      \"name_clone\": true,\n      \"x\": 8,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_10_POKECENTER\",\n      \"name\": \"ROUTE 10\",\n      \"name_clone\": true,\n      \"x\": 18,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_1\",\n      \"name\": \"ROUTE 1\",\n      \"x\": 4,\n      \"y\": 9,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_2\",\n      \"name\": \"ROUTE 2\",\n      \"x\": 4,\n      \"y\": 5,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_3\",\n      \"name\": \"ROUTE 3\",\n      \"x\": 5,\n      \"y\": 4,\n      \"width\": 4,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_4\",\n      \"name\": \"ROUTE 4\",\n      \"x\": 8,\n      \"y\": 3,\n      \"width\": 6,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_5\",\n      \"name\": \"ROUTE 5\",\n      \"x\": 14,\n      \"y\": 4,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_6\",\n      \"name\": \"ROUTE 6\",\n      \"x\": 14,\n      \"y\": 7,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_7\",\n      \"name\": \"ROUTE 7\",\n      \"x\": 12,\n      \"y\": 6,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_8\",\n      \"name\": \"ROUTE 8\",\n      \"x\": 15,\n      \"y\": 6,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_9\",\n      \"name\": \"ROUTE 9\",\n      \"x\": 15,\n      \"y\": 3,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_10\",\n      \"name\": \"ROUTE 10\",\n      \"x\": 18,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_11\",\n      \"name\": \"ROUTE 11\",\n      \"x\": 15,\n      \"y\": 9,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_12\",\n      \"name\": \"ROUTE 12\",\n      \"x\": 18,\n      \"y\": 7,\n      \"width\": 1,\n      \"height\": 5\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_13\",\n      \"name\": \"ROUTE 13\",\n      \"x\": 16,\n      \"y\": 11,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_14\",\n      \"name\": \"ROUTE 14\",\n      \"x\": 15,\n      \"y\": 11,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_15\",\n      \"name\": \"ROUTE 15\",\n      \"x\": 13,\n      \"y\": 12,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_16\",\n      \"name\": \"ROUTE 16\",\n      \"x\": 7,\n      \"y\": 6,\n      \"width\": 4,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_17\",\n      \"name\": \"ROUTE 17\",\n      \"x\": 7,\n      \"y\": 7,\n      \"width\": 1,\n      \"height\": 5\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_18\",\n      \"name\": \"ROUTE 18\",\n      \"x\": 7,\n      \"y\": 12,\n      \"width\": 5,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_19\",\n      \"name\": \"ROUTE 19\",\n      \"x\": 12,\n      \"y\": 13,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_20\",\n      \"name\": \"ROUTE 20\",\n      \"x\": 5,\n      \"y\": 14,\n      \"width\": 7,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_21\",\n      \"name\": \"ROUTE 21\",\n      \"x\": 4,\n      \"y\": 12,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_22\",\n      \"name\": \"ROUTE 22\",\n      \"x\": 2,\n      \"y\": 8,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_23\",\n      \"name\": \"ROUTE 23\",\n      \"x\": 2,\n      \"y\": 4,\n      \"width\": 1,\n      \"height\": 4\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_24\",\n      \"name\": \"ROUTE 24\",\n      \"x\": 14,\n      \"y\": 1,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_ROUTE_25\",\n      \"name\": \"ROUTE 25\",\n      \"x\": 15,\n      \"y\": 1,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_VIRIDIAN_FOREST\",\n      \"name\": \"VIRIDIAN FOREST\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_MT_MOON\",\n      \"name\": \"MT. MOON\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_S_S_ANNE\",\n      \"name\": \"S.S. ANNE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERGROUND_PATH\",\n      \"name\": \"UNDERGROUND PATH\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERGROUND_PATH_2\",\n      \"name\": \"UNDERGROUND PATH\",\n      \"name_clone\": true,\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_DIGLETTS_CAVE\",\n      \"name\": \"DIGLETT'S CAVE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_KANTO_VICTORY_ROAD\",\n      \"name\": \"VICTORY ROAD\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROCKET_HIDEOUT\",\n      \"name\": \"ROCKET HIDEOUT\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SILPH_CO\",\n      \"name\": \"SILPH CO.\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_POKEMON_MANSION\",\n      \"name\": \"POKéMON MANSION\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_KANTO_SAFARI_ZONE\",\n      \"name\": \"SAFARI ZONE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_POKEMON_LEAGUE\",\n      \"name\": \"POKéMON LEAGUE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROCK_TUNNEL\",\n      \"name\": \"ROCK TUNNEL\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SEAFOAM_ISLANDS\",\n      \"name\": \"SEAFOAM ISLANDS\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_POKEMON_TOWER\",\n      \"name\": \"POKéMON TOWER\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_CERULEAN_CAVE\",\n      \"name\": \"CERULEAN CAVE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_POWER_PLANT\",\n      \"name\": \"POWER PLANT\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ONE_ISLAND\",\n      \"name\": \"ONE ISLAND\",\n      \"x\": 1,\n      \"y\": 8,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_TWO_ISLAND\",\n      \"name\": \"TWO ISLAND\",\n      \"x\": 9,\n      \"y\": 9,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_THREE_ISLAND\",\n      \"name\": \"THREE ISLAND\",\n      \"x\": 18,\n      \"y\": 12,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_FOUR_ISLAND\",\n      \"name\": \"FOUR ISLAND\",\n      \"x\": 3,\n      \"y\": 4,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_FIVE_ISLAND\",\n      \"name\": \"FIVE ISLAND\",\n      \"x\": 16,\n      \"y\": 11,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SEVEN_ISLAND\",\n      \"name\": \"SEVEN ISLAND\",\n      \"x\": 5,\n      \"y\": 8,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SIX_ISLAND\",\n      \"name\": \"SIX ISLAND\",\n      \"x\": 17,\n      \"y\": 5,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_KINDLE_ROAD\",\n      \"name\": \"KINDLE ROAD\",\n      \"x\": 2,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 6\n    },\n    {\n      \"map_section\": \"MAPSEC_TREASURE_BEACH\",\n      \"name\": \"TREASURE BEACH\",\n      \"x\": 1,\n      \"y\": 9,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_CAPE_BRINK\",\n      \"name\": \"CAPE BRINK\",\n      \"x\": 9,\n      \"y\": 7,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_BOND_BRIDGE\",\n      \"name\": \"BOND BRIDGE\",\n      \"x\": 13,\n      \"y\": 12,\n      \"width\": 4,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_THREE_ISLE_PORT\",\n      \"name\": \"THREE ISLE PORT\",\n      \"x\": 18,\n      \"y\": 13,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SEVII_ISLE_6\",\n      \"name\": \"SEVII ISLE 6\",\n      \"x\": 4,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SEVII_ISLE_7\",\n      \"name\": \"SEVII ISLE 7\",\n      \"x\": 5,\n      \"y\": 4,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SEVII_ISLE_8\",\n      \"name\": \"SEVII ISLE 8\",\n      \"x\": 1,\n      \"y\": 4,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SEVII_ISLE_9\",\n      \"name\": \"SEVII ISLE 9\",\n      \"x\": 4,\n      \"y\": 5,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_RESORT_GORGEOUS\",\n      \"name\": \"RESORT GORGEOUS\",\n      \"x\": 16,\n      \"y\": 9,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_WATER_LABYRINTH\",\n      \"name\": \"WATER LABYRINTH\",\n      \"x\": 14,\n      \"y\": 10,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_FIVE_ISLE_MEADOW\",\n      \"name\": \"FIVE ISLE MEADOW\",\n      \"x\": 17,\n      \"y\": 10,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_MEMORIAL_PILLAR\",\n      \"name\": \"MEMORIAL PILLAR\",\n      \"x\": 18,\n      \"y\": 12,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_OUTCAST_ISLAND\",\n      \"name\": \"OUTCAST ISLAND\",\n      \"x\": 15,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_GREEN_PATH\",\n      \"name\": \"GREEN PATH\",\n      \"x\": 15,\n      \"y\": 3,\n      \"width\": 3,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_WATER_PATH\",\n      \"name\": \"WATER PATH\",\n      \"x\": 18,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 5\n    },\n    {\n      \"map_section\": \"MAPSEC_RUIN_VALLEY\",\n      \"name\": \"RUIN VALLEY\",\n      \"x\": 16,\n      \"y\": 7,\n      \"width\": 2,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_TRAINER_TOWER\",\n      \"name\": \"TRAINER TOWER\",\n      \"x\": 5,\n      \"y\": 6,\n      \"width\": 1,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_CANYON_ENTRANCE\",\n      \"name\": \"CANYON ENTRANCE\",\n      \"x\": 5,\n      \"y\": 9,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SEVAULT_CANYON\",\n      \"name\": \"SEVAULT CANYON\",\n      \"x\": 6,\n      \"y\": 9,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_TANOBY_RUINS\",\n      \"name\": \"TANOBY RUINS\",\n      \"x\": 3,\n      \"y\": 12,\n      \"width\": 7,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SEVII_ISLE_22\",\n      \"name\": \"SEVII ISLE 22\",\n      \"x\": 9,\n      \"y\": 12,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_SEVII_ISLE_23\",\n      \"name\": \"SEVII ISLE 23\",\n      \"x\": 3,\n      \"y\": 14,\n      \"width\": 6,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SEVII_ISLE_24\",\n      \"name\": \"SEVII ISLE 24\",\n      \"x\": 2,\n      \"y\": 12,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_NAVEL_ROCK\",\n      \"name\": \"NAVEL ROCK\",\n      \"x\": 10,\n      \"y\": 8,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_MT_EMBER\",\n      \"name\": \"MT. EMBER\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_BERRY_FOREST\",\n      \"name\": \"BERRY FOREST\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ICEFALL_CAVE\",\n      \"name\": \"ICEFALL CAVE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ROCKET_WAREHOUSE\",\n      \"name\": \"ROCKET WAREHOUSE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_TRAINER_TOWER_2\",\n      \"name\": \"TRAINER TOWER\",\n      \"name_clone\": true,\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_DOTTED_HOLE\",\n      \"name\": \"DOTTED HOLE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_LOST_CAVE\",\n      \"name\": \"LOST CAVE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_PATTERN_BUSH\",\n      \"name\": \"PATTERN BUSH\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ALTERING_CAVE\",\n      \"name\": \"ALTERING CAVE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_TANOBY_CHAMBERS\",\n      \"name\": \"TANOBY CHAMBERS\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_THREE_ISLE_PATH\",\n      \"name\": \"THREE ISLE PATH\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_TANOBY_KEY\",\n      \"name\": \"TANOBY KEY\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_BIRTH_ISLAND\",\n      \"name\": \"BIRTH ISLAND\",\n      \"x\": 18,\n      \"y\": 13,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_MONEAN_CHAMBER\",\n      \"name\": \"MONEAN CHAMBER\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_LIPTOO_CHAMBER\",\n      \"name\": \"LIPTOO CHAMBER\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_WEEPTH_CHAMBER\",\n      \"name\": \"WEEPTH CHAMBER\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_DILFORD_CHAMBER\",\n      \"name\": \"DILFORD CHAMBER\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SCUFIB_CHAMBER\",\n      \"name\": \"SCUFIB CHAMBER\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_RIXY_CHAMBER\",\n      \"name\": \"RIXY CHAMBER\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_VIAPOIS_CHAMBER\",\n      \"name\": \"VIAPOIS CHAMBER\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_EMBER_SPA\",\n      \"name\": \"EMBER SPA\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_SPECIAL_AREA\",\n      \"name\": \"CELADON DEPT.\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 0,\n      \"height\": 0\n    },\n    {\n      \"map_section\": \"MAPSEC_AQUA_HIDEOUT\",\n      \"name\": \"AQUA HIDEOUT\",\n      \"x\": 19,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_MAGMA_HIDEOUT\",\n      \"name\": \"MAGMA HIDEOUT\",\n      \"x\": 6,\n      \"y\": 3,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_MIRAGE_TOWER\",\n      \"name\": \"MIRAGE TOWER\",\n      \"x\": 8,\n      \"y\": 2,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_BIRTH_ISLAND_E\",\n      \"name\": \"BIRTH ISLAND\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_FARAWAY_ISLAND\",\n      \"name\": \"FARAWAY ISLAND\",\n      \"x\": 0,\n      \"y\": 17,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ARTISAN_CAVE\",\n      \"name\": \"ARTISAN CAVE\",\n      \"x\": 22,\n      \"y\": 12,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_MARINE_CAVE\",\n      \"name\": \"MARINE CAVE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERWATER_MARINE_CAVE\",\n      \"name\": \"UNDERWATER\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_TERRA_CAVE\",\n      \"name\": \"TERRA CAVE\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERWATER_105\",\n      \"name\": \"UNDERWATER\",\n      \"x\": 0,\n      \"y\": 10,\n      \"width\": 1,\n      \"height\": 3\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERWATER_125\",\n      \"name\": \"UNDERWATER\",\n      \"x\": 24,\n      \"y\": 3,\n      \"width\": 2,\n      \"height\": 2\n    },\n    {\n      \"map_section\": \"MAPSEC_UNDERWATER_129\",\n      \"name\": \"UNDERWATER\",\n      \"x\": 24,\n      \"y\": 10,\n      \"width\": 2,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_DESERT_UNDERPASS\",\n      \"name\": \"DESERT UNDERPASS\",\n      \"x\": 2,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_ALTERING_CAVE_E\",\n      \"name\": \"ALTERING CAVE\",\n      \"x\": 6,\n      \"y\": 8,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_NAVEL_ROCK_E\",\n      \"name\": \"NAVEL ROCK\",\n      \"x\": 0,\n      \"y\": 0,\n      \"width\": 1,\n      \"height\": 1\n    },\n    {\n      \"map_section\": \"MAPSEC_TRAINER_HILL\",\n      \"name\": \"TRAINER HILL\",\n      \"x\": 8,\n      \"y\": 4,\n      \"width\": 1,\n      \"height\": 1\n    }\n  ]\n}\n"
  },
  {
    "path": "src/data/region_map/region_map_sections.strings.json.txt",
    "content": "{{ doNotModifyHeader }}\n#ifndef GUARD_DATA_REGION_MAP_REGION_MAP_ENTRY_STRINGS_H\n#define GUARD_DATA_REGION_MAP_REGION_MAP_ENTRY_STRINGS_H\n\n## for map_section in map_sections\n{% if isEmptyString(getVar(map_section.name)) and not existsIn(map_section, \"name_clone\") %}{{ setVar(map_section.name, map_section.map_section) }}{% endif %}\n## endfor\n\n## for map_section in map_sections\n{% if getVar(map_section.name) == map_section.map_section %}\nstatic const u8 sMapsecName_{{ cleanString(map_section.name) }}[] = _(\"{{ map_section.name }}\");\n{% endif %}\n{% if existsIn(map_section, \"name_clone\") %}\nstatic const u8 sMapsecName_{{ cleanString(map_section.name) }}_Clone[] = _(\"{{ map_section.name }}\");\n{% endif %}\n## endfor\n\n#endif // GUARD_DATA_REGION_MAP_REGION_MAP_ENTRY_STRINGS_H\n"
  },
  {
    "path": "src/data/text/abilities.h",
    "content": "static const u8 sNoneDescription[] = _(\"No special ability.\");\nstatic const u8 sStenchDescription[] = _(\"Helps repel wild POKéMON.\");\nstatic const u8 sDrizzleDescription[] = _(\"Summons rain in battle.\");\nstatic const u8 sSpeedBoostDescription[] = _(\"Gradually boosts SPEED.\");\nstatic const u8 sBattleArmorDescription[] = _(\"Blocks critical hits.\");\nstatic const u8 sSturdyDescription[] = _(\"Negates 1-hit KO attacks.\");\nstatic const u8 sDampDescription[] = _(\"Prevents self-destruction.\");\nstatic const u8 sLimberDescription[] = _(\"Prevents paralysis.\");\nstatic const u8 sSandVeilDescription[] = _(\"Ups evasion in a sandstorm.\");\nstatic const u8 sStaticDescription[] = _(\"Paralyzes on contact.\");\nstatic const u8 sVoltAbsorbDescription[] = _(\"Turns electricity into HP.\");\nstatic const u8 sWaterAbsorbDescription[] = _(\"Changes water into HP.\");\nstatic const u8 sObliviousDescription[] = _(\"Prevents attraction.\");\nstatic const u8 sCloudNineDescription[] = _(\"Negates weather effects.\");\nstatic const u8 sCompoundEyesDescription[] = _(\"Raises accuracy.\");\nstatic const u8 sInsomniaDescription[] = _(\"Prevents sleep.\");\nstatic const u8 sColorChangeDescription[] = _(\"Changes type to foe's move.\");\nstatic const u8 sImmunityDescription[] = _(\"Prevents poisoning.\");\nstatic const u8 sFlashFireDescription[] = _(\"Powers up if hit by fire.\");\nstatic const u8 sShieldDustDescription[] = _(\"Prevents added effects.\");\nstatic const u8 sOwnTempoDescription[] = _(\"Prevents confusion.\");\nstatic const u8 sSuctionCupsDescription[] = _(\"Firmly anchors the body.\");\nstatic const u8 sIntimidateDescription[] = _(\"Lowers the foe's ATTACK.\");\nstatic const u8 sShadowTagDescription[] = _(\"Prevents the foe's escape.\");\nstatic const u8 sRoughSkinDescription[] = _(\"Hurts to touch.\");\nstatic const u8 sWonderGuardDescription[] = _(\"“Super effective” hits.\");\nstatic const u8 sLevitateDescription[] = _(\"Not hit by GROUND attacks.\");\nstatic const u8 sEffectSporeDescription[] = _(\"Leaves spores on contact.\");\nstatic const u8 sSynchronizeDescription[] = _(\"Passes on status problems.\");\nstatic const u8 sClearBodyDescription[] = _(\"Prevents ability reduction.\");\nstatic const u8 sNaturalCureDescription[] = _(\"Heals upon switching out.\");\nstatic const u8 sLightningRodDescription[] = _(\"Draws electrical moves.\");\nstatic const u8 sSereneGraceDescription[] = _(\"Promotes added effects.\");\nstatic const u8 sSwiftSwimDescription[] = _(\"Raises SPEED in rain.\");\nstatic const u8 sChlorophyllDescription[] = _(\"Raises SPEED in sunshine.\");\nstatic const u8 sIlluminateDescription[] = _(\"Encounter rate increases.\");\nstatic const u8 sTraceDescription[] = _(\"Copies special ability.\");\nstatic const u8 sHugePowerDescription[] = _(\"Raises ATTACK.\");\nstatic const u8 sPoisonPointDescription[] = _(\"Poisons foe on contact.\");\nstatic const u8 sInnerFocusDescription[] = _(\"Prevents flinching.\");\nstatic const u8 sMagmaArmorDescription[] = _(\"Prevents freezing.\");\nstatic const u8 sWaterVeilDescription[] = _(\"Prevents burns.\");\nstatic const u8 sMagnetPullDescription[] = _(\"Traps STEEL-type POKéMON.\");\nstatic const u8 sSoundproofDescription[] = _(\"Avoids sound-based moves.\");\nstatic const u8 sRainDishDescription[] = _(\"Slight HP recovery in rain.\");\nstatic const u8 sSandStreamDescription[] = _(\"Summons a sandstorm.\");\nstatic const u8 sPressureDescription[] = _(\"Raises foe's PP usage.\");\nstatic const u8 sThickFatDescription[] = _(\"Heat-and-cold protection.\");\nstatic const u8 sEarlyBirdDescription[] = _(\"Awakens quickly from sleep.\");\nstatic const u8 sFlameBodyDescription[] = _(\"Burns the foe on contact.\");\nstatic const u8 sRunAwayDescription[] = _(\"Makes escaping easier.\");\nstatic const u8 sKeenEyeDescription[] = _(\"Prevents loss of accuracy.\");\nstatic const u8 sHyperCutterDescription[] = _(\"Prevents ATTACK reduction.\");\nstatic const u8 sPickupDescription[] = _(\"May pick up items.\");\nstatic const u8 sTruantDescription[] = _(\"Moves only every two turns.\");\nstatic const u8 sHustleDescription[] = _(\"Trades accuracy for power.\");\nstatic const u8 sCuteCharmDescription[] = _(\"Infatuates on contact.\");\nstatic const u8 sPlusDescription[] = _(\"Powers up with MINUS.\");\nstatic const u8 sMinusDescription[] = _(\"Powers up with PLUS.\");\nstatic const u8 sForecastDescription[] = _(\"Changes with the weather.\");\nstatic const u8 sStickyHoldDescription[] = _(\"Prevents item theft.\");\nstatic const u8 sShedSkinDescription[] = _(\"Heals the body by shedding.\");\nstatic const u8 sGutsDescription[] = _(\"Ups ATTACK if suffering.\");\nstatic const u8 sMarvelScaleDescription[] = _(\"Ups DEFENSE if suffering.\");\nstatic const u8 sLiquidOozeDescription[] = _(\"Draining causes injury.\");\nstatic const u8 sOvergrowDescription[] = _(\"Ups GRASS moves in a pinch.\");\nstatic const u8 sBlazeDescription[] = _(\"Ups FIRE moves in a pinch.\");\nstatic const u8 sTorrentDescription[] = _(\"Ups WATER moves in a pinch.\");\nstatic const u8 sSwarmDescription[] = _(\"Ups BUG moves in a pinch.\");\nstatic const u8 sRockHeadDescription[] = _(\"Prevents recoil damage.\");\nstatic const u8 sDroughtDescription[] = _(\"Summons sunlight in battle.\");\nstatic const u8 sArenaTrapDescription[] = _(\"Prevents fleeing.\");\nstatic const u8 sVitalSpiritDescription[] = _(\"Prevents sleep.\");\nstatic const u8 sWhiteSmokeDescription[] = _(\"Prevents ability reduction.\");\nstatic const u8 sPurePowerDescription[] = _(\"Raises ATTACK.\");\nstatic const u8 sShellArmorDescription[] = _(\"Blocks critical hits.\");\nstatic const u8 sCacophonyDescription[] = _(\"Avoids sound-based moves.\");\nstatic const u8 sAirLockDescription[] = _(\"Negates weather effects.\");\n\nconst u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT] =\n{\n    [ABILITY_NONE] = sNoneDescription,\n    [ABILITY_STENCH] = sStenchDescription,\n    [ABILITY_DRIZZLE] = sDrizzleDescription,\n    [ABILITY_SPEED_BOOST] = sSpeedBoostDescription,\n    [ABILITY_BATTLE_ARMOR] = sBattleArmorDescription,\n    [ABILITY_STURDY] = sSturdyDescription,\n    [ABILITY_DAMP] = sDampDescription,\n    [ABILITY_LIMBER] = sLimberDescription,\n    [ABILITY_SAND_VEIL] = sSandVeilDescription,\n    [ABILITY_STATIC] = sStaticDescription,\n    [ABILITY_VOLT_ABSORB] = sVoltAbsorbDescription,\n    [ABILITY_WATER_ABSORB] = sWaterAbsorbDescription,\n    [ABILITY_OBLIVIOUS] = sObliviousDescription,\n    [ABILITY_CLOUD_NINE] = sCloudNineDescription,\n    [ABILITY_COMPOUND_EYES] = sCompoundEyesDescription,\n    [ABILITY_INSOMNIA] = sInsomniaDescription,\n    [ABILITY_COLOR_CHANGE] = sColorChangeDescription,\n    [ABILITY_IMMUNITY] = sImmunityDescription,\n    [ABILITY_FLASH_FIRE] = sFlashFireDescription,\n    [ABILITY_SHIELD_DUST] = sShieldDustDescription,\n    [ABILITY_OWN_TEMPO] = sOwnTempoDescription,\n    [ABILITY_SUCTION_CUPS] = sSuctionCupsDescription,\n    [ABILITY_INTIMIDATE] = sIntimidateDescription,\n    [ABILITY_SHADOW_TAG] = sShadowTagDescription,\n    [ABILITY_ROUGH_SKIN] = sRoughSkinDescription,\n    [ABILITY_WONDER_GUARD] = sWonderGuardDescription,\n    [ABILITY_LEVITATE] = sLevitateDescription,\n    [ABILITY_EFFECT_SPORE] = sEffectSporeDescription,\n    [ABILITY_SYNCHRONIZE] = sSynchronizeDescription,\n    [ABILITY_CLEAR_BODY] = sClearBodyDescription,\n    [ABILITY_NATURAL_CURE] = sNaturalCureDescription,\n    [ABILITY_LIGHTNING_ROD] = sLightningRodDescription,\n    [ABILITY_SERENE_GRACE] = sSereneGraceDescription,\n    [ABILITY_SWIFT_SWIM] = sSwiftSwimDescription,\n    [ABILITY_CHLOROPHYLL] = sChlorophyllDescription,\n    [ABILITY_ILLUMINATE] = sIlluminateDescription,\n    [ABILITY_TRACE] = sTraceDescription,\n    [ABILITY_HUGE_POWER] = sHugePowerDescription,\n    [ABILITY_POISON_POINT] = sPoisonPointDescription,\n    [ABILITY_INNER_FOCUS] = sInnerFocusDescription,\n    [ABILITY_MAGMA_ARMOR] = sMagmaArmorDescription,\n    [ABILITY_WATER_VEIL] = sWaterVeilDescription,\n    [ABILITY_MAGNET_PULL] = sMagnetPullDescription,\n    [ABILITY_SOUNDPROOF] = sSoundproofDescription,\n    [ABILITY_RAIN_DISH] = sRainDishDescription,\n    [ABILITY_SAND_STREAM] = sSandStreamDescription,\n    [ABILITY_PRESSURE] = sPressureDescription,\n    [ABILITY_THICK_FAT] = sThickFatDescription,\n    [ABILITY_EARLY_BIRD] = sEarlyBirdDescription,\n    [ABILITY_FLAME_BODY] = sFlameBodyDescription,\n    [ABILITY_RUN_AWAY] = sRunAwayDescription,\n    [ABILITY_KEEN_EYE] = sKeenEyeDescription,\n    [ABILITY_HYPER_CUTTER] = sHyperCutterDescription,\n    [ABILITY_PICKUP] = sPickupDescription,\n    [ABILITY_TRUANT] = sTruantDescription,\n    [ABILITY_HUSTLE] = sHustleDescription,\n    [ABILITY_CUTE_CHARM] = sCuteCharmDescription,\n    [ABILITY_PLUS] = sPlusDescription,\n    [ABILITY_MINUS] = sMinusDescription,\n    [ABILITY_FORECAST] = sForecastDescription,\n    [ABILITY_STICKY_HOLD] = sStickyHoldDescription,\n    [ABILITY_SHED_SKIN] = sShedSkinDescription,\n    [ABILITY_GUTS] = sGutsDescription,\n    [ABILITY_MARVEL_SCALE] = sMarvelScaleDescription,\n    [ABILITY_LIQUID_OOZE] = sLiquidOozeDescription,\n    [ABILITY_OVERGROW] = sOvergrowDescription,\n    [ABILITY_BLAZE] = sBlazeDescription,\n    [ABILITY_TORRENT] = sTorrentDescription,\n    [ABILITY_SWARM] = sSwarmDescription,\n    [ABILITY_ROCK_HEAD] = sRockHeadDescription,\n    [ABILITY_DROUGHT] = sDroughtDescription,\n    [ABILITY_ARENA_TRAP] = sArenaTrapDescription,\n    [ABILITY_VITAL_SPIRIT] = sVitalSpiritDescription,\n    [ABILITY_WHITE_SMOKE] = sWhiteSmokeDescription,\n    [ABILITY_PURE_POWER] = sPurePowerDescription,\n    [ABILITY_SHELL_ARMOR] = sShellArmorDescription,\n    [ABILITY_CACOPHONY] = sCacophonyDescription,\n    [ABILITY_AIR_LOCK] = sAirLockDescription,\n};\n\nconst u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] =\n{\n    [ABILITY_NONE] = _(\"-------\"),\n    [ABILITY_STENCH] = _(\"STENCH\"),\n    [ABILITY_DRIZZLE] = _(\"DRIZZLE\"),\n    [ABILITY_SPEED_BOOST] = _(\"SPEED BOOST\"),\n    [ABILITY_BATTLE_ARMOR] = _(\"BATTLE ARMOR\"),\n    [ABILITY_STURDY] = _(\"STURDY\"),\n    [ABILITY_DAMP] = _(\"DAMP\"),\n    [ABILITY_LIMBER] = _(\"LIMBER\"),\n    [ABILITY_SAND_VEIL] = _(\"SAND VEIL\"),\n    [ABILITY_STATIC] = _(\"STATIC\"),\n    [ABILITY_VOLT_ABSORB] = _(\"VOLT ABSORB\"),\n    [ABILITY_WATER_ABSORB] = _(\"WATER ABSORB\"),\n    [ABILITY_OBLIVIOUS] = _(\"OBLIVIOUS\"),\n    [ABILITY_CLOUD_NINE] = _(\"CLOUD NINE\"),\n    [ABILITY_COMPOUND_EYES] = _(\"COMPOUNDEYES\"),\n    [ABILITY_INSOMNIA] = _(\"INSOMNIA\"),\n    [ABILITY_COLOR_CHANGE] = _(\"COLOR CHANGE\"),\n    [ABILITY_IMMUNITY] = _(\"IMMUNITY\"),\n    [ABILITY_FLASH_FIRE] = _(\"FLASH FIRE\"),\n    [ABILITY_SHIELD_DUST] = _(\"SHIELD DUST\"),\n    [ABILITY_OWN_TEMPO] = _(\"OWN TEMPO\"),\n    [ABILITY_SUCTION_CUPS] = _(\"SUCTION CUPS\"),\n    [ABILITY_INTIMIDATE] = _(\"INTIMIDATE\"),\n    [ABILITY_SHADOW_TAG] = _(\"SHADOW TAG\"),\n    [ABILITY_ROUGH_SKIN] = _(\"ROUGH SKIN\"),\n    [ABILITY_WONDER_GUARD] = _(\"WONDER GUARD\"),\n    [ABILITY_LEVITATE] = _(\"LEVITATE\"),\n    [ABILITY_EFFECT_SPORE] = _(\"EFFECT SPORE\"),\n    [ABILITY_SYNCHRONIZE] = _(\"SYNCHRONIZE\"),\n    [ABILITY_CLEAR_BODY] = _(\"CLEAR BODY\"),\n    [ABILITY_NATURAL_CURE] = _(\"NATURAL CURE\"),\n    [ABILITY_LIGHTNING_ROD] = _(\"LIGHTNINGROD\"),\n    [ABILITY_SERENE_GRACE] = _(\"SERENE GRACE\"),\n    [ABILITY_SWIFT_SWIM] = _(\"SWIFT SWIM\"),\n    [ABILITY_CHLOROPHYLL] = _(\"CHLOROPHYLL\"),\n    [ABILITY_ILLUMINATE] = _(\"ILLUMINATE\"),\n    [ABILITY_TRACE] = _(\"TRACE\"),\n    [ABILITY_HUGE_POWER] = _(\"HUGE POWER\"),\n    [ABILITY_POISON_POINT] = _(\"POISON POINT\"),\n    [ABILITY_INNER_FOCUS] = _(\"INNER FOCUS\"),\n    [ABILITY_MAGMA_ARMOR] = _(\"MAGMA ARMOR\"),\n    [ABILITY_WATER_VEIL] = _(\"WATER VEIL\"),\n    [ABILITY_MAGNET_PULL] = _(\"MAGNET PULL\"),\n    [ABILITY_SOUNDPROOF] = _(\"SOUNDPROOF\"),\n    [ABILITY_RAIN_DISH] = _(\"RAIN DISH\"),\n    [ABILITY_SAND_STREAM] = _(\"SAND STREAM\"),\n    [ABILITY_PRESSURE] = _(\"PRESSURE\"),\n    [ABILITY_THICK_FAT] = _(\"THICK FAT\"),\n    [ABILITY_EARLY_BIRD] = _(\"EARLY BIRD\"),\n    [ABILITY_FLAME_BODY] = _(\"FLAME BODY\"),\n    [ABILITY_RUN_AWAY] = _(\"RUN AWAY\"),\n    [ABILITY_KEEN_EYE] = _(\"KEEN EYE\"),\n    [ABILITY_HYPER_CUTTER] = _(\"HYPER CUTTER\"),\n    [ABILITY_PICKUP] = _(\"PICKUP\"),\n    [ABILITY_TRUANT] = _(\"TRUANT\"),\n    [ABILITY_HUSTLE] = _(\"HUSTLE\"),\n    [ABILITY_CUTE_CHARM] = _(\"CUTE CHARM\"),\n    [ABILITY_PLUS] = _(\"PLUS\"),\n    [ABILITY_MINUS] = _(\"MINUS\"),\n    [ABILITY_FORECAST] = _(\"FORECAST\"),\n    [ABILITY_STICKY_HOLD] = _(\"STICKY HOLD\"),\n    [ABILITY_SHED_SKIN] = _(\"SHED SKIN\"),\n    [ABILITY_GUTS] = _(\"GUTS\"),\n    [ABILITY_MARVEL_SCALE] = _(\"MARVEL SCALE\"),\n    [ABILITY_LIQUID_OOZE] = _(\"LIQUID OOZE\"),\n    [ABILITY_OVERGROW] = _(\"OVERGROW\"),\n    [ABILITY_BLAZE] = _(\"BLAZE\"),\n    [ABILITY_TORRENT] = _(\"TORRENT\"),\n    [ABILITY_SWARM] = _(\"SWARM\"),\n    [ABILITY_ROCK_HEAD] = _(\"ROCK HEAD\"),\n    [ABILITY_DROUGHT] = _(\"DROUGHT\"),\n    [ABILITY_ARENA_TRAP] = _(\"ARENA TRAP\"),\n    [ABILITY_VITAL_SPIRIT] = _(\"VITAL SPIRIT\"),\n    [ABILITY_WHITE_SMOKE] = _(\"WHITE SMOKE\"),\n    [ABILITY_PURE_POWER] = _(\"PURE POWER\"),\n    [ABILITY_SHELL_ARMOR] = _(\"SHELL ARMOR\"),\n    [ABILITY_CACOPHONY] = _(\"CACOPHONY\"),\n    [ABILITY_AIR_LOCK] = _(\"AIR LOCK\"),\n};\n"
  },
  {
    "path": "src/data/text/move_names.h",
    "content": "const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = {\n    [MOVE_NONE]          = _(\"-$$$$$$\"),\n    [MOVE_POUND]         = _(\"POUND\"),\n    [MOVE_KARATE_CHOP]   = _(\"KARATE CHOP\"),\n    [MOVE_DOUBLE_SLAP]   = _(\"DOUBLESLAP\"),\n    [MOVE_COMET_PUNCH]   = _(\"COMET PUNCH\"),\n    [MOVE_MEGA_PUNCH]    = _(\"MEGA PUNCH\"),\n    [MOVE_PAY_DAY]       = _(\"PAY DAY\"),\n    [MOVE_FIRE_PUNCH]    = _(\"FIRE PUNCH\"),\n    [MOVE_ICE_PUNCH]     = _(\"ICE PUNCH\"),\n    [MOVE_THUNDER_PUNCH] = _(\"THUNDERPUNCH\"),\n    [MOVE_SCRATCH]       = _(\"SCRATCH\"),\n    [MOVE_VICE_GRIP]     = _(\"VICEGRIP\"),\n    [MOVE_GUILLOTINE]    = _(\"GUILLOTINE\"),\n    [MOVE_RAZOR_WIND]    = _(\"RAZOR WIND\"),\n    [MOVE_SWORDS_DANCE]  = _(\"SWORDS DANCE\"),\n    [MOVE_CUT]           = _(\"CUT\"),\n    [MOVE_GUST]          = _(\"GUST\"),\n    [MOVE_WING_ATTACK]   = _(\"WING ATTACK\"),\n    [MOVE_WHIRLWIND]     = _(\"WHIRLWIND\"),\n    [MOVE_FLY]           = _(\"FLY\"),\n    [MOVE_BIND]          = _(\"BIND\"),\n    [MOVE_SLAM]          = _(\"SLAM\"),\n    [MOVE_VINE_WHIP]     = _(\"VINE WHIP\"),\n    [MOVE_STOMP]         = _(\"STOMP\"),\n    [MOVE_DOUBLE_KICK]   = _(\"DOUBLE KICK\"),\n    [MOVE_MEGA_KICK]     = _(\"MEGA KICK\"),\n    [MOVE_JUMP_KICK]     = _(\"JUMP KICK\"),\n    [MOVE_ROLLING_KICK]  = _(\"ROLLING KICK\"),\n    [MOVE_SAND_ATTACK]   = _(\"SAND-ATTACK\"),\n    [MOVE_HEADBUTT]      = _(\"HEADBUTT\"),\n    [MOVE_HORN_ATTACK]   = _(\"HORN ATTACK\"),\n    [MOVE_FURY_ATTACK]   = _(\"FURY ATTACK\"),\n    [MOVE_HORN_DRILL]    = _(\"HORN DRILL\"),\n    [MOVE_TACKLE]        = _(\"TACKLE\"),\n    [MOVE_BODY_SLAM]     = _(\"BODY SLAM\"),\n    [MOVE_WRAP]          = _(\"WRAP\"),\n    [MOVE_TAKE_DOWN]     = _(\"TAKE DOWN\"),\n    [MOVE_THRASH]        = _(\"THRASH\"),\n    [MOVE_DOUBLE_EDGE]   = _(\"DOUBLE-EDGE\"),\n    [MOVE_TAIL_WHIP]     = _(\"TAIL WHIP\"),\n    [MOVE_POISON_STING]  = _(\"POISON STING\"),\n    [MOVE_TWINEEDLE]     = _(\"TWINEEDLE\"),\n    [MOVE_PIN_MISSILE]   = _(\"PIN MISSILE\"),\n    [MOVE_LEER]          = _(\"LEER\"),\n    [MOVE_BITE]          = _(\"BITE\"),\n    [MOVE_GROWL]         = _(\"GROWL\"),\n    [MOVE_ROAR]          = _(\"ROAR\"),\n    [MOVE_SING]          = _(\"SING\"),\n    [MOVE_SUPERSONIC]    = _(\"SUPERSONIC\"),\n    [MOVE_SONIC_BOOM]    = _(\"SONICBOOM\"),\n    [MOVE_DISABLE]       = _(\"DISABLE\"),\n    [MOVE_ACID]          = _(\"ACID\"),\n    [MOVE_EMBER]         = _(\"EMBER\"),\n    [MOVE_FLAMETHROWER]  = _(\"FLAMETHROWER\"),\n    [MOVE_MIST]          = _(\"MIST\"),\n    [MOVE_WATER_GUN]     = _(\"WATER GUN\"),\n    [MOVE_HYDRO_PUMP]    = _(\"HYDRO PUMP\"),\n    [MOVE_SURF]          = _(\"SURF\"),\n    [MOVE_ICE_BEAM]      = _(\"ICE BEAM\"),\n    [MOVE_BLIZZARD]      = _(\"BLIZZARD\"),\n    [MOVE_PSYBEAM]       = _(\"PSYBEAM\"),\n    [MOVE_BUBBLE_BEAM]   = _(\"BUBBLEBEAM\"),\n    [MOVE_AURORA_BEAM]   = _(\"AURORA BEAM\"),\n    [MOVE_HYPER_BEAM]    = _(\"HYPER BEAM\"),\n    [MOVE_PECK]          = _(\"PECK\"),\n    [MOVE_DRILL_PECK]    = _(\"DRILL PECK\"),\n    [MOVE_SUBMISSION]    = _(\"SUBMISSION\"),\n    [MOVE_LOW_KICK]      = _(\"LOW KICK\"),\n    [MOVE_COUNTER]       = _(\"COUNTER\"),\n    [MOVE_SEISMIC_TOSS]  = _(\"SEISMIC TOSS\"),\n    [MOVE_STRENGTH]      = _(\"STRENGTH\"),\n    [MOVE_ABSORB]        = _(\"ABSORB\"),\n    [MOVE_MEGA_DRAIN]    = _(\"MEGA DRAIN\"),\n    [MOVE_LEECH_SEED]    = _(\"LEECH SEED\"),\n    [MOVE_GROWTH]        = _(\"GROWTH\"),\n    [MOVE_RAZOR_LEAF]    = _(\"RAZOR LEAF\"),\n    [MOVE_SOLAR_BEAM]    = _(\"SOLARBEAM\"),\n    [MOVE_POISON_POWDER] = _(\"POISONPOWDER\"),\n    [MOVE_STUN_SPORE]    = _(\"STUN SPORE\"),\n    [MOVE_SLEEP_POWDER]  = _(\"SLEEP POWDER\"),\n    [MOVE_PETAL_DANCE]   = _(\"PETAL DANCE\"),\n    [MOVE_STRING_SHOT]   = _(\"STRING SHOT\"),\n    [MOVE_DRAGON_RAGE]   = _(\"DRAGON RAGE\"),\n    [MOVE_FIRE_SPIN]     = _(\"FIRE SPIN\"),\n    [MOVE_THUNDER_SHOCK] = _(\"THUNDERSHOCK\"),\n    [MOVE_THUNDERBOLT]   = _(\"THUNDERBOLT\"),\n    [MOVE_THUNDER_WAVE]  = _(\"THUNDER WAVE\"),\n    [MOVE_THUNDER]       = _(\"THUNDER\"),\n    [MOVE_ROCK_THROW]    = _(\"ROCK THROW\"),\n    [MOVE_EARTHQUAKE]    = _(\"EARTHQUAKE\"),\n    [MOVE_FISSURE]       = _(\"FISSURE\"),\n    [MOVE_DIG]           = _(\"DIG\"),\n    [MOVE_TOXIC]         = _(\"TOXIC\"),\n    [MOVE_CONFUSION]     = _(\"CONFUSION\"),\n    [MOVE_PSYCHIC]       = _(\"PSYCHIC\"),\n    [MOVE_HYPNOSIS]      = _(\"HYPNOSIS\"),\n    [MOVE_MEDITATE]      = _(\"MEDITATE\"),\n    [MOVE_AGILITY]       = _(\"AGILITY\"),\n    [MOVE_QUICK_ATTACK]  = _(\"QUICK ATTACK\"),\n    [MOVE_RAGE]          = _(\"RAGE\"),\n    [MOVE_TELEPORT]      = _(\"TELEPORT\"),\n    [MOVE_NIGHT_SHADE]   = _(\"NIGHT SHADE\"),\n    [MOVE_MIMIC]         = _(\"MIMIC\"),\n    [MOVE_SCREECH]       = _(\"SCREECH\"),\n    [MOVE_DOUBLE_TEAM]   = _(\"DOUBLE TEAM\"),\n    [MOVE_RECOVER]       = _(\"RECOVER\"),\n    [MOVE_HARDEN]        = _(\"HARDEN\"),\n    [MOVE_MINIMIZE]      = _(\"MINIMIZE\"),\n    [MOVE_SMOKESCREEN]   = _(\"SMOKESCREEN\"),\n    [MOVE_CONFUSE_RAY]   = _(\"CONFUSE RAY\"),\n    [MOVE_WITHDRAW]      = _(\"WITHDRAW\"),\n    [MOVE_DEFENSE_CURL]  = _(\"DEFENSE CURL\"),\n    [MOVE_BARRIER]       = _(\"BARRIER\"),\n    [MOVE_LIGHT_SCREEN]  = _(\"LIGHT SCREEN\"),\n    [MOVE_HAZE]          = _(\"HAZE\"),\n    [MOVE_REFLECT]       = _(\"REFLECT\"),\n    [MOVE_FOCUS_ENERGY]  = _(\"FOCUS ENERGY\"),\n    [MOVE_BIDE]          = _(\"BIDE\"),\n    [MOVE_METRONOME]     = _(\"METRONOME\"),\n    [MOVE_MIRROR_MOVE]   = _(\"MIRROR MOVE\"),\n    [MOVE_SELF_DESTRUCT] = _(\"SELFDESTRUCT\"),\n    [MOVE_EGG_BOMB]      = _(\"EGG BOMB\"),\n    [MOVE_LICK]          = _(\"LICK\"),\n    [MOVE_SMOG]          = _(\"SMOG\"),\n    [MOVE_SLUDGE]        = _(\"SLUDGE\"),\n    [MOVE_BONE_CLUB]     = _(\"BONE CLUB\"),\n    [MOVE_FIRE_BLAST]    = _(\"FIRE BLAST\"),\n    [MOVE_WATERFALL]     = _(\"WATERFALL\"),\n    [MOVE_CLAMP]         = _(\"CLAMP\"),\n    [MOVE_SWIFT]         = _(\"SWIFT\"),\n    [MOVE_SKULL_BASH]    = _(\"SKULL BASH\"),\n    [MOVE_SPIKE_CANNON]  = _(\"SPIKE CANNON\"),\n    [MOVE_CONSTRICT]     = _(\"CONSTRICT\"),\n    [MOVE_AMNESIA]       = _(\"AMNESIA\"),\n    [MOVE_KINESIS]       = _(\"KINESIS\"),\n    [MOVE_SOFT_BOILED]   = _(\"SOFTBOILED\"),\n    [MOVE_HI_JUMP_KICK]  = _(\"HI JUMP KICK\"),\n    [MOVE_GLARE]         = _(\"GLARE\"),\n    [MOVE_DREAM_EATER]   = _(\"DREAM EATER\"),\n    [MOVE_POISON_GAS]    = _(\"POISON GAS\"),\n    [MOVE_BARRAGE]       = _(\"BARRAGE\"),\n    [MOVE_LEECH_LIFE]    = _(\"LEECH LIFE\"),\n    [MOVE_LOVELY_KISS]   = _(\"LOVELY KISS\"),\n    [MOVE_SKY_ATTACK]    = _(\"SKY ATTACK\"),\n    [MOVE_TRANSFORM]     = _(\"TRANSFORM\"),\n    [MOVE_BUBBLE]        = _(\"BUBBLE\"),\n    [MOVE_DIZZY_PUNCH]   = _(\"DIZZY PUNCH\"),\n    [MOVE_SPORE]         = _(\"SPORE\"),\n    [MOVE_FLASH]         = _(\"FLASH\"),\n    [MOVE_PSYWAVE]       = _(\"PSYWAVE\"),\n    [MOVE_SPLASH]        = _(\"SPLASH\"),\n    [MOVE_ACID_ARMOR]    = _(\"ACID ARMOR\"),\n    [MOVE_CRABHAMMER]    = _(\"CRABHAMMER\"),\n    [MOVE_EXPLOSION]     = _(\"EXPLOSION\"),\n    [MOVE_FURY_SWIPES]   = _(\"FURY SWIPES\"),\n    [MOVE_BONEMERANG]    = _(\"BONEMERANG\"),\n    [MOVE_REST]          = _(\"REST\"),\n    [MOVE_ROCK_SLIDE]    = _(\"ROCK SLIDE\"),\n    [MOVE_HYPER_FANG]    = _(\"HYPER FANG\"),\n    [MOVE_SHARPEN]       = _(\"SHARPEN\"),\n    [MOVE_CONVERSION]    = _(\"CONVERSION\"),\n    [MOVE_TRI_ATTACK]    = _(\"TRI ATTACK\"),\n    [MOVE_SUPER_FANG]    = _(\"SUPER FANG\"),\n    [MOVE_SLASH]         = _(\"SLASH\"),\n    [MOVE_SUBSTITUTE]    = _(\"SUBSTITUTE\"),\n    [MOVE_STRUGGLE]      = _(\"STRUGGLE\"),\n    [MOVE_SKETCH]        = _(\"SKETCH\"),\n    [MOVE_TRIPLE_KICK]   = _(\"TRIPLE KICK\"),\n    [MOVE_THIEF]         = _(\"THIEF\"),\n    [MOVE_SPIDER_WEB]    = _(\"SPIDER WEB\"),\n    [MOVE_MIND_READER]   = _(\"MIND READER\"),\n    [MOVE_NIGHTMARE]     = _(\"NIGHTMARE\"),\n    [MOVE_FLAME_WHEEL]   = _(\"FLAME WHEEL\"),\n    [MOVE_SNORE]         = _(\"SNORE\"),\n    [MOVE_CURSE]         = _(\"CURSE\"),\n    [MOVE_FLAIL]         = _(\"FLAIL\"),\n    [MOVE_CONVERSION_2]  = _(\"CONVERSION 2\"),\n    [MOVE_AEROBLAST]     = _(\"AEROBLAST\"),\n    [MOVE_COTTON_SPORE]  = _(\"COTTON SPORE\"),\n    [MOVE_REVERSAL]      = _(\"REVERSAL\"),\n    [MOVE_SPITE]         = _(\"SPITE\"),\n    [MOVE_POWDER_SNOW]   = _(\"POWDER SNOW\"),\n    [MOVE_PROTECT]       = _(\"PROTECT\"),\n    [MOVE_MACH_PUNCH]    = _(\"MACH PUNCH\"),\n    [MOVE_SCARY_FACE]    = _(\"SCARY FACE\"),\n    [MOVE_FAINT_ATTACK]  = _(\"FAINT ATTACK\"),\n    [MOVE_SWEET_KISS]    = _(\"SWEET KISS\"),\n    [MOVE_BELLY_DRUM]    = _(\"BELLY DRUM\"),\n    [MOVE_SLUDGE_BOMB]   = _(\"SLUDGE BOMB\"),\n    [MOVE_MUD_SLAP]      = _(\"MUD-SLAP\"),\n    [MOVE_OCTAZOOKA]     = _(\"OCTAZOOKA\"),\n    [MOVE_SPIKES]        = _(\"SPIKES\"),\n    [MOVE_ZAP_CANNON]    = _(\"ZAP CANNON\"),\n    [MOVE_FORESIGHT]     = _(\"FORESIGHT\"),\n    [MOVE_DESTINY_BOND]  = _(\"DESTINY BOND\"),\n    [MOVE_PERISH_SONG]   = _(\"PERISH SONG\"),\n    [MOVE_ICY_WIND]      = _(\"ICY WIND\"),\n    [MOVE_DETECT]        = _(\"DETECT\"),\n    [MOVE_BONE_RUSH]     = _(\"BONE RUSH\"),\n    [MOVE_LOCK_ON]       = _(\"LOCK-ON\"),\n    [MOVE_OUTRAGE]       = _(\"OUTRAGE\"),\n    [MOVE_SANDSTORM]     = _(\"SANDSTORM\"),\n    [MOVE_GIGA_DRAIN]    = _(\"GIGA DRAIN\"),\n    [MOVE_ENDURE]        = _(\"ENDURE\"),\n    [MOVE_CHARM]         = _(\"CHARM\"),\n    [MOVE_ROLLOUT]       = _(\"ROLLOUT\"),\n    [MOVE_FALSE_SWIPE]   = _(\"FALSE SWIPE\"),\n    [MOVE_SWAGGER]       = _(\"SWAGGER\"),\n    [MOVE_MILK_DRINK]    = _(\"MILK DRINK\"),\n    [MOVE_SPARK]         = _(\"SPARK\"),\n    [MOVE_FURY_CUTTER]   = _(\"FURY CUTTER\"),\n    [MOVE_STEEL_WING]    = _(\"STEEL WING\"),\n    [MOVE_MEAN_LOOK]     = _(\"MEAN LOOK\"),\n    [MOVE_ATTRACT]       = _(\"ATTRACT\"),\n    [MOVE_SLEEP_TALK]    = _(\"SLEEP TALK\"),\n    [MOVE_HEAL_BELL]     = _(\"HEAL BELL\"),\n    [MOVE_RETURN]        = _(\"RETURN\"),\n    [MOVE_PRESENT]       = _(\"PRESENT\"),\n    [MOVE_FRUSTRATION]   = _(\"FRUSTRATION\"),\n    [MOVE_SAFEGUARD]     = _(\"SAFEGUARD\"),\n    [MOVE_PAIN_SPLIT]    = _(\"PAIN SPLIT\"),\n    [MOVE_SACRED_FIRE]   = _(\"SACRED FIRE\"),\n    [MOVE_MAGNITUDE]     = _(\"MAGNITUDE\"),\n    [MOVE_DYNAMIC_PUNCH] = _(\"DYNAMICPUNCH\"),\n    [MOVE_MEGAHORN]      = _(\"MEGAHORN\"),\n    [MOVE_DRAGON_BREATH] = _(\"DRAGONBREATH\"),\n    [MOVE_BATON_PASS]    = _(\"BATON PASS\"),\n    [MOVE_ENCORE]        = _(\"ENCORE\"),\n    [MOVE_PURSUIT]       = _(\"PURSUIT\"),\n    [MOVE_RAPID_SPIN]    = _(\"RAPID SPIN\"),\n    [MOVE_SWEET_SCENT]   = _(\"SWEET SCENT\"),\n    [MOVE_IRON_TAIL]     = _(\"IRON TAIL\"),\n    [MOVE_METAL_CLAW]    = _(\"METAL CLAW\"),\n    [MOVE_VITAL_THROW]   = _(\"VITAL THROW\"),\n    [MOVE_MORNING_SUN]   = _(\"MORNING SUN\"),\n    [MOVE_SYNTHESIS]     = _(\"SYNTHESIS\"),\n    [MOVE_MOONLIGHT]     = _(\"MOONLIGHT\"),\n    [MOVE_HIDDEN_POWER]  = _(\"HIDDEN POWER\"),\n    [MOVE_CROSS_CHOP]    = _(\"CROSS CHOP\"),\n    [MOVE_TWISTER]       = _(\"TWISTER\"),\n    [MOVE_RAIN_DANCE]    = _(\"RAIN DANCE\"),\n    [MOVE_SUNNY_DAY]     = _(\"SUNNY DAY\"),\n    [MOVE_CRUNCH]        = _(\"CRUNCH\"),\n    [MOVE_MIRROR_COAT]   = _(\"MIRROR COAT\"),\n    [MOVE_PSYCH_UP]      = _(\"PSYCH UP\"),\n    [MOVE_EXTREME_SPEED] = _(\"EXTREMESPEED\"),\n    [MOVE_ANCIENT_POWER] = _(\"ANCIENTPOWER\"),\n    [MOVE_SHADOW_BALL]   = _(\"SHADOW BALL\"),\n    [MOVE_FUTURE_SIGHT]  = _(\"FUTURE SIGHT\"),\n    [MOVE_ROCK_SMASH]    = _(\"ROCK SMASH\"),\n    [MOVE_WHIRLPOOL]     = _(\"WHIRLPOOL\"),\n    [MOVE_BEAT_UP]       = _(\"BEAT UP\"),\n    [MOVE_FAKE_OUT]      = _(\"FAKE OUT\"),\n    [MOVE_UPROAR]        = _(\"UPROAR\"),\n    [MOVE_STOCKPILE]     = _(\"STOCKPILE\"),\n    [MOVE_SPIT_UP]       = _(\"SPIT UP\"),\n    [MOVE_SWALLOW]       = _(\"SWALLOW\"),\n    [MOVE_HEAT_WAVE]     = _(\"HEAT WAVE\"),\n    [MOVE_HAIL]          = _(\"HAIL\"),\n    [MOVE_TORMENT]       = _(\"TORMENT\"),\n    [MOVE_FLATTER]       = _(\"FLATTER\"),\n    [MOVE_WILL_O_WISP]   = _(\"WILL-O-WISP\"),\n    [MOVE_MEMENTO]       = _(\"MEMENTO\"),\n    [MOVE_FACADE]        = _(\"FACADE\"),\n    [MOVE_FOCUS_PUNCH]   = _(\"FOCUS PUNCH\"),\n    [MOVE_SMELLING_SALT] = _(\"SMELLINGSALT\"),\n    [MOVE_FOLLOW_ME]     = _(\"FOLLOW ME\"),\n    [MOVE_NATURE_POWER]  = _(\"NATURE POWER\"),\n    [MOVE_CHARGE]        = _(\"CHARGE\"),\n    [MOVE_TAUNT]         = _(\"TAUNT\"),\n    [MOVE_HELPING_HAND]  = _(\"HELPING HAND\"),\n    [MOVE_TRICK]         = _(\"TRICK\"),\n    [MOVE_ROLE_PLAY]     = _(\"ROLE PLAY\"),\n    [MOVE_WISH]          = _(\"WISH\"),\n    [MOVE_ASSIST]        = _(\"ASSIST\"),\n    [MOVE_INGRAIN]       = _(\"INGRAIN\"),\n    [MOVE_SUPERPOWER]    = _(\"SUPERPOWER\"),\n    [MOVE_MAGIC_COAT]    = _(\"MAGIC COAT\"),\n    [MOVE_RECYCLE]       = _(\"RECYCLE\"),\n    [MOVE_REVENGE]       = _(\"REVENGE\"),\n    [MOVE_BRICK_BREAK]   = _(\"BRICK BREAK\"),\n    [MOVE_YAWN]          = _(\"YAWN\"),\n    [MOVE_KNOCK_OFF]     = _(\"KNOCK OFF\"),\n    [MOVE_ENDEAVOR]      = _(\"ENDEAVOR\"),\n    [MOVE_ERUPTION]      = _(\"ERUPTION\"),\n    [MOVE_SKILL_SWAP]    = _(\"SKILL SWAP\"),\n    [MOVE_IMPRISON]      = _(\"IMPRISON\"),\n    [MOVE_REFRESH]       = _(\"REFRESH\"),\n    [MOVE_GRUDGE]        = _(\"GRUDGE\"),\n    [MOVE_SNATCH]        = _(\"SNATCH\"),\n    [MOVE_SECRET_POWER]  = _(\"SECRET POWER\"),\n    [MOVE_DIVE]          = _(\"DIVE\"),\n    [MOVE_ARM_THRUST]    = _(\"ARM THRUST\"),\n    [MOVE_CAMOUFLAGE]    = _(\"CAMOUFLAGE\"),\n    [MOVE_TAIL_GLOW]     = _(\"TAIL GLOW\"),\n    [MOVE_LUSTER_PURGE]  = _(\"LUSTER PURGE\"),\n    [MOVE_MIST_BALL]     = _(\"MIST BALL\"),\n    [MOVE_FEATHER_DANCE] = _(\"FEATHERDANCE\"),\n    [MOVE_TEETER_DANCE]  = _(\"TEETER DANCE\"),\n    [MOVE_BLAZE_KICK]    = _(\"BLAZE KICK\"),\n    [MOVE_MUD_SPORT]     = _(\"MUD SPORT\"),\n    [MOVE_ICE_BALL]      = _(\"ICE BALL\"),\n    [MOVE_NEEDLE_ARM]    = _(\"NEEDLE ARM\"),\n    [MOVE_SLACK_OFF]     = _(\"SLACK OFF\"),\n    [MOVE_HYPER_VOICE]   = _(\"HYPER VOICE\"),\n    [MOVE_POISON_FANG]   = _(\"POISON FANG\"),\n    [MOVE_CRUSH_CLAW]    = _(\"CRUSH CLAW\"),\n    [MOVE_BLAST_BURN]    = _(\"BLAST BURN\"),\n    [MOVE_HYDRO_CANNON]  = _(\"HYDRO CANNON\"),\n    [MOVE_METEOR_MASH]   = _(\"METEOR MASH\"),\n    [MOVE_ASTONISH]      = _(\"ASTONISH\"),\n    [MOVE_WEATHER_BALL]  = _(\"WEATHER BALL\"),\n    [MOVE_AROMATHERAPY]  = _(\"AROMATHERAPY\"),\n    [MOVE_FAKE_TEARS]    = _(\"FAKE TEARS\"),\n    [MOVE_AIR_CUTTER]    = _(\"AIR CUTTER\"),\n    [MOVE_OVERHEAT]      = _(\"OVERHEAT\"),\n    [MOVE_ODOR_SLEUTH]   = _(\"ODOR SLEUTH\"),\n    [MOVE_ROCK_TOMB]     = _(\"ROCK TOMB\"),\n    [MOVE_SILVER_WIND]   = _(\"SILVER WIND\"),\n    [MOVE_METAL_SOUND]   = _(\"METAL SOUND\"),\n    [MOVE_GRASS_WHISTLE] = _(\"GRASSWHISTLE\"),\n    [MOVE_TICKLE]        = _(\"TICKLE\"),\n    [MOVE_COSMIC_POWER]  = _(\"COSMIC POWER\"),\n    [MOVE_WATER_SPOUT]   = _(\"WATER SPOUT\"),\n    [MOVE_SIGNAL_BEAM]   = _(\"SIGNAL BEAM\"),\n    [MOVE_SHADOW_PUNCH]  = _(\"SHADOW PUNCH\"),\n    [MOVE_EXTRASENSORY]  = _(\"EXTRASENSORY\"),\n    [MOVE_SKY_UPPERCUT]  = _(\"SKY UPPERCUT\"),\n    [MOVE_SAND_TOMB]     = _(\"SAND TOMB\"),\n    [MOVE_SHEER_COLD]    = _(\"SHEER COLD\"),\n    [MOVE_MUDDY_WATER]   = _(\"MUDDY WATER\"),\n    [MOVE_BULLET_SEED]   = _(\"BULLET SEED\"),\n    [MOVE_AERIAL_ACE]    = _(\"AERIAL ACE\"),\n    [MOVE_ICICLE_SPEAR]  = _(\"ICICLE SPEAR\"),\n    [MOVE_IRON_DEFENSE]  = _(\"IRON DEFENSE\"),\n    [MOVE_BLOCK]         = _(\"BLOCK\"),\n    [MOVE_HOWL]          = _(\"HOWL\"),\n    [MOVE_DRAGON_CLAW]   = _(\"DRAGON CLAW\"),\n    [MOVE_FRENZY_PLANT]  = _(\"FRENZY PLANT\"),\n    [MOVE_BULK_UP]       = _(\"BULK UP\"),\n    [MOVE_BOUNCE]        = _(\"BOUNCE\"),\n    [MOVE_MUD_SHOT]      = _(\"MUD SHOT\"),\n    [MOVE_POISON_TAIL]   = _(\"POISON TAIL\"),\n    [MOVE_COVET]         = _(\"COVET\"),\n    [MOVE_VOLT_TACKLE]   = _(\"VOLT TACKLE\"),\n    [MOVE_MAGICAL_LEAF]  = _(\"MAGICAL LEAF\"),\n    [MOVE_WATER_SPORT]   = _(\"WATER SPORT\"),\n    [MOVE_CALM_MIND]     = _(\"CALM MIND\"),\n    [MOVE_LEAF_BLADE]    = _(\"LEAF BLADE\"),\n    [MOVE_DRAGON_DANCE]  = _(\"DRAGON DANCE\"),\n    [MOVE_ROCK_BLAST]    = _(\"ROCK BLAST\"),\n    [MOVE_SHOCK_WAVE]    = _(\"SHOCK WAVE\"),\n    [MOVE_WATER_PULSE]   = _(\"WATER PULSE\"),\n    [MOVE_DOOM_DESIRE]   = _(\"DOOM DESIRE\"),\n    [MOVE_PSYCHO_BOOST]  = _(\"PSYCHO BOOST\")\n};\n"
  },
  {
    "path": "src/data/text/nature_names.h",
    "content": "static const u8 sHardyNatureName[] = _(\"HARDY\");\nstatic const u8 sLonelyNatureName[] = _(\"LONELY\");\nstatic const u8 sBraveNatureName[] = _(\"BRAVE\");\nstatic const u8 sAdamantNatureName[] = _(\"ADAMANT\");\nstatic const u8 sNaughtyNatureName[] = _(\"NAUGHTY\");\nstatic const u8 sBoldNatureName[] = _(\"BOLD\");\nstatic const u8 sDocileNatureName[] = _(\"DOCILE\");\nstatic const u8 sRelaxedNatureName[] = _(\"RELAXED\");\nstatic const u8 sImpishNatureName[] = _(\"IMPISH\");\nstatic const u8 sLaxNatureName[] = _(\"LAX\");\nstatic const u8 sTimidNatureName[] = _(\"TIMID\");\nstatic const u8 sHastyNatureName[] = _(\"HASTY\");\nstatic const u8 sSeriousNatureName[] = _(\"SERIOUS\");\nstatic const u8 sJollyNatureName[] = _(\"JOLLY\");\nstatic const u8 sNaiveNatureName[] = _(\"NAIVE\");\nstatic const u8 sModestNatureName[] = _(\"MODEST\");\nstatic const u8 sMildNatureName[] = _(\"MILD\");\nstatic const u8 sQuietNatureName[] = _(\"QUIET\");\nstatic const u8 sBashfulNatureName[] = _(\"BASHFUL\");\nstatic const u8 sRashNatureName[] = _(\"RASH\");\nstatic const u8 sCalmNatureName[] = _(\"CALM\");\nstatic const u8 sGentleNatureName[] = _(\"GENTLE\");\nstatic const u8 sSassyNatureName[] = _(\"SASSY\");\nstatic const u8 sCarefulNatureName[] = _(\"CAREFUL\");\nstatic const u8 sQuirkyNatureName[] = _(\"QUIRKY\");\n\nconst u8 *const gNatureNamePointers[NUM_NATURES] = {\n    [NATURE_HARDY] = sHardyNatureName,\n    [NATURE_LONELY] = sLonelyNatureName,\n    [NATURE_BRAVE] = sBraveNatureName,\n    [NATURE_ADAMANT] = sAdamantNatureName,\n    [NATURE_NAUGHTY] = sNaughtyNatureName,\n    [NATURE_BOLD] = sBoldNatureName,\n    [NATURE_DOCILE] = sDocileNatureName,\n    [NATURE_RELAXED] = sRelaxedNatureName,\n    [NATURE_IMPISH] = sImpishNatureName,\n    [NATURE_LAX] = sLaxNatureName,\n    [NATURE_TIMID] = sTimidNatureName,\n    [NATURE_HASTY] = sHastyNatureName,\n    [NATURE_SERIOUS] = sSeriousNatureName,\n    [NATURE_JOLLY] = sJollyNatureName,\n    [NATURE_NAIVE] = sNaiveNatureName,\n    [NATURE_MODEST] = sModestNatureName,\n    [NATURE_MILD] = sMildNatureName,\n    [NATURE_QUIET] = sQuietNatureName,\n    [NATURE_BASHFUL] = sBashfulNatureName,\n    [NATURE_RASH] = sRashNatureName,\n    [NATURE_CALM] = sCalmNatureName,\n    [NATURE_GENTLE] = sGentleNatureName,\n    [NATURE_SASSY] = sSassyNatureName,\n    [NATURE_CAREFUL] = sCarefulNatureName,\n    [NATURE_QUIRKY] = sQuirkyNatureName,\n};\n"
  },
  {
    "path": "src/data/text/quest_log.h",
    "content": "const u8 gText_QuestLog_PreviouslyOnYourQuest[] = _(\"Previously on your quest…\");\nconst u8 gText_QuestLog_SwitchMon1WithMon2[] = _(\"{PLAYER} switched the POKéMON\\n{STR_VAR_1} with {STR_VAR_2}.\");\nconst u8 gText_QuestLog_SwappedHeldItemsOnMon[] = _(\"Took the item {STR_VAR_2} from\\n{STR_VAR_1} and gave it the item\\n{STR_VAR_3} to hold.\");\nconst u8 gText_QuestLog_TookHeldItemFromMon[] = _(\"Took the item {STR_VAR_2} from\\n{STR_VAR_1}.\");\nconst u8 gText_QuestLog_UsedItemOnMonAtThisLocation[] = _(\"Used the item {STR_VAR_1} on {STR_VAR_2}\\nat this location.\");\nconst u8 gText_QuestLog_UsedTheItem[] = _(\"{PLAYER} used the\\n{STR_VAR_1}.\");\nconst u8 gText_QuestLog_UsedTheKeyItem[] = _(\"Used the item {STR_VAR_1}, which was\\nin the KEY ITEMS POCKET.\");\nconst u8 gText_QuestLog_MonLearnedMoveFromTM[] = _(\"{STR_VAR_1} learned the move\\n{STR_VAR_2} from a TM.\");\nconst u8 gText_QuestLog_MonReplacedMoveWithTM[] = _(\"{STR_VAR_1} learned the move\\n{STR_VAR_2} from a TM and forgot\\nthe move {STR_VAR_3}.\");\nconst u8 gText_QuestLog_MonsWereFullyRestoredAtCenter[] = _(\"POKéMON were fully restored\\nat a POKéMON CENTER.\");\nconst u8 gText_QuestLog_PlayerBattledChampionRival[] = _(\"{DYNAMIC 0x00} had a marvelous battle\\nwith the CHAMPION, {DYNAMIC 0x01}.\");\nconst u8 gText_QuestLog_PlayerSentOutMon1RivalSentOutMon2[] = _(\"In the end, {DYNAMIC 0x00} sent out {DYNAMIC 0x01}\\nwhile {DYNAMIC 0x02} countered with\\n{DYNAMIC 0x03}.\");\nconst u8 gText_QuestLog_WonTheMatchAsAResult[] = _(\"And, as a result of battling with every\\nbit of power, {DYNAMIC 0x00} won\\nthe match.\");\nconst u8 gText_QuestLog_StoredItemInPC[] = _(\"Removed the item {STR_VAR_1} from\\nthe BAG's ITEMS POCKET and stored it\\non the PC.\");\nconst u8 gText_QuestLog_WithdrewItemFromPC[] = _(\"{PLAYER} withdrew the item {STR_VAR_1}\\nfrom the PC.\");\nconst u8 gText_QuestLog_TradedMon1ForPersonsMon2[] = _(\"Traded {STR_VAR_3} in exchange for\\n{STR_VAR_1}'s {STR_VAR_2}.\");\nconst u8 gText_QuestLog_SingleBattleWithPersonResultedInOutcome[] = _(\"Took on {DYNAMIC 0x00} in a SINGLE BATTLE.\\nIt was a hotly contested match that\\nresulted in a {DYNAMIC 0x01}.\");\nconst u8 gText_QuestLog_DoubleBattleWithPersonResultedInOutcome[] = _(\"Took on {DYNAMIC 0x00} in a DOUBLE BATTLE.\\nIt was an extended match that resulted\\nin a {DYNAMIC 0x01}.\");\nconst u8 gText_QuestLog_MultiBattleWithPeopleResultedInOutcome[] = _(\"{DYNAMIC 0x00} and {DYNAMIC 0x01} took on\\n{DYNAMIC 0x02} and {DYNAMIC 0x03} in a\\nMULTI BATTLE and got a {DYNAMIC 0x04}.\");\nconst u8 gText_QuestLog_Win[] = _(\"win\");\nconst u8 gText_QuestLog_Loss[] = _(\"loss\");\nconst u8 gText_QuestLog_MingledInUnionRoom[] = _(\"Mingled with other TRAINERS in\\nthe UNION ROOM.\");\nconst u8 gText_QuestLog_DepartedPlaceInTownForNextDestination[] = _(\"Departed {STR_VAR_2}\\nin {STR_VAR_1} for the next\\ndestination.\");\nconst u8 gText_QuestLog_SwitchedMonsBetweenBoxes[] = _(\"After consideration, switched\\n{DYNAMIC 0x01} in {DYNAMIC 0x00} with\\n{DYNAMIC 0x03} in {DYNAMIC 0x02}.\");\nconst u8 gText_QuestLog_MovedMonToNewBox[] = _(\"After deep thought, switched\\n{DYNAMIC 0x01} in BOX “{DYNAMIC 0x00}” to\\nthe BOX “{DYNAMIC 0x02}.”\");\nconst u8 gText_QuestLog_SwitchedMonsWithinBox[] = _(\"Switched around {DYNAMIC 0x01} and\\n{DYNAMIC 0x02} in {DYNAMIC 0x00}.\");\nconst u8 gText_QuestLog_MovedMonWithinBox[] = _(\"Moved {DYNAMIC 0x01} in {DYNAMIC 0x00}.\");\nconst u8 gText_QuestLog_SwitchedPartyMonForPCMon[] = _(\"Switched {DYNAMIC 0x01} in {DYNAMIC 0x00}\\nwith {DYNAMIC 0x02} in the party.\");\nconst u8 gText_QuestLog_WithdrewMonFromPC[] = _(\"Added {DYNAMIC 0x01} in {DYNAMIC 0x00}\\nto the party.\");\nconst u8 gText_QuestLog_DepositedMonInPC[] = _(\"Moved {DYNAMIC 0x00} from the party\\nto {DYNAMIC 0x01}.\");\nconst u8 gText_QuestLog_SwitchedMultipleMons[] = _(\"Moved a group of POKéMON in\\n{DYNAMIC 0x00} to {DYNAMIC 0x01}.\");\nconst u8 gText_QuestLog_ADifferentSpot[] = _(\"a different spot\");\nconst u8 gText_QuestLog_GaveMonHeldItemFromPC[] = _(\"Removed the item {STR_VAR_1} from\\n{PLAYER}'s PC and gave it to {STR_VAR_2}\\nto hold.\");\nconst u8 gText_QuestLog_SwappedHeldItemFromPC[] = _(\"Removed the item {STR_VAR_1} from\\na PC, gave it to {STR_VAR_2}, and put\\nthe {STR_VAR_3} it held in the BAG.\");\nconst u8 gText_QuestLog_ChattedWithManyTrainers[] = _(\"Chatted with many TRAINERS.\");\nconst u8 gText_QuestLog_Handily[] = _(\"handily\");\nconst u8 gText_QuestLog_Tenaciously[] = _(\"tenaciously\");\nconst u8 gText_QuestLog_Somehow[] = _(\"somehow\");\nconst u8 gText_QuestLog_TradedMon1ForTrainersMon2[] = _(\"Met and traded with {STR_VAR_1}.\\nObtained the TRAINER's {STR_VAR_2} in\\nexchange for {STR_VAR_3}.\");\nconst u8 gText_QuestLog_BattledTrainerEndedInOutcome[] = _(\"Met and battled {STR_VAR_1}.\\nThe match ended in a {STR_VAR_2}.\");\nconst u8 gText_QuestLog_BoughtItem[] = _(\"Went to the POKéMON MART in\\n{DYNAMIC 0x00} and bought one \\n{DYNAMIC 0x01}.\");\nconst u8 gText_QuestLog_BoughtItemsIncludingItem[] = _(\"Went to the POKéMON MART in\\n{DYNAMIC 0x00} and spent ¥{DYNAMIC 0x02} for\\nitems including {DYNAMIC 0x01}(s).\");\nconst u8 gText_QuestLog_SoldNumOfItem[] = _(\"{DYNAMIC 0x00} went to the POKéMON MART in\\n{DYNAMIC 0x01} and sold {DYNAMIC 0x03} of\\nthe item {DYNAMIC 0x02}.\");\nconst u8 gText_QuestLog_SoldItemsIncludingItem[] = _(\"Sold items including {DYNAMIC 0x01} at\\nthe POKéMON MART in {DYNAMIC 0x00},\\nworth ¥{DYNAMIC 0x02}.\");\nconst u8 gText_QuestLog_JustOne[] = _(\"just one\");\nconst u8 gText_QuestLog_Num[] = _(\"{DYNAMIC 0x04}\");\nconst u8 gText_QuestLog_UsedSoftboiled[] = _(\"{STR_VAR_1} shared its HP using the move\\nSOFTBOILED.\");\nconst u8 gText_QuestLog_UsedMilkDrink[] = _(\"{STR_VAR_1} shared its HP using the move\\nMILK DRINK.\");\nconst u8 gText_QuestLog_MonLearnedMoveFromHM[] = _(\"{STR_VAR_1} securely learned the move\\n{STR_VAR_2} using an HM.\");\nconst u8 gText_QuestLog_MonReplacedMoveWithHM[] = _(\"{STR_VAR_1} securely learned the move\\n{STR_VAR_2} using an HM and forgot\\nthe move {STR_VAR_3}.\");\nconst u8 gText_QuestLog_DefeatedWildMon[] = _(\"{DYNAMIC 0x05} managed to defeat the POKéMON\\n{DYNAMIC 0x01} in {DYNAMIC 0x00}.\");\nconst u8 gText_QuestLog_DefeatedWildMons[] = _(\"Defeated {DYNAMIC 0x02} wild POKéMON including\\n{DYNAMIC 0x01} in {DYNAMIC 0x00}.\");\nconst u8 gText_QuestLog_CaughtWildMon[] = _(\"{DYNAMIC 0x05} managed to catch the POKéMON\\n{DYNAMIC 0x03} in {DYNAMIC 0x00}.\");\nconst u8 gText_QuestLog_CaughtWildMons[] = _(\"Threw POKé BALLS in a frenzy, catching\\n{DYNAMIC 0x04} POKéMON including {DYNAMIC 0x03} here\\nin {DYNAMIC 0x00}.\");\nconst u8 gText_QuestLog_DefeatedWildMonAndCaughtWildMon[] = _(\"{DYNAMIC 0x05} defeated the POKéMON\\n{DYNAMIC 0x01} and caught one {DYNAMIC 0x03}\\nin {DYNAMIC 0x00}.\");\nconst u8 gText_QuestLog_DefeatedWildMonAndCaughtWildMons[] = _(\"Defeated the POKéMON {DYNAMIC 0x01}\\nand caught {DYNAMIC 0x04} POKéMON including\\n{DYNAMIC 0x03} in {DYNAMIC 0x00}.\");\nconst u8 gText_QuestLog_DefeatedWildMonsAndCaughtWildMon[] = _(\"{DYNAMIC 0x05} defeated {DYNAMIC 0x02} POKéMON including\\n{DYNAMIC 0x01} and caught one {DYNAMIC 0x03}\\nin {DYNAMIC 0x00}.\");\nconst u8 gText_QuestLog_DefeatedWildMonsAndCaughtWildMons[] = _(\"Defeated {DYNAMIC 0x02} POKéMON including\\n{DYNAMIC 0x01} and caught {DYNAMIC 0x04} POKéMON\\nincluding {DYNAMIC 0x03} in {DYNAMIC 0x00}.\");\nconst u8 gText_QuestLog_GaveMonHeldItem[] = _(\"Made {STR_VAR_1} hold the item\\n{STR_VAR_2}.\");\nconst u8 gText_QuestLog_GaveMonHeldItem2[] = _(\"{PLAYER} made {STR_VAR_1} hold the item\\n{STR_VAR_2}.\");\nconst u8 gText_QuestLog_UsedCut[] = _(\"{STR_VAR_1} used the Hidden Move\\nCUT here.\");\nconst u8 gText_QuestLog_UsedFly[] = _(\"{STR_VAR_1} used the Hidden Move\\nFLY and flew to {STR_VAR_2}.\");\nconst u8 gText_QuestLog_UsedSurf[] = _(\"{STR_VAR_1} used the Hidden Move\\nSURF and rode the waves.\");\nconst u8 gText_QuestLog_UsedStrength[] = _(\"{STR_VAR_1} used the Hidden Move\\nSTRENGTH here.\");\nconst u8 gText_QuestLog_UsedFlash[] = _(\"{STR_VAR_1} used the Hidden Move\\nFLASH and illuminated a pitch-black\\ncave.\");\nconst u8 gText_QuestLog_UsedRockSmash[] = _(\"{STR_VAR_1} used the Hidden Move\\nROCK SMASH here.\");\nconst u8 gText_QuestLog_UsedWaterfall[] = _(\"{STR_VAR_1} used the Hidden Move\\nWATERFALL to scale a raging torrent.\"); // Unused\nconst u8 gText_QuestLog_UsedDigInLocation[] = _(\"{STR_VAR_1} used DIG to escape from\\n{STR_VAR_2}.\");\nconst u8 gText_QuestLog_UsedSweetScent[] = _(\"{STR_VAR_1} used SWEET SCENT to attract\\nwild POKéMON.\");\nconst u8 gText_QuestLog_UsedTeleportToLocation[] = _(\"{STR_VAR_1} used TELEPORT, transporting\\nthe party to {STR_VAR_2}'s\\n{STR_VAR_3}.\");\nconst u8 gText_QuestLog_LeftTownsLocationForNextDestination[] = _(\"{PLAYER} left {STR_VAR_1}'s\\n{STR_VAR_2} for the next\\ndestination.\");\nconst u8 gText_QuestLog_PlayedGamesAtGameCorner[] = _(\"Played a lot of games at the ROCKET\\nGAME CORNER in {STR_VAR_1}.\");\nconst u8 gText_QuestLog_RestedAtHome[] = _(\"{PLAYER} rested comfortably at home.\");\nconst u8 gText_QuestLog_LeftOaksLab[] = _(\"{PLAYER} left PROF. OAK's POKéMON\\nRESEARCH LAB.\");\nconst u8 gText_QuestLog_GymWasFullOfToughTrainers[] = _(\"The GYM in {STR_VAR_1} was full of\\ntough TRAINERS…\\nPreparations had to be made.\");\nconst u8 gText_QuestLog_DepartedGym[] = _(\"Departed the GYM in {STR_VAR_1}.\");\nconst u8 gText_QuestLog_HadGreatTimeInSafariZone[] = _(\"{PLAYER} had a great time with POKéMON\\nin the SAFARI ZONE.\");\nconst u8 gText_QuestLog_ManagedToGetOutOfLocation[] = _(\"Managed to get out of {STR_VAR_2}\\nafter wandering about.\");\nconst u8 gText_QuestLog_TookOnGymLeadersMonWithMonAndWon[] = _(\"Took on {DYNAMIC 0x00} GYM LEADER\\n{DYNAMIC 0x01}'s {DYNAMIC 0x02} with {DYNAMIC 0x03}\\nand won {DYNAMIC 0x04}!\");\nconst u8 gText_QuestLog_TookOnEliteFoursMonWithMonAndWon[] = _(\"Took on ELITE FOUR {DYNAMIC 0x00}'s\\n{DYNAMIC 0x01} with {DYNAMIC 0x02} and\\nwon {DYNAMIC 0x03}!\");\nconst u8 gText_QuestLog_TookOnTrainersMonWithMonAndWon[] = _(\"In {DYNAMIC 0x00}, took on\\n{DYNAMIC 0x01}'s {DYNAMIC 0x02} with {DYNAMIC 0x03}\\nand won {DYNAMIC 0x04}!\");\nconst u8 gText_QuestLog_Coolly[] = _(\"coolly\");\nconst u8 gText_QuestLog_Barely[] = _(\"barely\");\nconst u8 gText_QuestLog_UsedEscapeRope[] = _(\"{PLAYER} used an ESCAPE ROPE to get\\nout from {STR_VAR_2}.\");\nconst u8 gText_QuestLog_Draw[] = _(\"draw\");\nconst u8 gText_QuestLog_DepartedTheLocationForNextDestination[] = _(\"Departed from the {STR_VAR_2}\\nfor the next destination.\");\nconst u8 gText_QuestLog_DepartedFromLocationToNextDestination[] = _(\"{PLAYER} departed from\\n{STR_VAR_2} and made way\\nto the next destination.\");\nconst u8 gText_QuestLog_ObtainedItemInLocation[] = _(\"Here in {STR_VAR_1}, {PLAYER}\\nobtained the item {STR_VAR_2}.\");\nconst u8 gText_QuestLog_ArrivedInLocation[] = _(\"Arrived in {STR_VAR_1}.\");\nconst u8 gText_QuestLog_SavedGameAtLocation[] = _(\"And {PLAYER} saved the game at this\\nlocation: {STR_VAR_1}.\");\nconst u8 gText_QuestLog_Home[] = _(\"HOME\");\nconst u8 gText_QuestLog_OakResearchLab[] = _(\"OAK RESEARCH LAB\");\nconst u8 gText_QuestLog_Gym[] = _(\"GYM\");\nconst u8 gText_QuestLog_PokemonLeagueGate[] = _(\"POKéMON LEAGUE GATE\");\nconst u8 gText_QuestLog_ViridianForest[] = _(\"VIRIDIAN FOREST\");\nconst u8 gText_QuestLog_PewterMuseumOfScience[] = _(\"PEWTER MUSEUM OF SCIENCE\");\nconst u8 gText_QuestLog_MtMoon[] = _(\"MT. MOON\");\nconst u8 gText_QuestLog_BikeShop[] = _(\"BIKE SHOP\");\nconst u8 gText_QuestLog_BillsHouse[] = _(\"BILL'S HOUSE\");\nconst u8 gText_QuestLog_DayCare[] = _(\"DAY CARE\");\nconst u8 gText_QuestLog_UndergroundPath[] = _(\"UNDERGROUND PATH\");\nconst u8 gText_QuestLog_PokemonFanClub[] = _(\"POKéMON FAN CLUB\");\nconst u8 gText_QuestLog_SSAnne[] = _(\"S.S. ANNE\");\nconst u8 gText_QuestLog_DiglettsCave[] = _(\"DIGLETT'S CAVE\");\nconst u8 gText_QuestLog_RockTunnel[] = _(\"ROCK TUNNEL\");\nconst u8 gText_QuestLog_PowerPlant[] = _(\"POWER PLANT\");\nconst u8 gText_QuestLog_PokemonTower[] = _(\"POKéMON TOWER\");\nconst u8 gText_QuestLog_VolunteerHouse[] = _(\"VOLUNTEER HOUSE\");\nconst u8 gText_QuestLog_NameRatersHouse[] = _(\"NAME RATER'S HOUSE\");\nconst u8 gText_QuestLog_CeladonDeptStore[] = _(\"CELADON DEPT. STORE\");\nconst u8 gText_QuestLog_CeladonMansion[] = _(\"CELADON MANSION\");\nconst u8 gText_QuestLog_RocketGameCorner[] = _(\"ROCKET GAME CORNER\");\nconst u8 gText_QuestLog_Restaurant[] = _(\"RESTAURANT\");\nconst u8 gText_QuestLog_RocketHideout[] = _(\"ROCKET HIDEOUT\");\nconst u8 gText_QuestLog_SafariZone[] = _(\"SAFARI ZONE\");\nconst u8 gText_QuestLog_WardensHome[] = _(\"WARDEN'S HOME\");\nconst u8 gText_QuestLog_FightingDojo[] = _(\"FIGHTING DOJO\");\nconst u8 gText_QuestLog_SilphCo[] = _(\"SILPH CO.\");\nconst u8 gText_QuestLog_SeafoamIslands[] = _(\"SEAFOAM ISLANDS\");\nconst u8 gText_QuestLog_PokemonMansion[] = _(\"POKéMON MANSION\");\nconst u8 gText_QuestLog_PokemonResearchLab[] = _(\"POKéMON RESEARCH LAB\");\nconst u8 gText_QuestLog_VictoryRoad[] = _(\"VICTORY ROAD\");\nconst u8 gText_QuestLog_PokemonLeague[] = _(\"POKéMON LEAGUE\");\nconst u8 gText_QuestLog_CeruleanCave[] = _(\"CERULEAN CAVE\");\n"
  },
  {
    "path": "src/data/text/species_names.h",
    "content": "const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1] = {\n    [SPECIES_NONE] = _(\"??????????\"),\n    [SPECIES_BULBASAUR] = _(\"BULBASAUR\"),\n    [SPECIES_IVYSAUR] = _(\"IVYSAUR\"),\n    [SPECIES_VENUSAUR] = _(\"VENUSAUR\"),\n    [SPECIES_CHARMANDER] = _(\"CHARMANDER\"),\n    [SPECIES_CHARMELEON] = _(\"CHARMELEON\"),\n    [SPECIES_CHARIZARD] = _(\"CHARIZARD\"),\n    [SPECIES_SQUIRTLE] = _(\"SQUIRTLE\"),\n    [SPECIES_WARTORTLE] = _(\"WARTORTLE\"),\n    [SPECIES_BLASTOISE] = _(\"BLASTOISE\"),\n    [SPECIES_CATERPIE] = _(\"CATERPIE\"),\n    [SPECIES_METAPOD] = _(\"METAPOD\"),\n    [SPECIES_BUTTERFREE] = _(\"BUTTERFREE\"),\n    [SPECIES_WEEDLE] = _(\"WEEDLE\"),\n    [SPECIES_KAKUNA] = _(\"KAKUNA\"),\n    [SPECIES_BEEDRILL] = _(\"BEEDRILL\"),\n    [SPECIES_PIDGEY] = _(\"PIDGEY\"),\n    [SPECIES_PIDGEOTTO] = _(\"PIDGEOTTO\"),\n    [SPECIES_PIDGEOT] = _(\"PIDGEOT\"),\n    [SPECIES_RATTATA] = _(\"RATTATA\"),\n    [SPECIES_RATICATE] = _(\"RATICATE\"),\n    [SPECIES_SPEAROW] = _(\"SPEAROW\"),\n    [SPECIES_FEAROW] = _(\"FEAROW\"),\n    [SPECIES_EKANS] = _(\"EKANS\"),\n    [SPECIES_ARBOK] = _(\"ARBOK\"),\n    [SPECIES_PIKACHU] = _(\"PIKACHU\"),\n    [SPECIES_RAICHU] = _(\"RAICHU\"),\n    [SPECIES_SANDSHREW] = _(\"SANDSHREW\"),\n    [SPECIES_SANDSLASH] = _(\"SANDSLASH\"),\n    [SPECIES_NIDORAN_F] = _(\"NIDORAN♀\"),\n    [SPECIES_NIDORINA] = _(\"NIDORINA\"),\n    [SPECIES_NIDOQUEEN] = _(\"NIDOQUEEN\"),\n    [SPECIES_NIDORAN_M] = _(\"NIDORAN♂\"),\n    [SPECIES_NIDORINO] = _(\"NIDORINO\"),\n    [SPECIES_NIDOKING] = _(\"NIDOKING\"),\n    [SPECIES_CLEFAIRY] = _(\"CLEFAIRY\"),\n    [SPECIES_CLEFABLE] = _(\"CLEFABLE\"),\n    [SPECIES_VULPIX] = _(\"VULPIX\"),\n    [SPECIES_NINETALES] = _(\"NINETALES\"),\n    [SPECIES_JIGGLYPUFF] = _(\"JIGGLYPUFF\"),\n    [SPECIES_WIGGLYTUFF] = _(\"WIGGLYTUFF\"),\n    [SPECIES_ZUBAT] = _(\"ZUBAT\"),\n    [SPECIES_GOLBAT] = _(\"GOLBAT\"),\n    [SPECIES_ODDISH] = _(\"ODDISH\"),\n    [SPECIES_GLOOM] = _(\"GLOOM\"),\n    [SPECIES_VILEPLUME] = _(\"VILEPLUME\"),\n    [SPECIES_PARAS] = _(\"PARAS\"),\n    [SPECIES_PARASECT] = _(\"PARASECT\"),\n    [SPECIES_VENONAT] = _(\"VENONAT\"),\n    [SPECIES_VENOMOTH] = _(\"VENOMOTH\"),\n    [SPECIES_DIGLETT] = _(\"DIGLETT\"),\n    [SPECIES_DUGTRIO] = _(\"DUGTRIO\"),\n    [SPECIES_MEOWTH] = _(\"MEOWTH\"),\n    [SPECIES_PERSIAN] = _(\"PERSIAN\"),\n    [SPECIES_PSYDUCK] = _(\"PSYDUCK\"),\n    [SPECIES_GOLDUCK] = _(\"GOLDUCK\"),\n    [SPECIES_MANKEY] = _(\"MANKEY\"),\n    [SPECIES_PRIMEAPE] = _(\"PRIMEAPE\"),\n    [SPECIES_GROWLITHE] = _(\"GROWLITHE\"),\n    [SPECIES_ARCANINE] = _(\"ARCANINE\"),\n    [SPECIES_POLIWAG] = _(\"POLIWAG\"),\n    [SPECIES_POLIWHIRL] = _(\"POLIWHIRL\"),\n    [SPECIES_POLIWRATH] = _(\"POLIWRATH\"),\n    [SPECIES_ABRA] = _(\"ABRA\"),\n    [SPECIES_KADABRA] = _(\"KADABRA\"),\n    [SPECIES_ALAKAZAM] = _(\"ALAKAZAM\"),\n    [SPECIES_MACHOP] = _(\"MACHOP\"),\n    [SPECIES_MACHOKE] = _(\"MACHOKE\"),\n    [SPECIES_MACHAMP] = _(\"MACHAMP\"),\n    [SPECIES_BELLSPROUT] = _(\"BELLSPROUT\"),\n    [SPECIES_WEEPINBELL] = _(\"WEEPINBELL\"),\n    [SPECIES_VICTREEBEL] = _(\"VICTREEBEL\"),\n    [SPECIES_TENTACOOL] = _(\"TENTACOOL\"),\n    [SPECIES_TENTACRUEL] = _(\"TENTACRUEL\"),\n    [SPECIES_GEODUDE] = _(\"GEODUDE\"),\n    [SPECIES_GRAVELER] = _(\"GRAVELER\"),\n    [SPECIES_GOLEM] = _(\"GOLEM\"),\n    [SPECIES_PONYTA] = _(\"PONYTA\"),\n    [SPECIES_RAPIDASH] = _(\"RAPIDASH\"),\n    [SPECIES_SLOWPOKE] = _(\"SLOWPOKE\"),\n    [SPECIES_SLOWBRO] = _(\"SLOWBRO\"),\n    [SPECIES_MAGNEMITE] = _(\"MAGNEMITE\"),\n    [SPECIES_MAGNETON] = _(\"MAGNETON\"),\n    [SPECIES_FARFETCHD] = _(\"FARFETCH'D\"),\n    [SPECIES_DODUO] = _(\"DODUO\"),\n    [SPECIES_DODRIO] = _(\"DODRIO\"),\n    [SPECIES_SEEL] = _(\"SEEL\"),\n    [SPECIES_DEWGONG] = _(\"DEWGONG\"),\n    [SPECIES_GRIMER] = _(\"GRIMER\"),\n    [SPECIES_MUK] = _(\"MUK\"),\n    [SPECIES_SHELLDER] = _(\"SHELLDER\"),\n    [SPECIES_CLOYSTER] = _(\"CLOYSTER\"),\n    [SPECIES_GASTLY] = _(\"GASTLY\"),\n    [SPECIES_HAUNTER] = _(\"HAUNTER\"),\n    [SPECIES_GENGAR] = _(\"GENGAR\"),\n    [SPECIES_ONIX] = _(\"ONIX\"),\n    [SPECIES_DROWZEE] = _(\"DROWZEE\"),\n    [SPECIES_HYPNO] = _(\"HYPNO\"),\n    [SPECIES_KRABBY] = _(\"KRABBY\"),\n    [SPECIES_KINGLER] = _(\"KINGLER\"),\n    [SPECIES_VOLTORB] = _(\"VOLTORB\"),\n    [SPECIES_ELECTRODE] = _(\"ELECTRODE\"),\n    [SPECIES_EXEGGCUTE] = _(\"EXEGGCUTE\"),\n    [SPECIES_EXEGGUTOR] = _(\"EXEGGUTOR\"),\n    [SPECIES_CUBONE] = _(\"CUBONE\"),\n    [SPECIES_MAROWAK] = _(\"MAROWAK\"),\n    [SPECIES_HITMONLEE] = _(\"HITMONLEE\"),\n    [SPECIES_HITMONCHAN] = _(\"HITMONCHAN\"),\n    [SPECIES_LICKITUNG] = _(\"LICKITUNG\"),\n    [SPECIES_KOFFING] = _(\"KOFFING\"),\n    [SPECIES_WEEZING] = _(\"WEEZING\"),\n    [SPECIES_RHYHORN] = _(\"RHYHORN\"),\n    [SPECIES_RHYDON] = _(\"RHYDON\"),\n    [SPECIES_CHANSEY] = _(\"CHANSEY\"),\n    [SPECIES_TANGELA] = _(\"TANGELA\"),\n    [SPECIES_KANGASKHAN] = _(\"KANGASKHAN\"),\n    [SPECIES_HORSEA] = _(\"HORSEA\"),\n    [SPECIES_SEADRA] = _(\"SEADRA\"),\n    [SPECIES_GOLDEEN] = _(\"GOLDEEN\"),\n    [SPECIES_SEAKING] = _(\"SEAKING\"),\n    [SPECIES_STARYU] = _(\"STARYU\"),\n    [SPECIES_STARMIE] = _(\"STARMIE\"),\n    [SPECIES_MR_MIME] = _(\"MR. MIME\"),\n    [SPECIES_SCYTHER] = _(\"SCYTHER\"),\n    [SPECIES_JYNX] = _(\"JYNX\"),\n    [SPECIES_ELECTABUZZ] = _(\"ELECTABUZZ\"),\n    [SPECIES_MAGMAR] = _(\"MAGMAR\"),\n    [SPECIES_PINSIR] = _(\"PINSIR\"),\n    [SPECIES_TAUROS] = _(\"TAUROS\"),\n    [SPECIES_MAGIKARP] = _(\"MAGIKARP\"),\n    [SPECIES_GYARADOS] = _(\"GYARADOS\"),\n    [SPECIES_LAPRAS] = _(\"LAPRAS\"),\n    [SPECIES_DITTO] = _(\"DITTO\"),\n    [SPECIES_EEVEE] = _(\"EEVEE\"),\n    [SPECIES_VAPOREON] = _(\"VAPOREON\"),\n    [SPECIES_JOLTEON] = _(\"JOLTEON\"),\n    [SPECIES_FLAREON] = _(\"FLAREON\"),\n    [SPECIES_PORYGON] = _(\"PORYGON\"),\n    [SPECIES_OMANYTE] = _(\"OMANYTE\"),\n    [SPECIES_OMASTAR] = _(\"OMASTAR\"),\n    [SPECIES_KABUTO] = _(\"KABUTO\"),\n    [SPECIES_KABUTOPS] = _(\"KABUTOPS\"),\n    [SPECIES_AERODACTYL] = _(\"AERODACTYL\"),\n    [SPECIES_SNORLAX] = _(\"SNORLAX\"),\n    [SPECIES_ARTICUNO] = _(\"ARTICUNO\"),\n    [SPECIES_ZAPDOS] = _(\"ZAPDOS\"),\n    [SPECIES_MOLTRES] = _(\"MOLTRES\"),\n    [SPECIES_DRATINI] = _(\"DRATINI\"),\n    [SPECIES_DRAGONAIR] = _(\"DRAGONAIR\"),\n    [SPECIES_DRAGONITE] = _(\"DRAGONITE\"),\n    [SPECIES_MEWTWO] = _(\"MEWTWO\"),\n    [SPECIES_MEW] = _(\"MEW\"),\n    [SPECIES_CHIKORITA] = _(\"CHIKORITA\"),\n    [SPECIES_BAYLEEF] = _(\"BAYLEEF\"),\n    [SPECIES_MEGANIUM] = _(\"MEGANIUM\"),\n    [SPECIES_CYNDAQUIL] = _(\"CYNDAQUIL\"),\n    [SPECIES_QUILAVA] = _(\"QUILAVA\"),\n    [SPECIES_TYPHLOSION] = _(\"TYPHLOSION\"),\n    [SPECIES_TOTODILE] = _(\"TOTODILE\"),\n    [SPECIES_CROCONAW] = _(\"CROCONAW\"),\n    [SPECIES_FERALIGATR] = _(\"FERALIGATR\"),\n    [SPECIES_SENTRET] = _(\"SENTRET\"),\n    [SPECIES_FURRET] = _(\"FURRET\"),\n    [SPECIES_HOOTHOOT] = _(\"HOOTHOOT\"),\n    [SPECIES_NOCTOWL] = _(\"NOCTOWL\"),\n    [SPECIES_LEDYBA] = _(\"LEDYBA\"),\n    [SPECIES_LEDIAN] = _(\"LEDIAN\"),\n    [SPECIES_SPINARAK] = _(\"SPINARAK\"),\n    [SPECIES_ARIADOS] = _(\"ARIADOS\"),\n    [SPECIES_CROBAT] = _(\"CROBAT\"),\n    [SPECIES_CHINCHOU] = _(\"CHINCHOU\"),\n    [SPECIES_LANTURN] = _(\"LANTURN\"),\n    [SPECIES_PICHU] = _(\"PICHU\"),\n    [SPECIES_CLEFFA] = _(\"CLEFFA\"),\n    [SPECIES_IGGLYBUFF] = _(\"IGGLYBUFF\"),\n    [SPECIES_TOGEPI] = _(\"TOGEPI\"),\n    [SPECIES_TOGETIC] = _(\"TOGETIC\"),\n    [SPECIES_NATU] = _(\"NATU\"),\n    [SPECIES_XATU] = _(\"XATU\"),\n    [SPECIES_MAREEP] = _(\"MAREEP\"),\n    [SPECIES_FLAAFFY] = _(\"FLAAFFY\"),\n    [SPECIES_AMPHAROS] = _(\"AMPHAROS\"),\n    [SPECIES_BELLOSSOM] = _(\"BELLOSSOM\"),\n    [SPECIES_MARILL] = _(\"MARILL\"),\n    [SPECIES_AZUMARILL] = _(\"AZUMARILL\"),\n    [SPECIES_SUDOWOODO] = _(\"SUDOWOODO\"),\n    [SPECIES_POLITOED] = _(\"POLITOED\"),\n    [SPECIES_HOPPIP] = _(\"HOPPIP\"),\n    [SPECIES_SKIPLOOM] = _(\"SKIPLOOM\"),\n    [SPECIES_JUMPLUFF] = _(\"JUMPLUFF\"),\n    [SPECIES_AIPOM] = _(\"AIPOM\"),\n    [SPECIES_SUNKERN] = _(\"SUNKERN\"),\n    [SPECIES_SUNFLORA] = _(\"SUNFLORA\"),\n    [SPECIES_YANMA] = _(\"YANMA\"),\n    [SPECIES_WOOPER] = _(\"WOOPER\"),\n    [SPECIES_QUAGSIRE] = _(\"QUAGSIRE\"),\n    [SPECIES_ESPEON] = _(\"ESPEON\"),\n    [SPECIES_UMBREON] = _(\"UMBREON\"),\n    [SPECIES_MURKROW] = _(\"MURKROW\"),\n    [SPECIES_SLOWKING] = _(\"SLOWKING\"),\n    [SPECIES_MISDREAVUS] = _(\"MISDREAVUS\"),\n    [SPECIES_UNOWN] = _(\"UNOWN\"),\n    [SPECIES_WOBBUFFET] = _(\"WOBBUFFET\"),\n    [SPECIES_GIRAFARIG] = _(\"GIRAFARIG\"),\n    [SPECIES_PINECO] = _(\"PINECO\"),\n    [SPECIES_FORRETRESS] = _(\"FORRETRESS\"),\n    [SPECIES_DUNSPARCE] = _(\"DUNSPARCE\"),\n    [SPECIES_GLIGAR] = _(\"GLIGAR\"),\n    [SPECIES_STEELIX] = _(\"STEELIX\"),\n    [SPECIES_SNUBBULL] = _(\"SNUBBULL\"),\n    [SPECIES_GRANBULL] = _(\"GRANBULL\"),\n    [SPECIES_QWILFISH] = _(\"QWILFISH\"),\n    [SPECIES_SCIZOR] = _(\"SCIZOR\"),\n    [SPECIES_SHUCKLE] = _(\"SHUCKLE\"),\n    [SPECIES_HERACROSS] = _(\"HERACROSS\"),\n    [SPECIES_SNEASEL] = _(\"SNEASEL\"),\n    [SPECIES_TEDDIURSA] = _(\"TEDDIURSA\"),\n    [SPECIES_URSARING] = _(\"URSARING\"),\n    [SPECIES_SLUGMA] = _(\"SLUGMA\"),\n    [SPECIES_MAGCARGO] = _(\"MAGCARGO\"),\n    [SPECIES_SWINUB] = _(\"SWINUB\"),\n    [SPECIES_PILOSWINE] = _(\"PILOSWINE\"),\n    [SPECIES_CORSOLA] = _(\"CORSOLA\"),\n    [SPECIES_REMORAID] = _(\"REMORAID\"),\n    [SPECIES_OCTILLERY] = _(\"OCTILLERY\"),\n    [SPECIES_DELIBIRD] = _(\"DELIBIRD\"),\n    [SPECIES_MANTINE] = _(\"MANTINE\"),\n    [SPECIES_SKARMORY] = _(\"SKARMORY\"),\n    [SPECIES_HOUNDOUR] = _(\"HOUNDOUR\"),\n    [SPECIES_HOUNDOOM] = _(\"HOUNDOOM\"),\n    [SPECIES_KINGDRA] = _(\"KINGDRA\"),\n    [SPECIES_PHANPY] = _(\"PHANPY\"),\n    [SPECIES_DONPHAN] = _(\"DONPHAN\"),\n    [SPECIES_PORYGON2] = _(\"PORYGON2\"),\n    [SPECIES_STANTLER] = _(\"STANTLER\"),\n    [SPECIES_SMEARGLE] = _(\"SMEARGLE\"),\n    [SPECIES_TYROGUE] = _(\"TYROGUE\"),\n    [SPECIES_HITMONTOP] = _(\"HITMONTOP\"),\n    [SPECIES_SMOOCHUM] = _(\"SMOOCHUM\"),\n    [SPECIES_ELEKID] = _(\"ELEKID\"),\n    [SPECIES_MAGBY] = _(\"MAGBY\"),\n    [SPECIES_MILTANK] = _(\"MILTANK\"),\n    [SPECIES_BLISSEY] = _(\"BLISSEY\"),\n    [SPECIES_RAIKOU] = _(\"RAIKOU\"),\n    [SPECIES_ENTEI] = _(\"ENTEI\"),\n    [SPECIES_SUICUNE] = _(\"SUICUNE\"),\n    [SPECIES_LARVITAR] = _(\"LARVITAR\"),\n    [SPECIES_PUPITAR] = _(\"PUPITAR\"),\n    [SPECIES_TYRANITAR] = _(\"TYRANITAR\"),\n    [SPECIES_LUGIA] = _(\"LUGIA\"),\n    [SPECIES_HO_OH] = _(\"HO-OH\"),\n    [SPECIES_CELEBI] = _(\"CELEBI\"),\n    [SPECIES_OLD_UNOWN_B] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_C] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_D] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_E] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_F] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_G] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_H] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_I] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_J] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_K] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_L] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_M] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_N] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_O] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_P] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_Q] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_R] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_S] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_T] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_U] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_V] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_W] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_X] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_Y] = _(\"?\"),\n    [SPECIES_OLD_UNOWN_Z] = _(\"?\"),\n    [SPECIES_TREECKO] = _(\"TREECKO\"),\n    [SPECIES_GROVYLE] = _(\"GROVYLE\"),\n    [SPECIES_SCEPTILE] = _(\"SCEPTILE\"),\n    [SPECIES_TORCHIC] = _(\"TORCHIC\"),\n    [SPECIES_COMBUSKEN] = _(\"COMBUSKEN\"),\n    [SPECIES_BLAZIKEN] = _(\"BLAZIKEN\"),\n    [SPECIES_MUDKIP] = _(\"MUDKIP\"),\n    [SPECIES_MARSHTOMP] = _(\"MARSHTOMP\"),\n    [SPECIES_SWAMPERT] = _(\"SWAMPERT\"),\n    [SPECIES_POOCHYENA] = _(\"POOCHYENA\"),\n    [SPECIES_MIGHTYENA] = _(\"MIGHTYENA\"),\n    [SPECIES_ZIGZAGOON] = _(\"ZIGZAGOON\"),\n    [SPECIES_LINOONE] = _(\"LINOONE\"),\n    [SPECIES_WURMPLE] = _(\"WURMPLE\"),\n    [SPECIES_SILCOON] = _(\"SILCOON\"),\n    [SPECIES_BEAUTIFLY] = _(\"BEAUTIFLY\"),\n    [SPECIES_CASCOON] = _(\"CASCOON\"),\n    [SPECIES_DUSTOX] = _(\"DUSTOX\"),\n    [SPECIES_LOTAD] = _(\"LOTAD\"),\n    [SPECIES_LOMBRE] = _(\"LOMBRE\"),\n    [SPECIES_LUDICOLO] = _(\"LUDICOLO\"),\n    [SPECIES_SEEDOT] = _(\"SEEDOT\"),\n    [SPECIES_NUZLEAF] = _(\"NUZLEAF\"),\n    [SPECIES_SHIFTRY] = _(\"SHIFTRY\"),\n    [SPECIES_NINCADA] = _(\"NINCADA\"),\n    [SPECIES_NINJASK] = _(\"NINJASK\"),\n    [SPECIES_SHEDINJA] = _(\"SHEDINJA\"),\n    [SPECIES_TAILLOW] = _(\"TAILLOW\"),\n    [SPECIES_SWELLOW] = _(\"SWELLOW\"),\n    [SPECIES_SHROOMISH] = _(\"SHROOMISH\"),\n    [SPECIES_BRELOOM] = _(\"BRELOOM\"),\n    [SPECIES_SPINDA] = _(\"SPINDA\"),\n    [SPECIES_WINGULL] = _(\"WINGULL\"),\n    [SPECIES_PELIPPER] = _(\"PELIPPER\"),\n    [SPECIES_SURSKIT] = _(\"SURSKIT\"),\n    [SPECIES_MASQUERAIN] = _(\"MASQUERAIN\"),\n    [SPECIES_WAILMER] = _(\"WAILMER\"),\n    [SPECIES_WAILORD] = _(\"WAILORD\"),\n    [SPECIES_SKITTY] = _(\"SKITTY\"),\n    [SPECIES_DELCATTY] = _(\"DELCATTY\"),\n    [SPECIES_KECLEON] = _(\"KECLEON\"),\n    [SPECIES_BALTOY] = _(\"BALTOY\"),\n    [SPECIES_CLAYDOL] = _(\"CLAYDOL\"),\n    [SPECIES_NOSEPASS] = _(\"NOSEPASS\"),\n    [SPECIES_TORKOAL] = _(\"TORKOAL\"),\n    [SPECIES_SABLEYE] = _(\"SABLEYE\"),\n    [SPECIES_BARBOACH] = _(\"BARBOACH\"),\n    [SPECIES_WHISCASH] = _(\"WHISCASH\"),\n    [SPECIES_LUVDISC] = _(\"LUVDISC\"),\n    [SPECIES_CORPHISH] = _(\"CORPHISH\"),\n    [SPECIES_CRAWDAUNT] = _(\"CRAWDAUNT\"),\n    [SPECIES_FEEBAS] = _(\"FEEBAS\"),\n    [SPECIES_MILOTIC] = _(\"MILOTIC\"),\n    [SPECIES_CARVANHA] = _(\"CARVANHA\"),\n    [SPECIES_SHARPEDO] = _(\"SHARPEDO\"),\n    [SPECIES_TRAPINCH] = _(\"TRAPINCH\"),\n    [SPECIES_VIBRAVA] = _(\"VIBRAVA\"),\n    [SPECIES_FLYGON] = _(\"FLYGON\"),\n    [SPECIES_MAKUHITA] = _(\"MAKUHITA\"),\n    [SPECIES_HARIYAMA] = _(\"HARIYAMA\"),\n    [SPECIES_ELECTRIKE] = _(\"ELECTRIKE\"),\n    [SPECIES_MANECTRIC] = _(\"MANECTRIC\"),\n    [SPECIES_NUMEL] = _(\"NUMEL\"),\n    [SPECIES_CAMERUPT] = _(\"CAMERUPT\"),\n    [SPECIES_SPHEAL] = _(\"SPHEAL\"),\n    [SPECIES_SEALEO] = _(\"SEALEO\"),\n    [SPECIES_WALREIN] = _(\"WALREIN\"),\n    [SPECIES_CACNEA] = _(\"CACNEA\"),\n    [SPECIES_CACTURNE] = _(\"CACTURNE\"),\n    [SPECIES_SNORUNT] = _(\"SNORUNT\"),\n    [SPECIES_GLALIE] = _(\"GLALIE\"),\n    [SPECIES_LUNATONE] = _(\"LUNATONE\"),\n    [SPECIES_SOLROCK] = _(\"SOLROCK\"),\n    [SPECIES_AZURILL] = _(\"AZURILL\"),\n    [SPECIES_SPOINK] = _(\"SPOINK\"),\n    [SPECIES_GRUMPIG] = _(\"GRUMPIG\"),\n    [SPECIES_PLUSLE] = _(\"PLUSLE\"),\n    [SPECIES_MINUN] = _(\"MINUN\"),\n    [SPECIES_MAWILE] = _(\"MAWILE\"),\n    [SPECIES_MEDITITE] = _(\"MEDITITE\"),\n    [SPECIES_MEDICHAM] = _(\"MEDICHAM\"),\n    [SPECIES_SWABLU] = _(\"SWABLU\"),\n    [SPECIES_ALTARIA] = _(\"ALTARIA\"),\n    [SPECIES_WYNAUT] = _(\"WYNAUT\"),\n    [SPECIES_DUSKULL] = _(\"DUSKULL\"),\n    [SPECIES_DUSCLOPS] = _(\"DUSCLOPS\"),\n    [SPECIES_ROSELIA] = _(\"ROSELIA\"),\n    [SPECIES_SLAKOTH] = _(\"SLAKOTH\"),\n    [SPECIES_VIGOROTH] = _(\"VIGOROTH\"),\n    [SPECIES_SLAKING] = _(\"SLAKING\"),\n    [SPECIES_GULPIN] = _(\"GULPIN\"),\n    [SPECIES_SWALOT] = _(\"SWALOT\"),\n    [SPECIES_TROPIUS] = _(\"TROPIUS\"),\n    [SPECIES_WHISMUR] = _(\"WHISMUR\"),\n    [SPECIES_LOUDRED] = _(\"LOUDRED\"),\n    [SPECIES_EXPLOUD] = _(\"EXPLOUD\"),\n    [SPECIES_CLAMPERL] = _(\"CLAMPERL\"),\n    [SPECIES_HUNTAIL] = _(\"HUNTAIL\"),\n    [SPECIES_GOREBYSS] = _(\"GOREBYSS\"),\n    [SPECIES_ABSOL] = _(\"ABSOL\"),\n    [SPECIES_SHUPPET] = _(\"SHUPPET\"),\n    [SPECIES_BANETTE] = _(\"BANETTE\"),\n    [SPECIES_SEVIPER] = _(\"SEVIPER\"),\n    [SPECIES_ZANGOOSE] = _(\"ZANGOOSE\"),\n    [SPECIES_RELICANTH] = _(\"RELICANTH\"),\n    [SPECIES_ARON] = _(\"ARON\"),\n    [SPECIES_LAIRON] = _(\"LAIRON\"),\n    [SPECIES_AGGRON] = _(\"AGGRON\"),\n    [SPECIES_CASTFORM] = _(\"CASTFORM\"),\n    [SPECIES_VOLBEAT] = _(\"VOLBEAT\"),\n    [SPECIES_ILLUMISE] = _(\"ILLUMISE\"),\n    [SPECIES_LILEEP] = _(\"LILEEP\"),\n    [SPECIES_CRADILY] = _(\"CRADILY\"),\n    [SPECIES_ANORITH] = _(\"ANORITH\"),\n    [SPECIES_ARMALDO] = _(\"ARMALDO\"),\n    [SPECIES_RALTS] = _(\"RALTS\"),\n    [SPECIES_KIRLIA] = _(\"KIRLIA\"),\n    [SPECIES_GARDEVOIR] = _(\"GARDEVOIR\"),\n    [SPECIES_BAGON] = _(\"BAGON\"),\n    [SPECIES_SHELGON] = _(\"SHELGON\"),\n    [SPECIES_SALAMENCE] = _(\"SALAMENCE\"),\n    [SPECIES_BELDUM] = _(\"BELDUM\"),\n    [SPECIES_METANG] = _(\"METANG\"),\n    [SPECIES_METAGROSS] = _(\"METAGROSS\"),\n    [SPECIES_REGIROCK] = _(\"REGIROCK\"),\n    [SPECIES_REGICE] = _(\"REGICE\"),\n    [SPECIES_REGISTEEL] = _(\"REGISTEEL\"),\n    [SPECIES_KYOGRE] = _(\"KYOGRE\"),\n    [SPECIES_GROUDON] = _(\"GROUDON\"),\n    [SPECIES_RAYQUAZA] = _(\"RAYQUAZA\"),\n    [SPECIES_LATIAS] = _(\"LATIAS\"),\n    [SPECIES_LATIOS] = _(\"LATIOS\"),\n    [SPECIES_JIRACHI] = _(\"JIRACHI\"),\n    [SPECIES_DEOXYS] = _(\"DEOXYS\"),\n    [SPECIES_CHIMECHO] = _(\"CHIMECHO\"),\n};\n"
  },
  {
    "path": "src/data/text/teachy_tv.h",
    "content": "const u8 gTeachyTvString_TeachBattle[] = _(\"Teach me how to battle.\");\nconst u8 gTeachyTvString_StatusProblems[] = _(\"What are status problems?\");\nconst u8 gTeachyTvString_TypeMatchups[] = _(\"What are type matchups?\");\nconst u8 gTeachyTvString_CatchPkmn[] = _(\"I want to catch POKéMON.\");\nconst u8 gTeachyTvString_AboutTMs[] = _(\"Teach me about TMs.\");\nconst u8 gTeachyTvString_RegisterItem[] = _(\"How do I register an item?\");\nconst u8 gTeachyTvString_Cancel[] = _(\"CANCEL\");\nconst u8 gTeachyTvText_PokedudeSaysHello[] = _(\n    \"Hey, all you TRAINERS out there!\\n\"\n    \"HELLO, TRAINERS!\\p\"\n    \"……… ……… ………\\p\"\n    \"Come on, let me hear you!\\n\"\n    \"HELLO, TRAINERS!\\l\"\n    \"It's me, the POKé DUDE!\\p\");\nconst u8 gTeachyTvText_BattleScript1[] = _(\n    \"Today, the POKé DUDE's here to\\n\"\n    \"tell you about how you can battle\\l\"\n    \"POKéMON!\\p\"\n    \"Say you're out for a stroll when,\\n\"\n    \"suddenly, a wild POKéMON appears!\\p\"\n    \"It's up to you to smartly use your\\n\"\n    \"POKéMON and their moves to reduce\\l\"\n    \"the opponent's HP to nothing, and\\l\"\n    \"claim victory!\\p\"\n    \"I'll show you how to do that in\\n\"\n    \"person and for sure!\\p\"\n    \"All righty, here goes!\\p\"\n    \"Keep your eyes glued to the super\\n\"\n    \"POKé DUDE SHOW!\");\nconst u8 gTeachyTvText_BattleScript2[] = _(\n    \"Well, did you get that?\\p\"\n    \"Even if your own POKéMON's HP\\n\"\n    \"falls to zero, and it becomes\\l\"\n    \"unable to battle, not to worry!\\p\"\n    \"Just take it to any POKéMON\\n\"\n    \"CENTER and heal it!\\p\"\n    \"All righty, be seeing you!\\p\"\n    \"Remember, TRAINERS, a good deed\\n\"\n    \"a day brings happiness to stay!\");\nconst u8 gTeachyTvText_StatusScript1[] = _(\n    \"Today, the POKé DUDE's here to\\n\"\n    \"tell you about status problems!\\p\"\n    \"Status problems include poisoning,\\n\"\n    \"paralysis, sleep, burn…\\p\"\n    \"There are a couple others, but\\n\"\n    \"they really are trouble.\\p\"\n    \"Get any one, and your POKéMON\\n\"\n    \"may become useless in battle.\\p\"\n    \"You know, it hurts the POKé DUDE\\n\"\n    \"to see a POKéMON suffer…\\p\"\n    \"So, what should you do if your\\n\"\n    \"POKéMON gets a status problem?\\p\"\n    \"Well, you've got me to show you!\\p\"\n    \"All righty, here goes!\\p\"\n    \"Keep your eyes glued to the super\\n\"\n    \"POKé DUDE SHOW!\");\nconst u8 gTeachyTvText_StatusScript2[] = _(\n    \"Poisoning or paralysis don't go\\n\"\n    \"away after a battle.\\p\"\n    \"If a POKéMON is poisoned, it loses\\n\"\n    \"HP even while you're walking.\\p\"\n    \"You should heal POKéMON of these\\n\"\n    \"kinds of problems right away.\\p\"\n    \"Use an item, or try to get to a\\n\"\n    \"POKéMON CENTER for healing.\\p\"\n    \"That wasn't hard, was it?\\n\"\n    \"All righty, be seeing you!\\p\"\n    \"Remember, TRAINERS, a good deed\\n\"\n    \"a day brings happiness to stay!\");\nconst u8 gTeachyTvText_MatchupsScript1[] = _(\n    \"Does everyone know about type\\n\"\n    \"matchups?\\p\"\n    \"POKéMON and their moves all\\n\"\n    \"belong to certain types.\\p\"\n    \"For example, there are such types\\n\"\n    \"as GRASS and WATER.\\p\"\n    \"You need to consider the type of\\n\"\n    \"the move used to attack…\\p\"\n    \"And, the type of the POKéMON that\\n\"\n    \"is hit by that attack.\\p\"\n    \"Depending on how those two types\\n\"\n    \"match up, the damage can change.\\p\"\n    \"You see, it depends on whether\\n\"\n    \"the type matchup is good or bad.\\p\"\n    \"If you don't know how matchups\\n\"\n    \"work, battles will be tough.\\p\"\n    \"So, let me demonstrate exactly\\n\"\n    \"what I mean.\\p\"\n    \"All righty, here goes!\\p\"\n    \"Keep your eyes glued to the super\\n\"\n    \"POKé DUDE SHOW!\");\nconst u8 gTeachyTvText_MatchupsScript2[] = _(\n    \"Is it possible to launch an attack\\n\"\n    \"that will inflict heavy damage?\\p\"\n    \"Does the opposing POKéMON pose\\n\"\n    \"a threat to your POKéMON?\\p\"\n    \"Is there any chance that it may\\n\"\n    \"have disastrously tough moves?\\p\"\n    \"Watch the type matchups to gain\\n\"\n    \"the upper hand!\\p\"\n    \"All righty, be seeing you!\\p\"\n    \"Oh, for the COOL-type POKé DUDE,\\n\"\n    \"AWESOME-type kids like you match\\l\"\n    \"up perfectly!\\p\"\n    \"Remember, a good deed a day\\n\"\n    \"brings happiness to stay!\");\nconst u8 gTeachyTvText_CatchingScript1[] = _(\n    \"Today, the POKé DUDE's going to\\n\"\n    \"show you how to catch POKéMON!\\p\"\n    \"Just imagine… A groovy POKéMON\\n\"\n    \"suddenly appearing in the wild!\\p\"\n    \"Oh, you want it!\\n\"\n    \"You just can't help it!\\p\"\n    \"Oh, you have to catch it!\\n\"\n    \"You gotta have it!\\p\"\n    \"Let me show you how you can make\\n\"\n    \"it happen!\\p\"\n    \"All righty, here goes!\\p\"\n    \"Keep your eyes glued to the super\\n\"\n    \"POKé DUDE SHOW!\");\nconst u8 gTeachyTvText_CatchingScript2[] = _(\n    \"If your first POKé BALL fails to\\n\"\n    \"catch the POKéMON, don't give up!\\p\"\n    \"Keep throwing POKé BALLS…\\n\"\n    \"It's bound to work sometime!\\p\"\n    \"All righty, be seeing you!\\p\"\n    \"Remember, TRAINERS, a good deed\\n\"\n    \"a day brings happiness to stay!\");\nconst u8 gTeachyTvText_TMsScript1[] = _(\n    \"Hey, everyone!\\n\"\n    \"Do you all have TMs?\\p\"\n    \"A TM, Technical Machine, is an\\n\"\n    \"amazingly great item!\\p\"\n    \"It teaches POKéMON a move that\\n\"\n    \"it may not learn when leveling up!\\p\"\n    \"Isn't that just great? What a\\n\"\n    \"convenient world we live in!\\p\"\n    \"Open the TM CASE and check out\\n\"\n    \"the TMs you have.\\p\"\n    \"You can check them out in detail,\\n\"\n    \"too.\");\nconst u8 gPokedudeText_TMTypes[] = _(\n    \"POKé DUDE: NORMAL, WATER, GRASS…\\n\"\n    \"TMs also come in types.\\p\"\n    \"Check the type and teach it to\\n\"\n    \"a POKéMON that matches up well.\\p\"\n    \"For example, WATER PULSE is\\n\"\n    \"suitable for WATER-type POKéMON.\\p\"\n    \"BULLET SEED is a move that most\\n\"\n    \"GRASS-type POKéMON can learn.\\p\"\n    \"There's one other thing!\");\nconst u8 gPokedudeText_ReadTMDescription[] = _(\n    \"Don't just look at the type, read\\n\"\n    \"the description, too.\\p\"\n    \"It will contain hints about what\\n\"\n    \"POKéMON might learn the move.\\p\"\n    \"For example, take a move like\\n\"\n    \"FOCUS PUNCH.\\p\"\n    \"It doesn't sound like anything a\\n\"\n    \"bird or fish POKéMON can learn.\\p\"\n    \"So, try using it on POKéMON with\\n\"\n    \"arms that can throw punches!\");\nconst u8 gTeachyTvText_TMsScript2[] = _(\n    \"Wow, I talked a lot today!\\n\"\n    \"All righty, be seeing you!\\p\"\n    \"Remember, TRAINERS, a good deed\\n\"\n    \"a day brings happiness to stay!\");\nconst u8 gTeachyTvText_RegisterScript1[] = _(\n    \"A TRAINER's BAG has a bunch of\\n\"\n    \"nifty, convenient features!\\p\"\n    \"Take stuff in the KEY ITEMS\\n\"\n    \"POCKET, for instance.\\p\"\n    \"You can use a key item without\\n\"\n    \"opening the BAG every time.\\p\"\n    \"For example, let's pretend I have\\n\"\n    \"a TEACHY TV in my BAG.\\p\"\n    \"I can register it for instant use,\\n\"\n    \"and I'll show you how!\\p\"\n    \"All righty, here goes!\\p\"\n    \"Keep your eyes glued to the sorta\\n\"\n    \"super POKé DUDE SHOW!\");\nconst u8 gTeachyTvText_RegisterScript2[] = _(\n    \"And now, your TEACHY TV is\\n\"\n    \"registered.\\p\"\n    \"How do you use it?\\n\"\n    \"Well, here's how it works.\\p\"\n    \"Once an item in the KEY ITEMS\\n\"\n    \"POCKET is registered, you can use\\l\"\n    \"it by pressing SELECT.\\p\"\n    \"So, you've given yourself\\n\"\n    \"one-touch access to TEACHY TV.\\p\"\n    \"All it takes for you to see me is\\n\"\n    \"pressing one button!\\p\"\n    \"That kind of attention is a little\\n\"\n    \"embarrassing!\\p\"\n    \"All righty, be seeing you!\\p\"\n    \"Remember, TRAINERS, a good deed\\n\"\n    \"a day brings happiness to stay!\");\n"
  },
  {
    "path": "src/data/text/trainer_class_names.h",
    "content": "const u8 gTrainerClassNames[][13] = {\n    [TRAINER_CLASS_NONE]                = _(\"{PKMN} TRAINER\"),\n    [TRAINER_CLASS_PKMN_TRAINER_UNUSED] = _(\"{PKMN} TRAINER\"),\n    [TRAINER_CLASS_AQUA_LEADER]         = _(\"AQUA LEADER\"),\n    [TRAINER_CLASS_TEAM_AQUA]           = _(\"TEAM AQUA\"),\n    [TRAINER_CLASS_RS_AROMA_LADY]       = _(\"AROMA LADY\"),\n    [TRAINER_CLASS_RS_RUIN_MANIAC]      = _(\"RUIN MANIAC\"),\n    [TRAINER_CLASS_INTERVIEWER]         = _(\"INTERVIEWER\"),\n    [TRAINER_CLASS_RS_TUBER_F]          = _(\"TUBER\"),\n    [TRAINER_CLASS_RS_TUBER_M]          = _(\"TUBER\"),\n    [TRAINER_CLASS_RS_COOLTRAINER]      = _(\"COOLTRAINER\"),\n    [TRAINER_CLASS_HEX_MANIAC]          = _(\"HEX MANIAC\"),\n    [TRAINER_CLASS_RS_LADY]             = _(\"LADY\"),\n    [TRAINER_CLASS_RS_BEAUTY]           = _(\"BEAUTY\"),\n    [TRAINER_CLASS_RICH_BOY]            = _(\"RICH BOY\"),\n    [TRAINER_CLASS_RS_POKEMANIAC]       = _(\"POKéMANIAC\"),\n    [TRAINER_CLASS_RS_SWIMMER_M]        = _(\"SWIMMER♂\"),\n    [TRAINER_CLASS_RS_BLACK_BELT]       = _(\"BLACK BELT\"),\n    [TRAINER_CLASS_GUITARIST]           = _(\"GUITARIST\"),\n    [TRAINER_CLASS_KINDLER]             = _(\"KINDLER\"),\n    [TRAINER_CLASS_RS_CAMPER]           = _(\"CAMPER\"),\n    [TRAINER_CLASS_BUG_MANIAC]          = _(\"BUG MANIAC\"),\n    [TRAINER_CLASS_RS_PSYCHIC]          = _(\"PSYCHIC\"),\n    [TRAINER_CLASS_RS_GENTLEMAN]        = _(\"GENTLEMAN\"),\n    [TRAINER_CLASS_RS_ELITE_FOUR]       = _(\"ELITE FOUR\"),\n    [TRAINER_CLASS_RS_LEADER]           = _(\"LEADER\"),\n    [TRAINER_CLASS_SCHOOL_KID]          = _(\"SCHOOL KID\"),\n    [TRAINER_CLASS_SR_AND_JR]           = _(\"SR. AND JR.\"),\n    [TRAINER_CLASS_POKEFAN]             = _(\"POKéFAN\"),\n    [TRAINER_CLASS_EXPERT]              = _(\"EXPERT\"),\n    [TRAINER_CLASS_RS_YOUNGSTER]        = _(\"YOUNGSTER\"),\n    [TRAINER_CLASS_RS_CHAMPION]         = _(\"CHAMPION\"),\n    [TRAINER_CLASS_RS_FISHERMAN]        = _(\"FISHERMAN\"),\n    [TRAINER_CLASS_TRIATHLETE]          = _(\"TRIATHLETE\"),\n    [TRAINER_CLASS_DRAGON_TAMER]        = _(\"DRAGON TAMER\"),\n    [TRAINER_CLASS_RS_BIRD_KEEPER]      = _(\"BIRD KEEPER\"),\n    [TRAINER_CLASS_NINJA_BOY]           = _(\"NINJA BOY\"),\n    [TRAINER_CLASS_BATTLE_GIRL]         = _(\"BATTLE GIRL\"),\n    [TRAINER_CLASS_PARASOL_LADY]        = _(\"PARASOL LADY\"),\n    [TRAINER_CLASS_RS_SWIMMER_F]        = _(\"SWIMMER♀\"),\n    [TRAINER_CLASS_RS_PICNICKER]        = _(\"PICNICKER\"),\n    [TRAINER_CLASS_RS_TWINS]            = _(\"TWINS\"),\n    [TRAINER_CLASS_RS_SAILOR]           = _(\"SAILOR\"),\n    [TRAINER_CLASS_BOARDER]             = _(\"BOARDER\"),\n    [TRAINER_CLASS_COLLECTOR]           = _(\"COLLECTOR\"),\n    [TRAINER_CLASS_PKMN_TRAINER]        = _(\"{PKMN} TRAINER\"),\n    [TRAINER_CLASS_RS_PKMN_BREEDER]     = _(\"{PKMN} BREEDER\"),\n    [TRAINER_CLASS_RS_PKMN_RANGER]      = _(\"{PKMN} RANGER\"),\n    [TRAINER_CLASS_MAGMA_LEADER]        = _(\"MAGMA LEADER\"),\n    [TRAINER_CLASS_TEAM_MAGMA]          = _(\"TEAM MAGMA\"),\n    [TRAINER_CLASS_RS_LASS]             = _(\"LASS\"),\n    [TRAINER_CLASS_RS_BUG_CATCHER]      = _(\"BUG CATCHER\"),\n    [TRAINER_CLASS_RS_HIKER]            = _(\"HIKER\"),\n    [TRAINER_CLASS_RS_YOUNG_COUPLE]     = _(\"YOUNG COUPLE\"),\n    [TRAINER_CLASS_OLD_COUPLE]          = _(\"OLD COUPLE\"),\n    [TRAINER_CLASS_RS_SIS_AND_BRO]      = _(\"SIS AND BRO\"),\n    [TRAINER_CLASS_AQUA_ADMIN]          = _(\"AQUA ADMIN\"),\n    [TRAINER_CLASS_MAGMA_ADMIN]         = _(\"MAGMA ADMIN\"),\n    [TRAINER_CLASS_YOUNGSTER]           = _(\"YOUNGSTER\"),\n    [TRAINER_CLASS_BUG_CATCHER]         = _(\"BUG CATCHER\"),\n    [TRAINER_CLASS_LASS]                = _(\"LASS\"),\n    [TRAINER_CLASS_SAILOR]              = _(\"SAILOR\"),\n    [TRAINER_CLASS_CAMPER]              = _(\"CAMPER\"),\n    [TRAINER_CLASS_PICNICKER]           = _(\"PICNICKER\"),\n    [TRAINER_CLASS_POKEMANIAC]          = _(\"POKéMANIAC\"),\n    [TRAINER_CLASS_SUPER_NERD]          = _(\"SUPER NERD\"),\n    [TRAINER_CLASS_HIKER]               = _(\"HIKER\"),\n    [TRAINER_CLASS_BIKER]               = _(\"BIKER\"),\n    [TRAINER_CLASS_BURGLAR]             = _(\"BURGLAR\"),\n    [TRAINER_CLASS_ENGINEER]            = _(\"ENGINEER\"),\n    [TRAINER_CLASS_FISHERMAN]           = _(\"FISHERMAN\"),\n    [TRAINER_CLASS_SWIMMER_M]           = _(\"SWIMMER♂\"),\n    [TRAINER_CLASS_CUE_BALL]            = _(\"CUE BALL\"),\n    [TRAINER_CLASS_GAMER]               = _(\"GAMER\"),\n    [TRAINER_CLASS_BEAUTY]              = _(\"BEAUTY\"),\n    [TRAINER_CLASS_SWIMMER_F]           = _(\"SWIMMER♀\"),\n    [TRAINER_CLASS_PSYCHIC]             = _(\"PSYCHIC\"),\n    [TRAINER_CLASS_ROCKER]              = _(\"ROCKER\"),\n    [TRAINER_CLASS_JUGGLER]             = _(\"JUGGLER\"),\n    [TRAINER_CLASS_TAMER]               = _(\"TAMER\"),\n    [TRAINER_CLASS_BIRD_KEEPER]         = _(\"BIRD KEEPER\"),\n    [TRAINER_CLASS_BLACK_BELT]          = _(\"BLACK BELT\"),\n    [TRAINER_CLASS_RIVAL_EARLY]         = _(\"RIVAL\"),\n    [TRAINER_CLASS_SCIENTIST]           = _(\"SCIENTIST\"),\n    [TRAINER_CLASS_BOSS]                = _(\"BOSS\"),\n    [TRAINER_CLASS_LEADER]              = _(\"LEADER\"),\n    [TRAINER_CLASS_TEAM_ROCKET]         = _(\"TEAM ROCKET\"),\n    [TRAINER_CLASS_COOLTRAINER]         = _(\"COOLTRAINER\"),\n    [TRAINER_CLASS_ELITE_FOUR]          = _(\"ELITE FOUR\"),\n    [TRAINER_CLASS_GENTLEMAN]           = _(\"GENTLEMAN\"),\n    [TRAINER_CLASS_RIVAL_LATE]          = _(\"RIVAL\"),\n    [TRAINER_CLASS_CHAMPION]            = _(\"CHAMPION\"),\n    [TRAINER_CLASS_CHANNELER]           = _(\"CHANNELER\"),\n    [TRAINER_CLASS_TWINS]               = _(\"TWINS\"),\n    [TRAINER_CLASS_COOL_COUPLE]         = _(\"COOL COUPLE\"),\n    [TRAINER_CLASS_YOUNG_COUPLE]        = _(\"YOUNG COUPLE\"),\n    [TRAINER_CLASS_CRUSH_KIN]           = _(\"CRUSH KIN\"),\n    [TRAINER_CLASS_SIS_AND_BRO]         = _(\"SIS AND BRO\"),\n    [TRAINER_CLASS_PKMN_PROF]           = _(\"{PKMN} PROF.\"),\n    [TRAINER_CLASS_PLAYER]              = _(\"PLAYER\"),\n    [TRAINER_CLASS_CRUSH_GIRL]          = _(\"CRUSH GIRL\"),\n    [TRAINER_CLASS_TUBER]               = _(\"TUBER\"),\n    [TRAINER_CLASS_PKMN_BREEDER]        = _(\"{PKMN} BREEDER\"),\n    [TRAINER_CLASS_PKMN_RANGER]         = _(\"{PKMN} RANGER\"),\n    [TRAINER_CLASS_AROMA_LADY]          = _(\"AROMA LADY\"),\n    [TRAINER_CLASS_RUIN_MANIAC]         = _(\"RUIN MANIAC\"),\n    [TRAINER_CLASS_LADY]                = _(\"LADY\"),\n    [TRAINER_CLASS_PAINTER]             = _(\"PAINTER\"),\n};\n"
  },
  {
    "path": "src/data/tilesets/graphics.h",
    "content": "const u32 gTilesetTiles_PalletTown[] = INCBIN_U32(\"data/tilesets/secondary/pallet_town/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_PalletTown[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pallet_town/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_ViridianCity[] = INCBIN_U32(\"data/tilesets/secondary/viridian_city/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_ViridianCity[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_city/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_PewterCity[] = INCBIN_U32(\"data/tilesets/secondary/pewter_city/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_PewterCity[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_city/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_CeruleanCity[] = INCBIN_U32(\"data/tilesets/secondary/cerulean_city/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_CeruleanCity[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_city/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_LavenderTown[] = INCBIN_U32(\"data/tilesets/secondary/lavender_town/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_LavenderTown[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lavender_town/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_VermilionCity[] = INCBIN_U32(\"data/tilesets/secondary/vermilion_city/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_VermilionCity[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_city/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_CeladonCity[] = INCBIN_U32(\"data/tilesets/secondary/celadon_city/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_CeladonCity[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_city/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_FuchsiaCity[] = INCBIN_U32(\"data/tilesets/secondary/fuchsia_city/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_FuchsiaCity[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_city/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_CinnabarIsland[] = INCBIN_U32(\"data/tilesets/secondary/cinnabar_island/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_CinnabarIsland[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_island/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_IndigoPlateau[] = INCBIN_U32(\"data/tilesets/secondary/indigo_plateau/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_IndigoPlateau[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/indigo_plateau/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_SaffronCity[] = INCBIN_U32(\"data/tilesets/secondary/saffron_city/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_SaffronCity[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_city/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_Building[] = INCBIN_U32(\"data/tilesets/primary/building/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_Building[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/primary/building/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_Mart[] = INCBIN_U32(\"data/tilesets/secondary/mart/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_Mart[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mart/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_PokemonCenter[] = INCBIN_U32(\"data/tilesets/secondary/pokemon_center/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_PokemonCenter[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_center/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_Cave[] = INCBIN_U32(\"data/tilesets/secondary/cave/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_Cave[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cave/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_Dummy1[] = INCBIN_U32(\"data/tilesets/secondary/dummy_1/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_Dummy1[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_1/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_Museum[] = INCBIN_U32(\"data/tilesets/secondary/museum/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_Museum[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/museum/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_CableClub[] = INCBIN_U32(\"data/tilesets/secondary/cable_club/tiles.4bpp\");\n\nconst u16 gTilesetPalettes_CableClub[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cable_club/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_BikeShop[] = INCBIN_U32(\"data/tilesets/secondary/bike_shop/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_BikeShop[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/bike_shop/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_Lab[] = INCBIN_U32(\"data/tilesets/secondary/lab/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_Lab[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/lab/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_HoennBuilding[] = INCBIN_U32(\"data/tilesets/secondary/hoenn_building/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_HoennBuilding[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hoenn_building/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_GameCorner[] = INCBIN_U32(\"data/tilesets/secondary/game_corner/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_GameCorner[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/game_corner/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_PewterGym[] = INCBIN_U32(\"data/tilesets/secondary/pewter_gym/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_PewterGym[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pewter_gym/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_CeruleanGym[] = INCBIN_U32(\"data/tilesets/secondary/cerulean_gym/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_CeruleanGym[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_gym/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_VermilionGym[] = INCBIN_U32(\"data/tilesets/secondary/vermilion_gym/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_VermilionGym[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/vermilion_gym/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_CeladonGym[] = INCBIN_U32(\"data/tilesets/secondary/celadon_gym/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_CeladonGym[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/celadon_gym/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_FuchsiaGym[] = INCBIN_U32(\"data/tilesets/secondary/fuchsia_gym/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_FuchsiaGym[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_SaffronGym[] = INCBIN_U32(\"data/tilesets/secondary/saffron_gym/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_SaffronGym[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/saffron_gym/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_CinnabarGym[] = INCBIN_U32(\"data/tilesets/secondary/cinnabar_gym/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_CinnabarGym[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_ViridianGym[] = INCBIN_U32(\"data/tilesets/secondary/viridian_gym/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_ViridianGym[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_gym/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_SSAnne[] = INCBIN_U32(\"data/tilesets/secondary/ss_anne/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_SSAnne[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/ss_anne/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_Dummy2[] = INCBIN_U32(\"data/tilesets/secondary/dummy_2/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_Dummy2[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_2/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_ViridianForest[] = INCBIN_U32(\"data/tilesets/secondary/viridian_forest/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_ViridianForest[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/viridian_forest/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_UnusedGatehouse1[] = INCBIN_U32(\"data/tilesets/secondary/unused_gatehouse_1/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_UnusedGatehouse1[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_RockTunnel[] = INCBIN_U32(\"data/tilesets/secondary/rock_tunnel/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_RockTunnel[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/rock_tunnel/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_DiglettsCave[] = INCBIN_U32(\"data/tilesets/secondary/digletts_cave/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_DiglettsCave[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/digletts_cave/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_SeafoamIslands[] = INCBIN_U32(\"data/tilesets/secondary/seafoam_islands/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_SeafoamIslands[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seafoam_islands/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_UnusedGatehouse2[] = INCBIN_U32(\"data/tilesets/secondary/unused_gatehouse_2/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_UnusedGatehouse2[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_CeruleanCave[] = INCBIN_U32(\"data/tilesets/secondary/cerulean_cave/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_CeruleanCave[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/cerulean_cave/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_GenericBuilding2[] = INCBIN_U32(\"data/tilesets/secondary/generic_building_2/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_GenericBuilding2[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/generic_building_2/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_PowerPlant[] = INCBIN_U32(\"data/tilesets/secondary/power_plant/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_PowerPlant[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/power_plant/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_SeaCottage[] = INCBIN_U32(\"data/tilesets/secondary/sea_cottage/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_SeaCottage[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sea_cottage/palettes/15.gbapal\"),\n};\n\n// Shared by SilphCo\nconst u32 gTilesetTiles_Condominiums[] = INCBIN_U32(\"data/tilesets/secondary/condominiums/tiles.4bpp.lz\");\n\n// Shared by SilphCo\nconst u16 gTilesetPalettes_Condominiums[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/condominiums/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_UndergroundPath[] = INCBIN_U32(\"data/tilesets/secondary/underground_path/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_UndergroundPath[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underground_path/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_PokemonTower[] = INCBIN_U32(\"data/tilesets/secondary/pokemon_tower/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_PokemonTower[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_tower/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_SafariZoneBuilding[] = INCBIN_U32(\"data/tilesets/secondary/safari_zone_building/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_SafariZoneBuilding[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/safari_zone_building/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_PokemonMansion[] = INCBIN_U32(\"data/tilesets/secondary/pokemon_mansion/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_PokemonMansion[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_RestaurantHotel[] = INCBIN_U32(\"data/tilesets/secondary/restaurant_hotel/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_RestaurantHotel[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_School[] = INCBIN_U32(\"data/tilesets/secondary/school/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_School[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/school/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_FanClubDaycare[] = INCBIN_U32(\"data/tilesets/secondary/fan_club_daycare/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_FanClubDaycare[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_BurgledHouse[] = INCBIN_U32(\"data/tilesets/secondary/burgled_house/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_BurgledHouse[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/burgled_house/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_Dummy3[] = INCBIN_U32(\"data/tilesets/secondary/dummy_3/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_Dummy3[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_3/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_Dummy4[] = INCBIN_U32(\"data/tilesets/secondary/dummy_4/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_Dummy4[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/dummy_4/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_MtEmber[] = INCBIN_U32(\"data/tilesets/secondary/mt_ember/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_MtEmber[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/mt_ember/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_BerryForest[] = INCBIN_U32(\"data/tilesets/secondary/berry_forest/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_BerryForest[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/berry_forest/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_NavelRock[] = INCBIN_U32(\"data/tilesets/secondary/navel_rock/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_NavelRock[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/navel_rock/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_TanobyRuins[] = INCBIN_U32(\"data/tilesets/secondary/tanoby_ruins/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_TanobyRuins[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_SeviiIslands123[] = INCBIN_U32(\"data/tilesets/secondary/sevii_islands_123/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_SeviiIslands123[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_SeviiIslands45[] = INCBIN_U32(\"data/tilesets/secondary/sevii_islands_45/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_SeviiIslands45[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_SeviiIslands67[] = INCBIN_U32(\"data/tilesets/secondary/sevii_islands_67/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_SeviiIslands67[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_TrainerTower[] = INCBIN_U32(\"data/tilesets/secondary/trainer_tower/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_TrainerTower[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/trainer_tower/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_IslandHarbor[] = INCBIN_U32(\"data/tilesets/secondary/island_harbor/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_IslandHarbor[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/island_harbor/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_PokemonLeague[] = INCBIN_U32(\"data/tilesets/secondary/pokemon_league/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_PokemonLeague[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/pokemon_league/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_HallOfFame[] = INCBIN_U32(\"data/tilesets/secondary/hall_of_fame/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_HallOfFame[][16] =\n{\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/12.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/13.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/14.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/hall_of_fame/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_Underwater[] = INCBIN_U32(\"data/tilesets/secondary/underwater/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_Underwater[][16] = \n{\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/underwater/palettes/12.gbapal\"),\n};\n\nconst u32 gTilesetTiles_BattleFrontierOutsideWest[] = INCBIN_U32(\"data/tilesets/secondary/battlefrontieroutsidewest/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_BattleFrontierOutsideWest[][16] = \n{\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/palettes/12.gbapal\"),\n};\n\nconst u32 gTilesetTiles_BattleFrontierOutsideEast[] = INCBIN_U32(\"data/tilesets/secondary/battlefrontieroutsideeast/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_BattleFrontierOutsideEast[][16] = \n{\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/palettes/12.gbapal\"),\n};\n\nconst u32 gTilesetTiles_BattleFrontier[] = INCBIN_U32(\"data/tilesets/secondary/battlefrontier/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_BattleFrontier[][16] = \n{\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontier/palettes/12.gbapal\"),\n};\n\nconst u32 gTilesetTiles_SeviiIslands5[] = INCBIN_U32(\"data/tilesets/secondary/seviiislands5/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_SeviiIslands5[][16] = \n{\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands5/palettes/12.gbapal\"),\n};\n\nconst u32 gTilesetTiles_SeviiIslands6[] = INCBIN_U32(\"data/tilesets/secondary/seviiislands6/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_SeviiIslands6[][16] = \n{\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/seviiislands6/palettes/12.gbapal\"),\n};\n\nconst u32 gTilesetTiles_BattleFrontierRankingHall[] = INCBIN_U32(\"data/tilesets/secondary/battlefrontierrankinghall/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_BattleFrontierRankingHall[][16] = \n{\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/00.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/01.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/02.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/03.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/04.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/05.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/06.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/07.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/08.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/09.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/10.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/11.gbapal\"),\n\tINCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/palettes/12.gbapal\"),\n};\n"
  },
  {
    "path": "src/data/tilesets/headers.h",
    "content": "\nconst struct Tileset gTileset_General = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = FALSE,\n\t.tiles = gTilesetTiles_General,\n\t.palettes = gTilesetPalettes_General,\n\t.metatiles = gMetatiles_General,\n\t.metatileAttributes = gMetatileAttributes_General,\n\t.callback = InitTilesetAnim_General\n};\n\nconst struct Tileset gTileset_PalletTown = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_PalletTown,\n\t.palettes = gTilesetPalettes_PalletTown,\n\t.metatiles = gMetatiles_PalletTown,\n\t.metatileAttributes = gMetatileAttributes_PalletTown,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_ViridianCity = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_ViridianCity,\n\t.palettes = gTilesetPalettes_ViridianCity,\n\t.metatiles = gMetatiles_ViridianCity,\n\t.metatileAttributes = gMetatileAttributes_ViridianCity,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_PewterCity = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_PewterCity,\n\t.palettes = gTilesetPalettes_PewterCity,\n\t.metatiles = gMetatiles_PewterCity,\n\t.metatileAttributes = gMetatileAttributes_PewterCity,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_CeruleanCity = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_CeruleanCity,\n\t.palettes = gTilesetPalettes_CeruleanCity,\n\t.metatiles = gMetatiles_CeruleanCity,\n\t.metatileAttributes = gMetatileAttributes_CeruleanCity,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_LavenderTown = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_LavenderTown,\n\t.palettes = gTilesetPalettes_LavenderTown,\n\t.metatiles = gMetatiles_LavenderTown,\n\t.metatileAttributes = gMetatileAttributes_LavenderTown,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_VermilionCity = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_VermilionCity,\n\t.palettes = gTilesetPalettes_VermilionCity,\n\t.metatiles = gMetatiles_VermilionCity,\n\t.metatileAttributes = gMetatileAttributes_VermilionCity,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_CeladonCity = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_CeladonCity,\n\t.palettes = gTilesetPalettes_CeladonCity,\n\t.metatiles = gMetatiles_CeladonCity,\n\t.metatileAttributes = gMetatileAttributes_CeladonCity,\n\t.callback = InitTilesetAnim_CeladonCity\n};\n\nconst struct Tileset gTileset_FuchsiaCity = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_FuchsiaCity,\n\t.palettes = gTilesetPalettes_FuchsiaCity,\n\t.metatiles = gMetatiles_FuchsiaCity,\n\t.metatileAttributes = gMetatileAttributes_FuchsiaCity,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_CinnabarIsland = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_CinnabarIsland,\n\t.palettes = gTilesetPalettes_CinnabarIsland,\n\t.metatiles = gMetatiles_CinnabarIsland,\n\t.metatileAttributes = gMetatileAttributes_CinnabarIsland,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_IndigoPlateau = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_IndigoPlateau,\n\t.palettes = gTilesetPalettes_IndigoPlateau,\n\t.metatiles = gMetatiles_IndigoPlateau,\n\t.metatileAttributes = gMetatileAttributes_IndigoPlateau,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_SaffronCity = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_SaffronCity,\n\t.palettes = gTilesetPalettes_SaffronCity,\n\t.metatiles = gMetatiles_SaffronCity,\n\t.metatileAttributes = gMetatileAttributes_SaffronCity,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_Building = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = FALSE,\n\t.tiles = gTilesetTiles_Building,\n\t.palettes = gTilesetPalettes_Building,\n\t.metatiles = gMetatiles_Building,\n\t.metatileAttributes = gMetatileAttributes_Building,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_Mart = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_Mart,\n\t.palettes = gTilesetPalettes_Mart,\n\t.metatiles = gMetatiles_Mart,\n\t.metatileAttributes = gMetatileAttributes_Mart,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_PokemonCenter = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_PokemonCenter,\n\t.palettes = gTilesetPalettes_PokemonCenter,\n\t.metatiles = gMetatiles_PokemonCenter,\n\t.metatileAttributes = gMetatileAttributes_PokemonCenter,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_Cave = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_Cave,\n\t.palettes = gTilesetPalettes_Cave,\n\t.metatiles = gMetatiles_Cave,\n\t.metatileAttributes = gMetatileAttributes_Cave,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_Dummy1 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_Dummy1,\n\t.palettes = gTilesetPalettes_Dummy1,\n\t.metatiles = gMetatiles_Dummy1,\n\t.metatileAttributes = gMetatileAttributes_Dummy1,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_Museum = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_Museum,\n\t.palettes = gTilesetPalettes_Museum,\n\t.metatiles = gMetatiles_Museum,\n\t.metatileAttributes = gMetatileAttributes_Museum,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_CableClub = \n{\n\t.isCompressed = FALSE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_CableClub,\n\t.palettes = gTilesetPalettes_CableClub,\n\t.metatiles = gMetatiles_CableClub,\n\t.metatileAttributes = gMetatileAttributes_CableClub,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_BikeShop = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_BikeShop,\n\t.palettes = gTilesetPalettes_BikeShop,\n\t.metatiles = gMetatiles_BikeShop,\n\t.metatileAttributes = gMetatileAttributes_BikeShop,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_GenericBuilding1 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_GenericBuilding1,\n\t.palettes = gTilesetPalettes_GenericBuilding1,\n\t.metatiles = gMetatiles_GenericBuilding1,\n\t.metatileAttributes = gMetatileAttributes_GenericBuilding1,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_Lab = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_Lab,\n\t.palettes = gTilesetPalettes_Lab,\n\t.metatiles = gMetatiles_Lab,\n\t.metatileAttributes = gMetatileAttributes_Lab,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_FuchsiaGym = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_FuchsiaGym,\n\t.palettes = gTilesetPalettes_FuchsiaGym,\n\t.metatiles = gMetatiles_FuchsiaGym,\n\t.metatileAttributes = gMetatileAttributes_FuchsiaGym,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_ViridianGym = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_ViridianGym,\n\t.palettes = gTilesetPalettes_ViridianGym,\n\t.metatiles = gMetatiles_ViridianGym,\n\t.metatileAttributes = gMetatileAttributes_ViridianGym,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_HoennBuilding = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_HoennBuilding,\n\t.palettes = gTilesetPalettes_HoennBuilding,\n\t.metatiles = gMetatiles_HoennBuilding,\n\t.metatileAttributes = gMetatileAttributes_HoennBuilding,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_GameCorner = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_GameCorner,\n\t.palettes = gTilesetPalettes_GameCorner,\n\t.metatiles = gMetatiles_GameCorner,\n\t.metatileAttributes = gMetatileAttributes_GameCorner,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_PewterGym = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_PewterGym,\n\t.palettes = gTilesetPalettes_PewterGym,\n\t.metatiles = gMetatiles_PewterGym,\n\t.metatileAttributes = gMetatileAttributes_PewterGym,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_CeruleanGym = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_CeruleanGym,\n\t.palettes = gTilesetPalettes_CeruleanGym,\n\t.metatiles = gMetatiles_CeruleanGym,\n\t.metatileAttributes = gMetatileAttributes_CeruleanGym,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_VermilionGym = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_VermilionGym,\n\t.palettes = gTilesetPalettes_VermilionGym,\n\t.metatiles = gMetatiles_VermilionGym,\n\t.metatileAttributes = gMetatileAttributes_VermilionGym,\n\t.callback = InitTilesetAnim_VermilionGym\n};\n\nconst struct Tileset gTileset_CeladonGym = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_CeladonGym,\n\t.palettes = gTilesetPalettes_CeladonGym,\n\t.metatiles = gMetatiles_CeladonGym,\n\t.metatileAttributes = gMetatileAttributes_CeladonGym,\n\t.callback = InitTilesetAnim_CeladonGym\n};\n\nconst struct Tileset gTileset_SaffronGym = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_SaffronGym,\n\t.palettes = gTilesetPalettes_SaffronGym,\n\t.metatiles = gMetatiles_SaffronGym,\n\t.metatileAttributes = gMetatileAttributes_SaffronGym,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_CinnabarGym = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_CinnabarGym,\n\t.palettes = gTilesetPalettes_CinnabarGym,\n\t.metatiles = gMetatiles_CinnabarGym,\n\t.metatileAttributes = gMetatileAttributes_CinnabarGym,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_SSAnne = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_SSAnne,\n\t.palettes = gTilesetPalettes_SSAnne,\n\t.metatiles = gMetatiles_SSAnne,\n\t.metatileAttributes = gMetatileAttributes_SSAnne,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_Dummy2 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_Dummy2,\n\t.palettes = gTilesetPalettes_Dummy2,\n\t.metatiles = gMetatiles_Dummy2,\n\t.metatileAttributes = gMetatileAttributes_Dummy2,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_ViridianForest = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_ViridianForest,\n\t.palettes = gTilesetPalettes_ViridianForest,\n\t.metatiles = gMetatiles_ViridianForest,\n\t.metatileAttributes = gMetatileAttributes_ViridianForest,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_UnusedGatehouse1 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_UnusedGatehouse1,\n\t.palettes = gTilesetPalettes_UnusedGatehouse1,\n\t.metatiles = gMetatiles_UnusedGatehouse1,\n\t.metatileAttributes = gMetatileAttributes_UnusedGatehouse1,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_RockTunnel = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_RockTunnel,\n\t.palettes = gTilesetPalettes_RockTunnel,\n\t.metatiles = gMetatiles_RockTunnel,\n\t.metatileAttributes = gMetatileAttributes_RockTunnel,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_DiglettsCave = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_DiglettsCave,\n\t.palettes = gTilesetPalettes_DiglettsCave,\n\t.metatiles = gMetatiles_DiglettsCave,\n\t.metatileAttributes = gMetatileAttributes_DiglettsCave,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_SeafoamIslands = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_SeafoamIslands,\n\t.palettes = gTilesetPalettes_SeafoamIslands,\n\t.metatiles = gMetatiles_SeafoamIslands,\n\t.metatileAttributes = gMetatileAttributes_SeafoamIslands,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_UnusedGatehouse2 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_UnusedGatehouse2,\n\t.palettes = gTilesetPalettes_UnusedGatehouse2,\n\t.metatiles = gMetatiles_UnusedGatehouse2,\n\t.metatileAttributes = gMetatileAttributes_UnusedGatehouse2,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_CeruleanCave = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_CeruleanCave,\n\t.palettes = gTilesetPalettes_CeruleanCave,\n\t.metatiles = gMetatiles_CeruleanCave,\n\t.metatileAttributes = gMetatileAttributes_CeruleanCave,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_DepartmentStore = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_DepartmentStore,\n\t.palettes = gTilesetPalettes_DepartmentStore,\n\t.metatiles = gMetatiles_DepartmentStore,\n\t.metatileAttributes = gMetatileAttributes_DepartmentStore,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_GenericBuilding2 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_GenericBuilding2,\n\t.palettes = gTilesetPalettes_GenericBuilding2,\n\t.metatiles = gMetatiles_GenericBuilding2,\n\t.metatileAttributes = gMetatileAttributes_GenericBuilding2,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_PowerPlant = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_PowerPlant,\n\t.palettes = gTilesetPalettes_PowerPlant,\n\t.metatiles = gMetatiles_PowerPlant,\n\t.metatileAttributes = gMetatileAttributes_PowerPlant,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_SeaCottage = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_SeaCottage,\n\t.palettes = gTilesetPalettes_SeaCottage,\n\t.metatiles = gMetatiles_SeaCottage,\n\t.metatileAttributes = gMetatileAttributes_SeaCottage,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_SilphCo = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_Condominiums,\n\t.palettes = gTilesetPalettes_Condominiums,\n\t.metatiles = gMetatiles_SilphCo,\n\t.metatileAttributes = gMetatileAttributes_SilphCo,\n\t.callback = InitTilesetAnim_SilphCo\n};\n\nconst struct Tileset gTileset_UndergroundPath = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_UndergroundPath,\n\t.palettes = gTilesetPalettes_UndergroundPath,\n\t.metatiles = gMetatiles_UndergroundPath,\n\t.metatileAttributes = gMetatileAttributes_UndergroundPath,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_PokemonTower = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_PokemonTower,\n\t.palettes = gTilesetPalettes_PokemonTower,\n\t.metatiles = gMetatiles_PokemonTower,\n\t.metatileAttributes = gMetatileAttributes_PokemonTower,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_SafariZoneBuilding = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_SafariZoneBuilding,\n\t.palettes = gTilesetPalettes_SafariZoneBuilding,\n\t.metatiles = gMetatiles_SafariZoneBuilding,\n\t.metatileAttributes = gMetatileAttributes_SafariZoneBuilding,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_PokemonMansion = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_PokemonMansion,\n\t.palettes = gTilesetPalettes_PokemonMansion,\n\t.metatiles = gMetatiles_PokemonMansion,\n\t.metatileAttributes = gMetatileAttributes_PokemonMansion,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_RestaurantHotel = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_RestaurantHotel,\n\t.palettes = gTilesetPalettes_RestaurantHotel,\n\t.metatiles = gMetatiles_RestaurantHotel,\n\t.metatileAttributes = gMetatileAttributes_RestaurantHotel,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_School = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_School,\n\t.palettes = gTilesetPalettes_School,\n\t.metatiles = gMetatiles_School,\n\t.metatileAttributes = gMetatileAttributes_School,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_FanClubDaycare = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_FanClubDaycare,\n\t.palettes = gTilesetPalettes_FanClubDaycare,\n\t.metatiles = gMetatiles_FanClubDaycare,\n\t.metatileAttributes = gMetatileAttributes_FanClubDaycare,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_Condominiums = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_Condominiums,\n\t.palettes = gTilesetPalettes_Condominiums,\n\t.metatiles = gMetatiles_Condominiums,\n\t.metatileAttributes = gMetatileAttributes_Condominiums,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_BurgledHouse = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_BurgledHouse,\n\t.palettes = gTilesetPalettes_BurgledHouse,\n\t.metatiles = gMetatiles_BurgledHouse,\n\t.metatileAttributes = gMetatileAttributes_BurgledHouse,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_Dummy3 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_Dummy3,\n\t.palettes = gTilesetPalettes_Dummy3,\n\t.metatiles = gMetatiles_Dummy3,\n\t.metatileAttributes = gMetatileAttributes_Dummy3,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_Dummy4 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_Dummy4,\n\t.palettes = gTilesetPalettes_Dummy4,\n\t.metatiles = gMetatiles_Dummy4,\n\t.metatileAttributes = gMetatileAttributes_Dummy4,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_MtEmber = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_MtEmber,\n\t.palettes = gTilesetPalettes_MtEmber,\n\t.metatiles = gMetatiles_MtEmber,\n\t.metatileAttributes = gMetatileAttributes_MtEmber,\n\t.callback = InitTilesetAnim_MtEmber\n};\n\nconst struct Tileset gTileset_BerryForest = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_BerryForest,\n\t.palettes = gTilesetPalettes_BerryForest,\n\t.metatiles = gMetatiles_BerryForest,\n\t.metatileAttributes = gMetatileAttributes_BerryForest,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_NavelRock = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_NavelRock,\n\t.palettes = gTilesetPalettes_NavelRock,\n\t.metatiles = gMetatiles_NavelRock,\n\t.metatileAttributes = gMetatileAttributes_NavelRock,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_TanobyRuins = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_TanobyRuins,\n\t.palettes = gTilesetPalettes_TanobyRuins,\n\t.metatiles = gMetatiles_TanobyRuins,\n\t.metatileAttributes = gMetatileAttributes_TanobyRuins,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_SeviiIslands123 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_SeviiIslands123,\n\t.palettes = gTilesetPalettes_SeviiIslands123,\n\t.metatiles = gMetatiles_SeviiIslands123,\n\t.metatileAttributes = gMetatileAttributes_SeviiIslands123,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_SeviiIslands45 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_SeviiIslands45,\n\t.palettes = gTilesetPalettes_SeviiIslands45,\n\t.metatiles = gMetatiles_SeviiIslands45,\n\t.metatileAttributes = gMetatileAttributes_SeviiIslands45,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_SeviiIslands67 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_SeviiIslands67,\n\t.palettes = gTilesetPalettes_SeviiIslands67,\n\t.metatiles = gMetatiles_SeviiIslands67,\n\t.metatileAttributes = gMetatileAttributes_SeviiIslands67,\n\t.callback = InitTilesetAnim_SeviiIslands67\n};\n\nconst struct Tileset gTileset_TrainerTower = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_TrainerTower,\n\t.palettes = gTilesetPalettes_TrainerTower,\n\t.metatiles = gMetatiles_TrainerTower,\n\t.metatileAttributes = gMetatileAttributes_TrainerTower,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_IslandHarbor = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_IslandHarbor,\n\t.palettes = gTilesetPalettes_IslandHarbor,\n\t.metatiles = gMetatiles_IslandHarbor,\n\t.metatileAttributes = gMetatileAttributes_IslandHarbor,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_PokemonLeague = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_PokemonLeague,\n\t.palettes = gTilesetPalettes_PokemonLeague,\n\t.metatiles = gMetatiles_PokemonLeague,\n\t.metatileAttributes = gMetatileAttributes_PokemonLeague,\n\t.callback = 0x0\n};\n\nconst struct Tileset gTileset_HallOfFame = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_HallOfFame,\n\t.palettes = gTilesetPalettes_HallOfFame,\n\t.metatiles = gMetatiles_HallOfFame,\n\t.metatileAttributes = gMetatileAttributes_HallOfFame,\n\t.callback = 0x0\n};\n\n\nconst struct Tileset gTileset_Underwater = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_Underwater,\n\t.palettes = gTilesetPalettes_Underwater,\n\t.metatiles = gMetatiles_Underwater,\n\t.metatileAttributes = gMetatileAttributes_Underwater,\n\t.callback = InitTilesetAnim_Underwater\n};\n\nconst struct Tileset gTileset_BattleFrontierOutsideWest = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_BattleFrontierOutsideWest,\n\t.palettes = gTilesetPalettes_BattleFrontierOutsideWest,\n\t.metatiles = gMetatiles_BattleFrontierOutsideWest,\n\t.metatileAttributes = gMetatileAttributes_BattleFrontierOutsideWest,\n\t.callback = InitTilesetAnim_BattleFrontierOutsideWest\n};\n\nconst struct Tileset gTileset_BattleFrontierOutsideEast = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_BattleFrontierOutsideEast,\n\t.palettes = gTilesetPalettes_BattleFrontierOutsideEast,\n\t.metatiles = gMetatiles_BattleFrontierOutsideEast,\n\t.metatileAttributes = gMetatileAttributes_BattleFrontierOutsideEast,\n\t.callback = InitTilesetAnim_BattleFrontierOutsideEast\n};\n\nconst struct Tileset gTileset_BattleFrontier = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_BattleFrontier,\n\t.palettes = gTilesetPalettes_BattleFrontier,\n\t.metatiles = gMetatiles_BattleFrontier,\n\t.metatileAttributes = gMetatileAttributes_BattleFrontier,\n\t.callback = NULL\n};\n\nconst struct Tileset gTileset_SeviiIslands5 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_SeviiIslands5,\n\t.palettes = gTilesetPalettes_SeviiIslands5,\n\t.metatiles = gMetatiles_SeviiIslands5,\n\t.metatileAttributes = gMetatileAttributes_SeviiIslands5,\n\t.callback = InitTilesetAnim_SeviiIslands5\n};\n\nconst struct Tileset gTileset_SeviiIslands6 = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_SeviiIslands6,\n\t.palettes = gTilesetPalettes_SeviiIslands6,\n\t.metatiles = gMetatiles_SeviiIslands6,\n\t.metatileAttributes = gMetatileAttributes_SeviiIslands6,\n\t.callback = NULL\n};\n\nconst struct Tileset gTileset_BattleFrontierRankingHall = \n{\n\t.isCompressed = TRUE,\n\t.isSecondary = TRUE,\n\t.tiles = gTilesetTiles_BattleFrontierRankingHall,\n\t.palettes = gTilesetPalettes_BattleFrontierRankingHall,\n\t.metatiles = gMetatiles_BattleFrontierRankingHall,\n\t.metatileAttributes = gMetatileAttributes_BattleFrontierRankingHall,\n\t.callback = NULL\n};\n"
  },
  {
    "path": "src/data/tilesets/metatiles.h",
    "content": "const u16 gMetatiles_General[] = INCBIN_U16(\"data/tilesets/primary/general/metatiles.bin\");\nconst u32 gMetatileAttributes_General[] = INCBIN_U32(\"data/tilesets/primary/general/metatile_attributes.bin\");\n\nconst u16 gMetatiles_PalletTown[] = INCBIN_U16(\"data/tilesets/secondary/pallet_town/metatiles.bin\");\nconst u32 gMetatileAttributes_PalletTown[] = INCBIN_U32(\"data/tilesets/secondary/pallet_town/metatile_attributes.bin\");\n\nconst u16 gMetatiles_ViridianCity[] = INCBIN_U16(\"data/tilesets/secondary/viridian_city/metatiles.bin\");\nconst u32 gMetatileAttributes_ViridianCity[] = INCBIN_U32(\"data/tilesets/secondary/viridian_city/metatile_attributes.bin\");\n\nconst u16 gMetatiles_PewterCity[] = INCBIN_U16(\"data/tilesets/secondary/pewter_city/metatiles.bin\");\nconst u32 gMetatileAttributes_PewterCity[] = INCBIN_U32(\"data/tilesets/secondary/pewter_city/metatile_attributes.bin\");\n\nconst u16 gMetatiles_CeruleanCity[] = INCBIN_U16(\"data/tilesets/secondary/cerulean_city/metatiles.bin\");\nconst u32 gMetatileAttributes_CeruleanCity[] = INCBIN_U32(\"data/tilesets/secondary/cerulean_city/metatile_attributes.bin\");\n\nconst u16 gMetatiles_LavenderTown[] = INCBIN_U16(\"data/tilesets/secondary/lavender_town/metatiles.bin\");\nconst u32 gMetatileAttributes_LavenderTown[] = INCBIN_U32(\"data/tilesets/secondary/lavender_town/metatile_attributes.bin\");\n\nconst u16 gMetatiles_VermilionCity[] = INCBIN_U16(\"data/tilesets/secondary/vermilion_city/metatiles.bin\");\nconst u32 gMetatileAttributes_VermilionCity[] = INCBIN_U32(\"data/tilesets/secondary/vermilion_city/metatile_attributes.bin\");\n\nconst u16 gMetatiles_CeladonCity[] = INCBIN_U16(\"data/tilesets/secondary/celadon_city/metatiles.bin\");\nconst u32 gMetatileAttributes_CeladonCity[] = INCBIN_U32(\"data/tilesets/secondary/celadon_city/metatile_attributes.bin\");\n\nconst u16 gMetatiles_FuchsiaCity[] = INCBIN_U16(\"data/tilesets/secondary/fuchsia_city/metatiles.bin\");\nconst u32 gMetatileAttributes_FuchsiaCity[] = INCBIN_U32(\"data/tilesets/secondary/fuchsia_city/metatile_attributes.bin\");\n\nconst u16 gMetatiles_CinnabarIsland[] = INCBIN_U16(\"data/tilesets/secondary/cinnabar_island/metatiles.bin\");\nconst u32 gMetatileAttributes_CinnabarIsland[] = INCBIN_U32(\"data/tilesets/secondary/cinnabar_island/metatile_attributes.bin\");\n\nconst u16 gMetatiles_IndigoPlateau[] = INCBIN_U16(\"data/tilesets/secondary/indigo_plateau/metatiles.bin\");\nconst u32 gMetatileAttributes_IndigoPlateau[] = INCBIN_U32(\"data/tilesets/secondary/indigo_plateau/metatile_attributes.bin\");\n\nconst u16 gMetatiles_SaffronCity[] = INCBIN_U16(\"data/tilesets/secondary/saffron_city/metatiles.bin\");\nconst u32 gMetatileAttributes_SaffronCity[] = INCBIN_U32(\"data/tilesets/secondary/saffron_city/metatile_attributes.bin\");\n\nconst u16 gMetatiles_PewterGym[] = INCBIN_U16(\"data/tilesets/secondary/pewter_gym/metatiles.bin\");\nconst u32 gMetatileAttributes_PewterGym[] = INCBIN_U32(\"data/tilesets/secondary/pewter_gym/metatile_attributes.bin\");\n\nconst u16 gMetatiles_CeruleanGym[] = INCBIN_U16(\"data/tilesets/secondary/cerulean_gym/metatiles.bin\");\nconst u32 gMetatileAttributes_CeruleanGym[] = INCBIN_U32(\"data/tilesets/secondary/cerulean_gym/metatile_attributes.bin\");\n\nconst u16 gMetatiles_VermilionGym[] = INCBIN_U16(\"data/tilesets/secondary/vermilion_gym/metatiles.bin\");\nconst u32 gMetatileAttributes_VermilionGym[] = INCBIN_U32(\"data/tilesets/secondary/vermilion_gym/metatile_attributes.bin\");\n\nconst u16 gMetatiles_CeladonGym[] = INCBIN_U16(\"data/tilesets/secondary/celadon_gym/metatiles.bin\");\nconst u32 gMetatileAttributes_CeladonGym[] = INCBIN_U32(\"data/tilesets/secondary/celadon_gym/metatile_attributes.bin\");\n\nconst u16 gMetatiles_FuchsiaGym[] = INCBIN_U16(\"data/tilesets/secondary/fuchsia_gym/metatiles.bin\");\nconst u32 gMetatileAttributes_FuchsiaGym[] = INCBIN_U32(\"data/tilesets/secondary/fuchsia_gym/metatile_attributes.bin\");\n\nconst u16 gMetatiles_SaffronGym[] = INCBIN_U16(\"data/tilesets/secondary/saffron_gym/metatiles.bin\");\nconst u32 gMetatileAttributes_SaffronGym[] = INCBIN_U32(\"data/tilesets/secondary/saffron_gym/metatile_attributes.bin\");\n\nconst u16 gMetatiles_CinnabarGym[] = INCBIN_U16(\"data/tilesets/secondary/cinnabar_gym/metatiles.bin\");\nconst u32 gMetatileAttributes_CinnabarGym[] = INCBIN_U32(\"data/tilesets/secondary/cinnabar_gym/metatile_attributes.bin\");\n\nconst u16 gMetatiles_ViridianGym[] = INCBIN_U16(\"data/tilesets/secondary/viridian_gym/metatiles.bin\");\nconst u32 gMetatileAttributes_ViridianGym[] = INCBIN_U32(\"data/tilesets/secondary/viridian_gym/metatile_attributes.bin\");\n\nconst u16 gMetatiles_Building[] = INCBIN_U16(\"data/tilesets/primary/building/metatiles.bin\");\nconst u32 gMetatileAttributes_Building[] = INCBIN_U32(\"data/tilesets/primary/building/metatile_attributes.bin\");\n\nconst u16 gMetatiles_Dummy1[] = INCBIN_U16(\"data/tilesets/secondary/dummy_1/metatiles.bin\");\nconst u32 gMetatileAttributes_Dummy1[] = INCBIN_U32(\"data/tilesets/secondary/dummy_1/metatile_attributes.bin\");\n\nconst u16 gMetatiles_HoennBuilding[] = INCBIN_U16(\"data/tilesets/secondary/hoenn_building/metatiles.bin\");\nconst u32 gMetatileAttributes_HoennBuilding[] = INCBIN_U32(\"data/tilesets/secondary/hoenn_building/metatile_attributes.bin\");\n\nconst u16 gMetatiles_BikeShop[] = INCBIN_U16(\"data/tilesets/secondary/bike_shop/metatiles.bin\");\nconst u32 gMetatileAttributes_BikeShop[] = INCBIN_U32(\"data/tilesets/secondary/bike_shop/metatile_attributes.bin\");\n\nconst u16 gMetatiles_Mart[] = INCBIN_U16(\"data/tilesets/secondary/mart/metatiles.bin\");\nconst u32 gMetatileAttributes_Mart[] = INCBIN_U32(\"data/tilesets/secondary/mart/metatile_attributes.bin\");\n\nconst u16 gMetatiles_PokemonCenter[] = INCBIN_U16(\"data/tilesets/secondary/pokemon_center/metatiles.bin\");\nconst u32 gMetatileAttributes_PokemonCenter[] = INCBIN_U32(\"data/tilesets/secondary/pokemon_center/metatile_attributes.bin\");\n\nconst u16 gMetatiles_GenericBuilding1[] = INCBIN_U16(\"data/tilesets/secondary/generic_building_1/metatiles.bin\");\nconst u32 gMetatileAttributes_GenericBuilding1[] = INCBIN_U32(\"data/tilesets/secondary/generic_building_1/metatile_attributes.bin\");\n\nconst u16 gMetatiles_Cave[] = INCBIN_U16(\"data/tilesets/secondary/cave/metatiles.bin\");\nconst u32 gMetatileAttributes_Cave[] = INCBIN_U32(\"data/tilesets/secondary/cave/metatile_attributes.bin\");\n\nconst u16 gMetatiles_GameCorner[] = INCBIN_U16(\"data/tilesets/secondary/game_corner/metatiles.bin\");\nconst u32 gMetatileAttributes_GameCorner[] = INCBIN_U32(\"data/tilesets/secondary/game_corner/metatile_attributes.bin\");\n\nconst u16 gMetatiles_Lab[] = INCBIN_U16(\"data/tilesets/secondary/lab/metatiles.bin\");\nconst u32 gMetatileAttributes_Lab[] = INCBIN_U32(\"data/tilesets/secondary/lab/metatile_attributes.bin\");\n\nconst u16 gMetatiles_SSAnne[] = INCBIN_U16(\"data/tilesets/secondary/ss_anne/metatiles.bin\");\nconst u32 gMetatileAttributes_SSAnne[] = INCBIN_U32(\"data/tilesets/secondary/ss_anne/metatile_attributes.bin\");\n\nconst u16 gMetatiles_Dummy2[] = INCBIN_U16(\"data/tilesets/secondary/dummy_2/metatiles.bin\");\nconst u32 gMetatileAttributes_Dummy2[] = INCBIN_U32(\"data/tilesets/secondary/dummy_2/metatile_attributes.bin\");\n\nconst u16 gMetatiles_ViridianForest[] = INCBIN_U16(\"data/tilesets/secondary/viridian_forest/metatiles.bin\");\nconst u32 gMetatileAttributes_ViridianForest[] = INCBIN_U32(\"data/tilesets/secondary/viridian_forest/metatile_attributes.bin\");\n\nconst u16 gMetatiles_UnusedGatehouse1[] = INCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_1/metatiles.bin\");\nconst u32 gMetatileAttributes_UnusedGatehouse1[] = INCBIN_U32(\"data/tilesets/secondary/unused_gatehouse_1/metatile_attributes.bin\");\n\nconst u16 gMetatiles_RockTunnel[] = INCBIN_U16(\"data/tilesets/secondary/rock_tunnel/metatiles.bin\");\nconst u32 gMetatileAttributes_RockTunnel[] = INCBIN_U32(\"data/tilesets/secondary/rock_tunnel/metatile_attributes.bin\");\n\nconst u16 gMetatiles_DiglettsCave[] = INCBIN_U16(\"data/tilesets/secondary/digletts_cave/metatiles.bin\");\nconst u32 gMetatileAttributes_DiglettsCave[] = INCBIN_U32(\"data/tilesets/secondary/digletts_cave/metatile_attributes.bin\");\n\nconst u16 gMetatiles_SeafoamIslands[] = INCBIN_U16(\"data/tilesets/secondary/seafoam_islands/metatiles.bin\");\nconst u32 gMetatileAttributes_SeafoamIslands[] = INCBIN_U32(\"data/tilesets/secondary/seafoam_islands/metatile_attributes.bin\");\n\nconst u16 gMetatiles_UnusedGatehouse2[] = INCBIN_U16(\"data/tilesets/secondary/unused_gatehouse_2/metatiles.bin\");\nconst u32 gMetatileAttributes_UnusedGatehouse2[] = INCBIN_U32(\"data/tilesets/secondary/unused_gatehouse_2/metatile_attributes.bin\");\n\nconst u16 gMetatiles_CeruleanCave[] = INCBIN_U16(\"data/tilesets/secondary/cerulean_cave/metatiles.bin\");\nconst u32 gMetatileAttributes_CeruleanCave[] = INCBIN_U32(\"data/tilesets/secondary/cerulean_cave/metatile_attributes.bin\");\n\nconst u16 gMetatiles_DepartmentStore[] = INCBIN_U16(\"data/tilesets/secondary/department_store/metatiles.bin\");\nconst u32 gMetatileAttributes_DepartmentStore[] = INCBIN_U32(\"data/tilesets/secondary/department_store/metatile_attributes.bin\");\n\nconst u16 gMetatiles_GenericBuilding2[] = INCBIN_U16(\"data/tilesets/secondary/generic_building_2/metatiles.bin\");\nconst u32 gMetatileAttributes_GenericBuilding2[] = INCBIN_U32(\"data/tilesets/secondary/generic_building_2/metatile_attributes.bin\");\n\nconst u16 gMetatiles_PowerPlant[] = INCBIN_U16(\"data/tilesets/secondary/power_plant/metatiles.bin\");\nconst u32 gMetatileAttributes_PowerPlant[] = INCBIN_U32(\"data/tilesets/secondary/power_plant/metatile_attributes.bin\");\n\nconst u16 gMetatiles_SeaCottage[] = INCBIN_U16(\"data/tilesets/secondary/sea_cottage/metatiles.bin\");\nconst u32 gMetatileAttributes_SeaCottage[] = INCBIN_U32(\"data/tilesets/secondary/sea_cottage/metatile_attributes.bin\");\n\nconst u16 gMetatiles_SilphCo[] = INCBIN_U16(\"data/tilesets/secondary/silph_co/metatiles.bin\");\nconst u32 gMetatileAttributes_SilphCo[] = INCBIN_U32(\"data/tilesets/secondary/silph_co/metatile_attributes.bin\");\n\nconst u16 gMetatiles_UndergroundPath[] = INCBIN_U16(\"data/tilesets/secondary/underground_path/metatiles.bin\");\nconst u32 gMetatileAttributes_UndergroundPath[] = INCBIN_U32(\"data/tilesets/secondary/underground_path/metatile_attributes.bin\");\n\nconst u16 gMetatiles_PokemonTower[] = INCBIN_U16(\"data/tilesets/secondary/pokemon_tower/metatiles.bin\");\nconst u32 gMetatileAttributes_PokemonTower[] = INCBIN_U32(\"data/tilesets/secondary/pokemon_tower/metatile_attributes.bin\");\n\nconst u16 gMetatiles_SafariZoneBuilding[] = INCBIN_U16(\"data/tilesets/secondary/safari_zone_building/metatiles.bin\");\nconst u32 gMetatileAttributes_SafariZoneBuilding[] = INCBIN_U32(\"data/tilesets/secondary/safari_zone_building/metatile_attributes.bin\");\n\nconst u16 gMetatiles_PokemonMansion[] = INCBIN_U16(\"data/tilesets/secondary/pokemon_mansion/metatiles.bin\");\nconst u32 gMetatileAttributes_PokemonMansion[] = INCBIN_U32(\"data/tilesets/secondary/pokemon_mansion/metatile_attributes.bin\");\n\nconst u16 gMetatiles_Museum[] = INCBIN_U16(\"data/tilesets/secondary/museum/metatiles.bin\");\nconst u32 gMetatileAttributes_Museum[] = INCBIN_U32(\"data/tilesets/secondary/museum/metatile_attributes.bin\");\n\nconst u16 gMetatiles_CableClub[] = INCBIN_U16(\"data/tilesets/secondary/cable_club/metatiles.bin\");\nconst u32 gMetatileAttributes_CableClub[] = INCBIN_U32(\"data/tilesets/secondary/cable_club/metatile_attributes.bin\");\n\nconst u16 gMetatiles_RestaurantHotel[] = INCBIN_U16(\"data/tilesets/secondary/restaurant_hotel/metatiles.bin\");\nconst u32 gMetatileAttributes_RestaurantHotel[] = INCBIN_U32(\"data/tilesets/secondary/restaurant_hotel/metatile_attributes.bin\");\n\nconst u16 gMetatiles_School[] = INCBIN_U16(\"data/tilesets/secondary/school/metatiles.bin\");\nconst u32 gMetatileAttributes_School[] = INCBIN_U32(\"data/tilesets/secondary/school/metatile_attributes.bin\");\n\nconst u16 gMetatiles_FanClubDaycare[] = INCBIN_U16(\"data/tilesets/secondary/fan_club_daycare/metatiles.bin\");\nconst u32 gMetatileAttributes_FanClubDaycare[] = INCBIN_U32(\"data/tilesets/secondary/fan_club_daycare/metatile_attributes.bin\");\n\nconst u16 gMetatiles_Condominiums[] = INCBIN_U16(\"data/tilesets/secondary/condominiums/metatiles.bin\");\nconst u32 gMetatileAttributes_Condominiums[] = INCBIN_U32(\"data/tilesets/secondary/condominiums/metatile_attributes.bin\");\n\nconst u16 gMetatiles_BurgledHouse[] = INCBIN_U16(\"data/tilesets/secondary/burgled_house/metatiles.bin\");\nconst u32 gMetatileAttributes_BurgledHouse[] = INCBIN_U32(\"data/tilesets/secondary/burgled_house/metatile_attributes.bin\");\n\nconst u16 gMetatiles_Dummy3[] = INCBIN_U16(\"data/tilesets/secondary/dummy_3/metatiles.bin\");\nconst u32 gMetatileAttributes_Dummy3[] = INCBIN_U32(\"data/tilesets/secondary/dummy_3/metatile_attributes.bin\");\n\nconst u16 gMetatiles_Dummy4[] = INCBIN_U16(\"data/tilesets/secondary/dummy_4/metatiles.bin\");\nconst u32 gMetatileAttributes_Dummy4[] = INCBIN_U32(\"data/tilesets/secondary/dummy_4/metatile_attributes.bin\");\n\nconst u16 gMetatiles_MtEmber[] = INCBIN_U16(\"data/tilesets/secondary/mt_ember/metatiles.bin\");\nconst u32 gMetatileAttributes_MtEmber[] = INCBIN_U32(\"data/tilesets/secondary/mt_ember/metatile_attributes.bin\");\n\nconst u16 gMetatiles_BerryForest[] = INCBIN_U16(\"data/tilesets/secondary/berry_forest/metatiles.bin\");\nconst u32 gMetatileAttributes_BerryForest[] = INCBIN_U32(\"data/tilesets/secondary/berry_forest/metatile_attributes.bin\");\n\nconst u16 gMetatiles_NavelRock[] = INCBIN_U16(\"data/tilesets/secondary/navel_rock/metatiles.bin\");\nconst u32 gMetatileAttributes_NavelRock[] = INCBIN_U32(\"data/tilesets/secondary/navel_rock/metatile_attributes.bin\");\n\nconst u16 gMetatiles_TanobyRuins[] = INCBIN_U16(\"data/tilesets/secondary/tanoby_ruins/metatiles.bin\");\nconst u32 gMetatileAttributes_TanobyRuins[] = INCBIN_U32(\"data/tilesets/secondary/tanoby_ruins/metatile_attributes.bin\");\n\nconst u16 gMetatiles_SeviiIslands123[] = INCBIN_U16(\"data/tilesets/secondary/sevii_islands_123/metatiles.bin\");\nconst u32 gMetatileAttributes_SeviiIslands123[] = INCBIN_U32(\"data/tilesets/secondary/sevii_islands_123/metatile_attributes.bin\");\n\nconst u16 gMetatiles_SeviiIslands45[] = INCBIN_U16(\"data/tilesets/secondary/sevii_islands_45/metatiles.bin\");\nconst u32 gMetatileAttributes_SeviiIslands45[] = INCBIN_U32(\"data/tilesets/secondary/sevii_islands_45/metatile_attributes.bin\");\n\nconst u16 gMetatiles_SeviiIslands67[] = INCBIN_U16(\"data/tilesets/secondary/sevii_islands_67/metatiles.bin\");\nconst u32 gMetatileAttributes_SeviiIslands67[] = INCBIN_U32(\"data/tilesets/secondary/sevii_islands_67/metatile_attributes.bin\");\n\nconst u16 gMetatiles_TrainerTower[] = INCBIN_U16(\"data/tilesets/secondary/trainer_tower/metatiles.bin\");\nconst u32 gMetatileAttributes_TrainerTower[] = INCBIN_U32(\"data/tilesets/secondary/trainer_tower/metatile_attributes.bin\");\n\nconst u16 gMetatiles_IslandHarbor[] = INCBIN_U16(\"data/tilesets/secondary/island_harbor/metatiles.bin\");\nconst u32 gMetatileAttributes_IslandHarbor[] = INCBIN_U32(\"data/tilesets/secondary/island_harbor/metatile_attributes.bin\");\n\nconst u16 gMetatiles_PokemonLeague[] = INCBIN_U16(\"data/tilesets/secondary/pokemon_league/metatiles.bin\");\nconst u32 gMetatileAttributes_PokemonLeague[] = INCBIN_U32(\"data/tilesets/secondary/pokemon_league/metatile_attributes.bin\");\n\nconst u16 gMetatiles_HallOfFame[] = INCBIN_U16(\"data/tilesets/secondary/hall_of_fame/metatiles.bin\");\nconst u32 gMetatileAttributes_HallOfFame[] = INCBIN_U32(\"data/tilesets/secondary/hall_of_fame/metatile_attributes.bin\");\n\nconst u16 gMetatiles_Underwater[] = INCBIN_U16(\"data/tilesets/secondary/underwater/metatiles.bin\");\nconst u32 gMetatileAttributes_Underwater[] = INCBIN_U32(\"data/tilesets/secondary/underwater/metatile_attributes.bin\");\n\nconst u16 gMetatiles_BattleFrontierOutsideWest[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/metatiles.bin\");\nconst u32 gMetatileAttributes_BattleFrontierOutsideWest[] = INCBIN_U32(\"data/tilesets/secondary/battlefrontieroutsidewest/metatile_attributes.bin\");\n\nconst u16 gMetatiles_BattleFrontierOutsideEast[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/metatiles.bin\");\nconst u32 gMetatileAttributes_BattleFrontierOutsideEast[] = INCBIN_U32(\"data/tilesets/secondary/battlefrontieroutsideeast/metatile_attributes.bin\");\n\nconst u16 gMetatiles_BattleFrontier[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontier/metatiles.bin\");\nconst u32 gMetatileAttributes_BattleFrontier[] = INCBIN_U32(\"data/tilesets/secondary/battlefrontier/metatile_attributes.bin\");\n\nconst u16 gMetatiles_SeviiIslands5[] = INCBIN_U16(\"data/tilesets/secondary/seviiislands5/metatiles.bin\");\nconst u32 gMetatileAttributes_SeviiIslands5[] = INCBIN_U32(\"data/tilesets/secondary/seviiislands5/metatile_attributes.bin\");\n\nconst u16 gMetatiles_SeviiIslands6[] = INCBIN_U16(\"data/tilesets/secondary/seviiislands6/metatiles.bin\");\nconst u32 gMetatileAttributes_SeviiIslands6[] = INCBIN_U32(\"data/tilesets/secondary/seviiislands6/metatile_attributes.bin\");\n\nconst u16 gMetatiles_BattleFrontierRankingHall[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontierrankinghall/metatiles.bin\");\nconst u32 gMetatileAttributes_BattleFrontierRankingHall[] = INCBIN_U32(\"data/tilesets/secondary/battlefrontierrankinghall/metatile_attributes.bin\");\n"
  },
  {
    "path": "src/data/trainer_graphics/back_pic_anims.h",
    "content": "static const union AnimCmd sAnimCmd_Red_1[] = {\n    ANIMCMD_FRAME(1, 20),\n    ANIMCMD_FRAME(2, 6),\n    ANIMCMD_FRAME(3, 6),\n    ANIMCMD_FRAME(4, 24),\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Leaf_1[] = {\n    ANIMCMD_FRAME(1, 20),\n    ANIMCMD_FRAME(2, 6),\n    ANIMCMD_FRAME(3, 6),\n    ANIMCMD_FRAME(4, 24),\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Pokedude_1[] = {\n    ANIMCMD_FRAME(1, 24),\n    ANIMCMD_FRAME(2, 9),\n    ANIMCMD_FRAME(3, 24),\n    ANIMCMD_FRAME(0, 9),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_OldMan_1[] = {\n    ANIMCMD_FRAME(1, 24),\n    ANIMCMD_FRAME(2, 9),\n    ANIMCMD_FRAME(3, 24),\n    ANIMCMD_FRAME(0, 9),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_RSBrendan_1[] = {\n    ANIMCMD_FRAME(0, 24),\n    ANIMCMD_FRAME(1, 9),\n    ANIMCMD_FRAME(2, 24),\n    ANIMCMD_FRAME(0, 9),\n    ANIMCMD_FRAME(3, 50),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_RSMay_1[] = {\n    ANIMCMD_FRAME(0, 24),\n    ANIMCMD_FRAME(1, 9),\n    ANIMCMD_FRAME(2, 24),\n    ANIMCMD_FRAME(0, 9),\n    ANIMCMD_FRAME(3, 50),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd gAnimCmd_EmBrendan_1[] =\n{\n    ANIMCMD_FRAME(0, 24),\n    ANIMCMD_FRAME(1, 9),\n    ANIMCMD_FRAME(2, 24),\n    ANIMCMD_FRAME(0, 9),\n    ANIMCMD_FRAME(3, 50),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd gAnimCmd_EmMay_Steven_1[] =\n{\n    ANIMCMD_FRAME(0, 24),\n    ANIMCMD_FRAME(1, 9),\n    ANIMCMD_FRAME(2, 24),\n    ANIMCMD_FRAME(0, 9),\n    ANIMCMD_FRAME(3, 50),\n    ANIMCMD_END,\n};\n\nconst union AnimCmd *const sBackAnims_Red[] = {\n    sAnim_GeneralFrame0,\n    sAnimCmd_Red_1\n};\n\nconst union AnimCmd *const sBackAnims_Leaf[] = {\n    sAnim_GeneralFrame0,\n    sAnimCmd_Leaf_1\n};\n\nconst union AnimCmd *const sBackAnims_Pokedude[] = {\n    sAnim_GeneralFrame0,\n    sAnimCmd_Pokedude_1\n};\n\nconst union AnimCmd *const sBackAnims_OldMan[] = {\n    sAnim_GeneralFrame0,\n    sAnimCmd_OldMan_1\n};\n\nconst union AnimCmd *const sBackAnims_RSBrendan[] = {\n    sAnim_GeneralFrame3,\n    sAnimCmd_RSBrendan_1\n};\n\nconst union AnimCmd *const sBackAnims_RSMay[] = {\n    sAnim_GeneralFrame3,\n    sAnimCmd_RSMay_1\n};\n\nstatic const union AnimCmd *const sBackAnims_EmBrendan[] =\n{\n    sAnim_GeneralFrame3,\n    gAnimCmd_EmBrendan_1,\n};\n\nstatic const union AnimCmd *const sBackAnims_EmMay[] =\n{\n    sAnim_GeneralFrame3,\n    gAnimCmd_EmMay_Steven_1,\n};\n\nconst union AnimCmd *const *const gTrainerBackAnimsPtrTable[] = {\n    sBackAnims_Red,\n    sBackAnims_Leaf,\n    sBackAnims_RSBrendan,\n    sBackAnims_RSMay,\n    sBackAnims_Pokedude,\n    sBackAnims_OldMan,\n    sBackAnims_EmBrendan,\n    sBackAnims_EmMay\n};\n"
  },
  {
    "path": "src/data/trainer_graphics/back_pic_tables.h",
    "content": "const struct MonCoords gTrainerBackPicCoords[] = {\n    [TRAINER_BACK_PIC_RED] = {.size = 8, .y_offset = 5},\n    [TRAINER_BACK_PIC_LEAF] = {.size = 8, .y_offset = 5},\n    [TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN] = {.size = 8, .y_offset = 4},\n    [TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY] = {.size = 8, .y_offset = 4},\n    [TRAINER_BACK_PIC_POKEDUDE] = {.size = 8, .y_offset = 4},\n    [TRAINER_BACK_PIC_OLD_MAN] = {.size = 8, .y_offset = 4},\n    [TRAINER_BACK_PIC_EMERALD_BRENDAN] = {.size = 8, .y_offset = 4},\n    [TRAINER_BACK_PIC_EMERALD_MAY] = {.size = 8, .y_offset = 4},\n};\n\nconst struct CompressedSpriteSheet gTrainerBackPicTable[] = {\n    { (const u32 *)gTrainerBackPic_Red, 0x2800, 0 },\n    { (const u32 *)gTrainerBackPic_Leaf, 0x2800, 1 },\n    { (const u32 *)gTrainerBackPic_RSBrendan, 0x2000, 2 },\n    { (const u32 *)gTrainerBackPic_RSMay, 0x2000, 3 },\n    { (const u32 *)gTrainerBackPic_Pokedude, 0x2000, 4 },\n    { (const u32 *)gTrainerBackPic_OldMan, 0x2000, 5 },\n    { (const u32 *)gTrainerBackPic_EmBrendan, 0x2000, 6 },\n    { (const u32 *)gTrainerBackPic_EmMay, 0x2000, 7 }\n};\n\nconst struct CompressedSpritePalette gTrainerBackPicPaletteTable[] = {\n    { gTrainerPalette_RedBackPic, 0 },\n    { gTrainerPalette_LeafBackPic, 1 },\n    { gTrainerPalette_RSBrendan1, 2 },\n    { gTrainerPalette_RSMay1, 3 },\n    { gTrainerPalette_PokedudeBackPic, 4 },\n    { gTrainerPalette_OldManBackPic, 5 },\n    { gTrainerPalette_EmBrendan, 6 },\n    { gTrainerPalette_EmMay, 7 }\n};\n"
  },
  {
    "path": "src/data/trainer_graphics/front_pic_anims.h",
    "content": "static const union AnimCmd *const sAnims_AquaLeaderArchie[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_AquaGruntM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_AquaGruntF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSAromaLady[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSRuinManiac[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Interviewer[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSTuberF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSTuberM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSCooltrainerM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSCooltrainerF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_HexManiac[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSLady[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSBeauty[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RichBoy[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSPokemaniac[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSSwimmerM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSBlackBelt[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Guitarist[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Kindler[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSCamper[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_BugManiac[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSPsychicM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSPsychicF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSGentleman[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_EliteFourSidney[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_EliteFourPhoebe[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderRoxanne[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderBrawly[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderTateAndLiza[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_SchoolKidM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_SchoolKidF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_SrAndJr[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_PokefanM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_PokefanF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_ExpertM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_ExpertF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSYoungster[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_ChampionSteven[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSFisherman[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_CyclingTriathleteM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_CyclingTriathleteF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RunningTriathleteM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RunningTriathleteF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_SwimmingTriathleteM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_SwimmingTriathleteF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_DragonTamer[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSBirdKeeper[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_NinjaBoy[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_BattleGirl[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_ParasolLady[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSSwimmerF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSPicnicker[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSTwins[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSSailor[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Collector[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Wally[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSBrendan1[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSMay1[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSPokemonBreederM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSPokemonBreederF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSPokemonRangerM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSPokemonRangerF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_MagmaLeaderMaxie[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_MagmaGruntM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_MagmaGruntF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSLass[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSBugCatcher[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSHiker[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSYoungCouple[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_OldCouple[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSSisAndBro[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_AquaAdminM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_AquaAdminF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_MagmaAdminM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_MagmaAdminF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderWattson[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderFlannery[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderNorman[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderWinona[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderWallace[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_EliteFourGlacia[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_EliteFourDrake[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Youngster[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_BugCatcher[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Lass[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Sailor[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Camper[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Picnicker[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Pokemaniac[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_SuperNerd[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Hiker[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Biker[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Burglar[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Engineer[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Fisherman[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_SwimmerM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_CueBall[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Gamer[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Beauty[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_SwimmerF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_PsychicM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Rocker[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Juggler[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Tamer[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_BirdKeeper[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_BlackBelt[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RivalEarly[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Scientist[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderGiovanni[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RocketGruntM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_CooltrainerM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_CooltrainerF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_EliteFourLorelei[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_EliteFourBruno[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_EliteFourAgatha[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_EliteFourLance[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderBrock[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderMisty[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderLtSurge[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderErika[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderKoga[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderBlaine[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_LeaderSabrina[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Gentleman[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RivalLate[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_ChampionRival[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Channeler[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Twins[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_CoolCouple[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_YoungCouple[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_CrushKin[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_SisAndBro[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_ProfessorOak[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSBrendan2[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RSMay2[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Red[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Leaf[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RocketGruntF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_PsychicF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_CrushGirl[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_TuberF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_PokemonBreeder[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_PokemonRangerM[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_PokemonRangerF[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_AromaLady[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_RuinManiac[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Lady[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nstatic const union AnimCmd *const sAnims_Painter[] =\n{\n    sAnim_GeneralFrame0,\n};\n\nconst union AnimCmd *const *const gTrainerFrontAnimsPtrTable[] =\n{\n    [TRAINER_PIC_AQUA_LEADER_ARCHIE]    = sAnims_AquaLeaderArchie,\n    [TRAINER_PIC_AQUA_GRUNT_M]          = sAnims_AquaGruntM,\n    [TRAINER_PIC_AQUA_GRUNT_F]          = sAnims_AquaGruntF,\n    [TRAINER_PIC_RS_AROMA_LADY]         = sAnims_RSAromaLady,\n    [TRAINER_PIC_RS_RUIN_MANIAC]        = sAnims_RSRuinManiac,\n    [TRAINER_PIC_INTERVIEWER]           = sAnims_Interviewer,\n    [TRAINER_PIC_RS_TUBER_F]            = sAnims_RSTuberF,\n    [TRAINER_PIC_RS_TUBER_M]            = sAnims_RSTuberM,\n    [TRAINER_PIC_RS_COOLTRAINER_M]      = sAnims_RSCooltrainerM,\n    [TRAINER_PIC_RS_COOLTRAINER_F]      = sAnims_RSCooltrainerF,\n    [TRAINER_PIC_HEX_MANIAC]            = sAnims_HexManiac,\n    [TRAINER_PIC_RS_LADY]               = sAnims_RSLady,\n    [TRAINER_PIC_RS_BEAUTY]             = sAnims_RSBeauty,\n    [TRAINER_PIC_RICH_BOY]              = sAnims_RichBoy,\n    [TRAINER_PIC_RS_POKEMANIAC]         = sAnims_RSPokemaniac,\n    [TRAINER_PIC_RS_SWIMMER_M]          = sAnims_RSSwimmerM,\n    [TRAINER_PIC_RS_BLACK_BELT]         = sAnims_RSBlackBelt,\n    [TRAINER_PIC_GUITARIST]             = sAnims_Guitarist,\n    [TRAINER_PIC_KINDLER]               = sAnims_Kindler,\n    [TRAINER_PIC_RS_CAMPER]             = sAnims_RSCamper,\n    [TRAINER_PIC_BUG_MANIAC]            = sAnims_BugManiac,\n    [TRAINER_PIC_RS_PSYCHIC_M]          = sAnims_RSPsychicM,\n    [TRAINER_PIC_RS_PSYCHIC_F]          = sAnims_RSPsychicF,\n    [TRAINER_PIC_RS_GENTLEMAN]          = sAnims_RSGentleman,\n    [TRAINER_PIC_ELITE_FOUR_SIDNEY]     = sAnims_EliteFourSidney,\n    [TRAINER_PIC_ELITE_FOUR_PHOEBE]     = sAnims_EliteFourPhoebe,\n    [TRAINER_PIC_LEADER_ROXANNE]        = sAnims_LeaderRoxanne,\n    [TRAINER_PIC_LEADER_BRAWLY]         = sAnims_LeaderBrawly,\n    [TRAINER_PIC_LEADER_TATE_AND_LIZA]  = sAnims_LeaderTateAndLiza,\n    [TRAINER_PIC_SCHOOL_KID_M]          = sAnims_SchoolKidM,\n    [TRAINER_PIC_SCHOOL_KID_F]          = sAnims_SchoolKidF,\n    [TRAINER_PIC_SR_AND_JR]             = sAnims_SrAndJr,\n    [TRAINER_PIC_POKEFAN_M]             = sAnims_PokefanM,\n    [TRAINER_PIC_POKEFAN_F]             = sAnims_PokefanF,\n    [TRAINER_PIC_EXPERT_M]              = sAnims_ExpertM,\n    [TRAINER_PIC_EXPERT_F]              = sAnims_ExpertF,\n    [TRAINER_PIC_RS_YOUNGSTER]          = sAnims_RSYoungster,\n    [TRAINER_PIC_CHAMPION_STEVEN]       = sAnims_ChampionSteven,\n    [TRAINER_PIC_RS_FISHERMAN]          = sAnims_RSFisherman,\n    [TRAINER_PIC_CYCLING_TRIATHLETE_M]  = sAnims_CyclingTriathleteM,\n    [TRAINER_PIC_CYCLING_TRIATHLETE_F]  = sAnims_CyclingTriathleteF,\n    [TRAINER_PIC_RUNNING_TRIATHLETE_M]  = sAnims_RunningTriathleteM,\n    [TRAINER_PIC_RUNNING_TRIATHLETE_F]  = sAnims_RunningTriathleteF,\n    [TRAINER_PIC_SWIMMING_TRIATHLETE_M] = sAnims_SwimmingTriathleteM,\n    [TRAINER_PIC_SWIMMING_TRIATHLETE_F] = sAnims_SwimmingTriathleteF,\n    [TRAINER_PIC_DRAGON_TAMER]          = sAnims_DragonTamer,\n    [TRAINER_PIC_RS_BIRD_KEEPER]        = sAnims_RSBirdKeeper,\n    [TRAINER_PIC_NINJA_BOY]             = sAnims_NinjaBoy,\n    [TRAINER_PIC_BATTLE_GIRL]           = sAnims_BattleGirl,\n    [TRAINER_PIC_PARASOL_LADY]          = sAnims_ParasolLady,\n    [TRAINER_PIC_RS_SWIMMER_F]          = sAnims_RSSwimmerF,\n    [TRAINER_PIC_RS_PICNICKER]          = sAnims_RSPicnicker,\n    [TRAINER_PIC_RS_TWINS]              = sAnims_RSTwins,\n    [TRAINER_PIC_RS_SAILOR]             = sAnims_RSSailor,\n    [TRAINER_PIC_COLLECTOR]             = sAnims_Collector,\n    [TRAINER_PIC_WALLY]                 = sAnims_Wally,\n    [TRAINER_PIC_RS_BRENDAN_1]          = sAnims_RSBrendan1,\n    [TRAINER_PIC_RS_MAY_1]              = sAnims_RSMay1,\n    [TRAINER_PIC_RS_POKEMON_BREEDER_M]  = sAnims_RSPokemonBreederM,\n    [TRAINER_PIC_RS_POKEMON_BREEDER_F]  = sAnims_RSPokemonBreederF,\n    [TRAINER_PIC_RS_POKEMON_RANGER_M]   = sAnims_RSPokemonRangerM,\n    [TRAINER_PIC_RS_POKEMON_RANGER_F]   = sAnims_RSPokemonRangerF,\n    [TRAINER_PIC_MAGMA_LEADER_MAXIE]    = sAnims_MagmaLeaderMaxie,\n    [TRAINER_PIC_MAGMA_GRUNT_M]         = sAnims_MagmaGruntM,\n    [TRAINER_PIC_MAGMA_GRUNT_F]         = sAnims_MagmaGruntF,\n    [TRAINER_PIC_RS_LASS]               = sAnims_RSLass,\n    [TRAINER_PIC_RS_BUG_CATCHER]        = sAnims_RSBugCatcher,\n    [TRAINER_PIC_RS_HIKER]              = sAnims_RSHiker,\n    [TRAINER_PIC_RS_YOUNG_COUPLE]       = sAnims_RSYoungCouple,\n    [TRAINER_PIC_OLD_COUPLE]            = sAnims_OldCouple,\n    [TRAINER_PIC_RS_SIS_AND_BRO]        = sAnims_RSSisAndBro,\n    [TRAINER_PIC_AQUA_ADMIN_M]          = sAnims_AquaAdminM,\n    [TRAINER_PIC_AQUA_ADMIN_F]          = sAnims_AquaAdminF,\n    [TRAINER_PIC_MAGMA_ADMIN_M]         = sAnims_MagmaAdminM,\n    [TRAINER_PIC_MAGMA_ADMIN_F]         = sAnims_MagmaAdminF,\n    [TRAINER_PIC_LEADER_WATTSON]        = sAnims_LeaderWattson,\n    [TRAINER_PIC_LEADER_FLANNERY]       = sAnims_LeaderFlannery,\n    [TRAINER_PIC_LEADER_NORMAN]         = sAnims_LeaderNorman,\n    [TRAINER_PIC_LEADER_WINONA]         = sAnims_LeaderWinona,\n    [TRAINER_PIC_LEADER_WALLACE]        = sAnims_LeaderWallace,\n    [TRAINER_PIC_ELITE_FOUR_GLACIA]     = sAnims_EliteFourGlacia,\n    [TRAINER_PIC_ELITE_FOUR_DRAKE]      = sAnims_EliteFourDrake,\n    [TRAINER_PIC_YOUNGSTER]             = sAnims_Youngster,\n    [TRAINER_PIC_BUG_CATCHER]           = sAnims_BugCatcher,\n    [TRAINER_PIC_LASS]                  = sAnims_Lass,\n    [TRAINER_PIC_SAILOR]                = sAnims_Sailor,\n    [TRAINER_PIC_CAMPER]                = sAnims_Camper,\n    [TRAINER_PIC_PICNICKER]             = sAnims_Picnicker,\n    [TRAINER_PIC_POKEMANIAC]            = sAnims_Pokemaniac,\n    [TRAINER_PIC_SUPER_NERD]            = sAnims_SuperNerd,\n    [TRAINER_PIC_HIKER]                 = sAnims_Hiker,\n    [TRAINER_PIC_BIKER]                 = sAnims_Biker,\n    [TRAINER_PIC_BURGLAR]               = sAnims_Burglar,\n    [TRAINER_PIC_ENGINEER]              = sAnims_Engineer,\n    [TRAINER_PIC_FISHERMAN]             = sAnims_Fisherman,\n    [TRAINER_PIC_SWIMMER_M]             = sAnims_SwimmerM,\n    [TRAINER_PIC_CUE_BALL]              = sAnims_CueBall,\n    [TRAINER_PIC_GAMER]                 = sAnims_Gamer,\n    [TRAINER_PIC_BEAUTY]                = sAnims_Beauty,\n    [TRAINER_PIC_SWIMMER_F]             = sAnims_SwimmerF,\n    [TRAINER_PIC_PSYCHIC_M]             = sAnims_PsychicM,\n    [TRAINER_PIC_ROCKER]                = sAnims_Rocker,\n    [TRAINER_PIC_JUGGLER]               = sAnims_Juggler,\n    [TRAINER_PIC_TAMER]                 = sAnims_Tamer,\n    [TRAINER_PIC_BIRD_KEEPER]           = sAnims_BirdKeeper,\n    [TRAINER_PIC_BLACK_BELT]            = sAnims_BlackBelt,\n    [TRAINER_PIC_RIVAL_EARLY]           = sAnims_RivalEarly,\n    [TRAINER_PIC_SCIENTIST]             = sAnims_Scientist,\n    [TRAINER_PIC_LEADER_GIOVANNI]       = sAnims_LeaderGiovanni,\n    [TRAINER_PIC_ROCKET_GRUNT_M]        = sAnims_RocketGruntM,\n    [TRAINER_PIC_COOLTRAINER_M]         = sAnims_CooltrainerM,\n    [TRAINER_PIC_COOLTRAINER_F]         = sAnims_CooltrainerF,\n    [TRAINER_PIC_ELITE_FOUR_LORELEI]    = sAnims_EliteFourLorelei,\n    [TRAINER_PIC_ELITE_FOUR_BRUNO]      = sAnims_EliteFourBruno,\n    [TRAINER_PIC_ELITE_FOUR_AGATHA]     = sAnims_EliteFourAgatha,\n    [TRAINER_PIC_ELITE_FOUR_LANCE]      = sAnims_EliteFourLance,\n    [TRAINER_PIC_LEADER_BROCK]          = sAnims_LeaderBrock,\n    [TRAINER_PIC_LEADER_MISTY]          = sAnims_LeaderMisty,\n    [TRAINER_PIC_LEADER_LT_SURGE]       = sAnims_LeaderLtSurge,\n    [TRAINER_PIC_LEADER_ERIKA]          = sAnims_LeaderErika,\n    [TRAINER_PIC_LEADER_KOGA]           = sAnims_LeaderKoga,\n    [TRAINER_PIC_LEADER_BLAINE]         = sAnims_LeaderBlaine,\n    [TRAINER_PIC_LEADER_SABRINA]        = sAnims_LeaderSabrina,\n    [TRAINER_PIC_GENTLEMAN]             = sAnims_Gentleman,\n    [TRAINER_PIC_RIVAL_LATE]            = sAnims_RivalLate,\n    [TRAINER_PIC_CHAMPION_RIVAL]        = sAnims_ChampionRival,\n    [TRAINER_PIC_CHANNELER]             = sAnims_Channeler,\n    [TRAINER_PIC_TWINS]                 = sAnims_Twins,\n    [TRAINER_PIC_COOL_COUPLE]           = sAnims_CoolCouple,\n    [TRAINER_PIC_YOUNG_COUPLE]          = sAnims_YoungCouple,\n    [TRAINER_PIC_CRUSH_KIN]             = sAnims_CrushKin,\n    [TRAINER_PIC_SIS_AND_BRO]           = sAnims_SisAndBro,\n    [TRAINER_PIC_PROFESSOR_OAK]         = sAnims_ProfessorOak,\n    [TRAINER_PIC_RS_BRENDAN_2]          = sAnims_RSBrendan2,\n    [TRAINER_PIC_RS_MAY_2]              = sAnims_RSMay2,\n    [TRAINER_PIC_RED]                   = sAnims_Red,\n    [TRAINER_PIC_LEAF]                  = sAnims_Leaf,\n    [TRAINER_PIC_ROCKET_GRUNT_F]        = sAnims_RocketGruntF,\n    [TRAINER_PIC_PSYCHIC_F]             = sAnims_PsychicF,\n    [TRAINER_PIC_CRUSH_GIRL]            = sAnims_CrushGirl,\n    [TRAINER_PIC_TUBER_F]               = sAnims_TuberF,\n    [TRAINER_PIC_POKEMON_BREEDER]       = sAnims_PokemonBreeder,\n    [TRAINER_PIC_POKEMON_RANGER_M]      = sAnims_PokemonRangerM,\n    [TRAINER_PIC_POKEMON_RANGER_F]      = sAnims_PokemonRangerF,\n    [TRAINER_PIC_AROMA_LADY]            = sAnims_AromaLady,\n    [TRAINER_PIC_RUIN_MANIAC]           = sAnims_RuinManiac,\n    [TRAINER_PIC_LADY]                  = sAnims_Lady,\n    [TRAINER_PIC_PAINTER]               = sAnims_Painter,\n    [TRAINER_PIC_EM_BRENDAN]            = sAnims_Painter, \n    [TRAINER_PIC_EM_MAY]                = sAnims_Painter,\n    [TRAINER_PIC_MASTER_BEAUTY]         = sAnims_Painter,\n    [TRAINER_PIC_MASTER_BIRD_KEEPER]    = sAnims_Painter,\n    [TRAINER_PIC_MASTER_BLACK_BELT]     = sAnims_Painter,\n    [TRAINER_PIC_MASTER_BUG_CATCHER]    = sAnims_Painter,\n    [TRAINER_PIC_MASTER_COOLTRAINER_M]  = sAnims_Painter,\n    [TRAINER_PIC_MASTER_HIKER]          = sAnims_Painter,\n    [TRAINER_PIC_MASTER_LASS]           = sAnims_Painter,\n    [TRAINER_PIC_MASTER_PSYCHIC_M]      = sAnims_Painter,\n    [TRAINER_PIC_MASTER_SCIENTIST]      = sAnims_Painter,\n    [TRAINER_PIC_MASTER_YOUNGSTER]      = sAnims_Painter,\n    [TRAINER_PIC_MASTER_SWIMMER]        = sAnims_Painter,\n};\n"
  },
  {
    "path": "src/data/trainer_graphics/front_pic_tables.h",
    "content": "const struct MonCoords gTrainerFrontPicCoords[] =\n{\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 2},\n    {.size = 8, .y_offset = 2},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 2},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 2},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n    {.size = 8, .y_offset = 1},\n};\n\nconst struct CompressedSpriteSheet gTrainerFrontPicTable[] =\n{\n    TRAINER_SPRITE(AQUA_LEADER_ARCHIE, gTrainerFrontPic_AquaLeaderArchie, 0x800),\n    TRAINER_SPRITE(AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, 0x800),\n    TRAINER_SPRITE(AQUA_GRUNT_F, gTrainerFrontPic_AquaGruntF, 0x800),\n    TRAINER_SPRITE(RS_AROMA_LADY, gTrainerFrontPic_RSAromaLady, 0x800),\n    TRAINER_SPRITE(RS_RUIN_MANIAC, gTrainerFrontPic_RSRuinManiac, 0x800),\n    TRAINER_SPRITE(INTERVIEWER, gTrainerFrontPic_Interviewer, 0x800),\n    TRAINER_SPRITE(RS_TUBER_F, gTrainerFrontPic_RSTuberF, 0x800),\n    TRAINER_SPRITE(RS_TUBER_M, gTrainerFrontPic_TuberM, 0x800),\n    TRAINER_SPRITE(RS_COOLTRAINER_M, gTrainerFrontPic_RSCooltrainerM, 0x800),\n    TRAINER_SPRITE(RS_COOLTRAINER_F, gTrainerFrontPic_RSCooltrainerF, 0x800),\n    TRAINER_SPRITE(HEX_MANIAC, gTrainerFrontPic_HexManiac, 0x800),\n    TRAINER_SPRITE(RS_LADY, gTrainerFrontPic_RSLady, 0x800),\n    TRAINER_SPRITE(RS_BEAUTY, gTrainerFrontPic_RSBeauty, 0x800),\n    TRAINER_SPRITE(RICH_BOY, gTrainerFrontPic_RichBoy, 0x800),\n    TRAINER_SPRITE(RS_POKEMANIAC, gTrainerFrontPic_RSPokeManiac, 0x800),\n    TRAINER_SPRITE(RS_SWIMMER_M, gTrainerFrontPic_RSSwimmerM, 0x800),\n    TRAINER_SPRITE(RS_BLACK_BELT, gTrainerFrontPic_RSBlackBelt, 0x800),\n    TRAINER_SPRITE(GUITARIST, gTrainerFrontPic_Guitarist, 0x800),\n    TRAINER_SPRITE(KINDLER, gTrainerFrontPic_Kindler, 0x800),\n    TRAINER_SPRITE(RS_CAMPER, gTrainerFrontPic_RSCamper, 0x800),\n    TRAINER_SPRITE(BUG_MANIAC, gTrainerFrontPic_BugManiac, 0x800),\n    TRAINER_SPRITE(RS_PSYCHIC_M, gTrainerFrontPic_RSPsychicM, 0x800),\n    TRAINER_SPRITE(RS_PSYCHIC_F, gTrainerFrontPic_RSPsychicF, 0x800),\n    TRAINER_SPRITE(RS_GENTLEMAN, gTrainerFrontPic_RSGentleman, 0x800),\n    TRAINER_SPRITE(ELITE_FOUR_SIDNEY, gTrainerFrontPic_EliteFourSidney, 0x800),\n    TRAINER_SPRITE(ELITE_FOUR_PHOEBE, gTrainerFrontPic_EliteFourPhoebe, 0x800),\n    TRAINER_SPRITE(LEADER_ROXANNE, gTrainerFrontPic_LeaderRoxanne, 0x800),\n    TRAINER_SPRITE(LEADER_BRAWLY, gTrainerFrontPic_LeaderBrawly, 0x800),\n    TRAINER_SPRITE(LEADER_TATE_AND_LIZA, gTrainerFrontPic_LeaderTateAndLiza, 0x800),\n    TRAINER_SPRITE(SCHOOL_KID_M, gTrainerFrontPic_SchoolKidM, 0x800),\n    TRAINER_SPRITE(SCHOOL_KID_F, gTrainerFrontPic_SchoolKidF, 0x800),\n    TRAINER_SPRITE(SR_AND_JR, gTrainerFrontPic_SrAndJr, 0x1000),\n    TRAINER_SPRITE(POKEFAN_M, gTrainerFrontPic_PokefanM, 0x1000),\n    TRAINER_SPRITE(POKEFAN_F, gTrainerFrontPic_PokefanF, 0x800),\n    TRAINER_SPRITE(EXPERT_M, gTrainerFrontPic_ExpertM, 0x800),\n    TRAINER_SPRITE(EXPERT_F, gTrainerFrontPic_ExpertF, 0x800),\n    TRAINER_SPRITE(RS_YOUNGSTER, gTrainerFrontPic_RSYoungster, 0x800),\n    TRAINER_SPRITE(CHAMPION_STEVEN, gTrainerFrontPic_ChampionSteven, 0x800),\n    TRAINER_SPRITE(RS_FISHERMAN, gTrainerFrontPic_RSFisherman, 0x800),\n    TRAINER_SPRITE(CYCLING_TRIATHLETE_M, gTrainerFrontPic_CyclingTriathleteM, 0x1000),\n    TRAINER_SPRITE(CYCLING_TRIATHLETE_F, gTrainerFrontPic_CyclingTriathleteF, 0x800),\n    TRAINER_SPRITE(RUNNING_TRIATHLETE_M, gTrainerFrontPic_RunningTriathleteM, 0x800),\n    TRAINER_SPRITE(RUNNING_TRIATHLETE_F, gTrainerFrontPic_RunningTriathleteF, 0x800),\n    TRAINER_SPRITE(SWIMMING_TRIATHLETE_M, gTrainerFrontPic_SwimmingTriathleteM, 0x800),\n    TRAINER_SPRITE(SWIMMING_TRIATHLETE_F, gTrainerFrontPic_SwimmingTriathleteF, 0x800),\n    TRAINER_SPRITE(DRAGON_TAMER, gTrainerFrontPic_DragonTamer, 0x800),\n    TRAINER_SPRITE(RS_BIRD_KEEPER, gTrainerFrontPic_RSBirdKeeper, 0x800),\n    TRAINER_SPRITE(NINJA_BOY, gTrainerFrontPic_NinjaBoy, 0x800),\n    TRAINER_SPRITE(BATTLE_GIRL, gTrainerFrontPic_BattleGirl, 0x1000),\n    TRAINER_SPRITE(PARASOL_LADY, gTrainerFrontPic_ParasolLady, 0x800),\n    TRAINER_SPRITE(RS_SWIMMER_F, gTrainerFrontPic_RSSwimmerF, 0x800),\n    TRAINER_SPRITE(RS_PICNICKER, gTrainerFrontPic_RSPicnicker, 0x800),\n    TRAINER_SPRITE(RS_TWINS, gTrainerFrontPic_RSTwins, 0x800),\n    TRAINER_SPRITE(RS_SAILOR, gTrainerFrontPic_RSSailor, 0x800),\n    TRAINER_SPRITE(COLLECTOR, gTrainerFrontPic_Collector, 0x800),\n    TRAINER_SPRITE(WALLY, gTrainerFrontPic_Wally, 0x800),\n    TRAINER_SPRITE(RS_BRENDAN_1, gTrainerFrontPic_RSBrendan1, 0x800),\n    TRAINER_SPRITE(RS_MAY_1, gTrainerFrontPic_RSMay1, 0x800),\n    TRAINER_SPRITE(RS_POKEMON_BREEDER_M, gTrainerFrontPic_RSPokemonBreederM, 0x800),\n    TRAINER_SPRITE(RS_POKEMON_BREEDER_F, gTrainerFrontPic_RSPokemonBreederF, 0x800),\n    TRAINER_SPRITE(RS_POKEMON_RANGER_M, gTrainerFrontPic_RSPokemonRangerM, 0x800),\n    TRAINER_SPRITE(RS_POKEMON_RANGER_F, gTrainerFrontPic_RSPokemonRangerF, 0x800),\n    TRAINER_SPRITE(MAGMA_LEADER_MAXIE, gTrainerFrontPic_MagmaLeaderMaxie, 0x800),\n    TRAINER_SPRITE(MAGMA_GRUNT_M, gTrainerFrontPic_MagmaGruntM, 0x800),\n    TRAINER_SPRITE(MAGMA_GRUNT_F, gTrainerFrontPic_MagmaGruntF, 0x800),\n    TRAINER_SPRITE(RS_LASS, gTrainerFrontPic_RSLass, 0x800),\n    TRAINER_SPRITE(RS_BUG_CATCHER, gTrainerFrontPic_RSBugCatcher, 0x800),\n    TRAINER_SPRITE(RS_HIKER, gTrainerFrontPic_RSHiker, 0x800),\n    TRAINER_SPRITE(RS_YOUNG_COUPLE, gTrainerFrontPic_RSYoungCouple, 0x800),\n    TRAINER_SPRITE(OLD_COUPLE, gTrainerFrontPic_OldCouple, 0x800),\n    TRAINER_SPRITE(RS_SIS_AND_BRO, gTrainerFrontPic_RSSisAndBro, 0x800),\n    TRAINER_SPRITE(AQUA_ADMIN_M, gTrainerFrontPic_AquaAdminM, 0x800),\n    TRAINER_SPRITE(AQUA_ADMIN_F, gTrainerFrontPic_AquaAdminF, 0x800),\n    TRAINER_SPRITE(MAGMA_ADMIN_M, gTrainerFrontPic_MagmaAdminM, 0x800),\n    TRAINER_SPRITE(MAGMA_ADMIN_F, gTrainerFrontPic_MagmaAdminF, 0x800),\n    TRAINER_SPRITE(LEADER_WATTSON, gTrainerFrontPic_LeaderWattson, 0x800),\n    TRAINER_SPRITE(LEADER_FLANNERY, gTrainerFrontPic_LeaderFlannery, 0x800),\n    TRAINER_SPRITE(LEADER_NORMAN, gTrainerFrontPic_LeaderNorman, 0x800),\n    TRAINER_SPRITE(LEADER_WINONA, gTrainerFrontPic_LeaderWinona, 0x800),\n    TRAINER_SPRITE(LEADER_WALLACE, gTrainerFrontPic_LeaderWallace, 0x800),\n    TRAINER_SPRITE(ELITE_FOUR_GLACIA, gTrainerFrontPic_EliteFourGlacia, 0x800),\n    TRAINER_SPRITE(ELITE_FOUR_DRAKE, gTrainerFrontPic_EliteFourDrake, 0x800),\n    TRAINER_SPRITE(YOUNGSTER, gTrainerFrontPic_Youngster, 0x800),\n    TRAINER_SPRITE(BUG_CATCHER, gTrainerFrontPic_BugCatcher, 0x800),\n    TRAINER_SPRITE(LASS, gTrainerFrontPic_Lass, 0x800),\n    TRAINER_SPRITE(SAILOR, gTrainerFrontPic_Sailor, 0x800),\n    TRAINER_SPRITE(CAMPER, gTrainerFrontPic_Camper, 0x800),\n    TRAINER_SPRITE(PICNICKER, gTrainerFrontPic_Picnicker, 0x800),\n    TRAINER_SPRITE(POKEMANIAC, gTrainerFrontPic_PokeManiac, 0x800),\n    TRAINER_SPRITE(SUPER_NERD, gTrainerFrontPic_SuperNerd, 0x800),\n    TRAINER_SPRITE(HIKER, gTrainerFrontPic_Hiker, 0x800),\n    TRAINER_SPRITE(BIKER, gTrainerFrontPic_Biker, 0x800),\n    TRAINER_SPRITE(BURGLAR, gTrainerFrontPic_Burglar, 0x800),\n    TRAINER_SPRITE(ENGINEER, gTrainerFrontPic_Engineer, 0x800),\n    TRAINER_SPRITE(FISHERMAN, gTrainerFrontPic_Fisherman, 0x800),\n    TRAINER_SPRITE(SWIMMER_M, gTrainerFrontPic_SwimmerM, 0x800),\n    TRAINER_SPRITE(CUE_BALL, gTrainerFrontPic_CueBall, 0x800),\n    TRAINER_SPRITE(GAMER, gTrainerFrontPic_Gamer, 0x800),\n    TRAINER_SPRITE(BEAUTY, gTrainerFrontPic_Beauty, 0x800),\n    TRAINER_SPRITE(SWIMMER_F, gTrainerFrontPic_SwimmerF, 0x800),\n    TRAINER_SPRITE(PSYCHIC_M, gTrainerFrontPic_PsychicM, 0x800),\n    TRAINER_SPRITE(ROCKER, gTrainerFrontPic_Rocker, 0x800),\n    TRAINER_SPRITE(JUGGLER, gTrainerFrontPic_Juggler, 0x800),\n    TRAINER_SPRITE(TAMER, gTrainerFrontPic_Tamer, 0x800),\n    TRAINER_SPRITE(BIRD_KEEPER, gTrainerFrontPic_BirdKeeper, 0x800),\n    TRAINER_SPRITE(BLACK_BELT, gTrainerFrontPic_BlackBelt, 0x800),\n    TRAINER_SPRITE(RIVAL_EARLY, gTrainerFrontPic_RivalEarly, 0x800),\n    TRAINER_SPRITE(SCIENTIST, gTrainerFrontPic_Scientist, 0x800),\n    TRAINER_SPRITE(LEADER_GIOVANNI, gTrainerFrontPic_LeaderGiovanni, 0x800),\n    TRAINER_SPRITE(ROCKET_GRUNT_M, gTrainerFrontPic_RocketGruntM, 0x800),\n    TRAINER_SPRITE(COOLTRAINER_M, gTrainerFrontPic_CooltrainerM, 0x800),\n    TRAINER_SPRITE(COOLTRAINER_F, gTrainerFrontPic_CooltrainerF, 0x800),\n    TRAINER_SPRITE(ELITE_FOUR_LORELEI, gTrainerFrontPic_EliteFourLorelei, 0x800),\n    TRAINER_SPRITE(ELITE_FOUR_BRUNO, gTrainerFrontPic_EliteFourBruno, 0x800),\n    TRAINER_SPRITE(ELITE_FOUR_AGATHA, gTrainerFrontPic_EliteFourAgatha, 0x800),\n    TRAINER_SPRITE(ELITE_FOUR_LANCE, gTrainerFrontPic_EliteFourLance, 0x800),\n    TRAINER_SPRITE(LEADER_BROCK, gTrainerFrontPic_LeaderBrock, 0x800),\n    TRAINER_SPRITE(LEADER_MISTY, gTrainerFrontPic_LeaderMisty, 0x800),\n    TRAINER_SPRITE(LEADER_LT_SURGE, gTrainerFrontPic_LeaderLtSurge, 0x800),\n    TRAINER_SPRITE(LEADER_ERIKA, gTrainerFrontPic_LeaderErika, 0x800),\n    TRAINER_SPRITE(LEADER_KOGA, gTrainerFrontPic_LeaderKoga, 0x800),\n    TRAINER_SPRITE(LEADER_BLAINE, gTrainerFrontPic_LeaderBlaine, 0x800),\n    TRAINER_SPRITE(LEADER_SABRINA, gTrainerFrontPic_LeaderSabrina, 0x800),\n    TRAINER_SPRITE(GENTLEMAN, gTrainerFrontPic_Gentleman, 0x800),\n    TRAINER_SPRITE(RIVAL_LATE, gTrainerFrontPic_RivalLate, 0x800),\n    TRAINER_SPRITE(CHAMPION_RIVAL, gTrainerFrontPic_ChampionRival, 0x800),\n    TRAINER_SPRITE(CHANNELER, gTrainerFrontPic_Channeler, 0x800),\n    TRAINER_SPRITE(TWINS, gTrainerFrontPic_Twins, 0x800),\n    TRAINER_SPRITE(COOL_COUPLE, gTrainerFrontPic_CoolCouple, 0x800),\n    TRAINER_SPRITE(YOUNG_COUPLE, gTrainerFrontPic_YoungCouple, 0x800),\n    TRAINER_SPRITE(CRUSH_KIN, gTrainerFrontPic_CrushKin, 0x800),\n    TRAINER_SPRITE(SIS_AND_BRO, gTrainerFrontPic_SisAndBro, 0x800),\n    TRAINER_SPRITE(PROFESSOR_OAK, gTrainerFrontPic_ProfessorOak, 0x800),\n    TRAINER_SPRITE(RS_BRENDAN_2, gTrainerFrontPic_RSBrendan2, 0x800),\n    TRAINER_SPRITE(RS_MAY_2, gTrainerFrontPic_RSMay2, 0x800),\n    TRAINER_SPRITE(RED, gTrainerFrontPic_Red, 0x800),\n    TRAINER_SPRITE(LEAF, gTrainerFrontPic_Leaf, 0x800),\n    TRAINER_SPRITE(ROCKET_GRUNT_F, gTrainerFrontPic_RocketGruntF, 0x800),\n    TRAINER_SPRITE(PSYCHIC_F, gTrainerFrontPic_PsychicF, 0x800),\n    TRAINER_SPRITE(CRUSH_GIRL, gTrainerFrontPic_CrushGirl, 0x800),\n    TRAINER_SPRITE(TUBER_F, gTrainerFrontPic_TuberF, 0x800),\n    TRAINER_SPRITE(POKEMON_BREEDER, gTrainerFrontPic_PokemonBreeder, 0x800),\n    TRAINER_SPRITE(POKEMON_RANGER_M, gTrainerFrontPic_PokemonRangerM, 0x800),\n    TRAINER_SPRITE(POKEMON_RANGER_F, gTrainerFrontPic_PokemonRangerF, 0x800),\n    TRAINER_SPRITE(AROMA_LADY, gTrainerFrontPic_AromaLady, 0x800),\n    TRAINER_SPRITE(RUIN_MANIAC, gTrainerFrontPic_RuinManiac, 0x800),\n    TRAINER_SPRITE(LADY, gTrainerFrontPic_Lady, 0x800),\n    TRAINER_SPRITE(PAINTER, gTrainerFrontPic_Painter, 0x800),\n    TRAINER_SPRITE(EM_BRENDAN, gTrainerFrontPic_EmBrendan, 0x800),\n    TRAINER_SPRITE(EM_MAY, gTrainerFrontPic_EmMay, 0x800),\n    TRAINER_SPRITE(MASTER_BEAUTY, gTrainerFrontPic_MasterBeauty, 0x800),\n    TRAINER_SPRITE(MASTER_BIRD_KEEPER, gTrainerFrontPic_MasterBirdKeeper, 0x800),\n    TRAINER_SPRITE(MASTER_COOLTRAINER_M, gTrainerFrontPic_MasterCooltrainerM, 0x800),\n    TRAINER_SPRITE(MASTER_BLACK_BELT, gTrainerFrontPic_MasterBlackBelt, 0x800),\n    TRAINER_SPRITE(MASTER_BUG_CATCHER, gTrainerFrontPic_MasterBugCatcher, 0x800),\n    TRAINER_SPRITE(MASTER_HIKER, gTrainerFrontPic_MasterHiker, 0x800),\n    TRAINER_SPRITE(MASTER_LASS, gTrainerFrontPic_MasterLass, 0x800),\n    TRAINER_SPRITE(MASTER_PSYCHIC_M, gTrainerFrontPic_MasterPsychicM, 0x800),\n    TRAINER_SPRITE(MASTER_SCIENTIST, gTrainerFrontPic_MasterScientist, 0x800),\n    TRAINER_SPRITE(MASTER_YOUNGSTER, gTrainerFrontPic_MasterYoungster, 0x800),\n    TRAINER_SPRITE(MASTER_SWIMMER, gTrainerFrontPic_MasterSwimmer, 0x800),\n};\n\nconst struct CompressedSpritePalette gTrainerFrontPicPaletteTable[] =\n{\n    TRAINER_PAL(AQUA_LEADER_ARCHIE, gTrainerPalette_AquaLeaderArchie),\n    TRAINER_PAL(AQUA_GRUNT_M, gTrainerPalette_AquaGruntM),\n    TRAINER_PAL(AQUA_GRUNT_F, gTrainerPalette_AquaGruntF),\n    TRAINER_PAL(RS_AROMA_LADY, gTrainerPalette_RSAromaLady),\n    TRAINER_PAL(RS_RUIN_MANIAC, gTrainerPalette_RSRuinManiac),\n    TRAINER_PAL(INTERVIEWER, gTrainerPalette_Interviewer),\n    TRAINER_PAL(RS_TUBER_F, gTrainerPalette_RSTuberF),\n    TRAINER_PAL(RS_TUBER_M, gTrainerPalette_TuberM),\n    TRAINER_PAL(RS_COOLTRAINER_M, gTrainerPalette_RSCooltrainerM),\n    TRAINER_PAL(RS_COOLTRAINER_F, gTrainerPalette_RSCooltrainerF),\n    TRAINER_PAL(HEX_MANIAC, gTrainerPalette_HexManiac),\n    TRAINER_PAL(RS_LADY, gTrainerPalette_RSLady),\n    TRAINER_PAL(RS_BEAUTY, gTrainerPalette_RSBeauty),\n    TRAINER_PAL(RICH_BOY, gTrainerPalette_RichBoy),\n    TRAINER_PAL(RS_POKEMANIAC, gTrainerPalette_RSPokeManiac),\n    TRAINER_PAL(RS_SWIMMER_M, gTrainerPalette_RSSwimmerM),\n    TRAINER_PAL(RS_BLACK_BELT, gTrainerPalette_RSBlackBelt),\n    TRAINER_PAL(GUITARIST, gTrainerPalette_Guitarist),\n    TRAINER_PAL(KINDLER, gTrainerPalette_Kindler),\n    TRAINER_PAL(RS_CAMPER, gTrainerPalette_RSCamper),\n    TRAINER_PAL(BUG_MANIAC, gTrainerPalette_BugManiac),\n    TRAINER_PAL(RS_PSYCHIC_M, gTrainerPalette_RSPsychicM),\n    TRAINER_PAL(RS_PSYCHIC_F, gTrainerPalette_RSPsychicF),\n    TRAINER_PAL(RS_GENTLEMAN, gTrainerPalette_RSGentleman),\n    TRAINER_PAL(ELITE_FOUR_SIDNEY, gTrainerPalette_EliteFourSidney),\n    TRAINER_PAL(ELITE_FOUR_PHOEBE, gTrainerPalette_EliteFourPhoebe),\n    TRAINER_PAL(LEADER_ROXANNE, gTrainerPalette_LeaderRoxanne),\n    TRAINER_PAL(LEADER_BRAWLY, gTrainerPalette_LeaderBrawly),\n    TRAINER_PAL(LEADER_TATE_AND_LIZA, gTrainerPalette_LeaderTateAndLiza),\n    TRAINER_PAL(SCHOOL_KID_M, gTrainerPalette_SchoolKidM),\n    TRAINER_PAL(SCHOOL_KID_F, gTrainerPalette_SchoolKidF),\n    TRAINER_PAL(SR_AND_JR, gTrainerPalette_SrAndJr),\n    TRAINER_PAL(POKEFAN_M, gTrainerPalette_PokefanM),\n    TRAINER_PAL(POKEFAN_F, gTrainerPalette_PokefanF),\n    TRAINER_PAL(EXPERT_M, gTrainerPalette_ExpertM),\n    TRAINER_PAL(EXPERT_F, gTrainerPalette_ExpertF),\n    TRAINER_PAL(RS_YOUNGSTER, gTrainerPalette_RSYoungster),\n    TRAINER_PAL(CHAMPION_STEVEN, gTrainerPalette_ChampionSteven),\n    TRAINER_PAL(RS_FISHERMAN, gTrainerPalette_RSFisherman),\n    TRAINER_PAL(CYCLING_TRIATHLETE_M, gTrainerPalette_CyclingTriathleteM),\n    TRAINER_PAL(CYCLING_TRIATHLETE_F, gTrainerPalette_CyclingTriathleteF),\n    TRAINER_PAL(RUNNING_TRIATHLETE_M, gTrainerPalette_RunningTriathleteM),\n    TRAINER_PAL(RUNNING_TRIATHLETE_F, gTrainerPalette_RunningTriathleteF),\n    TRAINER_PAL(SWIMMING_TRIATHLETE_M, gTrainerPalette_SwimmingTriathleteM),\n    TRAINER_PAL(SWIMMING_TRIATHLETE_F, gTrainerPalette_SwimmingTriathleteF),\n    TRAINER_PAL(DRAGON_TAMER, gTrainerPalette_DragonTamer),\n    TRAINER_PAL(RS_BIRD_KEEPER, gTrainerPalette_RSBirdKeeper),\n    TRAINER_PAL(NINJA_BOY, gTrainerPalette_NinjaBoy),\n    TRAINER_PAL(BATTLE_GIRL, gTrainerPalette_BattleGirl),\n    TRAINER_PAL(PARASOL_LADY, gTrainerPalette_ParasolLady),\n    TRAINER_PAL(RS_SWIMMER_F, gTrainerPalette_RSSwimmerF),\n    TRAINER_PAL(RS_PICNICKER, gTrainerPalette_RSPicnicker),\n    TRAINER_PAL(RS_TWINS, gTrainerPalette_RSTwins),\n    TRAINER_PAL(RS_SAILOR, gTrainerPalette_RSSailor),\n    TRAINER_PAL(COLLECTOR, gTrainerPalette_Collector),\n    TRAINER_PAL(WALLY, gTrainerPalette_Wally),\n    TRAINER_PAL(RS_BRENDAN_1, gTrainerPalette_RSBrendan1),\n    TRAINER_PAL(RS_MAY_1, gTrainerPalette_RSMay1),\n    TRAINER_PAL(RS_POKEMON_BREEDER_M, gTrainerPalette_RSPokemonBreederM),\n    TRAINER_PAL(RS_POKEMON_BREEDER_F, gTrainerPalette_RSPokemonBreederF),\n    TRAINER_PAL(RS_POKEMON_RANGER_M, gTrainerPalette_RSPokemonRangerM),\n    TRAINER_PAL(RS_POKEMON_RANGER_F, gTrainerPalette_RSPokemonRangerF),\n    TRAINER_PAL(MAGMA_LEADER_MAXIE, gTrainerPalette_MagmaLeaderMaxie),\n    TRAINER_PAL(MAGMA_GRUNT_M, gTrainerPalette_MagmaGruntM),\n    TRAINER_PAL(MAGMA_GRUNT_F, gTrainerPalette_MagmaGruntF),\n    TRAINER_PAL(RS_LASS, gTrainerPalette_RSLass),\n    TRAINER_PAL(RS_BUG_CATCHER, gTrainerPalette_RSBugCatcher),\n    TRAINER_PAL(RS_HIKER, gTrainerPalette_RSHiker),\n    TRAINER_PAL(RS_YOUNG_COUPLE, gTrainerPalette_RSYoungCouple),\n    TRAINER_PAL(OLD_COUPLE, gTrainerPalette_OldCouple),\n    TRAINER_PAL(RS_SIS_AND_BRO, gTrainerPalette_RSSisAndBro),\n    TRAINER_PAL(AQUA_ADMIN_M, gTrainerPalette_AquaAdminM),\n    TRAINER_PAL(AQUA_ADMIN_F, gTrainerPalette_AquaAdminF),\n    TRAINER_PAL(MAGMA_ADMIN_M, gTrainerPalette_MagmaAdminM),\n    TRAINER_PAL(MAGMA_ADMIN_F, gTrainerPalette_MagmaAdminF),\n    TRAINER_PAL(LEADER_WATTSON, gTrainerPalette_LeaderWattson),\n    TRAINER_PAL(LEADER_FLANNERY, gTrainerPalette_LeaderFlannery),\n    TRAINER_PAL(LEADER_NORMAN, gTrainerPalette_LeaderNorman),\n    TRAINER_PAL(LEADER_WINONA, gTrainerPalette_LeaderWinona),\n    TRAINER_PAL(LEADER_WALLACE, gTrainerPalette_LeaderWallace),\n    TRAINER_PAL(ELITE_FOUR_GLACIA, gTrainerPalette_EliteFourGlacia),\n    TRAINER_PAL(ELITE_FOUR_DRAKE, gTrainerPalette_EliteFourDrake),\n    TRAINER_PAL(YOUNGSTER, gTrainerPalette_Youngster),\n    TRAINER_PAL(BUG_CATCHER, gTrainerPalette_BugCatcher),\n    TRAINER_PAL(LASS, gTrainerPalette_Lass),\n    TRAINER_PAL(SAILOR, gTrainerPalette_Sailor),\n    TRAINER_PAL(CAMPER, gTrainerPalette_Camper),\n    TRAINER_PAL(PICNICKER, gTrainerPalette_Picnicker),\n    TRAINER_PAL(POKEMANIAC, gTrainerPalette_PokeManiac),\n    TRAINER_PAL(SUPER_NERD, gTrainerPalette_SuperNerd),\n    TRAINER_PAL(HIKER, gTrainerPalette_Hiker),\n    TRAINER_PAL(BIKER, gTrainerPalette_Biker),\n    TRAINER_PAL(BURGLAR, gTrainerPalette_Burglar),\n    TRAINER_PAL(ENGINEER, gTrainerPalette_Engineer),\n    TRAINER_PAL(FISHERMAN, gTrainerPalette_Fisherman),\n    TRAINER_PAL(SWIMMER_M, gTrainerPalette_SwimmerM),\n    TRAINER_PAL(CUE_BALL, gTrainerPalette_CueBall),\n    TRAINER_PAL(GAMER, gTrainerPalette_Gamer),\n    TRAINER_PAL(BEAUTY, gTrainerPalette_Beauty),\n    TRAINER_PAL(SWIMMER_F, gTrainerPalette_SwimmerF),\n    TRAINER_PAL(PSYCHIC_M, gTrainerPalette_PsychicM),\n    TRAINER_PAL(ROCKER, gTrainerPalette_Rocker),\n    TRAINER_PAL(JUGGLER, gTrainerPalette_Juggler),\n    TRAINER_PAL(TAMER, gTrainerPalette_Tamer),\n    TRAINER_PAL(BIRD_KEEPER, gTrainerPalette_BirdKeeper),\n    TRAINER_PAL(BLACK_BELT, gTrainerPalette_BlackBelt),\n    TRAINER_PAL(RIVAL_EARLY, gTrainerPalette_RivalEarly),\n    TRAINER_PAL(SCIENTIST, gTrainerPalette_Scientist),\n    TRAINER_PAL(LEADER_GIOVANNI, gTrainerPalette_LeaderGiovanni),\n    TRAINER_PAL(ROCKET_GRUNT_M, gTrainerPalette_RocketGruntM),\n    TRAINER_PAL(COOLTRAINER_M, gTrainerPalette_CooltrainerM),\n    TRAINER_PAL(COOLTRAINER_F, gTrainerPalette_CooltrainerF),\n    TRAINER_PAL(ELITE_FOUR_LORELEI, gTrainerPalette_EliteFourLorelei),\n    TRAINER_PAL(ELITE_FOUR_BRUNO, gTrainerPalette_EliteFourBruno),\n    TRAINER_PAL(ELITE_FOUR_AGATHA, gTrainerPalette_EliteFourAgatha),\n    TRAINER_PAL(ELITE_FOUR_LANCE, gTrainerPalette_EliteFourLance),\n    TRAINER_PAL(LEADER_BROCK, gTrainerPalette_LeaderBrock),\n    TRAINER_PAL(LEADER_MISTY, gTrainerPalette_LeaderMisty),\n    TRAINER_PAL(LEADER_LT_SURGE, gTrainerPalette_LeaderLtSurge),\n    TRAINER_PAL(LEADER_ERIKA, gTrainerPalette_LeaderErika),\n    TRAINER_PAL(LEADER_KOGA, gTrainerPalette_LeaderKoga),\n    TRAINER_PAL(LEADER_BLAINE, gTrainerPalette_LeaderBlaine),\n    TRAINER_PAL(LEADER_SABRINA, gTrainerPalette_LeaderSabrina),\n    TRAINER_PAL(GENTLEMAN, gTrainerPalette_Gentleman),\n    TRAINER_PAL(RIVAL_LATE, gTrainerPalette_RivalLate),\n    TRAINER_PAL(CHAMPION_RIVAL, gTrainerPalette_ChampionRival),\n    TRAINER_PAL(CHANNELER, gTrainerPalette_Channeler),\n    TRAINER_PAL(TWINS, gTrainerPalette_Twins),\n    TRAINER_PAL(COOL_COUPLE, gTrainerPalette_CoolCouple),\n    TRAINER_PAL(YOUNG_COUPLE, gTrainerPalette_YoungCouple),\n    TRAINER_PAL(CRUSH_KIN, gTrainerPalette_CrushKin),\n    TRAINER_PAL(SIS_AND_BRO, gTrainerPalette_SisAndBro),\n    TRAINER_PAL(PROFESSOR_OAK, gTrainerPalette_ProfessorOak),\n    TRAINER_PAL(RS_BRENDAN_2, gTrainerPalette_RSBrendan2),\n    TRAINER_PAL(RS_MAY_2, gTrainerPalette_RSMay2),\n    TRAINER_PAL(RED, gTrainerPalette_Red),\n    TRAINER_PAL(LEAF, gTrainerPalette_Leaf),\n    TRAINER_PAL(ROCKET_GRUNT_F, gTrainerPalette_RocketGruntF),\n    TRAINER_PAL(PSYCHIC_F, gTrainerPalette_PsychicF),\n    TRAINER_PAL(CRUSH_GIRL, gTrainerPalette_CrushGirl),\n    TRAINER_PAL(TUBER_F, gTrainerPalette_TuberF),\n    TRAINER_PAL(POKEMON_BREEDER, gTrainerPalette_PokemonBreeder),\n    TRAINER_PAL(POKEMON_RANGER_M, gTrainerPalette_PokemonRangerM),\n    TRAINER_PAL(POKEMON_RANGER_F, gTrainerPalette_PokemonRangerF),\n    TRAINER_PAL(AROMA_LADY, gTrainerPalette_AromaLady),\n    TRAINER_PAL(RUIN_MANIAC, gTrainerPalette_RuinManiac),\n    TRAINER_PAL(LADY, gTrainerPalette_Lady),\n    TRAINER_PAL(PAINTER, gTrainerPalette_Painter),\n    TRAINER_PAL(EM_BRENDAN, gTrainerPalette_EmBrendan),\n    TRAINER_PAL(EM_MAY, gTrainerPalette_EmMay),\n    TRAINER_PAL(MASTER_BEAUTY, gTrainerPalette_MasterBeauty),\n    TRAINER_PAL(MASTER_BIRD_KEEPER, gTrainerPalette_MasterBirdKeeper),\n    TRAINER_PAL(MASTER_COOLTRAINER_M, gTrainerPalette_MasterCooltrainerM),\n    TRAINER_PAL(MASTER_BLACK_BELT, gTrainerPalette_MasterBlackBelt),\n    TRAINER_PAL(MASTER_BUG_CATCHER, gTrainerPalette_MasterBugCatcher),\n    TRAINER_PAL(MASTER_HIKER, gTrainerPalette_MasterHiker),\n    TRAINER_PAL(MASTER_LASS, gTrainerPalette_MasterLass),\n    TRAINER_PAL(MASTER_PSYCHIC_M, gTrainerPalette_MasterPsychicM),\n    TRAINER_PAL(MASTER_SCIENTIST, gTrainerPalette_MasterScientist),\n    TRAINER_PAL(MASTER_YOUNGSTER, gTrainerPalette_MasterYoungster),\n    TRAINER_PAL(MASTER_SWIMMER, gTrainerPalette_MasterSwimmer),\n};\n"
  },
  {
    "path": "src/data/trainer_parties.h",
    "content": "static const struct TrainerMonItemCustomMoves sParty_LeaderLtSurgeRematch[] = {\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_ELECTRODE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_THUNDERBOLT, MOVE_SUBSTITUTE, MOVE_EXPLOSION, MOVE_THUNDER_WAVE},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_JOLTEON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_SUBSTITUTE, MOVE_BATON_PASS, MOVE_WISH},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_ELECTABUZZ,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_ICE_PUNCH, MOVE_TOXIC, MOVE_CROSS_CHOP},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_AMPHAROS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_FIRE_PUNCH, MOVE_REFLECT, MOVE_THUNDER_WAVE},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_MAGNETON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_METAL_SOUND, MOVE_SUBSTITUTE},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_RAICHU,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE, MOVE_FOCUS_PUNCH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_LeaderLtSurgeRematchChallenge[] = {\n    {\n        .iv = 7, //grass\n        .lvl = 63,\n        .evs = { 0, 164, 0, 176, 168, 0},\n        .nature = NATURE_HASTY,\n        .species = SPECIES_ELECTRODE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_THUNDERBOLT, MOVE_SUBSTITUTE, MOVE_EXPLOSION, MOVE_HIDDEN_POWER},\n    },\n    {\n        .iv = 8, //ice\n        .lvl = 64,\n        .evs = { 76, 0, 0, 252, 180, 0},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_JOLTEON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_HIDDEN_POWER, MOVE_BATON_PASS, MOVE_WISH},\n    },\n    {\n        .iv = 7, //grass\n        .lvl = 64,\n        .evs = { 0, 84, 0, 216, 208, 0},\n        .nature = NATURE_MILD,\n        .species = SPECIES_ELECTABUZZ,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_ICE_PUNCH, MOVE_HIDDEN_POWER, MOVE_CROSS_CHOP},\n    },\n    {\n        .iv = 8, //ice\n        .lvl = 63,\n        .evs = { 252, 0, 0, 4, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_AMPHAROS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_HIDDEN_POWER, MOVE_REFLECT, MOVE_THUNDER_WAVE},\n    },\n    {\n        .iv = 7, //grass\n        .lvl = 66,\n        .evs = { 68, 0, 0, 188, 252, 0},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_MAGNETON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_HIDDEN_POWER, MOVE_METAL_SOUND, MOVE_SUBSTITUTE},\n    },\n    {\n        .iv = 8, //ice\n        .lvl = 66,\n        .evs = { 4, 0, 0, 252, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_RAICHU,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE, MOVE_HIDDEN_POWER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderErikaRematch[] = {\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_JUMPLUFF,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ATTRACT, MOVE_SLEEP_POWDER, MOVE_SUBSTITUTE, MOVE_LEECH_SEED},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_EXEGGUTOR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_SLEEP_POWDER, MOVE_LEECH_SEED, MOVE_EXPLOSION},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_TANGELA,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SUNNY_DAY, MOVE_SLEEP_POWDER, MOVE_SOLAR_BEAM, MOVE_TOXIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_PARASECT,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SPORE, MOVE_SWORDS_DANCE, MOVE_SLUDGE_BOMB, MOVE_AERIAL_ACE},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_VICTREEBEL,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SWORDS_DANCE, MOVE_SLUDGE_BOMB, MOVE_SLEEP_POWDER, MOVE_GIGA_DRAIN},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_VILEPLUME,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SUNNY_DAY, MOVE_MOONLIGHT, MOVE_SOLAR_BEAM, MOVE_SLEEP_POWDER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_LeaderErikaRematchChallenge[] = {\n    {\n        .iv = 3, //flying\n        .lvl = 63,\n        .evs = { 148, 140, 0, 220, 0, 0},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_JUMPLUFF,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_SLEEP_POWDER, MOVE_SUBSTITUTE, MOVE_LEECH_SEED},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .evs = { 96, 0, 0, 60, 252, 96},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_EXEGGUTOR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_SLEEP_POWDER, MOVE_LEECH_SEED, MOVE_EXPLOSION},\n    },\n    {\n        .iv = 9, //fire\n        .lvl = 64,\n        .evs = { 4, 0, 0, 252, 252, 0},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_TANGELA,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SUNNY_DAY, MOVE_SLEEP_POWDER, MOVE_SOLAR_BEAM, MOVE_HIDDEN_POWER},\n    },\n    {\n        .iv = 2, //ground\n        .lvl = 63,\n        .evs = { 252, 252, 0, 4, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_PARASECT,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SPORE, MOVE_SWORDS_DANCE, MOVE_SLUDGE_BOMB, MOVE_HIDDEN_POWER},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 128, 252, 0, 128, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_VICTREEBEL,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SWORDS_DANCE, MOVE_SLUDGE_BOMB, MOVE_SLEEP_POWDER, MOVE_GIGA_DRAIN},\n    },\n    {\n        .iv = 9, //fire\n        .lvl = 66,\n        .evs = { 120, 0, 0, 126, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_VILEPLUME,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SUNNY_DAY, MOVE_HIDDEN_POWER, MOVE_SOLAR_BEAM, MOVE_SLEEP_POWDER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderKogaRematch[] = {\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_QWILFISH,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SUBSTITUTE, MOVE_SLUDGE_BOMB, MOVE_DESTINY_BOND, MOVE_SPIKES},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_ARIADOS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_SIGNAL_BEAM, MOVE_AGILITY, MOVE_BATON_PASS},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_CROBAT,\n        .heldItem = ITEM_CHOICE_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_AERIAL_ACE, MOVE_DOUBLE_EDGE, MOVE_TOXIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_MUK,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_FIRE_BLAST, MOVE_CURSE, MOVE_EXPLOSION},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_TENTACRUEL,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_GIGA_DRAIN, MOVE_SUBSTITUTE},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_WEEZING,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_WILL_O_WISP, MOVE_PAIN_SPLIT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_LeaderKogaRematchChallenge[] = {\n    {\n        .iv = 255,\n        .lvl = 63,\n        .evs = { 252, 0, 232, 0, 0, 24},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_QWILFISH,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SUBSTITUTE, MOVE_SLUDGE_BOMB, MOVE_DESTINY_BOND, MOVE_SPIKES},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .evs = { 252, 40, 108, 0, 0, 108},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_ARIADOS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_SIGNAL_BEAM, MOVE_AGILITY, MOVE_BATON_PASS},\n    },\n    {\n        .iv = 4, //fighting\n        .lvl = 64,\n        .evs = { 80, 252, 0, 176, 0, 0},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_CROBAT,\n        .heldItem = ITEM_CHOICE_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_AERIAL_ACE, MOVE_HIDDEN_POWER, MOVE_SHADOW_BALL},\n    },\n    {\n        .iv = 1, //ghost\n        .lvl = 63,\n        .evs = { 252, 156, 0, 0, 0, 100},\n        .nature = NATURE_SASSY,\n        .species = SPECIES_MUK,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_HIDDEN_POWER, MOVE_CURSE, MOVE_EXPLOSION},\n    },\n    {\n        .iv = 10, //electric\n        .lvl = 66,\n        .evs = { 72, 0, 0, 184, 252, 0},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_TENTACRUEL,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_GIGA_DRAIN, MOVE_HIDDEN_POWER},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 252, 178, 0, 12, 68, 0},\n        .nature = NATURE_BRAVE,\n        .species = SPECIES_WEEZING,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_WILL_O_WISP, MOVE_PAIN_SPLIT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderSabrinaRematch[] = {\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_MR_MIME,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_BATON_PASS, MOVE_SUBSTITUTE},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_HYPNO,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SEISMIC_TOSS, MOVE_REFLECT, MOVE_HYPNOSIS, MOVE_PSYCHIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_ESPEON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_BATON_PASS, MOVE_SUBSTITUTE},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_SLOWBRO,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_EARTHQUAKE, MOVE_CURSE, MOVE_SHADOW_BALL, MOVE_REST},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_JYNX,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_FAKE_OUT, MOVE_PSYCHIC, MOVE_LOVELY_KISS, MOVE_ICE_BEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_ICE_PUNCH, MOVE_FIRE_PUNCH, MOVE_RECOVER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_LeaderSabrinaRematchChallenge[] = {\n    {\n        .iv = 255,\n        .lvl = 63,\n        .evs = { 252, 0, 0, 0, 60, 196},\n        .nature = NATURE_CALM,\n        .species = SPECIES_MR_MIME,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_BATON_PASS, MOVE_SUBSTITUTE},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .evs = { 252, 0, 192, 64, 0, 0},\n        .nature = NATURE_BOLD,\n        .species = SPECIES_HYPNO,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SEISMIC_TOSS, MOVE_REFLECT, MOVE_HYPNOSIS, MOVE_PSYCHIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .evs = { 200, 0, 0, 72, 0, 236},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_ESPEON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_BATON_PASS, MOVE_SUBSTITUTE},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .evs = { 252, 176, 0, 0, 0, 80},\n        .nature = NATURE_BRAVE,\n        .species = SPECIES_SLOWBRO,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_EARTHQUAKE, MOVE_CURSE, MOVE_SHADOW_BALL, MOVE_SURF},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 0, 0, 4, 252, 252, 0},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_JYNX,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_FAKE_OUT, MOVE_PSYCHIC, MOVE_LOVELY_KISS, MOVE_ICE_BEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 4, 0, 0, 252, 252, 0},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_ICE_PUNCH, MOVE_FIRE_PUNCH, MOVE_RECOVER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderBlaineRematch[] = {\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_NINETALES,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SUNNY_DAY, MOVE_WILL_O_WISP, MOVE_SUBSTITUTE, MOVE_FIRE_BLAST},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_MAGMAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDER_PUNCH, MOVE_CROSS_CHOP, MOVE_FLAMETHROWER, MOVE_FIRE_BLAST},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_RAPIDASH,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_SUNNY_DAY, MOVE_HYPNOSIS, MOVE_SOLAR_BEAM, MOVE_FIRE_BLAST},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_HOUNDOOM,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CRUNCH, MOVE_FLAMETHROWER, MOVE_WILL_O_WISP, MOVE_REST},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_FLAREON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_WISH, MOVE_FLAMETHROWER, MOVE_PROTECT, MOVE_BATON_PASS},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HOWL, MOVE_EXTREME_SPEED, MOVE_DOUBLE_EDGE, MOVE_FIRE_BLAST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_LeaderBlaineRematchChallenge[] = {\n    {\n        .iv = 7, //grass\n        .lvl = 63,\n        .evs = { 100, 0, 0, 156, 252, 0},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_NINETALES,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SUNNY_DAY, MOVE_WILL_O_WISP, MOVE_HIDDEN_POWER, MOVE_FIRE_BLAST},\n    },\n    {\n        .iv = 7, //grass\n        .lvl = 64,\n        .evs = { 0, 64, 0, 192, 252, 0},\n        .nature = NATURE_MILD,\n        .species = SPECIES_MAGMAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDER_PUNCH, MOVE_CROSS_CHOP, MOVE_FLAMETHROWER, MOVE_HIDDEN_POWER},\n    },\n    {\n        .iv = 8, //ice\n        .lvl = 64,\n        .evs = { 4, 0, 0, 252, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_RAPIDASH,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_SUNNY_DAY, MOVE_HIDDEN_POWER, MOVE_SOLAR_BEAM, MOVE_FIRE_BLAST},\n    },\n    {\n        .iv = 7, //grass\n        .lvl = 63,\n        .evs = { 56, 0, 0, 188, 252, 12},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_HOUNDOOM,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CRUNCH, MOVE_FLAMETHROWER, MOVE_HIDDEN_POWER, MOVE_REST},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 252, 0, 0, 0, 4, 252},\n        .nature = NATURE_CALM,\n        .species = SPECIES_FLAREON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_WISH, MOVE_FLAMETHROWER, MOVE_PROTECT, MOVE_BATON_PASS},\n    },\n    {\n        .iv = 1, //ghost\n        .lvl = 66,\n        .evs = {184, 252, 0, 72, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_CHOICE_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_EXTREME_SPEED, MOVE_IRON_TAIL, MOVE_DOUBLE_EDGE, MOVE_HIDDEN_POWER},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PkmnRangerHelena[] = {\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_NIDOQUEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_CLEFABLE,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_WIGGLYTUFF,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PkmnRangerHelena2[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_NIDOQUEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_CLEFABLE,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_WIGGLYTUFF,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_AZUMARILL,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_CHANSEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_DUNSPARCE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CooltrainerAtticus[] = {\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_NIDOKING,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_MACHAMP,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_VICTREEBEL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CooltrainerAtticus2[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_NIDOKING,\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_MACHAMP,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_VICTREEBEL,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_KABUTOPS,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_STANTLER,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_DRAGONITE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanDeforest[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_POLIWRATH,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_SLOWBRO,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_CLOYSTER,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_OMASTAR,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanDeforest2[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_POLIWRATH,\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_SLOWBRO,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_POLIWRATH,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_CLOYSTER,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_OMASTAR,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_POLIWRATH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperSpedo[] = {\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_PIDGEOT,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_GOLBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_PIDGEOTTO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperSpedo2[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_PIDGEOT,\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_CROBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_PIDGEOT,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_AERODACTYL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CooltrainerCaspara[] = {\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_VILEPLUME,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_CHARIZARD,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_GENGAR,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerCaspara2[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_VILEPLUME,\n        .moves = {MOVE_AROMATHERAPY, MOVE_MEGA_DRAIN, MOVE_STUN_SPORE, MOVE_PETAL_DANCE},\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_CHARIZARD,\n        .moves = {MOVE_WING_ATTACK, MOVE_SLASH, MOVE_DRAGON_RAGE, MOVE_FIRE_SPIN},\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_GENGAR,\n        .moves = {MOVE_SHADOW_BALL, MOVE_CURSE, MOVE_CONFUSE_RAY, MOVE_NIGHT_SHADE},\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_AMPHAROS,\n        .moves = {MOVE_COTTON_SPORE, MOVE_THUNDER_PUNCH, MOVE_LIGHT_SCREEN, MOVE_THUNDER},\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_SUNFLORA,\n        .moves = {MOVE_INGRAIN, MOVE_SUNNY_DAY, MOVE_PETAL_DANCE, MOVE_SOLAR_BEAM},\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_PORYGON,\n        .moves = {MOVE_LOCK_ON, MOVE_TRI_ATTACK, MOVE_RECYCLE, MOVE_ZAP_CANNON},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleSedef[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_DEWGONG,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_TENTACRUEL,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_BLASTOISE,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_DEWGONG,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleSedef2[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_BLASTOISE,\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_POLITOED,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_SLOWKING,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_DEWGONG,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_TENTACRUEL,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_MANTINE,\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_MasterOak[] = {\n    {\n        .iv = 1, //ghost\n        .lvl = 80,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_TAUROS,\n        .heldItem = ITEM_SILK_SCARF,\n        .abilityNum = 0,\n        .moves = {MOVE_RETURN, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM},\n    },\n    {\n        .iv = 255, //dark\n        .lvl = 81,\n        .evs = { 124, 0, 0, 96, 188, 96},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_EXEGGUTOR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SUBSTITUTE, MOVE_LEECH_SEED, MOVE_HIDDEN_POWER, MOVE_PSYCHIC},\n    },\n    {\n        .iv = 4, //fighting\n        .lvl = 81,\n        .evs = { 252, 252, 0, 4, 0, 0},\n        .nature = NATURE_BRAVE,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HOWL, MOVE_EXTREME_SPEED, MOVE_HIDDEN_POWER, MOVE_OVERHEAT},\n    },\n    {\n        .iv = 6, //rock\n        .lvl = 80,\n        .evs = { 68, 252, 0, 188, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER, MOVE_DOUBLE_EDGE},\n    },\n    {\n        .iv = 8, //ice\n        .lvl = 80,\n        .evs = { 4, 0, 0, 252, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_RAICHU,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SUBSTITUTE, MOVE_THUNDERBOLT, MOVE_HIDDEN_POWER, MOVE_SURF},\n    },\n    {\n        .iv = 255,\n        .lvl = 82,\n        .evs = { 144, 96, 132, 0, 0, 136},\n        .nature = NATURE_CAREFUL,\n        .species = SPECIES_SNORLAX,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CURSE, MOVE_SHADOW_BALL, MOVE_REST, MOVE_RETURN},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_LeaderMistyRematchChallenge[] = {\n    {\n        .iv = 255,\n        .lvl = 63,\n        .evs = { 72, 0, 0, 184, 244, 184},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_CLOYSTER,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SPIKES, MOVE_SURF, MOVE_PROTECT, MOVE_ICE_BEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .evs = { 40, 0, 0, 0, 252, 216},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_LANTURN,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_SURF, MOVE_REST, MOVE_SLEEP_TALK},\n    },\n    {\n        .iv = 1, //ghost\n        .lvl = 64,\n        .evs = { 252, 252, 0, 4, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_AZUMARILL,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH, MOVE_HIDDEN_POWER, MOVE_ATTRACT},\n    },\n    {\n        .iv = 6, //rock\n        .lvl = 63,\n        .evs = { 252, 64, 0, 0, 0, 192},\n        .nature = NATURE_SASSY,\n        .species = SPECIES_QUAGSIRE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_CURSE, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER, MOVE_REST},\n    },\n    {\n        .iv = 3, //flying\n        .lvl = 66,\n        .evs = { 68, 252, 0, 188, 0, 0},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER, MOVE_THUNDER_WAVE},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 4, 0, 0, 252, 252, 0},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_STARMIE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_HYDRO_PUMP, MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_PSYCHIC},\n    },\n};\n\n// Trainer party data exists for all of the RS trainer classes, but\n// are only filled with one of the following placeholder pokemon.\n// The actual FRLG trainer party data starts after these.\n#define DUMMY_TRAINER_MON           \\\n    {                               \\\n        .lvl = 5,                   \\\n        .species = SPECIES_EKANS,   \\\n    }\n\n#define DUMMY_TRAINER_MON_IV        \\\n    {                               \\\n        .iv = 100,                  \\\n        .lvl = 5,                   \\\n        .species = SPECIES_EKANS,   \\\n    }\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_EliteFourSidney[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_EliteFourPhoebe[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LeaderRoxanne[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LeaderBrawly[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LeaderTateLiza[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SchoolKidM[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SchoolKidF[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SrAndJr[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokefanM[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokefanF[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ExpertM[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ExpertF[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSYoungster[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSChampion[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSFisherman[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CyclingTriathleteM[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CyclingTriathleteF[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RunningTriathleteM[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RunningTriathleteF[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmingTriathleteM[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmingTriathleteF[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_DragonTamer[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSBirdKeeper[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_NinjaBoy[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BattleGirl[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ParasolLady[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSSwimmerF[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSPicnicker[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSTwins[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSSailor[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BoarderM[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BoarderF[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Collector[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Wally[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Brendan[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Brendan2[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Brendan3[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_May[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_May2[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_May3[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSPkmnBreederM[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSPkmnBreederF[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSPkmnRangerM[] = {DUMMY_TRAINER_MON_IV};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSPkmnRangerF[] = {DUMMY_TRAINER_MON_IV};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_MagmaLeader[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_MagmaGruntM[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_MagmaGruntF[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSLass[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSBugCatcher[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSHiker[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSYoungCouple[] = {DUMMY_TRAINER_MON, DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_OldCouple[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RSSisAndBro[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_AquaAdminMatt[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_AquaAdminShelly[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_MagmaAdminTabitha[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_MagmaAdminCourtney[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LeaderWattson[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LeaderFlannery[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LeaderNorman[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LeaderWinona[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LeaderWallace[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_EliteFourGlacia[] = {DUMMY_TRAINER_MON};\nstatic const struct TrainerMonNoItemDefaultMoves sParty_EliteFourDrake[] = {DUMMY_TRAINER_MON};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterBen[] = {\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterCalvin[] = {\n    {\n        .iv = 0,\n        .lvl = 14,\n        .species = SPECIES_SPEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterJosh[] = {\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_ZUBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterTimmy[] = {\n    {\n        .iv = 0,\n        .lvl = 14,\n        .species = SPECIES_SANDSHREW,\n    },\n    {\n        .iv = 0,\n        .lvl = 14,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterJoey[] = {\n    {\n        .iv = 0,\n        .lvl = 15,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 15,\n        .species = SPECIES_SPEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterDan[] = {\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_SLOWPOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterChad[] = {\n    {\n        .iv = 0,\n        .lvl = 14,\n        .species = SPECIES_EKANS,\n    },\n    {\n        .iv = 0,\n        .lvl = 14,\n        .species = SPECIES_SANDSHREW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterTyler[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_NIDORAN_M,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterEddie[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterDillon[] = {\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_SANDSHREW,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_ZUBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterYasu[] = {\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_RATICATE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterDave[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_NIDORAN_M,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_NIDORINO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterBen2[] = {\n    {\n        .iv = 20,\n        .lvl = 17,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 20,\n        .lvl = 17,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherRick[] = {\n    {\n        .iv = 0,\n        .lvl = 6,\n        .species = SPECIES_WEEDLE,\n    },\n    {\n        .iv = 0,\n        .lvl = 6,\n        .species = SPECIES_CATERPIE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherDoug[] = {\n    {\n        .iv = 0,\n        .lvl = 7,\n        .species = SPECIES_WEEDLE,\n    },\n    {\n        .iv = 0,\n        .lvl = 7,\n        .species = SPECIES_KAKUNA,\n    },\n    {\n        .iv = 0,\n        .lvl = 7,\n        .species = SPECIES_WEEDLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherSammy[] = {\n    {\n        .iv = 0,\n        .lvl = 9,\n        .species = SPECIES_WEEDLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherColton[] = {\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_CATERPIE,\n    },\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_WEEDLE,\n    },\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_CATERPIE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherGreg[] = {\n    {\n        .iv = 0,\n        .lvl = 9,\n        .species = SPECIES_WEEDLE,\n    },\n    {\n        .iv = 0,\n        .lvl = 9,\n        .species = SPECIES_KAKUNA,\n    },\n    {\n        .iv = 0,\n        .lvl = 9,\n        .species = SPECIES_CATERPIE,\n    },\n    {\n        .iv = 0,\n        .lvl = 9,\n        .species = SPECIES_METAPOD,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherJames[] = {\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_CATERPIE,\n    },\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_METAPOD,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherKent[] = {\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_WEEDLE,\n    },\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_KAKUNA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherRobby[] = {\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_CATERPIE,\n    },\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_METAPOD,\n    },\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_CATERPIE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherCale[] = {\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_CATERPIE,\n    },\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_WEEDLE,\n    },\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_METAPOD,\n    },\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_KAKUNA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherKeigo[] = {\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_WEEDLE,\n    },\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_CATERPIE,\n    },\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_WEEDLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherElijah[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_BUTTERFREE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher2[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_METAPOD,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_CATERPIE,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_VENONAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherBrent[] = {\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_BEEDRILL,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_BEEDRILL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherConner[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_CATERPIE,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_WEEDLE,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_VENONAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassJanice[] = {\n    {\n        .iv = 0,\n        .lvl = 9,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 9,\n        .species = SPECIES_PIDGEY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassSally[] = {\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_NIDORAN_F,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassRobin[] = {\n    {\n        .iv = 0,\n        .lvl = 14,\n        .species = SPECIES_JIGGLYPUFF,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassCrissy[] = {\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_PARAS,\n    },\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_PARAS,\n    },\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_PARASECT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassMiriam[] = {\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_ODDISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_BELLSPROUT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassIris[] = {\n    {\n        .iv = 0,\n        .lvl = 14,\n        .species = SPECIES_CLEFAIRY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassReli[] = {\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_NIDORAN_M,\n    },\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_NIDORAN_F,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassAli[] = {\n    {\n        .iv = 0,\n        .lvl = 12,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 12,\n        .species = SPECIES_ODDISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 12,\n        .species = SPECIES_BELLSPROUT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Lass2[] = {\n    {\n        .iv = 0,\n        .lvl = 15,\n        .species = SPECIES_NIDORAN_M,\n    },\n    {\n        .iv = 0,\n        .lvl = 15,\n        .species = SPECIES_NIDORAN_F,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassHaley[] = {\n    {\n        .iv = 0,\n        .lvl = 13,\n        .species = SPECIES_ODDISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 13,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 13,\n        .species = SPECIES_ODDISH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassAnn[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_NIDORAN_F,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassDawn[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_PIKACHU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassPaige[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_NIDORAN_F,\n    },\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_NIDORINA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassAndrea[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_MEOWTH,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_MEOWTH,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_MEOWTH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassMegan[] = {\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_NIDORAN_M,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_MEOWTH,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_PIKACHU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassJulia[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_CLEFAIRY,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_CLEFAIRY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassKay[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_BELLSPROUT,\n    },\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_WEEPINBELL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassLisa[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_ODDISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_GLOOM,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SailorEdmond[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_SHELLDER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SailorTrevor[] = {\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_TENTACOOL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SailorLeonard[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_SHELLDER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SailorDuncan[] = {\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_HORSEA,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_SHELLDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_TENTACOOL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SailorHuey[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_STARYU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SailorDylan[] = {\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_HORSEA,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_HORSEA,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_HORSEA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SailorPhillip[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_MACHOP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SailorDwayne[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_PIKACHU,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CamperLiam[] = {\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_GEODUDE,\n        .moves = {MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_NONE, MOVE_NONE},\n    },\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_SANDSHREW,\n        .moves = {MOVE_SCRATCH, MOVE_DEFENSE_CURL, MOVE_SAND_ATTACK, MOVE_NONE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperShane[] = {\n    {\n        .iv = 0,\n        .lvl = 14,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 14,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperEthan[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_MANKEY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperRicky[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_SQUIRTLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperJeff[] = {\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_RATICATE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Camper2[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperChris[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_CHARMANDER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperDrew[] = {\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_SANDSHREW,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_EKANS,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_SANDSHREW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerDiana[] = {\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_GOLDEEN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerNancy[] = {\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_PIKACHU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerIsabelle[] = {\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_PIDGEY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerKelsey[] = {\n    {\n        .iv = 0,\n        .lvl = 15,\n        .species = SPECIES_NIDORAN_M,\n    },\n    {\n        .iv = 0,\n        .lvl = 15,\n        .species = SPECIES_NIDORAN_F,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerAlicia[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_ODDISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_BELLSPROUT,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_ODDISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_BELLSPROUT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerCaitlin[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_MEOWTH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerHeidi[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_CLEFAIRY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerCarol[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_PIDGEOTTO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerSofia[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_JIGGLYPUFF,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_MEOWTH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerMartha[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_ODDISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_BULBASAUR,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerTina[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_BULBASAUR,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_IVYSAUR,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerHannah[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_MEOWTH,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_MEOWTH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacMark[] = {\n    {\n        .iv = 30,\n        .lvl = 29,\n        .species = SPECIES_RHYHORN,\n    },\n    {\n        .iv = 30,\n        .lvl = 29,\n        .species = SPECIES_LICKITUNG,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacHerman[] = {\n    {\n        .iv = 30,\n        .lvl = 20,\n        .species = SPECIES_CUBONE,\n    },\n    {\n        .iv = 30,\n        .lvl = 20,\n        .species = SPECIES_SLOWPOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacCooper[] = {\n    {\n        .iv = 30,\n        .lvl = 20,\n        .species = SPECIES_SLOWPOKE,\n    },\n    {\n        .iv = 30,\n        .lvl = 20,\n        .species = SPECIES_SLOWPOKE,\n    },\n    {\n        .iv = 30,\n        .lvl = 20,\n        .species = SPECIES_SLOWPOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacSteve[] = {\n    {\n        .iv = 30,\n        .lvl = 22,\n        .species = SPECIES_CHARMANDER,\n    },\n    {\n        .iv = 30,\n        .lvl = 22,\n        .species = SPECIES_CUBONE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacWinston[] = {\n    {\n        .iv = 30,\n        .lvl = 25,\n        .species = SPECIES_SLOWPOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacDawson[] = {\n    {\n        .iv = 30,\n        .lvl = 40,\n        .species = SPECIES_CHARMELEON,\n    },\n    {\n        .iv = 30,\n        .lvl = 40,\n        .species = SPECIES_LAPRAS,\n    },\n    {\n        .iv = 30,\n        .lvl = 40,\n        .species = SPECIES_LICKITUNG,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacAshton[] = {\n    {\n        .iv = 30,\n        .lvl = 23,\n        .species = SPECIES_CUBONE,\n    },\n    {\n        .iv = 30,\n        .lvl = 23,\n        .species = SPECIES_SLOWPOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdJovan[] = {\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_MAGNEMITE,\n    },\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_VOLTORB,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdMiguel[] = {\n    {\n        .iv = 0,\n        .lvl = 12,\n        .species = SPECIES_GRIMER,\n    },\n    {\n        .iv = 0,\n        .lvl = 12,\n        .species = SPECIES_VOLTORB,\n    },\n    {\n        .iv = 0,\n        .lvl = 12,\n        .species = SPECIES_KOFFING,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_SuperNerdAidan[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_VOLTORB,\n        .moves = {MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_TACKLE, MOVE_CHARGE},\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS},\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_VOLTORB,\n        .moves = {MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_TACKLE, MOVE_CHARGE},\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_MAGNEMITE,\n        .moves = {MOVE_SONIC_BOOM, MOVE_SUPERSONIC, MOVE_THUNDER_SHOCK, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdGlenn[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GRIMER,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_MUK,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GRIMER,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_SuperNerdLeslie[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SLUDGE, MOVE_SMOKESCREEN, MOVE_SMOG, MOVE_SELF_DESTRUCT},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SuperNerd1[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_KOFFING,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_MAGNEMITE,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_WEEZING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SuperNerd2[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_MAGNEMITE,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_MAGNEMITE,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_KOFFING,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_MAGNEMITE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SuperNerd3[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_MAGNEMITE,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_VOLTORB,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdErik[] = {\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_VULPIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_VULPIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_NINETALES,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdAvery[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_PONYTA,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_CHARMANDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_VULPIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_GROWLITHE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdDerek[] = {\n    {\n        .iv = 0,\n        .lvl = 41,\n        .species = SPECIES_RAPIDASH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdZac[] = {\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_VULPIX,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerMarcos[] = {\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_GEODUDE,\n    },\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_GEODUDE,\n    },\n    {\n        .iv = 0,\n        .lvl = 10,\n        .species = SPECIES_ONIX,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerFranklin[] = {\n    {\n        .iv = 0,\n        .lvl = 15,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 15,\n        .species = SPECIES_GEODUDE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerNob[] = {\n    {\n        .iv = 0,\n        .lvl = 13,\n        .species = SPECIES_GEODUDE,\n    },\n    {\n        .iv = 0,\n        .lvl = 13,\n        .species = SPECIES_GEODUDE,\n    },\n    {\n        .iv = 0,\n        .lvl = 13,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 13,\n        .species = SPECIES_GEODUDE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerWayne[] = {\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_ONIX,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_HikerAlan[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_GEODUDE,\n        .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL},\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_ONIX,\n        .moves = {MOVE_HARDEN, MOVE_ROCK_THROW, MOVE_BIND, MOVE_SCREECH},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerBrice[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_GEODUDE,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_GEODUDE,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_HikerClark[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_GEODUDE,\n        .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL},\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_ONIX,\n        .moves = {MOVE_HARDEN, MOVE_ROCK_THROW, MOVE_BIND, MOVE_SCREECH},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerTrent[] = {\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_ONIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_GRAVELER,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_HikerDudley[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_GEODUDE,\n        .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL},\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_GEODUDE,\n        .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL},\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_GRAVELER,\n        .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_HikerAllen[] = {\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_GEODUDE,\n        .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerEric[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_ONIX,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerLenny[] = {\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_GEODUDE,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_GEODUDE,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_GEODUDE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerOliver[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_ONIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_ONIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_GEODUDE,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_HikerLucas[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_GEODUDE,\n        .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL},\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_GRAVELER,\n        .moves = {MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerJared[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_POISON_GAS},\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerMalik[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerErnest[] = {\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE, MOVE_POUND},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerAlex[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerLao[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Biker1[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BikerHideo[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_WEEZING,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerRuben[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BikerBilly[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_MUK,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerNikolas[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_VOLTORB,\n        .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_CHARGE},\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_VOLTORB,\n        .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_CHARGE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerJaxon[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SLUDGE, MOVE_SMOKESCREEN, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MUK,\n        .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerWilliam[] = {\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SELF_DESTRUCT, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerLukas[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerIsaac[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerGerald[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MUK,\n        .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Burglar1[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_VULPIX,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Burglar2[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_GROWLITHE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Burglar3[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_VULPIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_CHARMANDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_PONYTA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BurglarQuinn[] = {\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_VULPIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_NINETALES,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BurglarRamon[] = {\n    {\n        .iv = 0,\n        .lvl = 41,\n        .species = SPECIES_PONYTA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BurglarDusty[] = {\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_VULPIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_GROWLITHE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BurglarArnie[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_CHARMANDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_CHARMELEON,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Burglar4[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_CHARMANDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_CHARMELEON,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BurglarSimon[] = {\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_NINETALES,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BurglarLewis[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_PONYTA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_EngineerBaily[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_VOLTORB,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_MAGNEMITE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_EngineerBraxton[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_MAGNEMITE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_EngineerBernie[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_MAGNEMITE,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_MAGNEMITE,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_MAGNETON,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanDale[] = {\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_GOLDEEN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanBarny[] = {\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_STARYU,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_SHELLDER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanNed[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_POLIWAG,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GOLDEEN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanChip[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GOLDEEN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanHank[] = {\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_GOLDEEN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanElliot[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_POLIWAG,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_SHELLDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_HORSEA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanRonald[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_SEAKING,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_SEAKING,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_SEAKING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanClaude[] = {\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_SHELLDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_CLOYSTER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanWade[] = {\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_MAGIKARP,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_MAGIKARP,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_MAGIKARP,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_MAGIKARP,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_MAGIKARP,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_MAGIKARP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanNolan[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_SEAKING,\n    },\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_GOLDEEN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanAndrew[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_MAGIKARP,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_MAGIKARP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleLuis[] = {\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_HORSEA,\n    },\n    {\n        .iv = 0,\n        .lvl = 16,\n        .species = SPECIES_SHELLDER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleRichard[] = {\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_SHELLDER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleReece[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_HORSEA,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_STARYU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleMatthew[] = {\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_POLIWAG,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_POLIWHIRL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleDouglas[] = {\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_HORSEA,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_GOLDEEN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleDavid[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_SHELLDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_SEAKING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleTony[] = {\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_HORSEA,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_HORSEA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleAxle[] = {\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_STARYU,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_HORSEA,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_TENTACRUEL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleBarry[] = {\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_SHELLDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_CLOYSTER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleDean[] = {\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_STARYU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleDarrin[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_HORSEA,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_HORSEA,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_SEADRA,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_HORSEA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleSpencer[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_SEADRA,\n    },\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_TENTACRUEL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleJack[] = {\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_STARMIE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleJerome[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_STARYU,\n    },\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_WARTORTLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleRoland[] = {\n    {\n        .iv = 0,\n        .lvl = 32,\n        .species = SPECIES_POLIWHIRL,\n    },\n    {\n        .iv = 0,\n        .lvl = 32,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 32,\n        .species = SPECIES_SEADRA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallKoji[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_MANKEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_MACHOP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallLuke[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MANKEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MACHOP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallCamron[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MANKEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MACHOP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallRaul[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MANKEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_PRIMEAPE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallIsaiah[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MACHAMP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallZeek[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_MACHOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallJamal[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_MANKEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_MANKEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_MACHAMP,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_MACHOP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallCorey[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_PRIMEAPE,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MACHOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallChase[] = {\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_TENTACRUEL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GamerHugo[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_POLIWAG,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_HORSEA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GamerJasper[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_BELLSPROUT,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_ODDISH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GamerDirk[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_VOLTORB,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_MAGNEMITE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GamerDarian[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_VULPIX,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GamerStan[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_POLIWAG,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_POLIWAG,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_POLIWHIRL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Gamer1[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GamerRich[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_VULPIX,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BeautyBridget[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_ODDISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_BELLSPROUT,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_ODDISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_BELLSPROUT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BeautyTamia[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_BELLSPROUT,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_BELLSPROUT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BeautyLori[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_EXEGGCUTE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BeautyLola[] = {\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_RATTATA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BeautySheila[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_CLEFAIRY,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MEOWTH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleTiffany[] = {\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_SEAKING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleNora[] = {\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_SHELLDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_SHELLDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_CLOYSTER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleMelissa[] = {\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_POLIWAG,\n    },\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_SEAKING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BeautyGrace[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_WIGGLYTUFF,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BeautyOlivia[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_BULBASAUR,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_IVYSAUR,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BeautyLauren[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_WEEPINBELL,\n    },\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_BELLSPROUT,\n    },\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_WEEPINBELL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleAnya[] = {\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_POLIWAG,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_SEAKING,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_POLIWAG,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleAlice[] = {\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_SEAKING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleConnie[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_STARYU,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_STARYU,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_STARYU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleShirley[] = {\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_SEADRA,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_HORSEA,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_SEADRA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PsychicJohan[] = {\n    {\n        .iv = 50,\n        .lvl = 31,\n        .species = SPECIES_KADABRA,\n    },\n    {\n        .iv = 50,\n        .lvl = 31,\n        .species = SPECIES_SLOWPOKE,\n    },\n    {\n        .iv = 50,\n        .lvl = 31,\n        .species = SPECIES_MR_MIME,\n    },\n    {\n        .iv = 50,\n        .lvl = 31,\n        .species = SPECIES_KADABRA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PsychicTyron[] = {\n    {\n        .iv = 50,\n        .lvl = 34,\n        .species = SPECIES_MR_MIME,\n    },\n    {\n        .iv = 50,\n        .lvl = 34,\n        .species = SPECIES_KADABRA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PsychicCameron[] = {\n    {\n        .iv = 50,\n        .lvl = 33,\n        .species = SPECIES_SLOWPOKE,\n    },\n    {\n        .iv = 50,\n        .lvl = 33,\n        .species = SPECIES_SLOWPOKE,\n    },\n    {\n        .iv = 50,\n        .lvl = 33,\n        .species = SPECIES_SLOWBRO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PsychicPreston[] = {\n    {\n        .iv = 50,\n        .lvl = 38,\n        .species = SPECIES_SLOWBRO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RockerRandall[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_VOLTORB,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_MAGNEMITE,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_VOLTORB,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RockerLuca[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_VOLTORB,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_ELECTRODE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_JugglerDalton[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_KADABRA,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MR_MIME,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_JugglerNelson[] = {\n    {\n        .iv = 0,\n        .lvl = 41,\n        .species = SPECIES_DROWZEE,\n    },\n    {\n        .iv = 0,\n        .lvl = 41,\n        .species = SPECIES_HYPNO,\n    },\n    {\n        .iv = 0,\n        .lvl = 41,\n        .species = SPECIES_KADABRA,\n    },\n    {\n        .iv = 0,\n        .lvl = 41,\n        .species = SPECIES_KADABRA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_JugglerKirk[] = {\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_DROWZEE,\n    },\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_DROWZEE,\n    },\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_KADABRA,\n    },\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_DROWZEE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_JugglerShawn[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_DROWZEE,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_HYPNO,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_JugglerGregory[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_MR_MIME,\n        .moves = {MOVE_PSYCHIC, MOVE_ROLE_PLAY, MOVE_DOUBLE_SLAP, MOVE_ENCORE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_JugglerEdward[] = {\n    {\n        .iv = 0,\n        .lvl = 46,\n        .species = SPECIES_VOLTORB,\n        .moves = {MOVE_SWIFT, MOVE_LIGHT_SCREEN, MOVE_SPARK, MOVE_SONIC_BOOM},\n    },\n    {\n        .iv = 0,\n        .lvl = 46,\n        .species = SPECIES_VOLTORB,\n        .moves = {MOVE_SWIFT, MOVE_LIGHT_SCREEN, MOVE_SPARK, MOVE_SONIC_BOOM},\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_ELECTRODE,\n        .moves = {MOVE_SWIFT, MOVE_SPARK, MOVE_SELF_DESTRUCT, MOVE_SONIC_BOOM},\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_MR_MIME,\n        .moves = {MOVE_PSYCHIC, MOVE_ROLE_PLAY, MOVE_REFLECT, MOVE_ENCORE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_JugglerKayden[] = {\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_HYPNO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_JugglerNate[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_DROWZEE,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_KADABRA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TamerPhil[] = {\n    {\n        .iv = 40,\n        .lvl = 34,\n        .species = SPECIES_SANDSLASH,\n    },\n    {\n        .iv = 40,\n        .lvl = 34,\n        .species = SPECIES_ARBOK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TamerEdgar[] = {\n    {\n        .iv = 40,\n        .lvl = 33,\n        .species = SPECIES_ARBOK,\n    },\n    {\n        .iv = 40,\n        .lvl = 33,\n        .species = SPECIES_SANDSLASH,\n    },\n    {\n        .iv = 40,\n        .lvl = 33,\n        .species = SPECIES_ARBOK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TamerJason[] = {\n    {\n        .iv = 40,\n        .lvl = 43,\n        .species = SPECIES_RHYHORN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TamerCole[] = {\n    {\n        .iv = 40,\n        .lvl = 39,\n        .species = SPECIES_ARBOK,\n    },\n    {\n        .iv = 40,\n        .lvl = 39,\n        .species = SPECIES_TAUROS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TamerVincent[] = {\n    {\n        .iv = 40,\n        .lvl = 44,\n        .species = SPECIES_PERSIAN,\n    },\n    {\n        .iv = 40,\n        .lvl = 44,\n        .species = SPECIES_GOLDUCK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TamerJohn[] = {\n    {\n        .iv = 40,\n        .lvl = 42,\n        .species = SPECIES_RHYHORN,\n    },\n    {\n        .iv = 40,\n        .lvl = 42,\n        .species = SPECIES_PRIMEAPE,\n    },\n    {\n        .iv = 40,\n        .lvl = 42,\n        .species = SPECIES_ARBOK,\n    },\n    {\n        .iv = 40,\n        .lvl = 42,\n        .species = SPECIES_TAUROS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperSebastian[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_PIDGEOTTO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperPerry[] = {\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_SPEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperRobert[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperDonald[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_FARFETCHD,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperBenny[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperEdwin[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_FARFETCHD,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_DODUO,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_PIDGEY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperChester[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_DODRIO,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_DODUO,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_DODUO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperWilton[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperRamiro[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_DODRIO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperJacob[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_SPEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperRoger[] = {\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_PIDGEOTTO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperReed[] = {\n    {\n        .iv = 0,\n        .lvl = 39,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 0,\n        .lvl = 39,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 0,\n        .lvl = 39,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 39,\n        .species = SPECIES_PIDGEOTTO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperKeith[] = {\n    {\n        .iv = 0,\n        .lvl = 39,\n        .species = SPECIES_FARFETCHD,\n    },\n    {\n        .iv = 0,\n        .lvl = 39,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperCarter[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_DODUO,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_PIDGEOTTO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperMitch[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperBeck[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperMarlon[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_DODUO,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltKoichi[] = {\n    {\n        .iv = 100,\n        .lvl = 37,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 37,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltMike[] = {\n    {\n        .iv = 100,\n        .lvl = 31,\n        .species = SPECIES_MANKEY,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 31,\n        .species = SPECIES_MANKEY,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 31,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltHideki[] = {\n    {\n        .iv = 100,\n        .lvl = 32,\n        .species = SPECIES_MACHOP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 32,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltAaron[] = {\n    {\n        .iv = 100,\n        .lvl = 36,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltHitoshi[] = {\n    {\n        .iv = 100,\n        .lvl = 31,\n        .species = SPECIES_MACHOP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 31,\n        .species = SPECIES_MANKEY,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 31,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltAtsushi[] = {\n    {\n        .iv = 100,\n        .lvl = 40,\n        .species = SPECIES_MACHOP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 40,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltKiyo[] = {\n    {\n        .iv = 100,\n        .lvl = 43,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltTakashi[] = {\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_MACHOP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltDaisuke[] = {\n    {\n        .iv = 100,\n        .lvl = 43,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 43,\n        .species = SPECIES_MACHOP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 43,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RivalOaksLabSquirtle[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_SQUIRTLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RivalOaksLabBulbasaur[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_BULBASAUR,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RivalOaksLabCharmander[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_CHARMANDER,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_RivalRoute22EarlySquirtle[] = {\n    {\n        .iv = 50,\n        .lvl = 9,\n        .species = SPECIES_PIDGEY,\n        .moves = {MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_NONE, MOVE_NONE},\n    },\n    {\n        .iv = 50,\n        .lvl = 9,\n        .species = SPECIES_SQUIRTLE,\n        .moves = {MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_NONE, MOVE_NONE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_RivalRoute22EarlyBulbasaur[] = {\n    {\n        .iv = 50,\n        .lvl = 9,\n        .species = SPECIES_PIDGEY,\n        .moves = {MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_NONE, MOVE_NONE},\n    },\n    {\n        .iv = 50,\n        .lvl = 9,\n        .species = SPECIES_BULBASAUR,\n        .moves = {MOVE_TACKLE, MOVE_GROWL, MOVE_NONE, MOVE_NONE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_RivalRoute22EarlyCharmander[] = {\n    {\n        .iv = 50,\n        .lvl = 9,\n        .species = SPECIES_PIDGEY,\n        .moves = {MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_NONE, MOVE_NONE},\n    },\n    {\n        .iv = 50,\n        .lvl = 9,\n        .species = SPECIES_CHARMANDER,\n        .moves = {MOVE_SCRATCH, MOVE_GROWL, MOVE_NONE, MOVE_NONE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_RivalCeruleanSquirtle[] = {\n    {\n        .iv = 50,\n        .lvl = 17,\n        .species = SPECIES_PIDGEOTTO,\n        .moves = {MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK},\n    },\n    {\n        .iv = 50,\n        .lvl = 16,\n        .species = SPECIES_ABRA,\n        .moves = {MOVE_TELEPORT, MOVE_NONE, MOVE_NONE, MOVE_NONE},\n    },\n    {\n        .iv = 50,\n        .lvl = 15,\n        .species = SPECIES_RATTATA,\n        .moves = {MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_QUICK_ATTACK, MOVE_NONE},\n    },\n    {\n        .iv = 100,\n        .lvl = 18,\n        .species = SPECIES_SQUIRTLE,\n        .moves = {MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_WITHDRAW, MOVE_WATER_GUN},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_RivalCeruleanBulbasaur[] = {\n    {\n        .iv = 50,\n        .lvl = 17,\n        .species = SPECIES_PIDGEOTTO,\n        .moves = {MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK},\n    },\n    {\n        .iv = 50,\n        .lvl = 16,\n        .species = SPECIES_ABRA,\n        .moves = {MOVE_TELEPORT, MOVE_NONE, MOVE_NONE, MOVE_NONE},\n    },\n    {\n        .iv = 50,\n        .lvl = 15,\n        .species = SPECIES_RATTATA,\n        .moves = {MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_QUICK_ATTACK, MOVE_NONE},\n    },\n    {\n        .iv = 100,\n        .lvl = 18,\n        .species = SPECIES_BULBASAUR,\n        .moves = {MOVE_SLEEP_POWDER, MOVE_POISON_POWDER, MOVE_VINE_WHIP, MOVE_LEECH_SEED},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_RivalCeruleanCharmander[] = {\n    {\n        .iv = 50,\n        .lvl = 17,\n        .species = SPECIES_PIDGEOTTO,\n        .moves = {MOVE_TACKLE, MOVE_SAND_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK},\n    },\n    {\n        .iv = 50,\n        .lvl = 16,\n        .species = SPECIES_ABRA,\n        .moves = {MOVE_TELEPORT, MOVE_NONE, MOVE_NONE, MOVE_NONE},\n    },\n    {\n        .iv = 50,\n        .lvl = 15,\n        .species = SPECIES_RATTATA,\n        .moves = {MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_QUICK_ATTACK, MOVE_NONE},\n    },\n    {\n        .iv = 100,\n        .lvl = 18,\n        .species = SPECIES_CHARMANDER,\n        .moves = {MOVE_METAL_CLAW, MOVE_EMBER, MOVE_GROWL, MOVE_SCRATCH},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ScientistTed[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_ELECTRODE,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_WEEZING,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_ScientistConnor[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_SELF_DESTRUCT},\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ScientistJerry[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_MAGNEMITE,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_VOLTORB,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_MAGNETON,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_ScientistJose[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_ELECTRODE,\n        .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ScientistRodney[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_ELECTRODE,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_ScientistBeau[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_MAGNETON,\n        .moves = {MOVE_SPARK, MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM, MOVE_SUPERSONIC},\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_MAGNEMITE,\n        .moves = {MOVE_SPARK, MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM, MOVE_SUPERSONIC},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_ScientistTaylor[] = {\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_VOLTORB,\n        .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_MAGNETON,\n        .moves = {MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM, MOVE_SUPERSONIC, MOVE_THUNDER_SHOCK},\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_MAGNEMITE,\n        .moves = {MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM, MOVE_SUPERSONIC, MOVE_THUNDER_SHOCK},\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_SELF_DESTRUCT},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ScientistJoshua[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_ELECTRODE,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MUK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ScientistParker[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_GRIMER,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_ELECTRODE,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_ScientistEd[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_VOLTORB,\n        .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_TACKLE, MOVE_SMOG},\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_MAGNETON,\n        .moves = {MOVE_SPARK, MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM, MOVE_SUPERSONIC},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ScientistTravis[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MAGNEMITE,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_KOFFING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ScientistBraydon[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_MAGNEMITE,\n    },\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_MAGNETON,\n    },\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_VOLTORB,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ScientistIvan[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_MAGNEMITE,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_ELECTRODE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BossGiovanni[] = {\n    {\n        .iv = 250,\n        .lvl = 25,\n        .species = SPECIES_ONIX,\n    },\n    {\n        .iv = 250,\n        .lvl = 24,\n        .species = SPECIES_RHYHORN,\n    },\n    {\n        .iv = 250,\n        .lvl = 29,\n        .species = SPECIES_KANGASKHAN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BossGiovanni2[] = {\n    {\n        .iv = 250,\n        .lvl = 37,\n        .species = SPECIES_NIDORINO,\n    },\n    {\n        .iv = 250,\n        .lvl = 35,\n        .species = SPECIES_KANGASKHAN,\n    },\n    {\n        .iv = 250,\n        .lvl = 37,\n        .species = SPECIES_RHYHORN,\n    },\n    {\n        .iv = 250,\n        .lvl = 41,\n        .species = SPECIES_NIDOQUEEN,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_LeaderGiovanni[] = {\n    {\n        .iv = 0,\n        .lvl = 45,\n        .species = SPECIES_RHYHORN,\n        .moves = {MOVE_TAKE_DOWN, MOVE_ROCK_BLAST, MOVE_SCARY_FACE, MOVE_EARTHQUAKE},\n    },\n    {\n        .iv = 0,\n        .lvl = 42,\n        .species = SPECIES_DUGTRIO,\n        .moves = {MOVE_SLASH, MOVE_SAND_TOMB, MOVE_MUD_SLAP, MOVE_EARTHQUAKE},\n    },\n    {\n        .iv = 0,\n        .lvl = 44,\n        .species = SPECIES_NIDOQUEEN,\n        .moves = {MOVE_BODY_SLAM, MOVE_DOUBLE_KICK, MOVE_POISON_STING, MOVE_EARTHQUAKE},\n    },\n    {\n        .iv = 0,\n        .lvl = 45,\n        .species = SPECIES_NIDOKING,\n        .moves = {MOVE_THRASH, MOVE_DOUBLE_KICK, MOVE_POISON_STING, MOVE_EARTHQUAKE},\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_RHYHORN,\n        .moves = {MOVE_TAKE_DOWN, MOVE_ROCK_BLAST, MOVE_SCARY_FACE, MOVE_EARTHQUAKE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt[] = {\n    {\n        .iv = 0,\n        .lvl = 13,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 13,\n        .species = SPECIES_ZUBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt2[] = {\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_SANDSHREW,\n    },\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_ZUBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt3[] = {\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 11,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt4[] = {\n    {\n        .iv = 0,\n        .lvl = 13,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 13,\n        .species = SPECIES_SANDSHREW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt5[] = {\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_DROWZEE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt6[] = {\n    {\n        .iv = 0,\n        .lvl = 15,\n        .species = SPECIES_EKANS,\n    },\n    {\n        .iv = 0,\n        .lvl = 15,\n        .species = SPECIES_ZUBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt7[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_ZUBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt8[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_DROWZEE,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_MACHOP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt9[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_RATICATE,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_TeamRocketGrunt10[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE, MOVE_HARDEN},\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS, MOVE_NONE},\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS, MOVE_NONE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt11[] = {\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_RATTATA,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_TeamRocketGrunt12[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE, MOVE_HARDEN},\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_TeamRocketGrunt13[] = {\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_ZUBAT,\n        .moves = {MOVE_BITE, MOVE_ASTONISH, MOVE_SUPERSONIC, MOVE_LEECH_LIFE},\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS, MOVE_NONE},\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_SLUDGE, MOVE_DISABLE, MOVE_HARDEN, MOVE_POUND},\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_ZUBAT,\n        .moves = {MOVE_BITE, MOVE_ASTONISH, MOVE_SUPERSONIC, MOVE_LEECH_LIFE},\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_RATICATE,\n        .moves = {MOVE_HYPER_FANG, MOVE_QUICK_ATTACK, MOVE_TAIL_WHIP, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt14[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_DROWZEE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt15[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_MACHOP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt16[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_SANDSHREW,\n    },\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_EKANS,\n    },\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_SANDSLASH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt17[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_EKANS,\n    },\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_SANDSHREW,\n    },\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_ARBOK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt18[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_KOFFING,\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_ZUBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt19[] = {\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_GOLBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt20[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_KOFFING,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_DROWZEE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt21[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_ZUBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt22[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_DROWZEE,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_KOFFING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt23[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_CUBONE,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_ZUBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt24[] = {\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_GOLBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_ZUBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt25[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_HYPNO,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_RATICATE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt26[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_DROWZEE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt27[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_EKANS,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_CUBONE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt28[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_ARBOK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt29[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_HYPNO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt30[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_MACHOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt31[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_GOLBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_TeamRocketGrunt32[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_RATICATE,\n        .moves = {MOVE_SCARY_FACE, MOVE_HYPER_FANG, MOVE_QUICK_ATTACK, MOVE_TAIL_WHIP},\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_ARBOK,\n        .moves = {MOVE_GLARE, MOVE_BITE, MOVE_POISON_STING, MOVE_LEER},\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_GOLBAT,\n        .moves = {MOVE_WING_ATTACK, MOVE_BITE, MOVE_ASTONISH, MOVE_SUPERSONIC},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt33[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_CUBONE,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_CUBONE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt34[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_SANDSHREW,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_SANDSLASH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt35[] = {\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_GOLBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 26,\n        .species = SPECIES_RATTATA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt36[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_WEEZING,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_GOLBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_KOFFING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt37[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_DROWZEE,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_GRIMER,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_MACHOP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt38[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_GOLBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_DROWZEE,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_HYPNO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt39[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_MACHOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt40[] = {\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 25,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt41[] = {\n    {\n        .iv = 0,\n        .lvl = 32,\n        .species = SPECIES_CUBONE,\n    },\n    {\n        .iv = 0,\n        .lvl = 32,\n        .species = SPECIES_DROWZEE,\n    },\n    {\n        .iv = 0,\n        .lvl = 32,\n        .species = SPECIES_MAROWAK,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerSamuel[] = {\n    {\n        .iv = 100,\n        .lvl = 37,\n        .species = SPECIES_SANDSLASH,\n        .moves = {MOVE_SLASH, MOVE_SWIFT, MOVE_SAND_ATTACK, MOVE_POISON_STING},\n    },\n    {\n        .iv = 100,\n        .lvl = 37,\n        .species = SPECIES_SANDSLASH,\n        .moves = {MOVE_SLASH, MOVE_SWIFT, MOVE_SAND_ATTACK, MOVE_POISON_STING},\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_RHYHORN,\n        .moves = {MOVE_TAKE_DOWN, MOVE_ROCK_BLAST, MOVE_FURY_ATTACK, MOVE_SCARY_FACE},\n    },\n    {\n        .iv = 100,\n        .lvl = 39,\n        .species = SPECIES_NIDORINO,\n        .moves = {MOVE_FURY_ATTACK, MOVE_HORN_ATTACK, MOVE_POISON_STING, MOVE_DOUBLE_KICK},\n    },\n    {\n        .iv = 100,\n        .lvl = 39,\n        .species = SPECIES_NIDOKING,\n        .moves = {MOVE_THRASH, MOVE_DOUBLE_KICK, MOVE_POISON_STING, MOVE_FOCUS_ENERGY},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerGeorge[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_EXEGGUTOR,\n        .moves = {MOVE_EGG_BOMB, MOVE_CONFUSION, MOVE_STUN_SPORE, MOVE_SLEEP_POWDER},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_SANDSLASH,\n        .moves = {MOVE_FURY_SWIPES, MOVE_SWIFT, MOVE_POISON_STING, MOVE_SAND_ATTACK},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_CLOYSTER,\n        .moves = {MOVE_SPIKE_CANNON, MOVE_SPIKES, MOVE_AURORA_BEAM, MOVE_SUPERSONIC},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_ELECTRODE,\n        .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_LIGHT_SCREEN},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_ARCANINE,\n        .moves = {MOVE_FLAME_WHEEL, MOVE_ROAR, MOVE_BITE, MOVE_TAKE_DOWN},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerColby[] = {\n    {\n        .iv = 100,\n        .lvl = 41,\n        .species = SPECIES_KINGLER,\n        .moves = {MOVE_GUILLOTINE, MOVE_STOMP, MOVE_MUD_SHOT, MOVE_BUBBLE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_POLIWHIRL,\n        .moves = {MOVE_BODY_SLAM, MOVE_DOUBLE_SLAP, MOVE_WATER_GUN, MOVE_HYPNOSIS},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_TENTACRUEL,\n        .moves = {MOVE_BARRIER, MOVE_WRAP, MOVE_BUBBLE_BEAM, MOVE_ACID},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_SEADRA,\n        .moves = {MOVE_WATER_GUN, MOVE_SMOKESCREEN, MOVE_TWISTER, MOVE_LEER},\n    },\n    {\n        .iv = 100,\n        .lvl = 43,\n        .species = SPECIES_BLASTOISE,\n        .moves = {MOVE_WATER_GUN, MOVE_BITE, MOVE_RAPID_SPIN, MOVE_RAIN_DANCE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerPaul[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_SLOWPOKE,\n        .moves = {MOVE_HEADBUTT, MOVE_CONFUSION, MOVE_WATER_GUN, MOVE_DISABLE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_SHELLDER,\n        .moves = {MOVE_AURORA_BEAM, MOVE_CLAMP, MOVE_SUPERSONIC, MOVE_LEER},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_KINGLER,\n        .moves = {MOVE_GUILLOTINE, MOVE_STOMP, MOVE_MUD_SHOT, MOVE_BUBBLE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_STARMIE,\n        .moves = {MOVE_BUBBLE_BEAM, MOVE_SWIFT, MOVE_RECOVER, MOVE_RAPID_SPIN},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_GOLDUCK,\n        .moves = {MOVE_CONFUSION, MOVE_SCRATCH, MOVE_SCREECH, MOVE_DISABLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerRolando[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_RATICATE,\n        .moves = {MOVE_SUPER_FANG, MOVE_PURSUIT, MOVE_SCARY_FACE, MOVE_QUICK_ATTACK},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_IVYSAUR,\n        .moves = {MOVE_RAZOR_LEAF, MOVE_SLEEP_POWDER, MOVE_SWEET_SCENT, MOVE_SYNTHESIS},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_WARTORTLE,\n        .moves = {MOVE_WATER_GUN, MOVE_BITE, MOVE_RAPID_SPIN, MOVE_TAIL_WHIP},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_CHARMELEON,\n        .moves = {MOVE_FLAMETHROWER, MOVE_SLASH, MOVE_SMOKESCREEN, MOVE_SCARY_FACE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_CHARIZARD,\n        .moves = {MOVE_FLAMETHROWER, MOVE_WING_ATTACK, MOVE_SMOKESCREEN, MOVE_SCARY_FACE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerGilbert[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_PIDGEOTTO,\n        .moves = {MOVE_WING_ATTACK, MOVE_FEATHER_DANCE, MOVE_WHIRLWIND, MOVE_QUICK_ATTACK},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_FEAROW,\n        .moves = {MOVE_DRILL_PECK, MOVE_MIRROR_MOVE, MOVE_PURSUIT, MOVE_LEER},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_PERSIAN,\n        .moves = {MOVE_PAY_DAY, MOVE_FAINT_ATTACK, MOVE_SCREECH, MOVE_BITE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_LICKITUNG,\n        .moves = {MOVE_SLAM, MOVE_DISABLE, MOVE_WRAP, MOVE_SUPERSONIC},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_TAUROS,\n        .moves = {MOVE_HORN_ATTACK, MOVE_SCARY_FACE, MOVE_SWAGGER, MOVE_TAIL_WHIP},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerOwen[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_NIDORINO,\n        .moves = {MOVE_SCRATCH, MOVE_POISON_STING, MOVE_DOUBLE_KICK, MOVE_BITE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_NIDORINA,\n        .moves = {MOVE_HORN_ATTACK, MOVE_POISON_STING, MOVE_DOUBLE_KICK, MOVE_LEER},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_RATICATE,\n        .moves = {MOVE_SUPER_FANG, MOVE_PURSUIT, MOVE_SCARY_FACE, MOVE_QUICK_ATTACK},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_SANDSLASH,\n        .moves = {MOVE_FURY_SWIPES, MOVE_SWIFT, MOVE_SLASH, MOVE_POISON_STING},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_RHYHORN,\n        .moves = {MOVE_ROCK_BLAST, MOVE_SCARY_FACE, MOVE_STOMP, MOVE_TAIL_WHIP},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerBerke[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_SEEL,\n        .moves = {MOVE_TAKE_DOWN, MOVE_AURORA_BEAM, MOVE_ICY_WIND, MOVE_GROWL},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_GRAVELER,\n        .moves = {MOVE_ROCK_BLAST, MOVE_MAGNITUDE, MOVE_ROCK_THROW, MOVE_MUD_SPORT},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_KINGLER,\n        .moves = {MOVE_GUILLOTINE, MOVE_STOMP, MOVE_MUD_SHOT, MOVE_BUBBLE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_ONIX,\n        .moves = {MOVE_SLAM, MOVE_SANDSTORM, MOVE_DRAGON_BREATH, MOVE_ROCK_THROW},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_CLOYSTER,\n        .moves = {MOVE_SPIKE_CANNON, MOVE_AURORA_BEAM, MOVE_SUPERSONIC, MOVE_PROTECT},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerYuji[] = {\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_SANDSLASH,\n        .moves = {MOVE_SLASH, MOVE_SWIFT, MOVE_SAND_ATTACK, MOVE_POISON_STING},\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_GRAVELER,\n        .moves = {MOVE_ROCK_BLAST, MOVE_MAGNITUDE, MOVE_MUD_SPORT, MOVE_DEFENSE_CURL},\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_ONIX,\n        .moves = {MOVE_DRAGON_BREATH, MOVE_SANDSTORM, MOVE_ROCK_THROW, MOVE_BIND},\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_GRAVELER,\n        .moves = {MOVE_ROCK_BLAST, MOVE_MAGNITUDE, MOVE_ROLLOUT, MOVE_DEFENSE_CURL},\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_MAROWAK,\n        .moves = {MOVE_BONEMERANG, MOVE_HEADBUTT, MOVE_LEER, MOVE_GROWL},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerWarren[] = {\n    {\n        .iv = 100,\n        .lvl = 37,\n        .species = SPECIES_MAROWAK,\n        .moves = {MOVE_BONEMERANG, MOVE_HEADBUTT, MOVE_LEER, MOVE_GROWL},\n    },\n    {\n        .iv = 100,\n        .lvl = 37,\n        .species = SPECIES_MAROWAK,\n        .moves = {MOVE_BONEMERANG, MOVE_HEADBUTT, MOVE_LEER, MOVE_GROWL},\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_RHYHORN,\n        .moves = {MOVE_TAKE_DOWN, MOVE_ROCK_BLAST, MOVE_FURY_ATTACK, MOVE_SCARY_FACE},\n    },\n    {\n        .iv = 100,\n        .lvl = 39,\n        .species = SPECIES_NIDORINA,\n        .moves = {MOVE_FURY_SWIPES, MOVE_BITE, MOVE_POISON_STING, MOVE_DOUBLE_KICK},\n    },\n    {\n        .iv = 100,\n        .lvl = 39,\n        .species = SPECIES_NIDOQUEEN,\n        .moves = {MOVE_BODY_SLAM, MOVE_BITE, MOVE_POISON_STING, MOVE_DOUBLE_KICK},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerMary[] = {\n    {\n        .iv = 100,\n        .lvl = 22,\n        .species = SPECIES_BELLSPROUT,\n        .moves = {MOVE_WRAP, MOVE_STUN_SPORE, MOVE_POISON_POWDER, MOVE_GROWTH},\n    },\n    {\n        .iv = 100,\n        .lvl = 22,\n        .species = SPECIES_ODDISH,\n        .moves = {MOVE_POISON_POWDER, MOVE_STUN_SPORE, MOVE_ABSORB, MOVE_SWEET_SCENT},\n    },\n    {\n        .iv = 100,\n        .lvl = 22,\n        .species = SPECIES_WEEPINBELL,\n        .moves = {MOVE_VINE_WHIP, MOVE_STUN_SPORE, MOVE_POISON_POWDER, MOVE_GROWTH},\n    },\n    {\n        .iv = 100,\n        .lvl = 22,\n        .species = SPECIES_GLOOM,\n        .moves = {MOVE_ABSORB, MOVE_STUN_SPORE, MOVE_POISON_POWDER, MOVE_SWEET_SCENT},\n    },\n    {\n        .iv = 100,\n        .lvl = 22,\n        .species = SPECIES_IVYSAUR,\n        .moves = {MOVE_RAZOR_LEAF, MOVE_SLEEP_POWDER, MOVE_VINE_WHIP, MOVE_LEECH_SEED},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerCaroline[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_BELLSPROUT,\n        .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_STUN_SPORE, MOVE_POISON_POWDER},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_WEEPINBELL,\n        .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_SLEEP_POWDER, MOVE_POISON_POWDER},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_VICTREEBEL,\n        .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_STUN_SPORE, MOVE_SLEEP_POWDER},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_PARAS,\n        .moves = {MOVE_GROWTH, MOVE_SLASH, MOVE_LEECH_LIFE, MOVE_STUN_SPORE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_PARASECT,\n        .moves = {MOVE_SPORE, MOVE_SLASH, MOVE_LEECH_LIFE, MOVE_POISON_POWDER},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerAlexa[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_CLEFAIRY,\n        .moves = {MOVE_LIGHT_SCREEN, MOVE_COSMIC_POWER, MOVE_DOUBLE_SLAP, MOVE_ENCORE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_JIGGLYPUFF,\n        .moves = {MOVE_SING, MOVE_BODY_SLAM, MOVE_ROLLOUT, MOVE_DISABLE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_PERSIAN,\n        .moves = {MOVE_PAY_DAY, MOVE_FAINT_ATTACK, MOVE_BITE, MOVE_SCREECH},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_DEWGONG,\n        .moves = {MOVE_SHEER_COLD, MOVE_TAKE_DOWN, MOVE_REST, MOVE_AURORA_BEAM},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_CHANSEY,\n        .moves = {MOVE_SING, MOVE_EGG_BOMB, MOVE_SOFT_BOILED, MOVE_MINIMIZE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerShannon[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_BEEDRILL,\n        .moves = {MOVE_PIN_MISSILE, MOVE_TWINEEDLE, MOVE_AGILITY, MOVE_PURSUIT},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_BUTTERFREE,\n        .moves = {MOVE_SAFEGUARD, MOVE_PSYBEAM, MOVE_GUST, MOVE_SUPERSONIC},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_PARASECT,\n        .moves = {MOVE_SPORE, MOVE_LEECH_LIFE, MOVE_SLASH, MOVE_GROWTH},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_VENONAT,\n        .moves = {MOVE_PSYBEAM, MOVE_STUN_SPORE, MOVE_LEECH_LIFE, MOVE_DISABLE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_VENOMOTH,\n        .moves = {MOVE_PSYBEAM, MOVE_GUST, MOVE_SUPERSONIC, MOVE_LEECH_LIFE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerNaomi[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_PERSIAN,\n        .moves = {MOVE_FURY_SWIPES, MOVE_SCREECH, MOVE_FAINT_ATTACK, MOVE_PAY_DAY},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_PONYTA,\n        .moves = {MOVE_AGILITY, MOVE_TAKE_DOWN, MOVE_FIRE_SPIN, MOVE_STOMP},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_RAPIDASH,\n        .moves = {MOVE_FURY_ATTACK, MOVE_FIRE_SPIN, MOVE_STOMP, MOVE_GROWL},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_VULPIX,\n        .moves = {MOVE_FLAMETHROWER, MOVE_CONFUSE_RAY, MOVE_QUICK_ATTACK, MOVE_IMPRISON},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_NINETALES,\n        .moves = {MOVE_SAFEGUARD, MOVE_WILL_O_WISP, MOVE_CONFUSE_RAY, MOVE_FIRE_SPIN},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerBrooke[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_TANGELA,\n        .moves = {MOVE_SLAM, MOVE_BIND, MOVE_MEGA_DRAIN, MOVE_INGRAIN},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_GLOOM,\n        .moves = {MOVE_ACID, MOVE_MOONLIGHT, MOVE_SLEEP_POWDER, MOVE_STUN_SPORE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_VILEPLUME,\n        .moves = {MOVE_MEGA_DRAIN, MOVE_ACID, MOVE_STUN_SPORE, MOVE_AROMATHERAPY},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_IVYSAUR,\n        .moves = {MOVE_RAZOR_LEAF, MOVE_SWEET_SCENT, MOVE_GROWL, MOVE_LEECH_SEED},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_VENUSAUR,\n        .moves = {MOVE_RAZOR_LEAF, MOVE_GROWTH, MOVE_SLEEP_POWDER, MOVE_POISON_POWDER},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerAustina[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_RHYHORN,\n        .moves = {MOVE_HORN_DRILL, MOVE_ROCK_BLAST, MOVE_SCARY_FACE, MOVE_STOMP},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_NIDORINA,\n        .moves = {MOVE_DOUBLE_KICK, MOVE_FURY_SWIPES, MOVE_BITE, MOVE_FLATTER},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_NIDOQUEEN,\n        .moves = {MOVE_BODY_SLAM, MOVE_DOUBLE_KICK, MOVE_BITE, MOVE_GROWL},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_NIDORINO,\n        .moves = {MOVE_HORN_ATTACK, MOVE_POISON_STING, MOVE_FOCUS_ENERGY, MOVE_LEER},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_NIDOKING,\n        .moves = {MOVE_THRASH, MOVE_DOUBLE_KICK, MOVE_POISON_STING, MOVE_PECK},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerJulie[] = {\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_PERSIAN,\n        .moves = {MOVE_FURY_SWIPES, MOVE_BITE, MOVE_SCREECH, MOVE_FAINT_ATTACK},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_NINETALES,\n        .moves = {MOVE_FLAMETHROWER, MOVE_WILL_O_WISP, MOVE_CONFUSE_RAY, MOVE_GRUDGE},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_RAPIDASH,\n        .moves = {MOVE_FURY_ATTACK, MOVE_FIRE_SPIN, MOVE_TAKE_DOWN, MOVE_AGILITY},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_PIKACHU,\n        .moves = {MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_DOUBLE_TEAM, MOVE_QUICK_ATTACK},\n    },\n    {\n        .iv = 100,\n        .lvl = 42,\n        .species = SPECIES_RAICHU,\n        .moves = {MOVE_THUNDER, MOVE_THUNDER_WAVE, MOVE_SLAM, MOVE_DOUBLE_TEAM},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_EliteFourLorelei[] = {\n    {\n        .iv = 250,\n        .lvl = 52,\n        .species = SPECIES_DEWGONG,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_HAIL, MOVE_SAFEGUARD},\n    },\n    {\n        .iv = 250,\n        .lvl = 51,\n        .species = SPECIES_CLOYSTER,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SPIKES, MOVE_PROTECT, MOVE_HAIL, MOVE_DIVE},\n    },\n    {\n        .iv = 250,\n        .lvl = 52,\n        .species = SPECIES_SLOWBRO,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_AMNESIA, MOVE_YAWN},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_JYNX,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_PUNCH, MOVE_DOUBLE_SLAP, MOVE_LOVELY_KISS, MOVE_ATTRACT},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_LAPRAS,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_CONFUSE_RAY, MOVE_ICE_BEAM, MOVE_SURF, MOVE_BODY_SLAM},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_EliteFourBruno[] = {\n    {\n        .iv = 250,\n        .lvl = 51,\n        .species = SPECIES_ONIX,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_IRON_TAIL, MOVE_ROAR},\n    },\n    {\n        .iv = 250,\n        .lvl = 53,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SKY_UPPERCUT, MOVE_MACH_PUNCH, MOVE_ROCK_TOMB, MOVE_COUNTER},\n    },\n    {\n        .iv = 250,\n        .lvl = 53,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_MEGA_KICK, MOVE_FORESIGHT, MOVE_BRICK_BREAK, MOVE_FACADE},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_ONIX,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_SAND_TOMB},\n    },\n    {\n        .iv = 250,\n        .lvl = 56,\n        .species = SPECIES_MACHAMP,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_CROSS_CHOP, MOVE_BULK_UP, MOVE_SCARY_FACE, MOVE_ROCK_TOMB},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_EliteFourAgatha[] = {\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_GENGAR,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SHADOW_PUNCH, MOVE_CONFUSE_RAY, MOVE_TOXIC, MOVE_DOUBLE_TEAM},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_GOLBAT,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_CONFUSE_RAY, MOVE_POISON_FANG, MOVE_AIR_CUTTER, MOVE_BITE},\n    },\n    {\n        .iv = 250,\n        .lvl = 53,\n        .species = SPECIES_HAUNTER,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_CURSE, MOVE_MEAN_LOOK},\n    },\n    {\n        .iv = 250,\n        .lvl = 56,\n        .species = SPECIES_ARBOK,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_SCREECH, MOVE_IRON_TAIL, MOVE_BITE},\n    },\n    {\n        .iv = 250,\n        .lvl = 58,\n        .species = SPECIES_GENGAR,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_HYPNOSIS, MOVE_NIGHTMARE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_EliteFourLance[] = {\n    {\n        .iv = 250,\n        .lvl = 56,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPER_BEAM, MOVE_DRAGON_RAGE, MOVE_TWISTER, MOVE_BITE},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_DRAGONAIR,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPER_BEAM, MOVE_SAFEGUARD, MOVE_DRAGON_RAGE, MOVE_OUTRAGE},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_DRAGONAIR,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPER_BEAM, MOVE_SAFEGUARD, MOVE_THUNDER_WAVE, MOVE_OUTRAGE},\n    },\n    {\n        .iv = 250,\n        .lvl = 58,\n        .species = SPECIES_AERODACTYL,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPER_BEAM, MOVE_ANCIENT_POWER, MOVE_WING_ATTACK, MOVE_SCARY_FACE},\n    },\n    {\n        .iv = 250,\n        .lvl = 60,\n        .species = SPECIES_DRAGONITE,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPER_BEAM, MOVE_SAFEGUARD, MOVE_OUTRAGE, MOVE_WING_ATTACK},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_LeaderBrock[] = {\n    {\n        .iv = 0,\n        .lvl = 12,\n        .species = SPECIES_GEODUDE,\n        .moves = {MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_NONE, MOVE_NONE},\n    },\n    {\n        .iv = 0,\n        .lvl = 14,\n        .species = SPECIES_ONIX,\n        .moves = {MOVE_TACKLE, MOVE_BIND, MOVE_ROCK_TOMB, MOVE_NONE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_LeaderMisty[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_STARYU,\n        .moves = {MOVE_TACKLE, MOVE_HARDEN, MOVE_RECOVER, MOVE_WATER_PULSE},\n    },\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_STARMIE,\n        .moves = {MOVE_SWIFT, MOVE_RECOVER, MOVE_RAPID_SPIN, MOVE_WATER_PULSE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_LeaderLtSurge[] = {\n    {\n        .iv = 0,\n        .lvl = 21,\n        .species = SPECIES_VOLTORB,\n        .moves = {MOVE_SONIC_BOOM, MOVE_TACKLE, MOVE_SCREECH, MOVE_SHOCK_WAVE},\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_PIKACHU,\n        .moves = {MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_DOUBLE_TEAM, MOVE_SHOCK_WAVE},\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_RAICHU,\n        .moves = {MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_DOUBLE_TEAM, MOVE_SHOCK_WAVE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_LeaderErika[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_VICTREEBEL,\n        .moves = {MOVE_STUN_SPORE, MOVE_ACID, MOVE_POISON_POWDER, MOVE_GIGA_DRAIN},\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_TANGELA,\n        .moves = {MOVE_POISON_POWDER, MOVE_CONSTRICT, MOVE_INGRAIN, MOVE_GIGA_DRAIN},\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_VILEPLUME,\n        .moves = {MOVE_SLEEP_POWDER, MOVE_ACID, MOVE_STUN_SPORE, MOVE_GIGA_DRAIN},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_LeaderKoga[] = {\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SELF_DESTRUCT, MOVE_SLUDGE, MOVE_SMOKESCREEN, MOVE_TOXIC},\n    },\n    {\n        .iv = 0,\n        .lvl = 39,\n        .species = SPECIES_MUK,\n        .moves = {MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_ACID_ARMOR, MOVE_TOXIC},\n    },\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SELF_DESTRUCT, MOVE_SLUDGE, MOVE_SMOKESCREEN, MOVE_TOXIC},\n    },\n    {\n        .iv = 0,\n        .lvl = 43,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_TACKLE, MOVE_SLUDGE, MOVE_SMOKESCREEN, MOVE_TOXIC},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_LeaderBlaine[] = {\n    {\n        .iv = 0,\n        .lvl = 42,\n        .species = SPECIES_GROWLITHE,\n        .moves = {MOVE_BITE, MOVE_ROAR, MOVE_TAKE_DOWN, MOVE_FIRE_BLAST},\n    },\n    {\n        .iv = 0,\n        .lvl = 40,\n        .species = SPECIES_PONYTA,\n        .moves = {MOVE_STOMP, MOVE_BOUNCE, MOVE_FIRE_SPIN, MOVE_FIRE_BLAST},\n    },\n    {\n        .iv = 0,\n        .lvl = 42,\n        .species = SPECIES_RAPIDASH,\n        .moves = {MOVE_STOMP, MOVE_BOUNCE, MOVE_FIRE_SPIN, MOVE_FIRE_BLAST},\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_ARCANINE,\n        .moves = {MOVE_BITE, MOVE_ROAR, MOVE_TAKE_DOWN, MOVE_FIRE_BLAST},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_LeaderSabrina[] = {\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_KADABRA,\n        .moves = {MOVE_PSYBEAM, MOVE_REFLECT, MOVE_FUTURE_SIGHT, MOVE_CALM_MIND},\n    },\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_MR_MIME,\n        .moves = {MOVE_BARRIER, MOVE_PSYBEAM, MOVE_BATON_PASS, MOVE_CALM_MIND},\n    },\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_VENOMOTH,\n        .moves = {MOVE_PSYBEAM, MOVE_GUST, MOVE_LEECH_LIFE, MOVE_SUPERSONIC},\n    },\n    {\n        .iv = 0,\n        .lvl = 43,\n        .species = SPECIES_ALAKAZAM,\n        .moves = {MOVE_PSYCHIC, MOVE_RECOVER, MOVE_FUTURE_SIGHT, MOVE_CALM_MIND},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GentlemanThomas[] = {\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 0,\n        .lvl = 18,\n        .species = SPECIES_GROWLITHE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GentlemanArthur[] = {\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_NIDORAN_M,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_NIDORAN_F,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GentlemanTucker[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_PIKACHU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GentlemanNorton[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_PERSIAN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GentlemanWalter[] = {\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_PONYTA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RivalSsAnneSquirtle[] = {\n    {\n        .iv = 50,\n        .lvl = 19,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 50,\n        .lvl = 16,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 50,\n        .lvl = 18,\n        .species = SPECIES_KADABRA,\n    },\n    {\n        .iv = 100,\n        .lvl = 20,\n        .species = SPECIES_WARTORTLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RivalSsAnneBulbasaur[] = {\n    {\n        .iv = 50,\n        .lvl = 19,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 50,\n        .lvl = 16,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 50,\n        .lvl = 18,\n        .species = SPECIES_KADABRA,\n    },\n    {\n        .iv = 100,\n        .lvl = 20,\n        .species = SPECIES_IVYSAUR,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RivalSsAnneCharmander[] = {\n    {\n        .iv = 50,\n        .lvl = 19,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 50,\n        .lvl = 16,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 50,\n        .lvl = 18,\n        .species = SPECIES_KADABRA,\n    },\n    {\n        .iv = 100,\n        .lvl = 20,\n        .species = SPECIES_CHARMELEON,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RivalPokemonTowerSquirtle[] = {\n    {\n        .iv = 100,\n        .lvl = 25,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 100,\n        .lvl = 23,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 100,\n        .lvl = 22,\n        .species = SPECIES_EXEGGCUTE,\n    },\n    {\n        .iv = 100,\n        .lvl = 20,\n        .species = SPECIES_KADABRA,\n    },\n    {\n        .iv = 100,\n        .lvl = 25,\n        .species = SPECIES_WARTORTLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RivalPokemonTowerBulbasaur[] = {\n    {\n        .iv = 100,\n        .lvl = 25,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 100,\n        .lvl = 23,\n        .species = SPECIES_GYARADOS,\n    },\n    {\n        .iv = 100,\n        .lvl = 22,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 100,\n        .lvl = 20,\n        .species = SPECIES_KADABRA,\n    },\n    {\n        .iv = 100,\n        .lvl = 25,\n        .species = SPECIES_IVYSAUR,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RivalPokemonTowerCharmander[] = {\n    {\n        .iv = 100,\n        .lvl = 25,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 100,\n        .lvl = 23,\n        .species = SPECIES_EXEGGCUTE,\n    },\n    {\n        .iv = 100,\n        .lvl = 22,\n        .species = SPECIES_GYARADOS,\n    },\n    {\n        .iv = 100,\n        .lvl = 20,\n        .species = SPECIES_KADABRA,\n    },\n    {\n        .iv = 100,\n        .lvl = 25,\n        .species = SPECIES_CHARMELEON,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RivalSilphSquirtle[] = {\n    {\n        .iv = 100,\n        .lvl = 37,\n        .species = SPECIES_PIDGEOT,\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 100,\n        .lvl = 35,\n        .species = SPECIES_EXEGGCUTE,\n    },\n    {\n        .iv = 100,\n        .lvl = 35,\n        .species = SPECIES_ALAKAZAM,\n    },\n    {\n        .iv = 150,\n        .lvl = 40,\n        .species = SPECIES_BLASTOISE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RivalSilphBulbasaur[] = {\n    {\n        .iv = 100,\n        .lvl = 37,\n        .species = SPECIES_PIDGEOT,\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_GYARADOS,\n    },\n    {\n        .iv = 100,\n        .lvl = 35,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 100,\n        .lvl = 35,\n        .species = SPECIES_ALAKAZAM,\n    },\n    {\n        .iv = 150,\n        .lvl = 40,\n        .species = SPECIES_VENUSAUR,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RivalSilphCharmander[] = {\n    {\n        .iv = 100,\n        .lvl = 37,\n        .species = SPECIES_PIDGEOT,\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_EXEGGCUTE,\n    },\n    {\n        .iv = 100,\n        .lvl = 35,\n        .species = SPECIES_GYARADOS,\n    },\n    {\n        .iv = 100,\n        .lvl = 35,\n        .species = SPECIES_ALAKAZAM,\n    },\n    {\n        .iv = 150,\n        .lvl = 40,\n        .species = SPECIES_CHARIZARD,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_RivalRoute22LateSquirtle[] = {\n    {\n        .iv = 150,\n        .lvl = 47,\n        .species = SPECIES_PIDGEOT,\n        .moves = {MOVE_FEATHER_DANCE, MOVE_WING_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK},\n    },\n    {\n        .iv = 150,\n        .lvl = 45,\n        .species = SPECIES_RHYHORN,\n        .moves = {MOVE_TAKE_DOWN, MOVE_HORN_DRILL, MOVE_ROCK_BLAST, MOVE_FURY_ATTACK},\n    },\n    {\n        .iv = 150,\n        .lvl = 45,\n        .species = SPECIES_GROWLITHE,\n        .moves = {MOVE_FLAME_WHEEL, MOVE_TAKE_DOWN, MOVE_LEER, MOVE_AGILITY},\n    },\n    {\n        .iv = 150,\n        .lvl = 45,\n        .species = SPECIES_EXEGGCUTE,\n        .moves = {MOVE_SOLAR_BEAM, MOVE_SLEEP_POWDER, MOVE_POISON_POWDER, MOVE_STUN_SPORE},\n    },\n    {\n        .iv = 150,\n        .lvl = 47,\n        .species = SPECIES_ALAKAZAM,\n        .moves = {MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_FUTURE_SIGHT, MOVE_DISABLE},\n    },\n    {\n        .iv = 250,\n        .lvl = 53,\n        .species = SPECIES_BLASTOISE,\n        .moves = {MOVE_WATER_GUN, MOVE_RAIN_DANCE, MOVE_BITE, MOVE_RAPID_SPIN},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_RivalRoute22LateBulbasaur[] = {\n    {\n        .iv = 150,\n        .lvl = 47,\n        .species = SPECIES_PIDGEOT,\n        .moves = {MOVE_FEATHER_DANCE, MOVE_WING_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK},\n    },\n    {\n        .iv = 150,\n        .lvl = 45,\n        .species = SPECIES_RHYHORN,\n        .moves = {MOVE_TAKE_DOWN, MOVE_HORN_DRILL, MOVE_ROCK_BLAST, MOVE_FURY_ATTACK},\n    },\n    {\n        .iv = 150,\n        .lvl = 45,\n        .species = SPECIES_GYARADOS,\n        .moves = {MOVE_HYDRO_PUMP, MOVE_TWISTER, MOVE_LEER, MOVE_RAIN_DANCE},\n    },\n    {\n        .iv = 150,\n        .lvl = 45,\n        .species = SPECIES_GROWLITHE,\n        .moves = {MOVE_FLAME_WHEEL, MOVE_TAKE_DOWN, MOVE_LEER, MOVE_AGILITY},\n    },\n    {\n        .iv = 150,\n        .lvl = 47,\n        .species = SPECIES_ALAKAZAM,\n        .moves = {MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_FUTURE_SIGHT, MOVE_DISABLE},\n    },\n    {\n        .iv = 250,\n        .lvl = 53,\n        .species = SPECIES_VENUSAUR,\n        .moves = {MOVE_RAZOR_LEAF, MOVE_SWEET_SCENT, MOVE_GROWTH, MOVE_SYNTHESIS},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_RivalRoute22LateCharmander[] = {\n    {\n        .iv = 150,\n        .lvl = 47,\n        .species = SPECIES_PIDGEOT,\n        .moves = {MOVE_FEATHER_DANCE, MOVE_WING_ATTACK, MOVE_GUST, MOVE_QUICK_ATTACK},\n    },\n    {\n        .iv = 150,\n        .lvl = 45,\n        .species = SPECIES_RHYHORN,\n        .moves = {MOVE_TAKE_DOWN, MOVE_HORN_DRILL, MOVE_ROCK_BLAST, MOVE_FURY_ATTACK},\n    },\n    {\n        .iv = 150,\n        .lvl = 45,\n        .species = SPECIES_EXEGGCUTE,\n        .moves = {MOVE_SOLAR_BEAM, MOVE_SLEEP_POWDER, MOVE_POISON_POWDER, MOVE_STUN_SPORE},\n    },\n    {\n        .iv = 150,\n        .lvl = 45,\n        .species = SPECIES_GYARADOS,\n        .moves = {MOVE_HYDRO_PUMP, MOVE_TWISTER, MOVE_LEER, MOVE_RAIN_DANCE},\n    },\n    {\n        .iv = 150,\n        .lvl = 47,\n        .species = SPECIES_ALAKAZAM,\n        .moves = {MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_FUTURE_SIGHT, MOVE_DISABLE},\n    },\n    {\n        .iv = 250,\n        .lvl = 53,\n        .species = SPECIES_CHARIZARD,\n        .moves = {MOVE_FLAMETHROWER, MOVE_WING_ATTACK, MOVE_SLASH, MOVE_SCARY_FACE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_ChampionFirstSquirtle[] = {\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_PIDGEOT,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_AERIAL_ACE, MOVE_FEATHER_DANCE, MOVE_SAND_ATTACK, MOVE_WHIRLWIND},\n    },\n    {\n        .iv = 255,\n        .lvl = 57,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_FUTURE_SIGHT, MOVE_RECOVER, MOVE_REFLECT},\n    },\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_RHYDON,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_TAKE_DOWN, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_SCARY_FACE},\n    },\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_EXTREME_SPEED, MOVE_FLAMETHROWER, MOVE_ROAR, MOVE_BITE},\n    },\n    {\n        .iv = 255,\n        .lvl = 61,\n        .species = SPECIES_EXEGGUTOR,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_GIGA_DRAIN, MOVE_EGG_BOMB, MOVE_SLEEP_POWDER, MOVE_LIGHT_SCREEN},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_BLASTOISE,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_HYDRO_PUMP, MOVE_RAIN_DANCE, MOVE_SKULL_BASH, MOVE_BITE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_ChampionFirstBulbasaur[] = {\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_PIDGEOT,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_AERIAL_ACE, MOVE_FEATHER_DANCE, MOVE_SAND_ATTACK, MOVE_WHIRLWIND},\n    },\n    {\n        .iv = 255,\n        .lvl = 57,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_FUTURE_SIGHT, MOVE_RECOVER, MOVE_REFLECT},\n    },\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_RHYDON,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_TAKE_DOWN, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_SCARY_FACE},\n    },\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYDRO_PUMP, MOVE_DRAGON_RAGE, MOVE_BITE, MOVE_THRASH},\n    },\n    {\n        .iv = 255,\n        .lvl = 61,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_EXTREME_SPEED, MOVE_FLAMETHROWER, MOVE_ROAR, MOVE_BITE},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_VENUSAUR,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SOLAR_BEAM, MOVE_SYNTHESIS, MOVE_SUNNY_DAY, MOVE_GROWTH},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_ChampionFirstCharmander[] = {\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_PIDGEOT,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_AERIAL_ACE, MOVE_FEATHER_DANCE, MOVE_SAND_ATTACK, MOVE_WHIRLWIND},\n    },\n    {\n        .iv = 255,\n        .lvl = 57,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_FUTURE_SIGHT, MOVE_RECOVER, MOVE_REFLECT},\n    },\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_RHYDON,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_TAKE_DOWN, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_SCARY_FACE},\n    },\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_EXEGGUTOR,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_GIGA_DRAIN, MOVE_EGG_BOMB, MOVE_SLEEP_POWDER, MOVE_LIGHT_SCREEN},\n    },\n    {\n        .iv = 255,\n        .lvl = 61,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYDRO_PUMP, MOVE_DRAGON_RAGE, MOVE_BITE, MOVE_THRASH},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_CHARIZARD,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_FIRE_BLAST, MOVE_AERIAL_ACE, MOVE_SLASH, MOVE_FIRE_SPIN},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerPatricia[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerCarly[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerHope[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerPaula[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerLaurel[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_GASTLY,\n    },\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerJody[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerTammy[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_HAUNTER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerRuth[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerKarina[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerJanae[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerAngelica[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GASTLY,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GASTLY,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerEmilia[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerJennifer[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Channeler1[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_HAUNTER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Channeler2[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Channeler3[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Channeler4[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Channeler5[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_HAUNTER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Channeler6[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GASTLY,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GASTLY,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Channeler7[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Channeler8[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GASTLY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerAmanda[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_GASTLY,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_HAUNTER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerStacy[] = {\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_HAUNTER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_ChannelerTasha[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_GASTLY,\n    },\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_GASTLY,\n    },\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_HAUNTER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerJeremy[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_ONIX,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerAlma[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_POLIWAG,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_HORSEA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerSusie[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_MEOWTH,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_MEOWTH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerValerie[] = {\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_POLIWAG,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_POLIWAG,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerGwen[] = {\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_MEOWTH,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 27,\n        .species = SPECIES_PIDGEOTTO,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerVirgil[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperFlint[] = {\n    {\n        .iv = 0,\n        .lvl = 14,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 14,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerMissy[] = {\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 31,\n        .species = SPECIES_SEAKING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerIrene[] = {\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_HORSEA,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_SEEL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerDana[] = {\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_MEOWTH,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_ODDISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 20,\n        .species = SPECIES_PIDGEY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerAriana[] = {\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 19,\n        .species = SPECIES_BELLSPROUT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerLeah[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_BELLSPROUT,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_CLEFAIRY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperJustin[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_NIDORAN_M,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_NIDORINO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerYazmin[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_BELLSPROUT,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_ODDISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_TANGELA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerKindra[] = {\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_GLOOM,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_ODDISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 28,\n        .species = SPECIES_ODDISH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerBecky[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_RAICHU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerCelia[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_CLEFAIRY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GentlemanBrooks[] = {\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_PIKACHU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GentlemanLamar[] = {\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 0,\n        .lvl = 17,\n        .species = SPECIES_PONYTA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TwinsEliAnne[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_CLEFAIRY,\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_JIGGLYPUFF,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CoolCoupleRayTyra[] = {\n    {\n        .iv = 100,\n        .lvl = 45,\n        .species = SPECIES_NIDOQUEEN,\n        .moves = {MOVE_SUPERPOWER, MOVE_BODY_SLAM, MOVE_DOUBLE_KICK, MOVE_POISON_STING},\n    },\n    {\n        .iv = 100,\n        .lvl = 45,\n        .species = SPECIES_NIDOKING,\n        .moves = {MOVE_MEGAHORN, MOVE_THRASH, MOVE_DOUBLE_KICK, MOVE_POISON_STING},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungCoupleGiaJes[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_NIDORAN_M,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_NIDORAN_F,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TwinsKiriJan[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_CHARMANDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_SQUIRTLE,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushKinRonMya[] = {\n    {\n        .iv = 50,\n        .lvl = 29,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 50,\n        .lvl = 29,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungCoupleLeaJed[] = {\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_RAPIDASH,\n    },\n    {\n        .iv = 0,\n        .lvl = 29,\n        .species = SPECIES_NINETALES,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SisAndBroLiaLuc[] = {\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 30,\n        .species = SPECIES_SEAKING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SisAndBroLilIan[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_SEADRA,\n    },\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_STARMIE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher3[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher4[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher5[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher6[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher7[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcher8[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterBen3[] = {\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterBen4[] = {\n    {\n        .iv = 120,\n        .lvl = 48,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 120,\n        .lvl = 48,\n        .species = SPECIES_ARBOK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterChad2[] = {\n    {\n        .iv = 20,\n        .lvl = 20,\n        .species = SPECIES_EKANS,\n    },\n    {\n        .iv = 20,\n        .lvl = 20,\n        .species = SPECIES_SANDSHREW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassReli2[] = {\n    {\n        .iv = 20,\n        .lvl = 20,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 20,\n        .lvl = 20,\n        .species = SPECIES_NIDORAN_F,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassReli3[] = {\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_NIDORINA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterTimmy2[] = {\n    {\n        .iv = 20,\n        .lvl = 19,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 20,\n        .lvl = 19,\n        .species = SPECIES_EKANS,\n    },\n    {\n        .iv = 20,\n        .lvl = 19,\n        .species = SPECIES_ZUBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterTimmy3[] = {\n    {\n        .iv = 60,\n        .lvl = 27,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 60,\n        .lvl = 27,\n        .species = SPECIES_EKANS,\n    },\n    {\n        .iv = 60,\n        .lvl = 27,\n        .species = SPECIES_GOLBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterTimmy4[] = {\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_ARBOK,\n    },\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_GOLBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterChad3[] = {\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_ARBOK,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_SANDSHREW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassJanice2[] = {\n    {\n        .iv = 20,\n        .lvl = 20,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 20,\n        .lvl = 20,\n        .species = SPECIES_PIDGEOTTO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassJanice3[] = {\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_PIDGEOTTO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterChad4[] = {\n    {\n        .iv = 80,\n        .lvl = 48,\n        .species = SPECIES_ARBOK,\n    },\n    {\n        .iv = 80,\n        .lvl = 48,\n        .species = SPECIES_SANDSLASH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerFranklin2[] = {\n    {\n        .iv = 40,\n        .lvl = 25,\n        .species = SPECIES_MACHOKE,\n    },\n    {\n        .iv = 40,\n        .lvl = 25,\n        .species = SPECIES_GRAVELER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PkmnProfProfOak[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PlayerBrendan[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PlayerMay[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PlayerRed[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PlayerLeaf[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt42[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_HOUNDOUR,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_HOUNDOUR,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PsychicJaclyn[] = {\n    {\n        .iv = 100,\n        .lvl = 48,\n        .species = SPECIES_NATU,\n        .moves = {MOVE_NIGHT_SHADE, MOVE_CONFUSE_RAY, MOVE_FUTURE_SIGHT, MOVE_WISH},\n    },\n    {\n        .iv = 100,\n        .lvl = 48,\n        .species = SPECIES_SLOWBRO,\n        .moves = {MOVE_PSYCHIC, MOVE_HEADBUTT, MOVE_AMNESIA, MOVE_YAWN},\n    },\n    {\n        .iv = 100,\n        .lvl = 49,\n        .species = SPECIES_KADABRA,\n        .moves = {MOVE_PSYCHIC, MOVE_FUTURE_SIGHT, MOVE_RECOVER, MOVE_REFLECT},\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushGirlSharon[] = {\n    {\n        .iv = 50,\n        .lvl = 37,\n        .species = SPECIES_MANKEY,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 50,\n        .lvl = 37,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TuberAmira[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_POLIWAG,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_POLIWHIRL,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_POLIWAG,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PkmnBreederAlize[] = {\n    {\n        .iv = 30,\n        .lvl = 48,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 30,\n        .lvl = 48,\n        .species = SPECIES_CLEFAIRY,\n    },\n    {\n        .iv = 30,\n        .lvl = 48,\n        .species = SPECIES_MARILL,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerNicolas[] = {\n    {\n        .iv = 100,\n        .lvl = 51,\n        .species = SPECIES_WEEPINBELL,\n        .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_SWEET_SCENT, MOVE_WRAP},\n    },\n    {\n        .iv = 100,\n        .lvl = 51,\n        .species = SPECIES_VICTREEBEL,\n        .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_SLEEP_POWDER, MOVE_STUN_SPORE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerMadeline[] = {\n    {\n        .iv = 100,\n        .lvl = 51,\n        .species = SPECIES_GLOOM,\n        .moves = {MOVE_PETAL_DANCE, MOVE_ACID, MOVE_SWEET_SCENT, MOVE_POISON_POWDER},\n    },\n    {\n        .iv = 100,\n        .lvl = 51,\n        .species = SPECIES_VILEPLUME,\n        .moves = {MOVE_PETAL_DANCE, MOVE_MOONLIGHT, MOVE_ACID, MOVE_STUN_SPORE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_AromaLadyNikki[] = {\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_BELLSPROUT,\n    },\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_WEEPINBELL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacStanly[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_GRAVELER,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_ONIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_GRAVELER,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_LadyJacki[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_HOPPIP,\n        .heldItem = ITEM_STARDUST,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_SKIPLOOM,\n        .heldItem = ITEM_STARDUST,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PainterDaisy[] = {\n    {\n        .iv = 50,\n        .lvl = 50,\n        .species = SPECIES_SMEARGLE,\n        .moves = {MOVE_DYNAMIC_PUNCH, MOVE_DIZZY_PUNCH, MOVE_FOCUS_PUNCH, MOVE_MEGA_PUNCH},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerGoon[] = {\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_HAZE, MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_TACKLE},\n    },\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_ACID_ARMOR, MOVE_SCREECH, MOVE_MINIMIZE, MOVE_SLUDGE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerGoon2[] = {\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_HAZE, MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_TACKLE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BikerGoon3[] = {\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_GRIMER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_Biker2[] = {\n    {\n        .iv = 0,\n        .lvl = 5,\n        .species = SPECIES_EKANS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherAnthony[] = {\n    {\n        .iv = 0,\n        .lvl = 7,\n        .species = SPECIES_CATERPIE,\n    },\n    {\n        .iv = 0,\n        .lvl = 8,\n        .species = SPECIES_CATERPIE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherCharlie[] = {\n    {\n        .iv = 0,\n        .lvl = 7,\n        .species = SPECIES_METAPOD,\n    },\n    {\n        .iv = 0,\n        .lvl = 7,\n        .species = SPECIES_CATERPIE,\n    },\n    {\n        .iv = 0,\n        .lvl = 7,\n        .species = SPECIES_METAPOD,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TwinsEliAnne2[] = {\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_CLEFAIRY,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_JIGGLYPUFF,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterJohnson[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_EKANS,\n    },\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_EKANS,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_RATICATE,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_BikerRicardo[] = {\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS},\n    },\n    {\n        .iv = 0,\n        .lvl = 22,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_SLUDGE, MOVE_SMOG, MOVE_TACKLE, MOVE_POISON_GAS},\n    },\n    {\n        .iv = 0,\n        .lvl = 23,\n        .species = SPECIES_GRIMER,\n        .moves = {MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_DISABLE, MOVE_POUND},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BikerJaren[] = {\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GRIMER,\n    },\n    {\n        .iv = 0,\n        .lvl = 24,\n        .species = SPECIES_GRIMER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt43[] = {\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_CUBONE,\n    },\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_MAROWAK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt44[] = {\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_SANDSHREW,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_SANDSLASH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt45[] = {\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_ZUBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_GOLBAT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt46[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_MUK,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_GOLBAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_RATICATE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt47[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_MACHOP,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_MACHOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt48[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_HYPNO,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_HYPNO,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_TeamRocketAdmin[] = {\n    {\n        .iv = 150,\n        .lvl = 52,\n        .species = SPECIES_MUK,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_SCREECH, MOVE_MINIMIZE, MOVE_ROCK_TOMB},\n    },\n    {\n        .iv = 150,\n        .lvl = 53,\n        .species = SPECIES_ARBOK,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_BITE, MOVE_EARTHQUAKE, MOVE_IRON_TAIL},\n    },\n    {\n        .iv = 150,\n        .lvl = 54,\n        .species = SPECIES_VILEPLUME,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_GIGA_DRAIN, MOVE_SLEEP_POWDER, MOVE_STUN_SPORE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_TeamRocketAdmin2[] = {\n    {\n        .iv = 200,\n        .lvl = 53,\n        .species = SPECIES_GOLBAT,\n        .moves = {MOVE_CONFUSE_RAY, MOVE_SLUDGE_BOMB, MOVE_AIR_CUTTER, MOVE_SHADOW_BALL},\n    },\n    {\n        .iv = 200,\n        .lvl = 54,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_THUNDERBOLT, MOVE_EXPLOSION, MOVE_SHADOW_BALL},\n    },\n    {\n        .iv = 200,\n        .lvl = 55,\n        .species = SPECIES_HOUNDOOM,\n        .moves = {MOVE_FLAMETHROWER, MOVE_CRUNCH, MOVE_IRON_TAIL, MOVE_SHADOW_BALL},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_ScientistGideon[] = {\n    {\n        .iv = 0,\n        .lvl = 46,\n        .species = SPECIES_VOLTORB,\n        .moves = {MOVE_SWIFT, MOVE_SCREECH, MOVE_SPARK, MOVE_SONIC_BOOM},\n    },\n    {\n        .iv = 0,\n        .lvl = 46,\n        .species = SPECIES_ELECTRODE,\n        .moves = {MOVE_SPARK, MOVE_SONIC_BOOM, MOVE_SCREECH, MOVE_CHARGE},\n    },\n    {\n        .iv = 0,\n        .lvl = 46,\n        .species = SPECIES_MAGNEMITE,\n        .moves = {MOVE_SCREECH, MOVE_SWIFT, MOVE_SPARK, MOVE_THUNDER_WAVE},\n    },\n    {\n        .iv = 0,\n        .lvl = 46,\n        .species = SPECIES_MAGNETON,\n        .moves = {MOVE_TRI_ATTACK, MOVE_SPARK, MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM},\n    },\n    {\n        .iv = 0,\n        .lvl = 46,\n        .species = SPECIES_PORYGON,\n        .moves = {MOVE_TRI_ATTACK, MOVE_CONVERSION, MOVE_RECOVER, MOVE_PSYBEAM},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleAmara[] = {\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_SEEL,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_SEEL,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_DEWGONG,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleMaria[] = {\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_SEADRA,\n    },\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_SEADRA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleAbigail[] = {\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_PSYDUCK,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_PSYDUCK,\n    },\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_GOLDUCK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleFinn[] = {\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_STARMIE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleGarrett[] = {\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_SHELLDER,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_CLOYSTER,\n    },\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_WARTORTLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanTommy[] = {\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 33,\n        .species = SPECIES_GOLDEEN,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_SEAKING,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_SEAKING,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_SEAKING,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushGirlTanya[] = {\n    {\n        .iv = 50,\n        .lvl = 38,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 50,\n        .lvl = 38,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltShea[] = {\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_MACHOP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltHugh[] = {\n    {\n        .iv = 100,\n        .lvl = 37,\n        .species = SPECIES_MACHOP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 100,\n        .lvl = 37,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperBryce[] = {\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_NIDORINO,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_SANDSLASH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerClaire[] = {\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_MEOWTH,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_MEOWTH,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 0,\n        .lvl = 35,\n        .species = SPECIES_CLEFAIRY,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushKinMikKia[] = {\n    {\n        .iv = 50,\n        .lvl = 39,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 50,\n        .lvl = 39,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_AromaLadyViolet[] = {\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_BULBASAUR,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_IVYSAUR,\n    },\n    {\n        .iv = 0,\n        .lvl = 36,\n        .species = SPECIES_IVYSAUR,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TuberAlexis[] = {\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_STARYU,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_STARYU,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_KRABBY,\n    },\n    {\n        .iv = 0,\n        .lvl = 34,\n        .species = SPECIES_KRABBY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TwinsJoyMeg[] = {\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_CLEFAIRY,\n    },\n    {\n        .iv = 0,\n        .lvl = 37,\n        .species = SPECIES_CLEFAIRY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleTisha[] = {\n    {\n        .iv = 0,\n        .lvl = 38,\n        .species = SPECIES_KINGLER,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PainterCelina[] = {\n    {\n        .iv = 50,\n        .lvl = 50,\n        .species = SPECIES_SMEARGLE,\n        .moves = {MOVE_FLY, MOVE_DIG, MOVE_DIVE, MOVE_BOUNCE},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PainterRayna[] = {\n    {\n        .iv = 50,\n        .lvl = 50,\n        .species = SPECIES_SMEARGLE,\n        .moves = {MOVE_CROSS_CHOP, MOVE_MEGAHORN, MOVE_DOUBLE_EDGE, MOVE_SELF_DESTRUCT},\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_LadyGillian[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_MAREEP,\n        .heldItem = ITEM_STARDUST,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_MAREEP,\n        .heldItem = ITEM_STARDUST,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_FLAAFFY,\n        .heldItem = ITEM_NUGGET,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterDestin[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_PIDGEOTTO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleToby[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_POLIWHIRL,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_TENTACOOL,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_TENTACRUEL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt49[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_GRIMER,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_MUK,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_TeamRocketGrunt50[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_KOFFING,\n        .moves = {MOVE_MEMENTO, MOVE_HAZE, MOVE_SMOKESCREEN, MOVE_SLUDGE},\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_WEEZING,\n        .moves = {MOVE_HAZE, MOVE_SMOKESCREEN, MOVE_SLUDGE, MOVE_SELF_DESTRUCT},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TeamRocketGrunt51[] = {\n    {\n        .iv = 50,\n        .lvl = 48,\n        .species = SPECIES_EKANS,\n    },\n    {\n        .iv = 50,\n        .lvl = 48,\n        .species = SPECIES_GLOOM,\n    },\n    {\n        .iv = 50,\n        .lvl = 48,\n        .species = SPECIES_GLOOM,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperMilo[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_PIDGEY,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_PIDGEOTTO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperChaz[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperHarold[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_HOOTHOOT,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_NOCTOWL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanTylor[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_QWILFISH,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_QWILFISH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleMymo[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_KINGLER,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_WARTORTLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleNicole[] = {\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_MARILL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SisAndBroAvaGeb[] = {\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_POLIWHIRL,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_STARMIE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_AromaLadyRose[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_SUNKERN,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_SUNFLORA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleSamir[] = {\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_GYARADOS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleDenise[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_CHINCHOU,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_LANTURN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TwinsMiuMia[] = {\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_PIKACHU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerEarl[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_ONIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_MACHOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacFoster[] = {\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_GOLEM,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacLarry[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_MACHOKE,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_MACHOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerDaryl[] = {\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_SUDOWOODO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacHector[] = {\n    {\n        .iv = 30,\n        .lvl = 49,\n        .species = SPECIES_RHYHORN,\n    },\n    {\n        .iv = 30,\n        .lvl = 49,\n        .species = SPECIES_KANGASKHAN,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PsychicDario[] = {\n    {\n        .iv = 100,\n        .lvl = 52,\n        .species = SPECIES_GIRAFARIG,\n        .moves = {MOVE_CRUNCH, MOVE_PSYBEAM, MOVE_ODOR_SLEUTH, MOVE_AGILITY},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PsychicRodette[] = {\n    {\n        .iv = 100,\n        .lvl = 48,\n        .species = SPECIES_NATU,\n        .moves = {MOVE_NIGHT_SHADE, MOVE_CONFUSE_RAY, MOVE_WISH, MOVE_FUTURE_SIGHT},\n    },\n    {\n        .iv = 100,\n        .lvl = 48,\n        .species = SPECIES_DROWZEE,\n        .moves = {MOVE_PSYCHIC, MOVE_DISABLE, MOVE_PSYCH_UP, MOVE_FUTURE_SIGHT},\n    },\n    {\n        .iv = 100,\n        .lvl = 50,\n        .species = SPECIES_HYPNO,\n        .moves = {MOVE_PSYCHIC, MOVE_HYPNOSIS, MOVE_PSYCH_UP, MOVE_FUTURE_SIGHT},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_AromaLadyMiah[] = {\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_BELLOSSOM,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_BELLOSSOM,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungCoupleEveJon[] = {\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_GOLDUCK,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_PSYDUCK,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_JugglerMason[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_VOLTORB,\n        .moves = {MOVE_SWIFT, MOVE_LIGHT_SCREEN, MOVE_SPARK, MOVE_SONIC_BOOM},\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_PINECO,\n        .moves = {MOVE_SPIKES, MOVE_BIDE, MOVE_RAPID_SPIN, MOVE_TAKE_DOWN},\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_VOLTORB,\n        .moves = {MOVE_SWIFT, MOVE_LIGHT_SCREEN, MOVE_SPARK, MOVE_SONIC_BOOM},\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_PINECO,\n        .moves = {MOVE_SPIKES, MOVE_BIDE, MOVE_RAPID_SPIN, MOVE_EXPLOSION},\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushGirlCyndy[] = {\n    {\n        .iv = 50,\n        .lvl = 48,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 50,\n        .lvl = 48,\n        .species = SPECIES_HITMONTOP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 50,\n        .lvl = 48,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushGirlJocelyn[] = {\n    {\n        .iv = 50,\n        .lvl = 38,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 50,\n        .lvl = 38,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TamerEvan[] = {\n    {\n        .iv = 40,\n        .lvl = 48,\n        .species = SPECIES_SANDSLASH,\n    },\n    {\n        .iv = 40,\n        .lvl = 48,\n        .species = SPECIES_LICKITUNG,\n    },\n    {\n        .iv = 40,\n        .lvl = 49,\n        .species = SPECIES_URSARING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacMark2[] = {\n    {\n        .iv = 90,\n        .lvl = 33,\n        .species = SPECIES_RHYHORN,\n    },\n    {\n        .iv = 90,\n        .lvl = 33,\n        .species = SPECIES_LICKITUNG,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerLogan[] = {\n    {\n        .iv = 100,\n        .lvl = 37,\n        .species = SPECIES_EXEGGCUTE,\n        .moves = {MOVE_SLEEP_POWDER, MOVE_POISON_POWDER, MOVE_STUN_SPORE, MOVE_CONFUSION},\n    },\n    {\n        .iv = 100,\n        .lvl = 40,\n        .species = SPECIES_EXEGGUTOR,\n        .moves = {MOVE_EGG_BOMB, MOVE_STOMP, MOVE_CONFUSION, MOVE_HYPNOSIS},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerJackson[] = {\n    {\n        .iv = 100,\n        .lvl = 49,\n        .species = SPECIES_TANGELA,\n        .moves = {MOVE_SLAM, MOVE_MEGA_DRAIN, MOVE_BIND, MOVE_INGRAIN},\n    },\n    {\n        .iv = 100,\n        .lvl = 49,\n        .species = SPECIES_EXEGGCUTE,\n        .moves = {MOVE_CONFUSION, MOVE_POISON_POWDER, MOVE_BARRAGE, MOVE_REFLECT},\n    },\n    {\n        .iv = 100,\n        .lvl = 49,\n        .species = SPECIES_EXEGGUTOR,\n        .moves = {MOVE_CONFUSION, MOVE_EGG_BOMB, MOVE_SLEEP_POWDER, MOVE_STOMP},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PkmnRangerBeth[] = {\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_BELLSPROUT,\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_GLOOM,\n    },\n    {\n        .iv = 100,\n        .lvl = 38,\n        .species = SPECIES_GLOOM,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerKatelyn[] = {\n    {\n        .iv = 100,\n        .lvl = 52,\n        .species = SPECIES_CHANSEY,\n        .moves = {MOVE_EGG_BOMB, MOVE_DEFENSE_CURL, MOVE_MINIMIZE, MOVE_SOFT_BOILED},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerLeroy[] = {\n    {\n        .iv = 100,\n        .lvl = 47,\n        .species = SPECIES_RHYDON,\n        .moves = {MOVE_TAKE_DOWN, MOVE_HORN_DRILL, MOVE_ROCK_BLAST, MOVE_SCARY_FACE},\n    },\n    {\n        .iv = 100,\n        .lvl = 48,\n        .species = SPECIES_SLOWBRO,\n        .moves = {MOVE_PSYCHIC, MOVE_HEADBUTT, MOVE_AMNESIA, MOVE_DISABLE},\n    },\n    {\n        .iv = 100,\n        .lvl = 47,\n        .species = SPECIES_KANGASKHAN,\n        .moves = {MOVE_DIZZY_PUNCH, MOVE_BITE, MOVE_ENDURE, MOVE_REVERSAL},\n    },\n    {\n        .iv = 100,\n        .lvl = 48,\n        .species = SPECIES_MACHOKE,\n        .moves = {MOVE_CROSS_CHOP, MOVE_VITAL_THROW, MOVE_REVENGE, MOVE_SEISMIC_TOSS},\n    },\n    {\n        .iv = 100,\n        .lvl = 50,\n        .species = SPECIES_URSARING,\n        .moves = {MOVE_SLASH, MOVE_FAINT_ATTACK, MOVE_SNORE, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerMichelle[] = {\n    {\n        .iv = 100,\n        .lvl = 47,\n        .species = SPECIES_PERSIAN,\n        .moves = {MOVE_SLASH, MOVE_SCREECH, MOVE_FAINT_ATTACK, MOVE_BITE},\n    },\n    {\n        .iv = 100,\n        .lvl = 47,\n        .species = SPECIES_DEWGONG,\n        .moves = {MOVE_ICE_BEAM, MOVE_TAKE_DOWN, MOVE_ICY_WIND, MOVE_GROWL},\n    },\n    {\n        .iv = 100,\n        .lvl = 48,\n        .species = SPECIES_NINETALES,\n        .moves = {MOVE_FLAMETHROWER, MOVE_CONFUSE_RAY, MOVE_WILL_O_WISP, MOVE_GRUDGE},\n    },\n    {\n        .iv = 100,\n        .lvl = 48,\n        .species = SPECIES_RAPIDASH,\n        .moves = {MOVE_BOUNCE, MOVE_AGILITY, MOVE_FIRE_SPIN, MOVE_TAKE_DOWN},\n    },\n    {\n        .iv = 100,\n        .lvl = 50,\n        .species = SPECIES_GIRAFARIG,\n        .moves = {MOVE_CRUNCH, MOVE_PSYBEAM, MOVE_STOMP, MOVE_ODOR_SLEUTH},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CoolCoupleLexNya[] = {\n    {\n        .iv = 100,\n        .lvl = 52,\n        .species = SPECIES_MILTANK,\n        .moves = {MOVE_BODY_SLAM, MOVE_MILK_DRINK, MOVE_GROWL, MOVE_DEFENSE_CURL},\n    },\n    {\n        .iv = 100,\n        .lvl = 52,\n        .species = SPECIES_TAUROS,\n        .moves = {MOVE_THRASH, MOVE_HORN_ATTACK, MOVE_PURSUIT, MOVE_SWAGGER},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacBrandon[] = {\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_ONIX,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_RuinManiacBenjamin[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_GEODUDE,\n        .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_BLAST, MOVE_ROLLOUT, MOVE_SELF_DESTRUCT},\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_GRAVELER,\n        .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_BLAST, MOVE_ROCK_THROW, MOVE_SELF_DESTRUCT},\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_GRAVELER,\n        .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_BLAST, MOVE_ROCK_THROW, MOVE_SELF_DESTRUCT},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PainterEdna[] = {\n    {\n        .iv = 50,\n        .lvl = 50,\n        .species = SPECIES_SMEARGLE,\n        .moves = {MOVE_FAKE_OUT, MOVE_EXTREME_SPEED, MOVE_PROTECT, MOVE_QUICK_ATTACK},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GentlemanClifford[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_MAROWAK,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_GOLDUCK,\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LadySelphy[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_PERSIAN,\n        .heldItem = ITEM_NUGGET,\n        .abilityNum = 0,\n        .moves = {MOVE_PAY_DAY, MOVE_BITE, MOVE_TAUNT, MOVE_TORMENT},\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_CORSOLA,\n        .heldItem = ITEM_NUGGET,\n        .abilityNum = 0,\n        .moves = {MOVE_RECOVER, MOVE_SURF, MOVE_BARRIER, MOVE_INGRAIN},\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_PERSIAN,\n        .heldItem = ITEM_NUGGET,\n        .abilityNum = 0,\n        .moves = {MOVE_PAY_DAY, MOVE_SCRATCH, MOVE_TORMENT, MOVE_TAUNT},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacLawson[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_ONIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_GRAVELER,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_MAROWAK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PsychicLaura[] = {\n    {\n        .iv = 100,\n        .lvl = 48,\n        .species = SPECIES_NATU,\n    },\n    {\n        .iv = 100,\n        .lvl = 48,\n        .species = SPECIES_NATU,\n    },\n    {\n        .iv = 100,\n        .lvl = 49,\n        .species = SPECIES_XATU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PkmnBreederBethany[] = {\n    {\n        .iv = 30,\n        .lvl = 50,\n        .species = SPECIES_CHANSEY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PkmnBreederAllison[] = {\n    {\n        .iv = 30,\n        .lvl = 48,\n        .species = SPECIES_CLEFAIRY,\n    },\n    {\n        .iv = 30,\n        .lvl = 48,\n        .species = SPECIES_CLEFAIRY,\n    },\n    {\n        .iv = 30,\n        .lvl = 48,\n        .species = SPECIES_CLEFABLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherGarret[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_HERACROSS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherJonah[] = {\n    {\n        .iv = 0,\n        .lvl = 45,\n        .species = SPECIES_YANMA,\n    },\n    {\n        .iv = 0,\n        .lvl = 45,\n        .species = SPECIES_BEEDRILL,\n    },\n    {\n        .iv = 0,\n        .lvl = 46,\n        .species = SPECIES_YANMA,\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_BEEDRILL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherVance[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_VENONAT,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_VENOMOTH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterNash[] = {\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_WEEPINBELL,\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_WEEPINBELL,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_VICTREEBEL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterCordell[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_FARFETCHD,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_FARFETCHD,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassDalia[] = {\n    {\n        .iv = 0,\n        .lvl = 46,\n        .species = SPECIES_HOPPIP,\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_HOPPIP,\n    },\n    {\n        .iv = 0,\n        .lvl = 47,\n        .species = SPECIES_SKIPLOOM,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_SKIPLOOM,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassJoana[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_SNUBBULL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperRiley[] = {\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_PINSIR,\n    },\n    {\n        .iv = 0,\n        .lvl = 50,\n        .species = SPECIES_HERACROSS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerMarcy[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_PARAS,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_PARAS,\n    },\n    {\n        .iv = 0,\n        .lvl = 49,\n        .species = SPECIES_PARASECT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacLayton[] = {\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_SANDSLASH,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_ONIX,\n    },\n    {\n        .iv = 0,\n        .lvl = 48,\n        .species = SPECIES_SANDSLASH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerKelsey2[] = {\n    {\n        .iv = 20,\n        .lvl = 21,\n        .species = SPECIES_NIDORAN_M,\n    },\n    {\n        .iv = 20,\n        .lvl = 21,\n        .species = SPECIES_NIDORAN_F,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerKelsey3[] = {\n    {\n        .iv = 60,\n        .lvl = 29,\n        .species = SPECIES_NIDORINO,\n    },\n    {\n        .iv = 60,\n        .lvl = 29,\n        .species = SPECIES_NIDORINA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerKelsey4[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_NIDORINO,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_NIDORINA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperRicky2[] = {\n    {\n        .iv = 20,\n        .lvl = 22,\n        .species = SPECIES_SQUIRTLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperRicky3[] = {\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_WARTORTLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperRicky4[] = {\n    {\n        .iv = 120,\n        .lvl = 55,\n        .species = SPECIES_WARTORTLE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperJeff2[] = {\n    {\n        .iv = 20,\n        .lvl = 21,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 20,\n        .lvl = 21,\n        .species = SPECIES_RATICATE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperJeff3[] = {\n    {\n        .iv = 60,\n        .lvl = 29,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 60,\n        .lvl = 29,\n        .species = SPECIES_RATICATE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperJeff4[] = {\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_RATICATE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerIsabelle2[] = {\n    {\n        .iv = 20,\n        .lvl = 21,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 20,\n        .lvl = 21,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 20,\n        .lvl = 18,\n        .species = SPECIES_PIDGEY,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerIsabelle3[] = {\n    {\n        .iv = 60,\n        .lvl = 29,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 60,\n        .lvl = 29,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 60,\n        .lvl = 26,\n        .species = SPECIES_PIDGEOTTO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerIsabelle4[] = {\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 80,\n        .lvl = 50,\n        .species = SPECIES_PIDGEOT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterYasu2[] = {\n    {\n        .iv = 40,\n        .lvl = 22,\n        .species = SPECIES_RATTATA,\n    },\n    {\n        .iv = 40,\n        .lvl = 22,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 40,\n        .lvl = 22,\n        .species = SPECIES_RATICATE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterYasu3[] = {\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_RATICATE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_EngineerBernie2[] = {\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_MAGNETON,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_MAGNETON,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_MAGNETON,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GamerDarian2[] = {\n    {\n        .iv = 60,\n        .lvl = 29,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 60,\n        .lvl = 29,\n        .species = SPECIES_VULPIX,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperChris2[] = {\n    {\n        .iv = 40,\n        .lvl = 24,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 40,\n        .lvl = 24,\n        .species = SPECIES_CHARMANDER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperChris3[] = {\n    {\n        .iv = 60,\n        .lvl = 29,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 60,\n        .lvl = 29,\n        .species = SPECIES_CHARMELEON,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CamperChris4[] = {\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_ARCANINE,\n    },\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_CHARMELEON,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerAlicia2[] = {\n    {\n        .iv = 40,\n        .lvl = 25,\n        .species = SPECIES_MEOWTH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerAlicia3[] = {\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_PERSIAN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerAlicia4[] = {\n    {\n        .iv = 120,\n        .lvl = 55,\n        .species = SPECIES_PERSIAN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerJeremy2[] = {\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_MACHOKE,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_ONIX,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacMark3[] = {\n    {\n        .iv = 150,\n        .lvl = 54,\n        .species = SPECIES_RHYDON,\n    },\n    {\n        .iv = 150,\n        .lvl = 54,\n        .species = SPECIES_LICKITUNG,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacHerman2[] = {\n    {\n        .iv = 90,\n        .lvl = 29,\n        .species = SPECIES_MAROWAK,\n    },\n    {\n        .iv = 90,\n        .lvl = 29,\n        .species = SPECIES_SLOWBRO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacHerman3[] = {\n    {\n        .iv = 150,\n        .lvl = 54,\n        .species = SPECIES_MAROWAK,\n    },\n    {\n        .iv = 150,\n        .lvl = 54,\n        .species = SPECIES_SLOWBRO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerTrent2[] = {\n    {\n        .iv = 60,\n        .lvl = 31,\n        .species = SPECIES_ONIX,\n    },\n    {\n        .iv = 60,\n        .lvl = 31,\n        .species = SPECIES_GRAVELER,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassMegan2[] = {\n    {\n        .iv = 40,\n        .lvl = 22,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 40,\n        .lvl = 22,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 40,\n        .lvl = 23,\n        .species = SPECIES_NIDORAN_M,\n    },\n    {\n        .iv = 40,\n        .lvl = 21,\n        .species = SPECIES_MEOWTH,\n    },\n    {\n        .iv = 40,\n        .lvl = 22,\n        .species = SPECIES_PIKACHU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_LassMegan3[] = {\n    {\n        .iv = 80,\n        .lvl = 46,\n        .species = SPECIES_PIDGEOT,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_NIDORINO,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_PERSIAN,\n    },\n    {\n        .iv = 80,\n        .lvl = 48,\n        .species = SPECIES_RAICHU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SuperNerdGlenn2[] = {\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_MUK,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_MUK,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_MUK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_GamerRich2[] = {\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_GROWLITHE,\n    },\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_VULPIX,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BikerJaren2[] = {\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_MUK,\n    },\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_MUK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanElliot2[] = {\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_POLIWHIRL,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_CLOYSTER,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_SEAKING,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_SEADRA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RockerLuca2[] = {\n    {\n        .iv = 60,\n        .lvl = 33,\n        .species = SPECIES_ELECTRODE,\n    },\n    {\n        .iv = 60,\n        .lvl = 33,\n        .species = SPECIES_ELECTRODE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BeautySheila2[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_CLEFAIRY,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_PERSIAN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperRobert2[] = {\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperRobert3[] = {\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_PIDGEOT,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_PIDGEOT,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerSusie2[] = {\n    {\n        .iv = 60,\n        .lvl = 27,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 60,\n        .lvl = 27,\n        .species = SPECIES_MEOWTH,\n    },\n    {\n        .iv = 60,\n        .lvl = 27,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 60,\n        .lvl = 27,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 60,\n        .lvl = 27,\n        .species = SPECIES_MEOWTH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerSusie3[] = {\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_PERSIAN,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_PERSIAN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerSusie4[] = {\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_PIDGEOT,\n    },\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_PERSIAN,\n    },\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_RAICHU,\n    },\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_PERSIAN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BikerLukas2[] = {\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_KOFFING,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_KOFFING,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_MUK,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_WEEZING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperBenny2[] = {\n    {\n        .iv = 60,\n        .lvl = 32,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 60,\n        .lvl = 32,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperBenny3[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperMarlon2[] = {\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_DODUO,\n    },\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperMarlon3[] = {\n    {\n        .iv = 80,\n        .lvl = 48,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 80,\n        .lvl = 48,\n        .species = SPECIES_DODRIO,\n    },\n    {\n        .iv = 80,\n        .lvl = 48,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BeautyGrace2[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_PIDGEOT,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_WIGGLYTUFF,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperChester2[] = {\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_DODRIO,\n    },\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_DODRIO,\n    },\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_DODUO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperChester3[] = {\n    {\n        .iv = 80,\n        .lvl = 48,\n        .species = SPECIES_DODRIO,\n    },\n    {\n        .iv = 80,\n        .lvl = 48,\n        .species = SPECIES_DODRIO,\n    },\n    {\n        .iv = 80,\n        .lvl = 48,\n        .species = SPECIES_DODRIO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerBecky2[] = {\n    {\n        .iv = 60,\n        .lvl = 32,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 60,\n        .lvl = 32,\n        .species = SPECIES_RAICHU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerBecky3[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_RAICHU,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerBecky4[] = {\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_RAICHU,\n    },\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_RAICHU,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushKinRonMya2[] = {\n    {\n        .iv = 110,\n        .lvl = 33,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 110,\n        .lvl = 33,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushKinRonMya3[] = {\n    {\n        .iv = 130,\n        .lvl = 51,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 130,\n        .lvl = 51,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushKinRonMya4[] = {\n    {\n        .iv = 170,\n        .lvl = 56,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 170,\n        .lvl = 56,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BikerRuben2[] = {\n    {\n        .iv = 80,\n        .lvl = 48,\n        .species = SPECIES_WEEZING,\n    },\n    {\n        .iv = 80,\n        .lvl = 48,\n        .species = SPECIES_WEEZING,\n    },\n    {\n        .iv = 80,\n        .lvl = 48,\n        .species = SPECIES_WEEZING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallCamron2[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_PRIMEAPE,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_MACHOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BikerJaxon2[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_WEEZING,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_MUK,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallIsaiah2[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_MACHOKE,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_MACHAMP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallCorey2[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_PRIMEAPE,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_MACHAMP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperJacob2[] = {\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_SPEAROW,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 60,\n        .lvl = 28,\n        .species = SPECIES_SPEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperJacob3[] = {\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleAlice2[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_SEAKING,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_SEAKING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleDarrin2[] = {\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_SEADRA,\n    },\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_SEADRA,\n    },\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_SEADRA,\n    },\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_SEADRA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerMissy2[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_SEAKING,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_SEAKING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PicnickerMissy3[] = {\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_SEAKING,\n    },\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_SEAKING,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_FishermanWade2[] = {\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_MAGIKARP,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_MAGIKARP,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_MAGIKARP,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_MAGIKARP,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_MAGIKARP,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_MAGIKARP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleJack2[] = {\n    {\n        .iv = 80,\n        .lvl = 50,\n        .species = SPECIES_STARMIE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SisAndBroLilIan2[] = {\n    {\n        .iv = 80,\n        .lvl = 50,\n        .species = SPECIES_SEADRA,\n    },\n    {\n        .iv = 80,\n        .lvl = 50,\n        .species = SPECIES_STARMIE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SisAndBroLilIan3[] = {\n    {\n        .iv = 120,\n        .lvl = 55,\n        .species = SPECIES_SEADRA,\n    },\n    {\n        .iv = 120,\n        .lvl = 55,\n        .species = SPECIES_STARMIE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleFinn2[] = {\n    {\n        .iv = 80,\n        .lvl = 50,\n        .species = SPECIES_STARMIE,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushGirlSharon2[] = {\n    {\n        .iv = 130,\n        .lvl = 50,\n        .species = SPECIES_MANKEY,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 130,\n        .lvl = 50,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushGirlSharon3[] = {\n    {\n        .iv = 170,\n        .lvl = 55,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 170,\n        .lvl = 55,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushGirlTanya2[] = {\n    {\n        .iv = 130,\n        .lvl = 50,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 130,\n        .lvl = 50,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushGirlTanya3[] = {\n    {\n        .iv = 170,\n        .lvl = 55,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 170,\n        .lvl = 55,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltShea2[] = {\n    {\n        .iv = 180,\n        .lvl = 50,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 180,\n        .lvl = 50,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltShea3[] = {\n    {\n        .iv = 220,\n        .lvl = 55,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 220,\n        .lvl = 55,\n        .species = SPECIES_MACHAMP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltHugh2[] = {\n    {\n        .iv = 180,\n        .lvl = 50,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 180,\n        .lvl = 50,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_BlackBeltHugh3[] = {\n    {\n        .iv = 220,\n        .lvl = 55,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 220,\n        .lvl = 55,\n        .species = SPECIES_MACHAMP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushKinMikKia2[] = {\n    {\n        .iv = 130,\n        .lvl = 51,\n        .species = SPECIES_MACHOKE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 130,\n        .lvl = 51,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushKinMikKia3[] = {\n    {\n        .iv = 170,\n        .lvl = 56,\n        .species = SPECIES_MACHAMP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 170,\n        .lvl = 56,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TuberAmira2[] = {\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_POLIWHIRL,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_POLIWHIRL,\n    },\n    {\n        .iv = 80,\n        .lvl = 47,\n        .species = SPECIES_POLIWHIRL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TwinsJoyMeg2[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_CLEFAIRY,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_CLEFAIRY,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PainterRayna2[] = {\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_SMEARGLE,\n        .moves = {MOVE_CROSS_CHOP, MOVE_MEGAHORN, MOVE_DOUBLE_EDGE, MOVE_SELF_DESTRUCT},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungsterDestin2[] = {\n    {\n        .iv = 120,\n        .lvl = 53,\n        .species = SPECIES_RATICATE,\n    },\n    {\n        .iv = 120,\n        .lvl = 53,\n        .species = SPECIES_PIDGEOT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PkmnBreederAlize2[] = {\n    {\n        .iv = 150,\n        .lvl = 53,\n        .species = SPECIES_PIKACHU,\n    },\n    {\n        .iv = 150,\n        .lvl = 53,\n        .species = SPECIES_CLEFAIRY,\n    },\n    {\n        .iv = 150,\n        .lvl = 53,\n        .species = SPECIES_MARILL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungCoupleGiaJes2[] = {\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_NIDORINA,\n    },\n    {\n        .iv = 60,\n        .lvl = 30,\n        .species = SPECIES_NIDORINO,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_YoungCoupleGiaJes3[] = {\n    {\n        .iv = 120,\n        .lvl = 55,\n        .species = SPECIES_NIDOKING,\n    },\n    {\n        .iv = 120,\n        .lvl = 55,\n        .species = SPECIES_NIDOQUEEN,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperMilo2[] = {\n    {\n        .iv = 120,\n        .lvl = 53,\n        .species = SPECIES_PIDGEOTTO,\n    },\n    {\n        .iv = 120,\n        .lvl = 55,\n        .species = SPECIES_PIDGEOT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperChaz2[] = {\n    {\n        .iv = 120,\n        .lvl = 53,\n        .species = SPECIES_FEAROW,\n    },\n    {\n        .iv = 120,\n        .lvl = 55,\n        .species = SPECIES_FEAROW,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BirdKeeperHarold2[] = {\n    {\n        .iv = 120,\n        .lvl = 53,\n        .species = SPECIES_NOCTOWL,\n    },\n    {\n        .iv = 120,\n        .lvl = 55,\n        .species = SPECIES_NOCTOWL,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleNicole2[] = {\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_MARILL,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PsychicJaclyn2[] = {\n    {\n        .iv = 220,\n        .lvl = 52,\n        .species = SPECIES_NATU,\n        .moves = {MOVE_PSYCHIC, MOVE_CONFUSE_RAY, MOVE_FUTURE_SIGHT, MOVE_WISH},\n    },\n    {\n        .iv = 220,\n        .lvl = 52,\n        .species = SPECIES_SLOWBRO,\n        .moves = {MOVE_PSYCHIC, MOVE_HEADBUTT, MOVE_AMNESIA, MOVE_YAWN},\n    },\n    {\n        .iv = 220,\n        .lvl = 54,\n        .species = SPECIES_KADABRA,\n        .moves = {MOVE_PSYCHIC, MOVE_FUTURE_SIGHT, MOVE_RECOVER, MOVE_REFLECT},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleSamir2[] = {\n    {\n        .iv = 120,\n        .lvl = 55,\n        .species = SPECIES_GYARADOS,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_HikerEarl2[] = {\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_ONIX,\n    },\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_MACHAMP,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_RuinManiacLarry2[] = {\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_MACHOKE,\n    },\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_MACHOKE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_PokemaniacHector2[] = {\n    {\n        .iv = 150,\n        .lvl = 55,\n        .species = SPECIES_RHYDON,\n    },\n    {\n        .iv = 150,\n        .lvl = 55,\n        .species = SPECIES_KANGASKHAN,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PsychicDario2[] = {\n    {\n        .iv = 220,\n        .lvl = 56,\n        .species = SPECIES_GIRAFARIG,\n        .moves = {MOVE_CRUNCH, MOVE_PSYBEAM, MOVE_ODOR_SLEUTH, MOVE_AGILITY},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PsychicRodette2[] = {\n    {\n        .iv = 220,\n        .lvl = 53,\n        .species = SPECIES_NATU,\n        .moves = {MOVE_PSYCHIC, MOVE_CONFUSE_RAY, MOVE_WISH, MOVE_FUTURE_SIGHT},\n    },\n    {\n        .iv = 220,\n        .lvl = 53,\n        .species = SPECIES_HYPNO,\n        .moves = {MOVE_PSYCHIC, MOVE_DISABLE, MOVE_PSYCH_UP, MOVE_FUTURE_SIGHT},\n    },\n    {\n        .iv = 220,\n        .lvl = 53,\n        .species = SPECIES_HYPNO,\n        .moves = {MOVE_PSYCHIC, MOVE_HYPNOSIS, MOVE_PSYCH_UP, MOVE_FUTURE_SIGHT},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_JugglerMason2[] = {\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_ELECTRODE,\n    },\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_PINECO,\n    },\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_ELECTRODE,\n    },\n    {\n        .iv = 120,\n        .lvl = 52,\n        .species = SPECIES_PINECO,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerNicolas2[] = {\n    {\n        .iv = 220,\n        .lvl = 55,\n        .species = SPECIES_VICTREEBEL,\n        .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_STUN_SPORE, MOVE_WRAP},\n    },\n    {\n        .iv = 220,\n        .lvl = 55,\n        .species = SPECIES_VICTREEBEL,\n        .moves = {MOVE_RAZOR_LEAF, MOVE_ACID, MOVE_SLEEP_POWDER, MOVE_SLAM},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerMadeline2[] = {\n    {\n        .iv = 220,\n        .lvl = 55,\n        .species = SPECIES_VILEPLUME,\n        .moves = {MOVE_PETAL_DANCE, MOVE_MOONLIGHT, MOVE_ACID, MOVE_SLEEP_POWDER},\n    },\n    {\n        .iv = 220,\n        .lvl = 55,\n        .species = SPECIES_VILEPLUME,\n        .moves = {MOVE_PETAL_DANCE, MOVE_MOONLIGHT, MOVE_ACID, MOVE_STUN_SPORE},\n    },\n};\n\nstatic const struct TrainerMonItemDefaultMoves sParty_CrushGirlCyndy2[] = {\n    {\n        .iv = 170,\n        .lvl = 54,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 170,\n        .lvl = 54,\n        .species = SPECIES_HITMONTOP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n    {\n        .iv = 170,\n        .lvl = 54,\n        .species = SPECIES_MACHAMP,\n        .heldItem = ITEM_BLACK_BELT,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_TamerEvan2[] = {\n    {\n        .iv = 160,\n        .lvl = 52,\n        .species = SPECIES_SANDSLASH,\n    },\n    {\n        .iv = 160,\n        .lvl = 52,\n        .species = SPECIES_LICKITUNG,\n    },\n    {\n        .iv = 160,\n        .lvl = 55,\n        .species = SPECIES_URSARING,\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerJackson2[] = {\n    {\n        .iv = 220,\n        .lvl = 53,\n        .species = SPECIES_TANGELA,\n        .moves = {MOVE_SLAM, MOVE_MEGA_DRAIN, MOVE_BIND, MOVE_INGRAIN},\n    },\n    {\n        .iv = 220,\n        .lvl = 54,\n        .species = SPECIES_EXEGGUTOR,\n        .moves = {MOVE_CONFUSION, MOVE_EGG_BOMB, MOVE_STUN_SPORE, MOVE_REFLECT},\n    },\n    {\n        .iv = 220,\n        .lvl = 55,\n        .species = SPECIES_EXEGGUTOR,\n        .moves = {MOVE_CONFUSION, MOVE_EGG_BOMB, MOVE_SLEEP_POWDER, MOVE_STOMP},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_PkmnRangerKatelyn2[] = {\n    {\n        .iv = 220,\n        .lvl = 56,\n        .species = SPECIES_CHANSEY,\n        .moves = {MOVE_EGG_BOMB, MOVE_DEFENSE_CURL, MOVE_MINIMIZE, MOVE_SOFT_BOILED},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerLeroy2[] = {\n    {\n        .iv = 220,\n        .lvl = 52,\n        .species = SPECIES_RHYDON,\n        .moves = {MOVE_EARTHQUAKE, MOVE_HORN_DRILL, MOVE_ROCK_BLAST, MOVE_SCARY_FACE},\n    },\n    {\n        .iv = 220,\n        .lvl = 54,\n        .species = SPECIES_SLOWBRO,\n        .moves = {MOVE_PSYCHIC, MOVE_HEADBUTT, MOVE_AMNESIA, MOVE_DISABLE},\n    },\n    {\n        .iv = 220,\n        .lvl = 52,\n        .species = SPECIES_KANGASKHAN,\n        .moves = {MOVE_DIZZY_PUNCH, MOVE_BITE, MOVE_ENDURE, MOVE_REVERSAL},\n    },\n    {\n        .iv = 220,\n        .lvl = 52,\n        .species = SPECIES_MACHAMP,\n        .moves = {MOVE_CROSS_CHOP, MOVE_VITAL_THROW, MOVE_REVENGE, MOVE_SEISMIC_TOSS},\n    },\n    {\n        .iv = 220,\n        .lvl = 55,\n        .species = SPECIES_URSARING,\n        .moves = {MOVE_SLASH, MOVE_FAINT_ATTACK, MOVE_SNORE, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CooltrainerMichelle2[] = {\n    {\n        .iv = 220,\n        .lvl = 53,\n        .species = SPECIES_PERSIAN,\n        .moves = {MOVE_SLASH, MOVE_SCREECH, MOVE_FAINT_ATTACK, MOVE_BITE},\n    },\n    {\n        .iv = 220,\n        .lvl = 53,\n        .species = SPECIES_DEWGONG,\n        .moves = {MOVE_ICE_BEAM, MOVE_TAKE_DOWN, MOVE_ICY_WIND, MOVE_SHEER_COLD},\n    },\n    {\n        .iv = 220,\n        .lvl = 54,\n        .species = SPECIES_NINETALES,\n        .moves = {MOVE_FLAMETHROWER, MOVE_CONFUSE_RAY, MOVE_WILL_O_WISP, MOVE_GRUDGE},\n    },\n    {\n        .iv = 220,\n        .lvl = 54,\n        .species = SPECIES_RAPIDASH,\n        .moves = {MOVE_BOUNCE, MOVE_AGILITY, MOVE_FIRE_SPIN, MOVE_TAKE_DOWN},\n    },\n    {\n        .iv = 220,\n        .lvl = 56,\n        .species = SPECIES_GIRAFARIG,\n        .moves = {MOVE_CRUNCH, MOVE_PSYBEAM, MOVE_STOMP, MOVE_ODOR_SLEUTH},\n    },\n};\n\nstatic const struct TrainerMonNoItemCustomMoves sParty_CoolCoupleLexNya2[] = {\n    {\n        .iv = 220,\n        .lvl = 57,\n        .species = SPECIES_MILTANK,\n        .moves = {MOVE_BODY_SLAM, MOVE_MILK_DRINK, MOVE_GROWL, MOVE_DEFENSE_CURL},\n    },\n    {\n        .iv = 220,\n        .lvl = 57,\n        .species = SPECIES_TAUROS,\n        .moves = {MOVE_TAKE_DOWN, MOVE_SCARY_FACE, MOVE_PURSUIT, MOVE_SWAGGER},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherColton2[] = {\n    {\n        .iv = 20,\n        .lvl = 19,\n        .species = SPECIES_METAPOD,\n    },\n    {\n        .iv = 20,\n        .lvl = 19,\n        .species = SPECIES_WEEDLE,\n    },\n    {\n        .iv = 20,\n        .lvl = 19,\n        .species = SPECIES_METAPOD,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherColton3[] = {\n    {\n        .iv = 60,\n        .lvl = 27,\n        .species = SPECIES_BUTTERFREE,\n    },\n    {\n        .iv = 60,\n        .lvl = 27,\n        .species = SPECIES_KAKUNA,\n    },\n    {\n        .iv = 60,\n        .lvl = 27,\n        .species = SPECIES_BUTTERFREE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_BugCatcherColton4[] = {\n    {\n        .iv = 120,\n        .lvl = 51,\n        .species = SPECIES_BUTTERFREE,\n    },\n    {\n        .iv = 120,\n        .lvl = 54,\n        .species = SPECIES_BEEDRILL,\n    },\n    {\n        .iv = 120,\n        .lvl = 51,\n        .species = SPECIES_BUTTERFREE,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleMatthew2[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_POLIWHIRL,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_POLIWRATH,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerMaleTony2[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_SEADRA,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_SEADRA,\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_SwimmerFemaleMelissa2[] = {\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_POLIWHIRL,\n    },\n    {\n        .iv = 80,\n        .lvl = 49,\n        .species = SPECIES_SEAKING,\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_EliteFourLorelei2[] = {\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_DEWGONG,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_SIGNAL_BEAM, MOVE_DOUBLE_TEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_CLOYSTER,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_SUPERSONIC, MOVE_RAIN_DANCE},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_PILOSWINE,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_BLIZZARD, MOVE_EARTHQUAKE, MOVE_DOUBLE_EDGE, MOVE_ROCK_SLIDE},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_JYNX,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_PSYCHIC, MOVE_LOVELY_KISS, MOVE_ATTRACT},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_LAPRAS,\n        .heldItem = ITEM_CHERI_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_PSYCHIC, MOVE_THUNDER},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_EliteFourBruno2[] = {\n    {\n        .iv = 255,\n        .lvl = 65,\n        .species = SPECIES_STEELIX,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_CRUNCH, MOVE_ROCK_TOMB},\n    },\n    {\n        .iv = 255,\n        .lvl = 65,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SKY_UPPERCUT, MOVE_MACH_PUNCH, MOVE_ROCK_SLIDE, MOVE_COUNTER},\n    },\n    {\n        .iv = 255,\n        .lvl = 65,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_MEGA_KICK, MOVE_FORESIGHT, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_STEELIX,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_CRUNCH, MOVE_DRAGON_BREATH},\n    },\n    {\n        .iv = 255,\n        .lvl = 68,\n        .species = SPECIES_MACHAMP,\n        .heldItem = ITEM_PERSIM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_CROSS_CHOP, MOVE_EARTHQUAKE, MOVE_BRICK_BREAK, MOVE_ROCK_SLIDE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_EliteFourAgatha2[] = {\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_GENGAR,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SHADOW_BALL, MOVE_PSYCHIC, MOVE_CONFUSE_RAY, MOVE_HYPNOSIS},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_CROBAT,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_AIR_CUTTER, MOVE_SHADOW_BALL, MOVE_CONFUSE_RAY},\n    },\n    {\n        .iv = 255,\n        .lvl = 65,\n        .species = SPECIES_MISDREAVUS,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SHADOW_BALL, MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_ATTRACT},\n    },\n    {\n        .iv = 255,\n        .lvl = 68,\n        .species = SPECIES_ARBOK,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_EARTHQUAKE, MOVE_GIGA_DRAIN, MOVE_DOUBLE_TEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 70,\n        .species = SPECIES_GENGAR,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SHADOW_BALL, MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_EliteFourLance2[] = {\n    {\n        .iv = 255,\n        .lvl = 68,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPER_BEAM, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_THUNDER_WAVE},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_DRAGONITE,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPER_BEAM, MOVE_EARTHQUAKE, MOVE_DRAGON_CLAW, MOVE_FLAMETHROWER},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_KINGDRA,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPER_BEAM, MOVE_DRAGON_DANCE, MOVE_SURF, MOVE_ICE_BEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 70,\n        .species = SPECIES_AERODACTYL,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPER_BEAM, MOVE_ANCIENT_POWER, MOVE_AERIAL_ACE, MOVE_EARTHQUAKE},\n    },\n    {\n        .iv = 255,\n        .lvl = 72,\n        .species = SPECIES_DRAGONITE,\n        .heldItem = ITEM_PERSIM_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_HYPER_BEAM, MOVE_OUTRAGE, MOVE_THUNDERBOLT, MOVE_ICE_BEAM},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_ChampionRematchSquirtle[] = {\n    {\n        .iv = 255,\n        .lvl = 72,\n        .species = SPECIES_HERACROSS,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_ROCK_TOMB},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_CALM_MIND, MOVE_REFLECT},\n    },\n    {\n        .iv = 255,\n        .lvl = 72,\n        .species = SPECIES_TYRANITAR,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_CRUNCH, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_AERIAL_ACE},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_EXTREME_SPEED, MOVE_OVERHEAT, MOVE_AERIAL_ACE, MOVE_IRON_TAIL},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .species = SPECIES_EXEGGUTOR,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_GIGA_DRAIN, MOVE_PSYCHIC, MOVE_SLEEP_POWDER, MOVE_LIGHT_SCREEN},\n    },\n    {\n        .iv = 255,\n        .lvl = 75,\n        .species = SPECIES_BLASTOISE,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_HYDRO_PUMP, MOVE_ICE_BEAM, MOVE_EARTHQUAKE, MOVE_RAIN_DANCE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_ChampionRematchBulbasaur[] = {\n    {\n        .iv = 255,\n        .lvl = 72,\n        .species = SPECIES_HERACROSS,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_ROCK_TOMB},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_CALM_MIND, MOVE_REFLECT},\n    },\n    {\n        .iv = 255,\n        .lvl = 72,\n        .species = SPECIES_TYRANITAR,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_CRUNCH, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_AERIAL_ACE},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYDRO_PUMP, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HYPER_BEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_EXTREME_SPEED, MOVE_OVERHEAT, MOVE_AERIAL_ACE, MOVE_IRON_TAIL},\n    },\n    {\n        .iv = 255,\n        .lvl = 75,\n        .species = SPECIES_VENUSAUR,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SOLAR_BEAM, MOVE_SLUDGE_BOMB, MOVE_EARTHQUAKE, MOVE_SUNNY_DAY},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_ChampionRematchCharmander[] = {\n    {\n        .iv = 255,\n        .lvl = 72,\n        .species = SPECIES_HERACROSS,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_ROCK_TOMB},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_CALM_MIND, MOVE_REFLECT},\n    },\n    {\n        .iv = 255,\n        .lvl = 72,\n        .species = SPECIES_TYRANITAR,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_CRUNCH, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_AERIAL_ACE},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .species = SPECIES_EXEGGUTOR,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_GIGA_DRAIN, MOVE_PSYCHIC, MOVE_SLEEP_POWDER, MOVE_LIGHT_SCREEN},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_HYDRO_PUMP, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HYPER_BEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 75,\n        .species = SPECIES_CHARIZARD,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_FIRE_BLAST, MOVE_DRAGON_CLAW, MOVE_AERIAL_ACE, MOVE_EARTHQUAKE},\n    },\n};\n\nstatic const struct TrainerMonNoItemDefaultMoves sParty_CueBallPaxton[] = {\n    {\n        .iv = 50,\n        .lvl = 39,\n        .species = SPECIES_WEEZING,\n    },\n    {\n        .iv = 50,\n        .lvl = 39,\n        .species = SPECIES_MUK,\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderBrockChallenge[] = {\n    {\n        .iv = 250,\n        .lvl = 12,\n        .species = SPECIES_GEODUDE,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_ROCK_TOMB, MOVE_SANDSTORM},\n    },\n    {\n        .iv = 250,\n        .lvl = 12,\n        .species = SPECIES_RHYHORN,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 1,\n        .moves = {MOVE_FURY_ATTACK, MOVE_ROCK_TOMB, MOVE_TAIL_WHIP, MOVE_SANDSTORM},\n    },\n    {\n        .iv = 250,\n        .lvl = 14,\n        .species = SPECIES_ONIX,\n        .heldItem = ITEM_ORAN_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_TACKLE, MOVE_ROAR, MOVE_ROCK_TOMB, MOVE_SAND_TOMB},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderMistyChallenge[] = {\n    {\n        .iv = 250,\n        .lvl = 18,\n        .species = SPECIES_STARYU,\n        .heldItem = ITEM_ORAN_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_TACKLE, MOVE_RECOVER, MOVE_WATER_PULSE, MOVE_CAMOUFLAGE},\n    },\n    {\n        .iv = 250,\n        .lvl = 18,\n        .species = SPECIES_SHELLDER,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_ICY_WIND, MOVE_DIVE, MOVE_PROTECT, MOVE_SUPERSONIC},\n    },\n    {\n        .iv = 250,\n        .lvl = 21,\n        .species = SPECIES_STARMIE,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_SWIFT, MOVE_RECOVER, MOVE_COSMIC_POWER, MOVE_WATER_PULSE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderLtSurgeChallenge[] = {\n    {\n        .iv = 250,\n        .lvl = 21,\n        .species = SPECIES_VOLTORB,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 1,\n        .moves = {MOVE_SONIC_BOOM, MOVE_SELF_DESTRUCT, MOVE_PROTECT, MOVE_SHOCK_WAVE},\n    },\n    {\n        .iv = 250,\n        .lvl = 18,\n        .species = SPECIES_JOLTEON,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SHOCK_WAVE, MOVE_CHARM, MOVE_MUD_SLAP, MOVE_BITE},\n    },\n    {\n        .iv = 250,\n        .lvl = 18,\n        .species = SPECIES_ELECTABUZZ,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SHOCK_WAVE, MOVE_ICE_PUNCH, MOVE_QUICK_ATTACK, MOVE_KARATE_CHOP},\n    },\n    {\n        .iv = 250,\n        .lvl = 24,\n        .species = SPECIES_RAICHU,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_COUNTER, MOVE_THUNDER_WAVE, MOVE_HIDDEN_POWER, MOVE_SHOCK_WAVE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_LeaderErikaChallenge[] = {\n    {\n        .iv = 12, //Challenge Erika's Victreebel, 0 Atk, 9 SpAtk & 30 others. This nerfs Victreebel's attacking stats to be in line with Vileplume.\n        .lvl = 29,\n        .evs = { 0, 0, 0, 0, 0, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_VICTREEBEL,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_SLEEP_POWDER, MOVE_INGRAIN, MOVE_GIGA_DRAIN},\n    },\n    {\n        .iv = 13, // all 30\n        .lvl = 24,\n        .evs = { 0, 0, 0, 0, 0, 0},\n        .nature = NATURE_HARDY,\n        .species = SPECIES_TANGELA,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SLEEP_POWDER, MOVE_LEECH_SEED, MOVE_SUBSTITUTE, MOVE_GIGA_DRAIN},\n    },\n    {\n        .iv = 13, // all 30\n        .lvl = 29,\n        .evs = { 0, 0, 0, 0, 0, 0},\n        .nature = NATURE_HARDY,\n        .species = SPECIES_PARASECT,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SPORE, MOVE_AERIAL_ACE, MOVE_DIG, MOVE_SLASH},\n    },\n    {\n        .iv = 13, // all 30\n        .lvl = 29,\n        .evs = { 0, 0, 0, 0, 0, 0},\n        .nature = NATURE_HARDY,\n        .species = SPECIES_VILEPLUME,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SLEEP_POWDER, MOVE_MOONLIGHT, MOVE_SLUDGE_BOMB, MOVE_GIGA_DRAIN},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderKogaChallenge[] = {\n    {\n        .iv = 250,\n        .lvl = 37,\n        .species = SPECIES_KOFFING,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_EXPLOSION, MOVE_SLUDGE_BOMB, MOVE_TORMENT, MOVE_TOXIC},\n    },\n    {\n        .iv = 250,\n        .lvl = 39,\n        .species = SPECIES_MUK,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 1,\n        .moves = {MOVE_MINIMIZE, MOVE_SLUDGE, MOVE_CURSE, MOVE_TOXIC},\n    },\n    {\n        .iv = 250,\n        .lvl = 37,\n        .species = SPECIES_VENOMOTH,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_SIGNAL_BEAM, MOVE_PSYCHIC, MOVE_TOXIC},\n    },\n    {\n        .iv = 250,\n        .lvl = 37,\n        .species = SPECIES_TENTACRUEL,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_BARRIER, MOVE_TOXIC},\n    },\n    {\n        .iv = 250,\n        .lvl = 43,\n        .species = SPECIES_WEEZING,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_PAIN_SPLIT, MOVE_SLUDGE, MOVE_SHADOW_BALL, MOVE_TOXIC},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderSabrinaChallenge[] = {\n    {\n        .iv = 250,\n        .lvl = 38,\n        .species = SPECIES_HYPNO,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYBEAM, MOVE_REFLECT, MOVE_BATON_PASS, MOVE_CALM_MIND},\n    },\n    {\n        .iv = 250,\n        .lvl = 37,\n        .species = SPECIES_MR_MIME,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_BARRIER, MOVE_PSYBEAM, MOVE_BATON_PASS, MOVE_SUBSTITUTE},\n    },\n    {\n        .iv = 250,\n        .lvl = 37,\n        .species = SPECIES_SLOWBRO,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_FACADE, MOVE_CURSE, MOVE_SHADOW_BALL, MOVE_REST},\n    },\n    {\n        .iv = 250,\n        .lvl = 38,\n        .species = SPECIES_JYNX,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SUBSTITUTE, MOVE_CALM_MIND, MOVE_LOVELY_KISS, MOVE_ICE_PUNCH},\n    },\n    {\n        .iv = 250,\n        .lvl = 43,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_RECOVER, MOVE_FIRE_PUNCH, MOVE_CALM_MIND},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderBlaineChallenge[] = {\n    {\n        .iv = 250,\n        .lvl = 42,\n        .species = SPECIES_NINETALES,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_SUNNY_DAY, MOVE_WILL_O_WISP, MOVE_DISABLE, MOVE_FIRE_BLAST},\n    },\n    {\n        .iv = 250,\n        .lvl = 40,\n        .species = SPECIES_MAGMAR,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDER_PUNCH, MOVE_BRICK_BREAK, MOVE_SEISMIC_TOSS, MOVE_FIRE_BLAST},\n    },\n    {\n        .iv = 250,\n        .lvl = 42,\n        .species = SPECIES_RAPIDASH,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 1,\n        .moves = {MOVE_SUNNY_DAY, MOVE_BOUNCE, MOVE_SOLAR_BEAM, MOVE_FIRE_BLAST},\n    },\n    {\n        .iv = 250,\n        .lvl = 42,\n        .species = SPECIES_FLAREON,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_DOUBLE_EDGE, MOVE_SHADOW_BALL, MOVE_OVERHEAT, MOVE_WISH},\n    },\n    {\n        .iv = 250,\n        .lvl = 47,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_HOWL, MOVE_EXTREME_SPEED, MOVE_IRON_TAIL, MOVE_FIRE_BLAST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderGiovanniChallenge[] = {\n    {\n        .iv = 250,\n        .lvl = 45,\n        .species = SPECIES_MAROWAK,\n        .heldItem = ITEM_THICK_CLUB,\n        .abilityNum = 0,\n        .moves = {MOVE_SWORDS_DANCE, MOVE_BONEMERANG, MOVE_THRASH, MOVE_ROCK_SLIDE},\n    },\n    {\n        .iv = 250,\n        .lvl = 42,\n        .species = SPECIES_DUGTRIO,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 1,\n        .moves = {MOVE_FISSURE, MOVE_AERIAL_ACE, MOVE_TRI_ATTACK, MOVE_EARTHQUAKE},\n    },\n    {\n        .iv = 250,\n        .lvl = 44,\n        .species = SPECIES_KANGASKHAN,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_DOUBLE_EDGE, MOVE_SHADOW_BALL, MOVE_FAKE_OUT, MOVE_EARTHQUAKE},\n    },\n    {\n        .iv = 250,\n        .lvl = 44,\n        .species = SPECIES_NIDOQUEEN,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_COUNTER, MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_EARTHQUAKE},\n    },\n    {\n        .iv = 250,\n        .lvl = 45,\n        .species = SPECIES_NIDOKING,\n        .heldItem = ITEM_NONE,\n        .abilityNum = 0,\n        .moves = {MOVE_MEGAHORN, MOVE_SHADOW_BALL, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE},\n    },\n    {\n        .iv = 250,\n        .lvl = 50,\n        .species = SPECIES_RHYDON,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_DOUBLE_EDGE, MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_EARTHQUAKE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_EliteFourLoreleiChallenge[] = {\n    {\n        .iv = 250,\n        .lvl = 51,\n        .species = SPECIES_CLOYSTER,\n        .heldItem = ITEM_MYSTIC_WATER,\n        .abilityNum = 0,\n        .moves = {MOVE_SPIKES, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, MOVE_SURF},\n    },\n    {\n        .iv = 250,\n        .lvl = 52,\n        .species = SPECIES_DEWGONG,\n        .heldItem = ITEM_NEVER_MELT_ICE,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_REST, MOVE_SLEEP_TALK},\n    },\n    {\n        .iv = 250,\n        .lvl = 52,\n        .species = SPECIES_VAPOREON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_WISH, MOVE_PROTECT},\n    },\n    {\n        .iv = 250,\n        .lvl = 52,\n        .species = SPECIES_PILOSWINE,\n        .heldItem = ITEM_QUICK_CLAW,\n        .abilityNum = 0,\n        .moves = {MOVE_EARTHQUAKE, MOVE_BLIZZARD, MOVE_ROCK_SLIDE, MOVE_ROAR},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_JYNX,\n        .heldItem = ITEM_TWISTED_SPOON,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_PSYCHIC, MOVE_LOVELY_KISS, MOVE_ATTRACT},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_LAPRAS,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_REST, MOVE_SLEEP_TALK},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_EliteFourBrunoChallenge[] = {\n    {\n        .iv = 250,\n        .lvl = 51,\n        .species = SPECIES_POLIWRATH,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH, MOVE_BULK_UP, MOVE_HYPNOSIS},\n    },\n    {\n        .iv = 250,\n        .lvl = 53,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_BLACK_BELT,\n        .abilityNum = 0,\n        .moves = {MOVE_SKY_UPPERCUT, MOVE_MACH_PUNCH, MOVE_ROCK_SLIDE, MOVE_EARTHQUAKE},\n    },\n    {\n        .iv = 250,\n        .lvl = 53,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_HI_JUMP_KICK, MOVE_EARTHQUAKE, MOVE_SUBSTITUTE, MOVE_BULK_UP},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_PRIMEAPE,\n        .heldItem = ITEM_SCOPE_LENS,\n        .abilityNum = 0,\n        .moves = {MOVE_CROSS_CHOP, MOVE_COUNTER, MOVE_ROCK_SLIDE, MOVE_BULK_UP},\n    },\n    {\n        .iv = 250,\n        .lvl = 53,\n        .species = SPECIES_HERACROSS,\n        .heldItem = ITEM_SILVER_POWDER,\n        .abilityNum = 1,\n        .moves = {MOVE_MEGAHORN, MOVE_SWORDS_DANCE, MOVE_SUBSTITUTE, MOVE_BRICK_BREAK},\n    },\n    {\n        .iv = 250,\n        .lvl = 56,\n        .species = SPECIES_MACHAMP,\n        .heldItem = ITEM_SHELL_BELL,\n        .abilityNum = 0,\n        .moves = {MOVE_CROSS_CHOP, MOVE_BULK_UP, MOVE_FACADE, MOVE_ROCK_SLIDE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_EliteFourAgathaChallenge[] = {\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_GENGAR,\n        .heldItem = ITEM_BRIGHT_POWDER,\n        .abilityNum = 0,\n        .moves = {MOVE_WILL_O_WISP, MOVE_TORMENT, MOVE_ICE_PUNCH, MOVE_DOUBLE_TEAM},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_GOLBAT,\n        .heldItem = ITEM_SHARP_BEAK,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_AERIAL_ACE, MOVE_GIGA_DRAIN, MOVE_TOXIC},\n    },\n    {\n        .iv = 250,\n        .lvl = 53,\n        .species = SPECIES_MISDREAVUS,\n        .heldItem = ITEM_SITRUS_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_SUBSTITUTE},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_WEEZING,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_WILL_O_WISP, MOVE_PAIN_SPLIT, MOVE_FLAMETHROWER},\n    },\n    {\n        .iv = 250,\n        .lvl = 56,\n        .species = SPECIES_ARBOK,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_SCREECH, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE},\n    },\n    {\n        .iv = 250,\n        .lvl = 58,\n        .species = SPECIES_GENGAR,\n        .heldItem = ITEM_PETAYA_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_WILL_O_WISP, MOVE_PSYCHIC, MOVE_ICE_PUNCH, MOVE_THUNDERBOLT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_EliteFourLanceChallenge[] = {\n    {\n        .iv = 250,\n        .lvl = 56,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_FOCUS_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_DOUBLE_EDGE, MOVE_FLAIL},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_DRAGONITE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_KINGDRA,\n        .heldItem = ITEM_PETAYA_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_AGILITY, MOVE_DRAGON_BREATH},\n    },\n    {\n        .iv = 250,\n        .lvl = 54,\n        .species = SPECIES_DRAGONITE,\n        .heldItem = ITEM_CHARCOAL,\n        .abilityNum = 0,\n        .moves = {MOVE_FLAMETHROWER, MOVE_LIGHT_SCREEN, MOVE_EARTHQUAKE, MOVE_DRAGON_CLAW},\n    },\n    {\n        .iv = 250,\n        .lvl = 58,\n        .species = SPECIES_AERODACTYL,\n        .heldItem = ITEM_KINGS_ROCK,\n        .abilityNum = 0,\n        .moves = {MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_AERIAL_ACE},\n    },\n    {\n        .iv = 250,\n        .lvl = 60,\n        .species = SPECIES_DRAGONITE,\n        .heldItem = ITEM_LIECHI_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_DRAGON_DANCE, MOVE_DOUBLE_EDGE, MOVE_STEEL_WING, MOVE_AERIAL_ACE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_ChampionFirstSquirtleChallenge[] = {\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_PIDGEOT,\n        .heldItem = ITEM_LIECHI_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_AERIAL_ACE, MOVE_FEATHER_DANCE, MOVE_STEEL_WING, MOVE_DOUBLE_EDGE},\n    },\n    {\n        .iv = 255,\n        .lvl = 57,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_BRIGHT_POWDER,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_RECOVER, MOVE_ICE_PUNCH},\n    },\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_RHYDON,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE},\n    },\n    {\n        .iv = 250, //need all 30 EVs for Fighting HP 70BP\n        .lvl = 59,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_KINGS_ROCK,\n        .abilityNum = 0,\n        .moves = {MOVE_EXTREME_SPEED, MOVE_FLAMETHROWER, MOVE_HIDDEN_POWER, MOVE_HOWL},\n    },\n    {\n        .iv = 255,\n        .lvl = 61,\n        .species = SPECIES_EXEGGUTOR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_LEECH_SEED, MOVE_SUBSTITUTE, MOVE_SLEEP_POWDER, MOVE_PSYCHIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_BLASTOISE,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_SURF, MOVE_TOXIC, MOVE_ICE_BEAM, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_ChampionFirstBulbasaurChallenge[] = {\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_PIDGEOT,\n        .heldItem = ITEM_LIECHI_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_AERIAL_ACE, MOVE_FEATHER_DANCE, MOVE_STEEL_WING, MOVE_DOUBLE_EDGE},\n    },\n    {\n        .iv = 255,\n        .lvl = 57,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_BRIGHT_POWDER,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_RECOVER, MOVE_ICE_PUNCH},\n    },\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_RHYDON,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE},\n    },\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_FOCUS_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_THUNDER_WAVE, MOVE_DOUBLE_EDGE},\n    },\n    {\n        .iv = 250, //need all 30 EVs for Fighting HP 70BP\n        .lvl = 61,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_KINGS_ROCK,\n        .abilityNum = 0,\n        .moves = {MOVE_EXTREME_SPEED, MOVE_FLAMETHROWER, MOVE_HIDDEN_POWER, MOVE_HOWL},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_VENUSAUR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SLEEP_POWDER, MOVE_SYNTHESIS, MOVE_LEECH_SEED, MOVE_RAZOR_LEAF},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_ChampionFirstCharmanderChallenge[] = {\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_PIDGEOT,\n        .heldItem = ITEM_LIECHI_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_AERIAL_ACE, MOVE_FEATHER_DANCE, MOVE_STEEL_WING, MOVE_DOUBLE_EDGE},\n    },\n    {\n        .iv = 255,\n        .lvl = 57,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_BRIGHT_POWDER,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_RECOVER, MOVE_ICE_PUNCH},\n    },\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_RHYDON,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE},\n    },\n    {\n        .iv = 255,\n        .lvl = 59,\n        .species = SPECIES_EXEGGUTOR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_LEECH_SEED, MOVE_SUBSTITUTE, MOVE_SLEEP_POWDER, MOVE_PSYCHIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 61,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_FOCUS_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_THUNDER_WAVE, MOVE_DOUBLE_EDGE},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_CHARIZARD,\n        .heldItem = ITEM_WHITE_HERB,\n        .abilityNum = 0,\n        .moves = {MOVE_OVERHEAT, MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH, MOVE_SUNNY_DAY},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_EliteFourLoreleiChallenge2[] = {\n    {\n        .iv = 255,\n        .lvl = 63,\n        .evs = { 72, 0, 0, 184, 8, 244},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_CLOYSTER,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SPIKES, MOVE_SURF, MOVE_EXPLOSION, MOVE_ICE_BEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .evs = { 252, 0, 0, 4, 0, 252},\n        .nature = NATURE_CALM,\n        .species = SPECIES_DEWGONG,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_REST, MOVE_SLEEP_TALK},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .evs = { 252, 0, 228, 0, 0, 28},\n        .nature = NATURE_BOLD,\n        .species = SPECIES_VAPOREON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_WISH, MOVE_TOXIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .evs = { 248, 16, 152, 0, 92, 0},\n        .nature = NATURE_BRAVE,\n        .species = SPECIES_PILOSWINE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_BLIZZARD, MOVE_EARTHQUAKE, MOVE_TOXIC, MOVE_PROTECT},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 0, 0, 0, 252, 252, 4},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_JYNX,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SUBSTITUTE, MOVE_LOVELY_KISS, MOVE_CALM_MIND},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 252, 0, 164, 0, 92, 0},\n        .nature = NATURE_BOLD,\n        .species = SPECIES_LAPRAS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_THUNDERBOLT, MOVE_TOXIC},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_EliteFourBrunoChallenge2[] = {\n    {\n        .iv = 1, // 31/31/30/31/31/30 for 70 Ghost\n        .lvl = 65,\n        .evs = { 252, 136, 112, 8, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_HITMONTOP,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_HIDDEN_POWER, MOVE_PROTECT},\n    },\n    {\n        .iv = 1, // 31/31/30/31/31/30 for 70 Ghost\n        .lvl = 65,\n        .evs = { 252, 252, 0, 0, 0, 4},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_POLIWRATH,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH, MOVE_HIDDEN_POWER, MOVE_HYPNOSIS},\n    },\n    {\n        .iv = 255, \n        .lvl = 65,\n        .evs = { 0, 252, 0, 252, 0, 252},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_HITMONCHAN,\n        .heldItem = ITEM_CHOICE_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_SKY_UPPERCUT, MOVE_RETURN, MOVE_ROCK_SLIDE, MOVE_EARTHQUAKE},\n    },\n    {\n        .iv = 255,\n        .lvl = 65,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_HITMONLEE,\n        .heldItem = ITEM_SALAC_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_HI_JUMP_KICK, MOVE_EARTHQUAKE, MOVE_SUBSTITUTE, MOVE_BULK_UP},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_HERACROSS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_MEGAHORN, MOVE_SWORDS_DANCE, MOVE_SUBSTITUTE, MOVE_BRICK_BREAK},\n    },\n    {\n        .iv = 255,\n        .lvl = 68,\n        .evs = { 252, 96, 156, 4, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_MACHAMP,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CROSS_CHOP, MOVE_REST, MOVE_SLEEP_TALK, MOVE_ROCK_SLIDE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_EliteFourAgathaChallenge2[] = {\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 248, 0, 44, 96, 8, 112},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_GENGAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_WILL_O_WISP, MOVE_EXPLOSION, MOVE_THUNDERBOLT, MOVE_ICE_PUNCH},\n    },\n    {\n        .iv = 2, // 31/31/31/31/30/30 for 70 Ground\n        .lvl = 66,\n        .evs = { 80, 252, 0, 176, 0, 0},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_CROBAT,\n        .heldItem = ITEM_CHOICE_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_AERIAL_ACE, MOVE_SHADOW_BALL, MOVE_HIDDEN_POWER},\n    },\n    {\n        .iv = 255,\n        .lvl = 65,\n        .evs = { 252, 0, 176, 64, 0, 16},\n        .nature = NATURE_CALM,\n        .species = SPECIES_MISDREAVUS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_MEAN_LOOK, MOVE_PERISH_SONG, MOVE_DESTINY_BOND, MOVE_PROTECT},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 252, 178, 0, 12, 68, 0},\n        .nature = NATURE_BRAVE,\n        .species = SPECIES_WEEZING,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_WILL_O_WISP, MOVE_EXPLOSION, MOVE_FLAMETHROWER},\n    },\n    {\n        .iv = 255,\n        .lvl = 68,\n        .evs = { 0, 252, 8, 252, 0, 0},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_ARBOK,\n        .heldItem = ITEM_CHOICE_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_SLUDGE_BOMB, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE},\n    },\n    {\n        .iv = 255,\n        .lvl = 70,\n        .evs = { 0, 0, 0, 252, 252, 4},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_GENGAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_ICE_PUNCH, MOVE_HYPNOSIS, MOVE_TAUNT},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_EliteFourLanceChallenge2[] = {\n    {\n        .iv = 255,\n        .lvl = 68,\n        .evs = { 68, 252, 0, 188, 0, 0},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_DRAGON_DANCE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_THUNDER_WAVE},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 0, 178, 0, 24, 252, 56},\n        .nature = NATURE_BRAVE,\n        .species = SPECIES_DRAGONITE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_ICE_BEAM, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_FLAMETHROWER},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 240, 0, 0, 16, 252, 0},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_KINGDRA,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_ICE_BEAM, MOVE_TOXIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 144, 228, 0, 0, 0, 136},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_STEELIX,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_EARTHQUAKE, MOVE_TOXIC, MOVE_DOUBLE_EDGE, MOVE_EXPLOSION},\n    },\n    {\n        .iv = 3, // 31/31/31/30/30/30 for 70 Flying\n        .lvl = 70,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_AERODACTYL,\n        .heldItem = ITEM_CHOICE_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER},\n    },\n    {\n        .iv = 3, // 31/31/31/30/30/30 for 70 Flying\n        .lvl = 72,\n        .evs = { 52, 204, 0, 184, 68, 0},\n        .nature = NATURE_LONELY,\n        .species = SPECIES_DRAGONITE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_HIDDEN_POWER, MOVE_EARTHQUAKE, MOVE_THUNDERBOLT, MOVE_DRAGON_DANCE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_ChampionRematchSquirtleChallenge[] = {\n    {\n        .iv = 255,\n        .lvl = 72,\n        .evs = { 252, 0, 0, 4, 0, 252},\n        .nature = NATURE_CAREFUL,\n        .species = SPECIES_SKARMORY,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SPIKES, MOVE_WHIRLWIND, MOVE_DRILL_PECK, MOVE_TOXIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .evs = { 4, 0, 0, 252, 252, 0},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_RECOVER},\n    },\n    {\n        .iv = 255,\n        .lvl = 72,\n        .evs = { 0, 4, 0, 252, 252, 0},\n        .nature = NATURE_HASTY,\n        .species = SPECIES_TYRANITAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CRUNCH, MOVE_FIRE_BLAST, MOVE_BRICK_BREAK, MOVE_ICE_BEAM},\n    },\n    {\n        .iv = 4, // 31/31/30/30/30/30 for 70 Fighting\n        .lvl = 73,\n        .evs = { 252, 252, 0, 4, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_EXTREME_SPEED, MOVE_OVERHEAT, MOVE_HIDDEN_POWER, MOVE_HOWL},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .evs = { 124, 0, 0, 96, 188, 96},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_EXEGGUTOR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_LEECH_SEED, MOVE_SUBSTITUTE, MOVE_SLEEP_POWDER, MOVE_PSYCHIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 75,\n        .evs = { 252, 0, 148, 40, 68, 0},\n        .nature = NATURE_BOLD,\n        .species = SPECIES_BLASTOISE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SURF, MOVE_TOXIC, MOVE_ICE_BEAM, MOVE_REST},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_ChampionRematchBulbasaurChallenge[] = {\n    {\n        .iv = 255,\n        .lvl = 72,\n        .evs = { 252, 0, 0, 4, 0, 252},\n        .nature = NATURE_CAREFUL,\n        .species = SPECIES_SKARMORY,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SPIKES, MOVE_WHIRLWIND, MOVE_DRILL_PECK, MOVE_TOXIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .evs = { 4, 0, 0, 252, 252, 0},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_RECOVER},\n    },\n    {\n        .iv = 255,\n        .lvl = 72,\n        .evs = { 0, 4, 0, 252, 252, 0},\n        .nature = NATURE_HASTY,\n        .species = SPECIES_TYRANITAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CRUNCH, MOVE_FIRE_BLAST, MOVE_BRICK_BREAK, MOVE_ICE_BEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .evs = { 216, 16, 0, 188, 0, 88},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_DRAGON_DANCE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_REST},\n    },\n    {\n        .iv = 4, // 31/31/30/30/30/30 for 70 Fighting\n        .lvl = 73,\n        .evs = { 252, 252, 0, 4, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_ARCANINE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_EXTREME_SPEED, MOVE_OVERHEAT, MOVE_HIDDEN_POWER, MOVE_HOWL},\n    },\n    {\n        .iv = 255,\n        .lvl = 75,\n        .evs = { 252, 0, 84, 24, 0, 148},\n        .nature = NATURE_CAREFUL,\n        .species = SPECIES_VENUSAUR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SLEEP_POWDER, MOVE_SYNTHESIS, MOVE_LEECH_SEED, MOVE_SLUDGE_BOMB},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_ChampionRematchCharmanderChallenge[] = {\n    {\n        .iv = 255,\n        .lvl = 72,\n        .evs = { 252, 0, 0, 4, 0, 252},\n        .nature = NATURE_CAREFUL,\n        .species = SPECIES_SKARMORY,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SPIKES, MOVE_WHIRLWIND, MOVE_DRILL_PECK, MOVE_TOXIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .evs = { 4, 0, 0, 252, 252, 0},\n        .nature = NATURE_TIMID,\n        .species = SPECIES_ALAKAZAM,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_PSYCHIC, MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_RECOVER},\n    },\n    {\n        .iv = 255,\n        .lvl = 72,\n        .evs = { 0, 4, 0, 252, 252, 0},\n        .nature = NATURE_HASTY,\n        .species = SPECIES_TYRANITAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_CRUNCH, MOVE_FIRE_BLAST, MOVE_BRICK_BREAK, MOVE_ICE_BEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .evs = { 124, 0, 0, 96, 188, 96},\n        .nature = NATURE_MODEST,\n        .species = SPECIES_EXEGGUTOR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_LEECH_SEED, MOVE_SUBSTITUTE, MOVE_SLEEP_POWDER, MOVE_PSYCHIC},\n    },\n    {\n        .iv = 255,\n        .lvl = 73,\n        .evs = { 216, 16, 0, 188, 0, 88},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_DRAGON_DANCE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_REST},\n    },\n    {\n        .iv = 255,\n        .lvl = 75,\n        .evs = { 140, 252, 0, 116, 0, 0},\n        .nature = NATURE_LONELY,\n        .species = SPECIES_CHARIZARD,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SWORDS_DANCE, MOVE_AERIAL_ACE, MOVE_OVERHEAT, MOVE_EARTHQUAKE},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderBrockRematch[] = {\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_TYRANITAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_DRAGON_DANCE, MOVE_ROCK_SLIDE, MOVE_EARTHQUAKE, MOVE_TAUNT},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_OMASTAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_SPIKES, MOVE_SURF, MOVE_TOXIC, MOVE_ICE_BEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_STEELIX,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_EARTHQUAKE, MOVE_TOXIC, MOVE_ROAR, MOVE_EXPLOSION},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_AERODACTYL,\n        .heldItem = ITEM_LIECHI_BERRY,\n        .abilityNum = 0,\n        .moves = {MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_AERIAL_ACE},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_RHYDON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_EARTHQUAKE, MOVE_MEGAHORN, MOVE_ROCK_BLAST, MOVE_SUBSTITUTE},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_GOLEM,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_REST, MOVE_SLEEP_TALK},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMovesEVs sParty_LeaderBrockRematchChallenge[] = {\n    {\n        .iv = 5, //bug 31/31/31/30/31/30\n        .lvl = 63,\n        .evs = { 248, 80, 0, 180, 0, 0},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_TYRANITAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_DRAGON_DANCE, MOVE_ROCK_SLIDE, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .evs = { 252, 0, 252, 4, 0, 0},\n        .nature = NATURE_BOLD,\n        .species = SPECIES_OMASTAR,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_SPIKES, MOVE_SURF, MOVE_PROTECT, MOVE_ICE_BEAM},\n    },\n    {\n        .iv = 6, //rock\n        .lvl = 64,\n        .evs = { 252, 36, 0, 0, 0, 220},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_STEELIX,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_EARTHQUAKE, MOVE_TOXIC, MOVE_HIDDEN_POWER, MOVE_REST},\n    },\n    {\n        .iv = 3, //flying\n        .lvl = 63,\n        .evs = { 4, 252, 0, 252, 0, 0},\n        .nature = NATURE_JOLLY,\n        .species = SPECIES_AERODACTYL,\n        .heldItem = ITEM_CHOICE_BAND,\n        .abilityNum = 0,\n        .moves = {MOVE_ROCK_SLIDE, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .evs = { 212, 122, 0, 0, 0, 176},\n        .nature = NATURE_ADAMANT,\n        .species = SPECIES_RHYDON,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_EARTHQUAKE, MOVE_MEGAHORN, MOVE_ROCK_SLIDE, MOVE_SUBSTITUTE},\n    },\n    {\n        .iv = 6, //rock\n        .lvl = 66,\n        .evs = { 252, 240, 16, 0, 0, 0},\n        .nature = NATURE_IMPISH,\n        .species = SPECIES_GOLEM,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_EARTHQUAKE, MOVE_HIDDEN_POWER, MOVE_REST, MOVE_SLEEP_TALK},\n    },\n};\n\nstatic const struct TrainerMonItemCustomMoves sParty_LeaderMistyRematch[] = {\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_CLOYSTER,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_SPIKES, MOVE_SURF, MOVE_TOXIC, MOVE_ICE_BEAM},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_LANTURN,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_THUNDERBOLT, MOVE_SURF, MOVE_REST, MOVE_SLEEP_TALK},\n    },\n    {\n        .iv = 255,\n        .lvl = 64,\n        .species = SPECIES_AZUMARILL,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_SUBSTITUTE, MOVE_FOCUS_PUNCH, MOVE_SING, MOVE_ATTRACT},\n    },\n    {\n        .iv = 255,\n        .lvl = 63,\n        .species = SPECIES_QUAGSIRE,\n        .heldItem = ITEM_CHESTO_BERRY,\n        .abilityNum = 1,\n        .moves = {MOVE_CURSE, MOVE_EARTHQUAKE, MOVE_SURF, MOVE_REST},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_GYARADOS,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 0,\n        .moves = {MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HYPER_BEAM, MOVE_THUNDER_WAVE},\n    },\n    {\n        .iv = 255,\n        .lvl = 66,\n        .species = SPECIES_STARMIE,\n        .heldItem = ITEM_LEFTOVERS,\n        .abilityNum = 1,\n        .moves = {MOVE_HYDRO_PUMP, MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_PSYCHIC},\n    },\n};\n"
  },
  {
    "path": "src/data/trainers.h",
    "content": "const struct Trainer gTrainers[] = {\n    [TRAINER_NONE] = {\n        .trainerName = _(\"\"),\n    },\n    [TRAINER_LT_SURGE_REMATCH] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_LT_SURGE,\n        .trainerName = _(\"LT. SURGE\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderLtSurgeRematch),\n    },\n    [TRAINER_LT_SURGE_REMATCH_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_LT_SURGE,\n        .trainerName = _(\"LT. SURGE\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_LeaderLtSurgeRematchChallenge),\n    },\n    [TRAINER_ERIKA_REMATCH] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_ERIKA,\n        .trainerName = _(\"ERIKA\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderErikaRematch),\n    },\n    [TRAINER_ERIKA_REMATCH_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_ERIKA,\n        .trainerName = _(\"ERIKA\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_LeaderErikaRematchChallenge),\n    },\n    [TRAINER_KOGA_REMATCH] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_KOGA,\n        .trainerName = _(\"KOGA\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderKogaRematch),\n    },\n    [TRAINER_KOGA_REMATCH_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_KOGA,\n        .trainerName = _(\"KOGA\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_LeaderKogaRematchChallenge),\n    },\n    [TRAINER_SABRINA_REMATCH] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_SABRINA,\n        .trainerName = _(\"SABRINA\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderSabrinaRematch),\n    },\n    [TRAINER_SABRINA_REMATCH_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_SABRINA,\n        .trainerName = _(\"SABRINA\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_LeaderSabrinaRematchChallenge),\n    },\n    [TRAINER_BLAINE_REMATCH] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_BLAINE,\n        .trainerName = _(\"BLAINE\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderBlaineRematch),\n    },\n    [TRAINER_BLAINE_REMATCH_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_BLAINE,\n        .trainerName = _(\"BLAINE\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_LeaderBlaineRematchChallenge),\n    },\n    [TRAINER_PKMN_RANGER_HELENA] = {\n        .trainerClass = TRAINER_CLASS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,\n        .trainerName = _(\"HELENA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnRangerHelena),\n    },\n    [TRAINER_PKMN_RANGER_HELENA_2] = {\n        .trainerClass = TRAINER_CLASS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,\n        .trainerName = _(\"HELENA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnRangerHelena2),\n    },\n    [TRAINER_COOLTRAINER_ATTICUS] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"ATTICUS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CooltrainerAtticus),\n    },\n    [TRAINER_COOLTRAINER_ATTICUS_2] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"ATTICUS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CooltrainerAtticus2),\n    },\n    [TRAINER_FISHERMAN_DEFOREST] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"DEFOREST\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanDeforest),\n    },\n    [TRAINER_FISHERMAN_DEFOREST_2] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"DEFOREST\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanDeforest2),\n    },\n    [TRAINER_BIRD_KEEPER_SPEDO] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"SPEDO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperSpedo),\n    },\n    [TRAINER_BIRD_KEEPER_SPEDO_2] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"SPEDO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperSpedo2),\n    },\n    [TRAINER_COOLTRAINER_CASPARA] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_F,\n        .trainerName = _(\"CASPARA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CooltrainerCaspara),\n    },\n    [TRAINER_COOLTRAINER_CASPARA_2] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_F,\n        .trainerName = _(\"CASPARA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerCaspara2),\n    },\n    [TRAINER_SWIMMER_FEMALE_SEDEF] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"SEDEF\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleSedef),\n    },\n    [TRAINER_SWIMMER_FEMALE_SEDEF_2] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"SEDEF\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleSedef2),\n    },\n    [TRAINER_MASTER_OAK] = {\n        .trainerClass = TRAINER_CLASS_PKMN_PROF,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_PROFESSOR_OAK,\n        .trainerName = _(\"OAK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY | AI_SCRIPT_HP_AWARE,\n        .party = CUSTOM_MOVES_EVS(sParty_MasterOak),\n    },\n    [TRAINER_MISTY_REMATCH_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_MISTY,\n        .trainerName = _(\"MISTY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_LeaderMistyRematchChallenge),\n    },\n    [TRAINER_ELITE_FOUR_SIDNEY] = {\n        .trainerClass = TRAINER_CLASS_RS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_SIDNEY,\n        .trainerName = _(\"SIDNEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_EliteFourSidney),\n    },\n    [TRAINER_ELITE_FOUR_PHOEBE] = {\n        .trainerClass = TRAINER_CLASS_RS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_PHOEBE,\n        .trainerName = _(\"PHOEBE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_EliteFourPhoebe),\n    },\n    [TRAINER_LEADER_ROXANNE] = {\n        .trainerClass = TRAINER_CLASS_RS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_ROXANNE,\n        .trainerName = _(\"ROXANNE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderRoxanne),\n    },\n    [TRAINER_LEADER_BRAWLY] = {\n        .trainerClass = TRAINER_CLASS_RS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_BRAWLY,\n        .trainerName = _(\"BRAWLY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderBrawly),\n    },\n    [TRAINER_LEADER_TATE_LIZA] = {\n        .trainerClass = TRAINER_CLASS_RS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA,\n        .trainerName = _(\"TATE&LIZA\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderTateLiza),\n    },\n    [TRAINER_SCHOOL_KID_M] = {\n        .trainerClass = TRAINER_CLASS_SCHOOL_KID,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_SCHOOL_KID_M,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SchoolKidM),\n    },\n    [TRAINER_SCHOOL_KID_F] = {\n        .trainerClass = TRAINER_CLASS_SCHOOL_KID,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_SCHOOL_KID_F,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SchoolKidF),\n    },\n    [TRAINER_SR_AND_JR] = {\n        .trainerClass = TRAINER_CLASS_SR_AND_JR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,\n        .trainerPic = TRAINER_PIC_SR_AND_JR,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SrAndJr),\n    },\n    [TRAINER_POKEFAN_M] = {\n        .trainerClass = TRAINER_CLASS_POKEFAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,\n        .trainerPic = TRAINER_PIC_POKEFAN_M,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokefanM),\n    },\n    [TRAINER_POKEFAN_F] = {\n        .trainerClass = TRAINER_CLASS_POKEFAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,\n        .trainerPic = TRAINER_PIC_POKEFAN_F,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokefanF),\n    },\n    [TRAINER_EXPERT_M] = {\n        .trainerClass = TRAINER_CLASS_EXPERT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_EXPERT_M,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ExpertM),\n    },\n    [TRAINER_EXPERT_F] = {\n        .trainerClass = TRAINER_CLASS_EXPERT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_EXPERT_F,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ExpertF),\n    },\n    [TRAINER_RS_YOUNGSTER] = {\n        .trainerClass = TRAINER_CLASS_RS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RS_YOUNGSTER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSYoungster),\n    },\n    [TRAINER_RS_CHAMPION] = {\n        .trainerClass = TRAINER_CLASS_RS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_STEVEN,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSChampion),\n    },\n    [TRAINER_RS_FISHERMAN] = {\n        .trainerClass = TRAINER_CLASS_RS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_RS_FISHERMAN,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSFisherman),\n    },\n    [TRAINER_CYCLING_TRIATHLETE_M] = {\n        .trainerClass = TRAINER_CLASS_TRIATHLETE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CyclingTriathleteM),\n    },\n    [TRAINER_CYCLING_TRIATHLETE_F] = {\n        .trainerClass = TRAINER_CLASS_TRIATHLETE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CyclingTriathleteF),\n    },\n    [TRAINER_RUNNING_TRIATHLETE_M] = {\n        .trainerClass = TRAINER_CLASS_TRIATHLETE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RunningTriathleteM),\n    },\n    [TRAINER_RUNNING_TRIATHLETE_F] = {\n        .trainerClass = TRAINER_CLASS_TRIATHLETE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RunningTriathleteF),\n    },\n    [TRAINER_SWIMMING_TRIATHLETE_M] = {\n        .trainerClass = TRAINER_CLASS_TRIATHLETE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmingTriathleteM),\n    },\n    [TRAINER_SWIMMING_TRIATHLETE_F] = {\n        .trainerClass = TRAINER_CLASS_TRIATHLETE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmingTriathleteF),\n    },\n    [TRAINER_DRAGON_TAMER] = {\n        .trainerClass = TRAINER_CLASS_DRAGON_TAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_DRAGON_TAMER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_DragonTamer),\n    },\n    [TRAINER_RS_BIRD_KEEPER] = {\n        .trainerClass = TRAINER_CLASS_RS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_RS_BIRD_KEEPER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSBirdKeeper),\n    },\n    [TRAINER_NINJA_BOY] = {\n        .trainerClass = TRAINER_CLASS_NINJA_BOY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_NINJA_BOY,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_NinjaBoy),\n    },\n    [TRAINER_BATTLE_GIRL] = {\n        .trainerClass = TRAINER_CLASS_BATTLE_GIRL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BATTLE_GIRL,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BattleGirl),\n    },\n    [TRAINER_PARASOL_LADY] = {\n        .trainerClass = TRAINER_CLASS_PARASOL_LADY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_PARASOL_LADY,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ParasolLady),\n    },\n    [TRAINER_RS_SWIMMER_F] = {\n        .trainerClass = TRAINER_CLASS_RS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_RS_SWIMMER_F,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSSwimmerF),\n    },\n    [TRAINER_RS_PICNICKER] = {\n        .trainerClass = TRAINER_CLASS_RS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,\n        .trainerPic = TRAINER_PIC_RS_PICNICKER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSPicnicker),\n    },\n    [TRAINER_RS_TWINS] = {\n        .trainerClass = TRAINER_CLASS_RS_TWINS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,\n        .trainerPic = TRAINER_PIC_RS_TWINS,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSTwins),\n    },\n    [TRAINER_RS_SAILOR] = {\n        .trainerClass = TRAINER_CLASS_RS_SAILOR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RS_SAILOR,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSSailor),\n    },\n    [TRAINER_BOARDER_M] = {\n        .trainerClass = TRAINER_CLASS_BOARDER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RS_YOUNGSTER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BoarderM),\n    },\n    [TRAINER_BOARDER_F] = {\n        .trainerClass = TRAINER_CLASS_BOARDER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RS_YOUNGSTER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BoarderF),\n    },\n    [TRAINER_COLLECTOR] = {\n        .trainerClass = TRAINER_CLASS_COLLECTOR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_COLLECTOR,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Collector),\n    },\n    [TRAINER_WALLY] = {\n        .trainerClass = TRAINER_CLASS_PKMN_TRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_WALLY,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Wally),\n    },\n    [TRAINER_BRENDAN] = {\n        .trainerClass = TRAINER_CLASS_PKMN_TRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RS_BRENDAN_1,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Brendan),\n    },\n    [TRAINER_BRENDAN_2] = {\n        .trainerClass = TRAINER_CLASS_PKMN_TRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RS_BRENDAN_1,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Brendan2),\n    },\n    [TRAINER_BRENDAN_3] = {\n        .trainerClass = TRAINER_CLASS_PKMN_TRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RS_BRENDAN_1,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Brendan3),\n    },\n    [TRAINER_MAY] = {\n        .trainerClass = TRAINER_CLASS_PKMN_TRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_RS_MAY_1,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_May),\n    },\n    [TRAINER_MAY_2] = {\n        .trainerClass = TRAINER_CLASS_PKMN_TRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_RS_MAY_1,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_May2),\n    },\n    [TRAINER_MAY_3] = {\n        .trainerClass = TRAINER_CLASS_PKMN_TRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_RS_MAY_1,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_May3),\n    },\n    [TRAINER_RS_PKMN_BREEDER_M] = {\n        .trainerClass = TRAINER_CLASS_RS_PKMN_BREEDER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RS_POKEMON_BREEDER_M,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSPkmnBreederM),\n    },\n    [TRAINER_RS_PKMN_BREEDER_F] = {\n        .trainerClass = TRAINER_CLASS_RS_PKMN_BREEDER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_RS_POKEMON_BREEDER_F,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSPkmnBreederF),\n    },\n    [TRAINER_RS_PKMN_RANGER_M] = {\n        .trainerClass = TRAINER_CLASS_RS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_RS_POKEMON_RANGER_M,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSPkmnRangerM),\n    },\n    [TRAINER_RS_PKMN_RANGER_F] = {\n        .trainerClass = TRAINER_CLASS_RS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_RS_POKEMON_RANGER_F,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSPkmnRangerF),\n    },\n    [TRAINER_MAGMA_LEADER] = {\n        .trainerClass = TRAINER_CLASS_MAGMA_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,\n        .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_MagmaLeader),\n    },\n    [TRAINER_MAGMA_GRUNT_M] = {\n        .trainerClass = TRAINER_CLASS_TEAM_MAGMA,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,\n        .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_MagmaGruntM),\n    },\n    [TRAINER_MAMGA_GRUNT_F] = {\n        .trainerClass = TRAINER_CLASS_TEAM_MAGMA,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,\n        .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_MagmaGruntF),\n    },\n    [TRAINER_RS_LASS] = {\n        .trainerClass = TRAINER_CLASS_RS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_RS_LASS,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSLass),\n    },\n    [TRAINER_RS_BUG_CATCHER] = {\n        .trainerClass = TRAINER_CLASS_RS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RS_BUG_CATCHER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSBugCatcher),\n    },\n    [TRAINER_RS_HIKER] = {\n        .trainerClass = TRAINER_CLASS_RS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_RS_HIKER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSHiker),\n    },\n    [TRAINER_RS_YOUNG_COUPLE] = {\n        .trainerClass = TRAINER_CLASS_RS_YOUNG_COUPLE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,\n        .trainerPic = TRAINER_PIC_RS_YOUNG_COUPLE,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSYoungCouple),\n    },\n    [TRAINER_OLD_COUPLE] = {\n        .trainerClass = TRAINER_CLASS_OLD_COUPLE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_OLD_COUPLE,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_OldCouple),\n    },\n    [TRAINER_RS_SIS_AND_BRO] = {\n        .trainerClass = TRAINER_CLASS_RS_SIS_AND_BRO,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_RS_SIS_AND_BRO,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RSSisAndBro),\n    },\n    [TRAINER_AQUA_ADMIN_MATT] = {\n        .trainerClass = TRAINER_CLASS_AQUA_ADMIN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_AQUA_ADMIN_M,\n        .trainerName = _(\"MATT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_AquaAdminMatt),\n    },\n    [TRAINER_AQUA_ADMIN_SHELLY] = {\n        .trainerClass = TRAINER_CLASS_AQUA_ADMIN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_AQUA_ADMIN_F,\n        .trainerName = _(\"SHELLY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_AquaAdminShelly),\n    },\n    [TRAINER_MAGMA_ADMIN_TABITHA] = {\n        .trainerClass = TRAINER_CLASS_MAGMA_ADMIN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,\n        .trainerPic = TRAINER_PIC_MAGMA_ADMIN_M,\n        .trainerName = _(\"TABITHA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_MagmaAdminTabitha),\n    },\n    [TRAINER_MAGMA_ADMIN_COURTNEY] = {\n        .trainerClass = TRAINER_CLASS_MAGMA_ADMIN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,\n        .trainerPic = TRAINER_PIC_MAGMA_ADMIN_F,\n        .trainerName = _(\"COURTNEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_MagmaAdminCourtney),\n    },\n    [TRAINER_LEADER_WATTSON] = {\n        .trainerClass = TRAINER_CLASS_RS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_WATTSON,\n        .trainerName = _(\"WATTSON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderWattson),\n    },\n    [TRAINER_LEADER_FLANNERY] = {\n        .trainerClass = TRAINER_CLASS_RS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_FLANNERY,\n        .trainerName = _(\"FLANNERY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderFlannery),\n    },\n    [TRAINER_LEADER_NORMAN] = {\n        .trainerClass = TRAINER_CLASS_RS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_NORMAN,\n        .trainerName = _(\"NORMAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderNorman),\n    },\n    [TRAINER_LEADER_WINONA] = {\n        .trainerClass = TRAINER_CLASS_RS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_WINONA,\n        .trainerName = _(\"WINONA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderWinona),\n    },\n    [TRAINER_LEADER_WALLACE] = {\n        .trainerClass = TRAINER_CLASS_RS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_WALLACE,\n        .trainerName = _(\"WALLACE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LeaderWallace),\n    },\n    [TRAINER_ELITE_FOUR_GLACIA] = {\n        .trainerClass = TRAINER_CLASS_RS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_GLACIA,\n        .trainerName = _(\"GLACIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_EliteFourGlacia),\n    },\n    [TRAINER_ELITE_FOUR_DRAKE] = {\n        .trainerClass = TRAINER_CLASS_RS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_DRAKE,\n        .trainerName = _(\"DRAKE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_EliteFourDrake),\n    },\n    [TRAINER_YOUNGSTER_BEN] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"BEN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterBen),\n    },\n    [TRAINER_YOUNGSTER_CALVIN] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"CALVIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterCalvin),\n    },\n    [TRAINER_YOUNGSTER_JOSH] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"JOSH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterJosh),\n    },\n    [TRAINER_YOUNGSTER_TIMMY] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"TIMMY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterTimmy),\n    },\n    [TRAINER_YOUNGSTER_JOEY] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"JOEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterJoey),\n    },\n    [TRAINER_YOUNGSTER_DAN] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"DAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterDan),\n    },\n    [TRAINER_YOUNGSTER_CHAD] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"CHAD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterChad),\n    },\n    [TRAINER_YOUNGSTER_TYLER] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"TYLER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterTyler),\n    },\n    [TRAINER_YOUNGSTER_EDDIE] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"EDDIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterEddie),\n    },\n    [TRAINER_YOUNGSTER_DILLON] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"DILLON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterDillon),\n    },\n    [TRAINER_YOUNGSTER_YASU] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"YASU\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterYasu),\n    },\n    [TRAINER_YOUNGSTER_DAVE] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"DAVE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterDave),\n    },\n    [TRAINER_YOUNGSTER_BEN_2] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"BEN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterBen2),\n    },\n    [TRAINER_BUG_CATCHER_RICK] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"RICK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherRick),\n    },\n    [TRAINER_BUG_CATCHER_DOUG] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"DOUG\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherDoug),\n    },\n    [TRAINER_BUG_CATCHER_SAMMY] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"SAMMY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherSammy),\n    },\n    [TRAINER_BUG_CATCHER_COLTON] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"COLTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherColton),\n    },\n    [TRAINER_BUG_CATCHER_GREG] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"GREG\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherGreg),\n    },\n    [TRAINER_BUG_CATCHER_JAMES] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"JAMES\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherJames),\n    },\n    [TRAINER_BUG_CATCHER_KENT] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"KENT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherKent),\n    },\n    [TRAINER_BUG_CATCHER_ROBBY] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"ROBBY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherRobby),\n    },\n    [TRAINER_BUG_CATCHER_CALE] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"CALE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherCale),\n    },\n    [TRAINER_BUG_CATCHER_KEIGO] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"KEIGO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherKeigo),\n    },\n    [TRAINER_BUG_CATCHER_ELIJAH] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"ELIJAH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherElijah),\n    },\n    [TRAINER_BUG_CATCHER_2] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher2),\n    },\n    [TRAINER_BUG_CATCHER_BRENT] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"BRENT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherBrent),\n    },\n    [TRAINER_BUG_CATCHER_CONNER] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"CONNER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherConner),\n    },\n    [TRAINER_LASS_JANICE] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"JANICE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassJanice),\n    },\n    [TRAINER_LASS_SALLY] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"SALLY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassSally),\n    },\n    [TRAINER_LASS_ROBIN] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"ROBIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassRobin),\n    },\n    [TRAINER_LASS_CRISSY] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"CRISSY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassCrissy),\n    },\n    [TRAINER_LASS_MIRIAM] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"MIRIAM\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassMiriam),\n    },\n    [TRAINER_LASS_IRIS] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"IRIS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassIris),\n    },\n    [TRAINER_LASS_RELI] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"RELI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassReli),\n    },\n    [TRAINER_LASS_ALI] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"ALI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassAli),\n    },\n    [TRAINER_LASS_2] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Lass2),\n    },\n    [TRAINER_LASS_HALEY] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"HALEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassHaley),\n    },\n    [TRAINER_LASS_ANN] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"ANN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassAnn),\n    },\n    [TRAINER_LASS_DAWN] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"DAWN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassDawn),\n    },\n    [TRAINER_LASS_PAIGE] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"PAIGE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassPaige),\n    },\n    [TRAINER_LASS_ANDREA] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"ANDREA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassAndrea),\n    },\n    [TRAINER_LASS_MEGAN] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"MEGAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassMegan),\n    },\n    [TRAINER_LASS_JULIA] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"JULIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassJulia),\n    },\n    [TRAINER_LASS_KAY] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"KAY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassKay),\n    },\n    [TRAINER_LASS_LISA] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"LISA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassLisa),\n    },\n    [TRAINER_SAILOR_EDMOND] = {\n        .trainerClass = TRAINER_CLASS_SAILOR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_SAILOR,\n        .trainerName = _(\"EDMOND\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorEdmond),\n    },\n    [TRAINER_SAILOR_TREVOR] = {\n        .trainerClass = TRAINER_CLASS_SAILOR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_SAILOR,\n        .trainerName = _(\"TREVOR\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorTrevor),\n    },\n    [TRAINER_SAILOR_LEONARD] = {\n        .trainerClass = TRAINER_CLASS_SAILOR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_SAILOR,\n        .trainerName = _(\"LEONARD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorLeonard),\n    },\n    [TRAINER_SAILOR_DUNCAN] = {\n        .trainerClass = TRAINER_CLASS_SAILOR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_SAILOR,\n        .trainerName = _(\"DUNCAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorDuncan),\n    },\n    [TRAINER_SAILOR_HUEY] = {\n        .trainerClass = TRAINER_CLASS_SAILOR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_SAILOR,\n        .trainerName = _(\"HUEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorHuey),\n    },\n    [TRAINER_SAILOR_DYLAN] = {\n        .trainerClass = TRAINER_CLASS_SAILOR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_SAILOR,\n        .trainerName = _(\"DYLAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorDylan),\n    },\n    [TRAINER_SAILOR_PHILLIP] = {\n        .trainerClass = TRAINER_CLASS_SAILOR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_SAILOR,\n        .trainerName = _(\"PHILLIP\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorPhillip),\n    },\n    [TRAINER_SAILOR_DWAYNE] = {\n        .trainerClass = TRAINER_CLASS_SAILOR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_SAILOR,\n        .trainerName = _(\"DWAYNE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SailorDwayne),\n    },\n    [TRAINER_CAMPER_LIAM] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"LIAM\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CamperLiam),\n    },\n    [TRAINER_CAMPER_SHANE] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"SHANE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperShane),\n    },\n    [TRAINER_CAMPER_ETHAN] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"ETHAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperEthan),\n    },\n    [TRAINER_CAMPER_RICKY] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"RICKY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperRicky),\n    },\n    [TRAINER_CAMPER_JEFF] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"JEFF\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperJeff),\n    },\n    [TRAINER_CAMPER_2] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Camper2),\n    },\n    [TRAINER_CAMPER_CHRIS] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"CHRIS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperChris),\n    },\n    [TRAINER_CAMPER_DREW] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"DREW\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperDrew),\n    },\n    [TRAINER_PICNICKER_DIANA] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"DIANA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerDiana),\n    },\n    [TRAINER_PICNICKER_NANCY] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"NANCY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerNancy),\n    },\n    [TRAINER_PICNICKER_ISABELLE] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"ISABELLE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerIsabelle),\n    },\n    [TRAINER_PICNICKER_KELSEY] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"KELSEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerKelsey),\n    },\n    [TRAINER_PICNICKER_ALICIA] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"ALICIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerAlicia),\n    },\n    [TRAINER_PICNICKER_CAITLIN] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"CAITLIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerCaitlin),\n    },\n    [TRAINER_PICNICKER_HEIDI] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"HEIDI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerHeidi),\n    },\n    [TRAINER_PICNICKER_CAROL] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"CAROL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerCarol),\n    },\n    [TRAINER_PICNICKER_SOFIA] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"SOFIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerSofia),\n    },\n    [TRAINER_PICNICKER_MARTHA] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"MARTHA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerMartha),\n    },\n    [TRAINER_PICNICKER_TINA] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"TINA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerTina),\n    },\n    [TRAINER_PICNICKER_HANNAH] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"HANNAH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerHannah),\n    },\n    [TRAINER_POKEMANIAC_MARK] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"MARK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacMark),\n    },\n    [TRAINER_POKEMANIAC_HERMAN] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"HERMAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacHerman),\n    },\n    [TRAINER_POKEMANIAC_COOPER] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"COOPER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacCooper),\n    },\n    [TRAINER_POKEMANIAC_STEVE] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"STEVE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacSteve),\n    },\n    [TRAINER_POKEMANIAC_WINSTON] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"WINSTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacWinston),\n    },\n    [TRAINER_POKEMANIAC_DAWSON] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"DAWSON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacDawson),\n    },\n    [TRAINER_POKEMANIAC_ASHTON] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"ASHTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacAshton),\n    },\n    [TRAINER_SUPER_NERD_JOVAN] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"JOVAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdJovan),\n    },\n    [TRAINER_SUPER_NERD_MIGUEL] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"MIGUEL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdMiguel),\n    },\n    [TRAINER_SUPER_NERD_AIDAN] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"AIDAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_SuperNerdAidan),\n    },\n    [TRAINER_SUPER_NERD_GLENN] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"GLENN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdGlenn),\n    },\n    [TRAINER_SUPER_NERD_LESLIE] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"LESLIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_SuperNerdLeslie),\n    },\n    [TRAINER_SUPER_NERD_1] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerd1),\n    },\n    [TRAINER_SUPER_NERD_2] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerd2),\n    },\n    [TRAINER_SUPER_NERD_3] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerd3),\n    },\n    [TRAINER_SUPER_NERD_ERIK] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"ERIK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdErik),\n    },\n    [TRAINER_SUPER_NERD_AVERY] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"AVERY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdAvery),\n    },\n    [TRAINER_SUPER_NERD_DEREK] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"DEREK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdDerek),\n    },\n    [TRAINER_SUPER_NERD_ZAC] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"ZAC\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdZac),\n    },\n    [TRAINER_HIKER_MARCOS] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"MARCOS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerMarcos),\n    },\n    [TRAINER_HIKER_FRANKLIN] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"FRANKLIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerFranklin),\n    },\n    [TRAINER_HIKER_NOB] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"NOB\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerNob),\n    },\n    [TRAINER_HIKER_WAYNE] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"WAYNE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerWayne),\n    },\n    [TRAINER_HIKER_ALAN] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"ALAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_HikerAlan),\n    },\n    [TRAINER_HIKER_BRICE] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"BRICE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerBrice),\n    },\n    [TRAINER_HIKER_CLARK] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"CLARK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_HikerClark),\n    },\n    [TRAINER_HIKER_TRENT] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"TRENT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerTrent),\n    },\n    [TRAINER_HIKER_DUDLEY] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"DUDLEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_HikerDudley),\n    },\n    [TRAINER_HIKER_ALLEN] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"ALLEN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_HikerAllen),\n    },\n    [TRAINER_HIKER_ERIC] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"ERIC\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerEric),\n    },\n    [TRAINER_HIKER_LENNY] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"LENNY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerLenny),\n    },\n    [TRAINER_HIKER_OLIVER] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"OLIVER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerOliver),\n    },\n    [TRAINER_HIKER_LUCAS] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"LUCAS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_HikerLucas),\n    },\n    [TRAINER_BIKER_JARED] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"JARED\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerJared),\n    },\n    [TRAINER_BIKER_MALIK] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"MALIK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerMalik),\n    },\n    [TRAINER_BIKER_ERNEST] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"ERNEST\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerErnest),\n    },\n    [TRAINER_BIKER_ALEX] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"ALEX\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerAlex),\n    },\n    [TRAINER_BIKER_LAO] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"LAO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerLao),\n    },\n    [TRAINER_BIKER_1] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Biker1),\n    },\n    [TRAINER_BIKER_HIDEO] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"HIDEO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerHideo),\n    },\n    [TRAINER_BIKER_RUBEN] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"RUBEN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerRuben),\n    },\n    [TRAINER_BIKER_BILLY] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"BILLY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerBilly),\n    },\n    [TRAINER_BIKER_NIKOLAS] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"NIKOLAS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerNikolas),\n    },\n    [TRAINER_BIKER_JAXON] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"JAXON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerJaxon),\n    },\n    [TRAINER_BIKER_WILLIAM] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"WILLIAM\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerWilliam),\n    },\n    [TRAINER_BIKER_LUKAS] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"LUKAS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerLukas),\n    },\n    [TRAINER_BIKER_ISAAC] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"ISAAC\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerIsaac),\n    },\n    [TRAINER_BIKER_GERALD] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"GERALD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerGerald),\n    },\n    [TRAINER_BURGLAR_1] = {\n        .trainerClass = TRAINER_CLASS_BURGLAR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_BURGLAR,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Burglar1),\n    },\n    [TRAINER_BURGLAR_2] = {\n        .trainerClass = TRAINER_CLASS_BURGLAR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_BURGLAR,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Burglar2),\n    },\n    [TRAINER_BURGLAR_3] = {\n        .trainerClass = TRAINER_CLASS_BURGLAR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_BURGLAR,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Burglar3),\n    },\n    [TRAINER_BURGLAR_QUINN] = {\n        .trainerClass = TRAINER_CLASS_BURGLAR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_BURGLAR,\n        .trainerName = _(\"QUINN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BurglarQuinn),\n    },\n    [TRAINER_BURGLAR_RAMON] = {\n        .trainerClass = TRAINER_CLASS_BURGLAR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_BURGLAR,\n        .trainerName = _(\"RAMON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BurglarRamon),\n    },\n    [TRAINER_BURGLAR_DUSTY] = {\n        .trainerClass = TRAINER_CLASS_BURGLAR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_BURGLAR,\n        .trainerName = _(\"DUSTY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BurglarDusty),\n    },\n    [TRAINER_BURGLAR_ARNIE] = {\n        .trainerClass = TRAINER_CLASS_BURGLAR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_BURGLAR,\n        .trainerName = _(\"ARNIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BurglarArnie),\n    },\n    [TRAINER_BURGLAR_4] = {\n        .trainerClass = TRAINER_CLASS_BURGLAR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_BURGLAR,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Burglar4),\n    },\n    [TRAINER_BURGLAR_SIMON] = {\n        .trainerClass = TRAINER_CLASS_BURGLAR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_BURGLAR,\n        .trainerName = _(\"SIMON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BurglarSimon),\n    },\n    [TRAINER_BURGLAR_LEWIS] = {\n        .trainerClass = TRAINER_CLASS_BURGLAR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_BURGLAR,\n        .trainerName = _(\"LEWIS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BurglarLewis),\n    },\n    [TRAINER_ENGINEER_BAILY] = {\n        .trainerClass = TRAINER_CLASS_ENGINEER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_ENGINEER,\n        .trainerName = _(\"BAILY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_EngineerBaily),\n    },\n    [TRAINER_ENGINEER_BRAXTON] = {\n        .trainerClass = TRAINER_CLASS_ENGINEER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_ENGINEER,\n        .trainerName = _(\"BRAXTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_EngineerBraxton),\n    },\n    [TRAINER_ENGINEER_BERNIE] = {\n        .trainerClass = TRAINER_CLASS_ENGINEER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_ENGINEER,\n        .trainerName = _(\"BERNIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_EngineerBernie),\n    },\n    [TRAINER_FISHERMAN_DALE] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"DALE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanDale),\n    },\n    [TRAINER_FISHERMAN_BARNY] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"BARNY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanBarny),\n    },\n    [TRAINER_FISHERMAN_NED] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"NED\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanNed),\n    },\n    [TRAINER_FISHERMAN_CHIP] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"CHIP\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanChip),\n    },\n    [TRAINER_FISHERMAN_HANK] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"HANK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanHank),\n    },\n    [TRAINER_FISHERMAN_ELLIOT] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"ELLIOT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanElliot),\n    },\n    [TRAINER_FISHERMAN_RONALD] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"RONALD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanRonald),\n    },\n    [TRAINER_FISHERMAN_CLAUDE] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"CLAUDE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanClaude),\n    },\n    [TRAINER_FISHERMAN_WADE] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"WADE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanWade),\n    },\n    [TRAINER_FISHERMAN_NOLAN] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"NOLAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanNolan),\n    },\n    [TRAINER_FISHERMAN_ANDREW] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"ANDREW\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanAndrew),\n    },\n    [TRAINER_SWIMMER_MALE_LUIS] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"LUIS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleLuis),\n    },\n    [TRAINER_SWIMMER_MALE_RICHARD] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"RICHARD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleRichard),\n    },\n    [TRAINER_SWIMMER_MALE_REECE] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"REECE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleReece),\n    },\n    [TRAINER_SWIMMER_MALE_MATTHEW] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"MATTHEW\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleMatthew),\n    },\n    [TRAINER_SWIMMER_MALE_DOUGLAS] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"DOUGLAS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleDouglas),\n    },\n    [TRAINER_SWIMMER_MALE_DAVID] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"DAVID\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleDavid),\n    },\n    [TRAINER_SWIMMER_MALE_TONY] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"TONY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleTony),\n    },\n    [TRAINER_SWIMMER_MALE_AXLE] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"AXLE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleAxle),\n    },\n    [TRAINER_SWIMMER_MALE_BARRY] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"BARRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleBarry),\n    },\n    [TRAINER_SWIMMER_MALE_DEAN] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"DEAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleDean),\n    },\n    [TRAINER_SWIMMER_MALE_DARRIN] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"DARRIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleDarrin),\n    },\n    [TRAINER_SWIMMER_MALE_SPENCER] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"SPENCER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleSpencer),\n    },\n    [TRAINER_SWIMMER_MALE_JACK] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"JACK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleJack),\n    },\n    [TRAINER_SWIMMER_MALE_JEROME] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"JEROME\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleJerome),\n    },\n    [TRAINER_SWIMMER_MALE_ROLAND] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"ROLAND\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleRoland),\n    },\n    [TRAINER_CUE_BALL_KOJI] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"KOJI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallKoji),\n    },\n    [TRAINER_CUE_BALL_LUKE] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"LUKE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallLuke),\n    },\n    [TRAINER_CUE_BALL_CAMRON] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"CAMRON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallCamron),\n    },\n    [TRAINER_CUE_BALL_RAUL] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"RAUL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallRaul),\n    },\n    [TRAINER_CUE_BALL_ISAIAH] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"ISAIAH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallIsaiah),\n    },\n    [TRAINER_CUE_BALL_ZEEK] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"ZEEK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallZeek),\n    },\n    [TRAINER_CUE_BALL_JAMAL] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"JAMAL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallJamal),\n    },\n    [TRAINER_CUE_BALL_COREY] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"COREY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallCorey),\n    },\n    [TRAINER_CUE_BALL_CHASE] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"CHASE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallChase),\n    },\n    [TRAINER_GAMER_HUGO] = {\n        .trainerClass = TRAINER_CLASS_GAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_GAMER,\n        .trainerName = _(\"HUGO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerHugo),\n    },\n    [TRAINER_GAMER_JASPER] = {\n        .trainerClass = TRAINER_CLASS_GAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_GAMER,\n        .trainerName = _(\"JASPER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerJasper),\n    },\n    [TRAINER_GAMER_DIRK] = {\n        .trainerClass = TRAINER_CLASS_GAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_GAMER,\n        .trainerName = _(\"DIRK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerDirk),\n    },\n    [TRAINER_GAMER_DARIAN] = {\n        .trainerClass = TRAINER_CLASS_GAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_GAMER,\n        .trainerName = _(\"DARIAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerDarian),\n    },\n    [TRAINER_GAMER_STAN] = {\n        .trainerClass = TRAINER_CLASS_GAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_GAMER,\n        .trainerName = _(\"STAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerStan),\n    },\n    [TRAINER_GAMER_1] = {\n        .trainerClass = TRAINER_CLASS_GAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_GAMER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Gamer1),\n    },\n    [TRAINER_GAMER_RICH] = {\n        .trainerClass = TRAINER_CLASS_GAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_GAMER,\n        .trainerName = _(\"RICH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerRich),\n    },\n    [TRAINER_BEAUTY_BRIDGET] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_BEAUTY,\n        .trainerName = _(\"BRIDGET\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyBridget),\n    },\n    [TRAINER_BEAUTY_TAMIA] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_BEAUTY,\n        .trainerName = _(\"TAMIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyTamia),\n    },\n    [TRAINER_BEAUTY_LORI] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_BEAUTY,\n        .trainerName = _(\"LORI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyLori),\n    },\n    [TRAINER_BEAUTY_LOLA] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_BEAUTY,\n        .trainerName = _(\"LOLA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyLola),\n    },\n    [TRAINER_BEAUTY_SHEILA] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_BEAUTY,\n        .trainerName = _(\"SHEILA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautySheila),\n    },\n    [TRAINER_SWIMMER_FEMALE_TIFFANY] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"TIFFANY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleTiffany),\n    },\n    [TRAINER_SWIMMER_FEMALE_NORA] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"NORA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleNora),\n    },\n    [TRAINER_SWIMMER_FEMALE_MELISSA] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"MELISSA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleMelissa),\n    },\n    [TRAINER_BEAUTY_GRACE] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_BEAUTY,\n        .trainerName = _(\"GRACE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyGrace),\n    },\n    [TRAINER_BEAUTY_OLIVIA] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_BEAUTY,\n        .trainerName = _(\"OLIVIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyOlivia),\n    },\n    [TRAINER_BEAUTY_LAUREN] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"LAUREN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyLauren),\n    },\n    [TRAINER_SWIMMER_FEMALE_ANYA] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"ANYA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleAnya),\n    },\n    [TRAINER_SWIMMER_FEMALE_ALICE] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"ALICE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleAlice),\n    },\n    [TRAINER_SWIMMER_FEMALE_CONNIE] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"CONNIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleConnie),\n    },\n    [TRAINER_SWIMMER_FEMALE_SHIRLEY] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"SHIRLEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleShirley),\n    },\n    [TRAINER_PSYCHIC_JOHAN] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_PSYCHIC_M,\n        .trainerName = _(\"JOHAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PsychicJohan),\n    },\n    [TRAINER_PSYCHIC_TYRON] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_PSYCHIC_M,\n        .trainerName = _(\"TYRON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PsychicTyron),\n    },\n    [TRAINER_PSYCHIC_CAMERON] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_PSYCHIC_M,\n        .trainerName = _(\"CAMERON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PsychicCameron),\n    },\n    [TRAINER_PSYCHIC_PRESTON] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_PSYCHIC_M,\n        .trainerName = _(\"PRESTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PsychicPreston),\n    },\n    [TRAINER_ROCKER_RANDALL] = {\n        .trainerClass = TRAINER_CLASS_ROCKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_ROCKER,\n        .trainerName = _(\"RANDALL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RockerRandall),\n    },\n    [TRAINER_ROCKER_LUCA] = {\n        .trainerClass = TRAINER_CLASS_ROCKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_ROCKER,\n        .trainerName = _(\"LUCA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RockerLuca),\n    },\n    [TRAINER_JUGGLER_DALTON] = {\n        .trainerClass = TRAINER_CLASS_JUGGLER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_JUGGLER,\n        .trainerName = _(\"DALTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerDalton),\n    },\n    [TRAINER_JUGGLER_NELSON] = {\n        .trainerClass = TRAINER_CLASS_JUGGLER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_JUGGLER,\n        .trainerName = _(\"NELSON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerNelson),\n    },\n    [TRAINER_JUGGLER_KIRK] = {\n        .trainerClass = TRAINER_CLASS_JUGGLER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_JUGGLER,\n        .trainerName = _(\"KIRK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerKirk),\n    },\n    [TRAINER_JUGGLER_SHAWN] = {\n        .trainerClass = TRAINER_CLASS_JUGGLER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_JUGGLER,\n        .trainerName = _(\"SHAWN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerShawn),\n    },\n    [TRAINER_JUGGLER_GREGORY] = {\n        .trainerClass = TRAINER_CLASS_JUGGLER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_JUGGLER,\n        .trainerName = _(\"GREGORY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_JugglerGregory),\n    },\n    [TRAINER_JUGGLER_EDWARD] = {\n        .trainerClass = TRAINER_CLASS_JUGGLER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_JUGGLER,\n        .trainerName = _(\"EDWARD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_JugglerEdward),\n    },\n    [TRAINER_JUGGLER_KAYDEN] = {\n        .trainerClass = TRAINER_CLASS_JUGGLER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_JUGGLER,\n        .trainerName = _(\"KAYDEN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerKayden),\n    },\n    [TRAINER_JUGGLER_NATE] = {\n        .trainerClass = TRAINER_CLASS_JUGGLER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_JUGGLER,\n        .trainerName = _(\"NATE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerNate),\n    },\n    [TRAINER_TAMER_PHIL] = {\n        .trainerClass = TRAINER_CLASS_TAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_TAMER,\n        .trainerName = _(\"PHIL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerPhil),\n    },\n    [TRAINER_TAMER_EDGAR] = {\n        .trainerClass = TRAINER_CLASS_TAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_TAMER,\n        .trainerName = _(\"EDGAR\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerEdgar),\n    },\n    [TRAINER_TAMER_JASON] = {\n        .trainerClass = TRAINER_CLASS_TAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_TAMER,\n        .trainerName = _(\"JASON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerJason),\n    },\n    [TRAINER_TAMER_COLE] = {\n        .trainerClass = TRAINER_CLASS_TAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_TAMER,\n        .trainerName = _(\"COLE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerCole),\n    },\n    [TRAINER_TAMER_VINCENT] = {\n        .trainerClass = TRAINER_CLASS_TAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_TAMER,\n        .trainerName = _(\"VINCENT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerVincent),\n    },\n    [TRAINER_TAMER_JOHN] = {\n        .trainerClass = TRAINER_CLASS_TAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_TAMER,\n        .trainerName = _(\"JOHN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerJohn),\n    },\n    [TRAINER_BIRD_KEEPER_SEBASTIAN] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"SEBASTIAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperSebastian),\n    },\n    [TRAINER_BIRD_KEEPER_PERRY] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"PERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperPerry),\n    },\n    [TRAINER_BIRD_KEEPER_ROBERT] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"ROBERT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperRobert),\n    },\n    [TRAINER_BIRD_KEEPER_DONALD] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"DONALD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperDonald),\n    },\n    [TRAINER_BIRD_KEEPER_BENNY] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"BENNY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperBenny),\n    },\n    [TRAINER_BIRD_KEEPER_EDWIN] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"EDWIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperEdwin),\n    },\n    [TRAINER_BIRD_KEEPER_CHESTER] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"CHESTER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperChester),\n    },\n    [TRAINER_BIRD_KEEPER_WILTON] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"WILTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperWilton),\n    },\n    [TRAINER_BIRD_KEEPER_RAMIRO] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"RAMIRO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperRamiro),\n    },\n    [TRAINER_BIRD_KEEPER_JACOB] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"JACOB\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperJacob),\n    },\n    [TRAINER_BIRD_KEEPER_ROGER] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"ROGER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperRoger),\n    },\n    [TRAINER_BIRD_KEEPER_REED] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"REED\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperReed),\n    },\n    [TRAINER_BIRD_KEEPER_KEITH] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"KEITH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperKeith),\n    },\n    [TRAINER_BIRD_KEEPER_CARTER] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"CARTER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperCarter),\n    },\n    [TRAINER_BIRD_KEEPER_MITCH] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"MITCH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperMitch),\n    },\n    [TRAINER_BIRD_KEEPER_BECK] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"BECK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperBeck),\n    },\n    [TRAINER_BIRD_KEEPER_MARLON] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"MARLON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperMarlon),\n    },\n    [TRAINER_BLACK_BELT_KOICHI] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"KIYO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltKoichi),\n    },\n    [TRAINER_BLACK_BELT_MIKE] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"MIKE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltMike),\n    },\n    [TRAINER_BLACK_BELT_HIDEKI] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"HIDEKI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltHideki),\n    },\n    [TRAINER_BLACK_BELT_AARON] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"AARON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltAaron),\n    },\n    [TRAINER_BLACK_BELT_HITOSHI] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"HITOSHI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltHitoshi),\n    },\n    [TRAINER_BLACK_BELT_ATSUSHI] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"ATSUSHI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltAtsushi),\n    },\n    [TRAINER_BLACK_BELT_KIYO] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"KOICHI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltKiyo),\n    },\n    [TRAINER_BLACK_BELT_TAKASHI] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"TAKASHI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltTakashi),\n    },\n    [TRAINER_BLACK_BELT_DAISUKE] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"DAISUKE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltDaisuke),\n    },\n    [TRAINER_RIVAL_OAKS_LAB_SQUIRTLE] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_EARLY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_EARLY,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalOaksLabSquirtle),\n    },\n    [TRAINER_RIVAL_OAKS_LAB_BULBASAUR] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_EARLY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_EARLY,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalOaksLabBulbasaur),\n    },\n    [TRAINER_RIVAL_OAKS_LAB_CHARMANDER] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_EARLY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_EARLY,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalOaksLabCharmander),\n    },\n    [TRAINER_RIVAL_ROUTE22_EARLY_SQUIRTLE] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_EARLY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_EARLY,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalRoute22EarlySquirtle),\n    },\n    [TRAINER_RIVAL_ROUTE22_EARLY_BULBASAUR] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_EARLY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_EARLY,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalRoute22EarlyBulbasaur),\n    },\n    [TRAINER_RIVAL_ROUTE22_EARLY_CHARMANDER] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_EARLY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_EARLY,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalRoute22EarlyCharmander),\n    },\n    [TRAINER_RIVAL_CERULEAN_SQUIRTLE] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_EARLY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_EARLY,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalCeruleanSquirtle),\n    },\n    [TRAINER_RIVAL_CERULEAN_BULBASAUR] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_EARLY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_EARLY,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalCeruleanBulbasaur),\n    },\n    [TRAINER_RIVAL_CERULEAN_CHARMANDER] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_EARLY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_EARLY,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalCeruleanCharmander),\n    },\n    [TRAINER_SCIENTIST_TED] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"TED\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistTed),\n    },\n    [TRAINER_SCIENTIST_CONNOR] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"CONNOR\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_ScientistConnor),\n    },\n    [TRAINER_SCIENTIST_JERRY] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"JERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistJerry),\n    },\n    [TRAINER_SCIENTIST_JOSE] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"JOSE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_ScientistJose),\n    },\n    [TRAINER_SCIENTIST_RODNEY] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"RODNEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistRodney),\n    },\n    [TRAINER_SCIENTIST_BEAU] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"BEAU\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_ScientistBeau),\n    },\n    [TRAINER_SCIENTIST_TAYLOR] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"TAYLOR\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_ScientistTaylor),\n    },\n    [TRAINER_SCIENTIST_JOSHUA] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"JOSHUA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistJoshua),\n    },\n    [TRAINER_SCIENTIST_PARKER] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"PARKER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistParker),\n    },\n    [TRAINER_SCIENTIST_ED] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"ED\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_ScientistEd),\n    },\n    [TRAINER_SCIENTIST_TRAVIS] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"TRAVIS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistTravis),\n    },\n    [TRAINER_SCIENTIST_BRAYDON] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"BRAYDON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistBraydon),\n    },\n    [TRAINER_SCIENTIST_IVAN] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"IVAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ScientistIvan),\n    },\n    [TRAINER_BOSS_GIOVANNI] = {\n        .trainerClass = TRAINER_CLASS_BOSS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_LEADER_GIOVANNI,\n        .trainerName = _(\"GIOVANNI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BossGiovanni),\n    },\n    [TRAINER_BOSS_GIOVANNI_2] = {\n        .trainerClass = TRAINER_CLASS_BOSS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_LEADER_GIOVANNI,\n        .trainerName = _(\"GIOVANNI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BossGiovanni2),\n    },\n    [TRAINER_LEADER_GIOVANNI] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_LEADER_GIOVANNI,\n        .trainerName = _(\"GIOVANNI\"),\n        .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderGiovanni),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_2] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt2),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_3] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt3),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_4] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt4),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_5] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt5),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_6] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt6),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_7] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt7),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_8] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt8),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_9] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt9),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_10] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketGrunt10),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_11] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt11),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_12] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketGrunt12),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_13] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketGrunt13),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_14] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt14),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_15] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt15),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_16] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt16),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_17] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt17),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_18] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt18),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_19] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt19),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_20] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt20),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_21] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt21),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_22] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt22),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_23] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt23),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_24] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt24),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_25] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt25),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_26] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt26),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_27] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt27),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_28] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt28),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_29] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt29),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_30] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt30),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_31] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt31),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_32] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketGrunt32),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_33] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt33),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_34] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt34),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_35] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt35),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_36] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt36),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_37] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt37),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_38] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt38),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_39] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt39),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_40] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt40),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_41] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt41),\n    },\n    [TRAINER_COOLTRAINER_SAMUEL] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"SAMUEL\"),\n        .items = {ITEM_SUPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerSamuel),\n    },\n    [TRAINER_COOLTRAINER_GEORGE] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"GEORGE\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerGeorge),\n    },\n    [TRAINER_COOLTRAINER_COLBY] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"COLBY\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerColby),\n    },\n    [TRAINER_COOLTRAINER_PAUL] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"PAUL\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerPaul),\n    },\n    [TRAINER_COOLTRAINER_ROLANDO] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"ROLANDO\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerRolando),\n    },\n    [TRAINER_COOLTRAINER_GILBERT] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"GILBERT\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerGilbert),\n    },\n    [TRAINER_COOLTRAINER_OWEN] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"OWEN\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerOwen),\n    },\n    [TRAINER_COOLTRAINER_BERKE] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"BERKE\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerBerke),\n    },\n    [TRAINER_COOLTRAINER_YUJI] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"YUJI\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerYuji),\n    },\n    [TRAINER_COOLTRAINER_WARREN] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"WARREN\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerWarren),\n    },\n    [TRAINER_COOLTRAINER_MARY] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_F,\n        .trainerName = _(\"MARY\"),\n        .items = {ITEM_SUPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerMary),\n    },\n    [TRAINER_COOLTRAINER_CAROLINE] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_F,\n        .trainerName = _(\"CAROLINE\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerCaroline),\n    },\n    [TRAINER_COOLTRAINER_ALEXA] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_F,\n        .trainerName = _(\"ALEXA\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerAlexa),\n    },\n    [TRAINER_COOLTRAINER_SHANNON] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_F,\n        .trainerName = _(\"SHANNON\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerShannon),\n    },\n    [TRAINER_COOLTRAINER_NAOMI] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_F,\n        .trainerName = _(\"NAOMI\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerNaomi),\n    },\n    [TRAINER_COOLTRAINER_BROOKE] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_F,\n        .trainerName = _(\"BROOKE\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerBrooke),\n    },\n    [TRAINER_COOLTRAINER_AUSTINA] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_F,\n        .trainerName = _(\"AUSTINA\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerAustina),\n    },\n    [TRAINER_COOLTRAINER_JULIE] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_F,\n        .trainerName = _(\"JULIE\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerJulie),\n    },\n    [TRAINER_ELITE_FOUR_LORELEI] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_LORELEI,\n        .trainerName = _(\"LORELEI\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_EliteFourLorelei),\n    },\n    [TRAINER_ELITE_FOUR_BRUNO] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_BRUNO,\n        .trainerName = _(\"BRUNO\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_EliteFourBruno),\n    },\n    [TRAINER_ELITE_FOUR_AGATHA] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_AGATHA,\n        .trainerName = _(\"AGATHA\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_EliteFourAgatha),\n    },\n    [TRAINER_ELITE_FOUR_LANCE] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_LANCE,\n        .trainerName = _(\"LANCE\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_EliteFourLance),\n    },\n    [TRAINER_LEADER_BROCK] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_BROCK,\n        .trainerName = _(\"BROCK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderBrock),\n    },\n    [TRAINER_LEADER_MISTY] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_MISTY,\n        .trainerName = _(\"MISTY\"),\n        .items = {ITEM_SUPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderMisty),\n    },\n    [TRAINER_LEADER_LT_SURGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_LT_SURGE,\n        .trainerName = _(\"LT. SURGE\"),\n        .items = {ITEM_SUPER_POTION, ITEM_FULL_HEAL},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderLtSurge),\n    },\n    [TRAINER_LEADER_ERIKA] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_ERIKA,\n        .trainerName = _(\"ERIKA\"),\n        .items = {ITEM_HYPER_POTION, ITEM_FULL_HEAL},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderErika),\n    },\n    [TRAINER_LEADER_KOGA] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_KOGA,\n        .trainerName = _(\"KOGA\"),\n        .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderKoga),\n    },\n    [TRAINER_LEADER_BLAINE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_BLAINE,\n        .trainerName = _(\"BLAINE\"),\n        .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderBlaine),\n    },\n    [TRAINER_LEADER_SABRINA] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_SABRINA,\n        .trainerName = _(\"SABRINA\"),\n        .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_LeaderSabrina),\n    },\n    [TRAINER_GENTLEMAN_THOMAS] = {\n        .trainerClass = TRAINER_CLASS_GENTLEMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,\n        .trainerPic = TRAINER_PIC_GENTLEMAN,\n        .trainerName = _(\"THOMAS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanThomas),\n    },\n    [TRAINER_GENTLEMAN_ARTHUR] = {\n        .trainerClass = TRAINER_CLASS_GENTLEMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,\n        .trainerPic = TRAINER_PIC_GENTLEMAN,\n        .trainerName = _(\"ARTHUR\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanArthur),\n    },\n    [TRAINER_GENTLEMAN_TUCKER] = {\n        .trainerClass = TRAINER_CLASS_GENTLEMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,\n        .trainerPic = TRAINER_PIC_GENTLEMAN,\n        .trainerName = _(\"TUCKER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanTucker),\n    },\n    [TRAINER_GENTLEMAN_NORTON] = {\n        .trainerClass = TRAINER_CLASS_GENTLEMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,\n        .trainerPic = TRAINER_PIC_GENTLEMAN,\n        .trainerName = _(\"NORTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanNorton),\n    },\n    [TRAINER_GENTLEMAN_WALTER] = {\n        .trainerClass = TRAINER_CLASS_GENTLEMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,\n        .trainerPic = TRAINER_PIC_GENTLEMAN,\n        .trainerName = _(\"WALTER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanWalter),\n    },\n    [TRAINER_RIVAL_SS_ANNE_SQUIRTLE] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_LATE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_LATE,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalSsAnneSquirtle),\n    },\n    [TRAINER_RIVAL_SS_ANNE_BULBASAUR] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_LATE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_LATE,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalSsAnneBulbasaur),\n    },\n    [TRAINER_RIVAL_SS_ANNE_CHARMANDER] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_LATE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_LATE,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalSsAnneCharmander),\n    },\n    [TRAINER_RIVAL_POKEMON_TOWER_SQUIRTLE] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_LATE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_LATE,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalPokemonTowerSquirtle),\n    },\n    [TRAINER_RIVAL_POKEMON_TOWER_BULBASAUR] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_LATE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_LATE,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalPokemonTowerBulbasaur),\n    },\n    [TRAINER_RIVAL_POKEMON_TOWER_CHARMANDER] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_LATE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_LATE,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalPokemonTowerCharmander),\n    },\n    [TRAINER_RIVAL_SILPH_SQUIRTLE] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_LATE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_LATE,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalSilphSquirtle),\n    },\n    [TRAINER_RIVAL_SILPH_BULBASAUR] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_LATE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_LATE,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalSilphBulbasaur),\n    },\n    [TRAINER_RIVAL_SILPH_CHARMANDER] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_LATE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_LATE,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RivalSilphCharmander),\n    },\n    [TRAINER_RIVAL_ROUTE22_LATE_SQUIRTLE] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_LATE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_LATE,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalRoute22LateSquirtle),\n    },\n    [TRAINER_RIVAL_ROUTE22_LATE_BULBASAUR] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_LATE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_LATE,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalRoute22LateBulbasaur),\n    },\n    [TRAINER_RIVAL_ROUTE22_LATE_CHARMANDER] = {\n        .trainerClass = TRAINER_CLASS_RIVAL_LATE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RIVAL_LATE,\n        .trainerName = _(\"TERRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_RivalRoute22LateCharmander),\n    },\n    [TRAINER_CHAMPION_FIRST_SQUIRTLE] = {\n        .trainerClass = TRAINER_CLASS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_RIVAL,\n        .trainerName = _(\"TERRY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_ChampionFirstSquirtle),\n    },\n    [TRAINER_CHAMPION_FIRST_BULBASAUR] = {\n        .trainerClass = TRAINER_CLASS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_RIVAL,\n        .trainerName = _(\"TERRY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_ChampionFirstBulbasaur),\n    },\n    [TRAINER_CHAMPION_FIRST_CHARMANDER] = {\n        .trainerClass = TRAINER_CLASS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_RIVAL,\n        .trainerName = _(\"TERRY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_ChampionFirstCharmander),\n    },\n    [TRAINER_CHANNELER_PATRICIA] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"PATRICIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerPatricia),\n    },\n    [TRAINER_CHANNELER_CARLY] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"CARLY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerCarly),\n    },\n    [TRAINER_CHANNELER_HOPE] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"HOPE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerHope),\n    },\n    [TRAINER_CHANNELER_PAULA] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"PAULA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerPaula),\n    },\n    [TRAINER_CHANNELER_LAUREL] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"LAUREL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerLaurel),\n    },\n    [TRAINER_CHANNELER_JODY] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"JODY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerJody),\n    },\n    [TRAINER_CHANNELER_TAMMY] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"TAMMY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerTammy),\n    },\n    [TRAINER_CHANNELER_RUTH] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"RUTH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerRuth),\n    },\n    [TRAINER_CHANNELER_KARINA] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"KARINA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerKarina),\n    },\n    [TRAINER_CHANNELER_JANAE] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"JANAE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerJanae),\n    },\n    [TRAINER_CHANNELER_ANGELICA] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"ANGELICA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerAngelica),\n    },\n    [TRAINER_CHANNELER_EMILIA] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"EMILIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerEmilia),\n    },\n    [TRAINER_CHANNELER_JENNIFER] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"JENNIFER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerJennifer),\n    },\n    [TRAINER_CHANNELER_1] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler1),\n    },\n    [TRAINER_CHANNELER_2] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler2),\n    },\n    [TRAINER_CHANNELER_3] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler3),\n    },\n    [TRAINER_CHANNELER_4] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler4),\n    },\n    [TRAINER_CHANNELER_5] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler5),\n    },\n    [TRAINER_CHANNELER_6] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler6),\n    },\n    [TRAINER_CHANNELER_7] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler7),\n    },\n    [TRAINER_CHANNELER_8] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Channeler8),\n    },\n    [TRAINER_CHANNELER_AMANDA] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"AMANDA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerAmanda),\n    },\n    [TRAINER_CHANNELER_STACY] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"STACY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerStacy),\n    },\n    [TRAINER_CHANNELER_TASHA] = {\n        .trainerClass = TRAINER_CLASS_CHANNELER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_CHANNELER,\n        .trainerName = _(\"TASHA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_ChannelerTasha),\n    },\n    [TRAINER_HIKER_JEREMY] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"JEREMY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerJeremy),\n    },\n    [TRAINER_PICNICKER_ALMA] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"ALMA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerAlma),\n    },\n    [TRAINER_PICNICKER_SUSIE] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"SUSIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerSusie),\n    },\n    [TRAINER_PICNICKER_VALERIE] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"VALERIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerValerie),\n    },\n    [TRAINER_PICNICKER_GWEN] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"GWEN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerGwen),\n    },\n    [TRAINER_BIKER_VIRGIL] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"VIRGIL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerVirgil),\n    },\n    [TRAINER_CAMPER_FLINT] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"FLINT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperFlint),\n    },\n    [TRAINER_PICNICKER_MISSY] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"MISSY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerMissy),\n    },\n    [TRAINER_PICNICKER_IRENE] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"IRENE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerIrene),\n    },\n    [TRAINER_PICNICKER_DANA] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"DANA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerDana),\n    },\n    [TRAINER_PICNICKER_ARIANA] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"ARIANA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerAriana),\n    },\n    [TRAINER_PICNICKER_LEAH] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"LEAH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerLeah),\n    },\n    [TRAINER_CAMPER_JUSTIN] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"JUSTIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperJustin),\n    },\n    [TRAINER_PICNICKER_YAZMIN] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"YAZMIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerYazmin),\n    },\n    [TRAINER_PICNICKER_KINDRA] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"KINDRA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerKindra),\n    },\n    [TRAINER_PICNICKER_BECKY] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"BECKY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerBecky),\n    },\n    [TRAINER_PICNICKER_CELIA] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"CELIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerCelia),\n    },\n    [TRAINER_GENTLEMAN_BROOKS] = {\n        .trainerClass = TRAINER_CLASS_GENTLEMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,\n        .trainerPic = TRAINER_PIC_GENTLEMAN,\n        .trainerName = _(\"BROOKS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanBrooks),\n    },\n    [TRAINER_GENTLEMAN_LAMAR] = {\n        .trainerClass = TRAINER_CLASS_GENTLEMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,\n        .trainerPic = TRAINER_PIC_GENTLEMAN,\n        .trainerName = _(\"LAMAR\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanLamar),\n    },\n    [TRAINER_TWINS_ELI_ANNE] = {\n        .trainerClass = TRAINER_CLASS_TWINS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,\n        .trainerPic = TRAINER_PIC_TWINS,\n        .trainerName = _(\"ELI & ANNE\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TwinsEliAnne),\n    },\n    [TRAINER_COOL_COUPLE_RAY_TYRA] = {\n        .trainerClass = TRAINER_CLASS_COOL_COUPLE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOL_COUPLE,\n        .trainerName = _(\"RAY & TYRA\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CoolCoupleRayTyra),\n    },\n    [TRAINER_YOUNG_COUPLE_GIA_JES] = {\n        .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,\n        .trainerPic = TRAINER_PIC_YOUNG_COUPLE,\n        .trainerName = _(\"GIA & JES\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungCoupleGiaJes),\n    },\n    [TRAINER_TWINS_KIRI_JAN] = {\n        .trainerClass = TRAINER_CLASS_TWINS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,\n        .trainerPic = TRAINER_PIC_TWINS,\n        .trainerName = _(\"KIRI & JAN\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TwinsKiriJan),\n    },\n    [TRAINER_CRUSH_KIN_RON_MYA] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_KIN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_KIN,\n        .trainerName = _(\"RON & MYA\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushKinRonMya),\n    },\n    [TRAINER_YOUNG_COUPLE_LEA_JED] = {\n        .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,\n        .trainerPic = TRAINER_PIC_YOUNG_COUPLE,\n        .trainerName = _(\"LEA & JED\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungCoupleLeaJed),\n    },\n    [TRAINER_SIS_AND_BRO_LIA_LUC] = {\n        .trainerClass = TRAINER_CLASS_SIS_AND_BRO,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SIS_AND_BRO,\n        .trainerName = _(\"LIA & LUC\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SisAndBroLiaLuc),\n    },\n    [TRAINER_SIS_AND_BRO_LIL_IAN] = {\n        .trainerClass = TRAINER_CLASS_SIS_AND_BRO,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SIS_AND_BRO,\n        .trainerName = _(\"LIL & IAN\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SisAndBroLilIan),\n    },\n    [TRAINER_BUG_CATCHER_3] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher3),\n    },\n    [TRAINER_BUG_CATCHER_4] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher4),\n    },\n    [TRAINER_BUG_CATCHER_5] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher5),\n    },\n    [TRAINER_BUG_CATCHER_6] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher6),\n    },\n    [TRAINER_BUG_CATCHER_7] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher7),\n    },\n    [TRAINER_BUG_CATCHER_8] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcher8),\n    },\n    [TRAINER_YOUNGSTER_BEN_3] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"BEN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterBen3),\n    },\n    [TRAINER_YOUNGSTER_BEN_4] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"BEN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterBen4),\n    },\n    [TRAINER_YOUNGSTER_CHAD_2] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"CHAD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterChad2),\n    },\n    [TRAINER_LASS_RELI_2] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"RELI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassReli2),\n    },\n    [TRAINER_LASS_RELI_3] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"RELI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassReli3),\n    },\n    [TRAINER_YOUNGSTER_TIMMY_2] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"TIMMY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterTimmy2),\n    },\n    [TRAINER_YOUNGSTER_TIMMY_3] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"TIMMY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterTimmy3),\n    },\n    [TRAINER_YOUNGSTER_TIMMY_4] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"TIMMY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterTimmy4),\n    },\n    [TRAINER_YOUNGSTER_CHAD_3] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"CHAD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterChad3),\n    },\n    [TRAINER_LASS_JANICE_2] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"JANICE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassJanice2),\n    },\n    [TRAINER_LASS_JANICE_3] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"JANICE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassJanice3),\n    },\n    [TRAINER_YOUNGSTER_CHAD_4] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"CHAD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterChad4),\n    },\n    [TRAINER_HIKER_FRANKLIN_2] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"FRANKLIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerFranklin2),\n    },\n    [TRAINER_PKMN_PROF_PROF_OAK] = {\n        .trainerClass = TRAINER_CLASS_PKMN_PROF,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_PROFESSOR_OAK,\n        .trainerName = _(\"PROF. OAK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnProfProfOak),\n    },\n    [TRAINER_PLAYER_BRENDAN] = {\n        .trainerClass = TRAINER_CLASS_PLAYER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RS_BRENDAN_2,\n        .trainerName = _(\"BRENDAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PlayerBrendan),\n    },\n    [TRAINER_PLAYER_MAY] = {\n        .trainerClass = TRAINER_CLASS_PLAYER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_RS_MAY_2,\n        .trainerName = _(\"MAY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PlayerMay),\n    },\n    [TRAINER_PLAYER_RED] = {\n        .trainerClass = TRAINER_CLASS_PLAYER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_RED,\n        .trainerName = _(\"RED\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PlayerRed),\n    },\n    [TRAINER_PLAYER_LEAF] = {\n        .trainerClass = TRAINER_CLASS_PLAYER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_LEAF,\n        .trainerName = _(\"LEAF\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PlayerLeaf),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_42] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_F,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt42),\n    },\n    [TRAINER_PSYCHIC_JACLYN] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PSYCHIC_F,\n        .trainerName = _(\"JACLYN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PsychicJaclyn),\n    },\n    [TRAINER_CRUSH_GIRL_SHARON] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_GIRL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_GIRL,\n        .trainerName = _(\"SHARON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlSharon),\n    },\n    [TRAINER_TUBER_AMIRA] = {\n        .trainerClass = TRAINER_CLASS_TUBER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,\n        .trainerPic = TRAINER_PIC_TUBER_F,\n        .trainerName = _(\"AMIRA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TuberAmira),\n    },\n    [TRAINER_PKMN_BREEDER_ALIZE] = {\n        .trainerClass = TRAINER_CLASS_PKMN_BREEDER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_POKEMON_BREEDER,\n        .trainerName = _(\"ALIZE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnBreederAlize),\n    },\n    [TRAINER_PKMN_RANGER_NICOLAS] = {\n        .trainerClass = TRAINER_CLASS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_POKEMON_RANGER_M,\n        .trainerName = _(\"NICOLAS\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerNicolas),\n    },\n    [TRAINER_PKMN_RANGER_MADELINE] = {\n        .trainerClass = TRAINER_CLASS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,\n        .trainerName = _(\"MADELINE\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerMadeline),\n    },\n    [TRAINER_AROMA_LADY_NIKKI] = {\n        .trainerClass = TRAINER_CLASS_AROMA_LADY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_AROMA_LADY,\n        .trainerName = _(\"NIKKI\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_AromaLadyNikki),\n    },\n    [TRAINER_RUIN_MANIAC_STANLY] = {\n        .trainerClass = TRAINER_CLASS_RUIN_MANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_RUIN_MANIAC,\n        .trainerName = _(\"STANLY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacStanly),\n    },\n    [TRAINER_LADY_JACKI] = {\n        .trainerClass = TRAINER_CLASS_LADY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_LADY,\n        .trainerName = _(\"JACKI\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_LadyJacki),\n    },\n    [TRAINER_PAINTER_DAISY] = {\n        .trainerClass = TRAINER_CLASS_PAINTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_PAINTER,\n        .trainerName = _(\"DAISY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PainterDaisy),\n    },\n    [TRAINER_BIKER_GOON] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"GOON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerGoon),\n    },\n    [TRAINER_BIKER_GOON_2] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"GOON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerGoon2),\n    },\n    [TRAINER_BIKER_GOON_3] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"GOON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerGoon3),\n    },\n    [TRAINER_BIKER_2] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_Biker2),\n    },\n    [TRAINER_BUG_CATCHER_ANTHONY] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"ANTHONY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherAnthony),\n    },\n    [TRAINER_BUG_CATCHER_CHARLIE] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"CHARLIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherCharlie),\n    },\n    [TRAINER_TWINS_ELI_ANNE_2] = {\n        .trainerClass = TRAINER_CLASS_TWINS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,\n        .trainerPic = TRAINER_PIC_TWINS,\n        .trainerName = _(\"ELI & ANNE\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TwinsEliAnne2),\n    },\n    [TRAINER_YOUNGSTER_JOHNSON] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"JOHNSON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterJohnson),\n    },\n    [TRAINER_BIKER_RICARDO] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"RICARDO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_BikerRicardo),\n    },\n    [TRAINER_BIKER_JAREN] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"JAREN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerJaren),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_43] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt43),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_44] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt44),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_45] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt45),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_46] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt46),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_47] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt47),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_48] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt48),\n    },\n    [TRAINER_TEAM_ROCKET_ADMIN] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_F,\n        .trainerName = _(\"ADMIN\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketAdmin),\n    },\n    [TRAINER_TEAM_ROCKET_ADMIN_2] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"ADMIN\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketAdmin2),\n    },\n    [TRAINER_SCIENTIST_GIDEON] = {\n        .trainerClass = TRAINER_CLASS_SCIENTIST,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SCIENTIST,\n        .trainerName = _(\"GIDEON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_ScientistGideon),\n    },\n    [TRAINER_SWIMMER_FEMALE_AMARA] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"AMARA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleAmara),\n    },\n    [TRAINER_SWIMMER_FEMALE_MARIA] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"MARIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleMaria),\n    },\n    [TRAINER_SWIMMER_FEMALE_ABIGAIL] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"ABIGAIL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleAbigail),\n    },\n    [TRAINER_SWIMMER_MALE_FINN] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"FINN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleFinn),\n    },\n    [TRAINER_SWIMMER_MALE_GARRETT] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"GARRETT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleGarrett),\n    },\n    [TRAINER_FISHERMAN_TOMMY] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"TOMMY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanTommy),\n    },\n    [TRAINER_CRUSH_GIRL_TANYA] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_GIRL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_GIRL,\n        .trainerName = _(\"TANYA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlTanya),\n    },\n    [TRAINER_BLACK_BELT_SHEA] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"SHEA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltShea),\n    },\n    [TRAINER_BLACK_BELT_HUGH] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"HUGH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltHugh),\n    },\n    [TRAINER_CAMPER_BRYCE] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"BRYCE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperBryce),\n    },\n    [TRAINER_PICNICKER_CLAIRE] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"CLAIRE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerClaire),\n    },\n    [TRAINER_CRUSH_KIN_MIK_KIA] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_KIN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_KIN,\n        .trainerName = _(\"MIK & KIA\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushKinMikKia),\n    },\n    [TRAINER_AROMA_LADY_VIOLET] = {\n        .trainerClass = TRAINER_CLASS_AROMA_LADY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_AROMA_LADY,\n        .trainerName = _(\"VIOLET\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_AromaLadyViolet),\n    },\n    [TRAINER_TUBER_ALEXIS] = {\n        .trainerClass = TRAINER_CLASS_TUBER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,\n        .trainerPic = TRAINER_PIC_TUBER_F,\n        .trainerName = _(\"ALEXIS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TuberAlexis),\n    },\n    [TRAINER_TWINS_JOY_MEG] = {\n        .trainerClass = TRAINER_CLASS_TWINS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,\n        .trainerPic = TRAINER_PIC_TWINS,\n        .trainerName = _(\"JOY & MEG\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TwinsJoyMeg),\n    },\n    [TRAINER_SWIMMER_FEMALE_TISHA] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"TISHA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleTisha),\n    },\n    [TRAINER_PAINTER_CELINA] = {\n        .trainerClass = TRAINER_CLASS_PAINTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_PAINTER,\n        .trainerName = _(\"CELINA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PainterCelina),\n    },\n    [TRAINER_PAINTER_RAYNA] = {\n        .trainerClass = TRAINER_CLASS_PAINTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_PAINTER,\n        .trainerName = _(\"RAYNA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PainterRayna),\n    },\n    [TRAINER_LADY_GILLIAN] = {\n        .trainerClass = TRAINER_CLASS_LADY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_LADY,\n        .trainerName = _(\"GILLIAN\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_LadyGillian),\n    },\n    [TRAINER_YOUNGSTER_DESTIN] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"DESTIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterDestin),\n    },\n    [TRAINER_SWIMMER_MALE_TOBY] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"TOBY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleToby),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_49] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt49),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_50] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_M,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_TeamRocketGrunt50),\n    },\n    [TRAINER_TEAM_ROCKET_GRUNT_51] = {\n        .trainerClass = TRAINER_CLASS_TEAM_ROCKET,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_ROCKET_GRUNT_F,\n        .trainerName = _(\"GRUNT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TeamRocketGrunt51),\n    },\n    [TRAINER_BIRD_KEEPER_MILO] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"MILO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperMilo),\n    },\n    [TRAINER_BIRD_KEEPER_CHAZ] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"CHAZ\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperChaz),\n    },\n    [TRAINER_BIRD_KEEPER_HAROLD] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"HAROLD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperHarold),\n    },\n    [TRAINER_FISHERMAN_TYLOR] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"TYLOR\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanTylor),\n    },\n    [TRAINER_SWIMMER_MALE_MYMO] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"MYMO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleMymo),\n    },\n    [TRAINER_SWIMMER_FEMALE_NICOLE] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"NICOLE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleNicole),\n    },\n    [TRAINER_SIS_AND_BRO_AVA_GEB] = {\n        .trainerClass = TRAINER_CLASS_SIS_AND_BRO,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SIS_AND_BRO,\n        .trainerName = _(\"AVA & GEB\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SisAndBroAvaGeb),\n    },\n    [TRAINER_AROMA_LADY_ROSE] = {\n        .trainerClass = TRAINER_CLASS_AROMA_LADY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_AROMA_LADY,\n        .trainerName = _(\"ROSE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_AromaLadyRose),\n    },\n    [TRAINER_SWIMMER_MALE_SAMIR] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"SAMIR\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleSamir),\n    },\n    [TRAINER_SWIMMER_FEMALE_DENISE] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"DENISE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleDenise),\n    },\n    [TRAINER_TWINS_MIU_MIA] = {\n        .trainerClass = TRAINER_CLASS_TWINS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,\n        .trainerPic = TRAINER_PIC_TWINS,\n        .trainerName = _(\"MIU & MIA\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TwinsMiuMia),\n    },\n    [TRAINER_HIKER_EARL] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"EARL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerEarl),\n    },\n    [TRAINER_RUIN_MANIAC_FOSTER] = {\n        .trainerClass = TRAINER_CLASS_RUIN_MANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_RUIN_MANIAC,\n        .trainerName = _(\"FOSTER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacFoster),\n    },\n    [TRAINER_RUIN_MANIAC_LARRY] = {\n        .trainerClass = TRAINER_CLASS_RUIN_MANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_RUIN_MANIAC,\n        .trainerName = _(\"LARRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacLarry),\n    },\n    [TRAINER_HIKER_DARYL] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"DARYL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerDaryl),\n    },\n    [TRAINER_POKEMANIAC_HECTOR] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"HECTOR\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacHector),\n    },\n    [TRAINER_PSYCHIC_DARIO] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_PSYCHIC_M,\n        .trainerName = _(\"DARIO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PsychicDario),\n    },\n    [TRAINER_PSYCHIC_RODETTE] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PSYCHIC_F,\n        .trainerName = _(\"RODETTE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PsychicRodette),\n    },\n    [TRAINER_AROMA_LADY_MIAH] = {\n        .trainerClass = TRAINER_CLASS_AROMA_LADY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_AROMA_LADY,\n        .trainerName = _(\"MIAH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_AromaLadyMiah),\n    },\n    [TRAINER_YOUNG_COUPLE_EVE_JON] = {\n        .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,\n        .trainerPic = TRAINER_PIC_YOUNG_COUPLE,\n        .trainerName = _(\"EVE & JON\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungCoupleEveJon),\n    },\n    [TRAINER_JUGGLER_MASON] = {\n        .trainerClass = TRAINER_CLASS_JUGGLER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_JUGGLER,\n        .trainerName = _(\"MASON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_JugglerMason),\n    },\n    [TRAINER_CRUSH_GIRL_CYNDY] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_GIRL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_GIRL,\n        .trainerName = _(\"CYNDY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlCyndy),\n    },\n    [TRAINER_CRUSH_GIRL_JOCELYN] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_GIRL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_GIRL,\n        .trainerName = _(\"JOCELYN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlJocelyn),\n    },\n    [TRAINER_TAMER_EVAN] = {\n        .trainerClass = TRAINER_CLASS_TAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_TAMER,\n        .trainerName = _(\"EVAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerEvan),\n    },\n    [TRAINER_POKEMANIAC_MARK_2] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"MARK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacMark2),\n    },\n    [TRAINER_PKMN_RANGER_LOGAN] = {\n        .trainerClass = TRAINER_CLASS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_POKEMON_RANGER_M,\n        .trainerName = _(\"LOGAN\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerLogan),\n    },\n    [TRAINER_PKMN_RANGER_JACKSON] = {\n        .trainerClass = TRAINER_CLASS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_POKEMON_RANGER_M,\n        .trainerName = _(\"JACKSON\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerJackson),\n    },\n    [TRAINER_PKMN_RANGER_BETH] = {\n        .trainerClass = TRAINER_CLASS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,\n        .trainerName = _(\"BETH\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnRangerBeth),\n    },\n    [TRAINER_PKMN_RANGER_KATELYN] = {\n        .trainerClass = TRAINER_CLASS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,\n        .trainerName = _(\"KATELYN\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerKatelyn),\n    },\n    [TRAINER_COOLTRAINER_LEROY] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"LEROY\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerLeroy),\n    },\n    [TRAINER_COOLTRAINER_MICHELLE] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_F,\n        .trainerName = _(\"MICHELLE\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerMichelle),\n    },\n    [TRAINER_COOL_COUPLE_LEX_NYA] = {\n        .trainerClass = TRAINER_CLASS_COOL_COUPLE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOL_COUPLE,\n        .trainerName = _(\"LEX & NYA\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CoolCoupleLexNya),\n    },\n    [TRAINER_RUIN_MANIAC_BRANDON] = {\n        .trainerClass = TRAINER_CLASS_RUIN_MANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_RUIN_MANIAC,\n        .trainerName = _(\"BRANDON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacBrandon),\n    },\n    [TRAINER_RUIN_MANIAC_BENJAMIN] = {\n        .trainerClass = TRAINER_CLASS_RUIN_MANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_RUIN_MANIAC,\n        .trainerName = _(\"BENJAMIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_RuinManiacBenjamin),\n    },\n    [TRAINER_PAINTER_EDNA] = {\n        .trainerClass = TRAINER_CLASS_PAINTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_PAINTER,\n        .trainerName = _(\"EDNA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PainterEdna),\n    },\n    [TRAINER_GENTLEMAN_CLIFFORD] = {\n        .trainerClass = TRAINER_CLASS_GENTLEMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,\n        .trainerPic = TRAINER_PIC_GENTLEMAN,\n        .trainerName = _(\"CLIFFORD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GentlemanClifford),\n    },\n    [TRAINER_LADY_SELPHY] = {\n        .trainerClass = TRAINER_CLASS_LADY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_LADY,\n        .trainerName = _(\"SELPHY\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_CUSTOM_MOVES(sParty_LadySelphy),\n    },\n    [TRAINER_RUIN_MANIAC_LAWSON] = {\n        .trainerClass = TRAINER_CLASS_RUIN_MANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_RUIN_MANIAC,\n        .trainerName = _(\"LAWSON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacLawson),\n    },\n    [TRAINER_PSYCHIC_LAURA] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PSYCHIC_F,\n        .trainerName = _(\"LAURA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PsychicLaura),\n    },\n    [TRAINER_PKMN_BREEDER_BETHANY] = {\n        .trainerClass = TRAINER_CLASS_PKMN_BREEDER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_POKEMON_BREEDER,\n        .trainerName = _(\"BETHANY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnBreederBethany),\n    },\n    [TRAINER_PKMN_BREEDER_ALLISON] = {\n        .trainerClass = TRAINER_CLASS_PKMN_BREEDER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_POKEMON_BREEDER,\n        .trainerName = _(\"ALLISON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnBreederAllison),\n    },\n    [TRAINER_BUG_CATCHER_GARRET] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"GARRET\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherGarret),\n    },\n    [TRAINER_BUG_CATCHER_JONAH] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"JONAH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherJonah),\n    },\n    [TRAINER_BUG_CATCHER_VANCE] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"VANCE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherVance),\n    },\n    [TRAINER_YOUNGSTER_NASH] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"NASH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterNash),\n    },\n    [TRAINER_YOUNGSTER_CORDELL] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"CORDELL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterCordell),\n    },\n    [TRAINER_LASS_DALIA] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"DALIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassDalia),\n    },\n    [TRAINER_LASS_JOANA] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"JOANA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassJoana),\n    },\n    [TRAINER_CAMPER_RILEY] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"RILEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperRiley),\n    },\n    [TRAINER_PICNICKER_MARCY] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"MARCY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerMarcy),\n    },\n    [TRAINER_RUIN_MANIAC_LAYTON] = {\n        .trainerClass = TRAINER_CLASS_RUIN_MANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_RUIN_MANIAC,\n        .trainerName = _(\"LAYTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacLayton),\n    },\n    [TRAINER_PICNICKER_KELSEY_2] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"KELSEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerKelsey2),\n    },\n    [TRAINER_PICNICKER_KELSEY_3] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"KELSEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerKelsey3),\n    },\n    [TRAINER_PICNICKER_KELSEY_4] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"KELSEY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerKelsey4),\n    },\n    [TRAINER_CAMPER_RICKY_2] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"RICKY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperRicky2),\n    },\n    [TRAINER_CAMPER_RICKY_3] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"RICKY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperRicky3),\n    },\n    [TRAINER_CAMPER_RICKY_4] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"RICKY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperRicky4),\n    },\n    [TRAINER_CAMPER_JEFF_2] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"JEFF\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperJeff2),\n    },\n    [TRAINER_CAMPER_JEFF_3] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"JEFF\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperJeff3),\n    },\n    [TRAINER_CAMPER_JEFF_4] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"JEFF\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperJeff4),\n    },\n    [TRAINER_PICNICKER_ISABELLE_2] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"ISABELLE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerIsabelle2),\n    },\n    [TRAINER_PICNICKER_ISABELLE_3] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"ISABELLE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerIsabelle3),\n    },\n    [TRAINER_PICNICKER_ISABELLE_4] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"ISABELLE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerIsabelle4),\n    },\n    [TRAINER_YOUNGSTER_YASU_2] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"YASU\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterYasu2),\n    },\n    [TRAINER_YOUNGSTER_YASU_3] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"YASU\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterYasu3),\n    },\n    [TRAINER_ENGINEER_BERNIE_2] = {\n        .trainerClass = TRAINER_CLASS_ENGINEER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_ENGINEER,\n        .trainerName = _(\"BERNIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_EngineerBernie2),\n    },\n    [TRAINER_GAMER_DARIAN_2] = {\n        .trainerClass = TRAINER_CLASS_GAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_GAMER,\n        .trainerName = _(\"DARIAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerDarian2),\n    },\n    [TRAINER_CAMPER_CHRIS_2] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"CHRIS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperChris2),\n    },\n    [TRAINER_CAMPER_CHRIS_3] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"CHRIS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperChris3),\n    },\n    [TRAINER_CAMPER_CHRIS_4] = {\n        .trainerClass = TRAINER_CLASS_CAMPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CAMPER,\n        .trainerName = _(\"CHRIS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CamperChris4),\n    },\n    [TRAINER_PICNICKER_ALICIA_2] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"ALICIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerAlicia2),\n    },\n    [TRAINER_PICNICKER_ALICIA_3] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"ALICIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerAlicia3),\n    },\n    [TRAINER_PICNICKER_ALICIA_4] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"ALICIA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerAlicia4),\n    },\n    [TRAINER_HIKER_JEREMY_2] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"JEREMY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerJeremy2),\n    },\n    [TRAINER_POKEMANIAC_MARK_3] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"MARK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacMark3),\n    },\n    [TRAINER_POKEMANIAC_HERMAN_2] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"HERMAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacHerman2),\n    },\n    [TRAINER_POKEMANIAC_HERMAN_3] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"HERMAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacHerman3),\n    },\n    [TRAINER_HIKER_TRENT_2] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"TRENT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerTrent2),\n    },\n    [TRAINER_LASS_MEGAN_2] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"MEGAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassMegan2),\n    },\n    [TRAINER_LASS_MEGAN_3] = {\n        .trainerClass = TRAINER_CLASS_LASS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LASS,\n        .trainerName = _(\"MEGAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_LassMegan3),\n    },\n    [TRAINER_SUPER_NERD_GLENN_2] = {\n        .trainerClass = TRAINER_CLASS_SUPER_NERD,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_SUPER_NERD,\n        .trainerName = _(\"GLENN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SuperNerdGlenn2),\n    },\n    [TRAINER_GAMER_RICH_2] = {\n        .trainerClass = TRAINER_CLASS_GAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_GAMER,\n        .trainerName = _(\"RICH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_GamerRich2),\n    },\n    [TRAINER_BIKER_JAREN_2] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"JAREN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerJaren2),\n    },\n    [TRAINER_FISHERMAN_ELLIOT_2] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"ELLIOT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanElliot2),\n    },\n    [TRAINER_ROCKER_LUCA_2] = {\n        .trainerClass = TRAINER_CLASS_ROCKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_ROCKER,\n        .trainerName = _(\"LUCA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RockerLuca2),\n    },\n    [TRAINER_BEAUTY_SHEILA_2] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_BEAUTY,\n        .trainerName = _(\"SHEILA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautySheila2),\n    },\n    [TRAINER_BIRD_KEEPER_ROBERT_2] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"ROBERT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperRobert2),\n    },\n    [TRAINER_BIRD_KEEPER_ROBERT_3] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"ROBERT\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperRobert3),\n    },\n    [TRAINER_PICNICKER_SUSIE_2] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"SUSIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerSusie2),\n    },\n    [TRAINER_PICNICKER_SUSIE_3] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"SUSIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerSusie3),\n    },\n    [TRAINER_PICNICKER_SUSIE_4] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"SUSIE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerSusie4),\n    },\n    [TRAINER_BIKER_LUKAS_2] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"LUKAS\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerLukas2),\n    },\n    [TRAINER_BIRD_KEEPER_BENNY_2] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"BENNY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperBenny2),\n    },\n    [TRAINER_BIRD_KEEPER_BENNY_3] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"BENNY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperBenny3),\n    },\n    [TRAINER_BIRD_KEEPER_MARLON_2] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"MARLON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperMarlon2),\n    },\n    [TRAINER_BIRD_KEEPER_MARLON_3] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"MARLON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperMarlon3),\n    },\n    [TRAINER_BEAUTY_GRACE_2] = {\n        .trainerClass = TRAINER_CLASS_BEAUTY,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_BEAUTY,\n        .trainerName = _(\"GRACE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BeautyGrace2),\n    },\n    [TRAINER_BIRD_KEEPER_CHESTER_2] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"CHESTER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperChester2),\n    },\n    [TRAINER_BIRD_KEEPER_CHESTER_3] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"CHESTER\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperChester3),\n    },\n    [TRAINER_PICNICKER_BECKY_2] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"BECKY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerBecky2),\n    },\n    [TRAINER_PICNICKER_BECKY_3] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"BECKY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerBecky3),\n    },\n    [TRAINER_PICNICKER_BECKY_4] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"BECKY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerBecky4),\n    },\n    [TRAINER_CRUSH_KIN_RON_MYA_2] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_KIN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_KIN,\n        .trainerName = _(\"RON & MYA\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushKinRonMya2),\n    },\n    [TRAINER_CRUSH_KIN_RON_MYA_3] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_KIN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_KIN,\n        .trainerName = _(\"RON & MYA\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushKinRonMya3),\n    },\n    [TRAINER_CRUSH_KIN_RON_MYA_4] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_KIN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_KIN,\n        .trainerName = _(\"RON & MYA\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushKinRonMya4),\n    },\n    [TRAINER_BIKER_RUBEN_2] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"RUBEN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerRuben2),\n    },\n    [TRAINER_CUE_BALL_CAMRON_2] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"CAMRON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallCamron2),\n    },\n    [TRAINER_BIKER_JAXON_2] = {\n        .trainerClass = TRAINER_CLASS_BIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BIKER,\n        .trainerName = _(\"JAXON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BikerJaxon2),\n    },\n    [TRAINER_CUE_BALL_ISAIAH_2] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"ISAIAH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallIsaiah2),\n    },\n    [TRAINER_CUE_BALL_COREY_2] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"COREY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallCorey2),\n    },\n    [TRAINER_BIRD_KEEPER_JACOB_2] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"JACOB\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperJacob2),\n    },\n    [TRAINER_BIRD_KEEPER_JACOB_3] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"JACOB\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperJacob3),\n    },\n    [TRAINER_SWIMMER_FEMALE_ALICE_2] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"ALICE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleAlice2),\n    },\n    [TRAINER_SWIMMER_MALE_DARRIN_2] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"DARRIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleDarrin2),\n    },\n    [TRAINER_PICNICKER_MISSY_2] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"MISSY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerMissy2),\n    },\n    [TRAINER_PICNICKER_MISSY_3] = {\n        .trainerClass = TRAINER_CLASS_PICNICKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PICNICKER,\n        .trainerName = _(\"MISSY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PicnickerMissy3),\n    },\n    [TRAINER_FISHERMAN_WADE_2] = {\n        .trainerClass = TRAINER_CLASS_FISHERMAN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_FISHERMAN,\n        .trainerName = _(\"WADE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_FishermanWade2),\n    },\n    [TRAINER_SWIMMER_MALE_JACK_2] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"JACK\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleJack2),\n    },\n    [TRAINER_SIS_AND_BRO_LIL_IAN_2] = {\n        .trainerClass = TRAINER_CLASS_SIS_AND_BRO,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SIS_AND_BRO,\n        .trainerName = _(\"LIL & IAN\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SisAndBroLilIan2),\n    },\n    [TRAINER_SIS_AND_BRO_LIL_IAN_3] = {\n        .trainerClass = TRAINER_CLASS_SIS_AND_BRO,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SIS_AND_BRO,\n        .trainerName = _(\"LIL & IAN\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SisAndBroLilIan3),\n    },\n    [TRAINER_SWIMMER_MALE_FINN_2] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"FINN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleFinn2),\n    },\n    [TRAINER_CRUSH_GIRL_SHARON_2] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_GIRL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_GIRL,\n        .trainerName = _(\"SHARON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlSharon2),\n    },\n    [TRAINER_CRUSH_GIRL_SHARON_3] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_GIRL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_GIRL,\n        .trainerName = _(\"SHARON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlSharon3),\n    },\n    [TRAINER_CRUSH_GIRL_TANYA_2] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_GIRL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_GIRL,\n        .trainerName = _(\"TANYA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlTanya2),\n    },\n    [TRAINER_CRUSH_GIRL_TANYA_3] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_GIRL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_GIRL,\n        .trainerName = _(\"TANYA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlTanya3),\n    },\n    [TRAINER_BLACK_BELT_SHEA_2] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"SHEA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltShea2),\n    },\n    [TRAINER_BLACK_BELT_SHEA_3] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"SHEA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltShea3),\n    },\n    [TRAINER_BLACK_BELT_HUGH_2] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"HUGH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltHugh2),\n    },\n    [TRAINER_BLACK_BELT_HUGH_3] = {\n        .trainerClass = TRAINER_CLASS_BLACK_BELT,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_BLACK_BELT,\n        .trainerName = _(\"HUGH\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_BlackBeltHugh3),\n    },\n    [TRAINER_CRUSH_KIN_MIK_KIA_2] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_KIN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_KIN,\n        .trainerName = _(\"MIK & KIA\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushKinMikKia2),\n    },\n    [TRAINER_CRUSH_KIN_MIK_KIA_3] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_KIN,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_KIN,\n        .trainerName = _(\"MIK & KIA\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushKinMikKia3),\n    },\n    [TRAINER_TUBER_AMIRA_2] = {\n        .trainerClass = TRAINER_CLASS_TUBER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,\n        .trainerPic = TRAINER_PIC_TUBER_F,\n        .trainerName = _(\"AMIRA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TuberAmira2),\n    },\n    [TRAINER_TWINS_JOY_MEG_2] = {\n        .trainerClass = TRAINER_CLASS_TWINS,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,\n        .trainerPic = TRAINER_PIC_TWINS,\n        .trainerName = _(\"JOY & MEG\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TwinsJoyMeg2),\n    },\n    [TRAINER_PAINTER_RAYNA_2] = {\n        .trainerClass = TRAINER_CLASS_PAINTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_PAINTER,\n        .trainerName = _(\"RAYNA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PainterRayna2),\n    },\n    [TRAINER_YOUNGSTER_DESTIN_2] = {\n        .trainerClass = TRAINER_CLASS_YOUNGSTER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_YOUNGSTER,\n        .trainerName = _(\"DESTIN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungsterDestin2),\n    },\n    [TRAINER_PKMN_BREEDER_ALIZE_2] = {\n        .trainerClass = TRAINER_CLASS_PKMN_BREEDER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,\n        .trainerPic = TRAINER_PIC_POKEMON_BREEDER,\n        .trainerName = _(\"ALIZE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PkmnBreederAlize2),\n    },\n    [TRAINER_YOUNG_COUPLE_GIA_JES_2] = {\n        .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,\n        .trainerPic = TRAINER_PIC_YOUNG_COUPLE,\n        .trainerName = _(\"GIA & JES\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungCoupleGiaJes2),\n    },\n    [TRAINER_YOUNG_COUPLE_GIA_JES_3] = {\n        .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,\n        .trainerPic = TRAINER_PIC_YOUNG_COUPLE,\n        .trainerName = _(\"GIA & JES\"),\n        .items = {},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_YoungCoupleGiaJes3),\n    },\n    [TRAINER_BIRD_KEEPER_MILO_2] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"MILO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperMilo2),\n    },\n    [TRAINER_BIRD_KEEPER_CHAZ_2] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"CHAZ\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperChaz2),\n    },\n    [TRAINER_BIRD_KEEPER_HAROLD_2] = {\n        .trainerClass = TRAINER_CLASS_BIRD_KEEPER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_BIRD_KEEPER,\n        .trainerName = _(\"HAROLD\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BirdKeeperHarold2),\n    },\n    [TRAINER_SWIMMER_FEMALE_NICOLE_2] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"NICOLE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleNicole2),\n    },\n    [TRAINER_PSYCHIC_JACLYN_2] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PSYCHIC_F,\n        .trainerName = _(\"JACLYN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PsychicJaclyn2),\n    },\n    [TRAINER_SWIMMER_MALE_SAMIR_2] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"SAMIR\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleSamir2),\n    },\n    [TRAINER_HIKER_EARL_2] = {\n        .trainerClass = TRAINER_CLASS_HIKER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_HIKER,\n        .trainerName = _(\"EARL\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_HikerEarl2),\n    },\n    [TRAINER_RUIN_MANIAC_LARRY_2] = {\n        .trainerClass = TRAINER_CLASS_RUIN_MANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_RUIN_MANIAC,\n        .trainerName = _(\"LARRY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_RuinManiacLarry2),\n    },\n    [TRAINER_POKEMANIAC_HECTOR_2] = {\n        .trainerClass = TRAINER_CLASS_POKEMANIAC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,\n        .trainerPic = TRAINER_PIC_POKEMANIAC,\n        .trainerName = _(\"HECTOR\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_PokemaniacHector2),\n    },\n    [TRAINER_PSYCHIC_DARIO_2] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_PSYCHIC_M,\n        .trainerName = _(\"DARIO\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PsychicDario2),\n    },\n    [TRAINER_PSYCHIC_RODETTE_2] = {\n        .trainerClass = TRAINER_CLASS_PSYCHIC,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_PSYCHIC_F,\n        .trainerName = _(\"RODETTE\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PsychicRodette2),\n    },\n    [TRAINER_JUGGLER_MASON_2] = {\n        .trainerClass = TRAINER_CLASS_JUGGLER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_JUGGLER,\n        .trainerName = _(\"MASON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_JugglerMason2),\n    },\n    [TRAINER_PKMN_RANGER_NICOLAS_2] = {\n        .trainerClass = TRAINER_CLASS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_POKEMON_RANGER_M,\n        .trainerName = _(\"NICOLAS\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerNicolas2),\n    },\n    [TRAINER_PKMN_RANGER_MADELINE_2] = {\n        .trainerClass = TRAINER_CLASS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,\n        .trainerName = _(\"MADELINE\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerMadeline2),\n    },\n    [TRAINER_CRUSH_GIRL_CYNDY_2] = {\n        .trainerClass = TRAINER_CLASS_CRUSH_GIRL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,\n        .trainerPic = TRAINER_PIC_CRUSH_GIRL,\n        .trainerName = _(\"CYNDY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = ITEM_DEFAULT_MOVES(sParty_CrushGirlCyndy2),\n    },\n    [TRAINER_TAMER_EVAN_2] = {\n        .trainerClass = TRAINER_CLASS_TAMER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,\n        .trainerPic = TRAINER_PIC_TAMER,\n        .trainerName = _(\"EVAN\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_TamerEvan2),\n    },\n    [TRAINER_PKMN_RANGER_JACKSON_2] = {\n        .trainerClass = TRAINER_CLASS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_POKEMON_RANGER_M,\n        .trainerName = _(\"JACKSON\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerJackson2),\n    },\n    [TRAINER_PKMN_RANGER_KATELYN_2] = {\n        .trainerClass = TRAINER_CLASS_PKMN_RANGER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,\n        .trainerName = _(\"KATELYN\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_PkmnRangerKatelyn2),\n    },\n    [TRAINER_COOLTRAINER_LEROY_2] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_M,\n        .trainerName = _(\"LEROY\"),\n        .items = {ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerLeroy2),\n    },\n    [TRAINER_COOLTRAINER_MICHELLE_2] = {\n        .trainerClass = TRAINER_CLASS_COOLTRAINER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_COOLTRAINER_F,\n        .trainerName = _(\"MICHELLE\"),\n        .items = {ITEM_HYPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CooltrainerMichelle2),\n    },\n    [TRAINER_COOL_COUPLE_LEX_NYA_2] = {\n        .trainerClass = TRAINER_CLASS_COOL_COUPLE,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,\n        .trainerPic = TRAINER_PIC_COOL_COUPLE,\n        .trainerName = _(\"LEX & NYA\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = TRUE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = NO_ITEM_CUSTOM_MOVES(sParty_CoolCoupleLexNya2),\n    },\n    [TRAINER_BUG_CATCHER_COLTON_2] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"COLTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherColton2),\n    },\n    [TRAINER_BUG_CATCHER_COLTON_3] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"COLTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherColton3),\n    },\n    [TRAINER_BUG_CATCHER_COLTON_4] = {\n        .trainerClass = TRAINER_CLASS_BUG_CATCHER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_BUG_CATCHER,\n        .trainerName = _(\"COLTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_BugCatcherColton4),\n    },\n    [TRAINER_SWIMMER_MALE_MATTHEW_2] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"MATTHEW\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleMatthew2),\n    },\n    [TRAINER_SWIMMER_MALE_TONY_2] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_M,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,\n        .trainerPic = TRAINER_PIC_SWIMMER_M,\n        .trainerName = _(\"TONY\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerMaleTony2),\n    },\n    [TRAINER_SWIMMER_FEMALE_MELISSA_2] = {\n        .trainerClass = TRAINER_CLASS_SWIMMER_F,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_SWIMMER_F,\n        .trainerName = _(\"MELISSA\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_SwimmerFemaleMelissa2),\n    },\n    [TRAINER_ELITE_FOUR_LORELEI_2] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_LORELEI,\n        .trainerName = _(\"LORELEI\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_EliteFourLorelei2),\n    },\n    [TRAINER_ELITE_FOUR_BRUNO_2] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_BRUNO,\n        .trainerName = _(\"BRUNO\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_EliteFourBruno2),\n    },\n    [TRAINER_ELITE_FOUR_AGATHA_2] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_AGATHA,\n        .trainerName = _(\"AGATHA\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_EliteFourAgatha2),\n    },\n    [TRAINER_ELITE_FOUR_LANCE_2] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_LANCE,\n        .trainerName = _(\"LANCE\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_EliteFourLance2),\n    },\n    [TRAINER_CHAMPION_REMATCH_SQUIRTLE] = {\n        .trainerClass = TRAINER_CLASS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_RIVAL,\n        .trainerName = _(\"TERRY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_ChampionRematchSquirtle),\n    },\n    [TRAINER_CHAMPION_REMATCH_BULBASAUR] = {\n        .trainerClass = TRAINER_CLASS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_RIVAL,\n        .trainerName = _(\"TERRY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_ChampionRematchBulbasaur),\n    },\n    [TRAINER_CHAMPION_REMATCH_CHARMANDER] = {\n        .trainerClass = TRAINER_CLASS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_RIVAL,\n        .trainerName = _(\"TERRY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_ChampionRematchCharmander),\n    },\n    [TRAINER_CUE_BALL_PAXTON] = {\n        .trainerClass = TRAINER_CLASS_CUE_BALL,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CUE_BALL,\n        .trainerName = _(\"PAXTON\"),\n        .items = {},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,\n        .party = NO_ITEM_DEFAULT_MOVES(sParty_CueBallPaxton),\n    },\n    [TRAINER_LEADER_BROCK_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_BROCK,\n        .trainerName = _(\"BROCK\"),\n        .items = {ITEM_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderBrockChallenge),\n    },\n    [TRAINER_LEADER_MISTY_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_MISTY,\n        .trainerName = _(\"MISTY\"),\n        .items = {ITEM_SUPER_POTION},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderMistyChallenge),\n    },\n    [TRAINER_LEADER_LT_SURGE_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_LT_SURGE,\n        .trainerName = _(\"LT. SURGE\"),\n        .items = {ITEM_HYPER_POTION, ITEM_FULL_HEAL},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderLtSurgeChallenge),\n        \n    },\n    [TRAINER_LEADER_ERIKA_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_ERIKA,\n        .trainerName = _(\"ERIKA\"),\n        .items = {ITEM_HYPER_POTION, ITEM_FULL_HEAL},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_LeaderErikaChallenge),\n    },\n    [TRAINER_LEADER_KOGA_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_KOGA,\n        .trainerName = _(\"KOGA\"),\n        .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderKogaChallenge),\n    },\n    [TRAINER_LEADER_SABRINA_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_SABRINA,\n        .trainerName = _(\"SABRINA\"),\n        .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderSabrinaChallenge),\n    },\n    [TRAINER_LEADER_BLAINE_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_BLAINE,\n        .trainerName = _(\"BLAINE\"),\n        .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderBlaineChallenge),\n    },\n    [TRAINER_LEADER_GIOVANNI_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,\n        .trainerPic = TRAINER_PIC_LEADER_GIOVANNI,\n        .trainerName = _(\"GIOVANNI\"),\n        .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderGiovanniChallenge),\n    },\n    [TRAINER_ELITE_FOUR_LORELEI_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_LORELEI,\n        .trainerName = _(\"LORELEI\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_EliteFourLoreleiChallenge),\n    },\n    [TRAINER_ELITE_FOUR_BRUNO_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_BRUNO,\n        .trainerName = _(\"BRUNO\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_EliteFourBrunoChallenge),\n    },\n    [TRAINER_ELITE_FOUR_AGATHA_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_AGATHA,\n        .trainerName = _(\"AGATHA\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_EliteFourAgathaChallenge),\n    },\n    [TRAINER_ELITE_FOUR_LANCE_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_LANCE,\n        .trainerName = _(\"LANCE\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_EliteFourLanceChallenge),\n    },\n    [TRAINER_CHAMPION_FIRST_SQUIRTLE_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_RIVAL,\n        .trainerName = _(\"TERRY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_ChampionFirstSquirtleChallenge),\n    },\n    [TRAINER_CHAMPION_FIRST_BULBASAUR_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_RIVAL,\n        .trainerName = _(\"TERRY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_ChampionFirstBulbasaurChallenge),\n    },\n    [TRAINER_CHAMPION_FIRST_CHARMANDER_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_RIVAL,\n        .trainerName = _(\"TERRY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_ChampionFirstCharmanderChallenge),\n    },\n    [TRAINER_ELITE_FOUR_LORELEI_CHALLENGE_2] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_LORELEI,\n        .trainerName = _(\"LORELEI\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_EliteFourLoreleiChallenge2),\n    },\n    [TRAINER_ELITE_FOUR_BRUNO_CHALLENGE_2] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_BRUNO,\n        .trainerName = _(\"BRUNO\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_EliteFourBrunoChallenge2),\n    },\n    [TRAINER_ELITE_FOUR_AGATHA_CHALLENGE_2] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_AGATHA,\n        .trainerName = _(\"AGATHA\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_EliteFourAgathaChallenge2),\n    },\n    [TRAINER_ELITE_FOUR_LANCE_CHALLENGE_2] = {\n        .trainerClass = TRAINER_CLASS_ELITE_FOUR,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,\n        .trainerPic = TRAINER_PIC_ELITE_FOUR_LANCE,\n        .trainerName = _(\"LANCE\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_EliteFourLanceChallenge2),\n    },\n    [TRAINER_CHAMPION_REMATCH_SQUIRTLE_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_RIVAL,\n        .trainerName = _(\"TERRY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_ChampionRematchSquirtleChallenge),\n    },\n    [TRAINER_CHAMPION_REMATCH_BULBASAUR_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_RIVAL,\n        .trainerName = _(\"TERRY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_ChampionRematchBulbasaurChallenge),\n    },\n    [TRAINER_CHAMPION_REMATCH_CHARMANDER_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_CHAMPION,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_CHAMPION_RIVAL,\n        .trainerName = _(\"TERRY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_ChampionRematchCharmanderChallenge),\n    },\n    [TRAINER_BROCK_REMATCH] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_BROCK,\n        .trainerName = _(\"BROCK\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderBrockRematch),\n    },\n    [TRAINER_BROCK_REMATCH_CHALLENGE] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,\n        .trainerPic = TRAINER_PIC_LEADER_BROCK,\n        .trainerName = _(\"BROCK\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = CUSTOM_MOVES_EVS(sParty_LeaderBrockRematchChallenge),\n    },\n    [TRAINER_MISTY_REMATCH] = {\n        .trainerClass = TRAINER_CLASS_LEADER,\n        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE | F_TRAINER_FEMALE,\n        .trainerPic = TRAINER_PIC_LEADER_MISTY,\n        .trainerName = _(\"MISTY\"),\n        .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},\n        .doubleBattle = FALSE,\n        .aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,\n        .party = ITEM_CUSTOM_MOVES(sParty_LeaderMistyRematch),\n    },\n};\n"
  },
  {
    "path": "src/data/union_room.h",
    "content": "static const u8 *const sLinkGroupActivityNameTexts[] = {\n    [ACTIVITY_NONE]            = gText_UR_EmptyString,\n    [ACTIVITY_BATTLE_SINGLE]   = gText_UR_SingleBattle,\n    [ACTIVITY_BATTLE_DOUBLE]   = gText_UR_DoubleBattle,\n    [ACTIVITY_BATTLE_MULTI]    = gText_UR_MultiBattle,\n    [ACTIVITY_TRADE]           = gText_UR_PokemonTrades,\n    [ACTIVITY_CHAT]            = gText_UR_Chat,\n    [ACTIVITY_WONDER_CARD_DUP] = gText_UR_WonderCards,\n    [ACTIVITY_WONDER_NEWS_DUP] = gText_UR_WonderNews,\n    [ACTIVITY_CARD]            = gText_UR_Cards,\n    [ACTIVITY_POKEMON_JUMP]    = gText_UR_PokemonJump,\n    [ACTIVITY_BERRY_CRUSH]     = gText_UR_BerryCrush,\n    [ACTIVITY_BERRY_PICK]      = gText_UR_BerryPicking,\n    [ACTIVITY_SEARCH]          = gText_UR_Search,\n    [ACTIVITY_SPIN_TRADE]      = gText_UR_SpinTrade,\n    [ACTIVITY_ITEM_TRADE]      = gText_UR_ItemTrade,\n    [ACTIVITY_RECORD_CORNER]   = gText_UR_EmptyString,\n    [ACTIVITY_BERRY_BLENDER]   = gText_UR_EmptyString,\n    [ACTIVITY_ACCEPT]          = gText_UR_EmptyString,\n    [ACTIVITY_DECLINE]         = gText_UR_EmptyString,\n    [ACTIVITY_NPCTALK]         = gText_UR_EmptyString,\n    [ACTIVITY_PLYRTALK]        = gText_UR_EmptyString,\n    [ACTIVITY_WONDER_CARD]     = gText_UR_WonderCards,\n    [ACTIVITY_WONDER_NEWS]     = gText_UR_WonderNews\n};\n\nstatic const struct WindowTemplate sWindowTemplate_BButtonCancel = {\n    .bg = 0,\n    .tilemapLeft = 0,\n    .tilemapTop = 0,\n    .width = 30,\n    .height = 2,\n    .paletteNum = 15,\n    .baseBlock = 0x008\n};\n\n// Minimum and maximum number of players for a link group\n// A minimum of 0 means the min and max are equal\n#define LINK_GROUP_CAPACITY(min, max)(((min) << 12) | ((max) << 8))\n#define GROUP_MAX(capacity)(capacity & 0x0F)\n#define GROUP_MIN(capacity)(capacity >> 4)\n#define GROUP_MIN2(capacity)(capacity & 0xF0) // Unnecessary to have both, but needed to match\n\nstatic const u32 sLinkGroupToActivityAndCapacity[] = {\n    [LINK_GROUP_SINGLE_BATTLE] = ACTIVITY_BATTLE_SINGLE     | LINK_GROUP_CAPACITY(0, 2),\n    [LINK_GROUP_DOUBLE_BATTLE] = ACTIVITY_BATTLE_DOUBLE     | LINK_GROUP_CAPACITY(0, 2),\n    [LINK_GROUP_MULTI_BATTLE]  = ACTIVITY_BATTLE_MULTI      | LINK_GROUP_CAPACITY(0, 4),\n    [LINK_GROUP_TRADE]         = ACTIVITY_TRADE             | LINK_GROUP_CAPACITY(0, 2),\n    [LINK_GROUP_POKEMON_JUMP]  = ACTIVITY_POKEMON_JUMP      | LINK_GROUP_CAPACITY(2, 5),\n    [LINK_GROUP_BERRY_CRUSH]   = ACTIVITY_BERRY_CRUSH       | LINK_GROUP_CAPACITY(2, 5),\n    [LINK_GROUP_BERRY_PICKING] = ACTIVITY_BERRY_PICK        | LINK_GROUP_CAPACITY(3, 5),\n    [LINK_GROUP_WONDER_CARD]   = ACTIVITY_SPIN_TRADE        | LINK_GROUP_CAPACITY(3, 5),\n    [LINK_GROUP_WONDER_NEWS]   = ACTIVITY_ITEM_TRADE        | LINK_GROUP_CAPACITY(3, 5)\n};\n\nstatic const struct WindowTemplate sWindowTemplate_List_PossibleGroupMembers = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 3,\n    .width = 13,\n    .height = 10,\n    .paletteNum = 15,\n    .baseBlock = 0x044\n};\n\nstatic const struct WindowTemplate sWindowTemplate_NumPlayerMode = {\n    .bg = 0,\n    .tilemapLeft = 16,\n    .tilemapTop = 3,\n    .width = 7,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x0C6\n};\n\nconst struct ListMenuItem sListMenuItems_PossibleGroupMembers[] = {\n    {gText_UR_EmptyString, 0},\n    {gText_UR_EmptyString, 1},\n    {gText_UR_EmptyString, 2},\n    {gText_UR_EmptyString, 3},\n    {gText_UR_EmptyString, 4}\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_PossibleGroupMembers = {\n    .items = sListMenuItems_PossibleGroupMembers,\n    .moveCursorFunc = NULL,\n    .itemPrintFunc = ItemPrintFunc_PossibleGroupMembers,\n    .totalItems = ARRAY_COUNT(sListMenuItems_PossibleGroupMembers),\n    .maxShowed = 5,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 1,\n    .cursor_X = 0,\n    .upText_Y = 0,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 0,\n    .itemVerticalPadding = 2,\n    .scrollMultiple = LIST_NO_MULTIPLE_SCROLL,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 1\n};\n\nstatic const struct WindowTemplate sWindowTemplate_GroupList = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 3,\n    .width = 17,\n    .height = 10,\n    .paletteNum = 15,\n    .baseBlock = 0x044\n};\n\nstatic const struct WindowTemplate sWindowTemplate_PlayerNameAndId = {\n    .bg = 0,\n    .tilemapLeft = 20,\n    .tilemapTop = 3,\n    .width = 7,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x0EE\n};\n\nstatic const struct ListMenuItem sListMenuItems_UnionRoomGroups[] = {\n    {gText_UR_EmptyString,  0},\n    {gText_UR_EmptyString,  1},\n    {gText_UR_EmptyString,  2},\n    {gText_UR_EmptyString,  3},\n    {gText_UR_EmptyString,  4},\n    {gText_UR_EmptyString,  5},\n    {gText_UR_EmptyString,  6},\n    {gText_UR_EmptyString,  7},\n    {gText_UR_EmptyString,  8},\n    {gText_UR_EmptyString,  9},\n    {gText_UR_EmptyString, 10},\n    {gText_UR_EmptyString, 11},\n    {gText_UR_EmptyString, 12},\n    {gText_UR_EmptyString, 13},\n    {gText_UR_EmptyString, 14},\n    {gText_UR_EmptyString, 15}\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_UnionRoomGroups = {\n    .items = sListMenuItems_UnionRoomGroups,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = ListMenuItemPrintFunc_UnionRoomGroups,\n    .totalItems = ARRAY_COUNT(sListMenuItems_UnionRoomGroups),\n    .maxShowed = 5,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 8,\n    .cursor_X = 0,\n    .upText_Y = 0,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 0,\n    .itemVerticalPadding = 2,\n    .scrollMultiple = LIST_MULTIPLE_SCROLL_DPAD,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0\n};\n\nstatic const struct WindowTemplate sWindowTemplate_InviteToActivity = {\n    .bg = 0,\n    .tilemapLeft = 20,\n    .tilemapTop = 6,\n    .width = 8,\n    .height = 7,\n    .paletteNum = 15,\n    .baseBlock = 0x001\n};\n\nstatic const struct ListMenuItem sListMenuItems_InviteToActivity[] = {\n    {gText_UR_Greetings, ACTIVITY_CARD | LINK_GROUP_CAPACITY(0, 2)},\n    {gText_UR_Battle,    ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM | LINK_GROUP_CAPACITY(0, 2)},\n    {gText_UR_Chat2,     ACTIVITY_CHAT | IN_UNION_ROOM | LINK_GROUP_CAPACITY(0, 2)},\n    {gText_UR_Exit,      ACTIVITY_NONE | IN_UNION_ROOM }\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_InviteToActivity = {\n    .items = sListMenuItems_InviteToActivity,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = NULL,\n    .totalItems = ARRAY_COUNT(sListMenuItems_InviteToActivity),\n    .maxShowed = 4,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 8,\n    .cursor_X = 0,\n    .upText_Y = 0,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 1,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = LIST_NO_MULTIPLE_SCROLL,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0\n};\n\nstatic const struct WindowTemplate sWindowTemplate_RegisterForTrade = {\n    .bg = 0,\n    .tilemapLeft = 18,\n    .tilemapTop = 8,\n    .width = 11,\n    .height = 5,\n    .paletteNum = 15,\n    .baseBlock = 0x001\n};\n\nstatic const struct ListMenuItem sListMenuItems_RegisterForTrade[] = {\n    {gText_Register,  1},\n    {gText_UR_Info,   2},\n    {gText_UR_Exit,   3}\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_RegisterForTrade = {\n    .items = sListMenuItems_RegisterForTrade,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = NULL,\n    .totalItems = ARRAY_COUNT(sListMenuItems_RegisterForTrade),\n    .maxShowed = 3,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 8,\n    .cursor_X = 0,\n    .upText_Y = 0,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 1,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = LIST_NO_MULTIPLE_SCROLL,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0\n};\n\nstatic const struct WindowTemplate sWindowTemplate_TypeNames = {\n    .bg = 0,\n    .tilemapLeft = 20,\n    .tilemapTop = 2,\n    .width = 9,\n    .height = 11,\n    .paletteNum = 15,\n    .baseBlock = 0x001\n};\n\nstatic const struct ListMenuItem sListMenuItems_TypeNames[NUMBER_OF_MON_TYPES] = {\n    { gTypeNames[TYPE_NORMAL],   TYPE_NORMAL         },\n    { gTypeNames[TYPE_FIRE],     TYPE_FIRE           },\n    { gTypeNames[TYPE_WATER],    TYPE_WATER          },\n    { gTypeNames[TYPE_ELECTRIC], TYPE_ELECTRIC       },\n    { gTypeNames[TYPE_GRASS],    TYPE_GRASS          },\n    { gTypeNames[TYPE_ICE],      TYPE_ICE            },\n    { gTypeNames[TYPE_GROUND],   TYPE_GROUND         },\n    { gTypeNames[TYPE_ROCK],     TYPE_ROCK           },\n    { gTypeNames[TYPE_FLYING],   TYPE_FLYING         },\n    { gTypeNames[TYPE_PSYCHIC],  TYPE_PSYCHIC        },\n    { gTypeNames[TYPE_FIGHTING], TYPE_FIGHTING       },\n    { gTypeNames[TYPE_POISON],   TYPE_POISON         },\n    { gTypeNames[TYPE_BUG],      TYPE_BUG            },\n    { gTypeNames[TYPE_GHOST],    TYPE_GHOST          },\n    { gTypeNames[TYPE_DRAGON],   TYPE_DRAGON         },\n    { gTypeNames[TYPE_STEEL],    TYPE_STEEL          },\n    { gTypeNames[TYPE_DARK],     TYPE_DARK           },\n    { gText_UR_Exit,             NUMBER_OF_MON_TYPES }\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_TypeNames = {\n    .items = sListMenuItems_TypeNames,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = NULL,\n    .totalItems = NUMBER_OF_MON_TYPES,\n    .maxShowed = 6,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 8,\n    .cursor_X = 0,\n    .upText_Y = 2,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 1,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = LIST_NO_MULTIPLE_SCROLL,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0\n};\n\nstatic const struct WindowTemplate sWindowTemplate_TradingBoardHeader = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 1,\n    .width = 28,\n    .height = 2,\n    .paletteNum = 13,\n    .baseBlock = 0x001\n};\n\nstatic const struct WindowTemplate sWindowTemplate_TradingBoardMain = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 5,\n    .width = 28,\n    .height = 10,\n    .paletteNum = 13,\n    .baseBlock = 0x039\n};\n\nstatic const struct ListMenuItem sListMenuItems_TradeBoard[] = {\n    {gText_UR_EmptyString, -3},\n    {gText_UR_EmptyString, 0},\n    {gText_UR_EmptyString, 1},\n    {gText_UR_EmptyString, 2},\n    {gText_UR_EmptyString, 3},\n    {gText_UR_EmptyString, 4},\n    {gText_UR_EmptyString, 5},\n    {gText_UR_EmptyString, 6},\n    {gText_UR_EmptyString, 7},\n    {gText_UR_Exit2, 8}\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_TradeBoard = {\n    .items = sListMenuItems_TradeBoard,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = TradeBoardListMenuItemPrintFunc,\n    .totalItems = ARRAY_COUNT(sListMenuItems_TradeBoard),\n    .maxShowed = 5,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 12,\n    .cursor_X = 0,\n    .upText_Y = 2,\n    .cursorPal = 14,\n    .fillValue = 15,\n    .cursorShadowPal = 13,\n    .lettersSpacing = 1,\n    .itemVerticalPadding = 1,\n    .scrollMultiple = LIST_NO_MULTIPLE_SCROLL,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0\n};\n\nstatic const struct WindowTemplate sWindowTemplate_Unused = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 5,\n    .width = 28,\n    .height = 10,\n    .paletteNum = 13,\n    .baseBlock = 0x039\n};\n\nstatic const struct ListMenuItem sListMenuItems_Unused[] = {\n    {gText_UR_EmptyString,  0},\n    {gText_UR_EmptyString,  1},\n    {gText_UR_EmptyString,  2},\n    {gText_UR_EmptyString,  3},\n    {gText_UR_EmptyString,  4},\n    {gText_UR_EmptyString,  5},\n    {gText_UR_EmptyString,  6},\n    {gText_UR_EmptyString,  7},\n    {gText_UR_EmptyString,  8},\n    {gText_UR_EmptyString,  9},\n    {gText_UR_EmptyString, 10},\n    {gText_UR_EmptyString, 11},\n    {gText_UR_EmptyString, 12},\n    {gText_UR_EmptyString, 13},\n    {gText_UR_EmptyString, 14},\n    {gText_UR_EmptyString, 15}\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_Unused = {\n    .items = sListMenuItems_Unused,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = ItemPrintFunc_Unused,\n    .totalItems = ARRAY_COUNT(sListMenuItems_Unused),\n    .maxShowed = 4,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 8,\n    .cursor_X = 1,\n    .upText_Y = 0,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 1,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = LIST_MULTIPLE_SCROLL_DPAD,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0\n};\n\nstatic const struct RfuPlayerData sRfuPlayerData_Dummy = {};\n\nALIGNED(4) static const u8 sAcceptedActivityIds_SingleBattle[] = {ACTIVITY_BATTLE_SINGLE, 0xFF};\nALIGNED(4) static const u8 sAcceptedActivityIds_DoubleBattle[] = {ACTIVITY_BATTLE_DOUBLE, 0xFF};\nALIGNED(4) static const u8 sAcceptedActivityIds_MultiBattle[] = {ACTIVITY_BATTLE_MULTI, 0xFF};\nALIGNED(4) static const u8 sAcceptedActivityIds_Trade[] = {ACTIVITY_TRADE, 0xFF};\nALIGNED(4) static const u8 sAcceptedActivityIds_PokemonJump[] = {ACTIVITY_POKEMON_JUMP, 0xFF};\nALIGNED(4) static const u8 sAcceptedActivityIds_BerryCrush[] = {ACTIVITY_BERRY_CRUSH, 0xFF};\nALIGNED(4) static const u8 sAcceptedActivityIds_BerryPicking[] = {ACTIVITY_BERRY_PICK, 0xFF};\nALIGNED(4) static const u8 sAcceptedActivityIds_WonderCard[] = {ACTIVITY_WONDER_CARD, 0xFF};\nALIGNED(4) static const u8 sAcceptedActivityIds_WonderNews[] = {ACTIVITY_WONDER_NEWS, 0xFF};\nALIGNED(4) static const u8 sAcceptedActivityIds_Resume[] = {\n    IN_UNION_ROOM | ACTIVITY_NONE,\n    IN_UNION_ROOM | ACTIVITY_BATTLE_SINGLE,\n    IN_UNION_ROOM | ACTIVITY_TRADE,\n    IN_UNION_ROOM | ACTIVITY_CHAT,\n    IN_UNION_ROOM | ACTIVITY_CARD,\n    IN_UNION_ROOM | ACTIVITY_ACCEPT,\n    IN_UNION_ROOM | ACTIVITY_DECLINE,\n    IN_UNION_ROOM | ACTIVITY_NPCTALK,\n    IN_UNION_ROOM | ACTIVITY_PLYRTALK,\n    0xFF\n};\nALIGNED(4) static const u8 sAcceptedActivityIds_Init[] = {ACTIVITY_SEARCH, 0xFF};\nALIGNED(4) static const u8 sAcceptedActivityIds_Unk11[] = {\n    ACTIVITY_BATTLE_SINGLE,\n    ACTIVITY_BATTLE_DOUBLE,\n    ACTIVITY_BATTLE_MULTI,\n    ACTIVITY_TRADE,\n    ACTIVITY_POKEMON_JUMP,\n    ACTIVITY_BERRY_CRUSH,\n    ACTIVITY_BERRY_PICK,\n    ACTIVITY_WONDER_CARD,\n    ACTIVITY_WONDER_NEWS,\n    ACTIVITY_SPIN_TRADE,\n    0xFF\n};\nALIGNED(4) static const u8 sAcceptedActivityIds_Unk12[] = {\n    ACTIVITY_BATTLE_SINGLE,\n    ACTIVITY_BATTLE_DOUBLE,\n    ACTIVITY_BATTLE_MULTI,\n    ACTIVITY_TRADE,\n    ACTIVITY_BERRY_CRUSH,\n    0xFF\n};\n\nstatic const u8 *const sAcceptedActivityIds[NUM_LINK_GROUP_TYPES] = {\n    [LINK_GROUP_SINGLE_BATTLE]     = sAcceptedActivityIds_SingleBattle,\n    [LINK_GROUP_DOUBLE_BATTLE]     = sAcceptedActivityIds_DoubleBattle,\n    [LINK_GROUP_MULTI_BATTLE]      = sAcceptedActivityIds_MultiBattle,\n    [LINK_GROUP_TRADE]             = sAcceptedActivityIds_Trade,\n    [LINK_GROUP_POKEMON_JUMP]      = sAcceptedActivityIds_PokemonJump,\n    [LINK_GROUP_BERRY_CRUSH]       = sAcceptedActivityIds_BerryCrush,\n    [LINK_GROUP_BERRY_PICKING]     = sAcceptedActivityIds_BerryPicking,\n    [LINK_GROUP_WONDER_CARD]       = sAcceptedActivityIds_WonderCard,\n    [LINK_GROUP_WONDER_NEWS]       = sAcceptedActivityIds_WonderNews,\n    [LINK_GROUP_UNION_ROOM_RESUME] = sAcceptedActivityIds_Resume,\n    [LINK_GROUP_UNION_ROOM_INIT]   = sAcceptedActivityIds_Init,\n    [LINK_GROUP_UNK_11]            = sAcceptedActivityIds_Unk11,\n    [LINK_GROUP_UNK_12]            = sAcceptedActivityIds_Unk12,\n};\n\nstatic const u8 sLinkGroupToURoomActivity[] = {\n    [LINK_GROUP_SINGLE_BATTLE] = ACTIVITY_BATTLE_SINGLE,\n    [LINK_GROUP_DOUBLE_BATTLE] = ACTIVITY_BATTLE_DOUBLE,\n    [LINK_GROUP_MULTI_BATTLE]  = ACTIVITY_BATTLE_MULTI,\n    [LINK_GROUP_TRADE]         = ACTIVITY_TRADE,\n    [LINK_GROUP_POKEMON_JUMP]  = ACTIVITY_POKEMON_JUMP,\n    [LINK_GROUP_BERRY_CRUSH]   = ACTIVITY_BERRY_CRUSH,\n    [LINK_GROUP_BERRY_PICKING] = ACTIVITY_BERRY_PICK,\n    [LINK_GROUP_WONDER_CARD]   = ACTIVITY_WONDER_CARD,\n    [LINK_GROUP_WONDER_NEWS]   = ACTIVITY_WONDER_NEWS\n};\n\n// Unused\nstatic const u8 sDotSeparatedValues[] = _(\"{DYNAMIC 00}·{DYNAMIC 01}\");\n"
  },
  {
    "path": "src/data/wild_encounters.h",
    "content": "#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_0 20  \n#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_1 ENCOUNTER_CHANCE_LAND_MONS_SLOT_0 + 20 \n#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_2 ENCOUNTER_CHANCE_LAND_MONS_SLOT_1 + 10 \n#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_3 ENCOUNTER_CHANCE_LAND_MONS_SLOT_2 + 10 \n#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_4 ENCOUNTER_CHANCE_LAND_MONS_SLOT_3 + 10 \n#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_5 ENCOUNTER_CHANCE_LAND_MONS_SLOT_4 + 10 \n#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_6 ENCOUNTER_CHANCE_LAND_MONS_SLOT_5 + 5 \n#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_7 ENCOUNTER_CHANCE_LAND_MONS_SLOT_6 + 5 \n#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_8 ENCOUNTER_CHANCE_LAND_MONS_SLOT_7 + 4 \n#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_9 ENCOUNTER_CHANCE_LAND_MONS_SLOT_8 + 4 \n#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_10 ENCOUNTER_CHANCE_LAND_MONS_SLOT_9 + 1 \n#define ENCOUNTER_CHANCE_LAND_MONS_SLOT_11 ENCOUNTER_CHANCE_LAND_MONS_SLOT_10 + 1 \n#define ENCOUNTER_CHANCE_LAND_MONS_TOTAL (ENCOUNTER_CHANCE_LAND_MONS_SLOT_11)\n\n#define ENCOUNTER_CHANCE_WATER_MONS_SLOT_0 60  \n#define ENCOUNTER_CHANCE_WATER_MONS_SLOT_1 ENCOUNTER_CHANCE_WATER_MONS_SLOT_0 + 30 \n#define ENCOUNTER_CHANCE_WATER_MONS_SLOT_2 ENCOUNTER_CHANCE_WATER_MONS_SLOT_1 + 5 \n#define ENCOUNTER_CHANCE_WATER_MONS_SLOT_3 ENCOUNTER_CHANCE_WATER_MONS_SLOT_2 + 4 \n#define ENCOUNTER_CHANCE_WATER_MONS_SLOT_4 ENCOUNTER_CHANCE_WATER_MONS_SLOT_3 + 1 \n#define ENCOUNTER_CHANCE_WATER_MONS_TOTAL (ENCOUNTER_CHANCE_WATER_MONS_SLOT_4)\n\n#define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_0 60  \n#define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_1 ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_0 + 30 \n#define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_2 ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_1 + 5 \n#define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_3 ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_2 + 4 \n#define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_4 ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_3 + 1 \n#define ENCOUNTER_CHANCE_ROCK_SMASH_MONS_TOTAL (ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_4)\n\n#define ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2 60 \n#define ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3 ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2 + 20\n#define ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_4 ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3 + 20\n#define ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_TOTAL (ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_4)\n\n#define ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_0 70 \n#define ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_1 ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_0 + 30\n#define ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_TOTAL (ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_1)\n\n#define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5 40 \n#define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6 ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5 + 40\n#define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7 ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6 + 15\n#define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8 ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7 + 4\n#define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_9 ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8 + 1\n#define ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_TOTAL (ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_9)\n\nconst struct WildPokemon sSevenIslandTanobyRuinsMoneanChamber_FireRed_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsMoneanChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsMoneanChamber_FireRed_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsLiptooChamber_FireRed_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsLiptooChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsLiptooChamber_FireRed_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsWeepthChamber_FireRed_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsWeepthChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsWeepthChamber_FireRed_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsDilfordChamber_FireRed_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsDilfordChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsDilfordChamber_FireRed_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsScufibChamber_FireRed_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsScufibChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsScufibChamber_FireRed_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsRixyChamber_FireRed_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsRixyChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsRixyChamber_FireRed_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsViapoisChamber_FireRed_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsViapoisChamber_FireRed_LandMonsInfo = { 7, sSevenIslandTanobyRuinsViapoisChamber_FireRed_LandMons };\n\nconst struct WildPokemon sViridianForest_FireRed_LandMons[] =\n{\n    { 4, 4, SPECIES_CATERPIE },\n    { 4, 4, SPECIES_WEEDLE },\n    { 5, 5, SPECIES_CATERPIE },\n    { 5, 5, SPECIES_WEEDLE },\n    { 3, 3, SPECIES_CATERPIE },\n    { 3, 3, SPECIES_WEEDLE },\n    { 5, 5, SPECIES_METAPOD },\n    { 5, 5, SPECIES_KAKUNA },\n    { 4, 4, SPECIES_KAKUNA },\n    { 3, 3, SPECIES_PIKACHU },\n    { 6, 6, SPECIES_KAKUNA },\n    { 5, 5, SPECIES_PIKACHU },\n};\n\nconst struct WildPokemonInfo sViridianForest_FireRed_LandMonsInfo = { 14, sViridianForest_FireRed_LandMons };\n\nconst struct WildPokemon sMtMoon1F_FireRed_LandMons[] =\n{\n    { 7, 7, SPECIES_ZUBAT },\n    { 8, 8, SPECIES_ZUBAT },\n    { 7, 7, SPECIES_GEODUDE },\n    { 9, 9, SPECIES_ZUBAT },\n    { 10, 10, SPECIES_ZUBAT },\n    { 8, 8, SPECIES_GEODUDE },\n    { 9, 9, SPECIES_GEODUDE },\n    { 8, 8, SPECIES_PARAS },\n    { 7, 7, SPECIES_ZUBAT },\n    { 7, 7, SPECIES_ZUBAT },\n    { 7, 7, SPECIES_ZUBAT },\n    { 8, 8, SPECIES_CLEFAIRY },\n};\n\nconst struct WildPokemonInfo sMtMoon1F_FireRed_LandMonsInfo = { 7, sMtMoon1F_FireRed_LandMons };\n\nconst struct WildPokemon sMtMoonB1F_FireRed_LandMons[] =\n{\n    { 7, 7, SPECIES_PARAS },\n    { 8, 8, SPECIES_PARAS },\n    { 5, 5, SPECIES_PARAS },\n    { 6, 6, SPECIES_PARAS },\n    { 9, 9, SPECIES_PARAS },\n    { 10, 10, SPECIES_PARAS },\n    { 7, 7, SPECIES_PARAS },\n    { 8, 8, SPECIES_PARAS },\n    { 5, 5, SPECIES_PARAS },\n    { 6, 6, SPECIES_PARAS },\n    { 9, 9, SPECIES_PARAS },\n    { 10, 10, SPECIES_PARAS },\n};\n\nconst struct WildPokemonInfo sMtMoonB1F_FireRed_LandMonsInfo = { 5, sMtMoonB1F_FireRed_LandMons };\n\nconst struct WildPokemon sMtMoonB2F_FireRed_LandMons[] =\n{\n    { 8, 8, SPECIES_ZUBAT },\n    { 9, 9, SPECIES_GEODUDE },\n    { 9, 9, SPECIES_ZUBAT },\n    { 10, 10, SPECIES_ZUBAT },\n    { 10, 10, SPECIES_GEODUDE },\n    { 10, 10, SPECIES_PARAS },\n    { 12, 12, SPECIES_PARAS },\n    { 10, 10, SPECIES_CLEFAIRY },\n    { 11, 11, SPECIES_ZUBAT },\n    { 11, 11, SPECIES_ZUBAT },\n    { 11, 11, SPECIES_ZUBAT },\n    { 12, 12, SPECIES_CLEFAIRY },\n};\n\nconst struct WildPokemonInfo sMtMoonB2F_FireRed_LandMonsInfo = { 7, sMtMoonB2F_FireRed_LandMons };\n\nconst struct WildPokemon sSSAnneExterior_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sSSAnneExterior_FireRed_WaterMonsInfo = { 1, sSSAnneExterior_FireRed_WaterMons };\n\nconst struct WildPokemon sSSAnneExterior_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_SHELLDER },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_HORSEA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sSSAnneExterior_FireRed_FishingMonsInfo = { 10, sSSAnneExterior_FireRed_FishingMons };\n\nconst struct WildPokemon sDiglettsCaveB1F_FireRed_LandMons[] =\n{\n    { 18, 18, SPECIES_DIGLETT },\n    { 19, 19, SPECIES_DIGLETT },\n    { 17, 17, SPECIES_DIGLETT },\n    { 15, 15, SPECIES_DIGLETT },\n    { 16, 16, SPECIES_DIGLETT },\n    { 20, 20, SPECIES_DIGLETT },\n    { 21, 21, SPECIES_DIGLETT },\n    { 22, 22, SPECIES_DIGLETT },\n    { 17, 17, SPECIES_DIGLETT },\n    { 29, 29, SPECIES_DUGTRIO },\n    { 17, 17, SPECIES_DIGLETT },\n    { 31, 31, SPECIES_DUGTRIO },\n};\n\nconst struct WildPokemonInfo sDiglettsCaveB1F_FireRed_LandMonsInfo = { 5, sDiglettsCaveB1F_FireRed_LandMons };\n\nconst struct WildPokemon sVictoryRoad1F_FireRed_LandMons[] =\n{\n    { 32, 32, SPECIES_MACHOP },\n    { 32, 32, SPECIES_GEODUDE },\n    { 40, 40, SPECIES_ONIX },\n    { 43, 43, SPECIES_ONIX },\n    { 46, 46, SPECIES_ONIX },\n    { 32, 32, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_ARBOK },\n    { 44, 44, SPECIES_GOLBAT },\n    { 44, 44, SPECIES_MAROWAK },\n    { 44, 44, SPECIES_MACHOKE },\n    { 46, 46, SPECIES_MACHOKE },\n    { 46, 46, SPECIES_MAROWAK },\n};\n\nconst struct WildPokemonInfo sVictoryRoad1F_FireRed_LandMonsInfo = { 7, sVictoryRoad1F_FireRed_LandMons };\n\nconst struct WildPokemon sVictoryRoad2F_FireRed_LandMons[] =\n{\n    { 34, 34, SPECIES_MACHOP },\n    { 34, 34, SPECIES_GEODUDE },\n    { 42, 42, SPECIES_PRIMEAPE },\n    { 45, 45, SPECIES_ONIX },\n    { 48, 48, SPECIES_ONIX },\n    { 34, 34, SPECIES_ZUBAT },\n    { 46, 46, SPECIES_ARBOK },\n    { 46, 46, SPECIES_GOLBAT },\n    { 46, 46, SPECIES_MAROWAK },\n    { 46, 46, SPECIES_MACHOKE },\n    { 48, 48, SPECIES_MACHOKE },\n    { 48, 48, SPECIES_MAROWAK },\n};\n\nconst struct WildPokemonInfo sVictoryRoad2F_FireRed_LandMonsInfo = { 7, sVictoryRoad2F_FireRed_LandMons };\n\nconst struct WildPokemon sVictoryRoad3F_FireRed_LandMons[] =\n{\n    { 32, 32, SPECIES_MACHOP },\n    { 32, 32, SPECIES_GEODUDE },\n    { 40, 40, SPECIES_ONIX },\n    { 43, 43, SPECIES_ONIX },\n    { 46, 46, SPECIES_ONIX },\n    { 32, 32, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_ARBOK },\n    { 44, 44, SPECIES_GOLBAT },\n    { 44, 44, SPECIES_MAROWAK },\n    { 44, 44, SPECIES_MACHOKE },\n    { 46, 46, SPECIES_MACHOKE },\n    { 46, 46, SPECIES_MAROWAK },\n};\n\nconst struct WildPokemonInfo sVictoryRoad3F_FireRed_LandMonsInfo = { 7, sVictoryRoad3F_FireRed_LandMons };\n\nconst struct WildPokemon sPokemonMansion1F_FireRed_LandMons[] =\n{\n    { 28, 28, SPECIES_KOFFING },\n    { 32, 32, SPECIES_RATICATE },\n    { 30, 30, SPECIES_KOFFING },\n    { 36, 36, SPECIES_RATICATE },\n    { 30, 30, SPECIES_GROWLITHE },\n    { 28, 28, SPECIES_RATTATA },\n    { 28, 28, SPECIES_GRIMER },\n    { 32, 32, SPECIES_WEEZING },\n    { 32, 32, SPECIES_GROWLITHE },\n    { 26, 26, SPECIES_RATTATA },\n    { 32, 32, SPECIES_GROWLITHE },\n    { 26, 26, SPECIES_RATTATA },\n};\n\nconst struct WildPokemonInfo sPokemonMansion1F_FireRed_LandMonsInfo = { 7, sPokemonMansion1F_FireRed_LandMons };\n\nconst struct WildPokemon sPokemonMansion2F_FireRed_LandMons[] =\n{\n    { 28, 28, SPECIES_KOFFING },\n    { 32, 32, SPECIES_RATICATE },\n    { 30, 30, SPECIES_KOFFING },\n    { 36, 36, SPECIES_RATICATE },\n    { 30, 30, SPECIES_GROWLITHE },\n    { 28, 28, SPECIES_RATTATA },\n    { 28, 28, SPECIES_GRIMER },\n    { 32, 32, SPECIES_WEEZING },\n    { 32, 32, SPECIES_GROWLITHE },\n    { 26, 26, SPECIES_RATTATA },\n    { 32, 32, SPECIES_GROWLITHE },\n    { 26, 26, SPECIES_RATTATA },\n};\n\nconst struct WildPokemonInfo sPokemonMansion2F_FireRed_LandMonsInfo = { 7, sPokemonMansion2F_FireRed_LandMons };\n\nconst struct WildPokemon sPokemonMansion3F_FireRed_LandMons[] =\n{\n    { 28, 28, SPECIES_KOFFING },\n    { 32, 32, SPECIES_RATICATE },\n    { 30, 30, SPECIES_KOFFING },\n    { 36, 36, SPECIES_RATICATE },\n    { 30, 30, SPECIES_GROWLITHE },\n    { 28, 28, SPECIES_RATTATA },\n    { 28, 28, SPECIES_GRIMER },\n    { 32, 32, SPECIES_WEEZING },\n    { 32, 32, SPECIES_GROWLITHE },\n    { 26, 26, SPECIES_RATTATA },\n    { 32, 32, SPECIES_GROWLITHE },\n    { 26, 26, SPECIES_RATTATA },\n};\n\nconst struct WildPokemonInfo sPokemonMansion3F_FireRed_LandMonsInfo = { 7, sPokemonMansion3F_FireRed_LandMons };\n\nconst struct WildPokemon sPokemonMansionB1F_FireRed_LandMons[] =\n{\n    { 28, 28, SPECIES_KOFFING },\n    { 34, 34, SPECIES_RATICATE },\n    { 30, 30, SPECIES_KOFFING },\n    { 30, 30, SPECIES_DITTO },\n    { 30, 30, SPECIES_GROWLITHE },\n    { 38, 38, SPECIES_RATICATE },\n    { 28, 28, SPECIES_GRIMER },\n    { 34, 34, SPECIES_WEEZING },\n    { 32, 32, SPECIES_GROWLITHE },\n    { 26, 26, SPECIES_RATTATA },\n    { 32, 32, SPECIES_GROWLITHE },\n    { 26, 26, SPECIES_RATTATA },\n};\n\nconst struct WildPokemonInfo sPokemonMansionB1F_FireRed_LandMonsInfo = { 5, sPokemonMansionB1F_FireRed_LandMons };\n\nconst struct WildPokemon sSafariZoneCenter_FireRed_LandMons[] =\n{\n    { 25, 25, SPECIES_RHYHORN },\n    { 22, 22, SPECIES_NIDORAN_M },\n    { 24, 24, SPECIES_EXEGGCUTE },\n    { 25, 25, SPECIES_EXEGGCUTE },\n    { 22, 22, SPECIES_VENONAT },\n    { 31, 31, SPECIES_NIDORINO },\n    { 31, 31, SPECIES_NIDORINA },\n    { 30, 30, SPECIES_PARASECT },\n    { 22, 22, SPECIES_VENONAT },\n    { 23, 23, SPECIES_SCYTHER },\n    { 22, 22, SPECIES_VENONAT },\n    { 23, 23, SPECIES_CHANSEY },\n};\n\nconst struct WildPokemonInfo sSafariZoneCenter_FireRed_LandMonsInfo = { 21, sSafariZoneCenter_FireRed_LandMons };\n\nconst struct WildPokemon sSafariZoneCenter_FireRed_WaterMons[] =\n{\n    { 20, 25, SPECIES_PSYDUCK },\n    { 20, 25, SPECIES_PSYDUCK },\n    { 25, 30, SPECIES_PSYDUCK },\n    { 30, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sSafariZoneCenter_FireRed_WaterMonsInfo = { 2, sSafariZoneCenter_FireRed_WaterMons };\n\nconst struct WildPokemon sSafariZoneCenter_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 15, 25, SPECIES_GOLDEEN },\n    { 20, 30, SPECIES_SEAKING },\n    { 15, 25, SPECIES_DRATINI },\n    { 15, 35, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_DRAGONAIR },\n};\n\nconst struct WildPokemonInfo sSafariZoneCenter_FireRed_FishingMonsInfo = { 20, sSafariZoneCenter_FireRed_FishingMons };\n\nconst struct WildPokemon sSafariZoneEast_FireRed_LandMons[] =\n{\n    { 24, 24, SPECIES_NIDORAN_M },\n    { 26, 26, SPECIES_DODUO },\n    { 23, 23, SPECIES_EXEGGCUTE },\n    { 25, 25, SPECIES_EXEGGCUTE },\n    { 22, 22, SPECIES_PARAS },\n    { 33, 33, SPECIES_NIDORINO },\n    { 24, 24, SPECIES_NIDORAN_F },\n    { 25, 25, SPECIES_PARASECT },\n    { 22, 22, SPECIES_PARAS },\n    { 25, 25, SPECIES_KANGASKHAN },\n    { 22, 22, SPECIES_PARAS },\n    { 28, 28, SPECIES_SCYTHER },\n};\n\nconst struct WildPokemonInfo sSafariZoneEast_FireRed_LandMonsInfo = { 21, sSafariZoneEast_FireRed_LandMons };\n\nconst struct WildPokemon sSafariZoneEast_FireRed_WaterMons[] =\n{\n    { 20, 25, SPECIES_PSYDUCK },\n    { 20, 25, SPECIES_PSYDUCK },\n    { 25, 30, SPECIES_PSYDUCK },\n    { 30, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sSafariZoneEast_FireRed_WaterMonsInfo = { 2, sSafariZoneEast_FireRed_WaterMons };\n\nconst struct WildPokemon sSafariZoneEast_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 15, 25, SPECIES_GOLDEEN },\n    { 20, 30, SPECIES_SEAKING },\n    { 15, 25, SPECIES_DRATINI },\n    { 15, 35, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_DRAGONAIR },\n};\n\nconst struct WildPokemonInfo sSafariZoneEast_FireRed_FishingMonsInfo = { 20, sSafariZoneEast_FireRed_FishingMons };\n\nconst struct WildPokemon sSafariZoneNorth_FireRed_LandMons[] =\n{\n    { 26, 26, SPECIES_RHYHORN },\n    { 30, 30, SPECIES_NIDORAN_M },\n    { 25, 25, SPECIES_EXEGGCUTE },\n    { 27, 27, SPECIES_EXEGGCUTE },\n    { 23, 23, SPECIES_PARAS },\n    { 30, 30, SPECIES_NIDORINO },\n    { 30, 30, SPECIES_NIDORINA },\n    { 32, 32, SPECIES_VENOMOTH },\n    { 23, 23, SPECIES_PARAS },\n    { 26, 26, SPECIES_CHANSEY },\n    { 23, 23, SPECIES_PARAS },\n    { 28, 28, SPECIES_TAUROS },\n};\n\nconst struct WildPokemonInfo sSafariZoneNorth_FireRed_LandMonsInfo = { 21, sSafariZoneNorth_FireRed_LandMons };\n\nconst struct WildPokemon sSafariZoneNorth_FireRed_WaterMons[] =\n{\n    { 20, 25, SPECIES_PSYDUCK },\n    { 20, 25, SPECIES_PSYDUCK },\n    { 25, 30, SPECIES_PSYDUCK },\n    { 30, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sSafariZoneNorth_FireRed_WaterMonsInfo = { 2, sSafariZoneNorth_FireRed_WaterMons };\n\nconst struct WildPokemon sSafariZoneNorth_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 15, 25, SPECIES_GOLDEEN },\n    { 20, 30, SPECIES_SEAKING },\n    { 15, 25, SPECIES_DRATINI },\n    { 15, 35, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_DRAGONAIR },\n};\n\nconst struct WildPokemonInfo sSafariZoneNorth_FireRed_FishingMonsInfo = { 20, sSafariZoneNorth_FireRed_FishingMons };\n\nconst struct WildPokemon sSafariZoneWest_FireRed_LandMons[] =\n{\n    { 26, 26, SPECIES_DODUO },\n    { 22, 22, SPECIES_NIDORAN_M },\n    { 25, 25, SPECIES_EXEGGCUTE },\n    { 27, 27, SPECIES_EXEGGCUTE },\n    { 23, 23, SPECIES_VENONAT },\n    { 30, 30, SPECIES_NIDORINO },\n    { 30, 30, SPECIES_NIDORAN_F },\n    { 32, 32, SPECIES_VENOMOTH },\n    { 23, 23, SPECIES_VENONAT },\n    { 25, 25, SPECIES_TAUROS },\n    { 23, 23, SPECIES_VENONAT },\n    { 28, 28, SPECIES_KANGASKHAN },\n};\n\nconst struct WildPokemonInfo sSafariZoneWest_FireRed_LandMonsInfo = { 21, sSafariZoneWest_FireRed_LandMons };\n\nconst struct WildPokemon sSafariZoneWest_FireRed_WaterMons[] =\n{\n    { 20, 25, SPECIES_PSYDUCK },\n    { 20, 25, SPECIES_PSYDUCK },\n    { 25, 30, SPECIES_PSYDUCK },\n    { 30, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sSafariZoneWest_FireRed_WaterMonsInfo = { 2, sSafariZoneWest_FireRed_WaterMons };\n\nconst struct WildPokemon sSafariZoneWest_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 15, 25, SPECIES_GOLDEEN },\n    { 20, 30, SPECIES_SEAKING },\n    { 15, 25, SPECIES_DRATINI },\n    { 15, 35, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_DRAGONAIR },\n};\n\nconst struct WildPokemonInfo sSafariZoneWest_FireRed_FishingMonsInfo = { 20, sSafariZoneWest_FireRed_FishingMons };\n\nconst struct WildPokemon sCeruleanCave1F_FireRed_LandMons[] =\n{\n    { 49, 49, SPECIES_MAGNETON },\n    { 49, 49, SPECIES_PARASECT },\n    { 46, 46, SPECIES_GOLBAT },\n    { 46, 46, SPECIES_MACHOKE },\n    { 52, 52, SPECIES_PRIMEAPE },\n    { 52, 52, SPECIES_DITTO },\n    { 58, 58, SPECIES_ELECTRODE },\n    { 58, 58, SPECIES_PARASECT },\n    { 55, 55, SPECIES_GOLBAT },\n    { 55, 55, SPECIES_WOBBUFFET },\n    { 61, 61, SPECIES_PRIMEAPE },\n    { 61, 61, SPECIES_DITTO },\n};\n\nconst struct WildPokemonInfo sCeruleanCave1F_FireRed_LandMonsInfo = { 7, sCeruleanCave1F_FireRed_LandMons };\n\nconst struct WildPokemon sCeruleanCave1F_FireRed_WaterMons[] =\n{\n    { 30, 40, SPECIES_PSYDUCK },\n    { 40, 50, SPECIES_GOLDUCK },\n    { 45, 55, SPECIES_GOLDUCK },\n    { 40, 50, SPECIES_PSYDUCK },\n    { 40, 50, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sCeruleanCave1F_FireRed_WaterMonsInfo = { 2, sCeruleanCave1F_FireRed_WaterMons };\n\nconst struct WildPokemon sCeruleanCave1F_FireRed_RockSmashMons[] =\n{\n    { 30, 40, SPECIES_GEODUDE },\n    { 40, 50, SPECIES_GRAVELER },\n    { 45, 55, SPECIES_GRAVELER },\n    { 40, 50, SPECIES_GEODUDE },\n    { 40, 50, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sCeruleanCave1F_FireRed_RockSmashMonsInfo = { 50, sCeruleanCave1F_FireRed_RockSmashMons };\n\nconst struct WildPokemon sCeruleanCave1F_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sCeruleanCave1F_FireRed_FishingMonsInfo = { 20, sCeruleanCave1F_FireRed_FishingMons };\n\nconst struct WildPokemon sCeruleanCave2F_FireRed_LandMons[] =\n{\n    { 49, 49, SPECIES_GOLBAT },\n    { 49, 49, SPECIES_MACHOKE },\n    { 52, 52, SPECIES_MAGNETON },\n    { 52, 52, SPECIES_PARASECT },\n    { 55, 55, SPECIES_KADABRA },\n    { 55, 55, SPECIES_DITTO },\n    { 58, 58, SPECIES_GOLBAT },\n    { 58, 58, SPECIES_WOBBUFFET },\n    { 61, 61, SPECIES_ELECTRODE },\n    { 61, 61, SPECIES_PARASECT },\n    { 64, 64, SPECIES_KADABRA },\n    { 64, 64, SPECIES_DITTO },\n};\n\nconst struct WildPokemonInfo sCeruleanCave2F_FireRed_LandMonsInfo = { 7, sCeruleanCave2F_FireRed_LandMons };\n\nconst struct WildPokemon sCeruleanCave2F_FireRed_RockSmashMons[] =\n{\n    { 35, 45, SPECIES_GEODUDE },\n    { 45, 55, SPECIES_GRAVELER },\n    { 50, 60, SPECIES_GRAVELER },\n    { 45, 55, SPECIES_GEODUDE },\n    { 45, 55, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sCeruleanCave2F_FireRed_RockSmashMonsInfo = { 50, sCeruleanCave2F_FireRed_RockSmashMons };\n\nconst struct WildPokemon sCeruleanCaveB1F_FireRed_LandMons[] =\n{\n    { 58, 58, SPECIES_KADABRA },\n    { 58, 58, SPECIES_DITTO },\n    { 55, 55, SPECIES_MAGNETON },\n    { 55, 55, SPECIES_PARASECT },\n    { 52, 52, SPECIES_GOLBAT },\n    { 52, 52, SPECIES_MACHOKE },\n    { 67, 67, SPECIES_KADABRA },\n    { 67, 67, SPECIES_DITTO },\n    { 64, 64, SPECIES_ELECTRODE },\n    { 64, 64, SPECIES_PARASECT },\n    { 61, 61, SPECIES_GOLBAT },\n    { 61, 61, SPECIES_WOBBUFFET },\n};\n\nconst struct WildPokemonInfo sCeruleanCaveB1F_FireRed_LandMonsInfo = { 7, sCeruleanCaveB1F_FireRed_LandMons };\n\nconst struct WildPokemon sCeruleanCaveB1F_FireRed_WaterMons[] =\n{\n    { 40, 50, SPECIES_PSYDUCK },\n    { 50, 60, SPECIES_GOLDUCK },\n    { 55, 65, SPECIES_GOLDUCK },\n    { 50, 60, SPECIES_PSYDUCK },\n    { 50, 60, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sCeruleanCaveB1F_FireRed_WaterMonsInfo = { 2, sCeruleanCaveB1F_FireRed_WaterMons };\n\nconst struct WildPokemon sCeruleanCaveB1F_FireRed_RockSmashMons[] =\n{\n    { 40, 50, SPECIES_GEODUDE },\n    { 50, 60, SPECIES_GRAVELER },\n    { 55, 65, SPECIES_GRAVELER },\n    { 50, 60, SPECIES_GEODUDE },\n    { 50, 60, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sCeruleanCaveB1F_FireRed_RockSmashMonsInfo = { 50, sCeruleanCaveB1F_FireRed_RockSmashMons };\n\nconst struct WildPokemon sCeruleanCaveB1F_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_GYARADOS },\n};\n\nconst struct WildPokemonInfo sCeruleanCaveB1F_FireRed_FishingMonsInfo = { 20, sCeruleanCaveB1F_FireRed_FishingMons };\n\nconst struct WildPokemon sRockTunnel1F_FireRed_LandMons[] =\n{\n    { 15, 15, SPECIES_ZUBAT },\n    { 16, 16, SPECIES_GEODUDE },\n    { 16, 16, SPECIES_MANKEY },\n    { 17, 17, SPECIES_GEODUDE },\n    { 16, 16, SPECIES_ZUBAT },\n    { 16, 16, SPECIES_MACHOP },\n    { 17, 17, SPECIES_MANKEY },\n    { 17, 17, SPECIES_MACHOP },\n    { 15, 15, SPECIES_GEODUDE },\n    { 13, 13, SPECIES_ONIX },\n    { 15, 15, SPECIES_GEODUDE },\n    { 15, 15, SPECIES_ONIX },\n};\n\nconst struct WildPokemonInfo sRockTunnel1F_FireRed_LandMonsInfo = { 7, sRockTunnel1F_FireRed_LandMons };\n\nconst struct WildPokemon sRockTunnelB1F_FireRed_LandMons[] =\n{\n    { 16, 16, SPECIES_ZUBAT },\n    { 17, 17, SPECIES_GEODUDE },\n    { 17, 17, SPECIES_MANKEY },\n    { 16, 16, SPECIES_GEODUDE },\n    { 15, 15, SPECIES_ZUBAT },\n    { 17, 17, SPECIES_MACHOP },\n    { 16, 16, SPECIES_MANKEY },\n    { 13, 13, SPECIES_ONIX },\n    { 15, 15, SPECIES_GEODUDE },\n    { 15, 15, SPECIES_ONIX },\n    { 15, 15, SPECIES_GEODUDE },\n    { 17, 17, SPECIES_ONIX },\n};\n\nconst struct WildPokemonInfo sRockTunnelB1F_FireRed_LandMonsInfo = { 7, sRockTunnelB1F_FireRed_LandMons };\n\nconst struct WildPokemon sRockTunnelB1F_FireRed_RockSmashMons[] =\n{\n    { 5, 20, SPECIES_GEODUDE },\n    { 10, 20, SPECIES_GEODUDE },\n    { 15, 30, SPECIES_GEODUDE },\n    { 25, 40, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GRAVELER },\n};\n\nconst struct WildPokemonInfo sRockTunnelB1F_FireRed_RockSmashMonsInfo = { 50, sRockTunnelB1F_FireRed_RockSmashMons };\n\nconst struct WildPokemon sSeafoamIslands1F_FireRed_LandMons[] =\n{\n    { 27, 27, SPECIES_PSYDUCK },\n    { 29, 29, SPECIES_PSYDUCK },\n    { 31, 31, SPECIES_PSYDUCK },\n    { 22, 22, SPECIES_ZUBAT },\n    { 22, 22, SPECIES_ZUBAT },\n    { 24, 24, SPECIES_ZUBAT },\n    { 26, 26, SPECIES_GOLBAT },\n    { 28, 28, SPECIES_GOLBAT },\n    { 33, 33, SPECIES_PSYDUCK },\n    { 26, 26, SPECIES_ZUBAT },\n    { 26, 26, SPECIES_PSYDUCK },\n    { 30, 30, SPECIES_GOLBAT },\n};\n\nconst struct WildPokemonInfo sSeafoamIslands1F_FireRed_LandMonsInfo = { 7, sSeafoamIslands1F_FireRed_LandMons };\n\nconst struct WildPokemon sSeafoamIslandsB1F_FireRed_LandMons[] =\n{\n    { 29, 29, SPECIES_PSYDUCK },\n    { 31, 31, SPECIES_PSYDUCK },\n    { 28, 28, SPECIES_SEEL },\n    { 22, 22, SPECIES_ZUBAT },\n    { 22, 22, SPECIES_ZUBAT },\n    { 24, 24, SPECIES_ZUBAT },\n    { 26, 26, SPECIES_GOLBAT },\n    { 28, 28, SPECIES_GOLBAT },\n    { 33, 33, SPECIES_GOLDUCK },\n    { 26, 26, SPECIES_ZUBAT },\n    { 35, 35, SPECIES_GOLDUCK },\n    { 30, 30, SPECIES_GOLBAT },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB1F_FireRed_LandMonsInfo = { 7, sSeafoamIslandsB1F_FireRed_LandMons };\n\nconst struct WildPokemon sSeafoamIslandsB2F_FireRed_LandMons[] =\n{\n    { 30, 30, SPECIES_PSYDUCK },\n    { 32, 32, SPECIES_PSYDUCK },\n    { 30, 30, SPECIES_SEEL },\n    { 32, 32, SPECIES_SEEL },\n    { 22, 22, SPECIES_ZUBAT },\n    { 24, 24, SPECIES_ZUBAT },\n    { 26, 26, SPECIES_GOLBAT },\n    { 34, 34, SPECIES_GOLDUCK },\n    { 32, 32, SPECIES_GOLDUCK },\n    { 28, 28, SPECIES_GOLBAT },\n    { 32, 32, SPECIES_GOLDUCK },\n    { 30, 30, SPECIES_GOLBAT },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB2F_FireRed_LandMonsInfo = { 7, sSeafoamIslandsB2F_FireRed_LandMons };\n\nconst struct WildPokemon sSeafoamIslandsB3F_FireRed_LandMons[] =\n{\n    { 30, 30, SPECIES_SEEL },\n    { 32, 32, SPECIES_SEEL },\n    { 32, 32, SPECIES_PSYDUCK },\n    { 30, 30, SPECIES_PSYDUCK },\n    { 32, 32, SPECIES_GOLDUCK },\n    { 24, 24, SPECIES_ZUBAT },\n    { 26, 26, SPECIES_GOLBAT },\n    { 34, 34, SPECIES_GOLDUCK },\n    { 32, 32, SPECIES_DEWGONG },\n    { 28, 28, SPECIES_GOLBAT },\n    { 34, 34, SPECIES_DEWGONG },\n    { 30, 30, SPECIES_GOLBAT },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB3F_FireRed_LandMonsInfo = { 7, sSeafoamIslandsB3F_FireRed_LandMons };\n\nconst struct WildPokemon sSeafoamIslandsB3F_FireRed_WaterMons[] =\n{\n    { 25, 35, SPECIES_SEEL },\n    { 25, 30, SPECIES_HORSEA },\n    { 35, 40, SPECIES_DEWGONG },\n    { 30, 40, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_GOLDUCK },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB3F_FireRed_WaterMonsInfo = { 2, sSeafoamIslandsB3F_FireRed_WaterMons };\n\nconst struct WildPokemon sSeafoamIslandsB3F_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 20, 30, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_GYARADOS },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB3F_FireRed_FishingMonsInfo = { 20, sSeafoamIslandsB3F_FireRed_FishingMons };\n\nconst struct WildPokemon sSeafoamIslandsB4F_FireRed_LandMons[] =\n{\n    { 30, 30, SPECIES_SEEL },\n    { 32, 32, SPECIES_SEEL },\n    { 32, 32, SPECIES_PSYDUCK },\n    { 34, 34, SPECIES_SEEL },\n    { 32, 32, SPECIES_GOLDUCK },\n    { 26, 26, SPECIES_GOLBAT },\n    { 34, 34, SPECIES_DEWGONG },\n    { 34, 34, SPECIES_GOLDUCK },\n    { 36, 36, SPECIES_DEWGONG },\n    { 28, 28, SPECIES_GOLBAT },\n    { 36, 36, SPECIES_DEWGONG },\n    { 30, 30, SPECIES_GOLBAT },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB4F_FireRed_LandMonsInfo = { 7, sSeafoamIslandsB4F_FireRed_LandMons };\n\nconst struct WildPokemon sSeafoamIslandsB4F_FireRed_WaterMons[] =\n{\n    { 25, 35, SPECIES_SEEL },\n    { 25, 30, SPECIES_HORSEA },\n    { 35, 40, SPECIES_DEWGONG },\n    { 30, 40, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_GOLDUCK },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB4F_FireRed_WaterMonsInfo = { 2, sSeafoamIslandsB4F_FireRed_WaterMons };\n\nconst struct WildPokemon sSeafoamIslandsB4F_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 20, 30, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_GYARADOS },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB4F_FireRed_FishingMonsInfo = { 20, sSeafoamIslandsB4F_FireRed_FishingMons };\n\nconst struct WildPokemon sPokemonTower3F_FireRed_LandMons[] =\n{\n    { 15, 15, SPECIES_GASTLY },\n    { 16, 16, SPECIES_GASTLY },\n    { 17, 17, SPECIES_GASTLY },\n    { 13, 13, SPECIES_GASTLY },\n    { 14, 14, SPECIES_GASTLY },\n    { 18, 18, SPECIES_GASTLY },\n    { 19, 19, SPECIES_GASTLY },\n    { 15, 15, SPECIES_CUBONE },\n    { 17, 17, SPECIES_GASTLY },\n    { 17, 17, SPECIES_CUBONE },\n    { 17, 17, SPECIES_GASTLY },\n    { 20, 20, SPECIES_HAUNTER },\n};\n\nconst struct WildPokemonInfo sPokemonTower3F_FireRed_LandMonsInfo = { 2, sPokemonTower3F_FireRed_LandMons };\n\nconst struct WildPokemon sPokemonTower4F_FireRed_LandMons[] =\n{\n    { 15, 15, SPECIES_GASTLY },\n    { 16, 16, SPECIES_GASTLY },\n    { 17, 17, SPECIES_GASTLY },\n    { 13, 13, SPECIES_GASTLY },\n    { 14, 14, SPECIES_GASTLY },\n    { 18, 18, SPECIES_GASTLY },\n    { 20, 20, SPECIES_HAUNTER },\n    { 15, 15, SPECIES_CUBONE },\n    { 17, 17, SPECIES_GASTLY },\n    { 17, 17, SPECIES_CUBONE },\n    { 17, 17, SPECIES_GASTLY },\n    { 19, 19, SPECIES_GASTLY },\n};\n\nconst struct WildPokemonInfo sPokemonTower4F_FireRed_LandMonsInfo = { 4, sPokemonTower4F_FireRed_LandMons };\n\nconst struct WildPokemon sPokemonTower5F_FireRed_LandMons[] =\n{\n    { 15, 15, SPECIES_GASTLY },\n    { 16, 16, SPECIES_GASTLY },\n    { 17, 17, SPECIES_GASTLY },\n    { 13, 13, SPECIES_GASTLY },\n    { 14, 14, SPECIES_GASTLY },\n    { 18, 18, SPECIES_GASTLY },\n    { 20, 20, SPECIES_HAUNTER },\n    { 15, 15, SPECIES_CUBONE },\n    { 17, 17, SPECIES_GASTLY },\n    { 17, 17, SPECIES_CUBONE },\n    { 17, 17, SPECIES_GASTLY },\n    { 19, 19, SPECIES_GASTLY },\n};\n\nconst struct WildPokemonInfo sPokemonTower5F_FireRed_LandMonsInfo = { 6, sPokemonTower5F_FireRed_LandMons };\n\nconst struct WildPokemon sPokemonTower6F_FireRed_LandMons[] =\n{\n    { 16, 16, SPECIES_GASTLY },\n    { 17, 17, SPECIES_GASTLY },\n    { 18, 18, SPECIES_GASTLY },\n    { 14, 14, SPECIES_GASTLY },\n    { 15, 15, SPECIES_GASTLY },\n    { 19, 19, SPECIES_GASTLY },\n    { 21, 21, SPECIES_HAUNTER },\n    { 17, 17, SPECIES_CUBONE },\n    { 18, 18, SPECIES_GASTLY },\n    { 19, 19, SPECIES_CUBONE },\n    { 18, 18, SPECIES_GASTLY },\n    { 23, 23, SPECIES_HAUNTER },\n};\n\nconst struct WildPokemonInfo sPokemonTower6F_FireRed_LandMonsInfo = { 8, sPokemonTower6F_FireRed_LandMons };\n\nconst struct WildPokemon sPokemonTower7F_FireRed_LandMons[] =\n{\n    { 16, 16, SPECIES_GASTLY },\n    { 17, 17, SPECIES_GASTLY },\n    { 18, 18, SPECIES_GASTLY },\n    { 15, 15, SPECIES_GASTLY },\n    { 19, 19, SPECIES_GASTLY },\n    { 23, 23, SPECIES_HAUNTER },\n    { 17, 17, SPECIES_CUBONE },\n    { 19, 19, SPECIES_CUBONE },\n    { 18, 18, SPECIES_GASTLY },\n    { 23, 23, SPECIES_HAUNTER },\n    { 18, 18, SPECIES_GASTLY },\n    { 25, 25, SPECIES_HAUNTER },\n};\n\nconst struct WildPokemonInfo sPokemonTower7F_FireRed_LandMonsInfo = { 10, sPokemonTower7F_FireRed_LandMons };\n\nconst struct WildPokemon sPowerPlant_FireRed_LandMons[] =\n{\n    { 22, 22, SPECIES_VOLTORB },\n    { 22, 22, SPECIES_MAGNEMITE },\n    { 25, 25, SPECIES_VOLTORB },\n    { 25, 25, SPECIES_MAGNEMITE },\n    { 22, 22, SPECIES_PIKACHU },\n    { 24, 24, SPECIES_PIKACHU },\n    { 31, 31, SPECIES_MAGNETON },\n    { 34, 34, SPECIES_MAGNETON },\n    { 26, 26, SPECIES_PIKACHU },\n    { 32, 32, SPECIES_ELECTABUZZ },\n    { 26, 26, SPECIES_PIKACHU },\n    { 35, 35, SPECIES_ELECTABUZZ },\n};\n\nconst struct WildPokemonInfo sPowerPlant_FireRed_LandMonsInfo = { 7, sPowerPlant_FireRed_LandMons };\n\nconst struct WildPokemon sMtEmberExterior_FireRed_LandMons[] =\n{\n    { 30, 30, SPECIES_PONYTA },\n    { 38, 38, SPECIES_FEAROW },\n    { 33, 33, SPECIES_PONYTA },\n    { 32, 32, SPECIES_SPEAROW },\n    { 35, 35, SPECIES_MACHOP },\n    { 33, 33, SPECIES_GEODUDE },\n    { 36, 36, SPECIES_PONYTA },\n    { 40, 40, SPECIES_FEAROW },\n    { 30, 30, SPECIES_SPEAROW },\n    { 39, 39, SPECIES_RAPIDASH },\n    { 30, 30, SPECIES_SPEAROW },\n    { 42, 42, SPECIES_RAPIDASH },\n};\n\nconst struct WildPokemonInfo sMtEmberExterior_FireRed_LandMonsInfo = { 21, sMtEmberExterior_FireRed_LandMons };\n\nconst struct WildPokemon sMtEmberExterior_FireRed_RockSmashMons[] =\n{\n    { 5, 20, SPECIES_GEODUDE },\n    { 10, 20, SPECIES_GEODUDE },\n    { 15, 30, SPECIES_GEODUDE },\n    { 25, 40, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GRAVELER },\n};\n\nconst struct WildPokemonInfo sMtEmberExterior_FireRed_RockSmashMonsInfo = { 50, sMtEmberExterior_FireRed_RockSmashMons };\n\nconst struct WildPokemon sMtEmberSummitPath1F_FireRed_LandMons[] =\n{\n    { 33, 33, SPECIES_GEODUDE },\n    { 35, 35, SPECIES_MACHOP },\n    { 29, 29, SPECIES_GEODUDE },\n    { 31, 31, SPECIES_GEODUDE },\n    { 31, 31, SPECIES_MACHOP },\n    { 33, 33, SPECIES_MACHOP },\n    { 35, 35, SPECIES_GEODUDE },\n    { 37, 37, SPECIES_MACHOP },\n    { 37, 37, SPECIES_GEODUDE },\n    { 39, 39, SPECIES_MACHOP },\n    { 37, 37, SPECIES_GEODUDE },\n    { 39, 39, SPECIES_MACHOP },\n};\n\nconst struct WildPokemonInfo sMtEmberSummitPath1F_FireRed_LandMonsInfo = { 7, sMtEmberSummitPath1F_FireRed_LandMons };\n\nconst struct WildPokemon sMtEmberSummitPath2F_FireRed_LandMons[] =\n{\n    { 34, 34, SPECIES_GEODUDE },\n    { 36, 36, SPECIES_MACHOP },\n    { 30, 30, SPECIES_GEODUDE },\n    { 32, 32, SPECIES_GEODUDE },\n    { 32, 32, SPECIES_MACHOP },\n    { 34, 34, SPECIES_MACHOP },\n    { 38, 38, SPECIES_MACHOKE },\n    { 38, 38, SPECIES_MACHOKE },\n    { 40, 40, SPECIES_MACHOKE },\n    { 40, 40, SPECIES_MACHOKE },\n    { 40, 40, SPECIES_MACHOKE },\n    { 40, 40, SPECIES_MACHOKE },\n};\n\nconst struct WildPokemonInfo sMtEmberSummitPath2F_FireRed_LandMonsInfo = { 7, sMtEmberSummitPath2F_FireRed_LandMons };\n\nconst struct WildPokemon sMtEmberSummitPath2F_FireRed_RockSmashMons[] =\n{\n    { 5, 20, SPECIES_GEODUDE },\n    { 10, 20, SPECIES_GEODUDE },\n    { 15, 30, SPECIES_GEODUDE },\n    { 25, 40, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GRAVELER },\n};\n\nconst struct WildPokemonInfo sMtEmberSummitPath2F_FireRed_RockSmashMonsInfo = { 50, sMtEmberSummitPath2F_FireRed_RockSmashMons };\n\nconst struct WildPokemon sMtEmberSummitPath3F_FireRed_LandMons[] =\n{\n    { 33, 33, SPECIES_GEODUDE },\n    { 35, 35, SPECIES_MACHOP },\n    { 29, 29, SPECIES_GEODUDE },\n    { 31, 31, SPECIES_GEODUDE },\n    { 31, 31, SPECIES_MACHOP },\n    { 33, 33, SPECIES_MACHOP },\n    { 35, 35, SPECIES_GEODUDE },\n    { 37, 37, SPECIES_MACHOP },\n    { 37, 37, SPECIES_GEODUDE },\n    { 39, 39, SPECIES_MACHOP },\n    { 37, 37, SPECIES_GEODUDE },\n    { 39, 39, SPECIES_MACHOP },\n};\n\nconst struct WildPokemonInfo sMtEmberSummitPath3F_FireRed_LandMonsInfo = { 7, sMtEmberSummitPath3F_FireRed_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPath1F_FireRed_LandMons[] =\n{\n    { 36, 36, SPECIES_GEODUDE },\n    { 38, 38, SPECIES_MACHOP },\n    { 32, 32, SPECIES_GEODUDE },\n    { 34, 34, SPECIES_GEODUDE },\n    { 34, 34, SPECIES_MACHOP },\n    { 36, 36, SPECIES_MACHOP },\n    { 38, 38, SPECIES_GEODUDE },\n    { 40, 40, SPECIES_MACHOKE },\n    { 40, 40, SPECIES_GEODUDE },\n    { 42, 42, SPECIES_MACHOKE },\n    { 40, 40, SPECIES_GEODUDE },\n    { 42, 42, SPECIES_MACHOKE },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPath1F_FireRed_LandMonsInfo = { 7, sMtEmberRubyPath1F_FireRed_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPath1F_FireRed_RockSmashMons[] =\n{\n    { 25, 35, SPECIES_GEODUDE },\n    { 30, 45, SPECIES_GRAVELER },\n    { 35, 50, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GEODUDE },\n    { 30, 40, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPath1F_FireRed_RockSmashMonsInfo = { 50, sMtEmberRubyPath1F_FireRed_RockSmashMons };\n\nconst struct WildPokemon sMtEmberRubyPathB1F_FireRed_LandMons[] =\n{\n    { 38, 38, SPECIES_GEODUDE },\n    { 36, 36, SPECIES_GEODUDE },\n    { 34, 34, SPECIES_GEODUDE },\n    { 40, 40, SPECIES_GEODUDE },\n    { 24, 24, SPECIES_SLUGMA },\n    { 26, 26, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 28, 28, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 30, 30, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 30, 30, SPECIES_SLUGMA },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB1F_FireRed_LandMonsInfo = { 7, sMtEmberRubyPathB1F_FireRed_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPathB1F_FireRed_RockSmashMons[] =\n{\n    { 25, 35, SPECIES_GEODUDE },\n    { 30, 45, SPECIES_GRAVELER },\n    { 35, 50, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GEODUDE },\n    { 30, 40, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB1F_FireRed_RockSmashMonsInfo = { 50, sMtEmberRubyPathB1F_FireRed_RockSmashMons };\n\nconst struct WildPokemon sMtEmberRubyPathB2F_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GEODUDE },\n    { 26, 26, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 24, 24, SPECIES_SLUGMA },\n    { 28, 28, SPECIES_SLUGMA },\n    { 30, 30, SPECIES_SLUGMA },\n    { 44, 44, SPECIES_GEODUDE },\n    { 32, 32, SPECIES_SLUGMA },\n    { 44, 44, SPECIES_GEODUDE },\n    { 22, 22, SPECIES_SLUGMA },\n    { 44, 44, SPECIES_GEODUDE },\n    { 22, 22, SPECIES_SLUGMA },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB2F_FireRed_LandMonsInfo = { 7, sMtEmberRubyPathB2F_FireRed_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPathB2F_FireRed_RockSmashMons[] =\n{\n    { 25, 35, SPECIES_GEODUDE },\n    { 30, 45, SPECIES_GRAVELER },\n    { 35, 50, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GEODUDE },\n    { 30, 40, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB2F_FireRed_RockSmashMonsInfo = { 50, sMtEmberRubyPathB2F_FireRed_RockSmashMons };\n\nconst struct WildPokemon sMtEmberRubyPathB3F_FireRed_LandMons[] =\n{\n    { 26, 26, SPECIES_SLUGMA },\n    { 28, 28, SPECIES_SLUGMA },\n    { 30, 30, SPECIES_SLUGMA },\n    { 32, 32, SPECIES_SLUGMA },\n    { 24, 24, SPECIES_SLUGMA },\n    { 22, 22, SPECIES_SLUGMA },\n    { 20, 20, SPECIES_SLUGMA },\n    { 34, 34, SPECIES_SLUGMA },\n    { 36, 36, SPECIES_SLUGMA },\n    { 18, 18, SPECIES_SLUGMA },\n    { 36, 36, SPECIES_SLUGMA },\n    { 18, 18, SPECIES_SLUGMA },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB3F_FireRed_LandMonsInfo = { 7, sMtEmberRubyPathB3F_FireRed_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPathB3F_FireRed_RockSmashMons[] =\n{\n    { 15, 25, SPECIES_SLUGMA },\n    { 25, 35, SPECIES_SLUGMA },\n    { 40, 45, SPECIES_MAGCARGO },\n    { 35, 45, SPECIES_MAGCARGO },\n    { 25, 35, SPECIES_MAGCARGO },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB3F_FireRed_RockSmashMonsInfo = { 50, sMtEmberRubyPathB3F_FireRed_RockSmashMons };\n\nconst struct WildPokemon sMtEmberRubyPathB1FStairs_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GEODUDE },\n    { 26, 26, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 24, 24, SPECIES_SLUGMA },\n    { 28, 28, SPECIES_SLUGMA },\n    { 30, 30, SPECIES_SLUGMA },\n    { 44, 44, SPECIES_GEODUDE },\n    { 32, 32, SPECIES_SLUGMA },\n    { 44, 44, SPECIES_GEODUDE },\n    { 22, 22, SPECIES_SLUGMA },\n    { 44, 44, SPECIES_GEODUDE },\n    { 22, 22, SPECIES_SLUGMA },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB1FStairs_FireRed_LandMonsInfo = { 7, sMtEmberRubyPathB1FStairs_FireRed_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPathB1FStairs_FireRed_RockSmashMons[] =\n{\n    { 25, 35, SPECIES_GEODUDE },\n    { 30, 45, SPECIES_GRAVELER },\n    { 35, 50, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GEODUDE },\n    { 30, 40, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB1FStairs_FireRed_RockSmashMonsInfo = { 50, sMtEmberRubyPathB1FStairs_FireRed_RockSmashMons };\n\nconst struct WildPokemon sMtEmberRubyPathB2FStairs_FireRed_LandMons[] =\n{\n    { 38, 38, SPECIES_GEODUDE },\n    { 36, 36, SPECIES_GEODUDE },\n    { 34, 34, SPECIES_GEODUDE },\n    { 40, 40, SPECIES_GEODUDE },\n    { 24, 24, SPECIES_SLUGMA },\n    { 26, 26, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 28, 28, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 30, 30, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 30, 30, SPECIES_SLUGMA },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB2FStairs_FireRed_LandMonsInfo = { 7, sMtEmberRubyPathB2FStairs_FireRed_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPathB2FStairs_FireRed_RockSmashMons[] =\n{\n    { 25, 35, SPECIES_GEODUDE },\n    { 30, 45, SPECIES_GRAVELER },\n    { 35, 50, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GEODUDE },\n    { 30, 40, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB2FStairs_FireRed_RockSmashMonsInfo = { 50, sMtEmberRubyPathB2FStairs_FireRed_RockSmashMons };\n\nconst struct WildPokemon sThreeIslandBerryForest_FireRed_LandMons[] =\n{\n    { 37, 37, SPECIES_PIDGEOTTO },\n    { 35, 35, SPECIES_GLOOM },\n    { 32, 32, SPECIES_PIDGEY },\n    { 30, 30, SPECIES_ODDISH },\n    { 34, 34, SPECIES_VENONAT },\n    { 34, 34, SPECIES_DROWZEE },\n    { 35, 35, SPECIES_EXEGGCUTE },\n    { 31, 31, SPECIES_PSYDUCK },\n    { 37, 37, SPECIES_VENOMOTH },\n    { 37, 37, SPECIES_HYPNO },\n    { 40, 40, SPECIES_VENOMOTH },\n    { 40, 40, SPECIES_HYPNO },\n};\n\nconst struct WildPokemonInfo sThreeIslandBerryForest_FireRed_LandMonsInfo = { 21, sThreeIslandBerryForest_FireRed_LandMons };\n\nconst struct WildPokemon sThreeIslandBerryForest_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_PSYDUCK },\n    { 20, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_GOLDUCK },\n    { 35, 40, SPECIES_GOLDUCK },\n};\n\nconst struct WildPokemonInfo sThreeIslandBerryForest_FireRed_WaterMonsInfo = { 2, sThreeIslandBerryForest_FireRed_WaterMons };\n\nconst struct WildPokemon sThreeIslandBerryForest_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 15, 25, SPECIES_GOLDEEN },\n    { 20, 30, SPECIES_SEAKING },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sThreeIslandBerryForest_FireRed_FishingMonsInfo = { 20, sThreeIslandBerryForest_FireRed_FishingMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveEntrance_FireRed_LandMons[] =\n{\n    { 43, 43, SPECIES_SEEL },\n    { 45, 45, SPECIES_GOLBAT },\n    { 45, 45, SPECIES_SEEL },\n    { 47, 47, SPECIES_SEEL },\n    { 40, 40, SPECIES_ZUBAT },\n    { 49, 49, SPECIES_DEWGONG },\n    { 51, 51, SPECIES_DEWGONG },\n    { 41, 41, SPECIES_PSYDUCK },\n    { 48, 48, SPECIES_GOLBAT },\n    { 53, 53, SPECIES_DEWGONG },\n    { 48, 48, SPECIES_GOLBAT },\n    { 53, 53, SPECIES_DEWGONG },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveEntrance_FireRed_LandMonsInfo = { 7, sFourIslandIcefallCaveEntrance_FireRed_LandMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveEntrance_FireRed_WaterMons[] =\n{\n    { 5, 35, SPECIES_SEEL },\n    { 5, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_DEWGONG },\n    { 5, 15, SPECIES_WOOPER },\n    { 5, 15, SPECIES_WOOPER },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveEntrance_FireRed_WaterMonsInfo = { 2, sFourIslandIcefallCaveEntrance_FireRed_WaterMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveEntrance_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveEntrance_FireRed_FishingMonsInfo = { 20, sFourIslandIcefallCaveEntrance_FireRed_FishingMons };\n\nconst struct WildPokemon sFourIslandIcefallCave1F_FireRed_LandMons[] =\n{\n    { 25, 25, SPECIES_SWINUB },\n    { 45, 45, SPECIES_GOLBAT },\n    { 45, 45, SPECIES_SEEL },\n    { 27, 27, SPECIES_SWINUB },\n    { 40, 40, SPECIES_ZUBAT },\n    { 29, 29, SPECIES_SWINUB },\n    { 30, 30, SPECIES_DELIBIRD },\n    { 31, 31, SPECIES_SWINUB },\n    { 48, 48, SPECIES_GOLBAT },\n    { 23, 23, SPECIES_SWINUB },\n    { 48, 48, SPECIES_GOLBAT },\n    { 23, 23, SPECIES_SWINUB },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCave1F_FireRed_LandMonsInfo = { 7, sFourIslandIcefallCave1F_FireRed_LandMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveB1F_FireRed_LandMons[] =\n{\n    { 25, 25, SPECIES_SWINUB },\n    { 45, 45, SPECIES_GOLBAT },\n    { 45, 45, SPECIES_SEEL },\n    { 27, 27, SPECIES_SWINUB },\n    { 40, 40, SPECIES_ZUBAT },\n    { 29, 29, SPECIES_SWINUB },\n    { 30, 30, SPECIES_DELIBIRD },\n    { 31, 31, SPECIES_SWINUB },\n    { 48, 48, SPECIES_GOLBAT },\n    { 23, 23, SPECIES_SWINUB },\n    { 48, 48, SPECIES_GOLBAT },\n    { 23, 23, SPECIES_SWINUB },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveB1F_FireRed_LandMonsInfo = { 7, sFourIslandIcefallCaveB1F_FireRed_LandMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveBack_FireRed_LandMons[] =\n{\n    { 43, 43, SPECIES_SEEL },\n    { 45, 45, SPECIES_GOLBAT },\n    { 45, 45, SPECIES_SEEL },\n    { 47, 47, SPECIES_SEEL },\n    { 40, 40, SPECIES_ZUBAT },\n    { 49, 49, SPECIES_DEWGONG },\n    { 51, 51, SPECIES_DEWGONG },\n    { 41, 41, SPECIES_PSYDUCK },\n    { 48, 48, SPECIES_GOLBAT },\n    { 53, 53, SPECIES_DEWGONG },\n    { 48, 48, SPECIES_GOLBAT },\n    { 53, 53, SPECIES_DEWGONG },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveBack_FireRed_LandMonsInfo = { 7, sFourIslandIcefallCaveBack_FireRed_LandMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveBack_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 45, SPECIES_TENTACOOL },\n    { 35, 45, SPECIES_TENTACRUEL },\n    { 30, 45, SPECIES_LAPRAS },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveBack_FireRed_WaterMonsInfo = { 2, sFourIslandIcefallCaveBack_FireRed_WaterMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveBack_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_SHELLDER },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveBack_FireRed_FishingMonsInfo = { 20, sFourIslandIcefallCaveBack_FireRed_FishingMons };\n\nconst struct WildPokemon sSixIslandPatternBush_FireRed_LandMons[] =\n{\n    { 9, 9, SPECIES_SPINARAK },\n    { 9, 9, SPECIES_KAKUNA },\n    { 14, 14, SPECIES_SPINARAK },\n    { 6, 6, SPECIES_CATERPIE },\n    { 6, 6, SPECIES_WEEDLE },\n    { 15, 15, SPECIES_HERACROSS },\n    { 9, 9, SPECIES_METAPOD },\n    { 20, 20, SPECIES_HERACROSS },\n    { 9, 9, SPECIES_LEDYBA },\n    { 25, 25, SPECIES_HERACROSS },\n    { 14, 14, SPECIES_LEDYBA },\n    { 30, 30, SPECIES_HERACROSS },\n};\n\nconst struct WildPokemonInfo sSixIslandPatternBush_FireRed_LandMonsInfo = { 21, sSixIslandPatternBush_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom1_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom1_FireRed_LandMonsInfo = { 1, sFiveIslandLostCaveRoom1_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom2_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom2_FireRed_LandMonsInfo = { 2, sFiveIslandLostCaveRoom2_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom3_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom3_FireRed_LandMonsInfo = { 3, sFiveIslandLostCaveRoom3_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom4_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom4_FireRed_LandMonsInfo = { 4, sFiveIslandLostCaveRoom4_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom5_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom5_FireRed_LandMonsInfo = { 5, sFiveIslandLostCaveRoom5_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom6_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom6_FireRed_LandMonsInfo = { 6, sFiveIslandLostCaveRoom6_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom7_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom7_FireRed_LandMonsInfo = { 7, sFiveIslandLostCaveRoom7_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom8_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom8_FireRed_LandMonsInfo = { 8, sFiveIslandLostCaveRoom8_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom9_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom9_FireRed_LandMonsInfo = { 9, sFiveIslandLostCaveRoom9_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom10_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom10_FireRed_LandMonsInfo = { 10, sFiveIslandLostCaveRoom10_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom11_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 15, 15, SPECIES_MURKROW },\n    { 20, 20, SPECIES_MURKROW },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom11_FireRed_LandMonsInfo = { 5, sFiveIslandLostCaveRoom11_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom12_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 15, 15, SPECIES_MURKROW },\n    { 20, 20, SPECIES_MURKROW },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom12_FireRed_LandMonsInfo = { 5, sFiveIslandLostCaveRoom12_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom13_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 15, 15, SPECIES_MURKROW },\n    { 20, 20, SPECIES_MURKROW },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom13_FireRed_LandMonsInfo = { 5, sFiveIslandLostCaveRoom13_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom14_FireRed_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 15, 15, SPECIES_MURKROW },\n    { 20, 20, SPECIES_MURKROW },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MURKROW },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom14_FireRed_LandMonsInfo = { 5, sFiveIslandLostCaveRoom14_FireRed_LandMons };\n\nconst struct WildPokemon sOneIslandKindleRoad_FireRed_LandMons[] =\n{\n    { 32, 32, SPECIES_SPEAROW },\n    { 34, 34, SPECIES_PONYTA },\n    { 36, 36, SPECIES_FEAROW },\n    { 31, 31, SPECIES_PONYTA },\n    { 31, 31, SPECIES_GEODUDE },\n    { 31, 31, SPECIES_MEOWTH },\n    { 30, 30, SPECIES_SPEAROW },\n    { 34, 34, SPECIES_PSYDUCK },\n    { 37, 37, SPECIES_RAPIDASH },\n    { 37, 37, SPECIES_PERSIAN },\n    { 40, 40, SPECIES_RAPIDASH },\n    { 40, 40, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sOneIslandKindleRoad_FireRed_LandMonsInfo = { 21, sOneIslandKindleRoad_FireRed_LandMons };\n\nconst struct WildPokemon sOneIslandKindleRoad_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sOneIslandKindleRoad_FireRed_WaterMonsInfo = { 2, sOneIslandKindleRoad_FireRed_WaterMons };\n\nconst struct WildPokemon sOneIslandKindleRoad_FireRed_RockSmashMons[] =\n{\n    { 5, 20, SPECIES_GEODUDE },\n    { 10, 20, SPECIES_GEODUDE },\n    { 15, 30, SPECIES_GEODUDE },\n    { 25, 40, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GRAVELER },\n};\n\nconst struct WildPokemonInfo sOneIslandKindleRoad_FireRed_RockSmashMonsInfo = { 25, sOneIslandKindleRoad_FireRed_RockSmashMons };\n\nconst struct WildPokemon sOneIslandKindleRoad_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sOneIslandKindleRoad_FireRed_FishingMonsInfo = { 20, sOneIslandKindleRoad_FireRed_FishingMons };\n\nconst struct WildPokemon sOneIslandTreasureBeach_FireRed_LandMons[] =\n{\n    { 32, 32, SPECIES_SPEAROW },\n    { 33, 33, SPECIES_TANGELA },\n    { 31, 31, SPECIES_SPEAROW },\n    { 35, 35, SPECIES_TANGELA },\n    { 36, 36, SPECIES_FEAROW },\n    { 31, 31, SPECIES_MEOWTH },\n    { 38, 38, SPECIES_FEAROW },\n    { 31, 31, SPECIES_PSYDUCK },\n    { 40, 40, SPECIES_FEAROW },\n    { 37, 37, SPECIES_PERSIAN },\n    { 40, 40, SPECIES_FEAROW },\n    { 40, 40, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sOneIslandTreasureBeach_FireRed_LandMonsInfo = { 21, sOneIslandTreasureBeach_FireRed_LandMons };\n\nconst struct WildPokemon sOneIslandTreasureBeach_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sOneIslandTreasureBeach_FireRed_WaterMonsInfo = { 2, sOneIslandTreasureBeach_FireRed_WaterMons };\n\nconst struct WildPokemon sOneIslandTreasureBeach_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sOneIslandTreasureBeach_FireRed_FishingMonsInfo = { 20, sOneIslandTreasureBeach_FireRed_FishingMons };\n\nconst struct WildPokemon sTwoIslandCapeBrink_FireRed_LandMons[] =\n{\n    { 31, 31, SPECIES_SPEAROW },\n    { 30, 30, SPECIES_ODDISH },\n    { 32, 32, SPECIES_ODDISH },\n    { 36, 36, SPECIES_GLOOM },\n    { 36, 36, SPECIES_FEAROW },\n    { 31, 31, SPECIES_MEOWTH },\n    { 38, 38, SPECIES_GLOOM },\n    { 31, 31, SPECIES_PSYDUCK },\n    { 37, 37, SPECIES_GOLDUCK },\n    { 37, 37, SPECIES_PERSIAN },\n    { 40, 40, SPECIES_GOLDUCK },\n    { 40, 40, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sTwoIslandCapeBrink_FireRed_LandMonsInfo = { 21, sTwoIslandCapeBrink_FireRed_LandMons };\n\nconst struct WildPokemon sTwoIslandCapeBrink_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_PSYDUCK },\n    { 20, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_GOLDUCK },\n    { 35, 40, SPECIES_GOLDUCK },\n};\n\nconst struct WildPokemonInfo sTwoIslandCapeBrink_FireRed_WaterMonsInfo = { 2, sTwoIslandCapeBrink_FireRed_WaterMons };\n\nconst struct WildPokemon sTwoIslandCapeBrink_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sTwoIslandCapeBrink_FireRed_FishingMonsInfo = { 20, sTwoIslandCapeBrink_FireRed_FishingMons };\n\nconst struct WildPokemon sThreeIslandBondBridge_FireRed_LandMons[] =\n{\n    { 32, 32, SPECIES_PIDGEY },\n    { 31, 31, SPECIES_ODDISH },\n    { 29, 29, SPECIES_PIDGEY },\n    { 36, 36, SPECIES_GLOOM },\n    { 34, 34, SPECIES_PIDGEOTTO },\n    { 31, 31, SPECIES_MEOWTH },\n    { 34, 34, SPECIES_VENONAT },\n    { 31, 31, SPECIES_PSYDUCK },\n    { 37, 37, SPECIES_PIDGEOTTO },\n    { 37, 37, SPECIES_PERSIAN },\n    { 40, 40, SPECIES_PIDGEOTTO },\n    { 40, 40, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sThreeIslandBondBridge_FireRed_LandMonsInfo = { 21, sThreeIslandBondBridge_FireRed_LandMons };\n\nconst struct WildPokemon sThreeIslandBondBridge_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sThreeIslandBondBridge_FireRed_WaterMonsInfo = { 2, sThreeIslandBondBridge_FireRed_WaterMons };\n\nconst struct WildPokemon sThreeIslandBondBridge_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sThreeIslandBondBridge_FireRed_FishingMonsInfo = { 20, sThreeIslandBondBridge_FireRed_FishingMons };\n\nconst struct WildPokemon sThreeIslandPort_FireRed_LandMons[] =\n{\n    { 15, 15, SPECIES_DUNSPARCE },\n    { 15, 15, SPECIES_DUNSPARCE },\n    { 10, 10, SPECIES_DUNSPARCE },\n    { 10, 10, SPECIES_DUNSPARCE },\n    { 20, 20, SPECIES_DUNSPARCE },\n    { 20, 20, SPECIES_DUNSPARCE },\n    { 25, 25, SPECIES_DUNSPARCE },\n    { 30, 30, SPECIES_DUNSPARCE },\n    { 25, 25, SPECIES_DUNSPARCE },\n    { 30, 30, SPECIES_DUNSPARCE },\n    { 5, 5, SPECIES_DUNSPARCE },\n    { 35, 35, SPECIES_DUNSPARCE },\n};\n\nconst struct WildPokemonInfo sThreeIslandPort_FireRed_LandMonsInfo = { 1, sThreeIslandPort_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandResortGorgeous_FireRed_WaterMons[] =\n{\n    { 5, 35, SPECIES_TENTACOOL },\n    { 5, 15, SPECIES_HOPPIP },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sFiveIslandResortGorgeous_FireRed_WaterMonsInfo = { 2, sFiveIslandResortGorgeous_FireRed_WaterMons };\n\nconst struct WildPokemon sFiveIslandResortGorgeous_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_QWILFISH },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sFiveIslandResortGorgeous_FireRed_FishingMonsInfo = { 20, sFiveIslandResortGorgeous_FireRed_FishingMons };\n\nconst struct WildPokemon sFiveIslandWaterLabyrinth_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 5, 15, SPECIES_HOPPIP },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sFiveIslandWaterLabyrinth_FireRed_WaterMonsInfo = { 2, sFiveIslandWaterLabyrinth_FireRed_WaterMons };\n\nconst struct WildPokemon sFiveIslandWaterLabyrinth_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_QWILFISH },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sFiveIslandWaterLabyrinth_FireRed_FishingMonsInfo = { 20, sFiveIslandWaterLabyrinth_FireRed_FishingMons };\n\nconst struct WildPokemon sFiveIslandMeadow_FireRed_LandMons[] =\n{\n    { 44, 44, SPECIES_PIDGEY },\n    { 10, 10, SPECIES_SENTRET },\n    { 48, 48, SPECIES_PIDGEOTTO },\n    { 10, 10, SPECIES_HOPPIP },\n    { 15, 15, SPECIES_SENTRET },\n    { 41, 41, SPECIES_MEOWTH },\n    { 15, 15, SPECIES_HOPPIP },\n    { 41, 41, SPECIES_PSYDUCK },\n    { 50, 50, SPECIES_PIDGEOTTO },\n    { 47, 47, SPECIES_PERSIAN },\n    { 50, 50, SPECIES_PIDGEOTTO },\n    { 50, 50, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sFiveIslandMeadow_FireRed_LandMonsInfo = { 21, sFiveIslandMeadow_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandMeadow_FireRed_WaterMons[] =\n{\n    { 5, 35, SPECIES_TENTACOOL },\n    { 5, 15, SPECIES_HOPPIP },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sFiveIslandMeadow_FireRed_WaterMonsInfo = { 2, sFiveIslandMeadow_FireRed_WaterMons };\n\nconst struct WildPokemon sFiveIslandMeadow_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_QWILFISH },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sFiveIslandMeadow_FireRed_FishingMonsInfo = { 20, sFiveIslandMeadow_FireRed_FishingMons };\n\nconst struct WildPokemon sFiveIslandMemorialPillar_FireRed_LandMons[] =\n{\n    { 10, 10, SPECIES_HOPPIP },\n    { 12, 12, SPECIES_HOPPIP },\n    { 8, 8, SPECIES_HOPPIP },\n    { 14, 14, SPECIES_HOPPIP },\n    { 10, 10, SPECIES_HOPPIP },\n    { 12, 12, SPECIES_HOPPIP },\n    { 16, 16, SPECIES_HOPPIP },\n    { 6, 6, SPECIES_HOPPIP },\n    { 8, 8, SPECIES_HOPPIP },\n    { 14, 14, SPECIES_HOPPIP },\n    { 8, 8, SPECIES_HOPPIP },\n    { 14, 14, SPECIES_HOPPIP },\n};\n\nconst struct WildPokemonInfo sFiveIslandMemorialPillar_FireRed_LandMonsInfo = { 21, sFiveIslandMemorialPillar_FireRed_LandMons };\n\nconst struct WildPokemon sFiveIslandMemorialPillar_FireRed_WaterMons[] =\n{\n    { 5, 35, SPECIES_TENTACOOL },\n    { 5, 15, SPECIES_HOPPIP },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sFiveIslandMemorialPillar_FireRed_WaterMonsInfo = { 2, sFiveIslandMemorialPillar_FireRed_WaterMons };\n\nconst struct WildPokemon sFiveIslandMemorialPillar_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_QWILFISH },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sFiveIslandMemorialPillar_FireRed_FishingMonsInfo = { 20, sFiveIslandMemorialPillar_FireRed_FishingMons };\n\nconst struct WildPokemon sSixIslandOutcastIsland_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sSixIslandOutcastIsland_FireRed_WaterMonsInfo = { 2, sSixIslandOutcastIsland_FireRed_WaterMons };\n\nconst struct WildPokemon sSixIslandOutcastIsland_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_QWILFISH },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sSixIslandOutcastIsland_FireRed_FishingMonsInfo = { 20, sSixIslandOutcastIsland_FireRed_FishingMons };\n\nconst struct WildPokemon sSixIslandGreenPath_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sSixIslandGreenPath_FireRed_WaterMonsInfo = { 2, sSixIslandGreenPath_FireRed_WaterMons };\n\nconst struct WildPokemon sSixIslandGreenPath_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_QWILFISH },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sSixIslandGreenPath_FireRed_FishingMonsInfo = { 20, sSixIslandGreenPath_FireRed_FishingMons };\n\nconst struct WildPokemon sSixIslandWaterPath_FireRed_LandMons[] =\n{\n    { 44, 44, SPECIES_SPEAROW },\n    { 10, 10, SPECIES_SENTRET },\n    { 44, 44, SPECIES_ODDISH },\n    { 48, 48, SPECIES_FEAROW },\n    { 15, 15, SPECIES_SENTRET },\n    { 41, 41, SPECIES_MEOWTH },\n    { 48, 48, SPECIES_GLOOM },\n    { 41, 41, SPECIES_PSYDUCK },\n    { 50, 50, SPECIES_FEAROW },\n    { 47, 47, SPECIES_PERSIAN },\n    { 50, 50, SPECIES_FEAROW },\n    { 50, 50, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sSixIslandWaterPath_FireRed_LandMonsInfo = { 21, sSixIslandWaterPath_FireRed_LandMons };\n\nconst struct WildPokemon sSixIslandWaterPath_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sSixIslandWaterPath_FireRed_WaterMonsInfo = { 2, sSixIslandWaterPath_FireRed_WaterMons };\n\nconst struct WildPokemon sSixIslandWaterPath_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_QWILFISH },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sSixIslandWaterPath_FireRed_FishingMonsInfo = { 20, sSixIslandWaterPath_FireRed_FishingMons };\n\nconst struct WildPokemon sSixIslandRuinValley_FireRed_LandMons[] =\n{\n    { 15, 15, SPECIES_NATU },\n    { 44, 44, SPECIES_SPEAROW },\n    { 18, 18, SPECIES_YANMA },\n    { 15, 15, SPECIES_WOOPER },\n    { 49, 49, SPECIES_FEAROW },\n    { 43, 43, SPECIES_MEOWTH },\n    { 25, 25, SPECIES_WOBBUFFET },\n    { 41, 41, SPECIES_PSYDUCK },\n    { 20, 20, SPECIES_NATU },\n    { 49, 49, SPECIES_PERSIAN },\n    { 20, 20, SPECIES_NATU },\n    { 52, 52, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sSixIslandRuinValley_FireRed_LandMonsInfo = { 21, sSixIslandRuinValley_FireRed_LandMons };\n\nconst struct WildPokemon sSixIslandRuinValley_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_WOOPER },\n    { 10, 20, SPECIES_WOOPER },\n    { 15, 25, SPECIES_WOOPER },\n    { 20, 25, SPECIES_WOOPER },\n    { 20, 25, SPECIES_WOOPER },\n};\n\nconst struct WildPokemonInfo sSixIslandRuinValley_FireRed_WaterMonsInfo = { 2, sSixIslandRuinValley_FireRed_WaterMons };\n\nconst struct WildPokemon sSixIslandRuinValley_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sSixIslandRuinValley_FireRed_FishingMonsInfo = { 20, sSixIslandRuinValley_FireRed_FishingMons };\n\nconst struct WildPokemon sSevenIslandTrainerTower_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sSevenIslandTrainerTower_FireRed_WaterMonsInfo = { 2, sSevenIslandTrainerTower_FireRed_WaterMons };\n\nconst struct WildPokemon sSevenIslandTrainerTower_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_QWILFISH },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sSevenIslandTrainerTower_FireRed_FishingMonsInfo = { 20, sSevenIslandTrainerTower_FireRed_FishingMons };\n\nconst struct WildPokemon sSevenIslandSevaultCanyonEntrance_FireRed_LandMons[] =\n{\n    { 44, 44, SPECIES_SPEAROW },\n    { 10, 10, SPECIES_SENTRET },\n    { 10, 10, SPECIES_PHANPY },\n    { 48, 48, SPECIES_FEAROW },\n    { 15, 15, SPECIES_SENTRET },\n    { 41, 41, SPECIES_MEOWTH },\n    { 50, 50, SPECIES_FEAROW },\n    { 41, 41, SPECIES_PSYDUCK },\n    { 15, 15, SPECIES_PHANPY },\n    { 47, 47, SPECIES_PERSIAN },\n    { 15, 15, SPECIES_PHANPY },\n    { 50, 50, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sSevenIslandSevaultCanyonEntrance_FireRed_LandMonsInfo = { 21, sSevenIslandSevaultCanyonEntrance_FireRed_LandMons };\n\nconst struct WildPokemon sSevenIslandSevaultCanyon_FireRed_LandMons[] =\n{\n    { 46, 46, SPECIES_GEODUDE },\n    { 15, 15, SPECIES_PHANPY },\n    { 46, 46, SPECIES_CUBONE },\n    { 50, 50, SPECIES_FEAROW },\n    { 52, 52, SPECIES_MAROWAK },\n    { 43, 43, SPECIES_MEOWTH },\n    { 54, 54, SPECIES_ONIX },\n    { 30, 30, SPECIES_SKARMORY },\n    { 15, 15, SPECIES_LARVITAR },\n    { 49, 49, SPECIES_PERSIAN },\n    { 20, 20, SPECIES_LARVITAR },\n    { 52, 52, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sSevenIslandSevaultCanyon_FireRed_LandMonsInfo = { 21, sSevenIslandSevaultCanyon_FireRed_LandMons };\n\nconst struct WildPokemon sSevenIslandSevaultCanyon_FireRed_RockSmashMons[] =\n{\n    { 25, 35, SPECIES_GEODUDE },\n    { 30, 45, SPECIES_GRAVELER },\n    { 35, 50, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GEODUDE },\n    { 30, 40, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sSevenIslandSevaultCanyon_FireRed_RockSmashMonsInfo = { 25, sSevenIslandSevaultCanyon_FireRed_RockSmashMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuins_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuins_FireRed_WaterMonsInfo = { 2, sSevenIslandTanobyRuins_FireRed_WaterMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuins_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_QWILFISH },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuins_FireRed_FishingMonsInfo = { 20, sSevenIslandTanobyRuins_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute1_FireRed_LandMons[] =\n{\n    { 3, 3, SPECIES_PIDGEY },\n    { 3, 3, SPECIES_RATTATA },\n    { 3, 3, SPECIES_PIDGEY },\n    { 3, 3, SPECIES_RATTATA },\n    { 2, 2, SPECIES_PIDGEY },\n    { 2, 2, SPECIES_RATTATA },\n    { 3, 3, SPECIES_PIDGEY },\n    { 3, 3, SPECIES_RATTATA },\n    { 4, 4, SPECIES_PIDGEY },\n    { 4, 4, SPECIES_RATTATA },\n    { 5, 5, SPECIES_PIDGEY },\n    { 4, 4, SPECIES_RATTATA },\n};\n\nconst struct WildPokemonInfo sRoute1_FireRed_LandMonsInfo = { 21, sRoute1_FireRed_LandMons };\n\nconst struct WildPokemon sRoute2_FireRed_LandMons[] =\n{\n    { 3, 3, SPECIES_RATTATA },\n    { 3, 3, SPECIES_PIDGEY },\n    { 4, 4, SPECIES_RATTATA },\n    { 4, 4, SPECIES_PIDGEY },\n    { 2, 2, SPECIES_RATTATA },\n    { 2, 2, SPECIES_PIDGEY },\n    { 5, 5, SPECIES_RATTATA },\n    { 5, 5, SPECIES_PIDGEY },\n    { 4, 4, SPECIES_CATERPIE },\n    { 4, 4, SPECIES_WEEDLE },\n    { 5, 5, SPECIES_CATERPIE },\n    { 5, 5, SPECIES_WEEDLE },\n};\n\nconst struct WildPokemonInfo sRoute2_FireRed_LandMonsInfo = { 21, sRoute2_FireRed_LandMons };\n\nconst struct WildPokemon sRoute3_FireRed_LandMons[] =\n{\n    { 6, 6, SPECIES_SPEAROW },\n    { 6, 6, SPECIES_PIDGEY },\n    { 7, 7, SPECIES_SPEAROW },\n    { 7, 7, SPECIES_MANKEY },\n    { 6, 6, SPECIES_NIDORAN_M },\n    { 7, 7, SPECIES_PIDGEY },\n    { 8, 8, SPECIES_SPEAROW },\n    { 3, 3, SPECIES_JIGGLYPUFF },\n    { 7, 7, SPECIES_NIDORAN_M },\n    { 5, 5, SPECIES_JIGGLYPUFF },\n    { 6, 6, SPECIES_NIDORAN_F },\n    { 7, 7, SPECIES_JIGGLYPUFF },\n};\n\nconst struct WildPokemonInfo sRoute3_FireRed_LandMonsInfo = { 21, sRoute3_FireRed_LandMons };\n\nconst struct WildPokemon sRoute4_FireRed_LandMons[] =\n{\n    { 10, 10, SPECIES_SPEAROW },\n    { 10, 10, SPECIES_RATTATA },\n    { 6, 6, SPECIES_EKANS },\n    { 10, 10, SPECIES_EKANS },\n    { 8, 8, SPECIES_SPEAROW },\n    { 8, 8, SPECIES_RATTATA },\n    { 12, 12, SPECIES_SPEAROW },\n    { 12, 12, SPECIES_RATTATA },\n    { 10, 10, SPECIES_MANKEY },\n    { 8, 8, SPECIES_EKANS },\n    { 12, 12, SPECIES_MANKEY },\n    { 12, 12, SPECIES_EKANS },\n};\n\nconst struct WildPokemonInfo sRoute4_FireRed_LandMonsInfo = { 21, sRoute4_FireRed_LandMons };\n\nconst struct WildPokemon sRoute4_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute4_FireRed_WaterMonsInfo = { 2, sRoute4_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute4_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_HORSEA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute4_FireRed_FishingMonsInfo = { 20, sRoute4_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute5_FireRed_LandMons[] =\n{\n    { 10, 10, SPECIES_MEOWTH },\n    { 13, 13, SPECIES_PIDGEY },\n    { 13, 13, SPECIES_ODDISH },\n    { 12, 12, SPECIES_MEOWTH },\n    { 15, 15, SPECIES_ODDISH },\n    { 15, 15, SPECIES_PIDGEY },\n    { 16, 16, SPECIES_ODDISH },\n    { 16, 16, SPECIES_PIDGEY },\n    { 15, 15, SPECIES_PIDGEY },\n    { 14, 14, SPECIES_MEOWTH },\n    { 15, 15, SPECIES_PIDGEY },\n    { 16, 16, SPECIES_MEOWTH },\n};\n\nconst struct WildPokemonInfo sRoute5_FireRed_LandMonsInfo = { 21, sRoute5_FireRed_LandMons };\n\nconst struct WildPokemon sRoute6_FireRed_LandMons[] =\n{\n    { 10, 10, SPECIES_MEOWTH },\n    { 13, 13, SPECIES_PIDGEY },\n    { 13, 13, SPECIES_ODDISH },\n    { 12, 12, SPECIES_MEOWTH },\n    { 15, 15, SPECIES_ODDISH },\n    { 15, 15, SPECIES_PIDGEY },\n    { 16, 16, SPECIES_ODDISH },\n    { 16, 16, SPECIES_PIDGEY },\n    { 15, 15, SPECIES_PIDGEY },\n    { 14, 14, SPECIES_MEOWTH },\n    { 15, 15, SPECIES_PIDGEY },\n    { 16, 16, SPECIES_MEOWTH },\n};\n\nconst struct WildPokemonInfo sRoute6_FireRed_LandMonsInfo = { 21, sRoute6_FireRed_LandMons };\n\nconst struct WildPokemon sRoute6_FireRed_WaterMons[] =\n{\n    { 20, 25, SPECIES_PSYDUCK },\n    { 20, 25, SPECIES_PSYDUCK },\n    { 25, 30, SPECIES_PSYDUCK },\n    { 30, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute6_FireRed_WaterMonsInfo = { 2, sRoute6_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute6_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute6_FireRed_FishingMonsInfo = { 20, sRoute6_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute7_FireRed_LandMons[] =\n{\n    { 19, 19, SPECIES_PIDGEY },\n    { 17, 17, SPECIES_MEOWTH },\n    { 19, 19, SPECIES_ODDISH },\n    { 18, 18, SPECIES_MEOWTH },\n    { 22, 22, SPECIES_PIDGEY },\n    { 22, 22, SPECIES_ODDISH },\n    { 18, 18, SPECIES_GROWLITHE },\n    { 20, 20, SPECIES_GROWLITHE },\n    { 17, 17, SPECIES_MEOWTH },\n    { 19, 19, SPECIES_MEOWTH },\n    { 17, 17, SPECIES_MEOWTH },\n    { 20, 20, SPECIES_MEOWTH },\n};\n\nconst struct WildPokemonInfo sRoute7_FireRed_LandMonsInfo = { 21, sRoute7_FireRed_LandMons };\n\nconst struct WildPokemon sRoute8_FireRed_LandMons[] =\n{\n    { 18, 18, SPECIES_PIDGEY },\n    { 18, 18, SPECIES_MEOWTH },\n    { 16, 16, SPECIES_GROWLITHE },\n    { 20, 20, SPECIES_PIDGEY },\n    { 20, 20, SPECIES_MEOWTH },\n    { 17, 17, SPECIES_EKANS },\n    { 17, 17, SPECIES_GROWLITHE },\n    { 19, 19, SPECIES_EKANS },\n    { 17, 17, SPECIES_EKANS },\n    { 15, 15, SPECIES_GROWLITHE },\n    { 17, 17, SPECIES_EKANS },\n    { 18, 18, SPECIES_GROWLITHE },\n};\n\nconst struct WildPokemonInfo sRoute8_FireRed_LandMonsInfo = { 21, sRoute8_FireRed_LandMons };\n\nconst struct WildPokemon sRoute9_FireRed_LandMons[] =\n{\n    { 16, 16, SPECIES_SPEAROW },\n    { 16, 16, SPECIES_RATTATA },\n    { 11, 11, SPECIES_EKANS },\n    { 15, 15, SPECIES_EKANS },\n    { 13, 13, SPECIES_SPEAROW },\n    { 14, 14, SPECIES_RATTATA },\n    { 17, 17, SPECIES_SPEAROW },\n    { 17, 17, SPECIES_RATTATA },\n    { 14, 14, SPECIES_RATTATA },\n    { 13, 13, SPECIES_EKANS },\n    { 14, 14, SPECIES_RATTATA },\n    { 17, 17, SPECIES_EKANS },\n};\n\nconst struct WildPokemonInfo sRoute9_FireRed_LandMonsInfo = { 21, sRoute9_FireRed_LandMons };\n\nconst struct WildPokemon sRoute10_FireRed_LandMons[] =\n{\n    { 16, 16, SPECIES_SPEAROW },\n    { 16, 16, SPECIES_VOLTORB },\n    { 11, 11, SPECIES_EKANS },\n    { 15, 15, SPECIES_EKANS },\n    { 13, 13, SPECIES_SPEAROW },\n    { 14, 14, SPECIES_VOLTORB },\n    { 17, 17, SPECIES_SPEAROW },\n    { 17, 17, SPECIES_VOLTORB },\n    { 14, 14, SPECIES_VOLTORB },\n    { 13, 13, SPECIES_EKANS },\n    { 14, 14, SPECIES_VOLTORB },\n    { 17, 17, SPECIES_EKANS },\n};\n\nconst struct WildPokemonInfo sRoute10_FireRed_LandMonsInfo = { 21, sRoute10_FireRed_LandMons };\n\nconst struct WildPokemon sRoute10_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute10_FireRed_WaterMonsInfo = { 2, sRoute10_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute10_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_HORSEA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute10_FireRed_FishingMonsInfo = { 20, sRoute10_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute11_FireRed_LandMons[] =\n{\n    { 14, 14, SPECIES_EKANS },\n    { 15, 15, SPECIES_SPEAROW },\n    { 12, 12, SPECIES_EKANS },\n    { 13, 13, SPECIES_SPEAROW },\n    { 11, 11, SPECIES_DROWZEE },\n    { 13, 13, SPECIES_DROWZEE },\n    { 15, 15, SPECIES_EKANS },\n    { 17, 17, SPECIES_SPEAROW },\n    { 12, 12, SPECIES_EKANS },\n    { 15, 15, SPECIES_DROWZEE },\n    { 12, 12, SPECIES_EKANS },\n    { 15, 15, SPECIES_DROWZEE },\n};\n\nconst struct WildPokemonInfo sRoute11_FireRed_LandMonsInfo = { 21, sRoute11_FireRed_LandMons };\n\nconst struct WildPokemon sRoute11_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute11_FireRed_WaterMonsInfo = { 2, sRoute11_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute11_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_HORSEA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute11_FireRed_FishingMonsInfo = { 20, sRoute11_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute12_FireRed_LandMons[] =\n{\n    { 24, 24, SPECIES_ODDISH },\n    { 24, 24, SPECIES_VENONAT },\n    { 22, 22, SPECIES_ODDISH },\n    { 23, 23, SPECIES_PIDGEY },\n    { 25, 25, SPECIES_PIDGEY },\n    { 26, 26, SPECIES_VENONAT },\n    { 26, 26, SPECIES_ODDISH },\n    { 27, 27, SPECIES_PIDGEY },\n    { 23, 23, SPECIES_PIDGEY },\n    { 28, 28, SPECIES_GLOOM },\n    { 23, 23, SPECIES_PIDGEY },\n    { 30, 30, SPECIES_GLOOM },\n};\n\nconst struct WildPokemonInfo sRoute12_FireRed_LandMonsInfo = { 21, sRoute12_FireRed_LandMons };\n\nconst struct WildPokemon sRoute12_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute12_FireRed_WaterMonsInfo = { 2, sRoute12_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute12_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_HORSEA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute12_FireRed_FishingMonsInfo = { 60, sRoute12_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute13_FireRed_LandMons[] =\n{\n    { 24, 24, SPECIES_ODDISH },\n    { 24, 24, SPECIES_VENONAT },\n    { 22, 22, SPECIES_ODDISH },\n    { 27, 27, SPECIES_PIDGEY },\n    { 25, 25, SPECIES_PIDGEY },\n    { 26, 26, SPECIES_VENONAT },\n    { 26, 26, SPECIES_ODDISH },\n    { 25, 25, SPECIES_DITTO },\n    { 29, 29, SPECIES_PIDGEOTTO },\n    { 28, 28, SPECIES_GLOOM },\n    { 29, 29, SPECIES_PIDGEOTTO },\n    { 30, 30, SPECIES_GLOOM },\n};\n\nconst struct WildPokemonInfo sRoute13_FireRed_LandMonsInfo = { 21, sRoute13_FireRed_LandMons };\n\nconst struct WildPokemon sRoute13_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute13_FireRed_WaterMonsInfo = { 2, sRoute13_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute13_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_HORSEA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute13_FireRed_FishingMonsInfo = { 20, sRoute13_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute14_FireRed_LandMons[] =\n{\n    { 24, 24, SPECIES_ODDISH },\n    { 24, 24, SPECIES_VENONAT },\n    { 22, 22, SPECIES_ODDISH },\n    { 23, 23, SPECIES_DITTO },\n    { 27, 27, SPECIES_PIDGEY },\n    { 26, 26, SPECIES_VENONAT },\n    { 26, 26, SPECIES_ODDISH },\n    { 30, 30, SPECIES_GLOOM },\n    { 23, 23, SPECIES_DITTO },\n    { 29, 29, SPECIES_PIDGEOTTO },\n    { 23, 23, SPECIES_DITTO },\n    { 29, 29, SPECIES_PIDGEOTTO },\n};\n\nconst struct WildPokemonInfo sRoute14_FireRed_LandMonsInfo = { 21, sRoute14_FireRed_LandMons };\n\nconst struct WildPokemon sRoute15_FireRed_LandMons[] =\n{\n    { 24, 24, SPECIES_ODDISH },\n    { 24, 24, SPECIES_VENONAT },\n    { 22, 22, SPECIES_ODDISH },\n    { 27, 27, SPECIES_PIDGEY },\n    { 25, 25, SPECIES_PIDGEY },\n    { 26, 26, SPECIES_VENONAT },\n    { 26, 26, SPECIES_ODDISH },\n    { 25, 25, SPECIES_DITTO },\n    { 29, 29, SPECIES_PIDGEOTTO },\n    { 28, 28, SPECIES_GLOOM },\n    { 29, 29, SPECIES_PIDGEOTTO },\n    { 30, 30, SPECIES_GLOOM },\n};\n\nconst struct WildPokemonInfo sRoute15_FireRed_LandMonsInfo = { 21, sRoute15_FireRed_LandMons };\n\nconst struct WildPokemon sRoute16_FireRed_LandMons[] =\n{\n    { 20, 20, SPECIES_SPEAROW },\n    { 18, 18, SPECIES_DODUO },\n    { 18, 18, SPECIES_RATTATA },\n    { 20, 20, SPECIES_RATTATA },\n    { 22, 22, SPECIES_SPEAROW },\n    { 20, 20, SPECIES_DODUO },\n    { 22, 22, SPECIES_RATTATA },\n    { 22, 22, SPECIES_DODUO },\n    { 18, 18, SPECIES_RATTATA },\n    { 23, 23, SPECIES_RATICATE },\n    { 18, 18, SPECIES_RATTATA },\n    { 25, 25, SPECIES_RATICATE },\n};\n\nconst struct WildPokemonInfo sRoute16_FireRed_LandMonsInfo = { 21, sRoute16_FireRed_LandMons };\n\nconst struct WildPokemon sRoute17_FireRed_LandMons[] =\n{\n    { 20, 20, SPECIES_SPEAROW },\n    { 24, 24, SPECIES_DODUO },\n    { 22, 22, SPECIES_SPEAROW },\n    { 26, 26, SPECIES_DODUO },\n    { 25, 25, SPECIES_RATICATE },\n    { 27, 27, SPECIES_RATICATE },\n    { 28, 28, SPECIES_DODUO },\n    { 29, 29, SPECIES_RATICATE },\n    { 22, 22, SPECIES_RATTATA },\n    { 25, 25, SPECIES_FEAROW },\n    { 22, 22, SPECIES_RATTATA },\n    { 27, 27, SPECIES_FEAROW },\n};\n\nconst struct WildPokemonInfo sRoute17_FireRed_LandMonsInfo = { 21, sRoute17_FireRed_LandMons };\n\nconst struct WildPokemon sRoute18_FireRed_LandMons[] =\n{\n    { 20, 20, SPECIES_SPEAROW },\n    { 24, 24, SPECIES_DODUO },\n    { 22, 22, SPECIES_SPEAROW },\n    { 26, 26, SPECIES_DODUO },\n    { 25, 25, SPECIES_RATICATE },\n    { 25, 25, SPECIES_FEAROW },\n    { 28, 28, SPECIES_DODUO },\n    { 29, 29, SPECIES_RATICATE },\n    { 22, 22, SPECIES_RATTATA },\n    { 27, 27, SPECIES_FEAROW },\n    { 22, 22, SPECIES_RATTATA },\n    { 29, 29, SPECIES_FEAROW },\n};\n\nconst struct WildPokemonInfo sRoute18_FireRed_LandMonsInfo = { 21, sRoute18_FireRed_LandMons };\n\nconst struct WildPokemon sRoute19_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute19_FireRed_WaterMonsInfo = { 2, sRoute19_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute19_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute19_FireRed_FishingMonsInfo = { 20, sRoute19_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute20_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute20_FireRed_WaterMonsInfo = { 2, sRoute20_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute20_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute20_FireRed_FishingMonsInfo = { 20, sRoute20_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute21North_FireRed_LandMons[] =\n{\n    { 22, 22, SPECIES_TANGELA },\n    { 23, 23, SPECIES_TANGELA },\n    { 24, 24, SPECIES_TANGELA },\n    { 21, 21, SPECIES_TANGELA },\n    { 25, 25, SPECIES_TANGELA },\n    { 20, 20, SPECIES_TANGELA },\n    { 19, 19, SPECIES_TANGELA },\n    { 26, 26, SPECIES_TANGELA },\n    { 18, 18, SPECIES_TANGELA },\n    { 27, 27, SPECIES_TANGELA },\n    { 17, 17, SPECIES_TANGELA },\n    { 28, 28, SPECIES_TANGELA },\n};\n\nconst struct WildPokemonInfo sRoute21North_FireRed_LandMonsInfo = { 14, sRoute21North_FireRed_LandMons };\n\nconst struct WildPokemon sRoute21North_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute21North_FireRed_WaterMonsInfo = { 2, sRoute21North_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute21North_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute21North_FireRed_FishingMonsInfo = { 20, sRoute21North_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute21South_FireRed_LandMons[] =\n{\n    { 22, 22, SPECIES_TANGELA },\n    { 23, 23, SPECIES_TANGELA },\n    { 24, 24, SPECIES_TANGELA },\n    { 21, 21, SPECIES_TANGELA },\n    { 25, 25, SPECIES_TANGELA },\n    { 20, 20, SPECIES_TANGELA },\n    { 19, 19, SPECIES_TANGELA },\n    { 26, 26, SPECIES_TANGELA },\n    { 18, 18, SPECIES_TANGELA },\n    { 27, 27, SPECIES_TANGELA },\n    { 17, 17, SPECIES_TANGELA },\n    { 28, 28, SPECIES_TANGELA },\n};\n\nconst struct WildPokemonInfo sRoute21South_FireRed_LandMonsInfo = { 14, sRoute21South_FireRed_LandMons };\n\nconst struct WildPokemon sRoute21South_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute21South_FireRed_WaterMonsInfo = { 2, sRoute21South_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute21South_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute21South_FireRed_FishingMonsInfo = { 20, sRoute21South_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute22_FireRed_LandMons[] =\n{\n    { 3, 3, SPECIES_RATTATA },\n    { 3, 3, SPECIES_MANKEY },\n    { 4, 4, SPECIES_RATTATA },\n    { 4, 4, SPECIES_MANKEY },\n    { 2, 2, SPECIES_RATTATA },\n    { 2, 2, SPECIES_MANKEY },\n    { 3, 3, SPECIES_SPEAROW },\n    { 5, 5, SPECIES_SPEAROW },\n    { 5, 5, SPECIES_RATTATA },\n    { 5, 5, SPECIES_MANKEY },\n    { 5, 5, SPECIES_RATTATA },\n    { 5, 5, SPECIES_MANKEY },\n};\n\nconst struct WildPokemonInfo sRoute22_FireRed_LandMonsInfo = { 21, sRoute22_FireRed_LandMons };\n\nconst struct WildPokemon sRoute22_FireRed_WaterMons[] =\n{\n    { 20, 25, SPECIES_PSYDUCK },\n    { 20, 25, SPECIES_PSYDUCK },\n    { 25, 30, SPECIES_PSYDUCK },\n    { 30, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute22_FireRed_WaterMonsInfo = { 2, sRoute22_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute22_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute22_FireRed_FishingMonsInfo = { 20, sRoute22_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute23_FireRed_LandMons[] =\n{\n    { 32, 32, SPECIES_MANKEY },\n    { 40, 40, SPECIES_FEAROW },\n    { 34, 34, SPECIES_MANKEY },\n    { 34, 34, SPECIES_SPEAROW },\n    { 32, 32, SPECIES_EKANS },\n    { 34, 34, SPECIES_EKANS },\n    { 42, 42, SPECIES_PRIMEAPE },\n    { 44, 44, SPECIES_ARBOK },\n    { 32, 32, SPECIES_SPEAROW },\n    { 42, 42, SPECIES_FEAROW },\n    { 32, 32, SPECIES_SPEAROW },\n    { 44, 44, SPECIES_FEAROW },\n};\n\nconst struct WildPokemonInfo sRoute23_FireRed_LandMonsInfo = { 21, sRoute23_FireRed_LandMons };\n\nconst struct WildPokemon sRoute23_FireRed_WaterMons[] =\n{\n    { 20, 25, SPECIES_PSYDUCK },\n    { 20, 25, SPECIES_PSYDUCK },\n    { 25, 30, SPECIES_PSYDUCK },\n    { 30, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute23_FireRed_WaterMonsInfo = { 2, sRoute23_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute23_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute23_FireRed_FishingMonsInfo = { 20, sRoute23_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute24_FireRed_LandMons[] =\n{\n    { 7, 7, SPECIES_WEEDLE },\n    { 7, 7, SPECIES_CATERPIE },\n    { 11, 11, SPECIES_PIDGEY },\n    { 12, 12, SPECIES_ODDISH },\n    { 13, 13, SPECIES_ODDISH },\n    { 10, 10, SPECIES_ABRA },\n    { 13, 13, SPECIES_PIDGEY },\n    { 14, 14, SPECIES_ODDISH },\n    { 8, 8, SPECIES_KAKUNA },\n    { 8, 8, SPECIES_ABRA },\n    { 8, 8, SPECIES_METAPOD },\n    { 12, 12, SPECIES_ABRA },\n};\n\nconst struct WildPokemonInfo sRoute24_FireRed_LandMonsInfo = { 21, sRoute24_FireRed_LandMons };\n\nconst struct WildPokemon sRoute24_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute24_FireRed_WaterMonsInfo = { 2, sRoute24_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute24_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_HORSEA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute24_FireRed_FishingMonsInfo = { 20, sRoute24_FireRed_FishingMons };\n\nconst struct WildPokemon sRoute25_FireRed_LandMons[] =\n{\n    { 8, 8, SPECIES_WEEDLE },\n    { 8, 8, SPECIES_CATERPIE },\n    { 13, 13, SPECIES_PIDGEY },\n    { 14, 14, SPECIES_ODDISH },\n    { 13, 13, SPECIES_ODDISH },\n    { 11, 11, SPECIES_ABRA },\n    { 11, 11, SPECIES_PIDGEY },\n    { 12, 12, SPECIES_ODDISH },\n    { 9, 9, SPECIES_KAKUNA },\n    { 9, 9, SPECIES_ABRA },\n    { 9, 9, SPECIES_METAPOD },\n    { 13, 13, SPECIES_ABRA },\n};\n\nconst struct WildPokemonInfo sRoute25_FireRed_LandMonsInfo = { 21, sRoute25_FireRed_LandMons };\n\nconst struct WildPokemon sRoute25_FireRed_WaterMons[] =\n{\n    { 20, 25, SPECIES_PSYDUCK },\n    { 20, 25, SPECIES_PSYDUCK },\n    { 25, 30, SPECIES_PSYDUCK },\n    { 30, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute25_FireRed_WaterMonsInfo = { 2, sRoute25_FireRed_WaterMons };\n\nconst struct WildPokemon sRoute25_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute25_FireRed_FishingMonsInfo = { 20, sRoute25_FireRed_FishingMons };\n\nconst struct WildPokemon sPalletTown_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sPalletTown_FireRed_WaterMonsInfo = { 1, sPalletTown_FireRed_WaterMons };\n\nconst struct WildPokemon sPalletTown_FireRed_FishingMons[] =\n{\n    { 5, 10, SPECIES_MAGIKARP },\n    { 5, 10, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_SHELLDER },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sPalletTown_FireRed_FishingMonsInfo = { 10, sPalletTown_FireRed_FishingMons };\n\nconst struct WildPokemon sViridianCity_FireRed_WaterMons[] =\n{\n    { 20, 25, SPECIES_PSYDUCK },\n    { 20, 25, SPECIES_PSYDUCK },\n    { 25, 30, SPECIES_PSYDUCK },\n    { 30, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sViridianCity_FireRed_WaterMonsInfo = { 1, sViridianCity_FireRed_WaterMons };\n\nconst struct WildPokemon sViridianCity_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sViridianCity_FireRed_FishingMonsInfo = { 10, sViridianCity_FireRed_FishingMons };\n\nconst struct WildPokemon sCeruleanCity_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sCeruleanCity_FireRed_WaterMonsInfo = { 1, sCeruleanCity_FireRed_WaterMons };\n\nconst struct WildPokemon sCeruleanCity_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_HORSEA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sCeruleanCity_FireRed_FishingMonsInfo = { 10, sCeruleanCity_FireRed_FishingMons };\n\nconst struct WildPokemon sVermilionCity_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sVermilionCity_FireRed_WaterMonsInfo = { 1, sVermilionCity_FireRed_WaterMons };\n\nconst struct WildPokemon sVermilionCity_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_SHELLDER },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_HORSEA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sVermilionCity_FireRed_FishingMonsInfo = { 10, sVermilionCity_FireRed_FishingMons };\n\nconst struct WildPokemon sCeladonCity_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_PSYDUCK },\n    { 10, 20, SPECIES_PSYDUCK },\n    { 20, 30, SPECIES_PSYDUCK },\n    { 30, 40, SPECIES_PSYDUCK },\n    { 30, 40, SPECIES_KOFFING },\n};\n\nconst struct WildPokemonInfo sCeladonCity_FireRed_WaterMonsInfo = { 1, sCeladonCity_FireRed_WaterMons };\n\nconst struct WildPokemon sCeladonCity_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 15, 25, SPECIES_MAGIKARP },\n    { 15, 25, SPECIES_MAGIKARP },\n    { 15, 25, SPECIES_MAGIKARP },\n    { 25, 35, SPECIES_MAGIKARP },\n    { 30, 40, SPECIES_GRIMER },\n};\n\nconst struct WildPokemonInfo sCeladonCity_FireRed_FishingMonsInfo = { 10, sCeladonCity_FireRed_FishingMons };\n\nconst struct WildPokemon sFuchsiaCity_FireRed_WaterMons[] =\n{\n    { 20, 25, SPECIES_PSYDUCK },\n    { 20, 25, SPECIES_PSYDUCK },\n    { 25, 30, SPECIES_PSYDUCK },\n    { 30, 35, SPECIES_PSYDUCK },\n    { 35, 40, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sFuchsiaCity_FireRed_WaterMonsInfo = { 1, sFuchsiaCity_FireRed_WaterMons };\n\nconst struct WildPokemon sFuchsiaCity_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 15, 25, SPECIES_GOLDEEN },\n    { 20, 30, SPECIES_SEAKING },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sFuchsiaCity_FireRed_FishingMonsInfo = { 10, sFuchsiaCity_FireRed_FishingMons };\n\nconst struct WildPokemon sCinnabarIsland_FireRed_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sCinnabarIsland_FireRed_WaterMonsInfo = { 1, sCinnabarIsland_FireRed_WaterMons };\n\nconst struct WildPokemon sCinnabarIsland_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_SHELLDER },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sCinnabarIsland_FireRed_FishingMonsInfo = { 10, sCinnabarIsland_FireRed_FishingMons };\n\nconst struct WildPokemon sOneIsland_FireRed_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sOneIsland_FireRed_WaterMonsInfo = { 1, sOneIsland_FireRed_WaterMons };\n\nconst struct WildPokemon sOneIsland_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_SHELLDER },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sOneIsland_FireRed_FishingMonsInfo = { 10, sOneIsland_FireRed_FishingMons };\n\nconst struct WildPokemon sFourIsland_FireRed_WaterMons[] =\n{\n    { 5, 15, SPECIES_WOOPER },\n    { 5, 35, SPECIES_PSYDUCK },\n    { 15, 25, SPECIES_WOOPER },\n    { 15, 25, SPECIES_WOOPER },\n    { 15, 25, SPECIES_WOOPER },\n};\n\nconst struct WildPokemonInfo sFourIsland_FireRed_WaterMonsInfo = { 2, sFourIsland_FireRed_WaterMons };\n\nconst struct WildPokemon sFourIsland_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_PSYDUCK },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sFourIsland_FireRed_FishingMonsInfo = { 20, sFourIsland_FireRed_FishingMons };\n\nconst struct WildPokemon sFiveIsland_FireRed_WaterMons[] =\n{\n    { 5, 35, SPECIES_TENTACOOL },\n    { 5, 15, SPECIES_HOPPIP },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sFiveIsland_FireRed_WaterMonsInfo = { 1, sFiveIsland_FireRed_WaterMons };\n\nconst struct WildPokemon sFiveIsland_FireRed_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_HORSEA },\n    { 15, 25, SPECIES_SHELLDER },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SEADRA },\n    { 25, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sFiveIsland_FireRed_FishingMonsInfo = { 10, sFiveIsland_FireRed_FishingMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_FireRed_LandMons[] =\n{\n    { 10, 10, SPECIES_ZUBAT },\n    { 12, 12, SPECIES_ZUBAT },\n    { 8, 8, SPECIES_ZUBAT },\n    { 14, 14, SPECIES_ZUBAT },\n    { 10, 10, SPECIES_ZUBAT },\n    { 12, 12, SPECIES_ZUBAT },\n    { 16, 16, SPECIES_ZUBAT },\n    { 6, 6, SPECIES_ZUBAT },\n    { 8, 8, SPECIES_ZUBAT },\n    { 14, 14, SPECIES_ZUBAT },\n    { 8, 8, SPECIES_ZUBAT },\n    { 14, 14, SPECIES_ZUBAT },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_FireRed_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_2_FireRed_LandMons[] =\n{\n    { 7, 7, SPECIES_MAREEP },\n    { 9, 9, SPECIES_MAREEP },\n    { 5, 5, SPECIES_MAREEP },\n    { 11, 11, SPECIES_MAREEP },\n    { 7, 7, SPECIES_MAREEP },\n    { 9, 9, SPECIES_MAREEP },\n    { 13, 13, SPECIES_MAREEP },\n    { 3, 3, SPECIES_MAREEP },\n    { 5, 5, SPECIES_MAREEP },\n    { 11, 11, SPECIES_MAREEP },\n    { 5, 5, SPECIES_MAREEP },\n    { 11, 11, SPECIES_MAREEP },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_2_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_2_FireRed_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_3_FireRed_LandMons[] =\n{\n    { 23, 23, SPECIES_PINECO },\n    { 25, 25, SPECIES_PINECO },\n    { 22, 22, SPECIES_PINECO },\n    { 27, 27, SPECIES_PINECO },\n    { 23, 23, SPECIES_PINECO },\n    { 25, 25, SPECIES_PINECO },\n    { 29, 29, SPECIES_PINECO },\n    { 19, 19, SPECIES_PINECO },\n    { 21, 21, SPECIES_PINECO },\n    { 27, 27, SPECIES_PINECO },\n    { 21, 21, SPECIES_PINECO },\n    { 27, 27, SPECIES_PINECO },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_3_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_3_FireRed_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_4_FireRed_LandMons[] =\n{\n    { 16, 16, SPECIES_HOUNDOUR },\n    { 18, 18, SPECIES_HOUNDOUR },\n    { 14, 14, SPECIES_HOUNDOUR },\n    { 20, 20, SPECIES_HOUNDOUR },\n    { 16, 16, SPECIES_HOUNDOUR },\n    { 18, 18, SPECIES_HOUNDOUR },\n    { 22, 22, SPECIES_HOUNDOUR },\n    { 12, 12, SPECIES_HOUNDOUR },\n    { 14, 14, SPECIES_HOUNDOUR },\n    { 20, 20, SPECIES_HOUNDOUR },\n    { 14, 14, SPECIES_HOUNDOUR },\n    { 20, 20, SPECIES_HOUNDOUR },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_4_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_4_FireRed_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_5_FireRed_LandMons[] =\n{\n    { 22, 22, SPECIES_TEDDIURSA },\n    { 24, 24, SPECIES_TEDDIURSA },\n    { 20, 20, SPECIES_TEDDIURSA },\n    { 26, 26, SPECIES_TEDDIURSA },\n    { 22, 22, SPECIES_TEDDIURSA },\n    { 24, 24, SPECIES_TEDDIURSA },\n    { 28, 28, SPECIES_TEDDIURSA },\n    { 18, 18, SPECIES_TEDDIURSA },\n    { 20, 20, SPECIES_TEDDIURSA },\n    { 26, 26, SPECIES_TEDDIURSA },\n    { 20, 20, SPECIES_TEDDIURSA },\n    { 26, 26, SPECIES_TEDDIURSA },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_5_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_5_FireRed_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_6_FireRed_LandMons[] =\n{\n    { 22, 22, SPECIES_AIPOM },\n    { 24, 24, SPECIES_AIPOM },\n    { 20, 20, SPECIES_AIPOM },\n    { 26, 26, SPECIES_AIPOM },\n    { 22, 22, SPECIES_AIPOM },\n    { 24, 24, SPECIES_AIPOM },\n    { 28, 28, SPECIES_AIPOM },\n    { 18, 18, SPECIES_AIPOM },\n    { 20, 20, SPECIES_AIPOM },\n    { 26, 26, SPECIES_AIPOM },\n    { 20, 20, SPECIES_AIPOM },\n    { 26, 26, SPECIES_AIPOM },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_6_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_6_FireRed_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_7_FireRed_LandMons[] =\n{\n    { 22, 22, SPECIES_SHUCKLE },\n    { 24, 24, SPECIES_SHUCKLE },\n    { 20, 20, SPECIES_SHUCKLE },\n    { 26, 26, SPECIES_SHUCKLE },\n    { 22, 22, SPECIES_SHUCKLE },\n    { 24, 24, SPECIES_SHUCKLE },\n    { 28, 28, SPECIES_SHUCKLE },\n    { 18, 18, SPECIES_SHUCKLE },\n    { 20, 20, SPECIES_SHUCKLE },\n    { 26, 26, SPECIES_SHUCKLE },\n    { 20, 20, SPECIES_SHUCKLE },\n    { 26, 26, SPECIES_SHUCKLE },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_7_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_7_FireRed_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_8_FireRed_LandMons[] =\n{\n    { 22, 22, SPECIES_STANTLER },\n    { 24, 24, SPECIES_STANTLER },\n    { 20, 20, SPECIES_STANTLER },\n    { 26, 26, SPECIES_STANTLER },\n    { 22, 22, SPECIES_STANTLER },\n    { 24, 24, SPECIES_STANTLER },\n    { 28, 28, SPECIES_STANTLER },\n    { 18, 18, SPECIES_STANTLER },\n    { 20, 20, SPECIES_STANTLER },\n    { 26, 26, SPECIES_STANTLER },\n    { 20, 20, SPECIES_STANTLER },\n    { 26, 26, SPECIES_STANTLER },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_8_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_8_FireRed_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_9_FireRed_LandMons[] =\n{\n    { 22, 22, SPECIES_SMEARGLE },\n    { 24, 24, SPECIES_SMEARGLE },\n    { 20, 20, SPECIES_SMEARGLE },\n    { 26, 26, SPECIES_SMEARGLE },\n    { 22, 22, SPECIES_SMEARGLE },\n    { 24, 24, SPECIES_SMEARGLE },\n    { 28, 28, SPECIES_SMEARGLE },\n    { 18, 18, SPECIES_SMEARGLE },\n    { 20, 20, SPECIES_SMEARGLE },\n    { 26, 26, SPECIES_SMEARGLE },\n    { 20, 20, SPECIES_SMEARGLE },\n    { 26, 26, SPECIES_SMEARGLE },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_9_FireRed_LandMonsInfo = { 5, sSixIslandAlteringCave_9_FireRed_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsMoneanChamber_LeafGreen_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsMoneanChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsMoneanChamber_LeafGreen_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsLiptooChamber_LeafGreen_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsLiptooChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsLiptooChamber_LeafGreen_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsWeepthChamber_LeafGreen_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsWeepthChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsWeepthChamber_LeafGreen_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsDilfordChamber_LeafGreen_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsDilfordChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsDilfordChamber_LeafGreen_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsScufibChamber_LeafGreen_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsScufibChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsScufibChamber_LeafGreen_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsRixyChamber_LeafGreen_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsRixyChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsRixyChamber_LeafGreen_LandMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuinsViapoisChamber_LeafGreen_LandMons[] =\n{\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n    { 25, 25, SPECIES_UNOWN },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuinsViapoisChamber_LeafGreen_LandMonsInfo = { 7, sSevenIslandTanobyRuinsViapoisChamber_LeafGreen_LandMons };\n\nconst struct WildPokemon sViridianForest_LeafGreen_LandMons[] =\n{\n    { 4, 4, SPECIES_CATERPIE },\n    { 4, 4, SPECIES_WEEDLE },\n    { 5, 5, SPECIES_CATERPIE },\n    { 5, 5, SPECIES_WEEDLE },\n    { 3, 3, SPECIES_CATERPIE },\n    { 3, 3, SPECIES_WEEDLE },\n    { 5, 5, SPECIES_KAKUNA },\n    { 5, 5, SPECIES_METAPOD },\n    { 4, 4, SPECIES_METAPOD },\n    { 3, 3, SPECIES_PIKACHU },\n    { 6, 6, SPECIES_METAPOD },\n    { 5, 5, SPECIES_PIKACHU },\n};\n\nconst struct WildPokemonInfo sViridianForest_LeafGreen_LandMonsInfo = { 14, sViridianForest_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtMoon1F_LeafGreen_LandMons[] =\n{\n    { 7, 7, SPECIES_ZUBAT },\n    { 8, 8, SPECIES_ZUBAT },\n    { 7, 7, SPECIES_GEODUDE },\n    { 9, 9, SPECIES_ZUBAT },\n    { 10, 10, SPECIES_ZUBAT },\n    { 8, 8, SPECIES_GEODUDE },\n    { 9, 9, SPECIES_GEODUDE },\n    { 8, 8, SPECIES_PARAS },\n    { 7, 7, SPECIES_ZUBAT },\n    { 7, 7, SPECIES_ZUBAT },\n    { 7, 7, SPECIES_ZUBAT },\n    { 8, 8, SPECIES_CLEFAIRY },\n};\n\nconst struct WildPokemonInfo sMtMoon1F_LeafGreen_LandMonsInfo = { 7, sMtMoon1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtMoonB1F_LeafGreen_LandMons[] =\n{\n    { 7, 7, SPECIES_PARAS },\n    { 8, 8, SPECIES_PARAS },\n    { 5, 5, SPECIES_PARAS },\n    { 6, 6, SPECIES_PARAS },\n    { 9, 9, SPECIES_PARAS },\n    { 10, 10, SPECIES_PARAS },\n    { 7, 7, SPECIES_PARAS },\n    { 8, 8, SPECIES_PARAS },\n    { 5, 5, SPECIES_PARAS },\n    { 6, 6, SPECIES_PARAS },\n    { 9, 9, SPECIES_PARAS },\n    { 10, 10, SPECIES_PARAS },\n};\n\nconst struct WildPokemonInfo sMtMoonB1F_LeafGreen_LandMonsInfo = { 5, sMtMoonB1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtMoonB2F_LeafGreen_LandMons[] =\n{\n    { 8, 8, SPECIES_ZUBAT },\n    { 9, 9, SPECIES_GEODUDE },\n    { 9, 9, SPECIES_ZUBAT },\n    { 10, 10, SPECIES_ZUBAT },\n    { 10, 10, SPECIES_GEODUDE },\n    { 10, 10, SPECIES_PARAS },\n    { 12, 12, SPECIES_PARAS },\n    { 10, 10, SPECIES_CLEFAIRY },\n    { 11, 11, SPECIES_ZUBAT },\n    { 11, 11, SPECIES_ZUBAT },\n    { 11, 11, SPECIES_ZUBAT },\n    { 12, 12, SPECIES_CLEFAIRY },\n};\n\nconst struct WildPokemonInfo sMtMoonB2F_LeafGreen_LandMonsInfo = { 7, sMtMoonB2F_LeafGreen_LandMons };\n\nconst struct WildPokemon sSSAnneExterior_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sSSAnneExterior_LeafGreen_WaterMonsInfo = { 1, sSSAnneExterior_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSSAnneExterior_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_STARYU },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KRABBY },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sSSAnneExterior_LeafGreen_FishingMonsInfo = { 10, sSSAnneExterior_LeafGreen_FishingMons };\n\nconst struct WildPokemon sDiglettsCaveB1F_LeafGreen_LandMons[] =\n{\n    { 18, 18, SPECIES_DIGLETT },\n    { 19, 19, SPECIES_DIGLETT },\n    { 17, 17, SPECIES_DIGLETT },\n    { 15, 15, SPECIES_DIGLETT },\n    { 16, 16, SPECIES_DIGLETT },\n    { 20, 20, SPECIES_DIGLETT },\n    { 21, 21, SPECIES_DIGLETT },\n    { 22, 22, SPECIES_DIGLETT },\n    { 17, 17, SPECIES_DIGLETT },\n    { 29, 29, SPECIES_DUGTRIO },\n    { 17, 17, SPECIES_DIGLETT },\n    { 31, 31, SPECIES_DUGTRIO },\n};\n\nconst struct WildPokemonInfo sDiglettsCaveB1F_LeafGreen_LandMonsInfo = { 5, sDiglettsCaveB1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sVictoryRoad1F_LeafGreen_LandMons[] =\n{\n    { 32, 32, SPECIES_MACHOP },\n    { 32, 32, SPECIES_GEODUDE },\n    { 40, 40, SPECIES_ONIX },\n    { 43, 43, SPECIES_ONIX },\n    { 46, 46, SPECIES_ONIX },\n    { 32, 32, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_SANDSLASH },\n    { 44, 44, SPECIES_GOLBAT },\n    { 44, 44, SPECIES_MAROWAK },\n    { 44, 44, SPECIES_MACHOKE },\n    { 46, 46, SPECIES_MACHOKE },\n    { 46, 46, SPECIES_MAROWAK },\n};\n\nconst struct WildPokemonInfo sVictoryRoad1F_LeafGreen_LandMonsInfo = { 7, sVictoryRoad1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sVictoryRoad2F_LeafGreen_LandMons[] =\n{\n    { 34, 34, SPECIES_MACHOP },\n    { 34, 34, SPECIES_GEODUDE },\n    { 42, 42, SPECIES_PRIMEAPE },\n    { 45, 45, SPECIES_ONIX },\n    { 48, 48, SPECIES_ONIX },\n    { 34, 34, SPECIES_ZUBAT },\n    { 46, 46, SPECIES_SANDSLASH },\n    { 46, 46, SPECIES_GOLBAT },\n    { 46, 46, SPECIES_MAROWAK },\n    { 46, 46, SPECIES_MACHOKE },\n    { 48, 48, SPECIES_MACHOKE },\n    { 48, 48, SPECIES_MAROWAK },\n};\n\nconst struct WildPokemonInfo sVictoryRoad2F_LeafGreen_LandMonsInfo = { 7, sVictoryRoad2F_LeafGreen_LandMons };\n\nconst struct WildPokemon sVictoryRoad3F_LeafGreen_LandMons[] =\n{\n    { 32, 32, SPECIES_MACHOP },\n    { 32, 32, SPECIES_GEODUDE },\n    { 40, 40, SPECIES_ONIX },\n    { 43, 43, SPECIES_ONIX },\n    { 46, 46, SPECIES_ONIX },\n    { 32, 32, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_SANDSLASH },\n    { 44, 44, SPECIES_GOLBAT },\n    { 44, 44, SPECIES_MAROWAK },\n    { 44, 44, SPECIES_MACHOKE },\n    { 46, 46, SPECIES_MACHOKE },\n    { 46, 46, SPECIES_MAROWAK },\n};\n\nconst struct WildPokemonInfo sVictoryRoad3F_LeafGreen_LandMonsInfo = { 7, sVictoryRoad3F_LeafGreen_LandMons };\n\nconst struct WildPokemon sPokemonMansion1F_LeafGreen_LandMons[] =\n{\n    { 28, 28, SPECIES_GRIMER },\n    { 32, 32, SPECIES_RATICATE },\n    { 30, 30, SPECIES_GRIMER },\n    { 36, 36, SPECIES_RATICATE },\n    { 30, 30, SPECIES_VULPIX },\n    { 28, 28, SPECIES_RATTATA },\n    { 28, 28, SPECIES_KOFFING },\n    { 32, 32, SPECIES_MUK },\n    { 32, 32, SPECIES_VULPIX },\n    { 26, 26, SPECIES_RATTATA },\n    { 32, 32, SPECIES_VULPIX },\n    { 26, 26, SPECIES_RATTATA },\n};\n\nconst struct WildPokemonInfo sPokemonMansion1F_LeafGreen_LandMonsInfo = { 7, sPokemonMansion1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sPokemonMansion2F_LeafGreen_LandMons[] =\n{\n    { 28, 28, SPECIES_GRIMER },\n    { 32, 32, SPECIES_RATICATE },\n    { 30, 30, SPECIES_GRIMER },\n    { 36, 36, SPECIES_RATICATE },\n    { 30, 30, SPECIES_VULPIX },\n    { 28, 28, SPECIES_RATTATA },\n    { 28, 28, SPECIES_KOFFING },\n    { 32, 32, SPECIES_MUK },\n    { 32, 32, SPECIES_VULPIX },\n    { 26, 26, SPECIES_RATTATA },\n    { 32, 32, SPECIES_VULPIX },\n    { 26, 26, SPECIES_RATTATA },\n};\n\nconst struct WildPokemonInfo sPokemonMansion2F_LeafGreen_LandMonsInfo = { 7, sPokemonMansion2F_LeafGreen_LandMons };\n\nconst struct WildPokemon sPokemonMansion3F_LeafGreen_LandMons[] =\n{\n    { 28, 28, SPECIES_GRIMER },\n    { 32, 32, SPECIES_RATICATE },\n    { 30, 30, SPECIES_GRIMER },\n    { 36, 36, SPECIES_RATICATE },\n    { 30, 30, SPECIES_VULPIX },\n    { 28, 28, SPECIES_RATTATA },\n    { 28, 28, SPECIES_KOFFING },\n    { 32, 32, SPECIES_MUK },\n    { 32, 32, SPECIES_VULPIX },\n    { 26, 26, SPECIES_RATTATA },\n    { 32, 32, SPECIES_VULPIX },\n    { 26, 26, SPECIES_RATTATA },\n};\n\nconst struct WildPokemonInfo sPokemonMansion3F_LeafGreen_LandMonsInfo = { 7, sPokemonMansion3F_LeafGreen_LandMons };\n\nconst struct WildPokemon sPokemonMansionB1F_LeafGreen_LandMons[] =\n{\n    { 28, 28, SPECIES_GRIMER },\n    { 34, 34, SPECIES_RATICATE },\n    { 30, 30, SPECIES_GRIMER },\n    { 30, 30, SPECIES_DITTO },\n    { 30, 30, SPECIES_VULPIX },\n    { 38, 38, SPECIES_RATICATE },\n    { 28, 28, SPECIES_KOFFING },\n    { 34, 34, SPECIES_MUK },\n    { 32, 32, SPECIES_VULPIX },\n    { 26, 26, SPECIES_RATTATA },\n    { 32, 32, SPECIES_VULPIX },\n    { 26, 26, SPECIES_RATTATA },\n};\n\nconst struct WildPokemonInfo sPokemonMansionB1F_LeafGreen_LandMonsInfo = { 5, sPokemonMansionB1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sSafariZoneCenter_LeafGreen_LandMons[] =\n{\n    { 25, 25, SPECIES_RHYHORN },\n    { 22, 22, SPECIES_NIDORAN_F },\n    { 24, 24, SPECIES_EXEGGCUTE },\n    { 25, 25, SPECIES_EXEGGCUTE },\n    { 22, 22, SPECIES_VENONAT },\n    { 31, 31, SPECIES_NIDORINA },\n    { 31, 31, SPECIES_NIDORINO },\n    { 30, 30, SPECIES_PARASECT },\n    { 22, 22, SPECIES_VENONAT },\n    { 23, 23, SPECIES_PINSIR },\n    { 22, 22, SPECIES_VENONAT },\n    { 23, 23, SPECIES_CHANSEY },\n};\n\nconst struct WildPokemonInfo sSafariZoneCenter_LeafGreen_LandMonsInfo = { 21, sSafariZoneCenter_LeafGreen_LandMons };\n\nconst struct WildPokemon sSafariZoneCenter_LeafGreen_WaterMons[] =\n{\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 25, 30, SPECIES_SLOWPOKE },\n    { 30, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sSafariZoneCenter_LeafGreen_WaterMonsInfo = { 2, sSafariZoneCenter_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSafariZoneCenter_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 15, 25, SPECIES_GOLDEEN },\n    { 20, 30, SPECIES_SEAKING },\n    { 15, 25, SPECIES_DRATINI },\n    { 15, 35, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_DRAGONAIR },\n};\n\nconst struct WildPokemonInfo sSafariZoneCenter_LeafGreen_FishingMonsInfo = { 20, sSafariZoneCenter_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSafariZoneEast_LeafGreen_LandMons[] =\n{\n    { 24, 24, SPECIES_NIDORAN_F },\n    { 26, 26, SPECIES_DODUO },\n    { 23, 23, SPECIES_EXEGGCUTE },\n    { 25, 25, SPECIES_EXEGGCUTE },\n    { 22, 22, SPECIES_PARAS },\n    { 33, 33, SPECIES_NIDORINA },\n    { 24, 24, SPECIES_NIDORAN_M },\n    { 25, 25, SPECIES_PARASECT },\n    { 22, 22, SPECIES_PARAS },\n    { 25, 25, SPECIES_KANGASKHAN },\n    { 22, 22, SPECIES_PARAS },\n    { 28, 28, SPECIES_PINSIR },\n};\n\nconst struct WildPokemonInfo sSafariZoneEast_LeafGreen_LandMonsInfo = { 21, sSafariZoneEast_LeafGreen_LandMons };\n\nconst struct WildPokemon sSafariZoneEast_LeafGreen_WaterMons[] =\n{\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 25, 30, SPECIES_SLOWPOKE },\n    { 30, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sSafariZoneEast_LeafGreen_WaterMonsInfo = { 2, sSafariZoneEast_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSafariZoneEast_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 15, 25, SPECIES_GOLDEEN },\n    { 20, 30, SPECIES_SEAKING },\n    { 15, 25, SPECIES_DRATINI },\n    { 15, 35, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_DRAGONAIR },\n};\n\nconst struct WildPokemonInfo sSafariZoneEast_LeafGreen_FishingMonsInfo = { 20, sSafariZoneEast_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSafariZoneNorth_LeafGreen_LandMons[] =\n{\n    { 26, 26, SPECIES_RHYHORN },\n    { 30, 30, SPECIES_NIDORAN_F },\n    { 25, 25, SPECIES_EXEGGCUTE },\n    { 27, 27, SPECIES_EXEGGCUTE },\n    { 23, 23, SPECIES_PARAS },\n    { 30, 30, SPECIES_NIDORINA },\n    { 30, 30, SPECIES_NIDORINO },\n    { 32, 32, SPECIES_VENOMOTH },\n    { 23, 23, SPECIES_PARAS },\n    { 26, 26, SPECIES_CHANSEY },\n    { 23, 23, SPECIES_PARAS },\n    { 28, 28, SPECIES_TAUROS },\n};\n\nconst struct WildPokemonInfo sSafariZoneNorth_LeafGreen_LandMonsInfo = { 21, sSafariZoneNorth_LeafGreen_LandMons };\n\nconst struct WildPokemon sSafariZoneNorth_LeafGreen_WaterMons[] =\n{\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 25, 30, SPECIES_SLOWPOKE },\n    { 30, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sSafariZoneNorth_LeafGreen_WaterMonsInfo = { 2, sSafariZoneNorth_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSafariZoneNorth_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 15, 25, SPECIES_GOLDEEN },\n    { 20, 30, SPECIES_SEAKING },\n    { 15, 25, SPECIES_DRATINI },\n    { 15, 35, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_DRAGONAIR },\n};\n\nconst struct WildPokemonInfo sSafariZoneNorth_LeafGreen_FishingMonsInfo = { 20, sSafariZoneNorth_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSafariZoneWest_LeafGreen_LandMons[] =\n{\n    { 26, 26, SPECIES_DODUO },\n    { 22, 22, SPECIES_NIDORAN_F },\n    { 25, 25, SPECIES_EXEGGCUTE },\n    { 27, 27, SPECIES_EXEGGCUTE },\n    { 23, 23, SPECIES_VENONAT },\n    { 30, 30, SPECIES_NIDORINA },\n    { 30, 30, SPECIES_NIDORAN_M },\n    { 32, 32, SPECIES_VENOMOTH },\n    { 23, 23, SPECIES_VENONAT },\n    { 25, 25, SPECIES_TAUROS },\n    { 23, 23, SPECIES_VENONAT },\n    { 28, 28, SPECIES_KANGASKHAN },\n};\n\nconst struct WildPokemonInfo sSafariZoneWest_LeafGreen_LandMonsInfo = { 21, sSafariZoneWest_LeafGreen_LandMons };\n\nconst struct WildPokemon sSafariZoneWest_LeafGreen_WaterMons[] =\n{\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 25, 30, SPECIES_SLOWPOKE },\n    { 30, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sSafariZoneWest_LeafGreen_WaterMonsInfo = { 2, sSafariZoneWest_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSafariZoneWest_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 15, 25, SPECIES_GOLDEEN },\n    { 20, 30, SPECIES_SEAKING },\n    { 15, 25, SPECIES_DRATINI },\n    { 15, 35, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_DRAGONAIR },\n};\n\nconst struct WildPokemonInfo sSafariZoneWest_LeafGreen_FishingMonsInfo = { 20, sSafariZoneWest_LeafGreen_FishingMons };\n\nconst struct WildPokemon sCeruleanCave1F_LeafGreen_LandMons[] =\n{\n    { 49, 49, SPECIES_MAGNETON },\n    { 49, 49, SPECIES_PARASECT },\n    { 46, 46, SPECIES_GOLBAT },\n    { 46, 46, SPECIES_MACHOKE },\n    { 52, 52, SPECIES_PRIMEAPE },\n    { 52, 52, SPECIES_DITTO },\n    { 58, 58, SPECIES_ELECTRODE },\n    { 58, 58, SPECIES_PARASECT },\n    { 55, 55, SPECIES_GOLBAT },\n    { 55, 55, SPECIES_WOBBUFFET },\n    { 61, 61, SPECIES_PRIMEAPE },\n    { 61, 61, SPECIES_DITTO },\n};\n\nconst struct WildPokemonInfo sCeruleanCave1F_LeafGreen_LandMonsInfo = { 7, sCeruleanCave1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sCeruleanCave1F_LeafGreen_WaterMons[] =\n{\n    { 30, 40, SPECIES_SLOWPOKE },\n    { 40, 50, SPECIES_SLOWBRO },\n    { 45, 55, SPECIES_SLOWBRO },\n    { 40, 50, SPECIES_SLOWPOKE },\n    { 40, 50, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sCeruleanCave1F_LeafGreen_WaterMonsInfo = { 2, sCeruleanCave1F_LeafGreen_WaterMons };\n\nconst struct WildPokemon sCeruleanCave1F_LeafGreen_RockSmashMons[] =\n{\n    { 30, 40, SPECIES_GEODUDE },\n    { 40, 50, SPECIES_GRAVELER },\n    { 45, 55, SPECIES_GRAVELER },\n    { 40, 50, SPECIES_GEODUDE },\n    { 40, 50, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sCeruleanCave1F_LeafGreen_RockSmashMonsInfo = { 50, sCeruleanCave1F_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sCeruleanCave1F_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sCeruleanCave1F_LeafGreen_FishingMonsInfo = { 20, sCeruleanCave1F_LeafGreen_FishingMons };\n\nconst struct WildPokemon sCeruleanCave2F_LeafGreen_LandMons[] =\n{\n    { 49, 49, SPECIES_GOLBAT },\n    { 49, 49, SPECIES_MACHOKE },\n    { 52, 52, SPECIES_MAGNETON },\n    { 52, 52, SPECIES_PARASECT },\n    { 55, 55, SPECIES_KADABRA },\n    { 55, 55, SPECIES_DITTO },\n    { 58, 58, SPECIES_GOLBAT },\n    { 58, 58, SPECIES_WOBBUFFET },\n    { 61, 61, SPECIES_ELECTRODE },\n    { 61, 61, SPECIES_PARASECT },\n    { 64, 64, SPECIES_KADABRA },\n    { 64, 64, SPECIES_DITTO },\n};\n\nconst struct WildPokemonInfo sCeruleanCave2F_LeafGreen_LandMonsInfo = { 7, sCeruleanCave2F_LeafGreen_LandMons };\n\nconst struct WildPokemon sCeruleanCave2F_LeafGreen_RockSmashMons[] =\n{\n    { 35, 45, SPECIES_GEODUDE },\n    { 45, 55, SPECIES_GRAVELER },\n    { 50, 60, SPECIES_GRAVELER },\n    { 45, 55, SPECIES_GEODUDE },\n    { 45, 55, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sCeruleanCave2F_LeafGreen_RockSmashMonsInfo = { 50, sCeruleanCave2F_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sCeruleanCaveB1F_LeafGreen_LandMons[] =\n{\n    { 58, 58, SPECIES_KADABRA },\n    { 58, 58, SPECIES_DITTO },\n    { 55, 55, SPECIES_MAGNETON },\n    { 55, 55, SPECIES_PARASECT },\n    { 52, 52, SPECIES_GOLBAT },\n    { 52, 52, SPECIES_MACHOKE },\n    { 67, 67, SPECIES_KADABRA },\n    { 67, 67, SPECIES_DITTO },\n    { 64, 64, SPECIES_ELECTRODE },\n    { 64, 64, SPECIES_PARASECT },\n    { 61, 61, SPECIES_GOLBAT },\n    { 61, 61, SPECIES_WOBBUFFET },\n};\n\nconst struct WildPokemonInfo sCeruleanCaveB1F_LeafGreen_LandMonsInfo = { 7, sCeruleanCaveB1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sCeruleanCaveB1F_LeafGreen_WaterMons[] =\n{\n    { 40, 50, SPECIES_SLOWPOKE },\n    { 50, 60, SPECIES_SLOWBRO },\n    { 55, 65, SPECIES_SLOWBRO },\n    { 50, 60, SPECIES_SLOWPOKE },\n    { 50, 60, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sCeruleanCaveB1F_LeafGreen_WaterMonsInfo = { 2, sCeruleanCaveB1F_LeafGreen_WaterMons };\n\nconst struct WildPokemon sCeruleanCaveB1F_LeafGreen_RockSmashMons[] =\n{\n    { 40, 50, SPECIES_GEODUDE },\n    { 50, 60, SPECIES_GRAVELER },\n    { 55, 65, SPECIES_GRAVELER },\n    { 50, 60, SPECIES_GEODUDE },\n    { 50, 60, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sCeruleanCaveB1F_LeafGreen_RockSmashMonsInfo = { 50, sCeruleanCaveB1F_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sCeruleanCaveB1F_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_GYARADOS },\n};\n\nconst struct WildPokemonInfo sCeruleanCaveB1F_LeafGreen_FishingMonsInfo = { 20, sCeruleanCaveB1F_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRockTunnel1F_LeafGreen_LandMons[] =\n{\n    { 15, 15, SPECIES_ZUBAT },\n    { 16, 16, SPECIES_GEODUDE },\n    { 16, 16, SPECIES_MANKEY },\n    { 17, 17, SPECIES_GEODUDE },\n    { 16, 16, SPECIES_ZUBAT },\n    { 16, 16, SPECIES_MACHOP },\n    { 17, 17, SPECIES_MANKEY },\n    { 17, 17, SPECIES_MACHOP },\n    { 15, 15, SPECIES_GEODUDE },\n    { 13, 13, SPECIES_ONIX },\n    { 15, 15, SPECIES_GEODUDE },\n    { 15, 15, SPECIES_ONIX },\n};\n\nconst struct WildPokemonInfo sRockTunnel1F_LeafGreen_LandMonsInfo = { 7, sRockTunnel1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sRockTunnelB1F_LeafGreen_LandMons[] =\n{\n    { 16, 16, SPECIES_ZUBAT },\n    { 17, 17, SPECIES_GEODUDE },\n    { 17, 17, SPECIES_MANKEY },\n    { 16, 16, SPECIES_GEODUDE },\n    { 15, 15, SPECIES_ZUBAT },\n    { 17, 17, SPECIES_MACHOP },\n    { 16, 16, SPECIES_MANKEY },\n    { 13, 13, SPECIES_ONIX },\n    { 15, 15, SPECIES_GEODUDE },\n    { 15, 15, SPECIES_ONIX },\n    { 15, 15, SPECIES_GEODUDE },\n    { 17, 17, SPECIES_ONIX },\n};\n\nconst struct WildPokemonInfo sRockTunnelB1F_LeafGreen_LandMonsInfo = { 7, sRockTunnelB1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sRockTunnelB1F_LeafGreen_RockSmashMons[] =\n{\n    { 5, 20, SPECIES_GEODUDE },\n    { 10, 20, SPECIES_GEODUDE },\n    { 15, 30, SPECIES_GEODUDE },\n    { 25, 40, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GRAVELER },\n};\n\nconst struct WildPokemonInfo sRockTunnelB1F_LeafGreen_RockSmashMonsInfo = { 50, sRockTunnelB1F_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sSeafoamIslands1F_LeafGreen_LandMons[] =\n{\n    { 27, 27, SPECIES_SLOWPOKE },\n    { 29, 29, SPECIES_SLOWPOKE },\n    { 31, 31, SPECIES_SLOWPOKE },\n    { 22, 22, SPECIES_ZUBAT },\n    { 22, 22, SPECIES_ZUBAT },\n    { 24, 24, SPECIES_ZUBAT },\n    { 26, 26, SPECIES_GOLBAT },\n    { 28, 28, SPECIES_GOLBAT },\n    { 33, 33, SPECIES_SLOWPOKE },\n    { 26, 26, SPECIES_ZUBAT },\n    { 26, 26, SPECIES_SLOWPOKE },\n    { 30, 30, SPECIES_GOLBAT },\n};\n\nconst struct WildPokemonInfo sSeafoamIslands1F_LeafGreen_LandMonsInfo = { 7, sSeafoamIslands1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sSeafoamIslandsB1F_LeafGreen_LandMons[] =\n{\n    { 29, 29, SPECIES_SLOWPOKE },\n    { 31, 31, SPECIES_SLOWPOKE },\n    { 28, 28, SPECIES_SEEL },\n    { 22, 22, SPECIES_ZUBAT },\n    { 22, 22, SPECIES_ZUBAT },\n    { 24, 24, SPECIES_ZUBAT },\n    { 26, 26, SPECIES_GOLBAT },\n    { 28, 28, SPECIES_GOLBAT },\n    { 33, 33, SPECIES_SLOWBRO },\n    { 26, 26, SPECIES_ZUBAT },\n    { 35, 35, SPECIES_SLOWBRO },\n    { 30, 30, SPECIES_GOLBAT },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB1F_LeafGreen_LandMonsInfo = { 7, sSeafoamIslandsB1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sSeafoamIslandsB2F_LeafGreen_LandMons[] =\n{\n    { 30, 30, SPECIES_SLOWPOKE },\n    { 32, 32, SPECIES_SLOWPOKE },\n    { 30, 30, SPECIES_SEEL },\n    { 32, 32, SPECIES_SEEL },\n    { 22, 22, SPECIES_ZUBAT },\n    { 24, 24, SPECIES_ZUBAT },\n    { 26, 26, SPECIES_GOLBAT },\n    { 34, 34, SPECIES_SLOWBRO },\n    { 32, 32, SPECIES_SLOWBRO },\n    { 28, 28, SPECIES_GOLBAT },\n    { 32, 32, SPECIES_SLOWBRO },\n    { 30, 30, SPECIES_GOLBAT },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB2F_LeafGreen_LandMonsInfo = { 7, sSeafoamIslandsB2F_LeafGreen_LandMons };\n\nconst struct WildPokemon sSeafoamIslandsB3F_LeafGreen_LandMons[] =\n{\n    { 30, 30, SPECIES_SEEL },\n    { 32, 32, SPECIES_SEEL },\n    { 32, 32, SPECIES_SLOWPOKE },\n    { 30, 30, SPECIES_SLOWPOKE },\n    { 32, 32, SPECIES_SLOWBRO },\n    { 24, 24, SPECIES_ZUBAT },\n    { 26, 26, SPECIES_GOLBAT },\n    { 34, 34, SPECIES_SLOWBRO },\n    { 32, 32, SPECIES_DEWGONG },\n    { 28, 28, SPECIES_GOLBAT },\n    { 34, 34, SPECIES_DEWGONG },\n    { 30, 30, SPECIES_GOLBAT },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB3F_LeafGreen_LandMonsInfo = { 7, sSeafoamIslandsB3F_LeafGreen_LandMons };\n\nconst struct WildPokemon sSeafoamIslandsB3F_LeafGreen_WaterMons[] =\n{\n    { 25, 35, SPECIES_SEEL },\n    { 25, 30, SPECIES_KRABBY },\n    { 35, 40, SPECIES_DEWGONG },\n    { 30, 40, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWBRO },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB3F_LeafGreen_WaterMonsInfo = { 2, sSeafoamIslandsB3F_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSeafoamIslandsB3F_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 20, 30, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_GYARADOS },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB3F_LeafGreen_FishingMonsInfo = { 20, sSeafoamIslandsB3F_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSeafoamIslandsB4F_LeafGreen_LandMons[] =\n{\n    { 30, 30, SPECIES_SEEL },\n    { 32, 32, SPECIES_SEEL },\n    { 32, 32, SPECIES_SLOWPOKE },\n    { 34, 34, SPECIES_SEEL },\n    { 32, 32, SPECIES_SLOWBRO },\n    { 26, 26, SPECIES_GOLBAT },\n    { 34, 34, SPECIES_DEWGONG },\n    { 34, 34, SPECIES_SLOWBRO },\n    { 36, 36, SPECIES_DEWGONG },\n    { 28, 28, SPECIES_GOLBAT },\n    { 36, 36, SPECIES_DEWGONG },\n    { 30, 30, SPECIES_GOLBAT },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB4F_LeafGreen_LandMonsInfo = { 7, sSeafoamIslandsB4F_LeafGreen_LandMons };\n\nconst struct WildPokemon sSeafoamIslandsB4F_LeafGreen_WaterMons[] =\n{\n    { 25, 35, SPECIES_SEEL },\n    { 25, 30, SPECIES_KRABBY },\n    { 35, 40, SPECIES_DEWGONG },\n    { 30, 40, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWBRO },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB4F_LeafGreen_WaterMonsInfo = { 2, sSeafoamIslandsB4F_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSeafoamIslandsB4F_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 20, 30, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_GYARADOS },\n};\n\nconst struct WildPokemonInfo sSeafoamIslandsB4F_LeafGreen_FishingMonsInfo = { 20, sSeafoamIslandsB4F_LeafGreen_FishingMons };\n\nconst struct WildPokemon sPokemonTower3F_LeafGreen_LandMons[] =\n{\n    { 15, 15, SPECIES_GASTLY },\n    { 16, 16, SPECIES_GASTLY },\n    { 17, 17, SPECIES_GASTLY },\n    { 13, 13, SPECIES_GASTLY },\n    { 14, 14, SPECIES_GASTLY },\n    { 18, 18, SPECIES_GASTLY },\n    { 19, 19, SPECIES_GASTLY },\n    { 15, 15, SPECIES_CUBONE },\n    { 17, 17, SPECIES_GASTLY },\n    { 17, 17, SPECIES_CUBONE },\n    { 17, 17, SPECIES_GASTLY },\n    { 20, 20, SPECIES_HAUNTER },\n};\n\nconst struct WildPokemonInfo sPokemonTower3F_LeafGreen_LandMonsInfo = { 2, sPokemonTower3F_LeafGreen_LandMons };\n\nconst struct WildPokemon sPokemonTower4F_LeafGreen_LandMons[] =\n{\n    { 15, 15, SPECIES_GASTLY },\n    { 16, 16, SPECIES_GASTLY },\n    { 17, 17, SPECIES_GASTLY },\n    { 13, 13, SPECIES_GASTLY },\n    { 14, 14, SPECIES_GASTLY },\n    { 18, 18, SPECIES_GASTLY },\n    { 20, 20, SPECIES_HAUNTER },\n    { 15, 15, SPECIES_CUBONE },\n    { 17, 17, SPECIES_GASTLY },\n    { 17, 17, SPECIES_CUBONE },\n    { 17, 17, SPECIES_GASTLY },\n    { 19, 19, SPECIES_GASTLY },\n};\n\nconst struct WildPokemonInfo sPokemonTower4F_LeafGreen_LandMonsInfo = { 4, sPokemonTower4F_LeafGreen_LandMons };\n\nconst struct WildPokemon sPokemonTower5F_LeafGreen_LandMons[] =\n{\n    { 15, 15, SPECIES_GASTLY },\n    { 16, 16, SPECIES_GASTLY },\n    { 17, 17, SPECIES_GASTLY },\n    { 13, 13, SPECIES_GASTLY },\n    { 14, 14, SPECIES_GASTLY },\n    { 18, 18, SPECIES_GASTLY },\n    { 20, 20, SPECIES_HAUNTER },\n    { 15, 15, SPECIES_CUBONE },\n    { 17, 17, SPECIES_GASTLY },\n    { 17, 17, SPECIES_CUBONE },\n    { 17, 17, SPECIES_GASTLY },\n    { 19, 19, SPECIES_GASTLY },\n};\n\nconst struct WildPokemonInfo sPokemonTower5F_LeafGreen_LandMonsInfo = { 6, sPokemonTower5F_LeafGreen_LandMons };\n\nconst struct WildPokemon sPokemonTower6F_LeafGreen_LandMons[] =\n{\n    { 16, 16, SPECIES_GASTLY },\n    { 17, 17, SPECIES_GASTLY },\n    { 18, 18, SPECIES_GASTLY },\n    { 14, 14, SPECIES_GASTLY },\n    { 15, 15, SPECIES_GASTLY },\n    { 19, 19, SPECIES_GASTLY },\n    { 21, 21, SPECIES_HAUNTER },\n    { 17, 17, SPECIES_CUBONE },\n    { 18, 18, SPECIES_GASTLY },\n    { 19, 19, SPECIES_CUBONE },\n    { 18, 18, SPECIES_GASTLY },\n    { 23, 23, SPECIES_HAUNTER },\n};\n\nconst struct WildPokemonInfo sPokemonTower6F_LeafGreen_LandMonsInfo = { 8, sPokemonTower6F_LeafGreen_LandMons };\n\nconst struct WildPokemon sPokemonTower7F_LeafGreen_LandMons[] =\n{\n    { 16, 16, SPECIES_GASTLY },\n    { 17, 17, SPECIES_GASTLY },\n    { 18, 18, SPECIES_GASTLY },\n    { 15, 15, SPECIES_GASTLY },\n    { 19, 19, SPECIES_GASTLY },\n    { 23, 23, SPECIES_HAUNTER },\n    { 17, 17, SPECIES_CUBONE },\n    { 19, 19, SPECIES_CUBONE },\n    { 18, 18, SPECIES_GASTLY },\n    { 23, 23, SPECIES_HAUNTER },\n    { 18, 18, SPECIES_GASTLY },\n    { 25, 25, SPECIES_HAUNTER },\n};\n\nconst struct WildPokemonInfo sPokemonTower7F_LeafGreen_LandMonsInfo = { 10, sPokemonTower7F_LeafGreen_LandMons };\n\nconst struct WildPokemon sPowerPlant_LeafGreen_LandMons[] =\n{\n    { 22, 22, SPECIES_VOLTORB },\n    { 22, 22, SPECIES_MAGNEMITE },\n    { 25, 25, SPECIES_VOLTORB },\n    { 25, 25, SPECIES_MAGNEMITE },\n    { 22, 22, SPECIES_PIKACHU },\n    { 24, 24, SPECIES_PIKACHU },\n    { 31, 31, SPECIES_MAGNETON },\n    { 34, 34, SPECIES_MAGNETON },\n    { 26, 26, SPECIES_PIKACHU },\n    { 31, 31, SPECIES_MAGNETON },\n    { 26, 26, SPECIES_PIKACHU },\n    { 34, 34, SPECIES_MAGNETON },\n};\n\nconst struct WildPokemonInfo sPowerPlant_LeafGreen_LandMonsInfo = { 7, sPowerPlant_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtEmberExterior_LeafGreen_LandMons[] =\n{\n    { 30, 30, SPECIES_PONYTA },\n    { 38, 38, SPECIES_FEAROW },\n    { 33, 33, SPECIES_PONYTA },\n    { 32, 32, SPECIES_SPEAROW },\n    { 35, 35, SPECIES_MACHOP },\n    { 33, 33, SPECIES_GEODUDE },\n    { 36, 36, SPECIES_PONYTA },\n    { 40, 40, SPECIES_FEAROW },\n    { 38, 38, SPECIES_MAGMAR },\n    { 39, 39, SPECIES_RAPIDASH },\n    { 40, 40, SPECIES_MAGMAR },\n    { 42, 42, SPECIES_RAPIDASH },\n};\n\nconst struct WildPokemonInfo sMtEmberExterior_LeafGreen_LandMonsInfo = { 21, sMtEmberExterior_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtEmberExterior_LeafGreen_RockSmashMons[] =\n{\n    { 5, 20, SPECIES_GEODUDE },\n    { 10, 20, SPECIES_GEODUDE },\n    { 15, 30, SPECIES_GEODUDE },\n    { 25, 40, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GRAVELER },\n};\n\nconst struct WildPokemonInfo sMtEmberExterior_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberExterior_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sMtEmberSummitPath1F_LeafGreen_LandMons[] =\n{\n    { 33, 33, SPECIES_GEODUDE },\n    { 35, 35, SPECIES_MACHOP },\n    { 29, 29, SPECIES_GEODUDE },\n    { 31, 31, SPECIES_GEODUDE },\n    { 31, 31, SPECIES_MACHOP },\n    { 33, 33, SPECIES_MACHOP },\n    { 35, 35, SPECIES_GEODUDE },\n    { 37, 37, SPECIES_MACHOP },\n    { 37, 37, SPECIES_GEODUDE },\n    { 39, 39, SPECIES_MACHOP },\n    { 37, 37, SPECIES_GEODUDE },\n    { 39, 39, SPECIES_MACHOP },\n};\n\nconst struct WildPokemonInfo sMtEmberSummitPath1F_LeafGreen_LandMonsInfo = { 7, sMtEmberSummitPath1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtEmberSummitPath2F_LeafGreen_LandMons[] =\n{\n    { 34, 34, SPECIES_GEODUDE },\n    { 36, 36, SPECIES_MACHOP },\n    { 30, 30, SPECIES_GEODUDE },\n    { 32, 32, SPECIES_GEODUDE },\n    { 32, 32, SPECIES_MACHOP },\n    { 34, 34, SPECIES_MACHOP },\n    { 38, 38, SPECIES_MACHOKE },\n    { 38, 38, SPECIES_MACHOKE },\n    { 40, 40, SPECIES_MACHOKE },\n    { 40, 40, SPECIES_MACHOKE },\n    { 40, 40, SPECIES_MACHOKE },\n    { 40, 40, SPECIES_MACHOKE },\n};\n\nconst struct WildPokemonInfo sMtEmberSummitPath2F_LeafGreen_LandMonsInfo = { 7, sMtEmberSummitPath2F_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtEmberSummitPath2F_LeafGreen_RockSmashMons[] =\n{\n    { 5, 20, SPECIES_GEODUDE },\n    { 10, 20, SPECIES_GEODUDE },\n    { 15, 30, SPECIES_GEODUDE },\n    { 25, 40, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GRAVELER },\n};\n\nconst struct WildPokemonInfo sMtEmberSummitPath2F_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberSummitPath2F_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sMtEmberSummitPath3F_LeafGreen_LandMons[] =\n{\n    { 33, 33, SPECIES_GEODUDE },\n    { 35, 35, SPECIES_MACHOP },\n    { 29, 29, SPECIES_GEODUDE },\n    { 31, 31, SPECIES_GEODUDE },\n    { 31, 31, SPECIES_MACHOP },\n    { 33, 33, SPECIES_MACHOP },\n    { 35, 35, SPECIES_GEODUDE },\n    { 37, 37, SPECIES_MACHOP },\n    { 37, 37, SPECIES_GEODUDE },\n    { 39, 39, SPECIES_MACHOP },\n    { 37, 37, SPECIES_GEODUDE },\n    { 39, 39, SPECIES_MACHOP },\n};\n\nconst struct WildPokemonInfo sMtEmberSummitPath3F_LeafGreen_LandMonsInfo = { 7, sMtEmberSummitPath3F_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPath1F_LeafGreen_LandMons[] =\n{\n    { 36, 36, SPECIES_GEODUDE },\n    { 38, 38, SPECIES_MACHOP },\n    { 32, 32, SPECIES_GEODUDE },\n    { 34, 34, SPECIES_GEODUDE },\n    { 34, 34, SPECIES_MACHOP },\n    { 36, 36, SPECIES_MACHOP },\n    { 38, 38, SPECIES_GEODUDE },\n    { 40, 40, SPECIES_MACHOKE },\n    { 40, 40, SPECIES_GEODUDE },\n    { 42, 42, SPECIES_MACHOKE },\n    { 40, 40, SPECIES_GEODUDE },\n    { 42, 42, SPECIES_MACHOKE },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPath1F_LeafGreen_LandMonsInfo = { 7, sMtEmberRubyPath1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPath1F_LeafGreen_RockSmashMons[] =\n{\n    { 25, 35, SPECIES_GEODUDE },\n    { 30, 45, SPECIES_GRAVELER },\n    { 35, 50, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GEODUDE },\n    { 30, 40, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPath1F_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberRubyPath1F_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sMtEmberRubyPathB1F_LeafGreen_LandMons[] =\n{\n    { 38, 38, SPECIES_GEODUDE },\n    { 36, 36, SPECIES_GEODUDE },\n    { 34, 34, SPECIES_GEODUDE },\n    { 40, 40, SPECIES_GEODUDE },\n    { 24, 24, SPECIES_SLUGMA },\n    { 26, 26, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 28, 28, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 30, 30, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 30, 30, SPECIES_SLUGMA },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB1F_LeafGreen_LandMonsInfo = { 7, sMtEmberRubyPathB1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPathB1F_LeafGreen_RockSmashMons[] =\n{\n    { 25, 35, SPECIES_GEODUDE },\n    { 30, 45, SPECIES_GRAVELER },\n    { 35, 50, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GEODUDE },\n    { 30, 40, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB1F_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberRubyPathB1F_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sMtEmberRubyPathB2F_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GEODUDE },\n    { 26, 26, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 24, 24, SPECIES_SLUGMA },\n    { 28, 28, SPECIES_SLUGMA },\n    { 30, 30, SPECIES_SLUGMA },\n    { 44, 44, SPECIES_GEODUDE },\n    { 32, 32, SPECIES_SLUGMA },\n    { 44, 44, SPECIES_GEODUDE },\n    { 22, 22, SPECIES_SLUGMA },\n    { 44, 44, SPECIES_GEODUDE },\n    { 22, 22, SPECIES_SLUGMA },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB2F_LeafGreen_LandMonsInfo = { 7, sMtEmberRubyPathB2F_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPathB2F_LeafGreen_RockSmashMons[] =\n{\n    { 25, 35, SPECIES_GEODUDE },\n    { 30, 45, SPECIES_GRAVELER },\n    { 35, 50, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GEODUDE },\n    { 30, 40, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB2F_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberRubyPathB2F_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sMtEmberRubyPathB3F_LeafGreen_LandMons[] =\n{\n    { 26, 26, SPECIES_SLUGMA },\n    { 28, 28, SPECIES_SLUGMA },\n    { 30, 30, SPECIES_SLUGMA },\n    { 32, 32, SPECIES_SLUGMA },\n    { 24, 24, SPECIES_SLUGMA },\n    { 22, 22, SPECIES_SLUGMA },\n    { 20, 20, SPECIES_SLUGMA },\n    { 34, 34, SPECIES_SLUGMA },\n    { 36, 36, SPECIES_SLUGMA },\n    { 18, 18, SPECIES_SLUGMA },\n    { 36, 36, SPECIES_SLUGMA },\n    { 18, 18, SPECIES_SLUGMA },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB3F_LeafGreen_LandMonsInfo = { 7, sMtEmberRubyPathB3F_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPathB3F_LeafGreen_RockSmashMons[] =\n{\n    { 15, 25, SPECIES_SLUGMA },\n    { 25, 35, SPECIES_SLUGMA },\n    { 40, 45, SPECIES_MAGCARGO },\n    { 35, 45, SPECIES_MAGCARGO },\n    { 25, 35, SPECIES_MAGCARGO },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB3F_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberRubyPathB3F_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sMtEmberRubyPathB1FStairs_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GEODUDE },\n    { 26, 26, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 24, 24, SPECIES_SLUGMA },\n    { 28, 28, SPECIES_SLUGMA },\n    { 30, 30, SPECIES_SLUGMA },\n    { 44, 44, SPECIES_GEODUDE },\n    { 32, 32, SPECIES_SLUGMA },\n    { 44, 44, SPECIES_GEODUDE },\n    { 22, 22, SPECIES_SLUGMA },\n    { 44, 44, SPECIES_GEODUDE },\n    { 22, 22, SPECIES_SLUGMA },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB1FStairs_LeafGreen_LandMonsInfo = { 7, sMtEmberRubyPathB1FStairs_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPathB1FStairs_LeafGreen_RockSmashMons[] =\n{\n    { 25, 35, SPECIES_GEODUDE },\n    { 30, 45, SPECIES_GRAVELER },\n    { 35, 50, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GEODUDE },\n    { 30, 40, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB1FStairs_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberRubyPathB1FStairs_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sMtEmberRubyPathB2FStairs_LeafGreen_LandMons[] =\n{\n    { 38, 38, SPECIES_GEODUDE },\n    { 36, 36, SPECIES_GEODUDE },\n    { 34, 34, SPECIES_GEODUDE },\n    { 40, 40, SPECIES_GEODUDE },\n    { 24, 24, SPECIES_SLUGMA },\n    { 26, 26, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 28, 28, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 30, 30, SPECIES_SLUGMA },\n    { 42, 42, SPECIES_GEODUDE },\n    { 30, 30, SPECIES_SLUGMA },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB2FStairs_LeafGreen_LandMonsInfo = { 7, sMtEmberRubyPathB2FStairs_LeafGreen_LandMons };\n\nconst struct WildPokemon sMtEmberRubyPathB2FStairs_LeafGreen_RockSmashMons[] =\n{\n    { 25, 35, SPECIES_GEODUDE },\n    { 30, 45, SPECIES_GRAVELER },\n    { 35, 50, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GEODUDE },\n    { 30, 40, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sMtEmberRubyPathB2FStairs_LeafGreen_RockSmashMonsInfo = { 50, sMtEmberRubyPathB2FStairs_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sThreeIslandBerryForest_LeafGreen_LandMons[] =\n{\n    { 37, 37, SPECIES_PIDGEOTTO },\n    { 35, 35, SPECIES_WEEPINBELL },\n    { 32, 32, SPECIES_PIDGEY },\n    { 30, 30, SPECIES_BELLSPROUT },\n    { 34, 34, SPECIES_VENONAT },\n    { 34, 34, SPECIES_DROWZEE },\n    { 35, 35, SPECIES_EXEGGCUTE },\n    { 31, 31, SPECIES_SLOWPOKE },\n    { 37, 37, SPECIES_VENOMOTH },\n    { 37, 37, SPECIES_HYPNO },\n    { 40, 40, SPECIES_VENOMOTH },\n    { 40, 40, SPECIES_HYPNO },\n};\n\nconst struct WildPokemonInfo sThreeIslandBerryForest_LeafGreen_LandMonsInfo = { 21, sThreeIslandBerryForest_LeafGreen_LandMons };\n\nconst struct WildPokemon sThreeIslandBerryForest_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_SLOWPOKE },\n    { 20, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWBRO },\n    { 35, 40, SPECIES_SLOWBRO },\n};\n\nconst struct WildPokemonInfo sThreeIslandBerryForest_LeafGreen_WaterMonsInfo = { 2, sThreeIslandBerryForest_LeafGreen_WaterMons };\n\nconst struct WildPokemon sThreeIslandBerryForest_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 15, 25, SPECIES_GOLDEEN },\n    { 20, 30, SPECIES_SEAKING },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sThreeIslandBerryForest_LeafGreen_FishingMonsInfo = { 20, sThreeIslandBerryForest_LeafGreen_FishingMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveEntrance_LeafGreen_LandMons[] =\n{\n    { 43, 43, SPECIES_SEEL },\n    { 45, 45, SPECIES_GOLBAT },\n    { 45, 45, SPECIES_SEEL },\n    { 47, 47, SPECIES_SEEL },\n    { 40, 40, SPECIES_ZUBAT },\n    { 49, 49, SPECIES_DEWGONG },\n    { 51, 51, SPECIES_DEWGONG },\n    { 41, 41, SPECIES_SLOWPOKE },\n    { 48, 48, SPECIES_GOLBAT },\n    { 53, 53, SPECIES_DEWGONG },\n    { 48, 48, SPECIES_GOLBAT },\n    { 53, 53, SPECIES_DEWGONG },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveEntrance_LeafGreen_LandMonsInfo = { 7, sFourIslandIcefallCaveEntrance_LeafGreen_LandMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveEntrance_LeafGreen_WaterMons[] =\n{\n    { 5, 35, SPECIES_SEEL },\n    { 5, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_DEWGONG },\n    { 5, 15, SPECIES_MARILL },\n    { 5, 15, SPECIES_MARILL },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveEntrance_LeafGreen_WaterMonsInfo = { 2, sFourIslandIcefallCaveEntrance_LeafGreen_WaterMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveEntrance_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveEntrance_LeafGreen_FishingMonsInfo = { 20, sFourIslandIcefallCaveEntrance_LeafGreen_FishingMons };\n\nconst struct WildPokemon sFourIslandIcefallCave1F_LeafGreen_LandMons[] =\n{\n    { 25, 25, SPECIES_SWINUB },\n    { 45, 45, SPECIES_GOLBAT },\n    { 45, 45, SPECIES_SEEL },\n    { 27, 27, SPECIES_SWINUB },\n    { 40, 40, SPECIES_ZUBAT },\n    { 29, 29, SPECIES_SWINUB },\n    { 30, 30, SPECIES_SNEASEL },\n    { 31, 31, SPECIES_SWINUB },\n    { 48, 48, SPECIES_GOLBAT },\n    { 23, 23, SPECIES_SWINUB },\n    { 48, 48, SPECIES_GOLBAT },\n    { 23, 23, SPECIES_SWINUB },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCave1F_LeafGreen_LandMonsInfo = { 7, sFourIslandIcefallCave1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveB1F_LeafGreen_LandMons[] =\n{\n    { 25, 25, SPECIES_SWINUB },\n    { 45, 45, SPECIES_GOLBAT },\n    { 45, 45, SPECIES_SEEL },\n    { 27, 27, SPECIES_SWINUB },\n    { 40, 40, SPECIES_ZUBAT },\n    { 29, 29, SPECIES_SWINUB },\n    { 30, 30, SPECIES_SNEASEL },\n    { 31, 31, SPECIES_SWINUB },\n    { 48, 48, SPECIES_GOLBAT },\n    { 23, 23, SPECIES_SWINUB },\n    { 48, 48, SPECIES_GOLBAT },\n    { 23, 23, SPECIES_SWINUB },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveB1F_LeafGreen_LandMonsInfo = { 7, sFourIslandIcefallCaveB1F_LeafGreen_LandMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveBack_LeafGreen_LandMons[] =\n{\n    { 43, 43, SPECIES_SEEL },\n    { 45, 45, SPECIES_GOLBAT },\n    { 45, 45, SPECIES_SEEL },\n    { 47, 47, SPECIES_SEEL },\n    { 40, 40, SPECIES_ZUBAT },\n    { 49, 49, SPECIES_DEWGONG },\n    { 51, 51, SPECIES_DEWGONG },\n    { 41, 41, SPECIES_SLOWPOKE },\n    { 48, 48, SPECIES_GOLBAT },\n    { 53, 53, SPECIES_DEWGONG },\n    { 48, 48, SPECIES_GOLBAT },\n    { 53, 53, SPECIES_DEWGONG },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveBack_LeafGreen_LandMonsInfo = { 7, sFourIslandIcefallCaveBack_LeafGreen_LandMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveBack_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 45, SPECIES_TENTACOOL },\n    { 35, 45, SPECIES_TENTACRUEL },\n    { 30, 45, SPECIES_LAPRAS },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveBack_LeafGreen_WaterMonsInfo = { 2, sFourIslandIcefallCaveBack_LeafGreen_WaterMons };\n\nconst struct WildPokemon sFourIslandIcefallCaveBack_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_STARYU },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sFourIslandIcefallCaveBack_LeafGreen_FishingMonsInfo = { 20, sFourIslandIcefallCaveBack_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSixIslandPatternBush_LeafGreen_LandMons[] =\n{\n    { 9, 9, SPECIES_LEDYBA },\n    { 9, 9, SPECIES_KAKUNA },\n    { 14, 14, SPECIES_LEDYBA },\n    { 6, 6, SPECIES_CATERPIE },\n    { 6, 6, SPECIES_WEEDLE },\n    { 15, 15, SPECIES_HERACROSS },\n    { 9, 9, SPECIES_METAPOD },\n    { 20, 20, SPECIES_HERACROSS },\n    { 9, 9, SPECIES_SPINARAK },\n    { 25, 25, SPECIES_HERACROSS },\n    { 14, 14, SPECIES_SPINARAK },\n    { 30, 30, SPECIES_HERACROSS },\n};\n\nconst struct WildPokemonInfo sSixIslandPatternBush_LeafGreen_LandMonsInfo = { 21, sSixIslandPatternBush_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom1_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom1_LeafGreen_LandMonsInfo = { 1, sFiveIslandLostCaveRoom1_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom2_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom2_LeafGreen_LandMonsInfo = { 2, sFiveIslandLostCaveRoom2_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom3_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom3_LeafGreen_LandMonsInfo = { 3, sFiveIslandLostCaveRoom3_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom4_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom4_LeafGreen_LandMonsInfo = { 4, sFiveIslandLostCaveRoom4_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom5_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom5_LeafGreen_LandMonsInfo = { 5, sFiveIslandLostCaveRoom5_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom6_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom6_LeafGreen_LandMonsInfo = { 6, sFiveIslandLostCaveRoom6_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom7_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom7_LeafGreen_LandMonsInfo = { 7, sFiveIslandLostCaveRoom7_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom8_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom8_LeafGreen_LandMonsInfo = { 8, sFiveIslandLostCaveRoom8_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom9_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom9_LeafGreen_LandMonsInfo = { 9, sFiveIslandLostCaveRoom9_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom10_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 43, 43, SPECIES_GOLBAT },\n    { 38, 38, SPECIES_GASTLY },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom10_LeafGreen_LandMonsInfo = { 10, sFiveIslandLostCaveRoom10_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom11_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 15, 15, SPECIES_MISDREAVUS },\n    { 20, 20, SPECIES_MISDREAVUS },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom11_LeafGreen_LandMonsInfo = { 5, sFiveIslandLostCaveRoom11_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom12_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 15, 15, SPECIES_MISDREAVUS },\n    { 20, 20, SPECIES_MISDREAVUS },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom12_LeafGreen_LandMonsInfo = { 5, sFiveIslandLostCaveRoom12_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom13_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 15, 15, SPECIES_MISDREAVUS },\n    { 20, 20, SPECIES_MISDREAVUS },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom13_LeafGreen_LandMonsInfo = { 5, sFiveIslandLostCaveRoom13_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandLostCaveRoom14_LeafGreen_LandMons[] =\n{\n    { 40, 40, SPECIES_GASTLY },\n    { 37, 37, SPECIES_ZUBAT },\n    { 44, 44, SPECIES_HAUNTER },\n    { 46, 46, SPECIES_HAUNTER },\n    { 41, 41, SPECIES_GOLBAT },\n    { 15, 15, SPECIES_MISDREAVUS },\n    { 20, 20, SPECIES_MISDREAVUS },\n    { 48, 48, SPECIES_HAUNTER },\n    { 50, 50, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n    { 52, 52, SPECIES_HAUNTER },\n    { 22, 22, SPECIES_MISDREAVUS },\n};\n\nconst struct WildPokemonInfo sFiveIslandLostCaveRoom14_LeafGreen_LandMonsInfo = { 5, sFiveIslandLostCaveRoom14_LeafGreen_LandMons };\n\nconst struct WildPokemon sOneIslandKindleRoad_LeafGreen_LandMons[] =\n{\n    { 32, 32, SPECIES_SPEAROW },\n    { 34, 34, SPECIES_PONYTA },\n    { 36, 36, SPECIES_FEAROW },\n    { 31, 31, SPECIES_PONYTA },\n    { 31, 31, SPECIES_GEODUDE },\n    { 31, 31, SPECIES_MEOWTH },\n    { 30, 30, SPECIES_SPEAROW },\n    { 34, 34, SPECIES_SLOWPOKE },\n    { 37, 37, SPECIES_RAPIDASH },\n    { 37, 37, SPECIES_PERSIAN },\n    { 40, 40, SPECIES_RAPIDASH },\n    { 40, 40, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sOneIslandKindleRoad_LeafGreen_LandMonsInfo = { 21, sOneIslandKindleRoad_LeafGreen_LandMons };\n\nconst struct WildPokemon sOneIslandKindleRoad_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sOneIslandKindleRoad_LeafGreen_WaterMonsInfo = { 2, sOneIslandKindleRoad_LeafGreen_WaterMons };\n\nconst struct WildPokemon sOneIslandKindleRoad_LeafGreen_RockSmashMons[] =\n{\n    { 5, 20, SPECIES_GEODUDE },\n    { 10, 20, SPECIES_GEODUDE },\n    { 15, 30, SPECIES_GEODUDE },\n    { 25, 40, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GRAVELER },\n};\n\nconst struct WildPokemonInfo sOneIslandKindleRoad_LeafGreen_RockSmashMonsInfo = { 25, sOneIslandKindleRoad_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sOneIslandKindleRoad_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sOneIslandKindleRoad_LeafGreen_FishingMonsInfo = { 20, sOneIslandKindleRoad_LeafGreen_FishingMons };\n\nconst struct WildPokemon sOneIslandTreasureBeach_LeafGreen_LandMons[] =\n{\n    { 32, 32, SPECIES_SPEAROW },\n    { 33, 33, SPECIES_TANGELA },\n    { 31, 31, SPECIES_SPEAROW },\n    { 35, 35, SPECIES_TANGELA },\n    { 36, 36, SPECIES_FEAROW },\n    { 31, 31, SPECIES_MEOWTH },\n    { 38, 38, SPECIES_FEAROW },\n    { 31, 31, SPECIES_SLOWPOKE },\n    { 40, 40, SPECIES_FEAROW },\n    { 37, 37, SPECIES_PERSIAN },\n    { 40, 40, SPECIES_FEAROW },\n    { 40, 40, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sOneIslandTreasureBeach_LeafGreen_LandMonsInfo = { 21, sOneIslandTreasureBeach_LeafGreen_LandMons };\n\nconst struct WildPokemon sOneIslandTreasureBeach_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sOneIslandTreasureBeach_LeafGreen_WaterMonsInfo = { 2, sOneIslandTreasureBeach_LeafGreen_WaterMons };\n\nconst struct WildPokemon sOneIslandTreasureBeach_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sOneIslandTreasureBeach_LeafGreen_FishingMonsInfo = { 20, sOneIslandTreasureBeach_LeafGreen_FishingMons };\n\nconst struct WildPokemon sTwoIslandCapeBrink_LeafGreen_LandMons[] =\n{\n    { 31, 31, SPECIES_SPEAROW },\n    { 30, 30, SPECIES_BELLSPROUT },\n    { 32, 32, SPECIES_BELLSPROUT },\n    { 36, 36, SPECIES_WEEPINBELL },\n    { 36, 36, SPECIES_FEAROW },\n    { 31, 31, SPECIES_MEOWTH },\n    { 38, 38, SPECIES_WEEPINBELL },\n    { 31, 31, SPECIES_SLOWPOKE },\n    { 37, 37, SPECIES_SLOWBRO },\n    { 37, 37, SPECIES_PERSIAN },\n    { 40, 40, SPECIES_SLOWBRO },\n    { 40, 40, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sTwoIslandCapeBrink_LeafGreen_LandMonsInfo = { 21, sTwoIslandCapeBrink_LeafGreen_LandMons };\n\nconst struct WildPokemon sTwoIslandCapeBrink_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_SLOWPOKE },\n    { 20, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWBRO },\n    { 35, 40, SPECIES_SLOWBRO },\n};\n\nconst struct WildPokemonInfo sTwoIslandCapeBrink_LeafGreen_WaterMonsInfo = { 2, sTwoIslandCapeBrink_LeafGreen_WaterMons };\n\nconst struct WildPokemon sTwoIslandCapeBrink_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sTwoIslandCapeBrink_LeafGreen_FishingMonsInfo = { 20, sTwoIslandCapeBrink_LeafGreen_FishingMons };\n\nconst struct WildPokemon sThreeIslandBondBridge_LeafGreen_LandMons[] =\n{\n    { 32, 32, SPECIES_PIDGEY },\n    { 31, 31, SPECIES_BELLSPROUT },\n    { 29, 29, SPECIES_PIDGEY },\n    { 36, 36, SPECIES_WEEPINBELL },\n    { 34, 34, SPECIES_PIDGEOTTO },\n    { 31, 31, SPECIES_MEOWTH },\n    { 34, 34, SPECIES_VENONAT },\n    { 31, 31, SPECIES_SLOWPOKE },\n    { 37, 37, SPECIES_PIDGEOTTO },\n    { 37, 37, SPECIES_PERSIAN },\n    { 40, 40, SPECIES_PIDGEOTTO },\n    { 40, 40, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sThreeIslandBondBridge_LeafGreen_LandMonsInfo = { 21, sThreeIslandBondBridge_LeafGreen_LandMons };\n\nconst struct WildPokemon sThreeIslandBondBridge_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sThreeIslandBondBridge_LeafGreen_WaterMonsInfo = { 2, sThreeIslandBondBridge_LeafGreen_WaterMons };\n\nconst struct WildPokemon sThreeIslandBondBridge_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sThreeIslandBondBridge_LeafGreen_FishingMonsInfo = { 20, sThreeIslandBondBridge_LeafGreen_FishingMons };\n\nconst struct WildPokemon sThreeIslandPort_LeafGreen_LandMons[] =\n{\n    { 15, 15, SPECIES_DUNSPARCE },\n    { 15, 15, SPECIES_DUNSPARCE },\n    { 10, 10, SPECIES_DUNSPARCE },\n    { 10, 10, SPECIES_DUNSPARCE },\n    { 20, 20, SPECIES_DUNSPARCE },\n    { 20, 20, SPECIES_DUNSPARCE },\n    { 25, 25, SPECIES_DUNSPARCE },\n    { 30, 30, SPECIES_DUNSPARCE },\n    { 25, 25, SPECIES_DUNSPARCE },\n    { 30, 30, SPECIES_DUNSPARCE },\n    { 5, 5, SPECIES_DUNSPARCE },\n    { 35, 35, SPECIES_DUNSPARCE },\n};\n\nconst struct WildPokemonInfo sThreeIslandPort_LeafGreen_LandMonsInfo = { 1, sThreeIslandPort_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandResortGorgeous_LeafGreen_WaterMons[] =\n{\n    { 5, 35, SPECIES_TENTACOOL },\n    { 5, 15, SPECIES_HOPPIP },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sFiveIslandResortGorgeous_LeafGreen_WaterMonsInfo = { 2, sFiveIslandResortGorgeous_LeafGreen_WaterMons };\n\nconst struct WildPokemon sFiveIslandResortGorgeous_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_REMORAID },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sFiveIslandResortGorgeous_LeafGreen_FishingMonsInfo = { 20, sFiveIslandResortGorgeous_LeafGreen_FishingMons };\n\nconst struct WildPokemon sFiveIslandWaterLabyrinth_LeafGreen_WaterMons[] =\n{\n    { 5, 35, SPECIES_TENTACOOL },\n    { 5, 15, SPECIES_HOPPIP },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sFiveIslandWaterLabyrinth_LeafGreen_WaterMonsInfo = { 2, sFiveIslandWaterLabyrinth_LeafGreen_WaterMons };\n\nconst struct WildPokemon sFiveIslandWaterLabyrinth_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_REMORAID },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sFiveIslandWaterLabyrinth_LeafGreen_FishingMonsInfo = { 20, sFiveIslandWaterLabyrinth_LeafGreen_FishingMons };\n\nconst struct WildPokemon sFiveIslandMeadow_LeafGreen_LandMons[] =\n{\n    { 44, 44, SPECIES_PIDGEY },\n    { 10, 10, SPECIES_SENTRET },\n    { 48, 48, SPECIES_PIDGEOTTO },\n    { 10, 10, SPECIES_HOPPIP },\n    { 15, 15, SPECIES_SENTRET },\n    { 41, 41, SPECIES_MEOWTH },\n    { 15, 15, SPECIES_HOPPIP },\n    { 41, 41, SPECIES_SLOWPOKE },\n    { 50, 50, SPECIES_PIDGEOTTO },\n    { 47, 47, SPECIES_PERSIAN },\n    { 50, 50, SPECIES_PIDGEOTTO },\n    { 50, 50, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sFiveIslandMeadow_LeafGreen_LandMonsInfo = { 21, sFiveIslandMeadow_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandMeadow_LeafGreen_WaterMons[] =\n{\n    { 5, 35, SPECIES_TENTACOOL },\n    { 5, 15, SPECIES_HOPPIP },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sFiveIslandMeadow_LeafGreen_WaterMonsInfo = { 2, sFiveIslandMeadow_LeafGreen_WaterMons };\n\nconst struct WildPokemon sFiveIslandMeadow_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_REMORAID },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sFiveIslandMeadow_LeafGreen_FishingMonsInfo = { 20, sFiveIslandMeadow_LeafGreen_FishingMons };\n\nconst struct WildPokemon sFiveIslandMemorialPillar_LeafGreen_LandMons[] =\n{\n    { 10, 10, SPECIES_HOPPIP },\n    { 12, 12, SPECIES_HOPPIP },\n    { 8, 8, SPECIES_HOPPIP },\n    { 14, 14, SPECIES_HOPPIP },\n    { 10, 10, SPECIES_HOPPIP },\n    { 12, 12, SPECIES_HOPPIP },\n    { 16, 16, SPECIES_HOPPIP },\n    { 6, 6, SPECIES_HOPPIP },\n    { 8, 8, SPECIES_HOPPIP },\n    { 14, 14, SPECIES_HOPPIP },\n    { 8, 8, SPECIES_HOPPIP },\n    { 14, 14, SPECIES_HOPPIP },\n};\n\nconst struct WildPokemonInfo sFiveIslandMemorialPillar_LeafGreen_LandMonsInfo = { 21, sFiveIslandMemorialPillar_LeafGreen_LandMons };\n\nconst struct WildPokemon sFiveIslandMemorialPillar_LeafGreen_WaterMons[] =\n{\n    { 5, 35, SPECIES_TENTACOOL },\n    { 5, 15, SPECIES_HOPPIP },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sFiveIslandMemorialPillar_LeafGreen_WaterMonsInfo = { 2, sFiveIslandMemorialPillar_LeafGreen_WaterMons };\n\nconst struct WildPokemon sFiveIslandMemorialPillar_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_REMORAID },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sFiveIslandMemorialPillar_LeafGreen_FishingMonsInfo = { 20, sFiveIslandMemorialPillar_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSixIslandOutcastIsland_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sSixIslandOutcastIsland_LeafGreen_WaterMonsInfo = { 2, sSixIslandOutcastIsland_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSixIslandOutcastIsland_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_REMORAID },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sSixIslandOutcastIsland_LeafGreen_FishingMonsInfo = { 20, sSixIslandOutcastIsland_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSixIslandGreenPath_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sSixIslandGreenPath_LeafGreen_WaterMonsInfo = { 2, sSixIslandGreenPath_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSixIslandGreenPath_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_REMORAID },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sSixIslandGreenPath_LeafGreen_FishingMonsInfo = { 20, sSixIslandGreenPath_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSixIslandWaterPath_LeafGreen_LandMons[] =\n{\n    { 44, 44, SPECIES_SPEAROW },\n    { 10, 10, SPECIES_SENTRET },\n    { 44, 44, SPECIES_BELLSPROUT },\n    { 48, 48, SPECIES_FEAROW },\n    { 15, 15, SPECIES_SENTRET },\n    { 41, 41, SPECIES_MEOWTH },\n    { 48, 48, SPECIES_WEEPINBELL },\n    { 41, 41, SPECIES_SLOWPOKE },\n    { 50, 50, SPECIES_FEAROW },\n    { 47, 47, SPECIES_PERSIAN },\n    { 50, 50, SPECIES_FEAROW },\n    { 50, 50, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sSixIslandWaterPath_LeafGreen_LandMonsInfo = { 21, sSixIslandWaterPath_LeafGreen_LandMons };\n\nconst struct WildPokemon sSixIslandWaterPath_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sSixIslandWaterPath_LeafGreen_WaterMonsInfo = { 2, sSixIslandWaterPath_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSixIslandWaterPath_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_REMORAID },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sSixIslandWaterPath_LeafGreen_FishingMonsInfo = { 20, sSixIslandWaterPath_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSixIslandRuinValley_LeafGreen_LandMons[] =\n{\n    { 15, 15, SPECIES_NATU },\n    { 44, 44, SPECIES_SPEAROW },\n    { 18, 18, SPECIES_YANMA },\n    { 15, 15, SPECIES_MARILL },\n    { 49, 49, SPECIES_FEAROW },\n    { 43, 43, SPECIES_MEOWTH },\n    { 25, 25, SPECIES_WOBBUFFET },\n    { 41, 41, SPECIES_SLOWPOKE },\n    { 20, 20, SPECIES_NATU },\n    { 49, 49, SPECIES_PERSIAN },\n    { 20, 20, SPECIES_NATU },\n    { 52, 52, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sSixIslandRuinValley_LeafGreen_LandMonsInfo = { 21, sSixIslandRuinValley_LeafGreen_LandMons };\n\nconst struct WildPokemon sSixIslandRuinValley_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_MARILL },\n    { 10, 20, SPECIES_MARILL },\n    { 15, 25, SPECIES_MARILL },\n    { 20, 25, SPECIES_MARILL },\n    { 20, 25, SPECIES_MARILL },\n};\n\nconst struct WildPokemonInfo sSixIslandRuinValley_LeafGreen_WaterMonsInfo = { 2, sSixIslandRuinValley_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSixIslandRuinValley_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sSixIslandRuinValley_LeafGreen_FishingMonsInfo = { 20, sSixIslandRuinValley_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSevenIslandTrainerTower_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_MANTINE },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sSevenIslandTrainerTower_LeafGreen_WaterMonsInfo = { 2, sSevenIslandTrainerTower_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSevenIslandTrainerTower_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_REMORAID },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sSevenIslandTrainerTower_LeafGreen_FishingMonsInfo = { 20, sSevenIslandTrainerTower_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSevenIslandSevaultCanyonEntrance_LeafGreen_LandMons[] =\n{\n    { 44, 44, SPECIES_SPEAROW },\n    { 10, 10, SPECIES_SENTRET },\n    { 10, 10, SPECIES_PHANPY },\n    { 48, 48, SPECIES_FEAROW },\n    { 15, 15, SPECIES_SENTRET },\n    { 41, 41, SPECIES_MEOWTH },\n    { 50, 50, SPECIES_FEAROW },\n    { 41, 41, SPECIES_SLOWPOKE },\n    { 15, 15, SPECIES_PHANPY },\n    { 47, 47, SPECIES_PERSIAN },\n    { 15, 15, SPECIES_PHANPY },\n    { 50, 50, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sSevenIslandSevaultCanyonEntrance_LeafGreen_LandMonsInfo = { 21, sSevenIslandSevaultCanyonEntrance_LeafGreen_LandMons };\n\nconst struct WildPokemon sSevenIslandSevaultCanyon_LeafGreen_LandMons[] =\n{\n    { 46, 46, SPECIES_GEODUDE },\n    { 15, 15, SPECIES_PHANPY },\n    { 46, 46, SPECIES_CUBONE },\n    { 50, 50, SPECIES_FEAROW },\n    { 52, 52, SPECIES_MAROWAK },\n    { 43, 43, SPECIES_MEOWTH },\n    { 54, 54, SPECIES_ONIX },\n    { 50, 50, SPECIES_FEAROW },\n    { 15, 15, SPECIES_LARVITAR },\n    { 49, 49, SPECIES_PERSIAN },\n    { 20, 20, SPECIES_LARVITAR },\n    { 52, 52, SPECIES_PERSIAN },\n};\n\nconst struct WildPokemonInfo sSevenIslandSevaultCanyon_LeafGreen_LandMonsInfo = { 21, sSevenIslandSevaultCanyon_LeafGreen_LandMons };\n\nconst struct WildPokemon sSevenIslandSevaultCanyon_LeafGreen_RockSmashMons[] =\n{\n    { 25, 35, SPECIES_GEODUDE },\n    { 30, 45, SPECIES_GRAVELER },\n    { 35, 50, SPECIES_GRAVELER },\n    { 30, 40, SPECIES_GEODUDE },\n    { 30, 40, SPECIES_GEODUDE },\n};\n\nconst struct WildPokemonInfo sSevenIslandSevaultCanyon_LeafGreen_RockSmashMonsInfo = { 25, sSevenIslandSevaultCanyon_LeafGreen_RockSmashMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuins_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_MANTINE },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuins_LeafGreen_WaterMonsInfo = { 2, sSevenIslandTanobyRuins_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSevenIslandTanobyRuins_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_REMORAID },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sSevenIslandTanobyRuins_LeafGreen_FishingMonsInfo = { 20, sSevenIslandTanobyRuins_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute1_LeafGreen_LandMons[] =\n{\n    { 3, 3, SPECIES_PIDGEY },\n    { 3, 3, SPECIES_RATTATA },\n    { 3, 3, SPECIES_PIDGEY },\n    { 3, 3, SPECIES_RATTATA },\n    { 2, 2, SPECIES_PIDGEY },\n    { 2, 2, SPECIES_RATTATA },\n    { 3, 3, SPECIES_PIDGEY },\n    { 3, 3, SPECIES_RATTATA },\n    { 4, 4, SPECIES_PIDGEY },\n    { 4, 4, SPECIES_RATTATA },\n    { 5, 5, SPECIES_PIDGEY },\n    { 4, 4, SPECIES_RATTATA },\n};\n\nconst struct WildPokemonInfo sRoute1_LeafGreen_LandMonsInfo = { 21, sRoute1_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute2_LeafGreen_LandMons[] =\n{\n    { 3, 3, SPECIES_RATTATA },\n    { 3, 3, SPECIES_PIDGEY },\n    { 4, 4, SPECIES_RATTATA },\n    { 4, 4, SPECIES_PIDGEY },\n    { 2, 2, SPECIES_RATTATA },\n    { 2, 2, SPECIES_PIDGEY },\n    { 5, 5, SPECIES_RATTATA },\n    { 5, 5, SPECIES_PIDGEY },\n    { 4, 4, SPECIES_CATERPIE },\n    { 4, 4, SPECIES_WEEDLE },\n    { 5, 5, SPECIES_CATERPIE },\n    { 5, 5, SPECIES_WEEDLE },\n};\n\nconst struct WildPokemonInfo sRoute2_LeafGreen_LandMonsInfo = { 21, sRoute2_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute3_LeafGreen_LandMons[] =\n{\n    { 6, 6, SPECIES_SPEAROW },\n    { 6, 6, SPECIES_PIDGEY },\n    { 7, 7, SPECIES_SPEAROW },\n    { 7, 7, SPECIES_MANKEY },\n    { 6, 6, SPECIES_NIDORAN_F },\n    { 7, 7, SPECIES_PIDGEY },\n    { 8, 8, SPECIES_SPEAROW },\n    { 3, 3, SPECIES_JIGGLYPUFF },\n    { 7, 7, SPECIES_NIDORAN_F },\n    { 5, 5, SPECIES_JIGGLYPUFF },\n    { 6, 6, SPECIES_NIDORAN_M },\n    { 7, 7, SPECIES_JIGGLYPUFF },\n};\n\nconst struct WildPokemonInfo sRoute3_LeafGreen_LandMonsInfo = { 21, sRoute3_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute4_LeafGreen_LandMons[] =\n{\n    { 10, 10, SPECIES_SPEAROW },\n    { 10, 10, SPECIES_RATTATA },\n    { 6, 6, SPECIES_SANDSHREW },\n    { 10, 10, SPECIES_SANDSHREW },\n    { 8, 8, SPECIES_SPEAROW },\n    { 8, 8, SPECIES_RATTATA },\n    { 12, 12, SPECIES_SPEAROW },\n    { 12, 12, SPECIES_RATTATA },\n    { 10, 10, SPECIES_MANKEY },\n    { 8, 8, SPECIES_SANDSHREW },\n    { 12, 12, SPECIES_MANKEY },\n    { 12, 12, SPECIES_SANDSHREW },\n};\n\nconst struct WildPokemonInfo sRoute4_LeafGreen_LandMonsInfo = { 21, sRoute4_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute4_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute4_LeafGreen_WaterMonsInfo = { 2, sRoute4_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute4_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KRABBY },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute4_LeafGreen_FishingMonsInfo = { 20, sRoute4_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute5_LeafGreen_LandMons[] =\n{\n    { 10, 10, SPECIES_MEOWTH },\n    { 13, 13, SPECIES_PIDGEY },\n    { 13, 13, SPECIES_BELLSPROUT },\n    { 12, 12, SPECIES_MEOWTH },\n    { 15, 15, SPECIES_BELLSPROUT },\n    { 15, 15, SPECIES_PIDGEY },\n    { 16, 16, SPECIES_BELLSPROUT },\n    { 16, 16, SPECIES_PIDGEY },\n    { 15, 15, SPECIES_PIDGEY },\n    { 14, 14, SPECIES_MEOWTH },\n    { 15, 15, SPECIES_PIDGEY },\n    { 16, 16, SPECIES_MEOWTH },\n};\n\nconst struct WildPokemonInfo sRoute5_LeafGreen_LandMonsInfo = { 21, sRoute5_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute6_LeafGreen_LandMons[] =\n{\n    { 10, 10, SPECIES_MEOWTH },\n    { 13, 13, SPECIES_PIDGEY },\n    { 13, 13, SPECIES_BELLSPROUT },\n    { 12, 12, SPECIES_MEOWTH },\n    { 15, 15, SPECIES_BELLSPROUT },\n    { 15, 15, SPECIES_PIDGEY },\n    { 16, 16, SPECIES_BELLSPROUT },\n    { 16, 16, SPECIES_PIDGEY },\n    { 15, 15, SPECIES_PIDGEY },\n    { 14, 14, SPECIES_MEOWTH },\n    { 15, 15, SPECIES_PIDGEY },\n    { 16, 16, SPECIES_MEOWTH },\n};\n\nconst struct WildPokemonInfo sRoute6_LeafGreen_LandMonsInfo = { 21, sRoute6_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute6_LeafGreen_WaterMons[] =\n{\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 25, 30, SPECIES_SLOWPOKE },\n    { 30, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute6_LeafGreen_WaterMonsInfo = { 2, sRoute6_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute6_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute6_LeafGreen_FishingMonsInfo = { 20, sRoute6_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute7_LeafGreen_LandMons[] =\n{\n    { 19, 19, SPECIES_PIDGEY },\n    { 17, 17, SPECIES_MEOWTH },\n    { 19, 19, SPECIES_BELLSPROUT },\n    { 18, 18, SPECIES_MEOWTH },\n    { 22, 22, SPECIES_PIDGEY },\n    { 22, 22, SPECIES_BELLSPROUT },\n    { 18, 18, SPECIES_VULPIX },\n    { 20, 20, SPECIES_VULPIX },\n    { 17, 17, SPECIES_MEOWTH },\n    { 19, 19, SPECIES_MEOWTH },\n    { 17, 17, SPECIES_MEOWTH },\n    { 20, 20, SPECIES_MEOWTH },\n};\n\nconst struct WildPokemonInfo sRoute7_LeafGreen_LandMonsInfo = { 21, sRoute7_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute8_LeafGreen_LandMons[] =\n{\n    { 18, 18, SPECIES_PIDGEY },\n    { 18, 18, SPECIES_MEOWTH },\n    { 16, 16, SPECIES_VULPIX },\n    { 20, 20, SPECIES_PIDGEY },\n    { 20, 20, SPECIES_MEOWTH },\n    { 17, 17, SPECIES_SANDSHREW },\n    { 17, 17, SPECIES_VULPIX },\n    { 19, 19, SPECIES_SANDSHREW },\n    { 17, 17, SPECIES_SANDSHREW },\n    { 15, 15, SPECIES_VULPIX },\n    { 17, 17, SPECIES_SANDSHREW },\n    { 18, 18, SPECIES_VULPIX },\n};\n\nconst struct WildPokemonInfo sRoute8_LeafGreen_LandMonsInfo = { 21, sRoute8_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute9_LeafGreen_LandMons[] =\n{\n    { 16, 16, SPECIES_SPEAROW },\n    { 16, 16, SPECIES_RATTATA },\n    { 11, 11, SPECIES_SANDSHREW },\n    { 15, 15, SPECIES_SANDSHREW },\n    { 13, 13, SPECIES_SPEAROW },\n    { 14, 14, SPECIES_RATTATA },\n    { 17, 17, SPECIES_SPEAROW },\n    { 17, 17, SPECIES_RATTATA },\n    { 14, 14, SPECIES_RATTATA },\n    { 13, 13, SPECIES_SANDSHREW },\n    { 14, 14, SPECIES_RATTATA },\n    { 17, 17, SPECIES_SANDSHREW },\n};\n\nconst struct WildPokemonInfo sRoute9_LeafGreen_LandMonsInfo = { 21, sRoute9_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute10_LeafGreen_LandMons[] =\n{\n    { 16, 16, SPECIES_SPEAROW },\n    { 16, 16, SPECIES_VOLTORB },\n    { 11, 11, SPECIES_SANDSHREW },\n    { 15, 15, SPECIES_SANDSHREW },\n    { 13, 13, SPECIES_SPEAROW },\n    { 14, 14, SPECIES_VOLTORB },\n    { 17, 17, SPECIES_SPEAROW },\n    { 17, 17, SPECIES_VOLTORB },\n    { 14, 14, SPECIES_VOLTORB },\n    { 13, 13, SPECIES_SANDSHREW },\n    { 14, 14, SPECIES_VOLTORB },\n    { 17, 17, SPECIES_SANDSHREW },\n};\n\nconst struct WildPokemonInfo sRoute10_LeafGreen_LandMonsInfo = { 21, sRoute10_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute10_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute10_LeafGreen_WaterMonsInfo = { 2, sRoute10_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute10_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KRABBY },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute10_LeafGreen_FishingMonsInfo = { 20, sRoute10_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute11_LeafGreen_LandMons[] =\n{\n    { 14, 14, SPECIES_SANDSHREW },\n    { 15, 15, SPECIES_SPEAROW },\n    { 12, 12, SPECIES_SANDSHREW },\n    { 13, 13, SPECIES_SPEAROW },\n    { 11, 11, SPECIES_DROWZEE },\n    { 13, 13, SPECIES_DROWZEE },\n    { 15, 15, SPECIES_SANDSHREW },\n    { 17, 17, SPECIES_SPEAROW },\n    { 12, 12, SPECIES_SANDSHREW },\n    { 15, 15, SPECIES_DROWZEE },\n    { 12, 12, SPECIES_SANDSHREW },\n    { 15, 15, SPECIES_DROWZEE },\n};\n\nconst struct WildPokemonInfo sRoute11_LeafGreen_LandMonsInfo = { 21, sRoute11_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute11_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute11_LeafGreen_WaterMonsInfo = { 2, sRoute11_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute11_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KRABBY },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute11_LeafGreen_FishingMonsInfo = { 20, sRoute11_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute12_LeafGreen_LandMons[] =\n{\n    { 24, 24, SPECIES_BELLSPROUT },\n    { 24, 24, SPECIES_VENONAT },\n    { 22, 22, SPECIES_BELLSPROUT },\n    { 23, 23, SPECIES_PIDGEY },\n    { 25, 25, SPECIES_PIDGEY },\n    { 26, 26, SPECIES_VENONAT },\n    { 26, 26, SPECIES_BELLSPROUT },\n    { 27, 27, SPECIES_PIDGEY },\n    { 23, 23, SPECIES_PIDGEY },\n    { 28, 28, SPECIES_WEEPINBELL },\n    { 23, 23, SPECIES_PIDGEY },\n    { 30, 30, SPECIES_WEEPINBELL },\n};\n\nconst struct WildPokemonInfo sRoute12_LeafGreen_LandMonsInfo = { 21, sRoute12_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute12_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute12_LeafGreen_WaterMonsInfo = { 2, sRoute12_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute12_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KRABBY },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute12_LeafGreen_FishingMonsInfo = { 60, sRoute12_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute13_LeafGreen_LandMons[] =\n{\n    { 24, 24, SPECIES_BELLSPROUT },\n    { 24, 24, SPECIES_VENONAT },\n    { 22, 22, SPECIES_BELLSPROUT },\n    { 27, 27, SPECIES_PIDGEY },\n    { 25, 25, SPECIES_PIDGEY },\n    { 26, 26, SPECIES_VENONAT },\n    { 26, 26, SPECIES_BELLSPROUT },\n    { 25, 25, SPECIES_DITTO },\n    { 29, 29, SPECIES_PIDGEOTTO },\n    { 28, 28, SPECIES_WEEPINBELL },\n    { 29, 29, SPECIES_PIDGEOTTO },\n    { 30, 30, SPECIES_WEEPINBELL },\n};\n\nconst struct WildPokemonInfo sRoute13_LeafGreen_LandMonsInfo = { 21, sRoute13_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute13_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute13_LeafGreen_WaterMonsInfo = { 2, sRoute13_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute13_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KRABBY },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute13_LeafGreen_FishingMonsInfo = { 20, sRoute13_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute14_LeafGreen_LandMons[] =\n{\n    { 24, 24, SPECIES_BELLSPROUT },\n    { 24, 24, SPECIES_VENONAT },\n    { 22, 22, SPECIES_BELLSPROUT },\n    { 23, 23, SPECIES_DITTO },\n    { 27, 27, SPECIES_PIDGEY },\n    { 26, 26, SPECIES_VENONAT },\n    { 26, 26, SPECIES_BELLSPROUT },\n    { 30, 30, SPECIES_WEEPINBELL },\n    { 23, 23, SPECIES_DITTO },\n    { 29, 29, SPECIES_PIDGEOTTO },\n    { 23, 23, SPECIES_DITTO },\n    { 29, 29, SPECIES_PIDGEOTTO },\n};\n\nconst struct WildPokemonInfo sRoute14_LeafGreen_LandMonsInfo = { 21, sRoute14_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute15_LeafGreen_LandMons[] =\n{\n    { 24, 24, SPECIES_BELLSPROUT },\n    { 24, 24, SPECIES_VENONAT },\n    { 22, 22, SPECIES_BELLSPROUT },\n    { 27, 27, SPECIES_PIDGEY },\n    { 25, 25, SPECIES_PIDGEY },\n    { 26, 26, SPECIES_VENONAT },\n    { 26, 26, SPECIES_BELLSPROUT },\n    { 25, 25, SPECIES_DITTO },\n    { 29, 29, SPECIES_PIDGEOTTO },\n    { 28, 28, SPECIES_WEEPINBELL },\n    { 29, 29, SPECIES_PIDGEOTTO },\n    { 30, 30, SPECIES_WEEPINBELL },\n};\n\nconst struct WildPokemonInfo sRoute15_LeafGreen_LandMonsInfo = { 21, sRoute15_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute16_LeafGreen_LandMons[] =\n{\n    { 20, 20, SPECIES_SPEAROW },\n    { 18, 18, SPECIES_DODUO },\n    { 18, 18, SPECIES_RATTATA },\n    { 20, 20, SPECIES_RATTATA },\n    { 22, 22, SPECIES_SPEAROW },\n    { 20, 20, SPECIES_DODUO },\n    { 22, 22, SPECIES_RATTATA },\n    { 22, 22, SPECIES_DODUO },\n    { 18, 18, SPECIES_RATTATA },\n    { 23, 23, SPECIES_RATICATE },\n    { 18, 18, SPECIES_RATTATA },\n    { 25, 25, SPECIES_RATICATE },\n};\n\nconst struct WildPokemonInfo sRoute16_LeafGreen_LandMonsInfo = { 21, sRoute16_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute17_LeafGreen_LandMons[] =\n{\n    { 20, 20, SPECIES_SPEAROW },\n    { 24, 24, SPECIES_DODUO },\n    { 22, 22, SPECIES_SPEAROW },\n    { 26, 26, SPECIES_DODUO },\n    { 25, 25, SPECIES_RATICATE },\n    { 27, 27, SPECIES_RATICATE },\n    { 28, 28, SPECIES_DODUO },\n    { 29, 29, SPECIES_RATICATE },\n    { 22, 22, SPECIES_RATTATA },\n    { 25, 25, SPECIES_FEAROW },\n    { 22, 22, SPECIES_RATTATA },\n    { 27, 27, SPECIES_FEAROW },\n};\n\nconst struct WildPokemonInfo sRoute17_LeafGreen_LandMonsInfo = { 21, sRoute17_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute18_LeafGreen_LandMons[] =\n{\n    { 20, 20, SPECIES_SPEAROW },\n    { 24, 24, SPECIES_DODUO },\n    { 22, 22, SPECIES_SPEAROW },\n    { 26, 26, SPECIES_DODUO },\n    { 25, 25, SPECIES_RATICATE },\n    { 25, 25, SPECIES_FEAROW },\n    { 28, 28, SPECIES_DODUO },\n    { 29, 29, SPECIES_RATICATE },\n    { 22, 22, SPECIES_RATTATA },\n    { 27, 27, SPECIES_FEAROW },\n    { 22, 22, SPECIES_RATTATA },\n    { 29, 29, SPECIES_FEAROW },\n};\n\nconst struct WildPokemonInfo sRoute18_LeafGreen_LandMonsInfo = { 21, sRoute18_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute19_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute19_LeafGreen_WaterMonsInfo = { 2, sRoute19_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute19_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute19_LeafGreen_FishingMonsInfo = { 20, sRoute19_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute20_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute20_LeafGreen_WaterMonsInfo = { 2, sRoute20_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute20_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute20_LeafGreen_FishingMonsInfo = { 20, sRoute20_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute21North_LeafGreen_LandMons[] =\n{\n    { 22, 22, SPECIES_TANGELA },\n    { 23, 23, SPECIES_TANGELA },\n    { 24, 24, SPECIES_TANGELA },\n    { 21, 21, SPECIES_TANGELA },\n    { 25, 25, SPECIES_TANGELA },\n    { 20, 20, SPECIES_TANGELA },\n    { 19, 19, SPECIES_TANGELA },\n    { 26, 26, SPECIES_TANGELA },\n    { 18, 18, SPECIES_TANGELA },\n    { 27, 27, SPECIES_TANGELA },\n    { 17, 17, SPECIES_TANGELA },\n    { 28, 28, SPECIES_TANGELA },\n};\n\nconst struct WildPokemonInfo sRoute21North_LeafGreen_LandMonsInfo = { 14, sRoute21North_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute21North_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute21North_LeafGreen_WaterMonsInfo = { 2, sRoute21North_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute21North_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute21North_LeafGreen_FishingMonsInfo = { 20, sRoute21North_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute21South_LeafGreen_LandMons[] =\n{\n    { 22, 22, SPECIES_TANGELA },\n    { 23, 23, SPECIES_TANGELA },\n    { 24, 24, SPECIES_TANGELA },\n    { 21, 21, SPECIES_TANGELA },\n    { 25, 25, SPECIES_TANGELA },\n    { 20, 20, SPECIES_TANGELA },\n    { 19, 19, SPECIES_TANGELA },\n    { 26, 26, SPECIES_TANGELA },\n    { 18, 18, SPECIES_TANGELA },\n    { 27, 27, SPECIES_TANGELA },\n    { 17, 17, SPECIES_TANGELA },\n    { 28, 28, SPECIES_TANGELA },\n};\n\nconst struct WildPokemonInfo sRoute21South_LeafGreen_LandMonsInfo = { 14, sRoute21South_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute21South_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute21South_LeafGreen_WaterMonsInfo = { 2, sRoute21South_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute21South_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute21South_LeafGreen_FishingMonsInfo = { 20, sRoute21South_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute22_LeafGreen_LandMons[] =\n{\n    { 3, 3, SPECIES_RATTATA },\n    { 3, 3, SPECIES_MANKEY },\n    { 4, 4, SPECIES_RATTATA },\n    { 4, 4, SPECIES_MANKEY },\n    { 2, 2, SPECIES_RATTATA },\n    { 2, 2, SPECIES_MANKEY },\n    { 3, 3, SPECIES_SPEAROW },\n    { 5, 5, SPECIES_SPEAROW },\n    { 5, 5, SPECIES_RATTATA },\n    { 5, 5, SPECIES_MANKEY },\n    { 5, 5, SPECIES_RATTATA },\n    { 5, 5, SPECIES_MANKEY },\n};\n\nconst struct WildPokemonInfo sRoute22_LeafGreen_LandMonsInfo = { 21, sRoute22_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute22_LeafGreen_WaterMons[] =\n{\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 25, 30, SPECIES_SLOWPOKE },\n    { 30, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute22_LeafGreen_WaterMonsInfo = { 2, sRoute22_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute22_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute22_LeafGreen_FishingMonsInfo = { 20, sRoute22_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute23_LeafGreen_LandMons[] =\n{\n    { 32, 32, SPECIES_MANKEY },\n    { 40, 40, SPECIES_FEAROW },\n    { 34, 34, SPECIES_MANKEY },\n    { 34, 34, SPECIES_SPEAROW },\n    { 32, 32, SPECIES_SANDSHREW },\n    { 34, 34, SPECIES_SANDSHREW },\n    { 42, 42, SPECIES_PRIMEAPE },\n    { 44, 44, SPECIES_SANDSLASH },\n    { 32, 32, SPECIES_SPEAROW },\n    { 42, 42, SPECIES_FEAROW },\n    { 32, 32, SPECIES_SPEAROW },\n    { 44, 44, SPECIES_FEAROW },\n};\n\nconst struct WildPokemonInfo sRoute23_LeafGreen_LandMonsInfo = { 21, sRoute23_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute23_LeafGreen_WaterMons[] =\n{\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 25, 30, SPECIES_SLOWPOKE },\n    { 30, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute23_LeafGreen_WaterMonsInfo = { 2, sRoute23_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute23_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute23_LeafGreen_FishingMonsInfo = { 20, sRoute23_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute24_LeafGreen_LandMons[] =\n{\n    { 7, 7, SPECIES_WEEDLE },\n    { 7, 7, SPECIES_CATERPIE },\n    { 11, 11, SPECIES_PIDGEY },\n    { 12, 12, SPECIES_BELLSPROUT },\n    { 13, 13, SPECIES_BELLSPROUT },\n    { 10, 10, SPECIES_ABRA },\n    { 13, 13, SPECIES_PIDGEY },\n    { 14, 14, SPECIES_BELLSPROUT },\n    { 8, 8, SPECIES_METAPOD },\n    { 8, 8, SPECIES_ABRA },\n    { 8, 8, SPECIES_KAKUNA },\n    { 12, 12, SPECIES_ABRA },\n};\n\nconst struct WildPokemonInfo sRoute24_LeafGreen_LandMonsInfo = { 21, sRoute24_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute24_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sRoute24_LeafGreen_WaterMonsInfo = { 2, sRoute24_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute24_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KRABBY },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute24_LeafGreen_FishingMonsInfo = { 20, sRoute24_LeafGreen_FishingMons };\n\nconst struct WildPokemon sRoute25_LeafGreen_LandMons[] =\n{\n    { 8, 8, SPECIES_WEEDLE },\n    { 8, 8, SPECIES_CATERPIE },\n    { 13, 13, SPECIES_PIDGEY },\n    { 14, 14, SPECIES_BELLSPROUT },\n    { 13, 13, SPECIES_BELLSPROUT },\n    { 11, 11, SPECIES_ABRA },\n    { 11, 11, SPECIES_PIDGEY },\n    { 12, 12, SPECIES_BELLSPROUT },\n    { 9, 9, SPECIES_METAPOD },\n    { 9, 9, SPECIES_ABRA },\n    { 9, 9, SPECIES_KAKUNA },\n    { 13, 13, SPECIES_ABRA },\n};\n\nconst struct WildPokemonInfo sRoute25_LeafGreen_LandMonsInfo = { 21, sRoute25_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute25_LeafGreen_WaterMons[] =\n{\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 25, 30, SPECIES_SLOWPOKE },\n    { 30, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute25_LeafGreen_WaterMonsInfo = { 2, sRoute25_LeafGreen_WaterMons };\n\nconst struct WildPokemon sRoute25_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute25_LeafGreen_FishingMonsInfo = { 20, sRoute25_LeafGreen_FishingMons };\n\nconst struct WildPokemon sPalletTown_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sPalletTown_LeafGreen_WaterMonsInfo = { 1, sPalletTown_LeafGreen_WaterMons };\n\nconst struct WildPokemon sPalletTown_LeafGreen_FishingMons[] =\n{\n    { 5, 10, SPECIES_MAGIKARP },\n    { 5, 10, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_STARYU },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sPalletTown_LeafGreen_FishingMonsInfo = { 10, sPalletTown_LeafGreen_FishingMons };\n\nconst struct WildPokemon sViridianCity_LeafGreen_WaterMons[] =\n{\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 25, 30, SPECIES_SLOWPOKE },\n    { 30, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sViridianCity_LeafGreen_WaterMonsInfo = { 1, sViridianCity_LeafGreen_WaterMons };\n\nconst struct WildPokemon sViridianCity_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sViridianCity_LeafGreen_FishingMonsInfo = { 10, sViridianCity_LeafGreen_FishingMons };\n\nconst struct WildPokemon sCeruleanCity_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sCeruleanCity_LeafGreen_WaterMonsInfo = { 1, sCeruleanCity_LeafGreen_WaterMons };\n\nconst struct WildPokemon sCeruleanCity_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KRABBY },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sCeruleanCity_LeafGreen_FishingMonsInfo = { 10, sCeruleanCity_LeafGreen_FishingMons };\n\nconst struct WildPokemon sVermilionCity_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sVermilionCity_LeafGreen_WaterMonsInfo = { 1, sVermilionCity_LeafGreen_WaterMons };\n\nconst struct WildPokemon sVermilionCity_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_STARYU },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_HORSEA },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sVermilionCity_LeafGreen_FishingMonsInfo = { 10, sVermilionCity_LeafGreen_FishingMons };\n\nconst struct WildPokemon sCeladonCity_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_SLOWPOKE },\n    { 10, 20, SPECIES_SLOWPOKE },\n    { 20, 30, SPECIES_SLOWPOKE },\n    { 30, 40, SPECIES_SLOWPOKE },\n    { 30, 40, SPECIES_KOFFING },\n};\n\nconst struct WildPokemonInfo sCeladonCity_LeafGreen_WaterMonsInfo = { 1, sCeladonCity_LeafGreen_WaterMons };\n\nconst struct WildPokemon sCeladonCity_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 15, 25, SPECIES_MAGIKARP },\n    { 15, 25, SPECIES_MAGIKARP },\n    { 15, 25, SPECIES_MAGIKARP },\n    { 25, 35, SPECIES_MAGIKARP },\n    { 30, 40, SPECIES_GRIMER },\n};\n\nconst struct WildPokemonInfo sCeladonCity_LeafGreen_FishingMonsInfo = { 10, sCeladonCity_LeafGreen_FishingMons };\n\nconst struct WildPokemon sFuchsiaCity_LeafGreen_WaterMons[] =\n{\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 20, 25, SPECIES_SLOWPOKE },\n    { 25, 30, SPECIES_SLOWPOKE },\n    { 30, 35, SPECIES_SLOWPOKE },\n    { 35, 40, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sFuchsiaCity_LeafGreen_WaterMonsInfo = { 1, sFuchsiaCity_LeafGreen_WaterMons };\n\nconst struct WildPokemon sFuchsiaCity_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 15, 25, SPECIES_GOLDEEN },\n    { 20, 30, SPECIES_SEAKING },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sFuchsiaCity_LeafGreen_FishingMonsInfo = { 10, sFuchsiaCity_LeafGreen_FishingMons };\n\nconst struct WildPokemon sCinnabarIsland_LeafGreen_WaterMons[] =\n{\n    { 5, 10, SPECIES_TENTACOOL },\n    { 10, 20, SPECIES_TENTACOOL },\n    { 20, 30, SPECIES_TENTACOOL },\n    { 30, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n};\n\nconst struct WildPokemonInfo sCinnabarIsland_LeafGreen_WaterMonsInfo = { 1, sCinnabarIsland_LeafGreen_WaterMons };\n\nconst struct WildPokemon sCinnabarIsland_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_HORSEA },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_STARYU },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_SLOWBRO },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sCinnabarIsland_LeafGreen_FishingMonsInfo = { 10, sCinnabarIsland_LeafGreen_FishingMons };\n\nconst struct WildPokemon sOneIsland_LeafGreen_WaterMons[] =\n{\n    { 5, 20, SPECIES_TENTACOOL },\n    { 20, 35, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sOneIsland_LeafGreen_WaterMonsInfo = { 1, sOneIsland_LeafGreen_WaterMons };\n\nconst struct WildPokemon sOneIsland_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_STARYU },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sOneIsland_LeafGreen_FishingMonsInfo = { 10, sOneIsland_LeafGreen_FishingMons };\n\nconst struct WildPokemon sFourIsland_LeafGreen_WaterMons[] =\n{\n    { 5, 15, SPECIES_MARILL },\n    { 5, 35, SPECIES_SLOWPOKE },\n    { 15, 25, SPECIES_MARILL },\n    { 15, 25, SPECIES_MARILL },\n    { 15, 25, SPECIES_MARILL },\n};\n\nconst struct WildPokemonInfo sFourIsland_LeafGreen_WaterMonsInfo = { 2, sFourIsland_LeafGreen_WaterMons };\n\nconst struct WildPokemon sFourIsland_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_POLIWAG },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_GOLDEEN },\n    { 15, 25, SPECIES_POLIWAG },\n    { 20, 30, SPECIES_POLIWHIRL },\n    { 15, 25, SPECIES_GYARADOS },\n    { 15, 25, SPECIES_SLOWPOKE },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sFourIsland_LeafGreen_FishingMonsInfo = { 20, sFourIsland_LeafGreen_FishingMons };\n\nconst struct WildPokemon sFiveIsland_LeafGreen_WaterMons[] =\n{\n    { 5, 35, SPECIES_TENTACOOL },\n    { 5, 15, SPECIES_HOPPIP },\n    { 35, 40, SPECIES_TENTACOOL },\n    { 35, 40, SPECIES_TENTACRUEL },\n    { 35, 40, SPECIES_TENTACRUEL },\n};\n\nconst struct WildPokemonInfo sFiveIsland_LeafGreen_WaterMonsInfo = { 1, sFiveIsland_LeafGreen_WaterMons };\n\nconst struct WildPokemon sFiveIsland_LeafGreen_FishingMons[] =\n{\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 5, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 5, 15, SPECIES_MAGIKARP },\n    { 5, 15, SPECIES_KRABBY },\n    { 15, 25, SPECIES_KRABBY },\n    { 15, 25, SPECIES_STARYU },\n    { 15, 25, SPECIES_GYARADOS },\n    { 25, 35, SPECIES_KINGLER },\n    { 25, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sFiveIsland_LeafGreen_FishingMonsInfo = { 10, sFiveIsland_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_LeafGreen_LandMons[] =\n{\n    { 10, 10, SPECIES_ZUBAT },\n    { 12, 12, SPECIES_ZUBAT },\n    { 8, 8, SPECIES_ZUBAT },\n    { 14, 14, SPECIES_ZUBAT },\n    { 10, 10, SPECIES_ZUBAT },\n    { 12, 12, SPECIES_ZUBAT },\n    { 16, 16, SPECIES_ZUBAT },\n    { 6, 6, SPECIES_ZUBAT },\n    { 8, 8, SPECIES_ZUBAT },\n    { 14, 14, SPECIES_ZUBAT },\n    { 8, 8, SPECIES_ZUBAT },\n    { 14, 14, SPECIES_ZUBAT },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_LeafGreen_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_2_LeafGreen_LandMons[] =\n{\n    { 7, 7, SPECIES_MAREEP },\n    { 9, 9, SPECIES_MAREEP },\n    { 5, 5, SPECIES_MAREEP },\n    { 11, 11, SPECIES_MAREEP },\n    { 7, 7, SPECIES_MAREEP },\n    { 9, 9, SPECIES_MAREEP },\n    { 13, 13, SPECIES_MAREEP },\n    { 3, 3, SPECIES_MAREEP },\n    { 5, 5, SPECIES_MAREEP },\n    { 11, 11, SPECIES_MAREEP },\n    { 5, 5, SPECIES_MAREEP },\n    { 11, 11, SPECIES_MAREEP },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_2_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_2_LeafGreen_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_3_LeafGreen_LandMons[] =\n{\n    { 23, 23, SPECIES_PINECO },\n    { 25, 25, SPECIES_PINECO },\n    { 22, 22, SPECIES_PINECO },\n    { 27, 27, SPECIES_PINECO },\n    { 23, 23, SPECIES_PINECO },\n    { 25, 25, SPECIES_PINECO },\n    { 29, 29, SPECIES_PINECO },\n    { 19, 19, SPECIES_PINECO },\n    { 21, 21, SPECIES_PINECO },\n    { 27, 27, SPECIES_PINECO },\n    { 21, 21, SPECIES_PINECO },\n    { 27, 27, SPECIES_PINECO },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_3_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_3_LeafGreen_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_4_LeafGreen_LandMons[] =\n{\n    { 16, 16, SPECIES_HOUNDOUR },\n    { 18, 18, SPECIES_HOUNDOUR },\n    { 14, 14, SPECIES_HOUNDOUR },\n    { 20, 20, SPECIES_HOUNDOUR },\n    { 16, 16, SPECIES_HOUNDOUR },\n    { 18, 18, SPECIES_HOUNDOUR },\n    { 22, 22, SPECIES_HOUNDOUR },\n    { 12, 12, SPECIES_HOUNDOUR },\n    { 14, 14, SPECIES_HOUNDOUR },\n    { 20, 20, SPECIES_HOUNDOUR },\n    { 14, 14, SPECIES_HOUNDOUR },\n    { 20, 20, SPECIES_HOUNDOUR },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_4_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_4_LeafGreen_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_5_LeafGreen_LandMons[] =\n{\n    { 22, 22, SPECIES_TEDDIURSA },\n    { 24, 24, SPECIES_TEDDIURSA },\n    { 20, 20, SPECIES_TEDDIURSA },\n    { 26, 26, SPECIES_TEDDIURSA },\n    { 22, 22, SPECIES_TEDDIURSA },\n    { 24, 24, SPECIES_TEDDIURSA },\n    { 28, 28, SPECIES_TEDDIURSA },\n    { 18, 18, SPECIES_TEDDIURSA },\n    { 20, 20, SPECIES_TEDDIURSA },\n    { 26, 26, SPECIES_TEDDIURSA },\n    { 20, 20, SPECIES_TEDDIURSA },\n    { 26, 26, SPECIES_TEDDIURSA },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_5_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_5_LeafGreen_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_6_LeafGreen_LandMons[] =\n{\n    { 22, 22, SPECIES_AIPOM },\n    { 24, 24, SPECIES_AIPOM },\n    { 20, 20, SPECIES_AIPOM },\n    { 26, 26, SPECIES_AIPOM },\n    { 22, 22, SPECIES_AIPOM },\n    { 24, 24, SPECIES_AIPOM },\n    { 28, 28, SPECIES_AIPOM },\n    { 18, 18, SPECIES_AIPOM },\n    { 20, 20, SPECIES_AIPOM },\n    { 26, 26, SPECIES_AIPOM },\n    { 20, 20, SPECIES_AIPOM },\n    { 26, 26, SPECIES_AIPOM },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_6_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_6_LeafGreen_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_7_LeafGreen_LandMons[] =\n{\n    { 22, 22, SPECIES_SHUCKLE },\n    { 24, 24, SPECIES_SHUCKLE },\n    { 20, 20, SPECIES_SHUCKLE },\n    { 26, 26, SPECIES_SHUCKLE },\n    { 22, 22, SPECIES_SHUCKLE },\n    { 24, 24, SPECIES_SHUCKLE },\n    { 28, 28, SPECIES_SHUCKLE },\n    { 18, 18, SPECIES_SHUCKLE },\n    { 20, 20, SPECIES_SHUCKLE },\n    { 26, 26, SPECIES_SHUCKLE },\n    { 20, 20, SPECIES_SHUCKLE },\n    { 26, 26, SPECIES_SHUCKLE },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_7_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_7_LeafGreen_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_8_LeafGreen_LandMons[] =\n{\n    { 22, 22, SPECIES_STANTLER },\n    { 24, 24, SPECIES_STANTLER },\n    { 20, 20, SPECIES_STANTLER },\n    { 26, 26, SPECIES_STANTLER },\n    { 22, 22, SPECIES_STANTLER },\n    { 24, 24, SPECIES_STANTLER },\n    { 28, 28, SPECIES_STANTLER },\n    { 18, 18, SPECIES_STANTLER },\n    { 20, 20, SPECIES_STANTLER },\n    { 26, 26, SPECIES_STANTLER },\n    { 20, 20, SPECIES_STANTLER },\n    { 26, 26, SPECIES_STANTLER },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_8_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_8_LeafGreen_LandMons };\n\nconst struct WildPokemon sSixIslandAlteringCave_9_LeafGreen_LandMons[] =\n{\n    { 22, 22, SPECIES_SMEARGLE },\n    { 24, 24, SPECIES_SMEARGLE },\n    { 20, 20, SPECIES_SMEARGLE },\n    { 26, 26, SPECIES_SMEARGLE },\n    { 22, 22, SPECIES_SMEARGLE },\n    { 24, 24, SPECIES_SMEARGLE },\n    { 28, 28, SPECIES_SMEARGLE },\n    { 18, 18, SPECIES_SMEARGLE },\n    { 20, 20, SPECIES_SMEARGLE },\n    { 26, 26, SPECIES_SMEARGLE },\n    { 20, 20, SPECIES_SMEARGLE },\n    { 26, 26, SPECIES_SMEARGLE },\n};\n\nconst struct WildPokemonInfo sSixIslandAlteringCave_9_LeafGreen_LandMonsInfo = { 7, sSixIslandAlteringCave_9_LeafGreen_LandMons };\n\nconst struct WildPokemon sRoute20_Underwater_FireRed_LandMons[] =\n{\n    { 33, 36, SPECIES_TENTACOOL },\n    { 25, 25, SPECIES_HORSEA },\n    { 12, 14, SPECIES_KRABBY },\n    { 15, 15, SPECIES_KRABBY },\n    { 22, 23, SPECIES_HORSEA },\n    { 36, 40, SPECIES_TENTACOOL },\n    { 25, 25, SPECIES_GYARADOS },\n    { 38, 40, SPECIES_TENTACOOL },\n    { 33, 35, SPECIES_SEADRA },\n    { 28, 30, SPECIES_SEADRA },\n    { 31, 33, SPECIES_SEADRA },\n    { 33, 35, SPECIES_PSYDUCK },\n};\n\nconst struct WildPokemonInfo sRoute20_Underwater_FireRed_LandMonsInfo = { 7, sRoute20_Underwater_FireRed_LandMons };\n\nconst struct WildPokemon sRoute20_Underwater_LeafGreen_LandMons[] =\n{\n    { 33, 36, SPECIES_TENTACOOL },\n    { 25, 25, SPECIES_KRABBY },\n    { 12, 14, SPECIES_HORSEA },\n    { 15, 15, SPECIES_HORSEA },\n    { 22, 23, SPECIES_KRABBY },\n    { 36, 40, SPECIES_TENTACOOL },\n    { 25, 25, SPECIES_GYARADOS },\n    { 38, 40, SPECIES_TENTACOOL },\n    { 33, 35, SPECIES_KINGLER },\n    { 28, 30, SPECIES_KINGLER },\n    { 31, 33, SPECIES_KINGLER },\n    { 33, 35, SPECIES_SLOWPOKE },\n};\n\nconst struct WildPokemonInfo sRoute20_Underwater_LeafGreen_LandMonsInfo = { 7, sRoute20_Underwater_LeafGreen_LandMons };\n\nconst struct WildPokemon sSafariZone_NorthWest_LandMons[] =\n{\n    { 33, 33, SPECIES_SUNKERN },\n    { 34, 34, SPECIES_MAREEP },\n    { 35, 35, SPECIES_SUNKERN },\n    { 36, 36, SPECIES_MAREEP },\n    { 34, 34, SPECIES_AIPOM },\n    { 27, 27, SPECIES_GIRAFARIG },\n    { 35, 35, SPECIES_HOOTHOOT },\n    { 34, 34, SPECIES_SNUBBULL },\n    { 36, 36, SPECIES_STANTLER },\n    { 37, 37, SPECIES_MILTANK },\n    { 39, 39, SPECIES_STANTLER },\n    { 40, 40, SPECIES_MILTANK },\n};\n\nconst struct WildPokemonInfo sSafariZone_NorthWest_LandMonsInfo = { 25, sSafariZone_NorthWest_LandMons };\n\nconst struct WildPokemon sSafariZone_NorthWest_FireRed_WaterMons[] = // Wooper/Marill are FR/LG exclusive\n{\n    { 25, 30, SPECIES_WOOPER },\n    { 25, 30, SPECIES_WOOPER },\n    { 25, 30, SPECIES_WOOPER },\n    { 25, 30, SPECIES_WOOPER },\n    { 35, 40, SPECIES_QUAGSIRE },\n};\n\nconst struct WildPokemonInfo sSafariZone_NorthWest_FireRed_WaterMonsInfo = { 9, sSafariZone_NorthWest_FireRed_WaterMons };\n\nconst struct WildPokemon sSafariZone_NorthWest_LeafGreen_WaterMons[] = // Wooper/Marill are FR/LG exclusive\n{\n    { 25, 30, SPECIES_MARILL },\n    { 25, 30, SPECIES_MARILL },\n    { 25, 30, SPECIES_MARILL },\n    { 30, 35, SPECIES_MARILL },\n    { 33, 35, SPECIES_MARILL },\n};\n\nconst struct WildPokemonInfo sSafariZone_NorthWest_LeafGreen_WaterMonsInfo = { 9, sSafariZone_NorthWest_LeafGreen_WaterMons };\n\nconst struct WildPokemon sSafariZone_NorthWest_FireRed_FishingMons[] = // Qwilfish/Remoraid are FR/LG exclusive, but Qwilfish isn't obtainable at Hoenn Safari Zone\n{\n    { 25, 30, SPECIES_MAGIKARP },\n    { 25, 30, SPECIES_GOLDEEN },\n    { 25, 30, SPECIES_MAGIKARP },\n    { 25, 30, SPECIES_GOLDEEN },\n    { 30, 35, SPECIES_GOLDEEN },\n    { 25, 30, SPECIES_GOLDEEN },\n    { 25, 30, SPECIES_SEAKING },\n    { 30, 35, SPECIES_SEAKING },\n    { 30, 35, SPECIES_SEAKING },\n    { 35, 40, SPECIES_SEAKING },\n};\n\nconst struct WildPokemonInfo sSafariZone_NorthWest_FireRed_FishingMonsInfo = { 35, sSafariZone_NorthWest_FireRed_FishingMons };\n\nconst struct WildPokemon sSafariZone_NorthWest_LeafGreen_FishingMons[] = // Qwilfish/Remoraid are FR/LG exclusive, but Qwilfish isn't obtainable at Hoenn Safari Zone\n{\n    { 25, 30, SPECIES_MAGIKARP },\n    { 25, 30, SPECIES_GOLDEEN },\n    { 25, 30, SPECIES_MAGIKARP },\n    { 25, 30, SPECIES_GOLDEEN },\n    { 30, 35, SPECIES_REMORAID },\n    { 25, 30, SPECIES_GOLDEEN },\n    { 25, 30, SPECIES_REMORAID },\n    { 30, 35, SPECIES_REMORAID },\n    { 30, 35, SPECIES_REMORAID },\n    { 35, 40, SPECIES_OCTILLERY },\n};\n\nconst struct WildPokemonInfo sSafariZone_NorthWest_LeafGreen_FishingMonsInfo = { 35, sSafariZone_NorthWest_LeafGreen_FishingMons };\n\nconst struct WildPokemon sSafariZone_NorthWest_RockSmashMons[] =\n{\n    { 25, 30, SPECIES_SHUCKLE },\n    { 20, 25, SPECIES_SHUCKLE },\n    { 30, 35, SPECIES_SHUCKLE },\n    { 30, 35, SPECIES_SHUCKLE },\n    { 35, 40, SPECIES_SHUCKLE },\n};\n\nconst struct WildPokemonInfo sSafariZone_NorthWest_RockSmashMonsInfo = { 25, sSafariZone_NorthWest_RockSmashMons };\n\nconst struct WildPokemon sSafariZone_NorthEast_LandMons[] =\n{\n    { 33, 33, SPECIES_AIPOM },\n    { 34, 34, SPECIES_TEDDIURSA },\n    { 35, 35, SPECIES_AIPOM },\n    { 36, 36, SPECIES_TEDDIURSA },\n    { 34, 34, SPECIES_SUNKERN },\n    { 27, 27, SPECIES_GIRAFARIG },\n    { 35, 35, SPECIES_HOOTHOOT },\n    { 34, 34, SPECIES_PINECO },\n    { 36, 36, SPECIES_HOUNDOUR },\n    { 37, 37, SPECIES_GLIGAR },\n    { 39, 39, SPECIES_HOUNDOUR },\n    { 40, 40, SPECIES_GLIGAR },\n};\n\nconst struct WildPokemonInfo sSafariZone_NorthEast_LandMonsInfo = { 25, sSafariZone_NorthEast_LandMons };\n\nconst struct WildPokemon sThreeIslandBondBridge_Underwater_LandMons[] =\n{\n    { 20, 20, SPECIES_CHINCHOU },\n    { 20, 20, SPECIES_CHINCHOU },\n    { 21, 21, SPECIES_CHINCHOU },\n    { 22, 22, SPECIES_CHINCHOU },\n    { 23, 23, SPECIES_CHINCHOU },\n    { 24, 24, SPECIES_CHINCHOU },\n    { 25, 25, SPECIES_CHINCHOU },\n    { 26, 26, SPECIES_CHINCHOU },\n    { 27, 27, SPECIES_CHINCHOU },\n    { 28, 28, SPECIES_CHINCHOU },\n    { 29, 29, SPECIES_CHINCHOU },\n    { 30, 30, SPECIES_CHINCHOU },\n};\n\nconst struct WildPokemonInfo sThreeIslandBondBridge_Underwater_LandMonsInfo = { 7, sThreeIslandBondBridge_Underwater_LandMons };\n\nconst struct WildPokemon sArtisanCave_LandMons[] =\n{\n    { 40, 40, SPECIES_SMEARGLE },\n    { 41, 41, SPECIES_SMEARGLE },\n    { 42, 42, SPECIES_SMEARGLE },\n    { 43, 43, SPECIES_SMEARGLE },\n    { 44, 44, SPECIES_SMEARGLE },\n    { 45, 45, SPECIES_SMEARGLE },\n    { 46, 46, SPECIES_SMEARGLE },\n    { 47, 47, SPECIES_SMEARGLE },\n    { 48, 48, SPECIES_SMEARGLE },\n    { 49, 49, SPECIES_SMEARGLE },\n    { 50, 50, SPECIES_SMEARGLE },\n    { 50, 50, SPECIES_SMEARGLE },\n};\n\nconst struct WildPokemonInfo sArtisanCave_LandMonsInfo = { 10, sArtisanCave_LandMons };\n\nconst struct WildPokemonHeader gWildMonHeaders[] =\n{\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER),\n        .landMonsInfo_FR = &sSevenIslandTanobyRuinsMoneanChamber_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSevenIslandTanobyRuinsMoneanChamber_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER),\n        .landMonsInfo_FR = &sSevenIslandTanobyRuinsLiptooChamber_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSevenIslandTanobyRuinsLiptooChamber_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER),\n        .landMonsInfo_FR = &sSevenIslandTanobyRuinsWeepthChamber_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSevenIslandTanobyRuinsWeepthChamber_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER),\n        .landMonsInfo_FR = &sSevenIslandTanobyRuinsDilfordChamber_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSevenIslandTanobyRuinsDilfordChamber_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER),\n        .landMonsInfo_FR = &sSevenIslandTanobyRuinsScufibChamber_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSevenIslandTanobyRuinsScufibChamber_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER),\n        .landMonsInfo_FR = &sSevenIslandTanobyRuinsRixyChamber_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSevenIslandTanobyRuinsRixyChamber_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER),\n        .landMonsInfo_FR = &sSevenIslandTanobyRuinsViapoisChamber_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSevenIslandTanobyRuinsViapoisChamber_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(VIRIDIAN_FOREST),\n        .mapNum = MAP_NUM(VIRIDIAN_FOREST),\n        .landMonsInfo_FR = &sViridianForest_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sViridianForest_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_MOON_1F),\n        .mapNum = MAP_NUM(MT_MOON_1F),\n        .landMonsInfo_FR = &sMtMoon1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtMoon1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_MOON_B1F),\n        .mapNum = MAP_NUM(MT_MOON_B1F),\n        .landMonsInfo_FR = &sMtMoonB1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtMoonB1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_MOON_B2F),\n        .mapNum = MAP_NUM(MT_MOON_B2F),\n        .landMonsInfo_FR = &sMtMoonB2F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtMoonB2F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SSANNE_EXTERIOR),\n        .mapNum = MAP_NUM(SSANNE_EXTERIOR),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sSSAnneExterior_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSSAnneExterior_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSSAnneExterior_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSSAnneExterior_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(DIGLETTS_CAVE_B1F),\n        .mapNum = MAP_NUM(DIGLETTS_CAVE_B1F),\n        .landMonsInfo_FR = &sDiglettsCaveB1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sDiglettsCaveB1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(VICTORY_ROAD_1F),\n        .mapNum = MAP_NUM(VICTORY_ROAD_1F),\n        .landMonsInfo_FR = &sVictoryRoad1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sVictoryRoad1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(VICTORY_ROAD_2F),\n        .mapNum = MAP_NUM(VICTORY_ROAD_2F),\n        .landMonsInfo_FR = &sVictoryRoad2F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sVictoryRoad2F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(VICTORY_ROAD_3F),\n        .mapNum = MAP_NUM(VICTORY_ROAD_3F),\n        .landMonsInfo_FR = &sVictoryRoad3F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sVictoryRoad3F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(POKEMON_MANSION_1F),\n        .mapNum = MAP_NUM(POKEMON_MANSION_1F),\n        .landMonsInfo_FR = &sPokemonMansion1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sPokemonMansion1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(POKEMON_MANSION_2F),\n        .mapNum = MAP_NUM(POKEMON_MANSION_2F),\n        .landMonsInfo_FR = &sPokemonMansion2F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sPokemonMansion2F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(POKEMON_MANSION_3F),\n        .mapNum = MAP_NUM(POKEMON_MANSION_3F),\n        .landMonsInfo_FR = &sPokemonMansion3F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sPokemonMansion3F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(POKEMON_MANSION_B1F),\n        .mapNum = MAP_NUM(POKEMON_MANSION_B1F),\n        .landMonsInfo_FR = &sPokemonMansionB1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sPokemonMansionB1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SAFARI_ZONE_CENTER),\n        .mapNum = MAP_NUM(SAFARI_ZONE_CENTER),\n        .landMonsInfo_FR = &sSafariZoneCenter_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSafariZoneCenter_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sSafariZoneCenter_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSafariZoneCenter_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSafariZoneCenter_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSafariZoneCenter_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SAFARI_ZONE_EAST),\n        .mapNum = MAP_NUM(SAFARI_ZONE_EAST),\n        .landMonsInfo_FR = &sSafariZoneEast_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSafariZoneEast_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sSafariZoneEast_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSafariZoneEast_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSafariZoneEast_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSafariZoneEast_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTH),\n        .mapNum = MAP_NUM(SAFARI_ZONE_NORTH),\n        .landMonsInfo_FR = &sSafariZoneNorth_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSafariZoneNorth_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sSafariZoneNorth_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSafariZoneNorth_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSafariZoneNorth_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSafariZoneNorth_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SAFARI_ZONE_WEST),\n        .mapNum = MAP_NUM(SAFARI_ZONE_WEST),\n        .landMonsInfo_FR = &sSafariZoneWest_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSafariZoneWest_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sSafariZoneWest_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSafariZoneWest_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSafariZoneWest_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSafariZoneWest_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(CERULEAN_CAVE_1F),\n        .mapNum = MAP_NUM(CERULEAN_CAVE_1F),\n        .landMonsInfo_FR = &sCeruleanCave1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sCeruleanCave1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sCeruleanCave1F_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sCeruleanCave1F_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = &sCeruleanCave1F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sCeruleanCave1F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = &sCeruleanCave1F_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sCeruleanCave1F_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(CERULEAN_CAVE_2F),\n        .mapNum = MAP_NUM(CERULEAN_CAVE_2F),\n        .landMonsInfo_FR = &sCeruleanCave2F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sCeruleanCave2F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sCeruleanCave2F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sCeruleanCave2F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(CERULEAN_CAVE_B1F),\n        .mapNum = MAP_NUM(CERULEAN_CAVE_B1F),\n        .landMonsInfo_FR = &sCeruleanCaveB1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sCeruleanCaveB1F_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = &sCeruleanCaveB1F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = &sCeruleanCaveB1F_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROCK_TUNNEL_1F),\n        .mapNum = MAP_NUM(ROCK_TUNNEL_1F),\n        .landMonsInfo_FR = &sRockTunnel1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRockTunnel1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROCK_TUNNEL_B1F),\n        .mapNum = MAP_NUM(ROCK_TUNNEL_B1F),\n        .landMonsInfo_FR = &sRockTunnelB1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRockTunnelB1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sRockTunnelB1F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sRockTunnelB1F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEAFOAM_ISLANDS_1F),\n        .mapNum = MAP_NUM(SEAFOAM_ISLANDS_1F),\n        .landMonsInfo_FR = &sSeafoamIslands1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSeafoamIslands1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEAFOAM_ISLANDS_B1F),\n        .mapNum = MAP_NUM(SEAFOAM_ISLANDS_B1F),\n        .landMonsInfo_FR = &sSeafoamIslandsB1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSeafoamIslandsB1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEAFOAM_ISLANDS_B2F),\n        .mapNum = MAP_NUM(SEAFOAM_ISLANDS_B2F),\n        .landMonsInfo_FR = &sSeafoamIslandsB2F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSeafoamIslandsB2F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEAFOAM_ISLANDS_B3F),\n        .mapNum = MAP_NUM(SEAFOAM_ISLANDS_B3F),\n        .landMonsInfo_FR = &sSeafoamIslandsB3F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSeafoamIslandsB3F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sSeafoamIslandsB3F_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSeafoamIslandsB3F_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSeafoamIslandsB3F_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSeafoamIslandsB3F_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEAFOAM_ISLANDS_B4F),\n        .mapNum = MAP_NUM(SEAFOAM_ISLANDS_B4F),\n        .landMonsInfo_FR = &sSeafoamIslandsB4F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSeafoamIslandsB4F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sSeafoamIslandsB4F_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSeafoamIslandsB4F_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSeafoamIslandsB4F_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSeafoamIslandsB4F_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(POKEMON_TOWER_3F),\n        .mapNum = MAP_NUM(POKEMON_TOWER_3F),\n        .landMonsInfo_FR = &sPokemonTower3F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sPokemonTower3F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(POKEMON_TOWER_4F),\n        .mapNum = MAP_NUM(POKEMON_TOWER_4F),\n        .landMonsInfo_FR = &sPokemonTower4F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sPokemonTower4F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(POKEMON_TOWER_5F),\n        .mapNum = MAP_NUM(POKEMON_TOWER_5F),\n        .landMonsInfo_FR = &sPokemonTower5F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sPokemonTower5F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(POKEMON_TOWER_6F),\n        .mapNum = MAP_NUM(POKEMON_TOWER_6F),\n        .landMonsInfo_FR = &sPokemonTower6F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sPokemonTower6F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(POKEMON_TOWER_7F),\n        .mapNum = MAP_NUM(POKEMON_TOWER_7F),\n        .landMonsInfo_FR = &sPokemonTower7F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sPokemonTower7F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(POWER_PLANT),\n        .mapNum = MAP_NUM(POWER_PLANT),\n        .landMonsInfo_FR = &sPowerPlant_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sPowerPlant_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_EMBER_EXTERIOR),\n        .mapNum = MAP_NUM(MT_EMBER_EXTERIOR),\n        .landMonsInfo_FR = &sMtEmberExterior_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtEmberExterior_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sMtEmberExterior_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sMtEmberExterior_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_EMBER_SUMMIT_PATH_1F),\n        .mapNum = MAP_NUM(MT_EMBER_SUMMIT_PATH_1F),\n        .landMonsInfo_FR = &sMtEmberSummitPath1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtEmberSummitPath1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_EMBER_SUMMIT_PATH_2F),\n        .mapNum = MAP_NUM(MT_EMBER_SUMMIT_PATH_2F),\n        .landMonsInfo_FR = &sMtEmberSummitPath2F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtEmberSummitPath2F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sMtEmberSummitPath2F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sMtEmberSummitPath2F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_EMBER_SUMMIT_PATH_3F),\n        .mapNum = MAP_NUM(MT_EMBER_SUMMIT_PATH_3F),\n        .landMonsInfo_FR = &sMtEmberSummitPath3F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtEmberSummitPath3F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_EMBER_RUBY_PATH_1F),\n        .mapNum = MAP_NUM(MT_EMBER_RUBY_PATH_1F),\n        .landMonsInfo_FR = &sMtEmberRubyPath1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtEmberRubyPath1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sMtEmberRubyPath1F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sMtEmberRubyPath1F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_EMBER_RUBY_PATH_B1F),\n        .mapNum = MAP_NUM(MT_EMBER_RUBY_PATH_B1F),\n        .landMonsInfo_FR = &sMtEmberRubyPathB1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtEmberRubyPathB1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sMtEmberRubyPathB1F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sMtEmberRubyPathB1F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_EMBER_RUBY_PATH_B2F),\n        .mapNum = MAP_NUM(MT_EMBER_RUBY_PATH_B2F),\n        .landMonsInfo_FR = &sMtEmberRubyPathB2F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtEmberRubyPathB2F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sMtEmberRubyPathB2F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sMtEmberRubyPathB2F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_EMBER_RUBY_PATH_B3F),\n        .mapNum = MAP_NUM(MT_EMBER_RUBY_PATH_B3F),\n        .landMonsInfo_FR = &sMtEmberRubyPathB3F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtEmberRubyPathB3F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sMtEmberRubyPathB3F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sMtEmberRubyPathB3F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_EMBER_RUBY_PATH_B1F_STAIRS),\n        .mapNum = MAP_NUM(MT_EMBER_RUBY_PATH_B1F_STAIRS),\n        .landMonsInfo_FR = &sMtEmberRubyPathB1FStairs_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtEmberRubyPathB1FStairs_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sMtEmberRubyPathB1FStairs_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sMtEmberRubyPathB1FStairs_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_EMBER_RUBY_PATH_B2F_STAIRS),\n        .mapNum = MAP_NUM(MT_EMBER_RUBY_PATH_B2F_STAIRS),\n        .landMonsInfo_FR = &sMtEmberRubyPathB2FStairs_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sMtEmberRubyPathB2FStairs_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sMtEmberRubyPathB2FStairs_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sMtEmberRubyPathB2FStairs_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(THREE_ISLAND_BERRY_FOREST),\n        .mapNum = MAP_NUM(THREE_ISLAND_BERRY_FOREST),\n        .landMonsInfo_FR = &sThreeIslandBerryForest_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sThreeIslandBerryForest_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sThreeIslandBerryForest_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sThreeIslandBerryForest_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sThreeIslandBerryForest_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sThreeIslandBerryForest_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE),\n        .mapNum = MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE),\n        .landMonsInfo_FR = &sFourIslandIcefallCaveEntrance_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFourIslandIcefallCaveEntrance_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sFourIslandIcefallCaveEntrance_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sFourIslandIcefallCaveEntrance_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sFourIslandIcefallCaveEntrance_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sFourIslandIcefallCaveEntrance_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_1F),\n        .mapNum = MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_1F),\n        .landMonsInfo_FR = &sFourIslandIcefallCave1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFourIslandIcefallCave1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_B1F),\n        .mapNum = MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_B1F),\n        .landMonsInfo_FR = &sFourIslandIcefallCaveB1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFourIslandIcefallCaveB1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_BACK),\n        .mapNum = MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_BACK),\n        .landMonsInfo_FR = &sFourIslandIcefallCaveBack_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFourIslandIcefallCaveBack_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sFourIslandIcefallCaveBack_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sFourIslandIcefallCaveBack_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sFourIslandIcefallCaveBack_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sFourIslandIcefallCaveBack_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_PATTERN_BUSH),\n        .mapNum = MAP_NUM(SIX_ISLAND_PATTERN_BUSH),\n        .landMonsInfo_FR = &sSixIslandPatternBush_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSixIslandPatternBush_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM1),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM1),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom1_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom1_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM2),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM2),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom2_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom2_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM3),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM3),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom3_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom3_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM4),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM4),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom4_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom4_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM5),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM5),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom5_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom5_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM6),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM6),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom6_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom6_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM7),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM7),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom7_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom7_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM8),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM8),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom8_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom8_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM9),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM9),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom9_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom9_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM10),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM10),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom10_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom10_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM11),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM11),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom11_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom11_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM12),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM12),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom12_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom12_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM13),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM13),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom13_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom13_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ROOM14),\n        .mapNum = MAP_NUM(FIVE_ISLAND_LOST_CAVE_ROOM14),\n        .landMonsInfo_FR = &sFiveIslandLostCaveRoom14_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandLostCaveRoom14_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ONE_ISLAND_KINDLE_ROAD),\n        .mapNum = MAP_NUM(ONE_ISLAND_KINDLE_ROAD),\n        .landMonsInfo_FR = &sOneIslandKindleRoad_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sOneIslandKindleRoad_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sOneIslandKindleRoad_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sOneIslandKindleRoad_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = &sOneIslandKindleRoad_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sOneIslandKindleRoad_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = &sOneIslandKindleRoad_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sOneIslandKindleRoad_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ONE_ISLAND_TREASURE_BEACH),\n        .mapNum = MAP_NUM(ONE_ISLAND_TREASURE_BEACH),\n        .landMonsInfo_FR = &sOneIslandTreasureBeach_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sOneIslandTreasureBeach_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sOneIslandTreasureBeach_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sOneIslandTreasureBeach_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sOneIslandTreasureBeach_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sOneIslandTreasureBeach_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(TWO_ISLAND_CAPE_BRINK),\n        .mapNum = MAP_NUM(TWO_ISLAND_CAPE_BRINK),\n        .landMonsInfo_FR = &sTwoIslandCapeBrink_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sTwoIslandCapeBrink_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sTwoIslandCapeBrink_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sTwoIslandCapeBrink_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sTwoIslandCapeBrink_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sTwoIslandCapeBrink_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(THREE_ISLAND_BOND_BRIDGE),\n        .mapNum = MAP_NUM(THREE_ISLAND_BOND_BRIDGE),\n        .landMonsInfo_FR = &sThreeIslandBondBridge_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sThreeIslandBondBridge_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sThreeIslandBondBridge_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sThreeIslandBondBridge_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sThreeIslandBondBridge_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sThreeIslandBondBridge_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(THREE_ISLAND_PORT),\n        .mapNum = MAP_NUM(THREE_ISLAND_PORT),\n        .landMonsInfo_FR = &sThreeIslandPort_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sThreeIslandPort_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS),\n        .mapNum = MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sFiveIslandResortGorgeous_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sFiveIslandResortGorgeous_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sFiveIslandResortGorgeous_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sFiveIslandResortGorgeous_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_WATER_LABYRINTH),\n        .mapNum = MAP_NUM(FIVE_ISLAND_WATER_LABYRINTH),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sFiveIslandWaterLabyrinth_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sFiveIslandWaterLabyrinth_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sFiveIslandWaterLabyrinth_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sFiveIslandWaterLabyrinth_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_MEADOW),\n        .mapNum = MAP_NUM(FIVE_ISLAND_MEADOW),\n        .landMonsInfo_FR = &sFiveIslandMeadow_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandMeadow_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sFiveIslandMeadow_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sFiveIslandMeadow_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sFiveIslandMeadow_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sFiveIslandMeadow_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_MEMORIAL_PILLAR),\n        .mapNum = MAP_NUM(FIVE_ISLAND_MEMORIAL_PILLAR),\n        .landMonsInfo_FR = &sFiveIslandMemorialPillar_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sFiveIslandMemorialPillar_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sFiveIslandMemorialPillar_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sFiveIslandMemorialPillar_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sFiveIslandMemorialPillar_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sFiveIslandMemorialPillar_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_OUTCAST_ISLAND),\n        .mapNum = MAP_NUM(SIX_ISLAND_OUTCAST_ISLAND),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sSixIslandOutcastIsland_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSixIslandOutcastIsland_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSixIslandOutcastIsland_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSixIslandOutcastIsland_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_GREEN_PATH),\n        .mapNum = MAP_NUM(SIX_ISLAND_GREEN_PATH),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sSixIslandGreenPath_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSixIslandGreenPath_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSixIslandGreenPath_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSixIslandGreenPath_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_WATER_PATH),\n        .mapNum = MAP_NUM(SIX_ISLAND_WATER_PATH),\n        .landMonsInfo_FR = &sSixIslandWaterPath_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSixIslandWaterPath_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sSixIslandWaterPath_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSixIslandWaterPath_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSixIslandWaterPath_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSixIslandWaterPath_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_RUIN_VALLEY),\n        .mapNum = MAP_NUM(SIX_ISLAND_RUIN_VALLEY),\n        .landMonsInfo_FR = &sSixIslandRuinValley_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSixIslandRuinValley_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sSixIslandRuinValley_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSixIslandRuinValley_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSixIslandRuinValley_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSixIslandRuinValley_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sSevenIslandTrainerTower_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSevenIslandTrainerTower_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSevenIslandTrainerTower_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSevenIslandTrainerTower_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE),\n        .landMonsInfo_FR = &sSevenIslandSevaultCanyonEntrance_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSevenIslandSevaultCanyonEntrance_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON),\n        .landMonsInfo_FR = &sSevenIslandSevaultCanyon_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSevenIslandSevaultCanyon_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sSevenIslandSevaultCanyon_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sSevenIslandSevaultCanyon_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sSevenIslandTanobyRuins_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSevenIslandTanobyRuins_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sSevenIslandTanobyRuins_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSevenIslandTanobyRuins_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE1),\n        .mapNum = MAP_NUM(ROUTE1),\n        .landMonsInfo_FR = &sRoute1_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute1_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE2),\n        .mapNum = MAP_NUM(ROUTE2),\n        .landMonsInfo_FR = &sRoute2_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute2_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE3),\n        .mapNum = MAP_NUM(ROUTE3),\n        .landMonsInfo_FR = &sRoute3_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute3_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE4),\n        .mapNum = MAP_NUM(ROUTE4),\n        .landMonsInfo_FR = &sRoute4_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute4_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sRoute4_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute4_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute4_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute4_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE5),\n        .mapNum = MAP_NUM(ROUTE5),\n        .landMonsInfo_FR = &sRoute5_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute5_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE6),\n        .mapNum = MAP_NUM(ROUTE6),\n        .landMonsInfo_FR = &sRoute6_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute6_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sRoute6_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute6_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute6_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute6_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE7),\n        .mapNum = MAP_NUM(ROUTE7),\n        .landMonsInfo_FR = &sRoute7_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute7_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE8),\n        .mapNum = MAP_NUM(ROUTE8),\n        .landMonsInfo_FR = &sRoute8_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute8_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE9),\n        .mapNum = MAP_NUM(ROUTE9),\n        .landMonsInfo_FR = &sRoute9_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute9_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE10),\n        .mapNum = MAP_NUM(ROUTE10),\n        .landMonsInfo_FR = &sRoute10_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute10_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sRoute10_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute10_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute10_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute10_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE11),\n        .mapNum = MAP_NUM(ROUTE11),\n        .landMonsInfo_FR = &sRoute11_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute11_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sRoute11_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute11_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute11_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute11_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE12),\n        .mapNum = MAP_NUM(ROUTE12),\n        .landMonsInfo_FR = &sRoute12_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute12_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sRoute12_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute12_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute12_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute12_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE13),\n        .mapNum = MAP_NUM(ROUTE13),\n        .landMonsInfo_FR = &sRoute13_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute13_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sRoute13_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute13_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute13_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute13_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE14),\n        .mapNum = MAP_NUM(ROUTE14),\n        .landMonsInfo_FR = &sRoute14_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute14_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE15),\n        .mapNum = MAP_NUM(ROUTE15),\n        .landMonsInfo_FR = &sRoute15_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute15_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE16),\n        .mapNum = MAP_NUM(ROUTE16),\n        .landMonsInfo_FR = &sRoute16_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute16_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE17),\n        .mapNum = MAP_NUM(ROUTE17),\n        .landMonsInfo_FR = &sRoute17_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute17_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE18),\n        .mapNum = MAP_NUM(ROUTE18),\n        .landMonsInfo_FR = &sRoute18_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute18_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE19),\n        .mapNum = MAP_NUM(ROUTE19),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sRoute19_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute19_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute19_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute19_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE20),\n        .mapNum = MAP_NUM(ROUTE20),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sRoute20_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute20_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute20_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute20_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE21_NORTH),\n        .mapNum = MAP_NUM(ROUTE21_NORTH),\n        .landMonsInfo_FR = &sRoute21North_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute21North_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sRoute21North_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute21North_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute21North_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute21North_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE21_SOUTH),\n        .mapNum = MAP_NUM(ROUTE21_SOUTH),\n        .landMonsInfo_FR = &sRoute21South_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute21South_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sRoute21South_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute21South_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute21South_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute21South_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE22),\n        .mapNum = MAP_NUM(ROUTE22),\n        .landMonsInfo_FR = &sRoute22_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute22_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sRoute22_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute22_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute22_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute22_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE23),\n        .mapNum = MAP_NUM(ROUTE23),\n        .landMonsInfo_FR = &sRoute23_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute23_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sRoute23_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute23_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute23_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute23_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE24),\n        .mapNum = MAP_NUM(ROUTE24),\n        .landMonsInfo_FR = &sRoute24_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute24_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sRoute24_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute24_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute24_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute24_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE25),\n        .mapNum = MAP_NUM(ROUTE25),\n        .landMonsInfo_FR = &sRoute25_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute25_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sRoute25_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sRoute25_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sRoute25_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sRoute25_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(PALLET_TOWN),\n        .mapNum = MAP_NUM(PALLET_TOWN),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sPalletTown_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sPalletTown_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sPalletTown_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sPalletTown_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(VIRIDIAN_CITY),\n        .mapNum = MAP_NUM(VIRIDIAN_CITY),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sViridianCity_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sViridianCity_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sViridianCity_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sViridianCity_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(CERULEAN_CITY),\n        .mapNum = MAP_NUM(CERULEAN_CITY),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sCeruleanCity_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sCeruleanCity_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sCeruleanCity_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sCeruleanCity_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(VERMILION_CITY),\n        .mapNum = MAP_NUM(VERMILION_CITY),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sVermilionCity_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sVermilionCity_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sVermilionCity_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sVermilionCity_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(CELADON_CITY),\n        .mapNum = MAP_NUM(CELADON_CITY),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sCeladonCity_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sCeladonCity_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sCeladonCity_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sCeladonCity_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(FUCHSIA_CITY),\n        .mapNum = MAP_NUM(FUCHSIA_CITY),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sFuchsiaCity_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sFuchsiaCity_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sFuchsiaCity_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sFuchsiaCity_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(CINNABAR_ISLAND),\n        .mapNum = MAP_NUM(CINNABAR_ISLAND),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sCinnabarIsland_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sCinnabarIsland_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sCinnabarIsland_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sCinnabarIsland_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(ONE_ISLAND),\n        .mapNum = MAP_NUM(ONE_ISLAND),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sOneIsland_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sOneIsland_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sOneIsland_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sOneIsland_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(FOUR_ISLAND),\n        .mapNum = MAP_NUM(FOUR_ISLAND),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sFourIsland_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sFourIsland_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sFourIsland_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sFourIsland_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND),\n        .mapNum = MAP_NUM(FIVE_ISLAND),\n        .landMonsInfo_FR = NULL,\n        .landMonsInfo_LG = NULL,\n        .waterMonsInfo_FR = &sFiveIsland_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sFiveIsland_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = &sFiveIsland_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sFiveIsland_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE),\n        .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE),\n        .landMonsInfo_FR = &sSixIslandAlteringCave_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSixIslandAlteringCave_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE),\n        .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE),\n        .landMonsInfo_FR = &sSixIslandAlteringCave_2_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSixIslandAlteringCave_2_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE),\n        .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE),\n        .landMonsInfo_FR = &sSixIslandAlteringCave_3_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSixIslandAlteringCave_3_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE),\n        .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE),\n        .landMonsInfo_FR = &sSixIslandAlteringCave_4_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSixIslandAlteringCave_4_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE),\n        .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE),\n        .landMonsInfo_FR = &sSixIslandAlteringCave_5_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSixIslandAlteringCave_5_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE),\n        .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE),\n        .landMonsInfo_FR = &sSixIslandAlteringCave_6_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSixIslandAlteringCave_6_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE),\n        .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE),\n        .landMonsInfo_FR = &sSixIslandAlteringCave_7_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSixIslandAlteringCave_7_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE),\n        .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE),\n        .landMonsInfo_FR = &sSixIslandAlteringCave_8_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSixIslandAlteringCave_8_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_ALTERING_CAVE),\n        .mapNum = MAP_NUM(SIX_ISLAND_ALTERING_CAVE),\n        .landMonsInfo_FR = &sSixIslandAlteringCave_9_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sSixIslandAlteringCave_9_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE20_UNDERWATER),\n        .mapNum = MAP_NUM(ROUTE20_UNDERWATER),\n        .landMonsInfo_FR = &sRoute20_Underwater_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sRoute20_Underwater_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTH_WEST),\n        .mapNum = MAP_NUM(SAFARI_ZONE_NORTH_WEST),\n        .landMonsInfo_FR = &sSafariZone_NorthWest_LandMonsInfo,\n        .landMonsInfo_LG = &sSafariZone_NorthWest_LandMonsInfo,\n        .waterMonsInfo_FR = &sSafariZone_NorthWest_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sSafariZone_NorthWest_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = &sSafariZone_NorthWest_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sSafariZone_NorthWest_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = &sSafariZone_NorthWest_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sSafariZone_NorthWest_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTH_EAST),\n        .mapNum = MAP_NUM(SAFARI_ZONE_NORTH_EAST),\n        .landMonsInfo_FR = &sSafariZone_NorthEast_LandMonsInfo,\n        .landMonsInfo_LG = &sSafariZone_NorthEast_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sSafariZone_NorthWest_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sSafariZone_NorthWest_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(THREE_ISLAND_BOND_BRIDGE_UNDERWATER),\n        .mapNum = MAP_NUM(THREE_ISLAND_BOND_BRIDGE_UNDERWATER),\n        .landMonsInfo_FR = &sThreeIslandBondBridge_Underwater_LandMonsInfo,\n        .landMonsInfo_LG = &sThreeIslandBondBridge_Underwater_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ARTISAN_CAVE_B1F),\n        .mapNum = MAP_NUM(ARTISAN_CAVE_B1F),\n        .landMonsInfo_FR = &sArtisanCave_LandMonsInfo,\n        .landMonsInfo_LG = &sArtisanCave_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(ARTISAN_CAVE_1F),\n        .mapNum = MAP_NUM(ARTISAN_CAVE_1F),\n        .landMonsInfo_FR = &sArtisanCave_LandMonsInfo,\n        .landMonsInfo_LG = &sArtisanCave_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = NULL,\n        .rockSmashMonsInfo_LG = NULL,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(CERULEAN_CAVE_1F_BLUE),\n        .mapNum = MAP_NUM(CERULEAN_CAVE_1F_BLUE),\n        .landMonsInfo_FR = &sCeruleanCave1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sCeruleanCave1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sCeruleanCave1F_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sCeruleanCave1F_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = &sCeruleanCave1F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sCeruleanCave1F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = &sCeruleanCave1F_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sCeruleanCave1F_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(CERULEAN_CAVE_2F_BLUE),\n        .mapNum = MAP_NUM(CERULEAN_CAVE_2F_BLUE),\n        .landMonsInfo_FR = &sCeruleanCave2F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sCeruleanCave2F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sCeruleanCave2F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sCeruleanCave2F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(CERULEAN_CAVE_B1F_BLUE),\n        .mapNum = MAP_NUM(CERULEAN_CAVE_B1F_BLUE),\n        .landMonsInfo_FR = &sCeruleanCaveB1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sCeruleanCaveB1F_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = &sCeruleanCaveB1F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = &sCeruleanCaveB1F_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(CERULEAN_CAVE_1F_YELLOW),\n        .mapNum = MAP_NUM(CERULEAN_CAVE_1F_YELLOW),\n        .landMonsInfo_FR = &sCeruleanCave1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sCeruleanCave1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sCeruleanCave1F_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sCeruleanCave1F_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = &sCeruleanCave1F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sCeruleanCave1F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = &sCeruleanCave1F_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sCeruleanCave1F_LeafGreen_FishingMonsInfo,\n    },\n    {\n        .mapGroup = MAP_GROUP(CERULEAN_CAVE_2F_YELLOW),\n        .mapNum = MAP_NUM(CERULEAN_CAVE_2F_YELLOW),\n        .landMonsInfo_FR = &sCeruleanCave2F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sCeruleanCave2F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = NULL,\n        .waterMonsInfo_LG = NULL,\n        .rockSmashMonsInfo_FR = &sCeruleanCave2F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sCeruleanCave2F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = NULL,\n        .fishingMonsInfo_LG = NULL,\n    },\n    {\n        .mapGroup = MAP_GROUP(CERULEAN_CAVE_B1F_YELLOW),\n        .mapNum = MAP_NUM(CERULEAN_CAVE_B1F_YELLOW),\n        .landMonsInfo_FR = &sCeruleanCaveB1F_FireRed_LandMonsInfo,\n        .landMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_LandMonsInfo,\n        .waterMonsInfo_FR = &sCeruleanCaveB1F_FireRed_WaterMonsInfo,\n        .waterMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_WaterMonsInfo,\n        .rockSmashMonsInfo_FR = &sCeruleanCaveB1F_FireRed_RockSmashMonsInfo,\n        .rockSmashMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_RockSmashMonsInfo,\n        .fishingMonsInfo_FR = &sCeruleanCaveB1F_FireRed_FishingMonsInfo,\n        .fishingMonsInfo_LG = &sCeruleanCaveB1F_LeafGreen_FishingMonsInfo,\n    },\n};\n"
  },
  {
    "path": "src/data.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"data.h\"\n#include \"graphics.h\"\n#include \"constants/items.h\"\n#include \"constants/moves.h\"\n#include \"constants/battle_ai.h\"\n#include \"constants/trainers.h\"\n\n#define BATTLER_OFFSET(i) (gHeap + 0x8000 + MON_PIC_SIZE * (i))\n\nconst struct SpriteFrameImage gBattlerPicTable_PlayerLeft[] =\n{\n    BATTLER_OFFSET(0), MON_PIC_SIZE,\n    BATTLER_OFFSET(1), MON_PIC_SIZE,\n    BATTLER_OFFSET(2), MON_PIC_SIZE,\n    BATTLER_OFFSET(3), MON_PIC_SIZE,\n};\n\nconst struct SpriteFrameImage gBattlerPicTable_OpponentLeft[] =\n{\n    BATTLER_OFFSET(4), MON_PIC_SIZE,\n    BATTLER_OFFSET(5), MON_PIC_SIZE,\n    BATTLER_OFFSET(6), MON_PIC_SIZE,\n    BATTLER_OFFSET(7), MON_PIC_SIZE,\n};\n\nconst struct SpriteFrameImage gBattlerPicTable_PlayerRight[] =\n{\n    BATTLER_OFFSET(8),  MON_PIC_SIZE,\n    BATTLER_OFFSET(9),  MON_PIC_SIZE,\n    BATTLER_OFFSET(10), MON_PIC_SIZE,\n    BATTLER_OFFSET(11), MON_PIC_SIZE,\n};\n\nconst struct SpriteFrameImage gBattlerPicTable_OpponentRight[] =\n{\n    BATTLER_OFFSET(12), MON_PIC_SIZE,\n    BATTLER_OFFSET(13), MON_PIC_SIZE,\n    BATTLER_OFFSET(14), MON_PIC_SIZE,\n    BATTLER_OFFSET(15), MON_PIC_SIZE,\n};\n\nconst struct SpriteFrameImage gTrainerBackPicTable_Red[] =\n{\n    gTrainerBackPic_Red, 0x0800,\n    gTrainerBackPic_Red + 0x0800, 0x0800,\n    gTrainerBackPic_Red + 0x1000, 0x0800,\n    gTrainerBackPic_Red + 0x1800, 0x0800,\n    gTrainerBackPic_Red + 0x2000, 0x0800,\n};\n\nconst struct SpriteFrameImage gTrainerBackPicTable_Leaf[] =\n{\n    gTrainerBackPic_Leaf, 0x0800,\n    gTrainerBackPic_Leaf + 0x0800, 0x0800,\n    gTrainerBackPic_Leaf + 0x1000, 0x0800,\n    gTrainerBackPic_Leaf + 0x1800, 0x0800,\n    gTrainerBackPic_Leaf + 0x2000, 0x0800,\n};\n\nconst struct SpriteFrameImage gTrainerBackPicTable_Pokedude[] =\n{\n    gTrainerBackPic_Pokedude, 0x0800,\n    gTrainerBackPic_Pokedude + 0x0800, 0x0800,\n    gTrainerBackPic_Pokedude + 0x1000, 0x0800,\n    gTrainerBackPic_Pokedude + 0x1800, 0x0800,\n};\n\nconst struct SpriteFrameImage gTrainerBackPicTable_OldMan[] =\n{\n    gTrainerBackPic_OldMan, 0x0800,\n    gTrainerBackPic_OldMan + 0x0800, 0x0800,\n    gTrainerBackPic_OldMan + 0x1000, 0x0800,\n    gTrainerBackPic_OldMan + 0x1800, 0x0800,\n};\n\nconst struct SpriteFrameImage gTrainerBackPicTable_RSBrendan[] =\n{\n    gTrainerBackPic_RSBrendan, 0x0800,\n    gTrainerBackPic_RSBrendan + 0x0800, 0x0800,\n    gTrainerBackPic_RSBrendan + 0x1000, 0x0800,\n    gTrainerBackPic_RSBrendan + 0x1800, 0x0800,\n};\n\nconst struct SpriteFrameImage gTrainerBackPicTable_RSMay[] =\n{\n    gTrainerBackPic_RSMay, 0x0800,\n    gTrainerBackPic_RSMay + 0x0800, 0x0800,\n    gTrainerBackPic_RSMay + 0x1000, 0x0800,\n    gTrainerBackPic_RSMay + 0x1800, 0x0800,\n};\n\nconst struct SpriteFrameImage gTrainerBackPicTable_EmBrendan[] =\n{\n    gTrainerBackPic_EmBrendan, 0x0800,\n    gTrainerBackPic_EmBrendan + 0x0800, 0x0800,\n    gTrainerBackPic_EmBrendan + 0x1000, 0x0800,\n    gTrainerBackPic_EmBrendan + 0x1800, 0x0800,\n};\n\nconst struct SpriteFrameImage gTrainerBackPicTable_EmMay[] =\n{\n    gTrainerBackPic_EmMay, 0x0800,\n    gTrainerBackPic_EmMay + 0x0800, 0x0800,\n    gTrainerBackPic_EmMay + 0x1000, 0x0800,\n    gTrainerBackPic_EmMay + 0x1800, 0x0800,\n};\n\nstatic const union AnimCmd sAnim_GeneralFrame0[] =\n{\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_GeneralFrame3[] =\n{\n    ANIMCMD_FRAME(3, 0),\n    ANIMCMD_END,\n};\n\n// Many of these affine anims seem to go unused, and\n// instead SetSpriteRotScale is used to manipulate\n// the battler sprites directly (for instance, in AnimTask_SwitchOutShrinkMon).\n// Those with explicit indexes are referenced elsewhere.\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_Normal[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_Flipped[] =\n{\n    AFFINEANIMCMD_FRAME(-0x100, 0x0100, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_Emerge[] =\n{\n    AFFINEANIMCMD_FRAME(0x28, 0x28, 0, 0),\n    AFFINEANIMCMD_FRAME(0x12, 0x12, 0, 12),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_Return[] =\n{\n    AFFINEANIMCMD_FRAME(-0x2, -0x2, 0, 18),\n    AFFINEANIMCMD_FRAME(-0x10, -0x10, 0, 15),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_HorizontalSquishLoop[] =\n{\n    AFFINEANIMCMD_FRAME(0xA0, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME( 0x4,   0x0, 0, 8),\n    AFFINEANIMCMD_FRAME(-0x4,   0x0, 0, 8),\n    AFFINEANIMCMD_JUMP(1),\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_Grow[] =\n{\n    AFFINEANIMCMD_FRAME(0x2, 0x2, 0, 20),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_Shrink[] =\n{\n    AFFINEANIMCMD_FRAME(-0x2, -0x2, 0, 20),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_BigToSmall[] =\n{\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(-0x10, -0x10, 0, 9),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_GrowLarge[] =\n{\n    AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 63),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_TipRight[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -3, 5),\n    AFFINEANIMCMD_FRAME(0x0, 0x0,  3, 5),\n    AFFINEANIMCMD_END,\n};\n\nconst union AffineAnimCmd *const gAffineAnims_BattleSpritePlayerSide[] =\n{\n    [BATTLER_AFFINE_NORMAL] = sAffineAnim_Battler_Normal,\n    [BATTLER_AFFINE_EMERGE] = sAffineAnim_Battler_Emerge,\n    [BATTLER_AFFINE_RETURN] = sAffineAnim_Battler_Return,\n    sAffineAnim_Battler_HorizontalSquishLoop,\n    sAffineAnim_Battler_Grow,\n    sAffineAnim_Battler_Shrink,\n    sAffineAnim_Battler_GrowLarge,\n    sAffineAnim_Battler_TipRight,\n    sAffineAnim_Battler_BigToSmall,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_SpinShrink[] =\n{\n    AFFINEANIMCMD_FRAME(-0x4, -0x4, 4, 63),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_TipLeft[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0,  3, 5),\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -3, 5),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_RotateUpAndBack[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, -5, 20),\n    AFFINEANIMCMD_FRAME(0x0, 0x0,  0, 20),\n    AFFINEANIMCMD_FRAME(0x0, 0x0,  5, 20),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Battler_Spin[] =\n{\n    AFFINEANIMCMD_FRAME(0x0, 0x0, 9, 110),\n    AFFINEANIMCMD_END,\n};\n\nconst union AffineAnimCmd *const gAffineAnims_BattleSpriteOpponentSide[] =\n{\n    [BATTLER_AFFINE_NORMAL] = sAffineAnim_Battler_Normal,\n    [BATTLER_AFFINE_EMERGE] = sAffineAnim_Battler_Emerge,\n    [BATTLER_AFFINE_RETURN] = sAffineAnim_Battler_Return,\n    sAffineAnim_Battler_HorizontalSquishLoop,\n    sAffineAnim_Battler_Grow,\n    sAffineAnim_Battler_Shrink,\n    sAffineAnim_Battler_SpinShrink,\n    sAffineAnim_Battler_TipLeft,\n    sAffineAnim_Battler_RotateUpAndBack,\n    sAffineAnim_Battler_BigToSmall,\n    sAffineAnim_Battler_Spin,\n};\n\nconst union AffineAnimCmd *const gAffineAnims_BattleSpriteContest[] =\n{\n    [BATTLER_AFFINE_NORMAL] = sAffineAnim_Battler_Flipped,\n    [BATTLER_AFFINE_EMERGE] = sAffineAnim_Battler_Emerge,\n    [BATTLER_AFFINE_RETURN] = sAffineAnim_Battler_Return,\n    sAffineAnim_Battler_HorizontalSquishLoop,\n    sAffineAnim_Battler_Grow,\n    sAffineAnim_Battler_Shrink,\n    sAffineAnim_Battler_SpinShrink,\n    sAffineAnim_Battler_TipLeft,\n    sAffineAnim_Battler_RotateUpAndBack,\n    sAffineAnim_Battler_BigToSmall,\n    sAffineAnim_Battler_Spin,\n};\n\nstatic const union AnimCmd sAnim_MonPic_0[] =\n{\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MonPic_1[] =\n{\n    ANIMCMD_FRAME(1, 0),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MonPic_2[] =\n{\n    ANIMCMD_FRAME(2, 0),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MonPic_3[] =\n{\n    ANIMCMD_FRAME(3, 0),\n    ANIMCMD_END,\n};\n\nconst union AnimCmd *const gAnims_MonPic[] =\n{\n    sAnim_MonPic_0,\n    sAnim_MonPic_1,\n    sAnim_MonPic_2,\n    sAnim_MonPic_3,\n};\n\n#define SPECIES_SPRITE(species, sprite) [SPECIES_##species] = {sprite, 0x800, SPECIES_##species}\n#define SPECIES_PAL(species, pal) [SPECIES_##species] = {pal, SPECIES_##species}\n#define SPECIES_SHINY_PAL(species, pal) [SPECIES_##species] = {pal, SPECIES_##species + SPECIES_SHINY_TAG}\n\n#define TRAINER_SPRITE(trainerPic, sprite, size) [TRAINER_PIC_##trainerPic] = {sprite, size, TRAINER_PIC_##trainerPic}\n#define TRAINER_PAL(trainerPic, pal) [TRAINER_PIC_##trainerPic] = {pal, TRAINER_PIC_##trainerPic}\n\n#include \"data/pokemon_graphics/front_pic_coordinates.h\"\n#include \"data/pokemon_graphics/front_pic_table.h\"\n#include \"data/pokemon_graphics/back_pic_coordinates.h\"\n#include \"data/pokemon_graphics/back_pic_table.h\"\n#include \"data/pokemon_graphics/palette_table.h\"\n#include \"data/pokemon_graphics/shiny_palette_table.h\"\n\n#include \"data/trainer_graphics/front_pic_anims.h\"\n#include \"data/trainer_graphics/front_pic_tables.h\"\n#include \"data/trainer_graphics/back_pic_anims.h\"\n#include \"data/trainer_graphics/back_pic_tables.h\"\n\n#include \"data/pokemon_graphics/enemy_mon_elevation.h\"\n\n#include \"data/trainer_parties.h\"\n#include \"data/master_trainer_parties.h\"\n#include \"data/text/trainer_class_names.h\"\n#include \"data/trainers.h\"\n#include \"data/master_trainers.h\"\n#include \"data/text/species_names.h\"\n#include \"data/text/move_names.h\"\n"
  },
  {
    "path": "src/daycare.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"battle.h\"\n#include \"battle_setup.h\"\n#include \"constants/items.h\"\n#include \"mail_data.h\"\n#include \"pokemon_storage_system.h\"\n#include \"event_data.h\"\n#include \"random.h\"\n#include \"constants/moves.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"script.h\"\n#include \"strings.h\"\n#include \"party_menu.h\"\n#include \"list_menu.h\"\n#include \"overworld.h\"\n#include \"pokedex.h\"\n#include \"decompress.h\"\n#include \"constants/songs.h\"\n#include \"text_window.h\"\n#include \"trig.h\"\n#include \"m4a.h\"\n#include \"graphics.h\"\n#include \"scanline_effect.h\"\n#include \"naming_screen.h\"\n#include \"help_system.h\"\n#include \"field_fadetransition.h\"\n#include \"trade.h\"\n#include \"constants/daycare.h\"\n#include \"constants/region_map_sections.h\"\n\n// Combination of RSE's Day-Care (re-used on Four Island), FRLG's Day-Care, and egg_hatch.c\n\nextern const struct Evolution gEvolutionTable[][EVOS_PER_MON];\n\nstruct EggHatchData\n{\n    u8 eggSpriteID;\n    u8 pokeSpriteID;\n    u8 CB2_state;\n    u8 CB2_PalCounter;\n    u8 eggPartyID;\n    u8 unused_5;\n    u8 unused_6;\n    u8 eggShardVelocityID;\n    u8 windowId;\n    u8 unused_9;\n    u8 unused_A;\n    u16 species;\n    u8 textColor[3];\n};\n\n// this file's functions\nstatic void ClearDaycareMonMail(struct DayCareMail *mail);\nstatic void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare);\nstatic u8 GetDaycareCompatibilityScore(struct DayCare *daycare);\nstatic void DaycarePrintMonInfo(u8 windowId, u32 daycareSlotId, u8 y);\n\nstatic void Task_EggHatch(u8 taskID);\nstatic void CB2_EggHatch_0(void);\nstatic void CB2_EggHatch_1(void);\nstatic void SpriteCB_Egg_0(struct Sprite* sprite);\nstatic void SpriteCB_Egg_1(struct Sprite* sprite);\nstatic void SpriteCB_Egg_2(struct Sprite* sprite);\nstatic void SpriteCB_Egg_3(struct Sprite* sprite);\nstatic void SpriteCB_Egg_4(struct Sprite* sprite);\nstatic void SpriteCB_Egg_5(struct Sprite* sprite);\nstatic void SpriteCB_EggShard(struct Sprite* sprite);\nstatic void EggHatchPrintMessage(u8 windowId, u8 *string, u8 x, u8 y, u8 speed);\nstatic void CreateRandomEggShardSprite(void);\nstatic void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex);\nstatic u8 GetEggCyclesToSubtract(void);\n\n// IWRAM bss\nstatic struct EggHatchData *sEggHatchData;\n\n// RAM buffers used to assist with BuildEggMoveset()\nEWRAM_DATA static u16 sHatchedEggLevelUpMoves[EGG_LVL_UP_MOVES_ARRAY_COUNT] = {0};\nEWRAM_DATA static u16 sHatchedEggFatherMoves[4] = {0};\nEWRAM_DATA static u16 sHatchedEggFinalMoves[4] = {0};\nEWRAM_DATA static u16 sHatchedEggEggMoves[EGG_MOVES_ARRAY_COUNT] = {0};\nEWRAM_DATA static u16 sHatchedEggMotherMoves[4] = {0};\n\n#include \"data/pokemon/egg_moves.h\"\n\nstatic const struct WindowTemplate sDaycareLevelMenuWindowTemplate =\n{\n    .bg = 0,\n    .tilemapLeft = 12,\n    .tilemapTop = 1,\n    .width = 17,\n    .height = 5,\n    .paletteNum = 15,\n    .baseBlock = 8\n};\n\nstatic const struct ListMenuItem sLevelMenuItems[] =\n{\n    {gExpandedPlaceholder_Empty, 0},\n    {gExpandedPlaceholder_Empty, 1},\n    {gOtherText_Exit, DAYCARE_LEVEL_MENU_EXIT}\n};\n\nstatic const struct ListMenuTemplate sDaycareListMenuLevelTemplate =\n{\n    .items = sLevelMenuItems,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = DaycarePrintMonInfo,\n    .totalItems = 3,\n    .maxShowed = 3,\n    .windowId = 0,\n    .header_X = 2,\n    .item_X = 8,\n    .cursor_X = 0,\n    .upText_Y = 0,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 1,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = 0,\n    .fontId = FONT_NORMAL_COPY_2,\n    .cursorKind = 0\n};\n\nstatic const u8 *const sCompatibilityMessages[] =\n{\n    gDaycareText_GetAlongVeryWell,\n    gDaycareText_GetAlong,\n    gDaycareText_DontLikeOther,\n    gDaycareText_PlayOther\n};\n\nstatic const u8 sNewLineText[] = _(\"\\n\");\nstatic const u8 sJapaneseEggNickname[] = _(\"タマゴ\"); // \"tamago\" (\"egg\" in Japanese)\n\nstatic const u16 sEggPalette[] = INCBIN_U16(\"graphics/pokemon/egg/normal.gbapal\");\nstatic const u8 sEggHatchTiles[] = INCBIN_U8(\"graphics/misc/egg_hatch.4bpp\");\nstatic const u8 sEggShardTiles[] = INCBIN_U8(\"graphics/misc/egg_shard.4bpp\");\n\nstatic const struct OamData sOamData_EggHatch =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = 0,\n    .mosaic = FALSE,\n    .bpp = 0,\n    .shape = SPRITE_SHAPE(32x32),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sSpriteAnim_EggHatch0[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_EggHatch1[] =\n{\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_EggHatch2[] =\n{\n    ANIMCMD_FRAME(32, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_EggHatch3[] =\n{\n    ANIMCMD_FRAME(48, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_EggHatch[] =\n{\n    sSpriteAnim_EggHatch0,\n    sSpriteAnim_EggHatch1,\n    sSpriteAnim_EggHatch2,\n    sSpriteAnim_EggHatch3,\n};\n\nstatic const struct SpriteSheet sEggHatch_Sheet =\n{\n    .data = sEggHatchTiles,\n    .size = 2048,\n    .tag = 12345,\n};\n\nstatic const struct SpriteSheet sEggShards_Sheet =\n{\n    .data = sEggShardTiles,\n    .size = 128,\n    .tag = 23456,\n};\n\nstatic const struct SpritePalette sEgg_SpritePalette =\n{\n    .data = sEggPalette,\n    .tag = 54321\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_EggHatch =\n{\n    .tileTag = 12345,\n    .paletteTag = 54321,\n    .oam = &sOamData_EggHatch,\n    .anims = sSpriteAnimTable_EggHatch,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_EggShard =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = 0,\n    .mosaic = FALSE,\n    .bpp = 0,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sSpriteAnim_EggShard0[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_EggShard1[] =\n{\n    ANIMCMD_FRAME(1, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_EggShard2[] =\n{\n    ANIMCMD_FRAME(2, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_EggShard3[] =\n{\n    ANIMCMD_FRAME(3, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_EggShard[] =\n{\n    sSpriteAnim_EggShard0,\n    sSpriteAnim_EggShard1,\n    sSpriteAnim_EggShard2,\n    sSpriteAnim_EggShard3,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_EggShard =\n{\n    .tileTag = 23456,\n    .paletteTag = 54321,\n    .oam = &sOamData_EggShard,\n    .anims = sSpriteAnimTable_EggShard,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_EggShard\n};\n\nstatic const struct BgTemplate sBgTemplates_EggHatch[2] =\n{\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 24,\n        .screenSize = 3,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0\n    },\n\n    {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 8,\n        .screenSize = 1,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0\n    },\n};\n\nstatic const struct WindowTemplate sWinTemplates_EggHatch[2] =\n{\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 0,\n        .baseBlock = 64\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sYesNoWinTemplate =\n{\n    .bg = 0,\n    .tilemapLeft = 21,\n    .tilemapTop = 9,\n    .width = 6,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 424\n};\n\nstatic const s16 sEggShardVelocities[][2] =\n{\n    {Q_8_8(-1.5),       Q_8_8(-3.75)},\n    {Q_8_8(-5),         Q_8_8(-3)},\n    {Q_8_8(3.5),        Q_8_8(-3)},\n    {Q_8_8(-4),         Q_8_8(-3.75)},\n    {Q_8_8(2),          Q_8_8(-1.5)},\n    {Q_8_8(-0.5),       Q_8_8(-6.75)},\n    {Q_8_8(5),          Q_8_8(-2.25)},\n    {Q_8_8(-1.5),       Q_8_8(-3.75)},\n    {Q_8_8(4.5),        Q_8_8(-1.5)},\n    {Q_8_8(-1),         Q_8_8(-6.75)},\n    {Q_8_8(4),          Q_8_8(-2.25)},\n    {Q_8_8(-3.5),       Q_8_8(-3.75)},\n    {Q_8_8(1),          Q_8_8(-1.5)},\n    {Q_8_8(-3.515625),  Q_8_8(-6.75)},\n    {Q_8_8(4.5),        Q_8_8(-2.25)},\n    {Q_8_8(-0.5),       Q_8_8(-7.5)},\n    {Q_8_8(1),          Q_8_8(-4.5)},\n    {Q_8_8(-2.5),       Q_8_8(-2.25)},\n    {Q_8_8(2.5),        Q_8_8(-7.5)},\n};\n\n// code\n\nstatic u8 *DayCare_GetMonNickname(struct Pokemon *mon, u8 *dest)\n{\n    u8 nickname[POKEMON_NAME_LENGTH * 2];\n\n    GetMonData(mon, MON_DATA_NICKNAME, nickname);\n    return StringCopy_Nickname(dest, nickname);\n}\n\nstatic u8 *DayCare_GetBoxMonNickname(struct BoxPokemon *mon, u8 *dest)\n{\n    u8 nickname[POKEMON_NAME_LENGTH * 2];\n\n    GetBoxMonData(mon, MON_DATA_NICKNAME, nickname);\n    return StringCopy_Nickname(dest, nickname);\n}\n\nu8 CountPokemonInDaycare(struct DayCare *daycare)\n{\n    u8 i, count;\n    count = 0;\n\n    for (i = 0; i < DAYCARE_MON_COUNT; i++)\n    {\n        if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES) != 0)\n            count++;\n    }\n\n    return count;\n}\n\nvoid InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDayCareMail *daycareMail)\n{\n    u32 i;\n    u8 numDaycareMons = 0;\n\n    for (i = 0; i < DAYCARE_MON_COUNT; i++)\n    {\n        if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES) != SPECIES_NONE)\n        {\n            numDaycareMons++;\n            if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_HELD_ITEM) == ITEM_NONE)\n            {\n                daycareMail->holdsItem[i] = FALSE;\n            }\n            else\n            {\n                daycareMail->holdsItem[i] = TRUE;\n            }\n        }\n        else\n        {\n            daycareMail->holdsItem[i] = TRUE;\n        }\n    }\n\n    daycareMail->numDaycareMons = numDaycareMons;\n}\n\nstatic s8 Daycare_FindEmptySpot(struct DayCare *daycare)\n{\n    u32 i;\n\n    for (i = 0; i < DAYCARE_MON_COUNT; i++)\n    {\n        if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES) == 0)\n            return i;\n    }\n\n    return -1;\n}\n\nstatic void StorePokemonInDaycare(struct Pokemon *mon, struct DaycareMon *daycareMon)\n{\n    if (MonHasMail(mon))\n    {\n        u8 mailId;\n\n        StringCopy(daycareMon->mail.OT_name, gSaveBlock2Ptr->playerName);\n        DayCare_GetMonNickname(mon, daycareMon->mail.monName);\n//        StripExtCtrlCodes(daycareMon->mail.monName);\n//        daycareMon->mail.gameLanguage = LANGUAGE_ENGLISH;\n//        daycareMon->mail.monLanguage = GetMonData(mon, MON_DATA_LANGUAGE);\n        mailId = GetMonData(mon, MON_DATA_MAIL);\n        daycareMon->mail.message = gSaveBlock1Ptr->mail[mailId];\n        TakeMailFromMon(mon);\n    }\n    StoreHPAndStatusInBoxMon(mon);\n\n    daycareMon->mon = mon->box;\n    if(gSaveBlock1Ptr->keyFlags.noPMC != 1)\n        BoxMonRestorePP(&daycareMon->mon);\n    daycareMon->steps = 0;\n    ZeroMonData(mon);\n    CompactPartySlots();\n    CalculatePlayerPartyCount();\n}\n\nstatic void StorePokemonInEmptyDaycareSlot(struct Pokemon *mon, struct DayCare *daycare)\n{\n    s8 slotId = Daycare_FindEmptySpot(daycare);\n    StorePokemonInDaycare(mon, &daycare->mons[slotId]);\n}\n\nvoid StoreSelectedPokemonInDaycare(void)\n{\n    u8 monId = GetCursorSelectionMonId();\n    StorePokemonInEmptyDaycareSlot(&gPlayerParty[monId], &gSaveBlock1Ptr->daycare);\n}\n\n// Shifts the second daycare pokemon slot into the first slot.\nstatic void ShiftDaycareSlots(struct DayCare *daycare)\n{\n    // This condition is only satisfied when the player takes out the first pokemon from the daycare.\n    if (GetBoxMonData(&daycare->mons[1].mon, MON_DATA_SPECIES) != SPECIES_NONE\n        && GetBoxMonData(&daycare->mons[0].mon, MON_DATA_SPECIES) == SPECIES_NONE)\n    {\n        daycare->mons[0].mon = daycare->mons[1].mon;\n        ZeroBoxMonData(&daycare->mons[1].mon);\n\n        daycare->mons[0].mail = daycare->mons[1].mail;\n        daycare->mons[0].steps = daycare->mons[1].steps;\n        daycare->mons[1].steps = 0;\n        ClearDaycareMonMail(&daycare->mons[1].mail);\n    }\n}\n\nstatic void ApplyDaycareExperience(struct Pokemon *mon)\n{\n    s32 i;\n    bool8 firstMove;\n    u16 learnedMove;\n\n    for (i = 0; i < MAX_LEVEL; i++)\n    {\n        // Add the mon's gained daycare experience level by level until it can't level up anymore.\n        if (TryIncrementMonLevel(mon))\n        {\n            // Teach the mon new moves it learned while in the daycare.\n            firstMove = TRUE;\n            while ((learnedMove = MonTryLearningNewMove(mon, firstMove)) != 0)\n            {\n                firstMove = FALSE;\n                if (learnedMove == MON_HAS_MAX_MOVES)\n                    DeleteFirstMoveAndGiveMoveToMon(mon, gMoveToLearn);\n            }\n        }\n        else\n        {\n            break;\n        }\n    }\n\n    // Re-calculate the mons stats at its new level.\n    CalculateMonStats(mon, FALSE);\n}\n\nstatic u16 TakeSelectedPokemonFromDaycare(struct DaycareMon *daycareMon)\n{\n    u16 species;\n    u32 experience;\n    struct Pokemon pokemon;\n    u8 sentPC;\n\n    DayCare_GetBoxMonNickname(&daycareMon->mon, gStringVar1);\n    species = GetBoxMonData(&daycareMon->mon, MON_DATA_SPECIES);\n    BoxMonToMon(&daycareMon->mon, &pokemon);\n    PopulateBoxHpAndStatusToPartyMon(&pokemon);\n\n    if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL)\n    {\n        experience = GetMonData(&pokemon, MON_DATA_EXP) + daycareMon->steps;\n        SetMonData(&pokemon, MON_DATA_EXP, &experience);\n        ApplyDaycareExperience(&pokemon);\n    }\n\n    if(CalculatePlayerPartyCount() != 6)\n    {\n        gSpecialVar_MonBoxId = 9999;\n        gSpecialVar_MonBoxPos = 9999;\n        gPlayerParty[PARTY_SIZE - 1] = pokemon;\n    }\n    else //convert back to boxmon and send to box\n    {\n       sentPC = SendMonToPC(&pokemon);\n       if(sentPC == MON_CANT_GIVE)\n       {\n           return 9999; //error! Can't retrieve!\n       }\n    }\n    if (daycareMon->mail.message.itemId) //should never trigger for mons sent to box\n    {\n        GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &daycareMon->mail.message);\n        ClearDaycareMonMail(&daycareMon->mail);\n    }\n\n    DayCare_GetBoxMonNickname(&daycareMon->mon, gStringVar2);\n\n    ZeroBoxMonData(&daycareMon->mon);\n    daycareMon->steps = 0;\n    CompactPartySlots();\n    CalculatePlayerPartyCount();\n    return species;\n}\n\nstatic u16 TakeSelectedPokemonMonFromDaycareShiftSlots(struct DayCare *daycare, u8 slotId)\n{\n    u16 species = TakeSelectedPokemonFromDaycare(&daycare->mons[slotId]);\n    ShiftDaycareSlots(daycare);\n    return species;\n}\n\nu16 TakePokemonFromDaycare(void)\n{\n    return TakeSelectedPokemonMonFromDaycareShiftSlots(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004);\n}\n\nstatic u8 GetLevelAfterDaycareSteps(struct BoxPokemon *mon, u32 steps)\n{\n    struct BoxPokemon tempMon = *mon;\n\n    u32 experience = GetBoxMonData(mon, MON_DATA_EXP) + steps;\n    SetBoxMonData(&tempMon, MON_DATA_EXP,  &experience);\n    return GetLevelFromBoxMonExp(&tempMon);\n}\n\nstatic u8 GetNumLevelsGainedFromSteps(struct DaycareMon *daycareMon)\n{\n    u8 levelBefore;\n    u8 levelAfter;\n\n    levelBefore = GetLevelFromBoxMonExp(&daycareMon->mon);\n    levelAfter = GetLevelAfterDaycareSteps(&daycareMon->mon, daycareMon->steps);\n    return levelAfter - levelBefore;\n}\n\nstatic u8 GetNumLevelsGainedForDaycareMon(struct DaycareMon *daycareMon)\n{\n    u8 numLevelsGained = GetNumLevelsGainedFromSteps(daycareMon);\n    ConvertIntToDecimalStringN(gStringVar2, numLevelsGained, STR_CONV_MODE_LEFT_ALIGN, 2);\n    DayCare_GetBoxMonNickname(&daycareMon->mon, gStringVar1);\n    return numLevelsGained;\n}\n\nstatic u32 GetDaycareCostForSelectedMon(struct DaycareMon *daycareMon)\n{\n    u32 cost;\n\n    u8 numLevelsGained = GetNumLevelsGainedFromSteps(daycareMon);\n    DayCare_GetBoxMonNickname(&daycareMon->mon, gStringVar1);\n    cost = 100 + 100 * numLevelsGained;\n    ConvertIntToDecimalStringN(gStringVar2, cost, STR_CONV_MODE_LEFT_ALIGN, 5);\n    return cost;\n}\n\nstatic u16 GetDaycareCostForMon(struct DayCare *daycare, u8 slotId)\n{\n    return GetDaycareCostForSelectedMon(&daycare->mons[slotId]);\n}\n\nvoid GetDaycareCost(void)\n{\n    gSpecialVar_0x8005 = GetDaycareCostForMon(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004);\n}\n\nstatic void Debug_AddDaycareSteps(u16 numSteps)\n{\n    gSaveBlock1Ptr->daycare.mons[0].steps += numSteps;\n    gSaveBlock1Ptr->daycare.mons[1].steps += numSteps;\n    gSaveBlock1Ptr->route5DayCareMon.steps += numSteps;\n}\n\nu8 GetNumLevelsGainedFromDaycare(void)\n{\n    if (GetBoxMonData(&gSaveBlock1Ptr->daycare.mons[gSpecialVar_0x8004], MON_DATA_SPECIES) != 0)\n        return GetNumLevelsGainedForDaycareMon(&gSaveBlock1Ptr->daycare.mons[gSpecialVar_0x8004]);\n\n    return 0;\n}\n\nstatic void ClearDaycareMonMail(struct DayCareMail *mail)\n{\n    s32 i;\n\n    for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)\n        mail->OT_name[i] = 0;\n    for (i = 0; i < POKEMON_NAME_LENGTH + 1; i++)\n        mail->monName[i] = 0;\n\n    ClearMailStruct(&mail->message);\n}\n\nstatic void ClearDaycareMon(struct DaycareMon *daycareMon)\n{\n    ZeroBoxMonData(&daycareMon->mon);\n    daycareMon->steps = 0;\n    ClearDaycareMonMail(&daycareMon->mail);\n}\n\nstatic void ClearAllDaycareData(struct DayCare *daycare)\n{\n    u32 i;\n\n    for (i = 0; i < DAYCARE_MON_COUNT; i++)\n        ClearDaycareMon(&daycare->mons[i]);\n\n    daycare->offspringPersonality = 0;\n    daycare->stepCounter = 0;\n}\n\n// Determines what the species of an Egg would be based on the given species.\n// It determines this by working backwards through the evolution chain of the\n// given species.\nstatic u16 GetEggSpecies(u16 species)\n{\n    int i, j, k;\n    bool8 found;\n\n    // Working backwards up to 5 times seems arbitrary, since the maximum number\n    // of times would only be 3 for 3-stage evolutions.\n    for (i = 0; i < EVOS_PER_MON; i++)\n    {\n        found = FALSE;\n        for (j = 1; j < NUM_SPECIES; j++)\n        {\n            for (k = 0; k < EVOS_PER_MON; k++)\n            {\n                if (gEvolutionTable[j][k].targetSpecies == species)\n                {\n                    species = j;\n                    found = TRUE;\n                    break;\n                }\n            }\n\n            if (found)\n                break;\n        }\n\n        if (j == NUM_SPECIES)\n            break;\n    }\n\n    return species;\n}\n\nstatic s32 GetParentToInheritNature(struct DayCare *daycare)\n{\n    u32 species[DAYCARE_MON_COUNT];\n    s32 i;\n    s32 dittoCount;\n    s32 parent = -1;\n\n    // search for female gender\n    for (i = 0; i < DAYCARE_MON_COUNT; i++)\n    {\n        if (GetBoxMonGender(&daycare->mons[i].mon) == MON_FEMALE)\n            parent = i;\n    }\n\n    // search for ditto\n    for (dittoCount = 0, i = 0; i < DAYCARE_MON_COUNT; i++)\n    {\n        species[i] = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES);\n        if (species[i] == SPECIES_DITTO)\n            dittoCount++, parent = i;\n    }\n\n    // coin flip on ...two Dittos\n    if (dittoCount == DAYCARE_MON_COUNT)\n    {\n        if (Random() >= USHRT_MAX / 2)\n            parent = 0;\n        else\n            parent = 1;\n    }\n\n    // Don't inherit nature if not holding Everstone\n    if (GetBoxMonData(&daycare->mons[parent].mon, MON_DATA_HELD_ITEM) != ITEM_EVERSTONE\n        || Random() >= USHRT_MAX / 2)\n    {\n        return -1;\n    }\n\n    return parent;\n}\n\nstatic void _TriggerPendingDaycareEgg(struct DayCare *daycare)\n{\n    s32 parent;\n    s32 natureTries = 0;\n\n    SeedRng2(gMain.vblankCounter2);\n    parent = GetParentToInheritNature(daycare);\n\n    // don't inherit nature\n    if (parent < 0)\n    {\n        daycare->offspringPersonality = (Random2() << 16) | ((Random() % 0xfffe) + 1);\n    }\n    // inherit nature\n    else\n    {\n        u8 wantedNature = GetNatureFromPersonality(GetBoxMonData(&daycare->mons[parent].mon, MON_DATA_PERSONALITY, NULL));\n        u32 personality;\n\n        do\n        {\n            personality = (Random2() << 16) | (Random());\n            if (wantedNature == GetNatureFromPersonality(personality) && personality != 0)\n                break; // found a personality with the same nature\n\n            natureTries++;\n        } while (natureTries <= 2400);\n\n        daycare->offspringPersonality = personality;\n    }\n    VarSet(VAR_DAYCARE_MAN_TRIGGERS, 0);\n    FlagSet(FLAG_PENDING_DAYCARE_EGG);\n}\n\nstatic void _TriggerPendingDaycareMaleEgg(struct DayCare *daycare)\n{\n    daycare->offspringPersonality = (Random()) | (EGG_GENDER_MALE);\n    VarSet(VAR_DAYCARE_MAN_TRIGGERS, 0);\n    FlagSet(FLAG_PENDING_DAYCARE_EGG);\n}\n\nvoid TriggerPendingDaycareEgg(void)\n{\n    _TriggerPendingDaycareEgg(&gSaveBlock1Ptr->daycare);\n}\n\nstatic void TriggerPendingDaycareMaleEgg(void)\n{\n    _TriggerPendingDaycareMaleEgg(&gSaveBlock1Ptr->daycare);\n}\n\n// Removes the selected index from the given IV list and shifts the remaining\n// elements to the left.\nstatic void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv)\n{\n    s32 i, j;\n    u8 temp[NUM_STATS];\n\n    ivs[selectedIv] = 0xFF;\n    for (i = 0; i < NUM_STATS; i++)\n    {\n        temp[i] = ivs[i];\n    }\n\n    j = 0;\n    for (i = 0; i < NUM_STATS; i++)\n    {\n        if (temp[i] != 0xFF)\n            ivs[j++] = temp[i];\n    }\n}\n\nstatic void InheritIVs(struct Pokemon *egg, struct DayCare *daycare)\n{\n    u32 i;\n    u8 selectedIvs[INHERITED_IV_COUNT];\n    u8 availableIVs[NUM_STATS];\n    u8 whichParent[NELEMS(selectedIvs)];\n    u8 iv;\n\n    // Initialize a list of IV indices.\n    for (i = 0; i < NUM_STATS; i++)\n    {\n        availableIVs[i] = i;\n    }\n\n    // Select the 3 IVs that will be inherited.\n    for (i = 0; i < NELEMS(selectedIvs); i++)\n    {\n        // Randomly pick an IV from the available list and stop from being chosen again.\n        selectedIvs[i] = availableIVs[Random() % (NUM_STATS - i)];\n        RemoveIVIndexFromList(availableIVs, selectedIvs[i]);\n    }\n\n    // Determine which parent each of the selected IVs should inherit from.\n    for (i = 0; i < NELEMS(selectedIvs); i++)\n    {\n        whichParent[i] = Random() % DAYCARE_MON_COUNT;\n    }\n\n    // Set each of inherited IVs on the egg mon.\n    for (i = 0; i < NELEMS(selectedIvs); i++)\n    {\n        switch (selectedIvs[i])\n        {\n            case 0:\n                iv = GetBoxMonData(&daycare->mons[whichParent[i]].mon, MON_DATA_HP_IV);\n                SetMonData(egg, MON_DATA_HP_IV, &iv);\n                break;\n            case 1:\n                iv = GetBoxMonData(&daycare->mons[whichParent[i]].mon, MON_DATA_ATK_IV);\n                SetMonData(egg, MON_DATA_ATK_IV, &iv);\n                break;\n            case 2:\n                iv = GetBoxMonData(&daycare->mons[whichParent[i]].mon, MON_DATA_DEF_IV);\n                SetMonData(egg, MON_DATA_DEF_IV, &iv);\n                break;\n            case 3:\n                iv = GetBoxMonData(&daycare->mons[whichParent[i]].mon, MON_DATA_SPEED_IV);\n                SetMonData(egg, MON_DATA_SPEED_IV, &iv);\n                break;\n            case 4:\n                iv = GetBoxMonData(&daycare->mons[whichParent[i]].mon, MON_DATA_SPATK_IV);\n                SetMonData(egg, MON_DATA_SPATK_IV, &iv);\n                break;\n            case 5:\n                iv = GetBoxMonData(&daycare->mons[whichParent[i]].mon, MON_DATA_SPDEF_IV);\n                SetMonData(egg, MON_DATA_SPDEF_IV, &iv);\n                break;\n        }\n    }\n}\n\n// Counts the number of egg moves a pokemon learns and stores the moves in\n// the given array.\nstatic u8 GetEggMoves(struct Pokemon *pokemon, u16 *eggMoves)\n{\n    u16 eggMoveIdx;\n    u16 numEggMoves;\n    u16 species;\n    u32 i;\n\n    numEggMoves = 0;\n    eggMoveIdx = 0;\n    species = GetMonData(pokemon, MON_DATA_SPECIES);\n    for (i = 0; i < NELEMS(gEggMoves) - 1; i++)\n    {\n        if (gEggMoves[i] == species + EGG_MOVES_SPECIES_OFFSET)\n        {\n            eggMoveIdx = i + 1;\n            break;\n        }\n    }\n\n    for (i = 0; i < EGG_MOVES_ARRAY_COUNT; i++)\n    {\n        if (gEggMoves[eggMoveIdx + i] > EGG_MOVES_SPECIES_OFFSET)\n        {\n            // TODO: the curly braces around this if statement are required for a matching build.\n            break;\n        }\n\n        eggMoves[i] = gEggMoves[eggMoveIdx + i];\n        numEggMoves++;\n    }\n\n    return numEggMoves;\n}\n\nstatic void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxPokemon *mother)\n{\n    u16 numSharedParentMoves;\n    u32 numLevelUpMoves;\n    u16 numEggMoves;\n    u16 i, j;\n\n    numSharedParentMoves = 0;\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        sHatchedEggMotherMoves[i] = MOVE_NONE;\n        sHatchedEggFatherMoves[i] = MOVE_NONE;\n        sHatchedEggFinalMoves[i] = MOVE_NONE;\n    }\n    for (i = 0; i < EGG_MOVES_ARRAY_COUNT; i++)\n        sHatchedEggEggMoves[i] = MOVE_NONE;\n    for (i = 0; i < EGG_LVL_UP_MOVES_ARRAY_COUNT; i++)\n        sHatchedEggLevelUpMoves[i] = MOVE_NONE;\n\n    numLevelUpMoves = GetLevelUpMovesBySpecies(GetMonData(egg, MON_DATA_SPECIES), sHatchedEggLevelUpMoves);\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        sHatchedEggFatherMoves[i] = GetBoxMonData(father, MON_DATA_MOVE1 + i);\n        sHatchedEggMotherMoves[i] = GetBoxMonData(mother, MON_DATA_MOVE1 + i);\n    }\n\n    numEggMoves = GetEggMoves(egg, sHatchedEggEggMoves);\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        if (sHatchedEggFatherMoves[i] != MOVE_NONE)\n        {\n            for (j = 0; j < numEggMoves; j++)\n            {\n                if (sHatchedEggFatherMoves[i] == sHatchedEggEggMoves[j])\n                {\n                    if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == MON_HAS_MAX_MOVES)\n                        DeleteFirstMoveAndGiveMoveToMon(egg, sHatchedEggFatherMoves[i]);\n                    break;\n                }\n            }\n        }\n        else\n        {\n            break;\n        }\n    }\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        if (sHatchedEggFatherMoves[i] != MOVE_NONE)\n        {\n            for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++)\n            {\n                if (sHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01/*_FOCUS_PUNCH*/ + j) && CanMonLearnTMHM(egg, j))\n                {\n                    if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == MON_HAS_MAX_MOVES)\n                        DeleteFirstMoveAndGiveMoveToMon(egg, sHatchedEggFatherMoves[i]);\n                }\n            }\n        }\n    }\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        if (sHatchedEggFatherMoves[i] == MOVE_NONE)\n            break;\n        for (j = 0; j < MAX_MON_MOVES; j++)\n        {\n            if (sHatchedEggFatherMoves[i] == sHatchedEggMotherMoves[j] && sHatchedEggFatherMoves[i] != MOVE_NONE)\n                sHatchedEggFinalMoves[numSharedParentMoves++] = sHatchedEggFatherMoves[i];\n        }\n    }\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        if (sHatchedEggFinalMoves[i] == MOVE_NONE)\n            break;\n        for (j = 0; j < numLevelUpMoves; j++)\n        {\n            if (sHatchedEggLevelUpMoves[j] != MOVE_NONE && sHatchedEggFinalMoves[i] == sHatchedEggLevelUpMoves[j])\n            {\n                if (GiveMoveToMon(egg, sHatchedEggFinalMoves[i]) == MON_HAS_MAX_MOVES)\n                    DeleteFirstMoveAndGiveMoveToMon(egg, sHatchedEggFinalMoves[i]);\n                break;\n            }\n        }\n    }\n}\n\nstatic void RemoveEggFromDayCare(struct DayCare *daycare)\n{\n    daycare->offspringPersonality = 0;\n    daycare->stepCounter = 0;\n}\n\nvoid RejectEggFromDayCare(void)\n{\n    RemoveEggFromDayCare(&gSaveBlock1Ptr->daycare);\n}\n\nstatic void AlterEggSpeciesWithIncenseItem(u16 *species, struct DayCare *daycare)\n{\n    u16 motherItem, fatherItem;\n    if (*species == SPECIES_WYNAUT || *species == SPECIES_AZURILL)\n    {\n        motherItem = GetBoxMonData(&daycare->mons[0].mon, MON_DATA_HELD_ITEM);\n        fatherItem = GetBoxMonData(&daycare->mons[1].mon, MON_DATA_HELD_ITEM);\n        if (*species == SPECIES_WYNAUT && motherItem != ITEM_LAX_INCENSE && fatherItem != ITEM_LAX_INCENSE)\n        {\n            *species = SPECIES_WOBBUFFET;\n        }\n\n        if (*species == SPECIES_AZURILL && motherItem != ITEM_SEA_INCENSE && fatherItem != ITEM_SEA_INCENSE)\n        {\n            *species = SPECIES_MARILL;\n        }\n    }\n}\n\nstatic u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parentSlots)\n{\n    u32 i;\n    u16 species[DAYCARE_MON_COUNT];\n    u16 eggSpecies;\n\n    // Determine which of the daycare mons is the mother and father of the egg.\n    // The 0th index of the parentSlots array is considered the mother slot, and the\n    // 1st index is the father slot.\n    for (i = 0; i < DAYCARE_MON_COUNT; i++)\n    {\n        species[i] = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES);\n        if (species[i] == SPECIES_DITTO)\n        {\n            parentSlots[0] = i ^ 1;\n            parentSlots[1] = i;\n        }\n        else if (GetBoxMonGender(&daycare->mons[i].mon) == MON_FEMALE)\n        {\n            parentSlots[0] = i;\n            parentSlots[1] = i ^ 1;\n        }\n    }\n\n    eggSpecies = GetEggSpecies(species[parentSlots[0]]);\n    if (eggSpecies == SPECIES_NIDORAN_F && daycare->offspringPersonality & EGG_GENDER_MALE)\n    {\n        eggSpecies = SPECIES_NIDORAN_M;\n    }\n    if (eggSpecies == SPECIES_ILLUMISE && daycare->offspringPersonality & EGG_GENDER_MALE)\n    {\n        eggSpecies = SPECIES_VOLBEAT;\n    }\n\n    // Make Ditto the \"mother\" slot if the other daycare mon is male.\n    if (species[parentSlots[1]] == SPECIES_DITTO && GetBoxMonGender(&daycare->mons[parentSlots[0]].mon) != MON_FEMALE)\n    {\n        u8 ditto = parentSlots[1];\n        parentSlots[1] = parentSlots[0];\n        parentSlots[0] = ditto;\n    }\n\n    return eggSpecies;\n}\n\nstatic void _GiveEggFromDaycare(struct DayCare *daycare)\n{\n    struct Pokemon egg;\n    u16 species;\n    u8 parentSlots[DAYCARE_MON_COUNT];\n    bool8 isEgg;\n\n    species = DetermineEggSpeciesAndParentSlots(daycare, parentSlots);\n    AlterEggSpeciesWithIncenseItem(&species, daycare);\n    SetInitialEggData(&egg, species, daycare);\n    InheritIVs(&egg, daycare);\n    BuildEggMoveset(&egg, &daycare->mons[parentSlots[1]].mon, &daycare->mons[parentSlots[0]].mon);\n\n    isEgg = TRUE;\n    SetMonData(&egg, MON_DATA_IS_EGG, &isEgg);\n    gPlayerParty[PARTY_SIZE - 1] = egg;\n    CompactPartySlots();\n    CalculatePlayerPartyCount();\n    RemoveEggFromDayCare(daycare);\n}\n\nstatic void RivalStarterEggIVs(struct Pokemon *egg)\n{\n    u32 i;\n    u8 selectedIvs[INHERITED_IV_COUNT];\n    u8 availableIVs[NUM_STATS];\n    u8 whichParent[NELEMS(selectedIvs)];\n    u8 iv;\n\n    // Initialize a list of IV indices.\n    for (i = 0; i < NUM_STATS; i++)\n    {\n        availableIVs[i] = i;\n    }\n\n    // Select the 3 IVs that will be inherited.\n    for (i = 0; i < NELEMS(selectedIvs); i++)\n    {\n        // Randomly pick an IV from the available list and stop from being chosen again.\n        selectedIvs[i] = availableIVs[Random() % (NUM_STATS - i)];\n        RemoveIVIndexFromList(availableIVs, selectedIvs[i]);\n    }\n\n    // Set each of inherited IVs on the egg mon.\n    for (i = 0; i < NELEMS(selectedIvs); i++)\n    {\n        switch (selectedIvs[i])\n        {\n            case 0:\n                iv = 31;\n                SetMonData(egg, MON_DATA_HP_IV, &iv);\n                break;\n            case 1:\n                iv = 31;\n                SetMonData(egg, MON_DATA_ATK_IV, &iv);\n                break;\n            case 2:\n                iv = 31;\n                SetMonData(egg, MON_DATA_DEF_IV, &iv);\n                break;\n            case 3:\n                iv = 31;\n                SetMonData(egg, MON_DATA_SPEED_IV, &iv);\n                break;\n            case 4:\n                iv = 31;\n                SetMonData(egg, MON_DATA_SPATK_IV, &iv);\n                break;\n            case 5:\n                iv = 31;\n                SetMonData(egg, MON_DATA_SPDEF_IV, &iv);\n                break;\n        }\n    }\n}\n\nvoid GiveRivalStarterEgg(void)\n{\n    struct Pokemon egg;\n    u16 species;\n    u8 parentSlots[DAYCARE_MON_COUNT];\n    bool8 isEgg;\n    u16 ball;\n    u8 metLevel;\n    u8 language;\n    u16 *playerStarter = GetVarPointer(VAR_STARTER_MON);\n    switch(*playerStarter)\n    {\n        case 0:\n            species = SPECIES_CHARMANDER;\n            break;\n        case 1:\n            species = SPECIES_BULBASAUR;\n            break;\n        case 2:\n            species = SPECIES_SQUIRTLE;\n            break;\n    }\n\n    //SetInitialEggData\n    CreateMon(&egg, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, ((((Random()) % 0xFFFE) + 1) | (Random() << 16)), OT_ID_PLAYER_ID, 0);\n    switch(species)\n    {\n        case SPECIES_CHARMANDER:\n            GiveMoveToMon(&egg, MOVE_EMBER);\n            GiveMoveToMon(&egg, MOVE_BELLY_DRUM);\n            break;\n        case SPECIES_BULBASAUR:\n            GiveMoveToMon(&egg, MOVE_LEECH_SEED);\n            GiveMoveToMon(&egg, MOVE_CURSE);\n            break;\n        case SPECIES_SQUIRTLE:\n            GiveMoveToMon(&egg, MOVE_BUBBLE);\n            GiveMoveToMon(&egg, MOVE_MIRROR_COAT);\n            break;\n    }\n    metLevel = 0;\n    ball = ITEM_POKE_BALL;\n    language = LANGUAGE_JAPANESE;\n    SetMonData(&egg, MON_DATA_POKEBALL, &ball);\n    SetMonData(&egg, MON_DATA_NICKNAME, sJapaneseEggNickname);\n    SetMonData(&egg, MON_DATA_FRIENDSHIP, &gSpeciesInfo[species].eggCycles);\n    SetMonData(&egg, MON_DATA_MET_LEVEL, &metLevel);\n    SetMonData(&egg, MON_DATA_LANGUAGE, &language);\n\n    RivalStarterEggIVs(&egg); // 3 31s, rest random.\n\n    isEgg = TRUE;\n    SetMonData(&egg, MON_DATA_IS_EGG, &isEgg);\n    gPlayerParty[PARTY_SIZE - 1] = egg;\n    CompactPartySlots();\n    CalculatePlayerPartyCount();\n}\n\nvoid GiveSelphyCorsolaEgg(void)\n{\n    struct Pokemon egg;\n    u16 species = SPECIES_CORSOLA;\n    u8 parentSlots[DAYCARE_MON_COUNT];\n    bool8 isEgg;\n    u16 ball;\n    u8 metLevel;\n    u8 otGender = FEMALE;\n    u8 language;\n\n    //SetInitialEggData\n    CreateMon(&egg, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, ((((Random()) % 0xFFFE) + 1) | (Random() << 16)), OT_ID_PLAYER_ID, 0);\n\n    GiveMoveToMon(&egg, MOVE_BARRIER);\n    GiveMoveToMon(&egg, MOVE_INGRAIN);\n\n    metLevel = 0;\n    ball = ITEM_POKE_BALL;\n    language = LANGUAGE_JAPANESE;\n    SetMonData(&egg, MON_DATA_POKEBALL, &ball);\n    SetMonData(&egg, MON_DATA_NICKNAME, sJapaneseEggNickname);\n    SetMonData(&egg, MON_DATA_FRIENDSHIP, &gSpeciesInfo[species].eggCycles);\n    SetMonData(&egg, MON_DATA_MET_LEVEL, &metLevel);\n    SetMonData(&egg, MON_DATA_LANGUAGE, &language);\n\n    RivalStarterEggIVs(&egg); // 3 31s, rest random.\n\n    isEgg = TRUE;\n    SetMonData(&egg, MON_DATA_IS_EGG, &isEgg);\n\n    StringCopy(gStringVar1, gTrainers[TRAINER_LADY_SELPHY].trainerName);\n    StringCopy(gStringVar2, gSaveBlock2Ptr->playerName);\n    if(StringCompare(gStringVar1, gStringVar2) == 0)\n    {   //If the player's name is SELPHY, make the Egg OT SEBASTIAN instead to keep it an outsider Egg.\n        StringCopy(gStringVar1, gTrainers[TRAINER_BIRD_KEEPER_SEBASTIAN].trainerName);\n        otGender = MALE;\n    }\n    SetMonData(&egg, MON_DATA_OT_NAME, &gStringVar1);\n    SetMonData(&egg, MON_DATA_OT_GENDER, &otGender);\n\n    gPlayerParty[PARTY_SIZE - 1] = egg;\n    CompactPartySlots();\n    CalculatePlayerPartyCount();\n}\n\nvoid CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation)\n{\n    u8 metLevel;\n    u16 ball;\n    u8 language;\n    u8 metLocation;\n    u8 isEgg;\n\n    CreateMon(mon, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0);\n    metLevel = 0;\n    ball = ITEM_POKE_BALL;\n    language = LANGUAGE_JAPANESE;\n    SetMonData(mon, MON_DATA_POKEBALL, &ball);\n    SetMonData(mon, MON_DATA_NICKNAME, sJapaneseEggNickname);\n    SetMonData(mon, MON_DATA_FRIENDSHIP, &gSpeciesInfo[species].eggCycles);\n    SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel);\n    SetMonData(mon, MON_DATA_LANGUAGE, &language);\n    if (setHotSpringsLocation)\n    {\n        metLocation = METLOC_SPECIAL_EGG;\n        SetMonData(mon, MON_DATA_MET_LOCATION, &metLocation);\n    }\n\n    isEgg = TRUE;\n    SetMonData(mon, MON_DATA_IS_EGG, &isEgg);\n}\n\nstatic void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare)\n{\n    u32 personality;\n    u16 ball;\n    u8 metLevel;\n    u8 language;\n\n    personality = daycare->offspringPersonality;// | (Random() << 16);\n    CreateMon(mon, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, personality, OT_ID_PLAYER_ID, 0);\n    metLevel = 0;\n    ball = ITEM_POKE_BALL;\n    language = LANGUAGE_JAPANESE;\n    SetMonData(mon, MON_DATA_POKEBALL, &ball);\n    SetMonData(mon, MON_DATA_NICKNAME, sJapaneseEggNickname);\n    SetMonData(mon, MON_DATA_FRIENDSHIP, &gSpeciesInfo[species].eggCycles);\n    SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel);\n    SetMonData(mon, MON_DATA_LANGUAGE, &language);\n}\n\nvoid GiveEggFromDaycare(void)\n{\n    _GiveEggFromDaycare(&gSaveBlock1Ptr->daycare);\n}\n\nstatic bool8 TryProduceOrHatchEgg(struct DayCare *daycare)\n{\n    u32 i, validEggs = 0;\n\n    for (i = 0; i < DAYCARE_MON_COUNT; i++)\n    {\n        if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SANITY_HAS_SPECIES))\n            daycare->mons[i].steps++, validEggs++;\n    }\n\n    // Check if an egg should be produced\n    if (daycare->offspringPersonality == 0 && validEggs == DAYCARE_MON_COUNT && (daycare->mons[1].steps & 0xFF) == 0xFF)\n    {\n        u8 compatibility = GetDaycareCompatibilityScore(daycare);\n        if (compatibility > (Random() * 100u) / USHRT_MAX)\n            TriggerPendingDaycareEgg();\n    }\n\n    // Hatch Egg\n    if (++daycare->stepCounter == 255)\n    {\n        u32 steps;\n        u8 toSub = GetEggCyclesToSubtract();\n\n        for (i = 0; i < gPlayerPartyCount; i++)\n        {\n            if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))\n                continue;\n            if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_BAD_EGG))\n                continue;\n\n            steps = GetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP);\n            if (steps != 0)\n            {\n                if(steps >= toSub)\n                    steps -= toSub;\n                else\n                    steps -= 1;\n                    \n                SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &steps);\n            }\n            else // hatch the egg\n            {\n                gSpecialVar_0x8004 = i;\n                return TRUE;\n            }\n        }\n    }\n\n    return FALSE; // no hatching\n}\n\nbool8 ShouldEggHatch(void)\n{\n    if (GetBoxMonData(&gSaveBlock1Ptr->route5DayCareMon.mon, MON_DATA_SANITY_HAS_SPECIES))\n        gSaveBlock1Ptr->route5DayCareMon.steps++;\n    return TryProduceOrHatchEgg(&gSaveBlock1Ptr->daycare);\n}\n\nstatic bool8 IsEggPending(struct DayCare *daycare)\n{\n    return (daycare->offspringPersonality != 0);\n}\n\n// gStringVar1 = first mon's nickname\n// gStringVar2 = second mon's nickname\n// gStringVar3 = first mon trainer's name\nstatic void _GetDaycareMonNicknames(struct DayCare *daycare)\n{\n    u8 text[12];\n    if (GetBoxMonData(&daycare->mons[0].mon, MON_DATA_SPECIES) != SPECIES_NONE)\n    {\n        DayCare_GetBoxMonNickname(&daycare->mons[0].mon, gStringVar1);\n        GetBoxMonData(&daycare->mons[0].mon, MON_DATA_OT_NAME, text);\n        StringCopy(gStringVar3, text);\n    }\n\n    if (GetBoxMonData(&daycare->mons[1].mon, MON_DATA_SPECIES) != SPECIES_NONE)\n    {\n        DayCare_GetBoxMonNickname(&daycare->mons[1].mon, gStringVar2);\n    }\n}\n\nu16 GetSelectedMonNicknameAndSpecies(void)\n{\n    DayCare_GetBoxMonNickname(&gPlayerParty[GetCursorSelectionMonId()].box, gStringVar1);\n    return GetBoxMonData(&gPlayerParty[GetCursorSelectionMonId()].box, MON_DATA_SPECIES);\n}\n\nvoid GetDaycareMonNicknames(void)\n{\n    _GetDaycareMonNicknames(&gSaveBlock1Ptr->daycare);\n}\n\nu8 GetDaycareState(void)\n{\n    u8 numMons;\n    if (IsEggPending(&gSaveBlock1Ptr->daycare))\n    {\n        return DAYCARE_EGG_WAITING;\n    }\n\n    numMons = CountPokemonInDaycare(&gSaveBlock1Ptr->daycare);\n    if (numMons != 0)\n    {\n        return numMons + 1; // DAYCARE_ONE_MON or DAYCARE_TWO_MONS\n    }\n\n    return DAYCARE_NO_MONS;\n}\n\nu8 GetDaycarePokemonCount(void)\n{\n    u8 ret = CountPokemonInDaycare(&gSaveBlock1Ptr->daycare);\n    if (ret)\n        return ret;\n\n    return 0;\n}\n\n// Determine if the two given egg group lists contain any of the\n// same egg groups.\nstatic bool8 EggGroupsOverlap(u16 *eggGroups1, u16 *eggGroups2)\n{\n    s32 i, j;\n\n    for (i = 0; i < EGG_GROUPS_PER_MON; i++)\n    {\n        for (j = 0; j < EGG_GROUPS_PER_MON; j++)\n        {\n            if (eggGroups1[i] == eggGroups2[j])\n                return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nstatic u8 GetDaycareCompatibilityScore(struct DayCare *daycare)\n{\n    u32 i;\n    u16 eggGroups[DAYCARE_MON_COUNT][EGG_GROUPS_PER_MON];\n    u16 species[DAYCARE_MON_COUNT];\n    u32 trainerIds[DAYCARE_MON_COUNT];\n    u32 genders[DAYCARE_MON_COUNT];\n\n    for (i = 0; i < DAYCARE_MON_COUNT; i++)\n    {\n        u32 personality;\n\n        species[i] = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES);\n        trainerIds[i] = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_OT_ID);\n        personality = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_PERSONALITY);\n        genders[i] = GetGenderFromSpeciesAndPersonality(species[i], personality);\n        eggGroups[i][0] = gSpeciesInfo[species[i]].eggGroups[0];\n        eggGroups[i][1] = gSpeciesInfo[species[i]].eggGroups[1];\n    }\n\n    // check unbreedable egg group\n    if (eggGroups[0][0] == EGG_GROUP_UNDISCOVERED || eggGroups[1][0] == EGG_GROUP_UNDISCOVERED)\n        return PARENTS_INCOMPATIBLE;\n    // two Ditto can't breed\n    if (eggGroups[0][0] == EGG_GROUP_DITTO && eggGroups[1][0] == EGG_GROUP_DITTO)\n        return PARENTS_INCOMPATIBLE;\n\n    // one parent is Ditto\n    if (eggGroups[0][0] == EGG_GROUP_DITTO || eggGroups[1][0] == EGG_GROUP_DITTO)\n    {\n        if (trainerIds[0] == trainerIds[1])\n            return PARENTS_LOW_COMPATIBILITY;\n\n        return PARENTS_MED_COMPATIBILITY;\n    }\n    // neither parent is Ditto\n    else\n    {\n        if (genders[0] == genders[1])\n            return PARENTS_INCOMPATIBLE;\n        if (genders[0] == MON_GENDERLESS || genders[1] == MON_GENDERLESS)\n            return PARENTS_INCOMPATIBLE;\n        if (!EggGroupsOverlap(eggGroups[0], eggGroups[1]))\n            return PARENTS_INCOMPATIBLE;\n\n        if (species[0] == species[1])\n        {\n            if (trainerIds[0] == trainerIds[1])\n                return PARENTS_MED_COMPATIBILITY; // same species, same trainer\n\n            return PARENTS_MAX_COMPATIBILITY; // same species, different trainers\n        }\n        else\n        {\n            if (trainerIds[0] != trainerIds[1])\n                return PARENTS_MED_COMPATIBILITY; // different species, different trainers\n\n            return PARENTS_LOW_COMPATIBILITY; // different species, same trainer\n        }\n    }\n}\n\nstatic u8 GetDaycareCompatibilityScoreFromSave(void)\n{\n    return GetDaycareCompatibilityScore(&gSaveBlock1Ptr->daycare);\n}\n\nvoid SetDaycareCompatibilityString(void)\n{\n    u8 whichString;\n    u8 relationshipScore;\n\n    relationshipScore = GetDaycareCompatibilityScoreFromSave();\n    whichString = 0;\n    if (relationshipScore == PARENTS_INCOMPATIBLE)\n        whichString = 3;\n    if (relationshipScore == PARENTS_LOW_COMPATIBILITY)\n        whichString = 2;\n    if (relationshipScore == PARENTS_MED_COMPATIBILITY)\n        whichString = 1;\n    if (relationshipScore == PARENTS_MAX_COMPATIBILITY)\n        whichString = 0;\n\n    StringCopy(gStringVar4, sCompatibilityMessages[whichString]);\n}\n\nbool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio)\n{\n    u32 i;\n    u8 symbolsCount[GENDER_COUNT];\n    symbolsCount[MALE] = symbolsCount[FEMALE] = 0;\n\n    for (i = 0; name[i] != EOS; i++)\n    {\n        if (name[i] == CHAR_MALE)\n            symbolsCount[MALE]++;\n        if (name[i] == CHAR_FEMALE)\n            symbolsCount[FEMALE]++;\n    }\n\n    if (genderRatio == MON_MALE   && symbolsCount[MALE] != 0 && symbolsCount[FEMALE] == 0)\n        return TRUE;\n    if (genderRatio == MON_FEMALE && symbolsCount[FEMALE] != 0 && symbolsCount[MALE] == 0)\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic u8 *AppendGenderSymbol(u8 *name, u8 gender)\n{\n    if (gender == MON_MALE)\n    {\n        if (!NameHasGenderSymbol(name, MON_MALE))\n            return StringAppend(name, gText_MaleSymbol4);\n    }\n    else if (gender == MON_FEMALE)\n    {\n        if (!NameHasGenderSymbol(name, MON_FEMALE))\n            return StringAppend(name, gText_FemaleSymbol4);\n    }\n\n    return StringAppend(name, gText_GenderlessSymbol);\n}\n\nstatic u8 *AppendMonGenderSymbol(u8 *name, struct BoxPokemon *boxMon)\n{\n    return AppendGenderSymbol(name, GetBoxMonGender(boxMon));\n}\n\nstatic void GetDaycareLevelMenuText(struct DayCare *daycare, u8 *dest)\n{\n    u8 monNames[DAYCARE_MON_COUNT][20];\n    u32 i;\n\n    *dest = EOS;\n    for (i = 0; i < DAYCARE_MON_COUNT; i++)\n    {\n        DayCare_GetBoxMonNickname(&daycare->mons[i].mon, monNames[i]);\n        AppendMonGenderSymbol(monNames[i], &daycare->mons[i].mon);\n    }\n\n    StringCopy(dest, monNames[0]);\n    StringAppend(dest, sNewLineText);\n    StringAppend(dest, monNames[1]);\n    StringAppend(dest, sNewLineText);\n    StringAppend(dest, gOtherText_Exit);\n}\n\nstatic void GetDaycareLevelMenuLevelText(struct DayCare *daycare, u8 *dest)\n{\n    u32 i;\n    u8 level;\n    u8 text[20];\n\n    *dest = EOS;\n    for (i = 0; i < DAYCARE_MON_COUNT; i++)\n    {\n        StringAppend(dest, gText_Lv);\n        level = GetLevelAfterDaycareSteps(&daycare->mons[i].mon, daycare->mons[i].steps);\n        ConvertIntToDecimalStringN(text, level, STR_CONV_MODE_LEFT_ALIGN, 3);\n        StringAppend(dest, text);\n        StringAppend(dest, sNewLineText);\n    }\n}\n\nstatic void DaycareAddTextPrinter(u8 windowId, const u8 *text, u32 x, u32 y)\n{\n    struct TextPrinterTemplate printer;\n\n    printer.currentChar = text;\n    printer.windowId = windowId;\n    printer.fontId = FONT_NORMAL_COPY_2;\n    printer.x = x;\n    printer.y = y;\n    printer.currentX = x;\n    printer.currentY = y;\n    printer.unk = 0;\n    gTextFlags.useAlternateDownArrow = 0;\n    printer.letterSpacing = 1;\n    printer.lineSpacing = 1;\n    printer.fgColor = 2;\n    printer.bgColor = 1;\n    printer.shadowColor = 3;\n\n    AddTextPrinter(&printer, 0xFF, NULL);\n}\n\nstatic void DaycarePrintMonNickname(struct DayCare *daycare, u8 windowId, u32 daycareSlotId, u32 y)\n{\n    u8 nickname[POKEMON_NAME_LENGTH * 2];\n\n    DayCare_GetBoxMonNickname(&daycare->mons[daycareSlotId].mon, nickname);\n    AppendMonGenderSymbol(nickname, &daycare->mons[daycareSlotId].mon);\n    DaycareAddTextPrinter(windowId, nickname, 8, y);\n}\n\nstatic void DaycarePrintMonLvl(struct DayCare *daycare, u8 windowId, u32 daycareSlotId, u32 y)\n{\n    u8 level;\n    u32 x;\n    u8 lvlText[12];\n    u8 intText[8];\n\n    StringCopy(lvlText, gText_Lv);\n    level = GetLevelAfterDaycareSteps(&daycare->mons[daycareSlotId].mon, daycare->mons[daycareSlotId].steps);\n    ConvertIntToDecimalStringN(intText, level, STR_CONV_MODE_LEFT_ALIGN, 3);\n    StringAppend(lvlText, intText);\n    x = 132 - GetStringWidth(FONT_NORMAL_COPY_2, lvlText, 0);\n    DaycareAddTextPrinter(windowId, lvlText, x, y);\n}\n\nstatic void DaycarePrintMonInfo(u8 windowId, u32 daycareSlotId, u8 y)\n{\n    if (daycareSlotId < (unsigned) DAYCARE_MON_COUNT)\n    {\n        DaycarePrintMonNickname(&gSaveBlock1Ptr->daycare, windowId, daycareSlotId, y);\n        DaycarePrintMonLvl(&gSaveBlock1Ptr->daycare, windowId, daycareSlotId, y);\n    }\n}\n\n#define tMenuListTaskId     data[0]\n#define tWindowId           data[1]\n\nstatic void Task_HandleDaycareLevelMenuInput(u8 taskId)\n{\n    u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuListTaskId);\n\n    if (gMain.newKeys & A_BUTTON)\n    {\n        switch (input)\n        {\n        case 0:\n        case 1:\n            gSpecialVar_Result = input;\n            break;\n        case DAYCARE_LEVEL_MENU_EXIT:\n            gSpecialVar_Result = DAYCARE_EXITED_LEVEL_MENU;\n            break;\n        }\n        DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL);\n        ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE);\n        RemoveWindow(gTasks[taskId].tWindowId);\n        DestroyTask(taskId);\n        ScriptContext_Enable();\n    }\n    else if (gMain.newKeys & B_BUTTON)\n    {\n        gSpecialVar_Result = DAYCARE_EXITED_LEVEL_MENU;\n        DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL);\n        ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE);\n        RemoveWindow(gTasks[taskId].tWindowId);\n        DestroyTask(taskId);\n        ScriptContext_Enable();\n    }\n}\n\nvoid ShowDaycareLevelMenu(void)\n{\n    struct ListMenuTemplate menuTemplate;\n    u8 windowId;\n    u8 listMenuTaskId;\n    u8 daycareMenuTaskId;\n\n    windowId = AddWindow(&sDaycareLevelMenuWindowTemplate);\n    DrawStdWindowFrame(windowId, FALSE);\n\n    menuTemplate = sDaycareListMenuLevelTemplate;\n    menuTemplate.windowId = windowId;\n    listMenuTaskId = ListMenuInit(&menuTemplate, 0, 0);\n\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n\n    daycareMenuTaskId = CreateTask(Task_HandleDaycareLevelMenuInput, 3);\n    gTasks[daycareMenuTaskId].tMenuListTaskId = listMenuTaskId;\n    gTasks[daycareMenuTaskId].tWindowId = windowId;\n}\n\n#undef tMenuListTaskId\n#undef tWindowId\n\nvoid ChooseSendDaycareMon(void)\n{\n    ChooseMonForDaycare();\n    gMain.savedCallback = CB2_ReturnToField;\n}\n\n// Route 5 Daycare\n\nvoid PutMonInRoute5Daycare(void)\n{\n    u8 monIdx = GetCursorSelectionMonId();\n    StorePokemonInDaycare(&gPlayerParty[monIdx], &gSaveBlock1Ptr->route5DayCareMon);\n}\n\nvoid GetCostToWithdrawRoute5DaycareMon(void)\n{\n    u16 cost = GetDaycareCostForSelectedMon(&gSaveBlock1Ptr->route5DayCareMon);\n    gSpecialVar_0x8005 = cost;\n}\n\nbool8 IsThereMonInRoute5Daycare(void)\n{\n    if (GetBoxMonData(&gSaveBlock1Ptr->route5DayCareMon.mon, MON_DATA_SPECIES) != SPECIES_NONE)\n        return TRUE;\n\n    return FALSE;\n}\n\nu8 GetNumLevelsGainedForRoute5DaycareMon(void)\n{\n    return GetNumLevelsGainedForDaycareMon(&gSaveBlock1Ptr->route5DayCareMon);\n}\n\nu16 TakePokemonFromRoute5Daycare(void)\n{\n    return TakeSelectedPokemonFromDaycare(&gSaveBlock1Ptr->route5DayCareMon);\n}\n\nstatic void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp)\n{\n    u16 species;\n    u32 personality, pokerus;\n    u8 i, friendship, language, gameMet, markings, isModernFatefulEncounter;\n    u16 moves[MAX_MON_MOVES];\n    u32 ivs[NUM_STATS];\n\n\n    species = GetMonData(egg, MON_DATA_SPECIES);\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n        moves[i] = GetMonData(egg, MON_DATA_MOVE1 + i);\n\n    personality = GetMonData(egg, MON_DATA_PERSONALITY);\n\n    for (i = 0; i < NUM_STATS; i++)\n        ivs[i] = GetMonData(egg, MON_DATA_HP_IV + i);\n\n//    language = GetMonData(egg, MON_DATA_LANGUAGE);\n    gameMet = GetMonData(egg, MON_DATA_MET_GAME);\n    markings = GetMonData(egg, MON_DATA_MARKINGS);\n    pokerus = GetMonData(egg, MON_DATA_POKERUS);\n    isModernFatefulEncounter = GetMonData(egg, MON_DATA_MODERN_FATEFUL_ENCOUNTER);\n\n    CreateMon(temp, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, personality, OT_ID_PLAYER_ID, 0);\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n        SetMonData(temp, MON_DATA_MOVE1 + i,  &moves[i]);\n\n    for (i = 0; i < NUM_STATS; i++)\n        SetMonData(temp, MON_DATA_HP_IV + i,  &ivs[i]);\n\n    language = GAME_LANGUAGE;\n    SetMonData(temp, MON_DATA_LANGUAGE, &language);\n    SetMonData(temp, MON_DATA_MET_GAME, &gameMet);\n    SetMonData(temp, MON_DATA_MARKINGS, &markings);\n\n    friendship = 120;\n    SetMonData(temp, MON_DATA_FRIENDSHIP, &friendship);\n    SetMonData(temp, MON_DATA_POKERUS, &pokerus);\n    SetMonData(temp, MON_DATA_MODERN_FATEFUL_ENCOUNTER, &isModernFatefulEncounter);\n\n    *egg = *temp;\n}\n\nstatic void AddHatchedMonToParty(u8 id)\n{\n    u8 isEgg = 0x46; // ?\n    u16 pokeNum;\n    u8 name[12];\n    u16 ball;\n    u16 caughtLvl;\n    u8 mapNameID;\n    u32 eggOTID;\n    u8 mapsecid;\n    u8 otName[PLAYER_NAME_LENGTH];\n    bool32 wasFirstCatch = FALSE;\n    struct Pokemon* mon = &gPlayerParty[id];\n\n    eggOTID = GetMonData(&gPlayerParty[id], MON_DATA_OT_ID);\n    GetMonData(&gPlayerParty[id], MON_DATA_OT_NAME, otName);\n    mapsecid = GetMonData(&gPlayerParty[id], MON_DATA_MET_LOCATION);\n\n    CreatedHatchedMon(mon, &gEnemyParty[0]);\n    SetMonData(mon, MON_DATA_IS_EGG, &isEgg);\n\n    pokeNum = GetMonData(mon, MON_DATA_SPECIES);\n    bufferspeciesname(name, pokeNum);\n    SetMonData(mon, MON_DATA_NICKNAME, name);\n\n    pokeNum = SpeciesToNationalPokedexNum(pokeNum);\n    GetSetPokedexFlag(pokeNum, FLAG_SET_SEEN);\n    GetSetPokedexFlag(pokeNum, FLAG_SET_CAUGHT);\n\n    DayCare_GetMonNickname(mon, gStringVar1);\n\n    ball = ITEM_POKE_BALL;\n    SetMonData(mon, MON_DATA_POKEBALL, &ball);\n\n    caughtLvl = 0;\n    SetMonData(mon, MON_DATA_MET_LEVEL, &caughtLvl);\n\n    //faint egg if Nuzlocke && not outsider && already gotten mon where it was received\n    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n    {\n        if(eggOTID == GetMonData(mon, MON_DATA_OT_ID))\n        {   // If not an outsider Egg\n            if(GetMonData(mon, MON_DATA_SPECIES) == SPECIES_CORSOLA)\n            {   // Gift Corsola Egg handling\n                StringCopy(gStringVar1, gTrainers[TRAINER_LADY_SELPHY].trainerName);\n                if(StringCompare(gStringVar1, otName) == 0)\n                {   // Egg's OT Name is SELPHY\n                    StringCopy(gStringVar2, gSaveBlock2Ptr->playerName);\n                    if(StringCompare(gStringVar1, gStringVar2) != 0)\n                    {  // Player's name is NOT SELPHY; this is the Corsola gift Egg\n                        mapsecid = MAPSEC_RESORT_GORGEOUS;\n                    }\n                }\n                StringCopy_PlayerName(gStringVar1, gTrainers[TRAINER_BIRD_KEEPER_SEBASTIAN].trainerName);\n                if(StringCompare(gStringVar1, otName) == 0)\n                {   // Egg's OT Name is SEBASTI\n                    StringCopy(gStringVar2, gSaveBlock2Ptr->playerName);\n                    if(StringCompare(gStringVar1, gStringVar2) != 0)\n                    {   // Player's name is NOT SEBASTI; this is the Corsola gift Egg\n                        mapsecid = MAPSEC_RESORT_GORGEOUS;\n                    }\n                }\n            }\n            if(mapsecid == METLOC_SPECIAL_EGG)\n                mapsecid = MAPSEC_WATER_LABYRINTH;\n        }\n    }\n\n    mapNameID = GetCurrentRegionMapSectionId();\n    SetMonData(mon, MON_DATA_MET_LOCATION, &mapNameID);\n\n    MonRestorePP(mon);\n    CalculateMonStats(mon, FALSE);\n\n    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n    {\n        if(NuzlockeFlagGet(mapsecid))\n        {   // Already had an encounter where Egg was encountered\n            u16 zeroHP = 0;\n            SetMonData(mon, MON_DATA_HP, &zeroHP);\n        }\n        if(!IsWildMonNuzlockeDupe(GetMonData(mon, MON_DATA_SPECIES)))\n        {   // Set encounter flag where Egg was received if not a dupe\n            NuzlockeFlagSet(mapsecid);\n            if(GetMonData(mon, MON_DATA_HP) > 0)\n                wasFirstCatch = TRUE; // only set dupe flag if not fainted\n        }\n        if(wasFirstCatch)\n        {   // set dupe flag if hatched mon is first of its species\n            SetNuzlockeDupeFlags(SpeciesToNationalPokedexNum(GetMonData(mon, MON_DATA_SPECIES)));\n        }\n    }\n\n    CheckNationalDexEligibilityOnSaveLoad();\n}\n\nvoid ScriptHatchMon(void)\n{\n    AddHatchedMonToParty(gSpecialVar_0x8004);\n}\n\nstatic bool8 BufferDayCareMonReceivedMail(struct DayCare *daycare, u8 daycareId)\n{\n    u8 nick[0x20];\n    struct DaycareMon *daycareMon = &daycare->mons[daycareId];\n\n    DayCare_GetBoxMonNickname(&daycareMon->mon, nick);\n    if (daycareMon->mail.message.itemId != ITEM_NONE\n        && (StringCompare(nick, daycareMon->mail.monName) != 0\n            || StringCompare(gSaveBlock2Ptr->playerName, daycareMon->mail.OT_name) != 0))\n    {\n        StringCopy(gStringVar1, nick);\n        StringCopy(gStringVar2, daycareMon->mail.OT_name);\n        StringCopy(gStringVar3, daycareMon->mail.monName);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nbool8 DaycareMonReceivedMail(void)\n{\n    return BufferDayCareMonReceivedMail(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004);\n}\n\nextern const struct CompressedSpriteSheet gMonFrontPicTable[];\n\nstatic u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16 *speciesLoc)\n{\n    u8 r4 = 0;\n    u8 spriteID = 0; // r7\n    struct Pokemon* mon = NULL; // r5\n\n    if (a0 == 0)\n    {\n        mon = &gPlayerParty[pokeID];\n        r4 = 1;\n    }\n    if (a0 == 1)\n    {\n        mon = &gPlayerParty[pokeID];\n        r4 = 3;\n    }\n    switch (switchID)\n    {\n    case 0:\n    {\n        u16 species = GetMonData(mon, MON_DATA_SPECIES);\n        u32 pid = GetMonData(mon, MON_DATA_PERSONALITY);\n        HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid);\n        LoadCompressedSpritePalette(GetMonSpritePalStruct(mon));\n        *speciesLoc = species;\n    }\n        break;\n    case 1:\n        SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, r4);\n        spriteID = CreateSprite(&gMultiuseSpriteTemplate, 120, 70, 6);\n        gSprites[spriteID].invisible = TRUE;\n        gSprites[spriteID].callback = SpriteCallbackDummy;\n        break;\n    }\n    return spriteID;\n}\n\nstatic void VBlankCB_EggHatch(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid EggHatch(void)\n{\n    LockPlayerFieldControls();\n    CreateTask(Task_EggHatch, 10);\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0);\n    HelpSystem_Disable();\n}\n\nstatic void Task_EggHatch(u8 taskID)\n{\n    if (!gPaletteFade.active)\n    {\n        CleanupOverworldWindowsAndTilemaps();\n        SetMainCallback2(CB2_EggHatch_0);\n        gFieldCallback = FieldCB_ContinueScriptHandleMusic;\n        DestroyTask(taskID);\n    }\n}\n\nstatic void CB2_EggHatch_0(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n\n        sEggHatchData = Alloc(sizeof(struct EggHatchData));\n        AllocateMonSpritesGfx();\n        sEggHatchData->eggPartyID = gSpecialVar_0x8004;\n        sEggHatchData->eggShardVelocityID = 0;\n\n        SetVBlankCallback(VBlankCB_EggHatch);\n        gSpecialVar_0x8005 = GetCurrentMapMusic();\n\n        ResetTempTileDataBuffers();\n        ResetBgsAndClearDma3BusyFlags(0);\n        InitBgsFromTemplates(0, sBgTemplates_EggHatch, NELEMS(sBgTemplates_EggHatch));\n\n        ChangeBgX(1, 0, 0);\n        ChangeBgY(1, 0, 0);\n        ChangeBgX(0, 0, 0);\n        ChangeBgY(0, 0, 0);\n\n        SetBgAttribute(1, 7, 2);\n        SetBgTilemapBuffer(1, Alloc(0x1000));\n        SetBgTilemapBuffer(0, Alloc(0x2000));\n\n        DeactivateAllTextPrinters();\n        ResetPaletteFade();\n        FreeAllSpritePalettes();\n        ResetSpriteData();\n        ResetTasks();\n        ScanlineEffect_Stop();\n        m4aSoundVSyncOn();\n        gMain.state++;\n        break;\n    case 1:\n        InitWindows(sWinTemplates_EggHatch);\n        sEggHatchData->windowId = 0;\n        gMain.state++;\n        break;\n    case 2:\n        DecompressAndLoadBgGfxUsingHeap(0, gBattleInterface_Textbox_Gfx, 0, 0, 0);\n        CopyToBgTilemapBuffer(0, gBattleInterface_Textbox_Tilemap, 0, 0);\n        LoadCompressedPalette(gBattleInterface_Textbox_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n        gMain.state++;\n        break;\n    case 3:\n        LoadSpriteSheet(&sEggHatch_Sheet);\n        LoadSpriteSheet(&sEggShards_Sheet);\n        LoadSpritePalette(&sEgg_SpritePalette);\n        gMain.state++;\n        break;\n    case 4:\n        CopyBgTilemapBufferToVram(0);\n        AddHatchedMonToParty(sEggHatchData->eggPartyID);\n        gMain.state++;\n        break;\n    case 5:\n        EggHatchCreateMonSprite(0, 0, sEggHatchData->eggPartyID, &sEggHatchData->species);\n        gMain.state++;\n        break;\n    case 6:\n        sEggHatchData->pokeSpriteID = EggHatchCreateMonSprite(0, 1, sEggHatchData->eggPartyID, &sEggHatchData->species);\n        gMain.state++;\n        break;\n    case 7:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);\n        LoadPalette(gTradeGba2_Pal, BG_PLTT_ID(1), 5 * PLTT_SIZE_4BPP);\n        LoadBgTiles(1, gTradeGba_Gfx, 0x1420, 0);\n        CopyToBgTilemapBuffer(1, gTradeOrHatchMonShadowTilemap, 0x1000, 0);\n        CopyBgTilemapBufferToVram(1);\n        gMain.state++;\n        break;\n    case 8:\n        SetMainCallback2(CB2_EggHatch_1);\n        sEggHatchData->CB2_state = 0;\n        break;\n    }\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void EggHatchSetMonNickname(void)\n{\n    SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar3);\n    FreeMonSpritesGfx();\n    Free(sEggHatchData);\n    HelpSystem_Enable();\n    SetMainCallback2(CB2_ReturnToField);\n}\n\nstatic void Task_EggHatchPlayBGM(u8 taskID)\n{\n    if (gTasks[taskID].data[0] == 0)\n    {\n        StopMapMusic();\n    }\n    if (gTasks[taskID].data[0] == 1)\n        PlayBGM(MUS_EVOLUTION_INTRO);\n    if (gTasks[taskID].data[0] > 60)\n    {\n        PlayBGM(MUS_EVOLUTION);\n        DestroyTask(taskID);\n        // UB: task is destroyed, yet the value is incremented\n    }\n    gTasks[taskID].data[0]++;\n}\n\nstatic void CB2_EggHatch_1(void)\n{\n    u16 species;\n    u8 gender;\n    u32 personality;\n\n    switch (sEggHatchData->CB2_state)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);\n        sEggHatchData->eggSpriteID = CreateSprite(&sSpriteTemplate_EggHatch, 120, 75, 5);\n        ShowBg(0);\n        ShowBg(1);\n        sEggHatchData->CB2_state++;\n        CreateTask(Task_EggHatchPlayBGM, 5);\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n        {\n            FillWindowPixelBuffer(sEggHatchData->windowId, 0x00);\n            sEggHatchData->CB2_PalCounter = 0;\n            sEggHatchData->CB2_state++;\n        }\n        break;\n    case 2:\n        if (++sEggHatchData->CB2_PalCounter > 30)\n        {\n            sEggHatchData->CB2_state++;\n            gSprites[sEggHatchData->eggSpriteID].callback = SpriteCB_Egg_0;\n        }\n        break;\n    case 3:\n        if (gSprites[sEggHatchData->eggSpriteID].callback == SpriteCallbackDummy)\n        {\n            PlayCry_Normal(sEggHatchData->species, 0);\n            sEggHatchData->CB2_state++;\n        }\n        break;\n    case 4:\n        if (IsCryFinished())\n        {\n            sEggHatchData->CB2_state++;\n        }\n        break;\n    case 5:\n        DayCare_GetMonNickname(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);\n        StringExpandPlaceholders(gStringVar4, gText_HatchedFromEgg);\n        EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 3, 0xFF);\n        PlayFanfare(MUS_EVOLVED);\n        sEggHatchData->CB2_state++;\n        PutWindowTilemap(sEggHatchData->windowId);\n        CopyWindowToVram(sEggHatchData->windowId, COPYWIN_FULL);\n        break;\n    case 6:\n        if (IsFanfareTaskInactive())\n            sEggHatchData->CB2_state++;\n        break;\n    case 7:\n        if (IsFanfareTaskInactive())\n            sEggHatchData->CB2_state++;\n        break;\n    case 8:\n        DayCare_GetMonNickname(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);\n        if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n        {\n            DayCare_GetMonNickname(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3);\n            species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES);\n            gender = GetMonGender(&gPlayerParty[sEggHatchData->eggPartyID]);\n            personality = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_PERSONALITY, 0);\n            DoNamingScreen(NAMING_SCREEN_NICKNAME, gStringVar3, species, gender, personality, EggHatchSetMonNickname);\n            break;\n        }\n        else\n        {\n            StringExpandPlaceholders(gStringVar4, gText_NickHatchPrompt);\n            EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 2, 1);\n            sEggHatchData->CB2_state++;\n        }\n        break;\n    case 9:\n        if (!IsTextPrinterActive(sEggHatchData->windowId))\n        {\n            LoadUserWindowGfx2(sEggHatchData->windowId, 0x140, BG_PLTT_ID(14));\n            CreateYesNoMenu(&sYesNoWinTemplate, FONT_NORMAL_COPY_2, 0, 2, 0x140, 14, 0);\n            sEggHatchData->CB2_state++;\n        }\n        break;\n    case 10:\n        switch (Menu_ProcessInputNoWrapClearOnChoose())\n        {\n        case 0:\n            DayCare_GetMonNickname(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3);\n            species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES);\n            gender = GetMonGender(&gPlayerParty[sEggHatchData->eggPartyID]);\n            personality = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_PERSONALITY, 0);\n            DoNamingScreen(NAMING_SCREEN_NICKNAME, gStringVar3, species, gender, personality, EggHatchSetMonNickname);\n            break;\n        case 1:\n        case -1:\n            sEggHatchData->CB2_state++;\n        }\n        break;\n    case 11:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n        sEggHatchData->CB2_state++;\n        break;\n    case 12:\n        if (!gPaletteFade.active)\n        {\n            RemoveWindow(sEggHatchData->windowId);\n            UnsetBgTilemapBuffer(0);\n            UnsetBgTilemapBuffer(1);\n            Free(sEggHatchData);\n            SetMainCallback2(CB2_ReturnToField);\n            HelpSystem_Enable();\n        }\n        break;\n    }\n\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void SpriteCB_Egg_0(struct Sprite* sprite)\n{\n    if (++sprite->data[0] > 20)\n    {\n        sprite->callback = SpriteCB_Egg_1;\n        sprite->data[0] = 0;\n    }\n    else\n    {\n        sprite->data[1] = (sprite->data[1] + 20) & 0xFF;\n        sprite->x2 = Sin(sprite->data[1], 1);\n        if (sprite->data[0] == 15)\n        {\n            PlaySE(SE_BALL);\n            StartSpriteAnim(sprite, 1);\n            CreateRandomEggShardSprite();\n        }\n    }\n}\n\nstatic void SpriteCB_Egg_1(struct Sprite* sprite)\n{\n    if (++sprite->data[2] > 30)\n    {\n        if (++sprite->data[0] > 20)\n        {\n            sprite->callback = SpriteCB_Egg_2;\n            sprite->data[0] = 0;\n            sprite->data[2] = 0;\n        }\n        else\n        {\n            sprite->data[1] = (sprite->data[1] + 20) & 0xFF;\n            sprite->x2 = Sin(sprite->data[1], 2);\n            if (sprite->data[0] == 15)\n            {\n                PlaySE(SE_BALL);\n                StartSpriteAnim(sprite, 2);\n            }\n        }\n    }\n}\n\nstatic void SpriteCB_Egg_2(struct Sprite* sprite)\n{\n    if (++sprite->data[2] > 30)\n    {\n        if (++sprite->data[0] > 38)\n        {\n            u16 species;\n\n            sprite->callback = SpriteCB_Egg_3;\n            sprite->data[0] = 0;\n            species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES);\n            gSprites[sEggHatchData->pokeSpriteID].x2 = 0;\n            gSprites[sEggHatchData->pokeSpriteID].y2 = gMonFrontPicCoords[species].y_offset;\n        }\n        else\n        {\n            sprite->data[1] = (sprite->data[1] + 20) & 0xFF;\n            sprite->x2 = Sin(sprite->data[1], 2);\n            if (sprite->data[0] == 15)\n            {\n                PlaySE(SE_BALL);\n                StartSpriteAnim(sprite, 2);\n                CreateRandomEggShardSprite();\n                CreateRandomEggShardSprite();\n            }\n            if (sprite->data[0] == 30)\n                PlaySE(SE_BALL);\n        }\n    }\n}\n\nstatic void SpriteCB_Egg_3(struct Sprite* sprite)\n{\n    if (++sprite->data[0] > 50)\n    {\n        sprite->callback = SpriteCB_Egg_4;\n        sprite->data[0] = 0;\n    }\n}\n\nstatic void SpriteCB_Egg_4(struct Sprite* sprite)\n{\n    s32 i;\n    if (sprite->data[0] == 0)\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 0x10, 0xFFFF);\n    if (sprite->data[0] < 4u)\n    {\n        for (i = 0; i <= 3; i++)\n            CreateRandomEggShardSprite();\n    }\n    sprite->data[0]++;\n    if (!gPaletteFade.active)\n    {\n        PlaySE(SE_EGG_HATCH);\n        sprite->invisible = TRUE;\n        sprite->callback = SpriteCB_Egg_5;\n        sprite->data[0] = 0;\n    }\n}\n\nstatic void SpriteCB_Egg_5(struct Sprite* sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        gSprites[sEggHatchData->pokeSpriteID].invisible = FALSE;\n        StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], 1);\n    }\n    if (sprite->data[0] == 8)\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 0x10, 0, 0xFFFF);\n    if (sprite->data[0] <= 9)\n        gSprites[sEggHatchData->pokeSpriteID].y -= 1;\n    if (sprite->data[0] > 40)\n        sprite->callback = SpriteCallbackDummy;\n    sprite->data[0]++;\n}\n\nstatic void SpriteCB_EggShard(struct Sprite* sprite)\n{\n    sprite->data[4] += sprite->data[1];\n    sprite->data[5] += sprite->data[2];\n\n    sprite->x2 = sprite->data[4] / 256;\n    sprite->y2 = sprite->data[5] / 256;\n\n    sprite->data[2] += sprite->data[3];\n\n    if (sprite->y + sprite->y2 > sprite->y + 20 && sprite->data[2] > 0)\n        DestroySprite(sprite);\n}\n\nstatic void CreateRandomEggShardSprite(void)\n{\n    u16 spriteAnimIndex;\n\n    s16 velocity1 = sEggShardVelocities[sEggHatchData->eggShardVelocityID][0];\n    s16 velocity2 = sEggShardVelocities[sEggHatchData->eggShardVelocityID][1];\n    sEggHatchData->eggShardVelocityID++;\n    spriteAnimIndex = Random() % 4;\n    CreateEggShardSprite(120, 60, velocity1, velocity2, 100, spriteAnimIndex);\n}\n\nstatic void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex)\n{\n    u8 spriteID = CreateSprite(&sSpriteTemplate_EggShard, x, y, 4);\n    gSprites[spriteID].data[1] = data1;\n    gSprites[spriteID].data[2] = data2;\n    gSprites[spriteID].data[3] = data3;\n    StartSpriteAnim(&gSprites[spriteID], spriteAnimIndex);\n}\n\nstatic void EggHatchPrintMessage(u8 windowId, u8 *string, u8 x, u8 y, u8 speed)\n{\n    FillWindowPixelBuffer(windowId, 0xFF);\n    sEggHatchData->textColor[0] = 0;\n    sEggHatchData->textColor[1] = 5;\n    sEggHatchData->textColor[2] = 6;\n    AddTextPrinterParameterized4(windowId, FONT_NORMAL_COPY_2, x, y, 1, 1, sEggHatchData->textColor, speed, string);\n}\n\n//Magma Armor/Flame Body ability\nstatic u8 GetEggCyclesToSubtract(void)\n{\n    u8 count, i;\n    for (count = CalculatePlayerPartyCount(), i = 0; i < count; i++)\n    {\n        if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_EGG))\n        {\n            u8 ability = GetMonAbility(&gPlayerParty[i]);\n            if (ability == ABILITY_MAGMA_ARMOR || ability == ABILITY_FLAME_BODY)\n                return 2;\n        }\n    }\n    return 1;\n}\n\nvoid CheckDaycareMonsHaveMail(void)\n{\n    if (gSaveBlock1Ptr->route5DayCareMon.mail.message.itemId)\n    {\n        if(gMapHeader.regionMapSectionId == MAPSEC_ROUTE_5)\n        {\n            gSpecialVar_Result = TRUE; //setting Route 5\n            return;\n        }\n    }\n    switch(gSpecialVar_0x8004)\n    {\n        case 0:\n            if (gSaveBlock1Ptr->daycare.mons[0].mail.message.itemId)\n            {\n                gSpecialVar_Result = TRUE; //setting Four Island mon 0\n                return;\n            }\n            break;\n        case 1:\n            if (gSaveBlock1Ptr->daycare.mons[1].mail.message.itemId)\n            {\n                gSpecialVar_Result = TRUE; //setting Four Island mon 1\n                return;\n            }\n            break;\n    }\n}\n\nvoid IsPartyAndBoxesFull(void)\n{\n    gSpecialVar_Result = IsPlayerPartyAndPokemonStorageFull();\n}\n"
  },
  {
    "path": "src/decompress.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"pokemon.h\"\n\nextern const struct CompressedSpriteSheet gMonFrontPicTable[];\nextern const struct CompressedSpriteSheet gMonBackPicTable[];\n\nstatic void DuplicateDeoxysTiles(void *pointer, s32 species);\n\nvoid LZDecompressWram(const void *src, void *dest)\n{\n    LZ77UnCompWram(src, dest);\n}\n\nvoid LZDecompressVram(const void *src, void *dest)\n{\n    LZ77UnCompVram(src, dest);\n}\n\nu16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src)\n{\n    struct SpriteSheet dest;\n\n    LZ77UnCompWram(src->data, gDecompressionBuffer);\n    dest.data = gDecompressionBuffer;\n    dest.size = src->size;\n    dest.tag = src->tag;\n    return LoadSpriteSheet(&dest);\n}\n\nvoid LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer)\n{\n    struct SpriteSheet dest;\n\n    LZ77UnCompWram(src->data, buffer);\n    dest.data = buffer;\n    dest.size = src->size;\n    dest.tag = src->tag;\n    LoadSpriteSheet(&dest);\n}\n\nvoid LoadCompressedSpritePalette(const struct CompressedSpritePalette *src)\n{\n    struct SpritePalette dest;\n\n    LZ77UnCompWram(src->data, gDecompressionBuffer);\n    dest.data = (void *) gDecompressionBuffer;\n    dest.tag = src->tag;\n    LoadSpritePalette(&dest);\n}\n\nvoid LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer)\n{\n    struct SpritePalette dest;\n\n    LZ77UnCompWram(a->data, buffer);\n    dest.data = buffer;\n    dest.tag = a->tag;\n    LoadSpritePalette(&dest);\n}\n\nvoid DecompressPicFromTable(const struct CompressedSpriteSheet *src, void *buffer, s32 species)\n{\n    if (species > NUM_SPECIES)\n        LZ77UnCompWram(gMonFrontPicTable[0].data, buffer);\n    else\n        LZ77UnCompWram(src->data, buffer);\n    DuplicateDeoxysTiles(buffer, species);\n}\n\nvoid HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality)\n{\n    bool8 isFrontPic;\n\n    if (src == &gMonFrontPicTable[species])\n        isFrontPic = TRUE; // frontPic\n    else\n        isFrontPic = FALSE; // backPic\n    LoadSpecialPokePic(src, dest, species, personality, isFrontPic);\n}\n\nvoid LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic)\n{\n    if (species == SPECIES_UNOWN)\n    {\n        u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C;\n\n        // The other Unowns are separate from Unown A.\n        if (i == 0)\n            i = SPECIES_UNOWN;\n        else\n            i += SPECIES_UNOWN_B - 1;\n        if (!isFrontPic)\n            LZ77UnCompWram(gMonBackPicTable[i].data, dest);\n        else\n            LZ77UnCompWram(gMonFrontPicTable[i].data, dest);\n    }\n    else if(species == SPECIES_DEOXYS || (species >= 65530 && species <= 65533))\n    {\n        if (!isFrontPic)\n            LZ77UnCompWram(gMonBackPicTable[SPECIES_DEOXYS].data, dest);\n        else\n            LZ77UnCompWram(gMonFrontPicTable[SPECIES_DEOXYS].data, dest);\n\n        if(!(species >= 65530 && species <= 65533))\n        {\n            switch(personality) //pid was hijacked to hold Deoxys forms\n            {   //setting result to arbitrarily high numbers\n                //picked highest ones to not interfere with\n                //Pokemon expansion.\n                case 1: //Attack Forme\n                    species = 65531;\n                    break;\n                case 2:\n                    species = 65532;\n                    break;\n                case 3:\n                    species = 65533;\n                    break;\n                default: //Normal Forme\n                    species = 65530;\n            }\n        }\n    }\n    else if (species > NUM_SPECIES) // is species unknown? draw the ? icon\n        LZ77UnCompWram(gMonFrontPicTable[0].data, dest);\n    else\n        LZ77UnCompWram(src->data, dest);\n\n    DuplicateDeoxysTiles(dest, species);\n    DrawSpindaSpots(species, personality, dest, isFrontPic);\n}\n\nstatic void DuplicateDeoxysTiles(void *pointer, s32 species)\n{\n    u8 skipImage;\n    switch(species)\n    {\n        case 65531: //Attack\n            skipImage = 1;\n            break;\n        case 65532: //Defense\n            skipImage = 2;\n            break;\n        case 65533: //Speed\n            skipImage = 3;\n            break;\n        default: //Normal and all other Pokemon\n            skipImage = 0;\n            break;\n\n    }\n    CpuCopy32(pointer + (0x800 * skipImage), pointer, 0x800);\n}\n\nstatic void Unused_LZDecompressWramIndirect(const void **src, void *dest)\n{\n    LZ77UnCompWram(*src, dest);\n}\n\nstatic void StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u8 *src_tiles, u8 *dest_tiles)\n{\n    /*\n      This function appears to emulate behaviour found in the GB(C) versions regarding how the Pokemon images\n      are stitched together to be displayed on the battle screen.\n      Given \"compacted\" tiles, an object count and a bounding box/object size, place the tiles in such a way\n      that the result will have each object centered in a 8x8 tile canvas.\n    */\n    s32 i, j, k, l;\n    u8 *src = src_tiles, *dest = dest_tiles;\n    u8 bottom_off;\n\n    if (object_size & 1)\n    {\n        // Object size is odd\n        bottom_off = (object_size >> 1) + 4;\n        for (l = 0; l < object_count; l++)\n        {\n            // Clear all unused rows of tiles plus the half-tile required due to centering\n            for (j = 0; j < 8-object_size; j++)\n            {\n                for (k = 0; k < 8; k++)\n                {\n                    for (i = 0; i < 16; i++)\n                    {\n                        if (j % 2 == 0)\n                        {\n                            // Clear top half of top tile and bottom half of bottom tile when on even j\n                            ((dest+i) + (k << 5))[((j >> 1) << 8)] = 0;\n                            ((bottom_off << 8) + (dest+i) + (k << 5) + 16)[((j >> 1) << 8)] = 0;\n                        }\n                        else\n                        {\n                            // Clear bottom half of top tile and top half of tile following bottom tile when on odd j\n                            ((dest+i) + (k << 5) + 16)[((j >> 1) << 8)] = 0;\n                            ((bottom_off << 8) + (dest+i) + (k << 5) + 256)[((j >> 1) << 8)] = 0;\n                        }\n                    }\n                }\n            }\n\n            // Clear the columns to the left and right that wont be used completely\n            // Unlike the previous loops, this will clear the later used space as well\n            for (j = 0; j < 2; j++)\n            {\n                for (i = 0; i < 8; i++)\n                {\n                    for (k = 0; k < 32; k++)\n                    {\n                        // Left side\n                        ((dest+k) + (i << 8))[(j << 5)] = 0;\n                        // Right side\n                        ((dest+k) + (i << 8))[(j << 5)+192] = 0;\n                    }\n                }\n            }\n\n            // Skip the top row and first tile on the second row for objects of size 5\n            if (object_size == 5) dest += 0x120;\n\n            // Copy tile data\n            for (j = 0; j < object_size; j++)\n            {\n                for (k = 0; k < object_size; k++)\n                {\n                    for (i = 0; i < 4; i++)\n                    {\n                        // Offset the tile by +4px in both x and y directions\n                        (dest + (i << 2))[18] = (src + (i << 2))[0];\n                        (dest + (i << 2))[19] = (src + (i << 2))[1];\n                        (dest + (i << 2))[48] = (src + (i << 2))[2];\n                        (dest + (i << 2))[49] = (src + (i << 2))[3];\n\n                        (dest + (i << 2))[258] = (src + (i << 2))[16];\n                        (dest + (i << 2))[259] = (src + (i << 2))[17];\n                        (dest + (i << 2))[288] = (src + (i << 2))[18];\n                        (dest + (i << 2))[289] = (src + (i << 2))[19];\n                    }\n                    src += 32;\n                    dest += 32;\n                }\n\n                // At the end of a row, skip enough tiles to get to the beginning of the next row\n                if (object_size == 7) dest += 0x20;\n                else if (object_size == 5) dest += 0x60;\n            }\n\n            // Skip remaining unused space to go to the beginning of the next object\n            if (object_size == 7) dest += 0x100;\n            else if (object_size == 5) dest += 0x1e0;\n        }\n    }\n    else\n    {\n        // Object size is even\n        for (i = 0; i < object_count; i++)\n        {\n            // For objects of size 6, the first and last row and column will be cleared\n            // While the remaining space will be filled with actual data\n            if (object_size == 6)\n            {\n                for (k = 0; k < 256; k++) {\n                    *dest = 0;\n                    dest++;\n                }\n            }\n\n            for (j = 0; j < object_size; j++)\n            {\n                if (object_size == 6)\n                {\n                    for (k = 0; k < 32; k++) {\n                        *dest = 0;\n                        dest++;\n                    }\n                }\n\n                // Copy tile data\n                for (k = 0; k < 32 * object_size; k++) {\n                    *dest = *src;\n                    src++;\n                    dest++;\n                }\n\n                if (object_size == 6)\n                {\n                    for (k = 0; k < 32; k++) {\n                        *dest = 0;\n                        dest++;\n                    }\n                }\n            }\n\n            if (object_size == 6)\n            {\n                for (k = 0; k < 256; k++) {\n                    *dest = 0;\n                    dest++;\n                }\n            }\n        }\n    }\n}\n\nbool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet* src)\n{\n    struct SpriteSheet dest;\n    void *buffer;\n\n    buffer = AllocZeroed(*((u32 *)src->data) >> 8);\n    if (!buffer)\n        return TRUE;\n    LZ77UnCompWram(src->data, buffer);\n    dest.data = buffer;\n    dest.size = src->size;\n    dest.tag = src->tag;\n    LoadSpriteSheet(&dest);\n    Free(buffer);\n    return FALSE;\n}\n\nbool8 LoadCompressedSpritePaletteUsingHeap(const struct CompressedSpritePalette *src)\n{\n    struct SpritePalette dest;\n    void *buffer;\n\n    buffer = AllocZeroed(*((u32 *)src->data) >> 8);\n    if (!buffer)\n        return TRUE;\n    LZ77UnCompWram(src->data, buffer);\n    dest.data = buffer;\n    dest.tag = src->tag;\n    LoadSpritePalette(&dest);\n    Free(buffer);\n    return FALSE;\n}\n\nu32 GetDecompressedDataSize(const u8 *ptr)\n{\n    u32 ptr32[1];\n    u8 *ptr8 = (u8 *)ptr32;\n\n    ptr8[0] = ptr[1];\n    ptr8[1] = ptr[2];\n    ptr8[2] = ptr[3];\n    ptr8[3] = 0;\n    return ptr32[0];\n}\n\nvoid DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *buffer, s32 species)\n{\n    if (species > NUM_SPECIES)\n        LZ77UnCompWram(gMonFrontPicTable[0].data, buffer);\n    else\n        LZ77UnCompWram(src->data, buffer);\n}\n\nvoid HandleLoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality)\n{\n    bool8 isFrontPic;\n\n    if (src == &gMonFrontPicTable[species])\n        isFrontPic = TRUE; // frontPic\n    else\n        isFrontPic = FALSE; // backPic\n    LoadSpecialPokePic_DontHandleDeoxys(src, dest, species, personality, isFrontPic);\n}\n\nvoid LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic)\n{\n    if (species == SPECIES_UNOWN)\n    {\n        u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C;\n\n        // The other Unowns are separate from Unown A.\n        if (i == 0)\n            i = SPECIES_UNOWN;\n        else\n            i += SPECIES_UNOWN_B - 1;\n        if (!isFrontPic)\n            LZ77UnCompWram(gMonBackPicTable[i].data, dest);\n        else\n            LZ77UnCompWram(gMonFrontPicTable[i].data, dest);\n    }\n    else if (species > NUM_SPECIES) // is species unknown? draw the ? icon\n    {\n        LZ77UnCompWram(gMonFrontPicTable[0].data, dest);\n    }\n    else\n    {\n        LZ77UnCompWram(src->data, dest);\n    }\n    DrawSpindaSpots(species, personality, dest, isFrontPic);\n}\n"
  },
  {
    "path": "src/decoration.c",
    "content": "#include \"global.h\"\n#include \"decoration.h\"\n#include \"constants/decorations.h\"\n\n#include \"data/decoration/tiles.h\"\n#include \"data/decoration/description.h\"\n#include \"data/decoration/header.h\"\n"
  },
  {
    "path": "src/digit_obj_util.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"digit_obj_util.h\"\n\nstruct DigitPrinterAlloc\n{\n    u32 count;\n    struct DigitPrinter\n    {\n        bool8 isActive;\n        u8 firstOamId;\n        u8 strConvMode;\n        u8 oamCount;\n        u8 palTagIndex;\n        u8 size;\n        u8 shape;\n        u8 priority;\n        u8 xDelta;\n        u8 tilesPerImage;\n        u16 tileStart;\n        s16 x;\n        s16 y;\n        u16 tileTag;\n        u16 palTag;\n        u32 pow10;\n        s32 lastPrinted;\n    } *array;\n};\n\n// this file's functions\nstatic u8 GetFirstOamId(u8 oamCount);\nstatic void CopyWorkToOam(struct DigitPrinter *objWork);\nstatic void DrawNumObjsLeadingZeros(struct DigitPrinter *objWork, s32 num, bool32 sign);\nstatic void DrawNumObjsMinusInFront(struct DigitPrinter *objWork, s32 num, bool32 sign);\nstatic void DrawNumObjsMinusInBack(struct DigitPrinter *objWork, s32 num, bool32 sign);\nstatic bool32 SharesTileWithAnyActive(u32 id);\nstatic bool32 SharesPalWithAnyActive(u32 id);\nstatic u8 GetTilesPerImage(u32 shape, u32 size);\n\n// ewram\nstatic EWRAM_DATA struct DigitPrinterAlloc *sOamWork = {0};\n\n// const rom data\nstatic const u8 sTilesPerImage[4][4] =\n{\n    [ST_OAM_SQUARE]      = {\n        [ST_OAM_SIZE_0] = 0x01, // SPRITE_SIZE_8x8\n        [ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_16x16\n        [ST_OAM_SIZE_2] = 0x10, // SPRITE_SIZE_32x32\n        [ST_OAM_SIZE_3] = 0x40  // SPRITE_SIZE_64x64\n    },\n    [ST_OAM_H_RECTANGLE] = {\n        [ST_OAM_SIZE_0] = 0x02, // SPRITE_SIZE_16x8\n        [ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_32x8\n        [ST_OAM_SIZE_2] = 0x08, // SPRITE_SIZE_32x16\n        [ST_OAM_SIZE_3] = 0x20  // SPRITE_SIZE_64x32\n    },\n    [ST_OAM_V_RECTANGLE] = {\n        [ST_OAM_SIZE_0] = 0x02, // SPRITE_SIZE_8x16\n        [ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_8x32\n        [ST_OAM_SIZE_2] = 0x08, // SPRITE_SIZE_16x32\n        [ST_OAM_SIZE_3] = 0x20  // SPRITE_SIZE_32x64\n    }\n};\n\nconst u16 gMinigameDigits_Pal[] = INCBIN_U16(\"graphics/misc/minigame_digits.gbapal\");\nconst u32 gMinigameDigits_Gfx[] = INCBIN_U32(\"graphics/misc/minigame_digits.4bpp.lz\");\nstatic const u32 sUnusedMinigameDigits_Gfx[] = INCBIN_U32(\"graphics/misc/minigame_digits_unused.4bpp.lz\");\n\n// code\nbool32 DigitObjUtil_Init(u32 count)\n{\n    u32 i;\n\n    if (sOamWork != NULL)\n        DigitObjUtil_Free();\n\n    sOamWork = Alloc(sizeof(*sOamWork));\n    if (sOamWork == NULL)\n        return FALSE;\n\n    sOamWork->array = Alloc(sizeof(struct DigitPrinter) * count);\n    if (sOamWork->array == NULL)\n    {\n        Free(sOamWork);\n        return FALSE;\n    }\n\n    sOamWork->count = count;\n    for (i = 0; i < count; i++)\n    {\n        sOamWork->array[i].isActive = FALSE;\n        sOamWork->array[i].firstOamId = 0xFF;\n    }\n\n    return TRUE;\n}\n\nvoid DigitObjUtil_Free(void)\n{\n    if (sOamWork != NULL)\n    {\n        if (sOamWork->array != NULL)\n        {\n            u32 i;\n\n            for (i = 0; i < sOamWork->count; i++)\n                DigitObjUtil_DeletePrinter(i);\n\n            Free(sOamWork->array);\n        }\n\n        FREE_AND_SET_NULL(sOamWork);\n    }\n}\n\nbool32 DigitObjUtil_CreatePrinter(u32 id, s32 num, const struct DigitObjUtilTemplate *template)\n{\n    u32 i;\n\n    if (sOamWork == NULL)\n        return FALSE;\n    if (sOamWork->array[id].isActive)\n        return FALSE;\n\n    sOamWork->array[id].firstOamId = GetFirstOamId(template->oamCount);\n    if (sOamWork->array[id].firstOamId == 0xFF)\n        return FALSE;\n\n    sOamWork->array[id].tileStart = GetSpriteTileStartByTag(template->spriteSheet.uncompressed->tag);\n    if (sOamWork->array[id].tileStart == 0xFFFF)\n    {\n        if (template->spriteSheet.uncompressed->size != 0)\n        {\n            sOamWork->array[id].tileStart = LoadSpriteSheet(template->spriteSheet.uncompressed);\n        }\n        else\n        {\n            struct CompressedSpriteSheet compObjectPic;\n\n            compObjectPic = *template->spriteSheet.compressed;\n            compObjectPic.size = GetDecompressedDataSize((const void *)template->spriteSheet.compressed->data);\n            sOamWork->array[id].tileStart = LoadCompressedSpriteSheet(&compObjectPic);\n        }\n\n        if (sOamWork->array[id].tileStart == 0xFFFF)\n            return FALSE;\n    }\n\n    sOamWork->array[id].palTagIndex = IndexOfSpritePaletteTag(template->spritePal->tag);\n    if (sOamWork->array[id].palTagIndex == 0xFF)\n        sOamWork->array[id].palTagIndex = LoadSpritePalette(template->spritePal);\n\n    sOamWork->array[id].strConvMode = template->strConvMode;\n    sOamWork->array[id].oamCount = template->oamCount;\n    sOamWork->array[id].x = template->x;\n    sOamWork->array[id].y = template->y;\n    sOamWork->array[id].shape = template->shape;\n    sOamWork->array[id].size = template->size;\n    sOamWork->array[id].priority = template->priority;\n    sOamWork->array[id].xDelta = template->xDelta;\n    sOamWork->array[id].tilesPerImage = GetTilesPerImage(template->shape, template->size);\n    sOamWork->array[id].tileTag = template->spriteSheet.uncompressed->tag;\n    sOamWork->array[id].palTag = template->spritePal->tag;\n    sOamWork->array[id].isActive = TRUE;\n\n    // Decimal left shift\n    sOamWork->array[id].pow10 = 1;\n    for (i = 1; i < template->oamCount; i++)\n        sOamWork->array[id].pow10 *= 10;\n\n    CopyWorkToOam(&sOamWork->array[id]);\n    DigitObjUtil_PrintNumOn(id, num);\n\n    return TRUE;\n}\n\nstatic void CopyWorkToOam(struct DigitPrinter *objWork)\n{\n    u32 i;\n    u32 oamId = objWork->firstOamId;\n    u32 x = objWork->x;\n    u32 oamCount = objWork->oamCount + 1;\n\n    CpuFill16(0, &gMain.oamBuffer[oamId], sizeof(struct OamData) * oamCount);\n    for (i = 0, oamId = objWork->firstOamId; i < oamCount; i++, oamId++)\n    {\n        gMain.oamBuffer[oamId].y = objWork->y;\n        gMain.oamBuffer[oamId].x = x;\n        gMain.oamBuffer[oamId].shape = objWork->shape;\n        gMain.oamBuffer[oamId].size = objWork->size;\n        gMain.oamBuffer[oamId].tileNum = objWork->tileStart;\n        gMain.oamBuffer[oamId].priority = objWork->priority;\n        gMain.oamBuffer[oamId].paletteNum = objWork->palTagIndex;\n\n        x += objWork->xDelta;\n    }\n\n    oamId--;\n    gMain.oamBuffer[oamId].x = objWork->x - objWork->xDelta;\n    gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;\n    gMain.oamBuffer[oamId].tileNum = objWork->tileStart + (objWork->tilesPerImage * 10);\n}\n\nvoid DigitObjUtil_PrintNumOn(u32 id, s32 num)\n{\n    bool32 sign;\n\n    if (sOamWork == NULL)\n        return;\n    if (!sOamWork->array[id].isActive)\n        return;\n\n    sOamWork->array[id].lastPrinted = num;\n    if (num < 0)\n    {\n        sign = TRUE;\n        num *= -1;\n    }\n    else\n    {\n        sign = FALSE;\n    }\n\n    switch (sOamWork->array[id].strConvMode)\n    {\n    case 0:\n    default:\n        DrawNumObjsLeadingZeros(&sOamWork->array[id], num, sign);\n        break;\n    case 1:\n        DrawNumObjsMinusInFront(&sOamWork->array[id], num, sign);\n        break;\n    case 2:\n        DrawNumObjsMinusInBack(&sOamWork->array[id], num, sign);\n        break;\n    }\n}\n\nstatic void DrawNumObjsLeadingZeros(struct DigitPrinter *objWork, s32 num, bool32 sign)\n{\n    u32 pow10 = objWork->pow10;\n    u32 oamId = objWork->firstOamId;\n\n    while (pow10 != 0)\n    {\n        u32 digit = num / pow10;\n        num -= (digit * pow10);\n        pow10 /= 10;\n\n        gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart;\n        oamId++;\n    }\n\n    if (sign)\n        gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;\n    else\n        gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;\n}\n\nstatic void DrawNumObjsMinusInFront(struct DigitPrinter *objWork, s32 num, bool32 sign)\n{\n    u32 pow10 = objWork->pow10;\n    static int oamId;\n    static int curDigit;\n    static int firstDigit;\n\n    oamId = objWork->firstOamId;\n    curDigit = 0;\n    firstDigit = -1;\n\n    while (pow10 != 0)\n    {\n        u32 digit = num / pow10;\n        num -= (digit * pow10);\n        pow10 /= 10;\n\n        if (digit != 0 || firstDigit != -1 || pow10 == 0)\n        {\n            gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart;\n            gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;\n\n            if (firstDigit == -1)\n                firstDigit = curDigit;\n        }\n        else\n        {\n            gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;\n        }\n\n        oamId++;\n        curDigit++;\n    }\n\n    if (sign)\n    {\n        gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;\n        gMain.oamBuffer[oamId].x = objWork->x + ((firstDigit - 1) * objWork->xDelta);\n    }\n    else\n    {\n        gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;\n    }\n}\n\nstatic void DrawNumObjsMinusInBack(struct DigitPrinter *objWork, s32 num, bool32 sign)\n{\n    u32 pow10 = objWork->pow10;\n    u32 oamId = objWork->firstOamId;\n    u32 printingDigits = 0;\n    s32 nsprites = 0;\n\n    while (pow10 != 0)\n    {\n        u32 digit = num / pow10;\n        num -= (digit * pow10);\n        pow10 /= 10;\n\n        if (digit != 0 || printingDigits != 0 || pow10 == 0)\n        {\n            printingDigits = 1;\n            gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart;\n            gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;\n\n            oamId++;\n            nsprites++;\n        }\n    }\n\n    while (nsprites < objWork->oamCount)\n    {\n        gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;\n        oamId++;\n        nsprites++;\n    }\n\n    if (sign)\n        gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;\n    else\n        gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;\n}\n\nvoid DigitObjUtil_DeletePrinter(u32 id)\n{\n    s32 oamId, oamCount, i;\n\n    if (sOamWork == NULL)\n        return;\n    if (!sOamWork->array[id].isActive)\n        return;\n\n    oamCount = sOamWork->array[id].oamCount + 1;\n    oamId = sOamWork->array[id].firstOamId;\n\n    for (i = 0; i < oamCount; i++, oamId++)\n        gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;\n\n    if (!SharesTileWithAnyActive(id))\n        FreeSpriteTilesByTag(sOamWork->array[id].tileTag);\n    if (!SharesPalWithAnyActive(id))\n        FreeSpritePaletteByTag(sOamWork->array[id].palTag);\n\n    sOamWork->array[id].isActive = FALSE;\n}\n\nvoid DigitObjUtil_HideOrShow(u32 id, bool32 hide)\n{\n    s32 oamId, oamCount, i;\n\n    if (sOamWork == NULL)\n        return;\n    if (!sOamWork->array[id].isActive)\n        return;\n\n    oamCount = sOamWork->array[id].oamCount + 1;\n    oamId = sOamWork->array[id].firstOamId;\n    if (hide)\n    {\n        for (i = 0; i < oamCount; i++, oamId++)\n            gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;\n    }\n    else\n    {\n        for (i = 0; i < oamCount; i++, oamId++)\n            gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;\n\n        DigitObjUtil_PrintNumOn(id, sOamWork->array[id].lastPrinted);\n    }\n}\n\nstatic u8 GetFirstOamId(u8 oamCount)\n{\n    u32 i;\n    u16 firstOamId = 64;\n\n    for (i = 0; i < sOamWork->count; i++)\n    {\n        if (!sOamWork->array[i].isActive)\n        {\n            if (sOamWork->array[i].firstOamId != 0xFF && sOamWork->array[i].oamCount <= oamCount)\n                return sOamWork->array[i].firstOamId;\n        }\n        else\n        {\n            firstOamId += 1 + sOamWork->array[i].oamCount;\n        }\n    }\n\n    if (firstOamId + oamCount + 1 > 128)\n        return 0xFF;\n    else\n        return firstOamId;\n}\n\nstatic bool32 SharesTileWithAnyActive(u32 id)\n{\n    u32 i;\n\n    for (i = 0; i < sOamWork->count; i++)\n    {\n        if (sOamWork->array[i].isActive && i != id\n            && sOamWork->array[i].tileTag == sOamWork->array[id].tileTag)\n        {\n            return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nstatic bool32 SharesPalWithAnyActive(u32 id)\n{\n    u32 i;\n\n    for (i = 0; i < sOamWork->count; i++)\n    {\n        if (sOamWork->array[i].isActive && i != id\n            && sOamWork->array[i].palTag == sOamWork->array[id].palTag)\n        {\n            return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nstatic u8 GetTilesPerImage(u32 shape, u32 size)\n{\n    return sTilesPerImage[shape][size];\n}\n"
  },
  {
    "path": "src/diploma.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"pokedex.h\"\n#include \"scanline_effect.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"constants/sound.h\"\n\nstruct Diploma\n{\n    u8 mainState;\n    u8 gfxState;\n    u8 initState;\n    u16 tilemapBuffer[0x800];\n};\n\nenum {\n    WIN_TEXT,\n    WIN_COUNT\n};\n\nenum {\n    BG_TEXT,\n    BG_DIPLOMA,\n};\n\nstatic EWRAM_DATA struct Diploma *sDiploma = NULL;\n\nstatic void DiplomaReset(void);\nstatic void DiplomaPrintText(void);\nstatic bool8 DiplomaLoadGfx(void);\nstatic void DiplomaInitScreen(void);\nstatic void CB2_Diploma(void);\nstatic void Task_HandleDiplomaInput(u8);\nstatic void Task_DiplomaInit(u8);\nstatic void Task_DiplomaExit(u8);\n\nstatic const u32 sDiplomaGfx[] = INCBIN_U32(\"graphics/diploma/diploma.4bpp.lz\");\nstatic const u32 sDiplomaTilemap[] = INCBIN_U32(\"graphics/diploma/diploma.bin.lz\");\nstatic const u16 sDiplomaPal[] = INCBIN_U16(\"graphics/diploma/diploma.gbapal\");\n\nstatic const u8 sText_Empty[] = _(\"{COLOR DARK_GRAY}{HIGHLIGHT TRANSPARENT}\");\n\nstatic const ALIGNED(4) u8 sTextColors[3] = {0, 2, 3};\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = BG_TEXT,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 1,\n    }, {\n        .bg = BG_DIPLOMA,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 29,\n        .screenSize = 1,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0,\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates[WIN_COUNT + 1] = {\n    [WIN_TEXT] = {\n        .bg = BG_TEXT,\n        .tilemapLeft = 0,\n        .tilemapTop = 2,\n        .width = 29,\n        .height = 16,\n        .paletteNum = 15,\n        .baseBlock = 0x000\n    },\n    [WIN_COUNT] = DUMMY_WIN_TEMPLATE\n};\n\nstatic void VBlankCB_Diploma(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid CB2_ShowDiploma(void)\n{\n    sDiploma = AllocZeroed(sizeof(*sDiploma));\n    sDiploma->mainState = 0;\n    sDiploma->gfxState = 0;\n    sDiploma->initState = 0;\n    DiplomaReset();\n    CreateTask(Task_DiplomaInit, 0);\n    SetMainCallback2(CB2_Diploma);\n}\n\nstatic void CB2_Diploma(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void Task_DiplomaInit(u8 taskId)\n{\n    switch (sDiploma->initState)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        break;\n    case 1:\n        DiplomaInitScreen();\n        break;\n    case 2:\n        if (!DiplomaLoadGfx())\n            return;\n        break;\n    case 3:\n        CopyToBgTilemapBuffer(BG_DIPLOMA, sDiplomaTilemap, 0, 0);\n        break;\n    case 4:\n        if (HasAllMonsNew())\n            SetGpuReg(REG_OFFSET_BG1HOFS, 0x100);\n        else\n            SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n        break;\n    case 5:\n        DiplomaPrintText();\n        break;\n    case 6:\n        CopyBgTilemapBufferToVram(BG_TEXT);\n        CopyBgTilemapBufferToVram(BG_DIPLOMA);\n        break;\n    case 7:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        break;\n    case 8:\n        SetVBlankCallback(VBlankCB_Diploma);\n        break;\n    default:\n        if (gPaletteFade.active)\n            break;\n        PlayFanfareByFanfareNum(FANFARE_OBTAIN_BADGE);\n        gTasks[taskId].func = Task_HandleDiplomaInput;\n    }\n    sDiploma->initState++;\n}\n\nstatic void Task_HandleDiplomaInput(u8 taskId)\n{\n    switch (sDiploma->mainState)\n    {\n    case 0:\n        if (WaitFanfare(FALSE))\n            sDiploma->mainState++;\n        break;\n    case 1:\n        if (JOY_NEW(A_BUTTON))\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            sDiploma->mainState++;\n        }\n        break;\n    case 2:\n        Task_DiplomaExit(taskId);\n        break;\n    }\n}\n\nstatic void Task_DiplomaExit(u8 taskId)\n{\n    if (gPaletteFade.active)\n        return;\n    DestroyTask(taskId);\n    FreeAllWindowBuffers();\n    FREE_AND_SET_NULL(sDiploma);\n    SetMainCallback2(CB2_ReturnToFieldFromDiploma);\n}\n\nstatic void DiplomaReset(void)\n{\n    ResetSpriteData();\n    ResetPaletteFade();\n    FreeAllSpritePalettes();\n    ResetTasks();\n    ScanlineEffect_Stop();\n}\n\nstatic void DiplomaInitScreen(void)\n{\n    void *vram = (void *)VRAM;\n    DmaClearLarge16(3, vram, VRAM_SIZE, 0x1000);\n    DmaClear32(3, (void *)OAM, OAM_SIZE);\n    DmaClear16(3, (void *)PLTT, PLTT_SIZE);\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    ResetBgsAndClearDma3BusyFlags(0);\n    InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));\n    ChangeBgX(0, 0, BG_COORD_SET);\n    ChangeBgY(0, 0, BG_COORD_SET);\n    ChangeBgX(1, 0, BG_COORD_SET);\n    ChangeBgY(1, 0, BG_COORD_SET);\n    ChangeBgX(2, 0, BG_COORD_SET);\n    ChangeBgY(2, 0, BG_COORD_SET);\n    ChangeBgX(3, 0, BG_COORD_SET);\n    ChangeBgY(3, 0, BG_COORD_SET);\n    InitWindows(sWindowTemplates);\n    DeactivateAllTextPrinters();\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n    SetBgTilemapBuffer(BG_DIPLOMA, sDiploma->tilemapBuffer);\n    ShowBg(BG_TEXT);\n    ShowBg(BG_DIPLOMA);\n    FillBgTilemapBufferRect_Palette0(BG_TEXT, 0, 0, 0, 30, 20);\n    FillBgTilemapBufferRect_Palette0(BG_DIPLOMA, 0, 0, 0, 30, 20);\n}\n\nstatic bool8 DiplomaLoadGfx(void)\n{\n    switch (sDiploma->gfxState)\n    {\n    case 0:\n        ResetTempTileDataBuffers();\n        break;\n    case 1:\n        DecompressAndCopyTileDataToVram(BG_DIPLOMA, sDiplomaGfx, 0, 0, 0);\n        break;\n    case 2:\n        if (FreeTempTileDataBuffersIfPossible() == TRUE)\n            return FALSE;\n        break;\n    case 3:\n        LoadPalette(sDiplomaPal, BG_PLTT_ID(0), sizeof(sDiplomaPal));\n        // fallthrough\n    default:\n        // Finished\n        return TRUE;\n    }\n    sDiploma->gfxState++;\n    return FALSE;\n}\n\nstatic void DiplomaPrintText(void)\n{\n    u8 str[160];\n    u32 width;\n    DynamicPlaceholderTextUtil_Reset();\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);\n    if (HasAllMonsNew())\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gText_Diploma_National);\n    else\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gText_Diploma_Kanto);\n    FillWindowPixelBuffer(WIN_TEXT, PIXEL_FILL(0));\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(str, gText_Diploma_Player);\n    width = GetStringWidth(FONT_NORMAL, str, -1);\n    AddTextPrinterParameterized3(WIN_TEXT, FONT_NORMAL, 120 - (width / 2), 4, sTextColors, TEXT_SKIP_DRAW, str);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(str, gText_Diploma_ThisDocument);\n    width = GetStringWidth(FONT_NORMAL, str, -1);\n    AddTextPrinterParameterized3(WIN_TEXT, FONT_NORMAL, 120 - (width / 2), 30, sTextColors, TEXT_SKIP_DRAW, str);\n    AddTextPrinterParameterized3(WIN_TEXT, FONT_NORMAL, 120, 105, sTextColors, 0, gText_Diploma_GameFreak);\n    PutWindowTilemap(WIN_TEXT);\n}\n"
  },
  {
    "path": "src/dma3_manager.c",
    "content": "#include \"global.h\"\n#include \"dma3.h\"\n\n#define MAX_DMA_REQUESTS 128\n\nstatic struct {\n    /* 0x00 */ const u8 *src;\n    /* 0x04 */ u8 *dest;\n    /* 0x08 */ u16 size;\n    /* 0x0A */ u16 mode;\n    /* 0x0C */ u32 value;\n} gDma3Requests[128];\n\nstatic volatile bool8 gDma3ManagerLocked;\nstatic u8 gDma3RequestCursor;\n\nvoid ClearDma3Requests(void)\n{\n    int i;\n\n    gDma3ManagerLocked = TRUE;\n    gDma3RequestCursor = 0;\n\n    for(i = 0; i < (u8)NELEMS(gDma3Requests); i++)\n    {\n        gDma3Requests[i].size = 0;\n        gDma3Requests[i].src = 0;\n        gDma3Requests[i].dest = 0;\n    }\n\n    gDma3ManagerLocked = FALSE;\n}\n\nvoid ProcessDma3Requests(void)\n{\n    u16 bytesTransferred;\n\n    if (gDma3ManagerLocked)\n        return;\n\n    bytesTransferred = 0;\n\n    // as long as there are DMA requests to process (unless size or vblank is an issue), do not exit\n    while (gDma3Requests[gDma3RequestCursor].size != 0)\n    {\n        bytesTransferred += gDma3Requests[gDma3RequestCursor].size;\n\n        if (bytesTransferred > 40 * 1024)\n            return; // don't transfer more than 40 KiB\n        if (*(u8 *)REG_ADDR_VCOUNT > 224)\n            return; // we're about to leave vblank, stop\n\n        switch (gDma3Requests[gDma3RequestCursor].mode)\n        {\n        case DMA_REQUEST_COPY32: // regular 32-bit copy\n            Dma3CopyLarge32_(gDma3Requests[gDma3RequestCursor].src,\n                             gDma3Requests[gDma3RequestCursor].dest,\n                             gDma3Requests[gDma3RequestCursor].size);\n            break;\n        case DMA_REQUEST_FILL32: // repeat a single 32-bit value across RAM\n            Dma3FillLarge32_(gDma3Requests[gDma3RequestCursor].value,\n                             gDma3Requests[gDma3RequestCursor].dest,\n                             gDma3Requests[gDma3RequestCursor].size);\n            break;\n        case DMA_REQUEST_COPY16:    // regular 16-bit copy\n            Dma3CopyLarge16_(gDma3Requests[gDma3RequestCursor].src,\n                             gDma3Requests[gDma3RequestCursor].dest,\n                             gDma3Requests[gDma3RequestCursor].size);\n            break;\n        case DMA_REQUEST_FILL16: // repeat a single 16-bit value across RAM\n            Dma3FillLarge16_(gDma3Requests[gDma3RequestCursor].value,\n                             gDma3Requests[gDma3RequestCursor].dest,\n                             gDma3Requests[gDma3RequestCursor].size);\n            break;\n        }\n\n        // Free the request\n        gDma3Requests[gDma3RequestCursor].src = NULL;\n        gDma3Requests[gDma3RequestCursor].dest = NULL;\n        gDma3Requests[gDma3RequestCursor].size = 0;\n        gDma3Requests[gDma3RequestCursor].mode = 0;\n        gDma3Requests[gDma3RequestCursor].value = 0;\n        gDma3RequestCursor++;\n\n        if (gDma3RequestCursor >= MAX_DMA_REQUESTS) // loop back to the first DMA request\n            gDma3RequestCursor = 0;\n    }\n}\n\ns16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)\n{\n    int cursor;\n    int var = 0;\n\n    gDma3ManagerLocked = 1;\n\n    cursor = gDma3RequestCursor;\n    while(1)\n    {\n        if(!gDma3Requests[cursor].size) // an empty copy was found and the current cursor will be returned.\n        {\n            gDma3Requests[cursor].src = src;\n            gDma3Requests[cursor].dest = dest;\n            gDma3Requests[cursor].size = size;\n\n            if(mode == DMA3_32BIT)\n                gDma3Requests[cursor].mode = DMA_REQUEST_COPY32;\n            else\n                gDma3Requests[cursor].mode = DMA_REQUEST_COPY16;\n\n            gDma3ManagerLocked = FALSE;\n            return (s16)cursor;\n        }\n        if(++cursor >= 0x80) // loop back to start.\n        {\n            cursor = 0;\n        }\n        if(++var >= 0x80) // max checks were made. all resulted in failure.\n        {\n            break;\n        }\n    }\n    gDma3ManagerLocked = FALSE;\n    return -1;\n}\n\ns16 RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)\n{\n    int cursor;\n    int var = 0;\n\n    cursor = gDma3RequestCursor;\n    gDma3ManagerLocked = 1;\n\n    while(1)\n    {\n        if(!gDma3Requests[cursor].size)\n        {\n            gDma3Requests[cursor].dest = dest;\n            gDma3Requests[cursor].size = size;\n            gDma3Requests[cursor].mode = mode;\n            gDma3Requests[cursor].value = value;\n\n            if(mode == DMA3_32BIT)\n                gDma3Requests[cursor].mode = DMA_REQUEST_FILL32;\n            else\n                gDma3Requests[cursor].mode = DMA_REQUEST_FILL16;\n\n            gDma3ManagerLocked = FALSE;\n            return (s16)cursor;\n        }\n        if(++cursor >= 0x80) // loop back to start.\n        {\n            cursor = 0;\n        }\n        if(++var >= 0x80) // max checks were made. all resulted in failure.\n        {\n            break;\n        }\n    }\n    gDma3ManagerLocked = FALSE;\n    return -1;\n}\n\ns16 WaitDma3Request(s16 index)\n{\n    int current = 0;\n\n    if (index == -1)\n    {\n        for (; current < 0x80; current ++)\n            if (gDma3Requests[current].size)\n                return -1;\n\n        return 0;\n    }\n\n    if (gDma3Requests[index].size)\n        return -1;\n\n    return 0;\n}\n"
  },
  {
    "path": "src/dodrio_berry_picking.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"dodrio_berry_picking.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"event_data.h\"\n#include \"item.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"m4a.h\"\n#include \"menu.h\"\n#include \"minigame_countdown.h\"\n#include \"new_menu_helpers.h\"\n#include \"random.h\"\n#include \"save.h\"\n#include \"script.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"text_window.h\"\n#include \"text_window_graphics.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n#include \"constants/items.h\"\n\n// Note that in this file 'Dodrio Berry Picking' is often\n// shortened to DodrioGame or just Game for convenience\n\n#define MAX_SCORE 999990\n#define MAX_BERRIES 9999\n\n// The minimum score needed to receive a prize\n#define PRIZE_SCORE 3000\n\n// Difficulty increases as berries are eaten. The rate of new berries increases and the types of berries changes\n// When the max difficulty is reached it starts again from the beginning\n#define NUM_DIFFICULTIES 7\n\n#define MAX_FALL_DIST 10 // The number of times a berry needs to fall before hitting the ground\n#define EAT_FALL_DIST 7 // The number of times a berry needs to fall to be available to eat\n\nenum {\n    BG_INTERFACE,\n    BG_TREE_LEFT,\n    BG_TREE_RIGHT,\n    BG_SCENERY\n};\n\nenum {\n    FUNC_INTRO,\n    FUNC_INIT_COUNTDOWN,\n    FUNC_COUNTDOWN,\n    FUNC_WAIT_START,\n    FUNC_PLAY_GAME,\n    FUNC_INIT_RESULTS,\n    FUNC_RESULTS,\n    FUNC_ASK_PLAY_AGAIN,\n    FUNC_END_LINK,\n    FUNC_EXIT,\n    FUNC_RESET_GAME,\n    FUNC_WAIT_END_GAME,\n};\n\nenum {\n    GFXFUNC_LOAD,\n    GFXFUNC_SHOW_NAMES,\n    GFXFUNC_SHOW_RESULTS,\n    GFXFUNC_MSG_PLAY_AGAIN,\n    GFXFUNC_MSG_SAVING,\n    GFXFUNC_MSG_COMM_STANDBY,\n    GFXFUNC_ERASE_MSG,\n    GFXFUNC_MSG_PLAYER_DROPPED,\n    GFXFUNC_STOP,\n    GFXFUNC_IDLE,\n};\n\nenum {\n    PLAY_AGAIN_NONE,\n    PLAY_AGAIN_YES,\n    PLAY_AGAIN_NO,\n    PLAY_AGAIN_DROPPED = 5,\n};\n\nenum {\n    PICK_NONE,     // Dodrio standing still\n    PICK_RIGHT,    // Dodrio reaching right\n    PICK_MIDDLE,   // Dodrio reaching up\n    PICK_LEFT,     // Dodrio reaching left\n    PICK_DISABLED, // Dodrio down after game over\n};\n\nenum {\n    BERRY_BLUE,\n    BERRY_GREEN,\n    BERRY_GOLD,\n    BERRY_MISSED,\n    BERRY_PRIZE,\n    BERRY_IN_ROW,\n    NUM_BERRY_IDS\n};\n\n#define NUM_BERRY_TYPES  4 // Blue, Green, Gold, and 'missed'\n\n // Eaten anim comes after the normal & missed versions of other berries\n#define ANIM_EATEN (BERRY_MISSED * 2)\n\nenum {\n    BERRYSTATE_NONE,\n    BERRYSTATE_PICKED,   // Berry has been picked by a Dodrio, replaced with blue hit sprite (still falling)\n    BERRYSTATE_EATEN,    // Berry has been eaten (after being picked), berry is gone now\n    BERRYSTATE_SQUISHED, // Berry has hit the ground\n};\n\nenum {\n    INPUTSTATE_NONE,\n    INPUTSTATE_TRY_PICK,\n    INPUTSTATE_PICKED,\n    INPUTSTATE_ATE_BERRY,\n    INPUTSTATE_BAD_MISS,\n};\n\n// Colors for status bar squares\n// Colored gray when a berry is missed\n// Flash red when few yellow squares remain\nenum {\n    STATUS_YELLOW,\n    STATUS_GRAY,\n    STATUS_RED,\n};\n\n#define NUM_STATUS_SQUARES 10\n\n#define GFXTAG_DODRIO    0\n#define GFXTAG_STATUS    1\n#define GFXTAG_BERRIES   2\n#define GFXTAG_CLOUD     5\n#define GFXTAG_COUNTDOWN 7\n\n#define PALTAG_DODRIO_NORMAL 0\n#define PALTAG_DODRIO_SHINY  1\n#define PALTAG_STATUS        2\n#define PALTAG_BERRIES       3\n#define PALTAG_CLOUD         6\n#define PALTAG_COUNTDOWN     8\n\n#define NUM_CLOUDS 2\n\n#define PLAYER_NONE 0xFF\n\nstruct DodrioGame_Gfx\n{\n    u16 ALIGNED(4) tilemapBuffers[3][BG_SCREEN_SIZE];\n    bool32 finished;\n    u8 ALIGNED(4) taskId;\n    u8 ALIGNED(4) windowIds[MAX_RFU_PLAYERS + 5]; // The latter 5 are never used\n    u8 ALIGNED(4) state;\n    u8 ALIGNED(4) loadState;\n    u16 ALIGNED(4) timer;\n    u8 ALIGNED(4) cursorSelection;\n    u8 ALIGNED(4) playAgainState;\n    void (*func)(void);\n}; // size = 0x302C\n\nstruct StatusBar\n{\n    u8 unused[12];\n    bool8 entered[NUM_STATUS_SQUARES];\n    s16 yChange[NUM_STATUS_SQUARES];\n    u16 spriteIds[NUM_STATUS_SQUARES];\n    u16 flashTimer;\n}; // size = 0x40\n\n// Because Dodrio is required for this minigame,\n// the only relevant information about the selected\n// Pokémon is whether or not it's shiny\nstruct DodrioGame_MonInfo\n{\n    bool8 isShiny;\n};\n\nstruct DodrioGame_ScoreResults\n{\n    u8 ranking;\n    u32 score;\n};\n\nstruct DodrioGame\n{\n    /*0x0000*/ void (*exitCallback)(void);\n    /*0x0004*/ u8 ALIGNED(4) taskId;\n    /*0x0008*/ u8 ALIGNED(4) playersReceived;\n    /*0x000C*/ u8 ALIGNED(4) startState;\n    /*0x0010*/ u8 ALIGNED(4) state;\n    /*0x0014*/ u8 ALIGNED(4) timer;\n    /*0x0018*/ u8 ALIGNED(4) funcId;\n    /*0x001C*/ u8 ALIGNED(4) prevFuncId; // Set, never read\n    /*0x0020*/ bool8 ALIGNED(4) isLeader;\n    /*0x0024*/ u8 ALIGNED(4) numPlayers;\n    /*0x0028*/ u8 ALIGNED(4) multiplayerId;\n    /*0x0030*/ u8 ALIGNED(8) countdownEndDelay;\n    /*0x0034*/ u8 ALIGNED(4) posToPlayerId[MAX_RFU_PLAYERS];\n    /*0x003C*/ u8 ALIGNED(4) unused2; // Set to 0, never read\n    /*0x0040*/ u8 ALIGNED(4) numGraySquares;\n    /*0x0044*/ u8 ALIGNED(4) berryColStart;\n    /*0x0048*/ u8 ALIGNED(4) berryColEnd;\n    /*0x004A*/ u16 berryResults[MAX_RFU_PLAYERS][NUM_BERRY_IDS];\n    /*0x0086*/ u16 berriesEaten[MAX_RFU_PLAYERS];\n    /*0x0090*/ u8 ALIGNED(4) difficulty[MAX_RFU_PLAYERS];\n    /*0x0098*/ u8 ALIGNED(4) pickStateQueue[4];\n    /*0x009C*/ u8 ALIGNED(4) eatTimer[NUM_BERRY_COLUMNS];\n    /*0x00A8*/ u8 ALIGNED(4) inputState[MAX_RFU_PLAYERS];\n    /*0x00B0*/ u8 ALIGNED(4) inputDelay[MAX_RFU_PLAYERS];\n    /*0x00B8*/ u8 ALIGNED(4) berryEatenBy[NUM_BERRY_COLUMNS];\n    /*0x00C4*/ u8 ALIGNED(4) berryState[NUM_BERRY_COLUMNS];\n    /*0x00D0*/ u8 ALIGNED(4) fallTimer[NUM_BERRY_COLUMNS];\n    /*0x00DC*/ u8 ALIGNED(4) newBerryTimer[NUM_BERRY_COLUMNS];\n    /*0x00E8*/ u8 ALIGNED(4) prevBerryIds[NUM_BERRY_COLUMNS];\n    /*0x00F4*/ u8 ALIGNED(4) playersAttemptingPick[NUM_BERRY_COLUMNS][2];\n    /*0x010C*/ u8 ALIGNED(4) playAgainStates[MAX_RFU_PLAYERS];\n    /*0x0112*/ u16 berriesPickedInRow;\n    /*0x0114*/ u16 maxBerriesPickedInRow;\n    /*0x0118*/ bool32 startCountdown; // Never read\n    /*0x011C*/ bool32 startGame;\n    /*0x0120*/ bool32 berriesFalling;\n    /*0x0124*/ u8 ALIGNED(4) clearRecvCmdTimer;\n    /*0x0128*/ u8 ALIGNED(4) clearRecvCmds;\n    /*0x012C*/ bool32 allReadyToEnd;\n    /*0x0130*/ bool32 readyToEnd[MAX_RFU_PLAYERS];\n    /*0x0144*/ bool8 ALIGNED(4) playingPickSound;\n    /*0x0148*/ bool8 ALIGNED(4) playingSquishSound[NUM_BERRY_COLUMNS];\n    /*0x0154*/ u8 ALIGNED(4) endSoundState;\n    /*0x0158*/ bool8 ALIGNED(4) readyToStart[MAX_RFU_PLAYERS];\n    /*0x0160*/ struct DodrioGame_Gfx gfx;\n    /*0x318C*/ struct DodrioGame_MonInfo monInfo[MAX_RFU_PLAYERS];\n    /*0x31A0*/ struct DodrioGame_Player players[MAX_RFU_PLAYERS];\n    /*0x32CC*/ struct DodrioGame_Player player;\n    /*0x3308*/ struct DodrioGame_ScoreResults scoreResults[MAX_RFU_PLAYERS];\n}; // size = 0x3330\n\nstatic EWRAM_DATA struct DodrioGame * sGame = NULL;\nstatic EWRAM_DATA u16 *sDodrioSpriteIds[MAX_RFU_PLAYERS] = {NULL};\nstatic EWRAM_DATA u16 *sCloudSpriteIds[NUM_CLOUDS] = {NULL};\nstatic EWRAM_DATA u16 *sBerrySpriteIds[NUM_BERRY_COLUMNS] = {NULL};\nstatic EWRAM_DATA u16 *sBerryIconSpriteIds[NUM_BERRY_TYPES] = {NULL};\nstatic EWRAM_DATA struct StatusBar * sStatusBar = NULL;\nstatic EWRAM_DATA struct DodrioGame_Gfx * sGfx = NULL;\n\nstatic bool32 sExitingGame;\n\nstatic void ResetTasksAndSprites(void);\nstatic void InitDodrioGame(struct DodrioGame *);\nstatic void Task_StartDodrioGame(u8);\nstatic void DoGameIntro(void);\nstatic void InitCountdown(void);\nstatic void DoCountdown(void);\nstatic void WaitGameStart(void);\nstatic void PlayGame_Leader(void);\nstatic void PlayGame_Member(void);\nstatic void WaitEndGame_Leader(void);\nstatic void WaitEndGame_Member(void);\nstatic void InitResults_Leader(void);\nstatic void InitResults_Member(void);\nstatic void DoResults(void);\nstatic void AskPlayAgain(void);\nstatic void EndLink(void);\nstatic void ExitGame(void);\nstatic void ResetGame(void);\nstatic void Task_NewGameIntro(u8);\nstatic void Task_CommunicateMonInfo(u8);\nstatic void RecvLinkData_Leader(void);\nstatic void SendLinkData_Leader(void);\nstatic void RecvLinkData_Member(void);\nstatic void SendLinkData_Member(void);\nstatic void HandleSound_Leader(void);\nstatic void HandleSound_Member(void);\nstatic void CB2_DodrioGame(void);\nstatic void VBlankCB_DodrioGame(void);\nstatic void InitMonInfo(struct DodrioGame_MonInfo *, struct Pokemon *);\nstatic void CreateTask_(TaskFunc, u8);\nstatic void CreateDodrioGameTask(TaskFunc);\nstatic void SetGameFunc(u8);\nstatic bool32 SlideTreeBordersOut(void);\nstatic void InitFirstWaveOfBerries(void);\nstatic bool32 TryPickBerry(u8, u8, u8);\nstatic void UpdateFallingBerries(void);\nstatic void UpdateGame_Leader(void);\nstatic void UpdateGame_Member(void);\nstatic bool32 AllPlayersReadyToStart(void);\nstatic void ResetReadyToStart(void);\nstatic void GetActiveBerryColumns(u8, u8 *, u8 *);\nstatic bool32 ReadyToEndGame_Leader(void);\nstatic bool32 ReadyToEndGame_Member(void);\nstatic void TryIncrementDifficulty(u8);\nstatic u8 GetPlayerIdAtColumn(u8);\nstatic u8 GetNewBerryId(u8, u8);\nstatic u8 GetNewBerryIdByDifficulty(u8, u8);\nstatic void IncrementBerryResult(u8, u8, u8);\nstatic void UpdateBerriesPickedInRow(bool32);\nstatic void SetMaxBerriesPickedInRow(void);\nstatic void ResetForPlayAgainPrompt(void);\nstatic void SetRandomPrize(void);\nstatic void TryUpdateRecords(void);\nstatic u8 UpdatePickStateQueue(u8);\nstatic void HandleWaitPlayAgainInput(void);\nstatic void ResetPickState(void);\nstatic u32 GetScore(u8);\nstatic void Task_ShowDodrioBerryPickingRecords(u8);\nstatic void PrintRecordsText(u8);\nstatic void SpriteCB_Dodrio(struct Sprite *);\nstatic u32 DoDodrioMissedAnim(struct Sprite *);\nstatic u32 DoDodrioIntroAnim(struct Sprite *);\nstatic void SetDodrioInvisibility(bool8, u8);\nstatic void SpriteCB_Status(struct Sprite *);\nstatic void SetBerryIconsInvisibility(bool8);\nstatic void SpriteCB_Cloud(struct Sprite *);\nstatic s16 GetDodrioXPos(u8, u8);\nstatic void Task_TryRunGfxFunc(u8);\nstatic void LoadGfx(void);\nstatic void ShowNames(void);\nstatic void ShowResults(void);\nstatic void Msg_WantToPlayAgain(void);\nstatic void Msg_SavingDontTurnOff(void);\nstatic void Msg_CommunicationStandby(void);\nstatic void EraseMessage(void);\nstatic void Msg_SomeoneDroppedOut(void);\nstatic void StopGfxFuncs(void);\nstatic void GfxIdle(void);\nstatic void SetGfxFunc(MainCallback);\nstatic MainCallback GetGfxFunc(void);\nstatic void InitBgs(void);\nstatic bool32 LoadBgGfx(void);\nstatic void InitGameGfx(struct DodrioGame_Gfx *);\nstatic void LoadDodrioGfx(void);\nstatic void CreateDodrioSprite(struct DodrioGame_MonInfo *, u8, u8, u8);\nstatic void SetAllDodrioInvisibility(bool8, u8);\nstatic void LoadBerryGfx(void);\nstatic void CreateBerrySprites(void);\nstatic void CreateCloudSprites(void);\nstatic void CreateStatusBarSprites(void);\nstatic void StartDodrioIntroAnim(u8);\nstatic void SetGfxFuncById(u8);\nstatic void SetStatusBarInvisibility(bool8);\nstatic void ResetCloudPos(void);\nstatic void SetCloudInvisibility(bool8);\nstatic u8 GetPlayAgainState(void);\nstatic u32 GetHighestScore(void);\nstatic void ResetBerryAndStatusBarSprites(void);\nstatic void FreeBerrySprites(void);\nstatic void FreeStatusBar(void);\nstatic void FreeDodrioSprites(u8);\nstatic void FreeCloudSprites(void);\nstatic void StartCloudMovement(void);\nstatic void ResetGfxState(void);\nstatic void InitStatusBarPos(void);\nstatic bool32 DoStatusBarIntro(void);\nstatic void StartDodrioMissedAnim(u8);\nstatic void SetBerryInvisibility(u8, bool8);\nstatic void SetBerryAnim(u16, u8);\nstatic void SetBerryYPos(u8, u8);\nstatic void SetDodrioAnim(u8, u8);\nstatic void UpdateStatusBarAnim(u8);\nstatic bool32 IsGfxFuncActive(void);\nstatic u32 IncrementWithLimit(u32, u32);\nstatic u32 Min(u32, u32);\n\n// Unused duplicate\nstatic const struct BgTemplate sBgTemplates_Duplicate[] =\n{\n    {\n        .bg = BG_INTERFACE,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0\n    },\n    {\n        .bg = BG_TREE_LEFT,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 12,\n        .screenSize = 1,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0\n    },\n    {\n        .bg = BG_TREE_RIGHT,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 14,\n        .screenSize = 1,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0\n    },\n    {\n        .bg = BG_SCENERY,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0\n    },\n};\n\nstatic const struct WindowTemplate sWindowTemplate_Dummy_Duplicate = DUMMY_WIN_TEMPLATE;\n\nstatic const struct WindowTemplate sWindowTemplates_Results_Duplicate[] =\n{\n    {\n        .bg = BG_INTERFACE,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 28,\n        .height = 3,\n        .paletteNum = 13,\n        .baseBlock = 0x13,\n    },\n    {\n        .bg = BG_INTERFACE,\n        .tilemapLeft = 1,\n        .tilemapTop = 6,\n        .width = 28,\n        .height = 13,\n        .paletteNum = 13,\n        .baseBlock = 0x67,\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplate_Prize_Duplicate =\n{\n    .bg = BG_INTERFACE,\n    .tilemapLeft = 1,\n    .tilemapTop = 6,\n    .width = 28,\n    .height = 7,\n    .paletteNum = 13,\n    .baseBlock = 0x67,\n};\n\nstatic const struct WindowTemplate sWindowTemplates_PlayAgain_Duplicate[] =\n{\n    {\n        .bg = BG_INTERFACE,\n        .tilemapLeft = 1,\n        .tilemapTop = 8,\n        .width = 19,\n        .height = 3,\n        .paletteNum = 13,\n        .baseBlock = 0x13,\n    },\n    {\n        .bg = BG_INTERFACE,\n        .tilemapLeft = 22,\n        .tilemapTop = 7,\n        .width = 6,\n        .height = 4,\n        .paletteNum = 13,\n        .baseBlock = 0x4C,\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplate_DroppedOut_Duplicate =\n{\n    .bg = BG_INTERFACE,\n    .tilemapLeft = 4,\n    .tilemapTop = 6,\n    .width = 22,\n    .height = 5,\n    .paletteNum = 13,\n    .baseBlock = 0x13,\n};\n\nstatic const struct WindowTemplate sWindowTemplate_CommStandby_Duplicate =\n{\n    .bg = BG_INTERFACE,\n    .tilemapLeft = 5,\n    .tilemapTop = 8,\n    .width = 19,\n    .height = 3,\n    .paletteNum = 13,\n    .baseBlock = 0x13,\n};\n\n// For each player, the array is a list of all the columns starting with the column to their left\n// Only the range of active columns is read from the array (dependent on the number of players),\n// so the arrays are spaced such that the numbers in the center are where the data that's read starts and end.\nstatic const u8 sActiveColumnMap[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][NUM_BERRY_COLUMNS] =\n{\n    { // 1 player (never used), columns 4-6.\n      // Sometimes read to get default order regardless of the current number of players\n        {0, 1, 2, 3,     4, 5, 6,     7, 8, 9, 0},\n    },\n    { // 2 players (never used), columns 3-6\n        {0, 1, 2,     3, 4, 5, 6, 3,     8, 9, 0},\n        {0, 1, 2,     5, 6, 3, 4, 5,     8, 9, 0},\n    },\n    { // 3 players, columns 2-7\n        {0, 1,     2, 3, 4, 5, 6, 7, 2,     9, 0},\n        {0, 1,     4, 5, 6, 7, 2, 3, 4,     9, 0},\n        {0, 1,     6, 7, 2, 3, 4, 5, 6,     9, 0},\n    },\n    { // 4 players, columns 1-8\n        {0,     1, 2, 3, 4, 5, 6, 7, 8, 1,     0},\n        {0,     3, 4, 5, 6, 7, 8, 1, 2, 3,     0},\n        {0,     5, 6, 7, 8, 1, 2, 3, 4, 5,     0},\n        {0,     7, 8, 1, 2, 3, 4, 5, 6, 7,     0},\n    },\n    { // 5 players, all columns (0-9)\n        {    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0    },\n        {    2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2    },\n        {    4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4    },\n        {    6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6    },\n        {    8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8    },\n    },\n};\n\n// A table for which falling berry column corresponds to which Dodrio head for each player\n// The numbers in each array are the column number for each head, {left, middle, right}\n// Dependent on the number of players\nstatic const u8 sDodrioHeadToColumnMap[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][3] =\n{\n    { // 1 player (never used)\n        {4, 5, 6},\n    },\n    { // 2 players (never used)\n        {3, 4, 5},\n        {5, 6, 3},\n    },\n    { // 3 players\n        {4, 5, 6},\n        {6, 7, 2},\n        {2, 3, 4},\n    },\n    { // 4 players\n        {3, 4, 5},\n        {5, 6, 7},\n        {7, 8, 1},\n        {1, 2, 3},\n    },\n    { // 5 players\n        {4, 5, 6},\n        {6, 7, 8},\n        {8, 9, 0},\n        {0, 1, 2},\n        {2, 3, 4},\n    },\n};\n\n// A table of player ids and their neighbor, dependent on the total number of players\n// {L, M, R}, where M is the player in question, L is their neighbor to the left, and R is their neighbor to the right\nstatic const u8 sDodrioNeighborMap[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][3] =\n{\n    { // 1 player (never used)\n        {1, 0, 1},\n    },\n    { // 2 players (never used)\n        {1, 0, 1},\n        {0, 1, 0},\n    },\n    { // 3 players\n        {2, 0, 1},\n        {0, 1, 2},\n        {1, 2, 0},\n    },\n    { // 4 players\n        {3, 0, 1},\n        {0, 1, 2},\n        {1, 2, 3},\n        {2, 3, 0},\n    },\n    { // 5 players\n        {4, 0, 1},\n        {0, 1, 2},\n        {1, 2, 3},\n        {2, 3, 4},\n        {3, 4, 0},\n    },\n};\n\n#define x 9 // No player at this column. This may go out of bounds if this is returned\n\n// Takes the number of players and a column and returns the player id at that column.\n// Note that the assignment is somewhat arbitrary as players share neighboring columns.\nALIGNED(4)\nstatic const u8 sPlayerIdAtColumn[MAX_RFU_PLAYERS][NUM_BERRY_COLUMNS] =\n{\n    {x, x, x, x, 1, 1, 1, x, x, x, x}, // 1 player\n    {x, x, x, 0, 0, 1, 1, 0, x, x, x}, // 2 players\n    {x, x, 2, 2, 0, 0, 1, 1, 1, x, x}, // 3 players\n    {x, 3, 3, 0, 0, 1, 1, 2, 2, 3, x}, // 4 players\n    {3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3}, // 5 players\n};\n\n#undef x\n\n// Each array contains the columns that belong solely to one player, dependent on the number of players\n// When determing how difficult the berries in a column should be, the highest\n// difficulty of the players sharing that column is used.\n// This table is used to skip that check, and instead automatically use the\n// difficulty of the only player who can use the column.\nstatic const u8 sUnsharedColumns[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS] =\n{\n    {5},\n    {4, 6},\n    {3, 5, 7},\n    {2, 4, 6, 8},\n#ifndef BUGFIX\n    {1, 3, 5, 6, 9}, // BUG: Column 6 is shared, 7 is not. As a result, the player in column 7 will have their difficulty influenced by their neighbors\n#else\n    {1, 3, 5, 7, 9},\n#endif\n};\n\n// Duplicate and unused gfx.\nstatic const u32 sDuplicateGfx[] = INCBIN_U32(\"graphics/dodrio_berry_picking/bg.gbapal\",\n                                              \"graphics/dodrio_berry_picking/tree_border.gbapal\",\n                                              \"graphics/dodrio_berry_picking/dodrio.gbapal\",\n                                              \"graphics/dodrio_berry_picking/shiny.gbapal\",\n                                              \"graphics/dodrio_berry_picking/status.gbapal\",\n                                              \"graphics/dodrio_berry_picking/berries.gbapal\",\n                                              \"graphics/dodrio_berry_picking/berries.4bpp.lz\",\n                                              \"graphics/dodrio_berry_picking/cloud.gbapal\",\n                                              \"graphics/dodrio_berry_picking/bg.4bpp.lz\",\n                                              \"graphics/dodrio_berry_picking/tree_border.4bpp.lz\",\n                                              \"graphics/dodrio_berry_picking/status.4bpp.lz\",\n                                              \"graphics/dodrio_berry_picking/cloud.4bpp.lz\",\n                                              \"graphics/dodrio_berry_picking/dodrio.4bpp.lz\",\n                                              \"graphics/dodrio_berry_picking/bg.bin.lz\",\n                                              \"graphics/dodrio_berry_picking/tree_border_right.bin.lz\",\n                                              \"graphics/dodrio_berry_picking/tree_border_left.bin.lz\");\n\nstatic const u8 sBerryFallDelays[][3] =\n{\n    { [BERRY_BLUE] = 40, [BERRY_GREEN] = 24, [BERRY_GOLD] = 13 },\n    { [BERRY_BLUE] = 32, [BERRY_GREEN] = 19, [BERRY_GOLD] = 10 },\n    { [BERRY_BLUE] = 22, [BERRY_GREEN] = 13, [BERRY_GOLD] =  7 },\n};\n\n// How far the outer tree borders should slide to reveal the game screen.\n// Dependent on how many players are playing.\n// Curiously the 2-player screen is narrower than the 1-player, though neither\n// gets used as there's a 3 player minimum\nALIGNED(4)\nstatic const u8 sTreeBorderXPos[MAX_RFU_PLAYERS] = {8, 5, 8, 11, 15};\n\n// The number of berries eaten needed to progress to the next difficulty\nALIGNED(4)\nstatic const u8 sDifficultyThresholds[NUM_DIFFICULTIES] = {5, 10, 20, 30, 50, 70, 100};\n\nALIGNED(4)\nstatic const u8 sPrizeBerryIds[][10] =\n{\n    { // Possible prizes with 3 players\n        ITEM_TO_BERRY(ITEM_RAZZ_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_BLUK_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_NANAB_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_WEPEAR_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_PINAP_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_PINAP_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_WEPEAR_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_NANAB_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_BLUK_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_RAZZ_BERRY) - 1\n    },\n    { // Possible prizes with 4 players\n        ITEM_TO_BERRY(ITEM_POMEG_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_KELPSY_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_QUALOT_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_HONDEW_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_GREPA_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_TAMATO_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_CORNN_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_MAGOST_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_RABUTA_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_NOMEL_BERRY) - 1\n    },\n    { // Possible prizes with 5 players\n        ITEM_TO_BERRY(ITEM_SPELON_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_PAMTRE_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_WATMEL_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_DURIN_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_BELUE_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_BELUE_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_DURIN_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_WATMEL_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_PAMTRE_BERRY) - 1,\n        ITEM_TO_BERRY(ITEM_SPELON_BERRY) - 1\n    },\n};\n\nstatic void (*const sLeaderFuncs[])(void) =\n{\n    [FUNC_INTRO]          = DoGameIntro,\n    [FUNC_INIT_COUNTDOWN] = InitCountdown,\n    [FUNC_COUNTDOWN]      = DoCountdown,\n    [FUNC_WAIT_START]     = WaitGameStart,\n    [FUNC_PLAY_GAME]      = PlayGame_Leader,\n    [FUNC_INIT_RESULTS]   = InitResults_Leader,\n    [FUNC_RESULTS]        = DoResults,\n    [FUNC_ASK_PLAY_AGAIN] = AskPlayAgain,\n    [FUNC_END_LINK]       = EndLink,\n    [FUNC_EXIT]           = ExitGame,\n    [FUNC_RESET_GAME]     = ResetGame,\n    [FUNC_WAIT_END_GAME]  = WaitEndGame_Leader\n};\n\nstatic void (*const sMemberFuncs[])(void) =\n{\n    [FUNC_INTRO]          = DoGameIntro,\n    [FUNC_INIT_COUNTDOWN] = InitCountdown,\n    [FUNC_COUNTDOWN]      = DoCountdown,\n    [FUNC_WAIT_START]     = WaitGameStart,\n    [FUNC_PLAY_GAME]      = PlayGame_Member,\n    [FUNC_INIT_RESULTS]   = InitResults_Member,\n    [FUNC_RESULTS]        = DoResults,\n    [FUNC_ASK_PLAY_AGAIN] = AskPlayAgain,\n    [FUNC_END_LINK]       = EndLink,\n    [FUNC_EXIT]           = ExitGame,\n    [FUNC_RESET_GAME]     = ResetGame,\n    [FUNC_WAIT_END_GAME]  = WaitEndGame_Member\n};\n\nvoid StartDodrioBerryPicking(u16 partyId, MainCallback exitCallback)\n{\n    sExitingGame = FALSE;\n\n    if (gReceivedRemoteLinkPlayers && (sGame = AllocZeroed(sizeof(*sGame))))\n    {\n        ResetTasksAndSprites();\n        InitDodrioGame(sGame);\n        sGame->exitCallback = exitCallback;\n        sGame->multiplayerId = GetMultiplayerId();\n        sGame->player = sGame->players[sGame->multiplayerId];\n        InitMonInfo(&sGame->monInfo[sGame->multiplayerId], &gPlayerParty[partyId]);\n        CreateTask(Task_StartDodrioGame, 1);\n        SetMainCallback2(CB2_DodrioGame);\n        SetRandomPrize();\n        GetActiveBerryColumns(sGame->numPlayers, &sGame->berryColStart, &sGame->berryColEnd);\n        StopMapMusic();\n        PlayNewMapMusic(MUS_BERRY_PICK);\n    }\n    else\n    {\n        // Exit - Alloc failed, or players not connected\n        SetMainCallback2(exitCallback);\n        return;\n    }\n}\n\nstatic void ResetTasksAndSprites(void)\n{\n    ResetTasks();\n    ResetSpriteData();\n    FreeAllSpritePalettes();\n}\n\nstatic void InitDodrioGame(struct DodrioGame * game)\n{\n    u8 i;\n\n    game->startState = 0;\n    game->state = 0;\n    game->timer = 0;\n    game->funcId = FUNC_INTRO;\n    game->prevFuncId = FUNC_INTRO;\n    game->startGame = FALSE;\n    game->berriesFalling = FALSE;\n    game->countdownEndDelay = 0;\n    game->numGraySquares = 0;\n    game->unused2 = 0;\n    game->allReadyToEnd = FALSE;\n\n    for (i = 0; i < ARRAY_COUNT(game->pickStateQueue); i++)\n        game->pickStateQueue[i] = PICK_NONE;\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        game->inputState[i] = INPUTSTATE_NONE;\n        game->inputDelay[i] = 0;\n        game->berryResults[i][BERRY_BLUE] = 0;\n        game->berryResults[i][BERRY_GREEN] = 0;\n        game->berryResults[i][BERRY_GOLD] = 0;\n        game->berryResults[i][BERRY_MISSED] = 0;\n        game->berryResults[i][BERRY_IN_ROW] = 0;\n        game->playAgainStates[i] = PLAY_AGAIN_NONE;\n        game->readyToEnd[i] = FALSE;\n    }\n\n    for (i = 0; i < NUM_BERRY_COLUMNS; i++)\n    {\n        game->fallTimer[i] = 0;\n        game->newBerryTimer[i] = 0;\n        game->berryState[i] = BERRYSTATE_NONE;\n        game->playersAttemptingPick[i][0] = PLAYER_NONE;\n        game->playersAttemptingPick[i][1] = PLAYER_NONE;\n    }\n\n    game->isLeader = GetMultiplayerId() == 0 ? TRUE : FALSE;\n    game->numPlayers = GetLinkPlayerCount();\n    game->posToPlayerId[0] = GetMultiplayerId();\n    for (i = 1; i < game->numPlayers; i++)\n    {\n        game->posToPlayerId[i] = game->posToPlayerId[i - 1] + 1;\n        if (game->posToPlayerId[i] > game->numPlayers - 1)\n            game->posToPlayerId[i] %= game->numPlayers;\n    }\n}\n\nstatic void Task_StartDodrioGame(u8 taskId)\n{\n    u8 i, numPlayers;\n\n    switch (sGame->startState)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        CreateTask_(Task_CommunicateMonInfo, 4);\n        sGame->startState++;\n        break;\n    case 1:\n        if (!FuncIsActiveTask(Task_CommunicateMonInfo))\n        {\n            InitGameGfx(&sGame->gfx);\n            sGame->startState++;\n        }\n        break;\n    case 2:\n        if (!IsGfxFuncActive())\n        {\n            Rfu_SetLinkStandbyCallback();\n            sGame->startState++;\n        }\n        break;\n    case 3:\n        if (IsLinkTaskFinished())\n        {\n            if (gReceivedRemoteLinkPlayers)\n            {\n                LoadWirelessStatusIndicatorSpriteGfx();\n                CreateWirelessStatusIndicatorSprite(0, 0);\n            }\n            sGame->startState++;\n        }\n        break;\n    case 4:\n        numPlayers = sGame->numPlayers;\n        LoadDodrioGfx();\n        for (i = 0; i < numPlayers; i++)\n            CreateDodrioSprite(&sGame->monInfo[sGame->posToPlayerId[i]], i, sGame->posToPlayerId[i], sGame->numPlayers);\n        SetAllDodrioInvisibility(FALSE, sGame->numPlayers);\n        sGame->startState++;\n        break;\n    case 5:\n        LoadBerryGfx();\n        CreateBerrySprites();\n        CreateCloudSprites();\n        CreateStatusBarSprites();\n        sGame->startState++;\n        break;\n    case 6:\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        SetVBlankCallback(VBlankCB_DodrioGame);\n        sGame->startState++;\n        break;\n    case 7:\n        UpdatePaletteFade();\n        if (!gPaletteFade.active)\n            sGame->startState++;\n        break;\n    default:\n        DestroyTask(taskId);\n        CreateDodrioGameTask(Task_NewGameIntro);\n        break;\n    }\n}\n\nstatic void Task_DodrioGame_Leader(u8 taskId)\n{\n    RecvLinkData_Leader();\n    sLeaderFuncs[sGame->funcId]();\n    if (!sExitingGame)\n        UpdateGame_Leader();\n    SendLinkData_Leader();\n}\n\nstatic void Task_DodrioGame_Member(u8 taskId)\n{\n    RecvLinkData_Member();\n    sMemberFuncs[sGame->funcId]();\n    if (!sExitingGame)\n        UpdateGame_Member();\n    SendLinkData_Member();\n}\n\nstatic void DoGameIntro(void)\n{\n    switch (sGame->state)\n    {\n    case 0:\n        StartDodrioIntroAnim(1);\n        SetGfxFuncById(GFXFUNC_SHOW_NAMES);\n        sGame->state++;\n        break;\n    case 1:\n        if (!IsGfxFuncActive())\n            SetGameFunc(FUNC_INIT_COUNTDOWN);\n        break;\n    }\n}\n\nstatic void InitCountdown(void)\n{\n    switch (sGame->state)\n    {\n    case 0:\n        InitFirstWaveOfBerries();\n        sGame->state++;\n        break;\n    default:\n        sGame->startCountdown = TRUE;\n        SetGameFunc(FUNC_COUNTDOWN);\n        break;\n    }\n}\n\nstatic void DoCountdown(void)\n{\n    switch (sGame->state)\n    {\n    case 0:\n        StartMinigameCountdown(GFXTAG_COUNTDOWN, PALTAG_COUNTDOWN, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0);\n        sGame->state++;\n        break;\n    case 1:\n        Rfu_SetLinkStandbyCallback();\n        sGame->state++;\n        break;\n    case 2:\n        if (IsLinkTaskFinished())\n            sGame->state++;\n        break;\n    case 3:\n        if (!IsMinigameCountdownRunning())\n        {\n            Rfu_SetLinkStandbyCallback();\n            sGame->state++;\n        }\n        break;\n    case 4:\n        if (IsLinkTaskFinished())\n            SetGameFunc(FUNC_WAIT_START);\n        break;\n    }\n}\n\nstatic void WaitGameStart(void)\n{\n    switch (sGame->state)\n    {\n    case 0:\n        if (sGame->startGame)\n            SetGameFunc(FUNC_PLAY_GAME);\n        break;\n    }\n}\n\nstatic void PlayGame_Leader(void)\n{\n    switch (sGame->state)\n    {\n    case 0:\n        if (sGame->numGraySquares < NUM_STATUS_SQUARES)\n        {\n            if (sGame->inputState[0] == INPUTSTATE_NONE)\n            {\n                if (JOY_NEW(DPAD_UP))\n                {\n                    if (sGame->players[0].comm.pickState == PICK_NONE)\n                    {\n                        sGame->players[0].comm.ateBerry = FALSE;\n                        sGame->players[0].comm.pickState = UpdatePickStateQueue(PICK_MIDDLE);\n                    }\n                }\n                else if (JOY_NEW(DPAD_RIGHT))\n                {\n                    if (sGame->players[0].comm.pickState == PICK_NONE)\n                    {\n                        sGame->players[0].comm.ateBerry = FALSE;\n                        sGame->players[0].comm.pickState = UpdatePickStateQueue(PICK_RIGHT);\n                    }\n                }\n                else if (JOY_NEW(DPAD_LEFT))\n                {\n                    if (sGame->players[0].comm.pickState == PICK_NONE)\n                    {\n                        sGame->players[0].comm.ateBerry = FALSE;\n                        sGame->players[0].comm.pickState = UpdatePickStateQueue(PICK_LEFT);\n                    }\n                }\n                else\n                {\n                    sGame->players[0].comm.pickState = UpdatePickStateQueue(PICK_NONE);\n                }\n            }\n        }\n        else\n        {\n            SetGameFunc(FUNC_WAIT_END_GAME);\n        }\n        UpdateFallingBerries();\n        HandleSound_Leader();\n        break;\n    }\n}\nstatic void PlayGame_Member(void)\n{\n    if (sGame->numGraySquares < NUM_STATUS_SQUARES)\n    {\n        if (JOY_NEW(DPAD_UP))\n        {\n            if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE)\n                sGame->player.comm.pickState = PICK_MIDDLE;\n        }\n        else if (JOY_NEW(DPAD_RIGHT))\n        {\n            if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE)\n                sGame->player.comm.pickState = PICK_RIGHT;\n        }\n        else if (JOY_NEW(DPAD_LEFT))\n        {\n            if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE)\n                sGame->player.comm.pickState = PICK_LEFT;\n        }\n        else\n        {\n            sGame->player.comm.pickState = PICK_NONE;\n        }\n    }\n    else\n    {\n        SetGameFunc(FUNC_WAIT_END_GAME);\n    }\n    HandleSound_Member();\n}\n\nstatic void WaitEndGame_Leader(void)\n{\n    u8 i;\n\n    UpdateFallingBerries();\n    HandleSound_Leader();\n    if (ReadyToEndGame_Leader() == TRUE)\n    {\n        SetMaxBerriesPickedInRow();\n        SetGameFunc(FUNC_INIT_RESULTS);\n    }\n    else\n    {\n        sGame->allReadyToEnd = TRUE;\n        for (i = 1; i < sGame->numPlayers; i++)\n        {\n            if (sGame->readyToEnd[i] != TRUE)\n            {\n                sGame->allReadyToEnd = FALSE;\n                break;\n            }\n        }\n    }\n}\n\nstatic void WaitEndGame_Member(void)\n{\n    HandleSound_Member();\n    if (ReadyToEndGame_Member() == TRUE)\n        SetGameFunc(FUNC_INIT_RESULTS);\n}\n\nstatic void InitResults_Leader(void)\n{\n    u8 blockReceivedStatus;\n    u8 i;\n    switch (sGame->state)\n    {\n    case 0:\n        SendBlock(0, sGame->berryResults, sizeof(sGame->berryResults));\n        sGame->playersReceived = 0;\n        sGame->state++;\n        break;\n    case 1:\n        if (IsLinkTaskFinished())\n            sGame->state++;\n        break;\n    case 2:\n        blockReceivedStatus = GetBlockReceivedStatus();\n        for (i = 0; i < sGame->numPlayers; blockReceivedStatus >>= 1, i++)\n        {\n            if (blockReceivedStatus & 1)\n            {\n                ResetBlockReceivedFlag(i);\n                sGame->playersReceived++;\n            }\n        }\n        if (sGame->playersReceived >= sGame->numPlayers)\n        {\n            sGame->timer++;\n            sGame->state++;\n        }\n        break;\n    default:\n        if (WaitFanfare(TRUE))\n        {\n            SetGameFunc(FUNC_RESULTS);\n            FadeOutAndPlayNewMapMusic(MUS_VICTORY_WILD, 4);\n        }\n        break;\n    }\n}\n\nstatic void InitResults_Member(void)\n{\n    u8 i;\n    u8 blockReceivedStatus;\n\n    switch (sGame->state) {\n    case 0:\n        SendBlock(0, sGame->berryResults[sGame->timer], sizeof(sGame->berryResults));\n        sGame->playersReceived = 0;\n        sGame->state++;\n        break;\n    case 1:\n        if (IsLinkTaskFinished())\n            sGame->state++;\n        break;\n    case 2:\n        blockReceivedStatus = GetBlockReceivedStatus();\n        for (i = 0; i < sGame->numPlayers; blockReceivedStatus >>= 1, i++)\n        {\n            if (blockReceivedStatus & 1)\n            {\n                memcpy(sGame->berryResults, gBlockRecvBuffer, sizeof(sGame->berryResults));\n                ResetBlockReceivedFlag(i);\n                sGame->playersReceived++;\n            }\n        }\n        if (sGame->playersReceived >= sGame->numPlayers)\n        {\n            sGame->timer++;\n            sGame->state++;\n        }\n        break;\n    default:\n        if (WaitFanfare(TRUE))\n        {\n            sGame->maxBerriesPickedInRow = sGame->berryResults[sGame->multiplayerId][BERRY_IN_ROW];\n            SetGameFunc(FUNC_RESULTS);\n            FadeOutAndPlayNewMapMusic(MUS_VICTORY_WILD, 4);\n        }\n        break;\n    }\n}\n\nstatic void DoResults(void)\n{\n    u8 playAgainState;\n    u8 i;\n    u8 blockReceivedStatus;\n\n    switch (sGame->state)\n    {\n    case 0:\n        TryUpdateRecords();\n        SetStatusBarInvisibility(TRUE);\n        ResetCloudPos();\n        SetCloudInvisibility(TRUE);\n        SetGfxFuncById(2);\n        sGame->state++;\n        break;\n    case 1:\n        if (!IsGfxFuncActive())\n        {\n            playAgainState = PLAY_AGAIN_YES;\n            SetGfxFuncById(GFXFUNC_MSG_COMM_STANDBY);\n            playAgainState = GetPlayAgainState();\n            SendBlock(0, &playAgainState, sizeof(playAgainState));\n            sGame->state++;\n        }\n        break;\n    case 2:\n        if (IsLinkTaskFinished())\n        {\n            sGame->state++;\n            sGame->playersReceived = 0;\n        }\n        break;\n    case 3:\n        blockReceivedStatus = GetBlockReceivedStatus();\n        for (i = 0; i < sGame->numPlayers; blockReceivedStatus >>= 1, i++)\n        {\n            if (blockReceivedStatus & 1)\n            {\n                *(sGame->playAgainStates + i) = *(u8 *)gBlockRecvBuffer[i];\n                ResetBlockReceivedFlag(i);\n                sGame->playersReceived++;\n            }\n        }\n        if (sGame->playersReceived >= sGame->numPlayers)\n        {\n            if (++sGame->timer >= 120)\n            {\n                SetGfxFuncById(GFXFUNC_ERASE_MSG);\n                sGame->state++;\n            }\n        }\n        break;\n    default:\n        if (!IsGfxFuncActive())\n            SetGameFunc(FUNC_ASK_PLAY_AGAIN);\n        break;\n    }\n}\n\nstatic void AskPlayAgain(void)\n{\n    u8 playAgainState;\n    u8 i;\n    u8 blockReceivedStatus;\n\n    switch (sGame->state)\n    {\n    case 0:\n        if (GetHighestScore() >= PRIZE_SCORE)\n            SetGfxFuncById(GFXFUNC_MSG_SAVING);\n        sGame->state++;\n        break;\n    case 1:\n        if (!IsGfxFuncActive())\n        {\n            SetGfxFuncById(GFXFUNC_MSG_PLAY_AGAIN);\n            sGame->state++;\n        }\n        break;\n    case 2:\n        ResetBerryAndStatusBarSprites();\n        ResetForPlayAgainPrompt();\n        sGame->state++;\n        break;\n    case 3:\n        if ((playAgainState = GetPlayAgainState()) != PLAY_AGAIN_NONE)\n            sGame->state++;\n        break;\n    case 4:\n        if (!IsGfxFuncActive())\n        {\n            SetGfxFuncById(GFXFUNC_MSG_COMM_STANDBY);\n            playAgainState = GetPlayAgainState();\n            SendBlock(0, &playAgainState, sizeof(playAgainState));\n            sGame->state++;\n        }\n        break;\n    case 5:\n        if (IsLinkTaskFinished())\n        {\n            sGame->state++;\n            sGame->playersReceived = 0;\n        }\n        break;\n    case 6:\n        blockReceivedStatus = GetBlockReceivedStatus();\n        for (i = 0; i < sGame->numPlayers; blockReceivedStatus >>= 1, i++)\n        {\n            if (blockReceivedStatus & 1)\n            {\n                *(sGame->playAgainStates + i) = *(u8 *)gBlockRecvBuffer[i];\n                ResetBlockReceivedFlag(i);\n                sGame->playersReceived++;\n            }\n        }\n        if (sGame->playersReceived >= sGame->numPlayers)\n        {\n            if (++sGame->timer >= 120)\n            {\n                ResetPickState();\n                SetGfxFuncById(GFXFUNC_ERASE_MSG);\n                sGame->state++;\n            }\n        }\n        else\n        {\n            HandleWaitPlayAgainInput();\n        }\n        break;\n    default:\n        if (!IsGfxFuncActive())\n        {\n            for (i = 0; i < sGame->numPlayers; i++)\n            {\n                if (sGame->playAgainStates[i] == PLAY_AGAIN_NO)\n                {\n                    SetGameFunc(FUNC_END_LINK);\n                    return;\n                }\n            }\n            SetGameFunc(FUNC_RESET_GAME);\n        }\n        break;\n    }\n}\n\nstatic void EndLink(void)\n{\n    switch (sGame->state)\n    {\n    case 0:\n        SetCloseLinkCallback();\n        SetGfxFuncById(GFXFUNC_MSG_PLAYER_DROPPED);\n        sGame->state++;\n        break;\n    case 1:\n        if (!IsGfxFuncActive())\n            sGame->state++;\n        break;\n    case 2:\n        if (GetPlayAgainState() == PLAY_AGAIN_DROPPED)\n            sGame->state++;\n        break;\n    default:\n        if (!gReceivedRemoteLinkPlayers)\n            SetGameFunc(FUNC_EXIT);\n        break;\n    }\n}\n\nstatic void ExitGame(void)\n{\n    switch (sGame->state)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sGame->state++;\n        break;\n    case 1:\n        UpdatePaletteFade();\n        if (!gPaletteFade.active)\n            sGame->state++;\n        break;\n    case 2:\n        FreeBerrySprites();\n        FreeStatusBar();\n        FreeDodrioSprites(sGame->numPlayers);\n        FreeCloudSprites();\n        sExitingGame = TRUE;\n        SetGfxFuncById(GFXFUNC_STOP);\n        sGame->state++;\n        break;\n    default:\n        if (!IsGfxFuncActive())\n        {\n            SetMainCallback2(sGame->exitCallback);\n            DestroyTask(sGame->taskId);\n            Free(sGame);\n            FreeAllWindowBuffers();\n        }\n        break;\n    }\n}\n\nstatic void ResetGame(void)\n{\n    switch (sGame->state)\n    {\n    case 0:\n        SetGfxFuncById(GFXFUNC_IDLE);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sGame->state++;\n        break;\n    case 1:\n        UpdatePaletteFade();\n        if (!gPaletteFade.active)\n            sGame->state++;\n        break;\n    case 2:\n        ChangeBgX(0, 0, BG_COORD_SET);\n        ChangeBgY(0, 0, BG_COORD_SET);\n        ChangeBgX(1, 0, BG_COORD_SET);\n        ChangeBgY(1, 0, BG_COORD_SET);\n        ChangeBgX(2, 0, BG_COORD_SET);\n        ChangeBgY(2, 0, BG_COORD_SET);\n        ChangeBgX(3, 0, BG_COORD_SET);\n        ChangeBgY(3, 0, BG_COORD_SET);\n        sGame->state++;\n        break;\n    case 3:\n        StopMapMusic();\n        sGame->state++;\n        break;\n    case 4:\n        PlayNewMapMusic(MUS_BERRY_PICK);\n        StartCloudMovement();\n        sGame->state++;\n        break;\n    case 5:\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        sGame->state++;\n        break;\n    case 6:\n        UpdatePaletteFade();\n        if (!gPaletteFade.active)\n            sGame->state++;\n        break;\n    default:\n        DestroyTask(sGame->taskId);\n        CreateDodrioGameTask(Task_NewGameIntro);\n        ResetGfxState();\n        InitDodrioGame(sGame);\n        if (!gReceivedRemoteLinkPlayers)\n            sGame->numPlayers = 1;\n        SetRandomPrize();\n        SetCloudInvisibility(FALSE);\n        break;\n    }\n}\n\nstatic void Task_NewGameIntro(u8 taskId)\n{\n    switch (sGame->state)\n    {\n    case 0:\n        if (SlideTreeBordersOut() == TRUE)\n            sGame->state++;\n        break;\n    case 1:\n        InitStatusBarPos();\n        sGame->state++;\n        break;\n    case 2:\n        if (DoStatusBarIntro() == TRUE)\n            sGame->state++;\n        break;\n    default:\n        if (sGame->isLeader)\n            CreateDodrioGameTask(Task_DodrioGame_Leader);\n        else\n            CreateDodrioGameTask(Task_DodrioGame_Member);\n        DestroyTask(taskId);\n        break;\n    }\n}\n\n#define tState data[0]\n\nstatic void Task_CommunicateMonInfo(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    u8 i;\n    u8 blockReceivedStatus;\n\n    switch (tState)\n    {\n    case 0:\n        SendBlock(0, &sGame->monInfo[sGame->multiplayerId].isShiny, sizeof(sGame->monInfo[sGame->multiplayerId].isShiny));\n        sGame->playersReceived = 0;\n        tState++;\n        break;\n    case 1:\n        if (IsLinkTaskFinished())\n            tState++;\n        break;\n    case 2:\n        blockReceivedStatus = GetBlockReceivedStatus();\n        for (i = 0; i < sGame->numPlayers; blockReceivedStatus >>= 1, i++)\n        {\n            if (blockReceivedStatus & 1)\n            {\n                *(u8 *)&sGame->monInfo[i] = *(u8 *)gBlockRecvBuffer[i];\n                ResetBlockReceivedFlag(i);\n                sGame->playersReceived++;\n            }\n        }\n        if (sGame->playersReceived >= sGame->numPlayers)\n        {\n            DestroyTask(taskId);\n            SetGfxFuncById(GFXFUNC_ERASE_MSG);\n            sGame->state++;\n        }\n        break;\n    }\n}\n\n#undef tState\n\nstatic void RecvLinkData_Gameplay(void)\n{\n    u8 i;\n    u8 numPlayers = sGame->numPlayers;\n\n    sGame->players[0].receivedGameStatePacket = RecvPacket_GameState(0,\n                                                    &sGame->players[0],\n                                                    &sGame->players[0].comm,\n                                                    &sGame->players[1].comm,\n                                                    &sGame->players[2].comm,\n                                                    &sGame->players[3].comm,\n                                                    &sGame->players[4].comm,\n                                                    &sGame->numGraySquares,\n                                                    &sGame->berriesFalling,\n                                                    &sGame->allReadyToEnd);\n    sGame->clearRecvCmds = TRUE;\n\n    for (i = 1; i < numPlayers; i++)\n    {\n        if (sGame->inputState[i] == INPUTSTATE_NONE && !RecvPacket_PickState(i, &sGame->players[i].comm.pickState))\n        {\n            sGame->players[i].comm.pickState = PICK_NONE;\n            sGame->clearRecvCmds = FALSE;\n        }\n    }\n    if (++sGame->clearRecvCmdTimer >= 60)\n    {\n        if (sGame->clearRecvCmds)\n        {\n            ClearRecvCommands();\n            sGame->clearRecvCmdTimer = 0;\n        }\n        else if (sGame->clearRecvCmdTimer > 70)\n        {\n            ClearRecvCommands();\n            sGame->clearRecvCmdTimer = 0;\n        }\n    }\n\n    for (i = 0; i < numPlayers; i++)\n    {\n        if (sGame->players[i].comm.pickState != PICK_NONE && sGame->inputState[i] == INPUTSTATE_NONE)\n            sGame->inputState[i] = INPUTSTATE_TRY_PICK;\n\n        switch (sGame->inputState[i])\n        {\n        case INPUTSTATE_NONE:\n        default:\n            break;\n        case INPUTSTATE_TRY_PICK:\n        case INPUTSTATE_PICKED:\n        case INPUTSTATE_ATE_BERRY:\n            if (++sGame->inputDelay[i] >= 6)\n            {\n                sGame->inputDelay[i] = 0;\n                sGame->inputState[i] = INPUTSTATE_NONE;\n                sGame->players[i].comm.pickState = PICK_NONE;\n                sGame->players[i].comm.ateBerry = FALSE;\n                sGame->players[i].comm.missedBerry = FALSE;\n            }\n            break;\n        case INPUTSTATE_BAD_MISS:\n            // Tried to pick with no berry in range, long delay until next input\n            if (++sGame->inputDelay[i] >= 40)\n            {\n                sGame->inputDelay[i] = 0;\n                sGame->inputState[i] = INPUTSTATE_NONE;\n                sGame->players[i].comm.pickState = PICK_NONE;\n                sGame->players[i].comm.ateBerry = FALSE;\n                sGame->players[i].comm.missedBerry = FALSE;\n            }\n            break;\n        }\n    }\n}\n\nstatic void RecvLinkData_ReadyToEnd(void)\n{\n    u8 i;\n    u8 numPlayers = sGame->numPlayers;\n\n    sGame->players[0].receivedGameStatePacket = RecvPacket_GameState(0,\n                                                    &sGame->players[0],\n                                                    &sGame->players[0].comm,\n                                                    &sGame->players[1].comm,\n                                                    &sGame->players[2].comm,\n                                                    &sGame->players[3].comm,\n                                                    &sGame->players[4].comm,\n                                                    &sGame->numGraySquares,\n                                                    &sGame->berriesFalling,\n                                                    &sGame->allReadyToEnd);\n    sGame->clearRecvCmds = TRUE;\n\n    for (i = 1; i < numPlayers; i++)\n    {\n        if (RecvPacket_ReadyToEnd(i))\n        {\n            sGame->readyToEnd[i] = TRUE;\n            sGame->clearRecvCmds = FALSE;\n        }\n    }\n    if (++sGame->clearRecvCmdTimer >= 60)\n    {\n        if (sGame->clearRecvCmds)\n        {\n            ClearRecvCommands();\n            sGame->clearRecvCmdTimer = 0;\n        }\n        else if (sGame->clearRecvCmdTimer > 70)\n        {\n            ClearRecvCommands();\n            sGame->clearRecvCmdTimer = 0;\n        }\n    }\n}\n\nstatic void RecvLinkData_Leader(void)\n{\n    switch (sGame->funcId)\n    {\n    case FUNC_WAIT_START:\n        if (AllPlayersReadyToStart() == TRUE)\n        {\n            ResetReadyToStart();\n            sGame->startGame = TRUE;\n        }\n        break;\n    case FUNC_PLAY_GAME:\n        RecvLinkData_Gameplay();\n        break;\n    case FUNC_WAIT_END_GAME:\n        RecvLinkData_ReadyToEnd();\n        break;\n    }\n}\n\nstatic void SendLinkData_Leader(void)\n{\n    switch (sGame->funcId)\n    {\n    case FUNC_PLAY_GAME:\n        SendPacket_GameState(&sGame->player,\n                             &sGame->players[0].comm,\n                             &sGame->players[1].comm,\n                             &sGame->players[2].comm,\n                             &sGame->players[3].comm,\n                             &sGame->players[4].comm,\n                             sGame->numGraySquares,\n                             sGame->berriesFalling,\n                             sGame->allReadyToEnd);\n        break;\n    case FUNC_WAIT_END_GAME:\n        SendPacket_GameState(&sGame->player,\n                             &sGame->players[0].comm,\n                             &sGame->players[1].comm,\n                             &sGame->players[2].comm,\n                             &sGame->players[3].comm,\n                             &sGame->players[4].comm,\n                             sGame->numGraySquares,\n                             sGame->berriesFalling,\n                             sGame->allReadyToEnd);\n        break;\n    }\n}\n\nstatic void RecvLinkData_Member(void)\n{\n    switch (sGame->funcId)\n    {\n    case FUNC_PLAY_GAME:\n        RecvPacket_GameState(sGame->multiplayerId,\n                            &sGame->players[sGame->multiplayerId],\n                            &sGame->players[0].comm,\n                            &sGame->players[1].comm,\n                            &sGame->players[2].comm,\n                            &sGame->players[3].comm,\n                            &sGame->players[4].comm,\n                            &sGame->numGraySquares,\n                            &sGame->berriesFalling,\n                            &sGame->allReadyToEnd);\n        break;\n    case FUNC_WAIT_END_GAME:\n        RecvPacket_GameState(sGame->multiplayerId,\n                            &sGame->players[sGame->multiplayerId],\n                            &sGame->players[0].comm,\n                            &sGame->players[1].comm,\n                            &sGame->players[2].comm,\n                            &sGame->players[3].comm,\n                            &sGame->players[4].comm,\n                            &sGame->numGraySquares,\n                            &sGame->berriesFalling,\n                            &sGame->allReadyToEnd);\n        break;\n    }\n}\n\nstatic void SendLinkData_Member(void)\n{\n    switch (sGame->funcId)\n    {\n    case FUNC_WAIT_START:\n        SendPacket_ReadyToStart(TRUE);\n        sGame->startGame = TRUE;\n        break;\n    case FUNC_PLAY_GAME:\n        if (sGame->player.comm.pickState != PICK_NONE)\n            SendPacket_PickState(sGame->player.comm.pickState);\n        break;\n    case FUNC_WAIT_END_GAME:\n        if (!sGame->berriesFalling && !sGame->allReadyToEnd)\n            SendPacket_ReadyToEnd(TRUE);\n        break;\n    }\n}\n\nstatic void HandleSound_Leader(void)\n{\n    if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE)\n    {\n        if (!IsSEPlaying())\n            sGame->playingPickSound = FALSE;\n    }\n    else if (sGame->players[sGame->multiplayerId].comm.ateBerry == TRUE)\n    {\n        if (!sGame->playingPickSound)\n        {\n            m4aSongNumStop(SE_SUCCESS);\n            PlaySE(SE_SUCCESS);\n            sGame->playingPickSound = TRUE;\n        }\n    }\n    else if (sGame->players[sGame->multiplayerId].comm.missedBerry == TRUE)\n    {\n        if (!sGame->playingPickSound && !IsSEPlaying())\n        {\n            PlaySE(SE_BOO);\n            StartDodrioMissedAnim(1);\n            sGame->playingPickSound = TRUE;\n        }\n    }\n\n    if (sGame->endSoundState == 0 && sGame->numGraySquares >= NUM_STATUS_SQUARES)\n    {\n        // Ready to play game over sound\n        StopMapMusic();\n        sGame->endSoundState = 1;\n    }\n    else if (sGame->endSoundState == 1)\n    {\n        // Play game over sound\n        PlayFanfareByFanfareNum(FANFARE_TOO_BAD);\n        sGame->endSoundState = 2;\n    }\n}\n\nstatic void HandleSound_Member(void)\n{\n    u8 berryStart = sGame->berryColStart;\n    u8 berryEnd = sGame->berryColEnd;\n    u8 i;\n    if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE)\n    {\n        if (sGame->players[sGame->multiplayerId].comm.ateBerry != TRUE\n         && sGame->players[sGame->multiplayerId].comm.missedBerry != TRUE)\n            sGame->playingPickSound = 0;\n    }\n    else if (sGame->players[sGame->multiplayerId].comm.ateBerry == TRUE)\n    {\n        if (!sGame->playingPickSound)\n        {\n            m4aSongNumStop(SE_SUCCESS);\n            PlaySE(SE_SUCCESS);\n            sGame->playingPickSound = TRUE;\n        }\n    }\n    else if (sGame->players[sGame->multiplayerId].comm.missedBerry == TRUE)\n    {\n        if (!sGame->playingPickSound && !IsSEPlaying())\n        {\n            PlaySE(SE_BOO);\n            StartDodrioMissedAnim(1);\n            sGame->playingPickSound = TRUE;\n        }\n    }\n    for (i = berryStart; i < berryEnd; i++)\n    {\n        struct DodrioGame_Berries * berries = &sGame->players[sGame->multiplayerId].berries;\n        if (berries->fallDist[i] >= MAX_FALL_DIST)\n        {\n            if (sGame->playingSquishSound[i] == 0)\n            {\n                PlaySE(SE_BALLOON_RED + berries->ids[i]);\n                sGame->playingSquishSound[i] = TRUE;\n            }\n        }\n        else\n        {\n            sGame->playingSquishSound[i] = FALSE;\n        }\n    }\n    if (sGame->endSoundState == 0 && sGame->numGraySquares >= NUM_STATUS_SQUARES)\n    {\n        // Ready to play game over sound\n        StopMapMusic();\n        sGame->endSoundState = 1;\n    }\n    else if (sGame->endSoundState == 1)\n    {\n        // Play game over sound\n        PlayFanfareByFanfareNum(FANFARE_TOO_BAD);\n        sGame->endSoundState = 2;\n    }\n}\n\nstatic void CB2_DodrioGame(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB_DodrioGame(void)\n{\n    TransferPlttBuffer();\n    LoadOam();\n    ProcessSpriteCopyRequests();\n}\n\nstatic void InitMonInfo(struct DodrioGame_MonInfo * monInfo, struct Pokemon * mon)\n{\n    monInfo->isShiny = IsMonShiny(mon);\n}\n\nstatic void CreateTask_(TaskFunc func, u8 priority)\n{\n    CreateTask(func, priority);\n}\n\nstatic void CreateDodrioGameTask(TaskFunc func)\n{\n    sGame->taskId = CreateTask(func, 1);\n    sGame->state = 0;\n    sGame->startState = 0;\n    sGame->timer = 0;\n}\n\nstatic void SetGameFunc(u8 funcId)\n{\n    sGame->prevFuncId = sGame->funcId;\n    sGame->funcId = funcId;\n    sGame->state = 0;\n    sGame->timer = 0;\n}\n\nstatic bool32 SlideTreeBordersOut(void)\n{\n    u8 x = sGame->timer / 4;\n    sGame->timer++;\n    if (x != 0 && sGame->timer % 4 == 0)\n    {\n        if (x < sTreeBorderXPos[sGame->numPlayers - 1])\n        {\n            // Update position\n            SetGpuReg(REG_OFFSET_BG1HOFS,  (x * 8)); // BG_TREE_LEFT\n            SetGpuReg(REG_OFFSET_BG2HOFS, -(x * 8)); // BG_TREE_RIGHT\n            return FALSE;\n        }\n        else\n        {\n            // Animation finished\n            return TRUE;\n        }\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nstatic void InitFirstWaveOfBerries(void)\n{\n    u8 i;\n    u8 berryStart = sGame->berryColStart;\n    u8 berryEnd = sGame->berryColEnd;\n\n    for (i = berryStart; i < berryEnd; i++)\n    {\n        struct DodrioGame_Berries * berries = &sGame->player.berries;\n        berries->fallDist[i] = (i % 2 == 0) ? 1 : 0;\n        berries->ids[i] = BERRY_BLUE;\n    }\n}\n\n// This function checks every berry and resolves if it should be eaten or not.\n// It's run in a loop that handles moving each individual berry, which means\n// that every time any berry moves, every single berry is checked.\nstatic void HandlePickBerries(void)\n{\n    u8 berryStart = sGame->berryColStart;\n    u8 berryEnd = sGame->berryColEnd;\n    u8 numPlayers = sGame->numPlayers;\n    u8 i, j, k, column;\n\n    // Game is already over\n    if (sGame->numGraySquares >= NUM_STATUS_SQUARES)\n        return;\n\n    for (i = 0; i < numPlayers; i++)\n    {\n        u8 *pickState = &sGame->players[i].comm.pickState;\n        if (*pickState != PICK_NONE && sGame->inputState[i] == INPUTSTATE_TRY_PICK)\n        {\n            // Player is attempting to pick a berry\n            for (j = berryStart; j < berryEnd; j++)\n            {\n                column = sActiveColumnMap[0][0][j];\n\n                // Attempt has already been checked\n                if (sGame->playersAttemptingPick[column][0] == i\n                 || sGame->playersAttemptingPick[column][1] == i)\n                    break;\n\n                // Check berry pick attempt\n                if (TryPickBerry(i, *pickState, column) == TRUE)\n                {\n                    for (k = 0; k < ARRAY_COUNT(sGame->playersAttemptingPick[0]); k++)\n                    {\n                        if (sGame->playersAttemptingPick[column][k] == PLAYER_NONE)\n                        {\n                            sGame->playersAttemptingPick[column][k] = i;\n                            sGame->inputState[i] = INPUTSTATE_PICKED;\n                            sGame->berryState[column] = BERRYSTATE_PICKED;\n                            break;\n                        }\n                    }\n                    break;\n                }\n                if (sGame->players[i].comm.missedBerry == 1)\n                    break;\n            }\n        }\n    }\n\n    for (j = berryStart; j < berryEnd; j++)\n    {\n        u8 playerIdMissed = PLAYER_NONE;\n        column = sActiveColumnMap[0][0][j];\n        if (sGame->berryState[column] == BERRYSTATE_PICKED)\n        {\n            s32 delayRemaining;\n            u8 playerIdPicked, delayStage = sGame->difficulty[GetPlayerIdAtColumn(column)] / 7;\n            if (delayStage >= ARRAY_COUNT(sBerryFallDelays) - 1)\n                delayStage = ARRAY_COUNT(sBerryFallDelays) - 1;\n\n            delayRemaining = sBerryFallDelays[delayStage][sGame->players[0].berries.ids[column]] - sGame->fallTimer[column];\n            if (delayRemaining < 6)\n                sGame->eatTimer[column] += delayRemaining;\n\n            if (++sGame->eatTimer[column] >= 6)\n            {\n                sGame->eatTimer[column] = 0;\n                if (sGame->playersAttemptingPick[column][0] == PLAYER_NONE\n                 && sGame->playersAttemptingPick[column][1] == PLAYER_NONE)\n                {\n                    // No players attempting to pick this berry\n                    continue;\n                }\n                else if (sGame->playersAttemptingPick[column][0] != PLAYER_NONE\n                      && sGame->playersAttemptingPick[column][1] == PLAYER_NONE)\n                {\n                    // One player attempting to pick this berry\n                    playerIdPicked = sGame->playersAttemptingPick[column][0];\n                }\n                else\n                {\n                    // Two players attempting to pick this berry\n                    // Randomly give it to one of them\n                    u8 playerId1 = sGame->playersAttemptingPick[column][0];\n                    i = sGame->playersAttemptingPick[column][1]; // playerId2. Have to re-use the variable to match.\n                    if (!(Random() & 1))\n                    {\n                        playerIdPicked = playerId1;\n                        playerIdMissed = i;\n                    }\n                    else\n                    {\n                        playerIdPicked = i;\n                        playerIdMissed = playerId1;\n                    }\n                }\n\n                // Eat berry\n                sGame->player.berries.fallDist[column] = EAT_FALL_DIST;\n                sGame->berryState[column] = BERRYSTATE_EATEN;\n                sGame->inputState[playerIdPicked] = INPUTSTATE_ATE_BERRY;\n                sGame->berryEatenBy[column] = playerIdPicked;\n                sGame->players[playerIdPicked].comm.ateBerry = TRUE;\n\n\n#ifdef UBFIX\n                if (playerIdMissed != PLAYER_NONE)\n#endif\n                    sGame->players[playerIdMissed].comm.missedBerry = TRUE; // UB: playerIdMissed can be PLAYER_NONE here, which is out of bounds\n\n                sGame->berriesEaten[playerIdPicked]++;\n                IncrementBerryResult(0, column, playerIdPicked);\n                UpdateBerriesPickedInRow(TRUE);\n                TryIncrementDifficulty(playerIdPicked);\n                sGame->prevBerryIds[column] = sGame->player.berries.ids[column];\n                sGame->player.berries.ids[column] = BERRY_MISSED; // Just to clear berry id, wasn't actually missed\n                sGame->playersAttemptingPick[column][0] = PLAYER_NONE;\n                sGame->playersAttemptingPick[column][1] = PLAYER_NONE;\n            }\n        }\n    }\n}\n\nstatic bool32 TryPickBerry(u8 playerId, u8 pickState, u8 column)\n{\n    s32 pick = 0;\n    u8 numPlayersIdx = sGame->numPlayers - 1;\n    struct DodrioGame_Berries * berries = &sGame->player.berries;\n\n    switch (pickState)\n    {\n    case PICK_LEFT:\n    default:\n        pick = 0;\n        break;\n    case PICK_MIDDLE:\n        pick = 1;\n        break;\n    case PICK_RIGHT:\n        pick = 2;\n        break;\n    }\n\n    // Check if berry is within range to be picked\n    if (berries->fallDist[column] == EAT_FALL_DIST - 1 || berries->fallDist[column] == EAT_FALL_DIST)\n    {\n        // Check if this berry is the one the player is trying to pick\n        if (column == sDodrioHeadToColumnMap[numPlayersIdx][playerId][pick])\n        {\n            // Check if berry has been picked/eaten by another player\n            if (sGame->berryState[column] == BERRYSTATE_PICKED || sGame->berryState[column] == BERRYSTATE_EATEN)\n            {\n                // Missed berry, picked by someone else\n                sGame->players[playerId].comm.missedBerry = TRUE;\n                return FALSE;\n            }\n            else\n            {\n                // Successfully picked berry\n                return TRUE;\n            }\n        }\n    }\n    else\n    {\n        // Check if this berry is the one the player is trying to pick\n        if (column == sDodrioHeadToColumnMap[numPlayersIdx][playerId][pick])\n        {\n            // Missed berry, out of range\n            sGame->inputState[playerId] = INPUTSTATE_BAD_MISS;\n            sGame->players[playerId].comm.missedBerry = TRUE;\n        }\n    }\n    return FALSE;\n}\n\nstatic void UpdateFallingBerries(void)\n{\n    u8 berryStart = sGame->berryColStart;\n    u8 berryEnd = sGame->berryColEnd;\n    u8 delayStage = 0;\n    u8 otherBerryMissed = 0;\n    u8 i;\n\n    sGame->berriesFalling = FALSE;\n\n    for (i = berryStart; i < berryEnd - 1; i++)\n    {\n        struct DodrioGame * game = sGame;\n\n        if (sGame->berryState[i] == BERRYSTATE_NONE || sGame->berryState[i] == BERRYSTATE_PICKED)\n        {\n            sGame->berriesFalling = TRUE;\n\n            if (game->player.berries.fallDist[i] >= MAX_FALL_DIST)\n            {\n                // Berry hit the ground\n                game->player.berries.fallDist[i] = MAX_FALL_DIST;\n                sGame->berryState[i] = BERRYSTATE_SQUISHED;\n                if (!sGame->playingSquishSound[i])\n                {\n                    sGame->playingSquishSound[i] = TRUE;\n                    PlaySE(SE_BALLOON_RED + game->player.berries.ids[i]);\n                }\n                if (sGame->numGraySquares < NUM_STATUS_SQUARES || otherBerryMissed == TRUE)\n                {\n                    otherBerryMissed = TRUE;\n                    sGame->playingSquishSound[i] = FALSE;\n                    if (sGame->numGraySquares < NUM_STATUS_SQUARES)\n                        sGame->numGraySquares++;\n                    IncrementBerryResult(BERRY_MISSED, i, 0);\n                    UpdateBerriesPickedInRow(FALSE);\n                }\n            }\n            else\n            {\n                // Berry is still falling\n                u8 delay;\n                delayStage = sGame->difficulty[GetPlayerIdAtColumn(i)] / NUM_DIFFICULTIES;\n                if (delayStage >= ARRAY_COUNT(sBerryFallDelays) - 1)\n                    delayStage = ARRAY_COUNT(sBerryFallDelays) - 1;\n\n                delay = sBerryFallDelays[delayStage][game->player.berries.ids[i]];\n                if (++sGame->fallTimer[i] >= delay)\n                {\n                    game->player.berries.fallDist[i]++;\n                    sGame->fallTimer[i] = 0;\n                }\n                HandlePickBerries();\n            }\n        }\n        else if (sGame->berryState[i] == BERRYSTATE_EATEN)\n        {\n            // Berry has been eaten, wait and create a new berry\n            if (++sGame->newBerryTimer[i] >= 20)\n            {\n                sGame->players[sGame->berryEatenBy[i]].comm.ateBerry = FALSE;\n                sGame->newBerryTimer[i] = 0;\n                sGame->fallTimer[i] = 0;\n                sGame->berryState[i] = BERRYSTATE_NONE;\n                game->player.berries.fallDist[i] = 1;\n                game->player.berries.ids[i] = GetNewBerryId(GetPlayerIdAtColumn(i), i);\n            }\n        }\n        else if (sGame->berryState[i] == BERRYSTATE_SQUISHED)\n        {\n            // Berry has already hit the ground, wait and create a new berry\n            if (++sGame->newBerryTimer[i] >= 20)\n            {\n                if (sGame->numGraySquares < NUM_STATUS_SQUARES)\n                {\n                    sGame->newBerryTimer[i] = 0;\n                    sGame->fallTimer[i] = 0;\n                    sGame->berryState[i] = BERRYSTATE_NONE;\n                    game->player.berries.fallDist[i] = 1;\n                    sGame->prevBerryIds[i] = game->player.berries.ids[i];\n                    game->player.berries.ids[i] = GetNewBerryId(GetPlayerIdAtColumn(i), i);\n                }\n            }\n        }\n    }\n}\n\nstatic void UpdateBerrySprites(void)\n{\n    u8 i;\n    u8 berryStart = sGame->berryColStart;\n    u8 berryEnd = sGame->berryColEnd;\n\n    for (i = berryStart; i < berryEnd; i++)\n    {\n        struct DodrioGame_Player * player = &sGame->players[sGame->multiplayerId];\n        u8 column = sActiveColumnMap[sGame->numPlayers - 1][sGame->multiplayerId][i];\n\n        if (player->berries.fallDist[column] != 0)\n            SetBerryInvisibility(i, FALSE);\n        else\n            SetBerryInvisibility(i, TRUE);\n\n        if (player->berries.fallDist[column] >= MAX_FALL_DIST)\n        {\n            // Berry was missed, set squished anim\n            SetBerryAnim(i, player->berries.ids[column] + BERRY_MISSED);\n            SetBerryYPos(i, player->berries.fallDist[column] * 2 - 1);\n        }\n        else if (player->berries.ids[column] == 3)\n        {\n            // Berry was picked, set eaten anim\n            player->berries.fallDist[column] = EAT_FALL_DIST;\n            SetBerryAnim(i, ANIM_EATEN);\n            SetBerryYPos(i, player->berries.fallDist[column] * 2 - 1);\n        }\n        else\n        {\n            // Berry is still falling\n            SetBerryAnim(i, player->berries.ids[column]);\n            SetBerryYPos(i, player->berries.fallDist[column] * 2);\n        }\n    }\n}\n\nstatic void UpdateAllDodrioAnims(void)\n{\n    u8 i;\n    u8 numPlayers = sGame->numPlayers;\n\n    for (i = 0; i < numPlayers; i++)\n    {\n        struct DodrioGame_Player * player = &sGame->players[i];\n        SetDodrioAnim(i, player->comm.pickState);\n    }\n}\n\nstatic void SetAllDodrioDisabled(void)\n{\n    u8 i;\n    u8 numPlayers = sGame->numPlayers;\n\n    for (i = 0; i < numPlayers; i++)\n        SetDodrioAnim(i, PICK_DISABLED);\n}\n\nstatic void UpdateGame_Leader(void)\n{\n    UpdateBerrySprites();\n    if (sGame->numGraySquares >= NUM_STATUS_SQUARES)\n        SetAllDodrioDisabled();\n    else\n        UpdateAllDodrioAnims();\n\n    UpdateStatusBarAnim(sGame->numGraySquares);\n}\n\n// Identical to UpdateGame_Leader\nstatic void UpdateGame_Member(void)\n{\n    UpdateBerrySprites();\n    if (sGame->numGraySquares >= NUM_STATUS_SQUARES)\n        SetAllDodrioDisabled();\n    else\n        UpdateAllDodrioAnims();\n\n    UpdateStatusBarAnim(sGame->numGraySquares);\n}\n\nstatic void GetActiveBerryColumns(u8 numPlayers, u8 *start, u8 *end)\n{\n    switch (numPlayers)\n    {\n    case 1:\n        *start = 4, *end = 7;\n        break;\n    case 2:\n        *start = 3, *end = 8;\n        break;\n    case 3:\n        *start = 2, *end = 9;\n        break;\n    case 4:\n        *start = 1, *end = 10;\n        break;\n    case 5:\n        *start = 0, *end = 11;\n        break;\n    }\n}\n\nstatic bool32 AllPlayersReadyToStart(void)\n{\n    u8 i;\n    u8 numPlayers = sGame->numPlayers;\n\n    for (i = 1; i < numPlayers; i++)\n    {\n        if (sGame->readyToStart[i] == FALSE)\n            sGame->readyToStart[i] = RecvPacket_ReadyToStart(i);\n    }\n\n    numPlayers = numPlayers; // Needed to force compiler to keep loop below\n\n#ifdef BUGFIX\n    i = 1; // i isn't reset, loop below never runs. As a result, game can begin before all players ready\n#endif\n    for (; i < numPlayers; i++)\n    {\n        if (!sGame->readyToStart[i])\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic void ResetReadyToStart(void)\n{\n    u8 i;\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n        sGame->readyToStart[i] = FALSE;\n}\n\nstatic bool32 ReadyToEndGame_Leader(void)\n{\n    if (sGame->numGraySquares >= NUM_STATUS_SQUARES && !sGame->berriesFalling)\n    {\n        sGame->numGraySquares = NUM_STATUS_SQUARES;\n        if (sGame->allReadyToEnd != 0)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool32 ReadyToEndGame_Member(void)\n{\n    u8 i, berryStart, berryEnd;\n\n    if (sGame->numGraySquares >= NUM_STATUS_SQUARES)\n    {\n        berryStart = sGame->berryColStart;\n        berryEnd = sGame->berryColEnd;\n        sGame->numGraySquares = NUM_STATUS_SQUARES;\n        if (sGame->allReadyToEnd)\n        {\n            for (i = berryStart; i < berryEnd; i++)\n            {\n                struct DodrioGame_Player * player = &sGame->players[sGame->multiplayerId];\n                u8 column = sActiveColumnMap[sGame->numPlayers - 1][sGame->multiplayerId][i];\n\n                if (player->berries.fallDist[column] != MAX_FALL_DIST)\n                    return FALSE;\n            }\n            return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nstatic void TryIncrementDifficulty(u8 playerId)\n{\n    u8 threshold = sDifficultyThresholds[sGame->difficulty[playerId] % NUM_DIFFICULTIES] + (sGame->difficulty[playerId] / NUM_DIFFICULTIES) * 100;\n    if (sGame->berriesEaten[playerId] >= threshold)\n        sGame->difficulty[playerId]++;\n}\n\nstatic u8 GetPlayerIdAtColumn(u8 column)\n{\n    return sPlayerIdAtColumn[sGame->numPlayers - 1][column];\n}\n\n// Get a berry id for when a new falling berry is created.\n// What type of berry it is depends on the current difficulty\n// level of players who can pick berries from that column.\nstatic u8 GetNewBerryId(u8 playerId, u8 column)\n{\n    u8 i, highestDifficulty;\n    u8 numPlayersIdx = sGame->numPlayers - 1;\n    u8 leftPlayer = sDodrioNeighborMap[numPlayersIdx][playerId][0];\n    u8 middlePlayer = sDodrioNeighborMap[numPlayersIdx][playerId][1];\n    u8 rightPlayer = sDodrioNeighborMap[numPlayersIdx][playerId][2];\n\n    for (i = 0; sUnsharedColumns[numPlayersIdx][i] != 0; i++)\n    {\n        // If only one player can use this column, just use their difficulty\n        if (column == sUnsharedColumns[numPlayersIdx][i])\n            return GetNewBerryIdByDifficulty(sGame->difficulty[middlePlayer], column);\n    }\n\n    // This column is shared, get the highest difficulty of adjacent players\n    if (sGame->difficulty[leftPlayer] > sGame->difficulty[middlePlayer])\n        highestDifficulty = sGame->difficulty[leftPlayer];\n    else\n        highestDifficulty = sGame->difficulty[middlePlayer];\n\n    if (sGame->difficulty[rightPlayer] > highestDifficulty)\n        highestDifficulty = sGame->difficulty[rightPlayer];\n\n    return GetNewBerryIdByDifficulty(highestDifficulty, column);\n}\n\n// The berry types cycle through different distributions depending on the difficulty\nstatic u8 GetNewBerryIdByDifficulty(u8 difficulty, u8 column)\n{\n    u8 prevBerryId = sGame->prevBerryIds[column];\n    switch (difficulty % NUM_DIFFICULTIES)\n    {\n    default: return BERRY_BLUE;\n    case 0:  return BERRY_BLUE;\n    case 1:  return BERRY_GREEN;\n    case 2:  return BERRY_GOLD;\n    case 3:\n        if (prevBerryId == BERRY_BLUE)\n            return BERRY_GREEN;\n        else\n            return BERRY_BLUE;\n    case 4:\n        if (prevBerryId == BERRY_BLUE)\n            return BERRY_GOLD;\n        else\n            return BERRY_BLUE;\n    case 5:\n        if (prevBerryId == BERRY_GOLD)\n            return BERRY_GREEN;\n        else\n            return BERRY_GOLD;\n    case 6:\n        if (prevBerryId == BERRY_BLUE)\n            return BERRY_GREEN;\n        else if (prevBerryId == BERRY_GREEN)\n            return BERRY_GOLD;\n        else\n            return BERRY_BLUE;\n    }\n}\n\n// Despite being set up to take a berry id as an argument, this\n// function is only ever given BERRY_BLUE or BERRY_MISSED.\n// It reads the actual berry id (if necessary) from ids\nstatic void IncrementBerryResult(u8 berryIdArg, u8 column, u8 playerId)\n{\n    u8 berryId;\n    u8 numPlayers = sGame->numPlayers;\n    switch (berryIdArg)\n    {\n    case BERRY_BLUE:\n    case BERRY_GREEN:\n    case BERRY_GOLD:\n        berryId = sGame->players[0].berries.ids[column];\n        sGame->berryResults[playerId][berryId] = IncrementWithLimit(sGame->berryResults[playerId][berryId], 20000);\n        break;\n    case BERRY_MISSED:\n        switch (numPlayers)\n        {\n        case 5:\n            switch (column)\n            {\n            case 0:\n                sGame->berryResults[2][BERRY_MISSED]++;\n                sGame->berryResults[3][BERRY_MISSED]++;\n                break;\n            case 1:\n                sGame->berryResults[3][BERRY_MISSED]++;\n                break;\n            case 2:\n                sGame->berryResults[3][BERRY_MISSED]++;\n                sGame->berryResults[4][BERRY_MISSED]++;\n                break;\n            case 3:\n                sGame->berryResults[4][BERRY_MISSED]++;\n                break;\n            case 4:\n                sGame->berryResults[4][BERRY_MISSED]++;\n                sGame->berryResults[0][BERRY_MISSED]++;\n                break;\n            case 5:\n                sGame->berryResults[0][BERRY_MISSED]++;\n                break;\n            case 6:\n                sGame->berryResults[0][BERRY_MISSED]++;\n                sGame->berryResults[1][BERRY_MISSED]++;\n                break;\n            case 7:\n                sGame->berryResults[1][BERRY_MISSED]++;\n                break;\n            case 8:\n                sGame->berryResults[1][BERRY_MISSED]++;\n                sGame->berryResults[2][BERRY_MISSED]++;\n                break;\n            case 9:\n                sGame->berryResults[2][BERRY_MISSED]++;\n                break;\n            }\n            break;\n        case 4:\n            switch (column)\n            {\n            case 1:\n                sGame->berryResults[2][BERRY_MISSED]++;\n                sGame->berryResults[3][BERRY_MISSED]++;\n                break;\n            case 2:\n                sGame->berryResults[3][BERRY_MISSED]++;\n                break;\n            case 3:\n                sGame->berryResults[3][BERRY_MISSED]++;\n                sGame->berryResults[0][BERRY_MISSED]++;\n                break;\n            case 4:\n                sGame->berryResults[0][BERRY_MISSED]++;\n                break;\n            case 5:\n                sGame->berryResults[0][BERRY_MISSED]++;\n                sGame->berryResults[1][BERRY_MISSED]++;\n                break;\n            case 6:\n                sGame->berryResults[1][BERRY_MISSED]++;\n                break;\n            case 7:\n                sGame->berryResults[1][BERRY_MISSED]++;\n                sGame->berryResults[2][BERRY_MISSED]++;\n                break;\n            case 8:\n                sGame->berryResults[2][BERRY_MISSED]++;\n                break;\n            }\n            break;\n        case 3:\n            switch (column)\n            {\n            case 2:\n                sGame->berryResults[1][BERRY_MISSED]++;\n                sGame->berryResults[2][BERRY_MISSED]++;\n                break;\n            case 3:\n                sGame->berryResults[2][BERRY_MISSED]++;\n                break;\n            case 4:\n                sGame->berryResults[2][BERRY_MISSED]++;\n                sGame->berryResults[0][BERRY_MISSED]++;\n                break;\n            case 5:\n                sGame->berryResults[0][BERRY_MISSED]++;\n                break;\n            case 6:\n                sGame->berryResults[0][BERRY_MISSED]++;\n                sGame->berryResults[1][BERRY_MISSED]++;\n                break;\n            case 7:\n                sGame->berryResults[1][BERRY_MISSED]++;\n                break;\n            }\n            break;\n        case 2:\n            switch (column)\n            {\n            case 3:\n                sGame->berryResults[0][BERRY_MISSED]++;\n                sGame->berryResults[1][BERRY_MISSED]++;\n                break;\n            case 4:\n                sGame->berryResults[0][BERRY_MISSED]++;\n                break;\n            case 5:\n                sGame->berryResults[0][BERRY_MISSED]++;\n                sGame->berryResults[1][BERRY_MISSED]++;\n                break;\n            case 6:\n                sGame->berryResults[1][BERRY_MISSED]++;\n                break;\n            }\n            break;\n        }\n        break;\n    }\n}\n\nstatic void UpdateBerriesPickedInRow(bool32 picked)\n{\n    // The 'berries picked in row' stat is only\n    // counted for games with all 5 players\n    if (sGame->numPlayers != MAX_RFU_PLAYERS)\n        return;\n\n    if (picked == TRUE)\n    {\n        if (++sGame->berriesPickedInRow > sGame->maxBerriesPickedInRow)\n            sGame->maxBerriesPickedInRow = sGame->berriesPickedInRow;\n        if (sGame->berriesPickedInRow > MAX_BERRIES)\n            sGame->berriesPickedInRow = MAX_BERRIES;\n    }\n    else // missed\n    {\n        if (sGame->berriesPickedInRow > sGame->maxBerriesPickedInRow)\n            sGame->maxBerriesPickedInRow = sGame->berriesPickedInRow;\n        sGame->berriesPickedInRow = 0;\n    }\n}\n\nstatic void SetMaxBerriesPickedInRow(void)\n{\n    u8 i;\n    for (i = 0; i < sGame->numPlayers; i++)\n        sGame->berryResults[i][BERRY_IN_ROW] = sGame->maxBerriesPickedInRow;\n}\n\nstatic void ResetForPlayAgainPrompt(void)\n{\n    u8 i, j;\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        for (j = 0; j < NUM_BERRY_COLUMNS; j++)\n            sGame->players[i].berries.fallDist[j] = 0;\n        sGame->players[i].comm.pickState = PICK_NONE;\n        sGame->players[i].comm.ateBerry = FALSE;\n        sGame->difficulty[i] = 0;\n        sGame->berriesEaten[i] = 0;\n        sGame->scoreResults[i].ranking = 0;\n        sGame->scoreResults[i].score = 0;\n        sGame->berryResults[i][BERRY_BLUE] = 0;\n        sGame->berryResults[i][BERRY_GREEN] = 0;\n        sGame->berryResults[i][BERRY_GOLD] = 0;\n        sGame->berryResults[i][BERRY_MISSED] = 0;\n        sGame->berryResults[i][BERRY_PRIZE] = 0;\n        sGame->berryResults[i][BERRY_IN_ROW] = 0;\n    }\n    sGame->endSoundState = 0;\n    sGame->berriesPickedInRow = 0;\n    sGame->numGraySquares = 0;\n    UpdateAllDodrioAnims();\n    UpdateBerrySprites();\n}\n\nstatic const s16 sBerryScoreMultipliers[] =\n{\n    [BERRY_BLUE]   = 10,\n    [BERRY_GREEN]  = 30,\n    [BERRY_GOLD]   = 50,\n    [BERRY_MISSED] = 50 // Subtracted\n};\n\n\nstatic void SetRandomPrize(void)\n{\n    u8 i, prizeSet = 0, prizeIdx = 0;\n\n    switch (sGame->numPlayers)\n    {\n    case 4:  prizeSet = 1; break;\n    case 5:  prizeSet = 2; break;\n    }\n\n    prizeIdx = Random() % ARRAY_COUNT(sPrizeBerryIds[0]);;\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n        sGame->berryResults[i][BERRY_PRIZE] = sPrizeBerryIds[prizeSet][prizeIdx];\n}\n\nstatic u32 GetBerriesPicked(u8 playerId)\n{\n    u32 sum = sGame->berryResults[playerId][BERRY_BLUE]\n            + sGame->berryResults[playerId][BERRY_GREEN]\n            + sGame->berryResults[playerId][BERRY_GOLD];\n    return min(sum, MAX_BERRIES);\n}\n\nstatic void TryUpdateRecords(void)\n{\n    u32 berriesPicked = Min(GetBerriesPicked(sGame->multiplayerId), MAX_BERRIES); // Min here is redundant\n    u32 score = Min(GetScore(sGame->multiplayerId), MAX_SCORE);\n\n    if (gSaveBlock2Ptr->berryPick.bestScore < score)\n        gSaveBlock2Ptr->berryPick.bestScore = score;\n    if (gSaveBlock2Ptr->berryPick.berriesPicked < berriesPicked)\n        gSaveBlock2Ptr->berryPick.berriesPicked = berriesPicked;\n    if (gSaveBlock2Ptr->berryPick.berriesPickedInRow < sGame->maxBerriesPickedInRow)\n        gSaveBlock2Ptr->berryPick.berriesPickedInRow = sGame->maxBerriesPickedInRow;\n}\n\n// Enqueue the given state, and dequeue and return\n// the state that should be used next\nstatic u8 UpdatePickStateQueue(u8 pickState)\n{\n    u8 i, nextState;\n\n    nextState = sGame->pickStateQueue[ARRAY_COUNT(sGame->pickStateQueue) - 1];\n    for (i = ARRAY_COUNT(sGame->pickStateQueue) - 1; i != 0; i--)\n        sGame->pickStateQueue[i] = sGame->pickStateQueue[i - 1];\n    sGame->pickStateQueue[0] = pickState;\n    return nextState;\n}\n\n// The player may extend their Dodrio's heads while they wait for\n// other players to respond to the \"Play again?\" prompt\nstatic void HandleWaitPlayAgainInput(void)\n{\n    if (sGame->inputDelay[sGame->multiplayerId] == 0)\n    {\n        if (JOY_NEW(DPAD_UP))\n        {\n            sGame->players[sGame->multiplayerId].comm.pickState = PICK_MIDDLE;\n            sGame->inputDelay[sGame->multiplayerId] = 6;\n            PlaySE(SE_M_CHARM);\n        }\n        else if (JOY_NEW(DPAD_LEFT))\n        {\n            sGame->players[sGame->multiplayerId].comm.pickState = PICK_LEFT;\n            sGame->inputDelay[sGame->multiplayerId] = 6;\n            PlaySE(SE_M_CHARM);\n        }\n        else if (JOY_NEW(DPAD_RIGHT))\n        {\n            sGame->players[sGame->multiplayerId].comm.pickState = PICK_RIGHT;\n            sGame->inputDelay[sGame->multiplayerId] = 6;\n            PlaySE(SE_M_CHARM);\n        }\n        else\n        {\n            sGame->players[sGame->multiplayerId].comm.pickState = PICK_NONE;\n        }\n    }\n    else\n    {\n        sGame->inputDelay[sGame->multiplayerId]--;\n    }\n}\n\nstatic void ResetPickState(void)\n{\n    sGame->players[sGame->multiplayerId].comm.pickState = PICK_NONE;\n}\n\nstatic u16 GetPrizeItemId(void)\n{\n    return sGame->berryResults[sGame->multiplayerId][BERRY_PRIZE] + FIRST_BERRY_INDEX;\n}\n\nstatic u8 GetNumPlayers(void)\n{\n    return sGame->numPlayers;\n}\n\nstatic u8 *GetPlayerName(u8 id)\n{\n    if (gReceivedRemoteLinkPlayers)\n        return gLinkPlayers[id].name;\n    else\n        return sGame->players[id].name;\n}\n\nstatic u16 GetBerryResult(u8 playerId, u8 berryId)\n{\n    return sGame->berryResults[playerId][berryId];\n}\n\nstatic u32 GetScore(u8 playerId)\n{\n    u8 i;\n    u32 scoreLost, score = 0;\n\n    // Sum up points for berries picked\n    for (i = 0; i < BERRY_MISSED; i++)\n        score += sGame->berryResults[playerId][i] * sBerryScoreMultipliers[i];\n\n    // Get points lost for berries missed\n    scoreLost = sGame->berryResults[playerId][BERRY_MISSED] * sBerryScoreMultipliers[BERRY_MISSED];\n    \n    if (score <= scoreLost)\n        return 0;\n    else\n        return score - scoreLost;\n}\n\nstatic u32 GetHighestScore(void)\n{\n    u8 i, numPlayers = sGame->numPlayers;\n    u32 highestScore = GetScore(0);\n\n    for (i = 1; i < numPlayers; i++)\n    {\n        u32 score = GetScore(i);\n        if (score > highestScore)\n            highestScore = score;\n    }\n    return Min(highestScore, MAX_SCORE);\n}\n\nstatic u32 GetHighestBerryResult(u8 berryId)\n{\n    u8 i, numPlayers = sGame->numPlayers;\n    u16 highestResult = sGame->berryResults[0][berryId];\n\n    for (i = 0; i < numPlayers; i++)\n    {\n        u16 result = sGame->berryResults[i][berryId];\n        if (result > highestResult)\n            highestResult = result;\n    }\n    return highestResult;\n}\n\nstatic u32 GetScoreByRanking(u8 ranking)\n{\n    u32 scores[MAX_RFU_PLAYERS], temp;\n    s16 unsorted = TRUE;\n    u8 i, numPlayers = sGame->numPlayers;\n\n    for (i = 0; i < numPlayers; i++)\n        scores[i] = temp = GetScore(i);\n\n    // Sort the scores in the array highest to lowest\n    while (unsorted)\n    {\n        unsorted = FALSE;\n        for (i = 0; i < numPlayers - 1; i++)\n        {\n            if (scores[i] < scores[i + 1])\n            {\n                SWAP(scores[i], scores[i + 1], temp);\n                unsorted = TRUE;\n            }\n        }\n    }\n\n    return scores[ranking];\n}\n\nstatic u32 SetScoreResults(void)\n{\n    u8 i, ranking = 0, nextRanking = 0, playersRanked = 0;\n    u8 numPlayers = sGame->numPlayers;\n\n    GetHighestScore(); // Useless call\n\n    if (GetHighestScore() == 0)\n    {\n        // No one scored any points, put everyone in last place with a score of 0.\n        // Presumably this was supposed to then return, as the assignments in this\n        // loop are then overwritten by the rest of the function\n        for (i = 0; i < numPlayers; i++)\n        {\n            sGame->scoreResults[i].ranking = MAX_RFU_PLAYERS - 1;;\n            sGame->scoreResults[i].score = 0;\n        }\n    }\n\n    // Set scores\n    for (i = 0; i < numPlayers; i++)\n        sGame->scoreResults[i].score = Min(GetScore(i), MAX_SCORE);\n\n    // Set rankings\n    do\n    {\n        u32 score = GetScoreByRanking(ranking);\n        u8 curRanking = nextRanking;\n\n        // Find all players with the score for this ranking.\n        // Increment nextRanking but not curRanking to allow\n        // for ties\n        for (i = 0; i < numPlayers; i++)\n        {\n            if (score == sGame->scoreResults[i].score)\n            {\n                sGame->scoreResults[i].ranking = curRanking;\n                nextRanking++;\n                playersRanked++;\n            }\n        }\n        ranking = nextRanking;\n    } while (playersRanked < numPlayers);\n\n    return 0;\n}\n\nstatic void GetScoreResults(struct DodrioGame_ScoreResults * dst, u8 playerId)\n{\n    *dst = sGame->scoreResults[playerId];\n}\n\n// Unused\n// Returns where the specified player's score ranks, 0 being first (highest score)\nstatic u8 GetScoreRanking(u8 playerId)\n{\n    u8 i, ranking = 0;\n    u8 numPlayers = sGame->numPlayers;\n    u32 playersScore, scores[MAX_RFU_PLAYERS] = {0};\n\n    for (i = 0; i < numPlayers; i++)\n        scores[i] = GetScore(i);\n\n    playersScore = scores[playerId];\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        if (i != playerId && playersScore < scores[i])\n            ranking++;\n    }\n\n    return ranking;\n}\n\nenum {\n    PRIZE_RECEIVED,\n    PRIZE_FILLED_BAG,\n    PRIZE_NO_ROOM,\n    NO_PRIZE,\n};\n\nstatic u8 TryGivePrize(void)\n{\n    u8 multiplayerId = sGame->multiplayerId;\n    u16 itemId = GetPrizeItemId();\n\n    if (GetScore(multiplayerId) != GetHighestScore())\n        return NO_PRIZE;\n    if (!CheckBagHasSpace(itemId, 1))\n        return PRIZE_NO_ROOM;\n\n    AddBagItem(itemId, 1);\n    if (!CheckBagHasSpace(itemId, 1))\n        return PRIZE_FILLED_BAG;\n    return PRIZE_RECEIVED;\n}\n\nstatic u32 IncrementWithLimit(u32 num, u32 max)\n{\n    if (num < max)\n        return num + 1;\n    else\n        return max;\n}\n\nstatic u32 Min(u32 a, u32 b)\n{\n    if (a < b)\n        return a;\n    else\n        return b;\n}\n\nstatic u8 GetPlayerIdByPos(u8 id)\n{\n    return sGame->posToPlayerId[id];\n}\n\nvoid IsDodrioInParty(void)\n{\n    int i;\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES)\n            && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) == SPECIES_DODRIO)\n        {\n            gSpecialVar_Result = TRUE;\n            return;\n        }\n    }\n\n    gSpecialVar_Result = FALSE;\n}\n\n#define NUM_RECORD_TYPES 3\n\nvoid ShowDodrioBerryPickingRecords(void)\n{\n    u8 taskId = CreateTask(Task_ShowDodrioBerryPickingRecords, 0);\n    Task_ShowDodrioBerryPickingRecords(taskId);\n}\n\nstatic const struct WindowTemplate sWindowTemplates_Records =\n{\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 1,\n    .width = 28,\n    .height = 11,\n    .paletteNum = 15,\n    .baseBlock = 1,\n};\n\nstatic const u8 *const sRecordsTexts[NUM_RECORD_TYPES + 1] = {gText_BerryPickingRecords, gText_BerriesPicked, gText_BestScore, gText_BerriesInRowFivePlayers};\nstatic const u8 sRecordNumMaxDigits[NUM_RECORD_TYPES] = {4, 7, 4};\n\nALIGNED(4)\nstatic const u8 sRecordTextYCoords[NUM_RECORD_TYPES][2] = {{24}, {40}, {56}};\nstatic const u8 sRecordNumYCoords[NUM_RECORD_TYPES][2] = {{24}, {40}, {70}};\n\n#define tState    data[0]\n#define tWindowId data[1]\n\nstatic void Task_ShowDodrioBerryPickingRecords(u8 taskId)\n{\n    struct WindowTemplate window;\n    s32 i, width, widthCurr;\n    s16 *data = gTasks[taskId].data;\n\n    switch (tState)\n    {\n    case 0:\n        tWindowId = AddWindow(&sWindowTemplates_Records);\n        PrintRecordsText(tWindowId);\n        CopyWindowToVram(tWindowId, COPYWIN_FULL);\n        tState++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            tState++;\n        break;\n    case 2:\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n        {\n            rbox_fill_rectangle(tWindowId);\n            CopyWindowToVram(tWindowId, COPYWIN_MAP);\n            tState++;\n        }\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            RemoveWindow(tWindowId);\n            DestroyTask(taskId);\n            ScriptContext_Enable();\n        }\n        break;\n    }\n}\n\n#undef tState\n#undef tWindowId\n\nstatic void PrintRecordsText(u8 windowId)\n{\n    s32 i, x, numWidth;\n    s32 recordNums[NUM_RECORD_TYPES];\n    u8 strbuf[20];\n    recordNums[0] = gSaveBlock2Ptr->berryPick.berriesPicked;\n    recordNums[1] = gSaveBlock2Ptr->berryPick.bestScore;\n    recordNums[2] = gSaveBlock2Ptr->berryPick.berriesPickedInRow;\n\n    LoadStdWindowGfx(windowId, 0x21D, BG_PLTT_ID(13));\n    DrawTextBorderOuter(windowId, 0x21D, 13);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    AddTextPrinterParameterized(windowId, FONT_NORMAL, sRecordsTexts[0], 1, 1, TEXT_SKIP_DRAW, NULL);\n    for (i = 0; i < NUM_RECORD_TYPES; i++)\n    {\n        ConvertIntToDecimalStringN(strbuf, recordNums[i], STR_CONV_MODE_LEFT_ALIGN, sRecordNumMaxDigits[i]);\n        numWidth = GetStringWidth(FONT_NORMAL, strbuf, -1);\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, sRecordsTexts[i + 1], 1, sRecordTextYCoords[i][0], TEXT_SKIP_DRAW, NULL);\n        x = DISPLAY_WIDTH - 16 - numWidth;\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, strbuf, x, sRecordNumYCoords[i][0], TEXT_SKIP_DRAW, NULL);\n    }\n    PutWindowTilemap(windowId);\n}\n\n// Debug functions?\nstatic const u16 sDebug_BerryResults[MAX_RFU_PLAYERS][4] =\n{\n    {\n        [BERRY_BLUE]   = MAX_BERRIES,\n        [BERRY_GREEN]  = 0,\n        [BERRY_GOLD]   = 90,\n        [BERRY_MISSED] = MAX_BERRIES\n    },\n    {\n        [BERRY_BLUE]   = MAX_BERRIES,\n        [BERRY_GREEN]  = MAX_BERRIES,\n        [BERRY_GOLD]   = 70,\n        [BERRY_MISSED] = MAX_BERRIES\n    },\n    {\n        [BERRY_BLUE]   = MAX_BERRIES,\n        [BERRY_GREEN]  = 0,\n        [BERRY_GOLD]   = MAX_BERRIES,\n        [BERRY_MISSED] = 0\n    },\n    {\n        [BERRY_BLUE]   = MAX_BERRIES,\n        [BERRY_GREEN]  = MAX_BERRIES,\n        [BERRY_GOLD]   = 60,\n        [BERRY_MISSED] = 0\n    },\n    {\n        [BERRY_BLUE]   = MAX_BERRIES,\n        [BERRY_GREEN]  = MAX_BERRIES,\n        [BERRY_GOLD]   = MAX_BERRIES,\n        [BERRY_MISSED] = 0\n    },\n};\n\nstatic const u8 sJPText_Vowels[] = _(\"あいうえおかき\");\nstatic const u8 sText_Letters[] = _(\"ABCDEFG\");\nstatic const u8 sText_Digits[] = _(\"0123456\");\n\nstatic const u8 *const sPlaceholderPlayerNames[] =\n{\n    sJPText_Vowels,\n    sJPText_Vowels,\n    sJPText_Vowels,\n    sText_Letters,\n    sText_Digits\n};\n\nstatic void Debug_UpdateNumPlayers(void)\n{\n    sGame->numPlayers = GetLinkPlayerCount();\n}\n\nstatic void Debug_SetPlayerNamesAndResults(void)\n{\n    u8 i, playerId;\n\n    for (playerId = sGame->numPlayers; playerId < ARRAY_COUNT(sPlaceholderPlayerNames); playerId++)\n        StringCopy(gLinkPlayers[playerId].name, sPlaceholderPlayerNames[playerId]);\n\n    sGame->numPlayers = MAX_RFU_PLAYERS;\n    for (i = 0; i < NUM_BERRY_TYPES; i++)\n    {\n        for (playerId = 0; playerId < sGame->numPlayers; playerId++)\n            sGame->berryResults[playerId][i] = sDebug_BerryResults[playerId][i];\n    }\n}\n\nstatic const struct BgTemplate sBgTemplates[] =\n{\n    {\n        .bg = BG_INTERFACE,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0\n    },\n    {\n        .bg = BG_TREE_LEFT,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 12,\n        .screenSize = 1,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0\n    },\n    {\n        .bg = BG_TREE_RIGHT,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 14,\n        .screenSize = 1,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0\n    },\n    {\n        .bg = BG_SCENERY,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0\n    },\n};\n\nstatic const struct WindowTemplate sWindowTemplate_Dummy = DUMMY_WIN_TEMPLATE;\n\nstatic const struct WindowTemplate sWindowTemplates_Results[] =\n{\n    {\n        .bg = BG_INTERFACE,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 28,\n        .height = 3,\n        .paletteNum = 13,\n        .baseBlock = 0x13,\n    },\n    {\n        .bg = BG_INTERFACE,\n        .tilemapLeft = 1,\n        .tilemapTop = 6,\n        .width = 28,\n        .height = 13,\n        .paletteNum = 13,\n        .baseBlock = 0x67,\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplate_Prize =\n{\n    .bg = BG_INTERFACE,\n    .tilemapLeft = 1,\n    .tilemapTop = 6,\n    .width = 28,\n    .height = 7,\n    .paletteNum = 13,\n    .baseBlock = 0x67,\n};\n\nenum {\n    WIN_PLAY_AGAIN,\n    WIN_YES_NO,\n};\n\nstatic const struct WindowTemplate sWindowTemplates_PlayAgain[] =\n{\n    [WIN_PLAY_AGAIN] = {\n        .bg = BG_INTERFACE,\n        .tilemapLeft = 1,\n        .tilemapTop = 8,\n        .width = 19,\n        .height = 3,\n        .paletteNum = 13,\n        .baseBlock = 0x13,\n    },\n    [WIN_YES_NO] = {\n        .bg = BG_INTERFACE,\n        .tilemapLeft = 22,\n        .tilemapTop = 7,\n        .width = 6,\n        .height = 4,\n        .paletteNum = 13,\n        .baseBlock = 0x4C,\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplate_DroppedOut =\n{\n    .bg = BG_INTERFACE,\n    .tilemapLeft = 4,\n    .tilemapTop = 6,\n    .width = 22,\n    .height = 5,\n    .paletteNum = 13,\n    .baseBlock = 0x13,\n};\n\nstatic const struct WindowTemplate sWindowTemplate_CommStandby =\n{\n    .bg = BG_INTERFACE,\n    .tilemapLeft = 5,\n    .tilemapTop = 8,\n    .width = 19,\n    .height = 3,\n    .paletteNum = 13,\n    .baseBlock = 0x13,\n};\n\n// Unused duplicate of sActiveColumnMap\nstatic const u8 sActiveColumnMap_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][NUM_BERRY_COLUMNS] =\n{\n    {\n        {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0},\n    },\n    {\n        {0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0},\n        {0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0},\n    },\n    {\n        {0, 1, 2, 3, 4, 5, 6, 7, 2, 9, 0},\n        {0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0},\n        {0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0},\n    },\n    {\n        {0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0},\n        {0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0},\n        {0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0},\n        {0, 7, 8, 1, 2, 3, 4, 5, 6, 7, 0},\n    },\n    {\n        {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0},\n        {2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2},\n        {4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4},\n        {6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6},\n        {8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8},\n    },\n};\n\n// Unused duplicate of sDodrioHeadToColumnMap\nstatic const u8 sDodrioHeadToColumnMap_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][3] =\n{\n    {\n        {4, 5, 6},\n    },\n    {\n        {3, 4, 5},\n        {5, 6, 3},\n    },\n    {\n        {4, 5, 6},\n        {6, 7, 2},\n        {2, 3, 4},\n    },\n    {\n        {3, 4, 5},\n        {5, 6, 7},\n        {7, 8, 1},\n        {1, 2, 3},\n    },\n    {\n        {4, 5, 6},\n        {6, 7, 8},\n        {8, 9, 0},\n        {0, 1, 2},\n        {2, 3, 4},\n    },\n};\n\n// Unused duplicate of sDodrioNeighborMap\nstatic const u8 sDodrioNeighborMap_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][3] =\n{\n    {\n        {1, 0, 1},\n    },\n    {\n        {1, 0, 1},\n        {0, 1, 0},\n    },\n    {\n        {2, 0, 1},\n        {0, 1, 2},\n        {1, 2, 0},\n    },\n    {\n        {3, 0, 1},\n        {0, 1, 2},\n        {1, 2, 3},\n        {2, 3, 0},\n    },\n    {\n        {4, 0, 1},\n        {0, 1, 2},\n        {1, 2, 3},\n        {2, 3, 4},\n        {3, 4, 0},\n    },\n};\n\n// Unused duplicate of sPlayerIdAtColumn\nALIGNED(4)\nstatic const u8 sPlayerIdAtColumn_Duplicate[MAX_RFU_PLAYERS][NUM_BERRY_COLUMNS] =\n{\n    {9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9},\n    {9, 9, 9, 0, 0, 1, 1, 0, 9, 9, 9},\n    {9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9},\n    {9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9},\n    {3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3},\n};\n\n// Unused duplicate of sUnsharedColumns\nstatic const u8 sUnsharedColumns_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS] =\n{\n    {5},\n    {4, 6},\n    {3, 5, 7},\n    {2, 4, 6, 8},\n    {1, 3, 5, 6, 9},\n};\n\nstatic const u16 sBg_Pal[]                  = INCBIN_U16(\"graphics/dodrio_berry_picking/bg.gbapal\",\n                                                         \"graphics/dodrio_berry_picking/tree_border.gbapal\");\nstatic const u16 sDodrioNormal_Pal[]        = INCBIN_U16(\"graphics/dodrio_berry_picking/dodrio.gbapal\");\nstatic const u16 sDodrioShiny_Pal[]         = INCBIN_U16(\"graphics/dodrio_berry_picking/shiny.gbapal\");\nstatic const u16 sStatus_Pal[]              = INCBIN_U16(\"graphics/dodrio_berry_picking/status.gbapal\");\nstatic const u16 sBerries_Pal[]             = INCBIN_U16(\"graphics/dodrio_berry_picking/berries.gbapal\");\nstatic const u32 sBerries_Gfx[]             = INCBIN_U32(\"graphics/dodrio_berry_picking/berries.4bpp.lz\");\nstatic const u16 sCloud_Pal[]               = INCBIN_U16(\"graphics/dodrio_berry_picking/cloud.gbapal\");\nstatic const u32 sBg_Gfx[]                  = INCBIN_U32(\"graphics/dodrio_berry_picking/bg.4bpp.lz\");\nstatic const u32 sTreeBorder_Gfx[]          = INCBIN_U32(\"graphics/dodrio_berry_picking/tree_border.4bpp.lz\");\nstatic const u32 sStatus_Gfx[]              = INCBIN_U32(\"graphics/dodrio_berry_picking/status.4bpp.lz\");\nstatic const u32 sCloud_Gfx[]               = INCBIN_U32(\"graphics/dodrio_berry_picking/cloud.4bpp.lz\");\nstatic const u32 sDodrio_Gfx[]              = INCBIN_U32(\"graphics/dodrio_berry_picking/dodrio.4bpp.lz\");\nstatic const u32 sBg_Tilemap[]              = INCBIN_U32(\"graphics/dodrio_berry_picking/bg.bin.lz\");\nstatic const u32 sTreeBorderRight_Tilemap[] = INCBIN_U32(\"graphics/dodrio_berry_picking/tree_border_right.bin.lz\");\nstatic const u32 sTreeBorderLeft_Tilemap[]  = INCBIN_U32(\"graphics/dodrio_berry_picking/tree_border_left.bin.lz\");\n\nstatic const struct OamData sOamData_Dodrio =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\n// Used by the status bar and the results screen berry icons\nstatic const struct OamData sOamData_16x16_Priority0 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const struct OamData sOamData_Berry =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const struct OamData sOamData_Cloud =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x32),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x32),\n    .tileNum = 0,\n    .priority = 3,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const union AnimCmd sAnim_Dodrio_Normal[] =\n{\n    ANIMCMD_FRAME(0, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Dodrio_PickRight[] =\n{\n    ANIMCMD_FRAME(64, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Dodrio_PickMiddle[] =\n{\n    ANIMCMD_FRAME(128, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Dodrio_PickLeft[] =\n{\n    ANIMCMD_FRAME(192, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Dodrio_Down[] =\n{\n    ANIMCMD_FRAME(256, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_Dodrio[] =\n{\n    [PICK_NONE]     = sAnim_Dodrio_Normal,\n    [PICK_RIGHT]    = sAnim_Dodrio_PickRight,\n    [PICK_MIDDLE]   = sAnim_Dodrio_PickMiddle,\n    [PICK_LEFT]     = sAnim_Dodrio_PickLeft,\n    [PICK_DISABLED] = sAnim_Dodrio_Down,\n    // There is an unused 6th frame of Dodrio's graphic\n};\n\nstatic const union AnimCmd sAnims_StatusBar_Yellow[] =\n{\n    ANIMCMD_FRAME(0, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnims_StatusBar_Gray[] =\n{\n    ANIMCMD_FRAME(4, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnims_StatusBar_Red[] =\n{\n    ANIMCMD_FRAME(8, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_StatusBar[] =\n{\n    [STATUS_YELLOW] = sAnims_StatusBar_Yellow,\n    [STATUS_GRAY]   = sAnims_StatusBar_Gray,\n    [STATUS_RED]    = sAnims_StatusBar_Red\n};\n\nstatic const union AnimCmd sAnim_Berry_Blue[] =\n{\n    ANIMCMD_FRAME(0, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Berry_Green[] =\n{\n    ANIMCMD_FRAME(4, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Berry_Gold[] =\n{\n    ANIMCMD_FRAME(8, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Berry_BlueSquished[] =\n{\n    ANIMCMD_FRAME(12, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Berry_GreenSquished[] =\n{\n    ANIMCMD_FRAME(16, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Berry_GoldSquished[] =\n{\n    ANIMCMD_FRAME(20, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Berry_Eaten[] =\n{\n    ANIMCMD_FRAME(24, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Berry_Empty1[] =\n{\n    ANIMCMD_FRAME(28, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Berry_Empty2[] =\n{\n    ANIMCMD_FRAME(32, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_Berry[] =\n{\n    [BERRY_BLUE]  = sAnim_Berry_Blue,\n    [BERRY_GREEN] = sAnim_Berry_Green,\n    [BERRY_GOLD]  = sAnim_Berry_Gold,\n\n    [BERRY_BLUE + BERRY_MISSED]  = sAnim_Berry_BlueSquished,\n    [BERRY_GREEN + BERRY_MISSED] = sAnim_Berry_GreenSquished,\n    [BERRY_GOLD + BERRY_MISSED]  = sAnim_Berry_GoldSquished,\n\n    [ANIM_EATEN]  = sAnim_Berry_Eaten,\n\n    sAnim_Berry_Empty1,\n    sAnim_Berry_Empty2\n};\n\nstatic const union AnimCmd sAnim_Cloud[] =\n{\n    ANIMCMD_FRAME(0, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_Cloud[] =\n{\n    sAnim_Cloud\n};\n\nstatic void LoadDodrioGfx(void)\n{\n    void *ptr = AllocZeroed(0x3000);\n    struct SpritePalette normal = {sDodrioNormal_Pal, PALTAG_DODRIO_NORMAL};\n    struct SpritePalette shiny = {sDodrioShiny_Pal, PALTAG_DODRIO_SHINY};\n\n    LZ77UnCompWram(sDodrio_Gfx, ptr);\n    if (ptr)\n    {\n        struct SpriteSheet sheet = {ptr, 0x3000, GFXTAG_DODRIO};\n        LoadSpriteSheet(&sheet);\n        Free(ptr);\n    }\n    LoadSpritePalette(&normal);\n    LoadSpritePalette(&shiny);\n}\n\nstatic void CreateDodrioSprite(struct DodrioGame_MonInfo * monInfo, u8 playerId, u8 id, u8 numPlayers)\n{\n    struct SpriteTemplate template =\n    {\n        .tileTag = GFXTAG_DODRIO,\n        .paletteTag = monInfo->isShiny, // PALTAG_DODRIO_NORMAL / PALTAG_DODRIO_SHINY\n        .oam = &sOamData_Dodrio,\n        .anims = sAnims_Dodrio,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_Dodrio,\n    };\n\n    sDodrioSpriteIds[id] = AllocZeroed(4);\n    *sDodrioSpriteIds[id] = CreateSprite(&template, GetDodrioXPos(playerId, numPlayers), 136, 3);\n    SetDodrioInvisibility(TRUE, id);\n}\n\n#define sState   data[0]\n#define sTimer   data[1]\n#define sUnused1 data[2]\n#define sUnused2 data[3]\n#define sUnused3 data[4]\n\nstatic void SpriteCB_Dodrio(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        break;\n    case 1:\n        DoDodrioMissedAnim(sprite);\n        break;\n    case 2:\n        DoDodrioIntroAnim(sprite);\n        break;\n    }\n}\n\nstatic void StartDodrioMissedAnim(u8 unused)\n{\n    struct Sprite *sprite = &gSprites[*sDodrioSpriteIds[GetMultiplayerId()]];\n    sprite->sState = 1;\n    sprite->sTimer = 0;\n    sprite->sUnused1 = 0;\n    sprite->sUnused2 = 0;\n    sprite->sUnused3 = 0;\n}\n\nstatic void StartDodrioIntroAnim(u8 unused)\n{\n    struct Sprite *sprite = &gSprites[*sDodrioSpriteIds[GetMultiplayerId()]];\n    sprite->sState = 2;\n    sprite->sTimer = 0;\n    sprite->sUnused1 = 0;\n    sprite->sUnused2 = 0;\n    sprite->sUnused3 = 0;\n}\n\n// Do animation where Dodrio shakes horizontally after reaching for a berry and missing\nstatic u32 DoDodrioMissedAnim(struct Sprite *sprite)\n{\n    s8 x;\n    u8 state = (++sprite->sTimer / 2) % 4;\n\n    if (sprite->sTimer >= 3)\n    {\n        switch (state)\n        {\n        default:\n            x = 1;\n            break;\n        case 1:\n        case 2:\n            x = -1;\n            break;\n        }\n\n        sprite->x += x;\n        if (++sprite->sTimer >= 40)\n        {\n            sprite->sState = 0;\n            sprite->x = GetDodrioXPos(0, GetNumPlayers());\n        }\n    }\n\n    return 0;\n}\n\n// Does the intro animation where the player's Dodrio\n// cycles through extending each head twice\n#define FRAMES_PER_STATE  13\n#define NUM_INTRO_PICK_STATES PICK_DISABLED // Cycle through 'Normal' and each head, but exclude the Disabled state\n\nstatic u32 DoDodrioIntroAnim(struct Sprite *sprite)\n{\n    u8 pickState = (++sprite->sTimer / FRAMES_PER_STATE) % NUM_INTRO_PICK_STATES;\n\n    // Play a sound effect at the start of each head extension\n    if (sprite->sTimer % FRAMES_PER_STATE == 0 && pickState != PICK_NONE)\n        PlaySE(SE_M_CHARM);\n\n    if (sprite->sTimer >= FRAMES_PER_STATE * NUM_INTRO_PICK_STATES * 2)\n    {\n        // End animation\n        sprite->sState = 0;\n        pickState = PICK_NONE;\n    }\n    SetDodrioAnim(GetMultiplayerId(), pickState);\n    return 0;\n}\n\n#undef sState\n#undef sTimer\n#undef sUnused1\n#undef sUnused2\n#undef sUnused3\n\nstatic void FreeDodrioSprites(u8 numPlayers)\n{\n    u8 i;\n    for (i = 0; i < numPlayers; i++)\n    {\n        struct Sprite *sprite = &gSprites[*sDodrioSpriteIds[i]];\n        if (sprite)\n            DestroySpriteAndFreeResources(sprite);\n#ifdef BUGFIX\n        FREE_AND_SET_NULL(sDodrioSpriteIds[i]); // Memory should be freed here but is not.\n#endif\n    }\n}\n\nstatic void SetDodrioInvisibility(bool8 invisible, u8 id)\n{\n    gSprites[*sDodrioSpriteIds[id]].invisible = invisible;\n}\n\nstatic void SetAllDodrioInvisibility(bool8 invisible, u8 numPlayers)\n{\n    u8 i;\n    for (i = 0; i < numPlayers; i++)\n        SetDodrioInvisibility(invisible, i);\n}\n\nstatic void SetDodrioAnim(u8 id, u8 pickState)\n{\n    StartSpriteAnim(&gSprites[*sDodrioSpriteIds[id]], pickState);\n}\n\nstatic void SpriteCB_Status(struct Sprite *sprite)\n{\n\n}\n\nstatic void InitStatusBarPos(void)\n{\n    u8 i;\n    for (i = 0; i < NUM_STATUS_SQUARES; i++)\n    {\n        struct Sprite *sprite = &gSprites[sStatusBar->spriteIds[i]];\n        sprite->x = (i * 16) + 48;\n        sprite->y = -8 - (i * 8);\n        sStatusBar->entered[i] = FALSE;\n    }\n}\n\nstatic void CreateStatusBarSprites(void)\n{\n    u8 i;\n    void *ptr = AllocZeroed(0x180);\n    struct SpritePalette pal = {sStatus_Pal, PALTAG_STATUS};\n\n    LZ77UnCompWram(sStatus_Gfx, ptr);\n    // This check should be one line up.\n    if (ptr)\n    {\n        struct SpriteSheet sheet = {ptr, 0x180, GFXTAG_STATUS};\n        struct SpriteTemplate template =\n        {\n            .tileTag = GFXTAG_STATUS,\n            .paletteTag = PALTAG_STATUS,\n            .oam = &sOamData_16x16_Priority0,\n            .anims = sAnims_StatusBar,\n            .images = NULL,\n            .affineAnims = gDummySpriteAffineAnimTable,\n            .callback = SpriteCB_Status,\n        };\n\n        sStatusBar = AllocZeroed(sizeof(*sStatusBar));\n        LoadSpriteSheet(&sheet);\n        LoadSpritePalette(&pal);\n        for (i = 0; i < NUM_STATUS_SQUARES; i++)\n            sStatusBar->spriteIds[i] = CreateSprite(&template, (i * 16) + 48, -8 - (i * 8), 0);\n    }\n\n    Free(ptr);\n}\n\nstatic void FreeStatusBar(void)\n{\n    u8 i;\n    for (i = 0; i < NUM_STATUS_SQUARES; i++)\n    {\n        struct Sprite *sprite = &gSprites[sStatusBar->spriteIds[i]];\n        if (sprite)\n            DestroySpriteAndFreeResources(sprite);\n    }\n    FREE_AND_SET_NULL(sStatusBar);\n}\n\n// Progress an animation where each square of the\n// status bar drops down into view, bounces up,\n// then settles into position.\n// Returns TRUE if the animation is complete\nstatic bool32 DoStatusBarIntro(void)\n{\n    u8 i;\n    bool32 animActive = FALSE;\n    for (i = 0; i < NUM_STATUS_SQUARES; i++)\n    {\n        struct Sprite *sprite = &gSprites[sStatusBar->spriteIds[i]];\n        sStatusBar->yChange[i] = 2;\n        if (sStatusBar->entered[i] != 0 && sprite->y == 8)\n            continue;\n\n        animActive = TRUE;\n        if (sprite->y == 8)\n        {\n            if (sStatusBar->entered[i])\n                continue;\n\n            // Square has entered screen, play click\n            // sound and reverse direction\n            sStatusBar->entered[i] = TRUE;\n            sStatusBar->yChange[i] = -16;\n            PlaySE(SE_CLICK);\n        }\n        sprite->y += sStatusBar->yChange[i];\n    }\n\n    if (animActive)\n        return FALSE;\n    else\n        return TRUE;\n}\n\n// The status bar at the top changes color depending on the game performance.\n// The squares start out yellow. For every berry missed, a square is colored gray.\n// If there are 4 or fewer yellow squares left they also flash red\nstatic void UpdateStatusBarAnim(u8 numEmpty)\n{\n    u8 i;\n\n    if (numEmpty > NUM_STATUS_SQUARES)\n    {\n        // All squares gray\n        for (i = 0; i < NUM_STATUS_SQUARES; i++)\n            StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_GRAY);\n    }\n    else\n    {\n        // At least 1 square is yellow\n        for (i = 0; i < NUM_STATUS_SQUARES - numEmpty; i++)\n        {\n            if (numEmpty > 6)\n            {\n                // Flash the yellow squares red\n                // The flash cycles faster the fewer yellow squares remain\n                sStatusBar->flashTimer += numEmpty - 6;\n                if (sStatusBar->flashTimer > 30)\n                    sStatusBar->flashTimer = 0;\n                else if (sStatusBar->flashTimer > 10)\n                    StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_RED);\n                else\n                    StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_YELLOW);\n            }\n            else\n            {\n                StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_YELLOW);\n            }\n        }\n\n        // Set remaining squares gray\n        for (; i < NUM_STATUS_SQUARES; i++)\n            StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_GRAY);\n    }\n}\n\nstatic void SetStatusBarInvisibility(bool8 invisible)\n{\n    u8 i;\n    for (i = 0; i < NUM_STATUS_SQUARES; i++)\n        gSprites[sStatusBar->spriteIds[i]].invisible = invisible;\n}\n\nstatic const u8 sUnusedSounds[] = {\n    SE_M_CHARM,\n    SE_NOTE_C,\n    SE_NOTE_D,\n    SE_NOTE_E,\n    SE_NOTE_F,\n    SE_NOTE_G,\n    SE_NOTE_A,\n    SE_NOTE_B,\n    SE_NOTE_C_HIGH,\n    SE_CARD_OPEN\n};\n\nstatic void LoadBerryGfx(void)\n{\n    void *ptr = AllocZeroed(0x480);\n    struct SpritePalette pal = {sBerries_Pal, PALTAG_BERRIES};\n\n    LZ77UnCompWram(sBerries_Gfx, ptr);\n    if (ptr)\n    {\n        struct SpriteSheet sheet = {ptr, 0x480, GFXTAG_BERRIES};\n        LoadSpriteSheet(&sheet);\n    }\n\n    LoadSpritePalette(&pal);\n    Free(ptr);\n}\n\nstatic const s16 sBerryIconXCoords[] = {88, 128, 168, 208};\n\nstatic void CreateBerrySprites(void)\n{\n    u8 i;\n    s16 x;\n\n    struct SpriteTemplate berry =\n    {\n        .tileTag = GFXTAG_BERRIES,\n        .paletteTag = PALTAG_BERRIES,\n        .oam = &sOamData_Berry,\n        .anims = sAnims_Berry,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    };\n    struct SpriteTemplate berryIcon =\n    {\n        .tileTag = GFXTAG_BERRIES,\n        .paletteTag = PALTAG_BERRIES,\n        .oam = &sOamData_16x16_Priority0,\n        .anims = sAnims_Berry,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    };\n\n    // Create berry sprites that fall during gameplay\n    for (i = 0; i < NUM_BERRY_COLUMNS; i++)\n    {\n        sBerrySpriteIds[i] = AllocZeroed(4);\n        x = i * 16;\n        *sBerrySpriteIds[i] = CreateSprite(&berry, x + (i * 8), 8, 1);\n        SetBerryInvisibility(i, TRUE);\n    }\n\n    // Create berry icon sprites for results screen\n    for (i = 0; i < NUM_BERRY_TYPES; i++)\n    {\n        sBerryIconSpriteIds[i] = AllocZeroed(4);\n        if (i == BERRY_MISSED)\n            *sBerryIconSpriteIds[i] = CreateSprite(&berryIcon, sBerryIconXCoords[i], 57, 0);\n        else\n            *sBerryIconSpriteIds[i] = CreateSprite(&berryIcon, sBerryIconXCoords[i], 60, 0);\n        StartSpriteAnim(&gSprites[*sBerryIconSpriteIds[i]], i);\n    }\n    SetBerryIconsInvisibility(TRUE);\n}\n\nstatic void FreeBerrySprites(void)\n{\n    struct Sprite *sprite;\n    u8 i;\n\n    for (i = 0; i < NUM_BERRY_COLUMNS; i++)\n    {\n        sprite = &gSprites[*sBerrySpriteIds[i]];\n        if (sprite)\n            DestroySprite(sprite);\n        FREE_AND_SET_NULL(sBerrySpriteIds[i]);\n    }\n    for (i = 0; i < NUM_BERRY_TYPES; i++)\n    {\n        sprite = &gSprites[*sBerryIconSpriteIds[i]];\n        if (sprite)\n            DestroySprite(sprite);\n        FREE_AND_SET_NULL(sBerryIconSpriteIds[i]);\n    }\n}\n\nstatic void SetBerryInvisibility(u8 id, bool8 invisible)\n{\n    gSprites[*sBerrySpriteIds[id]].invisible = invisible;\n}\n\nstatic void SetBerryIconsInvisibility(bool8 invisible)\n{\n    u8 i;\n    for (i = 0; i < NUM_BERRY_TYPES; i++)\n        gSprites[*sBerryIconSpriteIds[i]].invisible = invisible;\n}\n\nstatic void SetBerryYPos(u8 id, u8 y)\n{\n    gSprites[*sBerrySpriteIds[id]].y = y * 8;\n}\n\nstatic void SetBerryAnim(u16 id, u8 animNum)\n{\n    StartSpriteAnim(&gSprites[*sBerrySpriteIds[id]], animNum);\n}\n\n// Unused\nstatic void UnusedSetSpritePos(u8 spriteId)\n{\n    gSprites[spriteId].x = 20 * spriteId + 50;\n    gSprites[spriteId].y = 50;\n}\n\n// Gamefreak made a mistake there and goes out of bounds for the data array as it holds 8 elements\n// in turn overwriting sprite's subpriority and subsprites fields.\n#ifdef UBFIX\n#define sFrozen data[1]\n#else\n#define sFrozen data[10]\n#endif // BUGFIX\n\nstatic void SpriteCB_Cloud(struct Sprite *sprite)\n{\n    u8 i;\n    static const u8 moveDelays[] = {30, 20};\n\n    if (sprite->sFrozen != TRUE)\n    {\n        for (i = 0; i < NUM_CLOUDS; i++)\n        {\n            if (++sCloudSpriteIds[i][1] > moveDelays[i])\n            {\n                sprite->x--;\n                sCloudSpriteIds[i][1] = 0;\n            }\n        }\n    }\n}\n\nstatic const s16 sCloudStartCoords[NUM_CLOUDS][2] =\n{\n    {230, 55},\n    { 30, 74}\n};\n\nstatic void CreateCloudSprites(void)\n{\n    u8 i;\n    void *ptr = AllocZeroed(0x400);\n    struct SpritePalette pal = {sCloud_Pal, PALTAG_CLOUD};\n\n    LZ77UnCompWram(sCloud_Gfx, ptr);\n    if (ptr)\n    {\n        struct SpriteSheet sheet = {ptr, 0x400, GFXTAG_CLOUD};\n        struct SpriteTemplate template =\n        {\n            .tileTag = GFXTAG_CLOUD,\n            .paletteTag = PALTAG_CLOUD,\n            .oam = &sOamData_Cloud,\n            .anims = sAnims_Cloud,\n            .images = NULL,\n            .affineAnims = gDummySpriteAffineAnimTable,\n            .callback = SpriteCB_Cloud,\n        };\n\n        LoadSpriteSheet(&sheet);\n        LoadSpritePalette(&pal);\n        for (i = 0; i < NUM_CLOUDS; i++)\n        {\n            sCloudSpriteIds[i] = AllocZeroed(4);\n            *sCloudSpriteIds[i] = CreateSprite(&template, sCloudStartCoords[i][0], sCloudStartCoords[i][1], 4);\n        }\n    }\n    Free(ptr);\n}\n\nstatic void ResetCloudPos(void)\n{\n    u8 i;\n    for (i = 0; i < NUM_CLOUDS; i++)\n    {\n        struct Sprite *sprite = &gSprites[*sCloudSpriteIds[i]];\n        sprite->sFrozen = TRUE;\n        sprite->x = sCloudStartCoords[i][0];\n        sprite->y = sCloudStartCoords[i][1];\n    }\n}\n\nstatic void StartCloudMovement(void)\n{\n    u8 i;\n    for (i = 0; i < NUM_CLOUDS; i++)\n    {\n        struct Sprite *sprite = &gSprites[*sCloudSpriteIds[i]];\n        sprite->sFrozen = FALSE;\n    }\n}\n\nstatic void FreeCloudSprites(void)\n{\n    u8 i;\n    for (i = 0; i < NUM_CLOUDS; i++)\n    {\n        struct Sprite *sprite = &gSprites[*sCloudSpriteIds[i]];\n        if (sprite)\n            DestroySprite(sprite);\n        FREE_AND_SET_NULL(sCloudSpriteIds[i]);\n    }\n}\n\nstatic void SetCloudInvisibility(bool8 invisible)\n{\n    u8 i;\n    for (i = 0; i < NUM_CLOUDS; i++)\n        gSprites[*sCloudSpriteIds[i]].invisible = invisible;\n}\n\n#undef sFrozen\n\nstatic s16 GetDodrioXPos(u8 playerId, u8 numPlayers)\n{\n    s16 x = 0;\n    switch (numPlayers)\n    {\n    case 1:\n        x = 15;\n        break;\n    case 2:\n        switch (playerId)\n        {\n        case 0: x = 12; break;\n        case 1: x = 18; break;\n        }\n        break;\n    case 3:\n        switch (playerId)\n        {\n        case 0: x = 15; break;\n        case 1: x = 21; break;\n        case 2: x =  9; break;\n        }\n        break;\n    case 4:\n        switch (playerId)\n        {\n        case 0: x = 12; break;\n        case 1: x = 18; break;\n        case 2: x = 24; break;\n        case 3: x =  6; break;\n        }\n        break;\n    case 5:\n        switch (playerId)\n        {\n        case 0: x = 15; break;\n        case 1: x = 21; break;\n        case 2: x = 27; break;\n        case 3: x =  3; break;\n        case 4: x =  9; break;\n        }\n        break;\n    }\n\n    return x * 8;\n}\n\nstatic void ResetBerryAndStatusBarSprites(void)\n{\n    u8 i;\n    for (i = 0; i < NUM_BERRY_COLUMNS; i++)\n    {\n        SetBerryInvisibility(i, TRUE);\n        SetBerryYPos(i, 1);\n    }\n    SetStatusBarInvisibility(FALSE);\n}\n\nstatic void LoadWindowFrameGfx(u8 frameId)\n{\n    LoadBgTiles(BG_INTERFACE, GetUserWindowGraphics(frameId)->tiles, 0x120, 1);\n    LoadPalette(GetUserWindowGraphics(frameId)->palette, BG_PLTT_ID(10), PLTT_SIZE_4BPP);\n}\n\nstatic void DBP_LoadStdWindowGfx(void)\n{\n    LoadStdWindowGfx(0, 0xA, BG_PLTT_ID(11));\n}\n\nstatic void ResetGfxState(void)\n{\n    sGfx->finished = FALSE;\n    sGfx->state = 0;\n    sGfx->loadState = 0;\n    sGfx->cursorSelection = 0;\n    sGfx->playAgainState = PLAY_AGAIN_NONE;\n}\n\nstatic void DrawYesNoMessageWindow(const struct WindowTemplate * template)\n{\n    u8 pal = 10;\n\n    FillBgTilemapBufferRect(BG_INTERFACE, 1, template->tilemapLeft - 1,                template->tilemapTop - 1,                   1, 1, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 2, template->tilemapLeft,                    template->tilemapTop - 1,                   template->width, 1, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 3, template->tilemapLeft + template->width,  template->tilemapTop - 1,                   1, 1, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 4, template->tilemapLeft - 1,                template->tilemapTop, 1,                    template->height, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 6, template->tilemapLeft + template->width,  template->tilemapTop, 1,                    template->height, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 7, template->tilemapLeft - 1,                template->tilemapTop + template->height,    1, 1, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 8, template->tilemapLeft,                    template->tilemapTop + template->height,    template->width, 1, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 9, template->tilemapLeft + template->width,  template->tilemapTop + template->height,    1, 1, pal);\n}\n\nstatic void DrawMessageWindow(const struct WindowTemplate * template)\n{\n    u8 pal = 11;\n\n    FillBgTilemapBufferRect(BG_INTERFACE, 10, template->tilemapLeft - 1,                template->tilemapTop - 1,                   1, 1, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 11, template->tilemapLeft,                    template->tilemapTop - 1,                   template->width, 1, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 12, template->tilemapLeft + template->width,  template->tilemapTop - 1,                   1, 1, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 13, template->tilemapLeft - 1,                template->tilemapTop, 1,                    template->height, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 15, template->tilemapLeft + template->width,  template->tilemapTop, 1,                    template->height, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 16, template->tilemapLeft - 1,                template->tilemapTop + template->height,    1, 1, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 17, template->tilemapLeft,                    template->tilemapTop + template->height,    template->width, 1, pal);\n    FillBgTilemapBufferRect(BG_INTERFACE, 18, template->tilemapLeft + template->width,  template->tilemapTop + template->height,    1, 1, pal);\n}\n\nstatic void InitGameGfx(struct DodrioGame_Gfx * ptr)\n{\n    sGfx = ptr;\n    sGfx->finished = FALSE;\n    sGfx->state = 0;\n    sGfx->loadState = 0;\n    sGfx->cursorSelection = 0;\n    sGfx->playAgainState = PLAY_AGAIN_NONE;\n    sGfx->taskId = CreateTask(Task_TryRunGfxFunc, 3);\n    SetGfxFunc(LoadGfx);\n}\n\n// Unused\nstatic void FreeAllWindowBuffers_(void)\n{\n    FreeAllWindowBuffers();\n}\n\nstruct WinCoords\n{\n    u8 left;\n    u8 top;\n};\n\nenum {\n    COLORID_GRAY,\n    COLORID_RED,\n    COLORID_BLUE,\n    COLORID_GREEN, // Unused\n};\n\nstatic const u8 sTextColorTable[][3] =\n{\n    [COLORID_GRAY]  = {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY},\n    [COLORID_RED]   = {TEXT_COLOR_WHITE, TEXT_COLOR_RED,       TEXT_COLOR_LIGHT_RED},\n    [COLORID_BLUE]  = {TEXT_COLOR_WHITE, TEXT_COLOR_BLUE,      TEXT_COLOR_LIGHT_BLUE},\n    [COLORID_GREEN] = {TEXT_COLOR_WHITE, TEXT_COLOR_GREEN,     TEXT_COLOR_LIGHT_GREEN},\n};\n\nstatic const struct WinCoords sNameWindowCoords_1Player[] = {{12, 6}};\nstatic const struct WinCoords sNameWindowCoords_2Players[] = {{9, 10}, {15, 6}};\nstatic const struct WinCoords sNameWindowCoords_3Players[] = {{12, 6}, {18, 10}, {6, 10}};\nstatic const struct WinCoords sNameWindowCoords_4Players[] = {{9, 10}, {15, 6}, {21, 10}, {3, 6}};\nstatic const struct WinCoords sNameWindowCoords_5Players[] = {{12, 6}, {18, 10}, {23, 6}, {1, 6}, {6, 10}};\n\nstatic const struct WinCoords * const sNameWindowCoords[MAX_RFU_PLAYERS] =\n{\n    sNameWindowCoords_1Player,\n    sNameWindowCoords_2Players,\n    sNameWindowCoords_3Players,\n    sNameWindowCoords_4Players,\n    sNameWindowCoords_5Players,\n};\n\nstatic const u8 *const sRankingTexts[MAX_RFU_PLAYERS] =\n{\n    gText_1Colon,\n    gText_2Colon,\n    gText_3Colon,\n    gText_4Colon,\n    gText_5Colon,\n};\n\nstatic const u16 sResultsXCoords[] = {92, 132, 172, 212};\nstatic const u16 sResultsYCoords[] = {30, 45, 60, 75, 90};\nstatic const u16 sRankingYCoords[] = {12, 28, 44, 60, 76};\n\nstruct\n{\n    u8 id;\n    void (*func)(void);\n} const sGfxFuncs[] =\n{\n    {GFXFUNC_LOAD,               LoadGfx}, // Element not used, LoadGfx is passed directly to SetGfxFunc\n    {GFXFUNC_SHOW_NAMES,         ShowNames},\n    {GFXFUNC_SHOW_RESULTS,       ShowResults},\n    {GFXFUNC_MSG_PLAY_AGAIN,     Msg_WantToPlayAgain},\n    {GFXFUNC_MSG_SAVING,         Msg_SavingDontTurnOff},\n    {GFXFUNC_MSG_COMM_STANDBY,   Msg_CommunicationStandby},\n    {GFXFUNC_ERASE_MSG,          EraseMessage},\n    {GFXFUNC_MSG_PLAYER_DROPPED, Msg_SomeoneDroppedOut},\n    {GFXFUNC_STOP,               StopGfxFuncs},\n    {GFXFUNC_IDLE,               GfxIdle},\n};\n\nstatic void SetGfxFuncById(u8 funcId)\n{\n    u8 i;\n    for (i = 0; i < ARRAY_COUNT(sGfxFuncs); i++)\n    {\n        if (sGfxFuncs[i].id == funcId)\n            SetGfxFunc(sGfxFuncs[i].func);\n    }\n}\n\nstatic void Task_TryRunGfxFunc(u8 taskId)\n{\n    // Continue calling function until it\n    // has reached its finished state.\n    // Another will not be called until\n    // readied by SetGfxFunc\n    if (!sGfx->finished)\n        GetGfxFunc()();\n}\n\nstatic void LoadGfx(void)\n{\n    switch (sGfx->state)\n    {\n    case 0:\n        InitBgs();\n        sGfx->state++;\n        break;\n    case 1:\n        if (LoadBgGfx() == TRUE)\n            sGfx->state++;\n        break;\n    case 2:\n        CopyToBgTilemapBuffer(BG_SCENERY, sBg_Tilemap, 0, 0);\n        CopyToBgTilemapBuffer(BG_TREE_LEFT, sTreeBorderLeft_Tilemap, 0, 0);\n        CopyToBgTilemapBuffer(BG_TREE_RIGHT, sTreeBorderRight_Tilemap, 0, 0);\n        CopyBgTilemapBufferToVram(BG_SCENERY);\n        CopyBgTilemapBufferToVram(BG_TREE_LEFT);\n        CopyBgTilemapBufferToVram(BG_TREE_RIGHT);\n        sGfx->state++;\n        break;\n    case 3:\n        ShowBg(BG_INTERFACE);\n        ShowBg(BG_SCENERY);\n        ShowBg(BG_TREE_LEFT);\n        ShowBg(BG_TREE_RIGHT);\n        sGfx->state++;\n        break;\n    case 4:\n        LoadWindowFrameGfx(gSaveBlock2Ptr->optionsWindowFrameType);\n        DBP_LoadStdWindowGfx();\n        sGfx->state++;\n        break;\n    default:\n        sGfx->finished = TRUE;\n        break;\n    }\n}\n\nstatic void ShowNames(void)\n{\n    u8 i, numPlayers, playerId, colorsId, *name;\n    u32 left;\n    struct WindowTemplate window;\n    const struct WinCoords * coords;\n\n    switch (sGfx->state)\n    {\n    case 0:\n        numPlayers = GetNumPlayers();\n        coords = sNameWindowCoords[numPlayers - 1];\n        window.bg = BG_INTERFACE;\n        window.width = 7;\n        window.height = 2;\n        window.paletteNum = 13;\n        window.baseBlock = 0x13;\n        for (i = 0; i < numPlayers; coords++, i++)\n        {\n            colorsId = 0;\n            playerId = GetPlayerIdByPos(i);\n            left = (56 - GetStringWidth(FONT_SMALL, GetPlayerName(playerId), -1)) / 2u;\n            window.tilemapLeft = coords->left;\n            window.tilemapTop = coords->top;\n            sGfx->windowIds[i] = AddWindow(&window);\n            ClearWindowTilemap(sGfx->windowIds[i]);\n            FillWindowPixelBuffer(sGfx->windowIds[i], PIXEL_FILL(1));\n            if (playerId == GetMultiplayerId())\n                colorsId = COLORID_BLUE;\n            name = GetPlayerName(playerId);\n            AddTextPrinterParameterized3(sGfx->windowIds[i], FONT_SMALL, left, 1, sTextColorTable[colorsId], TEXT_SKIP_DRAW, name);\n            CopyWindowToVram(sGfx->windowIds[i], COPYWIN_GFX);\n            window.baseBlock += 0xE;\n            DrawMessageWindow(&window);\n        }\n        sGfx->state++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            numPlayers = GetNumPlayers();\n            for (i = 0; i < numPlayers; i++)\n                PutWindowTilemap(sGfx->windowIds[i]);\n            CopyBgTilemapBufferToVram(BG_INTERFACE);\n            sGfx->state++;\n        }\n        break;\n    default:\n        if (++sGfx->state > 180)\n        {\n            numPlayers = GetNumPlayers();\n            for (i = 0; i < numPlayers; i++)\n            {\n                ClearWindowTilemap(sGfx->windowIds[i]);\n                RemoveWindow(sGfx->windowIds[i]);\n            }\n            FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20);\n            CopyBgTilemapBufferToVram(BG_INTERFACE);\n            sGfx->finished = TRUE;\n        }\n        break;\n    }\n}\n\nstatic void PrintRankedScores(u8 numPlayers_)\n{\n    u8 i, ranking = 0, rankedPlayers = 0;\n    u8 numPlayers = numPlayers_; // Needed to match\n    u8 *name;\n    u32 x, numWidth;\n    u8 numString[32];\n    u8 playersByRanking[MAX_RFU_PLAYERS] = {0, 1, 2, 3, 4};\n    struct DodrioGame_ScoreResults temp, scoreResults[MAX_RFU_PLAYERS];\n\n    // Get all players scores and rankings\n    for (i = 0; i < numPlayers; i++)\n    {\n        playersByRanking[i] = i;\n        GetScoreResults(&temp, i);\n        scoreResults[i] = temp;\n    }\n\n    // Sort player ids by ranking\n    if (GetHighestScore() != 0)\n    {\n        do\n        {\n            for (i = 0; i < numPlayers; i++)\n            {\n                if (scoreResults[i].ranking == ranking)\n                {\n                    playersByRanking[rankedPlayers] = i;\n                    rankedPlayers++;\n                }\n            }\n            ranking = rankedPlayers;\n        } while (rankedPlayers < numPlayers);\n    }\n\n    // Put any player with a score of 0 at lowest ranking\n    for (i = 0; i < numPlayers; i++)\n    {\n        if (scoreResults[i].score == 0)\n            scoreResults[i].ranking = numPlayers - 1;\n    }\n\n    // Print text\n    x = 216 - GetStringWidth(FONT_SMALL, gText_SpacePoints, 0);\n    for (i = 0; i < numPlayers; i++)\n    {\n        u8 colorsId = COLORID_GRAY;\n        u8 playerId = playersByRanking[i];\n        u32 points = scoreResults[playerId].score;\n\n        AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, sRankingTexts[scoreResults[playerId].ranking], 8, sRankingYCoords[i], TEXT_SKIP_DRAW, NULL);\n        if (playerId == GetMultiplayerId())\n            colorsId =COLORID_BLUE;\n        name = GetPlayerName(playerId);\n        AddTextPrinterParameterized3(sGfx->windowIds[1], FONT_SMALL, 28, sRankingYCoords[i], sTextColorTable[colorsId], TEXT_SKIP_DRAW, name);\n        ConvertIntToDecimalStringN(numString, points, STR_CONV_MODE_RIGHT_ALIGN, 7);\n        numWidth = GetStringWidth(FONT_SMALL, numString, -1);\n        AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, numString, x - 35, sRankingYCoords[i], TEXT_SKIP_DRAW, NULL);\n        AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, gText_SpacePoints, x, sRankingYCoords[i], TEXT_SKIP_DRAW, NULL);\n    }\n}\n\nstatic void ShowResults(void)\n{\n    u8 i, j, prizeState, numPlayers = GetNumPlayers();\n    u8 *name;\n    u32 strWidth, x;\n    u8 strBuff_Large[100];\n    u8 strBuff_Small[20];\n\n    switch (sGfx->state)\n    {\n    case 0:\n        SetScoreResults();\n        sGfx->timer = 0;\n        sGfx->state++;\n        break;\n    case 1:\n        sGfx->windowIds[0] = AddWindow(&sWindowTemplates_Results[0]);\n        sGfx->windowIds[1] = AddWindow(&sWindowTemplates_Results[1]);\n        ClearWindowTilemap(sGfx->windowIds[0]);\n        ClearWindowTilemap(sGfx->windowIds[1]);\n        DrawMessageWindow(&sWindowTemplates_Results[0]);\n        DrawMessageWindow(&sWindowTemplates_Results[1]);\n        sGfx->state++;\n        break;\n    case 2:\n        FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1));\n        FillWindowPixelBuffer(sGfx->windowIds[1], PIXEL_FILL(1));\n        strWidth = GetStringWidth(FONT_SMALL, gText_BerryPickingResults, -1);\n        x = (DISPLAY_WIDTH - 16 - strWidth) / 2;\n        AddTextPrinterParameterized(sGfx->windowIds[0], FONT_SMALL, gText_BerryPickingResults, x, 2, TEXT_SKIP_DRAW, NULL);\n        AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, gText_10P30P50P50P, 68, 16, TEXT_SKIP_DRAW, NULL);\n        for (i = 0; i < numPlayers; i++)\n        {\n            u8 colorsId = COLORID_GRAY;\n            if (i == GetMultiplayerId())\n                colorsId = COLORID_BLUE;\n\n            name = GetPlayerName(i);\n            AddTextPrinterParameterized3(sGfx->windowIds[1], FONT_SMALL, 2, sResultsYCoords[i], sTextColorTable[colorsId], TEXT_SKIP_DRAW, name);\n            for (j = 0; j < 4; j++)\n            {\n                u32 width;\n                u16 berriesPicked = Min(GetBerryResult(i, j), MAX_BERRIES);\n                u16 maxBerriesPicked = Min(GetHighestBerryResult(j), MAX_BERRIES);\n\n                ConvertIntToDecimalStringN(strBuff_Large, berriesPicked, STR_CONV_MODE_LEFT_ALIGN, 4);\n                width = GetStringWidth(FONT_SMALL, strBuff_Large, -1);\n                \n                // If player got the most of a berry type, highlight their number in red\n                if (maxBerriesPicked == berriesPicked && maxBerriesPicked != 0)\n                    AddTextPrinterParameterized3(sGfx->windowIds[1], FONT_SMALL, sResultsXCoords[j] - width, sResultsYCoords[i], sTextColorTable[1], TEXT_SKIP_DRAW, strBuff_Large);\n                else\n                    AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, strBuff_Large, sResultsXCoords[j] - width, sResultsYCoords[i], TEXT_SKIP_DRAW, NULL);\n            }\n        }\n        CopyWindowToVram(sGfx->windowIds[0], COPYWIN_GFX);\n        CopyWindowToVram(sGfx->windowIds[1], COPYWIN_GFX);\n        sGfx->state++;\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PutWindowTilemap(sGfx->windowIds[0]);\n            PutWindowTilemap(sGfx->windowIds[1]);\n        }\n        CopyBgTilemapBufferToVram(BG_INTERFACE);\n        SetBerryIconsInvisibility(FALSE);\n        sGfx->state++;\n        break;\n    case 4:\n        if (++sGfx->timer >= 30 && JOY_NEW(A_BUTTON))\n        {\n            sGfx->timer = 0;\n            PlaySE(SE_SELECT);\n            SetBerryIconsInvisibility(TRUE);\n            sGfx->state++;\n        }\n        break;\n    case 5:\n        FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1));\n        FillWindowPixelBuffer(sGfx->windowIds[1], PIXEL_FILL(1));\n        strWidth = GetStringWidth(FONT_SMALL, gText_AnnouncingRankings, -1);\n        x = (DISPLAY_WIDTH - 16 - strWidth) / 2;\n        AddTextPrinterParameterized(sGfx->windowIds[0], FONT_SMALL, gText_AnnouncingRankings, x, 2, TEXT_SKIP_DRAW, NULL);\n        sGfx->state++;\n        break;\n    case 6:\n        PrintRankedScores(numPlayers);\n        CopyWindowToVram(sGfx->windowIds[0], COPYWIN_GFX);\n        CopyWindowToVram(sGfx->windowIds[1], COPYWIN_GFX);\n        sGfx->state++;\n        break;\n    case 7:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PutWindowTilemap(sGfx->windowIds[0]);\n            PutWindowTilemap(sGfx->windowIds[1]);\n        }\n        CopyBgTilemapBufferToVram(0);\n        sGfx->state++;\n        break;\n    case 8:\n        if (++sGfx->timer >= 30 && JOY_NEW(A_BUTTON))\n        {\n            sGfx->timer = 0;\n            PlaySE(SE_SELECT);\n            if (GetHighestScore() < 3000)\n            {\n                sGfx->state = 127; // Skip to end, past giving prize\n            }\n            else\n            {\n                StopMapMusic();\n                sGfx->state++;\n            }\n\n            FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 5, 30, 15);\n            RemoveWindow(sGfx->windowIds[1]);\n            sGfx->windowIds[1] = AddWindow(&sWindowTemplate_Prize);\n            ClearWindowTilemap(sGfx->windowIds[1]);\n            DrawMessageWindow(&sWindowTemplate_Prize);\n        }\n        break;\n    case 9:\n        PlayNewMapMusic(MUS_LEVEL_UP);\n        FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1));\n        FillWindowPixelBuffer(sGfx->windowIds[1], PIXEL_FILL(1));\n        strWidth = GetStringWidth(FONT_SMALL, gText_AnnouncingPrizes, -1);\n        x = (DISPLAY_WIDTH - 16 - strWidth) / 2;\n        AddTextPrinterParameterized(sGfx->windowIds[0], FONT_SMALL, gText_AnnouncingPrizes, x, 2, TEXT_SKIP_DRAW, NULL);\n        DynamicPlaceholderTextUtil_Reset();\n        CopyItemName(GetPrizeItemId(), strBuff_Small);\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, strBuff_Small);\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(strBuff_Large, gText_FirstPlacePrize);\n        AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, strBuff_Large, 8, 2, TEXT_SKIP_DRAW, NULL);\n        prizeState = TryGivePrize();\n        if (prizeState != PRIZE_RECEIVED && prizeState != NO_PRIZE)\n        {\n            DynamicPlaceholderTextUtil_Reset();\n            CopyItemName(GetPrizeItemId(), strBuff_Small);\n            DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, strBuff_Small);\n            if (prizeState == PRIZE_NO_ROOM)\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(strBuff_Large, gText_CantHoldAnyMore);\n            else if (prizeState == PRIZE_FILLED_BAG)\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(strBuff_Large, gText_FilledStorageSpace);\n            AddTextPrinterParameterized(sGfx->windowIds[1], FONT_SMALL, strBuff_Large, 8, 40, TEXT_SKIP_DRAW, NULL);\n        }\n        CopyWindowToVram(sGfx->windowIds[0], COPYWIN_GFX);\n        CopyWindowToVram(sGfx->windowIds[1], COPYWIN_GFX);\n        sGfx->state++;\n        break;\n    case 10:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PutWindowTilemap(sGfx->windowIds[0]);\n            PutWindowTilemap(sGfx->windowIds[1]);\n        }\n        CopyBgTilemapBufferToVram(BG_INTERFACE);\n        FadeOutAndFadeInNewMapMusic(MUS_VICTORY_WILD, 20, 10);\n        sGfx->state++;\n        break;\n    case 11:\n        if (++sGfx->timer >= 30 && JOY_NEW(A_BUTTON))\n        {\n            sGfx->timer = 0;\n            PlaySE(SE_SELECT);\n            sGfx->state++;\n        }\n        break;\n    default:\n        ClearWindowTilemap(sGfx->windowIds[0]);\n        ClearWindowTilemap(sGfx->windowIds[1]);\n        RemoveWindow(sGfx->windowIds[0]);\n        RemoveWindow(sGfx->windowIds[1]);\n        FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20);\n        CopyBgTilemapBufferToVram(BG_INTERFACE);\n        sGfx->finished = TRUE;\n        break;\n    }\n}\n\nstatic void Msg_WantToPlayAgain(void)\n{\n    u8 y;\n\n    switch (sGfx->state)\n    {\n    case 0:\n        // Create windows\n        sGfx->windowIds[WIN_PLAY_AGAIN] = AddWindow(&sWindowTemplates_PlayAgain[0]);\n        sGfx->windowIds[WIN_YES_NO] = AddWindow(&sWindowTemplates_PlayAgain[1]);\n        ClearWindowTilemap(sGfx->windowIds[WIN_PLAY_AGAIN]);\n        ClearWindowTilemap(sGfx->windowIds[WIN_YES_NO]);\n        DrawMessageWindow(&sWindowTemplates_PlayAgain[WIN_PLAY_AGAIN]);\n        DrawYesNoMessageWindow(&sWindowTemplates_PlayAgain[WIN_YES_NO]);\n        sGfx->state++;\n        sGfx->cursorSelection = PLAY_AGAIN_NONE;\n        sGfx->playAgainState = PLAY_AGAIN_NONE;\n        break;\n    case 1:\n        // Print text\n        FillWindowPixelBuffer(sGfx->windowIds[WIN_PLAY_AGAIN], PIXEL_FILL(1));\n        FillWindowPixelBuffer(sGfx->windowIds[WIN_YES_NO], PIXEL_FILL(1));\n        AddTextPrinterParameterized(sGfx->windowIds[WIN_PLAY_AGAIN], FONT_NORMAL, gText_WantToPlayAgain, 0, 6, TEXT_SKIP_DRAW, NULL);\n        AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], FONT_NORMAL, gText_Yes, 8, 2, TEXT_SKIP_DRAW, NULL);\n        AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], FONT_NORMAL, gText_No, 8, 16, TEXT_SKIP_DRAW, NULL);\n        AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], FONT_NORMAL, gText_SelectorArrow2, 0, 2, TEXT_SKIP_DRAW, NULL);\n        CopyWindowToVram(sGfx->windowIds[WIN_PLAY_AGAIN], COPYWIN_GFX);\n        CopyWindowToVram(sGfx->windowIds[WIN_YES_NO], COPYWIN_GFX);\n        sGfx->state++;\n        break;\n    case 2:\n        // Draw windows\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PutWindowTilemap(sGfx->windowIds[WIN_PLAY_AGAIN]);\n            PutWindowTilemap(sGfx->windowIds[WIN_YES_NO]);\n        }\n        CopyBgTilemapBufferToVram(BG_INTERFACE);\n        sGfx->state++;\n        break;\n    case 3:\n        // Handle input\n        y = sGfx->cursorSelection;\n        if (y == PLAY_AGAIN_NONE)\n            y = PLAY_AGAIN_YES;\n        FillWindowPixelBuffer(sGfx->windowIds[WIN_YES_NO], PIXEL_FILL(1));\n        AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], FONT_NORMAL, gText_Yes, 8, 2, TEXT_SKIP_DRAW, NULL);\n        AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], FONT_NORMAL, gText_No, 8, 16, TEXT_SKIP_DRAW, NULL);\n        AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], FONT_NORMAL, gText_SelectorArrow2, 0, y == 1 ? 2 : 16, TEXT_SKIP_DRAW, NULL);\n        CopyWindowToVram(sGfx->windowIds[WIN_YES_NO], COPYWIN_FULL);\n\n        // Increment state only if A or B button have been pressed.\n        if (JOY_NEW(A_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            if (sGfx->cursorSelection == PLAY_AGAIN_NONE)\n                sGfx->cursorSelection = PLAY_AGAIN_YES;\n            sGfx->state++;\n        }\n        else if (JOY_NEW(DPAD_UP | DPAD_DOWN))\n        {\n            PlaySE(SE_SELECT);\n            switch (sGfx->cursorSelection)\n            {\n            case PLAY_AGAIN_NONE:\n                sGfx->cursorSelection = PLAY_AGAIN_NO;\n                break;\n            case PLAY_AGAIN_YES:\n                sGfx->cursorSelection = PLAY_AGAIN_NO;\n                break;\n            case PLAY_AGAIN_NO:\n                sGfx->cursorSelection = PLAY_AGAIN_YES;\n                break;\n            }\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            sGfx->cursorSelection = PLAY_AGAIN_NO;\n            sGfx->state++;\n        }\n        break;\n    default:\n        sGfx->playAgainState = sGfx->cursorSelection;\n        ClearWindowTilemap(sGfx->windowIds[WIN_PLAY_AGAIN]);\n        ClearWindowTilemap(sGfx->windowIds[WIN_YES_NO]);\n        RemoveWindow(sGfx->windowIds[WIN_PLAY_AGAIN]);\n        RemoveWindow(sGfx->windowIds[WIN_YES_NO]);\n        FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20);\n        CopyBgTilemapBufferToVram(BG_INTERFACE);\n        sGfx->finished = TRUE;\n        break;\n    }\n}\n\nstatic void Msg_SavingDontTurnOff(void)\n{\n    switch (sGfx->state)\n    {\n    case 0:\n        DrawDialogueFrame(0, FALSE);\n        AddTextPrinterParameterized2(0, FONT_NORMAL, gText_SavingDontTurnOffThePower2, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n        sGfx->state++;\n        break;\n    case 1:\n        CopyWindowToVram(0, COPYWIN_FULL);\n        sGfx->state++;\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            CreateTask(Task_LinkFullSave, 0);\n            sGfx->state++;\n        }\n        break;\n    case 3:\n        if (!FuncIsActiveTask(Task_LinkFullSave))\n            sGfx->state++;\n        break;\n    default:\n        FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20);\n        CopyBgTilemapBufferToVram(BG_INTERFACE);\n        sGfx->finished = TRUE;\n        break;\n    }\n}\n\nstatic void Msg_CommunicationStandby(void)\n{\n    switch (sGfx->state)\n    {\n    case 0:\n        sGfx->windowIds[0] = AddWindow(&sWindowTemplate_CommStandby);\n        ClearWindowTilemap(sGfx->windowIds[0]);\n        DrawMessageWindow(&sWindowTemplate_CommStandby);\n        sGfx->state++;\n        break;\n    case 1:\n        FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1));\n        AddTextPrinterParameterized(sGfx->windowIds[0], FONT_NORMAL, gText_CommunicationStandby3, 0, 6, TEXT_SKIP_DRAW, NULL);\n        CopyWindowToVram(sGfx->windowIds[0], COPYWIN_GFX);\n        sGfx->state++;\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            PutWindowTilemap(sGfx->windowIds[0]);\n        CopyBgTilemapBufferToVram(BG_INTERFACE);\n        sGfx->state++;\n        break;\n    default:\n        sGfx->finished = TRUE;\n        break;\n    }\n}\n\nstatic void EraseMessage(void)\n{\n    ClearWindowTilemap(sGfx->windowIds[0]);\n    RemoveWindow(sGfx->windowIds[0]);\n    FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20);\n    CopyBgTilemapBufferToVram(BG_INTERFACE);\n    sGfx->finished = TRUE;\n}\n\nstatic void Msg_SomeoneDroppedOut(void)\n{\n    switch (sGfx->state)\n    {\n    case 0:\n        sGfx->windowIds[0] = AddWindow(&sWindowTemplate_DroppedOut);\n        ClearWindowTilemap(sGfx->windowIds[0]);\n        DrawMessageWindow(&sWindowTemplate_DroppedOut);\n        sGfx->state++;\n        sGfx->timer = 0;\n        sGfx->cursorSelection = 0;\n        sGfx->playAgainState = PLAY_AGAIN_NONE;\n        break;\n    case 1:\n        FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1));\n        AddTextPrinterParameterized(sGfx->windowIds[0], FONT_NORMAL, gText_SomeoneDroppedOut, 0, 6, TEXT_SKIP_DRAW, NULL);\n        CopyWindowToVram(sGfx->windowIds[0], COPYWIN_GFX);\n        sGfx->state++;\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            PutWindowTilemap(sGfx->windowIds[0]);\n        CopyBgTilemapBufferToVram(BG_INTERFACE);\n        sGfx->state++;\n        break;\n    case 3:\n        if (++sGfx->timer >= 120)\n            sGfx->state++;\n        break;\n    default:\n        sGfx->playAgainState = PLAY_AGAIN_DROPPED;\n        ClearWindowTilemap(sGfx->windowIds[0]);\n        RemoveWindow(sGfx->windowIds[0]);\n        FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20);\n        CopyBgTilemapBufferToVram(BG_INTERFACE);\n        sGfx->finished = TRUE;\n        break;\n    }\n}\n\nstatic void StopGfxFuncs(void)\n{\n    DestroyTask(sGfx->taskId);\n    sGfx->finished = TRUE;\n}\n\nstatic void GfxIdle(void)\n{\n\n}\n\nstatic void SetGfxFunc(void (*func)(void))\n{\n    sGfx->state = 0;\n    sGfx->finished = FALSE;\n    sGfx->func = func;\n}\n\nstatic void (*GetGfxFunc(void))(void)\n{\n    return sGfx->func;\n}\n\nstatic bool32 IsGfxFuncActive(void)\n{\n    if (sGfx->finished == TRUE)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic u8 GetPlayAgainState(void)\n{\n    return sGfx->playAgainState;\n}\n\nstatic void InitBgs(void)\n{\n    DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);\n    DmaClear32(3,(void *)OAM, OAM_SIZE);\n    DmaClear16(3, (void *)PLTT, PLTT_SIZE);\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));\n    ChangeBgX(BG_INTERFACE, 0, BG_COORD_SET);\n    ChangeBgY(BG_INTERFACE, 0, BG_COORD_SET);\n    ChangeBgX(BG_TREE_LEFT, 0, BG_COORD_SET);\n    ChangeBgY(BG_TREE_LEFT, 0, BG_COORD_SET);\n    ChangeBgX(BG_TREE_RIGHT, 0, BG_COORD_SET);\n    ChangeBgY(BG_TREE_RIGHT, 0, BG_COORD_SET);\n    ChangeBgX(BG_SCENERY, 0, BG_COORD_SET);\n    ChangeBgY(BG_SCENERY, 0, BG_COORD_SET);\n    InitStandardTextBoxWindows();\n    InitTextBoxGfxAndPrinters();\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);\n    SetBgTilemapBuffer(BG_SCENERY, sGfx->tilemapBuffers[0]);\n    SetBgTilemapBuffer(BG_TREE_LEFT, sGfx->tilemapBuffers[1]);\n    SetBgTilemapBuffer(BG_TREE_RIGHT, sGfx->tilemapBuffers[2]);\n}\n\nstatic bool32 LoadBgGfx(void)\n{\n    switch (sGfx->loadState)\n    {\n    case 0:\n        LoadPalette(sBg_Pal, BG_PLTT_ID(0), sizeof(sBg_Pal));\n        break;\n    case 1:\n        ResetTempTileDataBuffers();\n        break;\n    case 2:\n        DecompressAndCopyTileDataToVram(BG_SCENERY, sBg_Gfx, 0, 0, 0);\n        break;\n    case 3:\n        DecompressAndCopyTileDataToVram(BG_TREE_LEFT, sTreeBorder_Gfx, 0, 0, 0);\n        break;\n    case 4:\n        if (FreeTempTileDataBuffersIfPossible() == TRUE)\n            return FALSE;\n        break;\n    case 5:\n        LoadPalette(GetTextWindowPalette(3), BG_PLTT_ID(13), PLTT_SIZE_4BPP);\n        break;\n    default:\n        sGfx->loadState = 0;\n        return TRUE;\n    }\n\n    sGfx->loadState++;\n    return FALSE;\n}\n"
  },
  {
    "path": "src/dodrio_berry_picking_comm.c",
    "content": "#include \"global.h\"\n#include \"dodrio_berry_picking.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n\nenum {\n    PACKET_READY_START = 1,\n    PACKET_GAME_STATE,\n    PACKET_PICK_STATE,\n    PACKET_READY_END,\n};\n\nstruct ReadyToStartPacket\n{\n    u8 id;\n    bool8 ALIGNED(4) ready;\n};\n\nstruct GameStatePacket\n{\n    u8 id;\n    u8 fallDist_Col0:4;\n    u8 fallDist_Col1:4;\n    u16 fallDist_Col2:4;\n    u16 fallDist_Col3:4;\n    u16 fallDist_Col4:4;\n    u16 fallDist_Col5:4;\n    u16 fallDist_Col6:4;\n    u16 fallDist_Col7:4;\n    u16 fallDist_Col8:4;\n    u16 fallDist_Col9:4;\n    u16 berryId_Col0:2;\n    u16 berryId_Col1:2;\n    u16 berryId_Col2:2;\n    u16 berryId_Col3:2;\n    u16 berryId_Col4:2;\n    u16 berryId_Col5:2;\n    u16 berryId_Col6:2;\n    u16 berryId_Col7:2;\n    u8 berryId_Col8:2;\n    u8 berryId_Col9:2;\n    u8 pickState_Player1:2;\n    u8 pickState_Player2:2;\n    u8 pickState_Player3:2;\n    u8 pickState_Player4:2;\n    u8 pickState_Player5:2;\n    bool8 ateBerry_Player1:1;\n    bool8 ateBerry_Player2:1;\n    bool8 ateBerry_Player3:1;\n    bool8 ateBerry_Player4:1;\n    bool8 ateBerry_Player5:1;\n    u8 numGraySquares:5;\n    bool8 allReadyToEnd:1;\n    bool8 berriesFalling:1;\n    bool8 missedBerry_Player1:1;\n    bool8 missedBerry_Player2:1;\n    bool8 missedBerry_Player3:1;\n    bool8 missedBerry_Player4:1;\n    bool8 missedBerry_Player5:1;\n};\n\nstruct PickStatePacket\n{\n    u8 id;\n    u8 ALIGNED(4) pickState;\n};\n\nstruct ReadyToEndPacket\n{\n    u8 id;\n    bool32 ready;\n};\n\nvoid SendPacket_ReadyToStart(bool32 ready)\n{\n    struct ReadyToStartPacket packet;\n    packet.id = PACKET_READY_START;\n    packet.ready = ready;\n    Rfu_SendPacket(&packet);\n}\n\nbool8 RecvPacket_ReadyToStart(s32 playerId)\n{\n    struct ReadyToStartPacket *packet;\n\n    if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)\n        return FALSE;\n\n    packet = (void *)&gRecvCmds[playerId][1];\n    if (packet->id == PACKET_READY_START)\n        return packet->ready;\n\n    return FALSE;\n}\n\nvoid SendPacket_GameState(struct DodrioGame_Player *player,\n                          struct DodrioGame_PlayerCommData *player1,\n                          struct DodrioGame_PlayerCommData *player2,\n                          struct DodrioGame_PlayerCommData *player3,\n                          struct DodrioGame_PlayerCommData *player4,\n                          struct DodrioGame_PlayerCommData *player5,\n                          u8 numGraySquares,\n                          bool32 berriesFalling,\n                          bool32 allReadyToEnd)\n{\n    struct GameStatePacket packet;\n    struct DodrioGame_Berries *berries = &player->berries;\n\n    packet.id = PACKET_GAME_STATE;\n    packet.fallDist_Col0 = berries->fallDist[0];\n    packet.fallDist_Col1 = berries->fallDist[1];\n    packet.fallDist_Col2 = berries->fallDist[2];\n    packet.fallDist_Col3 = berries->fallDist[3];\n    packet.fallDist_Col4 = berries->fallDist[4];\n    packet.fallDist_Col5 = berries->fallDist[5];\n    packet.fallDist_Col6 = berries->fallDist[6];\n    packet.fallDist_Col7 = berries->fallDist[7];\n    packet.fallDist_Col8 = berries->fallDist[8];\n    packet.fallDist_Col9 = berries->fallDist[9];\n\n    packet.berryId_Col0 = berries->ids[0];\n    packet.berryId_Col1 = berries->ids[1];\n    packet.berryId_Col2 = berries->ids[2];\n    packet.berryId_Col3 = berries->ids[3];\n    packet.berryId_Col4 = berries->ids[4];\n    packet.berryId_Col5 = berries->ids[5];\n    packet.berryId_Col6 = berries->ids[6];\n    packet.berryId_Col7 = berries->ids[7];\n    packet.berryId_Col8 = berries->ids[8];\n    packet.berryId_Col9 = berries->ids[9];\n\n    packet.pickState_Player1 = player1->pickState;\n    packet.pickState_Player2 = player2->pickState;\n    packet.pickState_Player3 = player3->pickState;\n    packet.pickState_Player4 = player4->pickState;\n    packet.pickState_Player5 = player5->pickState;\n\n    packet.ateBerry_Player1 = player1->ateBerry;\n    packet.ateBerry_Player2 = player2->ateBerry;\n    packet.ateBerry_Player3 = player3->ateBerry;\n    packet.ateBerry_Player4 = player4->ateBerry;\n    packet.ateBerry_Player5 = player5->ateBerry;\n\n    packet.missedBerry_Player1 = player1->missedBerry;\n    packet.missedBerry_Player2 = player2->missedBerry;\n    packet.missedBerry_Player3 = player3->missedBerry;\n    packet.missedBerry_Player4 = player4->missedBerry;\n    packet.missedBerry_Player5 = player5->missedBerry;\n\n    packet.numGraySquares = numGraySquares;\n    packet.berriesFalling = berriesFalling;\n    packet.allReadyToEnd = allReadyToEnd;\n    Rfu_SendPacket(&packet);\n}\n\nbool32 RecvPacket_GameState(u32 playerId,\n                            struct DodrioGame_Player *player,\n                            struct DodrioGame_PlayerCommData *player1,\n                            struct DodrioGame_PlayerCommData *player2,\n                            struct DodrioGame_PlayerCommData *player3,\n                            struct DodrioGame_PlayerCommData *player4,\n                            struct DodrioGame_PlayerCommData *player5,\n                            u8 *numGraySquares,\n                            bool32 *berriesFalling,\n                            bool32 *allReadyToEnd)\n{\n    struct GameStatePacket *packet;\n    struct DodrioGame_Berries *berries = &player->berries;\n\n    if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)\n        return FALSE;\n\n    packet = (void *)&gRecvCmds[0][1];\n    if (packet->id == PACKET_GAME_STATE)\n    {\n        berries->fallDist[0] = packet->fallDist_Col0;\n        berries->fallDist[1] = packet->fallDist_Col1;\n        berries->fallDist[2] = packet->fallDist_Col2;\n        berries->fallDist[3] = packet->fallDist_Col3;\n        berries->fallDist[4] = packet->fallDist_Col4;\n        berries->fallDist[5] = packet->fallDist_Col5;\n        berries->fallDist[6] = packet->fallDist_Col6;\n        berries->fallDist[7] = packet->fallDist_Col7;\n        berries->fallDist[8] = packet->fallDist_Col8;\n        berries->fallDist[9] = packet->fallDist_Col9;\n        berries->fallDist[10] = packet->fallDist_Col0;\n\n        berries->ids[0] = packet->berryId_Col0;\n        berries->ids[1] = packet->berryId_Col1;\n        berries->ids[2] = packet->berryId_Col2;\n        berries->ids[3] = packet->berryId_Col3;\n        berries->ids[4] = packet->berryId_Col4;\n        berries->ids[5] = packet->berryId_Col5;\n        berries->ids[6] = packet->berryId_Col6;\n        berries->ids[7] = packet->berryId_Col7;\n        berries->ids[8] = packet->berryId_Col8;\n        berries->ids[9] = packet->berryId_Col9;\n        berries->ids[10] = packet->berryId_Col0;\n\n        player1->pickState = packet->pickState_Player1;\n        player1->ateBerry = packet->ateBerry_Player1;\n        player1->missedBerry = packet->missedBerry_Player1;\n\n        player2->pickState = packet->pickState_Player2;\n        player2->ateBerry = packet->ateBerry_Player2;\n        player2->missedBerry = packet->missedBerry_Player2;\n\n        player3->pickState = packet->pickState_Player3;\n        player3->ateBerry = packet->ateBerry_Player3;\n        player3->missedBerry = packet->missedBerry_Player3;\n\n        player4->pickState = packet->pickState_Player4;\n        player4->ateBerry = packet->ateBerry_Player4;\n        player4->missedBerry = packet->missedBerry_Player4;\n\n        player5->pickState = packet->pickState_Player5;\n        player5->ateBerry = packet->ateBerry_Player5;\n        player5->missedBerry = packet->missedBerry_Player5;\n\n        *numGraySquares = packet->numGraySquares;\n        *berriesFalling = packet->berriesFalling;\n        *allReadyToEnd = packet->allReadyToEnd;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nvoid SendPacket_PickState(u8 pickState)\n{\n    struct PickStatePacket packet;\n    packet.id = PACKET_PICK_STATE;\n    packet.pickState = pickState;\n    Rfu_SendPacket(&packet);\n}\n\nbool32 RecvPacket_PickState(u32 playerId, u8 *pickState)\n{\n    struct PickStatePacket * packet;\n\n    if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)\n        return FALSE;\n\n    packet = (void *)&gRecvCmds[playerId][1];\n    if (packet->id == PACKET_PICK_STATE)\n    {\n        *pickState = packet->pickState;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nvoid SendPacket_ReadyToEnd(bool32 ready)\n{\n    struct ReadyToEndPacket packet;\n    packet.id = PACKET_READY_END;\n    packet.ready = ready;\n    Rfu_SendPacket(&packet);\n}\n\nbool32 RecvPacket_ReadyToEnd(u32 playerId)\n{\n    struct ReadyToEndPacket * packet;\n\n    if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)\n        return FALSE;\n\n    packet = (void *)&gRecvCmds[playerId][1];\n    if (packet->id == PACKET_READY_END)\n        return packet->ready;\n\n    return FALSE;\n}\n"
  },
  {
    "path": "src/dynamic_placeholder_text_util.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"constants/event_objects.h\"\n\nstatic EWRAM_DATA const u8 *sStringPointers[8] = {0};\n\n#define COLORS(a, b)((a) | (b << 4))\n\nstatic const u8 sTextColorTable[] =\n{\n // [LOW_NYBBLE / 2]                            = 0xXY, // HIGH_NYBBLE\n    [OBJ_EVENT_GFX_RED_NORMAL / 2]              = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_RED_BIKE\n    [OBJ_EVENT_GFX_RED_SURF / 2]                = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_RED_FIELD_MOVE\n    [OBJ_EVENT_GFX_RED_FISH / 2]                = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_RED_VS_SEEKER\n    [OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE / 2]      = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_GREEN_NORMAL\n    [OBJ_EVENT_GFX_GREEN_BIKE / 2]              = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_GREEN_SURF\n    [OBJ_EVENT_GFX_GREEN_FIELD_MOVE / 2]        = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_GREEN_FISH\n    [OBJ_EVENT_GFX_GREEN_VS_SEEKER / 2]         = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE\n    [OBJ_EVENT_GFX_RS_BRENDAN / 2]              = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_RS_MAY\n    [OBJ_EVENT_GFX_LITTLE_BOY / 2]              = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_LITTLE_GIRL\n    [OBJ_EVENT_GFX_YOUNGSTER / 2]               = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_BOY\n    [OBJ_EVENT_GFX_BUG_CATCHER / 2]             = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_SITTING_BOY\n    [OBJ_EVENT_GFX_LASS / 2]                    = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_WOMAN_1\n    [OBJ_EVENT_GFX_BATTLE_GIRL / 2]             = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MAN\n    [OBJ_EVENT_GFX_ROCKER / 2]                  = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_FAT_MAN\n    [OBJ_EVENT_GFX_WOMAN_2 / 2]                 = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_BEAUTY\n    [OBJ_EVENT_GFX_BALDING_MAN / 2]             = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_WOMAN_3\n    [OBJ_EVENT_GFX_OLD_MAN_1 / 2]               = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_OLD_MAN_2\n    [OBJ_EVENT_GFX_OLD_MAN_LYING_DOWN / 2]      = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_OLD_WOMAN\n    [OBJ_EVENT_GFX_TUBER_M_WATER / 2]           = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_TUBER_F\n    [OBJ_EVENT_GFX_TUBER_M_LAND / 2]            = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_CAMPER\n    [OBJ_EVENT_GFX_PICNICKER / 2]               = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_COOLTRAINER_M\n    [OBJ_EVENT_GFX_COOLTRAINER_F / 2]           = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_SWIMMER_M_WATER\n    [OBJ_EVENT_GFX_SWIMMER_F_WATER / 2]         = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_SWIMMER_M_LAND\n    [OBJ_EVENT_GFX_SWIMMER_F_LAND / 2]          = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_WORKER_M\n    [OBJ_EVENT_GFX_WORKER_F / 2]                = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_ROCKET_M\n    [OBJ_EVENT_GFX_ROCKET_F / 2]                = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_GBA_KID\n    [OBJ_EVENT_GFX_SUPER_NERD / 2]              = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_BIKER\n    [OBJ_EVENT_GFX_BLACKBELT / 2]               = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_SCIENTIST\n    [OBJ_EVENT_GFX_HIKER / 2]                   = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_FISHER\n    [OBJ_EVENT_GFX_CHANNELER / 2]               = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_CHEF\n    [OBJ_EVENT_GFX_POLICEMAN / 2]               = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_GENTLEMAN\n    [OBJ_EVENT_GFX_SAILOR / 2]                  = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_CAPTAIN\n    [OBJ_EVENT_GFX_NURSE / 2]                   = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST\n    [OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST / 2] = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_UNUSED_MALE_RECEPTIONIST\n    [OBJ_EVENT_GFX_CLERK / 2]                   = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MG_DELIVERYMAN\n    [OBJ_EVENT_GFX_TRAINER_TOWER_DUDE / 2]      = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_PROF_OAK\n    [OBJ_EVENT_GFX_BLUE / 2]                    = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_BILL\n    [OBJ_EVENT_GFX_LANCE / 2]                   = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_AGATHA\n    [OBJ_EVENT_GFX_DAISY / 2]                   = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_LORELEI\n    [OBJ_EVENT_GFX_MR_FUJI / 2]                 = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_BRUNO\n    [OBJ_EVENT_GFX_BROCK / 2]                   = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_MISTY\n    [OBJ_EVENT_GFX_LT_SURGE / 2]                = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_ERIKA\n    [OBJ_EVENT_GFX_KOGA / 2]                    = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_SABRINA\n    [OBJ_EVENT_GFX_BLAINE / 2]                  = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_GIOVANNI\n    [OBJ_EVENT_GFX_MOM / 2]                     = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_CELIO\n    [OBJ_EVENT_GFX_TEACHY_TV_HOST / 2]          = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_GYM_GUY\n    [OBJ_EVENT_GFX_ITEM_BALL / 2]               = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_TOWN_MAP\n    [OBJ_EVENT_GFX_POKEDEX / 2]                 = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_CUT_TREE\n    [OBJ_EVENT_GFX_ROCK_SMASH_ROCK / 2]         = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_PUSHABLE_BOULDER\n    [OBJ_EVENT_GFX_FOSSIL / 2]                  = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_RUBY\n    [OBJ_EVENT_GFX_SAPPHIRE / 2]                = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_OLD_AMBER\n    [OBJ_EVENT_GFX_GYM_SIGN / 2]                = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_SIGN\n    [OBJ_EVENT_GFX_TRAINER_TIPS / 2]            = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_CLIPBOARD\n    [OBJ_EVENT_GFX_METEORITE / 2]               = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_LAPRAS_DOLL\n    [OBJ_EVENT_GFX_SEAGALLOP / 2]               = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_SNORLAX\n    [OBJ_EVENT_GFX_SPEAROW / 2]                 = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_CUBONE\n    [OBJ_EVENT_GFX_POLIWRATH / 2]               = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_CLEFAIRY\n    [OBJ_EVENT_GFX_PIDGEOT / 2]                 = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_JIGGLYPUFF\n    [OBJ_EVENT_GFX_PIDGEY / 2]                  = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_CHANSEY\n    [OBJ_EVENT_GFX_OMANYTE / 2]                 = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_KANGASKHAN\n    [OBJ_EVENT_GFX_PIKACHU / 2]                 = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_PSYDUCK\n    [OBJ_EVENT_GFX_NIDORAN_F / 2]               = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_NIDORAN_M\n    [OBJ_EVENT_GFX_NIDORINO / 2]                = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_MEOWTH\n    [OBJ_EVENT_GFX_SEEL / 2]                    = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_VOLTORB\n    [OBJ_EVENT_GFX_SLOWPOKE / 2]                = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_SLOWBRO\n    [OBJ_EVENT_GFX_MACHOP / 2]                  = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_WIGGLYTUFF\n    [OBJ_EVENT_GFX_DODUO / 2]                   = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_FEAROW\n    [OBJ_EVENT_GFX_MACHOKE / 2]                 = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_LAPRAS\n    [OBJ_EVENT_GFX_ZAPDOS / 2]                  = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_MOLTRES\n    [OBJ_EVENT_GFX_ARTICUNO / 2]                = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_MEWTWO\n    [OBJ_EVENT_GFX_MEW / 2]                     = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_ENTEI\n    [OBJ_EVENT_GFX_SUICUNE / 2]                 = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_RAIKOU\n    [OBJ_EVENT_GFX_LUGIA / 2]                   = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_HO_OH\n    [OBJ_EVENT_GFX_CELEBI / 2]                  = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_KABUTO\n    [OBJ_EVENT_GFX_DEOXYS_D / 2]                = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_DEOXYS_A\n    [OBJ_EVENT_GFX_DEOXYS_N / 2]                = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_NEUTRAL), // OBJ_EVENT_GFX_SS_ANNE\n    [OBJ_EVENT_GFX_CUE_BALL / 2]                = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_PAINTER\n    [OBJ_EVENT_GFX_BIRD_KEEPER / 2]             = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_BURGLAR\n    [OBJ_EVENT_GFX_POKEMON_RANGER_F / 2]        = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_POKEMON_RANGER_M\n    [OBJ_EVENT_GFX_RUIN_MANIAC / 2]             = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_POKE_MANIAC\n    [OBJ_EVENT_GFX_PSYCHIC_M / 2]               = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_PSYCHIC_F\n    [OBJ_EVENT_GFX_AROMA_LADY / 2]              = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_TWIN\n    [OBJ_EVENT_GFX_YOUNG_COUPLE_M / 2]          = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_YOUNG_COUPLE_F\n    [OBJ_EVENT_GFX_ENGINEER / 2]                = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_JUGGLER\n    [OBJ_EVENT_GFX_TAMER / 2]                   = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_POKEMON_BREEDER\n    [OBJ_EVENT_GFX_RED_UNDERWATER / 2]          = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_GREEN_UNDERWATER\n    [OBJ_EVENT_GFX_SCOTT / 2]                   = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_BULBASAUR\n    [OBJ_EVENT_GFX_CHARMANDER / 2]              = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_SQUIRTLE\n    [OBJ_EVENT_GFX_LATIAS / 2]                  = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_MON), // OBJ_EVENT_GFX_LATIOS\n    [OBJ_EVENT_GFX_EM_BRENDAN /2]               = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVEN_GFX_EM_MAY\n    [OBJ_EVENT_GFX_CABLE_CAR /2]                = COLORS(NPC_TEXT_COLOR_NEUTRAL, NPC_TEXT_COLOR_MON), // OBJ_EVEN_GFX_SUDOWOODO\n    [OBJ_EVENT_GFX_ABRA /2]                     = COLORS(NPC_TEXT_COLOR_MON, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_SWIMMER_F_WATER_2\n    [OBJ_EVENT_GFX_MASTER_BEAUTY / 2]           = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MASTER_BIRD_KEEPER\n    [OBJ_EVENT_GFX_MASTER_BLACK_BELT / 2]       = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MASTER_BUG_CATCHER\n    [OBJ_EVENT_GFX_MASTER_COOLTRAINER_M / 2]    = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MASTER_HIKER\n    [OBJ_EVENT_GFX_MASTER_LASS / 2]             = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MASTER_PSYCHIC_M\n    [OBJ_EVENT_GFX_MASTER_SCIENTIST / 2]        = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_MASTER_YOUNGSTER\n    [OBJ_EVENT_GFX_LADY / 2]                    = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_ROCKER_2\n    [OBJ_EVENT_GFX_ANABEL / 2]                  = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_TUCKER\n    [OBJ_EVENT_GFX_GRETA / 2]                   = COLORS(NPC_TEXT_COLOR_FEMALE, NPC_TEXT_COLOR_MALE), // OBJ_EVENT_GFX_SPENSER\n    [OBJ_EVENT_GFX_NOLAND / 2]                  = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_LUCY\n    [OBJ_EVENT_GFX_BRANDON / 2]                 = COLORS(NPC_TEXT_COLOR_MALE, NPC_TEXT_COLOR_FEMALE), // OBJ_EVENT_GFX_\n};\n\nvoid DynamicPlaceholderTextUtil_Reset(void)\n{\n    const u8 **ptr = sStringPointers;\n    u8 *fillval = NULL;\n    const u8 **ptr2 = ptr + (NELEMS(sStringPointers) - 1);\n    \n    do\n    {\n        *ptr2-- = fillval;\n    }\n    while ((intptr_t)ptr2 >= (intptr_t)ptr);\n}\n\nvoid DynamicPlaceholderTextUtil_SetPlaceholderPtr(u8 idx, const u8 *ptr)\n{\n    if (idx < NELEMS(sStringPointers))\n        sStringPointers[idx] = ptr;\n}\n\nu8 *DynamicPlaceholderTextUtil_ExpandPlaceholders(u8 *dest, const u8 *src)\n{\n    while (*src != EOS)\n    {\n        if (*src != CHAR_DYNAMIC)\n        {\n            *dest++ = *src++;\n        }\n        else\n        {\n            src++;\n            if (sStringPointers[*src] != NULL)\n                dest = StringCopy(dest, sStringPointers[*src]);\n            src++;\n        }\n    }\n    *dest = EOS;\n    return dest;\n}\n\nconst u8 *DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 idx)\n{\n    return sStringPointers[idx];\n}\n\nu8 GetColorFromTextColorTable(u16 graphicId)\n{\n    u32 test = graphicId >> 1;\n    u32 shift = (graphicId & 1) << 2;\n\n    if (test >= NELEMS(sTextColorTable))\n        return 3;\n    else\n        return (sTextColorTable[graphicId >> 1] >> shift) & 0xF;\n}\n"
  },
  {
    "path": "src/easy_chat.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"easy_chat.h\"\n#include \"event_data.h\"\n#include \"field_message_box.h\"\n#include \"mystery_gift.h\"\n#include \"menu.h\"\n#include \"mail.h\"\n#include \"pokedex.h\"\n#include \"random.h\"\n#include \"strings.h\"\n#include \"constants/easy_chat.h\"\n\nstruct Unk203A120\n{\n    u16 numGroups;\n    u16 groups[EC_NUM_GROUPS];\n    u16 alphabeticalGroups[27];\n    u16 alphabeticalWordsByGroup[27][270];\n    u8 filler3958[0x2C];\n    u16 allWords[270];\n    u16 totalWords;\n}; /*size = 0x3BA4*/\n\nstatic EWRAM_DATA struct Unk203A120 * sEasyChatSelectionData = NULL;\n\nstatic bool8 EC_IsNationalPokedexEnabled(void);\nstatic u16 GetRandomECPokemon(void);\nstatic void PopulateECGroups(void);\nstatic void PopulateAlphabeticalGroups(void);\nstatic u16 GetUnlockedWordsInECGroup(u16);\nstatic u16 GetUnlockedWordsInAlphabeticalGroup(u16);\nstatic bool8 UnlockedECMonOrMove(u16, u8);\nstatic bool32 EC_IsDeoxys(u16 species);\nstatic bool8 IsWordUnlocked(u16 word);\n\n#include \"data/easy_chat/easy_chat_groups.h\"\n#include \"data/easy_chat/easy_chat_words_by_letter.h\"\n\nstatic const u8 *const sEasyChatGroupNamePointers[] = {\n    [EC_GROUP_POKEMON] = gEasyChatGroupName_Pokemon,\n    [EC_GROUP_TRAINER] = gEasyChatGroupName_Trainer,\n    [EC_GROUP_STATUS] = gEasyChatGroupName_Status,\n    [EC_GROUP_BATTLE] = gEasyChatGroupName_Battle,\n    [EC_GROUP_GREETINGS] = gEasyChatGroupName_Greetings,\n    [EC_GROUP_PEOPLE] = gEasyChatGroupName_People,\n    [EC_GROUP_VOICES] = gEasyChatGroupName_Voices,\n    [EC_GROUP_SPEECH] = gEasyChatGroupName_Speech,\n    [EC_GROUP_ENDINGS] = gEasyChatGroupName_Endings,\n    [EC_GROUP_FEELINGS] = gEasyChatGroupName_Feelings,\n    [EC_GROUP_CONDITIONS] = gEasyChatGroupName_Conditions,\n    [EC_GROUP_ACTIONS] = gEasyChatGroupName_Actions,\n    [EC_GROUP_LIFESTYLE] = gEasyChatGroupName_Lifestyle,\n    [EC_GROUP_HOBBIES] = gEasyChatGroupName_Hobbies,\n    [EC_GROUP_TIME] = gEasyChatGroupName_Time,\n    [EC_GROUP_MISC] = gEasyChatGroupName_Misc,\n    [EC_GROUP_ADJECTIVES] = gEasyChatGroupName_Adjectives,\n    [EC_GROUP_EVENTS] = gEasyChatGroupName_Events,\n    [EC_GROUP_MOVE_1] = gEasyChatGroupName_Move1,\n    [EC_GROUP_MOVE_2] = gEasyChatGroupName_Move2,\n    [EC_GROUP_TRENDY_SAYING] = gEasyChatGroupName_TrendySaying,\n    [EC_GROUP_POKEMON_2] = gEasyChatGroupName_Pokemon2,\n};\n\nstatic const u16 sDefaultProfileWords[] = {\n    EC_WORD_I_AM,\n    EC_WORD_A,\n    EC_WORD_POKEMON,\n    EC_WORD_FRIEND,\n};\n\nstatic const u16 sDefaultBattleStartWords[] = {\n    EC_WORD_ARE,\n    EC_WORD_YOU,\n    EC_WORD_READY,\n    EC_WORD_QUES,\n    EC_WORD_HERE_I_COME,\n    EC_WORD_EXCL,\n};\n\nstatic const u16 sDeoxysValue[] = {\n    SPECIES_DEOXYS,\n};\n\nstatic bool8 IsECGroupUnlocked(u8 groupId)\n{\n    switch (groupId)\n    {\n    case EC_GROUP_TRENDY_SAYING:\n        return FALSE;\n    case EC_GROUP_EVENTS:\n    case EC_GROUP_MOVE_1:\n    case EC_GROUP_MOVE_2:\n        return FlagGet(FLAG_SYS_GAME_CLEAR);\n    case EC_GROUP_POKEMON:\n        return EC_IsNationalPokedexEnabled();\n    default:\n        return TRUE;\n    }\n}\n\nstatic u16 EasyChat_GetNumWordsInGroup(u8 groupId)\n{\n    if (groupId == EC_GROUP_POKEMON)\n        return GetNationalPokedexCount(FLAG_GET_SEEN);\n\n    if (IsECGroupUnlocked(groupId))\n        return sEasyChatGroups[groupId].numEnabledWords;\n\n    return 0;\n}\n\nstatic bool8 IsECWordInvalid(u16 easyChatWord)\n{\n    u32 i;\n    u8 groupId;\n    u32 index;\n    u16 numWords;\n    const u16 *list;\n    if (easyChatWord == EC_WORD_UNDEFINED)\n        return FALSE;\n\n    groupId = EC_GROUP(easyChatWord);\n    index = EC_INDEX(easyChatWord);\n    if (groupId >= EC_NUM_GROUPS)\n        return TRUE;\n\n    numWords = sEasyChatGroups[groupId].numWords;\n    switch (groupId)\n    {\n    case EC_GROUP_POKEMON:\n    case EC_GROUP_POKEMON_2:\n    case EC_GROUP_MOVE_1:\n    case EC_GROUP_MOVE_2:\n        list = sEasyChatGroups[groupId].wordData.valueList;\n        for (i = 0; i < numWords; i++)\n        {\n            if (index == list[i])\n                return FALSE;\n        }\n        return TRUE;\n    default:\n        if (index >= numWords)\n            return TRUE;\n        else\n            return FALSE;\n    }\n}\n\nstatic const u8 *GetEasyChatWord(u8 groupId, u16 index)\n{\n    switch (groupId)\n    {\n    case EC_GROUP_POKEMON:\n    case EC_GROUP_POKEMON_2:\n        return gSpeciesNames[index];\n    case EC_GROUP_MOVE_1:\n    case EC_GROUP_MOVE_2:\n        return gMoveNames[index];\n    default:\n        return sEasyChatGroups[groupId].wordData.words[index].text;\n    }\n}\n\nu8 *CopyEasyChatWord(u8 *dest, u16 easyChatWord)\n{\n    u8 *resultStr;\n    if (IsECWordInvalid(easyChatWord))\n    {\n        resultStr = StringCopy(dest, gText_ThreeQuestionMarks);\n    }\n    else if (easyChatWord != EC_WORD_UNDEFINED)\n    {\n        u16 index = EC_INDEX(easyChatWord);\n        u8 groupId = EC_GROUP(easyChatWord);\n        resultStr = StringCopy(dest, GetEasyChatWord(groupId, index));\n    }\n    else\n    {\n        *dest = EOS;\n        resultStr = dest;\n    }\n\n    return resultStr;\n}\n\nu8 *ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows)\n{\n    u16 i, j;\n    u16 numColumns = columns - 1;\n\n    for (i = 0; i < rows; i++)\n    {\n        for (j = 0; j < numColumns; j++)\n        {\n            dest = CopyEasyChatWord(dest, *src);\n            if (*src != EC_WORD_UNDEFINED)\n            {\n                *dest = CHAR_SPACE;\n                dest++;\n            }\n\n            src++;\n        }\n\n        dest = CopyEasyChatWord(dest, *(src++));\n        *dest = CHAR_NEWLINE;\n        dest++;\n    }\n\n    dest--;\n    *dest = EOS;\n    return dest;\n}\n\nstatic u16 GetEasyChatWordStringLength(u16 easyChatWord)\n{\n    if (easyChatWord == EC_WORD_UNDEFINED)\n        return 0;\n\n    if (IsECWordInvalid(easyChatWord))\n    {\n        return StringLength(gText_ThreeQuestionMarks);\n    }\n    else\n    {\n        u16 index = EC_INDEX(easyChatWord);\n        u8 groupId = EC_GROUP(easyChatWord);\n        return StringLength(GetEasyChatWord(groupId, index));\n    }\n}\n\nbool8 EC_DoesEasyChatStringFitOnLine(const u16 *easyChatWords, u8 columns, u8 rows, u16 maxLength)\n{\n    u8 i, j;\n\n    for (i = 0; i < rows; i++)\n    {\n        u16 totalLength = columns - 1;\n        for (j = 0; j < columns; j++)\n            totalLength += GetEasyChatWordStringLength(*(easyChatWords++));\n\n        if (totalLength > maxLength)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic u16 GetRandomWordFromGroup(u16 groupId)\n{\n    u16 index = Random() % sEasyChatGroups[groupId].numWords;\n    if (groupId == EC_GROUP_POKEMON_2\n     || groupId == EC_GROUP_POKEMON\n     || groupId == EC_GROUP_MOVE_1\n     || groupId == EC_GROUP_MOVE_2)\n    {\n        index = sEasyChatGroups[groupId].wordData.valueList[index];\n    }\n\n    return EC_WORD(groupId, index);\n}\n\nstatic u16 GetRandomWordFromAnyGroup(u16 groupId)\n{\n    if (!IsECGroupUnlocked(groupId))\n        return EC_WORD_UNDEFINED;\n\n    if (groupId == EC_GROUP_POKEMON)\n        return GetRandomECPokemon();\n\n    return GetRandomWordFromGroup(groupId);\n}\n\nvoid ShowEasyChatMessage(void)\n{\n    u16 *easyChatWords;\n    int columns, rows;\n    switch (gSpecialVar_0x8004)\n    {\n    case 0:\n        easyChatWords = gSaveBlock1Ptr->easyChatProfile;\n        columns = 2;\n        rows = 2;\n        break;\n    case 1:\n        easyChatWords = gSaveBlock1Ptr->easyChatBattleStart;\n        if (EC_DoesEasyChatStringFitOnLine(gSaveBlock1Ptr->easyChatBattleStart, 3, 2, 18))\n        {\n            columns = 2;\n            rows = 3;\n        }\n        else\n        {\n            columns = 3;\n            rows = 2;\n        }\n        break;\n    case 2:\n        easyChatWords = gSaveBlock1Ptr->easyChatBattleWon;\n        columns = 3;\n        rows = 2;\n        break;\n    case 3:\n        easyChatWords = gSaveBlock1Ptr->easyChatBattleLost;\n        columns = 3;\n        rows = 2;\n        break;\n    default:\n        return;\n    }\n\n    ConvertEasyChatWordsToString(gStringVar4, easyChatWords, columns, rows);\n    ShowFieldAutoScrollMessage(gStringVar4);\n}\n\nvoid BufferRandomHobbyOrLifestyleString(void)\n{\n    int groupId = Random() & 1 ? EC_GROUP_HOBBIES : EC_GROUP_LIFESTYLE;\n    u16 easyChatWord = GetRandomWordFromAnyGroup(groupId);\n    CopyEasyChatWord(gStringVar2, easyChatWord);\n}\n\nstatic bool8 IsTrendySayingUnlocked(u8 additionalPhraseId)\n{\n    int byteOffset = additionalPhraseId / 8;\n    int shift = additionalPhraseId % 8;\n    return (gSaveBlock1Ptr->additionalPhrases[byteOffset] >> shift) & 1;\n}\n\nvoid EnableRareWord(u8 additionalPhraseId)\n{\n    if (additionalPhraseId < 33)\n    {\n        int byteOffset = additionalPhraseId / 8;\n        int shift = additionalPhraseId % 8;\n        gSaveBlock1Ptr->additionalPhrases[byteOffset] |= 1 << shift;\n    }\n}\n\nstatic u8 GetNumUnlockedTrendySayings(void)\n{\n    u32 i;\n    u8 numAdditionalPhrasesUnlocked;\n\n    for (i = 0, numAdditionalPhrasesUnlocked = 0; i < 33; i++)\n    {\n        if (IsTrendySayingUnlocked(i))\n            numAdditionalPhrasesUnlocked++;\n    }\n\n    return numAdditionalPhrasesUnlocked;\n}\n\nstatic u16 UnlockRandomTrendySaying(void)\n{\n    u32 i;\n    u16 additionalPhraseId;\n    u8 numAdditionalPhrasesUnlocked = GetNumUnlockedTrendySayings();\n    if (numAdditionalPhrasesUnlocked == 33)\n        return EC_WORD_UNDEFINED;\n\n    additionalPhraseId = Random() % (33 - numAdditionalPhrasesUnlocked);\n    for (i = 0; i < 33; i++)\n    {\n        if (!IsTrendySayingUnlocked(i))\n        {\n            if (additionalPhraseId)\n            {\n                additionalPhraseId--;\n            }\n            else\n            {\n                EnableRareWord(i);\n                return EC_WORD(EC_GROUP_TRENDY_SAYING, i);\n            }\n        }\n    }\n\n    return EC_WORD_UNDEFINED;\n}\n\nstatic u16 GetRandomUnlockedTrendySaying(void)\n{\n    u32 i;\n    u16 additionalPhraseId = GetNumUnlockedTrendySayings();\n    if (additionalPhraseId == 0)\n        return EC_WORD_UNDEFINED;\n\n    additionalPhraseId = Random() % additionalPhraseId;\n    for (i = 0; i < 33; i++)\n    {\n        if (IsTrendySayingUnlocked(i))\n        {\n            if (additionalPhraseId)\n                additionalPhraseId--;\n            else\n                return EC_WORD(EC_GROUP_TRENDY_SAYING, i);\n        }\n    }\n\n    return EC_WORD_UNDEFINED;\n}\n\nstatic bool8 EC_IsNationalPokedexEnabled(void)\n{\n    return IsNationalPokedexEnabled();\n}\n\nstatic u16 GetRandomECPokemon(void)\n{\n    u32 i;\n    u16 numWords;\n    const u16 *species;\n    u16 index = EasyChat_GetNumWordsInGroup(EC_GROUP_POKEMON_2);\n    if (index == 0)\n        return EC_WORD_UNDEFINED;\n\n    index = Random() % index;\n    species = sEasyChatGroups[EC_GROUP_POKEMON_2].wordData.valueList;\n    numWords = sEasyChatGroups[EC_GROUP_POKEMON_2].numWords;\n    for (i = 0; i < numWords; i++)\n    {\n        u16 dexNum = SpeciesToNationalPokedexNum(*species);\n        if (GetSetPokedexFlag(dexNum, FLAG_GET_SEEN))\n        {\n            if (index)\n                index--;\n            else\n                return EC_WORD(EC_GROUP_POKEMON_2, *species);\n        }\n\n        species++;\n    }\n\n    return EC_WORD_UNDEFINED;\n}\n\nvoid InitEasyChatPhrases(void)\n{\n    u16 i, j;\n\n    for (i = 0; i < 4; i++)\n        gSaveBlock1Ptr->easyChatProfile[i] = sDefaultProfileWords[i];\n\n    for (i = 0; i < 6; i++)\n        gSaveBlock1Ptr->easyChatBattleStart[i] = sDefaultBattleStartWords[i];\n\n    for (i = 0; i < 6; i++)\n    {\n        gSaveBlock1Ptr->easyChatBattleWon[i] = EC_WORD_UNDEFINED;\n        gSaveBlock1Ptr->easyChatBattleLost[i] = EC_WORD_UNDEFINED;\n    }\n\n    for (i = 0; i < MAIL_COUNT; i++)\n    {\n        for (j = 0; j < MAIL_WORDS_COUNT; j++)\n            gSaveBlock1Ptr->mail[i].words[j] = EC_WORD_UNDEFINED;\n    }\n\n#ifndef UBFIX\n    // BUG: This is supposed to clear 64 bits, but this loop is clearing 64 bytes.\n    // However, this bug has no resulting effect on gameplay because only the\n    // Mauville old man data is corrupted, which is initialized directly after\n    // this function is called when starting a new game.\n    for (i = 0; i < 64; i++)\n        gSaveBlock1Ptr->additionalPhrases[i] = 0;\n#else\n    for (i = 0; i < NELEMS(gSaveBlock1Ptr->additionalPhrases); i++)\n        gSaveBlock1Ptr->additionalPhrases[i] = 0;\n#endif\n}\n\nvoid InitQuestionnaireWords(void)\n{\n    s32 i;\n    u16 *ptr = GetQuestionnaireWordsPtr();\n    for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++)\n        ptr[i] = EC_WORD_UNDEFINED;\n}\n\nbool8 InitEasyChatSelection(void)\n{\n    sEasyChatSelectionData = Alloc(sizeof(*sEasyChatSelectionData));\n    if (sEasyChatSelectionData == NULL)\n        return FALSE;\n\n    PopulateECGroups();\n    PopulateAlphabeticalGroups();\n    return TRUE;\n}\n\nvoid DestroyEasyChatSelectionData(void)\n{\n    if (sEasyChatSelectionData != NULL)\n        Free(sEasyChatSelectionData);\n}\n\nstatic void PopulateECGroups(void)\n{\n    int i;\n\n    sEasyChatSelectionData->numGroups = 0;\n    if (GetNationalPokedexCount(FLAG_GET_SEEN))\n        sEasyChatSelectionData->groups[sEasyChatSelectionData->numGroups++] = EC_GROUP_POKEMON;\n\n    for (i = EC_GROUP_TRAINER; i <= EC_GROUP_ADJECTIVES; i++)\n        sEasyChatSelectionData->groups[sEasyChatSelectionData->numGroups++] = i;\n\n    if (FlagGet(FLAG_SYS_GAME_CLEAR))\n    {\n        sEasyChatSelectionData->groups[sEasyChatSelectionData->numGroups++] = EC_GROUP_EVENTS;\n        sEasyChatSelectionData->groups[sEasyChatSelectionData->numGroups++] = EC_GROUP_MOVE_1;\n        sEasyChatSelectionData->groups[sEasyChatSelectionData->numGroups++] = EC_GROUP_MOVE_2;\n    }\n\n    if (IsNationalPokedexEnabled())\n        sEasyChatSelectionData->groups[sEasyChatSelectionData->numGroups++] = EC_GROUP_POKEMON_2;\n}\n\nu8 GetNumDisplayableGroups(void)\n{\n    return sEasyChatSelectionData->numGroups;\n}\n\nu8 GetSelectedGroupByIndex(u8 index)\n{\n    if (index >= sEasyChatSelectionData->numGroups)\n        return EC_NUM_GROUPS;\n    else\n        return sEasyChatSelectionData->groups[index];\n}\n\n// Unused\nstatic u8 *BufferEasyChatWordGroupName(u8 *dest, u8 groupId, u16 totalChars)\n{\n    u32 i;\n    u8 *str = StringCopy(dest, sEasyChatGroupNamePointers[groupId]);\n    for (i = str - dest; i < totalChars; i++)\n    {\n        *str = CHAR_SPACE;\n        str++;\n    }\n\n    *str = EOS;\n    return str;\n}\n\nconst u8 *GetEasyChatWordGroupName(u8 groupId)\n{\n    return sEasyChatGroupNamePointers[groupId];\n}\n\nu8 *CopyEasyChatWordPadded(u8 *dest, u16 easyChatWord, u16 totalChars)\n{\n    u32 i;\n    u8 *str = CopyEasyChatWord(dest, easyChatWord);\n    for (i = str - dest; i < totalChars; i++)\n    {\n        *str = CHAR_SPACE;\n        str++;\n    }\n\n    *str = EOS;\n    return str;\n}\n\nstatic void PopulateAlphabeticalGroups(void)\n{\n    static int i;\n    static int j;\n    static int k;\n    static int index;\n    static int numWords;\n    static int numToProcess;\n    static const u16 *words;\n\n    for (i = 0; i < 27; i++)\n    {\n        numWords = sEasyChatWordsByLetterPointers[i].numWords;\n        words = sEasyChatWordsByLetterPointers[i].words;\n        sEasyChatSelectionData->alphabeticalGroups[i] = 0;\n        index = 0;\n        for (j = 0; j < numWords; )\n        {\n            if (*words == EC_WORD_UNDEFINED)\n            {\n                words++;\n                numToProcess = *words++;\n                j += 2;\n            }\n            else\n            {\n                numToProcess = 1;\n            }\n\n            for (k = 0; k < numToProcess; k++)\n            {\n                if (IsWordUnlocked(words[k]))\n                {\n                    sEasyChatSelectionData->alphabeticalWordsByGroup[i][index++] = words[k];\n                    sEasyChatSelectionData->alphabeticalGroups[i]++;\n                    break;\n                }\n            }\n\n            words += numToProcess;\n            j += numToProcess;\n        }\n    }\n}\n\nvoid GetUnlockedECWords(bool32 isAlphabetical, u16 groupId)\n{\n    if (!isAlphabetical)\n        sEasyChatSelectionData->totalWords = GetUnlockedWordsInECGroup(groupId);\n    else\n        sEasyChatSelectionData->totalWords = GetUnlockedWordsInAlphabeticalGroup(groupId);\n}\n\nu16 GetDisplayedWordByIndex(u16 index)\n{\n    if (index >= sEasyChatSelectionData->totalWords)\n        return EC_WORD_UNDEFINED;\n    else\n        return sEasyChatSelectionData->allWords[index];\n}\n\nu16 GetNumDisplayedWords(void)\n{\n    return sEasyChatSelectionData->totalWords;\n}\n\nstatic u16 GetUnlockedWordsInECGroup(u16 groupId)\n{\n    u32 i;\n    u16 totalWords;\n    const u16 *list;\n    const struct EasyChatWordInfo * wordInfo;\n    u16 numWords = sEasyChatGroups[groupId].numWords;\n\n    if (groupId == EC_GROUP_POKEMON_2 || groupId == EC_GROUP_POKEMON\n     || groupId == EC_GROUP_MOVE_1  || groupId == EC_GROUP_MOVE_2)\n    {\n        list = sEasyChatGroups[groupId].wordData.valueList;\n        for (i = 0, totalWords = 0; i < numWords; i++)\n        {\n            if (UnlockedECMonOrMove(list[i], groupId))\n                sEasyChatSelectionData->allWords[totalWords++] = EC_WORD(groupId, list[i]);\n        }\n\n        return totalWords;\n    }\n    else\n    {\n        wordInfo = sEasyChatGroups[groupId].wordData.words;\n        for (i = 0, totalWords = 0; i < numWords; i++)\n        {\n            u16 alphabeticalOrder = wordInfo[i].alphabeticalOrder;\n            if (UnlockedECMonOrMove(alphabeticalOrder, groupId))\n                sEasyChatSelectionData->allWords[totalWords++] = EC_WORD(groupId, alphabeticalOrder);\n        }\n\n        return totalWords;\n    }\n}\n\nstatic u16 GetUnlockedWordsInAlphabeticalGroup(u16 alphabeticalGroup)\n{\n    u32 i;\n    u16 totalWords;\n\n    for (i = 0, totalWords = 0; i < sEasyChatSelectionData->alphabeticalGroups[alphabeticalGroup]; i++)\n        sEasyChatSelectionData->allWords[totalWords++] = sEasyChatSelectionData->alphabeticalWordsByGroup[alphabeticalGroup][i];\n\n    return totalWords;\n}\n\nstatic bool8 IsGroupSelectable(u8 groupIdx)\n{\n    int i;\n    for (i = 0; i < sEasyChatSelectionData->numGroups; i++)\n    {\n        if (sEasyChatSelectionData->groups[i] == groupIdx)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 UnlockedECMonOrMove(u16 wordIndex, u8 groupId)\n{\n    switch (groupId)\n    {\n    case EC_GROUP_POKEMON:\n        return GetSetPokedexFlag(SpeciesToNationalPokedexNum(wordIndex), FLAG_GET_SEEN);\n    case EC_GROUP_POKEMON_2:\n        if (EC_IsDeoxys(wordIndex))\n            return GetSetPokedexFlag(SpeciesToNationalPokedexNum(wordIndex), FLAG_GET_SEEN);\n        return TRUE;\n    case EC_GROUP_MOVE_1:\n    case EC_GROUP_MOVE_2:\n        return TRUE;\n    default:\n        return sEasyChatGroups[groupId].wordData.words[wordIndex].enabled;\n    }\n}\n\nstatic bool32 EC_IsDeoxys(u16 species)\n{\n    u32 i;\n    for (i = 0; i < NELEMS(sDeoxysValue); i++)\n    {\n        if (sDeoxysValue[i] == species)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 IsWordUnlocked(u16 easyChatWord)\n{\n    u8 groupId = EC_GROUP(easyChatWord);\n    u32 index = EC_INDEX(easyChatWord);\n    if (!IsGroupSelectable(groupId))\n        return FALSE;\n    else\n        return UnlockedECMonOrMove(index, groupId);\n}\n"
  },
  {
    "path": "src/easy_chat_2.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"easy_chat.h\"\n#include \"event_data.h\"\n#include \"menu.h\"\n#include \"mystery_gift.h\"\n#include \"overworld.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"constants/songs.h\"\n\n#define EZCHAT_TASK_STATE        0\n#define EZCHAT_TASK_TYPE         1\n#define EZCHAT_TASK_WORDS        2\n#define EZCHAT_TASK_MAINCALLBACK 4\n#define EZCHAT_TASK_UNK06        6\n#define EZCHAT_TASK_SIZE         7\n\nstruct EasyChatScreenTemplate\n{\n    u8 type;\n    u8 numColumns;\n    u8 numRows;\n    u8 frameId;\n    const u8 *titleText;\n    const u8 *instructionsText1;\n    const u8 *instructionsText2;\n    const u8 *confirmText1;\n    const u8 *confirmText2;\n};\n\nstruct EasyChatScreen\n{\n    /*0x00*/ u8 type;\n    /*0x01*/ u8 templateId;\n    /*0x02*/ u8 numColumns;\n    /*0x03*/ u8 numRows;\n    /*0x04*/ u8 state;\n    /*0x05*/ s8 mainCursorColumn;\n    /*0x06*/ s8 mainCursorRow;\n    /*0x07*/ u8 numWords;\n    /*0x08*/ u8 stateBackup;\n    /*0x09*/ bool8 isAlphaMode;\n    /*0x0A*/ s8 selectGroupCursorX;\n    /*0x0B*/ s8 selectGroupCursorY;\n    /*0x0C*/ u8 selectGroupRowsAbove;\n    /*0x0D*/ u8 selectGroupNumRows;\n    /*0x0E*/ u8 selectWordRowsAbove;\n    /*0x0F*/ u8 selectWordNumRows;\n    /*0x10*/ s8 selectWordCursorX;\n    /*0x11*/ s8 selectWordCursorY;\n    /*0x14*/ u16 *words;\n    /*0x18*/ u16 ecWordBuffer[9];\n};\n\nstatic EWRAM_DATA struct EasyChatScreen * sEasyChatScreen = NULL;\n\nstatic void CB2_EasyChatScreen(void);\nstatic void Task_InitEasyChat(u8 taskId);\nstatic void Task_RunEasyChat(u8 taskId);\nstatic bool8 Task_InitEasyChatInternal(u8 taskId);\nstatic void DismantleEasyChat(MainCallback cb);\nstatic void CompareProfileResponseWithPassphrase(void);\nstatic void CompareQuestionnaireResponseWithPassphrase(void);\nstatic bool8 EasyChat_AllocateResources(u8 type, u16 *words);\nstatic void EasyChat_FreeResources(void);\nstatic u16 EasyChatScreen_HandleJoypad(void);\nstatic u16 HandleJoypad_SelectField(void);\nstatic u16 HandleJoypad_SelectFooter(void);\nstatic u16 HandleJoypad_SelectGroup(void);\nstatic u16 HandleJoypad_SelectWord(void);\nstatic u16 Cancel_HandleYesNoMenu(void);\nstatic u16 Confirm_HandleYesNoMenu(void);\nstatic u16 DelAll_HandleYesNoMenu(void);\nstatic u16 Cancel_CreateYesNoMenu(void);\nstatic u16 DelAll_CreateYesNoMenu(void);\nstatic u16 Confirm_CreateYesNoMenu(void);\nstatic u8 GetStateBackup(void);\nstatic int OpenSelectedGroup(void);\nstatic int BackOutFromGroupToFieldSelect(void);\nstatic int ToggleGroupAlphaMode(void);\nstatic int DeleteSelectedWord(void);\nstatic int PlaceSelectedWord(void);\nstatic void CommitECWords(void);\nstatic void DeleteAllECFields(void);\nstatic void SetEasyChatWordToField(u16 word);\nstatic bool8 HasECMessageChanged(void);\nstatic u16 SelectGroupCursorAction(u32 action);\nstatic int UpdateSelectGroupCursorPos_OutsideBlueBox_GroupMode(u32 action);\nstatic int UpdateSelectGroupCursorPos_OutsideBlueBox_AlphaMode(u32 action);\nstatic int UpdateSelectGroupCursorPos_InsideBlueBox(u32 action);\nstatic void GroupCursorMoveToBlueBox(void);\nstatic void GroupCursorWrapAroundLeft(void);\nstatic u16 SelectWordCursorAction(u32 action);\nstatic u16 GetSelectedFieldIndex(void);\nstatic u16 GetSelectedGroupIndex(void);\nstatic int GetSelectedLetter(void);\nstatic u16 GetSelectWordCursorPos(void);\nstatic u8 GetMaxGroupCursorXinAlphaMode(u8 unkB);\nstatic void MoveGroupCursorXToMaxCol(void);\nstatic void MoveWordCursorXToMaxCol(void);\nstatic bool8 GroupSelectCursorXPosTooFarRight(void);\nstatic bool8 WordSelectCursorXPosTooFarRight(void);\nstatic bool8 IsPhraseDifferentThanPlayerInput(const u16 *wordsToCompare, u8 numWords);\nstatic u8 GetEasyChatScreenTemplateId(u8 type);\nstatic bool32 IsEcWordBufferUninitialized(void);\n\nvoid DoEasyChatScreen(u8 type, u16 *words, MainCallback callback)\n{\n    u8 taskId;\n    ResetTasks();\n    taskId = CreateTask(Task_InitEasyChat, 0);\n    gTasks[taskId].data[EZCHAT_TASK_TYPE] = type;\n    SetWordTaskArg(taskId, EZCHAT_TASK_WORDS, (uintptr_t)words);\n    SetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK, (uintptr_t)callback);\n    SetMainCallback2(CB2_EasyChatScreen);\n}\n\nstatic void CB2_EasyChatScreen(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCallback_EasyChatScreen(void)\n{\n    TransferPlttBuffer();\n    LoadOam();\n    ProcessSpriteCopyRequests();\n}\n\nstatic void SetEasyChatTaskFunc(u8 taskId, TaskFunc func)\n{\n    gTasks[taskId].func = func;\n    gTasks[taskId].data[EZCHAT_TASK_STATE] = 0;\n}\n\nstatic void Task_InitEasyChat(u8 taskId)\n{\n    if (!IsUpdateLinkStateCBActive())\n    {\n        while (Task_InitEasyChatInternal(taskId))\n            ;\n    }\n    else\n    {\n        if (Task_InitEasyChatInternal(taskId) == TRUE)\n            return;\n    }\n    SetEasyChatTaskFunc(taskId, Task_RunEasyChat);\n}\n\nstatic void Task_RunEasyChat(u8 taskId)\n{\n    u16 action;\n    s16 *data;\n\n    data = gTasks[taskId].data;\n    switch (data[EZCHAT_TASK_STATE])\n    {\n    case 0:\n        SetVBlankCallback(VBlankCallback_EasyChatScreen);\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n        data[EZCHAT_TASK_STATE]++;\n        break;\n    case 1:\n        action = EasyChatScreen_HandleJoypad();\n        if (action == 23)\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);\n            data[EZCHAT_TASK_STATE] = 3;\n        }\n        else if (action != 0)\n        {\n            PlaySE(SE_SELECT);\n            EasyChatInterfaceCommand_Setup(action);\n            data[EZCHAT_TASK_STATE]++;\n        }\n        break;\n    case 2:\n        if (!EasyChatInterfaceCommand_Run())\n            data[EZCHAT_TASK_STATE] = 1;\n        break;\n    case 3:\n        if (!gPaletteFade.active)\n        {\n            if (data[EZCHAT_TASK_TYPE] == EASY_CHAT_TYPE_QUESTIONNAIRE)\n                CompareQuestionnaireResponseWithPassphrase();\n            if (data[EZCHAT_TASK_TYPE] == EASY_CHAT_TYPE_PROFILE)\n            {\n                FlagSet(FLAG_SYS_SET_TRAINER_CARD_PROFILE);\n                CompareProfileResponseWithPassphrase();\n            }\n            DismantleEasyChat((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));\n        }\n        break;\n    }\n}\n\nstatic bool8 Task_InitEasyChatInternal(u8 taskId)\n{\n    s16 *data;\n\n    data = gTasks[taskId].data;\n    switch (data[EZCHAT_TASK_STATE])\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        ResetPaletteFade();\n        break;\n    case 1:\n        if (!InitEasyChatSelection())\n        {\n            DismantleEasyChat((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));\n        }\n        break;\n    case 2:\n        if (!EasyChat_AllocateResources(data[EZCHAT_TASK_TYPE], (u16 *)GetWordTaskArg(taskId, EZCHAT_TASK_WORDS)))\n        {\n            DismantleEasyChat((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));\n        }\n        break;\n    case 3:\n        if (!InitEasyChatGraphicsWork())\n        {\n            DismantleEasyChat((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));\n        }\n        break;\n    case 4:\n        if (LoadEasyChatGraphics())\n        {\n            return TRUE;\n        }\n        break;\n    default:\n        return FALSE;\n    }\n    data[EZCHAT_TASK_STATE]++;\n    return TRUE;\n}\n\nstatic void DismantleEasyChat(MainCallback callback)\n{\n    DestroyEasyChatSelectionData();\n    EasyChat_FreeResources();\n    DestroyEasyChatGraphicsResources();\n    FreeAllWindowBuffers();\n    SetMainCallback2(callback);\n}\n\nvoid ShowEasyChatScreen(void)\n{\n    u16 *words;\n    switch (gSpecialVar_0x8004)\n    {\n    case EASY_CHAT_TYPE_PROFILE:\n        words = gSaveBlock1Ptr->easyChatProfile;\n        break;\n    case EASY_CHAT_TYPE_BATTLE_START:\n        words = gSaveBlock1Ptr->easyChatBattleStart;\n        break;\n    case EASY_CHAT_TYPE_BATTLE_WON:\n        words = gSaveBlock1Ptr->easyChatBattleWon;\n        break;\n    case EASY_CHAT_TYPE_BATTLE_LOST:\n        words = gSaveBlock1Ptr->easyChatBattleLost;\n        break;\n    case EASY_CHAT_TYPE_QUESTIONNAIRE:\n        words = GetQuestionnaireWordsPtr();\n        break;\n    case EASY_CHAT_TYPE_MAIL:\n        words = gSaveBlock1Ptr->mail[gSpecialVar_0x8005].words;\n        break;\n    default:\n        return;\n    }\n    DoEasyChatScreen(gSpecialVar_0x8004, words, CB2_ReturnToFieldContinueScript);\n}\n\nstatic const u16 sECPhrase_MysteryEventIsExciting[] = {\n    EC_WORD_MYSTERY,\n    EC_WORD_EVENT,\n    EC_WORD_IS,\n    EC_WORD_EXCITING\n};\n\nstatic void CompareProfileResponseWithPassphrase(void)\n{\n    gSpecialVar_0x8004 = IsPhraseDifferentThanPlayerInput(sECPhrase_MysteryEventIsExciting, NELEMS(sECPhrase_MysteryEventIsExciting));\n}\n\nstatic const u16 sECPhrase_LinkTogetherWithAll[] = {\n    EC_WORD_LINK,\n    EC_WORD_TOGETHER,\n    EC_WORD_WITH,\n    EC_WORD_ALL\n};\n\nstatic void CompareQuestionnaireResponseWithPassphrase(void)\n{\n    gSpecialVar_0x8004 = IsPhraseDifferentThanPlayerInput(sECPhrase_LinkTogetherWithAll, NELEMS(sECPhrase_LinkTogetherWithAll));\n}\n\nstatic const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = {\n    {\n        .type = EASY_CHAT_TYPE_PROFILE,\n        .numColumns = 2,\n        .numRows = 2,\n        .frameId = 0,\n        .titleText =  gText_Profile,\n        .instructionsText1 = gText_CombineFourWordsOrPhrases,\n        .instructionsText2 = gText_AndMakeYourProfile,\n        .confirmText1 = gText_YourProfile,\n        .confirmText2 = gText_IsAsShownOkay\n    }, {\n        .type = EASY_CHAT_TYPE_BATTLE_START,\n        .numColumns = 2,\n        .numRows = 3,\n        .frameId = 1,\n        .titleText =  gText_AtTheBattlesStart,\n        .instructionsText1 = gText_MakeMessageSixPhrases,\n        .instructionsText2 = gText_MaxTwoTwelveLetterPhrases,\n        .confirmText1 = gText_YourFeelingAtTheBattlesStart,\n        .confirmText2 = gText_IsAsShownOkay\n    }, {\n        .type = EASY_CHAT_TYPE_BATTLE_WON,\n        .numColumns = 2,\n        .numRows = 3,\n        .frameId = 1,\n        .titleText =  gText_UponWinningABattle,\n        .instructionsText1 = gText_MakeMessageSixPhrases,\n        .instructionsText2 = gText_MaxTwoTwelveLetterPhrases,\n        .confirmText1 = gText_WhatYouSayIfYouWin,\n        .confirmText2 = gText_IsAsShownOkay\n    }, {\n        .type = EASY_CHAT_TYPE_BATTLE_LOST,\n        .numColumns = 2,\n        .numRows = 3,\n        .frameId = 1,\n        .titleText =  gText_UponLosingABattle,\n        .instructionsText1 = gText_MakeMessageSixPhrases,\n        .instructionsText2 = gText_MaxTwoTwelveLetterPhrases,\n        .confirmText1 = gText_WhatYouSayIfYouLose,\n        .confirmText2 = gText_IsAsShownOkay\n    }, {\n        .type = EASY_CHAT_TYPE_MAIL,\n        .numColumns = 2,\n        .numRows = 5,\n        .frameId = 2,\n        .titleText =  NULL,\n        .instructionsText1 = gText_CombineNineWordsOrPhrases,\n        .instructionsText2 = gText_AndMakeAMessage,\n        .confirmText1 = gText_TheMailMessage,\n        .confirmText2 = gText_IsAsShownOkay\n    }, {\n        .type = EASY_CHAT_TYPE_MAIL_NO_CONFIRM,\n        .numColumns = 2,\n        .numRows = 2,\n        .frameId = 0,\n        .instructionsText1 = gText_CombineNineWordsOrPhrases,\n        .instructionsText2 = gText_AndMakeAMessage,\n    }, {\n        .type = EASY_CHAT_TYPE_BARD_SONG,\n        .numColumns = 2,\n        .numRows = 3,\n        .frameId = 1,\n        .titleText =  gText_TheBardsSong,\n        .instructionsText1 = gText_ChangeJustOneWordOrPhrase,\n        .instructionsText2 = gText_AndImproveTheBardsSong,\n        .confirmText1 = gText_TheNewSong,\n        .confirmText2 = gText_IsAsShownOkay\n    }, {\n        .type = EASY_CHAT_TYPE_INTERVIEW,\n        .numColumns = 2,\n        .numRows = 3,\n        .frameId = 1,\n        .titleText =  gText_Interview,\n        .instructionsText1 = gText_FindWordsThatDescribeYour,\n        .instructionsText2 = gText_FeelingsRightNow,\n        .confirmText1 = gText_TheAnswer,\n        .confirmText2 = gText_IsAsShownOkay\n    }, {\n        .type = EASY_CHAT_TYPE_TRENDY_PHRASE,\n        .numColumns = 2,\n        .numRows = 1,\n        .frameId = 3,\n        .titleText =  gText_WhatsHipAndHappening,\n        .instructionsText1 = gText_CombineTwoWordsOrPhrases,\n        .instructionsText2 = gText_AndMakeATrendySaying,\n        .confirmText1 = gText_TheTrendySaying,\n        .confirmText2 = gText_IsAsShownOkay\n    }, {\n        .type = EASY_CHAT_TYPE_QUESTIONNAIRE,\n        .numColumns = 2,\n        .numRows = 2,\n        .frameId = 0,\n        .titleText =  gText_Questionnaire,\n        .instructionsText1 = gText_CombineFourWordsOrPhrases,\n        .instructionsText2 = gText_AndFillOutTheQuestionnaire,\n        .confirmText1 = gText_TheAnswer,\n        .confirmText2 = gText_IsAsShownOkay\n    }\n};\n\nstatic bool8 EasyChat_AllocateResources(u8 type, u16 *words)\n{\n    u8 templateId;\n    int i;\n\n    sEasyChatScreen = malloc(sizeof(*sEasyChatScreen));\n    if (sEasyChatScreen == NULL)\n        return FALSE;\n\n    sEasyChatScreen->type = type;\n    sEasyChatScreen->words = words;\n    sEasyChatScreen->state = 0;\n    sEasyChatScreen->mainCursorColumn = 0;\n    sEasyChatScreen->mainCursorRow = 0;\n    sEasyChatScreen->isAlphaMode = FALSE;\n    templateId = GetEasyChatScreenTemplateId(type);\n\n    sEasyChatScreen->numColumns = sEasyChatScreenTemplates[templateId].numColumns;\n    sEasyChatScreen->numRows = sEasyChatScreenTemplates[templateId].numRows;\n    sEasyChatScreen->numWords = sEasyChatScreen->numColumns * sEasyChatScreen->numRows;\n    sEasyChatScreen->templateId = templateId;\n    if (sEasyChatScreen->numWords > 9)\n        sEasyChatScreen->numWords = 9;\n\n    CpuCopy16(words, sEasyChatScreen->ecWordBuffer, sEasyChatScreen->numWords * sizeof(u16));\n    sEasyChatScreen->selectGroupNumRows = (GetNumDisplayableGroups() - 1) / 2 + 1;\n    return TRUE;\n}\n\nstatic void EasyChat_FreeResources(void)\n{\n    if (sEasyChatScreen != NULL)\n        Free(sEasyChatScreen);\n}\n\nstatic u16 EasyChatScreen_HandleJoypad(void)\n{\n    switch (sEasyChatScreen->state)\n    {\n    case 0:\n        return HandleJoypad_SelectField();\n    case 1:\n        return HandleJoypad_SelectFooter();\n    case 2:\n        return HandleJoypad_SelectGroup();\n    case 3:\n        return HandleJoypad_SelectWord();\n    case 4:\n        return Cancel_HandleYesNoMenu();\n    case 5:\n        return DelAll_HandleYesNoMenu();\n    case 6:\n        return Confirm_HandleYesNoMenu();\n    }\n    return 0;\n}\n\nstatic u16 HandleJoypad_SelectField(void)\n{\n    do\n    {\n        if (JOY_NEW(A_BUTTON))\n        {\n            sEasyChatScreen->state = 2;\n            sEasyChatScreen->selectGroupCursorX = 0;\n            sEasyChatScreen->selectGroupCursorY = 0;\n            sEasyChatScreen->selectGroupRowsAbove = 0;\n            return 9;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            return Cancel_CreateYesNoMenu();\n        }\n        else if (JOY_NEW(START_BUTTON))\n        {\n            return Confirm_CreateYesNoMenu();\n        }\n        else if (JOY_NEW(DPAD_UP))\n        {\n            sEasyChatScreen->mainCursorRow--;\n            break;\n        }\n        else if (JOY_NEW(DPAD_LEFT))\n        {\n            sEasyChatScreen->mainCursorColumn--;\n            break;\n        }\n        else if (JOY_NEW(DPAD_DOWN))\n        {\n            sEasyChatScreen->mainCursorRow++;\n            break;\n        }\n        else if (JOY_NEW(DPAD_RIGHT))\n        {\n            sEasyChatScreen->mainCursorColumn++;\n            break;\n        }\n\n        return 0;\n    } while (0);\n\n    if (sEasyChatScreen->mainCursorRow < 0)\n        sEasyChatScreen->mainCursorRow = sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows;\n\n    if (sEasyChatScreen->mainCursorRow > sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows)\n        sEasyChatScreen->mainCursorRow = 0;\n\n    if (sEasyChatScreen->mainCursorRow == sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows)\n    {\n        if (sEasyChatScreen->mainCursorColumn > 2)\n            sEasyChatScreen->mainCursorColumn = 2;\n\n        sEasyChatScreen->state = 1;\n        return 3;\n    }\n\n    if (sEasyChatScreen->mainCursorColumn < 0)\n        sEasyChatScreen->mainCursorColumn = sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns - 1;\n\n    if (sEasyChatScreen->mainCursorColumn >= sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns)\n        sEasyChatScreen->mainCursorColumn = 0;\n\n    if (GetEasyChatScreenFrameId() == 2 && sEasyChatScreen->mainCursorColumn == 1 && sEasyChatScreen->mainCursorRow == 4)\n        sEasyChatScreen->mainCursorColumn = 0;\n\n    return 2;\n}\n\nstatic u16 HandleJoypad_SelectFooter(void)\n{\n    do\n    {\n        if (JOY_NEW(A_BUTTON))\n        {\n            switch (sEasyChatScreen->mainCursorColumn)\n            {\n            case 0:\n                return DelAll_CreateYesNoMenu();\n            case 1:\n                return Cancel_CreateYesNoMenu();\n            case 2:\n                return Confirm_CreateYesNoMenu();\n            }\n        }\n\n        if (JOY_NEW(B_BUTTON))\n        {\n            return Cancel_CreateYesNoMenu();\n        }\n        else if (JOY_NEW(START_BUTTON))\n        {\n            return Confirm_CreateYesNoMenu();\n        }\n        else if (JOY_NEW(DPAD_UP))\n        {\n            sEasyChatScreen->mainCursorRow--;\n            break;\n        }\n        else if (JOY_NEW(DPAD_LEFT))\n        {\n            sEasyChatScreen->mainCursorColumn--;\n            break;\n        }\n        else if (JOY_NEW(DPAD_DOWN))\n        {\n            sEasyChatScreen->mainCursorRow = 0;\n            break;\n        }\n        else if (JOY_NEW(DPAD_RIGHT))\n        {\n            sEasyChatScreen->mainCursorColumn++;\n            break;\n        }\n\n        return 0;\n    } while (0);\n\n    if (sEasyChatScreen->mainCursorRow == sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows)\n    {\n        if (sEasyChatScreen->mainCursorColumn < 0)\n            sEasyChatScreen->mainCursorColumn = 2;\n\n        if (sEasyChatScreen->mainCursorColumn >= 3)\n            sEasyChatScreen->mainCursorColumn = 0;\n\n        return 3;\n    }\n\n    if (sEasyChatScreen->mainCursorColumn >= sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns)\n        sEasyChatScreen->mainCursorColumn = sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns - 1;\n\n    if (GetEasyChatScreenFrameId() == 2 && sEasyChatScreen->mainCursorColumn == 1 && sEasyChatScreen->mainCursorRow == 4)\n        sEasyChatScreen->mainCursorColumn = 0;\n\n    sEasyChatScreen->state = 0;\n    return 2;\n}\n\nstatic u16 HandleJoypad_SelectGroup(void)\n{\n    if (JOY_NEW(B_BUTTON))\n        return BackOutFromGroupToFieldSelect();\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        if (sEasyChatScreen->selectGroupCursorX != -1)\n            return OpenSelectedGroup();\n\n        switch (sEasyChatScreen->selectGroupCursorY)\n        {\n        case 0:\n            return ToggleGroupAlphaMode();\n        case 1:\n            return DeleteSelectedWord();\n        case 2:\n            return BackOutFromGroupToFieldSelect();\n        }\n    }\n\n    if (JOY_NEW(SELECT_BUTTON))\n        return ToggleGroupAlphaMode();\n\n    if (JOY_REPT(DPAD_UP))\n        return SelectGroupCursorAction(2);\n\n    if (JOY_REPT(DPAD_DOWN))\n        return SelectGroupCursorAction(3);\n\n    if (JOY_REPT(DPAD_LEFT))\n        return SelectGroupCursorAction(1);\n\n    if (JOY_REPT(DPAD_RIGHT))\n        return SelectGroupCursorAction(0);\n\n    return 0;\n}\n\nstatic u16 HandleJoypad_SelectWord(void)\n{\n    if (JOY_NEW(B_BUTTON))\n    {\n        sEasyChatScreen->state = 2;\n        return 13;\n    }\n\n    if (JOY_NEW(A_BUTTON))\n        return PlaceSelectedWord();\n\n    if (JOY_NEW(START_BUTTON))\n        return SelectWordCursorAction(4);\n\n    if (JOY_NEW(SELECT_BUTTON))\n        return SelectWordCursorAction(5);\n\n    if (JOY_REPT(DPAD_UP))\n        return SelectWordCursorAction(2);\n\n    if (JOY_REPT(DPAD_DOWN))\n        return SelectWordCursorAction(3);\n\n    if (JOY_REPT(DPAD_LEFT))\n        return SelectWordCursorAction(1);\n\n    if (JOY_REPT(DPAD_RIGHT))\n        return SelectWordCursorAction(0);\n\n    return 0;\n}\n\nstatic u16 Cancel_HandleYesNoMenu(void)\n{\n    u8 var0;\n\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case MENU_B_PRESSED: // B Button\n    case 1: // No\n        sEasyChatScreen->state = GetStateBackup();\n        return 7;\n    case 0: // Yes\n        gSpecialVar_Result = 0;\n\n        return 23;\n    default:\n        return 0;\n    }\n}\n\nstatic u16 Confirm_HandleYesNoMenu(void)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case MENU_B_PRESSED: // B Button\n    case 1: // No\n        sEasyChatScreen->state = GetStateBackup();\n        return 7;\n    case 0: // Yes\n        gSpecialVar_Result = HasECMessageChanged();\n        CommitECWords();\n        return 23;\n    default:\n        return 0;\n    }\n}\n\nstatic u16 DelAll_HandleYesNoMenu(void)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case MENU_B_PRESSED: // B Button\n    case 1: // No\n        sEasyChatScreen->state = 1;\n        return 7;\n    case 0: // Yes\n        DeleteAllECFields();\n        sEasyChatScreen->state = 1;\n        return 8;\n    default:\n        return 0;\n    }\n}\n\nstatic u16 Cancel_CreateYesNoMenu(void)\n{\n    sEasyChatScreen->stateBackup = sEasyChatScreen->state;\n    sEasyChatScreen->state = 4;\n    return 5;\n}\n\nstatic u16 DelAll_CreateYesNoMenu(void)\n{\n    sEasyChatScreen->stateBackup = sEasyChatScreen->state;\n    sEasyChatScreen->state = 5;\n    return 4;\n}\n\nstatic u16 Confirm_CreateYesNoMenu(void)\n{\n    sEasyChatScreen->stateBackup = sEasyChatScreen->state;\n    if (IsEcWordBufferUninitialized())\n    {\n        sEasyChatScreen->state = 4;\n        return 5;\n    }\n    else\n    {\n        sEasyChatScreen->state = 6;\n        return 6;\n    }\n}\n\nstatic u8 GetStateBackup(void)\n{\n    return sEasyChatScreen->stateBackup;\n}\n\nstatic int OpenSelectedGroup(void)\n{\n    u16 numDisplayedWords;\n\n    if (!sEasyChatScreen->isAlphaMode)\n    {\n        u8 groupId = GetSelectedGroupByIndex(GetSelectedGroupIndex());\n        GetUnlockedECWords(FALSE, groupId);\n    }\n    else\n    {\n        GetUnlockedECWords(TRUE, GetSelectedLetter());\n    }\n\n    numDisplayedWords = GetNumDisplayedWords();\n    if (numDisplayedWords == 0)\n        return 0;\n\n    sEasyChatScreen->selectWordNumRows = (numDisplayedWords - 1) / 2;\n    sEasyChatScreen->selectWordRowsAbove = 0;\n    sEasyChatScreen->selectWordCursorX = 0;\n    sEasyChatScreen->selectWordCursorY = 0;\n    sEasyChatScreen->state = 3;\n    return 11;\n}\n\nstatic int BackOutFromGroupToFieldSelect(void)\n{\n    sEasyChatScreen->state = 0;\n    return 10;\n}\n\nstatic int ToggleGroupAlphaMode(void)\n{\n    sEasyChatScreen->selectGroupCursorX = 0;\n    sEasyChatScreen->selectGroupCursorY = 0;\n    sEasyChatScreen->selectGroupRowsAbove = 0;\n    if (!sEasyChatScreen->isAlphaMode)\n        sEasyChatScreen->isAlphaMode = TRUE;\n    else\n        sEasyChatScreen->isAlphaMode = FALSE;\n\n    return 22;\n}\n\nstatic int DeleteSelectedWord(void)\n{\n    SetEasyChatWordToField(0xFFFF);\n    return 1;\n}\n\nstatic int PlaceSelectedWord(void)\n{\n    u16 easyChatWord = GetDisplayedWordByIndex(GetSelectWordCursorPos());\n    SetEasyChatWordToField(easyChatWord);\n    sEasyChatScreen->state = 0;\n    return 12;\n}\n\nstatic void CommitECWords(void)\n{\n    u32 i;\n    for (i = 0; i < sEasyChatScreen->numWords; i++)\n        sEasyChatScreen->words[i] = sEasyChatScreen->ecWordBuffer[i];\n}\n\nstatic void DeleteAllECFields(void)\n{\n    u32 i;\n    for (i = 0; i < sEasyChatScreen->numWords; i++)\n        sEasyChatScreen->ecWordBuffer[i] = 0xFFFF;\n}\n\nstatic void SetEasyChatWordToField(u16 easyChatWord)\n{\n    u16 index = GetSelectedFieldIndex();\n    sEasyChatScreen->ecWordBuffer[index] = easyChatWord;\n}\n\nstatic bool8 HasECMessageChanged(void)\n{\n    u32 i;\n    for (i = 0; i < sEasyChatScreen->numWords; i++)\n    {\n        if (sEasyChatScreen->ecWordBuffer[i] != sEasyChatScreen->words[i])\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic u16 SelectGroupCursorAction(u32 action)\n{\n    if (sEasyChatScreen->selectGroupCursorX != -1)\n    {\n        if (!sEasyChatScreen->isAlphaMode)\n            return UpdateSelectGroupCursorPos_OutsideBlueBox_GroupMode(action);\n        else\n            return UpdateSelectGroupCursorPos_OutsideBlueBox_AlphaMode(action);\n    }\n    else\n    {\n        return UpdateSelectGroupCursorPos_InsideBlueBox(action);\n    }\n}\n\nstatic int UpdateSelectGroupCursorPos_OutsideBlueBox_GroupMode(u32 arg0)\n{\n    switch (arg0)\n    {\n    case 2:\n        if (sEasyChatScreen->selectGroupCursorY != -sEasyChatScreen->selectGroupRowsAbove)\n        {\n            if (sEasyChatScreen->selectGroupCursorY)\n            {\n                sEasyChatScreen->selectGroupCursorY--;\n                return 14;\n            }\n            else\n            {\n                sEasyChatScreen->selectGroupRowsAbove--;\n                return 16;\n            }\n        }\n        break;\n    case 3:\n        if (sEasyChatScreen->selectGroupCursorY + sEasyChatScreen->selectGroupRowsAbove < sEasyChatScreen->selectGroupNumRows - 1)\n        {\n            int var0;\n            if (sEasyChatScreen->selectGroupCursorY < 3)\n            {\n                sEasyChatScreen->selectGroupCursorY++;\n                var0 = 14;\n            }\n            else\n            {\n                sEasyChatScreen->selectGroupRowsAbove++;\n                var0 = 15;\n            }\n\n            MoveGroupCursorXToMaxCol();\n            return var0;\n        }\n        break;\n    case 1:\n        if (sEasyChatScreen->selectGroupCursorX)\n            sEasyChatScreen->selectGroupCursorX--;\n        else\n            GroupCursorMoveToBlueBox();\n\n        return 14;\n    case 0:\n        if (sEasyChatScreen->selectGroupCursorX < 1)\n        {\n            sEasyChatScreen->selectGroupCursorX++;\n            if (GroupSelectCursorXPosTooFarRight())\n                GroupCursorMoveToBlueBox();\n        }\n        else\n        {\n            GroupCursorMoveToBlueBox();\n        }\n        return 14;\n    }\n\n    return 0;\n}\n\nstatic int UpdateSelectGroupCursorPos_OutsideBlueBox_AlphaMode(u32 arg0)\n{\n    switch (arg0)\n    {\n    case 2:\n        if (sEasyChatScreen->selectGroupCursorY > 0)\n            sEasyChatScreen->selectGroupCursorY--;\n        else\n            sEasyChatScreen->selectGroupCursorY = 3;\n\n        MoveGroupCursorXToMaxCol();\n        return 14;\n    case 3:\n        if (sEasyChatScreen->selectGroupCursorY < 3)\n            sEasyChatScreen->selectGroupCursorY++;\n        else\n            sEasyChatScreen->selectGroupCursorY = 0;\n\n        MoveGroupCursorXToMaxCol();\n        return 14;\n    case 0:\n        sEasyChatScreen->selectGroupCursorX++;\n        if (GroupSelectCursorXPosTooFarRight())\n            GroupCursorMoveToBlueBox();\n\n        return 14;\n    case 1:\n        sEasyChatScreen->selectGroupCursorX--;\n        if (sEasyChatScreen->selectGroupCursorX < 0)\n            GroupCursorMoveToBlueBox();\n\n        return 14;\n    }\n\n    return 0;\n}\n\nstatic int UpdateSelectGroupCursorPos_InsideBlueBox(u32 arg0)\n{\n    switch (arg0)\n    {\n    case 2:\n        if (sEasyChatScreen->selectGroupCursorY)\n            sEasyChatScreen->selectGroupCursorY--;\n        else\n            sEasyChatScreen->selectGroupCursorY = 2;\n\n        return 14;\n    case 3:\n        if (sEasyChatScreen->selectGroupCursorY < 2)\n            sEasyChatScreen->selectGroupCursorY++;\n        else\n            sEasyChatScreen->selectGroupCursorY = 0;\n\n        return 14;\n    case 1:\n        sEasyChatScreen->selectGroupCursorY++;\n        GroupCursorWrapAroundLeft();\n        return 14;\n    case 0:\n        sEasyChatScreen->selectGroupCursorX = 0;\n        sEasyChatScreen->selectGroupCursorY++;\n        return 14;\n    }\n\n    return 0;\n}\n\nstatic void GroupCursorMoveToBlueBox(void)\n{\n    sEasyChatScreen->selectGroupCursorX = 0xFF;\n    if (sEasyChatScreen->selectGroupCursorY)\n        sEasyChatScreen->selectGroupCursorY--;\n}\n\nstatic void GroupCursorWrapAroundLeft(void)\n{\n    if (!sEasyChatScreen->isAlphaMode)\n    {\n        sEasyChatScreen->selectGroupCursorX = 1;\n        MoveGroupCursorXToMaxCol();\n    }\n    else\n    {\n        sEasyChatScreen->selectGroupCursorX = GetMaxGroupCursorXinAlphaMode(sEasyChatScreen->selectGroupCursorY);\n    }\n}\n\nstatic u16 SelectWordCursorAction(u32 arg0)\n{\n    u16 result;\n    switch (arg0)\n    {\n    case 2: // up\n        if (sEasyChatScreen->selectWordCursorY + sEasyChatScreen->selectWordRowsAbove > 0)\n        {\n            if (sEasyChatScreen->selectWordCursorY > 0)\n            {\n                sEasyChatScreen->selectWordCursorY--;\n                result = 17;\n            }\n            else\n            {\n                sEasyChatScreen->selectWordRowsAbove--;\n                result = 18;\n            }\n\n            MoveWordCursorXToMaxCol();\n            return result;\n        }\n        break;\n    case 3: // down\n        if (sEasyChatScreen->selectWordCursorY + sEasyChatScreen->selectWordRowsAbove < sEasyChatScreen->selectWordNumRows)\n        {\n            if (sEasyChatScreen->selectWordCursorY < 3)\n            {\n                sEasyChatScreen->selectWordCursorY++;\n                result = 17;\n            }\n            else\n            {\n                sEasyChatScreen->selectWordRowsAbove++;\n                result = 19;\n            }\n\n            MoveWordCursorXToMaxCol();\n            return result;\n        }\n        break;\n    case 1: // left\n        if (sEasyChatScreen->selectWordCursorX > 0)\n            sEasyChatScreen->selectWordCursorX--;\n        else\n            sEasyChatScreen->selectWordCursorX = 1;\n\n        MoveWordCursorXToMaxCol();\n        return 17;\n    case 0: // right\n        if (sEasyChatScreen->selectWordCursorX < 1)\n        {\n            sEasyChatScreen->selectWordCursorX++;\n            if (WordSelectCursorXPosTooFarRight())\n                sEasyChatScreen->selectWordCursorX = 0;\n        }\n        else\n        {\n            sEasyChatScreen->selectWordCursorX = 0;\n        }\n        return 17;\n    case 4: // pg up\n        if (sEasyChatScreen->selectWordRowsAbove)\n        {\n            if (sEasyChatScreen->selectWordRowsAbove > 3)\n                sEasyChatScreen->selectWordRowsAbove -= 4;\n            else\n                sEasyChatScreen->selectWordRowsAbove = 0;\n\n            return 20;\n        }\n        break;\n    case 5: // pg dn\n        if (sEasyChatScreen->selectWordRowsAbove <= sEasyChatScreen->selectWordNumRows - 4)\n        {\n            sEasyChatScreen->selectWordRowsAbove += 4;\n            if (sEasyChatScreen->selectWordRowsAbove > sEasyChatScreen->selectWordNumRows - 3)\n                sEasyChatScreen->selectWordRowsAbove = sEasyChatScreen->selectWordNumRows + -3u;\n\n            MoveWordCursorXToMaxCol();\n            return 21;\n        }\n        break;\n    }\n\n    return 0;\n}\n\nstatic u16 GetSelectedFieldIndex(void)\n{\n    return (sEasyChatScreen->mainCursorRow * sEasyChatScreen->numColumns) + sEasyChatScreen->mainCursorColumn;\n}\n\nstatic u16 GetSelectedGroupIndex(void)\n{\n    return 2 * (sEasyChatScreen->selectGroupCursorY + sEasyChatScreen->selectGroupRowsAbove) + sEasyChatScreen->selectGroupCursorX;\n}\n\nstatic const u8 sAlphabetLayout[][7] = {\n    { 1,  2,  3,  4,  5,  6},\n    { 7,  8,  9, 10, 11, 12},\n    {13, 14, 15, 16, 17, 18, 19},\n    {20, 21, 22, 23, 24, 25, 26}\n};\n\nstatic int GetSelectedLetter(void)\n{\n    int col = sEasyChatScreen->selectGroupCursorX < NELEMS(*sAlphabetLayout) ? sEasyChatScreen->selectGroupCursorX : 0;\n    int row = sEasyChatScreen->selectGroupCursorY < NELEMS(sAlphabetLayout) ? sEasyChatScreen->selectGroupCursorY : 0;\n    return sAlphabetLayout[row][col];\n}\n\nstatic u16 GetSelectWordCursorPos(void)\n{\n    return 2 * (sEasyChatScreen->selectWordCursorY + sEasyChatScreen->selectWordRowsAbove)  + sEasyChatScreen->selectWordCursorX;\n}\n\nstatic u8 GetMaxGroupCursorXinAlphaMode(u8 arg0)\n{\n    switch (arg0)\n    {\n    case 0:\n    default:\n        return 6;\n    case 1:\n        return 5;\n    }\n}\n\nstatic void MoveGroupCursorXToMaxCol(void)\n{\n    while (GroupSelectCursorXPosTooFarRight())\n    {\n        if (sEasyChatScreen->selectGroupCursorX)\n            sEasyChatScreen->selectGroupCursorX--;\n        else\n            break;\n    }\n}\n\nstatic void MoveWordCursorXToMaxCol(void)\n{\n    while (WordSelectCursorXPosTooFarRight())\n    {\n        if (sEasyChatScreen->selectWordCursorX)\n            sEasyChatScreen->selectWordCursorX--;\n        else\n            break;\n    }\n}\n\nstatic bool8 GroupSelectCursorXPosTooFarRight(void)\n{\n    if (!sEasyChatScreen->isAlphaMode)\n        return GetSelectedGroupIndex() >= GetNumDisplayableGroups() ? TRUE : FALSE;\n    else\n        return sEasyChatScreen->selectGroupCursorX > GetMaxGroupCursorXinAlphaMode(sEasyChatScreen->selectGroupCursorY) ? TRUE : FALSE;\n}\n\nstatic bool8 WordSelectCursorXPosTooFarRight(void)\n{\n    return GetSelectWordCursorPos() >= GetNumDisplayedWords() ? TRUE : FALSE;\n}\n\nu8 GetEasyChatScreenFrameId(void)\n{\n    return sEasyChatScreenTemplates[sEasyChatScreen->templateId].frameId;\n}\n\nconst u8 *GetTitleText(void)\n{\n    return sEasyChatScreenTemplates[sEasyChatScreen->templateId].titleText;\n}\n\nu16 *GetEasyChatWordBuffer(void)\n{\n    return sEasyChatScreen->ecWordBuffer;\n}\n\nu8 GetNumRows(void)\n{\n    return sEasyChatScreen->numRows;\n}\n\nu8 GetNumColumns(void)\n{\n    return sEasyChatScreen->numColumns;\n}\n\nu8 GetMainCursorColumn(void)\n{\n    return sEasyChatScreen->mainCursorColumn;\n}\n\nu8 GetMainCursorRow(void)\n{\n    return sEasyChatScreen->mainCursorRow;\n}\n\nvoid GetEasyChatInstructionsText(const u8 **str1, const u8 **str2)\n{\n    *str1 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].instructionsText1;\n    *str2 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].instructionsText2;\n}\n\nvoid GetEasyChatConfirmText(const u8 **str1, const u8 **str2)\n{\n    *str1 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].confirmText1;\n    *str2 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].confirmText2;\n}\n\nvoid GetEasyChatConfirmCancelText(const u8 **str1, const u8 **str2)\n{\n    switch (sEasyChatScreen->type)\n    {\n    case EASY_CHAT_TYPE_MAIL:\n        *str1 = gText_StopGivingPkmnMail;\n        *str2 = NULL;\n        break;\n    default:\n        *str1 = gText_QuitEditing;\n        *str2 = NULL;\n        break;\n    }\n\n}\n\nvoid GetEasyChatConfirmDeletionText(const u8 **str1, const u8 **str2)\n{\n    *str1 = gText_AllTextBeingEditedWill;\n    *str2 = gText_BeDeletedThatOkay;\n}\n\nvoid GetECSelectGroupCursorCoords(u8 *Xp, u8 *Yp)\n{\n    *Xp = sEasyChatScreen->selectGroupCursorX;\n    *Yp = sEasyChatScreen->selectGroupCursorY;\n}\n\nbool8 IsEasyChatAlphaMode(void)\n{\n    return sEasyChatScreen->isAlphaMode;\n}\n\nu8 GetECSelectGroupRowsAbove(void)\n{\n    return sEasyChatScreen->selectGroupRowsAbove;\n}\n\nvoid GetECSelectWordCursorCoords(s8 *Xp, s8 *Yp)\n{\n    *Xp = sEasyChatScreen->selectWordCursorX;\n    *Yp = sEasyChatScreen->selectWordCursorY;\n}\n\nu8 GetECSelectWordRowsAbove(void)\n{\n    return sEasyChatScreen->selectWordRowsAbove;\n}\n\nu8 GetECSelectWordNumRows(void)\n{\n    return sEasyChatScreen->selectWordNumRows;\n}\n\nstatic u8 UnusedDummy(void)\n{\n    return 0;\n}\n\nbool32 ShouldDrawECUpArrow(void)\n{\n    switch (sEasyChatScreen->state)\n    {\n    case 2:\n        if (!sEasyChatScreen->isAlphaMode && sEasyChatScreen->selectGroupRowsAbove != 0)\n            return TRUE;\n        break;\n    case 3:\n        if (sEasyChatScreen->selectWordRowsAbove != 0)\n            return TRUE;\n        break;\n    }\n\n    return FALSE;\n}\n\nbool32 ShouldDrawECDownArrow(void)\n{\n    switch (sEasyChatScreen->state)\n    {\n    case 2:\n        if (!sEasyChatScreen->isAlphaMode && sEasyChatScreen->selectGroupRowsAbove + 4 <= sEasyChatScreen->selectGroupNumRows - 1)\n            return TRUE;\n        break;\n    case 3:\n        if (sEasyChatScreen->selectWordRowsAbove + 4 <= sEasyChatScreen->selectWordNumRows)\n            return TRUE;\n        break;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 IsPhraseDifferentThanPlayerInput(const u16 *phrase, u8 phraseLength)\n{\n    u32 i;\n\n    for (i = 0; i < phraseLength; i++)\n    {\n        if (phrase[i] != sEasyChatScreen->ecWordBuffer[i])\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic u8 GetEasyChatScreenTemplateId(u8 type)\n{\n    u32 i;\n\n    for (i = 0; i < NELEMS(sEasyChatScreenTemplates); i++)\n    {\n        if (sEasyChatScreenTemplates[i].type == type)\n            return i;\n    }\n\n    return 0;\n}\n\nstatic bool32 IsEcWordBufferUninitialized(void)\n{\n    int i;\n\n    for (i = 0; i < sEasyChatScreen->numWords; i++)\n    {\n        if (sEasyChatScreen->ecWordBuffer[i] != 0xFFFF)\n            return FALSE;\n    }\n\n    return TRUE;\n}\n"
  },
  {
    "path": "src/easy_chat_3.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"keyboard_text.h\"\n#include \"decompress.h\"\n#include \"easy_chat.h\"\n#include \"graphics.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"strings.h\"\n#include \"text_window.h\"\n\nenum {\n    GFXTAG_TRIANGLE_CURSOR,\n    GFXTAG_RECTANGLE_CURSOR,\n    GFXTAG_SCROLL_INDICATOR,\n    GFXTAG_START_SELECT_BUTTONS,\n    GFXTAG_MODE_WINDOW,\n    GFXTAG_RS_INTERVIEW_FRAME,\n    GFXTAG_BUTTON_WINDOW,\n};\n\nenum {\n    PALTAG_TRIANGLE_CURSOR,\n    PALTAG_RECTANGLE_CURSOR,\n    PALTAG_MISC_UI,\n    PALTAG_RS_INTERVIEW_FRAME,\n};\n\nstruct ECWork\n{\n    u16 state;\n    u16 windowId;\n    u16 id;\n    u8 frameAnimIdx;\n    u8 frameAnimTarget;\n    s8 frameAnimDelta;\n    u8 modeIconState;\n    u8 ecPrintBuffer[0xC1];\n    u8 ecPaddedWordBuffer[0x200];\n    u16 bg2ScrollRow;\n    int tgtBgY;\n    int deltaBgY;\n    struct Sprite *selectDestFieldCursorSprite;\n    struct Sprite *rectCursorSpriteRight;\n    struct Sprite *rectCursorSpriteLeft;\n    struct Sprite *selectWordCursorSprite;\n    struct Sprite *selectGroupHelpSprite;\n    struct Sprite *modeIconsSprite;\n    struct Sprite *upTriangleCursorSprite;\n    struct Sprite *downTriangleCursorSprite;\n    struct Sprite *startPgUpButtonSprite;\n    struct Sprite *selectPgDnButtonSprite;\n    u16 bg1TilemapBuffer[BG_SCREEN_SIZE / 2];\n    u16 bg3TilemapBuffer[BG_SCREEN_SIZE / 2];\n};\n\nstruct EasyChatPhraseFrameDimensions\n{\n    u8 left;\n    u8 top;\n    u8 width;\n    u8 height;\n};\n\nstatic EWRAM_DATA struct ECWork * sEasyChatGraphicsResources = NULL;\n\nstatic bool8 ECInterfaceCmd_01(void);\nstatic bool8 ECInterfaceCmd_02(void);\nstatic bool8 ECInterfaceCmd_03(void);\nstatic bool8 ECInterfaceCmd_05(void);\nstatic bool8 ECInterfaceCmd_06(void);\nstatic bool8 ECInterfaceCmd_04(void);\nstatic bool8 ECInterfaceCmd_07(void);\nstatic bool8 ECInterfaceCmd_08(void);\nstatic bool8 ECInterfaceCmd_09(void);\nstatic bool8 ECInterfaceCmd_10(void);\nstatic bool8 ECInterfaceCmd_22(void);\nstatic bool8 ECInterfaceCmd_14(void);\nstatic bool8 ECInterfaceCmd_15(void);\nstatic bool8 ECInterfaceCmd_16(void);\nstatic bool8 ECInterfaceCmd_11(void);\nstatic bool8 ECInterfaceCmd_12(void);\nstatic bool8 ECInterfaceCmd_13(void);\nstatic bool8 ECInterfaceCmd_17(void);\nstatic bool8 ECInterfaceCmd_19(void);\nstatic bool8 ECInterfaceCmd_18(void);\nstatic bool8 ECInterfaceCmd_21(void);\nstatic bool8 ECInterfaceCmd_20(void);\nstatic bool8 InitEasyChatGraphicsWork_Internal(void);\nstatic void SetGpuRegsForEasyChatInit(void);\nstatic void LoadEasyChatPals(void);\nstatic void PrintTitleText(void);\nstatic void EC_AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, u8 bg, u8 fg, u8 shadow);\nstatic void PrintECInstructionsText(void);\nstatic void PrintECInterfaceTextById(u8 a0);\nstatic void EC_CreateYesNoMenuWithInitialCursorPos(u8 initialCursorPos);\nstatic void CreatePhraseFrameWindow(void);\nstatic void PrintECFields(void);\nstatic void DrawECFrameInTilemapBuffer(u16 *buffer);\nstatic void PutWin2TilemapAndCopyToVram(void);\nstatic void PrintECMenuById(u32 a0);\nstatic void PrintECGroupOrAlphaMenu(void);\nstatic void PrintECGroupsMenu(void);\nstatic void PrintEasyChatKeyboardText(void);\nstatic void PrintECWordsMenu(void);\nstatic void UpdateWin2PrintWordsScrollDown(void);\nstatic void UpdateWin2PrintWordsScrollUp(void);\nstatic void UpdateWin2PrintWordsScrollPageDown(void);\nstatic void UpdateWin2PrintWordsScrollPageUp(void);\nstatic void PrintECRowsWin2(u8 row, u8 remrow);\nstatic void ClearECRowsWin2(u8 row, u8 remrow);\nstatic void ClearWin2AndCopyToVram(void);\nstatic void StartWin2FrameAnim(int a0);\nstatic bool8 AnimateFrameResize(void);\nstatic void RedrawFrameByIndex(u8 a0);\nstatic void RedrawFrameByRect(int left, int top, int width, int height);\nstatic void InitBg2Scroll(void);\nstatic void ScheduleBg2VerticalScroll(s16 direction, u8 speed);\nstatic bool8 AnimateBg2VerticalScroll(void);\nstatic int GetBg2ScrollRow(void);\nstatic void SetRegWin0Coords(u8 left, u8 top, u8 right, u8 bottom);\nstatic void LoadSpriteGfx(void);\nstatic void CreateSelectDestFieldCursorSprite(void);\nstatic void SpriteCB_BounceCursor(struct Sprite *sprite);\nstatic void SetSelectDestFieldCursorSpritePosAndResetAnim(u8 x, u8 y);\nstatic void FreezeSelectDestFieldCursorSprite(void);\nstatic void UnfreezeSelectDestFieldCursorSprite(void);\nstatic void CreateRedRectangularCursorSpritePair(void);\nstatic void DestroyRedRectangularCursor(void);\nstatic void EC_MoveCursor(void);\nstatic void MoveCursor_Group(s8 a0, s8 a1);\nstatic void MoveCursor_Alpha(s8 a0, s8 a1);\nstatic void CreateSelectWordCursorSprite(void);\nstatic void SpriteCB_SelectWordCursorSprite(struct Sprite *sprite);\nstatic void SetSelectWordCursorSpritePos(void);\nstatic void SetSelectWordCursorSpritePosExplicit(u8 x, u8 y);\nstatic void DestroySelectWordCursorSprite(void);\nstatic void CreateSelectGroupHelpSprite(void);\nstatic bool8 AnimateSeletGroupModeAndHelpSpriteEnter(void);\nstatic void StartModeIconHidingAnimation(void);\nstatic bool8 RunModeIconHidingAnimation(void);\nstatic void ShrinkModeIconsSprite(void);\nstatic void ShowModeIconsSprite(void);\nstatic bool8 ModeIconsSpriteAnimIsEnded(void);\nstatic void CreateVerticalScrollArrowSprites(void);\nstatic void UpdateVerticalScrollArrowVisibility(void);\nstatic void HideVerticalScrollArrowSprites(void);\nstatic void UpdateVerticalScrollArrowSpriteXPos(int a0);\nstatic void CreateStartSelectButtonsSprites(void);\nstatic void UpdateStartSelectButtonSpriteVisibility(void);\nstatic void HideStartSelectButtonSprites(void);\nstatic void CreateFooterWindow(void);\n\nstatic const u16 sTriangleCursor_Pal[] = INCBIN_U16(\"graphics/easy_chat/triangle_cursor.gbapal\");\nstatic const u16 sRectangleCursor_Pal[] = INCBIN_U16(\"graphics/easy_chat/rectangle_cursor.gbapal\");\nstatic const u16 sTriangleCursor_Gfx[] = INCBIN_U16(\"graphics/easy_chat/triangle_cursor.4bpp\");\nstatic const u16 sScrollIndicator_Gfx[] = INCBIN_U16(\"graphics/easy_chat/scroll_indicator.4bpp\");\nstatic const u16 sStartSelectButtons_Gfx[] = INCBIN_U16(\"graphics/easy_chat/start_select_buttons.4bpp\");\n// In Ruby/Sapphire Easy Chat screens had a black background, and when the player & interviewer were present\n// on screen the interview_frame gfx was shown behind them.\n// In FRLG all Easy Chat screens have a filled background, so these gfx go unused\nstatic const u16 sRSInterviewFrame_Pal[] = INCBIN_U16(\"graphics/easy_chat/interview_frame.gbapal\");\nstatic const u32 sRSInterviewFrame_Gfx[] = INCBIN_U32(\"graphics/easy_chat/interview_frame.4bpp.lz\");\nstatic const u16 sTextInputFrameOrange_Pal[] = INCBIN_U16(\"graphics/easy_chat/text_input_frame_orange.gbapal\");\nstatic const u16 sTextInputFrameGreen_Pal[] = INCBIN_U16(\"graphics/easy_chat/text_input_frame_green.gbapal\");\nstatic const u32 sTextInputFrame_Gfx[] = INCBIN_U32(\"graphics/easy_chat/text_input_frame.4bpp.lz\");\nstatic const u16 sTitleText_Pal[] = INCBIN_U16(\"graphics/easy_chat/title_text.gbapal\");\nstatic const u16 sText_Pal[] = INCBIN_U16(\"graphics/easy_chat/text.gbapal\");\n\nstatic const struct EasyChatPhraseFrameDimensions sPhraseFrameDimensions[] = {\n    {\n        .left = 3,\n        .top = 4,\n        .width = 24,\n        .height = 4\n    }, {\n        .left = 1,\n        .top = 4,\n        .width = 27,\n        .height = 4\n    }, {\n        .left = 3,\n        .top = 0,\n        .width = 24,\n        .height = 10\n    }, {\n        .left = 6,\n        .top = 6,\n        .width = 18,\n        .height = 4\n    }, {\n        .left = 16,\n        .top = 4,\n        .width = 9,\n        .height = 2\n    }, {\n        .left = 14,\n        .top = 4,\n        .width = 18,\n        .height = 4\n    }\n};\n\nstatic const struct BgTemplate sEasyChatBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 28,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0,\n    }, {\n        .bg = 1,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0,\n    }, {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x80,\n    }, {\n        .bg = 3,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0,\n    }\n};\n\nstatic const struct WindowTemplate sEasyChatWindowTemplates[] = {\n    {\n        .bg = 1,\n        .tilemapLeft = 7,\n        .tilemapTop = 0,\n        .width = 16,\n        .height = 2,\n        .paletteNum = 10,\n        .baseBlock = 0x10,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 4,\n        .tilemapTop = 15,\n        .width = 22,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0xA,\n    },\n    {\n        .bg = 2,\n        .tilemapLeft = 1,\n        .tilemapTop = 0,\n        .width = 28,\n        .height = 32,\n        .paletteNum = 3,\n        .baseBlock = 0,\n    },\n    DUMMY_WIN_TEMPLATE,\n};\n\nstatic const struct WindowTemplate sEasyChatYesNoWindowTemplate = {\n    .bg = 0,\n    .tilemapLeft = 22,\n    .tilemapTop = 9,\n    .width = 5,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x062\n};\n\nstatic const u8 sText_Underscore[] = _(\"{UNDERSCORE}\");\nstatic const u8 sText_Clear17[] = _(\"{CLEAR 17}\");\n\nstatic const u8 *const sEasyChatKeyboardAlphabet[NUM_ALPHABET_ROWS] = {\n    gText_EasyChatKeyboard_ABCDEFothers,\n    gText_EasyChatKeyboard_GHIJKL,\n    gText_EasyChatKeyboard_MNOPQRS,\n    gText_EasyChatKeyboard_TUVWXYZ\n};\n\nstatic const struct SpriteSheet sEasyChatSpriteSheets[] = {\n    {.data = sTriangleCursor_Gfx,     .size = 0x0020, .tag = GFXTAG_TRIANGLE_CURSOR},\n    {.data = sScrollIndicator_Gfx,    .size = 0x0100, .tag = GFXTAG_SCROLL_INDICATOR},\n    {.data = sStartSelectButtons_Gfx, .size = 0x0100, .tag = GFXTAG_START_SELECT_BUTTONS},\n    {}\n};\n\nstatic const struct SpritePalette sEasyChatSpritePalettes[] = {\n    {.data = sTriangleCursor_Pal,       .tag = PALTAG_TRIANGLE_CURSOR},\n    {.data = sRectangleCursor_Pal,      .tag = PALTAG_RECTANGLE_CURSOR},\n    {.data = gEasyChatButtonWindow_Pal, .tag = PALTAG_MISC_UI}, // The palette is generated from the button window but used for various parts of the UI\n    {.data = sRSInterviewFrame_Pal,     .tag = PALTAG_RS_INTERVIEW_FRAME},\n    {}\n};\n\nstatic const struct CompressedSpriteSheet sEasyChatCompressedSpriteSheets[] = {\n    {.data = sRSInterviewFrame_Gfx,        .size = 0x0800, .tag = GFXTAG_RS_INTERVIEW_FRAME},\n    {.data = gEasyChatRectangleCursor_Gfx, .size = 0x1000, .tag = GFXTAG_RECTANGLE_CURSOR},\n    {.data = gEasyChatButtonWindow_Gfx,    .size = 0x0800, .tag = GFXTAG_BUTTON_WINDOW},\n    {.data = gEasyChatMode_Gfx,            .size = 0x1000, .tag = GFXTAG_MODE_WINDOW}\n};\n\nstatic const u8 sAlphabetKeyboardColumnOffsets[NUM_ALPHABET_COLUMNS] = {0, 12, 24, 56, 68, 80, 92};\n\nstatic const struct OamData sOamData_TriangleCursor = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .mosaic = FALSE,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0x000,\n    .priority = 3,\n    .paletteNum = 0\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_TriangleCursor = {\n    .tileTag = GFXTAG_TRIANGLE_CURSOR,\n    .paletteTag = PALTAG_TRIANGLE_CURSOR,\n    .oam = &sOamData_TriangleCursor,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_BounceCursor\n};\n\nstatic const struct OamData sOamData_RectangleCursor = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .mosaic = FALSE,\n    .shape = SPRITE_SHAPE(64x32),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x32),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_RectangleCursor_OnGroup[] = {\n    ANIMCMD_FRAME(0x00, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_RectangleCursor_OnButton[] = {\n    ANIMCMD_FRAME(0x20, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_RectangleCursor_OnOthers[] = {\n    ANIMCMD_FRAME(0x40, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_RectangleCursor_OnLetter[] = {\n    ANIMCMD_FRAME(0x60, 0),\n    ANIMCMD_END\n};\n\n// Each anim changes the dimensions of the rectangle cursor to fit what it should be selecting\nenum {\n    RECTCURSOR_ANIM_ON_GROUP,\n    RECTCURSOR_ANIM_ON_BUTTON,\n    RECTCURSOR_ANIM_ON_OTHERS,\n    RECTCURSOR_ANIM_ON_LETTER,\n};\n\nstatic const union AnimCmd *const sAnims_RectangleCursor[] = {\n    [RECTCURSOR_ANIM_ON_GROUP]  = sAnim_RectangleCursor_OnGroup,\n    [RECTCURSOR_ANIM_ON_BUTTON] = sAnim_RectangleCursor_OnButton,\n    [RECTCURSOR_ANIM_ON_OTHERS] = sAnim_RectangleCursor_OnOthers,\n    [RECTCURSOR_ANIM_ON_LETTER] = sAnim_RectangleCursor_OnLetter,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_RectangleCursor = {\n    .tileTag = GFXTAG_RECTANGLE_CURSOR,\n    .paletteTag = PALTAG_RECTANGLE_CURSOR,\n    .oam = &sOamData_RectangleCursor,\n    .anims = sAnims_RectangleCursor,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_BounceCursor\n};\n\nstatic const struct OamData sOamData_ModeWindow = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .mosaic = FALSE,\n    .shape = SPRITE_SHAPE(64x32),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x32),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_ModeWindow_Hidden[] = {\n    ANIMCMD_FRAME(0x60, 0), // Hidden frame\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_ModeWindow_ToGroup[] = {\n    ANIMCMD_FRAME(0x40, 4), // Transition frame\n    ANIMCMD_FRAME(0x20, 4), // 'Group' frame\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_ModeWindow_ToAlphabet[] = {\n    ANIMCMD_FRAME(0x40, 4), // Transition frame\n    ANIMCMD_FRAME(0x00, 4), // 'A-Z' frame\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_ModeWindow_ToHidden[] = {\n    ANIMCMD_FRAME(0x40, 4), // Transition frame\n    ANIMCMD_FRAME(0x60, 0), // Hidden frame\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_ModeWindow_Transition[] = {\n    ANIMCMD_FRAME(0x40, 4), // Transition frame\n    ANIMCMD_END\n};\n\nenum {\n    MODEWINDOW_ANIM_HIDDEN,\n    MODEWINDOW_ANIM_TO_GROUP,\n    MODEWINDOW_ANIM_TO_ALPHABET,\n    MODEWINDOW_ANIM_TO_HIDDEN,\n    MODEWINDOW_ANIM_TRANSITION,\n};\n\nstatic const union AnimCmd *const sAnims_ModeWindow[] = {\n    [MODEWINDOW_ANIM_HIDDEN]      = sAnim_ModeWindow_Hidden,\n    [MODEWINDOW_ANIM_TO_GROUP]    = sAnim_ModeWindow_ToGroup,\n    [MODEWINDOW_ANIM_TO_ALPHABET] = sAnim_ModeWindow_ToAlphabet,\n    [MODEWINDOW_ANIM_TO_HIDDEN]   = sAnim_ModeWindow_ToHidden,\n    [MODEWINDOW_ANIM_TRANSITION]  = sAnim_ModeWindow_Transition,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_ModeWindow = {\n    .tileTag = GFXTAG_MODE_WINDOW,\n    .paletteTag = PALTAG_MISC_UI,\n    .oam = &sOamData_ModeWindow,\n    .anims = sAnims_ModeWindow,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_ButtonWindow = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0x000,\n    .priority = 3,\n    .paletteNum = 0\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_ButtonWindow = {\n    .tileTag = GFXTAG_BUTTON_WINDOW,\n    .paletteTag = PALTAG_MISC_UI,\n    .oam = &sOamData_ButtonWindow,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_StartSelectButton = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x8),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const struct OamData sOamData_ScrollIndicator = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_Frame0[] = {\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Frame1[] = {\n    ANIMCMD_FRAME(4, 0),\n    ANIMCMD_END,\n};\n\n// Frame0 is Start button, Frame1 is Select button, both are identical for the scroll indicators\nstatic const union AnimCmd *const sAnims_TwoFrame[] = {\n    sAnim_Frame0,\n    sAnim_Frame1,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_StartSelectButtons = {\n    .tileTag = GFXTAG_START_SELECT_BUTTONS,\n    .paletteTag = PALTAG_MISC_UI,\n    .oam = &sOamData_StartSelectButton,\n    .anims = sAnims_TwoFrame,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_ScrollIndicator = {\n    .tileTag = GFXTAG_SCROLL_INDICATOR,\n    .paletteTag = PALTAG_MISC_UI,\n    .oam = &sOamData_ScrollIndicator,\n    .anims = sAnims_TwoFrame,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nbool8 InitEasyChatGraphicsWork(void)\n{\n    if (!InitEasyChatGraphicsWork_Internal())\n        return FALSE;\n    else\n        return TRUE;\n}\n\nbool8 LoadEasyChatGraphics(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        ResetBgsAndClearDma3BusyFlags(0);\n        InitBgsFromTemplates(0, sEasyChatBgTemplates, NELEMS(sEasyChatBgTemplates));\n        SetBgTilemapBuffer(3, sEasyChatGraphicsResources->bg3TilemapBuffer);\n        SetBgTilemapBuffer(1, sEasyChatGraphicsResources->bg1TilemapBuffer);\n        InitWindows(sEasyChatWindowTemplates);\n        DeactivateAllTextPrinters();\n        LoadEasyChatPals();\n        SetGpuRegsForEasyChatInit();\n        CpuFastFill(0, (void *)VRAM + 0x1000000, 0x400);\n        break;\n    case 1:\n        DecompressAndLoadBgGfxUsingHeap(3, gEasyChatWindow_Gfx, 0, 0, 0);\n        CopyToBgTilemapBuffer(3, gEasyChatWindow_Tilemap, 0, 0);\n        CreatePhraseFrameWindow();\n        CreateFooterWindow();\n        CopyBgTilemapBufferToVram(3);\n        break;\n    case 2:\n        DrawECFrameInTilemapBuffer(sEasyChatGraphicsResources->bg1TilemapBuffer);\n        DecompressAndLoadBgGfxUsingHeap(1, sTextInputFrame_Gfx, 0, 0, 0);\n        CopyBgTilemapBufferToVram(1);\n        break;\n    case 3:\n        PrintTitleText();\n        PrintECInstructionsText();\n        PrintECFields();\n        PutWin2TilemapAndCopyToVram();\n        break;\n    case 4:\n        LoadSpriteGfx();\n        CreateSelectDestFieldCursorSprite();\n        break;\n    case 5:\n        if (IsDma3ManagerBusyWithBgCopy())\n        {\n            return TRUE;\n        }\n        else\n        {\n            SetRegWin0Coords(0, 0, 0, 0);\n            SetGpuReg(REG_OFFSET_WININ, WIN_RANGE(0, 63));\n            SetGpuReg(REG_OFFSET_WINOUT, WIN_RANGE(0, 59));\n            ShowBg(3);\n            ShowBg(1);\n            ShowBg(2);\n            ShowBg(0);\n            CreateVerticalScrollArrowSprites();\n            CreateStartSelectButtonsSprites();\n        }\n        break;\n    default:\n        return FALSE;\n    }\n\n    sEasyChatGraphicsResources->state++;\n    return TRUE;\n}\n\nvoid DestroyEasyChatGraphicsResources(void)\n{\n    if (sEasyChatGraphicsResources)\n        Free(sEasyChatGraphicsResources);\n}\n\nvoid EasyChatInterfaceCommand_Setup(u16 id)\n{\n    sEasyChatGraphicsResources->id = id;\n    sEasyChatGraphicsResources->state = 0;\n    EasyChatInterfaceCommand_Run();\n}\n\nbool8 EasyChatInterfaceCommand_Run(void)\n{\n    switch (sEasyChatGraphicsResources->id)\n    {\n    case 0:  return FALSE;\n    case 1:  return ECInterfaceCmd_01();\n    case 2:  return ECInterfaceCmd_02();\n    case 3:  return ECInterfaceCmd_03();\n    case 4:  return ECInterfaceCmd_04();\n    case 5:  return ECInterfaceCmd_05();\n    case 6:  return ECInterfaceCmd_06();\n    case 7:  return ECInterfaceCmd_07();\n    case 8:  return ECInterfaceCmd_08();\n    case 9:  return ECInterfaceCmd_09();\n    case 10: return ECInterfaceCmd_10();\n    case 11: return ECInterfaceCmd_11();\n    case 12: return ECInterfaceCmd_12();\n    case 13: return ECInterfaceCmd_13();\n    case 14: return ECInterfaceCmd_14();\n    case 15: return ECInterfaceCmd_15();\n    case 16: return ECInterfaceCmd_16();\n    case 17: return ECInterfaceCmd_17();\n    case 18: return ECInterfaceCmd_18();\n    case 19: return ECInterfaceCmd_19();\n    case 20: return ECInterfaceCmd_20();\n    case 21: return ECInterfaceCmd_21();\n    case 22: return ECInterfaceCmd_22();\n    default: return FALSE;\n    }\n}\n\nstatic bool8 ECInterfaceCmd_01(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        PrintECFields();\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_02(void)\n{\n    u32 i;\n    u16 *ecWordBuffer;\n    u16 *ecWord;\n    u8 frameId;\n    u8 cursorColumn, cursorRow, numColumns;\n    s16 var1;\n    int stringWidth;\n    int trueStringWidth;\n    int var2;\n    u8 str[64];\n\n    ecWordBuffer = GetEasyChatWordBuffer();\n    frameId = GetEasyChatScreenFrameId();\n    cursorColumn = GetMainCursorColumn();\n    cursorRow = GetMainCursorRow();\n    numColumns = GetNumColumns();\n    ecWord = &ecWordBuffer[cursorRow * numColumns];\n    var1 = 8 * sPhraseFrameDimensions[frameId].left + 13;\n    for (i = 0; i < cursorColumn; i++)\n    {\n        if (*ecWord == 0xFFFF)\n        {\n            stringWidth = GetStringWidth(FONT_NORMAL_COPY_1, sText_Underscore, 0) * 7;\n        }\n        else\n        {\n            CopyEasyChatWord(str, *ecWord);\n            stringWidth = GetStringWidth(FONT_NORMAL_COPY_1, str, 0);\n        }\n\n        trueStringWidth = stringWidth + 17;\n        var1 += trueStringWidth;\n        ecWord++;\n    }\n\n    var2 = 8 * (sPhraseFrameDimensions[frameId].top + cursorRow * 2 + 1) + 1;\n    SetSelectDestFieldCursorSpritePosAndResetAnim(var1, var2);\n    return FALSE;\n}\n\nstatic bool8 ECInterfaceCmd_03(void)\n{\n    u8 xOffset;\n    switch (GetMainCursorColumn())\n    {\n    case 0:\n        xOffset = 28;\n        break;\n    case 1:\n        xOffset = 115;\n        break;\n    case 2:\n        xOffset = 191;\n        break;\n    default:\n        return FALSE;\n    }\n    SetSelectDestFieldCursorSpritePosAndResetAnim(xOffset, 97);\n    return FALSE;\n}\n\nstatic bool8 ECInterfaceCmd_05(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        FreezeSelectDestFieldCursorSprite();\n        PrintECInterfaceTextById(2);\n        EC_CreateYesNoMenuWithInitialCursorPos(1);\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_06(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        FreezeSelectDestFieldCursorSprite();\n        PrintECInterfaceTextById(3);\n        EC_CreateYesNoMenuWithInitialCursorPos(0);\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_04(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        FreezeSelectDestFieldCursorSprite();\n        PrintECInterfaceTextById(1);\n        EC_CreateYesNoMenuWithInitialCursorPos(1);\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_07(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        UnfreezeSelectDestFieldCursorSprite();\n        PrintECInterfaceTextById(0);\n        ShowBg(0);\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_08(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        UnfreezeSelectDestFieldCursorSprite();\n        PrintECInterfaceTextById(0);\n        PrintECFields();\n        sEasyChatGraphicsResources->state++;\n        // Fall through\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_09(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        FreezeSelectDestFieldCursorSprite();\n        HideBg(0);\n        SetRegWin0Coords(0, 0, 0, 0);\n        PrintECGroupOrAlphaMenu();\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            StartWin2FrameAnim(0);\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy() && !AnimateFrameResize())\n            sEasyChatGraphicsResources->state++;\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            CreateSelectGroupHelpSprite();\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 4:\n        if (!AnimateSeletGroupModeAndHelpSpriteEnter())\n        {\n            CreateRedRectangularCursorSpritePair();\n            UpdateVerticalScrollArrowSpriteXPos(0);\n            UpdateVerticalScrollArrowVisibility();\n            sEasyChatGraphicsResources->state++;\n            return FALSE;\n        }\n        break;\n    default:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_10(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        DestroyRedRectangularCursor();\n        StartModeIconHidingAnimation();\n        HideVerticalScrollArrowSprites();\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        if (RunModeIconHidingAnimation() == TRUE)\n            break;\n\n        StartWin2FrameAnim(1);\n        sEasyChatGraphicsResources->state++;\n        // Fall through\n    case 2:\n        if (!AnimateFrameResize())\n            sEasyChatGraphicsResources->state++;\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            UnfreezeSelectDestFieldCursorSprite();\n            ShowBg(0);\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 4:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_22(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        DestroyRedRectangularCursor();\n        HideVerticalScrollArrowSprites();\n        ShrinkModeIconsSprite();\n        StartWin2FrameAnim(5);\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        if (!AnimateFrameResize() && !ModeIconsSpriteAnimIsEnded())\n        {\n            PrintECGroupOrAlphaMenu();\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            StartWin2FrameAnim(6);\n            ShowModeIconsSprite();\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 3:\n        if (!AnimateFrameResize() && !ModeIconsSpriteAnimIsEnded())\n        {\n            UpdateVerticalScrollArrowVisibility();\n            CreateRedRectangularCursorSpritePair();\n            sEasyChatGraphicsResources->state++;\n            return FALSE;\n        }\n        break;\n    case 4:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_14(void)\n{\n    EC_MoveCursor();\n    return FALSE;\n}\n\nstatic bool8 ECInterfaceCmd_15(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        ScheduleBg2VerticalScroll(1, 2);\n        sEasyChatGraphicsResources->state++;\n        // Fall through\n    case 1:\n        if (!AnimateBg2VerticalScroll())\n        {\n            EC_MoveCursor();\n            UpdateVerticalScrollArrowVisibility();\n            return FALSE;\n        }\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_16(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        ScheduleBg2VerticalScroll(-1, 2);\n        sEasyChatGraphicsResources->state++;\n        // Fall through\n    case 1:\n        if (!AnimateBg2VerticalScroll())\n        {\n            UpdateVerticalScrollArrowVisibility();\n            sEasyChatGraphicsResources->state++;\n            return FALSE;\n        }\n        break;\n    case 2:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_11(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        DestroyRedRectangularCursor();\n        StartModeIconHidingAnimation();\n        HideVerticalScrollArrowSprites();\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        if (!RunModeIconHidingAnimation())\n        {\n            ClearWin2AndCopyToVram();\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            StartWin2FrameAnim(2);\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 3:\n        if (!AnimateFrameResize())\n        {\n            PrintECMenuById(2);\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 4:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            CreateSelectWordCursorSprite();\n            UpdateVerticalScrollArrowSpriteXPos(1);\n            UpdateVerticalScrollArrowVisibility();\n            UpdateStartSelectButtonSpriteVisibility();\n            sEasyChatGraphicsResources->state++;\n            return FALSE;\n        }\n        break;\n    case 5:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_12(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        PrintECFields();\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        DestroySelectWordCursorSprite();\n        HideVerticalScrollArrowSprites();\n        HideStartSelectButtonSprites();\n        ClearWin2AndCopyToVram();\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            StartWin2FrameAnim(3);\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 3:\n        if (!AnimateFrameResize())\n        {\n            ShowBg(0);\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 4:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            UnfreezeSelectDestFieldCursorSprite();\n            sEasyChatGraphicsResources->state++;\n            return FALSE;\n        }\n        break;\n    case 5:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_13(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        DestroySelectWordCursorSprite();\n        HideVerticalScrollArrowSprites();\n        HideStartSelectButtonSprites();\n        ClearWin2AndCopyToVram();\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            StartWin2FrameAnim(4);\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 2:\n        if (!AnimateFrameResize())\n        {\n            PrintECGroupOrAlphaMenu();\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            CreateSelectGroupHelpSprite();\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 4:\n        if (!AnimateSeletGroupModeAndHelpSpriteEnter())\n        {\n            CreateRedRectangularCursorSpritePair();\n            UpdateVerticalScrollArrowSpriteXPos(0);\n            UpdateVerticalScrollArrowVisibility();\n            sEasyChatGraphicsResources->state++;\n            return FALSE;\n        }\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_17(void)\n{\n    SetSelectWordCursorSpritePos();\n    return FALSE;\n}\n\nstatic bool8 ECInterfaceCmd_19(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        UpdateWin2PrintWordsScrollDown();\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            ScheduleBg2VerticalScroll(1, 2);\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 2:\n        if (!AnimateBg2VerticalScroll())\n        {\n            SetSelectWordCursorSpritePos();\n            UpdateVerticalScrollArrowVisibility();\n            UpdateStartSelectButtonSpriteVisibility();\n            sEasyChatGraphicsResources->state++;\n            return FALSE;\n        }\n        break;\n    case 3:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_18(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        UpdateWin2PrintWordsScrollUp();\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            ScheduleBg2VerticalScroll(-1, 2);\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 2:\n        if (!AnimateBg2VerticalScroll())\n        {\n            UpdateVerticalScrollArrowVisibility();\n            UpdateStartSelectButtonSpriteVisibility();\n            sEasyChatGraphicsResources->state++;\n            return FALSE;\n        }\n        break;\n    case 3:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_21(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        UpdateWin2PrintWordsScrollPageDown();\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            s16 direction = GetECSelectWordRowsAbove() - GetBg2ScrollRow();\n            ScheduleBg2VerticalScroll(direction, 4);\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 2:\n        if (!AnimateBg2VerticalScroll())\n        {\n            SetSelectWordCursorSpritePos();\n            UpdateVerticalScrollArrowVisibility();\n            UpdateStartSelectButtonSpriteVisibility();\n            sEasyChatGraphicsResources->state++;\n            return FALSE;\n        }\n        break;\n    case 3:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 ECInterfaceCmd_20(void)\n{\n    switch (sEasyChatGraphicsResources->state)\n    {\n    case 0:\n        UpdateWin2PrintWordsScrollPageUp();\n        sEasyChatGraphicsResources->state++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            s16 direction = GetECSelectWordRowsAbove() - GetBg2ScrollRow();\n            ScheduleBg2VerticalScroll(direction, 4);\n            sEasyChatGraphicsResources->state++;\n        }\n        break;\n    case 2:\n        if (!AnimateBg2VerticalScroll())\n        {\n            UpdateVerticalScrollArrowVisibility();\n            UpdateStartSelectButtonSpriteVisibility();\n            sEasyChatGraphicsResources->state++;\n            return FALSE;\n        }\n        break;\n    case 3:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 InitEasyChatGraphicsWork_Internal(void)\n{\n    sEasyChatGraphicsResources = Alloc(sizeof(*sEasyChatGraphicsResources));\n    if (sEasyChatGraphicsResources == NULL)\n        return FALSE;\n\n    sEasyChatGraphicsResources->state = 0;\n    sEasyChatGraphicsResources->selectDestFieldCursorSprite = NULL;\n    sEasyChatGraphicsResources->rectCursorSpriteRight = NULL;\n    sEasyChatGraphicsResources->rectCursorSpriteLeft = NULL;\n    sEasyChatGraphicsResources->selectWordCursorSprite = NULL;\n    sEasyChatGraphicsResources->selectGroupHelpSprite = NULL;\n    sEasyChatGraphicsResources->modeIconsSprite = NULL;\n    sEasyChatGraphicsResources->upTriangleCursorSprite = NULL;\n    sEasyChatGraphicsResources->downTriangleCursorSprite = NULL;\n    sEasyChatGraphicsResources->startPgUpButtonSprite = NULL;\n    sEasyChatGraphicsResources->selectPgDnButtonSprite = NULL;\n    return TRUE;\n}\n\nstatic void SetGpuRegsForEasyChatInit(void)\n{\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON);\n}\n\nstatic void LoadEasyChatPals(void)\n{\n    ResetPaletteFade();\n    LoadPalette(gEasyChatWindow_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n    LoadPalette(sTextInputFrameOrange_Pal, BG_PLTT_ID(1), sizeof(sTextInputFrameOrange_Pal));\n    LoadPalette(sTextInputFrameGreen_Pal, BG_PLTT_ID(4), sizeof(sTextInputFrameGreen_Pal));\n    LoadPalette(sTitleText_Pal, BG_PLTT_ID(10), sizeof(sTitleText_Pal));\n    LoadPalette(sText_Pal, BG_PLTT_ID(11), sizeof(sText_Pal));\n    LoadPalette(sText_Pal, BG_PLTT_ID(15), sizeof(sText_Pal));\n    LoadPalette(sText_Pal, BG_PLTT_ID(3), sizeof(sText_Pal));\n}\n\nstatic void PrintTitleText(void)\n{\n    int xOffset;\n    const u8 *titleText = GetTitleText();\n    if (titleText == NULL)\n        return;\n\n    xOffset = (128 - GetStringWidth(FONT_NORMAL_COPY_1, titleText, 0)) / 2u;\n    FillWindowPixelBuffer(0, PIXEL_FILL(0));\n    EC_AddTextPrinterParameterized2(0, FONT_NORMAL_COPY_1, titleText, xOffset, 0, TEXT_SKIP_DRAW, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY);\n    PutWindowTilemap(0);\n    CopyWindowToVram(0, COPYWIN_FULL);\n}\n\nstatic void EC_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16))\n{\n    if (fontId == FONT_NORMAL_COPY_1)\n        y += 2;\n    AddTextPrinterParameterized(windowId, fontId, str, x, y, speed, callback);\n}\n\nstatic void EC_AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, u8 bg, u8 fg, u8 shadow)\n{\n    u8 color[3];\n    if (fontId == FONT_NORMAL_COPY_1)\n        y += 2;\n    color[0] = bg;\n    color[1] = fg;\n    color[2] = shadow;\n    AddTextPrinterParameterized3(windowId, fontId, x, y, color, speed, str);\n}\n\nstatic void PrintECInstructionsText(void)\n{\n    FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17);\n    LoadUserWindowGfx(1, 1, BG_PLTT_ID(14));\n    DrawTextBorderOuter(1, 1, 14);\n    PrintECInterfaceTextById(0);\n    PutWindowTilemap(1);\n    CopyBgTilemapBufferToVram(0);\n}\n\nstatic void PrintECInterfaceTextById(u8 direction)\n{\n    const u8 *text2 = NULL;\n    const u8 *text1 = NULL;\n    switch (direction)\n    {\n    case 0:\n        GetEasyChatInstructionsText(&text1, &text2);\n        break;\n    case 2:\n        GetEasyChatConfirmCancelText(&text1, &text2);\n        break;\n    case 3:\n        GetEasyChatConfirmText(&text1, &text2);\n        break;\n    case 1:\n        GetEasyChatConfirmDeletionText(&text1, &text2);\n        break;\n    }\n\n    FillWindowPixelBuffer(1, PIXEL_FILL(1));\n    if (text1)\n        EC_AddTextPrinterParameterized(1, FONT_NORMAL_COPY_1, text1, 0, 0, TEXT_SKIP_DRAW, NULL);\n\n    if (text2)\n        EC_AddTextPrinterParameterized(1, FONT_NORMAL_COPY_1, text2, 0, 16, TEXT_SKIP_DRAW, NULL);\n\n    CopyWindowToVram(1, COPYWIN_FULL);\n}\n\nstatic void EC_CreateYesNoMenuWithInitialCursorPos(u8 initialCursorPos)\n{\n    CreateYesNoMenu(&sEasyChatYesNoWindowTemplate, FONT_NORMAL_COPY_1, 0, 2, 0x001, 14, initialCursorPos);\n}\n\nstatic void CreatePhraseFrameWindow(void)\n{\n    u8 frameId;\n    struct WindowTemplate template;\n\n    frameId = GetEasyChatScreenFrameId();\n    template.bg = 3;\n    template.tilemapLeft = sPhraseFrameDimensions[frameId].left;\n    template.tilemapTop = sPhraseFrameDimensions[frameId].top;\n    template.width = sPhraseFrameDimensions[frameId].width;\n    template.height = sPhraseFrameDimensions[frameId].height;\n    template.paletteNum = 11;\n    template.baseBlock = 0x060;\n    sEasyChatGraphicsResources->windowId = AddWindow(&template);\n    PutWindowTilemap(sEasyChatGraphicsResources->windowId);\n}\n\nstatic void PrintECFields(void)\n{\n    u16 *ecWord;\n    u8 numColumns, numRows;\n    u8 *str;\n    u8 frameId;\n    int i, j, k;\n\n    ecWord = GetEasyChatWordBuffer();\n    numColumns = GetNumColumns();\n    numRows = GetNumRows();\n    frameId = GetEasyChatScreenFrameId();\n    FillWindowPixelBuffer(sEasyChatGraphicsResources->windowId, PIXEL_FILL(1));\n    for (i = 0; i < numRows; i++)\n    {\n        str = sEasyChatGraphicsResources->ecPrintBuffer;\n        str[0] = EOS;\n        str = StringAppend(str, sText_Clear17);\n        for (j = 0; j < numColumns; j++)\n        {\n            if (*ecWord != 0xFFFF)\n            {\n                str = CopyEasyChatWord(str, *ecWord);\n                ecWord++;\n            }\n            else\n            {\n                str = WriteColorChangeControlCode(str, 0, TEXT_COLOR_RED);\n                ecWord++;\n                for (k = 0; k < 7; k++)\n                {\n                    *str++ = CHAR_EXTRA_SYMBOL;\n                    *str++ = CHAR_UNDERSCORE;\n                }\n\n                str = WriteColorChangeControlCode(str, 0, TEXT_COLOR_DARK_GRAY);\n            }\n\n            str = StringAppend(str, sText_Clear17);\n            if (frameId == 2)\n            {\n                if (j == 0 && i == 4)\n                    break;\n            }\n        }\n\n        *str = EOS;\n        EC_AddTextPrinterParameterized(sEasyChatGraphicsResources->windowId, FONT_NORMAL_COPY_1, sEasyChatGraphicsResources->ecPrintBuffer, 0, i * 16, TEXT_SKIP_DRAW, NULL);\n    }\n\n    CopyWindowToVram(sEasyChatGraphicsResources->windowId, COPYWIN_FULL);\n}\n\nstatic void DrawECFrameInTilemapBuffer(u16 *tilemap)\n{\n    u8 frameId;\n    int right, bottom;\n    int x, y;\n\n    frameId = GetEasyChatScreenFrameId();\n    CpuFastFill(0, tilemap, BG_SCREEN_SIZE);\n    if (frameId == 2)\n    {\n        right = sPhraseFrameDimensions[frameId].left + sPhraseFrameDimensions[frameId].width;\n        bottom = sPhraseFrameDimensions[frameId].top + sPhraseFrameDimensions[frameId].height;\n        for (y = sPhraseFrameDimensions[frameId].top; y < bottom; y++)\n        {\n            x = sPhraseFrameDimensions[frameId].left - 1;\n            tilemap[y * 32 + x] = 0x1005;\n            x++;\n            for (; x < right; x++)\n                tilemap[y * 32 + x] = 0x1000;\n\n            tilemap[y* 32 + x] = 0x1007;\n        }\n    }\n    else\n    {\n        y = sPhraseFrameDimensions[frameId].top - 1;\n        x = sPhraseFrameDimensions[frameId].left - 1;\n        right = sPhraseFrameDimensions[frameId].left + sPhraseFrameDimensions[frameId].width;\n        bottom = sPhraseFrameDimensions[frameId].top + sPhraseFrameDimensions[frameId].height;\n        tilemap[y * 32 + x] = 0x1001;\n        x++;\n        for (; x < right; x++)\n            tilemap[y * 32 + x] = 0x1002;\n\n        tilemap[y * 32 + x] = 0x1003;\n        y++;\n        for (; y < bottom; y++)\n        {\n            x = sPhraseFrameDimensions[frameId].left - 1;\n            tilemap[y * 32 + x] = 0x1005;\n            x++;\n            for (; x < right; x++)\n                tilemap[y * 32 + x] = 0x1000;\n\n            tilemap[y* 32 + x] = 0x1007;\n        }\n\n        x = sPhraseFrameDimensions[frameId].left - 1;\n        tilemap[y * 32 + x] = 0x1009;\n        x++;\n        for (; x < right; x++)\n            tilemap[y * 32 + x] = 0x100A;\n\n        tilemap[y * 32 + x] = 0x100B;\n    }\n}\n\nstatic void PutWin2TilemapAndCopyToVram(void)\n{\n    PutWindowTilemap(2);\n    CopyBgTilemapBufferToVram(2);\n}\n\nstatic void PrintECMenuById(u32 id)\n{\n    InitBg2Scroll();\n    FillWindowPixelBuffer(2, PIXEL_FILL(1));\n    switch (id)\n    {\n    case 0:\n        PrintECGroupsMenu();\n        break;\n    case 1:\n        PrintEasyChatKeyboardText();\n        break;\n    case 2:\n        PrintECWordsMenu();\n        break;\n    }\n\n    CopyWindowToVram(2, COPYWIN_GFX);\n}\n\nstatic void PrintECGroupOrAlphaMenu(void)\n{\n    if (!IsEasyChatAlphaMode())\n        PrintECMenuById(0);\n    else\n        PrintECMenuById(1);\n}\n\nstatic void PrintECGroupsMenu(void)\n{\n    int i;\n    int x, y;\n\n    i = 0;\n    y = 96;\n    while (1)\n    {\n        for (x = 0; x < 2; x++)\n        {\n            u8 groupId = GetSelectedGroupByIndex(i++);\n            if (groupId == EC_NUM_GROUPS)\n            {\n                ScheduleBg2VerticalScroll(GetECSelectGroupRowsAbove(), 0);\n                return;\n            }\n\n            EC_AddTextPrinterParameterized(2, FONT_NORMAL_COPY_1, GetEasyChatWordGroupName(groupId), x * 84 + 10, y, TEXT_SKIP_DRAW, NULL);\n        }\n\n        y += 16;\n    }\n}\n\nstatic void PrintEasyChatKeyboardText(void)\n{\n    u32 i;\n\n    for (i = 0; i < ARRAY_COUNT(sEasyChatKeyboardAlphabet); i++)\n        EC_AddTextPrinterParameterized(2, FONT_NORMAL_COPY_1, sEasyChatKeyboardAlphabet[i], 10, 96 + i * 16, TEXT_SKIP_DRAW, NULL);\n}\n\nstatic void PrintECWordsMenu(void)\n{\n    PrintECRowsWin2(0, 4);\n}\n\nstatic void UpdateWin2PrintWordsScrollDown(void)\n{\n    u8 rowsAbove = GetECSelectWordRowsAbove() + 3;\n    ClearECRowsWin2(rowsAbove, 1);\n    PrintECRowsWin2(rowsAbove, 1);\n}\n\nstatic void UpdateWin2PrintWordsScrollUp(void)\n{\n    u8 rowsAbove = GetECSelectWordRowsAbove();\n    ClearECRowsWin2(rowsAbove, 1);\n    PrintECRowsWin2(rowsAbove, 1);\n}\n\nstatic void UpdateWin2PrintWordsScrollPageDown(void)\n{\n    u8 row = GetECSelectWordRowsAbove();\n    u8 maxrow = row + 4;\n    u8 numrowsplus1 = GetECSelectWordNumRows() + 1;\n    if (maxrow > numrowsplus1)\n        maxrow = numrowsplus1;\n\n    if (row < maxrow)\n    {\n        u8 remrow = maxrow - row;\n        ClearECRowsWin2(row, remrow);\n        PrintECRowsWin2(row, remrow);\n    }\n}\n\nstatic void UpdateWin2PrintWordsScrollPageUp(void)\n{\n    u8 row = GetECSelectWordRowsAbove();\n    u8 maxrow = GetBg2ScrollRow();\n    if (row < maxrow)\n    {\n        u8 remrow = maxrow - row;\n        ClearECRowsWin2(row, remrow);\n        PrintECRowsWin2(row, remrow);\n    }\n}\n\nstatic void PrintECRowsWin2(u8 row, u8 remrow)\n{\n    int i, j;\n    u16 easyChatWord;\n    u8 *str;\n    int y;\n    u8 y_;\n    int ecWordIdx;\n\n    ecWordIdx = row * 2;\n    y = (row * 16 + 96) & 0xFF;\n\n    for (i = 0; i < remrow; i++)\n    {\n        for (j = 0; j < 2; j++)\n        {\n            // FIXME: Dumb trick needed to match\n            y_ = y << 18 >> 18;\n            easyChatWord = GetDisplayedWordByIndex(ecWordIdx++);\n            if (easyChatWord != 0xFFFF)\n            {\n\n                CopyEasyChatWordPadded(sEasyChatGraphicsResources->ecPaddedWordBuffer, easyChatWord, 0);\n\n                EC_AddTextPrinterParameterized(2, FONT_NORMAL_COPY_1, sEasyChatGraphicsResources->ecPaddedWordBuffer, (j * 13 + 3) * 8, y_, TEXT_SKIP_DRAW, NULL);\n            }\n        }\n        y += 16;\n\n    }\n\n    CopyWindowToVram(2, COPYWIN_GFX);\n}\n\nstatic void ClearECRowsWin2(u8 row, u8 remrow)\n{\n    int y;\n    int totalHeight;\n    int heightWrappedAround;\n    int heightToBottom;\n\n    y = (row * 16 + 96) & 0xFF;\n    heightToBottom = remrow * 16;\n    totalHeight = y + heightToBottom;\n    if (totalHeight > 255)\n    {\n        heightWrappedAround = totalHeight - 256;\n        heightToBottom = 256 - y;\n    }\n    else\n    {\n        heightWrappedAround = 0;\n    }\n\n    FillWindowPixelRect(2, PIXEL_FILL(1), 0, y, 224, heightToBottom);\n    if (heightWrappedAround)\n        FillWindowPixelRect(2, PIXEL_FILL(1), 0, 0, 224, heightWrappedAround);\n}\n\nstatic void ClearWin2AndCopyToVram(void)\n{\n    FillWindowPixelBuffer(2, PIXEL_FILL(1));\n    CopyWindowToVram(2, COPYWIN_GFX);\n}\n\nstatic void StartWin2FrameAnim(int animNo)\n{\n    switch (animNo)\n    {\n    case 0:\n        sEasyChatGraphicsResources->frameAnimIdx = 0;\n        sEasyChatGraphicsResources->frameAnimTarget = 10;\n        break;\n    case 1:\n        sEasyChatGraphicsResources->frameAnimIdx = 9;\n        sEasyChatGraphicsResources->frameAnimTarget = 0;\n        break;\n    case 2:\n        sEasyChatGraphicsResources->frameAnimIdx = 11;\n        sEasyChatGraphicsResources->frameAnimTarget = 17;\n        break;\n    case 3:\n        sEasyChatGraphicsResources->frameAnimIdx = 17;\n        sEasyChatGraphicsResources->frameAnimTarget = 0;\n        break;\n    case 4:\n        sEasyChatGraphicsResources->frameAnimIdx = 17;\n        sEasyChatGraphicsResources->frameAnimTarget = 10;\n        break;\n    case 5:\n        sEasyChatGraphicsResources->frameAnimIdx = 18;\n        sEasyChatGraphicsResources->frameAnimTarget = 22;\n        break;\n    case 6:\n        sEasyChatGraphicsResources->frameAnimIdx = 22;\n        sEasyChatGraphicsResources->frameAnimTarget = 18;\n        break;\n    }\n\n    sEasyChatGraphicsResources->frameAnimDelta = sEasyChatGraphicsResources->frameAnimIdx < sEasyChatGraphicsResources->frameAnimTarget ? 1 : -1;\n}\n\nstatic bool8 AnimateFrameResize(void)\n{\n    if (sEasyChatGraphicsResources->frameAnimIdx == sEasyChatGraphicsResources->frameAnimTarget)\n        return FALSE;\n\n    sEasyChatGraphicsResources->frameAnimIdx += sEasyChatGraphicsResources->frameAnimDelta;\n    RedrawFrameByIndex(sEasyChatGraphicsResources->frameAnimIdx);\n    return sEasyChatGraphicsResources->frameAnimIdx != sEasyChatGraphicsResources->frameAnimTarget;\n}\n\nstatic void RedrawFrameByIndex(u8 direction)\n{\n    FillBgTilemapBufferRect_Palette0(1, 0, 0, 10, 30, 10);\n    switch (direction)\n    {\n    case 0:\n        break;\n    case 1:\n        RedrawFrameByRect(11, 14, 3, 2);\n        break;\n    case 2:\n        RedrawFrameByRect(9, 14, 7, 2);\n        break;\n    case 3:\n        RedrawFrameByRect(7, 14, 11, 2);\n        break;\n    case 4:\n        RedrawFrameByRect(5, 14, 15, 2);\n        break;\n    case 5:\n        RedrawFrameByRect(3, 14, 19, 2);\n        break;\n    case 6:\n        RedrawFrameByRect(1, 14, 23, 2);\n        break;\n    case 7:\n        RedrawFrameByRect(1, 13, 23, 4);\n        break;\n    case 8:\n        RedrawFrameByRect(1, 12, 23, 6);\n        break;\n    case 9:\n        RedrawFrameByRect(1, 11, 23, 8);\n        break;\n    case 10:\n        RedrawFrameByRect(1, 10, 23, 10);\n        break;\n    case 11:\n        RedrawFrameByRect(1, 10, 24, 10);\n        break;\n    case 12:\n        RedrawFrameByRect(1, 10, 25, 10);\n        break;\n    case 13:\n        RedrawFrameByRect(1, 10, 26, 10);\n        break;\n    case 14:\n        RedrawFrameByRect(1, 10, 27, 10);\n        break;\n    case 15:\n        RedrawFrameByRect(1, 10, 28, 10);\n        break;\n    case 16:\n        RedrawFrameByRect(1, 10, 29, 10);\n        break;\n    case 17:\n        RedrawFrameByRect(0, 10, 30, 10);\n        break;\n    case 18:\n        RedrawFrameByRect(1, 10, 23, 10);\n        break;\n    case 19:\n        RedrawFrameByRect(1, 11, 23, 8);\n        break;\n    case 20:\n        RedrawFrameByRect(1, 12, 23, 6);\n        break;\n    case 21:\n        RedrawFrameByRect(1, 13, 23, 4);\n        break;\n    case 22:\n        RedrawFrameByRect(1, 14, 23, 2);\n        break;\n    }\n\n    CopyBgTilemapBufferToVram(1);\n}\n\nstatic void RedrawFrameByRect(int left, int top, int width, int height)\n{\n    u16 *tilemap;\n    int right;\n    int bottom;\n    int x, y;\n\n    tilemap = sEasyChatGraphicsResources->bg1TilemapBuffer;\n    right = left + width - 1;\n    bottom = top + height - 1;\n    x = left;\n    y = top;\n    tilemap[y * 32 + x] = 0x4001;\n    x++;\n    for (; x < right; x++)\n        tilemap[y * 32 + x] = 0x4002;\n\n    tilemap[y * 32 + x] = 0x4003;\n    y++;\n    for (; y < bottom; y++)\n    {\n        tilemap[y * 32 + left] = 0x4005;\n        x = left + 1;\n        for (; x < right; x++)\n            tilemap[y * 32 + x] = 0x4000;\n\n        tilemap[y * 32 + x] = 0x4007;\n    }\n\n    tilemap[y * 32 + left] = 0x4009;\n    x = left + 1;\n    for (; x < right; x++)\n        tilemap[y * 32 + x] = 0x400A;\n\n    tilemap[y * 32 + x] = 0x400B;\n    SetRegWin0Coords((left + 1) * 8, (top + 1) * 8, (width - 2) * 8, (height - 2) * 8);\n}\n\nstatic void InitBg2Scroll(void)\n{\n    ChangeBgY(2, 0x800, 0);\n    sEasyChatGraphicsResources->bg2ScrollRow = 0;\n}\n\nstatic void ScheduleBg2VerticalScroll(s16 direction, u8 speed)\n{\n    int bgY;\n    s16 totalDelta;\n\n    bgY = GetBgY(2);\n    sEasyChatGraphicsResources->bg2ScrollRow += direction;\n    totalDelta = direction * 16;\n    bgY += totalDelta << 8;\n    if (speed)\n    {\n        sEasyChatGraphicsResources->tgtBgY = bgY;\n        sEasyChatGraphicsResources->deltaBgY = speed * 256;\n        if (totalDelta < 0)\n            sEasyChatGraphicsResources->deltaBgY = -sEasyChatGraphicsResources->deltaBgY;\n    }\n    else\n    {\n        ChangeBgY(2, bgY, 0);\n    }\n}\n\nstatic bool8 AnimateBg2VerticalScroll(void)\n{\n    int bgY;\n\n    bgY = GetBgY(2);\n    if (bgY == sEasyChatGraphicsResources->tgtBgY)\n    {\n        return FALSE;\n    }\n    else\n    {\n        ChangeBgY(2, sEasyChatGraphicsResources->deltaBgY, 1);\n        return TRUE;\n    }\n}\n\nstatic int GetBg2ScrollRow(void)\n{\n    return sEasyChatGraphicsResources->bg2ScrollRow;\n}\n\nstatic void SetRegWin0Coords(u8 left, u8 top, u8 width, u8 height)\n{\n    u16 horizontalDimensions = WIN_RANGE(left, left + width);\n    u16 verticalDimensions = WIN_RANGE(top, top + height);\n    SetGpuReg(REG_OFFSET_WIN0H, horizontalDimensions);\n    SetGpuReg(REG_OFFSET_WIN0V, verticalDimensions);\n}\n\nstatic void LoadSpriteGfx(void)\n{\n    u32 i;\n\n    LoadSpriteSheets(sEasyChatSpriteSheets);\n    LoadSpritePalettes(sEasyChatSpritePalettes);\n    for (i = 0; i < NELEMS(sEasyChatCompressedSpriteSheets); i++)\n        LoadCompressedSpriteSheet(&sEasyChatCompressedSpriteSheets[i]);\n}\n\nstatic void CreateSelectDestFieldCursorSprite(void)\n{\n    u8 frameId = GetEasyChatScreenFrameId();\n    s16 x = sPhraseFrameDimensions[frameId].left * 8 + 13;\n    s16 y = (sPhraseFrameDimensions[frameId].top + 1) * 8 + 1;\n    u8 spriteId = CreateSprite(&sSpriteTemplate_TriangleCursor, x, y, 2);\n    sEasyChatGraphicsResources->selectDestFieldCursorSprite = &gSprites[spriteId];\n    gSprites[spriteId].data[1] = 1;\n}\n\nstatic void SpriteCB_BounceCursor(struct Sprite *sprite)\n{\n    if (sprite->data[1])\n    {\n        if (++sprite->data[0] > 2)\n        {\n            sprite->data[0] = 0;\n            if (++sprite->x2 > 0)\n                sprite->x2 = -6;\n        }\n    }\n}\n\nstatic void SetSelectDestFieldCursorSpritePosAndResetAnim(u8 x, u8 y)\n{\n    sEasyChatGraphicsResources->selectDestFieldCursorSprite->x = x;\n    sEasyChatGraphicsResources->selectDestFieldCursorSprite->y = y;\n    sEasyChatGraphicsResources->selectDestFieldCursorSprite->x2 = 0;\n    sEasyChatGraphicsResources->selectDestFieldCursorSprite->data[0] = 0;\n}\n\nstatic void FreezeSelectDestFieldCursorSprite(void)\n{\n    sEasyChatGraphicsResources->selectDestFieldCursorSprite->data[0] = 0;\n    sEasyChatGraphicsResources->selectDestFieldCursorSprite->data[1] = 0;\n    sEasyChatGraphicsResources->selectDestFieldCursorSprite->x2 = 0;\n}\n\nstatic void UnfreezeSelectDestFieldCursorSprite(void)\n{\n    sEasyChatGraphicsResources->selectDestFieldCursorSprite->data[1] = 1;\n}\n\nstatic void CreateRedRectangularCursorSpritePair(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_RectangleCursor, 0, 0, 3);\n    sEasyChatGraphicsResources->rectCursorSpriteRight = &gSprites[spriteId];\n    sEasyChatGraphicsResources->rectCursorSpriteRight->x2 = 32;\n\n    spriteId = CreateSprite(&sSpriteTemplate_RectangleCursor, 0, 0, 3);\n    sEasyChatGraphicsResources->rectCursorSpriteLeft = &gSprites[spriteId];\n    sEasyChatGraphicsResources->rectCursorSpriteLeft->x2 = -32;\n\n    sEasyChatGraphicsResources->rectCursorSpriteRight->hFlip = TRUE;\n    EC_MoveCursor();\n}\n\nstatic void DestroyRedRectangularCursor(void)\n{\n    DestroySprite(sEasyChatGraphicsResources->rectCursorSpriteRight);\n    sEasyChatGraphicsResources->rectCursorSpriteRight = NULL;\n    DestroySprite(sEasyChatGraphicsResources->rectCursorSpriteLeft);\n    sEasyChatGraphicsResources->rectCursorSpriteLeft = NULL;\n}\n\nstatic void EC_MoveCursor(void)\n{\n    u8 x;\n    u8 y;\n\n    if (sEasyChatGraphicsResources->rectCursorSpriteRight && sEasyChatGraphicsResources->rectCursorSpriteLeft)\n    {\n        GetECSelectGroupCursorCoords(&x, &y);\n        if (!IsEasyChatAlphaMode())\n            MoveCursor_Group(x, y);\n        else\n            MoveCursor_Alpha(x, y);\n    }\n}\n\nstatic void MoveCursor_Group(s8 x, s8 y)\n{\n    if (x != -1)\n    {\n        StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteRight, RECTCURSOR_ANIM_ON_GROUP);\n        sEasyChatGraphicsResources->rectCursorSpriteRight->x = x * 84 + 58;\n        sEasyChatGraphicsResources->rectCursorSpriteRight->y = y * 16 + 96;\n\n        StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteLeft, RECTCURSOR_ANIM_ON_GROUP);\n        sEasyChatGraphicsResources->rectCursorSpriteLeft->x = x * 84 + 58;\n        sEasyChatGraphicsResources->rectCursorSpriteLeft->y = y * 16 + 96;\n    }\n    else\n    {\n        StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteRight, RECTCURSOR_ANIM_ON_BUTTON);\n        sEasyChatGraphicsResources->rectCursorSpriteRight->x = 216;\n        sEasyChatGraphicsResources->rectCursorSpriteRight->y = y * 16 + 112;\n\n        StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteLeft, RECTCURSOR_ANIM_ON_BUTTON);\n        sEasyChatGraphicsResources->rectCursorSpriteLeft->x = 216;\n        sEasyChatGraphicsResources->rectCursorSpriteLeft->y = y * 16 + 112;\n    }\n}\n\nstatic void MoveCursor_Alpha(s8 cursorX, s8 cursorY)\n{\n    int anim;\n    int x, y;\n\n    if (cursorX != -1)\n    {\n        y = cursorY * 16 + 96;\n        x = 32;\n        if (cursorX == 6 && cursorY == 0)\n        {\n            x = 157;\n            anim = RECTCURSOR_ANIM_ON_OTHERS;\n        }\n        else\n        {\n            x += sAlphabetKeyboardColumnOffsets[cursorX < ARRAY_COUNT(sAlphabetKeyboardColumnOffsets) ? cursorX : 0];\n            anim = RECTCURSOR_ANIM_ON_LETTER;\n        }\n\n        StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteRight, anim);\n        sEasyChatGraphicsResources->rectCursorSpriteRight->x = x;\n        sEasyChatGraphicsResources->rectCursorSpriteRight->y = y;\n\n        StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteLeft, anim);\n        sEasyChatGraphicsResources->rectCursorSpriteLeft->x = x;\n        sEasyChatGraphicsResources->rectCursorSpriteLeft->y = y;\n    }\n    else\n    {\n        StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteRight, RECTCURSOR_ANIM_ON_BUTTON);\n        sEasyChatGraphicsResources->rectCursorSpriteRight->x = 216;\n        sEasyChatGraphicsResources->rectCursorSpriteRight->y = cursorY * 16 + 112;\n\n        StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteLeft, RECTCURSOR_ANIM_ON_BUTTON);\n        sEasyChatGraphicsResources->rectCursorSpriteLeft->x = 216;\n        sEasyChatGraphicsResources->rectCursorSpriteLeft->y = cursorY * 16 + 112;\n    }\n}\n\nstatic void CreateSelectWordCursorSprite(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_TriangleCursor, 0, 0, 4);\n    sEasyChatGraphicsResources->selectWordCursorSprite = &gSprites[spriteId];\n    sEasyChatGraphicsResources->selectWordCursorSprite->callback = SpriteCB_SelectWordCursorSprite;\n    sEasyChatGraphicsResources->selectWordCursorSprite->oam.priority = 2;\n    SetSelectWordCursorSpritePos();\n}\n\nstatic void SpriteCB_SelectWordCursorSprite(struct Sprite *sprite)\n{\n    if (++sprite->data[0] > 2)\n    {\n        sprite->data[0] = 0;\n        if (++sprite->x2 > 0)\n            sprite->x2 = -6;\n    }\n}\n\nstatic void SetSelectWordCursorSpritePos(void)\n{\n    s8 cursorX, cursorY;\n    u8 x, y;\n\n    GetECSelectWordCursorCoords(&cursorX, &cursorY);\n    x = cursorX * 13 + 3;\n    y = cursorY * 2 + 11;\n    SetSelectWordCursorSpritePosExplicit(x, y);\n}\n\nstatic void SetSelectWordCursorSpritePosExplicit(u8 x, u8 y)\n{\n    if (sEasyChatGraphicsResources->selectWordCursorSprite)\n    {\n        sEasyChatGraphicsResources->selectWordCursorSprite->x = x * 8 + 4;\n        sEasyChatGraphicsResources->selectWordCursorSprite->y = (y + 1) * 8 + 1;\n        sEasyChatGraphicsResources->selectWordCursorSprite->x2 = 0;\n        sEasyChatGraphicsResources->selectWordCursorSprite->data[0] = 0;\n    }\n}\n\nstatic void DestroySelectWordCursorSprite(void)\n{\n    if (sEasyChatGraphicsResources->selectWordCursorSprite)\n    {\n        DestroySprite(sEasyChatGraphicsResources->selectWordCursorSprite);\n        sEasyChatGraphicsResources->selectWordCursorSprite = NULL;\n    }\n}\n\nstatic void CreateSelectGroupHelpSprite(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_ButtonWindow, 208, 128, 6);\n    sEasyChatGraphicsResources->selectGroupHelpSprite = &gSprites[spriteId];\n    sEasyChatGraphicsResources->selectGroupHelpSprite->x2 = -64;\n\n    spriteId = CreateSprite(&sSpriteTemplate_ModeWindow, 208, 80, 5);\n    sEasyChatGraphicsResources->modeIconsSprite = &gSprites[spriteId];\n    sEasyChatGraphicsResources->modeIconState = 0;\n}\n\nstatic bool8 AnimateSeletGroupModeAndHelpSpriteEnter(void)\n{\n    switch (sEasyChatGraphicsResources->modeIconState)\n    {\n    default:\n        return FALSE;\n    case 0:\n        sEasyChatGraphicsResources->selectGroupHelpSprite->x2 += 8;\n        if (sEasyChatGraphicsResources->selectGroupHelpSprite->x2 >= 0)\n        {\n            sEasyChatGraphicsResources->selectGroupHelpSprite->x2 = 0;\n            if (!IsEasyChatAlphaMode())\n                StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, MODEWINDOW_ANIM_TO_GROUP);\n            else\n                StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, MODEWINDOW_ANIM_TO_ALPHABET);\n\n            sEasyChatGraphicsResources->modeIconState++;\n        }\n        break;\n    case 1:\n        if (sEasyChatGraphicsResources->modeIconsSprite->animEnded)\n        {\n            sEasyChatGraphicsResources->modeIconState = 2;\n            return FALSE;\n        }\n    }\n\n    return TRUE;\n}\n\nstatic void StartModeIconHidingAnimation(void)\n{\n    sEasyChatGraphicsResources->modeIconState = 0;\n    StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, MODEWINDOW_ANIM_TO_HIDDEN);\n}\n\nstatic bool8 RunModeIconHidingAnimation(void)\n{\n    switch (sEasyChatGraphicsResources->modeIconState)\n    {\n    default:\n        return FALSE;\n    case 0:\n        if (sEasyChatGraphicsResources->modeIconsSprite->animEnded)\n            sEasyChatGraphicsResources->modeIconState = 1;\n        break;\n    case 1:\n        sEasyChatGraphicsResources->selectGroupHelpSprite->x2 -= 8;\n        if (sEasyChatGraphicsResources->selectGroupHelpSprite->x2 <= -64)\n        {\n            DestroySprite(sEasyChatGraphicsResources->modeIconsSprite);\n            DestroySprite(sEasyChatGraphicsResources->selectGroupHelpSprite);\n            sEasyChatGraphicsResources->modeIconsSprite = NULL;\n            sEasyChatGraphicsResources->selectGroupHelpSprite = NULL;\n            sEasyChatGraphicsResources->modeIconState++;\n            return FALSE;\n        }\n    }\n\n    return TRUE;\n}\n\nstatic void ShrinkModeIconsSprite(void)\n{\n    StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, MODEWINDOW_ANIM_TRANSITION);\n}\n\nstatic void ShowModeIconsSprite(void)\n{\n    if (!IsEasyChatAlphaMode())\n        StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, MODEWINDOW_ANIM_TO_GROUP);\n    else\n        StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, MODEWINDOW_ANIM_TO_ALPHABET);\n}\n\nstatic bool8 ModeIconsSpriteAnimIsEnded(void)\n{\n    return !sEasyChatGraphicsResources->modeIconsSprite->animEnded;\n}\n\nstatic void CreateVerticalScrollArrowSprites(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_ScrollIndicator, 96, 80, 0);\n    if (spriteId != MAX_SPRITES)\n        sEasyChatGraphicsResources->upTriangleCursorSprite = &gSprites[spriteId];\n\n    spriteId = CreateSprite(&sSpriteTemplate_ScrollIndicator, 96, 156, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sEasyChatGraphicsResources->downTriangleCursorSprite = &gSprites[spriteId];\n        sEasyChatGraphicsResources->downTriangleCursorSprite->vFlip = TRUE;\n    }\n\n    HideVerticalScrollArrowSprites();\n}\n\nstatic void UpdateVerticalScrollArrowVisibility(void)\n{\n    sEasyChatGraphicsResources->upTriangleCursorSprite->invisible = !ShouldDrawECUpArrow();\n    sEasyChatGraphicsResources->downTriangleCursorSprite->invisible = !ShouldDrawECDownArrow();\n}\n\nstatic void HideVerticalScrollArrowSprites(void)\n{\n    sEasyChatGraphicsResources->upTriangleCursorSprite->invisible = TRUE;\n    sEasyChatGraphicsResources->downTriangleCursorSprite->invisible = TRUE;\n}\n\nstatic void UpdateVerticalScrollArrowSpriteXPos(int direction)\n{\n    if (!direction)\n    {\n        // Group select\n        sEasyChatGraphicsResources->upTriangleCursorSprite->x = 96;\n        sEasyChatGraphicsResources->downTriangleCursorSprite->x = 96;\n    }\n    else\n    {\n        // Word select\n        sEasyChatGraphicsResources->upTriangleCursorSprite->x = 120;\n        sEasyChatGraphicsResources->downTriangleCursorSprite->x = 120;\n    }\n}\n\nstatic void CreateStartSelectButtonsSprites(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_StartSelectButtons, 220, 84, 1);\n    if (spriteId != MAX_SPRITES)\n        sEasyChatGraphicsResources->startPgUpButtonSprite = &gSprites[spriteId];\n\n    spriteId = CreateSprite(&sSpriteTemplate_StartSelectButtons, 220, 156, 1);\n    if (spriteId != MAX_SPRITES)\n    {\n        sEasyChatGraphicsResources->selectPgDnButtonSprite = &gSprites[spriteId];\n        StartSpriteAnim(sEasyChatGraphicsResources->selectPgDnButtonSprite, 1);\n    }\n\n    HideStartSelectButtonSprites();\n}\n\nstatic void UpdateStartSelectButtonSpriteVisibility(void)\n{\n    sEasyChatGraphicsResources->startPgUpButtonSprite->invisible = !ShouldDrawECUpArrow();\n    sEasyChatGraphicsResources->selectPgDnButtonSprite->invisible = !ShouldDrawECDownArrow();\n}\n\nstatic void HideStartSelectButtonSprites(void)\n{\n    sEasyChatGraphicsResources->startPgUpButtonSprite->invisible = TRUE;\n    sEasyChatGraphicsResources->selectPgDnButtonSprite->invisible = TRUE;\n}\n\nstatic void CreateFooterWindow(void)\n{\n    u16 windowId;\n    struct WindowTemplate template;\n    template.bg = 3;\n    template.tilemapLeft = 4;\n    template.tilemapTop = 11;\n    template.width = 24;\n    template.height = 2;\n    template.paletteNum = 11;\n    template.baseBlock = 0x030;\n    windowId = AddWindow(&template);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    EC_AddTextPrinterParameterized(windowId, FONT_NORMAL_COPY_1, gText_DelAllCancelOk, 0, 0, 0, NULL);\n    PutWindowTilemap(windowId);\n}\n"
  },
  {
    "path": "src/ereader_helpers.c",
    "content": "#include \"global.h\"\n#include \"link.h\"\n#include \"ereader_helpers.h\"\n\nstruct SendRecvMgr\n{\n    u8 master_slave;       // 0: clock slave; 1: clock master\n    u8 state;              // EREADER_XFR_STATE_*\n    u8 xferState;          // EREADER_XFER_*\n    u8 checksumResult;     // EREADER_CHECKSUM_*\n    u8 cancellationReason; // EREADER_CANCEL_*\n    u32 * dataptr;         // Payload source or destination\n    int cursor;            // Index of the next word\n    int size;              // Last word index\n    u32 checksum;          // Validation checksum\n};\n\nstatic bool16 DetermineSendRecvState(u8);\nstatic void SetUpTransferManager(size_t, const void *, void *);\nstatic void StartTm3(void);\nstatic void EnableSio(void);\nstatic void DisableTm3(void);\nstatic void GetKeyInput(void);\n\nstatic struct SendRecvMgr sSendRecvMgr;\nstatic u16 sJoyNewOrRepeated;\nstatic u16 sJoyNew;\nstatic u16 sSendRecvStatus;\nstatic u16 sCounter1;\nstatic u32 sCounter2;\nstatic u16 sSavedIme;\nstatic u16 sSavedIe;\nstatic u16 sSavedTm3Cnt;\nstatic u16 sSavedSioCnt;\nstatic u16 sSavedRCnt;\n\nint EReader_Send(size_t size, const void *src)\n{\n    int result;\n    EReaderHelper_SaveRegsState();\n\n    while (1)\n    {\n        GetKeyInput();\n        if (TEST_BUTTON(sJoyNew, B_BUTTON))\n            gShouldAdvanceLinkState = 2;\n\n        sSendRecvStatus = EReaderHandleTransfer(1, size, src, NULL);\n        if ((sSendRecvStatus & 0x13) == 0x10) // checksum OK and xfer off\n        {\n            result = 0;\n            break;\n        }\n        else if (sSendRecvStatus & 8) // cancelled by player\n        {\n            result = 1;\n            break;\n        }\n        else if (sSendRecvStatus & 4) // timed out\n        {\n            result = 2;\n            break;\n        }\n        else\n        {\n            gShouldAdvanceLinkState = 0;\n            VBlankIntrWait();\n        }\n    }\n\n    CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));\n    EReaderHelper_RestoreRegsState();\n    return result;\n}\n\nint EReader_Recv(void *dest)\n{\n    int result;\n    EReaderHelper_SaveRegsState();\n\n    while (1)\n    {\n        GetKeyInput();\n        if (TEST_BUTTON(sJoyNew, B_BUTTON))\n            gShouldAdvanceLinkState = 2;\n\n        sSendRecvStatus = EReaderHandleTransfer(0, 0, NULL, dest);\n        if ((sSendRecvStatus & 0x13) == 0x10) // checksum OK and xfer off\n        {\n            result = 0;\n            break;\n        }\n        else if (sSendRecvStatus & 8) // cancelled by player\n        {\n            result = 1;\n            break;\n        }\n        else if (sSendRecvStatus & 4) // timed out\n        {\n            result = 2;\n            break;\n        }\n        else\n        {\n            gShouldAdvanceLinkState = 0;\n            VBlankIntrWait();\n        }\n    }\n\n    CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));\n    EReaderHelper_RestoreRegsState();\n    return result;\n}\n\nstatic void CloseSerial(void)\n{\n    REG_IME = 0;\n    REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);\n    REG_IME = 1;\n    REG_SIOCNT = 0;\n    REG_TM3CNT_H = 0;\n    REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL;\n}\n\nstatic void OpenSerialMulti(void)\n{\n    REG_IME = 0;\n    REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);\n    REG_IME = 1;\n    REG_RCNT = 0;\n    REG_SIOCNT = SIO_MULTI_MODE;\n    REG_SIOCNT |= SIO_INTR_ENABLE | SIO_115200_BPS;\n    REG_IME = 0;\n    REG_IE |= INTR_FLAG_SERIAL;\n    REG_IME = 1;\n    if (sSendRecvMgr.state == 0)\n        CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));\n}\n\nstatic void OpenSerial32(void)\n{\n    REG_RCNT = 0;\n    REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE;\n    REG_SIOCNT |= SIO_MULTI_SD;\n    gShouldAdvanceLinkState = 0;\n    sCounter1 = 0;\n    sCounter2 = 0;\n}\n\nu16 EReaderHandleTransfer(u8 mode, size_t size, const void *data, void *recvBuffer)\n{\n    switch (sSendRecvMgr.state)\n    {\n    case EREADER_XFR_STATE_INIT:\n        OpenSerialMulti();\n        sSendRecvMgr.xferState = EREADER_XFER_EXE;\n        sSendRecvMgr.state = EREADER_XFR_STATE_HANDSHAKE;\n        break;\n    case EREADER_XFR_STATE_HANDSHAKE:\n        if (DetermineSendRecvState(mode))\n            EnableSio();\n        if (gShouldAdvanceLinkState == 2)\n        {\n            sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY;\n            sSendRecvMgr.state = EREADER_XFR_STATE_DONE;\n        }\n        // Progression is handled by the serial callback\n        break;\n    case EREADER_XFR_STATE_START:\n        OpenSerial32();\n        SetUpTransferManager(size, data, recvBuffer);\n        sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER;\n        // fallthrough\n    case EREADER_XFR_STATE_TRANSFER:\n        if (gShouldAdvanceLinkState == 2)\n        {\n            sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY;\n            sSendRecvMgr.state = EREADER_XFR_STATE_DONE;\n        }\n        else\n        {\n            sCounter1++;\n            sCounter2++;\n            if (sSendRecvMgr.master_slave == 0 && sCounter2 > 60)\n            {\n                sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT;\n                sSendRecvMgr.state = EREADER_XFR_STATE_DONE;\n            }\n            if (sSendRecvMgr.xferState != EREADER_XFER_CHK)\n            {\n                if (sSendRecvMgr.master_slave != 0 && sCounter1 > 2)\n                {\n                    EnableSio();\n                    sSendRecvMgr.xferState = EREADER_XFER_CHK;\n                }\n                else\n                {\n                    EnableSio();\n                    sSendRecvMgr.xferState = EREADER_XFER_CHK;\n                }\n            }\n        }\n        // Progression is handled by the serial callback\n        break;\n    case EREADER_XFR_STATE_TRANSFER_DONE:\n        OpenSerialMulti();\n        sSendRecvMgr.state = EREADER_XFR_STATE_CHECKSUM;\n        break;\n    case EREADER_XFR_STATE_CHECKSUM:\n        if (sSendRecvMgr.master_slave == 1 && sCounter1 > 2)\n            EnableSio();\n        if (++sCounter1 > 60)\n        {\n            sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT;\n            sSendRecvMgr.state = EREADER_XFR_STATE_DONE;\n        }\n        break;\n        // Progression is handled by the serial callback\n    case EREADER_XFR_STATE_DONE:\n        if (sSendRecvMgr.xferState != 0)\n        {\n            CloseSerial();\n            sSendRecvMgr.xferState = 0;\n        }\n        break;\n    }\n    return\n        (sSendRecvMgr.xferState << EREADER_XFER_SHIFT)\n      | (sSendRecvMgr.cancellationReason << EREADER_CANCEL_SHIFT)\n      | (sSendRecvMgr.checksumResult << EREADER_CHECKSUM_SHIFT);\n}\n\nstatic bool16 DetermineSendRecvState(u8 mode)\n{\n    bool16 resp;\n    if ((*(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SI | SIO_MULTI_SD)) == SIO_MULTI_SD && mode)\n        resp = sSendRecvMgr.master_slave = TRUE;\n    else\n        resp = sSendRecvMgr.master_slave = FALSE;\n    return resp;\n}\n\nstatic void SetUpTransferManager(size_t size, const void *data, void *recvBuffer)\n{\n    if (sSendRecvMgr.master_slave)\n    {\n        REG_SIOCNT |= SIO_38400_BPS;\n        sSendRecvMgr.dataptr = (void *)data;\n        REG_SIODATA32 = size;\n        sSendRecvMgr.size = size / 4 + 1;\n        StartTm3();\n    }\n    else\n    {\n        REG_SIOCNT |= SIO_9600_BPS;\n        sSendRecvMgr.dataptr = recvBuffer;\n    }\n}\n\nstatic void StartTm3(void)\n{\n    REG_TM3CNT_L = -601;\n    REG_TM3CNT_H = TIMER_INTR_ENABLE;\n    REG_IME = 0;\n    REG_IE |= INTR_FLAG_TIMER3;\n    REG_IME = 1;\n}\n\nvoid EReaderHelper_Timer3Callback(void)\n{\n    DisableTm3();\n    EnableSio();\n}\n\nvoid EReaderHelper_SerialCallback(void)\n{\n    u16 recv[4];\n    u16 i;\n    u16 cnt1;\n    u16 cnt2;\n    u32 recv32;\n\n    switch (sSendRecvMgr.state)\n    {\n    case EREADER_XFR_STATE_HANDSHAKE:\n        REG_SIOMLT_SEND = 0xCCD0;\n        *(u64 *)recv = REG_SIOMLT_RECV;\n        for (i = 0, cnt1 = 0, cnt2 = 0; i < 4; i++)\n        {\n            if (recv[i] == 0xCCD0)\n                cnt1++;\n            else if (recv[i] != 0xFFFF)\n                cnt2++;\n        }\n        if (cnt1 == 2 && cnt2 == 0)\n            sSendRecvMgr.state = EREADER_XFR_STATE_START;\n        break;\n        // Progression is handled by software\n    case EREADER_XFR_STATE_TRANSFER:\n        recv32 = REG_SIODATA32;\n        // The first value sent by the EReader is the payload size\n        if (sSendRecvMgr.cursor == 0 && sSendRecvMgr.master_slave == 0)\n            sSendRecvMgr.size = recv32 / 4 + 1;\n        if (sSendRecvMgr.master_slave == 1)\n        {\n            // Send mode\n            if (sSendRecvMgr.cursor < sSendRecvMgr.size)\n            {\n                REG_SIODATA32 = sSendRecvMgr.dataptr[sSendRecvMgr.cursor];\n                sSendRecvMgr.checksum += sSendRecvMgr.dataptr[sSendRecvMgr.cursor];\n            }\n            else\n                REG_SIODATA32 = sSendRecvMgr.checksum;\n        }\n        else\n        {\n            // Receive mode\n            if (sSendRecvMgr.cursor > 0 && sSendRecvMgr.cursor < sSendRecvMgr.size + 1)\n            {\n                // Receive next word\n                sSendRecvMgr.dataptr[sSendRecvMgr.cursor - 1] = recv32;\n                sSendRecvMgr.checksum += recv32;\n            }\n            else if (sSendRecvMgr.cursor != 0)\n            {\n                // Reached the end, test the received checksum\n                if (sSendRecvMgr.checksum == recv32)\n                    sSendRecvMgr.checksumResult = EREADER_CHECKSUM_OK;\n                else\n                    sSendRecvMgr.checksumResult = EREADER_CHECKSUM_ERR;\n            }\n            sCounter2 = 0;\n        }\n        sSendRecvMgr.cursor++;\n        if (sSendRecvMgr.cursor < sSendRecvMgr.size + 2)\n        {\n            if (sSendRecvMgr.master_slave != 0)\n                // Clock master; start timer\n                REG_TM3CNT_H |= TIMER_ENABLE;\n            else\n                // Clock slave; reset\n                EnableSio();\n        }\n        else\n        {\n            sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER_DONE;\n            sCounter1 = 0;\n        }\n        break;\n        // Progression is handled by the software\n    case EREADER_XFR_STATE_CHECKSUM:\n        if (sSendRecvMgr.master_slave == 0)\n            // Clock slave\n            REG_SIODATA8 = sSendRecvMgr.checksumResult;\n        *(vu64 *)recv = REG_SIOMLT_RECV;\n        if (recv[1] == EREADER_CHECKSUM_OK || recv[1] == EREADER_CHECKSUM_ERR)\n        {\n            if (sSendRecvMgr.master_slave == 1)\n                // EReader has (in)validated the payload\n                sSendRecvMgr.checksumResult = recv[1];\n            sSendRecvMgr.state = EREADER_XFR_STATE_DONE;\n        }\n        break;\n    }\n}\n\nstatic void EnableSio(void)\n{\n    REG_SIOCNT |= SIO_ENABLE;\n}\n\nstatic void DisableTm3(void)\n{\n    REG_TM3CNT_H &= ~TIMER_ENABLE;\n    REG_TM3CNT_L = -601;\n}\n\nstatic void GetKeyInput(void)\n{\n    u16 rawKeys = REG_KEYINPUT ^ 0x3FF;\n    sJoyNew = rawKeys & ~sJoyNewOrRepeated;\n    sJoyNewOrRepeated = rawKeys;\n}\n\nvoid EReaderHelper_SaveRegsState(void)\n{\n    sSavedIme = REG_IME;\n    sSavedIe = REG_IE;\n    sSavedTm3Cnt = REG_TM3CNT_H;\n    sSavedSioCnt = REG_SIOCNT;\n    sSavedRCnt = REG_RCNT;\n}\n\nvoid EReaderHelper_RestoreRegsState(void)\n{\n    REG_IME = sSavedIme;\n    REG_IE = sSavedIe;\n    REG_TM3CNT_H = sSavedTm3Cnt;\n    REG_SIOCNT = sSavedSioCnt;\n    REG_RCNT = sSavedRCnt;\n}\n\nvoid EReaderHelper_ClearsSendRecvMgr(void)\n{\n    CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));\n}\n"
  },
  {
    "path": "src/ereader_screen.c",
    "content": "#include \"global.h\"\n#include \"malloc.h\"\n#include \"decompress.h\"\n#include \"ereader_helpers.h\"\n#include \"link.h\"\n#include \"main.h\"\n#include \"mystery_gift_menu.h\"\n#include \"mystery_gift_client.h\"\n#include \"save.h\"\n#include \"sound.h\"\n#include \"sprite.h\"\n#include \"task.h\"\n#include \"strings.h\"\n#include \"util.h\"\n#include \"cereader_tool.h\"\n#include \"help_system.h\"\n#include \"constants/songs.h\"\n\nstruct EReaderTaskData\n{\n    u16 timer;\n    u16 unused1;\n    u16 unused2;\n    u16 unused3;\n    u8 state;\n    u8 textState;\n    u8 unused4;\n    u8 unused5;\n    u8 unused6;\n    u8 unused7;\n    u8 status;\n    u8 *unusedBuffer;\n};\n\nstruct EReaderData\n{\n    u16 status;\n    size_t size;\n    const void *data;\n};\n\nstatic void Task_EReader(u8);\n\nstruct EReaderData gEReaderData;\n\nextern const u8 gMultiBootProgram_EReader_Start[];\nextern const u8 gMultiBootProgram_EReader_End[];\n\nstatic void EReader_Load(struct EReaderData *eReader, size_t size, const void *data)\n{\n    vu16 imeBak = REG_IME;\n    REG_IME = 0;\n    gIntrTable[1] = EReaderHelper_SerialCallback;\n    gIntrTable[2] = EReaderHelper_Timer3Callback;\n    EReaderHelper_SaveRegsState();\n    EReaderHelper_ClearsSendRecvMgr();\n    REG_IE |= INTR_FLAG_VCOUNT;\n    REG_IME = imeBak;\n    eReader->status = 0;\n    eReader->size = size;\n    eReader->data = data;\n}\n\nstatic void EReader_Reset(struct EReaderData *eReader)\n{\n    vu16 imeBak = REG_IME;\n    REG_IME = 0;\n    EReaderHelper_ClearsSendRecvMgr();\n    EReaderHelper_RestoreRegsState();\n    RestoreSerialTimer3IntrHandlers();\n    REG_IME = imeBak;\n}\n\n// Return values for EReader_Transfer\nenum {\n    TRANSFER_ACTIVE,\n    TRANSFER_SUCCESS,\n    TRANSFER_CANCELED,\n    TRANSFER_TIMEOUT,\n};\n\nstatic u8 EReader_Transfer(struct EReaderData *eReader)\n{\n    u8 transferStatus = TRANSFER_ACTIVE;\n    eReader->status = EReaderHandleTransfer(TRUE, eReader->size, eReader->data, NULL);\n\n    if ((eReader->status & EREADER_XFER_MASK) == 0 && eReader->status & EREADER_CHECKSUM_OK_MASK)\n        transferStatus = TRANSFER_SUCCESS;\n\n    if (eReader->status & EREADER_CANCEL_KEY_MASK)\n        transferStatus = TRANSFER_CANCELED;\n\n    if (eReader->status & EREADER_CANCEL_TIMEOUT_MASK)\n        transferStatus = TRANSFER_TIMEOUT;\n\n    gShouldAdvanceLinkState = 0;\n    return transferStatus;\n}\n\nstatic void OpenEReaderLink(void)\n{\n    memset(gDecompressionBuffer, 0, 0x2000);\n    gLinkType = LINKTYPE_EREADER_FRLG;\n    OpenLink();\n    SetSuppressLinkErrorMessage(TRUE);\n}\n\nstatic bool32 ValidateEReaderConnection(void)\n{\n    vu16 imeBak = REG_IME;\n    u16 handshakes[MAX_LINK_PLAYERS];\n\n    REG_IME = 0;\n    *(u64 *)handshakes = *(u64 *)gLink.tempRecvBuffer;\n    REG_IME = imeBak;\n\n    // Validate that we are player 1, the EReader is player 2,\n    // and that players 3 and 4 are empty.\n    if (handshakes[0] == SLAVE_HANDSHAKE\n     && handshakes[1] == EREADER_HANDSHAKE\n     && handshakes[2] == 0xFFFF\n     && handshakes[3] == 0xFFFF)\n        return TRUE;\n    return FALSE;\n}\n\nstatic bool32 IsEReaderConnectionSane(void)\n{\n    if (IsLinkMaster() && GetLinkPlayerCount_2() == 2)\n        return TRUE;\n    return FALSE;\n}\n\n// States for TryReceiveCard\nenum {\n    RECV_STATE_INIT,\n    RECV_STATE_WAIT_START,\n    RECV_STATE_START,\n    RECV_STATE_EXCHANGE,\n    RECV_STATE_START_DISCONNECT,\n    RECV_STATE_WAIT_DISCONNECT,\n};\n\n// Return values for TryReceiveCard\nenum {\n    RECV_ACTIVE,\n    RECV_CANCELED,\n    RECV_SUCCESS,\n    RECV_ERROR,\n    RECV_DISCONNECTED,\n    RECV_TIMEOUT,\n};\n\nstatic u32 TryReceiveCard(u8 * state, u16 * timer)\n{\n    if ((*state == RECV_STATE_EXCHANGE\n      || *state == RECV_STATE_START_DISCONNECT\n      || *state == RECV_STATE_WAIT_DISCONNECT)\n        && HasLinkErrorOccurred())\n    {\n        // Return error status if an error occurs\n        // during the link exchange.\n        *state = 0;\n        return RECV_ERROR;\n    }\n\n    switch (*state)\n    {\n    case RECV_STATE_INIT:\n        if (IsLinkMaster() && GetLinkPlayerCount_2() > 1)\n        {\n            *state = RECV_STATE_WAIT_START;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            *state = 0;\n            return RECV_CANCELED;\n        }\n        break;\n    case RECV_STATE_WAIT_START:\n        if (++(*timer) > 5)\n        {\n            *timer = 0;\n            *state = RECV_STATE_START;\n        }\n        break;\n    case RECV_STATE_START:\n        if (GetLinkPlayerCount_2() == 2)\n        {\n            PlaySE(SE_DING_DONG);\n            CheckShouldAdvanceLinkState();\n            *timer = 0;\n            *state = RECV_STATE_EXCHANGE;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            *state = 0;\n            return RECV_CANCELED;\n        }\n        break;\n    case RECV_STATE_EXCHANGE:\n        if (++(*timer) > 30)\n        {\n            *state = 0;\n            return RECV_TIMEOUT;\n        }\n        \n        if (IsLinkConnectionEstablished())\n        {\n            if (gReceivedRemoteLinkPlayers)\n            {\n                if (IsLinkPlayerDataExchangeComplete())\n                {\n                    *state = 0;\n                    return RECV_SUCCESS;\n                }\n                else\n                    *state = RECV_STATE_START_DISCONNECT;\n            }\n            else\n                *state = RECV_STATE_EXCHANGE;\n        }\n        break;\n    case RECV_STATE_START_DISCONNECT:\n        SetCloseLinkCallbackAndType(0);\n        *state = RECV_STATE_WAIT_DISCONNECT;\n        break;\n    case RECV_STATE_WAIT_DISCONNECT:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            *state = 0;\n            return RECV_DISCONNECTED;\n        }\n        break;\n    }\n    return RECV_ACTIVE;\n}\n\nvoid CreateEReaderTask(void)\n{\n    u8 taskId = CreateTask(Task_EReader, 0);\n    struct EReaderTaskData *data = (struct EReaderTaskData *)gTasks[taskId].data;\n    data->state = 0;\n    data->textState = 0;\n    data->unused4 = 0;\n    data->unused5 = 0;\n    data->unused6 = 0;\n    data->unused7 = 0;\n    data->timer = 0;\n    data->unused1 = 0;\n    data->unused2 = 0;\n    data->unused3 = 0;\n    data->status = 0;\n    data->unusedBuffer = AllocZeroed(CLIENT_MAX_MSG_SIZE);\n}\n\nstatic void ResetTimer(u16 *timer)\n{\n    *timer = 0;\n}\n\nstatic bool32 UpdateTimer(u16 * timer, u16 time)\n{\n    if (++(*timer) > time)\n    {\n        // Timer has finished\n        *timer = 0;\n        return TRUE;\n    }\n    return FALSE;\n}\n\n// States for Task_EReader\nenum {\n    ER_STATE_START,\n    ER_STATE_INIT_LINK,\n    ER_STATE_INIT_LINK_WAIT,\n    ER_STATE_INIT_LINK_CHECK,\n    ER_STATE_MSG_SELECT_CONNECT,\n    ER_STATE_MSG_SELECT_CONNECT_WAIT,\n    ER_STATE_TRY_LINK,\n    ER_STATE_INCORRECT_LINK,\n    ER_STATE_CONNECTING,\n    ER_STATE_TRANSFER,\n    ER_STATE_TRANSFER_END,\n    ER_STATE_TRANSFER_SUCCESS,\n    ER_STATE_LOAD_CARD_START,\n    ER_STATE_LOAD_CARD,\n    ER_STATE_WAIT_RECV_CARD,\n    ER_STATE_VALIDATE_CARD,\n    ER_STATE_WAIT_DISCONNECT,\n    ER_STATE_SAVE,\n    ER_STATE_SUCCESS_MSG,\n    ER_STATE_SUCCESS_END,\n    ER_STATE_LINK_ERROR,\n    ER_STATE_LINK_ERROR_TRY_AGAIN,\n    ER_STATE_SAVE_FAILED,\n    ER_STATE_CANCELED_CARD_READ,\n    ER_STATE_UNUSED_1,\n    ER_STATE_UNUSED_2,\n    ER_STATE_END,\n};\n\nstatic void Task_EReader(u8 taskId)\n{\n    struct EReaderTaskData *data = (struct EReaderTaskData *)gTasks[taskId].data;\n    switch (data->state)\n    {\n    case ER_STATE_START:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_ReceiveMysteryGiftWithEReader))\n            data->state = ER_STATE_INIT_LINK;\n        break;\n    case ER_STATE_INIT_LINK:\n        OpenEReaderLink();\n        ResetTimer(&data->timer);\n        data->state = ER_STATE_INIT_LINK_WAIT;\n        break;\n    case ER_STATE_INIT_LINK_WAIT:\n        if (UpdateTimer(&data->timer, 10))\n            data->state = ER_STATE_INIT_LINK_CHECK;\n        break;\n    case ER_STATE_INIT_LINK_CHECK:\n        if (!IsEReaderConnectionSane())\n        {\n            CloseLink();\n            data->state = ER_STATE_MSG_SELECT_CONNECT;\n        }\n        else\n            data->state = ER_STATE_LOAD_CARD;\n        break;\n    case ER_STATE_MSG_SELECT_CONNECT:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_SelectConnectFromEReaderMenu))\n        {\n            AddTextPrinterToWindow1(gJPText_SelectConnectWithGBA);\n            ResetTimer(&data->timer);\n            data->state = ER_STATE_MSG_SELECT_CONNECT_WAIT;\n        }\n        break;\n    case ER_STATE_MSG_SELECT_CONNECT_WAIT:\n        if (UpdateTimer(&data->timer, 90))\n        {\n            OpenEReaderLink();\n            data->state = ER_STATE_TRY_LINK;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            ResetTimer(&data->timer);\n            PlaySE(SE_SELECT);\n            data->state = ER_STATE_CANCELED_CARD_READ;\n        }\n        break;\n    case ER_STATE_TRY_LINK:\n        if (JOY_NEW(B_BUTTON))\n        {\n            // Canceled\n            PlaySE(SE_SELECT);\n            CloseLink();\n            ResetTimer(&data->timer);\n            data->state = ER_STATE_CANCELED_CARD_READ;\n        }\n        else if (GetLinkPlayerCount_2() > 1)\n        {\n            ResetTimer(&data->timer);\n            CloseLink();\n            data->state = ER_STATE_INCORRECT_LINK;\n        }\n        else if (ValidateEReaderConnection())\n        {\n            // Successful connection\n            PlaySE(SE_SELECT);\n            CloseLink();\n            ResetTimer(&data->timer);\n            data->state = ER_STATE_CONNECTING;\n        }\n        else if (UpdateTimer(&data->timer, 10))\n        {\n            // Retry connection\n            CloseLink();\n            OpenEReaderLink();\n            ResetTimer(&data->timer);\n        }\n        break;\n    case ER_STATE_INCORRECT_LINK:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_LinkIsIncorrect))\n            data->state = ER_STATE_MSG_SELECT_CONNECT;\n        break;\n    case ER_STATE_CONNECTING:\n        AddTextPrinterToWindow1(gJPText_Connecting);\n        EReader_Load(&gEReaderData, gMultiBootProgram_EReader_End - gMultiBootProgram_EReader_Start, gMultiBootProgram_EReader_Start);\n        data->state = ER_STATE_TRANSFER;\n        break;\n    case ER_STATE_TRANSFER:\n        data->status = EReader_Transfer(&gEReaderData);\n        if (data->status != TRANSFER_ACTIVE)\n            data->state = ER_STATE_TRANSFER_END;\n        break;\n    case ER_STATE_TRANSFER_END:\n        EReader_Reset(&gEReaderData);\n        if (data->status == TRANSFER_TIMEOUT)\n        {\n            data->state = ER_STATE_LINK_ERROR;\n        }\n        else if (data->status == TRANSFER_SUCCESS)\n        {\n            ResetTimer(&data->timer);\n            AddTextPrinterToWindow1(gJPText_PleaseWaitAMoment);\n            data->state = ER_STATE_TRANSFER_SUCCESS;\n        }\n        else // TRANSFER_CANCELED\n        {\n            data->state = ER_STATE_START;\n        }\n        break;\n    case ER_STATE_TRANSFER_SUCCESS:\n        if (UpdateTimer(&data->timer, 840))\n            data->state = ER_STATE_LOAD_CARD_START;\n        break;\n    case ER_STATE_LOAD_CARD_START:\n        OpenEReaderLink();\n        AddTextPrinterToWindow1(gJPText_AllowEReaderToLoadCard);\n        data->state = ER_STATE_LOAD_CARD;\n        break;\n    case ER_STATE_LOAD_CARD:\n        switch (TryReceiveCard(&data->textState, &data->timer))\n        {\n        case RECV_ACTIVE:\n            // Running\n            break;\n        case RECV_SUCCESS:\n            AddTextPrinterToWindow1(gJPText_Connecting);\n            data->state = ER_STATE_WAIT_RECV_CARD;\n            break;\n        case RECV_CANCELED:\n            PlaySE(SE_SELECT);\n            CloseLink();\n            data->state = ER_STATE_CANCELED_CARD_READ;\n            break;\n        case RECV_TIMEOUT:\n            CloseLink();\n            data->state = ER_STATE_LINK_ERROR_TRY_AGAIN;\n            break;\n        case RECV_ERROR:\n        case RECV_DISCONNECTED:\n            CloseLink();\n            data->state = ER_STATE_LINK_ERROR;\n            break;\n        }\n        break;\n    case ER_STATE_WAIT_RECV_CARD:\n        if (HasLinkErrorOccurred())\n        {\n            CloseLink();\n            data->state = ER_STATE_LINK_ERROR;\n        }\n        else if (GetBlockReceivedStatus())\n        {\n            ResetBlockReceivedFlags();\n            data->state = ER_STATE_VALIDATE_CARD;\n        }\n        break;\n    case ER_STATE_VALIDATE_CARD:\n        data->status = ValidateTrainerTowerData((struct EReaderTrainerTowerSet *)gDecompressionBuffer);\n        SetCloseLinkCallbackAndType(data->status);\n        data->state = ER_STATE_WAIT_DISCONNECT;\n        break;\n    case ER_STATE_WAIT_DISCONNECT:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            if (data->status == TRUE) // Was data valid?\n                data->state = ER_STATE_SAVE;\n            else\n                data->state = ER_STATE_LINK_ERROR;\n        }\n        break;\n    case ER_STATE_SAVE:\n        if (CEReaderTool_SaveTrainerTower((struct EReaderTrainerTowerSet *)gDecompressionBuffer))\n        {\n            AddTextPrinterToWindow1(gJPText_ConnectionComplete);\n            ResetTimer(&data->timer);\n            data->state = ER_STATE_SUCCESS_MSG;\n        }\n        else\n            data->state = ER_STATE_SAVE_FAILED;\n        break;\n    case ER_STATE_SUCCESS_MSG:\n        if (UpdateTimer(&data->timer, 120))\n        {\n            AddTextPrinterToWindow1(gJPText_NewTrainerHasComeToSevii);\n            PlayFanfare(MUS_OBTAIN_ITEM);\n            data->state = ER_STATE_SUCCESS_END;\n        }\n        break;\n    case ER_STATE_SUCCESS_END:\n        if (IsFanfareTaskInactive() && JOY_NEW(A_BUTTON | B_BUTTON))\n            data->state = ER_STATE_END;\n        break;\n    case ER_STATE_CANCELED_CARD_READ:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_CardReadingHasBeenHalted))\n            data->state = ER_STATE_END;\n        break;\n    case ER_STATE_LINK_ERROR:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_ConnectionErrorCheckLink))\n            data->state = ER_STATE_START;\n        break;\n    case ER_STATE_LINK_ERROR_TRY_AGAIN:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_ConnectionErrorTryAgain))\n            data->state = ER_STATE_START;\n        break;\n    case ER_STATE_SAVE_FAILED:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gJPText_WriteErrorUnableToSaveData))\n            data->state = ER_STATE_START;\n        break;\n    case ER_STATE_END:\n        HelpSystem_Enable();\n        Free(data->unusedBuffer);\n        DestroyTask(taskId);\n        SetMainCallback2(MainCB_FreeAllBuffersAndReturnToInitTitleScreen);\n        break;\n    }\n}\n"
  },
  {
    "path": "src/event_data.c",
    "content": "#include \"global.h\"\n#include \"event_data.h\"\n#include \"item_menu.h\"\n#include \"quest_log.h\"\n#include \"constants/maps.h\"\n#include \"constants/map_groups.h\"\n#include \"constants/region_map_sections.h\"\n\nstatic bool8 IsFlagOrVarStoredInQuestLog(u16 idx, u8 a1);\n\n#define NUM_SPECIAL_FLAGS  (SPECIAL_FLAGS_END - SPECIAL_FLAGS_START + 1)\n#define NUM_TEMP_FLAGS     (TEMP_FLAGS_END - TEMP_FLAGS_START + 1)\n#define NUM_TEMP_VARS      (TEMP_VARS_END - TEMP_VARS_START + 1)\n\n#define SPECIAL_FLAGS_SIZE (NUM_SPECIAL_FLAGS / 8)  // 8 flags per byte\n#define TEMP_FLAGS_SIZE    (NUM_TEMP_FLAGS / 8)\n#define TEMP_VARS_SIZE     (NUM_TEMP_VARS * 2)      // 1/2 var per byte\n\nEWRAM_DATA u16 gSpecialVar_0x8000 = 0;\nEWRAM_DATA u16 gSpecialVar_0x8001 = 0;\nEWRAM_DATA u16 gSpecialVar_0x8002 = 0;\nEWRAM_DATA u16 gSpecialVar_0x8003 = 0;\nEWRAM_DATA u16 gSpecialVar_0x8004 = 0;\nEWRAM_DATA u16 gSpecialVar_0x8005 = 0;\nEWRAM_DATA u16 gSpecialVar_0x8006 = 0;\nEWRAM_DATA u16 gSpecialVar_0x8007 = 0;\nEWRAM_DATA u16 gSpecialVar_0x8008 = 0;\nEWRAM_DATA u16 gSpecialVar_0x8009 = 0;\nEWRAM_DATA u16 gSpecialVar_0x800A = 0;\nEWRAM_DATA u16 gSpecialVar_0x800B = 0;\nEWRAM_DATA u16 gSpecialVar_Result = 0;\nEWRAM_DATA u16 gSpecialVar_LastTalked = 0;\nEWRAM_DATA u16 gSpecialVar_Facing = 0;\nEWRAM_DATA u16 gSpecialVar_MonBoxId = 0;\nEWRAM_DATA u16 gSpecialVar_MonBoxPos = 0;\nEWRAM_DATA u16 gSpecialVar_TextColor = 0;\nEWRAM_DATA u16 gSpecialVar_PrevTextColor = 0;\nEWRAM_DATA u16 gSpecialVar_0x8014 = 0;\nEWRAM_DATA u8 sSpecialFlags[SPECIAL_FLAGS_SIZE] = {};\n\nu16 gLastQuestLogStoredFlagOrVarIdx;\n\nextern u16 *const gSpecialVars[];\nextern u8 NuzlockeLUT[];\n\nvoid InitEventData(void)\n{\n    memset(gSaveBlock1Ptr->flags, 0, sizeof(gSaveBlock1Ptr->flags));\n    memset(gSaveBlock1Ptr->vars, 0, sizeof(gSaveBlock1Ptr->vars));\n    memset(sSpecialFlags, 0, sizeof(sSpecialFlags));\n}\n\nvoid ClearTempFieldEventData(void)\n{\n    memset(gSaveBlock1Ptr->flags + (TEMP_FLAGS_START / 8), 0, TEMP_FLAGS_SIZE);\n    memset(gSaveBlock1Ptr->vars + ((TEMP_VARS_START - VARS_START) * 2), 0, TEMP_VARS_SIZE);\n    FlagClear(FLAG_SYS_WHITE_FLUTE_ACTIVE);\n    FlagClear(FLAG_SYS_BLACK_FLUTE_ACTIVE);\n    FlagClear(FLAG_SYS_USE_STRENGTH);\n    FlagClear(FLAG_SYS_SPECIAL_WILD_BATTLE);\n    FlagClear(FLAG_SYS_CTRL_OBJ_DELETE);\n    FlagClear(FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER);\n}\n\n// Unused\nstatic void DisableNationalPokedex_RSE(void)\n{\n    u16 *ptr = GetVarPointer(VAR_0x403C);\n    gSaveBlock2Ptr->pokedex.unused = 0;\n    *ptr = 0;\n    FlagClear(FLAG_0x838);\n}\n\n// The magic numbers used here (0xDA and 0x0302) correspond to those\n// used in RSE for enabling the national Pokedex\nvoid EnableNationalPokedex_RSE(void)\n{\n    // Note: the var, struct member, and flag are never used\n    u16 *ptr = GetVarPointer(VAR_0x403C);\n    gSaveBlock2Ptr->pokedex.unused = 0xDA;\n    *ptr = 0x0302;\n    FlagSet(FLAG_0x838);\n}\n\n// Unused\nstatic bool32 IsNationalPokedexEnabled_RSE(void)\n{\n    if (gSaveBlock2Ptr->pokedex.unused == 0xDA\n            && VarGet(VAR_0x403C) == 0x0302\n            && FlagGet(FLAG_0x838))\n        return TRUE;\n\n    return FALSE;\n}\n\nvoid DisableNationalPokedex(void)\n{\n    u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);\n    gSaveBlock2Ptr->pokedex.nationalMagic = 0;\n    *nationalDexVar = 0;\n    FlagClear(FLAG_SYS_NATIONAL_DEX);\n}\n\nvoid EnableNationalPokedex(void)\n{\n    u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);\n    gSaveBlock2Ptr->pokedex.nationalMagic = 0xB9;\n    *nationalDexVar = 0x6258;\n    FlagSet(FLAG_SYS_NATIONAL_DEX);\n}\n\nbool32 IsNationalPokedexEnabled(void)\n{\n    if (!FlagGet(FLAG_SYS_NATIONAL_DEX))\n        return FALSE;\n    return TRUE;\n}\n\nvoid DisableMysteryGift(void)\n{\n    FlagClear(FLAG_SYS_MYSTERY_GIFT_ENABLED);\n}\n\nvoid EnableMysteryGift(void)\n{\n    FlagSet(FLAG_SYS_MYSTERY_GIFT_ENABLED);\n}\n\nbool32 IsMysteryGiftEnabled(void)\n{\n    return FlagGet(FLAG_SYS_MYSTERY_GIFT_ENABLED);\n}\n\nvoid ClearMysteryGiftFlags(void)\n{\n    FlagClear(FLAG_MYSTERY_GIFT_DONE);\n    FlagClear(FLAG_MYSTERY_GIFT_1);\n    FlagClear(FLAG_MYSTERY_GIFT_2);\n    FlagClear(FLAG_MYSTERY_GIFT_3);\n    FlagClear(FLAG_MYSTERY_GIFT_4);\n    FlagClear(FLAG_MYSTERY_GIFT_5);\n    FlagClear(FLAG_MYSTERY_GIFT_6);\n    FlagClear(FLAG_MYSTERY_GIFT_7);\n    FlagClear(FLAG_MYSTERY_GIFT_8);\n    FlagClear(FLAG_MYSTERY_GIFT_9);\n    FlagClear(FLAG_MYSTERY_GIFT_10);\n    FlagClear(FLAG_MYSTERY_GIFT_11);\n    FlagClear(FLAG_MYSTERY_GIFT_12);\n    FlagClear(FLAG_MYSTERY_GIFT_13);\n    FlagClear(FLAG_MYSTERY_GIFT_14);\n    FlagClear(FLAG_MYSTERY_GIFT_15);\n}\n\nvoid ClearMysteryGiftVars(void)\n{\n    VarSet(VAR_EVENT_PICHU_SLOT, 0);\n    VarSet(VAR_MYSTERY_GIFT_1,  0);\n    VarSet(VAR_MYSTERY_GIFT_2,  0);\n    VarSet(VAR_MYSTERY_GIFT_3,  0);\n    VarSet(VAR_MYSTERY_GIFT_4,  0);\n    VarSet(VAR_MYSTERY_GIFT_5,  0);\n    VarSet(VAR_MYSTERY_GIFT_6,  0);\n    VarSet(VAR_MYSTERY_GIFT_7,  0);\n    VarSet(VAR_ALTERING_CAVE_WILD_SET, 0);\n}\n\nvoid DisableResetRTC(void)\n{\n    VarSet(VAR_RESET_RTC_ENABLE, 0);\n    FlagClear(FLAG_SYS_RESET_RTC_ENABLE);\n}\n\nvoid EnableResetRTC(void)\n{\n    VarSet(VAR_RESET_RTC_ENABLE, 0x0920);\n    FlagSet(FLAG_SYS_RESET_RTC_ENABLE);\n}\n\nbool32 CanResetRTC(void)\n{\n    if (!FlagGet(FLAG_SYS_RESET_RTC_ENABLE))\n        return FALSE;\n    if (VarGet(VAR_RESET_RTC_ENABLE) != 0x0920)\n        return FALSE;\n    return TRUE;\n}\n\nu16 *GetVarPointer(u16 idx)\n{\n    u16 *ptr;\n    if (idx < VARS_START)\n        return NULL;\n    if (idx < SPECIAL_VARS_START)\n    {\n        switch (gQuestLogPlaybackState)\n        {\n        case QL_PLAYBACK_STATE_STOPPED:\n        default:\n            break;\n        case QL_PLAYBACK_STATE_RUNNING:\n            ptr = QuestLogGetFlagOrVarPtr(FALSE, idx);\n            if (ptr != NULL)\n                gSaveBlock1Ptr->vars[idx - VARS_START] = *ptr;\n            break;\n        case QL_PLAYBACK_STATE_RECORDING:\n            if (IsFlagOrVarStoredInQuestLog(idx - VARS_START, TRUE) == TRUE)\n            {\n                gLastQuestLogStoredFlagOrVarIdx = idx - VARS_START;\n                QuestLogSetFlagOrVar(FALSE, idx, gSaveBlock1Ptr->vars[idx - VARS_START]);\n            }\n            break;\n        }\n        return &gSaveBlock1Ptr->vars[idx - VARS_START];\n    }\n    return gSpecialVars[idx - SPECIAL_VARS_START];\n}\n\nstatic bool8 IsFlagOrVarStoredInQuestLog(u16 idx, bool8 isVar)\n{\n    if (!isVar)\n    {\n        if (idx < STORY_FLAGS_START)\n            return FALSE;\n        if (idx >= SYS_FLAGS && idx < PERMA_SYS_FLAGS_START)\n            return FALSE;\n    }\n    else\n    {\n        if (idx < VAR_ICE_STEP_COUNT - VARS_START)\n            return FALSE;\n        if (idx >= VAR_MAP_SCENE_PALLET_TOWN_OAK - VARS_START && idx < VAR_PORTHOLE - VARS_START)\n            return FALSE;\n    }\n    return TRUE;\n}\n\nu16 VarGet(u16 idx)\n{\n    u16 *ptr = GetVarPointer(idx);\n    if (ptr == NULL)\n        return idx;\n    return *ptr;\n}\n\nbool8 VarSet(u16 idx, u16 val)\n{\n    u16 *ptr = GetVarPointer(idx);\n    if (ptr == NULL)\n        return FALSE;\n    *ptr = val;\n    return TRUE;\n}\n\nu8 VarGetObjectEventGraphicsId(u8 idx)\n{\n    return VarGet(VAR_OBJ_GFX_ID_0 + idx);\n}\n\nu8 *GetFlagAddr(u16 idx)\n{\n    u8 *ptr;\n    if (idx == 0)\n        return NULL;\n    if (idx < SPECIAL_FLAGS_START)\n    {\n        switch (gQuestLogPlaybackState)\n        {\n        case QL_PLAYBACK_STATE_STOPPED:\n        default:\n            break;\n        case QL_PLAYBACK_STATE_RUNNING:\n            ptr = QuestLogGetFlagOrVarPtr(TRUE, idx);\n            if (ptr != NULL)\n                gSaveBlock1Ptr->flags[idx / 8] = *ptr;\n            break;\n        case QL_PLAYBACK_STATE_RECORDING:\n            if (IsFlagOrVarStoredInQuestLog(idx, FALSE) == TRUE)\n            {\n                gLastQuestLogStoredFlagOrVarIdx = idx;\n                QuestLogSetFlagOrVar(TRUE, idx, gSaveBlock1Ptr->flags[idx / 8]);\n            }\n            break;\n        }\n        return &gSaveBlock1Ptr->flags[idx / 8];\n    }\n    return &sSpecialFlags[(idx - SPECIAL_FLAGS_START) / 8];\n}\n\nbool8 FlagSet(u16 idx)\n{\n    u8 *ptr = GetFlagAddr(idx);\n    if (ptr != NULL)\n        *ptr |= 1 << (idx & 7);\n    return FALSE;\n}\n\nbool8 FlagClear(u16 idx)\n{\n    u8 *ptr = GetFlagAddr(idx);\n    if (ptr != NULL)\n        *ptr &= ~(1 << (idx & 7));\n    return FALSE;\n}\n\nbool8 FlagGet(u16 idx)\n{\n    u8 *ptr = GetFlagAddr(idx);\n    if (ptr == NULL)\n        return FALSE;\n    if (!(*ptr & 1 << (idx & 7)))\n        return FALSE;\n    return TRUE;\n}\n\nvoid ResetSpecialVars(void)\n{\n    gSpecialVar_0x8000 = 0;\n    gSpecialVar_0x8001 = 0;\n    gSpecialVar_0x8002 = 0;\n    gSpecialVar_0x8003 = 0;\n    gSpecialVar_0x8004 = 0;\n    gSpecialVar_0x8005 = 0;\n    gSpecialVar_0x8006 = 0;\n    gSpecialVar_0x8007 = 0;\n    gSpecialVar_0x8008 = 0;\n    gSpecialVar_0x8009 = 0;\n    gSpecialVar_0x800A = 0;\n    gSpecialVar_0x800B = 0;\n    gSpecialVar_Facing = 0;\n    gSpecialVar_Result = 0;\n    gSpecialVar_ItemId = 0;\n    gSpecialVar_LastTalked = 0;\n    gSpecialVar_MonBoxId = 0;\n    gSpecialVar_MonBoxPos = 0;\n    gSpecialVar_TextColor = 0;\n    gSpecialVar_PrevTextColor = 0;\n    gSpecialVar_0x8014 = 0;\n}\n\nu8 NuzlockeFlagSet(u8 mapsec)\n{\n    u8 id = NuzlockeLUT[mapsec];\n    if(!FlagGet(FLAG_SYS_POKEDEX_GET))\n    {   //don't start keeping track until has Pokedex\n        return 1;\n    }\n    if(id == 0x27) //Safari Zone\n    {\n        if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_EAST))\n        {\n            FlagSet(FLAG_NUZLOCKE_SAFARI_EAST);\n            return 0;\n        }\n        else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH))\n        {\n            FlagSet(FLAG_NUZLOCKE_SAFARI_NORTH);\n            return 0;\n        }\n        else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_WEST))\n        {\n            FlagSet(FLAG_NUZLOCKE_SAFARI_WEST);\n            return 0;\n        }\n        else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_WEST))\n        {\n            FlagSet(FLAG_NUZLOCKE_SAFARI_NORTH_WEST);\n            return 0;\n        }\n        else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_EAST))\n        {\n            FlagSet(FLAG_NUZLOCKE_SAFARI_NORTH_EAST);\n            return 0;\n        }\n        else\n        {\n            FlagSet(NUZLOCKE_FLAGS_START + (id - 1)); //base Safari Zone flag\n            return 0;\n        }\n        return 0;\n    }\n    if(id != 0)\n        FlagSet(NUZLOCKE_FLAGS_START + (id - 1));\n    return 0;\n}\n\nu8 NuzlockeFlagClear(u8 mapsec)\n{   //can't handle additional Safari Zone flags\n    u8 id = NuzlockeLUT[mapsec];\n    if(id != 0)\n        FlagClear(NUZLOCKE_FLAGS_START + (id - 1));\n    return 0;\n}\n\nu8 NuzlockeFlagGet(u8 mapsec)\n{\n    u8 id = NuzlockeLUT[mapsec];\n    if(id == 0x27) //Safari Zone\n    {\n        if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_EAST))\n        {\n            return FlagGet(FLAG_NUZLOCKE_SAFARI_EAST);\n        }\n        else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH))\n        {\n            return FlagGet(FLAG_NUZLOCKE_SAFARI_NORTH);\n        }\n        else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_WEST))\n        {\n            return FlagGet(FLAG_NUZLOCKE_SAFARI_WEST);\n        }\n        else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_WEST))\n        {\n            return FlagGet(FLAG_NUZLOCKE_SAFARI_NORTH_WEST);\n        }\n        else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFARI_ZONE_NORTH_EAST))\n        {\n            return FlagGet(FLAG_NUZLOCKE_SAFARI_NORTH_EAST);\n        }\n        else\n        {\n            return FlagGet(NUZLOCKE_FLAGS_START + (id - 1)); //base Safari Zone flag\n        }\n        return 0;\n    }\n    if(id != 0)\n        return FlagGet(NUZLOCKE_FLAGS_START + (id - 1));\n    return FALSE;\n}\n\nbool8 CheckMasterTrainerFlag(u16 flag)\n{\n    u8 index = flag / 8; //get byte in array\n    u8 bit = flag % 8;   //get bit in byte\n    u8 mask = 1 << bit;\n\n    return (gSaveBlock1Ptr->masterTrainerFlags[index] & mask) != 0;\n}\n\nbool8 SetMasterTrainerFlag(u16 flag)\n{\n    u8 index = flag / 8; //get byte in array\n    u8 bit = flag % 8;   //get bit in byte\n    u8 mask = 1 << bit;\n\n    gSaveBlock1Ptr->masterTrainerFlags[index] |= mask;\n}\n\nbool8 ClearMasterTrainerFlag(u16 flag)\n{\n    u8 index = flag / 8; //get byte in array\n    u8 bit = flag % 8;   //get bit in byte\n    u8 mask = 1 << bit;\n\n    gSaveBlock1Ptr->masterTrainerFlags[index] &= ~mask;\n}"
  },
  {
    "path": "src/event_object_lock.c",
    "content": "#include \"global.h\"\n#include \"task.h\"\n#include \"field_player_avatar.h\"\n#include \"event_object_movement.h\"\n#include \"script_movement.h\"\n#include \"event_data.h\"\n#include \"constants/event_objects.h\"\n\nbool8 walkrun_is_standing_still(void)\n{\n    if (gPlayerAvatar.tileTransitionState == 1)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nvoid Task_WaitPlayerStopMoving(u8 taskId)\n{\n    if (walkrun_is_standing_still())\n    {\n        HandleEnforcedLookDirectionOnPlayerStopMoving();\n        DestroyTask(taskId);\n    }\n}\n\nbool8 IsFreezePlayerFinished(void)\n{\n    if (FuncIsActiveTask(Task_WaitPlayerStopMoving))\n        return FALSE;\n    else\n    {\n        StopPlayerAvatar();\n        return TRUE;\n    }\n}\n\nvoid FreezeObjects_WaitForPlayer(void)\n{\n    FreezeObjectEvents();\n    CreateTask(Task_WaitPlayerStopMoving, 80);\n}\n\nvoid Task_WaitPlayerAndTargetNPCStopMoving(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (task->data[0] == 0 && walkrun_is_standing_still() == TRUE)\n    {\n        HandleEnforcedLookDirectionOnPlayerStopMoving();\n        task->data[0] = 1;\n    }\n\n    if (task->data[1] == 0 && !gObjectEvents[gSelectedObjectEvent].singleMovementActive)\n    {\n        FreezeObjectEvent(&gObjectEvents[gSelectedObjectEvent]);\n        task->data[1] = 1;\n    }\n\n    if (task->data[0] && task->data[1])\n        DestroyTask(taskId);\n}\n\nbool8 IsFreezeSelectedObjectAndPlayerFinished(void)\n{\n    if (FuncIsActiveTask(Task_WaitPlayerAndTargetNPCStopMoving))\n        return FALSE;\n    else\n    {\n        StopPlayerAvatar();\n        return TRUE;\n    }\n}\n\nvoid FreezeObjects_WaitForPlayerAndSelected(void)\n{\n    u8 taskId;\n\n    FreezeObjectEventsExceptOne(gSelectedObjectEvent);\n    taskId = CreateTask(Task_WaitPlayerAndTargetNPCStopMoving, 80);\n    if (!gObjectEvents[gSelectedObjectEvent].singleMovementActive)\n    {\n        FreezeObjectEvent(&gObjectEvents[gSelectedObjectEvent]);\n        gTasks[taskId].data[1] = 1;\n    }\n}\n\nvoid ClearPlayerHeldMovementAndUnfreezeObjectEvents(void)\n{\n    u8 objectEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0);\n    ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objectEventId]);\n    ScriptMovement_UnfreezeObjectEvents();\n    UnfreezeObjectEvents();\n}\n\nvoid UnionRoom_UnlockPlayerAndChatPartner(void)\n{\n    u8 objectEventId;\n    if (gObjectEvents[gSelectedObjectEvent].active)\n        ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSelectedObjectEvent]);\n    objectEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0);\n    ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objectEventId]);\n    ScriptMovement_UnfreezeObjectEvents();\n    UnfreezeObjectEvents();\n}\n\nvoid Script_FacePlayer(void)\n{\n    ObjectEventFaceOppositeDirection(&gObjectEvents[gSelectedObjectEvent], gSpecialVar_Facing);\n}\n\nvoid Script_ClearHeldMovement(void)\n{\n    ObjectEventClearHeldMovementIfActive(&gObjectEvents[gSelectedObjectEvent]);\n}\n"
  },
  {
    "path": "src/event_object_movement.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"faraway_island.h\"\n#include \"field_camera.h\"\n#include \"field_control_avatar.h\"\n#include \"field_effect.h\"\n#include \"field_effect_helpers.h\"\n#include \"field_player_avatar.h\"\n#include \"fieldmap.h\"\n#include \"metatile_behavior.h\"\n#include \"overworld.h\"\n#include \"quest_log.h\"\n#include \"random.h\"\n#include \"script.h\"\n#include \"trainer_see.h\"\n#include \"trig.h\"\n#include \"constants/maps.h\"\n#include \"constants/event_object_movement.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/trainer_types.h\"\n#include \"constants/union_room.h\"\n\nstatic void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16);\nstatic bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *);\nstatic u8 GetCollisionInDirection(struct ObjectEvent *, u8);\nstatic u32 GetCopyDirection(u8, u32, u32);\nstatic void TryEnableObjectEventAnim(struct ObjectEvent *, struct Sprite *);\nstatic void ObjectEventExecHeldMovementAction(struct ObjectEvent *, struct Sprite *);\nstatic void UpdateObjectEventSpriteAnimPause(struct ObjectEvent *, struct Sprite *);\nstatic bool8 IsCoordOutsideObjectEventMovementRange(struct ObjectEvent *, s16, s16);\nstatic bool8 IsMetatileDirectionallyImpassable(struct ObjectEvent *, s16, s16, u8);\nstatic bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *, s16, s16);\nstatic void CalcWhetherObjectIsOffscreen(struct ObjectEvent *, struct Sprite *);\nstatic void UpdateObjEventSpriteVisibility(struct ObjectEvent *, struct Sprite *);\nstatic void ObjectEventUpdateMetatileBehaviors(struct ObjectEvent *);\nstatic void GetGroundEffectFlags_Reflection(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_TallGrassOnSpawn(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_LongGrassOnSpawn(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_SandHeap(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_ShallowFlowingWater(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_ShortGrass(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_HotSprings(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_TallGrassOnBeginStep(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_LongGrassOnBeginStep(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_Tracks(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_Puddle(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_Ripple(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_Seaweed(struct ObjectEvent *, u32 *);\nstatic void GetGroundEffectFlags_JumpLanding(struct ObjectEvent *, u32 *);\nstatic u8 ObjectEventCheckForReflectiveSurface(struct ObjectEvent *);\nstatic u8 GetReflectionTypeByMetatileBehavior(u32);\nstatic void InitObjectPriorityByElevation(struct Sprite *sprite, u8 elevation);\nstatic void ObjectEventUpdateSubpriority(struct ObjectEvent *, struct Sprite *);\nstatic void DoTracksGroundEffect_None(struct ObjectEvent *, struct Sprite *, u8);\nstatic void DoTracksGroundEffect_Footprints(struct ObjectEvent *, struct Sprite *, u8);\nstatic void DoTracksGroundEffect_BikeTireTracks(struct ObjectEvent *, struct Sprite *, u8);\nstatic void DoRippleFieldEffect(struct ObjectEvent *, struct Sprite *);\nstatic void DoGroundEffects_OnSpawn(struct ObjectEvent *, struct Sprite *);\nstatic void DoGroundEffects_OnBeginStep(struct ObjectEvent *, struct Sprite *);\nstatic void DoGroundEffects_OnFinishStep(struct ObjectEvent *, struct Sprite *);\nstatic void CreateReflectionEffectSprites(void);\nstatic u8 GetObjectEventIdByLocalId(u8);\nstatic u8 GetObjectEventIdByLocalIdAndMapInternal(u8, u8, u8);\nstatic bool8 GetAvailableObjectEventId(u16, u8, u8, u8 *);\nstatic void SetObjectEventDynamicGraphicsId(struct ObjectEvent *);\nstatic void RemoveObjectEventInternal(struct ObjectEvent *);\nstatic u16 GetObjectEventFlagIdByObjectEventId(u8);\nstatic void UpdateObjectEventVisibility(struct ObjectEvent *, struct Sprite *);\nstatic void MakeObjectTemplateFromObjectEventTemplate(const struct ObjectEventTemplate *, struct SpriteTemplate *, const struct SubspriteTable **);\nstatic void GetObjectEventMovingCameraOffset(s16 *, s16 *);\nstatic const struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8, u8, u8);\nstatic void LoadObjectEventPalette(u16);\nstatic void RemoveObjectEventIfOutsideView(struct ObjectEvent *);\nstatic void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y);\nstatic void SetPlayerAvatarObjectEventIdAndObjectId(u8, u8);\nstatic void ResetObjectEventFldEffData(struct ObjectEvent *);\nstatic u8 TryLoadObjectPalette(const struct SpritePalette *spritePalette);\nstatic u8 FindObjectEventPaletteIndexByTag(u16);\nstatic bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *, u8);\nstatic bool8 IsElevationMismatchAt(u8 elevation, s16 x, s16 y);\nstatic bool8 AreElevationsCompatible(u8 a, u8 b);\nstatic void ObjectCB_CameraObject(struct Sprite *);\nstatic void CameraObject_0(struct Sprite *);\nstatic void CameraObject_1(struct Sprite *);\nstatic void CameraObject_2(struct Sprite *);\nstatic const struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8 localId, const struct ObjectEventTemplate *templates, u8 count);\nstatic void ClearObjectEventMovement(struct ObjectEvent *, struct Sprite *);\nstatic void ObjectEventSetSingleMovement(struct ObjectEvent *, struct Sprite *, u8);\nstatic bool8 ShouldInitObjectEventStateFromTemplate(const struct ObjectEventTemplate *, u8, s16, s16);\nstatic bool8 TemplateIsObstacleAndWithinView(const struct ObjectEventTemplate *, s16, s16);\nstatic bool8 TemplateIsObstacleAndVisibleFromConnectingMap(const struct ObjectEventTemplate *, s16, s16);\nstatic void SetHideObstacleFlag(const struct ObjectEventTemplate *);\nstatic bool8 MovementType_Disguise_Callback(struct ObjectEvent *, struct Sprite *);\nstatic bool8 MovementType_Buried_Callback(struct ObjectEvent *, struct Sprite *);\nstatic u8 MovementType_RaiseHandAndStop_Callback(struct ObjectEvent *, struct Sprite *);\nstatic u8 MovementType_RaiseHandAndJump_Callback(struct ObjectEvent *, struct Sprite *);\nstatic u8 MovementType_RaiseHandAndSwim_Callback(struct ObjectEvent *, struct Sprite *);\nstatic void QuestLogObjectEventExecHeldMovementAction(struct ObjectEvent *, struct Sprite *);\nstatic void VirtualObject_UpdateAnim(struct Sprite *sprite);\nstatic void MovementType_None(struct Sprite *);\nstatic void MovementType_LookAround(struct Sprite *);\nstatic void MovementType_WanderAround(struct Sprite *);\nstatic void MovementType_WanderUpAndDown(struct Sprite *);\nstatic void MovementType_WanderLeftAndRight(struct Sprite *);\nstatic void MovementType_FaceDirection(struct Sprite *);\nstatic void MovementType_FaceDownAndUp(struct Sprite *);\nstatic void MovementType_FaceLeftAndRight(struct Sprite *);\nstatic void MovementType_FaceUpAndLeft(struct Sprite *);\nstatic void MovementType_FaceUpAndRight(struct Sprite *);\nstatic void MovementType_FaceDownAndLeft(struct Sprite *);\nstatic void MovementType_FaceDownAndRight(struct Sprite *);\nstatic void MovementType_FaceDownUpAndLeft(struct Sprite *);\nstatic void MovementType_FaceDownUpAndRight(struct Sprite *);\nstatic void MovementType_FaceUpRightAndLeft(struct Sprite *);\nstatic void MovementType_FaceDownRightAndLeft(struct Sprite *);\nstatic void MovementType_RotateCounterclockwise(struct Sprite *);\nstatic void MovementType_RotateClockwise(struct Sprite *);\nstatic void MovementType_WalkBackAndForth(struct Sprite *);\nstatic void MovementType_WalkSequenceUpRightLeftDown(struct Sprite *);\nstatic void MovementType_WalkSequenceRightLeftDownUp(struct Sprite *);\nstatic void MovementType_WalkSequenceDownUpRightLeft(struct Sprite *);\nstatic void MovementType_WalkSequenceLeftDownUpRight(struct Sprite *);\nstatic void MovementType_WalkSequenceUpLeftRightDown(struct Sprite *);\nstatic void MovementType_WalkSequenceLeftRightDownUp(struct Sprite *);\nstatic void MovementType_WalkSequenceDownUpLeftRight(struct Sprite *);\nstatic void MovementType_WalkSequenceRightDownUpLeft(struct Sprite *);\nstatic void MovementType_WalkSequenceLeftUpDownRight(struct Sprite *);\nstatic void MovementType_WalkSequenceUpDownRightLeft(struct Sprite *);\nstatic void MovementType_WalkSequenceRightLeftUpDown(struct Sprite *);\nstatic void MovementType_WalkSequenceDownRightLeftUp(struct Sprite *);\nstatic void MovementType_WalkSequenceRightUpDownLeft(struct Sprite *);\nstatic void MovementType_WalkSequenceUpDownLeftRight(struct Sprite *);\nstatic void MovementType_WalkSequenceLeftRightUpDown(struct Sprite *);\nstatic void MovementType_WalkSequenceDownLeftRightUp(struct Sprite *);\nstatic void MovementType_WalkSequenceUpLeftDownRight(struct Sprite *);\nstatic void MovementType_WalkSequenceDownRightUpLeft(struct Sprite *);\nstatic void MovementType_WalkSequenceLeftDownRightUp(struct Sprite *);\nstatic void MovementType_WalkSequenceRightUpLeftDown(struct Sprite *);\nstatic void MovementType_WalkSequenceUpRightDownLeft(struct Sprite *);\nstatic void MovementType_WalkSequenceDownLeftUpRight(struct Sprite *);\nstatic void MovementType_WalkSequenceLeftUpRightDown(struct Sprite *);\nstatic void MovementType_WalkSequenceRightDownLeftUp(struct Sprite *);\nstatic void MovementType_CopyPlayer(struct Sprite *);\nstatic void MovementType_TreeDisguise(struct Sprite *);\nstatic void MovementType_MountainDisguise(struct Sprite *);\nstatic void MovementType_CopyPlayerInGrass(struct Sprite *);\nstatic void MovementType_Buried(struct Sprite *);\nstatic void MovementType_WalkInPlace(struct Sprite *);\nstatic void MovementType_WalkInPlaceFast(struct Sprite *);\nstatic void MovementType_JogInPlace(struct Sprite *);\nstatic void MovementType_Invisible(struct Sprite *);\nstatic void MovementType_RaiseHandAndStop(struct Sprite *);\nstatic void MovementType_RaiseHandAndJump(struct Sprite *);\nstatic void MovementType_RaiseHandAndSwim(struct Sprite *);\nstatic void MovementType_WanderAroundSlower(struct Sprite *);\n\nenum {\n    MOVE_SPEED_NORMAL, // walking\n    MOVE_SPEED_FAST_1, // running / surfing / sliding (ice tile)\n    MOVE_SPEED_FAST_2, // water current / bicycle\n    MOVE_SPEED_FASTER, // going down cycling road on bicycle\n    MOVE_SPEED_FASTEST,\n};\n\nenum {\n    JUMP_DISTANCE_IN_PLACE,\n    JUMP_DISTANCE_NORMAL,\n    JUMP_DISTANCE_FAR,\n};\n\n#define movement_type_def(setup, table)                                                          \\\nstatic u8 setup##_callback(struct ObjectEvent *, struct Sprite *);                               \\\nvoid setup(struct Sprite *sprite)                                                                \\\n{                                                                                                \\\n    UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, setup##_callback); \\\n}                                                                                                \\\nstatic u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprite)               \\\n{                                                                                                \\\n    return table[sprite->data[1]](objectEvent, sprite);                                          \\\n}\n\n#define movement_type_empty_callback(setup)                                                      \\\nstatic u8 setup##_callback(struct ObjectEvent *, struct Sprite *);                               \\\nvoid setup(struct Sprite *sprite)                                                                \\\n{                                                                                                \\\n    UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, setup##_callback); \\\n}                                                                                                \\\nstatic u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprite)               \\\n{                                                                                                \\\n    return 0;                                                                                    \\\n}\n\nEWRAM_DATA u8 sCurrentReflectionType = 0;\nEWRAM_DATA u16 sCurrentSpecialObjectPaletteTag = 0;\n\nconst u8 gReflectionEffectPaletteMap[16] = {\n    [PALSLOT_PLAYER]                 = PALSLOT_PLAYER_REFLECTION,\n    [PALSLOT_PLAYER_REFLECTION]      = PALSLOT_PLAYER_REFLECTION,\n    [PALSLOT_NPC_1]                  = PALSLOT_NPC_1_REFLECTION,\n    [PALSLOT_NPC_2]                  = PALSLOT_NPC_2_REFLECTION,\n    [PALSLOT_NPC_3]                  = PALSLOT_NPC_3_REFLECTION,\n    [PALSLOT_NPC_4]                  = PALSLOT_NPC_4_REFLECTION,\n    [PALSLOT_NPC_1_REFLECTION]       = PALSLOT_NPC_1_REFLECTION,\n    [PALSLOT_NPC_2_REFLECTION]       = PALSLOT_NPC_2_REFLECTION,\n    [PALSLOT_NPC_3_REFLECTION]       = PALSLOT_NPC_3_REFLECTION,\n    [PALSLOT_NPC_4_REFLECTION]       = PALSLOT_NPC_4_REFLECTION,\n    [PALSLOT_NPC_SPECIAL]            = PALSLOT_NPC_SPECIAL_REFLECTION,\n    [PALSLOT_NPC_SPECIAL_REFLECTION] = PALSLOT_NPC_SPECIAL_REFLECTION\n};\n\nstatic const struct SpriteTemplate gCameraSpriteTemplate = {\n    .tileTag = 0, \n    .paletteTag = TAG_NONE,\n    .oam = &gDummyOamData, \n    .anims = gDummySpriteAnimTable, \n    .images = NULL, \n    .affineAnims = gDummySpriteAffineAnimTable, \n    .callback = ObjectCB_CameraObject\n};\n\nvoid (*const gCameraObjectFuncs[])(struct Sprite *) = {\n    CameraObject_0,\n    CameraObject_1,\n    CameraObject_2,\n};\n\n#include \"data/object_events/object_event_graphics.h\"\n\nstatic void (*const sMovementTypeCallbacks[MOVEMENT_TYPES_COUNT])(struct Sprite *) = {\n    [MOVEMENT_TYPE_NONE]                                  = MovementType_None,\n    [MOVEMENT_TYPE_LOOK_AROUND]                           = MovementType_LookAround,\n    [MOVEMENT_TYPE_WANDER_AROUND]                         = MovementType_WanderAround,\n    [MOVEMENT_TYPE_WANDER_UP_AND_DOWN]                    = MovementType_WanderUpAndDown,\n    [MOVEMENT_TYPE_WANDER_DOWN_AND_UP]                    = MovementType_WanderUpAndDown,\n    [MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT]                 = MovementType_WanderLeftAndRight,\n    [MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT]                 = MovementType_WanderLeftAndRight,\n    [MOVEMENT_TYPE_FACE_UP]                               = MovementType_FaceDirection,\n    [MOVEMENT_TYPE_FACE_DOWN]                             = MovementType_FaceDirection,\n    [MOVEMENT_TYPE_FACE_LEFT]                             = MovementType_FaceDirection,\n    [MOVEMENT_TYPE_FACE_RIGHT]                            = MovementType_FaceDirection,\n    [MOVEMENT_TYPE_PLAYER]                                = MovementType_Player,\n    [MOVEMENT_TYPE_BERRY_TREE_GROWTH]                     = NULL,\n    [MOVEMENT_TYPE_FACE_DOWN_AND_UP]                      = MovementType_FaceDownAndUp,\n    [MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT]                   = MovementType_FaceLeftAndRight,\n    [MOVEMENT_TYPE_FACE_UP_AND_LEFT]                      = MovementType_FaceUpAndLeft,\n    [MOVEMENT_TYPE_FACE_UP_AND_RIGHT]                     = MovementType_FaceUpAndRight,\n    [MOVEMENT_TYPE_FACE_DOWN_AND_LEFT]                    = MovementType_FaceDownAndLeft,\n    [MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT]                   = MovementType_FaceDownAndRight,\n    [MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT]                 = MovementType_FaceDownUpAndLeft,\n    [MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT]                = MovementType_FaceDownUpAndRight,\n    [MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT]                = MovementType_FaceUpRightAndLeft,\n    [MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT]              = MovementType_FaceDownRightAndLeft,\n    [MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE]               = MovementType_RotateCounterclockwise,\n    [MOVEMENT_TYPE_ROTATE_CLOCKWISE]                      = MovementType_RotateClockwise,\n    [MOVEMENT_TYPE_WALK_UP_AND_DOWN]                      = MovementType_WalkBackAndForth,\n    [MOVEMENT_TYPE_WALK_DOWN_AND_UP]                      = MovementType_WalkBackAndForth,\n    [MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT]                   = MovementType_WalkBackAndForth,\n    [MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT]                   = MovementType_WalkBackAndForth,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN]      = MovementType_WalkSequenceUpRightLeftDown,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP]      = MovementType_WalkSequenceRightLeftDownUp,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT]      = MovementType_WalkSequenceDownUpRightLeft,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT]      = MovementType_WalkSequenceLeftDownUpRight,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN]      = MovementType_WalkSequenceUpLeftRightDown,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP]      = MovementType_WalkSequenceLeftRightDownUp,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT]      = MovementType_WalkSequenceDownUpLeftRight,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT]      = MovementType_WalkSequenceRightDownUpLeft,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT]      = MovementType_WalkSequenceLeftUpDownRight,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT]      = MovementType_WalkSequenceUpDownRightLeft,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN]      = MovementType_WalkSequenceRightLeftUpDown,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP]      = MovementType_WalkSequenceDownRightLeftUp,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT]      = MovementType_WalkSequenceRightUpDownLeft,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT]      = MovementType_WalkSequenceUpDownLeftRight,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN]      = MovementType_WalkSequenceLeftRightUpDown,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP]      = MovementType_WalkSequenceDownLeftRightUp,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT]      = MovementType_WalkSequenceUpLeftDownRight,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT]      = MovementType_WalkSequenceDownRightUpLeft,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP]      = MovementType_WalkSequenceLeftDownRightUp,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN]      = MovementType_WalkSequenceRightUpLeftDown,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT]      = MovementType_WalkSequenceUpRightDownLeft,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT]      = MovementType_WalkSequenceDownLeftUpRight,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN]      = MovementType_WalkSequenceLeftUpRightDown,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP]      = MovementType_WalkSequenceRightDownLeftUp,\n    [MOVEMENT_TYPE_COPY_PLAYER]                           = MovementType_CopyPlayer,\n    [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE]                  = MovementType_CopyPlayer,\n    [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE]          = MovementType_CopyPlayer,\n    [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE]                 = MovementType_CopyPlayer,\n    [MOVEMENT_TYPE_TREE_DISGUISE]                         = MovementType_TreeDisguise,\n    [MOVEMENT_TYPE_MOUNTAIN_DISGUISE]                     = MovementType_MountainDisguise,\n    [MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS]                  = MovementType_CopyPlayerInGrass,\n    [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS]         = MovementType_CopyPlayerInGrass,\n    [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = MovementType_CopyPlayerInGrass,\n    [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS]        = MovementType_CopyPlayerInGrass,\n    [MOVEMENT_TYPE_BURIED]                                = MovementType_Buried,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_DOWN]                    = MovementType_WalkInPlace,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_UP]                      = MovementType_WalkInPlace,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_LEFT]                    = MovementType_WalkInPlace,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT]                   = MovementType_WalkInPlace,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_DOWN]               = MovementType_WalkInPlaceFast,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_UP]                 = MovementType_WalkInPlaceFast,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_LEFT]               = MovementType_WalkInPlaceFast,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_RIGHT]              = MovementType_WalkInPlaceFast,\n    [MOVEMENT_TYPE_JOG_IN_PLACE_DOWN]                     = MovementType_JogInPlace,\n    [MOVEMENT_TYPE_JOG_IN_PLACE_UP]                       = MovementType_JogInPlace,\n    [MOVEMENT_TYPE_JOG_IN_PLACE_LEFT]                     = MovementType_JogInPlace,\n    [MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT]                    = MovementType_JogInPlace,\n    [MOVEMENT_TYPE_INVISIBLE]                             = MovementType_Invisible,\n    [MOVEMENT_TYPE_RAISE_HAND_AND_STOP]                   = MovementType_RaiseHandAndStop,\n    [MOVEMENT_TYPE_RAISE_HAND_AND_JUMP]                   = MovementType_RaiseHandAndJump,\n    [MOVEMENT_TYPE_RAISE_HAND_AND_SWIM]                   = MovementType_RaiseHandAndSwim,\n    [MOVEMENT_TYPE_WANDER_AROUND_SLOWER]                  = MovementType_WanderAroundSlower,\n};\n\nstatic const bool8 gRangedMovementTypes[MOVEMENT_TYPES_COUNT] = {\n    [MOVEMENT_TYPE_WANDER_AROUND] = TRUE,\n    [MOVEMENT_TYPE_WANDER_UP_AND_DOWN] = TRUE,\n    [MOVEMENT_TYPE_WANDER_DOWN_AND_UP] = TRUE,\n    [MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT] = TRUE,\n    [MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT] = TRUE,\n    [MOVEMENT_TYPE_WALK_UP_AND_DOWN] = TRUE,\n    [MOVEMENT_TYPE_WALK_DOWN_AND_UP] = TRUE,\n    [MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT] = TRUE,\n    [MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN] = TRUE,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP] = TRUE,\n    [MOVEMENT_TYPE_COPY_PLAYER] = TRUE,\n    [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE] = TRUE,\n    [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE] = TRUE,\n    [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE] = TRUE,\n    [MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS] = TRUE,\n    [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = TRUE,\n    [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = TRUE,\n    [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = TRUE,\n    [MOVEMENT_TYPE_WANDER_AROUND_SLOWER] = TRUE,\n};\n\nstatic const u8 gInitialMovementTypeFacingDirections[MOVEMENT_TYPES_COUNT] = {\n    [MOVEMENT_TYPE_NONE] = DIR_SOUTH,\n    [MOVEMENT_TYPE_LOOK_AROUND] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WANDER_AROUND] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WANDER_UP_AND_DOWN] = DIR_NORTH,\n    [MOVEMENT_TYPE_WANDER_DOWN_AND_UP] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT] = DIR_WEST,\n    [MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT] = DIR_EAST,\n    [MOVEMENT_TYPE_FACE_UP] = DIR_NORTH,\n    [MOVEMENT_TYPE_FACE_DOWN] = DIR_SOUTH,\n    [MOVEMENT_TYPE_FACE_LEFT] = DIR_WEST,\n    [MOVEMENT_TYPE_FACE_RIGHT] = DIR_EAST,\n    [MOVEMENT_TYPE_PLAYER] = DIR_SOUTH,\n    [MOVEMENT_TYPE_BERRY_TREE_GROWTH] = DIR_SOUTH,\n    [MOVEMENT_TYPE_FACE_DOWN_AND_UP] = DIR_SOUTH,\n    [MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT] = DIR_WEST,\n    [MOVEMENT_TYPE_FACE_UP_AND_LEFT] = DIR_NORTH,\n    [MOVEMENT_TYPE_FACE_UP_AND_RIGHT] = DIR_NORTH,\n    [MOVEMENT_TYPE_FACE_DOWN_AND_LEFT] = DIR_SOUTH,\n    [MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT] = DIR_SOUTH,\n    [MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT] = DIR_SOUTH,\n    [MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT] = DIR_SOUTH,\n    [MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT] = DIR_NORTH,\n    [MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT] = DIR_SOUTH,\n    [MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE] = DIR_SOUTH,\n    [MOVEMENT_TYPE_ROTATE_CLOCKWISE] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WALK_UP_AND_DOWN] = DIR_NORTH,\n    [MOVEMENT_TYPE_WALK_DOWN_AND_UP] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT] = DIR_WEST,\n    [MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT] = DIR_EAST,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN] = DIR_NORTH,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP] = DIR_EAST,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT] = DIR_WEST,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN] = DIR_NORTH,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP] = DIR_WEST,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT] = DIR_EAST,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT] = DIR_WEST,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT] = DIR_NORTH,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN] = DIR_EAST,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT] = DIR_EAST,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT] = DIR_NORTH,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN] = DIR_WEST,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT] = DIR_NORTH,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP] = DIR_WEST,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN] = DIR_EAST,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT] = DIR_NORTH,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN] = DIR_WEST,\n    [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP] = DIR_EAST,\n    [MOVEMENT_TYPE_COPY_PLAYER] = DIR_NORTH,\n    [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE] = DIR_SOUTH,\n    [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE] = DIR_WEST,\n    [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE] = DIR_EAST,\n    [MOVEMENT_TYPE_TREE_DISGUISE] = DIR_SOUTH,\n    [MOVEMENT_TYPE_MOUNTAIN_DISGUISE] = DIR_SOUTH,\n    [MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS] = DIR_NORTH,\n    [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = DIR_SOUTH,\n    [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = DIR_WEST,\n    [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = DIR_EAST,\n    [MOVEMENT_TYPE_BURIED] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_DOWN] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_UP] = DIR_NORTH,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_LEFT] = DIR_WEST,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT] = DIR_EAST,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_DOWN] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_UP] = DIR_NORTH,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_LEFT] = DIR_WEST,\n    [MOVEMENT_TYPE_WALK_IN_PLACE_FAST_RIGHT] = DIR_EAST,\n    [MOVEMENT_TYPE_JOG_IN_PLACE_DOWN] = DIR_SOUTH,\n    [MOVEMENT_TYPE_JOG_IN_PLACE_UP] = DIR_NORTH,\n    [MOVEMENT_TYPE_JOG_IN_PLACE_LEFT] = DIR_WEST,\n    [MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT] = DIR_EAST,\n    [MOVEMENT_TYPE_INVISIBLE] = DIR_SOUTH,\n    [MOVEMENT_TYPE_RAISE_HAND_AND_STOP] = DIR_SOUTH,\n    [MOVEMENT_TYPE_RAISE_HAND_AND_JUMP] = DIR_SOUTH,\n    [MOVEMENT_TYPE_RAISE_HAND_AND_SWIM] = DIR_SOUTH,\n    [MOVEMENT_TYPE_WANDER_AROUND_SLOWER] = DIR_SOUTH,\n};\n\n#define OBJ_EVENT_PAL_TAG_PLAYER_RED                  0x1100\n#define OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION       0x1101\n#define OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION           0x1102\n#define OBJ_EVENT_PAL_TAG_NPC_BLUE                    0x1103\n#define OBJ_EVENT_PAL_TAG_NPC_PINK                    0x1104\n#define OBJ_EVENT_PAL_TAG_NPC_GREEN                   0x1105\n#define OBJ_EVENT_PAL_TAG_NPC_WHITE                   0x1106\n#define OBJ_EVENT_PAL_TAG_NPC_BLUE_REFLECTION         0x1107\n#define OBJ_EVENT_PAL_TAG_NPC_PINK_REFLECTION         0x1108\n#define OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION        0x1109\n#define OBJ_EVENT_PAL_TAG_NPC_WHITE_REFLECTION        0x110A\n#define OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP             0x110B\n#define OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP_REFLECTION  0x110C\n#define OBJ_EVENT_PAL_TAG_RS_TRUCK                    0x110D\n#define OBJ_EVENT_PAL_TAG_RS_MACHOKE                  0x110E\n#define OBJ_EVENT_PAL_TAG_RS_POOCHYENA                0x110F\n#define OBJ_EVENT_PAL_TAG_PLAYER_GREEN                0x1110\n#define OBJ_EVENT_PAL_TAG_PLAYER_GREEN_REFLECTION     0x1111\n#define OBJ_EVENT_PAL_TAG_RS_MOVING_BOX               0x1112\n#define OBJ_EVENT_PAL_TAG_METEORITE                   0x1113\n#define OBJ_EVENT_PAL_TAG_SEAGALLOP                   0x1114\n#define OBJ_EVENT_PAL_TAG_SS_ANNE                     0x1115\n#define OBJ_EVENT_PAL_TAG_RS_PLAYER_UNDERWATER        0x1116\n#define OBJ_EVENT_PAL_TAG_RS_KYOGRE                   0x1117\n#define OBJ_EVENT_PAL_TAG_RS_KYOGRE_REFLECTION        0x1118\n#define OBJ_EVENT_PAL_TAG_RS_GROUDON                  0x1119\n#define OBJ_EVENT_PAL_TAG_RS_GROUDON_REFLECTION       0x111A\n#define OBJ_EVENT_PAL_TAG_RS_SUBMARINE_SHADOW         0x111B\n#define OBJ_EVENT_PAL_TAG_27 0x111C\n#define OBJ_EVENT_PAL_TAG_28 0x111D\n#define OBJ_EVENT_PAL_TAG_29 0x111E\n#define OBJ_EVENT_PAL_TAG_CABLE_CAR 0x111F\n#define OBJ_EVENT_PAL_TAG_31 0x1120\n#define OBJ_EVENT_PAL_TAG_32 0x1121\n#define OBJ_EVENT_PAL_TAG_33 0x1122\n#define OBJ_EVENT_PAL_TAG_34 0x1123\n#define OBJ_EVENT_PAL_TAG_LADY 0x1124\n#define OBJ_EVENT_PAL_TAG_NONE 0x11FF\n\n#include \"data/object_events/object_event_graphics_info_pointers.h\"\n#include \"data/field_effects/field_effect_object_template_pointers.h\"\n#include \"data/object_events/object_event_pic_tables.h\"\n#include \"data/object_events/object_event_anims.h\"\n#include \"data/object_events/base_oam.h\"\n#include \"data/object_events/object_event_subsprites.h\"\n#include \"data/object_events/object_event_graphics_info.h\"\n\nstatic const struct SpritePalette sObjectEventSpritePalettes[] = {\n    {gObjectEventPal_NpcBlue,                 OBJ_EVENT_PAL_TAG_NPC_BLUE},\n    {gObjectEventPal_NpcPink,                 OBJ_EVENT_PAL_TAG_NPC_PINK},\n    {gObjectEventPal_NpcGreen,                OBJ_EVENT_PAL_TAG_NPC_GREEN},\n    {gObjectEventPal_NpcWhite,                OBJ_EVENT_PAL_TAG_NPC_WHITE},\n    {gObjectEventPal_NpcBlueReflection,       OBJ_EVENT_PAL_TAG_NPC_BLUE_REFLECTION},\n    {gObjectEventPal_NpcPinkReflection,       OBJ_EVENT_PAL_TAG_NPC_PINK_REFLECTION},\n    {gObjectEventPal_NpcGreenReflection,      OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION},\n    {gObjectEventPal_NpcWhiteReflection,      OBJ_EVENT_PAL_TAG_NPC_WHITE_REFLECTION},\n    {gObjectEventPal_Player,                  OBJ_EVENT_PAL_TAG_PLAYER_RED},\n    {gObjectEventPal_PlayerReflection,        OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION},\n    {gObjectEventPal_BridgeReflection,        OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION},\n    {gObjectEventPal_RSQuintyPlump,           OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP},\n    {gObjectEventPal_RSQuintyPlumpReflection, OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP_REFLECTION},\n    {gObjectEventPal_Player,                  OBJ_EVENT_PAL_TAG_PLAYER_GREEN},\n    {gObjectEventPal_PlayerReflection,        OBJ_EVENT_PAL_TAG_PLAYER_GREEN_REFLECTION},\n    {gObjectEventPal_Meteorite,               OBJ_EVENT_PAL_TAG_METEORITE},\n    {gObjectEventPal_SSAnne,                  OBJ_EVENT_PAL_TAG_SS_ANNE},\n    {gObjectEventPal_Seagallop,               OBJ_EVENT_PAL_TAG_SEAGALLOP},\n    {gUnderwaterEventObjectPalette,           OBJ_EVENT_PAL_TAG_27},\n    {gEmBrendanPalette,                       OBJ_EVENT_PAL_TAG_28},\n    {gEmMayPalette,                           OBJ_EVENT_PAL_TAG_29},\n    {gObjectEventPal_CableCar,                OBJ_EVENT_PAL_TAG_CABLE_CAR},\n    {gObjectEventPal_Lady,                    OBJ_EVENT_PAL_TAG_LADY},\n    {},\n};\n\nstatic const u16 sPlayerReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION,\n    OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION,\n    OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION,\n    OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION,\n};\n\nstatic const u16 sUnusedPlayerReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_PLAYER_GREEN_REFLECTION,\n    OBJ_EVENT_PAL_TAG_PLAYER_GREEN_REFLECTION,\n    OBJ_EVENT_PAL_TAG_PLAYER_GREEN_REFLECTION,\n    OBJ_EVENT_PAL_TAG_PLAYER_GREEN_REFLECTION,\n};\n\nstatic const u16 sPlayerUnderwaterReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_RS_PLAYER_UNDERWATER,\n    OBJ_EVENT_PAL_TAG_RS_PLAYER_UNDERWATER,\n    OBJ_EVENT_PAL_TAG_RS_PLAYER_UNDERWATER,\n    OBJ_EVENT_PAL_TAG_RS_PLAYER_UNDERWATER,\n};\n\nstatic const struct PairedPalettes gPlayerReflectionPaletteSets[] = {\n    {OBJ_EVENT_PAL_TAG_PLAYER_RED,           sPlayerReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_PLAYER_GREEN,         sPlayerReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_RS_PLAYER_UNDERWATER, sPlayerUnderwaterReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_NONE, NULL},\n};\n\nstatic const u16 sRSQuintyPlumpReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP_REFLECTION,\n    OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP_REFLECTION,\n    OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP_REFLECTION,\n    OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP_REFLECTION,\n};\n\nstatic const u16 sRSTruckReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_RS_TRUCK,\n    OBJ_EVENT_PAL_TAG_RS_TRUCK,\n    OBJ_EVENT_PAL_TAG_RS_TRUCK,\n    OBJ_EVENT_PAL_TAG_RS_TRUCK,\n};\n\nstatic const u16 sRSMachokeReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_RS_MACHOKE,\n    OBJ_EVENT_PAL_TAG_RS_MACHOKE,\n    OBJ_EVENT_PAL_TAG_RS_MACHOKE,\n    OBJ_EVENT_PAL_TAG_RS_MACHOKE,\n};\n\nstatic const u16 sRSMovingBoxReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_RS_MOVING_BOX,\n    OBJ_EVENT_PAL_TAG_RS_MOVING_BOX,\n    OBJ_EVENT_PAL_TAG_RS_MOVING_BOX,\n    OBJ_EVENT_PAL_TAG_RS_MOVING_BOX,\n};\n\nstatic const u16 sMeteoriteReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_METEORITE,\n    OBJ_EVENT_PAL_TAG_METEORITE,\n    OBJ_EVENT_PAL_TAG_METEORITE,\n    OBJ_EVENT_PAL_TAG_METEORITE,\n};\n\nstatic const u16 sSeagallopReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_SEAGALLOP,\n    OBJ_EVENT_PAL_TAG_SEAGALLOP,\n    OBJ_EVENT_PAL_TAG_SEAGALLOP,\n    OBJ_EVENT_PAL_TAG_SEAGALLOP,\n};\n\nstatic const u16 sRSSubmarineShadowReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_RS_SUBMARINE_SHADOW,\n    OBJ_EVENT_PAL_TAG_RS_SUBMARINE_SHADOW,\n    OBJ_EVENT_PAL_TAG_RS_SUBMARINE_SHADOW,\n    OBJ_EVENT_PAL_TAG_RS_SUBMARINE_SHADOW,\n};\n\nstatic const u16 sRSKyogreReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_RS_KYOGRE_REFLECTION,\n    OBJ_EVENT_PAL_TAG_RS_KYOGRE_REFLECTION,\n    OBJ_EVENT_PAL_TAG_RS_KYOGRE_REFLECTION,\n    OBJ_EVENT_PAL_TAG_RS_KYOGRE_REFLECTION,\n};\n\nstatic const u16 sReflectionPaletteTags_CableCar[] = {\n    OBJ_EVENT_PAL_TAG_CABLE_CAR,\n    OBJ_EVENT_PAL_TAG_CABLE_CAR,\n    OBJ_EVENT_PAL_TAG_CABLE_CAR,\n    OBJ_EVENT_PAL_TAG_CABLE_CAR,\n};\n\nstatic const u16 sReflectionPaletteTags_Lady[] = {\n    OBJ_EVENT_PAL_TAG_LADY,\n    OBJ_EVENT_PAL_TAG_LADY,\n    OBJ_EVENT_PAL_TAG_LADY,\n    OBJ_EVENT_PAL_TAG_LADY,\n};\n\nstatic const u16 sRSGroudonReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_RS_GROUDON_REFLECTION,\n    OBJ_EVENT_PAL_TAG_RS_GROUDON_REFLECTION,\n    OBJ_EVENT_PAL_TAG_RS_GROUDON_REFLECTION,\n    OBJ_EVENT_PAL_TAG_RS_GROUDON_REFLECTION,\n};\n\nstatic const u16 sGreenNPCReflectionPaletteTags[] = {\n    OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION,\n};\n\nconst struct PairedPalettes gSpecialObjectReflectionPaletteSets[] = {\n    {OBJ_EVENT_PAL_TAG_PLAYER_RED,          sPlayerReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_PLAYER_GREEN,        sPlayerReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_RS_QUINTY_PLUMP,     sRSQuintyPlumpReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_RS_TRUCK,            sRSTruckReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_RS_MACHOKE,          sRSMachokeReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_RS_MOVING_BOX,       sRSMovingBoxReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_METEORITE,           sMeteoriteReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_SEAGALLOP,           sSeagallopReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_RS_KYOGRE,           sRSKyogreReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_RS_GROUDON,          sRSGroudonReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_NPC_GREEN,           sGreenNPCReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_RS_SUBMARINE_SHADOW, sRSSubmarineShadowReflectionPaletteTags},\n    {OBJ_EVENT_PAL_TAG_CABLE_CAR,           sReflectionPaletteTags_CableCar},\n    {OBJ_EVENT_PAL_TAG_LADY,                sReflectionPaletteTags_Lady},\n    {OBJ_EVENT_PAL_TAG_NONE, NULL},\n};\n\nstatic const u16 sObjectPaletteTags0[] = {\n    OBJ_EVENT_PAL_TAG_PLAYER_RED,\n    OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_BLUE,\n    OBJ_EVENT_PAL_TAG_NPC_PINK,\n    OBJ_EVENT_PAL_TAG_NPC_GREEN,\n    OBJ_EVENT_PAL_TAG_NPC_WHITE,\n    OBJ_EVENT_PAL_TAG_NPC_BLUE_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_PINK_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_WHITE_REFLECTION,\n};\n\nstatic const u16 sObjectPaletteTags1[] = {\n    OBJ_EVENT_PAL_TAG_PLAYER_RED,\n    OBJ_EVENT_PAL_TAG_PLAYER_GREEN,\n    OBJ_EVENT_PAL_TAG_NPC_BLUE,\n    OBJ_EVENT_PAL_TAG_NPC_PINK,\n    OBJ_EVENT_PAL_TAG_NPC_GREEN,\n    OBJ_EVENT_PAL_TAG_NPC_WHITE,\n    OBJ_EVENT_PAL_TAG_NPC_BLUE_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_PINK_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_WHITE_REFLECTION,\n};\n\nstatic const u16 sObjectPaletteTags2[] = {\n    OBJ_EVENT_PAL_TAG_PLAYER_RED,\n    OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_BLUE,\n    OBJ_EVENT_PAL_TAG_NPC_PINK,\n    OBJ_EVENT_PAL_TAG_NPC_GREEN,\n    OBJ_EVENT_PAL_TAG_NPC_WHITE,\n    OBJ_EVENT_PAL_TAG_NPC_BLUE_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_PINK_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_WHITE_REFLECTION,\n};\n\nstatic const u16 sObjectPaletteTags3[] = {\n    OBJ_EVENT_PAL_TAG_PLAYER_RED,\n    OBJ_EVENT_PAL_TAG_PLAYER_RED_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_BLUE,\n    OBJ_EVENT_PAL_TAG_NPC_PINK,\n    OBJ_EVENT_PAL_TAG_NPC_GREEN,\n    OBJ_EVENT_PAL_TAG_NPC_WHITE,\n    OBJ_EVENT_PAL_TAG_NPC_BLUE_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_PINK_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_GREEN_REFLECTION,\n    OBJ_EVENT_PAL_TAG_NPC_WHITE_REFLECTION,\n};\n\nstatic const u16 *const gObjectPaletteTagSets[] = {\n    sObjectPaletteTags0,\n    sObjectPaletteTags1,\n    sObjectPaletteTags2,\n    sObjectPaletteTags3,\n};\n\n//#include \"data/object_events/berry_tree_graphics_tables.h\"\n#include \"data/field_effects/field_effect_objects.h\"\n\nstatic const s16 gMovementDelaysMedium[] = {32, 64,  96, 128};\nstatic const s16 gMovementDelaysLong[] =   {32, 64, 128, 192};\nstatic const s16 gMovementDelaysShort[] =  {32, 48,  64,  80};\n\n#include \"data/object_events/movement_type_func_tables.h\"\n\nstatic const u8 sFaceDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_STD_FACE_SOUTH,\n    [DIR_SOUTH]     = ANIM_STD_FACE_SOUTH,\n    [DIR_NORTH]     = ANIM_STD_FACE_NORTH,\n    [DIR_WEST]      = ANIM_STD_FACE_WEST,\n    [DIR_EAST]      = ANIM_STD_FACE_EAST,\n    [DIR_SOUTHWEST] = ANIM_STD_FACE_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_STD_FACE_SOUTH,\n    [DIR_NORTHWEST] = ANIM_STD_FACE_NORTH,\n    [DIR_NORTHEAST] = ANIM_STD_FACE_NORTH,\n};\n\nstatic const u8 sMoveDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_STD_GO_SOUTH,\n    [DIR_SOUTH]     = ANIM_STD_GO_SOUTH,\n    [DIR_NORTH]     = ANIM_STD_GO_NORTH,\n    [DIR_WEST]      = ANIM_STD_GO_WEST,\n    [DIR_EAST]      = ANIM_STD_GO_EAST,\n    [DIR_SOUTHWEST] = ANIM_STD_GO_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_STD_GO_SOUTH,\n    [DIR_NORTHWEST] = ANIM_STD_GO_NORTH,\n    [DIR_NORTHEAST] = ANIM_STD_GO_NORTH,\n};\n\nstatic const u8 sMoveDirectionFastAnimNums[] = {\n    [DIR_NONE]      = ANIM_STD_GO_FAST_SOUTH,\n    [DIR_SOUTH]     = ANIM_STD_GO_FAST_SOUTH,\n    [DIR_NORTH]     = ANIM_STD_GO_FAST_NORTH,\n    [DIR_WEST]      = ANIM_STD_GO_FAST_WEST,\n    [DIR_EAST]      = ANIM_STD_GO_FAST_EAST,\n    [DIR_SOUTHWEST] = ANIM_STD_GO_FAST_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_STD_GO_FAST_SOUTH,\n    [DIR_NORTHWEST] = ANIM_STD_GO_FAST_NORTH,\n    [DIR_NORTHEAST] = ANIM_STD_GO_FAST_NORTH,\n};\n\nstatic const u8 sMoveDirectionFasterAnimNums[] = {\n    [DIR_NONE]      = ANIM_STD_GO_FASTER_SOUTH,\n    [DIR_SOUTH]     = ANIM_STD_GO_FASTER_SOUTH,\n    [DIR_NORTH]     = ANIM_STD_GO_FASTER_NORTH,\n    [DIR_WEST]      = ANIM_STD_GO_FASTER_WEST,\n    [DIR_EAST]      = ANIM_STD_GO_FASTER_EAST,\n    [DIR_SOUTHWEST] = ANIM_STD_GO_FASTER_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_STD_GO_FASTER_SOUTH,\n    [DIR_NORTHWEST] = ANIM_STD_GO_FASTER_NORTH,\n    [DIR_NORTHEAST] = ANIM_STD_GO_FASTER_NORTH,\n};\n\nstatic const u8 sMoveDirectionFastestAnimNums[] = {\n    [DIR_NONE]      = ANIM_STD_GO_FASTEST_SOUTH,\n    [DIR_SOUTH]     = ANIM_STD_GO_FASTEST_SOUTH,\n    [DIR_NORTH]     = ANIM_STD_GO_FASTEST_NORTH,\n    [DIR_WEST]      = ANIM_STD_GO_FASTEST_WEST,\n    [DIR_EAST]      = ANIM_STD_GO_FASTEST_EAST,\n    [DIR_SOUTHWEST] = ANIM_STD_GO_FASTEST_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_STD_GO_FASTEST_SOUTH,\n    [DIR_NORTHWEST] = ANIM_STD_GO_FASTEST_NORTH,\n    [DIR_NORTHEAST] = ANIM_STD_GO_FASTEST_NORTH,\n};\n\nstatic const u8 sJumpSpecialDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_GET_ON_OFF_POKEMON_SOUTH,\n    [DIR_SOUTH]     = ANIM_GET_ON_OFF_POKEMON_SOUTH,\n    [DIR_NORTH]     = ANIM_GET_ON_OFF_POKEMON_NORTH,\n    [DIR_WEST]      = ANIM_GET_ON_OFF_POKEMON_WEST,\n    [DIR_EAST]      = ANIM_GET_ON_OFF_POKEMON_EAST,\n    [DIR_SOUTHWEST] = ANIM_GET_ON_OFF_POKEMON_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_GET_ON_OFF_POKEMON_SOUTH,\n    [DIR_NORTHWEST] = ANIM_GET_ON_OFF_POKEMON_NORTH,\n    [DIR_NORTHEAST] = ANIM_GET_ON_OFF_POKEMON_NORTH,\n};\n\nstatic const u8 sAcroBunnyHopBackWheelDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH,\n    [DIR_SOUTH]     = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH,\n    [DIR_NORTH]     = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH,\n    [DIR_WEST]      = ANIM_BUNNY_HOP_BACK_WHEEL_WEST,\n    [DIR_EAST]      = ANIM_BUNNY_HOP_BACK_WHEEL_EAST,\n    [DIR_SOUTHWEST] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH,\n    [DIR_NORTHWEST] = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH,\n    [DIR_NORTHEAST] = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH,\n};\n\nstatic const u8 sAcroBunnyHopFrontWheelDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH,\n    [DIR_SOUTH]     = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH,\n    [DIR_NORTH]     = ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH,\n    [DIR_WEST]      = ANIM_BUNNY_HOP_FRONT_WHEEL_WEST,\n    [DIR_EAST]      = ANIM_BUNNY_HOP_FRONT_WHEEL_EAST,\n    [DIR_SOUTHWEST] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH,\n    [DIR_NORTHWEST] = ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH,\n    [DIR_NORTHEAST] = ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH,\n};\n\nstatic const u8 sAcroStandingWheelieBackWheelDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH,\n    [DIR_SOUTH]     = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH,\n    [DIR_NORTH]     = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH,\n    [DIR_WEST]      = ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST,\n    [DIR_EAST]      = ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST,\n    [DIR_SOUTHWEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH,\n    [DIR_NORTHWEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH,\n    [DIR_NORTHEAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH,\n};\n\nstatic const u8 sSpinDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_SPIN_SOUTH,\n    [DIR_SOUTH]     = ANIM_SPIN_SOUTH,\n    [DIR_NORTH]     = ANIM_SPIN_NORTH,\n    [DIR_WEST]      = ANIM_SPIN_WEST,\n    [DIR_EAST]      = ANIM_SPIN_EAST,\n    [DIR_SOUTHWEST] = ANIM_SPIN_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_SPIN_NORTH,\n    [DIR_NORTHWEST] = ANIM_SPIN_WEST,\n    [DIR_NORTHEAST] = ANIM_SPIN_EAST,\n};\n\nstatic const u8 sAcroStandingWheelieFrontWheelDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH,\n    [DIR_SOUTH]     = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH,\n    [DIR_NORTH]     = ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH,\n    [DIR_WEST]      = ANIM_STANDING_WHEELIE_FRONT_WHEEL_WEST,\n    [DIR_EAST]      = ANIM_STANDING_WHEELIE_FRONT_WHEEL_EAST,\n    [DIR_SOUTHWEST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH,\n    [DIR_NORTHWEST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH,\n    [DIR_NORTHEAST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH,\n};\n\nstatic const u8 sAcroMovingWheelieDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_MOVING_WHEELIE_SOUTH,\n    [DIR_SOUTH]     = ANIM_MOVING_WHEELIE_SOUTH,\n    [DIR_NORTH]     = ANIM_MOVING_WHEELIE_NORTH,\n    [DIR_WEST]      = ANIM_MOVING_WHEELIE_WEST,\n    [DIR_EAST]      = ANIM_MOVING_WHEELIE_EAST,\n    [DIR_SOUTHWEST] = ANIM_MOVING_WHEELIE_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_MOVING_WHEELIE_SOUTH,\n    [DIR_NORTHWEST] = ANIM_MOVING_WHEELIE_NORTH,\n    [DIR_NORTHEAST] = ANIM_MOVING_WHEELIE_NORTH,\n};\n\nstatic const u8 sFishingDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_TAKE_OUT_ROD_SOUTH,\n    [DIR_SOUTH]     = ANIM_TAKE_OUT_ROD_SOUTH,\n    [DIR_NORTH]     = ANIM_TAKE_OUT_ROD_NORTH,\n    [DIR_WEST]      = ANIM_TAKE_OUT_ROD_WEST,\n    [DIR_EAST]      = ANIM_TAKE_OUT_ROD_EAST,\n    [DIR_SOUTHWEST] = ANIM_TAKE_OUT_ROD_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_TAKE_OUT_ROD_SOUTH,\n    [DIR_NORTHWEST] = ANIM_TAKE_OUT_ROD_NORTH,\n    [DIR_NORTHEAST] = ANIM_TAKE_OUT_ROD_NORTH,\n};\n\nstatic const u8 sFishingNoCatchDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_PUT_AWAY_ROD_SOUTH,\n    [DIR_SOUTH]     = ANIM_PUT_AWAY_ROD_SOUTH,\n    [DIR_NORTH]     = ANIM_PUT_AWAY_ROD_NORTH,\n    [DIR_WEST]      = ANIM_PUT_AWAY_ROD_WEST,\n    [DIR_EAST]      = ANIM_PUT_AWAY_ROD_EAST,\n    [DIR_SOUTHWEST] = ANIM_PUT_AWAY_ROD_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_PUT_AWAY_ROD_SOUTH,\n    [DIR_NORTHWEST] = ANIM_PUT_AWAY_ROD_NORTH,\n    [DIR_NORTHEAST] = ANIM_PUT_AWAY_ROD_NORTH,\n};\n\nstatic const u8 sFishingBiteDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_HOOKED_POKEMON_SOUTH,\n    [DIR_SOUTH]     = ANIM_HOOKED_POKEMON_SOUTH,\n    [DIR_NORTH]     = ANIM_HOOKED_POKEMON_NORTH,\n    [DIR_WEST]      = ANIM_HOOKED_POKEMON_WEST,\n    [DIR_EAST]      = ANIM_HOOKED_POKEMON_EAST,\n    [DIR_SOUTHWEST] = ANIM_HOOKED_POKEMON_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_HOOKED_POKEMON_SOUTH,\n    [DIR_NORTHWEST] = ANIM_HOOKED_POKEMON_NORTH,\n    [DIR_NORTHEAST] = ANIM_HOOKED_POKEMON_NORTH,\n};\n\nstatic const u8 sRunningDirectionAnimNums[] = {\n    [DIR_NONE]      = ANIM_RUN_SOUTH,\n    [DIR_SOUTH]     = ANIM_RUN_SOUTH,\n    [DIR_NORTH]     = ANIM_RUN_NORTH,\n    [DIR_WEST]      = ANIM_RUN_WEST,\n    [DIR_EAST]      = ANIM_RUN_EAST,\n    [DIR_SOUTHWEST] = ANIM_RUN_SOUTH,\n    [DIR_SOUTHEAST] = ANIM_RUN_SOUTH,\n    [DIR_NORTHWEST] = ANIM_RUN_NORTH,\n    [DIR_NORTHEAST] = ANIM_RUN_NORTH,\n};\n\nstatic const u8 sTrainerFacingDirectionMovementTypes[] = {\n    [DIR_NONE]      = MOVEMENT_TYPE_FACE_DOWN,\n    [DIR_SOUTH]     = MOVEMENT_TYPE_FACE_DOWN,\n    [DIR_NORTH]     = MOVEMENT_TYPE_FACE_UP,\n    [DIR_WEST]      = MOVEMENT_TYPE_FACE_LEFT,\n    [DIR_EAST]      = MOVEMENT_TYPE_FACE_RIGHT,\n    [DIR_SOUTHWEST] = MOVEMENT_TYPE_FACE_DOWN,\n    [DIR_SOUTHEAST] = MOVEMENT_TYPE_FACE_DOWN,\n    [DIR_NORTHWEST] = MOVEMENT_TYPE_FACE_UP,\n    [DIR_NORTHEAST] = MOVEMENT_TYPE_FACE_UP,\n};\n\nbool8 (*const gOppositeDirectionBlockedMetatileFuncs[])(u8) = {\n    MetatileBehavior_IsSouthBlocked,\n    MetatileBehavior_IsNorthBlocked,\n    MetatileBehavior_IsWestBlocked,\n    MetatileBehavior_IsEastBlocked\n};\n\nbool8 (*const gDirectionBlockedMetatileFuncs[])(u8) = {\n    MetatileBehavior_IsNorthBlocked,\n    MetatileBehavior_IsSouthBlocked,\n    MetatileBehavior_IsEastBlocked,\n    MetatileBehavior_IsWestBlocked\n};\n\nstatic const struct Coords16 sDirectionToVectors[] = {\n    [DIR_NONE]      = { 0,  0},\n    [DIR_SOUTH]     = { 0,  1},\n    [DIR_NORTH]     = { 0, -1},\n    [DIR_WEST]      = {-1,  0},\n    [DIR_EAST]      = { 1,  0},\n    [DIR_SOUTHWEST] = {-1,  1},\n    [DIR_SOUTHEAST] = { 1,  1},\n    [DIR_NORTHWEST] = {-1, -1},\n    [DIR_NORTHEAST] = { 1, -1},\n};\n\nstatic const u8 sFaceDirectionMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_FACE_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_FACE_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_FACE_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_FACE_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_FACE_RIGHT,\n};\n\nstatic const u8 sFaceDirectionFastMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_FACE_DOWN_FAST,\n    [DIR_SOUTH] = MOVEMENT_ACTION_FACE_DOWN_FAST,\n    [DIR_NORTH] = MOVEMENT_ACTION_FACE_UP_FAST,\n    [DIR_WEST]  = MOVEMENT_ACTION_FACE_LEFT_FAST,\n    [DIR_EAST]  = MOVEMENT_ACTION_FACE_RIGHT_FAST,\n};\n\nstatic const u8 sWalkSlowestMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_WALK_SLOWEST_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_WALK_SLOWEST_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_WALK_SLOWEST_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_WALK_SLOWEST_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_WALK_SLOWEST_RIGHT,\n};\n\nstatic const u8 sWalkSlowerMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_WALK_SLOWER_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_WALK_SLOWER_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_WALK_SLOWER_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_WALK_SLOWER_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_WALK_SLOWER_RIGHT,\n};\n\nstatic const u8 sWalkSlowMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_WALK_SLOW_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_WALK_SLOW_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_WALK_SLOW_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_WALK_SLOW_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_WALK_SLOW_RIGHT,\n};\n\nstatic const u8 sWalkNormalMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_WALK_NORMAL_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_WALK_NORMAL_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_WALK_NORMAL_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_WALK_NORMAL_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_WALK_NORMAL_RIGHT,\n};\n\nstatic const u8 sWalkFastMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_WALK_FAST_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_WALK_FAST_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_WALK_FAST_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_WALK_FAST_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_WALK_FAST_RIGHT,\n};\n\nstatic const u8 sGlideMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_GLIDE_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_GLIDE_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_GLIDE_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_GLIDE_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_GLIDE_RIGHT,\n};\n\nstatic const u8 sRideWaterCurrentMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT,\n};\n\nstatic const u8 sWalkFasterMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_WALK_FASTER_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_WALK_FASTER_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_WALK_FASTER_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_WALK_FASTER_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_WALK_FASTER_RIGHT,\n};\n\nstatic const u8 sSlideMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_SLIDE_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_SLIDE_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_SLIDE_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_SLIDE_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_SLIDE_RIGHT,\n};\n\nstatic const u8 sPlayerRunMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_PLAYER_RUN_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_PLAYER_RUN_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_PLAYER_RUN_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_PLAYER_RUN_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_PLAYER_RUN_RIGHT,\n};\n\nstatic const u8 sPlayerRunSlowMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_PLAYER_RUN_DOWN_SLOW,\n    [DIR_SOUTH] = MOVEMENT_ACTION_PLAYER_RUN_DOWN_SLOW,\n    [DIR_NORTH] = MOVEMENT_ACTION_PLAYER_RUN_UP_SLOW,\n    [DIR_WEST]  = MOVEMENT_ACTION_PLAYER_RUN_LEFT_SLOW,\n    [DIR_EAST]  = MOVEMENT_ACTION_PLAYER_RUN_RIGHT_SLOW,\n};\n\nstatic const u8 sSpinMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_SPIN_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_SPIN_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_SPIN_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_SPIN_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_SPIN_RIGHT,\n};\n\nstatic const u8 sJump2MovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_JUMP_2_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_JUMP_2_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_JUMP_2_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_JUMP_2_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_JUMP_2_RIGHT,\n};\n\nstatic const u8 sJumpInPlaceMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_JUMP_IN_PLACE_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT,\n};\n\nstatic const u8 sJumpInPlaceTurnAroundMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT,\n};\n\nstatic const u8 sJumpMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_JUMP_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_JUMP_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_JUMP_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_JUMP_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_JUMP_RIGHT,\n};\n\nstatic const u8 sJumpSpecialMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_JUMP_SPECIAL_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_JUMP_SPECIAL_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_JUMP_SPECIAL_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_JUMP_SPECIAL_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT,\n};\n\nstatic const u8 sJumpSpecialWithEffectMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_RIGHT,\n};\n\nstatic const u8 sWalkInPlaceSlowMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT,\n};\n\nstatic const u8 sWalkInPlaceNormalMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT,\n};\n\nstatic const u8 sWalkInPlaceFastMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT,\n};\n\nstatic const u8 sWalkInPlaceFasterMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT,\n};\n\nstatic const u8 sAcroWheelieFaceDirectionMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT,\n};\n\nstatic const u8 sAcroPopWheelieFaceDirectionMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT,\n};\n\nstatic const u8 sAcroEndWheelieFaceDirectionMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT,\n};\n\nstatic const u8 sAcroWheelieHopFaceDirectionMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT,\n};\n\nstatic const u8 sAcroWheelieHopMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT,\n};\n\nstatic const u8 sAcroWheelieJumpMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT,\n};\n\nstatic const u8 sAcroWheelieInPlaceMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT,\n};\n\nstatic const u8 sAcroPopWheelieMoveMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT,\n};\n\nstatic const u8 sAcroWheelieMoveMovementActions[] = {\n    [DIR_NONE]  = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN,\n    [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN,\n    [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP,\n    [DIR_WEST]  = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT,\n    [DIR_EAST]  = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT,\n};\n\nstatic const u8 gOppositeDirections[] = {\n    DIR_NORTH,\n    DIR_SOUTH,\n    DIR_EAST,\n    DIR_WEST,\n    DIR_NORTHEAST,\n    DIR_NORTHWEST,\n    DIR_SOUTHEAST,\n    DIR_SOUTHWEST,\n};\n\nstatic const u8 sPlayerDirectionsForCopy[][4] = {\n    {2, 1, 4, 3},\n    {1, 2, 3, 4},\n    {3, 4, 2, 1},\n    {4, 3, 1, 2}\n};\n\nstatic const u8 sPlayerDirectionToCopyDirection[][4] = {\n    {2, 1, 4, 3},\n    {1, 2, 3, 4},\n    {4, 3, 1, 2},\n    {3, 4, 2, 1}\n};\n\n#include \"data/object_events/movement_action_func_tables.h\"\n\nstatic void ClearObjectEvent(struct ObjectEvent *objectEvent)\n{\n    *objectEvent = (struct ObjectEvent){};\n    objectEvent->localId = 0xFF;\n    objectEvent->mapNum = MAP_NUM(UNDEFINED);\n    objectEvent->mapGroup = MAP_GROUP(UNDEFINED);\n    objectEvent->movementActionId = MOVEMENT_ACTION_NONE;\n}\n\nstatic void ClearAllObjectEvents(void)\n{\n    u32 i;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n        ClearObjectEvent(&gObjectEvents[i]);\n}\n\nvoid ResetObjectEvents(void)\n{\n    ClearLinkPlayerObjectEvents();\n    ClearAllObjectEvents();\n    ClearPlayerAvatarInfo();\n    CreateReflectionEffectSprites();\n}\n\nstatic void CreateReflectionEffectSprites(void)\n{\n    u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_REFLECTION_DISTORTION], 0, 0, 31);\n    gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n    InitSpriteAffineAnim(&gSprites[spriteId]);\n    StartSpriteAffineAnim(&gSprites[spriteId], 0);\n    gSprites[spriteId].invisible = TRUE;\n\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_REFLECTION_DISTORTION], 0, 0, 31);\n    gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n    InitSpriteAffineAnim(&gSprites[spriteId]);\n    StartSpriteAffineAnim(&gSprites[spriteId], 1);\n    gSprites[spriteId].invisible = TRUE;\n}\n\nu8 GetFirstInactiveObjectEventId(void)\n{\n    u32 i;\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (!gObjectEvents[i].active)\n            break;\n    }\n\n    return i;\n}\n\nu8 GetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId)\n{\n    if (localId < OBJ_EVENT_ID_PLAYER)\n    {\n        return GetObjectEventIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId);\n    }\n    return GetObjectEventIdByLocalId(localId);\n}\n\nbool8 TryGetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId, u8 *objectEventId)\n{\n    *objectEventId = GetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroupId);\n    if (*objectEventId == OBJECT_EVENTS_COUNT)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nu8 GetObjectEventIdByXY(s16 x, s16 y)\n{\n    u32 i;\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (gObjectEvents[i].active && gObjectEvents[i].currentCoords.x == x && gObjectEvents[i].currentCoords.y == y)\n            break;\n    }\n\n    return i;\n}\n\nstatic u8 GetObjectEventIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroupId)\n{\n    u32 i;\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (gObjectEvents[i].active && gObjectEvents[i].localId == localId && gObjectEvents[i].mapNum == mapNum && gObjectEvents[i].mapGroup == mapGroupId)\n            return i;\n    }\n\n    return OBJECT_EVENTS_COUNT;\n}\n\nstatic u8 GetObjectEventIdByLocalId(u8 localId)\n{\n    u32 i;\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (gObjectEvents[i].active && gObjectEvents[i].localId == localId)\n            return i;\n    }\n\n    return OBJECT_EVENTS_COUNT;\n}\n\nstatic u8 InitObjectEventStateFromTemplate(const struct ObjectEventTemplate *template, u8 mapNum, u8 mapGroup)\n{\n    struct ObjectEvent *objectEvent;\n    const struct MapHeader *mapHeader;\n    u8 objectEventId;\n    s16 x;\n    s16 y;\n    bool8 isClone = FALSE;\n    u8 localId = 0;\n    s16 x2 = 0;\n    s16 y2 = 0;\n    s16 x3 = 0;\n    s16 y3 = 0;\n    \n    if (template->kind == OBJ_KIND_CLONE)\n    {\n        isClone = TRUE;\n        localId = template->objUnion.clone.targetLocalId;\n        mapNum = template->objUnion.clone.targetMapNum;\n        mapGroup = template->objUnion.clone.targetMapGroup;\n        x2 = template->x;\n        y2 = template->y;\n        x3 = template->x;\n        y3 = template->y;\n        mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum);\n        template = &(mapHeader->events->objectEvents[localId - 1]);\n    }\n\n    if (GetAvailableObjectEventId(template->localId, mapNum, mapGroup, &objectEventId))\n        return OBJECT_EVENTS_COUNT;\n\n    if (!ShouldInitObjectEventStateFromTemplate(template, isClone, x3, y3))\n        return OBJECT_EVENTS_COUNT;\n\n    objectEvent = &gObjectEvents[objectEventId];\n    ClearObjectEvent(objectEvent);\n    if (isClone)\n    {\n        x = x2 + MAP_OFFSET;\n        y = y2 + MAP_OFFSET;\n    }\n    else\n    {\n        x = template->x + MAP_OFFSET;\n        y = template->y + MAP_OFFSET;\n    }\n    objectEvent->active = TRUE;\n    objectEvent->triggerGroundEffectsOnMove = TRUE;\n    objectEvent->graphicsId = template->graphicsId;\n    objectEvent->movementType = template->objUnion.normal.movementType;\n    objectEvent->localId = template->localId;\n    objectEvent->mapNum = mapNum;\n    objectEvent->mapGroup = mapGroup;\n    objectEvent->initialCoords.x = x;\n    objectEvent->initialCoords.y = y;\n    objectEvent->currentCoords.x = x;\n    objectEvent->currentCoords.y = y;\n    objectEvent->previousCoords.x = x;\n    objectEvent->previousCoords.y = y;\n    objectEvent->currentElevation = template->objUnion.normal.elevation;\n    objectEvent->previousElevation = template->objUnion.normal.elevation;\n    objectEvent->rangeX = template->objUnion.normal.movementRangeX;\n    objectEvent->rangeY = template->objUnion.normal.movementRangeY;\n    objectEvent->trainerType = template->objUnion.normal.trainerType;\n    objectEvent->trainerRange_berryTreeId = template->objUnion.normal.trainerRange_berryTreeId;\n    objectEvent->mapNum = mapNum; // oops (yes this is required for matching)\n    objectEvent->previousMovementDirection = gInitialMovementTypeFacingDirections[template->objUnion.normal.movementType];\n    SetObjectEventDirection(objectEvent, objectEvent->previousMovementDirection);\n    SetObjectEventDynamicGraphicsId(objectEvent);\n    if (gRangedMovementTypes[objectEvent->movementType])\n    {\n        if (objectEvent->rangeX == 0)\n            objectEvent->rangeX++;\n        if (objectEvent->rangeY == 0)\n            objectEvent->rangeY++;\n    }\n    return objectEventId;\n}\n\nstatic bool8 ShouldInitObjectEventStateFromTemplate(const struct ObjectEventTemplate *template, bool8 isClone, s16 x, s16 y)\n{\n    if (isClone && !TemplateIsObstacleAndWithinView(template, x, y))\n        return FALSE;\n\n    if (!TemplateIsObstacleAndVisibleFromConnectingMap(template, x, y))\n        return FALSE;\n    \n    return TRUE;\n}\n\nstatic bool8 TemplateIsObstacleAndWithinView(const struct ObjectEventTemplate *template, s16 x, s16 y)\n{\n    if (template->graphicsId == OBJ_EVENT_GFX_CUT_TREE || template->graphicsId == OBJ_EVENT_GFX_ROCK_SMASH_ROCK)\n    {\n        if (gSaveBlock1Ptr->pos.x < x)\n        {\n            if (gSaveBlock1Ptr->pos.x + (MAP_OFFSET + 1) < x)\n                return TRUE;\n            if (gSaveBlock1Ptr->pos.y - (MAP_OFFSET - 1) <= y && gSaveBlock1Ptr->pos.y + (MAP_OFFSET - 1) >= y)\n                return FALSE;\n        }\n        else\n        {\n            if (gSaveBlock1Ptr->pos.x - (MAP_OFFSET + 1) > x)\n                return TRUE;\n\n            if (gSaveBlock1Ptr->pos.y - (MAP_OFFSET - 1) <= y && gSaveBlock1Ptr->pos.y + (MAP_OFFSET - 1) >= y)\n                return FALSE;\n        }\n    }\n    return TRUE;\n}\n\nstatic bool8 TemplateIsObstacleAndVisibleFromConnectingMap(const struct ObjectEventTemplate *template, s16 unused1, s16 unused2)\n{\n    if (IsMapTypeOutdoors(GetCurrentMapType()))\n    {\n        s32 width = VMap.Xsize - MAP_OFFSET_W - 1;\n        s32 height = VMap.Ysize - MAP_OFFSET_H - 1;\n\n        if (template->graphicsId == OBJ_EVENT_GFX_CUT_TREE || template->graphicsId == OBJ_EVENT_GFX_ROCK_SMASH_ROCK)\n        {\n            if (gSaveBlock1Ptr->pos.x == 0 && template->x <= (MAP_OFFSET + 1))\n            {\n                SetHideObstacleFlag(template);\n                return FALSE;\n            }\n\n            if (gSaveBlock1Ptr->pos.x == width && template->x >= width - (MAP_OFFSET + 1))\n            {\n                SetHideObstacleFlag(template);\n                return FALSE;\n            }\n\n            if (gSaveBlock1Ptr->pos.y == 0 && template->y <= (MAP_OFFSET - 1))\n            {\n                SetHideObstacleFlag(template);\n                return FALSE;\n            }\n\n            if (gSaveBlock1Ptr->pos.y == height && template->y >= height - (MAP_OFFSET - 1))\n            {\n                SetHideObstacleFlag(template);\n                return FALSE;\n            }\n        }\n    }\n    return TRUE;\n}\n\nstatic void SetHideObstacleFlag(const struct ObjectEventTemplate *template)\n{\n    if (template->flagId >= FLAG_TEMP_11 && template->flagId <= FLAG_TEMP_1F)\n        FlagSet(template->flagId);\n}\n\nu8 Unref_TryInitLocalObjectEvent(u8 localId)\n{\n    u32 i;\n    u8 objectEventCount;\n    struct ObjectEventTemplate *template;\n\n    if (gMapHeader.events == NULL)\n        return OBJECT_EVENTS_COUNT;\n\n    objectEventCount = gMapHeader.events->objectEventCount;\n    \n    for (i = 0; i < objectEventCount; i++)\n    {\n        template = &gSaveBlock1Ptr->objectEventTemplates[i];\n        if (template->localId == localId && !FlagGet(template->flagId))\n            return InitObjectEventStateFromTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);\n    }\n\n    return OBJECT_EVENTS_COUNT;\n}\n\nstatic bool8 GetAvailableObjectEventId(u16 localId, u8 mapNum, u8 mapGroup, u8 *objectEventId)\n// Looks for an empty slot.\n// Returns FALSE and the location of the available slot\n// in *objectEventId.\n// If no slots are available, or if the object is already\n// loaded, returns TRUE.\n{\n    u8 i = 0;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (!gObjectEvents[i].active)\n            break;\n        if (gObjectEvents[i].localId == localId && gObjectEvents[i].mapNum == mapNum && gObjectEvents[i].mapGroup == mapGroup)\n            return TRUE;\n    }\n    if (i >= OBJECT_EVENTS_COUNT)\n        return TRUE;\n    *objectEventId = i;\n    do\n    {\n        if (gObjectEvents[i].active && gObjectEvents[i].localId == localId && gObjectEvents[i].mapNum == mapNum && gObjectEvents[i].mapGroup == mapGroup)\n            return TRUE;\n        i++;\n    } while (i < OBJECT_EVENTS_COUNT);\n    return FALSE;\n}\n\nvoid RemoveObjectEvent(struct ObjectEvent *objectEvent)\n{\n    objectEvent->active = FALSE;\n    RemoveObjectEventInternal(objectEvent);\n}\n\nvoid RemoveObjectEventByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    u8 objectEventId;\n    if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId))\n    {\n        FlagSet(GetObjectEventFlagIdByObjectEventId(objectEventId));\n        RemoveObjectEvent(&gObjectEvents[objectEventId]);\n    }\n}\n\nstatic void RemoveObjectEventInternal(struct ObjectEvent *objectEvent)\n{\n    struct SpriteFrameImage image;\n    image.size = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->size;\n    gSprites[objectEvent->spriteId].images = &image;\n    DestroySprite(&gSprites[objectEvent->spriteId]);\n}\n\nvoid Unref_RemoveAllObjectEventsExceptPlayer(void)\n{\n    u32 i;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (i != gPlayerAvatar.objectEventId)\n            RemoveObjectEvent(&gObjectEvents[i]);\n    }\n}\n\nstatic u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEventTemplate, struct SpriteTemplate *spriteTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)\n{\n    u8 spriteId;\n    u8 objectEventId;\n    struct Sprite *sprite;\n    struct ObjectEvent *objectEvent;\n    const struct ObjectEventGraphicsInfo *graphicsInfo;\n\n    objectEventId = InitObjectEventStateFromTemplate(objectEventTemplate, mapNum, mapGroup);\n    if (objectEventId == OBJECT_EVENTS_COUNT)\n        return OBJECT_EVENTS_COUNT;\n\n    objectEvent = &gObjectEvents[objectEventId];\n    graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);\n    if(graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_28 || graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_29) //em brendan/may\n        LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);\n    if (graphicsInfo->paletteSlot == PALSLOT_PLAYER)\n        LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);\n    else if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL)\n        LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);\n\n\n    if (objectEvent->movementType == MOVEMENT_TYPE_INVISIBLE)\n        objectEvent->invisible = TRUE;\n\n    *(u16 *)&spriteTemplate->paletteTag = TAG_NONE;\n    spriteId = CreateSprite(spriteTemplate, 0, 0, 0);\n    if (spriteId == MAX_SPRITES)\n    {\n        gObjectEvents[objectEventId].active = FALSE;\n        return OBJECT_EVENTS_COUNT;\n    }\n\n    sprite = &gSprites[spriteId];\n    GetMapCoordsFromSpritePos(objectEvent->currentCoords.x + cameraX, objectEvent->currentCoords.y + cameraY, &sprite->x, &sprite->y);\n    sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);\n    sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);\n    sprite->x += 8;\n    sprite->y += 16 + sprite->centerToCornerVecY;\n    sprite->oam.paletteNum = graphicsInfo->paletteSlot;\n    sprite->coordOffsetEnabled = TRUE;\n    sprite->data[0] = objectEventId;\n    objectEvent->spriteId = spriteId;\n    objectEvent->inanimate = graphicsInfo->inanimate;\n    if (!objectEvent->inanimate)\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection));\n\n    SetObjectSubpriorityByElevation(objectEvent->previousElevation, sprite, 1);\n    UpdateObjectEventVisibility(objectEvent, sprite);\n    return objectEventId;\n}\n\nstatic u8 TrySpawnObjectEventTemplate(const struct ObjectEventTemplate *objectEventTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)\n{\n    u8 objectEventId;\n    struct SpriteTemplate spriteTemplate;\n    struct SpriteFrameImage spriteFrameImage;\n    const struct ObjectEventGraphicsInfo *graphicsInfo;\n    const struct SubspriteTable *subspriteTables = NULL;\n\n    graphicsInfo = GetObjectEventGraphicsInfo(objectEventTemplate->graphicsId);\n    MakeObjectTemplateFromObjectEventTemplate(objectEventTemplate, &spriteTemplate, &subspriteTables);\n    spriteFrameImage.size = graphicsInfo->size;\n    spriteTemplate.images = &spriteFrameImage;\n    objectEventId = TrySetupObjectEventSprite(objectEventTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY);\n    if (objectEventId == OBJECT_EVENTS_COUNT)\n        return OBJECT_EVENTS_COUNT;\n\n    gSprites[gObjectEvents[objectEventId].spriteId].images = graphicsInfo->images;\n    if (subspriteTables)\n        SetSubspriteTables(&gSprites[gObjectEvents[objectEventId].spriteId], subspriteTables);\n\n    return objectEventId;\n}\n\nu8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *objectEventTemplate)\n{\n    s16 cameraX;\n    s16 cameraY;\n\n    GetObjectEventMovingCameraOffset(&cameraX, &cameraY);\n    return TrySpawnObjectEventTemplate(objectEventTemplate, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY);\n}\n\nint SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 elevation)\n{\n    struct ObjectEventTemplate objectEventTemplate;\n\n    x -= MAP_OFFSET;\n    y -= MAP_OFFSET;\n    objectEventTemplate.localId = localId;\n    objectEventTemplate.graphicsId = graphicsId;\n    objectEventTemplate.kind = OBJ_KIND_NORMAL;\n    objectEventTemplate.x = x;\n    objectEventTemplate.y = y;\n    objectEventTemplate.objUnion.normal.elevation = elevation;\n    objectEventTemplate.objUnion.normal.movementType = movementBehavior;\n    objectEventTemplate.objUnion.normal.movementRangeX = 0;\n    objectEventTemplate.objUnion.normal.movementRangeY = 0;\n    objectEventTemplate.objUnion.normal.trainerType = TRAINER_TYPE_NONE;\n    objectEventTemplate.objUnion.normal.trainerRange_berryTreeId = 0;\n    return SpawnSpecialObjectEvent(&objectEventTemplate);\n}\n\nu8 TrySpawnObjectEvent(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    const struct ObjectEventTemplate *objectEventTemplate;\n    s16 cameraX, cameraY;\n\n    objectEventTemplate = GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup);\n    if (!objectEventTemplate)\n        return OBJECT_EVENTS_COUNT;\n\n    GetObjectEventMovingCameraOffset(&cameraX, &cameraY);\n    return TrySpawnObjectEventTemplate(objectEventTemplate, mapNum, mapGroup, cameraX, cameraY);\n}\n\nvoid CopyObjectGraphicsInfoToSpriteTemplate(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables)\n{\n    const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId);\n\n    spriteTemplate->tileTag = graphicsInfo->tileTag;\n    spriteTemplate->paletteTag = graphicsInfo->paletteTag;\n    spriteTemplate->oam = graphicsInfo->oam;\n    spriteTemplate->anims = graphicsInfo->anims;\n    spriteTemplate->images = graphicsInfo->images;\n    spriteTemplate->affineAnims = graphicsInfo->affineAnims;\n    \n    do\n    {\n        if (ScriptContext_IsEnabled() != TRUE && QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING)\n            spriteTemplate->callback = QL_UpdateObject;\n        else\n            spriteTemplate->callback = callback;\n    } while (0);\n    \n    *subspriteTables = graphicsInfo->subspriteTables;\n}\n\nstatic void CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(u16 graphicsId, u16 movementType, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables)\n{\n    CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, sMovementTypeCallbacks[movementType], spriteTemplate, subspriteTables);\n}\n\nstatic void MakeObjectTemplateFromObjectEventTemplate(const struct ObjectEventTemplate *objectEventTemplate, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables)\n{\n    CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEventTemplate->graphicsId, objectEventTemplate->objUnion.normal.movementType, spriteTemplate, subspriteTables);\n}\n\n// Used to create a sprite using a graphicsId associated with object events.\nu8 CreateObjectGraphicsSprite(u16 graphicsId, SpriteCallback callback, s16 x, s16 y, u8 subpriority)\n{\n    struct SpriteTemplate spriteTemplate;\n    const struct SubspriteTable *subspriteTables;\n    u8 spriteId;\n\n    CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, callback, &spriteTemplate, &subspriteTables);\n    if (spriteTemplate.paletteTag != TAG_NONE)\n        LoadObjectEventPalette(spriteTemplate.paletteTag);\n\n    spriteId = CreateSprite(&spriteTemplate, x, y, subpriority);\n    if (spriteId != MAX_SPRITES && subspriteTables != NULL)\n    {\n        SetSubspriteTables(&gSprites[spriteId], subspriteTables);\n        gSprites[spriteId].subspriteMode = SUBSPRITES_IGNORE_PRIORITY;\n    }\n    return spriteId;\n}\n\n#define sVirtualObjId   data[0]\n#define sVirtualObjElev data[1]\n\nu8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevation, u8 direction)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n    struct SpriteTemplate spriteTemplate;\n    const struct SubspriteTable *subspriteTables;\n    const struct ObjectEventGraphicsInfo *graphicsInfo;\n\n    graphicsInfo = GetObjectEventGraphicsInfo(graphicsId);\n    CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, SpriteCB_VirtualObject, &spriteTemplate, &subspriteTables);\n    *(u16 *)&spriteTemplate.paletteTag = TAG_NONE;\n    x += MAP_OFFSET;\n    y += MAP_OFFSET;\n    SetSpritePosToOffsetMapCoords(&x, &y, 8, 16);\n    spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);\n        sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);\n        sprite->y += sprite->centerToCornerVecY;\n        sprite->oam.paletteNum = graphicsInfo->paletteSlot;\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->sVirtualObjId = virtualObjId;\n        sprite->sVirtualObjElev = elevation;\n        if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL)\n            LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);\n\n        if (subspriteTables != NULL)\n        {\n            SetSubspriteTables(sprite, subspriteTables);\n            sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;\n        }\n        InitObjectPriorityByElevation(sprite, elevation);\n        SetObjectSubpriorityByElevation(elevation, sprite, 1);\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(direction));\n    }\n    return spriteId;\n}\n\nu8 CreateFameCheckerObject(u8 graphicsId, u8 localId, s16 x, s16 y)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n    struct SpriteTemplate spriteTemplate;\n    const struct SubspriteTable *subspriteTables;\n    const struct ObjectEventGraphicsInfo *graphicsInfo;\n\n    graphicsInfo = GetObjectEventGraphicsInfo(graphicsId);\n    CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, SpriteCallbackDummy, &spriteTemplate, &subspriteTables);\n    *(u16 *)&spriteTemplate.paletteTag = TAG_NONE;\n\n    spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);\n        sprite->y += sprite->centerToCornerVecY;\n        sprite->oam.paletteNum = graphicsInfo->paletteSlot;\n        sprite->data[0] = localId;\n        if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL)\n            LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);\n\n        if (subspriteTables != NULL)\n        {\n            SetSubspriteTables(sprite, subspriteTables);\n            sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;\n        }\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_SOUTH));\n    }\n    return spriteId;\n}\n\nvoid TrySpawnObjectEvents(s16 cameraX, s16 cameraY)\n{\n    u32 i;\n    u8 objectCount;\n\n    if (gMapHeader.events != NULL)\n    {\n        s16 left = gSaveBlock1Ptr->pos.x - 2;\n        s16 right = gSaveBlock1Ptr->pos.x + MAP_OFFSET_W + 2;\n        s16 top = gSaveBlock1Ptr->pos.y;\n        s16 bottom = gSaveBlock1Ptr->pos.y + MAP_OFFSET_H + 2;\n\n        objectCount = gMapHeader.events->objectEventCount;\n\n        for (i = 0; i < objectCount; i++)\n        {\n            struct ObjectEventTemplate *template = &gSaveBlock1Ptr->objectEventTemplates[i];\n            s16 npcX = template->x + MAP_OFFSET;\n            s16 npcY = template->y + MAP_OFFSET;\n\n            if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX\n                && !FlagGet(template->flagId))\n                TrySpawnObjectEventTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY);\n        }\n    }\n}\n\nvoid RemoveObjectEventsOutsideView(void)\n{\n    u8 i, j;\n    bool8 isActiveLinkPlayer;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        for (j = 0, isActiveLinkPlayer = FALSE; j < NELEMS(gLinkPlayerObjectEvents); j++)\n        {\n            if (gLinkPlayerObjectEvents[j].active && i == gLinkPlayerObjectEvents[j].objEventId)\n                isActiveLinkPlayer = TRUE;\n        }\n        if (!isActiveLinkPlayer)\n        {\n            struct ObjectEvent *objectEvent = &gObjectEvents[i];\n\n            if (objectEvent->active && !objectEvent->isPlayer)\n                RemoveObjectEventIfOutsideView(objectEvent);\n        }\n    }\n}\n\nstatic void RemoveObjectEventIfOutsideView(struct ObjectEvent *objectEvent)\n{\n    s16 left =   gSaveBlock1Ptr->pos.x - 2;\n    s16 right =  gSaveBlock1Ptr->pos.x + MAP_OFFSET_W + 2;\n    s16 top =    gSaveBlock1Ptr->pos.y;\n    s16 bottom = gSaveBlock1Ptr->pos.y + MAP_OFFSET_H + 2;\n\n    if (objectEvent->currentCoords.x >= left && objectEvent->currentCoords.x <= right\n     && objectEvent->currentCoords.y >= top && objectEvent->currentCoords.y <= bottom)\n        return;\n    if (objectEvent->initialCoords.x >= left && objectEvent->initialCoords.x <= right\n     && objectEvent->initialCoords.y >= top && objectEvent->initialCoords.y <= bottom)\n        return;\n    RemoveObjectEvent(objectEvent);\n}\n\nvoid SpawnObjectEventsOnReturnToField(s16 x, s16 y)\n{\n    u32 i;\n\n    ClearPlayerAvatarInfo();\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (gObjectEvents[i].active)\n            SpawnObjectEventOnReturnToField(i, x, y);\n    }\n    CreateReflectionEffectSprites();\n}\n\nstatic void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n    struct ObjectEvent *objectEvent;\n    struct SpriteTemplate spriteTemplate;\n    struct SpriteFrameImage spriteFrameImage;\n    const struct SubspriteTable *subspriteTables;\n    const struct ObjectEventGraphicsInfo *graphicsInfo;\n\n#define i spriteId\n    for (i = 0; i < NELEMS(gLinkPlayerObjectEvents); i++)\n    {\n        if (gLinkPlayerObjectEvents[i].active && objectEventId == gLinkPlayerObjectEvents[i].objEventId)\n            return;\n    }\n#undef i\n\n    objectEvent = &gObjectEvents[objectEventId];\n    objectEvent++;objectEvent--; // fakematch\n    subspriteTables = NULL;\n    graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);\n    spriteFrameImage.size = graphicsInfo->size;\n    CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEvent->graphicsId, objectEvent->movementType, &spriteTemplate, &subspriteTables);\n    spriteTemplate.images = &spriteFrameImage;\n\n    *(u16 *)&spriteTemplate.paletteTag = TAG_NONE;\n    if (graphicsInfo->paletteSlot == PALSLOT_PLAYER)\n        LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);\n\n    if (graphicsInfo->paletteSlot >= PALSLOT_NPC_SPECIAL)\n        LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);\n\n    *(u16 *)&spriteTemplate.paletteTag = TAG_NONE;\n    spriteId = CreateSprite(&spriteTemplate, 0, 0, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        GetMapCoordsFromSpritePos(x + objectEvent->currentCoords.x, y + objectEvent->currentCoords.y, &sprite->x, &sprite->y);\n        sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);\n        sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);\n        sprite->x += 8;\n        sprite->y += 16 + sprite->centerToCornerVecY;\n        sprite->images = graphicsInfo->images;\n        if (objectEvent->movementType == MOVEMENT_TYPE_PLAYER)\n        {\n            SetPlayerAvatarObjectEventIdAndObjectId(objectEventId, spriteId);\n            objectEvent->warpArrowSpriteId = CreateWarpArrowSprite();\n        }\n        if (subspriteTables != NULL)\n            SetSubspriteTables(sprite, subspriteTables);\n\n        sprite->oam.paletteNum = graphicsInfo->paletteSlot;\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->data[0] = objectEventId;\n        objectEvent->spriteId = spriteId;\n        if (!objectEvent->inanimate && objectEvent->movementType != MOVEMENT_TYPE_PLAYER)\n            StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection));\n\n        ResetObjectEventFldEffData(objectEvent);\n        SetObjectSubpriorityByElevation(objectEvent->previousElevation, sprite, 1);\n    }\n}\n\nstatic void ResetObjectEventFldEffData(struct ObjectEvent *objectEvent)\n{\n    objectEvent->singleMovementActive = FALSE;\n    objectEvent->triggerGroundEffectsOnMove = TRUE;\n    objectEvent->hasShadow = FALSE;\n    objectEvent->hasReflection = FALSE;\n    objectEvent->inShortGrass = FALSE;\n    objectEvent->inShallowFlowingWater = FALSE;\n    objectEvent->inSandPile = FALSE;\n    objectEvent->inHotSprings = FALSE;\n    ObjectEventClearHeldMovement(objectEvent);\n}\n\nstatic void SetPlayerAvatarObjectEventIdAndObjectId(u8 objectEventId, u8 spriteId)\n{\n    gPlayerAvatar.objectEventId = objectEventId;\n    gPlayerAvatar.spriteId = spriteId;\n    gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gObjectEvents[objectEventId].graphicsId);\n    SetPlayerAvatarExtraStateTransition(gObjectEvents[objectEventId].graphicsId, PLAYER_AVATAR_FLAG_CONTROLLABLE);\n}\n\nvoid ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId)\n{\n    const struct ObjectEventGraphicsInfo *graphicsInfo;\n    struct Sprite *sprite;\n    u8 var;\n    u8 var3;\n\n    graphicsInfo = GetObjectEventGraphicsInfo(graphicsId);\n    sprite = &gSprites[objectEvent->spriteId];\n    if (graphicsInfo->paletteSlot == PALSLOT_PLAYER)\n        PatchObjectPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);\n\n    if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL)\n        LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);\n    \n    var = sprite->images->size / TILE_SIZE_4BPP;\n    if (!sprite->usingSheet)\n    {\n        FreeSpriteTilesIfNotUsingSheet(sprite);\n    }\n    sprite->oam.shape = graphicsInfo->oam->shape;\n    sprite->oam.size = graphicsInfo->oam->size;\n    sprite->images = graphicsInfo->images;\n    sprite->anims = graphicsInfo->anims;\n    sprite->subspriteTables = graphicsInfo->subspriteTables;\n    sprite->oam.paletteNum = graphicsInfo->paletteSlot;\n    if (!sprite->usingSheet)\n    {\n        s32 var2;\n        var3 = sprite->images->size / TILE_SIZE_4BPP;\n        var2 = AllocSpriteTiles(var3);\n        if (var2 == -1)\n        {\n            var2 = AllocSpriteTiles(var);    \n        }\n        sprite->oam.tileNum = var2;\n    }\n    objectEvent->inanimate = graphicsInfo->inanimate;\n    objectEvent->graphicsId = graphicsId;  \n    SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y);\n    sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);\n    sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);\n    sprite->x += 8;\n    sprite->y += 16 + sprite->centerToCornerVecY;\n    if (objectEvent->trackedByCamera)\n    {\n        CameraObjectReset1();\n    }\n}\n\nvoid ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId)\n{\n    u8 objectEventId;\n\n    if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId))\n    {\n        ObjectEventSetGraphicsId(&gObjectEvents[objectEventId], graphicsId);\n    }\n}\n\nvoid ObjectEventTurn(struct ObjectEvent *objectEvent, u8 direction)\n{\n    SetObjectEventDirection(objectEvent, direction);\n    if (!objectEvent->inanimate)\n    {\n        StartSpriteAnim(&gSprites[objectEvent->spriteId], GetFaceDirectionAnimNum(objectEvent->facingDirection));\n        SeekSpriteAnim(&gSprites[objectEvent->spriteId], 0);\n    }\n}\n\nvoid ObjectEventTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction)\n{\n    u8 objectEventId;\n\n    if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId))\n    {\n        ObjectEventTurn(&gObjectEvents[objectEventId], direction);\n    }\n}\n\nvoid PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction)\n{\n    ObjectEventTurn(&gObjectEvents[playerAvatar->objectEventId], direction);\n}\n\nconst struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u8 graphicsId)\n{\n    if (graphicsId >= OBJ_EVENT_GFX_VARS)\n        graphicsId = VarGetObjectEventGraphicsId(graphicsId - OBJ_EVENT_GFX_VARS);\n    \n    if (graphicsId >= NUM_OBJ_EVENT_GFX)\n        graphicsId = OBJ_EVENT_GFX_LITTLE_BOY;\n    \n    return gObjectEventGraphicsInfoPointers[graphicsId];\n}\n\nstatic void SetObjectEventDynamicGraphicsId(struct ObjectEvent *objectEvent)\n{\n    if (objectEvent->graphicsId >= OBJ_EVENT_GFX_VARS)\n    {\n        objectEvent->graphicsId = VarGetObjectEventGraphicsId(objectEvent->graphicsId - OBJ_EVENT_GFX_VARS);\n    }\n}\n\nvoid SetObjectInvisibility(u8 localId, u8 mapNum, u8 mapGroup, u8 state)\n{\n    u8 objectEventId;\n\n    if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId))\n    {\n        gObjectEvents[objectEventId].invisible = state;\n    }\n}\n\nvoid ObjectEventGetLocalIdAndMap(struct ObjectEvent *objectEvent, void *localId, void *mapNum, void *mapGroup)\n{\n    *(u8 *)(localId) = objectEvent->localId;\n    *(u8 *)(mapNum) = objectEvent->mapNum;\n    *(u8 *)(mapGroup) = objectEvent->mapGroup;\n}\n\nvoid EnableObjectGroundEffectsByXY(s16 x, s16 y)\n{\n    u8 objectEventId;\n    struct ObjectEvent *objectEvent;\n\n    objectEventId = GetObjectEventIdByXY(x, y);\n    if (objectEventId != OBJECT_EVENTS_COUNT)\n    {\n        objectEvent = &gObjectEvents[objectEventId];\n        objectEvent->triggerGroundEffectsOnMove = TRUE;\n    }\n}\n\nvoid SetObjectSubpriority(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority)\n{\n    u8 objectEventId;\n    struct ObjectEvent *objectEvent;\n    struct Sprite *sprite;\n\n    if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId))\n    {\n        objectEvent = &gObjectEvents[objectEventId];\n        sprite = &gSprites[objectEvent->spriteId];\n        objectEvent->fixedPriority = TRUE;\n        sprite->subpriority = subpriority;\n    }\n}\n\nvoid ResetObjectSubpriority(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    u8 objectEventId;\n    struct ObjectEvent *objectEvent;\n\n    if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId))\n    {\n        objectEvent = &gObjectEvents[objectEventId];\n        objectEvent->fixedPriority = FALSE;\n        objectEvent->triggerGroundEffectsOnMove = TRUE;\n    }\n}\n\nvoid SetObjectPositionByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)\n{\n    u8 objectEventId;\n    struct Sprite *sprite;\n\n    if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId))\n    {\n        sprite = &gSprites[gObjectEvents[objectEventId].spriteId];\n        sprite->x2 = x;\n        sprite->y2 = y;\n    }\n}\n\nvoid FreeAndReserveObjectSpritePalettes(void)\n{\n    FreeAllSpritePalettes();\n    gReservedSpritePaletteCount = OBJ_PALSLOT_COUNT;\n}\n\nstatic void LoadObjectEventPalette(u16 paletteTag)\n{\n    u16 i = FindObjectEventPaletteIndexByTag(paletteTag);\n\n#ifdef BUGFIX\n    if (sObjectEventSpritePalettes[i].tag != OBJ_EVENT_PAL_TAG_NONE)\n#else\n    if (i != OBJ_EVENT_PAL_TAG_NONE) // always true\n#endif\n    {\n        TryLoadObjectPalette(&sObjectEventSpritePalettes[i]);\n    }\n}\n\n// Unused\nvoid LoadObjectEventPaletteSet(u16 *paletteTags)\n{\n    u32 i;\n\n    for (i = 0; paletteTags[i] != OBJ_EVENT_PAL_TAG_NONE; i++)\n    {\n        LoadObjectEventPalette(paletteTags[i]);\n    }\n}\n\nstatic u8 TryLoadObjectPalette(const struct SpritePalette *spritePalette)\n{\n    if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xFF)\n    {\n        // Already loaded\n        return 0xFF;\n    }\n    return LoadSpritePalette(spritePalette);\n}\n\nvoid PatchObjectPalette(u16 paletteTag, u8 paletteSlot)\n{\n    u8 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag);\n\n    LoadPalette(sObjectEventSpritePalettes[paletteIndex].data, OBJ_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP);\n    ApplyGlobalFieldPaletteTint(paletteSlot);\n}\n\nvoid PatchObjectPaletteRange(const u16 *paletteTags, u8 minSlot, u8 maxSlot)\n{\n    while (minSlot < maxSlot)\n    {\n        PatchObjectPalette(*paletteTags, minSlot);\n        paletteTags++;\n        minSlot++;\n    }\n}\n\nstatic u8 FindObjectEventPaletteIndexByTag(u16 tag)\n{\n    u32 i;\n\n    for (i = 0; sObjectEventSpritePalettes[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++)\n    {\n        if (sObjectEventSpritePalettes[i].tag == tag)\n        {\n            return i;\n        }\n    }\n    return 0xFF;\n}\n\nvoid LoadPlayerObjectReflectionPalette(u16 tag, u8 slot)\n{\n    u32 i;\n\n    PatchObjectPalette(tag, slot);\n    for (i = 0; gPlayerReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++)\n    {\n        if (gPlayerReflectionPaletteSets[i].tag == tag)\n        {\n            PatchObjectPalette(gPlayerReflectionPaletteSets[i].data[sCurrentReflectionType], gReflectionEffectPaletteMap[slot]);\n            return;\n        }\n    }\n}\n\nvoid LoadSpecialObjectReflectionPalette(u16 tag, u8 slot)\n{\n    u32 i;\n\n    sCurrentSpecialObjectPaletteTag = tag;\n    PatchObjectPalette(tag, slot);\n    for (i = 0; gSpecialObjectReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++)\n    {\n        if (gSpecialObjectReflectionPaletteSets[i].tag == tag)\n        {\n            PatchObjectPalette(gSpecialObjectReflectionPaletteSets[i].data[sCurrentReflectionType], gReflectionEffectPaletteMap[slot]);\n            return;\n        }\n    }\n}\n\n// Unused\nstatic u8 GetReflectionEffectPaletteSlot(u8 slot)\n{\n    return gReflectionEffectPaletteMap[slot];\n}\n\n// Unused\nvoid IncrementObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y)\n{\n    objectEvent->previousCoords.x = objectEvent->currentCoords.x;\n    objectEvent->previousCoords.y = objectEvent->currentCoords.y;\n    objectEvent->currentCoords.x += x;\n    objectEvent->currentCoords.y += y;\n}\n\nvoid ShiftObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y)\n{\n    objectEvent->previousCoords.x = objectEvent->currentCoords.x;\n    objectEvent->previousCoords.y = objectEvent->currentCoords.y;\n    objectEvent->currentCoords.x = x;\n    objectEvent->currentCoords.y = y;\n}\n\nstatic void SetObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y)\n{\n    objectEvent->previousCoords.x = x;\n    objectEvent->previousCoords.y = y;\n    objectEvent->currentCoords.x = x;\n    objectEvent->currentCoords.y = y;\n}\n\nvoid MoveObjectEventToMapCoords(struct ObjectEvent *objectEvent, s16 x, s16 y)\n{\n    struct Sprite *sprite;\n    const struct ObjectEventGraphicsInfo *graphicsInfo;\n\n    sprite = &gSprites[objectEvent->spriteId];\n    graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);\n    SetObjectEventCoords(objectEvent, x, y);\n    SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y);\n    sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);\n    sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);\n    sprite->x += 8;\n    sprite->y += 16 + sprite->centerToCornerVecY;\n    ResetObjectEventFldEffData(objectEvent);\n    if (objectEvent->trackedByCamera)\n        CameraObjectReset1();\n}\n\nvoid TryMoveObjectEventToMapCoords(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)\n{\n    u8 objectEventId;\n    if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId))\n    {\n        x += MAP_OFFSET;\n        y += MAP_OFFSET;\n        MoveObjectEventToMapCoords(&gObjectEvents[objectEventId], x, y);\n    }\n}\n\nvoid ShiftStillObjectEventCoords(struct ObjectEvent *objectEvent)\n{\n    ShiftObjectEventCoords(objectEvent, objectEvent->currentCoords.x, objectEvent->currentCoords.y);\n}\n\nvoid UpdateObjectEventCoordsForCameraUpdate(void)\n{\n    u32 i;\n    s16 dx;\n    s16 dy;\n\n    if (gCamera.active)\n    {\n        dx = gCamera.x;\n        dy = gCamera.y;\n        for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n        {\n            if (gObjectEvents[i].active)\n            {\n                gObjectEvents[i].initialCoords.x -= dx;\n                gObjectEvents[i].initialCoords.y -= dy;\n                gObjectEvents[i].currentCoords.x -= dx;\n                gObjectEvents[i].currentCoords.y -= dy;\n                gObjectEvents[i].previousCoords.x -= dx;\n                gObjectEvents[i].previousCoords.y -= dy;\n            }\n        }\n    }\n}\n\nu8 GetObjectEventIdByPosition(u16 x, u16 y, u8 elevation)\n{\n    u32 i;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (gObjectEvents[i].active)\n        {\n            if (gObjectEvents[i].currentCoords.x == x\n             && gObjectEvents[i].currentCoords.y == y\n             && ObjectEventDoesElevationMatch(&gObjectEvents[i], elevation))\n                return i;\n        }\n    }\n    return OBJECT_EVENTS_COUNT;\n}\n\nstatic bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *objectEvent, u8 elevation)\n{\n    if (objectEvent->currentElevation != 0 && elevation != 0 && objectEvent->currentElevation != elevation)\n        return FALSE;\n\n    return TRUE;\n}\n\nvoid UpdateObjectEventsForCameraUpdate(s16 x, s16 y)\n{\n    UpdateObjectEventCoordsForCameraUpdate();\n    TrySpawnObjectEvents(x, y);\n    RemoveObjectEventsOutsideView();\n}\n\nu8 AddCameraObject(u8 linkedSpriteId)\n{\n    u8 spriteId = CreateSprite(&gCameraSpriteTemplate, 0, 0, 4);\n\n    gSprites[spriteId].invisible = TRUE;\n    gSprites[spriteId].data[0] = linkedSpriteId;\n    return spriteId;\n}\n\nstatic void ObjectCB_CameraObject(struct Sprite *sprite)\n{\n    void (*callbacks[NELEMS(gCameraObjectFuncs)])(struct Sprite *);\n\n    memcpy(callbacks, gCameraObjectFuncs, sizeof gCameraObjectFuncs);\n    callbacks[sprite->data[1]](sprite);\n}\n\nstatic void CameraObject_0(struct Sprite *sprite)\n{\n    sprite->x = gSprites[sprite->data[0]].x;\n    sprite->y = gSprites[sprite->data[0]].y;\n    sprite->invisible = TRUE;\n    sprite->data[1] = 1;\n    CameraObject_1(sprite);\n}\n\nstatic void CameraObject_1(struct Sprite *sprite)\n{\n    s16 x = gSprites[sprite->data[0]].x;\n    s16 y = gSprites[sprite->data[0]].y;\n\n    sprite->data[2] = x - sprite->x;\n    sprite->data[3] = y - sprite->y;\n    sprite->x = x;\n    sprite->y = y;\n}\n\nstatic void CameraObject_2(struct Sprite *sprite)\n{\n    sprite->x = gSprites[sprite->data[0]].x;\n    sprite->y = gSprites[sprite->data[0]].y;\n    sprite->data[2] = 0;\n    sprite->data[3] = 0;\n}\n\nstatic struct Sprite *FindCameraObject(void)\n{\n    u32 i;\n\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject)\n        {\n            return &gSprites[i];\n        }\n    }\n    return NULL;\n}\n\nvoid CameraObjectReset1(void)\n{\n    struct Sprite *cameraObject;\n\n    cameraObject = FindCameraObject();\n    if (cameraObject != NULL)\n    {\n        cameraObject->data[1] = 0;\n        cameraObject->callback(cameraObject);\n    }\n}\n\nvoid CameraObjectSetFollowedObjectId(u8 objectId)\n{\n    struct Sprite *cameraObject;\n\n    cameraObject = FindCameraObject();\n    if (cameraObject != NULL)\n    {\n        cameraObject->data[0] = objectId;\n        CameraObjectReset1();\n    }\n}\n\nu8 CameraObjectGetFollowedObjectId(void)\n{\n    struct Sprite *cameraObject;\n\n    cameraObject = FindCameraObject();\n    if (cameraObject == NULL)\n    {\n        return MAX_SPRITES;\n    }\n    return cameraObject->data[0];\n}\n\nvoid CameraObjectReset2(void)\n{\n    FindCameraObject()->data[1] = 2;\n}\n\nu8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority)\n{\n    u32 i;\n\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        if (!gSprites[i].inUse)\n        {\n            gSprites[i] = *sprite;\n            gSprites[i].x = x;\n            gSprites[i].y = y;\n            gSprites[i].subpriority = subpriority;\n            break;\n        }\n    }\n    return i;\n}\n\nu8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority)\n{\n    s32 i;\n\n    for (i = MAX_SPRITES - 1; i > -1; i--)\n    {\n        if (!gSprites[i].inUse)\n        {\n            gSprites[i] = *sprite;\n            gSprites[i].x = x;\n            gSprites[i].y = y;\n            gSprites[i].subpriority = subpriority;\n            return i;\n        }\n    }\n    return MAX_SPRITES;\n}\n\nvoid SetObjectEventDirection(struct ObjectEvent *objectEvent, u8 direction)\n{\n    s8 d2;\n    objectEvent->previousMovementDirection = objectEvent->facingDirection;\n    if (!objectEvent->facingDirectionLocked)\n    {\n        d2 = direction;\n        objectEvent->facingDirection = d2;\n    }\n    objectEvent->movementDirection = direction;\n}\n\nstatic const u8 *GetObjectEventScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->script;\n}\n\nconst u8 *GetObjectEventScriptPointerByObjectEventId(u8 objectEventId)\n{\n    return GetObjectEventScriptPointerByLocalIdAndMap(gObjectEvents[objectEventId].localId, gObjectEvents[objectEventId].mapNum, gObjectEvents[objectEventId].mapGroup);\n}\n\nstatic u16 GetObjectEventFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    const struct ObjectEventTemplate *obj = GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup);\n#ifdef UBFIX\n    // BUG: The function may return NULL, and attempting to read from NULL may freeze the game using modern compilers.\n    if (obj == NULL)\n        return 0;\n#endif // UBFIX\n    return obj->flagId;\n}\n\nstatic u16 GetObjectEventFlagIdByObjectEventId(u8 objectEventId)\n{\n    return GetObjectEventFlagIdByLocalIdAndMap(gObjectEvents[objectEventId].localId, gObjectEvents[objectEventId].mapNum, gObjectEvents[objectEventId].mapGroup);\n}\n\n// Unused\nu8 GetObjectTrainerTypeByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    u8 objectEventId;\n\n    if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId))\n        return 0xFF;\n\n    return gObjectEvents[objectEventId].trainerType;\n}\n\nu16 GetBoulderRevealFlagByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    // Pushable boulder object events store the flag to reveal the boulder\n    // on the floor below in their trainer type field.\n    return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->objUnion.normal.trainerType;\n}\n\n// Unused\nu8 GetObjectTrainerTypeByObjectEventId(u8 objectEventId)\n{\n    return gObjectEvents[objectEventId].trainerType;\n}\n\n// Unused\nu8 GetObjectEventBerryTreeIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    u8 objectEventId;\n\n    if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId))\n        return 0xFF;\n\n    return gObjectEvents[objectEventId].trainerRange_berryTreeId;\n}\n\n// Unused\nu8 GetObjectEventBerryTreeId(u8 objectEventId)\n{\n    return gObjectEvents[objectEventId].trainerRange_berryTreeId;\n}\n\nstatic const struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    const struct ObjectEventTemplate *templates;\n    const struct MapHeader *mapHeader;\n    u8 count;\n\n    if (gSaveBlock1Ptr->location.mapNum == mapNum && gSaveBlock1Ptr->location.mapGroup == mapGroup)\n    {\n        templates = gSaveBlock1Ptr->objectEventTemplates;\n        count = gMapHeader.events->objectEventCount;\n    }\n    else\n    {\n        mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum);\n        templates = mapHeader->events->objectEvents;\n        count = mapHeader->events->objectEventCount;\n    }\n    return FindObjectEventTemplateByLocalId(localId, templates, count);\n}\n\nstatic const struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8 localId, const struct ObjectEventTemplate *templates, u8 count)\n{\n    u32 i;\n\n    for (i = 0; i < count; i++)\n    {\n        if (templates[i].localId == localId)\n        {\n            return &templates[i];\n        }\n    }\n    return NULL;\n}\n\nstruct ObjectEventTemplate *GetBaseTemplateForObjectEvent(const struct ObjectEvent *objectEvent)\n{\n    int i;\n\n    if (objectEvent->mapNum != gSaveBlock1Ptr->location.mapNum || objectEvent->mapGroup != gSaveBlock1Ptr->location.mapGroup)\n    {\n        return NULL;\n    }\n    for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++)\n    {\n        if ((objectEvent->localId == gSaveBlock1Ptr->objectEventTemplates[i].localId)\n         && (objectEvent->mapNum == gSaveBlock1Ptr->location.mapNum)\n         && (objectEvent->mapGroup == gSaveBlock1Ptr->location.mapGroup))\n            return &gSaveBlock1Ptr->objectEventTemplates[i];\n    }\n    return NULL;\n}\n\nvoid OverrideTemplateCoordsForObjectEvent(const struct ObjectEvent *objectEvent)\n{\n    struct ObjectEventTemplate *objectEventTemplate;\n\n    objectEventTemplate = GetBaseTemplateForObjectEvent(objectEvent);\n    if (objectEventTemplate != NULL)\n    {\n        objectEventTemplate->x = objectEvent->currentCoords.x - MAP_OFFSET;\n        objectEventTemplate->y = objectEvent->currentCoords.y - MAP_OFFSET;\n    }\n}\n\nvoid OverrideMovementTypeForObjectEvent(const struct ObjectEvent *objectEvent, u8 movementType)\n{\n    struct ObjectEventTemplate *objectEventTemplate;\n\n    objectEventTemplate = GetBaseTemplateForObjectEvent(objectEvent);\n    if (objectEventTemplate != NULL)\n    {\n        objectEventTemplate->objUnion.normal.movementType = movementType;\n    }\n}\n\nvoid TryOverrideObjectEventTemplateCoords(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    u8 objectEventId;\n    if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId))\n        OverrideTemplateCoordsForObjectEvent(&gObjectEvents[objectEventId]);\n}\n\nvoid InitObjectEventPalettes(u8 palSlot)\n{\n    FreeAndReserveObjectSpritePalettes();\n    sCurrentSpecialObjectPaletteTag = OBJ_EVENT_PAL_TAG_NONE;\n    sCurrentReflectionType = palSlot;\n    if (palSlot == 1)\n    {\n        PatchObjectPaletteRange(gObjectPaletteTagSets[sCurrentReflectionType], 0, 6);\n        gReservedSpritePaletteCount = 8;\n    }\n    else\n    {\n        PatchObjectPaletteRange(gObjectPaletteTagSets[sCurrentReflectionType], 0, 10);\n    }\n}\n\nu16 GetObjectPaletteTag(u8 palSlot)\n{\n    u32 i;\n\n    if (palSlot < 10)\n    {\n        return gObjectPaletteTagSets[sCurrentReflectionType][palSlot];\n    }\n    for (i = 0; gSpecialObjectReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++)\n    {\n        if (gSpecialObjectReflectionPaletteSets[i].tag == sCurrentSpecialObjectPaletteTag)\n        {\n            return gSpecialObjectReflectionPaletteSets[i].data[sCurrentReflectionType];\n        }\n    }\n    return OBJ_EVENT_PAL_TAG_NONE;\n}\n\nmovement_type_empty_callback(MovementType_None)\nmovement_type_def(MovementType_WanderAround, gMovementTypeFuncs_WanderAround)\nmovement_type_def(MovementType_WanderAroundSlower, gMovementTypeFuncs_WanderAroundSlower)\n\nstatic bool8 MovementType_WanderAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderAround_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (!ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        return FALSE;\n    }\n    SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]);\n    sprite->data[1] = 3;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_WanderAround_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[4];\n    u8 chosenDirection;\n\n    memcpy(directions, gStandardDirections, sizeof directions);\n    chosenDirection = directions[Random() & 3];\n    SetObjectEventDirection(objectEvent, chosenDirection);\n    sprite->data[1] = 5;\n    if (GetCollisionInDirection(objectEvent, chosenDirection))\n        sprite->data[1] = 1;\n\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderAround_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(objectEvent->movementDirection));\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 6;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderAround_Step5Slower(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowerMovementAction(objectEvent->movementDirection));\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 6;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderAround_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 1;\n    }\n    return FALSE;\n}\n\nbool8 ObjectEventIsTrainerAndCloseToPlayer(struct ObjectEvent *objectEvent)\n{\n    s16 playerX;\n    s16 playerY;\n    s16 objX;\n    s16 objY;\n    s16 minX;\n    s16 maxX;\n    s16 minY;\n    s16 maxY;\n\n    if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH))\n        return FALSE;\n    if (objectEvent->trainerType != TRAINER_TYPE_NORMAL && objectEvent->trainerType != TRAINER_TYPE_BURIED)\n        return FALSE;\n    PlayerGetDestCoords(&playerX, &playerY);\n    objX = objectEvent->currentCoords.x;\n    objY = objectEvent->currentCoords.y;\n    minX = objX - objectEvent->trainerRange_berryTreeId;\n    minY = objY - objectEvent->trainerRange_berryTreeId;\n    maxX = objX + objectEvent->trainerRange_berryTreeId;\n    maxY = objY + objectEvent->trainerRange_berryTreeId;\n    if (minX > playerX || maxX < playerX || minY > playerY || maxY < playerY)\n    {\n        return FALSE;\n    }\n    return TRUE;\n}\n\nstatic u8 GetVectorDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)\n{\n    u8 direction;\n\n    if (absdx > absdy)\n    {\n        direction = DIR_EAST;\n        if (dx < 0)\n        {\n            direction = DIR_WEST;\n        }\n    }\n    else\n    {\n        direction = DIR_SOUTH;\n        if (dy < 0)\n        {\n            direction = DIR_NORTH;\n        }\n    }\n    return direction;\n}\n\nstatic u8 GetLimitedVectorDirection_SouthNorth(s16 dx, s16 dy, s16 absdx, s16 absdy)\n{\n    u8 direction;\n\n    direction = DIR_SOUTH;\n    if (dy < 0)\n    {\n        direction = DIR_NORTH;\n    }\n    return direction;\n}\n\nstatic u8 GetLimitedVectorDirection_WestEast(s16 dx, s16 dy, s16 absdx, s16 absdy)\n{\n    u8 direction;\n\n    direction = DIR_EAST;\n    if (dx < 0)\n    {\n        direction = DIR_WEST;\n    }\n    return direction;\n}\n\nstatic u8 GetLimitedVectorDirection_WestNorth(s16 dx, s16 dy, s16 absdx, s16 absdy)\n{\n    u8 direction;\n\n    direction = GetVectorDirection(dx, dy, absdx, absdy);\n    if (direction == DIR_SOUTH)\n    {\n        direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy);\n        if (direction == DIR_EAST)\n        {\n            direction = DIR_NORTH;\n        }\n    }\n    else if (direction == DIR_EAST)\n    {\n        direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy);\n        if (direction == DIR_SOUTH)\n        {\n            direction = DIR_NORTH;\n        }\n    }\n    return direction;\n}\n\nstatic u8 GetLimitedVectorDirection_EastNorth(s16 dx, s16 dy, s16 absdx, s16 absdy)\n{\n    u8 direction;\n\n    direction = GetVectorDirection(dx, dy, absdx, absdy);\n    if (direction == DIR_SOUTH)\n    {\n        direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy);\n        if (direction == DIR_WEST)\n        {\n            direction = DIR_NORTH;\n        }\n    }\n    else if (direction == DIR_WEST)\n    {\n        direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy);\n        if (direction == DIR_SOUTH)\n        {\n            direction = DIR_NORTH;\n        }\n    }\n    return direction;\n}\n\nstatic u8 GetLimitedVectorDirection_WestSouth(s16 dx, s16 dy, s16 absdx, s16 absdy)\n{\n    u8 direction;\n\n    direction = GetVectorDirection(dx, dy, absdx, absdy);\n    if (direction == DIR_NORTH)\n    {\n        direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy);\n        if (direction == DIR_EAST)\n        {\n            direction = DIR_SOUTH;\n        }\n    }\n    else if (direction == DIR_EAST)\n    {\n        direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy);\n        if (direction == DIR_NORTH)\n        {\n            direction = DIR_SOUTH;\n        }\n    }\n    return direction;\n}\n\nstatic u8 GetLimitedVectorDirection_EastSouth(s16 dx, s16 dy, s16 absdx, s16 absdy)\n{\n    u8 direction;\n\n    direction = GetVectorDirection(dx, dy, absdx, absdy);\n    if (direction == DIR_NORTH)\n    {\n        direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy);\n        if (direction == DIR_WEST)\n        {\n            direction = DIR_SOUTH;\n        }\n    }\n    else if (direction == DIR_WEST)\n    {\n        direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy);\n        if (direction == DIR_NORTH)\n        {\n            direction = DIR_SOUTH;\n        }\n    }\n    return direction;\n}\n\nstatic u8 GetLimitedVectorDirection_SouthNorthWest(s16 dx, s16 dy, s16 absdx, s16 absdy)\n{\n    u8 direction;\n\n    direction = GetVectorDirection(dx, dy, absdx, absdy);\n    if (direction == DIR_EAST)\n    {\n        direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy);\n    }\n    return direction;\n}\n\nstatic u8 GetLimitedVectorDirection_SouthNorthEast(s16 dx, s16 dy, s16 absdx, s16 absdy)\n{\n    u8 direction;\n\n    direction = GetVectorDirection(dx, dy, absdx, absdy);\n    if (direction == DIR_WEST)\n    {\n        direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy);\n    }\n    return direction;\n}\n\nstatic u8 GetLimitedVectorDirection_NorthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy)\n{\n    u8 direction;\n\n    direction = GetVectorDirection(dx, dy, absdx, absdy);\n    if (direction == DIR_SOUTH)\n    {\n        direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy);\n    }\n    return direction;\n}\n\nstatic u8 GetLimitedVectorDirection_SouthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy)\n{\n    u8 direction;\n\n    direction = GetVectorDirection(dx, dy, absdx, absdy);\n    if (direction == DIR_NORTH)\n    {\n        direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy);\n    }\n    return direction;\n}\n\nu8 TryGetTrainerEncounterDirection(struct ObjectEvent *objectEvent, u8 movementType)\n{\n    s16 dx, dy;\n    s16 absdx, absdy;\n\n    if (!ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        return 0;\n    }\n    PlayerGetDestCoords(&dx, &dy);\n    dx -= objectEvent->currentCoords.x;\n    dy -= objectEvent->currentCoords.y;\n    absdx = dx;\n    absdy = dy;\n    if (absdx < 0)\n    {\n        absdx = -absdx;\n    }\n    if (absdy < 0)\n    {\n        absdy = -absdy;\n    }\n    return gGetVectorDirectionFuncs[movementType](dx, dy, absdx, absdy);\n}\n\nmovement_type_def(MovementType_LookAround, gMovementTypeFuncs_LookAround)\n\nstatic bool8 MovementType_LookAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_LookAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_LookAround_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]);\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_LookAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_LookAround_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[4];\n    memcpy(directions, gStandardDirections, sizeof directions);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_ANY);\n    if (direction == DIR_NONE)\n        direction = directions[Random() & 3];\n\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_WanderUpAndDown, gMovementTypeFuncs_WanderUpAndDown)\n\nstatic bool8 MovementType_WanderUpAndDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderUpAndDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (!ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        return FALSE;\n    }\n    SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]);\n    sprite->data[1] = 3;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[2];\n    memcpy(directions, gUpAndDownDirections, sizeof directions);\n    direction = directions[Random() & 1];\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 5;\n    if (GetCollisionInDirection(objectEvent, direction))\n        sprite->data[1] = 1;\n\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderUpAndDown_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(objectEvent->movementDirection));\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 6;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderUpAndDown_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 1;\n    }\n    return FALSE;\n}\n\nmovement_type_def(MovementType_WanderLeftAndRight, gMovementTypeFuncs_WanderLeftAndRight)\n\nstatic bool8 MovementType_WanderLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (!ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        return FALSE;\n    }\n    SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]);\n    sprite->data[1] = 3;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[2];\n    memcpy(directions, gLeftAndRightDirections, sizeof directions);\n    direction = directions[Random() & 1];\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 5;\n    if (GetCollisionInDirection(objectEvent, direction))\n        sprite->data[1] = 1;\n\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderLeftAndRight_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(objectEvent->movementDirection));\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 6;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WanderLeftAndRight_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 1;\n    }\n    return FALSE;\n}\n\nmovement_type_def(MovementType_FaceDirection, gMovementTypeFuncs_FaceDirection)\n\nstatic bool8 MovementType_FaceDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDirection_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        sprite->data[1] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDirection_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->singleMovementActive = FALSE;\n    return FALSE;\n}\n\nmovement_type_def(MovementType_FaceDownAndUp, gMovementTypeFuncs_FaceDownAndUp)\n\nstatic bool8 MovementType_FaceDownAndUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDownAndUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDownAndUp_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]);\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDownAndUp_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDownAndUp_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[2];\n    memcpy(directions, gUpAndDownDirections, sizeof gUpAndDownDirections);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_SOUTH);\n    if (direction == DIR_NONE)\n    {\n        direction = directions[Random() & 1];\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_FaceLeftAndRight, gMovementTypeFuncs_FaceLeftAndRight)\n\nstatic bool8 MovementType_FaceLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]);\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[2];\n    memcpy(directions, gLeftAndRightDirections, sizeof gLeftAndRightDirections);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_EAST_WEST);\n    if (direction == DIR_NONE)\n    {\n        direction = directions[Random() & 1];\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_FaceUpAndLeft, gMovementTypeFuncs_FaceUpAndLeft)\n\nstatic bool8 MovementType_FaceUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[2];\n    memcpy(directions, gUpAndLeftDirections, sizeof gUpAndLeftDirections);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_WEST);\n    if (direction == DIR_NONE)\n    {\n        direction = directions[Random() & 1];\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_FaceUpAndRight, gMovementTypeFuncs_FaceUpAndRight)\n\nstatic bool8 MovementType_FaceUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceUpAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceUpAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceUpAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[2];\n    memcpy(directions, gUpAndRightDirections, sizeof gUpAndRightDirections);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_EAST);\n    if (direction == DIR_NONE)\n    {\n        direction = directions[Random() & 1];\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_FaceDownAndLeft, gMovementTypeFuncs_FaceDownAndLeft)\n\nstatic bool8 MovementType_FaceDownAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDownAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDownAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDownAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDownAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[2];\n    memcpy(directions, gDownAndLeftDirections, sizeof gDownAndLeftDirections);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_SOUTH_WEST);\n    if (direction == DIR_NONE)\n    {\n        direction = directions[Random() & 1];\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_FaceDownAndRight, gMovementTypeFuncs_FaceDownAndRight)\n\nstatic bool8 MovementType_FaceDownAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDownAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDownAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDownAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDownAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[2];\n    memcpy(directions, gDownAndRightDirections, sizeof gDownAndRightDirections);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_SOUTH_EAST);\n    if (direction == DIR_NONE)\n    {\n        direction = directions[Random() & 1];\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_FaceDownUpAndLeft, gMovementTypeFuncs_FaceDownUpAndLeft)\n\nstatic bool8 MovementType_FaceDownUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDownUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDownUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDownUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDownUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[4];\n    memcpy(directions, gDownUpAndLeftDirections, sizeof gDownUpAndLeftDirections);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_SOUTH_WEST);\n    if (direction == DIR_NONE)\n    {\n        direction = directions[Random() & 3];\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_FaceDownUpAndRight, gMovementTypeFuncs_FaceDownUpAndRight)\n\nstatic bool8 MovementType_FaceDownUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDownUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDownUpAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDownUpAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDownUpAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[4];\n    memcpy(directions, gDownUpAndRightDirections, sizeof gDownUpAndRightDirections);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_SOUTH_EAST);\n    if (direction == DIR_NONE)\n    {\n        direction = directions[Random() & 3];\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_FaceUpRightAndLeft, gMovementTypeFuncs_FaceUpLeftAndRight)\n\nstatic bool8 MovementType_FaceUpLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceUpLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceUpLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceUpLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceUpLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[4];\n    memcpy(directions, gUpLeftAndRightDirections, sizeof gUpLeftAndRightDirections);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_EAST_WEST);\n    if (direction == DIR_NONE)\n    {\n        direction = directions[Random() & 3];\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_FaceDownRightAndLeft, gMovementTypeFuncs_FaceDownLeftAndRight)\n\nstatic bool8 MovementType_FaceDownLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDownLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_FaceDownLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDownLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 4;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_FaceDownLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[4];\n    memcpy(directions, gDownLeftAndRightDirections, sizeof gDownLeftAndRightDirections);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_SOUTH_EAST_WEST);\n    if (direction == DIR_NONE)\n    {\n        direction = directions[Random() & 3];\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_RotateCounterclockwise, gMovementTypeFuncs_RotateCounterclockwise)\n\nstatic bool8 MovementType_RotateCounterclockwise_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_RotateCounterclockwise_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, 48);\n        sprite->data[1] = 2;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_RotateCounterclockwise_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_RotateCounterclockwise_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[5];\n    memcpy(directions, gCounterclockwiseDirections, sizeof gCounterclockwiseDirections);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_ANY);\n    if (direction == DIR_NONE)\n    {\n        direction = directions[objectEvent->facingDirection];\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 0;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_RotateClockwise, gMovementTypeFuncs_RotateClockwise)\n\nstatic bool8 MovementType_RotateClockwise_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_RotateClockwise_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        SetMovementDelay(sprite, 48);\n        sprite->data[1] = 2;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_RotateClockwise_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent))\n    {\n        sprite->data[1] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_RotateClockwise_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n    u8 directions[5];\n    memcpy(directions, gClockwiseDirections, sizeof gClockwiseDirections);\n    direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_ANY);\n    if (direction == DIR_NONE)\n    {\n        direction = directions[objectEvent->facingDirection];\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 0;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_WalkBackAndForth, gMovementTypeFuncs_WalkBackAndForth)\n\nstatic bool8 MovementType_WalkBackAndForth_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WalkBackAndForth_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 direction;\n\n    direction = gInitialMovementTypeFacingDirections[objectEvent->movementType];\n    if (objectEvent->directionSequenceIndex)\n    {\n        direction = GetOppositeDirection(direction);\n    }\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WalkBackAndForth_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    bool8 collision;\n    u8 movementActionId;\n\n    if (objectEvent->directionSequenceIndex && objectEvent->initialCoords.x == objectEvent->currentCoords.x && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 0;\n        SetObjectEventDirection(objectEvent, GetOppositeDirection(objectEvent->movementDirection));\n    }\n    collision = GetCollisionInDirection(objectEvent, objectEvent->movementDirection);\n    movementActionId = GetWalkNormalMovementAction(objectEvent->movementDirection);\n    if (collision == COLLISION_OUTSIDE_RANGE)\n    {\n        objectEvent->directionSequenceIndex++;\n        SetObjectEventDirection(objectEvent, GetOppositeDirection(objectEvent->movementDirection));\n        movementActionId = GetWalkNormalMovementAction(objectEvent->movementDirection);\n        collision = GetCollisionInDirection(objectEvent, objectEvent->movementDirection);\n    }\n\n    if (collision)\n        movementActionId = GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection);\n\n    ObjectEventSetSingleMovement(objectEvent, sprite, movementActionId);\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 3;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WalkBackAndForth_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 1;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_WalkSequence_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nbool8 MoveNextDirectionInSequence(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 *route)\n{\n    u8 collision;\n    u8 movementActionId;\n\n    if (objectEvent->directionSequenceIndex == 3 && objectEvent->initialCoords.x == objectEvent->currentCoords.x && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n        objectEvent->directionSequenceIndex = 0;\n\n    SetObjectEventDirection(objectEvent, route[objectEvent->directionSequenceIndex]);\n    movementActionId = GetWalkNormalMovementAction(objectEvent->movementDirection);\n    collision = GetCollisionInDirection(objectEvent, objectEvent->movementDirection);\n    if (collision == COLLISION_OUTSIDE_RANGE)\n    {\n        objectEvent->directionSequenceIndex++;\n        SetObjectEventDirection(objectEvent, route[objectEvent->directionSequenceIndex]);\n        movementActionId = GetWalkNormalMovementAction(objectEvent->movementDirection);\n        collision = GetCollisionInDirection(objectEvent, objectEvent->movementDirection);\n    }\n\n    if (collision)\n        movementActionId = GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection);\n\n    ObjectEventSetSingleMovement(objectEvent, sprite, movementActionId);\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 MovementType_WalkSequence_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 1;\n    }\n    return FALSE;\n}\n\nmovement_type_def(MovementType_WalkSequenceUpRightLeftDown, gMovementTypeFuncs_WalkSequenceUpRightLeftDown)\n\nu8 MovementType_WalkSequenceUpRightLeftDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gUpRightLeftDownDirections)];\n    memcpy(directions, gUpRightLeftDownDirections, sizeof(gUpRightLeftDownDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceRightLeftDownUp, gMovementTypeFuncs_WalkSequenceRightLeftDownUp)\n\nu8 MovementType_WalkSequenceRightLeftDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gRightLeftDownUpDirections)];\n    memcpy(directions, gRightLeftDownUpDirections, sizeof(gRightLeftDownUpDirections));\n    if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.x == objectEvent->currentCoords.x)\n    {\n        objectEvent->directionSequenceIndex = 2;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceDownUpRightLeft, gMovementTypeFuncs_WalkSequenceDownUpRightLeft)\n\nu8 MovementType_WalkSequenceDownUpRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gDownUpRightLeftDirections)];\n    memcpy(directions, gDownUpRightLeftDirections, sizeof(gDownUpRightLeftDirections));\n    if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 2;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceLeftDownUpRight, gMovementTypeFuncs_WalkSequenceLeftDownUpRight)\n\nu8 MovementType_WalkSequenceLeftDownUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gLeftDownUpRightDirections)];\n    memcpy(directions, gLeftDownUpRightDirections, sizeof(gLeftDownUpRightDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceUpLeftRightDown, gMovementTypeFuncs_WalkSequenceUpLeftRightDown)\n\nu8 MovementType_WalkSequenceUpLeftRightDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gUpLeftRightDownDirections)];\n    memcpy(directions, gUpLeftRightDownDirections, sizeof(gUpLeftRightDownDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceLeftRightDownUp, gMovementTypeFuncs_WalkSequenceLeftRightDownUp)\n\nu8 MovementType_WalkSequenceLeftRightDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gLeftRightDownUpDirections)];\n    memcpy(directions, gLeftRightDownUpDirections, sizeof(gLeftRightDownUpDirections));\n    if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.x == objectEvent->currentCoords.x)\n    {\n        objectEvent->directionSequenceIndex = 2;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceDownUpLeftRight, gMovementTypeFuncs_WalkSequenceDownUpLeftRight)\n\nu8 MovementType_WalkSequenceDownUpLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gStandardDirections)];\n    memcpy(directions, gStandardDirections, sizeof(gStandardDirections));\n    if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 2;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceRightDownUpLeft, gMovementTypeFuncs_WalkSequenceRightDownUpLeft)\n\nu8 MovementType_WalkSequenceRightDownUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gRightDownUpLeftDirections)];\n    memcpy(directions, gRightDownUpLeftDirections, sizeof(gRightDownUpLeftDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceLeftUpDownRight, gMovementTypeFuncs_WalkSequenceLeftUpDownRight)\n\nu8 MovementType_WalkSequenceLeftUpDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gLeftUpDownRightDirections)];\n    memcpy(directions, gLeftUpDownRightDirections, sizeof(gLeftUpDownRightDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceUpDownRightLeft, gMovementTypeFuncs_WalkSequenceUpDownRightLeft)\n\nu8 MovementType_WalkSequenceUpDownRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gUpDownRightLeftDirections)];\n    memcpy(directions, gUpDownRightLeftDirections, sizeof(gUpDownRightLeftDirections));\n    if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 2;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceRightLeftUpDown, gMovementTypeFuncs_WalkSequenceRightLeftUpDown)\n\nu8 MovementType_WalkSequenceRightLeftUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gRightLeftUpDownDirections)];\n    memcpy(directions, gRightLeftUpDownDirections, sizeof(gRightLeftUpDownDirections));\n    if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.x == objectEvent->currentCoords.x)\n    {\n        objectEvent->directionSequenceIndex = 2;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceDownRightLeftUp, gMovementTypeFuncs_WalkSequenceDownRightLeftUp)\n\nu8 MovementType_WalkSequenceDownRightLeftUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gDownRightLeftUpDirections)];\n    memcpy(directions, gDownRightLeftUpDirections, sizeof(gDownRightLeftUpDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceRightUpDownLeft, gMovementTypeFuncs_WalkSequenceRightUpDownLeft)\n\nu8 MovementType_WalkSequenceRightUpDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gRightUpDownLeftDirections)];\n    memcpy(directions, gRightUpDownLeftDirections, sizeof(gRightUpDownLeftDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceUpDownLeftRight, gMovementTypeFuncs_WalkSequenceUpDownLeftRight)\n\nu8 MovementType_WalkSequenceUpDownLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gUpDownLeftRightDirections)];\n    memcpy(directions, gUpDownLeftRightDirections, sizeof(gUpDownLeftRightDirections));\n    if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 2;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceLeftRightUpDown, gMovementTypeFuncs_WalkSequenceLeftRightUpDown)\n\nu8 MovementType_WalkSequenceLeftRightUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gLeftRightUpDownDirections)];\n    memcpy(directions, gLeftRightUpDownDirections, sizeof(gLeftRightUpDownDirections));\n    if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.x == objectEvent->currentCoords.x)\n    {\n        objectEvent->directionSequenceIndex = 2;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceDownLeftRightUp, gMovementTypeFuncs_WalkSequenceDownLeftRightUp)\n\nu8 MovementType_WalkSequenceDownLeftRightUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gDownLeftRightUpDirections)];\n    memcpy(directions, gDownLeftRightUpDirections, sizeof(gDownLeftRightUpDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceUpLeftDownRight, gMovementTypeFuncs_WalkSequenceUpLeftDownRight)\n\nu8 MovementType_WalkSequenceUpLeftDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gUpLeftDownRightDirections)];\n    memcpy(directions, gUpLeftDownRightDirections, sizeof(gUpLeftDownRightDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceDownRightUpLeft, gMovementTypeFuncs_WalkSequenceDownRightUpLeft)\n\nu8 MovementType_WalkSequenceDownRightUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gDownRightUpLeftDirections)];\n    memcpy(directions, gDownRightUpLeftDirections, sizeof(gDownRightUpLeftDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceLeftDownRightUp, gMovementTypeFuncs_WalkSequenceLeftDownRightUp)\n\nu8 MovementType_WalkSequenceLeftDownRightUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gLeftDownRightUpDirections)];\n    memcpy(directions, gLeftDownRightUpDirections, sizeof(gLeftDownRightUpDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceRightUpLeftDown, gMovementTypeFuncs_WalkSequenceRightUpLeftDown)\n\nu8 MovementType_WalkSequenceRightUpLeftDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gRightUpLeftDownDirections)];\n    memcpy(directions, gRightUpLeftDownDirections, sizeof(gRightUpLeftDownDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceUpRightDownLeft, gMovementTypeFuncs_WalkSequenceUpRightDownLeft)\n\nu8 MovementType_WalkSequenceUpRightDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gUpRightDownLeftDirections)];\n    memcpy(directions, gUpRightDownLeftDirections, sizeof(gUpRightDownLeftDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceDownLeftUpRight, gMovementTypeFuncs_WalkSequenceDownLeftUpRight)\n\nu8 MovementType_WalkSequenceDownLeftUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gDownLeftUpRightDirections)];\n    memcpy(directions, gDownLeftUpRightDirections, sizeof(gDownLeftUpRightDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceLeftUpRightDown, gMovementTypeFuncs_WalkSequenceLeftUpRightDown)\n\nu8 MovementType_WalkSequenceLeftUpRightDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gLeftUpRightDownDirections)];\n    memcpy(directions, gLeftUpRightDownDirections, sizeof(gLeftUpRightDownDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_WalkSequenceRightDownLeftUp, gMovementTypeFuncs_WalkSequenceRightDownLeftUp)\n\nu8 MovementType_WalkSequenceRightDownLeftUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 directions[sizeof(gRightDownLeftUpDirections)];\n    memcpy(directions, gRightDownLeftUpDirections, sizeof(gRightDownLeftUpDirections));\n    if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x)\n    {\n        objectEvent->directionSequenceIndex = 3;\n    }\n    return MoveNextDirectionInSequence(objectEvent, sprite, directions);\n}\n\nmovement_type_def(MovementType_CopyPlayer, gMovementTypeFuncs_CopyPlayer)\n\nstatic bool8 MovementType_CopyPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    if (objectEvent->directionSequenceIndex == 0)\n    {\n        objectEvent->directionSequenceIndex = GetPlayerFacingDirection();\n    }\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_CopyPlayer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == MOVEMENT_ACTION_NONE || gPlayerAvatar.tileTransitionState == T_TILE_CENTER)\n    {\n        return FALSE;\n    }\n    return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), NULL);\n}\n\nstatic bool8 MovementType_CopyPlayer_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        objectEvent->singleMovementActive = FALSE;\n        sprite->data[1] = 1;\n    }\n    return FALSE;\n}\n\nstatic bool8 CopyablePlayerMovement_None(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))\n{\n    return FALSE;\n}\n\nstatic bool8 CopyablePlayerMovement_FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))\n{\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, playerDirection)));\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 CopyablePlayerMovement_GoSpeed0(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))\n{\n    u32 direction;\n    s16 x;\n    s16 y;\n\n    direction = playerDirection;\n    if (ObjectEventIsFarawayIslandMew(objectEvent))\n    {\n        direction = GetMewMoveDirection();\n        if (direction == DIR_NONE)\n        {\n            direction = playerDirection;\n            direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction);\n            ObjectEventMoveDestCoords(objectEvent, direction, &x, &y);\n            ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction));\n            objectEvent->singleMovementActive = 1;\n            sprite->data[1] = 2;\n            return TRUE;\n        }\n    }\n    else\n    {\n        direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction);\n    }\n    ObjectEventMoveDestCoords(objectEvent, direction, &x, &y);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(direction));\n    if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y))))\n    {\n        ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction));\n    }\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 CopyablePlayerMovement_GoSpeed1(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))\n{\n    u32 direction;\n    s16 x;\n    s16 y;\n\n    direction = playerDirection;\n    direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction);\n    ObjectEventMoveDestCoords(objectEvent, direction, &x, &y);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkFastMovementAction(direction));\n    if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y))))\n    {\n        ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction));\n    }\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 CopyablePlayerMovement_GoSpeed2(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))\n{\n    u32 direction;\n    s16 x;\n    s16 y;\n\n    direction = playerDirection;\n    direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction);\n    ObjectEventMoveDestCoords(objectEvent, direction, &x, &y);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkFasterMovementAction(direction));\n    if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y))))\n    {\n        ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction));\n    }\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 CopyablePlayerMovement_Slide(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))\n{\n    u32 direction;\n    s16 x;\n    s16 y;\n\n    direction = playerDirection;\n    direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction);\n    ObjectEventMoveDestCoords(objectEvent, direction, &x, &y);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetSlideMovementAction(direction));\n    if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y))))\n    {\n        ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction));\n    }\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 cph_IM_DIFFERENT(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))\n{\n    u32 direction;\n\n    direction = playerDirection;\n    direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetJumpInPlaceMovementAction(direction));\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 CopyablePlayerMovement_GoSpeed4(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))\n{\n    u32 direction;\n    s16 x;\n    s16 y;\n\n    direction = playerDirection;\n    direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction);\n    ObjectEventMoveDestCoords(objectEvent, direction, &x, &y);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetJumpMovementAction(direction));\n    if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y))))\n    {\n        ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction));\n    }\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nstatic bool8 CopyablePlayerMovement_Jump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))\n{\n    u32 direction;\n    s16 x;\n    s16 y;\n\n    direction = playerDirection;\n    direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction);\n    x = objectEvent->currentCoords.x;\n    y = objectEvent->currentCoords.y;\n    MoveCoordsInDirection(direction, &x, &y, 2, 2);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetJump2MovementAction(direction));\n    if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y))))\n    {\n        ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction));\n    }\n    objectEvent->singleMovementActive = TRUE;\n    sprite->data[1] = 2;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_CopyPlayerInGrass, gMovementTypeFuncs_CopyPlayerInGrass)\n\nstatic bool8 MovementType_CopyPlayerInGrass_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == MOVEMENT_ACTION_NONE || gPlayerAvatar.tileTransitionState == T_TILE_CENTER)\n    {\n        return FALSE;\n    }\n    return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), MetatileBehavior_IsPokeGrass);\n}\n\nstatic void MovementType_TreeDisguise(struct Sprite *sprite)\n{\n    struct ObjectEvent *objectEvent;\n\n    objectEvent = &gObjectEvents[sprite->data[0]];\n    if (objectEvent->directionSequenceIndex == 0 || (objectEvent->directionSequenceIndex == 1 && !sprite->data[7]))\n    {\n        ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);\n        objectEvent->fieldEffectSpriteId = FieldEffectStart(FLDEFF_TREE_DISGUISE);\n        objectEvent->directionSequenceIndex = 1;\n        sprite->data[7]++;\n    }\n    UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_Disguise_Callback);\n}\n\nstatic bool8 MovementType_Disguise_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    return FALSE;\n}\n\nstatic void MovementType_MountainDisguise(struct Sprite *sprite)\n{\n    struct ObjectEvent *objectEvent;\n\n    objectEvent = &gObjectEvents[sprite->data[0]];\n    if (objectEvent->directionSequenceIndex == 0 || (objectEvent->directionSequenceIndex == 1 && !sprite->data[7]))\n    {\n        ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);\n        objectEvent->fieldEffectSpriteId = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE);\n        objectEvent->directionSequenceIndex = 1;\n        sprite->data[7]++;\n    }\n    UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_Disguise_Callback);\n}\n\nstatic void MovementType_Buried(struct Sprite *sprite)\n{\n    if (!sprite->data[7])\n    {\n        gObjectEvents[sprite->data[0]].fixedPriority = TRUE;\n        sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;\n        sprite->oam.priority = 3;\n        sprite->data[7]++;\n    }\n    UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_Buried_Callback);\n}\n\nstatic bool8 MovementType_Buried_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    return gMovementTypeFuncs_Buried[sprite->data[1]](objectEvent, sprite);\n}\n\nstatic bool8 MovementType_Buried_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    return FALSE;\n}\n\nstatic bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        sprite->data[1] = 0;\n    }\n    return FALSE;\n}\n\nmovement_type_def(MovementType_WalkInPlace, gMovementTypeFuncs_WalkInPlace)\n\nstatic bool8 MovementType_WalkInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_WalkInPlaceFast, gMovementTypeFuncs_WalkInPlaceFast)\n\nstatic bool8 MovementType_WalkInPlaceFast_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceFastMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_JogInPlace, gMovementTypeFuncs_JogInPlace)\n\nstatic bool8 MovementType_JogInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceFasterMovementAction(objectEvent->facingDirection));\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nmovement_type_def(MovementType_Invisible, gMovementTypeFuncs_Invisible)\n\nstatic bool8 MovementType_Invisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection));\n    objectEvent->invisible = TRUE;\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_Invisible_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        sprite->data[1] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_Invisible_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->singleMovementActive = FALSE;\n    return FALSE;\n}\n\nvoid MovementType_RaiseHandAndStop(struct Sprite *sprite)\n{\n    UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_RaiseHandAndStop_Callback);\n}\n\nvoid MovementType_RaiseHandAndJump(struct Sprite *sprite)\n{\n    UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_RaiseHandAndJump_Callback);\n}\n\nvoid MovementType_RaiseHandAndSwim(struct Sprite *sprite)\n{\n    UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_RaiseHandAndSwim_Callback);\n}\n\nstatic u8 MovementType_RaiseHandAndStop_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    return gMovementTypeFuncs_RaiseHandAndStop[sprite->data[1]](objectEvent, sprite);\n}\n\nstatic u8 MovementType_RaiseHandAndJump_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    return gMovementTypeFuncs_RaiseHandAndJump[sprite->data[1]](objectEvent, sprite);\n}\n\nstatic u8 MovementType_RaiseHandAndSwim_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    return gMovementTypeFuncs_RaiseHandAndSwim[sprite->data[1]](objectEvent, sprite);\n}\n\nstatic bool8 MovementType_RaiseHandAndStop_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_RAISE_HAND_AND_STOP);\n    sprite->data[1] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementType_RaiseHandAndStop_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        sprite->data[1] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementType_RaiseHandAndStop_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->singleMovementActive = FALSE;\n    return FALSE;\n}\n\nstatic bool8 MovementType_RaiseHandAndJump_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_RAISE_HAND_AND_JUMP);\n    sprite->data[1] = 1;\n    return FALSE;\n}\n\nstatic bool8 MovementType_RaiseHandAndSwim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ClearObjectEventMovement(objectEvent, sprite);\n    ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_RAISE_HAND_AND_SWIM);\n    sprite->data[1] = 1;\n    return FALSE;\n}\n\nstatic bool8 MovementType_RaiseHandAndMove_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventExecSingleMovementAction(objectEvent, sprite))\n    {\n        sprite->data[1] = 0;\n    }\n    return FALSE;\n}\n\nstatic void ClearObjectEventMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->singleMovementActive = FALSE;\n    objectEvent->heldMovementActive = FALSE;\n    objectEvent->heldMovementFinished = FALSE;\n    objectEvent->movementActionId = MOVEMENT_ACTION_NONE;\n    sprite->data[1] = 0;\n}\n\nu8 GetFaceDirectionAnimNum(u8 direction)\n{\n    return sFaceDirectionAnimNums[direction];\n}\n\nu8 GetMoveDirectionAnimNum(u8 direction)\n{\n    return sMoveDirectionAnimNums[direction];\n}\n\nstatic u8 GetMoveDirectionFastAnimNum(u8 direction)\n{\n    return sMoveDirectionFastAnimNums[direction];\n}\n\nstatic u8 GetMoveDirectionFasterAnimNum(u8 direction)\n{\n    return sMoveDirectionFasterAnimNums[direction];\n}\n\nstatic u8 GetMoveDirectionFastestAnimNum(u8 direction)\n{\n    return sMoveDirectionFastestAnimNums[direction];\n}\n\nu8 GetJumpSpecialDirectionAnimNum(u8 direction)\n{\n    return sJumpSpecialDirectionAnimNums[direction];\n}\n\nu8 GetAcroWheelieDirectionAnimNum(u8 direction)\n{\n    return sAcroBunnyHopBackWheelDirectionAnimNums[direction];\n}\n\nu8 GetAcroBunnyHopFrontWheelDirectionAnimNum(u8 direction)\n{\n    return sAcroBunnyHopFrontWheelDirectionAnimNums[direction];\n}\n\nu8 GetAcroEndWheelieDirectionAnimNum(u8 direction)\n{\n    return sAcroStandingWheelieBackWheelDirectionAnimNums[direction];\n}\n\nu8 GetSpinDirectionAnimNum(u8 direction)\n{\n    return sSpinDirectionAnimNums[direction];\n}\n\nu8 GetAcroUnusedActionDirectionAnimNum(u8 direction)\n{\n    return sAcroStandingWheelieFrontWheelDirectionAnimNums[direction];\n}\n\nu8 GetAcroWheeliePedalDirectionAnimNum(u8 direction)\n{\n    return sAcroMovingWheelieDirectionAnimNums[direction];\n}\n\nu8 GetFishingDirectionAnimNum(u8 direction)\n{\n    return sFishingDirectionAnimNums[direction];\n}\n\nu8 GetFishingNoCatchDirectionAnimNum(u8 direction)\n{\n    return sFishingNoCatchDirectionAnimNums[direction];\n}\n\nu8 GetFishingBiteDirectionAnimNum(u8 direction)\n{\n    return sFishingBiteDirectionAnimNums[direction];\n}\n\nu8 GetRunningDirectionAnimNum(u8 direction)\n{\n    return sRunningDirectionAnimNums[direction];\n}\n\nstatic const struct StepAnimTable *GetStepAnimTable(const union AnimCmd *const *anims)\n{\n    const struct StepAnimTable *stepTable;\n\n    for (stepTable = sStepAnimTables; stepTable->anims != NULL; stepTable++)\n        if (stepTable->anims == anims)\n            return stepTable;\n\n    return NULL;\n}\n\nvoid SetStepAnimHandleAlternation(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animNum)\n{\n    const struct StepAnimTable *stepTable;\n\n    if (!objectEvent->inanimate)\n    {\n        sprite->animNum = animNum;\n        stepTable = GetStepAnimTable(sprite->anims);\n        if (stepTable != NULL)\n        {\n            if (sprite->animCmdIndex == stepTable->animPos[0])\n                sprite->animCmdIndex = stepTable->animPos[3];\n            else if (sprite->animCmdIndex == stepTable->animPos[1])\n                sprite->animCmdIndex = stepTable->animPos[2];\n        }\n        SeekSpriteAnim(sprite, sprite->animCmdIndex);\n    }\n}\n\nvoid SetStepAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animNum)\n{\n    const struct StepAnimTable *stepTable;\n\n    if (!objectEvent->inanimate)\n    {\n        u8 animPos;\n\n        sprite->animNum = animNum;\n        stepTable = GetStepAnimTable(sprite->anims);\n        if (stepTable != NULL)\n        {\n            animPos = stepTable->animPos[1];\n            if (sprite->animCmdIndex <= stepTable->animPos[0])\n                animPos = stepTable->animPos[0];\n\n            SeekSpriteAnim(sprite, animPos);\n        }\n    }\n}\n\n// file boundary?\n\nu8 GetDirectionToFace(s16 x1, s16 y1, s16 x2, s16 y2)\n{\n    if (x1 > x2)\n    {\n        return DIR_WEST;\n    }\n    if (x1 < x2)\n    {\n        return DIR_EAST;\n    }\n    if (y1 > y2)\n    {\n        return DIR_NORTH;\n    }\n    return DIR_SOUTH;\n}\n\nvoid SetTrainerMovementType(struct ObjectEvent *objectEvent, u8 movementType)\n{\n    objectEvent->movementType = movementType;\n    objectEvent->directionSequenceIndex = 0;\n    objectEvent->playerCopyableMovement = 0;\n    gSprites[objectEvent->spriteId].callback = sMovementTypeCallbacks[movementType];\n    gSprites[objectEvent->spriteId].data[1] = 0;\n}\n\nu8 GetTrainerFacingDirectionMovementType(u8 direction)\n{\n    return sTrainerFacingDirectionMovementTypes[direction];\n}\n\nstatic u8 GetCollisionInDirection(struct ObjectEvent *objectEvent, u8 direction)\n{\n    s16 x;\n    s16 y;\n    x = objectEvent->currentCoords.x;\n    y = objectEvent->currentCoords.y;\n    MoveCoords(direction, &x, &y);\n    return GetCollisionAtCoords(objectEvent, x, y, direction);\n}\n\nu8 GetCollisionAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u32 dir)\n{\n    u8 direction = dir;\n    if (IsCoordOutsideObjectEventMovementRange(objectEvent, x, y))\n        return COLLISION_OUTSIDE_RANGE;\n    else if (MapGridGetCollisionAt(x, y) || GetMapBorderIdAt(x, y) == CONNECTION_INVALID || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction))\n        return COLLISION_IMPASSABLE;\n    else if (objectEvent->trackedByCamera && !CanCameraMoveInDirection(direction))\n        return COLLISION_IMPASSABLE;\n    else if (IsElevationMismatchAt(objectEvent->currentElevation, x, y))\n        return COLLISION_ELEVATION_MISMATCH;\n    else if (DoesObjectCollideWithObjectAt(objectEvent, x, y))\n        return COLLISION_OBJECT_EVENT;\n    return COLLISION_NONE;\n}\n\nu8 GetCollisionFlagsAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction)\n{\n    u8 flags = 0;\n\n    if (IsCoordOutsideObjectEventMovementRange(objectEvent, x, y))\n        flags |= 1;\n    if (MapGridGetCollisionAt(x, y) || GetMapBorderIdAt(x, y) == CONNECTION_INVALID || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction) || (objectEvent->trackedByCamera && !CanCameraMoveInDirection(direction)))\n        flags |= 2;\n    if (IsElevationMismatchAt(objectEvent->currentElevation, x, y))\n        flags |= 4;\n    if (DoesObjectCollideWithObjectAt(objectEvent, x, y))\n        flags |= 8;\n    return flags;\n}\n\nstatic bool8 IsCoordOutsideObjectEventMovementRange(struct ObjectEvent *objectEvent, s16 x, s16 y)\n{\n    s16 left;\n    s16 right;\n    s16 top;\n    s16 bottom;\n\n    if (objectEvent->rangeX != 0)\n    {\n        left = objectEvent->initialCoords.x - objectEvent->rangeX;\n        right = objectEvent->initialCoords.x + objectEvent->rangeX;\n        if (left > x || right < x)\n        {\n            return TRUE;\n        }\n    }\n    if (objectEvent->rangeY != 0)\n    {\n        top = objectEvent->initialCoords.y - objectEvent->rangeY;\n        bottom = objectEvent->initialCoords.y + objectEvent->rangeY;\n        if (top > y || bottom < y)\n        {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 IsMetatileDirectionallyImpassable(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction)\n{\n    if (gOppositeDirectionBlockedMetatileFuncs[direction - 1](objectEvent->currentMetatileBehavior)\n        || gDirectionBlockedMetatileFuncs[direction - 1](MapGridGetMetatileBehaviorAt(x, y)))\n    {\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16 x, s16 y)\n{\n    u32 i;\n    struct ObjectEvent *curObject;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        curObject = &gObjectEvents[i];\n        if (curObject->active && curObject != objectEvent)\n        {\n            if ((curObject->currentCoords.x == x && curObject->currentCoords.y == y) || (curObject->previousCoords.x == x && curObject->previousCoords.y == y))\n            {\n                if (AreElevationsCompatible(objectEvent->currentElevation, curObject->currentElevation))\n                    return TRUE;\n            }\n        }\n    }\n    return FALSE;\n}\n\nbool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    u8 objectEventId;\n\n    if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)\n        && gSprites[gObjectEvents[objectEventId].spriteId].data[7] & 2)\n    {\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic void SetBerryTreeJustPicked(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    u8 objectEventId;\n\n    if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId))\n        gSprites[gObjectEvents[objectEventId].spriteId].data[7] |= 0x04;\n}\n\nvoid MoveCoords(u8 direction, s16 *x, s16 *y)\n{\n    *x += sDirectionToVectors[direction].x;\n    *y += sDirectionToVectors[direction].y;\n}\n\n// Unused\nstatic void MoveCoordsInMapCoordIncrement(u8 direction, s16 *x, s16 *y)\n{\n    *x += sDirectionToVectors[direction].x << 4;\n    *y += sDirectionToVectors[direction].y << 4;\n}\n\nstatic void MoveCoordsInDirection(u32 dir, s16 *x, s16 *y, s16 deltaX, s16 deltaY)\n{\n    u8 direction = dir;\n    s16 dx2 = (u16)deltaX;\n    s16 dy2 = (u16)deltaY;\n    if (sDirectionToVectors[direction].x > 0)\n        *x += dx2;\n    if (sDirectionToVectors[direction].x < 0)\n        *x -= dx2;\n    if (sDirectionToVectors[direction].y > 0)\n        *y += dy2;\n    if (sDirectionToVectors[direction].y < 0)\n        *y -= dy2;\n}\n\nvoid GetMapCoordsFromSpritePos(s16 x, s16 y, s16 *destX, s16 *destY)\n{\n    *destX = (x - gSaveBlock1Ptr->pos.x) << 4;\n    *destY = (y - gSaveBlock1Ptr->pos.y) << 4;\n    *destX -= gTotalCameraPixelOffsetX;\n    *destY -= gTotalCameraPixelOffsetY;\n}\n\nvoid SetSpritePosToMapCoords(s16 mapX, s16 mapY, s16 *destX, s16 *destY)\n{\n    s16 dx = -gTotalCameraPixelOffsetX - gFieldCamera.x;\n    s16 dy = -gTotalCameraPixelOffsetY - gFieldCamera.y;\n    if (gFieldCamera.x > 0)\n        dx += 1 << 4;\n\n    if (gFieldCamera.x < 0)\n        dx -= 1 << 4;\n\n    if (gFieldCamera.y > 0)\n        dy += 1 << 4;\n\n    if (gFieldCamera.y < 0)\n        dy -= 1 << 4;\n\n    *destX = ((mapX - gSaveBlock1Ptr->pos.x) << 4) + dx;\n    *destY = ((mapY - gSaveBlock1Ptr->pos.y) << 4) + dy;\n}\n\nvoid SetSpritePosToOffsetMapCoords(s16 *x, s16 *y, s16 dx, s16 dy)\n{\n    SetSpritePosToMapCoords(*x, *y, x, y);\n    *x += dx;\n    *y += dy;\n}\n\nstatic void GetObjectEventMovingCameraOffset(s16 *x, s16 *y)\n{\n    *x = 0;\n    *y = 0;\n    if (gFieldCamera.x > 0)\n    {\n        (*x)++;\n    }\n    if (gFieldCamera.x < 0)\n    {\n        (*x)--;\n    }\n    if (gFieldCamera.y > 0)\n    {\n        (*y)++;\n    }\n    if (gFieldCamera.y < 0)\n    {\n        (*y)--;\n    }\n}\n\nvoid ObjectEventMoveDestCoords(struct ObjectEvent *objectEvent, u32 direction, s16 *x, s16 *y)\n{\n    u8 newDirn = direction;\n    *x = objectEvent->currentCoords.x;\n    *y = objectEvent->currentCoords.y;\n    MoveCoords(newDirn, x, y);\n}\n\nbool8 ObjectEventIsMovementOverridden(struct ObjectEvent *objectEvent)\n{\n    if (objectEvent->singleMovementActive || objectEvent->heldMovementActive)\n        return TRUE;\n\n    return FALSE;\n}\n\nbool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *objectEvent)\n{\n    if (objectEvent->heldMovementActive && objectEvent->movementActionId != MOVEMENT_ACTION_NONE)\n        return TRUE;\n\n    return FALSE;\n}\n\nbool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementActionId)\n{\n    if (QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING)\n        ObjectEventClearHeldMovementIfActive(objectEvent);\n    else if (ObjectEventIsMovementOverridden(objectEvent))\n        return TRUE;\n\n    UnfreezeObjectEvent(objectEvent);\n    objectEvent->movementActionId = movementActionId;\n    objectEvent->heldMovementActive = TRUE;\n    objectEvent->heldMovementFinished = FALSE;\n    gSprites[objectEvent->spriteId].data[2] = 0;\n    return FALSE;\n}\n\nvoid ObjectEventForceSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementActionId)\n{\n    ObjectEventClearHeldMovementIfActive(objectEvent);\n    ObjectEventSetHeldMovement(objectEvent, movementActionId);\n}\n\nvoid ObjectEventClearHeldMovementIfActive(struct ObjectEvent *objectEvent)\n{\n    if (objectEvent->heldMovementActive)\n        ObjectEventClearHeldMovement(objectEvent);\n}\n\nvoid ObjectEventClearHeldMovement(struct ObjectEvent *objectEvent)\n{\n    objectEvent->movementActionId = MOVEMENT_ACTION_NONE;\n    objectEvent->heldMovementActive = FALSE;\n    objectEvent->heldMovementFinished = FALSE;\n    gSprites[objectEvent->spriteId].data[1] = 0;\n    gSprites[objectEvent->spriteId].data[2] = 0;\n}\n\nu8 ObjectEventCheckHeldMovementStatus(struct ObjectEvent *objectEvent)\n{\n    if (objectEvent->heldMovementActive)\n        return objectEvent->heldMovementFinished;\n\n    return 16;\n}\n\nu8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *objectEvent)\n{\n    u8 heldMovementStatus = ObjectEventCheckHeldMovementStatus(objectEvent);\n    if (heldMovementStatus != 0 && heldMovementStatus != 16)\n        ObjectEventClearHeldMovementIfActive(objectEvent);\n\n    return heldMovementStatus;\n}\n\nu8 ObjectEventGetHeldMovementActionId(struct ObjectEvent *objectEvent)\n{\n    if (objectEvent->heldMovementActive)\n        return objectEvent->movementActionId;\n\n    return MOVEMENT_ACTION_NONE;\n}\n\nvoid UpdateObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 (*callback)(struct ObjectEvent *, struct Sprite *))\n{\n    DoGroundEffects_OnSpawn(objectEvent, sprite);\n    TryEnableObjectEventAnim(objectEvent, sprite);\n\n    if (ObjectEventIsHeldMovementActive(objectEvent))\n        ObjectEventExecHeldMovementAction(objectEvent, sprite);\n    else if (!objectEvent->frozen)\n        while (callback(objectEvent, sprite));\n\n    DoGroundEffects_OnBeginStep(objectEvent, sprite);\n    DoGroundEffects_OnFinishStep(objectEvent, sprite);\n    UpdateObjectEventSpriteAnimPause(objectEvent, sprite);\n    UpdateObjectEventVisibility(objectEvent, sprite);\n    ObjectEventUpdateSubpriority(objectEvent, sprite);\n}\n\nvoid QL_UpdateObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    DoGroundEffects_OnSpawn(objectEvent, sprite);\n    TryEnableObjectEventAnim(objectEvent, sprite);\n\n    if (ObjectEventIsHeldMovementActive(objectEvent) && !sprite->animBeginning)\n        QuestLogObjectEventExecHeldMovementAction(objectEvent, sprite);\n    \n    if (MetatileBehavior_IsIce_2(objectEvent->currentMetatileBehavior) == TRUE\n        || MetatileBehavior_IsTrickHouseSlipperyFloor(objectEvent->currentMetatileBehavior) == TRUE)\n        objectEvent->disableAnim = TRUE;\n    else\n        objectEvent->disableAnim = FALSE;\n\n    DoGroundEffects_OnBeginStep(objectEvent, sprite);\n    DoGroundEffects_OnFinishStep(objectEvent, sprite);\n    UpdateObjectEventSpriteAnimPause(objectEvent, sprite);\n    UpdateObjectEventVisibility(objectEvent, sprite);\n    ObjectEventUpdateSubpriority(objectEvent, sprite);\n}\n\n#define dirn_to_anim(name, table)                   \\\nu8 name(u32 idx)                                    \\\n{                                                   \\\n    u8 direction;                                   \\\n    u8 animIds[sizeof(table)];                      \\\n    direction = idx;                                \\\n    memcpy(animIds, (table), sizeof(table));        \\\n    if (direction > DIR_EAST) direction = DIR_NONE; \\\n    return animIds[direction];                      \\\n}\n\ndirn_to_anim(GetFaceDirectionMovementAction, sFaceDirectionMovementActions);\ndirn_to_anim(GetFaceDirectionFastMovementAction, sFaceDirectionFastMovementActions);\n\nu8 GetWalkSlowestMovementAction(u32 idx)\n{\n    u8 direction = idx;\n    if (direction > DIR_EAST)\n        direction = DIR_NONE;\n\n    return sWalkSlowestMovementActions[direction];\n}\n\ndirn_to_anim(GetWalkSlowerMovementAction, sWalkSlowerMovementActions);\ndirn_to_anim(GetWalkSlowMovementAction, sWalkSlowMovementActions);\ndirn_to_anim(GetWalkNormalMovementAction, sWalkNormalMovementActions);\ndirn_to_anim(GetWalkFastMovementAction, sWalkFastMovementActions);\ndirn_to_anim(GetGlideMovementAction, sGlideMovementActions);\ndirn_to_anim(GetRideWaterCurrentMovementAction, sRideWaterCurrentMovementActions);\ndirn_to_anim(GetWalkFasterMovementAction, sWalkFasterMovementActions);\ndirn_to_anim(GetSlideMovementAction, sSlideMovementActions);\ndirn_to_anim(GetPlayerRunMovementAction, sPlayerRunMovementActions);\ndirn_to_anim(GetPlayerRunSlowMovementAction, sPlayerRunSlowMovementActions);\ndirn_to_anim(GetSpinMovementAction, sSpinMovementActions);\ndirn_to_anim(GetJump2MovementAction, sJump2MovementActions);\ndirn_to_anim(GetJumpInPlaceMovementAction, sJumpInPlaceMovementActions);\ndirn_to_anim(GetJumpInPlaceTurnAroundMovementAction, sJumpInPlaceTurnAroundMovementActions);\ndirn_to_anim(GetJumpMovementAction, sJumpMovementActions);\ndirn_to_anim(GetJumpSpecialMovementAction, sJumpSpecialMovementActions);\ndirn_to_anim(GetJumpSpecialWithEffectMovementAction, sJumpSpecialWithEffectMovementActions);\ndirn_to_anim(GetWalkInPlaceSlowMovementAction, sWalkInPlaceSlowMovementActions);\ndirn_to_anim(GetWalkInPlaceNormalMovementAction, sWalkInPlaceNormalMovementActions);\ndirn_to_anim(GetWalkInPlaceFastMovementAction, sWalkInPlaceFastMovementActions);\ndirn_to_anim(GetWalkInPlaceFasterMovementAction, sWalkInPlaceFasterMovementActions);\n\nbool8 ObjectEventFaceOppositeDirection(struct ObjectEvent *objectEvent, u8 direction)\n{\n    return ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(GetOppositeDirection(direction)));\n}\n\ndirn_to_anim(GetAcroWheelieFaceDirectionMovementAction, sAcroWheelieFaceDirectionMovementActions);\ndirn_to_anim(GetAcroPopWheelieFaceDirectionMovementAction, sAcroPopWheelieFaceDirectionMovementActions);\ndirn_to_anim(GetAcroEndWheelieFaceDirectionMovementAction, sAcroEndWheelieFaceDirectionMovementActions);\ndirn_to_anim(GetAcroWheelieHopFaceDirectionMovementAction, sAcroWheelieHopFaceDirectionMovementActions);\ndirn_to_anim(GetAcroWheelieHopMovementAction, sAcroWheelieHopMovementActions);\ndirn_to_anim(GetAcroWheelieJumpMovementAction, sAcroWheelieJumpMovementActions);\ndirn_to_anim(GetAcroWheelieInPlaceMovementAction, sAcroWheelieInPlaceMovementActions);\ndirn_to_anim(GetAcroPopWheelieMoveMovementAction, sAcroPopWheelieMoveMovementActions);\ndirn_to_anim(GetAcroWheelieMoveMovementAction, sAcroWheelieMoveMovementActions);\n\nu8 GetOppositeDirection(u8 direction)\n{\n    u8 directions[sizeof gOppositeDirections];\n\n    memcpy(directions, gOppositeDirections, sizeof gOppositeDirections);\n    if (direction < 1 || direction > (sizeof gOppositeDirections))\n    {\n        return direction;\n    }\n    return directions[direction - 1];\n}\n\nstatic u32 GetPlayerDirectionForCopy(u8 initDir, u8 moveDir)\n{\n    return sPlayerDirectionsForCopy[initDir - 1][moveDir - 1];\n}\n\nstatic u32 GetCopyDirection(u8 copyInitDir, u32 playerInitDir, u32 playerMoveDir)\n{\n    u32 dir;\n    u8 _playerInitDir = playerInitDir;\n    u8 _playerMoveDir = playerMoveDir;\n    if (_playerInitDir == DIR_NONE || _playerMoveDir == DIR_NONE\n      || _playerInitDir > DIR_EAST || _playerMoveDir > DIR_EAST)\n        return DIR_NONE;\n\n    dir = GetPlayerDirectionForCopy(_playerInitDir, playerMoveDir);\n    return sPlayerDirectionToCopyDirection[copyInitDir - 1][dir - 1];\n}\n\nstatic void ObjectEventExecHeldMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (sMovementActionFuncs[objectEvent->movementActionId][sprite->data[2]](objectEvent, sprite))\n    {\n        objectEvent->heldMovementFinished = TRUE;\n    }\n}\n\nstatic void QuestLogObjectEventExecHeldMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (sMovementActionFuncs[objectEvent->movementActionId][sprite->data[2]](objectEvent, sprite))\n    {\n        objectEvent->heldMovementFinished = TRUE;\n        if (objectEvent->graphicsId == OBJ_EVENT_GFX_PUSHABLE_BOULDER)\n            HandleBoulderFallThroughHole(objectEvent);\n    }\n}\n\nstatic bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (sMovementActionFuncs[objectEvent->movementActionId][sprite->data[2]](objectEvent, sprite))\n    {\n        objectEvent->movementActionId = MOVEMENT_ACTION_NONE;\n        sprite->data[2] = 0;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void ObjectEventSetSingleMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 movementActionId)\n{\n    objectEvent->movementActionId = movementActionId;\n    sprite->data[2] = 0;\n    \n    if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RECORDING)\n        QuestLogRecordNPCStep(objectEvent->localId, objectEvent->mapNum, objectEvent->mapGroup, movementActionId);\n}\n\nstatic void FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    SetObjectEventDirection(objectEvent, direction);\n    ShiftStillObjectEventCoords(objectEvent);\n    SetStepAnim(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection));\n    sprite->animPaused = TRUE;\n    sprite->data[2] = 1;\n}\n\nstatic bool8 MovementAction_FaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    FaceDirection(objectEvent, sprite, DIR_SOUTH);\n    return TRUE;\n}\n\nstatic bool8 MovementAction_FaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    FaceDirection(objectEvent, sprite, DIR_NORTH);\n    return TRUE;\n}\n\nstatic bool8 MovementAction_FaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    FaceDirection(objectEvent, sprite, DIR_WEST);\n    return TRUE;\n}\n\nstatic bool8 MovementAction_FaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    FaceDirection(objectEvent, sprite, DIR_EAST);\n    return TRUE;\n}\n\nvoid InitNpcForMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed)\n{\n    s16 x;\n    s16 y;\n\n    x = objectEvent->currentCoords.x;\n    y = objectEvent->currentCoords.y;\n    SetObjectEventDirection(objectEvent, direction);\n    MoveCoords(direction, &x, &y);\n    ShiftObjectEventCoords(objectEvent, x, y);\n    SetSpriteDataForNormalStep(sprite, direction, speed);\n    sprite->animPaused = FALSE;\n    objectEvent->triggerGroundEffectsOnMove = TRUE;\n    sprite->data[2] = 1;\n}\n\nvoid InitMovementNormal(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed)\n{\n    u8 (*functions[NELEMS(sDirectionAnimFuncsBySpeed)])(u8);\n    memcpy(functions, sDirectionAnimFuncsBySpeed, sizeof sDirectionAnimFuncsBySpeed);\n    InitNpcForMovement(objectEvent, sprite, direction, speed);\n    SetStepAnimHandleAlternation(objectEvent, sprite, functions[speed](objectEvent->facingDirection));\n}\n\nvoid StartRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    InitNpcForMovement(objectEvent, sprite, direction, MOVE_SPEED_FAST_1);\n    SetStepAnimHandleAlternation(objectEvent, sprite, GetRunningDirectionAnimNum(objectEvent->facingDirection));\n}\n\nbool8 UpdateMovementNormal(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (NpcTakeStep(sprite))\n    {\n        ShiftStillObjectEventCoords(objectEvent);\n        objectEvent->triggerGroundEffectsOnStop = TRUE;\n        sprite->animPaused = TRUE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid InitNpcForWalkSlower(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    s16 x;\n    s16 y;\n\n    x = objectEvent->currentCoords.x;\n    y = objectEvent->currentCoords.y;\n    SetObjectEventDirection(objectEvent, direction);\n    MoveCoords(direction, &x, &y);\n    ShiftObjectEventCoords(objectEvent, x, y);\n    SetWalkSlowerSpriteData(sprite, direction);\n    sprite->animPaused = FALSE;\n    objectEvent->triggerGroundEffectsOnMove = TRUE;\n    sprite->data[2] = 1;\n}\n\nvoid InitWalkSlower(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    InitNpcForWalkSlower(objectEvent, sprite, direction);\n    SetStepAnimHandleAlternation(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection));\n}\n\nbool8 UpdateWalkSlower(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlowerAnim(sprite))\n    {\n        ShiftStillObjectEventCoords(objectEvent);\n        objectEvent->triggerGroundEffectsOnStop = TRUE;\n        sprite->animPaused = TRUE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid InitNpcForWalkSlowest(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    s16 x;\n    s16 y;\n\n    x = objectEvent->currentCoords.x;\n    y = objectEvent->currentCoords.y;\n    SetObjectEventDirection(objectEvent, direction);\n    MoveCoords(direction, &x, &y);\n    ShiftObjectEventCoords(objectEvent, x, y);\n    SetWalkSlowestSpriteData(sprite, direction);\n    sprite->animPaused = FALSE;\n    objectEvent->triggerGroundEffectsOnMove = TRUE;\n    sprite->data[2] = 1;\n}\n\nvoid InitWalkSlowest(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    InitNpcForWalkSlowest(objectEvent, sprite, direction);\n    SetStepAnimHandleAlternation(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection));\n}\n\nbool8 UpdateWalkSlowest(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlowestAnim(sprite))\n    {\n        ShiftStillObjectEventCoords(objectEvent);\n        objectEvent->triggerGroundEffectsOnStop = TRUE;\n        sprite->animPaused = TRUE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkSlowestDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlowest(objectEvent, sprite, DIR_SOUTH);\n    return MovementAction_WalkSlowestDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkSlowestDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlowest(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkSlowestUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlowest(objectEvent, sprite, DIR_NORTH);\n    return MovementAction_WalkSlowestUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkSlowestUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlowest(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkSlowestLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlowest(objectEvent, sprite, DIR_WEST);\n    return MovementAction_WalkSlowestLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkSlowestLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlowest(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkSlowestRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlowest(objectEvent, sprite, DIR_EAST);\n    return MovementAction_WalkSlowestRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkSlowestRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlowest(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkSlowerDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlower(objectEvent, sprite, DIR_SOUTH);\n    return MovementAction_WalkSlowerDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkSlowerDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlower(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkSlowerUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlower(objectEvent, sprite, DIR_NORTH);\n    return MovementAction_WalkSlowerUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkSlowerUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlower(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkSlowerLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlower(objectEvent, sprite, DIR_WEST);\n    return MovementAction_WalkSlowerLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkSlowerLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlower(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkSlowerRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlower(objectEvent, sprite, DIR_EAST);\n    return MovementAction_WalkSlowerRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkSlowerRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlower(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\n// InitNpcForWalkSlow, InitNpcForWalkSlower, InitNpcForWalkSlowest, and\n// InitNpcForRunSlow are functionally equivalent\nvoid InitNpcForWalkSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    s16 x;\n    s16 y;\n\n    x = objectEvent->currentCoords.x;\n    y = objectEvent->currentCoords.y;\n    SetObjectEventDirection(objectEvent, direction);\n    MoveCoords(direction, &x, &y);\n    ShiftObjectEventCoords(objectEvent, x, y);\n    SetWalkSlowSpriteData(sprite, direction);\n    sprite->animPaused = FALSE;\n    objectEvent->triggerGroundEffectsOnMove = TRUE;\n    sprite->data[2] = 1;\n}\n\n// InitWalkSlow, InitWalkSlower, InitWalkSlowest, and InitRunSlow are\n// functionally equivalent\nvoid InitWalkSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    InitNpcForWalkSlow(objectEvent, sprite, direction);\n    SetStepAnimHandleAlternation(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection));\n}\n\nbool8 UpdateWalkSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlowAnim(sprite))\n    {\n        ShiftStillObjectEventCoords(objectEvent);\n        objectEvent->triggerGroundEffectsOnStop = TRUE;\n        sprite->animPaused = TRUE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlow(objectEvent, sprite, DIR_NORTH);\n    return MovementAction_WalkSlowUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkSlowUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlow(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkSlowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlow(objectEvent, sprite, DIR_SOUTH);\n    return MovementAction_WalkSlowDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkSlowDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlow(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlow(objectEvent, sprite, DIR_WEST);\n    return MovementAction_WalkSlowLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkSlowLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlow(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlow(objectEvent, sprite, DIR_EAST);\n    return MovementAction_WalkSlowRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkSlowRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlow(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkNormalDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_NORMAL);\n    return MovementAction_WalkNormalDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkNormalDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkNormalUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_NORMAL);\n    return MovementAction_WalkNormalUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkNormalUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_NORMAL);\n    return MovementAction_WalkNormalLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkNormalLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_NORMAL);\n    return MovementAction_WalkNormalRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkNormalRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\n#define JUMP_HALFWAY  1\n#define JUMP_FINISHED ((u8)-1)\n\nenum {\n    JUMP_TYPE_HIGH,\n    JUMP_TYPE_LOW,\n    JUMP_TYPE_NORMAL,\n};\n\nvoid InitJump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 distance, u8 type)\n{\n    s16 displacements[NELEMS(sJumpInitDisplacements)];\n    s16 x;\n    s16 y;\n\n    memcpy(displacements, sJumpInitDisplacements, sizeof sJumpInitDisplacements);\n    x = 0;\n    y = 0;\n    SetObjectEventDirection(objectEvent, direction);\n    MoveCoordsInDirection(direction, &x, &y, displacements[distance], displacements[distance]);\n    ShiftObjectEventCoords(objectEvent, objectEvent->currentCoords.x + x, objectEvent->currentCoords.y + y);\n    SetJumpSpriteData(sprite, direction, distance, type);\n    sprite->data[2] = 1;\n    sprite->animPaused = 0;\n    objectEvent->triggerGroundEffectsOnMove = 1;\n    objectEvent->disableCoveringGroundEffects = 1;\n}\n\nvoid InitJumpRegular(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 distance, u8 type)\n{\n    InitJump(objectEvent, sprite, direction, distance, type);\n    SetStepAnimHandleAlternation(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection));\n    DoShadowFieldEffect(objectEvent);\n}\n\nu8 UpdateJumpAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 callback(struct Sprite *))\n{\n    s16 displacements[NELEMS(sJumpDisplacements)];\n    s16 x;\n    s16 y;\n    u8 result;\n\n    memcpy(displacements, sJumpDisplacements, sizeof sJumpDisplacements);\n    result = callback(sprite);\n    if (result == JUMP_HALFWAY && displacements[sprite->data[4]] != 0)\n    {\n        x = 0;\n        y = 0;\n        MoveCoordsInDirection(objectEvent->movementDirection, &x, &y, displacements[sprite->data[4]], displacements[sprite->data[4]]);\n        ShiftObjectEventCoords(objectEvent, objectEvent->currentCoords.x + x, objectEvent->currentCoords.y + y);\n        objectEvent->triggerGroundEffectsOnMove = TRUE;\n        objectEvent->disableCoveringGroundEffects = TRUE;\n    }\n    else if (result == JUMP_FINISHED)\n    {\n        ShiftStillObjectEventCoords(objectEvent);\n        objectEvent->triggerGroundEffectsOnStop = TRUE;\n        objectEvent->landingJump = TRUE;\n        sprite->animPaused = TRUE;\n    }\n    return result;\n}\n\nu8 DoJumpAnimStep(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    return UpdateJumpAnim(objectEvent, sprite, DoJumpSpriteMovement);\n}\n\nu8 DoJumpSpecialAnimStep(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    return UpdateJumpAnim(objectEvent, sprite, DoJumpSpecialSpriteMovement);\n}\n\nbool8 DoJumpAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnimStep(objectEvent, sprite) == JUMP_FINISHED)\n        return TRUE;\n\n    return FALSE;\n}\n\nbool8 DoJumpSpecialAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpSpecialAnimStep(objectEvent, sprite) == JUMP_FINISHED)\n        return TRUE;\n\n    return FALSE;\n}\n\nbool8 DoJumpInPlaceAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    switch (DoJumpAnimStep(objectEvent, sprite))\n    {\n    case JUMP_FINISHED:\n        return TRUE;\n    case JUMP_HALFWAY:\n        SetObjectEventDirection(objectEvent, GetOppositeDirection(objectEvent->movementDirection));\n        SetStepAnim(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection));\n    default:\n        return FALSE;\n    }\n}\n\nstatic bool8 MovementAction_Jump2Down_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH);\n    return MovementAction_Jump2Down_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_Jump2Down_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_Jump2Up_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH);\n    return MovementAction_Jump2Up_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_Jump2Up_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_Jump2Left_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH);\n    return MovementAction_Jump2Left_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_Jump2Left_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_Jump2Right_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH);\n    return MovementAction_Jump2Right_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_Jump2Right_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid InitMovementDelay(struct Sprite *sprite, u16 duration)\n{\n    sprite->data[2] = 1;\n    sprite->data[3] = duration;\n}\n\nstatic bool8 MovementAction_Delay_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (--sprite->data[3] == 0)\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_Delay1_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementDelay(sprite, 1);\n    return MovementAction_Delay_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_Delay2_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementDelay(sprite, 2);\n    return MovementAction_Delay_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_Delay4_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementDelay(sprite, 4);\n    return MovementAction_Delay_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_Delay8_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementDelay(sprite, 8);\n    return MovementAction_Delay_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_Delay16_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementDelay(sprite, 16);\n    return MovementAction_Delay_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkFastDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1);\n    return MovementAction_WalkFastDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkFastDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkFastUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1);\n    return MovementAction_WalkFastUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkFastUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1);\n    return MovementAction_WalkFastLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkFastLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1);\n    return MovementAction_WalkFastRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkFastRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nbool8 UpdateMovementGlide(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (NpcTakeStep(sprite))\n    {\n        ShiftStillObjectEventCoords(objectEvent);\n        objectEvent->triggerGroundEffectsOnStop = TRUE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nu8 MovementAction_GlideDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if(objectEvent->facingDirection != DIR_SOUTH)\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_SOUTH));\n    \n    InitNpcForMovement(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1);\n    return MovementAction_GlideDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_GlideDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    AnimateSprite(sprite);\n    if (UpdateMovementGlide(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nu8 MovementAction_GlideUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if(objectEvent->facingDirection != DIR_NORTH)\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_NORTH));\n    \n    InitNpcForMovement(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1);\n    return MovementAction_GlideUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_GlideUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    AnimateSprite(sprite);\n    if (UpdateMovementGlide(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nu8 MovementAction_GlideLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if(objectEvent->facingDirection != DIR_WEST)\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_WEST));\n    \n    InitNpcForMovement(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1);\n    return MovementAction_GlideLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_GlideLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    AnimateSprite(sprite);\n    if (UpdateMovementGlide(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nu8 MovementAction_GlideRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if(objectEvent->facingDirection != DIR_EAST)\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_EAST));\n    \n    InitNpcForMovement(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1);\n    return MovementAction_GlideRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_GlideRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    AnimateSprite(sprite);\n    if (UpdateMovementGlide(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid FaceDirectionFast(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    SetObjectEventDirection(objectEvent, direction);\n    ShiftStillObjectEventCoords(objectEvent);\n    sprite->animPaused = FALSE;\n    sprite->data[2] = 1;\n}\n\nu8 MovementAction_FaceDownFast_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if(objectEvent->facingDirection != DIR_SOUTH)\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_SOUTH));\n    \n    AnimateSprite(sprite);\n    FaceDirectionFast(objectEvent, sprite, DIR_SOUTH);\n    return TRUE;\n}\n\nu8 MovementAction_FaceUpFast_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if(objectEvent->facingDirection != DIR_NORTH)\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_NORTH));\n    \n    AnimateSprite(sprite);\n    FaceDirectionFast(objectEvent, sprite, DIR_NORTH);\n    return TRUE;\n}\n\nu8 MovementAction_FaceLeftFast_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if(objectEvent->facingDirection != DIR_WEST)\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_WEST));\n    \n    AnimateSprite(sprite);\n    FaceDirectionFast(objectEvent, sprite, DIR_WEST);\n    return TRUE;\n}\n\nu8 MovementAction_FaceRightFast_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if(objectEvent->facingDirection != DIR_EAST)\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_EAST));\n    \n    AnimateSprite(sprite);\n    FaceDirectionFast(objectEvent, sprite, DIR_EAST);\n    return TRUE;\n}\n\nvoid InitMoveInPlace(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 animNum, u16 duration)\n{\n    SetObjectEventDirection(objectEvent, direction);\n    SetStepAnimHandleAlternation(objectEvent, sprite, animNum);\n    sprite->animPaused = FALSE;\n    sprite->data[2] = 1;\n    sprite->data[3] = duration;\n}\n\nstatic bool8 MovementAction_WalkInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (--sprite->data[3] == 0)\n    {\n        sprite->data[2] = 2;\n        sprite->animPaused = TRUE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkInPlaceSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (sprite->data[3] & 1)\n        sprite->animDelayCounter++;\n\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceSlowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 32);\n    return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 32);\n    return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 32);\n    return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 32);\n    return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceNormalDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 16);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceNormalUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 16);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 16);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 16);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceFastDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFastAnimNum(DIR_SOUTH), 8);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceFastUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionFastAnimNum(DIR_NORTH), 8);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionFastAnimNum(DIR_WEST), 8);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionFastAnimNum(DIR_EAST), 8);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceFasterDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFasterAnimNum(DIR_SOUTH), 4);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceFasterUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionFasterAnimNum(DIR_NORTH), 4);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceFasterLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionFasterAnimNum(DIR_WEST), 4);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkInPlaceFasterRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionFasterAnimNum(DIR_EAST), 4);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_RideWaterCurrentDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_2);\n    return MovementAction_RideWaterCurrentDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_RideWaterCurrentDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RideWaterCurrentUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_2);\n    return MovementAction_RideWaterCurrentUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_RideWaterCurrentUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RideWaterCurrentLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_2);\n    return MovementAction_RideWaterCurrentLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_RideWaterCurrentLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RideWaterCurrentRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_2);\n    return MovementAction_RideWaterCurrentRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_RideWaterCurrentRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkFasterDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FASTER);\n    return MovementAction_WalkFasterDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkFasterDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkFasterUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FASTER);\n    return MovementAction_WalkFasterUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkFasterUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkFasterLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FASTER);\n    return MovementAction_WalkFasterLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkFasterLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkFasterRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FASTER);\n    return MovementAction_WalkFasterRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkFasterRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_SlideDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FASTEST);\n    return MovementAction_SlideDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_SlideDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_SlideUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FASTEST);\n    return MovementAction_SlideUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_SlideUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_SlideLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FASTEST);\n    return MovementAction_SlideLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_SlideLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_SlideRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FASTEST);\n    return MovementAction_SlideRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_SlideRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_PlayerRunDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartRunningAnim(objectEvent, sprite, DIR_SOUTH);\n    return MovementAction_PlayerRunDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_PlayerRunDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_PlayerRunUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartRunningAnim(objectEvent, sprite, DIR_NORTH);\n    return MovementAction_PlayerRunUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_PlayerRunUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_PlayerRunLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartRunningAnim(objectEvent, sprite, DIR_WEST);\n    return MovementAction_PlayerRunLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_PlayerRunLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_PlayerRunRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartRunningAnim(objectEvent, sprite, DIR_EAST);\n    return MovementAction_PlayerRunRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_PlayerRunRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid InitNpcForRunSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    s16 x;\n    s16 y;\n\n    x = objectEvent->currentCoords.x;\n    y = objectEvent->currentCoords.y;\n    SetObjectEventDirection(objectEvent, direction);\n    MoveCoords(direction, &x, &y);\n    ShiftObjectEventCoords(objectEvent, x, y);\n    SetRunSlowSpriteData(sprite, direction);\n    sprite->animPaused = FALSE;\n    objectEvent->triggerGroundEffectsOnMove = TRUE;\n    sprite->data[2] = 1;\n}\n\nvoid InitRunSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    InitNpcForRunSlow(objectEvent, sprite, direction);\n    SetStepAnimHandleAlternation(objectEvent, sprite, GetRunningDirectionAnimNum(objectEvent->facingDirection));\n}\n\nbool8 UpdateRunSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateRunSlowAnim(sprite))\n    {\n        ShiftStillObjectEventCoords(objectEvent);\n        objectEvent->triggerGroundEffectsOnStop = TRUE;\n        sprite->animPaused = TRUE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RunDownSlow_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitRunSlow(objectEvent, sprite, DIR_SOUTH);\n    return MovementAction_RunDownSlow_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_RunDownSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateRunSlow(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RunUpSlow_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitRunSlow(objectEvent, sprite, DIR_NORTH);\n    return MovementAction_RunUpSlow_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_RunUpSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateRunSlow(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RunLeftSlow_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitRunSlow(objectEvent, sprite, DIR_WEST);\n    return MovementAction_RunLeftSlow_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_RunLeftSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateRunSlow(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RunRightSlow_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitRunSlow(objectEvent, sprite, DIR_SOUTH);\n    return MovementAction_RunRightSlow_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_RunRightSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateRunSlow(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid StartSpriteAnimInDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 animNum)\n{\n    SetAndStartSpriteAnim(sprite, animNum, 0);\n    SetObjectEventDirection(objectEvent, direction);\n    sprite->data[2] = 1;\n}\n\nstatic bool8 MovementAction_StartAnimInDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, objectEvent->movementDirection, sprite->animNum);\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WaitSpriteAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (SpriteAnimEnded(sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid InitJumpSpecial(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    InitJump(objectEvent, sprite, direction, JUMP_DISTANCE_NORMAL, JUMP_TYPE_HIGH);\n    StartSpriteAnim(sprite, GetJumpSpecialDirectionAnimNum(direction));\n}\n\nstatic bool8 MovementAction_JumpSpecialDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpSpecial(objectEvent, sprite, DIR_SOUTH);\n    return MovementAction_JumpSpecialDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpSpecialDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpSpecialAnim(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        objectEvent->landingJump = FALSE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpSpecialUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpSpecial(objectEvent, sprite, DIR_NORTH);\n    return MovementAction_JumpSpecialUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpSpecialUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpSpecialAnim(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        objectEvent->landingJump = FALSE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpSpecialLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpSpecial(objectEvent, sprite, DIR_WEST);\n    return MovementAction_JumpSpecialLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpSpecialLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpSpecialAnim(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        objectEvent->landingJump = FALSE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpSpecialRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpSpecial(objectEvent, sprite, DIR_EAST);\n    return MovementAction_JumpSpecialRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpSpecialRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpSpecialAnim(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        objectEvent->landingJump = FALSE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpSpecialWithEffectDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpSpecial(objectEvent, sprite, DIR_SOUTH);\n    return MovementAction_JumpSpecialWithEffectDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpSpecialWithEffectDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpSpecialAnim(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpSpecialWithEffectUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpSpecial(objectEvent, sprite, DIR_NORTH);\n    return MovementAction_JumpSpecialWithEffectUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpSpecialWithEffectUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpSpecialAnim(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpSpecialWithEffectLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpSpecial(objectEvent, sprite, DIR_WEST);\n    return MovementAction_JumpSpecialWithEffectLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpSpecialWithEffectLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpSpecialAnim(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpSpecialWithEffectRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpSpecial(objectEvent, sprite, DIR_EAST);\n    return MovementAction_JumpSpecialWithEffectRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpSpecialWithEffectRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpSpecialAnim(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_FacePlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 playerObjectId;\n\n    if (!TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0, &playerObjectId))\n    {\n        FaceDirection(objectEvent, sprite, GetDirectionToFace(objectEvent->currentCoords.x, objectEvent->currentCoords.y, gObjectEvents[playerObjectId].currentCoords.x, gObjectEvents[playerObjectId].currentCoords.y));\n    }\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_FaceAwayPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 playerObjectId;\n\n    if (!TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0, &playerObjectId))\n    {\n        FaceDirection(objectEvent, sprite, GetOppositeDirection(GetDirectionToFace(objectEvent->currentCoords.x, objectEvent->currentCoords.y, gObjectEvents[playerObjectId].currentCoords.x, gObjectEvents[playerObjectId].currentCoords.y)));\n    }\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_LockFacingDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->facingDirectionLocked = TRUE;\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_UnlockFacingDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->facingDirectionLocked = FALSE;\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_JumpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_NORMAL, JUMP_TYPE_NORMAL);\n    return MovementAction_JumpDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_NORMAL, JUMP_TYPE_NORMAL);\n    return MovementAction_JumpUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_NORMAL);\n    return MovementAction_JumpLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_NORMAL);\n    return MovementAction_JumpRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpInPlaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_HIGH);\n    return MovementAction_JumpInPlaceDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpInPlaceDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpInPlaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_HIGH);\n    return MovementAction_JumpInPlaceUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpInPlaceUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpInPlaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_HIGH);\n    return MovementAction_JumpInPlaceLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpInPlaceLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpInPlaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_HIGH);\n    return MovementAction_JumpInPlaceRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpInPlaceRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpInPlaceDownUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_NORMAL);\n    return MovementAction_JumpInPlaceDownUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpInPlaceDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpInPlaceAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpInPlaceUpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_NORMAL);\n    return MovementAction_JumpInPlaceUpDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpInPlaceUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpInPlaceAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpInPlaceLeftRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_NORMAL);\n    return MovementAction_JumpInPlaceLeftRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpInPlaceLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpInPlaceAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_JumpInPlaceRightLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_NORMAL);\n    return MovementAction_JumpInPlaceRightLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_JumpInPlaceRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpInPlaceAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_FaceOriginalDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    FaceDirection(objectEvent, sprite, gInitialMovementTypeFacingDirections[objectEvent->movementType]);\n    return TRUE;\n}\n\nstatic bool8 MovementAction_NurseJoyBowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, ANIM_NURSE_BOW);\n    return FALSE;\n}\n\nstatic bool8 MovementAction_EnableJumpLandingGroundEffect_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->disableJumpLandingGroundEffect = FALSE;\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_DisableJumpLandingGroundEffect_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->disableJumpLandingGroundEffect = TRUE;\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_DisableAnimation_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->inanimate = TRUE;\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_RestoreAnimation_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->inanimate = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->inanimate;\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_SetInvisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->invisible = TRUE;\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_SetVisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->invisible = FALSE;\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_EmoteExclamationMark_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);\n    FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON);\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_EmoteQuestionMark_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);\n    FieldEffectStart(FLDEFF_QUESTION_MARK_ICON);\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_EmoteX_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);\n    FieldEffectStart(FLDEFF_X_ICON);\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_EmoteDoubleExclamationMark_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);\n    FieldEffectStart(FLDEFF_DOUBLE_EXCL_MARK_ICON);\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_EmoteSmile_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);\n    FieldEffectStart(FLDEFF_SMILEY_FACE_ICON);\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_RevealTrainer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (objectEvent->movementType == MOVEMENT_TYPE_BURIED)\n    {\n        MovementAction_RevealTrainer_RunTrainerSeeFuncList(objectEvent);\n        return FALSE;\n    }\n    if (objectEvent->movementType != MOVEMENT_TYPE_TREE_DISGUISE && objectEvent->movementType != MOVEMENT_TYPE_MOUNTAIN_DISGUISE)\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    StartRevealDisguise(objectEvent);\n    sprite->data[2] = 1;\n    return MovementAction_RevealTrainer_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_RevealTrainer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateRevealDisguise(objectEvent))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RockSmashBreak_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    SetAndStartSpriteAnim(sprite, ANIM_REMOVE_OBSTACLE, 0);\n    sprite->data[2] = 1;\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RockSmashBreak_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (SpriteAnimEnded(sprite))\n    {\n        SetMovementDelay(sprite, 32);\n        sprite->data[2] = 2;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RockSmashBreak_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->invisible ^= TRUE;\n    if (WaitForMovementDelay(sprite))\n    {\n        objectEvent->invisible = TRUE;\n        sprite->data[2] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_CutTree_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    SetAndStartSpriteAnim(sprite, ANIM_REMOVE_OBSTACLE, 0);\n    sprite->data[2] = 1;\n    return FALSE;\n}\n\nstatic bool8 MovementAction_CutTree_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (SpriteAnimEnded(sprite))\n    {\n        SetMovementDelay(sprite, 32);\n        sprite->data[2] = 2;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_CutTree_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->invisible ^= TRUE;\n    if (WaitForMovementDelay(sprite))\n    {\n        objectEvent->invisible = TRUE;\n        sprite->data[2] = 3;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_SetFixedPriority_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->fixedPriority = TRUE;\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_ClearFixedPriority_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    objectEvent->fixedPriority = FALSE;\n    sprite->data[2] = 1;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_InitAffineAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;\n    InitSpriteAffineAnim(sprite);\n    sprite->affineAnimPaused = TRUE;\n    sprite->subspriteMode = SUBSPRITES_OFF;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_ClearAffineAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    FreeOamMatrix(sprite->oam.matrixNum);\n    sprite->oam.affineMode = ST_OAM_AFFINE_OFF;\n    CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);\n    return TRUE;\n}\n\nstatic bool8 MovementAction_WalkDownStartAffine_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlower(objectEvent, sprite, DIR_SOUTH);\n    sprite->affineAnimPaused = FALSE;\n    StartSpriteAffineAnimIfDifferent(sprite, 0);\n    return MovementAction_WalkDownStartAffine_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkDownStartAffine_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlower(objectEvent, sprite))\n    {\n        sprite->affineAnimPaused = TRUE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_WalkDownAffine_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitWalkSlower(objectEvent, sprite, DIR_SOUTH);\n    sprite->affineAnimPaused = FALSE;\n    ChangeSpriteAffineAnimIfDifferent(sprite, 1);\n    return MovementAction_WalkDownAffine_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_WalkDownAffine_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateWalkSlower(objectEvent, sprite))\n    {\n        sprite->affineAnimPaused = TRUE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid AcroWheelieFaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)\n{\n    SetObjectEventDirection(objectEvent, direction);\n    ShiftStillObjectEventCoords(objectEvent);\n    SetStepAnim(objectEvent, sprite, GetAcroWheeliePedalDirectionAnimNum(direction));\n    sprite->animPaused = TRUE;\n    sprite->data[2] = 1;\n}\n\nstatic bool8 MovementAction_AcroWheelieFaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    AcroWheelieFaceDirection(objectEvent, sprite, DIR_SOUTH);\n    return TRUE;\n}\n\nstatic bool8 MovementAction_AcroWheelieFaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    AcroWheelieFaceDirection(objectEvent, sprite, DIR_NORTH);\n    return TRUE;\n}\n\nstatic bool8 MovementAction_AcroWheelieFaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    AcroWheelieFaceDirection(objectEvent, sprite, DIR_WEST);\n    return TRUE;\n}\n\nstatic bool8 MovementAction_AcroWheelieFaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    AcroWheelieFaceDirection(objectEvent, sprite, DIR_EAST);\n    return TRUE;\n}\n\nstatic bool8 MovementAction_AcroPopWheelieDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, GetAcroWheelieDirectionAnimNum(DIR_SOUTH));\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroPopWheelieUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_NORTH, GetAcroWheelieDirectionAnimNum(DIR_NORTH));\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroPopWheelieLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_WEST, GetAcroWheelieDirectionAnimNum(DIR_WEST));\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroPopWheelieRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_EAST, GetAcroWheelieDirectionAnimNum(DIR_EAST));\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroEndWheelieFaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, GetAcroEndWheelieDirectionAnimNum(DIR_SOUTH));\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroEndWheelieFaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_NORTH, GetAcroEndWheelieDirectionAnimNum(DIR_NORTH));\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroEndWheelieFaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_WEST, GetAcroEndWheelieDirectionAnimNum(DIR_WEST));\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroEndWheelieFaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_EAST, GetAcroEndWheelieDirectionAnimNum(DIR_EAST));\n    return FALSE;\n}\n\nstatic bool8 MovementAction_UnusedAcroActionDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, GetAcroUnusedActionDirectionAnimNum(DIR_SOUTH));\n    return FALSE;\n}\n\nstatic bool8 MovementAction_UnusedAcroActionUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_NORTH, GetAcroUnusedActionDirectionAnimNum(DIR_NORTH));\n    return FALSE;\n}\n\nstatic bool8 MovementAction_UnusedAcroActionLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_WEST, GetAcroUnusedActionDirectionAnimNum(DIR_WEST));\n    return FALSE;\n}\n\nstatic bool8 MovementAction_UnusedAcroActionRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnimInDirection(objectEvent, sprite, DIR_EAST, GetAcroUnusedActionDirectionAnimNum(DIR_EAST));\n    return FALSE;\n}\n\nvoid InitAcroWheelieJump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 distance, u8 type)\n{\n    InitJump(objectEvent, sprite, direction, distance, type);\n    StartSpriteAnimIfDifferent(sprite, GetAcroWheelieDirectionAnimNum(direction));\n    DoShadowFieldEffect(objectEvent);\n}\n\nstatic bool8 MovementAction_AcroWheelieHopFaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieJump(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_LOW);\n    return MovementAction_AcroWheelieHopFaceDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieHopFaceDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieHopFaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieJump(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_LOW);\n    return MovementAction_AcroWheelieHopFaceUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieHopFaceUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieHopFaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_LOW);\n    return MovementAction_AcroWheelieHopFaceLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieHopFaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_LOW);\n    return MovementAction_AcroWheelieHopFaceRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieHopFaceRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieHopDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieJump(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW);\n    return MovementAction_AcroWheelieHopDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieHopDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieHopUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieJump(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW);\n    return MovementAction_AcroWheelieHopUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieHopUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieHopLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW);\n    return MovementAction_AcroWheelieHopLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieHopLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieHopRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW);\n    return MovementAction_AcroWheelieHopRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieHopRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieJumpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieJump(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH);\n    return MovementAction_AcroWheelieJumpDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieJumpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieJumpUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieJump(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH);\n    return MovementAction_AcroWheelieJumpUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieJumpUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieJumpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH);\n    return MovementAction_AcroWheelieJumpLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieJumpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH);\n    return MovementAction_AcroWheelieJumpRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieJumpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (DoJumpAnim(objectEvent, sprite))\n    {\n        objectEvent->hasShadow = FALSE;\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieInPlaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetAcroWheeliePedalDirectionAnimNum(DIR_SOUTH), 8);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieInPlaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetAcroWheeliePedalDirectionAnimNum(DIR_NORTH), 8);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieInPlaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetAcroWheeliePedalDirectionAnimNum(DIR_WEST), 8);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieInPlaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetAcroWheeliePedalDirectionAnimNum(DIR_EAST), 8);\n    return MovementAction_WalkInPlace_Step1(objectEvent, sprite);\n}\n\nvoid InitAcroPopWheelie(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed)\n{\n    InitNpcForMovement(objectEvent, sprite, direction, speed);\n    StartSpriteAnim(sprite, GetAcroWheelieDirectionAnimNum(objectEvent->facingDirection));\n    SeekSpriteAnim(sprite, 0);\n}\n\nstatic bool8 MovementAction_AcroPopWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroPopWheelie(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1);\n    return MovementAction_AcroPopWheelieMoveDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroPopWheelieMoveDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroPopWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroPopWheelie(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1);\n    return MovementAction_AcroPopWheelieMoveUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroPopWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroPopWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroPopWheelie(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1);\n    return MovementAction_AcroPopWheelieMoveLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroPopWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroPopWheelie(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1);\n    return MovementAction_AcroPopWheelieMoveRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroPopWheelieMoveRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid InitAcroWheelieMove(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed)\n{\n    InitNpcForMovement(objectEvent, sprite, direction, speed);\n    SetStepAnimHandleAlternation(objectEvent, sprite, GetAcroWheeliePedalDirectionAnimNum(objectEvent->facingDirection));\n}\n\nstatic bool8 MovementAction_AcroWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieMove(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1);\n    return MovementAction_AcroWheelieMoveDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieMoveDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieMove(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1);\n    return MovementAction_AcroWheelieMoveUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieMove(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1);\n    return MovementAction_AcroWheelieMoveLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_AcroWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitAcroWheelieMove(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1);\n    return MovementAction_AcroWheelieMoveRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_AcroWheelieMoveRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid InitSpin(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed)\n{\n    InitNpcForMovement(objectEvent, sprite, direction, speed);\n    SetStepAnimHandleAlternation(objectEvent, sprite, GetSpinDirectionAnimNum(objectEvent->facingDirection));\n    SeekSpriteAnim(sprite, 0);\n}\n\nstatic bool8 MovementAction_SpinDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitSpin(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1);\n    return MovementAction_SpinDown_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_SpinDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_SpinUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitSpin(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1);\n    return MovementAction_SpinUp_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_SpinUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_SpinLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitSpin(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1);\n    return MovementAction_SpinLeft_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_SpinLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_SpinRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    InitSpin(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1);\n    return MovementAction_SpinRight_Step1(objectEvent, sprite);\n}\n\nstatic bool8 MovementAction_SpinRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (UpdateMovementNormal(objectEvent, sprite))\n    {\n        sprite->data[2] = 2;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RaiseHand_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnim(sprite, ANIM_RAISE_HAND);\n    sprite->animPaused = FALSE;\n    objectEvent->disableAnim = FALSE;\n    sprite->data[2] = 1;\n    sprite->data[4] = 0;\n    sprite->data[5] = 0;\n    sprite->data[6] = 0;\n    sprite->data[7] = 0;\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RaiseHandAndStop_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    return sprite->animEnded;\n}\n\nstatic bool8 MovementAction_RaiseHandAndJump_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    switch (sprite->data[7])\n    {\n    case 0:\n        if((sprite->data[6] += 10) > 127)\n        {\n            sprite->data[6] = 0;\n            sprite->data[5]++;\n            sprite->data[7] = sprite->data[5];\n            StartSpriteAnim(sprite, ANIM_STD_FACE_SOUTH);\n            sprite->animPaused = FALSE;\n            objectEvent->disableAnim = FALSE;\n        }\n        sprite->y2 = -(3 * gSineTable[sprite->data[6]] >> 7);\n        objectEvent->singleMovementActive = sprite->y2 != 0;\n        return FALSE;\n    case 1:\n        if (++sprite->data[4] > 16)\n        {\n            sprite->data[4] = 0;\n            StartSpriteAnim(sprite, ANIM_RAISE_HAND);\n            sprite->animPaused = FALSE;\n            objectEvent->disableAnim = FALSE;\n            sprite->data[7] = 0;\n        }\n        else\n        {\n            objectEvent->singleMovementActive = FALSE;\n        }\n        return FALSE;\n    case 2:\n        objectEvent->singleMovementActive = FALSE;\n        if (++sprite->data[4] > 80)\n        {\n            sprite->data[4] = 0;\n            return TRUE;\n        }\n        else\n        {\n            return FALSE;\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 MovementAction_RaiseHandAndSwim_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    bool8 ret;\n    sprite->data[7] = (sprite->data[7] + 4) & 0xFF;\n    sprite->x2 = gSineTable[sprite->data[7]] >> 7;\n    if (sprite->data[7] == 0)\n        ret = TRUE;\n    else\n        ret = FALSE;\n    return ret;\n}\n\nstatic bool8 MovementAction_ShakeHeadOrWalkInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    StartSpriteAnim(sprite, ANIM_SHAKE_HEAD_OR_WALK_IN_PLACE);\n    sprite->animPaused = FALSE;\n    objectEvent->disableAnim = FALSE;\n    sprite->data[2] = 1;\n    return FALSE;\n}\n\nstatic bool8 MovementAction_ShakeHeadOrWalkInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    return sprite->animEnded;\n}\n\nu8 MovementAction_Finish(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    return TRUE;\n}\n\nstatic bool8 MovementAction_PauseSpriteAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    sprite->animPaused = TRUE;\n    return TRUE;\n}\n\nstatic bool8 MovementAction_FlyUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    sprite->y2 = 0;\n    sprite->data[2]++;\n    return FALSE;\n}\n\nstatic bool8 MovementAction_FlyUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    sprite->y2 -= 8;\n    if (sprite->y2 == -160)\n        sprite->data[2]++;\n    return FALSE;\n}\n\nstatic bool8 MovementAction_FlyDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    sprite->y2 = -160;\n    sprite->data[2]++;\n    return FALSE;\n}\n\nstatic bool8 MovementAction_FlyDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    sprite->y2 += 8;\n    if (sprite->y2 == 0)\n        sprite->data[2]++;\n    return FALSE;\n}\n\nu8 MovementAction_FlyUp_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    return TRUE;\n}\n\nstatic void UpdateObjectEventSpriteAnimPause(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (objectEvent->disableAnim)\n    {\n        sprite->animPaused = TRUE;\n    }\n}\n\nstatic void TryEnableObjectEventAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    if (objectEvent->enableAnim)\n    {\n        sprite->animPaused = FALSE;\n        objectEvent->disableAnim = FALSE;\n        objectEvent->enableAnim = FALSE;\n    }\n}\n\nstatic void UpdateObjectEventVisibility(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    CalcWhetherObjectIsOffscreen(objectEvent, sprite);\n    UpdateObjEventSpriteVisibility(objectEvent, sprite);\n}\n\nstatic void CalcWhetherObjectIsOffscreen(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u16 x, y;\n    u16 x2, y2;\n    const struct ObjectEventGraphicsInfo *graphicsInfo;\n    s16 var;\n\n    objectEvent->offScreen = FALSE;\n    graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);\n    if (sprite->coordOffsetEnabled)\n    {\n        x = sprite->x + sprite->x2 + sprite->centerToCornerVecX + gSpriteCoordOffsetX;\n        y = sprite->y + sprite->y2 + sprite->centerToCornerVecY + gSpriteCoordOffsetY;\n    }\n    else\n    {\n        x = sprite->x + sprite->x2 + sprite->centerToCornerVecX;\n        y = sprite->y + sprite->y2 + sprite->centerToCornerVecY;\n    }\n    x2 = graphicsInfo->width + (s16)x;\n    y2 = graphicsInfo->height + (s16)y;\n    \n    if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SSANNE_EXTERIOR)\n         && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SSANNE_EXTERIOR)\n         && objectEvent->localId == 1)\n    {\n        var = -32;\n    }\n    else\n    {\n        var = -16;\n    }\n    if ((s16)x >= 256 || (s16)x2 < var)\n    {\n        objectEvent->offScreen = TRUE;\n    }\n    if ((s16)y >= 176 || (s16)y2 < -16)\n    {\n        objectEvent->offScreen = TRUE;\n    }\n}\n\nstatic void UpdateObjEventSpriteVisibility(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    sprite->invisible = FALSE;\n    if (objectEvent->invisible || objectEvent->offScreen)\n    {\n        sprite->invisible = TRUE;\n    }\n}\n\nstatic void GetAllGroundEffectFlags_OnSpawn(struct ObjectEvent *objEvent, u32 *flags)\n{\n    ObjectEventUpdateMetatileBehaviors(objEvent);\n    GetGroundEffectFlags_Reflection(objEvent, flags);\n    GetGroundEffectFlags_TallGrassOnSpawn(objEvent, flags);\n    GetGroundEffectFlags_LongGrassOnSpawn(objEvent, flags);\n    GetGroundEffectFlags_SandHeap(objEvent, flags);\n    GetGroundEffectFlags_ShallowFlowingWater(objEvent, flags);\n    GetGroundEffectFlags_ShortGrass(objEvent, flags);\n    GetGroundEffectFlags_HotSprings(objEvent, flags);\n}\n\nstatic void GetAllGroundEffectFlags_OnBeginStep(struct ObjectEvent *objEvent, u32 *flags)\n{\n    ObjectEventUpdateMetatileBehaviors(objEvent);\n    GetGroundEffectFlags_Reflection(objEvent, flags);\n    GetGroundEffectFlags_TallGrassOnBeginStep(objEvent, flags);\n    GetGroundEffectFlags_LongGrassOnBeginStep(objEvent, flags);\n    GetGroundEffectFlags_Tracks(objEvent, flags);\n    GetGroundEffectFlags_SandHeap(objEvent, flags);\n    GetGroundEffectFlags_ShallowFlowingWater(objEvent, flags);\n    GetGroundEffectFlags_Puddle(objEvent, flags);\n    GetGroundEffectFlags_ShortGrass(objEvent, flags);\n    GetGroundEffectFlags_HotSprings(objEvent, flags);\n}\n\nstatic void GetAllGroundEffectFlags_OnFinishStep(struct ObjectEvent *objEvent, u32 *flags)\n{\n    ObjectEventUpdateMetatileBehaviors(objEvent);\n    GetGroundEffectFlags_ShallowFlowingWater(objEvent, flags);\n    GetGroundEffectFlags_SandHeap(objEvent, flags);\n    GetGroundEffectFlags_Puddle(objEvent, flags);\n    GetGroundEffectFlags_Ripple(objEvent, flags);\n    GetGroundEffectFlags_ShortGrass(objEvent, flags);\n    GetGroundEffectFlags_HotSprings(objEvent, flags);\n    GetGroundEffectFlags_Seaweed(objEvent, flags);\n    GetGroundEffectFlags_JumpLanding(objEvent, flags);\n}\n\nstatic void ObjectEventUpdateMetatileBehaviors(struct ObjectEvent *objEvent)\n{\n    objEvent->previousMetatileBehavior = MapGridGetMetatileBehaviorAt(objEvent->previousCoords.x, objEvent->previousCoords.y);\n    objEvent->currentMetatileBehavior = MapGridGetMetatileBehaviorAt(objEvent->currentCoords.x, objEvent->currentCoords.y);\n}\n\nstatic void GetGroundEffectFlags_Reflection(struct ObjectEvent *objEvent, u32 *flags)\n{\n    u32 reflectionFlags[2] = { GROUND_EFFECT_FLAG_REFLECTION, GROUND_EFFECT_FLAG_ICE_REFLECTION };\n    u8 type = ObjectEventCheckForReflectiveSurface(objEvent);\n\n    if (type)\n    {\n        if (!objEvent->hasReflection)\n        {\n            objEvent->hasReflection = 0;\n            objEvent->hasReflection = 1;\n            *flags |= reflectionFlags[type - 1];\n        }\n    }\n    else\n    {\n        objEvent->hasReflection = 0;\n    }\n}\n\nstatic void GetGroundEffectFlags_TallGrassOnSpawn(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (MetatileBehavior_IsTallGrass(objEvent->currentMetatileBehavior))\n        *flags |= GROUND_EFFECT_FLAG_TALL_GRASS_ON_SPAWN;\n}\n\nstatic void GetGroundEffectFlags_TallGrassOnBeginStep(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (MetatileBehavior_IsTallGrass(objEvent->currentMetatileBehavior))\n        *flags |= GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE;\n}\n\nstatic void GetGroundEffectFlags_LongGrassOnSpawn(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (MetatileBehavior_IsLongGrass(objEvent->currentMetatileBehavior))\n        *flags |= GROUND_EFFECT_FLAG_LONG_GRASS_ON_SPAWN;\n}\n\nstatic void GetGroundEffectFlags_LongGrassOnBeginStep(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (MetatileBehavior_IsLongGrass(objEvent->currentMetatileBehavior))\n        *flags |= GROUND_EFFECT_FLAG_LONG_GRASS_ON_MOVE;\n}\n\nstatic void GetGroundEffectFlags_Tracks(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (MetatileBehavior_IsDeepSand(objEvent->previousMetatileBehavior))\n    {\n        *flags |= GROUND_EFFECT_FLAG_DEEP_SAND;\n    }\n    else if (MetatileBehavior_IsSand(objEvent->previousMetatileBehavior)\n             || MetatileBehavior_IsFootprints(objEvent->previousMetatileBehavior))\n    {\n        *flags |= GROUND_EFFECT_FLAG_SAND;\n    }\n}\n\nstatic void GetGroundEffectFlags_SandHeap(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (MetatileBehavior_IsDeepSand(objEvent->currentMetatileBehavior)\n        && MetatileBehavior_IsDeepSand(objEvent->previousMetatileBehavior))\n    {\n        if (!objEvent->inSandPile)\n        {\n            objEvent->inSandPile = 0;\n            objEvent->inSandPile = 1;\n            *flags |= GROUND_EFFECT_FLAG_SAND_PILE;\n        }\n    }\n    else\n    {\n        objEvent->inSandPile = 0;\n    }\n}\n\nstatic void GetGroundEffectFlags_ShallowFlowingWater(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if ((MetatileBehavior_IsShallowFlowingWater(objEvent->currentMetatileBehavior)\n         && MetatileBehavior_IsShallowFlowingWater(objEvent->previousMetatileBehavior))\n        || (MetatileBehavior_IsPacifidlogLog(objEvent->currentMetatileBehavior)\n            && MetatileBehavior_IsPacifidlogLog(objEvent->previousMetatileBehavior)))\n    {\n        if (!objEvent->inShallowFlowingWater)\n        {\n            objEvent->inShallowFlowingWater = 0;\n            objEvent->inShallowFlowingWater = 1;\n            *flags |= GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER;\n        }\n    }\n    else\n    {\n        objEvent->inShallowFlowingWater = 0;\n    }\n}\n\nstatic void GetGroundEffectFlags_Puddle(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (MetatileBehavior_IsPuddle(objEvent->currentMetatileBehavior)\n        && MetatileBehavior_IsPuddle(objEvent->previousMetatileBehavior))\n    {\n        *flags |= GROUND_EFFECT_FLAG_PUDDLE;\n    }\n}\n\nstatic void GetGroundEffectFlags_Ripple(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (MetatileBehavior_HasRipples(objEvent->currentMetatileBehavior))\n        *flags |= GROUND_EFFECT_FLAG_RIPPLES;\n}\n\nstatic void GetGroundEffectFlags_ShortGrass(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (MetatileBehavior_IsShortGrass(objEvent->currentMetatileBehavior)\n        && MetatileBehavior_IsShortGrass(objEvent->previousMetatileBehavior))\n    {\n        if (!objEvent->inShortGrass)\n        {\n            objEvent->inShortGrass = 0;\n            objEvent->inShortGrass = 1;\n            *flags |= GROUND_EFFECT_FLAG_SHORT_GRASS;\n        }\n    }\n    else\n    {\n        objEvent->inShortGrass = 0;\n    }\n}\n\nstatic void GetGroundEffectFlags_HotSprings(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (MetatileBehavior_IsHotSprings(objEvent->currentMetatileBehavior)\n        && MetatileBehavior_IsHotSprings(objEvent->previousMetatileBehavior))\n    {\n        if (!objEvent->inHotSprings)\n        {\n            objEvent->inHotSprings = 0;\n            objEvent->inHotSprings = 1;\n            *flags |= GROUND_EFFECT_FLAG_HOT_SPRINGS;\n        }\n    }\n    else\n    {\n        objEvent->inHotSprings = 0;\n    }\n}\n\nstatic void GetGroundEffectFlags_Seaweed(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (MetatileBehavior_IsSeaweed(objEvent->currentMetatileBehavior))\n        *flags |= GROUND_EFFECT_FLAG_SEAWEED;\n}\n\nstatic void GetGroundEffectFlags_JumpLanding(struct ObjectEvent *objEvent, u32 *flags)\n{\n    typedef bool8 (*MetatileFunc)(u8);\n\n    static const MetatileFunc metatileFuncs[] = {\n        MetatileBehavior_IsTallGrass,\n        MetatileBehavior_IsLongGrass,\n        MetatileBehavior_IsPuddle,\n        MetatileBehavior_IsSurfable,\n        MetatileBehavior_IsShallowFlowingWater,\n        MetatileBehavior_IsATile,\n    };\n\n    static const u32 jumpLandingFlags[] = {\n        GROUND_EFFECT_FLAG_LAND_IN_TALL_GRASS,\n        GROUND_EFFECT_FLAG_LAND_IN_LONG_GRASS,\n        GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER,\n        GROUND_EFFECT_FLAG_LAND_IN_DEEP_WATER,\n        GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER,\n        GROUND_EFFECT_FLAG_LAND_ON_NORMAL_GROUND,\n    };\n\n    if (objEvent->landingJump && !objEvent->disableJumpLandingGroundEffect)\n    {\n        u32 i;\n\n        for (i = 0; i < NELEMS(metatileFuncs); i++)\n        {\n            if (metatileFuncs[i](objEvent->currentMetatileBehavior))\n            {\n                *flags |= jumpLandingFlags[i];\n                return;\n            }\n        }\n    }\n}\n\nstatic u8 ObjectEventCheckForReflectiveSurface(struct ObjectEvent *objEvent)\n{\n    const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId);\n\n    // ceil div by tile width?\n    s16 width = 1;\n    s16 height = 2;\n    s32 i;\n    s32 j;\n    u8 result;\n    u8 b;\n    s16 one;\n\n#define RETURN_REFLECTION_TYPE_AT(x, y)              \\\n    b = MapGridGetMetatileBehaviorAt(x, y);          \\\n    result = GetReflectionTypeByMetatileBehavior(b); \\\n    if (result != 0)                                 \\\n        return result;\n\n    for (i = 0, one = 1; i < height; i++)\n    {\n        RETURN_REFLECTION_TYPE_AT(objEvent->currentCoords.x, objEvent->currentCoords.y + one + i)\n        RETURN_REFLECTION_TYPE_AT(objEvent->previousCoords.x, objEvent->previousCoords.y + one + i)\n        for (j = 1; j < width; j++)\n        {\n            RETURN_REFLECTION_TYPE_AT(objEvent->currentCoords.x + j, objEvent->currentCoords.y + one + i)\n            RETURN_REFLECTION_TYPE_AT(objEvent->currentCoords.x - j, objEvent->currentCoords.y + one + i)\n            RETURN_REFLECTION_TYPE_AT(objEvent->previousCoords.x + j, objEvent->previousCoords.y + one + i)\n            RETURN_REFLECTION_TYPE_AT(objEvent->previousCoords.x - j, objEvent->previousCoords.y + one + i)\n        }\n    }\n    return 0;\n\n#undef RETURN_REFLECTION_TYPE_AT\n}\n\nstatic u8 GetReflectionTypeByMetatileBehavior(u32 behavior)\n{\n    if (MetatileBehavior_IsIce(behavior))\n        return 1;\n    else if (MetatileBehavior_IsReflective(behavior))\n        return 2;\n    else\n        return 0;\n}\n\nu8 GetLedgeJumpDirection(s16 x, s16 y, u8 direction)\n{\n    static bool8 (*const ledgeBehaviorFuncs[])(u8) = {\n        [DIR_SOUTH - 1] = MetatileBehavior_IsJumpSouth,\n        [DIR_NORTH - 1] = MetatileBehavior_IsJumpNorth,\n        [DIR_WEST - 1]  = MetatileBehavior_IsJumpWest,\n        [DIR_EAST - 1]  = MetatileBehavior_IsJumpEast,\n    };\n\n    u8 behavior;\n    u8 index = direction;\n\n    if (index == DIR_NONE)\n        return DIR_NONE;\n    else if (index > DIR_EAST)\n        index -= DIR_EAST;\n\n    index--;\n    behavior = MapGridGetMetatileBehaviorAt(x, y);\n\n    if (ledgeBehaviorFuncs[index](behavior) == TRUE)\n        return index + 1;\n\n    return DIR_NONE;\n}\n\nstatic void SetObjectEventSpriteOamTableForLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    if (objEvent->disableCoveringGroundEffects)\n        return;\n\n    if (!MetatileBehavior_IsLongGrass(objEvent->currentMetatileBehavior))\n        return;\n\n    if (!MetatileBehavior_IsLongGrass(objEvent->previousMetatileBehavior))\n        return;\n\n    sprite->subspriteTableNum = 4;\n\n    if (ElevationToPriority(objEvent->previousElevation) == 1)\n        sprite->subspriteTableNum = 5;\n}\n\nstatic bool8 IsElevationMismatchAt(u8 elevation, s16 x, s16 y)\n{\n    u8 mapElevation;\n\n    if (elevation == 0)\n        return FALSE;\n\n    mapElevation = MapGridGetElevationAt(x, y);\n\n    if (mapElevation == 0 || mapElevation == 15)\n        return FALSE;\n\n    if (mapElevation != elevation)\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic const u8 sElevationToSubpriority[] = {\n    115, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 0, 0, 115\n};\n\nstatic const u8 sElevationToPriority[] = {\n    2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2\n};\n\n// 1 = Above player sprite\n// 2 = Below player sprite\nstatic const u8 sElevationToSubspriteTableNum[] = {\n    1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1,\n};\n\nstatic void UpdateObjectEventElevationAndPriority(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    if (objEvent->fixedPriority)\n        return;\n\n    ObjectEventUpdateElevation(objEvent);\n\n    sprite->subspriteTableNum = sElevationToSubspriteTableNum[objEvent->previousElevation];\n    sprite->oam.priority = sElevationToPriority[objEvent->previousElevation];\n}\n\nstatic void InitObjectPriorityByElevation(struct Sprite *sprite, u8 elevation)\n{\n    sprite->subspriteTableNum = sElevationToSubspriteTableNum[elevation];\n    sprite->oam.priority = sElevationToPriority[elevation];\n}\n\nu8 ElevationToPriority(u8 elevation)\n{\n    return sElevationToPriority[elevation];\n}\n\nvoid ObjectEventUpdateElevation(struct ObjectEvent *objEvent)\n{\n    u8 curElevation = MapGridGetElevationAt(objEvent->currentCoords.x, objEvent->currentCoords.y);\n    u8 prevElevation = MapGridGetElevationAt(objEvent->previousCoords.x, objEvent->previousCoords.y);\n\n    if (curElevation == 15 || prevElevation == 15)\n        return;\n\n    objEvent->currentElevation = curElevation;\n\n    if (curElevation != 0 && curElevation != 15)\n        objEvent->previousElevation = curElevation;\n}\n\nvoid SetObjectSubpriorityByElevation(u8 elevation, struct Sprite *sprite, u8 subpriority)\n{\n    s32 tmp = sprite->centerToCornerVecY;\n    u32 tmpa = *(u16 *)&sprite->y;\n    u32 tmpb = *(u16 *)&gSpriteCoordOffsetY;\n    s32 tmp2 = (tmpa - tmp) + tmpb;\n    u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2;\n    sprite->subpriority = tmp3 + sElevationToSubpriority[elevation] + subpriority;\n}\n\nstatic void ObjectEventUpdateSubpriority(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    if (objEvent->fixedPriority)\n        return;\n\n    SetObjectSubpriorityByElevation(objEvent->previousElevation, sprite, 1);\n}\n\nstatic bool8 AreElevationsCompatible(u8 a, u8 b)\n{\n    if (a == 0 || b == 0)\n        return TRUE;\n\n    if (a != b)\n        return FALSE;\n\n    return TRUE;\n}\n\nvoid GroundEffect_SpawnOnTallGrass(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    gFieldEffectArguments[0] = objEvent->currentCoords.x;\n    gFieldEffectArguments[1] = objEvent->currentCoords.y;\n    gFieldEffectArguments[2] = objEvent->previousElevation;\n    gFieldEffectArguments[3] = 2;\n    gFieldEffectArguments[4] = objEvent->localId << 8 | objEvent->mapNum;\n    gFieldEffectArguments[5] = objEvent->mapGroup;\n    gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup;\n    gFieldEffectArguments[7] = 1;\n    FieldEffectStart(FLDEFF_TALL_GRASS);\n}\n\nvoid GroundEffect_StepOnTallGrass(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    gFieldEffectArguments[0] = objEvent->currentCoords.x;\n    gFieldEffectArguments[1] = objEvent->currentCoords.y;\n    gFieldEffectArguments[2] = objEvent->previousElevation;\n    gFieldEffectArguments[3] = 2;\n    gFieldEffectArguments[4] = objEvent->localId << 8 | objEvent->mapNum;\n    gFieldEffectArguments[5] = objEvent->mapGroup;\n    gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup;\n    gFieldEffectArguments[7] = 0;\n    FieldEffectStart(FLDEFF_TALL_GRASS);\n}\n\nvoid GroundEffect_SpawnOnLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    gFieldEffectArguments[0] = objEvent->currentCoords.x;\n    gFieldEffectArguments[1] = objEvent->currentCoords.y;\n    gFieldEffectArguments[2] = objEvent->previousElevation;\n    gFieldEffectArguments[3] = 2;\n    gFieldEffectArguments[4] = objEvent->localId << 8 | objEvent->mapNum;\n    gFieldEffectArguments[5] = objEvent->mapGroup;\n    gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup;\n    gFieldEffectArguments[7] = 1;\n    FieldEffectStart(FLDEFF_LONG_GRASS);\n}\n\nvoid GroundEffect_StepOnLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    gFieldEffectArguments[0] = objEvent->currentCoords.x;\n    gFieldEffectArguments[1] = objEvent->currentCoords.y;\n    gFieldEffectArguments[2] = objEvent->previousElevation;\n    gFieldEffectArguments[3] = 2;\n    gFieldEffectArguments[4] = (objEvent->localId << 8) | objEvent->mapNum;\n    gFieldEffectArguments[5] = objEvent->mapGroup;\n    gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup;\n    gFieldEffectArguments[7] = 0;\n    FieldEffectStart(FLDEFF_LONG_GRASS);\n}\n\nvoid GroundEffect_WaterReflection(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    SetUpReflection(objEvent, sprite, 0);\n}\n\nvoid GroundEffect_IceReflection(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    SetUpReflection(objEvent, sprite, 1);\n}\n\nvoid GroundEffect_FlowingWater(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    StartFieldEffectForObjectEvent(FLDEFF_FEET_IN_FLOWING_WATER, objEvent);\n}\n\nstatic void (*const sGroundEffectTracksFuncs[])(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a) = {\n    DoTracksGroundEffect_None,\n    DoTracksGroundEffect_Footprints,\n    DoTracksGroundEffect_BikeTireTracks,\n};\n\nvoid GroundEffect_SandTracks(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId);\n    sGroundEffectTracksFuncs[info->tracks](objEvent, sprite, 0);\n}\n\nvoid GroundEffect_DeepSandTracks(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId);\n    sGroundEffectTracksFuncs[info->tracks](objEvent, sprite, 1);\n}\n\nstatic void DoTracksGroundEffect_None(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a)\n{\n}\n\nstatic void DoTracksGroundEffect_Footprints(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a)\n{\n    // First half-word is a Field Effect script id. (gFieldEffectScriptPointers)\n    u16 sandFootprints_FieldEffectData[2] = {\n        FLDEFF_SAND_FOOTPRINTS,\n        FLDEFF_DEEP_SAND_FOOTPRINTS\n    };\n\n    gFieldEffectArguments[0] = objEvent->previousCoords.x;\n    gFieldEffectArguments[1] = objEvent->previousCoords.y;\n    gFieldEffectArguments[2] = 149;\n    gFieldEffectArguments[3] = 2;\n    gFieldEffectArguments[4] = objEvent->facingDirection;\n    FieldEffectStart(sandFootprints_FieldEffectData[a]);\n}\n\nstatic void DoTracksGroundEffect_BikeTireTracks(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a)\n{\n    //  Specifies which bike track shape to show next.\n    //  For example, when the bike turns from up to right, it will show\n    //  a track that curves to the right.\n    //  Each 4-byte row corresponds to the initial direction of the bike, and\n    //  each byte in that row is for the next direction of the bike in the order\n    //  of down, up, left, right.\n    static const u8 bikeTireTracks_Transitions[4][4] = {\n        1, 2, 7, 8,\n        1, 2, 6, 5,\n        5, 8, 3, 4,\n        6, 7, 3, 4,\n    };\n\n    if (objEvent->currentCoords.x != objEvent->previousCoords.x || objEvent->currentCoords.y != objEvent->previousCoords.y)\n    {\n        gFieldEffectArguments[0] = objEvent->previousCoords.x;\n        gFieldEffectArguments[1] = objEvent->previousCoords.y;\n        gFieldEffectArguments[2] = 149;\n        gFieldEffectArguments[3] = 2;\n        gFieldEffectArguments[4] =\n            bikeTireTracks_Transitions[objEvent->previousMovementDirection][objEvent->facingDirection - 5];\n        FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS);\n    }\n}\n\nvoid GroundEffect_Ripple(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    DoRippleFieldEffect(objEvent, sprite);\n}\n\nvoid GroundEffect_StepOnPuddle(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    StartFieldEffectForObjectEvent(FLDEFF_SPLASH, objEvent);\n}\n\nvoid GroundEffect_SandHeap(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    StartFieldEffectForObjectEvent(FLDEFF_SAND_PILE, objEvent);\n}\n\nvoid GroundEffect_JumpOnTallGrass(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    u8 spriteId;\n\n    gFieldEffectArguments[0] = objEvent->currentCoords.x;\n    gFieldEffectArguments[1] = objEvent->currentCoords.y;\n    gFieldEffectArguments[2] = objEvent->previousElevation;\n    gFieldEffectArguments[3] = 2;\n    FieldEffectStart(FLDEFF_JUMP_TALL_GRASS);\n\n    spriteId = FindTallGrassFieldEffectSpriteId(\n        objEvent->localId,\n        objEvent->mapNum,\n        objEvent->mapGroup,\n        objEvent->currentCoords.x,\n        objEvent->currentCoords.y);\n\n    if (spriteId == MAX_SPRITES)\n        GroundEffect_SpawnOnTallGrass(objEvent, sprite);\n}\n\nvoid GroundEffect_JumpOnLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    gFieldEffectArguments[0] = objEvent->currentCoords.x;\n    gFieldEffectArguments[1] = objEvent->currentCoords.y;\n    gFieldEffectArguments[2] = objEvent->previousElevation;\n    gFieldEffectArguments[3] = 2;\n    FieldEffectStart(FLDEFF_JUMP_LONG_GRASS);\n}\n\nvoid GroundEffect_JumpOnShallowWater(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    gFieldEffectArguments[0] = objEvent->currentCoords.x;\n    gFieldEffectArguments[1] = objEvent->currentCoords.y;\n    gFieldEffectArguments[2] = objEvent->previousElevation;\n    gFieldEffectArguments[3] = sprite->oam.priority;\n    FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH);\n}\n\nvoid GroundEffect_JumpOnWater(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    gFieldEffectArguments[0] = objEvent->currentCoords.x;\n    gFieldEffectArguments[1] = objEvent->currentCoords.y;\n    gFieldEffectArguments[2] = objEvent->previousElevation;\n    gFieldEffectArguments[3] = sprite->oam.priority;\n    FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH);\n}\n\nvoid GroundEffect_JumpLandingDust(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    gFieldEffectArguments[0] = objEvent->currentCoords.x;\n    gFieldEffectArguments[1] = objEvent->currentCoords.y;\n    gFieldEffectArguments[2] = objEvent->previousElevation;\n    gFieldEffectArguments[3] = sprite->oam.priority;\n    FieldEffectStart(FLDEFF_DUST);\n}\n\nvoid GroundEffect_ShortGrass(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    StartFieldEffectForObjectEvent(FLDEFF_SHORT_GRASS, objEvent);\n}\n\nvoid GroundEffect_HotSprings(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    StartFieldEffectForObjectEvent(FLDEFF_HOT_SPRINGS_WATER, objEvent);\n}\n\nvoid GroundEffect_Seaweed(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    gFieldEffectArguments[0] = objEvent->currentCoords.x;\n    gFieldEffectArguments[1] = objEvent->currentCoords.y;\n    FieldEffectStart(FLDEFF_BUBBLES);\n}\n\nstatic void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct Sprite *sprite) = {\n    GroundEffect_SpawnOnTallGrass,\n    GroundEffect_StepOnTallGrass,\n    GroundEffect_SpawnOnLongGrass,\n    GroundEffect_StepOnLongGrass,\n    GroundEffect_WaterReflection,\n    GroundEffect_IceReflection,\n    GroundEffect_FlowingWater,\n    GroundEffect_SandTracks,\n    GroundEffect_DeepSandTracks,\n    GroundEffect_Ripple,\n    GroundEffect_StepOnPuddle,\n    GroundEffect_SandHeap,\n    GroundEffect_JumpOnTallGrass,\n    GroundEffect_JumpOnLongGrass,\n    GroundEffect_JumpOnShallowWater,\n    GroundEffect_JumpOnWater,\n    GroundEffect_JumpLandingDust,\n    GroundEffect_ShortGrass,\n    GroundEffect_HotSprings,\n    GroundEffect_Seaweed\n};\n\nstatic void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags)\n{\n    u32 i;\n\n    if (objEvent->localId == OBJ_EVENT_ID_CAMERA && objEvent->invisible)\n        return;\n\n    if (ObjectEventIsFarawayIslandMew(objEvent) == TRUE && !ShouldMewShakeGrass(objEvent))\n        return;\n\n    for (i = 0; i < NELEMS(sGroundEffectFuncs); i++, flags >>= 1)\n        if (flags & 1)\n            sGroundEffectFuncs[i](objEvent, sprite);\n}\n\nvoid filters_out_some_ground_effects(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (objEvent->disableCoveringGroundEffects)\n    {\n        objEvent->inShortGrass = 0;\n        objEvent->inSandPile = 0;\n        objEvent->inShallowFlowingWater = 0;\n        objEvent->inHotSprings = 0;\n        *flags &= ~(GROUND_EFFECT_FLAG_HOT_SPRINGS\n                  | GROUND_EFFECT_FLAG_SHORT_GRASS\n                  | GROUND_EFFECT_FLAG_SAND_PILE\n                  | GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER\n                  | GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE);\n    }\n}\n\nvoid FilterOutStepOnPuddleGroundEffectIfJumping(struct ObjectEvent *objEvent, u32 *flags)\n{\n    if (objEvent->landingJump)\n        *flags &= ~GROUND_EFFECT_FLAG_PUDDLE;\n}\n\nstatic void DoGroundEffects_OnSpawn(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    u32 flags;\n\n    if (objEvent->triggerGroundEffectsOnMove)\n    {\n        flags = 0;\n        UpdateObjectEventElevationAndPriority(objEvent, sprite);\n        GetAllGroundEffectFlags_OnSpawn(objEvent, &flags);\n        SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite);\n        DoFlaggedGroundEffects(objEvent, sprite, flags);\n        objEvent->triggerGroundEffectsOnMove = 0;\n        objEvent->disableCoveringGroundEffects = 0;\n    }\n}\n\nstatic void DoGroundEffects_OnBeginStep(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    u32 flags;\n\n    if (objEvent->triggerGroundEffectsOnMove)\n    {\n        flags = 0;\n        UpdateObjectEventElevationAndPriority(objEvent, sprite);\n        GetAllGroundEffectFlags_OnBeginStep(objEvent, &flags);\n        SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite);\n        filters_out_some_ground_effects(objEvent, &flags);\n        DoFlaggedGroundEffects(objEvent, sprite, flags);\n        objEvent->triggerGroundEffectsOnMove = 0;\n        objEvent->disableCoveringGroundEffects = 0;\n    }\n}\n\nstatic void DoGroundEffects_OnFinishStep(struct ObjectEvent *objEvent, struct Sprite *sprite)\n{\n    u32 flags;\n\n    if (objEvent->triggerGroundEffectsOnStop)\n    {\n        flags = 0;\n        UpdateObjectEventElevationAndPriority(objEvent, sprite);\n        GetAllGroundEffectFlags_OnFinishStep(objEvent, &flags);\n        SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite);\n        FilterOutStepOnPuddleGroundEffectIfJumping(objEvent, &flags);\n        DoFlaggedGroundEffects(objEvent, sprite, flags);\n        objEvent->triggerGroundEffectsOnStop = 0;\n        objEvent->landingJump = 0;\n    }\n}\n\nbool8 FreezeObjectEvent(struct ObjectEvent *objectEvent)\n{\n    if (objectEvent->heldMovementActive || objectEvent->frozen)\n        return TRUE;\n    objectEvent->frozen = TRUE;\n    objectEvent->spriteAnimPausedBackup = gSprites[objectEvent->spriteId].animPaused;\n    objectEvent->spriteAffineAnimPausedBackup = gSprites[objectEvent->spriteId].affineAnimPaused;\n    gSprites[objectEvent->spriteId].animPaused = TRUE;\n    gSprites[objectEvent->spriteId].affineAnimPaused = TRUE;\n    return FALSE;\n}\n\nvoid FreezeObjectEvents(void)\n{\n    u32 i;\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (gObjectEvents[i].active && i != gPlayerAvatar.objectEventId)\n            FreezeObjectEvent(&gObjectEvents[i]);\n    }\n}\n\nvoid FreezeObjectEventsExceptOne(u8 noFreeze)\n{\n    u32 i;\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (i != noFreeze && gObjectEvents[i].active && i != gPlayerAvatar.objectEventId)\n            FreezeObjectEvent(&gObjectEvents[i]);\n    }\n}\n\nvoid UnfreezeObjectEvent(struct ObjectEvent *objectEvent)\n{\n    if (objectEvent->active && objectEvent->frozen)\n    {\n        objectEvent->frozen = FALSE;\n        gSprites[objectEvent->spriteId].animPaused = objectEvent->spriteAnimPausedBackup;\n        gSprites[objectEvent->spriteId].affineAnimPaused = objectEvent->spriteAffineAnimPausedBackup;\n    }\n}\n\nvoid UnfreezeObjectEvents(void)\n{\n    u32 i;\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (gObjectEvents[i].active)\n            UnfreezeObjectEvent(&gObjectEvents[i]);\n    }\n}\n\n#define tDirection data[3]\n#define tSpeed     data[4]\n#define tStepNo    data[5]\n\nstatic void Step1(struct Sprite *sprite, u8 direction)\n{\n    sprite->x += sDirectionToVectors[direction].x;\n    sprite->y += sDirectionToVectors[direction].y;\n}\n\nstatic void Step2(struct Sprite *sprite, u8 direction)\n{\n    sprite->x += 2 * (u16)sDirectionToVectors[direction].x;\n    sprite->y += 2 * (u16)sDirectionToVectors[direction].y;\n}\n\nstatic void Step3(struct Sprite *sprite, u8 direction)\n{\n    sprite->x += 2 * (u16)sDirectionToVectors[direction].x + (u16)sDirectionToVectors[direction].x;\n    sprite->y += 2 * (u16)sDirectionToVectors[direction].y + (u16)sDirectionToVectors[direction].y;\n}\n\nstatic void Step4(struct Sprite *sprite, u8 direction)\n{\n    sprite->x += 4 * (u16)sDirectionToVectors[direction].x;\n    sprite->y += 4 * (u16)sDirectionToVectors[direction].y;\n}\n\nstatic void Step8(struct Sprite *sprite, u8 direction)\n{\n    sprite->x += 8 * (u16)sDirectionToVectors[direction].x;\n    sprite->y += 8 * (u16)sDirectionToVectors[direction].y;\n}\n\nvoid SetSpriteDataForNormalStep(struct Sprite *sprite, u8 direction, u8 speed)\n{\n    sprite->tDirection = direction;\n    sprite->tSpeed = speed;\n    sprite->tStepNo = 0;\n}\n\ntypedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 direction);\n\nstatic const SpriteStepFunc sSpeedNormalStepFuncs[] = {\n    Step1,\n    Step1,\n    Step1,\n    Step1,\n    Step1,\n    Step1,\n    Step1,\n    Step1,\n    Step1,\n    Step1,\n    Step1,\n    Step1,\n    Step1,\n    Step1,\n    Step1,\n    Step1\n};\n\nstatic const SpriteStepFunc sSpeedFast1StepFuncs[] = {\n    Step2,\n    Step2,\n    Step2,\n    Step2,\n    Step2,\n    Step2,\n    Step2,\n    Step2\n};\n\nstatic const SpriteStepFunc sSpeedFast2StepFuncs[] = {\n    Step2,\n    Step3,\n    Step3,\n    Step2,\n    Step3,\n    Step3\n};\n\nstatic const SpriteStepFunc sSpeedFasterStepFuncs[] = {\n    Step4,\n    Step4,\n    Step4,\n    Step4\n};\n\nstatic const SpriteStepFunc sSpeedFastestStepFuncs[] = {\n    Step8,\n    Step8\n};\n\nstatic const SpriteStepFunc *const sNpcStepFuncTables[] = {\n    [MOVE_SPEED_NORMAL]  = sSpeedNormalStepFuncs,\n    [MOVE_SPEED_FAST_1]  = sSpeedFast1StepFuncs,\n    [MOVE_SPEED_FAST_2]  = sSpeedFast2StepFuncs,\n    [MOVE_SPEED_FASTER]  = sSpeedFasterStepFuncs,\n    [MOVE_SPEED_FASTEST] = sSpeedFastestStepFuncs,\n};\n\nstatic const s16 sStepTimes[] = {\n    [MOVE_SPEED_NORMAL]  = NELEMS(sSpeedNormalStepFuncs),\n    [MOVE_SPEED_FAST_1]  = NELEMS(sSpeedFast1StepFuncs),\n    [MOVE_SPEED_FAST_2]  = NELEMS(sSpeedFast2StepFuncs),\n    [MOVE_SPEED_FASTER]  = NELEMS(sSpeedFasterStepFuncs),\n    [MOVE_SPEED_FASTEST] = NELEMS(sSpeedFastestStepFuncs),\n};\n\nbool8 NpcTakeStep(struct Sprite *sprite)\n{\n    if (sprite->tStepNo >= sStepTimes[sprite->tSpeed])\n        return FALSE;\n\n    sNpcStepFuncTables[sprite->tSpeed][sprite->tStepNo](sprite, sprite->tDirection);\n\n    sprite->tStepNo++;\n\n    if (sprite->tStepNo < sStepTimes[sprite->tSpeed])\n        return FALSE;\n\n    return TRUE;\n}\n\n#undef tSpeed\n\n#define tDelay     data[4]\n\nvoid SetWalkSlowerSpriteData(struct Sprite *sprite, u8 direction)\n{\n    sprite->tDirection = direction;\n    sprite->tDelay = 0;\n    sprite->tStepNo = 0;\n}\n\nbool8 UpdateWalkSlowerAnim(struct Sprite *sprite)\n{\n    if (!(sprite->tDelay & 1))\n    {\n        Step1(sprite, sprite->tDirection);\n        sprite->tStepNo++;\n    }\n\n    sprite->tDelay++;\n\n    if (sprite->tStepNo > 15)\n        return TRUE;\n    else\n        return FALSE;\n}\n\n// SetWalkSlowSpriteData, SetWalkSlowerSpriteData, SetWalkSlowestSpriteData,\n// and SetRunSlowSpriteData are functionally equivalent\nvoid SetWalkSlowSpriteData(struct Sprite *sprite, u8 direction)\n{\n    sprite->tDirection = direction;\n    sprite->tDelay = 0;\n    sprite->tStepNo = 0;\n}\n\nbool8 UpdateWalkSlowAnim(struct Sprite *sprite)\n{\n    if (++sprite->tDelay < 3)\n    {\n        Step1(sprite, sprite->tDirection);\n        sprite->tStepNo++;\n    }\n    else\n        sprite->tDelay = 0;\n\n    if (sprite->tStepNo > 15)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid SetWalkSlowestSpriteData(struct Sprite *sprite, u8 direction)\n{\n    sprite->tDirection = direction;\n    sprite->tDelay = 0;\n    sprite->tStepNo = 0;\n}\n\nbool8 UpdateWalkSlowestAnim(struct Sprite *sprite)\n{\n    if (++sprite->tDelay > 9)\n    {\n        sprite->tDelay = 0;\n        Step1(sprite, sprite->tDirection);\n        sprite->tStepNo++;\n    }\n\n    if (sprite->tStepNo > 15)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid SetRunSlowSpriteData(struct Sprite *sprite, u8 direction)\n{\n    sprite->tDirection = direction;\n    sprite->tDelay = 0;\n    sprite->tStepNo = 0;\n}\n\nbool8 UpdateRunSlowAnim(struct Sprite *sprite)\n{\n    if ((++sprite->tDelay) & 1)\n    {\n        Step1(sprite, sprite->tDirection);\n        sprite->tStepNo++;\n    }\n    else\n    {\n        Step2(sprite, sprite->tDirection);\n        sprite->tStepNo += 2;\n    }\n\n    if (sprite->tStepNo > 15)\n        return TRUE;\n    else\n        return FALSE;\n}\n\n#undef tStepNo\n#undef tDelay\n\nstatic const s8 sJumpY_High[] = {\n     -4,  -6,  -8, -10, -11, -12, -12, -12,\n    -11, -10,  -9,  -8,  -6,  -4,   0,   0\n};\n\nstatic const s8 sJumpY_Low[] = {\n    0,   -2,  -3,  -4,  -5,  -6,  -6,  -6,\n    -5,  -5,  -4,  -3,  -2,   0,   0,   0\n};\n\nstatic const s8 sJumpY_Normal[] = {\n    -2,  -4,  -6,  -8,  -9, -10, -10, -10,\n    -9,  -8,  -6,  -5,  -3,  -2,   0,   0\n};\n\n#define sJumpDistance  data[4]\n#define sJumpType      data[5]\n#define sTimer         data[6]\n\nstatic const s8 *const sJumpYTable[] = {\n    [JUMP_TYPE_HIGH]   = sJumpY_High,\n    [JUMP_TYPE_LOW]    = sJumpY_Low,\n    [JUMP_TYPE_NORMAL] = sJumpY_Normal,\n};\n\nstatic s16 GetJumpY(s16 i, u8 type)\n{\n    return sJumpYTable[type][i];\n}\n\nvoid SetJumpSpriteData(struct Sprite *sprite, u8 direction, u8 distance, u8 type)\n{\n    sprite->tDirection = direction;\n    sprite->sJumpDistance = distance;\n    sprite->sJumpType = type;\n    sprite->sTimer = 0;\n}\n\nu8 DoJumpSpriteMovement(struct Sprite *sprite)\n{\n    s16 distanceToTime[] = {\n        [JUMP_DISTANCE_IN_PLACE] = 16,\n        [JUMP_DISTANCE_NORMAL]   = 16,\n        [JUMP_DISTANCE_FAR]      = 32,\n    };\n    u8 distanceToShift[] = {\n        [JUMP_DISTANCE_IN_PLACE] = 0,\n        [JUMP_DISTANCE_NORMAL]   = 0,\n        [JUMP_DISTANCE_FAR]      = 1,\n    };\n    u8 jumpPhase = 0;\n\n    if (sprite->sJumpDistance != JUMP_DISTANCE_IN_PLACE)\n        Step1(sprite, sprite->tDirection);\n\n    sprite->y2 = GetJumpY(sprite->sTimer >> distanceToShift[sprite->sJumpDistance], sprite->sJumpType);\n\n    sprite->sTimer++;\n\n    if (sprite->sTimer == (distanceToTime[sprite->sJumpDistance] >> 1))\n        jumpPhase = JUMP_HALFWAY;\n\n    if (sprite->sTimer >= distanceToTime[sprite->sJumpDistance])\n    {\n        sprite->y2 = 0;\n        jumpPhase = JUMP_FINISHED;\n    }\n\n    return jumpPhase;\n}\n\nu8 DoJumpSpecialSpriteMovement(struct Sprite *sprite)\n{\n    s16 duration[3] = {0x20, 0x20, 0x40};\n    u8 shifts[3] = {1, 1, 2};\n    u8 jumpPhase = 0;\n\n    if (sprite->sJumpDistance != JUMP_DISTANCE_IN_PLACE && !(sprite->sTimer & 1))\n        Step1(sprite, sprite->tDirection);\n\n    sprite->y2 = GetJumpY(sprite->sTimer >> shifts[sprite->sJumpDistance], sprite->sJumpType);\n\n    sprite->sTimer++;\n\n    if (sprite->sTimer == (duration[sprite->sJumpDistance] >> 1))\n        jumpPhase = JUMP_HALFWAY;\n\n    if (sprite->sTimer >= duration[sprite->sJumpDistance])\n    {\n        sprite->y2 = 0;\n        jumpPhase = JUMP_FINISHED;\n    }\n\n    return jumpPhase;\n}\n\n#undef sTimer\n#undef sJumpType\n#undef sJumpDistance\n#undef tDirection\n\n#define tDelay data[3]\n\nvoid SetMovementDelay(struct Sprite *sprite, s16 delay)\n{\n    sprite->tDelay = delay;\n}\n\nbool8 WaitForMovementDelay(struct Sprite *sprite)\n{\n    sprite->tDelay--;\n\n    if (sprite->tDelay == 0)\n        return TRUE;\n    else\n        return FALSE;\n}\n\n#undef tDelay\n\nvoid SetAndStartSpriteAnim(struct Sprite *sprite, u8 animNum, u8 animCmdIndex)\n{\n    sprite->animNum = animNum;\n    sprite->animPaused = FALSE;\n    SeekSpriteAnim(sprite, animCmdIndex);\n}\n\nbool8 SpriteAnimEnded(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid UpdateObjectEventSpriteInvisibility(struct Sprite *sprite, bool8 invisible)\n{\n    u16 x, y;\n    s16 x2, y2;\n\n    sprite->invisible = invisible;\n\n    if (sprite->coordOffsetEnabled)\n    {\n        x = sprite->x + sprite->x2 + sprite->centerToCornerVecX + gSpriteCoordOffsetX;\n        y = sprite->y + sprite->y2 + sprite->centerToCornerVecY + gSpriteCoordOffsetY;\n    }\n    else\n    {\n        x = sprite->x + sprite->x2 + sprite->centerToCornerVecX;\n        y = sprite->y + sprite->y2 + sprite->centerToCornerVecY;\n    }\n\n    x2 = x - (sprite->centerToCornerVecX >> 1);\n    y2 = y - (sprite->centerToCornerVecY >> 1);\n\n    if ((s16)x >= DISPLAY_WIDTH + 16 || x2 < -16)\n        sprite->invisible = TRUE;\n    if ((s16)y >= DISPLAY_HEIGHT + 16 || y2 < -16)\n        sprite->invisible = TRUE;\n}\n\n#define sInvisible     data[2]\n#define sAnimNum       data[3]\n#define sAnimState     data[4]\n\nvoid SpriteCB_VirtualObject(struct Sprite *sprite)\n{\n    VirtualObject_UpdateAnim(sprite);\n    SetObjectSubpriorityByElevation(sprite->sVirtualObjElev, sprite, 1);\n    UpdateObjectEventSpriteInvisibility(sprite, sprite->sInvisible);\n}\n\n// Unused\nstatic void DestroyVirtualObjects(void)\n{\n    s32 i;\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        struct Sprite *sprite = &gSprites[i];\n        if (sprite->inUse && sprite->callback == SpriteCB_VirtualObject)\n            DestroySprite(sprite);\n    }\n}\n\nstatic int GetVirtualObjectSpriteId(u8 virtualObjId)\n{\n    int i;\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        struct Sprite *sprite = &gSprites[i];\n        if (sprite->inUse && sprite->callback == SpriteCB_VirtualObject && (u8)sprite->sVirtualObjId == virtualObjId)\n            return i;\n    }\n    return MAX_SPRITES;\n}\n\nvoid TurnVirtualObject(u8 virtualObjId, u8 direction)\n{\n    u8 animNum;\n    u8 spriteId = GetVirtualObjectSpriteId(virtualObjId);\n    if (spriteId != MAX_SPRITES)\n    {\n        struct Sprite *sprite = &gSprites[spriteId];\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(direction));\n    }\n}\n\nvoid SetVirtualObjectGraphics(u8 virtualObjId, u8 direction)\n{\n    int spriteId = GetVirtualObjectSpriteId(virtualObjId);\n    if (spriteId != MAX_SPRITES)\n    {\n        struct Sprite *sprite = &gSprites[spriteId];\n        const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(direction);\n        u16 baseBlock = sprite->oam.tileNum;\n        sprite->oam = *info->oam;\n        sprite->oam.tileNum = baseBlock;\n        sprite->oam.paletteNum = info->paletteSlot;\n        sprite->images = info->images;\n        if (info->subspriteTables == NULL)\n        {\n            sprite->subspriteTables = NULL;\n            sprite->subspriteTableNum = 0;\n            sprite->subspriteMode = SUBSPRITES_OFF;\n        }\n        else\n        {\n            SetSubspriteTables(sprite, info->subspriteTables);\n            sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;\n        }\n        StartSpriteAnim(sprite, 0);\n    }\n}\n\nvoid SetVirtualObjectInvisibility(u8 virtualObjId, bool32 invisible)\n{\n    u8 spriteId = GetVirtualObjectSpriteId(virtualObjId);\n    if (spriteId != MAX_SPRITES)\n    {\n        if (invisible)\n            gSprites[spriteId].sInvisible = TRUE;\n        else\n            gSprites[spriteId].sInvisible = FALSE;\n    }\n}\n\nbool32 IsVirtualObjectInvisible(u8 virtualObjId)\n{\n    u8 spriteId = GetVirtualObjectSpriteId(virtualObjId);\n    if (spriteId == MAX_SPRITES)\n        return FALSE;\n    return gSprites[spriteId].sInvisible == TRUE;\n}\n\nvoid SetVirtualObjectSpriteAnim(u8 virtualObjId, u8 animNo)\n{\n    u8 spriteId = GetVirtualObjectSpriteId(virtualObjId);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].sAnimNum = animNo;\n        gSprites[spriteId].sAnimState = 0;\n    }\n}\n\nstatic void MoveUnionRoomObjectUp(struct Sprite *sprite)\n{\n    switch (sprite->sAnimState)\n    {\n    case 0:\n        sprite->y2 = 0;\n        sprite->sAnimState++;\n        // fallthrough\n    case 1:\n        if ((sprite->y2 -= 8) == -DISPLAY_HEIGHT)\n        {\n            sprite->y2 = 0;\n            sprite->sInvisible = TRUE;\n            sprite->sAnimNum = 0;\n            sprite->sAnimState = 0;\n        }\n        break;\n    }\n}\n\nstatic void MoveUnionRoomObjectDown(struct Sprite *sprite)\n{\n    switch (sprite->sAnimState)\n    {\n    case 0:\n        sprite->y2 = -DISPLAY_HEIGHT;\n        sprite->sAnimState++;\n        // fallthrough\n    case 1:\n        if ((sprite->y2 += 8) == 0)\n        {\n            sprite->sAnimNum = 0;\n            sprite->sAnimState = 0;\n        }\n        break;\n    }\n}\n\nstatic void VirtualObject_UpdateAnim(struct Sprite *sprite)\n{\n    switch (sprite->sAnimNum)\n    {\n    case UNION_ROOM_SPAWN_NONE:\n        break;\n    case UNION_ROOM_SPAWN_IN:\n        MoveUnionRoomObjectDown(sprite);\n        break;\n    case UNION_ROOM_SPAWN_OUT:\n        MoveUnionRoomObjectUp(sprite);\n        break;\n    default:\n        sprite->sAnimNum = 0;\n        AGB_ASSERT_EX(0, ABSPATH(\"evobjmv.c\"), 13331);\n    }\n}\n\nbool32 IsVirtualObjectAnimating(u8 virtualObjId)\n{\n    u8 spriteId = GetVirtualObjectSpriteId(virtualObjId);\n    if (spriteId == MAX_SPRITES)\n        return FALSE;\n    if (gSprites[spriteId].sAnimNum)\n        return TRUE;\n    else\n        return FALSE;\n}\n\n#undef sVirtualObjId\n#undef sVirtualObjElev\n#undef sInvisible\n#undef sAnimNum\n#undef sAnimState\n\nu32 StartFieldEffectForObjectEvent(u8 fieldEffectId, struct ObjectEvent *objectEvent)\n{\n    ObjectEventGetLocalIdAndMap(objectEvent, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);\n    return FieldEffectStart(fieldEffectId);\n}\n\nvoid DoShadowFieldEffect(struct ObjectEvent *objectEvent)\n{\n    if (!objectEvent->hasShadow)\n    {\n        objectEvent->hasShadow = TRUE;\n        StartFieldEffectForObjectEvent(FLDEFF_SHADOW, objectEvent);\n    }\n}\n\nstatic void DoRippleFieldEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);\n    gFieldEffectArguments[0] = sprite->x;\n    gFieldEffectArguments[1] = sprite->y + (graphicsInfo->height >> 1) - 2;\n    gFieldEffectArguments[2] = 151;\n    gFieldEffectArguments[3] = 3;\n    FieldEffectStart(FLDEFF_RIPPLE);\n}\n\nvoid SetObjectMovementType(u16 localId, u8 movementType)\n{\n    struct ObjectEvent *objectEvent = &gObjectEvents[GetObjectEventIdByLocalId(localId)];\n    \n    objectEvent->movementType = movementType;\n    objectEvent->directionSequenceIndex = 0;\n    objectEvent->playerCopyableMovement = 0;\n    gSprites[objectEvent->spriteId].callback = sMovementTypeCallbacks[movementType];\n    gSprites[objectEvent->spriteId].data[1] = 0;\n}\n"
  },
  {
    "path": "src/evolution_graphics.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"trig.h\"\n#include \"random.h\"\n#include \"decompress.h\"\n#include \"task.h\"\n#include \"evolution_scene.h\"\n#include \"evolution_graphics.h\"\n#include \"constants/songs.h\"\n\nstatic void SpriteCallbackDummy_EvoSparkles(struct Sprite *sprite);\nstatic void EvoTask_PreEvoSparkleSet1Init(u8 taskId);\nstatic void EvoTask_CreatePreEvoSparkleSet1(u8 taskId);\nstatic void EvoTask_WaitForPre1SparklesToGoUp(u8 taskId);\nstatic void EvoTask_PreEvoSparkleSet2Init(u8 taskId);\nstatic void EvoTask_CreatePreEvoSparklesSet2(u8 taskId);\nstatic void EvoTask_PreEvoSparkleSet2Teardown(u8 taskId);\nstatic void EvoTask_PostEvoSparklesSet1Init(u8 taskId);\nstatic void EvoTask_CreatePostEvoSparklesSet1(u8 taskId);\nstatic void EvoTask_PostEvoSparklesSet1Teardown(u8 taskId);\nstatic void EvoTask_PostEvoSparklesSet2Init(u8 taskId);\nstatic void EvoTask_CreatePostEvoSparklesSet2(u8 taskId);\nstatic void EvoTask_PostEvoSparklesSet2Teardown(u8 taskId);\nstatic void EvoTask_PostEvoSparklesSet2TradeInit(u8 taskId);\nstatic void EvoTask_CreatePostEvoSparklesSet2Trade(u8 taskId);\nstatic void EvoTask_PrePostEvoMonSpritesInit(u8 taskId);\nstatic void EvoTask_ChooseNextEvoSpriteAnim(u8 taskId);\nstatic void EvoTask_ShrinkOrExpandEvoSprites(u8 taskId);\nstatic void PreEvoInvisible_PostEvoVisible_KillTask(u8 taskId);\nstatic void PreEvoVisible_PostEvoInvisible_KillTask(u8 taskId);\n\nstatic const u16 sEvolutionSparklesPalData[] = INCBIN_U16(\"graphics/evolution_scene/sparkle.gbapal\");\nstatic const u32 sEvolutionSparklesTileData[] = INCBIN_U32(\"graphics/evolution_scene/sparkle.4bpp.lz\");\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_EvolutionSparkles[] = {\n    { sEvolutionSparklesTileData, 0x20, 1001 },\n    {}\n};\nstatic const struct SpritePalette sSpritePalette_EvolutionSparkles[] = {\n    { sEvolutionSparklesPalData, 1001 },\n    {}\n};\n\nstatic const struct OamData sOamData_EvolutionSparkles = {\n    .y = 160,\n    .priority = 1\n};\n\nstatic const union AnimCmd sSpriteAnim_EvolutionSparkles_0[] = {\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_EvolutionSparkles[] = {\n    sSpriteAnim_EvolutionSparkles_0\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_EvolutionSparkles = {\n    .tileTag = 1001,\n    .paletteTag = 1001,\n    .oam = &sOamData_EvolutionSparkles,\n    .anims = sSpriteAnimTable_EvolutionSparkles,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy_EvoSparkles\n};\n\nstatic const u16 sEvolutionSparkleMatrixScales[12] = {\n    0x3C0,\n    0x380,\n    0x340,\n    0x300,\n    0x2C0,\n    0x280,\n    0x240,\n    0x200,\n    0x1C0,\n    0x180,\n    0x140,\n    0x100\n};\n\nstatic const s16 sUnused[][2] = {\n    {-4, 0x10},\n    {-3, 0x30},\n    {-2, 0x50},\n    {-1, 0x70},\n    { 1, 0x70},\n    { 2, 0x50},\n    { 3, 0x30},\n    { 4, 0x10}\n};\n\nstatic void SpriteCallbackDummy_EvoSparkles(struct Sprite *sprite)\n{\n\n}\n\nstatic void SetEvoSparklesMatrices(void)\n{\n    u32 i;\n    for (i = 0; i < NELEMS(sEvolutionSparkleMatrixScales); i++)\n        SetOamMatrix(i + 20, sEvolutionSparkleMatrixScales[i], 0, 0, sEvolutionSparkleMatrixScales[i]);\n}\n\nstatic void SpriteCB_PreEvoSparkleSet1(struct Sprite *sprite)\n{\n    u8 mnum;\n    if (sprite->y > 8)\n    {\n        sprite->y = 88 - sprite->data[7] * sprite->data[7] / 80;\n        sprite->y2 = Sin((u8)sprite->data[6], sprite->data[5]) / 4;\n        sprite->x2 = Cos((u8) sprite->data[6], sprite->data[5]);\n        sprite->data[6] += 4;\n        if (sprite->data[7] & 1)\n            sprite->data[5]--;\n        sprite->data[7]++;\n        if (sprite->y2 > 0)\n            sprite->subpriority = 1;\n        else\n            sprite->subpriority = 20;\n        mnum = sprite->data[5] / 4 + 20;\n        if (mnum > 31)\n            mnum = 31;\n        sprite->oam.matrixNum = mnum;\n    }\n    else\n    {\n        DestroySprite(sprite);\n    }\n}\n\nstatic void CreatePreEvoSparkleSet1(u8 a0)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_EvolutionSparkles, 120, 88, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].data[5] = 48;\n        gSprites[spriteId].data[6] = a0;\n        gSprites[spriteId].data[7] = 0;\n        gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n        gSprites[spriteId].oam.matrixNum = 31;\n        gSprites[spriteId].callback = SpriteCB_PreEvoSparkleSet1;\n    }\n}\n\nstatic void SpriteCB_PreEvoSparkleSet2(struct Sprite *sprite)\n{\n    if (sprite->y < 88)\n    {\n        sprite->y = 8 + sprite->data[7] * sprite->data[7] / 5;\n        sprite->y2 = Sin((u8)sprite->data[6], sprite->data[5]) / 4;\n        sprite->x2 = Cos((u8)sprite->data[6], sprite->data[5]);\n        sprite->data[5] = Sin((u8)(sprite->data[7] * 4), 40) + 8;\n        sprite->data[7]++;\n    }\n    else\n    {\n        DestroySprite(sprite);\n    }\n}\n\nstatic void CreatePreEvoSparkleSet2(u8 a0)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_EvolutionSparkles, 120, 8, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].data[5] = 8;\n        gSprites[spriteId].data[6] = a0;\n        gSprites[spriteId].data[7] = 0;\n        gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n        gSprites[spriteId].oam.matrixNum = 25;\n        gSprites[spriteId].subpriority = 1;\n        gSprites[spriteId].callback = SpriteCB_PreEvoSparkleSet2;\n    }\n}\n\nstatic void SpriteCB_PostEvoSparkleSet1(struct Sprite *sprite)\n{\n    if (sprite->data[5] > 8)\n    {\n        sprite->y2 = Sin((u8)sprite->data[6], sprite->data[5]);\n        sprite->x2 = Cos((u8)sprite->data[6], sprite->data[5]);\n        sprite->data[5] -= sprite->data[3];\n        sprite->data[6] += 4;\n    }\n    else\n    {\n        DestroySprite(sprite);\n    }\n}\n\nstatic void CreatePostEvoSparkleSet1(u8 a0, u8 a1)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_EvolutionSparkles, 120, 56, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].data[3] = a1;\n        gSprites[spriteId].data[5] = 120;\n        gSprites[spriteId].data[6] = a0;\n        gSprites[spriteId].data[7] = 0;\n        gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n        gSprites[spriteId].oam.matrixNum = 31;\n        gSprites[spriteId].subpriority = 1;\n        gSprites[spriteId].callback = SpriteCB_PostEvoSparkleSet1;\n    }\n}\n\nstatic void SpriteCB_PostEvoSparkleSet2(struct Sprite *sprite)\n{\n    u8 mnum;\n    if ((sprite->data[7] & 3) == 0)\n        sprite->y++;\n    if (sprite->data[6] < 128)\n    {\n        sprite->y2 = -Sin((u8)sprite->data[6], sprite->data[5]);\n        sprite->x = 120 + sprite->data[3] * sprite->data[7] / 3;\n        sprite->data[6]++;\n        mnum = 31 - sprite->data[6] * 12 / 128;\n        if (sprite->data[6] > 64)\n        {\n            sprite->subpriority = 1;\n        }\n        else\n        {\n            sprite->invisible = FALSE;\n            sprite->subpriority = 20;\n            if (sprite->data[6] > 112 && (sprite->data[6] & 1))\n                sprite->invisible = TRUE;\n        }\n        if (mnum < 20)\n            mnum = 20;\n        sprite->oam.matrixNum = mnum;\n        sprite->data[7]++;\n    }\n    else\n    {\n        DestroySprite(sprite);\n    }\n}\n\nstatic void CreatePostEvoSparkleSet2(u8 unused)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_EvolutionSparkles, 120, 56, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].data[3] = 3 - (Random() % 7);\n        gSprites[spriteId].data[5] = 48 + (Random() & 63);\n        gSprites[spriteId].data[7] = 0;\n        gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n        gSprites[spriteId].oam.matrixNum = 31;\n        gSprites[spriteId].subpriority = 20;\n        gSprites[spriteId].callback = SpriteCB_PostEvoSparkleSet2;\n    }\n}\n\nvoid LoadEvoSparkleSpriteAndPal(void)\n{\n    LoadCompressedSpriteSheetUsingHeap(sSpriteSheet_EvolutionSparkles);\n    LoadSpritePalettes(sSpritePalette_EvolutionSparkles);\n}\n\nu8 EvolutionSparkles_SpiralUpward(u16 a0)\n{\n    u8 taskId = CreateTask(EvoTask_PreEvoSparkleSet1Init, 0);\n    gTasks[taskId].data[1] = a0;\n    return taskId;\n}\n\nstatic void EvoTask_PreEvoSparkleSet1Init(u8 taskId)\n{\n    SetEvoSparklesMatrices();\n    gTasks[taskId].data[15] = 0;\n    BeginNormalPaletteFade(3 << gTasks[taskId].data[1], 10, 0, 16, RGB_WHITE);\n    gTasks[taskId].func = EvoTask_CreatePreEvoSparkleSet1;\n    PlaySE(SE_M_MEGA_KICK);\n}\n\nstatic void EvoTask_CreatePreEvoSparkleSet1(u8 taskId)\n{\n    u32 i;\n    if (gTasks[taskId].data[15] < 64)\n    {\n        if ((gTasks[taskId].data[15] & 7) == 0)\n        {\n            for (i = 0; i < 4; i++)\n                CreatePreEvoSparkleSet1(2 * (gTasks[taskId].data[15] & 0x78) + 64 * i);\n        }\n        gTasks[taskId].data[15]++;\n    }\n    else\n    {\n        gTasks[taskId].data[15] = 96;\n        gTasks[taskId].func = EvoTask_WaitForPre1SparklesToGoUp;\n    }\n}\n\nstatic void EvoTask_WaitForPre1SparklesToGoUp(u8 taskId)\n{\n    if (gTasks[taskId].data[15] != 0)\n        gTasks[taskId].data[15]--;\n    else\n        DestroyTask(taskId);\n}\n\nu8 EvolutionSparkles_ArcDown(void)\n{\n    u8 taskId = CreateTask(EvoTask_PreEvoSparkleSet2Init, 0);\n    return taskId;\n}\n\nstatic void EvoTask_PreEvoSparkleSet2Init(u8 taskId)\n{\n    SetEvoSparklesMatrices();\n    gTasks[taskId].data[15] = 0;\n    gTasks[taskId].func = EvoTask_CreatePreEvoSparklesSet2;\n    PlaySE(SE_M_BUBBLE_BEAM2);\n}\n\nstatic void EvoTask_CreatePreEvoSparklesSet2(u8 taskId)\n{\n    u32 i;\n    if (gTasks[taskId].data[15] < 96)\n    {\n        if (gTasks[taskId].data[15] < 6)\n        {\n            for (i = 0; i < 9; i++)\n                CreatePreEvoSparkleSet2(16 * i);\n        }\n        gTasks[taskId].data[15]++;\n    }\n    else\n    {\n        gTasks[taskId].func = EvoTask_PreEvoSparkleSet2Teardown;\n    }\n}\n\nstatic void EvoTask_PreEvoSparkleSet2Teardown(u8 taskId)\n{\n    DestroyTask(taskId);\n}\n\nu8 EvolutionSparkles_CircleInward(void)\n{\n    u8 taskId = CreateTask(EvoTask_PostEvoSparklesSet1Init, 0);\n    return taskId;\n}\n\nstatic void EvoTask_PostEvoSparklesSet1Init(u8 taskId)\n{\n    SetEvoSparklesMatrices();\n    gTasks[taskId].data[15] = 0;\n    gTasks[taskId].func = EvoTask_CreatePostEvoSparklesSet1;\n    PlaySE(SE_SHINY);\n}\n\nstatic void EvoTask_CreatePostEvoSparklesSet1(u8 taskId)\n{\n    u32 i;\n    if (gTasks[taskId].data[15] < 48)\n    {\n        if (gTasks[taskId].data[15] == 0)\n        {\n            for (i = 0; i < 16; i++)\n            {\n                CreatePostEvoSparkleSet1(i * 16, 4);\n            }\n        }\n        if (gTasks[taskId].data[15] == 32)\n        {\n            for (i = 0; i < 16; i++)\n            {\n                CreatePostEvoSparkleSet1(i * 16, 8);\n            }\n        }\n        gTasks[taskId].data[15]++;\n    }\n    else\n    {\n        gTasks[taskId].func = EvoTask_PostEvoSparklesSet1Teardown;\n    }\n}\n\nstatic void EvoTask_PostEvoSparklesSet1Teardown(u8 taskId)\n{\n    DestroyTask(taskId);\n}\n\nu8 EvolutionSparkles_SprayAndFlash(u16 species)\n{\n    u8 taskId = CreateTask(EvoTask_PostEvoSparklesSet2Init, 0);\n    gTasks[taskId].data[2] = species;\n    return taskId;\n}\n\nstatic void EvoTask_PostEvoSparklesSet2Init(u8 taskId)\n{\n    SetEvoSparklesMatrices();\n    gTasks[taskId].data[15] = 0;\n    IsMovingBackgroundTaskRunning();\n    CpuCopy16(&gPlttBufferFaded[BG_PLTT_ID(2)], &gPlttBufferUnfaded[BG_PLTT_ID(2)], 3 * PLTT_SIZE_4BPP);\n    BeginNormalPaletteFade(0xFFF90F1C, 0, 0, 16, RGB_WHITE);\n    gTasks[taskId].func = EvoTask_CreatePostEvoSparklesSet2;\n    PlaySE(SE_M_PETAL_DANCE);\n}\n\nstatic void EvoTask_CreatePostEvoSparklesSet2(u8 taskId)\n{\n    u32 i;\n    if (gTasks[taskId].data[15] < 128)\n    {\n        switch (gTasks[taskId].data[15])\n        {\n        default:\n            if (gTasks[taskId].data[15] < 50)\n                CreatePostEvoSparkleSet2(Random() & 7);\n            break;\n        case 0:\n            for (i = 0; i < 8; i++)\n                CreatePostEvoSparkleSet2(i);\n            break;\n        case 32:\n            BeginNormalPaletteFade(0xFFFF0F1C, 16, 16, 0, RGB_WHITE);\n            break;\n        }\n        gTasks[taskId].data[15]++;\n    }\n    else\n    {\n        gTasks[taskId].func = EvoTask_PostEvoSparklesSet2Teardown;\n    }\n}\n\nstatic void EvoTask_PostEvoSparklesSet2Teardown(u8 taskId)\n{\n    if (!gPaletteFade.active)\n        DestroyTask(taskId);\n}\n\nu8 EvolutionSparkles_SprayAndFlash_Trade(u16 species)\n{\n    u8 taskId = CreateTask(EvoTask_PostEvoSparklesSet2TradeInit, 0);\n    gTasks[taskId].data[2] = species;\n    return taskId;\n}\n\nstatic void EvoTask_PostEvoSparklesSet2TradeInit(u8 taskId)\n{\n    SetEvoSparklesMatrices();\n    gTasks[taskId].data[15] = 0;\n    IsMovingBackgroundTaskRunning();\n    CpuCopy16(&gPlttBufferFaded[BG_PLTT_ID(2)], &gPlttBufferUnfaded[BG_PLTT_ID(2)], 3 * PLTT_SIZE_4BPP);\n    BeginNormalPaletteFade(0xFFF90F00, 0, 0, 16, RGB_WHITE);\n    gTasks[taskId].func = EvoTask_CreatePostEvoSparklesSet2Trade;\n    PlaySE(SE_M_PETAL_DANCE);\n}\n\nstatic void EvoTask_CreatePostEvoSparklesSet2Trade(u8 taskId)\n{\n    u32 i;\n    if (gTasks[taskId].data[15] < 128)\n    {\n        switch (gTasks[taskId].data[15])\n        {\n        default:\n            if (gTasks[taskId].data[15] < 50)\n                CreatePostEvoSparkleSet2(Random() & 7);\n            break;\n        case 0:\n            for (i = 0; i < 8; i++)\n                CreatePostEvoSparkleSet2(i);\n            break;\n        case 32:\n            BeginNormalPaletteFade(0xFFFF0F00, 16, 16, 0, RGB_WHITE);\n            break;\n        }\n        gTasks[taskId].data[15]++;\n    }\n    else\n    {\n        gTasks[taskId].func = EvoTask_PostEvoSparklesSet2Teardown;\n    }\n}\n\nstatic void SpriteCallbackDummy_MonSprites(struct Sprite *sprite)\n{\n\n}\n\n#define tPreEvoSpriteId  data[1]\n#define tPostEvoSpriteId data[2]\n#define tPreEvoScale     data[3]\n#define tPostEvoScale    data[4]\n#define tDirection       data[5]\n#define tSpeed           data[6]\n\nu8 CycleEvolutionMonSprite(u8 preEvoSpriteId, u8 postEvoSpriteId)\n{\n    u32 i;\n    u8 taskId;\n    u16 palette[16];\n    for (i = 0; i < 16; i++)\n        palette[i] = RGB_WHITE;\n    taskId = CreateTask(EvoTask_PrePostEvoMonSpritesInit, 0);\n    gTasks[taskId].tPreEvoSpriteId = preEvoSpriteId;\n    gTasks[taskId].tPostEvoSpriteId = postEvoSpriteId;\n    gTasks[taskId].tPreEvoScale = 256;\n    gTasks[taskId].tPostEvoScale = 16;\n    SetOamMatrix(30, 0x10000 / gTasks[taskId].tPreEvoScale, 0, 0, 0x10000 / gTasks[taskId].tPreEvoScale);\n    SetOamMatrix(31, 0x10000 / gTasks[taskId].tPostEvoScale, 0, 0, 0x10000 / gTasks[taskId].tPostEvoScale);\n    gSprites[preEvoSpriteId].callback = SpriteCallbackDummy_MonSprites;\n    gSprites[preEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n    gSprites[preEvoSpriteId].oam.matrixNum = 30;\n    gSprites[preEvoSpriteId].invisible = FALSE;\n    CpuCopy16(palette, &gPlttBufferFaded[OBJ_PLTT_ID(gSprites[preEvoSpriteId].oam.paletteNum)], PLTT_SIZE_4BPP);\n    gSprites[postEvoSpriteId].callback = SpriteCallbackDummy_MonSprites;\n    gSprites[postEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n    gSprites[postEvoSpriteId].oam.matrixNum = 31;\n    gSprites[postEvoSpriteId].invisible = FALSE;\n    CpuCopy16(palette, &gPlttBufferFaded[OBJ_PLTT_ID(gSprites[postEvoSpriteId].oam.paletteNum)], PLTT_SIZE_4BPP);\n    gTasks[taskId].EvoGraphicsTaskEvoStop = FALSE;\n    return taskId;\n}\n\nstatic void EvoTask_PrePostEvoMonSpritesInit(u8 taskId)\n{\n    gTasks[taskId].tDirection = FALSE;\n    gTasks[taskId].tSpeed = 8;\n    gTasks[taskId].func = EvoTask_ChooseNextEvoSpriteAnim;\n}\n\nstatic void EvoTask_ChooseNextEvoSpriteAnim(u8 taskId)\n{\n    if (gTasks[taskId].EvoGraphicsTaskEvoStop)\n    {\n        PreEvoVisible_PostEvoInvisible_KillTask(taskId);\n    }\n    else if (gTasks[taskId].tSpeed == 128)\n    {\n        PreEvoInvisible_PostEvoVisible_KillTask(taskId);\n    }\n    else\n    {\n        gTasks[taskId].tSpeed += 2;\n        gTasks[taskId].tDirection ^= TRUE;\n        gTasks[taskId].func = EvoTask_ShrinkOrExpandEvoSprites;\n    }\n}\n\nstatic void EvoTask_ShrinkOrExpandEvoSprites(u8 taskId)\n{\n    u8 r6;\n    if (gTasks[taskId].EvoGraphicsTaskEvoStop)\n    {\n        gTasks[taskId].func = PreEvoVisible_PostEvoInvisible_KillTask;\n    }\n    else\n    {\n        r6 = 0;\n        if (!gTasks[taskId].tDirection)\n        {\n            if (gTasks[taskId].tPreEvoScale < 0x100 - gTasks[taskId].tSpeed)\n            {\n                gTasks[taskId].tPreEvoScale += gTasks[taskId].tSpeed;\n            }\n            else\n            {\n                gTasks[taskId].tPreEvoScale = 0x100;\n                r6 = 1;\n            }\n            if (gTasks[taskId].tPostEvoScale > 0x10 + gTasks[taskId].tSpeed)\n            {\n                gTasks[taskId].tPostEvoScale -= gTasks[taskId].tSpeed;\n            }\n            else\n            {\n                gTasks[taskId].tPostEvoScale = 0x10;\n                r6++;\n            }\n        }\n        else\n        {\n            if (gTasks[taskId].tPostEvoScale < 0x100 - gTasks[taskId].tSpeed)\n            {\n                gTasks[taskId].tPostEvoScale += gTasks[taskId].tSpeed;\n            }\n            else\n            {\n                gTasks[taskId].tPostEvoScale = 0x100;\n                r6 = 1;\n            }\n            if (gTasks[taskId].tPreEvoScale > 0x10 + gTasks[taskId].tSpeed)\n            {\n                gTasks[taskId].tPreEvoScale -= gTasks[taskId].tSpeed;\n            }\n            else\n            {\n                gTasks[taskId].tPreEvoScale = 0x10;\n                r6++;\n            }\n        }\n        SetOamMatrix(30, 0x10000 / gTasks[taskId].tPreEvoScale, 0, 0, 0x10000 / gTasks[taskId].tPreEvoScale);\n        SetOamMatrix(31, 0x10000 / gTasks[taskId].tPostEvoScale, 0, 0, 0x10000 / gTasks[taskId].tPostEvoScale);\n        if (r6 == 2)\n        {\n            gTasks[taskId].func = EvoTask_ChooseNextEvoSpriteAnim;\n        }\n    }\n}\n\nstatic void PreEvoInvisible_PostEvoVisible_KillTask(u8 taskId)\n{\n    gSprites[gTasks[taskId].tPreEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF;\n    gSprites[gTasks[taskId].tPreEvoSpriteId].oam.matrixNum = 0;\n    gSprites[gTasks[taskId].tPreEvoSpriteId].invisible = TRUE;\n    gSprites[gTasks[taskId].tPostEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF;\n    gSprites[gTasks[taskId].tPostEvoSpriteId].oam.matrixNum = 0;\n    gSprites[gTasks[taskId].tPostEvoSpriteId].invisible = FALSE;\n    DestroyTask(taskId);\n}\n\nstatic void PreEvoVisible_PostEvoInvisible_KillTask(u8 taskId)\n{\n    gSprites[gTasks[taskId].tPreEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF;\n    gSprites[gTasks[taskId].tPreEvoSpriteId].oam.matrixNum = 0;\n    gSprites[gTasks[taskId].tPreEvoSpriteId].invisible = FALSE;\n    gSprites[gTasks[taskId].tPostEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF;\n    gSprites[gTasks[taskId].tPostEvoSpriteId].oam.matrixNum = 0;\n    gSprites[gTasks[taskId].tPostEvoSpriteId].invisible = TRUE;\n    DestroyTask(taskId);\n}\n\n#undef tPreEvoSpriteId\n#undef tPostEvoSpriteId\n#undef tPreEvoScale\n#undef tPostEvoScale\n#undef tDirection\n#undef tSpeed\n"
  },
  {
    "path": "src/evolution_scene.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_message.h\"\n#include \"data.h\"\n#include \"decompress.h\"\n#include \"help_system.h\"\n#include \"evolution_scene.h\"\n#include \"evolution_graphics.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"m4a.h\"\n#include \"event_data.h\"\n#include \"trade_scene.h\"\n#include \"new_menu_helpers.h\"\n#include \"menu.h\"\n#include \"overworld.h\"\n#include \"pokedex.h\"\n#include \"pokemon_summary_screen.h\"\n#include \"scanline_effect.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"text_window.h\"\n#include \"trig.h\"\n#include \"constants/moves.h\"\n#include \"constants/songs.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/items.h\"\n\nextern struct Evolution gEvolutionTable[][EVOS_PER_MON];\n\nstruct EvoInfo\n{\n    u8 preEvoSpriteId;\n    u8 postEvoSpriteId;\n    u8 evoTaskId;\n    u8 delayTimer;\n    u16 savedPalette[48];\n};\n\n// EWRAM vars\nstatic EWRAM_DATA struct EvoInfo *sEvoStructPtr = NULL;\nstatic EWRAM_DATA u16 *sBgAnimPal = NULL;\n\n// IWRAM common\nvoid (*gCB2_AfterEvolution)(void);\n\n#define sEvoCursorPos           gBattleCommunication[1] // when learning a new move\n#define sEvoGraphicsTaskId      gBattleCommunication[2]\n\n// this file's functions\nstatic void Task_EvolutionScene(u8 taskId);\nstatic void Task_TradeEvolutionScene(u8 taskId);\nstatic void CB2_EvolutionSceneUpdate(void);\nstatic void CB2_TradeEvolutionSceneUpdate(void);\nstatic void EvoDummyFunc(void);\nstatic void VBlankCB_EvolutionScene(void);\nstatic void VBlankCB_TradeEvolutionScene(void);\nstatic void StartBgAnimation(bool8 isLink);\nstatic void StopBgAnimation(void);\nstatic void Task_AnimateBg(u8 taskId);\nstatic void RestoreBgAfterAnim(void);\n\n// const data\nstatic const u16 sUnusedPal[] = INCBIN_U16(\"graphics/evolution_scene/unused.gbapal\");\nstatic const u32 sMovingBackgroundTiles[] = INCBIN_U32(\"graphics/evolution_scene/bg.4bpp.lz\");\nstatic const u32 sMovingBackgroundMap1[] = INCBIN_U32(\"graphics/evolution_scene/bg.bin.lz\");\nstatic const u32 sMovingBackgroundMap2[] = INCBIN_U32(\"graphics/evolution_scene/bg2.bin.lz\");\nstatic const u16 sBlackPalette[] = INCBIN_U16(\"graphics/evolution_scene/gray_transition_intro.gbapal\");\nstatic const u16 sUnusedTilemap[] = INCBIN_U16(\"graphics/evolution_scene/unused_tilemap.bin\");\nstatic const u16 sBgAnim_Pal[] = INCBIN_U16(\"graphics/evolution_scene/transition.gbapal\");\n\nstatic const u8 sText_ShedinjaJapaneseName[] = _(\"ヌケニン\");\n\nstatic const u8 sText_UnusedColors[] = _(\"{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}\");\n\nstatic const u8 sText_UnusedArrows[][10] = {\n    _(\"▶\\n \"),\n    _(\" \\n▶\"),\n    _(\" \\n \")\n};\n\n// The below table is used by Task_UpdateBgPalette to control the speed at which the bg color updates.\n// The first two values are indexes into sBgAnim_PalIndexes (indirectly, via sBgAnimPal), and are\n// the start and end of the range of colors in sBgAnim_PalIndexes it will move through incrementally\n// before starting over. It will repeat this cycle x number of times, where x = the 3rd value,\n// delaying each increment by y, where y = the 4th value.\n// Once it has cycled x number of times, it will move to the next array in this table.\nstatic const u8 sBgAnim_PaletteControl[][4] =\n{\n    {  0, 12, 1, 6 },\n    { 13, 36, 5, 2 },\n    { 13, 24, 1, 2 },\n    { 37, 49, 1, 6 },\n};\n\n// Indexes into sBgAnim_Pal, 0 is black, transitioning to a bright light blue (172, 213, 255) at 13\nstatic const u8 sBgAnim_PalIndexes[][16] = {\n    {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0 },\n    {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,  0 },\n    {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  0,  0 },\n    {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  0,  0 },\n    {  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  0,  0 },\n    {  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  0,  0 },\n    {  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  0,  0 },\n    {  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  0,  0 },\n    {  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  0,  0 },\n    {  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10,  0,  0 },\n    {  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  0, 11,  0,  0 },\n    {  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  0,  0 },\n    {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,  0,  0 },\n    {  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 12,  0,  0 },\n    {  0,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 12, 11,  0,  0 },\n    {  0,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 12, 11, 10,  0,  0 },\n    {  0,  5,  6,  7,  8,  9, 10, 11, 12, 13, 12, 11, 10,  9,  0,  0 },\n    {  0,  6,  7,  8,  9, 10, 11, 12, 13, 12, 11, 10,  9,  8,  0,  0 },\n    {  0,  7,  8,  9, 10, 11, 12, 13, 12, 11, 10,  9,  8,  7,  0,  0 },\n    {  0,  8,  9, 10, 11, 12, 13, 12, 11, 10,  9,  8,  7,  6,  0,  0 },\n    {  0,  9, 10, 11, 12, 13, 12, 11, 10,  9,  8,  7,  6,  5,  0,  0 },\n    {  0, 10, 11, 12, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  0,  0 },\n    {  0, 11, 12, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  0,  0 },\n    {  0, 12, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  0,  0 },\n    {  0, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0,  0 },\n    {  0, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  2,  0,  0 },\n    {  0, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  2,  3,  0,  0 },\n    {  0, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  2,  3,  4,  0,  0 },\n    {  0,  9,  8,  7,  6,  5,  4,  3,  2,  1,  2,  3,  4,  5,  0,  0 },\n    {  0,  8,  7,  6,  5,  4,  3,  2,  1,  2,  3,  4,  5,  6,  0,  0 },\n    {  0,  7,  6,  5,  4,  3,  2,  1,  2,  3,  4,  5,  6,  7,  0,  0 },\n    {  0,  6,  5,  4,  3,  2,  1,  2,  3,  4,  5,  6,  7,  8,  0,  0 },\n    {  0,  5,  4,  3,  2,  1,  2,  3,  4,  5,  6,  7,  8,  9,  0,  0 },\n    {  0,  4,  3,  2,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10,  0,  0 },\n    {  0,  3,  2,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,  0,  0 },\n    {  0,  2,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  0,  0 },\n    {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,  0,  0 },\n    {  0, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0,  0,  0 },\n    {  0, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0,  0,  0,  0 },\n    {  0, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0,  0,  0,  0,  0 },\n    {  0,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0,  0,  0,  0,  0,  0 },\n    {  0,  8,  7,  6,  5,  4,  3,  2,  1,  0,  0,  0,  0,  0,  0,  0 },\n    {  0,  7,  6,  5,  4,  3,  2,  1,  0,  0,  0,  0,  0,  0,  0,  0 },\n    {  0,  6,  5,  4,  3,  2,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0 },\n    {  0,  5,  4,  3,  2,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },\n    {  0,  4,  3,  2,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },\n    {  0,  3,  2,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },\n    {  0,  2,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },\n    {  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },\n    {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }\n};\n\nstatic void CB2_BeginEvolutionScene(void)\n{\n    UpdatePaletteFade();\n    RunTasks();\n}\n\n#define tState              data[0]\n#define tPreEvoSpecies      data[1]\n#define tPostEvoSpecies     data[2]\n#define tCanStop            data[3]\n#define tBits               data[3]\n#define tLearnsFirstMove    data[4]\n#define tLearnMoveState     data[6]\n#define tLearnMoveYesState  data[7]\n#define tLearnMoveNoState   data[8]\n#define tEvoWasStopped      data[9]\n#define tPartyId            data[10]\n\n#define TASK_BIT_CAN_STOP       (1 << 0)\n#define TASK_BIT_LEARN_MOVE     (1 << 7)\n\nstatic void Task_BeginEvolutionScene(u8 taskId)\n{\n    struct Pokemon* mon = NULL;\n    switch (gTasks[taskId].tState)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n        gTasks[taskId].tState++;\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n        {\n            u16 postEvoSpecies;\n            bool8 canStopEvo;\n            u8 partyId;\n\n            mon = &gPlayerParty[gTasks[taskId].tPartyId];\n            postEvoSpecies = gTasks[taskId].tPostEvoSpecies;\n            canStopEvo = gTasks[taskId].tCanStop;\n            partyId = gTasks[taskId].tPartyId;\n\n            DestroyTask(taskId);\n            EvolutionScene(mon, postEvoSpecies, canStopEvo, partyId);\n        }\n        break;\n    }\n}\n\nvoid BeginEvolutionScene(struct Pokemon* mon, u16 postEvoSpecies, bool8 canStopEvo, u8 partyId)\n{\n    u8 taskId = CreateTask(Task_BeginEvolutionScene, 0);\n    gTasks[taskId].tState = 0;\n    gTasks[taskId].tPostEvoSpecies = postEvoSpecies;\n    gTasks[taskId].tCanStop = canStopEvo;\n    gTasks[taskId].tPartyId = partyId;\n    SetMainCallback2(CB2_BeginEvolutionScene);\n}\n\nvoid EvolutionScene(struct Pokemon* mon, u16 postEvoSpecies, bool8 canStopEvo, u8 partyId)\n{\n    u8 name[20];\n    u16 currSpecies;\n    u32 trainerId, personality;\n    const struct CompressedSpritePalette* pokePal;\n    u8 id;\n\n    SetHBlankCallback(NULL);\n    SetVBlankCallback(NULL);\n    CpuFill32(0, (void *)(VRAM), VRAM_SIZE);\n\n    SetGpuReg(REG_OFFSET_MOSAIC, 0);\n    SetGpuReg(REG_OFFSET_WIN0H, 0);\n    SetGpuReg(REG_OFFSET_WIN0V, 0);\n    SetGpuReg(REG_OFFSET_WIN1H, 0);\n    SetGpuReg(REG_OFFSET_WIN1V, 0);\n    SetGpuReg(REG_OFFSET_WININ, 0);\n    SetGpuReg(REG_OFFSET_WINOUT, 0);\n\n    ResetPaletteFade();\n\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    gBattle_BG2_X = 0;\n    gBattle_BG2_Y = 0;\n    gBattle_BG3_X = 256;\n    gBattle_BG3_Y = 0;\n\n    gBattleTerrain = BATTLE_TERRAIN_PLAIN;\n\n    InitBattleBgsVideo();\n    LoadBattleTextboxAndBackground();\n    ResetSpriteData();\n    ScanlineEffect_Stop();\n    ResetTasks();\n    FreeAllSpritePalettes();\n\n    gReservedSpritePaletteCount = 4;\n\n    sEvoStructPtr = AllocZeroed(sizeof(struct EvoInfo));\n    AllocateMonSpritesGfx();\n\n    GetMonData(mon, MON_DATA_NICKNAME, name);\n    StringCopy_Nickname(gStringVar1, name);\n    StringCopy(gStringVar2, gSpeciesNames[postEvoSpecies]);\n\n    // preEvo sprite\n    currSpecies = GetMonData(mon, MON_DATA_SPECIES);\n    trainerId = GetMonData(mon, MON_DATA_OT_ID);\n    personality = GetMonData(mon, MON_DATA_PERSONALITY);\n    DecompressPicFromTable(&gMonFrontPicTable[currSpecies],\n                             gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_LEFT],\n                             currSpecies);\n    pokePal = GetMonSpritePalStructFromOtIdPersonality(currSpecies, trainerId, personality);\n    LoadCompressedPalette(pokePal->data, OBJ_PLTT_ID(1), PLTT_SIZE_4BPP);\n\n    SetMultiuseSpriteTemplateToPokemon(currSpecies, B_POSITION_OPPONENT_LEFT);\n    gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable;\n    sEvoStructPtr->preEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30);\n\n    gSprites[id].callback = SpriteCallbackDummy_2;\n    gSprites[id].oam.paletteNum = 1;\n    gSprites[id].invisible = TRUE;\n\n    // postEvo sprite\n    DecompressPicFromTable(&gMonFrontPicTable[postEvoSpecies],\n                             gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_RIGHT],\n                             postEvoSpecies);\n    pokePal = GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, trainerId, personality);\n    LoadCompressedPalette(pokePal->data, OBJ_PLTT_ID(2), PLTT_SIZE_4BPP);\n\n    SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, B_POSITION_OPPONENT_RIGHT);\n    gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable;\n    sEvoStructPtr->postEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30);\n    gSprites[id].callback = SpriteCallbackDummy_2;\n    gSprites[id].oam.paletteNum = 2;\n    gSprites[id].invisible = TRUE;\n\n    LoadEvoSparkleSpriteAndPal();\n\n    sEvoStructPtr->evoTaskId = id = CreateTask(Task_EvolutionScene, 0);\n    gTasks[id].tState = 0;\n    gTasks[id].tPreEvoSpecies = currSpecies;\n    gTasks[id].tPostEvoSpecies = postEvoSpecies;\n    gTasks[id].tCanStop = canStopEvo;\n    gTasks[id].tLearnsFirstMove = TRUE;\n    gTasks[id].tEvoWasStopped = FALSE;\n    gTasks[id].tPartyId = partyId;\n\n    memcpy(&sEvoStructPtr->savedPalette, &gPlttBufferUnfaded[BG_PLTT_ID(2)], sizeof(sEvoStructPtr->savedPalette));\n\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP);\n\n    SetHBlankCallback(EvoDummyFunc);\n    SetVBlankCallback(VBlankCB_EvolutionScene);\n    m4aMPlayAllStop();\n    HelpSystem_Disable();\n    SetMainCallback2(CB2_EvolutionSceneUpdate);\n}\n\nstatic void CB2_EvolutionSceneLoadGraphics(void)\n{\n    u8 id;\n    const struct CompressedSpritePalette* pokePal;\n    u16 postEvoSpecies;\n    u32 trainerId, personality;\n    struct Pokemon* mon = &gPlayerParty[gTasks[sEvoStructPtr->evoTaskId].tPartyId];\n\n    postEvoSpecies = gTasks[sEvoStructPtr->evoTaskId].tPostEvoSpecies;\n    trainerId = GetMonData(mon, MON_DATA_OT_ID);\n    personality = GetMonData(mon, MON_DATA_PERSONALITY);\n\n    SetHBlankCallback(NULL);\n    SetVBlankCallback(NULL);\n    CpuFill32(0, (void *)(VRAM), VRAM_SIZE);\n\n    SetGpuReg(REG_OFFSET_MOSAIC, 0);\n    SetGpuReg(REG_OFFSET_WIN0H, 0);\n    SetGpuReg(REG_OFFSET_WIN0V, 0);\n    SetGpuReg(REG_OFFSET_WIN1H, 0);\n    SetGpuReg(REG_OFFSET_WIN1V, 0);\n    SetGpuReg(REG_OFFSET_WININ, 0);\n    SetGpuReg(REG_OFFSET_WINOUT, 0);\n\n    ResetPaletteFade();\n\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    gBattle_BG2_X = 0;\n    gBattle_BG2_Y = 0;\n    gBattle_BG3_X = 256;\n    gBattle_BG3_Y = 0;\n\n    gBattleTerrain = BATTLE_TERRAIN_PLAIN;\n\n    InitBattleBgsVideo();\n    LoadBattleTextboxAndBackground();\n    ResetSpriteData();\n    FreeAllSpritePalettes();\n    gReservedSpritePaletteCount = 4;\n\n    DecompressPicFromTable(&gMonFrontPicTable[postEvoSpecies],\n                             gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_RIGHT],\n                             postEvoSpecies);\n    pokePal = GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, trainerId, personality);\n\n    LoadCompressedPalette(pokePal->data, OBJ_PLTT_ID(2), PLTT_SIZE_4BPP);\n\n    SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, B_POSITION_OPPONENT_RIGHT);\n    gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable;\n    sEvoStructPtr->postEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30);\n\n    gSprites[id].callback = SpriteCallbackDummy_2;\n    gSprites[id].oam.paletteNum = 2;\n\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP);\n\n    SetHBlankCallback(EvoDummyFunc);\n    SetVBlankCallback(VBlankCB_EvolutionScene);\n    SetMainCallback2(CB2_EvolutionSceneUpdate);\n\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);\n\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n    ShowBg(3);\n}\n\nstatic void CB2_TradeEvolutionSceneLoadGraphics(void)\n{\n    struct Pokemon* mon = &gPlayerParty[gTasks[sEvoStructPtr->evoTaskId].tPartyId];\n    u16 postEvoSpecies = gTasks[sEvoStructPtr->evoTaskId].tPostEvoSpecies;\n\n    switch (gMain.state)\n    {\n    case 0:\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        SetHBlankCallback(NULL);\n        SetVBlankCallback(NULL);\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        gReservedSpritePaletteCount = 4;\n        gBattle_BG0_X = 0;\n        gBattle_BG0_Y = 0;\n        gBattle_BG1_X = 0;\n        gBattle_BG1_Y = 0;\n        gBattle_BG2_X = 0;\n        gBattle_BG2_Y = 0;\n        gBattle_BG3_X = 256;\n        gBattle_BG3_Y = 0;\n        gMain.state++;\n        break;\n    case 1:\n        ResetPaletteFade();\n        SetHBlankCallback(EvoDummyFunc);\n        SetVBlankCallback(VBlankCB_TradeEvolutionScene);\n        gMain.state++;\n        break;\n    case 2:\n        LoadTradeAnimGfx();\n        gMain.state++;\n        break;\n    case 3:\n        FillBgTilemapBufferRect(1, 0, 0, 0, 0x20, 0x20, 17);\n        CopyBgTilemapBufferToVram(1);\n        gMain.state++;\n        break;\n    case 4:\n        {\n            const struct CompressedSpritePalette* pokePal;\n            u32 trainerId = GetMonData(mon, MON_DATA_OT_ID);\n            u32 personality = GetMonData(mon, MON_DATA_PERSONALITY);\n            DecompressPicFromTable(&gMonFrontPicTable[postEvoSpecies],\n                                     gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_RIGHT],\n                                     postEvoSpecies);\n            pokePal = GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, trainerId, personality);\n            LoadCompressedPalette(pokePal->data, OBJ_PLTT_ID(2), PLTT_SIZE_4BPP);\n            gMain.state++;\n        }\n        break;\n    case 5:\n        {\n            u8 id;\n\n            SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, B_POSITION_OPPONENT_LEFT);\n            gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable;\n            sEvoStructPtr->postEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30);\n\n            gSprites[id].callback = SpriteCallbackDummy_2;\n            gSprites[id].oam.paletteNum = 2;\n            gMain.state++;\n            LinkTradeDrawWindow();\n        }\n        break;\n    case 6:\n        if (gWirelessCommType)\n        {\n            LoadWirelessStatusIndicatorSpriteGfx();\n            CreateWirelessStatusIndicatorSprite(0, 0);\n        }\n        BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK);\n        gMain.state++;\n        break;\n    case 7:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);\n        InitTradeSequenceBgGpuRegs();\n        ShowBg(0);\n        ShowBg(1);\n        SetMainCallback2(CB2_TradeEvolutionSceneUpdate);\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP);\n        break;\n    }\n}\n\nvoid TradeEvolutionScene(struct Pokemon* mon, u16 postEvoSpecies, u8 preEvoSpriteId, u8 partyId)\n{\n    u8 name[20];\n    u16 currSpecies;\n    u32 trainerId, personality;\n    const struct CompressedSpritePalette* pokePal;\n    u8 id;\n\n    GetMonData(mon, MON_DATA_NICKNAME, name);\n    StringCopy_Nickname(gStringVar1, name);\n    StringCopy(gStringVar2, gSpeciesNames[postEvoSpecies]);\n\n    gAffineAnimsDisabled = TRUE;\n\n    // preEvo sprite\n    currSpecies = GetMonData(mon, MON_DATA_SPECIES);\n    personality = GetMonData(mon, MON_DATA_PERSONALITY);\n    trainerId = GetMonData(mon, MON_DATA_OT_ID);\n\n    sEvoStructPtr = AllocZeroed(sizeof(struct EvoInfo));\n    sEvoStructPtr->preEvoSpriteId = preEvoSpriteId;\n\n    DecompressPicFromTable(&gMonFrontPicTable[postEvoSpecies],\n                            gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_LEFT],\n                            postEvoSpecies);\n\n    pokePal = GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, trainerId, personality);\n    LoadCompressedPalette(pokePal->data, OBJ_PLTT_ID(2), PLTT_SIZE_4BPP);\n\n    SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, B_POSITION_OPPONENT_LEFT);\n    gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable;\n    sEvoStructPtr->postEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30);\n\n    gSprites[id].callback = SpriteCallbackDummy_2;\n    gSprites[id].oam.paletteNum = 2;\n    gSprites[id].invisible = TRUE;\n\n    LoadEvoSparkleSpriteAndPal();\n\n    sEvoStructPtr->evoTaskId = id = CreateTask(Task_TradeEvolutionScene, 0);\n    gTasks[id].tState = 0;\n    gTasks[id].tPreEvoSpecies = currSpecies;\n    gTasks[id].tPostEvoSpecies = postEvoSpecies;\n    gTasks[id].tLearnsFirstMove = TRUE;\n    gTasks[id].tEvoWasStopped = FALSE;\n    gTasks[id].tPartyId = partyId;\n\n    gBattle_BG0_X = 0;\n    gBattle_BG0_Y = 0;\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    gBattle_BG2_X = 0;\n    gBattle_BG2_Y = 0;\n    gBattle_BG3_X = 256;\n    gBattle_BG3_Y = 0;\n\n    gTextFlags.useAlternateDownArrow = TRUE;\n\n    SetVBlankCallback(VBlankCB_TradeEvolutionScene);\n    SetMainCallback2(CB2_TradeEvolutionSceneUpdate);\n}\n\nstatic void CB2_EvolutionSceneUpdate(void)\n{\n    AnimateSprites();\n    BuildOamBuffer();\n    RunTextPrinters();\n    UpdatePaletteFade();\n    RunTasks();\n}\n\nstatic void CB2_TradeEvolutionSceneUpdate(void)\n{\n    AnimateSprites();\n    BuildOamBuffer();\n    RunTextPrinters();\n    UpdatePaletteFade();\n    RunTasks();\n}\n\nstatic void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)\n{\n    u32 data = 0;\n    if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE)\n    {\n        s32 i;\n        struct Pokemon* shedinja = &gPlayerParty[gPlayerPartyCount];\n\n        CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon));\n        SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, &gEvolutionTable[preEvoSpecies][1].targetSpecies);\n        SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]);\n        SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, &data);\n        SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, &data);\n        SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_ENCRYPT_SEPARATOR, &data);\n\n        for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + CONTEST_CATEGORIES_COUNT; i++)\n            SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data);\n        for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_UNUSED_RIBBONS; i++)\n            SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data);\n\n        SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_STATUS, &data);\n        data = MAIL_NONE;\n        SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MAIL, &data);\n\n        CalculateMonStats(&gPlayerParty[gPlayerPartyCount], FALSE);\n        CalculatePlayerPartyCount();\n\n        GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), FLAG_SET_SEEN);\n        GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), FLAG_SET_CAUGHT);\n\n        if (GetMonData(shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA\n            && GetMonData(shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE\n            && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NINJASK)\n                SetMonData(shedinja, MON_DATA_NICKNAME, sText_ShedinjaJapaneseName);\n    }\n}\n\n// States for the main switch in Task_EvolutionScene\nenum {\n    EVOSTATE_FADE_IN,\n    EVOSTATE_INTRO_MSG,\n    EVOSTATE_INTRO_MON_ANIM,\n    EVOSTATE_INTRO_SOUND,\n    EVOSTATE_START_MUSIC,\n    EVOSTATE_START_BG_AND_SPARKLE_SPIRAL,\n    EVOSTATE_SPARKLE_ARC,\n    EVOSTATE_CYCLE_MON_SPRITE,\n    EVOSTATE_WAIT_CYCLE_MON_SPRITE,\n    EVOSTATE_SPARKLE_CIRCLE,\n    EVOSTATE_SPARKLE_SPRAY,\n    EVOSTATE_EVO_SOUND,\n    EVOSTATE_RESTORE_SCREEN,\n    EVOSTATE_EVO_MON_ANIM,\n    EVOSTATE_SET_MON_EVOLVED,\n    EVOSTATE_TRY_LEARN_MOVE,\n    EVOSTATE_END,\n    EVOSTATE_CANCEL,\n    EVOSTATE_CANCEL_MON_ANIM,\n    EVOSTATE_CANCEL_MSG,\n    EVOSTATE_LEARNED_MOVE,\n    EVOSTATE_TRY_LEARN_ANOTHER_MOVE,\n    EVOSTATE_REPLACE_MOVE,\n};\n\n// States for the switch in EVOSTATE_REPLACE_MOVE\nenum {\n    MVSTATE_INTRO_MSG_1,\n    MVSTATE_INTRO_MSG_2,\n    MVSTATE_INTRO_MSG_3,\n    MVSTATE_PRINT_YES_NO,\n    MVSTATE_HANDLE_YES_NO,\n    MVSTATE_SHOW_MOVE_SELECT,\n    MVSTATE_HANDLE_MOVE_SELECT,\n    MVSTATE_FORGET_MSG_1,\n    MVSTATE_FORGET_MSG_2,\n    MVSTATE_LEARNED_MOVE,\n    MVSTATE_ASK_CANCEL,\n    MVSTATE_CANCEL,\n    MVSTATE_RETRY_AFTER_HM,\n};\n\n// Task data from CycleEvolutionMonSprite\n#define tEvoStopped data[8]\n\nstatic void Task_EvolutionScene(u8 taskId)\n{\n    u32 var;\n    struct Pokemon* mon = &gPlayerParty[gTasks[taskId].tPartyId];\n\n    // Automatically cancel if the Pokemon would evolve into a species you have not\n    // yet unlocked, such as Crobat.\n    if (!IsNationalPokedexEnabled()\n        && gTasks[taskId].tState == EVOSTATE_WAIT_CYCLE_MON_SPRITE\n        && gTasks[taskId].tPostEvoSpecies > SPECIES_DEOXYS)\n    {\n        gTasks[taskId].tState = EVOSTATE_CANCEL;\n        gTasks[taskId].tEvoWasStopped = TRUE;\n        gTasks[sEvoGraphicsTaskId].tEvoStopped = TRUE;\n        StopBgAnimation();\n        return;\n    }\n\n    // check if B Button was held, so the evolution gets stopped\n    if (gMain.heldKeys == B_BUTTON\n        && gTasks[taskId].tState == EVOSTATE_WAIT_CYCLE_MON_SPRITE\n        && gTasks[sEvoGraphicsTaskId].isActive\n        && gTasks[taskId].tBits & TASK_BIT_CAN_STOP)\n    {\n        gTasks[taskId].tState = EVOSTATE_CANCEL;\n        gTasks[sEvoGraphicsTaskId].tEvoStopped = TRUE;\n        StopBgAnimation();\n        return;\n    }\n\n    switch (gTasks[taskId].tState)\n    {\n    case EVOSTATE_FADE_IN:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);\n        gSprites[sEvoStructPtr->preEvoSpriteId].invisible = FALSE;\n        gTasks[taskId].tState++;\n        ShowBg(0);\n        ShowBg(1);\n        ShowBg(2);\n        ShowBg(3);\n        break;\n    case EVOSTATE_INTRO_MSG:\n        if (!gPaletteFade.active)\n        {\n            StringExpandPlaceholders(gStringVar4, gText_PkmnIsEvolving);\n            BattlePutTextOnWindow(gStringVar4, B_WIN_MSG);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_INTRO_MON_ANIM:\n        if (!IsTextPrinterActive(0))\n        {\n            PlayCry_Normal(gTasks[taskId].tPreEvoSpecies, 0);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_INTRO_SOUND:\n        if (IsCryFinished()) // wait for animation, play tu du SE\n        {\n            PlaySE(MUS_EVOLUTION_INTRO);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_START_MUSIC:\n        if (!IsSEPlaying())\n        {\n            // Start music, fade background to black\n            PlayNewMapMusic(MUS_EVOLUTION);\n            gTasks[taskId].tState++;\n            BeginNormalPaletteFade(0x1C, 4, 0, 0x10, RGB_BLACK);\n        }\n        break;\n    case EVOSTATE_START_BG_AND_SPARKLE_SPIRAL:\n        if (!gPaletteFade.active)\n        {\n            StartBgAnimation(FALSE);\n            sEvoGraphicsTaskId = EvolutionSparkles_SpiralUpward(17);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_SPARKLE_ARC:\n        if (!gTasks[sEvoGraphicsTaskId].isActive)\n        {\n            gTasks[taskId].tState++;\n            sEvoStructPtr->delayTimer = 1;\n            sEvoGraphicsTaskId = EvolutionSparkles_ArcDown();\n        }\n        break;\n    case EVOSTATE_CYCLE_MON_SPRITE:\n        if (!gTasks[sEvoGraphicsTaskId].isActive)\n        {\n            sEvoGraphicsTaskId = CycleEvolutionMonSprite(sEvoStructPtr->preEvoSpriteId, sEvoStructPtr->postEvoSpriteId);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_WAIT_CYCLE_MON_SPRITE:\n        if (--sEvoStructPtr->delayTimer == 0)\n        {\n            sEvoStructPtr->delayTimer = 3;\n            if (!gTasks[sEvoGraphicsTaskId].isActive)\n                gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_SPARKLE_CIRCLE:\n        sEvoGraphicsTaskId = EvolutionSparkles_CircleInward();\n        gTasks[taskId].tState++;\n        break;\n    case EVOSTATE_SPARKLE_SPRAY:\n        if (!gTasks[sEvoGraphicsTaskId].isActive)\n        {\n            sEvoGraphicsTaskId = EvolutionSparkles_SprayAndFlash(gTasks[taskId].tPostEvoSpecies);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_EVO_SOUND:\n        if (!gTasks[sEvoGraphicsTaskId].isActive)\n        {\n            PlaySE(SE_EXP);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_RESTORE_SCREEN:\n        if (IsSEPlaying())\n        {\n            m4aMPlayAllStop();\n            memcpy(&gPlttBufferUnfaded[BG_PLTT_ID(2)], sEvoStructPtr->savedPalette, sizeof(sEvoStructPtr->savedPalette));\n            RestoreBgAfterAnim();\n            BeginNormalPaletteFade(0x1C, 0, 0x10, 0, RGB_BLACK);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_EVO_MON_ANIM:\n        if (!gPaletteFade.active)\n        {\n            PlayCry_Normal(gTasks[taskId].tPostEvoSpecies, 0);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_SET_MON_EVOLVED:\n        if (IsCryFinished())\n        {\n            StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved);\n            BattlePutTextOnWindow(gStringVar4, B_WIN_MSG);\n            PlayBGM(MUS_EVOLVED);\n            gTasks[taskId].tState++;\n            SetMonData(mon, MON_DATA_SPECIES, (void *)(&gTasks[taskId].tPostEvoSpecies));\n            CalculateMonStats(mon, FALSE);\n            EvolutionRenameMon(mon, gTasks[taskId].tPreEvoSpecies, gTasks[taskId].tPostEvoSpecies);\n            GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_SEEN);\n            GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_CAUGHT);\n            IncrementGameStat(GAME_STAT_EVOLVED_POKEMON);\n        }\n        break;\n    case EVOSTATE_TRY_LEARN_MOVE:\n        if (!IsTextPrinterActive(0))\n        {\n            HelpSystem_Enable();\n            var = MonTryLearningNewMove(mon, gTasks[taskId].tLearnsFirstMove);\n            if (var != MOVE_NONE && !gTasks[taskId].tEvoWasStopped)\n            {\n                u8 text[20];\n\n                StopMapMusic();\n                Overworld_PlaySpecialMapMusic();\n                gTasks[taskId].tBits |= TASK_BIT_LEARN_MOVE;\n                gTasks[taskId].tLearnsFirstMove = FALSE;\n                gTasks[taskId].tLearnMoveState = MVSTATE_INTRO_MSG_1;\n                GetMonData(mon, MON_DATA_NICKNAME, text);\n                StringCopy_Nickname(gBattleTextBuff1, text);\n\n                if (var == MON_HAS_MAX_MOVES)\n                    gTasks[taskId].tState = EVOSTATE_REPLACE_MOVE;\n                else if (var == MON_ALREADY_KNOWS_MOVE)\n                    break;\n                else\n                    gTasks[taskId].tState = EVOSTATE_LEARNED_MOVE;\n            }\n            else // no move to learn, or evolution was canceled\n            {\n                BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n                gTasks[taskId].tState++;\n            }\n        }\n        break;\n    case EVOSTATE_END:\n        if (!gPaletteFade.active)\n        {\n            if (!(gTasks[taskId].tBits & TASK_BIT_LEARN_MOVE))\n            {\n                StopMapMusic();\n                Overworld_PlaySpecialMapMusic();\n            }\n            if (!gTasks[taskId].tEvoWasStopped)\n                CreateShedinja(gTasks[taskId].tPreEvoSpecies, mon);\n\n            DestroyTask(taskId);\n            FreeMonSpritesGfx();\n            FREE_AND_SET_NULL(sEvoStructPtr);\n            FreeAllWindowBuffers();\n            SetMainCallback2(gCB2_AfterEvolution);\n        }\n        break;\n    case EVOSTATE_CANCEL:\n        if (!gTasks[sEvoGraphicsTaskId].isActive)\n        {\n            m4aMPlayAllStop();\n            BeginNormalPaletteFade(0x6001C, 0, 0x10, 0, RGB_WHITE);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_CANCEL_MON_ANIM:\n        if (!gPaletteFade.active)\n        {\n            PlayCry_Normal(gTasks[taskId].tPreEvoSpecies, 0);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_CANCEL_MSG:\n        if (IsCryFinished())\n        {\n            if (gTasks[taskId].tEvoWasStopped)\n                StringExpandPlaceholders(gStringVar4, gText_EllipsisQuestionMark);\n            else\n                StringExpandPlaceholders(gStringVar4, gText_PkmnStoppedEvolving);\n\n            BattlePutTextOnWindow(gStringVar4, B_WIN_MSG);\n            gTasks[taskId].tEvoWasStopped = TRUE;\n            gTasks[taskId].tState = EVOSTATE_TRY_LEARN_MOVE;\n        }\n        break;\n    case EVOSTATE_LEARNED_MOVE:\n        if (!IsTextPrinterActive(0) && !IsSEPlaying())\n        {\n            BufferMoveToLearnIntoBattleTextBuff2();\n            PlayFanfare(MUS_LEVEL_UP);\n            BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_TABLE_START]);\n            BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n            gTasks[taskId].tLearnsFirstMove = 0x40; // re-used as a counter\n            gTasks[taskId].tState++;\n        }\n        break;\n    case EVOSTATE_TRY_LEARN_ANOTHER_MOVE:\n        if (!IsTextPrinterActive(0) && !IsSEPlaying() && --gTasks[taskId].tLearnsFirstMove == 0)\n            gTasks[taskId].tState = EVOSTATE_TRY_LEARN_MOVE;\n        break;\n    case EVOSTATE_REPLACE_MOVE:\n        switch (gTasks[taskId].tLearnMoveState)\n        {\n        case MVSTATE_INTRO_MSG_1:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n            {\n                // \"{mon} is trying to learn {move}\"\n                BufferMoveToLearnIntoBattleTextBuff2();\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_TABLE_START]);\n                BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n                gTasks[taskId].tLearnMoveState++;\n            }\n            break;\n        case MVSTATE_INTRO_MSG_2:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n            {\n                // \"But, {mon} can't learn more than four moves\"\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_TABLE_START]);\n                BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n                gTasks[taskId].tLearnMoveState++;\n            }\n            break;\n        case MVSTATE_INTRO_MSG_3:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n            {\n                // \"Delete a move to make room for {move}?\"\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_TABLE_START]);\n                BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n                gTasks[taskId].tLearnMoveYesState = MVSTATE_SHOW_MOVE_SELECT;\n                gTasks[taskId].tLearnMoveNoState = MVSTATE_ASK_CANCEL;\n                gTasks[taskId].tLearnMoveState++;\n            }\n        case MVSTATE_PRINT_YES_NO:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n            {\n                HandleBattleWindow(23, 8, 29, 13, 0);\n                BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO);\n                gTasks[taskId].tLearnMoveState++;\n                sEvoCursorPos = 0;\n                BattleCreateYesNoCursorAt();\n            }\n            break;\n        case MVSTATE_HANDLE_YES_NO:\n            // This Yes/No is used for both the initial \"delete move?\" prompt\n            // and for the \"stop learning move?\" prompt\n            // What Yes/No do next is determined by tLearnMoveYesState / tLearnMoveNoState\n            if (JOY_NEW(DPAD_UP) && sEvoCursorPos != 0)\n            {\n                // Moved onto YES\n                PlaySE(SE_SELECT);\n                BattleDestroyYesNoCursorAt();\n                sEvoCursorPos = 0;\n                BattleCreateYesNoCursorAt();\n            }\n            if (JOY_NEW(DPAD_DOWN) && sEvoCursorPos == 0)\n            {\n                // Moved onto NO\n                PlaySE(SE_SELECT);\n                BattleDestroyYesNoCursorAt();\n                sEvoCursorPos = 1;\n                BattleCreateYesNoCursorAt();\n            }\n            if (JOY_NEW(A_BUTTON))\n            {\n                HandleBattleWindow(0x17, 8, 0x1D, 0xD, WINDOW_CLEAR);\n                PlaySE(SE_SELECT);\n\n                if (sEvoCursorPos != 0)\n                {\n                    // NO\n                    gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveNoState;\n                }\n                else\n                {\n                    // YES\n                    gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveYesState;\n                }\n            }\n            if (JOY_NEW(B_BUTTON))\n            {\n                // Equivalent to selecting NO\n                HandleBattleWindow(0x17, 8, 0x1D, 0xD, WINDOW_CLEAR);\n                PlaySE(SE_SELECT);\n                gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveNoState;\n            }\n            break;\n        case MVSTATE_SHOW_MOVE_SELECT:\n            if (!gPaletteFade.active)\n            {\n                FreeAllWindowBuffers();\n                ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskId].tPartyId,\n                            gPlayerPartyCount - 1, CB2_EvolutionSceneLoadGraphics,\n                            gMoveToLearn);\n                gTasks[taskId].tLearnMoveState++;\n            }\n            break;\n        case MVSTATE_HANDLE_MOVE_SELECT:\n            if (!gPaletteFade.active && gMain.callback2 == CB2_EvolutionSceneUpdate)\n            {\n                var = GetMoveSlotToReplace();\n                if (var == MAX_MON_MOVES)\n                {\n                    // Didn't select move slot\n                    gTasks[taskId].tLearnMoveState = MVSTATE_ASK_CANCEL;\n                }\n                else\n                {\n                    // Selected move to forget\n                    u16 move = GetMonData(mon, var + MON_DATA_MOVE1);\n                    if (IsHMMove2(move))\n                    {\n                        // Can't forget HMs\n                        BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_TABLE_START]);\n                        BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n                        gTasks[taskId].tLearnMoveState = MVSTATE_RETRY_AFTER_HM;\n                    }\n                    else\n                    {\n                        // Forget move\n                        PREPARE_MOVE_BUFFER(gBattleTextBuff2, move)\n\n                        RemoveMonPPBonus(mon, var);\n                        SetMonMoveSlot(mon, gMoveToLearn, var);\n                        gTasks[taskId].tLearnMoveState++;\n                    }\n                }\n            }\n            break;\n        case MVSTATE_FORGET_MSG_1:\n            BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_TABLE_START]);\n            BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n            gTasks[taskId].tLearnMoveState++;\n            break;\n        case MVSTATE_FORGET_MSG_2:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n            {\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_TABLE_START]);\n                BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n                gTasks[taskId].tLearnMoveState++;\n            }\n            break;\n        case MVSTATE_LEARNED_MOVE:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n            {\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_TABLE_START]);\n                BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n                gTasks[taskId].tState = EVOSTATE_LEARNED_MOVE;\n            }\n            break;\n        case MVSTATE_ASK_CANCEL:\n            BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_TABLE_START]);\n            BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n            gTasks[taskId].tLearnMoveYesState = MVSTATE_CANCEL;\n            gTasks[taskId].tLearnMoveNoState = MVSTATE_INTRO_MSG_1;\n            gTasks[taskId].tLearnMoveState = MVSTATE_PRINT_YES_NO;\n            break;\n        case MVSTATE_CANCEL:\n            BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_TABLE_START]);\n            BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);\n            gTasks[taskId].tState = EVOSTATE_TRY_LEARN_MOVE;\n            break;\n        case MVSTATE_RETRY_AFTER_HM:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n                gTasks[taskId].tLearnMoveState = MVSTATE_SHOW_MOVE_SELECT;\n            break;\n        }\n        break;\n    }\n}\n\n// States for the main switch in Task_TradeEvolutionScene\nenum {\n    T_EVOSTATE_INTRO_MSG,\n    T_EVOSTATE_INTRO_CRY,\n    T_EVOSTATE_INTRO_SOUND,\n    T_EVOSTATE_START_MUSIC,\n    T_EVOSTATE_START_BG_AND_SPARKLE_SPIRAL,\n    T_EVOSTATE_SPARKLE_ARC,\n    T_EVOSTATE_CYCLE_MON_SPRITE,\n    T_EVOSTATE_WAIT_CYCLE_MON_SPRITE,\n    T_EVOSTATE_SPARKLE_CIRCLE,\n    T_EVOSTATE_SPARKLE_SPRAY,\n    T_EVOSTATE_EVO_SOUND,\n    T_EVOSTATE_EVO_MON_ANIM,\n    T_EVOSTATE_SET_MON_EVOLVED,\n    T_EVOSTATE_TRY_LEARN_MOVE,\n    T_EVOSTATE_END,\n    T_EVOSTATE_CANCEL,\n    T_EVOSTATE_CANCEL_MON_ANIM,\n    T_EVOSTATE_CANCEL_MSG,\n    T_EVOSTATE_LEARNED_MOVE,\n    T_EVOSTATE_TRY_LEARN_ANOTHER_MOVE,\n    T_EVOSTATE_REPLACE_MOVE,\n};\n\n// States for the switch in T_EVOSTATE_REPLACE_MOVE\nenum {\n    T_MVSTATE_INTRO_MSG_1,\n    T_MVSTATE_INTRO_MSG_2,\n    T_MVSTATE_INTRO_MSG_3,\n    T_MVSTATE_PRINT_YES_NO,\n    T_MVSTATE_HANDLE_YES_NO,\n    T_MVSTATE_SHOW_MOVE_SELECT,\n    T_MVSTATE_HANDLE_MOVE_SELECT,\n    T_MVSTATE_FORGET_MSG,\n    T_MVSTATE_LEARNED_MOVE,\n    T_MVSTATE_ASK_CANCEL,\n    T_MVSTATE_CANCEL,\n    T_MVSTATE_RETRY_AFTER_HM,\n};\n\nstatic void Task_TradeEvolutionScene(u8 taskId)\n{\n    u32 var = 0;\n    struct Pokemon* mon = &gPlayerParty[gTasks[taskId].tPartyId];\n\n    // Automatically cancel if the Pokemon would evolve into a species you have not\n    // yet unlocked, such as Crobat.\n    if (!IsNationalPokedexEnabled()\n        && gTasks[taskId].tState == T_EVOSTATE_WAIT_CYCLE_MON_SPRITE\n        && gTasks[taskId].tPostEvoSpecies > SPECIES_DEOXYS)\n    {\n        gTasks[taskId].tState = EVOSTATE_TRY_LEARN_MOVE;\n        gTasks[taskId].tEvoWasStopped = TRUE;\n        if (gTasks[sEvoGraphicsTaskId].isActive)\n        {\n            gTasks[sEvoGraphicsTaskId].tEvoStopped = TRUE;\n            StopBgAnimation();\n        }\n    }\n\n    switch (gTasks[taskId].tState)\n    {\n    case T_EVOSTATE_INTRO_MSG:\n        StringExpandPlaceholders(gStringVar4, gText_PkmnIsEvolving);\n        DrawTextOnTradeWindow(0, gStringVar4, 1);\n        gTasks[taskId].tState++;\n        break;\n    case T_EVOSTATE_INTRO_CRY:\n        if (!IsTextPrinterActive(0))\n        {\n            PlayCry_Normal(gTasks[taskId].tPreEvoSpecies, 0);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case T_EVOSTATE_INTRO_SOUND:\n        if (IsCryFinished())\n        {\n            m4aSongNumStop(MUS_EVOLUTION);\n            PlaySE(MUS_EVOLUTION_INTRO);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case T_EVOSTATE_START_MUSIC:\n        if (!IsSEPlaying())\n        {\n            PlayBGM(MUS_EVOLUTION);\n            gTasks[taskId].tState++;\n            BeginNormalPaletteFade(0x1C, 4, 0, 0x10, RGB_BLACK);\n        }\n        break;\n    case T_EVOSTATE_START_BG_AND_SPARKLE_SPIRAL:\n        if (!gPaletteFade.active)\n        {\n            StartBgAnimation(TRUE);\n            var = gSprites[sEvoStructPtr->preEvoSpriteId].oam.paletteNum + 16;\n            sEvoGraphicsTaskId = EvolutionSparkles_SpiralUpward(var);\n            gTasks[taskId].tState++;\n            SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6));\n        }\n        break;\n    case T_EVOSTATE_SPARKLE_ARC:\n        if (!gTasks[sEvoGraphicsTaskId].isActive)\n        {\n            gTasks[taskId].tState++;\n            sEvoStructPtr->delayTimer = 1;\n            sEvoGraphicsTaskId = EvolutionSparkles_ArcDown();\n        }\n        break;\n    case T_EVOSTATE_CYCLE_MON_SPRITE:\n        if (!gTasks[sEvoGraphicsTaskId].isActive)\n        {\n            sEvoGraphicsTaskId = CycleEvolutionMonSprite(sEvoStructPtr->preEvoSpriteId, sEvoStructPtr->postEvoSpriteId);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case T_EVOSTATE_WAIT_CYCLE_MON_SPRITE:\n        if (--sEvoStructPtr->delayTimer == 0)\n        {\n            sEvoStructPtr->delayTimer = 3;\n            if (!gTasks[sEvoGraphicsTaskId].isActive)\n                gTasks[taskId].tState++;\n        }\n        break;\n    case T_EVOSTATE_SPARKLE_CIRCLE:\n        sEvoGraphicsTaskId = EvolutionSparkles_CircleInward();\n        gTasks[taskId].tState++;\n        break;\n    case T_EVOSTATE_SPARKLE_SPRAY:\n        if (!gTasks[sEvoGraphicsTaskId].isActive)\n        {\n            sEvoGraphicsTaskId = EvolutionSparkles_SprayAndFlash_Trade(gTasks[taskId].tPostEvoSpecies);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case T_EVOSTATE_EVO_SOUND:\n        if (!gTasks[sEvoGraphicsTaskId].isActive)\n        {\n            PlaySE(SE_EXP);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case T_EVOSTATE_EVO_MON_ANIM:\n        if (!IsSEPlaying())\n        {\n//            Free(sBgAnimPal);\n            PlayCry_Normal(gTasks[taskId].tPostEvoSpecies, 0);\n            memcpy(&gPlttBufferUnfaded[BG_PLTT_ID(2)], sEvoStructPtr->savedPalette, sizeof(sEvoStructPtr->savedPalette));\n            gTasks[taskId].tState++;\n        }\n        break;\n    case T_EVOSTATE_SET_MON_EVOLVED:\n        if (IsCryFinished())\n        {\n            StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved);\n            DrawTextOnTradeWindow(0, gStringVar4, 1);\n            PlayFanfare(MUS_EVOLVED);\n            gTasks[taskId].tState++;\n            SetMonData(mon, MON_DATA_SPECIES, (&gTasks[taskId].tPostEvoSpecies));\n            CalculateMonStats(mon, FALSE);\n            EvolutionRenameMon(mon, gTasks[taskId].tPreEvoSpecies, gTasks[taskId].tPostEvoSpecies);\n            GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_SEEN);\n            GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_CAUGHT);\n            IncrementGameStat(GAME_STAT_EVOLVED_POKEMON);\n        }\n        break;\n    case T_EVOSTATE_TRY_LEARN_MOVE:\n        if (!IsTextPrinterActive(0) && IsFanfareTaskInactive() == TRUE)\n        {\n            var = MonTryLearningNewMove(mon, gTasks[taskId].tLearnsFirstMove);\n            if (var != MOVE_NONE && !gTasks[taskId].tEvoWasStopped)\n            {\n                u8 text[20];\n\n                gTasks[taskId].tBits |= TASK_BIT_LEARN_MOVE;\n                gTasks[taskId].tLearnsFirstMove = FALSE;\n                gTasks[taskId].tLearnMoveState = 0;\n                GetMonData(mon, MON_DATA_NICKNAME, text);\n                StringCopy_Nickname(gBattleTextBuff1, text);\n\n                if (var == MON_HAS_MAX_MOVES)\n                    gTasks[taskId].tState = T_EVOSTATE_REPLACE_MOVE;\n                else if (var == MON_ALREADY_KNOWS_MOVE)\n                    break;\n                else\n                    gTasks[taskId].tState = T_EVOSTATE_LEARNED_MOVE;\n            }\n            else\n            {\n                PlayBGM(MUS_EVOLUTION);\n                DrawTextOnTradeWindow(0, gText_CommunicationStandby5, 1);\n                gTasks[taskId].tState++;\n            }\n        }\n        break;\n    case T_EVOSTATE_END:\n        if (!IsTextPrinterActive(0))\n        {\n            DestroyTask(taskId);\n            FREE_AND_SET_NULL(sEvoStructPtr);\n            sEvoStructPtr = NULL;\n            gTextFlags.useAlternateDownArrow = FALSE;\n            SetMainCallback2(gCB2_AfterEvolution);\n        }\n        break;\n    case T_EVOSTATE_CANCEL:\n        if (!gTasks[sEvoGraphicsTaskId].isActive)\n        {\n            m4aMPlayAllStop();\n            BeginNormalPaletteFade((1 << (gSprites[sEvoStructPtr->preEvoSpriteId].oam.paletteNum + 16)) | (0x4001C), 0, 0x10, 0, RGB_WHITE);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case T_EVOSTATE_CANCEL_MON_ANIM:\n        if (!gPaletteFade.active)\n        {\n            PlayCry_Normal(gTasks[taskId].tPreEvoSpecies, 0);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case T_EVOSTATE_CANCEL_MSG:\n        if (IsCryFinished())\n        {\n            StringExpandPlaceholders(gStringVar4, gText_EllipsisQuestionMark);\n            DrawTextOnTradeWindow(0, gStringVar4, 1);\n            gTasks[taskId].tEvoWasStopped = TRUE;\n            gTasks[taskId].tState = T_EVOSTATE_TRY_LEARN_MOVE;\n        }\n        break;\n    case T_EVOSTATE_LEARNED_MOVE:\n        if (!IsTextPrinterActive(0) && !IsSEPlaying())\n        {\n            BufferMoveToLearnIntoBattleTextBuff2();\n            PlayFanfare(MUS_LEVEL_UP);\n            BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_TABLE_START]);\n            DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1);\n            gTasks[taskId].tLearnsFirstMove = 0x40; // re-used as a counter\n            gTasks[taskId].tState++;\n        }\n        break;\n    case T_EVOSTATE_TRY_LEARN_ANOTHER_MOVE:\n        if (!IsTextPrinterActive(0) && IsFanfareTaskInactive() == TRUE && --gTasks[taskId].tLearnsFirstMove == 0)\n            gTasks[taskId].tState = T_EVOSTATE_TRY_LEARN_MOVE;\n        break;\n    case T_EVOSTATE_REPLACE_MOVE:\n        switch (gTasks[taskId].tLearnMoveState)\n        {\n        case T_MVSTATE_INTRO_MSG_1:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n            {\n                // \"{mon} is trying to learn {move}\"\n                BufferMoveToLearnIntoBattleTextBuff2();\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_TABLE_START]);\n                DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1);\n                gTasks[taskId].tLearnMoveState++;\n            }\n            break;\n        case T_MVSTATE_INTRO_MSG_2:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n            {\n                // \"But, {mon} can't learn more than four moves\"\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_TABLE_START]);\n                DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1);\n                gTasks[taskId].tLearnMoveState++;\n            }\n            break;\n        case T_MVSTATE_INTRO_MSG_3:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n            {\n                // \"Delete a move to make room for {move}?\"\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_TABLE_START]);\n                DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1);\n                gTasks[taskId].tLearnMoveYesState = T_MVSTATE_SHOW_MOVE_SELECT;\n                gTasks[taskId].tLearnMoveNoState = T_MVSTATE_ASK_CANCEL;\n                gTasks[taskId].tLearnMoveState++;\n            }\n        case T_MVSTATE_PRINT_YES_NO:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n            {\n                LoadUserWindowGfx2(0, 0xA8, BG_PLTT_ID(14));\n                CreateYesNoMenu(&gTradeEvolutionSceneYesNoWindowTemplate, FONT_NORMAL_COPY_2, 0, 2, 0xA8, 14, 0);\n                sEvoCursorPos = 0;\n                gTasks[taskId].tLearnMoveState++;\n                sEvoCursorPos = 0;\n            }\n            break;\n        case T_MVSTATE_HANDLE_YES_NO:\n            switch (Menu_ProcessInputNoWrapClearOnChoose())\n            {\n            case 0: // YES\n                sEvoCursorPos = 0;\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_TABLE_START]);\n                DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1);\n                gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveYesState;\n                if (gTasks[taskId].tLearnMoveState == T_MVSTATE_SHOW_MOVE_SELECT)\n                    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n                break;\n            case 1: // NO\n            case MENU_B_PRESSED:\n                sEvoCursorPos = 1;\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_TABLE_START]);\n                DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1);\n                gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveNoState;\n                break;\n            }\n            break;\n        case T_MVSTATE_SHOW_MOVE_SELECT:\n            if (!gPaletteFade.active)\n            {\n                if (gWirelessCommType)\n                    DestroyWirelessStatusIndicatorSprite();\n\n                Free(GetBgTilemapBuffer(3));\n                Free(GetBgTilemapBuffer(1));\n                Free(GetBgTilemapBuffer(0));\n                FreeAllWindowBuffers();\n\n                ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskId].tPartyId,\n                            gPlayerPartyCount - 1, CB2_TradeEvolutionSceneLoadGraphics,\n                            gMoveToLearn);\n                gTasks[taskId].tLearnMoveState++;\n            }\n            break;\n        case T_MVSTATE_HANDLE_MOVE_SELECT:\n            if (!gPaletteFade.active && gMain.callback2 == CB2_TradeEvolutionSceneUpdate)\n            {\n                var = GetMoveSlotToReplace();\n                if (var == MAX_MON_MOVES)\n                {\n                    // Didn't select move slot\n                    gTasks[taskId].tLearnMoveState = T_MVSTATE_ASK_CANCEL;\n                }\n                else\n                {\n                    // Selected move to forget\n                    u16 move = GetMonData(mon, var + MON_DATA_MOVE1);\n                    if (IsHMMove2(move))\n                    {\n                        // Can't forget HMs\n                        BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_TABLE_START]);\n                        DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1);\n                        gTasks[taskId].tLearnMoveState = T_MVSTATE_RETRY_AFTER_HM;\n                    }\n                    else\n                    {\n                        // Forget move\n                        PREPARE_MOVE_BUFFER(gBattleTextBuff2, move)\n\n                        RemoveMonPPBonus(mon, var);\n                        SetMonMoveSlot(mon, gMoveToLearn, var);\n                        BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_TABLE_START]);\n                        DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1);\n                        gTasks[taskId].tLearnMoveState++;\n                    }\n                }\n            }\n            break;\n        case T_MVSTATE_FORGET_MSG:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n            {\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_TABLE_START]);\n                DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1);\n                gTasks[taskId].tLearnMoveState++;\n            }\n            break;\n        case T_MVSTATE_LEARNED_MOVE:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n            {\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_TABLE_START]);\n                DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1);\n                gTasks[taskId].tState = T_EVOSTATE_LEARNED_MOVE;\n            }\n            break;\n        case T_MVSTATE_ASK_CANCEL:\n            BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_TABLE_START]);\n            DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1);\n            gTasks[taskId].tLearnMoveYesState = T_MVSTATE_CANCEL;\n            gTasks[taskId].tLearnMoveNoState = T_MVSTATE_INTRO_MSG_1;\n            gTasks[taskId].tLearnMoveState = T_MVSTATE_PRINT_YES_NO;\n            break;\n        case T_MVSTATE_CANCEL:\n            BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_TABLE_START]);\n            DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1);\n            gTasks[taskId].tState = T_EVOSTATE_TRY_LEARN_MOVE;\n            break;\n        case T_MVSTATE_RETRY_AFTER_HM:\n            if (!IsTextPrinterActive(0) && !IsSEPlaying())\n                gTasks[taskId].tLearnMoveState = T_MVSTATE_SHOW_MOVE_SELECT;\n            break;\n        }\n        break;\n    }\n}\n\n#undef tState\n#undef tPreEvoSpecies\n#undef tPostEvoSpecies\n#undef tCanStop\n#undef tBits\n#undef tLearnsFirstMove\n#undef tLearnMoveState\n#undef tLearnMoveYesState\n#undef tLearnMoveNoState\n#undef tEvoWasStopped\n#undef tPartyId\n\nstatic void EvoDummyFunc(void)\n{\n}\n\nstatic void VBlankCB_EvolutionScene(void)\n{\n    SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X);\n    SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y);\n    SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);\n    SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);\n    SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X);\n    SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y);\n    SetGpuReg(REG_OFFSET_BG3HOFS, gBattle_BG3_X);\n    SetGpuReg(REG_OFFSET_BG3VOFS, gBattle_BG3_Y);\n\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n    ScanlineEffect_InitHBlankDmaTransfer();\n}\n\nstatic void VBlankCB_TradeEvolutionScene(void)\n{\n    SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X);\n    SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y);\n    SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);\n    SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);\n    SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X);\n    SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y);\n    SetGpuReg(REG_OFFSET_BG3HOFS, gBattle_BG3_X);\n    SetGpuReg(REG_OFFSET_BG3VOFS, gBattle_BG3_Y);\n\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n    ScanlineEffect_InitHBlankDmaTransfer();\n}\n\n#define tCycleTimer   data[0]\n#define tPalStage     data[1]\n#define tControlStage data[2]\n#define tNumCycles    data[3]\n#define tStartTimer   data[5]\n#define tPaused       data[6]\n\n// See comments above sBgAnim_PaletteControl\n#define START_PAL sBgAnim_PaletteControl[tControlStage][0]\n#define END_PAL   sBgAnim_PaletteControl[tControlStage][1]\n#define CYCLES    sBgAnim_PaletteControl[tControlStage][2]\n#define DELAY     sBgAnim_PaletteControl[tControlStage][3]\n\n// Cycles the background through a set range of palettes in a series\n// of stages, each stage having a different palette range and timing\nstatic void Task_UpdateBgPalette(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (tPaused)\n        return;\n    if (tStartTimer++ < 20)\n        return;\n\n    if (tCycleTimer++ > DELAY)\n    {\n        if (END_PAL == tPalStage)\n        {\n            // Reached final palette in current stage, completed a 'cycle'\n            // If this is the final cycle for this stage, move to the next stage\n            tNumCycles++;\n            if (tNumCycles == CYCLES)\n            {\n                tNumCycles = 0;\n                tControlStage++;\n            }\n            tPalStage = START_PAL;\n        }\n        else\n        {\n            // Haven't reached final palette in current stage, load the current palette\n            LoadPalette(&sBgAnimPal[tPalStage * 16], BG_PLTT_ID(10), PLTT_SIZE_4BPP);\n            tCycleTimer = 0;\n            tPalStage++;\n        }\n    }\n\n    if (tControlStage == (int)ARRAY_COUNT(sBgAnim_PaletteControl[0]))\n        DestroyTask(taskId);\n}\n\n#undef tCycleTimer\n#undef tPalStage\n#undef tControlStage\n#undef tNumCycles\n#undef tStartTimer\n#undef START_PAL\n#undef END_PAL\n#undef CYCLES\n#undef DELAY\n\n#define tIsLink data[2]\n\nstatic void CreateBgAnimTask(bool8 isLink)\n{\n    u8 taskId = CreateTask(Task_AnimateBg, 7);\n\n    if (!isLink)\n        gTasks[taskId].data[2] = FALSE;\n    else\n        gTasks[taskId].data[2] = TRUE;\n}\n\nstatic void Task_AnimateBg(u8 taskId)\n{\n    u16 *outer_X, *outer_Y;\n\n    u16 *inner_X = &gBattle_BG1_X;\n    u16 *inner_Y = &gBattle_BG1_Y;\n\n    if (!gTasks[taskId].data[2])\n    {\n        outer_X = &gBattle_BG2_X;\n        outer_Y = &gBattle_BG2_Y;\n    }\n    else\n    {\n        outer_X = &gBattle_BG3_X;\n        outer_Y = &gBattle_BG3_Y;\n    }\n\n    gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 5) & 0xFF;\n    gTasks[taskId].data[1] = (gTasks[taskId].data[0] + 0x80) & 0xFF;\n\n    *inner_X = Cos(gTasks[taskId].data[0], 4) + 8;\n    *inner_Y = Sin(gTasks[taskId].data[0], 4) + 16;\n\n    *outer_X = Cos(gTasks[taskId].data[1], 4) + 8;\n    *outer_Y = Sin(gTasks[taskId].data[1], 4) + 16;\n\n    if (!FuncIsActiveTask(Task_UpdateBgPalette))\n    {\n        DestroyTask(taskId);\n\n        *inner_X = 0;\n        *inner_Y = 0;\n\n        *outer_X = 256;\n        *outer_Y = 0;\n    }\n}\n\n#undef tIsLink\n\nstatic void InitMovingBgPalette(u16 *palette)\n{\n    s32 i, j;\n\n    for (i = 0; i < (int)ARRAY_COUNT(sBgAnim_PalIndexes); i++)\n    {\n        for (j = 0; j < 16; j++)\n        {\n            palette[i * 16 + j] = sBgAnim_Pal[sBgAnim_PalIndexes[i][j]];\n        }\n    }\n}\n\nstatic void StartBgAnimation(bool8 isLink)\n{\n    u8 innerBgId, outerBgId;\n\n    sBgAnimPal = AllocZeroed(0x640);\n    InitMovingBgPalette(sBgAnimPal);\n\n    if (!isLink)\n        innerBgId = 1, outerBgId = 2;\n    else\n        innerBgId = 1, outerBgId = 3;\n\n    LoadPalette(sBlackPalette, BG_PLTT_ID(10), sizeof(sBlackPalette));\n\n    DecompressAndLoadBgGfxUsingHeap(1, sMovingBackgroundTiles, FALSE, 0, 0);\n    CopyToBgTilemapBuffer(1, sMovingBackgroundMap1, 0, 0);\n    CopyToBgTilemapBuffer(outerBgId, sMovingBackgroundMap2, 0, 0);\n    CopyBgTilemapBufferToVram(1);\n    CopyBgTilemapBufferToVram(outerBgId);\n\n    if (!isLink)\n    {\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG2);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8));\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG2_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP);\n\n        SetBgAttribute(innerBgId, BG_ATTR_PRIORITY, 2);\n        SetBgAttribute(outerBgId, BG_ATTR_PRIORITY, 2);\n\n        ShowBg(1);\n        ShowBg(2);\n    }\n    else\n    {\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8));\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP);\n    }\n\n    CreateTask(Task_UpdateBgPalette, 5);\n    CreateBgAnimTask(isLink);\n}\n\nvoid IsMovingBackgroundTaskRunning(void) // unused\n{\n    u8 taskId = FindTaskIdByFunc(Task_UpdateBgPalette);\n\n    if (taskId != TASK_NONE)\n        gTasks[taskId].tPaused = TRUE;\n\n    FillPalette(RGB_BLACK, BG_PLTT_ID(10), PLTT_SIZE_4BPP);\n}\n\n#undef tPaused\n\nstatic void StopBgAnimation(void)\n{\n    u8 taskId;\n\n    if ((taskId = FindTaskIdByFunc(Task_UpdateBgPalette)) != TASK_NONE)\n        DestroyTask(taskId);\n    if ((taskId = FindTaskIdByFunc(Task_AnimateBg)) != TASK_NONE)\n        DestroyTask(taskId);\n\n    FillPalette(RGB_BLACK, BG_PLTT_ID(10), PLTT_SIZE_4BPP);\n    RestoreBgAfterAnim();\n}\n\nstatic void RestoreBgAfterAnim(void)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    gBattle_BG1_X = 0;\n    gBattle_BG1_Y = 0;\n    gBattle_BG2_X = 0;\n    SetBgAttribute(1, BG_ATTR_PRIORITY, GetBattleBgTemplateData(1, 5));\n    SetBgAttribute(2, BG_ATTR_PRIORITY, GetBattleBgTemplateData(2, 5));\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP);\n    Free(sBgAnimPal);\n}\n"
  },
  {
    "path": "src/fame_checker.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"constants/songs.h\"\n#include \"event_data.h\"\n#include \"event_scripts.h\"\n#include \"graphics.h\"\n#include \"battle.h\"\n#include \"battle_setup.h\"\n#include \"menu.h\"\n#include \"trainer_pokemon_sprites.h\"\n#include \"scanline_effect.h\"\n#include \"new_menu_helpers.h\"\n#include \"item_menu.h\"\n#include \"list_menu.h\"\n#include \"task.h\"\n#include \"event_object_movement.h\"\n#include \"menu_indicators.h\"\n#include \"text_window.h\"\n#include \"fame_checker.h\"\n#include \"strings.h\"\n#include \"constants/event_objects.h\"\n\n#define SPRITETAG_SELECTOR_CURSOR 1000\n#define SPRITETAG_QUESTION_MARK 1001\n#define SPRITETAG_SPINNING_POKEBALL 1002\n#define SPRITETAG_SCROLL_INDICATORS 1004\n#define SPRITETAG_DAISY 1006 // TODO: Investigate, seems to be used for other NPCs (e.g. Fan Club Chairman)\n#define SPRITETAG_FUJI 1007\n#define SPRITETAG_OAK 1008\n#define SPRITETAG_BILL 1009\n\n#define FC_NONTRAINER_START 0xFE00\n\nstruct FameCheckerData\n{\n    MainCallback savedCallback;\n    u16 listMenuTopIdx;\n    u8 scrollIndicatorPairTaskId;\n    u8 personHasUnlockedPanels:1;\n    u8 inPickMode:1;\n    u8 numUnlockedPersons:6;\n    u8 listMenuTaskId;\n    u8 listMenuCurIdx;\n    u8 listMenuTopIdx2;\n    u8 listMenuDrawnSelIdx;\n    u8 unlockedPersons[NUM_FAMECHECKER_PERSONS + 1];\n    u8 spriteIds[6];\n    u8 viewingFlavorText:1;\n    u8 unk_23_1:1; // unused\n    u8 pickModeOverCancel:1;\n};\n\nstatic EWRAM_DATA u16 * sBg3TilemapBuffer = NULL;\nstatic EWRAM_DATA u16 * sBg1TilemapBuffer = NULL;\nstatic EWRAM_DATA u16 * sBg2TilemapBuffer = NULL;\nstatic EWRAM_DATA struct FameCheckerData * sFameCheckerData = NULL;\nstatic EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL;\nstatic EWRAM_DATA s32 sLastMenuIdx = 0;\n\nstruct ListMenuTemplate gFameChecker_ListMenuTemplate;\nu8 gIconDescriptionBoxIsOpen;\n\nstatic void MainCB2_LoadFameChecker(void);\nstatic void LoadUISpriteSheetsAndPalettes(void);\nstatic void Task_WaitFadeOnInit(u8 taskId);\nstatic void Task_TopMenuHandleInput(u8 taskId);\nstatic bool8 TryExitPickMode(u8 taskId);\nstatic void MessageBoxPrintEmptyText(void);\nstatic void Task_EnterPickMode(u8 taskId);\nstatic void Task_ExitPickMode(u8 taskId);\nstatic void Task_FlavorTextDisplayHandleInput(u8 taskId);\nstatic void FC_MoveSelectorCursor(u8 taskId, s8 dx, s8 dy);\nstatic void GetPickModeText(void);\nstatic void PrintSelectedNameInBrightGreen(u8 taskId);\nstatic void WipeMsgBoxAndTransfer(void);\nstatic void Setup_DrawMsgAndListBoxes(void);\nstatic void FC_PutWindowTilemapAndCopyWindowToVramMode3(u8 windowId);\nstatic bool8 SetMessageSelectorIconObjMode(u8 taskId, u8 objMode);\nstatic void Task_StartToCloseFameChecker(u8 taskId);\nstatic void Task_DestroyAssetsAndCloseFameChecker(u8 taskId);\nstatic void FC_DestroyWindow(u8 windowId);\nstatic void PrintUIHelp(u8 state);\nstatic bool8 CreateAllFlavorTextIcons(u8 who);\nstatic void FCSetup_ClearVideoRegisters(void);\nstatic void FCSetup_ResetTasksAndSpriteResources(void);\nstatic void FCSetup_TurnOnDisplay(void);\nstatic void FCSetup_ResetBGCoords(void);\nstatic bool8 HasUnlockedAllFlavorTextsForCurrentPerson(void);\nstatic void FreeSelectionCursorSpriteResources(void);\nstatic u8 CreateFlavorTextIconSelectorCursorSprite(s16 where);\nstatic void SpriteCB_DestroyFlavorTextIconSelectorCursor(struct Sprite *sprite);\nstatic void FreeQuestionMarkSpriteResources(void);\nstatic u8 PlaceQuestionMarkTile(u8 x, u8 y);\nstatic void FreeSpinningPokeballSpriteResources(void);\nstatic u8 CreateSpinningPokeballSprite(void);\nstatic void SpriteCB_DestroySpinningPokeball(struct Sprite *sprite);\nstatic void FreeNonTrainerPicTiles(void);\nstatic u8 CreatePersonPicSprite(u8 fcPersonIdx);\nstatic void DestroyPersonPicSprite(u8 taskId, u16 who);\nstatic void UpdateIconDescriptionBox(u8 whichText);\nstatic void UpdateIconDescriptionBoxOff(void);\nstatic void FC_CreateListMenu(void);\nstatic void SpriteCB_FCSpinningPokeball(struct Sprite *sprite);\nstatic void InitListMenuTemplate(void);\nstatic void FC_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list);\nstatic void Task_SwitchToPickMode(u8 taskId);\nstatic void PrintCancelDescription(void);\nstatic void FC_DoMoveCursor(s32 itemIndex, bool8 onInit);\nstatic u8 FC_PopulateListMenu(void);\nstatic void FC_PutWindowTilemapAndCopyWindowToVramMode3_2(u8 windowId);\nstatic void FC_CreateScrollIndicatorArrowPair(void);\nstatic void FreeListMenuSelectorArrowPairResources(void);\nstatic u16 FameCheckerGetCursorY(void);\nstatic void HandleFlavorTextModeSwitch(bool8 state);\nstatic void Task_FCOpenOrCloseInfoBox(u8 taskId);\nstatic void UpdateInfoBoxTilemap(u8 bg, s16 state);\nstatic void PlaceListMenuCursor(bool8 isActive);\n\nstatic const u16 sFameCheckerTilemap[] = INCBIN_U16(\"graphics/fame_checker/tilemap1.bin\");\nstatic const u8 sQuestionMarkSpriteGfx[] = INCBIN_U8(\"graphics/fame_checker/question_mark.4bpp\");\nstatic const u8 sSpinningPokeballSpriteGfx[] = INCBIN_U8(\"graphics/fame_checker/spinning_pokeball.4bpp\");\nstatic const u16 sSpinningPokeballSpritePalette[] = INCBIN_U16(\"graphics/fame_checker/spinning_pokeball.gbapal\");\nstatic const u8 sSelectorCursorSpriteGfx[] = INCBIN_U8(\"graphics/fame_checker/cursor.4bpp\");\nstatic const u16 sSelectorCursorSpritePalette[] = INCBIN_U16(\"graphics/fame_checker/cursor.gbapal\");\nstatic const u8 sFujiSpriteGfx[] = INCBIN_U8(\"graphics/fame_checker/mr_fuji.4bpp\");\nstatic const u16 sFujiSpritePalette[] = INCBIN_U16(\"graphics/fame_checker/mr_fuji.gbapal\");\nstatic const u8 sBillSpriteGfx[] = INCBIN_U8(\"graphics/fame_checker/bill.4bpp\");\nstatic const u16 sBillSpritePalette[] = INCBIN_U16(\"graphics/fame_checker/bill.gbapal\");\nstatic const u8 sDaisySpriteGfx[] = INCBIN_U8(\"graphics/fame_checker/daisy.4bpp\");\nstatic const u16 sDaisySpritePalette[] = INCBIN_U16(\"graphics/fame_checker/daisy.gbapal\");\nstatic const u8 sOakSpriteGfx[] = INCBIN_U8(\"graphics/fame_checker/prof_oak.4bpp\");\nstatic const u16 sOakSpritePalette[] = INCBIN_U16(\"graphics/fame_checker/prof_oak.gbapal\");\nstatic const u16 sUnkPalette[] = INCBIN_U16(\"graphics/fame_checker/unk.gbapal\"); // unused?\nstatic const u16 sSilhouettePalette[] = INCBIN_U16(\"graphics/fame_checker/silhouette.gbapal\");\n\nstatic const u8 sTextColor_White[3]  = {0, 1, 2};\nstatic const u8 sTextColor_DkGrey[3] = {0, 2, 3};\nstatic const u8 sTextColor_Green[3]  = {0, 6, 7};\n\n#define FAME_CHECKER_PROF_OAK  (FC_NONTRAINER_START + 0)\n#define FAME_CHECKER_DAISY_OAK (FC_NONTRAINER_START + 1)\n#define FAME_CHECKER_BILL      (FC_NONTRAINER_START + 2)\n#define FAME_CHECKER_MR_FUJI   (FC_NONTRAINER_START + 3)\n\nstatic const u16 sTrainerIdxs[] = {\n    [FAMECHECKER_OAK]      = FAME_CHECKER_PROF_OAK,\n    [FAMECHECKER_DAISY]    = FAME_CHECKER_DAISY_OAK,\n    [FAMECHECKER_BROCK]    = TRAINER_LEADER_BROCK,\n    [FAMECHECKER_MISTY]    = TRAINER_LEADER_MISTY,\n    [FAMECHECKER_LTSURGE]  = TRAINER_LEADER_LT_SURGE,\n    [FAMECHECKER_ERIKA]    = TRAINER_LEADER_ERIKA,\n    [FAMECHECKER_KOGA]     = TRAINER_LEADER_KOGA,\n    [FAMECHECKER_SABRINA]  = TRAINER_LEADER_SABRINA,\n    [FAMECHECKER_BLAINE]   = TRAINER_LEADER_BLAINE,\n    [FAMECHECKER_LORELEI]  = TRAINER_ELITE_FOUR_LORELEI,\n    [FAMECHECKER_BRUNO]    = TRAINER_ELITE_FOUR_BRUNO,\n    [FAMECHECKER_AGATHA]   = TRAINER_ELITE_FOUR_AGATHA,\n    [FAMECHECKER_LANCE]    = TRAINER_ELITE_FOUR_LANCE,\n    [FAMECHECKER_BILL]     = FAME_CHECKER_BILL,\n    [FAMECHECKER_MRFUJI]   = FAME_CHECKER_MR_FUJI,\n    [FAMECHECKER_GIOVANNI] = TRAINER_BOSS_GIOVANNI\n};\n\nstatic const u8 *const sNonTrainerNamePointers[] = {\n    gFameCheckerOakName,\n    gFameCheckerDaisyName,\n    gFameCheckerBillName,\n    gFameCheckerMrFujiName\n};\n\nstatic const u8 sFameCheckerTrainerPicIdxs[] = {\n    [FAMECHECKER_OAK]      = TRAINER_PIC_CAMPER,\n    [FAMECHECKER_DAISY]    = TRAINER_PIC_LASS,\n    [FAMECHECKER_BROCK]    = TRAINER_PIC_LEADER_BROCK,\n    [FAMECHECKER_MISTY]    = TRAINER_PIC_LEADER_MISTY,\n    [FAMECHECKER_LTSURGE]  = TRAINER_PIC_LEADER_LT_SURGE,\n    [FAMECHECKER_ERIKA]    = TRAINER_PIC_LEADER_ERIKA,\n    [FAMECHECKER_KOGA]     = TRAINER_PIC_LEADER_KOGA,\n    [FAMECHECKER_SABRINA]  = TRAINER_PIC_LEADER_SABRINA,\n    [FAMECHECKER_BLAINE]   = TRAINER_PIC_LEADER_BLAINE,\n    [FAMECHECKER_LORELEI]  = TRAINER_PIC_ELITE_FOUR_LORELEI,\n    [FAMECHECKER_BRUNO]    = TRAINER_PIC_ELITE_FOUR_BRUNO,\n    [FAMECHECKER_AGATHA]   = TRAINER_PIC_ELITE_FOUR_AGATHA,\n    [FAMECHECKER_LANCE]    = TRAINER_PIC_ELITE_FOUR_LANCE,\n    [FAMECHECKER_BILL]     = TRAINER_PIC_PSYCHIC_M,\n    [FAMECHECKER_MRFUJI]   = TRAINER_PIC_GENTLEMAN,\n    [FAMECHECKER_GIOVANNI] = TRAINER_PIC_LEADER_GIOVANNI,\n};\n\nstatic const u8 sFameCheckerTrainerGenders_Unused[] = {\n    [FAMECHECKER_OAK]      = MALE,\n    [FAMECHECKER_DAISY]    = FEMALE,\n    [FAMECHECKER_BROCK]    = MALE,\n    [FAMECHECKER_MISTY]    = FEMALE,\n    [FAMECHECKER_LTSURGE]  = MALE,\n    [FAMECHECKER_ERIKA]    = FEMALE,\n    [FAMECHECKER_KOGA]     = MALE,\n    [FAMECHECKER_SABRINA]  = FEMALE,\n    [FAMECHECKER_BLAINE]   = MALE,\n    [FAMECHECKER_LORELEI]  = FEMALE,\n    [FAMECHECKER_BRUNO]    = MALE,\n    [FAMECHECKER_AGATHA]   = FEMALE,\n    [FAMECHECKER_LANCE]    = MALE,\n    [FAMECHECKER_BILL]     = MALE,\n    [FAMECHECKER_MRFUJI]   = MALE,\n    [FAMECHECKER_GIOVANNI] = MALE,\n};\n\nstatic const u8 *const sFameCheckerNameAndQuotesPointers[2 * NUM_FAMECHECKER_PERSONS] =\n{\n    gFameCheckerPersonName_ProfOak,\n    gFameCheckerPersonName_Daisy,\n    gFameCheckerPersonName_Brock,\n    gFameCheckerPersonName_Misty,\n    gFameCheckerPersonName_LtSurge,\n    gFameCheckerPersonName_Erika,\n    gFameCheckerPersonName_Koga,\n    gFameCheckerPersonName_Sabrina,\n    gFameCheckerPersonName_Blaine,\n    gFameCheckerPersonName_Lorelei,\n    gFameCheckerPersonName_Bruno,\n    gFameCheckerPersonName_Agatha,\n    gFameCheckerPersonName_Lance,\n    gFameCheckerPersonName_Bill,\n    gFameCheckerPersonName_MrFuji,\n    gFameCheckerPersonName_Giovanni,\n\n    gFameCheckerPersonQuote_ProfOak,\n    gFameCheckerPersonQuote_Daisy,\n    gFameCheckerPersonQuote_Brock,\n    gFameCheckerPersonQuote_Misty,\n    gFameCheckerPersonQuote_LtSurge,\n    gFameCheckerPersonQuote_Erika,\n    gFameCheckerPersonQuote_Koga,\n    gFameCheckerPersonQuote_Sabrina,\n    gFameCheckerPersonQuote_Blaine,\n    gFameCheckerPersonQuote_Lorelei,\n    gFameCheckerPersonQuote_Bruno,\n    gFameCheckerPersonQuote_Agatha,\n    gFameCheckerPersonQuote_Lance,\n    gFameCheckerPersonQuote_Bill,\n    gFameCheckerPersonQuote_MrFuji,\n    gFameCheckerPersonQuote_Giovanni\n};\n\nstatic const u8 *const sFameCheckerFlavorTextPointers[] = {\n    gFameCheckerFlavorText_ProfOak0, gFameCheckerFlavorText_ProfOak1, gFameCheckerFlavorText_ProfOak2, gFameCheckerFlavorText_ProfOak3, gFameCheckerFlavorText_ProfOak4, gFameCheckerFlavorText_ProfOak5,\n    gFameCheckerFlavorText_Daisy0, gFameCheckerFlavorText_Daisy1, gFameCheckerFlavorText_Daisy2, gFameCheckerFlavorText_Daisy3, gFameCheckerFlavorText_Daisy4, gFameCheckerFlavorText_Daisy5,\n    gFameCheckerFlavorText_Brock0, gFameCheckerFlavorText_Brock1, gFameCheckerFlavorText_Brock2, gFameCheckerFlavorText_Brock3, gFameCheckerFlavorText_Brock4, gFameCheckerFlavorText_Brock5,\n    gFameCheckerFlavorText_Misty0, gFameCheckerFlavorText_Misty1, gFameCheckerFlavorText_Misty2, gFameCheckerFlavorText_Misty3, gFameCheckerFlavorText_Misty4, gFameCheckerFlavorText_Misty5,\n    gFameCheckerFlavorText_LtSurge0, gFameCheckerFlavorText_LtSurge1, gFameCheckerFlavorText_LtSurge2, gFameCheckerFlavorText_LtSurge3, gFameCheckerFlavorText_LtSurge4, gFameCheckerFlavorText_LtSurge5,\n    gFameCheckerFlavorText_Erika0, gFameCheckerFlavorText_Erika1, gFameCheckerFlavorText_Erika2, gFameCheckerFlavorText_Erika3, gFameCheckerFlavorText_Erika4, gFameCheckerFlavorText_Erika5,\n    gFameCheckerFlavorText_Koga0, gFameCheckerFlavorText_Koga1, gFameCheckerFlavorText_Koga2, gFameCheckerFlavorText_Koga3, gFameCheckerFlavorText_Koga4, gFameCheckerFlavorText_Koga5,\n    gFameCheckerFlavorText_Sabrina0, gFameCheckerFlavorText_Sabrina1, gFameCheckerFlavorText_Sabrina2, gFameCheckerFlavorText_Sabrina3, gFameCheckerFlavorText_Sabrina4, gFameCheckerFlavorText_Sabrina5,\n    gFameCheckerFlavorText_Blaine0, gFameCheckerFlavorText_Blaine1, gFameCheckerFlavorText_Blaine2, gFameCheckerFlavorText_Blaine3, gFameCheckerFlavorText_Blaine4, gFameCheckerFlavorText_Blaine5,\n    gFameCheckerFlavorText_Lorelei0, gFameCheckerFlavorText_Lorelei1, gFameCheckerFlavorText_Lorelei2, gFameCheckerFlavorText_Lorelei3, gFameCheckerFlavorText_Lorelei4, gFameCheckerFlavorText_Lorelei5,\n    gFameCheckerFlavorText_Bruno0, gFameCheckerFlavorText_Bruno1, gFameCheckerFlavorText_Bruno2, gFameCheckerFlavorText_Bruno3, gFameCheckerFlavorText_Bruno4, gFameCheckerFlavorText_Bruno5,\n    gFameCheckerFlavorText_Agatha0, gFameCheckerFlavorText_Agatha1, gFameCheckerFlavorText_Agatha2, gFameCheckerFlavorText_Agatha3, gFameCheckerFlavorText_Agatha4, gFameCheckerFlavorText_Agatha5,\n    gFameCheckerFlavorText_Lance0, gFameCheckerFlavorText_Lance1, gFameCheckerFlavorText_Lance2, gFameCheckerFlavorText_Lance3, gFameCheckerFlavorText_Lance4, gFameCheckerFlavorText_Lance5,\n    gFameCheckerFlavorText_Bill0, gFameCheckerFlavorText_Bill1, gFameCheckerFlavorText_Bill2, gFameCheckerFlavorText_Bill3, gFameCheckerFlavorText_Bill4, gFameCheckerFlavorText_Bill5,\n    gFameCheckerFlavorText_MrFuji0, gFameCheckerFlavorText_MrFuji1, gFameCheckerFlavorText_MrFuji2, gFameCheckerFlavorText_MrFuji3, gFameCheckerFlavorText_MrFuji4, gFameCheckerFlavorText_MrFuji5,\n    gFameCheckerFlavorText_Giovanni0, gFameCheckerFlavorText_Giovanni1, gFameCheckerFlavorText_Giovanni2, gFameCheckerFlavorText_Giovanni3, gFameCheckerFlavorText_Giovanni4, gFameCheckerFlavorText_Giovanni5\n};\n\nstatic const u8 sFameCheckerArrayNpcGraphicsIds[] = {\n    // OAK\n    OBJ_EVENT_GFX_SIGN,\n    OBJ_EVENT_GFX_PROF_OAK,\n    OBJ_EVENT_GFX_WORKER_F,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    OBJ_EVENT_GFX_AGATHA,\n    OBJ_EVENT_GFX_SCIENTIST,\n    // DAISY\n    OBJ_EVENT_GFX_SCIENTIST,\n    OBJ_EVENT_GFX_WORKER_F,\n    OBJ_EVENT_GFX_GENTLEMAN,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    OBJ_EVENT_GFX_OLD_WOMAN,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    // BROCK\n    OBJ_EVENT_GFX_GYM_SIGN,\n    OBJ_EVENT_GFX_BROCK,\n    OBJ_EVENT_GFX_FAT_MAN,\n    OBJ_EVENT_GFX_BOY,\n    OBJ_EVENT_GFX_BALDING_MAN,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    // MISTY\n    OBJ_EVENT_GFX_GYM_SIGN,\n    OBJ_EVENT_GFX_MISTY,\n    OBJ_EVENT_GFX_SWIMMER_M_WATER,\n    OBJ_EVENT_GFX_CAMPER,\n    OBJ_EVENT_GFX_BEAUTY,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    // LTSURGE\n    OBJ_EVENT_GFX_GYM_SIGN,\n    OBJ_EVENT_GFX_LT_SURGE,\n    OBJ_EVENT_GFX_GENTLEMAN,\n    OBJ_EVENT_GFX_GENTLEMAN,\n    OBJ_EVENT_GFX_SAILOR,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    // ERIKA\n    OBJ_EVENT_GFX_GYM_SIGN,\n    OBJ_EVENT_GFX_ERIKA,\n    OBJ_EVENT_GFX_LASS,\n    OBJ_EVENT_GFX_BEAUTY,\n    OBJ_EVENT_GFX_ERIKA,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    // KOGA\n    OBJ_EVENT_GFX_GYM_SIGN,\n    OBJ_EVENT_GFX_KOGA,\n    OBJ_EVENT_GFX_ROCKER,\n    OBJ_EVENT_GFX_LASS,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    OBJ_EVENT_GFX_BALDING_MAN,\n    // SABRINA\n    OBJ_EVENT_GFX_GYM_SIGN,\n    OBJ_EVENT_GFX_MAN,\n    OBJ_EVENT_GFX_SABRINA,\n    OBJ_EVENT_GFX_SABRINA,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    OBJ_EVENT_GFX_COOLTRAINER_M,\n    // BLAINE\n    OBJ_EVENT_GFX_GYM_SIGN,\n    OBJ_EVENT_GFX_BLAINE,\n    OBJ_EVENT_GFX_SCIENTIST,\n    OBJ_EVENT_GFX_WOMAN_2,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    // LORELEI\n    OBJ_EVENT_GFX_LORELEI,\n    OBJ_EVENT_GFX_LORELEI,\n    OBJ_EVENT_GFX_OLD_MAN_1,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    OBJ_EVENT_GFX_LITTLE_GIRL,\n    OBJ_EVENT_GFX_OLD_WOMAN,\n    // BRUNO\n    OBJ_EVENT_GFX_BRUNO,\n    OBJ_EVENT_GFX_BRUNO,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    OBJ_EVENT_GFX_BLACKBELT,\n    OBJ_EVENT_GFX_BEAUTY,\n    OBJ_EVENT_GFX_BLACKBELT,\n    // AGATHA\n    OBJ_EVENT_GFX_AGATHA,\n    OBJ_EVENT_GFX_BLACKBELT,\n    OBJ_EVENT_GFX_BLACKBELT,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    OBJ_EVENT_GFX_AGATHA,\n    OBJ_EVENT_GFX_OLD_WOMAN,\n    // LANCE\n    OBJ_EVENT_GFX_LANCE,\n    OBJ_EVENT_GFX_LANCE,\n    OBJ_EVENT_GFX_BATTLE_GIRL,\n    OBJ_EVENT_GFX_WOMAN_1,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    OBJ_EVENT_GFX_COOLTRAINER_M,\n    // BILL\n    OBJ_EVENT_GFX_BLUE,\n    OBJ_EVENT_GFX_YOUNGSTER,\n    OBJ_EVENT_GFX_OLD_MAN_1,\n    OBJ_EVENT_GFX_CELIO,\n    OBJ_EVENT_GFX_CELIO,\n    OBJ_EVENT_GFX_CELIO,\n    // MRFUJI\n    OBJ_EVENT_GFX_LITTLE_GIRL,\n    OBJ_EVENT_GFX_ROCKET_M,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    OBJ_EVENT_GFX_BALDING_MAN,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    OBJ_EVENT_GFX_CLIPBOARD,\n    // GIOVANNI\n    OBJ_EVENT_GFX_GIOVANNI,\n    OBJ_EVENT_GFX_SCIENTIST,\n    OBJ_EVENT_GFX_SCIENTIST,\n    OBJ_EVENT_GFX_GIOVANNI,\n    OBJ_EVENT_GFX_GYM_GUY,\n    OBJ_EVENT_GFX_SCIENTIST\n};\n\nstatic const u8 *const sFlavorTextOriginLocationTexts[] = {\n    gFameCheckerFlavorTextOriginLocation_ProfOak0, gFameCheckerFlavorTextOriginLocation_ProfOak1, gFameCheckerFlavorTextOriginLocation_ProfOak2, gFameCheckerFlavorTextOriginLocation_ProfOak3, gFameCheckerFlavorTextOriginLocation_ProfOak4, gFameCheckerFlavorTextOriginLocation_ProfOak5,\n    gFameCheckerFlavorTextOriginLocation_Daisy0, gFameCheckerFlavorTextOriginLocation_Daisy1, gFameCheckerFlavorTextOriginLocation_Daisy2, gFameCheckerFlavorTextOriginLocation_Daisy3, gFameCheckerFlavorTextOriginLocation_Daisy4, gFameCheckerFlavorTextOriginLocation_Daisy5,\n    gFameCheckerFlavorTextOriginLocation_Brock0, gFameCheckerFlavorTextOriginLocation_Brock1, gFameCheckerFlavorTextOriginLocation_Brock2, gFameCheckerFlavorTextOriginLocation_Brock3, gFameCheckerFlavorTextOriginLocation_Brock4, gFameCheckerFlavorTextOriginLocation_Brock5,\n    gFameCheckerFlavorTextOriginLocation_Misty0, gFameCheckerFlavorTextOriginLocation_Misty1, gFameCheckerFlavorTextOriginLocation_Misty2, gFameCheckerFlavorTextOriginLocation_Misty3, gFameCheckerFlavorTextOriginLocation_Misty4, gFameCheckerFlavorTextOriginLocation_Misty5,\n    gFameCheckerFlavorTextOriginLocation_LtSurge0, gFameCheckerFlavorTextOriginLocation_LtSurge1, gFameCheckerFlavorTextOriginLocation_LtSurge2, gFameCheckerFlavorTextOriginLocation_LtSurge3, gFameCheckerFlavorTextOriginLocation_LtSurge4, gFameCheckerFlavorTextOriginLocation_LtSurge5,\n    gFameCheckerFlavorTextOriginLocation_Erika0, gFameCheckerFlavorTextOriginLocation_Erika1, gFameCheckerFlavorTextOriginLocation_Erika2, gFameCheckerFlavorTextOriginLocation_Erika3, gFameCheckerFlavorTextOriginLocation_Erika4, gFameCheckerFlavorTextOriginLocation_Erika5,\n    gFameCheckerFlavorTextOriginLocation_Koga0, gFameCheckerFlavorTextOriginLocation_Koga1, gFameCheckerFlavorTextOriginLocation_Koga2, gFameCheckerFlavorTextOriginLocation_Koga3, gFameCheckerFlavorTextOriginLocation_Koga4, gFameCheckerFlavorTextOriginLocation_Koga5,\n    gFameCheckerFlavorTextOriginLocation_Sabrina0, gFameCheckerFlavorTextOriginLocation_Sabrina1, gFameCheckerFlavorTextOriginLocation_Sabrina2, gFameCheckerFlavorTextOriginLocation_Sabrina3, gFameCheckerFlavorTextOriginLocation_Sabrina4, gFameCheckerFlavorTextOriginLocation_Sabrina5,\n    gFameCheckerFlavorTextOriginLocation_Blaine0, gFameCheckerFlavorTextOriginLocation_Blaine1, gFameCheckerFlavorTextOriginLocation_Blaine2, gFameCheckerFlavorTextOriginLocation_Blaine3, gFameCheckerFlavorTextOriginLocation_Blaine4, gFameCheckerFlavorTextOriginLocation_Blaine5,\n    gFameCheckerFlavorTextOriginLocation_Lorelei0, gFameCheckerFlavorTextOriginLocation_Lorelei1, gFameCheckerFlavorTextOriginLocation_Lorelei2, gFameCheckerFlavorTextOriginLocation_Lorelei3, gFameCheckerFlavorTextOriginLocation_Lorelei4, gFameCheckerFlavorTextOriginLocation_Lorelei5,\n    gFameCheckerFlavorTextOriginLocation_Bruno0, gFameCheckerFlavorTextOriginLocation_Bruno1, gFameCheckerFlavorTextOriginLocation_Bruno2, gFameCheckerFlavorTextOriginLocation_Bruno3, gFameCheckerFlavorTextOriginLocation_Bruno4, gFameCheckerFlavorTextOriginLocation_Bruno5,\n    gFameCheckerFlavorTextOriginLocation_Agatha0, gFameCheckerFlavorTextOriginLocation_Agatha1, gFameCheckerFlavorTextOriginLocation_Agatha2, gFameCheckerFlavorTextOriginLocation_Agatha3, gFameCheckerFlavorTextOriginLocation_Agatha4, gFameCheckerFlavorTextOriginLocation_Agatha5,\n    gFameCheckerFlavorTextOriginLocation_Lance0, gFameCheckerFlavorTextOriginLocation_Lance1, gFameCheckerFlavorTextOriginLocation_Lance2, gFameCheckerFlavorTextOriginLocation_Lance3, gFameCheckerFlavorTextOriginLocation_Lance4, gFameCheckerFlavorTextOriginLocation_Lance5,\n    gFameCheckerFlavorTextOriginLocation_Bill0, gFameCheckerFlavorTextOriginLocation_Bill1, gFameCheckerFlavorTextOriginLocation_Bill2, gFameCheckerFlavorTextOriginLocation_Bill3, gFameCheckerFlavorTextOriginLocation_Bill4, gFameCheckerFlavorTextOriginLocation_Bill5,\n    gFameCheckerFlavorTextOriginLocation_MrFuji0, gFameCheckerFlavorTextOriginLocation_MrFuji1, gFameCheckerFlavorTextOriginLocation_MrFuji2, gFameCheckerFlavorTextOriginLocation_MrFuji3, gFameCheckerFlavorTextOriginLocation_MrFuji4, gFameCheckerFlavorTextOriginLocation_MrFuji5,\n    gFameCheckerFlavorTextOriginLocation_Giovanni0, gFameCheckerFlavorTextOriginLocation_Giovanni1, gFameCheckerFlavorTextOriginLocation_Giovanni2, gFameCheckerFlavorTextOriginLocation_Giovanni3, gFameCheckerFlavorTextOriginLocation_Giovanni4, gFameCheckerFlavorTextOriginLocation_Giovanni5\n};\n\nstatic const u8 *const sFlavorTextOriginObjectNameTexts[] = {\n    gFameCheckerFlavorTextOriginObjectName_ProfOak0, gFameCheckerFlavorTextOriginObjectName_ProfOak1, gFameCheckerFlavorTextOriginObjectName_ProfOak2, gFameCheckerFlavorTextOriginObjectName_ProfOak3, gFameCheckerFlavorTextOriginObjectName_ProfOak4, gFameCheckerFlavorTextOriginObjectName_ProfOak5,\n    gFameCheckerFlavorTextOriginObjectName_Daisy0, gFameCheckerFlavorTextOriginObjectName_Daisy1, gFameCheckerFlavorTextOriginObjectName_Daisy2, gFameCheckerFlavorTextOriginObjectName_Daisy3, gFameCheckerFlavorTextOriginObjectName_Daisy4, gFameCheckerFlavorTextOriginObjectName_Daisy5,\n    gFameCheckerFlavorTextOriginObjectName_Brock0, gFameCheckerFlavorTextOriginObjectName_Brock1, gFameCheckerFlavorTextOriginObjectName_Brock2, gFameCheckerFlavorTextOriginObjectName_Brock3, gFameCheckerFlavorTextOriginObjectName_Brock4, gFameCheckerFlavorTextOriginObjectName_Brock5,\n    gFameCheckerFlavorTextOriginObjectName_Misty0, gFameCheckerFlavorTextOriginObjectName_Misty1, gFameCheckerFlavorTextOriginObjectName_Misty2, gFameCheckerFlavorTextOriginObjectName_Misty3, gFameCheckerFlavorTextOriginObjectName_Misty4, gFameCheckerFlavorTextOriginObjectName_Misty5,\n    gFameCheckerFlavorTextOriginObjectName_LtSurge0, gFameCheckerFlavorTextOriginObjectName_LtSurge1, gFameCheckerFlavorTextOriginObjectName_LtSurge2, gFameCheckerFlavorTextOriginObjectName_LtSurge3, gFameCheckerFlavorTextOriginObjectName_LtSurge4, gFameCheckerFlavorTextOriginObjectName_LtSurge5,\n    gFameCheckerFlavorTextOriginObjectName_Erika0, gFameCheckerFlavorTextOriginObjectName_Erika1, gFameCheckerFlavorTextOriginObjectName_Erika2, gFameCheckerFlavorTextOriginObjectName_Erika3, gFameCheckerFlavorTextOriginObjectName_Erika4, gFameCheckerFlavorTextOriginObjectName_Erika5,\n    gFameCheckerFlavorTextOriginObjectName_Koga0, gFameCheckerFlavorTextOriginObjectName_Koga1, gFameCheckerFlavorTextOriginObjectName_Koga2, gFameCheckerFlavorTextOriginObjectName_Koga3, gFameCheckerFlavorTextOriginObjectName_Koga4, gFameCheckerFlavorTextOriginObjectName_Koga5,\n    gFameCheckerFlavorTextOriginObjectName_Sabrina0, gFameCheckerFlavorTextOriginObjectName_Sabrina1, gFameCheckerFlavorTextOriginObjectName_Sabrina2, gFameCheckerFlavorTextOriginObjectName_Sabrina3, gFameCheckerFlavorTextOriginObjectName_Sabrina4, gFameCheckerFlavorTextOriginObjectName_Sabrina5,\n    gFameCheckerFlavorTextOriginObjectName_Blaine0, gFameCheckerFlavorTextOriginObjectName_Blaine1, gFameCheckerFlavorTextOriginObjectName_Blaine2, gFameCheckerFlavorTextOriginObjectName_Blaine3, gFameCheckerFlavorTextOriginObjectName_Blaine4, gFameCheckerFlavorTextOriginObjectName_Blaine5,\n    gFameCheckerFlavorTextOriginObjectName_Lorelei0, gFameCheckerFlavorTextOriginObjectName_Lorelei1, gFameCheckerFlavorTextOriginObjectName_Lorelei2, gFameCheckerFlavorTextOriginObjectName_Lorelei3, gFameCheckerFlavorTextOriginObjectName_Lorelei4, gFameCheckerFlavorTextOriginObjectName_Lorelei5,\n    gFameCheckerFlavorTextOriginObjectName_Bruno0, gFameCheckerFlavorTextOriginObjectName_Bruno1, gFameCheckerFlavorTextOriginObjectName_Bruno2, gFameCheckerFlavorTextOriginObjectName_Bruno3, gFameCheckerFlavorTextOriginObjectName_Bruno4, gFameCheckerFlavorTextOriginObjectName_Bruno5,\n    gFameCheckerFlavorTextOriginObjectName_Agatha0, gFameCheckerFlavorTextOriginObjectName_Agatha1, gFameCheckerFlavorTextOriginObjectName_Agatha2, gFameCheckerFlavorTextOriginObjectName_Agatha3, gFameCheckerFlavorTextOriginObjectName_Agatha4, gFameCheckerFlavorTextOriginObjectName_Agatha5,\n    gFameCheckerFlavorTextOriginObjectName_Lance0, gFameCheckerFlavorTextOriginObjectName_Lance1, gFameCheckerFlavorTextOriginObjectName_Lance2, gFameCheckerFlavorTextOriginObjectName_Lance3, gFameCheckerFlavorTextOriginObjectName_Lance4, gFameCheckerFlavorTextOriginObjectName_Lance5,\n    gFameCheckerFlavorTextOriginObjectName_Bill0, gFameCheckerFlavorTextOriginObjectName_Bill1, gFameCheckerFlavorTextOriginObjectName_Bill2, gFameCheckerFlavorTextOriginObjectName_Bill3, gFameCheckerFlavorTextOriginObjectName_Bill4, gFameCheckerFlavorTextOriginObjectName_Bill5,\n    gFameCheckerFlavorTextOriginObjectName_MrFuji0, gFameCheckerFlavorTextOriginObjectName_MrFuji1, gFameCheckerFlavorTextOriginObjectName_MrFuji2, gFameCheckerFlavorTextOriginObjectName_MrFuji3, gFameCheckerFlavorTextOriginObjectName_MrFuji4, gFameCheckerFlavorTextOriginObjectName_MrFuji5,\n    gFameCheckerFlavorTextOriginObjectName_Giovanni0, gFameCheckerFlavorTextOriginObjectName_Giovanni1, gFameCheckerFlavorTextOriginObjectName_Giovanni2, gFameCheckerFlavorTextOriginObjectName_Giovanni3, gFameCheckerFlavorTextOriginObjectName_Giovanni4, gFameCheckerFlavorTextOriginObjectName_Giovanni5\n};\n\nstatic const struct SpriteSheet sUISpriteSheets[] = {\n    {sSelectorCursorSpriteGfx,   0x400, SPRITETAG_SELECTOR_CURSOR},\n    {sQuestionMarkSpriteGfx,     0x100, SPRITETAG_QUESTION_MARK},\n    {sSpinningPokeballSpriteGfx, 0x1e0, SPRITETAG_SPINNING_POKEBALL},\n    {sDaisySpriteGfx,            0x800, SPRITETAG_DAISY},\n    {sFujiSpriteGfx,             0x800, SPRITETAG_FUJI},\n    {sOakSpriteGfx,              0x800, SPRITETAG_OAK},\n    {sBillSpriteGfx,             0x800, SPRITETAG_BILL},\n    {}\n};\n\nstatic const struct SpritePalette sUISpritePalettes[] = {\n    {sSelectorCursorSpritePalette, SPRITETAG_SELECTOR_CURSOR},\n    {sSpinningPokeballSpritePalette, SPRITETAG_SPINNING_POKEBALL},\n    {}\n};\n\nstatic const struct BgTemplate sUIBgTemplates[4] = {\n    {\n        .bg = 3,\n        .charBaseIndex = 3,\n        .mapBaseIndex =  30,\n        .screenSize = 0,\n        .paletteMode = FALSE,\n        .priority = 3,\n        .baseTile = 0x000\n    },\n    {\n        .bg = 2,\n        .charBaseIndex = 3,\n        .mapBaseIndex =  27,\n        .screenSize = 0,\n        .paletteMode = FALSE,\n        .priority = 2,\n        .baseTile = 0x000\n    },\n    {\n        .bg = 1,\n        .charBaseIndex = 3,\n        .mapBaseIndex =  28,\n        .screenSize = 1,\n        .paletteMode = FALSE,\n        .priority = 0,\n        .baseTile = 0x000\n    },\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex =  31,\n        .screenSize = 0,\n        .paletteMode = FALSE,\n        .priority = 2,\n        .baseTile = 0x000\n    },\n};\n\nstatic const struct WindowTemplate sUIWindowTemplates[] = {\n    [FCWINDOWID_LIST] = {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 3,\n        .width = 8,\n        .height = 10,\n        .paletteNum = 15,\n        .baseBlock = 20\n    },\n    [FCWINDOWID_UIHELP] = {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 0,\n        .width = 24,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 20 + 8 * 10\n    },\n    [FCWINDOWID_MSGBOX] = {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 20 + 8 * 10 + 24 * 2\n    },\n    [FCWINDOWID_ICONDESC] = {\n        .bg = 0,\n        .tilemapLeft = 15,\n        .tilemapTop = 10,\n        .width = 11,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 20 + 8 * 10 + 24 * 2 + 26 * 4\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const union AnimCmd sSelectorCursorAnim0[] = {\n    ANIMCMD_FRAME( 0, 15),\n    ANIMCMD_FRAME(16, 15),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sSelectorCursorAnims[] = {\n    sSelectorCursorAnim0\n};\n\nstatic const struct OamData sSelectorCursorOamData = {\n    .size = 2,\n    .priority = 2\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_SelectorCursor = {\n    SPRITETAG_SELECTOR_CURSOR, SPRITETAG_SELECTOR_CURSOR, &sSelectorCursorOamData, sSelectorCursorAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy\n};\n\nstatic const u8 sUnused[8] = {}; // ???\n\nstatic const struct OamData sQuestionMarkTileOamData = {\n    .shape = ST_OAM_V_RECTANGLE,\n    .size = 2,\n    .priority = 2\n};\n\nstatic const union AnimCmd sQuestionMarkTileAnim0[] = {\n    ANIMCMD_FRAME( 0, 10),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sQuestionMarkTileAnims[] = {\n    sQuestionMarkTileAnim0\n};\n\nstatic const struct SpriteTemplate sQuestionMarkTileSpriteTemplate = {\n    SPRITETAG_QUESTION_MARK, 0xffff, &sQuestionMarkTileOamData, sQuestionMarkTileAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy\n};\n\nstatic const union AnimCmd sSpinningPokeballAnim0[] = {\n    ANIMCMD_FRAME( 0, 10),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpinningPokeballAnims[] = {\n    sSpinningPokeballAnim0\n};\n\nstatic const struct OamData sSpinningPokeballOamData = {\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .size = 2\n};\n\nstatic const union AffineAnimCmd sSpinningPokeballAffineAnim0[] = {\n    AFFINEANIMCMD_FRAME(0, 0, 4, 20),\n    AFFINEANIMCMD_JUMP(0)\n};\n\nstatic const union AffineAnimCmd *const sSpinningPokeballAffineAnims[] = {\n    sSpinningPokeballAffineAnim0\n};\n\nstatic const struct SpriteTemplate sSpinningPokeballSpriteTemplate = {\n    SPRITETAG_SPINNING_POKEBALL, SPRITETAG_SPINNING_POKEBALL, &sSpinningPokeballOamData, sSpinningPokeballAnims, NULL, sSpinningPokeballAffineAnims, SpriteCB_FCSpinningPokeball\n};\n\nstatic const union AnimCmd sDaisyFujiOakBillAnim0[] = {\n    ANIMCMD_FRAME( 0, 15),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sDaisyFujiOakBillAnims[] = {\n    sDaisyFujiOakBillAnim0\n};\n\nstatic const struct OamData sDaisyFujiOakBillOamData = {\n    .size = 3\n};\n\nstatic const struct SpriteTemplate sDaisySpriteTemplate = {\n    SPRITETAG_DAISY, 0xffff, &sDaisyFujiOakBillOamData, sDaisyFujiOakBillAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sFujiSpriteTemplate = {\n    SPRITETAG_FUJI, 0xffff, &sDaisyFujiOakBillOamData, sDaisyFujiOakBillAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sOakSpriteTemplate = {\n    SPRITETAG_OAK, 0xffff, &sDaisyFujiOakBillOamData, sDaisyFujiOakBillAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sBillSpriteTemplate = {\n    SPRITETAG_BILL, 0xffff, &sDaisyFujiOakBillOamData, sDaisyFujiOakBillAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy\n};\n\nstatic void FC_VBlankCallback(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void MainCB2_FameCheckerMain(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nvoid UseFameChecker(MainCallback savedCallback)\n{\n    SetVBlankCallback(NULL);\n    sFameCheckerData = AllocZeroed(sizeof(struct FameCheckerData));\n    sFameCheckerData->savedCallback = savedCallback;\n    sFameCheckerData->listMenuCurIdx = 0;\n    sFameCheckerData->listMenuTopIdx2 = 0;\n    sFameCheckerData->listMenuDrawnSelIdx = 0;\n    sFameCheckerData->viewingFlavorText = FALSE;\n    PlaySE(SE_M_SWIFT);\n    SetMainCallback2(MainCB2_LoadFameChecker);\n}\n\nstatic void MainCB2_LoadFameChecker(void)\n{\n    switch (gMain.state)\n    {\n        case 0:\n            SetVBlankCallback(NULL);\n            FCSetup_ClearVideoRegisters();\n            gMain.state++;\n            break;\n        case 1:\n            FCSetup_ResetTasksAndSpriteResources();\n            gMain.state++;\n            break;\n        case 2:\n            sBg3TilemapBuffer = AllocZeroed(BG_SCREEN_SIZE);     // 256x256\n            sBg1TilemapBuffer = AllocZeroed(BG_SCREEN_SIZE * 2); // 512x256\n            sBg2TilemapBuffer = AllocZeroed(BG_SCREEN_SIZE);     // 256x256\n            ResetBgsAndClearDma3BusyFlags(0);\n            InitBgsFromTemplates(0, sUIBgTemplates, NELEMS(sUIBgTemplates));\n            SetBgTilemapBuffer(3, sBg3TilemapBuffer);\n            SetBgTilemapBuffer(2, sBg2TilemapBuffer);\n            SetBgTilemapBuffer(1, sBg1TilemapBuffer);\n            FCSetup_ResetBGCoords();\n            gMain.state++;\n            break;\n        case 3:\n            LoadBgTiles(3, gFameCheckerBgTiles, sizeof(gFameCheckerBgTiles), 0);\n            CopyToBgTilemapBufferRect(3, gFameCheckerBg3Tilemap, 0, 0, 32, 32);\n            LoadPalette(&gFameCheckerBgPals[0], BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP);\n            LoadPalette(&gFameCheckerBgPals[1], BG_PLTT_ID(1), PLTT_SIZE_4BPP);\n            CopyToBgTilemapBufferRect(2, gFameCheckerBg2Tilemap, 0, 0, 32, 32);\n            CopyToBgTilemapBufferRect_ChangePalette(1, sFameCheckerTilemap, 30, 0, 32, 32, 0x11);\n            LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n            gMain.state++;\n            break;\n        case 4:\n            if (IsDma3ManagerBusyWithBgCopy() != TRUE)\n            {\n                ShowBg(0);\n                ShowBg(1);\n                ShowBg(2);\n                ShowBg(3);\n                CopyBgTilemapBufferToVram(3);\n                CopyBgTilemapBufferToVram(2);\n                CopyBgTilemapBufferToVram(1);\n                gMain.state++;\n            }\n            break;\n        case 5:\n            InitWindows(sUIWindowTemplates);\n            DeactivateAllTextPrinters();\n            Setup_DrawMsgAndListBoxes();\n            sListMenuItems = AllocZeroed(17 * sizeof(struct ListMenuItem));\n            FC_CreateListMenu();\n            gMain.state++;\n            break;\n        case 6:\n            LoadUISpriteSheetsAndPalettes();\n            CreateAllFlavorTextIcons(FAMECHECKER_OAK);\n            WipeMsgBoxAndTransfer();\n            BeginNormalPaletteFade(PALETTES_ALL,0, 16, 0, 0);\n            gMain.state++;\n            break;\n        case 7:\n            FCSetup_TurnOnDisplay();\n            SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD);\n            SetGpuReg(REG_OFFSET_BLDALPHA, 0x07);\n            SetGpuReg(REG_OFFSET_BLDY, 0x08);\n            SetVBlankCallback(FC_VBlankCallback);\n            sFameCheckerData->listMenuTopIdx = 0;\n            FC_CreateScrollIndicatorArrowPair();\n            UpdateInfoBoxTilemap(1, 4);\n            CreateTask(Task_WaitFadeOnInit, 0x08);\n            SetMainCallback2(MainCB2_FameCheckerMain);\n            gMain.state = 0;\n            break;\n    }\n}\n\nstatic void LoadUISpriteSheetsAndPalettes(void)\n{\n    LoadSpriteSheets(sUISpriteSheets);\n    LoadSpritePalettes(sUISpritePalettes);\n}\n\nstatic void Task_WaitFadeOnInit(u8 taskId)\n{\n    if (!gPaletteFade.active)\n        gTasks[taskId].func = Task_TopMenuHandleInput;\n}\n\nstatic void Task_TopMenuHandleInput(u8 taskId)\n{\n    u16 cursorPos;\n    u32 i;\n    struct Task *task = &gTasks[taskId];\n    s16 * data = gTasks[taskId].data;\n    if (FindTaskIdByFunc(Task_FCOpenOrCloseInfoBox) == 0xFF)\n    {\n        RunTextPrinters();\n        if ((JOY_NEW(SELECT_BUTTON)) && !sFameCheckerData->inPickMode && sFameCheckerData->savedCallback != CB2_BagMenuFromStartMenu)\n            task->func = Task_StartToCloseFameChecker;\n        else if (JOY_NEW(START_BUTTON))\n        {\n            cursorPos = FameCheckerGetCursorY();\n            if (TryExitPickMode(taskId) == TRUE)\n            {\n                PlaySE(SE_M_LOCK_ON);\n            }\n            else if (cursorPos != sFameCheckerData->numUnlockedPersons - 1) // anything but CANCEL\n            {\n                PlaySE(SE_M_LOCK_ON);\n                FillWindowPixelRect(FCWINDOWID_ICONDESC, PIXEL_FILL(0), 0, 0, 88, 32);\n                FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_ICONDESC);\n                UpdateInfoBoxTilemap(2, 4);\n                UpdateInfoBoxTilemap(1, 5);\n                PrintUIHelp(1);\n                task->data[2] = CreatePersonPicSprite(sFameCheckerData->unlockedPersons[cursorPos]);\n                gSprites[task->data[2]].x2 = 0xF0;\n                gSprites[task->data[2]].data[0] = 1;\n                task->data[3] = CreateSpinningPokeballSprite();\n                gSprites[task->data[3]].x2 = 0xF0;\n                gSprites[task->data[3]].data[0] = 1;\n                task->func = Task_EnterPickMode;\n            }\n        }\n        else if (JOY_NEW(A_BUTTON))\n        {\n            cursorPos = ListMenu_ProcessInput(0);\n            if (cursorPos == sFameCheckerData->numUnlockedPersons - 1) // CANCEL\n                task->func = Task_StartToCloseFameChecker;\n            else if (sFameCheckerData->inPickMode)\n            {\n                if (!IsTextPrinterActive(2) && HasUnlockedAllFlavorTextsForCurrentPerson() == TRUE)\n                    GetPickModeText();\n            }\n            else if (sFameCheckerData->personHasUnlockedPanels)\n            {\n                PlaySE(SE_SELECT);\n                task->data[0] = CreateFlavorTextIconSelectorCursorSprite(task->data[1]);\n                for (i = 0; i < 6; i++)\n                {\n                    if (i != task->data[1])\n                        SetMessageSelectorIconObjMode(sFameCheckerData->spriteIds[i], ST_OAM_OBJ_BLEND);\n                }\n                gIconDescriptionBoxIsOpen = 0xFF;\n                PlaceListMenuCursor(FALSE);\n                PrintUIHelp(2);\n                if (gSprites[sFameCheckerData->spriteIds[task->data[1]]].data[1] != 0xFF) // not a ? tile\n                {\n                    PrintSelectedNameInBrightGreen(taskId);\n                    UpdateIconDescriptionBox(data[1]);\n                }\n                FreeListMenuSelectorArrowPairResources();\n                task->func = Task_FlavorTextDisplayHandleInput;\n            }\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            if (TryExitPickMode(taskId) != TRUE)\n                task->func = Task_StartToCloseFameChecker;\n        }\n        else\n            ListMenu_ProcessInput(0);\n    }\n}\n\nstatic bool8 TryExitPickMode(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    if (sFameCheckerData->inPickMode)\n    {\n        gSprites[task->data[2]].data[0] = 2;\n        gSprites[task->data[2]].x2 += 10;\n        gSprites[task->data[3]].data[0] = 2;\n        gSprites[task->data[3]].x2 += 10;\n        WipeMsgBoxAndTransfer();\n        task->func = Task_ExitPickMode;\n        MessageBoxPrintEmptyText();\n        sFameCheckerData->pickModeOverCancel = FALSE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void MessageBoxPrintEmptyText(void)\n{\n    AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, FONT_NORMAL, gFameCheckerText_ClearTextbox, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n}\n\nstatic void Task_EnterPickMode(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    if (gSprites[task->data[2]].data[0] == 0)\n    {\n        GetPickModeText();\n        sFameCheckerData->inPickMode = TRUE;\n        task->func = Task_TopMenuHandleInput;\n    }\n    else\n        ChangeBgX(1, 0xA00, 1);\n}\n\nstatic void Task_ExitPickMode(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    if (GetBgX(1) != 0)\n        ChangeBgX(1, 0xA00, 2);\n    else\n        ChangeBgX(1, 0x000, 0);\n    if (gSprites[task->data[2]].data[0] == 0)\n    {\n        if (sFameCheckerData->personHasUnlockedPanels)\n            PrintUIHelp(0);\n        UpdateInfoBoxTilemap(1, 4);\n        UpdateInfoBoxTilemap(2, 2);\n        sFameCheckerData->inPickMode = FALSE;\n        DestroyPersonPicSprite(taskId, FameCheckerGetCursorY());\n        task->func = Task_TopMenuHandleInput;\n        gSprites[task->data[3]].callback = SpriteCB_DestroySpinningPokeball;\n    }\n}\n\nstatic void Task_FlavorTextDisplayHandleInput(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    s16 *data = gTasks[taskId].data;\n\n    RunTextPrinters();\n    if (JOY_NEW(A_BUTTON) && !IsTextPrinterActive(2))\n    {\n        u8 spriteId = sFameCheckerData->spriteIds[data[1]];\n        if (gSprites[spriteId].data[1] != 0xFF)\n            PrintSelectedNameInBrightGreen(taskId);\n    }\n    if (JOY_NEW(B_BUTTON))\n    {\n        u32 i;\n        PlaySE(SE_SELECT);\n        for (i = 0; i < 6; i++)\n            SetMessageSelectorIconObjMode(sFameCheckerData->spriteIds[i], ST_OAM_OBJ_NORMAL);\n        WipeMsgBoxAndTransfer();\n        gSprites[task->data[0]].callback = SpriteCB_DestroyFlavorTextIconSelectorCursor;\n        if (gIconDescriptionBoxIsOpen != 0xFF)\n            UpdateIconDescriptionBoxOff();\n        PlaceListMenuCursor(TRUE);\n        PrintUIHelp(0);\n        FC_CreateScrollIndicatorArrowPair();\n        MessageBoxPrintEmptyText();\n        task->func = Task_TopMenuHandleInput;\n    }\n    else if (JOY_NEW(DPAD_UP) || JOY_NEW(DPAD_DOWN))\n    {\n        if (task->data[1] >= 3)\n        {\n            task->data[1] -= 3;\n            FC_MoveSelectorCursor(taskId, 0, -0x1b);\n        }\n        else\n        {\n            task->data[1] += 3;\n            FC_MoveSelectorCursor(taskId, 0, +0x1b);\n        }\n    }\n    else if (JOY_NEW(DPAD_LEFT))\n    {\n        if (task->data[1] == 0 || task->data[1] % 3 == 0)\n        {\n            task->data[1] += 2;\n            FC_MoveSelectorCursor(taskId, +0x5e, 0);\n        }\n        else\n        {\n            task->data[1]--;\n            FC_MoveSelectorCursor(taskId, -0x2f, 0);\n        }\n    }\n    else if (JOY_NEW(DPAD_RIGHT))\n    {\n        if ((task->data[1] + 1) % 3 == 0)\n        {\n            task->data[1] -= 2;\n            FC_MoveSelectorCursor(taskId, -0x5e, 0);\n        }\n        else\n        {\n            task->data[1]++;\n            FC_MoveSelectorCursor(taskId, +0x2f, 0);\n        }\n    }\n}\n\nstatic void FC_MoveSelectorCursor(u8 taskId, s8 dx, s8 dy)\n{\n    u32 i;\n    s16 *data = gTasks[taskId].data;\n    PlaySE(SE_M_SWAGGER2);\n    gSprites[data[0]].x += dx;\n    gSprites[data[0]].y += dy;\n    for (i = 0; i < 6; i++)\n        SetMessageSelectorIconObjMode(sFameCheckerData->spriteIds[i], ST_OAM_OBJ_BLEND);\n    FillWindowPixelRect(FCWINDOWID_MSGBOX, PIXEL_FILL(1), 0, 0, 0xd0, 0x20);\n    MessageBoxPrintEmptyText();\n    if (SetMessageSelectorIconObjMode(sFameCheckerData->spriteIds[data[1]], ST_OAM_OBJ_NORMAL) == TRUE)\n    {\n        PrintSelectedNameInBrightGreen(taskId);\n        UpdateIconDescriptionBox(data[1]);\n    }\n    else if (gIconDescriptionBoxIsOpen != 0xFF)\n        UpdateIconDescriptionBoxOff();\n}\n\nstatic void GetPickModeText(void)\n{\n    s32 whichText = 0;\n    u16 who = FameCheckerGetCursorY();\n    if (gSaveBlock1Ptr->fameChecker[sFameCheckerData->unlockedPersons[who]].pickState != FCPICKSTATE_COLORED)\n    {\n        WipeMsgBoxAndTransfer();\n        MessageBoxPrintEmptyText();\n    }\n    else\n    {\n        FillWindowPixelRect(FCWINDOWID_MSGBOX, PIXEL_FILL(1), 0, 0, 0xd0, 0x20);\n        if (HasUnlockedAllFlavorTextsForCurrentPerson() == TRUE)\n            whichText = NUM_FAMECHECKER_PERSONS;\n        StringExpandPlaceholders(gStringVar4, sFameCheckerNameAndQuotesPointers[sFameCheckerData->unlockedPersons[who] + whichText]);\n        AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, FONT_NORMAL, gStringVar4, GetTextSpeedSetting(), NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n        FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);\n    }\n}\n\nstatic void PrintSelectedNameInBrightGreen(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u16 cursorPos = FameCheckerGetCursorY();\n    FillWindowPixelRect(FCWINDOWID_MSGBOX, PIXEL_FILL(1), 0, 0, 0xd0, 0x20);\n    StringExpandPlaceholders(gStringVar4, sFameCheckerFlavorTextPointers[sFameCheckerData->unlockedPersons[cursorPos] * 6 + data[1]]);\n    AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, FONT_NORMAL, gStringVar4, GetTextSpeedSetting(), NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);\n}\n\nstatic void WipeMsgBoxAndTransfer(void)\n{\n    FillWindowPixelRect(FCWINDOWID_MSGBOX, PIXEL_FILL(1), 0, 0, 0xd0, 0x20);\n    FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);\n}\n\nstatic void Setup_DrawMsgAndListBoxes(void)\n{\n    LoadStdWindowFrameGfx();\n    DrawDialogueFrame(FCWINDOWID_MSGBOX, TRUE);\n    FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);\n    FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_LIST);\n}\n\nstatic void FC_PutWindowTilemapAndCopyWindowToVramMode3(u8 windowId)\n{\n    PutWindowTilemap(windowId);\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic bool8 SetMessageSelectorIconObjMode(u8 spriteId, u8 objMode)\n{\n    if (gSprites[spriteId].data[1] != 0xFF)\n    {\n        gSprites[spriteId].oam.objMode = objMode;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void Task_StartToCloseFameChecker(u8 taskId)\n{\n    PlaySE(SE_M_SWIFT);\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0);\n    gTasks[taskId].func = Task_DestroyAssetsAndCloseFameChecker;\n}\n\nstatic void Task_DestroyAssetsAndCloseFameChecker(u8 taskId)\n{\n    u32 i;\n\n    if (!gPaletteFade.active)\n    {\n        if (sFameCheckerData->inPickMode)\n        {\n            DestroyPersonPicSprite(taskId, FameCheckerGetCursorY());\n            FreeSpriteOamMatrix(&gSprites[gTasks[taskId].data[3]]);\n            DestroySprite(&gSprites[gTasks[taskId].data[3]]);\n        }\n        for (i = 0; i < 6; i++)\n        {\n            DestroySprite(&gSprites[sFameCheckerData->spriteIds[i]]);\n        }\n        FreeNonTrainerPicTiles();\n        FreeSpinningPokeballSpriteResources();\n        FreeSelectionCursorSpriteResources();\n        FreeQuestionMarkSpriteResources();\n        FreeListMenuSelectorArrowPairResources();\n        SetMainCallback2(sFameCheckerData->savedCallback);\n        DestroyListMenuTask(sFameCheckerData->listMenuTaskId, NULL, NULL);\n        Free(sBg3TilemapBuffer);\n        Free(sBg1TilemapBuffer);\n        Free(sBg2TilemapBuffer);\n        Free(sFameCheckerData);\n        Free(sListMenuItems);\n        FC_DestroyWindow(FCWINDOWID_LIST);\n        FC_DestroyWindow(FCWINDOWID_UIHELP);\n        FC_DestroyWindow(FCWINDOWID_MSGBOX);\n        FC_DestroyWindow(FCWINDOWID_ICONDESC);\n        FreeAllWindowBuffers();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void FC_DestroyWindow(u8 windowId)\n{\n    FillWindowPixelBuffer(windowId, 0);\n    ClearWindowTilemap(windowId);\n    CopyWindowToVram(windowId, COPYWIN_GFX);\n    RemoveWindow(windowId);\n}\n\nstatic u8 AdjustGiovanniIndexIfBeatenInGym(u8 a0)\n{\n    if (HasTrainerBeenFought(TRAINER_LEADER_GIOVANNI) == TRUE)\n    {\n        if (a0 == 9)\n            return FAMECHECKER_GIOVANNI;\n        if (a0 > 9)\n            return a0 - 1;\n    }\n    return a0;\n}\n\nstatic void PrintUIHelp(u8 state)\n{\n    s32 width;\n    const u8 * src = gFameCheckerText_MainScreenUI;\n    if (state != 0)\n    {\n        src = gFameCheckerText_FlavorTextUI;\n        if (state == 1)\n            src = gFameCheckerText_PickScreenUI;\n    }\n    width = GetStringWidth(FONT_SMALL, src, 0);\n    FillWindowPixelRect(FCWINDOWID_UIHELP, PIXEL_FILL(0), 0, 0, 0xc0, 0x10);\n    AddTextPrinterParameterized4(FCWINDOWID_UIHELP, FONT_SMALL, 188 - width, 0, 0, 2, sTextColor_White, -1, src);\n    FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_UIHELP);\n}\n\nstatic void DestroyAllFlavorTextIcons(void)\n{\n    u32 i;\n    for (i = 0; i < 6; i++)\n    {\n        DestroySprite(&gSprites[sFameCheckerData->spriteIds[i]]);\n    }\n}\n\nstatic bool8 CreateAllFlavorTextIcons(u8 who)\n{\n    bool8 result = FALSE;\n    u32 i;\n    for (i = 0; i < 6; i++)\n    {\n        if ((gSaveBlock1Ptr->fameChecker[sFameCheckerData->unlockedPersons[who]].flavorTextFlags >> i) & 1)\n        {\n            sFameCheckerData->spriteIds[i] = CreateFameCheckerObject(\n                sFameCheckerArrayNpcGraphicsIds[sFameCheckerData->unlockedPersons[who] * 6 + i],\n                i,\n                47 * (i % 3) + 0x72,\n                27 * (i / 3) + 0x2F\n            );\n            result = TRUE;\n        }\n        else\n        {\n            sFameCheckerData->spriteIds[i] = PlaceQuestionMarkTile(\n                47 * (i % 3) + 0x72,\n                27 * (i / 3) + 0x1F\n            );\n            gSprites[sFameCheckerData->spriteIds[i]].data[1] = 0xFF;\n        }\n    }\n    if (result == TRUE)\n    {\n        sFameCheckerData->personHasUnlockedPanels = TRUE;\n        if (sFameCheckerData->inPickMode)\n            PrintUIHelp(1);\n        else\n            PrintUIHelp(0);\n    }\n    else\n    {\n        sFameCheckerData->personHasUnlockedPanels = FALSE;\n        PrintUIHelp(1);\n    }\n    return result;\n}\n\nvoid ResetFameChecker(void)\n{\n    u32 i;\n    for (i = 0; i < NUM_FAMECHECKER_PERSONS; i++)\n    {\n        gSaveBlock1Ptr->fameChecker[i].pickState = FCPICKSTATE_NO_DRAW;\n        gSaveBlock1Ptr->fameChecker[i].flavorTextFlags = 0;\n        gSaveBlock1Ptr->fameChecker[i].unk_0_E = 0;\n    }\n    gSaveBlock1Ptr->fameChecker[FAMECHECKER_OAK].pickState = FCPICKSTATE_COLORED;\n}\n\nvoid FullyUnlockFameChecker(void)\n{\n    u8 i, j;\n    for (i = 0; i < NUM_FAMECHECKER_PERSONS; i++)\n    {\n        gSaveBlock1Ptr->fameChecker[i].pickState = FCPICKSTATE_COLORED;\n        for (j = 0; j < 6; j++)\n        {\n            gSaveBlock1Ptr->fameChecker[i].flavorTextFlags |= (1 << j);\n        }\n    }\n}\n\nstatic void FCSetup_ClearVideoRegisters(void)\n{\n    void *vram = (void *)VRAM;\n    DmaClearLarge16(3, vram, VRAM_SIZE, 0x1000);\n    DmaClear32(3, OAM, OAM_SIZE);\n    DmaClear16(3, PLTT, PLTT_SIZE);\n    SetGpuReg(REG_OFFSET_DISPCNT,  0);\n    SetGpuReg(REG_OFFSET_BG0CNT,   0);\n    SetGpuReg(REG_OFFSET_BG0HOFS,  0);\n    SetGpuReg(REG_OFFSET_BG0VOFS,  0);\n    SetGpuReg(REG_OFFSET_BG1CNT,   0);\n    SetGpuReg(REG_OFFSET_BG1HOFS,  0);\n    SetGpuReg(REG_OFFSET_BG1VOFS,  0);\n    SetGpuReg(REG_OFFSET_BG2CNT,   0);\n    SetGpuReg(REG_OFFSET_BG2HOFS,  0);\n    SetGpuReg(REG_OFFSET_BG2VOFS,  0);\n    SetGpuReg(REG_OFFSET_BG3CNT,   0);\n    SetGpuReg(REG_OFFSET_BG3HOFS,  0);\n    SetGpuReg(REG_OFFSET_BG3VOFS,  0);\n    SetGpuReg(REG_OFFSET_WIN0H,    0);\n    SetGpuReg(REG_OFFSET_WIN0V,    0);\n    SetGpuReg(REG_OFFSET_WININ,    0);\n    SetGpuReg(REG_OFFSET_WINOUT,   0);\n    SetGpuReg(REG_OFFSET_BLDCNT,   0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY,     0);\n}\n\nstatic void FCSetup_ResetTasksAndSpriteResources(void)\n{\n    ScanlineEffect_Stop();\n    ResetTasks();\n    ResetSpriteData();\n    ResetAllPicSprites();\n    ResetPaletteFade();\n    InitObjectEventPalettes(0);\n    gReservedSpritePaletteCount = 7;\n\n}\n\nstatic void FCSetup_TurnOnDisplay(void)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON);\n}\n\nstatic void FCSetup_ResetBGCoords(void)\n{\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n}\n\nvoid SetFlavorTextFlagFromSpecialVars(void)\n{\n    if (gSpecialVar_0x8004 < NUM_FAMECHECKER_PERSONS && gSpecialVar_0x8005 < 6)\n    {\n        gSaveBlock1Ptr->fameChecker[gSpecialVar_0x8004].flavorTextFlags |= (1 << gSpecialVar_0x8005);\n        gSpecialVar_0x8005 = FCPICKSTATE_SILHOUETTE;\n        UpdatePickStateFromSpecialVar8005();\n    }\n}\n\nvoid UpdatePickStateFromSpecialVar8005(void)\n{\n    if (gSpecialVar_0x8004 < NUM_FAMECHECKER_PERSONS && gSpecialVar_0x8005 < 3)\n    {\n        if (gSpecialVar_0x8005 == FCPICKSTATE_NO_DRAW)\n            return;\n        if (   gSpecialVar_0x8005 == FCPICKSTATE_SILHOUETTE \n            && gSaveBlock1Ptr->fameChecker[gSpecialVar_0x8004].pickState == FCPICKSTATE_COLORED\n           )\n            return;\n        gSaveBlock1Ptr->fameChecker[gSpecialVar_0x8004].pickState = gSpecialVar_0x8005;\n    }\n}\n\nstatic bool8 HasUnlockedAllFlavorTextsForCurrentPerson(void)\n{\n    u32 i;\n    u8 who = sFameCheckerData->unlockedPersons[FameCheckerGetCursorY()];\n    for (i = 0; i < 6; i++)\n    {\n        if (!((gSaveBlock1Ptr->fameChecker[who].flavorTextFlags >> i) & 1))\n            return FALSE;\n    }\n    return TRUE;\n}\n\nvoid CheckFilledFameCheckerFor0x8004(void)\n{\n    u32 i;\n    u8 who = gSpecialVar_0x8004;\n\n    if(who < NUM_FAMECHECKER_PERSONS)\n    {\n        for (i = 0; i < 6; i++)\n        {\n            if (!((gSaveBlock1Ptr->fameChecker[who].flavorTextFlags >> i) & 1))\n            {\n                gSpecialVar_Result = FALSE;\n                return;\n            }\n        }\n        gSpecialVar_Result = TRUE;\n        return;\n    }\n    gSpecialVar_Result = FALSE;\n    return;\n}\n\nstatic void FreeSelectionCursorSpriteResources(void)\n{\n    FreeSpriteTilesByTag(SPRITETAG_SELECTOR_CURSOR);\n    FreeSpritePaletteByTag(SPRITETAG_SELECTOR_CURSOR);\n}\n\nstatic u8 CreateFlavorTextIconSelectorCursorSprite(s16 where)\n{\n    s16 y =  34 + 27 * (where >= 3);\n    s16 x = 114 + 47 * (where %  3);\n    return CreateSprite(&sSpriteTemplate_SelectorCursor, x, y, 0);\n}\n\nstatic void SpriteCB_DestroyFlavorTextIconSelectorCursor(struct Sprite *sprite)\n{\n    DestroySprite(sprite);\n}\n\nstatic void FreeQuestionMarkSpriteResources(void)\n{\n    FreeSpriteTilesByTag(SPRITETAG_QUESTION_MARK);\n}\n\nstatic u8 PlaceQuestionMarkTile(u8 x, u8 y)\n{\n    u8 spriteId = CreateSprite(&sQuestionMarkTileSpriteTemplate, x, y, 8);\n    gSprites[spriteId].oam.priority = 2;\n    gSprites[spriteId].oam.paletteNum = 2;\n    return spriteId;\n}\n\nstatic void FreeSpinningPokeballSpriteResources(void)\n{\n    FreeSpriteTilesByTag(SPRITETAG_SPINNING_POKEBALL);\n    FreeSpritePaletteByTag(SPRITETAG_SPINNING_POKEBALL);\n}\n\nstatic u8 CreateSpinningPokeballSprite(void)\n{\n    return CreateSprite(&sSpinningPokeballSpriteTemplate, 0xe2, 0x42, 0);\n}\n\nstatic void SpriteCB_DestroySpinningPokeball(struct Sprite *sprite)\n{\n    FreeSpriteOamMatrix(sprite);\n    DestroySprite(sprite);\n}\n\nstatic void FreeNonTrainerPicTiles(void)\n{\n    FreeSpriteTilesByTag(SPRITETAG_DAISY);\n    FreeSpriteTilesByTag(SPRITETAG_FUJI);\n    FreeSpriteTilesByTag(SPRITETAG_OAK);\n    FreeSpriteTilesByTag(SPRITETAG_BILL);\n}\n\nstatic void SpriteCB_FCSpinningPokeball(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 1)\n    {\n        if (sprite->x2 - 10 < 0)\n        {\n            sprite->x2 = 0;\n            sprite->data[0] = 0;\n        }\n        else\n            sprite->x2 -= 10;\n    }\n    else if (sprite->data[0] == 2)\n    {\n        if (sprite->x2 > 240)\n        {\n            sprite->x2 = 240;\n            sprite->data[0] = 0;\n        }\n        else\n            sprite->x2 += 10;\n    }\n}\n\n#define PERSON_PAL_NUM 6\n#define PERSON_X  148\n#define PERSON_Y   66\n\nstatic u8 CreatePersonPicSprite(u8 fcPersonIdx)\n{\n    u8 spriteId;\n    if (fcPersonIdx == FAMECHECKER_DAISY)\n    {\n        spriteId = CreateSprite(&sDaisySpriteTemplate, PERSON_X, PERSON_Y, 0);\n        LoadPalette(sDaisySpritePalette, OBJ_PLTT_ID(PERSON_PAL_NUM), sizeof(sDaisySpritePalette));\n        gSprites[spriteId].oam.paletteNum = PERSON_PAL_NUM;\n    }\n    else if (fcPersonIdx == FAMECHECKER_MRFUJI)\n    {\n        spriteId = CreateSprite(&sFujiSpriteTemplate, PERSON_X, PERSON_Y, 0);\n        LoadPalette(sFujiSpritePalette, OBJ_PLTT_ID(PERSON_PAL_NUM), sizeof(sFujiSpritePalette));\n        gSprites[spriteId].oam.paletteNum = PERSON_PAL_NUM;\n    }\n    else if (fcPersonIdx == FAMECHECKER_OAK)\n    {\n        spriteId = CreateSprite(&sOakSpriteTemplate, PERSON_X, PERSON_Y, 0);\n        LoadPalette(sOakSpritePalette, OBJ_PLTT_ID(PERSON_PAL_NUM), sizeof(sOakSpritePalette));\n        gSprites[spriteId].oam.paletteNum = PERSON_PAL_NUM;\n    }\n    else if (fcPersonIdx == FAMECHECKER_BILL)\n    {\n        spriteId = CreateSprite(&sBillSpriteTemplate, PERSON_X, PERSON_Y, 0);\n        LoadPalette(sBillSpritePalette, OBJ_PLTT_ID(PERSON_PAL_NUM), sizeof(sBillSpritePalette));\n        gSprites[spriteId].oam.paletteNum = PERSON_PAL_NUM;\n    }\n    else\n    {\n        spriteId = CreateTrainerPicSprite(sFameCheckerTrainerPicIdxs[fcPersonIdx], TRUE, PERSON_X, PERSON_Y, PERSON_PAL_NUM, TAG_NONE);\n    }\n    gSprites[spriteId].callback = SpriteCB_FCSpinningPokeball;\n    if (gSaveBlock1Ptr->fameChecker[fcPersonIdx].pickState == FCPICKSTATE_SILHOUETTE)\n        LoadPalette(sSilhouettePalette, OBJ_PLTT_ID(PERSON_PAL_NUM), sizeof(sSilhouettePalette));\n    return spriteId;\n}\n\nstatic void DestroyPersonPicSprite(u8 taskId, u16 who)\n{\n    s16 * data = gTasks[taskId].data;\n    u16 who_copy = who;\n    if (who == sFameCheckerData->numUnlockedPersons - 1)\n        who_copy = who - 1;\n    if (   sFameCheckerData->unlockedPersons[who_copy] == FAMECHECKER_DAISY\n        || sFameCheckerData->unlockedPersons[who_copy] == FAMECHECKER_MRFUJI\n        || sFameCheckerData->unlockedPersons[who_copy] == FAMECHECKER_OAK\n        || sFameCheckerData->unlockedPersons[who_copy] == FAMECHECKER_BILL\n    )\n        DestroySprite(&gSprites[data[2]]);\n    else\n        FreeAndDestroyTrainerPicSprite(data[2]);\n}\n\nstatic void UpdateIconDescriptionBox(u8 whichText)\n{\n    s32 width;\n    u32 idx = 6 * sFameCheckerData->unlockedPersons[FameCheckerGetCursorY()] + whichText;\n    HandleFlavorTextModeSwitch(TRUE);\n    gIconDescriptionBoxIsOpen = 1;\n    FillWindowPixelRect(FCWINDOWID_ICONDESC, PIXEL_FILL(0), 0, 0, 0x58, 0x20);\n    width = (0x54 - GetStringWidth(FONT_SMALL, sFlavorTextOriginLocationTexts[idx], 0)) / 2;\n    AddTextPrinterParameterized4(FCWINDOWID_ICONDESC, FONT_SMALL, width, 0, 0, 2, sTextColor_DkGrey, -1, sFlavorTextOriginLocationTexts[idx]);\n    StringExpandPlaceholders(gStringVar1, sFlavorTextOriginObjectNameTexts[idx]);\n    width = (0x54 - GetStringWidth(FONT_SMALL, gStringVar1, 0)) / 2;\n    AddTextPrinterParameterized4(FCWINDOWID_ICONDESC, FONT_SMALL, width, 10, 0, 2, sTextColor_DkGrey, -1, gStringVar1);\n    FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_ICONDESC);\n}\n\nstatic void UpdateIconDescriptionBoxOff(void)\n{\n    HandleFlavorTextModeSwitch(FALSE);\n    gIconDescriptionBoxIsOpen = 0xFF;\n}\n\nstatic void FC_CreateListMenu(void)\n{\n    InitListMenuTemplate();\n    sFameCheckerData->numUnlockedPersons = FC_PopulateListMenu();\n    sFameCheckerData->listMenuTaskId = ListMenuInit(&gFameChecker_ListMenuTemplate, 0, 0);\n    FC_PutWindowTilemapAndCopyWindowToVramMode3_2(FCWINDOWID_LIST);\n}\n\nstatic void InitListMenuTemplate(void)\n{\n    gFameChecker_ListMenuTemplate.items = sListMenuItems;\n    gFameChecker_ListMenuTemplate.moveCursorFunc = FC_MoveCursorFunc;\n    gFameChecker_ListMenuTemplate.itemPrintFunc = NULL;\n    gFameChecker_ListMenuTemplate.totalItems = 1;\n    gFameChecker_ListMenuTemplate.maxShowed = 1;\n    gFameChecker_ListMenuTemplate.windowId = FCWINDOWID_LIST;\n    gFameChecker_ListMenuTemplate.header_X = 0;\n    gFameChecker_ListMenuTemplate.item_X = 8;\n    gFameChecker_ListMenuTemplate.cursor_X = 0;\n    gFameChecker_ListMenuTemplate.upText_Y = 4;\n    gFameChecker_ListMenuTemplate.cursorPal = 2;\n    gFameChecker_ListMenuTemplate.fillValue = 0;\n    gFameChecker_ListMenuTemplate.cursorShadowPal = 3;\n    gFameChecker_ListMenuTemplate.lettersSpacing = 0;\n    gFameChecker_ListMenuTemplate.itemVerticalPadding = 0;\n    gFameChecker_ListMenuTemplate.scrollMultiple = 0;\n    gFameChecker_ListMenuTemplate.fontId = FONT_NORMAL;\n    gFameChecker_ListMenuTemplate.cursorKind = 0;\n}\n\nstatic void FC_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)\n{\n    u16 listMenuTopIdx;\n    u8 taskId;\n    u16 personIdx;\n    sLastMenuIdx = 0;\n    personIdx = sFameCheckerData->listMenuTopIdx2 + sFameCheckerData->listMenuDrawnSelIdx;\n    FC_DoMoveCursor(itemIndex, onInit);\n    taskId = FindTaskIdByFunc(Task_TopMenuHandleInput);\n    if (taskId != 0xFF)\n    {\n        struct Task *task = &gTasks[taskId];\n        PlaySE(SE_SELECT);\n        task->data[1] = 0;\n        ListMenuGetScrollAndRow(sFameCheckerData->listMenuTaskId, &listMenuTopIdx, NULL);\n        sFameCheckerData->listMenuTopIdx = listMenuTopIdx;\n        if (itemIndex != sFameCheckerData->numUnlockedPersons - 1)\n        {\n            DestroyAllFlavorTextIcons();\n            CreateAllFlavorTextIcons(itemIndex);\n            if (sFameCheckerData->inPickMode)\n            {\n                if (!sFameCheckerData->pickModeOverCancel)\n                {\n                    DestroyPersonPicSprite(taskId, personIdx);\n                    sLastMenuIdx = itemIndex;\n                    task->func = Task_SwitchToPickMode;\n                }\n                else\n                {\n                    gSprites[task->data[2]].invisible = FALSE;\n                    sFameCheckerData->pickModeOverCancel = FALSE;\n                    gSprites[task->data[2]].data[0] = 0;\n                    GetPickModeText();\n                }\n            }\n            else\n            {\n                FillWindowPixelRect(FCWINDOWID_MSGBOX, PIXEL_FILL(1), 0, 0, 0xd0, 0x20);\n                FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);\n            }\n        }\n        else\n        {\n            PrintCancelDescription();\n            if (sFameCheckerData->inPickMode)\n            {\n                gSprites[task->data[2]].invisible = TRUE;\n                sFameCheckerData->pickModeOverCancel = TRUE;\n            }\n            else\n            {\n                u32 i;\n                for (i = 0; i < 6; i++)\n                {\n                    gSprites[sFameCheckerData->spriteIds[i]].invisible = TRUE;\n                }\n            }\n        }\n    }\n}\n\nstatic void Task_SwitchToPickMode(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    task->data[2] = CreatePersonPicSprite(sFameCheckerData->unlockedPersons[sLastMenuIdx]);\n    gSprites[task->data[2]].data[0] = 0;\n    GetPickModeText();\n    task->func = Task_TopMenuHandleInput;\n}\n\nstatic void PrintCancelDescription(void)\n{\n    FillWindowPixelRect(FCWINDOWID_MSGBOX, PIXEL_FILL(1), 0, 0, 0xd0, 0x20);\n    AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, FONT_NORMAL, gFameCheckerText_FameCheckerWillBeClosed, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);\n}\n\nstatic void FC_DoMoveCursor(s32 itemIndex, bool8 onInit)\n{\n    u16 listY;\n    u16 cursorY;\n    u16 who;\n    ListMenuGetScrollAndRow(sFameCheckerData->listMenuTaskId, &listY, &cursorY);\n    who = listY + cursorY;\n    AddTextPrinterParameterized4(FCWINDOWID_LIST, FONT_NORMAL, 8, 14 * cursorY + 4, 0, 0, sTextColor_Green, 0, sListMenuItems[itemIndex].label);\n    if (!onInit)\n    {\n        if (listY < sFameCheckerData->listMenuTopIdx2)\n            sFameCheckerData->listMenuDrawnSelIdx++;\n        else if (listY > sFameCheckerData->listMenuTopIdx2 && who != sFameCheckerData->numUnlockedPersons - 1)\n            sFameCheckerData->listMenuDrawnSelIdx--;\n        AddTextPrinterParameterized4(FCWINDOWID_LIST, FONT_NORMAL, 8, 14 * sFameCheckerData->listMenuDrawnSelIdx + 4, 0, 0, sTextColor_DkGrey, 0, sListMenuItems[sFameCheckerData->listMenuCurIdx].label);\n\n    }\n    sFameCheckerData->listMenuCurIdx = itemIndex;\n    sFameCheckerData->listMenuDrawnSelIdx = cursorY;\n    sFameCheckerData->listMenuTopIdx2 = listY;\n}\n\nstatic u8 FC_PopulateListMenu(void)\n{\n    u8 nitems = 0;\n    u32 i;\n\n    for (i = 0; i < NUM_FAMECHECKER_PERSONS; i++)\n    {\n        u8 fameCheckerIdx = AdjustGiovanniIndexIfBeatenInGym(i);\n        if (gSaveBlock1Ptr->fameChecker[fameCheckerIdx].pickState != FCPICKSTATE_NO_DRAW)\n        {\n            if (sTrainerIdxs[fameCheckerIdx] < FC_NONTRAINER_START)\n            {\n                sListMenuItems[nitems].label = gTrainers[sTrainerIdxs[fameCheckerIdx]].trainerName;\n                sListMenuItems[nitems].index = nitems;\n            }\n            else\n            {\n                sListMenuItems[nitems].label = sNonTrainerNamePointers[sTrainerIdxs[fameCheckerIdx] - FC_NONTRAINER_START];\n                sListMenuItems[nitems].index = nitems;\n            }\n            sFameCheckerData->unlockedPersons[nitems] = fameCheckerIdx;\n            nitems++;\n        }\n    }\n    sListMenuItems[nitems].label = gFameCheckerText_Cancel;\n    sListMenuItems[nitems].index = nitems;\n    sFameCheckerData->unlockedPersons[nitems] = 0xFF;\n    nitems++;\n    gFameChecker_ListMenuTemplate.totalItems = nitems;\n    if (nitems < 5)\n        gFameChecker_ListMenuTemplate.maxShowed = nitems;\n    else\n        gFameChecker_ListMenuTemplate.maxShowed = 5;\n    return nitems;\n}\n\nstatic void FC_PutWindowTilemapAndCopyWindowToVramMode3_2(u8 windowId)\n{\n    PutWindowTilemap(windowId);\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void FC_CreateScrollIndicatorArrowPair(void)\n{\n    struct ScrollArrowsTemplate template = {\n          2,\n          40,\n          26,\n          3,\n          40,\n          100,\n          0,\n          0,\n          SPRITETAG_SCROLL_INDICATORS,\n          0xFFFF,\n          1,\n    };\n\n    if (sFameCheckerData->numUnlockedPersons > 5)\n    {\n        template.fullyUpThreshold = 0;\n        template.fullyDownThreshold = sFameCheckerData->numUnlockedPersons - 5;\n        sFameCheckerData->scrollIndicatorPairTaskId = AddScrollIndicatorArrowPair(&template, &sFameCheckerData->listMenuTopIdx);\n    }\n}\n\nstatic void FreeListMenuSelectorArrowPairResources(void)\n{\n    if (sFameCheckerData->numUnlockedPersons > 5)\n        RemoveScrollIndicatorArrowPair(sFameCheckerData->scrollIndicatorPairTaskId);\n}\n\nstatic u16 FameCheckerGetCursorY(void)\n{\n    u16 listY, cursorY;\n    ListMenuGetScrollAndRow(sFameCheckerData->listMenuTaskId, &listY, &cursorY);\n    return listY + cursorY;\n}\n\nstatic void HandleFlavorTextModeSwitch(bool8 state)\n{\n    if (sFameCheckerData->viewingFlavorText != state)\n    {\n        u8 taskId = FindTaskIdByFunc(Task_FCOpenOrCloseInfoBox);\n        if (taskId == 0xFF)\n            taskId = CreateTask(Task_FCOpenOrCloseInfoBox, 8);\n        gTasks[taskId].data[0] = 0;\n        gTasks[taskId].data[1] = 4;\n        if (state == TRUE)\n        {\n            gTasks[taskId].data[2] = 1;\n            sFameCheckerData->viewingFlavorText = TRUE;\n        }\n        else\n        {\n            gTasks[taskId].data[2] = 4;\n            sFameCheckerData->viewingFlavorText = FALSE;\n        }\n    }\n}\n\nstatic void Task_FCOpenOrCloseInfoBox(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->data[0])\n    {\n        case 0:\n            if (--task->data[1] == 0)\n            {\n                UpdateInfoBoxTilemap(1, 0);\n                task->data[1] = 4;\n                task->data[0]++;\n            }\n            break;\n        case 1:\n            if (--task->data[1] == 0)\n            {\n                UpdateInfoBoxTilemap(1, task->data[2]);\n                DestroyTask(taskId);\n            }\n            break;\n    }\n}\n\nstatic void UpdateInfoBoxTilemap(u8 bg, s16 state)\n{\n    if (state == 0 || state == 3)\n    {\n        FillBgTilemapBufferRect(bg, 0x8C, 14, 10,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0xA1, 15, 10, 10,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x8D, 25, 10,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x8E, 26, 10,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x8F, 14, 11,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x00, 15, 11, 11,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x90, 26, 11,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x91, 14, 12,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0xA3, 15, 12, 10,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x92, 25, 12,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x93, 26, 12,  1,  1, 1);\n    }\n    else if (state == 1)\n    {\n        FillBgTilemapBufferRect(bg, 0x9B, 14, 10,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x9C, 15, 10, 11,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x96, 26, 10,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x9D, 14, 11,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x00, 15, 11, 11,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x90, 26, 11,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x9E, 14, 12,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x9F, 15, 12, 11,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x99, 26, 12,  1,  1, 1);\n    }\n    else if (state == 2)\n    {\n        FillBgTilemapBufferRect(bg, 0x94, 14, 10,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x95, 15, 10, 11,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x96, 26, 10,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x8F, 14, 11,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x9A, 15, 11, 11,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x90, 26, 11,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x97, 14, 12,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x98, 15, 12, 11,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x99, 26, 12,  1,  1, 1);\n    }\n    else if (state == 4)\n    {\n        FillBgTilemapBufferRect(bg, 0x83, 14, 10,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0xA0, 15, 10, 10,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x84, 25, 10,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x85, 26, 10,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x86, 14, 11,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0xA2, 15, 11, 10,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x87, 25, 11,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x88, 26, 11,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x83, 14, 12,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0xA0, 15, 12, 10,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x84, 25, 12,  1,  1, 1);\n        FillBgTilemapBufferRect(bg, 0x85, 26, 12,  1,  1, 1);\n    }\n    else if (state == 5)\n    {\n        FillBgTilemapBufferRect(bg, 0x00, 14, 10, 13,  3, 1);\n    }\n    CopyBgTilemapBufferToVram(bg);\n}\n\nstatic void PlaceListMenuCursor(bool8 isActive)\n{\n    u16 cursorY = ListMenuGetYCoordForPrintingArrowCursor(sFameCheckerData->listMenuTaskId);\n    if (isActive == TRUE)\n        AddTextPrinterParameterized4(FCWINDOWID_LIST, FONT_NORMAL, 0, cursorY, 0, 0, sTextColor_DkGrey, 0, gText_SelectorArrow2);\n    else\n        AddTextPrinterParameterized4(FCWINDOWID_LIST, FONT_NORMAL, 0, cursorY, 0, 0, sTextColor_White, 0, gText_SelectorArrow2);\n}\n"
  },
  {
    "path": "src/faraway_island.c",
    "content": "#include \"global.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"field_weather.h\"\n#include \"fieldmap.h\"\n#include \"metatile_behavior.h\"\n#include \"sprite.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/field_effects.h\"\n#include \"constants/maps.h\"\n#include \"constants/metatile_behaviors.h\"\n\nstatic u8 GetValidMewMoveDirection(u8);\nstatic bool8 ShouldMewMoveNorth(struct ObjectEvent*, u8);\nstatic bool8 ShouldMewMoveSouth(struct ObjectEvent*, u8);\nstatic bool8 ShouldMewMoveEast(struct ObjectEvent*, u8);\nstatic bool8 ShouldMewMoveWest(struct ObjectEvent*, u8);\nstatic u8 GetRandomMewDirectionCandidate(u8);\nstatic bool8 CanMewMoveToCoords(s16, s16);\n\nstatic EWRAM_DATA u8 sGrassSpriteId = 0;\n\nstatic s16 sPlayerToMewDeltaX;\nstatic s16 sPlayerToMewDeltaY;\nstatic u8 sMewDirectionCandidates[4];\n\nextern const struct SpritePalette gSpritePalette_GeneralFieldEffect1; //gSpritePalette_GeneralFieldEffect1 in Emerald?\nextern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[];\n\nstatic const s16 sFarawayIslandRockCoords[4][2] =\n{\n    {14 + 7,  9 + 7},\n    {18 + 7,  9 + 7},\n    { 9 + 7, 10 + 7},\n    {13 + 7, 13 + 7},\n};\n\nstatic u8 GetMewObjectEventId(void)\n{\n    u8 objectEventId;\n    TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId);\n    return objectEventId;\n}\n\n// When the player enters Faraway Island interior it begins a \"hide and seek\" minigame where Mew disappears into the grass\n// This function returns the direction Mew will take a step, and is run every time the player takes a step\nu32 GetMewMoveDirection(void)\n{\n    u32 i;\n    int mewSafeFromTrap;\n    struct ObjectEvent *mew = &gObjectEvents[GetMewObjectEventId()];\n\n    sPlayerToMewDeltaX = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x - mew->currentCoords.x;\n    sPlayerToMewDeltaY = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y - mew->currentCoords.y;\n    for (i = 0; i < NELEMS(sMewDirectionCandidates); i++)\n        sMewDirectionCandidates[i] = DIR_NONE;\n\n    // Player hasn't moved (just facing new direction), don't move\n    if (gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x == gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x\n     && gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y == gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y)\n    {\n        return DIR_NONE;\n    }\n\n    // Mew is invisible except for every 8th step\n    if (VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % 8 == 0)\n        mew->invisible = FALSE;\n    else\n        mew->invisible = TRUE;\n\n    // Mew will stay in place for 1 step after its visible\n    if (VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % 9 == 0)\n        return DIR_NONE;\n\n    // Below loop is for Mew to try to avoid getting trapped between the player and a rock\n    for (i = 0; i < NELEMS(sFarawayIslandRockCoords); i++)\n    {\n        if (gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x == sFarawayIslandRockCoords[i][0])\n        {\n            mewSafeFromTrap = FALSE;\n            if (gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y < sFarawayIslandRockCoords[i][1])\n            {\n                if (mew->currentCoords.y <= sFarawayIslandRockCoords[i][1])\n                    mewSafeFromTrap = TRUE;\n            }\n            else\n            {\n                if (mew->currentCoords.y >= sFarawayIslandRockCoords[i][1])\n                    mewSafeFromTrap = TRUE;\n            }\n\n            if (!mewSafeFromTrap)\n            {\n                if (sPlayerToMewDeltaX > 0)\n                {\n                    if (mew->currentCoords.x + 1 == gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x)\n                    {\n                        if (CanMewMoveToCoords(mew->currentCoords.x + 1, mew->currentCoords.y))\n                            return DIR_EAST;\n                    }\n                }\n                else if (sPlayerToMewDeltaX < 0)\n                {\n                    if (mew->currentCoords.x - 1 == gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x)\n                    {\n                        if (CanMewMoveToCoords(mew->currentCoords.x - 1, mew->currentCoords.y))\n                            return DIR_WEST;\n                    }\n                }\n\n                if (mew->currentCoords.x == gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x)\n                {\n                    if (sPlayerToMewDeltaY > 0)\n                    {\n                        if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y - 1))\n                            return DIR_NORTH;\n                    }\n                    else\n                    {\n                        if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y + 1))\n                            return DIR_SOUTH;\n                    }\n                }\n            }\n        }\n\n        if (gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y == sFarawayIslandRockCoords[i][1])\n        {\n            mewSafeFromTrap = FALSE;\n            if (gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x < sFarawayIslandRockCoords[i][0])\n            {\n                if (mew->currentCoords.x <= sFarawayIslandRockCoords[i][0])\n                    mewSafeFromTrap = TRUE;\n            }\n            else\n            {\n                if (mew->currentCoords.x >= sFarawayIslandRockCoords[i][0])\n                    mewSafeFromTrap = TRUE;\n            }\n\n            if (!mewSafeFromTrap)\n            {\n                if (sPlayerToMewDeltaY > 0)\n                {\n                    if (mew->currentCoords.y + 1 == gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y)\n                    {\n                        if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y + 1))\n                            return DIR_SOUTH;\n                    }\n                }\n                else if (sPlayerToMewDeltaY < 0)\n                {\n                    if (mew->currentCoords.y - 1 == gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y)\n                    {\n                        if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y - 1))\n                            return DIR_NORTH;\n                    }\n                }\n\n                if (mew->currentCoords.y == gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y)\n                {\n                    if (sPlayerToMewDeltaX > 0)\n                    {\n                        if (CanMewMoveToCoords(mew->currentCoords.x - 1, mew->currentCoords.y))\n                            return DIR_WEST;\n                    }\n                    else\n                    {\n                        if (CanMewMoveToCoords(mew->currentCoords.x + 1, mew->currentCoords.y))\n                            return DIR_EAST;\n                    }\n                }\n            }\n        }\n    }\n\n    // Check if Mew can move in any direction without getting closer to the player\n    // If so load into sMewDirectionCandidates\n    // If Mew can move in two of the checked directions, choose one randomly\n    if (ShouldMewMoveNorth(mew, 0))\n    {\n        if (ShouldMewMoveEast(mew, 1))\n            return GetRandomMewDirectionCandidate(2);\n        else if (ShouldMewMoveWest(mew, 1))\n            return GetRandomMewDirectionCandidate(2);\n        else\n            return DIR_NORTH;\n    }\n\n    if (ShouldMewMoveSouth(mew, 0))\n    {\n        if (ShouldMewMoveEast(mew, 1))\n            return GetRandomMewDirectionCandidate(2);\n        else if (ShouldMewMoveWest(mew, 1))\n            return GetRandomMewDirectionCandidate(2);\n        else\n            return DIR_SOUTH;\n    }\n\n    if (ShouldMewMoveEast(mew, 0))\n    {\n        if (ShouldMewMoveNorth(mew, 1))\n            return GetRandomMewDirectionCandidate(2);\n        else if (ShouldMewMoveSouth(mew, 1))\n            return GetRandomMewDirectionCandidate(2);\n        else\n            return DIR_EAST;\n    }\n\n    if (ShouldMewMoveWest(mew, 0))\n    {\n        if (ShouldMewMoveNorth(mew, 1))\n            return GetRandomMewDirectionCandidate(2);\n        else if (ShouldMewMoveSouth(mew, 1))\n            return GetRandomMewDirectionCandidate(2);\n        else\n            return DIR_WEST;\n    }\n\n    // If this point is reached, Mew cannot move without getting closer to the player\n\n    // Avoid player on same Y, try move North/South\n    if (sPlayerToMewDeltaY == 0)\n    {\n        if (gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y > mew->currentCoords.y)\n        {\n            if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y - 1))\n                return DIR_NORTH;\n        }\n\n        if (gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y < mew->currentCoords.y)\n        {\n            if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y + 1))\n                return DIR_SOUTH;\n        }\n\n        if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y - 1))\n            return DIR_NORTH;\n\n        if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y + 1))\n            return DIR_SOUTH;\n    }\n\n    // Avoid player on same X, try move West/East\n    if (sPlayerToMewDeltaX == 0)\n    {\n        if (gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x > mew->currentCoords.x)\n        {\n            if (CanMewMoveToCoords(mew->currentCoords.x - 1, mew->currentCoords.y))\n                return DIR_WEST;\n        }\n\n        if (gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x < mew->currentCoords.x)\n        {\n            if (CanMewMoveToCoords(mew->currentCoords.x + 1, mew->currentCoords.y))\n                return DIR_EAST;\n        }\n\n        if (CanMewMoveToCoords(mew->currentCoords.x + 1, mew->currentCoords.y))\n            return DIR_EAST;\n\n        if (CanMewMoveToCoords(mew->currentCoords.x - 1, mew->currentCoords.y))\n            return DIR_WEST;\n    }\n\n    // Can't avoid player on axis, move any valid direction\n    return GetValidMewMoveDirection(DIR_NONE);\n}\n\n// Mew can move to any Tall/Long Grass metatile the player isn't currently on\nstatic bool8 CanMewMoveToCoords(s16 x, s16 y)\n{\n    if (gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x == x\n     && gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y == y)\n    {\n        return FALSE;\n    }\n\n    return MetatileBehavior_IsPokeGrass(MapGridGetMetatileBehaviorAt(x, y));\n}\n\n// Last ditch effort to move, clear move candidates and try all directions again\nstatic u8 GetValidMewMoveDirection(u8 ignoredDir)\n{\n    u32 i;\n    u8 count = 0;\n    struct ObjectEvent *mew = &gObjectEvents[GetMewObjectEventId()];\n\n    for (i = 0; i < NELEMS(sMewDirectionCandidates); i++)\n        sMewDirectionCandidates[i] = DIR_NONE;\n\n    if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y - 1) == TRUE && ignoredDir != DIR_NORTH)\n    {\n        sMewDirectionCandidates[count] = DIR_NORTH;\n        count++;\n    }\n\n    if (CanMewMoveToCoords(mew->currentCoords.x + 1, mew->currentCoords.y) == TRUE && ignoredDir != DIR_EAST)\n    {\n        sMewDirectionCandidates[count] = DIR_EAST;\n        count++;\n    }\n\n    if (CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y + 1) == TRUE && ignoredDir != DIR_SOUTH)\n    {\n        sMewDirectionCandidates[count] = DIR_SOUTH;\n        count++;\n    }\n\n    if (CanMewMoveToCoords(mew->currentCoords.x - 1, mew->currentCoords.y) == TRUE && ignoredDir != DIR_WEST)\n    {\n        sMewDirectionCandidates[count] = DIR_WEST;\n        count++;\n    }\n\n    if (count > 1)\n        return sMewDirectionCandidates[VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % count];\n    else\n        return sMewDirectionCandidates[0];\n}\n\nvoid UpdateFarawayIslandStepCounter(void)\n{\n    u16 steps = VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER);\n    if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(FARAWAY_ISLAND_INTERIOR)\n     && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(FARAWAY_ISLAND_INTERIOR))\n    {\n        steps++;\n        if (steps >= 9999)\n            VarSet(VAR_FARAWAY_ISLAND_STEP_COUNTER, 0);\n        else\n            VarSet(VAR_FARAWAY_ISLAND_STEP_COUNTER, steps);\n    }\n}\n\nbool8 ObjectEventIsFarawayIslandMew(struct ObjectEvent *objectEvent)\n{\n    if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(FARAWAY_ISLAND_INTERIOR)\n     && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(FARAWAY_ISLAND_INTERIOR))\n    {\n        if (objectEvent->graphicsId == OBJ_EVENT_GFX_MEW)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nbool8 IsMewPlayingHideAndSeek(void)\n{\n    if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(FARAWAY_ISLAND_INTERIOR)\n     && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(FARAWAY_ISLAND_INTERIOR))\n    {\n        if (FlagGet(FLAG_FOUGHT_MEW) != TRUE && FlagGet(FLAG_HIDE_MEW) != TRUE)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\n// Every 4th step Mew will shake the grass it steps into\n// Otherwise its movement leaves grass undisturbed\nbool8 ShouldMewShakeGrass(struct ObjectEvent *objectEvent)\n{\n    if (VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) != 0xFFFF\n     && VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % 4 == 0)\n        return TRUE;\n\n    return FALSE;\n}\n\nvoid SetMewAboveGrass(void)\n{\n    s16 x;\n    s16 y;\n    u8 spriteId;\n    struct ObjectEvent *mew = &gObjectEvents[GetMewObjectEventId()];\n\n    mew->invisible = FALSE;\n    if (gSpecialVar_0x8004 == 1)\n    {\n        // For after battle where Mew should still be present (e.g. if ran from battle)\n        mew->fixedPriority = 1;\n        gSprites[mew->spriteId].subspriteMode = SUBSPRITES_IGNORE_PRIORITY;\n        gSprites[mew->spriteId].subpriority = 1;\n    }\n    else\n    {\n        // Mew emerging from grass when found\n        // Also do field effect for grass shaking as it emerges\n        VarSet(VAR_FARAWAY_ISLAND_STEP_COUNTER, 0xFFFF);\n        mew->fixedPriority = 1;\n        gSprites[mew->spriteId].subspriteMode = SUBSPRITES_IGNORE_PRIORITY;\n        if (gSpecialVar_Facing != DIR_NORTH)\n            gSprites[mew->spriteId].subpriority = 1;\n\n        LoadSpritePalette(&gSpritePalette_GeneralFieldEffect1);\n        UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(gSpritePalette_GeneralFieldEffect1.tag));\n\n        x = mew->currentCoords.x;\n        y = mew->currentCoords.y;\n        SetSpritePosToOffsetMapCoords(&x, &y, 8, 8);\n        sGrassSpriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_LONG_GRASS], x, y, gSprites[mew->spriteId].subpriority - 1);\n        gSpecialVar_Result = sGrassSpriteId;\n        if (sGrassSpriteId != MAX_SPRITES)\n        {\n            struct Sprite *sprite = &gSprites[sGrassSpriteId];\n            sprite->coordOffsetEnabled = 1;\n            sprite->oam.priority = 2;\n            sprite->callback = SpriteCallbackDummy;\n        }\n    }\n}\n\n//This doesn't appear to be needed, and calling it as a special\n//messes with the camera, so I've removed the call.\nvoid DestroyMewEmergingGrassSprite(void)\n{\n    if (sGrassSpriteId != MAX_SPRITES)\n        DestroySprite(&gSprites[sGrassSpriteId]);\n}\n\nstatic bool8 ShouldMewMoveNorth(struct ObjectEvent *mew, u8 index)\n{\n    if (sPlayerToMewDeltaY > 0 && CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y - 1))\n    {\n        sMewDirectionCandidates[index] = DIR_NORTH;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 ShouldMewMoveEast(struct ObjectEvent *mew, u8 index)\n{\n    if (sPlayerToMewDeltaX < 0 && CanMewMoveToCoords(mew->currentCoords.x + 1, mew->currentCoords.y))\n    {\n        sMewDirectionCandidates[index] = DIR_EAST;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 ShouldMewMoveSouth(struct ObjectEvent *mew, u8 index)\n{\n    if (sPlayerToMewDeltaY < 0 && CanMewMoveToCoords(mew->currentCoords.x, mew->currentCoords.y + 1))\n    {\n        sMewDirectionCandidates[index] = DIR_SOUTH;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 ShouldMewMoveWest(struct ObjectEvent *mew, u8 index)\n{\n    if (sPlayerToMewDeltaX > 0 && CanMewMoveToCoords(mew->currentCoords.x - 1, mew->currentCoords.y))\n    {\n        sMewDirectionCandidates[index] = DIR_WEST;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic u8 GetRandomMewDirectionCandidate(u8 numDirections)\n{\n    return sMewDirectionCandidates[VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % numDirections];\n}\n"
  },
  {
    "path": "src/field_camera.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"field_camera.h\"\n#include \"field_player_avatar.h\"\n#include \"fieldmap.h\"\n#include \"event_object_movement.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n\nEWRAM_DATA bool8 gBikeCameraAheadPanback = FALSE;\n\n// Static type declarations\nstruct FieldCameraOffset\n{\n    u8 xPixelOffset;\n    u8 yPixelOffset;\n    u8 xTileOffset;\n    u8 yTileOffset;\n    bool8 copyBGToVRAM;\n};\n\n// static functions\nstatic void RedrawMapSliceNorth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);\nstatic void RedrawMapSliceSouth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);\nstatic void RedrawMapSliceEast(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);\nstatic void RedrawMapSliceWest(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);\nstatic s32 MapPosToBgTilemapOffset(struct FieldCameraOffset *a, s32 x, s32 y);\nstatic void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout);\nstatic void DrawMetatileAt(const struct MapLayout *mapLayout, u16, int, int);\nstatic void DrawMetatile(s32 a, const u16 *b, u16 c);\nstatic void CameraPanningCB_PanAhead(void);\n\n// IWRAM bss vars\nstatic struct FieldCameraOffset sFieldCameraOffset;\nstatic s16 sHorizontalCameraPan;\nstatic s16 sVerticalCameraPan;\nstatic u8 sBikeCameraPanFlag;\nstatic void (*sFieldCameraPanningCallback)(void);\n\nstruct CameraObject gFieldCamera;\nu16 gTotalCameraPixelOffsetY;\nu16 gTotalCameraPixelOffsetX;\n\n// text\nstatic void move_tilemap_camera_to_upper_left_corner_(struct FieldCameraOffset *cameraOffset)\n{\n    cameraOffset->xTileOffset = 0;\n    cameraOffset->yTileOffset = 0;\n    cameraOffset->xPixelOffset = 0;\n    cameraOffset->yPixelOffset = 0;\n    cameraOffset->copyBGToVRAM = TRUE;\n}\n\nstatic void tilemap_move_something(struct FieldCameraOffset *cameraOffset, u32 b, u32 c)\n{\n    cameraOffset->xTileOffset += b;\n    cameraOffset->xTileOffset %= 32;\n    cameraOffset->yTileOffset += c;\n    cameraOffset->yTileOffset %= 32;\n}\n\nstatic void coords8_add(struct FieldCameraOffset *cameraOffset, u32 b, u32 c)\n{\n    cameraOffset->xPixelOffset += b;\n    cameraOffset->yPixelOffset += c;\n}\n\nvoid move_tilemap_camera_to_upper_left_corner(void)\n{\n    move_tilemap_camera_to_upper_left_corner_(&sFieldCameraOffset);\n}\n\nvoid FieldUpdateBgTilemapScroll(void)\n{\n    u32 r4, r5;\n    r5 = sFieldCameraOffset.xPixelOffset + sHorizontalCameraPan;\n    r4 = sVerticalCameraPan + sFieldCameraOffset.yPixelOffset + 8;\n\n    SetGpuReg(REG_OFFSET_BG1HOFS, r5);\n    SetGpuReg(REG_OFFSET_BG1VOFS, r4);\n    SetGpuReg(REG_OFFSET_BG2HOFS, r5);\n    SetGpuReg(REG_OFFSET_BG2VOFS, r4);\n    SetGpuReg(REG_OFFSET_BG3HOFS, r5);\n    SetGpuReg(REG_OFFSET_BG3VOFS, r4);\n}\n\nvoid FieldCameraGetPixelOffsetAtGround(s16 *hofs_p, s16 *vofs_p)\n{\n    *hofs_p = sFieldCameraOffset.xPixelOffset + sHorizontalCameraPan;\n    *vofs_p = sFieldCameraOffset.yPixelOffset + sVerticalCameraPan + 8;\n}\n\nvoid DrawWholeMapView(void)\n{\n    DrawWholeMapViewInternal(gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y, gMapHeader.mapLayout);\n   // sFieldCameraOffset.copyBGToVRAM = TRUE;\n}\n\nstatic void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout)\n{\n    u32 i;\n    u32 j;\n    u32 r6;\n    u8 temp;\n\n    for (i = 0; i < 32; i += 2)\n    {\n        temp = sFieldCameraOffset.yTileOffset + i;\n        if (temp >= 32)\n            temp -= 32;\n        r6 = temp * 32;\n        for (j = 0; j < 32; j += 2)\n        {\n            temp = sFieldCameraOffset.xTileOffset + j;\n            if (temp >= 32)\n                temp -= 32;\n            DrawMetatileAt(mapLayout, r6 + temp, x + j / 2, y + i / 2);\n        }\n    }\n}\n\nstatic void RedrawMapSlicesForCameraUpdate(struct FieldCameraOffset *cameraOffset, int x, int y)\n{\n    const struct MapLayout *mapLayout = gMapHeader.mapLayout;\n\n    if (x > 0)\n        RedrawMapSliceWest(cameraOffset, mapLayout);\n    if (x < 0)\n        RedrawMapSliceEast(cameraOffset, mapLayout);\n    if (y > 0)\n        RedrawMapSliceNorth(cameraOffset, mapLayout);\n    if (y < 0)\n        RedrawMapSliceSouth(cameraOffset, mapLayout);\n    cameraOffset->copyBGToVRAM = TRUE;\n}\n\nstatic void RedrawMapSliceNorth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)\n{\n    u32 i;\n    u8 temp;\n    u32 r7;\n\n    temp = cameraOffset->yTileOffset + 28;\n    if (temp >= 32)\n        temp -= 32;\n    r7 = temp * 32;\n    for (i = 0; i < 32; i += 2)\n    {\n        temp = cameraOffset->xTileOffset + i;\n        if (temp >= 32)\n            temp -= 32;\n        DrawMetatileAt(mapLayout, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y + 14);\n    }\n}\n\nstatic void RedrawMapSliceSouth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)\n{\n    u32 i;\n    u8 temp;\n    u32 r7 = cameraOffset->yTileOffset * 32;\n\n    for (i = 0; i < 32; i += 2)\n    {\n        temp = cameraOffset->xTileOffset + i;\n        if (temp >= 32)\n            temp -= 32;\n        DrawMetatileAt(mapLayout, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y);\n    }\n}\n\nstatic void RedrawMapSliceEast(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)\n{\n    u32 i;\n    u8 temp;\n    u32 r6 = cameraOffset->xTileOffset;\n\n    for (i = 0; i < 32; i += 2)\n    {\n        temp = cameraOffset->yTileOffset + i;\n        if (temp >= 32)\n            temp -= 32;\n        DrawMetatileAt(mapLayout, temp * 32 + r6, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y + i / 2);\n    }\n}\n\nstatic void RedrawMapSliceWest(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)\n{\n    u32 i;\n    u8 temp;\n    u8 r5 = cameraOffset->xTileOffset + 28;\n\n    if (r5 >= 32)\n        r5 -= 32;\n    for (i = 0; i < 32; i += 2)\n    {\n        temp = cameraOffset->yTileOffset + i;\n        if (temp >= 32)\n            temp -= 32;\n        DrawMetatileAt(mapLayout, temp * 32 + r5, gSaveBlock1Ptr->pos.x + 14, gSaveBlock1Ptr->pos.y + i / 2);\n    }\n}\n\nvoid CurrentMapDrawMetatileAt(int x, int y)\n{\n    int offset = MapPosToBgTilemapOffset(&sFieldCameraOffset, x, y);\n\n    if (offset >= 0)\n    {\n        DrawMetatileAt(gMapHeader.mapLayout, offset, x, y);\n       // sFieldCameraOffset.copyBGToVRAM = TRUE;\n    }\n}\n\nvoid DrawDoorMetatileAt(int x, int y, const u16 *tiles)\n{\n    int offset = MapPosToBgTilemapOffset(&sFieldCameraOffset, x, y);\n\n    if (offset >= 0)\n    {\n        DrawMetatile(1, tiles, offset);\n       // sFieldCameraOffset.copyBGToVRAM = TRUE;\n    }\n}\n\nstatic void DrawMetatileAt(const struct MapLayout *mapLayout, u16 offset, int x, int y)\n{\n    u16 metatileId = MapGridGetMetatileIdAt(x, y);\n    const u16 *metatiles;\n\n    if (metatileId > NUM_METATILES_TOTAL)\n        metatileId = 0;\n    if (metatileId < NUM_METATILES_IN_PRIMARY)\n        metatiles = mapLayout->primaryTileset->metatiles;\n    else\n    {\n        metatiles = mapLayout->secondaryTileset->metatiles;\n        metatileId -= NUM_METATILES_IN_PRIMARY;\n    }\n    DrawMetatile(MapGridGetMetatileLayerTypeAt(x, y), metatiles + metatileId * 8, offset);\n}\n\nstatic void DrawMetatile(s32 metatileLayerType, const u16 *tiles, u16 offset)\n{\n    switch (metatileLayerType)\n    {\n    case METATILE_LAYER_TYPE_SPLIT:\n        // Draw metatile's bottom layer to the bottom background layer.\n        gBGTilemapBuffers3[offset] = tiles[0];\n        gBGTilemapBuffers3[offset + 1] = tiles[1];\n        gBGTilemapBuffers3[offset + 0x20] = tiles[2];\n        gBGTilemapBuffers3[offset + 0x21] = tiles[3];\n\n        // Draw transparent tiles to the middle background layer.\n        gBGTilemapBuffers1[offset] = 0;\n        gBGTilemapBuffers1[offset + 1] = 0;\n        gBGTilemapBuffers1[offset + 0x20] = 0;\n        gBGTilemapBuffers1[offset + 0x21] = 0;\n\n        // Draw metatile's top layer to the top background layer.\n        gBGTilemapBuffers2[offset] = tiles[4];\n        gBGTilemapBuffers2[offset + 1] = tiles[5];\n        gBGTilemapBuffers2[offset + 0x20] = tiles[6];\n        gBGTilemapBuffers2[offset + 0x21] = tiles[7];\n        break;\n    case METATILE_LAYER_TYPE_COVERED:\n        // Draw metatile's bottom layer to the bottom background layer.\n        gBGTilemapBuffers3[offset] = tiles[0];\n        gBGTilemapBuffers3[offset + 1] = tiles[1];\n        gBGTilemapBuffers3[offset + 0x20] = tiles[2];\n        gBGTilemapBuffers3[offset + 0x21] = tiles[3];\n\n        // Draw metatile's top layer to the middle background layer.\n        gBGTilemapBuffers1[offset] = tiles[4];\n        gBGTilemapBuffers1[offset + 1] = tiles[5];\n        gBGTilemapBuffers1[offset + 0x20] = tiles[6];\n        gBGTilemapBuffers1[offset + 0x21] = tiles[7];\n\n        // Draw transparent tiles to the top background layer.\n        gBGTilemapBuffers2[offset] = 0;\n        gBGTilemapBuffers2[offset + 1] = 0;\n        gBGTilemapBuffers2[offset + 0x20] = 0;\n        gBGTilemapBuffers2[offset + 0x21] = 0;\n        break;\n    case METATILE_LAYER_TYPE_NORMAL:\n        // Draw garbage to the bottom background layer.\n        gBGTilemapBuffers3[offset] = 0x3014;\n        gBGTilemapBuffers3[offset + 1] = 0x3014;\n        gBGTilemapBuffers3[offset + 0x20] = 0x3014;\n        gBGTilemapBuffers3[offset + 0x21] = 0x3014;\n\n        // Draw metatile's bottom layer to the middle background layer.\n        gBGTilemapBuffers1[offset] = tiles[0];\n        gBGTilemapBuffers1[offset + 1] = tiles[1];\n        gBGTilemapBuffers1[offset + 0x20] = tiles[2];\n        gBGTilemapBuffers1[offset + 0x21] = tiles[3];\n\n        // Draw metatile's top layer to the top background layer, which covers object event sprites.\n        gBGTilemapBuffers2[offset] = tiles[4];\n        gBGTilemapBuffers2[offset + 1] = tiles[5];\n        gBGTilemapBuffers2[offset + 0x20] = tiles[6];\n        gBGTilemapBuffers2[offset + 0x21] = tiles[7];\n        break;\n    }\n    ScheduleBgCopyTilemapToVram(1);\n    ScheduleBgCopyTilemapToVram(2);\n    ScheduleBgCopyTilemapToVram(3);\n}\n\nstatic s32 MapPosToBgTilemapOffset(struct FieldCameraOffset *cameraOffset, s32 x, s32 y)\n{\n    x -= gSaveBlock1Ptr->pos.x;\n    x *= 2;\n    if (x >= 32 || x < 0)\n        return -1;\n    x = x + cameraOffset->xTileOffset;\n    if (x >= 32)\n        x -= 32;\n\n    y = (y - gSaveBlock1Ptr->pos.y) * 2;\n    if (y >= 32 || y < 0)\n        return -1;\n    y = y + cameraOffset->yTileOffset;\n    if (y >= 32)\n        y -= 32;\n\n    return y * 32 + x;\n}\n\nstatic void CameraUpdateCallback(struct CameraObject *fieldCamera)\n{\n    if (fieldCamera->spriteId != 0)\n    {\n        fieldCamera->movementSpeedX = gSprites[fieldCamera->spriteId].data[2];\n        fieldCamera->movementSpeedY = gSprites[fieldCamera->spriteId].data[3];\n    }\n}\n\nvoid ResetCameraUpdateInfo(void)\n{\n    gFieldCamera.movementSpeedX = 0;\n    gFieldCamera.movementSpeedY = 0;\n    gFieldCamera.x = 0;\n    gFieldCamera.y = 0;\n    gFieldCamera.spriteId = 0;\n    gFieldCamera.callback = NULL;\n}\n\nu32 InitCameraUpdateCallback(u8 trackedSpriteId)\n{\n    if (gFieldCamera.spriteId != 0)\n        DestroySprite(&gSprites[gFieldCamera.spriteId]);\n    gFieldCamera.spriteId = AddCameraObject(trackedSpriteId);\n    gFieldCamera.callback = CameraUpdateCallback;\n    return 0;\n}\n\nvoid CameraUpdate(void)\n{\n    int deltaX;\n    int deltaY;\n    int curMovementOffsetY;\n    int curMovementOffsetX;\n    int movementSpeedX;\n    int movementSpeedY;\n\n    if (gFieldCamera.callback != NULL)\n        gFieldCamera.callback(&gFieldCamera);\n    movementSpeedX = gFieldCamera.movementSpeedX;\n    movementSpeedY = gFieldCamera.movementSpeedY;\n    deltaX = 0;\n    deltaY = 0;\n    curMovementOffsetX = gFieldCamera.x;\n    curMovementOffsetY = gFieldCamera.y;\n\n\n    if (curMovementOffsetX == 0 && movementSpeedX != 0)\n    {\n        if (movementSpeedX > 0)\n            deltaX = 1;\n        else\n            deltaX = -1;\n    }\n    if (curMovementOffsetY == 0 && movementSpeedY != 0)\n    {\n        if (movementSpeedY > 0)\n            deltaY = 1;\n        else\n            deltaY = -1;\n    }\n    if (curMovementOffsetX != 0 && curMovementOffsetX == -movementSpeedX)\n    {\n        if (movementSpeedX > 0)\n            deltaX = 1;\n        else\n            deltaX = -1;\n    }\n    if (curMovementOffsetY != 0 && curMovementOffsetY == -movementSpeedY)\n    {\n        if (movementSpeedY > 0)\n            deltaX = 1;\n        else\n            deltaX = -1;\n    }\n\n    gFieldCamera.x += movementSpeedX;\n    gFieldCamera.x = gFieldCamera.x - 16 * (gFieldCamera.x / 16);\n    gFieldCamera.y += movementSpeedY;\n    gFieldCamera.y = gFieldCamera.y - 16 * (gFieldCamera.y / 16);\n\n    if (deltaX != 0 || deltaY != 0)\n    {\n        CameraMove(deltaX, deltaY);\n        UpdateObjectEventsForCameraUpdate(deltaX, deltaY);\n        // RotatingGatePuzzleCameraUpdate(deltaX, deltaY);\n        // ResetBerryTreeSparkleFlags();\n        tilemap_move_something(&sFieldCameraOffset, deltaX * 2, deltaY * 2);\n        RedrawMapSlicesForCameraUpdate(&sFieldCameraOffset, deltaX * 2, deltaY * 2);\n    }\n\n    coords8_add(&sFieldCameraOffset, movementSpeedX, movementSpeedY);\n    gTotalCameraPixelOffsetX -= movementSpeedX;\n    gTotalCameraPixelOffsetY -= movementSpeedY;\n}\n\nvoid MoveCameraAndRedrawMap(int deltaX, int deltaY) // unused\n{\n    CameraMove(deltaX, deltaY);\n    UpdateObjectEventsForCameraUpdate(deltaX, deltaY);\n    DrawWholeMapView();\n    gTotalCameraPixelOffsetX -= deltaX * 16;\n    gTotalCameraPixelOffsetY -= deltaY * 16;\n}\n\nvoid CameraUpdateNoObjectRefresh(void)\n{\n    int deltaX;\n    int deltaY;\n    int curMovementOffsetY;\n    int curMovementOffsetX;\n    int movementSpeedX;\n    int movementSpeedY;\n\n    if (gFieldCamera.callback != NULL)\n        gFieldCamera.callback(&gFieldCamera);\n    movementSpeedX = gFieldCamera.movementSpeedX;\n    movementSpeedY = gFieldCamera.movementSpeedY;\n    deltaX = 0;\n    deltaY = 0;\n    curMovementOffsetX = gFieldCamera.x;\n    curMovementOffsetY = gFieldCamera.y;\n\n\n    if (curMovementOffsetX == 0 && movementSpeedX != 0)\n    {\n        if (movementSpeedX > 0)\n            deltaX = 1;\n        else\n            deltaX = -1;\n    }\n    if (curMovementOffsetY == 0 && movementSpeedY != 0)\n    {\n        if (movementSpeedY > 0)\n            deltaY = 1;\n        else\n            deltaY = -1;\n    }\n    if (curMovementOffsetX != 0 && curMovementOffsetX == -movementSpeedX)\n    {\n        if (movementSpeedX > 0)\n            deltaX = 1;\n        else\n            deltaX = -1;\n    }\n    if (curMovementOffsetY != 0 && curMovementOffsetY == -movementSpeedY)\n    {\n        if (movementSpeedY > 0)\n            deltaX = 1;\n        else\n            deltaX = -1;\n    }\n\n    gFieldCamera.x += movementSpeedX;\n    gFieldCamera.x = gFieldCamera.x - 16 * (gFieldCamera.x / 16);\n    gFieldCamera.y += movementSpeedY;\n    gFieldCamera.y = gFieldCamera.y - 16 * (gFieldCamera.y / 16);\n\n    if (deltaX != 0 || deltaY != 0)\n    {\n        CameraMove(deltaX, deltaY);\n        // UpdateObjectEventsForCameraUpdate(deltaX, deltaY);\n        // RotatingGatePuzzleCameraUpdate(deltaX, deltaY);\n        // ResetBerryTreeSparkleFlags();\n        tilemap_move_something(&sFieldCameraOffset, deltaX * 2, deltaY * 2);\n        RedrawMapSlicesForCameraUpdate(&sFieldCameraOffset, deltaX * 2, deltaY * 2);\n    }\n\n    coords8_add(&sFieldCameraOffset, movementSpeedX, movementSpeedY);\n    // gTotalCameraPixelOffsetX -= movementSpeedX;\n    // gTotalCameraPixelOffsetY -= movementSpeedY;\n}\n\nvoid SetCameraPanningCallback(void (*a)(void))\n{\n    sFieldCameraPanningCallback = a;\n}\n\nvoid SetCameraPanning(s16 a, s16 b)\n{\n    sHorizontalCameraPan = a;\n    sVerticalCameraPan = b + 32;\n}\n\nvoid InstallCameraPanAheadCallback(void)\n{\n    sFieldCameraPanningCallback = CameraPanningCB_PanAhead;\n    sBikeCameraPanFlag = FALSE;\n    sHorizontalCameraPan = 0;\n    sVerticalCameraPan = 32;\n}\n\nvoid UpdateCameraPanning(void)\n{\n    if (sFieldCameraPanningCallback != NULL)\n        sFieldCameraPanningCallback();\n    // Update sprite offset of overworld objects\n    gSpriteCoordOffsetX = gTotalCameraPixelOffsetX - sHorizontalCameraPan;\n    gSpriteCoordOffsetY = gTotalCameraPixelOffsetY - sVerticalCameraPan - 8;\n}\n\nstatic void CameraPanningCB_PanAhead(void)\n{\n    u8 var;\n\n    if (gBikeCameraAheadPanback == FALSE)\n    {\n        InstallCameraPanAheadCallback();\n    }\n    else\n    {\n        // this code is never reached.\n        if (gPlayerAvatar.tileTransitionState == 1)\n        {\n            sBikeCameraPanFlag ^= 1;\n            if (sBikeCameraPanFlag == FALSE)\n                return;\n        }\n        else\n        {\n            sBikeCameraPanFlag = FALSE;\n        }\n\n        var = GetPlayerMovementDirection();\n        if (var == 2)\n        {\n            if (sVerticalCameraPan > -8)\n                sVerticalCameraPan -= 2;\n        }\n        else if (var == 1)\n        {\n            if (sVerticalCameraPan < 72)\n                sVerticalCameraPan += 2;\n        }\n        else if (sVerticalCameraPan < 32)\n        {\n            sVerticalCameraPan += 2;\n        }\n        else if (sVerticalCameraPan > 32)\n        {\n            sVerticalCameraPan -= 2;\n        }\n    }\n}\n"
  },
  {
    "path": "src/field_control_avatar.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"bike.h\"\n#include \"coord_event_weather.h\"\n#include \"daycare.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"event_scripts.h\"\n#include \"faraway_island.h\"\n#include \"fieldmap.h\"\n#include \"field_control_avatar.h\"\n#include \"field_fadetransition.h\"\n#include \"field_player_avatar.h\"\n#include \"field_poison.h\"\n#include \"field_specials.h\"\n#include \"item_menu.h\"\n#include \"link.h\"\n#include \"map_name_popup.h\"\n#include \"wonder_news.h\"\n#include \"metatile_behavior.h\"\n#include \"overworld.h\"\n#include \"renewable_hidden_items.h\"\n#include \"quest_log.h\"\n#include \"safari_zone.h\"\n#include \"script.h\"\n#include \"start_menu.h\"\n#include \"trainer_see.h\"\n#include \"vs_seeker.h\"\n#include \"wild_encounter.h\"\n#include \"constants/songs.h\"\n#include \"constants/event_bg.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/maps.h\"\n#include \"constants/metatile_behaviors.h\"\n#include \"constants/region_map_sections.h\"\n\n#define SIGNPOST_POKECENTER 0\n#define SIGNPOST_POKEMART 1\n#define SIGNPOST_INDIGO_1 2\n#define SIGNPOST_INDIGO_2 3\n#define SIGNPOST_SAFARI 4\n#define SIGNPOST_SCRIPTED 240\n#define SIGNPOST_NA 255\n\nstatic void QuestLogOverrideJoyVars(struct FieldInput *input, u16 *newKeys, u16 *heldKeys);\nstatic void Task_QuestLogPlayback_OpenStartMenu(u8 taskId);\nstatic void GetPlayerPosition(struct MapPosition * position);\nstatic void GetInFrontOfPlayerPosition(struct MapPosition * position);\nstatic u16 GetPlayerCurMetatileBehavior(void);\nstatic bool8 TryStartInteractionScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection);\nstatic const u8 *GetInteractionScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection);\nstatic const u8 *GetInteractedObjectEventScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection);\nstatic const u8 *GetInteractedBackgroundEventScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection);\nstatic const struct BgEvent *GetBackgroundEventAtPosition(struct MapHeader *, u16, u16, u8);\nstatic const u8 *GetInteractedMetatileScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection);\nstatic const u8 *GetInteractedWaterScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection);\nstatic bool8 TryStartStepBasedScript(struct MapPosition * position, u16 metatileBehavior, u16 playerDirection);\nstatic bool8 TryStartCoordEventScript(struct MapPosition * position);\nstatic bool8 TryStartMiscWalkingScripts(u16 metatileBehavior);\nstatic bool8 TryStartStepCountScript(u16 metatileBehavior);\nstatic void UpdateHappinessStepCounter(void);\nstatic bool8 UpdatePoisonStepCounter(void);\nstatic bool8 CheckStandardWildEncounter(u32 metatileAttributes);\nstatic bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection);\nstatic void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection);\nstatic u8 GetFacingSignpostType(u16 metatileBehvaior, u8 direction);\nstatic const u8 *GetSignpostScriptAtMapPosition(struct MapPosition * position);\nstatic bool8 TryArrowWarp(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection);\nstatic bool8 TryStartWarpEventScript(struct MapPosition * position, u16 metatileBehavior);\nstatic bool8 IsWarpMetatileBehavior(u16 metatileBehavior);\nstatic void SetupWarp(struct MapHeader * mapHeader, s8 warpId, struct MapPosition * position);\nstatic bool8 IsArrowWarpMetatileBehavior(u16 metatileBehavior, u8 playerDirection);\nstatic s8 GetWarpEventAtMapPosition(struct MapHeader * mapHeader, struct MapPosition * mapPosition);\nstatic bool8 TryDoorWarp(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection);\nstatic s8 GetWarpEventAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z);\nstatic const u8 *GetCoordEventScriptAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z);\nstatic bool8 EnableAutoRun(void);\nstatic bool8 SwitchBikeGears(void);\nstatic bool32 TrySetupDiveEmergeScript(void);\nstatic bool32 TrySetupDiveDownScript(void);\n\nstruct FieldInput gFieldInputRecord;\n\nvoid FieldClearPlayerInput(struct FieldInput *input)\n{\n    input->pressedAButton = FALSE;\n    input->checkStandardWildEncounter = FALSE;\n    input->pressedStartButton = FALSE;\n    input->pressedSelectButton = FALSE;\n    input->heldDirection = FALSE;\n    input->heldDirection2 = FALSE;\n    input->tookStep = FALSE;\n    input->pressedBButton = FALSE;\n    input->pressedRButton = FALSE;\n    input->input_field_1_0 = FALSE;\n    input->input_field_1_1 = FALSE;\n    input->input_field_1_2 = FALSE;\n    input->input_field_1_3 = FALSE;\n    input->dpadDirection = 0;\n}\n\nvoid FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys)\n{\n    u8 runningState = gPlayerAvatar.runningState;\n    u8 tileTransitionState = gPlayerAvatar.tileTransitionState;\n    bool8 forcedMove = MetatileBehavior_IsForcedMovementTile(GetPlayerCurMetatileBehavior());\n\n    if (!ScriptContext_IsEnabled() && IsQuestLogInputDpad() == TRUE)\n    {\n        QuestLogOverrideJoyVars(input, &newKeys, &heldKeys);\n    }\n    if ((tileTransitionState == T_TILE_CENTER && forcedMove == FALSE) || tileTransitionState == T_NOT_MOVING)\n    {\n        if (GetPlayerSpeed() != PLAYER_SPEED_FASTEST)\n        {\n            if ((newKeys & START_BUTTON) && !(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED))\n                input->pressedStartButton = TRUE;\n            if (!QL_IS_PLAYBACK_STATE)\n            {\n                if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED))\n                {\n                    if (newKeys & SELECT_BUTTON)\n                        input->pressedSelectButton = TRUE;\n                    if (newKeys & A_BUTTON)\n                        input->pressedAButton = TRUE;\n                    if (newKeys & B_BUTTON)\n                        input->pressedBButton = TRUE;\n                    if (newKeys & R_BUTTON)\n                        input->pressedRButton = TRUE;\n                }\n            }\n        }\n\n        if (!QL_IS_PLAYBACK_STATE)\n        {\n            if (heldKeys & (DPAD_UP | DPAD_DOWN | DPAD_LEFT | DPAD_RIGHT))\n            {\n                input->heldDirection = TRUE;\n                input->heldDirection2 = TRUE;\n            }\n        }\n\n    }\n\n    if (forcedMove == FALSE)\n    {\n        if (tileTransitionState == T_TILE_CENTER && runningState == MOVING)\n            input->tookStep = TRUE;\n        if (forcedMove == FALSE && tileTransitionState == T_TILE_CENTER)\n            input->checkStandardWildEncounter = TRUE;\n    }\n\n    if (!QL_IS_PLAYBACK_STATE)\n    {\n        if (heldKeys & DPAD_UP)\n            input->dpadDirection = DIR_NORTH;\n        else if (heldKeys & DPAD_DOWN)\n            input->dpadDirection = DIR_SOUTH;\n        else if (heldKeys & DPAD_LEFT)\n            input->dpadDirection = DIR_WEST;\n        else if (heldKeys & DPAD_RIGHT)\n            input->dpadDirection = DIR_EAST;\n    }\n}\n\nstatic void QuestLogOverrideJoyVars(struct FieldInput *input, u16 *newKeys, u16 *heldKeys)\n{\n    switch (GetRegisteredQuestLogInput())\n    {\n    case QL_INPUT_OFF:\n        break;\n    case QL_INPUT_UP:\n        *heldKeys = *newKeys = DPAD_UP;\n        break;\n    case QL_INPUT_DOWN:\n        *heldKeys = *newKeys = DPAD_DOWN;\n        break;\n    case QL_INPUT_LEFT:\n        *heldKeys = *newKeys = DPAD_LEFT;\n        break;\n    case QL_INPUT_RIGHT:\n        *heldKeys = *newKeys = DPAD_RIGHT;\n        break;\n    case QL_INPUT_L:\n        *heldKeys = *newKeys = L_BUTTON;\n        break;\n    case QL_INPUT_R:\n        *heldKeys = *newKeys = R_BUTTON;\n        break;\n    case QL_INPUT_START:\n        *heldKeys = *newKeys = START_BUTTON;\n        break;\n    case QL_INPUT_SELECT:\n        *heldKeys = *newKeys = SELECT_BUTTON;\n        break;\n    }\n    ClearQuestLogInputIsDpadFlag();\n    ClearQuestLogInput();\n}\n\nint ProcessPlayerFieldInput(struct FieldInput *input)\n{\n    struct MapPosition position;\n    u8 playerDirection;\n    u16 metatileBehavior;\n    u32 metatileAttributes;\n\n    ResetFacingNpcOrSignpostVars();\n    playerDirection = GetPlayerFacingDirection();\n    GetPlayerPosition(&position);\n    metatileAttributes = MapGridGetMetatileAttributeAt(position.x, position.y, METATILE_ATTRIBUTES_ALL);\n    metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y);\n\n    FieldClearPlayerInput(&gFieldInputRecord);\n    gFieldInputRecord.dpadDirection = input->dpadDirection;\n\n    if (CheckForTrainersWantingBattle() == TRUE)\n        return TRUE;\n\n    if (TryRunOnFrameMapScript() == TRUE)\n        return TRUE;\n    \n    if (input->pressedBButton && TrySetupDiveEmergeScript() == TRUE)\n        return TRUE;\n\n    if (input->tookStep)\n    {\n        IncrementGameStat(GAME_STAT_STEPS);\n        WonderNews_IncrementStepCounter();\n        IncrementRenewableHiddenItemStepCounter();\n        RunMassageCooldownStepCounter();\n        IncrementResortGorgeousStepCounter();\n        IncrementBirthIslandRockStepCount();\n        UpdateBattleHouseStepCounter();\n        if (TryStartStepBasedScript(&position, metatileBehavior, playerDirection) == TRUE)\n        {\n            gFieldInputRecord.tookStep = TRUE;\n            return TRUE;\n        }\n    }\n    if (input->checkStandardWildEncounter)\n    {\n        if (input->dpadDirection == 0 || input->dpadDirection == playerDirection)\n        {\n            GetInFrontOfPlayerPosition(&position);\n            metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y);\n            if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE)\n            {\n                gFieldInputRecord.checkStandardWildEncounter = TRUE;\n                return TRUE;\n            }\n            GetPlayerPosition(&position);\n            metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y);\n        }\n    }\n    if (input->checkStandardWildEncounter && CheckStandardWildEncounter(metatileAttributes) == TRUE)\n    {\n        gFieldInputRecord.checkStandardWildEncounter = TRUE;\n        return TRUE;\n    }\n    if (input->heldDirection && input->dpadDirection == playerDirection)\n    {\n        if (TryArrowWarp(&position, metatileBehavior, playerDirection) == TRUE)\n        {\n            gFieldInputRecord.heldDirection = TRUE;\n            return TRUE;\n        }\n    }\n\n    GetInFrontOfPlayerPosition(&position);\n    metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y);\n    if (input->heldDirection && input->dpadDirection == playerDirection)\n    {\n        if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE)\n        {\n            gFieldInputRecord.heldDirection = TRUE;\n            return TRUE;\n        }\n    }\n\n    if (input->pressedAButton && TryStartInteractionScript(&position, metatileBehavior, playerDirection) == TRUE)\n    {\n        gFieldInputRecord.pressedAButton = TRUE;\n        return TRUE;\n    }\n\n    if (input->heldDirection2 && input->dpadDirection == playerDirection)\n    {\n        if (TryDoorWarp(&position, metatileBehavior, playerDirection) == TRUE)\n        {\n            gFieldInputRecord.heldDirection2 = TRUE;\n            return TRUE;\n        }\n    }\n    \n    if (input->pressedAButton && TrySetupDiveDownScript() == TRUE)\n        return TRUE;\n\n    if (input->pressedStartButton)\n    {\n        gFieldInputRecord.pressedStartButton = TRUE;\n        FlagSet(FLAG_OPENED_START_MENU);\n        PlaySE(SE_WIN_OPEN);\n        ShowStartMenu();\n        return TRUE;\n    }\n    if (input->pressedSelectButton && UseRegisteredKeyItemOnField() == TRUE)\n    {\n        gFieldInputRecord.pressedSelectButton = TRUE;\n        return TRUE;\n    }\n    if (input->pressedRButton && (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_ON_FOOT)) && EnableAutoRun())\n        return TRUE;\n    //switch bike gears\n    if (input->pressedBButton && (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) && GetCurrentRegionMapSectionId() != MAPSEC_ROUTE_17 && SwitchBikeGears())\n        return TRUE;\n\n    return FALSE;\n}\n\nvoid FieldInput_HandleCancelSignpost(struct FieldInput * input)\n{\n    if (ScriptContext_IsEnabled() == TRUE)\n    {\n        if (gWalkAwayFromSignInhibitTimer != 0)\n            gWalkAwayFromSignInhibitTimer--;\n        else if (CanWalkAwayToCancelMsgBox() == TRUE)\n        {\n            if (input->dpadDirection != 0 && GetPlayerFacingDirection() != input->dpadDirection)\n            {\n                if (IsMsgBoxWalkawayDisabled() == TRUE)\n                    return;\n                if (input->dpadDirection == DIR_NORTH)\n                    RegisterQuestLogInput(QL_INPUT_UP);\n                else if (input->dpadDirection == DIR_SOUTH)\n                    RegisterQuestLogInput(QL_INPUT_DOWN);\n                else if (input->dpadDirection == DIR_WEST)\n                    RegisterQuestLogInput(QL_INPUT_LEFT);\n                else if (input->dpadDirection == DIR_EAST)\n                    RegisterQuestLogInput(QL_INPUT_RIGHT);\n                ScriptContext_SetupScript(EventScript_CancelMessageBox);\n                LockPlayerFieldControls();\n            }\n            else if (input->pressedStartButton)\n            {\n                ScriptContext_SetupScript(EventScript_CancelMessageBox);\n                LockPlayerFieldControls();\n                if (!FuncIsActiveTask(Task_QuestLogPlayback_OpenStartMenu))\n                    CreateTask(Task_QuestLogPlayback_OpenStartMenu, 8);\n            }\n        }\n    }\n}\n\nstatic void Task_QuestLogPlayback_OpenStartMenu(u8 taskId)\n{\n    if (!ArePlayerFieldControlsLocked())\n    {\n        PlaySE(SE_WIN_OPEN);\n        ShowStartMenu();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void GetPlayerPosition(struct MapPosition *position)\n{\n    PlayerGetDestCoords(&position->x, &position->y);\n    position->elevation = PlayerGetElevation();\n}\n\nstatic void GetInFrontOfPlayerPosition(struct MapPosition *position)\n{\n    s16 x, y;\n\n    GetXYCoordsOneStepInFrontOfPlayer(&position->x, &position->y);\n    PlayerGetDestCoords(&x, &y);\n    if (MapGridGetElevationAt(x, y) != 0)\n        position->elevation = PlayerGetElevation();\n    else\n        position->elevation = 0;\n}\n\nstatic u16 GetPlayerCurMetatileBehavior(void)\n{\n    s16 x, y;\n\n    PlayerGetDestCoords(&x, &y);\n    return MapGridGetMetatileBehaviorAt(x, y);\n}\n\nstatic bool8 TryStartInteractionScript(struct MapPosition *position, u16 metatileBehavior, u8 direction)\n{\n    const u8 *script = GetInteractionScript(position, metatileBehavior, direction);\n    if (script == NULL)\n        return FALSE;\n\n    // Don't play interaction sound for certain scripts.\n    if (script != PalletTown_PlayersHouse_2F_EventScript_PC\n        && script != EventScript_PC)\n        PlaySE(SE_SELECT);\n\n    ScriptContext_SetupScript(script);\n    return TRUE;\n}\n\nstatic const u8 *GetInteractionScript(struct MapPosition *position, u8 metatileBehavior, u8 direction)\n{\n    const u8 *script = GetInteractedObjectEventScript(position, metatileBehavior, direction);\n    if (script != NULL)\n        return script;\n\n    script = GetInteractedBackgroundEventScript(position, metatileBehavior, direction);\n    if (script != NULL)\n        return script;\n\n    script = GetInteractedMetatileScript(position, metatileBehavior, direction);\n    if (script != NULL)\n        return script;\n\n    script = GetInteractedWaterScript(position, metatileBehavior, direction);\n    if (script != NULL)\n        return script;\n\n    return NULL;\n}\n\nconst u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatileBehavior, u8 direction)\n{\n    u8 objectEventId;\n    s32 i;\n\n    if (!MetatileBehavior_IsCounter(MapGridGetMetatileBehaviorAt(position->x, position->y)))\n        objectEventId = GetObjectEventIdByPosition(position->x, position->y, position->elevation);\n    else\n        objectEventId = GetObjectEventIdByPosition(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->elevation);\n\n    if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER)\n        return NULL;\n\n    for (i = 0; i < MAX_LINK_PLAYERS; i++)\n    {\n        if (gLinkPlayerObjectEvents[i].active == TRUE && gLinkPlayerObjectEvents[i].objEventId == objectEventId)\n            return NULL;\n    }\n\n    gSelectedObjectEvent = objectEventId;\n    gSpecialVar_LastTalked = gObjectEvents[objectEventId].localId;\n    gSpecialVar_Facing = direction;\n    return GetObjectEventScriptPointerByObjectEventId(objectEventId);\n}\n\nstatic const u8 *GetInteractedObjectEventScript(struct MapPosition *position, u8 metatileBehavior, u8 direction)\n{\n    u8 objectEventId;\n    const u8 *script;\n\n    objectEventId = GetObjectEventIdByPosition(position->x, position->y, position->elevation);\n    if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER)\n    {\n        if (MetatileBehavior_IsCounter(metatileBehavior) != TRUE)\n            return NULL;\n\n        // Look for an object event on the other side of the counter.\n        objectEventId = GetObjectEventIdByPosition(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->elevation);\n        if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER)\n            return NULL;\n    }\n\n    if (InUnionRoom() == TRUE && !ObjectEventCheckHeldMovementStatus(&gObjectEvents[objectEventId]))\n        return NULL;\n\n    gSelectedObjectEvent = objectEventId;\n    gSpecialVar_LastTalked = gObjectEvents[objectEventId].localId;\n    gSpecialVar_Facing = direction;\n\n    script = GetObjectEventScriptPointerByObjectEventId(objectEventId);\n\n    script = GetRamScript(gSpecialVar_LastTalked, script);\n    return script;\n}\n\nstatic const u8 *GetInteractedBackgroundEventScript(struct MapPosition *position, u8 metatileBehavior, u8 direction)\n{\n    u8 signpostType;\n    const struct BgEvent *bgEvent = GetBackgroundEventAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation);\n\n    if (bgEvent == NULL)\n        return NULL;\n    if (bgEvent->bgUnion.script == NULL)\n        return EventScript_ReleaseEnd;\n\n    signpostType = GetFacingSignpostType(metatileBehavior, direction);\n\n    switch (bgEvent->kind)\n    {\n    case BG_EVENT_PLAYER_FACING_ANY:\n    default:\n        break;\n    case BG_EVENT_PLAYER_FACING_NORTH:\n        if (direction != DIR_NORTH)\n            return NULL;\n        break;\n    case BG_EVENT_PLAYER_FACING_SOUTH:\n        if (direction != DIR_SOUTH)\n            return NULL;\n        break;\n    case BG_EVENT_PLAYER_FACING_EAST:\n        if (direction != DIR_EAST)\n            return NULL;\n        break;\n    case BG_EVENT_PLAYER_FACING_WEST:\n        if (direction != DIR_WEST)\n            return NULL;\n        break;\n    case 5:\n    case 6:\n    case BG_EVENT_HIDDEN_ITEM:\n        if (GetHiddenItemAttr(bgEvent->bgUnion.hiddenItem, HIDDEN_ITEM_UNDERFOOT) == TRUE)\n            return NULL;\n        gSpecialVar_0x8005 = GetHiddenItemAttr(bgEvent->bgUnion.hiddenItem, HIDDEN_ITEM_ITEM);\n        gSpecialVar_0x8004 = GetHiddenItemAttr(bgEvent->bgUnion.hiddenItem, HIDDEN_ITEM_FLAG);\n        gSpecialVar_0x8006 = GetHiddenItemAttr(bgEvent->bgUnion.hiddenItem, HIDDEN_ITEM_QUANTITY);\n        if (FlagGet(gSpecialVar_0x8004) == TRUE)\n            return NULL;\n        gSpecialVar_Facing = direction;\n        return EventScript_HiddenItemScript;\n    }\n\n    if (signpostType != SIGNPOST_NA)\n        MsgSetSignpost();\n    gSpecialVar_Facing = direction;\n    return bgEvent->bgUnion.script;\n}\n\nstatic const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 metatileBehavior, u8 direction)\n{\n    gSpecialVar_Facing = direction;\n    if (MetatileBehavior_IsPC(metatileBehavior) == TRUE)\n        return EventScript_PC;\n    if (MetatileBehavior_IsRegionMap(metatileBehavior) == TRUE)\n        return EventScript_WallTownMap;\n    if (MetatileBehavior_IsBookshelf(metatileBehavior) == TRUE)\n        return EventScript_Bookshelf;\n    if (MetatileBehavior_IsPokeMartShelf(metatileBehavior) == TRUE)\n        return EventScript_PokeMartShelf;\n    if (MetatileBehavior_IsFood(metatileBehavior) == TRUE)\n        return EventScript_Food;\n    if (MetatileBehavior_IsImpressiveMachine(metatileBehavior) == TRUE)\n        return EventScript_ImpressiveMachine;\n    if (MetatileBehavior_IsBlueprints(metatileBehavior) == TRUE)\n        return EventScript_Blueprints;\n    if (MetatileBehavior_IsVideoGame(metatileBehavior) == TRUE)\n        return EventScript_VideoGame;\n    if (MetatileBehavior_IsBurglary(metatileBehavior) == TRUE)\n        return EventScript_Burglary;\n    if (MetatileBehavior_IsComputer(metatileBehavior) == TRUE)\n        return EventScript_Computer;\n    if (MetatileBehavior_IsTrainerTowerMonitor(metatileBehavior) == TRUE)\n        return TrainerTower_EventScript_ShowTime;\n    if (MetatileBehavior_IsPlayerFacingTVScreen(metatileBehavior, direction) == TRUE)\n        return EventScript_PlayerFacingTVScreen;\n    if (MetatileBehavior_IsCabinet(metatileBehavior) == TRUE)\n        return EventScript_Cabinet;\n    if (MetatileBehavior_IsKitchen(metatileBehavior) == TRUE)\n        return EventScript_Kitchen;\n    if (MetatileBehavior_IsDresser(metatileBehavior) == TRUE)\n        return EventScript_Dresser;\n    if (MetatileBehavior_IsSnacks(metatileBehavior) == TRUE)\n        return EventScript_Snacks;\n    if (MetatileBehavior_IsPainting(metatileBehavior) == TRUE)\n        return EventScript_Painting;\n    if (MetatileBehavior_IsPowerPlantMachine(metatileBehavior) == TRUE)\n        return EventScript_PowerPlantMachine;\n    if (MetatileBehavior_IsTelephone(metatileBehavior) == TRUE)\n        return EventScript_Telephone;\n    if (MetatileBehavior_IsAdvertisingPoster(metatileBehavior) == TRUE)\n        return EventScript_AdvertisingPoster;\n    if (MetatileBehavior_IsTastyFood(metatileBehavior) == TRUE)\n        return EventScript_TastyFood;\n    if (MetatileBehavior_IsTrashBin(metatileBehavior) == TRUE)\n        return EventScript_TrashBin;\n    if (MetatileBehavior_IsCup(metatileBehavior) == TRUE)\n        return EventScript_Cup;\n    if (MetatileBehavior_IsPolishedWindow(metatileBehavior) == TRUE)\n        return EventScript_PolishedWindow;\n    if (MetatileBehavior_IsBeautifulSkyWindow(metatileBehavior) == TRUE)\n        return EventScript_BeautifulSkyWindow;\n    if (MetatileBehavior_IsBlinkingLights(metatileBehavior) == TRUE)\n        return EventScript_BlinkingLights;\n    if (MetatileBehavior_IsNeatlyLinedUpTools(metatileBehavior) == TRUE)\n        return EventScript_NeatlyLinedUpTools;\n    if (MetatileBehavior_IsSafariExtensionSign(metatileBehavior, direction) == TRUE)\n    {\n        MsgSetSignpost();\n        return EventScript_SafariZone_ExtensionSign;\n    }\n    if (MetatileBehavior_IsPlayerFacingCableClubWirelessMonitor(metatileBehavior, direction) == TRUE)\n        return CableClub_EventScript_ShowWirelessCommunicationScreen;\n    if (MetatileBehavior_IsQuestionnaire(metatileBehavior) == TRUE)\n        return EventScript_Questionnaire;\n    if (MetatileBehavior_IsPlayerFacingBattleRecords(metatileBehavior, direction) == TRUE)\n        return CableClub_EventScript_ShowBattleRecords;\n    if (MetatileBehavior_IsIndigoPlateauSign1(metatileBehavior) == TRUE)\n    {\n        MsgSetSignpost();\n        return EventScript_Indigo_UltimateGoal;\n    }\n    if (MetatileBehavior_IsIndigoPlateauSign2(metatileBehavior) == TRUE)\n    {\n        MsgSetSignpost();\n        return EventScript_Indigo_HighestAuthority;\n    }\n    if (MetatileBehavior_IsPlayerFacingPokeMartSign(metatileBehavior, direction) == TRUE)\n    {\n        MsgSetSignpost();\n        return EventScript_PokemartSign;\n    }\n    if (MetatileBehavior_IsPlayerFacingPokemonCenterSign(metatileBehavior, direction) == TRUE)\n    {\n        MsgSetSignpost();\n        return EventScript_PokecenterSign;\n    }\n    return NULL;\n}\n\nstatic const u8 *GetInteractedWaterScript(struct MapPosition *unused1, u8 metatileBehavior, u8 direction)\n{\n    if (MetatileBehavior_IsFastWater(metatileBehavior) == TRUE && PartyHasMonWithSurf() == TRUE)\n        return EventScript_CurrentTooFast;\n    if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE)\n        return EventScript_UseSurf;\n\n    if (MetatileBehavior_IsWaterfall(metatileBehavior) == TRUE)\n    {\n        if (FlagGet(FLAG_BADGE07_GET) == TRUE && IsPlayerSurfingNorth() == TRUE)\n            return EventScript_Waterfall;\n        else\n            return EventScript_CantUseWaterfall;\n    }\n    return NULL;\n}\n\nstatic bool8 TryStartStepBasedScript(struct MapPosition *position, u16 metatileBehavior, u16 direction)\n{\n    if (TryStartCoordEventScript(position) == TRUE)\n        return TRUE;\n    if (TryStartWarpEventScript(position, metatileBehavior) == TRUE)\n        return TRUE;\n    if (TryStartMiscWalkingScripts(metatileBehavior) == TRUE)\n        return TRUE;\n    if (TryStartStepCountScript(metatileBehavior) == TRUE)\n        return TRUE;\n    if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior) && UpdateRepelCounter() == TRUE)\n        return TRUE;\n    return FALSE;\n}\n\nstatic bool8 TryStartCoordEventScript(struct MapPosition *position)\n{\n    const u8 *script = GetCoordEventScriptAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation);\n\n    if (script == NULL)\n        return FALSE;\n    ScriptContext_SetupScript(script);\n    return TRUE;\n}\n\nstatic bool8 TryStartMiscWalkingScripts(u16 metatileBehavior)\n{\n    // Dummied\n    return FALSE;\n}\n\nstatic bool8 TryStartStepCountScript(u16 metatileBehavior)\n{\n    if (InUnionRoom() == TRUE)\n        return FALSE;\n    if (gQuestLogState == QL_STATE_PLAYBACK)\n        return FALSE;\n\n    UpdateHappinessStepCounter();\n    UpdateFarawayIslandStepCounter();\n\n    if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior))\n    {\n        if (UpdateVsSeekerStepCounter() == TRUE)\n        {\n            ScriptContext_SetupScript(EventScript_VsSeekerChargingDone);\n            return TRUE;\n        }\n        else if (UpdatePoisonStepCounter() == TRUE)\n        {\n            ScriptContext_SetupScript(EventScript_FieldPoison);\n            return TRUE;\n        }\n        else if (ShouldEggHatch())\n        {\n            IncrementGameStat(GAME_STAT_HATCHED_EGGS);\n            ScriptContext_SetupScript(EventScript_EggHatch);\n            return TRUE;\n        }\n    }\n    if (SafariZoneTakeStep() == TRUE)\n        return TRUE;\n    return FALSE;\n}\n\nstatic void Unref_ClearHappinessStepCounter(void)\n{\n    VarSet(VAR_HAPPINESS_STEP_COUNTER, 0);\n}\n\nstatic void UpdateHappinessStepCounter(void)\n{\n    u16 *ptr = GetVarPointer(VAR_HAPPINESS_STEP_COUNTER);\n    int i;\n\n    (*ptr)++;\n    (*ptr) %= 128;\n    if (*ptr == 0)\n    {\n        struct Pokemon *mon = gPlayerParty;\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            AdjustFriendship(mon, FRIENDSHIP_EVENT_WALKING);\n            mon++;\n        }\n    }\n}\n\nvoid ClearPoisonStepCounter(void)\n{\n    VarSet(VAR_POISON_STEP_COUNTER, 0);\n}\n\nstatic bool8 UpdatePoisonStepCounter(void)\n{\n    u16 *ptr;\n\n    if (gMapHeader.mapType != MAP_TYPE_SECRET_BASE)\n    {\n        ptr = GetVarPointer(VAR_POISON_STEP_COUNTER);\n        (*ptr)++;\n        (*ptr) %= 5;\n        if (*ptr == 0)\n        {\n            switch (DoPoisonFieldEffect())\n            {\n            case FLDPSN_NONE:\n                return FALSE;\n            case FLDPSN_PSN:\n                return FALSE;\n            case FLDPSN_FNT:\n                return TRUE;\n            }\n        }\n    }\n    return FALSE;\n}\n\nvoid RestartWildEncounterImmunitySteps(void)\n{\n    ResetEncounterRateModifiers();\n}\n\nstatic bool8 CheckStandardWildEncounter(u32 metatileAttributes)\n{\n    return TryStandardWildEncounter(metatileAttributes);\n}\n\nstatic bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection)\n{\n    u8 signpostType;\n    const u8 * script;\n    if (JOY_HELD(DPAD_LEFT | DPAD_RIGHT))\n        return FALSE;\n    if (playerDirection == DIR_EAST || playerDirection == DIR_WEST)\n        return FALSE;\n\n    signpostType = GetFacingSignpostType(metatileBehavior, playerDirection);\n    if (signpostType == SIGNPOST_POKECENTER)\n    {\n        SetUpWalkIntoSignScript(EventScript_PokecenterSign, playerDirection);\n        return TRUE;\n    }\n    else if (signpostType == SIGNPOST_POKEMART)\n    {\n        SetUpWalkIntoSignScript(EventScript_PokemartSign, playerDirection);\n        return TRUE;\n    }\n    else if (signpostType == SIGNPOST_INDIGO_1)\n    {\n        SetUpWalkIntoSignScript(EventScript_Indigo_UltimateGoal, playerDirection);\n        return TRUE;\n    }\n    else if (signpostType == SIGNPOST_INDIGO_2)\n    {\n        SetUpWalkIntoSignScript(EventScript_Indigo_HighestAuthority, playerDirection);\n        return TRUE;\n    }\n    else if(signpostType == SIGNPOST_SAFARI)\n    {\n        SetUpWalkIntoSignScript(EventScript_SafariZone_ExtensionSign, playerDirection);\n        return TRUE;\n    }\n    else\n    {\n        script = GetSignpostScriptAtMapPosition(position);\n        if (script == NULL)\n            return FALSE;\n        if (signpostType != SIGNPOST_SCRIPTED)\n            return FALSE;\n        SetUpWalkIntoSignScript(script, playerDirection);\n        return TRUE;\n    }\n}\n\nstatic u8 GetFacingSignpostType(u16 metatileBehavior, u8 playerDirection)\n{\n    if (MetatileBehavior_IsPlayerFacingPokemonCenterSign(metatileBehavior, playerDirection) == TRUE)\n        return SIGNPOST_POKECENTER;\n\n    if (MetatileBehavior_IsPlayerFacingPokeMartSign(metatileBehavior, playerDirection) == TRUE)\n        return SIGNPOST_POKEMART;\n\n    if (MetatileBehavior_IsIndigoPlateauSign1(metatileBehavior) == TRUE)\n        return SIGNPOST_INDIGO_1;\n\n    if (MetatileBehavior_IsIndigoPlateauSign2(metatileBehavior) == TRUE)\n        return SIGNPOST_INDIGO_2;\n\n    if (MetatileBehavior_IsSafariExtensionSign(metatileBehavior, playerDirection) == TRUE)\n        return SIGNPOST_SAFARI;\n\n    if (MetatileBehavior_IsSignpost(metatileBehavior) == TRUE)\n        return SIGNPOST_SCRIPTED;\n\n    return SIGNPOST_NA;\n}\n\nstatic void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection)\n{\n    gSpecialVar_Facing = playerDirection;\n    ScriptContext_SetupScript(script);\n    SetWalkingIntoSignVars();\n    MsgSetSignpost();\n}\n\nstatic const u8 *GetSignpostScriptAtMapPosition(struct MapPosition * position)\n{\n    const struct BgEvent * event = GetBackgroundEventAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation);\n    if (event == NULL)\n        return NULL;\n    if (event->bgUnion.script != NULL)\n        return event->bgUnion.script;\n    return EventScript_ReleaseEnd;\n}\n\nstatic bool8 TryArrowWarp(struct MapPosition *position, u16 metatileBehavior, u8 direction)\n{\n    s8 warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position);\n    u16 delay;\n\n    if (warpEventId != -1)\n    {\n        if (IsArrowWarpMetatileBehavior(metatileBehavior, direction) == TRUE)\n        {\n            StoreInitialPlayerAvatarState();\n            SetupWarp(&gMapHeader, warpEventId, position);\n            DoWarp();\n            return TRUE;\n        }\n        else if (IsDirectionalStairWarpMetatileBehavior(metatileBehavior, direction) == TRUE)\n        {\n            delay = 0;\n            if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))\n            {\n                SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);\n                delay = 12;\n            }\n            StoreInitialPlayerAvatarState();\n            SetupWarp(&gMapHeader, warpEventId, position);\n            DoStairWarp(metatileBehavior, delay);\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 TryStartWarpEventScript(struct MapPosition *position, u16 metatileBehavior)\n{\n    s8 warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position);\n\n    if (warpEventId != -1 && IsWarpMetatileBehavior(metatileBehavior) == TRUE)\n    {\n        StoreInitialPlayerAvatarState();\n        SetupWarp(&gMapHeader, warpEventId, position);\n        if (MetatileBehavior_IsEscalator(metatileBehavior) == TRUE)\n        {\n            DoEscalatorWarp(metatileBehavior);\n            return TRUE;\n        }\n        if (MetatileBehavior_IsLavaridgeB1FWarp(metatileBehavior) == TRUE)\n        {\n            DoLavaridgeGymB1FWarp();\n            return TRUE;\n        }\n        if (MetatileBehavior_IsLavaridge1FWarp(metatileBehavior) == TRUE)\n        {\n            DoLavaridgeGym1FWarp();\n            return TRUE;\n        }\n        if (MetatileBehavior_IsWarpPad(metatileBehavior) == TRUE)\n        {\n            DoTeleportWarp();\n            return TRUE;\n        }\n        if (MetatileBehavior_IsUnionRoomWarp(metatileBehavior) == TRUE)\n        {\n            DoUnionRoomWarp();\n            return TRUE;\n        }\n        if (MetatileBehavior_IsFallWarp(metatileBehavior) == TRUE)\n        {\n            ResetInitialPlayerAvatarState();\n            ScriptContext_SetupScript(EventScript_DoFallWarp);\n            return TRUE;\n        }\n        DoWarp();\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 IsWarpMetatileBehavior(u16 metatileBehavior)\n{\n    if (MetatileBehavior_IsWarpDoor(metatileBehavior) == TRUE)\n        return TRUE;\n    if (MetatileBehavior_IsLadder(metatileBehavior) == TRUE)\n        return TRUE;\n    if (MetatileBehavior_IsEscalator(metatileBehavior) == TRUE)\n        return TRUE;\n    if (MetatileBehavior_IsNonAnimDoor(metatileBehavior) == TRUE)\n        return TRUE;\n    if (MetatileBehavior_IsLavaridgeB1FWarp(metatileBehavior) == TRUE)\n        return TRUE;\n    if (MetatileBehavior_IsLavaridge1FWarp(metatileBehavior) == TRUE)\n        return TRUE;\n    if (MetatileBehavior_IsWarpPad(metatileBehavior) == TRUE)\n        return TRUE;\n    if (MetatileBehavior_IsFallWarp(metatileBehavior) == TRUE)\n        return TRUE;\n    if (MetatileBehavior_IsUnionRoomWarp(metatileBehavior) == TRUE)\n        return TRUE;\n    return FALSE;\n}\n\nbool8 IsDirectionalStairWarpMetatileBehavior(u16 metatileBehavior, u8 playerDirection)\n{\n    switch (playerDirection)\n    {\n    case DIR_WEST:\n        if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior))\n            return TRUE;\n        if (MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior))\n            return TRUE;\n        break;\n    case DIR_EAST:\n        if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior))\n            return TRUE;\n        if (MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior))\n            return TRUE;\n        break;\n    }\n    return FALSE;\n}\n\nstatic bool8 IsArrowWarpMetatileBehavior(u16 metatileBehavior, u8 direction)\n{\n    switch (direction)\n    {\n    case DIR_NORTH:\n        return MetatileBehavior_IsNorthArrowWarp(metatileBehavior);\n    case DIR_SOUTH:\n        return MetatileBehavior_IsSouthArrowWarp(metatileBehavior);\n    case DIR_WEST:\n        return MetatileBehavior_IsWestArrowWarp(metatileBehavior);\n    case DIR_EAST:\n        return MetatileBehavior_IsEastArrowWarp(metatileBehavior);\n    }\n    return FALSE;\n}\n\nstatic s8 GetWarpEventAtMapPosition(struct MapHeader *mapHeader, struct MapPosition *position)\n{\n    return GetWarpEventAtPosition(mapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation);\n}\n\nstatic void SetupWarp(struct MapHeader *unused, s8 warpEventId, struct MapPosition *position)\n{\n    const struct WarpEvent *warpEvent;\n\n    warpEvent = &gMapHeader.events->warps[warpEventId];\n\n    if (warpEvent->mapNum == MAP_NUM(DYNAMIC))\n    {\n        SetWarpDestinationToDynamicWarp(warpEvent->warpId);\n    }\n    else\n    {\n        const struct MapHeader *mapHeader;\n\n        SetWarpDestinationToMapWarp(warpEvent->mapGroup, warpEvent->mapNum, warpEvent->warpId);\n        UpdateEscapeWarp(position->x, position->y);\n        mapHeader = Overworld_GetMapHeaderByGroupAndId(warpEvent->mapGroup, warpEvent->mapNum);\n        if (mapHeader->events->warps[warpEvent->warpId].mapNum == MAP_NUM(DYNAMIC))\n            SetDynamicWarp(mapHeader->events->warps[warpEventId].warpId, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, warpEventId);\n    }\n}\n\nstatic bool8 TryDoorWarp(struct MapPosition *position, u16 metatileBehavior, u8 direction)\n{\n    s8 warpEventId;\n\n    if (direction == DIR_NORTH)\n    {\n        if (MetatileBehavior_IsWarpDoor(metatileBehavior) == TRUE)\n        {\n            warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position);\n            if (warpEventId != -1 && IsWarpMetatileBehavior(metatileBehavior) == TRUE)\n            {\n                StoreInitialPlayerAvatarState();\n                SetupWarp(&gMapHeader, warpEventId, position);\n                DoDoorWarp();\n                return TRUE;\n            }\n        }\n    }\n    return FALSE;\n}\n\nstatic s8 GetWarpEventAtPosition(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation)\n{\n    s32 i;\n    const struct WarpEvent *warpEvent = mapHeader->events->warps;\n    u8 warpCount = mapHeader->events->warpCount;\n\n    for (i = 0; i < warpCount; i++, warpEvent++)\n    {\n        if ((u16)warpEvent->x == x && (u16)warpEvent->y == y)\n        {\n            if (warpEvent->elevation == elevation || warpEvent->elevation == 0)\n                return i;\n        }\n    }\n    return -1;\n}\n\nstatic const u8 *TryRunCoordEventScript(const struct CoordEvent *coordEvent)\n{\n    if (coordEvent != NULL)\n    {\n        if (coordEvent->script == NULL)\n        {\n            DoCoordEventWeather(coordEvent->trigger);\n            return NULL;\n        }\n        if (coordEvent->trigger == 0)\n        {\n            RunScriptImmediately(coordEvent->script);\n            return NULL;\n        }\n        if (VarGet(coordEvent->trigger) == (u8)coordEvent->index)\n            return coordEvent->script;\n    }\n    return NULL;\n}\n\nstatic const u8 *GetCoordEventScriptAtPosition(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation)\n{\n    s32 i;\n    const struct CoordEvent *coordEvents = mapHeader->events->coordEvents;\n    u8 coordEventCount = mapHeader->events->coordEventCount;\n\n    for (i = 0; i < coordEventCount; i++)\n    {\n        if ((u16)coordEvents[i].x == x && (u16)coordEvents[i].y == y)\n        {\n            if (coordEvents[i].elevation == elevation || coordEvents[i].elevation == 0)\n            {\n                const u8 *script = TryRunCoordEventScript(&coordEvents[i]);\n                if (script != NULL)\n                    return script;\n            }\n        }\n    }\n    return NULL;\n}\n\nvoid HandleBoulderFallThroughHole(struct ObjectEvent * object)\n{\n    if (MapGridGetMetatileBehaviorAt(object->currentCoords.x, object->currentCoords.y) == MB_FALL_WARP)\n    {\n        PlaySE(SE_FALL);\n        RemoveObjectEventByLocalIdAndMap(object->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);\n        FlagClear(GetBoulderRevealFlagByLocalIdAndMap(object->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup));\n    }\n}\n\nvoid HandleBoulderActivateVictoryRoadSwitch(u16 x, u16 y)\n{\n    int i;\n    const struct CoordEvent * events = gMapHeader.events->coordEvents;\n    int n = gMapHeader.events->coordEventCount;\n\n    if (MapGridGetMetatileBehaviorAt(x, y) == MB_STRENGTH_BUTTON)\n    {\n        for (i = 0; i < n; i++)\n        {\n            if (events[i].x + MAP_OFFSET == x && events[i].y + MAP_OFFSET == y)\n            {\n                QuestLog_CutRecording();\n                ScriptContext_SetupScript(events[i].script);\n                LockPlayerFieldControls();\n            }\n        }\n    }\n}\n\nconst u8 *GetCoordEventScriptAtMapPosition(struct MapPosition *position)\n{\n    return GetCoordEventScriptAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation);\n}\n\nstatic const struct BgEvent *GetBackgroundEventAtPosition(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation)\n{\n    u32 i;\n    const struct BgEvent *bgEvents = mapHeader->events->bgEvents;\n    u8 bgEventCount = mapHeader->events->bgEventCount;\n\n    for (i = 0; i < bgEventCount; i++)\n    {\n        if ((u16)bgEvents[i].x == x && (u16)bgEvents[i].y == y)\n        {\n            if (bgEvents[i].elevation == elevation || bgEvents[i].elevation == 0)\n                return &bgEvents[i];\n        }\n    }\n    return NULL;\n}\n\nbool8 dive_warp(struct MapPosition *position, u16 metatileBehavior)\n{\n    if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && !MetatileBehavior_IsUnableToEmerge(metatileBehavior))\n    {\n        if (SetDiveWarpEmerge(position->x - MAP_OFFSET, position->y - MAP_OFFSET))\n        {\n            StoreInitialPlayerAvatarState();\n            DoDiveWarp();\n            PlaySE(SE_M_DIVE);\n            return TRUE;\n        }\n    }\n    else if (MetatileBehavior_IsDiveable(metatileBehavior) == TRUE)\n    {\n        if (SetDiveWarpDive(position->x - MAP_OFFSET, position->y - MAP_OFFSET))\n        {\n            StoreInitialPlayerAvatarState();\n            DoDiveWarp();\n            PlaySE(SE_M_DIVE);\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nu8 TrySetDiveWarp(void)\n{\n    s16 x, y;\n    u8 metatileBehavior;\n\n    PlayerGetDestCoords(&x, &y);\n    metatileBehavior = MapGridGetMetatileBehaviorAt(x, y);\n    if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && !MetatileBehavior_IsUnableToEmerge(metatileBehavior))\n    {\n        if (SetDiveWarpEmerge(x - MAP_OFFSET, y - MAP_OFFSET) == TRUE)\n            return 1;\n    }\n    else if (MetatileBehavior_IsDiveable(metatileBehavior) == TRUE)\n    {\n        if (SetDiveWarpDive(x - MAP_OFFSET, y - MAP_OFFSET) == TRUE)\n            return 2;\n    }\n    return 0;\n}\n\nstatic const u8 *GetObjectEventScriptPointerPlayerFacing(void)\n{\n    u8 direction;\n    struct MapPosition position;\n\n    direction = GetPlayerMovementDirection();\n    GetInFrontOfPlayerPosition(&position);\n    return GetInteractedObjectEventScript(&position, MapGridGetMetatileBehaviorAt(position.x, position.y), direction);\n}\n\nint SetCableClubWarp(void)\n{\n    struct MapPosition position;\n\n    GetPlayerMovementDirection();  // unnecessary\n    GetPlayerPosition(&position);\n    MapGridGetMetatileBehaviorAt(position.x, position.y);  // unnecessary\n    SetupWarp(&gMapHeader, GetWarpEventAtMapPosition(&gMapHeader, &position), &position);\n    return 0;\n}\n\nextern const u8 EventScript_EnableAutoRun[];\nstatic bool8 EnableAutoRun(void)\n{\n    if (!FlagGet(FLAG_AUTO_RUN_TOGGLED))\n    {\n        FlagSet(FLAG_AUTO_RUN_TOGGLED);\n        if(FlagGet(FLAG_AUTO_RUN_EXPLAINED))\n        {\n            PlaySE(SE_SELECT);\n        }\n        else\n        {\n            FlagSet(FLAG_AUTO_RUN_EXPLAINED);\n            DismissMapNamePopup();\n            ScriptContext_SetupScript(EventScript_EnableAutoRun);\n        }\n        return FALSE;\n    }\n    else\n    {\n        FlagClear(FLAG_AUTO_RUN_TOGGLED);\n        PlaySE(SE_SELECT);\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 SwitchBikeGears(void)\n{\n    if(!FlagGet(FLAG_BIKE_GEAR))\n    {\n        FlagSet(FLAG_BIKE_GEAR);\n        PlaySE(SE_BIKE_BELL);\n        return FALSE;\n    }\n    else\n    {\n        FlagClear(FLAG_BIKE_GEAR);\n        PlaySE(SE_BIKE_BELL);\n        return FALSE;\n    }\n    return TRUE;\n}\n\n//dive\nstatic bool32 TrySetupDiveDownScript(void)\n{\n    if (FlagGet(FLAG_SYS_CAN_LINK_WITH_RS) && TrySetDiveWarp() == 2)\n    {\n        ScriptContext_SetupScript(EventScript_DeepWater);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool32 TrySetupDiveEmergeScript(void)\n{\n    if(GetCurrentRegionMapSectionId() == MAPSEC_UNDERWATER_124)\n    {\n        s16 x, y;\n        PlayerGetDestCoords(&x, &y);\n\n        if(MapGridGetMetatileIdAt(x, y) == 0x296) //if emergable tile\n        {\n            ScriptContext_SetupScript(EventScript_TrySurface);\n            return TRUE;\n        }\n        return FALSE;\n    }\n    if (FlagGet(FLAG_SYS_CAN_LINK_WITH_RS) && gMapHeader.mapType == MAP_TYPE_UNDERWATER && TrySetDiveWarp() == 1)\n    {\n        ScriptContext_SetupScript(EventScript_TrySurface);\n        return TRUE;\n    }\n    return FALSE;\n}\n\n"
  },
  {
    "path": "src/field_door.c",
    "content": "#include \"global.h\"\n#include \"field_camera.h\"\n#include \"task.h\"\n#include \"fieldmap.h\"\n#include \"metatile_behavior.h\"\n#include \"constants/songs.h\"\n#include \"constants/metatile_labels.h\"\n\nenum {\n    DOOR_SOUND_NORMAL,\n    DOOR_SOUND_SLIDING,\n};\n\nenum {\n    DOOR_SIZE_1x1,\n    DOOR_SIZE_1x2,\n};\n\nstruct DoorAnimFrame\n{\n    u8 duration;\n    u16 tileOffset;\n};\n\nstruct DoorGraphics\n{\n    u16 metatileId;\n    u8 sound;\n    u8 size;\n    const u8 *tiles;\n    const u8 *paletteNums;\n};\n\nstatic void DrawClosedDoorTiles(const struct DoorGraphics *gfx, int x, int y);\nstatic void CopyDoorTilesToVram(const u8 *tiles);\nstatic void DrawCurrentDoorAnimFrame(const struct DoorGraphics *gfx, int x, int y, const u8 *paletteNums);\nstatic void BuildDoorTiles(u16 *tiles, u16 tileNum, const u8 *paletteNums);\nstatic bool32 AnimateDoorFrame(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, s16 *data);\nstatic const struct DoorAnimFrame *GetLastDoorAnimFrame(const struct DoorAnimFrame *frames);\nstatic s8 GetDoorSoundType(const struct DoorGraphics *gfx, int x, int y);\n\nstatic const u8 sDoorAnimTiles_General[] = INCBIN_U8(\"graphics/door_anims/general.4bpp\");\nstatic const u16 sDoorNullPalette1[16] = {};\nstatic const u8 sDoorAnimTiles_SlidingSingle[] = INCBIN_U8(\"graphics/door_anims/sliding_single.4bpp\");\nstatic const u16 sDoorNullPalette2[16] = {};\nstatic const u8 sDoorAnimTiles_SlidingDouble[] = INCBIN_U8(\"graphics/door_anims/sliding_double.4bpp\");\nstatic const u16 sDoorNullPalette3[16] = {};\nstatic const u8 sDoorAnimTiles_Pallet[] = INCBIN_U8(\"graphics/door_anims/pallet.4bpp\");\nstatic const u16 sDoorNullPalette4[16] = {};\nstatic const u8 sDoorAnimTiles_OaksLab[] = INCBIN_U8(\"graphics/door_anims/oaks_lab.4bpp\");\nstatic const u16 sDoorNullPalette5[16] = {};\nstatic const u8 sDoorAnimTiles_Viridian[] = INCBIN_U8(\"graphics/door_anims/viridian.4bpp\");\nstatic const u16 sDoorNullPalette6[16] = {};\nstatic const u8 sDoorAnimTiles_Pewter[] = INCBIN_U8(\"graphics/door_anims/pewter.4bpp\");\nstatic const u16 sDoorNullPalette7[16] = {};\nstatic const u8 sDoorAnimTiles_Saffron[] = INCBIN_U8(\"graphics/door_anims/saffron.4bpp\");\nstatic const u16 sDoorNullPalette8[16] = {};\nstatic const u8 sDoorAnimTiles_SilphCo[] = INCBIN_U8(\"graphics/door_anims/silph_co.4bpp\");\nstatic const u16 sDoorNullPalette9[16] = {};\nstatic const u8 sDoorAnimTiles_Cerulean[] = INCBIN_U8(\"graphics/door_anims/cerulean.4bpp\");\nstatic const u16 sDoorNullPalette10[16] = {};\nstatic const u8 sDoorAnimTiles_Lavender[] = INCBIN_U8(\"graphics/door_anims/lavender.4bpp\");\nstatic const u16 sDoorNullPalette11[16] = {};\nstatic const u8 sDoorAnimTiles_Vermilion[] = INCBIN_U8(\"graphics/door_anims/vermilion.4bpp\");\nstatic const u16 sDoorNullPalette12[16] = {};\nstatic const u8 sDoorAnimTiles_PokemonFanClub[] = INCBIN_U8(\"graphics/door_anims/pokemon_fan_club.4bpp\");\nstatic const u16 sDoorNullPalette13[16] = {};\nstatic const u8 sDoorAnimTiles_DeptStore[] = INCBIN_U8(\"graphics/door_anims/dept_store.4bpp\");\nstatic const u16 sDoorNullPalette14[16] = {};\nstatic const u8 sDoorAnimTiles_Fuchsia[] = INCBIN_U8(\"graphics/door_anims/fuchsia.4bpp\");\nstatic const u16 sDoorNullPalette15[16] = {};\nstatic const u8 sDoorAnimTiles_SafariZone[] = INCBIN_U8(\"graphics/door_anims/safari_zone.4bpp\");\nstatic const u16 sDoorNullPalette16[16] = {};\nstatic const u8 sDoorAnimTiles_CinnabarLab[] = INCBIN_U8(\"graphics/door_anims/cinnabar_lab.4bpp\");\nstatic const u16 sDoorNullPalette17[16] = {};\nstatic const u8 sDoorAnimTiles_DeptStoreElevator[] = INCBIN_U8(\"graphics/door_anims/dept_store_elevator.4bpp\");\nstatic const u16 sDoorNullPalette18[16] = {};\nstatic const u8 sDoorAnimTiles_CableClub[] = INCBIN_U8(\"graphics/door_anims/cable_club.4bpp\");\nstatic const u16 sDoorNullPalette19[16] = {};\nstatic const u8 sDoorAnimTiles_HideoutElevator[] = INCBIN_U8(\"graphics/door_anims/hideout_elevator.4bpp\");\nstatic const u16 sDoorNullPalette20[16] = {};\nstatic const u8 sDoorAnimTiles_SSAnne[] = INCBIN_U8(\"graphics/door_anims/ss_anne.4bpp\");\nstatic const u16 sDoorNullPalette21[16] = {};\n\n// Doors from R/S dummied below\nstatic const u8 sDoorAnimTiles_Empty1[256 * 3] = {};\nstatic const u16 sDoorNullPalette22[16] = {};\nstatic const u8 sDoorAnimTiles_Empty2[256 * 3] = {};\nstatic const u16 sDoorNullPalette23[16] = {};\nstatic const u8 sDoorAnimTiles_Empty3[256 * 3] = {};\nstatic const u16 sDoorNullPalette24[16] = {};\nstatic const u8 sDoorAnimTiles_Empty4[256 * 3] = {};\nstatic const u16 sDoorNullPalette25[16] = {};\nstatic const u8 sDoorAnimTiles_Empty5[256 * 3] = {};\nstatic const u16 sDoorNullPalette26[16] = {};\nstatic const u8 sDoorAnimTiles_Empty6[256 * 3] = {};\nstatic const u16 sDoorNullPalette27[16] = {};\nstatic const u8 sDoorAnimTiles_Empty7[256 * 3] = {};\nstatic const u16 sDoorNullPalette28[16] = {};\nstatic const u8 sDoorAnimTiles_Empty8[128 * 3] = {};\nstatic const u16 sDoorNullPalette29[16] = {};\nstatic const u8 sDoorAnimTiles_Empty9[128 * 3] = {};\nstatic const u16 sDoorNullPalette30[16] = {};\nstatic const u8 sDoorAnimTiles_Empty10[128 * 3] = {};\nstatic const u16 sDoorNullPalette31[16] = {};\nstatic const u8 sDoorAnimTiles_Empty11[128 * 3] = {};\nstatic const u16 sDoorNullPalette32[16] = {};\nstatic const u8 sDoorAnimTiles_Empty12[128 * 3] = {};\nstatic const u16 sDoorNullPalette33[16] = {};\nstatic const u8 sDoorAnimTiles_Empty13[128 * 3] = {};\nstatic const u16 sDoorNullPalette34[16] = {};\nstatic const u8 sDoorAnimTiles_Empty14[128 * 3] = {};\nstatic const u16 sDoorNullPalette35[16] = {};\nstatic const u8 sDoorAnimTiles_Empty15[128 * 3] = {};\nstatic const u16 sDoorNullPalette36[16] = {};\nstatic const u8 sDoorAnimTiles_Empty16[128 * 3] = {};\nstatic const u16 sDoorNullPalette37[16] = {};\nstatic const u8 sDoorAnimTiles_Empty17[128 * 3] = {};\nstatic const u16 sDoorNullPalette38[16] = {};\nstatic const u8 sDoorAnimTiles_Empty18[128 * 3] = {};\nstatic const u16 sDoorNullPalette39[16] = {};\nstatic const u8 sDoorAnimTiles_Empty19[128 * 3] = {};\nstatic const u16 sDoorNullPalette40[16] = {};\nstatic const u8 sDoorAnimTiles_Empty20[128 * 3] = {};\nstatic const u16 sDoorNullPalette41[16] = {};\nstatic const u8 sDoorAnimTiles_Empty21[128 * 3] = {};\nstatic const u16 sDoorNullPalette42[16] = {};\nstatic const u8 sDoorAnimTiles_Empty22[128 * 3] = {};\nstatic const u16 sDoorNullPalette43[16] = {};\nstatic const u8 sDoorAnimTiles_Empty23[128 * 3] = {};\nstatic const u16 sDoorNullPalette44[16] = {};\nstatic const u8 sDoorAnimTiles_Empty24[128 * 3] = {};\nstatic const u16 sDoorNullPalette45[16] = {};\nstatic const u8 sDoorAnimTiles_Empty25[128 * 3] = {};\nstatic const u16 sDoorNullPalette46[16] = {};\nstatic const u8 sDoorAnimTiles_Empty26[128 * 3] = {};\nstatic const u16 sDoorNullPalette47[16] = {};\nstatic const u8 sDoorAnimTiles_Empty27[128 * 3] = {};\nstatic const u16 sDoorNullPalette48[16] = {};\nstatic const u8 sDoorAnimTiles_Empty28[128 * 3] = {};\nstatic const u16 sDoorNullPalette49[16] = {};\nstatic const u8 sDoorAnimTiles_Empty29[128 * 3] = {};\nstatic const u16 sDoorNullPalette50[16] = {};\nstatic const u8 sDoorAnimTiles_Empty30[128 * 3] = {};\nstatic const u16 sDoorNullPalette51[16] = {};\nstatic const u8 sDoorAnimTiles_Empty31[128 * 3] = {};\nstatic const u16 sDoorNullPalette52[16] = {};\n\n// Unused block of door tiles\nstatic const u8 sDoorAnimTiles_UnusedTop[] = INCBIN_U8(\"graphics/door_anims/unused_top.4bpp\");\nstatic const u8 sDoorAnimTiles_Empty32[256] = {};\nstatic const u8 sDoorAnimTiles_UnusedMidTop[] = INCBIN_U8(\"graphics/door_anims/unused_midtop.4bpp\");\nstatic const u8 sDoorAnimTiles_Empty33[256] = {};\nstatic const u8 sDoorAnimTiles_UnusedMidBottom[] = INCBIN_U8(\"graphics/door_anims/unused_midbottom.4bpp\");\nstatic const u8 sDoorAnimTiles_Empty34[256] = {};\nstatic const u8 sDoorAnimTiles_UnusedBottom[] = INCBIN_U8(\"graphics/door_anims/unused_bottom.4bpp\");\nstatic const u16 sDoorNullPalette53[16] = {};\n\n// Used FRLG doors resume\nstatic const u8 sDoorAnimTiles_SilphCoElevator[] = INCBIN_U8(\"graphics/door_anims/silph_co_elevator.4bpp\");\nstatic const u16 sDoorNullPalette54[16] = {};\nstatic const u8 sDoorAnimTiles_Sevii123[] = INCBIN_U8(\"graphics/door_anims/sevii_123.4bpp\");\nstatic const u16 sDoorNullPalette55[16] = {};\nstatic const u8 sDoorAnimTiles_JoyfulGameCorner[] = INCBIN_U8(\"graphics/door_anims/joyful_game_corner.4bpp\");\nstatic const u16 sDoorNullPalette56[16] = {};\nstatic const u8 sDoorAnimTiles_OneIslandPokeCenter[] = INCBIN_U8(\"graphics/door_anims/one_island_poke_center.4bpp\");\nstatic const u16 sDoorNullPalette57[16] = {};\nstatic const u8 sDoorAnimTiles_Sevii45[] = INCBIN_U8(\"graphics/door_anims/sevii_45.4bpp\");\nstatic const u16 sDoorNullPalette58[16] = {};\nstatic const u8 sDoorAnimTiles_FourIslandDayCare[] = INCBIN_U8(\"graphics/door_anims/four_island_day_care.4bpp\");\nstatic const u16 sDoorNullPalette59[16] = {};\nstatic const u8 sDoorAnimTiles_RocketWarehouse[] = INCBIN_U8(\"graphics/door_anims/rocket_warehouse.4bpp\");\nstatic const u16 sDoorNullPalette60[16] = {};\nstatic const u8 sDoorAnimTiles_Sevii67[] = INCBIN_U8(\"graphics/door_anims/sevii_67.4bpp\");\nstatic const u16 sDoorNullPalette61[16] = {};\nstatic const u8 sDoorAnimTiles_Teleporter[] = INCBIN_U8(\"graphics/door_anims/teleporter.4bpp\");\nstatic const u16 sDoorNullPalette62[16] = {};\nstatic const u8 sDoorAnimTiles_TrainerTowerLobbyElevator[] = INCBIN_U8(\"graphics/door_anims/trainer_tower_lobby_elevator.4bpp\");\nstatic const u16 sDoorNullPalette63[16] = {};\nstatic const u8 sDoorAnimTiles_TrainerTowerRoofElevator[] = INCBIN_U8(\"graphics/door_anims/trainer_tower_roof_elevator.4bpp\");\nstatic const u16 sDoorNullPalette64[16] = {};\nstatic const u8 sDoorAnimTiles_BattleTower[] = INCBIN_U8(\"graphics/door_anims/battle_tower.4bpp\");\nstatic const u16 sDoorNullPalette65[16] = {};\nstatic const u8 sDoorAnimTiles_BattleTowerElevator[] = INCBIN_U8(\"graphics/door_anims/battle_tower_elevator.4bpp\");\nstatic const u16 sDoorNullPalette66[16] = {};\n\n#define CLOSED_DOOR_TILES_OFFSET 0xFFFF\n\nstatic const struct DoorAnimFrame sDoorAnimFrames_OpenSmall[] = {\n    {4, CLOSED_DOOR_TILES_OFFSET},\n    {4, 0 * TILE_SIZE_4BPP},\n    {4, 4 * TILE_SIZE_4BPP},\n    {4, 8 * TILE_SIZE_4BPP},\n    {}\n};\n\nstatic const struct DoorAnimFrame sDoorAnimFrames_OpenLarge[] = {\n    {4, CLOSED_DOOR_TILES_OFFSET},\n    {4, 0 * TILE_SIZE_4BPP},\n    {4, 8 * TILE_SIZE_4BPP},\n    {4, 16 * TILE_SIZE_4BPP},\n    {}\n};\n\nstatic const struct DoorAnimFrame sDoorAnimFrames_CloseSmall[] = {\n    {4, 8 * TILE_SIZE_4BPP},\n    {4, 4 * TILE_SIZE_4BPP},\n    {4, 0 * TILE_SIZE_4BPP},\n    {4, CLOSED_DOOR_TILES_OFFSET},\n    {}\n};\n\nstatic const struct DoorAnimFrame sDoorAnimFrames_CloseLarge[] = {\n    {4, 16 * TILE_SIZE_4BPP},\n    {4, 8 * TILE_SIZE_4BPP},\n    {4, 0 * TILE_SIZE_4BPP},\n    {4, CLOSED_DOOR_TILES_OFFSET},\n    {}\n};\n\nstatic const u8 sDoorAnimPalettes_General[] = {2, 2, 2, 2, 2, 2, 2, 2};\nstatic const u8 sDoorAnimPalettes_SlidingSingle[] = {3, 3, 3, 3, 3, 3, 3, 3};\nstatic const u8 sDoorAnimPalettes_SlidingDouble[] = {3, 3, 3, 3, 3, 3, 3, 3};\nstatic const u8 sDoorAnimPalettes_Pallet[] = {8, 8, 8, 8, 8, 8, 8, 8};\nstatic const u8 sDoorAnimPalettes_OaksLab[] = {10, 10, 10, 10, 10, 10, 10, 10};\nstatic const u8 sDoorAnimPalettes_Viridian[] = {8, 8, 8, 8, 8, 8, 8, 8};\nstatic const u8 sDoorAnimPalettes_Pewter[] = {8, 8, 8, 8, 8, 8, 8, 8};\nstatic const u8 sDoorAnimPalettes_Saffron[] = {8, 8, 8, 8, 8, 8, 8, 8};\nstatic const u8 sDoorAnimPalettes_SilphCo[] = {3, 3, 3, 3, 3, 3, 3, 3};\nstatic const u8 sDoorAnimPalettes_Cerulean[] = {12, 12, 12, 12, 12, 12, 12, 12};\nstatic const u8 sDoorAnimPalettes_Lavender[] = {9, 9, 9, 9, 9, 9, 9, 9};\nstatic const u8 sDoorAnimPalettes_Vermilion[] = {9, 9, 9, 9, 9, 9, 9, 9};\nstatic const u8 sDoorAnimPalettes_PokemonFanClub[] = {9, 9, 9, 9, 9, 9, 9, 9};\nstatic const u8 sDoorAnimPalettes_DeptStore[] = {3, 3, 3, 3, 3, 3, 3, 3};\nstatic const u8 sDoorAnimPalettes_Fuchsia[] = {8, 8, 8, 8, 8, 8, 8, 8};\nstatic const u8 sDoorAnimPalettes_SafariZone[] = {9, 9, 9, 9, 9, 9, 9, 9};\nstatic const u8 sDoorAnimPalettes_CinnabarLab[] = {3, 3, 3, 3, 3, 3, 3, 3};\nstatic const u8 sDoorAnimPalettes_DeptStoreElevator[] = {8, 8, 8, 8, 8, 8, 8, 8};\nstatic const u8 sDoorAnimPalettes_CableClub[] = {8, 8, 8, 8, 8, 8, 8, 8};\nstatic const u8 sDoorAnimPalettes_HideoutElevator[] = {12, 12, 2, 2, 2, 2, 2, 2};\nstatic const u8 sDoorAnimPalettes_SSAnne[] = {7, 7, 7, 7, 7, 7, 7, 7};\nstatic const u8 sDoorAnimPalettes_SilphCoElevator[] = {8, 8, 2, 2, 2, 2, 2, 2};\nstatic const u8 sDoorAnimPalettes_Sevii123[] = {5, 5, 5, 5, 5, 5, 5, 5};\nstatic const u8 sDoorAnimPalettes_JoyfulGameCorner[] = {3, 3, 3, 3, 3, 3, 3, 3};\nstatic const u8 sDoorAnimPalettes_OneIslandPokeCenter[] = {3, 3, 3, 3, 3, 3, 3, 3};\nstatic const u8 sDoorAnimPalettes_Sevii45[] = {5, 5, 5, 5, 5, 5, 5, 5};\nstatic const u8 sDoorAnimPalettes_FourIslandDayCare[] = {3, 3, 3, 3, 3, 3, 3, 3};\nstatic const u8 sDoorAnimPalettes_RocketWarehouse[] = {10, 10, 10, 10, 10, 10, 10, 10};\nstatic const u8 sDoorAnimPalettes_Sevii67[] = {5, 5, 5, 5, 5, 5, 5, 5};\nstatic const u8 sDoorAnimPalettes_Teleporter[] = {8, 8, 8, 8, 8, 8, 8, 8};\nstatic const u8 sDoorAnimPalettes_TrainerTowerLobbyElevator[] = {8, 8, 2, 2, 2, 2, 2, 2};\nstatic const u8 sDoorAnimPalettes_TrainerTowerRoofElevator[] = {11, 11, 2, 2, 2, 2, 2, 2};\n\nstatic const struct DoorGraphics sDoorGraphics[] = {\n    {METATILE_General_Door,                                DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_General, sDoorAnimPalettes_General},\n    {METATILE_General_SlidingSingleDoor,                   DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_SlidingSingle, sDoorAnimPalettes_SlidingSingle},\n    {METATILE_General_SlidingDoubleDoor,                   DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_SlidingDouble, sDoorAnimPalettes_SlidingDouble},\n    {METATILE_PalletTown_Door,                             DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_Pallet, sDoorAnimPalettes_Pallet},\n    {METATILE_PalletTown_OaksLabDoor,                      DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_OaksLab, sDoorAnimPalettes_OaksLab},\n    {METATILE_ViridianCity_Door,                           DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_Viridian, sDoorAnimPalettes_Viridian},\n    {METATILE_PewterCity_Door,                             DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_Pewter, sDoorAnimPalettes_Pewter},\n    {METATILE_SaffronCity_Door,                            DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_Saffron, sDoorAnimPalettes_Saffron},\n    {METATILE_SaffronCity_SilphCoDoor,                     DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_SilphCo, sDoorAnimPalettes_SilphCo},\n    {METATILE_CeruleanCity_Door,                           DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_Cerulean, sDoorAnimPalettes_Cerulean},\n    {METATILE_LavenderTown_Door,                           DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_Lavender, sDoorAnimPalettes_Lavender},\n    {METATILE_VermilionCity_Door,                          DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_Vermilion, sDoorAnimPalettes_Vermilion},\n/*  Below was presumably intended for the door to the Pokemon Fan Club. The metatile is surrounded by metatiles for the fan club building.\n    Its animation tiles are similar to the Vermilion door above, and the building on the map uses that metatile instead. The unused tiles\n    have the pokeball above the door in view, but on the map the pokeball above the door is too high to be in view.\n    The metatile below was subsequently re-used for the warp to enter the SS Anne from the harbor, which has no door. */\n    {METATILE_VermilionCity_SSAnneWarp,                    DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_PokemonFanClub, sDoorAnimPalettes_PokemonFanClub},\n    {METATILE_CeladonCity_DeptStoreDoor,                   DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_DeptStore, sDoorAnimPalettes_DeptStore},\n    {METATILE_FuchsiaCity_Door,                            DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_Fuchsia, sDoorAnimPalettes_Fuchsia},\n    {METATILE_FuchsiaCity_SafariZoneDoor,                  DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_SafariZone, sDoorAnimPalettes_SafariZone},\n    {METATILE_CinnabarIsland_LabDoor,                      DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_CinnabarLab, sDoorAnimPalettes_CinnabarLab},\n    {METATILE_SeviiIslands123_Door,                        DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_Sevii123, sDoorAnimPalettes_Sevii123},\n    {METATILE_SeviiIslands123_GameCornerDoor,              DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_JoyfulGameCorner, sDoorAnimPalettes_JoyfulGameCorner},\n    {METATILE_SeviiIslands123_PokeCenterDoor,              DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_OneIslandPokeCenter, sDoorAnimPalettes_OneIslandPokeCenter},\n    {METATILE_SeviiIslands45_Door,                         DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_Sevii45, sDoorAnimPalettes_Sevii45},\n    {METATILE_SeviiIslands45_DayCareDoor,                  DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_FourIslandDayCare, sDoorAnimPalettes_FourIslandDayCare},\n    {METATILE_SeviiIslands45_RocketWarehouseDoor_Unlocked, DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_RocketWarehouse, sDoorAnimPalettes_RocketWarehouse},\n    {METATILE_SeviiIslands67_Door,                         DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_Sevii67, sDoorAnimPalettes_Sevii67},\n    {METATILE_DepartmentStore_ElevatorDoor,                DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_DeptStoreElevator, sDoorAnimPalettes_DeptStoreElevator},\n    {METATILE_PokemonCenter_CableClubDoor,                 DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_CableClub, sDoorAnimPalettes_CableClub},\n    {METATILE_SilphCo_HideoutElevatorDoor,                 DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_HideoutElevator, sDoorAnimPalettes_HideoutElevator},\n    {METATILE_SSAnne_Door,                                 DOOR_SOUND_NORMAL,  DOOR_SIZE_1x2, sDoorAnimTiles_SSAnne, sDoorAnimPalettes_SSAnne},\n    {METATILE_SilphCo_ElevatorDoor,                        DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_SilphCoElevator, sDoorAnimPalettes_SilphCoElevator},\n    {METATILE_SeaCottage_Teleporter_Door,                  DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_Teleporter, sDoorAnimPalettes_Teleporter},\n    {METATILE_TrainerTower_LobbyElevatorDoor,              DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_TrainerTowerLobbyElevator, sDoorAnimPalettes_TrainerTowerLobbyElevator},\n    {METATILE_TrainerTower_RoofElevatorDoor,               DOOR_SOUND_SLIDING, DOOR_SIZE_1x2, sDoorAnimTiles_TrainerTowerRoofElevator, sDoorAnimPalettes_TrainerTowerRoofElevator},\n    {METATILE_BerryForest_Door,                            DOOR_SOUND_NORMAL,  DOOR_SIZE_1x1, sDoorAnimTiles_Sevii45, sDoorAnimPalettes_Sevii45},\n    {METATILE_BattleFrontierOutsideEast_BattleTower,       DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_BattleTower, sDoorAnimPalettes_SlidingSingle},\n    {METATILE_BattleFrontier_BattleTowerElevator,          DOOR_SOUND_SLIDING, DOOR_SIZE_1x1, sDoorAnimTiles_BattleTowerElevator, sDoorAnimPalettes_SSAnne},\n    {}\n};\n\nstatic void DrawDoor(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, int x, int y)\n{\n    if (frames->tileOffset == CLOSED_DOOR_TILES_OFFSET)\n        DrawClosedDoorTiles(gfx, x, y);\n    else\n    {\n        CopyDoorTilesToVram(&gfx->tiles[frames->tileOffset]);\n        DrawCurrentDoorAnimFrame(gfx, x, y, gfx->paletteNums);\n    }\n}\n\nstatic void DrawClosedDoorTiles(const struct DoorGraphics *gfx, int x, int y)\n{\n    if (gfx->size == DOOR_SIZE_1x1)\n        CurrentMapDrawMetatileAt(x, y);\n    else\n    {\n        CurrentMapDrawMetatileAt(x, y);\n        CurrentMapDrawMetatileAt(x, y - 1);\n    }\n}\n\n// NOTE: The tiles of a door's animation must be copied to VRAM because they are\n//       not already part of any given tileset. This means that if there are any\n//       pre-existing tiles in this copied region that are visible when the door\n//       animation is played, they will be overwritten.\n#define DOOR_TILE_START (NUM_TILES_TOTAL - 8)\n\nstatic void CopyDoorTilesToVram(const u8 *tiles)\n{\n    CpuFastCopy(tiles, (void *)(VRAM + TILE_OFFSET_4BPP(DOOR_TILE_START)), 8 * TILE_SIZE_4BPP);\n}\n\nstatic void DrawCurrentDoorAnimFrame(const struct DoorGraphics *gfx, int x, int y, const u8 *paletteNums)\n{\n    u16 tiles[8];\n    if (gfx->size == DOOR_SIZE_1x1)\n        BuildDoorTiles(tiles, DOOR_TILE_START, paletteNums);\n\n    else\n    {\n        BuildDoorTiles(tiles, DOOR_TILE_START, paletteNums);\n        DrawDoorMetatileAt(x, y - 1, tiles);\n        BuildDoorTiles(tiles, DOOR_TILE_START + 4, &paletteNums[4]);\n    }\n\n    DrawDoorMetatileAt(x, y, tiles);\n}\n\nstatic void BuildDoorTiles(u16 *tiles, u16 tileNum, const u8 *paletteNums)\n{\n    int i;\n    u16 tile;\n\n    // Only the first 4 tiles of each metatile (bottom layer) actually use the door tiles\n    for (i = 0; i < 4; i++)\n    {\n        tile = *(paletteNums++) << 12;\n        tiles[i] = tile | (tileNum + i);\n    }\n\n    // The remaining tiles (top layer) always use tile 0 (with the same palette)\n    for (; i < 8; i++)\n    {\n        tile = *(paletteNums++) << 12;\n        tiles[i] = tile;\n    }\n}\n\n#define tFramesHi data[0]\n#define tFramesLo data[1]\n#define tGfxHi    data[2]\n#define tGfxLo    data[3]\n#define tFrameId  data[4]\n#define tCounter  data[5]\n#define tX        data[6]\n#define tY        data[7]\n\nstatic void Task_AnimateDoor(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    const struct DoorAnimFrame *frames = (struct DoorAnimFrame *)((u16)tFramesHi << 16 | (u16)tFramesLo);\n    const struct DoorGraphics *gfx = (struct DoorGraphics *)((u16)tGfxHi << 16 | (u16)tGfxLo);\n    if (!AnimateDoorFrame(gfx, frames, data))\n        DestroyTask(taskId);\n}\n\nstatic bool32 AnimateDoorFrame(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, s16 *data)\n{\n    if (tCounter == 0)\n        DrawDoor(gfx, &frames[tFrameId], tX, tY);\n\n    if (tCounter == frames[tFrameId].duration)\n    {\n        tCounter = 0;\n        tFrameId++;\n        if (frames[tFrameId].duration == 0) // final frame has been reached\n            return FALSE;\n        else\n            return TRUE;\n    }\n\n    tCounter++;\n    return TRUE;\n}\n\nstatic const struct DoorGraphics *GetDoorGraphics(const struct DoorGraphics *gfx, u16 id)\n{\n    while (gfx->tiles != NULL)\n    {\n        if (gfx->metatileId == id)\n            return gfx;\n        gfx++;\n    }\n    return NULL;\n}\n\nstatic s8 StartDoorAnimationTask(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, int x, int y)\n{\n    u8 taskId;\n    s16 *data;\n    if (FuncIsActiveTask(Task_AnimateDoor) == TRUE)\n        return -1;\n\n    taskId = CreateTask(Task_AnimateDoor, 80);\n    data = gTasks[taskId].data;\n\n    tX = x;\n    tY = y;\n    tFramesLo = (uintptr_t)frames;\n    tFramesHi = (uintptr_t)frames >> 16;\n    tGfxLo = (uintptr_t)gfx;\n    tGfxHi = (uintptr_t)gfx >> 16;\n    return taskId;\n}\n\n#undef tFramesHi\n#undef tFramesLo\n#undef tGfxHi\n#undef tGfxLo\n#undef tFrameId\n#undef tCounter\n#undef tX\n#undef tY\n\nstatic void DrawClosedDoor(const struct DoorGraphics *gfx, int x, int y)\n{\n    DrawClosedDoorTiles(gfx, x, y);\n}\n\nstatic void DrawOpenedDoor(const struct DoorGraphics *gfx, int x, int y)\n{\n    gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));\n    if (gfx != NULL)\n    {\n        const struct DoorAnimFrame *frames = gfx->size == DOOR_SIZE_1x1 ? sDoorAnimFrames_OpenSmall : sDoorAnimFrames_OpenLarge;\n        DrawDoor(gfx, GetLastDoorAnimFrame(frames), x, y);\n    }\n}\n\nstatic const struct DoorAnimFrame *GetLastDoorAnimFrame(const struct DoorAnimFrame *frames)\n{\n    while (frames->duration != 0)\n        frames++;\n    return frames - 1;\n}\n\nstatic s8 AnimateDoorOpenInternal(const struct DoorGraphics *gfx, int x, int y)\n{\n    gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));\n    if (gfx == NULL)\n        return -1;\n    else if (gfx->size == DOOR_SIZE_1x1)\n        return StartDoorAnimationTask(gfx, sDoorAnimFrames_OpenSmall, x, y);\n    else\n        return StartDoorAnimationTask(gfx, sDoorAnimFrames_OpenLarge, x, y);\n}\n\nstatic s8 StartDoorCloseAnimation(const struct DoorGraphics *gfx, int x, int y)\n{\n    gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));\n    if (gfx == NULL)\n        return -1;\n    else if (gfx->size == DOOR_SIZE_1x1)\n        return StartDoorAnimationTask(gfx, sDoorAnimFrames_CloseSmall, x, y);\n    else\n        return StartDoorAnimationTask(gfx, sDoorAnimFrames_CloseLarge, x, y);\n}\n\nvoid FieldSetDoorOpened(int x, int y)\n{\n    if (MetatileBehavior_IsWarpDoor_2(MapGridGetMetatileBehaviorAt((s16)x, (s16)y)))\n        DrawOpenedDoor(sDoorGraphics, x, y);\n}\n\nvoid FieldSetDoorClosed(int x, int y)\n{\n    if (MetatileBehavior_IsWarpDoor_2(MapGridGetMetatileBehaviorAt((s16)x, (s16)y)))\n        DrawClosedDoor(sDoorGraphics, x, y);\n}\n\ns8 FieldAnimateDoorClose(int x, int y)\n{\n    if (!MetatileBehavior_IsWarpDoor_2(MapGridGetMetatileBehaviorAt((s16)x, (s16)y)))\n        return -1;\n    return StartDoorCloseAnimation(sDoorGraphics, x, y);\n}\n\ns8 FieldAnimateDoorOpen(int x, int y)\n{\n    if (!MetatileBehavior_IsWarpDoor_2(MapGridGetMetatileBehaviorAt((s16)x, (s16)y)))\n        return -1;\n    return AnimateDoorOpenInternal(sDoorGraphics, x, y);\n}\n\nbool8 FieldIsDoorAnimationRunning(void)\n{\n    return FuncIsActiveTask(Task_AnimateDoor);\n}\n\nu16 GetDoorSoundEffect(int x, int y)\n{\n    if (GetDoorSoundType(sDoorGraphics, x, y) == DOOR_SOUND_NORMAL)\n        return SE_DOOR;\n    else // DOOR_SOUND_SLIDING\n        return SE_SLIDING_DOOR;\n}\n\nstatic s8 GetDoorSoundType(const struct DoorGraphics *gfx, int x, int y)\n{\n    gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));\n    if (gfx == NULL)\n        return -1;\n    return gfx->sound;\n}\n"
  },
  {
    "path": "src/field_effect.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"field_camera.h\"\n#include \"field_control_avatar.h\"\n#include \"field_effect.h\"\n#include \"field_effect_helpers.h\"\n#include \"field_effect_scripts.h\"\n#include \"field_fadetransition.h\"\n#include \"field_player_avatar.h\"\n#include \"field_weather.h\"\n#include \"fieldmap.h\"\n#include \"help_system.h\"\n#include \"metatile_behavior.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"pokemon_storage_system.h\"\n#include \"quest_log.h\"\n#include \"script.h\"\n#include \"special_field_anim.h\"\n#include \"task.h\"\n#include \"trainer_pokemon_sprites.h\"\n#include \"trig.h\"\n#include \"util.h\"\n#include \"constants/event_object_movement.h\"\n#include \"constants/layouts.h\"\n#include \"constants/maps.h\"\n#include \"constants/map_groups.h\"\n#include \"constants/metatile_behaviors.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n\nextern struct CompressedSpritePalette gMonPaletteTable[]; // Intentionally declared (incorrectly) without const in order to match\nextern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];\nextern const struct CompressedSpriteSheet gTrainerFrontPicTable[];\n\n#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))}\n#define FIELD_EFFECT_COUNT 32\n\nEWRAM_DATA u32 gFieldEffectArguments[8] = {0};\n\nstatic u8 sFieldEffectActiveList[FIELD_EFFECT_COUNT];\n\nstatic void FieldEffectActiveListAdd(u8 fldeff);\nstatic bool8 FieldEffectCmd_loadtiles(const u8 **script, u32 *result);\nstatic bool8 FieldEffectCmd_loadfadedpal(const u8 **script, u32 *result);\nstatic bool8 FieldEffectCmd_loadpal(const u8 **script, u32 *result);\nstatic bool8 FieldEffectCmd_callnative(const u8 **script, u32 *result);\nstatic bool8 FieldEffectCmd_end(const u8 **script, u32 *result);\nstatic bool8 FieldEffectCmd_loadgfx_callnative(const u8 **script, u32 *result);\nstatic bool8 FieldEffectCmd_loadtiles_callnative(const u8 **script, u32 *result);\nstatic bool8 FieldEffectCmd_loadfadedpal_callnative(const u8 **script, u32 *result);\nstatic void FieldEffectScript_LoadTiles(const u8 **script);\nstatic void FieldEffectScript_LoadFadedPal(const u8 **script);\nstatic void FieldEffectScript_LoadPal(const u8 **script);\nstatic void FieldEffectScript_CallNative(const u8 **script, u32 *result);\nstatic void FieldEffectFreeTilesIfUnused(u16 tilesTag);\nstatic void FieldEffectFreePaletteIfUnused(u8 paletteNum);\nstatic void Task_PokecenterHeal(u8 taskId);\nstatic void SpriteCB_PokeballGlow(struct Sprite *sprite);\nstatic void SpriteCB_PokecenterMonitor(struct Sprite *sprite);\nstatic void SpriteCB_HallOfFameMonitor(struct Sprite *sprite);\n\n// Unused\nstatic const u16 sNewGameOakObject_Gfx[] = INCBIN_U16(\"graphics/field_effects/pics/new_game_oak.4bpp\");\nstatic const u16 sNewGameOakObject_Pal[] = INCBIN_U16(\"graphics/field_effects/pics/new_game_oak.gbapal\");\n\nstatic const u16 sPokeballGlow_Gfx[] = INCBIN_U16(\"graphics/field_effects/pics/pokeball_glow.4bpp\");\nstatic const u16 sPokeballGlow_Pal[] = INCBIN_U16(\"graphics/field_effects/pics/pokeball_glow.gbapal\");\nstatic const u16 sPokecenterMonitor_Gfx[] = INCBIN_U16(\"graphics/field_effects/pics/pokemoncenter_monitor.4bpp\");\nstatic const u16 sHofMonitor_Pal[] = INCBIN_U16(\"graphics/field_effects/pics/hof_monitor.gbapal\");\nstatic const u16 sHofMonitor_Gfx[] = INCBIN_U16(\"graphics/field_effects/pics/hof_monitor.4bpp\");\n\nstatic const u16 sFieldMoveStreaksOutdoors_Gfx[] = INCBIN_U16(\"graphics/field_effects/pics/field_move_streaks_outdoors.4bpp\");\nstatic const u16 sFieldMoveStreaksOutdoors_Pal[] = INCBIN_U16(\"graphics/field_effects/pics/field_move_streaks_outdoors.gbapal\");\nstatic const u16 sFieldMoveStreaksOutdoors_Tilemap[] = INCBIN_U16(\"graphics/field_effects/pics/field_move_streaks_outdoors.bin\");\n\nstatic const u16 sFieldMoveStreaksIndoors_Gfx[] = INCBIN_U16(\"graphics/field_effects/pics/field_move_streaks_indoors.4bpp\");\nstatic const u16 sFieldMoveStreaksIndoors_Pal[] = INCBIN_U16(\"graphics/field_effects/pics/field_move_streaks_indoors.gbapal\");\nstatic const u16 sFieldMoveStreaksIndoors_Tilemap[] = INCBIN_U16(\"graphics/field_effects/pics/field_move_streaks_indoors.bin\");\n\nstatic const u16 sRockFragment_TopLeft[] = INCBIN_U16(\"graphics/field_effects/pics/deoxys_rock_fragment_top_left.4bpp\");\nstatic const u16 sRockFragment_TopRight[] = INCBIN_U16(\"graphics/field_effects/pics/deoxys_rock_fragment_top_right.4bpp\");\nstatic const u16 sRockFragment_BottomLeft[] = INCBIN_U16(\"graphics/field_effects/pics/deoxys_rock_fragment_bottom_left.4bpp\");\nstatic const u16 sRockFragment_BottomRight[] = INCBIN_U16(\"graphics/field_effects/pics/deoxys_rock_fragment_bottom_right.4bpp\");\n\nstatic bool8 (*const sFldEffScrcmdTable[])(const u8 **script, u32 *result) = {\n    FieldEffectCmd_loadtiles,\n    FieldEffectCmd_loadfadedpal,\n    FieldEffectCmd_loadpal,\n    FieldEffectCmd_callnative,\n    FieldEffectCmd_end,\n    FieldEffectCmd_loadgfx_callnative,\n    FieldEffectCmd_loadtiles_callnative,\n    FieldEffectCmd_loadfadedpal_callnative\n};\n\nstatic const struct OamData sNewGameOakOamAttributes = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0x000,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const struct OamData sOamData_8x8 = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0x000,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const struct OamData sOamData_16x16 = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0x000,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const struct SpriteFrameImage sNewGameOakObjectSpriteFrames[] = {\n    {sNewGameOakObject_Gfx, 0x800}\n};\n\nstatic const struct SpritePalette sNewGameOakObjectPaletteInfo = {\n    sNewGameOakObject_Pal, 4102\n};\n\nstatic const union AnimCmd sNewGameOakAnim[] = {\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sNewGameOakAnimTable[] = {\n    sNewGameOakAnim\n};\n\nstatic const struct SpriteTemplate sNewGameOakObjectTemplate = {\n    .tileTag = TAG_NONE,\n    .paletteTag = 0x1006,\n    .oam = &sNewGameOakOamAttributes,\n    .anims = sNewGameOakAnimTable,\n    .images = sNewGameOakObjectSpriteFrames,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nconst struct SpritePalette gSpritePalette_PokeballGlow = {\n    sPokeballGlow_Pal, 4103\n};\n\nconst struct SpritePalette gSpritePalette_HofMonitor = {\n    sHofMonitor_Pal, 4112\n};\n\nstatic const struct OamData sOamData_32x16 = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x16),\n    .tileNum = 0x000,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const struct SpriteFrameImage sPicTable_PokeballGlow[] = {\n    {sPokeballGlow_Gfx, 0x20}\n};\n\nstatic const struct SpriteFrameImage sPicTable_PokecenterMonitor[] = {\n    {sPokecenterMonitor_Gfx + 0x000, 0x100},\n    {sPokecenterMonitor_Gfx + 0x080, 0x100},\n    {sPokecenterMonitor_Gfx + 0x100, 0x100},\n    {sPokecenterMonitor_Gfx + 0x180, 0x100}\n};\n\nstatic const struct SpriteFrameImage sPicTable_HofMonitor[] = {\n    {sHofMonitor_Gfx + 0x00, 0x80},\n    {sHofMonitor_Gfx + 0x40, 0x80},\n    {sHofMonitor_Gfx + 0x80, 0x80},\n    {sHofMonitor_Gfx + 0xC0, 0x80}\n};\n\n// Unused, leftover from RSE\nstatic const struct Subsprite sSubsprites_PokecenterMonitor[] =\n{\n    {\n        .x = -12,\n        .y =  -8,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 0,\n        .priority = 2\n    }, {\n        .x =  4,\n        .y = -8,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 2,\n        .priority = 2\n    }, {\n        .x = -12,\n        .y =   0,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 3,\n        .priority = 2\n    }, {\n        .x = 4,\n        .y = 0,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 5,\n        .priority = 2\n    }\n};\n\n// Unused, leftover from RSE\nstatic const struct SubspriteTable sSubspriteTable_PokecenterMonitor = subsprite_table(sSubsprites_PokecenterMonitor);\n\n// Unused, leftover from RSE\nstatic const struct Subsprite sSubsprites_HofMonitorBig[] =\n{\n    {\n        .x = -32,\n        .y = -8,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 2\n    }, {\n        .x =  0,\n        .y = -8,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 4,\n        .priority = 2\n    }, {\n        .x = -32,\n        .y =  0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 8,\n        .priority = 2\n    }, {\n        .x =   0,\n        .y =  0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 12,\n        .priority = 2\n    }\n};\n\n// Unused, leftover from RSE\nstatic const struct SubspriteTable sSubspriteTable_HofMonitorBig = subsprite_table(sSubsprites_HofMonitorBig);\n\nstatic const union AnimCmd sAnim_Static[] = {\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Flicker[] = {\n    ANIMCMD_FRAME(1, 5),\n    ANIMCMD_FRAME(2, 5),\n    ANIMCMD_FRAME(3, 7),\n    ANIMCMD_FRAME(2, 5),\n    ANIMCMD_FRAME(1, 5),\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_LOOP(3),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_Flicker[] = {\n    sAnim_Static,\n    sAnim_Flicker\n};\n\nstatic const union AnimCmd sAnim_HofMonitor[] = {\n    ANIMCMD_FRAME(3, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_LOOP(2),\n    ANIMCMD_FRAME(1, 8),\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_HofMonitor[] = {\n    sAnim_HofMonitor\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_PokeballGlow = {\n    .tileTag = TAG_NONE,\n    .paletteTag = 4103,\n    .oam = &sOamData_8x8,\n    .anims = sAnims_Flicker,\n    .images = sPicTable_PokeballGlow,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_PokeballGlow\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_PokecenterMonitor = {\n    .tileTag = TAG_NONE,\n    .paletteTag = 4103,\n    .oam = &sOamData_32x16,\n    .anims = sAnims_Flicker,\n    .images = sPicTable_PokecenterMonitor,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_PokecenterMonitor\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_HofMonitor = {\n    .tileTag = TAG_NONE,\n    .paletteTag = 4112,\n    .oam = &sOamData_16x16,\n    .anims = sAnims_HofMonitor,\n    .images = sPicTable_HofMonitor,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_HallOfFameMonitor\n};\n\n\nu32 FieldEffectStart(u8 fldeff)\n{\n    const u8 *script;\n    u32 result;\n    FieldEffectActiveListAdd(fldeff);\n    script = gFieldEffectScriptPointers[fldeff];\n    while (sFldEffScrcmdTable[*script](&script, &result))\n        ;\n    return result;\n}\n\nstatic bool8 FieldEffectCmd_loadtiles(const u8 **script, u32 *result)\n{\n    (*script)++;\n    FieldEffectScript_LoadTiles(script);\n    return TRUE;\n}\n\nstatic bool8 FieldEffectCmd_loadfadedpal(const u8 **script, u32 *result)\n{\n    (*script)++;\n    FieldEffectScript_LoadFadedPal(script);\n    return TRUE;\n}\n\nstatic bool8 FieldEffectCmd_loadpal(const u8 **script, u32 *result)\n{\n    (*script)++;\n    FieldEffectScript_LoadPal(script);\n    return TRUE;\n}\nstatic bool8 FieldEffectCmd_callnative(const u8 **script, u32 *result)\n{\n    (*script)++;\n    FieldEffectScript_CallNative(script, result);\n    return TRUE;\n}\n\nstatic bool8 FieldEffectCmd_end(const u8 **script, u32 *result)\n{\n    return FALSE;\n}\n\nstatic bool8 FieldEffectCmd_loadgfx_callnative(const u8 **script, u32 *result)\n{\n    (*script)++;\n    FieldEffectScript_LoadTiles(script);\n    FieldEffectScript_LoadFadedPal(script);\n    FieldEffectScript_CallNative(script, result);\n    return TRUE;\n}\n\nstatic bool8 FieldEffectCmd_loadtiles_callnative(const u8 **script, u32 *result)\n{\n    (*script)++;\n    FieldEffectScript_LoadTiles(script);\n    FieldEffectScript_CallNative(script, result);\n    return TRUE;\n}\n\nextern const struct SpritePalette gSpritePalette_GeneralFieldEffect0; //sand footprints pal\nextern const struct SpritePalette gBlackSandFootprintsPal;\nextern const struct SpritePalette gThreeIslandGrassPal;\nextern const struct SpritePalette gSpritePalette_GeneralFieldEffect1; //tall grass pal\nextern const struct SpritePalette gSnowFootprintsPal;\n\nstatic bool8 FieldEffectCmd_loadfadedpal_callnative(const u8 **script, u32 *result)\n{\n    (*script)++;\n    FieldEffectScript_LoadFadedPal(script);\n    FieldEffectScript_CallNative(script, result);\n    return TRUE;\n}\n\nstatic u32 FieldEffectScript_ReadWord(const u8 **script)\n{\n    return T2_READ_32(*script);\n}\n\nstatic void FieldEffectScript_LoadTiles(const u8 **script)\n{\n    const struct SpriteSheet * spriteSheet = (const struct SpriteSheet * )FieldEffectScript_ReadWord(script);\n    if (GetSpriteTileStartByTag(spriteSheet->tag) == 0xFFFF)\n        LoadSpriteSheet(spriteSheet);\n    *script += sizeof(u32);\n}\n\nvoid ApplyGlobalFieldPaletteTint(u8 paletteIdx)\n{\n    switch (gGlobalFieldTintMode)\n    {\n    case 0:\n        return;\n    case 1:\n        TintPalette_GrayScale(&gPlttBufferUnfaded[OBJ_PLTT_ID2(paletteIdx)], 16);\n        break;\n    case 2:\n        TintPalette_SepiaTone(&gPlttBufferUnfaded[OBJ_PLTT_ID2(paletteIdx)], 16);\n        break;\n    case 3:\n        QuestLog_BackUpPalette(OBJ_PLTT_ID2(paletteIdx), 16);\n        TintPalette_GrayScale(&gPlttBufferUnfaded[OBJ_PLTT_ID2(paletteIdx)], 16);\n        break;\n    default:\n        return;\n    }\n    CpuFastCopy(&gPlttBufferUnfaded[OBJ_PLTT_ID2(paletteIdx)], &gPlttBufferFaded[OBJ_PLTT_ID2(paletteIdx)], PLTT_SIZE_4BPP);\n}\n\nstatic void FieldEffectScript_LoadFadedPal(const u8 **script)\n{\n    u8 mapsec = GetCurrentRegionMapSectionId();\n    const struct SpritePalette * spritePalette;\n    u8 idx;\n    if((const struct SpritePalette * )FieldEffectScript_ReadWord(script) == &gSpritePalette_GeneralFieldEffect0) //overwrite sand footprints palette\n    {\n        if(mapsec == MAPSEC_ONE_ISLAND || mapsec == MAPSEC_TREASURE_BEACH || mapsec == MAPSEC_KINDLE_ROAD) //if one island\n        {\n            spritePalette = &gBlackSandFootprintsPal;\n        }\n        else if(gSaveBlock1Ptr->mapLayoutId == LAYOUT_FOUR_ISLAND) //Four Island town's snow footprints\n        {\n            spritePalette = &gSnowFootprintsPal;\n        }\n        else\n        {\n            spritePalette = (const struct SpritePalette * )FieldEffectScript_ReadWord(script);\n        }\n    }\n    else if((const struct SpritePalette * )FieldEffectScript_ReadWord(script) == &gSpritePalette_GeneralFieldEffect1) //overwrite tall grass palette\n    {\n        if(mapsec == MAPSEC_BOND_BRIDGE || mapsec == MAPSEC_THREE_ISLE_PORT || mapsec == MAPSEC_BERRY_FOREST) //if three island\n        {\n            spritePalette = &gThreeIslandGrassPal;\n        }\n        else\n        {\n            spritePalette = (const struct SpritePalette * )FieldEffectScript_ReadWord(script);\n        }\n    }\n    else\n    {\n        spritePalette = (const struct SpritePalette * )FieldEffectScript_ReadWord(script);\n    }\n    idx = IndexOfSpritePaletteTag(spritePalette->tag);\n    LoadSpritePalette(spritePalette);\n    if (idx == 0xFF)\n        ApplyGlobalFieldPaletteTint(IndexOfSpritePaletteTag(spritePalette->tag));\n    UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(spritePalette->tag));\n    *script += sizeof(u32);\n}\n\nstatic void FieldEffectScript_LoadPal(const u8 **script)\n{\n    const struct SpritePalette * spritePalette = (const struct SpritePalette * )FieldEffectScript_ReadWord(script);\n    u8 idx = IndexOfSpritePaletteTag(spritePalette->tag);\n    LoadSpritePalette(spritePalette);\n    if (idx != 0xFF)\n        ApplyGlobalFieldPaletteTint(IndexOfSpritePaletteTag(spritePalette->tag));\n    *script += sizeof(u32);\n}\n\nstatic void FieldEffectScript_CallNative(const u8 **script, u32 *result)\n{\n    u32 (*func)(void) = (u32 (*)(void))FieldEffectScript_ReadWord(script);\n    *result = func();\n    *script += sizeof(u32);\n}\n\nstatic void FieldEffectFreeGraphicsResources(struct Sprite *sprite)\n{\n    u16 tileStart = sprite->sheetTileStart;\n    u8 paletteNum = sprite->oam.paletteNum;\n    DestroySprite(sprite);\n    FieldEffectFreeTilesIfUnused(tileStart);\n    FieldEffectFreePaletteIfUnused(paletteNum);\n}\n\nvoid FieldEffectStop(struct Sprite *sprite, u8 fldeff)\n{\n    FieldEffectFreeGraphicsResources(sprite);\n    FieldEffectActiveListRemove(fldeff);\n}\n\nstatic void FieldEffectFreeTilesIfUnused(u16 tileStart)\n{\n    u32 i;\n    u16 tileTag = GetSpriteTileTagByTileStart(tileStart);\n    if (tileTag == TAG_NONE)\n        return;\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        if (gSprites[i].inUse && gSprites[i].usingSheet && tileStart == gSprites[i].sheetTileStart)\n            return;\n    }\n    FreeSpriteTilesByTag(tileTag);\n}\n\nstatic void FieldEffectFreePaletteIfUnused(u8 paletteNum)\n{\n    u32 i;\n    u16 paletteTag = GetSpritePaletteTagByPaletteNum(paletteNum);\n    if (paletteTag == TAG_NONE)\n        return;\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        if (gSprites[i].inUse && gSprites[i].oam.paletteNum == paletteNum)\n            return;\n    }\n    FreeSpritePaletteByTag(paletteTag);\n}\n\nvoid FieldEffectActiveListClear(void)\n{\n    u32 i;\n    for (i = 0; i < FIELD_EFFECT_COUNT; i++)\n    {\n        sFieldEffectActiveList[i] = 0xFF;\n    }\n}\n\nstatic void FieldEffectActiveListAdd(u8 fldeff)\n{\n    u32 i;\n    for (i = 0; i < FIELD_EFFECT_COUNT; i++)\n    {\n        if (sFieldEffectActiveList[i] == 0xFF)\n        {\n            sFieldEffectActiveList[i] = fldeff;\n            return;\n        }\n    }\n}\n\nvoid FieldEffectActiveListRemove(u8 fldeff)\n{\n    u32 i;\n    for (i = 0; i < FIELD_EFFECT_COUNT; i++)\n    {\n        if (sFieldEffectActiveList[i] == fldeff)\n        {\n            sFieldEffectActiveList[i] = 0xFF;\n            return;\n        }\n    }\n}\n\nbool8 FieldEffectActiveListContains(u8 fldeff)\n{\n    u32 i;\n    for (i = 0; i < FIELD_EFFECT_COUNT; i++)\n    {\n        if (sFieldEffectActiveList[i] == fldeff)\n        {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nu8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer)\n{\n    struct SpriteTemplate spriteTemplate;\n    LoadCompressedSpritePaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer);\n    LoadCompressedSpriteSheetOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer);\n    spriteTemplate.tileTag = gTrainerFrontPicTable[trainerSpriteID].tag;\n    spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[trainerSpriteID].tag;\n    spriteTemplate.oam = &sNewGameOakOamAttributes;\n    spriteTemplate.anims = gDummySpriteAnimTable;\n    spriteTemplate.images = NULL;\n    spriteTemplate.affineAnims = gDummySpriteAffineAnimTable;\n    spriteTemplate.callback = SpriteCallbackDummy;\n    return CreateSprite(&spriteTemplate, x, y, subpriority);\n}\n\n// Unused\nstatic void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest)\n{\n    LZDecompressVram(gTrainerFrontPicTable[gender].data, dest);\n    LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, PLTT_SIZE_4BPP);\n}\n\n// Unused\nstatic u8 AddNewGameBirchObject(s16 x, s16 y, u8 subpriority)\n{\n    LoadSpritePalette(&sNewGameOakObjectPaletteInfo);\n    return CreateSprite(&sNewGameOakObjectTemplate, x, y, subpriority);\n}\n\nu8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority)\n{\n    u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, 0, 0x8000, TRUE, x, y, 0, gMonPaletteTable[species].tag);\n    PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[species].tag) + 0x10);\n    if (spriteId == 0xFFFF)\n        return MAX_SPRITES;\n    else\n        return spriteId;\n}\n\nstatic u8 CreateMonSprite_FieldMove(u16 species, u32 otId, u32 personality, s16 x, s16 y, u8 subpriority)\n{\n    const struct CompressedSpritePalette * spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);\n    u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, 1, x, y, 0, spritePalette->tag);\n    PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10);\n    if (spriteId == 0xFFFF)\n        return MAX_SPRITES;\n    else\n        return spriteId;\n}\n\nvoid FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId)\n{\n    ResetPreservedPalettesInWeather();\n    if (sprite->oam.affineMode != ST_OAM_AFFINE_OFF)\n    {\n        FreeOamMatrix(sprite->oam.matrixNum);\n    }\n    FreeAndDestroyMonPicSprite(spriteId);\n}\n\n// r, g, b are between 0 and 16\nvoid MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)\n{\n    int curRed;\n    int curGreen;\n    int curBlue;\n    u16 outPal;\n\n    outPal = gPlttBufferUnfaded[i];\n    curRed = outPal & 0x1f;\n    curGreen = (outPal & (0x1f << 5)) >> 5;\n    curBlue = (outPal & (0x1f << 10)) >> 10;\n    curRed += (((0x1f - curRed) * r) >> 4);\n    curGreen += (((0x1f - curGreen) * g) >> 4);\n    curBlue += (((0x1f - curBlue) * b) >> 4);\n    outPal = curRed;\n    outPal |= curGreen << 5;\n    outPal |= curBlue << 10;\n    gPlttBufferFaded[i] = outPal;\n}\n\n// r, g, b are between 0 and 16\nstatic void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)\n{\n    int curRed;\n    int curGreen;\n    int curBlue;\n    u16 outPal;\n\n    outPal = gPlttBufferUnfaded[i];\n    curRed = outPal & 0x1f;\n    curGreen = (outPal & (0x1f << 5)) >> 5;\n    curBlue = (outPal & (0x1f << 10)) >> 10;\n    curRed -= ((curRed * r) >> 4);\n    curGreen -= ((curGreen * g) >> 4);\n    curBlue -= ((curBlue * b) >> 4);\n    outPal = curRed;\n    outPal |= curGreen << 5;\n    outPal |= curBlue << 10;\n    gPlttBufferFaded[i] = outPal;\n}\n\nstatic void PokecenterHealEffect_Init(struct Task *task);\nstatic void PokecenterHealEffect_WaitForBallPlacement(struct Task *task);\nstatic void PokecenterHealEffect_WaitForBallFlashing(struct Task *task);\nstatic void PokecenterHealEffect_WaitForSoundAndEnd(struct Task *task);\nstatic void HallOfFameRecordEffect_Init(struct Task *task);\nstatic void HallOfFameRecordEffect_WaitForBallPlacement(struct Task *task);\nstatic void HallOfFameRecordEffect_WaitForBallFlashing(struct Task *task);\nstatic void HallOfFameRecordEffect_WaitForSoundAndEnd(struct Task *task);\nstatic void Task_HallOfFameRecord(u8 taskId);\nstatic u8 CreateGlowingPokeballsEffect(s16 duration, s16 x, s16 y, bool16 fanfare);\nstatic void SpriteCB_PokeballGlowEffect(struct Sprite *sprite);\nstatic void PokeballGlowEffect_PlaceBalls(struct Sprite *sprite);\nstatic void PokeballGlowEffect_TryPlaySe(struct Sprite *sprite);\nstatic void PokeballGlowEffect_FlashFirstThree(struct Sprite *sprite);\nstatic void PokeballGlowEffect_FlashLast(struct Sprite *sprite);\nstatic void PokeballGlowEffect_WaitAfterFlash(struct Sprite *sprite);\nstatic void PokeballGlowEffect_Dummy(struct Sprite *sprite);\nstatic void PokeballGlowEffect_WaitForSound(struct Sprite *sprite);\nstatic void PokeballGlowEffect_Idle(struct Sprite *sprite);\nstatic u8 CreatePokecenterMonitorSprite(s32 x, s32 y);\nstatic void CreateHofMonitorSprite(s32 x, s32 y);\n\nstatic void (*const sPokecenterHealEffectFuncs[])(struct Task *) =\n{\n    PokecenterHealEffect_Init,\n    PokecenterHealEffect_WaitForBallPlacement,\n    PokecenterHealEffect_WaitForBallFlashing,\n    PokecenterHealEffect_WaitForSoundAndEnd\n};\n\nstatic void (*const sHallOfFameRecordEffectFuncs[])(struct Task *) =\n{\n    HallOfFameRecordEffect_Init,\n    HallOfFameRecordEffect_WaitForBallPlacement,\n    HallOfFameRecordEffect_WaitForBallFlashing,\n    HallOfFameRecordEffect_WaitForSoundAndEnd\n};\n\nstatic void (*const sPokeballGlowEffectFuncs[])(struct Sprite *) =\n{\n    PokeballGlowEffect_PlaceBalls,\n    PokeballGlowEffect_TryPlaySe,\n    PokeballGlowEffect_FlashFirstThree,\n    PokeballGlowEffect_FlashLast,\n    PokeballGlowEffect_WaitAfterFlash,\n    PokeballGlowEffect_Dummy,\n    PokeballGlowEffect_WaitForSound,\n    PokeballGlowEffect_Idle\n};\n\nstatic u32 CountAliveMonsInNuzlocke(void)\n{\n    u32 i, count;\n\n    for (i = 0, count = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE\n            && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))\n        {\n            if(GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0)\n                count++;\n        }\n    }\n\n    return count;\n}\n\n// Task data for Task_PokecenterHeal and Task_HallOfFameRecord\n#define tState              data[0]\n#define tNumMons            data[1]\n#define tFirstBallX         data[2]\n#define tFirstBallY         data[3]\n#define tMonitorX           data[4]\n#define tMonitorY           data[5]\n#define tGlowEffectSpriteId data[6]\n#define tMonitorSpriteId    data[7]\n\n// Sprite data for SpriteCB_PokeballGlowEffect\n#define sState      data[0]\n#define sTimer      data[1]\n#define sCounter    data[2]\n#define sNumFlashed data[3]\n#define sPlayHealSe data[5]\n#define sNumMons    data[6]\n#define sSpriteId   data[7]\n\n// Sprite data for SpriteCB_PokeballGlow\n#define sGlowEffectSpriteId data[0]\n\n// Sprite data for SpriteCB_PokecenterMonitor\n#define sStartFlash data[0]\n\nbool8 FldEff_PokecenterHeal(void)\n{\n    u8 nPokemon;\n    struct Task *task;\n\n    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n        nPokemon = CountAliveMonsInNuzlocke(); \n    else\n        nPokemon = CountPartyNonEggMons();\n    task = &gTasks[CreateTask(Task_PokecenterHeal, 0xFF)];\n    task->tNumMons = nPokemon;\n    task->tFirstBallX = 93;\n    task->tFirstBallY = 36;\n    task->tMonitorX = 128;\n    task->tMonitorY = 24;\n    if(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_HOUSE_ROOM2) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_HOUSE_ROOM2))\n    {   //for the Battle House healing machine\n        task->tFirstBallY = 68;\n    }\n    return FALSE;\n}\n\nstatic void Task_PokecenterHeal(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    sPokecenterHealEffectFuncs[task->tState](task);\n}\n\nstatic void PokecenterHealEffect_Init(struct Task *task)\n{\n    task->tState++;\n    task->tGlowEffectSpriteId = CreateGlowingPokeballsEffect(task->tNumMons, task->tFirstBallX, task->tFirstBallY, TRUE);\n    task->tMonitorSpriteId = CreatePokecenterMonitorSprite(task->tMonitorX, task->tMonitorY);\n}\n\nstatic void PokecenterHealEffect_WaitForBallPlacement(struct Task *task)\n{\n    if (gSprites[task->tGlowEffectSpriteId].sState >= 2)\n    {\n        gSprites[task->tMonitorSpriteId].sStartFlash++;\n        task->tState++;\n    }\n}\n\nstatic void PokecenterHealEffect_WaitForBallFlashing(struct Task *task)\n{\n    if (gSprites[task->tGlowEffectSpriteId].sState > 4)\n        task->tState++;\n}\n\nstatic void PokecenterHealEffect_WaitForSoundAndEnd(struct Task *task)\n{\n    if (gSprites[task->tGlowEffectSpriteId].sState > 6)\n    {\n        DestroySprite(&gSprites[task->tGlowEffectSpriteId]);\n        FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL);\n        DestroyTask(FindTaskIdByFunc(Task_PokecenterHeal));\n    }\n}\n\nbool8 FldEff_HallOfFameRecord(void)\n{\n    u8 nPokemon;\n    struct Task *task;\n\n    nPokemon = CalculatePlayerPartyCount();\n    task = &gTasks[CreateTask(Task_HallOfFameRecord, 0xFF)];\n    task->tNumMons = nPokemon;\n    task->tFirstBallX = 117;\n    task->tFirstBallY = 60;\n    return FALSE;\n}\n\nstatic void Task_HallOfFameRecord(u8 taskId)\n{\n    struct Task *task;\n    task = &gTasks[taskId];\n    sHallOfFameRecordEffectFuncs[task->tState](task);\n}\n\nstatic void HallOfFameRecordEffect_Init(struct Task *task)\n{\n    u8 taskId;\n    task->tState++;\n    task->tGlowEffectSpriteId = CreateGlowingPokeballsEffect(task->tNumMons, task->tFirstBallX, task->tFirstBallY, FALSE);\n}\n\nstatic void HallOfFameRecordEffect_WaitForBallPlacement(struct Task *task)\n{\n    if (gSprites[task->tGlowEffectSpriteId].sState > 1)\n    {\n        CreateHofMonitorSprite(120, 25);\n        task->data[15]++; // unused, leftover from RSE\n        task->tState++;\n    }\n}\n\nstatic void HallOfFameRecordEffect_WaitForBallFlashing(struct Task *task)\n{\n    if (gSprites[task->tGlowEffectSpriteId].sState > 4)\n        task->tState++;\n}\n\nstatic void HallOfFameRecordEffect_WaitForSoundAndEnd(struct Task *task)\n{\n    if (gSprites[task->tGlowEffectSpriteId].sState > 6)\n    {\n        DestroySprite(&gSprites[task->tGlowEffectSpriteId]);\n        FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD);\n        DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord));\n    }\n}\n\n#undef tState\n#undef tNumMons\n#undef tFirstBallX\n#undef tFirstBallY\n#undef tMonitorX\n#undef tMonitorY\n#undef tGlowEffectSpriteId\n#undef tMonitorSpriteId\n\nstatic u8 CreateGlowingPokeballsEffect(s16 numMons, s16 x, s16 y, bool16 playHealSe)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n    spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect);\n    sprite = &gSprites[spriteId];\n    sprite->x2 = x;\n    sprite->y2 = y;\n    sprite->subpriority = 0xFF;\n    sprite->sPlayHealSe = playHealSe;\n    sprite->sNumMons = numMons;\n    sprite->sSpriteId = spriteId;\n    return spriteId;\n}\n\nstatic void SpriteCB_PokeballGlowEffect(struct Sprite *sprite)\n{\n    sPokeballGlowEffectFuncs[sprite->sState](sprite);\n}\n\nstatic const struct Coords16 sPokeballCoordOffsets[] = {\n    {0, 0},\n    {6, 0},\n    {0, 4},\n    {6, 4},\n    {0, 8},\n    {6, 8}\n};\n\nstatic const u8 sPokeballGlowReds[]   = {16, 12,  8,  0};\nstatic const u8 sPokeballGlowGreens[] = {16, 12,  8,  0};\nstatic const u8 sPokeballGlowBlues[]  = { 0,  0,  0,  0};\n\nstatic void PokeballGlowEffect_PlaceBalls(struct Sprite *sprite)\n{\n    u8 spriteId;\n    if (sprite->sTimer == 0 || (--sprite->sTimer) == 0)\n    {\n        sprite->sTimer = 25;\n        spriteId = CreateSpriteAtEnd(&sSpriteTemplate_PokeballGlow, sPokeballCoordOffsets[sprite->sCounter].x + sprite->x2, sPokeballCoordOffsets[sprite->sCounter].y + sprite->y2, 0xFF);\n        gSprites[spriteId].oam.priority = 2;\n        gSprites[spriteId].sGlowEffectSpriteId = sprite->sSpriteId;\n        sprite->sCounter++;\n        sprite->sNumMons--;\n        PlaySE(SE_BALL);\n    }\n    if (sprite->sNumMons == 0)\n    {\n        sprite->sTimer = 32;\n        sprite->sState++;\n    }\n}\n\nstatic void PokeballGlowEffect_TryPlaySe(struct Sprite *sprite)\n{\n    if ((--sprite->sTimer) == 0)\n    {\n        sprite->sState++;\n        sprite->sTimer = 8;\n        sprite->sCounter = 0;\n        sprite->sNumFlashed = 0;\n        if (sprite->sPlayHealSe)\n            PlayFanfare(MUS_RS_HEAL);\n    }\n}\n\nstatic void PokeballGlowEffect_FlashFirstThree(struct Sprite *sprite)\n{\n    u8 phase;\n    if ((--sprite->sTimer) == 0)\n    {\n        sprite->sTimer = 8;\n        sprite->sCounter++;\n        sprite->sCounter &= 3;\n        if (sprite->sCounter == 0)\n            sprite->sNumFlashed++;\n    }\n    phase = (sprite->sCounter + 3) & 3;\n    MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 8, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]);\n    phase = (sprite->sCounter + 2) & 3;\n    MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 6, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]);\n    phase = (sprite->sCounter + 1) & 3;\n    MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 2, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]);\n    phase = sprite->sCounter;\n    MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 5, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]);\n    MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 3, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]);\n    if (sprite->sNumFlashed >= 3)\n    {\n        sprite->sState++;\n        sprite->sTimer = 8;\n        sprite->sCounter = 0;\n    }\n}\n\nstatic void PokeballGlowEffect_FlashLast(struct Sprite *sprite)\n{\n    u8 phase;\n    if ((--sprite->sTimer) == 0)\n    {\n        sprite->sTimer = 8;\n        sprite->sCounter++;\n        sprite->sCounter &= 3;\n        if (sprite->sCounter == 3)\n        {\n            sprite->sState++;\n            sprite->sTimer = 30;\n        }\n    }\n    phase = sprite->sCounter;\n    MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 8, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]);\n    MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 6, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]);\n    MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 2, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]);\n    MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 5, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]);\n    MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(0x1007)) + 3, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]);\n}\n\nstatic void PokeballGlowEffect_WaitAfterFlash(struct Sprite *sprite)\n{\n    if ((--sprite->sTimer) == 0)\n        sprite->sState++;\n}\n\nstatic void PokeballGlowEffect_Dummy(struct Sprite *sprite)\n{\n    sprite->sState++;\n}\n\nstatic void PokeballGlowEffect_WaitForSound(struct Sprite *sprite)\n{\n    if (sprite->sPlayHealSe == FALSE || IsFanfareTaskInactive())\n        sprite->sState++;\n}\n\nstatic void PokeballGlowEffect_Idle(struct Sprite *sprite)\n{\n}\n\nstatic void SpriteCB_PokeballGlow(struct Sprite *sprite)\n{\n    if (gSprites[sprite->sGlowEffectSpriteId].sState > 4)\n        FieldEffectFreeGraphicsResources(sprite);\n}\n\n#undef sState\n#undef sTimer\n#undef sCounter\n#undef sNumFlashed\n#undef sPlayHealSe\n#undef sNumMons\n#undef sSpriteId\n\n#undef sGlowEffectSpriteId\n\nstatic u8 CreatePokecenterMonitorSprite(s32 x, s32 y)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n    spriteId = CreateSpriteAtEnd(&sSpriteTemplate_PokecenterMonitor, x, y, 0);\n    sprite = &gSprites[spriteId];\n    sprite->oam.priority = 2;\n    sprite->invisible = TRUE;\n    return spriteId;\n}\n\nstatic void SpriteCB_PokecenterMonitor(struct Sprite *sprite)\n{\n    if (sprite->sStartFlash != FALSE)\n    {\n        sprite->sStartFlash = FALSE;\n        sprite->invisible = FALSE;\n        StartSpriteAnim(sprite, 1);\n    }\n    if (sprite->animEnded)\n        FieldEffectFreeGraphicsResources(sprite);\n}\n\n#undef sStartFlash\n\nstatic void CreateHofMonitorSprite(s32 x, s32 y)\n{\n    CreateSpriteAtEnd(&sSpriteTemplate_HofMonitor, x, y, 0);\n}\n\nstatic void SpriteCB_HallOfFameMonitor(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n        FieldEffectFreeGraphicsResources(sprite);\n}\n\nstatic void FieldCallback_UseFly(void);\nstatic void Task_UseFly(u8 taskId);\nstatic void FieldCallback_FlyIntoMap(void);\nstatic void Task_FlyIntoMap(u8 taskId);\n\nvoid ReturnToFieldFromFlyMapSelect(void)\n{\n    SetMainCallback2(CB2_ReturnToField);\n    gFieldCallback = FieldCallback_UseFly;\n}\n\nstatic void FieldCallback_UseFly(void)\n{\n    FadeInFromBlack();\n    CreateTask(Task_UseFly, 0);\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    gFieldCallback = NULL;\n}\n\nstatic void Task_UseFly(u8 taskId)\n{\n    struct Task *task;\n    task = &gTasks[taskId];\n    if (task->data[0] == 0)\n    {\n        if (!IsWeatherNotFadingIn())\n            return;\n        gFieldEffectArguments[0] = GetCursorSelectionMonId();\n        if ((int)gFieldEffectArguments[0] >= PARTY_SIZE)\n            gFieldEffectArguments[0] = 0;\n        FieldEffectStart(FLDEFF_FLY_OUT);\n        task->data[0]++;\n    }\n    if (!FieldEffectActiveListContains(FLDEFF_FLY_OUT))\n    {\n        Overworld_ResetStateAfterFly();\n        WarpIntoMap();\n        SetMainCallback2(CB2_LoadMap);\n        gFieldCallback = FieldCallback_FlyIntoMap;\n        DestroyTask(taskId);\n    }\n}\n\nstatic void FieldCallback_FlyIntoMap(void)\n{\n    Overworld_PlaySpecialMapMusic();\n    FadeInFromBlack();\n    CreateTask(Task_FlyIntoMap, 0);\n    gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE;\n    if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)\n        ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], DIR_WEST);\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    gFieldCallback = NULL;\n}\n\nstatic void Task_FlyIntoMap(u8 taskId)\n{\n    struct Task *task;\n    task = &gTasks[taskId];\n    if (task->data[0] == 0)\n    {\n        if (gPaletteFade.active)\n            return;\n        FieldEffectStart(FLDEFF_FLY_IN);\n        task->data[0]++;\n    }\n    if (!FieldEffectActiveListContains(FLDEFF_FLY_IN))\n    {\n        UnlockPlayerFieldControls();\n        UnfreezeObjectEvents();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_FallWarpFieldEffect(u8 taskId);\nstatic bool8 FallWarpEffect_1(struct Task *task);\nstatic bool8 FallWarpEffect_2(struct Task *task);\nstatic bool8 FallWarpEffect_3(struct Task *task);\nstatic bool8 FallWarpEffect_4(struct Task *task);\nstatic bool8 FallWarpEffect_5(struct Task *task);\nstatic bool8 FallWarpEffect_6(struct Task *task);\nstatic bool8 FallWarpEffect_7(struct Task *task);\n\nstatic bool8 (*const sFallWarpEffectCBPtrs[])(struct Task *task) = {\n    FallWarpEffect_1,\n    FallWarpEffect_2,\n    FallWarpEffect_3,\n    FallWarpEffect_4,\n    FallWarpEffect_5,\n    FallWarpEffect_6,\n    FallWarpEffect_7\n};\n\nvoid FieldCB_FallWarpExit(void)\n{\n    Overworld_PlaySpecialMapMusic();\n    WarpFadeInScreen();\n    QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode();\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    CreateTask(Task_FallWarpFieldEffect, 0);\n    gFieldCallback = NULL;\n}\n\nstatic void Task_FallWarpFieldEffect(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    while (sFallWarpEffectCBPtrs[task->data[0]](task))\n        ;\n}\n\nstatic bool8 FallWarpEffect_1(struct Task *task)\n{\n    struct ObjectEvent * playerObject;\n    struct Sprite *playerSprite;\n    playerObject = &gObjectEvents[gPlayerAvatar.objectEventId];\n    playerSprite = &gSprites[gPlayerAvatar.spriteId];\n    CameraObjectReset2();\n    gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE;\n    gPlayerAvatar.preventStep = TRUE;\n    ObjectEventSetHeldMovement(playerObject, GetFaceDirectionMovementAction(GetPlayerFacingDirection()));\n    task->data[4] = playerSprite->subspriteMode;\n    playerObject->fixedPriority = TRUE;\n    playerSprite->oam.priority = 1;\n    playerSprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;\n    task->data[0]++;\n    return TRUE;\n}\n\nstatic bool8 FallWarpEffect_2(struct Task *task)\n{\n    if (IsWeatherNotFadingIn())\n    {\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 FallWarpEffect_3(struct Task *task)\n{\n    struct Sprite *sprite;\n    s16 centerToCornerVecY;\n    sprite = &gSprites[gPlayerAvatar.spriteId];\n    centerToCornerVecY = -(sprite->centerToCornerVecY << 1);\n    sprite->y2 = -(sprite->y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY);\n    task->data[1] = 1;\n    task->data[2] = 0;\n    gObjectEvents[gPlayerAvatar.objectEventId].invisible = FALSE;\n    PlaySE(SE_FALL);\n    task->data[0]++;\n    return FALSE;\n}\n\nstatic bool8 FallWarpEffect_4(struct Task *task)\n{\n    struct ObjectEvent * objectEvent;\n    struct Sprite *sprite;\n\n    objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    sprite = &gSprites[gPlayerAvatar.spriteId];\n    sprite->y2 += task->data[1];\n    if (task->data[1] < 8)\n    {\n        task->data[2] += task->data[1];\n        if (task->data[2] & 0xf)\n        {\n            task->data[1] <<= 1;\n        }\n    }\n    if (task->data[3] == 0 && sprite->y2 >= -16)\n    {\n        task->data[3]++;\n        objectEvent->fixedPriority = FALSE;\n        sprite->subspriteMode = task->data[4];\n        objectEvent->triggerGroundEffectsOnMove = TRUE;\n    }\n    if (sprite->y2 >= 0)\n    {\n        PlaySE(SE_M_STRENGTH);\n        objectEvent->triggerGroundEffectsOnStop = TRUE;\n        objectEvent->landingJump = TRUE;\n        sprite->y2 = 0;\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 FallWarpEffect_5(struct Task *task)\n{\n    task->data[0]++;\n    task->data[1] = 4;\n    task->data[2] = 0;\n    SetCameraPanningCallback(NULL);\n    return TRUE;\n}\n\nstatic bool8 FallWarpEffect_6(struct Task *task)\n{\n    SetCameraPanning(0, task->data[1]);\n    task->data[1] = -task->data[1];\n    task->data[2]++;\n    if ((task->data[2] & 3) == 0)\n    {\n        task->data[1] >>= 1;\n    }\n    if (task->data[1] == 0)\n    {\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 FallWarpEffect_7(struct Task *task)\n{\n    s16 x, y;\n    gPlayerAvatar.preventStep = FALSE;\n    UnlockPlayerFieldControls();\n    CameraObjectReset1();\n    UnfreezeObjectEvents();\n    InstallCameraPanAheadCallback();\n    PlayerGetDestCoords(&x, &y);\n    if (MetatileBehavior_IsSurfableInSeafoamIslands(MapGridGetMetatileBehaviorAt(x, y)) == TRUE)\n    {\n        VarSet(VAR_TEMP_1, 1);\n        SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_SURFING);\n        SetHelpContext(HELPCONTEXT_SURFING);\n    }\n    DestroyTask(FindTaskIdByFunc(Task_FallWarpFieldEffect));\n    return FALSE;\n}\n\nstatic void Task_EscalatorWarpFieldEffect(u8 taskId);\nstatic bool8 EscalatorWarpEffect_1(struct Task *task);\nstatic bool8 EscalatorWarpEffect_2(struct Task *task);\nstatic bool8 EscalatorWarpEffect_3(struct Task *task);\nstatic bool8 EscalatorWarpEffect_4(struct Task *task);\nstatic bool8 EscalatorWarpEffect_5(struct Task *task);\nstatic bool8 EscalatorWarpEffect_6(struct Task *task);\nstatic void Escalator_AnimatePlayerGoingDown(struct Task *task);\nstatic void Escalator_AnimatePlayerGoingUp(struct Task *task);\nstatic void Escalator_BeginFadeOutToNewMap(void);\nstatic void Escalator_TransitionToWarpInEffect(void);\nstatic void FieldCB_EscalatorWarpIn(void);\nstatic void Task_EscalatorWarpInFieldEffect(u8 taskId);\nstatic bool8 EscalatorWarpInEffect_1(struct Task *task);\nstatic bool8 EscalatorWarpInEffect_2(struct Task *task);\nstatic bool8 EscalatorWarpInEffect_3(struct Task *task);\nstatic bool8 EscalatorWarpInEffect_4(struct Task *task);\nstatic bool8 EscalatorWarpInEffect_5(struct Task *task);\nstatic bool8 EscalatorWarpInEffect_6(struct Task *task);\nstatic bool8 EscalatorWarpInEffect_7(struct Task *task);\n\nstatic bool8 (*const sEscalatorWarpFieldEffectFuncs[])(struct Task *task) = {\n    EscalatorWarpEffect_1,\n    EscalatorWarpEffect_2,\n    EscalatorWarpEffect_3,\n    EscalatorWarpEffect_4,\n    EscalatorWarpEffect_5,\n    EscalatorWarpEffect_6\n};\n\nvoid StartEscalatorWarp(u8 metatileBehavior, u8 priority)\n{\n    u8 taskId = CreateTask(Task_EscalatorWarpFieldEffect, priority);\n    gTasks[taskId].data[1] = 0;\n    if (metatileBehavior == MB_UP_ESCALATOR)\n        gTasks[taskId].data[1] = 1;\n}\n\nstatic void Task_EscalatorWarpFieldEffect(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    while (sEscalatorWarpFieldEffectFuncs[task->data[0]](task))\n        ;\n}\n\nstatic bool8 EscalatorWarpEffect_1(struct Task *task)\n{\n    FreezeObjectEvents();\n    CameraObjectReset2();\n    StartEscalator(task->data[1]);\n    QuestLog_OnEscalatorWarp(QL_ESCALATOR_OUT);\n    task->data[0]++;\n    return FALSE;\n}\n\nstatic bool8 EscalatorWarpEffect_2(struct Task *task)\n{\n    struct ObjectEvent * objectEvent;\n    objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(GetPlayerFacingDirection()));\n        task->data[0]++;\n        task->data[2] = 0;\n        task->data[3] = 0;\n        if ((u8)task->data[1] == 0)\n        {\n            task->data[0] = 4;\n        }\n        PlaySE(SE_ESCALATOR);\n    }\n    return FALSE;\n}\n\nstatic bool8 EscalatorWarpEffect_3(struct Task *task)\n{\n    Escalator_AnimatePlayerGoingDown(task);\n    if (task->data[2] > 3)\n    {\n        Escalator_BeginFadeOutToNewMap();\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 EscalatorWarpEffect_4(struct Task *task)\n{\n    Escalator_AnimatePlayerGoingDown(task);\n    Escalator_TransitionToWarpInEffect();\n    return FALSE;\n}\n\nstatic bool8 EscalatorWarpEffect_5(struct Task *task)\n{\n    Escalator_AnimatePlayerGoingUp(task);\n    if (task->data[2] > 3)\n    {\n        Escalator_BeginFadeOutToNewMap();\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 EscalatorWarpEffect_6(struct Task *task)\n{\n    Escalator_AnimatePlayerGoingUp(task);\n    Escalator_TransitionToWarpInEffect();\n    return FALSE;\n}\n\n\nstatic void Escalator_AnimatePlayerGoingDown(struct Task *task)\n{\n    struct Sprite *sprite;\n    sprite = &gSprites[gPlayerAvatar.spriteId];\n    sprite->x2 = Cos(0x84, task->data[2]);\n    sprite->y2 = Sin(0x94, task->data[2]);\n    task->data[3]++;\n    if (task->data[3] & 1)\n    {\n        task->data[2]++;\n    }\n}\n\nstatic void Escalator_AnimatePlayerGoingUp(struct Task *task)\n{\n    struct Sprite *sprite;\n    sprite = &gSprites[gPlayerAvatar.spriteId];\n    sprite->x2 = Cos(0x7c, task->data[2]);\n    sprite->y2 = Sin(0x76, task->data[2]);\n    task->data[3]++;\n    if (task->data[3] & 1)\n    {\n        task->data[2]++;\n    }\n}\n\nstatic void Escalator_BeginFadeOutToNewMap(void)\n{\n    TryFadeOutOldMapMusic();\n    WarpFadeOutScreen();\n}\n\nstatic void Escalator_TransitionToWarpInEffect(void)\n{\n    if (!gPaletteFade.active && BGMusicStopped() == TRUE)\n    {\n        StopEscalator();\n        WarpIntoMap();\n        gFieldCallback = FieldCB_EscalatorWarpIn;\n        SetMainCallback2(CB2_LoadMap);\n        DestroyTask(FindTaskIdByFunc(Task_EscalatorWarpFieldEffect));\n    }\n}\n\nstatic bool8 (*const sEscalatorWarpInFieldEffectFuncs[])(struct Task *task) = {\n    EscalatorWarpInEffect_1,\n    EscalatorWarpInEffect_2,\n    EscalatorWarpInEffect_3,\n    EscalatorWarpInEffect_4,\n    EscalatorWarpInEffect_5,\n    EscalatorWarpInEffect_6,\n    EscalatorWarpInEffect_7\n};\n\nstatic void FieldCB_EscalatorWarpIn(void)\n{\n    Overworld_PlaySpecialMapMusic();\n    WarpFadeInScreen();\n    QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode();\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    CreateTask(Task_EscalatorWarpInFieldEffect, 0);\n    gFieldCallback = NULL;\n}\n\nstatic void Task_EscalatorWarpInFieldEffect(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    while (sEscalatorWarpInFieldEffectFuncs[task->data[0]](task))\n        ;\n}\n\nstatic bool8 EscalatorWarpInEffect_1(struct Task *task)\n{\n    struct ObjectEvent * objectEvent;\n    s16 x;\n    s16 y;\n    u8 behavior;\n    CameraObjectReset2();\n    objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(DIR_EAST));\n    PlayerGetDestCoords(&x, &y);\n    behavior = MapGridGetMetatileBehaviorAt(x, y);\n    task->data[0]++;\n    task->data[1] = 16;\n    if (behavior == MB_DOWN_ESCALATOR)\n    {\n        behavior = 1;\n        task->data[0] = 3;\n    } else\n    {\n        behavior = 0;\n    }\n    StartEscalator(behavior);\n    return TRUE;\n}\n\nstatic bool8 EscalatorWarpInEffect_2(struct Task *task)\n{\n    struct Sprite *sprite;\n    sprite = &gSprites[gPlayerAvatar.spriteId];\n    sprite->x2 = Cos(0x84, task->data[1]);\n    sprite->y2 = Sin(0x94, task->data[1]);\n    task->data[0]++;\n    return FALSE;\n}\n\nstatic bool8 EscalatorWarpInEffect_3(struct Task *task)\n{\n    struct Sprite *sprite;\n    sprite = &gSprites[gPlayerAvatar.spriteId];\n    sprite->x2 = Cos(0x84, task->data[1]);\n    sprite->y2 = Sin(0x94, task->data[1]);\n    task->data[2]++;\n    if (task->data[2] & 1)\n    {\n        task->data[1]--;\n    }\n    if (task->data[1] == 0)\n    {\n        sprite->x2 = 0;\n        sprite->y2 = 0;\n        task->data[0] = 5;\n    }\n    return FALSE;\n}\n\n\nstatic bool8 EscalatorWarpInEffect_4(struct Task *task)\n{\n    struct Sprite *sprite;\n    sprite = &gSprites[gPlayerAvatar.spriteId];\n    sprite->x2 = Cos(0x7c, task->data[1]);\n    sprite->y2 = Sin(0x76, task->data[1]);\n    task->data[0]++;\n    return FALSE;\n}\n\nstatic bool8 EscalatorWarpInEffect_5(struct Task *task)\n{\n    struct Sprite *sprite;\n    sprite = &gSprites[gPlayerAvatar.spriteId];\n    sprite->x2 = Cos(0x7c, task->data[1]);\n    sprite->y2 = Sin(0x76, task->data[1]);\n    task->data[2]++;\n    if (task->data[2] & 1)\n    {\n        task->data[1]--;\n    }\n    if (task->data[1] == 0)\n    {\n        sprite->x2 = 0;\n        sprite->y2 = 0;\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 EscalatorWarpInEffect_6(struct Task *task)\n{\n    if (IsEscalatorMoving())\n    {\n        return FALSE;\n    }\n    StopEscalator();\n    task->data[0]++;\n    return TRUE;\n}\n\nstatic bool8 EscalatorWarpInEffect_7(struct Task *task)\n{\n    struct ObjectEvent * objectEvent;\n    objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        CameraObjectReset1();\n        UnlockPlayerFieldControls();\n        UnfreezeObjectEvents();\n        ObjectEventSetHeldMovement(objectEvent, GetWalkNormalMovementAction(DIR_EAST));\n        DestroyTask(FindTaskIdByFunc(Task_EscalatorWarpInFieldEffect));\n        QuestLog_OnEscalatorWarp(QL_ESCALATOR_IN);\n    }\n    return FALSE;\n}\n\nstatic void Task_UseWaterfall(u8 taskId);\n\nstatic bool8 waterfall_0_setup(struct Task *task, struct ObjectEvent * playerObj);\nstatic bool8 waterfall_1_do_anim_probably(struct Task *task, struct ObjectEvent * playerObj);\nstatic bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct ObjectEvent * playerObj);\nstatic bool8 waterfall_3_move_player_probably(struct Task *task, struct ObjectEvent * playerObj);\nstatic bool8 waterfall_4_wait_player_move_probably(struct Task *task, struct ObjectEvent * playerObj);\n\nstatic bool8 (*const sUseWaterfallFieldEffectFuncs[])(struct Task *task, struct ObjectEvent * playerObj) = {\n    waterfall_0_setup,\n    waterfall_1_do_anim_probably,\n    waterfall_2_wait_anim_finish_probably,\n    waterfall_3_move_player_probably,\n    waterfall_4_wait_player_move_probably\n};\n\nu32 FldEff_UseWaterfall(void)\n{\n    u8 taskId = CreateTask(Task_UseWaterfall, 0xFF);\n    gTasks[taskId].data[1] = gFieldEffectArguments[0];\n    Task_UseWaterfall(taskId);\n    return 0;\n}\n\nstatic void Task_UseWaterfall(u8 taskId)\n{\n    while (sUseWaterfallFieldEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId]))\n        ;\n}\n\nstatic bool8 waterfall_0_setup(struct Task *task, struct ObjectEvent * playerObj)\n{\n    LockPlayerFieldControls();\n    gPlayerAvatar.preventStep = TRUE;\n    task->data[0]++;\n    return FALSE;\n}\n\nstatic bool8 waterfall_1_do_anim_probably(struct Task *task, struct ObjectEvent * playerObj)\n{\n    LockPlayerFieldControls();\n    if (!ObjectEventIsMovementOverridden(playerObj))\n    {\n        ObjectEventClearHeldMovementIfFinished(playerObj);\n        gFieldEffectArguments[0] = task->data[1];\n        FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct ObjectEvent * playerObj)\n{\n    if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))\n        return FALSE;\n    task->data[0]++;\n    return TRUE;\n}\n\nstatic bool8 waterfall_3_move_player_probably(struct Task *task, struct ObjectEvent * playerObj)\n{\n    ObjectEventSetHeldMovement(playerObj, GetWalkSlowerMovementAction(DIR_NORTH));\n    task->data[0]++;\n    return FALSE;\n}\n\nstatic bool8 waterfall_4_wait_player_move_probably(struct Task *task, struct ObjectEvent * playerObj)\n{\n    if (!ObjectEventClearHeldMovementIfFinished(playerObj))\n        return FALSE;\n    if (MetatileBehavior_IsWaterfall(playerObj->currentMetatileBehavior))\n    {\n        task->data[0] = 3;\n        return TRUE;\n    }\n    UnlockPlayerFieldControls();\n    gPlayerAvatar.preventStep = FALSE;\n    DestroyTask(FindTaskIdByFunc(Task_UseWaterfall));\n    FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL);\n    return FALSE;\n}\n\nstatic void Task_UseDive(u8 taskId);\nstatic bool8 DiveFieldEffect_Init(struct Task *task);\nstatic bool8 DiveFieldEffect_ShowMon(struct Task *task);\nstatic bool8 DiveFieldEffect_TryWarp(struct Task *task);\n\nstatic bool8 (*const sDiveFieldEffectFuncs[])(struct Task *task) = \n{\n    DiveFieldEffect_Init,\n    DiveFieldEffect_ShowMon,\n    DiveFieldEffect_TryWarp\n};\n\nu32 FldEff_UseDive(void)\n{\n    u8 taskId = CreateTask(Task_UseDive, 0xFF);\n    gTasks[taskId].data[15] = gFieldEffectArguments[0]; // party index of pokemon with dive\n    gTasks[taskId].data[14] = gFieldEffectArguments[1]; // unused\n    Task_UseDive(taskId);\n    return 0;\n}\n\nstatic void Task_UseDive(u8 taskId)\n{\n    while (sDiveFieldEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]));\n}\n\nstatic bool8 DiveFieldEffect_Init(struct Task *task)\n{\n    gPlayerAvatar.preventStep = TRUE;\n    task->data[0]++;\n    return FALSE;\n}\n\nstatic bool8 DiveFieldEffect_ShowMon(struct Task *task)\n{\n    LockPlayerFieldControls();\n    gFieldEffectArguments[0] = task->data[15];\n    FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);\n    task->data[0]++;\n    return FALSE;\n}\n\nstatic bool8 DiveFieldEffect_TryWarp(struct Task *task)\n{\n    struct MapPosition pos;\n    PlayerGetDestCoords(&pos.x, &pos.y);\n    if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))\n    {\n        dive_warp(&pos, gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior);\n        DestroyTask(FindTaskIdByFunc(Task_UseDive));\n        FieldEffectActiveListRemove(FLDEFF_USE_DIVE);\n    }\n    return FALSE;\n}\n\nstatic void Task_LavaridgeGymB1FWarp(u8 taskId);\nstatic bool8 LavaridgeGymB1FWarpEffect_1(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic bool8 LavaridgeGymB1FWarpEffect_2(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic bool8 LavaridgeGymB1FWarpEffect_3(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic bool8 LavaridgeGymB1FWarpEffect_4(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic bool8 LavaridgeGymB1FWarpEffect_5(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic bool8 LavaridgeGymB1FWarpEffect_6(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic void FieldCB_LavaridgeGymB1FWarpExit(void);\nstatic void Task_LavaridgeGymB1FWarpExit(u8 taskId);\nstatic bool8 LavaridgeGymB1FWarpExitEffect_1(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic bool8 LavaridgeGymB1FWarpExitEffect_2(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic bool8 LavaridgeGymB1FWarpExitEffect_3(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic bool8 LavaridgeGymB1FWarpExitEffect_4(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\n\nstatic bool8 (*const sLavaridgeGymB1FWarpEffectFuncs[])(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) = {\n    LavaridgeGymB1FWarpEffect_1,\n    LavaridgeGymB1FWarpEffect_2,\n    LavaridgeGymB1FWarpEffect_3,\n    LavaridgeGymB1FWarpEffect_4,\n    LavaridgeGymB1FWarpEffect_5,\n    LavaridgeGymB1FWarpEffect_6\n};\n\nvoid StartLavaridgeGymB1FWarp(u8 priority)\n{\n    CreateTask(Task_LavaridgeGymB1FWarp, priority);\n}\n\nstatic void Task_LavaridgeGymB1FWarp(u8 taskId)\n{\n    while (sLavaridgeGymB1FWarpEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gSprites[gPlayerAvatar.spriteId]));\n}\n\nstatic bool8 LavaridgeGymB1FWarpEffect_1(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    FreezeObjectEvents();\n    CameraObjectReset2();\n    SetCameraPanningCallback(NULL);\n    gPlayerAvatar.preventStep = TRUE;\n    objectEvent->fixedPriority = TRUE;\n    task->data[1] = 1;\n    task->data[0]++;\n    return TRUE;\n}\n\nstatic bool8 LavaridgeGymB1FWarpEffect_2(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    SetCameraPanning(0, task->data[1]);\n    task->data[1] = -task->data[1];\n    task->data[2]++;\n    if (task->data[2] > 7)\n    {\n        task->data[2] = 0;\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 LavaridgeGymB1FWarpEffect_3(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    sprite->y2 = 0;\n    task->data[3] = 1;\n    gFieldEffectArguments[0] = objectEvent->currentCoords.x;\n    gFieldEffectArguments[1] = objectEvent->currentCoords.y;\n    gFieldEffectArguments[2] = sprite->subpriority - 1;\n    gFieldEffectArguments[3] = sprite->oam.priority;\n    FieldEffectStart(FLDEFF_LAVARIDGE_GYM_WARP);\n    PlaySE(SE_M_EXPLOSION);\n    task->data[0]++;\n    return TRUE;\n}\n\nstatic bool8 LavaridgeGymB1FWarpEffect_4(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    s16 centerToCornerVecY;\n    SetCameraPanning(0, task->data[1]);\n    if (task->data[1] = -task->data[1], ++task->data[2] <= 17)\n    {\n        if (!(task->data[2] & 1) && (task->data[1] <= 3))\n        {\n            task->data[1] <<= 1;\n        }\n    } else if (!(task->data[2] & 4) && (task->data[1] > 0))\n    {\n        task->data[1] >>= 1;\n    }\n    if (task->data[2] > 6)\n    {\n        centerToCornerVecY = -(sprite->centerToCornerVecY << 1);\n        if (sprite->y2 > -(sprite->y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY))\n        {\n            sprite->y2 -= task->data[3];\n            if (task->data[3] <= 7)\n            {\n                task->data[3]++;\n            }\n        } else\n        {\n            task->data[4] = 1;\n        }\n    }\n    if (task->data[5] == 0 && sprite->y2 < -0x10)\n    {\n        task->data[5]++;\n        objectEvent->fixedPriority = TRUE;\n        sprite->oam.priority = 1;\n        sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;\n    }\n    if (task->data[1] == 0 && task->data[4] != 0)\n    {\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 LavaridgeGymB1FWarpEffect_5(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    TryFadeOutOldMapMusic();\n    WarpFadeOutScreen();\n    task->data[0]++;\n    return FALSE;\n}\n\nstatic bool8 LavaridgeGymB1FWarpEffect_6(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    if (!gPaletteFade.active && BGMusicStopped() == TRUE)\n    {\n        WarpIntoMap();\n        gFieldCallback = FieldCB_LavaridgeGymB1FWarpExit;\n        SetMainCallback2(CB2_LoadMap);\n        DestroyTask(FindTaskIdByFunc(Task_LavaridgeGymB1FWarp));\n    }\n    return FALSE;\n}\n\nstatic bool8 (*const sLavaridgeGymB1FWarpExitEffectFuncs[])(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) = {\n    LavaridgeGymB1FWarpExitEffect_1,\n    LavaridgeGymB1FWarpExitEffect_2,\n    LavaridgeGymB1FWarpExitEffect_3,\n    LavaridgeGymB1FWarpExitEffect_4\n};\n\nstatic void FieldCB_LavaridgeGymB1FWarpExit(void)\n{\n    Overworld_PlaySpecialMapMusic();\n    WarpFadeInScreen();\n    QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode();\n    LockPlayerFieldControls();\n    gFieldCallback = NULL;\n    CreateTask(Task_LavaridgeGymB1FWarpExit, 0);\n}\n\nstatic void Task_LavaridgeGymB1FWarpExit(u8 taskId)\n{\n    while (sLavaridgeGymB1FWarpExitEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gSprites[gPlayerAvatar.spriteId]));\n}\n\nstatic bool8 LavaridgeGymB1FWarpExitEffect_1(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    CameraObjectReset2();\n    FreezeObjectEvents();\n    gPlayerAvatar.preventStep = TRUE;\n    objectEvent->invisible = TRUE;\n    task->data[0]++;\n    return FALSE;\n}\n\nstatic bool8 LavaridgeGymB1FWarpExitEffect_2(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    if (IsWeatherNotFadingIn())\n    {\n        gFieldEffectArguments[0] = objectEvent->currentCoords.x;\n        gFieldEffectArguments[1] = objectEvent->currentCoords.y;\n        gFieldEffectArguments[2] = sprite->subpriority - 1;\n        gFieldEffectArguments[3] = sprite->oam.priority;\n        task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 LavaridgeGymB1FWarpExitEffect_3(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    sprite = &gSprites[task->data[1]];\n    if (sprite->animCmdIndex > 1)\n    {\n        task->data[0]++;\n        objectEvent->invisible = FALSE;\n        CameraObjectReset1();\n        PlaySE(SE_M_DIG);\n        ObjectEventSetHeldMovement(objectEvent, GetJumpMovementAction(DIR_EAST));\n    }\n    return FALSE;\n}\n\nstatic bool8 LavaridgeGymB1FWarpExitEffect_4(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        gPlayerAvatar.preventStep = FALSE;\n        UnlockPlayerFieldControls();\n        UnfreezeObjectEvents();\n        DestroyTask(FindTaskIdByFunc(Task_LavaridgeGymB1FWarpExit));\n    }\n    return FALSE;\n}\n\nstatic void Task_LavaridgeGym1FWarp(u8 taskId);\nstatic bool8 LavaridgeGym1FWarpEffect_1(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic bool8 LavaridgeGym1FWarpEffect_2(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic bool8 LavaridgeGym1FWarpEffect_3(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic bool8 LavaridgeGym1FWarpEffect_4(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic bool8 LavaridgeGym1FWarpEffect_5(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite);\n\nstatic bool8 (*const sLavaridgeGym1FWarpEffectFuncs[])(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite) = {\n    LavaridgeGym1FWarpEffect_1,\n    LavaridgeGym1FWarpEffect_2,\n    LavaridgeGym1FWarpEffect_3,\n    LavaridgeGym1FWarpEffect_4,\n    LavaridgeGym1FWarpEffect_5\n};\n\n// For the ash puff effect when warping off the B1F ash tiles\nu8 FldEff_LavaridgeGymWarp(void)\n{\n    u8 spriteId;\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ASH_LAUNCH], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    gSprites[spriteId].oam.priority = gFieldEffectArguments[3];\n    gSprites[spriteId].coordOffsetEnabled = TRUE;\n    return spriteId;\n}\n\nvoid SpriteCB_AshLaunch(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n    {\n        FieldEffectStop(sprite, FLDEFF_LAVARIDGE_GYM_WARP);\n    }\n}\n\nvoid StartLavaridgeGym1FWarp(u8 priority)\n{\n    CreateTask(Task_LavaridgeGym1FWarp, priority);\n}\n\nstatic void Task_LavaridgeGym1FWarp(u8 taskId)\n{\n    while(sLavaridgeGym1FWarpEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gSprites[gPlayerAvatar.spriteId]));\n}\n\nstatic bool8 LavaridgeGym1FWarpEffect_1(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    FreezeObjectEvents();\n    CameraObjectReset2();\n    gPlayerAvatar.preventStep = TRUE;\n    objectEvent->fixedPriority = TRUE;\n    task->data[0]++;\n    return FALSE;\n}\n\nstatic bool8 LavaridgeGym1FWarpEffect_2(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    if (ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        if (task->data[1] > 3)\n        {\n            gFieldEffectArguments[0] = objectEvent->currentCoords.x;\n            gFieldEffectArguments[1] = objectEvent->currentCoords.y;\n            gFieldEffectArguments[2] = sprite->subpriority - 1;\n            gFieldEffectArguments[3] = sprite->oam.priority;\n            task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);\n            task->data[0]++;\n        } else\n        {\n            task->data[1]++;\n            ObjectEventSetHeldMovement(objectEvent, GetWalkInPlaceFasterMovementAction(objectEvent->facingDirection));\n            PlaySE(SE_LAVARIDGE_FALL_WARP);\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 LavaridgeGym1FWarpEffect_3(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    if (gSprites[task->data[1]].animCmdIndex == 2)\n    {\n        objectEvent->invisible = TRUE;\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 LavaridgeGym1FWarpEffect_4(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))\n    {\n        TryFadeOutOldMapMusic();\n        WarpFadeOutScreen();\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 LavaridgeGym1FWarpEffect_5(struct Task *task, struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    if (!gPaletteFade.active && BGMusicStopped() == TRUE)\n    {\n        WarpIntoMap();\n        gFieldCallback = FieldCB_FallWarpExit;\n        SetMainCallback2(CB2_LoadMap);\n        DestroyTask(FindTaskIdByFunc(Task_LavaridgeGym1FWarp));\n    }\n    return FALSE;\n}\n\nu8 FldEff_PopOutOfAsh(void)\n{\n    u8 spriteId;\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ASH_PUFF], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    gSprites[spriteId].oam.priority = gFieldEffectArguments[3];\n    gSprites[spriteId].coordOffsetEnabled = TRUE;\n    return spriteId;\n}\n\nvoid SpriteCB_PopOutOfAsh(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n    {\n        FieldEffectStop(sprite, FLDEFF_POP_OUT_OF_ASH);\n    }\n}\n\n// Task data for Task_EscapeRopeWarpOut\n#define tState       data[0]\n#define tSpinDelay   data[1]\n#define tNumTurns    data[2]\n#define tTimer       data[3]\n#define tOffscreen   data[4]\n#define tMovingState data[5]\n#define tOffsetY     data[6]\n#define tDirection   data[15]\n\nstatic void Task_EscapeRopeWarpOut(u8 taskId);\nstatic void EscapeRopeWarpOutEffect_Init(struct Task *task);\nstatic void EscapeRopeWarpOutEffect_Spin(struct Task *task);\nstatic u8 SpinObjectEvent(struct ObjectEvent *playerObj, s16 *timer, s16 *numTurns);\nstatic bool32 WarpOutObjectEventUpwards(struct ObjectEvent *playerObj, s16 *movingState, s16 *offsetY);\nstatic void FieldCallback_EscapeRopeExit(void);\nstatic void Task_EscapeRopeWarpIn(u8 taskId);\nstatic void EscapeRopeWarpInEffect_Init(struct Task *task);\nstatic void EscapeRopeWarpInEffect_Spin(struct Task *task);\n\nstatic void (*const sEscapeRopeWarpOutEffectFuncs[])(struct Task *task) =\n{\n    EscapeRopeWarpOutEffect_Init,\n    EscapeRopeWarpOutEffect_Spin\n};\n\nvoid StartEscapeRopeFieldEffect(void)\n{\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    CreateTask(Task_EscapeRopeWarpOut, 80);\n}\n\nstatic void Task_EscapeRopeWarpOut(u8 taskId)\n{\n    sEscapeRopeWarpOutEffectFuncs[gTasks[taskId].tState](&gTasks[taskId]);\n}\n\nstatic void EscapeRopeWarpOutEffect_Init(struct Task *task)\n{\n    task->tState++;\n    task->data[13] = 64; // unused\n    task->data[14] = GetPlayerFacingDirection(); // unused\n    task->tDirection = DIR_NONE;\n}\n\nstatic void EscapeRopeWarpOutEffect_Spin(struct Task *task)\n{\n    struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];\n    s16 *data = task->data;\n    SpinObjectEvent(playerObj, &task->tSpinDelay, &task->tNumTurns);\n    if (tTimer < 60)\n    {\n        tTimer++;\n        if (tTimer == 20)\n            PlaySE(SE_WARP_IN);\n    }\n    else if (tOffscreen == FALSE && !WarpOutObjectEventUpwards(playerObj, &task->tMovingState, &task->tOffsetY))\n    {\n        TryFadeOutOldMapMusic();\n        WarpFadeOutScreen();\n        tOffscreen = TRUE;\n    }\n    if (tOffscreen == TRUE && !gPaletteFade.active && BGMusicStopped() == TRUE)\n    {\n        SetObjectEventDirection(playerObj, task->tDirection); // always DIR_NONE\n        SetWarpDestinationToEscapeWarp();\n        WarpIntoMap();\n        gFieldCallback = FieldCallback_EscapeRopeExit;\n        SetMainCallback2(CB2_LoadMap);\n        DestroyTask(FindTaskIdByFunc(Task_EscapeRopeWarpOut));\n    }\n}\n\nstatic const u8 sSpinDirections[] = \n{\n    [DIR_NONE]  = DIR_SOUTH,\n    [DIR_SOUTH] = DIR_WEST,\n    [DIR_NORTH] = DIR_EAST,\n    [DIR_WEST]  = DIR_NORTH,\n    [DIR_EAST]  = DIR_SOUTH,\n};\n\nstatic u8 SpinObjectEvent(struct ObjectEvent *playerObj, s16 *spinDelay, s16 *numTurns)\n{\n    if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj))\n    {\n        if (*spinDelay != 0 && --(*spinDelay) != 0)\n            return playerObj->facingDirection;\n        ObjectEventSetHeldMovement(playerObj, GetFaceDirectionMovementAction(sSpinDirections[playerObj->facingDirection]));\n        if (*numTurns < 12)\n            (*numTurns)++;\n        *spinDelay = 12 >> (*numTurns);\n        return sSpinDirections[playerObj->facingDirection];\n    }\n    return playerObj->facingDirection;\n}\n\nstatic bool32 WarpOutObjectEventUpwards(struct ObjectEvent *playerObj, s16 *movingState, s16 *offsetY)\n{\n    struct Sprite *sprite = &gSprites[playerObj->spriteId];\n    switch (*movingState)\n    {\n    case 0:\n        CameraObjectReset2();\n        (*movingState)++;\n        // fallthrough\n    case 1:\n        sprite->y2 -= 8;\n        (*offsetY) -= 8;\n        if (*offsetY <= -16)\n        {\n            playerObj->fixedPriority = TRUE;\n            sprite->oam.priority = 1;\n            sprite->subpriority = 0;\n            sprite->subspriteMode = SUBSPRITES_OFF;\n            (*movingState)++;\n        }\n        break;\n    case 2:\n        sprite->y2 -= 8;\n        (*offsetY) -= 8;\n        if (*offsetY <= -88)\n        {\n            (*movingState)++;\n            return FALSE;\n        }\n        break;\n    case 3:\n        return FALSE;\n    }\n    return TRUE;\n}\n\n#undef tState\n#undef tSpinDelay\n#undef tNumTurns\n#undef tTimer\n#undef tOffscreen\n#undef tMovingState\n#undef tOffsetY\n#undef tDirection\n\n// Task data for Task_EscapeRopeWarpIn\n#define tState         data[0]\n#define tMovingState   data[1]\n#define tOffsetY       data[2]\n#define tPriority      data[3]\n#define tSubpriority   data[4]\n#define tSubspriteMode data[5]\n#define tTimer         data[6]\n#define tSpinEnded     data[7]\n#define tCurrentDir    data[8]\n#define tSpinDelay     data[9]\n#define tNumTurns      data[10]\n#define tOriginalDir   data[15]\n\nstatic void (*const sEscapeRopeWarpInEffectFuncs[])(struct Task *task) =\n{\n    EscapeRopeWarpInEffect_Init,\n    EscapeRopeWarpInEffect_Spin\n};\n\nstatic bool32 WarpInObjectEventDownwards(struct ObjectEvent *playerObj, s16 *movingState, s16 *offsetY, s16 *priority, s16 *subpriority, s16 *subspriteMode)\n{\n    struct Sprite *sprite = &gSprites[playerObj->spriteId];\n    switch (*movingState)\n    {\n    case 0:\n        CameraObjectReset2();\n        *offsetY = -88;\n        sprite->y2 -= 88;\n        *priority = sprite->oam.priority;\n        *subpriority = sprite->subpriority;\n        *subspriteMode = sprite->subspriteMode;\n        playerObj->fixedPriority = TRUE;\n        sprite->oam.priority = 1;\n        sprite->subpriority = 0;\n        sprite->subspriteMode = SUBSPRITES_OFF;\n        (*movingState)++;\n        // fallthrough\n    case 1:\n        sprite->y2 += 4;\n        (*offsetY) += 4;\n        if (*offsetY >= -16)\n        {\n            sprite->oam.priority = *priority;\n            sprite->subpriority = *subpriority;\n            sprite->subspriteMode = *subspriteMode;\n            (*movingState)++;\n        }\n        break;\n    case 2:\n        sprite->y2 += 4;\n        (*offsetY) += 4;\n        if (*offsetY >= 0)\n        {\n            PlaySE(SE_CLICK);\n            CameraObjectReset1();\n            (*movingState)++;\n            return FALSE;\n        }\n        break;\n    case 3:\n        return FALSE;\n    }\n    return TRUE;\n}\n\nstatic void FieldCallback_EscapeRopeExit(void)\n{\n    Overworld_PlaySpecialMapMusic();\n    WarpFadeInScreen();\n    QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode();\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    gFieldCallback = NULL;\n    gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE;\n    CreateTask(Task_EscapeRopeWarpIn, 0);\n}\n\nstatic void Task_EscapeRopeWarpIn(u8 taskId)\n{\n    sEscapeRopeWarpInEffectFuncs[gTasks[taskId].tState](&gTasks[taskId]);\n}\n\nstatic void EscapeRopeWarpInEffect_Init(struct Task *task)\n{\n    if (IsWeatherNotFadingIn())\n    {\n        PlaySE(SE_WARP_OUT);\n        task->tOriginalDir = GetPlayerFacingDirection();\n        task->tState++;\n    }\n}\n\nstatic void EscapeRopeWarpInEffect_Spin(struct Task *task)\n{\n    s16 *data = task->data;\n    struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];\n    bool32 moving = WarpInObjectEventDownwards(playerObj, &tMovingState, &tOffsetY, &tPriority, &tSubpriority, &tSubspriteMode);\n    playerObj->invisible = FALSE;\n    if (tTimer < 8)\n        tTimer++;\n    else if (tSpinEnded == FALSE)\n    {\n        tTimer++;\n        tCurrentDir = SpinObjectEvent(playerObj, &tSpinDelay, &tNumTurns);\n        if (tTimer >= 50 && tCurrentDir == tOriginalDir)\n            tSpinEnded = TRUE;\n    }\n    if (!moving && tCurrentDir == tOriginalDir && ObjectEventCheckHeldMovementStatus(playerObj) == TRUE)\n    {\n        playerObj->invisible = FALSE;\n        playerObj->fixedPriority = FALSE;\n        UnlockPlayerFieldControls();\n        UnfreezeObjectEvents();\n        DestroyTask(FindTaskIdByFunc(Task_EscapeRopeWarpIn));\n    }\n}\n\n#undef tState\n#undef tMovingState\n#undef tOffsetY\n#undef tPriority\n#undef tSubpriority\n#undef tSubspriteMode\n#undef tTimer\n#undef tSpinEnded\n#undef tCurrentDir\n#undef tSpinDelay\n#undef tNumTurns\n#undef tOriginalDir\n\nstatic void Task_DoTeleportFieldEffect(u8 taskId);\nstatic void TeleportFieldEffectTask1(struct Task *task);\nstatic void TeleportFieldEffectTask2(struct Task *task);\nstatic void TeleportFieldEffectTask3(struct Task *task);\nstatic void TeleportFieldEffectTask4(struct Task *task);\nstatic void FieldCallback_TeleportIn(void);\nstatic void Task_DoTeleportInFieldEffect(u8 taskId);\nstatic void TeleportInFieldEffectTask1(struct Task *task);\nstatic void TeleportInFieldEffectTask2(struct Task *task);\nstatic void TeleportInFieldEffectTask3(struct Task *task);\n\nstatic void (*const sTeleportEffectFuncs[])(struct Task *) = {\n    TeleportFieldEffectTask1,\n    TeleportFieldEffectTask2,\n    TeleportFieldEffectTask3,\n    TeleportFieldEffectTask4\n};\n\nvoid CreateTeleportFieldEffectTask(void)\n{\n    CreateTask(Task_DoTeleportFieldEffect, 0);\n}\n\nstatic void Task_DoTeleportFieldEffect(u8 taskId)\n{\n    sTeleportEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);\n}\n\nstatic void TeleportFieldEffectTask1(struct Task *task)\n{\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    CameraObjectReset2();\n    task->data[15] = GetPlayerFacingDirection();\n    task->data[0]++;\n}\n\nstatic void TeleportFieldEffectTask2(struct Task *task)\n{\n    u8 spinDirections[5] = {\n        [DIR_NONE]  = DIR_SOUTH,\n        [DIR_SOUTH] = DIR_WEST,\n        [DIR_WEST]  = DIR_NORTH,\n        [DIR_NORTH] = DIR_EAST,\n        [DIR_EAST]  = DIR_SOUTH\n    };\n    struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (task->data[1] == 0 || (--task->data[1]) == 0)\n    {\n        ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]);\n        task->data[1] = 8;\n        task->data[2]++;\n    }\n    if (task->data[2] > 7 && task->data[15] == objectEvent->facingDirection)\n    {\n        task->data[0]++;\n        task->data[1] = 4;\n        task->data[2] = 8;\n        task->data[3] = 1;\n        PlaySE(SE_WARP_IN);\n    }\n}\n\nstatic void TeleportFieldEffectTask3(struct Task *task)\n{\n    u8 spinDirections[5] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};\n    struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId];\n    if ((--task->data[1]) <= 0)\n    {\n        task->data[1] = 4;\n        ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]);\n    }\n    sprite->y -= task->data[3];\n    task->data[4] += task->data[3];\n    if ((--task->data[2]) <= 0 && (task->data[2] = 4, task->data[3] < 8))\n    {\n        task->data[3] <<= 1;\n    }\n    if (task->data[4] > 8 && (sprite->oam.priority = 1, sprite->subspriteMode != SUBSPRITES_OFF))\n    {\n        sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;\n    }\n    if (task->data[4] >= 0xa8)\n    {\n        task->data[0]++;\n        TryFadeOutOldMapMusic();\n        WarpFadeOutScreen();\n    }\n}\n\nstatic void TeleportFieldEffectTask4(struct Task *task)\n{\n    if (!gPaletteFade.active)\n    {\n        if (BGMusicStopped() == TRUE)\n        {\n            SetWarpDestinationToLastHealLocation();\n            WarpIntoMap();\n            SetMainCallback2(CB2_LoadMap);\n            gFieldCallback = FieldCallback_TeleportIn;\n            DestroyTask(FindTaskIdByFunc(Task_DoTeleportFieldEffect));\n        }\n    }\n}\n\nstatic void (*const sTeleportInEffectFuncs[])(struct Task *) = {\n    TeleportInFieldEffectTask1,\n    TeleportInFieldEffectTask2,\n    TeleportInFieldEffectTask3\n};\n\nstatic void FieldCallback_TeleportIn(void)\n{\n    Overworld_PlaySpecialMapMusic();\n    WarpFadeInScreen();\n    QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode();\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    gFieldCallback = NULL;\n    gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE;\n    CameraObjectReset2();\n    CreateTask(Task_DoTeleportInFieldEffect, 0);\n}\n\nstatic void Task_DoTeleportInFieldEffect(u8 taskId)\n{\n    sTeleportInEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);\n}\n\nstatic void TeleportInFieldEffectTask1(struct Task *task)\n{\n    struct Sprite *sprite;\n    s16 centerToCornerVecY;\n    if (IsWeatherNotFadingIn())\n    {\n        sprite = &gSprites[gPlayerAvatar.spriteId];\n        centerToCornerVecY = -(sprite->centerToCornerVecY << 1);\n        sprite->y2 = -(sprite->y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY);\n        gObjectEvents[gPlayerAvatar.objectEventId].invisible = FALSE;\n        task->data[0]++;\n        task->data[1] = 8;\n        task->data[2] = 1;\n        task->data[14] = sprite->subspriteMode;\n        task->data[15] = GetPlayerFacingDirection();\n        PlaySE(SE_WARP_IN);\n    }\n}\n\nstatic void TeleportInFieldEffectTask2(struct Task *task)\n{\n    u8 spinDirections[5] = {1, 3, 4, 2, 1};\n    struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId];\n    if ((sprite->y2 += task->data[1]) >= -8)\n    {\n        if (task->data[13] == 0)\n        {\n            task->data[13]++;\n            objectEvent->triggerGroundEffectsOnMove = TRUE;\n            sprite->subspriteMode = task->data[14];\n        }\n    } else\n    {\n        sprite->oam.priority = 1;\n        if (sprite->subspriteMode != SUBSPRITES_OFF)\n        {\n            sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;\n        }\n    }\n    if (sprite->y2 >= -0x30 && task->data[1] > 1 && !(sprite->y2 & 1))\n    {\n        task->data[1]--;\n    }\n    if ((--task->data[2]) == 0)\n    {\n        task->data[2] = 4;\n        ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]);\n    }\n    if (sprite->y2 >= 0)\n    {\n        sprite->y2 = 0;\n        task->data[0]++;\n        task->data[1] = 1;\n        task->data[2] = 0;\n    }\n}\n\nstatic void TeleportInFieldEffectTask3(struct Task *task)\n{\n    u8 spinDirections[5] = {1, 3, 4, 2, 1};\n    struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if ((--task->data[1]) == 0)\n    {\n        ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]);\n        task->data[1] = 8;\n        if ((++task->data[2]) > 4 && task->data[14] == objectEvent->facingDirection)\n        {\n            UnlockPlayerFieldControls();\n            CameraObjectReset1();\n            UnfreezeObjectEvents();\n            DestroyTask(FindTaskIdByFunc(Task_DoTeleportInFieldEffect));\n        }\n    }\n}\n\nstatic void Task_ShowMon_Outdoors(u8 taskId);\nstatic void ShowMonEffect_Outdoors_1(struct Task *task);\nstatic void ShowMonEffect_Outdoors_2(struct Task *task);\nstatic void ShowMonEffect_Outdoors_3(struct Task *task);\nstatic void ShowMonEffect_Outdoors_4(struct Task *task);\nstatic void ShowMonEffect_Outdoors_5(struct Task *task);\nstatic void ShowMonEffect_Outdoors_6(struct Task *task);\nstatic void ShowMonEffect_Outdoors_7(struct Task *task);\nstatic void VBlankCB_ShowMonEffect_Outdoors(void);\nstatic void LoadFieldMoveStreaksTilemapToVram(u16 screenbase);\nstatic void Task_ShowMon_Indoors(u8 taskId);\nstatic void ShowMonEffect_Indoors_1(struct Task *task);\nstatic void ShowMonEffect_Indoors_2(struct Task *task);\nstatic void ShowMonEffect_Indoors_3(struct Task *task);\nstatic void ShowMonEffect_Indoors_4(struct Task *task);\nstatic void ShowMonEffect_Indoors_5(struct Task *task);\nstatic void ShowMonEffect_Indoors_6(struct Task *task);\nstatic void ShowMonEffect_Indoors_7(struct Task *task);\nstatic void VBlankCB_ShowMonEffect_Indoors(void);\nstatic void AnimateIndoorShowMonBg(struct Task *task);\nstatic bool8 SlideIndoorBannerOnscreen(struct Task *task);\nstatic bool8 SlideIndoorBannerOffscreen(struct Task *task);\nstatic u8 InitFieldMoveMonSprite(u32 species, u32 otId, u32 personality);\nstatic void SpriteCB_FieldMoveMonSlideOnscreen(struct Sprite *sprite);\nstatic void SpriteCB_FieldMoveMonWaitAfterCry(struct Sprite *sprite);\nstatic void SpriteCB_FieldMoveMonSlideOffscreen(struct Sprite *sprite);\n\nstatic void (*const sShowMonOutdoorsEffectFuncs[])(struct Task *task) = {\n    ShowMonEffect_Outdoors_1,\n    ShowMonEffect_Outdoors_2,\n    ShowMonEffect_Outdoors_3,\n    ShowMonEffect_Outdoors_4,\n    ShowMonEffect_Outdoors_5,\n    ShowMonEffect_Outdoors_6,\n    ShowMonEffect_Outdoors_7\n};\n\nu32 FldEff_FieldMoveShowMon(void)\n{\n    u8 taskId;\n    if (IsMapTypeOutdoors(GetCurrentMapType()) == TRUE)\n        taskId = CreateTask(Task_ShowMon_Outdoors, 0xFF);\n    else\n        taskId = CreateTask(Task_ShowMon_Indoors, 0xFF);\n    gTasks[taskId].data[15] = InitFieldMoveMonSprite(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    return 0;\n}\n\nu32 FldEff_FieldMoveShowMonInit(void)\n{\n    u32 r6 = gFieldEffectArguments[0] & 0x80000000;\n    u8 partyIdx = gFieldEffectArguments[0];\n    gFieldEffectArguments[0] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES);\n    if(gFieldEffectArguments[0] == SPECIES_DEOXYS)\n    {\n        switch(GetMonData(&gPlayerParty[partyIdx], MON_DATA_FORME))\n        {\n            case 1: //Attack Forme\n                gFieldEffectArguments[0] = 65531;\n                break;\n            case 2: //Defense Forme\n                gFieldEffectArguments[0] = 65532;\n                break;\n            case 3: //Speed Forme\n                gFieldEffectArguments[0] = 65533;\n                break;\n            default: //Normal Forme\n                gFieldEffectArguments[0] = 65530;\n                break;\n        }\n    }\n    gFieldEffectArguments[1] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_OT_ID);\n    gFieldEffectArguments[2] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_PERSONALITY);\n    gFieldEffectArguments[0] |= r6;\n    FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON);\n    FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);\n    return 0;\n}\n\nstatic void Task_ShowMon_Outdoors(u8 taskId)\n{\n    sShowMonOutdoorsEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);\n}\n\nstatic void ShowMonEffect_Outdoors_1(struct Task *task)\n{\n    task->data[11] = GetGpuReg(REG_OFFSET_WININ);\n    task->data[12] = GetGpuReg(REG_OFFSET_WINOUT);\n    StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback);\n    task->data[1] = WIN_RANGE(0xF0, 0xF1);\n    task->data[2] = WIN_RANGE(0x50, 0x51);\n    task->data[3] = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;\n    task->data[4] = WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR;\n    SetGpuReg(REG_OFFSET_WIN0H, task->data[1]);\n    SetGpuReg(REG_OFFSET_WIN0V, task->data[2]);\n    SetGpuReg(REG_OFFSET_WININ, task->data[3]);\n    SetGpuReg(REG_OFFSET_WINOUT, task->data[4]);\n    SetVBlankCallback(VBlankCB_ShowMonEffect_Outdoors);\n    task->data[0]++;\n}\n\nstatic void ShowMonEffect_Outdoors_2(struct Task *task)\n{\n    u16 charbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 2) << 14);\n    u16 screenbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11);\n    CpuCopy16(sFieldMoveStreaksOutdoors_Gfx, (void *)(VRAM + charbase), 0x200);\n    CpuFill32(0, (void *)(VRAM + screenbase), 0x800);\n    LoadPalette(sFieldMoveStreaksOutdoors_Pal, BG_PLTT_ID(15), sizeof(sFieldMoveStreaksOutdoors_Pal));\n    LoadFieldMoveStreaksTilemapToVram(screenbase);\n    task->data[0]++;\n}\n\nstatic void ShowMonEffect_Outdoors_3(struct Task *task)\n{\n    s16 win0h_lo;\n    s16 win0v_lo;\n    s16 win0v_hi;\n    task->data[5] -= 16;\n    win0h_lo = ((u16)task->data[1] >> 8);\n    win0v_lo = ((u16)task->data[2] >> 8);\n    win0v_hi = ((u16)task->data[2] & 0xff);\n    win0h_lo -= 16;\n    win0v_lo -= 2;\n    win0v_hi += 2;\n    if (win0h_lo < 0)\n    {\n        win0h_lo = 0;\n    }\n    if (win0v_lo < 0x28)\n    {\n        win0v_lo = 0x28;\n    }\n    if (win0v_hi > 0x78)\n    {\n        win0v_hi = 0x78;\n    }\n    task->data[1] = WIN_RANGE(win0h_lo, task->data[1] & 0xff);\n    task->data[2] = WIN_RANGE(win0v_lo, win0v_hi);\n    if (win0h_lo == 0 && win0v_lo == 0x28 && win0v_hi == 0x78)\n    {\n        gSprites[task->data[15]].callback = SpriteCB_FieldMoveMonSlideOnscreen;\n        task->data[0]++;\n    }\n}\n\nstatic void ShowMonEffect_Outdoors_4(struct Task *task)\n{\n    task->data[5] -= 16;\n    if (gSprites[task->data[15]].data[7])\n    {\n        task->data[0]++;\n    }\n}\n\nstatic void ShowMonEffect_Outdoors_5(struct Task *task)\n{\n    s16 win0v_lo;\n    s16 win0v_hi;\n    task->data[5] -= 16;\n    win0v_lo = (task->data[2] >> 8);\n    win0v_hi = (task->data[2] & 0xff);\n    win0v_lo += 6;\n    win0v_hi -= 6;\n    if (win0v_lo > 0x50)\n    {\n        win0v_lo = 0x50;\n    }\n    if (win0v_hi < 0x51)\n    {\n        win0v_hi = 0x51;\n    }\n    task->data[2] = WIN_RANGE(win0v_lo, win0v_hi);\n    if (win0v_lo == 0x50 && win0v_hi == 0x51)\n    {\n        task->data[0]++;\n    }\n}\n\nstatic void ShowMonEffect_Outdoors_6(struct Task *task)\n{\n    u16 bg0cnt = (GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11;\n    CpuFill32(0, (void *)VRAM + bg0cnt, 0x800);\n    task->data[1] = WIN_RANGE(0x00, 0xf1);\n    task->data[2] = WIN_RANGE(0x00, 0xa1);\n    task->data[3] = task->data[11];\n    task->data[4] = task->data[12];\n    task->data[0]++;\n}\n\nstatic void ShowMonEffect_Outdoors_7(struct Task *task)\n{\n    IntrCallback callback;\n    LoadWordFromTwoHalfwords((u16 *)&task->data[13], (uintptr_t *)&callback);\n    SetVBlankCallback(callback);\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    Menu_LoadStdPal();\n    FreeResourcesAndDestroySprite(&gSprites[task->data[15]], task->data[15]);\n    FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON);\n    DestroyTask(FindTaskIdByFunc(Task_ShowMon_Outdoors));\n}\n\nstatic void VBlankCB_ShowMonEffect_Outdoors(void)\n{\n    IntrCallback callback;\n    struct Task *task = &gTasks[FindTaskIdByFunc(Task_ShowMon_Outdoors)];\n    LoadWordFromTwoHalfwords((u16 *)&task->data[13], (uintptr_t *)&callback);\n    callback();\n    SetGpuReg(REG_OFFSET_WIN0H, task->data[1]);\n    SetGpuReg(REG_OFFSET_WIN0V, task->data[2]);\n    SetGpuReg(REG_OFFSET_WININ, task->data[3]);\n    SetGpuReg(REG_OFFSET_WINOUT, task->data[4]);\n    SetGpuReg(REG_OFFSET_BG0HOFS, task->data[5]);\n    SetGpuReg(REG_OFFSET_BG0VOFS, task->data[6]);\n}\n\nstatic void LoadFieldMoveStreaksTilemapToVram(u16 screenbase)\n{\n    u32 i;\n    u16 *dest;\n    dest = (u16 *)(VRAM + (10 * 32) + screenbase);\n    for (i = 0; i < (10 * 32); i++, dest++)\n        *dest = sFieldMoveStreaksOutdoors_Tilemap[i] | 0xF000;\n}\n\nstatic void (*const sShowMonIndoorsEffectFuncs[])(struct Task *) = {\n    ShowMonEffect_Indoors_1,\n    ShowMonEffect_Indoors_2,\n    ShowMonEffect_Indoors_3,\n    ShowMonEffect_Indoors_4,\n    ShowMonEffect_Indoors_5,\n    ShowMonEffect_Indoors_6,\n    ShowMonEffect_Indoors_7\n};\n\nstatic void Task_ShowMon_Indoors(u8 taskId)\n{\n    sShowMonIndoorsEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);\n}\n\nstatic void ShowMonEffect_Indoors_1(struct Task *task)\n{\n    SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]);\n    SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]);\n    StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback);\n    SetVBlankCallback(VBlankCB_ShowMonEffect_Indoors);\n    task->data[0]++;\n}\n\nstatic void ShowMonEffect_Indoors_2(struct Task *task)\n{\n    u16 charbase;\n    u16 screenbase;\n    charbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 2) << 14);\n    screenbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11);\n    task->data[12] = screenbase;\n    CpuCopy16(sFieldMoveStreaksIndoors_Gfx, (void *)(VRAM + charbase), 0x80);\n    CpuFill32(0, (void *)(VRAM + screenbase), 0x800);\n    LoadPalette(sFieldMoveStreaksIndoors_Pal, BG_PLTT_ID(15), sizeof(sFieldMoveStreaksIndoors_Pal));\n    task->data[0]++;\n}\n\nstatic void ShowMonEffect_Indoors_3(struct Task *task)\n{\n    if (SlideIndoorBannerOnscreen(task))\n    {\n        task->data[5] = GetGpuReg(REG_OFFSET_WININ);\n        SetGpuReg(REG_OFFSET_WININ, (task->data[5] & 0xFF) | WININ_WIN1_BG0 | WININ_WIN1_OBJ);\n        SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0x00, 0xf0));\n        SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0x28, 0x78));\n        gSprites[task->data[15]].callback = SpriteCB_FieldMoveMonSlideOnscreen;\n        task->data[0]++;\n    }\n    AnimateIndoorShowMonBg(task);\n}\n\nstatic void ShowMonEffect_Indoors_4(struct Task *task)\n{\n    AnimateIndoorShowMonBg(task);\n    if (gSprites[task->data[15]].data[7])\n    {\n        task->data[0]++;\n    }\n}\n\nstatic void ShowMonEffect_Indoors_5(struct Task *task)\n{\n    AnimateIndoorShowMonBg(task);\n    task->data[3] = task->data[1] & 7;\n    task->data[4] = 0;\n    SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0xff, 0xff));\n    SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0xff, 0xff));\n    SetGpuReg(REG_OFFSET_WININ, task->data[5]);\n    task->data[0]++;\n}\n\nstatic void ShowMonEffect_Indoors_6(struct Task *task)\n{\n    AnimateIndoorShowMonBg(task);\n    if (SlideIndoorBannerOffscreen(task))\n    {\n        task->data[0]++;\n    }\n}\n\nstatic void ShowMonEffect_Indoors_7(struct Task *task)\n{\n    IntrCallback intrCallback;\n    u16 charbase;\n    charbase = (GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11;\n    CpuFill32(0, (void *)VRAM + charbase, 0x800);\n    LoadWordFromTwoHalfwords((u16 *)&task->data[13], (uintptr_t *)&intrCallback);\n    SetVBlankCallback(intrCallback);\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    Menu_LoadStdPal();\n    FreeResourcesAndDestroySprite(&gSprites[task->data[15]], task->data[15]);\n    FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON);\n    DestroyTask(FindTaskIdByFunc(Task_ShowMon_Indoors));\n}\n\nstatic void VBlankCB_ShowMonEffect_Indoors(void)\n{\n    IntrCallback intrCallback;\n    struct Task *task;\n    task = &gTasks[FindTaskIdByFunc(Task_ShowMon_Indoors)];\n    LoadWordFromTwoHalfwords((u16 *)&task->data[13], (uintptr_t *)&intrCallback);\n    intrCallback();\n    SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]);\n    SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]);\n}\n\nstatic void AnimateIndoorShowMonBg(struct Task *task)\n{\n    task->data[1] -= 16;\n    task->data[3] += 16;\n}\n\nstatic bool8 SlideIndoorBannerOnscreen(struct Task *task)\n{\n    u32 i;\n    u16 srcOffs;\n    u16 dstOffs;\n    u16 *dest;\n    if (task->data[4] >= 32)\n    {\n        return TRUE;\n    }\n    dstOffs = (task->data[3] >> 3) & 0x1f;\n    if (dstOffs >= task->data[4])\n    {\n        dstOffs = (32 - dstOffs) & 0x1f;\n        srcOffs = (32 - task->data[4]) & 0x1f;\n        dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]);\n        for (i = 0; i < 10; i++)\n        {\n            dest[dstOffs + i * 32] = sFieldMoveStreaksIndoors_Tilemap[srcOffs + i * 32];\n            dest[dstOffs + i * 32] |= 0xf000;\n\n            dest[((dstOffs + 1) & 0x1f) + i * 32] = sFieldMoveStreaksIndoors_Tilemap[((srcOffs + 1) & 0x1f) + i * 32] | 0xf000;\n            dest[((dstOffs + 1) & 0x1f) + i * 32] |= 0xf000;\n        }\n        task->data[4] += 2;\n    }\n    return FALSE;\n}\n\nstatic bool8 SlideIndoorBannerOffscreen(struct Task *task)\n{\n    u32 i;\n    u16 dstOffs;\n    u16 *dest;\n    if (task->data[4] >= 32)\n    {\n        return TRUE;\n    }\n    dstOffs = task->data[3] >> 3;\n    if (dstOffs >= task->data[4])\n    {\n        dstOffs = (task->data[1] >> 3) & 0x1f;\n        dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]);\n        for (i = 0; i < 10; i++)\n        {\n            dest[dstOffs + i * 32] = 0xf000;\n            dest[((dstOffs + 1) & 0x1f) + i * 32] = 0xf000;\n        }\n        task->data[4] += 2;\n    }\n    return FALSE;\n}\n\nstatic u8 InitFieldMoveMonSprite(u32 species, u32 otId, u32 personality)\n{\n    bool16 playCry;\n    u8 monSprite;\n    struct Sprite *sprite;\n    u32 speciesForCry = species;\n\n    if(species >= 65530 && species <= 65533)\n        speciesForCry = SPECIES_DEOXYS;\n\n    playCry = (speciesForCry & 0x80000000) >> 16;\n    species &= 0x7fffffff;\n    monSprite = CreateMonSprite_FieldMove(species, otId, personality, 0x140, 0x50, 0);\n    sprite = &gSprites[monSprite];\n    sprite->callback = SpriteCallbackDummy;\n    sprite->oam.priority = 0;\n    sprite->data[0] = speciesForCry;\n    sprite->data[6] = playCry;\n    return monSprite;\n}\n\nstatic void SpriteCB_FieldMoveMonSlideOnscreen(struct Sprite *sprite)\n{\n    if ((sprite->x -= 20) <= 0x78)\n    {\n        sprite->x = 0x78;\n        sprite->data[1] = 30;\n        sprite->callback = SpriteCB_FieldMoveMonWaitAfterCry;\n        if (sprite->data[6])\n        {\n            PlayCry_NormalNoDucking(sprite->data[0], 0, CRY_VOLUME_RS, CRY_PRIORITY_NORMAL);\n        }\n        else\n        {\n            PlayCry_Normal(sprite->data[0], 0);\n        }\n    }\n}\n\nstatic void SpriteCB_FieldMoveMonWaitAfterCry(struct Sprite *sprite)\n{\n    if ((--sprite->data[1]) == 0)\n    {\n        sprite->callback = SpriteCB_FieldMoveMonSlideOffscreen;\n    }\n}\n\nstatic void SpriteCB_FieldMoveMonSlideOffscreen(struct Sprite *sprite)\n{\n    if (sprite->x < -0x40)\n    {\n        sprite->data[7] = 1;\n    }\n    else\n    {\n        sprite->x -= 20;\n    }\n}\n\nstatic void Task_FldEffUseSurf(u8 taskId);\nstatic void UseSurfEffect_1(struct Task *task);\nstatic void UseSurfEffect_2(struct Task *task);\nstatic void UseSurfEffect_3(struct Task *task);\nstatic void UseSurfEffect_4(struct Task *task);\nstatic void UseSurfEffect_5(struct Task *task);\n\nstatic void (*const sUseSurfEffectFuncs[])(struct Task *) = {\n    UseSurfEffect_1,\n    UseSurfEffect_2,\n    UseSurfEffect_3,\n    UseSurfEffect_4,\n    UseSurfEffect_5,\n};\n\nu8 FldEff_UseSurf(void)\n{\n    u8 taskId = CreateTask(Task_FldEffUseSurf, 0xff);\n    gTasks[taskId].data[15] = gFieldEffectArguments[0];\n    Overworld_ClearSavedMusic();\n    if (Overworld_MusicCanOverrideMapMusic(MUS_SURF))\n        Overworld_ChangeMusicTo(MUS_SURF);\n    return FALSE;\n}\n\nstatic void Task_FldEffUseSurf(u8 taskId)\n{\n    sUseSurfEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);\n}\n\nstatic void UseSurfEffect_1(struct Task *task)\n{\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    gPlayerAvatar.preventStep = TRUE;\n    SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING);\n    PlayerGetDestCoords(&task->data[1], &task->data[2]);\n    MoveCoords(gObjectEvents[gPlayerAvatar.objectEventId].movementDirection, &task->data[1], &task->data[2]);\n    task->data[0]++;\n}\n\nstatic void UseSurfEffect_2(struct Task *task)\n{\n    struct ObjectEvent * objectEvent;\n    objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        StartPlayerAvatarSummonMonForFieldMoveAnim();\n        ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);\n        task->data[0]++;\n    }\n}\n\nstatic void UseSurfEffect_3(struct Task *task)\n{\n    struct ObjectEvent * objectEvent;\n    objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (ObjectEventCheckHeldMovementStatus(objectEvent))\n    {\n        gFieldEffectArguments[0] = task->data[15] | 0x80000000;\n        FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);\n        task->data[0]++;\n    }\n}\n\nstatic void UseSurfEffect_4(struct Task *task)\n{\n    struct ObjectEvent * objectEvent;\n    if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))\n    {\n        objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n        ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE));\n        ObjectEventClearHeldMovementIfFinished(objectEvent);\n        ObjectEventSetHeldMovement(objectEvent, GetJumpSpecialMovementAction(objectEvent->movementDirection));\n        gFieldEffectArguments[0] = task->data[1];\n        gFieldEffectArguments[1] = task->data[2];\n        gFieldEffectArguments[2] = gPlayerAvatar.objectEventId;\n        objectEvent->fieldEffectSpriteId = FieldEffectStart(FLDEFF_SURF_BLOB);\n        task->data[0]++;\n    }\n}\n\nstatic void UseSurfEffect_5(struct Task *task)\n{\n    struct ObjectEvent * objectEvent;\n    objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        gPlayerAvatar.preventStep = FALSE;\n        gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_CONTROLLABLE;\n        ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->movementDirection));\n        SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_PLAYER_AND_MON);\n        UnfreezeObjectEvents();\n        UnlockPlayerFieldControls();\n        FieldEffectActiveListRemove(FLDEFF_USE_SURF);\n        DestroyTask(FindTaskIdByFunc(Task_FldEffUseSurf));\n        SetHelpContext(HELPCONTEXT_SURFING);\n    }\n}\n\nstatic void Task_FldEffUseVsSeeker(u8 taskId);\nstatic void UseVsSeekerEffect_1(struct Task *task);\nstatic void UseVsSeekerEffect_2(struct Task *task);\nstatic void UseVsSeekerEffect_3(struct Task *task);\nstatic void UseVsSeekerEffect_4(struct Task *task);\n\nstatic void (*const sUseVsSeekerEffectFuncs[])(struct Task *task) = {\n    UseVsSeekerEffect_1,\n    UseVsSeekerEffect_2,\n    UseVsSeekerEffect_3,\n    UseVsSeekerEffect_4\n};\n\nu32 FldEff_UseVsSeeker(void)\n{\n    if (gQuestLogState == QL_STATE_RECORDING)\n        QuestLogRecordPlayerAvatarGfxTransitionWithDuration(8, 89);\n    CreateTask(Task_FldEffUseVsSeeker, 0xFF);\n    return 0;\n}\n\nstatic void Task_FldEffUseVsSeeker(u8 taskId)\n{\n    sUseVsSeekerEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);\n}\n\nstatic void UseVsSeekerEffect_1(struct Task *task)\n{\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    gPlayerAvatar.preventStep = TRUE;\n    task->data[0]++;\n}\n\nstatic void UseVsSeekerEffect_2(struct Task *task)\n{\n    struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj))\n    {\n        StartPlayerAvatarVsSeekerAnim();\n        ObjectEventSetHeldMovement(playerObj, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);\n        task->data[0]++;\n    }\n}\n\nstatic void UseVsSeekerEffect_3(struct Task *task)\n{\n    struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (ObjectEventClearHeldMovementIfFinished(playerObj))\n    {\n        if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE))\n            ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_BIKE));\n        else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)\n            ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE));\n        else\n            ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL));\n        ObjectEventForceSetHeldMovement(playerObj, GetFaceDirectionMovementAction(playerObj->facingDirection));\n        task->data[0]++;\n    }\n}\n\nstatic void UseVsSeekerEffect_4(struct Task *task)\n{\n    struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (ObjectEventClearHeldMovementIfFinished(playerObj))\n    {\n        gPlayerAvatar.preventStep = FALSE;\n        FieldEffectActiveListRemove(FLDEFF_USE_VS_SEEKER);\n        DestroyTask(FindTaskIdByFunc(Task_FldEffUseVsSeeker));\n    }\n}\n\nstatic void SpriteCB_NPCFlyOut(struct Sprite *sprite);\n\nu8 FldEff_NpcFlyOut(void)\n{\n    u8 spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BIRD], 0x78, 0, 1);\n    struct Sprite *sprite = &gSprites[spriteId];\n\n    sprite->oam.paletteNum = 0;\n    sprite->oam.priority = 1;\n    sprite->callback = SpriteCB_NPCFlyOut;\n    sprite->data[1] = gFieldEffectArguments[0];\n    PlaySE(SE_M_FLY);\n    return spriteId;\n}\n\nstatic void SpriteCB_NPCFlyOut(struct Sprite *sprite)\n{\n    struct Sprite *npcSprite;\n\n    sprite->x2 = Cos(sprite->data[2], 0x8c);\n    sprite->y2 = Sin(sprite->data[2], 0x48);\n    sprite->data[2] = (sprite->data[2] + 4) & 0xff;\n    if (sprite->data[0])\n    {\n        npcSprite = &gSprites[sprite->data[1]];\n        npcSprite->coordOffsetEnabled = FALSE;\n        npcSprite->x = sprite->x + sprite->x2;\n        npcSprite->y = sprite->y + sprite->y2 - 8;\n        npcSprite->x2 = 0;\n        npcSprite->y2 = 0;\n    }\n    if (sprite->data[2] >= 0x80)\n    {\n        FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT);\n    }\n}\n\n// Task data for Task_FlyOut / Task_FlyIn\n#define tState        data[0]\n#define tMonPartyId   data[1]\n#define tBirdSpriteId data[1] // re-used\n#define tTimer        data[2]\n#define tAvatarFlags  data[15]\n\nstatic void Task_FlyOut(u8 taskId);\nstatic void FlyOutFieldEffect_FieldMovePose(struct Task *task);\nstatic void FlyOutFieldEffect_ShowMon(struct Task *task);\nstatic void FlyOutFieldEffect_BirdLeaveBall(struct Task *task);\nstatic void FlyOutFieldEffect_WaitBirdLeave(struct Task *task);\nstatic void FlyOutFieldEffect_BirdSwoopDown(struct Task *task);\nstatic void FlyOutFieldEffect_JumpOnBird(struct Task *task);\nstatic void FlyOutFieldEffect_FlyOffWithBird(struct Task *task);\nstatic void FlyOutFieldEffect_WaitFlyOff(struct Task *task);\nstatic void FlyOutFieldEffect_End(struct Task *task);\nstatic u8 CreateFlyBirdSprite(void);\nstatic bool8 GetFlyBirdAnimCompleted(u8 flyBlobSpriteId);\nstatic void StartFlyBirdSwoopDown(u8 flyBlobSpriteId);\nstatic void SetFlyBirdPlayerSpriteId(u8 flyBlobSpriteId, u8 playerSpriteId);\nstatic void SpriteCB_FlyBirdLeaveBall(struct Sprite *sprite);\nstatic void SpriteCB_FlyBirdSwoopDown(struct Sprite *sprite);\nstatic void DoBirdSpriteWithPlayerAffineAnim(struct Sprite *sprite, u8 affineAnimId);\nstatic void SpriteCB_FlyBirdWithPlayer(struct Sprite *sprite);\n\nstatic void (*const sFlyOutFieldEffectFuncs[])(struct Task *) =\n{\n    FlyOutFieldEffect_FieldMovePose,\n    FlyOutFieldEffect_ShowMon,\n    FlyOutFieldEffect_BirdLeaveBall,\n    FlyOutFieldEffect_WaitBirdLeave,\n    FlyOutFieldEffect_BirdSwoopDown,\n    FlyOutFieldEffect_JumpOnBird,\n    FlyOutFieldEffect_FlyOffWithBird,\n    FlyOutFieldEffect_WaitFlyOff,\n    FlyOutFieldEffect_End\n};\n\nu8 FldEff_FlyOut(void)\n{\n    u8 taskId = CreateTask(Task_FlyOut, 0xFE);\n    gTasks[taskId].tMonPartyId = gFieldEffectArguments[0];\n    return 0;\n}\n\nstatic void Task_FlyOut(u8 taskId)\n{\n    sFlyOutFieldEffectFuncs[gTasks[taskId].tState](&gTasks[taskId]);\n}\n\nstatic void FlyOutFieldEffect_FieldMovePose(struct Task *task)\n{\n    struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        task->tAvatarFlags = gPlayerAvatar.flags;\n        gPlayerAvatar.preventStep = TRUE;\n        SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT);\n        StartPlayerAvatarSummonMonForFieldMoveAnim();\n        ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);\n        task->tState++;\n    }\n}\n\nstatic void FlyOutFieldEffect_ShowMon(struct Task *task)\n{\n    struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        task->tState++;\n        gFieldEffectArguments[0] = task->tMonPartyId;\n        FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);\n    }\n}\n\nstatic void FlyOutFieldEffect_BirdLeaveBall(struct Task *task)\n{\n    if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))\n    {\n        struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n        if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING)\n        {\n            SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_MON_ONLY);\n            SetSurfBlob_DontSyncAnim(objectEvent->fieldEffectSpriteId, FALSE);\n        }\n        task->tBirdSpriteId = CreateFlyBirdSprite();\n        task->tState++;\n    }\n}\n\nstatic void FlyOutFieldEffect_WaitBirdLeave(struct Task *task)\n{\n    if (GetFlyBirdAnimCompleted(task->tBirdSpriteId))\n    {\n        task->tState++;\n        task->tTimer = 16;\n        SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);\n        ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], MOVEMENT_ACTION_FACE_LEFT);\n    }\n}\n\nstatic void FlyOutFieldEffect_BirdSwoopDown(struct Task *task)\n{\n    struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if ((task->tTimer == 0 || (--task->tTimer) == 0) && ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        task->tState++;\n        PlaySE(SE_M_FLY);\n        StartFlyBirdSwoopDown(task->tBirdSpriteId);\n    }\n}\n\nstatic void FlyOutFieldEffect_JumpOnBird(struct Task *task)\n{\n    if ((++task->tTimer) >= 8)\n    {\n        struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n        ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE));\n        StartSpriteAnim(&gSprites[objectEvent->spriteId], ANIM_GET_ON_OFF_POKEMON_WEST);\n        objectEvent->inanimate = TRUE;\n        ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT);\n        task->tState++;\n        task->tTimer = 0;\n    }\n}\n\nstatic void FlyOutFieldEffect_FlyOffWithBird(struct Task *task)\n{\n    if ((++task->tTimer) >= 10)\n    {\n        struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n        ObjectEventClearHeldMovementIfActive(objectEvent);\n        objectEvent->inanimate = FALSE;\n        objectEvent->hasShadow = FALSE;\n        SetFlyBirdPlayerSpriteId(task->tBirdSpriteId, objectEvent->spriteId);\n        StartSpriteAnim(&gSprites[task->tBirdSpriteId], gSaveBlock2Ptr->playerGender * 2 + 1);\n        DoBirdSpriteWithPlayerAffineAnim(&gSprites[task->tBirdSpriteId], 0);\n        gSprites[task->tBirdSpriteId].callback = SpriteCB_FlyBirdWithPlayer;\n        CameraObjectReset2();\n        task->tState++;\n    }\n}\n\nstatic void FlyOutFieldEffect_WaitFlyOff(struct Task *task)\n{\n    if (GetFlyBirdAnimCompleted(task->tBirdSpriteId))\n    {\n        WarpFadeOutScreen();\n        task->tState++;\n    }\n}\n\nstatic void FlyOutFieldEffect_End(struct Task *task)\n{\n    if (!gPaletteFade.active)\n    {\n        FieldEffectActiveListRemove(FLDEFF_FLY_OUT);\n        DestroyTask(FindTaskIdByFunc(Task_FlyOut));\n    }\n}\n\nstatic u8 CreateFlyBirdSprite(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n    spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BIRD], 255, 180, 1);\n    sprite = &gSprites[spriteId];\n    sprite->oam.paletteNum = 0;\n    sprite->oam.priority = 1;\n    sprite->callback = SpriteCB_FlyBirdLeaveBall;\n    return spriteId;\n}\n\n// Sprite data for the bird sprite\n#define sInitData       data[0]\n#define sPlayerSpriteId data[6]\n#define sAnimCompleted  data[7]\n\nstatic bool8 GetFlyBirdAnimCompleted(u8 spriteId)\n{\n    return gSprites[spriteId].sAnimCompleted;\n}\n\nstatic void StartFlyBirdSwoopDown(u8 spriteId)\n{\n    struct Sprite *sprite;\n    sprite = &gSprites[spriteId];\n    sprite->callback = SpriteCB_FlyBirdSwoopDown;\n    sprite->x = 120;\n    sprite->y = 0;\n    sprite->x2 = 0;\n    sprite->y2 = 0;\n    memset(&sprite->data[0], 0, 8 * sizeof(u16) /* zero all data cells */);\n    sprite->data[6] = MAX_SPRITES;\n}\n\nstatic void SetFlyBirdPlayerSpriteId(u8 flyBlobSpriteId, u8 playerSpriteId)\n{\n    gSprites[flyBlobSpriteId].sPlayerSpriteId = playerSpriteId;\n}\n\nstatic const union AffineAnimCmd sAffineAnim_FlyBirdLeaveBall[] =\n{\n    AFFINEANIMCMD_FRAME( 8,  8, -30,  0),\n    AFFINEANIMCMD_FRAME(28, 28,   0, 30),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlyBirdReturnToBall[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, 64,  0),\n    AFFINEANIMCMD_FRAME(-10, -10,  0, 22),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_FlyBirdBall[] =\n{\n    sAffineAnim_FlyBirdLeaveBall,\n    sAffineAnim_FlyBirdReturnToBall\n};\n\nstatic void SpriteCB_FlyBirdLeaveBall(struct Sprite *sprite)\n{\n    if (sprite->sAnimCompleted == FALSE)\n    {\n        if (sprite->sInitData == FALSE)\n        {\n            sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;\n            sprite->affineAnims = sAffineAnims_FlyBirdBall;\n            InitSpriteAffineAnim(sprite);\n            StartSpriteAffineAnim(sprite, 0);\n            if (gSaveBlock2Ptr->playerGender == MALE)\n                sprite->x = 128;\n            else\n                sprite->x = 118;\n            sprite->y = -48;\n            sprite->sInitData++;\n            sprite->data[1] = 64;\n            sprite->data[2] = 256;\n        }\n        sprite->data[1] += (sprite->data[2] >> 8);\n        sprite->x2 = Cos(sprite->data[1], 120);\n        sprite->y2 = Sin(sprite->data[1], 120);\n        if (sprite->data[2] < 2048)\n            sprite->data[2] += 96;\n        if (sprite->data[1] > 129)\n        {\n            sprite->sAnimCompleted++;\n            sprite->oam.affineMode = ST_OAM_AFFINE_OFF;\n            FreeOamMatrix(sprite->oam.matrixNum);\n            CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF);\n        }\n    }\n}\n\nstatic void SpriteCB_FlyBirdSwoopDown(struct Sprite *sprite)\n{\n    sprite->x2 = Cos(sprite->data[2], 140);\n    sprite->y2 = Sin(sprite->data[2], 72);\n    sprite->data[2] = (sprite->data[2] + 4) & 0xFF;\n    if (sprite->sPlayerSpriteId != MAX_SPRITES)\n    {\n        struct Sprite *playerSprite = &gSprites[sprite->sPlayerSpriteId];\n        playerSprite->coordOffsetEnabled = FALSE;\n        playerSprite->x = sprite->x + sprite->x2;\n        playerSprite->y = sprite->y + sprite->y2 - 8;\n        playerSprite->x2 = 0;\n        playerSprite->y2 = 0;\n    }\n    if (sprite->data[2] >= 128)\n        sprite->sAnimCompleted = TRUE;\n}\n\nstatic void SpriteCB_FlyBirdReturnToBall(struct Sprite *sprite)\n{\n    if (sprite->sAnimCompleted == FALSE)\n    {\n        if (sprite->sInitData == FALSE)\n        {\n            sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;\n            sprite->affineAnims = sAffineAnims_FlyBirdBall;\n            InitSpriteAffineAnim(sprite);\n            StartSpriteAffineAnim(sprite, 1);\n            if (gSaveBlock2Ptr->playerGender == MALE)\n                sprite->x = 112;\n            else\n                sprite->x = 100;\n            sprite->y = -32;\n            sprite->sInitData++;\n            sprite->data[1] = 240;\n            sprite->data[2] = 2048;\n            sprite->data[4] = 128;\n        }\n        sprite->data[1] += sprite->data[2] >> 8;\n        sprite->data[3] += sprite->data[2] >> 8;\n        sprite->data[1] &= 0xFF;\n        sprite->x2 = Cos(sprite->data[1], 32);\n        sprite->y2 = Sin(sprite->data[1], 120);\n        if (sprite->data[2] > 256)\n            sprite->data[2] -= sprite->data[4];\n        if (sprite->data[4] < 256)\n            sprite->data[4] += 24;\n        if (sprite->data[2] < 256)\n            sprite->data[2] = 256;\n        if (sprite->data[3] >= 60)\n        {\n            sprite->sAnimCompleted++;\n            sprite->oam.affineMode = ST_OAM_AFFINE_OFF;\n            FreeOamMatrix(sprite->oam.matrixNum);\n            sprite->invisible = TRUE;\n        }\n    }\n}\n\nstatic void StartFlyBirdReturnToBall(u8 spriteId)\n{\n    StartFlyBirdSwoopDown(spriteId);\n    gSprites[spriteId].callback = SpriteCB_FlyBirdReturnToBall;\n}\n\nstatic void Task_FlyIn(u8 taskId);\nstatic void FlyInFieldEffect_BirdSwoopDown(struct Task *task);\nstatic void FlyInFieldEffect_FlyInWithBird(struct Task *task);\nstatic void FlyInFieldEffect_JumpOffBird(struct Task *task);\nstatic void FlyInFieldEffect_FieldMovePose(struct Task *task);\nstatic void FlyInFieldEffect_BirdReturnToBall(struct Task *task);\nstatic void FlyInFieldEffect_WaitBirdReturn(struct Task *task);\nstatic void FlyInFieldEffect_End(struct Task *task);\nstatic void TryChangeBirdSprite(struct Sprite *sprite);\n\nstatic void (*const sFlyInFieldEffectFuncs[])(struct Task *task) =\n{\n    FlyInFieldEffect_BirdSwoopDown,\n    FlyInFieldEffect_FlyInWithBird,\n    FlyInFieldEffect_JumpOffBird,\n    FlyInFieldEffect_FieldMovePose,\n    FlyInFieldEffect_BirdReturnToBall,\n    FlyInFieldEffect_WaitBirdReturn,\n    FlyInFieldEffect_End\n};\n\nu32 FldEff_FlyIn(void)\n{\n    CreateTask(Task_FlyIn, 0xFE);\n    return 0;\n}\n\nstatic void Task_FlyIn(u8 taskId)\n{\n    sFlyInFieldEffectFuncs[gTasks[taskId].tState](&gTasks[taskId]);\n}\n\nstatic void FlyInFieldEffect_BirdSwoopDown(struct Task *task)\n{\n    struct ObjectEvent *playerObj;\n    playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj))\n    {\n        task->tState++;\n        task->tTimer = 33;\n        task->tAvatarFlags = gPlayerAvatar.flags;\n        gPlayerAvatar.preventStep = TRUE;\n        SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT);\n        if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING)\n            SetSurfBlob_BobState(playerObj->fieldEffectSpriteId, BOB_NONE);\n        ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE));\n        CameraObjectReset2();\n        ObjectEventTurn(playerObj, DIR_WEST);\n        StartSpriteAnim(&gSprites[playerObj->spriteId], ANIM_GET_ON_OFF_POKEMON_WEST);\n        playerObj->invisible = FALSE;\n        task->tBirdSpriteId = CreateFlyBirdSprite();\n        StartFlyBirdSwoopDown(task->tBirdSpriteId);\n        SetFlyBirdPlayerSpriteId(task->tBirdSpriteId, playerObj->spriteId);\n        StartSpriteAnim(&gSprites[task->tBirdSpriteId], gSaveBlock2Ptr->playerGender * 2 + 2);\n        DoBirdSpriteWithPlayerAffineAnim(&gSprites[task->tBirdSpriteId], 1);\n        gSprites[task->tBirdSpriteId].callback = SpriteCB_FlyBirdWithPlayer;\n    }\n}\n\nstatic void FlyInFieldEffect_FlyInWithBird(struct Task *task)\n{\n    struct ObjectEvent *playerObj;\n    struct Sprite *playerSprite;\n    TryChangeBirdSprite(&gSprites[task->tBirdSpriteId]);\n    if (task->tTimer == 0 || (--task->tTimer) == 0)\n    {\n        playerObj= &gObjectEvents[gPlayerAvatar.objectEventId];\n        playerSprite = &gSprites[playerObj->spriteId];\n        SetFlyBirdPlayerSpriteId(task->tBirdSpriteId, MAX_SPRITES);\n        playerSprite->x += playerSprite->x2;\n        playerSprite->y += playerSprite->y2;\n        playerSprite->x2 = 0;\n        playerSprite->y2 = 0;\n        task->tState++;\n        task->tTimer = 0;\n    }\n}\n\nstatic void FlyInFieldEffect_JumpOffBird(struct Task *task)\n{\n    s16 yOffsets[18] = {-2, -4, -5, -6, -7, -8, -8, -8, -7, -7, -6, -5, -3, -2, 0, 2, 4, 8};\n    struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId];\n    sprite->y2 = yOffsets[task->tTimer];\n    if ((++task->tTimer) >= 18)\n        task->tState++;\n}\n\nstatic void FlyInFieldEffect_FieldMovePose(struct Task *task)\n{\n    struct ObjectEvent *playerObj;\n    struct Sprite *playerSprite;\n    if (GetFlyBirdAnimCompleted(task->tBirdSpriteId))\n    {\n        playerObj= &gObjectEvents[gPlayerAvatar.objectEventId];\n        playerSprite = &gSprites[playerObj->spriteId];\n        playerObj->inanimate = FALSE;\n        MoveObjectEventToMapCoords(playerObj, playerObj->currentCoords.x, playerObj->currentCoords.y);\n        playerSprite->x2 = 0;\n        playerSprite->y2 = 0;\n        playerSprite->coordOffsetEnabled = TRUE;\n        StartPlayerAvatarSummonMonForFieldMoveAnim();\n        ObjectEventSetHeldMovement(playerObj, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);\n        task->tState++;\n    }\n}\n\nstatic void FlyInFieldEffect_BirdReturnToBall(struct Task *task)\n{\n    if (ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gPlayerAvatar.objectEventId]))\n    {\n        task->tState++;\n        StartFlyBirdReturnToBall(task->tBirdSpriteId);\n    }\n}\n\nstatic void FlyInFieldEffect_WaitBirdReturn(struct Task *task)\n{\n    if (GetFlyBirdAnimCompleted(task->tBirdSpriteId))\n    {\n        DestroySprite(&gSprites[task->tBirdSpriteId]);\n        task->tState++;\n        task->data[1] = 16;\n    }\n}\n\nstatic void FlyInFieldEffect_End(struct Task *task)\n{\n    struct ObjectEvent *playerObj;\n    u8 state;\n    if ((--task->data[1]) == 0)\n    {\n        playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];\n        state = PLAYER_AVATAR_GFX_NORMAL;\n        if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING)\n        {\n            state = PLAYER_AVATAR_GFX_RIDE;\n            SetSurfBlob_BobState(playerObj->fieldEffectSpriteId, BOB_PLAYER_AND_MON);\n        }\n        ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(state));\n        ObjectEventTurn(playerObj, DIR_SOUTH);\n        gPlayerAvatar.flags = task->tAvatarFlags;\n        gPlayerAvatar.preventStep = FALSE;\n        FieldEffectActiveListRemove(FLDEFF_FLY_IN);\n        DestroyTask(FindTaskIdByFunc(Task_FlyIn));\n    }\n}\n\n#undef tState\n#undef tMonPartyId\n#undef tBirdSpriteId\n#undef tTimer\n#undef tAvatarFlags\n\nstatic const union AffineAnimCmd sAffineAnim_FlyBirdOutOfMap[] =\n{\n    AFFINEANIMCMD_FRAME(24, 24, 0, 1),\n    AFFINEANIMCMD_JUMP(0)\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FlyBirdIntoMap[] =\n{\n    AFFINEANIMCMD_FRAME(512, 512, 0, 1),\n    AFFINEANIMCMD_FRAME(-16, -16, 0, 1),\n    AFFINEANIMCMD_JUMP(1)\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_FlyBirdWithPlayer[] =\n{\n    sAffineAnim_FlyBirdOutOfMap,\n    sAffineAnim_FlyBirdIntoMap\n};\n\nstatic void DoBirdSpriteWithPlayerAffineAnim(struct Sprite *sprite, u8 affineAnimId)\n{\n    sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;\n    sprite->affineAnims = sAffineAnims_FlyBirdWithPlayer;\n    InitSpriteAffineAnim(sprite);\n    StartSpriteAffineAnim(sprite, affineAnimId);\n}\n\nstatic void SpriteCB_FlyBirdWithPlayer(struct Sprite *sprite)\n{\n    sprite->x2 = Cos(sprite->data[2], 180);\n    sprite->y2 = Sin(sprite->data[2], 72);\n    sprite->data[2] = (sprite->data[2] + 2) & 0xFF;\n    if (sprite->sPlayerSpriteId != MAX_SPRITES)\n    {\n        struct Sprite *playerSprite;\n        playerSprite = &gSprites[sprite->sPlayerSpriteId];\n        playerSprite->coordOffsetEnabled = FALSE;\n        playerSprite->x = sprite->x + sprite->x2;\n        playerSprite->y = sprite->y + sprite->y2 - 8;\n        playerSprite->x2 = 0;\n        playerSprite->y2 = 0;\n    }\n    if (sprite->data[2] >= 128)\n    {\n        sprite->sAnimCompleted = TRUE;\n        sprite->oam.affineMode = ST_OAM_AFFINE_OFF;\n        FreeOamMatrix(sprite->oam.matrixNum);\n        CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF);\n    }\n}\n\n#undef sInitData\n#undef sPlayerSpriteId\n#undef sAnimCompleted\n\nstatic void TryChangeBirdSprite(struct Sprite *sprite)\n{\n    if (sprite->oam.affineMode != ST_OAM_AFFINE_OFF)\n    {\n        if (gOamMatrices[sprite->oam.matrixNum].a == 0x100 || gOamMatrices[sprite->oam.matrixNum].d == 0x100)\n        {\n            sprite->oam.affineMode = ST_OAM_AFFINE_OFF;\n            FreeOamMatrix(sprite->oam.matrixNum);\n            CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF);\n            StartSpriteAnim(sprite, 0);\n            sprite->callback = SpriteCB_FlyBirdSwoopDown;\n        }\n    }\n}\n\nstatic void Task_MoveDeoxysRock_Step(u8 taskId);\n\nu32 FldEff_MoveDeoxysRock(void)\n{\n    u8 taskId;\n    u8 objectEventIdBuffer;\n    s32 x;\n    s32 y;\n    struct ObjectEvent * objectEvent;\n    if (!TryGetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &objectEventIdBuffer))\n    {\n        objectEvent = &gObjectEvents[objectEventIdBuffer];\n        x = objectEvent->currentCoords.x - 7;\n        y = objectEvent->currentCoords.y - 7;\n        x = (gFieldEffectArguments[3] - x) * 16;\n        y = (gFieldEffectArguments[4] - y) * 16;\n        ShiftObjectEventCoords(objectEvent, gFieldEffectArguments[3] + 7, gFieldEffectArguments[4] + 7);\n        taskId = CreateTask(Task_MoveDeoxysRock_Step, 0x50);\n        gTasks[taskId].data[1] = objectEvent->spriteId;\n        gTasks[taskId].data[2] = gSprites[objectEvent->spriteId].x + x;\n        gTasks[taskId].data[3] = gSprites[objectEvent->spriteId].y + y;\n        gTasks[taskId].data[8] = gFieldEffectArguments[5];\n        gTasks[taskId].data[9] = objectEventIdBuffer;\n    }\n    return FALSE;\n}\n\nstatic void Task_MoveDeoxysRock_Step(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    struct Sprite *sprite = &gSprites[data[1]];\n    struct ObjectEvent * objectEvent;\n    switch (data[0])\n    {\n    case 0:\n        data[4] = sprite->x << 4;\n        data[5] = sprite->y << 4;\n\n        // UB: Possible divide by zero\n        data[6] = SAFE_DIV(((data[2] << 4) - data[4]), data[8]);\n        data[7] = SAFE_DIV(((data[3] << 4) - data[5]), data[8]);\n        data[0]++;\n        // fallthrough\n    case 1:\n        if (data[8] != 0)\n        {\n            data[8]--;\n            data[4] += data[6];\n            data[5] += data[7];\n            sprite->x = data[4] >> 4;\n            sprite->y = data[5] >> 4;\n        }\n        else\n        {\n            objectEvent = &gObjectEvents[data[9]];\n            sprite->x = data[2];\n            sprite->y = data[3];\n            ShiftStillObjectEventCoords(objectEvent);\n            objectEvent->triggerGroundEffectsOnStop = TRUE;\n            FieldEffectActiveListRemove(FLDEFF_MOVE_DEOXYS_ROCK);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void Task_DestroyDeoxysRock(u8 taskId);\nstatic void DestroyDeoxysRockEffect_CameraShake(s16 *data, u8 taskId);\nstatic void DestroyDeoxysRockEffect_RockFragments(s16 *data, u8 taskId);\nstatic void DestroyDeoxysRockEffect_WaitAndEnd(s16 *data, u8 taskId);\nstatic void CreateDeoxysRockFragments(struct Sprite *sprite);\nstatic void SpriteCB_DeoxysRockFragment(struct Sprite *sprite);\n\nstatic void (*const sDestroyDeoxysRockEffectFuncs[])(s16 *data, u8 taskId) =\n{\n    DestroyDeoxysRockEffect_CameraShake,\n    DestroyDeoxysRockEffect_RockFragments,\n    DestroyDeoxysRockEffect_WaitAndEnd\n};\n\nstatic const struct SpriteFrameImage sImages_DeoxysRockFragment[] =\n{\n    {sRockFragment_TopLeft, 0x20},\n    {sRockFragment_TopRight, 0x20},\n    {sRockFragment_BottomLeft, 0x20},\n    {sRockFragment_BottomRight, 0x20}\n};\n\nstatic const union AnimCmd sAnim_RockFragment_TopLeft[] =\n{\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_RockFragment_TopRight[] =\n{\n    ANIMCMD_FRAME(1, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_RockFragment_BottomLeft[] =\n{\n    ANIMCMD_FRAME(2, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_RockFragment_BottomRight[] =\n{\n    ANIMCMD_FRAME(3, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_DeoxysRockFragment[] =\n{\n    sAnim_RockFragment_TopLeft,\n    sAnim_RockFragment_TopRight,\n    sAnim_RockFragment_BottomLeft,\n    sAnim_RockFragment_BottomRight\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_DeoxysRockFragment =\n{\n    .tileTag = TAG_NONE,\n    .paletteTag = 4371,\n    .oam = &sOamData_8x8,\n    .anims = sAnims_DeoxysRockFragment,\n    .images = sImages_DeoxysRockFragment,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_DeoxysRockFragment\n};\n\n// Task data for Task_DestroyDeoxysRock\n#define tState         data[1]\n#define tObjectEventId data[2]\n#define tTimer         data[3]\n#define tCameraTaskId  data[5]\n#define tLocalId       data[6]\n#define tMapNum        data[7]\n#define tMapGroup      data[8]\n\nu32 FldEff_DestroyDeoxysRock(void)\n{\n    u8 taskId;\n    u8 objectEventId;\n    if (!TryGetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &objectEventId))\n    {\n        taskId = CreateTask(Task_DestroyDeoxysRock, 80);\n        gTasks[taskId].data[2] = objectEventId;\n        gTasks[taskId].tLocalId = gFieldEffectArguments[0];\n        gTasks[taskId].tMapNum = gFieldEffectArguments[1];\n        gTasks[taskId].tMapGroup = gFieldEffectArguments[2];\n    }\n    else\n        FieldEffectActiveListRemove(FLDEFF_DESTROY_DEOXYS_ROCK);\n\n    return FALSE;\n}\n\n// Task data for Task_DeoxysRockCameraShake\n#define tShakeDelay data[0]\n#define tShakeUp    data[1]\n#define tShake      data[5]\n#define tEndDelay   data[6]\n#define tEnding     data[7]\n\nstatic void Task_DeoxysRockCameraShake(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (data[7] != 0)\n    {\n        if (++data[6] > 20)\n        {\n            data[6] = 0;\n            if (data[5] != 0)\n                data[5]--;\n        }\n    }\n    else\n        data[5] = 4;\n\n    if (++data[0] > 1)\n    {\n        data[0] = 0;\n        if (++data[1] & 1)\n            SetCameraPanning(0, -data[5]);\n        else\n            SetCameraPanning(0, data[5]);\n    }\n    UpdateCameraPanning();\n    if (data[5] == 0)\n        DestroyTask(taskId);\n}\n\nstatic void StartEndingDeoxysRockCameraShake(u8 taskId)\n{\n    gTasks[taskId].data[7] = 1;\n}\n\n#undef tShakeDelay\n#undef tShakeUp\n#undef tShake\n#undef tEndDelay\n#undef tEnding\n\nstatic void Task_DestroyDeoxysRock(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    InstallCameraPanAheadCallback();\n    SetCameraPanningCallback(NULL);\n    sDestroyDeoxysRockEffectFuncs[tState](data, taskId);\n}\n\nstatic void DestroyDeoxysRockEffect_CameraShake(s16 *data, u8 taskId)\n{\n    u8 newTaskId = CreateTask(Task_DeoxysRockCameraShake, 90);\n    PlaySE(SE_THUNDER2);\n    tCameraTaskId = newTaskId;\n    tState++;\n}\n\nstatic void DestroyDeoxysRockEffect_RockFragments(s16 *data, u8 taskId)\n{\n    if (++tTimer > 120)\n    {\n        struct Sprite *sprite = &gSprites[gObjectEvents[tObjectEventId].spriteId];\n        gObjectEvents[tObjectEventId].invisible = TRUE;\n        BlendPalettes(PALETTES_BG, 0x10, RGB_WHITE);\n        BeginNormalPaletteFade(PALETTES_BG, 0, 0x10, 0, RGB_WHITE);\n        CreateDeoxysRockFragments(sprite);\n        PlaySE(SE_THUNDER);\n        StartEndingDeoxysRockCameraShake(tCameraTaskId);\n        tTimer = 0;\n        tState++;\n    }\n}\n\nstatic void DestroyDeoxysRockEffect_WaitAndEnd(s16 *data, u8 taskId)\n{\n    if (!gPaletteFade.active && !FuncIsActiveTask(Task_DeoxysRockCameraShake))\n    {\n        InstallCameraPanAheadCallback();\n        RemoveObjectEventByLocalIdAndMap(tLocalId, tMapNum, tMapGroup);\n        FieldEffectActiveListRemove(FLDEFF_DESTROY_DEOXYS_ROCK);\n        DestroyTask(taskId);\n    }\n}\n\n#undef tState\n#undef tObjectEventId\n#undef tTimer\n#undef tCameraTaskId\n#undef tLocalId\n#undef tMapNum\n#undef tMapGroup\n\nstatic void CreateDeoxysRockFragments(struct Sprite *sprite)\n{\n    int i;\n    int xPos = (s16)gTotalCameraPixelOffsetX + sprite->x + sprite->x2;\n    int yPos = (s16)gTotalCameraPixelOffsetY + sprite->y + sprite->y2 - 4;\n\n    for (i = 0; i < 4; i++)\n    {\n        u8 spriteId = CreateSprite(&sSpriteTemplate_DeoxysRockFragment, xPos, yPos, 0);\n        if (spriteId != MAX_SPRITES)\n        {\n            StartSpriteAnim(&gSprites[spriteId], i);\n            gSprites[spriteId].data[0] = i;\n            gSprites[spriteId].oam.paletteNum = sprite->oam.paletteNum;\n        }\n    }\n}\n\nstatic void SpriteCB_DeoxysRockFragment(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->x -= 16;\n        sprite->y -= 12;\n        break;\n    case 1:\n        sprite->x += 16;\n        sprite->y -= 12;\n        break;\n    case 2:\n        sprite->x -= 16;\n        sprite->y += 12;\n        break;\n    case 3:\n        sprite->x += 16;\n        sprite->y += 12;\n        break;\n    }\n    if (sprite->x < -4 || sprite->x > DISPLAY_WIDTH + 4 || sprite->y < -4 || sprite->y > DISPLAY_HEIGHT + 4)\n        DestroySprite(sprite);\n}\n\nstatic void Task_PhotoFlash(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        FieldEffectActiveListRemove(FLDEFF_PHOTO_FLASH);\n        DestroyTask(taskId);\n    }\n}\n\n// Bug: Return value should be u32, not void\nvoid FldEff_PhotoFlash(void)\n{\n    BlendPalettes(PALETTES_ALL, 0x10, RGB_WHITE);\n    BeginNormalPaletteFade(PALETTES_ALL, -1, 0x0F, 0x00, RGB_WHITE);\n    CreateTask(Task_PhotoFlash, 90);\n}\n"
  },
  {
    "path": "src/field_effect_helpers.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"event_object_movement.h\"\n#include \"field_camera.h\"\n#include \"field_effect.h\"\n#include \"field_effect_helpers.h\"\n#include \"field_weather.h\"\n#include \"fieldmap.h\"\n#include \"metatile_behavior.h\"\n#include \"overworld.h\"\n#include \"constants/field_effects.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/songs.h\"\n\n#define OBJ_EVENT_PAL_TAG_NONE 0x11FF // duplicate of define in event_object_movement.c\n\nstatic void UpdateObjectReflectionSprite(struct Sprite *sprite);\nstatic void LoadObjectReflectionPalette(struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent * objectEvent, u8 paletteNum);\nstatic void LoadObjectRegularReflectionPalette(struct ObjectEvent * objectEvent, u8 paletteNum);\nstatic void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 z, u8 offset);\nstatic void FadeFootprintsTireTracks_Step0(struct Sprite *sprite);\nstatic void FadeFootprintsTireTracks_Step1(struct Sprite *sprite);\nstatic void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *sprite);\nstatic void UpdateAshFieldEffect_Step0(struct Sprite *sprite);\nstatic void UpdateAshFieldEffect_Step1(struct Sprite *sprite);\nstatic void UpdateAshFieldEffect_Step2(struct Sprite *sprite);\nstatic void SynchroniseSurfAnim(struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic void SynchroniseSurfPosition(struct ObjectEvent * objectEvent, struct Sprite *sprite);\nstatic void CreateBobbingEffect(struct ObjectEvent * objectEvent, struct Sprite *linkedSprite, struct Sprite *sprite);\nstatic void SpriteCB_UnderwaterSurfBlob(struct Sprite *sprite);\nstatic u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum);\n\nvoid SetUpReflection(struct ObjectEvent * objectEvent, struct Sprite *sprite, bool8 stillReflection)\n{\n    struct Sprite *reflectionSprite;\n\n    reflectionSprite = &gSprites[CreateCopySpriteAt(sprite, sprite->x, sprite->y, 0x98)];\n    reflectionSprite->callback = UpdateObjectReflectionSprite;\n    reflectionSprite->oam.priority = 3;\n    reflectionSprite->oam.paletteNum = gReflectionEffectPaletteMap[reflectionSprite->oam.paletteNum];\n    reflectionSprite->usingSheet = TRUE;\n    reflectionSprite->anims = gDummySpriteAnimTable;\n    StartSpriteAnim(reflectionSprite, 0);\n    reflectionSprite->affineAnims = gDummySpriteAffineAnimTable;\n    reflectionSprite->affineAnimBeginning = TRUE;\n    reflectionSprite->subspriteMode = SUBSPRITES_OFF;\n    reflectionSprite->data[0] = sprite->data[0];\n    reflectionSprite->data[1] = objectEvent->localId;\n    reflectionSprite->data[7] = stillReflection;\n    LoadObjectReflectionPalette(objectEvent, reflectionSprite);\n\n    if (!stillReflection)\n        reflectionSprite->oam.affineMode = ST_OAM_AFFINE_NORMAL;\n}\n\nstatic s16 GetReflectionVerticalOffset(struct ObjectEvent * objectEvent)\n{\n    return GetObjectEventGraphicsInfo(objectEvent->graphicsId)->height - 2;\n}\n\nstatic void LoadObjectReflectionPalette(struct ObjectEvent * objectEvent, struct Sprite *sprite)\n{\n    u8 bridgeType;\n    u16 bridgeReflectionVerticalOffsets[] = { 12, 28, 44 };\n    sprite->data[2] = 0;\n    if (!GetObjectEventGraphicsInfo(objectEvent->graphicsId)->disableReflectionPaletteLoad && ((bridgeType = MetatileBehavior_GetBridgeType(objectEvent->previousMetatileBehavior)) || (bridgeType = MetatileBehavior_GetBridgeType(objectEvent->currentMetatileBehavior))))\n    {\n        sprite->data[2] = bridgeReflectionVerticalOffsets[bridgeType - 1];\n        LoadObjectHighBridgeReflectionPalette(objectEvent, sprite->oam.paletteNum);\n    }\n    else\n    {\n        LoadObjectRegularReflectionPalette(objectEvent, sprite->oam.paletteNum);\n    }\n}\n\nstatic void LoadObjectRegularReflectionPalette(struct ObjectEvent * objectEvent, u8 paletteIndex)\n{\n    const struct ObjectEventGraphicsInfo * graphicsInfo;\n\n    graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);\n    if (graphicsInfo->reflectionPaletteTag != OBJ_EVENT_PAL_TAG_NONE)\n    {\n        if (graphicsInfo->paletteSlot == PALSLOT_PLAYER)\n            LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, paletteIndex);\n        else if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL)\n            LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, paletteIndex);\n        else\n            PatchObjectPalette(GetObjectPaletteTag(paletteIndex), paletteIndex);\n        UpdateSpritePaletteWithWeather(paletteIndex);\n    }\n}\n\n// When walking on a bridge high above water (Route 120), the reflection is a solid dark blue color.\n// This is so the sprite blends in with the dark water metatile underneath the bridge.\nstatic void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent * objectEvent, u8 paletteNum)\n{\n    const struct ObjectEventGraphicsInfo * graphicsInfo;\n\n    graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);\n    if (graphicsInfo->reflectionPaletteTag != OBJ_EVENT_PAL_TAG_NONE)\n    {\n        PatchObjectPalette(graphicsInfo->reflectionPaletteTag, paletteNum);\n        UpdateSpritePaletteWithWeather(paletteNum);\n    }\n}\n\nstatic void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite)\n{\n    struct ObjectEvent * objectEvent;\n    struct Sprite *mainSprite;\n\n    objectEvent = &gObjectEvents[reflectionSprite->data[0]];\n    mainSprite = &gSprites[objectEvent->spriteId];\n    if (!objectEvent->active || !objectEvent->hasReflection || objectEvent->localId != reflectionSprite->data[1])\n    {\n        reflectionSprite->inUse = FALSE;\n    }\n    else\n    {\n        reflectionSprite->oam.paletteNum = gReflectionEffectPaletteMap[mainSprite->oam.paletteNum];\n        reflectionSprite->oam.shape = mainSprite->oam.shape;\n        reflectionSprite->oam.size = mainSprite->oam.size;\n        reflectionSprite->oam.matrixNum = mainSprite->oam.matrixNum | ST_OAM_VFLIP;\n        reflectionSprite->oam.tileNum = mainSprite->oam.tileNum;\n        reflectionSprite->subspriteTables = mainSprite->subspriteTables;\n        reflectionSprite->subspriteTableNum = mainSprite->subspriteTableNum;\n        reflectionSprite->invisible = mainSprite->invisible;\n        reflectionSprite->x = mainSprite->x;\n        // reflectionSprite->data[2] holds an additional vertical offset, used by the high bridges on Route 120\n        reflectionSprite->y = mainSprite->y + GetReflectionVerticalOffset(objectEvent) + reflectionSprite->data[2];\n        reflectionSprite->centerToCornerVecX = mainSprite->centerToCornerVecX;\n        reflectionSprite->centerToCornerVecY = mainSprite->centerToCornerVecY;\n        reflectionSprite->x2 = mainSprite->x2;\n        reflectionSprite->y2 = -mainSprite->y2;\n        reflectionSprite->coordOffsetEnabled = mainSprite->coordOffsetEnabled;\n\n/*\n        if (objectEvent->hideReflection == TRUE)\n            reflectionSprite->invisible = TRUE;\n*/\n\n        // Check if the reflection is not still.\n        if (reflectionSprite->data[7] == FALSE)\n        {\n            // Sets the reflection sprite's rot/scale matrix to the appropriate\n            // matrix based on whether or not the main sprite is horizontally flipped.\n            // If the sprite is facing to the east, then it is flipped, and its matrixNum is 8.\n            reflectionSprite->oam.matrixNum = 0;\n            if (mainSprite->oam.matrixNum & ST_OAM_HFLIP)\n                reflectionSprite->oam.matrixNum = 1;\n        }\n    }\n}\n\nextern const struct SpriteTemplate * const gFieldEffectObjectTemplatePointers[];\n\nu8 CreateWarpArrowSprite(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ARROW], 0, 0, 0x52);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->oam.priority = 1;\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->invisible = TRUE;\n    }\n    return spriteId;\n}\n\nvoid SetSpriteInvisible(u8 spriteId)\n{\n    gSprites[spriteId].invisible = TRUE;\n}\n\nvoid ShowWarpArrowSprite(u8 spriteId, u8 direction, s16 x, s16 y)\n{\n    s16 x2;\n    s16 y2;\n    struct Sprite *sprite;\n\n    sprite = &gSprites[spriteId];\n    if (sprite->invisible || sprite->data[0] != x || sprite->data[1] != y)\n    {\n        SetSpritePosToMapCoords(x, y, &x2, &y2);\n        sprite = &gSprites[spriteId];\n        sprite->x = x2 + 8;\n        sprite->y = y2 + 8;\n        sprite->invisible = FALSE;\n        sprite->data[0] = x;\n        sprite->data[1] = y;\n        StartSpriteAnim(sprite, direction - 1);\n    }\n}\n\nconst u8 gShadowEffectTemplateIds[] = {\n    [SHADOW_SIZE_S]  = FLDEFFOBJ_SHADOW_S,\n    [SHADOW_SIZE_M]  = FLDEFFOBJ_SHADOW_M,\n    [SHADOW_SIZE_L]  = FLDEFFOBJ_SHADOW_L,\n    [SHADOW_SIZE_XL] = FLDEFFOBJ_SHADOW_XL\n};\n\nconst u16 gShadowVerticalOffsets[] = {\n    [SHADOW_SIZE_S]  =  4,\n    [SHADOW_SIZE_M]  =  4,\n    [SHADOW_SIZE_L]  =  4,\n    [SHADOW_SIZE_XL] = 16\n};\n\nu32 FldEff_Shadow(void)\n{\n    u8 objectEventId;\n    const struct ObjectEventGraphicsInfo * graphicsInfo;\n    u8 spriteId;\n\n    objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[gShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].coordOffsetEnabled = TRUE;\n        gSprites[spriteId].data[0] = gFieldEffectArguments[0];\n        gSprites[spriteId].data[1] = gFieldEffectArguments[1];\n        gSprites[spriteId].data[2] = gFieldEffectArguments[2];\n        gSprites[spriteId].data[3] = (graphicsInfo->height >> 1) - gShadowVerticalOffsets[graphicsInfo->shadowSize];\n    }\n    return 0;\n}\n\nvoid UpdateShadowFieldEffect(struct Sprite *sprite)\n{\n    u8 objectEventId;\n    struct ObjectEvent * objectEvent;\n    struct Sprite *linkedSprite;\n\n    if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId))\n    {\n        FieldEffectStop(sprite, FLDEFF_SHADOW);\n    }\n    else\n    {\n        objectEvent = &gObjectEvents[objectEventId];\n        linkedSprite = &gSprites[objectEvent->spriteId];\n        sprite->oam.priority = linkedSprite->oam.priority;\n        sprite->x = linkedSprite->x;\n        sprite->y = linkedSprite->y + sprite->data[3];\n        if (!objectEvent->active || !objectEvent->hasShadow\n         || MetatileBehavior_IsPokeGrass(objectEvent->currentMetatileBehavior)\n         || MetatileBehavior_IsSurfable(objectEvent->currentMetatileBehavior)\n         || MetatileBehavior_IsSurfable(objectEvent->previousMetatileBehavior)\n         || MetatileBehavior_IsReflective(objectEvent->currentMetatileBehavior)\n         || MetatileBehavior_IsReflective(objectEvent->previousMetatileBehavior))\n        {\n            FieldEffectStop(sprite, FLDEFF_SHADOW);\n        }\n    }\n}\n\nu32 FldEff_TallGrass(void)\n{\n    s16 x;\n    s16 y;\n    u8 spriteId;\n    struct Sprite *sprite;\n    u8 mapsec = GetCurrentRegionMapSectionId();\n\n    x = gFieldEffectArguments[0];\n    y = gFieldEffectArguments[1];\n    SetSpritePosToOffsetMapCoords(&x, &y, 8, 8);\n    if(mapsec == MAPSEC_TREASURE_BEACH || mapsec == MAPSEC_KINDLE_ROAD || mapsec == MAPSEC_MT_EMBER || mapsec == MAPSEC_THREE_ISLE_PORT || mapsec == MAPSEC_BERRY_FOREST || mapsec == MAPSEC_BOND_BRIDGE)\n        spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[36], x, y, 0);\n    else if(mapsec == MAPSEC_CANYON_ENTRANCE || mapsec == MAPSEC_SEVAULT_CANYON)\n        spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[37], x, y, 0);\n    else\n        spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_TALL_GRASS], x, y, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[0] = gFieldEffectArguments[2];\n        sprite->data[1] = gFieldEffectArguments[0];\n        sprite->data[2] = gFieldEffectArguments[1];\n        sprite->data[3] = gFieldEffectArguments[4];\n        sprite->data[4] = gFieldEffectArguments[5];\n        sprite->data[5] = gFieldEffectArguments[6];\n        if (gFieldEffectArguments[7])\n        {\n            SeekSpriteAnim(sprite, 4);\n        }\n    }\n    return 0;\n}\n\nvoid UpdateTallGrassFieldEffect(struct Sprite *sprite)\n{\n    u8 mapNum;\n    u8 mapGroup;\n    u8 metatileBehavior;\n    u8 localId;\n    u8 objectEventId;\n    struct ObjectEvent * objectEvent;\n\n    mapNum = sprite->data[5] >> 8;\n    mapGroup = sprite->data[5];\n    if (gCamera.active && (gSaveBlock1Ptr->location.mapNum != mapNum || gSaveBlock1Ptr->location.mapGroup != mapGroup))\n    {\n        sprite->data[1] -= gCamera.x;\n        sprite->data[2] -= gCamera.y;\n        sprite->data[5] = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup;\n    }\n    localId = sprite->data[3] >> 8;\n    mapNum = sprite->data[3];\n    mapGroup = sprite->data[4];\n    metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]);\n    if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) || !MetatileBehavior_IsTallGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded))\n    {\n        FieldEffectStop(sprite, FLDEFF_TALL_GRASS);\n    }\n    else\n    {\n        objectEvent = &gObjectEvents[objectEventId];\n        if ((objectEvent->currentCoords.x != sprite->data[1] || objectEvent->currentCoords.y != sprite->data[2]) && (objectEvent->previousCoords.x != sprite->data[1] || objectEvent->previousCoords.y != sprite->data[2]))\n            sprite->data[7] = TRUE;\n\n        // This variable is misused.\n        metatileBehavior = 0;\n        if (sprite->animCmdIndex == 0)\n            metatileBehavior = 4;\n\n        UpdateObjectEventSpriteInvisibility(sprite, FALSE);\n        UpdateGrassFieldEffectSubpriority(sprite, sprite->data[0], metatileBehavior);\n    }\n}\n\nu32 FldEff_JumpTallGrass(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_JUMP_TALL_GRASS], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[0] = gFieldEffectArguments[2];\n        sprite->data[1] = 12;\n    }\n    return 0;\n}\n\nu8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)\n{\n    struct Sprite *sprite;\n    u32 i;\n\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        if (gSprites[i].inUse)\n        {\n            sprite = &gSprites[i];\n            if (sprite->callback == UpdateTallGrassFieldEffect && (x == sprite->data[1] && y == sprite->data[2]) && (localId == (sprite->data[3] >> 8) && mapNum == (sprite->data[3] & 0xFF) && mapGroup == sprite->data[4]))\n                return i;\n        }\n    }\n\n    return MAX_SPRITES;\n}\n\nu32 FldEff_LongGrass(void)\n{\n    s16 x;\n    s16 y;\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    x = gFieldEffectArguments[0];\n    y = gFieldEffectArguments[1];\n    SetSpritePosToOffsetMapCoords(&x, &y, 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_LONG_GRASS], x, y, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = ElevationToPriority(gFieldEffectArguments[2]);\n        sprite->data[0] = gFieldEffectArguments[2];\n        sprite->data[1] = gFieldEffectArguments[0];\n        sprite->data[2] = gFieldEffectArguments[1];\n        sprite->data[3] = gFieldEffectArguments[4];\n        sprite->data[4] = gFieldEffectArguments[5];\n        sprite->data[5] = gFieldEffectArguments[6];\n        if (gFieldEffectArguments[7])\n        {\n            SeekSpriteAnim(sprite, 6);\n        }\n    }\n    return 0;\n}\n\nvoid UpdateLongGrassFieldEffect(struct Sprite *sprite)\n{\n    u8 mapNum;\n    u8 mapGroup;\n    u8 metatileBehavior;\n    u8 localId;\n    u8 objectEventId;\n    struct ObjectEvent * objectEvent;\n\n    mapNum = sprite->data[5] >> 8;\n    mapGroup = sprite->data[5];\n    if (gCamera.active && (gSaveBlock1Ptr->location.mapNum != mapNum || gSaveBlock1Ptr->location.mapGroup != mapGroup))\n    {\n        sprite->data[1] -= gCamera.x;\n        sprite->data[2] -= gCamera.y;\n        sprite->data[5] = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup;\n    }\n    localId = sprite->data[3] >> 8;\n    mapNum = sprite->data[3];\n    mapGroup = sprite->data[4];\n    metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]);\n    if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) || !MetatileBehavior_IsLongGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded))\n    {\n        FieldEffectStop(sprite, FLDEFF_LONG_GRASS);\n    }\n    else\n    {\n        objectEvent = &gObjectEvents[objectEventId];\n        if ((objectEvent->currentCoords.x != sprite->data[1] || objectEvent->currentCoords.y != sprite->data[2]) && (objectEvent->previousCoords.x != sprite->data[1] || objectEvent->previousCoords.y != sprite->data[2]))\n        {\n            sprite->data[7] = TRUE;\n        }\n        UpdateObjectEventSpriteInvisibility(sprite, FALSE);\n        UpdateGrassFieldEffectSubpriority(sprite, sprite->data[0], 0);\n    }\n}\n\nu32 FldEff_JumpLongGrass(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_JUMP_LONG_GRASS], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[0] = gFieldEffectArguments[2];\n        sprite->data[1] = 18;\n    }\n    return 0;\n}\n\nu32 FldEff_ShortGrass(void)\n{\n    u8 objectEventId;\n    struct ObjectEvent * objectEvent;\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    objectEvent = &gObjectEvents[objectEventId];\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SHORT_GRASS], 0, 0, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &(gSprites[spriteId]);\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority;\n        sprite->data[0] = gFieldEffectArguments[0];\n        sprite->data[1] = gFieldEffectArguments[1];\n        sprite->data[2] = gFieldEffectArguments[2];\n        sprite->data[3] = gSprites[objectEvent->spriteId].x;\n        sprite->data[4] = gSprites[objectEvent->spriteId].y;\n    }\n    return 0;\n}\n\nvoid UpdateShortGrassFieldEffect(struct Sprite *sprite)\n{\n    u8 objectEventId;\n    s16 x;\n    s16 y;\n    const struct ObjectEventGraphicsInfo * graphicsInfo;\n    struct Sprite *linkedSprite;\n\n    if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inShortGrass)\n    {\n        FieldEffectStop(sprite, FLDEFF_SHORT_GRASS);\n    }\n    else\n    {\n        graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);\n        linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId];\n        y = linkedSprite->y;\n        x = linkedSprite->x;\n        if (x != sprite->data[3] || y != sprite->data[4])\n        {\n            sprite->data[3] = x;\n            sprite->data[4] = y;\n            if (sprite->animEnded)\n            {\n                StartSpriteAnim(sprite, 0);\n            }\n        }\n        sprite->x = x;\n        sprite->y = y;\n        sprite->y2 = (graphicsInfo->height >> 1) - 8;\n        sprite->subpriority = linkedSprite->subpriority - 1;\n        sprite->oam.priority = linkedSprite->oam.priority;\n        UpdateObjectEventSpriteInvisibility(sprite, linkedSprite->invisible);\n    }\n}\n\nu32 FldEff_SandFootprints(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SAND_FOOTPRINTS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[7] = FLDEFF_SAND_FOOTPRINTS;\n        StartSpriteAnim(sprite, gFieldEffectArguments[4]);\n    }\n    return 0;\n}\n\nu32 FldEff_DeepSandFootprints(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_DEEP_SAND_FOOTPRINTS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[7] = FLDEFF_DEEP_SAND_FOOTPRINTS;\n        StartSpriteAnim(sprite, gFieldEffectArguments[4]);\n    }\n    return spriteId;\n}\n\nu32 FldEff_BikeTireTracks(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BIKE_TIRE_TRACKS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[7] = FLDEFF_BIKE_TIRE_TRACKS;\n        StartSpriteAnim(sprite, gFieldEffectArguments[4]);\n    }\n    return spriteId;\n}\n\nvoid (*const gFadeFootprintsTireTracksFuncs[])(struct Sprite *sprite) = {\n    FadeFootprintsTireTracks_Step0,\n    FadeFootprintsTireTracks_Step1\n};\n\nvoid UpdateFootprintsTireTracksFieldEffect(struct Sprite *sprite)\n{\n    gFadeFootprintsTireTracksFuncs[sprite->data[0]](sprite);\n}\n\nstatic void FadeFootprintsTireTracks_Step0(struct Sprite *sprite)\n{\n    // Wait 40 frames before the flickering starts.\n    if (++sprite->data[1] > 40)\n        sprite->data[0] = 1;\n\n    UpdateObjectEventSpriteInvisibility(sprite, FALSE);\n}\n\nstatic void FadeFootprintsTireTracks_Step1(struct Sprite *sprite)\n{\n    sprite->invisible ^= 1;\n    sprite->data[1]++;\n    UpdateObjectEventSpriteInvisibility(sprite, sprite->invisible);\n    if (sprite->data[1] > 56)\n    {\n        FieldEffectStop(sprite, sprite->data[7]);\n    }\n}\n\nu32 FldEff_Splash(void)\n{\n    u8 objectEventId;\n    struct ObjectEvent * objectEvent;\n    u8 spriteId;\n    struct Sprite *sprite;\n    const struct ObjectEventGraphicsInfo * graphicsInfo;\n    struct Sprite *linkedSprite;\n\n    objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    objectEvent = &gObjectEvents[objectEventId];\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPLASH], 0, 0, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        linkedSprite = &gSprites[objectEvent->spriteId];\n        sprite->oam.priority = linkedSprite->oam.priority;\n        sprite->data[0] = gFieldEffectArguments[0];\n        sprite->data[1] = gFieldEffectArguments[1];\n        sprite->data[2] = gFieldEffectArguments[2];\n        sprite->y2 = (graphicsInfo->height >> 1) - 4;\n        PlaySE(SE_PUDDLE);\n    }\n    return 0;\n}\n\nvoid UpdateSplashFieldEffect(struct Sprite *sprite)\n{\n    u8 objectEventId;\n\n    if (sprite->animEnded || TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId))\n    {\n        FieldEffectStop(sprite, FLDEFF_SPLASH);\n    }\n    else\n    {\n        sprite->x = gSprites[gObjectEvents[objectEventId].spriteId].x;\n        sprite->y = gSprites[gObjectEvents[objectEventId].spriteId].y;\n        UpdateObjectEventSpriteInvisibility(sprite, FALSE);\n    }\n}\n\nu32 FldEff_JumpSmallSplash(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_JUMP_SMALL_SPLASH], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[0] = gFieldEffectArguments[2];\n        sprite->data[1] = FLDEFF_JUMP_SMALL_SPLASH;\n    }\n    return 0;\n}\n\nu32 FldEff_JumpBigSplash(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_JUMP_BIG_SPLASH], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[0] = gFieldEffectArguments[2];\n        sprite->data[1] = FLDEFF_JUMP_BIG_SPLASH;\n    }\n    return 0;\n}\n\nu32 FldEff_FeetInFlowingWater(void)\n{\n    u8 objectEventId;\n    struct ObjectEvent * objectEvent;\n    u8 spriteId;\n    struct Sprite *sprite;\n    const struct ObjectEventGraphicsInfo * graphicsInfo;\n\n    objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    objectEvent = &gObjectEvents[objectEventId];\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPLASH], 0, 0, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);\n        sprite = &gSprites[spriteId];\n        sprite->callback = UpdateFeetInFlowingWaterFieldEffect;\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority;\n        sprite->data[0] = gFieldEffectArguments[0];\n        sprite->data[1] = gFieldEffectArguments[1];\n        sprite->data[2] = gFieldEffectArguments[2];\n        sprite->data[3] = -1;\n        sprite->data[4] = -1;\n        sprite->y2 = (graphicsInfo->height >> 1) - 4;\n        StartSpriteAnim(sprite, 1);\n    }\n    return 0;\n}\n\nstatic void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *sprite)\n{\n    u8 objectEventId;\n    struct Sprite *linkedSprite;\n    struct ObjectEvent * objectEvent;\n\n    if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inShallowFlowingWater)\n    {\n        FieldEffectStop(sprite, FLDEFF_FEET_IN_FLOWING_WATER);\n    }\n    else\n    {\n        objectEvent = &gObjectEvents[objectEventId];\n        linkedSprite = &gSprites[objectEvent->spriteId];\n        sprite->x = linkedSprite->x;\n        sprite->y = linkedSprite->y;\n        sprite->subpriority = linkedSprite->subpriority;\n        UpdateObjectEventSpriteInvisibility(sprite, FALSE);\n        if (objectEvent->currentCoords.x != sprite->data[3] || objectEvent->currentCoords.y != sprite->data[4])\n        {\n            sprite->data[3] = objectEvent->currentCoords.x;\n            sprite->data[4] = objectEvent->currentCoords.y;\n            if (!sprite->invisible)\n            {\n                PlaySE(SE_PUDDLE);\n            }\n        }\n    }\n}\n\nu32 FldEff_Ripple(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_RIPPLE], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[0] = FLDEFF_RIPPLE;\n    }\n    return 0;\n}\n\nu32 FldEff_HotSpringsWater(void)\n{\n    u8 objectEventId;\n    struct ObjectEvent * objectEvent;\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    objectEvent = &gObjectEvents[objectEventId];\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_HOT_SPRINGS_WATER], 0, 0, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority;\n        sprite->data[0] = gFieldEffectArguments[0];\n        sprite->data[1] = gFieldEffectArguments[1];\n        sprite->data[2] = gFieldEffectArguments[2];\n        sprite->data[3] = gSprites[objectEvent->spriteId].x;\n        sprite->data[4] = gSprites[objectEvent->spriteId].y;\n    }\n    return 0;\n}\n\nvoid UpdateHotSpringsWaterFieldEffect(struct Sprite *sprite)\n{\n    u8 objectEventId;\n    const struct ObjectEventGraphicsInfo * graphicsInfo;\n    struct Sprite *linkedSprite;\n\n    if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inHotSprings)\n    {\n        FieldEffectStop(sprite, FLDEFF_HOT_SPRINGS_WATER);\n    }\n    else\n    {\n        graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);\n        linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId];\n        sprite->x = linkedSprite->x;\n        sprite->y = (graphicsInfo->height >> 1) + linkedSprite->y - 8;\n        sprite->subpriority = linkedSprite->subpriority - 1;\n        UpdateObjectEventSpriteInvisibility(sprite, FALSE);\n    }\n}\n\nu32 FldEff_UnusedGrass(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_UNUSED_GRASS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[0] = FLDEFF_UNUSED_GRASS;\n    }\n    return 0;\n}\n\nu32 FldEff_UnusedGrass2(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_UNUSED_GRASS_2], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[0] = FLDEFF_UNUSED_GRASS_2;\n    }\n    return 0;\n}\n\nu32 FldEff_UnusedSand(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_UNUSED_SAND], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[0] = FLDEFF_UNUSED_SAND;\n    }\n    return 0;\n}\n\nu32 FldEff_UnusedWaterSurfacing(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_WATER_SURFACING], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[0] = FLDEFF_UNUSED_WATER_SURFACING;\n    }\n    return 0;\n}\n\nvoid StartAshFieldEffect(s16 x, s16 y, u16 metatileId, s16 d)\n{\n    gFieldEffectArguments[0] = x;\n    gFieldEffectArguments[1] = y;\n    gFieldEffectArguments[2] = 0x52;\n    gFieldEffectArguments[3] = 1;\n    gFieldEffectArguments[4] = metatileId;\n    gFieldEffectArguments[5] = d;\n    FieldEffectStart(FLDEFF_ASH);\n}\n\nu32 FldEff_Ash(void)\n{\n    s16 x;\n    s16 y;\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    x = gFieldEffectArguments[0];\n    y = gFieldEffectArguments[1];\n    SetSpritePosToOffsetMapCoords(&x, &y, 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ASH], x, y, gFieldEffectArguments[2]);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[1] = gFieldEffectArguments[0];\n        sprite->data[2] = gFieldEffectArguments[1];\n        sprite->data[3] = gFieldEffectArguments[4];\n        sprite->data[4] = gFieldEffectArguments[5];\n    }\n    return 0;\n}\n\nvoid (*const gAshFieldEffectFuncs[])(struct Sprite *sprite) = {\n    UpdateAshFieldEffect_Step0,\n    UpdateAshFieldEffect_Step1,\n    UpdateAshFieldEffect_Step2\n};\n\nvoid UpdateAshFieldEffect(struct Sprite *sprite)\n{\n    gAshFieldEffectFuncs[sprite->data[0]](sprite);\n}\n\nstatic void UpdateAshFieldEffect_Step0(struct Sprite *sprite)\n{\n    sprite->invisible = TRUE;\n    sprite->animPaused = TRUE;\n    if (--sprite->data[4] == 0)\n        sprite->data[0] = 1;\n}\n\nstatic void UpdateAshFieldEffect_Step1(struct Sprite *sprite)\n{\n    sprite->invisible = FALSE;\n    sprite->animPaused = FALSE;\n    MapGridSetMetatileIdAt(sprite->data[1], sprite->data[2], sprite->data[3]);\n    CurrentMapDrawMetatileAt(sprite->data[1], sprite->data[2]);\n    gObjectEvents[gPlayerAvatar.objectEventId].triggerGroundEffectsOnMove = TRUE;\n    sprite->data[0] = 2;\n}\n\nstatic void UpdateAshFieldEffect_Step2(struct Sprite *sprite)\n{\n    UpdateObjectEventSpriteInvisibility(sprite, FALSE);\n    if (sprite->animEnded)\n        FieldEffectStop(sprite, FLDEFF_ASH);\n}\n\n// Sprite data for surf blob\n#define sBitfield       data[0]\n#define sPlayerOffset   data[1]\n#define sPlayerObjectId data[2]\n#define sBobDirection   data[3]\n#define sTimer          data[4]\n\nu32 FldEff_SurfBlob(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SURF_BLOB], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.paletteNum = 0;\n        sprite->sPlayerObjectId = gFieldEffectArguments[2];\n        sprite->sBobDirection = 0;\n        sprite->data[6] = -1;\n        sprite->data[7] = -1;\n    }\n    FieldEffectActiveListRemove(FLDEFF_SURF_BLOB);\n    return spriteId;\n}\n\nvoid SetSurfBlob_BobState(u8 spriteId, u8 bobState)\n{\n    gSprites[spriteId].sBitfield = (gSprites[spriteId].sBitfield & ~0xF) | (bobState & 0xF);\n}\n\nvoid SetSurfBlob_DontSyncAnim(u8 spriteId, bool8 value)\n{\n    gSprites[spriteId].sBitfield = (gSprites[spriteId].sBitfield & ~0xF0) | ((value & 0xF) << 4);\n}\n\nvoid SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset)\n{\n    gSprites[spriteId].sBitfield = (gSprites[spriteId].sBitfield & ~0xF00) | ((hasOffset & 0xF) << 8);\n    gSprites[spriteId].sPlayerOffset = offset;\n}\n\nstatic u8 GetSurfBlob_BobState(struct Sprite *sprite)\n{\n    return sprite->sBitfield & 0xF;\n}\n\nstatic bool8 GetSurfBlob_DontSyncAnim(struct Sprite *sprite)\n{\n    return (sprite->sBitfield & 0xF0) >> 4;\n}\n\nstatic bool8 GetSurfBlob_HasPlayerOffset(struct Sprite *sprite)\n{\n    return (sprite->sBitfield & 0xF00) >> 8;\n}\n\nvoid UpdateSurfBlobFieldEffect(struct Sprite *sprite)\n{\n    struct ObjectEvent *playerObject;\n    struct Sprite *playerSprite;\n\n    playerObject = &gObjectEvents[sprite->sPlayerObjectId];\n    playerSprite = &gSprites[playerObject->spriteId];\n    SynchroniseSurfAnim(playerObject, sprite);\n    SynchroniseSurfPosition(playerObject, sprite);\n    CreateBobbingEffect(playerObject, playerSprite, sprite);\n    sprite->oam.priority = playerSprite->oam.priority;\n}\n\nstatic void SynchroniseSurfAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite)\n{\n    u8 surfBlobDirectionAnims[] = {\n        [DIR_NONE] = 0,\n        [DIR_SOUTH] = 0,\n        [DIR_NORTH] = 1,\n        [DIR_WEST] = 2,\n        [DIR_EAST] = 3\n    };\n\n    if (GetSurfBlob_DontSyncAnim(sprite) == FALSE)\n        StartSpriteAnimIfDifferent(sprite, surfBlobDirectionAnims[objectEvent->movementDirection]);\n}\n\nvoid SynchroniseSurfPosition(struct ObjectEvent *playerObject, struct Sprite *surfBlobSprite)\n{\n    u32 i;\n    s16 x = playerObject->currentCoords.x;\n    s16 y = playerObject->currentCoords.y;\n    s32 yOffset = surfBlobSprite->y2;\n\n    if (yOffset == 0 && (x != surfBlobSprite->data[6] || y != surfBlobSprite->data[7]))\n    {\n        surfBlobSprite->data[5] = yOffset;\n        surfBlobSprite->data[6] = x;\n        surfBlobSprite->data[7] = y;\n        for (i = DIR_SOUTH; i <= DIR_EAST; i++, x = surfBlobSprite->data[6], y = surfBlobSprite->data[7])\n        {\n            MoveCoords(i, &x, &y);\n            if (MapGridGetElevationAt(x, y) == 3)\n            {\n                surfBlobSprite->data[5]++;\n                break;\n            }\n        }\n    }\n}\n\nstatic void CreateBobbingEffect(struct ObjectEvent *objectEvent, struct Sprite *playerSprite, struct Sprite *surfBlobSprite)\n{\n    u16 intervals[] = {7, 15};\n    u8 bobState = GetSurfBlob_BobState(surfBlobSprite);\n    if (bobState != BOB_NONE)\n    {\n        // the surf blob sprite never bobs since sBobDirection will always be 0\n\n        if (((u16)(++surfBlobSprite->sTimer) & intervals[surfBlobSprite->data[5]]) == 0)\n            surfBlobSprite->y2 += surfBlobSprite->sBobDirection;\n\n        if ((surfBlobSprite->sTimer & 0x1F) == 0)\n            surfBlobSprite->sBobDirection = -surfBlobSprite->sBobDirection;\n\n        if (bobState != BOB_MON_ONLY)\n        {\n            if (GetSurfBlob_HasPlayerOffset(surfBlobSprite) == FALSE)\n                playerSprite->y2 = surfBlobSprite->y2;\n            else\n                playerSprite->y2 = surfBlobSprite->sPlayerOffset + surfBlobSprite->y2;\n\n            if (surfBlobSprite->animCmdIndex != 0)\n                playerSprite->y2++;\n\n            surfBlobSprite->x = playerSprite->x;\n            surfBlobSprite->y = playerSprite->y + 8;\n        }\n    }\n}\n\n#undef sBitfield\n#undef sPlayerOffset\n#undef sPlayerObjectId\n#undef sBobDirection\n#undef sTimer\n\nu8 StartUnderwaterSurfBlobBobbing(u8 oldSpriteId)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    spriteId = CreateSpriteAtEnd(&gDummySpriteTemplate, 0, 0, -1);\n    sprite = &gSprites[spriteId];\n    sprite->callback = SpriteCB_UnderwaterSurfBlob;\n    sprite->invisible = TRUE;\n    sprite->data[0] = oldSpriteId;\n    sprite->data[1] = 1;\n    return spriteId;\n}\n\nstatic void SpriteCB_UnderwaterSurfBlob(struct Sprite *sprite)\n{\n    struct Sprite *oldSprite;\n\n    oldSprite = &gSprites[sprite->data[0]];\n    if (((sprite->data[2]++) & 0x03) == 0)\n    {\n        oldSprite->y2 += sprite->data[1];\n    }\n    if ((sprite->data[2] & 0x0F) == 0)\n    {\n        sprite->data[1] = -sprite->data[1];\n    }\n}\n\nu32 FldEff_Dust(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_GROUND_IMPACT_DUST], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->data[0] = gFieldEffectArguments[2];\n        sprite->data[1] = 10;\n    }\n    return 0;\n}\n\nu32 FldEff_SandPile(void)\n{\n    u8 objectEventId;\n    struct ObjectEvent * objectEvent;\n    u8 spriteId;\n    struct Sprite *sprite;\n    const struct ObjectEventGraphicsInfo * graphicsInfo;\n\n    objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    objectEvent = &gObjectEvents[objectEventId];\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SAND_PILE], 0, 0, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority;\n        sprite->data[0] = gFieldEffectArguments[0];\n        sprite->data[1] = gFieldEffectArguments[1];\n        sprite->data[2] = gFieldEffectArguments[2];\n        sprite->data[3] = gSprites[objectEvent->spriteId].x;\n        sprite->data[4] = gSprites[objectEvent->spriteId].y;\n        sprite->y2 = (graphicsInfo->height >> 1) - 2;\n        SeekSpriteAnim(sprite, 2);\n    }\n    return 0;\n}\n\nvoid UpdateSandPileFieldEffect(struct Sprite *sprite)\n{\n    u8 objectEventId;\n    s16 x;\n    s16 y;\n\n    if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inSandPile)\n    {\n        FieldEffectStop(sprite, FLDEFF_SAND_PILE);\n    }\n    else\n    {\n        y = gSprites[gObjectEvents[objectEventId].spriteId].y;\n        x = gSprites[gObjectEvents[objectEventId].spriteId].x;\n        if (x != sprite->data[3] || y != sprite->data[4])\n        {\n            sprite->data[3] = x;\n            sprite->data[4] = y;\n            if (sprite->animEnded)\n            {\n                StartSpriteAnim(sprite, 0);\n            }\n        }\n        sprite->x = x;\n        sprite->y = y;\n        sprite->subpriority = gSprites[gObjectEvents[objectEventId].spriteId].subpriority;\n        UpdateObjectEventSpriteInvisibility(sprite, FALSE);\n    }\n}\n\nu32 FldEff_Bubbles(void)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 0);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BUBBLES], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = 1;\n    }\n    return 0;\n}\n\nvoid UpdateBubblesFieldEffect(struct Sprite *sprite)\n{\n    sprite->data[0] += 0x80;\n    sprite->data[0] &= 0x100;\n    sprite->y -= sprite->data[0] >> 8;\n    UpdateObjectEventSpriteInvisibility(sprite, FALSE);\n    if (sprite->invisible || sprite->animEnded)\n    {\n        FieldEffectStop(sprite, FLDEFF_BUBBLES);\n    }\n}\n\nu32 FldEff_BerryTreeGrowthSparkle(void)\n{\n    /*u8 spriteId;\n    struct Sprite *sprite;\n\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 4);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPARKLE], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->oam.priority = gFieldEffectArguments[3];\n        sprite->oam.paletteNum = 5;\n        sprite->data[0] = FLDEFF_BERRY_TREE_GROWTH_SPARKLE;\n    }*/\n    return 0;\n}\n\nu32 ShowTreeDisguiseFieldEffect(void)\n{\n    return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, FLDEFFOBJ_TREE_DISGUISE, 4);\n}\n\nu32 ShowMountainDisguiseFieldEffect(void)\n{\n    return ShowDisguiseFieldEffect(FLDEFF_MOUNTAIN_DISGUISE, FLDEFFOBJ_MOUNTAIN_DISGUISE, 3);\n}\n\nu32 ShowSandDisguiseFieldEffect(void)\n{\n    return ShowDisguiseFieldEffect(FLDEFF_SAND_DISGUISE, FLDEFFOBJ_SAND_DISGUISE, 2);\n}\n\nstatic u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    if (TryGetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &spriteId))\n    {\n        FieldEffectActiveListRemove(fldEff);\n        return MAX_SPRITES;\n    }\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[templateIdx], 0, 0, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sprite = &gSprites[spriteId];\n        sprite->coordOffsetEnabled++;\n        sprite->oam.paletteNum = paletteNum;\n        sprite->data[1] = fldEff;\n        sprite->data[2] = gFieldEffectArguments[0];\n        sprite->data[3] = gFieldEffectArguments[1];\n        sprite->data[4] = gFieldEffectArguments[2];\n    }\n    return spriteId;\n}\n\nvoid UpdateDisguiseFieldEffect(struct Sprite *sprite)\n{\n    u8 objectEventId;\n    const struct ObjectEventGraphicsInfo * graphicsInfo;\n    struct Sprite *linkedSprite;\n\n    if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[2], sprite->data[3], sprite->data[4], &objectEventId))\n    {\n        FieldEffectStop(sprite, sprite->data[1]);\n    }\n\n    graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);\n    linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId];\n    sprite->invisible = linkedSprite->invisible;\n    sprite->x = linkedSprite->x;\n    sprite->y = (graphicsInfo->height >> 1) + linkedSprite->y - 16;\n    sprite->subpriority = linkedSprite->subpriority - 1;\n    if (sprite->data[0] == 1)\n    {\n        sprite->data[0]++;\n        StartSpriteAnim(sprite, 1);\n    }\n    if (sprite->data[0] == 2 && sprite->animEnded)\n    {\n        sprite->data[7] = 1;\n    }\n    if (sprite->data[0] == 3)\n    {\n        FieldEffectStop(sprite, sprite->data[1]);\n    }\n}\n\nvoid StartRevealDisguise(struct ObjectEvent * objectEvent)\n{\n    if (objectEvent->directionSequenceIndex == 1)\n    {\n        gSprites[objectEvent->fieldEffectSpriteId].data[0]++;\n    }\n}\n\nbool8 UpdateRevealDisguise(struct ObjectEvent * objectEvent)\n{\n    struct Sprite *sprite;\n\n    if (objectEvent->directionSequenceIndex == 2)\n    {\n        return TRUE;\n    }\n    if (objectEvent->directionSequenceIndex == 0)\n    {\n        return TRUE;\n    }\n    sprite = &gSprites[objectEvent->fieldEffectSpriteId];\n    if (sprite->data[7])\n    {\n        objectEvent->directionSequenceIndex = 2;\n        sprite->data[0]++;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nu32 FldEff_Sparkle(void)\n{\n    u8 spriteId;\n\n    gFieldEffectArguments[0] += 7;\n    gFieldEffectArguments[1] += 7;\n    SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);\n    spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SMALL_SPARKLE], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].oam.priority = gFieldEffectArguments[2];\n        gSprites[spriteId].coordOffsetEnabled = TRUE;\n    }\n    return 0;\n}\n\nvoid UpdateSparkleFieldEffect(struct Sprite *sprite)\n{\n    if (sprite->data[0] == 0)\n    {\n        if (sprite->animEnded)\n        {\n            sprite->invisible = TRUE;\n            sprite->data[0]++;\n        }\n\n        if (sprite->data[0] == 0)\n            return;\n    }\n\n    if (++sprite->data[1] > 34)\n        FieldEffectStop(sprite, FLDEFF_SPARKLE);\n}\n\nvoid UpdateJumpImpactEffect(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n    {\n        FieldEffectStop(sprite, sprite->data[1]);\n    }\n    else\n    {\n        UpdateObjectEventSpriteInvisibility(sprite, FALSE);\n        SetObjectSubpriorityByElevation(sprite->data[0], sprite, 0);\n    }\n}\n\nvoid WaitFieldEffectSpriteAnim(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n        FieldEffectStop(sprite, sprite->data[0]);\n    else\n        UpdateObjectEventSpriteInvisibility(sprite, FALSE);\n}\n\nstatic void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 z, u8 offset)\n{\n    u32 i;\n    s16 var, xhi, lyhi, yhi, ylo;\n    const struct ObjectEventGraphicsInfo * graphicsInfo; // Unused Variable\n    struct Sprite *linkedSprite;\n\n    SetObjectSubpriorityByElevation(z, sprite, offset);\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        struct ObjectEvent * objectEvent = &gObjectEvents[i];\n        if (objectEvent->active)\n        {\n            graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);\n            linkedSprite = &gSprites[objectEvent->spriteId];\n            xhi = sprite->x + sprite->centerToCornerVecX;\n            var = sprite->x - sprite->centerToCornerVecX;\n            if (xhi < linkedSprite->x && var > linkedSprite->x)\n            {\n                lyhi = linkedSprite->y + linkedSprite->centerToCornerVecY;\n                var = linkedSprite->y;\n                ylo = sprite->y - sprite->centerToCornerVecY;\n                yhi = ylo + linkedSprite->centerToCornerVecY;\n                if ((lyhi < yhi || lyhi < ylo) && var > yhi && sprite->subpriority <= linkedSprite->subpriority)\n                {\n                    sprite->subpriority = linkedSprite->subpriority + 2;\n                    break;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/field_fadetransition.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"field_fadetransition.h\"\n#include \"overworld.h\"\n#include \"fldeff.h\"\n#include \"field_weather.h\"\n#include \"map_preview_screen.h\"\n#include \"field_player_avatar.h\"\n#include \"task.h\"\n#include \"script.h\"\n#include \"cable_club.h\"\n#include \"fieldmap.h\"\n#include \"metatile_behavior.h\"\n#include \"quest_log.h\"\n#include \"link.h\"\n#include \"event_object_movement.h\"\n#include \"field_door.h\"\n#include \"field_effect.h\"\n#include \"field_screen_effect.h\"\n#include \"field_specials.h\"\n#include \"event_object_lock.h\"\n#include \"start_menu.h\"\n#include \"constants/songs.h\"\n#include \"constants/event_object_movement.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/field_weather.h\"\n\nstatic void ExitWarpFadeInScreen(u8 playerNotMoving);\nstatic void Task_ExitDoor(u8 taskId);\nstatic void Task_ExitNonAnimDoor(u8 taskId);\nstatic void Task_ExitNonDoor(u8 taskId);\nstatic void Task_TeleportWarpIn(u8 taskId);\nstatic void Task_Teleport2Warp(u8 taskId);\nstatic void Task_TeleportWarp(u8 taskId);\nstatic void Task_DoorWarp(u8 taskId);\nstatic void Task_StairWarp(u8 taskId);\nstatic void ForceStairsMovement(u16 metatileBehavior, s16 *x, s16 *y);\nstatic void GetStairsMovementDirection(u8 metatileBehavior, s16 *x, s16 *y);\nstatic void UpdateStairsMovement(s16 speedX, s16 speedY, s16 *offsetX, s16 *offsetY, s16 *timer);\nstatic void Task_ExitStairs(u8 taskId);\nstatic void ExitStairsMovement(s16 *speedX, s16 *speedY, s16 *offsetX, s16 *offsetY, s16 *timer);\nstatic bool8 WaitStairExitMovementFinished(s16 *speedX, s16 *speedY, s16 *offsetX, s16 *offsetY, s16 *timer);\n\nvoid palette_bg_faded_fill_white(void)\n{\n    CpuFastFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE);\n}\n\nvoid palette_bg_faded_fill_black(void)\n{\n    CpuFastFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE);\n}\n\nvoid WarpFadeInScreen(void)\n{\n    switch (MapTransitionIsExit(GetLastUsedWarpMapType(), GetCurrentMapType()))\n    {\n    case FALSE:\n        palette_bg_faded_fill_black();\n        FadeScreen(FADE_FROM_BLACK, 0);\n        palette_bg_faded_fill_black();\n        break;\n    case TRUE:\n        palette_bg_faded_fill_white();\n        FadeScreen(FADE_FROM_WHITE, 0);\n        palette_bg_faded_fill_white();\n        break;\n    }\n}\n\nstatic void WarpFadeInScreenWithDelay(void)\n{\n    switch (MapTransitionIsExit(GetLastUsedWarpMapType(), GetCurrentMapType()))\n    {\n    case FALSE:\n        palette_bg_faded_fill_black();\n        FadeScreen(FADE_FROM_BLACK, 3);\n        palette_bg_faded_fill_black();\n        break;\n    case TRUE:\n        palette_bg_faded_fill_white();\n        FadeScreen(FADE_FROM_WHITE, 3);\n        palette_bg_faded_fill_white();\n        break;\n    }\n}\n\nvoid FadeInFromBlack(void)\n{\n    palette_bg_faded_fill_black();\n    FadeScreen(FADE_FROM_BLACK, 0);\n    palette_bg_faded_fill_black();\n}\n\nvoid WarpFadeOutScreen(void)\n{\n    const struct MapHeader *header = GetDestinationWarpMapHeader();\n    if (header->regionMapSectionId != gMapHeader.regionMapSectionId && MapHasPreviewScreen(header->regionMapSectionId, MPS_TYPE_CAVE))\n        FadeScreen(FADE_TO_BLACK, 0);\n    else\n    {\n        switch (MapTransitionIsEnter(GetCurrentMapType(), header->mapType))\n        {\n        case FALSE:\n            FadeScreen(FADE_TO_BLACK, 0);\n            break;\n        case TRUE:\n            FadeScreen(FADE_TO_WHITE, 0);\n            break;\n        }\n    }\n}\n\nstatic void WarpFadeOutScreenWithDelay(void) // Unused\n{\n    switch (MapTransitionIsEnter(GetCurrentMapType(), GetDestinationWarpMapHeader()->mapType))\n    {\n    case FALSE:\n        FadeScreen(FADE_TO_BLACK, 3);\n        break;\n    case TRUE:\n        FadeScreen(FADE_TO_WHITE, 3);\n        break;\n    }\n}\n\nstatic void SetPlayerVisibility(bool8 visible)\n{\n    SetPlayerInvisibility(!visible);\n}\n\nstatic void Task_ContinueScriptUnionRoom(u8 taskId)\n{\n    if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE)\n        DestroyTask(taskId);\n}\n\nvoid FieldCB_ContinueScriptUnionRoom(void)\n{\n    LockPlayerFieldControls();\n    Overworld_PlaySpecialMapMusic();\n    FadeInFromBlack();\n    CreateTask(Task_ContinueScriptUnionRoom, 10);\n}\n\nstatic void Task_ContinueScript(u8 taskId)\n{\n    if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE)\n    {\n        DestroyTask(taskId);\n        ScriptContext_Enable();\n    }\n}\n\nvoid FieldCB_ContinueScriptHandleMusic(void)\n{\n    LockPlayerFieldControls();\n    Overworld_PlaySpecialMapMusic();\n    FadeInFromBlack();\n    CreateTask(Task_ContinueScript, 10);\n}\n\nvoid FieldCB_ContinueScript(void)\n{\n    LockPlayerFieldControls();\n    FadeInFromBlack();\n    CreateTask(Task_ContinueScript, 10);\n}\n\nstatic void Task_ReturnToFieldCableLink(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->data[0])\n    {\n    case 0:\n        task->data[1] = CreateTask_ReestablishCableClubLink();\n        task->data[0]++;\n        break;\n    case 1:\n        if (gTasks[task->data[1]].isActive != TRUE)\n        {\n            WarpFadeInScreen();\n            task->data[0]++;\n        }\n        break;\n    case 2:\n        if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE)\n        {\n            UnlockPlayerFieldControls();\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nvoid FieldCB_ReturnToFieldCableLink(void)\n{\n    LockPlayerFieldControls();\n    Overworld_PlaySpecialMapMusic();\n    palette_bg_faded_fill_black();\n    CreateTask(Task_ReturnToFieldCableLink, 10);\n}\n\nstatic void Task_ReturnToFieldRecordMixing(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->data[0])\n    {\n    case 0:\n        SetLinkStandbyCallback();\n        task->data[0]++;\n        break;\n    case 1:\n        if (IsLinkTaskFinished())\n        {\n            WarpFadeInScreen();\n            task->data[0]++;\n        }\n        break;\n    case 2:\n        if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE)\n        {\n            StartSendingKeysToLink();\n            UnlockPlayerFieldControls();\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nvoid FieldCB_ReturnToFieldWirelessLink(void)\n{\n    LockPlayerFieldControls();\n    Overworld_PlaySpecialMapMusic();\n    palette_bg_faded_fill_black();\n    CreateTask(Task_ReturnToFieldRecordMixing, 10);\n}\n\nstatic void SetUpWarpExitTask(bool8 playerNotMoving)\n{\n    s16 x, y;\n    u32 metatileBehavior;\n    TaskFunc func;\n\n    PlayerGetDestCoords(&x, &y);\n    metatileBehavior = MapGridGetMetatileBehaviorAt(x, y);\n    if (MetatileBehavior_IsWarpDoor_2(metatileBehavior) == TRUE)\n    {\n        func = Task_ExitDoor;\n        switch (MapTransitionIsExit(GetLastUsedWarpMapType(), GetCurrentMapType()))\n        {\n        case FALSE:\n            palette_bg_faded_fill_black();\n            break;\n        case TRUE:\n            palette_bg_faded_fill_white();\n            break;\n        }\n    }\n    else\n    {\n        ExitWarpFadeInScreen(playerNotMoving);\n        if (MetatileBehavior_IsNonAnimDoor(metatileBehavior) == TRUE)\n            func = Task_ExitNonAnimDoor;\n        else if (MetatileBehavior_IsDirectionalStairWarp(metatileBehavior) == TRUE)\n        {\n            u8 tmp = gExitStairsMovementDisabled;\n            func = Task_ExitNonDoor;\n            if (!tmp)\n                func = Task_ExitStairs;\n        }\n        else\n            func = Task_ExitNonDoor;\n    }\n    gExitStairsMovementDisabled = FALSE;\n    CreateTask(func, 10);\n}\n\nstatic void ExitWarpFadeInScreen(bool8 playerNotMoving)\n\n{\n    if (!playerNotMoving)\n        WarpFadeInScreen();\n    else\n        FadeInFromBlack();\n}\n\nvoid FieldCB_DefaultWarpExit(void)\n{\n    Overworld_PlaySpecialMapMusic();\n    QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode();\n    SetUpWarpExitTask(FALSE);\n    LockPlayerFieldControls();\n}\n\nvoid FieldCB_WarpExitFadeFromBlack(void)\n{\n    Overworld_PlaySpecialMapMusic();\n    QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode();\n    SetUpWarpExitTask(TRUE);\n    LockPlayerFieldControls();\n}\n\nstatic void FieldCB_TeleportWarpIn(void)\n{\n    Overworld_PlaySpecialMapMusic();\n    WarpFadeInScreen();\n    QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode();\n    PlaySE(SE_WARP_OUT);\n    CreateTask(Task_TeleportWarpIn, 10);\n    LockPlayerFieldControls();\n}\n\nstatic void Task_ExitDoor(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    s16 *x = &task->data[2];\n    s16 *y = &task->data[3];\n\n    if (task->data[0] == 0)\n        task->data[0] = 5;\n\n    switch (task->data[0])\n    {\n    case 0: // Never reached\n        SetPlayerVisibility(0);\n        FreezeObjectEvents();\n        PlayerGetDestCoords(x, y);\n        FieldSetDoorOpened(*x, *y);\n        task->data[0] = 1;\n        break;\n    case 5:\n        SetPlayerVisibility(0);\n        FreezeObjectEvents();\n        DoOutwardBarnDoorWipe();\n        WarpFadeInScreenWithDelay();\n        task->data[0] = 6;\n        break;\n    case 6:\n        task->data[15]++;\n        if (task->data[15] == 25)\n        {\n            PlayerGetDestCoords(x, y);\n            PlaySE(GetDoorSoundEffect(*x, *y));\n            FieldAnimateDoorOpen(*x, *y);\n            task->data[0] = 7;\n        }\n        break;\n    case 7:\n        if (!FieldIsDoorAnimationRunning())\n        {\n            PlayerGetDestCoords(&task->data[12], &task->data[13]);\n            SetPlayerVisibility(TRUE);\n            ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_DOWN);\n            task->data[0] = 8;\n        }\n        break;\n    case 8:\n        task->data[14]++;\n        if (task->data[14] == 14)\n        {\n            FieldAnimateDoorClose(task->data[12], task->data[13]);\n            task->data[0] = 9;\n        }\n        break;\n    case 9:\n        if (FieldFadeTransitionBackgroundEffectIsFinished() && walkrun_is_standing_still() && !FieldIsDoorAnimationRunning() && !FuncIsActiveTask(Task_BarnDoorWipe))\n        {\n            ObjectEventClearHeldMovementIfFinished(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]);\n            task->data[0] = 4;\n        }\n        break;\n    // Legacy RS\n    case 1:\n        if (FieldFadeTransitionBackgroundEffectIsFinished())\n        {\n            SetPlayerVisibility(TRUE);\n            ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_DOWN);\n            task->data[0] = 2;\n        }\n        break;\n    case 2:\n        if (walkrun_is_standing_still())\n        {\n            task->data[1] = FieldAnimateDoorClose(*x, *y);\n            ObjectEventClearHeldMovementIfFinished(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]);\n            task->data[0] = 3;\n        }\n        break;\n    case 3:\n        if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE)\n            task->data[0] = 4;\n        break;\n    case 4:\n        UnfreezeObjectEvents();\n        UnlockPlayerFieldControls();\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void Task_ExitNonAnimDoor(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    s16 *x = &task->data[2];\n    s16 *y = &task->data[3];\n\n    switch (task->data[0])\n    {\n    case 0:\n        SetPlayerVisibility(0);\n        FreezeObjectEvents();\n        PlayerGetDestCoords(x, y);\n        task->data[0] = 1;\n        break;\n    case 1:\n        if (FieldFadeTransitionBackgroundEffectIsFinished())\n        {\n            SetPlayerVisibility(TRUE);\n            ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)], GetWalkNormalMovementAction(GetPlayerFacingDirection()));\n            task->data[0] = 2;\n        }\n        break;\n    case 2:\n        if (walkrun_is_standing_still())\n        {\n            task->data[0] = 3;\n        }\n        break;\n    case 3:\n        UnfreezeObjectEvents();\n        UnlockPlayerFieldControls();\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void Task_ExitNonDoor(u8 taskId)\n{\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        FreezeObjectEvents();\n        LockPlayerFieldControls();\n        gTasks[taskId].data[0]++;\n        break;\n    case 1:\n        if (FieldFadeTransitionBackgroundEffectIsFinished())\n        {\n            UnfreezeObjectEvents();\n            UnlockPlayerFieldControls();\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void Task_TeleportWarpIn(u8 taskId)\n{\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        FreezeObjectEvents();\n        LockPlayerFieldControls();\n        StartTeleportInPlayerAnim();\n        gTasks[taskId].data[0]++;\n        break;\n    case 1:\n        if (FieldFadeTransitionBackgroundEffectIsFinished() && WaitTeleportInPlayerAnim() != TRUE)\n        {\n            UnfreezeObjectEvents();\n            UnlockPlayerFieldControls();\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void Task_WaitFadeAndCreateStartMenuTask(u8 taskId)\n{\n    if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE)\n    {\n        DestroyTask(taskId);\n        CreateTask(Task_StartMenuHandleInput, 80);\n    }\n}\n\nvoid FadeTransition_FadeInOnReturnToStartMenu(void)\n{\n    FadeInFromBlack();\n    CreateTask(Task_WaitFadeAndCreateStartMenuTask, 80);\n    LockPlayerFieldControls();\n}\n\nbool8 FieldCB_ReturnToFieldOpenStartMenu(void)\n{\n    SetUpReturnToStartMenu();\n    return FALSE;\n}\n\nstatic void Task_SafariZoneRanOutOfBalls(u8 taskId)\n{\n    if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE)\n    {\n        UnlockPlayerFieldControls();\n        DestroyTask(taskId);\n        ClearPlayerHeldMovementAndUnfreezeObjectEvents();\n    }\n}\n\nvoid FieldCB_SafariZoneRanOutOfBalls(void)\n{\n    LockPlayerFieldControls();\n    Overworld_PlaySpecialMapMusic();\n    FadeInFromBlack();\n    CreateTask(Task_SafariZoneRanOutOfBalls, 10);\n}\n\nstatic bool32 WaitWarpFadeOutScreen(void)\n{\n    return gPaletteFade.active;\n}\n\nbool32 FieldFadeTransitionBackgroundEffectIsFinished(void)\n{\n    if (IsWeatherNotFadingIn() == TRUE && ForestMapPreviewScreenIsRunning())\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid DoWarp(void)\n{\n    LockPlayerFieldControls();\n    TryFadeOutOldMapMusic();\n    WarpFadeOutScreen();\n    PlayRainStoppingSoundEffect();\n    PlaySE(SE_EXIT);\n    gFieldCallback = FieldCB_DefaultWarpExit;\n    CreateTask(Task_Teleport2Warp, 10);\n}\n\nvoid DoDiveWarp(void)\n{\n    LockPlayerFieldControls();\n    TryFadeOutOldMapMusic();\n    WarpFadeOutScreen();\n    PlayRainStoppingSoundEffect();\n    gFieldCallback = FieldCB_DefaultWarpExit;\n    CreateTask(Task_Teleport2Warp, 10);\n}\n\nvoid DoStairWarp(u16 metatileBehavior, u16 delay)\n{\n    u8 taskId = CreateTask(Task_StairWarp, 10);\n    gTasks[taskId].data[1] = metatileBehavior;\n    gTasks[taskId].data[15] = delay;\n    Task_StairWarp(taskId);\n}\n\nvoid DoDoorWarp(void)\n{\n    LockPlayerFieldControls();\n    gFieldCallback = FieldCB_DefaultWarpExit;\n    CreateTask(Task_DoorWarp, 10);\n}\n\nvoid DoTeleport2Warp(void)\n{\n    LockPlayerFieldControls();\n    CreateTask(Task_Teleport2Warp, 10);\n    gFieldCallback = FieldCB_TeleportWarpIn;\n}\n\nvoid DoUnionRoomWarp(void)\n{\n    LockPlayerFieldControls();\n    gFieldCallback = FieldCB_DefaultWarpExit;\n    CreateTask(Task_TeleportWarp, 10);\n}\n\nvoid DoFallWarp(void)\n{\n    DoDiveWarp();\n    gFieldCallback = FieldCB_FallWarpExit;\n}\n\nvoid DoEscalatorWarp(u8 metatileBehavior)\n{\n    LockPlayerFieldControls();\n    StartEscalatorWarp(metatileBehavior, 10);\n}\n\nvoid DoLavaridgeGymB1FWarp(void)\n{\n    LockPlayerFieldControls();\n    StartLavaridgeGymB1FWarp(10);\n}\n\nvoid DoLavaridgeGym1FWarp(void)\n{\n    LockPlayerFieldControls();\n    StartLavaridgeGym1FWarp(10);\n}\n\nvoid DoTeleportWarp(void)\n{\n    LockPlayerFieldControls();\n    TryFadeOutOldMapMusic();\n    CreateTask(Task_TeleportWarp, 10);\n    gFieldCallback = FieldCB_TeleportWarpIn;\n}\n\nstatic void DoPortholeWarp(void) // Unused\n{\n    LockPlayerFieldControls();\n    WarpFadeOutScreen();\n    CreateTask(Task_Teleport2Warp, 10);\n    gFieldCallback = FieldCB_ShowPortholeView;\n}\n\nstatic void Task_CableClubWarp(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->data[0])\n    {\n    case 0:\n        LockPlayerFieldControls();\n        task->data[0]++;\n        break;\n    case 1:\n        if (!WaitWarpFadeOutScreen() && BGMusicStopped())\n            task->data[0]++;\n        break;\n    case 2:\n        WarpIntoMap();\n        SetMainCallback2(CB2_ReturnToFieldCableClub);\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nvoid DoCableClubWarp(void)\n{\n    LockPlayerFieldControls();\n    TryFadeOutOldMapMusic();\n    WarpFadeOutScreen();\n    PlaySE(SE_EXIT);\n    CreateTask(Task_CableClubWarp, 10);\n}\n\nstatic void Task_ReturnFromLinkRoomWarp(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    switch (data[0])\n    {\n    case 0:\n        ClearLinkCallback_2();\n        FadeScreen(FADE_TO_BLACK, 0);\n        TryFadeOutOldMapMusic();\n        PlaySE(SE_EXIT);\n        data[0]++;\n        break;\n    case 1:\n        if (!WaitWarpFadeOutScreen() && BGMusicStopped())\n        {\n            SetCloseLinkCallback();\n            data[0]++;\n        }\n        break;\n    case 2:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            WarpIntoMap();\n            SetMainCallback2(CB2_LoadMap);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nvoid ReturnFromLinkRoom(void)\n{\n    CreateTask(Task_ReturnFromLinkRoomWarp, 10);\n}\n\nstatic void Task_Teleport2Warp(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->data[0])\n    {\n    case 0:\n        FreezeObjectEvents();\n        LockPlayerFieldControls();\n        task->data[0]++;\n        break;\n    case 1:\n        if (!WaitWarpFadeOutScreen() && BGMusicStopped())\n            task->data[0]++;\n        break;\n    case 2:\n        WarpIntoMap();\n        SetMainCallback2(CB2_LoadMap);\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void Task_TeleportWarp(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->data[0])\n    {\n    case 0:\n        FreezeObjectEvents();\n        LockPlayerFieldControls();\n        PlaySE(SE_WARP_IN);\n        StartTeleportWarpOutPlayerAnim();\n        task->data[0]++;\n        break;\n    case 1:\n        if (!WaitTeleportWarpOutPlayerAnim())\n        {\n            WarpFadeOutScreen();\n            task->data[0]++;\n        }\n        break;\n    case 2:\n        if (!WaitWarpFadeOutScreen() && BGMusicStopped())\n            task->data[0]++;\n        break;\n    case 3:\n        WarpIntoMap();\n        SetMainCallback2(CB2_LoadMap);\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void Task_DoorWarp(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    s16 *xp = &task->data[2];\n    s16 *yp = &task->data[3];\n    switch (task->data[0])\n    {\n    case 0:\n        FreezeObjectEvents();\n        PlayerGetDestCoords(xp, yp);\n        PlaySE(GetDoorSoundEffect(*xp, *yp - 1));\n        task->data[1] = FieldAnimateDoorOpen(*xp, *yp - 1);\n        task->data[0] = 1;\n        break;\n    case 1:\n        if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE)\n        {\n            ObjectEventClearHeldMovementIfActive(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]);\n            ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_UP);\n            task->data[0] = 2;\n        }\n        break;\n    case 2:\n        if (walkrun_is_standing_still())\n        {\n            task->data[1] = FieldAnimateDoorClose(*xp, *yp - 1);\n            ObjectEventClearHeldMovementIfFinished(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]);\n            SetPlayerVisibility(FALSE);\n            task->data[0] = 3;\n        }\n        break;\n    case 3:\n        if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE)\n            task->data[0] = 4;\n        break;\n    case 4:\n        TryFadeOutOldMapMusic();\n        WarpFadeOutScreen();\n        PlayRainStoppingSoundEffect();\n        task->data[0] = 0;\n        task->func = Task_Teleport2Warp;\n        break;\n    case 5:\n        TryFadeOutOldMapMusic();\n        PlayRainStoppingSoundEffect();\n        task->data[0] = 0;\n        task->func = Task_Teleport2Warp;\n        break;\n    }\n}\n\nstatic void Task_StairWarp(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];\n    struct Sprite *playerSpr = &gSprites[gPlayerAvatar.spriteId];\n    switch (data[0])\n    {\n    case 0:\n        LockPlayerFieldControls();\n        FreezeObjectEvents();\n        CameraObjectReset2();\n        data[0]++;\n        break;\n    case 1:\n        if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj))\n        {\n            if (data[15] != 0)\n                data[15]--;\n            else\n            {\n                TryFadeOutOldMapMusic();\n                PlayRainStoppingSoundEffect();\n                playerSpr->oam.priority = 1;\n                ForceStairsMovement(data[1], &data[2], &data[3]);\n                PlaySE(SE_EXIT);\n                data[0]++;\n            }\n        }\n        break;\n    case 2:\n        UpdateStairsMovement(data[2], data[3], &data[4], &data[5], &data[6]);\n        data[15]++;\n        if (data[15] >= 12)\n        {\n            WarpFadeOutScreen();\n            data[0]++;\n        }\n        break;\n    case 3:\n        UpdateStairsMovement(data[2], data[3], &data[4], &data[5], &data[6]);\n        if (!WaitWarpFadeOutScreen() && BGMusicStopped())\n            data[0]++;\n        break;\n    default:\n        gFieldCallback = FieldCB_DefaultWarpExit;\n        WarpIntoMap();\n        SetMainCallback2(CB2_LoadMap);\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void UpdateStairsMovement(s16 speedX, s16 speedY, s16 *offsetX, s16 *offsetY, s16 *timer)\n{\n    struct Sprite *playerSpr = &gSprites[gPlayerAvatar.spriteId];\n    struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (speedY > 0 || *timer > 6)\n        *offsetY += speedY;\n    *offsetX += speedX;\n    (*timer)++;\n    playerSpr->x2 = *offsetX >> 5;\n    playerSpr->y2 = *offsetY >> 5;\n    if (playerObj->heldMovementFinished)\n        ObjectEventForceSetHeldMovement(playerObj, GetWalkInPlaceNormalMovementAction(GetPlayerFacingDirection()));\n}\n\nstatic void ForceStairsMovement(u16 metatileBehavior, s16 *x, s16 *y)\n{\n    ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetWalkInPlaceNormalMovementAction(GetPlayerFacingDirection()));\n    GetStairsMovementDirection(metatileBehavior, x, y);\n}\n\nstatic void GetStairsMovementDirection(u8 metatileBehavior, s16 *x, s16 *y)\n{\n    if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior))\n    {\n        *x = 16;\n        *y = -10;\n    }\n    else if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior))\n    {\n        *x = -17;\n        *y = -10;\n    }\n    else if (MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior))\n    {\n        *x = 17;\n        *y = 3;\n    }\n    else if (MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior))\n    {\n        *x = -17;\n        *y = 3;\n    }\n    else\n    {\n        *x = 0;\n        *y = 0;\n    }\n}\n\nstatic void Task_ExitStairs(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    switch (data[0])\n    {\n    default:\n        if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE)\n        {\n            CameraObjectReset1();\n            UnlockPlayerFieldControls();\n            DestroyTask(taskId);\n        }\n        break;\n    case 0:\n        Overworld_PlaySpecialMapMusic();\n        WarpFadeInScreen();\n        LockPlayerFieldControls();\n        ExitStairsMovement(&data[1], &data[2], &data[3], &data[4], &data[5]);\n        data[0]++;\n        break;\n    case 1:\n        if (!WaitStairExitMovementFinished(&data[1], &data[2], &data[3], &data[4], &data[5]))\n            data[0]++;\n        break;\n    }\n}\n\nstatic void ExitStairsMovement(s16 *speedX, s16 *speedY, s16 *offsetX, s16 *offsetY, s16 *timer)\n{\n    s16 x, y;\n    u8 metatileBehavior;\n    s32 direction;\n    struct Sprite *sprite;\n    PlayerGetDestCoords(&x, &y);\n    metatileBehavior = MapGridGetMetatileBehaviorAt(x, y);\n    if (MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior) || MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior))\n        direction = DIR_WEST;\n    else\n        direction = DIR_EAST;\n    ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetWalkInPlaceFastMovementAction(direction));\n    GetStairsMovementDirection(metatileBehavior, speedX, speedY);\n    *offsetX = *speedX * 16;\n    *offsetY = *speedY * 16;\n    *timer = 16;\n    sprite = &gSprites[gPlayerAvatar.spriteId];\n    sprite->x2 = *offsetX >> 5;\n    sprite->y2 = *offsetY >> 5;\n    *speedX *= -1;\n    *speedY *= -1;\n}\n\nstatic bool8 WaitStairExitMovementFinished(s16 *speedX, s16 *speedY, s16 *offsetX, s16 *offsetY, s16 *timer)\n{\n    struct Sprite *sprite;\n    sprite = &gSprites[gPlayerAvatar.spriteId];\n    if (*timer != 0)\n    {\n        *offsetX += *speedX;\n        *offsetY += *speedY;\n        sprite->x2 = *offsetX >> 5;\n        sprite->y2 = *offsetY >> 5;\n        (*timer)--;\n        return TRUE;\n    }\n    else\n    {\n        sprite->x2 = 0;\n        sprite->y2 = 0;\n        return FALSE;\n    }\n}\n"
  },
  {
    "path": "src/field_message_box.c",
    "content": "#include \"global.h\"\n#include \"field_message_box.h\"\n#include \"gflib.h\"\n#include \"new_menu_helpers.h\"\n#include \"quest_log.h\"\n#include \"script.h\"\n#include \"text_window.h\"\n\nstatic EWRAM_DATA u8 sMessageBoxType = 0;\n\nstatic void ExpandStringAndStartDrawFieldMessageBox(const u8 *str);\nstatic void StartDrawFieldMessageBox(void);\n\nvoid InitFieldMessageBox(void)\n{\n    sMessageBoxType = FIELD_MESSAGE_BOX_HIDDEN;\n    gTextFlags.canABSpeedUpPrint = FALSE;\n    gTextFlags.useAlternateDownArrow = FALSE;\n    gTextFlags.autoScroll = FALSE;\n}\n\nstatic void Task_DrawFieldMessageBox(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->data[0])\n    {\n    case 0:\n        if (gQuestLogState == QL_STATE_PLAYBACK)\n        {\n            gTextFlags.autoScroll = TRUE;\n            LoadQuestLogWindowTiles(0, 0x200);\n        }\n        else if (!IsMsgSignpost())\n            LoadStdWindowFrameGfx();\n        else\n            LoadSignpostWindowFrameGfx();\n        task->data[0]++;\n        break;\n    case 1:\n        DrawDialogueFrame(0, TRUE);\n        task->data[0]++;\n        break;\n    case 2:\n        if (RunTextPrinters_CheckPrinter0Active() != TRUE)\n        {\n            sMessageBoxType = FIELD_MESSAGE_BOX_HIDDEN;\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void CreateTask_DrawFieldMessageBox(void)\n{\n    CreateTask(Task_DrawFieldMessageBox, 80);\n}\n\nstatic void DestroyTask_DrawFieldMessageBox(void)\n{\n    u8 taskId = FindTaskIdByFunc(Task_DrawFieldMessageBox);\n    if (taskId != 0xFF)\n        DestroyTask(taskId);\n}\n\nbool8 ShowFieldMessage(const u8 *str)\n{\n    if (sMessageBoxType != FIELD_MESSAGE_BOX_HIDDEN)\n        return FALSE;\n    ExpandStringAndStartDrawFieldMessageBox(str);\n    sMessageBoxType = FIELD_MESSAGE_BOX_NORMAL;\n    return TRUE;\n}\n\nbool8 ShowFieldAutoScrollMessage(const u8 *str)\n{\n    if (sMessageBoxType != FIELD_MESSAGE_BOX_HIDDEN)\n        return FALSE;\n    sMessageBoxType = FIELD_MESSAGE_BOX_AUTO_SCROLL;\n    ExpandStringAndStartDrawFieldMessageBox(str);\n    return TRUE;\n}\n\n// Unused\nstatic bool8 ForceShowFieldAutoScrollMessage(const u8 *str)\n{\n    sMessageBoxType = FIELD_MESSAGE_BOX_AUTO_SCROLL;\n    ExpandStringAndStartDrawFieldMessageBox(str);\n    return TRUE;\n}\n\n// Unused\n// Same as ShowFieldMessage, but instead of accepting a string argument,\n// it just prints whatever that's already in gStringVar4\nstatic bool8 ShowFieldMessageFromBuffer(void)\n{\n    if (sMessageBoxType != FIELD_MESSAGE_BOX_HIDDEN)\n        return FALSE;\n    sMessageBoxType = FIELD_MESSAGE_BOX_NORMAL;\n    StartDrawFieldMessageBox();\n    return TRUE;\n}\n\nstatic void ExpandStringAndStartDrawFieldMessageBox(const u8 *str)\n{\n    StringExpandPlaceholders(gStringVar4, str);\n    AddTextPrinterDiffStyle(TRUE);\n    CreateTask_DrawFieldMessageBox();\n}\n\nstatic void StartDrawFieldMessageBox(void)\n{\n    AddTextPrinterDiffStyle(TRUE);\n    CreateTask_DrawFieldMessageBox();\n}\n\nvoid HideFieldMessageBox(void)\n{\n    DestroyTask_DrawFieldMessageBox();\n    ClearDialogWindowAndFrame(0, TRUE);\n    sMessageBoxType = FIELD_MESSAGE_BOX_HIDDEN;\n}\n\nu8 GetFieldMessageBoxType(void)\n{\n    return sMessageBoxType;\n}\n\nbool8 IsFieldMessageBoxHidden(void)\n{\n    if (sMessageBoxType == FIELD_MESSAGE_BOX_HIDDEN)\n        return TRUE;\n    else\n        return FALSE;\n}\n\n// Unused\nstatic void ReplaceFieldMessageWithFrame(void)\n{\n    DestroyTask_DrawFieldMessageBox();\n    DrawStdWindowFrame(0, TRUE);\n    sMessageBoxType = FIELD_MESSAGE_BOX_HIDDEN;\n}\n"
  },
  {
    "path": "src/field_player_avatar.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"bike.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"fieldmap.h\"\n#include \"field_camera.h\"\n#include \"field_control_avatar.h\"\n#include \"field_effect.h\"\n#include \"field_effect_helpers.h\"\n#include \"field_player_avatar.h\"\n#include \"help_system.h\"\n#include \"metatile_behavior.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"quest_log.h\"\n#include \"quest_log_player.h\"\n#include \"random.h\"\n#include \"script.h\"\n#include \"strings.h\"\n#include \"wild_encounter.h\"\n#include \"constants/abilities.h\"\n#include \"constants/event_object_movement.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/songs.h\"\n#include \"constants/metatile_behaviors.h\"\n#include \"constants/moves.h\"\n#include \"constants/trainer_types.h\"\n\nstatic EWRAM_DATA struct ObjectEvent * sPlayerObjectPtr = NULL;\nstatic EWRAM_DATA u8 sTeleportSavedFacingDirection = DIR_NONE;\nEWRAM_DATA struct ObjectEvent gObjectEvents[OBJECT_EVENTS_COUNT] = {};\nEWRAM_DATA struct PlayerAvatar gPlayerAvatar = {};\n\nstatic u8 ObjectEventCB2_NoMovement2(struct ObjectEvent * object, struct Sprite *sprite);\nstatic bool8 TryUpdatePlayerSpinDirection(void);\nstatic bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent * playerObjEvent, u8 direction);\nstatic void npc_clear_strange_bits(struct ObjectEvent * playerObjEvent);\nstatic bool8 TryDoMetatileBehaviorForcedMovement(void);\nstatic void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 heldKeys);\nstatic void PlayerAllowForcedMovementIfMovingSameDirection(void);\nstatic bool8 ForcedMovement_None(void);\nstatic bool8 ForcedMovement_Slip(void);\nstatic bool8 ForcedMovement_WalkSouth(void);\nstatic bool8 ForcedMovement_WalkNorth(void);\nstatic bool8 ForcedMovement_WalkWest(void);\nstatic bool8 ForcedMovement_WalkEast(void);\nstatic bool8 ForcedMovement_SpinRight(void);\nstatic bool8 ForcedMovement_SpinLeft(void);\nstatic bool8 ForcedMovement_SpinUp(void);\nstatic bool8 ForcedMovement_SpinDown(void);\nstatic void PlaySpinSound(void);\nstatic bool8 ForcedMovement_PushedSouthByCurrent(void);\nstatic bool8 ForcedMovement_PushedNorthByCurrent(void);\nstatic bool8 ForcedMovement_PushedWestByCurrent(void);\nstatic bool8 ForcedMovement_PushedEastByCurrent(void);\nstatic bool8 ForcedMovement_SlideSouth(void);\nstatic bool8 ForcedMovement_SlideNorth(void);\nstatic bool8 ForcedMovement_SlideWest(void);\nstatic bool8 ForcedMovement_SlideEast(void);\nstatic bool8 ForcedMovement_MatJump(void);\nstatic bool8 ForcedMovement_MatSpin(void);\nstatic u8 CheckMovementInputNotOnBike(u8 direction);\nstatic void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys);\nstatic void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys);\nstatic void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys);\nstatic u8 CheckForPlayerAvatarCollision(u8 direction);\nstatic bool8 CanStopSurfing(s16 x, s16 y, u8 direction);\nstatic bool8 ShouldJumpLedge(s16 x, s16 y, u8 direction);\nstatic bool8 TryPushBoulder(s16 x, s16 y, u8 direction);\nstatic void CheckAcroBikeCollision(s16 x, s16 y, u8 metatileBehavior, u8 *collision);\nstatic void DoPlayerAvatarTransition(void);\nstatic void PlayerAvatarTransition_Dummy(struct ObjectEvent * playerObject);\nstatic void PlayerAvatarTransition_Normal(struct ObjectEvent * playerObject);\nstatic void PlayerAvatarTransition_Bike(struct ObjectEvent * playerObject);\nstatic void PlayerAvatarTransition_Surfing(struct ObjectEvent * playerObject);\nstatic void PlayerAvatarTransition_Underwater(struct ObjectEvent * playerObject);\nstatic void PlayerAvatarTransition_ReturnToField(struct ObjectEvent * playerObject);\nstatic bool8 PlayerIsAnimActive(void);\nstatic bool8 PlayerCheckIfAnimFinishedOrInactive(void);\nstatic bool8 PlayerAnimIsMultiFrameStationary(void);\nstatic bool8 PlayerAnimIsMultiFrameStationaryAndStateNotTurning(void);\nstatic void PlayCollisionSoundIfNotFacingWarp(u8 direction);\nstatic void PlayerGoSpin(u8 direction);\nstatic void PlayerApplyTileForcedMovement(u8 metatileBehavior);\nstatic bool8 MetatileAtCoordsIsWaterTile(s16 x, s16 y);\nstatic void HandleWarpArrowSpriteHideShow(struct ObjectEvent * playerObjEvent);\nstatic void StartStrengthAnim(u8 objectEventId, u8 direction);\nstatic void Task_BumpBoulder(u8 taskId);\nstatic bool8 DoBoulderInit(struct Task *task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj);\nstatic bool8 DoBoulderDust(struct Task *task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj);\nstatic bool8 DoBoulderFinish(struct Task *task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj);\nstatic void DoPlayerMatJump(void);\nstatic void DoPlayerAvatarSecretBaseMatJump(u8 taskId);\nstatic bool8 PlayerAvatar_DoSecretBaseMatJump(struct Task *task, struct ObjectEvent * playerObj);\nstatic void DoPlayerMatSpin(void);\nstatic void PlayerAvatar_DoSecretBaseMatSpin(u8 taskId);\nstatic bool8 PlayerAvatar_SecretBaseMatSpinStep0(struct Task *task, struct ObjectEvent * playerObj);\nstatic bool8 PlayerAvatar_SecretBaseMatSpinStep1(struct Task *task, struct ObjectEvent * playerObj);\nstatic bool8 PlayerAvatar_SecretBaseMatSpinStep2(struct Task *task, struct ObjectEvent * playerObj);\nstatic bool8 PlayerAvatar_SecretBaseMatSpinStep3(struct Task *task, struct ObjectEvent * playerObj);\nstatic void CreateStopSurfingTask(u8 direction);\nstatic void Task_StopSurfingInit(u8 taskId);\nstatic void Task_WaitStopSurfing(u8 taskId);\nstatic void Task_Fishing(u8 taskId);\nstatic bool8 Fishing1(struct Task *task);\nstatic bool8 Fishing2(struct Task *task);\nstatic bool8 Fishing3(struct Task *task);\nstatic bool8 Fishing4(struct Task *task);\nstatic bool8 Fishing5(struct Task *task);\nstatic bool8 Fishing6(struct Task *task);\nstatic bool8 Fishing7(struct Task *task);\nstatic bool8 Fishing8(struct Task *task);\nstatic bool8 Fishing9(struct Task *task);\nstatic bool8 Fishing10(struct Task *task);\nstatic bool8 Fishing11(struct Task *task);\nstatic bool8 Fishing12(struct Task *task);\nstatic bool8 Fishing13(struct Task *task);\nstatic bool8 Fishing14(struct Task *task);\nstatic bool8 Fishing15(struct Task *task);\nstatic bool8 Fishing16(struct Task *task);\nstatic void Task_TeleportWarpOutPlayerAnim(u8 taskId);\nstatic void Task_TeleportWarpInPlayerAnim(u8 taskId);\nstatic u8 TeleportAnim_RotatePlayer(struct ObjectEvent * object, s16 *timer);\n\nvoid MovementType_Player(struct Sprite *sprite)\n{\n    UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, ObjectEventCB2_NoMovement2);\n}\n\nstatic u8 ObjectEventCB2_NoMovement2(struct ObjectEvent * object, struct Sprite *sprite)\n{\n    return 0;\n}\n\nvoid player_step(u8 direction, u16 newKeys, u16 heldKeys)\n{\n    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n    HandleWarpArrowSpriteHideShow(playerObjEvent);\n    if (!gPlayerAvatar.preventStep && !TryUpdatePlayerSpinDirection())\n    {\n        if (!TryInterruptObjectEventSpecialAnim(playerObjEvent, direction))\n        {\n            npc_clear_strange_bits(playerObjEvent);\n            DoPlayerAvatarTransition();\n            if (!TryDoMetatileBehaviorForcedMovement())\n            {\n                MovePlayerAvatarUsingKeypadInput(direction, newKeys, heldKeys);\n                PlayerAllowForcedMovementIfMovingSameDirection();\n            }\n        }\n    }\n}\n\nstatic bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent *playerObjEvent, u8 direction)\n{\n\n    if (ObjectEventIsMovementOverridden(playerObjEvent)\n        && !ObjectEventClearHeldMovementIfFinished(playerObjEvent))\n    {\n        u8 heldMovementActionId = ObjectEventGetHeldMovementActionId(playerObjEvent);\n        if (heldMovementActionId > MOVEMENT_ACTION_WALK_FAST_RIGHT && heldMovementActionId < MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN)\n        {\n            if (direction != DIR_NONE && playerObjEvent->movementDirection != direction)\n            {\n                ObjectEventClearHeldMovement(playerObjEvent);\n                return FALSE;\n            }\n        }\n\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic void npc_clear_strange_bits(struct ObjectEvent *objEvent)\n{\n    objEvent->inanimate = FALSE;\n    objEvent->disableAnim = FALSE;\n    objEvent->facingDirectionLocked = FALSE;\n    gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_DASH;\n}\n\nstatic void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 heldKeys)\n{\n    if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE)\n        || (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE))\n        MovePlayerOnBike(direction, newKeys, heldKeys);\n    else\n        MovePlayerNotOnBike(direction, heldKeys);\n}\n\nstatic void PlayerAllowForcedMovementIfMovingSameDirection(void)\n{\n    if (gPlayerAvatar.runningState == MOVING)\n        gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_CONTROLLABLE;\n}\n\nstatic bool8 TryUpdatePlayerSpinDirection(void)\n{\n    if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED) && MetatileBehavior_IsSpinTile(gPlayerAvatar.lastSpinTile))\n    {\n        sPlayerObjectPtr = &gObjectEvents[gPlayerAvatar.objectEventId];\n        if (sPlayerObjectPtr->heldMovementFinished)\n        {\n            if (MetatileBehavior_IsStopSpinning(sPlayerObjectPtr->currentMetatileBehavior))\n            {\n                return FALSE;\n            }\n            if (MetatileBehavior_IsSpinTile(sPlayerObjectPtr->currentMetatileBehavior))\n            {\n                gPlayerAvatar.lastSpinTile = sPlayerObjectPtr->currentMetatileBehavior;\n            }\n            ObjectEventClearHeldMovement(sPlayerObjectPtr);\n            PlayerApplyTileForcedMovement(gPlayerAvatar.lastSpinTile);\n        }\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic const struct {\n    bool8 (*check)(u8 metatileBehavior);\n    bool8 (*apply)(void);\n} sForcedMovementFuncs[] = {\n    {MetatileBehavior_IsTrickHouseSlipperyFloor, ForcedMovement_Slip},\n    {MetatileBehavior_IsIce_2, ForcedMovement_Slip},\n    {MetatileBehavior_IsWalkSouth, ForcedMovement_WalkSouth},\n    {MetatileBehavior_IsWalkNorth, ForcedMovement_WalkNorth},\n    {MetatileBehavior_IsWalkWest, ForcedMovement_WalkWest},\n    {MetatileBehavior_IsWalkEast, ForcedMovement_WalkEast},\n    {MetatileBehavior_IsSouthwardCurrent, ForcedMovement_PushedSouthByCurrent},\n    {MetatileBehavior_IsNorthwardCurrent, ForcedMovement_PushedNorthByCurrent},\n    {MetatileBehavior_IsWestwardCurrent, ForcedMovement_PushedWestByCurrent},\n    {MetatileBehavior_IsEastwardCurrent, ForcedMovement_PushedEastByCurrent},\n    {MetatileBehavior_IsSpinRight, ForcedMovement_SpinRight},\n    {MetatileBehavior_IsSpinLeft, ForcedMovement_SpinLeft},\n    {MetatileBehavior_IsSpinUp, ForcedMovement_SpinUp},\n    {MetatileBehavior_IsSpinDown, ForcedMovement_SpinDown},\n    {MetatileBehavior_IsSlideSouth, ForcedMovement_SlideSouth},\n    {MetatileBehavior_IsSlideNorth, ForcedMovement_SlideNorth},\n    {MetatileBehavior_IsSlideWest, ForcedMovement_SlideWest},\n    {MetatileBehavior_IsSlideEast, ForcedMovement_SlideEast},\n    {MetatileBehavior_IsWaterfall, ForcedMovement_PushedSouthByCurrent},\n    {MetatileBehavior_IsSecretBaseJumpMat, ForcedMovement_MatJump},\n    {MetatileBehavior_IsSecretBaseSpinMat, ForcedMovement_MatSpin},\n    {NULL, ForcedMovement_None},\n};\n\nstatic bool8 TryDoMetatileBehaviorForcedMovement(void)\n{\n    int i;\n    u8 behavior;\n    if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_CONTROLLABLE))\n    {\n        behavior = gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior;\n        for (i = 0; sForcedMovementFuncs[i].check != NULL; i++)\n        {\n            if (sForcedMovementFuncs[i].check(behavior))\n            {\n                gPlayerAvatar.lastSpinTile = behavior;\n                return sForcedMovementFuncs[i].apply();\n            }\n        }\n        return sForcedMovementFuncs[i].apply();\n    }\n    else\n    {\n        // Calls ForcedMovement_None but with extra steps\n        for (i = 0; sForcedMovementFuncs[i].check != NULL; i++)\n            ;\n        return sForcedMovementFuncs[i].apply();\n    }\n}\n\nstatic bool8 ForcedMovement_None(void)\n{\n    if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED)\n    {\n        struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n        playerObjEvent->facingDirectionLocked = FALSE;\n        playerObjEvent->enableAnim = TRUE;\n        SetObjectEventDirection(playerObjEvent, playerObjEvent->facingDirection);\n        gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_FORCED;\n    }\n    return FALSE;\n}\n\nstatic u8 DoForcedMovement(u8 direction, MovementAction movementAction)\n{\n    struct PlayerAvatar *playerAvatar = &gPlayerAvatar;\n    u8 collision = CheckForPlayerAvatarCollision(direction);\n\n    playerAvatar->flags |= PLAYER_AVATAR_FLAG_FORCED;\n    if (collision)\n    {\n        ForcedMovement_None();\n        if (collision < COLLISION_STOP_SURFING)\n        {\n            return 0;\n        }\n        else\n        {\n            if (collision == COLLISION_LEDGE_JUMP)\n                PlayerJumpLedge(direction);\n            playerAvatar->flags |= PLAYER_AVATAR_FLAG_FORCED;\n            playerAvatar->runningState = MOVING;\n            return 1;\n        }\n    }\n    else\n    {\n        playerAvatar->runningState = MOVING;\n        movementAction(direction);\n        return 1;\n    }\n}\n\nstatic u8 DoForcedMovementInCurrentDirection(MovementAction movementAction)\n{\n    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n    playerObjEvent->disableAnim = TRUE;\n    return DoForcedMovement(playerObjEvent->movementDirection, movementAction);\n}\n\nstatic bool8 ForcedMovement_Slip(void)\n{\n    return DoForcedMovementInCurrentDirection(PlayerWalkFast);\n}\n\nstatic bool8 ForcedMovement_WalkSouth(void)\n{\n    return DoForcedMovement(DIR_SOUTH, PlayerWalkNormal);\n}\n\nstatic bool8 ForcedMovement_WalkNorth(void)\n{\n    return DoForcedMovement(DIR_NORTH, PlayerWalkNormal);\n}\n\nstatic bool8 ForcedMovement_WalkWest(void)\n{\n    return DoForcedMovement(DIR_WEST, PlayerWalkNormal);\n}\n\nstatic bool8 ForcedMovement_WalkEast(void)\n{\n    return DoForcedMovement(DIR_EAST, PlayerWalkNormal);\n}\n\nstatic bool8 ForcedMovement_SpinRight(void)\n{\n    PlaySpinSound();\n    return DoForcedMovement(DIR_EAST, PlayerGoSpin);\n}\n\nstatic bool8 ForcedMovement_SpinLeft(void)\n{\n    PlaySpinSound();\n    return DoForcedMovement(DIR_WEST, PlayerGoSpin);\n}\n\nstatic bool8 ForcedMovement_SpinUp(void)\n{\n    PlaySpinSound();\n    return DoForcedMovement(DIR_NORTH, PlayerGoSpin);\n}\n\nstatic bool8 ForcedMovement_SpinDown(void)\n{\n    PlaySpinSound();\n    return DoForcedMovement(DIR_SOUTH, PlayerGoSpin);\n}\n\nstatic void PlaySpinSound(void)\n{\n    PlaySE(SE_M_RAZOR_WIND2);\n}\n\nstatic bool8 ForcedMovement_PushedSouthByCurrent(void)\n{\n    return DoForcedMovement(DIR_SOUTH, PlayerRideWaterCurrent);\n}\n\nstatic bool8 ForcedMovement_PushedNorthByCurrent(void)\n{\n    return DoForcedMovement(DIR_NORTH, PlayerRideWaterCurrent);\n}\n\nstatic bool8 ForcedMovement_PushedWestByCurrent(void)\n{\n    return DoForcedMovement(DIR_WEST, PlayerRideWaterCurrent);\n}\n\nstatic bool8 ForcedMovement_PushedEastByCurrent(void)\n{\n    return DoForcedMovement(DIR_EAST, PlayerRideWaterCurrent);\n}\n\nstatic u8 ForcedMovement_Slide(u8 direction, MovementAction movementAction)\n{\n    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n    playerObjEvent->disableAnim = TRUE;\n    playerObjEvent->facingDirectionLocked = TRUE;\n    return DoForcedMovement(direction, movementAction);\n}\n\nstatic bool8 ForcedMovement_SlideSouth(void)\n{\n    return ForcedMovement_Slide(DIR_SOUTH, PlayerWalkFast);\n}\n\nstatic bool8 ForcedMovement_SlideNorth(void)\n{\n    return ForcedMovement_Slide(DIR_NORTH, PlayerWalkFast);\n}\n\nstatic bool8 ForcedMovement_SlideWest(void)\n{\n    return ForcedMovement_Slide(DIR_WEST, PlayerWalkFast);\n}\n\nstatic bool8 ForcedMovement_SlideEast(void)\n{\n    return ForcedMovement_Slide(DIR_EAST, PlayerWalkFast);\n}\n\nstatic bool8 ForcedMovement_MatJump(void)\n{\n    DoPlayerMatJump();\n    return TRUE;\n}\n\nstatic bool8 ForcedMovement_MatSpin(void)\n{\n    DoPlayerMatSpin();\n    return TRUE;\n}\n\nstatic void (*const sPlayerNotOnBikeFuncs[])(u8, u16) = {\n    PlayerNotOnBikeNotMoving,\n    PlayerNotOnBikeTurningInPlace,\n    PlayerNotOnBikeMoving\n};\n\nvoid MovePlayerNotOnBike(u8 direction, u16 heldKeys)\n{\n    sPlayerNotOnBikeFuncs[CheckMovementInputNotOnBike(direction)](direction, heldKeys);\n}\n\nstatic u8 CheckMovementInputNotOnBike(u8 direction)\n{\n    if (direction == DIR_NONE)\n    {\n        gPlayerAvatar.runningState = NOT_MOVING;\n        return 0;\n    }\n    else if (direction != GetPlayerMovementDirection() && gPlayerAvatar.runningState != MOVING)\n    {\n        gPlayerAvatar.runningState = TURN_DIRECTION;\n        return 1;\n    }\n    else\n    {\n        gPlayerAvatar.runningState = MOVING;\n        return 2;\n    }\n}\n\nstatic void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys)\n{\n    PlayerFaceDirection(GetPlayerFacingDirection());\n}\n\nstatic void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys)\n{\n    PlayerTurnInPlace(direction);\n}\n\nstatic void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys)\n{\n    u8 collision = CheckForPlayerAvatarCollision(direction);\n\n    if (collision != COLLISION_NONE)\n    {\n        if (collision == COLLISION_LEDGE_JUMP)\n        {\n            PlayerJumpLedge(direction);\n        }\n        else if (collision == COLLISION_DIRECTIONAL_STAIR_WARP)\n        {\n            PlayerFaceDirection(direction);\n        }\n        else if (collision != COLLISION_STOP_SURFING\n              && collision != COLLISION_LEDGE_JUMP\n              && collision != COLLISION_PUSHED_BOULDER\n              && collision != COLLISION_DIRECTIONAL_STAIR_WARP)\n        {\n            PlayerNotOnBikeCollide(direction);\n        }\n        return;\n    }\n\n    if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING))\n    {\n        if(FlagGet(FLAG_AUTO_RUN_TOGGLED))\n        {\n            if(heldKeys & B_BUTTON)\n                // speed 2 is fast, same speed as running\n                PlayerWalkFast(direction);\n            else\n                PlayerWalkFaster(direction);\n        }\n        else\n        {\n            if(heldKeys & B_BUTTON)\n                PlayerWalkFaster(direction);\n            else\n                // speed 2 is fast, same speed as running\n                PlayerWalkFast(direction);\n        }\n        return;\n    }\n\n    if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_UNDERWATER)\n    {\n        // Same speed as running\n        PlayerWalkFast(direction);\n        return;\n    }\n\n    if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_UNDERWATER) && (heldKeys & B_BUTTON || FlagGet(FLAG_AUTO_RUN_TOGGLED))\n        && !IsRunningDisallowed(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior))\n    {\n        //if running\n        if (PlayerIsMovingOnRockStairs(direction))\n        {\n            if(heldKeys & B_BUTTON && FlagGet(FLAG_AUTO_RUN_TOGGLED))\n            {\n                //autorun toggled but B pressed, walk\n                PlayerWalkSlow(direction);\n            }\n            else\n            {\n                PlayerRunSlow(direction);\n                gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH;\n            }\n        }\n        else\n        {\n            if(heldKeys & B_BUTTON && FlagGet(FLAG_AUTO_RUN_TOGGLED))\n            {\n                //autorun toggled but B pressed, walk\n                PlayerWalkNormal(direction);\n            }\n            else\n            {\n                PlayerRun(direction);\n                gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH;\n            }\n        }\n        return;\n    }\n    else\n    {\n        if (PlayerIsMovingOnRockStairs(direction))\n            PlayerWalkSlow(direction);\n        else\n            PlayerWalkNormal(direction);\n    }\n}\n\nbool32 PlayerIsMovingOnRockStairs(u8 direction)\n{\n    struct ObjectEvent * objectEvent;\n    s16 x, y;\n\n    objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    x = objectEvent->currentCoords.x;\n    y = objectEvent->currentCoords.y;\n    switch (direction)\n    {\n    case DIR_NORTH:\n        return MetatileBehavior_IsRockStairs(MapGridGetMetatileBehaviorAt(x, y));\n    case DIR_SOUTH:\n        MoveCoords(DIR_SOUTH, &x, &y);\n        return MetatileBehavior_IsRockStairs(MapGridGetMetatileBehaviorAt(x, y));\n    default:\n        return FALSE;\n    }\n}\n\nstatic u8 CheckForPlayerAvatarCollision(u8 direction)\n{\n    s16 x, y;\n    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n    x = playerObjEvent->currentCoords.x;\n    y = playerObjEvent->currentCoords.y;\n    if (IsDirectionalStairWarpMetatileBehavior(MapGridGetMetatileBehaviorAt(x, y), direction))\n        return COLLISION_DIRECTIONAL_STAIR_WARP;\n    MoveCoords(direction, &x, &y);\n    return CheckForObjectEventCollision(playerObjEvent, x, y, direction, MapGridGetMetatileBehaviorAt(x, y));\n}\n\nu8 CheckForObjectEventCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction, u8 metatileBehavior)\n{\n    u8 collision = GetCollisionAtCoords(objectEvent, x, y, direction);\n    if (collision == COLLISION_ELEVATION_MISMATCH && CanStopSurfing(x, y, direction))\n        return COLLISION_STOP_SURFING;\n\n    if (ShouldJumpLedge(x, y, direction))\n    {\n        IncrementGameStat(GAME_STAT_JUMPED_DOWN_LEDGES);\n        return COLLISION_LEDGE_JUMP;\n    }\n    if (collision == COLLISION_OBJECT_EVENT && TryPushBoulder(x, y, direction))\n        return COLLISION_PUSHED_BOULDER;\n\n    if (collision == COLLISION_NONE)\n    {\n        CheckAcroBikeCollision(x, y, metatileBehavior, &collision);\n    }\n    return collision;\n}\n\nstatic const u8 sQuestLogSurfDismountActionIds[] = {\n    QL_PLAYER_GFX_STOP_SURF_S,\n    QL_PLAYER_GFX_STOP_SURF_S,\n    QL_PLAYER_GFX_STOP_SURF_N,\n    QL_PLAYER_GFX_STOP_SURF_W,\n    QL_PLAYER_GFX_STOP_SURF_E\n};\n\nstatic bool8 CanStopSurfing(s16 x, s16 y, u8 direction)\n{\n    if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)\n        && MapGridGetElevationAt(x, y) == 3\n        && GetObjectEventIdByPosition(x, y, 3) == OBJECT_EVENTS_COUNT)\n    {\n        QuestLogRecordPlayerAvatarGfxTransitionWithDuration(sQuestLogSurfDismountActionIds[direction], 16);\n        CreateStopSurfingTask(direction);\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nstatic bool8 ShouldJumpLedge(s16 x, s16 y, u8 direction)\n{\n    if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic bool8 TryPushBoulder(s16 x, s16 y, u8 direction)\n{\n    u8 objectEventId;\n    u8 direction_ = direction;\n    if (!FlagGet(FLAG_SYS_USE_STRENGTH))\n        return FALSE;\n\n    objectEventId = GetObjectEventIdByXY(x, y);\n    if (objectEventId == OBJECT_EVENTS_COUNT)\n        return FALSE;\n\n    if (gObjectEvents[objectEventId].graphicsId != OBJ_EVENT_GFX_PUSHABLE_BOULDER)\n        return FALSE;\n\n    x = gObjectEvents[objectEventId].currentCoords.x;\n    y = gObjectEvents[objectEventId].currentCoords.y;\n    MoveCoords(direction_, &x, &y);\n    if (MapGridGetMetatileBehaviorAt(x, y) == MB_FALL_WARP || (GetCollisionAtCoords(&gObjectEvents[objectEventId], x, y, direction_) == COLLISION_NONE && !MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(x, y))))\n    {\n        StartStrengthAnim(objectEventId, direction_);\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nstatic bool8 (*const sAcroBikeTrickMetatiles[])(u8) = {\n    MetatileBehavior_IsBumpySlope,\n    MetatileBehavior_IsIsolatedVerticalRail,\n    MetatileBehavior_IsIsolatedHorizontalRail,\n    MetatileBehavior_IsVerticalRail,\n    MetatileBehavior_IsHorizontalRail\n};\n\nstatic const u8 sAcroBikeTrickCollisionTypes[] = {\n    COLLISION_WHEELIE_HOP,\n    COLLISION_ISOLATED_VERTICAL_RAIL,\n    COLLISION_ISOLATED_HORIZONTAL_RAIL,\n    COLLISION_VERTICAL_RAIL,\n    COLLISION_HORIZONTAL_RAIL,\n};\n\nstatic void CheckAcroBikeCollision(s16 x, s16 y, u8 metatileBehavior, u8 *collision)\n{\n    u32 i;\n\n    for (i = 0; i < NELEMS(sAcroBikeTrickMetatiles); i++)\n    {\n        if (sAcroBikeTrickMetatiles[i](metatileBehavior))\n        {\n            *collision = sAcroBikeTrickCollisionTypes[i];\n            return;\n        }\n    }\n}\n\nvoid SetPlayerAvatarTransitionFlags(u16 flags)\n{\n    gPlayerAvatar.transitionFlags |= flags;\n    DoPlayerAvatarTransition();\n}\n\nstatic void (*const sPlayerAvatarTransitionFuncs[])(struct ObjectEvent *) = {\n    [PLAYER_AVATAR_STATE_NORMAL]       = PlayerAvatarTransition_Normal,\n    [PLAYER_AVATAR_STATE_MACH_BIKE]    = PlayerAvatarTransition_Bike,\n    [PLAYER_AVATAR_STATE_ACRO_BIKE]    = PlayerAvatarTransition_Bike,\n    [PLAYER_AVATAR_STATE_SURFING]      = PlayerAvatarTransition_Surfing,\n    [PLAYER_AVATAR_STATE_UNDERWATER]   = PlayerAvatarTransition_Underwater,\n    [PLAYER_AVATAR_STATE_CONTROLLABLE] = PlayerAvatarTransition_ReturnToField,\n    [PLAYER_AVATAR_STATE_FORCED]       = PlayerAvatarTransition_Dummy,\n    [PLAYER_AVATAR_STATE_DASH]         = PlayerAvatarTransition_Dummy\n};\n\nstatic void DoPlayerAvatarTransition(void)\n{\n    u32 i;\n    u8 flags = gPlayerAvatar.transitionFlags;\n\n    if (flags != 0)\n    {\n        for (i = 0; i < NELEMS(sPlayerAvatarTransitionFuncs); i++, flags >>= 1)\n        {\n            if (flags & 1)\n                sPlayerAvatarTransitionFuncs[i](&gObjectEvents[gPlayerAvatar.objectEventId]);\n        }\n        gPlayerAvatar.transitionFlags = 0;\n    }\n}\n\nstatic void PlayerAvatarTransition_Dummy(struct ObjectEvent * playerObjEvent)\n{\n\n}\n\nstatic void PlayerAvatarTransition_Normal(struct ObjectEvent * playerObjEvent)\n{\n    QuestLogTryRecordPlayerAvatarGfxTransition(QL_PLAYER_GFX_NORMAL);\n    QuestLogCallUpdatePlayerSprite(QL_PLAYER_GFX_NORMAL);\n}\n\nstatic void PlayerAvatarTransition_Bike(struct ObjectEvent * playerObjEvent)\n{\n    QuestLogTryRecordPlayerAvatarGfxTransition(QL_PLAYER_GFX_BIKE);\n    QuestLogCallUpdatePlayerSprite(QL_PLAYER_GFX_BIKE);\n    BikeClearState(0, 0);\n}\n\nstatic void PlayerAvatarTransition_Surfing(struct ObjectEvent * playerObjEvent)\n{\n    QuestLogTryRecordPlayerAvatarGfxTransition(QL_PLAYER_GFX_SURF);\n    QuestLogCallUpdatePlayerSprite(QL_PLAYER_GFX_SURF);\n}\n\nstatic void PlayerAvatarTransition_Underwater(struct ObjectEvent * playerObjEvent)\n{\n    u8 facingDirection = playerObjEvent->facingDirection;\n    s16 x = playerObjEvent->currentCoords.x;\n    s16 y = playerObjEvent->currentCoords.y;\n    \n    RemoveObjectEvent(playerObjEvent);\n    InitDivingPlayerAvatar(x, y, facingDirection, gSaveBlock2Ptr->playerGender);\n    //ObjectEventSetGraphicsId(playerObjEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_UNDERWATER));\n    //ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection);\n    SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_UNDERWATER);\n    gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId = StartUnderwaterSurfBlobBobbing(gPlayerAvatar.spriteId);\n}\n\nstatic void PlayerAvatarTransition_ReturnToField(struct ObjectEvent * playerObjEvent)\n{\n    gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_CONTROLLABLE;\n}\n\nvoid UpdatePlayerAvatarTransitionState(void)\n{\n    gPlayerAvatar.tileTransitionState = T_NOT_MOVING;\n    if (PlayerIsAnimActive())\n    {\n        if (!PlayerCheckIfAnimFinishedOrInactive())\n        {\n            if (!PlayerAnimIsMultiFrameStationary())\n                gPlayerAvatar.tileTransitionState = T_TILE_TRANSITION;\n        }\n        else\n        {\n            if (!PlayerAnimIsMultiFrameStationaryAndStateNotTurning())\n                gPlayerAvatar.tileTransitionState = T_TILE_CENTER;\n        }\n    }\n}\n\nstatic bool8 PlayerAnimIsMultiFrameStationary(void)\n{\n    u8 movementActionId = gObjectEvents[gPlayerAvatar.objectEventId].movementActionId;\n\n    if (movementActionId <= MOVEMENT_ACTION_FACE_RIGHT_FAST\n        || (movementActionId >= MOVEMENT_ACTION_DELAY_1 && movementActionId <= MOVEMENT_ACTION_DELAY_16)\n        || (movementActionId >= MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN && movementActionId <= MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT)\n        || (movementActionId >= MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN && movementActionId <= MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT)\n        || (movementActionId >= MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN && movementActionId <= MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT))\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic bool8 PlayerAnimIsMultiFrameStationaryAndStateNotTurning(void)\n{\n    if (PlayerAnimIsMultiFrameStationary() && gPlayerAvatar.runningState != TURN_DIRECTION)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic bool8 PlayerIsAnimActive(void)\n{\n    return ObjectEventIsMovementOverridden(&gObjectEvents[gPlayerAvatar.objectEventId]);\n}\n\nstatic bool8 PlayerCheckIfAnimFinishedOrInactive(void)\n{\n    return ObjectEventCheckHeldMovementStatus(&gObjectEvents[gPlayerAvatar.objectEventId]);\n}\n\nstatic void PlayerSetCopyableMovement(u8 a)\n{\n    gObjectEvents[gPlayerAvatar.objectEventId].playerCopyableMovement = a;\n}\n\nu8 PlayerGetCopyableMovement(void)\n{\n    return gObjectEvents[gPlayerAvatar.objectEventId].playerCopyableMovement;\n}\n\nstatic void PlayerForceSetHeldMovement(u8 a)\n{\n    ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], a);\n}\n\nstatic void PlayerSetAnimId(u8 movementActionId, u8 copyableMovement)\n{\n    if (!PlayerIsAnimActive())\n    {\n        PlayerSetCopyableMovement(copyableMovement);\n        if (!ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], movementActionId))\n            QuestLogRecordPlayerStep(movementActionId);\n    }\n}\n\nstatic void QL_TryRecordPlayerStepWithDuration0(struct ObjectEvent * objectEvent, u8 movementAction)\n{\n    if (!ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], movementAction))\n        QuestLogRecordPlayerStepWithDuration(movementAction, 0);\n}\n\nstatic void QL_TryRecordNPCStepWithDuration32(struct ObjectEvent * objectEvent, u8 movementAction)\n{\n    if (!ObjectEventSetHeldMovement(objectEvent, movementAction))\n        QuestLogRecordNPCStepWithDuration(objectEvent->localId, objectEvent->mapNum, objectEvent->mapGroup, movementAction, 32);\n}\n\nvoid PlayerWalkSlower(u8 direction)\n{\n    PlayerSetAnimId(GetWalkSlowerMovementAction(direction), 2);\n}\n\nvoid PlayerWalkSlow(u8 direction)\n{\n    PlayerSetAnimId(GetWalkSlowMovementAction(direction), 2);\n}\n\nvoid PlayerWalkNormal(u8 direction)\n{\n    PlayerSetAnimId(GetWalkNormalMovementAction(direction), 2);\n}\n\nvoid PlayerWalkFast(u8 direction)\n{\n    PlayerSetAnimId(GetWalkFastMovementAction(direction), 2);\n}\n\nvoid PlayerGlide(u8 direction)\n{\n    PlayerSetAnimId(GetGlideMovementAction(direction), 2);\n}\n\nvoid PlayerRideWaterCurrent(u8 direction)\n{\n    PlayerSetAnimId(GetRideWaterCurrentMovementAction(direction), 2);\n}\n\nvoid PlayerWalkFaster(u8 direction)\n{\n    PlayerSetAnimId(GetWalkFasterMovementAction(direction), 2);\n}\n\nvoid PlayerRun(u8 direction)\n{\n    PlayerSetAnimId(GetPlayerRunMovementAction(direction), 2);\n}\n\nvoid PlayerRunSlow(u8 direction)\n{\n    PlayerSetAnimId(GetPlayerRunSlowMovementAction(direction), 2);\n}\n\nvoid PlayerOnBikeCollide(u8 direction)\n{\n    PlayCollisionSoundIfNotFacingWarp(direction);\n    PlayerSetAnimId(GetWalkInPlaceNormalMovementAction(direction), 2);\n}\n\nvoid PlayerNotOnBikeCollide(u8 direction)\n{\n    PlayCollisionSoundIfNotFacingWarp(direction);\n    PlayerSetAnimId(GetWalkInPlaceSlowMovementAction(direction), 2);\n}\n\nvoid PlayerFaceDirection(u8 direction)\n{\n    PlayerSetAnimId(GetFaceDirectionMovementAction(direction), 1);\n}\n\nvoid PlayerFaceDirectionFast(u8 direction)\n{\n    PlayerSetAnimId(GetFaceDirectionFastMovementAction(direction), 1);\n}\n\nvoid PlayerTurnInPlace(u8 direction)\n{\n    PlayerSetAnimId(GetWalkInPlaceFastMovementAction(direction), 1);\n}\n\nvoid PlayerJumpLedge(u8 direction)\n{\n    PlaySE(SE_LEDGE);\n    PlayerSetAnimId(GetJump2MovementAction(direction), 8);\n}\n\n// Shakes head for male player character,\n// walk in place for female player character\nvoid PlayerShakeHeadOrWalkInPlace(void)\n{\n    PlayerSetAnimId(MOVEMENT_ACTION_SHAKE_HEAD_OR_WALK_IN_PLACE, 0);\n}\n\nvoid HandleEnforcedLookDirectionOnPlayerStopMoving(void)\n{\n    if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING)\n    {\n        if (IsPlayerNotUsingAcroBikeOnBumpySlope())\n            PlayerForceSetHeldMovement(GetFaceDirectionMovementAction(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection));\n    }\n}\n\nstatic void PlayerGoSpin(u8 direction)\n{\n    PlayerSetAnimId(GetSpinMovementAction(direction), 3);\n}\n\nstatic void PlayerApplyTileForcedMovement(u8 metatileBehavior)\n{\n    int i;\n\n    for (i = 0; sForcedMovementFuncs[i].check != NULL; i++)\n    {\n        if (sForcedMovementFuncs[i].check(metatileBehavior))\n            sForcedMovementFuncs[i].apply();\n    }\n}\n\nstatic void PlayerIdleWheelie(u8 direction)\n{\n    PlayerSetAnimId(GetAcroWheelieFaceDirectionMovementAction(direction), 1);\n}\n\nstatic void PlayerStartWheelie(u8 direction)\n{\n    PlayerSetAnimId(GetAcroPopWheelieFaceDirectionMovementAction(direction), 1);\n}\n\nstatic void PlayerEndWheelie(u8 direction)\n{\n    PlayerSetAnimId(GetAcroEndWheelieFaceDirectionMovementAction(direction), 1);\n}\n\nstatic void PlayerStandingHoppingWheelie(u8 direction)\n{\n    PlaySE(SE_BIKE_HOP);\n    PlayerSetAnimId(GetAcroWheelieHopFaceDirectionMovementAction(direction), 1);\n}\n\nstatic void PlayerMovingHoppingWheelie(u8 direction)\n{\n    PlaySE(SE_BIKE_HOP);\n    PlayerSetAnimId(GetAcroWheelieHopMovementAction(direction), 2);\n}\n\nstatic void PlayerLedgeHoppingWheelie(u8 direction)\n{\n    PlaySE(SE_BIKE_HOP);\n    PlayerSetAnimId(GetAcroWheelieJumpMovementAction(direction), 8);\n}\n\nstatic void PlayerAcroTurnJump(u8 direction)\n{\n    PlaySE(SE_BIKE_HOP);\n    PlayerSetAnimId(GetJumpInPlaceTurnAroundMovementAction(direction), 1);\n}\n\nstatic void PlayerAcroWheelieCollide(u8 direction)\n{\n    PlaySE(SE_WALL_HIT);\n    PlayerSetAnimId(GetAcroWheelieInPlaceMovementAction(direction), 2);\n}\n\nstatic void PlayerAcroPopWheelie(u8 direction)\n{\n    PlayerSetAnimId(GetAcroPopWheelieMoveMovementAction(direction), 2);\n}\n\nstatic void PlayerAcroWheelieMove(u8 direction)\n{\n    PlayerSetAnimId(GetAcroWheelieMoveMovementAction(direction), 2);\n}\n\nstatic bool8 (*const sArrowWarpMetatileBehaviorChecks[])(u8) = {\n    MetatileBehavior_IsSouthArrowWarp,\n    MetatileBehavior_IsNorthArrowWarp,\n    MetatileBehavior_IsWestArrowWarp,\n    MetatileBehavior_IsEastArrowWarp\n};\n\nstatic void PlayCollisionSoundIfNotFacingWarp(u8 direction)\n{\n    s16 x, y;\n    u8 metatileBehavior = gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior;\n\n    if (!sArrowWarpMetatileBehaviorChecks[direction - 1](metatileBehavior))\n    {\n        if (direction == DIR_WEST)\n        {\n            if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior) || MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior))\n                return;\n        }\n        if (direction == DIR_EAST)\n        {\n            if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior) || MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior))\n                return;\n        }\n        if (direction == DIR_NORTH)\n        {\n            PlayerGetDestCoords(&x, &y);\n            MoveCoords(DIR_NORTH, &x, &y);\n            metatileBehavior = MapGridGetMetatileBehaviorAt(x, y);\n            if (MetatileBehavior_IsWarpDoor(metatileBehavior))\n                return;\n        }\n        PlaySE(SE_WALL_HIT);\n    }\n}\n\nvoid GetXYCoordsOneStepInFrontOfPlayer(s16 *x, s16 *y)\n{\n    *x = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x;\n    *y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y;\n    MoveCoords(GetPlayerFacingDirection(), x, y);\n}\n\nvoid PlayerGetDestCoords(s16 *x, s16 *y)\n{\n    *x = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x;\n    *y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y;\n}\n\nu8 player_get_pos_including_state_based_drift(s16 *x, s16 *y)\n{\n    struct ObjectEvent *object = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n    if (object->heldMovementActive && !object->heldMovementFinished && !gSprites[object->spriteId].data[2])\n    {\n        *x = object->currentCoords.x;\n        *y = object->currentCoords.y;\n\n        switch (object->movementActionId)\n        {\n        case MOVEMENT_ACTION_WALK_NORMAL_DOWN:\n        case MOVEMENT_ACTION_PLAYER_RUN_DOWN:\n            (*y)++;\n            return TRUE;\n        case MOVEMENT_ACTION_WALK_NORMAL_UP:\n        case MOVEMENT_ACTION_PLAYER_RUN_UP:\n            (*y)--;\n            return TRUE;\n        case MOVEMENT_ACTION_WALK_NORMAL_LEFT:\n        case MOVEMENT_ACTION_PLAYER_RUN_LEFT:\n            (*x)--;\n            return TRUE;\n        case MOVEMENT_ACTION_WALK_NORMAL_RIGHT:\n        case MOVEMENT_ACTION_PLAYER_RUN_RIGHT:\n            (*x)++;\n            return TRUE;\n        }\n    }\n\n    *x = -1;\n    *y = -1;\n    return FALSE;\n}\n\nu8 GetPlayerFacingDirection(void)\n{\n    return gObjectEvents[gPlayerAvatar.objectEventId].facingDirection;\n}\n\nu8 GetPlayerMovementDirection(void)\n{\n    return gObjectEvents[gPlayerAvatar.objectEventId].movementDirection;\n}\n\nu8 PlayerGetElevation(void)\n{\n    return gObjectEvents[gPlayerAvatar.objectEventId].previousElevation;\n}\n\nvoid MovePlayerToMapCoords(s16 x, s16 y)\n{\n    MoveObjectEventToMapCoords(&gObjectEvents[gPlayerAvatar.objectEventId], x, y);\n}\n\nu8 TestPlayerAvatarFlags(u8 bm)\n{\n    return gPlayerAvatar.flags & bm;\n}\n\nu8 GetPlayerAvatarFlags(void)\n{\n    return gPlayerAvatar.flags;\n}\n\nu8 GetPlayerAvatarObjectId(void)\n{\n    return gPlayerAvatar.spriteId;\n}\n\nvoid CancelPlayerForcedMovement(void)\n{\n    ForcedMovement_None();\n}\n\nvoid StopPlayerAvatar(void)\n{\n    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n    npc_clear_strange_bits(playerObjEvent);\n    SetObjectEventDirection(playerObjEvent, playerObjEvent->facingDirection);\n    if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))\n    {\n        Bike_HandleBumpySlopeJump();\n        Bike_UpdateBikeCounterSpeed(0);\n    }\n}\n\n// this table originally had NOTHING to do with the player avatar state. It has been updated to be more consistent with the player avatar state flags\nstatic const u8 sPlayerAvatarGfxIds[][GENDER_COUNT] = {\n    [PLAYER_AVATAR_GFX_NORMAL]          = {OBJ_EVENT_GFX_RED_NORMAL,     OBJ_EVENT_GFX_GREEN_NORMAL},\n    [PLAYER_AVATAR_GFX_BIKE]            = {OBJ_EVENT_GFX_RED_BIKE,       OBJ_EVENT_GFX_GREEN_BIKE},\n    [PLAYER_AVATAR_GFX_RIDE]            = {OBJ_EVENT_GFX_RED_SURF,       OBJ_EVENT_GFX_GREEN_SURF},\n    [PLAYER_AVATAR_GFX_UNDERWATER]      = {OBJ_EVENT_GFX_RED_UNDERWATER, OBJ_EVENT_GFX_GREEN_UNDERWATER},  //change to dive sprite(s)\n    [PLAYER_AVATAR_GFX_FIELD_MOVE]      = {OBJ_EVENT_GFX_RED_FIELD_MOVE, OBJ_EVENT_GFX_GREEN_FIELD_MOVE},\n    [PLAYER_AVATAR_GFX_FISH]            = {OBJ_EVENT_GFX_RED_FISH,       OBJ_EVENT_GFX_GREEN_FISH},\n    [PLAYER_AVATAR_GFX_VSSEEKER]        = {OBJ_EVENT_GFX_RED_VS_SEEKER,  OBJ_EVENT_GFX_GREEN_VS_SEEKER}, //not a real state. same as PLAYER_AVATAR_STATE_WATERING (aka PLAYER_AVATAR_STATE_DASH).\n};\n\nstatic const u8 sHoennLinkPartnerGfxIds[] = {\n    OBJ_EVENT_GFX_RS_BRENDAN,\n    OBJ_EVENT_GFX_RS_MAY\n};\n\nstatic const u8 sEmeraldLinkPartnerGfxIds[] = {\n    OBJ_EVENT_GFX_EM_BRENDAN,\n    OBJ_EVENT_GFX_EM_MAY\n};\n\nu8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender)\n{\n    return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gender);\n}\n\n// game freak is dumb and decided to make this state-based table not relate to the states defined in global.fieldmap.h\nu8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender)\n{\n    return sPlayerAvatarGfxIds[state][gender];\n}\n\nu8 GetRSAvatarGraphicsIdByGender(u8 gender)\n{\n    return sHoennLinkPartnerGfxIds[gender];\n}\n\nu8 GetEMAvatarGraphicsIdByGender(u8 gender)\n{\n    return sEmeraldLinkPartnerGfxIds[gender];\n}\n\nu8 GetPlayerAvatarGraphicsIdByStateId(u8 state)\n{\n    return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender);\n}\n\nu8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId)\n{\n    switch (gfxId)\n    {\n    case OBJ_EVENT_GFX_GREEN_NORMAL:\n    case OBJ_EVENT_GFX_GREEN_BIKE:\n    case OBJ_EVENT_GFX_GREEN_SURF:\n    case OBJ_EVENT_GFX_GREEN_FIELD_MOVE:\n    case OBJ_EVENT_GFX_GREEN_FISH:\n    case OBJ_EVENT_GFX_GREEN_UNDERWATER:\n        return FEMALE;\n    default:\n        return MALE;\n    }\n}\n\nbool8 PartyHasMonWithSurf(void)\n{\n    u32 i;\n\n    if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))\n    {\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE)\n                break;\n            if (MonKnowsMove(&gPlayerParty[i], MOVE_SURF))\n                return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nbool8 IsPlayerSurfingNorth(void)\n{\n    if (GetPlayerMovementDirection() == DIR_NORTH && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 IsPlayerFacingSurfableFishableWater(void)\n{\n    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    s16 x = playerObjEvent->currentCoords.x;\n    s16 y = playerObjEvent->currentCoords.y;\n\n    MoveCoords(playerObjEvent->facingDirection, &x, &y);\n    if (GetCollisionAtCoords(playerObjEvent, x, y, playerObjEvent->facingDirection) == COLLISION_ELEVATION_MISMATCH\n        && PlayerGetElevation() == 3\n        && MetatileAtCoordsIsWaterTile(x, y) == TRUE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileAtCoordsIsWaterTile(s16 x, s16 y)\n{\n    return TestMetatileAttributeBit(MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_TERRAIN), TILE_TERRAIN_WATER);\n}\n\nvoid ClearPlayerAvatarInfo(void)\n{\n    gPlayerAvatar = (struct PlayerAvatar){};\n}\n\nvoid SetPlayerAvatarStateMask(u8 flags)\n{\n    gPlayerAvatar.flags &= (PLAYER_AVATAR_FLAG_DASH | PLAYER_AVATAR_FLAG_FORCED | PLAYER_AVATAR_FLAG_CONTROLLABLE);\n    gPlayerAvatar.flags |= flags;\n}\n\nstatic const u8 sPlayerAvatarGfxToStateFlag[][4][GENDER_COUNT] = {\n    [MALE] = {\n        {OBJ_EVENT_GFX_RED_NORMAL, PLAYER_AVATAR_FLAG_ON_FOOT},\n        {OBJ_EVENT_GFX_RED_BIKE,   PLAYER_AVATAR_FLAG_MACH_BIKE},\n        {OBJ_EVENT_GFX_RED_SURF,   PLAYER_AVATAR_FLAG_SURFING},\n        {OBJ_EVENT_GFX_RED_UNDERWATER,   PLAYER_AVATAR_FLAG_UNDERWATER},  //change to your male dive sprite\n    },\n    [FEMALE] = {\n        {OBJ_EVENT_GFX_GREEN_NORMAL, PLAYER_AVATAR_FLAG_ON_FOOT},\n        {OBJ_EVENT_GFX_GREEN_BIKE,   PLAYER_AVATAR_FLAG_MACH_BIKE},\n        {OBJ_EVENT_GFX_GREEN_SURF,   PLAYER_AVATAR_FLAG_SURFING},\n        {OBJ_EVENT_GFX_GREEN_UNDERWATER,   PLAYER_AVATAR_FLAG_UNDERWATER},  //change to your female dive sprite\n    }\n};\n\nu8 GetPlayerAvatarStateTransitionByGraphicsId(u8 graphicsId, u8 gender)\n{\n    u32 i;\n\n    for (i = 0; i < NELEMS(*sPlayerAvatarGfxToStateFlag); i++)\n    {\n        if (sPlayerAvatarGfxToStateFlag[gender][i][0] == graphicsId)\n            return sPlayerAvatarGfxToStateFlag[gender][i][1];\n    }\n    return 1;\n}\n\nu8 GetPlayerAvatarGraphicsIdByCurrentState(void)\n{\n    u32 i;\n    u8 flags = gPlayerAvatar.flags;\n\n    for (i = 0; i < NELEMS(*sPlayerAvatarGfxToStateFlag); i++)\n    {\n        if (sPlayerAvatarGfxToStateFlag[gPlayerAvatar.gender][i][1] & flags)\n            return sPlayerAvatarGfxToStateFlag[gPlayerAvatar.gender][i][0];\n    }\n    return 0;\n}\n\nvoid SetPlayerAvatarExtraStateTransition(u8 graphicsId, u8 extras)\n{\n    u8 unk = GetPlayerAvatarStateTransitionByGraphicsId(graphicsId, gPlayerAvatar.gender);\n\n    gPlayerAvatar.transitionFlags |= unk | extras;\n    DoPlayerAvatarTransition();\n}\n\nvoid InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender)\n{\n    struct ObjectEventTemplate playerObjEventTemplate;\n    u8 objectEventId;\n    struct ObjectEvent *objectEvent;\n\n    playerObjEventTemplate.localId = OBJ_EVENT_ID_PLAYER;\n    playerObjEventTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_GFX_NORMAL, gender);\n    playerObjEventTemplate.x = x - 7;\n    playerObjEventTemplate.y = y - 7;\n    playerObjEventTemplate.objUnion.normal.elevation = 0;\n    playerObjEventTemplate.objUnion.normal.movementType = MOVEMENT_TYPE_PLAYER;\n    playerObjEventTemplate.objUnion.normal.movementRangeX = 0;\n    playerObjEventTemplate.objUnion.normal.movementRangeY = 0;\n    playerObjEventTemplate.objUnion.normal.trainerType = TRAINER_TYPE_NONE;\n    playerObjEventTemplate.objUnion.normal.trainerRange_berryTreeId = 0;\n    playerObjEventTemplate.script = NULL;\n    playerObjEventTemplate.flagId = 0;\n    objectEventId = SpawnSpecialObjectEvent(&playerObjEventTemplate);\n    objectEvent = &gObjectEvents[objectEventId];\n    objectEvent->isPlayer = 1;\n    objectEvent->warpArrowSpriteId = CreateWarpArrowSprite();\n    ObjectEventTurn(objectEvent, direction);\n    ClearPlayerAvatarInfo();\n    gPlayerAvatar.runningState = NOT_MOVING;\n    gPlayerAvatar.tileTransitionState = T_NOT_MOVING;\n    gPlayerAvatar.objectEventId = objectEventId;\n    gPlayerAvatar.spriteId = objectEvent->spriteId;\n    gPlayerAvatar.gender = gender;\n    SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_CONTROLLABLE | PLAYER_AVATAR_FLAG_ON_FOOT);\n}\n\nvoid InitDivingPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender)\n{\n    struct ObjectEventTemplate playerObjEventTemplate;\n    u8 objectEventId;\n    struct ObjectEvent *objectEvent;\n\n    playerObjEventTemplate.localId = OBJ_EVENT_ID_PLAYER;\n    playerObjEventTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_GFX_UNDERWATER, gender);\n    playerObjEventTemplate.x = x - 7;\n    playerObjEventTemplate.y = y - 7;\n    playerObjEventTemplate.objUnion.normal.elevation = 0;\n    playerObjEventTemplate.objUnion.normal.movementType = MOVEMENT_TYPE_PLAYER;\n    playerObjEventTemplate.objUnion.normal.movementRangeX = 0;\n    playerObjEventTemplate.objUnion.normal.movementRangeY = 0;\n    playerObjEventTemplate.objUnion.normal.trainerType = 0;\n    playerObjEventTemplate.objUnion.normal.trainerRange_berryTreeId = 0;\n    playerObjEventTemplate.script = NULL;\n    playerObjEventTemplate.flagId = 0;\n    objectEventId = SpawnSpecialObjectEvent(&playerObjEventTemplate);\n    objectEvent = &gObjectEvents[objectEventId];\n    objectEvent->isPlayer = 1;\n    objectEvent->warpArrowSpriteId = CreateWarpArrowSprite();\n    ObjectEventTurn(objectEvent, direction);\n    ClearPlayerAvatarInfo();\n    gPlayerAvatar.runningState = NOT_MOVING;\n    gPlayerAvatar.tileTransitionState = T_NOT_MOVING;\n    gPlayerAvatar.objectEventId = objectEventId;\n    gPlayerAvatar.spriteId = objectEvent->spriteId;\n    gPlayerAvatar.gender = gender;\n    SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_CONTROLLABLE | PLAYER_AVATAR_FLAG_UNDERWATER);\n}\n\nvoid SetPlayerInvisibility(bool8 invisible)\n{\n    gObjectEvents[gPlayerAvatar.objectEventId].invisible = invisible;\n    if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))\n        gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId].invisible = invisible;\n}\n\nvoid StartPlayerAvatarSummonMonForFieldMoveAnim(void)\n{\n    ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_FIELD_MOVE));\n    StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], ANIM_FIELD_MOVE);\n}\n\nstatic const u8 sPlayerAvatarVsSeekerBikeGfxIds[] = {\n    OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE,\n    OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE\n};\n\nu8 GetPlayerAvatarVsSeekerGfxId(void)\n{\n    if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))\n        return sPlayerAvatarVsSeekerBikeGfxIds[gPlayerAvatar.gender];\n    else\n        return GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_VSSEEKER);\n}\n\nvoid StartPlayerAvatarVsSeekerAnim(void)\n{\n    ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarVsSeekerGfxId());\n    StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], ANIM_VS_SEEKER);\n}\n\nvoid StartPlayerAvatarFishAnim(u8 direction)\n{\n    QuestLogCallUpdatePlayerSprite(QL_PLAYER_GFX_FISH);\n}\n\n// Stubbed from R/S\nvoid PlayerUseAcroBikeOnBumpySlope(u8 direction)\n{\n\n}\n\nstatic void SetPlayerAvatarWatering(void)\n{\n\n}\n\nstatic bool8 (*const sArrowWarpMetatileBehaviorChecks2[])(u8) = {\n    MetatileBehavior_IsSouthArrowWarp,\n    MetatileBehavior_IsNorthArrowWarp,\n    MetatileBehavior_IsWestArrowWarp,\n    MetatileBehavior_IsEastArrowWarp\n};\n\nstatic void HandleWarpArrowSpriteHideShow(struct ObjectEvent *objectEvent)\n{\n    s16 x;\n    s16 y;\n    u8 direction;\n    u8 metatileBehavior = objectEvent->currentMetatileBehavior;\n\n    for (x = 0, direction = DIR_SOUTH; x < 4; x++, direction++)\n    {\n        if (sArrowWarpMetatileBehaviorChecks2[x](metatileBehavior) && direction == objectEvent->movementDirection)\n        {\n            x = objectEvent->currentCoords.x;\n            y = objectEvent->currentCoords.y;\n            MoveCoords(direction, &x, &y);\n            ShowWarpArrowSprite(objectEvent->warpArrowSpriteId, direction, x, y);\n            return;\n        }\n    }\n    SetSpriteInvisible(objectEvent->warpArrowSpriteId);\n}\n\nstatic bool8 (*const sBoulderTaskSteps[])(struct Task *task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj) = {\n    DoBoulderInit,\n    DoBoulderDust,\n    DoBoulderFinish\n};\n\nstatic void StartStrengthAnim(u8 a, u8 b)\n{\n    u8 taskId = CreateTask(Task_BumpBoulder, 0xFF);\n\n    gTasks[taskId].data[1] = a;\n    gTasks[taskId].data[2] = b;\n    Task_BumpBoulder(taskId);\n}\n\nstatic void Task_BumpBoulder(u8 taskId)\n{\n    while (sBoulderTaskSteps[gTasks[taskId].data[0]](&gTasks[taskId],\n                                                     &gObjectEvents[gPlayerAvatar.objectEventId],\n                                                     &gObjectEvents[gTasks[taskId].data[1]]))\n        ;\n}\n\nstatic bool8 DoBoulderInit(struct Task *task, struct ObjectEvent *playerObject, struct ObjectEvent *strengthObject)\n{\n    LockPlayerFieldControls();\n    gPlayerAvatar.preventStep = TRUE;\n    task->data[0]++;\n    return FALSE;\n}\n\nstatic bool8 DoBoulderDust(struct Task *task, struct ObjectEvent *playerObject, struct ObjectEvent *strengthObject)\n{\n    if (!ObjectEventIsMovementOverridden(playerObject)\n        && !ObjectEventIsMovementOverridden(strengthObject))\n    {\n        ObjectEventClearHeldMovementIfFinished(playerObject);\n        ObjectEventClearHeldMovementIfFinished(strengthObject);\n        QL_TryRecordPlayerStepWithDuration0(playerObject, GetWalkInPlaceNormalMovementAction((u8)task->data[2]));\n        QL_TryRecordNPCStepWithDuration32(strengthObject, GetWalkSlowerMovementAction((u8)task->data[2]));\n        gFieldEffectArguments[0] = strengthObject->currentCoords.x;\n        gFieldEffectArguments[1] = strengthObject->currentCoords.y;\n        gFieldEffectArguments[2] = strengthObject->previousElevation;\n        gFieldEffectArguments[3] = gSprites[strengthObject->spriteId].oam.priority;\n        FieldEffectStart(FLDEFF_DUST);\n        PlaySE(SE_M_STRENGTH);\n        task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 DoBoulderFinish(struct Task *task, struct ObjectEvent *playerObject, struct ObjectEvent *strengthObject)\n{\n    if (ObjectEventCheckHeldMovementStatus(playerObject)\n        && ObjectEventCheckHeldMovementStatus(strengthObject))\n    {\n        ObjectEventClearHeldMovementIfFinished(playerObject);\n        ObjectEventClearHeldMovementIfFinished(strengthObject);\n        HandleBoulderFallThroughHole(strengthObject);\n        HandleBoulderActivateVictoryRoadSwitch(strengthObject->currentCoords.x, strengthObject->currentCoords.y);\n        gPlayerAvatar.preventStep = FALSE;\n        UnlockPlayerFieldControls();\n        DestroyTask(FindTaskIdByFunc(Task_BumpBoulder));\n    }\n    return FALSE;\n}\n\nstatic bool8 (*const sPlayerAvatarSecretBaseMatJump[])(struct Task *, struct ObjectEvent *) = {\n    PlayerAvatar_DoSecretBaseMatJump\n};\n\nstatic void DoPlayerMatJump(void)\n{\n    DoPlayerAvatarSecretBaseMatJump(CreateTask(DoPlayerAvatarSecretBaseMatJump, 0xFF));\n}\n\nstatic void DoPlayerAvatarSecretBaseMatJump(u8 taskId)\n{\n    while (sPlayerAvatarSecretBaseMatJump[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId]))\n        ;\n}\n\n// because data[0] is used to call this, it can be inferred that there may have been multiple mat jump functions at one point, so the name for these groups of functions is appropriate in assuming the sole use of mat jump.\nstatic bool8 PlayerAvatar_DoSecretBaseMatJump(struct Task *task, struct ObjectEvent *objectEvent)\n{\n    gPlayerAvatar.preventStep = TRUE;\n    if (ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        PlaySE(SE_LEDGE);\n        QL_TryRecordPlayerStepWithDuration0(objectEvent, GetJumpInPlaceMovementAction(objectEvent->facingDirection));\n        task->data[1]++;\n        if (task->data[1] > 1)\n        {\n            gPlayerAvatar.preventStep = FALSE;\n            gPlayerAvatar.transitionFlags |= PLAYER_AVATAR_FLAG_CONTROLLABLE;\n            DestroyTask(FindTaskIdByFunc(DoPlayerAvatarSecretBaseMatJump));\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 (*const sPlayerAvatarSecretBaseMatSpin[])(struct Task *task, struct ObjectEvent * playerObj) = {\n    PlayerAvatar_SecretBaseMatSpinStep0,\n    PlayerAvatar_SecretBaseMatSpinStep1,\n    PlayerAvatar_SecretBaseMatSpinStep2,\n    PlayerAvatar_SecretBaseMatSpinStep3,\n};\n\nstatic void DoPlayerMatSpin(void)\n{\n    u8 taskId = CreateTask(PlayerAvatar_DoSecretBaseMatSpin, 0xFF);\n\n    PlayerAvatar_DoSecretBaseMatSpin(taskId);\n}\n\nstatic void PlayerAvatar_DoSecretBaseMatSpin(u8 taskId)\n{\n    while (sPlayerAvatarSecretBaseMatSpin[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId]))\n        ;\n}\n\nstatic bool8 PlayerAvatar_SecretBaseMatSpinStep0(struct Task *task, struct ObjectEvent *objectEvent)\n{\n    task->data[0]++;\n    task->data[1] = objectEvent->movementDirection;\n    gPlayerAvatar.preventStep = TRUE;\n    LockPlayerFieldControls();\n    PlaySE(SE_WARP_IN);\n    return TRUE;\n}\n\nstatic bool8 PlayerAvatar_SecretBaseMatSpinStep1(struct Task *task, struct ObjectEvent *objectEvent)\n{\n    u8 directions[] = {DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};\n\n    if (ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        u8 direction;\n\n        QL_TryRecordPlayerStepWithDuration0(objectEvent, GetFaceDirectionMovementAction(direction = directions[objectEvent->movementDirection - 1]));\n        if (direction == (u8)task->data[1])\n            task->data[2]++;\n        task->data[0]++;\n        if (task->data[2] > 3 && direction == GetOppositeDirection(task->data[1]))\n            task->data[0]++;\n    }\n    return FALSE;\n}\n\nstatic bool8 PlayerAvatar_SecretBaseMatSpinStep2(struct Task *task, struct ObjectEvent *objectEvent)\n{\n    const u8 actions[] = {\n        MOVEMENT_ACTION_DELAY_1,\n        MOVEMENT_ACTION_DELAY_1,\n        MOVEMENT_ACTION_DELAY_2,\n        MOVEMENT_ACTION_DELAY_4,\n        MOVEMENT_ACTION_DELAY_8,\n    };\n\n    if (ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        QL_TryRecordPlayerStepWithDuration0(objectEvent, actions[task->data[2]]);\n        task->data[0] = 1;\n    }\n    return FALSE;\n}\n\nstatic bool8 PlayerAvatar_SecretBaseMatSpinStep3(struct Task *task, struct ObjectEvent *objectEvent)\n{\n    if (ObjectEventClearHeldMovementIfFinished(objectEvent))\n    {\n        QL_TryRecordPlayerStepWithDuration0(objectEvent, GetWalkSlowerMovementAction(GetOppositeDirection(task->data[1])));\n        UnlockPlayerFieldControls();\n        gPlayerAvatar.preventStep = FALSE;\n        DestroyTask(FindTaskIdByFunc(PlayerAvatar_DoSecretBaseMatSpin));\n    }\n    return FALSE;\n}\n\nstatic void CreateStopSurfingTask(u8 direction)\n{\n    u8 taskId;\n\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    Overworld_ClearSavedMusic();\n    Overworld_ChangeMusicToDefault();\n    gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING;\n    gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT;\n    gPlayerAvatar.preventStep = TRUE;\n    taskId = CreateTask(Task_StopSurfingInit, 0xFF);\n    gTasks[taskId].data[0] = direction;\n    Task_StopSurfingInit(taskId);\n}\n\nvoid CreateStopSurfingTask_NoMusicChange(u8 direction)\n{\n    u8 taskId;\n\n    LockPlayerFieldControls();\n    FreezeObjectEvents();\n    gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING;\n    gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT;\n    gPlayerAvatar.preventStep = TRUE;\n    taskId = CreateTask(Task_StopSurfingInit, 0xFF);\n    gTasks[taskId].data[0] = direction;\n    Task_StopSurfingInit(taskId);\n}\n\nvoid SeafoamIslandsB4F_CurrentDumpsPlayerOnLand(void)\n{\n    if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RUNNING || gQuestLogPlaybackState == QL_PLAYBACK_STATE_ACTION_END)\n        return;\n\n    QuestLogRecordPlayerAvatarGfxTransitionWithDuration(sQuestLogSurfDismountActionIds[DIR_NORTH], 16);\n    CreateStopSurfingTask(DIR_NORTH);\n}\n\nstatic void Task_StopSurfingInit(u8 taskId)\n{\n    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n    if (ObjectEventIsMovementOverridden(playerObjEvent))\n    {\n        if (!ObjectEventClearHeldMovementIfFinished(playerObjEvent))\n            return;\n    }\n    SetSurfBlob_BobState(playerObjEvent->fieldEffectSpriteId, BOB_MON_ONLY);\n    QL_TryRecordPlayerStepWithDuration0(playerObjEvent, GetJumpSpecialWithEffectMovementAction((u8)gTasks[taskId].data[0]));\n    gTasks[taskId].func = Task_WaitStopSurfing;\n}\n\nstatic void Task_WaitStopSurfing(u8 taskId)\n{\n    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n    if (ObjectEventClearHeldMovementIfFinished(playerObjEvent))\n    {\n        ObjectEventSetGraphicsId(playerObjEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL));\n        QL_TryRecordPlayerStepWithDuration0(playerObjEvent, GetFaceDirectionMovementAction(playerObjEvent->facingDirection));\n        gPlayerAvatar.preventStep = FALSE;\n        UnlockPlayerFieldControls();\n        UnfreezeObjectEvents();\n        DestroySprite(&gSprites[playerObjEvent->fieldEffectSpriteId]);\n        DestroyTask(taskId);\n        SetHelpContextForMap();\n    }\n}\n\nstatic bool8 (*const sFishingStateFuncs[])(struct Task *) =\n{\n    Fishing1,\n    Fishing2,\n    Fishing3,\n    Fishing4,\n    Fishing5,\n    Fishing6,\n    Fishing7,\n    Fishing8,\n    Fishing9,\n    Fishing10,\n    Fishing11,\n    Fishing12,\n    Fishing13,\n    Fishing14,\n    Fishing15,\n    Fishing16,\n};\n\n#define tStep              data[0]\n#define tFrameCounter      data[1]\n#define tNumDots           data[2]\n#define tDotsRequired      data[3]\n#define tRoundsPlayed      data[12]\n#define tMinRoundsRequired data[13]\n#define tPlayerGfxId       data[14]\n#define tFishingRod        data[15]\n\n#define FISHING_START_ROUND 3\n#define FISHING_GOT_BITE 6\n#define FISHING_ON_HOOK 9\n#define FISHING_NO_BITE 11\n#define FISHING_GOT_AWAY 12\n#define FISHING_SHOW_RESULT 13\n\nvoid StartFishing(u8 rod)\n{\n    u8 taskId = CreateTask(Task_Fishing, 0xFF);\n\n    gTasks[taskId].tFishingRod = rod;\n    Task_Fishing(taskId);\n    if (QuestLogTryRecordPlayerAvatarGfxTransition(QL_PLAYER_GFX_FISH) == TRUE)\n        QL_AfterRecordFishActionSuccessful();\n}\n\n\nstatic void Task_Fishing(u8 taskId)\n{\n    while (sFishingStateFuncs[gTasks[taskId].tStep](&gTasks[taskId]))\n        ;\n}\n\nstatic bool8 Fishing1(struct Task *task)\n{\n    LockPlayerFieldControls();\n    gPlayerAvatar.preventStep = TRUE;\n    task->tStep++;\n    return FALSE;\n}\n\nstatic bool8 Fishing2(struct Task *task)\n{\n    struct ObjectEvent *playerObjEvent;\n    const s16 arr1[] = {1, 1, 1};\n    const s16 arr2[] = {1, 3, 6};\n\n    task->tRoundsPlayed = 0;\n    task->tMinRoundsRequired = arr1[task->tFishingRod] + (Random() % arr2[task->tFishingRod]);\n    task->tPlayerGfxId = gObjectEvents[gPlayerAvatar.objectEventId].graphicsId;\n    playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    ObjectEventClearHeldMovementIfActive(playerObjEvent);\n    playerObjEvent->enableAnim = 1;\n    StartPlayerAvatarFishAnim(playerObjEvent->facingDirection);\n    task->tStep++;\n    return FALSE;\n}\n\nstatic bool8 Fishing3(struct Task *task)\n{\n    AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]);\n\n    // Wait one second\n    task->tFrameCounter++;\n    if (task->tFrameCounter >= 60)\n        task->tStep++;\n    return FALSE;\n}\n\nstatic bool8 Fishing4(struct Task *task)\n{\n    u32 randVal;\n\n    LoadMessageBoxAndFrameGfx(0, TRUE);\n    task->tStep++;\n    task->tFrameCounter = 0;\n    task->tNumDots = 0;\n    randVal = Random();\n    randVal %= 10;\n    task->tDotsRequired = randVal + 1;\n    if (task->tRoundsPlayed == 0)\n        task->tDotsRequired = randVal + 4;\n    if (task->tDotsRequired >= 10)\n        task->tDotsRequired = 10;\n    return TRUE;\n}\n\n// Play a round of the dot game\nstatic bool8 Fishing5(struct Task *task)\n{\n    static const u8 dot[] = _(\"·\");\n\n    AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]);\n    task->tFrameCounter++;\n    if (task->tFrameCounter >= 20)\n    {\n        task->tFrameCounter = 0;\n        if (task->tNumDots >= task->tDotsRequired)\n        {\n            task->tStep++;\n            if (task->tRoundsPlayed != 0)\n                task->tStep++;\n            task->tRoundsPlayed++;\n        }\n        else\n        {\n            AddTextPrinterParameterized(0, FONT_NORMAL, dot, task->tNumDots * 12, 1, 0, NULL);\n            task->tNumDots++;\n        }\n    }\n    return FALSE;\n}\n\n// Determine if fish bites\nstatic bool8 Fishing6(struct Task *task)\n{\n    bool8 bite;\n\n    AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]);\n    task->tStep++;\n    bite = FALSE;\n\n    if (!DoesCurrentMapHaveFishingMons())\n    {\n        task->tStep = FISHING_NO_BITE;\n    }\n    else\n    {\n        if (!GetMonData(&gPlayerParty[0], MON_DATA_IS_EGG))\n        {\n            u8 ability = GetMonAbility(&gPlayerParty[0]);\n            if (ability == ABILITY_SUCTION_CUPS || ability  == ABILITY_STICKY_HOLD)\n            {\n                if (Random() % 100 > 14)\n                    bite = TRUE;\n            }\n        }\n\n        if (!bite)\n        {\n            if (Random() & 1)\n                task->tStep = FISHING_NO_BITE;\n            else\n                bite = TRUE;\n        }\n\n        if (bite == TRUE)\n            StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingBiteDirectionAnimNum(GetPlayerFacingDirection()));\n    }\n    return TRUE;\n}\n\n// Oh! A Bite!\nstatic bool8 Fishing7(struct Task *task)\n{\n    task->tStep += 3;\n    return FALSE;\n}\n\n// We have a bite. Now, wait for the player to press A, or the timer to expire.\nstatic bool8 Fishing8(struct Task *task)\n{\n    const s16 reelTimeouts[3] = {36, 33, 30};\n\n    AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]);\n    task->tFrameCounter++;\n    if (task->tFrameCounter >= reelTimeouts[task->tFishingRod])\n        task->tStep = FISHING_GOT_AWAY;\n    else if (gMain.newKeys & A_BUTTON)\n        task->tStep++;\n    return FALSE;\n}\n\n// Determine if we're going to play the dot game again\nstatic bool8 Fishing9(struct Task *task)\n{\n    const s16 arr[][2] =\n    {\n    {0, 0},\n    {40, 10},\n    {70, 30}\n    };\n\n    AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]);\n    task->tStep++;\n    if (task->tRoundsPlayed < task->tMinRoundsRequired)\n    {\n        task->tStep = FISHING_START_ROUND;\n    }\n    else if (task->tRoundsPlayed < 2)\n    {\n        // probability of having to play another round\n        s16 probability = Random() % 100;\n\n        if (arr[task->tFishingRod][task->tRoundsPlayed] > probability)\n            task->tStep = FISHING_START_ROUND;\n    }\n    return FALSE;\n}\n\nstatic bool8 Fishing10(struct Task *task)\n{\n    AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]);\n    FillWindowPixelBuffer(0, PIXEL_FILL(1));\n    AddTextPrinterParameterized2(0, FONT_NORMAL, gText_PokemonOnHook, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    task->tStep++;\n    task->tFrameCounter = 0;\n    return FALSE;\n}\n\nstatic bool8 Fishing11(struct Task *task)\n{\n    if (task->tFrameCounter == 0)\n        AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]);\n\n    RunTextPrinters();\n\n    if (task->tFrameCounter == 0)\n    {\n        if (!IsTextPrinterActive(0))\n        {\n            struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n            ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId);\n            ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection);\n            if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)\n                SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, 0, 0);\n            gSprites[gPlayerAvatar.spriteId].x2 = 0;\n            gSprites[gPlayerAvatar.spriteId].y2 = 0;\n            ClearDialogWindowAndFrame(0, TRUE);\n            task->tFrameCounter++;\n            return FALSE;\n        }\n    }\n\n    if (task->tFrameCounter != 0)\n    {\n        gPlayerAvatar.preventStep = FALSE;\n        UnlockPlayerFieldControls();\n        FishingWildEncounter(task->tFishingRod);\n        DestroyTask(FindTaskIdByFunc(Task_Fishing));\n    }\n    return FALSE;\n}\n\n// Not even a nibble\nstatic bool8 Fishing12(struct Task *task)\n{\n    AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]);\n    StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection()));\n    FillWindowPixelBuffer(0, PIXEL_FILL(1));\n    AddTextPrinterParameterized2(0, FONT_NORMAL, gText_NotEvenANibble, 1, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    task->tStep = FISHING_SHOW_RESULT;\n    return TRUE;\n}\n\n// It got away\nstatic bool8 Fishing13(struct Task *task)\n{\n    AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]);\n    StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection()));\n    AddTextPrinterParameterized2(0, FONT_NORMAL, gText_ItGotAway, 1, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    task->tStep++;\n    return TRUE;\n}\n\n// Wait one second\nstatic bool8 Fishing14(struct Task *task)\n{\n    AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]);\n    task->tStep++;\n    return FALSE;\n}\n\nstatic bool8 Fishing15(struct Task *task)\n{\n    AlignFishingAnimationFrames(&gSprites[gPlayerAvatar.spriteId]);\n    if (gSprites[gPlayerAvatar.spriteId].animEnded)\n    {\n        struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n        ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId);\n        ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection);\n        if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)\n            SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, 0, 0);\n        gSprites[gPlayerAvatar.spriteId].x2 = 0;\n        gSprites[gPlayerAvatar.spriteId].y2 = 0;\n        task->tStep++;\n    }\n    return FALSE;\n}\n\nstatic bool8 Fishing16(struct Task *task)\n{\n    RunTextPrinters();\n    if (!IsTextPrinterActive(0))\n    {\n        gPlayerAvatar.preventStep = FALSE;\n        UnlockPlayerFieldControls();\n        UnfreezeObjectEvents();\n        ClearDialogWindowAndFrame(0, TRUE);\n        DestroyTask(FindTaskIdByFunc(Task_Fishing));\n    }\n    return FALSE;\n}\n\n#undef tStep\n#undef tFrameCounter\n#undef tFishingRod\n\nvoid AlignFishingAnimationFrames(struct Sprite *playerSprite)\n{\n    u8 animCmdIndex;\n    u8 animType;\n\n    AnimateSprite(playerSprite);\n    playerSprite->x2 = 0;\n    playerSprite->y2 = 0;\n    animCmdIndex = playerSprite->animCmdIndex;\n    if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1)\n    {\n        animCmdIndex--;\n    }\n    else\n    {\n        playerSprite->animDelayCounter++;\n        if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1)\n            animCmdIndex--;\n    }\n    animType = playerSprite->anims[playerSprite->animNum][animCmdIndex].type;\n    if (animType == 1 || animType == 2 || animType == 3)\n    {\n        playerSprite->x2 = 8;\n        if (GetPlayerFacingDirection() == 3)\n            playerSprite->x2 = -8;\n    }\n    if (animType == 5)\n        playerSprite->y2 = -8;\n    if (animType == 10 || animType == 11)\n        playerSprite->y2 = 8;\n    if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)\n        SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, 1, playerSprite->y2);\n}\n\n#define tState data[0]\n#define tRotationTimer data[1]\n#define tDeltaY data[2]\n#define tYdeflection data[3]\n#define tYpos data[4]\n#define tFinalFacingDirection data[5]\n#define tPriority data[6]\n#define tSubpriority data[7]\n#define tLandingDelay data[8]\n\nstatic const u8 sTeleportFacingDirectionSequence[] = {\n    [DIR_SOUTH] = DIR_WEST,\n    [DIR_WEST] = DIR_NORTH,\n    [DIR_NORTH] = DIR_EAST,\n    [DIR_EAST] = DIR_SOUTH,\n    [DIR_NONE] = DIR_SOUTH,\n};\n\nvoid StartTeleportWarpOutPlayerAnim(void)\n{\n    u8 taskId = CreateTask(Task_TeleportWarpOutPlayerAnim, 0);\n    Task_TeleportWarpOutPlayerAnim(taskId);\n}\n\nbool32 WaitTeleportWarpOutPlayerAnim(void)\n{\n    return FuncIsActiveTask(Task_TeleportWarpOutPlayerAnim);\n}\n\nvoid SavePlayerFacingDirectionForTeleport(u8 direction)\n{\n    sTeleportSavedFacingDirection = direction;\n}\n\nstatic u8 GetTeleportSavedFacingDirection(void)\n{\n    if (sTeleportSavedFacingDirection == DIR_NONE)\n        return DIR_SOUTH;\n    else\n        return sTeleportSavedFacingDirection;\n}\n\nstatic void Task_TeleportWarpOutPlayerAnim(u8 taskId)\n{\n    struct ObjectEvent *object = &gObjectEvents[gPlayerAvatar.objectEventId];\n    struct Sprite *sprite = &gSprites[object->spriteId];\n    s16 *data = gTasks[taskId].data;\n\n    switch (tState)\n    {\n    case 0:\n        if (!ObjectEventClearHeldMovementIfFinished(object))\n        {\n            return;\n        }\n\n        SavePlayerFacingDirectionForTeleport(object->facingDirection);\n        tRotationTimer = 0;\n        tDeltaY = 1;\n        tYdeflection = (u16)(sprite->y + sprite->y2) * 16;\n        sprite->y2 = 0;\n        CameraObjectReset2();\n        object->fixedPriority = TRUE;\n        sprite->oam.priority = 0;\n        sprite->subpriority = 0;\n        sprite->subspriteMode = SUBSPRITES_OFF;\n        tState++;\n    case 1:\n        TeleportAnim_RotatePlayer(object, &tRotationTimer);\n        tYdeflection -= tDeltaY;\n        tDeltaY += 3;\n        sprite->y = tYdeflection >> 4;\n        if (sprite->y + (s16)gTotalCameraPixelOffsetY < -32)\n        {\n            tState++;\n        }\n        break;\n    case 2:\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nvoid StartTeleportInPlayerAnim(void)\n{\n    u8 taskId = CreateTask(Task_TeleportWarpInPlayerAnim, 0);\n    Task_TeleportWarpInPlayerAnim(taskId);\n}\n\nbool32 WaitTeleportInPlayerAnim(void)\n{\n    return FuncIsActiveTask(Task_TeleportWarpInPlayerAnim);\n}\n\nstatic void Task_TeleportWarpInPlayerAnim(u8 taskId)\n{\n    struct ObjectEvent *object = &gObjectEvents[gPlayerAvatar.objectEventId];\n    struct Sprite *sprite = &gSprites[object->spriteId];\n    s16 *data = gTasks[taskId].data;\n\n    switch (tState)\n    {\n    case 0:\n        tFinalFacingDirection = GetTeleportSavedFacingDirection();\n        ObjectEventForceSetHeldMovement(object, GetFaceDirectionMovementAction(sTeleportFacingDirectionSequence[tFinalFacingDirection]));\n        tRotationTimer = 0;\n        tDeltaY = 116;\n        tYpos = sprite->y;\n        tPriority = sprite->oam.priority;\n        tSubpriority = sprite->subpriority;\n        tYdeflection = -((u16)sprite->y2 + 32) * 16;\n        sprite->y2 = 0;\n        CameraObjectReset2();\n        object->fixedPriority = TRUE;\n        sprite->oam.priority = 1;\n        sprite->subpriority = 0;\n        sprite->subspriteMode = SUBSPRITES_OFF;\n        tState++;\n    case 1:\n        TeleportAnim_RotatePlayer(object, &tRotationTimer);\n        tYdeflection += tDeltaY;\n        tDeltaY -= 3;\n        if (tDeltaY < 4)\n        {\n            tDeltaY = 4;\n        }\n        sprite->y = tYdeflection >> 4;\n        if (sprite->y >= tYpos)\n        {\n            sprite->y = tYpos;\n            tLandingDelay = 0;\n            tState++;\n        }\n        break;\n    case 2:\n        TeleportAnim_RotatePlayer(object, &tRotationTimer);\n        tLandingDelay++;\n        if (tLandingDelay > 8)\n        {\n            tState++;\n        }\n        break;\n    case 3:\n        if (tFinalFacingDirection == TeleportAnim_RotatePlayer(object, &tRotationTimer))\n        {\n            object->fixedPriority = 0;\n            sprite->oam.priority = tPriority;\n            sprite->subpriority = tSubpriority;\n            CameraObjectReset1();\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic u8 TeleportAnim_RotatePlayer(struct ObjectEvent *object, s16 *a1)\n{\n    if (*a1 < 8 && ++(*a1) < 8)\n    {\n        return object->facingDirection;\n    }\n\n    if (!ObjectEventCheckHeldMovementStatus(object))\n    {\n        return object->facingDirection;\n    }\n\n    ObjectEventForceSetHeldMovement(object, GetFaceDirectionMovementAction(sTeleportFacingDirectionSequence[object->facingDirection]));\n    *a1 = 0;\n    return sTeleportFacingDirectionSequence[object->facingDirection];\n}\n\n#undef tLandingDelay\n#undef tSubpriority\n#undef tPriority\n#undef tFinalFacingDirection\n#undef tYpos\n#undef tYdeflection\n#undef tDeltaY\n#undef tRotationTimer\n#undef tState\n"
  },
  {
    "path": "src/field_poison.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"field_message_box.h\"\n#include \"script.h\"\n#include \"event_data.h\"\n#include \"fldeff.h\"\n#include \"party_menu.h\"\n#include \"field_poison.h\"\n#include \"constants/battle.h\"\n\nstatic bool32 IsMonValidSpecies(struct Pokemon *pokemon)\n{\n    u16 species = GetMonData(pokemon, MON_DATA_SPECIES_OR_EGG);\n    if (species == SPECIES_NONE || species == SPECIES_EGG)\n        return FALSE;\n    return TRUE;\n}\n\nstatic bool32 AllMonsFainted(void)\n{\n    int i;\n\n    struct Pokemon *pokemon = gPlayerParty;\n    for (i = 0; i < PARTY_SIZE; i++, pokemon++)\n        if (IsMonValidSpecies(pokemon) && GetMonData(pokemon, MON_DATA_HP))\n            return FALSE;\n    return TRUE;\n}\n\nstatic void FaintFromFieldPoison(u8 partyIdx)\n{\n    struct Pokemon *pokemon = gPlayerParty + partyIdx;\n    u32 status = STATUS1_NONE;\n    AdjustFriendship(pokemon, FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE);\n    SetMonData(pokemon, MON_DATA_STATUS, &status);\n    GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1);\n    StringGet_Nickname(gStringVar1);\n}\n\nstatic bool32 MonFaintedFromPoison(u8 partyIdx)\n{\n    struct Pokemon *pokemon = gPlayerParty + partyIdx;\n    if (IsMonValidSpecies(pokemon) && !GetMonData(pokemon, MON_DATA_HP) && GetAilmentFromStatus(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)\n        return TRUE;\n    return FALSE;\n}\n\n#define tState   data[0]\n#define tPartyId data[1]\n\nstatic void Task_TryFieldPoisonWhiteOut(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    switch (tState)\n    {\n    case 0:\n        for (; tPartyId < PARTY_SIZE; tPartyId++)\n        {\n            if (MonFaintedFromPoison(tPartyId))\n            {\n                FaintFromFieldPoison(tPartyId);\n                ShowFieldMessage(gText_PkmnFainted3);\n                tState++;\n                return;\n            }\n        }\n        tState = 2;\n        break;\n    case 1:\n        if (IsFieldMessageBoxHidden())\n            tState--;\n        break;\n    case 2:\n        if (AllMonsFainted())\n            gSpecialVar_Result = TRUE;\n        else\n            gSpecialVar_Result = FALSE;\n        ScriptContext_Enable();\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nvoid TryFieldPoisonWhiteOut(void)\n{\n    CreateTask(Task_TryFieldPoisonWhiteOut, 80);\n    ScriptContext_Stop();\n}\n\ns32 DoPoisonFieldEffect(void)\n{\n    int i;\n    u32 hp;\n    \n    struct Pokemon *pokemon = gPlayerParty;\n    u32 numPoisoned = 0;\n    u32 numFainted = 0;\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && GetAilmentFromStatus(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)\n        {\n            hp = GetMonData(pokemon, MON_DATA_HP);\n            if (hp == 0 || --hp == 0)\n                numFainted++;\n            SetMonData(pokemon, MON_DATA_HP, &hp);\n            numPoisoned++;\n        }\n        pokemon++;\n    }\n    if (numFainted || numPoisoned)\n        FldEffPoison_Start();\n    if (numFainted)\n        return FLDPSN_FNT;\n    if (numPoisoned)\n        return FLDPSN_PSN;\n    return FLDPSN_NONE;\n}\n"
  },
  {
    "path": "src/field_screen_effect.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"field_screen_effect.h\"\n#include \"overworld.h\"\n#include \"pokemon_storage_system.h\"\n#include \"scanline_effect.h\"\n#include \"script.h\"\n#include \"task.h\"\n#include \"strings.h\"\n#include \"menu.h\"\n#include \"heal_location.h\"\n#include \"new_menu_helpers.h\"\n#include \"event_object_movement.h\"\n#include \"field_fadetransition.h\"\n#include \"event_scripts.h\"\n#include \"constants/heal_locations.h\"\n#include \"constants/maps.h\"\n\nstatic const u16 sFlashLevelToRadius[] = { 200, 72, 56, 40, 24 };\nconst s32 gMaxFlashLevel = ARRAY_COUNT(sFlashLevelToRadius) - 1;\n\nstatic const struct WindowTemplate sWindowTemplate_WhiteoutText =\n{\n    .bg = 0,\n    .tilemapLeft = 0,\n    .tilemapTop = 5,\n    .width = 30,\n    .height = 11,\n    .paletteNum = 15,\n    .baseBlock = 1,\n};\n\nstatic const u8 sWhiteoutTextColors[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY };\n\nstatic void Task_EnableScriptAfterMusicFade(u8 taskId);\nstatic void Task_BarnDoorWipeChild(u8 taskId);\n\nstatic void SetFlashScanlineEffectWindowBoundary(u16 *dest, u32 y, s32 left, s32 right)\n{\n    if (y <= 160)\n    {\n        if (left < 0)\n            left = 0;\n        if (left > 255)\n            left = 255;\n        if (right < 0)\n            right = 0;\n        if (right > 255)\n            right = 255;\n        dest[y] = (left << 8) | right;\n    }\n}\n\n/*\n * Draws a circle by approximating xy² + yx² = radius².\n *\n * error is approximately xy² - yx². Negative values mean the circle is\n * slightly too large, and positive values mean the circle is slightly\n * too small. By decreasing xy whenever the error becomes negative the\n * code slightly under-approximates the size of the circle.\n *\n * The subtractive terms compute yx² - (yx - 1)², and therefore the sum\n * is yx² - 1:\n *   yx               |  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7\n *   (yx * 2) - 1     | -1 |  1 |  3 |  5 |  7 |  9 | 11 | 13\n *   yx² - (yx - 1)²  | -1 |  1 |  3 |  5 |  7 |  9 | 11 | 13\n *   cumulative error | -1 |  0 |  3 |  8 | 15 | 24 | 35 | 48\n *   yx²              |  0 |  1 |  4 |  9 | 16 | 25 | 36 | 49\n *\n * The additive terms compute xy² - (xy - 1)² - 1, and therefore the sum\n * (badly) approximates Σi² - (i - 1)², i ∈ (xy, r), consider r = 18:\n *   xy               | 18 | 17 | 16 |  15 |  14 |  13 | ... |   0\n *   xy² - (xy - 1)²  | 35 | 33 | 31 |  29 |  27 |  25 | ... |  -1\n *   2 * (xy - 1)     | 34 | 32 | 30 |  28 |  26 |  24 | ... |  -2\n *   cumulative error | 34 | 66 | 96 | 124 | 150 | 174 | ... | 304\n *   Σi² - (i - 1)²   | 35 | 68 | 99 | 128 | 155 | 180 | ... | 323\n * 18² = 324, so if the iterations ran until xy = 0 the cumulative error\n * would be xy² - r.\n *\n * The error is initialized to r, which corrects for the error in the\n * additive terms. In practice all r iterations don't occur because we\n * early-exit when yx > xy, so it's half-way between a fix for that\n * error and an approximation of the midpoint between r² and (r + 1)².\n *\n * The algorithm takes advantage of symmetry to compute boundaries in\n * both directions out from centerY (using yx for y), and also both\n * directions *in* from centerY ± radius (using xy for y). Because xy\n * doesn't change on every iteration, we will frequently overwrite\n * boundaries set in the previous iteration.\n */\nvoid SetFlashScanlineEffectWindowBoundaries(u16 *dest, s32 centerX, s32 centerY, s32 radius)\n{\n    s32 xy = radius;\n    s32 error = radius;\n    s32 yx = 0;\n    while (xy >= yx)\n    {\n        SetFlashScanlineEffectWindowBoundary(dest, centerY - yx, centerX - xy, centerX + xy);\n        SetFlashScanlineEffectWindowBoundary(dest, centerY + yx, centerX - xy, centerX + xy);\n        SetFlashScanlineEffectWindowBoundary(dest, centerY - xy, centerX - yx, centerX + yx);\n        SetFlashScanlineEffectWindowBoundary(dest, centerY + xy, centerX - yx, centerX + yx);\n        error -= (yx * 2) - 1;\n        yx++;\n        if (error < 0)\n        {\n            error += 2 * (xy - 1);\n            xy--;\n        }\n    }\n}\n\n#define tState               data[0]\n#define tFlashCenterX        data[1]\n#define tFlashCenterY        data[2]\n#define tCurFlashRadius      data[3]\n#define tDestFlashRadius     data[4]\n#define tFlashRadiusDelta    data[5]\n#define tClearScanlineEffect data[6]\n\nstatic void UpdateFlashLevelEffect(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    switch (tState)\n    {\n    case 0:\n        SetFlashScanlineEffectWindowBoundaries(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], tFlashCenterX, tFlashCenterY, tCurFlashRadius);\n        tState = 1;\n        break;\n    case 1:\n        SetFlashScanlineEffectWindowBoundaries(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], tFlashCenterX, tFlashCenterY, tCurFlashRadius);\n        tState = 0;\n        tCurFlashRadius += tFlashRadiusDelta;\n        if (tCurFlashRadius > tDestFlashRadius)\n        {\n            if (tClearScanlineEffect == TRUE)\n            {\n                ScanlineEffect_Stop();\n                tState = 2;\n            }\n            else\n            {\n                DestroyTask(taskId);\n            }\n        }\n        break;\n    case 2:\n        ScanlineEffect_Clear();\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void Task_WaitForFlashUpdate(u8 taskId)\n{\n    if (!FuncIsActiveTask(UpdateFlashLevelEffect))\n    {\n        ScriptContext_Enable();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void StartWaitForFlashUpdate(void)\n{\n    if (!FuncIsActiveTask(Task_WaitForFlashUpdate))\n        CreateTask(Task_WaitForFlashUpdate, 80);\n}\n\nstatic u8 StartUpdateFlashLevelEffect(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 destFlashRadius, bool32 clearScanlineEffect, u8 delta)\n{\n    u8 taskId = CreateTask(UpdateFlashLevelEffect, 80);\n    s16 *data = gTasks[taskId].data;\n\n    tCurFlashRadius = initialFlashRadius;\n    tDestFlashRadius = destFlashRadius;\n    tFlashCenterX = centerX;\n    tFlashCenterY = centerY;\n    tClearScanlineEffect = clearScanlineEffect;\n\n    if (initialFlashRadius < destFlashRadius)\n        tFlashRadiusDelta = delta;\n    else\n        tFlashRadiusDelta = -delta;\n\n    return taskId;\n}\n\n#undef tState\n#undef tCurFlashRadius\n#undef tDestFlashRadius\n#undef tFlashRadiusDelta\n#undef tClearScanlineEffect\n\n// A higher flash level is a smaller flash radius (more darkness). 0 is full brightness\nvoid AnimateFlash(u8 newFlashLevel)\n{\n    u8 curFlashLevel = Overworld_GetFlashLevel();\n    bool32 fullBrightness = FALSE;\n    if (newFlashLevel == 0)\n        fullBrightness = TRUE;\n    StartUpdateFlashLevelEffect(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, sFlashLevelToRadius[curFlashLevel], sFlashLevelToRadius[newFlashLevel], fullBrightness, 2);\n    StartWaitForFlashUpdate();\n    LockPlayerFieldControls();\n}\n\nvoid WriteFlashScanlineEffectBuffer(u8 flashLevel)\n{\n    if (flashLevel)\n    {\n        SetFlashScanlineEffectWindowBoundaries(&gScanlineEffectRegBuffers[0][0], 120, 80, sFlashLevelToRadius[flashLevel]);\n        CpuFastCopy(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 240 * 8);\n    }\n}\n\nvoid Script_FadeOutMapMusic(void)\n{\n    Overworld_FadeOutMapMusic();\n    CreateTask(Task_EnableScriptAfterMusicFade, 80);\n}\n\nstatic void Task_EnableScriptAfterMusicFade(u8 taskId)\n{\n    if (BGMusicStopped() == TRUE)\n    {\n        DestroyTask(taskId);\n        ScriptContext_Enable();\n    }\n}\n\n#define tState data[9]\n#define tDirection data[10]\n#define DIR_WIPE_IN 0 // From edges to center.\n#define DIR_WIPE_OUT 1 // From center to edges.\n#define tChildOffset data[0]\n\nstatic void DoInwardBarnDoorFade(void)\n{\n    u8 taskId = CreateTask(Task_BarnDoorWipe, 80);\n    gTasks[taskId].tDirection = DIR_WIPE_IN;\n}\n\nvoid DoOutwardBarnDoorWipe(void)\n{\n    u8 taskId = CreateTask(Task_BarnDoorWipe, 80);\n    gTasks[taskId].tDirection = DIR_WIPE_OUT;\n}\n\nstatic void BarnDoorWipeSaveGpuRegs(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    data[0] = GetGpuReg(REG_OFFSET_DISPCNT);\n    data[1] = GetGpuReg(REG_OFFSET_WININ);\n    data[2] = GetGpuReg(REG_OFFSET_WINOUT);\n    data[3] = GetGpuReg(REG_OFFSET_BLDCNT);\n    data[4] = GetGpuReg(REG_OFFSET_BLDALPHA);\n    data[5] = GetGpuReg(REG_OFFSET_WIN0H);\n    data[6] = GetGpuReg(REG_OFFSET_WIN0V);\n    data[7] = GetGpuReg(REG_OFFSET_WIN1H);\n    data[8] = GetGpuReg(REG_OFFSET_WIN1V);\n}\n\nstatic void BarnDoorWipeLoadGpuRegs(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    SetGpuReg(REG_OFFSET_DISPCNT, data[0]);\n    SetGpuReg(REG_OFFSET_WININ, data[1]);\n    SetGpuReg(REG_OFFSET_WINOUT, data[2]);\n    SetGpuReg(REG_OFFSET_BLDCNT, data[3]);\n    SetGpuReg(REG_OFFSET_BLDALPHA, data[4]);\n    SetGpuReg(REG_OFFSET_WIN0H, data[5]);\n    SetGpuReg(REG_OFFSET_WIN0V, data[6]);\n    SetGpuReg(REG_OFFSET_WIN1H, data[7]);\n    SetGpuReg(REG_OFFSET_WIN1V, data[8]);\n}\n\nvoid Task_BarnDoorWipe(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    switch (tState)\n    {\n        case 0:\n            BarnDoorWipeSaveGpuRegs(taskId);\n            SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n            SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);\n            if (data[10] == 0)\n            {\n                SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0));\n                SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(DISPLAY_WIDTH, 255));\n                SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 255));\n                SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0, 255));\n            }\n            else\n            {\n                SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH / 2));\n                SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 255));\n                SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(DISPLAY_WIDTH / 2, 255));\n                SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0, 255));\n            }\n            SetGpuReg(REG_OFFSET_WININ, 0);\n            SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n            tState = 1;\n            break;\n        case 1:\n            CreateTask(Task_BarnDoorWipeChild, 80);\n            tState = 2;\n            break;\n        case 2:\n            if (!FuncIsActiveTask(Task_BarnDoorWipeChild))\n            {\n                tState = 3;\n            }\n            break;\n        case 3:\n            BarnDoorWipeLoadGpuRegs(taskId);\n            DestroyTask(taskId);\n            break;\n    }\n}\n\nstatic void Task_BarnDoorWipeChild(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\tu8 parentTaskId = FindTaskIdByFunc(Task_BarnDoorWipe);\n    s16 lhs, rhs;\n    if (gTasks[parentTaskId].tDirection == DIR_WIPE_IN)\n    {\n        lhs = tChildOffset;\n        rhs = DISPLAY_WIDTH - tChildOffset;\n        if (lhs > DISPLAY_WIDTH / 2)\n        {\n            DestroyTask(taskId);\n            return;\n        }\n    }\n    else\n    {\n        lhs = DISPLAY_WIDTH / 2 - tChildOffset;\n        rhs = DISPLAY_WIDTH / 2 + tChildOffset;\n        if (lhs < 0)\n        {\n            DestroyTask(taskId);\n            return;\n        }\n    }\n    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, lhs));\n    SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(rhs, DISPLAY_WIDTH));\n    if (lhs < 90)\n        tChildOffset += 4;\n    else\n        tChildOffset += 2;\n}\n\n#undef tState\n#undef tDirection\n#undef DIR_WIPE_IN\n#undef DIR_WIPE_OUT\n#undef tChildOffset\n\n#define tState      data[0]\n#define tWindowId   data[1]\n#define tPrintState data[2]\n\nstatic bool8 PrintWhiteOutRecoveryMessage(u8 taskId, const u8 *text, u8 x, u8 y)\n{\n    u8 windowId = gTasks[taskId].tWindowId;\n\n    switch (gTasks[taskId].tPrintState)\n    {\n    case 0:\n        FillWindowPixelBuffer(windowId, PIXEL_FILL(0));\n        StringExpandPlaceholders(gStringVar4, text);\n        AddTextPrinterParameterized4(windowId, FONT_NORMAL, x, y, 1, 0, sWhiteoutTextColors, 1, gStringVar4);\n        gTextFlags.canABSpeedUpPrint = FALSE;\n        gTasks[taskId].tPrintState = 1;\n        break;\n    case 1:\n        RunTextPrinters();\n        if (!IsTextPrinterActive(windowId))\n        {\n            gTasks[taskId].tPrintState = 0;\n            return TRUE;\n        }\n        break;\n    }\n    return FALSE;\n}\n\nstatic void Task_RushInjuredPokemonToCenter(u8 taskId)\n{\n    u8 windowId;\n    const struct HealLocation *loc;\n\n    switch (gTasks[taskId].tState)\n    {\n    case 0:\n        windowId = AddWindow(&sWindowTemplate_WhiteoutText);\n        gTasks[taskId].tWindowId = windowId;\n        Menu_LoadStdPalAt(BG_PLTT_ID(15));\n        FillWindowPixelBuffer(windowId, PIXEL_FILL(0));\n        PutWindowTilemap(windowId);\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n\n        // Scene changes if last heal location was the player's house\n        loc = GetHealLocation(SPAWN_PALLET_TOWN);\n        if (gSaveBlock1Ptr->lastHealLocation.mapGroup == loc->group\n         && gSaveBlock1Ptr->lastHealLocation.mapNum == loc->map\n         && gSaveBlock1Ptr->lastHealLocation.warpId == WARP_ID_NONE\n         && gSaveBlock1Ptr->lastHealLocation.x == loc->x\n         && gSaveBlock1Ptr->lastHealLocation.y == loc->y)\n            gTasks[taskId].tState = 4;\n        else\n            gTasks[taskId].tState = 1;\n        break;\n    case 1:\n        if (PrintWhiteOutRecoveryMessage(taskId, gText_PlayerScurriedToCenter, 2, 8))\n        {\n            ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], DIR_NORTH);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case 4:\n        if (PrintWhiteOutRecoveryMessage(taskId, gText_PlayerScurriedBackHome, 2, 8))\n        {\n            ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], DIR_NORTH);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case 2:\n    case 5:\n        windowId = gTasks[taskId].tWindowId;\n        ClearWindowTilemap(windowId);\n        CopyWindowToVram(windowId, COPYWIN_MAP);\n        RemoveWindow(windowId);\n        palette_bg_faded_fill_black();\n        FadeInFromBlack();\n        gTasks[taskId].tState++;\n        break;\n    case 3:\n        if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE)\n        {\n            DestroyTask(taskId);\n            if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 || gSaveBlock1Ptr->keyFlags.noPMC == 1)\n            {\n                if(GetFirstAliveBoxMon() == 420) //no usable Pokemon\n                {\n                    gGlobalFieldTintMode = 1; //should grayscale palettes?\n                    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 && gSaveBlock1Ptr->keyFlags.noPMC == 1)\n                        ScriptContext_SetupScript(EventScript_BothGameOver); //both noPMC and Nuzlocke\n                    else if(gSaveBlock1Ptr->keyFlags.noPMC == 0)\n                        ScriptContext_SetupScript(EventScript_NuzlockeGameOver); //just Nuzlocke\n                    else\n                        ScriptContext_SetupScript(EventScript_NoPMCGameOver); //just noPMC\n                    break;\n                }\n                else\n                {\n                    SwapFirstAliveBoxPokemon();\n                    if(gSaveBlock1Ptr->keyFlags.noPMC == 0)\n                        ScriptContext_SetupScript(EventScript_NuzlockeHaveMons_Nurse);\n                    else\n                        ScriptContext_SetupScript(EventScript_NoPMCHaveMons_Nurse);\n                    break;\n                }\n            }\n            ScriptContext_SetupScript(EventScript_AfterWhiteOutHeal);\n        }\n        break;\n    case 6:\n        if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE)\n        {\n            DestroyTask(taskId);\n            if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 || gSaveBlock1Ptr->keyFlags.noPMC == 1)\n            {\n                if(GetFirstAliveBoxMon() == 420) //no usable Pokemon\n                {\n                    gGlobalFieldTintMode = 1; //should grayscale palettes?\n                    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 && gSaveBlock1Ptr->keyFlags.noPMC == 1)\n                        ScriptContext_SetupScript(EventScript_BothGameOver_Mom); //both noPMC and Nuzlocke\n                    else if(gSaveBlock1Ptr->keyFlags.noPMC == 0)\n                        ScriptContext_SetupScript(EventScript_NuzlockeGameOver_Mom); //just Nuzlocke\n                    else\n                        ScriptContext_SetupScript(EventScript_NoPMCGameOver_Mom); //just noPMC\n                    break;\n                }\n                else\n                {\n                    SwapFirstAliveBoxPokemon();\n                    if(gSaveBlock1Ptr->keyFlags.noPMC == 0)\n                        ScriptContext_SetupScript(EventScript_NuzlockeHaveMons_Mom);\n                    else\n                        ScriptContext_SetupScript(EventScript_NoPMCHaveMons_Mom);\n                    break;\n                }\n            }\n            ScriptContext_SetupScript(EventScript_AfterWhiteOutMomHeal);\n        }\n        break;\n    }\n}\n\nvoid FieldCB_RushInjuredPokemonToCenter(void)\n{\n    u8 taskId;\n\n    LockPlayerFieldControls();\n    palette_bg_faded_fill_black();\n    taskId = CreateTask(Task_RushInjuredPokemonToCenter, 10);\n    gTasks[taskId].tState = 0;\n}\n"
  },
  {
    "path": "src/field_special_scene.c",
    "content": "#include \"global.h\"\n\nstatic u32 FieldSpecialScene_Dummy0(void)\n{\n    return 0;\n}\n\nstatic void FieldSpecialScene_Dummy1(void)\n{\n}\n\nstatic void FieldSpecialScene_Dummy2(void)\n{\n}\n\nstatic void FieldSpecialScene_Dummy3(void)\n{\n}\n\nvoid FieldCB_ShowPortholeView(void)\n{\n}\n\n// From Hoenn's SS Tidal\nvoid LookThroughPorthole(void)\n{\n}\n"
  },
  {
    "path": "src/field_specials.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"quest_log.h\"\n#include \"list_menu.h\"\n#include \"diploma.h\"\n#include \"script.h\"\n#include \"field_player_avatar.h\"\n#include \"overworld.h\"\n#include \"field_message_box.h\"\n#include \"event_data.h\"\n#include \"strings.h\"\n#include \"battle.h\"\n#include \"fieldmap.h\"\n#include \"field_specials.h\"\n#include \"region_map.h\"\n#include \"task.h\"\n#include \"battle_tower.h\"\n#include \"field_camera.h\"\n#include \"field_effect.h\"\n#include \"event_object_movement.h\"\n#include \"menu_indicators.h\"\n#include \"random.h\"\n#include \"mail_data.h\"\n#include \"help_system.h\"\n#include \"pokemon_storage_system.h\"\n#include \"script_menu.h\"\n#include \"data.h\"\n#include \"pokedex.h\"\n#include \"text_window.h\"\n#include \"menu.h\"\n#include \"mystery_gift.h\"\n#include \"naming_screen.h\"\n#include \"party_menu.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"new_menu_helpers.h\"\n#include \"battle_setup.h\"\n#include \"constants/songs.h\"\n#include \"constants/items.h\"\n#include \"constants/maps.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/moves.h\"\n#include \"constants/menu.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/metatile_labels.h\"\n\nstatic EWRAM_DATA u8 sElevatorCurrentFloorWindowId = 0;\nstatic EWRAM_DATA u16 sElevatorScroll = 0;\nstatic EWRAM_DATA u16 sElevatorCursorPos = 0;\nstatic EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL;\nstatic EWRAM_DATA u16 sListMenuLastScrollPosition = 0;\nstatic EWRAM_DATA u8 sPCBoxToSendMon = 0;\nstatic EWRAM_DATA u8 sBrailleTextCursorSpriteID = 0;\n\nstruct ListMenuTemplate sFieldSpecialsListMenuTemplate;\nu16 sFieldSpecialsListMenuScrollBuffer;\nstatic const u8 gTitleNames[][18];\n\nstatic void Task_AnimatePcTurnOn(u8 taskId);\nstatic void PcTurnOnUpdateMetatileId(bool16 flag);\nstatic void Task_ShakeScreen(u8 taskId);\nstatic void Task_EndScreenShake(u8 taskId);\nstatic u16 SampleResortGorgeousMon(void);\nstatic u16 SampleResortGorgeousReward(void);\nstatic void Task_ElevatorShake(u8 taskId);\nstatic void AnimateElevatorWindowView(u16 nfloors, bool8 direction);\nstatic void Task_AnimateElevatorWindowView(u8 taskId);\nstatic void Task_CreateScriptListMenu(u8 taskId);\nstatic void CreateScriptListMenu(void);\nstatic void ScriptListMenuMoveCursorFunction(s32 nothing, bool8 is, struct ListMenu * used);\nstatic void Task_ListMenuHandleInput(u8 taskId);\nstatic void Task_DestroyListMenu(u8 taskId);\nstatic void Task_SuspendListMenu(u8 taskId);\nstatic void Task_RedrawScrollArrowsAndWaitInput(u8 taskId);\nstatic void Task_CreateMenuRemoveScrollIndicatorArrowPair(u8 taskId);\nstatic void Task_ListMenuRemoveScrollIndicatorArrowPair(u8 taskId);\nstatic u16 GetStarterSpeciesById(u16 starterIdx);\nstatic void ChangeBoxPokemonNickname_CB(void);\nstatic void ChangePokemonNickname_CB(void);\nstatic void Task_RunPokemonLeagueLightingEffect(u8 taskId);\nstatic void Task_CancelPokemonLeagueLightingEffect(u8 taskId);\nstatic void Task_DoDeoxysTriangleInteraction(u8 taskId);\nstatic void MoveDeoxysObject(u8 num);\nstatic void Task_WaitDeoxysFieldEffect(u8 taskId);\nstatic void Task_WingFlapSound(u8 taskId);\n\nstatic u8 *const sStringVarPtrs[] = {\n    gStringVar1,\n    gStringVar2,\n    gStringVar3\n};\n\nvoid ShowDiploma(void)\n{\n    QuestLog_CutRecording();\n    SetMainCallback2(CB2_ShowDiploma);\n    LockPlayerFieldControls();\n}\n\nvoid ForcePlayerOntoBike(void)\n{\n    if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ON_FOOT)\n        SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_MACH_BIKE);\n    Overworld_SetSavedMusic(MUS_CYCLING);\n    Overworld_ChangeMusicTo(MUS_CYCLING);\n}\n\nvoid ResetCyclingRoadChallengeData(void)\n{\n\n}\n\nu8 GetPlayerAvatarBike(void)\n{\n    if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE))\n        return 1;\n    else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE))\n        return 2;\n    else\n        return 0;\n}\n\nvoid ShowFieldMessageStringVar4(void)\n{\n    ShowFieldMessage(gStringVar4);\n}\n\nvoid GetPlayerXY(void)\n{\n    gSpecialVar_0x8004 = gSaveBlock1Ptr->pos.x;\n    gSpecialVar_0x8005 = gSaveBlock1Ptr->pos.y;\n}\n\nu8 GetPlayerTrainerIdOnesDigit(void)\n{\n    u16 playerId = (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0];\n    return playerId % 10;\n}\n\nvoid BufferBigGuyOrBigGirlString(void)\n{\n    if (gSaveBlock2Ptr->playerGender == MALE)\n        StringCopy(gStringVar1, gText_BigGuy);\n    else\n        StringCopy(gStringVar1, gText_BigGirl);\n}\n\nvoid BufferSonOrDaughterString(void)\n{\n    if (gSaveBlock2Ptr->playerGender == MALE)\n        StringCopy(gStringVar1, gText_Daughter);\n    else\n        StringCopy(gStringVar1, gText_Son);\n}\n\nu8 GetBattleOutcome(void)\n{\n    return gBattleOutcome;\n}\n\nvoid SetHiddenItemFlag(void)\n{\n    FlagSet(gSpecialVar_0x8004);\n}\n\nu8 GetLeadMonFriendship(void)\n{\n    struct Pokemon * pokemon = &gPlayerParty[GetLeadMonIndex()];\n    if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255)\n        return 6;\n    else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 200)\n        return 5;\n    else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 150)\n        return 4;\n    else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 100)\n        return 3;\n    else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 50)\n        return 2;\n    else if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) > 0)\n        return 1;\n    else\n        return 0;\n}\n\nvoid ShowTownMap(void)\n{\n    QuestLog_CutRecording();\n    InitRegionMapWithExitCB(REGIONMAP_TYPE_WALL, CB2_ReturnToFieldContinueScriptPlayMapMusic);\n}\n\nbool8 PlayerHasGrassPokemonInParty(void)\n{\n    u32 i;\n    struct Pokemon * pokemon;\n    u16 species;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        pokemon = &gPlayerParty[i];\n        if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES)\n         && !GetMonData(pokemon, MON_DATA_IS_EGG)\n        )\n        {\n            species = GetMonData(pokemon, MON_DATA_SPECIES);\n            if (gSpeciesInfo[species].types[0] == TYPE_GRASS || gSpeciesInfo[species].types[1] == TYPE_GRASS)\n                return TRUE;\n        }\n    }\n    return FALSE;\n}\n\n#define tState data[0]\n#define tTimer data[1]\n\nvoid AnimatePcTurnOn(void)\n{\n    u8 taskId;\n\n    if (FuncIsActiveTask(Task_AnimatePcTurnOn) != TRUE)\n    {\n        taskId = CreateTask(Task_AnimatePcTurnOn, 8);\n        gTasks[taskId].tState = 0;\n        gTasks[taskId].tTimer = 0;\n    }\n}\n\n// PC flickers on and off while turning on\nstatic void Task_AnimatePcTurnOn(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (tTimer == 6)\n    {\n        PcTurnOnUpdateMetatileId(tState & 1);\n        DrawWholeMapView();\n        tTimer = 0;\n        tState++;\n        if (tState == 5)\n            DestroyTask(taskId);\n    }\n    tTimer++;\n}\n\n#undef tState\n#undef tTimer\n\nstatic void PcTurnOnUpdateMetatileId(bool16 flickerOff)\n{\n    u16 metatileId = 0;\n    s8 deltaX = 0;\n    s8 deltaY = 0;\n    u8 direction = GetPlayerFacingDirection();\n\n    switch (direction)\n    {\n    case DIR_NORTH:\n        deltaX = 0;\n        deltaY = -1;\n        break;\n    case DIR_WEST:\n        deltaX = -1;\n        deltaY = -1;\n        break;\n    case DIR_EAST:\n        deltaX = 1;\n        deltaY = -1;\n        break;\n    }\n    if (flickerOff)\n    {\n        if (gSpecialVar_0x8004 == 0)\n            metatileId = METATILE_Building_PCOff;\n        else if (gSpecialVar_0x8004 == 1)\n            metatileId = METATILE_GenericBuilding1_PlayersPCOff;\n        else if (gSpecialVar_0x8004 == 2)\n            metatileId = METATILE_GenericBuilding1_PlayersPCOff;\n    }\n    else\n    {\n        if (gSpecialVar_0x8004 == 0)\n            metatileId = METATILE_Building_PCOn;\n        else if (gSpecialVar_0x8004 == 1)\n            metatileId = METATILE_GenericBuilding1_PlayersPCOn;\n        else if (gSpecialVar_0x8004 == 2)\n            metatileId = METATILE_GenericBuilding1_PlayersPCOn;\n    }\n    MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + deltaX + MAP_OFFSET, gSaveBlock1Ptr->pos.y + deltaY + MAP_OFFSET, metatileId | MAPGRID_COLLISION_MASK);\n}\n\nvoid AnimatePcTurnOff()\n{\n    u16 metatileId = 0;\n    s8 deltaX = 0;\n    s8 deltaY = 0;\n    u8 direction = GetPlayerFacingDirection();\n\n    switch (direction)\n    {\n    case DIR_NORTH:\n        deltaX = 0;\n        deltaY = -1;\n        break;\n    case DIR_WEST:\n        deltaX = -1;\n        deltaY = -1;\n        break;\n    case DIR_EAST:\n        deltaX = 1;\n        deltaY = -1;\n        break;\n    }\n    if (gSpecialVar_0x8004 == 0)\n        metatileId = METATILE_Building_PCOff;\n    else if (gSpecialVar_0x8004 == 1)\n        metatileId = METATILE_GenericBuilding1_PlayersPCOff;\n    else if (gSpecialVar_0x8004 == 2)\n        metatileId = METATILE_GenericBuilding1_PlayersPCOff;\n    MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + deltaX + MAP_OFFSET, gSaveBlock1Ptr->pos.y + deltaY + MAP_OFFSET, metatileId | MAPGRID_COLLISION_MASK);\n    DrawWholeMapView();\n}\n\nvoid SpawnCameraObject(void)\n{\n    u8 objectEventId = SpawnSpecialObjectEventParameterized(OBJ_EVENT_GFX_YOUNGSTER, 8, OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->pos.x + MAP_OFFSET, gSaveBlock1Ptr->pos.y + MAP_OFFSET, 3);\n    gObjectEvents[objectEventId].invisible = TRUE;\n    CameraObjectSetFollowedObjectId(gObjectEvents[objectEventId].spriteId);\n}\n\nvoid RemoveCameraObject(void)\n{\n    CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId());\n    RemoveObjectEventByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);\n}\n\nvoid BufferEReaderTrainerName(void)\n{\n    CopyEReaderTrainerName5(gStringVar1);\n}\n\n// Unused\nstatic const u8 sSlotMachineRandomSeeds[] = {\n    13,\n    14,\n    15,\n    16,\n    17,\n    18,\n    19,\n    20,\n    21,\n    22,\n    12,\n    2,\n    4,\n    5,\n    1,\n    8,\n    7,\n    11,\n    3,\n    10,\n    9,\n    6\n};\n\nstatic const u8 sSlotMachineIndices[] = {\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    1,\n    1,\n    2,\n    2,\n    2,\n    3,\n    3,\n    3,\n    4,\n    4,\n    5\n};\n\nu8 GetRandomSlotMachineId(void)\n{\n    u16 rval = Random() % NELEMS(sSlotMachineIndices);\n    return sSlotMachineIndices[rval];\n}\n\nbool8 LeadMonHasEffortRibbon(void)\n{\n    u8 leadMonIdx = GetLeadMonIndex();\n    return GetMonData(&gPlayerParty[leadMonIdx], MON_DATA_EFFORT_RIBBON, NULL);\n}\n\nvoid GiveLeadMonEffortRibbon(void)\n{\n    u8 leadMonIdx;\n    bool8 param;\n    IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS);\n    FlagSet(FLAG_SYS_RIBBON_GET);\n    param = TRUE;\n    leadMonIdx = GetLeadMonIndex();\n    SetMonData(&gPlayerParty[leadMonIdx], MON_DATA_EFFORT_RIBBON, &param);\n}\n\nbool8 AreLeadMonEVsMaxedOut(void)\n{\n    u8 leadMonIndex = GetLeadMonIndex();\n    if (GetMonEVCount(&gPlayerParty[leadMonIndex]) >= 510)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 IsStarterFirstStageInParty(void)\n{\n    u16 species = GetStarterSpeciesById(VarGet(VAR_STARTER_MON));\n    u8 partyCount = CalculatePlayerPartyCount();\n    u32 i;\n    for (i = 0; i < partyCount; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) == species)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nbool8 IsThereRoomInAnyBoxForMorePokemon(void)\n{\n    u32 i;\n    u32 j;\n    for (i = 0; i < TOTAL_BOXES_COUNT; i++)\n    {\n        for (j = 0; j < IN_BOX_COUNT; j++)\n        {\n            if (GetBoxMonDataAt(i, j, MON_DATA_SPECIES) == SPECIES_NONE)\n                return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nbool8 IsPokerusInParty(void)\n{\n    if (!CheckPartyPokerus(gPlayerParty, 0x3F))\n        return FALSE;\n    else\n        return TRUE;\n}\n\n#define tXtrans   data[0]\n#define tTimer    data[1]\n#define tNremain  data[2]\n#define tDuration data[3]\n#define tYtrans   data[4]\n\nvoid ShakeScreen(void)\n{\n    /*\n     * 0x8004 = x translation\n     * 0x8005 = y translation\n     * 0x8006 = num interations\n     * 0x8007 = duration of an iteration\n     */\n    u8 taskId = CreateTask(Task_ShakeScreen, 9);\n    gTasks[taskId].tXtrans = gSpecialVar_0x8005;\n    gTasks[taskId].tTimer = 0;\n    gTasks[taskId].tNremain = gSpecialVar_0x8006;\n    gTasks[taskId].tDuration = gSpecialVar_0x8007;\n    gTasks[taskId].tYtrans = gSpecialVar_0x8004;\n    SetCameraPanningCallback(NULL);\n    PlaySE(SE_M_STRENGTH);\n}\n\nstatic void Task_ShakeScreen(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    tTimer++;\n    if (tTimer % tDuration == 0)\n    {\n        tTimer = 0;\n        tNremain--;\n        tXtrans = -tXtrans;\n        tYtrans = -tYtrans;\n        SetCameraPanning(tXtrans, tYtrans);\n        if (tNremain == 0)\n        {\n            Task_EndScreenShake(taskId);\n            InstallCameraPanAheadCallback();\n        }\n    }\n}\n\nstatic void Task_EndScreenShake(u8 taskId)\n{\n    DestroyTask(taskId);\n    ScriptContext_Enable();\n}\n\n#undef tYtrans\n#undef tDuration\n#undef tNremain\n#undef tTimer\n#undef tXtrans\n\nu8 GetLeadMonIndex(void)\n{\n    u8 partyCount = CalculatePlayerPartyCount();\n    u32 i;\n    struct Pokemon * pokemon;\n    for (i = 0; i < partyCount; i++)\n    {\n        pokemon = &gPlayerParty[i];\n        if (GetMonData(pokemon, MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_EGG && GetMonData(pokemon, MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_NONE)\n            return i;\n    }\n    return 0;\n}\n\nu16 GetPartyMonSpecies(void)\n{\n    return GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES_OR_EGG, NULL);\n}\n\nbool8 IsMonOTNameNotPlayers(void)\n{\n    GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_NAME, gStringVar1);\n    \n    if (!StringCompare(gSaveBlock2Ptr->playerName, gStringVar1))\n        return FALSE;\n    else\n        return TRUE;\n}\n\n// Used to nop all the unused specials from RS\nvoid NullFieldSpecial(void)\n{\n\n}\n\nvoid DoPicboxCancel(void)\n{\n    u8 t = EOS;\n    AddTextPrinterParameterized(0, FONT_NORMAL, &t, 0, 1, 0, NULL);\n    PicboxCancel();\n}\n\nvoid SetVermilionTrashCans(void)\n{\n    u16 idx = (Random() % 15) + 1;\n    gSpecialVar_0x8004 = idx;\n    gSpecialVar_0x8005 = idx;\n    switch (gSpecialVar_0x8004)\n    {\n    case 1:\n        idx = Random() % 2;\n        if (idx == 0)\n            gSpecialVar_0x8005 += 1;\n        else\n            gSpecialVar_0x8005 += 5;\n        break;\n    case 2:\n    case 3:\n    case 4:\n        idx = Random() % 3;\n        if (idx == 0)\n            gSpecialVar_0x8005 += 1;\n        else if (idx == 1)\n            gSpecialVar_0x8005 += 5;\n        else\n            gSpecialVar_0x8005 -= 1;\n        break;\n    case 5:\n        idx = Random() % 2;\n        if (idx == 0)\n            gSpecialVar_0x8005 += 5;\n        else\n            gSpecialVar_0x8005 -= 1;\n        break;\n    case 6:\n        idx = Random() % 3;\n        if (idx == 0)\n            gSpecialVar_0x8005 -= 5;\n        else if (idx == 1)\n            gSpecialVar_0x8005 += 1;\n        else\n            gSpecialVar_0x8005 += 5;\n        break;\n    case 7:\n    case 8:\n    case 9:\n        idx = Random() % 4;\n        if (idx == 0)\n            gSpecialVar_0x8005 -= 5;\n        else if (idx == 1)\n            gSpecialVar_0x8005 += 1;\n        else if (idx == 2)\n            gSpecialVar_0x8005 += 5;\n        else\n            gSpecialVar_0x8005 -= 1;\n        break;\n    case 10:\n        idx = Random() % 3;\n        if (idx == 0)\n            gSpecialVar_0x8005 -= 5;\n        else if (idx == 1)\n            gSpecialVar_0x8005 += 5;\n        else\n            gSpecialVar_0x8005 -= 1;\n        break;\n    case 11:\n        idx = Random() % 2;\n        if (idx == 0)\n            gSpecialVar_0x8005 -= 5;\n        else\n            gSpecialVar_0x8005 += 1;\n        break;\n    case 12:\n    case 13:\n    case 14:\n        idx = Random() % 3;\n        if (idx == 0)\n            gSpecialVar_0x8005 -= 5;\n        else if (idx == 1)\n            gSpecialVar_0x8005 += 1;\n        else\n            gSpecialVar_0x8005 -= 1;\n        break;\n    case 15:\n        idx = Random() % 2;\n        if (idx == 0)\n            gSpecialVar_0x8005 -= 5;\n        else\n            gSpecialVar_0x8005 -= 1;\n        break;\n    }\n    if (gSpecialVar_0x8005 > 15)\n    {\n        if (gSpecialVar_0x8004 % 5 == 1)\n            gSpecialVar_0x8005 = gSpecialVar_0x8004 + 1;\n        else if (gSpecialVar_0x8004 % 5 == 0)\n            gSpecialVar_0x8005 = gSpecialVar_0x8004 - 1;\n        else\n            gSpecialVar_0x8005 = gSpecialVar_0x8004 + 1;\n    }\n}\n\nstatic const u16 sResortGorgeousDeluxeRewards[] = {\n    ITEM_BIG_PEARL,\n    ITEM_PEARL,\n    ITEM_STARDUST,\n    ITEM_STAR_PIECE,\n    ITEM_NUGGET,\n    ITEM_RARE_CANDY\n};\n\nvoid IncrementResortGorgeousStepCounter(void)\n{\n    u16 var4035 = VarGet(VAR_RESORT_GOREGEOUS_STEP_COUNTER);\n    if (VarGet(VAR_RESORT_GORGEOUS_REQUESTED_MON) != SPECIES_NONE)\n    {\n        var4035++;\n        if (var4035 >= 250)\n        {\n            VarSet(VAR_RESORT_GORGEOUS_REQUESTED_MON, 0xFFFF);\n            VarSet(VAR_RESORT_GOREGEOUS_STEP_COUNTER, 0);\n        }\n        else\n        {\n            VarSet(VAR_RESORT_GOREGEOUS_STEP_COUNTER, var4035);\n        }\n    }\n}\n\nvoid SampleResortGorgeousMonAndReward(void)\n{\n    u16 requestedSpecies = VarGet(VAR_RESORT_GORGEOUS_REQUESTED_MON);\n    if (requestedSpecies == SPECIES_NONE || requestedSpecies == 0xFFFF)\n    {\n        VarSet(VAR_RESORT_GORGEOUS_REQUESTED_MON, SampleResortGorgeousMon());\n        VarSet(VAR_RESORT_GORGEOUS_REWARD, SampleResortGorgeousReward());\n        VarSet(VAR_RESORT_GOREGEOUS_STEP_COUNTER, 0);\n    }\n    StringCopy(gStringVar1, gSpeciesNames[VarGet(VAR_RESORT_GORGEOUS_REQUESTED_MON)]);\n}\n\nstatic u16 SampleResortGorgeousMon(void)\n{\n    u32 i;\n    u16 species;\n    for (i = 0; i < 100; i++)\n    {\n        species = (Random() % (NUM_SPECIES - 1)) + 1;\n        if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == TRUE)\n            return species;\n    }\n    while (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 0) != TRUE)\n    {\n        if (species == SPECIES_BULBASAUR)\n            species = NUM_SPECIES - 1;\n        else\n            species--;\n    }\n    return species;\n}\n\nstatic u16 SampleResortGorgeousReward(void)\n{\n    if ((Random() % 100) >= 30)\n        return ITEM_LUXURY_BALL;\n    else\n        return sResortGorgeousDeluxeRewards[Random() % NELEMS(sResortGorgeousDeluxeRewards)];\n}\n\nbool8 CheckAddCoins(void)\n{\n    if (gSpecialVar_Result + gSpecialVar_0x8006 > 9999)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic const struct WindowTemplate sElevatorCurrentFloorWindowTemplate = {\n    .bg = 0,\n    .tilemapLeft = 22,\n    .tilemapTop = 1,\n    .width = 7,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x008\n};\n\nstatic const u8 *const sFloorNamePointers[] = {\n    gText_B4F,\n    gText_B3F,\n    gText_B2F,\n    gText_B1F,\n    gText_1F,\n    gText_2F,\n    gText_3F,\n    gText_4F,\n    gText_5F,\n    gText_6F,\n    gText_7F,\n    gText_8F,\n    gText_9F,\n    gText_10F,\n    gText_11F,\n    gText_Rooftop\n};\n\n// Unused\nstatic const u8 sFloorNameWidthPadding[] = {\n    26,\n    26,\n    26,\n    26,\n    30,\n    30,\n    30,\n    30,\n    30,\n    30,\n    30,\n    30,\n    30,\n    26,\n    26,\n    18\n};\n\nstatic const u16 sElevatorWindowMetatilesGoingUp[][3] = {\n    {\n        METATILE_SilphCo_ElevatorWindow_Top0, \n        METATILE_SilphCo_ElevatorWindow_Top1, \n        METATILE_SilphCo_ElevatorWindow_Top2\n    },\n    {\n        METATILE_SilphCo_ElevatorWindow_Mid0, \n        METATILE_SilphCo_ElevatorWindow_Mid1, \n        METATILE_SilphCo_ElevatorWindow_Mid2\n    },\n    {\n        METATILE_SilphCo_ElevatorWindow_Bottom0, \n        METATILE_SilphCo_ElevatorWindow_Bottom1, \n        METATILE_SilphCo_ElevatorWindow_Bottom2\n    }\n};\n\nstatic const u16 sElevatorWindowMetatilesGoingDown[][3] = {\n    {\n        METATILE_SilphCo_ElevatorWindow_Top0, \n        METATILE_SilphCo_ElevatorWindow_Top2, \n        METATILE_SilphCo_ElevatorWindow_Top1\n    },\n    {\n        METATILE_SilphCo_ElevatorWindow_Mid0, \n        METATILE_SilphCo_ElevatorWindow_Mid2, \n        METATILE_SilphCo_ElevatorWindow_Mid1\n    },\n    {\n        METATILE_SilphCo_ElevatorWindow_Bottom0, \n        METATILE_SilphCo_ElevatorWindow_Bottom2, \n        METATILE_SilphCo_ElevatorWindow_Bottom1\n    }\n};\n\nstatic const u8 sElevatorAnimationDuration[] = {\n    8,\n    16,\n    24,\n    32,\n    38,\n    46,\n    53,\n    56,\n    57\n};\n\nstatic const u8 sElevatorWindowAnimDuration[] = {\n    3,\n    6,\n    9,\n    12,\n    15,\n    18,\n    21,\n    24,\n    27\n};\n\nvoid GetElevatorFloor(void)\n{\n    u16 floor = 4;\n    if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_B1F))\n    {\n        switch (gSaveBlock1Ptr->dynamicWarp.mapNum)\n        {\n        case MAP_NUM(SILPH_CO_1F):\n            floor = 4;\n            break;\n        case MAP_NUM(SILPH_CO_2F):\n            floor = 5;\n            break;\n        case MAP_NUM(SILPH_CO_3F):\n            floor = 6;\n            break;\n        case MAP_NUM(SILPH_CO_4F):\n            floor = 7;\n            break;\n        case MAP_NUM(SILPH_CO_5F):\n            floor = 8;\n            break;\n        case MAP_NUM(SILPH_CO_6F):\n            floor = 9;\n            break;\n        case MAP_NUM(SILPH_CO_7F):\n            floor = 10;\n            break;\n        case MAP_NUM(SILPH_CO_8F):\n            floor = 11;\n            break;\n        case MAP_NUM(SILPH_CO_9F):\n            floor = 12;\n            break;\n        case MAP_NUM(SILPH_CO_10F):\n            floor = 13;\n            break;\n        case MAP_NUM(SILPH_CO_11F):\n            floor = 14;\n            break;\n        case MAP_NUM(ROCKET_HIDEOUT_B1F):\n            floor = 3;\n            break;\n        case MAP_NUM(ROCKET_HIDEOUT_B2F):\n            floor = 2;\n            break;\n        case MAP_NUM(ROCKET_HIDEOUT_B4F):\n            floor = 0;\n            break;\n        }\n    }\n    if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_1F))\n    {\n        switch (gSaveBlock1Ptr->dynamicWarp.mapNum)\n        {\n        case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_1F):\n            floor = 4;\n            break;\n        case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_2F):\n            floor = 5;\n            break;\n        case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_3F):\n            floor = 6;\n            break;\n        case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_4F):\n            floor = 7;\n            break;\n        case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_5F):\n            floor = 8;\n            break;\n        }\n    }\n    if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(TRAINER_TOWER_1F))\n    {\n        switch (gSaveBlock1Ptr->dynamicWarp.mapNum)\n        {\n        case MAP_NUM(TRAINER_TOWER_1F):\n        case MAP_NUM(TRAINER_TOWER_2F):\n        case MAP_NUM(TRAINER_TOWER_3F):\n        case MAP_NUM(TRAINER_TOWER_4F):\n        case MAP_NUM(TRAINER_TOWER_5F):\n        case MAP_NUM(TRAINER_TOWER_6F):\n        case MAP_NUM(TRAINER_TOWER_7F):\n        case MAP_NUM(TRAINER_TOWER_8F):\n        case MAP_NUM(TRAINER_TOWER_ROOF):\n            floor = 15;\n            break;\n        case MAP_NUM(TRAINER_TOWER_LOBBY):\n            floor = 3;\n            break;\n        }\n    }\n    VarSet(VAR_ELEVATOR_FLOOR, floor);\n}\n\nu16 InitElevatorFloorSelectMenuPos(void)\n{\n    sElevatorScroll = 0;\n    sElevatorCursorPos = 0;\n\n    if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_B1F))\n    {\n        switch (gSaveBlock1Ptr->dynamicWarp.mapNum)\n        {\n        case MAP_NUM(SILPH_CO_11F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 0;\n            break;\n        case MAP_NUM(SILPH_CO_10F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 1;\n            break;\n        case MAP_NUM(SILPH_CO_9F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 2;\n            break;\n        case MAP_NUM(SILPH_CO_8F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 3;\n            break;\n        case MAP_NUM(SILPH_CO_7F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 4;\n            break;\n        case MAP_NUM(SILPH_CO_6F):\n            sElevatorScroll = 1;\n            sElevatorCursorPos = 4;\n            break;\n        case MAP_NUM(SILPH_CO_5F):\n            sElevatorScroll = 2;\n            sElevatorCursorPos = 4;\n            break;\n        case MAP_NUM(SILPH_CO_4F):\n            sElevatorScroll = 3;\n            sElevatorCursorPos = 4;\n            break;\n        case MAP_NUM(SILPH_CO_3F):\n            sElevatorScroll = 4;\n            sElevatorCursorPos = 4;\n            break;\n        case MAP_NUM(SILPH_CO_2F):\n            sElevatorScroll = 5;\n            sElevatorCursorPos = 4;\n            break;\n        case MAP_NUM(SILPH_CO_1F):\n            sElevatorScroll = 5;\n            sElevatorCursorPos = 5;\n            break;\n        case MAP_NUM(ROCKET_HIDEOUT_B1F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 0;\n            break;\n        case MAP_NUM(ROCKET_HIDEOUT_B2F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 1;\n            break;\n        case MAP_NUM(ROCKET_HIDEOUT_B4F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 2;\n            break;\n        }\n    }\n    if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_1F))\n    {\n        switch (gSaveBlock1Ptr->dynamicWarp.mapNum)\n        {\n        case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_5F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 0;\n            break;\n        case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_4F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 1;\n            break;\n        case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_3F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 2;\n            break;\n        case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_2F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 3;\n            break;\n        case MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_1F):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 4;\n            break;\n        }\n    }\n    if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(TRAINER_TOWER_1F))\n    {\n        switch (gSaveBlock1Ptr->dynamicWarp.mapNum)\n        {\n        case MAP_NUM(TRAINER_TOWER_1F):\n        case MAP_NUM(TRAINER_TOWER_2F):\n        case MAP_NUM(TRAINER_TOWER_3F):\n        case MAP_NUM(TRAINER_TOWER_4F):\n        case MAP_NUM(TRAINER_TOWER_5F):\n        case MAP_NUM(TRAINER_TOWER_6F):\n        case MAP_NUM(TRAINER_TOWER_7F):\n        case MAP_NUM(TRAINER_TOWER_8F):\n        case MAP_NUM(TRAINER_TOWER_ROOF):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 0;\n            break;\n        case MAP_NUM(TRAINER_TOWER_LOBBY):\n            sElevatorScroll = 0;\n            sElevatorCursorPos = 1;\n            break;\n        }\n    }\n    return sElevatorCursorPos;\n}\n\nvoid AnimateElevator(void)\n{\n    u16 nfloors;\n    s16 *data = gTasks[CreateTask(Task_ElevatorShake, 9)].data;\n    data[1] = 0;\n    data[2] = 0;\n    data[4] = 1;\n    if (gSpecialVar_0x8005 > gSpecialVar_0x8006)\n    {\n        nfloors = gSpecialVar_0x8005 - gSpecialVar_0x8006;\n        data[6] = 1;\n    }\n    else\n    {\n        nfloors = gSpecialVar_0x8006 - gSpecialVar_0x8005;\n        data[6] = 0;\n    }\n    if (nfloors > 8)\n        nfloors = 8;\n    data[5] = sElevatorAnimationDuration[nfloors];\n    SetCameraPanningCallback(NULL);\n    AnimateElevatorWindowView(nfloors, data[6]);\n    PlaySE(SE_ELEVATOR);\n}\n\nstatic void Task_ElevatorShake(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    data[1]++;\n    if ((data[1] % 3) == 0)\n    {\n        data[1] = 0;\n        data[2]++;\n        data[4] = -data[4];\n        SetCameraPanning(0, data[4]);\n        if (data[2] == data[5])\n        {\n            PlaySE(SE_DING_DONG);\n            DestroyTask(taskId);\n            ScriptContext_Enable();\n            InstallCameraPanAheadCallback();\n        }\n    }\n}\n\nvoid DrawElevatorCurrentFloorWindow(void)\n{\n    const u8 *floorname;\n    u32 strwidth;\n\n    if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)\n        return;\n\n    sElevatorCurrentFloorWindowId = AddWindow(&sElevatorCurrentFloorWindowTemplate);\n    LoadStdWindowGfx(sElevatorCurrentFloorWindowId, 0x21D, BG_PLTT_ID(13));\n    DrawStdFrameWithCustomTileAndPalette(sElevatorCurrentFloorWindowId, FALSE, 0x21D, 13);\n    AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, FONT_NORMAL, gText_NowOn, 0, 2, 0xFF, NULL);\n    floorname = sFloorNamePointers[gSpecialVar_0x8005];\n    strwidth = GetStringWidth(FONT_NORMAL, floorname, 0);\n    AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, FONT_NORMAL, floorname, 56 - strwidth, 16, 0xFF, NULL);\n    PutWindowTilemap(sElevatorCurrentFloorWindowId);\n    CopyWindowToVram(sElevatorCurrentFloorWindowId, COPYWIN_FULL);\n}\n\nvoid CloseElevatorCurrentFloorWindow(void)\n{\n    ClearStdWindowAndFrameToTransparent(sElevatorCurrentFloorWindowId, TRUE);\n    RemoveWindow(sElevatorCurrentFloorWindowId);\n}\n\nstatic void AnimateElevatorWindowView(u16 nfloors, u8 direction)\n{\n    u8 taskId;\n    if (FuncIsActiveTask(Task_AnimateElevatorWindowView) != TRUE)\n    {\n        taskId = CreateTask(Task_AnimateElevatorWindowView, 8);\n        gTasks[taskId].data[0] = 0;\n        gTasks[taskId].data[1] = 0;\n        gTasks[taskId].data[2] = direction;\n        gTasks[taskId].data[3] = sElevatorWindowAnimDuration[nfloors];\n    }\n}\n\nstatic void Task_AnimateElevatorWindowView(u8 taskId)\n{\n    u32 i;\n    u32 j;\n    s16 *data = gTasks[taskId].data;\n    if (data[1] == 6)\n    {\n        data[0]++;\n        if (data[2] == 0)\n        {\n            for (i = 0; i < 3; i++)\n            {\n                for (j = 0; j < 3; j++)\n                    MapGridSetMetatileIdAt(j + 1 + MAP_OFFSET, i + MAP_OFFSET, sElevatorWindowMetatilesGoingUp[i][data[0] % 3] | MAPGRID_COLLISION_MASK);\n            }\n        }\n        else\n        {\n            for (i = 0; i < 3; i++)\n            {\n                for (j = 0; j < 3; j++)\n                    MapGridSetMetatileIdAt(j + 1 + MAP_OFFSET, i + MAP_OFFSET, sElevatorWindowMetatilesGoingDown[i][data[0] % 3] | MAPGRID_COLLISION_MASK);\n            }\n        }\n        DrawWholeMapView();\n        data[1] = 0;\n        if (data[0] == data[3])\n            DestroyTask(taskId);\n    }\n    data[1]++;\n}\n\nvoid ListMenu(void)\n{\n    u8 taskId;\n    struct Task *task;\n\n    if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)\n        return;\n        \n    taskId = CreateTask(Task_CreateScriptListMenu, 8);\n    task = &gTasks[taskId];\n    switch (gSpecialVar_0x8004)\n    {\n    case LISTMENU_BADGES:\n        task->data[0] = 4;\n        task->data[1] = 9;\n        task->data[2] = 1;\n        task->data[3] = 1;\n        task->data[4] = 12;\n        task->data[5] = 7;\n        task->data[6] = 1;\n        task->data[15] = taskId;\n        break;\n    case LISTMENU_SILPHCO_FLOORS:\n        task->data[0] = 7;\n        task->data[1] = 12;\n        task->data[2] = 1;\n        task->data[3] = 1;\n        task->data[4] = 8;\n        task->data[5] = 12;\n        task->data[6] = 0;\n        task->data[15] = taskId;\n        task->data[7] = sElevatorScroll;\n        task->data[8] = sElevatorCursorPos;\n        break;\n    case LISTMENU_ROCKET_HIDEOUT_FLOORS: // Multichoice used instead\n        task->data[0] = 4;\n        task->data[1] = 4;\n        task->data[2] = 1;\n        task->data[3] = 1;\n        task->data[4] = 8;\n        task->data[5] = 8;\n        task->data[6] = 0;\n        task->data[15] = taskId;\n        break;\n    case LISTMENU_DEPT_STORE_FLOORS: // Multichoice used instead\n        task->data[0] = 4;\n        task->data[1] = 6;\n        task->data[2] = 1;\n        task->data[3] = 1;\n        task->data[4] = 8;\n        task->data[5] = 8;\n        task->data[6] = 0;\n        task->data[15] = taskId;\n        break;\n    case LISTMENU_WIRELESS_LECTURE_HEADERS: // Multichoice used instead\n        task->data[0] = 4;\n        task->data[1] = 4;\n        task->data[2] = 1;\n        task->data[3] = 1;\n        task->data[4] = 17;\n        task->data[5] = 8;\n        task->data[6] = 1;\n        task->data[15] = taskId;\n        break;\n    case LISTMENU_BERRY_POWDER:\n        task->data[0] = 7;\n        task->data[1] = 12;\n        task->data[2] = 16;\n        task->data[3] = 1;\n        task->data[4] = 17;\n        task->data[5] = 12;\n        task->data[6] = 0;\n        task->data[15] = taskId;\n        break;\n    case LISTMENU_TRAINER_TOWER_FLOORS: // Mulitchoice used instead\n        task->data[0] = 3;\n        task->data[1] = 3;\n        task->data[2] = 1;\n        task->data[3] = 1;\n        task->data[4] = 8;\n        task->data[5] = 6;\n        task->data[6] = 0;\n        task->data[15] = taskId;\n        break;\n    case LISTMENU_GYM_LEADERS:\n        task->data[0] = 4;\n        task->data[1] = 8;\n        task->data[2] = 1;\n        task->data[3] = 1;\n        task->data[4] = 12;\n        task->data[5] = 7;\n        task->data[6] = 0;\n        task->data[15] = taskId;\n        break;\n    case LISTMENU_MASTER_TRAINER_TITLES:\n        task->data[0] = 7;\n        task->data[1] = 153;\n        task->data[2] = 14;\n        task->data[3] = 1;\n        task->data[4] = 18;\n        task->data[5] = 12;\n        task->data[6] = 0;\n        task->data[15] = taskId;\n        break;\n    case 99:\n        break;\n    default:\n        gSpecialVar_Result = 0x7F;\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic const u8 *const sListMenuLabels[][12] = {\n    [LISTMENU_BADGES] = \n    {\n        gText_BoulderBadge,\n        gText_CascadeBadge,\n        gText_ThunderBadge,\n        gText_RainbowBadge,\n        gText_SoulBadge,\n        gText_MarshBadge,\n        gText_VolcanoBadge,\n        gText_EarthBadge,\n        gOtherText_Exit,\n    }, \n    [LISTMENU_SILPHCO_FLOORS] = \n    {\n        gText_11F,\n        gText_10F,\n        gText_9F,\n        gText_8F,\n        gText_7F,\n        gText_6F,\n        gText_5F,\n        gText_4F,\n        gText_3F,\n        gText_2F,\n        gText_1F,\n        gOtherText_Exit,\n    }, \n    [LISTMENU_ROCKET_HIDEOUT_FLOORS] = // Unncessary, MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR is used instead\n    {\n        gText_B1F,\n        gText_B2F,\n        gText_B4F,\n        gOtherText_Exit,\n    }, \n    [LISTMENU_DEPT_STORE_FLOORS] = // Unncessary, MULTICHOICE_DEPT_STORE_ELEVATOR is used instead\n    {\n        gText_5F,\n        gText_4F,\n        gText_3F,\n        gText_2F,\n        gText_1F,\n        gOtherText_Exit,\n    }, \n    [LISTMENU_WIRELESS_LECTURE_HEADERS] = // Unnecessary, MULTICHOICE_LINKED_DIRECT_UNION is used instead\n    {\n        gText_LinkedGamePlay,\n        gText_DirectCorner,\n        gText_UnionRoom,\n        gOtherText_Quit,\n    }, \n    [LISTMENU_BERRY_POWDER] = \n    {\n        gText_Energypowder_50,\n        gText_EnergyRoot_80,\n        gText_HealPowder_50,\n        gText_RevivalHerb_300,\n        gText_Protein_1000,\n        gText_Iron_1000,\n        gText_Carbos_1000,\n        gText_Calcium_1000,\n        gText_Zinc_1000,\n        gText_HpUp_1000,\n        gText_PpUp_3000,\n        gOtherText_Exit,\n    }, \n    [LISTMENU_TRAINER_TOWER_FLOORS] = // Unnecessary, MULTICHOICE_ROOFTOP_B1F is used instead\n    {\n        gText_Rooftop,\n        gText_B1F,\n        gOtherText_Exit,\n    },\n    [LISTMENU_GYM_LEADERS] =\n    {\n        gText_Brock,\n        gText_Misty,\n        gText_LtSurge,\n        gText_Erika,\n        gText_Koga,\n        gText_Sabrina,\n        gText_Blaine,\n        gOtherText_Exit,\n    },\n    [LISTMENU_MASTER_TRAINER_TITLES] =\n    {\n        gOtherText_Exit,\n    }\n};\n\n// to figure out how big the title list should be\nstatic u32 CountMasterTrainerFlags(void)\n{\n    u32 i;\n    bool8 flag = TRUE;\n    u32 count = 1;\n\n    flag = HasTrainerBeenFought(TRAINER_MASTER_OAK); //have all titles if beat Oak\n    if(flag)\n    {\n        count = 153; //max size\n        return count;\n    }\n\n    for(i = 1; i < 152; i++) //flags start at 1, which is SPECIES_BULBASAUR\n    {\n        flag = CheckMasterTrainerFlag(i);\n        if(flag)\n        {\n            count++;\n        }\n    }\n    return count;\n}\n\nstatic void Task_CreateScriptListMenu(u8 taskId)\n{\n    struct WindowTemplate template;\n    u32 i;\n    u32 j;\n    s32 width;\n    s32 mwidth;\n    struct Task *task = &gTasks[taskId];\n    u8 windowId;\n    u32 listSize;\n    LockPlayerFieldControls();\n    if (gSpecialVar_0x8004 == LISTMENU_SILPHCO_FLOORS)\n        sListMenuLastScrollPosition = sElevatorScroll;\n    else\n        sListMenuLastScrollPosition = 0;\n    if (gSpecialVar_0x8004 == LISTMENU_MASTER_TRAINER_TITLES)\n    {\n        u32 listSize = CountMasterTrainerFlags();\n        sListMenuItems = AllocZeroed((listSize + 1) * sizeof(struct ListMenuItem));\n        task->data[1] = listSize;\n        if(listSize < 7)\n        {\n            task->data[0] = listSize;\n            task->data[5] = (listSize - 1) + listSize;\n            if(listSize == 2)\n                task->data[5]++;\n        }\n        CreateScriptListMenu();\n        sFieldSpecialsListMenuTemplate.scrollMultiple = 1;\n        mwidth = 0;\n\n        for (i = 0; i < listSize; i++)\n        {\n            if(i != 0)\n            {\n                for( ; j < 152; j++) //152 because Grand Master is done elsewhere\n                {\n                    bool8 flag = TRUE;\n                    flag = CheckMasterTrainerFlag(j);\n                    if(!flag)\n                        continue;\n                    else\n                        break;\n                }\n            }\n            {   // new block because of C90 memes\n                const u8 *text = gTitleNames[j];\n                sListMenuItems[i].label = text;\n                sListMenuItems[i].index = j;\n                j++; // increment here because the break skips incrementing\n                width = GetStringWidth(2, sListMenuItems[i].label, 0);\n                if (width > mwidth)\n                    mwidth = width;\n            }\n        }\n        if(listSize == 153) // Grand Master handling because it doesn't use a regular Master Trainer flag\n        {\n            const u8 *text = gTitleNames[listSize - 1];\n            sListMenuItems[i].label = text;\n            sListMenuItems[i].index = listSize - 1;\n            width = GetStringWidth(2, sListMenuItems[listSize - 1].label, 0);\n            if (width > mwidth)\n                mwidth = width;\n        }\n    }\n    else\n    {\n        sListMenuItems = AllocZeroed(task->data[1] * sizeof(struct ListMenuItem));\n        CreateScriptListMenu();\n        mwidth = 0;\n        for (i = 0; i < task->data[1]; i++)\n        {\n            sListMenuItems[i].label = sListMenuLabels[gSpecialVar_0x8004][i];\n            sListMenuItems[i].index = i;\n            width = GetStringWidth(FONT_NORMAL, sListMenuItems[i].label, 0);\n            if (width > mwidth)\n                mwidth = width;\n        }\n    }\n    task->data[4] = (mwidth + 9) / 8 + 1;\n    if (task->data[2] + task->data[4] > 29)\n        task->data[2] = 29 - task->data[4];\n    template = SetWindowTemplateFields(0, task->data[2], task->data[3], task->data[4], task->data[5], 15, 0x038);\n    task->data[13] = windowId = AddWindow(&template);\n    SetStdWindowBorderStyle(task->data[13], 0);\n    sFieldSpecialsListMenuTemplate.totalItems = task->data[1];\n    sFieldSpecialsListMenuTemplate.maxShowed = task->data[0];\n    sFieldSpecialsListMenuTemplate.windowId = task->data[13];\n    Task_CreateMenuRemoveScrollIndicatorArrowPair(taskId);\n    task->data[14] = ListMenuInit(&sFieldSpecialsListMenuTemplate, task->data[7], task->data[8]);\n    PutWindowTilemap(task->data[13]);\n    CopyWindowToVram(task->data[13], COPYWIN_FULL);\n    gTasks[taskId].func = Task_ListMenuHandleInput;\n}\n\nstatic void CreateScriptListMenu(void)\n{\n    sFieldSpecialsListMenuTemplate.items = sListMenuItems;\n    sFieldSpecialsListMenuTemplate.moveCursorFunc = ScriptListMenuMoveCursorFunction;\n    sFieldSpecialsListMenuTemplate.itemPrintFunc = NULL;\n    sFieldSpecialsListMenuTemplate.totalItems = 1;\n    sFieldSpecialsListMenuTemplate.maxShowed = 1;\n    sFieldSpecialsListMenuTemplate.windowId = 0;\n    sFieldSpecialsListMenuTemplate.header_X = 0;\n    sFieldSpecialsListMenuTemplate.item_X = 8;\n    sFieldSpecialsListMenuTemplate.cursor_X = 0;\n    sFieldSpecialsListMenuTemplate.upText_Y = 0;\n    sFieldSpecialsListMenuTemplate.cursorPal = 2;\n    sFieldSpecialsListMenuTemplate.fillValue = 1;\n    sFieldSpecialsListMenuTemplate.cursorShadowPal = 3;\n    sFieldSpecialsListMenuTemplate.lettersSpacing = 1;\n    sFieldSpecialsListMenuTemplate.itemVerticalPadding = 0;\n    sFieldSpecialsListMenuTemplate.scrollMultiple = 0;\n    sFieldSpecialsListMenuTemplate.fontId = FONT_NORMAL;\n    sFieldSpecialsListMenuTemplate.cursorKind = 0;\n}\n\nstatic void ScriptListMenuMoveCursorFunction(s32 nothing, bool8 is, struct ListMenu * used)\n{\n    u8 taskId;\n    struct Task *task;\n    PlaySE(SE_SELECT);\n    taskId = FindTaskIdByFunc(Task_ListMenuHandleInput);\n    if (taskId != 0xFF)\n    {\n        task = &gTasks[taskId];\n        ListMenuGetScrollAndRow(task->data[14], &sFieldSpecialsListMenuScrollBuffer, NULL);\n        sListMenuLastScrollPosition = sFieldSpecialsListMenuScrollBuffer;\n    }\n}\n\nstatic void Task_ListMenuHandleInput(u8 taskId)\n{\n    s32 input;\n    struct Task *task;\n\n    task = &gTasks[taskId];\n    task++;task--;\n    input = ListMenu_ProcessInput(task->data[14]);\n    switch (input)\n    {\n    case -1:\n        break;\n    case -2:\n        if (gSpecialVar_0x8004 == LISTMENU_MASTER_TRAINER_TITLES)\n            gSpecialVar_Result = 153;\n        else\n            gSpecialVar_Result = 0x7F;\n        PlaySE(SE_SELECT);\n        Task_DestroyListMenu(taskId);\n        break;\n    default:\n        gSpecialVar_Result = input;\n        PlaySE(SE_SELECT);\n        if (task->data[6] == 0 || input == task->data[1] - 1)\n        {\n            Task_DestroyListMenu(taskId);\n        }\n        else\n        {\n            Task_ListMenuRemoveScrollIndicatorArrowPair(taskId);\n            task->func = Task_SuspendListMenu;\n            ScriptContext_Enable();\n        }\n        break;\n    }\n}\n\nstatic void Task_DestroyListMenu(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    Task_ListMenuRemoveScrollIndicatorArrowPair(taskId);\n    DestroyListMenuTask(task->data[14], NULL, NULL);\n    Free(sListMenuItems);\n    ClearStdWindowAndFrameToTransparent(task->data[13], TRUE);\n    FillWindowPixelBuffer(task->data[13], PIXEL_FILL(0));\n    ClearWindowTilemap(task->data[13]);\n    CopyWindowToVram(task->data[13], COPYWIN_GFX);\n    RemoveWindow(task->data[13]);\n    DestroyTask(taskId);\n    ScriptContext_Enable();\n}\n\nstatic void Task_SuspendListMenu(u8 taskId)\n{\n    switch (gTasks[taskId].data[6])\n    {\n    case 1:\n        break;\n    case 2:\n        gTasks[taskId].data[6] = 1;\n        gTasks[taskId].func = Task_RedrawScrollArrowsAndWaitInput;\n        break;\n    }\n}\n\nvoid ReturnToListMenu(void)\n{\n    u8 taskId = FindTaskIdByFunc(Task_SuspendListMenu);\n    if (taskId == 0xFF)\n        ScriptContext_Enable();\n    else\n        gTasks[taskId].data[6]++;\n}\n\nstatic void Task_RedrawScrollArrowsAndWaitInput(u8 taskId)\n{\n    LockPlayerFieldControls();\n    Task_CreateMenuRemoveScrollIndicatorArrowPair(taskId);\n    gTasks[taskId].func = Task_ListMenuHandleInput;\n}\n\nstatic void Task_CreateMenuRemoveScrollIndicatorArrowPair(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    struct ScrollArrowsTemplate template = {\n        .firstArrowType = 2,\n        .secondArrowType = 3,\n        .tileTag = 2000,\n        .palTag = 100\n    };\n    if (task->data[0] != task->data[1])\n    {\n        template.firstX = 4 * task->data[4] + 8 * task->data[2];\n        template.firstY = 8;\n        template.secondX = 4 * task->data[4] + 8 * task->data[2];\n        template.secondY = 8 * task->data[5] + 10;\n        template.fullyUpThreshold = 0;\n        template.fullyDownThreshold = task->data[1] - task->data[0];\n        task->data[12] = AddScrollIndicatorArrowPair(&template, &sListMenuLastScrollPosition);\n    }\n}\n\nstatic void Task_ListMenuRemoveScrollIndicatorArrowPair(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    if (task->data[0] != task->data[1])\n        RemoveScrollIndicatorArrowPair(task->data[12]);\n}\n\nvoid ForcePlayerToStartSurfing(void)\n{\n    SetHelpContext(HELPCONTEXT_SURFING);\n    SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_SURFING);\n}\n\nstatic const u16 sStarterSpecies[] = {\n    SPECIES_BULBASAUR,\n    SPECIES_SQUIRTLE,\n    SPECIES_CHARMANDER\n};\n\nstatic u16 GetStarterSpeciesById(u16 idx)\n{\n    if (idx >= NELEMS(sStarterSpecies))\n        idx = 0;\n    return sStarterSpecies[idx];\n}\n\nu16 GetStarterSpecies(void)\n{\n    return GetStarterSpeciesById(VarGet(VAR_STARTER_MON));\n}\n\nvoid SetSeenMon(void)\n{\n    GetSetPokedexFlag(SpeciesToNationalPokedexNum(gSpecialVar_0x8004), 2);\n}\n\nvoid ResetContextNpcTextColor(void)\n{\n    gSelectedObjectEvent = 0;\n    gSpecialVar_TextColor = NPC_TEXT_COLOR_DEFAULT;\n}\n\nu8 ContextNpcGetTextColor(void)\n{\n    u8 gfxId;\n    if (gSpecialVar_TextColor != NPC_TEXT_COLOR_DEFAULT)\n    {\n        // A text color has been specified, use that\n        return gSpecialVar_TextColor;\n    }\n    else if (gSelectedObjectEvent == 0)\n    {\n        // No text color specified and no object selected, use neutral\n        return NPC_TEXT_COLOR_NEUTRAL;\n    }\n    else\n    {\n        // An object is selected and no color has been specified.\n        // Use the text color normally associated with this object's sprite.\n        gfxId = gObjectEvents[gSelectedObjectEvent].graphicsId;\n        if (gfxId >= OBJ_EVENT_GFX_VAR_0)\n            gfxId = VarGetObjectEventGraphicsId(gfxId - OBJ_EVENT_GFX_VAR_0);\n        return GetColorFromTextColorTable(gfxId);\n    }\n}\n\nstatic bool8 HasMonBeenRenamed(u8 idx)\n{\n    struct Pokemon * pokemon = &gPlayerParty[idx];\n    u8 language;\n    GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1);\n    language = GetMonData(pokemon, MON_DATA_LANGUAGE, &language);\n    if (language != LANGUAGE_ENGLISH)\n        return TRUE;\n    else if (StringCompare(gSpeciesNames[GetMonData(pokemon, MON_DATA_SPECIES, NULL)], gStringVar1) != 0)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 HasLeadMonBeenRenamed(void)\n{\n    return HasMonBeenRenamed(GetLeadMonIndex());\n}\n\nvoid TV_PrintIntToStringVar(u8 varidx, s32 number)\n{\n    s32 n = CountDigits(number);\n    ConvertIntToDecimalStringN(sStringVarPtrs[varidx], number, STR_CONV_MODE_LEFT_ALIGN, n);\n}\n\ns32 CountDigits(s32 number)\n{\n    if (number / 10 == 0)\n        return 1;\n    else if (number / 100 == 0)\n        return 2;\n    else if (number / 1000 == 0)\n        return 3;\n    else if (number / 10000 == 0)\n        return 4;\n    else if (number / 100000 == 0)\n        return 5;\n    else if (number / 1000000 == 0)\n        return 6;\n    else if (number / 10000000 == 0)\n        return 7;\n    else if (number / 100000000 == 0)\n        return 8;\n    else\n        return 1;\n}\n\nbool8 NameRaterWasNicknameChanged(void)\n{\n    struct Pokemon * pokemon = &gPlayerParty[gSpecialVar_0x8004];\n    GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1);\n    if (StringCompare(gStringVar3, gStringVar1) == 0)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nvoid ChangeBoxPokemonNickname(void)\n{\n    struct BoxPokemon * pokemon = GetBoxedMonPtr(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos);\n    u16 species;\n    u8 gender;\n    u32 personality;\n\n\n    GetBoxMonData(pokemon, MON_DATA_NICKNAME, gStringVar3);\n    GetBoxMonData(pokemon, MON_DATA_NICKNAME, gStringVar2);\n    species = GetBoxMonData(pokemon, MON_DATA_SPECIES, NULL);\n    gender = GetBoxMonGender(pokemon);\n    personality = GetBoxMonData(pokemon, MON_DATA_PERSONALITY, NULL);\n    DoNamingScreen(NAMING_SCREEN_NICKNAME, gStringVar2, species, gender, personality, ChangeBoxPokemonNickname_CB);\n}\n\nstatic void ChangeBoxPokemonNickname_CB(void)\n{\n    SetBoxMonNickAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, gStringVar2);\n    CB2_ReturnToFieldContinueScriptPlayMapMusic();\n}\n\nvoid ChangePokemonNickname(void)\n{\n    u16 species;\n    u8 gender;\n    u32 personality;\n\n    GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar3);\n    GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar2);\n    species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL);\n    gender = GetMonGender(&gPlayerParty[gSpecialVar_0x8004]);\n    personality = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_PERSONALITY, NULL);\n    DoNamingScreen(NAMING_SCREEN_NICKNAME, gStringVar2, species, gender, personality, ChangePokemonNickname_CB);\n}\n\nstatic void ChangePokemonNickname_CB(void)\n{\n    SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar2);\n    CB2_ReturnToFieldContinueScriptPlayMapMusic();\n}\n\nvoid BufferMonNickname(void)\n{\n    GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1);\n    StringGet_Nickname(gStringVar1);\n}\n\nvoid IsMonOTIDNotPlayers(void)\n{\n    if (GetPlayerTrainerId() == GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_ID, NULL))\n        gSpecialVar_Result = FALSE;\n    else\n        gSpecialVar_Result = TRUE;\n}\n\nu32 GetPlayerTrainerId(void)\n{\n    return (gSaveBlock2Ptr->playerTrainerId[3] << 24) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0];\n}\n\nu8 GetUnlockedSeviiAreas(void)\n{\n    u8 result = 0;\n    if (FlagGet(FLAG_WORLD_MAP_ONE_ISLAND) == TRUE)\n        result |= 1 << 0;\n    if (FlagGet(FLAG_WORLD_MAP_TWO_ISLAND) == TRUE)\n        result |= 1 << 1;\n    if (FlagGet(FLAG_WORLD_MAP_THREE_ISLAND) == TRUE)\n        result |= 1 << 2;\n    if (FlagGet(FLAG_WORLD_MAP_FOUR_ISLAND) == TRUE)\n        result |= 1 << 3;\n    if (FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND) == TRUE)\n        result |= 1 << 4;\n    if (FlagGet(FLAG_WORLD_MAP_SIX_ISLAND) == TRUE)\n        result |= 1 << 5;\n    if (FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND) == TRUE)\n        result |= 1 << 6;\n    return result;\n}\n\nvoid UpdateTrainerCardPhotoIcons(void)\n{\n    u16 species[PARTY_SIZE];\n    u32 personality[PARTY_SIZE];\n    u32 i;\n    u8 partyCount;\n    for (i = 0; i < PARTY_SIZE; i++)\n        species[i] = SPECIES_NONE;\n    partyCount = CalculatePlayerPartyCount();\n    for (i = 0; i < partyCount; i++)\n    {\n        species[i] = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL);\n        personality[i] = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY, NULL);\n    }\n    VarSet(VAR_TRAINER_CARD_MON_ICON_1, SpeciesToMailSpecies(species[0], personality[0]));\n    VarSet(VAR_TRAINER_CARD_MON_ICON_2, SpeciesToMailSpecies(species[1], personality[1]));\n    VarSet(VAR_TRAINER_CARD_MON_ICON_3, SpeciesToMailSpecies(species[2], personality[2]));\n    VarSet(VAR_TRAINER_CARD_MON_ICON_4, SpeciesToMailSpecies(species[3], personality[3]));\n    VarSet(VAR_TRAINER_CARD_MON_ICON_5, SpeciesToMailSpecies(species[4], personality[4]));\n    VarSet(VAR_TRAINER_CARD_MON_ICON_6, SpeciesToMailSpecies(species[5], personality[5]));\n    VarSet(VAR_TRAINER_CARD_MON_ICON_TINT_IDX, gSpecialVar_0x8004);\n}\n\nu16 StickerManGetBragFlags(void)\n{\n    u16 result = 0;\n    u32 numEggs;\n    gSpecialVar_0x8004 = GetGameStat(GAME_STAT_ENTERED_HOF);\n    numEggs = GetGameStat(GAME_STAT_HATCHED_EGGS);\n    gSpecialVar_0x8006 = GetGameStat(GAME_STAT_LINK_BATTLE_WINS);\n    if (numEggs > 0xFFFF)\n        gSpecialVar_0x8005 = 0xFFFF;\n    else\n        gSpecialVar_0x8005 = numEggs;\n    if (gSpecialVar_0x8004 != 0)\n        result |= 1 << 0;\n    if (gSpecialVar_0x8005 != 0)\n        result |= 1 << 1;\n    if (gSpecialVar_0x8006 != 0)\n        result |= 1 << 2;\n    return result;\n}\n\nu16 GetHiddenItemAttr(u32 hiddenItem, u8 attr)\n{\n    if (attr == HIDDEN_ITEM_ITEM)\n        return GET_HIDDEN_ITEM_ITEM(hiddenItem);\n    else if (attr == HIDDEN_ITEM_FLAG)\n        return GET_HIDDEN_ITEM_FLAG(hiddenItem) + FLAG_HIDDEN_ITEMS_START;\n    else if (attr == HIDDEN_ITEM_QUANTITY)\n        return GET_HIDDEN_ITEM_QUANTITY(hiddenItem);\n    else if (attr == HIDDEN_ITEM_UNDERFOOT)\n        return GET_HIDDEN_ITEM_UNDERFOOT(hiddenItem);\n    else // Invalid\n        return 1;\n}\n\nbool8 DoesPlayerPartyContainSpecies(void)\n{\n    u8 partyCount = CalculatePlayerPartyCount();\n    u32 i;\n    for (i = 0; i < partyCount; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) == gSpecialVar_0x8004)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic const u8 sMartMaps[][3] = {\n    {MAP(VIRIDIAN_CITY_MART),   1},\n    {MAP(PEWTER_CITY_MART),     3},\n    {MAP(CERULEAN_CITY_MART),   1},\n    {MAP(LAVENDER_TOWN_MART),   1},\n    {MAP(VERMILION_CITY_MART),  1},\n    {MAP(FUCHSIA_CITY_MART),    1},\n    {MAP(CINNABAR_ISLAND_MART), 1},\n    {MAP(SAFFRON_CITY_MART),    1},\n    {MAP(THREE_ISLAND_MART),    1},\n    {MAP(FOUR_ISLAND_MART),     1},\n    {MAP(SEVEN_ISLAND_MART),    1},\n    {MAP(SIX_ISLAND_MART),      1}\n};\n\nu8 GetMartClerkObjectId(void)\n{\n    u32 i;\n    for (i = 0; i < NELEMS(sMartMaps); i++)\n    {\n        if (gSaveBlock1Ptr->location.mapGroup == sMartMaps[i][0] && gSaveBlock1Ptr->location.mapNum == sMartMaps[i][1])\n            return sMartMaps[i][2];\n    }\n    return 1;\n}\n\nvoid SetUsedPkmnCenterQuestLogEvent(void)\n{\n    SetQuestLogEvent(QL_EVENT_USED_PKMN_CENTER, NULL);\n}\n\nstatic const struct {\n    u16 inside_grp;\n    u16 inside_num;\n    u16 outside_grp;\n    u16 outside_num;\n} sInsideOutsidePairs[] = {\n    [QL_LOCATION_HOME]               = {MAP(PALLET_TOWN_PLAYERS_HOUSE_1F),          MAP(PALLET_TOWN)},\n    [QL_LOCATION_OAKS_LAB]           = {MAP(PALLET_TOWN_PROFESSOR_OAKS_LAB),        MAP(PALLET_TOWN)},\n    [QL_LOCATION_VIRIDIAN_GYM]       = {MAP(VIRIDIAN_CITY_GYM),                     MAP(VIRIDIAN_CITY)},\n    [QL_LOCATION_LEAGUE_GATE_1]      = {MAP(ROUTE22_NORTH_ENTRANCE),                MAP(ROUTE22)},\n    [QL_LOCATION_LEAGUE_GATE_2]      = {MAP(ROUTE22_NORTH_ENTRANCE),                MAP(ROUTE23)},\n    [QL_LOCATION_VIRIDIAN_FOREST_1]  = {MAP(VIRIDIAN_FOREST),                       MAP(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE)},\n    [QL_LOCATION_VIRIDIAN_FOREST_2]  = {MAP(VIRIDIAN_FOREST),                       MAP(ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE)},\n    [QL_LOCATION_PEWTER_MUSEUM]      = {MAP(PEWTER_CITY_MUSEUM_1F),                 MAP(PEWTER_CITY)},\n    [QL_LOCATION_PEWTER_GYM]         = {MAP(PEWTER_CITY_GYM),                       MAP(PEWTER_CITY)},\n    [QL_LOCATION_MT_MOON_1]          = {MAP(MT_MOON_1F),                            MAP(ROUTE4)},\n    [QL_LOCATION_MT_MOON_2]          = {MAP(MT_MOON_B1F),                           MAP(ROUTE4)},\n    [QL_LOCATION_CERULEAN_GYM]       = {MAP(CERULEAN_CITY_GYM),                     MAP(CERULEAN_CITY)},\n    [QL_LOCATION_BIKE_SHOP]          = {MAP(CERULEAN_CITY_BIKE_SHOP),               MAP(CERULEAN_CITY)},\n    [QL_LOCATION_BILLS_HOUSE]        = {MAP(ROUTE25_SEA_COTTAGE),                   MAP(ROUTE25)},\n    [QL_LOCATION_DAY_CARE]           = {MAP(ROUTE5_POKEMON_DAY_CARE),               MAP(ROUTE5)},\n    [QL_LOCATION_UNDERGROUND_PATH_1] = {MAP(UNDERGROUND_PATH_NORTH_ENTRANCE),       MAP(ROUTE5)},\n    [QL_LOCATION_UNDERGROUND_PATH_2] = {MAP(UNDERGROUND_PATH_SOUTH_ENTRANCE),       MAP(ROUTE6)},\n    [QL_LOCATION_PKMN_FAN_CLUB]      = {MAP(VERMILION_CITY_POKEMON_FAN_CLUB),       MAP(VERMILION_CITY)},\n    [QL_LOCATION_VERMILION_GYM]      = {MAP(VERMILION_CITY_GYM),                    MAP(VERMILION_CITY)},\n    [QL_LOCATION_SS_ANNE]            = {MAP(SSANNE_1F_CORRIDOR),                    MAP(VERMILION_CITY)},\n    [QL_LOCATION_DIGLETTS_CAVE_1]    = {MAP(DIGLETTS_CAVE_NORTH_ENTRANCE),          MAP(ROUTE2)},\n    [QL_LOCATION_DIGLETTS_CAVE_2]    = {MAP(DIGLETTS_CAVE_SOUTH_ENTRANCE),          MAP(ROUTE11)},\n    [QL_LOCATION_ROCK_TUNNEL_1]      = {MAP(ROCK_TUNNEL_1F),                        MAP(ROUTE10)},\n    [QL_LOCATION_ROCK_TUNNEL_2]      = {MAP(ROCK_TUNNEL_1F),                        MAP(ROUTE10)},\n    [QL_LOCATION_POWER_PLANT]        = {MAP(POWER_PLANT),                           MAP(ROUTE10)},\n    [QL_LOCATION_PKMN_TOWER]         = {MAP(POKEMON_TOWER_1F),                      MAP(LAVENDER_TOWN)},\n    [QL_LOCATION_VOLUNTEER_HOUSE]    = {MAP(LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE), MAP(LAVENDER_TOWN)},\n    [QL_LOCATION_NAME_RATERS_HOUSE]  = {MAP(LAVENDER_TOWN_HOUSE2),                  MAP(LAVENDER_TOWN)},\n    [QL_LOCATION_UNDERGROUND_PATH_3] = {MAP(UNDERGROUND_PATH_EAST_ENTRANCE),        MAP(ROUTE8)},\n    [QL_LOCATION_UNDERGROUND_PATH_4] = {MAP(UNDERGROUND_PATH_WEST_ENTRANCE),        MAP(ROUTE7)},\n    [QL_LOCATION_CELADON_DEPT_STORE] = {MAP(CELADON_CITY_DEPARTMENT_STORE_1F),      MAP(CELADON_CITY)},\n    [QL_LOCATION_CELADON_MANSION]    = {MAP(CELADON_CITY_CONDOMINIUMS_1F),          MAP(CELADON_CITY)},\n    [QL_LOCATION_GAME_CORNER]        = {MAP(CELADON_CITY_GAME_CORNER),              MAP(CELADON_CITY)},\n    [QL_LOCATION_CELADON_GYM]        = {MAP(CELADON_CITY_GYM),                      MAP(CELADON_CITY)},\n    [QL_LOCATION_CELADON_RESTAURANT] = {MAP(CELADON_CITY_RESTAURANT),               MAP(CELADON_CITY)},\n    [QL_LOCATION_ROCKET_HIDEOUT]     = {MAP(ROCKET_HIDEOUT_B1F),                    MAP(CELADON_CITY_GAME_CORNER)},\n    [QL_LOCATION_SAFARI_ZONE]        = {MAP(SAFARI_ZONE_CENTER),                    MAP(FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE)},\n    [QL_LOCATION_FUCHSIA_GYM]        = {MAP(FUCHSIA_CITY_GYM),                      MAP(FUCHSIA_CITY)},\n    [QL_LOCATION_WARDENS_HOME]       = {MAP(FUCHSIA_CITY_WARDENS_HOUSE),            MAP(FUCHSIA_CITY)},\n    [QL_LOCATION_FIGHTING_DOJO]      = {MAP(SAFFRON_CITY_DOJO),                     MAP(SAFFRON_CITY)},\n    [QL_LOCATION_SAFFRON_GYM]        = {MAP(SAFFRON_CITY_GYM),                      MAP(SAFFRON_CITY)},\n    [QL_LOCATION_SILPH_CO]           = {MAP(SILPH_CO_1F),                           MAP(SAFFRON_CITY)},\n    [QL_LOCATION_SEAFOAM_ISLANDS_1]  = {MAP(SEAFOAM_ISLANDS_1F),                    MAP(ROUTE20)},\n    [QL_LOCATION_SEAFOAM_ISLANDS_2]  = {MAP(SEAFOAM_ISLANDS_1F),                    MAP(ROUTE20)},\n    [QL_LOCATION_PKMN_MANSION]       = {MAP(POKEMON_MANSION_1F),                    MAP(CINNABAR_ISLAND)},\n    [QL_LOCATION_CINNABAR_GYM]       = {MAP(CINNABAR_ISLAND_GYM),                   MAP(CINNABAR_ISLAND)},\n    [QL_LOCATION_CINNABAR_LAB]       = {MAP(CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE),  MAP(CINNABAR_ISLAND)},\n    [QL_LOCATION_VICTORY_ROAD_1]     = {MAP(VICTORY_ROAD_1F),                       MAP(ROUTE23)},\n    [QL_LOCATION_VICTORY_ROAD_2]     = {MAP(VICTORY_ROAD_2F),                       MAP(ROUTE23)},\n    [QL_LOCATION_PKMN_LEAGUE]        = {MAP(INDIGO_PLATEAU_POKEMON_CENTER_1F),      MAP(INDIGO_PLATEAU_EXTERIOR)},\n    [QL_LOCATION_CERULEAN_CAVE]      = {MAP(CERULEAN_CAVE_1F),                      MAP(CERULEAN_CITY)}\n};\n\nvoid QuestLog_CheckDepartingIndoorsMap(void)\n{\n    u32 i;\n    for (i = 0; i < NELEMS(sInsideOutsidePairs); i++)\n    {\n        if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[i].inside_grp && gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[i].inside_num)\n        {\n            if (VarGet(VAR_QL_ENTRANCE) != QL_LOCATION_ROCKET_HIDEOUT || i != QL_LOCATION_GAME_CORNER)\n            {\n                VarSet(VAR_QL_ENTRANCE, i);\n                FlagSet(FLAG_SYS_QL_DEPARTED);\n            }\n            break;\n        }\n    }\n}\n\nvoid QuestLog_TryRecordDepartedLocation(void)\n{\n    s16 x, y;\n    struct QuestLogEvent_Departed data;\n    u16 locationId = VarGet(VAR_QL_ENTRANCE);\n    data.mapSec = 0;\n    data.locationId = 0;\n    if (FlagGet(FLAG_SYS_QL_DEPARTED))\n    {\n        if (locationId == QL_LOCATION_VIRIDIAN_FOREST_1)\n        {\n            if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE)\n              && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE)\n               || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE)))\n            {\n                data.mapSec = MAPSEC_ROUTE_2;\n                if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE))\n                    data.locationId = locationId;\n                else\n                    data.locationId = locationId + 1;\n                SetQuestLogEvent(QL_EVENT_DEPARTED, (const u16 *)&data);\n                FlagClear(FLAG_SYS_QL_DEPARTED);\n                return;\n            }\n        }\n        else if (locationId == QL_LOCATION_LEAGUE_GATE_1)\n        {\n            if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE22) &&\n                (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22)\n              || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE23)))\n            {\n                data.mapSec = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[locationId].inside_grp, sInsideOutsidePairs[locationId].inside_num)->regionMapSectionId;\n                if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22))\n                    data.locationId = locationId;\n                else\n                    data.locationId = locationId + 1;\n                SetQuestLogEvent(QL_EVENT_DEPARTED, (const u16 *)&data);\n                FlagClear(FLAG_SYS_QL_DEPARTED);\n                return;\n            }\n        }\n        if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[locationId].outside_grp\n           && gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[locationId].outside_num)\n        {\n            data.mapSec = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[locationId].inside_grp, sInsideOutsidePairs[locationId].inside_num)->regionMapSectionId;\n            data.locationId = locationId;\n            if (locationId == QL_LOCATION_ROCK_TUNNEL_1)\n            {\n                PlayerGetDestCoords(&x, &y);\n                if (x != 15 || y != 26)\n                    data.locationId++;\n            }\n            else if (locationId == QL_LOCATION_SEAFOAM_ISLANDS_1)\n            {\n                PlayerGetDestCoords(&x, &y);\n                if (x != 67 || y != 15)\n                    data.locationId++;\n            }\n            SetQuestLogEvent(QL_EVENT_DEPARTED, (const u16 *)&data);\n            FlagClear(FLAG_SYS_QL_DEPARTED);\n            if (locationId == QL_LOCATION_ROCKET_HIDEOUT)\n            {\n                VarSet(VAR_QL_ENTRANCE, QL_LOCATION_GAME_CORNER);\n                FlagSet(FLAG_SYS_QL_DEPARTED);\n            }\n        }\n    }\n}\n\nu16 GetMysteryGiftCardStat(void)\n{\n    switch (gSpecialVar_Result)\n    {\n    case GET_NUM_STAMPS:\n        return MysteryGift_GetCardStat(CARD_STAT_NUM_STAMPS);\n    case GET_MAX_STAMPS:\n        return MysteryGift_GetCardStat(CARD_STAT_MAX_STAMPS);\n    case GET_CARD_BATTLES_WON:\n        return MysteryGift_GetCardStat(CARD_STAT_BATTLES_WON);\n    case GET_CARD_BATTLES_LOST:\n        return MysteryGift_GetCardStat(CARD_STAT_BATTLES_LOST);\n    case GET_CARD_NUM_TRADES:\n        return MysteryGift_GetCardStat(CARD_STAT_NUM_TRADES);\n    default:\n        AGB_ASSERT_EX(0, ABSPATH(\"scr_tool.c\"), 3873);\n        return 0;\n    }\n}\n\nvoid SetPCBoxToSendMon(u8 boxId)\n{\n    sPCBoxToSendMon = boxId;\n}\n\nu16 GetPCBoxToSendMon(void)\n{\n    return sPCBoxToSendMon;\n}\n\nbool8 ShouldShowBoxWasFullMessage(void)\n{\n    if (FlagGet(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE))\n        return FALSE;\n    if (StorageGetCurrentBox() == VarGet(VAR_PC_BOX_TO_SEND_MON))\n        return FALSE;\n    FlagSet(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE);\n    return TRUE;\n}\n\nbool8 IsDestinationBoxFull(void)\n{\n    s32 i;\n    s32 j;\n    SetPCBoxToSendMon(VarGet(VAR_PC_BOX_TO_SEND_MON));\n    i = StorageGetCurrentBox();\n    do\n    {\n        for (j = 0; j < IN_BOX_COUNT; j++)\n        {\n            if (GetBoxMonData(GetBoxedMonPtr(i, j), MON_DATA_SPECIES, NULL) == SPECIES_NONE)\n            {\n                if (GetPCBoxToSendMon() != i)\n                    FlagClear(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE);\n                VarSet(VAR_PC_BOX_TO_SEND_MON, i);\n                return ShouldShowBoxWasFullMessage();\n            }\n        }\n        i++;\n        if (i == TOTAL_BOXES_COUNT)\n            i = 0;\n    } while (i != StorageGetCurrentBox());\n    return FALSE;\n}\n\nconst u16 sPokeCenter1FMaps[] = {\n    MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F,\n    MAP_PEWTER_CITY_POKEMON_CENTER_1F,\n    MAP_CERULEAN_CITY_POKEMON_CENTER_1F,\n    MAP_LAVENDER_TOWN_POKEMON_CENTER_1F,\n    MAP_VERMILION_CITY_POKEMON_CENTER_1F,\n    MAP_CELADON_CITY_POKEMON_CENTER_1F,\n    MAP_FUCHSIA_CITY_POKEMON_CENTER_1F,\n    MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F,\n    MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F,\n    MAP_SAFFRON_CITY_POKEMON_CENTER_1F,\n    MAP_ROUTE4_POKEMON_CENTER_1F,\n    MAP_ROUTE10_POKEMON_CENTER_1F,\n    MAP_ONE_ISLAND_POKEMON_CENTER_1F,\n    MAP_TWO_ISLAND_POKEMON_CENTER_1F,\n    MAP_THREE_ISLAND_POKEMON_CENTER_1F,\n    MAP_FOUR_ISLAND_POKEMON_CENTER_1F,\n    MAP_FIVE_ISLAND_POKEMON_CENTER_1F,\n    MAP_SEVEN_ISLAND_POKEMON_CENTER_1F,\n    MAP_SIX_ISLAND_POKEMON_CENTER_1F,\n    MAP_UNION_ROOM,\n    MAP_UNDEFINED\n};\n\nbool8 UsedPokemonCenterWarp(void)\n{\n    s32 i;\n    u16 mapno = (gLastUsedWarp.mapGroup << 8) + gLastUsedWarp.mapNum;\n    for (i = 0; sPokeCenter1FMaps[i] != MAP_UNDEFINED; i++)\n    {\n        if (sPokeCenter1FMaps[i] == mapno)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nbool8 BufferTMHMMoveName(void)\n{\n    // 8004 = item ID\n    if (gSpecialVar_0x8004 >= ITEM_TM01 && gSpecialVar_0x8004 <= ITEM_HM08)\n    {\n        StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gSpecialVar_0x8004)]);\n        return TRUE;\n    }\n    else\n        return FALSE;\n}\n\nvoid RunMassageCooldownStepCounter(void)\n{\n    u16 count = VarGet(VAR_MASSAGE_COOLDOWN_STEP_COUNTER);\n    if (count < 500)\n        VarSet(VAR_MASSAGE_COOLDOWN_STEP_COUNTER, count + 1);\n}\n\nvoid DaisyMassageServices(void)\n{\n    AdjustFriendship(&gPlayerParty[gSpecialVar_0x8004], FRIENDSHIP_EVENT_MASSAGE);\n    VarSet(VAR_MASSAGE_COOLDOWN_STEP_COUNTER, 0);\n}\n\nstatic const u16 sEliteFourLightingPalettes[][16] = {\n    INCBIN_U16(\"graphics/field_specials/elite_four_lighting_0.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/elite_four_lighting_1.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/elite_four_lighting_2.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/elite_four_lighting_3.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/elite_four_lighting_4.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/elite_four_lighting_5.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/elite_four_lighting_6.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/elite_four_lighting_7.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/elite_four_lighting_8.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/elite_four_lighting_9.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/elite_four_lighting_10.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/elite_four_lighting_11.gbapal\")\n};\n\nstatic const u16 sChampionRoomLightingPalettes[][16] = {\n    INCBIN_U16(\"graphics/field_specials/champion_room_lighting_0.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/champion_room_lighting_1.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/champion_room_lighting_2.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/champion_room_lighting_3.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/champion_room_lighting_4.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/champion_room_lighting_5.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/champion_room_lighting_6.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/champion_room_lighting_7.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/champion_room_lighting_8.gbapal\")\n};\n\nstatic const u8 sEliteFourLightingTimers[] = {\n    40,\n    12,\n    12,\n    12,\n    12,\n    12,\n    12,\n    12,\n    12,\n    12,\n    12\n};\n\nstatic const u8 sChampionRoomLightingTimers[] = {\n    20,\n     8,\n     8,\n     8,\n     8,\n     8,\n     8,\n     8\n};\n\nvoid DoPokemonLeagueLightingEffect(void)\n{\n    u8 taskId = CreateTask(Task_RunPokemonLeagueLightingEffect, 8);\n    s16 *data = gTasks[taskId].data;\n    if (FlagGet(FLAG_TEMP_3) == TRUE)\n    {\n        gTasks[taskId].func = Task_CancelPokemonLeagueLightingEffect;\n    }\n    else\n    {\n        if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(POKEMON_LEAGUE_CHAMPIONS_ROOM) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(POKEMON_LEAGUE_CHAMPIONS_ROOM))\n        {\n            data[0] = sChampionRoomLightingTimers[0];\n            data[2] = 8;\n            LoadPalette(sChampionRoomLightingPalettes[0], BG_PLTT_ID(7), PLTT_SIZE_4BPP);\n        }\n        else\n        {\n            data[0] = sEliteFourLightingTimers[0];\n            data[2] = 11;\n            LoadPalette(sEliteFourLightingPalettes[0], BG_PLTT_ID(7), PLTT_SIZE_4BPP);\n        }\n        data[1] = 0;\n        ApplyGlobalTintToPaletteSlot(7, 1);\n    }\n}\n\nstatic void Task_RunPokemonLeagueLightingEffect(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active\n     && FlagGet(FLAG_TEMP_2) != FALSE\n     && FlagGet(FLAG_TEMP_5) != TRUE\n     && gGlobalFieldTintMode != QL_TINT_BACKUP_GRAYSCALE\n     && --data[0] == 0\n    )\n    {\n        if (++data[1] == data[2])\n            data[1] = 0;\n\n        if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(POKEMON_LEAGUE_CHAMPIONS_ROOM) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(POKEMON_LEAGUE_CHAMPIONS_ROOM))\n        {\n            data[0] = sChampionRoomLightingTimers[data[1]];\n            LoadPalette(sChampionRoomLightingPalettes[data[1]], BG_PLTT_ID(7), PLTT_SIZE_4BPP);\n        }\n        else\n        {\n            data[0] = sEliteFourLightingTimers[data[1]];\n            LoadPalette(sEliteFourLightingPalettes[data[1]], BG_PLTT_ID(7), PLTT_SIZE_4BPP);\n        }\n        ApplyGlobalTintToPaletteSlot(7, 1);\n    }\n}\n\nstatic void Task_CancelPokemonLeagueLightingEffect(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (FlagGet(FLAG_TEMP_4) != FALSE)\n    {\n        if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(POKEMON_LEAGUE_CHAMPIONS_ROOM) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(POKEMON_LEAGUE_CHAMPIONS_ROOM))\n            LoadPalette(sChampionRoomLightingPalettes[8], BG_PLTT_ID(7), PLTT_SIZE_4BPP);\n        else\n            LoadPalette(sEliteFourLightingPalettes[11], BG_PLTT_ID(7), PLTT_SIZE_4BPP);\n        ApplyGlobalTintToPaletteSlot(7, 1);\n        if (gPaletteFade.active)\n        {\n            BlendPalettes(0x00000080, 16, RGB_BLACK);\n        }\n        DestroyTask(taskId);\n    }\n}\n\nvoid StopPokemonLeagueLightingEffectTask(void)\n{\n    if (FuncIsActiveTask(Task_RunPokemonLeagueLightingEffect) == TRUE)\n    {\n        DestroyTask(FindTaskIdByFunc(Task_RunPokemonLeagueLightingEffect));\n    }\n}\n\nstatic const u8 sCapeBrinkCompatibleSpecies[] = {\n    SPECIES_VENUSAUR,\n    SPECIES_CHARIZARD,\n    SPECIES_BLASTOISE\n};\n\nbool8 CapeBrinkGetMoveToTeachLeadPokemon(void)\n{\n    // Returns:\n    //   8005 = Move tutor index\n    //   8006 = Num moves known by lead mon\n    //   8007 = Index of lead mon\n    //   to specialvar = whether a move can be taught in the first place\n    u8 tutorMonId = 0;\n    u8 numMovesKnown = 0;\n    u8 leadMonSlot = GetLeadMonIndex();\n    u32 i;\n    gSpecialVar_0x8007 = leadMonSlot;\n    for (i = 0; i < NELEMS(sCapeBrinkCompatibleSpecies); i++)\n    {\n        if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_SPECIES_OR_EGG, NULL) == sCapeBrinkCompatibleSpecies[i])\n        {\n            tutorMonId = i;\n            break;\n        }\n    }\n    if (i == NELEMS(sCapeBrinkCompatibleSpecies))\n        return FALSE;\n    if (tutorMonId == 0)\n    {\n        StringCopy(gStringVar2, gMoveNames[MOVE_FRENZY_PLANT]);\n        gSpecialVar_0x8005 = MOVETUTOR_FRENZY_PLANT;\n    }\n    else if (tutorMonId == 1)\n    {\n        StringCopy(gStringVar2, gMoveNames[MOVE_BLAST_BURN]);\n        gSpecialVar_0x8005 = MOVETUTOR_BLAST_BURN;\n    }\n    else\n    {\n        StringCopy(gStringVar2, gMoveNames[MOVE_HYDRO_CANNON]);\n        gSpecialVar_0x8005 = MOVETUTOR_HYDRO_CANNON;\n    }\n    if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_MOVE1) != MOVE_NONE)\n        numMovesKnown++;\n    if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_MOVE2) != MOVE_NONE)\n        numMovesKnown++;\n    if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_MOVE3) != MOVE_NONE)\n        numMovesKnown++;\n    if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_MOVE4) != MOVE_NONE)\n        numMovesKnown++;\n    gSpecialVar_0x8006 = numMovesKnown;\n    return TRUE;\n}\n\nbool8 HasLearnedAllMovesFromCapeBrinkTutor(void)\n{\n    // 8005 is set by CapeBrinkGetMoveToTeachLeadPokemon\n    u8 r4 = 0;\n    if (gSpecialVar_0x8005 == MOVETUTOR_FRENZY_PLANT)\n        FlagSet(FLAG_TUTOR_FRENZY_PLANT);\n    else if (gSpecialVar_0x8005 == MOVETUTOR_BLAST_BURN)\n        FlagSet(FLAG_TUTOR_BLAST_BURN);\n    else\n        FlagSet(FLAG_TUTOR_HYDRO_CANNON);\n    if (FlagGet(FLAG_TUTOR_FRENZY_PLANT) == TRUE)\n        r4++;\n    if (FlagGet(FLAG_TUTOR_BLAST_BURN) == TRUE)\n        r4++;\n    if (FlagGet(FLAG_TUTOR_HYDRO_CANNON) == TRUE)\n        r4++;\n    if (r4 == 3)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 CutMoveRuinValleyCheck(void)\n{\n    if (FlagGet(FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE) != TRUE\n     && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SIX_ISLAND_RUIN_VALLEY)\n     && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SIX_ISLAND_RUIN_VALLEY)\n     && gSaveBlock1Ptr->pos.x == 24\n     && gSaveBlock1Ptr->pos.y == 25\n     && GetPlayerFacingDirection() == DIR_NORTH\n    )\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid CutMoveOpenDottedHoleDoor(void)\n{\n    MapGridSetMetatileIdAt(31, 31, METATILE_SeviiIslands67_DottedHoleDoor_Open);\n    DrawWholeMapView();\n    PlaySE(SE_BANG);\n    FlagSet(FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE);\n    UnlockPlayerFieldControls();\n}\n\nstatic const u16 sDeoxysObjectPals[][16] = {\n    INCBIN_U16(\"graphics/field_specials/deoxys_rock_0.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/deoxys_rock_1.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/deoxys_rock_2.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/deoxys_rock_3.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/deoxys_rock_4.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/deoxys_rock_5.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/deoxys_rock_6.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/deoxys_rock_7.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/deoxys_rock_8.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/deoxys_rock_9.gbapal\"),\n    INCBIN_U16(\"graphics/field_specials/deoxys_rock_10.gbapal\")\n};\n\nstatic const u8 sDeoxysCoords[][2] = {\n    {15, 12},\n    {11, 14},\n    {15,  8},\n    {19, 14},\n    {12, 11},\n    {18, 11},\n    {15, 14},\n    {11, 14},\n    {19, 14},\n    {15, 15},\n    {15, 10}\n};\n\nstatic const u8 sDeoxysStepCaps[] = {\n    4,\n    8,\n    8,\n    8,\n    4,\n    4,\n    4,\n    6,\n    3,\n    3\n};\n\nvoid DoDeoxysTriangleInteraction(void)\n{\n    CreateTask(Task_DoDeoxysTriangleInteraction, 8);\n}\n\nstatic void Task_DoDeoxysTriangleInteraction(u8 taskId)\n{\n    u16 r5;\n    u16 r6;\n    if (FlagGet(FLAG_SYS_DEOXYS_AWAKENED) == TRUE)\n    {\n        gSpecialVar_Result = 3;\n        ScriptContext_Enable();\n        DestroyTask(taskId);\n    }\n    else\n    {\n        r5 = VarGet(VAR_DEOXYS_INTERACTION_NUM);\n        r6 = VarGet(VAR_DEOXYS_INTERACTION_STEP_COUNTER);\n        VarSet(VAR_DEOXYS_INTERACTION_STEP_COUNTER, 0);\n        if (r5 != 0 && sDeoxysStepCaps[r5 - 1] < r6)\n        {\n            MoveDeoxysObject(0);\n            VarSet(VAR_DEOXYS_INTERACTION_NUM, 0);\n            gSpecialVar_Result = 0;\n            DestroyTask(taskId);\n        }\n        else if (r5 == 10)\n        {\n            FlagSet(FLAG_SYS_DEOXYS_AWAKENED);\n            gSpecialVar_Result = 2;\n            ScriptContext_Enable();\n            DestroyTask(taskId);\n        }\n        else\n        {\n            r5++;\n            MoveDeoxysObject(r5);\n            VarSet(VAR_DEOXYS_INTERACTION_NUM, r5);\n            gSpecialVar_Result = 1;\n            DestroyTask(taskId);\n        }\n    }\n}\n\nstatic void MoveDeoxysObject(u8 num)\n{\n    u8 mapObjId;\n    LoadPalette(sDeoxysObjectPals[num], OBJ_PLTT_ID(10), PLTT_SIZEOF(4));\n    ApplyGlobalFieldPaletteTint(10);\n    TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjId);\n    if (num == 0)\n        PlaySE(SE_M_CONFUSE_RAY);\n    else\n        PlaySE(SE_DEOXYS_MOVE);\n    CreateTask(Task_WaitDeoxysFieldEffect, 8);\n    gFieldEffectArguments[0] = 1;\n    gFieldEffectArguments[1] = 56;\n    gFieldEffectArguments[2] = 2;\n    gFieldEffectArguments[3] = sDeoxysCoords[num][0];\n    gFieldEffectArguments[4] = sDeoxysCoords[num][1];\n    if (num == 0)\n        gFieldEffectArguments[5] = 60;\n    else\n        gFieldEffectArguments[5] = 5;\n    FieldEffectStart(FLDEFF_MOVE_DEOXYS_ROCK);\n    SetObjEventTemplateCoords(1, sDeoxysCoords[num][0], sDeoxysCoords[num][1]);\n}\n\nstatic void Task_WaitDeoxysFieldEffect(u8 taskId)\n{\n    if (!FieldEffectActiveListContains(FLDEFF_MOVE_DEOXYS_ROCK))\n    {\n        ScriptContext_Enable();\n        DestroyTask(taskId);\n    }\n}\n\nvoid IncrementBirthIslandRockStepCount(void)\n{\n    u16 count = VarGet(VAR_DEOXYS_INTERACTION_STEP_COUNTER);\n    if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BIRTH_ISLAND_EXTERIOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BIRTH_ISLAND_EXTERIOR))\n    {\n        count++;\n        if (count > 99)\n            VarSet(VAR_DEOXYS_INTERACTION_STEP_COUNTER, 0);\n        else\n            VarSet(VAR_DEOXYS_INTERACTION_STEP_COUNTER, count);\n    }\n}\n\nvoid SetDeoxysTrianglePalette(void)\n{\n    u8 num = VarGet(VAR_DEOXYS_INTERACTION_NUM);\n    LoadPalette(sDeoxysObjectPals[num], OBJ_PLTT_ID(10), PLTT_SIZEOF(4));\n    ApplyGlobalFieldPaletteTint(10);\n}\n\nbool8 IsBadEggInParty(void)\n{\n    u8 partyCount = CalculatePlayerPartyCount();\n    u32 i;\n    for (i = 0; i < partyCount; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_BAD_EGG) == TRUE)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nbool8 IsPlayerNotInTrainerTowerLobby(void)\n{\n    if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_LOBBY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_LOBBY))\n        return FALSE;\n    else\n        return TRUE;\n}\n\nvoid BrailleCursorToggle(void)\n{\n    // 8004 = x - 27\n    // 8005 = y\n    // 8006 = action (0 = create, 1 = delete)\n    u16 x;\n    if (gQuestLogState != QL_STATE_PLAYBACK)\n    {\n        x = gSpecialVar_0x8004 + 27;\n        if (gSpecialVar_0x8006 == 0)\n            sBrailleTextCursorSpriteID = CreateTextCursorSprite(0, x, gSpecialVar_0x8005, 0, 0);\n        else\n            DestroyTextCursorSprite(sBrailleTextCursorSpriteID);\n    }\n}\n\nbool8 PlayerPartyContainsSpeciesWithPlayerID(void)\n{\n    // 8004 = species\n    u8 playerCount = CalculatePlayerPartyCount();\n    u32 i;\n    for (i = 0; i < playerCount; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) == gSpecialVar_0x8004 \n            && GetPlayerTrainerId() == GetMonData(&gPlayerParty[i], MON_DATA_OT_ID, NULL))\n            return TRUE;\n    }\n    return FALSE;\n}\n\n/*\n * Determines which of Lorelei's doll collection to show\n * based on how many times you've entered the Hall of Fame.\n */\nvoid UpdateLoreleiDollCollection(void)\n{\n    u32 numHofClears = GetGameStat(GAME_STAT_ENTERED_HOF);\n    if (numHofClears >= 25)\n    {\n        FlagClear(FLAG_HIDE_LORELEI_HOUSE_MEOWTH_DOLL);\n        if (numHofClears >= 50)\n            FlagClear(FLAG_HIDE_LORELEI_HOUSE_CHANSEY_DOLL);\n        if (numHofClears >= 75)\n            FlagClear(FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_F_DOLL);\n        if (numHofClears >= 100)\n            FlagClear(FLAG_HIDE_LORELEI_HOUSE_JIGGLYPUFF_DOLL);\n        if (numHofClears >= 125)\n            FlagClear(FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_M_DOLL);\n        if (numHofClears >= 150)\n            FlagClear(FLAG_HIDE_LORELEIS_HOUSE_FEAROW_DOLL);\n        if (numHofClears >= 175)\n            FlagClear(FLAG_HIDE_LORELEIS_HOUSE_PIDGEOT_DOLL);\n        if (numHofClears >= 200)\n            FlagClear(FLAG_HIDE_LORELEIS_HOUSE_LAPRAS_DOLL);\n    }\n}\n\nvoid LoopWingFlapSound(void)\n{\n    // 8004 = Num flaps\n    // 8005 = Frame delay between flaps\n    CreateTask(Task_WingFlapSound, 8);\n    PlaySE(SE_M_WING_ATTACK);\n}\n\nstatic void Task_WingFlapSound(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    data[1]++;\n    if (data[1] == gSpecialVar_0x8005)\n    {\n        data[0]++;\n        data[1] = 0;\n        PlaySE(SE_M_WING_ATTACK);\n    }\n    if (data[0] == gSpecialVar_0x8004 - 1)\n        DestroyTask(taskId);\n}\n\nvoid CableCarWarp(void)\n{\n    if (gSpecialVar_0x8004 != 0)\n    {\n        SetWarpDestination(MAP_GROUP(FOUR_ISLAND_BASE_CABLE_CAR_STATION), MAP_NUM(FOUR_ISLAND_BASE_CABLE_CAR_STATION), -1, 6, 4);\n    }\n    else\n    {\n        SetWarpDestination(MAP_GROUP(FOUR_ISLAND_CABLE_CAR_STATION), MAP_NUM(FOUR_ISLAND_CABLE_CAR_STATION), -1, 6, 10);\n    }\n}\n\nstatic const u8 gTitleNames[][18] = {\n    _(\"NO TITLE\"),\n    _(\"BULBASAUR MASTER\"),\n    _(\"IVYSAUR MASTER\"),\n    _(\"VENUSAUR MASTER\"),\n    _(\"CHARMANDER MASTER\"),\n    _(\"CHARMELEON MASTER\"),\n    _(\"CHARIZARD MASTER\"),\n    _(\"SQUIRTLE MASTER\"),\n    _(\"WARTORTLE MASTER\"),\n    _(\"BLASTOISE MASTER\"),\n    _(\"CATERPIE MASTER\"),\n    _(\"METAPOD MASTER\"),\n    _(\"BUTTERFREE MASTER\"),\n    _(\"WEEDLE MASTER\"),\n    _(\"KAKUNA MASTER\"),\n    _(\"BEEDRILL MASTER\"),\n    _(\"PIDGEY MASTER\"),\n    _(\"PIDGEOTTO MASTER\"),\n    _(\"PIDGEOT MASTER\"),\n    _(\"RATTATA MASTER\"),\n    _(\"RATICATE MASTER\"),\n    _(\"SPEAROW MASTER\"),\n    _(\"FEAROW MASTER\"),\n    _(\"EKANS MASTER\"),\n    _(\"ARBOK MASTER\"),\n    _(\"PIKACHU MASTER\"),\n    _(\"RAICHU MASTER\"),\n    _(\"SANDSHREW MASTER\"),\n    _(\"SANDSLASH MASTER\"),\n    _(\"NIDORAN♀ MASTER\"),\n    _(\"NIDORINA MASTER\"),\n    _(\"NIDOQUEEN MASTER\"),\n    _(\"NIDORAN♂ MASTER\"),\n    _(\"NIDORINO MASTER\"),\n    _(\"NIDOKING MASTER\"),\n    _(\"CLEFAIRY MASTER\"),\n    _(\"CLEFABLE MASTER\"),\n    _(\"VULPIX MASTER\"),\n    _(\"NINETALES MASTER\"),\n    _(\"JIGGLYPUFF MASTER\"),\n    _(\"WIGGLYTUFF MASTER\"),\n    _(\"ZUBAT MASTER\"),\n    _(\"GOLBAT MASTER\"),\n    _(\"ODDISH MASTER\"),\n    _(\"GLOOM MASTER\"),\n    _(\"VILEPLUME MASTER\"),\n    _(\"PARAS MASTER\"),\n    _(\"PARASECT MASTER\"),\n    _(\"VENONAT MASTER\"),\n    _(\"VENOMOTH MASTER\"),\n    _(\"DIGLETT MASTER\"),\n    _(\"DUGTRIO MASTER\"),\n    _(\"MEOWTH MASTER\"),\n    _(\"PERSIAN MASTER\"),\n    _(\"PSYDUCK MASTER\"),\n    _(\"GOLDUCK MASTER\"),\n    _(\"MANKEY MASTER\"),\n    _(\"PRIMEAPE MASTER\"),\n    _(\"GROWLITHE MASTER\"),\n    _(\"ARCANINE MASTER\"),\n    _(\"POLIWAG MASTER\"),\n    _(\"POLIWHIRL MASTER\"),\n    _(\"POLIWRATH MASTER\"),\n    _(\"ABRA MASTER\"),\n    _(\"KADABRA MASTER\"),\n    _(\"ALAKAZAM MASTER\"),\n    _(\"MACHOP MASTER\"),\n    _(\"MACHOKE MASTER\"),\n    _(\"MACHAMP MASTER\"),\n    _(\"BELLSPROUT MASTER\"),\n    _(\"WEEPINBELL MASTER\"),\n    _(\"VICTREEBEL MASTER\"),\n    _(\"TENTACOOL MASTER\"),\n    _(\"TENTACRUEL MASTER\"),\n    _(\"GEODUDE MASTER\"),\n    _(\"GRAVELER MASTER\"),\n    _(\"GOLEM MASTER\"),\n    _(\"PONYTA MASTER\"),\n    _(\"RAPIDASH MASTER\"),\n    _(\"SLOWPOKE MASTER\"),\n    _(\"SLOWBRO MASTER\"),\n    _(\"MAGNEMITE MASTER\"),\n    _(\"MAGNETON MASTER\"),\n    _(\"FARFETCH'D MASTER\"),\n    _(\"DODUO MASTER\"),\n    _(\"DODRIO MASTER\"),\n    _(\"SEEL MASTER\"),\n    _(\"DEWGONG MASTER\"),\n    _(\"GRIMER MASTER\"),\n    _(\"MUK MASTER\"),\n    _(\"SHELLDER MASTER\"),\n    _(\"CLOYSTER MASTER\"),\n    _(\"GASTLY MASTER\"),\n    _(\"HAUNTER MASTER\"),\n    _(\"GENGAR MASTER\"),\n    _(\"ONIX MASTER\"),\n    _(\"DROWZEE MASTER\"),\n    _(\"HYPNO MASTER\"),\n    _(\"KRABBY MASTER\"),\n    _(\"KINGLER MASTER\"),\n    _(\"VOLTORB MASTER\"),\n    _(\"ELECTRODE MASTER\"),\n    _(\"EXEGGCUTE MASTER\"),\n    _(\"EXEGGUTOR MASTER\"),\n    _(\"CUBONE MASTER\"),\n    _(\"MAROWAK MASTER\"),\n    _(\"HITMONLEE MASTER\"),\n    _(\"HITMONCHAN MASTER\"),\n    _(\"LICKITUNG MASTER\"),\n    _(\"KOFFING MASTER\"),\n    _(\"WEEZING MASTER\"),\n    _(\"RHYHORN MASTER\"),\n    _(\"RHYDON MASTER\"),\n    _(\"CHANSEY MASTER\"),\n    _(\"TANGELA MASTER\"),\n    _(\"KANGASKHAN MASTER\"),\n    _(\"HORSEA MASTER\"),\n    _(\"SEADRA MASTER\"),\n    _(\"GOLDEEN MASTER\"),\n    _(\"SEAKING MASTER\"),\n    _(\"STARYU MASTER\"),\n    _(\"STARMIE MASTER\"),\n    _(\"MR. MIME MASTER\"),\n    _(\"SCYTHER MASTER\"),\n    _(\"JYNX MASTER\"),\n    _(\"ELECTABUZZ MASTER\"),\n    _(\"MAGMAR MASTER\"),\n    _(\"PINSIR MASTER\"),\n    _(\"TAUROS MASTER\"),\n    _(\"MAGIKARP MASTER\"),\n    _(\"GYARADOS MASTER\"),\n    _(\"LAPRAS MASTER\"),\n    _(\"DITTO MASTER\"),\n    _(\"EEVEE MASTER\"),\n    _(\"VAPOREON MASTER\"),\n    _(\"JOLTEON MASTER\"),\n    _(\"FLAREON MASTER\"),\n    _(\"PORYGON MASTER\"),\n    _(\"OMANYTE MASTER\"),\n    _(\"OMASTAR MASTER\"),\n    _(\"KABUTO MASTER\"),\n    _(\"KABUTOPS MASTER\"),\n    _(\"AERODACTYL MASTER\"),\n    _(\"SNORLAX MASTER\"),\n    _(\"ARTICUNO MASTER\"),\n    _(\"ZAPDOS MASTER\"),\n    _(\"MOLTRES MASTER\"),\n    _(\"DRATINI MASTER\"),\n    _(\"DRAGONAIR MASTER\"),\n    _(\"DRAGONITE MASTER\"),\n    _(\"MEWTWO MASTER\"),\n    _(\"MEW MASTER\"),\n    _(\"GRAND MASTER\"),\n};\n"
  },
  {
    "path": "src/field_tasks.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"bike.h\"\n#include \"event_data.h\"\n#include \"event_object_lock.h\"\n#include \"field_camera.h\"\n#include \"field_effect_helpers.h\"\n#include \"field_player_avatar.h\"\n#include \"fieldmap.h\"\n#include \"item.h\"\n#include \"metatile_behavior.h\"\n#include \"overworld.h\"\n#include \"quest_log.h\"\n#include \"script.h\"\n#include \"task.h\"\n#include \"constants/field_tasks.h\"\n#include \"constants/flags.h\"\n#include \"constants/items.h\"\n#include \"constants/metatile_labels.h\"\n#include \"constants/songs.h\"\n\n/*  This file handles some persistent tasks that run in the overworld.\n *  - Task_RunTimeBasedEvents: Triggers ambient cries. In RSE, this also periodically updates local time and RTC events.\n *  - Task_RunPerStepCallback: Calls one of the functions in sPerStepCallbacks, listed below...\n *      . DummyPerStepCallback: Default, does nothing. Includes functionality from RS that was removed.\n *      . AshGrassPerStepCallback: Leftover from RS. Removes the ash from ash-covered grass that the player steps on.\n *      . IcefallCaveIcePerStepCallback: Cracks/breaks ice in Icefall Cave that the player steps on.\n *      . CrackedFloorPerStepCallback: Leftover from RS. Breaks cracked floors that the player steps on.\n *\n *  NOTE: \"PerStep\" is perhaps misleading. One function in sPerStepCallbacks is called\n *        every frame while in the overworld by Task_RunPerStepCallback regardless of\n *        whether or not steps are being taken. However, nearly all of the functions in\n *        the table check if the player has moved from their previous position before\n *        doing anything else.\n */\n\nstatic void DummyPerStepCallback(u8 taskId);\nstatic void AshGrassPerStepCallback(u8 taskId);\nstatic void IcefallCaveIcePerStepCallback(u8 taskId);\nstatic void CrackedFloorPerStepCallback(u8 taskId);\n\nstatic const TaskFunc sPerStepCallbacks[] =\n{\n    [STEP_CB_DUMMY]             = DummyPerStepCallback,\n    [STEP_CB_ASH]               = AshGrassPerStepCallback,\n    [STEP_CB_FORTREE_BRIDGE]    = DummyPerStepCallback,\n    [STEP_CB_PACIFIDLOG_BRIDGE] = DummyPerStepCallback,\n    [STEP_CB_ICE]               = IcefallCaveIcePerStepCallback,\n    [STEP_CB_TRUCK]             = DummyPerStepCallback,\n    [STEP_CB_SECRET_BASE]       = DummyPerStepCallback,\n    [STEP_CB_CRACKED_FLOOR]     = CrackedFloorPerStepCallback\n};\n\n// The positions of each map space with crackable ice in Icefall Cave.\nstatic const u8 sIcefallCaveIceCoords[][2] =\n{\n    {  8,  3 },\n    { 10,  5 },\n    { 15,  5 },\n    {  8,  9 },\n    {  9,  9 },\n    { 16,  9 },\n    {  8, 10 },\n    {  9, 10 },\n    {  8, 14 }\n};\n\n#define tCallbackId data[0]\n\nstatic void Task_RunPerStepCallback(u8 taskId)\n{\n    int idx = gTasks[taskId].tCallbackId;\n    sPerStepCallbacks[idx](taskId);\n}\n\n#define tAmbientCryState data[1]\n#define tAmbientCryDelay data[2]\n\n// RTC functionality from RS was removed here.\nstatic void Task_RunTimeBasedEvents(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (!ArePlayerFieldControlsLocked() && !QL_IS_PLAYBACK_STATE)\n        UpdateAmbientCry(&tAmbientCryState, &tAmbientCryDelay);\n}\n\nvoid SetUpFieldTasks(void)\n{\n    if (!FuncIsActiveTask(Task_RunPerStepCallback))\n    {\n        u8 taskId = CreateTask(Task_RunPerStepCallback, 80);\n        gTasks[taskId].tCallbackId = STEP_CB_DUMMY;\n    }\n\n    if (!FuncIsActiveTask(Task_RunTimeBasedEvents))\n        CreateTask(Task_RunTimeBasedEvents, 80);\n}\n\nvoid ActivatePerStepCallback(u8 callbackId)\n{\n    u8 taskId = FindTaskIdByFunc(Task_RunPerStepCallback);\n    if (taskId != TASK_NONE)\n    {\n        s32 i;\n        s16 *data = gTasks[taskId].data;\n\n        for (i = 0; i < NUM_TASK_DATA; i++)\n            data[i] = 0;\n\n        if (callbackId >= ARRAY_COUNT(sPerStepCallbacks))\n            tCallbackId = STEP_CB_DUMMY;\n        else\n            tCallbackId = callbackId;\n    }\n}\n\nvoid ResetFieldTasksArgs(void)\n{\n    u8 taskId;\n    s16 *data;\n\n    taskId = FindTaskIdByFunc(Task_RunPerStepCallback);\n    if (taskId != TASK_NONE)\n        data = gTasks[taskId].data;\n\n    taskId = FindTaskIdByFunc(Task_RunTimeBasedEvents);\n    if (taskId != TASK_NONE)\n    {\n        data = gTasks[taskId].data;\n        tAmbientCryState = 0;\n        tAmbientCryDelay = 0;\n    }\n}\n\n#undef tAmbientCryState\n#undef tAmbientCryDelay\n\nstatic void DummyPerStepCallback(u8 taskId)\n{\n}\n\nstatic void MarkIcePuzzleCoordVisited(s16 x, s16 y)\n{\n    u8 i;\n    for (i = 0; i < ARRAY_COUNT(sIcefallCaveIceCoords); i++)\n    {\n        if (sIcefallCaveIceCoords[i][0] + MAP_OFFSET == x && sIcefallCaveIceCoords[i][1] + MAP_OFFSET == y)\n        {\n            FlagSet(i + 1);\n            break;\n        }\n    }\n}\n\nvoid SetIcefallCaveCrackedIceMetatiles(void)\n{\n    u8 i;\n    for (i = 0; i < ARRAY_COUNT(sIcefallCaveIceCoords); i++)\n    {\n        if (FlagGet(i + 1) == TRUE)\n        {\n            int x = sIcefallCaveIceCoords[i][0] + MAP_OFFSET;\n            int y = sIcefallCaveIceCoords[i][1] + MAP_OFFSET;\n            MapGridSetMetatileIdAt(x, y, METATILE_SeafoamIslands_CrackedIce);\n        }\n    }\n}\n\n#define tState data[1]\n#define tPrevX data[2]\n#define tPrevY data[3]\n#define tIceX  data[4]\n#define tIceY  data[5]\n#define tDelay data[6]\n\nstatic void IcefallCaveIcePerStepCallback(u8 taskId)\n{\n    s16 x, y;\n    u8 tileBehavior;\n    u16 *iceStepCount;\n    s16 *data = gTasks[taskId].data;\n    switch (tState)\n    {\n        case 0:\n            PlayerGetDestCoords(&x, &y);\n            tPrevX = x;\n            tPrevY = y;\n            tState = 1;\n            break;\n        case 1:\n            PlayerGetDestCoords(&x, &y);\n            // End if player hasn't moved\n            if (x == tPrevX && y == tPrevY)\n                return;\n\n            tPrevX = x;\n            tPrevY = y;\n            tileBehavior = MapGridGetMetatileBehaviorAt(x, y);\n            if (MetatileBehavior_IsThinIce(tileBehavior) == TRUE)\n            {\n                // Thin ice, set it to cracked ice\n                MarkIcePuzzleCoordVisited(x, y);\n                tDelay = 4;\n                tState = 2;\n                tIceX = x;\n                tIceY = y;\n            }\n            else if (MetatileBehavior_IsCrackedIce(tileBehavior) == TRUE)\n            {\n                // Cracked ice, set it to broken ice\n                tDelay = 4;\n                tState = 3;\n                tIceX = x;\n                tIceY = y;\n            }\n            break;\n        case 2:\n            if (tDelay != 0)\n            {\n                tDelay--;\n            }\n            else\n            {\n                // Crack ice\n                x = tIceX;\n                y = tIceY;\n                PlaySE(SE_ICE_CRACK);\n                MapGridSetMetatileIdAt(x, y, METATILE_SeafoamIslands_CrackedIce);\n                CurrentMapDrawMetatileAt(x, y);\n                tState = 1;\n            }\n            break;\n        case 3:\n            FreezeObjects_WaitForPlayer();\n            if (tDelay != 0)\n            {\n                tDelay--;\n            }\n            else\n            {\n                // Break ice\n                x = tIceX;\n                y = tIceY;\n                PlaySE(SE_ICE_BREAK);\n                MapGridSetMetatileIdAt(x, y, METATILE_SeafoamIslands_IceHole);\n                CurrentMapDrawMetatileAt(x, y);\n                VarSet(VAR_TEMP_1, 1);\n                tState = 1;\n            }\n            break;\n    }\n}\n\n#undef tState\n#undef tPrevX\n#undef tPrevY\n#undef tIceX\n#undef tIceY\n#undef tDelay\n\n#define tPrevX data[1]\n#define tPrevY data[2]\n\nstatic void AshGrassPerStepCallback(u8 taskId)\n{\n    s16 x, y;\n    u16 *ashGatherCount;\n    s16 *data = gTasks[taskId].data;\n    PlayerGetDestCoords(&x, &y);\n\n    // End if player hasn't moved\n    if (x == tPrevX && y == tPrevY)\n        return;\n\n    tPrevX = x;\n    tPrevY = y;\n    if (MetatileBehavior_IsAshGrass((u8)MapGridGetMetatileBehaviorAt(x, y)))\n    {\n        if (MapGridGetMetatileIdAt(x, y) == METATILE_SeviiIslands123_OneIsland_AshGrass)\n            StartAshFieldEffect(x, y, METATILE_SeviiIslands123_OneIsland_Grass, 4);\n\n        if (CheckBagHasItem(ITEM_SOOT_SACK, 1))\n        {\n            ashGatherCount = GetVarPointer(VAR_ASH_GATHER_COUNT);\n            if (*ashGatherCount < 9999)\n                (*ashGatherCount)++;\n        }\n    }\n}\n\n#undef tPrevX\n#undef tPrevY\n\n// Unused. For some reason these were not dummied out like the other RSE-exclusive step callbacks.\nstatic void SetCrackedFloorHoleMetatile(s16 x, s16 y)\n{\n    MapGridSetMetatileIdAt(x, y, MapGridGetMetatileIdAt(x, y) == METATILE_RSCave_CrackedFloor ? METATILE_RSCave_CrackedFloor_Hole : METATILE_Pacifidlog_SkyPillar_CrackedFloor_Hole);\n    CurrentMapDrawMetatileAt(x, y);\n}\n\n#define tPrevX       data[2]\n#define tPrevY       data[3]\n#define tFloor1Delay data[4]\n#define tFloor1X     data[5]\n#define tFloor1Y     data[6]\n#define tFloor2Delay data[7]\n#define tFloor2X     data[8]\n#define tFloor2Y     data[9]\n\n// Unused. See above.\nstatic void CrackedFloorPerStepCallback(u8 taskId)\n{\n    s16 x, y;\n    u16 behavior;\n    s16 *data = gTasks[taskId].data;\n    PlayerGetDestCoords(&x, &y);\n    behavior = MapGridGetMetatileBehaviorAt(x, y);\n\n    // Update up to 2 previous cracked floor spaces\n    if (tFloor1Delay != 0 && (--tFloor1Delay) == 0)\n        SetCrackedFloorHoleMetatile(tFloor1X, tFloor1Y);\n    if (tFloor2Delay != 0 && (--tFloor2Delay) == 0)\n        SetCrackedFloorHoleMetatile(tFloor2X, tFloor2Y);\n\n    // End if player hasn't moved\n    if (x == tPrevX && y == tPrevY)\n        return;\n\n    tPrevX = x;\n    tPrevY = y;\n    if (MetatileBehavior_IsCrackedFloor(behavior))\n    {\n        if (GetPlayerSpeed() != PLAYER_SPEED_FASTEST)\n            VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty\n\n        if (tFloor1Delay == 0)\n        {\n            tFloor1Delay = 3;\n            tFloor1X = x;\n            tFloor1Y = y;\n        }\n        else if (tFloor2Delay == 0)\n        {\n            tFloor2Delay = 3;\n            tFloor2X = x;\n            tFloor2Y = y;\n        }\n    }\n}\n\n#undef tPrevX\n#undef tPrevY\n#undef tFloor1Delay\n#undef tFloor1X\n#undef tFloor1Y\n#undef tFloor2Delay\n#undef tFloor2X\n#undef tFloor2Y\n"
  },
  {
    "path": "src/field_weather.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"blend_palette.h\"\n#include \"field_camera.h\"\n#include \"field_effect.h\"\n#include \"field_weather.h\"\n#include \"field_weather_util.h\"\n#include \"field_weather_effects.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"constants/field_weather.h\"\n#include \"constants/weather.h\"\n#include \"constants/songs.h\"\n\n#define DROUGHT_COLOR_INDEX(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00))\n\nenum\n{\n    GAMMA_NONE,\n    GAMMA_NORMAL,\n    GAMMA_ALT,\n};\n\nstruct RGBColor\n{\n    u16 r:5;\n    u16 g:5;\n    u16 b:5;\n};\n\nstruct WeatherPaletteData\n{\n    u16 gammaShiftColors[8][0x1000]; // 0x1000 is the number of bytes that make up all palettes.\n};\n\nstruct WeatherCallbacks\n{\n    void (*initVars)(void);\n    void (*main)(void);\n    void (*initAll)(void);\n    bool8 (*finish)(void);\n};\n\nstatic EWRAM_DATA struct Weather sWeather = {};\nstatic EWRAM_DATA u8 sFieldEffectPaletteGammaTypes[32] = {};\nstatic EWRAM_DATA const u8 *sPaletteGammaTypes = NULL;\nstatic EWRAM_DATA u16 sDroughtFrameDelay = 0;\n\nstatic const u8 sDarkenedContrastColorMaps[19][32] = \n{\n    {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29},\n    {0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 26, 27},\n    {0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25},\n    {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 11, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 24, 24, 25},\n    {1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 12, 13, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 25},\n    {1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26},\n    {1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 15, 15, 16, 16, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 24, 24, 25, 26, 26},\n    {1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 16, 16, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 25, 26, 27},\n    {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27},\n    {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 19, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27},\n    {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 26, 27, 27, 28},\n    {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28},\n    {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 23, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28},\n    {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29},\n    {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29},\n    {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29},\n    {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30},\n    {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30},\n    {1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}\n};\n\nstatic const u8 sContrastColorMaps[19][32] =\n{\n    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31},\n    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31},\n    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31},\n    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 29, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 18, 19, 20, 21, 22, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 25, 26, 27, 28, 28, 29, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 28, 28, 29, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 19, 19, 20, 21, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 27, 28, 29, 29, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 20, 20, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 30, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 23, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31},\n    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}\n};\n\nstatic void Task_WeatherMain(u8 taskId);\nstatic void Task_WeatherInit(u8 taskId);\nstatic void None_Init(void);\nstatic void None_Main(void);\nstatic bool8 None_Finish(void);\nstatic void UpdateWeatherGammaShift(void);\nstatic void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex);\nstatic void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor);\nstatic void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor);\nstatic void FadeInScreenWithWeather(void);\nstatic bool8 FadeInScreen_RainShowShade(void);\nstatic bool8 FadeInScreen_Drought(void);\nstatic bool8 FadeInScreen_FogHorizontal(void);\nstatic void DoNothing(void);\nstatic void ApplyFogBlend(u8 blendCoeff, u16 blendColor);\nstatic bool8 LightenSpritePaletteInFog(u8 paletteIndex);\n\nstruct Weather *const gWeatherPtr = &sWeather;\n\nstatic const struct WeatherCallbacks sWeatherFuncs[] = {\n    {None_Init, None_Main, None_Init, None_Finish},\n    {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish},\n    {Sunny_InitVars, Sunny_Main, Sunny_InitAll, Sunny_Finish},\n    {Rain_InitVars, Rain_Main, Rain_InitAll, Rain_Finish},\n    {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish},\n    {Thunderstorm_InitVars, Thunderstorm_Main, Thunderstorm_InitAll, Thunderstorm_Finish},\n    {FogHorizontal_InitVars, FogHorizontal_Main, FogHorizontal_InitAll, FogHorizontal_Finish},\n    {Ash_InitVars, Ash_Main, Ash_InitAll, Ash_Finish},\n    {Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish},\n    {FogDiagonal_InitVars, FogDiagonal_Main, FogDiagonal_InitAll, FogDiagonal_Finish},\n    {FogHorizontal_InitVars, FogHorizontal_Main, FogHorizontal_InitAll, FogHorizontal_Finish},\n    {Shade_InitVars, Shade_Main, Shade_InitAll, Shade_Finish},\n    {Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish},\n    {Downpour_InitVars, Thunderstorm_Main, Downpour_InitAll, Thunderstorm_Finish},\n    {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish},\n};\n\nstatic void (*const sWeatherPalStateFuncs[])(void) = {\n    UpdateWeatherGammaShift,\n    FadeInScreenWithWeather,\n    DoNothing,\n    DoNothing\n};\n\nstatic const u8 sBasePaletteGammaTypes[32] = {\n    // background palettes\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NONE,\n    GAMMA_NONE,\n    GAMMA_NONE,\n    // sprite palettes\n    GAMMA_ALT,\n    GAMMA_NORMAL,\n    GAMMA_ALT,\n    GAMMA_ALT,\n    GAMMA_ALT,\n    GAMMA_ALT,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_ALT,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n    GAMMA_NORMAL,\n};\n\nconst u16 sDroughtWeatherColors[][0x1000] = {\n    INCBIN_U16(\"graphics/weather/drought/colors_0.bin\"),\n    INCBIN_U16(\"graphics/weather/drought/colors_1.bin\"),\n    INCBIN_U16(\"graphics/weather/drought/colors_2.bin\"),\n    INCBIN_U16(\"graphics/weather/drought/colors_3.bin\"),\n    INCBIN_U16(\"graphics/weather/drought/colors_4.bin\"),\n    INCBIN_U16(\"graphics/weather/drought/colors_5.bin\"),\n};\n\nconst u16 gDefaultWeatherSpritePalette[] = INCBIN_U16(\"graphics/weather/default.gbapal\");\nconst u16 gCloudsWeatherPalette[] = INCBIN_U16(\"graphics/weather/cloud.gbapal\");\nconst u16 gSandstormWeatherPalette[] = INCBIN_U16(\"graphics/weather/sandstorm.gbapal\");\nconst u8 gWeatherFogDiagonalTiles[] = INCBIN_U8(\"graphics/weather/fog_diagonal.4bpp\");\nconst u8 gWeatherFogHorizontalTiles[] = INCBIN_U8(\"graphics/weather/fog_horizontal.4bpp\");\nconst u8 gWeatherCloudTiles[] = INCBIN_U8(\"graphics/weather/cloud.4bpp\");\nconst u8 gWeatherSnow1Tiles[] = INCBIN_U8(\"graphics/weather/snow0.4bpp\");\nconst u8 gWeatherSnow2Tiles[] = INCBIN_U8(\"graphics/weather/snow1.4bpp\");\nconst u8 gWeatherBubbleTiles[] = INCBIN_U8(\"graphics/weather/bubble.4bpp\");\nconst u8 gWeatherAshTiles[] = INCBIN_U8(\"graphics/weather/ash.4bpp\");\nconst u8 gWeatherRainTiles[] = INCBIN_U8(\"graphics/weather/rain.4bpp\");\nconst u8 gWeatherSandstormTiles[] = INCBIN_U8(\"graphics/weather/sandstorm.4bpp\");\n\n// code\nvoid StartWeather(void)\n{\n    if (!FuncIsActiveTask(Task_WeatherMain))\n    {\n        u8 index = AllocSpritePalette(0x1200);\n        CpuCopy32(gDefaultWeatherSpritePalette, &gPlttBufferUnfaded[OBJ_PLTT_ID(index)], PLTT_SIZE_4BPP);\n        ApplyGlobalFieldPaletteTint(index);\n        sPaletteGammaTypes = sBasePaletteGammaTypes;\n        gWeatherPtr->altGammaSpritePalIndex = index;\n        gWeatherPtr->weatherPicSpritePalIndex = index;\n        gWeatherPtr->rainSpriteCount = 0;\n        gWeatherPtr->curRainSpriteIndex = 0;\n        gWeatherPtr->cloudSpritesCreated = FALSE;\n        gWeatherPtr->snowflakeSpriteCount = 0;\n        gWeatherPtr->ashSpritesCreated = FALSE;\n        gWeatherPtr->fogHSpritesCreated = FALSE;\n        gWeatherPtr->fogDSpritesCreated = FALSE;\n        gWeatherPtr->sandstormSpritesCreated = FALSE;\n        gWeatherPtr->sandstormSwirlSpritesCreated = FALSE;\n        gWeatherPtr->bubblesSpritesCreated = FALSE;\n        gWeatherPtr->lightenedFogSpritePalsCount = 0;\n        Weather_SetBlendCoeffs(16, 0);\n        gWeatherPtr->currWeather = WEATHER_NONE;\n        gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;\n        gWeatherPtr->readyForInit = FALSE;\n        gWeatherPtr->weatherChangeComplete = TRUE;\n        gWeatherPtr->taskId = CreateTask(Task_WeatherInit, 80);\n    }\n}\n\nvoid SetNextWeather(u8 weather)\n{\n    if (weather != WEATHER_RAIN && weather != WEATHER_RAIN_THUNDERSTORM && weather != WEATHER_DOWNPOUR)\n    {\n        PlayRainStoppingSoundEffect();\n    }\n\n    if (gWeatherPtr->nextWeather != weather && gWeatherPtr->currWeather == weather)\n    {\n        sWeatherFuncs[weather].initVars();\n    }\n\n    gWeatherPtr->weatherChangeComplete = FALSE;\n    gWeatherPtr->nextWeather = weather;\n    gWeatherPtr->finishStep = 0;\n}\n\n\nvoid SetCurrentAndNextWeather(u8 weather)\n{\n    PlayRainStoppingSoundEffect();\n    gWeatherPtr->currWeather = weather;\n    gWeatherPtr->nextWeather = weather;\n}\n\nvoid SetCurrentAndNextWeatherNoDelay(u8 weather)\n{\n    PlayRainStoppingSoundEffect();\n    gWeatherPtr->currWeather = weather;\n    gWeatherPtr->nextWeather = weather;\n    // Overrides the normal delay during screen fading.\n    gWeatherPtr->readyForInit = TRUE;\n}\n\nstatic void Task_WeatherInit(u8 taskId)\n{\n    // Waits until it's ok to initialize weather.\n    // When the screen fades in, this is set to TRUE.\n    if (gWeatherPtr->readyForInit)\n    {\n        UpdateCameraPanning();\n        sWeatherFuncs[gWeatherPtr->currWeather].initAll();\n        gTasks[taskId].func = Task_WeatherMain;\n    }\n}\n\nstatic void Task_WeatherMain(u8 taskId)\n{\n    if (gWeatherPtr->currWeather != gWeatherPtr->nextWeather)\n    {\n        if (!sWeatherFuncs[gWeatherPtr->currWeather].finish()\n            && gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT)\n        {\n            // Finished cleaning up previous weather. Now transition to next weather.\n            sWeatherFuncs[gWeatherPtr->nextWeather].initVars();\n            gWeatherPtr->gammaStepFrameCounter = 0;\n            gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER;\n            gWeatherPtr->currWeather = gWeatherPtr->nextWeather;\n            gWeatherPtr->weatherChangeComplete = TRUE;\n        }\n    }\n    else\n    {\n        sWeatherFuncs[gWeatherPtr->currWeather].main();\n    }\n\n    sWeatherPalStateFuncs[gWeatherPtr->palProcessingState]();\n}\n\n\nstatic void None_Init(void)\n{\n    gWeatherPtr->gammaTargetIndex = 0;\n    gWeatherPtr->gammaStepDelay = 0;\n}\n\nstatic void None_Main(void)\n{\n}\n\nstatic u8 None_Finish(void)\n{\n    return 0;\n}\n\n// When the weather is changing, it gradually updates the palettes\n// towards the desired gamma shift.\nstatic void UpdateWeatherGammaShift(void)\n{\n    if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT)\n    {\n        if (gWeatherPtr->gammaIndex == gWeatherPtr->gammaTargetIndex)\n        {\n            gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;\n        }\n        else\n        {\n            if (++gWeatherPtr->gammaStepFrameCounter >= gWeatherPtr->gammaStepDelay)\n            {\n                gWeatherPtr->gammaStepFrameCounter = 0;\n                if (gWeatherPtr->gammaIndex < gWeatherPtr->gammaTargetIndex)\n                    gWeatherPtr->gammaIndex++;\n                else\n                    gWeatherPtr->gammaIndex--;\n\n                ApplyGammaShift(0, 32, gWeatherPtr->gammaIndex);\n            }\n        }\n    }\n}\n\nstatic void FadeInScreenWithWeather(void)\n{\n    if (++gWeatherPtr->fadeInCounter > 1)\n        gWeatherPtr->fadeInActive = 0;\n\n    switch (gWeatherPtr->currWeather)\n    {\n    case WEATHER_RAIN:\n    case WEATHER_RAIN_THUNDERSTORM:\n    case WEATHER_DOWNPOUR:\n    case WEATHER_SNOW:\n    case WEATHER_SHADE:\n        if (FadeInScreen_RainShowShade() == FALSE)\n        {\n            gWeatherPtr->gammaIndex = 3;\n            gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;\n        }\n        break;\n    case WEATHER_DROUGHT:\n        if (FadeInScreen_Drought() == FALSE)\n        {\n            gWeatherPtr->gammaIndex = -6;\n            gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;\n        }\n        break;\n    case WEATHER_FOG_HORIZONTAL:\n        if (FadeInScreen_FogHorizontal() == FALSE)\n        {\n            gWeatherPtr->gammaIndex = 0;\n            gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;\n        }\n        break;\n    case WEATHER_VOLCANIC_ASH:\n    case WEATHER_SANDSTORM:\n    case WEATHER_FOG_DIAGONAL:\n    case WEATHER_UNDERWATER:\n    default:\n        if (!gPaletteFade.active)\n        {\n            gWeatherPtr->gammaIndex = gWeatherPtr->gammaTargetIndex;\n            gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;\n        }\n        break;\n    }\n}\n\nstatic bool8 FadeInScreen_RainShowShade(void)\n{\n    if (gWeatherPtr->fadeScreenCounter == 16)\n        return FALSE;\n\n    if (++gWeatherPtr->fadeScreenCounter >= 16)\n    {\n        ApplyGammaShift(0, 32, 3);\n        gWeatherPtr->fadeScreenCounter = 16;\n        return FALSE;\n    }\n\n    ApplyGammaShiftWithBlend(0, 32, 3, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor);\n    return TRUE;\n}\n\nstatic bool8 FadeInScreen_Drought(void)\n{\n    if (gWeatherPtr->fadeScreenCounter == 16)\n        return FALSE;\n\n    if (++gWeatherPtr->fadeScreenCounter >= 16)\n    {\n        ApplyGammaShift(0, 32, -6);\n        gWeatherPtr->fadeScreenCounter = 16;\n        return FALSE;\n    }\n\n    ApplyDroughtGammaShiftWithBlend(-6, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor);\n    return TRUE;\n}\n\nstatic bool8 FadeInScreen_FogHorizontal(void)\n{\n    if (gWeatherPtr->fadeScreenCounter == 16)\n        return FALSE;\n\n    gWeatherPtr->fadeScreenCounter++;\n    ApplyFogBlend(16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor);\n    return TRUE;\n}\n\nstatic void DoNothing(void)\n{ }\n\nstatic void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex)\n{\n    u16 curPalIndex;\n    u16 palOffset;\n    const u8 *gammaTable;\n    u32 i;\n\n    if (gammaIndex > 0)\n    {\n        gammaIndex--;\n        palOffset = PLTT_ID(startPalIndex);\n        numPalettes += startPalIndex;\n        curPalIndex = startPalIndex;\n\n        // Loop through the speficied palette range and apply necessary gamma shifts to the colors.\n        while (curPalIndex < numPalettes)\n        {\n            if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE)\n            {\n                // No palette change.\n                CpuFastCopy(&gPlttBufferUnfaded[palOffset], &gPlttBufferFaded[palOffset], PLTT_SIZE_4BPP);\n                palOffset += 16;\n            }\n            else\n            {\n                u8 r, g, b;\n\n                if (sPaletteGammaTypes[curPalIndex] == GAMMA_ALT || curPalIndex - 16 == gWeatherPtr->altGammaSpritePalIndex)\n                    gammaTable = sContrastColorMaps[gammaIndex];\n                else\n                    gammaTable = sDarkenedContrastColorMaps[gammaIndex];\n\n                for (i = 0; i < 16; i++)\n                {\n                    // Apply gamma shift to the original color.\n                    struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];\n                    r = gammaTable[baseColor.r];\n                    g = gammaTable[baseColor.g];\n                    b = gammaTable[baseColor.b];\n                    gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r;\n                }\n            }\n\n            curPalIndex++;\n        }\n    }\n    else if (gammaIndex < 0)\n    {\n        //A negative gammIndex value means that the blending will come from the special Drought weather's palette tables.\n        gammaIndex = -gammaIndex - 1;\n        palOffset = startPalIndex * 16;\n        numPalettes += startPalIndex;\n        curPalIndex = startPalIndex;\n        \n        CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16));\n        while (curPalIndex < numPalettes)\n        {\n            if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE)\n            {   // No palette change.\n                palOffset += 16;\n            }\n            else\n            {\n                for (i = 0; i < 16; i++)\n                {\n                    gPlttBufferFaded[palOffset] = sDroughtWeatherColors[gammaIndex][DROUGHT_COLOR_INDEX(gPlttBufferUnfaded[palOffset])];\n                    palOffset++;\n                }\n            }\n            curPalIndex++;\n        }\n    }\n    else\n    {\n        // No palette blending.\n        CpuFastCopy(&gPlttBufferUnfaded[PLTT_ID(startPalIndex)], &gPlttBufferFaded[PLTT_ID(startPalIndex)], numPalettes * PLTT_SIZE_4BPP);\n    }\n}\n\nstatic void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor)\n{\n    u16 palOffset;\n    u16 curPalIndex;\n    u32 i;\n    struct RGBColor color = *(struct RGBColor *)&blendColor;\n    u8 rBlend = color.r;\n    u8 gBlend = color.g;\n    u8 bBlend = color.b;\n\n    palOffset = PLTT_ID(startPalIndex);\n    numPalettes += startPalIndex;\n    gammaIndex--;\n    curPalIndex = startPalIndex;\n\n    while (curPalIndex < numPalettes)\n    {\n        if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE)\n        {\n            // No gamma shift. Simply blend the colors.\n            BlendPalette(palOffset, 16, blendCoeff, blendColor);\n            palOffset += 16;\n        }\n        else\n        {\n            const u8 *gammaTable;\n\n            if (sPaletteGammaTypes[curPalIndex] == GAMMA_NORMAL)\n                gammaTable = sDarkenedContrastColorMaps[gammaIndex];\n            else\n                gammaTable = sContrastColorMaps[gammaIndex];\n\n            for (i = 0; i < 16; i++)\n            {\n                struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];\n                u8 r = gammaTable[baseColor.r];\n                u8 g = gammaTable[baseColor.g];\n                u8 b = gammaTable[baseColor.b];\n\n                // Apply gamma shift and target blend color to the original color.\n                r += ((rBlend - r) * blendCoeff) >> 4;\n                g += ((gBlend - g) * blendCoeff) >> 4;\n                b += ((bBlend - b) * blendCoeff) >> 4;\n                gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r;\n            }\n        }\n\n        curPalIndex++;\n    }\n}\n\nstatic void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor)\n{\n    struct RGBColor color;\n    u8 rBlend;\n    u8 gBlend;\n    u8 bBlend;\n    u16 curPalIndex;\n    u16 palOffset;\n    u32 i;\n\n    gammaIndex = -gammaIndex - 1;\n    color = *(struct RGBColor *)&blendColor;\n    rBlend = color.r;\n    gBlend = color.g;\n    bBlend = color.b;\n    palOffset = 0;\n    for (curPalIndex = 0; curPalIndex < 32; curPalIndex++)\n    {\n        if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE)\n        {\n            // No gamma shift. Simply blend the colors.\n            BlendPalette(palOffset, 16, blendCoeff, blendColor);\n            palOffset += 16;\n        }\n        else\n        {\n            for (i = 0; i < 16; i++)\n            {\n                u32 offset;\n                struct RGBColor color1;\n                struct RGBColor color2;\n                u8 r1, g1, b1;\n                u8 r2, g2, b2;\n\n                color1 = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];\n                r1 = color1.r;\n                g1 = color1.g;\n                b1 = color1.b;\n\n                r1 += ((rBlend - r1) * blendCoeff) >> 4;\n                g1 += ((gBlend - g1) * blendCoeff) >> 4;\n                b1 += ((bBlend - b1) * blendCoeff) >> 4;\n\n                gPlttBufferFaded[palOffset++] = (b1 << 10) | (g1 << 5) | r1;\n            }\n        }\n    }\n}\n\nstatic void ApplyFogBlend(u8 blendCoeff, u16 blendColor)\n{\n    struct RGBColor color;\n    u8 rBlend;\n    u8 gBlend;\n    u8 bBlend;\n    u16 curPalIndex;\n\n    BlendPalette(0, 256, blendCoeff, blendColor);\n    color = *(struct RGBColor *)&blendColor;\n    rBlend = color.r;\n    gBlend = color.g;\n    bBlend = color.b;\n\n    for (curPalIndex = 16; curPalIndex < 32; curPalIndex++)\n    {\n        if (LightenSpritePaletteInFog(curPalIndex))\n        {\n            u16 palEnd = PLTT_ID(curPalIndex + 1);\n            u16 palOffset = PLTT_ID(curPalIndex);\n\n            while (palOffset < palEnd)\n            {\n                struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];\n                u8 r = color.r;\n                u8 g = color.g;\n                u8 b = color.b;\n\n                r += ((28 - r) * 3) >> 2;\n                g += ((31 - g) * 3) >> 2;\n                b += ((28 - b) * 3) >> 2;\n\n                r += ((rBlend - r) * blendCoeff) >> 4;\n                g += ((gBlend - g) * blendCoeff) >> 4;\n                b += ((bBlend - b) * blendCoeff) >> 4;\n\n                gPlttBufferFaded[palOffset] = (b << 10) | (g << 5) | r;\n                palOffset++;\n            }\n        }\n        else\n        {\n            BlendPalette(PLTT_ID(curPalIndex), 16, blendCoeff, blendColor);\n        }\n    }\n}\n\nstatic void MarkFogSpritePalToLighten(u8 paletteIndex)\n{\n    if (gWeatherPtr->lightenedFogSpritePalsCount < 6)\n    {\n        gWeatherPtr->lightenedFogSpritePals[gWeatherPtr->lightenedFogSpritePalsCount] = paletteIndex;\n        gWeatherPtr->lightenedFogSpritePalsCount++;\n    }\n}\n\nstatic bool8 LightenSpritePaletteInFog(u8 paletteIndex)\n{\n    u32 i;\n\n    for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++)\n    {\n        if (gWeatherPtr->lightenedFogSpritePals[i] == paletteIndex)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nvoid WeatherShiftGammaIfPalStateIdle(s8 gammaIndex)\n{\n    if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE)\n    {\n        ApplyGammaShift(0, 32, gammaIndex);\n        gWeatherPtr->gammaIndex = gammaIndex;\n    }\n}\n\nvoid WeatherBeginGammaFade(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay)\n{\n    if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE)\n    {\n        gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER;\n        gWeatherPtr->gammaIndex = gammaIndex;\n        gWeatherPtr->gammaTargetIndex = gammaTargetIndex;\n        gWeatherPtr->gammaStepFrameCounter = 0;\n        gWeatherPtr->gammaStepDelay = gammaStepDelay;\n        WeatherShiftGammaIfPalStateIdle(gammaIndex);\n    }\n}\n\nvoid FadeScreen(u8 mode, s8 delay)\n{\n    u32 fadeColor;\n    bool8 fadeOut;\n    bool8 useWeatherPal;\n\n    switch (mode)\n    {\n    case FADE_FROM_BLACK:\n        fadeColor = RGB_BLACK;\n        fadeOut = FALSE;\n        break;\n    case FADE_FROM_WHITE:\n        fadeColor = RGB_WHITEALPHA;\n        fadeOut = FALSE;\n        break;\n    case FADE_TO_BLACK:\n        fadeColor = RGB_BLACK;\n        fadeOut = TRUE;\n        break;\n    case FADE_TO_WHITE:\n        fadeColor = RGB_WHITEALPHA;\n        fadeOut = TRUE;\n        break;\n    default:\n        return;\n    }\n\n    switch (gWeatherPtr->currWeather)\n    {\n    case WEATHER_RAIN:\n    case WEATHER_RAIN_THUNDERSTORM:\n    case WEATHER_DOWNPOUR:\n    case WEATHER_SNOW:\n    case WEATHER_FOG_HORIZONTAL:\n    case WEATHER_SHADE:\n    case WEATHER_DROUGHT:\n        useWeatherPal = TRUE;\n        break;\n    default:\n        useWeatherPal = FALSE;\n        break;\n    }\n\n    if (fadeOut)\n    {\n        if (useWeatherPal)\n            CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE);\n\n        BeginNormalPaletteFade(PALETTES_ALL, delay, 0, 16, fadeColor);\n        gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT;\n    }\n    else\n    {\n        gWeatherPtr->fadeDestColor = fadeColor;\n        if (useWeatherPal)\n            gWeatherPtr->fadeScreenCounter = 0;\n        else\n            BeginNormalPaletteFade(PALETTES_ALL, delay, 16, 0, fadeColor);\n\n        gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN;\n        gWeatherPtr->fadeInActive = 1;\n        gWeatherPtr->fadeInCounter = 0;\n        Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);\n        gWeatherPtr->readyForInit = TRUE;\n    }\n}\n\nvoid FadeSelectedPals(u8 mode, s8 delay, u32 selectedPalettes)\n{\n    u32 fadeColor;\n    bool8 fadeOut;\n    bool8 useWeatherPal;\n\n    switch (mode)\n    {\n    case FADE_FROM_BLACK:\n        fadeColor = RGB_BLACK;\n        fadeOut = FALSE;\n        break;\n    case FADE_FROM_WHITE:\n        fadeColor = RGB_WHITEALPHA;\n        fadeOut = FALSE;\n        break;\n    case FADE_TO_BLACK:\n        fadeColor = RGB_BLACK;\n        fadeOut = TRUE;\n        break;\n    case FADE_TO_WHITE:\n        fadeColor = RGB_WHITEALPHA;\n        fadeOut = TRUE;\n        break;\n    default:\n        return;\n    }\n\n    switch (gWeatherPtr->currWeather)\n    {\n    case WEATHER_RAIN:\n    case WEATHER_RAIN_THUNDERSTORM:\n    case WEATHER_DOWNPOUR:\n    case WEATHER_SNOW:\n    case WEATHER_FOG_HORIZONTAL:\n    case WEATHER_SHADE:\n    case WEATHER_DROUGHT:\n        useWeatherPal = TRUE;\n        break;\n    default:\n        useWeatherPal = FALSE;\n        break;\n    }\n\n    if (fadeOut)\n    {\n        if (useWeatherPal)\n            CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE);\n\n        BeginNormalPaletteFade(selectedPalettes, delay, 0, 16, fadeColor);\n        gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT;\n    }\n    else\n    {\n        gWeatherPtr->fadeDestColor = fadeColor;\n        if (useWeatherPal)\n            gWeatherPtr->fadeScreenCounter = 0;\n        else\n            BeginNormalPaletteFade(selectedPalettes, delay, 16, 0, fadeColor);\n\n        gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN;\n        gWeatherPtr->fadeInActive = 1;\n        gWeatherPtr->fadeInCounter = 0;\n        Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);\n        gWeatherPtr->readyForInit = TRUE;\n    }\n}\n\n\nbool8 IsWeatherNotFadingIn(void)\n{\n    return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN);\n}\n\nvoid UpdateSpritePaletteWithWeather(u8 spritePaletteIndex)\n{\n    u16 paletteIndex = 16 + spritePaletteIndex;\n    u32 i;\n\n    switch (gWeatherPtr->palProcessingState)\n    {\n    case WEATHER_PAL_STATE_SCREEN_FADING_IN:\n        if (gWeatherPtr->fadeInActive != 0)\n        {\n            if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL)\n                MarkFogSpritePalToLighten(paletteIndex);\n            paletteIndex = PLTT_ID(paletteIndex);\n            for (i = 0; i < 16; i++)\n                gPlttBufferFaded[paletteIndex + i] = gWeatherPtr->fadeDestColor;\n        }\n        break;\n    case WEATHER_PAL_STATE_SCREEN_FADING_OUT:\n        paletteIndex = PLTT_ID(paletteIndex);\n        CpuFastCopy(&gPlttBufferFaded[paletteIndex], &gPlttBufferUnfaded[paletteIndex], PLTT_SIZE_4BPP);\n        BlendPalette(paletteIndex, 16, gPaletteFade.y, gPaletteFade.blendColor);\n        break;\n        // WEATHER_PAL_STATE_CHANGING_WEATHER\n        // WEATHER_PAL_STATE_CHANGING_IDLE\n    default:\n        if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL)\n        {\n            ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex);\n        }\n        else\n        {\n            paletteIndex = PLTT_ID(paletteIndex);\n            BlendPalette(paletteIndex, 16, 12, RGB(28, 31, 28));\n        }\n        break;\n    }\n}\n\nvoid ApplyWeatherGammaShiftToPal(u8 paletteIndex)\n{\n    ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex);\n}\n\nstatic u8 IsWeatherFadingIn(void)\n{\n    if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN)\n        return gWeatherPtr->fadeInActive;\n    else\n        return 0;\n}\n\nvoid LoadCustomWeatherSpritePalette(const u16 *palette)\n{\n    LoadPalette(palette, OBJ_PLTT_ID(gWeatherPtr->weatherPicSpritePalIndex), PLTT_SIZE_4BPP);\n    UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex);\n}\n\nstatic void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *a1)\n{\n    // Dummied out in FRLG\n    *gammaIndexPtr = 0x20;\n    *a1 = 0x20;\n}\n\nvoid ResetDroughtWeatherPaletteLoading(void)\n{\n    gWeatherPtr->loadDroughtPalsIndex = 1;\n    gWeatherPtr->loadDroughtPalsOffset = 1;\n}\n\nbool8 LoadDroughtWeatherPalettes(void)\n{\n    if (gWeatherPtr->loadDroughtPalsIndex < 32)\n    {\n        LoadDroughtWeatherPalette(&gWeatherPtr->loadDroughtPalsIndex, &gWeatherPtr->loadDroughtPalsOffset);\n        if (gWeatherPtr->loadDroughtPalsIndex < 32)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void SetDroughtGamma(s8 gammaIndex)\n{\n    WeatherShiftGammaIfPalStateIdle(-gammaIndex - 1);\n}\n\nvoid DroughtStateInit(void)\n{\n    gWeatherPtr->droughtBrightnessStage = 0;\n    gWeatherPtr->droughtTimer = 0;\n    gWeatherPtr->droughtState = 0;\n    gWeatherPtr->droughtLastBrightnessStage = 0;\n    sDroughtFrameDelay = 5;\n}\n\nvoid DroughtStateRun(void)\n{\n    switch (gWeatherPtr->droughtState)\n    {\n    case 0:\n        // Ramp up\n        if (++gWeatherPtr->droughtTimer > sDroughtFrameDelay)\n        {\n            gWeatherPtr->droughtTimer = 0;\n            SetDroughtGamma(gWeatherPtr->droughtBrightnessStage++);\n            if (gWeatherPtr->droughtBrightnessStage > 5)\n            {\n                gWeatherPtr->droughtLastBrightnessStage = gWeatherPtr->droughtBrightnessStage;\n                gWeatherPtr->droughtState = 1;\n                gWeatherPtr->droughtTimer = 60;\n            }\n        }\n        break;\n    case 1:\n        // Oscillate\n        gWeatherPtr->droughtTimer = (gWeatherPtr->droughtTimer + 3) & 0x7F;\n        gWeatherPtr->droughtBrightnessStage = ((gSineTable[gWeatherPtr->droughtTimer] - 1) >> 6) + 2;\n        if (gWeatherPtr->droughtBrightnessStage != gWeatherPtr->droughtLastBrightnessStage)\n            SetDroughtGamma(gWeatherPtr->droughtBrightnessStage);\n        gWeatherPtr->droughtLastBrightnessStage = gWeatherPtr->droughtBrightnessStage;\n        break;\n    case 2:\n        // Ramp down\n        if (++gWeatherPtr->droughtTimer > sDroughtFrameDelay)\n        {\n            gWeatherPtr->droughtTimer = 0;\n            SetDroughtGamma(--gWeatherPtr->droughtBrightnessStage);\n            if (gWeatherPtr->droughtBrightnessStage == 3)\n                gWeatherPtr->droughtState = 0;\n        }\n        break;\n    }\n}\n\nvoid Weather_SetBlendCoeffs(u8 eva, u8 evb)\n{\n    gWeatherPtr->currBlendEVA = eva;\n    gWeatherPtr->currBlendEVB = evb;\n    gWeatherPtr->targetBlendEVA = eva;\n    gWeatherPtr->targetBlendEVB = evb;\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(eva, evb));\n}\n\nvoid Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay)\n{\n    gWeatherPtr->targetBlendEVA = eva;\n    gWeatherPtr->targetBlendEVB = evb;\n    gWeatherPtr->blendDelay = delay;\n    gWeatherPtr->blendFrameCounter = 0;\n    gWeatherPtr->blendUpdateCounter = 0;\n}\n\nbool8 Weather_UpdateBlend(void)\n{\n    if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA\n        && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)\n        return TRUE;\n\n    if (++gWeatherPtr->blendFrameCounter > gWeatherPtr->blendDelay)\n    {\n        gWeatherPtr->blendFrameCounter = 0;\n        gWeatherPtr->blendUpdateCounter++;\n\n        // Update currBlendEVA and currBlendEVB on alternate frames\n        if (gWeatherPtr->blendUpdateCounter & 1)\n        {\n            if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA)\n                gWeatherPtr->currBlendEVA++;\n            else if (gWeatherPtr->currBlendEVA > gWeatherPtr->targetBlendEVA)\n                gWeatherPtr->currBlendEVA--;\n        }\n        else\n        {\n            if (gWeatherPtr->currBlendEVB < gWeatherPtr->targetBlendEVB)\n                gWeatherPtr->currBlendEVB++;\n            else if (gWeatherPtr->currBlendEVB > gWeatherPtr->targetBlendEVB)\n                gWeatherPtr->currBlendEVB--;\n        }\n    }\n\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB));\n\n    if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA\n        && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)\n        return TRUE;\n\n    return FALSE;\n}\n\n// Unused. Uses the same numbering scheme as the coord events\nstatic void SetFieldWeather(u8 weather)\n{\n    switch (weather)\n    {\n    case COORD_EVENT_WEATHER_SUNNY_CLOUDS:\n        SetWeather(WEATHER_SUNNY_CLOUDS);\n        break;\n    case COORD_EVENT_WEATHER_SUNNY:\n        SetWeather(WEATHER_SUNNY);\n        break;\n    case COORD_EVENT_WEATHER_RAIN:\n        SetWeather(WEATHER_RAIN);\n        break;\n    case COORD_EVENT_WEATHER_SNOW:\n        SetWeather(WEATHER_SNOW);\n        break;\n    case COORD_EVENT_WEATHER_RAIN_THUNDERSTORM:\n        SetWeather(WEATHER_RAIN_THUNDERSTORM);\n        break;\n    case COORD_EVENT_WEATHER_FOG_HORIZONTAL:\n        SetWeather(WEATHER_FOG_HORIZONTAL);\n        break;\n    case COORD_EVENT_WEATHER_FOG_DIAGONAL:\n        SetWeather(WEATHER_FOG_DIAGONAL);\n        break;\n    case COORD_EVENT_WEATHER_VOLCANIC_ASH:\n        SetWeather(WEATHER_VOLCANIC_ASH);\n        break;\n    case COORD_EVENT_WEATHER_SANDSTORM:\n        SetWeather(WEATHER_SANDSTORM);\n        break;\n    case COORD_EVENT_WEATHER_SHADE:\n        SetWeather(WEATHER_SHADE);\n        break;\n    }\n}\n\nu8 GetCurrentWeather(void)\n{\n    return gWeatherPtr->currWeather;\n}\n\nvoid SetRainStrengthFromSoundEffect(u16 soundEffect)\n{\n    if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT)\n    {\n        switch (soundEffect)\n        {\n        case SE_RAIN:\n            gWeatherPtr->rainStrength = 0;\n            break;\n        case SE_DOWNPOUR:\n            gWeatherPtr->rainStrength = 1;\n            break;\n        case SE_THUNDERSTORM:\n            gWeatherPtr->rainStrength = 2;\n            break;\n        default:\n            return;\n        }\n\n        PlaySE(soundEffect);\n    }\n}\n\nvoid PlayRainStoppingSoundEffect(void)\n{\n    if (IsSpecialSEPlaying())\n    {\n        switch (gWeatherPtr->rainStrength)\n        {\n        case 0:\n            PlaySE(SE_RAIN_STOP);\n            break;\n        case 1:\n            PlaySE(SE_DOWNPOUR_STOP);\n            break;\n        case 2:\n        default:\n            PlaySE(SE_THUNDERSTORM_STOP);\n            break;\n        }\n    }\n}\n\nu8 IsWeatherChangeComplete(void)\n{\n    return gWeatherPtr->weatherChangeComplete;\n}\n\nvoid SetWeatherScreenFadeOut(void)\n{\n    gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT;\n}\n\nvoid WeatherProcessingIdle(void)\n{\n    gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;\n}\n\nvoid PreservePaletteInWeather(u8 preservedPalIndex)\n{\n    CpuCopy16(sBasePaletteGammaTypes, sFieldEffectPaletteGammaTypes, 32);\n    sFieldEffectPaletteGammaTypes[preservedPalIndex] = GAMMA_NONE;\n    sPaletteGammaTypes = sFieldEffectPaletteGammaTypes;\n}\n\nvoid ResetPreservedPalettesInWeather(void)\n{\n    sPaletteGammaTypes = sBasePaletteGammaTypes;\n}\n\nvoid SlightlyDarkenPalsInWeather(u16 *palbuf, u16 *unused, u32 size)\n{\n    switch (gWeatherPtr->currWeather)\n    {\n    case WEATHER_RAIN:\n    case WEATHER_SNOW:\n    case WEATHER_RAIN_THUNDERSTORM:\n    case WEATHER_SHADE:\n    case WEATHER_DOWNPOUR:\n        BlendPalettesAt(palbuf, RGB_BLACK, 3, size);\n        break;\n    }\n}\n"
  },
  {
    "path": "src/field_weather_effects.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"event_object_movement.h\"\n#include \"field_weather.h\"\n#include \"field_weather_effects.h\"\n#include \"random.h\"\n#include \"script.h\"\n#include \"constants/weather.h\"\n#include \"constants/songs.h\"\n#include \"task.h\"\n#include \"trig.h\"\n\n//------------------------------------------------------------------------------\n// WEATHER_SUNNY_CLOUDS\n//------------------------------------------------------------------------------\n\nstatic void CreateCloudSprites(void);\nstatic void DestroyCloudSprites(void);\nstatic void UpdateCloudSprite(struct Sprite *);\n\n// The clouds are positioned on the map's grid.\n// These coordinates are for the lower half of Route 120.\nstatic const struct Coords16 sCloudSpriteMapCoords[] = {\n    { 0, 66},\n    { 5, 73},\n    {10, 78},\n};\n\nstatic const struct SpriteSheet sCloudSpriteSheet = {\n    .data = gWeatherCloudTiles,\n    .size = 0x0800,\n    .tag = GFXTAG_CLOUD\n};\n\nstatic const struct OamData sCloudSpriteOamData = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 3,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sCloudSpriteAnimCmd[] = {\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sCloudSpriteAnimCmds[] = {\n    sCloudSpriteAnimCmd,\n};\n\nstatic const struct SpriteTemplate sCloudSpriteTemplate = {\n    .tileTag = GFXTAG_CLOUD,\n    .paletteTag = PALTAG_WEATHER,\n    .oam = &sCloudSpriteOamData,\n    .anims = sCloudSpriteAnimCmds,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateCloudSprite,\n};\n\nvoid Clouds_InitVars(void)\n{\n    gWeatherPtr->gammaTargetIndex = 0;\n    gWeatherPtr->gammaStepDelay = 20;\n    gWeatherPtr->weatherGfxLoaded = FALSE;\n    gWeatherPtr->initStep = 0;\n    if (!gWeatherPtr->cloudSpritesCreated)\n        Weather_SetBlendCoeffs(0, 16);\n}\n\nvoid Clouds_InitAll(void)\n{\n    Clouds_InitVars();\n    while (!gWeatherPtr->weatherGfxLoaded)\n        Clouds_Main();\n}\n\nvoid Clouds_Main(void)\n{\n    switch (gWeatherPtr->initStep)\n    {\n    case 0:\n        CreateCloudSprites();\n        gWeatherPtr->initStep++;\n        break;\n    case 1:\n        Weather_SetTargetBlendCoeffs(12, 8, 1);\n        gWeatherPtr->initStep++;\n        break;\n    case 2:\n        if (Weather_UpdateBlend())\n        {\n            gWeatherPtr->weatherGfxLoaded = TRUE;\n            gWeatherPtr->initStep++;\n        }\n        break;\n    }\n}\n\nbool8 Clouds_Finish(void)\n{\n    switch (gWeatherPtr->finishStep)\n    {\n    case 0:\n        Weather_SetTargetBlendCoeffs(0, 16, 1);\n        gWeatherPtr->finishStep++;\n        return TRUE;\n    case 1:\n        if (Weather_UpdateBlend())\n        {\n            DestroyCloudSprites();\n            gWeatherPtr->finishStep++;\n        }\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid Sunny_InitVars(void)\n{\n    gWeatherPtr->gammaTargetIndex = 0;\n    gWeatherPtr->gammaStepDelay = 20;\n}\n\nvoid Sunny_InitAll(void)\n{\n    Sunny_InitVars();\n}\n\nvoid Sunny_Main(void)\n{\n}\n\nbool8 Sunny_Finish(void)\n{\n    return FALSE;\n}\n\nstatic void CreateCloudSprites(void)\n{\n    u32 i;\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    if (gWeatherPtr->cloudSpritesCreated == TRUE)\n        return;\n\n    LoadSpriteSheet(&sCloudSpriteSheet);\n    LoadCustomWeatherSpritePalette(gCloudsWeatherPalette);\n    for (i = 0; i < NUM_CLOUD_SPRITES; i++)\n    {\n        spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF);\n        if (spriteId != MAX_SPRITES)\n        {\n            gWeatherPtr->sprites.s1.cloudSprites[i] = &gSprites[spriteId];\n            sprite = gWeatherPtr->sprites.s1.cloudSprites[i];\n            SetSpritePosToMapCoords(sCloudSpriteMapCoords[i].x + 7, sCloudSpriteMapCoords[i].y + 7, &sprite->x, &sprite->y);\n            sprite->coordOffsetEnabled = TRUE;\n        }\n        else\n        {\n            gWeatherPtr->sprites.s1.cloudSprites[i] = NULL;\n        }\n    }\n\n    gWeatherPtr->cloudSpritesCreated = TRUE;\n}\n\nstatic void DestroyCloudSprites(void)\n{\n    u32 i;\n\n    if (!gWeatherPtr->cloudSpritesCreated)\n        return;\n\n    for (i = 0; i < NUM_CLOUD_SPRITES; i++)\n    {\n        if (gWeatherPtr->sprites.s1.cloudSprites[i] != NULL)\n            DestroySprite(gWeatherPtr->sprites.s1.cloudSprites[i]);\n    }\n\n    FreeSpriteTilesByTag(GFXTAG_CLOUD);\n    gWeatherPtr->cloudSpritesCreated = FALSE;\n}\n\nstatic void UpdateCloudSprite(struct Sprite *sprite)\n{\n    // Move 1 pixel left every 2 frames.\n    sprite->data[0] = (sprite->data[0] + 1) & 1;\n    if (sprite->data[0])\n        sprite->x--;\n}\n\n//------------------------------------------------------------------------------\n// WEATHER_DROUGHT\n//------------------------------------------------------------------------------\n\nstatic void UpdateDroughtBlend(u8);\n\nvoid Drought_InitVars(void)\n{\n    gWeatherPtr->initStep = 0;\n    gWeatherPtr->weatherGfxLoaded = FALSE;\n    gWeatherPtr->gammaTargetIndex = 0;\n    gWeatherPtr->gammaStepDelay = 0;\n}\n\nvoid Drought_InitAll(void)\n{\n    Drought_InitVars();\n    while (!gWeatherPtr->weatherGfxLoaded)\n        Drought_Main();\n}\n\nvoid Drought_Main(void)\n{\n    switch (gWeatherPtr->initStep)\n    {\n    case 0:\n        if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER)\n            gWeatherPtr->initStep++;\n        break;\n    case 1:\n        ResetDroughtWeatherPaletteLoading();\n        gWeatherPtr->initStep++;\n        break;\n    case 2:\n        if (!LoadDroughtWeatherPalettes())\n            gWeatherPtr->initStep++;\n        break;\n    case 3:\n        DroughtStateInit();\n        gWeatherPtr->initStep++;\n        break;\n    case 4:\n        DroughtStateRun();\n        if (gWeatherPtr->droughtBrightnessStage == 6)\n        {\n            gWeatherPtr->weatherGfxLoaded = TRUE;\n            gWeatherPtr->initStep++;\n        }\n        break;\n    default:\n        DroughtStateRun();\n        break;\n    }\n}\n\nbool8 Drought_Finish(void)\n{\n    return FALSE;\n}\n\nvoid StartDroughtWeatherBlend(void)\n{\n    CreateTask(UpdateDroughtBlend, 0x50);\n}\n\n#define tState      data[0]\n#define tBlendY     data[1]\n#define tBlendDelay data[2]\n#define tWinRange   data[3]\n\nstatic void UpdateDroughtBlend(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->tState)\n    {\n    case 0:\n        task->tBlendY = 0;\n        task->tBlendDelay = 0;\n        task->tWinRange = GetGpuReg(REG_OFFSET_WININ);\n        SetGpuReg(REG_OFFSET_WININ, WIN_RANGE(63, 63));\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_LIGHTEN);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        task->tState++;\n        // fall through\n    case 1:\n        task->tBlendY += 3;\n        if (task->tBlendY > 16)\n            task->tBlendY = 16;\n        SetGpuReg(REG_OFFSET_BLDY, task->tBlendY);\n        if (task->tBlendY >= 16)\n            task->tState++;\n        break;\n    case 2:\n        task->tBlendDelay++;\n        if (task->tBlendDelay > 9)\n        {\n            task->tBlendDelay = 0;\n            task->tBlendY--;\n            if (task->tBlendY <= 0)\n            {\n                task->tBlendY = 0;\n                task->tState++;\n            }\n            SetGpuReg(REG_OFFSET_BLDY, task->tBlendY);\n        }\n        break;\n    case 3:\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        SetGpuReg(REG_OFFSET_WININ, task->tWinRange);\n        task->tState++;\n        break;\n    case 4:\n        ScriptContext_Enable();\n        DestroyTask(taskId);\n        break;\n    }\n}\n\n#undef tState\n#undef tBlendY\n#undef tBlendDelay\n#undef tWinRange\n\n//------------------------------------------------------------------------------\n// WEATHER_RAIN\n//------------------------------------------------------------------------------\n\nstatic void LoadRainSpriteSheet(void);\nstatic bool8 CreateRainSprite(void);\nstatic void UpdateRainSprite(struct Sprite *sprite);\nstatic bool8 UpdateVisibleRainSprites(void);\nstatic void DestroyRainSprites(void);\n\nstatic const struct Coords16 sRainSpriteCoords[] = {\n    {  0,   0},\n    {  0, 160},\n    {  0,  64},\n    {144, 224},\n    {144, 128},\n    { 32,  32},\n    { 32, 192},\n    { 32,  96},\n    { 72, 128},\n    { 72,  32},\n    { 72, 192},\n    {216,  96},\n    {216,   0},\n    {104, 160},\n    {104,  64},\n    {104, 224},\n    {144,   0},\n    {144, 160},\n    {144,  64},\n    { 32, 224},\n    { 32, 128},\n    { 72,  32},\n    { 72, 192},\n    { 48,  96},\n};\n\nstatic const struct OamData sRainSpriteOamData = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x32),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x32),\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 2,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sRainSpriteFallAnimCmd[] = {\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sRainSpriteSplashAnimCmd[] = {\n    ANIMCMD_FRAME(8, 3),\n    ANIMCMD_FRAME(32, 2),\n    ANIMCMD_FRAME(40, 2),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sRainSpriteHeavySplashAnimCmd[] = {\n    ANIMCMD_FRAME(8, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(24, 4),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sRainSpriteAnimCmds[] = {\n    sRainSpriteFallAnimCmd,\n    sRainSpriteSplashAnimCmd,\n    sRainSpriteHeavySplashAnimCmd,\n};\n\nstatic const struct SpriteTemplate sRainSpriteTemplate = {\n    .tileTag = GFXTAG_RAIN,\n    .paletteTag = PALTAG_WEATHER,\n    .oam = &sRainSpriteOamData,\n    .anims = sRainSpriteAnimCmds,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateRainSprite,\n};\n\n// Q28.4 fixed-point format values\nstatic const s16 sRainSpriteMovement[][2] = {\n    {-0x68,  0xD0},\n    {-0xA0, 0x140},\n};\n\n// First byte is the number of frames a raindrop falls before it splashes.\n// Second byte is the maximum number of frames a raindrop can \"wait\" before\n// it appears and starts falling. (This is only for the initial raindrop spawn.)\nstatic const u16 sRainSpriteFallingDurations[][2] = {\n    {18, 7},\n    {12, 10},\n};\n\nstatic const struct SpriteSheet sRainSpriteSheet = {\n    .data = gWeatherRainTiles,\n    .size = 0x0600,\n    .tag = GFXTAG_RAIN,\n};\n\nvoid Rain_InitVars(void)\n{\n    gWeatherPtr->initStep = 0;\n    gWeatherPtr->weatherGfxLoaded = FALSE;\n    gWeatherPtr->rainSpriteVisibleCounter = 0;\n    gWeatherPtr->rainSpriteVisibleDelay = 8;\n    gWeatherPtr->isDownpour = FALSE;\n    gWeatherPtr->targetRainSpriteCount = 10;\n    gWeatherPtr->gammaTargetIndex = 3;\n    gWeatherPtr->gammaStepDelay = 20;\n    SetRainStrengthFromSoundEffect(SE_RAIN);\n}\n\nvoid Rain_InitAll(void)\n{\n    Rain_InitVars();\n    while (!gWeatherPtr->weatherGfxLoaded)\n        Rain_Main();\n}\n\nvoid Rain_Main(void)\n{\n    switch (gWeatherPtr->initStep)\n    {\n    case 0:\n        LoadRainSpriteSheet();\n        gWeatherPtr->initStep++;\n        break;\n    case 1:\n        if (!CreateRainSprite())\n            gWeatherPtr->initStep++;\n        break;\n    case 2:\n        if (!UpdateVisibleRainSprites())\n        {\n            gWeatherPtr->weatherGfxLoaded = TRUE;\n            gWeatherPtr->initStep++;\n        }\n        break;\n    }\n}\n\nbool8 Rain_Finish(void)\n{\n    switch (gWeatherPtr->finishStep)\n    {\n    case 0:\n        if (gWeatherPtr->nextWeather == WEATHER_RAIN\n         || gWeatherPtr->nextWeather == WEATHER_RAIN_THUNDERSTORM\n         || gWeatherPtr->nextWeather == WEATHER_DOWNPOUR)\n        {\n            gWeatherPtr->finishStep = 0xFF;\n            return FALSE;\n        }\n        else\n        {\n            gWeatherPtr->targetRainSpriteCount = 0;\n            gWeatherPtr->finishStep++;\n        }\n        // fall through\n    case 1:\n        if (!UpdateVisibleRainSprites())\n        {\n            DestroyRainSprites();\n            gWeatherPtr->finishStep++;\n            return FALSE;\n        }\n        return TRUE;\n    }\n    return FALSE;\n}\n\n#define tCounter data[0]\n#define tRandom  data[1]\n#define tPosX    data[2]\n#define tPosY    data[3]\n#define tState   data[4]\n#define tActive  data[5]\n#define tWaiting data[6]\n\nstatic void StartRainSpriteFall(struct Sprite *sprite)\n{\n    u32 rand;\n    u16 numFallingFrames;\n    int tileX;\n    int tileY;\n\n    if (sprite->tRandom == 0)\n        sprite->tRandom = 361;\n\n    rand = ISO_RANDOMIZE2(sprite->tRandom);\n    sprite->tRandom = ((rand & 0x7FFF0000) >> 16) % 600;\n\n    numFallingFrames = sRainSpriteFallingDurations[gWeatherPtr->isDownpour][0];\n\n    tileX = sprite->tRandom % 30;\n    sprite->tPosX = tileX * 8; // Useless assignment, leftover from before fixed-point values were used\n\n    tileY = sprite->tRandom / 30;\n    sprite->tPosY = tileY * 8; // Useless assignment, leftover from before fixed-point values were used\n\n    sprite->tPosX = tileX;\n    sprite->tPosX <<= 7; // This is tileX * 8, using a fixed-point value with 4 decimal places\n\n    sprite->tPosY = tileY;\n    sprite->tPosY <<= 7; // This is tileX * 8, using a fixed-point value with 4 decimal places\n\n    // \"Rewind\" the rain sprites, from their ending position.\n    sprite->tPosX -= sRainSpriteMovement[gWeatherPtr->isDownpour][0] * numFallingFrames;\n    sprite->tPosY -= sRainSpriteMovement[gWeatherPtr->isDownpour][1] * numFallingFrames;\n\n    StartSpriteAnim(sprite, 0);\n    sprite->tState = 0;\n    sprite->coordOffsetEnabled = FALSE;\n    sprite->tCounter = numFallingFrames;\n}\n\nstatic void UpdateRainSprite(struct Sprite *sprite)\n{\n    if (sprite->tState == 0)\n    {\n        // Raindrop is in its \"falling\" motion.\n        sprite->tPosX += sRainSpriteMovement[gWeatherPtr->isDownpour][0];\n        sprite->tPosY += sRainSpriteMovement[gWeatherPtr->isDownpour][1];\n        sprite->x = sprite->tPosX >> 4;\n        sprite->y = sprite->tPosY >> 4;\n\n        if (sprite->tActive\n            && (sprite->x >= -8 && sprite->x <= DISPLAY_WIDTH + 8)\n            && sprite->y >= -16 && sprite->y <= DISPLAY_HEIGHT + 16)\n            sprite->invisible = FALSE;\n        else\n            sprite->invisible = TRUE;\n\n        if (--sprite->tCounter == 0)\n        {\n            // Make raindrop splash on the ground\n            StartSpriteAnim(sprite, gWeatherPtr->isDownpour + 1);\n            sprite->tState = 1;\n            sprite->x -= gSpriteCoordOffsetX;\n            sprite->y -= gSpriteCoordOffsetY;\n            sprite->coordOffsetEnabled = TRUE;\n        }\n    }\n    else if (sprite->animEnded)\n    {\n        // The splashing animation ended.\n        sprite->invisible = TRUE;\n        StartRainSpriteFall(sprite);\n    }\n}\n\nstatic void WaitRainSprite(struct Sprite *sprite)\n{\n    if (sprite->tCounter == 0)\n    {\n        StartRainSpriteFall(sprite);\n        sprite->callback = UpdateRainSprite;\n    }\n    else\n    {\n        sprite->tCounter--;\n    }\n}\n\nstatic void InitRainSpriteMovement(struct Sprite *sprite, u16 val)\n{\n    u16 numFallingFrames = sRainSpriteFallingDurations[gWeatherPtr->isDownpour][0];\n    u16 numAdvanceRng = val / (sRainSpriteFallingDurations[gWeatherPtr->isDownpour][1] + numFallingFrames);\n    u16 frameVal = val % (sRainSpriteFallingDurations[gWeatherPtr->isDownpour][1] + numFallingFrames);\n\n    while (--numAdvanceRng != 0xFFFF)\n        StartRainSpriteFall(sprite);\n\n    if (frameVal < numFallingFrames)\n    {\n        while (--frameVal != 0xFFFF)\n            UpdateRainSprite(sprite);\n\n        sprite->tWaiting = FALSE;\n    }\n    else\n    {\n        sprite->tCounter = frameVal - numFallingFrames;\n        sprite->invisible = TRUE;\n        sprite->tWaiting = TRUE;\n    }\n}\n\nstatic void LoadRainSpriteSheet(void)\n{\n    LoadSpriteSheet(&sRainSpriteSheet);\n}\n\nstatic bool8 CreateRainSprite(void)\n{\n    u8 spriteIndex;\n    u8 spriteId;\n\n    if (gWeatherPtr->rainSpriteCount == MAX_RAIN_SPRITES)\n        return FALSE;\n\n    spriteIndex = gWeatherPtr->rainSpriteCount;\n    spriteId = CreateSpriteAtEnd(&sRainSpriteTemplate,\n                                 sRainSpriteCoords[spriteIndex].x, sRainSpriteCoords[spriteIndex].y, 78);\n\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].tActive = FALSE;\n        gSprites[spriteId].tRandom = spriteIndex * 145;\n        while (gSprites[spriteId].tRandom >= 600)\n            gSprites[spriteId].tRandom -= 600;\n\n        StartRainSpriteFall(&gSprites[spriteId]);\n        InitRainSpriteMovement(&gSprites[spriteId], spriteIndex * 9);\n        gSprites[spriteId].invisible = TRUE;\n        gWeatherPtr->sprites.s1.rainSprites[spriteIndex] = &gSprites[spriteId];\n    }\n    else\n    {\n        gWeatherPtr->sprites.s1.rainSprites[spriteIndex] = NULL;\n    }\n\n    if (++gWeatherPtr->rainSpriteCount == MAX_RAIN_SPRITES)\n    {\n        u32 i;\n        for (i = 0; i < MAX_RAIN_SPRITES; i++)\n        {\n            if (gWeatherPtr->sprites.s1.rainSprites[i])\n            {\n                if (!gWeatherPtr->sprites.s1.rainSprites[i]->tWaiting)\n                    gWeatherPtr->sprites.s1.rainSprites[i]->callback = UpdateRainSprite;\n                else\n                    gWeatherPtr->sprites.s1.rainSprites[i]->callback = WaitRainSprite;\n            }\n        }\n\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 UpdateVisibleRainSprites(void)\n{\n    if (gWeatherPtr->curRainSpriteIndex == gWeatherPtr->targetRainSpriteCount)\n        return FALSE;\n\n    if (++gWeatherPtr->rainSpriteVisibleCounter > gWeatherPtr->rainSpriteVisibleDelay)\n    {\n        gWeatherPtr->rainSpriteVisibleCounter = 0;\n        if (gWeatherPtr->curRainSpriteIndex < gWeatherPtr->targetRainSpriteCount)\n        {\n            gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex++]->tActive = 1;\n        }\n        else\n        {\n            gWeatherPtr->curRainSpriteIndex--;\n            gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex]->tActive = 0;\n            gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex]->invisible = TRUE;\n        }\n    }\n    return TRUE;\n}\n\nstatic void DestroyRainSprites(void)\n{\n    u32 i;\n\n    for (i = 0; i < gWeatherPtr->rainSpriteCount; i++)\n    {\n        if (gWeatherPtr->sprites.s1.rainSprites[i] != NULL)\n            DestroySprite(gWeatherPtr->sprites.s1.rainSprites[i]);\n    }\n    gWeatherPtr->rainSpriteCount = 0;\n    FreeSpriteTilesByTag(GFXTAG_RAIN);\n}\n\n#undef tCounter\n#undef tRandom\n#undef tPosX\n#undef tPosY\n#undef tState\n#undef tActive\n#undef tWaiting\n\n//------------------------------------------------------------------------------\n// Snow\n//------------------------------------------------------------------------------\n\nstatic void UpdateSnowflakeSprite(struct Sprite *);\nstatic bool8 UpdateVisibleSnowflakeSprites(void);\nstatic bool8 CreateSnowflakeSprite(void);\nstatic bool8 DestroySnowflakeSprite(void);\nstatic void InitSnowflakeSpriteMovement(struct Sprite *);\n\nvoid Snow_InitVars(void)\n{\n    gWeatherPtr->initStep = 0;\n    gWeatherPtr->weatherGfxLoaded = FALSE;\n    gWeatherPtr->gammaTargetIndex = 3;\n    gWeatherPtr->gammaStepDelay = 20;\n    gWeatherPtr->targetSnowflakeSpriteCount = 40;\n    gWeatherPtr->snowflakeVisibleCounter = 0;\n}\n\nvoid Snow_InitAll(void)\n{\n    u32 i;\n\n    Snow_InitVars();\n    while (!gWeatherPtr->weatherGfxLoaded)\n    {\n        Snow_Main();\n        for (i = 0; i < gWeatherPtr->snowflakeSpriteCount; i++)\n            UpdateSnowflakeSprite(gWeatherPtr->sprites.s1.snowflakeSprites[i]);\n    }\n}\n\nvoid Snow_Main(void)\n{\n    if (gWeatherPtr->initStep == 0 && !UpdateVisibleSnowflakeSprites())\n    {\n        gWeatherPtr->weatherGfxLoaded = TRUE;\n        gWeatherPtr->initStep++;\n    }\n}\n\nbool8 Snow_Finish(void)\n{\n    switch (gWeatherPtr->finishStep)\n    {\n    case 0:\n        gWeatherPtr->targetSnowflakeSpriteCount = 0;\n        gWeatherPtr->snowflakeVisibleCounter = 0;\n        gWeatherPtr->finishStep++;\n        // fall through\n    case 1:\n        if (!UpdateVisibleSnowflakeSprites())\n        {\n            gWeatherPtr->finishStep++;\n            return FALSE;\n        }\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 UpdateVisibleSnowflakeSprites(void)\n{\n    if (gWeatherPtr->snowflakeSpriteCount == gWeatherPtr->targetSnowflakeSpriteCount)\n        return FALSE;\n\n    if (++gWeatherPtr->snowflakeVisibleCounter > 36)\n    {\n        gWeatherPtr->snowflakeVisibleCounter = 0;\n        if (gWeatherPtr->snowflakeSpriteCount < gWeatherPtr->targetSnowflakeSpriteCount)\n            CreateSnowflakeSprite();\n        else\n            DestroySnowflakeSprite();\n    }\n\n    return gWeatherPtr->snowflakeSpriteCount != gWeatherPtr->targetSnowflakeSpriteCount;\n}\n\nstatic const struct OamData sSnowflakeSpriteOamData = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const struct SpriteFrameImage sSnowflakeSpriteImages[] = {\n    {gWeatherSnow1Tiles, 0x20},\n    {gWeatherSnow2Tiles, 0x20},\n};\n\nstatic const union AnimCmd sSnowflakeAnimCmd0[] = {\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSnowflakeAnimCmd1[] = {\n    ANIMCMD_FRAME(1, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSnowflakeAnimCmds[] = {\n    sSnowflakeAnimCmd0,\n    sSnowflakeAnimCmd1,\n};\n\nstatic const struct SpriteTemplate sSnowflakeSpriteTemplate = {\n    .tileTag = TAG_NONE,\n    .paletteTag = PALTAG_WEATHER,\n    .oam = &sSnowflakeSpriteOamData,\n    .anims = sSnowflakeAnimCmds,\n    .images = sSnowflakeSpriteImages,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateSnowflakeSprite,\n};\n\n#define tPosY         data[0]\n#define tDeltaY       data[1]\n#define tWaveDelta    data[2]\n#define tWaveIndex    data[3]\n#define tSnowflakeId  data[4]\n#define tFallCounter  data[5]\n#define tFallDuration data[6]\n#define tDeltaY2      data[7]\n\nstatic bool8 CreateSnowflakeSprite(void)\n{\n    u8 spriteId = CreateSpriteAtEnd(&sSnowflakeSpriteTemplate, 0, 0, 78);\n    if (spriteId == MAX_SPRITES)\n        return FALSE;\n\n    gSprites[spriteId].tSnowflakeId = gWeatherPtr->snowflakeSpriteCount;\n    InitSnowflakeSpriteMovement(&gSprites[spriteId]);\n    gSprites[spriteId].coordOffsetEnabled = TRUE;\n    gWeatherPtr->sprites.s1.snowflakeSprites[gWeatherPtr->snowflakeSpriteCount++] = &gSprites[spriteId];\n    return TRUE;\n}\n\nstatic bool8 DestroySnowflakeSprite(void)\n{\n    if (gWeatherPtr->snowflakeSpriteCount)\n    {\n        DestroySprite(gWeatherPtr->sprites.s1.snowflakeSprites[--gWeatherPtr->snowflakeSpriteCount]);\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic void InitSnowflakeSpriteMovement(struct Sprite *sprite)\n{\n    u16 rand;\n    u16 x = ((sprite->tSnowflakeId * 5) & 7) * 30 + (Random() % 30);\n\n    sprite->y = -3 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);\n    sprite->x = x - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);\n    sprite->tPosY = sprite->y * 128;\n    sprite->x2 = 0;\n    rand = Random();\n    sprite->tDeltaY = (rand & 3) * 5 + 64;\n    sprite->tDeltaY2 = sprite->tDeltaY;\n    StartSpriteAnim(sprite, (rand & 1) ? 0 : 1);\n    sprite->tWaveIndex = 0;\n    sprite->tWaveDelta = ((rand & 3) == 0) ? 2 : 1;\n    sprite->tFallDuration = (rand & 0x1F) + 220;\n    sprite->tFallCounter = 0;\n}\n\nstatic void WaitSnowflakeSprite(struct Sprite *sprite)\n{\n    if (++gWeatherPtr->snowflakeTimer > 18)\n    {\n        sprite->invisible = FALSE;\n        sprite->callback = UpdateSnowflakeSprite;\n        sprite->y = 250 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);\n        sprite->tPosY = sprite->y * 128;\n        gWeatherPtr->snowflakeTimer = 0;\n    }\n}\n\nstatic void UpdateSnowflakeSprite(struct Sprite *sprite)\n{\n    s16 x;\n    s16 y;\n\n    sprite->tPosY += sprite->tDeltaY;\n    sprite->y = sprite->tPosY >> 7;\n    sprite->tWaveIndex += sprite->tWaveDelta;\n    sprite->tWaveIndex &= 0xFF;\n    sprite->x2 = gSineTable[sprite->tWaveIndex] / 64;\n\n    x = (sprite->x + sprite->centerToCornerVecX + gSpriteCoordOffsetX) & 0x1FF;\n    if (x & 0x100)\n        x |= -0x100;\n\n    if (x < -3)\n        sprite->x = 242 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);\n    else if (x > 242)\n        sprite->x = -3 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);\n}\n\n#undef tPosY\n#undef tDeltaY\n#undef tWaveDelta\n#undef tWaveIndex\n#undef tSnowflakeId\n#undef tFallCounter\n#undef tFallDuration\n#undef tDeltaY2\n\n//------------------------------------------------------------------------------\n// WEATHER_RAIN_THUNDERSTORM\n//------------------------------------------------------------------------------\n\nenum {\n    // This block of states is run only once\n    // when first setting up the thunderstorm\n    TSTORM_STATE_LOAD_RAIN,\n    TSTORM_STATE_CREATE_RAIN,\n    TSTORM_STATE_INIT_RAIN,\n    TSTORM_STATE_WAIT_CHANGE,\n\n    // The thunderstorm loops through these states,\n    // not necessarily in order.\n    TSTORM_STATE_LOOP_START,\n    TSTORM_STATE_LOOP_WAIT,\n    TSTORM_STATE_INIT_THUNDER_SHORT_1,\n    TSTORM_STATE_INIT_THUNDER_SHORT_2,\n    TSTORM_STATE_TRY_THUNDER_SHORT,\n    TSTORM_STATE_TRY_NEW_THUNDER,\n    TSTORM_STATE_WAIT_THUNDER_SHORT,\n    TSTORM_STATE_INIT_THUNDER_LONG,\n    TSTORM_STATE_WAIT_THUNDER_LONG,\n    TSTORM_STATE_FADE_THUNDER_LONG,\n    TSTORM_STATE_END_THUNDER_LONG,\n};\n\nvoid Thunderstorm_InitVars(void)\n{\n    gWeatherPtr->initStep = TSTORM_STATE_LOAD_RAIN;\n    gWeatherPtr->weatherGfxLoaded = FALSE;\n    gWeatherPtr->rainSpriteVisibleCounter = 0;\n    gWeatherPtr->rainSpriteVisibleDelay = 4;\n    gWeatherPtr->isDownpour = FALSE;\n    gWeatherPtr->targetRainSpriteCount = 16;\n    gWeatherPtr->gammaTargetIndex = 3;\n    gWeatherPtr->gammaStepDelay = 20;\n    gWeatherPtr->weatherGfxLoaded = FALSE;  // duplicate assignment\n    gWeatherPtr->thunderTriggered = FALSE;\n    SetRainStrengthFromSoundEffect(SE_THUNDERSTORM);\n}\n\nvoid Thunderstorm_InitAll(void)\n{\n    Thunderstorm_InitVars();\n    while (!gWeatherPtr->weatherGfxLoaded)\n        Thunderstorm_Main();\n}\n\n//------------------------------------------------------------------------------\n// WEATHER_DOWNPOUR\n//------------------------------------------------------------------------------\n\nstatic void UpdateThunderSound(void);\nstatic void SetThunderCounter(u16);\n\nvoid Downpour_InitVars(void)\n{\n    gWeatherPtr->initStep = TSTORM_STATE_LOAD_RAIN;\n    gWeatherPtr->weatherGfxLoaded = FALSE;\n    gWeatherPtr->rainSpriteVisibleCounter = 0;\n    gWeatherPtr->rainSpriteVisibleDelay = 4;\n    gWeatherPtr->isDownpour = TRUE;\n    gWeatherPtr->targetRainSpriteCount = 24;\n    gWeatherPtr->gammaTargetIndex = 3;\n    gWeatherPtr->gammaStepDelay = 20;\n    gWeatherPtr->weatherGfxLoaded = FALSE;  // duplicate assignment\n    SetRainStrengthFromSoundEffect(SE_DOWNPOUR);\n}\n\nvoid Downpour_InitAll(void)\n{\n    Downpour_InitVars();\n    while (!gWeatherPtr->weatherGfxLoaded)\n        Thunderstorm_Main();\n}\n\nvoid Thunderstorm_Main(void)\n{\n    UpdateThunderSound();\n    switch (gWeatherPtr->initStep)\n    {\n    case TSTORM_STATE_LOAD_RAIN:\n        LoadRainSpriteSheet();\n        gWeatherPtr->initStep++;\n        break;\n    case TSTORM_STATE_CREATE_RAIN:\n        if (!CreateRainSprite())\n            gWeatherPtr->initStep++;\n        break;\n    case TSTORM_STATE_INIT_RAIN:\n        if (!UpdateVisibleRainSprites())\n        {\n            gWeatherPtr->weatherGfxLoaded = TRUE;\n            gWeatherPtr->initStep++;\n        }\n        break;\n    case TSTORM_STATE_WAIT_CHANGE:\n        if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER)\n            gWeatherPtr->initStep = TSTORM_STATE_INIT_THUNDER_SHORT_1;\n        break;\n    case TSTORM_STATE_LOOP_START:\n        gWeatherPtr->thunderAllowEnd = TRUE;\n        gWeatherPtr->thunderDelay = (Random() % 360) + 360;\n        gWeatherPtr->initStep++;\n        // fall through\n    case TSTORM_STATE_LOOP_WAIT:\n        // Wait between 360-720 frames before trying thunder again\n        if (--gWeatherPtr->thunderDelay == 0)\n            gWeatherPtr->initStep++;\n        break;\n    case TSTORM_STATE_INIT_THUNDER_SHORT_1:\n        gWeatherPtr->thunderAllowEnd = TRUE;\n        gWeatherPtr->thunderSkipShort = Random() % 2;\n        gWeatherPtr->initStep++;\n        break;\n    case TSTORM_STATE_INIT_THUNDER_SHORT_2:\n        gWeatherPtr->thunderShortRetries = (Random() & 1) + 1;\n        gWeatherPtr->initStep++;\n        // fall through\n    case TSTORM_STATE_TRY_THUNDER_SHORT:\n        WeatherShiftGammaIfPalStateIdle(19);\n        if (!gWeatherPtr->thunderSkipShort && gWeatherPtr->thunderShortRetries == 1)\n            SetThunderCounter(20); // Do short thunder\n\n        gWeatherPtr->thunderDelay = (Random() % 3) + 6;\n        gWeatherPtr->initStep++;\n        break;\n    case TSTORM_STATE_TRY_NEW_THUNDER:\n        if (--gWeatherPtr->thunderDelay == 0)\n        {\n            WeatherShiftGammaIfPalStateIdle(3);\n            gWeatherPtr->thunderAllowEnd = TRUE;\n            if (--gWeatherPtr->thunderShortRetries != 0)\n            {\n                // Try a short thunder again\n                gWeatherPtr->thunderDelay = (Random() % 16) + 60;\n                gWeatherPtr->initStep = TSTORM_STATE_WAIT_THUNDER_SHORT;\n            }\n            else if (!gWeatherPtr->thunderSkipShort)\n            {\n                // No more thunder, restart loop\n                gWeatherPtr->initStep = TSTORM_STATE_LOOP_START;\n            }\n            else\n            {\n                // Set up long thunder\n                gWeatherPtr->initStep = TSTORM_STATE_INIT_THUNDER_LONG;\n            }\n        }\n        break;\n    case TSTORM_STATE_WAIT_THUNDER_SHORT:\n        if (--gWeatherPtr->thunderDelay == 0)\n            gWeatherPtr->initStep = TSTORM_STATE_TRY_THUNDER_SHORT;\n        break;\n    case TSTORM_STATE_INIT_THUNDER_LONG:\n        gWeatherPtr->thunderDelay = (Random() % 16) + 60;\n        gWeatherPtr->initStep++;\n        break;\n    case TSTORM_STATE_WAIT_THUNDER_LONG:\n        if (--gWeatherPtr->thunderDelay == 0)\n        {\n            // Do long thunder\n            SetThunderCounter(100);\n            WeatherShiftGammaIfPalStateIdle(19);\n            gWeatherPtr->thunderDelay = (Random() & 0xF) + 30;\n            gWeatherPtr->initStep++;\n        }\n        break;\n    case TSTORM_STATE_FADE_THUNDER_LONG:\n        if (--gWeatherPtr->thunderDelay == 0)\n        {\n            WeatherBeginGammaFade(19, 3, 5);\n            gWeatherPtr->initStep++;\n        }\n        break;\n    case TSTORM_STATE_END_THUNDER_LONG:\n        if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE)\n        {\n            gWeatherPtr->thunderAllowEnd = TRUE;\n            gWeatherPtr->initStep = TSTORM_STATE_LOOP_START;\n        }\n        break;\n    }\n}\n\nbool8 Thunderstorm_Finish(void)\n{\n    switch (gWeatherPtr->finishStep)\n    {\n    case 0:\n        gWeatherPtr->thunderAllowEnd = FALSE;\n        gWeatherPtr->finishStep++;\n        // fall through\n    case 1:\n        Thunderstorm_Main();\n        if (gWeatherPtr->thunderAllowEnd)\n        {\n            if (gWeatherPtr->nextWeather == WEATHER_RAIN\n             || gWeatherPtr->nextWeather == WEATHER_RAIN_THUNDERSTORM\n             || gWeatherPtr->nextWeather == WEATHER_DOWNPOUR)\n                return FALSE;\n\n            gWeatherPtr->targetRainSpriteCount = 0;\n            gWeatherPtr->finishStep++;\n        }\n        break;\n    case 2:\n        if (!UpdateVisibleRainSprites())\n        {\n            DestroyRainSprites();\n            gWeatherPtr->thunderTriggered = FALSE;\n            gWeatherPtr->finishStep++;\n            return FALSE;\n        }\n        break;\n    default:\n        return FALSE;\n    }\n    return TRUE;\n}\n\nstatic void SetThunderCounter(u16 max)\n{\n    if (!gWeatherPtr->thunderTriggered)\n    {\n        gWeatherPtr->thunderCounter = Random() % max;\n        gWeatherPtr->thunderTriggered = TRUE;\n    }\n}\n\nstatic void UpdateThunderSound(void)\n{\n    if (gWeatherPtr->thunderTriggered == TRUE)\n    {\n        if (gWeatherPtr->thunderCounter == 0)\n        {\n            if (IsSEPlaying())\n                return;\n\n            if (Random() & 1)\n                PlaySE(SE_THUNDER);\n            else\n                PlaySE(SE_THUNDER2);\n\n            gWeatherPtr->thunderTriggered = FALSE;\n        }\n        else\n        {\n            gWeatherPtr->thunderCounter--;\n        }\n    }\n}\n\n//------------------------------------------------------------------------------\n// WEATHER_FOG_HORIZONTAL and WEATHER_UNDERWATER\n//------------------------------------------------------------------------------\n\nstatic const u16 sUnusedData[] = {0, 6, 6, 12, 18, 42, 300, 300};\n\nstatic const struct OamData sOamData_FogH = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sAnim_FogH_0[] = {\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_FogH_1[] = {\n    ANIMCMD_FRAME(32, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_FogH_2[] = {\n    ANIMCMD_FRAME(64, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_FogH_3[] = {\n    ANIMCMD_FRAME(96, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_FogH_4[] = {\n    ANIMCMD_FRAME(128, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_FogH_5[] = {\n    ANIMCMD_FRAME(160, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_FogH[] = {\n    sAnim_FogH_0,\n    sAnim_FogH_1,\n    sAnim_FogH_2,\n    sAnim_FogH_3,\n    sAnim_FogH_4,\n    sAnim_FogH_5,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_FogH[] = {\n    AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_FogH[] = {\n    sAffineAnim_FogH,\n};\n\nstatic void FogHorizontalSpriteCallback(struct Sprite *);\nstatic const struct SpriteTemplate sFogHorizontalSpriteTemplate = {\n    .tileTag = GFXTAG_FOG_H,\n    .paletteTag = PALTAG_WEATHER,\n    .oam = &sOamData_FogH,\n    .anims = sAnims_FogH,\n    .images = NULL,\n    .affineAnims = sAffineAnims_FogH,\n    .callback = FogHorizontalSpriteCallback,\n};\n\nstatic void CreateFogHorizontalSprites(void);\nstatic void DestroyFogHorizontalSprites(void);\n\nvoid FogHorizontal_InitVars(void)\n{\n    gWeatherPtr->initStep = 0;\n    gWeatherPtr->weatherGfxLoaded = FALSE;\n    gWeatherPtr->gammaTargetIndex = 0;\n    gWeatherPtr->gammaStepDelay = 20;\n    if (!gWeatherPtr->fogHSpritesCreated)\n    {\n        gWeatherPtr->fogHScrollCounter = 0;\n        gWeatherPtr->fogHScrollOffset = 0;\n        gWeatherPtr->fogHScrollPosX = 0;\n        Weather_SetBlendCoeffs(0, 16);\n    }\n}\n\nvoid FogHorizontal_InitAll(void)\n{\n    FogHorizontal_InitVars();\n    while (!gWeatherPtr->weatherGfxLoaded)\n        FogHorizontal_Main();\n}\n\nvoid FogHorizontal_Main(void)\n{\n    gWeatherPtr->fogHScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->fogHScrollOffset) & 0xFF;\n    if (++gWeatherPtr->fogHScrollCounter > 3)\n    {\n        gWeatherPtr->fogHScrollCounter = 0;\n        gWeatherPtr->fogHScrollOffset++;\n    }\n    switch (gWeatherPtr->initStep)\n    {\n    case 0:\n        CreateFogHorizontalSprites();\n        if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL)\n            Weather_SetTargetBlendCoeffs(12, 8, 3);\n        else\n            Weather_SetTargetBlendCoeffs(4, 16, 0);\n        gWeatherPtr->initStep++;\n        break;\n    case 1:\n        if (Weather_UpdateBlend())\n        {\n            gWeatherPtr->weatherGfxLoaded = TRUE;\n            gWeatherPtr->initStep++;\n        }\n        break;\n    }\n}\n\nbool8 FogHorizontal_Finish(void)\n{\n    gWeatherPtr->fogHScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->fogHScrollOffset) & 0xFF;\n    if (++gWeatherPtr->fogHScrollCounter > 3)\n    {\n        gWeatherPtr->fogHScrollCounter = 0;\n        gWeatherPtr->fogHScrollOffset++;\n    }\n\n    switch (gWeatherPtr->finishStep)\n    {\n    case 0:\n        Weather_SetTargetBlendCoeffs(0, 16, 3);\n        gWeatherPtr->finishStep++;\n        break;\n    case 1:\n        if (Weather_UpdateBlend())\n            gWeatherPtr->finishStep++;\n        break;\n    case 2:\n        DestroyFogHorizontalSprites();\n        gWeatherPtr->finishStep++;\n        break;\n    default:\n        return FALSE;\n    }\n    return TRUE;\n}\n\n#define tSpriteColumn data[0]\n\nstatic void FogHorizontalSpriteCallback(struct Sprite *sprite)\n{\n    sprite->y2 = (u8)gSpriteCoordOffsetY;\n    sprite->x = gWeatherPtr->fogHScrollPosX + 32 + sprite->tSpriteColumn * 64;\n    if (sprite->x >= DISPLAY_WIDTH + 32)\n    {\n        sprite->x = (DISPLAY_WIDTH * 2) + gWeatherPtr->fogHScrollPosX - (4 - sprite->tSpriteColumn) * 64;\n        sprite->x &= 0x1FF;\n    }\n}\n\nstatic void CreateFogHorizontalSprites(void)\n{\n    u32 i;\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    if (!gWeatherPtr->fogHSpritesCreated)\n    {\n        struct SpriteSheet fogHorizontalSpriteSheet = {\n            .data = gWeatherFogHorizontalTiles,\n            .size = 0x0800,\n            .tag = GFXTAG_FOG_H,\n        };\n        LoadSpriteSheet(&fogHorizontalSpriteSheet);\n        for (i = 0; i < NUM_FOG_HORIZONTAL_SPRITES; i++)\n        {\n            spriteId = CreateSpriteAtEnd(&sFogHorizontalSpriteTemplate, 0, 0, 0xFF);\n            if (spriteId != MAX_SPRITES)\n            {\n                sprite = &gSprites[spriteId];\n                sprite->tSpriteColumn = i % 5;\n                sprite->x = (i % 5) * 64 + 32;\n                sprite->y = (i / 5) * 64 + 32;\n                gWeatherPtr->sprites.s2.fogHSprites[i] = sprite;\n            }\n            else\n            {\n                gWeatherPtr->sprites.s2.fogHSprites[i] = NULL;\n            }\n        }\n\n        gWeatherPtr->fogHSpritesCreated = TRUE;\n    }\n}\n\nstatic void DestroyFogHorizontalSprites(void)\n{\n    u32 i;\n\n    if (gWeatherPtr->fogHSpritesCreated)\n    {\n        for (i = 0; i < NUM_FOG_HORIZONTAL_SPRITES; i++)\n        {\n            if (gWeatherPtr->sprites.s2.fogHSprites[i] != NULL)\n                DestroySprite(gWeatherPtr->sprites.s2.fogHSprites[i]);\n        }\n\n        FreeSpriteTilesByTag(GFXTAG_FOG_H);\n        gWeatherPtr->fogHSpritesCreated = FALSE;\n    }\n}\n\n#undef tSpriteColumn\n\n//------------------------------------------------------------------------------\n// WEATHER_VOLCANIC_ASH\n//------------------------------------------------------------------------------\n\nstatic void LoadAshSpriteSheet(void);\nstatic void CreateAshSprites(void);\nstatic void DestroyAshSprites(void);\nstatic void UpdateAshSprite(struct Sprite *);\n\nvoid Ash_InitVars(void)\n{\n    gWeatherPtr->initStep = 0;\n    gWeatherPtr->weatherGfxLoaded = FALSE;\n    gWeatherPtr->gammaTargetIndex = 0;\n    gWeatherPtr->gammaStepDelay = 20;\n    gWeatherPtr->ashUnused = 20; // Never read\n    if (!gWeatherPtr->ashSpritesCreated)\n    {\n        Weather_SetBlendCoeffs(0, 16);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(64, 63)); // These aren't valid blend coefficients!\n    }\n}\n\nvoid Ash_InitAll(void)\n{\n    Ash_InitVars();\n    while (!gWeatherPtr->weatherGfxLoaded)\n        Ash_Main();\n}\n\nvoid Ash_Main(void)\n{\n    gWeatherPtr->ashBaseSpritesX = gSpriteCoordOffsetX & 0x1FF;\n    while (gWeatherPtr->ashBaseSpritesX >= DISPLAY_WIDTH)\n        gWeatherPtr->ashBaseSpritesX -= DISPLAY_WIDTH;\n\n    switch (gWeatherPtr->initStep)\n    {\n    case 0:\n        LoadAshSpriteSheet();\n        gWeatherPtr->initStep++;\n        break;\n    case 1:\n        if (!gWeatherPtr->ashSpritesCreated)\n            CreateAshSprites();\n\n        Weather_SetTargetBlendCoeffs(16, 0, 1);\n        gWeatherPtr->initStep++;\n        break;\n    case 2:\n        if (Weather_UpdateBlend())\n        {\n            gWeatherPtr->weatherGfxLoaded = TRUE;\n            gWeatherPtr->initStep++;\n        }\n        break;\n    default:\n        Weather_UpdateBlend();\n        break;\n    }\n}\n\nbool8 Ash_Finish(void)\n{\n    switch (gWeatherPtr->finishStep)\n    {\n    case 0:\n        Weather_SetTargetBlendCoeffs(0, 16, 1);\n        gWeatherPtr->finishStep++;\n        break;\n    case 1:\n        if (Weather_UpdateBlend())\n        {\n            DestroyAshSprites();\n            gWeatherPtr->finishStep++;\n        }\n        break;\n    case 2:\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        gWeatherPtr->finishStep++;\n        return FALSE;\n    default:\n        return FALSE;\n    }\n    return TRUE;\n}\n\nstatic const struct SpriteSheet sAshSpriteSheet = {\n    .data = gWeatherAshTiles,\n    .size = 0x1000,\n    .tag = GFXTAG_ASH,\n};\n\nstatic void LoadAshSpriteSheet(void)\n{\n    LoadSpriteSheet(&sAshSpriteSheet);\n}\n\nstatic const struct OamData sAshSpriteOamData = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 15,\n};\n\nstatic const union AnimCmd sAshSpriteAnimCmd0[] = {\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(64, 60),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd *const sAshSpriteAnimCmds[] = {\n    sAshSpriteAnimCmd0,\n};\n\nstatic const struct SpriteTemplate sAshSpriteTemplate = {\n    .tileTag = GFXTAG_ASH,\n    .paletteTag = PALTAG_WEATHER,\n    .oam = &sAshSpriteOamData,\n    .anims = sAshSpriteAnimCmds,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateAshSprite,\n};\n\n#define tOffsetY      data[0]\n#define tCounterY     data[1]\n#define tSpriteColumn data[2]\n#define tSpriteRow    data[3]\n\nstatic void CreateAshSprites(void)\n{\n    u32 i;\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    if (!gWeatherPtr->ashSpritesCreated)\n    {\n        for (i = 0; i < NUM_ASH_SPRITES; i++)\n        {\n            spriteId = CreateSpriteAtEnd(&sAshSpriteTemplate, 0, 0, 0x4E);\n            if (spriteId != MAX_SPRITES)\n            {\n                sprite = &gSprites[spriteId];\n                sprite->tCounterY = 0;\n                sprite->tSpriteColumn = (u8)(i % 5);\n                sprite->tSpriteRow = (u8)(i / 5);\n                sprite->tOffsetY = sprite->tSpriteRow * 64 + 32;\n                gWeatherPtr->sprites.s2.ashSprites[i] = sprite;\n            }\n            else\n            {\n                gWeatherPtr->sprites.s2.ashSprites[i] = NULL;\n            }\n        }\n\n        gWeatherPtr->ashSpritesCreated = TRUE;\n    }\n}\n\nstatic void DestroyAshSprites(void)\n{\n    u32 i;\n\n    if (gWeatherPtr->ashSpritesCreated)\n    {\n        for (i = 0; i < NUM_ASH_SPRITES; i++)\n        {\n            if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL)\n                DestroySprite(gWeatherPtr->sprites.s2.ashSprites[i]);\n        }\n\n        FreeSpriteTilesByTag(GFXTAG_ASH);\n        gWeatherPtr->ashSpritesCreated = FALSE;\n    }\n}\n\nstatic void UpdateAshSprite(struct Sprite *sprite)\n{\n    if (++sprite->tCounterY > 5)\n    {\n        sprite->tCounterY = 0;\n        sprite->tOffsetY++;\n    }\n\n    sprite->y = gSpriteCoordOffsetY + sprite->tOffsetY;\n    sprite->x = gWeatherPtr->ashBaseSpritesX + 32 + sprite->tSpriteColumn * 64;\n    if (sprite->x >= DISPLAY_WIDTH + 32)\n    {\n        sprite->x = gWeatherPtr->ashBaseSpritesX + (DISPLAY_WIDTH * 2) - (4 - sprite->tSpriteColumn) * 64;\n        sprite->x &= 0x1FF;\n    }\n}\n\n#undef tOffsetY\n#undef tCounterY\n#undef tSpriteColumn\n#undef tSpriteRow\n\n//------------------------------------------------------------------------------\n// WEATHER_FOG_DIAGONAL\n//------------------------------------------------------------------------------\n\nstatic void UpdateFogDiagonalMovement(void);\nstatic void CreateFogDiagonalSprites(void);\nstatic void DestroyFogDiagonalSprites(void);\nstatic void UpdateFogDiagonalSprite(struct Sprite *);\n\nvoid FogDiagonal_InitVars(void)\n{\n    gWeatherPtr->initStep = 0;\n    gWeatherPtr->weatherGfxLoaded = 0;\n    gWeatherPtr->gammaTargetIndex = 0;\n    gWeatherPtr->gammaStepDelay = 20;\n    gWeatherPtr->fogHScrollCounter = 0;\n    gWeatherPtr->fogHScrollOffset = 1;\n    if (!gWeatherPtr->fogDSpritesCreated)\n    {\n        gWeatherPtr->fogDScrollXCounter = 0;\n        gWeatherPtr->fogDScrollYCounter = 0;\n        gWeatherPtr->fogDXOffset = 0;\n        gWeatherPtr->fogDYOffset = 0;\n        gWeatherPtr->fogDBaseSpritesX = 0;\n        gWeatherPtr->fogDPosY = 0;\n        Weather_SetBlendCoeffs(0, 16);\n    }\n}\n\nvoid FogDiagonal_InitAll(void)\n{\n    FogDiagonal_InitVars();\n    while (!gWeatherPtr->weatherGfxLoaded)\n        FogDiagonal_Main();\n}\n\nvoid FogDiagonal_Main(void)\n{\n    UpdateFogDiagonalMovement();\n    switch (gWeatherPtr->initStep)\n    {\n    case 0:\n        CreateFogDiagonalSprites();\n        gWeatherPtr->initStep++;\n        break;\n    case 1:\n        Weather_SetTargetBlendCoeffs(12, 8, 8);\n        gWeatherPtr->initStep++;\n        break;\n    case 2:\n        if (!Weather_UpdateBlend())\n            break;\n        gWeatherPtr->weatherGfxLoaded = TRUE;\n        gWeatherPtr->initStep++;\n        break;\n    }\n}\n\nbool8 FogDiagonal_Finish(void)\n{\n    UpdateFogDiagonalMovement();\n    switch (gWeatherPtr->finishStep)\n    {\n    case 0:\n        Weather_SetTargetBlendCoeffs(0, 16, 1);\n        gWeatherPtr->finishStep++;\n        break;\n    case 1:\n        if (!Weather_UpdateBlend())\n            break;\n        gWeatherPtr->finishStep++;\n        break;\n    case 2:\n        DestroyFogDiagonalSprites();\n        gWeatherPtr->finishStep++;\n        break;\n    default:\n        return FALSE;\n    }\n    return TRUE;\n}\n\nstatic void UpdateFogDiagonalMovement(void)\n{\n    if (++gWeatherPtr->fogDScrollXCounter > 2)\n    {\n        gWeatherPtr->fogDXOffset++;\n        gWeatherPtr->fogDScrollXCounter = 0;\n    }\n\n    if (++gWeatherPtr->fogDScrollYCounter > 4)\n    {\n        gWeatherPtr->fogDYOffset++;\n        gWeatherPtr->fogDScrollYCounter = 0;\n    }\n\n    gWeatherPtr->fogDBaseSpritesX = (gSpriteCoordOffsetX - gWeatherPtr->fogDXOffset) & 0xFF;\n    gWeatherPtr->fogDPosY = gSpriteCoordOffsetY + gWeatherPtr->fogDYOffset;\n}\n\nstatic const struct SpriteSheet gFogDiagonalSpriteSheet = {\n    .data = gWeatherFogDiagonalTiles,\n    .size = 0x0800,\n    .tag = GFXTAG_FOG_D,\n};\n\nstatic const struct OamData sFogDiagonalSpriteOamData = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n};\n\nstatic const union AnimCmd sFogDiagonalSpriteAnimCmd0[] = {\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sFogDiagonalSpriteAnimCmds[] = {\n    sFogDiagonalSpriteAnimCmd0,\n};\n\nstatic const struct SpriteTemplate sFogDiagonalSpriteTemplate = {\n    .tileTag = GFXTAG_FOG_D,\n    .paletteTag = PALTAG_WEATHER,\n    .oam = &sFogDiagonalSpriteOamData,\n    .anims = sFogDiagonalSpriteAnimCmds,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateFogDiagonalSprite,\n};\n\n#define tSpriteColumn data[0]\n#define tSpriteRow    data[1]\n\nstatic void CreateFogDiagonalSprites(void)\n{\n    u32 i;\n    struct SpriteSheet fogDiagonalSpriteSheet;\n    u8 spriteId;\n    struct Sprite *sprite;\n\n    if (!gWeatherPtr->fogDSpritesCreated)\n    {\n        fogDiagonalSpriteSheet = gFogDiagonalSpriteSheet;\n        LoadSpriteSheet(&fogDiagonalSpriteSheet);\n        for (i = 0; i < NUM_FOG_DIAGONAL_SPRITES; i++)\n        {\n            spriteId = CreateSpriteAtEnd(&sFogDiagonalSpriteTemplate, 0, (i / 5) * 64, 0xFF);\n            if (spriteId != MAX_SPRITES)\n            {\n                sprite = &gSprites[spriteId];\n                sprite->tSpriteColumn = i % 5;\n                sprite->tSpriteRow = i / 5;\n                gWeatherPtr->sprites.s2.fogDSprites[i] = sprite;\n            }\n            else\n            {\n                gWeatherPtr->sprites.s2.fogDSprites[i] = NULL;\n            }\n        }\n\n        gWeatherPtr->fogDSpritesCreated = TRUE;\n    }\n}\n\nstatic void DestroyFogDiagonalSprites(void)\n{\n    u32 i;\n\n    if (gWeatherPtr->fogDSpritesCreated)\n    {\n        for (i = 0; i < NUM_FOG_DIAGONAL_SPRITES; i++)\n        {\n            if (gWeatherPtr->sprites.s2.fogDSprites[i])\n                DestroySprite(gWeatherPtr->sprites.s2.fogDSprites[i]);\n        }\n\n        FreeSpriteTilesByTag(GFXTAG_FOG_D);\n        gWeatherPtr->fogDSpritesCreated = FALSE;\n    }\n}\n\nstatic void UpdateFogDiagonalSprite(struct Sprite *sprite)\n{\n    sprite->y2 = gWeatherPtr->fogDPosY;\n    sprite->x = gWeatherPtr->fogDBaseSpritesX + 32 + sprite->tSpriteColumn * 64;\n    if (sprite->x >= DISPLAY_WIDTH + 32)\n    {\n        sprite->x = gWeatherPtr->fogDBaseSpritesX + (DISPLAY_WIDTH * 2) - (4 - sprite->tSpriteColumn) * 64;\n        sprite->x &= 0x1FF;\n    }\n}\n\n#undef tSpriteColumn\n#undef tSpriteRow\n\n//------------------------------------------------------------------------------\n// WEATHER_SANDSTORM\n//------------------------------------------------------------------------------\n\nstatic void UpdateSandstormWaveIndex(void);\nstatic void UpdateSandstormMovement(void);\nstatic void CreateSandstormSprites(void);\nstatic void CreateSwirlSandstormSprites(void);\nstatic void DestroySandstormSprites(void);\nstatic void UpdateSandstormSprite(struct Sprite *);\nstatic void WaitSandSwirlSpriteEntrance(struct Sprite *);\nstatic void UpdateSandstormSwirlSprite(struct Sprite *);\n\n#define MIN_SANDSTORM_WAVE_INDEX 0x20\n\nvoid Sandstorm_InitVars(void)\n{\n    gWeatherPtr->initStep = 0;\n    gWeatherPtr->weatherGfxLoaded = 0;\n    gWeatherPtr->gammaTargetIndex = 0;\n    gWeatherPtr->gammaStepDelay = 20;\n    if (!gWeatherPtr->sandstormSpritesCreated)\n    {\n        gWeatherPtr->sandstormXOffset = gWeatherPtr->sandstormYOffset = 0;\n        gWeatherPtr->sandstormWaveIndex = 8;\n        gWeatherPtr->sandstormWaveCounter = 0;\n        // Dead code. How does the compiler not optimize this out?\n        if (gWeatherPtr->sandstormWaveIndex >= 0x80 - MIN_SANDSTORM_WAVE_INDEX)\n            gWeatherPtr->sandstormWaveIndex = 0x80 - gWeatherPtr->sandstormWaveIndex;\n\n        Weather_SetBlendCoeffs(0, 16);\n    }\n}\n\nvoid Sandstorm_InitAll(void)\n{\n    Sandstorm_InitVars();\n    while (!gWeatherPtr->weatherGfxLoaded)\n        Sandstorm_Main();\n}\n\nvoid Sandstorm_Main(void)\n{\n    UpdateSandstormMovement();\n    UpdateSandstormWaveIndex();\n    if (gWeatherPtr->sandstormWaveIndex >= 0x80 - MIN_SANDSTORM_WAVE_INDEX)\n        gWeatherPtr->sandstormWaveIndex = MIN_SANDSTORM_WAVE_INDEX;\n\n    switch (gWeatherPtr->initStep)\n    {\n    case 0:\n        CreateSandstormSprites();\n        CreateSwirlSandstormSprites();\n        gWeatherPtr->initStep++;\n        break;\n    case 1:\n        Weather_SetTargetBlendCoeffs(16, 0, 0);\n        gWeatherPtr->initStep++;\n        break;\n    case 2:\n        if (Weather_UpdateBlend())\n        {\n            gWeatherPtr->weatherGfxLoaded = TRUE;\n            gWeatherPtr->initStep++;\n        }\n        break;\n    }\n}\n\nbool8 Sandstorm_Finish(void)\n{\n    UpdateSandstormMovement();\n    UpdateSandstormWaveIndex();\n    switch (gWeatherPtr->finishStep)\n    {\n    case 0:\n        Weather_SetTargetBlendCoeffs(0, 16, 0);\n        gWeatherPtr->finishStep++;\n        break;\n    case 1:\n        if (Weather_UpdateBlend())\n            gWeatherPtr->finishStep++;\n        break;\n    case 2:\n        DestroySandstormSprites();\n        gWeatherPtr->finishStep++;\n        break;\n    default:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic void UpdateSandstormWaveIndex(void)\n{\n    if (gWeatherPtr->sandstormWaveCounter++ > 4)\n    {\n        gWeatherPtr->sandstormWaveIndex++;\n        gWeatherPtr->sandstormWaveCounter = 0;\n    }\n}\n\nstatic void UpdateSandstormMovement(void)\n{\n    gWeatherPtr->sandstormXOffset -= gSineTable[gWeatherPtr->sandstormWaveIndex] * 4;\n    gWeatherPtr->sandstormYOffset -= gSineTable[gWeatherPtr->sandstormWaveIndex];\n    gWeatherPtr->sandstormBaseSpritesX = (gSpriteCoordOffsetX + (gWeatherPtr->sandstormXOffset >> 8)) & 0xFF;\n    gWeatherPtr->sandstormPosY = gSpriteCoordOffsetY + (gWeatherPtr->sandstormYOffset >> 8);\n}\n\nstatic void DestroySandstormSprites(void)\n{\n    u32 i;\n\n    if (gWeatherPtr->sandstormSpritesCreated)\n    {\n        for (i = 0; i < NUM_SANDSTORM_SPRITES; i++)\n        {\n            if (gWeatherPtr->sprites.s2.sandstormSprites1[i])\n                DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites1[i]);\n        }\n\n        gWeatherPtr->sandstormSpritesCreated = FALSE;\n        FreeSpriteTilesByTag(GFXTAG_SANDSTORM);\n    }\n\n    if (gWeatherPtr->sandstormSwirlSpritesCreated)\n    {\n        for (i = 0; i < NUM_SWIRL_SANDSTORM_SPRITES; i++)\n        {\n            if (gWeatherPtr->sprites.s2.sandstormSprites2[i] != NULL)\n                DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites2[i]);\n        }\n\n        gWeatherPtr->sandstormSwirlSpritesCreated = FALSE;\n    }\n}\n\nstatic const struct OamData sSandstormSpriteOamData = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 0,\n};\n\nstatic const union AnimCmd sSandstormSpriteAnimCmd0[] = {\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSandstormSpriteAnimCmd1[] = {\n    ANIMCMD_FRAME(64, 3),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSandstormSpriteAnimCmds[] = {\n    sSandstormSpriteAnimCmd0,\n    sSandstormSpriteAnimCmd1,\n};\n\nstatic const struct SpriteTemplate sSandstormSpriteTemplate = {\n    .tileTag = GFXTAG_SANDSTORM,\n    .paletteTag = PALTAG_WEATHER,\n    .oam = &sSandstormSpriteOamData,\n    .anims = sSandstormSpriteAnimCmds,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateSandstormSprite,\n};\n\nstatic const struct SpriteSheet sSandstormSpriteSheet = {\n    .data = gWeatherSandstormTiles,\n    .size = 0x0a00,\n    .tag = GFXTAG_SANDSTORM,\n};\n\n// Regular sandstorm sprites\n#define tSpriteColumn  data[0]\n#define tSpriteRow     data[1]\n\n// Swirly sandstorm sprites\n#define tRadius        data[0]\n#define tWaveIndex     data[1]\n#define tRadiusCounter data[2]\n#define tEntranceDelay data[3]\n\nstatic void CreateSandstormSprites(void)\n{\n    u32 i;\n    u8 spriteId;\n\n    if (!gWeatherPtr->sandstormSpritesCreated)\n    {\n        LoadSpriteSheet(&sSandstormSpriteSheet);\n        LoadCustomWeatherSpritePalette(gSandstormWeatherPalette);\n        for (i = 0; i < NUM_SANDSTORM_SPRITES; i++)\n        {\n            spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, 0, (i / 5) * 64, 1);\n            if (spriteId != MAX_SPRITES)\n            {\n                gWeatherPtr->sprites.s2.sandstormSprites1[i] = &gSprites[spriteId];\n                gWeatherPtr->sprites.s2.sandstormSprites1[i]->tSpriteColumn = i % 5;\n                gWeatherPtr->sprites.s2.sandstormSprites1[i]->tSpriteRow = i / 5;\n            }\n            else\n            {\n                gWeatherPtr->sprites.s2.sandstormSprites1[i] = NULL;\n            }\n        }\n\n        gWeatherPtr->sandstormSpritesCreated = TRUE;\n    }\n}\n\nstatic const u16 sSwirlEntranceDelays[] = {0, 120, 80, 160, 40, 0};\n\nstatic void CreateSwirlSandstormSprites(void)\n{\n    u32 i;\n    u8 spriteId;\n\n    if (!gWeatherPtr->sandstormSwirlSpritesCreated)\n    {\n        for (i = 0; i < NUM_SWIRL_SANDSTORM_SPRITES; i++)\n        {\n            spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, i * 48 + 24, 208, 1);\n            if (spriteId != MAX_SPRITES)\n            {\n                gWeatherPtr->sprites.s2.sandstormSprites2[i] = &gSprites[spriteId];\n                gWeatherPtr->sprites.s2.sandstormSprites2[i]->oam.size = ST_OAM_SIZE_2;\n                gWeatherPtr->sprites.s2.sandstormSprites2[i]->tSpriteRow = i * 51;\n                gWeatherPtr->sprites.s2.sandstormSprites2[i]->tRadius = 8;\n                gWeatherPtr->sprites.s2.sandstormSprites2[i]->tRadiusCounter = 0;\n                gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[4] = 0x6730; // unused value\n                gWeatherPtr->sprites.s2.sandstormSprites2[i]->tEntranceDelay = sSwirlEntranceDelays[i];\n                StartSpriteAnim(gWeatherPtr->sprites.s2.sandstormSprites2[i], 1);\n                CalcCenterToCornerVec(gWeatherPtr->sprites.s2.sandstormSprites2[i], SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), ST_OAM_AFFINE_OFF);\n                gWeatherPtr->sprites.s2.sandstormSprites2[i]->callback = WaitSandSwirlSpriteEntrance;\n            }\n            else\n            {\n                gWeatherPtr->sprites.s2.sandstormSprites2[i] = NULL;\n            }\n\n            gWeatherPtr->sandstormSwirlSpritesCreated = TRUE;\n        }\n    }\n}\n\nstatic void UpdateSandstormSprite(struct Sprite *sprite)\n{\n    sprite->y2 = gWeatherPtr->sandstormPosY;\n    sprite->x = gWeatherPtr->sandstormBaseSpritesX + 32 + sprite->tSpriteColumn * 64;\n    if (sprite->x >= DISPLAY_WIDTH + 32)\n    {\n        sprite->x = gWeatherPtr->sandstormBaseSpritesX + (DISPLAY_WIDTH * 2) - (4 - sprite->tSpriteColumn) * 64;\n        sprite->x &= 0x1FF;\n    }\n}\n\nstatic void WaitSandSwirlSpriteEntrance(struct Sprite *sprite)\n{\n    if (--sprite->tEntranceDelay == -1)\n        sprite->callback = UpdateSandstormSwirlSprite;\n}\n\nstatic void UpdateSandstormSwirlSprite(struct Sprite *sprite)\n{\n    u32 x, y;\n\n    if (--sprite->y < -48)\n    {\n        sprite->y = DISPLAY_HEIGHT + 48;\n        sprite->tRadius = 4;\n    }\n\n    x = sprite->tRadius * gSineTable[sprite->tWaveIndex];\n    y = sprite->tRadius * gSineTable[sprite->tWaveIndex + 0x40];\n    sprite->x2 = x >> 8;\n    sprite->y2 = y >> 8;\n    sprite->tWaveIndex = (sprite->tWaveIndex + 10) & 0xFF;\n    if (++sprite->tRadiusCounter > 8)\n    {\n        sprite->tRadiusCounter = 0;\n        sprite->tRadius++;\n    }\n}\n\n#undef tSpriteColumn\n#undef tSpriteRow\n\n#undef tRadius\n#undef tWaveIndex\n#undef tRadiusCounter\n#undef tEntranceDelay\n\n//------------------------------------------------------------------------------\n// WEATHER_SHADE\n//------------------------------------------------------------------------------\n\nvoid Shade_InitVars(void)\n{\n    gWeatherPtr->initStep = 0;\n    gWeatherPtr->gammaTargetIndex = 3;\n    gWeatherPtr->gammaStepDelay = 20;\n}\n\nvoid Shade_InitAll(void)\n{\n    Shade_InitVars();\n}\n\nvoid Shade_Main(void)\n{\n}\n\nbool8 Shade_Finish(void)\n{\n    return FALSE;\n}\n\n//------------------------------------------------------------------------------\n// WEATHER_UNDERWATER_BUBBLES\n//------------------------------------------------------------------------------\n\nstatic void CreateBubbleSprite(u16);\nstatic void DestroyBubbleSprites(void);\nstatic void UpdateBubbleSprite(struct Sprite *);\n\nstatic const u8 sBubbleStartDelays[] = {40, 90, 60, 90, 2, 60, 40, 30};\n\nstatic const struct SpriteSheet sWeatherBubbleSpriteSheet = {\n    .data = gWeatherBubbleTiles,\n    .size = 0x0040,\n    .tag = GFXTAG_BUBBLE,\n};\n\nstatic const s16 sBubbleStartCoords[][2] = {\n    {120, 160},\n    {376, 160},\n    { 40, 140},\n    {296, 140},\n    {180, 130},\n    {436, 130},\n    { 60, 160},\n    {436, 160},\n    {220, 180},\n    {476, 180},\n    { 10,  90},\n    {266,  90},\n    {256, 160},\n};\n\nvoid Bubbles_InitVars(void)\n{\n    FogHorizontal_InitVars();\n    if (!gWeatherPtr->bubblesSpritesCreated)\n    {\n        LoadSpriteSheet(&sWeatherBubbleSpriteSheet);\n        gWeatherPtr->bubblesDelayIndex = 0;\n        gWeatherPtr->bubblesDelayCounter = sBubbleStartDelays[0];\n        gWeatherPtr->bubblesCoordsIndex = 0;\n        gWeatherPtr->bubblesSpriteCount = 0;\n    }\n}\n\nvoid Bubbles_InitAll(void)\n{\n    Bubbles_InitVars();\n    while (!gWeatherPtr->weatherGfxLoaded)\n        Bubbles_Main();\n}\n\nvoid Bubbles_Main(void)\n{\n    FogHorizontal_Main();\n    if (++gWeatherPtr->bubblesDelayCounter > sBubbleStartDelays[gWeatherPtr->bubblesDelayIndex])\n    {\n        gWeatherPtr->bubblesDelayCounter = 0;\n        if (++gWeatherPtr->bubblesDelayIndex > NELEMS(sBubbleStartDelays) - 1)\n            gWeatherPtr->bubblesDelayIndex = 0;\n\n        CreateBubbleSprite(gWeatherPtr->bubblesCoordsIndex);\n        if (++gWeatherPtr->bubblesCoordsIndex > NELEMS(sBubbleStartCoords) - 1)\n            gWeatherPtr->bubblesCoordsIndex = 0;\n    }\n}\n\nbool8 Bubbles_Finish(void)\n{\n    if (!FogHorizontal_Finish())\n    {\n        DestroyBubbleSprites();\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic const union AnimCmd sBubbleSpriteAnimCmd0[] = {\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_FRAME(1, 16),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sBubbleSpriteAnimCmds[] = {\n    sBubbleSpriteAnimCmd0,\n};\n\nstatic const struct SpriteTemplate sBubbleSpriteTemplate = {\n    .tileTag = GFXTAG_BUBBLE,\n    .paletteTag = PALTAG_WEATHER,\n    .oam = &gOamData_AffineOff_ObjNormal_8x8,\n    .anims = sBubbleSpriteAnimCmds,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = UpdateBubbleSprite,\n};\n\n#define tScrollXCounter data[0]\n#define tScrollXDir     data[1]\n#define tCounter        data[2]\n\nstatic void CreateBubbleSprite(u16 coordsIndex)\n{\n    s16 x = sBubbleStartCoords[coordsIndex][0];\n    s16 y = sBubbleStartCoords[coordsIndex][1] - gSpriteCoordOffsetY;\n    u8 spriteId = CreateSpriteAtEnd(&sBubbleSpriteTemplate, x, y, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].oam.priority = 1;\n        gSprites[spriteId].coordOffsetEnabled = TRUE;\n        gSprites[spriteId].tScrollXCounter = 0;\n        gSprites[spriteId].tScrollXDir = 0;\n        gSprites[spriteId].tCounter = 0;\n        gWeatherPtr->bubblesSpriteCount++;\n    }\n}\n\nstatic void DestroyBubbleSprites(void)\n{\n    u32 i;\n\n    if (gWeatherPtr->bubblesSpriteCount)\n    {\n        for (i = 0; i < MAX_SPRITES; i++)\n        {\n            if (gSprites[i].template == &sBubbleSpriteTemplate)\n                DestroySprite(&gSprites[i]);\n        }\n\n        FreeSpriteTilesByTag(GFXTAG_BUBBLE);\n        gWeatherPtr->bubblesSpriteCount = 0;\n    }\n}\n\nstatic void UpdateBubbleSprite(struct Sprite *sprite)\n{\n    ++sprite->tScrollXCounter;\n    if (++sprite->tScrollXCounter > 8) // double increment\n    {\n        sprite->tScrollXCounter = 0;\n        if (sprite->tScrollXDir == 0)\n        {\n            if (++sprite->x2 > 4)\n                sprite->tScrollXDir = 1;\n        }\n        else\n        {\n            if (--sprite->x2 <= 0)\n                sprite->tScrollXDir = 0;\n        }\n    }\n\n    sprite->y -= 3;\n    if (++sprite->tCounter >= 120)\n        DestroySprite(sprite);\n}\n\n#undef tScrollXCounter\n#undef tScrollXDir\n#undef tCounter\n"
  },
  {
    "path": "src/field_weather_util.c",
    "content": "#include \"global.h\"\n#include \"event_data.h\"\n#include \"field_weather.h\"\n#include \"overworld.h\"\n#include \"random.h\"\n#include \"constants/weather.h\"\n#include \"constants/layouts.h\"\n#include \"constants/region_map_sections.h\"\n\nstatic u8 TranslateWeatherNum(u8 weather);\nstatic void UpdateRainCounter(u8 newWeather, u8 oldWeather);\n\nvoid SetSavedWeather(u32 weather)\n{\n    u8 oldWeather = gSaveBlock1Ptr->weather;\n    gSaveBlock1Ptr->weather = TranslateWeatherNum(weather);\n    UpdateRainCounter(gSaveBlock1Ptr->weather, oldWeather);\n}\n\nu8 GetSav1Weather(void)\n{\n    return gSaveBlock1Ptr->weather;\n}\n\nvoid SetSavedWeatherFromCurrMapHeader(void)\n{\n    u8 oldWeather = gSaveBlock1Ptr->weather;\n\n    if(gMapHeader.mapLayoutId != LAYOUT_FOUR_ISLAND || gMapHeader.mapLayoutId != LAYOUT_FOUR_ISLAND_BASE_CABLE_CAR_STATION)\n    {\n        gSaveBlock1Ptr->weather = TranslateWeatherNum(gMapHeader.weather);\n        if(gMapHeader.regionMapSectionId != MAPSEC_FOUR_ISLAND && gMapHeader.regionMapSectionId != MAPSEC_ICEFALL_CAVE)\n        {\n            FlagClear(FLAG_FOUR_ISLAND_SNOW);\n        }\n    }\n    if (gMapHeader.mapLayoutId == LAYOUT_FOUR_ISLAND || gMapHeader.mapLayoutId == LAYOUT_FOUR_ISLAND_BASE_CABLE_CAR_STATION)\n    {\n        if(!FlagGet(FLAG_FOUR_ISLAND_SNOW))\n        {\n            u8 rand = Random() % 255;\n            if(rand < 73)\n            {\n                FlagSet(FLAG_FOUR_ISLAND_SNOW);\n                if(gMapHeader.mapLayoutId == LAYOUT_FOUR_ISLAND)\n                    gSaveBlock1Ptr->weather = TranslateWeatherNum(WEATHER_SNOW);\n            }\n        }\n        else\n        {\n            if(gMapHeader.mapLayoutId == LAYOUT_FOUR_ISLAND)\n                gSaveBlock1Ptr->weather = TranslateWeatherNum(WEATHER_SNOW);\n        }\n    }\n    UpdateRainCounter(gSaveBlock1Ptr->weather, oldWeather);\n}\n\nvoid SetWeather(u32 weather)\n{\n    SetSavedWeather(weather);\n    SetNextWeather(GetSav1Weather());\n}\n\nvoid SetWeather_Unused(u32 weather)\n{\n    SetSavedWeather(weather);\n    SetCurrentAndNextWeather(GetSav1Weather());\n}\n\nvoid DoCurrentWeather(void)\n{\n    u8 weather = GetSav1Weather();\n\n    SetNextWeather(weather);\n}\n\nvoid ResumePausedWeather(void)\n{\n    u8 weather = GetSav1Weather();\n\n    SetCurrentAndNextWeather(weather);\n}\n\nstatic const u8 sWeatherCycleRoute119[] = {\n    WEATHER_SUNNY,\n    WEATHER_RAIN,\n    WEATHER_RAIN_THUNDERSTORM,\n    WEATHER_RAIN,\n};\n\nstatic const u8 sWeatherCycleRoute123[] = {\n    WEATHER_SUNNY,\n    WEATHER_SUNNY,\n    WEATHER_RAIN,\n    WEATHER_SUNNY,\n};\n\nstatic u8 TranslateWeatherNum(u8 weather)\n{\n    switch (weather)\n    {\n    case WEATHER_NONE:               return WEATHER_NONE;\n    case WEATHER_SUNNY_CLOUDS:       return WEATHER_SUNNY_CLOUDS;\n    case WEATHER_SUNNY:              return WEATHER_SUNNY;\n    case WEATHER_RAIN:               return WEATHER_RAIN;\n    case WEATHER_SNOW:               return WEATHER_SNOW;\n    case WEATHER_RAIN_THUNDERSTORM:  return WEATHER_RAIN_THUNDERSTORM;\n    case WEATHER_FOG_HORIZONTAL:     return WEATHER_FOG_HORIZONTAL;\n    case WEATHER_VOLCANIC_ASH:       return WEATHER_VOLCANIC_ASH;\n    case WEATHER_SANDSTORM:          return WEATHER_SANDSTORM;\n    case WEATHER_FOG_DIAGONAL:       return WEATHER_FOG_DIAGONAL;\n    case WEATHER_UNDERWATER:         return WEATHER_UNDERWATER;\n    case WEATHER_SHADE:              return WEATHER_SHADE;\n    case WEATHER_DROUGHT:            return WEATHER_DROUGHT;\n    case WEATHER_DOWNPOUR:           return WEATHER_DOWNPOUR;\n    case WEATHER_UNDERWATER_BUBBLES: return WEATHER_UNDERWATER_BUBBLES;\n    case WEATHER_ROUTE119_CYCLE:     return sWeatherCycleRoute119[gSaveBlock1Ptr->weatherCycleStage];\n    case WEATHER_ROUTE123_CYCLE:     return sWeatherCycleRoute123[gSaveBlock1Ptr->weatherCycleStage];\n    default:                         return WEATHER_NONE;\n    }\n}\n\nvoid UpdateWeatherPerDay(u16 increment)\n{\n    u16 weatherStage = gSaveBlock1Ptr->weatherCycleStage + increment;\n    weatherStage %= 4;\n    gSaveBlock1Ptr->weatherCycleStage = weatherStage;\n}\n\nstatic void UpdateRainCounter(u8 newWeather, u8 oldWeather)\n{\n    if (newWeather != oldWeather\n        && (newWeather == WEATHER_RAIN || newWeather == WEATHER_RAIN_THUNDERSTORM))\n        IncrementGameStat(GAME_STAT_GOT_RAINED_ON);\n}\n"
  },
  {
    "path": "src/fieldmap.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"overworld.h\"\n#include \"script.h\"\n#include \"new_menu_helpers.h\"\n#include \"quest_log.h\"\n#include \"fieldmap.h\"\n\nstruct ConnectionFlags\n{\n    u8 south:1;\n    u8 north:1;\n    u8 west:1;\n    u8 east:1;\n};\n\nstruct BackupMapLayout VMap;\nEWRAM_DATA u16 gBackupMapData[VIRTUAL_MAP_SIZE] = {};\nEWRAM_DATA struct MapHeader gMapHeader = {};\nEWRAM_DATA struct Camera gCamera = {};\nstatic EWRAM_DATA struct ConnectionFlags gMapConnectionFlags = {};\nEWRAM_DATA u8 gGlobalFieldTintMode = QL_TINT_NONE;\n\nstatic const struct ConnectionFlags sDummyConnectionFlags = {};\n\nstatic void InitMapLayoutData(struct MapHeader *);\nstatic void InitBackupMapLayoutData(const u16 *, u16, u16);\nstatic void InitBackupMapLayoutConnections(struct MapHeader *);\nstatic void FillSouthConnection(struct MapHeader const *, struct MapHeader const *, s32);\nstatic void FillNorthConnection(struct MapHeader const *, struct MapHeader const *, s32);\nstatic void FillWestConnection(struct MapHeader const *, struct MapHeader const *, s32);\nstatic void FillEastConnection(struct MapHeader const *, struct MapHeader const *, s32);\nstatic void LoadSavedMapView(void);\nstatic const struct MapConnection *GetIncomingConnection(u8, s32, s32);\nstatic bool8 IsPosInIncomingConnectingMap(u8, s32, s32, const struct MapConnection *);\nstatic bool8 IsCoordInIncomingConnectingMap(s32, s32, s32, s32);\nstatic u32 GetAttributeByMetatileIdAndMapLayout(const struct MapLayout *, u16, u8);\n\n#define GetBorderBlockAt(x, y) ({                                                                 \\\n    u16 block;                                                                                    \\\n    s32 xprime;                                                                                   \\\n    s32 yprime;                                                                                   \\\n                                                                                                  \\\n    const struct MapLayout *mapLayout = gMapHeader.mapLayout;                                     \\\n                                                                                                  \\\n    xprime = x - MAP_OFFSET;                                                                      \\\n    xprime += 8 * mapLayout->borderWidth;                                                         \\\n    xprime %= mapLayout->borderWidth;                                                             \\\n                                                                                                  \\\n    yprime = y - MAP_OFFSET;                                                                      \\\n    yprime += 8 * mapLayout->borderHeight;                                                        \\\n    yprime %= mapLayout->borderHeight;                                                            \\\n                                                                                                  \\\n    block = mapLayout->border[xprime + yprime * mapLayout->borderWidth] | MAPGRID_COLLISION_MASK; \\\n})\n\n#define AreCoordsWithinMapGridBounds(x, y) (x >= 0 && x < VMap.Xsize && y >= 0 && y < VMap.Ysize)\n\n#define GetMapGridBlockAt(x, y) (AreCoordsWithinMapGridBounds(x, y) ? VMap.map[x + VMap.Xsize * y] : GetBorderBlockAt(x, y))\n\n// Masks/shifts for metatile attributes\n// This is the format of the data stored in each data/tilesets/*/*/metatile_attributes.bin file\nstatic const u32 sMetatileAttrMasks[METATILE_ATTRIBUTE_COUNT] = {\n    [METATILE_ATTRIBUTE_BEHAVIOR]       = 0x000001ff, // Bits 0-8\n    [METATILE_ATTRIBUTE_TERRAIN]        = 0x00003e00, // Bits 9-13\n    [METATILE_ATTRIBUTE_2]              = 0x0003c000, // Bits 14-17\n    [METATILE_ATTRIBUTE_3]              = 0x00fc0000, // Bits 18-23\n    [METATILE_ATTRIBUTE_ENCOUNTER_TYPE] = 0x07000000, // Bits 24-26\n    [METATILE_ATTRIBUTE_5]              = 0x18000000, // Bits 27-28\n    [METATILE_ATTRIBUTE_LAYER_TYPE]     = 0x60000000, // Bits 29-30\n    [METATILE_ATTRIBUTE_7]              = 0x80000000  // Bit  31\n};\n\nstatic const u8 sMetatileAttrShifts[METATILE_ATTRIBUTE_COUNT] = {\n    [METATILE_ATTRIBUTE_BEHAVIOR]       = 0,\n    [METATILE_ATTRIBUTE_TERRAIN]        = 9,\n    [METATILE_ATTRIBUTE_2]              = 14,\n    [METATILE_ATTRIBUTE_3]              = 18,\n    [METATILE_ATTRIBUTE_ENCOUNTER_TYPE] = 24,\n    [METATILE_ATTRIBUTE_5]              = 27,\n    [METATILE_ATTRIBUTE_LAYER_TYPE]     = 29,\n    [METATILE_ATTRIBUTE_7]              = 31\n};\n\nconst struct MapHeader * GetMapHeaderFromConnection(const struct MapConnection * connection)\n{\n    return Overworld_GetMapHeaderByGroupAndId(connection->mapGroup, connection->mapNum);\n}\n\nvoid InitMap(void)\n{\n    InitMapLayoutData(&gMapHeader);\n    RunOnLoadMapScript();\n}\n\nvoid InitMapFromSavedGame(void)\n{\n    InitMapLayoutData(&gMapHeader);\n    LoadSavedMapView();\n    RunOnLoadMapScript();\n}\n\nstatic void InitMapLayoutData(struct MapHeader * mapHeader)\n{\n    const struct MapLayout * mapLayout = mapHeader->mapLayout;\n    CpuFastFill16(MAPGRID_UNDEFINED, gBackupMapData, sizeof(gBackupMapData));\n    VMap.map = gBackupMapData;\n    VMap.Xsize = mapLayout->width + MAP_OFFSET_W;\n    VMap.Ysize = mapLayout->height + MAP_OFFSET_H;\n    AGB_ASSERT_EX(VMap.Xsize * VMap.Ysize <= VIRTUAL_MAP_SIZE, ABSPATH(\"fieldmap.c\"), 158);\n    InitBackupMapLayoutData(mapLayout->map, mapLayout->width, mapLayout->height);\n    InitBackupMapLayoutConnections(mapHeader);\n}\n\nstatic void InitBackupMapLayoutData(const u16 *map, u16 width, u16 height)\n{\n    s32 y;\n    u16 *dest = VMap.map;\n    dest += VMap.Xsize * 7 + MAP_OFFSET;\n\n    for (y = 0; y < height; y++)\n    {\n        CpuCopy16(map, dest, width * sizeof(u16));\n        dest += width + MAP_OFFSET_W;\n        map += width;\n    }\n}\n\nstatic void InitBackupMapLayoutConnections(struct MapHeader *mapHeader)\n{\n    s32 count;\n    const struct MapConnection *connection;\n    s32 i;\n\n    gMapConnectionFlags = sDummyConnectionFlags;\n\n    /*\n     * This null pointer check is new to FireRed.  It was kept in\n     * Emerald, with the above struct assignment moved to after\n     * this check.\n     */\n    if (mapHeader->connections)\n    {\n        count = mapHeader->connections->count;\n        connection = mapHeader->connections->connections;\n        for (i = 0; i < count; i++, connection++)\n        {\n            struct MapHeader const *cMap = GetMapHeaderFromConnection(connection);\n            u32 offset = connection->offset;\n            switch (connection->direction)\n            {\n            case CONNECTION_SOUTH:\n                FillSouthConnection(mapHeader, cMap, offset);\n                gMapConnectionFlags.south = TRUE;\n                break;\n            case CONNECTION_NORTH:\n                FillNorthConnection(mapHeader, cMap, offset);\n                gMapConnectionFlags.north = TRUE;\n                break;\n            case CONNECTION_WEST:\n                FillWestConnection(mapHeader, cMap, offset);\n                gMapConnectionFlags.west = TRUE;\n                break;\n            case CONNECTION_EAST:\n                FillEastConnection(mapHeader, cMap, offset);\n                gMapConnectionFlags.east = TRUE;\n                break;\n            }\n        }\n    }\n}\n\nstatic void FillConnection(s32 x, s32 y, const struct MapHeader *connectedMapHeader, s32 x2, s32 y2, s32 width, s32 height)\n{\n    s32 i;\n    const u16 *src;\n    u16 *dest;\n    s32 mapWidth;\n\n    mapWidth = connectedMapHeader->mapLayout->width;\n    src = &connectedMapHeader->mapLayout->map[mapWidth * y2 + x2];\n    dest = &VMap.map[VMap.Xsize * y + x];\n\n    for (i = 0; i < height; i++)\n    {\n        CpuCopy16(src, dest, width * 2);\n        dest += VMap.Xsize;\n        src += mapWidth;\n    }\n}\n\nstatic void FillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)\n{\n    s32 x, y;\n    s32 x2;\n    s32 width;\n    s32 cWidth;\n\n    if (connectedMapHeader)\n    {\n        cWidth = connectedMapHeader->mapLayout->width;\n        x = offset + MAP_OFFSET;\n        y = mapHeader->mapLayout->height + MAP_OFFSET;\n        if (x < 0)\n        {\n            x2 = -x;\n            x += cWidth;\n            if (x < VMap.Xsize)\n                width = x;\n            else\n                width = VMap.Xsize;\n            x = 0;\n        }\n        else\n        {\n            x2 = 0;\n            if (x + cWidth < VMap.Xsize)\n                width = cWidth;\n            else\n                width = VMap.Xsize - x;\n        }\n\n        FillConnection(\n            x, y,\n            connectedMapHeader,\n            x2, /*y2*/ 0,\n            width, /*height*/ MAP_OFFSET);\n    }\n}\n\nstatic void FillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)\n{\n    s32 x;\n    s32 x2, y2;\n    s32 width;\n    s32 cWidth, cHeight;\n\n    if (connectedMapHeader)\n    {\n        cWidth = connectedMapHeader->mapLayout->width;\n        cHeight = connectedMapHeader->mapLayout->height;\n        x = offset + MAP_OFFSET;\n        y2 = cHeight - MAP_OFFSET;\n        if (x < 0)\n        {\n            x2 = -x;\n            x += cWidth;\n            if (x < VMap.Xsize)\n                width = x;\n            else\n                width = VMap.Xsize;\n            x = 0;\n        }\n        else\n        {\n            x2 = 0;\n            if (x + cWidth < VMap.Xsize)\n                width = cWidth;\n            else\n                width = VMap.Xsize - x;\n        }\n\n        FillConnection(\n            x, /*y*/ 0,\n            connectedMapHeader,\n            x2, y2,\n            width, /*height*/ MAP_OFFSET);\n\n    }\n}\n\nstatic void FillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)\n{\n    s32 y;\n    s32 x2, y2;\n    s32 height;\n    s32 cWidth, cHeight;\n    if (connectedMapHeader)\n    {\n        cWidth = connectedMapHeader->mapLayout->width;\n        cHeight = connectedMapHeader->mapLayout->height;\n        y = offset + MAP_OFFSET;\n        x2 = cWidth - MAP_OFFSET;\n        if (y < 0)\n        {\n            y2 = -y;\n            if (y + cHeight < VMap.Ysize)\n                height = y + cHeight;\n            else\n                height = VMap.Ysize;\n            y = 0;\n        }\n        else\n        {\n            y2 = 0;\n            if (y + cHeight < VMap.Ysize)\n                height = cHeight;\n            else\n                height = VMap.Ysize - y;\n        }\n\n        FillConnection(\n            /*x*/ 0, y,\n            connectedMapHeader,\n            x2, y2,\n            /*width*/ MAP_OFFSET, height);\n    }\n}\n\nstatic void FillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)\n{\n    s32 x, y;\n    s32 y2;\n    s32 height;\n    s32 cHeight;\n    if (connectedMapHeader)\n    {\n        cHeight = connectedMapHeader->mapLayout->height;\n        x = mapHeader->mapLayout->width + MAP_OFFSET;\n        y = offset + MAP_OFFSET;\n        if (y < 0)\n        {\n            y2 = -y;\n            if (y + cHeight < VMap.Ysize)\n                height = y + cHeight;\n            else\n                height = VMap.Ysize;\n            y = 0;\n        }\n        else\n        {\n            y2 = 0;\n            if (y + cHeight < VMap.Ysize)\n                height = cHeight;\n            else\n                height = VMap.Ysize - y;\n        }\n\n        FillConnection(\n            x, y,\n            connectedMapHeader,\n            /*x2*/ 0, y2,\n            /*width*/ MAP_OFFSET + 1, height);\n    }\n}\n\nu8 MapGridGetElevationAt(s32 x, s32 y)\n{\n    u16 block = GetMapGridBlockAt(x, y);\n\n    if (block == MAPGRID_UNDEFINED)\n        return 0;\n\n    return block >> MAPGRID_ELEVATION_SHIFT;\n}\n\nu8 MapGridGetCollisionAt(s32 x, s32 y)\n{\n    u16 block = GetMapGridBlockAt(x, y);\n\n    if (block == MAPGRID_UNDEFINED)\n        return TRUE;\n\n    return (block & MAPGRID_COLLISION_MASK) >> MAPGRID_COLLISION_SHIFT;\n}\n\nu32 MapGridGetMetatileIdAt(s32 x, s32 y)\n{\n    u16 block = GetMapGridBlockAt(x, y);\n\n    if (block == MAPGRID_UNDEFINED)\n        return GetBorderBlockAt(x, y) & MAPGRID_METATILE_ID_MASK;\n\n    return block & MAPGRID_METATILE_ID_MASK;\n}\n\nu32 ExtractMetatileAttribute(u32 attributes, u8 attributeType)\n{\n    if (attributeType >= METATILE_ATTRIBUTE_COUNT) // Check for METATILE_ATTRIBUTES_ALL\n        return attributes;\n\n    return (attributes & sMetatileAttrMasks[attributeType]) >> sMetatileAttrShifts[attributeType];\n}\n\nu32 MapGridGetMetatileAttributeAt(s16 x, s16 y, u8 attributeType)\n{\n    u16 metatileId = MapGridGetMetatileIdAt(x, y);\n    return GetAttributeByMetatileIdAndMapLayout(gMapHeader.mapLayout, metatileId, attributeType);\n}\n\nu32 MapGridGetMetatileBehaviorAt(s16 x, s16 y)\n{\n    return MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_BEHAVIOR);\n}\n\nu8 MapGridGetMetatileLayerTypeAt(s16 x, s16 y)\n{\n    return MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_LAYER_TYPE);\n}\n\nvoid MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatile)\n{\n    s32 i;\n    if (AreCoordsWithinMapGridBounds(x, y))\n    {\n        i = x + y * VMap.Xsize;\n        VMap.map[i] = (VMap.map[i] & MAPGRID_ELEVATION_MASK) | (metatile & ~MAPGRID_ELEVATION_MASK);\n    }\n}\n\nvoid MapGridSetMetatileEntryAt(s32 x, s32 y, u16 metatile)\n{\n    s32 i;\n    if (AreCoordsWithinMapGridBounds(x, y))\n    {\n        i = x + VMap.Xsize * y;\n        VMap.map[i] = metatile;\n    }\n}\n\nvoid MapGridSetMetatileImpassabilityAt(s32 x, s32 y, bool32 impassable)\n{\n    if (AreCoordsWithinMapGridBounds(x, y))\n    {\n        if (impassable)\n            VMap.map[x + VMap.Xsize * y] |= MAPGRID_COLLISION_MASK;\n        else\n            VMap.map[x + VMap.Xsize * y] &= ~MAPGRID_COLLISION_MASK;\n    }\n}\n\nstatic u32 GetAttributeByMetatileIdAndMapLayout(const struct MapLayout *mapLayout, u16 metatile, u8 attributeType)\n{\n    const u32 * attributes;\n\n    if (metatile < NUM_METATILES_IN_PRIMARY)\n    {\n        attributes = mapLayout->primaryTileset->metatileAttributes;\n        return ExtractMetatileAttribute(attributes[metatile], attributeType);\n    }\n    else if (metatile < NUM_METATILES_TOTAL)\n    {\n        attributes = mapLayout->secondaryTileset->metatileAttributes;\n        return ExtractMetatileAttribute(attributes[metatile - NUM_METATILES_IN_PRIMARY], attributeType);\n    }\n    else\n    {\n        return 0xFF;\n    }\n}\n\nvoid SaveMapView(void)\n{\n    s32 i, j;\n    s32 x, y;\n    u16 *mapView;\n    s32 width;\n    mapView = gSaveBlock2Ptr->mapView;\n    width = VMap.Xsize;\n    x = gSaveBlock1Ptr->pos.x;\n    y = gSaveBlock1Ptr->pos.y;\n    for (i = y; i < y + MAP_OFFSET_H; i++)\n    {\n        for (j = x; j < x + MAP_OFFSET_W; j++)\n            *mapView++ = gBackupMapData[width * i + j];\n    }\n}\n\nstatic bool32 SavedMapViewIsEmpty(void)\n{\n    u32 i;\n    u32 marker = 0;\n\n#ifndef UBFIX\n    // BUG: This loop extends past the bounds of the mapView array. Its size is only 0x100.\n    for (i = 0; i < 0x100; i++)\n        marker |= gSaveBlock2Ptr->mapView[i];\n#else\n    for (i = 0; i < NELEMS(gSaveBlock2Ptr->mapView); i++)\n        marker |= gSaveBlock2Ptr->mapView[i];\n#endif\n\n    if (marker == 0)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void ClearSavedMapView(void)\n{\n    CpuFill16(0, gSaveBlock2Ptr->mapView, sizeof(gSaveBlock2Ptr->mapView));\n}\n\nstatic void LoadSavedMapView(void)\n{\n    s32 i, j;\n    s32 x, y;\n    u16 *mapView;\n    s32 width;\n    mapView = gSaveBlock2Ptr->mapView;\n    if (!SavedMapViewIsEmpty())\n    {\n        width = VMap.Xsize;\n        x = gSaveBlock1Ptr->pos.x;\n        y = gSaveBlock1Ptr->pos.y;\n        for (i = y; i < y + MAP_OFFSET_H; i++)\n        {\n            for (j = x; j < x + MAP_OFFSET_W; j++)\n            {\n                gBackupMapData[j + width * i] = *mapView;\n                mapView++;\n            }\n        }\n        ClearSavedMapView();\n    }\n}\n\nstatic void MoveMapViewToBackup(u8 direction)\n{\n    s32 width;\n    u16 *mapView;\n    s32 x0, y0;\n    s32 x2, y2;\n    u16 *src, *dest;\n    s32 srci, desti;\n    s32 r9, r8;\n    s32 x, y;\n    s32 i, j;\n    mapView = gSaveBlock2Ptr->mapView;\n    width = VMap.Xsize;\n    r9 = 0;\n    r8 = 0;\n    x0 = gSaveBlock1Ptr->pos.x;\n    y0 = gSaveBlock1Ptr->pos.y;\n    x2 = 15;\n    y2 = 14;\n    switch (direction)\n    {\n    case CONNECTION_NORTH:\n        y0 += 1;\n        y2 = MAP_OFFSET_H - 1;\n        break;\n    case CONNECTION_SOUTH:\n        r8 = 1;\n        y2 = MAP_OFFSET_H - 1;\n        break;\n    case CONNECTION_WEST:\n        x0 += 1;\n        x2 = MAP_OFFSET_W - 1;\n        break;\n    case CONNECTION_EAST:\n        r9 = 1;\n        x2 = MAP_OFFSET_W - 1;\n        break;\n    }\n    for (y = 0; y < y2; y++)\n    {\n        i = 0;\n        j = 0;\n        for (x = 0; x < x2; x++)\n        {\n            desti = width * (y + y0);\n            srci = (y + r8) * MAP_OFFSET_W + r9;\n            src = &mapView[srci + i];\n            dest = &gBackupMapData[x0 + desti + j];\n            *dest = *src;\n            i++;\n            j++;\n        }\n    }\n    ClearSavedMapView();\n}\n\ns32 GetMapBorderIdAt(s32 x, s32 y)\n{\n    if (GetMapGridBlockAt(x, y) == MAPGRID_UNDEFINED)\n        return CONNECTION_INVALID;\n\n    if (x >= VMap.Xsize - (MAP_OFFSET + 1))\n    {\n        if (!gMapConnectionFlags.east)\n            return CONNECTION_INVALID;\n\n        return CONNECTION_EAST;\n    }\n\n    if (x < MAP_OFFSET)\n    {\n        if (!gMapConnectionFlags.west)\n            return CONNECTION_INVALID;\n\n        return CONNECTION_WEST;\n    }\n\n    if (y >= VMap.Ysize - MAP_OFFSET)\n    {\n        if (!gMapConnectionFlags.south)\n            return CONNECTION_INVALID;\n\n        return CONNECTION_SOUTH;\n    }\n\n    if (y < MAP_OFFSET)\n    {\n        if (!gMapConnectionFlags.north)\n            return CONNECTION_INVALID;\n\n        return CONNECTION_NORTH;\n    }\n\n    return CONNECTION_NONE;\n}\n\nstatic s32 GetPostCameraMoveMapBorderId(s32 x, s32 y)\n{\n    return GetMapBorderIdAt(gSaveBlock1Ptr->pos.x + MAP_OFFSET + x, gSaveBlock1Ptr->pos.y + MAP_OFFSET + y);\n}\n\nbool32 CanCameraMoveInDirection(s32 direction)\n{\n    s32 x, y;\n    x = gSaveBlock1Ptr->pos.x + MAP_OFFSET + gDirectionToVectors[direction].x;\n    y = gSaveBlock1Ptr->pos.y + MAP_OFFSET + gDirectionToVectors[direction].y;\n\n    if (GetMapBorderIdAt(x, y) == CONNECTION_INVALID)\n        return FALSE;\n\n    return TRUE;\n}\n\nstatic void SetPositionFromConnection(const struct MapConnection *connection, int direction, s32 x, s32 y)\n{\n    struct MapHeader const *mapHeader;\n    mapHeader = GetMapHeaderFromConnection(connection);\n    switch (direction)\n    {\n    case CONNECTION_EAST:\n        gSaveBlock1Ptr->pos.x = -x;\n        gSaveBlock1Ptr->pos.y -= connection->offset;\n        break;\n    case CONNECTION_WEST:\n        gSaveBlock1Ptr->pos.x = mapHeader->mapLayout->width;\n        gSaveBlock1Ptr->pos.y -= connection->offset;\n        break;\n    case CONNECTION_SOUTH:\n        gSaveBlock1Ptr->pos.x -= connection->offset;\n        gSaveBlock1Ptr->pos.y = -y;\n        break;\n    case CONNECTION_NORTH:\n        gSaveBlock1Ptr->pos.x -= connection->offset;\n        gSaveBlock1Ptr->pos.y = mapHeader->mapLayout->height;\n        break;\n    }\n}\n\nbool8 CameraMove(s32 x, s32 y)\n{\n    s32 direction;\n    const struct MapConnection *connection;\n    s32 old_x, old_y;\n    gCamera.active = FALSE;\n    direction = GetPostCameraMoveMapBorderId(x, y);\n    if (direction == CONNECTION_NONE || direction == CONNECTION_INVALID)\n    {\n        gSaveBlock1Ptr->pos.x += x;\n        gSaveBlock1Ptr->pos.y += y;\n    }\n    else\n    {\n        SaveMapView();\n        old_x = gSaveBlock1Ptr->pos.x;\n        old_y = gSaveBlock1Ptr->pos.y;\n        connection = GetIncomingConnection(direction, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y);\n        SetPositionFromConnection(connection, direction, x, y);\n        LoadMapFromCameraTransition(connection->mapGroup, connection->mapNum);\n        gCamera.active = TRUE;\n        gCamera.x = old_x - gSaveBlock1Ptr->pos.x;\n        gCamera.y = old_y - gSaveBlock1Ptr->pos.y;\n        gSaveBlock1Ptr->pos.x += x;\n        gSaveBlock1Ptr->pos.y += y;\n        MoveMapViewToBackup(direction);\n    }\n    return gCamera.active;\n}\n\nconst struct MapConnection *GetIncomingConnection(u8 direction, s32 x, s32 y)\n{\n    s32 count;\n    const struct MapConnection *connection;\n    const struct MapConnections *connections = gMapHeader.connections;\n    s32 i;\n\n#ifdef UBFIX // UB: Multiple possible null dereferences\n    if (connections == NULL || connections->connections == NULL)\n        return NULL;\n#endif\n    count = connections->count;\n    connection = connections->connections;\n    for (i = 0; i < count; i++, connection++)\n    {\n        if (connection->direction == direction && IsPosInIncomingConnectingMap(direction, x, y, connection) == TRUE)\n            return connection;\n    }\n    return NULL;\n\n}\n\nstatic bool8 IsPosInIncomingConnectingMap(u8 direction, s32 x, s32 y, const struct MapConnection *connection)\n{\n    struct MapHeader const *mapHeader;\n    mapHeader = GetMapHeaderFromConnection(connection);\n    switch (direction)\n    {\n    case CONNECTION_SOUTH:\n    case CONNECTION_NORTH:\n        return IsCoordInIncomingConnectingMap(x, gMapHeader.mapLayout->width, mapHeader->mapLayout->width, connection->offset);\n    case CONNECTION_WEST:\n    case CONNECTION_EAST:\n        return IsCoordInIncomingConnectingMap(y, gMapHeader.mapLayout->height, mapHeader->mapLayout->height, connection->offset);\n    }\n    return FALSE;\n}\n\nstatic bool8 IsCoordInIncomingConnectingMap(s32 coord, s32 srcMax, s32 destMax, s32 offset)\n{\n    s32 offset2 = max(offset, 0);\n\n    if (destMax + offset < srcMax)\n        srcMax = destMax + offset;\n\n    if (offset2 <= coord && coord <= srcMax)\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic bool32 IsCoordInConnectingMap(s32 coord, s32 max)\n{\n    if (coord >= 0 && coord < max)\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic s32 IsPosInConnectingMap(const struct MapConnection *connection, s32 x, s32 y)\n{\n    struct MapHeader const *mapHeader;\n    mapHeader = GetMapHeaderFromConnection(connection);\n    switch (connection->direction)\n    {\n    case CONNECTION_SOUTH:\n    case CONNECTION_NORTH:\n        return IsCoordInConnectingMap(x - connection->offset, mapHeader->mapLayout->width);\n    case CONNECTION_WEST:\n    case CONNECTION_EAST:\n        return IsCoordInConnectingMap(y - connection->offset, mapHeader->mapLayout->height);\n    }\n    return FALSE;\n}\n\nconst struct MapConnection *GetMapConnectionAtPos(s16 x, s16 y)\n{\n    s32 count;\n    const struct MapConnection *connection;\n    s32 i;\n    u8 direction;\n    if (!gMapHeader.connections)\n    {\n        return NULL;\n    }\n    else\n    {\n        count = gMapHeader.connections->count;\n        connection = gMapHeader.connections->connections;\n        for (i = 0; i < count; i++, connection++)\n        {\n            direction = connection->direction;\n            if ((direction == CONNECTION_DIVE || direction == CONNECTION_EMERGE)\n                || (direction == CONNECTION_NORTH && y > MAP_OFFSET - 1)\n                || (direction == CONNECTION_SOUTH && y < gMapHeader.mapLayout->height + MAP_OFFSET)\n                || (direction == CONNECTION_WEST && x > MAP_OFFSET - 1)\n                || (direction == CONNECTION_EAST && x < gMapHeader.mapLayout->width + MAP_OFFSET))\n            {\n                continue;\n            }\n\n            if (IsPosInConnectingMap(connection, x - MAP_OFFSET, y - MAP_OFFSET) == TRUE)\n                return connection;\n        }\n    }\n    return NULL;\n}\n\nvoid SetCameraFocusCoords(u16 x, u16 y)\n{\n    gSaveBlock1Ptr->pos.x = x - MAP_OFFSET;\n    gSaveBlock1Ptr->pos.y = y - MAP_OFFSET;\n}\n\nvoid GetCameraFocusCoords(u16 *x, u16 *y)\n{\n    *x = gSaveBlock1Ptr->pos.x + MAP_OFFSET;\n    *y = gSaveBlock1Ptr->pos.y + MAP_OFFSET;\n}\n\n// Unused\nstatic void SetCameraCoords(u16 x, u16 y)\n{\n    gSaveBlock1Ptr->pos.x = x;\n    gSaveBlock1Ptr->pos.y = y;\n}\n\nvoid GetCameraCoords(u16 *x, u16 *y)\n{\n    *x = gSaveBlock1Ptr->pos.x;\n    *y = gSaveBlock1Ptr->pos.y;\n}\n\nstatic void CopyTilesetToVram(struct Tileset const *tileset, u16 numTiles, u16 offset)\n{\n    if (tileset)\n    {\n        if (!tileset->isCompressed)\n            LoadBgTiles(2, tileset->tiles, numTiles * 32, offset);\n        else\n            DecompressAndCopyTileDataToVram2(2, tileset->tiles, numTiles * 32, offset, 0);\n    }\n}\n\nstatic void CopyTilesetToVramUsingHeap(struct Tileset const *tileset, u16 numTiles, u16 offset)\n{\n    if (tileset)\n    {\n        if (!tileset->isCompressed)\n            LoadBgTiles(2, tileset->tiles, numTiles * 32, offset);\n        else\n            DecompressAndLoadBgGfxUsingHeap2(2, tileset->tiles, numTiles * 32, offset, 0);\n    }\n}\n\nstatic void ApplyGlobalTintToPaletteEntries(u16 offset, u16 size)\n{\n    switch (gGlobalFieldTintMode)\n    {\n    case QL_TINT_NONE:\n        return;\n    case QL_TINT_GRAYSCALE:\n        TintPalette_GrayScale(&gPlttBufferUnfaded[offset], size);\n        break;\n    case QL_TINT_SEPIA:\n        TintPalette_SepiaTone(&gPlttBufferUnfaded[offset], size);\n        break;\n    case QL_TINT_BACKUP_GRAYSCALE:\n        QuestLog_BackUpPalette(offset, size);\n        TintPalette_GrayScale(&gPlttBufferUnfaded[offset], size);\n        break;\n    default:\n        return;\n    }\n    CpuCopy16(&gPlttBufferUnfaded[offset], &gPlttBufferFaded[offset], PLTT_SIZEOF(size));\n}\n\nvoid ApplyGlobalTintToPaletteSlot(u8 slot, u8 count)\n{\n    switch (gGlobalFieldTintMode)\n    {\n    case QL_TINT_NONE:\n        return;\n    case QL_TINT_GRAYSCALE:\n        TintPalette_GrayScale(&gPlttBufferUnfaded[BG_PLTT_ID(slot)], count * 16);\n        break;\n    case QL_TINT_SEPIA:\n        TintPalette_SepiaTone(&gPlttBufferUnfaded[BG_PLTT_ID(slot)], count * 16);\n        break;\n    case QL_TINT_BACKUP_GRAYSCALE:\n        QuestLog_BackUpPalette(BG_PLTT_ID(slot), count * 16);\n        TintPalette_GrayScale(&gPlttBufferUnfaded[BG_PLTT_ID(slot)], count * 16);\n        break;\n    default:\n        return;\n    }\n    CpuFastCopy(&gPlttBufferUnfaded[BG_PLTT_ID(slot)], &gPlttBufferFaded[BG_PLTT_ID(slot)], count * PLTT_SIZE_4BPP);\n}\n\nstatic void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size)\n{\n    u16 black = RGB_BLACK;\n\n    if (tileset)\n    {\n        if (tileset->isSecondary == FALSE)\n        {\n            LoadPalette(&black, destOffset, PLTT_SIZEOF(1));\n            LoadPalette(tileset->palettes[0] + 1, destOffset + 1, size - PLTT_SIZEOF(1));\n            ApplyGlobalTintToPaletteEntries(destOffset + 1, (size - 2) >> 1);\n        }\n        else if (tileset->isSecondary == TRUE)\n        {\n            LoadPalette(tileset->palettes[NUM_PALS_IN_PRIMARY], destOffset, size);\n            ApplyGlobalTintToPaletteEntries(destOffset, size >> 1);\n        }\n        else\n        {\n            LoadCompressedPalette((const u32 *)tileset->palettes, destOffset, size);\n            ApplyGlobalTintToPaletteEntries(destOffset, size >> 1);\n        }\n    }\n}\n\nvoid CopyPrimaryTilesetToVram(const struct MapLayout *mapLayout)\n{\n    CopyTilesetToVram(mapLayout->primaryTileset, NUM_TILES_IN_PRIMARY, 0);\n}\n\nvoid CopySecondaryTilesetToVram(const struct MapLayout *mapLayout)\n{\n    CopyTilesetToVram(mapLayout->secondaryTileset, NUM_TILES_TOTAL - NUM_TILES_IN_PRIMARY, NUM_TILES_IN_PRIMARY);\n}\n\nvoid CopySecondaryTilesetToVramUsingHeap(const struct MapLayout *mapLayout)\n{\n    CopyTilesetToVramUsingHeap(mapLayout->secondaryTileset, NUM_TILES_TOTAL - NUM_TILES_IN_PRIMARY, NUM_TILES_IN_PRIMARY);\n}\n\nstatic void LoadPrimaryTilesetPalette(const struct MapLayout *mapLayout)\n{\n    LoadTilesetPalette(mapLayout->primaryTileset, BG_PLTT_ID(0), NUM_PALS_IN_PRIMARY * PLTT_SIZE_4BPP);\n}\n\nvoid LoadSecondaryTilesetPalette(const struct MapLayout *mapLayout)\n{\n    LoadTilesetPalette(mapLayout->secondaryTileset, BG_PLTT_ID(NUM_PALS_IN_PRIMARY), (NUM_PALS_TOTAL - NUM_PALS_IN_PRIMARY) * PLTT_SIZE_4BPP);\n}\n\nvoid CopyMapTilesetsToVram(struct MapLayout const *mapLayout)\n{\n    if (mapLayout)\n    {\n        CopyTilesetToVramUsingHeap(mapLayout->primaryTileset, NUM_TILES_IN_PRIMARY, 0);\n        CopyTilesetToVramUsingHeap(mapLayout->secondaryTileset, NUM_TILES_TOTAL - NUM_TILES_IN_PRIMARY, NUM_TILES_IN_PRIMARY);\n    }\n}\n\nvoid LoadMapTilesetPalettes(struct MapLayout const *mapLayout)\n{\n    if (mapLayout)\n    {\n        LoadPrimaryTilesetPalette(mapLayout);\n        LoadSecondaryTilesetPalette(mapLayout);\n    }\n}\n"
  },
  {
    "path": "src/fldeff_berrytree.c",
    "content": "// From R/S, removed\nvoid DoWateringBerryTreeAnim(void)\n{\n}\n"
  },
  {
    "path": "src/fldeff_cut.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"event_object_lock.h\"\n#include \"event_object_movement.h\"\n#include \"event_scripts.h\"\n#include \"faraway_island.h\"\n#include \"fieldmap.h\"\n#include \"field_camera.h\"\n#include \"field_specials.h\"\n#include \"fldeff.h\"\n#include \"field_effect.h\"\n#include \"field_player_avatar.h\"\n#include \"metatile_behavior.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"script.h\"\n#include \"trig.h\"\n#include \"constants/abilities.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/songs.h\"\n#include \"constants/metatile_labels.h\"\n\n#define CUT_GRASS_SPRITE_COUNT 8\n#define CUT_SIDE 3\n\nstatic EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL;\nstatic EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE;\n\nstatic void FieldCallback_CutGrass(void);\nstatic void FieldCallback_CutTree(void);\nstatic void FieldMoveCallback_CutGrass(void);\nstatic void SetCutGrassMetatileAt(s16 x, s16 y);\nstatic void SpriteCallback_CutGrass_Init(struct Sprite *sprite);\nstatic void SpriteCallback_CutGrass_Run(struct Sprite *sprite);\nstatic void SpriteCallback_CutGrass_Cleanup(struct Sprite *sprite);\nstatic void FieldMoveCallback_CutTree(void);\nstatic void CleanupLongGrass(s16 x, s16 y);\n\nextern const u8 FarawayIsland_Interior_EventScript_HideMewWhenGrassCut[];\n\nstatic const u16 sCutGrassMetatileMapping[][2] = {\n    {\n        METATILE_ID(General, Plain_Grass),\n        METATILE_ID(General, Plain_Mowed)\n    }, {\n        METATILE_ID(General, ThinTreeTop_Grass),\n        METATILE_ID(General, ThinTreeTop_Mowed)\n    }, {\n        METATILE_ID(General, WideTreeTopLeft_Grass),\n        METATILE_ID(General, WideTreeTopLeft_Mowed)\n    }, {\n        METATILE_ID(General, WideTreeTopRight_Grass),\n        METATILE_ID(General, WideTreeTopRight_Mowed)\n    }, {\n        METATILE_ID(CeladonCity, CyclingRoad_Grass),\n        METATILE_ID(CeladonCity, CyclingRoad_Mowed)\n    }, {\n        METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Grass),\n        METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Mowed)\n    }, {\n        METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Grass),\n        METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Mowed)\n    }, {\n        METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Grass),\n        METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Mowed)\n    }, {\n        METATILE_ID(ViridianForest, HugeTreeTopMiddle_Grass),\n        METATILE_ID(ViridianForest, HugeTreeTopMiddle_Mowed)\n    }, {\n        METATILE_ID(SeviiIslands67, LongGrass_Top), //long grass top\n        METATILE_ID(SeviiIslands67, EmeraldMowed) //Emerald mowed grass\n    }, {\n        METATILE_ID(SeviiIslands67, LongGrass_Bottom), //long grass bottom\n        METATILE_ID(SeviiIslands67, EmeraldMowed) //Emerald mowed grass\n    }, {\n        METATILE_ID(SeviiIslands123, OneIsland_Grass), //One Island tall grass\n        METATILE_ID(SeviiIslands123, OneIsland_Mowed) //One Island mowed grass\n    }, {\n        METATILE_ID(SeviiIslands123, OneIsland_AshGrass), //One Island tall grass\n        METATILE_ID(SeviiIslands123, OneIsland_Mowed) //One Island mowed grass\n    }, {\n        METATILE_ID(BerryForest, ThreeIsland_Grass), //Three Island yellow grass\n        METATILE_ID(General, Plain_Mowed) //Three Island yellow grass\n    }, {\n        METATILE_ID(SeviiIslands5, Micro_Grass),\n        METATILE_ID(SeviiIslands5, Micro_Mowed)\n    }, {\n        METATILE_ID(SeviiIslands5, MicroWideTreeTopLeft_Grass),\n        METATILE_ID(SeviiIslands5, MicroWideTreeTopLeft_Mowed)\n    }, {\n        METATILE_ID(SeviiIslands5, MicroWideTreeTopRight_Grass),\n        METATILE_ID(SeviiIslands5, MicroWideTreeTopRight_Mowed)\n    }, {    // Safari Zone Long Grass\n        METATILE_ID(FuchsiaCity, LongGrassTop_LeftTree),\n        METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Mowed)\n    }, {\n        METATILE_ID(FuchsiaCity, LongGrassTop_MiddleTree),\n        METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Mowed)\n    }, {\n        METATILE_ID(FuchsiaCity, LongGrassTop_RightTree),\n        METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Mowed)\n    }, {\n        METATILE_ID(FuchsiaCity, LongGrassBottom_LeftTree),\n        METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Mowed)\n    }, {\n        METATILE_ID(FuchsiaCity, LongGrassBottom_MiddleTree),\n        METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Mowed)\n    }, {\n        METATILE_ID(FuchsiaCity, LongGrassBottom_RightTree),\n        METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Mowed)\n    }, {\n        METATILE_ID(FuchsiaCity, LongGrassTop_MountainLeft),\n        METATILE_ID(FuchsiaCity, SafariMountainTopLeft_Mowed)\n    }, {\n        METATILE_ID(FuchsiaCity, LongGrassTop_MountainRight),\n        METATILE_ID(FuchsiaCity, SafariMountainTopRight_Mowed)\n    }, {\n        METATILE_ID(FuchsiaCity, LongGrassBottom_MountainLeft),\n        METATILE_ID(General, MountainCornerTopLeft | MAPGRID_COLLISION_MASK)\n    }, {\n        METATILE_ID(FuchsiaCity, LongGrassBottom_MountainRight),\n        METATILE_ID(General, MountainCornerTopRight | MAPGRID_COLLISION_MASK)\n    }, {\n        METATILE_ID(SeviiIslands6, ForestTreeCorner_Left),\n        METATILE_ID(SeviiIslands6, ForestTreeCorner_Left_Mowed | MAPGRID_COLLISION_MASK) // for some reason this calls the wrong tile\n    }, {\n        METATILE_ID(SeviiIslands6, ForestTreeCorner_Right),\n        METATILE_ID(SeviiIslands6, ForestTreeCorner_Right_Mowed | MAPGRID_COLLISION_MASK)\n    }, {\n        METATILE_ID(SeviiIslands6, ForestTreeTop),\n        METATILE_ID(SeviiIslands6, ForestTreeTop_Mowed)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_BottomLeftCorner),\n        METATILE_ID(SeviiIslands67, BottomLeftCorner)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_BottomRightCorner),\n        METATILE_ID(SeviiIslands67, BottomRightCorner)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_Down),\n        METATILE_ID(SeviiIslands67, Down)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_InnerCornerBottomLeft),\n        METATILE_ID(SeviiIslands67, InnerCornerBottomLeft)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_InnerCornerBottomRight),\n        METATILE_ID(SeviiIslands67, InnerCornerBottomRight)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_InnerCornerTopLeft),\n        METATILE_ID(SeviiIslands67, InnerCornerTopLeft)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_InnerCornerTopRight),\n        METATILE_ID(SeviiIslands67, InnerCornerTopRight)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_InnerCornersTopRightBottomLeft),\n        METATILE_ID(SeviiIslands67, InnerCornersTopRightBottomLeft)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_Left),\n        METATILE_ID(SeviiIslands67, Left)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_Plain),\n        METATILE_ID(SeviiIslands67, Plain)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_Right),\n        METATILE_ID(SeviiIslands67, Right)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_RightInnerCornerTopLeft),\n        METATILE_ID(SeviiIslands67, RightInnerCornerTopLeft)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_TopLeftCorner),\n        METATILE_ID(SeviiIslands67, TopLeftCorner)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_TopRightCorner),\n        METATILE_ID(SeviiIslands67, TopRightCorner)\n    }, {\n        METATILE_ID(SeviiIslands67, Grass_Up),\n        METATILE_ID(SeviiIslands67, Up)\n    }, {\n        0xffff,\n        0xffff\n    }\n};\n\nstatic const struct OamData sOamData_FldEff_CutGrass = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0x001,\n    .priority = 1,\n    .paletteNum = 1,\n    .affineParam = 0\n};\n\nstatic const union AnimCmd sSpriteAnim_Fldeff_CutGrass_0[] = {\n    ANIMCMD_FRAME(0, 30),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_FldEff_CutGrass[] = {\n    sSpriteAnim_Fldeff_CutGrass_0\n};\n\nstatic const struct SpriteFrameImage sSpriteFrameImages_FldEff_CutGrass[] = {\n    {gFieldEffectObjectPic_CutGrass, 0x20}\n};\n\nconst struct SpritePalette gFldEffPalette_CutGrass[] = {\n    gFieldEffectPal_CutGrass, 4096\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_FldEff_CutGrass = {\n    .tileTag = 0xFFFF,\n    .paletteTag = 4096,\n    .oam = &sOamData_FldEff_CutGrass,\n    .anims = sSpriteAnimTable_FldEff_CutGrass,\n    .images = sSpriteFrameImages_FldEff_CutGrass,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallback_CutGrass_Init\n};\n\nstatic u8 MetatileAtCoordsIsGrassTile(s16 x, s16 y)\n{\n    return TestMetatileAttributeBit(MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_TERRAIN), TILE_TERRAIN_GRASS);\n}\n\nbool8 SetUpFieldMove_Cut(void)\n{\n    s16 x, y;\n    u8 i, j;\n    sScheduleOpenDottedHole = FALSE;\n    if (CutMoveRuinValleyCheck() == TRUE)\n    {\n        sScheduleOpenDottedHole = TRUE;\n        gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;\n        gPostMenuFieldCallback = FieldCallback_CutGrass;\n        return TRUE;\n    }\n\n    if (CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_CUT_TREE) == TRUE)\n    {\n        gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;\n        gPostMenuFieldCallback = FieldCallback_CutTree;\n        return TRUE;\n    }\n    \n    else\n    {\n        PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);\n    \n        for (i = 0; i < CUT_SIDE; i++)\n        {\n            y = gPlayerFacingPosition.y - 1 + i;\n            for (j = 0; j < CUT_SIDE; j++)\n            {\n                x = gPlayerFacingPosition.x - 1 + j;\n                if (MapGridGetElevationAt(x, y) == gPlayerFacingPosition.elevation)\n                {\n                    if (MetatileAtCoordsIsGrassTile(x, y) == TRUE)\n                    {\n                        gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;\n                        gPostMenuFieldCallback = FieldCallback_CutGrass;\n                        return TRUE;\n                    }\n                }\n            }\n        }\n        return FALSE;\n    }\n}\n\nstatic void FieldCallback_CutGrass(void)\n{\n    FieldEffectStart(FLDEFF_USE_CUT_ON_GRASS);\n    gFieldEffectArguments[0] = GetCursorSelectionMonId();\n}\n\nbool8 FldEff_UseCutOnGrass(void)\n{\n    u8 taskId = CreateFieldEffectShowMon();\n    FLDEFF_SET_FUNC_TO_DATA(FieldMoveCallback_CutGrass);\n    IncrementGameStat(GAME_STAT_USED_CUT);\n    return FALSE;\n}\n\nstatic void FieldCallback_CutTree(void)\n{\n    gFieldEffectArguments[0] = GetCursorSelectionMonId();\n    ScriptContext_SetupScript(EventScript_FldEffCut);\n}\n\nbool8 FldEff_UseCutOnTree(void)\n{\n    u8 taskId = CreateFieldEffectShowMon();\n    FLDEFF_SET_FUNC_TO_DATA(FieldMoveCallback_CutTree);\n    IncrementGameStat(GAME_STAT_USED_CUT);\n    return FALSE;\n}\n\nstatic void FieldMoveCallback_CutGrass(void)\n{\n    FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS);\n    if (sScheduleOpenDottedHole == TRUE)\n        CutMoveOpenDottedHoleDoor();\n    else\n        FieldEffectStart(FLDEFF_CUT_GRASS);\n}\n\nbool8 FldEff_CutGrass(void)\n{\n    u8 i, j;\n    s16 x, y;\n    u8 cutRange;\n    u8 userAbility;\n    u8 TileCountFromPlayer_X;\n    u8 TileCountFromPlayer_Y;\n\n    i = 0;\n    PlaySE(SE_M_CUT);\n    PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);\n    userAbility = GetMonAbility(&gPlayerParty[GetCursorSelectionMonId()]);\n    if(userAbility == ABILITY_HYPER_CUTTER)\n    {\n        cutRange = 5;\n        TileCountFromPlayer_X = 2;\n        TileCountFromPlayer_Y = 2;\n    }\n    else\n    {\n        cutRange = 3;\n        TileCountFromPlayer_X = 1;\n        TileCountFromPlayer_Y = 1;\n    }\n\n    for (i = 0; i < cutRange; i++)\n    {\n        y = gPlayerFacingPosition.y - 1 + i;\n        if(userAbility == ABILITY_HYPER_CUTTER)\n        {\n            y -= 1;\n        }\n        for (j = 0; j < cutRange; j++)\n        {\n            x = gPlayerFacingPosition.x - 1 + j;\n            if(userAbility == ABILITY_HYPER_CUTTER)\n            {\n                x -= 1;\n            }\n            if (MapGridGetElevationAt(x, y) == gPlayerFacingPosition.elevation)\n            {\n                if (MetatileAtCoordsIsGrassTile(x, y) == TRUE)\n                {\n                    SetCutGrassMetatileAt(x, y);\n                    EnableObjectGroundEffectsByXY(x, y);\n                }\n            }\n        }\n    }\n    CleanupLongGrass(gPlayerFacingPosition.x - TileCountFromPlayer_X, gPlayerFacingPosition.y - (1 + TileCountFromPlayer_Y));\n    DrawWholeMapView();\n    sCutGrassSpriteArrayPtr = Alloc(CUT_GRASS_SPRITE_COUNT);\n    for (i = 0; i < 8; i++)\n    {\n        sCutGrassSpriteArrayPtr[i] = CreateSprite(&sSpriteTemplate_FldEff_CutGrass, gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0);\n        gSprites[sCutGrassSpriteArrayPtr[i]].data[2] = i * (0x100 / CUT_GRASS_SPRITE_COUNT);\n    }\n    return FALSE;\n}\n\nstatic void SetCutGrassMetatileAt(s16 x, s16 y)\n{\n    u16 i = 0;\n    u16 metatileId = MapGridGetMetatileIdAt(x, y);\n    while (1)\n    {\n        if (sCutGrassMetatileMapping[i][0] == 0xFFFF)\n            return;\n        if (sCutGrassMetatileMapping[i][0] == metatileId)\n        {\n            MapGridSetMetatileIdAt(x, y, sCutGrassMetatileMapping[i][1]);\n            break;\n        }\n        i++;\n    }\n}\n\nstatic bool8 MetatileIsLongGrass(u32 metatileId, bool8 isTop)\n{\n    if(isTop)\n    {\n        switch(metatileId)\n        {\n            case METATILE_FuchsiaCity_LongGrassTop_LeftTree:\n            case METATILE_FuchsiaCity_LongGrassTop_MiddleTree:\n            case METATILE_FuchsiaCity_LongGrassTop_RightTree:\n            case METATILE_FuchsiaCity_LongGrassTop_MountainLeft:\n            case METATILE_FuchsiaCity_LongGrassTop_MountainRight:\n            case METATILE_SeviiIslands67_LongGrass_Top:\n            case METATILE_SeviiIslands6_ForestTreeTop:\n                return TRUE;\n            default:\n                return FALSE;\n        }\n    }\n    else\n    {\n        switch(metatileId)\n        {\n            case METATILE_FuchsiaCity_LongGrassBottom_LeftTree:\n            case METATILE_FuchsiaCity_LongGrassBottom_MiddleTree:\n            case METATILE_FuchsiaCity_LongGrassBottom_RightTree:\n            case METATILE_FuchsiaCity_LongGrassBottom_MountainLeft:\n            case METATILE_FuchsiaCity_LongGrassBottom_MountainRight:\n            case METATILE_SeviiIslands67_LongGrass_Bottom:\n            case METATILE_SeviiIslands6_ForestTreeCorner_Left:\n            case METATILE_SeviiIslands6_ForestTreeCorner_Right:\n                return TRUE;\n            default:\n                return FALSE;\n        }\n    }\n}\n\nstatic bool8 MetatileIsMowedLongGrass(u32 metatileId)\n{\n    switch(metatileId)\n    {\n        case METATILE_SeviiIslands67_EmeraldMowed:\n        case METATILE_FuchsiaCity_SafariZoneTreeTopLeft_Mowed:\n        case METATILE_FuchsiaCity_SafariZoneTreeTopMiddle_Mowed:\n        case METATILE_FuchsiaCity_SafariZoneTreeTopRight_Mowed:\n        case METATILE_General_MountainCornerTopLeft:\n        case METATILE_General_MountainCornerTopRight:\n        case METATILE_FuchsiaCity_SafariMountainTopLeft_Mowed:\n        case METATILE_FuchsiaCity_SafariMountainTopRight_Mowed:\n        case METATILE_SeviiIslands6_ForestTreeCorner_Left_Mowed:\n        case METATILE_SeviiIslands6_ForestTreeCorner_Right_Mowed:\n        case METATILE_SeviiIslands6_ForestTreeTop_Mowed:\n            return TRUE;\n        default:\n            return FALSE;\n    }\n}\n\nstatic u32 GetMowedMetatileBasedOnInput(u32 metatileId, bool8 isTop)\n{   \n    u32 i;\n    if(isTop)\n    {\n        for(i = 0; sCutGrassMetatileMapping[i][0] != 0xFFFF; i++)\n        {\n            if(sCutGrassMetatileMapping[i][0] != metatileId)\n                continue;\n            else\n                return sCutGrassMetatileMapping[i][1]; //return bottom\n        }\n    }\n    else\n    {\n        for(i = 0; sCutGrassMetatileMapping[i][0] != 0xFFFF; i++)\n        {\n            if(sCutGrassMetatileMapping[i][1] != metatileId)\n                continue;\n            else\n                return sCutGrassMetatileMapping[i][0]; //return top\n        }\n    }\n    return 0x0;\n}\n\nstatic void CleanupLongGrass(s16 x, s16 y)\n{\n    u16 i = 0;\n    s16 lowerY;\n    u8 cutRange;\n    u8 userAbility = GetMonAbility(&gPlayerParty[GetCursorSelectionMonId()]);\n\n    if(userAbility == ABILITY_HYPER_CUTTER)\n    {\n        cutRange = 5;\n    }\n    else\n    {\n        cutRange = 3;\n    }\n\n    lowerY = y + cutRange;\n\n    for (i = 0; i < cutRange; i++)\n    {\n        s16 currentX = x + i;\n        if (MetatileIsLongGrass(MapGridGetMetatileIdAt(currentX, y), TRUE))\n        {\n            u16 topGrassMetatile = MapGridGetMetatileIdAt(currentX, y);\n            u16 underneathTop = MapGridGetMetatileIdAt(currentX, y + 1);\n            if(MetatileIsMowedLongGrass(underneathTop)) //if underneath a long grass top, set that tile to long grass bottom\n                MapGridSetMetatileIdAt(currentX, y + 1, METATILE_SeviiIslands67_LongGrass_Bottom);\n            //MapGridSetMetatileIdAt(currentX, y + 1, GetMowedMetatileBasedOnInput(topGrassMetatile, TRUE)); //should grab corresponding bottom to topGrassMetatile\n        }\n        if (MetatileIsMowedLongGrass(MapGridGetMetatileIdAt(currentX, lowerY))) //if the lowest range got cut\n        {\n            if (MetatileIsLongGrass(MapGridGetMetatileIdAt(currentX, lowerY + 1), FALSE)) //and the tile under that range is an orphaned bottom\n                MapGridSetMetatileIdAt(currentX, lowerY + 1, GetMowedMetatileBasedOnInput(MapGridGetMetatileIdAt(currentX, lowerY + 1), TRUE));\n            //MapGridSetMetatileIdAt(currentX, lowerY + 1, METATILE_SeviiIslands67_EmeraldMowed); //mow it.\n        }\n    }\n}\n\nstatic void SpriteCallback_CutGrass_Init(struct Sprite *sprite)\n{\n    sprite->data[0] = 8;\n    sprite->data[1] = 0;\n    sprite->data[3] = 0;\n    sprite->callback = SpriteCallback_CutGrass_Run;\n}\n\nstatic void SpriteCallback_CutGrass_Run(struct Sprite *sprite)\n{\n    sprite->x2 = Sin(sprite->data[2], sprite->data[0]);\n    sprite->y2 = Cos(sprite->data[2], sprite->data[0]);\n    sprite->data[2] += 8;\n    sprite->data[2] &= 0xFF;\n    sprite->data[0]++;\n    sprite->data[0] += sprite->data[3] >> 2;\n    sprite->data[3]++;\n    if (sprite->data[1] != 28)\n        sprite->data[1]++;\n    else\n        sprite->callback = SpriteCallback_CutGrass_Cleanup;\n}\n\nstatic void SpriteCallback_CutGrass_Cleanup(struct Sprite *sprite)\n{\n    u32 i;\n    for (i = 1; i < CUT_GRASS_SPRITE_COUNT; i++)\n    {\n        DestroySprite(&gSprites[sCutGrassSpriteArrayPtr[i]]);\n    }\n    FieldEffectStop(&gSprites[sCutGrassSpriteArrayPtr[0]], FLDEFF_CUT_GRASS);\n    Free(sCutGrassSpriteArrayPtr);\n    ClearPlayerHeldMovementAndUnfreezeObjectEvents();\n    UnlockPlayerFieldControls();\n\n    if (IsMewPlayingHideAndSeek() == TRUE)\n        ScriptContext_SetupScript(FarawayIsland_Interior_EventScript_HideMewWhenGrassCut);\n}\n\nstatic void FieldMoveCallback_CutTree(void)\n{\n    PlaySE(SE_M_CUT);\n    FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_TREE);\n    ScriptContext_Enable();\n}\n"
  },
  {
    "path": "src/fldeff_dig.c",
    "content": "#include \"global.h\"\n#include \"field_effect.h\"\n#include \"field_player_avatar.h\"\n#include \"fldeff.h\"\n#include \"item_use.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n\nstatic void FieldCallback_Dig(void);\nstatic void StartDigFieldEffect(void);\n\nbool8 SetUpFieldMove_Dig(void)\n{\n    if (CanUseEscapeRopeOnCurrMap() == TRUE)\n    {\n        gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;\n        gPostMenuFieldCallback = FieldCallback_Dig;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void FieldCallback_Dig(void)\n{\n    Overworld_ResetStateAfterDigEscRope();\n    FieldEffectStart(FLDEFF_USE_DIG);\n    gFieldEffectArguments[0] = GetCursorSelectionMonId();\n}\n\nbool8 FldEff_UseDig(void)\n{\n    u8 taskId = CreateFieldEffectShowMon();\n\n    FLDEFF_SET_FUNC_TO_DATA(StartDigFieldEffect);\n    SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);\n    return FALSE;\n}\n\nstatic void StartDigFieldEffect(void)\n{\n    u8 taskId;\n\n    FieldEffectActiveListRemove(FLDEFF_USE_DIG);\n    taskId = CreateTask(Task_UseDigEscapeRopeOnField, 8);\n    gTasks[taskId].data[0] = 0;\n}\n"
  },
  {
    "path": "src/fldeff_flash.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"event_data.h\"\n#include \"event_scripts.h\"\n#include \"fldeff.h\"\n#include \"field_effect.h\"\n#include \"map_preview_screen.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"script.h\"\n#include \"constants/songs.h\"\n#include \"constants/map_types.h\"\n\nstruct FlashStruct\n{\n    u8 fromType;\n    u8 toType;\n    bool8 isEnter;\n    bool8 isExit;\n    void (*func1)(void);\n    void (*func2)(u8 mapSecId);\n};\n\nstatic void FieldCallback_Flash(void);\nstatic void FldEff_UseFlash(void);\nstatic bool8 TryDoMapTransition(void);\nstatic void FlashTransition_Exit(void);\nstatic void Task_FlashTransition_Exit_0(u8 taskId);\nstatic void Task_FlashTransition_Exit_1(u8 taskId);\nstatic void Task_FlashTransition_Exit_2(u8 taskId);\nstatic void Task_FlashTransition_Exit_3(u8 taskId);\nstatic void Task_FlashTransition_Exit_4(u8 taskId);\nstatic void FlashTransition_Enter(void);\nstatic void Task_FlashTransition_Enter_0(u8 taskId);\nstatic void Task_FlashTransition_Enter_1(u8 taskId);\nstatic void Task_FlashTransition_Enter_2(u8 taskId);\nstatic void Task_FlashTransition_Enter_3(u8 taskId);\nstatic void RunMapPreviewScreen(u8 mapsecId);\nstatic void Task_MapPreviewScreen_0(u8 taskId);\n\nstatic const struct FlashStruct sTransitionTypes[] = {\n    {\n        .fromType = MAP_TYPE_TOWN,\n        .toType = MAP_TYPE_UNDERGROUND,\n        .isEnter = TRUE,\n        .isExit = FALSE,\n        .func1 = FlashTransition_Enter,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_CITY,\n        .toType = MAP_TYPE_UNDERGROUND,\n        .isEnter = TRUE,\n        .isExit = FALSE,\n        .func1 = FlashTransition_Enter,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_ROUTE,\n        .toType = MAP_TYPE_UNDERGROUND,\n        .isEnter = TRUE,\n        .isExit = FALSE,\n        .func1 = FlashTransition_Enter,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_UNDERWATER,\n        .toType = MAP_TYPE_UNDERGROUND,\n        .isEnter = TRUE,\n        .isExit = FALSE,\n        .func1 = FlashTransition_Enter,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_OCEAN_ROUTE,\n        .toType = MAP_TYPE_UNDERGROUND,\n        .isEnter = TRUE,\n        .isExit = FALSE,\n        .func1 = FlashTransition_Enter,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_UNKNOWN,\n        .toType = MAP_TYPE_UNDERGROUND,\n        .isEnter = TRUE,\n        .isExit = FALSE,\n        .func1 = FlashTransition_Enter,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_INDOOR,\n        .toType = MAP_TYPE_UNDERGROUND,\n        .isEnter = TRUE,\n        .isExit = FALSE,\n        .func1 = FlashTransition_Enter,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_SECRET_BASE,\n        .toType = MAP_TYPE_UNDERGROUND,\n        .isEnter = TRUE,\n        .isExit = FALSE,\n        .func1 = FlashTransition_Enter,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_UNDERGROUND,\n        .toType = MAP_TYPE_TOWN,\n        .isEnter = FALSE,\n        .isExit = TRUE,\n        .func1 = FlashTransition_Exit,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_UNDERGROUND,\n        .toType = MAP_TYPE_CITY,\n        .isEnter = FALSE,\n        .isExit = TRUE,\n        .func1 = FlashTransition_Exit,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_UNDERGROUND,\n        .toType = MAP_TYPE_ROUTE,\n        .isEnter = FALSE,\n        .isExit = TRUE,\n        .func1 = FlashTransition_Exit,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_UNDERGROUND,\n        .toType = MAP_TYPE_UNDERWATER,\n        .isEnter = FALSE,\n        .isExit = TRUE,\n        .func1 = FlashTransition_Exit,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_UNDERGROUND,\n        .toType = MAP_TYPE_OCEAN_ROUTE,\n        .isEnter = FALSE,\n        .isExit = TRUE,\n        .func1 = FlashTransition_Exit,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_UNDERGROUND,\n        .toType = MAP_TYPE_UNKNOWN,\n        .isEnter = FALSE,\n        .isExit = TRUE,\n        .func1 = FlashTransition_Exit,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_UNDERGROUND,\n        .toType = MAP_TYPE_INDOOR,\n        .isEnter = FALSE,\n        .isExit = TRUE,\n        .func1 = FlashTransition_Exit,\n        .func2 = RunMapPreviewScreen\n    }, {\n        .fromType = MAP_TYPE_UNDERGROUND,\n        .toType = MAP_TYPE_SECRET_BASE,\n        .isEnter = FALSE,\n        .isExit = TRUE,\n        .func1 = FlashTransition_Exit,\n        .func2 = RunMapPreviewScreen\n    }, {0}\n};\n\nstatic const u16 sCaveTransitionPalette_White[] = INCBIN_U16(\"graphics/cave_transition/white.gbapal\");\nstatic const u16 sCaveTransitionPalette_Black[] = INCBIN_U16(\"graphics/cave_transition/black.gbapal\");\n\nstatic const u16 sCaveTransitionPalette_Enter[] = INCBIN_U16(\"graphics/cave_transition/enter.gbapal\");\nstatic const u16 sCaveTransitionPalette_Exit[] = INCBIN_U16(\"graphics/cave_transition/exit.gbapal\");\nstatic const u32 sCaveTransitionTilemap[] = INCBIN_U32(\"graphics/cave_transition/tilemap.bin.lz\");\nstatic const u32 sCaveTransitionTiles[] = INCBIN_U32(\"graphics/cave_transition/tiles.4bpp.lz\");\n\nbool8 SetUpFieldMove_Flash(void)\n{\n    if (gMapHeader.cave != TRUE)\n        return FALSE;\n\n    if (FlagGet(FLAG_SYS_FLASH_ACTIVE))\n        return FALSE;\n\n    gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;\n    gPostMenuFieldCallback = FieldCallback_Flash;\n    return TRUE;\n}\n\nstatic void FieldCallback_Flash(void)\n{\n    u8 taskId = CreateFieldEffectShowMon();\n    gFieldEffectArguments[0] = GetCursorSelectionMonId();\n    gTasks[taskId].data[8] = ((uintptr_t)FldEff_UseFlash) >> 16;\n    gTasks[taskId].data[9] = ((uintptr_t)FldEff_UseFlash);\n}\n\nstatic void FldEff_UseFlash(void)\n{\n    PlaySE(SE_M_REFLECT);\n    FlagSet(FLAG_SYS_FLASH_ACTIVE);\n    ScriptContext_SetupScript(EventScript_FldEffFlash);\n}\n\n// Map transition animatics\n\nstatic void CB2_ChangeMapMain(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void VBC_ChangeMapVBlank(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid CB2_DoChangeMap(void)\n{\n    SetVBlankCallback(NULL);\n\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    SetGpuReg(REG_OFFSET_BG2CNT, 0);\n    SetGpuReg(REG_OFFSET_BG1CNT, 0);\n    SetGpuReg(REG_OFFSET_BG0CNT, 0);\n    SetGpuReg(REG_OFFSET_BG2HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n\n    DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);\n    DmaFill32(3, 0, (void *)OAM, OAM_SIZE);\n    DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);\n    ResetPaletteFade();\n    ResetTasks();\n    ResetSpriteData();\n    EnableInterrupts(INTR_FLAG_VBLANK);\n    SetVBlankCallback(VBC_ChangeMapVBlank);\n    SetMainCallback2(CB2_ChangeMapMain);\n    if (!TryDoMapTransition())\n        SetMainCallback2(gMain.savedCallback);\n}\n\nstatic bool8 TryDoMapTransition(void)\n{\n    u8 fromType = GetLastUsedWarpMapType();\n    u8 toType = GetCurrentMapType();\n    u8 i = 0;\n    if (GetLastUsedWarpMapSectionId() != gMapHeader.regionMapSectionId && MapHasPreviewScreen_HandleQLState2(gMapHeader.regionMapSectionId, MPS_TYPE_CAVE) == TRUE)\n    {\n        RunMapPreviewScreen(gMapHeader.regionMapSectionId);\n        return TRUE;\n    }\n    for (; sTransitionTypes[i].fromType != 0; i++)\n    {\n        if (sTransitionTypes[i].fromType == fromType && sTransitionTypes[i].toType == toType)\n        {\n            sTransitionTypes[i].func1();\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nbool8 MapTransitionIsEnter(u8 _fromType, u8 _toType)\n{\n    u8 fromType = _fromType;\n    u8 toType = _toType;\n    u8 i = 0;\n    for (; sTransitionTypes[i].fromType != 0; i++)\n    {\n        if (sTransitionTypes[i].fromType == fromType && sTransitionTypes[i].toType == toType)\n        {\n            return sTransitionTypes[i].isEnter;\n        }\n    }\n    return FALSE;\n}\n\nbool8 MapTransitionIsExit(u8 _fromType, u8 _toType)\n{\n    u8 fromType = _fromType;\n    u8 toType = _toType;\n    u8 i = 0;\n    for (; sTransitionTypes[i].fromType != 0; i++)\n    {\n        if (sTransitionTypes[i].fromType == fromType && sTransitionTypes[i].toType == toType)\n        {\n            return sTransitionTypes[i].isExit;\n        }\n    }\n    return FALSE;\n}\n\nstatic void FlashTransition_Exit(void)\n{\n    CreateTask(Task_FlashTransition_Exit_0, 0);\n}\n\nstatic void Task_FlashTransition_Exit_0(u8 taskId)\n{\n    gTasks[taskId].func = Task_FlashTransition_Exit_1;\n}\n\nstatic void Task_FlashTransition_Exit_1(u8 taskId)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    LZ77UnCompVram(sCaveTransitionTiles, (void *)BG_CHAR_ADDR(3));\n    LZ77UnCompVram(sCaveTransitionTilemap, (void *)BG_SCREEN_ADDR(31));\n    LoadPalette(sCaveTransitionPalette_White, BG_PLTT_ID(14), sizeof(sCaveTransitionPalette_White));\n    LoadPalette(sCaveTransitionPalette_Exit, BG_PLTT_ID(14), sizeof(sCaveTransitionPalette_Exit));\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(31));\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON);\n    gTasks[taskId].func = Task_FlashTransition_Exit_2;\n    gTasks[taskId].data[0] = 16;\n    gTasks[taskId].data[1] = 0;\n}\n\nstatic void Task_FlashTransition_Exit_2(u8 taskId)\n{\n    u16 r4 = gTasks[taskId].data[1];\n    SetGpuReg(REG_OFFSET_BLDALPHA, (16 << 8) + r4);\n    if (r4 <= 16)\n    {\n        gTasks[taskId].data[1]++;\n    }\n    else\n    {\n        gTasks[taskId].data[2] = 0;\n        gTasks[taskId].func = Task_FlashTransition_Exit_3;\n    }\n}\n\nstatic void Task_FlashTransition_Exit_3(u8 taskId)\n{\n    u16 count;\n    SetGpuReg(REG_OFFSET_BLDALPHA, (16 << 8) + 16);\n    count = gTasks[taskId].data[2];\n    if (count < 8)\n    {\n        gTasks[taskId].data[2]++;\n        LoadPalette(&sCaveTransitionPalette_Exit[count], BG_PLTT_ID(14), sizeof(sCaveTransitionPalette_Exit) - PLTT_SIZEOF(count));\n    }\n    else\n    {\n        LoadPalette(sCaveTransitionPalette_White, BG_PLTT_ID(0), sizeof(sCaveTransitionPalette_White));\n        gTasks[taskId].func = Task_FlashTransition_Exit_4;\n        gTasks[taskId].data[2] = 8;\n    }\n}\n\nstatic void Task_FlashTransition_Exit_4(u8 taskId)\n{\n    if (gTasks[taskId].data[2] != 0)\n        gTasks[taskId].data[2]--;\n    else\n        SetMainCallback2(gMain.savedCallback);\n}\n\nstatic void FlashTransition_Enter(void)\n{\n    CreateTask(Task_FlashTransition_Enter_0, 0);\n}\n\nstatic void Task_FlashTransition_Enter_0(u8 taskId)\n{\n    gTasks[taskId].func = Task_FlashTransition_Enter_1;\n}\n\nstatic void Task_FlashTransition_Enter_1(u8 taskId)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    LZ77UnCompVram(sCaveTransitionTiles, (void *)BG_CHAR_ADDR(3));\n    LZ77UnCompVram(sCaveTransitionTilemap, (void *)BG_SCREEN_ADDR(31));\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(31));\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON);\n    LoadPalette(sCaveTransitionPalette_White, BG_PLTT_ID(14), sizeof(sCaveTransitionPalette_White));\n    LoadPalette(sCaveTransitionPalette_Black, BG_PLTT_ID(0), sizeof(sCaveTransitionPalette_Black));\n    gTasks[taskId].func = Task_FlashTransition_Enter_2;\n    gTasks[taskId].data[0] = 16;\n    gTasks[taskId].data[1] = 0;\n    gTasks[taskId].data[2] = 0;\n}\n\nstatic void Task_FlashTransition_Enter_2(u8 taskId)\n{\n    u16 count = gTasks[taskId].data[2];\n    if (count < 16)\n    {\n        gTasks[taskId].data[2]++;\n        gTasks[taskId].data[2]++;\n        LoadPalette(&sCaveTransitionPalette_Enter[15 - count], BG_PLTT_ID(14), PLTT_SIZEOF(count + 1));\n    }\n    else\n    {\n        SetGpuReg(REG_OFFSET_BLDALPHA, (16 << 8) + 16);\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD);\n        gTasks[taskId].func = Task_FlashTransition_Enter_3;\n    }\n}\n\nstatic void Task_FlashTransition_Enter_3(u8 taskId)\n{\n    u16 r4 = 16 - gTasks[taskId].data[1];\n    SetGpuReg(REG_OFFSET_BLDALPHA, (16 << 8) + r4);\n    if (r4 != 0)\n    {\n        gTasks[taskId].data[1]++;\n    }\n    else\n    {\n        LoadPalette(sCaveTransitionPalette_Black, BG_PLTT_ID(0), sizeof(sCaveTransitionPalette_Black));\n        SetMainCallback2(gMain.savedCallback);\n    }\n}\n\nstatic void RunMapPreviewScreen(u8 mapSecId)\n{\n    u8 taskId = CreateTask(Task_MapPreviewScreen_0, 0);\n    gTasks[taskId].data[3] = mapSecId;\n}\n\nstatic void Task_MapPreviewScreen_0(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    switch (data[0])\n    {\n    case 0:\n        SetWordTaskArg(taskId, 5, (uintptr_t)gMain.vblankCallback);\n        SetVBlankCallback(NULL);\n        MapPreview_InitBgs();\n        MapPreview_LoadGfx(data[3]);\n        BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK);\n        data[0]++;\n        break;\n    case 1:\n        if (!MapPreview_IsGfxLoadFinished())\n        {\n            data[4] = MapPreview_CreateMapNameWindow(data[3]);\n            CopyWindowToVram(data[4], COPYWIN_FULL);\n            data[0]++;\n        }\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n            SetVBlankCallback((IntrCallback)GetWordTaskArg(taskId, 5));\n            data[0]++;\n        }\n        break;\n    case 3:\n        if (!UpdatePaletteFade())\n        {\n            data[2] = MapPreview_GetDuration(data[3]);\n            data[0]++;\n        }\n        break;\n    case 4:\n        data[1]++;\n        if (data[1] > data[2] || JOY_HELD(B_BUTTON))\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_WHITE);\n            data[0]++;\n        }\n        break;\n    case 5:\n        if (!UpdatePaletteFade())\n        {\n            int i;\n            for (i = 0; i < 16; i++)\n            {\n                data[i] = 0;\n            }\n            MapPreview_Unload(data[4]);\n            gTasks[taskId].func = Task_FlashTransition_Enter_1;\n        }\n        break;\n    }\n}\n"
  },
  {
    "path": "src/fldeff_poison.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"constants/songs.h\"\n\nstatic void Task_FieldPoisonEffect(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    switch (data[0])\n    {\n    case 0:\n        data[1] += 1;\n        if (data[1] > 4)\n            data[0]++;\n        break;\n    case 1:\n        data[1] -= 1;\n        if (data[1] == 0)\n            data[0]++;\n        break;\n    case 2:\n        DestroyTask(taskId);\n        return;\n    }\n    AdjustBgMosaic((u8)(((u8)data[1] << 4) | (u8)data[1]), BG_MOSAIC_SET);\n}\n\nvoid FldEffPoison_Start(void)\n{\n    PlaySE(SE_FIELD_POISON);\n    CreateTask(Task_FieldPoisonEffect, 80);\n}\n\nbool32 FldEffPoison_IsActive(void)\n{\n    return FuncIsActiveTask(Task_FieldPoisonEffect);\n}\n"
  },
  {
    "path": "src/fldeff_rocksmash.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"field_player_avatar.h\"\n#include \"field_effect.h\"\n#include \"party_menu.h\"\n#include \"event_data.h\"\n#include \"script.h\"\n#include \"fldeff.h\"\n#include \"event_scripts.h\"\n#include \"overworld.h\"\n#include \"event_object_movement.h\"\n#include \"constants/songs.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/event_object_movement.h\"\n#include \"constants/maps.h\"\n\nstatic void Task_FieldEffectShowMon_Init(u8 taskId);\nstatic void Task_FieldEffectShowMon_WaitFldeff(u8 taskId);\nstatic void Task_FieldEffectShowMon_WaitPlayerAnim(u8 taskId);\nstatic void Task_FieldEffectShowMon_Cleanup(u8 taskId);\nstatic void FieldCallback_UseRockSmash(void);\nstatic void StartRockSmashFieldEffect(void);\n\nEWRAM_DATA struct MapPosition gPlayerFacingPosition = {};\n\nbool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId)\n{\n    u8 mapObjId;\n\n    GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);\n    gPlayerFacingPosition.elevation = PlayerGetElevation();\n    mapObjId = GetObjectEventIdByPosition(gPlayerFacingPosition.x, gPlayerFacingPosition.y, gPlayerFacingPosition.elevation);\n    if (gObjectEvents[mapObjId].graphicsId != graphicsId)\n        return FALSE;\n    gSpecialVar_LastTalked = gObjectEvents[mapObjId].localId;\n    return TRUE;\n}\n\nu8 CreateFieldEffectShowMon(void)\n{\n    GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);\n    return CreateTask(Task_FieldEffectShowMon_Init, 8);\n}\n\nstatic void Task_FieldEffectShowMon_Init(u8 taskId)\n{\n    u8 mapObjId;\n\n    LockPlayerFieldControls();\n    gPlayerAvatar.preventStep = TRUE;\n    mapObjId = gPlayerAvatar.objectEventId;\n    if (!ObjectEventIsMovementOverridden(&gObjectEvents[mapObjId])\n     || ObjectEventClearHeldMovementIfFinished(&gObjectEvents[mapObjId]))\n    {\n        if (gMapHeader.mapType == MAP_TYPE_UNDERWATER)\n        {\n            // Leftover from RS, inhibits the player anim while underwater.\n            FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);\n            gTasks[taskId].func = Task_FieldEffectShowMon_WaitFldeff;\n        }\n        else\n        {\n            StartPlayerAvatarSummonMonForFieldMoveAnim();\n            ObjectEventSetHeldMovement(&gObjectEvents[mapObjId], MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);\n            gTasks[taskId].func = Task_FieldEffectShowMon_WaitPlayerAnim;\n        }\n    }\n}\n\nstatic void Task_FieldEffectShowMon_WaitPlayerAnim(u8 taskId)\n{\n    if (ObjectEventCheckHeldMovementStatus(&gObjectEvents[gPlayerAvatar.objectEventId]) == TRUE)\n    {\n        FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);\n        gTasks[taskId].func = Task_FieldEffectShowMon_WaitFldeff;\n    }\n}\n\nstatic void Task_FieldEffectShowMon_WaitFldeff(u8 taskId)\n{\n    if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))\n    {\n        gFieldEffectArguments[1] = GetPlayerFacingDirection();\n        if (gFieldEffectArguments[1] == DIR_SOUTH)\n            gFieldEffectArguments[2] = 0;\n        if (gFieldEffectArguments[1] == DIR_NORTH)\n            gFieldEffectArguments[2] = 1;\n        if (gFieldEffectArguments[1] == DIR_WEST)\n            gFieldEffectArguments[2] = 2;\n        if (gFieldEffectArguments[1] == DIR_EAST)\n            gFieldEffectArguments[2] = 3;\n        ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByCurrentState());\n        StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]);\n        FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON);\n        gTasks[taskId].func = Task_FieldEffectShowMon_Cleanup;\n    }\n}\n\nstatic void Task_FieldEffectShowMon_Cleanup(u8 taskId)\n{\n    FLDEFF_CALL_FUNC_IN_DATA();\n    gPlayerAvatar.preventStep = FALSE;\n    DestroyTask(taskId);\n}\n\nbool8 SetUpFieldMove_RockSmash(void)\n{\n    if (CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_ROCK_SMASH_ROCK) == TRUE)\n    {\n        gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;\n        gPostMenuFieldCallback = FieldCallback_UseRockSmash;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void FieldCallback_UseRockSmash(void)\n{\n    gFieldEffectArguments[0] = GetCursorSelectionMonId();\n    ScriptContext_SetupScript(EventScript_FldEffRockSmash);\n}\n\nbool8 FldEff_UseRockSmash(void)\n{\n    u8 taskId = CreateFieldEffectShowMon();\n\n    FLDEFF_SET_FUNC_TO_DATA(StartRockSmashFieldEffect);\n    IncrementGameStat(GAME_STAT_USED_ROCK_SMASH);\n    return FALSE;\n}\n\nstatic void StartRockSmashFieldEffect(void)\n{\n    PlaySE(SE_M_ROCK_THROW);\n    FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH);\n    ScriptContext_Enable();\n}\n"
  },
  {
    "path": "src/fldeff_softboiled.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"party_menu.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"constants/songs.h\"\n\nstatic void Task_SoftboiledRestoreHealth(u8 taskId);\nstatic void Task_DisplayHPRestoredMessage(u8 taskId);\nstatic void Task_FinishSoftboiled(u8 taskId);\nstatic void CantUseSoftboiledOnMon(u8 taskId);\n\nextern const u8 gText_CantBeUsedOnPkmn[];\nextern const u8 gText_PkmnHPRestoredByVar2[];\n\nbool8 SetUpFieldMove_SoftBoiled(void)\n{\n    u16 maxHp = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_MAX_HP);\n    u16 curHp = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_HP);\n\n    if (curHp > maxHp / 5)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid ChooseMonForSoftboiled(u8 taskId)\n{\n    gPartyMenu.action = PARTY_ACTION_SOFTBOILED;\n    gPartyMenu.slotId2 = gPartyMenu.slotId;\n    AnimatePartySlot(GetCursorSelectionMonId(), 1);\n    DisplayPartyMenuStdMessage(PARTY_MSG_USE_ON_WHICH_MON);\n    gTasks[taskId].func = Task_HandleChooseMonInput;\n}\n\nvoid Task_TryUseSoftboiledOnPartyMon(u8 taskId)\n{\n    u8 userPartyId = gPartyMenu.slotId;\n    u8 recipientPartyId = gPartyMenu.slotId2;\n    u16 curHp;\n\n    if (recipientPartyId > PARTY_SIZE)\n    {\n        gPartyMenu.action = PARTY_ACTION_CHOOSE_MON;\n        DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON);\n        gTasks[taskId].func = Task_HandleChooseMonInput;\n    }\n    else\n    {\n        curHp = GetMonData(&gPlayerParty[recipientPartyId], MON_DATA_HP);\n        if (curHp == 0\n            || userPartyId == recipientPartyId\n            || GetMonData(&gPlayerParty[recipientPartyId], MON_DATA_MAX_HP) == curHp)\n            CantUseSoftboiledOnMon(taskId);\n        else\n        {\n            PlaySE(SE_USE_ITEM);\n            PartyMenuModifyHP(taskId, userPartyId, -1, GetMonData(&gPlayerParty[userPartyId], MON_DATA_MAX_HP) / 5, Task_SoftboiledRestoreHealth);\n        }\n    }\n}\n\nstatic void Task_SoftboiledRestoreHealth(u8 taskId)\n{\n    PlaySE(SE_USE_ITEM);\n    PartyMenuModifyHP(taskId, gPartyMenu.slotId2, 1, GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MAX_HP) / 5, Task_DisplayHPRestoredMessage);\n}\n\nstatic void Task_DisplayHPRestoredMessage(u8 taskId)\n{\n    GetMonNickname(&gPlayerParty[gPartyMenu.slotId2], gStringVar1);\n    StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2);\n    DisplayPartyMenuMessage(gStringVar4, FALSE);\n    ScheduleBgCopyTilemapToVram(2);\n    gTasks[taskId].func = Task_FinishSoftboiled;\n}\n\nstatic void Task_FinishSoftboiled(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        gPartyMenu.action = PARTY_ACTION_CHOOSE_MON;\n        AnimatePartySlot(gPartyMenu.slotId, 0);\n        gPartyMenu.slotId = gPartyMenu.slotId2;\n        AnimatePartySlot(gPartyMenu.slotId2, 1);\n        ClearStdWindowAndFrameToTransparent(6, 0);\n        ClearWindowTilemap(6);\n        DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON);\n        gTasks[taskId].func = Task_HandleChooseMonInput;\n    }\n}\n\nstatic void Task_ChooseNewMonForSoftboiled(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        DisplayPartyMenuStdMessage(PARTY_MSG_USE_ON_WHICH_MON);\n        gTasks[taskId].func = Task_HandleChooseMonInput;\n    }\n}\n\nstatic void CantUseSoftboiledOnMon(u8 taskId)\n{\n    PlaySE(SE_SELECT);\n    DisplayPartyMenuMessage(gText_CantBeUsedOnPkmn, FALSE);\n    ScheduleBgCopyTilemapToVram(2);\n    gTasks[taskId].func = Task_ChooseNewMonForSoftboiled;\n}\n"
  },
  {
    "path": "src/fldeff_strength.c",
    "content": "#include \"global.h\"\n#include \"field_player_avatar.h\"\n#include \"field_effect.h\"\n#include \"party_menu.h\"\n#include \"event_data.h\"\n#include \"script.h\"\n#include \"fldeff.h\"\n#include \"event_scripts.h\"\n#include \"constants/event_objects.h\"\n\nstatic void FieldCB_UseStrength(void);\nstatic void ShowMonCB_UseStrength(void);\n\nbool8 SetUpFieldMove_Strength(void)\n{\n    if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_PUSHABLE_BOULDER) != TRUE)\n    {\n        return FALSE;\n    }\n    else\n    {\n        gSpecialVar_Result = GetCursorSelectionMonId();\n        gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;\n        gPostMenuFieldCallback = FieldCB_UseStrength;\n        return TRUE;\n    }\n}\nstatic void FieldCB_UseStrength(void)\n{\n    gFieldEffectArguments[0] = GetCursorSelectionMonId();\n    ScriptContext_SetupScript(EventScript_FldEffStrength);\n}\n\nbool8 FldEff_UseStrength(void)\n{\n    u8 taskId = CreateFieldEffectShowMon();\n    FLDEFF_SET_FUNC_TO_DATA(ShowMonCB_UseStrength);\n    GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1);\n    return FALSE;\n}\n\nstatic void ShowMonCB_UseStrength(void)\n{\n    FieldEffectActiveListRemove(FLDEFF_USE_STRENGTH);\n    ScriptContext_Enable();\n}\n"
  },
  {
    "path": "src/fldeff_sweetscent.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"field_player_avatar.h\"\n#include \"field_effect.h\"\n#include \"party_menu.h\"\n#include \"script.h\"\n#include \"fldeff.h\"\n#include \"event_scripts.h\"\n#include \"field_weather.h\"\n#include \"wild_encounter.h\"\n#include \"constants/songs.h\"\n\nstatic EWRAM_DATA u8 *sPlttBufferBak = NULL;\n\nstatic void FieldCallback_SweetScent(void);\nstatic void StartSweetScentFieldEffect(void);\nstatic void TrySweetScentEncounter(u8 taskId);\nstatic void FailSweetScentEncounter(u8 taskId);\n\nstatic void Unused_StartSweetscentFldeff(void)\n{\n\tgPartyMenu.slotId = 0;\n\tFieldCallback_SweetScent();\n}\n\nbool8 SetUpFieldMove_SweetScent(void)\n{\n    gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;\n    gPostMenuFieldCallback = FieldCallback_SweetScent;\n    return TRUE;\n}\n\nstatic void FieldCallback_SweetScent(void)\n{\n    FieldEffectStart(FLDEFF_SWEET_SCENT);\n    gFieldEffectArguments[0] = GetCursorSelectionMonId();\n}\n\nbool8 FldEff_SweetScent(void)\n{\n    u8 taskId;\n\n    SetWeatherScreenFadeOut();\n    taskId = CreateFieldEffectShowMon();\n    FLDEFF_SET_FUNC_TO_DATA(StartSweetScentFieldEffect);\n    return FALSE;\n}\n\nstatic void StartSweetScentFieldEffect(void)\n{\n    u8 taskId;\n\n    PlaySE(SE_M_SWEET_SCENT);\n    sPlttBufferBak = (u8 *)Alloc(PLTT_SIZE);\n    CpuFastCopy(gPlttBufferUnfaded, sPlttBufferBak, PLTT_SIZE);\n    CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE);\n    BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, RGB(31, 0, 0));\n    taskId = CreateTask(TrySweetScentEncounter, 0);\n    gTasks[taskId].data[0] = 0;\n    FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT);\n}\n\nstatic void TrySweetScentEncounter(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (!gPaletteFade.active)\n    {\n        if (data[0] == 64)\n        {\n            data[0] = 0;\n            if (SweetScentWildEncounter() == TRUE)\n            {\n                Free(sPlttBufferBak);\n                DestroyTask(taskId);\n            }\n            else\n            {\n                gTasks[taskId].func = FailSweetScentEncounter;\n                BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, RGB(31, 0, 0));\n            }\n        }\n        else\n        {\n            data[0]++;\n        }\n    }\n}\n\nstatic void FailSweetScentEncounter(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        CpuFastCopy(sPlttBufferBak, gPlttBufferUnfaded, PLTT_SIZE);\n        WeatherProcessingIdle();\n        Free(sPlttBufferBak);\n        ScriptContext_SetupScript(EventScript_FailSweetScent);\n        DestroyTask(taskId);\n    }\n}\n"
  },
  {
    "path": "src/fldeff_teleport.c",
    "content": "#include \"global.h\"\n#include \"field_effect.h\"\n#include \"field_player_avatar.h\"\n#include \"fldeff.h\"\n#include \"party_menu.h\"\n#include \"overworld.h\"\n\nstatic void FieldCallback_Teleport(void);\nstatic void StartTeleportFieldEffect(void);\n\nbool8 SetUpFieldMove_Teleport(void)\n{\n    if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)\n    {\n        gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;\n        gPostMenuFieldCallback = FieldCallback_Teleport;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void FieldCallback_Teleport(void)\n{\n    Overworld_ResetStateAfterTeleport();\n    FieldEffectStart(FLDEFF_USE_TELEPORT);\n    gFieldEffectArguments[0] = (u32)GetCursorSelectionMonId();\n}\n\nbool8 FldEff_UseTeleport(void)\n{\n    u8 taskId = CreateFieldEffectShowMon();\n    FLDEFF_SET_FUNC_TO_DATA(StartTeleportFieldEffect);\n    SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);\n    return FALSE;\n}\n\nstatic void StartTeleportFieldEffect(void)\n{\n    FieldEffectActiveListRemove(FLDEFF_USE_TELEPORT);\n    CreateTeleportFieldEffectTask();\n}\n"
  },
  {
    "path": "src/gpu_regs.c",
    "content": "#include \"global.h\"\n\n#define GPU_REG_BUF_SIZE 0x60\n\n#define GPU_REG_BUF(offset) (*(u16 *)(&sGpuRegBuffer[offset]))\n#define GPU_REG(offset) (*(vu16 *)(REG_BASE + offset))\n\n#define EMPTY_SLOT 0xFF\n\nstatic u8 sGpuRegBuffer[GPU_REG_BUF_SIZE];\nstatic u8 sGpuRegWaitingList[GPU_REG_BUF_SIZE];\nstatic volatile bool8 sGpuRegBufferLocked;\nstatic volatile bool8 sShouldSyncRegIE;\nstatic vu16 sRegIE;\n\nstatic void CopyBufferedValueToGpuReg(u8 regOffset);\nstatic void SyncRegIE(void);\nstatic void UpdateRegDispstatIntrBits(u16 regIE);\n\nvoid InitGpuRegManager(void)\n{\n\ts32 i;\n\n\tfor (i = 0; i < GPU_REG_BUF_SIZE; i++)\n    {\n\t\tsGpuRegBuffer[i] = 0;\n\t\tsGpuRegWaitingList[i] = EMPTY_SLOT;\n\t}\n\n\tsGpuRegBufferLocked = FALSE;\n\tsShouldSyncRegIE = FALSE;\n\tsRegIE = 0;\n}\n\nstatic void CopyBufferedValueToGpuReg(u8 regOffset)\n{\n\tif (regOffset == REG_OFFSET_DISPSTAT)\n    {\n\t\tREG_DISPSTAT &= ~(DISPSTAT_HBLANK_INTR | DISPSTAT_VBLANK_INTR);\n\t\tREG_DISPSTAT |= GPU_REG_BUF(REG_OFFSET_DISPSTAT);\n\t}\n\telse\n    {\n\t\tGPU_REG(regOffset) = GPU_REG_BUF(regOffset);\n\t}\n}\n\nvoid CopyBufferedValuesToGpuRegs(void)\n{\n\tif (!sGpuRegBufferLocked)\n    {\n\t\ts32 i;\n\n\t\tfor (i = 0; i < GPU_REG_BUF_SIZE; i++)\n        {\n\t\t\tu8 regOffset = sGpuRegWaitingList[i];\n\t\t\tif (regOffset == EMPTY_SLOT)\n\t\t\t\treturn;\n\t\t\tCopyBufferedValueToGpuReg(regOffset);\n\t\t\tsGpuRegWaitingList[i] = EMPTY_SLOT;\n\t\t}\n\t}\n}\n\nvoid SetGpuReg(u8 regOffset, u16 value)\n{\n\tif (regOffset < GPU_REG_BUF_SIZE)\n\t{\n\t\tu16 vcount;\n\n\t\tGPU_REG_BUF(regOffset) = value;\n\t\tvcount = REG_VCOUNT & 0xFF;\n\n\t\tif ((vcount >= 161 && vcount <= 225)\n\t\t || (REG_DISPCNT & DISPCNT_FORCED_BLANK)) {\n\t\t\tCopyBufferedValueToGpuReg(regOffset);\n\t\t} else {\n\t\t\ts32 i;\n\n\t\t\tsGpuRegBufferLocked = TRUE;\n\n\t\t\tfor (i = 0; i < GPU_REG_BUF_SIZE && sGpuRegWaitingList[i] != EMPTY_SLOT; i++) {\n\t\t\t\tif (sGpuRegWaitingList[i] == regOffset) {\n\t\t\t\t\tsGpuRegBufferLocked = FALSE;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsGpuRegWaitingList[i] = regOffset;\n\t\t\tsGpuRegBufferLocked = FALSE;\n\t\t}\n\t}\n}\n\nu16 GetGpuReg(u8 regOffset)\n{\n\tif (regOffset == REG_OFFSET_DISPSTAT)\n\t\treturn REG_DISPSTAT;\n\n\tif (regOffset == REG_OFFSET_VCOUNT)\n\t\treturn REG_VCOUNT;\n\n\treturn GPU_REG_BUF(regOffset);\n}\n\nvoid SetGpuRegBits(u8 regOffset, u16 mask)\n{\n\tu16 regValue = GPU_REG_BUF(regOffset);\n\tSetGpuReg(regOffset, regValue | mask);\n}\n\nvoid ClearGpuRegBits(u8 regOffset, u16 mask)\n{\n\tu16 regValue = GPU_REG_BUF(regOffset);\n\tSetGpuReg(regOffset, regValue & ~mask);\n}\n\nstatic void SyncRegIE(void)\n{\n\tif (sShouldSyncRegIE) {\n\t\tu16 temp = REG_IME;\n\t\tREG_IME = 0;\n\t\tREG_IE = sRegIE;\n\t\tREG_IME = temp;\n\t\tsShouldSyncRegIE = FALSE;\n\t}\n}\n\nvoid EnableInterrupts(u16 mask)\n{\n\tsRegIE |= mask;\n\tsShouldSyncRegIE = TRUE;\n\tSyncRegIE();\n\tUpdateRegDispstatIntrBits(sRegIE);\n}\n\nvoid DisableInterrupts(u16 mask)\n{\n\tsRegIE &= ~mask;\n\tsShouldSyncRegIE = TRUE;\n\tSyncRegIE();\n\tUpdateRegDispstatIntrBits(sRegIE);\n}\n\nstatic void UpdateRegDispstatIntrBits(u16 regIE)\n{\n\tu16 oldValue = GetGpuReg(REG_OFFSET_DISPSTAT) & (DISPSTAT_HBLANK_INTR | DISPSTAT_VBLANK_INTR);\n\tu16 newValue = 0;\n\n\tif (regIE & INTR_FLAG_VBLANK)\n\t\tnewValue |= DISPSTAT_VBLANK_INTR;\n\n\tif (regIE & INTR_FLAG_HBLANK)\n\t\tnewValue |= DISPSTAT_HBLANK_INTR;\n\n\tif (oldValue != newValue)\n\t\tSetGpuReg(REG_OFFSET_DISPSTAT, newValue);\n}\n"
  },
  {
    "path": "src/graphics.c",
    "content": "#include \"global.h\"\n\nconst u32 gBattleInterface_Textbox_Gfx[] = INCBIN_U32(\"graphics/battle_interface/textbox.4bpp.lz\");\nconst u32 gBattleInterface_Textbox_Pal[] = INCBIN_U32(\"graphics/battle_interface/textbox.gbapal.lz\");\nconst u32 gBattleInterface_Textbox_Tilemap[] = INCBIN_U32(\"graphics/battle_interface/textbox.bin.lz\");\n\nconst u32 gMonFrontPic_CircledQuestionMark[] = INCBIN_U32(\"graphics/pokemon/question_mark/circled/front.4bpp.lz\");\nconst u32 gMonBackPic_CircledQuestionMark[] = INCBIN_U32(\"graphics/pokemon/question_mark/circled/back.4bpp.lz\");\nconst u32 gMonPalette_CircledQuestionMark[] = INCBIN_U32(\"graphics/pokemon/question_mark/circled/normal.gbapal.lz\");\nconst u32 gMonShinyPalette_CircledQuestionMark[] = INCBIN_U32(\"graphics/pokemon/question_mark/circled/shiny.gbapal.lz\");\n\n// From Ruby.\nconst u32 gUnusedGfx_OldCharmap[] = INCBIN_U32(\"graphics/unused/old_charmap.4bpp.lz\");\nconst u32 gUnusedTimemap_OldCharmap[] = INCBIN_U32(\"graphics/unused/old_charmap.bin.lz\");\nconst u32 gUnusedPal_OldCharmap[] = INCBIN_U32(\"graphics/unused/old_charmap.gbapal.lz\");\n\nconst u32 gSmokescreenImpactTiles[] = INCBIN_U32(\"graphics/battle_anims/sprites/smokescreen_impact.4bpp.lz\");\nconst u32 gSmokescreenImpactPalette[] = INCBIN_U32(\"graphics/battle_anims/sprites/smokescreen_impact.gbapal.lz\");\n\n#include \"data/graphics/interface_pokeballs.h\"\n\nconst u32 gBlankGfxCompressed[] = INCBIN_U32(\"graphics/interface/blank.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Bubble[] = INCBIN_U32(\"graphics/battle_anims/sprites/bubble.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Bone[] = INCBIN_U32(\"graphics/battle_anims/sprites/bone.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_AirWave[] = INCBIN_U32(\"graphics/battle_anims/sprites/air_wave.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Orb[] = INCBIN_U32(\"graphics/battle_anims/sprites/orb.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Sword[] = INCBIN_U32(\"graphics/battle_anims/sprites/sword.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Seed[] = INCBIN_U32(\"graphics/battle_anims/sprites/seed.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_RainDrops[] = INCBIN_U32(\"graphics/battle_anims/sprites/rain_drops.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Bone[] = INCBIN_U32(\"graphics/battle_anims/sprites/bone.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_AirWave[] = INCBIN_U32(\"graphics/battle_anims/sprites/air_wave.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Orb[] = INCBIN_U32(\"graphics/battle_anims/sprites/orb.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Sword[] = INCBIN_U32(\"graphics/battle_anims/sprites/sword.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Seed[] = INCBIN_U32(\"graphics/battle_anims/sprites/seed.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Needle[] = INCBIN_U32(\"graphics/battle_anims/sprites/needle.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Needle[] = INCBIN_U32(\"graphics/battle_anims/sprites/needle.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Explosion6[] = INCBIN_U32(\"graphics/battle_anims/sprites/explosion_6.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Explosion6[] = INCBIN_U32(\"graphics/battle_anims/sprites/explosion_6.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PinkOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/pink_orb.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PinkOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/pink_orb.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_IceCube[] = INCBIN_U32(\"graphics/battle_anims/sprites/ice_cube.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_IceCube[] = INCBIN_U32(\"graphics/battle_anims/sprites/ice_cube.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Gust[] = INCBIN_U32(\"graphics/battle_anims/sprites/gust.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Gust[] = INCBIN_U32(\"graphics/battle_anims/sprites/gust.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Spark2[] = INCBIN_U32(\"graphics/battle_anims/sprites/spark_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Spark2[] = INCBIN_U32(\"graphics/battle_anims/sprites/spark_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Orange[] = INCBIN_U32(\"graphics/battle_anims/sprites/orange.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Orange[] = INCBIN_U32(\"graphics/battle_anims/sprites/orange.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Spikes[] = INCBIN_U32(\"graphics/battle_anims/sprites/spikes.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Spikes[] = INCBIN_U32(\"graphics/battle_anims/sprites/spikes.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_YellowBall[] = INCBIN_U32(\"graphics/battle_anims/sprites/yellow_ball.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_YellowBall[] = INCBIN_U32(\"graphics/battle_anims/sprites/yellow_ball.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_TiedBag[] = INCBIN_U32(\"graphics/battle_anims/sprites/tied_bag.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_TiedBag[] = INCBIN_U32(\"graphics/battle_anims/sprites/tied_bag.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_BlackSmoke[] = INCBIN_U32(\"graphics/battle_anims/sprites/black_smoke.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_BlackSmoke[] = INCBIN_U32(\"graphics/battle_anims/sprites/black_smoke.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_BlackBall[] = INCBIN_U32(\"graphics/battle_anims/sprites/black_ball.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_BlackBall[] = INCBIN_U32(\"graphics/battle_anims/sprites/black_ball.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_Glass[] = INCBIN_U32(\"graphics/battle_anims/sprites/glass.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_Glass[] = INCBIN_U32(\"graphics/battle_anims/sprites/glass.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_HornHit[] = INCBIN_U32(\"graphics/battle_anims/sprites/horn_hit.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_HornHit[] = INCBIN_U32(\"graphics/battle_anims/sprites/horn_hit.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_BlueShards[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_shards.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_BlueShards[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_shards.4bpp.lz\");\n\nconst u32 gUnused_BattleSpritePalette_023[] = INCBIN_U32(\"graphics/unused/battle_anim_023.gbapal.lz\");\n\nconst u32 gUnusedGfx_MusicNotes[] = INCBIN_U32(\"graphics/unused/music_notes.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_Hit[] = INCBIN_U32(\"graphics/battle_anims/sprites/hit.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_Hit[] = INCBIN_U32(\"graphics/battle_anims/sprites/hit.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_Hit2[] = INCBIN_U32(\"graphics/battle_anims/sprites/hit_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_WavingHand[] = INCBIN_U32(\"graphics/battle_anims/sprites/waving_hand.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_WavingHand[] = INCBIN_U32(\"graphics/battle_anims/sprites/waving_hand.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_ClosingEye[] = INCBIN_U32(\"graphics/battle_anims/sprites/closing_eye.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_ClosingEye[] = INCBIN_U32(\"graphics/battle_anims/sprites/closing_eye.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_BlueStar[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_star.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_BlueStar[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_star.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_BubbleBurst[] = INCBIN_U32(\"graphics/battle_anims/sprites/bubble_burst.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_BubbleBurst[] = INCBIN_U32(\"graphics/battle_anims/sprites/bubble_burst.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_HitDuplicate[] = INCBIN_U32(\"graphics/battle_anims/sprites/hit_duplicate.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_HitDuplicate[] = INCBIN_U32(\"graphics/battle_anims/sprites/hit_duplicate.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_Leer[] = INCBIN_U32(\"graphics/battle_anims/sprites/leer.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_Leer[] = INCBIN_U32(\"graphics/battle_anims/sprites/leer.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_BlueBurst[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_burst.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_BlueBurst[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_burst.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SmallEmber[] = INCBIN_U32(\"graphics/battle_anims/sprites/small_ember.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SmallEmber[] = INCBIN_U32(\"graphics/battle_anims/sprites/small_ember.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_GraySmoke[] = INCBIN_U32(\"graphics/battle_anims/sprites/gray_smoke.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_GraySmoke[] = INCBIN_U32(\"graphics/battle_anims/sprites/gray_smoke.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_Fire[] = INCBIN_U32(\"graphics/battle_anims/sprites/fire.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_Fire[] = INCBIN_U32(\"graphics/battle_anims/sprites/fire.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SpinningFire[] = INCBIN_U32(\"graphics/battle_anims/sprites/spinning_fire.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_FirePlume[] = INCBIN_U32(\"graphics/battle_anims/sprites/fire_plume.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_Lightning2[] = INCBIN_U32(\"graphics/battle_anims/sprites/lightning_2.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_Lightning2[] = INCBIN_U32(\"graphics/battle_anims/sprites/lightning_2.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Lightning[] = INCBIN_U32(\"graphics/battle_anims/sprites/lightning.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SpinningBall[] = INCBIN_U32(\"graphics/battle_anims/unused/spinning_ball.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SpinningBall[] = INCBIN_U32(\"graphics/battle_anims/unused/spinning_ball.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_SpinningBall2[] = INCBIN_U32(\"graphics/battle_anims/unused/spinning_ball_2.gbapal.lz\");\n\n// old battle interface data, unused\nconst u32 gOldBattleInterfaceGfx[] = INCBIN_U32(\"graphics/unused/obi1.4bpp.lz\");\nconst u32 gOldBattleInterfacePal_1_2_3[] = INCBIN_U32(\"graphics/unused/obi_palpak1.gbapal.lz\"); // palettes 1-3\nconst u32 gOldBattleInterfacePal4[] = INCBIN_U32(\"graphics/unused/old_pal4.gbapal.lz\"); // 4 is by itself\nconst u32 gOldBattleInterfacePal_5_6_7[] = INCBIN_U32(\"graphics/unused/obi_palpak3.gbapal.lz\"); // palettes 5-7\nconst u32 gOldBattleInterfaceGfx2[] = INCBIN_U32(\"graphics/unused/obi2.4bpp.lz\");\nconst u32 gOldBattleInterfaceTilemap[] = INCBIN_U32(\"graphics/unused/old_battle_interface_tilemap.bin.lz\");\n\nconst u32 gBattleAnimSpritePal_ClawSlash2[] = INCBIN_U32(\"graphics/battle_anims/sprites/claw_slash_2.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_ClawSlash[] = INCBIN_U32(\"graphics/battle_anims/sprites/claw_slash.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_ClawSlash2[] = INCBIN_U32(\"graphics/battle_anims/sprites/claw_slash_2.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_ClawSlash[] = INCBIN_U32(\"graphics/battle_anims/sprites/claw_slash.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Scratch3[] = INCBIN_U32(\"graphics/battle_anims/sprites/scratch_3.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Scratch2[] = INCBIN_U32(\"graphics/battle_anims/sprites/scratch_2.4bpp.lz\");\n\nconst u32 gUnusedHpBar_Gfx[] = INCBIN_U32(\"graphics/interface/hpbar_unused.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_BubbleBurst2[] = INCBIN_U32(\"graphics/battle_anims/sprites/bubble_burst_2.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_BubbleBurst2[] = INCBIN_U32(\"graphics/battle_anims/sprites/bubble_burst_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_IceChunk[] = INCBIN_U32(\"graphics/battle_anims/sprites/ice_chunk.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_IceChunk[] = INCBIN_U32(\"graphics/battle_anims/sprites/ice_chunk.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_Glass2[] = INCBIN_U32(\"graphics/battle_anims/sprites/glass_2.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_Glass2[] = INCBIN_U32(\"graphics/battle_anims/sprites/glass_2.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_PinkHeart2[] = INCBIN_U32(\"graphics/battle_anims/sprites/pink_heart_2.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_PinkHeart2[] = INCBIN_U32(\"graphics/battle_anims/sprites/pink_heart_2.4bpp.lz\");\n\nconst u32 gInterfaceGfx_UnusedWindow[] = INCBIN_U32(\"graphics/battle_interface/unused_window.4bpp.lz\");\nconst u32 gInterfacePal_UnusedWindow[] = INCBIN_U32(\"graphics/battle_interface/unused_window.gbapal.lz\");\n\nconst u32 gInterfaceGfx_HPNumbers[] = INCBIN_U32(\"graphics/interface/hp_numbers.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SapDrip[] = INCBIN_U32(\"graphics/battle_anims/sprites/sap_drip.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SapDrip[] = INCBIN_U32(\"graphics/battle_anims/sprites/sap_drip.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_SapDrip2[] = INCBIN_U32(\"graphics/battle_anims/sprites/sap_drip_2.gbapal.lz\");\n\nconst u32 gUnusedGfx_Window2[] = INCBIN_U32(\"graphics/battle_interface/unused_window2.4bpp.lz\");\nconst u32 gUnusedGfx_Window2Bar[] = INCBIN_U32(\"graphics/battle_interface/unused_window2bar.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Sparkle1[] = INCBIN_U32(\"graphics/battle_anims/sprites/sparkle_1.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Sparkle1[] = INCBIN_U32(\"graphics/battle_anims/sprites/sparkle_1.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_Sparkle2[] = INCBIN_U32(\"graphics/battle_anims/sprites/sparkle_2.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_HumanoidFoot[] = INCBIN_U32(\"graphics/battle_anims/sprites/humanoid_foot.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_HumanoidFoot[] = INCBIN_U32(\"graphics/battle_anims/sprites/humanoid_foot.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_MonsterFoot[] = INCBIN_U32(\"graphics/battle_anims/sprites/monster_foot.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_HumanoidHand[] = INCBIN_U32(\"graphics/battle_anims/sprites/humanoid_hand.4bpp.lz\");\n\nconst u32 gUnusedGfx_LineSketch[] = INCBIN_U32(\"graphics/unused/line_sketch.4bpp.lz\");\nconst u32 gUnusedPal_LineSketch[] = INCBIN_U32(\"graphics/unused/line_sketch.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_YellowUnk[] = INCBIN_U32(\"graphics/battle_anims/sprites/yellow_unk.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_YellowUnk[] = INCBIN_U32(\"graphics/battle_anims/sprites/yellow_unk.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SlamHit[] = INCBIN_U32(\"graphics/battle_anims/sprites/slam_hit.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SlamHit[] = INCBIN_U32(\"graphics/battle_anims/sprites/slam_hit.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_RedFist[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_fist.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Ring[] = INCBIN_U32(\"graphics/battle_anims/sprites/ring.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Ring[] = INCBIN_U32(\"graphics/battle_anims/sprites/ring.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Rocks[] = INCBIN_U32(\"graphics/battle_anims/sprites/rocks.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Rocks[] = INCBIN_U32(\"graphics/battle_anims/sprites/rocks.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Z[] = INCBIN_U32(\"graphics/battle_anims/sprites/z.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Z[] = INCBIN_U32(\"graphics/battle_anims/sprites/z.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_YellowUnk2[] = INCBIN_U32(\"graphics/battle_anims/sprites/yellow_unk_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_YellowUnk2[] = INCBIN_U32(\"graphics/battle_anims/sprites/yellow_unk_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_AirSlash[] = INCBIN_U32(\"graphics/battle_anims/sprites/air_slash.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_AirSlash[] = INCBIN_U32(\"graphics/battle_anims/sprites/air_slash.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SpinningGreenOrbs[] = INCBIN_U32(\"graphics/battle_anims/sprites/spinning_green_orbs.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SpinningGreenOrbs[] = INCBIN_U32(\"graphics/battle_anims/sprites/spinning_green_orbs.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Leaf[] = INCBIN_U32(\"graphics/battle_anims/sprites/leaf.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Leaf[] = INCBIN_U32(\"graphics/battle_anims/sprites/leaf.gbapal.lz\");\n\nconst u32 gUnusedGfx_Metronome[] = INCBIN_U32(\"graphics/unused/metronome_hand_small.4bpp.lz\"); // unused, was for metronome at one point\n\nconst u32 gBattleAnimSpritePal_Clapping[] = INCBIN_U32(\"graphics/battle_anims/sprites/clapping.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PoisonPowder[] = INCBIN_U32(\"graphics/battle_anims/sprites/poison_powder.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PoisonPowder[] = INCBIN_U32(\"graphics/battle_anims/sprites/poison_powder.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_BrownTriangle[] = INCBIN_U32(\"graphics/battle_anims/sprites/brown_triangle.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_BrownTriangle[] = INCBIN_U32(\"graphics/battle_anims/sprites/brown_triangle.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Sparkle3[] = INCBIN_U32(\"graphics/battle_anims/sprites/sparkle_3.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Sparkle3[] = INCBIN_U32(\"graphics/battle_anims/sprites/sparkle_3.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Sparkle4[] = INCBIN_U32(\"graphics/battle_anims/sprites/sparkle_4.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_MusicNotes[] = INCBIN_U32(\"graphics/battle_anims/sprites/music_notes.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_MusicNotes[] = INCBIN_U32(\"graphics/battle_anims/sprites/music_notes.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Duck[] = INCBIN_U32(\"graphics/battle_anims/sprites/duck.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Duck[] = INCBIN_U32(\"graphics/battle_anims/sprites/duck.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Alert[] = INCBIN_U32(\"graphics/battle_anims/sprites/alert.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Alert[] = INCBIN_U32(\"graphics/battle_anims/sprites/alert.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Shock4[] = INCBIN_U32(\"graphics/battle_anims/sprites/shock_4.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Shock4[] = INCBIN_U32(\"graphics/battle_anims/sprites/shock_4.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Shock[] = INCBIN_U32(\"graphics/battle_anims/sprites/shock.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Bell2[] = INCBIN_U32(\"graphics/battle_anims/sprites/bell_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Bell2[] = INCBIN_U32(\"graphics/battle_anims/sprites/bell_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PinkGlove[] = INCBIN_U32(\"graphics/battle_anims/sprites/pink_glove.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PinkGlove[] = INCBIN_U32(\"graphics/battle_anims/sprites/pink_glove.gbapal.lz\");\n\nconst u16 gBattleAnimUnused_Unknown1[] = INCBIN_U16(\"graphics/battle_anims/unused/unknown_1.bin\");\nconst u16 gBattleAnimUnused_Unknown2[] = INCBIN_U16(\"graphics/battle_anims/unused/unknown_2.bin\");\nconst u16 gBattleAnimUnused_Unknown3[] = INCBIN_U16(\"graphics/battle_anims/unused/unknown_3.bin\");\n\nconst u32 gBattleAnimUnusedGfx_LineSketch2[] = INCBIN_U32(\"graphics/battle_anims/unused/line_sketch_2.8bpp.lz\");\nconst u16 gBattleAnimUnusedPal_LineSketch2[] = INCBIN_U16(\"graphics/battle_anims/unused/line_sketch_2.gbapal.lz\");\nconst u32 gBattleAnimUnusedTilemap_LineSketch2[] = INCBIN_U32(\"graphics/battle_anims/unused/line_sketch_2.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_BlueLines[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_lines.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_BlueLines[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_lines.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_Impact3[] = INCBIN_U32(\"graphics/battle_anims/sprites/impact_3.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Impact2[] = INCBIN_U32(\"graphics/battle_anims/sprites/impact_2.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Reticle[] = INCBIN_U32(\"graphics/battle_anims/sprites/reticle.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Breath[] = INCBIN_U32(\"graphics/battle_anims/sprites/breath.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Snowball[] = INCBIN_U32(\"graphics/battle_anims/sprites/snowball.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Vine[] = INCBIN_U32(\"graphics/battle_anims/sprites/vine.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Sword2[] = INCBIN_U32(\"graphics/battle_anims/sprites/sword_2.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_RedTube[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_tube.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Amnesia[] = INCBIN_U32(\"graphics/battle_anims/sprites/amnesia.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_String2[] = INCBIN_U32(\"graphics/battle_anims/sprites/string_2.gbapal.lz\");\n\nconst u32 gBattleAnimUnused_Unknown4[] = INCBIN_U32(\"graphics/battle_anims/unused/unknown_4.bin.lz\");\n\nconst u32 gBattleAnimSpritePal_Pencil2[] = INCBIN_U32(\"graphics/battle_anims/sprites/pencil_2.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Petal[] = INCBIN_U32(\"graphics/battle_anims/sprites/petal.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_BentSpoon[] = INCBIN_U32(\"graphics/battle_anims/sprites/bent_spoon.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_Coin[] = INCBIN_U32(\"graphics/battle_anims/sprites/coin.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_CrackedEgg[] = INCBIN_U32(\"graphics/battle_anims/sprites/cracked_egg.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_FreshEgg[] = INCBIN_U32(\"graphics/battle_anims/sprites/fresh_egg.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Impact3[] = INCBIN_U32(\"graphics/battle_anims/sprites/impact_3.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Impact2[] = INCBIN_U32(\"graphics/battle_anims/sprites/impact_2.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Reticle[] = INCBIN_U32(\"graphics/battle_anims/sprites/reticle.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Breath[] = INCBIN_U32(\"graphics/battle_anims/sprites/breath.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Snowball[] = INCBIN_U32(\"graphics/battle_anims/sprites/snowball.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Vine[] = INCBIN_U32(\"graphics/battle_anims/sprites/vine.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Sword2[] = INCBIN_U32(\"graphics/battle_anims/sprites/sword_2.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Clapping[] = INCBIN_U32(\"graphics/battle_anims/sprites/clapping.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_RedTube[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_tube.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Amnesia[] = INCBIN_U32(\"graphics/battle_anims/sprites/amnesia.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_String2[] = INCBIN_U32(\"graphics/battle_anims/sprites/string_2.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Pencil2[] = INCBIN_U32(\"graphics/battle_anims/sprites/pencil_2.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Petal[] = INCBIN_U32(\"graphics/battle_anims/sprites/petal.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_BentSpoon[] = INCBIN_U32(\"graphics/battle_anims/sprites/bent_spoon.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Web[] = INCBIN_U32(\"graphics/battle_anims/sprites/web.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Coin[] = INCBIN_U32(\"graphics/battle_anims/sprites/coin.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_CrackedEgg[] = INCBIN_U32(\"graphics/battle_anims/sprites/cracked_egg.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_HatchedEgg[] = INCBIN_U32(\"graphics/battle_anims/sprites/hatched_egg.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_FreshEgg[] = INCBIN_U32(\"graphics/battle_anims/sprites/fresh_egg.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Fangs[] = INCBIN_U32(\"graphics/battle_anims/sprites/fangs.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Fangs[] = INCBIN_U32(\"graphics/battle_anims/sprites/fangs.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Explosion2[] = INCBIN_U32(\"graphics/battle_anims/sprites/explosion_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Explosion2[] = INCBIN_U32(\"graphics/battle_anims/sprites/explosion_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Explosion3[] = INCBIN_U32(\"graphics/battle_anims/sprites/explosion_3.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_WaterDroplet[] = INCBIN_U32(\"graphics/battle_anims/sprites/water_droplet.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_WaterDroplet[] = INCBIN_U32(\"graphics/battle_anims/sprites/water_droplet.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_WaterDroplet2[] = INCBIN_U32(\"graphics/battle_anims/sprites/water_droplet_2.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Seed2[] = INCBIN_U32(\"graphics/battle_anims/sprites/seed_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Seed2[] = INCBIN_U32(\"graphics/battle_anims/sprites/seed_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Sprout[] = INCBIN_U32(\"graphics/battle_anims/sprites/sprout.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_RedWand[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_wand.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_RedWand[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_wand.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PurpleGreenUnk[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_green_unk.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PurpleGreenUnk[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_green_unk.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_WaterColumn[] = INCBIN_U32(\"graphics/battle_anims/sprites/water_column.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_WaterColumn[] = INCBIN_U32(\"graphics/battle_anims/sprites/water_column.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_MudUnk[] = INCBIN_U32(\"graphics/battle_anims/sprites/mud_unk.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_MudUnk[] = INCBIN_U32(\"graphics/battle_anims/sprites/mud_unk.gbapal.lz\");\n\nconst u32 gUnusedTilemap_BlueFrame[] = INCBIN_U32(\"graphics/unused/blue_frame.bin.lz\"); // P1, P2, P3 and P4 tilemaps?\nconst u32 gUnusedTilemap_RedYellowGreenFrame[] = INCBIN_U32(\"graphics/unused/redyellowgreen_frame.bin.lz\");\nconst u32 gUnusedGfx_ColorFrames[] = INCBIN_U32(\"graphics/unused/color_frames.4bpp.lz\");\nconst u32 gUnusedPal_ColorFrames[] = INCBIN_U32(\"graphics/unused/color_frames.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_RainDrops[] = INCBIN_U32(\"graphics/battle_anims/sprites/rain_drops.4bpp.lz\");\n\nconst u32 gUnusedGfx8bpp_WaterSplash [] = INCBIN_U32(\"graphics/unused/water_splash.8bpp.lz\");\nconst u32 gUnusedTilemap_WaterSplash[] = INCBIN_U32(\"graphics/unused/water_splash.bin.lz\");\nconst u32 gUnusedPalette_WaterSplash[] = INCBIN_U32(\"graphics/unused/water_splash.gbapal.lz\");\n\nconst u32 gUnusedGfx_BasicFrame[] = INCBIN_U32(\"graphics/unused/basic_frame.4bpp.lz\");\nconst u32 gUnusedPal_BasicFrame[] = INCBIN_U32(\"graphics/unused/basic_frame.gbapal.lz\");\nconst u32 gUnusedTilemap_BasicFrame[] = INCBIN_U32(\"graphics/unused/basic_frame.bin.lz\");\n\nconst u16 gBattleInterface_Healthbox_Pal[] = INCBIN_U16(\"graphics/battle_interface/healthbox.gbapal\");\nconst u16 gBattleInterface_Healthbar_Pal[] = INCBIN_U16(\"graphics/battle_interface/healthbar.gbapal\");\nconst u8 gBattleInterface_Gfx[] = INCBIN_U8(\"graphics/battle_interface/healthbox_elements.4bpp\");\n\nconst u32 gBattleInterfaceGfx_UnusedWindow3[] = INCBIN_U32(\"graphics/battle_interface/unused_window3.4bpp.lz\");\nconst u32 gBattleInterfaceGfx_UnusedWindow4[] = INCBIN_U32(\"graphics/battle_interface/unused_window4.4bpp.lz\");\n\nconst u8 gNuzlockeFirstEncounterIndicator[] = INCBIN_U8(\"graphics/battle_interface/nuzlocke_indicator.4bpp\");\n\nconst u32 gBattleAnimSpriteGfx_FurySwipes[] = INCBIN_U32(\"graphics/battle_anims/sprites/fury_swipes.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_FurySwipes[] = INCBIN_U32(\"graphics/battle_anims/sprites/fury_swipes.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Vine2[] = INCBIN_U32(\"graphics/battle_anims/sprites/vine_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Vine2[] = INCBIN_U32(\"graphics/battle_anims/sprites/vine_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Teeth[] = INCBIN_U32(\"graphics/battle_anims/sprites/teeth.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Teeth[] = INCBIN_U32(\"graphics/battle_anims/sprites/teeth.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Bone2[] = INCBIN_U32(\"graphics/battle_anims/sprites/bone_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Bone2[] = INCBIN_U32(\"graphics/battle_anims/sprites/bone_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_WhiteBag[] = INCBIN_U32(\"graphics/battle_anims/sprites/white_bag.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_WhiteBag[] = INCBIN_U32(\"graphics/battle_anims/sprites/white_bag.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Unknown[] = INCBIN_U32(\"graphics/battle_anims/sprites/unknown.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Unknown[] = INCBIN_U32(\"graphics/battle_anims/sprites/unknown.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PurpleCoral[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_coral.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PurpleCoral[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_coral.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PurpleDroplet[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_droplet.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Shock2[] = INCBIN_U32(\"graphics/battle_anims/sprites/shock_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Shock2[] = INCBIN_U32(\"graphics/battle_anims/sprites/shock_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_ClosingEye2[] = INCBIN_U32(\"graphics/battle_anims/sprites/closing_eye_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_ClosingEye2[] = INCBIN_U32(\"graphics/battle_anims/sprites/closing_eye_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_MetalBall[] = INCBIN_U32(\"graphics/battle_anims/sprites/metal_ball.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_MetalBall[] = INCBIN_U32(\"graphics/battle_anims/sprites/metal_ball.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_MonsterDoll[] = INCBIN_U32(\"graphics/battle_anims/sprites/monster_doll.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_MonsterDoll[] = INCBIN_U32(\"graphics/battle_anims/sprites/monster_doll.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Whirlwind[] = INCBIN_U32(\"graphics/battle_anims/sprites/whirlwind.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Whirlwind[] = INCBIN_U32(\"graphics/battle_anims/sprites/whirlwind.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Whirlwind2[] = INCBIN_U32(\"graphics/battle_anims/sprites/whirlwind_2.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Explosion4[] = INCBIN_U32(\"graphics/battle_anims/sprites/explosion_4.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Explosion4[] = INCBIN_U32(\"graphics/battle_anims/sprites/explosion_4.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Explosion5[] = INCBIN_U32(\"graphics/battle_anims/sprites/explosion_5.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Tongue[] = INCBIN_U32(\"graphics/battle_anims/sprites/tongue.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Tongue[] = INCBIN_U32(\"graphics/battle_anims/sprites/tongue.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Smoke[] = INCBIN_U32(\"graphics/battle_anims/sprites/smoke.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Smoke[] = INCBIN_U32(\"graphics/battle_anims/sprites/smoke.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Smoke2[] = INCBIN_U32(\"graphics/battle_anims/sprites/smoke_2.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_BlueFlames[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_flames.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_BlueFlames[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_flames.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_BlueFlames2[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_flames_2.4bpp.lz\");\n\n// Contest (unused)\n\nconst u32 gJpContest_Gfx1[] = INCBIN_U32(\"graphics/contest/japanese/composite_1.4bpp.lz\");\nconst u32 gJpContest_Pal[] = INCBIN_U32(\"graphics/contest/japanese/palette.gbapal.lz\");\nconst u32 gJpContest_Bg_Tilemap[] = INCBIN_U32(\"graphics/contest/japanese/bg.bin.lz\");\nconst u32 gJpContest_Windows_Tilemap[] = INCBIN_U32(\"graphics/contest/japanese/windows.bin.lz\");\nconst u32 gJpContest_Numbers_Gfx[] = INCBIN_U32(\"graphics/contest/japanese/numbers.4bpp.lz\");\nconst u32 gJpContest_Numbers_Pal[] = INCBIN_U32(\"graphics/contest/japanese/numbers.gbapal.lz\");\nconst u32 gJpContest_Gfx2[] = INCBIN_U32(\"graphics/contest/japanese/composite_2.4bpp.lz\");\n\nconst u32 gContest_Interface_Pal[] = INCBIN_U32(\"graphics/contest/interface.gbapal.lz\");\nconst u32 gContest_Audience_Tilemap[] = INCBIN_U32(\"graphics/contest/audience.bin.lz\");\nconst u32 gContest_Interface_Tilemap[] = INCBIN_U32(\"graphics/contest/interface.bin.lz\");\n\nconst u32 gJpContest_Interface_Tilemap[] = INCBIN_U32(\"graphics/contest/japanese/interface.bin.lz\");\nconst u32 gJpContest_Audience_Tilemap[] = INCBIN_U32(\"graphics/contest/japanese/audience.bin.lz\");\n\nconst u32 gContest_Curtain_Tilemap[] = INCBIN_U32(\"graphics/contest/curtain.bin.lz\");\nconst u32 gContest_Interface_Gfx[] = INCBIN_U32(\"graphics/contest/interface.4bpp.lz\");\nconst u32 gContest_Audience_Gfx[] = INCBIN_U32(\"graphics/contest/audience.4bpp.lz\");\nconst u32 gContest_Faces_Gfx[] = INCBIN_U32(\"graphics/contest/faces.4bpp.lz\");\nconst u32 gContest_JudgeSymbols_Gfx[] = INCBIN_U32(\"graphics/contest/judge_symbols.4bpp.lz\");\nconst u32 gContest_JudgeSymbols_Pal[] = INCBIN_U32(\"graphics/contest/judge_symbols.gbapal.lz\");\nconst u8 gContest_SliderHeart_Gfx[] = INCBIN_U8(\"graphics/contest/slider_heart.4bpp\");\n\nconst u32 gJpContest_Voltage_Gfx[] = INCBIN_U32(\"graphics/contest/japanese/voltage.4bpp.lz\");\nconst u32 gJpContest_Voltage_Pal[] = INCBIN_U32(\"graphics/contest/japanese/voltage.gbapal.lz\");\n\nconst u32 gJpContestResults_Gfx[] = INCBIN_U32(\"graphics/contest/japanese/results.4bpp.lz\");\n\nconst u32 gContestResults_WinnerBanner_Tilemap[] = INCBIN_U32(\"graphics/contest/results_winner_banner.bin.lz\");\nconst u32 gContestResults_Interface_Tilemap[] = INCBIN_U32(\"graphics/contest/results_interface.bin.lz\");\nconst u32 gContestResults_Bg_Tilemap[] = INCBIN_U32(\"graphics/contest/results_bg.bin.lz\");\nconst u32 gContestResults_Pal[] = INCBIN_U32(\"graphics/contest/results.gbapal.lz\");\n\n\nconst u32 gBattleAnimSpriteGfx_Impact[] = INCBIN_U32(\"graphics/battle_anims/sprites/impact.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Impact[] = INCBIN_U32(\"graphics/battle_anims/sprites/impact.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Particles[] = INCBIN_U32(\"graphics/battle_anims/sprites/particles.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_CircleImpact[] = INCBIN_U32(\"graphics/battle_anims/sprites/circle_impact.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_CircleImpact[] = INCBIN_U32(\"graphics/battle_anims/sprites/circle_impact.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Scratch[] = INCBIN_U32(\"graphics/battle_anims/sprites/scratch.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SharpTeeth[] = INCBIN_U32(\"graphics/battle_anims/sprites/sharp_teeth.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SharpTeeth[] = INCBIN_U32(\"graphics/battle_anims/sprites/sharp_teeth.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Clamp[] = INCBIN_U32(\"graphics/battle_anims/sprites/clamp.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Cut[] = INCBIN_U32(\"graphics/battle_anims/sprites/cut.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_RainbowRings[] = INCBIN_U32(\"graphics/battle_anims/sprites/rainbow_rings.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_RainbowRings[] = INCBIN_U32(\"graphics/battle_anims/sprites/rainbow_rings.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_IceCrystals[] = INCBIN_U32(\"graphics/battle_anims/sprites/ice_crystals.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_IceCrystals[] = INCBIN_U32(\"graphics/battle_anims/sprites/ice_crystals.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_IceSpikes[] = INCBIN_U32(\"graphics/battle_anims/sprites/ice_spikes.4bpp.lz\");\n\nconst u32 gUnusedGfx_OldBeatUp[] = INCBIN_U32(\"graphics/unused/old_beatup.4bpp.lz\");\nconst u32 gUnusedPal_OldBeatUp[] = INCBIN_U32(\"graphics/unused/old_beatup.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Orbs[] = INCBIN_U32(\"graphics/battle_anims/sprites/orbs.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Orbs[] = INCBIN_U32(\"graphics/battle_anims/sprites/orbs.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_WaterOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/water_orb.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_WaterImpact[] = INCBIN_U32(\"graphics/battle_anims/sprites/water_impact.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_WaterImpact[] = INCBIN_U32(\"graphics/battle_anims/sprites/water_impact.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_BrownOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/brown_orb.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_MudSand[] = INCBIN_U32(\"graphics/battle_anims/sprites/mud_sand.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_MudSand[] = INCBIN_U32(\"graphics/battle_anims/sprites/mud_sand.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PoisonBubble[] = INCBIN_U32(\"graphics/battle_anims/sprites/poison_bubble.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PoisonBubble[] = INCBIN_U32(\"graphics/battle_anims/sprites/poison_bubble.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_ToxicBubble[] = INCBIN_U32(\"graphics/battle_anims/sprites/toxic_bubble.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_HornHit2[] = INCBIN_U32(\"graphics/battle_anims/sprites/horn_hit_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_HornHit2[] = INCBIN_U32(\"graphics/battle_anims/sprites/horn_hit_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_AirWave2[] = INCBIN_U32(\"graphics/battle_anims/sprites/air_wave_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_AirWave2[] = INCBIN_U32(\"graphics/battle_anims/sprites/air_wave_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SmallBubbles[] = INCBIN_U32(\"graphics/battle_anims/sprites/small_bubbles.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SmallBubbles[] = INCBIN_U32(\"graphics/battle_anims/sprites/small_bubbles.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_RoundShadow[] = INCBIN_U32(\"graphics/battle_anims/sprites/round_shadow.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_RoundShadow[] = INCBIN_U32(\"graphics/battle_anims/sprites/round_shadow.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Sunlight[] = INCBIN_U32(\"graphics/battle_anims/sprites/sunlight.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Sunlight[] = INCBIN_U32(\"graphics/battle_anims/sprites/sunlight.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Spore[] = INCBIN_U32(\"graphics/battle_anims/sprites/spore.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_Spore[] = INCBIN_U32(\"graphics/battle_anims/sprites/spore.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Flower[] = INCBIN_U32(\"graphics/battle_anims/sprites/flower.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Flower[] = INCBIN_U32(\"graphics/battle_anims/sprites/flower.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_RazorLeaf[] = INCBIN_U32(\"graphics/battle_anims/sprites/razor_leaf.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_RazorLeaf[] = INCBIN_U32(\"graphics/battle_anims/sprites/razor_leaf.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_MistCloud[] = INCBIN_U32(\"graphics/battle_anims/sprites/mist_cloud.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_MistCloud[] = INCBIN_U32(\"graphics/battle_anims/sprites/mist_cloud.gbapal.lz\");\n\nconst u32 gBattleAnimUnusedGfx_Lights[] = INCBIN_U32(\"graphics/battle_anims/unused/lights.4bpp.lz\");\nconst u32 gBattleAnimUnusedPal_Lights[] = INCBIN_U32(\"graphics/battle_anims/unused/lights.gbapal.lz\");\nconst u32 gBattleAnimUnusedTilemap_Lights[] = INCBIN_U32(\"graphics/battle_anims/unused/lights.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_WhirlwindLines[] = INCBIN_U32(\"graphics/battle_anims/sprites/whirlwind_lines.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_WhirlwindLines[] = INCBIN_U32(\"graphics/battle_anims/sprites/whirlwind_lines.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_GoldRing[] = INCBIN_U32(\"graphics/battle_anims/sprites/gold_ring.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_GoldRing[] = INCBIN_U32(\"graphics/battle_anims/sprites/gold_ring.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_BlueRing2[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_ring_2.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_PurpleRing[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_ring.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_BlueRing[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_ring.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_GreenLightWall[] = INCBIN_U32(\"graphics/battle_anims/sprites/green_light_wall.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_GreenLightWall[] = INCBIN_U32(\"graphics/battle_anims/sprites/green_light_wall.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_BlueLightWall[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_light_wall.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_RedLightWall[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_light_wall.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_GrayLightWall[] = INCBIN_U32(\"graphics/battle_anims/sprites/gray_light_wall.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_OrangeLightWall[] = INCBIN_U32(\"graphics/battle_anims/sprites/orange_light_wall.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_BlackBall2[] = INCBIN_U32(\"graphics/battle_anims/sprites/black_ball_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_BlackBall2[] = INCBIN_U32(\"graphics/battle_anims/sprites/black_ball_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_PurpleGasCloud[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_gas_cloud.gbapal.lz\");\n\nconst u32 gContestJudgeGfx[] = INCBIN_U32(\"graphics/contest/judge.4bpp.lz\");\nconst u32 gContestJudgePal[] = INCBIN_U32(\"graphics/contest/judge.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Spark[] = INCBIN_U32(\"graphics/battle_anims/sprites/spark.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Spark[] = INCBIN_U32(\"graphics/battle_anims/sprites/spark.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SparkH[] = INCBIN_U32(\"graphics/battle_anims/sprites/spark_h.4bpp.lz\");\n\nconst u32 gBattleAnimBgImage_Dark[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/dark.4bpp.lz\");\nconst u32 gBattleAnimBgPalette_Dark[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/dark.gbapal.lz\");\nconst u32 gBattleAnimBgTilemap_Dark[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/dark.bin.lz\");\n\nconst u32 gMetalShineGfx[] = INCBIN_U32(\"graphics/battle_anims/masks/metal_shine.4bpp.lz\");\nconst u32 gMetalShinePalette[] = INCBIN_U32(\"graphics/battle_anims/masks/metal_shine.gbapal.lz\");\nconst u32 gMetalShineTilemap[] = INCBIN_U32(\"graphics/battle_anims/masks/metal_shine.bin.lz\");\n\nconst u32 gUnusedGfx_Goosuto[] = INCBIN_U32(\"graphics/unused/goosuto.4bpp.lz\"); // ghost\nconst u32 gUnusedPal_Goosuto[] = INCBIN_U32(\"graphics/unused/goosuto.gbapal.lz\");\nconst u32 gUnusedTilemap_Goosuto[] = INCBIN_U32(\"graphics/unused/goosuto.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_YellowStar[] = INCBIN_U32(\"graphics/battle_anims/sprites/yellow_star.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_YellowStar[] = INCBIN_U32(\"graphics/battle_anims/sprites/yellow_star.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_LargeFreshEgg[] = INCBIN_U32(\"graphics/battle_anims/sprites/large_fresh_egg.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_LargeFreshEgg[] = INCBIN_U32(\"graphics/battle_anims/sprites/large_fresh_egg.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_ShadowBall[] = INCBIN_U32(\"graphics/battle_anims/sprites/shadow_ball.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_ShadowBall[] = INCBIN_U32(\"graphics/battle_anims/sprites/shadow_ball.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Lick[] = INCBIN_U32(\"graphics/battle_anims/sprites/lick.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Lick[] = INCBIN_U32(\"graphics/battle_anims/sprites/lick.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_VoidLines[] = INCBIN_U32(\"graphics/battle_anims/sprites/void_lines.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_VoidLines[] = INCBIN_U32(\"graphics/battle_anims/sprites/void_lines.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_String[] = INCBIN_U32(\"graphics/battle_anims/sprites/string.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_String[] = INCBIN_U32(\"graphics/battle_anims/sprites/string.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_WebThread[] = INCBIN_U32(\"graphics/battle_anims/sprites/web_thread.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_SpiderWeb[] = INCBIN_U32(\"graphics/battle_anims/sprites/spider_web.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Lightbulb[] = INCBIN_U32(\"graphics/battle_anims/sprites/lightbulb.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Lightbulb[] = INCBIN_U32(\"graphics/battle_anims/sprites/lightbulb.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Slash[] = INCBIN_U32(\"graphics/battle_anims/sprites/slash.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Slash[] = INCBIN_U32(\"graphics/battle_anims/sprites/slash.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_FocusEnergy[] = INCBIN_U32(\"graphics/battle_anims/sprites/focus_energy.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_FocusEnergy[] = INCBIN_U32(\"graphics/battle_anims/sprites/focus_energy.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SphereToCube[] = INCBIN_U32(\"graphics/battle_anims/sprites/sphere_to_cube.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SphereToCube[] = INCBIN_U32(\"graphics/battle_anims/sprites/sphere_to_cube.gbapal.lz\");\n\nconst u32 gBattleAnimBgImage_Psychic[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/psychic.4bpp.lz\");\nconst u32 gBattleAnimBgPalette_Psychic[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/psychic.gbapal.lz\");\nconst u32 gBattleAnimBgTilemap_Psychic[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/psychic.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Eye[] = INCBIN_U32(\"graphics/battle_anims/sprites/eye.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Eye[] = INCBIN_U32(\"graphics/battle_anims/sprites/eye.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Tendrils[] = INCBIN_U32(\"graphics/battle_anims/sprites/tendrils.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Tendrils[] = INCBIN_U32(\"graphics/battle_anims/sprites/tendrils.gbapal.lz\");\n\nconst u32 gHealthboxSinglesPlayerGfx[] = INCBIN_U32(\"graphics/battle_interface/healthbox_singles_player.4bpp.lz\");\nconst u32 gHealthboxSinglesOpponentGfx[] = INCBIN_U32(\"graphics/battle_interface/healthbox_singles_opponent.4bpp.lz\");\nconst u32 gHealthboxDoublesPlayerGfx[] = INCBIN_U32( \"graphics/battle_interface/healthbox_doubles_player.4bpp.lz\");\nconst u32 gHealthboxDoublesOpponentGfx[] = INCBIN_U32(\"graphics/battle_interface/healthbox_doubles_opponent.4bpp.lz\");\nconst u32 gHealthboxSafariGfx[] = INCBIN_U32(\"graphics/battle_interface/healthbox_safari.4bpp.lz\");\n\nconst u32 gUnusedGfx_Shadow[] = INCBIN_U32(\"graphics/unused/shadow.4bpp.lz\");\nconst u32 gUnusedPal_Shadow[] = INCBIN_U32(\"graphics/unused/shadow.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_LockOn[] = INCBIN_U32(\"graphics/battle_anims/sprites/lock_on.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_LockOn[] = INCBIN_U32(\"graphics/battle_anims/sprites/lock_on.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_OpeningEye[] = INCBIN_U32(\"graphics/battle_anims/sprites/opening_eye.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_OpeningEye[] = INCBIN_U32(\"graphics/battle_anims/sprites/opening_eye.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_RoundWhiteHalo[] = INCBIN_U32(\"graphics/battle_anims/sprites/round_white_halo.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_RoundWhiteHalo[] = INCBIN_U32(\"graphics/battle_anims/sprites/round_white_halo.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_TealAlert[] = INCBIN_U32(\"graphics/battle_anims/sprites/teal_alert.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_TealAlert[] = INCBIN_U32(\"graphics/battle_anims/sprites/teal_alert.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_FangAttack[] = INCBIN_U32(\"graphics/battle_anims/sprites/fang_attack.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_FangAttack[] = INCBIN_U32(\"graphics/battle_anims/sprites/fang_attack.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PurpleHandOutline[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_hand_outline.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PurpleHandOutline[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_hand_outline.gbapal.lz\");\n\nconst u32 gFile_graphics_battle_anims_masks_curse_sheet[] = INCBIN_U32(\"graphics/battle_anims/masks/curse.4bpp.lz\");\nconst u32 gFile_graphics_battle_anims_masks_curse_tilemap[] = INCBIN_U32(\"graphics/battle_anims/masks/curse.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Pencil[] = INCBIN_U32(\"graphics/battle_anims/sprites/pencil.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Pencil[] = INCBIN_U32(\"graphics/battle_anims/sprites/pencil.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Spiral[] = INCBIN_U32(\"graphics/battle_anims/sprites/spiral.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Spiral[] = INCBIN_U32(\"graphics/battle_anims/sprites/spiral.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Moon[] = INCBIN_U32(\"graphics/battle_anims/sprites/moon.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Moon[] = INCBIN_U32(\"graphics/battle_anims/sprites/moon.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_GreenSparkle[] = INCBIN_U32(\"graphics/battle_anims/sprites/green_sparkle.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_GreenSparkle[] = INCBIN_U32(\"graphics/battle_anims/sprites/green_sparkle.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SnoreZ[] = INCBIN_U32(\"graphics/battle_anims/sprites/snore_z.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SnoreZ[] = INCBIN_U32(\"graphics/battle_anims/sprites/snore_z.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Explosion[] = INCBIN_U32(\"graphics/battle_anims/sprites/explosion.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Explosion[] = INCBIN_U32(\"graphics/battle_anims/sprites/explosion.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Nail[] = INCBIN_U32(\"graphics/battle_anims/sprites/nail.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Nail[] = INCBIN_U32(\"graphics/battle_anims/sprites/nail.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_GhostlySpirit[] = INCBIN_U32(\"graphics/battle_anims/sprites/ghostly_spirit.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_GhostlySpirit[] = INCBIN_U32(\"graphics/battle_anims/sprites/ghostly_spirit.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_WarmRock[] = INCBIN_U32(\"graphics/battle_anims/sprites/warm_rock.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_WarmRock[] = INCBIN_U32(\"graphics/battle_anims/sprites/warm_rock.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PunchImpact[] = INCBIN_U32(\"graphics/battle_anims/sprites/punch_impact.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PunchImpact[] = INCBIN_U32(\"graphics/battle_anims/sprites/punch_impact.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_BreakingEgg[] = INCBIN_U32(\"graphics/battle_anims/sprites/breaking_egg.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_BreakingEgg[] = INCBIN_U32(\"graphics/battle_anims/sprites/breaking_egg.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_ThinRing[] = INCBIN_U32(\"graphics/battle_anims/sprites/thin_ring.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_ThinRing[] = INCBIN_U32(\"graphics/battle_anims/sprites/thin_ring.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_MusicNotes2[] = INCBIN_U32(\"graphics/battle_anims/sprites/music_notes_2.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_MusicNotes2[] = INCBIN_U32(\"graphics/battle_anims/sprites/music_notes_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Bell[] = INCBIN_U32(\"graphics/battle_anims/sprites/bell.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Bell[] = INCBIN_U32(\"graphics/battle_anims/sprites/bell.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SpeedDust[] = INCBIN_U32(\"graphics/battle_anims/sprites/speed_dust.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SpeedDust[] = INCBIN_U32(\"graphics/battle_anims/sprites/speed_dust.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_TornMetal[] = INCBIN_U32(\"graphics/battle_anims/sprites/torn_metal.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_ThoughtBubble[] = INCBIN_U32(\"graphics/battle_anims/sprites/thought_bubble.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_ThoughtBubble[] = INCBIN_U32(\"graphics/battle_anims/sprites/thought_bubble.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Finger[] = INCBIN_U32(\"graphics/battle_anims/sprites/finger.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Finger[] = INCBIN_U32(\"graphics/battle_anims/sprites/finger.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_MagentaHeart[] = INCBIN_U32(\"graphics/battle_anims/sprites/magenta_heart.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_PinkHeart[] = INCBIN_U32(\"graphics/battle_anims/sprites/pink_heart.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_MagentaHeart[] = INCBIN_U32(\"graphics/battle_anims/sprites/magenta_heart.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_RedHeart[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_heart.gbapal.lz\");\n\nconst u32 gBattleAnimBg_AttractGfx[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/attract.4bpp.lz\");\nconst u32 gBattleAnimBg_AttractPal[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/attract.gbapal.lz\");\nconst u32 gBattleAnimBg_AttractTilemap[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/attract.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_RedOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_orb.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_RedOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_orb.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_CircleOfLight[] = INCBIN_U32(\"graphics/battle_anims/sprites/circle_of_light.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_ElectricOrbs[] = INCBIN_U32(\"graphics/battle_anims/sprites/electric_orbs.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Electricity[] = INCBIN_U32(\"graphics/battle_anims/sprites/electricity.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_ElectricOrbs[] = INCBIN_U32(\"graphics/battle_anims/sprites/electric_orbs.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Finger2[] = INCBIN_U32(\"graphics/battle_anims/sprites/finger_2.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_MovementWaves[] = INCBIN_U32(\"graphics/battle_anims/sprites/movement_waves.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_MovementWaves[] = INCBIN_U32(\"graphics/battle_anims/sprites/movement_waves.gbapal.lz\");\n\nconst u32 gBattleAnim_ScaryFacePal[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/scary_face.gbapal.lz\");\nconst u32 gBattleAnim_ScaryFaceGfx[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/scary_face.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_EyeSparkle[] = INCBIN_U32(\"graphics/battle_anims/sprites/eye_sparkle.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_EyeSparkle[] = INCBIN_U32(\"graphics/battle_anims/sprites/eye_sparkle.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Anger[] = INCBIN_U32(\"graphics/battle_anims/sprites/anger.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Anger[] = INCBIN_U32(\"graphics/battle_anims/sprites/anger.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Conversion[] = INCBIN_U32(\"graphics/battle_anims/sprites/conversion.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Conversion[] = INCBIN_U32(\"graphics/battle_anims/sprites/conversion.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_Angel[] = INCBIN_U32(\"graphics/battle_anims/sprites/angel.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_Angel[] = INCBIN_U32(\"graphics/battle_anims/sprites/angel.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_Devil[] = INCBIN_U32(\"graphics/battle_anims/sprites/devil.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_Devil[] = INCBIN_U32(\"graphics/battle_anims/sprites/devil.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Swipe[] = INCBIN_U32(\"graphics/battle_anims/sprites/swipe.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Swipe[] = INCBIN_U32(\"graphics/battle_anims/sprites/swipe.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_Roots[] = INCBIN_U32(\"graphics/battle_anims/sprites/roots.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_Roots[] = INCBIN_U32(\"graphics/battle_anims/sprites/roots.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_ItemBag[] = INCBIN_U32(\"graphics/battle_anims/sprites/item_bag.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_ItemBag[] = INCBIN_U32(\"graphics/battle_anims/sprites/item_bag.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_TriAttackTriangle[] = INCBIN_U32(\"graphics/battle_anims/sprites/tri_attack_triangle.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_TriAttackTriangle[] = INCBIN_U32(\"graphics/battle_anims/sprites/tri_attack_triangle.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_LetterZ[] = INCBIN_U32(\"graphics/battle_anims/sprites/letter_z.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_LetterZ[] = INCBIN_U32(\"graphics/battle_anims/sprites/letter_z.4bpp.lz\");\n\nconst u32 gBattleAnimBgPalette_Impact[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/impact.gbapal.lz\");\nconst u32 gBattleAnimBgImage_Impact[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/impact.4bpp.lz\");\nconst u32 gBattleAnimBgTilemap_ImpactOpponent[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/impact_opponent.bin.lz\");\n\nconst u32 gBattleAnimBgTilemap_ImpactPlayer[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/impact_player.bin.lz\");\nconst u32 gBattleAnimBgTilemap_ImpactContests[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/impact_contests.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_JaggedMusicNote[] = INCBIN_U32(\"graphics/battle_anims/sprites/jagged_music_note.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_JaggedMusicNote[] = INCBIN_U32(\"graphics/battle_anims/sprites/jagged_music_note.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Spotlight[] = INCBIN_U32(\"graphics/battle_anims/sprites/spotlight.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Pokeball[] = INCBIN_U32(\"graphics/battle_anims/sprites/pokeball.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Pokeball[] = INCBIN_U32(\"graphics/battle_anims/sprites/pokeball.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_RapidSpin[] = INCBIN_U32(\"graphics/battle_anims/sprites/rapid_spin.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_RapidSpin[] = INCBIN_U32(\"graphics/battle_anims/sprites/rapid_spin.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_MilkBottle[] = INCBIN_U32(\"graphics/battle_anims/sprites/milk_bottle.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_MilkBottle[] = INCBIN_U32(\"graphics/battle_anims/sprites/milk_bottle.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_WispFire[] = INCBIN_U32(\"graphics/battle_anims/sprites/wisp_fire.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_WispOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/wisp_orb.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_WispOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/wisp_orb.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_GoldStars[] = INCBIN_U32(\"graphics/battle_anims/sprites/gold_stars.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_GoldStars[] = INCBIN_U32(\"graphics/battle_anims/sprites/gold_stars.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_EclipsingOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/eclipsing_orb.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_EclipsingOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/eclipsing_orb.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PinkPetal[] = INCBIN_U32(\"graphics/battle_anims/sprites/pink_petal.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PinkPetal[] = INCBIN_U32(\"graphics/battle_anims/sprites/pink_petal.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_GrayOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/gray_orb.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_GrayOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/gray_orb.gbapal.lz\");\n\nconst u32 gBattleAnimSpritePal_BlueOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/blue_orb.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_RedOrb2[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_orb_2.gbapal.lz\");\n\nconst u32 gBattleAnimBgImage_Drill[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/drill.4bpp.lz\");\nconst u32 gBattleAnimBgPalette_Drill[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/drill.gbapal.lz\");\n\nconst u32 gBattleAnimBgPalette_Sky[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/sky.gbapal.lz\");\n\nconst u32 gBattleAnimBgTilemap_Drill[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/drill.bin.lz\");\nconst u32 gBattleAnimBgTilemap_DrillContests[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/drill_contests.bin.lz\");\n\nconst u32 gBattleAnimBgImage_Aurora[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/aurora.4bpp.lz\");\nconst u32 gBattleAnimBgPalette_Aurora[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/aurora.gbapal.lz\");\nconst u32 gBattleAnimBgTilemap_Aurora[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/aurora.bin.lz\");\n\nconst u32 gBattleAnimBgTilemap_HighspeedOpponent[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/highspeed_opponent.bin.lz\");\nconst u32 gBattleAnimBgPalette_Highspeed[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/highspeed.gbapal.lz\");\n\nconst u32 gBattleAnimBgPalette_Bug[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/bug.gbapal.lz\");\n\nconst u32 gBattleAnimBgImage_Highspeed[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/highspeed.4bpp.lz\");\nconst u32 gBattleAnimBgTilemap_HighspeedPlayer[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/highspeed_player.bin.lz\");\n\nconst u32 gBattleAnim_MorningSunGfx[] = INCBIN_U32(\"graphics/battle_anims/masks/light_beam.4bpp.lz\");\nconst u32 gBattleAnim_MorningSunPal[] = INCBIN_U32(\"graphics/battle_anims/masks/light_beam.gbapal.lz\");\nconst u32 gBattleAnim_MorningSunTilemap[] = INCBIN_U32(\"graphics/battle_anims/masks/light_beam.bin.lz\");\n\nconst u32 gBattleAnimBgTilemap_GuillotineOpponent[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/guillotine_opponent.bin.lz\");\nconst u32 gBattleAnimBgTilemap_GuillotinePlayer[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/guillotine_player.bin.lz\");\nconst u32 gBattleAnimBgTilemap_GuillotineContests[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/guillotine_contests.bin.lz\");\n\nconst u32 gBattleAnimBgImage_Guillotine[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/guillotine.4bpp.lz\");\nconst u32 gBattleAnimBgPalette_Guillotine[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/guillotine.gbapal.lz\");\n\nconst u32 gBattleAnimBgImage_Thunder[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/thunder.4bpp.lz\");\nconst u32 gBattleAnimBgPalette_Thunder[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/thunder.gbapal.lz\");\nconst u32 gBattleAnimBgTilemap_Thunder[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/thunder.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PainSplit[] = INCBIN_U32(\"graphics/battle_anims/sprites/pain_split.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PainSplit[] = INCBIN_U32(\"graphics/battle_anims/sprites/pain_split.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_HandsAndFeet[] = INCBIN_U32(\"graphics/battle_anims/sprites/hands_and_feet.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_HandsAndFeet[] = INCBIN_U32(\"graphics/battle_anims/sprites/hands_and_feet.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Confetti[] = INCBIN_U32(\"graphics/battle_anims/sprites/confetti.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Confetti[] = INCBIN_U32(\"graphics/battle_anims/sprites/confetti.gbapal.lz\");\n\nconst u32 gSubstituteDollPal[] = INCBIN_U32(\"graphics/battle_anims/sprites/substitute.gbapal.lz\");\nconst u32 gSubstituteDollGfx[] = INCBIN_U32(\"graphics/battle_anims/sprites/substitute.4bpp.lz\");\nconst u32 gSubstituteDollTilemap[] = INCBIN_U32(\"graphics/battle_anims/sprites/substitute.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_GreenStar[] = INCBIN_U32(\"graphics/battle_anims/sprites/green_star.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_GreenStar[] = INCBIN_U32(\"graphics/battle_anims/sprites/green_star.gbapal.lz\");\n\nconst u32 gFile_graphics_misc_confetti_sheet[] = INCBIN_U32(\"graphics/misc/confetti.4bpp.lz\");\nconst u32 gFile_graphics_misc_confetti_palette[] = INCBIN_U32(\"graphics/misc/confetti.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PinkCloud[] = INCBIN_U32(\"graphics/battle_anims/sprites/pink_cloud.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PinkCloud[] = INCBIN_U32(\"graphics/battle_anims/sprites/pink_cloud.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SweatDrop[] = INCBIN_U32(\"graphics/battle_anims/sprites/sweat_drop.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SweatDrop[] = INCBIN_U32(\"graphics/battle_anims/sprites/sweat_drop.gbapal.lz\");\n\nconst u32 gBattleStatMask_Gfx[] = INCBIN_U32(\"graphics/battle_anims/masks/stat.4bpp.lz\");\nconst u32 gBattleStatMask1_Tilemap[] = INCBIN_U32(\"graphics/battle_anims/masks/stat_tilemap_1.bin.lz\");\nconst u32 gBattleStatMask2_Tilemap[] = INCBIN_U32(\"graphics/battle_anims/masks/stat_tilemap_2.bin.lz\");\n\nconst u32 gBattleStatMask1_Pal[] = INCBIN_U32(\"graphics/battle_anims/masks/stat1.gbapal.lz\");\nconst u32 gBattleStatMask2_Pal[] = INCBIN_U32(\"graphics/battle_anims/masks/stat2.gbapal.lz\");\nconst u32 gBattleStatMask3_Pal[] = INCBIN_U32(\"graphics/battle_anims/masks/stat3.gbapal.lz\");\nconst u32 gBattleStatMask4_Pal[] = INCBIN_U32(\"graphics/battle_anims/masks/stat4.gbapal.lz\");\nconst u32 gBattleStatMask5_Pal[] = INCBIN_U32(\"graphics/battle_anims/masks/stat5.gbapal.lz\");\nconst u32 gBattleStatMask6_Pal[] = INCBIN_U32(\"graphics/battle_anims/masks/stat6.gbapal.lz\");\nconst u32 gBattleStatMask7_Pal[] = INCBIN_U32(\"graphics/battle_anims/masks/stat7.gbapal.lz\");\nconst u32 gBattleStatMask8_Pal[] = INCBIN_U32(\"graphics/battle_anims/masks/stat8.gbapal.lz\");\n\nconst u32 gCureBubblesGfx[] = INCBIN_U32(\"graphics/battle_anims/masks/cure_bubbles.4bpp.lz\");\nconst u32 gCureBubblesPal[] = INCBIN_U32(\"graphics/battle_anims/masks/cure_bubbles.gbapal.lz\");\nconst u32 gCureBubblesTilemap[] = INCBIN_U32(\"graphics/battle_anims/masks/cure_bubbles.bin.lz\");\n\nconst u32 gBattleAnimSpritePal_PurpleScratch[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_scratch.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_PurpleScratch[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_scratch.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PurpleSwipe[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_swipe.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_GuardRing[] = INCBIN_U32(\"graphics/battle_anims/sprites/guard_ring.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_GuardRing[] = INCBIN_U32(\"graphics/battle_anims/sprites/guard_ring.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_TagHand[] = INCBIN_U32(\"graphics/battle_anims/sprites/tag_hand.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_NoiseLine[] = INCBIN_U32(\"graphics/battle_anims/sprites/noise_line.4bpp.lz\");\n\nconst u32 gUnusedLevelupAnimationGfx[] = INCBIN_U32(\"graphics/battle_anims/masks/unused_level_up.4bpp.lz\");\nconst u32 gUnusedLevelupAnimationTilemap[] = INCBIN_U32(\"graphics/battle_anims/masks/unused_level_up.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SmallRedEye[] = INCBIN_U32(\"graphics/battle_anims/sprites/small_red_eye.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SmallRedEye[] = INCBIN_U32(\"graphics/battle_anims/sprites/small_red_eye.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_HollowOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/hollow_orb.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_HollowOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/hollow_orb.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_XSign[] = INCBIN_U32(\"graphics/battle_anims/sprites/x_sign.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_BluegreenOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/bluegreen_orb.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_BluegreenOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/bluegreen_orb.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PawPrint[] = INCBIN_U32(\"graphics/battle_anims/sprites/paw_print.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PawPrint[] = INCBIN_U32(\"graphics/battle_anims/sprites/paw_print.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_PurpleFlame[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_flame.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_PurpleFlame[] = INCBIN_U32(\"graphics/battle_anims/sprites/purple_flame.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_RedBall[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_ball.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_RedBall[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_ball.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SmellingsaltEffect[] = INCBIN_U32(\"graphics/battle_anims/sprites/smellingsalt_effect.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SmellingsaltEffect[] = INCBIN_U32(\"graphics/battle_anims/sprites/smellingsalt_effect.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_MagnifyingGlass[] = INCBIN_U32(\"graphics/battle_anims/sprites/magnifying_glass.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_MagnifyingGlass[] = INCBIN_U32(\"graphics/battle_anims/sprites/magnifying_glass.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Meteor[] = INCBIN_U32(\"graphics/battle_anims/sprites/meteor.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Meteor[] = INCBIN_U32(\"graphics/battle_anims/sprites/meteor.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_FlatRock[] = INCBIN_U32(\"graphics/battle_anims/sprites/flat_rock.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_FlatRock[] = INCBIN_U32(\"graphics/battle_anims/sprites/flat_rock.gbapal.lz\");\n\nconst u16 gPPTextPalette[] = INCBIN_U16(\"graphics/interface/text_pp.gbapal\");\n\n#include \"data/graphics/pokemon.h\"\n#include \"data/graphics/trainers.h\"\n\nconst u8 gMonIcon_QuestionMark[] = INCBIN_U8(\"graphics/pokemon/question_mark/icon.4bpp\");\nconst u8 gMonFootprint_QuestionMark[] = INCBIN_U8(\"graphics/pokemon/question_mark/footprint.1bpp\");\n\nconst u32 gFile_graphics_battle_transitions_vs_frame_sheet[] = INCBIN_U32(\"graphics/battle_transitions/vs_frame.4bpp.lz\");\nconst u32 gFile_graphics_battle_transitions_vs_frame_tilemap[] = INCBIN_U32(\"graphics/battle_transitions/vs_frame.bin.lz\");\nconst u32 gFile_graphics_battle_transitions_vs_frame_palette[] = INCBIN_U32(\"graphics/battle_transitions/vs_frame.gbapal.lz\");\n\nconst u32 gVsLettersGfx[] = INCBIN_U32(\"graphics/battle_transitions/vs.4bpp.lz\");\n\n#include \"data/graphics/battle_terrain_unused.h\"\n\nconst u32 gBattleAnimSpriteGfx_FlyingDirt[] = INCBIN_U32(\"graphics/battle_anims/sprites/flying_dirt.4bpp.lz\");\n\nconst u32 gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/sandstorm_brew.bin.lz\");\nconst u32 gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/sandstorm_brew.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_FlyingDirt[] = INCBIN_U32(\"graphics/battle_anims/sprites/flying_dirt.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_MetalSoundWaves[] = INCBIN_U32(\"graphics/battle_anims/sprites/metal_sound_waves.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_MetalSoundWaves[] = INCBIN_U32(\"graphics/battle_anims/sprites/metal_sound_waves.gbapal.lz\");\n\nconst u32 gBattleAnimBgImage_Ice[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/ice.4bpp.lz\");\nconst u32 gBattleAnimBgPalette_Ice[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/ice.gbapal.lz\");\nconst u32 gBattleAnimBgTilemap_Ice[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/ice.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_IcicleSpear[] = INCBIN_U32(\"graphics/battle_anims/sprites/icicle_spear.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_IcicleSpear[] = INCBIN_U32(\"graphics/battle_anims/sprites/icicle_spear.gbapal.lz\");\n\nconst u32 gContestNextTurnGfx[] = INCBIN_U32(\"graphics/contest/next_turn.4bpp.lz\");\nconst u8 gContestNextTurnNumbersGfx[] = INCBIN_U8(\"graphics/contest/next_turn_numbers.4bpp\");\nconst u8 gContestNextTurnRandomGfx[] = INCBIN_U8(\"graphics/contest/next_turn_random.4bpp\");\n\nconst u32 gBattleAnimSpriteGfx_GlowyRedOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/glowy_red_orb.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_GlowyRedOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/glowy_red_orb.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_GlowyGreenOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/glowy_green_orb.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_SleepPowder[] = INCBIN_U32(\"graphics/battle_anims/sprites/sleep_powder.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_StunSpore[] = INCBIN_U32(\"graphics/battle_anims/sprites/stun_spore.gbapal.lz\");\n\nconst u32 gContestApplauseGfx[] = INCBIN_U32(\"graphics/contest/applause.4bpp.lz\");\nconst u8 gContestApplauseMeterGfx[] = INCBIN_U8(\"graphics/contest/applause_meter.4bpp\");\n\nconst u16 gContestNextTurnPal[] = INCBIN_U16(\"graphics/contest/next_turn.gbapal\");\n\nconst u32 gBattleAnimSpriteGfx_Splash[] = INCBIN_U32(\"graphics/battle_anims/sprites/splash.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Splash[] = INCBIN_U32(\"graphics/battle_anims/sprites/splash.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SweatBead[] = INCBIN_U32(\"graphics/battle_anims/sprites/sweat_bead.4bpp.lz\");\n\nconst u32 gBattleAnimSpriteGfx_SafariBait[] = INCBIN_U32(\"graphics/battle_anims/sprites/safari_bait.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_SafariBait[] = INCBIN_U32(\"graphics/battle_anims/sprites/safari_bait.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Gem1[] = INCBIN_U32(\"graphics/battle_anims/sprites/gem_1.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Gem2[] = INCBIN_U32(\"graphics/battle_anims/sprites/gem_2.4bpp.lz\");\nconst u32 gBattleAnimSpriteGfx_Gem3[] = INCBIN_U32(\"graphics/battle_anims/sprites/gem_3.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_Gem1[] = INCBIN_U32(\"graphics/battle_anims/sprites/gem_1.gbapal.lz\");\n\nconst u32 gBattleAnimBgImage_InAir[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/in_air.4bpp.lz\");\nconst u32 gBattleAnimBgPalette_InAir[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/in_air.gbapal.lz\");\nconst u32 gBattleAnimBgTilemap_InAir[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/in_air.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Protect[] = INCBIN_U32(\"graphics/battle_anims/sprites/protect.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Protect[] = INCBIN_U32(\"graphics/battle_anims/sprites/protect.gbapal.lz\");\n\nconst u32 gBattleAnimBgPalette_MuddyWater[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/water_muddy.gbapal.lz\");\n\nconst u32 gEnemyMonShadow_Gfx[] = INCBIN_U32(\"graphics/battle_interface/enemy_mon_shadow.4bpp.lz\");\n\nconst u32 gBattleInterface_PartySummaryBar_Gfx[] = INCBIN_U32(\"graphics/battle_interface/party_summary_bar.4bpp.lz\");\n\nconst u8 gMonIcon_Egg[] = INCBIN_U8(\"graphics/pokemon/egg/icon.4bpp\");\n\nconst u32 gBattleAnimBgImage_Ghost[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/ghost.4bpp.lz\");\nconst u32 gBattleAnimBgPalette_Ghost[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/ghost.gbapal.lz\");\nconst u32 gBattleAnimBgTilemap_Ghost[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/ghost.bin.lz\");\n\nconst u32 gBattleAnimSpritePal_WhipHit[] = INCBIN_U32(\"graphics/battle_anims/sprites/whip_hit.gbapal.lz\");\n\nconst u32 gBattleAnimBgPalette_SolarBeam[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/solarbeam.gbapal.lz\");\nconst u32 gBattleAnimBgTilemap_SolarBeam[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/solarbeam.bin.lz\"); // Unused\n\nconst u32 gFile_graphics_berry_blender_center_sheet[] = INCBIN_U32(\"graphics/berry_blender/center.8bpp.lz\");\n\nconst u32 gFile_graphics_berry_blender_outer_sheet[] = INCBIN_U32(\"graphics/berry_blender/outer.4bpp.lz\");\nconst u32 gFile_graphics_berry_blender_outer_map_tilemap[] = INCBIN_U32(\"graphics/berry_blender/outer_map.bin.lz\");\n\nconst u32 gBattleAnimBgPalette_Cosmic[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/cosmic.gbapal.lz\");\nconst u32 gBattleAnimBgImage_Cosmic[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/cosmic.4bpp.lz\");\nconst u32 gBattleAnimBgTilemap_Cosmic[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/cosmic.bin.lz\");\n\nconst u32 gBattleAnimSpritePal_SlamHit2[] = INCBIN_U32(\"graphics/battle_anims/sprites/slam_hit_2.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_SlamHit2[] = INCBIN_U32(\"graphics/battle_anims/sprites/slam_hit_2.4bpp.lz\");\n\nconst u32 gBattleAnimFogTilemap[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/fog.bin.lz\");\n\nconst u32 gBattleAnimSpritePal_WeatherBall[] = INCBIN_U32(\"graphics/battle_anims/sprites/weather_ball.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_WeatherBall[] = INCBIN_U32(\"graphics/battle_anims/sprites/weather_ball.4bpp.lz\");\n\nconst u32 gBattleAnimBgTilemap_ScaryFacePlayer[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/scary_face_player.bin.lz\");\nconst u32 gBattleAnimBgTilemap_ScaryFaceOpponent[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/scary_face_opponent.bin.lz\");\nconst u32 gBattleAnimBgTilemap_ScaryFaceContest[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/scary_face_contest.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Hail[] = INCBIN_U32(\"graphics/battle_anims/sprites/hail.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Hail[] = INCBIN_U32(\"graphics/battle_anims/sprites/hail.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_GreenSpike[] = INCBIN_U32(\"graphics/battle_anims/sprites/green_spike.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_GreenSpike[] = INCBIN_U32(\"graphics/battle_anims/sprites/green_spike.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_WhiteCircleOfLight[] = INCBIN_U32(\"graphics/battle_anims/sprites/white_circle_of_light.gbapal.lz\");\nconst u32 gBattleAnimSpritePal_GlowyBlueOrb[] = INCBIN_U32(\"graphics/battle_anims/sprites/glowy_blue_orb.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Recycle[] = INCBIN_U32(\"graphics/battle_anims/sprites/recycle.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Recycle[] = INCBIN_U32(\"graphics/battle_anims/sprites/recycle.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_RedParticles[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_particles.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_RedParticles[] = INCBIN_U32(\"graphics/battle_anims/sprites/red_particles.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_DirtMound[] = INCBIN_U32(\"graphics/battle_anims/sprites/dirt_mound.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_DirtMound[] = INCBIN_U32(\"graphics/battle_anims/sprites/dirt_mound.gbapal.lz\");\n\nconst u32 gBattleAnimBgImage_Fissure[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/fissure.4bpp.lz\");\nconst u32 gBattleAnimBgPalette_Fissure[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/fissure.gbapal.lz\");\nconst u32 gBattleAnimBgTilemap_Fissure[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/fissure.bin.lz\");\n\nconst u32 gBattleAnimSpriteGfx_Bird[] = INCBIN_U32(\"graphics/battle_anims/sprites/bird.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_Bird[] = INCBIN_U32(\"graphics/battle_anims/sprites/bird.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_CrossImpact[] = INCBIN_U32(\"graphics/battle_anims/sprites/cross_impact.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_CrossImpact[] = INCBIN_U32(\"graphics/battle_anims/sprites/cross_impact.gbapal.lz\");\n\nconst u32 gBattleAnimBgImage_Surf[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/water.4bpp.lz\");\nconst u32 gBattleAnimBgPalette_Surf[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/water.gbapal.lz\");\n\nconst u32 gBattleAnimBgTilemap_SurfOpponent[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/water_opponent.bin.lz\");\nconst u32 gBattleAnimBgTilemap_SurfPlayer[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/water_player.bin.lz\");\nconst u32 gBattleAnimBgTilemap_SurfContest[] = INCBIN_U32(\"graphics/battle_anims/backgrounds/water_contest.bin.lz\");\n\nconst u32 gBattleAnimSpritePal_Slash2[] = INCBIN_U32(\"graphics/battle_anims/sprites/slash_2.gbapal.lz\");\n\nconst u32 gBattleAnimSpriteGfx_WhiteShadow[] = INCBIN_U32(\"graphics/battle_anims/sprites/white_shadow.4bpp.lz\");\nconst u32 gBattleAnimSpritePal_WhiteShadow[] = INCBIN_U32(\"graphics/battle_anims/sprites/white_shadow.gbapal.lz\");\n\nconst u32 gPartyMenuBg_Gfx[] = INCBIN_U32(\"graphics/party_menu/bg.4bpp.lz\");\nconst u32 gPartyMenuBg_Pal[] = INCBIN_U32(\"graphics/party_menu/bg.gbapal.lz\");\nconst u32 gPartyMenuBg_Tilemap[] = INCBIN_U32(\"graphics/party_menu/bg.bin.lz\");\n\nconst u32 gPartyMenuPokeball_Gfx[] = INCBIN_U32(\"graphics/party_menu/pokeball.4bpp.lz\");\nconst u32 gPartyMenuPokeballSmall_Gfx[] = INCBIN_U32(\"graphics/party_menu/pokeball_small.4bpp.lz\"); //unused\nconst u32 gPartyMenuPokeball_Pal[] = INCBIN_U32(\"graphics/party_menu/pokeball.gbapal.lz\");\n\nconst u32 gStatusGfx_Icons[] = INCBIN_U32(\"graphics/interface/status_icons.4bpp.lz\");\nconst u32 gStatusPal_Icons[] = INCBIN_U32(\"graphics/interface/status_icons.gbapal.lz\");\n\nconst u32 gBagBg_Gfx[] = INCBIN_U32(\"graphics/item_menu/bg.4bpp.lz\");\nconst u32 gBagBg_Tilemap[] = INCBIN_U32(\"graphics/item_menu/bg.bin.lz\");\nconst u32 gBagBg_ItemPC_Tilemap[] = INCBIN_U32(\"graphics/item_menu/bg_item_pc.bin.lz\");\nconst u32 gBagBgPalette[] = INCBIN_U32(\"graphics/item_menu/bg.gbapal.lz\"); // palette 1 (Boy + misc Pal)\nconst u32 gBagBgPalette_FemaleOverride[] = INCBIN_U32(\"graphics/item_menu/bg_female.gbapal.lz\"); // palette 2 (Girl)\n\nconst u32 gBagMale_Gfx[] = INCBIN_U32(\"graphics/interface/bag_male.4bpp.lz\");\nconst u32 gBagFemale_Gfx[] = INCBIN_U32(\"graphics/interface/bag_female.4bpp.lz\");\nconst u32 gBag_Pal[] = INCBIN_U32(\"graphics/interface/bag.gbapal.lz\");\n\nconst u32 gSwapLine_Gfx[] = INCBIN_U32(\"graphics/interface/bag_swap.4bpp.lz\");\nconst u32 gSwapLine_Pal[] = INCBIN_U32(\"graphics/interface/bag_swap.gbapal.lz\");\n\nconst u32 gTMCase_Gfx[] = INCBIN_U32(\"graphics/tm_case/tm_case.4bpp.lz\");\nconst u32 gTMCaseMenu_Tilemap[] = INCBIN_U32(\"graphics/tm_case/menu.bin.lz\");\nconst u32 gTMCase_Tilemap[] = INCBIN_U32(\"graphics/tm_case/tm_case.bin.lz\");\nconst u32 gTMCaseMenu_Male_Pal[] = INCBIN_U32(\"graphics/tm_case/menu_male.gbapal.lz\");\nconst u32 gTMCaseMenu_Female_Pal[] = INCBIN_U32(\"graphics/tm_case/menu_female.gbapal.lz\");\nconst u32 gTMCaseDisc_Gfx[] = INCBIN_U32(\"graphics/tm_case/disc.4bpp.lz\");\nconst u32 gTMCaseDiscTypes1_Pal[] = INCBIN_U32(\"graphics/tm_case/disc_types_1.gbapal.lz\");\nconst u32 gTMCaseDiscTypes2_Pal[] = INCBIN_U32(\"graphics/tm_case/disc_types_2.gbapal.lz\");\n\nconst u8 gItemPcTiles[] = INCBIN_U8(\"graphics/item_pc/bg.4bpp.lz\");\nconst u32 gItemPcBgPals[] = INCBIN_U32(\"graphics/item_pc/bg.gbapal.lz\");\nconst u8 gItemPcTilemap[] = INCBIN_U8(\"graphics/item_pc/bg.bin.lz\");\n\nconst u32 gBerryPouchSpriteTiles[] = INCBIN_U32(\"graphics/berry_pouch/berry_pouch.4bpp.lz\");\nconst u8 gBerryPouchBgGfx[] = INCBIN_U8(\"graphics/berry_pouch/background.4bpp.lz\");\nconst u32 gBerryPouchBgPals[] = INCBIN_U32(\"graphics/berry_pouch/background.gbapal.lz\");\nconst u32 gBerryPouchBgPal0FemaleOverride[] = INCBIN_U32(\"graphics/berry_pouch/background_female.gbapal.lz\");\nconst u32 gBerryPouchSpritePalette[] = INCBIN_U32(\"graphics/berry_pouch/berry_pouch.gbapal.lz\");\nconst u8 gBerryPouchBg1Tilemap[] = INCBIN_U8(\"graphics/berry_pouch/background.bin.lz\");\n\nconst u32 gBuyMenuFrame_Gfx[] = INCBIN_U32(\"graphics/shop_menu/shop_menu.4bpp.lz\");\nconst u32 gBuyMenuFrame_Tilemap[] = INCBIN_U32(\"graphics/shop_menu/shop_tilemap.bin.lz\");\nconst u32 gBuyMenuFrame_TmHmTilemap[] = INCBIN_U32(\"graphics/shop_menu/shop_tm_hm_tilemap.bin.lz\");\nconst u32 gBuyMenuFrame_Pal[] = INCBIN_U32(\"graphics/shop_menu/shop_menu.gbapal.lz\");\n\nconst u8 gTeachyTv_Border_Gfx[] = INCBIN_U8(\"graphics/teachy_tv/border.4bpp.lz\"); // Unused\nconst u8 gTeachyTv_Gfx[] = INCBIN_U8(\"graphics/teachy_tv/tiles.4bpp.lz\");\nconst u8 gTeachyTvScreen_Tilemap[] = INCBIN_U8(\"graphics/teachy_tv/screen.bin.lz\");\nconst u8 gTeachyTvTitle_Tilemap[] = INCBIN_U8(\"graphics/teachy_tv/title.bin.lz\");\nconst u32 gTeachyTv_Pal[] = INCBIN_U32(\"graphics/teachy_tv/tiles.gbapal.lz\");\n\nconst u32 gUnusedGrayPalette[] = INCBIN_U32(\"graphics/unused/gray_palette.gbapal.lz\");\n\n#include \"data/graphics/items.h\"\n\nconst u32 gBattleAnimSpritePal_Shock3[] = INCBIN_U32(\"graphics/battle_anims/sprites/shock_3.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_Shock3[] = INCBIN_U32(\"graphics/battle_anims/sprites/shock_3.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_WhiteFeather[] = INCBIN_U32(\"graphics/battle_anims/sprites/white_feather.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_WhiteFeather[] = INCBIN_U32(\"graphics/battle_anims/sprites/white_feather.4bpp.lz\");\n\nconst u32 gBattleAnimSpritePal_Sparkle6[] = INCBIN_U32(\"graphics/battle_anims/sprites/sparkle_6.gbapal.lz\");\nconst u32 gBattleAnimSpriteGfx_Sparkle6[] = INCBIN_U32(\"graphics/battle_anims/sprites/sparkle_6.4bpp.lz\");\n\nconst u32 gGhostPalette[] = INCBIN_U32(\"graphics/pokemon/ghost/front.gbapal.lz\");\nconst u32 gGhostFrontPic[] = INCBIN_U32(\"graphics/pokemon/ghost/front.4bpp.lz\");\n\n#include \"data/graphics/mail.h\"\n\nconst u16 gMenuInfoElements1_Pal[] = INCBIN_U16(\"graphics/interface/dex_caught_pokeball.gbapal\");\nconst u16 gMenuInfoElements2_Pal[] = INCBIN_U16(\"graphics/interface/pokemon_types.gbapal\");\nconst u8 gMenuInfoElements_Gfx[] = INCBIN_U8(\"graphics/interface/menu_info.4bpp\");\n\nconst u16 gMoveRelearner_Pal[] = INCBIN_U16(\"graphics/interface/learn_move.gbapal\");\nconst u32 gMoveRelearner_Gfx[] = INCBIN_U32(\"graphics/interface/learn_move.4bpp.lz\");\nconst u32 gMoveRelearner_Tilemap[] = INCBIN_U32(\"graphics/interface/learn_move.bin.lz\");\n\nconst u16 gNamingScreenKeyboard_Pal[] = INCBIN_U16(\"graphics/naming_screen/keyboard.gbapal\");\nconst u16 gNamingScreenRival_Pal[]    = INCBIN_U16(\"graphics/naming_screen/rival.gbapal\");\nconst u16 gNamingScreenMenu_Pal[6][16] =\n{\n    INCBIN_U16(\"graphics/naming_screen/menu.gbapal\"),\n    INCBIN_U16(\"graphics/naming_screen/page_swap_upper.gbapal\"),\n    INCBIN_U16(\"graphics/naming_screen/page_swap_lower.gbapal\"),\n    INCBIN_U16(\"graphics/naming_screen/page_swap_others.gbapal\"),\n    INCBIN_U16(\"graphics/naming_screen/buttons.gbapal\"),\n    INCBIN_U16(\"graphics/naming_screen/cursor.gbapal\"),\n};\n\nconst u32 gNamingScreenMenu_Gfx[]                = INCBIN_U32(\"graphics/naming_screen/menu.4bpp.lz\");\nconst u32 gNamingScreenBackground_Tilemap[]      = INCBIN_U32(\"graphics/naming_screen/background.bin.lz\");\nconst u32 gNamingScreenKeyboardUpper_Tilemap[]   = INCBIN_U32(\"graphics/naming_screen/keyboard_upper.bin.lz\");\nconst u32 gNamingScreenKeyboardLower_Tilemap[]   = INCBIN_U32(\"graphics/naming_screen/keyboard_lower.bin.lz\");\nconst u32 gNamingScreenKeyboardSymbols_Tilemap[] = INCBIN_U32(\"graphics/naming_screen/keyboard_symbols.bin.lz\");\n\nconst u32 gNamingScreenPageSwapFrame_Gfx[]  = INCBIN_U32(\"graphics/naming_screen/page_swap_frame.4bpp\");\nconst u32 gNamingScreenBackButton_Gfx[]     = INCBIN_U32(\"graphics/naming_screen/back_button.4bpp\");\nconst u32 gNamingScreenOKButton_Gfx[]       = INCBIN_U32(\"graphics/naming_screen/ok_button.4bpp\");\nconst u32 gNamingScreenPageSwapUpper_Gfx[]  = INCBIN_U32(\"graphics/naming_screen/page_swap_upper.4bpp\");\nconst u32 gNamingScreenPageSwapLower_Gfx[]  = INCBIN_U32(\"graphics/naming_screen/page_swap_lower.4bpp\");\nconst u32 gNamingScreenPageSwapOthers_Gfx[] = INCBIN_U32(\"graphics/naming_screen/page_swap_others.4bpp\");\nconst u32 gNamingScreenCursor_Gfx[]         = INCBIN_U32(\"graphics/naming_screen/cursor.4bpp\");\nconst u32 gNamingScreenCursorSquished_Gfx[] = INCBIN_U32(\"graphics/naming_screen/cursor_squished.4bpp\");\nconst u32 gNamingScreenCursorFilled_Gfx[]   = INCBIN_U32(\"graphics/naming_screen/cursor_filled.4bpp\");\nconst u32 gNamingScreenPageSwapButton_Gfx[] = INCBIN_U32(\"graphics/naming_screen/page_swap_button.4bpp\");\nconst u32 gNamingScreenInputArrow_Gfx[]     = INCBIN_U32(\"graphics/naming_screen/input_arrow.4bpp\");\nconst u32 gNamingScreenUnderscore_Gfx[]     = INCBIN_U32(\"graphics/naming_screen/underscore.4bpp\");\n\nconst u8 gTMCaseHM_Gfx[] = INCBIN_U8(\"graphics/tm_case/hm.4bpp\");\n\nconst u16 gKantoTrainerCardBlue_Pal[] = INCBIN_U16(\"graphics/trainer_card/blue.gbapal\");\nconst u32 gKantoTrainerCard_Gfx[] = INCBIN_U32(\"graphics/trainer_card/tiles.4bpp.lz\");\nconst u16 gHoennTrainerCardGreen_Pal[] = INCBIN_U16(\"graphics/trainer_card/rse/green.gbapal\");\nconst u32 gHoennTrainerCard_Gfx[] = INCBIN_U32(\"graphics/trainer_card/rse/tiles.4bpp.lz\");\n\nconst u16 gEasyChatWindow_Pal[] = INCBIN_U16(\"graphics/easy_chat/window.gbapal\");\nconst u32 gEasyChatWindow_Gfx[] = INCBIN_U32(\"graphics/easy_chat/window.4bpp.lz\");\nconst u32 gEasyChatWindow_Tilemap[] = INCBIN_U32(\"graphics/easy_chat/window.bin.lz\");\n\nconst u16 gEasyChatButtonWindow_Pal[] = INCBIN_U16(\"graphics/easy_chat/button_window.gbapal\");\nconst u32 gEasyChatButtonWindow_Gfx[] = INCBIN_U32(\"graphics/easy_chat/button_window.4bpp.lz\");\nconst u32 gEasyChatMode_Gfx[] = INCBIN_U32(\"graphics/easy_chat/mode.4bpp.lz\");\n\nconst u32 gSummaryScreen_Bg_Gfx[] = INCBIN_U32(\"graphics/summary_screen/bg.4bpp.lz\");\nconst u32 gSummaryScreen_Bg_Pal[] = INCBIN_U32(\"graphics/summary_screen/bg.gbapal\");\nconst u32 gSummaryScreen_ExpBar_Gfx[] = INCBIN_U32(\"graphics/summary_screen/exp_bar.4bpp.lz\");\nconst u32 gSummaryScreen_HpBar_Gfx[] = INCBIN_U32(\"graphics/summary_screen/hp_bar.4bpp.lz\");\nconst u16 gSummaryScreen_HpExpBar_Pal[] = INCBIN_U16(\"graphics/summary_screen/exp_bar.gbapal\"); // hp bar uses this too\nconst u32 gSummaryScreen_PageInfo_Tilemap[] = INCBIN_U32(\"graphics/summary_screen/page_info.bin.lz\");\nconst u32 gSummaryScreen_PageSkills_Tilemap[] = INCBIN_U32(\"graphics/summary_screen/page_skills.bin.lz\");\nconst u32 gSummaryScreen_PageMoves_Tilemap[] = INCBIN_U32(\"graphics/summary_screen/page_moves.bin.lz\");\nconst u32 gSummaryScreen_PageMovesInfo_Tilemap[] = INCBIN_U32(\"graphics/summary_screen/page_moves_info.bin.lz\");\nconst u32 gSummaryScreen_PageEgg_Tilemap[] = INCBIN_U32(\"graphics/summary_screen/page_egg.bin.lz\");\n\nconst u16 gUnusedRedPalette[] = INCBIN_U16(\"graphics/unused/red_palette.gbapal\");\n\nconst u32 gEasyChatRectangleCursor_Gfx[] = INCBIN_U32(\"graphics/easy_chat/rectangle_cursor.4bpp.lz\");\nconst u16 gSummaryScreen_StatusAilmentIcon_Pal[] = INCBIN_U16(\"graphics/summary_screen/status_ailment_icons.gbapal\");\nconst u32 gSummaryScreen_StatusAilmentIcon_Gfx[] = INCBIN_U32(\"graphics/summary_screen/status_ailment_icons.4bpp.lz\");\n\nconst u16 gDexScreen_TopMenuIconPals_AtoZ[] = INCBIN_U16(\"graphics/pokedex/cat_icon_abc.gbapal\");\nconst u32 gDexScreen_TopMenuIconTiles_AtoZ[] = INCBIN_U32(\"graphics/pokedex/cat_icon_abc.4bpp.lz\");\n\nconst u16 gPokeStoragePartyMenu_Pal[] = INCBIN_U16(\"graphics/pokemon_storage/party_menu.gbapal\");\nconst u16 gPokeStorageInterface_Pal[] = INCBIN_U16(\"graphics/pokemon_storage/interface.gbapal\");\nconst u16 gPokeStorageInterface_NoDisplayMon_Pal[] = INCBIN_U16(\"graphics/pokemon_storage/interface_no_display_mon.gbapal\");\nconst u32 gPokeStorageMenu_Gfx[] = INCBIN_U32(\"graphics/pokemon_storage/menu.4bpp.lz\");\nconst u32 gPokeStoragePartyMenu_Tilemap[] = INCBIN_U32(\"graphics/pokemon_storage/party_menu.bin.lz\");\nconst u16 gMonMarkingsMenu_Pal[] = INCBIN_U16(\"graphics/misc/markings2.gbapal\");\nconst u16 gMonMarkingsMenu_Gfx[] = INCBIN_U16(\"graphics/misc/markings2.4bpp\");\n\nconst u16 gTradeMenu_Pal[] = INCBIN_U16(\"graphics/trade/menu.gbapal\");\nconst u16 gTradeCursor_Pal[] = INCBIN_U16(\"graphics/trade/cursor.gbapal\");\nconst u16 gTradeMenu_Gfx[] = INCBIN_U16(\"graphics/trade/menu.4bpp\");\nconst u16 gTradeCursor_Gfx[] = INCBIN_U16(\"graphics/trade/cursor.4bpp\");\nconst u16 gTradeUnused_Tilemap[] = INCBIN_U16(\"graphics/trade/unused.bin\");\nconst u16 gTradeMenu_Tilemap[] = INCBIN_U16(\"graphics/trade/menu.bin\");\nconst u16 gTradeMenuMonBox_Tilemap[] = INCBIN_U16(\"graphics/trade/menu_mon_box.bin\");\n\nconst u16 gFameCheckerBgPals[][16] = INCBIN_U16(\"graphics/fame_checker/bg.gbapal\");\nconst u16 gFameCheckerBgTiles[] = INCBIN_U16(\"graphics/fame_checker/bg.4bpp\");\nconst u16 gFameCheckerBg3Tilemap[] = INCBIN_U16(\"graphics/fame_checker/tilemap3.bin\");\nconst u16 gFameCheckerBg2Tilemap[] = INCBIN_U16(\"graphics/fame_checker/tilemap2.bin\");\n\nconst u16 gUnionRoomChat_Bg_Pal[] = INCBIN_U16(\"graphics/union_room_chat/bg.gbapal\");\nconst u32 gUnionRoomChat_Bg_Gfx[] = INCBIN_U32(\"graphics/union_room_chat/bg.4bpp.lz\");\nconst u32 gUnionRoomChat_Bg_Tilemap[] = INCBIN_U32(\"graphics/union_room_chat/bg.bin.lz\");\nconst u32 gUnionRoomChat_Icons_Gfx[] = INCBIN_U32(\"graphics/union_room_chat/icons.4bpp.lz\");\n\nconst u16 gTilesetPalettes_General[][16] =\n{\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/00.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/01.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/02.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/03.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/04.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/05.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/06.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/07.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/08.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/09.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/10.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/11.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/12.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/13.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/14.gbapal\"),\n    INCBIN_U16(\"data/tilesets/primary/general/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_General[] = INCBIN_U32(\"data/tilesets/primary/general/tiles.4bpp.lz\");\n\nconst u8 gBerryFixGameboy_Pal[] = INCBIN_U8(\"graphics/berry_fix/gba_small.gbapal\");\nconst u8 gBerryFixGameboy_Gfx[] = INCBIN_U8(\"graphics/berry_fix/gba_small.4bpp.lz\");\nconst u8 gBerryFixGameboy_Tilemap[] = INCBIN_U8(\"graphics/berry_fix/gba_small.bin.lz\");\nconst u8 gBerryFixGameboyLogo_Pal[] = INCBIN_U8(\"graphics/berry_fix/logo.gbapal\");\nconst u8 gBerryFixGameboyLogo_Gfx[] = INCBIN_U8(\"graphics/berry_fix/logo.4bpp.lz\");\nconst u8 gBerryFixGameboyLogo_Tilemap[] = INCBIN_U8(\"graphics/berry_fix/logo.bin.lz\");\nconst u8 gBerryFixGbaTransfer_Pal[] = INCBIN_U8(\"graphics/berry_fix/gba_transfer.gbapal\");\nconst u8 gBerryFixGbaTransfer_Gfx[] = INCBIN_U8(\"graphics/berry_fix/gba_transfer.4bpp.lz\");\nconst u8 gBerryFixGbaTransfer_Tilemap[] = INCBIN_U8(\"graphics/berry_fix/gba_transfer.bin.lz\");\nconst u8 gBerryFixGbaTransferHighlight_Pal[] = INCBIN_U8(\"graphics/berry_fix/gba_transfer_highlight.gbapal\");\nconst u8 gBerryFixGbaTransferHighlight_Gfx[] = INCBIN_U8(\"graphics/berry_fix/gba_transfer_highlight.4bpp.lz\");\nconst u8 gBerryFixGbaTransferHighlight_Tilemap[] = INCBIN_U8(\"graphics/berry_fix/gba_transfer_highlight.bin.lz\");\nconst u8 gBerryFixGbaTransferError_Pal[] = INCBIN_U8(\"graphics/berry_fix/gba_transfer_error.gbapal\");\nconst u8 gBerryFixGbaTransferError_Gfx[] = INCBIN_U8(\"graphics/berry_fix/gba_transfer_error.4bpp.lz\");\nconst u8 gBerryFixGbaTransferError_Tilemap[] = INCBIN_U8(\"graphics/berry_fix/gba_transfer_error.bin.lz\");\nconst u8 gBerryFixWindow_Pal[] = INCBIN_U8(\"graphics/berry_fix/window.gbapal\");\nconst u8 gBerryFixWindow_Gfx[] = INCBIN_U8(\"graphics/berry_fix/window.4bpp.lz\");\nconst u8 gBerryFixWindow_Tilemap[] = INCBIN_U8(\"graphics/berry_fix/window.bin.lz\");\n\nconst u16 gTilesetPalettes_GenericBuilding1[][16] =\n{\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/00.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/01.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/02.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/03.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/04.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/05.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/06.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/07.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/08.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/09.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/10.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/11.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/12.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/13.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/14.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/generic_building_1/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_GenericBuilding1[] = INCBIN_U32(\"data/tilesets/secondary/generic_building_1/tiles.4bpp.lz\");\n\nconst u16 gTilesetPalettes_DepartmentStore[][16] =\n{\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/00.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/01.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/02.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/03.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/04.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/05.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/06.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/07.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/08.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/09.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/10.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/11.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/12.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/13.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/14.gbapal\"),\n    INCBIN_U16(\"data/tilesets/secondary/department_store/palettes/15.gbapal\"),\n};\n\nconst u32 gTilesetTiles_DepartmentStore[] = INCBIN_U32(\"data/tilesets/secondary/department_store/tiles.4bpp.lz\");\n\nconst u16 gUnionRoomChat_Panel_Pal[] = INCBIN_U16(\"graphics/union_room_chat/panel.gbapal\");\nconst u32 gUnionRoomChat_Panel_Gfx[] = INCBIN_U32(\"graphics/union_room_chat/panel.4bpp.lz\");\nconst u32 gUnionRoomChat_Panel_Tilemap[] = INCBIN_U32(\"graphics/union_room_chat/panel.bin.lz\");\n\nconst u16 gCreditsMonPokeball_Pals[][16] =\n{\n    INCBIN_U16(\"graphics/credits/pokeball_charizard.gbapal\"),\n    INCBIN_U16(\"graphics/credits/pokeball_venusaur.gbapal\"),\n    INCBIN_U16(\"graphics/credits/pokeball_blastoise.gbapal\"),\n    INCBIN_U16(\"graphics/credits/pokeball_pikachu.gbapal\"),\n};\n\nconst u32 gCreditsMonPokeball_Tiles[] = INCBIN_U32(\"graphics/credits/pokeball.4bpp.lz\");\nconst u32 gCreditsMonPokeball_Tilemap[] = INCBIN_U32(\"graphics/credits/pokeball.bin.lz\");\n\nconst u16 gGraphics_TitleScreen_GameTitleLogoPals_FR[] = INCBIN_U16(\"graphics/title_screen/firered/game_title_logo.gbapal\");\nconst u8 gGraphics_TitleScreen_GameTitleLogoTiles_FR[] = INCBIN_U8(\"graphics/title_screen/firered/game_title_logo.8bpp.lz\");\nconst u8 gGraphics_TitleScreen_GameTitleLogoMap_FR[] = INCBIN_U8(\"graphics/title_screen/firered/game_title_logo.bin.lz\");\nconst u16 gGraphics_TitleScreen_BoxArtMonPals_FR[] = INCBIN_U16(\"graphics/title_screen/firered/box_art_mon.gbapal\");\nconst u8 gGraphics_TitleScreen_BoxArtMonTiles_FR[] = INCBIN_U8(\"graphics/title_screen/firered/box_art_mon.4bpp.lz\");\nconst u8 gGraphics_TitleScreen_BoxArtMonMap_FR[] = INCBIN_U8(\"graphics/title_screen/firered/box_art_mon.bin.lz\");\nconst u16 gGraphics_TitleScreen_BackgroundPals_FR[] = INCBIN_U16(\"graphics/title_screen/firered/background.gbapal\");\nconst u16 gTitleScreen_Slash_Pal_FR[] = INCBIN_U16(\"graphics/title_screen/firered/slash.gbapal\");\n\nconst u16 gGraphics_TitleScreen_GameTitleLogoPals_LG[] = INCBIN_U16(\"graphics/title_screen/leafgreen/game_title_logo.gbapal\");\nconst u8 gGraphics_TitleScreen_GameTitleLogoTiles_LG[] = INCBIN_U8(\"graphics/title_screen/leafgreen/game_title_logo.8bpp.lz\");\nconst u8 gGraphics_TitleScreen_GameTitleLogoMap_LG[] = INCBIN_U8(\"graphics/title_screen/leafgreen/game_title_logo.bin.lz\");\nconst u16 gGraphics_TitleScreen_BoxArtMonPals_LG[] = INCBIN_U16(\"graphics/title_screen/leafgreen/box_art_mon.gbapal\");\nconst u8 gGraphics_TitleScreen_BoxArtMonTiles_LG[] = INCBIN_U8(\"graphics/title_screen/leafgreen/box_art_mon.4bpp.lz\");\nconst u8 gGraphics_TitleScreen_BoxArtMonMap_LG[] = INCBIN_U8(\"graphics/title_screen/leafgreen/box_art_mon.bin.lz\");\nconst u16 gGraphics_TitleScreen_BackgroundPals_LG[] = INCBIN_U16(\"graphics/title_screen/leafgreen/background.gbapal\");\nconst u16 gTitleScreen_Slash_Pal_LG[] = INCBIN_U16(\"graphics/title_screen/leafgreen/slash.gbapal\");\n\nconst u8 gGraphics_TitleScreen_CopyrightPressStartTiles[] = INCBIN_U8(\"graphics/title_screen/copyright_press_start.4bpp.lz\");\nconst u8 gGraphics_TitleScreen_CopyrightPressStartMap[] = INCBIN_U8(\"graphics/title_screen/copyright_press_start.bin.lz\");\nconst u32 gTitleScreen_BlankSprite_Tiles[] = INCBIN_U32(\"graphics/title_screen/blank_sprite.4bpp.lz\");\n\nconst u16 gCreditsCopyright_Pal[] = INCBIN_U16(\"graphics/credits/copyright.gbapal\");\nconst u8 gCreditsCopyright_Tiles[] = INCBIN_U8(\"graphics/credits/copyright.4bpp.lz\");\nconst u8 gCreditsCopyright_Tilemap[] = INCBIN_U8(\"graphics/credits/copyright.bin.lz\");\n\nconst u32 gTradeGba_Pal[] = INCBIN_U32(\"graphics/trade/gba.gbapal\");\nconst u32 gTradeGba2_Pal[] = INCBIN_U32(\"graphics/trade/gba_pal2.gbapal\");\nconst u32 gTradeGba_Gfx[] = INCBIN_U32(\"graphics/trade/gba.4bpp\");\n\nconst u16 sEmptyPal[16] = {0};\n\nconst u16 gBerryCrush_Crusher_Pal[] = INCBIN_U16(\"graphics/berry_crush/crusher.gbapal\");\nconst u32 gBerryCrush_Crusher_Gfx[] = INCBIN_U32(\"graphics/berry_crush/crusher.4bpp.lz\");\nconst u32 gBerryCrush_TextWindows_Tilemap[] = INCBIN_U32(\"graphics/berry_crush/text_windows.bin.lz\");\n\nconst u16 gCableCarBg_Pal[]    = INCBIN_U16(\"graphics/cable_car/bg.gbapal\");\nconst u16 gCableCar_Pal[]      = INCBIN_U16(\"graphics/cable_car/cable_car.gbapal\");\nconst u32 gCableCarBg_Gfx[]    = INCBIN_U32(\"graphics/cable_car/bg.4bpp.lz\");\nconst u32 gCableCar_Gfx[]      = INCBIN_U32(\"graphics/cable_car/cable_car.4bpp.lz\");\nconst u32 gCableCarDoor_Gfx[]  = INCBIN_U32(\"graphics/cable_car/door.4bpp.lz\");\nconst u32 gCableCarCable_Gfx[] = INCBIN_U32(\"graphics/cable_car/cable.4bpp.lz\");\n"
  },
  {
    "path": "src/hall_of_fame.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"scanline_effect.h\"\n#include \"task.h\"\n#include \"save.h\"\n#include \"data.h\"\n#include \"m4a.h\"\n#include \"help_system.h\"\n#include \"hall_of_fame.h\"\n#include \"quest_log.h\"\n#include \"pc_screen_effect.h\"\n#include \"new_menu_helpers.h\"\n#include \"strings.h\"\n#include \"credits.h\"\n#include \"event_data.h\"\n#include \"overworld.h\"\n#include \"trainer_pokemon_sprites.h\"\n#include \"text_window.h\"\n#include \"field_fadetransition.h\"\n#include \"menu.h\"\n#include \"string_util.h\"\n#include \"trig.h\"\n#include \"random.h\"\n#include \"graphics.h\"\n#include \"constants/songs.h\"\n#include \"constants/maps.h\"\n\n#define HALL_OF_FAME_MAX_TEAMS 50\n#define HALL_OF_FAME_BG_PAL    RGB(22, 24, 29)\n\nstruct HallofFameMon\n{\n    u32 tid;\n    u32 personality;\n    u16 species:9;\n    u16 lvl:7;\n    u8 nick[POKEMON_NAME_LENGTH];\n};\n\nstruct HallofFameTeam\n{\n    struct HallofFameMon mon[PARTY_SIZE];\n};\n\nSTATIC_ASSERT(sizeof(struct HallofFameTeam) * HALL_OF_FAME_MAX_TEAMS <= SECTOR_DATA_SIZE * NUM_HOF_SECTORS, HallOfFameFreeSpace);\n\nstruct HofGfx\n{\n    u16 state;\n    u8 field_2[4];\n    u8 tilemap1[0x1000];\n    u8 tilemap2[0x1000];\n};\n\nstatic EWRAM_DATA u32 sSelectedPaletteIndices = 0;\nstatic EWRAM_DATA struct HallofFameTeam * sHofMonPtr = NULL;\nstatic EWRAM_DATA struct HofGfx * sHofGfxPtr = NULL;\n\nstatic void Task_Hof_InitMonData(u8 taskId);\nstatic void Task_Hof_InitTeamSaveData(u8 taskId);\nstatic void Task_Hof_TrySaveData(u8 taskId);\nstatic void Task_Hof_DelayAfterSave(u8 taskId);\nstatic void Task_Hof_StartDisplayingMons(u8 taskId);\nstatic void Task_Hof_DisplayMon(u8 taskId);\nstatic void Task_Hof_PlayMonCryAndPrintInfo(u8 taskId);\nstatic void Task_Hof_TryDisplayAnotherMon(u8 taskId);\nstatic void Task_Hof_PaletteFadeAndPrintWelcomeText(u8 taskId);\nstatic void Task_Hof_ApplauseAndConfetti(u8 taskId);\nstatic void Task_Hof_WaitBorderFadeAway(u8 taskId);\nstatic void Task_Hof_SpawnPlayerPic(u8 taskId);\nstatic void Task_Hof_WaitAndPrintPlayerInfo(u8 taskId);\nstatic void Task_Hof_ExitOnKeyPressed(u8 taskId);\nstatic void Task_Hof_HandlePaletteOnExit(u8 taskId);\nstatic void Task_Hof_HandleExit(u8 taskId);\nstatic void SetWarpsToRollCredits(void);\nstatic void Task_HofPC_CopySaveData(u8 taskId);\nstatic void Task_HofPC_DrawSpritesPrintText(u8 taskId);\nstatic void Task_HofPC_PrintMonInfo(u8 taskId);\nstatic void Task_HofPC_HandleInput(u8 taskId);\nstatic void Task_HofPC_HandlePaletteOnExit(u8 taskId);\nstatic void Task_HofPC_HandleExit(u8 taskId);\nstatic void Task_HofPC_PrintDataIsCorrupted(u8 taskId);\nstatic void Task_HofPC_ExitOnButtonPress(u8 taskId);\nstatic void HallOfFame_PrintWelcomeText(u8 a0, u8 a1);\nstatic void HallOfFame_PrintMonInfo(struct HallofFameMon * hofMon, u8 a1, u8 a2);\nstatic void HallOfFame_PrintPlayerInfo(u8 a0, u8 a1);\nstatic void ClearVramOamPltt_LoadHofPal(void);\nstatic void HofInit_ResetGpuBuffersAndLoadConfettiGfx(void);\nstatic void Hof_InitBgs(void);\nstatic bool8 DrawHofBackground(void);\nstatic void SpriteCB_GetOnScreen(struct Sprite *sprite);\nstatic void SpriteCB_Confetti(struct Sprite *sprite);\nstatic bool8 Hof_SpawnConfetti(void);\n\nstatic const struct BgTemplate sHof_BgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    },\n    {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    },\n    {\n        .bg = 3,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplate = {\n    .bg = 0,\n    .tilemapLeft = 2,\n    .tilemapTop = 2,\n    .width = 17,\n    .height = 6,\n    .paletteNum = 13,\n    .baseBlock = 0x001\n};\n\nstatic const u8 sTextColors[][4] = {\n    { 0, 1, 2 },\n    { 0, 2, 3 },\n    { 4, 5, 0 }\n};\n\nstatic const struct CompressedSpriteSheet sHallOfFame_ConfettiSpriteSheet[] = {\n    {gFile_graphics_misc_confetti_sheet, 0x220, 1001},\n    {}\n};\n\nstatic const struct CompressedSpritePalette sHallOfFame_ConfettiSpritePalette[] = {\n    {gFile_graphics_misc_confetti_palette, 1001},\n    {}\n};\n\nstatic const s16 sHallOfFame_MonFullTeamPositions[6][4] =\n{\n    {120,   210,    120,    40},\n    {326,   220,    56,     40},\n    {-86,   220,    184,    40},\n    {120,   -62,    120,    88},\n    {-70,   -92,    200,    88},\n    {310,   -92,    40,     88}\n};\n\nstatic const s16 sHallOfFame_MonHalfTeamPositions[3][4] =\n{\n    {120,   234,    120,    64},\n    {326,   244,    56,     64},\n    {-86,   244,    184,    64}\n};\n\nstatic const struct OamData sOamData_Confetti = {\n    .shape = SPRITE_SHAPE(8x8),\n    .size = SPRITE_SIZE(8x8)\n};\n\nstatic const union AnimCmd sAnimCmd_Frame00[] = {\n    ANIMCMD_FRAME( 0, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame01[] = {\n    ANIMCMD_FRAME( 1, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame02[] = {\n    ANIMCMD_FRAME( 2, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame03[] = {\n    ANIMCMD_FRAME( 3, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame04[] = {\n    ANIMCMD_FRAME( 4, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame05[] = {\n    ANIMCMD_FRAME( 5, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame06[] = {\n    ANIMCMD_FRAME( 6, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame07[] = {\n    ANIMCMD_FRAME( 7, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame08[] = {\n    ANIMCMD_FRAME( 8, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame09[] = {\n    ANIMCMD_FRAME( 9, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame10[] = {\n    ANIMCMD_FRAME(10, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame11[] = {\n    ANIMCMD_FRAME(11, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame12[] = {\n    ANIMCMD_FRAME(12, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame13[] = {\n    ANIMCMD_FRAME(13, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame14[] = {\n    ANIMCMD_FRAME(14, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame15[] = {\n    ANIMCMD_FRAME(15, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Frame16[] = {\n    ANIMCMD_FRAME(16, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_Confetti[] = {\n    sAnimCmd_Frame00,\n    sAnimCmd_Frame01,\n    sAnimCmd_Frame02,\n    sAnimCmd_Frame03,\n    sAnimCmd_Frame04,\n    sAnimCmd_Frame05,\n    sAnimCmd_Frame06,\n    sAnimCmd_Frame07,\n    sAnimCmd_Frame08,\n    sAnimCmd_Frame09,\n    sAnimCmd_Frame10,\n    sAnimCmd_Frame11,\n    sAnimCmd_Frame12,\n    sAnimCmd_Frame13,\n    sAnimCmd_Frame14,\n    sAnimCmd_Frame15,\n    sAnimCmd_Frame16\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Confetti = {\n    .tileTag = 1001,\n    .paletteTag = 1001,\n    .oam = &sOamData_Confetti,\n    .anims = sSpriteAnimTable_Confetti,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_Confetti\n};\n\nstatic const u16 sHallOfFame_Pal[] = INCBIN_U16(\"graphics/hall_of_fame/hall_of_fame.gbapal\");\nstatic const u32 sHallOfFame_Gfx[] = INCBIN_U32(\"graphics/hall_of_fame/hall_of_fame.4bpp.lz\");\n\nstatic const struct HallofFameMon sDummyHofMon = {\n    .tid = 0x03EA03EA, // (u16[]){1002, 1002} corrupted sprite template?\n    .personality = 0,\n    .species = SPECIES_NONE,\n    .lvl = 0,\n    .nick = __(\"          \")\n};\n\nstatic const u8 sUnused[] = {2, 1, 3, 6, 4, 5};\n\nstatic void VBlankCB_HofIdle(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void CB2_HofIdle(void)\n{\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic bool8 InitHallOfFameScreen(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        gHelpSystemEnabled = FALSE;\n        SetVBlankCallback(NULL);\n        ClearVramOamPltt_LoadHofPal();\n        sHofGfxPtr = AllocZeroed(sizeof(struct HofGfx));\n        gMain.state = 1;\n        break;\n    case 1:\n        HofInit_ResetGpuBuffersAndLoadConfettiGfx();\n        gMain.state++;\n        break;\n    case 2:\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 7));\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        Hof_InitBgs();\n        sHofGfxPtr->state = 0;\n        gMain.state++;\n        break;\n    case 3:\n        if (!DrawHofBackground())\n        {\n            SetVBlankCallback(VBlankCB_HofIdle);\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n            gMain.state++;\n        }\n        break;\n    case 4:\n        UpdatePaletteFade();\n        if (!gPaletteFade.active)\n        {\n            SetMainCallback2(CB2_HofIdle);\n            PlayBGM(MUS_HALL_OF_FAME);\n            return FALSE;\n        }\n        break;\n    }\n    return TRUE;\n}\n\nvoid CB2_DoHallOfFameScreen(void)\n{\n    u8 taskId;\n    if (!InitHallOfFameScreen())\n    {\n        taskId = CreateTask(Task_Hof_InitMonData, 0);\n        gTasks[taskId].data[0] = FALSE;\n        sHofMonPtr = AllocZeroed(sizeof(struct HallofFameTeam));\n    }\n}\n\nvoid CB2_DoHallOfFameScreenDontSaveData(void)\n{\n    u8 taskId;\n    if (!InitHallOfFameScreen())\n    {\n        taskId = CreateTask(Task_Hof_InitMonData, 0);\n        gTasks[taskId].data[0] = TRUE;\n    }\n}\n\nstatic void Task_Hof_InitMonData(u8 taskId)\n{\n    u32 i;\n    u32 j;\n    u8 nick[11];\n\n    gTasks[taskId].data[2] = 0;\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE)\n        {\n            sHofMonPtr[0].mon[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG);\n            sHofMonPtr[0].mon[i].tid = GetMonData(&gPlayerParty[i], MON_DATA_OT_ID);\n            sHofMonPtr[0].mon[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);\n            if(sHofMonPtr[0].mon[i].species == SPECIES_DEOXYS)\n            {\n                switch(GetMonData(&gPlayerParty[i], MON_DATA_FORME))\n                {\n                case 1: //Attack Forme\n                    sHofMonPtr[0].mon[i].personality = 65531;\n                    break;\n                case 2: //Defense Forme\n                    sHofMonPtr[0].mon[i].personality = 65532;\n                    break;\n                case 3: //Speed Forme\n                    sHofMonPtr[0].mon[i].personality = 65533;\n                    break;\n                default: //Normal Forme\n                    sHofMonPtr[0].mon[i].personality = 65530;\n                    break;\n                }\n            }\n            sHofMonPtr[0].mon[i].lvl = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);\n            GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nick);\n            for (j = 0; j < 10; j++)\n                sHofMonPtr[0].mon[i].nick[j] = nick[j];\n            gTasks[taskId].data[2]++;\n        }\n        else\n        {\n            sHofMonPtr[0].mon[i].species = SPECIES_NONE;\n            sHofMonPtr[0].mon[i].tid = 0;\n            sHofMonPtr[0].mon[i].personality = 0;\n            sHofMonPtr[0].mon[i].lvl = 0;\n            sHofMonPtr[0].mon[i].nick[0] = EOS;\n        }\n    }\n    sSelectedPaletteIndices = 0;\n    gTasks[taskId].data[1] = 0;\n    gTasks[taskId].data[4] = 0xFF;\n    for (i = 0; i < 6; i++)\n        gTasks[taskId].data[i + 5] = 0xFF;\n    if (gTasks[taskId].data[0])\n        gTasks[taskId].func = Task_Hof_StartDisplayingMons;\n    else\n        gTasks[taskId].func = Task_Hof_InitTeamSaveData;\n}\n\nstatic void Task_Hof_InitTeamSaveData(u8 taskId)\n{\n    u32 i;\n    struct HallofFameTeam* lastSavedTeam = (struct HallofFameTeam *)(gDecompressionBuffer);\n\n    SaveQuestLogData();\n    if (!gHasHallOfFameRecords)\n    {\n        memset(gDecompressionBuffer, 0, SECTOR_SIZE * NUM_HOF_SECTORS);\n    }\n    else\n    {\n        if (LoadGameSave(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK)\n            memset(gDecompressionBuffer, 0, SECTOR_SIZE * NUM_HOF_SECTORS);\n    }\n\n    for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, lastSavedTeam++)\n    {\n        if (lastSavedTeam[0].mon[0].species == SPECIES_NONE)\n            break;\n    }\n    if (i >= HALL_OF_FAME_MAX_TEAMS)\n    {\n        struct HallofFameTeam *afterTeam = (struct HallofFameTeam *)(gDecompressionBuffer);\n        struct HallofFameTeam *beforeTeam = (struct HallofFameTeam *)(gDecompressionBuffer);\n        afterTeam++;\n        for (i = 0; i < HALL_OF_FAME_MAX_TEAMS - 1; i++, beforeTeam++, afterTeam++)\n        {\n            *beforeTeam = *afterTeam;\n        }\n        lastSavedTeam--;\n    }\n    *lastSavedTeam = *sHofMonPtr;\n\n    DrawDialogueFrame(0, 0);\n    AddTextPrinterParameterized2(0, FONT_NORMAL, gText_SavingDontTurnOffThePower2, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    CopyWindowToVram(0, COPYWIN_FULL);\n    gTasks[taskId].func = Task_Hof_TrySaveData;\n}\n\nstatic void Task_Hof_TrySaveData(u8 taskId)\n{\n    gGameContinueCallback = CB2_DoHallOfFameScreenDontSaveData;\n    TrySavingData(SAVE_HALL_OF_FAME);\n    PlaySE(SE_SAVE);\n    gTasks[taskId].func = Task_Hof_DelayAfterSave;\n    gTasks[taskId].data[3] = 32;\n}\n\nstatic void Task_Hof_DelayAfterSave(u8 taskId)\n{\n    if (gTasks[taskId].data[3] != 0)\n        gTasks[taskId].data[3]--;\n    else\n        gTasks[taskId].func = Task_Hof_StartDisplayingMons;\n}\n\nstatic void Task_Hof_StartDisplayingMons(u8 taskId)\n{\n    gTasks[taskId].func = Task_Hof_DisplayMon;\n}\n\nstatic void Task_Hof_DisplayMon(u8 taskId)\n{\n    u8 spriteId;\n    s16 srcX;\n    s16 srcY;\n    s16 dstX;\n    s16 dstY;\n\n    u16 currMonId = gTasks[taskId].data[1];\n    struct HallofFameMon* currMon = &sHofMonPtr[0].mon[currMonId];\n\n\n    if (gTasks[taskId].data[2] > 3)\n    {\n        srcX = sHallOfFame_MonFullTeamPositions[currMonId][0];\n        srcY = sHallOfFame_MonFullTeamPositions[currMonId][1];\n        dstX = sHallOfFame_MonFullTeamPositions[currMonId][2];\n        dstY = sHallOfFame_MonFullTeamPositions[currMonId][3];\n    }\n    else\n    {\n        srcX = sHallOfFame_MonHalfTeamPositions[currMonId][0];\n        srcY = sHallOfFame_MonHalfTeamPositions[currMonId][1];\n        dstX = sHallOfFame_MonHalfTeamPositions[currMonId][2];\n        dstY = sHallOfFame_MonHalfTeamPositions[currMonId][3];\n    }\n\n    if(currMon->species == SPECIES_DEOXYS)\n        spriteId = CreateMonPicSprite_HandleDeoxys(currMon->personality, currMon->tid, currMon->personality, 1, srcX, srcY, currMonId, 0xFFFF);\n    else\n        spriteId = CreateMonPicSprite_HandleDeoxys(currMon->species, currMon->tid, currMon->personality, 1, srcX, srcY, currMonId, 0xFFFF);\n    gSprites[spriteId].data[1] = dstX;\n    gSprites[spriteId].data[2] = dstY;\n    gSprites[spriteId].data[0] = 0;\n    gSprites[spriteId].callback = SpriteCB_GetOnScreen;\n    gTasks[taskId].data[5 + currMonId] = spriteId;\n    ClearDialogWindowAndFrame(0, TRUE);\n    gTasks[taskId].func = Task_Hof_PlayMonCryAndPrintInfo;\n}\n\nstatic void Task_Hof_PlayMonCryAndPrintInfo(u8 taskId)\n{\n    u16 currMonId = gTasks[taskId].data[1];\n    struct HallofFameMon* currMon = &sHofMonPtr[0].mon[currMonId];\n    if (gSprites[gTasks[taskId].data[5 + currMonId]].data[0])\n    {\n        if (currMon->species != SPECIES_EGG)\n            PlayCry_Normal(currMon->species, 0);\n        HallOfFame_PrintMonInfo(currMon, 0, 14);\n        gTasks[taskId].data[3] = 120;\n        gTasks[taskId].func = Task_Hof_TryDisplayAnotherMon;\n    }\n}\n\nstatic void Task_Hof_TryDisplayAnotherMon(u8 taskId)\n{\n    u16 currPokeId = gTasks[taskId].data[1];\n    struct HallofFameMon* currMon = &sHofMonPtr[0].mon[currPokeId];\n\n    if (gTasks[taskId].data[3] != 0)\n    {\n        gTasks[taskId].data[3]--;\n    }\n    else\n    {\n        sSelectedPaletteIndices |= (0x10000 << gSprites[gTasks[taskId].data[5 + currPokeId]].oam.paletteNum);\n        if (gTasks[taskId].data[1] < PARTY_SIZE - 1 && currMon[1].species != SPECIES_NONE) // there is another pokemon to display\n        {\n            gTasks[taskId].data[1]++;\n            BeginNormalPaletteFade(sSelectedPaletteIndices, 0, 12, 12, HALL_OF_FAME_BG_PAL);\n            gSprites[gTasks[taskId].data[5 + currPokeId]].oam.priority = 1;\n            gTasks[taskId].func = Task_Hof_DisplayMon;\n        }\n        else\n        {\n            gTasks[taskId].func = Task_Hof_PaletteFadeAndPrintWelcomeText;\n        }\n    }\n}\n\nstatic void Task_Hof_PaletteFadeAndPrintWelcomeText(u8 taskId)\n{\n    u32 i;\n\n    BeginNormalPaletteFade(PALETTES_OBJECTS, 0, 0, 0, RGB_BLACK);\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (gTasks[taskId].data[5 + i] != 0xFF)\n            gSprites[gTasks[taskId].data[5 + i]].oam.priority = 0;\n    }\n\n    HallOfFame_PrintWelcomeText(0, 15);\n    PlaySE(SE_APPLAUSE);\n    gTasks[taskId].data[3] = 400;\n    gTasks[taskId].func = Task_Hof_ApplauseAndConfetti;\n}\n\nstatic void Task_Hof_ApplauseAndConfetti(u8 taskId)\n{\n    if (gTasks[taskId].data[3] != 0)\n    {\n        gTasks[taskId].data[3]--;\n        if ((gTasks[taskId].data[3] & 3) == 0 && gTasks[taskId].data[3] > 110)\n            Hof_SpawnConfetti();\n    }\n    else\n    {\n        u32 i;\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (gTasks[taskId].data[5 + i] != 0xFF)\n                gSprites[gTasks[taskId].data[5 + i]].oam.priority = 1;\n        }\n        BeginNormalPaletteFade(sSelectedPaletteIndices, 0, 12, 12, HALL_OF_FAME_BG_PAL);\n        FillWindowPixelBuffer(0, PIXEL_FILL(0));\n        CopyWindowToVram(0, COPYWIN_FULL);\n        gTasks[taskId].data[3] = 7;\n        gTasks[taskId].func = Task_Hof_WaitBorderFadeAway;\n    }\n}\n\nstatic void Task_Hof_WaitBorderFadeAway(u8 taskId)\n{\n    if (gTasks[taskId].data[3] > 15)\n    {\n        gTasks[taskId].func = Task_Hof_SpawnPlayerPic;\n    }\n    else\n    {\n        gTasks[taskId].data[3]++;\n        SetGpuReg(REG_OFFSET_BLDALPHA, 256 * gTasks[taskId].data[3]);\n    }\n}\n\nstatic void Task_Hof_SpawnPlayerPic(u8 taskId)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(3);\n    gTasks[taskId].data[4] = CreateTrainerPicSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender, TRUE), TRUE, 0x78, 0x48, 6, 0xFFFF);\n    AddWindow(&sWindowTemplate);\n    LoadStdWindowGfx(1, 0x21D, BG_PLTT_ID(13));\n    gTasks[taskId].data[3] = 120;\n    gTasks[taskId].func = Task_Hof_WaitAndPrintPlayerInfo;\n}\n\nstatic void Task_Hof_WaitAndPrintPlayerInfo(u8 taskId)\n{\n    if (gTasks[taskId].data[3] != 0)\n    {\n        gTasks[taskId].data[3]--;\n    }\n    else if (gSprites[gTasks[taskId].data[4]].x != 192)\n    {\n        gSprites[gTasks[taskId].data[4]].x++;\n    }\n    else\n    {\n        FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);\n        HallOfFame_PrintPlayerInfo(1, 2);\n        DrawDialogueFrame(0, 0);\n        AddTextPrinterParameterized2(0, FONT_NORMAL, gText_LeagueChamp, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n        CopyWindowToVram(0, COPYWIN_FULL);\n        gTasks[taskId].func = Task_Hof_ExitOnKeyPressed;\n    }\n}\n\nstatic void Task_Hof_ExitOnKeyPressed(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON))\n    {\n        FadeOutBGM(4);\n        gTasks[taskId].func = Task_Hof_HandlePaletteOnExit;\n    }\n}\n\nstatic void Task_Hof_HandlePaletteOnExit(u8 taskId)\n{\n    CpuCopy16(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE);\n    BeginNormalPaletteFade(PALETTES_ALL, 8, 0, 16, RGB_BLACK);\n    gTasks[taskId].func = Task_Hof_HandleExit;\n}\n\nstatic void Task_Hof_HandleExit(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        s32 i;\n\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            u8 spriteId = gTasks[taskId].data[5 + i];\n            if (spriteId != 0xFF)\n            {\n                FreeAndDestroyMonPicSprite(spriteId);\n            }\n        }\n\n        FreeAndDestroyTrainerPicSprite(gTasks[taskId].data[4]);\n        HideBg(0);\n        HideBg(1);\n        HideBg(3);\n        FreeAllWindowBuffers();\n        UnsetBgTilemapBuffer(1);\n        UnsetBgTilemapBuffer(3);\n        ResetBgsAndClearDma3BusyFlags(0);\n        DestroyTask(taskId);\n\n        if (sHofGfxPtr != NULL)\n        FREE_AND_SET_NULL(sHofGfxPtr);\n        if (sHofMonPtr != NULL)\n        FREE_AND_SET_NULL(sHofMonPtr);\n\n        SetWarpsToRollCredits();\n    }\n}\n\nstatic void SetWarpsToRollCredits(void)\n{\n    VarSet(VAR_MAP_SCENE_INDIGO_PLATEAU_EXTERIOR, 1);\n    FlagSet(FLAG_DONT_SHOW_MAP_NAME_POPUP);\n    gDisableMapMusicChangeOnMapLoad = 2;\n    SetWarpDestination(MAP_GROUP(INDIGO_PLATEAU_EXTERIOR), MAP_NUM(INDIGO_PLATEAU_EXTERIOR), -1, 11, 6);\n    DoWarp();\n    ResetInitialPlayerAvatarState();\n}\n\nvoid CB2_InitHofPC(void)\n{\n    switch (gMain.state)\n    {\n    default:\n    case 0:\n        SetVBlankCallback(NULL);\n        ClearVramOamPltt_LoadHofPal();\n        sHofGfxPtr = AllocZeroed(sizeof(struct HofGfx));\n        gMain.state = 1;\n        break;\n    case 1:\n        HofInit_ResetGpuBuffersAndLoadConfettiGfx();\n        gMain.state++;\n        break;\n    case 2:\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        Hof_InitBgs();\n        gMain.state++;\n        break;\n    case 3:\n        if (!DrawHofBackground())\n        {\n            BeginPCScreenEffect_TurnOn(0, 0, 0);\n            SetVBlankCallback(VBlankCB_HofIdle);\n            gMain.state++;\n        }\n        break;\n    case 4:\n        RunTasks();\n        AnimateSprites();\n        BuildOamBuffer();\n        UpdatePaletteFade();\n        if (!IsPCScreenEffectRunning_TurnOn())\n            gMain.state++;\n        break;\n    case 5:\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 7));\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        CreateTask(Task_HofPC_CopySaveData, 0);\n        sHofMonPtr = AllocZeroed(SECTOR_SIZE * NUM_HOF_SECTORS);\n        SetMainCallback2(CB2_HofIdle);\n        break;\n    }\n}\n\nstatic void Task_HofPC_CopySaveData(u8 taskId)\n{\n    u32 i;\n    struct HallofFameTeam* savedTeams;\n\n    CreateTopBarWindowLoadPalette(0, 30, 0, 0x0C, 0x226);\n    if (LoadGameSave(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK)\n    {\n        gTasks[taskId].func = Task_HofPC_PrintDataIsCorrupted;\n    }\n    else\n    {\n        CpuCopy16(gDecompressionBuffer, sHofMonPtr, SECTOR_SIZE * NUM_HOF_SECTORS);\n        savedTeams = sHofMonPtr;\n        for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, savedTeams++)\n        {\n            if (savedTeams->mon[0].species == SPECIES_NONE)\n                break;\n        }\n\n        if (i < HALL_OF_FAME_MAX_TEAMS)\n            gTasks[taskId].data[0] = i - 1;\n        else\n            gTasks[taskId].data[0] = HALL_OF_FAME_MAX_TEAMS - 1;\n\n        gTasks[taskId].data[1] = GetGameStat(GAME_STAT_ENTERED_HOF);\n\n        gTasks[taskId].func = Task_HofPC_DrawSpritesPrintText;\n    }\n}\n\nstatic void Task_HofPC_DrawSpritesPrintText(u8 taskId)\n{\n    struct HallofFameTeam *savedTeams = sHofMonPtr;\n    struct HallofFameMon *currMon;\n    u32 i;\n\n    for (i = 0; i < gTasks[taskId].data[0]; i++)\n        savedTeams++;\n\n    currMon = &savedTeams->mon[0];\n    sSelectedPaletteIndices = 0;\n    gTasks[taskId].data[2] = 0;\n    gTasks[taskId].data[4] = 0;\n\n    for (i = 0; i < PARTY_SIZE; i++, currMon++)\n    {\n        if (currMon->species != SPECIES_NONE)\n            gTasks[taskId].data[4]++;\n    }\n\n    currMon = &savedTeams->mon[0];\n\n    for (i = 0; i < PARTY_SIZE; i++, currMon++)\n    {\n        if (currMon->species != SPECIES_NONE)\n        {\n            u16 spriteId;\n            s16 posX, posY;\n\n            if (gTasks[taskId].data[4] > 3)\n            {\n                posX = sHallOfFame_MonFullTeamPositions[i][2];\n                posY = sHallOfFame_MonFullTeamPositions[i][3];\n            }\n            else\n            {\n                posX = sHallOfFame_MonHalfTeamPositions[i][2];\n                posY = sHallOfFame_MonHalfTeamPositions[i][3];\n            }\n\n            if(currMon->species == SPECIES_DEOXYS && (currMon->personality >= 65530 && currMon->personality <= 655333))\n                spriteId = CreateMonPicSprite_HandleDeoxys(currMon->personality, currMon->tid, currMon->personality, TRUE, posX,\n                                                       posY, i, 0xFFFF);\n            else\n                spriteId = CreateMonPicSprite_HandleDeoxys(currMon->species, currMon->tid, currMon->personality, TRUE, posX,\n                                                       posY, i, 0xFFFF);\n            gSprites[spriteId].oam.priority = 1;\n            gTasks[taskId].data[5 + i] = spriteId;\n        }\n        else\n        {\n            gTasks[taskId].data[5 + i] = 0xFF;\n        }\n    }\n\n    BlendPalettes(0xFFFF0000, 0xC, HALL_OF_FAME_BG_PAL);\n\n    ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[1], STR_CONV_MODE_LEFT_ALIGN, 3);\n    StringExpandPlaceholders(gStringVar4, gText_HOFNumber);\n\n    if (gTasks[taskId].data[0] <= 0)\n        TopBarWindowPrintTwoStrings(gStringVar4, gText_UPDOWNPick_ABUTTONBBUTTONCancel, 0, 0, TRUE);\n    else\n        TopBarWindowPrintTwoStrings(gStringVar4, gText_UPDOWNPick_ABUTTONNext_BBUTTONBack, 0, 0, TRUE);\n\n    gTasks[taskId].func = Task_HofPC_PrintMonInfo;\n}\n\nstatic void Task_HofPC_PrintMonInfo(u8 taskId)\n{\n    struct HallofFameTeam* savedTeams = sHofMonPtr;\n    struct HallofFameMon* currMon;\n    u32 i;\n    u16 currMonId;\n\n    for (i = 0; i < gTasks[taskId].data[0]; i++)\n        savedTeams++;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        u16 spriteId = gTasks[taskId].data[5 + i];\n        if (spriteId != 0xFF)\n            gSprites[spriteId].oam.priority = 1;\n    }\n\n    currMonId = gTasks[taskId].data[5 + gTasks[taskId].data[2]];\n    gSprites[currMonId].oam.priority = 0;\n    sSelectedPaletteIndices = (0x10000 << gSprites[currMonId].oam.paletteNum) ^ 0xFFFF0000;\n    BlendPalettesUnfaded(sSelectedPaletteIndices, 0xC, HALL_OF_FAME_BG_PAL);\n\n    currMon = &savedTeams->mon[gTasks[taskId].data[2]];\n    if (currMon->species != SPECIES_EGG)\n    {\n        StopCryAndClearCrySongs();\n        PlayCry_Normal(currMon->species, 0);\n    }\n    HallOfFame_PrintMonInfo(currMon, 0, 14);\n\n    gTasks[taskId].func = Task_HofPC_HandleInput;\n}\n\nstatic void Task_HofPC_HandleInput(u8 taskId)\n{\n    u32 i;\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        if (gTasks[taskId].data[0] != 0) // prepare another team to view\n        {\n            gTasks[taskId].data[0]--;\n            for (i = 0; i < 6; i++)\n            {\n                u8 spriteId = gTasks[taskId].data[5 + i];\n                if (spriteId != 0xFF)\n                {\n                    FreeAndDestroyMonPicSprite(spriteId);\n                }\n            }\n            if (gTasks[taskId].data[1] != 0)\n                gTasks[taskId].data[1]--;\n            gTasks[taskId].func = Task_HofPC_DrawSpritesPrintText;\n        }\n        else // no more teams to view, turn off hall of fame PC\n        {\n            if (IsCryPlayingOrClearCrySongs())\n            {\n                StopCryAndClearCrySongs();\n                m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100);\n            }\n            gTasks[taskId].func = Task_HofPC_HandlePaletteOnExit;\n        }\n    }\n    else if (JOY_NEW(B_BUTTON)) // turn off hall of fame PC\n    {\n        if (IsCryPlayingOrClearCrySongs())\n        {\n            StopCryAndClearCrySongs();\n            m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100);\n        }\n        gTasks[taskId].func = Task_HofPC_HandlePaletteOnExit;\n    }\n    else if (JOY_NEW(DPAD_UP) && gTasks[taskId].data[2] != 0) // change mon -1\n    {\n        gTasks[taskId].data[2]--;\n        gTasks[taskId].func = Task_HofPC_PrintMonInfo;\n    }\n    else if (JOY_NEW(DPAD_DOWN) && gTasks[taskId].data[2] < gTasks[taskId].data[4] - 1) // change mon +1\n    {\n        gTasks[taskId].data[2]++;\n        gTasks[taskId].func = Task_HofPC_PrintMonInfo;\n    }\n}\nstatic void Task_HofPC_HandlePaletteOnExit(u8 taskId)\n{\n    struct HallofFameTeam* fameTeam;\n\n    CpuCopy16(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE);\n    BeginPCScreenEffect_TurnOff(0, 0, 0);\n    gTasks[taskId].func = Task_HofPC_HandleExit;\n}\n\nstatic void Task_HofPC_HandleExit(u8 taskId)\n{\n    if (!IsPCScreenEffectRunning_TurnOff())\n    {\n        HideBg(0);\n        HideBg(1);\n        HideBg(3);\n        DestroyTopBarWindow();\n        FreeAllWindowBuffers();\n        UnsetBgTilemapBuffer(1);\n        UnsetBgTilemapBuffer(3);\n        ResetBgsAndClearDma3BusyFlags(FALSE);\n        DestroyTask(taskId);\n\n        if (sHofGfxPtr != NULL)\n            FREE_AND_SET_NULL(sHofGfxPtr);\n        if (sHofMonPtr != NULL)\n            FREE_AND_SET_NULL(sHofMonPtr);\n\n        ReturnFromHallOfFamePC();\n    }\n}\n\nstatic void Task_HofPC_PrintDataIsCorrupted(u8 taskId)\n{\n    TopBarWindowPrintString(gText_ABUTTONExit, 8, TRUE);\n    DrawDialogueFrame(0, 0);\n    AddTextPrinterParameterized2(0, FONT_NORMAL, gText_HOFCorrupted, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    CopyWindowToVram(0, COPYWIN_FULL);\n    gTasks[taskId].func = Task_HofPC_ExitOnButtonPress;\n}\n\nstatic void Task_HofPC_ExitOnButtonPress(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON))\n        gTasks[taskId].func = Task_HofPC_HandlePaletteOnExit;\n}\n\nstatic void HallOfFame_PrintWelcomeText(u8 not, u8 used)\n{\n    u8 x = (0xD0 - GetStringWidth(FONT_NORMAL, gText_WelcomeToHOF, 0)) / 2;\n    FillWindowPixelBuffer(0, PIXEL_FILL(0));\n    PutWindowTilemap(0);\n    AddTextPrinterParameterized3(0, FONT_NORMAL, x, 1, sTextColors[0], 0, gText_WelcomeToHOF);\n    CopyWindowToVram(0, COPYWIN_FULL);\n}\n\nstatic void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u8 unused2)\n{\n    u8 text[16];\n    u8 text2[24];\n    u32 i;\n    u8 *stringPtr;\n    u16 dexNumber;\n    u8 gender;\n    s32 width;\n    s32 x;\n\n    FillWindowPixelBuffer(0, PIXEL_FILL(0));\n    PutWindowTilemap(0);\n\n    // dex number\n    if (currMon->species != SPECIES_EGG)\n    {\n        StringCopy(text2, gText_Number);\n        dexNumber = SpeciesToPokedexNum(currMon->species);\n        if (dexNumber != 0xFFFF)\n        {\n            text[0] = (dexNumber / 100) + CHAR_0;\n            text[1] = ((dexNumber %= 100) / 10) + CHAR_0;\n            text[2] = (dexNumber % 10) + CHAR_0;\n        }\n        else\n        {\n            text[0] = text[1] = text[2] = CHAR_QUESTION_MARK;\n        }\n        text[3] = EOS;\n        StringAppend(text2, text);\n        AddTextPrinterParameterized3(0, FONT_NORMAL, 16, 1, sTextColors[0], 0, text2);\n    }\n\n    // nick, species names, gender and lvl\n    i = 0;\n    if (currMon->nick[0] != EOS)\n    {\n        for (i = 0; i < 10 && currMon->nick[i] != EOS; i++)\n        {\n            text[i] = currMon->nick[i];\n        }\n    }\n    text[i] = EOS;\n    width = GetStringWidth(FONT_NORMAL, text, GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING));\n    if (currMon->species == SPECIES_EGG)\n        x = 0x80 - width / 2;\n    else\n        x = 0x80 - width;\n    AddTextPrinterParameterized3(0, FONT_NORMAL, x, 1, sTextColors[0], 0, text);\n    if (currMon->species != SPECIES_EGG)\n    {\n        text[0] = CHAR_SLASH;\n        stringPtr = StringCopy(text + 1, gSpeciesNames[currMon->species]);\n\n        if (currMon->species == SPECIES_NIDORAN_M || currMon->species == SPECIES_NIDORAN_F)\n            gender = MON_GENDERLESS;\n        else\n            gender = GetGenderFromSpeciesAndPersonality(currMon->species, currMon->personality);\n        switch (gender)\n        {\n        case MON_MALE:\n            *stringPtr++ = CHAR_MALE;\n            break;\n        case MON_FEMALE:\n            *stringPtr++ = CHAR_FEMALE;\n            break;\n        default:\n            *stringPtr++ = CHAR_SPACE;\n            break;\n        }\n        *stringPtr = EOS;\n\n        AddTextPrinterParameterized3(0, FONT_NORMAL, 0x80, 1, sTextColors[0], 0, text);\n\n        stringPtr = StringCopy(text, gText_Level);\n        ConvertIntToDecimalStringN(stringPtr, currMon->lvl, STR_CONV_MODE_LEFT_ALIGN, 3);\n        AddTextPrinterParameterized3(0, FONT_NORMAL, 0x20, 0x11, sTextColors[0], 0, text);\n\n        stringPtr = StringCopy(text, gText_IDNumber);\n        ConvertIntToDecimalStringN(stringPtr, (u16)(currMon->tid), STR_CONV_MODE_LEADING_ZEROS, 5);\n        AddTextPrinterParameterized3(0, FONT_NORMAL, 0x60, 0x11, sTextColors[0], 0, text);\n\n    }\n    CopyWindowToVram(0, COPYWIN_FULL);\n}\n\nstatic void HallOfFame_PrintPlayerInfo(u8 unused1, u8 unused2)\n{\n    u8 text[20];\n    u16 trainerId;\n    s32 textWidth = sWindowTemplate.width * 8 - 6;\n    \n    FillWindowPixelBuffer(1, PIXEL_FILL(1));\n    PutWindowTilemap(1);\n    DrawStdFrameWithCustomTileAndPalette(1, FALSE, 0x21D, 13);\n    AddTextPrinterParameterized4(1, FONT_NORMAL, 4, 3, 0, 0, sTextColors[1], 0, gText_Name);\n\n    AddTextPrinterParameterized3(1, FONT_NORMAL, textWidth - GetStringWidth(FONT_NORMAL, gSaveBlock2Ptr->playerName, 0), 3, sTextColors[1], 0, gSaveBlock2Ptr->playerName);\n\n    trainerId = (gSaveBlock2Ptr->playerTrainerId[0]) | (gSaveBlock2Ptr->playerTrainerId[1] << 8);\n    AddTextPrinterParameterized3(1, FONT_NORMAL, 4, 18, sTextColors[1], 0, gText_IDNumber);\n    text[0] = (trainerId % 100000) / 10000 + CHAR_0;\n    text[1] = (trainerId % 10000) / 1000 + CHAR_0;\n    text[2] = (trainerId % 1000) / 100 + CHAR_0;\n    text[3] = (trainerId % 100) / 10 + CHAR_0;\n    text[4] = (trainerId % 10) / 1 + CHAR_0;\n    text[5] = EOS;\n    AddTextPrinterParameterized3(1, FONT_NORMAL, textWidth - 30, 18, sTextColors[1], 0, text);\n\n    AddTextPrinterParameterized3(1, FONT_NORMAL, 4, 32, sTextColors[1], 0, gText_MainMenuTime);\n    text[0] = (gSaveBlock2Ptr->playTimeHours / 100) + CHAR_0;\n    text[1] = (gSaveBlock2Ptr->playTimeHours % 100) / 10 + CHAR_0;\n    text[2] = (gSaveBlock2Ptr->playTimeHours % 10) + CHAR_0;\n\n    if (text[0] == CHAR_0)\n        text[0] = CHAR_SPACE;\n    if (text[0] == CHAR_SPACE && text[1] == CHAR_0)\n        text[1] = CHAR_SPACE;\n\n    text[3] = CHAR_COLON;\n    text[4] = (gSaveBlock2Ptr->playTimeMinutes % 100) / 10 + CHAR_0;\n    text[5] = (gSaveBlock2Ptr->playTimeMinutes % 10) + CHAR_0;\n    text[6] = EOS;\n\n    AddTextPrinterParameterized3(1, FONT_NORMAL, textWidth - 36, 32, sTextColors[1], 0, text);\n\n    CopyWindowToVram(1, COPYWIN_FULL);\n}\n\nstatic void ClearVramOamPltt_LoadHofPal(void)\n{\n    u32 vramOffset, oamOffset, plttOffset;\n    u32 vramSize, oamSize, plttSize;\n\n    vramOffset = (VRAM);\n    vramSize = VRAM_SIZE;\n    while (TRUE)\n    {\n        DmaFill16(3, 0, vramOffset, 0x1000);\n        vramOffset += 0x1000;\n        vramSize -= 0x1000;\n        if (vramSize <= 0x1000)\n        {\n            DmaFill16(3, 0, vramOffset, vramSize);\n            break;\n        }\n    }\n\n    oamOffset = OAM;\n    oamSize = OAM_SIZE;\n    DmaFill32(3, 0, oamOffset, oamSize);\n\n    plttOffset = PLTT;\n    plttSize = PLTT_SIZE;\n    DmaFill16(3, 0, plttOffset, plttSize);\n\n    ResetPaletteFade();\n    LoadPalette(sHallOfFame_Pal, BG_PLTT_ID(0), sizeof(sHallOfFame_Pal));\n}\n\nstatic void HofInit_ResetGpuBuffersAndLoadConfettiGfx(void)\n{\n    ScanlineEffect_Stop();\n    ResetTasks();\n    ResetSpriteData();\n    ResetTempTileDataBuffers();\n    ResetAllPicSprites();\n    FreeAllSpritePalettes();\n    gReservedSpritePaletteCount = 8;\n    LoadCompressedSpriteSheet(sHallOfFame_ConfettiSpriteSheet);\n    LoadCompressedSpritePalette(sHallOfFame_ConfettiSpritePalette);\n}\n\nstatic void Hof_InitBgs(void)\n{\n    ResetBgsAndClearDma3BusyFlags(0);\n    InitBgsFromTemplates(0, sHof_BgTemplates, NELEMS(sHof_BgTemplates));\n    SetBgTilemapBuffer(1, sHofGfxPtr->tilemap1);\n    SetBgTilemapBuffer(3, sHofGfxPtr->tilemap2);\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n}\n\nstatic bool8 DrawHofBackground(void)\n{\n    switch (sHofGfxPtr->state)\n    {\n    case 0:\n        DecompressAndCopyTileDataToVram(1, sHallOfFame_Gfx, 0, 0, 0);\n        break;\n    case 1:\n        if (FreeTempTileDataBuffersIfPossible())\n            return TRUE;\n        break;\n    case 2:\n        FillBgTilemapBufferRect_Palette0(1, 1, 0, 0, 0x20, 2);\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 3, 0x20, 0xB);\n        FillBgTilemapBufferRect_Palette0(1, 1, 0, 0xE, 0x20, 6);\n        FillBgTilemapBufferRect_Palette0(3, 2, 0, 0, 0x20, 0x20);\n\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(3);\n        break;\n    case 3:\n        InitStandardTextBoxWindows();\n        InitTextBoxGfxAndPrinters();\n        break;\n    case 4:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n        ShowBg(0);\n        ShowBg(1);\n        ShowBg(3);\n        sHofGfxPtr->state = 0;\n        return FALSE;\n    }\n\n    sHofGfxPtr->state++;\n    return TRUE;\n}\n\nstatic void SpriteCB_EndGetOnScreen(struct Sprite *sprite)\n{\n\n}\n\nstatic void SpriteCB_GetOnScreen(struct Sprite *sprite)\n{\n    if (sprite->x != sprite->data[1]\n        || sprite->y != sprite->data[2])\n    {\n        if (sprite->x < sprite->data[1])\n            sprite->x += 15;\n        if (sprite->x > sprite->data[1])\n            sprite->x -= 15;\n\n        if (sprite->y < sprite->data[2])\n            sprite->y += 10;\n        if (sprite->y > sprite->data[2])\n            sprite->y -= 10;\n    }\n    else\n    {\n        sprite->data[0] = 1;\n        sprite->callback = SpriteCB_EndGetOnScreen;\n    }\n}\n\nstatic void SpriteCB_Confetti(struct Sprite* sprite)\n{\n    if (sprite->y2 > 120)\n    {\n        DestroySprite(sprite);\n    }\n    else\n    {\n        u16 rand;\n        u8 tableID;\n\n        sprite->y2++;\n        sprite->y2 += sprite->data[1];\n\n        tableID = sprite->data[0];\n        rand = (Random() % 4) + 8;\n        sprite->x2 = rand * gSineTable[tableID] / 256;\n\n        sprite->data[0] += 4;\n    }\n}\n\nstatic bool8 Hof_SpawnConfetti(void)\n{\n    u8 spriteId;\n    struct Sprite* sprite;\n\n    s16 posX = Random() % 240;\n    s16 posY = -(Random() % 8);\n\n    spriteId = CreateSprite(&sSpriteTemplate_Confetti, posX, posY, 0);\n    sprite = &gSprites[spriteId];\n\n    StartSpriteAnim(sprite, Random() % 17);\n\n    if (Random() & 3)\n        sprite->data[1] = 0;\n    else\n        sprite->data[1] = 1;\n\n    return FALSE;\n}\n"
  },
  {
    "path": "src/heal_location.c",
    "content": "#include \"global.h\"\n#include \"heal_location.h\"\n#include \"event_data.h\"\n#include \"constants/maps.h\"\n#include \"constants/heal_locations.h\"\n\nstatic void SetWhiteoutRespawnHealerNpcAsLastTalked(u32 healLocationIdx);\n\n// Arrays described here because porymap will overrwrite the below data file\n\n// sSpawnPoints\n// This array defines the fly points for unlocked spawns.\n\n// sWhiteoutRespawnHealCenterMapIdxs\n// This array defines the map where you actually respawn when you white out,\n// based on where you last checkpointed.\n// This is either the player's house or a Pokémon Center.\n// The data are u16 instead of u8 for reasons unknown.\n\n// sWhiteoutRespawnHealerNpcIds\n// When you respawn, your character scurries back to either their house\n// or a Pokémon Center, and hands their fainted Pokémon to their mother\n// or the Nurse for healing.\n// This array defines the index of the NPC on the map defined above\n// with whom your character interacts in this cutscene.\n\n#include \"data/heal_locations.h\"\n\nstatic u32 GetHealLocationIndexFromMapGroupAndNum(u16 mapGroup, u16 mapNum)\n{\n    u32 i;\n\n    for (i = 0; i < NELEMS(sSpawnPoints); i++) {\n        if (sSpawnPoints[i].group == mapGroup && sSpawnPoints[i].map == mapNum)\n        {\n            return i + 1;\n        }\n    }\n\n    return 0;\n}\n\nstatic const struct HealLocation * GetHealLocationPointerFromMapGroupAndNum(u16 mapGroup, u16 mapNum)\n{\n    u32 i = GetHealLocationIndexFromMapGroupAndNum(mapGroup, mapNum);\n    if (i == 0)\n        return NULL;\n\n    return &sSpawnPoints[i - 1];\n}\n\nconst struct HealLocation * GetHealLocation(u32 idx)\n{\n    if (idx == 0)\n        return NULL;\n    if (idx > NELEMS(sSpawnPoints))\n        return NULL;\n    return &sSpawnPoints[idx - 1];\n}\n\nvoid SetWhiteoutRespawnWarpAndHealerNpc(struct WarpData * warp)\n{\n    u32 healLocationIdx;\n\n    if (VarGet(VAR_MAP_SCENE_TRAINER_TOWER) == 1)\n    {\n        if (!gSaveBlock1Ptr->trainerTower[gSaveBlock1Ptr->towerChallengeId].spokeToOwner)\n            VarSet(VAR_MAP_SCENE_TRAINER_TOWER, 0);\n        gSpecialVar_LastTalked = 1;\n        warp->x = 4;\n        warp->y = 11;\n        warp->mapGroup = MAP_GROUP(TRAINER_TOWER_LOBBY);\n        warp->mapNum = MAP_NUM(TRAINER_TOWER_LOBBY);\n        warp->warpId = 0xFF;\n    }\n    else\n    {\n        healLocationIdx = GetHealLocationIndexFromMapGroupAndNum(gSaveBlock1Ptr->lastHealLocation.mapGroup, gSaveBlock1Ptr->lastHealLocation.mapNum);\n        warp->mapGroup = sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0];\n        warp->mapNum = sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1];\n        warp->warpId = 0xFF;\n\n        if (sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0] == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) && sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1] == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F))\n        {\n            warp->x = 8;\n            warp->y = 5;\n        }\n        else if (sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0] == MAP_GROUP(INDIGO_PLATEAU_POKEMON_CENTER_1F) && sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1] == MAP_NUM(INDIGO_PLATEAU_POKEMON_CENTER_1F))\n        {\n            warp->x = 13;\n            warp->y = 12;\n        }\n        else if (sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0] == MAP_GROUP(ONE_ISLAND_POKEMON_CENTER_1F) && sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1] == MAP_NUM(ONE_ISLAND_POKEMON_CENTER_1F))\n        {\n            warp->x = 5;\n            warp->y = 4;\n        }\n        else if (sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0] == MAP_GROUP(TRAINER_TOWER_LOBBY) && sWhiteoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1] == MAP_NUM(TRAINER_TOWER_LOBBY))\n        {\n            warp->x = 4;\n            warp->y = 11;\n            VarSet(VAR_MAP_SCENE_TRAINER_TOWER, 0);\n        }\n        else\n        {\n            warp->x = 7;\n            warp->y = 4;\n        }\n        SetWhiteoutRespawnHealerNpcAsLastTalked(healLocationIdx);\n    }\n}\n\nstatic void SetWhiteoutRespawnHealerNpcAsLastTalked(u32 healLocationIdx)\n{\n    gSpecialVar_LastTalked = sWhiteoutRespawnHealerNpcIds[healLocationIdx - 1];\n}\n"
  },
  {
    "path": "src/help_message.c",
    "content": "#include \"global.h\"\n#include \"malloc.h\"\n#include \"menu.h\"\n#include \"malloc.h\"\n\nstatic EWRAM_DATA u8 sHelpMessageWindowId = 0;\n\nconst u8 gHelpMessageWindow_Gfx[] = INCBIN_U8(\"graphics/help_system/msg_window.4bpp\");\n\nstatic const struct WindowTemplate sHelpMessageWindowTemplate = {\n    .bg = 0,\n    .tilemapLeft = 0,\n    .tilemapTop = 15,\n    .width = 30,\n    .height = 5,\n    .paletteNum = 15,\n    .baseBlock = 0x08F\n};\n\nvoid MapNamePopupWindowIdSetDummy(void)\n{\n    sHelpMessageWindowId = WINDOW_NONE;\n}\n\nu8 CreateHelpMessageWindow(void)\n{\n    if (sHelpMessageWindowId == WINDOW_NONE)\n    {\n        sHelpMessageWindowId = AddWindow(&sHelpMessageWindowTemplate);\n        PutWindowTilemap(sHelpMessageWindowId);\n    }\n    return sHelpMessageWindowId;\n}\n\nvoid DestroyHelpMessageWindow(u8 a0)\n{\n    if (sHelpMessageWindowId != WINDOW_NONE)\n    {\n        FillWindowPixelBuffer(sHelpMessageWindowId, PIXEL_FILL(0));\n        ClearWindowTilemap(sHelpMessageWindowId);\n\n        if (a0)\n            CopyWindowToVram(sHelpMessageWindowId, a0);\n\n        RemoveWindow(sHelpMessageWindowId);\n        sHelpMessageWindowId = WINDOW_NONE;\n    }\n}\n\n// Creates the bottom bar window that displays help text for e.g. the options in the Start menu\nvoid DrawHelpMessageWindowTilesById(u8 windowId)\n{\n    const u8 *ptr = gHelpMessageWindow_Gfx;\n    u8 *buffer;\n    u8 i, j;\n    u8 width, height;\n    u32 tileId;\n\n    width = (u8)GetWindowAttribute(windowId, WINDOW_WIDTH);\n    height = (u8)GetWindowAttribute(windowId, WINDOW_HEIGHT);\n    \n    buffer = (u8 *)Alloc(32 * width * height);\n\n    if (buffer != NULL)\n    {\n        for (i = 0; i < height; i++)\n        {\n            for (j = 0; j < width; j++)\n            {\n                if (i == 0) // Top row\n                    tileId = 0;\n                else if (i == height - 1) // Bottom row\n                    tileId = 14;\n                else // Middle row\n                    tileId = 5; \n                CpuCopy32(\n                    &ptr[tileId * 32],\n                    &buffer[(i * width + j) * 32],\n                    32\n                );\n            }\n        }\n        CopyToWindowPixelBuffer(windowId, buffer, width * height * 32, 0);\n        Free(buffer);\n    }\n}\n\nstatic void DrawHelpMessageWindowTiles(void)\n{\n    DrawHelpMessageWindowTilesById(sHelpMessageWindowId);\n}\n\nstatic const u8 sHelpMessageTextColors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_1, TEXT_COLOR_DARK_GRAY};\n\nstatic void PrintHelpMessageText(const u8 *text)\n{\n    AddTextPrinterParameterized4(sHelpMessageWindowId, FONT_NORMAL, 2, 5, 1, 1, sHelpMessageTextColors, -1, text);\n}\n\nvoid PrintTextOnHelpMessageWindow(const u8 *text, u8 mode)\n{\n    DrawHelpMessageWindowTiles();\n    PrintHelpMessageText(text);\n    if (mode)\n        CopyWindowToVram(sHelpMessageWindowId, mode);\n}\n"
  },
  {
    "path": "src/help_system.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"event_data.h\"\n#include \"event_scripts.h\"\n#include \"field_player_avatar.h\"\n#include \"help_system.h\"\n#include \"item.h\"\n#include \"link.h\"\n#include \"overworld.h\"\n#include \"pokedex.h\"\n#include \"quest_log.h\"\n#include \"save.h\"\n#include \"save_location.h\"\n#include \"strings.h\"\n#include \"constants/items.h\"\n#include \"constants/maps.h\"\n#include \"constants/songs.h\"\n\n#define HELP_NONE  0\n#define HELP_END   0xFF\n\n// Help Main Topics\nenum HelpSystemTopics\n{\n    TOPIC_WHAT_TO_DO,\n    TOPIC_HOW_TO_DO,\n    TOPIC_TERMS,\n    TOPIC_ABOUT_GAME,\n    TOPIC_TYPE_MATCHUP,\n    TOPIC_EXIT,\n    TOPIC_COUNT\n};\n\nstatic EWRAM_DATA u16 sHelpSystemContextId = 0;\nstatic EWRAM_DATA u8 sSeenHelpSystemIntro = 0;\n\nstruct HelpSystemState\n{\n    // 0: Top level\n    // 1: Submenu\n    // 2: Help content\n    u8 level;\n\n    // enum HelpSystemTopics\n    u8 topic;\n\n    // Where the player's cursor was at top level\n    u8 scrollMain;\n\n    // Where the player's cursor was at submenu\n    u8 scrollSub;\n};\n\nstruct HelpSystemState gHelpSystemState;\nu16 gHelpContextIdBackup;\n\nstatic bool32 IsCurrentMapInArray(const u16 * mapIdxs);\nstatic void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);\nstatic void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);\nstatic bool8 HelpSystem_ShouldShowBasicTerms(void);\nstatic bool8 IsHelpSystemSubmenuEnabled(u8);\nstatic bool8 HasGottenAtLeastOneHM(void);\n\nstatic void PrintWelcomeMessageOnPanel1(void);\nstatic void PrintTextOnPanel2Row52RightAlign(const u8 *);\nstatic void ResetHelpSystemCursor(struct HelpSystemListMenu * a0);\nstatic void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);\n\nstatic const u8 *const sHelpSystemTopicPtrs[TOPIC_COUNT] = {\n    [TOPIC_WHAT_TO_DO]   = Help_Text_WhatShouldIDo,\n    [TOPIC_HOW_TO_DO]    = Help_Text_HowDoIDoThis,\n    [TOPIC_TERMS]        = Help_Text_WhatDoesThisTermMean,\n    [TOPIC_ABOUT_GAME]   = Help_Text_AboutThisGame,\n    [TOPIC_TYPE_MATCHUP] = Help_Text_TypeMatchupList,\n    [TOPIC_EXIT]         = Help_Text_Exit\n};\n\nstatic const u8 *const sHelpSystemTopicMouseoverDescriptionPtrs[TOPIC_COUNT] = {\n    [TOPIC_WHAT_TO_DO]   = Help_Text_DescWhatShouldIDo,\n    [TOPIC_HOW_TO_DO]    = Help_Text_DescHowDoIDoThis,\n    [TOPIC_TERMS]        = Help_Text_DescWhatDoesThisTermMean,\n    [TOPIC_ABOUT_GAME]   = Help_Text_DescAboutThisGame,\n    [TOPIC_TYPE_MATCHUP] = Help_Text_DescTypeMatchupList,\n    [TOPIC_EXIT]         = Help_Text_DescExit\n};\n\n// Submenu IDs for TOPIC_WHAT_TO_DO\nenum\n{\n    HELP_PLAYING_FOR_FIRST_TIME = 1,\n    HELP_WHAT_SHOULD_I_BE_DOING,\n    HELP_CANT_GET_OUT_OF_ROOM,\n    HELP_CANT_FIND_PERSON_I_WANT,\n    HELP_TALKED_TO_EVERYONE_NOW_WHAT,\n    HELP_SOMEONE_BLOCKING_MY_WAY,\n    HELP_I_CANT_GO_ON,\n    HELP_OUT_OF_THINGS_TO_DO,\n    HELP_WHAT_HAPPENED_TO_ITEM_I_GOT,\n    HELP_WHAT_ARE_MY_ADVENTURE_BASICS,\n    HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT,\n    HELP_HOW_ARE_CAVES_DIFFERENT,\n    HELP_HOW_DO_I_PROGRESS,\n    HELP_WHEN_CAN_I_USE_ITEM,\n    HELP_WHATS_A_BATTLE,\n    HELP_HOW_DO_I_PREPARE_FOR_BATTLE,\n    HELP_WHAT_IS_A_MONS_VITALITY,\n    HELP_MY_MONS_ARE_HURT,\n    HELP_WHAT_IS_STATUS_PROBLEM,\n    HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT,\n    HELP_CANT_CATCH_MONS,\n    HELP_RAN_OUT_OF_POTIONS,\n    HELP_CAN_I_BUY_POKEBALLS,\n    HELP_WHATS_A_TRAINER,\n    HELP_HOW_DO_I_WIN_AGAINST_TRAINER,\n    HELP_WHERE_DO_MONS_APPEAR,\n    HELP_WHAT_ARE_MOVES,\n    HELP_WHAT_ARE_HIDDEN_MOVES,\n    HELP_WHAT_MOVES_SHOULD_I_USE,\n    HELP_WANT_TO_ADD_MORE_MOVES,\n    HELP_WANT_TO_MAKE_MON_STRONGER,\n    HELP_FOE_MONS_TOO_STRONG,\n    HELP_WHAT_DO_I_DO_IN_CAVE,\n    HELP_NOTHING_I_WANT_TO_KNOW,\n    HELP_WHATS_POKEMON_CENTER,\n    HELP_WHATS_POKEMON_MART,\n    HELP_WANT_TO_END_GAME,\n    HELP_WHATS_A_MON,\n    HELP_WHAT_IS_THAT_PERSON_LIKE,\n    HELP_WHAT_DOES_HIDDEN_MOVE_DO,\n    HELP_WHAT_DO_I_DO_IN_SAFARI,\n    HELP_WHAT_ARE_SAFARI_RULES,\n    HELP_WANT_TO_END_SAFARI,\n    HELP_WHAT_IS_A_GYM,\n};\n\nstatic const u8 *const sHelpSystemSpecializedQuestionTextPtrs[] = {\n    [HELP_NONE]                              = NULL,\n    [HELP_PLAYING_FOR_FIRST_TIME]            = Help_Text_PlayingForFirstTime,\n    [HELP_WHAT_SHOULD_I_BE_DOING]            = Help_Text_WhatShouldIBeDoing,\n    [HELP_CANT_GET_OUT_OF_ROOM]              = Help_Text_CantGetOutOfRoom,\n    [HELP_CANT_FIND_PERSON_I_WANT]           = Help_Text_CantFindPersonIWant,\n    [HELP_TALKED_TO_EVERYONE_NOW_WHAT]       = Help_Text_TalkedToEveryoneNowWhat,\n    [HELP_SOMEONE_BLOCKING_MY_WAY]           = Help_Text_SomeoneBlockingMyWay,\n    [HELP_I_CANT_GO_ON]                      = Help_Text_ICantGoOn,\n    [HELP_OUT_OF_THINGS_TO_DO]               = Help_Text_OutOfThingsToDo,\n    [HELP_WHAT_HAPPENED_TO_ITEM_I_GOT]       = Help_Text_WhatHappenedToItemIGot,\n    [HELP_WHAT_ARE_MY_ADVENTURE_BASICS]      = Help_Text_WhatAreMyAdventureBasics,\n    [HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT]   = Help_Text_HowAreRoadsForestsDifferent,\n    [HELP_HOW_ARE_CAVES_DIFFERENT]           = Help_Text_HowAreCavesDifferent,\n    [HELP_HOW_DO_I_PROGRESS]                 = Help_Text_HowDoIProgress,\n    [HELP_WHEN_CAN_I_USE_ITEM]               = Help_Text_WhenCanIUseItem,\n    [HELP_WHATS_A_BATTLE]                    = Help_Text_WhatsABattle,\n    [HELP_HOW_DO_I_PREPARE_FOR_BATTLE]       = Help_Text_HowDoIPrepareForBattle,\n    [HELP_WHAT_IS_A_MONS_VITALITY]           = Help_Text_WhatIsAMonsVitality,\n    [HELP_MY_MONS_ARE_HURT]                  = Help_Text_MyMonsAreHurt,\n    [HELP_WHAT_IS_STATUS_PROBLEM]            = Help_Text_WhatIsStatusProblem,\n    [HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT] = Help_Text_WhatHappensIfAllMyMonsFaint,\n    [HELP_CANT_CATCH_MONS]                   = Help_Text_CantCatchMons,\n    [HELP_RAN_OUT_OF_POTIONS]                = Help_Text_RanOutOfPotions,\n    [HELP_CAN_I_BUY_POKEBALLS]               = Help_Text_CanIBuyPokeBalls,\n    [HELP_WHATS_A_TRAINER]                   = Help_Text_WhatsATrainer,\n    [HELP_HOW_DO_I_WIN_AGAINST_TRAINER]      = Help_Text_HowDoIWinAgainstTrainer,\n    [HELP_WHERE_DO_MONS_APPEAR]              = Help_Text_WhereDoMonsAppear,\n    [HELP_WHAT_ARE_MOVES]                    = Help_Text_WhatAreMoves,\n    [HELP_WHAT_ARE_HIDDEN_MOVES]             = Help_Text_WhatAreHiddenMoves,\n    [HELP_WHAT_MOVES_SHOULD_I_USE]           = Help_Text_WhatMovesShouldIUse,\n    [HELP_WANT_TO_ADD_MORE_MOVES]            = Help_Text_WantToAddMoreMoves,\n    [HELP_WANT_TO_MAKE_MON_STRONGER]         = Help_Text_WantToMakeMonStronger,\n    [HELP_FOE_MONS_TOO_STRONG]               = Help_Text_FoeMonsTooStrong,\n    [HELP_WHAT_DO_I_DO_IN_CAVE]              = Help_Text_WhatDoIDoInCave,\n    [HELP_NOTHING_I_WANT_TO_KNOW]            = Help_Text_NothingIWantToKnow,\n    [HELP_WHATS_POKEMON_CENTER]              = Help_Text_WhatsPokemonCenter,\n    [HELP_WHATS_POKEMON_MART]                = Help_Text_WhatsPokemonMart,\n    [HELP_WANT_TO_END_GAME]                  = Help_Text_WantToEndGame,\n    [HELP_WHATS_A_MON]                       = Help_Text_WhatsAMon,\n    [HELP_WHAT_IS_THAT_PERSON_LIKE]          = Help_Text_WhatIsThatPersonLike,\n    [HELP_WHAT_DOES_HIDDEN_MOVE_DO]          = Help_Text_WhatDoesHiddenMoveDo,\n    [HELP_WHAT_DO_I_DO_IN_SAFARI]            = Help_Text_WhatDoIDoInSafari,\n    [HELP_WHAT_ARE_SAFARI_RULES]             = Help_Text_WhatAreSafariRules,\n    [HELP_WANT_TO_END_SAFARI]                = Help_Text_WantToEndSafari,\n    [HELP_WHAT_IS_A_GYM]                     = Help_Text_WhatIsAGym\n};\n\nstatic const u8 *const sHelpSystemSpecializedAnswerTextPtrs[] = {\n    [HELP_NONE]                              = NULL,\n    [HELP_PLAYING_FOR_FIRST_TIME]            = Help_Text_AnswerPlayingForFirstTime,\n    [HELP_WHAT_SHOULD_I_BE_DOING]            = Help_Text_AnswerWhatShouldIBeDoing,\n    [HELP_CANT_GET_OUT_OF_ROOM]              = Help_Text_AnswerCantGetOutOfRoom,\n    [HELP_CANT_FIND_PERSON_I_WANT]           = Help_Text_AnswerCantFindPersonIWant,\n    [HELP_TALKED_TO_EVERYONE_NOW_WHAT]       = Help_Text_AnswerTalkedToEveryoneNowWhat,\n    [HELP_SOMEONE_BLOCKING_MY_WAY]           = Help_Text_AnswerSomeoneBlockingMyWay,\n    [HELP_I_CANT_GO_ON]                      = Help_Text_AnswerICantGoOn,\n    [HELP_OUT_OF_THINGS_TO_DO]               = Help_Text_AnswerOutOfThingsToDo,\n    [HELP_WHAT_HAPPENED_TO_ITEM_I_GOT]       = Help_Text_AnswerWhatHappenedToItemIGot,\n    [HELP_WHAT_ARE_MY_ADVENTURE_BASICS]      = Help_Text_AnswerWhatAreMyAdventureBasics,\n    [HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT]   = Help_Text_AnswerHowAreRoadsForestsDifferent,\n    [HELP_HOW_ARE_CAVES_DIFFERENT]           = Help_Text_AnswerHowAreCavesDifferent,\n    [HELP_HOW_DO_I_PROGRESS]                 = Help_Text_AnswerHowDoIProgress,\n    [HELP_WHEN_CAN_I_USE_ITEM]               = Help_Text_AnswerWhenCanIUseItem,\n    [HELP_WHATS_A_BATTLE]                    = Help_Text_AnswerWhatsABattle,\n    [HELP_HOW_DO_I_PREPARE_FOR_BATTLE]       = Help_Text_AnswerHowDoIPrepareForBattle,\n    [HELP_WHAT_IS_A_MONS_VITALITY]           = Help_Text_AnswerWhatIsAMonsVitality,\n    [HELP_MY_MONS_ARE_HURT]                  = Help_Text_AnswerMyMonsAreHurt,\n    [HELP_WHAT_IS_STATUS_PROBLEM]            = Help_Text_AnswerWhatIsStatusProblem,\n    [HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT] = Help_Text_AnswerWhatHappensIfAllMyMonsFaint,\n    [HELP_CANT_CATCH_MONS]                   = Help_Text_AnswerCantCatchMons,\n    [HELP_RAN_OUT_OF_POTIONS]                = Help_Text_AnswerRanOutOfPotions,\n    [HELP_CAN_I_BUY_POKEBALLS]               = Help_Text_AnswerCanIBuyPokeBalls,\n    [HELP_WHATS_A_TRAINER]                   = Help_Text_AnswerWhatsATrainer,\n    [HELP_HOW_DO_I_WIN_AGAINST_TRAINER]      = Help_Text_AnswerHowDoIWinAgainstTrainer,\n    [HELP_WHERE_DO_MONS_APPEAR]              = Help_Text_AnswerWhereDoMonsAppear,\n    [HELP_WHAT_ARE_MOVES]                    = Help_Text_AnswerWhatAreMoves,\n    [HELP_WHAT_ARE_HIDDEN_MOVES]             = Help_Text_AnswerWhatAreHiddenMoves,\n    [HELP_WHAT_MOVES_SHOULD_I_USE]           = Help_Text_AnswerWhatMovesShouldIUse,\n    [HELP_WANT_TO_ADD_MORE_MOVES]            = Help_Text_AnswerWantToAddMoreMoves,\n    [HELP_WANT_TO_MAKE_MON_STRONGER]         = Help_Text_AnswerWantToMakeMonStronger,\n    [HELP_FOE_MONS_TOO_STRONG]               = Help_Text_AnswerFoeMonsTooStrong,\n    [HELP_WHAT_DO_I_DO_IN_CAVE]              = Help_Text_AnswerWhatDoIDoInCave,\n    [HELP_NOTHING_I_WANT_TO_KNOW]            = Help_Text_AnswerNothingIWantToKnow,\n    [HELP_WHATS_POKEMON_CENTER]              = Help_Text_AnswerWhatsPokemonCenter,\n    [HELP_WHATS_POKEMON_MART]                = Help_Text_AnswerWhatsPokemonMart,\n    [HELP_WANT_TO_END_GAME]                  = Help_Text_AnswerWantToEndGame,\n    [HELP_WHATS_A_MON]                       = Help_Text_AnswerWhatsAMon,\n    [HELP_WHAT_IS_THAT_PERSON_LIKE]          = Help_Text_AnswerWhatIsThatPersonLike,\n    [HELP_WHAT_DOES_HIDDEN_MOVE_DO]          = Help_Text_AnswerWhatDoesHiddenMoveDo,\n    [HELP_WHAT_DO_I_DO_IN_SAFARI]            = Help_Text_AnswerWhatDoIDoInSafari,\n    [HELP_WHAT_ARE_SAFARI_RULES]             = Help_Text_AnswerWhatAreSafariRules,\n    [HELP_WANT_TO_END_SAFARI]                = Help_Text_AnswerWantToEndSafari,\n    [HELP_WHAT_IS_A_GYM]                     = Help_Text_AnswerWhatIsAGym\n};\n\n// Submenu IDs for TOPIC_HOW_TO_DO\nenum\n{\n    HELP_USING_POKEDEX = 1,\n    HELP_USING_POKEMON,\n    HELP_USING_SUMMARY,\n    HELP_USING_SWITCH,\n    HELP_USING_ITEM,\n    HELP_USING_BAG,\n    HELP_USING_AN_ITEM,\n    HELP_USING_KEYITEM,\n    HELP_USING_POKEBALL,\n    HELP_USING_PLAYER,\n    HELP_USING_SAVE,\n    HELP_USING_OPTION,\n    HELP_USING_POTION,\n    HELP_USING_TOWN_MAP,\n    HELP_USING_TM,\n    HELP_USING_HM,\n    HELP_USING_MOVE_OUTSIDE_OF_BATTLE,\n    HELP_RIDING_BICYCLE,\n    HELP_ENTERING_NAME,\n    HELP_USING_PC,\n    HELP_USING_BILLS_PC,\n    HELP_USING_WITHDRAW,\n    HELP_USING_DEPOSIT,\n    HELP_USING_MOVE,\n    HELP_MOVING_ITEMS,\n    HELP_USING_PLAYERS_PC,\n    HELP_USING_WITHDRAW_ITEM,\n    HELP_USING_DEPOSIT_ITEM,\n    HELP_USING_MAILBOX,\n    HELP_USING_PROF_OAKS_PC,\n    HELP_OPENING_MENU,\n    HELP_USING_FIGHT,\n    HELP_USING_POKEMON2,\n    HELP_USING_SHIFT,\n    HELP_USING_SUMMARY2,\n    HELP_USING_BAG2,\n    HELP_READING_POKEDEX,\n    HELP_USING_HOME_PC,\n    HELP_USING_ITEM_STORAGE,\n    HELP_USING_WITHDRAW_ITEM2,\n    HELP_USING_DEPOSIT_ITEM2,\n    HELP_USING_MAILBOX2,\n    HELP_USING_RUN,\n    HELP_REGISTER_KEY_ITEM,\n    HELP_USING_BALL,\n    HELP_USING_BAIT,\n    HELP_USING_ROCK,\n    HELP_USING_HALL_OF_FAME,\n    HELP_USING_KEY_SYSTEM,\n    HELP_SORTING_BAG,\n    HELP_USING_OPTIONS_SUBMENU,\n    HELP_USING_KEY_SYSTEM_SUBMENU,\n};\n\nstatic const u8 *const sHelpSystemMenuTopicTextPtrs[] = {\n    [HELP_NONE]                         = NULL,\n    [HELP_USING_POKEDEX]                = Help_Text_UsingPokedex,\n    [HELP_USING_POKEMON]                = Help_Text_UsingPokemon,\n    [HELP_USING_SUMMARY]                = Help_Text_UsingSummary,\n    [HELP_USING_SWITCH]                 = Help_Text_UsingSwitch,\n    [HELP_USING_ITEM]                   = Help_Text_UsingItem,\n    [HELP_USING_BAG]                    = Help_Text_UsingBag,\n    [HELP_USING_AN_ITEM]                = Help_Text_UsingAnItem,\n    [HELP_USING_KEYITEM]                = Help_Text_UsingKeyItem,\n    [HELP_USING_POKEBALL]               = Help_Text_UsingPokeBall,\n    [HELP_USING_PLAYER]                 = Help_Text_UsingPlayer,\n    [HELP_USING_SAVE]                   = Help_Text_UsingSave,\n    [HELP_USING_OPTION]                 = Help_Text_UsingOption,\n    [HELP_USING_POTION]                 = Help_Text_UsingPotion,\n    [HELP_USING_TOWN_MAP]               = Help_Text_UsingTownMap,\n    [HELP_USING_TM]                     = Help_Text_UsingTM,\n    [HELP_USING_HM]                     = Help_Text_UsingHM,\n    [HELP_USING_MOVE_OUTSIDE_OF_BATTLE] = Help_Text_UsingMoveOutsideOfBattle,\n    [HELP_RIDING_BICYCLE]               = Help_Text_RidingBicycle,\n    [HELP_ENTERING_NAME]                = Help_Text_EnteringName,\n    [HELP_USING_PC]                     = Help_Text_UsingPC,\n    [HELP_USING_BILLS_PC]               = Help_Text_UsingBillsPC,\n    [HELP_USING_WITHDRAW]               = Help_Text_UsingWithdraw,\n    [HELP_USING_DEPOSIT]                = Help_Text_UsingDeposit,\n    [HELP_USING_MOVE]                   = Help_Text_UsingMove,\n    [HELP_MOVING_ITEMS]                 = Help_Text_MovingItems,\n    [HELP_USING_PLAYERS_PC]             = Help_Text_UsingPlayersPC,\n    [HELP_USING_WITHDRAW_ITEM]          = Help_Text_UsingWithdrawItem,\n    [HELP_USING_DEPOSIT_ITEM]           = Help_Text_UsingDepositItem,\n    [HELP_USING_MAILBOX]                = Help_Text_UsingMailbox,\n    [HELP_USING_PROF_OAKS_PC]           = Help_Text_UsingProfOaksPC,\n    [HELP_OPENING_MENU]                 = Help_Text_OpeningMenu,\n    [HELP_USING_FIGHT]                  = Help_Text_UsingFight,\n    [HELP_USING_POKEMON2]               = Help_Text_UsingPokemon2,\n    [HELP_USING_SHIFT]                  = Help_Text_UsingShift,\n    [HELP_USING_SUMMARY2]               = Help_Text_UsingSummary2,\n    [HELP_USING_BAG2]                   = Help_Text_UsingBag2,\n    [HELP_READING_POKEDEX]              = Help_Text_ReadingPokedex,\n    [HELP_USING_HOME_PC]                = Help_Text_UsingHomePC,\n    [HELP_USING_ITEM_STORAGE]           = Help_Text_UsingItemStorage,\n    [HELP_USING_WITHDRAW_ITEM2]         = Help_Text_UsingWithdrawItem2,\n    [HELP_USING_DEPOSIT_ITEM2]          = Help_Text_UsingDepositItem2,\n    [HELP_USING_MAILBOX2]               = Help_Text_UsingMailbox2,\n    [HELP_USING_RUN]                    = Help_Text_UsingRun,\n    [HELP_REGISTER_KEY_ITEM]            = Help_Text_RegisterKeyItem,\n    [HELP_USING_BALL]                   = Help_Text_UsingBall,\n    [HELP_USING_BAIT]                   = Help_Text_UsingBait,\n    [HELP_USING_ROCK]                   = Help_Text_UsingRock,\n    [HELP_USING_HALL_OF_FAME]           = Help_Text_UsingHallOfFame,\n    [HELP_USING_KEY_SYSTEM]             = Help_Text_UsingKeySystem,\n    [HELP_SORTING_BAG]                  = Help_Text_SortingBag,\n    [HELP_USING_OPTIONS_SUBMENU]        = Help_Text_UsingOptionsSubmenu,\n    [HELP_USING_KEY_SYSTEM_SUBMENU]     = Help_Text_UsingKeySystemSubmenu,\n};\n\nstatic const u8 *const sHelpSystemHowToUseMenuTextPtrs[] = {\n    [HELP_NONE]                         = NULL,\n    [HELP_USING_POKEDEX]                = Help_Text_HowToUsePokedex,\n    [HELP_USING_POKEMON]                = Help_Text_HowToUsePokemon,\n    [HELP_USING_SUMMARY]                = Help_Text_HowToUseSummary,\n    [HELP_USING_SWITCH]                 = Help_Text_HowToUseSwitch,\n    [HELP_USING_ITEM]                   = Help_Text_HowToUseItem,\n    [HELP_USING_BAG]                    = Help_Text_HowToUseBag,\n    [HELP_USING_AN_ITEM]                = Help_Text_HowToUseAnItem,\n    [HELP_USING_KEYITEM]                = Help_Text_HowToUseKeyItem,\n    [HELP_USING_POKEBALL]               = Help_Text_HowToUsePokeBall,\n    [HELP_USING_PLAYER]                 = Help_Text_HowToUsePlayer,\n    [HELP_USING_SAVE]                   = Help_Text_HowToUseSave,\n    [HELP_USING_OPTION]                 = Help_Text_HowToUseOption,\n    [HELP_USING_POTION]                 = Help_Text_HowToUsePotion,\n    [HELP_USING_TOWN_MAP]               = Help_Text_HowToUseTownMap,\n    [HELP_USING_TM]                     = Help_Text_HowToUseTM,\n    [HELP_USING_HM]                     = Help_Text_HowToUseHM,\n    [HELP_USING_MOVE_OUTSIDE_OF_BATTLE] = Help_Text_HowToUseMoveOutsideOfBattle,\n    [HELP_RIDING_BICYCLE]               = Help_Text_HowToRideBicycle,\n    [HELP_ENTERING_NAME]                = Help_Text_HowToEnterName,\n    [HELP_USING_PC]                     = Help_Text_HowToUsePC,\n    [HELP_USING_BILLS_PC]               = Help_Text_HowToUseBillsPC,\n    [HELP_USING_WITHDRAW]               = Help_Text_HowToUseWithdraw,\n    [HELP_USING_DEPOSIT]                = Help_Text_HowToUseDeposit,\n    [HELP_USING_MOVE]                   = Help_Text_HowToUseMove,\n    [HELP_MOVING_ITEMS]                 = Help_Text_HowToMoveItems,\n    [HELP_USING_PLAYERS_PC]             = Help_Text_HowToUsePlayersPC,\n    [HELP_USING_WITHDRAW_ITEM]          = Help_Text_HowToUseWithdrawItem,\n    [HELP_USING_DEPOSIT_ITEM]           = Help_Text_HowToUseDepositItem,\n    [HELP_USING_MAILBOX]                = Help_Text_HowToUseMailbox,\n    [HELP_USING_PROF_OAKS_PC]           = Help_Text_HowToUseProfOaksPC,\n    [HELP_OPENING_MENU]                 = Help_Text_HowToOpenMenu,\n    [HELP_USING_FIGHT]                  = Help_Text_HowToUseFight,\n    [HELP_USING_POKEMON2]               = Help_Text_HowToUsePokemon2,\n    [HELP_USING_SHIFT]                  = Help_Text_HowToUseShift,\n    [HELP_USING_SUMMARY2]               = Help_Text_HowToUseSummary2,\n    [HELP_USING_BAG2]                   = Help_Text_HowToUseBag2,\n    [HELP_READING_POKEDEX]              = Help_Text_HowToReadPokedex,\n    [HELP_USING_HOME_PC]                = Help_Text_HowToUseHomePC,\n    [HELP_USING_ITEM_STORAGE]           = Help_Text_HowToUseItemStorage,\n    [HELP_USING_WITHDRAW_ITEM2]         = Help_Text_HowToUseWithdrawItem2,\n    [HELP_USING_DEPOSIT_ITEM2]          = Help_Text_HowToUseDepositItem2,\n    [HELP_USING_MAILBOX2]               = Help_Text_HowToUseMailbox2,\n    [HELP_USING_RUN]                    = Help_Text_HowToUseRun,\n    [HELP_REGISTER_KEY_ITEM]            = Help_Text_HowToRegisterKeyItem,\n    [HELP_USING_BALL]                   = Help_Text_HowToUseBall,\n    [HELP_USING_BAIT]                   = Help_Text_HowToUseBait,\n    [HELP_USING_ROCK]                   = Help_Text_HowToUseRock,\n    [HELP_USING_HALL_OF_FAME]           = Help_Text_HowToUseHallOfFame,\n    [HELP_USING_KEY_SYSTEM]             = Help_Text_HowToUseKeySystemSettings,\n    [HELP_SORTING_BAG]                  = Help_Text_HowToSortBag,\n    [HELP_USING_OPTIONS_SUBMENU]        = Help_Text_HowToUseOptionSubmenu,\n    [HELP_USING_KEY_SYSTEM_SUBMENU]     = Help_Text_HowToUseKeySystemSubmenu,\n};\n\n// Submenu IDs for TOPIC_TERMS\nenum\n{\n    HELP_TERM_HP = 1,\n    HELP_TERM_EXP,\n    HELP_TERM_MOVES,\n    HELP_TERM_ATTACK,\n    HELP_TERM_DEFENSE,\n    HELP_TERM_SPATK,\n    HELP_TERM_SPDEF,\n    HELP_TERM_SPEED,\n    HELP_TERM_LEVEL,\n    HELP_TERM_TYPE,\n    HELP_TERM_OT,\n    HELP_TERM_ITEM,\n    HELP_TERM_ABILITY,\n    HELP_TERM_MONEY,\n    HELP_TERM_MOVE_TYPE,\n    HELP_TERM_NATURE,\n    HELP_TERM_ID_NO,\n    HELP_TERM_PP,\n    HELP_TERM_POWER,\n    HELP_TERM_ACCURACY,\n    HELP_TERM_FNT,\n    HELP_TERM_ITEMS,\n    HELP_TERM_KEYITEMS,\n    HELP_TERM_POKEBALLS,\n    HELP_TERM_POKEDEX,\n    HELP_TERM_PLAY_TIME,\n    HELP_TERM_BADGES,\n    HELP_TERM_TEXT_SPEED,\n    HELP_TERM_BATTLE_SCENE,\n    HELP_TERM_BATTLE_STYLE,\n    HELP_TERM_SOUND,\n    HELP_TERM_BUTTON_MODE,\n    HELP_TERM_FRAME,\n    HELP_TERM_CANCEL,\n    HELP_TERM_TM,\n    HELP_TERM_HM,\n    HELP_TERM_HM_MOVE,\n    HELP_TERM_EVOLUTION,\n    HELP_TERM_STATUS_PROBLEM,\n    HELP_TERM_POKEMON,\n    HELP_TERM_ID_NO2,\n    HELP_TERM_MONEY2,\n    HELP_TERM_BADGES2,\n    HELP_TERM_VERSION,\n    HELP_TERM_FR_EXCLUSIVES,\n    HELP_TERM_LG_EXCLUSIVES,\n    HELP_TERM_DIFFICULTY,\n    HELP_TERM_NUZLOCKE,\n    HELP_TERM_NUZLOCKE_CATCHING,\n    HELP_TERM_NUZLOCKE_LOSING,\n    HELP_TERM_IV_CALC,\n    HELP_TERM_EV_CALC,\n    HELP_TERM_NO_PMC,\n    HELP_TERM_BATTLE_TRANSITIONS,\n    HELP_TERM_EXP_MOD,\n    HELP_TERM_BATTLE_INTRO_ANIM,\n    HELP_TERM_MOVE_ANIMATIONS,\n    HELP_TERM_HP_BAR_ANIM_SPEED,\n    HELP_TERM_EXP_BAR_ANIM_SPEED,\n    HELP_TERM_BACK,\n    HELP_TERM_ADVANCED,\n    HELP_TERM_ADVANCED_KEYS_BACK,\n};\n\nstatic const u8 *const sHelpSystemTermTextPtrs[] = {\n    [HELP_NONE]                = NULL,\n    [HELP_TERM_HP]             = Help_Text_HP,\n    [HELP_TERM_EXP]            = Help_Text_EXP,\n    [HELP_TERM_MOVES]          = Help_Text_Moves,\n    [HELP_TERM_ATTACK]         = Help_Text_Attack,\n    [HELP_TERM_DEFENSE]        = Help_Text_Defense,\n    [HELP_TERM_SPATK]          = Help_Text_SpAtk,\n    [HELP_TERM_SPDEF]          = Help_Text_SpDef,\n    [HELP_TERM_SPEED]          = Help_Text_Speed,\n    [HELP_TERM_LEVEL]          = Help_Text_Level,\n    [HELP_TERM_TYPE]           = Help_Text_Type,\n    [HELP_TERM_OT]             = Help_Text_OT,\n    [HELP_TERM_ITEM]           = Help_Text_Item,\n    [HELP_TERM_ABILITY]        = Help_Text_Ability,\n    [HELP_TERM_MONEY]          = Help_Text_Money,\n    [HELP_TERM_MOVE_TYPE]      = Help_Text_MoveType,\n    [HELP_TERM_NATURE]         = Help_Text_Nature,\n    [HELP_TERM_ID_NO]          = Help_Text_IDNo,\n    [HELP_TERM_PP]             = Help_Text_PP,\n    [HELP_TERM_POWER]          = Help_Text_Power,\n    [HELP_TERM_ACCURACY]       = Help_Text_Accuracy,\n    [HELP_TERM_FNT]            = Help_Text_FNT,\n    [HELP_TERM_ITEMS]          = Help_Text_Items,\n    [HELP_TERM_KEYITEMS]       = Help_Text_KeyItems,\n    [HELP_TERM_POKEBALLS]      = Help_Text_PokeBalls,\n    [HELP_TERM_POKEDEX]        = Help_Text_Pokedex,\n    [HELP_TERM_PLAY_TIME]      = Help_Text_PlayTime,\n    [HELP_TERM_BADGES]         = Help_Text_Badges,\n    [HELP_TERM_TEXT_SPEED]     = Help_Text_TextSpeed,\n    [HELP_TERM_BATTLE_SCENE]   = Help_Text_BattleScene,\n    [HELP_TERM_BATTLE_STYLE]   = Help_Text_BattleStyle,\n    [HELP_TERM_SOUND]          = Help_Text_Sound,\n    [HELP_TERM_BUTTON_MODE]    = Help_Text_ButtonMode,\n    [HELP_TERM_FRAME]          = Help_Text_Frame,\n    [HELP_TERM_CANCEL]         = Help_Text_Cancel2,\n    [HELP_TERM_TM]             = Help_Text_TM,\n    [HELP_TERM_HM]             = Help_Text_HM,\n    [HELP_TERM_HM_MOVE]        = Help_Text_HMMove,\n    [HELP_TERM_EVOLUTION]      = Help_Text_Evolution,\n    [HELP_TERM_STATUS_PROBLEM] = Help_Text_StatusProblem,\n    [HELP_TERM_POKEMON]        = Help_Text_Pokemon,\n    [HELP_TERM_ID_NO2]         = Help_Text_IDNo2,\n    [HELP_TERM_MONEY2]         = Help_Text_Money2,\n    [HELP_TERM_BADGES2]        = Help_Text_Badges2,\n    [HELP_TERM_VERSION]        = Help_Text_Version,\n    [HELP_TERM_FR_EXCLUSIVES]  = Help_Text_FRExclusives,\n    [HELP_TERM_LG_EXCLUSIVES]  = Help_Text_LGExclusives,\n    [HELP_TERM_DIFFICULTY]     = Help_Text_Difficulty,\n    [HELP_TERM_NUZLOCKE]       = Help_Text_Nuzlocke,\n    [HELP_TERM_NUZLOCKE_CATCHING] = Help_Text_Nuzlocke_Catching,\n    [HELP_TERM_NUZLOCKE_LOSING] = Help_Text_NuzlockeLosing,\n    [HELP_TERM_IV_CALC]        = Help_Text_IvCalc,\n    [HELP_TERM_EV_CALC]        = Help_Text_EvCalc,\n    [HELP_TERM_NO_PMC]         = Help_Text_NoFreeHeals,\n    [HELP_TERM_BATTLE_TRANSITIONS] = Help_Text_BattleTransitions,\n    [HELP_TERM_EXP_MOD]        = Help_Text_ExpMod,\n    [HELP_TERM_BATTLE_INTRO_ANIM]   = Help_Text_BattleIntroAnim,\n    [HELP_TERM_MOVE_ANIMATIONS]     = Help_Text_MoveAnimations,\n    [HELP_TERM_HP_BAR_ANIM_SPEED]   = Help_Text_HpBarAnimSpeed,\n    [HELP_TERM_EXP_BAR_ANIM_SPEED] = Help_Text_ExpBarAnimSpeed,\n    [HELP_TERM_BACK]           = Help_Text_Back,\n    [HELP_TERM_ADVANCED]       = Help_Text_AdvancedKeys,\n    [HELP_TERM_ADVANCED_KEYS_BACK] = Help_Text_Back,\n};\n\nstatic const u8 *const sHelpSystemTermDefinitionsTextPtrs[] = {\n    [HELP_NONE]                = NULL,\n    [HELP_TERM_HP]             = Help_Text_DefineHP,\n    [HELP_TERM_EXP]            = Help_Text_DefineEXP,\n    [HELP_TERM_MOVES]          = Help_Text_DefineMoves,\n    [HELP_TERM_ATTACK]         = Help_Text_DefineAttack,\n    [HELP_TERM_DEFENSE]        = Help_Text_DefineDefense,\n    [HELP_TERM_SPATK]          = Help_Text_DefineSpAtk,\n    [HELP_TERM_SPDEF]          = Help_Text_DefineSpDef,\n    [HELP_TERM_SPEED]          = Help_Text_DefineSpeed,\n    [HELP_TERM_LEVEL]          = Help_Text_DefineLevel,\n    [HELP_TERM_TYPE]           = Help_Text_DefineType,\n    [HELP_TERM_OT]             = Help_Text_DefineOT,\n    [HELP_TERM_ITEM]           = Help_Text_DefineItem,\n    [HELP_TERM_ABILITY]        = Help_Text_DefineAbility,\n    [HELP_TERM_MONEY]          = Help_Text_DefineMoney,\n    [HELP_TERM_MOVE_TYPE]      = Help_Text_DefineMoveType,\n    [HELP_TERM_NATURE]         = Help_Text_DefineNature,\n    [HELP_TERM_ID_NO]          = Help_Text_DefineIDNo,\n    [HELP_TERM_PP]             = Help_Text_DefinePP,\n    [HELP_TERM_POWER]          = Help_Text_DefinePower,\n    [HELP_TERM_ACCURACY]       = Help_Text_DefineAccuracy,\n    [HELP_TERM_FNT]            = Help_Text_DefineFNT,\n    [HELP_TERM_ITEMS]          = Help_Text_DefineItems,\n    [HELP_TERM_KEYITEMS]       = Help_Text_DefineKeyItems,\n    [HELP_TERM_POKEBALLS]      = Help_Text_DefinePokeBalls,\n    [HELP_TERM_POKEDEX]        = Help_Text_DefinePokedex,\n    [HELP_TERM_PLAY_TIME]      = Help_Text_DefinePlayTime,\n    [HELP_TERM_BADGES]         = Help_Text_DefineBadges,\n    [HELP_TERM_TEXT_SPEED]     = Help_Text_DefineTextSpeed,\n    [HELP_TERM_BATTLE_SCENE]   = Help_Text_DefineBattleScene,\n    [HELP_TERM_BATTLE_STYLE]   = Help_Text_DefineBattleStyle,\n    [HELP_TERM_SOUND]          = Help_Text_DefineSound,\n    [HELP_TERM_BUTTON_MODE]    = Help_Text_DefineButtonMode,\n    [HELP_TERM_FRAME]          = Help_Text_DefineFrame,\n    [HELP_TERM_CANCEL]         = Help_Text_DefineCancel2,\n    [HELP_TERM_TM]             = Help_Text_DefineTM,\n    [HELP_TERM_HM]             = Help_Text_DefineHM,\n    [HELP_TERM_HM_MOVE]        = Help_Text_DefineHMMove,\n    [HELP_TERM_EVOLUTION]      = Help_Text_DefineEvolution,\n    [HELP_TERM_STATUS_PROBLEM] = Help_Text_DefineStatusProblem,\n    [HELP_TERM_POKEMON]        = Help_Text_DefinePokemon,\n    [HELP_TERM_ID_NO2]         = Help_Text_DefineIDNo2,\n    [HELP_TERM_MONEY2]         = Help_Text_DefineMoney2,\n    [HELP_TERM_BADGES2]        = Help_Text_DefineBadges2,\n    [HELP_TERM_VERSION]        = Help_Text_DefineVersion,\n    [HELP_TERM_FR_EXCLUSIVES]  = Help_Text_DefineFRExclusives,\n    [HELP_TERM_LG_EXCLUSIVES]  = Help_Text_DefineLGExclusives,\n    [HELP_TERM_DIFFICULTY]     = Help_Text_DefineDifficulty,\n    [HELP_TERM_NUZLOCKE]       = Help_Text_DefineNuzlocke,\n    [HELP_TERM_NUZLOCKE_CATCHING] = Help_Text_DefineNuzlocke_Catching,\n    [HELP_TERM_NUZLOCKE_LOSING] = Help_Text_DefineNuzlockeLosing,\n    [HELP_TERM_IV_CALC]        = Help_Text_DefineIvCalc,\n    [HELP_TERM_EV_CALC]        = Help_Text_DefineEvCalc,\n    [HELP_TERM_NO_PMC]         = Help_Text_DefineNoFreeHeals,\n    [HELP_TERM_BATTLE_TRANSITIONS] = Help_Text_DefineBattleTransitions,\n    [HELP_TERM_EXP_MOD]        = Help_Text_DefineExpMod,\n    [HELP_TERM_BATTLE_INTRO_ANIM]   = Help_Text_DefineBattleIntroAnims,\n    [HELP_TERM_MOVE_ANIMATIONS]     = Help_Text_DefineMoveAnimations,\n    [HELP_TERM_HP_BAR_ANIM_SPEED]   = Help_Text_DefineHpBarAnimSpeed,\n    [HELP_TERM_EXP_BAR_ANIM_SPEED] = Help_Text_DefineExpBarAnimSpeed,\n    [HELP_TERM_BACK]          = Help_Text_DefineBack,\n    [HELP_TERM_ADVANCED]       = Help_Text_DefineAdvancedKeys,\n    [HELP_TERM_ADVANCED_KEYS_BACK] = Help_Text_DefineAdvancedKeysBack,\n};\n\n// Submenu IDs for TOPIC_ABOUT_GAME\nenum\n{\n    HELP_THE_HELP_SYSTEM = 1,\n    HELP_THE_GAME,\n    HELP_WIRELESS_ADAPTER,\n    HELP_GAME_FUNDAMENTALS_1,\n    HELP_GAME_FUNDAMENTALS_2,\n    HELP_GAME_FUNDAMENTALS_3,\n    HELP_WHAT_ARE_POKEMON,\n};\n\nstatic const u8 *const sHelpSystemGeneralTopicTextPtrs[] = {\n    [HELP_NONE]                = NULL,\n    [HELP_THE_HELP_SYSTEM]     = Help_Text_TheHelpSystem,\n    [HELP_THE_GAME]            = Help_Text_TheGame,\n    [HELP_WIRELESS_ADAPTER]    = Help_Text_WirelessAdapter,\n    [HELP_GAME_FUNDAMENTALS_1] = Help_Text_GameFundamentals1,\n    [HELP_GAME_FUNDAMENTALS_2] = Help_Text_GameFundamentals2,\n    [HELP_GAME_FUNDAMENTALS_3] = Help_Text_GameFundamentals3,\n    [HELP_WHAT_ARE_POKEMON]    = Help_Text_WhatArePokemon\n};\n\nstatic const u8 *const sHelpSystemGeneralTopicDescriptionTextPtrs[] = {\n    [HELP_NONE]                = NULL,\n    [HELP_THE_HELP_SYSTEM]     = Help_Text_DescTheHelpSystem,\n    [HELP_THE_GAME]            = Help_Text_DescTheGame,\n    [HELP_WIRELESS_ADAPTER]    = Help_Text_DescWirelessAdapter,\n    [HELP_GAME_FUNDAMENTALS_1] = Help_Text_DescGameFundamentals1,\n    [HELP_GAME_FUNDAMENTALS_2] = Help_Text_DescGameFundamentals2,\n    [HELP_GAME_FUNDAMENTALS_3] = Help_Text_DescGameFundamentals3,\n    [HELP_WHAT_ARE_POKEMON]    = Help_Text_DescWhatArePokemon\n};\n\n// An enum for the type matchups isn't necessary, when used they're always used in their entirety\n// Macro below is used to reference the entire group at once\n#define HELP_TYPE_MATCHUPS  \\\n    1,                      \\\n    2, 3,                   \\\n    4, 5,                   \\\n    6, 7,                   \\\n    8, 9,                   \\\n    10, 11,                 \\\n    12, 13,                 \\\n    14, 15,                 \\\n    16, 17,                 \\\n    18, 19,                 \\\n    20, 21,                 \\\n    22, 23,                 \\\n    24, 25,                 \\\n    26, 27,                 \\\n    28, 29,                 \\\n    30, 31,                 \\\n    32, 33,                 \\\n    34, 35                  \\\n\nstatic const u8 *const sHelpSystemTypeMatchupTextPtrs[] = {\n    [HELP_NONE] = NULL,\n    [1]  = Help_Text_UsingTypeMatchupList,\n    [2]  = Help_Text_OwnMoveDark,\n    [3]  = Help_Text_OwnPokemonDark,\n    [4]  = Help_Text_OwnMoveRock,\n    [5]  = Help_Text_OwnPokemonRock,\n    [6]  = Help_Text_OwnMovePsychic,\n    [7]  = Help_Text_OwnPokemonPsychic,\n    [8]  = Help_Text_OwnMoveFighting,\n    [9]  = Help_Text_OwnPokemonFighting,\n    [10] = Help_Text_OwnMoveGrass,\n    [11] = Help_Text_OwnPokemonGrass,\n    [12] = Help_Text_OwnMoveGhost,\n    [13] = Help_Text_OwnPokemonGhost,\n    [14] = Help_Text_OwnMoveIce,\n    [15] = Help_Text_OwnPokemonIce,\n    [16] = Help_Text_OwnMoveGround,\n    [17] = Help_Text_OwnPokemonGround,\n    [18] = Help_Text_OwnMoveElectric,\n    [19] = Help_Text_OwnPokemonElectric,\n    [20] = Help_Text_OwnMovePoison,\n    [21] = Help_Text_OwnPokemonPoison,\n    [22] = Help_Text_OwnMoveDragon,\n    [23] = Help_Text_OwnPokemonDragon,\n    [24] = Help_Text_OwnMoveNormal,\n    [25] = Help_Text_OwnPokemonNormal,\n    [26] = Help_Text_OwnMoveSteel,\n    [27] = Help_Text_OwnPokemonSteel,\n    [28] = Help_Text_OwnMoveFlying,\n    [29] = Help_Text_OwnPokemonFlying,\n    [30] = Help_Text_OwnMoveFire,\n    [31] = Help_Text_OwnPokemonFire,\n    [32] = Help_Text_OwnMoveWater,\n    [33] = Help_Text_OwnPokemonWater,\n    [34] = Help_Text_OwnMoveBug,\n    [35] = Help_Text_OwnPokemonBug\n};\n\nstatic const u8 *const sHelpSystemTypeMatchupDescriptionTextPtrs[] = {\n    [HELP_NONE] = NULL,\n    [1]  = Help_Text_HowToUseTypeMatchupList,\n    [2]  = Help_Text_TypeMatchupOwnMoveDark,\n    [3]  = Help_Text_TypeMatchupOwnPokemonDark,\n    [4]  = Help_Text_TypeMatchupOwnMoveRock,\n    [5]  = Help_Text_TypeMatchupOwnPokemonRock,\n    [6]  = Help_Text_TypeMatchupOwnMovePsychic,\n    [7]  = Help_Text_TypeMatchupOwnPokemonPsychic,\n    [8]  = Help_Text_TypeMatchupOwnMoveFighting,\n    [9]  = Help_Text_TypeMatchupOwnPokemonFighting,\n    [10] = Help_Text_TypeMatchupOwnMoveGrass,\n    [11] = Help_Text_TypeMatchupOwnPokemonGrass,\n    [12] = Help_Text_TypeMatchupOwnMoveGhost,\n    [13] = Help_Text_TypeMatchupOwnPokemonGhost,\n    [14] = Help_Text_TypeMatchupOwnMoveIce,\n    [15] = Help_Text_TypeMatchupOwnPokemonIce,\n    [16] = Help_Text_TypeMatchupOwnMoveGround,\n    [17] = Help_Text_TypeMatchupOwnPokemonGround,\n    [18] = Help_Text_TypeMatchupOwnMoveElectric,\n    [19] = Help_Text_TypeMatchupOwnPokemonElectric,\n    [20] = Help_Text_TypeMatchupOwnMovePoison,\n    [21] = Help_Text_TypeMatchupOwnPokemonPoison,\n    [22] = Help_Text_TypeMatchupOwnMoveDragon,\n    [23] = Help_Text_TypeMatchupOwnPokemonDragon,\n    [24] = Help_Text_TypeMatchupOwnMoveNormal,\n    [25] = Help_Text_TypeMatchupOwnPokemonNormal,\n    [26] = Help_Text_TypeMatchupOwnMoveSteel,\n    [27] = Help_Text_TypeMatchupOwnPokemonSteel,\n    [28] = Help_Text_TypeMatchupOwnMoveFlying,\n    [29] = Help_Text_TypeMatchupOwnPokemonFlying,\n    [30] = Help_Text_TypeMatchupOwnMoveFire,\n    [31] = Help_Text_TypeMatchupOwnPokemonFire,\n    [32] = Help_Text_TypeMatchupOwnMoveWater,\n    [33] = Help_Text_TypeMatchupOwnPokemonWater,\n    [34] = Help_Text_TypeMatchupOwnMoveBug,\n    [35] = Help_Text_TypeMatchupOwnPokemonBug\n};\n\nstatic const u8 sAboutGame_TitleScreen[] = {\n    HELP_THE_HELP_SYSTEM, \n    HELP_THE_GAME, \n    HELP_WIRELESS_ADAPTER, \n    HELP_END\n};\n\nstatic const u8 sAboutGame_NewGame[] = {\n    HELP_THE_HELP_SYSTEM, \n    HELP_THE_GAME, \n    HELP_WIRELESS_ADAPTER, \n    HELP_END\n};\n\nstatic const u8 sHowTo_NamingScreen[] = {\n    HELP_ENTERING_NAME, \n    HELP_END\n};\n\nstatic const u8 sAboutGame_NamingScreen[] = {\n    HELP_THE_HELP_SYSTEM, \n    HELP_THE_GAME, \n    HELP_WIRELESS_ADAPTER, \n    HELP_END\n};\n\nstatic const u8 sHowTo_Pokedex[] = {\n    HELP_USING_POKEDEX, \n    HELP_READING_POKEDEX, \n    HELP_END\n};\n\nstatic const u8 sHowTo_PartyMenu[] = {\n    HELP_USING_POKEMON, \n    HELP_USING_SUMMARY,\n    HELP_USING_SWITCH, \n    HELP_USING_ITEM, \n    HELP_USING_MOVE_OUTSIDE_OF_BATTLE,\n    HELP_END\n};\n\nstatic const u8 sTerms_PartyMenu[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_END\n};\n\nstatic const u8 sHowTo_PokemonInfo[] = {\n    HELP_USING_POKEMON, \n    HELP_USING_SUMMARY, \n    HELP_END\n};\n\nstatic const u8 sTerms_PokemonInfo[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_TYPE, \n    HELP_TERM_OT, \n    HELP_TERM_ID_NO, \n    HELP_TERM_ITEM, \n    HELP_TERM_NATURE, \n    HELP_END\n};\n\nstatic const u8 sTerms_PokemonSkills[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_ATTACK, \n    HELP_TERM_DEFENSE, \n    HELP_TERM_SPATK, \n    HELP_TERM_SPDEF, \n    HELP_TERM_SPEED, \n    HELP_TERM_EXP, \n    HELP_TERM_ABILITY, \n    HELP_END\n};\n\nstatic const u8 sTerms_PokemonMoves[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_MOVES, \n    HELP_TERM_TYPE, \n    HELP_TERM_MOVE_TYPE, \n    HELP_TERM_PP, \n    HELP_TERM_POWER, \n    HELP_TERM_ACCURACY, \n    HELP_END\n};\n\nstatic const u8 sHowTo_Bag[] = {\n    HELP_USING_BAG,\n    HELP_SORTING_BAG, \n    HELP_USING_AN_ITEM, \n    HELP_USING_KEYITEM, \n    HELP_REGISTER_KEY_ITEM, \n    HELP_USING_POKEBALL, \n    HELP_USING_POTION, \n    HELP_USING_TOWN_MAP, \n    HELP_USING_TM, \n    HELP_USING_HM, \n    HELP_RIDING_BICYCLE, \n    HELP_END\n};\n\nstatic const u8 sTerms_Bag[] = {\n    HELP_TERM_ITEMS, \n    HELP_TERM_KEYITEMS, \n    HELP_TERM_POKEBALLS, \n    HELP_END\n};\n\nstatic const u8 sHowTo_TrainerCardFront[] = {\n    HELP_USING_PLAYER, \n    HELP_END\n};\n\nstatic const u8 sTerms_TrainerCardFront[] = {\n    HELP_TERM_ID_NO, \n    HELP_TERM_MONEY, \n    HELP_TERM_POKEDEX, \n    HELP_TERM_PLAY_TIME, \n    HELP_TERM_BADGES, \n    HELP_END\n};\n\nstatic const u8 sHowTo_TrainerCardBack[] = {\n    HELP_USING_PLAYER, \n    HELP_END\n};\n\nstatic const u8 sHowTo_Save[] = {\n    HELP_USING_SAVE, \n    HELP_END\n};\n\nstatic const u8 sTerms_Save[] = {\n    HELP_TERM_BADGES2, \n    HELP_TERM_POKEDEX, \n    HELP_TERM_PLAY_TIME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_Options[] = {\n    HELP_USING_OPTION, \n    HELP_END\n};\n\nstatic const u8 sTerms_Options[] = {\n    HELP_TERM_TEXT_SPEED, \n    HELP_TERM_BATTLE_SCENE, \n    HELP_TERM_BATTLE_STYLE,\n    HELP_TERM_SOUND, \n    HELP_TERM_BUTTON_MODE, \n    HELP_TERM_FRAME, \n    HELP_TERM_CANCEL, \n    HELP_END\n};\n\nstatic const u8 sWhatToDo_PlayersHouse[] = {\n    HELP_WHAT_SHOULD_I_BE_DOING, \n    HELP_CANT_GET_OUT_OF_ROOM, \n    HELP_CANT_FIND_PERSON_I_WANT, \n    HELP_END\n};\n\nstatic const u8 sAboutGame_PlayersHouse[] = {\n    HELP_THE_HELP_SYSTEM, \n    HELP_THE_GAME, \n    HELP_WIRELESS_ADAPTER, \n    HELP_WHAT_ARE_POKEMON, \n    HELP_END\n};\n\nstatic const u8 sWhatToDo_OaksLab[] = {\n    HELP_WHAT_SHOULD_I_BE_DOING, \n    HELP_CANT_FIND_PERSON_I_WANT, \n    HELP_TALKED_TO_EVERYONE_NOW_WHAT, \n    HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, \n    HELP_WANT_TO_END_GAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_OaksLab[] = {\n    HELP_OPENING_MENU, \n    HELP_USING_POKEDEX, \n    HELP_USING_POKEMON, \n    HELP_USING_SUMMARY, \n    HELP_USING_SWITCH, \n    HELP_USING_ITEM, \n    HELP_USING_BAG, \n    HELP_USING_AN_ITEM, \n    HELP_USING_KEYITEM, \n    HELP_REGISTER_KEY_ITEM,\n    HELP_USING_POKEBALL, \n    HELP_USING_POTION, \n    HELP_USING_TOWN_MAP, \n    HELP_USING_TM, \n    HELP_USING_HM, \n    HELP_USING_PLAYER, \n    HELP_USING_SAVE, \n    HELP_USING_OPTION, \n    HELP_USING_MOVE_OUTSIDE_OF_BATTLE, \n    HELP_END\n};\n\nstatic const u8 sTerms_OaksLab[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_EXP, \n    HELP_TERM_MOVES, \n    HELP_TERM_TYPE, \n    HELP_TERM_POKEMON, \n    HELP_END\n};\n\nstatic const u8 sWhatToDo_PokeCenter[] = {\n    HELP_WHAT_SHOULD_I_BE_DOING, \n    HELP_TALKED_TO_EVERYONE_NOW_WHAT, \n    HELP_SOMEONE_BLOCKING_MY_WAY, \n    HELP_WHAT_ARE_MY_ADVENTURE_BASICS, \n    HELP_WHATS_POKEMON_CENTER, \n    HELP_WHATS_POKEMON_MART, \n    HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, \n    HELP_WANT_TO_END_GAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_PokeCenter[] = {\n    HELP_OPENING_MENU, \n    HELP_USING_POKEDEX, \n    HELP_USING_POKEMON, \n    HELP_USING_SUMMARY, \n    HELP_USING_SWITCH, \n    HELP_USING_ITEM, \n    HELP_USING_BAG, \n    HELP_USING_AN_ITEM, \n    HELP_USING_KEYITEM, \n    HELP_REGISTER_KEY_ITEM, \n    HELP_USING_POKEBALL, \n    HELP_USING_POTION, \n    HELP_USING_TOWN_MAP, \n    HELP_USING_TM, \n    HELP_USING_HM, \n    HELP_USING_PLAYER, \n    HELP_USING_SAVE, \n    HELP_USING_OPTION, \n    HELP_USING_MOVE_OUTSIDE_OF_BATTLE, \n    HELP_USING_PC, \n    HELP_END\n};\n\nstatic const u8 sTerms_PokeCenter[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_EXP, \n    HELP_TERM_MOVES, \n    HELP_TERM_TYPE, \n    HELP_TERM_POKEMON, \n    HELP_END\n};\n\nstatic const u8 sAboutGame_PokeCenter[] = {\n    HELP_WIRELESS_ADAPTER, \n    HELP_WHAT_ARE_POKEMON, \n    HELP_GAME_FUNDAMENTALS_1, \n    HELP_GAME_FUNDAMENTALS_2, \n    HELP_GAME_FUNDAMENTALS_3, \n    HELP_END\n};\n\nstatic const u8 sWhatToDo_Mart[] = {\n    HELP_WHAT_SHOULD_I_BE_DOING, \n    HELP_TALKED_TO_EVERYONE_NOW_WHAT, \n    HELP_SOMEONE_BLOCKING_MY_WAY, \n    HELP_WHAT_ARE_MY_ADVENTURE_BASICS, \n    HELP_WHATS_POKEMON_CENTER, \n    HELP_WHATS_POKEMON_MART, \n    HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, \n    HELP_WANT_TO_END_GAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_Mart[] = {\n    HELP_OPENING_MENU, \n    HELP_USING_POKEDEX, \n    HELP_USING_POKEMON, \n    HELP_USING_SUMMARY, \n    HELP_USING_SWITCH, \n    HELP_USING_ITEM, \n    HELP_USING_BAG, \n    HELP_USING_AN_ITEM, \n    HELP_USING_KEYITEM, \n    HELP_REGISTER_KEY_ITEM, \n    HELP_USING_POKEBALL, \n    HELP_USING_POTION, \n    HELP_USING_TOWN_MAP, \n    HELP_USING_TM, \n    HELP_USING_HM, \n    HELP_USING_PLAYER, \n    HELP_USING_SAVE, \n    HELP_USING_OPTION, \n    HELP_USING_MOVE_OUTSIDE_OF_BATTLE, \n    HELP_END\n};\n\nstatic const u8 sTerms_Mart[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_EXP, \n    HELP_TERM_MOVES, \n    HELP_TERM_TYPE, \n    HELP_TERM_ITEM, \n    HELP_TERM_MONEY, \n    HELP_TERM_ITEMS, \n    HELP_TERM_KEYITEMS, \n    HELP_TERM_POKEBALLS, \n    HELP_TERM_FNT, \n    HELP_END\n};\n\nstatic const u8 sWhatToDo_Gym[] = {\n    HELP_SOMEONE_BLOCKING_MY_WAY, \n    HELP_WHAT_ARE_MY_ADVENTURE_BASICS, \n    HELP_WHATS_POKEMON_CENTER, \n    HELP_WHATS_POKEMON_MART, \n    HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, \n    HELP_WANT_TO_END_GAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_Gym[] = {\n    HELP_OPENING_MENU, \n    HELP_USING_POKEDEX, \n    HELP_USING_POKEMON, \n    HELP_USING_SUMMARY, \n    HELP_USING_SWITCH, \n    HELP_USING_ITEM, \n    HELP_USING_BAG, \n    HELP_USING_AN_ITEM, \n    HELP_USING_KEYITEM, \n    HELP_REGISTER_KEY_ITEM, \n    HELP_USING_POKEBALL, \n    HELP_USING_POTION, \n    HELP_USING_TOWN_MAP, \n    HELP_USING_TM, \n    HELP_USING_HM, \n    HELP_USING_PLAYER, \n    HELP_USING_SAVE, \n    HELP_USING_OPTION, \n    HELP_USING_MOVE_OUTSIDE_OF_BATTLE, \n    HELP_END\n};\n\nstatic const u8 sTerms_Gym[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_EXP, \n    HELP_TERM_MOVES, \n    HELP_TERM_TYPE, \n    HELP_TERM_FNT, \n    HELP_END\n};\n\nstatic const u8 sTypeMatchups_Gym[] = {\n    HELP_TYPE_MATCHUPS,\n    HELP_END\n};\n\nstatic const u8 sWhatToDo_Indoors[] = {\n    HELP_WHAT_SHOULD_I_BE_DOING, \n    HELP_WHAT_ARE_MY_ADVENTURE_BASICS, \n    HELP_CANT_FIND_PERSON_I_WANT, \n    HELP_TALKED_TO_EVERYONE_NOW_WHAT, \n    HELP_SOMEONE_BLOCKING_MY_WAY, \n    HELP_I_CANT_GO_ON, \n    HELP_HOW_DO_I_PROGRESS, \n    HELP_WHAT_IS_THAT_PERSON_LIKE, \n    HELP_OUT_OF_THINGS_TO_DO, \n    HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, \n    HELP_WHAT_DO_I_DO_IN_CAVE, \n    HELP_WHATS_POKEMON_CENTER, \n    HELP_WHATS_POKEMON_MART, \n    HELP_WHAT_IS_A_GYM, \n    HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, \n    HELP_WHEN_CAN_I_USE_ITEM, \n    HELP_RAN_OUT_OF_POTIONS, \n    HELP_CAN_I_BUY_POKEBALLS, \n    HELP_WHATS_A_BATTLE, \n    HELP_HOW_DO_I_PREPARE_FOR_BATTLE, \n    HELP_WHAT_IS_A_MONS_VITALITY, \n    HELP_WHERE_DO_MONS_APPEAR, \n    HELP_CANT_CATCH_MONS, \n    HELP_WANT_TO_MAKE_MON_STRONGER, \n    HELP_FOE_MONS_TOO_STRONG, \n    HELP_MY_MONS_ARE_HURT, \n    HELP_WHAT_IS_STATUS_PROBLEM, \n    HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, \n    HELP_WHATS_A_TRAINER, \n    HELP_HOW_DO_I_WIN_AGAINST_TRAINER, \n    HELP_WHAT_ARE_MOVES, \n    HELP_WANT_TO_ADD_MORE_MOVES, \n    HELP_WHAT_ARE_HIDDEN_MOVES, \n    HELP_WHAT_DOES_HIDDEN_MOVE_DO, \n    HELP_WANT_TO_END_GAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_Indoors[] = {\n    HELP_OPENING_MENU, \n    HELP_USING_POKEDEX, \n    HELP_USING_POKEMON, \n    HELP_USING_SUMMARY, \n    HELP_USING_SWITCH, \n    HELP_USING_ITEM, \n    HELP_USING_BAG, \n    HELP_USING_AN_ITEM, \n    HELP_USING_KEYITEM, \n    HELP_REGISTER_KEY_ITEM, \n    HELP_USING_POKEBALL, \n    HELP_USING_POTION, \n    HELP_USING_TOWN_MAP, \n    HELP_USING_TM, \n    HELP_USING_HM, \n    HELP_USING_PLAYER, \n    HELP_USING_SAVE, \n    HELP_USING_OPTION, \n    HELP_USING_MOVE_OUTSIDE_OF_BATTLE, \n    HELP_END\n};\n\nstatic const u8 sTerms_Indoors[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_EXP, \n    HELP_TERM_TYPE, \n    HELP_TERM_OT, \n    HELP_TERM_ITEM, \n    HELP_TERM_ABILITY,\n    HELP_TERM_FNT, \n    HELP_END\n};\n\nstatic const u8 sWhatToDo_Overworld[] = {\n    HELP_WHAT_SHOULD_I_BE_DOING, \n    HELP_WHAT_ARE_MY_ADVENTURE_BASICS, \n    HELP_CANT_FIND_PERSON_I_WANT, \n    HELP_TALKED_TO_EVERYONE_NOW_WHAT, \n    HELP_SOMEONE_BLOCKING_MY_WAY, \n    HELP_I_CANT_GO_ON, \n    HELP_HOW_DO_I_PROGRESS, \n    HELP_WHAT_IS_THAT_PERSON_LIKE, \n    HELP_OUT_OF_THINGS_TO_DO, \n    HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, \n    HELP_WHAT_DO_I_DO_IN_CAVE, \n    HELP_WHATS_POKEMON_CENTER, \n    HELP_WHATS_POKEMON_MART, \n    HELP_WHAT_IS_A_GYM, \n    HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, \n    HELP_WHEN_CAN_I_USE_ITEM, \n    HELP_RAN_OUT_OF_POTIONS, \n    HELP_CAN_I_BUY_POKEBALLS, \n    HELP_WHATS_A_BATTLE, \n    HELP_HOW_DO_I_PREPARE_FOR_BATTLE, \n    HELP_WHAT_IS_A_MONS_VITALITY, \n    HELP_WHERE_DO_MONS_APPEAR, \n    HELP_CANT_CATCH_MONS, \n    HELP_WANT_TO_MAKE_MON_STRONGER, \n    HELP_FOE_MONS_TOO_STRONG, \n    HELP_MY_MONS_ARE_HURT, \n    HELP_WHAT_IS_STATUS_PROBLEM, \n    HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, \n    HELP_WHATS_A_TRAINER, \n    HELP_HOW_DO_I_WIN_AGAINST_TRAINER, \n    HELP_WHAT_ARE_MOVES, \n    HELP_WANT_TO_ADD_MORE_MOVES, \n    HELP_WHAT_ARE_HIDDEN_MOVES, \n    HELP_WHAT_DOES_HIDDEN_MOVE_DO, \n    HELP_WANT_TO_END_GAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_Overworld[] = {\n    HELP_OPENING_MENU, \n    HELP_USING_POKEDEX, \n    HELP_USING_POKEMON, \n    HELP_USING_BAG, \n    HELP_USING_PLAYER, \n    HELP_USING_SAVE, \n    HELP_USING_OPTION, \n    HELP_USING_MOVE_OUTSIDE_OF_BATTLE, \n    HELP_END\n};\n\nstatic const u8 sTerms_Overworld[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_EXP, \n    HELP_TERM_TYPE, \n    HELP_TERM_OT, \n    HELP_TERM_ITEM, \n    HELP_TERM_ABILITY, \n    HELP_TERM_FNT, \n    HELP_TERM_POKEMON, \n    HELP_END\n};\n\nstatic const u8 sWhatToDo_Dungeon[] = {\n    HELP_WHAT_ARE_MY_ADVENTURE_BASICS, \n    HELP_I_CANT_GO_ON, \n    HELP_HOW_DO_I_PROGRESS, \n    HELP_WHAT_IS_THAT_PERSON_LIKE, \n    HELP_OUT_OF_THINGS_TO_DO, \n    HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, \n    HELP_WHAT_DO_I_DO_IN_CAVE, \n    HELP_WHATS_POKEMON_CENTER, \n    HELP_WHATS_POKEMON_MART, \n    HELP_WHAT_IS_A_GYM, \n    HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, \n    HELP_WHEN_CAN_I_USE_ITEM, \n    HELP_RAN_OUT_OF_POTIONS, \n    HELP_WHATS_A_BATTLE, \n    HELP_HOW_DO_I_PREPARE_FOR_BATTLE, \n    HELP_WHAT_IS_A_MONS_VITALITY, \n    HELP_WHERE_DO_MONS_APPEAR, \n    HELP_CANT_CATCH_MONS, \n    HELP_WANT_TO_MAKE_MON_STRONGER, \n    HELP_FOE_MONS_TOO_STRONG, \n    HELP_MY_MONS_ARE_HURT, \n    HELP_WHAT_IS_STATUS_PROBLEM, \n    HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, \n    HELP_WHATS_A_TRAINER, \n    HELP_HOW_DO_I_WIN_AGAINST_TRAINER, \n    HELP_WHAT_ARE_MOVES, \n    HELP_WANT_TO_ADD_MORE_MOVES, \n    HELP_WHAT_ARE_HIDDEN_MOVES, \n    HELP_WHAT_DOES_HIDDEN_MOVE_DO, \n    HELP_WANT_TO_END_GAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_Dungeon[] = {\n    HELP_OPENING_MENU, \n    HELP_USING_POKEDEX, \n    HELP_USING_POKEMON, \n    HELP_USING_BAG, \n    HELP_USING_PLAYER, \n    HELP_USING_SAVE, \n    HELP_USING_OPTION, \n    HELP_USING_MOVE_OUTSIDE_OF_BATTLE, \n    HELP_END\n};\n\nstatic const u8 sTerms_Dungeon[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_EXP, \n    HELP_TERM_TYPE, \n    HELP_TERM_OT, \n    HELP_TERM_ITEM, \n    HELP_TERM_ABILITY, \n    HELP_TERM_FNT, \n    HELP_END\n};\n\nstatic const u8 sWhatToDo_Surfing[] = {\n    HELP_I_CANT_GO_ON, \n    HELP_WHAT_IS_THAT_PERSON_LIKE, \n    HELP_OUT_OF_THINGS_TO_DO, \n    HELP_WHAT_IS_A_GYM, \n    HELP_CANT_CATCH_MONS, \n    HELP_WANT_TO_MAKE_MON_STRONGER, \n    HELP_FOE_MONS_TOO_STRONG, \n    HELP_MY_MONS_ARE_HURT, \n    HELP_WHAT_IS_STATUS_PROBLEM, \n    HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, \n    HELP_WHATS_A_TRAINER, \n    HELP_HOW_DO_I_WIN_AGAINST_TRAINER, \n    HELP_WHAT_ARE_MOVES, \n    HELP_WANT_TO_ADD_MORE_MOVES, \n    HELP_WHAT_ARE_HIDDEN_MOVES, \n    HELP_WHAT_DOES_HIDDEN_MOVE_DO, \n    HELP_WANT_TO_END_GAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_Surfing[] = {\n    HELP_OPENING_MENU, \n    HELP_USING_POKEDEX, \n    HELP_USING_POKEMON, \n    HELP_USING_BAG, \n    HELP_USING_PLAYER, \n    HELP_USING_SAVE, \n    HELP_USING_OPTION, \n    HELP_USING_MOVE_OUTSIDE_OF_BATTLE, \n    HELP_END\n};\n\nstatic const u8 sTerms_Surfing[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP,\n    HELP_TERM_EXP, \n    HELP_TERM_TYPE, \n    HELP_TERM_OT, \n    HELP_TERM_ITEM, \n    HELP_TERM_ABILITY, \n    HELP_TERM_FNT, \n    HELP_END\n};\n\nstatic const u8 sWhatToDo_WildBattle[] = {\n    HELP_WHATS_A_BATTLE, \n    HELP_WHAT_ARE_MOVES, \n    HELP_WHAT_MOVES_SHOULD_I_USE, \n    HELP_WHAT_IS_A_MONS_VITALITY, \n    HELP_MY_MONS_ARE_HURT, \n    HELP_CANT_CATCH_MONS, \n    HELP_CAN_I_BUY_POKEBALLS, \n    HELP_RAN_OUT_OF_POTIONS, \n    HELP_WANT_TO_MAKE_MON_STRONGER, \n    HELP_FOE_MONS_TOO_STRONG, \n    HELP_WHAT_IS_STATUS_PROBLEM, \n    HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, \n    HELP_END\n};\n\nstatic const u8 sHowTo_WildBattle[] = {\n    HELP_USING_FIGHT, \n    HELP_USING_POKEMON2, \n    HELP_USING_SHIFT, \n    HELP_USING_SUMMARY2, \n    HELP_USING_BAG2, \n    HELP_USING_AN_ITEM, \n    HELP_USING_POKEBALL, \n    HELP_USING_RUN, \n    HELP_END\n};\n\nstatic const u8 sTerms_WildBattle[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_EXP, \n    HELP_TERM_MOVES, \n    HELP_TERM_ATTACK, \n    HELP_TERM_DEFENSE, \n    HELP_TERM_SPATK, \n    HELP_TERM_SPDEF, \n    HELP_TERM_SPEED, \n    HELP_TERM_TYPE, \n    HELP_TERM_ABILITY, \n    HELP_TERM_MOVE_TYPE, \n    HELP_TERM_PP, \n    HELP_TERM_POWER, \n    HELP_TERM_ACCURACY, \n    HELP_TERM_STATUS_PROBLEM, \n    HELP_TERM_FNT, \n    HELP_END\n};\n\nstatic const u8 sTypeMatchups_WildBattle[] = {\n    HELP_TYPE_MATCHUPS,\n    HELP_END\n};\n\nstatic const u8 sWhatToDo_TrainerBattleSingle[] = {\n    HELP_WHATS_A_BATTLE, \n    HELP_WHAT_ARE_MOVES, \n    HELP_WHAT_MOVES_SHOULD_I_USE, \n    HELP_WHAT_IS_A_MONS_VITALITY, \n    HELP_MY_MONS_ARE_HURT, \n    HELP_RAN_OUT_OF_POTIONS, \n    HELP_WANT_TO_MAKE_MON_STRONGER, \n    HELP_FOE_MONS_TOO_STRONG, \n    HELP_WHAT_IS_STATUS_PROBLEM, \n    HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT,\n    HELP_END\n};\n\nstatic const u8 sHowTo_TrainerBattleSingle[] = {\n    HELP_USING_FIGHT, \n    HELP_USING_POKEMON2, \n    HELP_USING_SHIFT, \n    HELP_USING_SUMMARY2, \n    HELP_USING_BAG2, \n    HELP_USING_AN_ITEM, \n    HELP_USING_RUN, \n    HELP_END\n};\n\nstatic const u8 sTerms_TrainerBattleSingle[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_EXP, \n    HELP_TERM_MOVES, \n    HELP_TERM_ATTACK, \n    HELP_TERM_DEFENSE, \n    HELP_TERM_SPATK, \n    HELP_TERM_SPDEF, \n    HELP_TERM_SPEED, \n    HELP_TERM_TYPE, \n    HELP_TERM_ABILITY, \n    HELP_TERM_MOVE_TYPE, \n    HELP_TERM_PP, \n    HELP_TERM_POWER, \n    HELP_TERM_ACCURACY, \n    HELP_TERM_STATUS_PROBLEM, \n    HELP_TERM_FNT, \n    HELP_END\n};\n\nstatic const u8 sTypeMatchups_TrainerBattleSingle[] = {\n    HELP_TYPE_MATCHUPS, \n    HELP_END\n};\n\nstatic const u8 sWhatToDo_TrainerBattleDouble[] = {\n    HELP_WHATS_A_BATTLE, \n    HELP_WHAT_ARE_MOVES, \n    HELP_WHAT_MOVES_SHOULD_I_USE, \n    HELP_WHAT_IS_A_MONS_VITALITY, \n    HELP_MY_MONS_ARE_HURT, \n    HELP_RAN_OUT_OF_POTIONS, \n    HELP_WANT_TO_MAKE_MON_STRONGER, \n    HELP_FOE_MONS_TOO_STRONG, \n    HELP_WHAT_IS_STATUS_PROBLEM, \n    HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, \n    HELP_END\n};\n\nstatic const u8 sHowTo_TrainerBattleDouble[] = {\n    HELP_USING_FIGHT, \n    HELP_USING_POKEMON2, \n    HELP_USING_SHIFT, \n    HELP_USING_SUMMARY2, \n    HELP_USING_BAG2, \n    HELP_USING_AN_ITEM, \n    HELP_USING_RUN, \n    HELP_END\n};\n\nstatic const u8 sTerms_TrainerBattleDouble[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_EXP, \n    HELP_TERM_MOVES, \n    HELP_TERM_ATTACK, \n    HELP_TERM_DEFENSE, \n    HELP_TERM_SPATK, \n    HELP_TERM_SPDEF, \n    HELP_TERM_SPEED, \n    HELP_TERM_TYPE, \n    HELP_TERM_ABILITY, \n    HELP_TERM_MOVE_TYPE, \n    HELP_TERM_PP, \n    HELP_TERM_POWER, \n    HELP_TERM_ACCURACY, \n    HELP_TERM_STATUS_PROBLEM, \n    HELP_TERM_FNT, \n    HELP_END\n};\n\nstatic const u8 sTypeMatchups_TrainerBattleDouble[] = {\n    HELP_TYPE_MATCHUPS,\n    HELP_END\n};\n\nstatic const u8 sWhatToDo_SafariBattle[] = {\n    HELP_WHAT_DO_I_DO_IN_SAFARI, \n    HELP_WHAT_ARE_SAFARI_RULES, \n    HELP_WANT_TO_END_SAFARI, \n    HELP_END\n};\n\nstatic const u8 sHowTo_SafariBattle[] = {\n    HELP_USING_BALL, \n    HELP_USING_BAIT, \n    HELP_USING_ROCK, \n    HELP_USING_RUN, \n    HELP_END\n};\n\nstatic const u8 sTerms_SafariBattle[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_EXP, \n    HELP_TERM_MOVES, \n    HELP_TERM_ATTACK, \n    HELP_TERM_DEFENSE, \n    HELP_TERM_SPATK, \n    HELP_TERM_SPDEF, \n    HELP_TERM_SPEED, \n    HELP_TERM_TYPE, \n    HELP_TERM_ABILITY, \n    HELP_TERM_MOVE_TYPE, \n    HELP_TERM_PP, \n    HELP_TERM_POWER, \n    HELP_TERM_ACCURACY, \n    HELP_END\n};\n\nstatic const u8 sTypeMatchups_SafariBattle[] = {\n    HELP_TYPE_MATCHUPS,\n    HELP_END\n};\n\nstatic const u8 sHowTo_PC[] = {\n    HELP_USING_PC, \n    HELP_USING_BILLS_PC, \n    HELP_USING_WITHDRAW, \n    HELP_USING_DEPOSIT, \n    HELP_USING_MOVE, \n    HELP_MOVING_ITEMS, \n    HELP_USING_PLAYERS_PC, \n    HELP_USING_WITHDRAW_ITEM, \n    HELP_USING_DEPOSIT_ITEM,\n    HELP_USING_MAILBOX, \n    HELP_USING_PROF_OAKS_PC, \n    HELP_USING_HALL_OF_FAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_BillsPC[] = {\n    HELP_USING_PC, \n    HELP_USING_BILLS_PC, \n    HELP_USING_WITHDRAW, \n    HELP_USING_DEPOSIT, \n    HELP_USING_MOVE, \n    HELP_MOVING_ITEMS, \n    HELP_USING_PLAYERS_PC, \n    HELP_USING_WITHDRAW_ITEM, \n    HELP_USING_DEPOSIT_ITEM,\n    HELP_USING_MAILBOX, \n    HELP_USING_PROF_OAKS_PC, \n    HELP_USING_HALL_OF_FAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_PlayersPCItems[] = {\n    HELP_USING_PC, \n    HELP_USING_BILLS_PC, \n    HELP_USING_WITHDRAW, \n    HELP_USING_DEPOSIT, \n    HELP_USING_MOVE, \n    HELP_MOVING_ITEMS, \n    HELP_USING_PLAYERS_PC, \n    HELP_USING_WITHDRAW_ITEM, \n    HELP_USING_DEPOSIT_ITEM,\n    HELP_USING_MAILBOX, \n    HELP_USING_PROF_OAKS_PC, \n    HELP_USING_HALL_OF_FAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_PlayersPCMailbox[] = {\n    HELP_USING_PC, \n    HELP_USING_BILLS_PC, \n    HELP_USING_WITHDRAW, \n    HELP_USING_DEPOSIT, \n    HELP_USING_MOVE, \n    HELP_MOVING_ITEMS, \n    HELP_USING_PLAYERS_PC, \n    HELP_USING_WITHDRAW_ITEM, \n    HELP_USING_DEPOSIT_ITEM,\n    HELP_USING_MAILBOX, \n    HELP_USING_PROF_OAKS_PC, \n    HELP_USING_HALL_OF_FAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_PCMisc[] = {\n    HELP_USING_PC, \n    HELP_USING_BILLS_PC, \n    HELP_USING_WITHDRAW, \n    HELP_USING_DEPOSIT, \n    HELP_USING_MOVE, \n    HELP_MOVING_ITEMS, \n    HELP_USING_PLAYERS_PC, \n    HELP_USING_WITHDRAW_ITEM, \n    HELP_USING_DEPOSIT_ITEM,\n    HELP_USING_MAILBOX, \n    HELP_USING_PROF_OAKS_PC, \n    HELP_USING_HALL_OF_FAME, \n    HELP_END\n};\n\nstatic const u8 sHowTo_BedroomPC[] = {\n    HELP_USING_HOME_PC, \n    HELP_USING_ITEM_STORAGE, \n    HELP_USING_WITHDRAW_ITEM2, \n    HELP_USING_DEPOSIT_ITEM2, \n    HELP_USING_MAILBOX2, \n    HELP_END\n};\n\nstatic const u8 sHowTo_BedroomPCItems[] = {\n    HELP_USING_HOME_PC, \n    HELP_USING_ITEM_STORAGE, \n    HELP_USING_WITHDRAW_ITEM2, \n    HELP_USING_DEPOSIT_ITEM2, \n    HELP_USING_MAILBOX2, \n    HELP_END\n};\n\nstatic const u8 sHowTo_BedroomPCMailbox[] = {\n    HELP_USING_HOME_PC, \n    HELP_USING_ITEM_STORAGE, \n    HELP_USING_WITHDRAW_ITEM2, \n    HELP_USING_DEPOSIT_ITEM2, \n    HELP_USING_MAILBOX2, \n    HELP_END\n};\n\nstatic const u8 sTerms_Basic[] = {\n    HELP_TERM_LEVEL, \n    HELP_TERM_HP, \n    HELP_TERM_EXP, \n    HELP_TERM_MOVES, \n    HELP_TERM_TM, \n    HELP_TERM_HM_MOVE, \n    HELP_TERM_HM, \n    HELP_TERM_ATTACK, \n    HELP_TERM_DEFENSE, \n    HELP_TERM_SPATK, \n    HELP_TERM_SPDEF, \n    HELP_TERM_SPEED, \n    HELP_TERM_TYPE, \n    HELP_TERM_OT, \n    HELP_TERM_ITEM, \n    HELP_TERM_ABILITY, \n    HELP_TERM_MOVE_TYPE, \n    HELP_TERM_NATURE, \n    HELP_TERM_ID_NO, \n    HELP_TERM_PP, \n    HELP_TERM_POWER, \n    HELP_TERM_ACCURACY, \n    HELP_TERM_STATUS_PROBLEM, \n    HELP_TERM_FNT, \n    HELP_TERM_EVOLUTION, \n    HELP_TERM_ITEMS, \n    HELP_TERM_KEYITEMS, \n    HELP_TERM_POKEBALLS, \n    HELP_TERM_PLAY_TIME, \n    HELP_TERM_MONEY, \n    HELP_TERM_BADGES, \n    HELP_END\n};\n\nstatic const u8 sHowTo_KeySystem[] = {\n    HELP_USING_KEY_SYSTEM, \n    HELP_END\n};\n\nstatic const u8 sTerms_KeySystem[] = {\n    HELP_TERM_VERSION,\n    HELP_TERM_FR_EXCLUSIVES,\n    HELP_TERM_LG_EXCLUSIVES,\n    HELP_TERM_DIFFICULTY,\n    HELP_TERM_ADVANCED,\n    HELP_TERM_CANCEL,\n    HELP_END\n};\n\nstatic const u8 sHowTo_OptionsSubMenu[] = {\n    HELP_USING_OPTIONS_SUBMENU, \n    HELP_END\n};\n\nstatic const u8 sTerms_OptionsSubMenu[] = {\n    HELP_TERM_BATTLE_TRANSITIONS,\n    HELP_TERM_BATTLE_INTRO_ANIM,\n    HELP_TERM_MOVE_ANIMATIONS,\n    HELP_TERM_HP_BAR_ANIM_SPEED,\n    HELP_TERM_EXP_BAR_ANIM_SPEED,\n    HELP_TERM_BACK,\n    HELP_END\n};\n\nstatic const u8 sHowTo_KeySystemSubMenu[] = {\n    HELP_USING_KEY_SYSTEM_SUBMENU, \n    HELP_END\n};\n\nstatic const u8 sTerms_KeySystemSubMenu[] = {\n    HELP_TERM_NUZLOCKE,\n    HELP_TERM_NUZLOCKE_CATCHING,\n    HELP_TERM_NUZLOCKE_LOSING,\n    HELP_TERM_IV_CALC,\n    HELP_TERM_EV_CALC,\n    HELP_TERM_NO_PMC,\n    HELP_TERM_EXP_MOD,\n    HELP_TERM_ADVANCED_KEYS_BACK,\n    HELP_END\n};\n\n// Cant get this to match as a 2D array but it probably should be one, [HELPCONTEXT_COUNT][TOPIC_COUNT - 1] (Excludes TOPIC_EXIT)\nstatic const u8 *const sHelpSystemSubmenuItemLists[HELPCONTEXT_COUNT * (TOPIC_COUNT - 1)] = {\n    NULL,                          NULL,                       NULL,                       NULL,                    NULL, // HELPCONTEXT_NONE\n    NULL,                          NULL,                       NULL,                       sAboutGame_TitleScreen,  NULL, // HELPCONTEXT_TITLE_SCREEN\n    NULL,                          NULL,                       NULL,                       sAboutGame_NewGame,      NULL, // HELPCONTEXT_NEW_GAME\n    NULL,                          sHowTo_NamingScreen,        NULL,                       sAboutGame_NamingScreen, NULL, // HELPCONTEXT_NAMING_SCREEN\n    NULL,                          sHowTo_Pokedex,             NULL,                       NULL,                    NULL, // HELPCONTEXT_POKEDEX\n    NULL,                          sHowTo_PartyMenu,           sTerms_PartyMenu,           NULL,                    NULL, // HELPCONTEXT_PARTY_MENU\n    NULL,                          sHowTo_PokemonInfo,         sTerms_PokemonInfo,         NULL,                    NULL, // HELPCONTEXT_POKEMON_INFO\n    NULL,                          NULL,                       sTerms_PokemonSkills,       NULL,                    NULL, // HELPCONTEXT_POKEMON_SKILLS\n    NULL,                          NULL,                       sTerms_PokemonMoves,        NULL,                    NULL, // HELPCONTEXT_POKEMON_MOVES\n    NULL,                          sHowTo_Bag,                 sTerms_Bag,                 NULL,                    NULL, // HELPCONTEXT_BAG\n    NULL,                          sHowTo_TrainerCardFront,    sTerms_TrainerCardFront,    NULL,                    NULL, // HELPCONTEXT_TRAINER_CARD_FRONT\n    NULL,                          sHowTo_TrainerCardBack,     NULL,                       NULL,                    NULL, // HELPCONTEXT_TRAINER_CARD_BACK\n    NULL,                          sHowTo_Save,                sTerms_Save,                NULL,                    NULL, // HELPCONTEXT_SAVE\n    NULL,                          sHowTo_Options,             sTerms_Options,             NULL,                    NULL, // HELPCONTEXT_OPTIONS\n    sWhatToDo_PlayersHouse,        NULL,                       NULL,                       sAboutGame_PlayersHouse, NULL, // HELPCONTEXT_PLAYERS_HOUSE\n    sWhatToDo_OaksLab,             sHowTo_OaksLab,             sTerms_OaksLab,             NULL,                    NULL, // HELPCONTEXT_OAKS_LAB\n    sWhatToDo_PokeCenter,          sHowTo_PokeCenter,          sTerms_PokeCenter,          sAboutGame_PokeCenter,   NULL, // HELPCONTEXT_POKECENTER\n    sWhatToDo_Mart,                sHowTo_Mart,                sTerms_Mart,                NULL,                    NULL, // HELPCONTEXT_MART\n    sWhatToDo_Gym,                 sHowTo_Gym,                 sTerms_Gym,                 NULL,                    sTypeMatchups_Gym, // HELPCONTEXT_GYM\n    sWhatToDo_Indoors,             sHowTo_Indoors,             sTerms_Indoors,             NULL,                    NULL, // HELPCONTEXT_INDOORS\n    sWhatToDo_Overworld,           sHowTo_Overworld,           sTerms_Overworld,           NULL,                    NULL, // HELPCONTEXT_OVERWORLD\n    sWhatToDo_Dungeon,             sHowTo_Dungeon,             sTerms_Dungeon,             NULL,                    NULL, // HELPCONTEXT_DUNGEON\n    sWhatToDo_Surfing,             sHowTo_Surfing,             sTerms_Surfing,             NULL,                    NULL, // HELPCONTEXT_SURFING\n    sWhatToDo_WildBattle,          sHowTo_WildBattle,          sTerms_WildBattle,          NULL,                    sTypeMatchups_WildBattle, // HELPCONTEXT_WILD_BATTLE\n    sWhatToDo_TrainerBattleSingle, sHowTo_TrainerBattleSingle, sTerms_TrainerBattleSingle, NULL,                    sTypeMatchups_TrainerBattleSingle, // HELPCONTEXT_TRAINER_BATTLE_SINGLE\n    sWhatToDo_TrainerBattleDouble, sHowTo_TrainerBattleDouble, sTerms_TrainerBattleDouble, NULL,                    sTypeMatchups_TrainerBattleDouble, // HELPCONTEXT_TRAINER_BATTLE_DOUBLE\n    sWhatToDo_SafariBattle,        sHowTo_SafariBattle,        sTerms_SafariBattle,        NULL,                    sTypeMatchups_SafariBattle, // HELPCONTEXT_SAFARI_BATTLE\n    NULL,                          sHowTo_PC,                  NULL,                       NULL,                    NULL, // HELPCONTEXT_PC\n    NULL,                          sHowTo_BillsPC,             NULL,                       NULL,                    NULL, // HELPCONTEXT_BILLS_PC\n    NULL,                          sHowTo_PlayersPCItems,      NULL,                       NULL,                    NULL, // HELPCONTEXT_PLAYERS_PC_ITEMS\n    NULL,                          sHowTo_PlayersPCMailbox,    NULL,                       NULL,                    NULL, // HELPCONTEXT_PLAYERS_PC_MAILBOX\n    NULL,                          sHowTo_PCMisc,              NULL,                       NULL,                    NULL, // HELPCONTEXT_PC_MISC\n    NULL,                          sHowTo_BedroomPC,           NULL,                       NULL,                    NULL, // HELPCONTEXT_BEDROOM_PC\n    NULL,                          sHowTo_BedroomPCItems,      NULL,                       NULL,                    NULL, // HELPCONTEXT_BEDROOM_PC_ITEMS\n    NULL,                          sHowTo_BedroomPCMailbox,    NULL,                       NULL,                    NULL, // HELPCONTEXT_BEDROOM_PC_MAILBOX\n    NULL,                          sHowTo_KeySystem,           sTerms_KeySystem,           NULL,                    NULL, // HELPCONTEXT_KEY_SYSTEM\n    NULL,                          sHowTo_OptionsSubMenu,      sTerms_OptionsSubMenu,      NULL,                    NULL, // HELPCONTEXT_OPTIONS_SUBMENU\n    NULL,                          sHowTo_KeySystemSubMenu,    sTerms_KeySystemSubMenu,    NULL,                    NULL, // HELPCONTEXT_KEY_SYSTEM_SUBMENU\n};\n\nstatic const u16 sUnused[] = INCBIN_U16(\"graphics/help_system/unused.bin\");\n\nstatic const u8 sHelpSystemContextTopicOrder[TOPIC_COUNT] = {\n    TOPIC_ABOUT_GAME, \n    TOPIC_WHAT_TO_DO, \n    TOPIC_HOW_TO_DO, \n    TOPIC_TERMS, \n    TOPIC_TYPE_MATCHUP, \n    TOPIC_EXIT\n};\n\n#define CONTEXT_TOPIC_FLAGS(whatToDo, howToDo, terms, aboutGame, typeMatchup, exit)     \\\n    {                                                                                   \\\n        [TOPIC_WHAT_TO_DO]   = whatToDo,                                                \\\n        [TOPIC_HOW_TO_DO]    = howToDo,                                                 \\\n        [TOPIC_TERMS]        = terms,                                                   \\\n        [TOPIC_ABOUT_GAME]   = aboutGame,                                               \\\n        [TOPIC_TYPE_MATCHUP] = typeMatchup,                                             \\\n        [TOPIC_EXIT]         = exit                                                     \\\n    }                                                                                   \\\n\nstatic const bool8 sHelpSystemContextTopicFlags[HELPCONTEXT_COUNT + 1][TOPIC_COUNT] = {\n    [HELPCONTEXT_NONE]                  = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_TITLE_SCREEN]          = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE,  TRUE, FALSE,  TRUE),\n    [HELPCONTEXT_NEW_GAME]              = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE,  TRUE, FALSE,  TRUE),\n    [HELPCONTEXT_NAMING_SCREEN]         = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE, FALSE,  TRUE, FALSE,  TRUE),\n    [HELPCONTEXT_POKEDEX]               = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE, FALSE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_PARTY_MENU]            = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_POKEMON_INFO]          = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_POKEMON_SKILLS]        = CONTEXT_TOPIC_FLAGS(FALSE, FALSE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_POKEMON_MOVES]         = CONTEXT_TOPIC_FLAGS(FALSE, FALSE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_BAG]                   = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_TRAINER_CARD_FRONT]    = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_TRAINER_CARD_BACK]     = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE, FALSE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_SAVE]                  = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_OPTIONS]               = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_PLAYERS_HOUSE]         = CONTEXT_TOPIC_FLAGS( TRUE, FALSE, FALSE,  TRUE, FALSE,  TRUE),\n    [HELPCONTEXT_OAKS_LAB]              = CONTEXT_TOPIC_FLAGS( TRUE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_POKECENTER]            = CONTEXT_TOPIC_FLAGS( TRUE,  TRUE,  TRUE,  TRUE, FALSE,  TRUE),\n    [HELPCONTEXT_MART]                  = CONTEXT_TOPIC_FLAGS( TRUE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_GYM]                   = CONTEXT_TOPIC_FLAGS( TRUE,  TRUE,  TRUE, FALSE,  TRUE,  TRUE),\n    [HELPCONTEXT_INDOORS]               = CONTEXT_TOPIC_FLAGS( TRUE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_OVERWORLD]             = CONTEXT_TOPIC_FLAGS( TRUE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_DUNGEON]               = CONTEXT_TOPIC_FLAGS( TRUE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_SURFING]               = CONTEXT_TOPIC_FLAGS( TRUE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_WILD_BATTLE]           = CONTEXT_TOPIC_FLAGS( TRUE,  TRUE,  TRUE, FALSE,  TRUE,  TRUE),\n    [HELPCONTEXT_TRAINER_BATTLE_SINGLE] = CONTEXT_TOPIC_FLAGS( TRUE,  TRUE,  TRUE, FALSE,  TRUE,  TRUE),\n    [HELPCONTEXT_TRAINER_BATTLE_DOUBLE] = CONTEXT_TOPIC_FLAGS( TRUE,  TRUE,  TRUE, FALSE,  TRUE,  TRUE),\n    [HELPCONTEXT_SAFARI_BATTLE]         = CONTEXT_TOPIC_FLAGS( TRUE,  TRUE,  TRUE, FALSE,  TRUE,  TRUE),\n    [HELPCONTEXT_PC]                    = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE, FALSE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_BILLS_PC]              = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE, FALSE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_PLAYERS_PC_ITEMS]      = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE, FALSE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_PLAYERS_PC_MAILBOX]    = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE, FALSE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_PC_MISC]               = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE, FALSE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_BEDROOM_PC]            = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE, FALSE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_BEDROOM_PC_ITEMS]      = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE, FALSE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_BEDROOM_PC_MAILBOX]    = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE, FALSE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_KEY_SYSTEM]            = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_OPTIONS_SUBMENU]       = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_KEY_SYSTEM_SUBMENU]       = CONTEXT_TOPIC_FLAGS(FALSE,  TRUE,  TRUE, FALSE, FALSE,  TRUE),\n    [HELPCONTEXT_COUNT]                 = {}\n};\n\nstatic const u16 sMartMaps[] = {\n    MAP_VIRIDIAN_CITY_MART,\n    MAP_PEWTER_CITY_MART,\n    MAP_CERULEAN_CITY_MART,\n    MAP_LAVENDER_TOWN_MART,\n    MAP_VERMILION_CITY_MART,\n    MAP_CELADON_CITY_DEPARTMENT_STORE_1F,\n    MAP_CELADON_CITY_DEPARTMENT_STORE_2F,\n    MAP_CELADON_CITY_DEPARTMENT_STORE_3F,\n    MAP_CELADON_CITY_DEPARTMENT_STORE_4F,\n    MAP_CELADON_CITY_DEPARTMENT_STORE_5F,\n    MAP_CELADON_CITY_DEPARTMENT_STORE_ROOF,\n    MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR,\n    MAP_FUCHSIA_CITY_MART,\n    MAP_CINNABAR_ISLAND_MART,\n    MAP_SAFFRON_CITY_MART,\n    MAP_THREE_ISLAND_MART,\n    MAP_FOUR_ISLAND_MART,\n    MAP_SEVEN_ISLAND_MART,\n    MAP_SIX_ISLAND_MART,\n    MAP_UNDEFINED\n};\n\nstatic const u16 sGymMaps[] = {\n    MAP_PEWTER_CITY_GYM,\n    MAP_CERULEAN_CITY_GYM,\n    MAP_VERMILION_CITY_GYM,\n    MAP_CELADON_CITY_GYM,\n    MAP_FUCHSIA_CITY_GYM,\n    MAP_SAFFRON_CITY_GYM,\n    MAP_CINNABAR_ISLAND_GYM,\n    MAP_VIRIDIAN_CITY_GYM,\n    MAP_UNDEFINED\n};\n\nstatic const u8 sDungeonMaps[][3] = {\n    { MAP_GROUP(VIRIDIAN_FOREST), MAP_NUM(VIRIDIAN_FOREST), 1 },\n    { MAP_GROUP(MT_MOON_1F), MAP_NUM(MT_MOON_1F), 3 },\n    { MAP_GROUP(ROCK_TUNNEL_1F), MAP_NUM(ROCK_TUNNEL_1F), 2 },\n    { MAP_GROUP(DIGLETTS_CAVE_NORTH_ENTRANCE), MAP_NUM(DIGLETTS_CAVE_NORTH_ENTRANCE), 3 },\n    { MAP_GROUP(SEAFOAM_ISLANDS_1F), MAP_NUM(SEAFOAM_ISLANDS_1F), 5 },\n    { MAP_GROUP(VICTORY_ROAD_1F), MAP_NUM(VICTORY_ROAD_1F), 3 },\n    { MAP_GROUP(CERULEAN_CAVE_1F), MAP_NUM(CERULEAN_CAVE_1F), 3 },\n    { MAP_GROUP(MT_EMBER_RUBY_PATH_B4F), MAP_NUM(MT_EMBER_RUBY_PATH_B4F), 1 },\n    { MAP_GROUP(MT_EMBER_SUMMIT_PATH_1F), MAP_NUM(MT_EMBER_SUMMIT_PATH_1F), 3 },\n    { MAP_GROUP(MT_EMBER_RUBY_PATH_B5F), MAP_NUM(MT_EMBER_RUBY_PATH_B5F), 7 },\n    { MAP_GROUP(THREE_ISLAND_BERRY_FOREST), MAP_NUM(THREE_ISLAND_BERRY_FOREST), 1 },\n    { MAP_GROUP(SIX_ISLAND_PATTERN_BUSH), MAP_NUM(SIX_ISLAND_PATTERN_BUSH), 1 },\n    { MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ENTRANCE), MAP_NUM(FIVE_ISLAND_LOST_CAVE_ENTRANCE), 15 },\n    { MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), 4 },\n    { MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), MAP_NUM(SIX_ISLAND_ALTERING_CAVE), 1 },\n    { MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), 7 }\n};\n\nvoid SetHelpContextDontCheckBattle(u8 contextId)\n{\n    sHelpSystemContextId = contextId;\n}\n\nvoid SetHelpContext(u8 contextId)\n{\n    switch (sHelpSystemContextId)\n    {\n    case HELPCONTEXT_WILD_BATTLE:\n    case HELPCONTEXT_TRAINER_BATTLE_SINGLE:\n    case HELPCONTEXT_TRAINER_BATTLE_DOUBLE:\n    case HELPCONTEXT_SAFARI_BATTLE:\n        if (contextId == HELPCONTEXT_BAG \n         || contextId == HELPCONTEXT_PARTY_MENU \n         || contextId == HELPCONTEXT_POKEMON_INFO \n         || contextId == HELPCONTEXT_POKEMON_SKILLS \n         || contextId == HELPCONTEXT_POKEMON_MOVES)\n            break;\n        // fallthrough\n    default:\n        sHelpSystemContextId = contextId;\n        break;\n    }\n}\n\nvoid Script_SetHelpContext(void)\n{\n    sHelpSystemContextId = gSpecialVar_0x8004;\n}\n\nvoid BackupHelpContext(void)\n{\n    gHelpContextIdBackup = sHelpSystemContextId;\n}\n\nvoid RestoreHelpContext(void)\n{\n    sHelpSystemContextId = gHelpContextIdBackup;\n}\n\nstatic bool32 IsInMartMap(void)\n{\n    return IsCurrentMapInArray(sMartMaps);\n}\n\nstatic bool32 IsInGymMap(void)\n{\n    return IsCurrentMapInArray(sGymMaps);\n}\n\nstatic bool32 IsCurrentMapInArray(const u16 * mapIdxs)\n{\n    u16 mapIdx = (gSaveBlock1Ptr->location.mapGroup << 8) + gSaveBlock1Ptr->location.mapNum;\n    s32 i;\n\n    for (i = 0; mapIdxs[i] != MAP_UNDEFINED; i++)\n    {\n        if (mapIdxs[i] == mapIdx)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 IsInDungeonMap(void)\n{\n    u8 i, j;\n\n    for (i = 0; i < NELEMS(sDungeonMaps); i++)\n    {\n        for (j = 0; j < sDungeonMaps[i][2]; j++)\n        {\n            if (\n                   sDungeonMaps[i][0] == gSaveBlock1Ptr->location.mapGroup\n                && sDungeonMaps[i][1] + j == gSaveBlock1Ptr->location.mapNum\n                && (i != 15 /* TANOBY */ || FlagGet(FLAG_SYS_UNLOCKED_TANOBY_RUINS) == TRUE)\n            )\n                return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\n#define IN_PLAYERS_HOUSE \\\n    ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) \\\n  && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F))     \\\n || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F)  \\\n  && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F)))    \\\n\n #define IN_OAKS_LAB \\\n    (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PROFESSOR_OAKS_LAB) \\\n  && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PROFESSOR_OAKS_LAB))    \\\n\nvoid SetHelpContextForMap(void)\n{\n    HelpSystem_EnableToggleWithRButton();\n    if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))\n        SetHelpContext(HELPCONTEXT_SURFING);\n    else if (IsInDungeonMap())\n        SetHelpContext(HELPCONTEXT_DUNGEON);\n    else if (IsMapTypeIndoors(gMapHeader.mapType))\n    {\n        if (IN_PLAYERS_HOUSE)\n            SetHelpContext(HELPCONTEXT_PLAYERS_HOUSE);\n        else if (IN_OAKS_LAB)\n            SetHelpContext(HELPCONTEXT_OAKS_LAB);\n        else if (IsCurMapPokeCenter() == TRUE)\n            SetHelpContext(HELPCONTEXT_POKECENTER);\n        else if (IsInMartMap() == TRUE)\n            SetHelpContext(HELPCONTEXT_MART);\n        else if (IsInGymMap() == TRUE)\n            SetHelpContext(HELPCONTEXT_GYM);\n        else\n            SetHelpContext(HELPCONTEXT_INDOORS);\n    }\n    else\n        SetHelpContext(HELPCONTEXT_OVERWORLD);\n}\n\nbool8 HelpSystem_UpdateHasntSeenIntro(void)\n{\n    if (sSeenHelpSystemIntro == TRUE)\n        return FALSE;\n\n    if (gSaveFileStatus != SAVE_STATUS_EMPTY && gSaveFileStatus != SAVE_STATUS_INVALID && FlagGet(FLAG_SYS_SAW_HELP_SYSTEM_INTRO))\n        return FALSE;\n\n    FlagSet(FLAG_SYS_SAW_HELP_SYSTEM_INTRO);\n    sSeenHelpSystemIntro = TRUE;\n    return TRUE;\n}\n\nbool8 HelpSystem_IsSinglePlayer(void)\n{\n    if (gReceivedRemoteLinkPlayers == TRUE)\n        return FALSE;\n    return TRUE;\n}\n\nvoid HelpSystem_Disable(void)\n{\n    gHelpSystemEnabled = FALSE;\n}\n\nvoid HelpSystem_Enable(void)\n{\n    if (!QL_IS_PLAYBACK_STATE)\n    {\n        gHelpSystemEnabled = TRUE;\n        HelpSystem_EnableToggleWithRButton();\n    }\n}\n\nvoid HelpSystem_DisableToggleWithRButton(void)\n{\n    gHelpSystemToggleWithRButtonDisabled = FALSE;\n}\n\nvoid HelpSystem_EnableToggleWithRButton(void)\n{\n    gHelpSystemToggleWithRButtonDisabled = FALSE;\n}\n\nstatic void ResetHelpSystemListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    helpListMenu->sub.items = listMenuItemsBuffer;\n    helpListMenu->sub.totalItems = 1;\n    helpListMenu->sub.maxShowed = 1;\n    helpListMenu->sub.left = 1;\n    helpListMenu->sub.top = 4;\n}\n\nstatic void BuildAndPrintMainTopicsListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer);\n    BuildMainTopicsListAndMoveToH00(helpListMenu, listMenuItemsBuffer);\n    PrintTextOnPanel2Row52RightAlign(gText_HelpSystemControls_PickOkEnd);\n    HelpSystem_InitListMenuController(helpListMenu, 0, gHelpSystemState.scrollMain);\n    PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer);\n    HS_ShowOrHideMainWindowText(1);\n    HS_ShowOrHideControlsGuideInTopRight(1);\n}\n\nstatic void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    u8 i;\n    u8 totalItems = 0;\n    for (i = 0; i < TOPIC_COUNT; i++)\n    {\n        if (sHelpSystemContextTopicFlags[sHelpSystemContextId][sHelpSystemContextTopicOrder[i]] == TRUE)\n        {\n            listMenuItemsBuffer[totalItems].label = sHelpSystemTopicPtrs[sHelpSystemContextTopicOrder[i]];\n            listMenuItemsBuffer[totalItems].index = sHelpSystemContextTopicOrder[i];\n            totalItems++;\n        }\n    }\n    listMenuItemsBuffer[totalItems - 1].index = -2;\n    helpListMenu->sub.totalItems = totalItems;\n    helpListMenu->sub.maxShowed = totalItems;\n    helpListMenu->sub.left = 0;\n}\n\nstatic void BuildAndPrintSubmenuList(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    HS_SetMainWindowBgBrightness(0);\n    HS_ShowOrHideHeaderLine_Darker_FooterStyle(0);\n    HS_ShowOrHideHeaderAndFooterLines_Lighter(1);\n    ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer);\n    SetHelpSystemSubmenuItems(helpListMenu, listMenuItemsBuffer);\n    PrintTextOnPanel2Row52RightAlign(gText_HelpSystemControls_PickOkCancel);\n    HelpSystem_InitListMenuController(helpListMenu, helpListMenu->itemsAbove, helpListMenu->cursorPos);\n    HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[gHelpSystemState.topic], 0, 0);\n    HS_ShowOrHideMainWindowText(1);\n    HS_ShowOrHideControlsGuideInTopRight(1);\n}\n\nstatic void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    u8 totalItems = 0;\n    const u8 * submenuItems = sHelpSystemSubmenuItemLists[sHelpSystemContextId * 5 + gHelpSystemState.topic]; // accessing as 2D array\n    u32 i;\n    for (i = 0; submenuItems[i] != HELP_END; i++)\n    {\n        if (IsHelpSystemSubmenuEnabled(submenuItems[i]) == TRUE)\n        {\n            if (gHelpSystemState.topic == TOPIC_WHAT_TO_DO)\n                listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedQuestionTextPtrs[submenuItems[i]];\n            else if (gHelpSystemState.topic == TOPIC_HOW_TO_DO)\n                listMenuItemsBuffer[totalItems].label = sHelpSystemMenuTopicTextPtrs[submenuItems[i]];\n            else if (gHelpSystemState.topic == TOPIC_TERMS)\n                listMenuItemsBuffer[totalItems].label = sHelpSystemTermTextPtrs[submenuItems[i]];\n            else if (gHelpSystemState.topic == TOPIC_ABOUT_GAME)\n                listMenuItemsBuffer[totalItems].label = sHelpSystemGeneralTopicTextPtrs[submenuItems[i]];\n            else // TOPIC_TYPE_MATCHUP\n                listMenuItemsBuffer[totalItems].label = sHelpSystemTypeMatchupTextPtrs[submenuItems[i]];\n            listMenuItemsBuffer[totalItems].index = submenuItems[i];\n            totalItems++;\n        }\n    }\n    if (HelpSystem_ShouldShowBasicTerms() == TRUE)\n    {\n        for (i = 0, submenuItems = sTerms_Basic; submenuItems[i] != HELP_END; i++)\n        {\n            listMenuItemsBuffer[totalItems].label = sHelpSystemTermTextPtrs[submenuItems[i]];\n            listMenuItemsBuffer[totalItems].index = submenuItems[i];\n            totalItems++;\n        }\n    }\n    listMenuItemsBuffer[totalItems].label = Help_Text_Cancel;\n    listMenuItemsBuffer[totalItems].index = -2;\n    totalItems++;\n    helpListMenu->sub.totalItems = totalItems;\n    helpListMenu->sub.maxShowed = 7;\n    helpListMenu->sub.left = 0;\n    helpListMenu->sub.top = 21;\n}\n\nstatic bool8 HelpSystem_ShouldShowBasicTerms(void)\n{\n    if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && gHelpSystemState.topic == TOPIC_TERMS)\n        return TRUE;\n    return FALSE;\n}\n\nstatic bool8 IsHelpSystemSubmenuEnabled(u8 id)\n{\n    u8 i = 0;\n\n    if (gHelpSystemState.topic == TOPIC_WHAT_TO_DO)\n    {\n        switch (id)\n        {\n        case HELP_PLAYING_FOR_FIRST_TIME:\n        case HELP_WHAT_SHOULD_I_BE_DOING:\n        case HELP_CANT_GET_OUT_OF_ROOM:\n        case HELP_TALKED_TO_EVERYONE_NOW_WHAT:\n        case HELP_OUT_OF_THINGS_TO_DO:\n        case HELP_NOTHING_I_WANT_TO_KNOW:\n        case HELP_WHATS_A_MON:\n        case HELP_WHAT_DO_I_DO_IN_SAFARI:\n        case HELP_WHAT_ARE_SAFARI_RULES:\n        case HELP_WANT_TO_END_SAFARI:\n            return TRUE;\n        case HELP_CANT_FIND_PERSON_I_WANT:\n            return FlagGet(FLAG_VISITED_OAKS_LAB);\n        case HELP_SOMEONE_BLOCKING_MY_WAY:\n        case HELP_WHAT_ARE_MY_ADVENTURE_BASICS:\n        case HELP_HOW_DO_I_PREPARE_FOR_BATTLE:\n        case HELP_WHAT_IS_STATUS_PROBLEM:\n        case HELP_RAN_OUT_OF_POTIONS:\n        case HELP_WHATS_POKEMON_CENTER:\n        case HELP_WHATS_POKEMON_MART:\n            return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_CITY);\n        case HELP_I_CANT_GO_ON:\n            return FlagGet(FLAG_WORLD_MAP_VERMILION_CITY);\n        case HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT:\n        case HELP_WHATS_A_TRAINER:\n            return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST);\n        case HELP_WHAT_HAPPENED_TO_ITEM_I_GOT:\n        case HELP_WHEN_CAN_I_USE_ITEM:\n        case HELP_HOW_DO_I_PROGRESS:\n        case HELP_WHATS_A_BATTLE:\n        case HELP_WHAT_IS_A_MONS_VITALITY:\n        case HELP_MY_MONS_ARE_HURT:\n        case HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT:\n        case HELP_WHERE_DO_MONS_APPEAR:\n        case HELP_WHAT_MOVES_SHOULD_I_USE:\n        case HELP_WANT_TO_MAKE_MON_STRONGER:\n        case HELP_WANT_TO_END_GAME:\n            return FlagGet(FLAG_SYS_POKEMON_GET);\n        case HELP_CANT_CATCH_MONS:\n        case HELP_CAN_I_BUY_POKEBALLS:\n            return FlagGet(FLAG_SYS_POKEDEX_GET);\n        case HELP_HOW_ARE_CAVES_DIFFERENT:\n        case HELP_WHAT_DO_I_DO_IN_CAVE:\n        case HELP_HOW_DO_I_WIN_AGAINST_TRAINER:\n        case HELP_FOE_MONS_TOO_STRONG:\n        case HELP_WHAT_ARE_MOVES:\n        case HELP_WANT_TO_ADD_MORE_MOVES:\n            return FlagGet(FLAG_BADGE01_GET);\n        case HELP_WHAT_ARE_HIDDEN_MOVES:\n        case HELP_WHAT_DOES_HIDDEN_MOVE_DO:\n            return HasGottenAtLeastOneHM();\n        case HELP_WHAT_IS_THAT_PERSON_LIKE:\n            return FlagGet(FLAG_GOT_FAME_CHECKER);\n        case HELP_WHAT_IS_A_GYM:\n            return FlagGet(FLAG_WORLD_MAP_PEWTER_CITY);\n        }\n        return FALSE;\n    }\n    if (gHelpSystemState.topic == TOPIC_HOW_TO_DO)\n    {\n        switch (id)\n        {\n        case HELP_USING_BAG:\n        case HELP_USING_PLAYER:\n        case HELP_USING_SAVE:\n        case HELP_USING_OPTION:\n        case HELP_ENTERING_NAME:\n        case HELP_USING_PC:\n        case HELP_USING_BILLS_PC:\n        case HELP_USING_WITHDRAW:\n        case HELP_USING_DEPOSIT:\n        case HELP_USING_MOVE:\n        case HELP_MOVING_ITEMS:\n        case HELP_USING_PLAYERS_PC:\n        case HELP_USING_WITHDRAW_ITEM:\n        case HELP_USING_DEPOSIT_ITEM:\n        case HELP_USING_MAILBOX:\n        case HELP_OPENING_MENU:\n        case HELP_USING_BAG2:\n        case HELP_USING_HOME_PC:\n        case HELP_USING_ITEM_STORAGE:\n        case HELP_USING_WITHDRAW_ITEM2:\n        case HELP_USING_DEPOSIT_ITEM2:\n        case HELP_USING_MAILBOX2:\n        case HELP_USING_BALL:\n        case HELP_USING_BAIT:\n        case HELP_USING_ROCK:\n        case HELP_USING_KEY_SYSTEM:\n        case HELP_SORTING_BAG:\n        case HELP_USING_OPTIONS_SUBMENU:\n        case HELP_USING_KEY_SYSTEM_SUBMENU:\n            return TRUE;\n        case HELP_USING_POKEDEX:\n        case HELP_USING_PROF_OAKS_PC:\n        case HELP_READING_POKEDEX:\n            return FlagGet(FLAG_SYS_POKEDEX_GET);\n        case HELP_USING_TOWN_MAP:\n            return CheckBagHasItem(ITEM_TOWN_MAP, 1);\n        case HELP_USING_POKEMON:\n        case HELP_USING_SUMMARY:\n        case HELP_USING_ITEM:\n        case HELP_USING_AN_ITEM:\n        case HELP_USING_KEYITEM:\n        case HELP_USING_POKEBALL:\n        case HELP_USING_POTION:\n        case HELP_USING_FIGHT:\n        case HELP_USING_POKEMON2:\n        case HELP_USING_SUMMARY2:\n        case HELP_USING_RUN:\n        case HELP_REGISTER_KEY_ITEM:\n            return FlagGet(FLAG_SYS_POKEMON_GET);\n        case HELP_USING_SWITCH:\n        case HELP_USING_SHIFT:\n            // Only show if player has caught mon after starter\n            if (GetKantoPokedexCount(1) > 1)\n                return TRUE;\n            return FALSE;\n        case HELP_USING_TM:\n            return FlagGet(FLAG_BADGE01_GET);\n        case HELP_USING_HM:\n        case HELP_USING_MOVE_OUTSIDE_OF_BATTLE:\n            return HasGottenAtLeastOneHM();\n        case HELP_RIDING_BICYCLE:\n            return FlagGet(FLAG_GOT_BICYCLE);\n        case HELP_USING_HALL_OF_FAME:\n            return FlagGet(FLAG_SYS_GAME_CLEAR);\n        }\n        return FALSE;\n    }\n    if (gHelpSystemState.topic == TOPIC_TERMS)\n    {\n        if (HelpSystem_ShouldShowBasicTerms() == TRUE)\n        {\n            // After defeating Brock, all basic terms are added\n            // This checks to make sure they arent added twice\n            for (i = 0; sTerms_Basic[i] != HELP_END; i++)\n            {\n                if (sTerms_Basic[i] == id)\n                    return FALSE;\n            }\n        }\n        switch (id)\n        {\n        case HELP_TERM_MONEY:\n        case HELP_TERM_ID_NO:\n        case HELP_TERM_ITEMS:\n        case HELP_TERM_KEYITEMS:\n        case HELP_TERM_POKEBALLS:\n        case HELP_TERM_POKEDEX:\n        case HELP_TERM_PLAY_TIME:\n        case HELP_TERM_BADGES:\n        case HELP_TERM_TEXT_SPEED:\n        case HELP_TERM_BATTLE_SCENE:\n        case HELP_TERM_BATTLE_STYLE:\n        case HELP_TERM_SOUND:\n        case HELP_TERM_BUTTON_MODE:\n        case HELP_TERM_FRAME:\n        case HELP_TERM_CANCEL:\n        case HELP_TERM_TM:\n        case HELP_TERM_EVOLUTION:\n            return TRUE;\n        case HELP_TERM_HP:\n        case HELP_TERM_EXP:\n        case HELP_TERM_ATTACK:\n        case HELP_TERM_DEFENSE:\n        case HELP_TERM_SPATK:\n        case HELP_TERM_SPDEF:\n        case HELP_TERM_SPEED:\n        case HELP_TERM_LEVEL:\n        case HELP_TERM_TYPE:\n        case HELP_TERM_OT:\n        case HELP_TERM_ITEM:\n        case HELP_TERM_ABILITY:\n        case HELP_TERM_NATURE:\n        case HELP_TERM_POWER:\n        case HELP_TERM_ACCURACY:\n        case HELP_TERM_FNT:\n            return FlagGet(FLAG_SYS_POKEMON_GET);\n        case HELP_TERM_HM:\n        case HELP_TERM_HM_MOVE:\n            return HasGottenAtLeastOneHM();\n        case HELP_TERM_MOVES:\n        case HELP_TERM_MOVE_TYPE:\n        case HELP_TERM_PP:\n        case HELP_TERM_STATUS_PROBLEM:\n            return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST);\n        }\n        return TRUE;\n    }\n    if (gHelpSystemState.topic == TOPIC_ABOUT_GAME)\n    {\n        switch (id)\n        {\n        case HELP_GAME_FUNDAMENTALS_2:\n            return FlagGet(FLAG_BADGE01_GET);\n        case HELP_GAME_FUNDAMENTALS_3:\n            return FlagGet(FLAG_BADGE02_GET);\n        }\n        return TRUE;\n    }\n    if (gHelpSystemState.topic == TOPIC_TYPE_MATCHUP)\n    {\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 HasGottenAtLeastOneHM(void)\n{\n    if (FlagGet(FLAG_GOT_HM01) == TRUE)\n        return TRUE;\n    if (FlagGet(FLAG_GOT_HM02) == TRUE)\n        return TRUE;\n    if (FlagGet(FLAG_GOT_HM03) == TRUE)\n        return TRUE;\n    if (FlagGet(FLAG_GOT_HM04) == TRUE)\n        return TRUE;\n    if (FlagGet(FLAG_GOT_HM05) == TRUE)\n        return TRUE;\n    if (FlagGet(FLAG_GOT_HM06) == TRUE)\n        return TRUE;\n    if (FlagGet(FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_HM07) == TRUE)\n        return TRUE;\n    if (FlagGet(FLAG_SYS_CAN_LINK_WITH_RS) == TRUE)\n        return FALSE;\n    return FALSE;\n}\n\nbool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    switch (helpListMenu->state)\n    {\n    case  8:\n        return HelpSystemSubroutine_PrintWelcomeMessage(helpListMenu, listMenuItemsBuffer);\n    case  9:\n        return HelpSystemSubroutine_WelcomeWaitButton(helpListMenu, listMenuItemsBuffer);\n    case 10:\n        return HelpSystemSubroutine_WelcomeEndGotoMenu(helpListMenu, listMenuItemsBuffer);\n    case  0:\n        return HelpSystemSubroutine_MenuInputHandlerMain(helpListMenu, listMenuItemsBuffer);\n    case  1:\n        return HelpMenuSubroutine_InitSubmenu(helpListMenu, listMenuItemsBuffer);\n    case  2:\n        return HelpMenuSubroutine_ReturnFromSubmenu(helpListMenu, listMenuItemsBuffer);\n    case  3:\n        return HelpMenuSubroutine_SubmenuInputHandler(helpListMenu, listMenuItemsBuffer);\n    case  4:\n        return HelpMenuSubroutine_HelpItemPrint(helpListMenu, listMenuItemsBuffer);\n    case  5:\n        return HelpMenuSubroutine_ReturnFromHelpItem(helpListMenu, listMenuItemsBuffer);\n    case  6:\n        return HelpMenuSubroutine_HelpItemWaitButton(helpListMenu, listMenuItemsBuffer);\n    }\n    return FALSE;\n}\n\nbool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    PrintTextOnPanel2Row52RightAlign(gText_HelpSystemControls_A_Next);\n    PrintWelcomeMessageOnPanel1();\n    HS_ShowOrHideMainWindowText(1);\n    HS_ShowOrHideControlsGuideInTopRight(1);\n    helpListMenu->state = 9;\n    return TRUE;\n}\n\nbool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        helpListMenu->state = 10;\n    }\n    return TRUE;\n}\n\nbool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    gHelpSystemState.scrollMain = 0;\n    ResetHelpSystemCursor(helpListMenu);\n    BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer);\n    helpListMenu->state = 0;\n    return TRUE;\n}\n\nbool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    s32 input = HelpSystem_GetMenuInput();\n    switch (input)\n    {\n    case -6:\n    case -2:\n        return FALSE;\n    case -5:\n    case -4:\n        PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer);\n        break;\n    case -3:\n    case -1:\n        break;\n    default:\n        gHelpSystemState.topic = input;\n        helpListMenu->state = 1;\n        break;\n    }\n    return TRUE;\n}\n\nbool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    gHelpSystemState.level = 1;\n    gHelpSystemState.scrollMain = helpListMenu->cursorPos;\n    ResetHelpSystemCursor(helpListMenu);\n    BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer);\n    HS_UpdateMenuScrollArrows();\n    HelpSystem_SetInputDelay(2);\n    helpListMenu->state = 3;\n    return TRUE;\n}\n\nbool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    HS_ShowOrHideScrollArrows(0, 0);\n    HS_ShowOrHideScrollArrows(1, 0);\n    gHelpSystemState.level = 0;\n    BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer);\n    helpListMenu->state = 0;\n    return TRUE;\n}\n\nbool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    s32 input = HelpSystem_GetMenuInput();\n    switch (input)\n    {\n    case -6:\n        return FALSE;\n    case -2:\n        helpListMenu->state = 2;\n        break;\n    case -5:\n    case -4:\n    case -3:\n    case -1:\n        break;\n    default:\n        gHelpSystemState.scrollSub = input;\n        helpListMenu->state = 4;\n        break;\n    }\n    return TRUE;\n}\n\nvoid HelpSystem_PrintTopicLabel(void)\n{\n    HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[gHelpSystemState.topic], 0, 0);\n}\n\nbool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    gHelpSystemState.level = 2;\n    HS_ShowOrHideMainWindowText(0);\n    HelpSystem_FillPanel1();\n    PrintTextOnPanel2Row52RightAlign(gText_HelpSystemControls_AorBtoCancel);\n    HS_SetMainWindowBgBrightness(1);\n    HS_ShowOrHideHeaderAndFooterLines_Darker(1);\n\n    if (gHelpSystemState.topic == TOPIC_WHAT_TO_DO)\n    {\n        HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemSpecializedQuestionTextPtrs[gHelpSystemState.scrollSub], sHelpSystemSpecializedAnswerTextPtrs[gHelpSystemState.scrollSub]);\n    }\n    else if (gHelpSystemState.topic == TOPIC_HOW_TO_DO)\n    {\n        HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemMenuTopicTextPtrs[gHelpSystemState.scrollSub], sHelpSystemHowToUseMenuTextPtrs[gHelpSystemState.scrollSub]);\n    }\n    else if (gHelpSystemState.topic == TOPIC_TERMS)\n    {\n        HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemTermTextPtrs[gHelpSystemState.scrollSub], sHelpSystemTermDefinitionsTextPtrs[gHelpSystemState.scrollSub]);\n    }\n    else if (gHelpSystemState.topic == TOPIC_ABOUT_GAME)\n    {\n        HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemGeneralTopicTextPtrs[gHelpSystemState.scrollSub], sHelpSystemGeneralTopicDescriptionTextPtrs[gHelpSystemState.scrollSub]);\n    }\n    else // TOPIC_TYPE_MATCHUP\n    {\n        HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemTypeMatchupTextPtrs[gHelpSystemState.scrollSub], sHelpSystemTypeMatchupDescriptionTextPtrs[gHelpSystemState.scrollSub]);\n    }\n    HS_ShowOrHideMainWindowText(1);\n    HS_ShowOrHideControlsGuideInTopRight(1);\n    helpListMenu->state = 6;\n    return TRUE;\n}\n\nbool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    gHelpSystemState.level = 1;\n    BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer);\n    HS_UpdateMenuScrollArrows();\n    HelpSystem_SetInputDelay(2);\n    helpListMenu->state = 3;\n    return TRUE;\n}\n\nbool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        helpListMenu->state = 5;\n        return TRUE;\n    }\n    if (JOY_NEW(L_BUTTON | R_BUTTON))\n        return FALSE;\n    return TRUE;\n}\n\nstatic void PrintWelcomeMessageOnPanel1(void)\n{\n    HelpSystem_FillPanel1();\n    HelpSystem_PrintTextAt(Help_Text_Greetings, 0, 0);\n}\n\nstatic void PrintTextOnPanel2Row52RightAlign(const u8 * str)\n{\n    HelpSystem_FillPanel2();\n    HelpSystem_PrintTextRightAlign_Row52(str);\n}\n\nu8 GetHelpSystemMenuLevel(void)\n{\n    return gHelpSystemState.level;\n}\n\nstatic void ResetHelpSystemCursor(struct HelpSystemListMenu * helpListMenu)\n{\n    helpListMenu->itemsAbove = 0;\n    helpListMenu->cursorPos = 0;\n}\n\nstatic void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)\n{\n    s32 index = listMenuItemsBuffer[helpListMenu->itemsAbove + helpListMenu->cursorPos].index;\n    if (index == -2)\n        HelpSystem_PrintTopicMouseoverDescription(sHelpSystemTopicMouseoverDescriptionPtrs[5]);\n    else\n        HelpSystem_PrintTopicMouseoverDescription(sHelpSystemTopicMouseoverDescriptionPtrs[index]);\n    HS_ShowOrHideToplevelTooltipWindow(1);\n}\n"
  },
  {
    "path": "src/help_system_util.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"m4a.h\"\n#include \"event_data.h\"\n#include \"help_system.h\"\n#include \"list_menu.h\"\n#include \"strings.h\"\n#include \"constants/songs.h\"\n\n#define ZERO 0\n\nbool8 gHelpSystemEnabled;\n\nstruct HelpSystemVideoState\n{\n    /*0x00*/ MainCallback savedVblankCb;\n    /*0x04*/ MainCallback savedHblankCb;\n    /*0x08*/ u16 savedDispCnt;\n    /*0x0a*/ u16 savedBg0Cnt;\n    /*0x0c*/ u16 savedBg0Hofs;\n    /*0x0e*/ u16 savedBg0Vofs;\n    /*0x10*/ u16 savedBldCnt;\n    /*0x12*/ u8 savedTextColor[3];\n    /*0x15*/ u8 state;\n};\n\nstatic EWRAM_DATA u8 sMapTilesBackup[BG_CHAR_SIZE] = {0};\nEWRAM_DATA u8 gDisableHelpSystemVolumeReduce = 0;\nEWRAM_DATA bool8 gHelpSystemToggleWithRButtonDisabled = FALSE;\nstatic EWRAM_DATA u8 sDelayTimer = 0;\nstatic EWRAM_DATA u8 sInHelpSystem = 0;\nstatic EWRAM_DATA struct HelpSystemVideoState sVideoState = {0};\nEWRAM_DATA struct HelpSystemListMenu gHelpSystemListMenu = {0};\nEWRAM_DATA struct ListMenuItem gHelpSystemListMenuItems[52] = {0};\n\nstatic const u16 sTiles[] = INCBIN_U16(\"graphics/help_system/bg_tiles.4bpp\");\nstatic const u16 sPals[] = INCBIN_U16(\"graphics/help_system/bg_tiles.gbapal\");\n\nu8 RunHelpSystemCallback(void)\n{\n    s32 i;\n\n    switch (sVideoState.state)\n    {\n    case 0:\n        sInHelpSystem = 0;\n        if (gSaveBlock2Ptr->optionsButtonMode != OPTIONS_BUTTON_MODE_HELP && (gSaveBlock1Ptr->keyFlags.inKeySystemMenu != 1 && !FlagGet(FLAG_SYS_IN_OPTIONS_MENU)))\n            return 0;\n        if (JOY_NEW(L_BUTTON))\n        {\n            if (!HelpSystem_IsSinglePlayer() || !gHelpSystemEnabled)\n            {\n                PlaySE(SE_HELP_ERROR);\n                return 0;\n            }\n            m4aMPlayStop(&gMPlayInfo_SE1);\n            m4aMPlayStop(&gMPlayInfo_SE2);\n            PlaySE(SE_HELP_OPEN);\n            if (!gDisableHelpSystemVolumeReduce)\n                m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x80);\n            SaveCallbacks();\n            sInHelpSystem = 1;\n            sVideoState.state = 1;\n        }\n        break;\n    case 1:\n        SaveMapTiles();\n        SaveMapGPURegs();\n        SaveMapTextColors();\n        (*(vu16 *)PLTT) = sPals[15];\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        sVideoState.state = 2;\n        break;\n    case 2:\n        RequestDma3Fill(0, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT);\n        RequestDma3Copy(sPals, (void *)PLTT, sizeof(sPals), DMA3_16BIT);\n        RequestDma3Copy(sTiles, gDecompressionBuffer + 0x3EE0, sizeof(sTiles), DMA3_16BIT);\n        sVideoState.state = 3;\n        break;\n    case 3:\n        HS_BufferFillMapWithTile1FF();\n        HelpSystem_FillPanel3();\n        HelpSystem_FillPanel2();\n        HelpSystem_PrintTextInTopLeftCorner(gString_Help);\n        HS_ShowOrHideWordHELPinTopLeft(1);\n        if (HelpSystem_UpdateHasntSeenIntro() == TRUE)\n            HelpSystemSubroutine_PrintWelcomeMessage(&gHelpSystemListMenu, gHelpSystemListMenuItems);\n        else\n            HelpSystemSubroutine_WelcomeEndGotoMenu(&gHelpSystemListMenu, gHelpSystemListMenuItems);\n        HS_ShowOrHideHeaderAndFooterLines_Lighter(1);\n        HS_ShowOrHideVerticalBlackBarsAlongSides(1);\n        CommitTilemap();\n        sVideoState.state = 4;\n        break;\n    case 4:\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31));\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON);\n        sVideoState.state = 5;\n        break;\n    case 5:\n        if (!RunHelpMenuSubroutine(&gHelpSystemListMenu, gHelpSystemListMenuItems))\n        {\n            PlaySE(SE_HELP_CLOSE);\n            sVideoState.state = 6;\n        }\n        break;\n    case 6:\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        RestoreMapTiles();\n        for (i = 0; i < 0x200; i += 2)\n        {\n            *((vu16 *)(PLTT + 0x000 + i)) = sPals[15];\n            *((vu16 *)(PLTT + 0x200 + i)) = sPals[15];\n        }\n        sVideoState.state = 7;\n        break;\n    case 7:\n        if (!gDisableHelpSystemVolumeReduce)\n            m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100);\n        RestoreMapTextColors();\n        RestoreGPURegs();\n        sVideoState.state = 8;\n        break;\n    case 8:\n        RestoreCallbacks();\n        sInHelpSystem = 0;\n        sVideoState.state = 0;\n        break;\n    }\n    return sVideoState.state;\n}\n\nvoid SaveCallbacks(void)\n{\n    vu16 * dma;\n    sVideoState.savedVblankCb = gMain.vblankCallback;\n    sVideoState.savedHblankCb = gMain.hblankCallback;\n    gMain.vblankCallback = NULL;\n    gMain.hblankCallback = NULL;\n\n    dma = (void *)REG_ADDR_DMA0;\n    dma[5] &= ~(DMA_START_MASK | DMA_DREQ_ON | DMA_REPEAT);\n    dma[5] &= ~DMA_ENABLE;\n    dma[5];\n}\n\nvoid SaveMapGPURegs(void)\n{\n    sVideoState.savedDispCnt = GetGpuReg(REG_OFFSET_DISPCNT);\n    sVideoState.savedBg0Cnt = GetGpuReg(REG_OFFSET_BG0CNT);\n    sVideoState.savedBg0Hofs = GetGpuReg(REG_OFFSET_BG0HOFS);\n    sVideoState.savedBg0Vofs = GetGpuReg(REG_OFFSET_BG0VOFS);\n    sVideoState.savedBldCnt = GetGpuReg(REG_OFFSET_BLDCNT);\n}\n\nvoid SaveMapTiles(void)\n{\n    RequestDma3Copy((void *)BG_CHAR_ADDR(3), sMapTilesBackup, BG_CHAR_SIZE, DMA3_16BIT);\n}\n\nvoid SaveMapTextColors(void)\n{\n    SaveTextColors(\n        &sVideoState.savedTextColor[0],\n        &sVideoState.savedTextColor[1],\n        &sVideoState.savedTextColor[2]\n    );\n}\n\nvoid RestoreCallbacks(void)\n{\n    gMain.vblankCallback = sVideoState.savedVblankCb;\n    gMain.hblankCallback = sVideoState.savedHblankCb;\n}\n\nvoid RestoreGPURegs(void)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, sVideoState.savedBldCnt);\n    SetGpuReg(REG_OFFSET_BG0HOFS, sVideoState.savedBg0Hofs);\n    SetGpuReg(REG_OFFSET_BG0VOFS, sVideoState.savedBg0Vofs);\n    SetGpuReg(REG_OFFSET_BG0CNT, sVideoState.savedBg0Cnt);\n    SetGpuReg(REG_OFFSET_DISPCNT, sVideoState.savedDispCnt);\n}\n\nvoid RestoreMapTiles(void)\n{\n    RequestDma3Copy(sMapTilesBackup, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT);\n}\n\nvoid RestoreMapTextColors(void)\n{\n    RestoreTextColors(\n        &sVideoState.savedTextColor[0],\n        &sVideoState.savedTextColor[1],\n        &sVideoState.savedTextColor[2]\n    );\n}\n\nvoid CommitTilemap(void)\n{\n    RequestDma3Copy(gDecompressionBuffer, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT);\n}\n\nvoid HS_DrawBgTilemapRect(u16 baseTile, u8 left, u8 top, u8 width, u8 height, u16 increment)\n{\n    u16 i, j;\n\n    for (i = top; i < top + height; i++)\n    {\n        for (j = left; j < left + width; j++)\n        {\n            *((u16 *)(gDecompressionBuffer + 0x3800 + 64 * i + 2 * j)) = baseTile;\n            baseTile += increment;\n        }\n    }\n\n    CommitTilemap();\n}\n\nvoid HS_BufferFillMapWithTile1FF(void)\n{\n    HS_DrawBgTilemapRect(0x1FF, 0, 0, 30, 20, 0);\n}\n\nvoid HS_ShowOrHideWordHELPinTopLeft(u8 mode)\n{\n    switch (mode)\n    {\n    case 0:\n        HS_DrawBgTilemapRect(0x1FF, 1, 0, 7, 2, 0);\n        break;\n    case 1:\n        HS_DrawBgTilemapRect(0x1E8, 1, 0, 7, 2, 1);\n        break;\n    }\n}\n\nvoid HS_ShowOrHideControlsGuideInTopRight(u8 mode)\n{\n    switch (mode)\n    {\n    case 0:\n        HS_DrawBgTilemapRect(0x1FF, 13, 0, 16, 2, 0);\n        break;\n    case 1:\n        HS_DrawBgTilemapRect(0x1A0, 13, 0, 16, 2, 1);\n        break;\n    }\n}\n\nvoid HS_ShowOrHideMainWindowText(u8 mode)\n{\n    switch (mode)\n    {\n    case 0:\n        HS_DrawBgTilemapRect(0x1FF, 2, 3, 26, 16, 0);\n        break;\n    case 1:\n        HS_DrawBgTilemapRect(0x000, 2, 3, 26, 16, 1);\n        break;\n    }\n}\n\nvoid HS_SetMainWindowBgBrightness(u8 mode)\n{\n    switch (mode)\n    {\n    case 0:\n        // Brighter\n        HS_DrawBgTilemapRect(0x1FF, 1, 3, 28, 16, 0);\n        break;\n    case 1:\n        // Darker\n        HS_DrawBgTilemapRect(0x1FA, 1, 3, 28, 17, 0);\n        break;\n    }\n}\n\nvoid HS_ShowOrHideToplevelTooltipWindow(u8 mode)\n{\n    switch (mode)\n    {\n    case 0:\n        HS_DrawBgTilemapRect(0x1FF, 2, 14, 26, 5, 0);\n        break;\n    case 1:\n        HS_DrawBgTilemapRect(0x11E, 2, 14, 26, 5, 1);\n        break;\n    }\n}\n\nvoid HS_ShowOrHideHeaderAndFooterLines_Lighter(u8 mode)\n{\n    switch (mode)\n    {\n    case 0:\n        HS_DrawBgTilemapRect(0x1FF, 1,  2, 28, 1, 0);\n        HS_DrawBgTilemapRect(0x1FF, 1, 19, 28, 1, 0);\n        break;\n    case 1:\n        HS_DrawBgTilemapRect(0x1F7, 1,  2, 28, 1, 0);\n        HS_DrawBgTilemapRect(0x1F8, 1, 19, 28, 1, 0);\n        break;\n    }\n}\n\nvoid HS_ShowOrHideHeaderAndFooterLines_Darker(u8 mode)\n{\n    switch (mode)\n    {\n    case 0:\n        HS_DrawBgTilemapRect(0x1FF, 1,  2, 28, 1, 0);\n        HS_DrawBgTilemapRect(0x1FF, 1, 19, 28, 1, 0);\n        break;\n    case 1:\n        HS_DrawBgTilemapRect(0x1FB, 1,  2, 28, 1, 0);\n        HS_DrawBgTilemapRect(0x1FC, 1, 19, 28, 1, 0);\n        break;\n    }\n}\n\nvoid HS_ShowOrHideVerticalBlackBarsAlongSides(u8 mode)\n{\n    switch (mode)\n    {\n    case 0:\n        HS_DrawBgTilemapRect(0x1FF,  0, 0, 1, 20, 0);\n        HS_DrawBgTilemapRect(0x1FF, 29, 0, 1, 20, 0);\n        break;\n    case 1:\n        HS_DrawBgTilemapRect(0x1F9,  0, 0, 1, 20, 0);\n        HS_DrawBgTilemapRect(0x1F9, 29, 0, 1, 20, 0);\n        break;\n    }\n}\n\nvoid HS_ShowOrHideHeaderLine_Darker_FooterStyle(u8 mode)\n{\n    switch (mode)\n    {\n    case 0:\n        HS_DrawBgTilemapRect(0x1FF, 1, 5, 28, 1, 0);\n        break;\n    case 1:\n        HS_DrawBgTilemapRect(0x1FC, 1, 5, 28, 1, 0);\n        break;\n    }\n}\n\nvoid HS_ShowOrHideScrollArrows(u8 which, u8 mode)\n{\n    switch (mode)\n    {\n    case 0:\n        HS_DrawBgTilemapRect(0x1FF, 28,  3, 1, 1, 0);\n        HS_DrawBgTilemapRect(0x1FF, 28, 18, 1, 1, 0);\n        break;\n    case 1:\n        if (which == 0) // top\n            HS_DrawBgTilemapRect(0x1FE, 28,  3, 1, 1, 0);\n        else // bottom\n            HS_DrawBgTilemapRect(0x1FD, 28, 18, 1, 1, 0);\n        break;\n    }\n}\n\nvoid HelpSystemRenderText(u8 fontId, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height)\n{\n    // fontId -> sp+24\n    // dest -> sp+28\n    // src -> r9\n    // x -> sp+34\n    // y -> r10\n    // width -> sp+2C\n    // height -> sp+30\n    struct Bitmap srcBlit;\n    struct Bitmap destBlit;\n    u8 orig_x = x;\n    u8 i = 0;\n    s32 clearPixels = 0;\n\n    while (1)\n    {\n        u16 curChar = *src;\n        src++;\n        switch (curChar)\n        {\n        case EOS:\n            return;\n        case CHAR_NEWLINE:\n            x = orig_x;\n            y += gGlyphInfo.height + 1;\n            break;\n        case PLACEHOLDER_BEGIN:\n            curChar = *src;\n            src++;\n            if (curChar == PLACEHOLDER_ID_PLAYER)\n            {\n                for (i = 0; i < 10; i++)\n                {\n                    if (gSaveBlock2Ptr->playerName[i] == EOS)\n                    {\n                        break;\n                    }\n                    DecompressAndRenderGlyph(fontId, gSaveBlock2Ptr->playerName[i], &srcBlit, &destBlit, dest, x, y, width, height);\n                    // This is required to match a dummy [sp+#0x24] read here\n                    if (fontId == FONT_SMALL)\n                    {\n                        x += gGlyphInfo.width;\n                    }\n                    else\n                    {\n                        x += gGlyphInfo.width + ZERO;\n                    }\n                }\n            }\n            else if (curChar == PLACEHOLDER_ID_STRING_VAR_1)\n            {\n                for (i = 0; ; i++)\n                {\n                    if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC) == TRUE)\n                    {\n                        if (gString_Bill[i] == EOS)\n                        {\n                            break;\n                        }\n                        DecompressAndRenderGlyph(fontId, gString_Bill[i], &srcBlit, &destBlit, dest, x, y, width, height);\n                    }\n                    else\n                    {\n                        if (gString_Someone[i] == EOS)\n                        {\n                            break;\n                        }\n                        DecompressAndRenderGlyph(fontId, gString_Someone[i], &srcBlit, &destBlit, dest, x, y, width, height);\n                    }\n                    if (fontId == FONT_SMALL)\n                    {\n                        x += gGlyphInfo.width;\n                    }\n                    else\n                    {\n                        x += gGlyphInfo.width + ZERO;\n                    }\n                }\n            }\n            break;\n        case CHAR_PROMPT_SCROLL:\n        case CHAR_PROMPT_CLEAR:\n            x = orig_x;\n            y += gGlyphInfo.height + 1;\n            break;\n        case EXT_CTRL_CODE_BEGIN:\n            curChar = *src;\n            src++;\n            switch (curChar)\n            {\n            case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW:\n                src++;\n                //fallthrough\n            case EXT_CTRL_CODE_PLAY_BGM:\n            case EXT_CTRL_CODE_PLAY_SE:\n                src++;\n                //fallthrough\n            case EXT_CTRL_CODE_COLOR:\n            case EXT_CTRL_CODE_HIGHLIGHT:\n            case EXT_CTRL_CODE_SHADOW:\n            case EXT_CTRL_CODE_PALETTE:\n            case EXT_CTRL_CODE_FONT:\n            case EXT_CTRL_CODE_PAUSE:\n            case EXT_CTRL_CODE_ESCAPE:\n            case EXT_CTRL_CODE_SHIFT_RIGHT:\n            case EXT_CTRL_CODE_SHIFT_DOWN:\n                src++;\n            case EXT_CTRL_CODE_RESET_FONT:\n            case EXT_CTRL_CODE_PAUSE_UNTIL_PRESS:\n            case EXT_CTRL_CODE_WAIT_SE:\n            case EXT_CTRL_CODE_FILL_WINDOW:\n                break;\n            case EXT_CTRL_CODE_CLEAR:\n            case EXT_CTRL_CODE_SKIP:\n                src++;\n                break;\n            case EXT_CTRL_CODE_CLEAR_TO:\n            {\n                clearPixels = *src + orig_x - x;\n\n                if (clearPixels > 0)\n                {\n                    destBlit.pixels = dest;\n                    destBlit.width = width * 8;\n                    destBlit.height = height * 8;\n                    FillBitmapRect4Bit(&destBlit, x, y, clearPixels, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT), 0);\n                    x += clearPixels;\n                }\n                src++;\n                break;\n            }\n            case EXT_CTRL_CODE_MIN_LETTER_SPACING:\n                src++;\n                break;\n            case EXT_CTRL_CODE_JPN:\n            case EXT_CTRL_CODE_ENG:\n                break;\n            }\n            break;\n        case CHAR_KEYPAD_ICON:\n            curChar = *src;\n            src++;\n            srcBlit.pixels = (u8 *)&gKeypadIconTiles[0x20 * GetKeypadIconTileOffset(curChar)];\n            srcBlit.width = 0x80;\n            srcBlit.height = 0x80;\n            destBlit.pixels = dest;\n            destBlit.width = width * 8;\n            destBlit.height = height * 8;\n            BlitBitmapRect4Bit(&srcBlit, &destBlit, 0, 0, x, y, GetKeypadIconWidth(curChar), GetKeypadIconHeight(curChar), 0);\n            x += GetKeypadIconWidth(curChar);\n            break;\n        case CHAR_EXTRA_SYMBOL:\n            curChar = *src + 0x100;\n            src++;\n            //fallthrough\n        default:\n            if (curChar == CHAR_SPACE)\n            {\n                if (fontId == FONT_SMALL)\n                {\n                    x += 5;\n                }\n                else\n                {\n                    x += 4;\n                }\n            }\n            else\n            {\n                DecompressAndRenderGlyph(fontId, curChar, &srcBlit, &destBlit, dest, x, y, width, height);\n                if (fontId == FONT_SMALL)\n                {\n                    x += gGlyphInfo.width;\n                }\n                else\n                {\n                    x += gGlyphInfo.width + ZERO;\n                }\n            }\n            break;\n        }\n    }\n}\n\nvoid DecompressAndRenderGlyph(u8 fontId, u16 glyph, struct Bitmap *srcBlit, struct Bitmap *destBlit, u8 *destBuffer, u8 x, u8 y, u8 width, u8 height)\n{\n    if (fontId == FONT_SMALL)\n        DecompressGlyph_Small(glyph, FALSE);\n    else if (fontId == FONT_FEMALE)\n        DecompressGlyph_Female(glyph, FALSE);\n    else\n        DecompressGlyph_Normal(glyph, FALSE);\n    srcBlit->pixels = gGlyphInfo.pixels;\n    srcBlit->width = 16;\n    srcBlit->height = 16;\n    destBlit->pixels = destBuffer;\n    destBlit->width = width * 8;\n    destBlit->height = height * 8;\n    BlitBitmapRect4Bit(srcBlit, destBlit, 0, 0, x, y, gGlyphInfo.width, gGlyphInfo.height, 0);\n}\n\nvoid HelpSystem_PrintTextInTopLeftCorner(const u8 * str)\n{\n    GenerateFontHalfRowLookupTable(TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_DARK_GRAY);\n    HelpSystemRenderText(5, gDecompressionBuffer + 0x3D00, str, 6, 2, 7, 2);\n}\n\nvoid HelpSystem_PrintTextRightAlign_Row52(const u8 * str)\n{\n    s32 left = 0x7C - GetStringWidth(FONT_SMALL, str, 0);\n    GenerateFontHalfRowLookupTable(TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_DARK_GRAY);\n    HelpSystemRenderText(0, gDecompressionBuffer + 0x3400, str, left, 2, 16, 2);\n}\n\nvoid HelpSystem_PrintTextAt(const u8 * str, u8 x, u8 y)\n{\n    GenerateFontHalfRowLookupTable(TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_DARK_GRAY);\n    HelpSystemRenderText(2, gDecompressionBuffer + 0x0000, str, x, y, 26, 16);\n}\n\nvoid HelpSystem_PrintQuestionAndAnswerPair(const u8 * question, const u8 * answer)\n{\n    CpuFill16(0xEEEE, gDecompressionBuffer + 0x0000, 0x3400);\n    GenerateFontHalfRowLookupTable(TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_5, TEXT_COLOR_DARK_GRAY);\n    HelpSystemRenderText(2, gDecompressionBuffer + 0x0000, question, 0, 0, 26, 16);\n    HelpSystemRenderText(2, gDecompressionBuffer + 0x09C0, answer, 0, 0, 26, 13);\n}\n\nvoid HelpSystem_PrintTopicMouseoverDescription(const u8 * str)\n{\n    CpuFill16(0x1111, gDecompressionBuffer + 0x23C0, 0x1040);\n    GenerateFontHalfRowLookupTable(TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    HelpSystemRenderText(2, gDecompressionBuffer + 0x23C0, str, 2, 6, 26, 5);\n}\n\nvoid HelpSystem_FillPanel3(void)\n{\n    CpuFill16(0xFFFF, gDecompressionBuffer + 0x3D00, 0x1C0);\n}\n\nvoid HelpSystem_FillPanel2(void)\n{\n    CpuFill16(0xFFFF, gDecompressionBuffer + 0x3400, 0x400);\n}\n\nvoid HelpSystem_FillPanel1(void)\n{\n    CpuFill16(0xFFFF, gDecompressionBuffer + 0x0000, 0x3400);\n}\n\nvoid HelpSystem_InitListMenuController(struct HelpSystemListMenu * a0, u8 a1, u8 a2)\n{\n    gHelpSystemListMenu.sub = a0->sub;\n    gHelpSystemListMenu.itemsAbove = a1;\n    gHelpSystemListMenu.cursorPos = a2;\n    gHelpSystemListMenu.state = 0;\n    if (gHelpSystemListMenu.sub.totalItems < gHelpSystemListMenu.sub.maxShowed)\n        gHelpSystemListMenu.sub.maxShowed = gHelpSystemListMenu.sub.totalItems;\n    HS_ShowOrHideMainWindowText(0);\n    HelpSystem_FillPanel1();\n    PrintListMenuItems();\n    PlaceListMenuCursor();\n}\n\nvoid HelpSystem_SetInputDelay(u8 a0)\n{\n    sDelayTimer = a0;\n}\n\ns32 HelpSystem_GetMenuInput(void)\n{\n    if (sDelayTimer != 0)\n    {\n        sDelayTimer--;\n        return -1;\n    }\n    else if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos].index;\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        return -2;\n    }\n    else if (JOY_NEW(L_BUTTON))\n    {\n        return -6;\n    }\n    else if (JOY_REPT(DPAD_UP))\n    {\n        if (!MoveCursor(1, 0))\n            PlaySE(SE_SELECT);\n        return -4;\n    }\n    else if (JOY_REPT(DPAD_DOWN))\n    {\n        if (!MoveCursor(1, 1))\n            PlaySE(SE_SELECT);\n        return -5;\n    }\n    else if (JOY_REPT(DPAD_LEFT))\n    {\n        if (!MoveCursor(7, 0))\n            PlaySE(SE_SELECT);\n        return -4;\n    }\n    else if (JOY_REPT(DPAD_RIGHT))\n    {\n        if (!MoveCursor(7, 1))\n            PlaySE(SE_SELECT);\n        return -5;\n    }\n    else\n        return -1;\n}\n\nvoid HS_UpdateMenuScrollArrows(void)\n{\n    u8 topItemIdx = gHelpSystemListMenu.sub.totalItems - 7;\n    if (gHelpSystemListMenu.sub.totalItems > 7)\n    {\n        s32 cursorPos = gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos;\n        HS_ShowOrHideScrollArrows(0, 0); // Hide both\n        if (cursorPos == 0)\n            HS_ShowOrHideScrollArrows(1, 1); // Show bottom\n        else if (gHelpSystemListMenu.itemsAbove == 0 && gHelpSystemListMenu.cursorPos != 0)\n            HS_ShowOrHideScrollArrows(1, 1); // Show bottom\n        else if (gHelpSystemListMenu.itemsAbove == topItemIdx)\n            HS_ShowOrHideScrollArrows(0, 1); // Show top\n        else if (gHelpSystemListMenu.itemsAbove != 0)\n        {\n            // Show both\n            HS_ShowOrHideScrollArrows(0, 1);\n            HS_ShowOrHideScrollArrows(1, 1);\n        }\n    }\n}\n\nvoid PrintListMenuItems(void)\n{\n    u8 glyphHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 1;\n    s32 i;\n    s32 r5 = gHelpSystemListMenu.itemsAbove;\n\n    for (i = 0; i < gHelpSystemListMenu.sub.maxShowed; i++)\n    {\n        u8 x = gHelpSystemListMenu.sub.left + 8;\n        u8 y = gHelpSystemListMenu.sub.top + glyphHeight * i;\n        HelpSystem_PrintTextAt(gHelpSystemListMenu.sub.items[r5].label, x, y);\n        r5++;\n    }\n}\n\nvoid PlaceListMenuCursor(void)\n{\n    u8 glyphHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 1;\n    u8 x = gHelpSystemListMenu.sub.left;\n    u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.cursorPos;\n    HelpSystem_PrintTextAt(gText_SelectorArrow2, x, y);\n}\n\nvoid HS_RemoveSelectionCursorAt(u8 i)\n{\n    u8 glyphHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 1;\n    u8 x = gHelpSystemListMenu.sub.left;\n    u8 y = gHelpSystemListMenu.sub.top + i * glyphHeight;\n    HelpSystem_PrintTextAt(gString_HelpSystem_ClearTo8, x, y);\n}\n\nu8 TryMoveCursor1(u8 dirn)\n{\n    u16 midPoint;\n    if (dirn == 0)\n    {\n        if (gHelpSystemListMenu.sub.maxShowed == 1)\n            midPoint = 0;\n        else\n            midPoint = gHelpSystemListMenu.sub.maxShowed - (gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1)) - 1;\n        if (gHelpSystemListMenu.itemsAbove == 0)\n        {\n            if (gHelpSystemListMenu.cursorPos != 0)\n            {\n                gHelpSystemListMenu.cursorPos--;\n                return 1;\n            }\n            else\n                return 0;\n        }\n        if (gHelpSystemListMenu.cursorPos > midPoint)\n        {\n            gHelpSystemListMenu.cursorPos--;\n            return 1;\n        }\n        else\n        {\n            gHelpSystemListMenu.itemsAbove--;\n            return 2;\n        }\n    }\n    else\n    {\n        if (gHelpSystemListMenu.sub.maxShowed == 1)\n            midPoint = 0;\n        else\n            midPoint = gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1);\n        if (gHelpSystemListMenu.itemsAbove == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed)\n        {\n            if (gHelpSystemListMenu.cursorPos < gHelpSystemListMenu.sub.maxShowed - 1)\n            {\n                gHelpSystemListMenu.cursorPos++;\n                return 1;\n            }\n            else\n                return 0;\n        }\n        else if (gHelpSystemListMenu.cursorPos < midPoint)\n        {\n            gHelpSystemListMenu.cursorPos++;\n            return 1;\n        }\n        else\n        {\n            gHelpSystemListMenu.itemsAbove++;\n            return 2;\n        }\n    }\n}\n\nbool8 MoveCursor(u8 by, u8 dirn)\n{\n    u8 r7 = gHelpSystemListMenu.cursorPos;\n    u8 flags = 0;\n    s32 i;\n    for (i = 0; i < by; i++)\n        flags |= TryMoveCursor1(dirn);\n\n    switch (flags)\n    {\n    case 0:\n    default:\n        // neither changed\n        return TRUE;\n    case 1:\n        // changed cursorPos only\n        HS_RemoveSelectionCursorAt(r7);\n        PlaceListMenuCursor();\n        CommitTilemap();\n        break;\n    case 2:\n    case 3:\n        // changed itemsAbove\n        if (GetHelpSystemMenuLevel() == 1)\n        {\n            HelpSystem_SetInputDelay(2);\n            HelpSystem_FillPanel1();\n            PrintListMenuItems();\n            PlaceListMenuCursor();\n            HelpSystem_PrintTopicLabel();\n            HS_UpdateMenuScrollArrows();\n        }\n        else\n        {\n            HS_ShowOrHideMainWindowText(0);\n            HelpSystem_FillPanel1();\n            PrintListMenuItems();\n            PlaceListMenuCursor();\n            HS_ShowOrHideMainWindowText(1);\n        }\n        CommitTilemap();\n        break;\n    }\n    return FALSE;\n}\n"
  },
  {
    "path": "src/hof_pc.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"hall_of_fame.h\"\n#include \"overworld.h\"\n#include \"script.h\"\n#include \"script_menu.h\"\n#include \"task.h\"\n\nstatic void ReshowPCMenuAfterHallOfFamePC(void);\nstatic void Task_WaitForPaletteFade(u8 taskId);\n\nstatic void Task_WaitFadeAndSetCallback(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        FreeAllWindowBuffers();\n        ResetBgsAndClearDma3BusyFlags(0);\n        DestroyTask(taskId);\n        SetMainCallback2(CB2_InitHofPC);\n    }\n}\n\nvoid HallOfFamePCBeginFade(void)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n    LockPlayerFieldControls();\n    CreateTask(Task_WaitFadeAndSetCallback, 0);\n}\n\nvoid ReturnFromHallOfFamePC(void)\n{\n    SetMainCallback2(CB2_ReturnToField);\n    gFieldCallback = ReshowPCMenuAfterHallOfFamePC;\n}\n\nstatic void ReshowPCMenuAfterHallOfFamePC(void)\n{\n    LockPlayerFieldControls();\n    Overworld_PlaySpecialMapMusic();\n    CreatePCMenu();\n    ScriptMenu_DisplayPCStartupPrompt();\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);\n    CreateTask(Task_WaitForPaletteFade, 10);\n}\n\nstatic void Task_WaitForPaletteFade(u8 taskId)\n{\n    if (!gPaletteFade.active)\n        DestroyTask(taskId);\n}\n"
  },
  {
    "path": "src/image_processing_effects.c",
    "content": "#include \"global.h\"\n#include \"image_processing_effects.h\"\n\n// IWRAM common\nu8 gCanvasColumnStart;\nu16 (*gCanvasPixels)[][32];\nu8 gCanvasRowEnd;\nu8 gCanvasHeight;\nu8 gCanvasColumnEnd;\nu8 gCanvasRowStart;\nu8 gCanvasMonPersonality;\nu8 gCanvasWidth;\nu16 *gCanvasPalette;\nu16 gCanvasPaletteStart;\n\nstatic void ApplyImageEffect_Pointillism(void);\nstatic void ApplyImageEffect_Blur(void);\nstatic void ApplyImageEffect_BlackOutline(void);\nstatic void ApplyImageEffect_Invert(void);\nstatic void ApplyImageEffect_BlackAndWhite(void);\nstatic void ApplyImageEffect_BlurRight(void);\nstatic void ApplyImageEffect_BlurDown(void);\nstatic void ApplyImageEffect_Shimmer(void);\nstatic void ApplyImageEffect_Grayscale(void);\nstatic void ApplyImageEffect_PersonalityColor(u8);\nstatic void ApplyImageEffect_RedChannelGrayscale(u8);\nstatic void ApplyImageEffect_RedChannelGrayscaleHighlight(u8);\nstatic void AddPointillismPoints(u16);\nstatic u16 ConvertColorToGrayscale(u16 *);\nstatic u16 QuantizePixel_Blur(u16 *, u16 *, u16 *);\nstatic u16 QuantizePixel_PersonalityColor(u16 *, u8);\nstatic u16 QuantizePixel_BlackAndWhite(u16 *);\nstatic u16 QuantizePixel_BlackOutline(u16 *, u16 *);\nstatic u16 QuantizePixel_Invert(u16 *);\nstatic u16 QuantizePixel_BlurHard(u16 *, u16 *, u16 *);\nstatic u16 QuantizePixel_MotionBlur(u16 *, u16 *);\nstatic u16 GetColorFromPersonality(u8);\nstatic void QuantizePalette_Standard(bool8);\nstatic void SetPresetPalette_PrimaryColors(void);\nstatic void QuantizePalette_PrimaryColors(void);\nstatic void SetPresetPalette_Grayscale(void);\nstatic void QuantizePalette_Grayscale(void);\nstatic void SetPresetPalette_GrayscaleSmall(void);\nstatic void QuantizePalette_GrayscaleSmall(void);\nstatic void SetPresetPalette_BlackAndWhite(void);\nstatic void QuantizePalette_BlackAndWhite(void);\nstatic u16 QuantizePixel_Standard(u16 *);\nstatic u16 QuantizePixel_GrayscaleSmall(u16 *);\nstatic u16 QuantizePixel_Grayscale(u16 *);\nstatic u16 QuantizePixel_PrimaryColors(u16 *);\n\nstatic const u8 sPointillismPoints[][3] = {\n    {0x00, 0x1d, 0x1c},\n    {0x0e, 0x1e, 0x1b},\n    {0x00, 0x01, 0x32},\n    {0x2e, 0x1e, 0x37},\n    {0x0a, 0x22, 0x1f},\n    {0x05, 0x26, 0x2e},\n    {0x12, 0x17, 0x1e},\n    {0x1a, 0x03, 0x11},\n    {0x05, 0x11, 0x18},\n    {0x05, 0x27, 0x2f},\n    {0x1a, 0x3f, 0x12},\n    {0x22, 0x3f, 0x16},\n    {0x2b, 0x2f, 0x2e},\n    {0x11, 0x02, 0x2d},\n    {0x23, 0x0d, 0x28},\n    {0x17, 0x0c, 0x19},\n    {0x2f, 0x0e, 0x13},\n    {0x30, 0x18, 0x20},\n    {0x2d, 0x28, 0x22},\n    {0x01, 0x03, 0x19},\n    {0x0e, 0x2a, 0x2b},\n    {0x22, 0x15, 0x25},\n    {0x22, 0x0a, 0x26},\n    {0x39, 0x06, 0x23},\n    {0x16, 0x07, 0x2f},\n    {0x22, 0x3a, 0x1b},\n    {0x3b, 0x36, 0x35},\n    {0x0a, 0x2b, 0x24},\n    {0x36, 0x09, 0x12},\n    {0x1c, 0x2f, 0x23},\n    {0x2e, 0x38, 0x2c},\n    {0x05, 0x2a, 0x20},\n    {0x07, 0x14, 0x32},\n    {0x31, 0x08, 0x17},\n    {0x1a, 0x24, 0x2d},\n    {0x22, 0x0a, 0x16},\n    {0x1b, 0x26, 0x2b},\n    {0x29, 0x16, 0x11},\n    {0x35, 0x08, 0x14},\n    {0x1e, 0x08, 0x14},\n    {0x05, 0x31, 0x14},\n    {0x38, 0x31, 0x17},\n    {0x34, 0x33, 0x12},\n    {0x11, 0x09, 0x1f},\n    {0x28, 0x3d, 0x32},\n    {0x35, 0x03, 0x1e},\n    {0x3c, 0x2b, 0x2e},\n    {0x10, 0x01, 0x17},\n    {0x03, 0x3e, 0x22},\n    {0x17, 0x18, 0x34},\n    {0x08, 0x29, 0x19},\n    {0x03, 0x24, 0x28},\n    {0x3d, 0x33, 0x2f},\n    {0x31, 0x24, 0x19},\n    {0x1b, 0x18, 0x26},\n    {0x07, 0x0d, 0x25},\n    {0x2d, 0x3f, 0x12},\n    {0x2f, 0x15, 0x25},\n    {0x29, 0x0f, 0x12},\n    {0x07, 0x2c, 0x12},\n    {0x2c, 0x0b, 0x26},\n    {0x12, 0x1a, 0x16},\n    {0x00, 0x0b, 0x2f},\n    {0x16, 0x35, 0x24},\n    {0x1f, 0x1c, 0x22},\n    {0x29, 0x33, 0x27},\n    {0x3b, 0x30, 0x17},\n    {0x11, 0x06, 0x35},\n    {0x3e, 0x31, 0x2f},\n    {0x11, 0x3a, 0x25},\n    {0x2a, 0x02, 0x19},\n    {0x33, 0x18, 0x35},\n    {0x2a, 0x20, 0x21},\n    {0x2e, 0x32, 0x1b},\n    {0x3b, 0x1f, 0x23},\n    {0x39, 0x29, 0x2a},\n    {0x2e, 0x31, 0x29},\n    {0x2a, 0x0e, 0x2d},\n    {0x2d, 0x00, 0x1f},\n    {0x38, 0x28, 0x1b},\n    {0x14, 0x3b, 0x2b},\n    {0x2e, 0x04, 0x26},\n    {0x36, 0x30, 0x11},\n    {0x3b, 0x21, 0x2d},\n    {0x2b, 0x3f, 0x1b},\n    {0x20, 0x13, 0x31},\n    {0x33, 0x0c, 0x30},\n    {0x22, 0x2b, 0x2b},\n    {0x16, 0x02, 0x1e},\n    {0x1c, 0x12, 0x1c},\n    {0x0f, 0x3c, 0x36},\n    {0x38, 0x10, 0x2d},\n    {0x18, 0x2f, 0x2d},\n    {0x35, 0x3b, 0x11},\n    {0x37, 0x31, 0x13},\n    {0x13, 0x3d, 0x2f},\n    {0x1e, 0x2c, 0x33},\n    {0x2e, 0x37, 0x12},\n    {0x3c, 0x1f, 0x33},\n    {0x32, 0x2a, 0x27},\n    {0x0d, 0x3b, 0x1c},\n    {0x35, 0x2a, 0x27},\n    {0x09, 0x3d, 0x27},\n    {0x12, 0x0b, 0x18},\n    {0x0c, 0x15, 0x1d},\n    {0x20, 0x01, 0x1c},\n    {0x08, 0x3b, 0x1c},\n    {0x12, 0x37, 0x33},\n    {0x15, 0x03, 0x2c},\n    {0x2a, 0x3b, 0x31},\n    {0x0f, 0x04, 0x35},\n    {0x08, 0x17, 0x33},\n    {0x38, 0x3d, 0x2a},\n    {0x2f, 0x35, 0x16},\n    {0x10, 0x35, 0x16},\n    {0x23, 0x13, 0x2c},\n    {0x2f, 0x06, 0x20},\n    {0x27, 0x3a, 0x24},\n    {0x00, 0x1c, 0x2a},\n    {0x03, 0x39, 0x1d},\n    {0x28, 0x07, 0x1a},\n    {0x20, 0x0a, 0x37},\n    {0x07, 0x35, 0x2d},\n    {0x15, 0x2f, 0x2c},\n    {0x10, 0x2c, 0x23},\n    {0x3f, 0x29, 0x14},\n    {0x2a, 0x21, 0x36},\n    {0x34, 0x1a, 0x2c},\n    {0x1c, 0x3d, 0x33},\n    {0x38, 0x2b, 0x22},\n    {0x35, 0x28, 0x1f},\n    {0x3d, 0x0f, 0x1c},\n    {0x1e, 0x3e, 0x1b},\n    {0x0c, 0x3e, 0x1f},\n    {0x2b, 0x31, 0x2c},\n    {0x32, 0x39, 0x11},\n    {0x05, 0x09, 0x11},\n    {0x04, 0x38, 0x2a},\n    {0x32, 0x00, 0x16},\n    {0x13, 0x0b, 0x31},\n    {0x34, 0x2a, 0x13},\n    {0x2c, 0x22, 0x21},\n    {0x39, 0x2f, 0x15},\n    {0x37, 0x28, 0x1e},\n    {0x07, 0x3b, 0x2d},\n    {0x11, 0x03, 0x28},\n    {0x2d, 0x30, 0x1e},\n    {0x31, 0x11, 0x11},\n    {0x23, 0x01, 0x1e},\n    {0x3d, 0x31, 0x34},\n    {0x1c, 0x02, 0x34},\n    {0x21, 0x0e, 0x25},\n    {0x3d, 0x07, 0x17},\n    {0x33, 0x15, 0x10},\n    {0x29, 0x32, 0x32},\n    {0x18, 0x1f, 0x30},\n    {0x2d, 0x3b, 0x30},\n    {0x27, 0x3e, 0x16},\n    {0x31, 0x15, 0x12},\n    {0x30, 0x25, 0x17},\n    {0x33, 0x06, 0x34},\n    {0x00, 0x29, 0x18},\n    {0x3c, 0x03, 0x12},\n    {0x2c, 0x0c, 0x11},\n    {0x09, 0x30, 0x30},\n    {0x10, 0x0e, 0x11},\n    {0x27, 0x16, 0x1b},\n    {0x0c, 0x3b, 0x2e},\n    {0x2b, 0x33, 0x1e},\n    {0x13, 0x2d, 0x2d},\n    {0x11, 0x24, 0x29},\n    {0x34, 0x3e, 0x2b},\n    {0x24, 0x1e, 0x21},\n    {0x27, 0x1a, 0x2d},\n    {0x04, 0x39, 0x16},\n    {0x3e, 0x33, 0x26},\n    {0x1b, 0x2e, 0x25},\n    {0x0c, 0x06, 0x19},\n    {0x25, 0x19, 0x18},\n    {0x1d, 0x33, 0x33},\n    {0x1d, 0x28, 0x2d},\n    {0x1c, 0x10, 0x2a},\n    {0x1f, 0x35, 0x1e},\n    {0x34, 0x02, 0x10},\n    {0x2b, 0x3a, 0x14},\n    {0x0d, 0x0b, 0x15},\n    {0x0c, 0x2c, 0x10},\n    {0x37, 0x3a, 0x19},\n    {0x06, 0x13, 0x17},\n    {0x24, 0x10, 0x25},\n    {0x24, 0x04, 0x1e},\n    {0x00, 0x35, 0x34},\n    {0x3a, 0x00, 0x37},\n    {0x3c, 0x07, 0x1a},\n    {0x2b, 0x28, 0x36},\n    {0x34, 0x39, 0x2f},\n    {0x28, 0x09, 0x1f},\n    {0x38, 0x31, 0x30},\n    {0x16, 0x25, 0x31},\n    {0x18, 0x28, 0x31},\n    {0x18, 0x0c, 0x22},\n    {0x06, 0x39, 0x2d},\n    {0x3d, 0x20, 0x24},\n    {0x2e, 0x27, 0x21},\n    {0x3e, 0x18, 0x18},\n    {0x15, 0x3c, 0x24},\n    {0x06, 0x1b, 0x26},\n    {0x15, 0x0e, 0x22},\n    {0x0a, 0x0d, 0x1f},\n    {0x18, 0x16, 0x34},\n    {0x10, 0x28, 0x21},\n    {0x20, 0x11, 0x11},\n    {0x36, 0x32, 0x15},\n    {0x3b, 0x2e, 0x24},\n    {0x1f, 0x2d, 0x12},\n    {0x36, 0x2e, 0x20},\n    {0x0b, 0x17, 0x33},\n    {0x26, 0x03, 0x1f},\n    {0x08, 0x19, 0x31},\n    {0x2a, 0x18, 0x25},\n    {0x35, 0x2d, 0x2d},\n    {0x30, 0x38, 0x18},\n    {0x1c, 0x25, 0x14},\n    {0x1c, 0x22, 0x28},\n    {0x08, 0x23, 0x21},\n    {0x26, 0x1e, 0x30},\n    {0x19, 0x0f, 0x15},\n    {0x10, 0x2f, 0x22},\n    {0x12, 0x02, 0x25},\n    {0x3c, 0x01, 0x1d},\n    {0x0e, 0x14, 0x18},\n    {0x0d, 0x18, 0x17},\n    {0x22, 0x0b, 0x31},\n    {0x13, 0x34, 0x21},\n    {0x0f, 0x2d, 0x36},\n    {0x39, 0x1f, 0x25},\n    {0x18, 0x10, 0x1f},\n    {0x2d, 0x20, 0x20},\n    {0x19, 0x0b, 0x31},\n    {0x33, 0x13, 0x14},\n    {0x2e, 0x11, 0x21},\n    {0x2d, 0x0a, 0x37},\n    {0x07, 0x15, 0x1b},\n    {0x32, 0x04, 0x32},\n    {0x06, 0x18, 0x1b},\n    {0x13, 0x24, 0x12},\n    {0x36, 0x22, 0x16},\n    {0x1d, 0x29, 0x1c},\n    {0x35, 0x17, 0x21},\n    {0x36, 0x17, 0x2b},\n    {0x35, 0x32, 0x19},\n    {0x2a, 0x0f, 0x2e},\n    {0x10, 0x00, 0x34},\n    {0x02, 0x0e, 0x28},\n    {0x31, 0x32, 0x32},\n    {0x3b, 0x05, 0x20},\n    {0x36, 0x26, 0x12},\n    {0x34, 0x06, 0x34},\n    {0x1e, 0x31, 0x32},\n    {0x35, 0x05, 0x34},\n    {0x1e, 0x13, 0x15},\n    {0x15, 0x14, 0x2c},\n    {0x29, 0x1c, 0x18},\n    {0x24, 0x24, 0x12},\n    {0x22, 0x29, 0x18},\n    {0x34, 0x36, 0x30},\n    {0x1e, 0x01, 0x23},\n    {0x0c, 0x3c, 0x24},\n    {0x0a, 0x3d, 0x16},\n    {0x27, 0x1e, 0x23},\n    {0x15, 0x02, 0x12},\n    {0x11, 0x19, 0x2a},\n    {0x1d, 0x31, 0x15},\n    {0x03, 0x3b, 0x2a},\n    {0x21, 0x19, 0x2c},\n    {0x0a, 0x23, 0x11},\n    {0x25, 0x11, 0x1a},\n    {0x1a, 0x0a, 0x34},\n    {0x3b, 0x0b, 0x33},\n    {0x21, 0x0b, 0x37},\n    {0x01, 0x31, 0x28},\n    {0x35, 0x1d, 0x27},\n    {0x2c, 0x30, 0x31},\n    {0x2e, 0x39, 0x2d},\n    {0x30, 0x05, 0x2c},\n    {0x12, 0x2a, 0x2b},\n    {0x39, 0x22, 0x20},\n    {0x15, 0x34, 0x1c},\n    {0x1c, 0x01, 0x15},\n    {0x20, 0x16, 0x22},\n    {0x13, 0x04, 0x18},\n    {0x1e, 0x13, 0x10},\n    {0x25, 0x33, 0x15},\n    {0x39, 0x03, 0x31},\n    {0x3f, 0x36, 0x18},\n    {0x14, 0x23, 0x10},\n    {0x2f, 0x1e, 0x1f},\n    {0x1f, 0x17, 0x2c},\n    {0x02, 0x16, 0x31},\n    {0x20, 0x18, 0x30},\n    {0x2e, 0x18, 0x37},\n    {0x3b, 0x0e, 0x30},\n    {0x10, 0x39, 0x24},\n    {0x26, 0x39, 0x1e},\n    {0x30, 0x26, 0x2e},\n    {0x12, 0x01, 0x14},\n    {0x37, 0x2a, 0x2e},\n    {0x21, 0x06, 0x1d},\n    {0x2a, 0x16, 0x32},\n    {0x09, 0x38, 0x1c},\n    {0x07, 0x22, 0x17},\n    {0x3b, 0x2d, 0x15},\n    {0x07, 0x1e, 0x2e},\n    {0x1b, 0x2e, 0x1d},\n    {0x04, 0x09, 0x30},\n    {0x30, 0x2d, 0x37},\n    {0x2d, 0x34, 0x24},\n    {0x18, 0x24, 0x25},\n    {0x0e, 0x2d, 0x26},\n    {0x23, 0x0a, 0x16},\n    {0x12, 0x2d, 0x11},\n    {0x21, 0x28, 0x2e},\n    {0x0f, 0x01, 0x21},\n    {0x01, 0x31, 0x12},\n    {0x3f, 0x1b, 0x1e},\n    {0x21, 0x25, 0x2b},\n    {0x26, 0x18, 0x13},\n    {0x15, 0x2d, 0x34},\n    {0x23, 0x21, 0x36},\n    {0x0e, 0x2e, 0x1c},\n    {0x14, 0x22, 0x1c},\n    {0x2c, 0x0b, 0x28},\n    {0x1a, 0x18, 0x21},\n    {0x21, 0x07, 0x1a},\n    {0x24, 0x26, 0x29},\n    {0x2b, 0x0a, 0x34},\n    {0x3e, 0x27, 0x33},\n    {0x12, 0x34, 0x1b},\n    {0x1f, 0x01, 0x2a},\n    {0x2e, 0x06, 0x23},\n    {0x2f, 0x1f, 0x14},\n    {0x18, 0x06, 0x26},\n    {0x31, 0x1f, 0x2b},\n    {0x22, 0x26, 0x2e},\n    {0x1e, 0x15, 0x16},\n    {0x20, 0x22, 0x28},\n    {0x15, 0x37, 0x12},\n    {0x25, 0x04, 0x2c},\n    {0x1f, 0x04, 0x2e},\n    {0x0c, 0x13, 0x18},\n    {0x07, 0x0b, 0x36},\n    {0x1d, 0x1c, 0x2a},\n    {0x30, 0x22, 0x1c},\n    {0x2e, 0x12, 0x2f},\n    {0x2b, 0x21, 0x1e},\n    {0x16, 0x38, 0x30},\n    {0x04, 0x02, 0x16},\n    {0x05, 0x14, 0x20},\n    {0x38, 0x3c, 0x33},\n    {0x21, 0x1b, 0x2f},\n    {0x14, 0x2a, 0x27},\n    {0x38, 0x14, 0x1b},\n    {0x2b, 0x1f, 0x2b},\n    {0x29, 0x2b, 0x25},\n    {0x27, 0x36, 0x21},\n    {0x11, 0x22, 0x1b},\n    {0x29, 0x03, 0x1b},\n    {0x18, 0x24, 0x28},\n    {0x21, 0x2d, 0x36},\n    {0x3c, 0x2c, 0x24},\n    {0x33, 0x17, 0x1f},\n    {0x2a, 0x3a, 0x21},\n    {0x0a, 0x23, 0x37},\n    {0x00, 0x0b, 0x21},\n    {0x11, 0x38, 0x19},\n    {0x0f, 0x0e, 0x1c},\n    {0x1f, 0x0f, 0x37},\n    {0x3c, 0x10, 0x37},\n    {0x38, 0x31, 0x35},\n    {0x07, 0x15, 0x28},\n    {0x1e, 0x2e, 0x19},\n    {0x26, 0x10, 0x33},\n    {0x3d, 0x35, 0x2f},\n    {0x3a, 0x04, 0x34},\n    {0x0d, 0x18, 0x1a},\n    {0x01, 0x2d, 0x15},\n    {0x3d, 0x1a, 0x17},\n    {0x17, 0x3f, 0x32},\n    {0x0b, 0x21, 0x11},\n    {0x1e, 0x26, 0x2b},\n    {0x0d, 0x19, 0x24},\n    {0x2e, 0x04, 0x1b},\n    {0x1b, 0x33, 0x20},\n    {0x15, 0x21, 0x1d},\n    {0x1f, 0x04, 0x21},\n    {0x0f, 0x12, 0x1f},\n    {0x2d, 0x2a, 0x32},\n    {0x03, 0x37, 0x1f},\n    {0x35, 0x07, 0x27},\n    {0x24, 0x1f, 0x31},\n    {0x2f, 0x30, 0x15},\n    {0x06, 0x00, 0x24},\n    {0x0b, 0x22, 0x1a},\n    {0x0c, 0x3b, 0x29},\n    {0x14, 0x1a, 0x17},\n    {0x37, 0x20, 0x25},\n    {0x3f, 0x26, 0x37},\n    {0x3a, 0x3e, 0x10},\n    {0x22, 0x04, 0x11},\n    {0x28, 0x12, 0x1c},\n    {0x03, 0x2e, 0x2e},\n    {0x0e, 0x38, 0x28},\n    {0x01, 0x29, 0x22},\n    {0x1e, 0x33, 0x19},\n    {0x06, 0x21, 0x27},\n    {0x33, 0x19, 0x1a},\n    {0x02, 0x05, 0x17},\n    {0x11, 0x11, 0x2c},\n    {0x1f, 0x26, 0x1e},\n    {0x39, 0x1f, 0x28},\n    {0x2e, 0x2f, 0x12},\n    {0x22, 0x34, 0x13},\n    {0x3b, 0x26, 0x2f},\n    {0x34, 0x00, 0x14},\n    {0x10, 0x31, 0x11},\n    {0x1d, 0x2d, 0x2a},\n    {0x08, 0x08, 0x37},\n    {0x15, 0x18, 0x34},\n    {0x04, 0x2b, 0x24},\n    {0x2f, 0x1e, 0x27},\n    {0x22, 0x2a, 0x24},\n    {0x07, 0x14, 0x25},\n    {0x01, 0x27, 0x19},\n    {0x29, 0x0a, 0x29},\n    {0x3d, 0x1c, 0x2f},\n    {0x0d, 0x1f, 0x1c},\n    {0x24, 0x3d, 0x32},\n    {0x36, 0x1d, 0x24},\n    {0x14, 0x21, 0x16},\n    {0x1a, 0x0d, 0x29},\n    {0x3f, 0x2b, 0x2a},\n    {0x1a, 0x3e, 0x35},\n    {0x11, 0x28, 0x18},\n    {0x32, 0x05, 0x15},\n    {0x21, 0x2e, 0x34},\n    {0x2d, 0x14, 0x2a},\n    {0x3c, 0x08, 0x37},\n    {0x3f, 0x34, 0x1e},\n    {0x27, 0x24, 0x1c},\n    {0x16, 0x16, 0x33},\n    {0x29, 0x3b, 0x19},\n    {0x36, 0x2f, 0x1c},\n    {0x03, 0x25, 0x2c},\n    {0x0b, 0x16, 0x36},\n    {0x1c, 0x1d, 0x1b},\n    {0x2c, 0x27, 0x1b},\n    {0x0b, 0x1f, 0x2b},\n    {0x08, 0x10, 0x27},\n    {0x3f, 0x25, 0x2f},\n    {0x33, 0x13, 0x1f},\n    {0x04, 0x31, 0x37},\n    {0x0e, 0x2f, 0x12},\n    {0x08, 0x23, 0x20},\n    {0x3a, 0x1a, 0x1e},\n    {0x2f, 0x0b, 0x1f},\n    {0x1e, 0x20, 0x19},\n    {0x23, 0x3b, 0x14},\n    {0x25, 0x00, 0x27},\n    {0x14, 0x04, 0x25},\n    {0x36, 0x1a, 0x2b},\n    {0x27, 0x21, 0x15},\n    {0x28, 0x13, 0x2c},\n    {0x0e, 0x3c, 0x35},\n    {0x0c, 0x2d, 0x2b},\n    {0x37, 0x16, 0x15},\n    {0x29, 0x15, 0x1d},\n    {0x17, 0x34, 0x36},\n    {0x09, 0x0a, 0x31},\n    {0x37, 0x22, 0x28},\n    {0x17, 0x2b, 0x35},\n    {0x14, 0x2b, 0x12},\n    {0x08, 0x13, 0x1f},\n    {0x31, 0x13, 0x28},\n    {0x06, 0x07, 0x35},\n    {0x23, 0x3a, 0x29},\n    {0x0f, 0x24, 0x2e},\n    {0x07, 0x35, 0x26},\n    {0x0e, 0x12, 0x15},\n    {0x23, 0x33, 0x2c},\n    {0x0e, 0x21, 0x26},\n    {0x1c, 0x12, 0x25},\n    {0x23, 0x1d, 0x2f},\n    {0x04, 0x35, 0x33},\n    {0x16, 0x01, 0x24},\n    {0x3d, 0x2c, 0x2e},\n    {0x35, 0x0a, 0x25},\n    {0x11, 0x13, 0x25},\n    {0x1b, 0x1b, 0x15},\n    {0x15, 0x39, 0x10},\n    {0x0b, 0x35, 0x24},\n    {0x3a, 0x27, 0x30},\n    {0x2e, 0x2f, 0x15},\n    {0x10, 0x1f, 0x35},\n    {0x1b, 0x28, 0x35},\n    {0x26, 0x30, 0x37},\n    {0x34, 0x37, 0x2b},\n    {0x0f, 0x30, 0x29},\n    {0x2e, 0x3f, 0x2b},\n    {0x38, 0x34, 0x2b},\n    {0x2b, 0x2f, 0x25},\n    {0x0d, 0x28, 0x2a},\n    {0x33, 0x18, 0x10},\n    {0x21, 0x12, 0x11},\n    {0x1f, 0x22, 0x34},\n    {0x11, 0x25, 0x23},\n    {0x21, 0x3f, 0x11},\n    {0x26, 0x27, 0x25},\n    {0x28, 0x36, 0x12},\n    {0x15, 0x26, 0x32},\n    {0x11, 0x18, 0x24},\n    {0x32, 0x25, 0x37},\n    {0x27, 0x3a, 0x33},\n    {0x35, 0x07, 0x1c},\n    {0x1a, 0x0e, 0x2a},\n    {0x1e, 0x2f, 0x1f},\n    {0x00, 0x2e, 0x21},\n    {0x1b, 0x3c, 0x14},\n    {0x2f, 0x3a, 0x2f},\n    {0x3e, 0x38, 0x15},\n    {0x1a, 0x13, 0x2f},\n    {0x29, 0x0d, 0x2f},\n    {0x37, 0x17, 0x18},\n    {0x30, 0x1c, 0x35},\n    {0x15, 0x34, 0x14},\n    {0x28, 0x11, 0x2c},\n    {0x2c, 0x25, 0x2a},\n    {0x20, 0x3f, 0x28},\n    {0x0c, 0x34, 0x1b},\n    {0x30, 0x2e, 0x25},\n    {0x37, 0x1c, 0x24},\n    {0x1f, 0x25, 0x26},\n    {0x0c, 0x19, 0x34},\n    {0x18, 0x10, 0x35},\n    {0x0a, 0x13, 0x11},\n    {0x25, 0x13, 0x20},\n    {0x13, 0x19, 0x11},\n    {0x20, 0x28, 0x1d},\n    {0x3e, 0x30, 0x1b},\n    {0x23, 0x24, 0x21},\n    {0x0d, 0x23, 0x23},\n    {0x1d, 0x28, 0x2e},\n    {0x2d, 0x12, 0x1f},\n    {0x0e, 0x2e, 0x2b},\n    {0x0b, 0x31, 0x32},\n    {0x24, 0x3c, 0x2c},\n    {0x13, 0x3c, 0x12},\n    {0x28, 0x16, 0x2a},\n    {0x05, 0x0c, 0x32},\n    {0x39, 0x0b, 0x32},\n    {0x21, 0x04, 0x14},\n    {0x10, 0x31, 0x32},\n    {0x12, 0x1f, 0x23},\n    {0x39, 0x2e, 0x2e},\n    {0x22, 0x3d, 0x27},\n    {0x0c, 0x1e, 0x18},\n    {0x25, 0x00, 0x17},\n    {0x06, 0x31, 0x14},\n    {0x13, 0x21, 0x1a},\n    {0x14, 0x20, 0x35},\n    {0x0a, 0x3b, 0x25},\n    {0x33, 0x08, 0x28},\n    {0x3d, 0x02, 0x33},\n    {0x23, 0x00, 0x13},\n    {0x22, 0x21, 0x28},\n    {0x30, 0x14, 0x2e},\n    {0x14, 0x32, 0x36},\n    {0x39, 0x23, 0x1e},\n    {0x1c, 0x11, 0x30},\n    {0x37, 0x16, 0x30},\n    {0x15, 0x31, 0x1f},\n    {0x34, 0x28, 0x2c},\n    {0x35, 0x05, 0x29},\n    {0x37, 0x33, 0x2a},\n    {0x1c, 0x17, 0x2e},\n    {0x10, 0x06, 0x16},\n    {0x32, 0x1f, 0x2f},\n    {0x00, 0x29, 0x1e},\n    {0x04, 0x01, 0x16},\n    {0x3b, 0x23, 0x1e},\n    {0x1b, 0x34, 0x2a},\n    {0x30, 0x11, 0x2b},\n    {0x03, 0x00, 0x1f},\n    {0x1d, 0x37, 0x1a},\n    {0x3a, 0x18, 0x25},\n    {0x1c, 0x16, 0x2c},\n    {0x04, 0x3f, 0x33},\n    {0x26, 0x23, 0x2d},\n    {0x15, 0x2c, 0x27},\n    {0x02, 0x35, 0x27},\n    {0x07, 0x35, 0x33},\n    {0x1a, 0x0c, 0x10},\n    {0x28, 0x26, 0x2c},\n    {0x2f, 0x36, 0x16},\n    {0x37, 0x0b, 0x27},\n    {0x1b, 0x3d, 0x18},\n    {0x27, 0x1f, 0x20},\n    {0x2b, 0x2a, 0x33},\n    {0x0b, 0x0f, 0x20},\n    {0x35, 0x3c, 0x2f},\n    {0x33, 0x21, 0x15},\n    {0x2d, 0x26, 0x34},\n    {0x1f, 0x1a, 0x21},\n    {0x2f, 0x2c, 0x2a},\n    {0x1a, 0x32, 0x1a},\n    {0x3b, 0x3f, 0x21},\n    {0x13, 0x3f, 0x13},\n    {0x0f, 0x24, 0x22},\n    {0x14, 0x1b, 0x10},\n    {0x21, 0x06, 0x28},\n    {0x25, 0x34, 0x10},\n    {0x2e, 0x0e, 0x14},\n    {0x3c, 0x3e, 0x25},\n    {0x16, 0x06, 0x30},\n    {0x0b, 0x04, 0x1f},\n    {0x3e, 0x02, 0x24},\n    {0x0c, 0x17, 0x25},\n    {0x2b, 0x3c, 0x2d},\n    {0x15, 0x36, 0x33},\n    {0x18, 0x23, 0x2a},\n    {0x1d, 0x10, 0x2a},\n    {0x35, 0x17, 0x28},\n    {0x00, 0x37, 0x24},\n    {0x0a, 0x3b, 0x15},\n    {0x1d, 0x0b, 0x1f},\n    {0x3c, 0x31, 0x25},\n    {0x1d, 0x0f, 0x1d},\n    {0x20, 0x13, 0x34},\n    {0x11, 0x2b, 0x2e},\n    {0x23, 0x0c, 0x2e},\n    {0x24, 0x02, 0x14},\n    {0x31, 0x16, 0x19},\n    {0x0e, 0x23, 0x35},\n    {0x1a, 0x10, 0x16},\n    {0x14, 0x04, 0x19},\n    {0x2d, 0x27, 0x37},\n    {0x33, 0x02, 0x31},\n    {0x02, 0x04, 0x16},\n    {0x0d, 0x22, 0x25},\n    {0x25, 0x00, 0x16},\n    {0x2a, 0x3f, 0x26},\n    {0x20, 0x0c, 0x12},\n    {0x2f, 0x2e, 0x35},\n    {0x1b, 0x0d, 0x22},\n    {0x1e, 0x01, 0x34},\n    {0x05, 0x22, 0x21},\n    {0x34, 0x2a, 0x32},\n    {0x0b, 0x09, 0x1d},\n    {0x3f, 0x32, 0x2f},\n    {0x3d, 0x18, 0x2d},\n    {0x0b, 0x38, 0x36},\n    {0x39, 0x17, 0x28},\n    {0x34, 0x04, 0x24},\n    {0x36, 0x0e, 0x2a},\n    {0x38, 0x01, 0x14},\n    {0x3c, 0x24, 0x22},\n    {0x21, 0x03, 0x18},\n    {0x32, 0x2f, 0x12},\n    {0x29, 0x24, 0x31},\n    {0x0a, 0x3b, 0x12},\n    {0x1a, 0x1c, 0x20},\n    {0x30, 0x31, 0x1b},\n    {0x1a, 0x21, 0x10},\n    {0x05, 0x29, 0x10},\n    {0x26, 0x2d, 0x13},\n    {0x16, 0x0c, 0x1d},\n    {0x2b, 0x06, 0x1b},\n    {0x06, 0x12, 0x14},\n    {0x38, 0x0f, 0x35},\n    {0x23, 0x3a, 0x2c},\n    {0x00, 0x19, 0x33},\n    {0x29, 0x14, 0x2d},\n    {0x2a, 0x21, 0x29},\n    {0x14, 0x31, 0x14},\n    {0x1a, 0x06, 0x1e},\n    {0x18, 0x1b, 0x28},\n    {0x3b, 0x16, 0x29},\n    {0x15, 0x1e, 0x12},\n    {0x34, 0x0a, 0x14},\n    {0x1b, 0x05, 0x27},\n    {0x0b, 0x01, 0x26},\n    {0x2a, 0x22, 0x35},\n    {0x21, 0x20, 0x18},\n    {0x20, 0x37, 0x17},\n    {0x14, 0x1f, 0x11},\n    {0x1d, 0x11, 0x25},\n    {0x24, 0x2b, 0x2f},\n    {0x07, 0x3f, 0x1f},\n    {0x2c, 0x25, 0x25},\n    {0x2a, 0x29, 0x18},\n    {0x11, 0x24, 0x28},\n    {0x31, 0x2c, 0x2a},\n    {0x39, 0x0b, 0x26},\n    {0x28, 0x10, 0x26},\n    {0x22, 0x06, 0x16},\n    {0x09, 0x2c, 0x13},\n    {0x34, 0x19, 0x15},\n    {0x3a, 0x12, 0x21},\n    {0x1d, 0x38, 0x23},\n    {0x12, 0x25, 0x24},\n    {0x21, 0x30, 0x12},\n    {0x37, 0x1a, 0x12},\n    {0x24, 0x3b, 0x25},\n    {0x32, 0x15, 0x23},\n    {0x0d, 0x1a, 0x10},\n    {0x16, 0x2e, 0x26},\n    {0x1d, 0x14, 0x16},\n    {0x3e, 0x2e, 0x1f},\n    {0x0a, 0x16, 0x10},\n    {0x1d, 0x30, 0x2b},\n    {0x04, 0x3a, 0x19},\n    {0x08, 0x2d, 0x2e},\n    {0x28, 0x1e, 0x33},\n    {0x0a, 0x12, 0x2e},\n    {0x0d, 0x03, 0x2f},\n    {0x26, 0x3a, 0x1e},\n    {0x35, 0x3b, 0x2a},\n    {0x03, 0x1a, 0x18},\n    {0x3f, 0x0b, 0x27},\n    {0x04, 0x05, 0x34},\n    {0x36, 0x0b, 0x27},\n    {0x3b, 0x17, 0x11},\n    {0x0d, 0x27, 0x26},\n    {0x2c, 0x1f, 0x20},\n    {0x26, 0x10, 0x20},\n    {0x25, 0x23, 0x2d},\n    {0x37, 0x09, 0x13},\n    {0x14, 0x17, 0x2d},\n    {0x2e, 0x3d, 0x23},\n    {0x1d, 0x1a, 0x1f},\n    {0x21, 0x33, 0x2e},\n    {0x28, 0x17, 0x13},\n    {0x26, 0x3c, 0x36},\n    {0x14, 0x1a, 0x33},\n    {0x32, 0x20, 0x2b},\n    {0x19, 0x3e, 0x20},\n    {0x0c, 0x02, 0x2d},\n    {0x3c, 0x3c, 0x2a},\n    {0x30, 0x30, 0x28},\n    {0x25, 0x3f, 0x1e},\n    {0x03, 0x17, 0x1e},\n    {0x35, 0x11, 0x1c},\n    {0x1b, 0x14, 0x2a},\n    {0x28, 0x3a, 0x23},\n    {0x0e, 0x1f, 0x12},\n    {0x36, 0x21, 0x20},\n    {0x07, 0x3b, 0x10},\n    {0x23, 0x19, 0x34},\n    {0x0d, 0x2e, 0x18},\n    {0x3f, 0x20, 0x25},\n    {0x3e, 0x3b, 0x15},\n    {0x0b, 0x2e, 0x12},\n    {0x37, 0x0b, 0x23},\n    {0x3d, 0x32, 0x1f},\n    {0x16, 0x03, 0x27},\n    {0x14, 0x0c, 0x21},\n    {0x18, 0x03, 0x30},\n    {0x3e, 0x21, 0x13},\n    {0x0f, 0x00, 0x32},\n    {0x3f, 0x23, 0x16},\n    {0x0e, 0x31, 0x1d},\n    {0x18, 0x1c, 0x1d},\n    {0x30, 0x0e, 0x1e},\n    {0x21, 0x20, 0x23},\n    {0x3f, 0x0c, 0x1e},\n    {0x14, 0x33, 0x22},\n    {0x22, 0x21, 0x15},\n    {0x36, 0x05, 0x1e},\n    {0x1d, 0x31, 0x14},\n    {0x20, 0x11, 0x37},\n    {0x0d, 0x33, 0x19},\n    {0x25, 0x05, 0x36},\n    {0x1e, 0x31, 0x20},\n    {0x35, 0x3a, 0x2f},\n    {0x32, 0x2f, 0x30},\n    {0x14, 0x23, 0x2d},\n    {0x35, 0x1e, 0x29},\n    {0x05, 0x05, 0x1b},\n    {0x09, 0x1f, 0x26},\n    {0x2f, 0x0b, 0x15},\n    {0x15, 0x11, 0x13},\n    {0x29, 0x1b, 0x18},\n    {0x1c, 0x13, 0x35},\n    {0x34, 0x31, 0x23},\n    {0x27, 0x3f, 0x2f},\n    {0x09, 0x30, 0x19},\n    {0x23, 0x12, 0x34},\n    {0x02, 0x2a, 0x21},\n    {0x09, 0x3c, 0x1d},\n    {0x0c, 0x02, 0x10},\n    {0x22, 0x05, 0x17},\n    {0x22, 0x08, 0x1b},\n    {0x0a, 0x0f, 0x15},\n    {0x02, 0x11, 0x13},\n    {0x01, 0x21, 0x22},\n    {0x16, 0x39, 0x33},\n    {0x24, 0x38, 0x34},\n    {0x0f, 0x1e, 0x2b},\n    {0x2b, 0x15, 0x15},\n    {0x20, 0x22, 0x2e},\n    {0x3a, 0x3f, 0x31},\n    {0x1a, 0x27, 0x2b},\n    {0x29, 0x34, 0x14},\n    {0x16, 0x39, 0x2f},\n    {0x13, 0x3e, 0x16},\n    {0x36, 0x21, 0x30},\n    {0x00, 0x24, 0x2b},\n    {0x24, 0x21, 0x30},\n    {0x15, 0x31, 0x13},\n    {0x10, 0x37, 0x24},\n    {0x08, 0x07, 0x23},\n    {0x21, 0x09, 0x25},\n    {0x05, 0x3c, 0x32},\n    {0x19, 0x03, 0x25},\n    {0x0f, 0x29, 0x2b},\n    {0x16, 0x07, 0x13},\n    {0x3e, 0x3d, 0x25},\n    {0x36, 0x0b, 0x28},\n    {0x2e, 0x2b, 0x16},\n    {0x0c, 0x31, 0x11},\n    {0x30, 0x13, 0x2d},\n    {0x26, 0x3e, 0x37},\n    {0x29, 0x2f, 0x2e},\n    {0x15, 0x3d, 0x17},\n    {0x1c, 0x2e, 0x21},\n    {0x33, 0x2f, 0x10},\n    {0x0d, 0x05, 0x1d},\n    {0x1c, 0x1a, 0x12},\n    {0x0e, 0x18, 0x37},\n    {0x1b, 0x11, 0x14},\n    {0x06, 0x14, 0x21},\n    {0x31, 0x0e, 0x27},\n    {0x1a, 0x03, 0x10},\n    {0x00, 0x34, 0x31},\n    {0x3f, 0x0b, 0x1d},\n    {0x0f, 0x12, 0x1f},\n    {0x1a, 0x15, 0x10},\n    {0x0f, 0x00, 0x24},\n    {0x3e, 0x0a, 0x2a},\n    {0x30, 0x2b, 0x24},\n    {0x26, 0x31, 0x10},\n    {0x2d, 0x2f, 0x2f},\n    {0x3f, 0x0c, 0x13},\n    {0x12, 0x0b, 0x16},\n    {0x15, 0x07, 0x1f},\n    {0x28, 0x10, 0x32},\n    {0x0f, 0x17, 0x15},\n    {0x0b, 0x27, 0x33},\n    {0x34, 0x1d, 0x10},\n    {0x1c, 0x3a, 0x12},\n    {0x2c, 0x27, 0x37},\n    {0x0a, 0x1a, 0x32},\n    {0x05, 0x1f, 0x21},\n    {0x24, 0x0d, 0x1f},\n    {0x1c, 0x17, 0x24},\n    {0x2f, 0x3b, 0x32},\n    {0x3b, 0x25, 0x10},\n    {0x03, 0x2f, 0x21},\n    {0x0c, 0x10, 0x23},\n    {0x0e, 0x3a, 0x2c},\n    {0x33, 0x03, 0x2c},\n    {0x12, 0x06, 0x1c},\n    {0x2a, 0x37, 0x30},\n    {0x3f, 0x01, 0x1e},\n    {0x35, 0x16, 0x37},\n    {0x2c, 0x32, 0x35},\n    {0x05, 0x11, 0x22},\n    {0x29, 0x09, 0x20},\n    {0x2b, 0x0d, 0x1f},\n    {0x18, 0x0d, 0x20},\n    {0x23, 0x39, 0x16},\n    {0x0f, 0x3a, 0x18},\n    {0x21, 0x35, 0x2b},\n    {0x36, 0x26, 0x2b},\n    {0x23, 0x05, 0x2f},\n    {0x1b, 0x08, 0x17},\n    {0x3e, 0x09, 0x16},\n    {0x2d, 0x3a, 0x37},\n    {0x15, 0x35, 0x35},\n    {0x29, 0x0a, 0x12},\n    {0x02, 0x39, 0x1f},\n    {0x14, 0x34, 0x33},\n    {0x17, 0x1d, 0x18},\n    {0x16, 0x1d, 0x1a},\n    {0x01, 0x39, 0x22},\n    {0x1e, 0x27, 0x36},\n    {0x32, 0x14, 0x26},\n    {0x0a, 0x39, 0x36},\n    {0x1f, 0x0d, 0x1e},\n    {0x0b, 0x0a, 0x19},\n    {0x35, 0x1d, 0x34},\n    {0x03, 0x12, 0x16},\n    {0x0c, 0x13, 0x2e},\n    {0x0c, 0x34, 0x1e},\n    {0x10, 0x14, 0x1e},\n    {0x23, 0x32, 0x27},\n    {0x02, 0x10, 0x29},\n    {0x35, 0x18, 0x33},\n    {0x33, 0x1d, 0x1a},\n    {0x3c, 0x15, 0x23},\n    {0x3e, 0x3f, 0x22},\n    {0x2a, 0x02, 0x2c},\n    {0x28, 0x0a, 0x2f},\n    {0x1a, 0x06, 0x35},\n    {0x3c, 0x17, 0x2b},\n    {0x03, 0x12, 0x17},\n    {0x2f, 0x0a, 0x26},\n    {0x12, 0x38, 0x11},\n    {0x36, 0x1b, 0x23},\n    {0x01, 0x39, 0x35},\n    {0x19, 0x19, 0x17},\n    {0x09, 0x28, 0x22},\n    {0x1e, 0x27, 0x2c},\n    {0x35, 0x33, 0x2c},\n    {0x27, 0x25, 0x31},\n    {0x06, 0x31, 0x2d},\n    {0x1a, 0x39, 0x28},\n    {0x2d, 0x04, 0x1e},\n    {0x24, 0x3e, 0x1c},\n    {0x3c, 0x30, 0x1b},\n    {0x3f, 0x3e, 0x37},\n    {0x22, 0x36, 0x11},\n    {0x00, 0x01, 0x1c},\n    {0x12, 0x1a, 0x10},\n    {0x12, 0x1e, 0x2c},\n    {0x1f, 0x12, 0x2a},\n    {0x2f, 0x06, 0x19},\n    {0x35, 0x1a, 0x18},\n    {0x3b, 0x09, 0x36},\n    {0x34, 0x1d, 0x13},\n    {0x02, 0x07, 0x10},\n    {0x20, 0x2f, 0x1d},\n    {0x0b, 0x03, 0x33},\n    {0x1c, 0x16, 0x31},\n    {0x05, 0x13, 0x1b},\n    {0x29, 0x06, 0x13},\n    {0x30, 0x2d, 0x36},\n    {0x2a, 0x2d, 0x2c},\n    {0x19, 0x34, 0x1c},\n    {0x0f, 0x15, 0x12},\n    {0x36, 0x15, 0x2c},\n    {0x3a, 0x06, 0x1c},\n    {0x12, 0x1d, 0x26},\n    {0x03, 0x38, 0x1d},\n    {0x01, 0x01, 0x2d},\n    {0x17, 0x2e, 0x10},\n    {0x14, 0x17, 0x1c},\n    {0x34, 0x0f, 0x28},\n    {0x09, 0x37, 0x1b},\n    {0x28, 0x1d, 0x26},\n    {0x29, 0x2d, 0x36},\n    {0x1e, 0x17, 0x28},\n    {0x15, 0x0f, 0x1c},\n    {0x20, 0x2d, 0x10},\n    {0x27, 0x16, 0x2e},\n    {0x14, 0x09, 0x12},\n    {0x3b, 0x3d, 0x21},\n    {0x25, 0x1a, 0x2c},\n    {0x00, 0x22, 0x36},\n    {0x0d, 0x30, 0x10},\n    {0x17, 0x19, 0x1b},\n    {0x00, 0x3b, 0x21},\n    {0x2a, 0x28, 0x34},\n    {0x2d, 0x0f, 0x16},\n    {0x0a, 0x30, 0x28},\n    {0x06, 0x00, 0x25},\n    {0x31, 0x2e, 0x2a},\n    {0x14, 0x33, 0x28},\n    {0x36, 0x10, 0x2e},\n    {0x05, 0x2e, 0x19},\n    {0x19, 0x1a, 0x15},\n    {0x2c, 0x14, 0x17},\n    {0x37, 0x0f, 0x13},\n    {0x32, 0x17, 0x1b},\n    {0x39, 0x18, 0x32},\n    {0x2e, 0x32, 0x1e},\n    {0x24, 0x1d, 0x31},\n    {0x12, 0x1d, 0x2b},\n    {0x14, 0x0c, 0x27},\n    {0x36, 0x2e, 0x32},\n    {0x06, 0x0a, 0x1a},\n    {0x28, 0x28, 0x20},\n    {0x3a, 0x3a, 0x17},\n    {0x08, 0x27, 0x36},\n    {0x18, 0x1a, 0x10},\n    {0x1e, 0x26, 0x1b},\n    {0x1f, 0x33, 0x1f},\n    {0x21, 0x17, 0x2f},\n    {0x01, 0x08, 0x20},\n    {0x35, 0x03, 0x19},\n    {0x3b, 0x02, 0x20},\n    {0x02, 0x2d, 0x23},\n    {0x0e, 0x17, 0x32},\n    {0x31, 0x29, 0x11},\n    {0x22, 0x17, 0x22},\n    {0x3a, 0x2c, 0x23},\n    {0x34, 0x20, 0x18},\n    {0x00, 0x3a, 0x22},\n    {0x25, 0x33, 0x21},\n    {0x33, 0x04, 0x27},\n    {0x04, 0x18, 0x32},\n    {0x2c, 0x0c, 0x2f},\n    {0x28, 0x14, 0x2c},\n    {0x3f, 0x30, 0x2b},\n    {0x30, 0x21, 0x1d},\n    {0x01, 0x25, 0x32},\n    {0x05, 0x23, 0x34},\n    {0x24, 0x10, 0x30},\n    {0x3d, 0x14, 0x1b},\n    {0x3f, 0x38, 0x2f},\n    {0x22, 0x1b, 0x32},\n    {0x25, 0x07, 0x37},\n    {0x0a, 0x0c, 0x1d},\n    {0x03, 0x1e, 0x1a},\n    {0x0f, 0x3c, 0x12},\n    {0x11, 0x18, 0x1d},\n    {0x00, 0x35, 0x2f},\n    {0x32, 0x18, 0x14},\n    {0x23, 0x30, 0x1b},\n    {0x11, 0x3d, 0x12},\n    {0x1a, 0x16, 0x35},\n    {0x28, 0x05, 0x24},\n    {0x17, 0x3d, 0x37},\n    {0x2e, 0x09, 0x2e},\n    {0x18, 0x1d, 0x17},\n    {0x20, 0x1f, 0x18},\n    {0x23, 0x2c, 0x2f},\n    {0x20, 0x3f, 0x16},\n    {0x3f, 0x29, 0x2e},\n    {0x23, 0x3b, 0x29},\n    {0x18, 0x39, 0x13},\n    {0x1e, 0x32, 0x35},\n    {0x14, 0x1d, 0x2a},\n    {0x35, 0x01, 0x1d},\n    {0x3e, 0x3b, 0x1e},\n    {0x22, 0x1e, 0x16},\n    {0x18, 0x22, 0x12},\n    {0x3e, 0x29, 0x33},\n    {0x2f, 0x14, 0x19},\n    {0x3b, 0x07, 0x15},\n    {0x06, 0x3d, 0x29},\n    {0x35, 0x37, 0x23},\n    {0x34, 0x1d, 0x2d},\n    {0x18, 0x12, 0x1b},\n    {0x0b, 0x13, 0x24},\n    {0x13, 0x38, 0x1c},\n    {0x1f, 0x0b, 0x1b},\n    {0x13, 0x21, 0x1c},\n    {0x06, 0x39, 0x32},\n    {0x37, 0x3d, 0x26},\n    {0x29, 0x26, 0x15},\n    {0x3c, 0x33, 0x27},\n    {0x00, 0x01, 0x2e},\n    {0x15, 0x18, 0x31},\n    {0x0d, 0x2c, 0x13},\n    {0x27, 0x3b, 0x20},\n    {0x2d, 0x01, 0x26},\n    {0x23, 0x15, 0x30},\n    {0x24, 0x00, 0x17},\n    {0x37, 0x3f, 0x33},\n    {0x25, 0x24, 0x31},\n    {0x06, 0x3b, 0x37},\n    {0x03, 0x18, 0x1a},\n    {0x2c, 0x34, 0x14},\n    {0x1d, 0x36, 0x18},\n    {0x3a, 0x04, 0x23},\n    {0x12, 0x26, 0x15},\n    {0x2b, 0x19, 0x1a},\n    {0x29, 0x2c, 0x36},\n    {0x01, 0x19, 0x1d},\n    {0x2f, 0x06, 0x2b},\n    {0x0c, 0x12, 0x26},\n    {0x36, 0x32, 0x1d},\n    {0x0d, 0x12, 0x28},\n    {0x03, 0x28, 0x13},\n    {0x29, 0x06, 0x17},\n    {0x03, 0x38, 0x21},\n    {0x30, 0x2c, 0x10},\n    {0x22, 0x00, 0x28},\n    {0x24, 0x3b, 0x1c},\n    {0x20, 0x3e, 0x13},\n    {0x02, 0x0c, 0x19},\n    {0x29, 0x2c, 0x1a},\n    {0x39, 0x30, 0x22},\n    {0x2a, 0x1f, 0x22},\n    {0x14, 0x34, 0x2c},\n    {0x14, 0x25, 0x1b},\n    {0x06, 0x3b, 0x15},\n    {0x06, 0x1c, 0x13},\n    {0x15, 0x03, 0x18},\n    {0x1e, 0x2a, 0x1b},\n    {0x17, 0x25, 0x2f},\n    {0x1c, 0x29, 0x2e},\n    {0x02, 0x32, 0x1e},\n    {0x1d, 0x28, 0x35},\n    {0x36, 0x03, 0x34},\n    {0x16, 0x3d, 0x2a},\n    {0x12, 0x0d, 0x13},\n    {0x1d, 0x2d, 0x21},\n    {0x32, 0x17, 0x2e},\n    {0x1a, 0x15, 0x26},\n    {0x22, 0x2f, 0x15},\n    {0x3c, 0x0e, 0x20},\n    {0x2f, 0x27, 0x13},\n    {0x04, 0x09, 0x32},\n    {0x1e, 0x01, 0x34},\n    {0x06, 0x16, 0x1e},\n    {0x2e, 0x1b, 0x1c},\n    {0x28, 0x13, 0x2a},\n    {0x30, 0x34, 0x12},\n    {0x12, 0x32, 0x18},\n    {0x1d, 0x1d, 0x35},\n    {0x07, 0x1c, 0x16},\n    {0x2d, 0x3d, 0x35},\n    {0x1c, 0x1b, 0x24},\n    {0x21, 0x2d, 0x1e},\n    {0x10, 0x09, 0x14},\n    {0x3d, 0x11, 0x12},\n    {0x25, 0x02, 0x26},\n    {0x23, 0x02, 0x19},\n    {0x19, 0x05, 0x14},\n    {0x0b, 0x21, 0x1a},\n    {0x09, 0x02, 0x2c},\n    {0x18, 0x28, 0x2d},\n    {0x1e, 0x10, 0x12},\n    {0x2e, 0x18, 0x2e},\n    {0x1f, 0x02, 0x2c},\n    {0x14, 0x17, 0x24},\n    {0x39, 0x08, 0x32},\n    {0x16, 0x14, 0x22},\n    {0x16, 0x28, 0x21},\n    {0x11, 0x10, 0x2c},\n    {0x23, 0x36, 0x2b},\n    {0x39, 0x21, 0x26},\n    {0x0e, 0x06, 0x2d},\n    {0x3c, 0x3e, 0x26},\n    {0x2a, 0x1b, 0x1f},\n    {0x00, 0x3c, 0x33},\n    {0x35, 0x3f, 0x14},\n    {0x00, 0x0b, 0x10},\n    {0x34, 0x3c, 0x17},\n    {0x2d, 0x07, 0x1f},\n    {0x24, 0x39, 0x27},\n    {0x16, 0x00, 0x1d},\n    {0x33, 0x2b, 0x1e},\n    {0x0f, 0x08, 0x31},\n    {0x3a, 0x09, 0x13},\n    {0x0c, 0x21, 0x1c},\n    {0x2a, 0x17, 0x34},\n    {0x29, 0x27, 0x10},\n    {0x37, 0x1b, 0x18},\n    {0x15, 0x08, 0x2f},\n    {0x1f, 0x16, 0x12},\n    {0x1f, 0x28, 0x34},\n    {0x1c, 0x20, 0x22},\n    {0x12, 0x01, 0x12},\n    {0x21, 0x31, 0x10},\n    {0x22, 0x26, 0x1e},\n    {0x01, 0x3d, 0x11},\n    {0x1e, 0x27, 0x25},\n    {0x3d, 0x30, 0x24},\n    {0x1d, 0x11, 0x22},\n    {0x36, 0x30, 0x16},\n    {0x1f, 0x3e, 0x2a},\n    {0x3c, 0x27, 0x1b},\n    {0x1f, 0x29, 0x10},\n    {0x1e, 0x05, 0x2a},\n    {0x0a, 0x10, 0x14},\n    {0x1f, 0x00, 0x2e},\n    {0x0b, 0x3b, 0x18},\n    {0x0a, 0x39, 0x30},\n    {0x37, 0x0b, 0x1f},\n    {0x1d, 0x0a, 0x29},\n    {0x3e, 0x1c, 0x33},\n    {0x13, 0x2e, 0x28},\n    {0x27, 0x1b, 0x1e},\n    {0x1d, 0x02, 0x1c},\n    {0x01, 0x25, 0x14},\n    {0x3a, 0x10, 0x1c},\n    {0x12, 0x05, 0x2a},\n    {0x30, 0x20, 0x26},\n    {0x2f, 0x2e, 0x2e},\n    {0x03, 0x07, 0x24},\n    {0x36, 0x04, 0x2b},\n    {0x11, 0x25, 0x2d},\n    {0x28, 0x0e, 0x2e},\n    {0x0f, 0x1d, 0x15},\n    {0x1c, 0x28, 0x30},\n    {0x1f, 0x23, 0x26},\n    {0x36, 0x12, 0x37},\n    {0x3a, 0x31, 0x10},\n    {0x2c, 0x2c, 0x2f},\n    {0x1a, 0x0d, 0x15},\n    {0x3f, 0x3c, 0x32},\n    {0x35, 0x1c, 0x16},\n    {0x33, 0x16, 0x28},\n    {0x1d, 0x3f, 0x21},\n    {0x2c, 0x3e, 0x2b},\n    {0x24, 0x23, 0x2f},\n    {0x32, 0x15, 0x2a},\n    {0x1b, 0x10, 0x35},\n    {0x18, 0x37, 0x10},\n    {0x3b, 0x1e, 0x11},\n    {0x2b, 0x16, 0x24},\n    {0x1d, 0x16, 0x26},\n    {0x3c, 0x2d, 0x11},\n    {0x15, 0x28, 0x28},\n    {0x27, 0x27, 0x27},\n    {0x3b, 0x3a, 0x16},\n    {0x1a, 0x0c, 0x1a},\n    {0x15, 0x08, 0x25},\n    {0x0b, 0x10, 0x22},\n    {0x1a, 0x3e, 0x17},\n    {0x28, 0x1f, 0x1e},\n    {0x01, 0x1e, 0x1e},\n    {0x1c, 0x2f, 0x10},\n    {0x25, 0x0b, 0x34},\n    {0x3e, 0x0c, 0x1a},\n    {0x1b, 0x10, 0x2a},\n    {0x0f, 0x14, 0x17},\n    {0x0f, 0x3f, 0x17},\n    {0x03, 0x15, 0x1f},\n    {0x02, 0x36, 0x17},\n    {0x15, 0x1d, 0x18},\n    {0x08, 0x36, 0x10},\n    {0x14, 0x0d, 0x2b},\n    {0x0a, 0x05, 0x1d},\n    {0x26, 0x12, 0x1e},\n    {0x3e, 0x18, 0x19},\n    {0x36, 0x18, 0x37},\n    {0x17, 0x39, 0x2e},\n    {0x0d, 0x04, 0x19},\n    {0x16, 0x22, 0x15},\n    {0x3e, 0x26, 0x1f},\n    {0x00, 0x06, 0x17},\n    {0x33, 0x22, 0x1d},\n    {0x2b, 0x39, 0x2b},\n    {0x3e, 0x31, 0x1c},\n    {0x22, 0x3f, 0x13},\n    {0x30, 0x1c, 0x31},\n    {0x07, 0x2b, 0x14},\n    {0x32, 0x35, 0x1e},\n    {0x02, 0x07, 0x20},\n    {0x0f, 0x3b, 0x11},\n    {0x20, 0x07, 0x12},\n    {0x2a, 0x30, 0x1d},\n    {0x28, 0x38, 0x36},\n    {0x20, 0x01, 0x17},\n    {0x15, 0x20, 0x21},\n    {0x3a, 0x1b, 0x1e},\n    {0x38, 0x12, 0x24},\n    {0x03, 0x3e, 0x1f},\n    {0x29, 0x1d, 0x13},\n    {0x20, 0x27, 0x19},\n    {0x12, 0x25, 0x20},\n    {0x32, 0x33, 0x2b},\n    {0x3f, 0x05, 0x31},\n    {0x35, 0x3c, 0x2d},\n    {0x2d, 0x02, 0x2e},\n    {0x10, 0x2a, 0x16},\n    {0x17, 0x08, 0x31},\n    {0x17, 0x2e, 0x2b},\n    {0x30, 0x1e, 0x15},\n    {0x31, 0x15, 0x26},\n    {0x08, 0x10, 0x33},\n    {0x15, 0x01, 0x27},\n    {0x12, 0x07, 0x2f},\n    {0x29, 0x27, 0x34},\n    {0x3f, 0x08, 0x31},\n    {0x1c, 0x20, 0x1a},\n    {0x33, 0x0c, 0x13},\n    {0x18, 0x31, 0x24},\n    {0x37, 0x2d, 0x2e},\n    {0x21, 0x18, 0x24},\n    {0x3a, 0x27, 0x31},\n    {0x35, 0x3e, 0x30},\n    {0x3a, 0x14, 0x33},\n    {0x0f, 0x1a, 0x2d},\n    {0x30, 0x2e, 0x11},\n    {0x1a, 0x31, 0x1d},\n    {0x17, 0x3c, 0x18},\n    {0x33, 0x31, 0x23},\n    {0x1d, 0x39, 0x2d},\n    {0x10, 0x1d, 0x2f},\n    {0x24, 0x15, 0x1c},\n    {0x25, 0x01, 0x2b},\n    {0x22, 0x16, 0x2e},\n    {0x1b, 0x25, 0x35},\n    {0x37, 0x10, 0x26},\n    {0x39, 0x01, 0x36},\n    {0x17, 0x2b, 0x14},\n    {0x09, 0x16, 0x17},\n    {0x20, 0x28, 0x23},\n    {0x26, 0x3a, 0x26},\n    {0x27, 0x2a, 0x24},\n    {0x36, 0x02, 0x2c},\n    {0x29, 0x30, 0x35},\n    {0x36, 0x01, 0x1f},\n    {0x28, 0x3b, 0x1d},\n    {0x23, 0x1e, 0x2d},\n    {0x11, 0x1e, 0x2c},\n    {0x2f, 0x32, 0x19},\n    {0x3f, 0x26, 0x31},\n    {0x38, 0x1e, 0x17},\n    {0x05, 0x18, 0x2e},\n    {0x00, 0x2e, 0x12},\n    {0x34, 0x3f, 0x34},\n    {0x16, 0x10, 0x29},\n    {0x20, 0x3d, 0x36},\n    {0x2f, 0x16, 0x25},\n    {0x12, 0x17, 0x10},\n    {0x21, 0x37, 0x35},\n    {0x25, 0x37, 0x2d},\n    {0x01, 0x08, 0x27},\n    {0x03, 0x1f, 0x29},\n    {0x0d, 0x2a, 0x16},\n    {0x3a, 0x3f, 0x33},\n    {0x2b, 0x19, 0x1d},\n    {0x2a, 0x1f, 0x29},\n    {0x28, 0x2c, 0x10},\n    {0x28, 0x30, 0x10},\n    {0x39, 0x14, 0x1b},\n    {0x00, 0x18, 0x21},\n    {0x28, 0x0c, 0x37},\n    {0x11, 0x10, 0x11},\n    {0x3c, 0x33, 0x32},\n    {0x33, 0x36, 0x1a},\n    {0x36, 0x00, 0x1c},\n    {0x31, 0x1b, 0x1d},\n    {0x38, 0x1d, 0x10},\n    {0x3c, 0x39, 0x27},\n    {0x3a, 0x3f, 0x14},\n    {0x19, 0x12, 0x14},\n    {0x0d, 0x1f, 0x18},\n    {0x00, 0x25, 0x18},\n    {0x28, 0x1c, 0x32},\n    {0x27, 0x03, 0x1a},\n    {0x26, 0x2d, 0x2a},\n    {0x29, 0x28, 0x27},\n    {0x0a, 0x2a, 0x18},\n    {0x0a, 0x1a, 0x30},\n    {0x20, 0x1a, 0x2e},\n    {0x06, 0x0b, 0x1d},\n    {0x0f, 0x0c, 0x1c},\n    {0x35, 0x28, 0x1c},\n    {0x3d, 0x16, 0x23},\n    {0x21, 0x1c, 0x31},\n    {0x14, 0x1c, 0x2e},\n    {0x22, 0x32, 0x35},\n    {0x09, 0x29, 0x30},\n    {0x20, 0x1a, 0x10},\n    {0x31, 0x3f, 0x2c},\n    {0x0a, 0x3d, 0x37},\n    {0x0b, 0x2e, 0x2d},\n    {0x1f, 0x22, 0x31},\n    {0x06, 0x07, 0x29},\n    {0x22, 0x17, 0x2d},\n    {0x30, 0x11, 0x18},\n    {0x0c, 0x19, 0x15},\n    {0x07, 0x0a, 0x34},\n    {0x18, 0x29, 0x27},\n    {0x33, 0x0c, 0x30},\n    {0x03, 0x1a, 0x37},\n    {0x06, 0x01, 0x2d},\n    {0x0f, 0x3b, 0x2b},\n    {0x11, 0x1f, 0x37},\n    {0x2b, 0x21, 0x36},\n    {0x3f, 0x23, 0x17},\n    {0x17, 0x07, 0x2b},\n    {0x2b, 0x0e, 0x30},\n    {0x11, 0x39, 0x1d},\n    {0x29, 0x03, 0x33},\n    {0x30, 0x03, 0x2f},\n    {0x3c, 0x20, 0x26},\n    {0x03, 0x22, 0x14},\n    {0x3a, 0x28, 0x35},\n    {0x01, 0x28, 0x2b},\n    {0x3e, 0x15, 0x18},\n    {0x30, 0x07, 0x17},\n    {0x3b, 0x2c, 0x30},\n    {0x15, 0x07, 0x2c},\n    {0x17, 0x27, 0x1d},\n    {0x3f, 0x1e, 0x33},\n    {0x0d, 0x17, 0x10},\n    {0x15, 0x0e, 0x30},\n    {0x09, 0x05, 0x30},\n    {0x2d, 0x20, 0x15},\n    {0x3c, 0x3d, 0x30},\n    {0x0c, 0x17, 0x1c},\n    {0x1a, 0x0d, 0x25},\n    {0x2b, 0x2b, 0x2a},\n    {0x02, 0x16, 0x2d},\n    {0x17, 0x31, 0x17},\n    {0x00, 0x08, 0x13},\n    {0x37, 0x35, 0x21},\n    {0x1e, 0x1c, 0x1f},\n    {0x2b, 0x32, 0x1c},\n    {0x10, 0x2a, 0x16},\n    {0x3a, 0x33, 0x31},\n    {0x17, 0x2b, 0x2a},\n    {0x0c, 0x3d, 0x11},\n    {0x28, 0x0a, 0x30},\n    {0x23, 0x0a, 0x26},\n    {0x0a, 0x14, 0x24},\n    {0x0b, 0x0f, 0x30},\n    {0x1b, 0x1e, 0x29},\n    {0x02, 0x35, 0x28},\n    {0x3b, 0x02, 0x14},\n    {0x00, 0x0f, 0x35},\n    {0x1c, 0x3c, 0x2e},\n    {0x28, 0x38, 0x19},\n    {0x1b, 0x11, 0x12},\n    {0x09, 0x16, 0x10},\n    {0x2e, 0x0d, 0x20},\n    {0x3d, 0x04, 0x32},\n    {0x16, 0x2c, 0x25},\n    {0x02, 0x3d, 0x18},\n    {0x0b, 0x13, 0x1c},\n    {0x22, 0x2a, 0x1c},\n    {0x20, 0x27, 0x22},\n    {0x05, 0x26, 0x22},\n    {0x12, 0x1d, 0x2c},\n    {0x08, 0x05, 0x2e},\n    {0x3f, 0x1c, 0x17},\n    {0x24, 0x0d, 0x33},\n    {0x36, 0x08, 0x24},\n    {0x10, 0x22, 0x29},\n    {0x1c, 0x0a, 0x11},\n    {0x25, 0x0f, 0x10},\n    {0x24, 0x38, 0x2f},\n    {0x25, 0x32, 0x1e},\n    {0x06, 0x2a, 0x29},\n    {0x3e, 0x3a, 0x28},\n    {0x34, 0x17, 0x33},\n    {0x18, 0x33, 0x17},\n    {0x07, 0x14, 0x1f},\n    {0x11, 0x17, 0x20},\n    {0x13, 0x0e, 0x14},\n    {0x3b, 0x1c, 0x12},\n    {0x2a, 0x13, 0x37},\n    {0x2a, 0x35, 0x32},\n    {0x30, 0x02, 0x25},\n    {0x00, 0x07, 0x1f},\n    {0x0c, 0x04, 0x2c},\n    {0x37, 0x37, 0x30},\n    {0x25, 0x12, 0x25},\n    {0x12, 0x22, 0x21},\n    {0x22, 0x35, 0x33},\n    {0x07, 0x20, 0x2d},\n    {0x27, 0x0e, 0x30},\n    {0x34, 0x19, 0x1a},\n    {0x0a, 0x3c, 0x25},\n    {0x07, 0x1d, 0x2b},\n    {0x31, 0x3a, 0x12},\n    {0x1a, 0x3d, 0x37},\n    {0x16, 0x15, 0x16},\n    {0x39, 0x13, 0x15},\n    {0x2d, 0x03, 0x2e},\n    {0x06, 0x39, 0x2c},\n    {0x16, 0x00, 0x13},\n    {0x35, 0x2a, 0x35},\n    {0x24, 0x01, 0x18},\n    {0x24, 0x37, 0x28},\n    {0x25, 0x1b, 0x34},\n    {0x25, 0x19, 0x17},\n    {0x27, 0x2f, 0x1b},\n    {0x27, 0x0d, 0x10},\n    {0x36, 0x3c, 0x30},\n    {0x3c, 0x33, 0x23},\n    {0x3e, 0x27, 0x1e},\n    {0x25, 0x2d, 0x29},\n    {0x1f, 0x12, 0x21},\n    {0x37, 0x32, 0x1f},\n    {0x11, 0x21, 0x35},\n    {0x30, 0x0c, 0x19},\n    {0x25, 0x3d, 0x26},\n    {0x17, 0x02, 0x1d},\n    {0x14, 0x2e, 0x11},\n    {0x38, 0x13, 0x30},\n    {0x0a, 0x2b, 0x20},\n    {0x1e, 0x10, 0x15},\n    {0x37, 0x30, 0x2e},\n    {0x1e, 0x04, 0x2c},\n    {0x14, 0x34, 0x19},\n    {0x08, 0x14, 0x18},\n    {0x0e, 0x1c, 0x30},\n    {0x1a, 0x2e, 0x1b},\n    {0x1f, 0x39, 0x31},\n    {0x0c, 0x1c, 0x28},\n    {0x3e, 0x33, 0x23},\n    {0x0f, 0x13, 0x16},\n    {0x25, 0x39, 0x2f},\n    {0x14, 0x1b, 0x1a},\n    {0x28, 0x3e, 0x21},\n    {0x2d, 0x19, 0x11},\n    {0x0c, 0x34, 0x32},\n    {0x39, 0x31, 0x19},\n    {0x1a, 0x08, 0x34},\n    {0x09, 0x2f, 0x11},\n    {0x30, 0x04, 0x1c},\n    {0x02, 0x3b, 0x1b},\n    {0x33, 0x21, 0x33},\n    {0x38, 0x02, 0x1a},\n    {0x31, 0x38, 0x32},\n    {0x1f, 0x1d, 0x16},\n    {0x17, 0x10, 0x1b},\n    {0x32, 0x20, 0x17},\n    {0x00, 0x33, 0x12},\n    {0x21, 0x0f, 0x27},\n    {0x14, 0x19, 0x27},\n    {0x24, 0x2c, 0x37},\n    {0x25, 0x05, 0x2f},\n    {0x3d, 0x25, 0x11},\n    {0x12, 0x30, 0x1a},\n    {0x16, 0x03, 0x1a},\n    {0x14, 0x09, 0x13},\n    {0x02, 0x23, 0x22},\n    {0x01, 0x3c, 0x10},\n    {0x3f, 0x2d, 0x23},\n    {0x31, 0x3f, 0x23},\n    {0x17, 0x00, 0x33},\n    {0x3f, 0x0f, 0x2f},\n    {0x26, 0x07, 0x15},\n    {0x21, 0x2b, 0x2a},\n    {0x38, 0x39, 0x1e},\n    {0x09, 0x25, 0x2b},\n    {0x3b, 0x30, 0x25},\n    {0x12, 0x2d, 0x13},\n    {0x32, 0x19, 0x28},\n    {0x24, 0x1c, 0x2d},\n    {0x35, 0x32, 0x26},\n    {0x0d, 0x23, 0x1e},\n    {0x1d, 0x07, 0x21},\n    {0x0b, 0x34, 0x17},\n    {0x2d, 0x32, 0x32},\n    {0x3a, 0x3c, 0x35},\n    {0x1a, 0x10, 0x33},\n    {0x1a, 0x07, 0x22},\n    {0x3b, 0x1b, 0x2a},\n    {0x33, 0x1f, 0x26},\n    {0x0e, 0x35, 0x1a},\n    {0x3b, 0x0a, 0x1c},\n    {0x11, 0x07, 0x11},\n    {0x0d, 0x3c, 0x2d},\n    {0x1e, 0x37, 0x29},\n    {0x11, 0x05, 0x12},\n    {0x15, 0x2f, 0x1c},\n    {0x24, 0x31, 0x16},\n    {0x2b, 0x21, 0x1b},\n    {0x23, 0x10, 0x31},\n    {0x02, 0x14, 0x29},\n    {0x26, 0x20, 0x16},\n    {0x10, 0x17, 0x10},\n    {0x0b, 0x0f, 0x33},\n    {0x01, 0x2e, 0x14},\n    {0x21, 0x0e, 0x37},\n    {0x1a, 0x1d, 0x2f},\n    {0x1e, 0x30, 0x24},\n    {0x04, 0x14, 0x2d},\n    {0x11, 0x00, 0x30},\n    {0x08, 0x2a, 0x1d},\n    {0x1d, 0x22, 0x21},\n    {0x24, 0x2c, 0x37},\n    {0x24, 0x11, 0x12},\n    {0x04, 0x2e, 0x28},\n    {0x1d, 0x18, 0x23},\n    {0x3c, 0x16, 0x16},\n    {0x10, 0x17, 0x31},\n    {0x20, 0x21, 0x12},\n    {0x33, 0x3e, 0x34},\n    {0x06, 0x13, 0x13},\n    {0x17, 0x38, 0x2b},\n    {0x14, 0x0d, 0x15},\n    {0x24, 0x3b, 0x2b},\n    {0x34, 0x3b, 0x1e},\n    {0x18, 0x07, 0x34},\n    {0x37, 0x1d, 0x1f},\n    {0x0b, 0x29, 0x20},\n    {0x12, 0x1e, 0x1d},\n    {0x1a, 0x24, 0x24},\n    {0x3d, 0x28, 0x24},\n    {0x0b, 0x12, 0x33},\n    {0x1b, 0x3a, 0x22},\n    {0x14, 0x13, 0x2a},\n    {0x31, 0x38, 0x15},\n    {0x37, 0x2b, 0x2e},\n    {0x19, 0x1e, 0x2c},\n    {0x3f, 0x1b, 0x2a},\n    {0x33, 0x1f, 0x33},\n    {0x3f, 0x15, 0x29},\n    {0x01, 0x1e, 0x18},\n    {0x1f, 0x22, 0x19},\n    {0x33, 0x3c, 0x34},\n    {0x1e, 0x12, 0x22},\n    {0x0d, 0x37, 0x2c},\n    {0x0f, 0x08, 0x31},\n    {0x2e, 0x09, 0x36},\n    {0x01, 0x05, 0x1e},\n    {0x1c, 0x04, 0x1e},\n    {0x0c, 0x01, 0x1c},\n    {0x29, 0x28, 0x2f},\n    {0x39, 0x2d, 0x14},\n    {0x09, 0x22, 0x36},\n    {0x04, 0x37, 0x37},\n    {0x2d, 0x2f, 0x35},\n    {0x24, 0x23, 0x1b},\n    {0x08, 0x20, 0x32},\n    {0x20, 0x1f, 0x34},\n    {0x02, 0x31, 0x19},\n    {0x18, 0x13, 0x36},\n    {0x06, 0x2b, 0x1e},\n    {0x0e, 0x1b, 0x10},\n    {0x2f, 0x0e, 0x1c},\n    {0x11, 0x38, 0x13},\n    {0x01, 0x37, 0x19},\n    {0x14, 0x11, 0x26},\n    {0x31, 0x3d, 0x33},\n    {0x1d, 0x1b, 0x34},\n    {0x25, 0x31, 0x2f},\n    {0x11, 0x0a, 0x2f},\n    {0x39, 0x17, 0x1b},\n    {0x05, 0x0e, 0x13},\n    {0x29, 0x25, 0x22},\n    {0x15, 0x0d, 0x20},\n    {0x2b, 0x27, 0x21},\n    {0x3e, 0x24, 0x27},\n    {0x2a, 0x2b, 0x16},\n    {0x24, 0x3d, 0x15},\n    {0x15, 0x30, 0x31},\n    {0x0f, 0x33, 0x24},\n    {0x06, 0x16, 0x13},\n    {0x06, 0x31, 0x10},\n    {0x2e, 0x3f, 0x10},\n    {0x05, 0x0d, 0x2f},\n    {0x3c, 0x1f, 0x19},\n    {0x12, 0x13, 0x24},\n    {0x0f, 0x33, 0x36},\n    {0x15, 0x3b, 0x33},\n    {0x03, 0x0f, 0x2a},\n    {0x3b, 0x3c, 0x2c},\n    {0x36, 0x09, 0x29},\n    {0x11, 0x3b, 0x27},\n    {0x28, 0x2b, 0x31},\n    {0x1a, 0x0e, 0x2f},\n    {0x39, 0x2c, 0x31},\n    {0x0e, 0x3c, 0x35},\n    {0x2c, 0x24, 0x33},\n    {0x3d, 0x11, 0x2b},\n    {0x07, 0x3c, 0x37},\n    {0x14, 0x18, 0x13},\n    {0x1d, 0x3f, 0x2e},\n    {0x30, 0x12, 0x25},\n    {0x26, 0x1d, 0x11},\n    {0x07, 0x11, 0x1e},\n    {0x34, 0x01, 0x11},\n    {0x0b, 0x39, 0x21},\n    {0x29, 0x02, 0x29},\n    {0x15, 0x10, 0x1a},\n    {0x30, 0x1f, 0x35},\n    {0x3c, 0x2b, 0x2a},\n    {0x30, 0x3b, 0x36},\n    {0x20, 0x1a, 0x23},\n    {0x32, 0x24, 0x2b},\n    {0x15, 0x20, 0x1c},\n    {0x25, 0x3d, 0x36},\n    {0x2d, 0x14, 0x31},\n    {0x18, 0x23, 0x17},\n    {0x18, 0x05, 0x13},\n    {0x34, 0x30, 0x37},\n    {0x0e, 0x39, 0x23},\n    {0x1d, 0x1f, 0x17},\n    {0x01, 0x15, 0x2f},\n    {0x0b, 0x3e, 0x1b},\n    {0x0d, 0x19, 0x2e},\n    {0x31, 0x38, 0x1c},\n    {0x15, 0x34, 0x15},\n    {0x13, 0x19, 0x29},\n    {0x19, 0x14, 0x27},\n    {0x15, 0x18, 0x23},\n    {0x29, 0x0c, 0x27},\n    {0x2d, 0x0e, 0x17},\n    {0x34, 0x18, 0x10},\n    {0x3b, 0x1e, 0x29},\n    {0x34, 0x2c, 0x22},\n    {0x31, 0x08, 0x13},\n    {0x1d, 0x18, 0x1a},\n    {0x1c, 0x0b, 0x2a},\n    {0x19, 0x1e, 0x1a},\n    {0x23, 0x27, 0x17},\n    {0x3b, 0x0e, 0x37},\n    {0x19, 0x2b, 0x16},\n    {0x2f, 0x08, 0x21},\n    {0x37, 0x02, 0x20},\n    {0x0b, 0x32, 0x30},\n    {0x16, 0x05, 0x30},\n    {0x13, 0x05, 0x1a},\n    {0x07, 0x39, 0x19},\n    {0x0c, 0x3b, 0x2a},\n    {0x15, 0x05, 0x30},\n    {0x30, 0x05, 0x19},\n    {0x13, 0x00, 0x12},\n    {0x27, 0x16, 0x2a},\n    {0x0f, 0x28, 0x27},\n    {0x0c, 0x23, 0x2f},\n    {0x39, 0x28, 0x2a},\n    {0x24, 0x25, 0x1f},\n    {0x18, 0x29, 0x14},\n    {0x16, 0x05, 0x1a},\n    {0x35, 0x2f, 0x26},\n    {0x0a, 0x3a, 0x29},\n    {0x34, 0x2c, 0x36},\n    {0x2e, 0x3a, 0x15},\n    {0x1a, 0x0a, 0x2d},\n    {0x16, 0x14, 0x2e},\n    {0x35, 0x28, 0x2a},\n    {0x35, 0x0f, 0x11},\n    {0x11, 0x32, 0x19},\n    {0x20, 0x1a, 0x28},\n    {0x17, 0x1a, 0x28},\n    {0x16, 0x33, 0x25},\n    {0x13, 0x2c, 0x29},\n    {0x09, 0x16, 0x33},\n    {0x1d, 0x27, 0x26},\n    {0x15, 0x0c, 0x2f},\n    {0x22, 0x1c, 0x19},\n    {0x29, 0x33, 0x10},\n    {0x2d, 0x11, 0x1b},\n    {0x16, 0x19, 0x2e},\n    {0x0d, 0x0c, 0x28},\n    {0x37, 0x3a, 0x34},\n    {0x2a, 0x1d, 0x37},\n    {0x30, 0x0a, 0x36},\n    {0x24, 0x39, 0x1b},\n    {0x39, 0x0a, 0x32},\n    {0x11, 0x03, 0x2d},\n    {0x32, 0x1d, 0x30},\n    {0x38, 0x1e, 0x27},\n    {0x2e, 0x17, 0x18},\n    {0x16, 0x17, 0x2a},\n    {0x36, 0x3b, 0x31},\n    {0x17, 0x04, 0x19},\n    {0x3a, 0x25, 0x2d},\n    {0x00, 0x36, 0x27},\n    {0x25, 0x12, 0x33},\n    {0x06, 0x0a, 0x14},\n    {0x11, 0x05, 0x2f},\n    {0x03, 0x35, 0x2f},\n    {0x0b, 0x34, 0x29},\n    {0x00, 0x31, 0x13},\n    {0x27, 0x0f, 0x1c},\n    {0x1d, 0x06, 0x2d},\n    {0x1c, 0x30, 0x27},\n    {0x2f, 0x2a, 0x27},\n    {0x16, 0x20, 0x31},\n    {0x33, 0x2b, 0x2b},\n    {0x05, 0x30, 0x36},\n    {0x29, 0x23, 0x35},\n    {0x10, 0x16, 0x2f},\n    {0x2d, 0x20, 0x29},\n    {0x37, 0x13, 0x24},\n    {0x2d, 0x0e, 0x25},\n    {0x08, 0x0a, 0x18},\n    {0x0f, 0x03, 0x1b},\n    {0x31, 0x0c, 0x37},\n    {0x1e, 0x34, 0x31},\n    {0x1b, 0x0e, 0x25},\n    {0x1a, 0x07, 0x34},\n    {0x0d, 0x3c, 0x33},\n    {0x00, 0x3a, 0x36},\n    {0x04, 0x27, 0x12},\n    {0x23, 0x18, 0x24},\n    {0x0d, 0x0b, 0x18},\n    {0x31, 0x32, 0x37},\n    {0x00, 0x0d, 0x21},\n    {0x32, 0x10, 0x12},\n    {0x26, 0x0d, 0x19},\n    {0x29, 0x24, 0x2b},\n    {0x3d, 0x21, 0x1f},\n    {0x1e, 0x1b, 0x28},\n    {0x0d, 0x12, 0x28},\n    {0x35, 0x1e, 0x23},\n    {0x0a, 0x2e, 0x22},\n    {0x27, 0x27, 0x35},\n    {0x01, 0x0e, 0x20},\n    {0x31, 0x39, 0x29},\n    {0x3b, 0x24, 0x36},\n    {0x14, 0x10, 0x33},\n    {0x18, 0x2c, 0x26},\n    {0x04, 0x2d, 0x15},\n    {0x1a, 0x11, 0x37},\n    {0x0f, 0x0b, 0x14},\n    {0x0e, 0x2c, 0x2c},\n    {0x21, 0x17, 0x2c},\n    {0x16, 0x21, 0x35},\n    {0x3e, 0x10, 0x10},\n    {0x0a, 0x05, 0x1e},\n    {0x3b, 0x09, 0x13},\n    {0x26, 0x18, 0x1e},\n    {0x23, 0x0c, 0x1a},\n    {0x33, 0x37, 0x1f},\n    {0x09, 0x12, 0x35},\n    {0x3d, 0x0d, 0x15},\n    {0x36, 0x06, 0x24},\n    {0x33, 0x30, 0x29},\n    {0x3b, 0x0f, 0x28},\n    {0x34, 0x2a, 0x2c},\n    {0x02, 0x12, 0x35},\n    {0x09, 0x22, 0x31},\n    {0x3b, 0x31, 0x1c},\n    {0x33, 0x22, 0x27},\n    {0x3d, 0x34, 0x15},\n    {0x14, 0x22, 0x28},\n    {0x28, 0x10, 0x1e},\n    {0x21, 0x31, 0x10},\n    {0x2d, 0x16, 0x21},\n    {0x1e, 0x05, 0x33},\n    {0x0f, 0x30, 0x31},\n    {0x0e, 0x1a, 0x35},\n    {0x38, 0x2e, 0x28},\n    {0x26, 0x37, 0x1e},\n    {0x2b, 0x13, 0x33},\n    {0x1f, 0x1e, 0x37},\n    {0x0a, 0x28, 0x24},\n    {0x32, 0x1c, 0x1a},\n    {0x1f, 0x3f, 0x19},\n    {0x39, 0x39, 0x29},\n    {0x2c, 0x1b, 0x14},\n    {0x15, 0x2a, 0x17},\n    {0x32, 0x0f, 0x21},\n    {0x30, 0x21, 0x18},\n    {0x23, 0x2a, 0x27},\n    {0x3d, 0x07, 0x10},\n    {0x0b, 0x3f, 0x2f},\n    {0x31, 0x02, 0x2e},\n    {0x08, 0x39, 0x2f},\n    {0x3f, 0x20, 0x18},\n    {0x2d, 0x34, 0x11},\n    {0x2e, 0x34, 0x10},\n    {0x26, 0x12, 0x23},\n    {0x25, 0x0a, 0x37},\n    {0x34, 0x09, 0x25},\n    {0x0a, 0x3e, 0x16},\n    {0x1a, 0x17, 0x11},\n    {0x38, 0x1c, 0x20},\n    {0x11, 0x21, 0x26},\n    {0x05, 0x0f, 0x18},\n    {0x26, 0x2b, 0x32},\n    {0x0a, 0x0c, 0x16},\n    {0x03, 0x29, 0x1d},\n    {0x29, 0x3b, 0x23},\n    {0x16, 0x1b, 0x29},\n    {0x07, 0x09, 0x17},\n    {0x17, 0x2c, 0x1c},\n    {0x35, 0x33, 0x30},\n    {0x17, 0x12, 0x1e},\n    {0x3d, 0x1a, 0x2b},\n    {0x21, 0x1d, 0x10},\n    {0x0a, 0x08, 0x17},\n    {0x14, 0x3c, 0x36},\n    {0x28, 0x36, 0x36},\n    {0x3b, 0x20, 0x1b},\n    {0x13, 0x22, 0x1d},\n    {0x13, 0x3a, 0x15},\n    {0x02, 0x23, 0x2c},\n    {0x3e, 0x19, 0x14},\n    {0x39, 0x3c, 0x1a},\n    {0x10, 0x08, 0x1e},\n    {0x0a, 0x13, 0x29},\n    {0x3f, 0x38, 0x2c},\n    {0x07, 0x23, 0x1f},\n    {0x19, 0x2a, 0x24},\n    {0x14, 0x3c, 0x1f},\n    {0x0d, 0x04, 0x37},\n    {0x1a, 0x2f, 0x28},\n    {0x2a, 0x1d, 0x1e},\n    {0x11, 0x37, 0x29},\n    {0x28, 0x27, 0x12},\n    {0x0d, 0x00, 0x26},\n    {0x0a, 0x3c, 0x26},\n    {0x1f, 0x1c, 0x33},\n    {0x04, 0x3a, 0x2c},\n    {0x24, 0x3d, 0x2b},\n    {0x26, 0x31, 0x2f},\n    {0x13, 0x1c, 0x21},\n    {0x3e, 0x12, 0x23},\n    {0x36, 0x0a, 0x1a},\n    {0x2d, 0x1e, 0x19},\n    {0x05, 0x1f, 0x1b},\n    {0x1e, 0x0a, 0x1f},\n    {0x20, 0x08, 0x24},\n    {0x2c, 0x0c, 0x33},\n    {0x1d, 0x1f, 0x11},\n    {0x0e, 0x12, 0x10},\n    {0x27, 0x12, 0x19},\n    {0x2a, 0x13, 0x31},\n    {0x1c, 0x04, 0x30},\n    {0x1a, 0x38, 0x1f},\n    {0x2c, 0x35, 0x25},\n    {0x07, 0x0b, 0x33},\n    {0x2d, 0x02, 0x1a},\n    {0x2a, 0x35, 0x35},\n    {0x16, 0x2f, 0x14},\n    {0x11, 0x31, 0x33},\n    {0x2c, 0x31, 0x1e},\n    {0x3c, 0x3a, 0x27},\n    {0x3c, 0x2b, 0x12},\n    {0x27, 0x1d, 0x12},\n    {0x36, 0x2c, 0x2b},\n    {0x25, 0x3b, 0x35},\n    {0x12, 0x3d, 0x27},\n    {0x13, 0x23, 0x19},\n    {0x33, 0x2c, 0x26},\n    {0x09, 0x3c, 0x12},\n    {0x15, 0x1a, 0x23},\n    {0x21, 0x07, 0x1a},\n    {0x22, 0x25, 0x20},\n    {0x19, 0x1b, 0x2c},\n    {0x3a, 0x19, 0x35},\n    {0x05, 0x26, 0x1d},\n    {0x23, 0x22, 0x25},\n    {0x0e, 0x1e, 0x11},\n    {0x13, 0x30, 0x12},\n    {0x2c, 0x22, 0x25},\n    {0x0a, 0x1d, 0x18},\n    {0x23, 0x3e, 0x1d},\n    {0x02, 0x28, 0x25},\n    {0x21, 0x0e, 0x20},\n    {0x21, 0x22, 0x37},\n    {0x18, 0x33, 0x27},\n    {0x23, 0x23, 0x31},\n    {0x24, 0x1a, 0x1a},\n    {0x3e, 0x25, 0x24},\n    {0x24, 0x01, 0x18},\n    {0x34, 0x10, 0x22},\n    {0x07, 0x00, 0x37},\n    {0x06, 0x20, 0x20},\n    {0x3a, 0x02, 0x2b},\n    {0x07, 0x2c, 0x2c},\n    {0x09, 0x2f, 0x2a},\n    {0x01, 0x32, 0x2c},\n    {0x00, 0x35, 0x13},\n    {0x2b, 0x3c, 0x1f},\n    {0x36, 0x37, 0x1e},\n    {0x20, 0x35, 0x1d},\n    {0x0c, 0x07, 0x33},\n    {0x16, 0x08, 0x12},\n    {0x3f, 0x36, 0x11},\n    {0x0b, 0x1f, 0x2d},\n    {0x21, 0x20, 0x33},\n    {0x17, 0x1a, 0x2e},\n    {0x16, 0x01, 0x2f},\n    {0x2f, 0x1c, 0x34},\n    {0x29, 0x31, 0x2e},\n    {0x3b, 0x38, 0x31},\n    {0x0d, 0x16, 0x12},\n    {0x07, 0x29, 0x24},\n    {0x33, 0x3c, 0x34},\n    {0x3e, 0x1e, 0x18},\n    {0x30, 0x02, 0x34},\n    {0x2a, 0x34, 0x1b},\n    {0x2e, 0x23, 0x18},\n    {0x34, 0x00, 0x1f},\n    {0x20, 0x0e, 0x28},\n    {0x15, 0x33, 0x37},\n    {0x27, 0x35, 0x23},\n    {0x37, 0x3e, 0x11},\n    {0x32, 0x2e, 0x36},\n    {0x3a, 0x02, 0x2b},\n    {0x00, 0x36, 0x1d},\n    {0x13, 0x29, 0x16},\n    {0x08, 0x2b, 0x37},\n    {0x08, 0x02, 0x27},\n    {0x32, 0x2d, 0x34},\n    {0x30, 0x36, 0x29},\n    {0x2e, 0x10, 0x12},\n    {0x3c, 0x2e, 0x2a},\n    {0x04, 0x33, 0x30},\n    {0x3f, 0x01, 0x22},\n    {0x37, 0x14, 0x1d},\n    {0x27, 0x00, 0x2f},\n    {0x0c, 0x39, 0x26},\n    {0x27, 0x04, 0x21},\n    {0x19, 0x08, 0x1d},\n    {0x01, 0x04, 0x1e},\n    {0x27, 0x1b, 0x2b},\n    {0x31, 0x17, 0x1f},\n    {0x07, 0x01, 0x2d},\n    {0x2e, 0x3b, 0x1f},\n    {0x34, 0x24, 0x31},\n    {0x32, 0x2b, 0x24},\n    {0x0e, 0x07, 0x1e},\n    {0x0f, 0x33, 0x10},\n    {0x16, 0x21, 0x32},\n    {0x39, 0x02, 0x1a},\n    {0x33, 0x3d, 0x22},\n    {0x0c, 0x25, 0x1a},\n    {0x29, 0x29, 0x28},\n    {0x3a, 0x32, 0x26},\n    {0x0b, 0x13, 0x22},\n    {0x1f, 0x0f, 0x1c},\n    {0x04, 0x2c, 0x20},\n    {0x39, 0x1a, 0x1b},\n    {0x1a, 0x2a, 0x1f},\n    {0x24, 0x13, 0x1a},\n    {0x31, 0x3b, 0x33},\n    {0x39, 0x23, 0x28},\n    {0x31, 0x07, 0x31},\n    {0x1f, 0x10, 0x20},\n    {0x29, 0x17, 0x32},\n    {0x26, 0x3b, 0x2d},\n    {0x02, 0x3c, 0x1c},\n    {0x0e, 0x00, 0x20},\n    {0x14, 0x3e, 0x37},\n    {0x01, 0x0f, 0x2d},\n    {0x06, 0x12, 0x27},\n    {0x30, 0x13, 0x19},\n    {0x00, 0x33, 0x2a},\n    {0x0c, 0x07, 0x27},\n    {0x11, 0x3a, 0x1c},\n    {0x15, 0x0a, 0x13},\n    {0x1f, 0x0d, 0x2a},\n    {0x37, 0x07, 0x2a},\n    {0x34, 0x35, 0x34},\n    {0x28, 0x16, 0x27},\n    {0x06, 0x02, 0x36},\n    {0x09, 0x23, 0x30},\n    {0x14, 0x02, 0x28},\n    {0x39, 0x32, 0x34},\n    {0x24, 0x35, 0x12},\n    {0x12, 0x22, 0x26},\n    {0x09, 0x07, 0x33},\n    {0x0f, 0x3e, 0x1e},\n    {0x00, 0x3c, 0x33},\n    {0x10, 0x37, 0x14},\n    {0x3a, 0x03, 0x25},\n    {0x2d, 0x1e, 0x24},\n    {0x36, 0x36, 0x26},\n    {0x1f, 0x3c, 0x1a},\n    {0x37, 0x33, 0x25},\n    {0x23, 0x13, 0x1f},\n    {0x33, 0x0d, 0x13},\n    {0x25, 0x30, 0x1e},\n    {0x17, 0x03, 0x18},\n    {0x18, 0x18, 0x14},\n    {0x30, 0x07, 0x22},\n    {0x3e, 0x33, 0x21},\n    {0x14, 0x37, 0x16},\n    {0x16, 0x00, 0x12},\n    {0x2c, 0x12, 0x2f},\n    {0x25, 0x3f, 0x1e},\n    {0x24, 0x19, 0x16},\n    {0x16, 0x0f, 0x35},\n    {0x2d, 0x10, 0x11},\n    {0x24, 0x2a, 0x28},\n    {0x19, 0x25, 0x2e},\n    {0x0c, 0x16, 0x1f},\n    {0x38, 0x21, 0x36},\n    {0x3d, 0x1a, 0x2f},\n    {0x3b, 0x32, 0x12},\n    {0x36, 0x13, 0x29},\n    {0x0e, 0x30, 0x31},\n    {0x19, 0x07, 0x2f},\n    {0x25, 0x23, 0x28},\n    {0x20, 0x08, 0x29},\n    {0x2a, 0x00, 0x30},\n    {0x30, 0x38, 0x23},\n    {0x1e, 0x0f, 0x1f},\n    {0x3b, 0x1b, 0x30},\n    {0x3a, 0x37, 0x2f},\n    {0x39, 0x37, 0x35},\n    {0x39, 0x2d, 0x2f},\n    {0x1f, 0x2e, 0x1e},\n    {0x1a, 0x2b, 0x1e},\n    {0x14, 0x17, 0x20},\n    {0x2f, 0x03, 0x11},\n    {0x1d, 0x00, 0x30},\n    {0x17, 0x2b, 0x1d},\n    {0x35, 0x28, 0x25},\n    {0x3b, 0x0f, 0x11},\n    {0x09, 0x04, 0x2e},\n    {0x23, 0x11, 0x1e},\n    {0x13, 0x37, 0x1e},\n    {0x37, 0x37, 0x1e},\n    {0x07, 0x01, 0x32},\n    {0x14, 0x06, 0x32},\n    {0x11, 0x0c, 0x2e},\n    {0x36, 0x2e, 0x24},\n    {0x15, 0x2a, 0x1c},\n    {0x22, 0x15, 0x34},\n    {0x2c, 0x1e, 0x35},\n    {0x22, 0x27, 0x33},\n    {0x19, 0x3f, 0x2d},\n    {0x21, 0x33, 0x15},\n    {0x26, 0x1a, 0x11},\n    {0x16, 0x3e, 0x12},\n    {0x2b, 0x24, 0x15},\n    {0x3c, 0x0f, 0x2d},\n    {0x31, 0x15, 0x36},\n    {0x3f, 0x24, 0x1d},\n    {0x25, 0x01, 0x37},\n    {0x33, 0x16, 0x1a},\n    {0x1f, 0x0e, 0x10},\n    {0x2f, 0x0b, 0x12},\n    {0x2a, 0x1a, 0x25},\n    {0x17, 0x0a, 0x35},\n    {0x09, 0x28, 0x35},\n    {0x02, 0x13, 0x36},\n    {0x34, 0x2f, 0x17},\n    {0x03, 0x04, 0x31},\n    {0x3e, 0x26, 0x11},\n    {0x35, 0x33, 0x31},\n    {0x22, 0x17, 0x23},\n    {0x1d, 0x05, 0x2b},\n    {0x2e, 0x27, 0x20},\n    {0x03, 0x2b, 0x1d},\n    {0x01, 0x19, 0x1e},\n    {0x0e, 0x05, 0x18},\n    {0x16, 0x25, 0x17},\n    {0x02, 0x28, 0x18},\n    {0x19, 0x0b, 0x24},\n    {0x3e, 0x35, 0x16},\n    {0x2e, 0x29, 0x25},\n    {0x3e, 0x38, 0x1e},\n    {0x3a, 0x2f, 0x12},\n    {0x14, 0x17, 0x2d},\n    {0x11, 0x12, 0x30},\n    {0x15, 0x31, 0x18},\n    {0x08, 0x0b, 0x29},\n    {0x2d, 0x00, 0x33},\n    {0x2c, 0x06, 0x1a},\n    {0x14, 0x1c, 0x2e},\n    {0x04, 0x08, 0x12},\n    {0x1b, 0x2b, 0x2d},\n    {0x2a, 0x37, 0x33},\n    {0x10, 0x27, 0x2c},\n    {0x1d, 0x0e, 0x34},\n    {0x20, 0x02, 0x12},\n    {0x1e, 0x1a, 0x2e},\n    {0x07, 0x0b, 0x10},\n    {0x36, 0x1e, 0x33},\n    {0x2b, 0x28, 0x1b},\n    {0x31, 0x25, 0x1f},\n    {0x38, 0x3a, 0x2f},\n    {0x39, 0x30, 0x2f},\n    {0x12, 0x09, 0x14},\n    {0x0e, 0x08, 0x19},\n    {0x00, 0x0d, 0x2c},\n    {0x1b, 0x0e, 0x34},\n    {0x11, 0x25, 0x15},\n    {0x0c, 0x2d, 0x26},\n    {0x36, 0x2c, 0x16},\n    {0x31, 0x31, 0x2c},\n    {0x03, 0x1a, 0x16},\n    {0x1c, 0x32, 0x14},\n    {0x0a, 0x3e, 0x36},\n    {0x33, 0x1b, 0x27},\n    {0x1f, 0x32, 0x18},\n    {0x33, 0x26, 0x33},\n    {0x1a, 0x13, 0x1a},\n    {0x0f, 0x34, 0x1c},\n    {0x35, 0x2c, 0x2f},\n    {0x38, 0x03, 0x18},\n    {0x15, 0x0f, 0x27},\n    {0x31, 0x29, 0x20},\n    {0x28, 0x0e, 0x28},\n    {0x31, 0x2c, 0x2e},\n    {0x15, 0x19, 0x1b},\n    {0x10, 0x03, 0x2f},\n    {0x2e, 0x2a, 0x32},\n    {0x2a, 0x27, 0x1b},\n    {0x36, 0x04, 0x1e},\n    {0x3b, 0x04, 0x21},\n    {0x07, 0x2f, 0x19},\n    {0x27, 0x1d, 0x1d},\n    {0x3c, 0x3d, 0x2e},\n    {0x25, 0x08, 0x32},\n    {0x3b, 0x34, 0x2a},\n    {0x0c, 0x10, 0x13},\n    {0x25, 0x35, 0x1a},\n    {0x2f, 0x19, 0x28},\n    {0x17, 0x00, 0x2b},\n    {0x0a, 0x1c, 0x17},\n    {0x0a, 0x11, 0x1b},\n    {0x35, 0x13, 0x37},\n    {0x29, 0x1c, 0x28},\n    {0x0c, 0x31, 0x35},\n    {0x3c, 0x10, 0x1a},\n    {0x1b, 0x3a, 0x2d},\n    {0x3a, 0x1c, 0x18},\n    {0x22, 0x10, 0x2d},\n    {0x1c, 0x3c, 0x12},\n    {0x17, 0x18, 0x2a},\n    {0x0b, 0x2b, 0x2f},\n    {0x2d, 0x04, 0x2e},\n    {0x3c, 0x13, 0x23},\n    {0x01, 0x1c, 0x2e},\n    {0x14, 0x16, 0x22},\n    {0x0c, 0x24, 0x13},\n    {0x35, 0x37, 0x34},\n    {0x1b, 0x30, 0x1e},\n    {0x3a, 0x1c, 0x20},\n    {0x06, 0x06, 0x36},\n    {0x09, 0x15, 0x1a},\n    {0x1b, 0x1a, 0x27},\n    {0x0f, 0x33, 0x35},\n    {0x37, 0x06, 0x23},\n    {0x3a, 0x12, 0x1d},\n    {0x00, 0x16, 0x29},\n    {0x0e, 0x1d, 0x35},\n    {0x3f, 0x38, 0x16},\n    {0x2a, 0x3c, 0x34},\n    {0x13, 0x32, 0x10},\n    {0x17, 0x2c, 0x37},\n    {0x29, 0x2a, 0x1e},\n    {0x35, 0x2f, 0x2d},\n    {0x3c, 0x2a, 0x11},\n    {0x28, 0x13, 0x21},\n    {0x19, 0x1e, 0x34},\n    {0x0c, 0x06, 0x2d},\n    {0x09, 0x04, 0x1c},\n    {0x1d, 0x2f, 0x26},\n    {0x39, 0x07, 0x16},\n    {0x14, 0x04, 0x2d},\n    {0x3a, 0x2f, 0x2e},\n    {0x29, 0x15, 0x35},\n    {0x24, 0x02, 0x36},\n    {0x3f, 0x02, 0x1a},\n    {0x0f, 0x18, 0x24},\n    {0x16, 0x1d, 0x19},\n    {0x14, 0x16, 0x10},\n    {0x29, 0x1b, 0x13},\n    {0x15, 0x0e, 0x19},\n    {0x3a, 0x2e, 0x2b},\n    {0x08, 0x30, 0x15},\n    {0x35, 0x16, 0x30},\n    {0x2e, 0x18, 0x35},\n    {0x3b, 0x0b, 0x1c},\n    {0x3a, 0x18, 0x13},\n    {0x29, 0x13, 0x1e},\n    {0x20, 0x13, 0x27},\n    {0x04, 0x1d, 0x34},\n    {0x00, 0x38, 0x19},\n    {0x08, 0x39, 0x32},\n    {0x20, 0x10, 0x26},\n    {0x08, 0x02, 0x28},\n    {0x3f, 0x0f, 0x16},\n    {0x30, 0x1f, 0x19},\n    {0x20, 0x2d, 0x10},\n    {0x38, 0x17, 0x1c},\n    {0x18, 0x31, 0x27},\n    {0x33, 0x38, 0x30},\n    {0x16, 0x33, 0x23},\n    {0x00, 0x01, 0x36},\n    {0x0d, 0x02, 0x23},\n    {0x39, 0x04, 0x1f},\n    {0x0e, 0x30, 0x24},\n    {0x06, 0x01, 0x2c},\n    {0x34, 0x33, 0x35},\n    {0x16, 0x34, 0x2e},\n    {0x32, 0x16, 0x24},\n    {0x26, 0x39, 0x34},\n    {0x1f, 0x3c, 0x1d},\n    {0x28, 0x1d, 0x37},\n    {0x17, 0x15, 0x2b},\n    {0x27, 0x39, 0x30},\n    {0x0b, 0x1b, 0x18},\n    {0x35, 0x20, 0x2d},\n    {0x0b, 0x35, 0x1c},\n    {0x03, 0x0e, 0x21},\n    {0x06, 0x0c, 0x20},\n    {0x02, 0x18, 0x34},\n    {0x1e, 0x36, 0x2d},\n    {0x16, 0x0c, 0x19},\n    {0x25, 0x09, 0x2c},\n    {0x37, 0x05, 0x2e},\n    {0x2e, 0x2b, 0x2c},\n    {0x24, 0x1a, 0x14},\n    {0x27, 0x04, 0x10},\n    {0x32, 0x38, 0x33},\n    {0x37, 0x15, 0x35},\n    {0x11, 0x3f, 0x1d},\n    {0x23, 0x23, 0x1f},\n    {0x29, 0x3f, 0x1d},\n    {0x1a, 0x3c, 0x2b},\n    {0x1b, 0x2c, 0x2c},\n    {0x38, 0x3b, 0x36},\n    {0x04, 0x13, 0x33},\n    {0x2c, 0x14, 0x12},\n    {0x1a, 0x09, 0x1b},\n    {0x36, 0x11, 0x24},\n    {0x3a, 0x3f, 0x11},\n    {0x01, 0x0e, 0x2b},\n    {0x3b, 0x03, 0x2a},\n    {0x08, 0x0d, 0x2b},\n    {0x2b, 0x13, 0x27},\n    {0x3a, 0x3c, 0x1c},\n    {0x3a, 0x15, 0x2a},\n    {0x24, 0x00, 0x17},\n    {0x3e, 0x0a, 0x15},\n    {0x0c, 0x29, 0x2d},\n    {0x1f, 0x15, 0x30},\n    {0x35, 0x18, 0x19},\n    {0x3d, 0x37, 0x37},\n    {0x12, 0x38, 0x1b},\n    {0x3b, 0x02, 0x20},\n    {0x08, 0x21, 0x19},\n    {0x2e, 0x36, 0x1d},\n    {0x15, 0x3d, 0x24},\n    {0x22, 0x0c, 0x27},\n    {0x36, 0x3f, 0x33},\n    {0x33, 0x12, 0x11},\n    {0x1a, 0x19, 0x1f},\n    {0x2b, 0x24, 0x12},\n    {0x11, 0x2a, 0x18},\n    {0x25, 0x32, 0x2a},\n    {0x2c, 0x1a, 0x12},\n    {0x26, 0x06, 0x10},\n    {0x11, 0x29, 0x33},\n    {0x2c, 0x09, 0x14},\n    {0x2b, 0x12, 0x2b},\n    {0x1d, 0x03, 0x24},\n    {0x00, 0x12, 0x15},\n    {0x22, 0x3d, 0x26},\n    {0x15, 0x37, 0x1a},\n    {0x0f, 0x12, 0x37},\n    {0x24, 0x01, 0x18},\n    {0x2a, 0x17, 0x13},\n    {0x14, 0x3b, 0x29},\n    {0x2a, 0x19, 0x32},\n    {0x2d, 0x17, 0x17},\n    {0x0b, 0x2c, 0x33},\n    {0x07, 0x2d, 0x34},\n    {0x07, 0x38, 0x1d},\n    {0x1f, 0x36, 0x22},\n    {0x11, 0x0a, 0x17},\n    {0x14, 0x11, 0x13},\n    {0x2a, 0x17, 0x25},\n    {0x01, 0x3a, 0x1c},\n    {0x26, 0x27, 0x30},\n    {0x2d, 0x3b, 0x35},\n    {0x3a, 0x30, 0x34},\n    {0x06, 0x3a, 0x1c},\n    {0x2d, 0x05, 0x13},\n    {0x21, 0x32, 0x12},\n    {0x3e, 0x1e, 0x2c},\n    {0x3a, 0x3f, 0x2d},\n    {0x20, 0x2a, 0x34},\n    {0x26, 0x03, 0x1a},\n    {0x19, 0x27, 0x2e},\n    {0x31, 0x04, 0x26},\n    {0x2a, 0x3f, 0x30},\n    {0x25, 0x23, 0x2a},\n    {0x08, 0x08, 0x35},\n    {0x2c, 0x30, 0x1e},\n    {0x08, 0x05, 0x18},\n    {0x06, 0x09, 0x2d},\n    {0x19, 0x00, 0x27},\n    {0x0d, 0x10, 0x19},\n    {0x1c, 0x00, 0x13},\n    {0x3d, 0x0b, 0x24},\n    {0x2e, 0x1f, 0x16},\n    {0x3d, 0x18, 0x34},\n    {0x12, 0x1e, 0x15},\n    {0x15, 0x39, 0x25},\n    {0x33, 0x0f, 0x17},\n    {0x1a, 0x1c, 0x1b},\n    {0x37, 0x29, 0x1b},\n    {0x3b, 0x38, 0x12},\n    {0x1d, 0x22, 0x34},\n    {0x26, 0x0a, 0x31},\n    {0x16, 0x2d, 0x13},\n    {0x0d, 0x20, 0x27},\n    {0x24, 0x1d, 0x16},\n    {0x2e, 0x2b, 0x18},\n    {0x16, 0x2a, 0x1b},\n    {0x24, 0x17, 0x36},\n    {0x02, 0x05, 0x2b},\n    {0x37, 0x1a, 0x17},\n    {0x11, 0x3d, 0x2c},\n    {0x1e, 0x2f, 0x22},\n    {0x2c, 0x29, 0x1a},\n    {0x2f, 0x04, 0x25},\n    {0x36, 0x0c, 0x35},\n    {0x30, 0x3e, 0x12},\n    {0x11, 0x30, 0x37},\n    {0x12, 0x21, 0x2e},\n    {0x21, 0x30, 0x17},\n    {0x2c, 0x3d, 0x24},\n    {0x11, 0x23, 0x14},\n    {0x1a, 0x32, 0x17},\n    {0x39, 0x27, 0x18},\n    {0x0f, 0x24, 0x19},\n    {0x00, 0x3d, 0x37},\n    {0x2c, 0x3c, 0x1c},\n    {0x0b, 0x39, 0x23},\n    {0x0e, 0x04, 0x1f},\n    {0x1c, 0x31, 0x14},\n    {0x00, 0x04, 0x15},\n    {0x26, 0x2a, 0x2a},\n    {0x20, 0x25, 0x2a},\n    {0x0b, 0x3c, 0x33},\n    {0x11, 0x0b, 0x2e},\n    {0x37, 0x22, 0x2e},\n    {0x0e, 0x22, 0x26},\n    {0x18, 0x2d, 0x27},\n    {0x06, 0x0c, 0x1c},\n    {0x26, 0x18, 0x2f},\n    {0x3a, 0x01, 0x2a},\n    {0x2f, 0x31, 0x34},\n    {0x1f, 0x34, 0x1a},\n    {0x31, 0x05, 0x10},\n    {0x2e, 0x17, 0x34},\n    {0x18, 0x22, 0x23},\n    {0x23, 0x21, 0x32},\n    {0x07, 0x08, 0x22},\n    {0x26, 0x1c, 0x22},\n    {0x31, 0x12, 0x2f},\n    {0x08, 0x1f, 0x10},\n    {0x27, 0x15, 0x2a},\n    {0x1f, 0x0b, 0x26},\n    {0x2f, 0x14, 0x35},\n    {0x24, 0x1f, 0x26},\n    {0x3b, 0x23, 0x33},\n    {0x20, 0x3e, 0x2d},\n    {0x17, 0x0c, 0x15},\n    {0x13, 0x39, 0x1a},\n    {0x30, 0x14, 0x25},\n    {0x09, 0x07, 0x17},\n    {0x38, 0x38, 0x1f},\n    {0x29, 0x24, 0x27},\n    {0x17, 0x27, 0x28},\n    {0x1b, 0x12, 0x2a},\n    {0x2b, 0x3d, 0x2d},\n    {0x19, 0x34, 0x1c},\n    {0x01, 0x1d, 0x10},\n    {0x08, 0x39, 0x11},\n    {0x0e, 0x36, 0x1b},\n    {0x26, 0x13, 0x10},\n    {0x16, 0x28, 0x1e},\n    {0x3c, 0x28, 0x17},\n    {0x3e, 0x39, 0x34},\n    {0x0a, 0x03, 0x2e},\n    {0x37, 0x1a, 0x13},\n    {0x2b, 0x33, 0x26},\n    {0x13, 0x2c, 0x21},\n    {0x25, 0x14, 0x10},\n    {0x16, 0x0b, 0x35},\n    {0x1d, 0x35, 0x33},\n    {0x21, 0x08, 0x33},\n    {0x28, 0x21, 0x1a},\n    {0x12, 0x0c, 0x1b},\n    {0x36, 0x2a, 0x19},\n    {0x2c, 0x2b, 0x23},\n    {0x01, 0x0f, 0x26},\n    {0x17, 0x0c, 0x18},\n    {0x09, 0x0f, 0x11},\n    {0x2b, 0x24, 0x1c},\n    {0x09, 0x09, 0x15},\n    {0x36, 0x08, 0x13},\n    {0x20, 0x39, 0x21},\n    {0x00, 0x3a, 0x1f},\n    {0x2b, 0x36, 0x31},\n    {0x02, 0x37, 0x13},\n    {0x04, 0x34, 0x35},\n    {0x37, 0x3d, 0x1a},\n    {0x17, 0x3d, 0x13},\n    {0x2b, 0x36, 0x2f},\n    {0x13, 0x1e, 0x13},\n    {0x3e, 0x11, 0x33},\n    {0x27, 0x3a, 0x2d},\n    {0x1e, 0x31, 0x1a},\n    {0x03, 0x03, 0x2d},\n    {0x25, 0x37, 0x1f},\n    {0x11, 0x01, 0x22},\n    {0x1c, 0x12, 0x17},\n    {0x30, 0x3a, 0x30},\n    {0x17, 0x1d, 0x29},\n    {0x0e, 0x13, 0x27},\n    {0x1a, 0x2e, 0x24},\n    {0x2d, 0x00, 0x1c},\n    {0x17, 0x28, 0x1d},\n    {0x09, 0x1f, 0x2e},\n    {0x1a, 0x2d, 0x26},\n    {0x0a, 0x13, 0x32},\n    {0x3e, 0x00, 0x27},\n    {0x0b, 0x3b, 0x30},\n    {0x08, 0x3a, 0x2d},\n    {0x22, 0x12, 0x1e},\n    {0x34, 0x1d, 0x2b},\n    {0x26, 0x22, 0x35},\n    {0x17, 0x2c, 0x17},\n    {0x29, 0x13, 0x2d},\n    {0x2d, 0x10, 0x10},\n    {0x20, 0x31, 0x23},\n    {0x1e, 0x33, 0x18},\n    {0x33, 0x06, 0x2d},\n    {0x26, 0x14, 0x27},\n    {0x22, 0x1d, 0x2a},\n    {0x2d, 0x06, 0x18},\n    {0x07, 0x09, 0x2e},\n    {0x21, 0x15, 0x2e},\n    {0x21, 0x38, 0x23},\n    {0x35, 0x0b, 0x34},\n    {0x24, 0x0b, 0x22},\n    {0x1e, 0x01, 0x17},\n    {0x0b, 0x24, 0x11},\n    {0x17, 0x07, 0x20},\n    {0x14, 0x25, 0x32},\n    {0x1a, 0x0e, 0x2f},\n    {0x35, 0x17, 0x1f},\n    {0x0c, 0x08, 0x21},\n    {0x30, 0x35, 0x1f},\n    {0x0c, 0x0b, 0x20},\n    {0x04, 0x10, 0x11},\n    {0x35, 0x11, 0x1e},\n    {0x33, 0x3d, 0x16},\n    {0x1e, 0x2b, 0x1d},\n    {0x1a, 0x19, 0x10},\n    {0x04, 0x06, 0x22},\n    {0x03, 0x3d, 0x24},\n    {0x2a, 0x0e, 0x35},\n    {0x03, 0x3e, 0x17},\n    {0x0b, 0x18, 0x36},\n    {0x3d, 0x0d, 0x26},\n    {0x35, 0x12, 0x20},\n    {0x1f, 0x0d, 0x16},\n    {0x23, 0x32, 0x1a},\n    {0x00, 0x3d, 0x26},\n    {0x30, 0x19, 0x36},\n    {0x12, 0x0e, 0x23},\n    {0x01, 0x23, 0x28},\n    {0x3b, 0x31, 0x11},\n    {0x2d, 0x1c, 0x36},\n    {0x2a, 0x05, 0x16},\n    {0x14, 0x0e, 0x30},\n    {0x3a, 0x37, 0x19},\n    {0x1f, 0x30, 0x25},\n    {0x10, 0x26, 0x2f},\n    {0x22, 0x11, 0x1f},\n    {0x2e, 0x2b, 0x1e},\n    {0x16, 0x16, 0x21},\n    {0x32, 0x18, 0x35},\n    {0x23, 0x32, 0x1a},\n    {0x3d, 0x0d, 0x19},\n    {0x39, 0x09, 0x23},\n    {0x30, 0x2e, 0x24},\n    {0x1e, 0x0f, 0x24},\n    {0x09, 0x21, 0x31},\n    {0x05, 0x03, 0x11},\n    {0x05, 0x22, 0x2a},\n    {0x03, 0x07, 0x37},\n    {0x04, 0x08, 0x13},\n    {0x05, 0x10, 0x34},\n    {0x37, 0x14, 0x29},\n    {0x0a, 0x24, 0x32},\n    {0x34, 0x1e, 0x1b},\n    {0x12, 0x17, 0x2e},\n    {0x01, 0x02, 0x13},\n    {0x0a, 0x0c, 0x11},\n    {0x02, 0x14, 0x13},\n    {0x0d, 0x25, 0x23},\n    {0x00, 0x07, 0x1a},\n    {0x1c, 0x28, 0x35},\n    {0x08, 0x0e, 0x2c},\n    {0x1b, 0x3c, 0x15},\n    {0x1c, 0x19, 0x1d},\n    {0x32, 0x13, 0x1a},\n    {0x1c, 0x00, 0x37},\n    {0x22, 0x1b, 0x35},\n    {0x39, 0x3e, 0x14},\n    {0x32, 0x06, 0x31},\n    {0x17, 0x05, 0x2b},\n    {0x01, 0x0f, 0x20},\n    {0x1e, 0x0f, 0x34},\n    {0x18, 0x03, 0x1f},\n    {0x2b, 0x00, 0x14},\n    {0x15, 0x3a, 0x30},\n    {0x25, 0x30, 0x21},\n    {0x0b, 0x00, 0x37},\n    {0x24, 0x37, 0x1d},\n    {0x29, 0x21, 0x16},\n    {0x24, 0x0f, 0x2c},\n    {0x3e, 0x15, 0x36},\n    {0x3c, 0x2d, 0x23},\n    {0x3d, 0x3c, 0x17},\n    {0x1a, 0x1c, 0x13},\n    {0x0a, 0x29, 0x22},\n    {0x25, 0x3f, 0x26},\n    {0x3b, 0x39, 0x2f},\n    {0x1d, 0x08, 0x16},\n    {0x0b, 0x19, 0x14},\n    {0x12, 0x01, 0x2c},\n    {0x35, 0x11, 0x2a},\n    {0x02, 0x00, 0x13},\n    {0x39, 0x2a, 0x35},\n    {0x07, 0x1a, 0x11},\n    {0x24, 0x0e, 0x1e},\n    {0x0e, 0x2c, 0x15},\n    {0x08, 0x31, 0x1b},\n    {0x21, 0x1d, 0x26},\n    {0x1d, 0x1c, 0x2a},\n    {0x1d, 0x24, 0x13},\n    {0x01, 0x00, 0x18},\n    {0x28, 0x2a, 0x37},\n    {0x15, 0x0f, 0x13},\n    {0x10, 0x32, 0x36},\n    {0x22, 0x13, 0x31},\n    {0x13, 0x05, 0x1e},\n    {0x17, 0x35, 0x35},\n    {0x3b, 0x0e, 0x24},\n    {0x35, 0x3a, 0x1d},\n    {0x1b, 0x36, 0x1b},\n    {0x03, 0x1d, 0x24},\n    {0x0f, 0x16, 0x30},\n    {0x2d, 0x09, 0x25},\n    {0x05, 0x21, 0x13},\n    {0x0a, 0x27, 0x36},\n    {0x04, 0x0d, 0x1c},\n    {0x06, 0x3e, 0x21},\n    {0x2a, 0x27, 0x33},\n    {0x28, 0x0e, 0x15},\n    {0x0b, 0x17, 0x1d},\n    {0x1d, 0x32, 0x2d},\n    {0x08, 0x3d, 0x29},\n    {0x21, 0x32, 0x17},\n    {0x33, 0x31, 0x22},\n    {0x0e, 0x03, 0x21},\n    {0x0d, 0x0b, 0x16},\n    {0x3e, 0x2a, 0x2e},\n    {0x19, 0x36, 0x2a},\n    {0x0d, 0x00, 0x14},\n    {0x22, 0x07, 0x36},\n    {0x0a, 0x09, 0x15},\n    {0x14, 0x10, 0x22},\n    {0x07, 0x16, 0x2c},\n    {0x36, 0x13, 0x15},\n    {0x09, 0x2f, 0x1b},\n    {0x20, 0x3b, 0x2e},\n    {0x3a, 0x3a, 0x16},\n    {0x0d, 0x15, 0x2a},\n    {0x39, 0x13, 0x2b},\n    {0x0b, 0x01, 0x2a},\n    {0x13, 0x17, 0x1e},\n    {0x08, 0x17, 0x1e},\n    {0x0c, 0x0f, 0x34},\n    {0x1f, 0x31, 0x12},\n    {0x07, 0x3a, 0x1d},\n    {0x35, 0x1e, 0x12},\n    {0x24, 0x2c, 0x15},\n    {0x0e, 0x21, 0x19},\n    {0x34, 0x3b, 0x33},\n    {0x19, 0x0f, 0x28},\n    {0x10, 0x2f, 0x2e},\n    {0x23, 0x27, 0x31},\n    {0x39, 0x2e, 0x18},\n    {0x3c, 0x3f, 0x24},\n    {0x07, 0x23, 0x30},\n    {0x28, 0x13, 0x35},\n    {0x13, 0x0a, 0x10},\n    {0x35, 0x19, 0x33},\n    {0x23, 0x28, 0x29},\n    {0x13, 0x2f, 0x1a},\n    {0x3a, 0x19, 0x14},\n    {0x37, 0x36, 0x26},\n    {0x20, 0x3b, 0x15},\n    {0x37, 0x39, 0x10},\n    {0x3c, 0x21, 0x34},\n    {0x1c, 0x38, 0x30},\n    {0x15, 0x07, 0x26},\n    {0x27, 0x21, 0x19},\n    {0x18, 0x11, 0x23},\n    {0x30, 0x28, 0x37},\n    {0x32, 0x2d, 0x1f},\n    {0x2c, 0x3f, 0x30},\n    {0x1d, 0x2f, 0x26},\n    {0x01, 0x11, 0x1c},\n    {0x3b, 0x0f, 0x12},\n    {0x2a, 0x17, 0x27},\n    {0x05, 0x00, 0x1b},\n    {0x25, 0x1c, 0x32},\n    {0x04, 0x22, 0x2d},\n    {0x10, 0x0f, 0x25},\n    {0x0d, 0x39, 0x30},\n    {0x0b, 0x2e, 0x27},\n    {0x2d, 0x34, 0x15},\n    {0x3e, 0x30, 0x36},\n    {0x16, 0x26, 0x2a},\n    {0x05, 0x3f, 0x2b},\n    {0x20, 0x3b, 0x2e},\n    {0x3b, 0x1c, 0x2f},\n    {0x01, 0x18, 0x16},\n    {0x16, 0x3d, 0x10},\n    {0x0a, 0x1f, 0x18},\n    {0x17, 0x0f, 0x22},\n    {0x06, 0x13, 0x11},\n    {0x38, 0x21, 0x17},\n    {0x17, 0x0a, 0x37},\n    {0x1c, 0x19, 0x30},\n    {0x16, 0x38, 0x31},\n    {0x30, 0x10, 0x36},\n    {0x31, 0x2f, 0x26},\n    {0x3c, 0x1b, 0x23},\n    {0x33, 0x2f, 0x19},\n    {0x16, 0x35, 0x25},\n    {0x3a, 0x18, 0x1f},\n    {0x37, 0x01, 0x1e},\n    {0x0d, 0x18, 0x12},\n    {0x1f, 0x1c, 0x1b},\n    {0x07, 0x34, 0x2d},\n    {0x0b, 0x3f, 0x33},\n    {0x1e, 0x34, 0x1d},\n    {0x2c, 0x13, 0x2c},\n    {0x20, 0x20, 0x13},\n    {0x20, 0x0f, 0x31},\n    {0x08, 0x0f, 0x24},\n    {0x18, 0x3d, 0x1c},\n    {0x36, 0x34, 0x27},\n    {0x33, 0x2a, 0x25},\n    {0x2d, 0x30, 0x26},\n    {0x3d, 0x37, 0x26},\n    {0x25, 0x11, 0x11},\n    {0x03, 0x05, 0x18},\n    {0x10, 0x04, 0x29},\n    {0x07, 0x2e, 0x36},\n    {0x2a, 0x29, 0x15},\n    {0x3a, 0x0e, 0x33},\n    {0x2a, 0x06, 0x29},\n    {0x3d, 0x01, 0x29},\n    {0x27, 0x0e, 0x16},\n    {0x1d, 0x28, 0x1b},\n    {0x10, 0x33, 0x2b},\n    {0x0c, 0x14, 0x1d},\n    {0x15, 0x3f, 0x25},\n    {0x37, 0x23, 0x1e},\n    {0x04, 0x2c, 0x1c},\n    {0x15, 0x34, 0x2a},\n    {0x09, 0x2f, 0x15},\n    {0x02, 0x3f, 0x14},\n    {0x19, 0x2c, 0x33},\n    {0x39, 0x32, 0x20},\n    {0x2a, 0x18, 0x32},\n    {0x17, 0x23, 0x21},\n    {0x0b, 0x2d, 0x25},\n    {0x24, 0x3a, 0x2d},\n    {0x31, 0x3f, 0x34},\n    {0x18, 0x19, 0x24},\n    {0x1e, 0x15, 0x1a},\n    {0x17, 0x33, 0x2b},\n    {0x23, 0x09, 0x26},\n    {0x1b, 0x0d, 0x15},\n    {0x36, 0x26, 0x28},\n    {0x3a, 0x1c, 0x14},\n    {0x0c, 0x3e, 0x10},\n    {0x18, 0x06, 0x35},\n    {0x37, 0x26, 0x36},\n    {0x21, 0x26, 0x17},\n    {0x3d, 0x1c, 0x2c},\n    {0x16, 0x25, 0x1d},\n    {0x1e, 0x0b, 0x1e},\n    {0x1d, 0x0d, 0x32},\n    {0x08, 0x1f, 0x1b},\n    {0x12, 0x1c, 0x12},\n    {0x20, 0x2a, 0x28},\n    {0x06, 0x3b, 0x35},\n    {0x39, 0x0e, 0x1e},\n    {0x31, 0x30, 0x28},\n    {0x02, 0x21, 0x14},\n    {0x06, 0x1e, 0x29},\n    {0x16, 0x09, 0x1c},\n    {0x27, 0x32, 0x2d},\n    {0x39, 0x03, 0x27},\n    {0x29, 0x09, 0x1e},\n    {0x1b, 0x11, 0x1c},\n    {0x28, 0x3a, 0x2c},\n    {0x03, 0x03, 0x18},\n    {0x23, 0x09, 0x2f},\n    {0x30, 0x17, 0x23},\n    {0x0f, 0x25, 0x33},\n    {0x06, 0x24, 0x37},\n    {0x22, 0x09, 0x33},\n    {0x2c, 0x09, 0x2a},\n    {0x0c, 0x12, 0x2a},\n    {0x28, 0x20, 0x10},\n    {0x15, 0x29, 0x33},\n    {0x0f, 0x1a, 0x13},\n    {0x13, 0x18, 0x36},\n    {0x2e, 0x16, 0x13},\n    {0x3c, 0x1a, 0x15},\n    {0x3a, 0x11, 0x32},\n    {0x02, 0x0a, 0x2c},\n    {0x19, 0x39, 0x11},\n    {0x31, 0x3e, 0x1d},\n    {0x32, 0x14, 0x32},\n    {0x12, 0x2e, 0x34},\n    {0x3e, 0x36, 0x23},\n    {0x37, 0x3e, 0x15},\n    {0x15, 0x35, 0x34},\n    {0x01, 0x3a, 0x2c},\n    {0x26, 0x25, 0x22},\n    {0x01, 0x2b, 0x37},\n    {0x1c, 0x3d, 0x33},\n    {0x3e, 0x10, 0x1c},\n    {0x26, 0x33, 0x19},\n    {0x05, 0x19, 0x17},\n    {0x12, 0x38, 0x1c},\n    {0x15, 0x3c, 0x32},\n    {0x3f, 0x0f, 0x37},\n    {0x02, 0x39, 0x32},\n    {0x13, 0x00, 0x1d},\n    {0x1d, 0x2c, 0x10},\n    {0x39, 0x13, 0x31},\n    {0x0f, 0x37, 0x19},\n    {0x09, 0x0d, 0x2a},\n    {0x20, 0x2f, 0x32},\n    {0x3b, 0x34, 0x22},\n    {0x26, 0x14, 0x10},\n    {0x24, 0x3d, 0x22},\n    {0x0b, 0x31, 0x23},\n    {0x2f, 0x2d, 0x2a},\n    {0x30, 0x04, 0x35},\n    {0x19, 0x20, 0x2a},\n    {0x16, 0x36, 0x37},\n    {0x14, 0x28, 0x37},\n    {0x11, 0x0b, 0x27},\n    {0x1d, 0x06, 0x29},\n    {0x35, 0x16, 0x2e},\n    {0x24, 0x2e, 0x29},\n    {0x36, 0x14, 0x2a},\n    {0x21, 0x0c, 0x1f},\n    {0x3f, 0x39, 0x19},\n    {0x27, 0x10, 0x2a},\n    {0x1e, 0x12, 0x34},\n    {0x10, 0x24, 0x34},\n    {0x1d, 0x13, 0x1d},\n    {0x17, 0x16, 0x37},\n    {0x27, 0x1b, 0x27},\n    {0x07, 0x24, 0x21},\n    {0x37, 0x21, 0x11},\n    {0x37, 0x28, 0x24},\n    {0x19, 0x02, 0x1c},\n    {0x14, 0x12, 0x1d},\n    {0x1b, 0x24, 0x2e},\n    {0x2e, 0x3a, 0x15},\n    {0x37, 0x34, 0x21},\n    {0x33, 0x2d, 0x29},\n    {0x2f, 0x1e, 0x34},\n    {0x29, 0x3c, 0x12},\n    {0x05, 0x15, 0x20},\n    {0x05, 0x3e, 0x19},\n    {0x18, 0x0b, 0x30},\n    {0x2f, 0x02, 0x27},\n    {0x14, 0x1c, 0x34},\n    {0x12, 0x20, 0x30},\n    {0x2b, 0x22, 0x1b},\n    {0x06, 0x31, 0x28},\n    {0x15, 0x2d, 0x12},\n    {0x01, 0x0e, 0x13},\n    {0x13, 0x0c, 0x28},\n    {0x07, 0x2a, 0x14},\n    {0x1d, 0x36, 0x14},\n    {0x15, 0x2b, 0x26},\n    {0x03, 0x25, 0x15},\n    {0x3e, 0x3b, 0x20},\n    {0x35, 0x0c, 0x25},\n    {0x2b, 0x16, 0x35},\n    {0x1e, 0x31, 0x2c},\n    {0x06, 0x03, 0x29},\n    {0x24, 0x07, 0x1f},\n    {0x32, 0x2f, 0x19},\n    {0x25, 0x21, 0x31},\n    {0x22, 0x26, 0x1d},\n    {0x00, 0x1b, 0x18},\n    {0x2a, 0x24, 0x31},\n    {0x20, 0x06, 0x2f},\n    {0x1e, 0x32, 0x26},\n    {0x32, 0x39, 0x12},\n    {0x20, 0x01, 0x19},\n    {0x0f, 0x15, 0x15},\n    {0x27, 0x10, 0x2e},\n    {0x09, 0x25, 0x19},\n    {0x29, 0x37, 0x30},\n    {0x13, 0x1c, 0x1d},\n    {0x29, 0x2d, 0x26},\n    {0x02, 0x1a, 0x16},\n    {0x1d, 0x2b, 0x1c},\n    {0x18, 0x04, 0x34},\n    {0x28, 0x2a, 0x21},\n    {0x15, 0x1b, 0x2e},\n    {0x16, 0x01, 0x10},\n    {0x05, 0x09, 0x14},\n    {0x22, 0x03, 0x22},\n    {0x02, 0x1b, 0x34},\n    {0x29, 0x2a, 0x23},\n    {0x26, 0x36, 0x13},\n    {0x23, 0x3d, 0x1a},\n    {0x1d, 0x10, 0x24},\n    {0x25, 0x2b, 0x37},\n    {0x19, 0x24, 0x26},\n    {0x28, 0x13, 0x16},\n    {0x17, 0x14, 0x19},\n    {0x0b, 0x2f, 0x25},\n    {0x37, 0x34, 0x37},\n    {0x39, 0x21, 0x1b},\n    {0x0f, 0x3d, 0x2d},\n    {0x0d, 0x10, 0x20},\n    {0x05, 0x0b, 0x2d},\n    {0x01, 0x12, 0x24},\n    {0x18, 0x3d, 0x32},\n    {0x09, 0x21, 0x26},\n    {0x1a, 0x0e, 0x1f},\n    {0x30, 0x06, 0x1f},\n    {0x0b, 0x3c, 0x29},\n    {0x07, 0x3e, 0x27},\n    {0x13, 0x1e, 0x1a},\n    {0x13, 0x07, 0x23},\n    {0x10, 0x34, 0x1e},\n    {0x32, 0x17, 0x23},\n    {0x35, 0x16, 0x31},\n    {0x32, 0x2e, 0x1b},\n    {0x28, 0x0e, 0x22},\n    {0x14, 0x3a, 0x23},\n    {0x22, 0x03, 0x29},\n    {0x2a, 0x10, 0x20},\n    {0x3e, 0x3c, 0x27},\n    {0x16, 0x20, 0x12},\n    {0x3f, 0x24, 0x31},\n    {0x0d, 0x2e, 0x32},\n    {0x2f, 0x17, 0x2d},\n    {0x36, 0x3b, 0x17},\n    {0x24, 0x23, 0x18},\n    {0x37, 0x1d, 0x13},\n    {0x17, 0x3a, 0x1a},\n    {0x0a, 0x3d, 0x1e},\n    {0x05, 0x12, 0x16},\n    {0x33, 0x32, 0x25},\n    {0x1d, 0x1f, 0x29},\n    {0x34, 0x2c, 0x26},\n    {0x20, 0x29, 0x35},\n    {0x0e, 0x32, 0x17},\n    {0x01, 0x39, 0x2d},\n    {0x27, 0x24, 0x23},\n    {0x28, 0x3f, 0x18},\n    {0x39, 0x38, 0x25},\n    {0x23, 0x11, 0x11},\n    {0x19, 0x2c, 0x29},\n    {0x30, 0x08, 0x28},\n    {0x25, 0x27, 0x1d},\n    {0x17, 0x25, 0x21},\n    {0x09, 0x3d, 0x16},\n    {0x1b, 0x0f, 0x2c},\n    {0x1b, 0x12, 0x22},\n    {0x28, 0x3e, 0x26},\n    {0x34, 0x10, 0x1b},\n    {0x02, 0x34, 0x15},\n    {0x1a, 0x29, 0x19},\n    {0x29, 0x11, 0x31},\n    {0x12, 0x27, 0x17},\n    {0x27, 0x27, 0x2f},\n    {0x34, 0x27, 0x24},\n    {0x03, 0x19, 0x36},\n    {0x17, 0x1d, 0x33},\n    {0x19, 0x25, 0x1a},\n    {0x2b, 0x39, 0x13},\n    {0x3b, 0x33, 0x1d},\n    {0x27, 0x31, 0x34},\n    {0x28, 0x33, 0x37},\n    {0x09, 0x30, 0x1b},\n    {0x03, 0x3a, 0x27},\n    {0x19, 0x11, 0x1f},\n    {0x0b, 0x1a, 0x34},\n    {0x3d, 0x2a, 0x15},\n    {0x04, 0x24, 0x36},\n    {0x30, 0x23, 0x30},\n    {0x0f, 0x22, 0x1b},\n    {0x3d, 0x3d, 0x24},\n    {0x29, 0x1d, 0x12},\n    {0x16, 0x19, 0x2e},\n    {0x03, 0x12, 0x17},\n    {0x18, 0x25, 0x33},\n    {0x2f, 0x23, 0x1a},\n    {0x1a, 0x35, 0x27},\n    {0x21, 0x26, 0x19},\n    {0x1b, 0x30, 0x18},\n    {0x2b, 0x22, 0x2d},\n    {0x2c, 0x1a, 0x34},\n    {0x3e, 0x12, 0x19},\n    {0x28, 0x27, 0x15},\n    {0x1b, 0x11, 0x12},\n    {0x17, 0x15, 0x10},\n    {0x34, 0x37, 0x25},\n    {0x12, 0x3f, 0x15},\n    {0x31, 0x0d, 0x37},\n    {0x3e, 0x2a, 0x2d},\n    {0x0f, 0x24, 0x24},\n    {0x3c, 0x3f, 0x1f},\n    {0x1d, 0x34, 0x17},\n    {0x1a, 0x23, 0x1f},\n    {0x37, 0x0f, 0x10},\n    {0x32, 0x34, 0x35},\n    {0x19, 0x05, 0x22},\n    {0x33, 0x16, 0x34},\n    {0x1e, 0x14, 0x1e},\n    {0x08, 0x13, 0x29},\n    {0x3a, 0x37, 0x30},\n    {0x1d, 0x36, 0x15},\n    {0x29, 0x2e, 0x1d},\n    {0x32, 0x2e, 0x23},\n    {0x35, 0x17, 0x1c},\n    {0x36, 0x1d, 0x13},\n    {0x23, 0x34, 0x34},\n    {0x24, 0x1a, 0x37},\n    {0x2f, 0x26, 0x2e},\n    {0x1e, 0x17, 0x1a},\n    {0x1f, 0x15, 0x1f},\n    {0x2b, 0x1f, 0x19},\n    {0x0a, 0x33, 0x1a},\n    {0x35, 0x31, 0x24},\n    {0x2d, 0x17, 0x2c},\n    {0x0c, 0x21, 0x36},\n    {0x2c, 0x35, 0x35},\n    {0x1b, 0x03, 0x27},\n    {0x01, 0x0d, 0x1d},\n    {0x1c, 0x0e, 0x11},\n    {0x11, 0x2b, 0x10},\n    {0x25, 0x3b, 0x20},\n    {0x1f, 0x17, 0x19},\n    {0x20, 0x08, 0x36},\n    {0x13, 0x38, 0x19},\n    {0x1b, 0x2b, 0x24},\n    {0x0b, 0x1f, 0x29},\n    {0x27, 0x15, 0x2c},\n    {0x37, 0x39, 0x10},\n    {0x3a, 0x15, 0x2e},\n    {0x2f, 0x11, 0x36},\n    {0x24, 0x04, 0x20},\n    {0x3b, 0x2a, 0x35},\n    {0x27, 0x35, 0x34},\n    {0x0d, 0x1b, 0x20},\n    {0x10, 0x22, 0x37},\n    {0x1f, 0x38, 0x27},\n    {0x31, 0x0f, 0x28},\n    {0x28, 0x25, 0x15},\n    {0x00, 0x1d, 0x25},\n    {0x31, 0x28, 0x28},\n    {0x0b, 0x3a, 0x1d},\n    {0x2d, 0x13, 0x1b},\n    {0x03, 0x37, 0x2e},\n    {0x1d, 0x28, 0x19},\n    {0x08, 0x2d, 0x22},\n    {0x27, 0x39, 0x32},\n    {0x3f, 0x2f, 0x1d},\n    {0x33, 0x34, 0x28},\n    {0x18, 0x08, 0x31},\n    {0x23, 0x1f, 0x13},\n    {0x0d, 0x2c, 0x23},\n    {0x3a, 0x2d, 0x1a},\n    {0x02, 0x25, 0x13},\n    {0x20, 0x36, 0x34},\n    {0x12, 0x2b, 0x2d},\n    {0x35, 0x35, 0x34},\n    {0x23, 0x20, 0x21},\n    {0x3a, 0x19, 0x1b},\n    {0x1f, 0x2b, 0x19},\n    {0x35, 0x0e, 0x19},\n    {0x26, 0x24, 0x37},\n    {0x18, 0x08, 0x10},\n    {0x0c, 0x16, 0x2d},\n    {0x1f, 0x34, 0x21},\n    {0x05, 0x38, 0x19},\n    {0x14, 0x21, 0x24},\n    {0x11, 0x31, 0x14},\n    {0x3e, 0x38, 0x29},\n    {0x3f, 0x08, 0x25},\n    {0x2a, 0x1f, 0x25},\n    {0x25, 0x06, 0x28},\n    {0x0b, 0x1e, 0x14},\n    {0x1a, 0x38, 0x22},\n    {0x24, 0x18, 0x29},\n    {0x1a, 0x11, 0x20},\n    {0x3b, 0x3a, 0x1e},\n    {0x1c, 0x26, 0x1a},\n    {0x05, 0x32, 0x19},\n    {0x39, 0x2a, 0x31},\n    {0x09, 0x07, 0x25},\n    {0x05, 0x3e, 0x16},\n    {0x34, 0x26, 0x14},\n    {0x1b, 0x32, 0x26},\n    {0x05, 0x08, 0x37},\n    {0x0f, 0x03, 0x20},\n    {0x2a, 0x39, 0x31},\n    {0x08, 0x01, 0x1e},\n    {0x1d, 0x23, 0x31},\n    {0x28, 0x1b, 0x28},\n    {0x1e, 0x37, 0x14},\n    {0x13, 0x0e, 0x28},\n    {0x2a, 0x3b, 0x37},\n    {0x2f, 0x1c, 0x28},\n    {0x30, 0x30, 0x1a},\n    {0x36, 0x1f, 0x16},\n    {0x3e, 0x0d, 0x15},\n    {0x2e, 0x16, 0x18},\n    {0x15, 0x37, 0x20},\n    {0x2a, 0x33, 0x30},\n    {0x2b, 0x0e, 0x25},\n    {0x18, 0x20, 0x16},\n    {0x02, 0x19, 0x25},\n    {0x0a, 0x2e, 0x30},\n    {0x16, 0x03, 0x11},\n    {0x04, 0x27, 0x25},\n    {0x1b, 0x1c, 0x21},\n    {0x29, 0x04, 0x27},\n    {0x3d, 0x20, 0x1e},\n    {0x28, 0x33, 0x31},\n    {0x1e, 0x39, 0x10},\n    {0x31, 0x29, 0x1e},\n    {0x06, 0x25, 0x28},\n    {0x19, 0x3b, 0x12},\n    {0x0b, 0x1b, 0x1c},\n    {0x3e, 0x37, 0x20},\n    {0x0a, 0x37, 0x33},\n    {0x02, 0x2c, 0x25},\n    {0x15, 0x18, 0x14},\n    {0x3b, 0x20, 0x1c},\n    {0x22, 0x3b, 0x1c},\n    {0x24, 0x34, 0x35},\n    {0x0f, 0x2f, 0x31},\n    {0x3b, 0x17, 0x35},\n    {0x30, 0x39, 0x37},\n    {0x0d, 0x15, 0x11},\n    {0x10, 0x03, 0x1e},\n    {0x1a, 0x39, 0x33},\n    {0x2f, 0x2e, 0x28},\n    {0x1c, 0x28, 0x36},\n    {0x28, 0x18, 0x1f},\n    {0x15, 0x01, 0x30},\n    {0x3e, 0x32, 0x28},\n    {0x34, 0x2f, 0x23},\n    {0x07, 0x0c, 0x36},\n    {0x28, 0x2c, 0x34},\n    {0x2a, 0x0c, 0x1f},\n    {0x3f, 0x20, 0x13},\n    {0x2b, 0x17, 0x27},\n    {0x28, 0x29, 0x2a},\n    {0x3c, 0x13, 0x36},\n    {0x26, 0x2d, 0x2a},\n    {0x0a, 0x06, 0x1e},\n    {0x20, 0x04, 0x1a},\n    {0x02, 0x07, 0x35},\n    {0x0e, 0x18, 0x30},\n    {0x00, 0x34, 0x34},\n    {0x2f, 0x14, 0x37},\n    {0x21, 0x30, 0x1f},\n    {0x15, 0x37, 0x1b},\n    {0x3a, 0x0b, 0x32},\n    {0x22, 0x22, 0x21},\n    {0x1b, 0x35, 0x23},\n    {0x0d, 0x03, 0x1c},\n    {0x23, 0x3b, 0x13},\n    {0x0e, 0x1d, 0x1f},\n    {0x1d, 0x3f, 0x2e},\n    {0x39, 0x27, 0x2e},\n    {0x0f, 0x38, 0x20},\n    {0x31, 0x3c, 0x35},\n    {0x0b, 0x0f, 0x2e},\n    {0x06, 0x06, 0x28},\n    {0x25, 0x39, 0x23},\n    {0x0a, 0x32, 0x15},\n    {0x0f, 0x1d, 0x25},\n    {0x0c, 0x0d, 0x34},\n    {0x12, 0x2e, 0x21},\n    {0x36, 0x18, 0x1f},\n    {0x1f, 0x34, 0x1b},\n    {0x05, 0x3a, 0x36},\n    {0x2b, 0x01, 0x17},\n    {0x0e, 0x16, 0x2b},\n    {0x0e, 0x0b, 0x26},\n    {0x0d, 0x2d, 0x10},\n    {0x21, 0x11, 0x27},\n    {0x3d, 0x13, 0x32},\n    {0x15, 0x25, 0x2a},\n    {0x1b, 0x2d, 0x35},\n    {0x2c, 0x2b, 0x26},\n    {0x26, 0x1f, 0x20},\n    {0x22, 0x2b, 0x12},\n    {0x3f, 0x3d, 0x27},\n    {0x30, 0x0a, 0x36},\n    {0x35, 0x1f, 0x17},\n    {0x21, 0x08, 0x29},\n    {0x1d, 0x20, 0x33},\n    {0x34, 0x11, 0x16},\n    {0x05, 0x38, 0x2d}\n};\n\nvoid ApplyImageProcessingEffects(struct ImageProcessingContext *context)\n{\n    gCanvasPixels = context->canvasPixels;\n    gCanvasMonPersonality = context->personality;\n    gCanvasColumnStart = context->columnStart;\n    gCanvasRowStart = context->rowStart;\n    gCanvasColumnEnd = context->columnEnd;\n    gCanvasRowEnd = context->rowEnd;\n    gCanvasWidth = context->canvasWidth;\n    gCanvasHeight = context->canvasHeight;\n\n    switch (context->effect)\n    {\n    case IMAGE_EFFECT_POINTILLISM:\n        ApplyImageEffect_Pointillism();\n        break;\n    case IMAGE_EFFECT_BLUR:\n        ApplyImageEffect_Blur();\n        break;\n    case IMAGE_EFFECT_OUTLINE_COLORED:\n        ApplyImageEffect_BlackOutline();\n        ApplyImageEffect_PersonalityColor(gCanvasMonPersonality);\n        break;\n    case IMAGE_EFFECT_INVERT_BLACK_WHITE:\n        ApplyImageEffect_BlackOutline();\n        ApplyImageEffect_Invert();\n        ApplyImageEffect_BlackAndWhite();\n    case IMAGE_EFFECT_INVERT:\n        ApplyImageEffect_Invert();\n        break;\n    case IMAGE_EFFECT_THICK_BLACK_WHITE:\n        ApplyImageEffect_BlackOutline();\n        ApplyImageEffect_BlurRight();\n        ApplyImageEffect_BlurRight();\n        ApplyImageEffect_BlurDown();\n        ApplyImageEffect_BlackAndWhite();\n        break;\n    case IMAGE_EFFECT_SHIMMER:\n        ApplyImageEffect_Shimmer();\n        break;\n    case IMAGE_EFFECT_OUTLINE:\n        ApplyImageEffect_BlackOutline();\n        break;\n    case IMAGE_EFFECT_BLUR_RIGHT:\n        ApplyImageEffect_BlurRight();\n        break;\n    case IMAGE_EFFECT_BLUR_DOWN:\n        ApplyImageEffect_BlurDown();\n        break;\n    case IMAGE_EFFECT_GRAYSCALE_LIGHT:\n        ApplyImageEffect_Grayscale();\n        ApplyImageEffect_RedChannelGrayscale(3);\n        break;\n    case IMAGE_EFFECT_CHARCOAL:\n        ApplyImageEffect_BlackOutline();\n        ApplyImageEffect_BlurRight();\n        ApplyImageEffect_BlurDown();\n        ApplyImageEffect_BlackAndWhite();\n        ApplyImageEffect_Blur();\n        ApplyImageEffect_Blur();\n        ApplyImageEffect_RedChannelGrayscale(2);\n        ApplyImageEffect_RedChannelGrayscaleHighlight(4);\n        break;\n    }\n}\n\nstatic void ApplyImageEffect_RedChannelGrayscale(u8 delta)\n{\n    u8 i, j;\n\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart];\n        for (i = 0; i < gCanvasColumnEnd; i++, pixel++)\n        {\n            if (!(0x8000 & *pixel))\n            {\n                // Gets the grayscale value, based on the pixel's red channel.\n                // Also adds a delta to skew lighter or darker.\n                u8 grayValue = (31 & *pixel);\n                grayValue += delta;\n                if (grayValue > 31)\n                    grayValue = 31;\n\n                *pixel = RGB2(grayValue, grayValue, grayValue);\n            }\n        }\n    }\n}\n\nstatic void ApplyImageEffect_RedChannelGrayscaleHighlight(u8 highlight)\n{\n    u8 i, j;\n\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart];\n        for (i = 0; i < gCanvasColumnEnd; i++, pixel++)\n        {\n            if (!(0x8000 & *pixel))\n            {\n                u8 grayValue = (31 & *pixel);\n                if (grayValue > 31 - highlight)\n                    grayValue = 31 - (highlight >> 1);\n\n                *pixel = RGB2(grayValue, grayValue, grayValue);\n            }\n        }\n    }\n}\n\nstatic void ApplyImageEffect_Pointillism(void)\n{\n    u32 i;\n    for (i = 0; i < NELEMS(sPointillismPoints); i++)\n        AddPointillismPoints(i);\n}\n\nstatic void ApplyImageEffect_Grayscale(void)\n{\n    u8 i, j;\n\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart];\n        for (i = 0; i < gCanvasColumnEnd; i++, pixel++)\n        {\n            if (!(0x8000 & *pixel))\n                *pixel = ConvertColorToGrayscale(pixel);\n        }\n    }\n}\n\nstatic void ApplyImageEffect_Blur(void)\n{\n    u8 i, j;\n\n    for (i = 0; i < gCanvasColumnEnd; i++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][gCanvasRowStart * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart + i];\n        u16 prevPixel = *pixel;\n\n        j = 1;\n        pixel += gCanvasWidth;\n        while (j < gCanvasRowEnd - 1)\n        {\n            if (!(0x8000 & *pixel))\n            {\n                *pixel = QuantizePixel_Blur(&prevPixel, pixel, pixel + gCanvasWidth);\n                prevPixel = *pixel;\n            }\n\n            j++;\n            pixel += gCanvasWidth;\n        }\n    }\n}\n\nstatic void ApplyImageEffect_PersonalityColor(u8 personality)\n{\n    u8 i, j;\n\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart];\n        for (i = 0; i < gCanvasColumnEnd; i++, pixel++)\n        {\n            if (!(0x8000 & *pixel))\n                *pixel = QuantizePixel_PersonalityColor(pixel, personality);\n        }\n    }\n}\n\nstatic void ApplyImageEffect_BlackAndWhite(void)\n{\n    u8 i, j;\n\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart];\n        for (i = 0; i < gCanvasColumnEnd; i++, pixel++)\n        {\n            if (!(0x8000 & *pixel))\n                *pixel = QuantizePixel_BlackAndWhite(pixel);\n        }\n    }\n}\n\nstatic void ApplyImageEffect_BlackOutline(void)\n{\n    u8 i, j;\n    u16 *pixel;\n\n    // Handle top row of pixels first.\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        pixel = &pixelRow[gCanvasColumnStart];\n        *pixel = QuantizePixel_BlackOutline(pixel, pixel + 1);\n        for (i = 1, pixel++; i < gCanvasColumnEnd - 1; i++, pixel++)\n        {\n            *pixel = QuantizePixel_BlackOutline(pixel, pixel + 1);\n            *pixel = QuantizePixel_BlackOutline(pixel, pixel - 1);\n        }\n\n        *pixel = QuantizePixel_BlackOutline(pixel, pixel - 1);\n    }\n\n    // Handle each column from left to right.\n    for (i = 0; i < gCanvasColumnEnd; i++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][gCanvasRowStart * gCanvasWidth];\n        pixel = &pixelRow[gCanvasColumnStart + i];\n        *pixel = QuantizePixel_BlackOutline(pixel, pixel + gCanvasWidth);\n        for (j = 1, pixel += gCanvasWidth; j < gCanvasRowEnd - 1; j++, pixel += gCanvasWidth)\n        {\n            *pixel = QuantizePixel_BlackOutline(pixel, pixel + gCanvasWidth);\n            *pixel = QuantizePixel_BlackOutline(pixel, pixel - gCanvasWidth);\n        }\n\n        *pixel = QuantizePixel_BlackOutline(pixel, pixel - gCanvasWidth);\n    }\n}\n\nstatic void ApplyImageEffect_Invert(void)\n{\n    u8 i, j;\n\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart];\n        for (i = 0; i < gCanvasColumnEnd; i++, pixel++)\n        {\n            if (!(0x8000 & *pixel))\n                *pixel = QuantizePixel_Invert(pixel);\n        }\n    }\n}\n\nstatic void ApplyImageEffect_Shimmer(void)\n{\n    u8 i, j;\n    u16 *pixel;\n    u16 prevPixel;\n\n    // First, invert all of the colors.\n    pixel = (*gCanvasPixels)[0];\n    for (i = 0; i < 64; i++)\n    {\n        for (j = 0; j < 64; j++, pixel++)\n        {\n            if (!(0x8000 & *pixel))\n                *pixel = QuantizePixel_Invert(pixel);\n        }\n    }\n\n    // Blur the pixels twice.\n    for (j = 0; j < 64; j++)\n    {\n        pixel = &(*gCanvasPixels)[0][j];\n        prevPixel = *pixel;\n        *pixel = 0x8000;\n        for (i = 1, pixel += 64; i < 63; i++, pixel += 64)\n        {\n            if (!(0x8000 & *pixel))\n            {\n                *pixel = QuantizePixel_BlurHard(&prevPixel, pixel, pixel + 64);\n                prevPixel = *pixel;\n            }\n        }\n\n        *pixel = 0x8000;\n        pixel = &(*gCanvasPixels)[0][j];\n        prevPixel = *pixel;\n        *pixel = 0x8000;\n        for (i = 1, pixel += 64; i < 63; i++, pixel += 64)\n        {\n            if (!(0x8000 & *pixel))\n            {\n                *pixel = QuantizePixel_BlurHard(&prevPixel, pixel, pixel + 64);\n                prevPixel = *pixel;\n            }\n        }\n\n        *pixel = 0x8000;\n    }\n\n    // Finally, invert colors back to the original color space.\n    // The above blur causes the outline areas to darken, which makes\n    // this inversion give the effect of light outlines.\n    pixel = (*gCanvasPixels)[0];\n    for (i = 0; i < 64; i++)\n    {\n        for (j = 0; j < 64; j++, pixel++)\n        {\n            if (!(0x8000 & *pixel))\n                *pixel = QuantizePixel_Invert(pixel);\n        }\n    }\n}\n\nstatic void ApplyImageEffect_BlurRight(void)\n{\n    u8 i, j;\n\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart];\n        u16 prevPixel = *pixel;\n        for (i = 1, pixel++; i < gCanvasColumnEnd - 1; i++, pixel++)\n        {\n            if (!(0x8000 & *pixel))\n            {\n                *pixel = QuantizePixel_MotionBlur(&prevPixel, pixel);\n                prevPixel = *pixel;\n            }\n        }\n    }\n}\n\nstatic void ApplyImageEffect_BlurDown(void)\n{\n    u8 i, j;\n\n    for (i = 0; i < gCanvasColumnEnd; i++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][gCanvasRowStart * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart + i];\n        u16 prevPixel = *pixel;\n        for (j = 1, pixel += gCanvasWidth; j < gCanvasRowEnd - 1; j++, pixel += gCanvasWidth)\n        {\n            if (!(0x8000 & *pixel))\n            {\n                *pixel = QuantizePixel_MotionBlur(&prevPixel, pixel);\n                prevPixel = *pixel;\n            }\n        }\n    }\n}\n\nstruct PointillismPoint\n{\n    u8 column;\n    u8 row;\n    u16 delta;\n};\n\nstatic void AddPointillismPoints(u16 arg0)\n{\n    u32 i;\n    bool8 offsetDownLeft;\n    u8 colorType;\n    struct PointillismPoint points[6];\n\n    points[0].column = sPointillismPoints[arg0][0];\n    points[0].row = sPointillismPoints[arg0][1];\n    points[0].delta = (sPointillismPoints[arg0][2] >> 3) & 7;\n\n    colorType = (sPointillismPoints[arg0][2] >> 1) & 3;\n    offsetDownLeft = sPointillismPoints[arg0][2] & 1;\n    for (i = 1; i < points[0].delta; i++)\n    {\n        if (!offsetDownLeft)\n        {\n            points[i].column = points[0].column - i;\n            points[i].row = points[0].row + i;\n        }\n        else\n        {\n            points[i].column = points[0].column + 1;\n            points[i].row = points[0].row - 1;\n        }\n\n        if (points[i].column > 63 || points[i].row > 63)\n        {\n            points[0].delta = i - 1;\n            break;\n        }\n\n        points[i].delta = points[0].delta - i;\n    }\n\n    for (i = 0; i < points[0].delta; i++)\n    {\n        u16 *pixel = &(*gCanvasPixels)[points[i].row * 2][points[i].column];\n\n        if (!(0x8000 & *pixel))\n        {\n            u16 red = (*pixel) & 0x1F;\n            u16 green = (*pixel >> 5) & 0x1F;\n            u16 blue = (*pixel >> 10) & 0x1F;\n\n            switch (colorType)\n            {\n            case 0:\n            case 1:\n                switch (((sPointillismPoints[arg0][2] >> 3) & 7) % 3)\n                {\n                case 0:\n                    if (red >= points[i].delta)\n                        red -= points[i].delta;\n                    else\n                        red = 0;\n                    break;\n                case 1:\n                    if (green >= points[i].delta)\n                        green -= points[i].delta;\n                    else\n                        green = 0;\n                    break;\n                case 2:\n                    if (blue >= points[i].delta)\n                        blue -= points[i].delta;\n                    else\n                        blue = 0;\n                    break;\n                }\n                break;\n            case 2:\n            case 3:\n                red += points[i].delta;\n                green += points[i].delta;\n                blue += points[i].delta;\n                if (red > 31)\n                    red = 31;\n                if (green > 31)\n                    green = 31;\n                if (blue > 31)\n                    blue = 31;\n                break;\n            }\n\n            *pixel = RGB2(red, green, blue);\n        }\n    }\n}\n\nstatic u16 ConvertColorToGrayscale(u16 *color)\n{\n    u16 red = *color & 0x1F;\n    u16 green = (*color >> 5) & 0x1F;\n    u16 blue = (*color >> 10) & 0x1F;\n\n    u16 gray = (red + green + blue) / 3;\n    return RGB2(gray, gray, gray);\n}\n\n// The dark colors are the colored edges of the Cool painting effect.\n// Everything else is white.\nstatic u16 QuantizePixel_PersonalityColor(u16 *color, u8 personality)\n{\n    u16 red = *color & 0x1F;\n    u16 green = (*color >> 5) & 0x1F;\n    u16 blue = (*color >> 10) & 0x1F;\n\n    if (red < 17 && green < 17 && blue < 17)\n        return GetColorFromPersonality(personality);\n    else\n        return RGB_WHITE;\n}\n\n// Based on the given value, which comes from the first 8 bits of\n// the mon's personality value, return a color.\nstatic u16 GetColorFromPersonality(u8 personality)\n{\n    u16 red = 0;\n    u16 green = 0;\n    u16 blue = 0;\n    u8 strength = (personality / 6) % 3;\n    u8 colorType = personality % 6;\n\n    switch (colorType)\n    {\n    case 0:\n        // Teal color\n        green = 21 - strength;\n        blue = green;\n        red = 0;\n        break;\n    case 1:\n        // Yellow color\n        blue = 0;\n        red = 21 - strength;\n        green = red;\n        break;\n    case 2:\n        // Purple color\n        blue = 21 - strength;\n        green = 0;\n        red = blue;\n        break;\n    case 3:\n        // Red color\n        blue = 0;\n        green = 0;\n        red = 23 - strength;\n        break;\n    case 4:\n        // Blue color\n        blue = 23 - strength;\n        green = 0;\n        red = 0;\n        break;\n    case 5:\n        // Green color\n        blue = 0;\n        green = 23 - strength;\n        red = 0;\n        break;\n    }\n\n    return RGB2(red, green, blue);\n}\n\nstatic u16 QuantizePixel_BlackAndWhite(u16 *color)\n{\n    u16 red = *color & 0x1F;\n    u16 green = (*color >> 5) & 0x1F;\n    u16 blue = (*color >> 10) & 0x1F;\n\n    if (red < 17 && green < 17 && blue < 17)\n        return RGB_BLACK;\n    else\n        return RGB_WHITE;\n}\n\nstatic u16 QuantizePixel_BlackOutline(u16 *pixelA, u16 *pixelB)\n{\n    if (*pixelA != RGB_BLACK)\n    {\n        if (*pixelA & 0x8000)\n            return 0x8000;\n        if (*pixelB & 0x8000)\n            return RGB_BLACK;\n\n        return *pixelA;\n    }\n\n    return RGB_BLACK;\n}\n\nstatic u16 QuantizePixel_Invert(u16 *color)\n{\n    u16 red = *color & 0x1F;\n    u16 green = (*color >> 5) & 0x1F;\n    u16 blue = (*color >> 10) & 0x1F;\n\n    red = 31 - red;\n    green = 31 - green;\n    blue = 31 - blue;\n\n    return RGB2(red, green, blue);\n}\n\nstatic u16 QuantizePixel_MotionBlur(u16 *prevPixel, u16 *curPixel)\n{\n    u16 pixelChannels[2][3];\n    u16 diffs[3];\n    u32 i;\n    u16 largestDiff;\n    u16 red, green, blue;\n\n    if (*prevPixel == *curPixel)\n        return *curPixel;\n\n    pixelChannels[0][0] = (*prevPixel >> 0)  & 0x1F;\n    pixelChannels[0][1] = (*prevPixel >> 5)  & 0x1F;\n    pixelChannels[0][2] = (*prevPixel >> 10) & 0x1F;\n    pixelChannels[1][0] = (*curPixel  >> 0)  & 0x1F;\n    pixelChannels[1][1] = (*curPixel  >> 5)  & 0x1F;\n    pixelChannels[1][2] = (*curPixel  >> 10) & 0x1F;\n\n    // Don't blur light colors.\n    if (pixelChannels[0][0] > 25 && pixelChannels[0][1] > 25 && pixelChannels[0][2] > 25)\n        return *curPixel;\n    if (pixelChannels[1][0] > 25 && pixelChannels[1][1] > 25 && pixelChannels[1][2] > 25)\n        return *curPixel;\n\n    for (i = 0; i < 3; i++)\n    {\n        if (pixelChannels[0][i] > pixelChannels[1][i])\n            diffs[i] = pixelChannels[0][i] - pixelChannels[1][i];\n        else\n            diffs[i] = pixelChannels[1][i] - pixelChannels[0][i];\n    }\n\n    // Find the largest diff of any of the color channels.\n    if (diffs[0] >= diffs[1])\n    {\n        if (diffs[0] >= diffs[2])\n            largestDiff = diffs[0];\n        else if (diffs[1] >= diffs[2])\n            largestDiff = diffs[1];\n        else\n            largestDiff = diffs[2];\n    }\n    else\n    {\n        if (diffs[1] >= diffs[2])\n            largestDiff = diffs[1];\n        else if (diffs[2] >= diffs[0])\n            largestDiff = diffs[2];\n        else\n            largestDiff = diffs[0];\n    }\n\n    red =   (pixelChannels[1][0] * (31 - largestDiff / 2)) / 31;\n    green = (pixelChannels[1][1] * (31 - largestDiff / 2)) / 31;\n    blue =  (pixelChannels[1][2] * (31 - largestDiff / 2)) / 31;\n    return RGB2(red, green, blue);\n}\n\nstatic u16 QuantizePixel_Blur(u16 *prevPixel, u16 *curPixel, u16 *nextPixel)\n{\n    u16 red, green, blue;\n    u16 prevAvg, curAvg, nextAvg;\n    u16 prevDiff, nextDiff;\n    u32 diff;\n    u16 factor;\n\n    if (*prevPixel == *curPixel && *nextPixel == *curPixel)\n        return *curPixel;\n\n    red   = (*curPixel >> 0)  & 0x1F;\n    green = (*curPixel >> 5)  & 0x1F;\n    blue  = (*curPixel >> 10) & 0x1F;\n\n    prevAvg = (((*prevPixel >> 0) & 0x1F) + ((*prevPixel >> 5) & 0x1F) + ((*prevPixel >> 10) & 0x1F)) / 3;\n    curAvg  = (((*curPixel  >> 0) & 0x1F) + ((*curPixel  >> 5) & 0x1F) + ((*curPixel  >> 10) & 0x1F)) / 3;\n    nextAvg = (((*nextPixel >> 0) & 0x1F) + ((*nextPixel >> 5) & 0x1F) + ((*nextPixel >> 10) & 0x1F)) / 3;\n\n    if (prevAvg == curAvg && nextAvg == curAvg)\n        return *curPixel;\n\n    if (prevAvg > curAvg)\n        prevDiff = prevAvg - curAvg;\n    else\n        prevDiff = curAvg - prevAvg;\n\n    if (nextAvg > curAvg)\n        nextDiff = nextAvg - curAvg;\n    else\n        nextDiff = curAvg - nextAvg;\n\n    if (prevDiff >= nextDiff)\n        diff = prevDiff;\n    else\n        diff = nextDiff;\n\n    factor = 31 - diff / 2;\n    red   = (red   * factor) / 31;\n    green = (green * factor) / 31;\n    blue  = (blue  * factor) / 31;\n    return RGB2(red, green, blue);\n}\n\nstatic u16 QuantizePixel_BlurHard(u16 *prevPixel, u16 *curPixel, u16 *nextPixel)\n{\n    u16 red, green, blue;\n    u16 prevAvg, curAvg, nextAvg;\n    u16 prevDiff, nextDiff;\n    u32 diff;\n    u16 factor;\n\n    if (*prevPixel == *curPixel && *nextPixel == *curPixel)\n        return *curPixel;\n\n    red   = (*curPixel >> 0)  & 0x1F;\n    green = (*curPixel >> 5)  & 0x1F;\n    blue  = (*curPixel >> 10) & 0x1F;\n\n    prevAvg = (((*prevPixel >> 0) & 0x1F) + ((*prevPixel >> 5) & 0x1F) + ((*prevPixel >> 10) & 0x1F)) / 3;\n    curAvg  = (((*curPixel  >> 0) & 0x1F) + ((*curPixel  >> 5) & 0x1F) + ((*curPixel  >> 10) & 0x1F)) / 3;\n    nextAvg = (((*nextPixel >> 0) & 0x1F) + ((*nextPixel >> 5) & 0x1F) + ((*nextPixel >> 10) & 0x1F)) / 3;\n\n    if (prevAvg == curAvg && nextAvg == curAvg)\n        return *curPixel;\n\n    if (prevAvg > curAvg)\n        prevDiff = prevAvg - curAvg;\n    else\n        prevDiff = curAvg - prevAvg;\n\n    if (nextAvg > curAvg)\n        nextDiff = nextAvg - curAvg;\n    else\n        nextDiff = curAvg - nextAvg;\n\n    if (prevDiff >= nextDiff)\n        diff = prevDiff;\n    else\n        diff = nextDiff;\n\n    factor = 31 - diff;\n    red   = (red   * factor) / 31;\n    green = (green * factor) / 31;\n    blue  = (blue  * factor) / 31;\n    return RGB2(red, green, blue);\n}\n\nvoid ConvertImageProcessingToGBA(struct ImageProcessingContext *context)\n{\n    u16 i, j, k;\n    u16 *src, *dest, *src_, *dest_;\n    u16 width, height;\n\n    width = context->canvasWidth >> 3;\n    height = context->canvasHeight >> 3;\n    src_ = context->canvasPixels;\n    dest_ = context->dest;\n\n    if (context->var_16 == 2)\n    {\n        for (i = 0; i < height; i++)\n        {\n            for (j = 0; j < width; j++)\n            {\n                for (k = 0; k < 8; k++)\n                {\n                    dest = dest_ + ((i * width + j) << 5) + (k << 2);\n                    src = src_ + ((((i << 3) + k) << 3) * width) + (j << 3);\n\n                    dest[0] = src[0] | (src[1] << 8);\n                    dest[1] = src[2] | (src[3] << 8);\n                    dest[2] = src[4] | (src[5] << 8);\n                    dest[3] = src[6] | (src[7] << 8);\n                }\n            }\n        }\n    }\n    else\n    {\n        for (i = 0; i < height; i++)\n        {\n            for (j = 0; j < width; j++)\n            {\n                for (k = 0; k < 8; k++)\n                {\n                    dest = dest_ + ((i * width + j) << 4) + (k << 1);\n                    src = src_ + ((((i << 3) + k) << 3) * width) + (j << 3);\n\n                    dest[0] = src[0] | (src[1] << 4) | (src[2] << 8) | (src[3] << 0xC);\n                    dest[1] = src[4] | (src[5] << 4) | (src[6] << 8) | (src[7] << 0xC);\n                }\n            }\n        }\n    }\n}\n\nvoid ApplyImageProcessingQuantization(struct ImageProcessingContext *context)\n{\n    gCanvasPaletteStart = context->paletteStart * 16;\n    gCanvasPalette = &context->canvasPalette[gCanvasPaletteStart];\n    gCanvasPixels = context->canvasPixels;\n    gCanvasColumnStart = context->columnStart;\n    gCanvasRowStart = context->rowStart;\n    gCanvasColumnEnd = context->columnEnd;\n    gCanvasRowEnd = context->rowEnd;\n    gCanvasWidth = context->canvasWidth;\n    gCanvasHeight = context->canvasHeight;\n\n    switch (context->quantizeEffect)\n    {\n    case QUANTIZE_EFFECT_STANDARD:\n        QuantizePalette_Standard(FALSE);\n        break;\n    case QUANTIZE_EFFECT_STANDARD_LIMITED_COLORS:\n        QuantizePalette_Standard(TRUE);\n        break;\n    case QUANTIZE_EFFECT_PRIMARY_COLORS:\n        SetPresetPalette_PrimaryColors();\n        QuantizePalette_PrimaryColors();\n        break;\n    case QUANTIZE_EFFECT_GRAYSCALE:\n        SetPresetPalette_Grayscale();\n        QuantizePalette_Grayscale();\n        break;\n    case QUANTIZE_EFFECT_GRAYSCALE_SMALL:\n        SetPresetPalette_GrayscaleSmall();\n        QuantizePalette_GrayscaleSmall();\n        break;\n    case QUANTIZE_EFFECT_BLACK_WHITE:\n        SetPresetPalette_BlackAndWhite();\n        QuantizePalette_BlackAndWhite();\n        break;\n    }\n}\n\nstatic void SetPresetPalette_PrimaryColors(void)\n{\n    gCanvasPalette[0]  = RGB2(0, 0, 0);\n    gCanvasPalette[1]  = RGB2(6, 6, 6);\n    gCanvasPalette[2]  = RGB2(29, 29, 29);\n    gCanvasPalette[3]  = RGB2(11, 11, 11);\n    gCanvasPalette[4]  = RGB2(29, 6, 6);\n    gCanvasPalette[5]  = RGB2(6, 29, 6);\n    gCanvasPalette[6]  = RGB2(6, 6, 29);\n    gCanvasPalette[7]  = RGB2(29, 29, 6);\n    gCanvasPalette[8]  = RGB2(29, 6, 29);\n    gCanvasPalette[9]  = RGB2(6, 29, 29);\n    gCanvasPalette[10] = RGB2(29, 11, 6);\n    gCanvasPalette[11] = RGB2(11, 29, 6);\n    gCanvasPalette[12] = RGB2(6, 11, 29);\n    gCanvasPalette[13] = RGB2(29, 6, 11);\n    gCanvasPalette[14] = RGB2(6, 29, 11);\n    gCanvasPalette[15] = RGB2(11, 6, 29);\n}\n\nstatic void SetPresetPalette_BlackAndWhite(void)\n{\n    gCanvasPalette[0] = RGB2(0, 0, 0);\n    gCanvasPalette[1] = RGB2(0, 0, 0);\n    gCanvasPalette[2] = RGB2(31, 31, 31);\n}\n\nstatic void SetPresetPalette_GrayscaleSmall(void)\n{\n    u32 i;\n\n    gCanvasPalette[0] = RGB2(0, 0, 0);\n    gCanvasPalette[1] = RGB2(0, 0, 0);\n    for (i = 0; i < 14; i++)\n        gCanvasPalette[i + 2] = RGB2(2 * (i + 2), 2 * (i + 2), 2 * (i + 2));\n}\n\nstatic void SetPresetPalette_Grayscale(void)\n{\n    u32 i;\n\n    gCanvasPalette[0] = RGB2(0, 0, 0);\n    for (i = 0; i < 32; i++)\n        gCanvasPalette[i + 1] = RGB2(i, i, i);\n}\n\nstatic void QuantizePalette_Standard(bool8 useLimitedPalette)\n{\n    u8 i, j;\n    u16 maxIndex;\n\n    maxIndex = 0xDF;\n    if (!useLimitedPalette)\n        maxIndex = 0xFF;\n\n    for (i = 0; i < maxIndex; i++)\n        gCanvasPalette[i] = RGB_BLACK;\n\n    gCanvasPalette[maxIndex] = RGB2(15, 15, 15);\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart];\n        for (i = 0; i < gCanvasColumnEnd; i++, pixel++)\n        {\n            if (*pixel & 0x8000)\n            {\n                *pixel = gCanvasPaletteStart;\n            }\n            else\n            {\n                u16 quantizedColor = QuantizePixel_Standard(pixel);\n                u8 curIndex = 1;\n                if (curIndex < maxIndex)\n                {\n                    if (gCanvasPalette[curIndex] == RGB_BLACK)\n                    {\n                        // The quantized color does not match any existing color in the\n                        // palette, so we add it to the palette.\n                        // This if block seems pointless because the below while loop handles\n                        // this same logic.\n                        gCanvasPalette[curIndex] = quantizedColor;\n                        *pixel = gCanvasPaletteStart + curIndex;\n                    }\n                    else\n                    {\n                        while (curIndex < maxIndex)\n                        {\n                            if (gCanvasPalette[curIndex] == RGB_BLACK)\n                            {\n                                // The quantized color does not match any existing color in the\n                                // palette, so we add it to the palette.\n                                gCanvasPalette[curIndex] = quantizedColor;\n                                *pixel = gCanvasPaletteStart + curIndex;\n                                break;\n                            }\n\n                            if (gCanvasPalette[curIndex] == quantizedColor)\n                            {\n                                // The quantized color matches this existing color in the\n                                // palette, so we use this existing color for the pixel.\n                                *pixel = gCanvasPaletteStart + curIndex;\n                                break;\n                            }\n\n                            curIndex++;\n                        }\n                    }\n                }\n\n                if (curIndex == maxIndex)\n                {\n                    // The entire palette's colors are already in use, which means\n                    // the base image has too many colors to handle. This error is handled\n                    // by marking such pixels as gray color.\n                    curIndex = maxIndex;\n                    *pixel = curIndex;\n                }\n            }\n        }\n    }\n}\n\nstatic void QuantizePalette_BlackAndWhite(void)\n{\n    u8 i, j;\n\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart];\n        for (i = 0; i < gCanvasColumnEnd; i++, pixel++)\n        {\n            if (*pixel & 0x8000)\n            {\n                *pixel = gCanvasPaletteStart;\n            }\n            else\n            {\n                if (QuantizePixel_BlackAndWhite(pixel) == RGB_BLACK)\n                {\n                    // Black is the first color in the quantized palette.\n                    *pixel = gCanvasPaletteStart + 1;\n                }\n                else\n                {\n                    // White is the second color in the quantized palette.\n                    *pixel = gCanvasPaletteStart + 2;\n                }\n            }\n        }\n    }\n}\n\nstatic void QuantizePalette_GrayscaleSmall(void)\n{\n    u8 i, j;\n\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart];\n        for (i = 0; i < gCanvasColumnEnd; i++, pixel++)\n        {\n            if (*pixel & 0x8000)\n                *pixel = gCanvasPaletteStart;\n            else\n                *pixel = QuantizePixel_GrayscaleSmall(pixel) + gCanvasPaletteStart;\n        }\n    }\n}\n\nstatic void QuantizePalette_Grayscale(void)\n{\n    u8 i, j;\n\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart];\n        for (i = 0; i < gCanvasColumnEnd; i++, pixel++)\n        {\n            if (*pixel & 0x8000)\n                *pixel = gCanvasPaletteStart;\n            else\n                *pixel = QuantizePixel_Grayscale(pixel) + gCanvasPaletteStart;\n        }\n    }\n}\n\nstatic void QuantizePalette_PrimaryColors(void)\n{\n    u8 i, j;\n\n    for (j = 0; j < gCanvasRowEnd; j++)\n    {\n        u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth];\n        u16 *pixel = &pixelRow[gCanvasColumnStart];\n        for (i = 0; i < gCanvasColumnEnd; i++, pixel++)\n        {\n            if (*pixel & 0x8000)\n                *pixel = gCanvasPaletteStart;\n            else\n                *pixel = QuantizePixel_PrimaryColors(pixel) + gCanvasPaletteStart;\n        }\n    }\n}\n\n// Quantizes the pixel's color channels to nearest multiple of 4, and clamps to [6, 30].\nstatic u16 QuantizePixel_Standard(u16 *pixel)\n{\n    u16 red = *pixel & 0x1F;\n    u16 green = (*pixel >> 5) & 0x1F;\n    u16 blue = (*pixel >> 10) & 0x1F;\n\n    // Quantize color channels to muliples of 4, rounding up.\n    if (red & 3)\n        red = (red & 0x1C) + 4;\n    if (green & 3)\n        green = (green & 0x1C) + 4;\n    if (blue & 3)\n        blue = (blue & 0x1C) + 4;\n\n    // Clamp channels to [6, 30].\n    if (red < 6)\n        red = 6;\n    if (red > 30)\n        red = 30;\n    if (green < 6)\n        green = 6;\n    if (green > 30)\n        green = 30;\n    if (blue < 6)\n        blue = 6;\n    if (blue > 30)\n        blue = 30;\n\n    return RGB2(red, green, blue);\n}\n\nstatic u16 QuantizePixel_PrimaryColors(u16 *color)\n{\n    u16 red = *color & 0x1F;\n    u16 green = (*color >> 5) & 0x1F;\n    u16 blue = (*color >> 10) & 0x1F;\n\n    if (red < 12 && green < 11 && blue < 11)\n        return 1;\n\n    if (red > 19 && green > 19 && blue > 19)\n        return 2;\n\n    if (red > 19)\n    {\n        if (green > 19)\n        {\n            if (blue > 14)\n                return 2;\n            else\n                return 7;\n        }\n        else if (blue > 19)\n        {\n            if (green > 14)\n                return 2;\n            else\n                return 8;\n        }\n    }\n\n    if (green > 19 && blue > 19)\n    {\n        if (red > 14)\n            return 2;\n        else\n            return 9;\n    }\n\n    if (red > 19)\n    {\n        if (green > 11)\n        {\n            if (blue > 11)\n            {\n                if (green < blue)\n                    return 8;\n                else\n                    return 7;\n            }\n            else\n            {\n                return 10;\n            }\n        }\n        else if (blue > 11)\n        {\n            return 13;\n        }\n        else\n        {\n            return 4;\n        }\n    }\n\n    if (green > 19)\n    {\n        if (red > 11)\n        {\n            if (blue > 11)\n            {\n                if (red < blue)\n                    return 9;\n                else\n                    return 7;\n            }\n            else\n            {\n                return 11;\n            }\n        }\n        else\n        {\n            if (blue > 11)\n                return 14;\n            else\n                return 5;\n        }\n    }\n\n    if (blue > 19)\n    {\n        if (red > 11)\n        {\n            if (green > 11)\n            {\n                if (red < green)\n                    return 9;\n                else\n                    return 8;\n            }\n        }\n        else if (green > 11)\n        {\n            return 12;\n        }\n\n        if (blue > 11)\n            return 15;\n        else\n            return 6;\n    }\n\n    return 3;\n}\n\nstatic u16 QuantizePixel_GrayscaleSmall(u16 *color)\n{\n    u16 red = *color & 0x1F;\n    u16 green = (*color >> 5) & 0x1F;\n    u16 blue = (*color >> 10) & 0x1F;\n    u16 average = ((red + green + blue) / 3) & 0x1E;\n    if (average == 0)\n        return 1;\n    else\n        return average / 2;\n}\n\nstatic u16 QuantizePixel_Grayscale(u16 *color)\n{\n    u16 red = *color & 0x1F;\n    u16 green = (*color >> 5) & 0x1F;\n    u16 blue = (*color >> 10) & 0x1F;\n    u16 average = (red + green + blue) / 3;\n    return average + 1;\n}\n"
  },
  {
    "path": "src/intro.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"m4a.h\"\n#include \"task.h\"\n#include \"scanline_effect.h\"\n#include \"libgcnmultiboot.h\"\n#include \"new_menu_helpers.h\"\n#include \"link.h\"\n#include \"menu.h\"\n#include \"random.h\"\n#include \"save.h\"\n#include \"new_game.h\"\n#include \"title_screen.h\"\n#include \"decompress.h\"\n#include \"util.h\"\n#include \"trig.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n\n/*\n    The intro is grouped into the following scenes\n    - Copyright screen\n    - GF Logo\n    Scene 1. Brief close up shot of grass\n    Scene 2. A panning wide shot followed by a close-up of Gengar/Nidorino\n    Scene 3. A fight between Gengar/Nidorino\n\n    After this it progresses to the title screen\n*/\n\nenum {\n    GFXTAG_STAR,\n    GFXTAG_SPARKLES_SMALL,\n    GFXTAG_SPARKLES_BIG,\n    GFXTAG_GF_LOGO,\n    GFXTAG_PRESENTS,\n    GFXTAG_SCENE3_NIDORINO,\n    GFXTAG_SCENE2_GENGAR,\n    GFXTAG_SCENE2_NIDORINO,\n    GFXTAG_SCENE3_GRASS,\n    GFXTAG_SCENE3_GENGAR,\n    GFXTAG_SCENE3_SWIPE,\n    GFXTAG_SCENE3_RECOIL_DUST,\n};\n\nenum {\n    PALTAG_STAR,\n    PALTAG_SPARKLES,\n    PALTAG_UNUSED_2,\n    PALTAG_GF,\n    PALTAG_UNUSED_4,\n    PALTAG_UNUSED_5,\n    PALTAG_GENGAR,\n    PALTAG_NIDORINO,\n    PALTAG_SCENE3_GRASS,\n    PALTAG_UNUSED_9,\n    PALTAG_SCENE3_SWIPE,\n    PALTAG_SCENE3_RECOIL_DUST,\n};\n\n// Background IDs for Game Freak logo scene\nenum {\n    BG_GF_TEXT_LOGO = 2,\n    BG_GF_BACKGROUND   \n};\n\n\n// Background IDs for Scene 1\nenum {\n    BG_SCENE1_GRASS,\n    BG_SCENE1_BACKGROUND,\n    BG_SCENE1_UNUSED1,\n    BG_SCENE1_UNUSED2\n};\n\n#define PALSLOT_SCENE1_GRASS 1\n#define PALSLOT_SCENE1_BG    2\n\n// Background IDs for Scene 2\nenum {\n    BG_SCENE2_PLANTS,\n    BG_SCENE2_NIDORINO,\n    BG_SCENE2_GENGAR,\n    BG_SCENE2_BACKGROUND // Bg for wide shot on upper half, close up on lower half\n};\n\n// Background IDs for Scene 3\nenum {\n    BG_SCENE3_GENGAR,\n    BG_SCENE3_BACKGROUND,\n    BG_SCENE3_UNUSED1,\n    BG_SCENE3_UNUSED2\n};\n\nenum {\n    ANIM_NIDORINO_NORMAL,\n    ANIM_NIDORINO_CRY,\n    ANIM_NIDORINO_CROUCH,\n    ANIM_NIDORINO_HOP,\n    ANIM_NIDORINO_ATTACK,\n};\n\nenum {\n    ANIM_SPARKLE_LOOP,\n    ANIM_SPARKLE_ONCE,\n};\n\nenum {\n    ANIM_SWIPE_TOP,\n    ANIM_SWIPE_BOTTOM,\n};\n\nenum {\n    AFFINEANIM_NORMAL,\n    AFFINEANIM_ZOOM,\n};\n\n// Window ids for sWindowTemplates (only one)\nenum {\n    WIN_GF_TEXT_LOGO,\n    WIN_COUNT\n};\n\n#define NUM_GENGAR_BACK_SPRITES 4\n\n#define COLOSSEUM_GAME_CODE 0x65366347 // \"Gc6e\" in ASCII\n\nstruct IntroSequenceData;\n\ntypedef void (*IntroCallback)(struct IntroSequenceData *);\n\nstruct IntroSequenceData\n{\n    IntroCallback callback;\n    u8 state;\n    u8 taskId;\n    bool8 gengarAttackLanded;\n    u16 data[5]; // [0] and [1] are set but never read, the rest are unused\n    u16 timer;\n    struct Sprite *gameFreakLogoArtSprite;\n    struct Sprite *scene3NidorinoSprite;\n    struct Sprite *scene2GengarSprite;\n    struct Sprite *scene2NidorinoSprite;\n    struct Sprite *scene3GrassSprite;\n    struct Sprite *scene3GengarSprites[NUM_GENGAR_BACK_SPRITES];\n    u8 unused0[4];\n    u8 gameFreakLogoGfx[0x400];\n    u8 gameFreakTextGfx[0x400];\n    u8 unused1[0x2080];\n}; // size: 0x28BC\n\nstatic EWRAM_DATA struct GcmbStruct sGcmb = {0};\nstatic EWRAM_DATA u16 sUnusedScene3Var0 = 0; // Set but never read\nstatic EWRAM_DATA u16 sUnusedScene3Var1 = 0; // Set but never read\nstatic EWRAM_DATA u16 sNidorinoJumpMult = 0;\nstatic EWRAM_DATA u16 sNidorinoAnimDelayTime = 0;\nstatic EWRAM_DATA u16 sNidorinoJumpDiv = 0;\nstatic EWRAM_DATA u16 sNidorinoRecoilReturnTime = 0;\nstatic EWRAM_DATA u16 sNidorinoUnusedVar = 0; // Set but never read\nstatic EWRAM_DATA u16 sStarSpeedX = 0;\nstatic EWRAM_DATA u16 sStarSpeedY = 0;\nstatic EWRAM_DATA u16 sStarSparklesXmodMask = 0;\nstatic EWRAM_DATA u16 sStarSparklesUnusedVar = 0; // Set but never read\nstatic EWRAM_DATA u16 sStarSparklesSpawnRate = 0;\nstatic EWRAM_DATA u16 sStarSparklesFlickerStartTime = 0;\nstatic EWRAM_DATA u16 sStarSparklesDestroySpriteTime = 0;\nstatic EWRAM_DATA u16 sStarSparklesGravityShift = 0;\nstatic EWRAM_DATA u16 sStarSparklesXspeed = 0;\nstatic EWRAM_DATA u16 sStarSparklesYspeed = 0;\nstatic EWRAM_DATA u16 sStarSparklesXprecision = 0;\nstatic EWRAM_DATA u16 sStarSparklesYprecision = 0;\n\n// General\nstatic void CB2_SetUpIntro(void);\nstatic void CB2_Intro(void);\nstatic void VBlankCB_Intro(void);\nstatic void Intro_ResetGpuRegs(void);\nstatic void StartIntroSequence(void);\nstatic void Task_CallIntroCallback(u8 taskId);\nstatic void SetIntroCB(struct IntroSequenceData * ptr, IntroCallback cb);\nstatic void IntroCB_Init(struct IntroSequenceData * ptr);\nstatic void LoadFightSceneSpriteGraphics(void);\nstatic void IntroCB_ExitToTitleScreen(struct IntroSequenceData * ptr);\n\n// GF scene\nstatic void IntroCB_GF_OpenWindow(struct IntroSequenceData * ptr);\nstatic void IntroCB_GF_Star(struct IntroSequenceData * ptr);\nstatic void IntroCB_GF_RevealName(struct IntroSequenceData * ptr);\nstatic void IntroCB_GF_RevealLogo(struct IntroSequenceData * ptr);\nstatic void GFScene_LoadGfxCreateStar(void);\nstatic void GFScene_StartNameSparklesSmall(void);\nstatic void GFScene_StartNameSparklesBig(void);\nstatic void GFScene_Task_NameSparklesSmall(u8 taskId);\nstatic void GFScene_Task_NameSparklesBig(u8 taskId);\nstatic struct Sprite *GFScene_CreateLogoSprite(void);\nstatic void GFScene_CreatePresentsSprite(void);\nstatic void SpriteCB_Star(struct Sprite *sprite);\nstatic void SpriteCB_SparklesSmall_Star(struct Sprite *sprite);\nstatic void SpriteCB_SparklesSmall_Name(struct Sprite *sprite);\nstatic void SpriteCB_SparklesBig(struct Sprite *sprite);\n\n// Scene 1\nstatic void IntroCB_Scene1(struct IntroSequenceData * ptr);\nstatic void Scene1_Task_AnimateGrass(u8 taskId);\nstatic void Scene1_StartGrassScrolling(void);\nstatic void Scene1_Task_BgZoom(u8 taskId);\n\n// Scene 2\nstatic void IntroCB_Scene2(struct IntroSequenceData * ptr);\nstatic void Scene2_Task_PanForest(u8 taskId);\nstatic void Scene2_Task_PanMons(u8 taskId);\nstatic void Scene2_CreateMonSprites(struct IntroSequenceData * ptr);\nstatic void Scene2_DestroyMonSprites(struct IntroSequenceData * ptr);\n\n// Scene 3\nstatic void IntroCB_Scene3_Entrance(struct IntroSequenceData * ptr);\nstatic void IntroCB_Scene3_Fight(struct IntroSequenceData * ptr);\nstatic void Scene3_StartBgScroll(void);\nstatic void Scene3_Task_GengarBounce(u8 taskId);\nstatic void Scene3_CreateGrassSprite(struct IntroSequenceData * ptr);\nstatic void Scene3_CreateGengarSprite(struct IntroSequenceData * ptr);\nstatic void Scene3_StartNidorinoCry(struct IntroSequenceData * ptr);\nstatic void Scene3_StartNidorinoHop(struct Sprite *sprite, u16 time, s16 targetX, u8 heightShift);\nstatic void Scene3_StartGengarAttack(struct IntroSequenceData * ptr);\nstatic void Scene3_Task_GengarAttack(u8 taskId);\nstatic void Scene3_NidorinoZoom(struct IntroSequenceData * ptr);\nstatic void Scene3_GengarZoom(struct IntroSequenceData * ptr);\nstatic void Scene3_CreateGengarSwipeSprites(void);\nstatic void Scene3_Task_GengarEnter(u8 taskId);\nstatic void Scene3_CreateNidorinoSprite(struct IntroSequenceData * ptr);\nstatic void Scene3_StartNidorinoEntrance(struct Sprite *sprite, s16 xStart, s16 xEnd, u16 speed);\nstatic void Scene3_SpriteCB_NidorinoEnter(struct Sprite *sprite);\nstatic bool32 Scene3_IsNidorinoEntering(struct IntroSequenceData * ptr);\nstatic void Scene3_StartNidorinoRecoil(struct IntroSequenceData * ptr);\nstatic bool8 Scene3_NidorinoAnimIsRunning(struct IntroSequenceData * ptr);\nstatic void CreateNidorinoRecoilDustSprites(s16 x, s16 y, s16 seed);\nstatic void Scene3_StartNidorinoAttack(struct IntroSequenceData * ptr);\nstatic void SpriteCB_Grass(struct Sprite *sprite);\nstatic void SpriteCB_GengarSwipe(struct Sprite *sprite);\nstatic void SpriteCB_RecoilDust(struct Sprite *sprite);\nstatic void SpriteCB_NidorinoCry(struct Sprite *sprite);\nstatic void SpriteCB_NidorinoRecoil(struct Sprite *sprite);\nstatic void SpriteCB_NidorinoHop(struct Sprite *sprite);\nstatic void SpriteCB_NidorinoAttack(struct Sprite *sprite);\n\nextern const u32 gMultiBootProgram_PokemonColosseum_Start[];\nextern const u32 gMultiBootProgram_PokemonColosseum_End[];\n\nstatic const u16 sCopyright_Pal[] = INCBIN_U16(\"graphics/intro/copyright.gbapal\");\nstatic const u8 sCopyright_Gfx[]  = INCBIN_U8( \"graphics/intro/copyright.4bpp.lz\");\nstatic const u8 sCopyright_Map[]  = INCBIN_U8( \"graphics/intro/copyright.bin.lz\");\n\n// Game Freak\nstatic const u16 sGameFreakBg_Pal[]   = INCBIN_U16(\"graphics/intro/game_freak/bg.gbapal\");\nstatic const u8 sGameFreakBg_Gfx[]    = INCBIN_U8( \"graphics/intro/game_freak/bg.4bpp.lz\");\nstatic const u8 sGameFreakBg_Map[]    = INCBIN_U8( \"graphics/intro/game_freak/bg.bin.lz\");\nstatic const u16 sGameFreakLogo_Pal[] = INCBIN_U16(\"graphics/intro/game_freak/logo.gbapal\");\nstatic const u8 sGameFreakText_Gfx[]  = INCBIN_U8( \"graphics/intro/game_freak/game_freak.4bpp.lz\");\nstatic const u32 sGameFreakLogo_Gfx[] = INCBIN_U32(\"graphics/intro/game_freak/logo.4bpp.lz\");\nstatic const u16 sStar_Pal[]          = INCBIN_U16(\"graphics/intro/game_freak/star.gbapal\");\nstatic const u32 sStar_Gfx[]          = INCBIN_U32(\"graphics/intro/game_freak/star.4bpp.lz\");\nstatic const u16 sSparkles_Pal[]      = INCBIN_U16(\"graphics/intro/game_freak/sparkles.gbapal\");\nstatic const u32 sSparklesSmall_Gfx[] = INCBIN_U32(\"graphics/intro/game_freak/sparkles_small.4bpp.lz\");\nstatic const u32 sSparklesBig_Gfx[]   = INCBIN_U32(\"graphics/intro/game_freak/sparkles_big.4bpp.lz\");\nstatic const u32 sPresents_Gfx[]      = INCBIN_U32(\"graphics/intro/game_freak/presents.4bpp.lz\");\n\n// Scene 1 (Grass close up)\nstatic const u16 sScene1_Grass_Pal[] = INCBIN_U16(\"graphics/intro/scene_1/grass.gbapal\");\nstatic const u8 sScene1_Grass_Gfx[]  = INCBIN_U8( \"graphics/intro/scene_1/grass.4bpp.lz\");\nstatic const u8 sScene1_Grass_Map[]  = INCBIN_U8( \"graphics/intro/scene_1/grass.bin.lz\");\nstatic const u16 sScene1_Bg_Pal[]    = INCBIN_U16(\"graphics/intro/scene_1/bg.gbapal\");\nstatic const u8 sScene1_Bg_Gfx[]     = INCBIN_U8( \"graphics/intro/scene_1/bg.4bpp.lz\");\nstatic const u8 sScene1_Bg_Map[]     = INCBIN_U8( \"graphics/intro/scene_1/bg.bin.lz\");\n\n// Scenes 2 and 3 (Gengar and Nidorino)\nstatic const u16 sScene2_Bg_Pal[]            = INCBIN_U16(\"graphics/intro/scene_2/bg.gbapal\");\nstatic const u8 sScene2_Bg_Gfx[]             = INCBIN_U8( \"graphics/intro/scene_2/bg.4bpp.lz\");\nstatic const u8 sScene2_Bg_Map[]             = INCBIN_U8( \"graphics/intro/scene_2/bg.bin.lz\");\nstatic const u16 sScene2_Plants_Pal[]        = INCBIN_U16(\"graphics/intro/scene_2/plants.gbapal\"); // Unused\nstatic const u8 sScene2_Plants_Gfx[]         = INCBIN_U8( \"graphics/intro/scene_2/plants.4bpp.lz\");\nstatic const u8 sScene2_Plants_Map[]         = INCBIN_U8( \"graphics/intro/scene_2/plants.bin.lz\");\nstatic const u16 sGengar_Pal[]               = INCBIN_U16(\"graphics/intro/gengar.gbapal\"); // Used by multiple scenes\nstatic const u8 sScene2_GengarClose_Gfx[]    = INCBIN_U8( \"graphics/intro/scene_2/gengar_close.4bpp.lz\");\nstatic const u8 sScene2_GengarClose_Map[]    = INCBIN_U8( \"graphics/intro/scene_2/gengar_close.bin.lz\");\nstatic const u16 sScene2_NidorinoClose_Pal[] = INCBIN_U16(\"graphics/intro/scene_2/nidorino_close.gbapal\");\nstatic const u8 sScene2_NidorinoClose_Gfx[]  = INCBIN_U8( \"graphics/intro/scene_2/nidorino_close.4bpp.lz\");\nstatic const u8 sScene2_NidorinoClose_Map[]  = INCBIN_U8( \"graphics/intro/scene_2/nidorino_close.bin.lz\");\nstatic const u16 sScene3_Bg_Pal[]            = INCBIN_U16(\"graphics/intro/scene_3/bg.gbapal\");\nstatic const u8 sScene3_Bg_Gfx[]             = INCBIN_U8( \"graphics/intro/scene_3/bg.4bpp.lz\");\nstatic const u8 sScene3_Bg_Map[]             = INCBIN_U8( \"graphics/intro/scene_3/bg.bin.lz\");\nstatic const u8 sScene3_GengarAnim_Gfx[]     = INCBIN_U8( \"graphics/intro/scene_3/gengar_anim.4bpp.lz\");\nstatic const u8 sScene3_GengarAnim_Map[]     = INCBIN_U8( \"graphics/intro/scene_3/gengar_anim.bin.lz\");\nstatic const u32 sScene2_Gengar_Gfx[]        = INCBIN_U32(\"graphics/intro/scene_2/gengar.4bpp.lz\");\nstatic const u16 sNidorino_Pal[]             = INCBIN_U16(\"graphics/intro/nidorino.gbapal\"); // Used by multiple scenes\nstatic const u32 sScene2_Nidorino_Gfx[]      = INCBIN_U32(\"graphics/intro/scene_2/nidorino.4bpp.lz\");\nstatic const u16 sScene3_Grass_Pal[]         = INCBIN_U16(\"graphics/intro/scene_3/grass.gbapal\");\nstatic const u32 sScene3_Grass_Gfx[]         = INCBIN_U32(\"graphics/intro/scene_3/grass.4bpp.lz\");\nstatic const u32 sScene3_GengarStatic_Gfx[]  = INCBIN_U32(\"graphics/intro/scene_3/gengar_static.4bpp.lz\");\nstatic const u32 sScene3_Nidorino_Gfx[]      = INCBIN_U32(\"graphics/intro/scene_3/nidorino.4bpp.lz\");\nstatic const u16 sScene3_Swipe_Pal[]         = INCBIN_U16(\"graphics/intro/scene_3/swipe.gbapal\");\nstatic const u16 sScene3_RecoilDust_Pal[]    = INCBIN_U16(\"graphics/intro/scene_3/recoil_dust.gbapal\");\nstatic const u32 sScene3_Swipe_Gfx[]         = INCBIN_U32(\"graphics/intro/scene_3/swipe.4bpp.lz\");\nstatic const u32 sScene3_RecoilDust_Gfx[]    = INCBIN_U32(\"graphics/intro/scene_3/recoil_dust.4bpp.lz\");\n\nstatic const struct BgTemplate sBgTemplates_GameFreakScene[] = {\n    {\n        .bg = BG_GF_BACKGROUND,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }, {\n        .bg = BG_GF_TEXT_LOGO,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x010\n    }\n};\n\nstatic const struct BgTemplate sBgTemplates_Scene1[] = {\n    {\n        .bg = BG_SCENE1_GRASS,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 28,\n        .screenSize = 2,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = BG_SCENE1_BACKGROUND,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 30,\n        .screenSize = 2,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct BgTemplate sBgTemplates_Scene2[] = {\n    {\n        .bg = BG_SCENE2_BACKGROUND,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 30,\n        .screenSize = 2,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }, {\n        .bg = BG_SCENE2_PLANTS,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = BG_SCENE2_GENGAR,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 27,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000\n    }, {\n        .bg = BG_SCENE2_NIDORINO,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 28,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct BgTemplate sBgTemplates_Scene3[] = {\n\t{\n\t    .bg = BG_SCENE3_BACKGROUND,\n\t    .charBaseIndex = 0,\n\t    .mapBaseIndex = 29,\n\t    .screenSize = 0,\n\t    .paletteMode = 0,\n\t    .priority = 1,\n\t    .baseTile = 0x000\n    }, {\n\t    .bg = BG_SCENE3_GENGAR,\n\t    .charBaseIndex = 1,\n\t    .mapBaseIndex = 30,\n\t    .screenSize = 2,\n\t    .paletteMode = 0,\n\t    .priority = 0,\n\t    .baseTile = 0x000\n\t}\n};\n\nstatic const struct WindowTemplate sWindowTemplates[WIN_COUNT + 1] = {\n\t[WIN_GF_TEXT_LOGO] = {\n\t    .bg = BG_GF_TEXT_LOGO,\n\t    .tilemapLeft = 6,\n\t    .tilemapTop = 4,\n\t    .width = 18,\n\t    .height = 9,\n\t    .paletteNum = 13,\n\t    .baseBlock = 0x000\n    },\n    [WIN_COUNT] = DUMMY_WIN_TEMPLATE\n};\n\nstatic const u8 sGengarZoomMatrixAnchors[NUM_GENGAR_BACK_SPRITES][2] = {\n\t{63, 63},\n\t{ 0, 63},\n\t{63,  0},\n\t{ 0,  0}\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheets_GameFreakScene[] = {\n    {sStar_Gfx,          0x80,  GFXTAG_STAR},\n    {sSparklesSmall_Gfx, 0x80,  GFXTAG_SPARKLES_SMALL},\n    {sSparklesBig_Gfx,   0x800, GFXTAG_SPARKLES_BIG},\n    {sGameFreakLogo_Gfx, 0x400, GFXTAG_GF_LOGO},\n    {sPresents_Gfx,      0x100, GFXTAG_PRESENTS}\n};\n\nstatic const struct SpritePalette sSpritePalettes_GameFreakScene[] = {\n\t{sStar_Pal,          PALTAG_STAR},\n\t{sSparkles_Pal,      PALTAG_SPARKLES},\n\t{sGameFreakLogo_Pal, PALTAG_GF},\n\t{0}\n};\n\nstatic const struct Coords16 sTextSparkleCoords[] = {\n\t{ 72,  80},\n\t{136,  74},\n\t{168,  80},\n\t{120,  80},\n\t{104,  86},\n\t{ 88,  74},\n\t{184,  74},\n\t{ 56,  86},\n\t{152,  86}\n};\n\nstatic const struct OamData sOam_Star = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0x000,\n    .priority = 2,\n    .paletteNum = 0\n};\n\nstatic const struct OamData sOam_SparklesSmall = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0x000,\n    .priority = 2,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_SparklesSmall_Loop[] = {\n\tANIMCMD_FRAME(0, 4),\n\tANIMCMD_FRAME(1, 4),\n\tANIMCMD_FRAME(2, 4),\n\tANIMCMD_FRAME(3, 4),\n\tANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_SparklesSmall_Once[] = {\n\tANIMCMD_FRAME(0, 4),\n\tANIMCMD_FRAME(1, 4),\n\tANIMCMD_FRAME(2, 4),\n\tANIMCMD_FRAME(3, 4),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_SparklesSmall[] = {\n\t[ANIM_SPARKLE_LOOP] = sAnim_SparklesSmall_Loop,\n\t[ANIM_SPARKLE_ONCE] = sAnim_SparklesSmall_Once\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Star = {\n    .tileTag = GFXTAG_STAR,\n    .paletteTag = PALTAG_STAR,\n    .oam = &sOam_Star,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_Star\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_SparklesSmall = {\n    .tileTag = GFXTAG_SPARKLES_SMALL,\n    .paletteTag = PALTAG_SPARKLES,\n    .oam = &sOam_SparklesSmall,\n    .anims = sAnims_SparklesSmall,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_SparklesSmall_Star\n};\n\nstatic const struct OamData sOam_SparklesBig = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x32),\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0x000,\n    .priority = 2,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_SparklesBig[] = {\n\tANIMCMD_FRAME(0, 8),\n\tANIMCMD_FRAME(16, 8),\n\tANIMCMD_FRAME(32, 8),\n\tANIMCMD_FRAME(48, 8),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_SparklesBig[] = {\n\tsAnim_SparklesBig\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_SparklesBig = {\n    .tileTag = GFXTAG_SPARKLES_BIG,\n    .paletteTag = PALTAG_SPARKLES,\n    .oam = &sOam_SparklesBig,\n    .anims = sAnims_SparklesBig,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_SparklesBig\n};\n\nstatic const struct OamData sOam_GameFreakLogo = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x64),\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x64),\n    .tileNum = 0x000,\n    .priority = 3,\n    .paletteNum = 0\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_GameFreakLogoArt = {\n    .tileTag = GFXTAG_GF_LOGO,\n    .paletteTag = PALTAG_GF,\n    .oam = &sOam_GameFreakLogo,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOam_PresentsText = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x8),\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x8),\n    .tileNum = 0x000,\n    .priority = 3,\n    .paletteNum = 0\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Presents = {\n    .tileTag = GFXTAG_PRESENTS,\n    .paletteTag = PALTAG_GF,\n    .oam = &sOam_PresentsText,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOam_Scene3_Nidorino = {\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_Scene3_Nidorino_Normal[] = {\n\tANIMCMD_FRAME(0, 1),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Scene3_Nidorino_Cry[] = {\n\tANIMCMD_FRAME(64, 1),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Scene3_Nidorino_Crouch[] = {\n\tANIMCMD_FRAME(128, 1),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Scene3_Nidorino_Hop[] = {\n\tANIMCMD_FRAME(192, 1),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Scene3_Nidorino_Attack[] = {\n\tANIMCMD_FRAME(256, 1),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_Scene3_Nidorino[] = {\n    [ANIM_NIDORINO_NORMAL] = sAnim_Scene3_Nidorino_Normal,\n    [ANIM_NIDORINO_CRY]    = sAnim_Scene3_Nidorino_Cry,\n    [ANIM_NIDORINO_CROUCH] = sAnim_Scene3_Nidorino_Crouch,\n    [ANIM_NIDORINO_HOP]    = sAnim_Scene3_Nidorino_Hop,\n    [ANIM_NIDORINO_ATTACK] = sAnim_Scene3_Nidorino_Attack\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Scene3_Mons_Normal[] = {\n\tAFFINEANIMCMD_FRAME(256, 256, 0, 0),\n\tAFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Scene3_Mons_Zoom[] = {\n\tAFFINEANIMCMD_FRAME(256, 256, 0, 0),\n\tAFFINEANIMCMD_FRAME(32, 32, 0, 8),\n\tAFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_Scene3_Mons[] = {\n\t[AFFINEANIM_NORMAL] = sAffineAnim_Scene3_Mons_Normal,\n\t[AFFINEANIM_ZOOM]   = sAffineAnim_Scene3_Mons_Zoom\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Scene3_Nidorino = {\n    .tileTag = GFXTAG_SCENE3_NIDORINO,\n    .paletteTag = PALTAG_NIDORINO,\n    .oam = &sOam_Scene3_Nidorino,\n    .anims = sAnims_Scene3_Nidorino,\n    .images = NULL,\n    .affineAnims = sAffineAnims_Scene3_Mons,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOam_Scene2_Mons = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Scene2_Nidorino = {\n    .tileTag = GFXTAG_SCENE2_NIDORINO,\n    .paletteTag = PALTAG_NIDORINO,\n    .oam = &sOam_Scene2_Mons,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Scene2_Gengar = {\n    .tileTag = GFXTAG_SCENE2_GENGAR,\n    .paletteTag = PALTAG_GENGAR,\n    .oam = &sOam_Scene2_Mons,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOam_Grass = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x32),\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x32),\n    .tileNum = 0x000,\n    .priority = 0,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_Grass_Static[] = {\n\tANIMCMD_FRAME(0, 0),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Grass_Rustle[] = {\n\tANIMCMD_FRAME(32, 4),\n\tANIMCMD_FRAME(0, 4),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_Grass[] = {\n\tsAnim_Grass_Static,\n\tsAnim_Grass_Rustle // Unused\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Grass = {\n    .tileTag = GFXTAG_SCENE3_GRASS,\n    .paletteTag = PALTAG_SCENE3_GRASS,\n    .oam = &sOam_Grass,\n    .anims = sAnims_Grass,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOam_Scene3_Gengar = {\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_Scene3_Gengar_TopLeft[] = {\n\tANIMCMD_FRAME(0, 0),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Scene3_Gengar_TopRight[] = {\n\tANIMCMD_FRAME(64, 0),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Scene3_Gengar_BottomLeft[] = {\n\tANIMCMD_FRAME(96, 0),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Scene3_Gengar_BottomRight[] = {\n\tANIMCMD_FRAME(160, 0),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_Scene3_Gengar[NUM_GENGAR_BACK_SPRITES] = {\n\tsAnim_Scene3_Gengar_TopLeft,\n\tsAnim_Scene3_Gengar_TopRight,\n\tsAnim_Scene3_Gengar_BottomLeft,\n\tsAnim_Scene3_Gengar_BottomRight\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Scene3_Gengar = {\n    .tileTag = GFXTAG_SCENE3_GENGAR,\n    .paletteTag = PALTAG_GENGAR,\n    .oam = &sOam_Scene3_Gengar,\n    .anims = sAnims_Scene3_Gengar,\n    .images = NULL,\n    .affineAnims = sAffineAnims_Scene3_Mons,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOam_Swipe = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x64),\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x64),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_Swipe_Top[] = {\n\tANIMCMD_FRAME(0, 8),\n\tANIMCMD_FRAME(32, 4),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Swipe_Bottom[] = {\n\tANIMCMD_FRAME(64, 8),\n\tANIMCMD_FRAME(72, 4),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_Swipe[] = {\n    [ANIM_SWIPE_TOP]    = sAnim_Swipe_Top,\n    [ANIM_SWIPE_BOTTOM] = sAnim_Swipe_Bottom\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_GengarSwipe = {\n    .tileTag = GFXTAG_SCENE3_SWIPE,\n    .paletteTag = PALTAG_SCENE3_SWIPE,\n    .oam = &sOam_Swipe,\n    .anims = sAnims_Swipe,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_GengarSwipe\n};\n\nstatic const struct OamData sOam_RecoilDust = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_RecoilDust[] = {\n\tANIMCMD_FRAME(0, 10),\n\tANIMCMD_FRAME(4, 10),\n\tANIMCMD_FRAME(8, 10),\n\tANIMCMD_FRAME(12, 8),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_RecoilDust[] = {\n\tsAnim_RecoilDust\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_NidorinoRecoilDust = {\n    .tileTag = GFXTAG_SCENE3_RECOIL_DUST,\n    .paletteTag = PALTAG_SCENE3_RECOIL_DUST,\n    .oam = &sOam_RecoilDust,\n    .anims = sAnims_RecoilDust,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_RecoilDust\n};\n\nstatic const struct CompressedSpriteSheet sFightSceneSpriteSheets[] = {\n\t{sScene2_Gengar_Gfx,       0x800,  GFXTAG_SCENE2_GENGAR},\n\t{sScene2_Nidorino_Gfx,     0x800,  GFXTAG_SCENE2_NIDORINO},\n\t{sScene3_Nidorino_Gfx,     0x2800, GFXTAG_SCENE3_NIDORINO},\n\t{sScene3_Grass_Gfx,        0x800,  GFXTAG_SCENE3_GRASS},\n\t{sScene3_GengarStatic_Gfx, 0x1800, GFXTAG_SCENE3_GENGAR},\n\t{sScene3_Swipe_Gfx,        0xA00,  GFXTAG_SCENE3_SWIPE},\n\t{sScene3_RecoilDust_Gfx,   0x200,  GFXTAG_SCENE3_RECOIL_DUST}\n};\n\n// POTENTIAL UB\n// This array is passed to LoadSpritePalettes in LoadFightSceneSpriteGraphics.\n// LoadSpritePalettes uses a {0} entry to signal end of array.\n// Because such an entry is absent in this case, the function\n// continues reading into the next .rodata section.\nstatic const struct SpritePalette sFightSceneSpritePalettes[] = {\n\t{sGengar_Pal,            PALTAG_GENGAR},\n\t{sNidorino_Pal,          PALTAG_NIDORINO},\n\t{sScene3_Grass_Pal,      PALTAG_SCENE3_GRASS},\n\t{sScene3_Swipe_Pal,      PALTAG_SCENE3_SWIPE},\n\t{sScene3_RecoilDust_Pal, PALTAG_SCENE3_RECOIL_DUST},\n    {0}\n};\n\nstatic void VBlankCB_Copyright(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void CB2_WaitFadeBeforeSetUpIntro(void)\n{\n    if (!UpdatePaletteFade())\n        SetMainCallback2(CB2_SetUpIntro);\n}\n\nstatic void LoadCopyrightGraphics(u16 charBase, u16 screenBase, u16 palOffset)\n{\n    LZ77UnCompVram(sCopyright_Gfx, (void *)BG_VRAM + charBase);\n    LZ77UnCompVram(sCopyright_Map, (void *)BG_VRAM + screenBase);\n    LoadPalette(sCopyright_Pal, palOffset, sizeof(sCopyright_Pal));\n}\n\nstatic void SerialCB_CopyrightScreen(void)\n{\n    GameCubeMultiBoot_HandleSerialInterrupt(&sGcmb);\n}\n\nstatic bool8 SetUpCopyrightScreen(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        ((vu16*)PLTT)[0] = RGB_WHITE;\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n        DmaFill16(3, 0, VRAM, VRAM_SIZE);\n        DmaFill32(3, 0, OAM, OAM_SIZE);\n        DmaFill16(3, 0, PLTT + sizeof(vu16), PLTT_SIZE - sizeof(vu16));\n        ResetPaletteFade();\n        LoadCopyrightGraphics(0 * BG_CHAR_SIZE, 7 * BG_SCREEN_SIZE, BG_PLTT_ID(0));\n        ScanlineEffect_Stop();\n        ResetTasks();\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_WHITEALPHA);\n        SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(7));\n        EnableInterrupts(INTR_FLAG_VBLANK);\n        SetVBlankCallback(VBlankCB_Copyright);\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON);\n        SetSerialCallback(SerialCB_CopyrightScreen);\n        GameCubeMultiBoot_Init(&sGcmb);\n        // fallthrough\n    default:\n        UpdatePaletteFade();\n        gMain.state++;\n        GameCubeMultiBoot_Main(&sGcmb);\n        break;\n    case 140:\n        GameCubeMultiBoot_Main(&sGcmb);\n        if (sGcmb.gcmb_field_2 != 1)\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            gMain.state++;\n        }\n        break;\n    case 141:\n        if (!UpdatePaletteFade())\n        {\n            gMain.state++;\n            if (sGcmb.gcmb_field_2 != 0)\n            {\n                if (sGcmb.gcmb_field_2 == 2)\n                {\n                    if (*(u32 *)(EWRAM_START + 0xAC) == COLOSSEUM_GAME_CODE)\n                    {\n                        CpuCopy16(gMultiBootProgram_PokemonColosseum_Start, (void *)EWRAM_START, 0x28000);\n                        *(u32 *)(EWRAM_START + 0xAC) = COLOSSEUM_GAME_CODE;\n                    }\n                    GameCubeMultiBoot_ExecuteProgram(&sGcmb);\n                }\n            }\n            else\n            {\n                GameCubeMultiBoot_Quit();\n                SetSerialCallback(SerialCB);\n            }\n            return FALSE;\n        }\n        break;\n    case 142:\n        ResetSerial();\n        SetMainCallback2(CB2_WaitFadeBeforeSetUpIntro);\n        break;\n    }\n    return TRUE;\n}\n\nvoid CB2_InitCopyrightScreenAfterBootup(void)\n{\n    if (!SetUpCopyrightScreen())\n    {\n        ResetMenuAndMonGlobals();\n        Save_ResetSaveCounters();\n        LoadGameSave(SAVE_NORMAL);\n        if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_INVALID)\n            Sav2_ClearSetDefault();\n        SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);\n    }\n}\n\nvoid CB2_InitCopyrightScreenAfterTitleScreen(void)\n{\n    SetUpCopyrightScreen();\n}\n\nstatic void CB2_SetUpIntro(void)\n{\n    switch (gMain.state)\n    {\n    default:\n        gMain.state = 0;\n        // fallthrough\n    case 0:\n        SetVBlankCallback(NULL);\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        InitHeap(gHeap, HEAP_SIZE);\n        ResetTasks();\n        ResetSpriteData();\n        ResetPaletteFade();\n        ResetTempTileDataBuffers();\n        Intro_ResetGpuRegs();\n        DmaFill16(3, 0, VRAM, VRAM_SIZE);\n        DmaFill32(3, 0, OAM, OAM_SIZE);\n        DmaFill16(3, 0, PLTT, PLTT_SIZE);\n        FillPalette(RGB_BLACK, 0, PLTT_SIZE);\n        ResetBgsAndClearDma3BusyFlags(FALSE);\n        InitBgsFromTemplates(0, sBgTemplates_GameFreakScene, ARRAY_COUNT(sBgTemplates_GameFreakScene));\n        break;\n    case 1:\n        LoadPalette(sGameFreakBg_Pal, BG_PLTT_ID(0), sizeof(sGameFreakBg_Pal));\n        DecompressAndCopyTileDataToVram(BG_GF_BACKGROUND, sGameFreakBg_Gfx, 0, 0, 0);\n        DecompressAndCopyTileDataToVram(BG_GF_BACKGROUND, sGameFreakBg_Map, 0, 0, 1);\n        LoadPalette(sGameFreakLogo_Pal, BG_PLTT_ID(13), sizeof(sGameFreakLogo_Pal));\n        break;\n    case 2:\n        if (!FreeTempTileDataBuffersIfPossible())\n        {\n            StartIntroSequence();\n            BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n            SetMainCallback2(CB2_Intro);\n            SetVBlankCallback(VBlankCB_Intro);\n        }\n        return;\n    }\n    gMain.state++;\n}\n\nstatic void CB2_Intro(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB_Intro(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void Intro_ResetGpuRegs(void)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG2HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG3HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG3VOFS, 0);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n}\n\nstatic void StartIntroSequence(void)\n{\n    struct IntroSequenceData * ptr = Alloc(sizeof(*ptr));\n    SetIntroCB(ptr, IntroCB_Init);\n    ptr->taskId = CreateTask(Task_CallIntroCallback, 3);\n    SetWordTaskArg(ptr->taskId, 0, (uintptr_t)ptr);\n}\n\nstatic void SetIntroCB(struct IntroSequenceData * ptr, IntroCallback cb)\n{\n    ptr->callback = cb;\n    ptr->state = 0;\n}\n\nstatic void Task_CallIntroCallback(u8 taskId)\n{\n    struct IntroSequenceData * ptr = (void *)GetWordTaskArg(taskId, 0);\n    \n    // End intro early if player presses A/Start/Select\n    if (JOY_NEW(A_BUTTON | START_BUTTON | SELECT_BUTTON) && ptr->callback != IntroCB_ExitToTitleScreen)\n        SetIntroCB(ptr, IntroCB_ExitToTitleScreen);\n\n    ptr->callback(ptr);\n}\n\nstatic void IntroCB_Init(struct IntroSequenceData * this)\n{\n    switch (this->state)\n    {\n    case 0:\n        InitWindows(sWindowTemplates);\n        LZ77UnCompWram(sGameFreakText_Gfx, this->gameFreakTextGfx);\n        LZ77UnCompWram(sGameFreakLogo_Gfx, this->gameFreakLogoGfx);\n        FillBgTilemapBufferRect(BG_GF_TEXT_LOGO, 0x000, 0, 0, 32, 32, 17);\n        FillWindowPixelBuffer(WIN_GF_TEXT_LOGO, PIXEL_FILL(0));\n        BlitBitmapToWindow(WIN_GF_TEXT_LOGO, this->gameFreakTextGfx, 0, 40, 144, 16);\n        PutWindowTilemap(WIN_GF_TEXT_LOGO);\n        CopyWindowToVram(WIN_GF_TEXT_LOGO, COPYWIN_FULL);\n        this->state++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            SetIntroCB(this, IntroCB_GF_OpenWindow);\n        break;\n    }\n}\n\nstatic void IntroCB_GF_OpenWindow(struct IntroSequenceData * this)\n{\n    switch (this->state)\n    {\n    case 0:\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_ALL);\n        SetGpuReg(REG_OFFSET_WINOUT, 0);\n        SetGpuReg(REG_OFFSET_WIN1H, DISPLAY_WIDTH);\n        SetGpuReg(REG_OFFSET_WIN1V, 0);\n        this->timer = 0;\n        this->state++;\n        break;\n    case 1:\n        ShowBg(BG_GF_BACKGROUND);\n        BlendPalettes(PALETTES_ALL, 0, RGB_BLACK);\n        this->state++;\n        break;\n    case 2:\n        // Extend window height in both directions from midpoint until it reaches a narrow \"theatric\" view\n        this->timer += 8;\n        if (this->timer >= 48)\n            this->timer = 48;\n        SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(DISPLAY_HEIGHT / 2 - this->timer, DISPLAY_HEIGHT / 2 + this->timer));\n        if (this->timer == 48)\n            SetIntroCB(this, IntroCB_GF_Star);\n        break;\n    }\n}\n\nstatic void IntroCB_GF_Star(struct IntroSequenceData * this)\n{\n    switch (this->state)\n    {\n    case 0:\n        PlaySE(MUS_GAME_FREAK);\n        GFScene_LoadGfxCreateStar();\n        this->timer = 0;\n        this->state++;\n        break;\n    case 1:\n        if (++this->timer == 30)\n        {\n            GFScene_StartNameSparklesSmall();\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 2:\n        this->timer++;\n        if (this->timer == 90)\n            SetIntroCB(this, IntroCB_GF_RevealName);\n        break;\n    }\n}\n\nstatic void IntroCB_GF_RevealName(struct IntroSequenceData * this)\n{\n    switch (this->state)\n    {\n    case 0:\n        GFScene_StartNameSparklesBig();\n        this->timer = 0;\n        this->state++;\n        break;\n    case 1:\n        if (++this->timer >= 40)\n            this->state++;\n        break;\n    case 2:\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n        StartBlendTask(0, 16, 16, 0, 48, 0);\n        this->state++;\n        break;\n    case 3:\n        ShowBg(BG_GF_TEXT_LOGO);\n        this->state++;\n        break;\n    case 4:\n        if (!IsBlendTaskActive())\n        {\n            SetGpuReg(REG_OFFSET_BLDCNT, 0);\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 5:\n        if (++this->timer > 50)\n            SetIntroCB(this, IntroCB_GF_RevealLogo);\n        break;\n    }\n}\n\nstatic void IntroCB_GF_RevealLogo(struct IntroSequenceData * this)\n{\n    switch (this->state)\n    {\n    case 0:\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);\n        StartBlendTask(0, 16, 16, 0, 16, 0);\n        this->data[0] = 0; // Never read\n        this->data[1] = 16; // Never read\n        this->timer = 0;\n        this->state++;\n        break;\n    case 1:\n        this->gameFreakLogoArtSprite = GFScene_CreateLogoSprite();\n        this->state++;\n        break;\n    case 2:\n        if (!IsBlendTaskActive())\n        {\n            BlitBitmapToWindow(WIN_GF_TEXT_LOGO, this->gameFreakLogoGfx, 0x38, 0x06, 0x20, 0x40);\n            BlitBitmapToWindow(WIN_GF_TEXT_LOGO, this->gameFreakTextGfx, 0x00, 0x28, 0x90, 0x10);\n            CopyWindowToVram(WIN_GF_TEXT_LOGO, COPYWIN_GFX);\n            this->state++;\n        }\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            DestroySprite(this->gameFreakLogoArtSprite);\n            GFScene_CreatePresentsSprite();\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 4:\n        if (++this->timer > 90)\n        {\n            SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2);\n            StartBlendTask(16, 0, 0, 16, 20, 0);\n            this->state++;\n        }\n        break;\n    case 5:\n        if (!IsBlendTaskActive())\n        {\n            HideBg(BG_GF_TEXT_LOGO);\n            this->state++;\n        }\n        break;\n    case 6:\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        this->timer = 0;\n        this->state++;\n        break;\n    case 7:\n        if (++this->timer > 20)\n        {\n            SetGpuReg(REG_OFFSET_BLDCNT, 0);\n            SetIntroCB(this, IntroCB_Scene1);\n        }\n        break;\n    }\n}\n\nstatic void IntroCB_Scene1(struct IntroSequenceData * this)\n{\n    switch (this->state)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        LoadPalette(sScene1_Grass_Pal, BG_PLTT_ID(PALSLOT_SCENE1_GRASS), sizeof(sScene1_Grass_Pal));\n        LoadPalette(sScene1_Bg_Pal, BG_PLTT_ID(PALSLOT_SCENE1_BG), sizeof(sScene1_Bg_Pal));\n        BlendPalettes((1 << PALSLOT_SCENE1_GRASS) | (1 << PALSLOT_SCENE1_BG), 16, RGB_WHITE);\n        InitBgsFromTemplates(0, sBgTemplates_Scene1, ARRAY_COUNT(sBgTemplates_Scene1));\n        DecompressAndCopyTileDataToVram(BG_SCENE1_BACKGROUND, sScene1_Bg_Gfx, 0, 0, 0);\n        DecompressAndCopyTileDataToVram(BG_SCENE1_BACKGROUND, sScene1_Bg_Map, 0, 0, 1);\n        ShowBg(BG_SCENE1_BACKGROUND);\n        HideBg(BG_SCENE1_GRASS);\n        HideBg(BG_SCENE1_UNUSED1);\n        HideBg(BG_SCENE1_UNUSED2);\n        LoadFightSceneSpriteGraphics();\n        SetVBlankCallback(VBlankCB_Intro);\n        this->state++;\n        break;\n    case 1:\n        if (!FreeTempTileDataBuffersIfPossible())\n        {\n            DecompressAndCopyTileDataToVram(BG_SCENE1_GRASS, sScene1_Grass_Gfx, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(BG_SCENE1_GRASS, sScene1_Grass_Map, 0, 0, 1);\n            ResetBgPositions();\n            ShowBg(BG_SCENE1_BACKGROUND);\n            this->state++;\n        }\n        break;\n    case 2:\n        if (!FreeTempTileDataBuffersIfPossible())\n        {\n            ShowBg(BG_SCENE1_GRASS);\n            CreateTask(Scene1_Task_AnimateGrass, 0);\n            BeginNormalPaletteFade((1 << PALSLOT_SCENE1_GRASS) | (1 << PALSLOT_SCENE1_BG), -2, 16, 0, RGB_WHITE);\n            this->state++;\n        }\n        break;\n    case 3:\n        if (!gPaletteFade.active)\n        {\n            m4aSongNumStart(MUS_INTRO_FIGHT);\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 4:\n        if (++this->timer == 20)\n        {\n            // Start animation for transitioning to the next scene\n            CreateTask(Scene1_Task_BgZoom, 0);\n            Scene1_StartGrassScrolling();\n        }\n        if (this->timer >= 30)\n        {\n            // End scene\n            BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE);\n            DestroyTask(FindTaskIdByFunc(Scene1_Task_AnimateGrass));\n            DestroyTask(FindTaskIdByFunc(Scene1_Task_BgZoom));\n            SetIntroCB(this, IntroCB_Scene2);\n        }\n        break;\n    case 5:\n        // Never reached\n        if (!gPaletteFade.active)\n        {\n            DestroyTask(FindTaskIdByFunc(Scene1_Task_AnimateGrass));\n            DestroyTask(FindTaskIdByFunc(Scene1_Task_BgZoom));\n            SetIntroCB(this, IntroCB_Scene2);\n        }\n        break;\n    }\n}\n\n#define tTimer   data[0]\n#define tFrame   data[1]\n#define tExiting data[2]\n#define tScroll  data[3]\n\nstatic void Scene1_Task_AnimateGrass(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    // Each of the 3 frames of the bg grass animation is separated vertically on the tilemap.\n    // The conditional below changes the frame by setting the y coordinate of the bg.\n    if (++tTimer > 5)\n    {\n        tTimer = 0;\n        if (++tFrame >= 3)\n            tFrame = 0;\n        ChangeBgY(BG_SCENE1_GRASS, tFrame << 15, BG_COORD_SET);\n    }\n\n    // When it's time to progress to the next scene, the grass is meant to scroll downward offscreen.\n    // This scrolling is overwritten by the coord change above, and so the grass \"stutters\" back upward.\n    // They don't mask the bg, so if it were to continue scrolling offscreen it would reveal the frame above on the tilemap.\n    if (tExiting)\n    {\n        tScroll += 0x120;\n        ChangeBgY(BG_SCENE1_GRASS, tScroll, BG_COORD_SUB);\n    }\n}\n\nstatic void Scene1_StartGrassScrolling(void)\n{\n    u8 taskId = FindTaskIdByFunc(Scene1_Task_AnimateGrass);\n    gTasks[taskId].tExiting = TRUE;\n}\n\n#undef tTimer\n#undef tFrame\n#undef tExiting\n#undef tScroll\n\n#define tTimer data[0]\n#define tFrame data[1]\n\n// Have the silhouetted forest background \"zoom in\" during the transition to the next scene.\n// Same as the grass animation above, this achieved by separating frames vertically on the bg tilemap.\nstatic void Scene1_Task_BgZoom(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (++tTimer > 3)\n    {\n        tTimer = 0;\n        if (tFrame < 2)\n            tFrame++;\n        ChangeBgY(BG_SCENE1_BACKGROUND, tFrame << 15, BG_COORD_SET);\n    }\n}\n\n#undef tTimer\n#undef tFrame\n\nstatic void IntroCB_Scene2(struct IntroSequenceData * this)\n{\n    switch (this->state)\n    {\n    case 0:\n        BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE);\n        InitBgsFromTemplates(0, sBgTemplates_Scene2, ARRAY_COUNT(sBgTemplates_Scene2));\n        DecompressAndCopyTileDataToVram(BG_SCENE2_BACKGROUND, sScene2_Bg_Gfx, 0, 0, 0);\n        DecompressAndCopyTileDataToVram(BG_SCENE2_BACKGROUND, sScene2_Bg_Map, 0, 0, 1);\n        ShowBg(BG_SCENE2_BACKGROUND);\n        this->state++;\n        break;\n    case 1:\n        if (!FreeTempTileDataBuffersIfPossible())\n        {\n            SetVBlankCallback(NULL);\n            LoadPalette(sScene2_Bg_Pal, BG_PLTT_ID(1), sizeof(sScene2_Bg_Pal));\n            LoadPalette(sGengar_Pal, BG_PLTT_ID(5), sizeof(sGengar_Pal));\n            LoadPalette(sScene2_NidorinoClose_Pal, BG_PLTT_ID(6), sizeof(sScene2_NidorinoClose_Pal));\n            BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE);\n            DecompressAndCopyTileDataToVram(BG_SCENE2_PLANTS, sScene2_Plants_Gfx, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(BG_SCENE2_PLANTS, sScene2_Plants_Map, 0, 0, 1);\n            DecompressAndCopyTileDataToVram(BG_SCENE2_NIDORINO, sScene2_NidorinoClose_Gfx, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(BG_SCENE2_NIDORINO, sScene2_NidorinoClose_Map, 0, 0, 1);\n            DecompressAndCopyTileDataToVram(BG_SCENE2_GENGAR, sScene2_GengarClose_Gfx, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(BG_SCENE2_GENGAR, sScene2_GengarClose_Map, 0, 0, 1);\n            ResetBgPositions();\n            ShowBg(BG_SCENE2_PLANTS);\n            HideBg(BG_SCENE2_NIDORINO); // Hide bgs for the close up shot\n            HideBg(BG_SCENE2_GENGAR);\n            ChangeBgY(BG_SCENE2_GENGAR, 0x0001CE00, BG_COORD_SET);\n            ChangeBgY(BG_SCENE2_NIDORINO, 0x00002800, BG_COORD_SET);\n            CreateTask(Scene2_Task_PanForest, 0);\n            Scene2_CreateMonSprites(this);\n            BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE);\n            SetVBlankCallback(VBlankCB_Intro);\n            this->state++;\n        }\n        break;\n    case 2:\n        if (!FreeTempTileDataBuffersIfPossible())\n        {\n            BeginNormalPaletteFade(PALETTES_ALL & ~1, -2, 16, 0, RGB_WHITE);\n            this->state++;\n        }\n        break;\n    case 3:\n        if (!gPaletteFade.active)\n        {\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 4:\n        if (++this->timer >= 60)\n        {\n            this->timer = 0;\n            DestroyTask(FindTaskIdByFunc(Scene2_Task_PanForest));\n            Scene2_DestroyMonSprites(this);\n            CreateTask(Scene2_Task_PanMons, 0);\n            ChangeBgY(BG_SCENE2_BACKGROUND, 0x00010000, BG_COORD_SET); // Move background from upper half (wide shot) to lower half (close up)\n            HideBg(BG_SCENE2_PLANTS);\n            ShowBg(BG_SCENE2_BACKGROUND);\n            ShowBg(BG_SCENE2_NIDORINO);\n            ShowBg(BG_SCENE2_GENGAR);\n            this->state++;\n        }\n        break;\n    case 5:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 6:\n        if (++this->timer >= 60)\n        {\n            DestroyTask(FindTaskIdByFunc(Scene2_Task_PanMons));\n            SetIntroCB(this, IntroCB_Scene3_Entrance);\n        }\n        break;\n    }\n}\n\n// Pan the background trees right and the foreground plants left in the wide shot\nstatic void Scene2_Task_PanForest(u8 taskId)\n{\n    ChangeBgX(BG_SCENE2_BACKGROUND, 0x0E0, BG_COORD_SUB);\n    ChangeBgX(BG_SCENE2_PLANTS, 0x110, BG_COORD_ADD);\n}\n\n// Pan Gengar up and Nidorino down in the close up shot\nstatic void Scene2_Task_PanMons(u8 taskId)\n{\n    ChangeBgY(BG_SCENE2_GENGAR, 0x020, BG_COORD_ADD);\n    ChangeBgY(BG_SCENE2_NIDORINO, 0x024, BG_COORD_SUB);\n}\n\n// Create the Gengar/Nidorino sprites for the wide shot in scene 2\nstatic void Scene2_CreateMonSprites(struct IntroSequenceData * this)\n{\n    u8 spriteId;\n\n    this->scene2GengarSprite = NULL;\n    this->scene2NidorinoSprite = NULL;\n\n    spriteId = CreateSprite(&sSpriteTemplate_Scene2_Nidorino, 168, 80, 11);\n    if (spriteId != MAX_SPRITES)\n        this->scene2NidorinoSprite = &gSprites[spriteId];\n\n    spriteId = CreateSprite(&sSpriteTemplate_Scene2_Gengar, 72, 80, 12);\n    if (spriteId != MAX_SPRITES)\n        this->scene2GengarSprite = &gSprites[spriteId];\n}\n\nstatic void Scene2_DestroyMonSprites(struct IntroSequenceData * this)\n{\n    if (this->scene2GengarSprite != NULL)\n        DestroySprite(this->scene2GengarSprite);\n    if (this->scene2NidorinoSprite != NULL)\n        DestroySprite(this->scene2NidorinoSprite);\n}\n\n// Set up the scene 3 graphics, then start the scrolling to get Gengar and Nidorino in their fight positions\nstatic void IntroCB_Scene3_Entrance(struct IntroSequenceData * this)\n{\n    switch (this->state)\n    {\n    case 0:\n        LoadPalette(sScene3_Bg_Pal, BG_PLTT_ID(1), sizeof(sScene3_Bg_Pal));\n        LoadPalette(sGengar_Pal, BG_PLTT_ID(5), sizeof(sGengar_Pal));\n        BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE);\n        InitBgsFromTemplates(0, sBgTemplates_Scene3, ARRAY_COUNT(sBgTemplates_Scene3));\n        DecompressAndCopyTileDataToVram(BG_SCENE3_BACKGROUND, sScene3_Bg_Gfx, 0, 0, 0);\n        DecompressAndCopyTileDataToVram(BG_SCENE3_BACKGROUND, sScene3_Bg_Map, 0, 0, 1);\n        ShowBg(BG_SCENE3_BACKGROUND);\n        HideBg(BG_SCENE3_GENGAR);\n        HideBg(BG_SCENE3_UNUSED1);\n        HideBg(BG_SCENE3_UNUSED2);\n        ResetBgPositions();\n        this->state++;\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_BG1 | WININ_WIN0_OBJ);\n        ClearGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_BG0);\n        SetGpuRegBits(REG_OFFSET_WINOUT, 0);\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(32, DISPLAY_HEIGHT - 32));\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH / 2));\n        break;\n    case 1:\n        if (!FreeTempTileDataBuffersIfPossible())\n        {\n            DecompressAndCopyTileDataToVram(BG_SCENE3_GENGAR, sScene3_GengarAnim_Gfx, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(BG_SCENE3_GENGAR, sScene3_GengarAnim_Map, 0, 0, 1);\n            sUnusedScene3Var0 = 4;\n            sUnusedScene3Var1 = 52;\n            ChangeBgX(BG_SCENE3_GENGAR, 0x00001800, BG_COORD_SET);\n            ChangeBgY(BG_SCENE3_GENGAR, 0x0001F000, BG_COORD_SET);\n            this->state++;\n        }\n        break;\n    case 2:\n        if (!FreeTempTileDataBuffersIfPossible())\n        {\n            BlendPalettes(PALETTES_ALL & ~1, 0, RGB_WHITE);\n            ShowBg(BG_SCENE3_GENGAR);\n            CreateTask(Scene3_Task_GengarBounce, 0);\n            Scene3_CreateNidorinoSprite(this);\n            Scene3_StartNidorinoEntrance(this->scene3NidorinoSprite, 0, 180, 52);\n            CreateTask(Scene3_Task_GengarEnter, 0);\n            Scene3_StartBgScroll();\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 3:\n        if (++this->timer == 16)\n            Scene3_CreateGrassSprite(this);\n        if (!Scene3_IsNidorinoEntering(this) && !FuncIsActiveTask(Scene3_Task_GengarEnter))\n            SetIntroCB(this, IntroCB_Scene3_Fight);\n        break;\n    }\n}\n\n#define tSlow data[0]\n\n// Pan the background trees right during the fight scene.\n// It pans quickly while Gengar/Nidorino are sliding onscreen, and it pans slowly thereafter.\nstatic void Scene3_Task_BgScroll(u8 taskId)\n{\n    if (!gTasks[taskId].tSlow)\n        ChangeBgX(BG_SCENE3_BACKGROUND, 0x400, BG_COORD_SUB);\n    else\n        ChangeBgX(BG_SCENE3_BACKGROUND, 0x020, BG_COORD_SUB);\n}\n\nstatic void Scene3_StartBgScroll(void)\n{\n    CreateTask(Scene3_Task_BgScroll, 0);\n}\n\nstatic void Scene3_SlowBgScroll(void)\n{\n    u8 taskId = FindTaskIdByFunc(Scene3_Task_BgScroll);\n    gTasks[taskId].tSlow = TRUE;\n}\n\n#undef tSlow\n\n#define tPaused data[0]\n#define tTimer  data[1]\n#define tState  data[2]\n\n// Gengar has an \"idle\" animation where it bounces a little\nstatic void Scene3_Task_GengarBounce(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    if (!tPaused)\n    {\n        if (++tTimer >= 30)\n        {\n            tTimer = 0;\n            tState ^= 1; // Alternate between the 0th (normal) and 1st (slightly crouched) bg frames\n            ChangeBgY(BG_SCENE3_GENGAR, (tState << 15) + 0x1F000, BG_COORD_SET);\n        }\n    }\n}\n\nstatic void Scene3_PauseGengarBounce(void)\n{\n    u8 taskId = FindTaskIdByFunc(Scene3_Task_GengarBounce);\n    gTasks[taskId].tPaused = TRUE;\n}\n\nstatic void Scene3_ResumeGengarBounce(void)\n{\n    u8 taskId = FindTaskIdByFunc(Scene3_Task_GengarBounce);\n    gTasks[taskId].tPaused = FALSE;\n}\n\nstatic bool8 Scene3_IsGengarMidBounce(void)\n{\n    u8 taskId = FindTaskIdByFunc(Scene3_Task_GengarBounce);\n    return gTasks[taskId].tState;\n}\n\n#undef tPaused\n#undef tTimer\n#undef tState\n\n// The small clump of grass that passes by in the foreground during the fight\nstatic void Scene3_CreateGrassSprite(struct IntroSequenceData * this)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_Grass, 296, 112, 7);\n    if (spriteId != MAX_SPRITES)\n    {\n        this->scene3GrassSprite = &gSprites[spriteId];\n        this->scene3GrassSprite->callback = SpriteCB_Grass;\n    }\n    else\n        this->scene3GrassSprite = NULL;\n}\n\n#define sState data[0]\n#define sBaseX data[1]\n#define sVeloc data[2]\n\nstatic void SpriteCB_Grass(struct Sprite *sprite)\n{\n    s16 * data = sprite->data;\n\n    switch (sState)\n    {\n    case 0:\n        sBaseX = sprite->x << 5;\n        sVeloc = 160;\n        sState++;\n        // fallthrough\n    case 1:\n        sBaseX -= sVeloc;\n        sprite->x = sBaseX >> 5;\n        if (sprite->x <= 52)\n        {\n            Scene3_SlowBgScroll();\n            sState++;\n        }\n        break;\n    case 2:\n        sBaseX -= 32;\n        sprite->x = sBaseX >> 5;\n        if (sprite->x <= -32)\n        {\n            sprite->invisible = TRUE;\n            sprite->sState++;\n            DestroySprite(sprite);\n        }\n        break;\n    }\n}\n\n#undef sState\n#undef sBaseX\n#undef sVeloc\n\nstatic void IntroCB_Scene3_Fight(struct IntroSequenceData * this)\n{\n    switch (this->state)\n    {\n    case 0:\n        this->timer = 0;\n        this->state++;\n        break;\n    case 1:\n        if (++this->timer > 30)\n        {\n            Scene3_StartNidorinoCry(this);\n            this->state++;\n        }\n        break;\n    case 2:\n        if (!Scene3_NidorinoAnimIsRunning(this))\n        {\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 3:\n        if (++this->timer > 30)\n        {\n            Scene3_PauseGengarBounce();\n            Scene3_StartGengarAttack(this);\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 4:\n        if (this->gengarAttackLanded)\n        {\n            Scene3_StartNidorinoRecoil(this);\n            this->state++;\n        }\n        break;\n    case 5:\n        if (!Scene3_NidorinoAnimIsRunning(this))\n        {\n            Scene3_ResumeGengarBounce();\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 6:\n        if (++this->timer > 16)\n        {\n            // Nidorino's 1st hop backwards in preparation to attack\n            Scene3_StartNidorinoHop(this->scene3NidorinoSprite, 8, 12, 5);\n            this->state++;\n        }\n        break;\n    case 7:\n        if (!Scene3_NidorinoAnimIsRunning(this))\n        {\n            // Nidorino's 2nd hop backwards in preparation to attack\n            Scene3_StartNidorinoHop(this->scene3NidorinoSprite, 8, 12, 5);\n            this->state++;\n        }\n        break;\n    case 8:\n        if (!Scene3_NidorinoAnimIsRunning(this))\n        {\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 9:\n        if (++this->timer > 20)\n        {\n            Scene3_StartNidorinoAttack(this);\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 10:\n        if (!Scene3_IsGengarMidBounce())\n        {\n            Scene3_PauseGengarBounce();\n            Scene3_CreateGengarSprite(this);\n            this->state++;\n        }\n        break;\n    case 11:\n        HideBg(BG_SCENE3_GENGAR);\n        this->timer = 0;\n        this->state++;\n        break;\n    case 12:\n        if (++this->timer == 48)\n            BeginNormalPaletteFade((1 << 1) | (1 << 2), 2, 0, 16, RGB_WHITE);\n        if (this->timer > 120)\n        {\n            Scene3_NidorinoZoom(this);\n            Scene3_GengarZoom(this);\n            this->state++;\n            this->timer = 0;\n        }\n        break;\n    case 13:\n        if (++this->timer > 8)\n        {\n            CpuFill16(RGB_WHITE, &gPlttBufferUnfaded[BG_PLTT_ID(1)], 2 * PLTT_SIZE_4BPP);\n            BeginNormalPaletteFade(PALETTES_ALL & ~1, -2, 0, 16, RGB_BLACK);\n            this->state++;\n        }\n        break;\n    case 14:\n        if (!gPaletteFade.active)\n        {\n            this->timer = 0;\n            this->state++;\n        }\n        break;\n    case 15:\n        if (++this->timer > 60)\n            SetIntroCB(this, IntroCB_ExitToTitleScreen);\n        break;\n    default:\n        if (JOY_NEW(R_BUTTON))\n        {\n            BlendPalettes(PALETTES_OBJECTS | (1 << 2) | (1 << 5) | (1 << 6), 0, RGB_WHITE);\n            this->scene3NidorinoSprite->x2 = 0;\n            this->scene3NidorinoSprite->x = 180;\n            this->state = 1;\n            this->timer = 30;\n        }\n        break;\n    }\n}\n\nstatic void Scene3_CalcCenterToCornerVec(struct Sprite *sprite)\n{\n    CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);\n}\n\nstatic void Scene3_CreateGengarSprite(struct IntroSequenceData * this)\n{\n    int i;\n\n    // Not using a subsprite table for this\n    for (i = 0; i < NUM_GENGAR_BACK_SPRITES; i++)\n    {\n        int x = (i & 1) * 48 + 49;\n        int y = (i / 2) * 64 + 72;\n        u8 spriteId = CreateSprite(&sSpriteTemplate_Scene3_Gengar, x, y, 8);\n        if (spriteId != MAX_SPRITES)\n        {\n            StartSpriteAnim(&gSprites[spriteId], i);\n            this->scene3GengarSprites[i] = &gSprites[spriteId];\n            if (i & 1)\n                this->scene3GengarSprites[i]->oam.shape = ST_OAM_V_RECTANGLE;\n            Scene3_CalcCenterToCornerVec(this->scene3GengarSprites[i]);\n        }\n    }\n}\n\nstatic void Scene3_NidorinoZoom(struct IntroSequenceData * this)\n{\n    this->scene3NidorinoSprite->x += this->scene3NidorinoSprite->x2;\n    this->scene3NidorinoSprite->y += this->scene3NidorinoSprite->y2;\n    SetSpriteMatrixAnchor(this->scene3NidorinoSprite, 0, 42);\n    this->scene3NidorinoSprite->callback = SpriteCallbackDummy;\n    StartSpriteAffineAnim(this->scene3NidorinoSprite, AFFINEANIM_ZOOM);\n}\n\nstatic void SpriteCB_Idle(struct Sprite *sprite)\n{\n}\n\nstatic void Scene3_GengarZoom(struct IntroSequenceData * this)\n{\n    int i;\n\n    for (i = 0; i < NUM_GENGAR_BACK_SPRITES; i++)\n    {\n        StartSpriteAffineAnim(this->scene3GengarSprites[i], AFFINEANIM_ZOOM);\n        this->scene3GengarSprites[i]->callback = SpriteCB_Idle;\n        SetSpriteMatrixAnchor(this->scene3GengarSprites[i], sGengarZoomMatrixAnchors[i][0], sGengarZoomMatrixAnchors[i][1]);\n    }\n}\n\nstatic void IntroCB_ExitToTitleScreen(struct IntroSequenceData * this)\n{\n    switch (this->state)\n    {\n    case 0:\n        FillPalette(RGB_BLACK, 0, PLTT_SIZE);\n        this->state++;\n        break;\n    case 1:\n        if (!FreeTempTileDataBuffersIfPossible())\n        {\n            DestroyTask(this->taskId);\n            Free(this);\n            DisableInterrupts(INTR_FLAG_HBLANK);\n            SetHBlankCallback(NULL);\n            if(gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_NO_FLASH || gSaveFileStatus == SAVE_STATUS_INVALID)\n            {\n                u16 rand = Random();\n                if(rand % 2 == 0)\n                    gSaveBlock1Ptr->keyFlags.version = 0;\n                else\n                    gSaveBlock1Ptr->keyFlags.version = 1;\n            }\n            SetMainCallback2(CB2_InitTitleScreen);\n        }\n        break;\n    }\n}\n\n// Sprite data for SpriteCB_Star\n#define sStar_BaseX          data[0]\n#define sStar_BaseY          data[1]\n#define sStar_SpeedX         data[2]\n#define sStar_SpeedY         data[3]\n#define sStar_SinIdx         data[4]\n#define sStar_SparkleTimer   data[5]\n#define sStar_SparkleRngSeed data[6]\n\nstatic void GFScene_LoadGfxCreateStar(void)\n{\n    int i;\n    u8 spriteId;\n    static EWRAM_DATA u32 sStarSparklesRngSeed = 0;\n\n    for (i = 0; i < ARRAY_COUNT(sSpriteSheets_GameFreakScene); i++)\n        LoadCompressedSpriteSheet(&sSpriteSheets_GameFreakScene[i]);\n    LoadSpritePalettes(sSpritePalettes_GameFreakScene);\n    sStarSpeedX = 96;\n    sStarSpeedY = 16;\n    sStarSparklesXmodMask = 0x07;\n    sStarSparklesUnusedVar = 5;\n    sStarSparklesSpawnRate = 8;\n    sStarSparklesFlickerStartTime = 90;\n    sStarSparklesDestroySpriteTime = 120;\n    sStarSparklesXspeed = 1;\n    sStarSparklesYspeed = 1;\n    sStarSparklesXprecision = 5;\n    sStarSparklesYprecision = 5;\n    if (sStarSparklesRngSeed == 0)\n        sStarSparklesRngSeed = 354128453;\n    spriteId = CreateSprite(&sSpriteTemplate_Star, 248, 55, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].sStar_BaseX = 248 << 4;\n        gSprites[spriteId].sStar_BaseY = 55 << 4;\n        gSprites[spriteId].sStar_SpeedX = sStarSpeedX;\n        gSprites[spriteId].sStar_SpeedY = sStarSpeedY;\n        StoreWordInTwoHalfwords((u16 *)&gSprites[spriteId].sStar_SparkleRngSeed, sStarSparklesRngSeed);\n    }\n}\n\n// Sprite data for SpriteCB_SparklesSmall_Star\n#define sSmSparkleStar_BaseX     data[0]\n#define sSmSparkleStar_BaseY     data[1]\n#define sSmSparkleStar_SpeedX    data[2]\n#define sSmSparkleStar_SpeedY    data[3]\n#define sSmSparkleStar_FallSpeed data[4]\n#define sSmSparkleStar_FallDist  data[5]\n#define sSmSparkleStar_Timer     data[7]\n\nstatic void GFScene_CreateStarSparkle(s16 x, s16 y, u16 random)\n{\n    static EWRAM_DATA s16 sYmod = 0;\n\n    u8 spriteId;\n    s16 xMod = (random & sStarSparklesXmodMask) + 2;\n    s16 yMod = sYmod;\n    if (++sYmod > 3)\n        sYmod = -3;\n    x += xMod;\n    y += yMod;\n    if (x > 0 && x < DISPLAY_WIDTH)\n    {\n        spriteId = CreateSprite(&sSpriteTemplate_SparklesSmall, x, y, 1);\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].sSmSparkleStar_BaseX = x << sStarSparklesXprecision;\n            gSprites[spriteId].sSmSparkleStar_BaseY = y << sStarSparklesYprecision;\n            gSprites[spriteId].sSmSparkleStar_SpeedX = sStarSparklesXspeed * xMod;\n            gSprites[spriteId].sSmSparkleStar_SpeedY = sStarSparklesYspeed * yMod;\n        }\n    }\n}\n\n#define tSparkleIdx data[0]\n#define tNumLoops   data[1]\n#define tTimer      data[2]\n\nstatic void GFScene_StartNameSparklesSmall(void)\n{\n    CreateTask(GFScene_Task_NameSparklesSmall, 1);\n}\n\n// Sprite data for SpriteCB_SparklesSmall_Name\n#define sSmSparkleName_State        data[0]\n#define sSmSparkleName_BaseY        data[1]\n#define sSmSparkleName_AnimTimer    data[2]\n#define sSmSparkleName_NumLoops     data[3]\n#define sSmSparkleName_DestroyTimer data[4]\n\nstatic void GFScene_Task_NameSparklesSmall(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    u8 i;\n    u8 spriteId;\n\n    tTimer++;\n    data[3]++; // Unused\n    if (tTimer > 6)\n    {\n        tTimer = 0;\n        i = tSparkleIdx;\n        spriteId = CreateSprite(&sSpriteTemplate_SparklesSmall, sTextSparkleCoords[i].x, sTextSparkleCoords[i].y, 2);\n        StartSpriteAnim(&gSprites[spriteId], ANIM_SPARKLE_ONCE);\n        gSprites[spriteId].callback = SpriteCB_SparklesSmall_Name;\n        gSprites[spriteId].sSmSparkleName_BaseY = sTextSparkleCoords[i].y << 4;\n        gSprites[spriteId].sSmSparkleName_AnimTimer = 120;\n        gSprites[spriteId].sSmSparkleName_NumLoops = tNumLoops;\n        if (gSprites[spriteId].sSmSparkleName_NumLoops < 0)\n            gSprites[spriteId].sSmSparkleName_NumLoops = 1;\n        if (++tSparkleIdx >= ARRAY_COUNT(sTextSparkleCoords))\n        {\n            if (++tNumLoops > 1)\n                DestroyTask(taskId);\n            else\n                tSparkleIdx = 0;\n        }\n    }\n}\n\n#undef tSparkleIdx\n#undef tNumLoops\n#undef tTimer\n\n#define tTimer       data[0]\n#define tSparkleIdx  data[1]\n#define tNumSparkles data[2]\n\nstatic void GFScene_StartNameSparklesBig(void)\n{\n    CreateTask(GFScene_Task_NameSparklesBig, 2);\n}\n\nstatic void GFScene_Task_NameSparklesBig(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    u8 i;\n\n    if (tTimer == 0)\n    {\n        i = tSparkleIdx;\n        tSparkleIdx += 4;\n        if (tSparkleIdx >= ARRAY_COUNT(sTextSparkleCoords))\n            tSparkleIdx -= ARRAY_COUNT(sTextSparkleCoords);\n        CreateSprite(&sSpriteTemplate_SparklesBig, sTextSparkleCoords[i].x, sTextSparkleCoords[i].y, 3);\n        if (++tNumSparkles >= (int)ARRAY_COUNT(sTextSparkleCoords))\n            DestroyTask(taskId);\n    }\n    if (++tTimer > 9)\n        tTimer = 0;\n}\n\n#undef tTimer\n#undef tSparkleIdx\n#undef tNumSparkles\n\nstatic struct Sprite *GFScene_CreateLogoSprite(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_GameFreakLogoArt, 120, 70, 4);\n    return &gSprites[spriteId];\n}\n\nstatic void GFScene_CreatePresentsSprite(void)\n{\n    int i;\n    for (i = 0; i < 2; i++)\n        gSprites[CreateSprite(&sSpriteTemplate_Presents, 104 + 32 * i, 108, 5)].oam.tileNum += i * 4;\n}\n\n#define tState  data[0]\n#define tTimer  data[1]\n#define tSinIdx data[3]\n#define tBaseX  data[4]\n#define IDX_INTRO_DATA 5  // A pointer to the IntroSequenceData will be stored at data[5] and data[6]\n#define tFrame  data[7]\n#define tMultY  data[8]\n#define tMultX  data[9]\n\nstatic void Scene3_StartGengarAttack(struct IntroSequenceData * this)\n{\n    u8 taskId;\n    this->gengarAttackLanded = FALSE;\n    taskId = CreateTask(Scene3_Task_GengarAttack, 4);\n    SetWordTaskArg(taskId, IDX_INTRO_DATA, (uintptr_t)this);\n    gTasks[taskId].tSinIdx = 64;\n    gTasks[taskId].tBaseX = GetBgX(BG_SCENE3_GENGAR);\n}\n\nstatic void Scene3_ApplyGengarAnim(int frame, int xSub, int ySub, int xBase)\n{\n    ChangeBgY(BG_SCENE3_GENGAR, (frame << 15) + 0x1F000, BG_COORD_SET);\n    ChangeBgX(BG_SCENE3_GENGAR, xBase, BG_COORD_SET);\n    ChangeBgX(BG_SCENE3_GENGAR, xSub << 8, BG_COORD_SUB);\n    ChangeBgY(BG_SCENE3_GENGAR, ySub << 8, BG_COORD_SUB);\n}\n\nstatic void Scene3_Task_GengarAttack(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    s32 xSub, ySub;\n    s32 sinIdx;\n    switch (tState)\n    {\n    case 0:\n        tFrame = 2; // Gengar raises arm up\n        tTimer = 0;\n        tMultY = 6;\n        tMultX = 32;\n        tState++;\n        break;\n    case 1:\n        // Gengar moves in a backward arc\n        tSinIdx -= 2;\n        if (++tTimer > 15)\n        {\n            tTimer = 0;\n            tState++;\n        }\n        break;\n    case 2:\n        // Gengar pauses at end of backward arc\n        if (++tTimer == 14)\n            ((struct IntroSequenceData *)GetWordTaskArg(taskId, IDX_INTRO_DATA))->gengarAttackLanded = TRUE;\n        if (tTimer > 15)\n        {\n            tTimer = 0;\n            tState++;\n        }\n        break;\n    case 3:\n        // Gengar moves in a forward arc\n        tSinIdx += 8;\n        if (++tTimer == 4)\n        {\n            Scene3_CreateGengarSwipeSprites();\n            tMultY = 32;\n            tMultX = 48;\n            tFrame = 3; // Gengar swipes arm down\n        }\n        if (tTimer > 7)\n        {\n            tTimer = 0;\n            tState++;\n        }\n        break;\n    case 4:\n        // Gengar moves in a backward arc to its original position\n        tSinIdx -= 8;\n        if (++tTimer > 3)\n        {\n            tFrame = 0; // Gengar returns to normal posture\n            tSinIdx = 64;\n            tTimer = 0;\n            tState++;\n        }\n        break;\n    case 5:\n        DestroyTask(taskId);\n        return;\n    }\n\n    // Animate current movement arc / frame change\n    sinIdx = tSinIdx;\n    xSub = -((gSineTable[sinIdx + 64] * tMultX) >> 8);\n    ySub = tMultY - ((gSineTable[sinIdx] * tMultY) >> 8);\n    Scene3_ApplyGengarAnim(tFrame, xSub, ySub, tBaseX);\n}\n\n#undef tState\n#undef tTimer\n#undef tSinIdx\n#undef tBaseX\n#undef IDX_INTRO_DATA\n#undef tFrame\n#undef tMultY\n#undef tMultX\n\nstatic void Scene3_CreateGengarSwipeSprites(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_GengarSwipe, 132, 78, 6); // Implicitly ANIM_SWIPE_TOP\n    spriteId = CreateSprite(&sSpriteTemplate_GengarSwipe, 132, 118, 6);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].oam.shape = SPRITE_SHAPE(32x16);\n        gSprites[spriteId].oam.size = SPRITE_SIZE(32x16);\n        Scene3_CalcCenterToCornerVec(&gSprites[spriteId]);\n        StartSpriteAnim(&gSprites[spriteId], ANIM_SWIPE_BOTTOM);\n    }\n}\n\nstatic void SpriteCB_GengarSwipe(struct Sprite *sprite)\n{\n    sprite->invisible ^= 1;\n    if (sprite->animEnded)\n        DestroySprite(sprite);\n}\n\n#define tState data[0]\n#define tSpeed data[1]\n#define tMoves data[2]\n\n// Scroll Gengar into position for the fight\nstatic void Scene3_Task_GengarEnter(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    static EWRAM_DATA u32 sGengarScroll = 0;\n\n    switch (tState)\n    {\n    case 0:\n        tSpeed = 0x400;\n        tState++;\n        // fallthrough\n    case 1:\n        // Don't decelerate for the first 40 movements\n        if (++tMoves >= 40 && tSpeed > 16)\n            tSpeed -= 16;\n        sGengarScroll = ChangeBgX(BG_SCENE3_GENGAR, tSpeed, BG_COORD_ADD);\n\n        if (sGengarScroll >= 0x8000)\n            ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n\n        if (sGengarScroll >= 0xEF00)\n        {\n            ChangeBgX(BG_SCENE3_GENGAR, 0xEF00, BG_COORD_SET);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\n#undef tState\n#undef tSpeed\n#undef tMoves\n\nstatic void SpriteCB_Star(struct Sprite *sprite)\n{\n    u32 random;\n    sprite->sStar_BaseX -= sprite->sStar_SpeedX;\n    sprite->sStar_BaseY += sprite->sStar_SpeedY;\n    sprite->sStar_SinIdx += 48;\n    sprite->x = sprite->sStar_BaseX >> 4;\n    sprite->y = sprite->sStar_BaseY >> 4;\n    sprite->y2 = gSineTable[(sprite->sStar_SinIdx >> 4) + 64] >> 5;\n    sprite->sStar_SparkleTimer++;\n    if (sprite->sStar_SparkleTimer % sStarSparklesSpawnRate)\n    {\n        LoadWordFromTwoHalfwords(&sprite->sStar_SparkleRngSeed, &random);\n        random = ISO_RANDOMIZE1(random);\n        StoreWordInTwoHalfwords(&sprite->sStar_SparkleRngSeed, random);\n        random >>= 16;\n        GFScene_CreateStarSparkle(sprite->x, sprite->y + sprite->y2, random);\n    }\n    if (sprite->x < -8)\n        DestroySprite(sprite);\n}\n\n// Callback for the sparkles that trail behind the star\nstatic void SpriteCB_SparklesSmall_Star(struct Sprite *sprite)\n{\n    sprite->sSmSparkleStar_BaseX += sprite->sSmSparkleStar_SpeedX;\n    sprite->sSmSparkleStar_BaseY += sprite->sSmSparkleStar_SpeedY;\n    sprite->sSmSparkleStar_FallDist += ++sprite->sSmSparkleStar_FallSpeed;\n    sprite->sSmSparkleStar_Timer++;\n    sprite->x = (u16)sprite->sSmSparkleStar_BaseX >> sStarSparklesXprecision;\n    sprite->y = sprite->sSmSparkleStar_BaseY >> sStarSparklesYprecision;\n    if (sStarSparklesGravityShift && sprite->sSmSparkleStar_SpeedY < 0)\n        sprite->y2 = sprite->sSmSparkleStar_FallDist >> sStarSparklesGravityShift;\n    if (sprite->sSmSparkleStar_Timer > sStarSparklesFlickerStartTime)\n    {\n        sprite->invisible = !sprite->invisible;\n        if (sprite->sSmSparkleStar_Timer > sStarSparklesDestroySpriteTime)\n            DestroySprite(sprite);\n    }\n    if (sprite->y + sprite->y2 < 0 || sprite->y + sprite->y2 > DISPLAY_HEIGHT)\n        DestroySprite(sprite);\n}\n\n// Callback for the small sparkles during the \"Game Freak\" text reveal\nstatic void SpriteCB_SparklesSmall_Name(struct Sprite *sprite)\n{\n    if (sprite->sSmSparkleName_AnimTimer)\n    {\n        sprite->sSmSparkleName_AnimTimer--;\n        sprite->sSmSparkleName_BaseY++;\n        sprite->y = sprite->sSmSparkleName_BaseY >> 4;\n        if (sprite->y > 86)\n        {\n            sprite->y = 74;\n            sprite->sSmSparkleName_BaseY = 74 << 4;\n        }\n        if (sprite->animEnded)\n        {\n            if (sprite->sSmSparkleName_State == 0)\n            {\n                sprite->x += 26;\n                if (sprite->x > 188)\n                {\n                    sprite->x = (188 * 2) - sprite->x;\n                    sprite->sSmSparkleName_State = 1;\n                }\n            }\n            else\n            {\n                sprite->x -= 26;\n                if (sprite->x < 52)\n                {\n                    sprite->x = (52 * 2) - sprite->x;\n                    sprite->sSmSparkleName_State = 0;\n                }\n            }\n            StartSpriteAnim(sprite, ANIM_SPARKLE_ONCE);\n        }\n    }\n    else\n    {\n        if (sprite->sSmSparkleName_NumLoops)\n            DestroySprite(sprite);\n        if (sprite->animEnded)\n            StartSpriteAnim(sprite, ANIM_SPARKLE_LOOP);\n        sprite->sSmSparkleName_BaseY += 4;\n        sprite->y = sprite->sSmSparkleName_BaseY >> 4;\n        if (++sprite->sSmSparkleName_DestroyTimer > 50)\n            DestroySprite(sprite);\n    }\n}\n\n// Callback for the big sparkles during the \"Game Freak\" text reveal\nstatic void SpriteCB_SparklesBig(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n        DestroySprite(sprite);\n}\n\nstatic void Scene3_CreateNidorinoSprite(struct IntroSequenceData * this)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_Scene3_Nidorino, 0, 0, 9);\n    this->scene3NidorinoSprite = &gSprites[spriteId];\n}\n\n#define sX       data[0]\n#define sSpeed   data[1]\n#define sTime    data[2] // Not read\n#define sTargetX data[3]\n#define sTimer   data[4]\n\nstatic void Scene3_StartNidorinoEntrance(struct Sprite *sprite, s16 xStart, s16 x1, u16 time)\n{\n    sprite->sX = xStart << 4;\n    sprite->sSpeed = ((x1 - xStart) << 4) / time;\n    sprite->sTime = time;\n    sprite->sTargetX = x1;\n    sprite->sTimer = 0;\n    sprite->x = xStart;\n    sprite->y = 100;\n    sprite->callback = Scene3_SpriteCB_NidorinoEnter;\n}\n\nstatic void Scene3_SpriteCB_NidorinoEnter(struct Sprite *sprite)\n{\n    if (++sprite->sTimer >= 40)\n    {\n        // Start decelerating after 40 frames\n        if (sprite->sSpeed > 1)\n            sprite->sSpeed--;\n    }\n    sprite->sX += sprite->sSpeed;\n    sprite->x = sprite->sX >> 4;\n    if (sprite->x >= sprite->sTargetX)\n    {\n        // Reached final position\n        sprite->x = sprite->sTargetX;\n        sprite->callback = SpriteCallbackDummy;\n    }\n}\n\nstatic bool32 Scene3_IsNidorinoEntering(struct IntroSequenceData * ptr)\n{\n    return ptr->scene3NidorinoSprite->callback == Scene3_SpriteCB_NidorinoEnter ? TRUE : FALSE;\n}\n\n#undef sX\n#undef sSpeed\n#undef sTime\n#undef sTargetX\n#undef sTimer\n\n#define sState       data[0]\n#define sStateTimer  data[1]\n#define sBounceTimer data[2]\n\nstatic void Scene3_StartNidorinoCry(struct IntroSequenceData * ptr)\n{\n    StartSpriteAnim(ptr->scene3NidorinoSprite, ANIM_NIDORINO_CROUCH);\n    ptr->scene3NidorinoSprite->sState = 0;\n    ptr->scene3NidorinoSprite->sStateTimer = 0;\n    ptr->scene3NidorinoSprite->y2 = 3;\n    ptr->scene3NidorinoSprite->callback = SpriteCB_NidorinoCry;\n}\n\nstatic void SpriteCB_NidorinoCry(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        if (++sprite->sStateTimer > 8)\n        {\n            StartSpriteAnim(sprite, ANIM_NIDORINO_CRY);\n            sprite->y2 = 0;\n            sprite->sState++;\n        }\n        break;\n    case 1:\n        PlayCry_ByMode(SPECIES_NIDORINO, 0x3F, CRY_MODE_DOUBLES);\n        sprite->sStateTimer = 0;\n        sprite->sState++;\n        break;\n    case 2:\n        if (++sprite->sBounceTimer > 1)\n        {\n            // Nidorino bounces slightly while crying\n            sprite->sBounceTimer = 0;\n            sprite->y2 = sprite->y2 == 0 ? 1 : 0;\n        }\n        if (++sprite->sStateTimer > 48)\n        {\n            StartSpriteAnim(sprite, ANIM_NIDORINO_NORMAL);\n            sprite->y2 = 0;\n            sprite->callback = SpriteCallbackDummy;\n        }\n        break;\n    }\n}\n\n#undef sState\n#undef sStateTimer\n#undef sBounceTimer\n\n#define sState         data[0]\n#define sStateTimer    data[1]\n#define sOffsetX       data[2]\n#define sSinIdx        data[3]\n#define sLandTimer     data[4]\n#define sSlowdownTimer data[5]\n#define sRandSeed      data[6]\n#define sSpeedX        data[7]\n\nstatic void Scene3_StartNidorinoRecoil(struct IntroSequenceData * ptr)\n{\n    sNidorinoRecoilReturnTime = 16;\n    sNidorinoJumpMult = 3;\n    sNidorinoJumpDiv = 5;\n    sNidorinoAnimDelayTime = 0;\n    StartSpriteAnim(ptr->scene3NidorinoSprite, ANIM_NIDORINO_CROUCH);\n    ptr->scene3NidorinoSprite->sState = 0;\n    ptr->scene3NidorinoSprite->sStateTimer = 0;\n    ptr->scene3NidorinoSprite->sOffsetX = 0;\n    ptr->scene3NidorinoSprite->sSinIdx = 0;\n    ptr->scene3NidorinoSprite->sLandTimer = 0;\n    ptr->scene3NidorinoSprite->sSpeedX = 40;\n    ptr->scene3NidorinoSprite->callback = SpriteCB_NidorinoRecoil;\n}\n\nstatic void SpriteCB_NidorinoRecoil(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        if (++sprite->sStateTimer > 4)\n        {\n            StartSpriteAnim(sprite, ANIM_NIDORINO_HOP);\n            sprite->sState++;\n        }\n        break;\n    case 1:\n        // Nidorino jumping backwards in the air\n        sprite->sOffsetX += sprite->sSpeedX;\n        sprite->sSinIdx += 8;\n        sprite->x2 = sprite->sOffsetX >> 4;\n        sprite->y2 = -((gSineTable[sprite->sSinIdx] * sNidorinoJumpMult) >> sNidorinoJumpDiv);\n        sprite->sSlowdownTimer++;\n        if (sprite->sSlowdownTimer > sNidorinoAnimDelayTime)\n        {\n            sprite->sSlowdownTimer = 0;\n            sprite->sSpeedX--;\n        }\n        if (++sprite->sLandTimer > 15)\n        {\n            // Nidorino hits the ground\n            StartSpriteAnim(sprite, ANIM_NIDORINO_CROUCH);\n            sprite->sStateTimer = 0;\n            sprite->sRandSeed = 0x4757;\n            sprite->sSpeedX = 28;\n            sprite->sState++;\n        }\n        break;\n    case 2:\n        // Nidorino sliding on the ground\n        sprite->sOffsetX += sprite->sSpeedX;\n        sprite->x2 = sprite->sOffsetX >> 4;\n        if (++sprite->sStateTimer > 6)\n        {\n            // The position of each subsequent dust sprite is \"random\", but with a fixed\n            // initial seed so that they'll be in the same positions between intro runs\n            CreateNidorinoRecoilDustSprites(sprite->x + sprite->x2, sprite->y + sprite->y2, sprite->sRandSeed);\n            sprite->sRandSeed *= RAND_MULT;\n        }\n        if (sprite->sStateTimer > 12)\n        {\n            StartSpriteAnim(sprite, ANIM_NIDORINO_NORMAL);\n            sprite->sStateTimer = 0;\n            sprite->sState++;\n        }\n        break;\n    case 3:\n        // Nidorino hops back to its original position\n        if (++sprite->sStateTimer > 16)\n            Scene3_StartNidorinoHop(sprite, sNidorinoRecoilReturnTime, -sprite->x2, 4);\n        break;\n    }\n}\n\n#undef sState\n#undef sStateTimer\n#undef sOffsetX\n#undef sSinIdx\n#undef sLandTimer\n#undef sSlowdownTimer\n#undef sRandSeed\n#undef sSpeedX\n\nstatic bool8 Scene3_NidorinoAnimIsRunning(struct IntroSequenceData * ptr)\n{\n    return ptr->scene3NidorinoSprite->callback == SpriteCallbackDummy ? FALSE : TRUE;\n}\n\n#define sState          data[0]\n#define sX              data[1]\n#define sY              data[2]\n#define sSpeedX         data[3]\n#define sSpeedY         data[4]\n#define sInvisibleTimer data[7]\n\nstatic void CreateNidorinoRecoilDustSprites(s16 x, s16 y, s16 seed)\n{\n    int i;\n    u8 spriteId;\n\n    // Recoil dust sprites are created in pairs at the same initial position but with different speeds.\n    // Only one of each pair will be visible at a time.\n    for (i = 0; i < 2; i++)\n    {\n        spriteId = CreateSprite(&sSpriteTemplate_NidorinoRecoilDust, x - 22, y + 24, 10);\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].sSpeedX = (seed % 13) + 8;\n            gSprites[spriteId].sSpeedY = seed % 3;\n            gSprites[spriteId].sInvisibleTimer = i;\n            seed *= RAND_MULT;\n        }\n    }\n}\n\nstatic void SpriteCB_RecoilDust(struct Sprite *sprite)\n{\n    s16 * data = sprite->data;\n\n    switch (sprite->sState)\n    {\n    case 0:\n        sX = sprite->x << 4;\n        sY = sprite->y << 4;\n        sprite->sState++;\n        // fallthrough\n    case 1:\n        sX -= sSpeedX;\n        sY += sSpeedY;\n        sprite->x = sX >> 4;\n        sprite->y = sY >> 4;\n        if (sprite->animEnded)\n            DestroySprite(sprite);\n        break;\n    }\n    \n    // Recoil dust flashes in and out\n    if (++sInvisibleTimer > 1)\n    {\n        sInvisibleTimer = 0;\n        sprite->invisible ^= 1;\n    }\n}\n\n#undef sState\n#undef sX\n#undef sY\n#undef sSpeedX\n#undef sSpeedY\n#undef sInvisibleTimer\n\n#define sState       data[0]\n#define sAirTime     data[1]\n#define sOffsetX     data[2]\n#define sSpeedX      data[3]\n#define sSinIdx      data[4]\n#define sSpeedY      data[5]\n#define sTimer       data[6]\n#define sHeightShift data[7]\n\nstatic void Scene3_StartNidorinoHop(struct Sprite *sprite, u16 time, s16 targetX, u8 heightShift)\n{\n    sprite->sState = 0;\n    sprite->sAirTime = time;\n    sprite->sOffsetX = sprite->x2 << 4;\n    sprite->sSpeedX = (targetX << 4) / time;\n    sprite->sSinIdx = 0;\n    sprite->sSpeedY = 0x800 / time;\n    sprite->sTimer = 0;\n    sprite->sHeightShift = heightShift;\n    StartSpriteAnim(sprite, ANIM_NIDORINO_CROUCH);\n    sprite->callback = SpriteCB_NidorinoHop;\n}\n\nstatic void SpriteCB_NidorinoHop(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        if (++sprite->sTimer > 4)\n        {\n            StartSpriteAnim(sprite, ANIM_NIDORINO_HOP);\n            sprite->sTimer = 0;\n            sprite->sState++;\n        }\n        break;\n    case 1:\n        if (--sprite->sAirTime)\n        {\n            // Nidorino moving through the air\n            sprite->sOffsetX += sprite->sSpeedX;\n            sprite->sSinIdx += sprite->sSpeedY;\n            sprite->x2 = sprite->sOffsetX >> 4;\n            sprite->y2 = -(gSineTable[sprite->sSinIdx >> 4] >> sprite->sHeightShift);\n        }\n        else\n        {\n            // Nidorino lands\n            sprite->x2 = (u16)sprite->sOffsetX >> 4;\n            sprite->y2 = 0;\n            StartSpriteAnim(sprite, ANIM_NIDORINO_CROUCH);\n            if (sprite->sHeightShift == 5)\n            {\n                // This is used by the short hops before Nidorino's attack.\n                // The last state is skipped so that Nidorino will stay in the crouched animation.\n                sprite->callback = SpriteCallbackDummy;\n            }\n            else\n            {\n                sprite->sTimer = 0;\n                sprite->sState++;\n            }\n        }\n        break;\n    case 2:\n        if (++sprite->sTimer > 4)\n        {\n            StartSpriteAnim(sprite, ANIM_NIDORINO_NORMAL);\n            sprite->callback = SpriteCallbackDummy;\n        }\n        break;\n    }\n}\n\n#undef sState\n#undef sAirTime\n#undef sOffsetX\n#undef sSpeedX\n#undef sSinIdx\n#undef sSpeedY\n#undef sTimer\n#undef sHeightShift\n\n#define sState      data[0]\n#define sTimer      data[1]\n#define sShakeTimer data[2]\n#define sSpeed      data[7]\n\nstatic void Scene3_StartNidorinoAttack(struct IntroSequenceData * ptr)\n{\n    ptr->scene3NidorinoSprite->sState = 0;\n    ptr->scene3NidorinoSprite->sTimer = 0;\n    ptr->scene3NidorinoSprite->sShakeTimer = 0;\n    ptr->scene3NidorinoSprite->data[3] = 0; // Unused\n    ptr->scene3NidorinoSprite->data[4] = 0; // Unused\n    ptr->scene3NidorinoSprite->data[5] = 0; // Unused\n    ptr->scene3NidorinoSprite->x += ptr->scene3NidorinoSprite->x2;\n    ptr->scene3NidorinoSprite->x2 = 0;\n    sNidorinoUnusedVar = 36;\n    sNidorinoAnimDelayTime = 40;\n    sNidorinoJumpMult = 3;\n    sNidorinoJumpDiv = 4;\n    ptr->scene3NidorinoSprite->sSpeed = 36;\n    StartSpriteAnim(ptr->scene3NidorinoSprite, ANIM_NIDORINO_CROUCH);\n    ptr->scene3NidorinoSprite->callback = SpriteCB_NidorinoAttack;\n}\n\nstatic void SpriteCB_NidorinoAttack(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        if (++sprite->sTimer & 1)\n        {\n            // Nidorino shakes horizontally before attacking\n            if (++sprite->sShakeTimer & 1)\n                sprite->x2++;\n            else\n                sprite->x2--;\n        }\n        if (sprite->sTimer > 17)\n        {\n            sprite->sTimer = 0;\n            sprite->sState++;\n        }\n        break;\n    case 1:\n        if (++sprite->sTimer >= sNidorinoAnimDelayTime)\n        {\n            StartSpriteAnim(sprite, ANIM_NIDORINO_ATTACK);\n            sprite->sTimer = 0;\n            sprite->sShakeTimer = 0;\n            sprite->sState++;\n        }\n        break;\n    case 2:\n        // Nidorino jumps at Gengar\n        sprite->sTimer += sprite->sSpeed;\n        sprite->x2 = -(sprite->sTimer >> 4);\n        sprite->y2 = -((gSineTable[sprite->sTimer >> 4] * sNidorinoJumpMult) >> sNidorinoJumpDiv);\n        sprite->sShakeTimer++; // Does nothing   \n        if (sprite->sSpeed > 12)\n            sprite->sSpeed--; // Decelerate as jump progresses\n        if ((sprite->sTimer >> 4) > 63)\n            sprite->callback = SpriteCallbackDummy;\n        break;\n    }\n}\n\n#undef sState\n#undef sTimer\n#undef sShakeTimer\n#undef sSpeed\n\nstatic void LoadFightSceneSpriteGraphics(void)\n{\n    int i;\n    for (i = 0; i < ARRAY_COUNT(sFightSceneSpriteSheets); i++)\n        LoadCompressedSpriteSheet(&sFightSceneSpriteSheets[i]);\n    LoadSpritePalettes(sFightSceneSpritePalettes);\n}\n"
  },
  {
    "path": "src/isagbprn.c",
    "content": "#include <stdarg.h>\n#include <stdio.h>\n#include \"config.h\"\n#include \"gba/gba.h\"\n#include \"malloc.h\"\n#include \"mini_printf.h\"\n\n#define AGB_PRINT_FLUSH_ADDR 0x9FE209D\n#define AGB_PRINT_STRUCT_ADDR 0x9FE20F8\n#define AGB_PRINT_PROTECT_ADDR 0x9FE2FFE\n#define WSCNT_DATA (WAITCNT_PHI_OUT_16MHZ | WAITCNT_WS0_S_2 | WAITCNT_WS0_N_4)\n\n// originally for auto no$gba support, the string \"no$gba\" should be at this address,\n// the user needs to read this string out as the memory viewer won't show it.\n#define NOCASHGBAIDADDR 0x4FFFA00\n#define NOCASHGBAPRINTADDR1 0x4FFFA10 // automatically adds a newline after the string has finished\n#define NOCASHGBAPRINTADDR2 0x4FFFA14 // does not automatically add the newline. by default, NOCASHGBAPRINTADDR2 is used. this is used to keep strings consistent between no$gba and VBA-RR, but a user can choose to forgo this.\n\n// hardware extensions for LOG_HANDLER_MGBA_PRINT\n#define REG_DEBUG_ENABLE ((vu16*) (0x4FFF780)) // handshake: (w)[0xC0DE] -> (r)[0x1DEA]\n#define REG_DEBUG_FLAGS  ((vu16*) (0x4FFF700))\n#define REG_DEBUG_STRING ((char*) (0x4FFF600))\n\nstruct AGBPrintStruct\n{\n    u16 m_nRequest;\n    u16 m_nBank;\n    u16 m_nGet;\n    u16 m_nPut;\n};\n\ntypedef void (*LPFN_PRINT_FLUSH)(void);\n\n#ifndef NDEBUG\n\n// AGBPrint print functions\n#if (LOG_HANDLER == LOG_HANDLER_AGB_PRINT)\nvoid AGBPrintFlush1Block(void);\n\nvoid AGBPrintInit(void)\n{\n    struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;\n    u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;\n    u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;\n    u16 nOldWSCNT = *pWSCNT;\n    *pWSCNT = WSCNT_DATA;\n    *pProtect = 0x20;\n    pPrint->m_nRequest = pPrint->m_nGet = pPrint->m_nPut = 0;\n    pPrint->m_nBank = 0xFD;\n    *pProtect = 0;\n    *pWSCNT = nOldWSCNT;\n}\n\nstatic void AGBPutcInternal(const char cChr)\n{\n    volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;\n    u16 *pPrintBuf = (u16 *)(0x8000000 + (pPrint->m_nBank << 16));\n    u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;\n    u16 nData = pPrintBuf[pPrint->m_nPut / 2];\n    *pProtect = 0x20;\n    nData = (pPrint->m_nPut & 1) ? (nData & 0xFF) | (cChr << 8) : (nData & 0xFF00) | cChr;\n    pPrintBuf[pPrint->m_nPut / 2] = nData;\n    pPrint->m_nPut++;\n    *pProtect = 0;\n}\n\nvoid AGBPutc(const char cChr)\n{\n    u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;\n    u16 nOldWSCNT = *pWSCNT;\n    struct AGBPrintStruct *pPrint;\n    *pWSCNT = WSCNT_DATA;\n    AGBPutcInternal(cChr);\n    *pWSCNT = nOldWSCNT;\n    pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;\n    if (pPrint->m_nPut == ((pPrint->m_nGet - 1) & 0xFFFF))\n        AGBPrintFlush1Block();\n}\n\nvoid AGBPrint(const char *pBuf)\n{\n    struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;\n    u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;\n    u16 nOldWSCNT = *pWSCNT;\n    *pWSCNT = WSCNT_DATA;\n    while (*pBuf)\n    {\n        AGBPutc(*pBuf);\n        pBuf++;\n    }\n    *pWSCNT = nOldWSCNT;\n}\n\nvoid AGBPrintf(const char *pBuf, ...)\n{\n    char bufPrint[0x100];\n    va_list vArgv;\n    va_start(vArgv, pBuf);\n    #if (PRETTY_PRINT_HANDLER == PRETTY_PRINT_OFF)\n    vsprintf(bufPrint, pBuf, vArgv);\n    #elif (PRETTY_PRINT_HANDLER == PRETTY_PRINT_MINI_PRINTF)\n    mini_vsnprintf(bufPrint, 0x100, pBuf, vArgv);\n    #elif (PRETTY_PRINT_HANDLER == PRETTY_PRINT_LIBC)\n    vsnprintf(bufPrint, 0x100, pBuf, vArgv);\n    #else\n    #error \"unspecified pretty printing handler.\"\n    #endif\n    va_end(vArgv);\n    AGBPrint(bufPrint);\n}\n\nstatic void AGBPrintTransferDataInternal(u32 bAllData)\n{\n    LPFN_PRINT_FLUSH lpfnFuncFlush;\n    u16 *pIME;\n    u16 nIME;\n    u16 *pWSCNT;\n    u16 nOldWSCNT;\n    u16 *pProtect;\n    volatile struct AGBPrintStruct *pPrint;\n\n    pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;\n    pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;\n    lpfnFuncFlush = (LPFN_PRINT_FLUSH)AGB_PRINT_FLUSH_ADDR;\n    pIME = (u16 *)REG_ADDR_IME;\n    nIME = *pIME;\n    pWSCNT = (u16 *)REG_ADDR_WAITCNT;\n    nOldWSCNT = *pWSCNT;\n    *pIME = nIME & ~1;\n    *pWSCNT = WSCNT_DATA;\n\n    if (bAllData)\n    {\n        while (pPrint->m_nPut != pPrint->m_nGet)\n        {\n            *pProtect = 0x20;\n            lpfnFuncFlush();\n            *pProtect = 0;\n        }\n    }\n    else if (pPrint->m_nPut != pPrint->m_nGet)\n    {\n        *pProtect = 0x20;\n        lpfnFuncFlush();\n        *pProtect = 0;\n    }\n\n    *pWSCNT = nOldWSCNT;\n    *pIME = nIME;\n}\n\nvoid AGBPrintFlush1Block(void)\n{\n    AGBPrintTransferDataInternal(FALSE);\n}\n\nvoid AGBPrintFlush(void)\n{\n    AGBPrintTransferDataInternal(TRUE);\n}\n\nvoid AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram)\n{\n    if (nStopProgram)\n    {\n        AGBPrintf(\"ASSERTION FAILED  FILE=[%s] LINE=[%d]  EXP=[%s] \\n\", pFile, nLine, pExpression);\n        AGBPrintFlush();\n        asm(\".hword 0xEFFF\");\n    }\n    else\n    {\n        AGBPrintf(\"WARING FILE=[%s] LINE=[%d]  EXP=[%s] \\n\", pFile, nLine, pExpression);\n    }\n}\n#endif\n\n// no$gba print functions\n#if (LOG_HANDLER == LOG_HANDLER_NOCASH_PRINT)\nvoid NoCashGBAPrint(const char *pBuf)\n{\n    *(volatile u32 *)NOCASHGBAPRINTADDR2 = (u32)pBuf;\n}\n\nvoid NoCashGBAPrintf(const char *pBuf, ...)\n{\n    char bufPrint[0x100];\n    va_list vArgv;\n    va_start(vArgv, pBuf);\n    #if (PRETTY_PRINT_HANDLER == PRETTY_PRINT_OFF)\n    vsprintf(bufPrint, pBuf, vArgv);\n    #elif (PRETTY_PRINT_HANDLER == PRETTY_PRINT_MINI_PRINTF)\n    mini_vsnprintf(bufPrint, 0x100, pBuf, vArgv);\n    #elif (PRETTY_PRINT_HANDLER == PRETTY_PRINT_LIBC)\n    vsnprintf(bufPrint, 0x100, pBuf, vArgv);\n    #else\n    #error \"unspecified pretty printing handler.\"\n    #endif\n    va_end(vArgv);\n    NoCashGBAPrint(bufPrint);\n}\n\nvoid NoCashGBAAssert(const char *pFile, s32 nLine, const char *pExpression, bool32 nStopProgram)\n{\n    if (nStopProgram)\n    {\n        NoCashGBAPrintf(\"ASSERTION FAILED  FILE=[%s] LINE=[%d]  EXP=[%s]\", pFile, nLine, pExpression);\n        asm(\".hword 0xEFFF\");\n    }\n    else\n    {\n        NoCashGBAPrintf(\"WARING FILE=[%s] LINE=[%d]  EXP=[%s]\", pFile, nLine, pExpression);\n    }\n}\n#endif\n\n// mgba print functions\n#if (LOG_HANDLER == LOG_HANDLER_MGBA_PRINT)\n#define MGBA_REG_DEBUG_MAX (256)\n\nbool32 MgbaOpen(void)\n{\n    *REG_DEBUG_ENABLE = 0xC0DE;\n    return *REG_DEBUG_ENABLE == 0x1DEA;\n}\n\nvoid MgbaClose(void)\n{\n    *REG_DEBUG_ENABLE = 0;\n}\n\nvoid MgbaPrintf(s32 level, const char* ptr, ...)\n{\n    va_list args;\n\n    level &= 0x7;\n    va_start(args, ptr);\n    #if (PRETTY_PRINT_HANDLER == PRETTY_PRINT_OFF)\n    vsprintf(REG_DEBUG_STRING, ptr, args);\n    #elif (PRETTY_PRINT_HANDLER == PRETTY_PRINT_MINI_PRINTF)\n    mini_vsnprintf(REG_DEBUG_STRING, MGBA_REG_DEBUG_MAX, ptr, args);\n    #elif (PRETTY_PRINT_HANDLER == PRETTY_PRINT_LIBC)\n    vsnprintf(REG_DEBUG_STRING, MGBA_REG_DEBUG_MAX, ptr, args);\n    #else\n    #error \"unspecified pretty printing handler.\"\n    #endif\n    va_end(args);\n    *REG_DEBUG_FLAGS = level | 0x100;\n}\n\nvoid MgbaAssert(const char *pFile, s32 nLine, const char *pExpression, bool32 nStopProgram)\n{\n    if (nStopProgram)\n    {\n        MgbaPrintf(MGBA_LOG_ERROR, \"ASSERTION FAILED  FILE=[%s] LINE=[%d]  EXP=[%s]\", pFile, nLine, pExpression);\n        asm(\".hword 0xEFFF\");\n    }\n    else\n    {\n        MgbaPrintf(MGBA_LOG_WARN, \"WARING FILE=[%s] LINE=[%d]  EXP=[%s]\", pFile, nLine, pExpression);\n    }\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/item.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"berry.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"item.h\"\n#include \"party_menu.h\"\n#include \"item_use.h\"\n#include \"load_save.h\"\n#include \"money.h\"\n#include \"quest_log.h\"\n#include \"strings.h\"\n#include \"constants/hold_effects.h\"\n#include \"constants/items.h\"\n#include \"constants/maps.h\"\n\nEWRAM_DATA struct BagPocket gBagPockets[NUM_BAG_POCKETS] = {};\nEWRAM_DATA struct ItemSlot gTmHmItemSlots[BAG_TMHM_COUNT] = {0};\nEWRAM_DATA struct ItemSlot gKeyItemSlots[BAG_KEYITEMS_COUNT] = {0};\n\nvoid SortAndCompactBagPocket(struct BagPocket * pocket);\nstatic void RemoveTMItemBall(u16 itemId);\n\n// Item descriptions and data\n#include \"data/items.h\"\n\nu16 GetBagItemQuantity(u16 * ptr)\n{\n    return gSaveBlock2Ptr->encryptionKey ^ *ptr;\n}\n\nvoid SetBagItemQuantity(u16 * ptr, u16 value)\n{\n    *ptr = value ^ gSaveBlock2Ptr->encryptionKey;\n}\n\nu16 GetPcItemQuantity(u16 * ptr)\n{\n    return 0 ^ *ptr;\n}\n\nvoid SetPcItemQuantity(u16 * ptr, u16 value)\n{\n    *ptr = value ^ 0;\n}\n\nvoid ApplyNewEncryptionKeyToBagItems(u32 key)\n{\n    u32 i, j;\n\n    for (i = 0; i < NUM_BAG_POCKETS; i++)\n    {\n        for (j = 0; j < gBagPockets[i].capacity; j++)\n        {\n            ApplyNewEncryptionKeyToHword(&gBagPockets[i].itemSlots[j].quantity, key);\n        }\n    }\n}\n\nvoid ApplyNewEncryptionKeyToBagItems_(u32 key)\n{\n    ApplyNewEncryptionKeyToBagItems(key);\n}\n\nvoid DeserializeTmHmItemSlots(void)\n{\n    int i;\n\n    for (i = 0; i < BAG_TMHM_COUNT; ++i)\n    {\n        gTmHmItemSlots[i].itemId = 0;\n        SetBagItemQuantity(&(gTmHmItemSlots[i].quantity), 0);\n    }\n    for (i = 0; i < TMHM_COUNT; ++i)\n    {\n        u8 bit = i % 8;\n        if (gSaveBlock1Ptr->bagPocket_TMHM[i / 8] & (1<<bit))\n            AddBagItem(i + ITEM_TM01, 1);\n    }\n}\n\nvoid DeserializeKeyItemSlots(void)\n{\n    int i;\n\n    for (i = 0; i < BAG_KEYITEMS_COUNT; ++i)\n    {\n        gKeyItemSlots[i].itemId = 0;\n        SetBagItemQuantity(&(gKeyItemSlots[i].quantity), 0);\n    }\n    for (i = 0; i < BAG_KEYITEMS_COUNT; ++i)\n    {\n        if (gSaveBlock1Ptr->bagPocket_KeyItems[i] != 0 && gSaveBlock1Ptr->bagPocket_KeyItems[i] <= 30)\n            AddBagItem(gSaveBlock1Ptr->bagPocket_KeyItems[i] + 258, 1);\n        if (gSaveBlock1Ptr->bagPocket_KeyItems[i] != 0 && gSaveBlock1Ptr->bagPocket_KeyItems[i] > 30 && gSaveBlock1Ptr->bagPocket_KeyItems[i] < 59)\n            AddBagItem(gSaveBlock1Ptr->bagPocket_KeyItems[i] + 348 - 30, 1);\n        if (gSaveBlock1Ptr->bagPocket_KeyItems[i] == 59)\n            AddBagItem(ITEM_LINK_BRACELET, 1);\n    }\n}\n\nvoid SetBagPocketsPointers(void)\n{\n    gBagPockets[POCKET_ITEMS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Items;\n    gBagPockets[POCKET_ITEMS - 1].capacity = BAG_ITEMS_COUNT;\n    gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots = &gKeyItemSlots[0];\n    gBagPockets[POCKET_KEY_ITEMS - 1].capacity = BAG_KEYITEMS_COUNT;\n    gBagPockets[POCKET_POKE_BALLS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_PokeBalls;\n    gBagPockets[POCKET_POKE_BALLS - 1].capacity = BAG_POKEBALLS_COUNT;\n    gBagPockets[POCKET_TM_CASE - 1].itemSlots = &gTmHmItemSlots[0];\n    gBagPockets[POCKET_TM_CASE - 1].capacity = BAG_TMHM_COUNT;\n    gBagPockets[POCKET_BERRY_POUCH - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Berries;\n    gBagPockets[POCKET_BERRY_POUCH - 1].capacity = BAG_BERRIES_COUNT;\n    gBagPockets[POCKET_MEDICINE - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Medicine;\n    gBagPockets[POCKET_MEDICINE - 1].capacity = BAG_MEDICINE_COUNT;\n    gBagPockets[POCKET_HELD_ITEMS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_HoldItems;\n    gBagPockets[POCKET_HELD_ITEMS - 1].capacity = BAG_HELD_ITEMS_COUNT;\n}\n\nvoid CopyItemName(u16 itemId, u8 * dest)\n{\n    if (itemId == ITEM_ENIGMA_BERRY)\n    {\n        StringCopy(dest, GetBerryInfo(ITEM_TO_BERRY(ITEM_ENIGMA_BERRY))->name);\n        StringAppend(dest, gText_Berry);\n    }\n    else\n    {\n        StringCopy(dest, ItemId_GetName(itemId));\n    }\n}\n\ns16 BagPocketGetFirstEmptySlot(u8 pocketId)\n{\n    u32 i;\n\n    for (i = 0; i < gBagPockets[pocketId].capacity; i++)\n    {\n        if (gBagPockets[pocketId].itemSlots[i].itemId == ITEM_NONE)\n            return i;\n    }\n\n    return -1;\n}\n\nbool8 IsPocketNotEmpty(u8 pocketId)\n{\n    u32 i;\n\n    for (i = 0; i < gBagPockets[pocketId - 1].capacity; i++)\n    {\n        if (gBagPockets[pocketId - 1].itemSlots[i].itemId != ITEM_NONE)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nbool8 CheckBagHasItem(u16 itemId, u16 count)\n{\n    u32 i;\n    u8 pocket;\n\n    if (ItemId_GetPocket(itemId) == 0)\n        return FALSE;\n\n    pocket = ItemId_GetPocket(itemId) - 1;\n    // Check for item slots that contain the item\n    for (i = 0; i < gBagPockets[pocket].capacity; i++)\n    {\n        if (gBagPockets[pocket].itemSlots[i].itemId == itemId)\n        {\n            u16 quantity;\n            // Does this item slot contain enough of the item?\n            quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);\n            if (quantity >= count)\n                return TRUE;\n                // RS and Emerald check whether there is enough of the\n                // item across all stacks.\n                // For whatever reason, FR/LG assume there's only one\n                // stack of the item.\n            else\n                return FALSE;\n        }\n    }\n    return FALSE;\n}\n\nbool8 HasAtLeastOneBerry(void)\n{\n    u8 itemId;\n    bool8 exists;\n\n    exists = CheckBagHasItem(ITEM_BERRY_POUCH, 1);\n    if (!exists)\n    {\n        gSpecialVar_Result = FALSE;\n        return FALSE;\n    }\n    for (itemId = FIRST_BERRY_INDEX; itemId <= LAST_BERRY_INDEX; itemId++)\n    {\n        exists = CheckBagHasItem(itemId, 1);\n        if (exists)\n        {\n            gSpecialVar_Result = TRUE;\n            return TRUE;\n        }\n    }\n\n    gSpecialVar_Result = FALSE;\n    return FALSE;\n}\n\nbool8 CheckBagHasSpace(u16 itemId, u16 count)\n{\n    u32 i;\n    u8 pocket;\n\n    if (ItemId_GetPocket(itemId) == 0)\n        return FALSE;\n\n    pocket = ItemId_GetPocket(itemId) - 1;\n    // Check for item slots that contain the item\n    for (i = 0; i < gBagPockets[pocket].capacity; i++)\n    {\n        if (gBagPockets[pocket].itemSlots[i].itemId == itemId)\n        {\n            u16 quantity;\n            // Does this stack have room for more??\n            quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);\n            if (quantity + count <= 999)\n                return TRUE;\n            // RS and Emerald check whether there is enough of the\n            // item across all stacks.\n            // For whatever reason, FR/LG assume there's only one\n            // stack of the item.\n            else\n                return FALSE;\n        }\n    }\n\n    if (BagPocketGetFirstEmptySlot(pocket) != -1)\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic void SetTmHmOwned(u16 itemId)\n{\n    u8* flagByte = &gSaveBlock1Ptr->bagPocket_TMHM[(itemId - ITEM_TM01) / 8];\n    *flagByte = (*flagByte) | (1 << ((itemId - ITEM_TM01) % 8));\n}\n\nbool8 AddBagItem(u16 itemId, u16 count)\n{\n    u32 i;\n    u8 pocket;\n    s16 idx;\n\n    if (ItemId_GetPocket(itemId) == 0)\n        return FALSE;\n\n    pocket = ItemId_GetPocket(itemId) - 1;\n    if (pocket == POCKET_TM_CASE - 1)\n    {\n        if (pocket == POCKET_TM_CASE - 1 && !CheckBagHasItem(ITEM_TM_CASE, 1))\n        {\n            idx = BagPocketGetFirstEmptySlot(POCKET_KEY_ITEMS - 1);\n            if (idx == -1)\n                return FALSE;\n            gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].itemId = ITEM_TM_CASE;\n            SetBagItemQuantity(&gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].quantity, 1);\n        }\n        if(!FlagGet(FLAG_DONT_ADD_TMS)) //don't add if Teachy TV\n            SetTmHmOwned(itemId);\n    }\n    for (i = 0; i < gBagPockets[pocket].capacity; i++)\n    {\n        if (gBagPockets[pocket].itemSlots[i].itemId == itemId)\n        {\n            u16 quantity;\n            // Does this stack have room for more??\n            quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);\n            if (quantity + count <= 999)\n            {\n                quantity += count;\n                SetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity, quantity);\n                return TRUE;\n            }\n            // RS and Emerald check whether there is enough of the\n            // item across all stacks.\n            // For whatever reason, FR/LG assume there's only one\n            // stack of the item.\n            else\n                return FALSE;\n        }\n    }\n\n    if (pocket == POCKET_BERRY_POUCH - 1 && !CheckBagHasItem(ITEM_BERRY_POUCH, 1))\n    {\n        idx = BagPocketGetFirstEmptySlot(POCKET_KEY_ITEMS - 1);\n        if (idx == -1)\n            return FALSE;\n        gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].itemId = ITEM_BERRY_POUCH;\n        SetBagItemQuantity(&gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].quantity, 1);\n        FlagSet(FLAG_SYS_GOT_BERRY_POUCH);\n    }\n\n    if (itemId == ITEM_BERRY_POUCH)\n        FlagSet(FLAG_SYS_GOT_BERRY_POUCH);\n\n    idx = BagPocketGetFirstEmptySlot(pocket);\n    if (idx == -1)\n        return FALSE;\n\n    gBagPockets[pocket].itemSlots[idx].itemId = itemId;\n    SetBagItemQuantity(&gBagPockets[pocket].itemSlots[idx].quantity, count);\n    RemoveTMItemBall(itemId);\n    return TRUE;\n}\n\nstatic void RemoveTMItemBall(u16 itemId)\n{\n    if ((ItemId_GetPocket(itemId) - 1) != POCKET_TM_CASE - 1) //not TM\n    {\n        return;\n    }\n    switch(itemId)\n    {\n        case ITEM_TM01:\n            FlagSet(FLAG_HIDE_SILPH_CO_5F_TM01);\n            RemoveObjectEventByLocalIdAndMap(7, MAP_NUM(SILPH_CO_5F), MAP_GROUP(SILPH_CO_5F));\n            return;\n        case ITEM_TM02:\n            FlagSet(FLAG_HIDE_VICTORY_ROAD_1F_TM02);\n            RemoveObjectEventByLocalIdAndMap(4, MAP_NUM(VICTORY_ROAD_1F), MAP_GROUP(VICTORY_ROAD_1F));\n            return;\n        case ITEM_TM05:\n            FlagSet(FLAG_HIDE_ROUTE4_TM05);\n            RemoveObjectEventByLocalIdAndMap(3, MAP_NUM(ROUTE4), MAP_GROUP(ROUTE4));\n            return;\n        case ITEM_TM07:\n            FlagSet(FLAG_HIDE_VICTORY_ROAD_2F_TM07);\n            RemoveObjectEventByLocalIdAndMap(7, MAP_NUM(VICTORY_ROAD_2F), MAP_GROUP(VICTORY_ROAD_2F));\n            return;\n        case ITEM_TM08:\n            FlagSet(FLAG_HIDE_SILPH_CO_7F_TM08);\n            RemoveObjectEventByLocalIdAndMap(11, MAP_NUM(SILPH_CO_7F), MAP_GROUP(SILPH_CO_7F));\n            return;\n        case ITEM_TM09:\n            FlagSet(FLAG_HIDE_MT_MOON_1F_TM09);\n            RemoveObjectEventByLocalIdAndMap(9, MAP_NUM(MT_MOON_1F), MAP_GROUP(MT_MOON_1F));\n            return;\n        case ITEM_TM11:\n            FlagSet(FLAG_HIDE_SAFARI_ZONE_EAST_TM11);\n            RemoveObjectEventByLocalIdAndMap(3, MAP_NUM(SAFARI_ZONE_EAST), MAP_GROUP(SAFARI_ZONE_EAST));\n            return;\n        case ITEM_TM12:\n            FlagSet(FLAG_HIDE_ROCKET_HIDEOUT_B2F_TM12);\n            RemoveObjectEventByLocalIdAndMap(4, MAP_NUM(ROCKET_HIDEOUT_B2F), MAP_GROUP(ROCKET_HIDEOUT_B2F));\n            return;\n        case ITEM_TM14:\n            FlagSet(FLAG_HIDE_POKEMON_MANSION_B1F_TM14);\n            RemoveObjectEventByLocalIdAndMap(4, MAP_NUM(POKEMON_MANSION_B1F), MAP_GROUP(POKEMON_MANSION_B1F));\n            return;\n        case ITEM_TM17:\n            FlagSet(FLAG_HIDE_POWER_PLANT_TM17);\n            RemoveObjectEventByLocalIdAndMap(2, MAP_NUM(POWER_PLANT), MAP_GROUP(POWER_PLANT));\n            return;\n        case ITEM_TM18:\n            FlagSet(FLAG_HIDE_ROUTE15_TM18);\n            RemoveObjectEventByLocalIdAndMap(11, MAP_NUM(ROUTE15), MAP_GROUP(ROUTE15));\n            return;\n        case ITEM_TM21:\n            FlagSet(FLAG_HIDE_ROCKET_HIDEOUT_B3F_TM21);\n            RemoveObjectEventByLocalIdAndMap(4, MAP_NUM(ROCKET_HIDEOUT_B3F), MAP_GROUP(ROCKET_HIDEOUT_B3F));\n            return;\n        case ITEM_TM22:\n            FlagSet(FLAG_HIDE_POKEMON_MANSION_B1F_TM22);\n            RemoveObjectEventByLocalIdAndMap(1, MAP_NUM(POKEMON_MANSION_B1F), MAP_GROUP(POKEMON_MANSION_B1F));\n            return;\n        case ITEM_TM25:\n            FlagSet(FLAG_HIDE_POWER_PLANT_TM25);\n            RemoveObjectEventByLocalIdAndMap(3, MAP_NUM(POWER_PLANT), MAP_GROUP(POWER_PLANT));\n            return;\n        case ITEM_TM31:\n            FlagSet(FLAG_HIDE_SSANNE_1F_ROOM2_TM31);\n            RemoveObjectEventByLocalIdAndMap(4, MAP_NUM(SSANNE_1F_ROOM2), MAP_GROUP(SSANNE_1F_ROOM2));\n            return;\n        case ITEM_TM32:\n            FlagSet(FLAG_HIDE_SAFARI_ZONE_WEST_TM32);\n            RemoveObjectEventByLocalIdAndMap(2, MAP_NUM(SAFARI_ZONE_WEST), MAP_GROUP(SAFARI_ZONE_WEST));\n            return;\n        case ITEM_TM36:\n            FlagSet(FLAG_HIDE_FIVE_ISLAND_ROCKET_WAREHOUSE_TM36);\n            RemoveObjectEventByLocalIdAndMap(8, MAP_NUM(FIVE_ISLAND_ROCKET_WAREHOUSE), MAP_GROUP(FIVE_ISLAND_ROCKET_WAREHOUSE));\n            return;\n        case ITEM_TM37:\n            FlagSet(FLAG_HIDE_VICTORY_ROAD_2F_TM37);\n            RemoveObjectEventByLocalIdAndMap(9, MAP_NUM(VICTORY_ROAD_2F), MAP_GROUP(VICTORY_ROAD_2F));\n            return;\n        case ITEM_TM40:\n            FlagSet(FLAG_HIDE_ROUTE9_TM40);\n            RemoveObjectEventByLocalIdAndMap(11, MAP_NUM(ROUTE9), MAP_GROUP(ROUTE9));\n            return;\n        case ITEM_TM41:\n            FlagSet(FLAG_HIDE_SILPH_CO_4F_TM41);\n            RemoveObjectEventByLocalIdAndMap(8, MAP_NUM(SILPH_CO_4F), MAP_GROUP(SILPH_CO_4F));\n            return;\n        case ITEM_TM43:\n            FlagSet(FLAG_HIDE_ROUTE25_TM43);\n            RemoveObjectEventByLocalIdAndMap(10, MAP_NUM(ROUTE25), MAP_GROUP(ROUTE25));\n            return;\n        case ITEM_TM44:\n            FlagSet(FLAG_HIDE_SSANNE_B1F_ROOM2_TM44);\n            RemoveObjectEventByLocalIdAndMap(2, MAP_NUM(SSANNE_B1F_ROOM2), MAP_GROUP(SSANNE_B1F_ROOM2));\n            return;\n        case ITEM_TM45:\n            FlagSet(FLAG_HIDE_ROUTE24_TM45);\n            RemoveObjectEventByLocalIdAndMap(8, MAP_NUM(ROUTE24), MAP_GROUP(ROUTE24));\n            return;\n        case ITEM_TM46:\n            FlagSet(FLAG_HIDE_MT_MOON_B2F_TM46);\n            RemoveObjectEventByLocalIdAndMap(9, MAP_NUM(MT_MOON_B2F), MAP_GROUP(MT_MOON_B2F));\n            return;\n        case ITEM_TM47:\n            FlagSet(FLAG_HIDE_SAFARI_ZONE_NORTH_TM47);\n            RemoveObjectEventByLocalIdAndMap(2, MAP_NUM(SAFARI_ZONE_NORTH), MAP_GROUP(SAFARI_ZONE_NORTH));\n            return;\n        case ITEM_TM48:\n            FlagSet(FLAG_HIDE_ROUTE12_TM48);\n            RemoveObjectEventByLocalIdAndMap(10, MAP_NUM(ROUTE12), MAP_GROUP(ROUTE12));\n            return;\n        case ITEM_TM49:\n            FlagSet(FLAG_HIDE_ROCKET_HIDEOUT_B4F_TM49);\n            RemoveObjectEventByLocalIdAndMap(7, MAP_NUM(ROCKET_HIDEOUT_B4F), MAP_GROUP(ROCKET_HIDEOUT_B4F));\n            return;\n        case ITEM_TM50:\n            FlagSet(FLAG_HIDE_VICTORY_ROAD_3F_TM50);\n            RemoveObjectEventByLocalIdAndMap(6, MAP_NUM(VICTORY_ROAD_3F), MAP_GROUP(VICTORY_ROAD_3F));\n            return;\n    }\n}\n\nbool8 RemoveBagItem(u16 itemId, u16 count)\n{\n    u32 i;\n    u8 pocket;\n\n    if (ItemId_GetPocket(itemId) == 0)\n        return FALSE;\n\n    if (itemId == ITEM_NONE)\n        return FALSE;\n\n    pocket = ItemId_GetPocket(itemId) - 1;\n    // Check for item slots that contain the item\n    for (i = 0; i < gBagPockets[pocket].capacity; i++)\n    {\n        if (gBagPockets[pocket].itemSlots[i].itemId == itemId)\n        {\n            u16 quantity;\n            // Does this item slot contain enough of the item?\n            quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);\n            if (quantity >= count)\n            {\n                quantity -= count;\n                SetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity, quantity);\n                if (quantity == 0)\n                    gBagPockets[pocket].itemSlots[i].itemId = ITEM_NONE;\n                return TRUE;\n            }\n            // RS and Emerald check whether there is enough of the\n            // item across all stacks.\n            // For whatever reason, FR/LG assume there's only one\n            // stack of the item.\n            else\n                return FALSE;\n        }\n    }\n    return FALSE;\n}\n\nu8 GetPocketByItemId(u16 itemId)\n{\n    return ItemId_GetPocket(itemId); // wow such important\n}\n\nvoid ClearItemSlots(struct ItemSlot * slots, u8 capacity)\n{\n    u32 i;\n\n    for (i = 0; i < capacity; i++)\n    {\n        slots[i].itemId = ITEM_NONE;\n        SetBagItemQuantity(&slots[i].quantity, 0);\n    }\n}\n\nvoid ClearPCItemSlots(void)\n{\n    u32 i;\n\n    for (i = 0; i < PC_ITEMS_COUNT; i++)\n    {\n        gSaveBlock1Ptr->pcItems[i].itemId = ITEM_NONE;\n        SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity, 0);\n    }\n}\n\nvoid ClearBag(void)\n{\n    u32 i;\n\n    for (i = 0; i < 7; i++)\n    {\n        ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity);\n    }\n}\n\ns8 PCItemsGetFirstEmptySlot(void)\n{\n    s32 i;\n\n    for (i = 0; i < PC_ITEMS_COUNT; i++)\n    {\n        if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE)\n            return i;\n    }\n\n    return -1;\n}\n\nu8 CountItemsInPC(void)\n{\n    u8 count = 0;\n    u32 i;\n\n    for (i = 0; i < PC_ITEMS_COUNT; i++)\n    {\n        if (gSaveBlock1Ptr->pcItems[i].itemId != ITEM_NONE)\n            count++;\n    }\n\n    return count;\n}\n\nbool8 CheckPCHasItem(u16 itemId, u16 count)\n{\n    u32 i;\n    u16 quantity;\n\n    for (i = 0; i < PC_ITEMS_COUNT; i++)\n    {\n        if (gSaveBlock1Ptr->pcItems[i].itemId == itemId)\n        {\n            quantity = GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity);\n            if (quantity >= count)\n                return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nbool8 AddPCItem(u16 itemId, u16 count)\n{\n    u32 i;\n    u16 quantity;\n    s8 idx;\n\n    for (i = 0; i < PC_ITEMS_COUNT; i++)\n    {\n        if (gSaveBlock1Ptr->pcItems[i].itemId == itemId)\n        {\n            quantity = GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity);\n            if (quantity + count <= 999)\n            {\n                quantity += count;\n                SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity, quantity);\n                return TRUE;\n            }\n            else\n                return FALSE;\n        }\n    }\n\n    idx = PCItemsGetFirstEmptySlot();\n    if (idx == -1)\n        return FALSE;\n\n    gSaveBlock1Ptr->pcItems[idx].itemId = itemId;\n    SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[idx].quantity, count);\n    return TRUE;\n}\n\nvoid RemovePCItem(u16 itemId, u16 count)\n{\n    u32 i;\n    u16 quantity;\n\n    if (itemId == ITEM_NONE)\n        return;\n\n    for (i = 0; i < PC_ITEMS_COUNT; i++)\n    {\n        if (gSaveBlock1Ptr->pcItems[i].itemId == itemId)\n            break;\n    }\n\n    if (i != PC_ITEMS_COUNT)\n    {\n        quantity = GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity) - count;\n        SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity, quantity);\n        if (quantity == 0)\n            gSaveBlock1Ptr->pcItems[i].itemId = ITEM_NONE;\n    }\n}\n\nvoid ItemPcCompaction(void)\n{\n    u16 i, j;\n    struct ItemSlot tmp;\n\n    for (i = 0; i < PC_ITEMS_COUNT - 1; i++)\n    {\n        for (j = i + 1; j < PC_ITEMS_COUNT; j++)\n        {\n            if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE)\n            {\n                tmp = gSaveBlock1Ptr->pcItems[i];\n                gSaveBlock1Ptr->pcItems[i] = gSaveBlock1Ptr->pcItems[j];\n                gSaveBlock1Ptr->pcItems[j] = tmp;\n            }\n        }\n    }\n}\n\nvoid RegisteredItemHandleBikeSwap(void)\n{\n    switch (gSaveBlock1Ptr->registeredItem)\n    {\n    case ITEM_MACH_BIKE:\n        gSaveBlock1Ptr->registeredItem = ITEM_ACRO_BIKE;\n        break;\n    case ITEM_ACRO_BIKE:\n        gSaveBlock1Ptr->registeredItem = ITEM_MACH_BIKE;\n        break;\n    }\n}\n\nvoid SwapItemSlots(struct ItemSlot * a, struct ItemSlot * b)\n{\n    struct ItemSlot c;\n    c = *a;\n    *a = *b;\n    *b = c;\n}\n\nvoid BagPocketCompaction(struct ItemSlot * slots, u8 capacity)\n{\n    u16 i, j;\n\n    for (i = 0; i < capacity - 1; i++)\n    {\n        for (j = i + 1; j < capacity; j++)\n        {\n            if (GetBagItemQuantity(&slots[i].quantity) == 0)\n            {\n                SwapItemSlots(&slots[i], &slots[j]);\n            }\n        }\n    }\n}\n\nvoid SortPocketAndPlaceHMsFirst(struct BagPocket * pocket)\n{\n    u32 i;\n    u16 j = 0;\n    u32 k;\n    struct ItemSlot * buff;\n\n    SortAndCompactBagPocket(pocket);\n\n    for (i = 0; i < pocket->capacity; i++)\n    {\n        if (pocket->itemSlots[i].itemId == ITEM_NONE && GetBagItemQuantity(&pocket->itemSlots[i].quantity) == 0)\n            return;\n        if (pocket->itemSlots[i].itemId >= ITEM_HM01 && GetBagItemQuantity(&pocket->itemSlots[i].quantity) != 0)\n        {\n            for (j = i + 1; j < pocket->capacity; j++)\n            {\n                if (pocket->itemSlots[j].itemId == ITEM_NONE && GetBagItemQuantity(&pocket->itemSlots[j].quantity) == 0)\n                    break;\n            }\n            break;\n        }\n    }\n\n    for (k = 0; k < pocket->capacity; k++)\n        pocket->itemSlots[k].quantity = GetBagItemQuantity(&pocket->itemSlots[k].quantity);\n    buff = AllocZeroed(pocket->capacity * sizeof(struct ItemSlot));\n    CpuCopy16(pocket->itemSlots + i, buff, (j - i) * sizeof(struct ItemSlot));\n    CpuCopy16(pocket->itemSlots, buff + (j - i), i * sizeof(struct ItemSlot));\n    CpuCopy16(buff, pocket->itemSlots, pocket->capacity * sizeof(struct ItemSlot));\n    for (k = 0; k < pocket->capacity; k++)\n        SetBagItemQuantity(&pocket->itemSlots[k].quantity, pocket->itemSlots[k].quantity);\n    Free(buff);\n}\n\nvoid SortAndCompactBagPocket(struct BagPocket * pocket)\n{\n    u16 i, j;\n\n    for (i = 0; i < pocket->capacity; i++)\n    {\n        for (j = i + 1; j < pocket->capacity; j++)\n        {\n            if (GetBagItemQuantity(&pocket->itemSlots[i].quantity) == 0 || (GetBagItemQuantity(&pocket->itemSlots[j].quantity) != 0 && pocket->itemSlots[i].itemId > pocket->itemSlots[j].itemId))\n                SwapItemSlots(&pocket->itemSlots[i], &pocket->itemSlots[j]);\n        }\n    }\n}\n\nu16 BagGetItemIdByPocketPosition(u8 pocketId, u16 slotId)\n{\n    return gBagPockets[pocketId - 1].itemSlots[slotId].itemId;\n}\n\nu16 BagGetQuantityByPocketPosition(u8 pocketId, u16 slotId)\n{\n    return GetBagItemQuantity(&gBagPockets[pocketId - 1].itemSlots[slotId].quantity);\n}\n\nu16 BagGetQuantityByItemId(u16 itemId)\n{\n    u32 i;\n    struct BagPocket * pocket = &gBagPockets[ItemId_GetPocket(itemId) - 1];\n\n    for (i = 0; i < pocket->capacity; i++)\n    {\n        if (pocket->itemSlots[i].itemId == itemId)\n            return GetBagItemQuantity(&pocket->itemSlots[i].quantity);\n    }\n\n    return 0;\n}\n\nvoid TrySetObtainedItemQuestLogEvent(u16 itemId)\n{\n    // Only some key items trigger this event\n    if (itemId == ITEM_OAKS_PARCEL\n     || itemId == ITEM_POKE_FLUTE\n     || itemId == ITEM_SECRET_KEY\n     || itemId == ITEM_BIKE_VOUCHER\n     || itemId == ITEM_GOLD_TEETH\n     || itemId == ITEM_OLD_AMBER\n     || itemId == ITEM_CARD_KEY\n     || itemId == ITEM_LIFT_KEY\n     || itemId == ITEM_HELIX_FOSSIL\n     || itemId == ITEM_DOME_FOSSIL\n     || itemId == ITEM_SILPH_SCOPE\n     || itemId == ITEM_BICYCLE\n     || itemId == ITEM_TOWN_MAP\n     || itemId == ITEM_VS_SEEKER\n     || itemId == ITEM_TEACHY_TV\n     || itemId == ITEM_RAINBOW_PASS\n     || itemId == ITEM_TEA\n     || itemId == ITEM_POWDER_JAR\n     || itemId == ITEM_RUBY\n     || itemId == ITEM_SAPPHIRE)\n    {\n        if (itemId != ITEM_TOWN_MAP || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_RIVALS_HOUSE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_RIVALS_HOUSE)))\n        {\n            struct QuestLogEvent_StoryItem * data = malloc(sizeof(*data));\n            data->itemId = itemId;\n            data->mapSec = gMapHeader.regionMapSectionId;\n            SetQuestLogEvent(QL_EVENT_OBTAINED_STORY_ITEM, (const u16 *)data);\n            free(data);\n        }\n    }\n}\n\nu16 SanitizeItemId(u16 itemId)\n{\n    if (itemId >= ITEMS_COUNT)\n        return ITEM_NONE;\n    return itemId;\n}\n\nconst u8 * ItemId_GetName(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].name;\n}\n\n// Unused\nu16 ItemId_GetId(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].itemId;\n}\n\nu16 ItemId_GetPrice(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].price;\n}\n\nu8 ItemId_GetHoldEffect(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].holdEffect;\n}\n\nu8 ItemId_GetHoldEffectParam(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].holdEffectParam;\n}\n\nconst u8 * ItemId_GetDescription(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].description;\n}\n\nu8 ItemId_GetImportance(u16 itemId)\n{\n    if(SanitizeItemId(itemId) >= ITEM_TM01 && SanitizeItemId(itemId) <= ITEM_TM50)\n        return TRUE;\n    return gItems[SanitizeItemId(itemId)].importance;\n}\n\n// Unused\nu8 ItemId_GetRegistrability(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].registrability;\n}\n\nu8 ItemId_GetPocket(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].pocket;\n}\n\nu8 ItemId_GetType(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].type;\n}\n\nItemUseFunc ItemId_GetFieldFunc(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].fieldUseFunc;\n}\n\nbool8 ItemId_GetBattleUsage(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].battleUsage;\n}\n\nItemUseFunc ItemId_GetBattleFunc(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].battleUseFunc;\n}\n\nu8 ItemId_GetSecondaryId(u16 itemId)\n{\n    return gItems[SanitizeItemId(itemId)].secondaryId;\n}\n\nbool8 CheckAssetsForSoftlock(void)\n{\n    u32 money = GetMoney(&gSaveBlock1Ptr->money);\n    u32 i;\n    u32 pocket;\n    u32 itemWorth;\n    u32 maxU32 = 4294967295U;\n    if(money >= 200)\n        return FALSE;\n\n    for(pocket = POCKET_ITEMS - 1; pocket < POCKET_BERRY_POUCH; pocket++)\n    {\n        if(pocket == (POCKET_KEY_ITEMS - 1) || pocket == (POCKET_TM_CASE - 1)) //skip KEY_ITEMS and TM_CASE\n            continue;\n        for(i = 0; i < gBagPockets[pocket].capacity && gBagPockets[pocket].itemSlots[i].itemId != ITEM_NONE; i++)\n        {\n            itemWorth = ((ItemId_GetPrice(gBagPockets[pocket].itemSlots[i].itemId) / 2) * GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity));\n            if(money > 0)\n            {\n                if(itemWorth > (maxU32 - money)) //checking for overflow\n                    return FALSE;   //overflowed, so have enough money    \n            }\n            money = money + itemWorth;\n            if(money >= 200)\n                return FALSE;\n        }\n    }\n    return TRUE;\n}"
  },
  {
    "path": "src/item_menu.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"bag.h\"\n#include \"battle_controllers.h\"\n#include \"berry_pouch.h\"\n#include \"decompress.h\"\n#include \"event_scripts.h\"\n#include \"event_object_movement.h\"\n#include \"field_player_avatar.h\"\n#include \"graphics.h\"\n#include \"help_system.h\"\n#include \"item.h\"\n#include \"item_menu.h\"\n#include \"item_menu_icons.h\"\n#include \"item_use.h\"\n#include \"link.h\"\n#include \"list_menu.h\"\n#include \"load_save.h\"\n#include \"mail_data.h\"\n#include \"map_name_popup.h\"\n#include \"menu.h\"\n#include \"menu_indicators.h\"\n#include \"money.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"pokemon_storage_system.h\"\n#include \"scanline_effect.h\"\n#include \"script.h\"\n#include \"shop.h\"\n#include \"strings.h\"\n#include \"string_util.h\"\n#include \"teachy_tv.h\"\n#include \"tm_case.h\"\n#include \"constants/items.h\"\n#include \"constants/songs.h\"\n#include \"constants/quest_log.h\"\n\nvoid BagMenu_Print(u8, u8, const u8*, u8, u8, u8, u8, u8, u8);\n\n#define FREE_IF_SET(ptr) ({ if (ptr) Free(ptr); })\n\nstruct BagMenuAlloc\n{\n    MainCallback exitCB;\n    u8 itemOriginalLocation;\n    u8 pocketSwitchMode:4;\n    u8 itemMenuIcon:2;\n    u8 inhibitItemDescriptionPrint:2;\n    u16 contextMenuSelectedItem;\n    u8 pocketScrollArrowsTask;\n    u8 pocketSwitchArrowsTask;\n    u8 nItems[5];\n    u8 maxShowed[5];\n    u8 data[4];\n};\n\nstruct BagSlots\n{\n    struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT];\n    struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT];\n    struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT];\n    struct ItemSlot bagPocket_Medicine[BAG_MEDICINE_COUNT];\n    struct ItemSlot bagPocket_HoldItems[BAG_HELD_ITEMS_COUNT];\n    u16 itemsAbove[5];\n    u16 cursorPos[5];\n    u16 registeredItem;\n    s16 pocket;\n};\n\nEWRAM_DATA struct BagStruct gBagMenuState = {};\nstatic EWRAM_DATA struct BagMenuAlloc * sBagMenuDisplay = NULL;\nstatic EWRAM_DATA void *sBagBgTilemapBuffer = NULL;\nstatic EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL;\nstatic EWRAM_DATA u8 (*sListMenuItemStrings)[19] = NULL;\nstatic EWRAM_DATA u8 sContextMenuItemsBuffer[4] = {};\nstatic EWRAM_DATA const u8 *sContextMenuItemsPtr = NULL;\nstatic EWRAM_DATA u8 sContextMenuNumItems = 0;\nstatic EWRAM_DATA struct BagSlots * sBackupPlayerBag = NULL;\nEWRAM_DATA u16 gSpecialVar_ItemId = ITEM_NONE;\n\nstatic void CB2_OpenBagMenu(void);\nstatic bool8 LoadBagMenuGraphics(void);\nstatic void FadeOutOfBagMenu(void);\nstatic void Task_WaitFadeOutOfBagMenu(u8 taskId);\nstatic void NullBagMenuBufferPtrs(void);\nstatic bool8 BagMenuInitBgsAndAllocTilemapBuffer(void);\nstatic bool8 DoLoadBagGraphics(void);\nstatic u8 CreateBagInputHandlerTask(u8 location);\nstatic bool8 TryAllocListMenuBuffers(void);\nstatic void Bag_BuildListMenuTemplate(u8 pocket);\nstatic void BagListMenuGetItemNameColored(u8 *dest, u16 itemId);\nstatic void BagListMenuMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list);\nstatic void BagListMenuItemPrintFunc(u8 windowId, u32 itemId, u8 y);\nstatic void bag_menu_print_cursor(u8 y, u8 colorIdx);\nstatic void PrintBagPocketName(void);\nstatic void PrintItemDescriptionOnMessageWindow(s32 itemIndex);\nstatic void CreatePocketScrollArrowPair(void);\nstatic void CreatePocketSwitchArrowPair(void);\nstatic void BagDestroyPocketSwitchArrowPair(void);\nstatic void CalculateInitialCursorPosAndItemsAbove(void);\nstatic void UpdatePocketScrollPositions(void);\nstatic void DestroyBagMenuResources(void);\nstatic void Task_ItemMenu_WaitFadeAndSwitchToExitCallback(u8 taskId);\nstatic void Task_AnimateWin0v(u8 taskId);\nstatic void ShowBagOrBeginWin0OpenTask(void);\nstatic void All_CalculateNItemsAndMaxShowed(void);\nstatic void Task_BagMenu_HandleInput(u8 taskId);\nstatic void Task_ItemContextMenuByLocation(u8 taskId);\nstatic void Bag_FillMessageBoxWithPalette(u32 a0);\nstatic u8 ProcessPocketSwitchInput(u8 taskId, s16 pocketId);\nstatic void SwitchPockets(u8 taskId, s16 direction, bool16 a2);\nstatic void Task_AnimateSwitchPockets(u8 taskId);\nstatic void BeginMovingItemInPocket(u8 taskId, s16 itemIndex);\nstatic void Task_MoveItemInPocket_HandleInput(u8 taskId);\nstatic void ExecuteMoveItemInPocket(u8 taskId, u32 itemIndex);\nstatic void AbortMovingItemInPocket(u8 taskId, u32 itemIndex);\nstatic void DrawItemListRow(u8 row);\nstatic void Task_ItemContext_FieldOrBattle(u8 taskId);\nstatic void Task_FieldItemContextMenuHandleInput(u8 taskId);\nstatic void Task_ItemMenuAction_Use(u8 taskId);\nstatic void Task_ItemMenuAction_Toss(u8 taskId);\nstatic void Task_ConfirmTossItems(u8 taskId);\nstatic void Task_TossItem_No(u8 taskId);\nstatic void Task_SelectQuantityToToss(u8 taskId);\nstatic void Task_TossItem_Yes(u8 taskId);\nstatic void Task_WaitAB_RedrawAndReturnToBag(u8 taskId);\nstatic void Task_ItemMenuAction_ToggleSelect(u8 taskId);\nstatic void Task_ItemMenuAction_Give(u8 taskId);\nstatic void Task_PrintThereIsNoPokemon(u8 taskId);\nstatic void Task_ItemMenuAction_Cancel(u8 taskId);\nstatic void Task_PrintItemCantBeHeld(u8 taskId);\nstatic void Task_WaitAButtonAndCloseContextMenu(u8 taskId);\nstatic void Task_ItemMenuAction_BattleUse(u8 taskId);\nstatic void Task_ItemContext_FieldGive(u8 taskId);\nstatic void GoToTMCase_Give(void);\nstatic void GoToBerryPouch_Give(void);\nstatic void ReturnToBagMenuFromSubmenu_Give(void);\nstatic void Task_ItemContext_PcBoxGive(u8 taskId);\nstatic void GoToTMCase_PCBox(void);\nstatic void GoToBerryPouch_PCBox(void);\nstatic void ReturnToBagMenuFromSubmenu_PCBox(void);\nstatic void Task_ItemContext_Sell(u8 taskId);\nstatic void GoToTMCase_Sell(void);\nstatic void GoToBerryPouch_Sell(void);\nstatic void ReturnToBagMenuFromSubmenu_Sell(void);\nstatic void Task_PrintSaleConfirmationText(u8 taskId);\nstatic void Task_ShowSellYesNoMenu(u8 taskId);\nstatic void Task_SellItem_No(u8 taskId);\nstatic void Task_InitSaleQuantitySelectInterface(u8 taskId);\nstatic void UpdateSalePriceDisplay(s32 price);\nstatic void Task_SelectQuantityToSell(u8 taskId);\nstatic void Task_SellItem_Yes(u8 taskId);\nstatic void Task_FinalizeSaleToShop(u8 taskId);\nstatic void Task_WaitPressAB_AfterSell(u8 taskId);\nstatic void Task_ItemContext_Deposit(u8 taskId);\nstatic void Task_SelectQuantityToDeposit(u8 taskId);\nstatic void Task_TryDoItemDeposit(u8 taskId);\nstatic bool8 BagIsTutorial(void);\nstatic void Task_Bag_OldManTutorial(u8 taskId);\nstatic void Task_Pokedude_FadeFromBag(u8 taskId);\nstatic void Task_Pokedude_WaitFadeAndExitBag(u8 taskId);\nstatic void Task_Bag_TeachyTvRegister(u8 taskId);\nstatic void Task_Bag_TeachyTvCatching(u8 taskId);\nstatic void Task_Bag_TeachyTvStatus(u8 taskId);\nstatic void Task_Bag_TeachyTvTMs(u8 taskId);\n\n//bag sort\nstatic void Task_LoadBagSortOptions(u8 taskId);\nstatic void ItemMenu_SortByName(u8 taskId);\nstatic void ItemMenu_SortByType(u8 taskId);\nstatic void ItemMenu_SortByAmount(u8 taskId);\nstatic void ItemMenu_SortByNumber(u8 taskId);\nstatic void SortBagItems(u8 taskId);\nstatic void Task_SortFinish(u8 taskId);\nstatic void SortItemsInBag(u8 pocket, u8 type);\nstatic void MergeSort(struct ItemSlot* array, u32 low, u32 high, s8 (*comparator)(struct ItemSlot*, struct ItemSlot*));\nstatic void Merge(struct ItemSlot* array, u32 low, u32 mid, u32 high, s8 (*comparator)(struct ItemSlot*, struct ItemSlot*));\nstatic s8 CompareItemsAlphabetically(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2);\nstatic s8 CompareItemsByMost(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2);\nstatic s8 CompareItemsByType(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2);\nstatic s8 CompareItemsById(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2);\n\nstatic const struct BgTemplate sBgTemplates[2] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    }\n};\n\nstatic const u8 *const sPocketNames[] = {\n    gText_Items2,\n    gText_Medicine,\n    gText_KeyItems2,\n    gText_HeldItems,\n    gText_PokeBalls2\n};\n\n#define LIST_TILES_WIDTH  18\n#define LIST_TILES_HEIGHT 12\n\nstatic const u16 sItemListTilemap[LIST_TILES_WIDTH * LIST_TILES_HEIGHT] = INCBIN_U16(\"graphics/item_menu/list.bin\");\n\nstatic const u8 sMenuText_ByName[] = _(\"NAME\");\nstatic const u8 sMenuText_ByType[] = _(\"TYPE\");\nstatic const u8 sMenuText_ByAmount[] = _(\"AMOUNT\");\nstatic const u8 sMenuText_ByNumber[] = _(\"NUMBER\");\nstatic const u8 sText_NothingToSort[] = _(\"There's nothing to sort!\");\n\nstatic const struct MenuAction sItemMenuContextActions[] = {\n    [ITEMMENUACTION_USE] =          {gOtherText_Use, {.void_u8 = Task_ItemMenuAction_Use}},\n    [ITEMMENUACTION_TOSS] =         {gOtherText_Toss, {.void_u8 = Task_ItemMenuAction_Toss}},\n    [ITEMMENUACTION_REGISTER] =     {gOtherText_Register, {.void_u8 = Task_ItemMenuAction_ToggleSelect}},\n    [ITEMMENUACTION_GIVE] =         {gOtherText_Give, {.void_u8 = Task_ItemMenuAction_Give}},\n    [ITEMMENUACTION_CANCEL] =       {gFameCheckerText_Cancel, {.void_u8 = Task_ItemMenuAction_Cancel}},\n    [ITEMMENUACTION_BATTLE_USE] =   {gOtherText_Use, {.void_u8 = Task_ItemMenuAction_BattleUse}},\n    [ITEMMENUACTION_CHECK] =        {gOtherText_Check, {.void_u8 = Task_ItemMenuAction_Use}},\n    [ITEMMENUACTION_OPEN] =         {gOtherText_Open, {.void_u8 = Task_ItemMenuAction_Use}},\n    [ITEMMENUACTION_OPEN_BERRIES] = {gOtherText_Open, {.void_u8 = Task_ItemMenuAction_BattleUse}},\n    [ITEMMENUACTION_WALK] =         {gOtherText_Walk, {.void_u8 = Task_ItemMenuAction_Use}},\n    [ITEMMENUACTION_DESELECT] =     {gOtherText_Deselect, {.void_u8 = Task_ItemMenuAction_ToggleSelect}},\n    [ITEMMENUACTION_BY_NAME] =      {sMenuText_ByName, ItemMenu_SortByName},\n    [ITEMMENUACTION_BY_TYPE] =      {sMenuText_ByType, ItemMenu_SortByType},\n    [ITEMMENUACTION_BY_AMOUNT] =    {sMenuText_ByAmount, ItemMenu_SortByAmount},\n    [ITEMMENUACTION_BY_NUMBER] =    {sMenuText_ByNumber, ItemMenu_SortByNumber},\n    [ITEMMENUACTION_DUMMY] =        {gString_Dummy, {.void_u8 = NULL}}\n};\n\nstatic const u8 sContextMenuItems_Field[][4] = {\n    {\n        ITEMMENUACTION_USE,\n        ITEMMENUACTION_GIVE,\n        ITEMMENUACTION_TOSS,\n        ITEMMENUACTION_CANCEL\n    }, {\n        ITEMMENUACTION_USE,\n        ITEMMENUACTION_GIVE,\n        ITEMMENUACTION_TOSS,\n        ITEMMENUACTION_CANCEL\n    }, {\n        ITEMMENUACTION_USE,\n        ITEMMENUACTION_REGISTER,\n        ITEMMENUACTION_CANCEL,\n        ITEMMENUACTION_DUMMY\n    }, {\n        ITEMMENUACTION_GIVE,\n        ITEMMENUACTION_TOSS,\n        ITEMMENUACTION_CANCEL,\n        ITEMMENUACTION_DUMMY\n    }, {\n        ITEMMENUACTION_GIVE,\n        ITEMMENUACTION_TOSS,\n        ITEMMENUACTION_CANCEL,\n        ITEMMENUACTION_DUMMY\n    }\n};\n\nstatic const u8 sContextMenuItems_CheckGiveTossCancel[] = {\n    ITEMMENUACTION_CHECK,\n    ITEMMENUACTION_GIVE,\n    ITEMMENUACTION_TOSS,\n    ITEMMENUACTION_CANCEL\n};\n\nstatic const u8 sContextMenuItems_GiveIfNotKeyItemPocket[][2] = {\n    {\n        ITEMMENUACTION_GIVE,\n        ITEMMENUACTION_CANCEL\n    }, {\n        ITEMMENUACTION_CANCEL,\n        ITEMMENUACTION_DUMMY\n    }, {\n        ITEMMENUACTION_GIVE,\n        ITEMMENUACTION_CANCEL\n    }\n};\n\nstatic const u8 sContextMenuItems_Open[] = {\n    ITEMMENUACTION_OPEN,\n    ITEMMENUACTION_CANCEL\n};\n\nstatic const u8 sContextMenuItems_BattleUse[] = {\n    ITEMMENUACTION_BATTLE_USE,\n    ITEMMENUACTION_CANCEL\n};\n\nstatic const u8 sContextMenuItems_Cancel[] = {\n    ITEMMENUACTION_CANCEL,\n    ITEMMENUACTION_DUMMY\n};\n\nstatic const TaskFunc sItemContextTaskFuncs[] = {\n    [ITEMMENULOCATION_FIELD]  = Task_ItemContext_FieldOrBattle,\n    [ITEMMENULOCATION_PARTY]  = Task_ItemContext_FieldGive,\n    [ITEMMENULOCATION_SHOP]   = Task_ItemContext_Sell,\n    [ITEMMENULOCATION_ITEMPC] = Task_ItemContext_Deposit,\n    [ITEMMENULOCATION_PCBOX]  = Task_ItemContext_PcBoxGive,\n    [ITEMMENULOCATION_BATTLE] = Task_ItemContext_FieldOrBattle,\n    [ITEMMENULOCATION_OLD_MAN] = NULL\n};\n\nstatic const struct YesNoFuncTable sYesNoMenu_Toss = {\n    Task_TossItem_Yes,\n    Task_TossItem_No\n};\n\nstatic const struct YesNoFuncTable sYesNoMenu_Sell = {\n    Task_SellItem_Yes,\n    Task_SellItem_No\n};\n\nstatic const u8 sListItemTextColor_RegularItem[] = _(\"{COLOR_HIGHLIGHT_SHADOW DARK_GRAY TRANSPARENT LIGHT_GRAY}\");\n\nstatic const u8 sListItemTextColor_TmCase_BerryPouch[] = _(\"{COLOR_HIGHLIGHT_SHADOW BLUE TRANSPARENT LIGHT_BLUE}\");\n\nstatic const struct ScrollArrowsTemplate sPocketSwitchArrowPairTemplate = {\n    .firstArrowType = SCROLL_ARROW_LEFT,\n    .firstX = 8,\n    .firstY = 72,\n    .secondArrowType = SCROLL_ARROW_RIGHT,\n    .secondX = 72,\n    .secondY = 72,\n    .fullyUpThreshold = -1,\n    .fullyDownThreshold = -1,\n    .tileTag = 111,\n    .palTag = 111,\n    .palNum = 0,\n};\n\nstatic const u8 sBlit_SelectButton[] = INCBIN_U8(\"graphics/interface/select_button.4bpp\");\n\n#define tSwitchDir     data[11]\n#define tSwitchCounter data[12]\n#define tSwitchState   data[13]\n\nvoid GoToBagMenu(u8 location, u8 pocket, MainCallback bagCallback)\n{\n    u32 i;\n\n    NullBagMenuBufferPtrs();\n    sBagMenuDisplay = Alloc(sizeof(struct BagMenuAlloc));\n    if (sBagMenuDisplay == NULL)\n        SetMainCallback2(bagCallback);\n    else\n    {\n        if (location != ITEMMENULOCATION_LAST)\n            gBagMenuState.location = location;\n        if (bagCallback != NULL)\n            gBagMenuState.bagCallback = bagCallback;\n        sBagMenuDisplay->exitCB = NULL;\n        sBagMenuDisplay->itemOriginalLocation = 0xFF;\n        sBagMenuDisplay->itemMenuIcon = 0;\n        sBagMenuDisplay->inhibitItemDescriptionPrint = FALSE;\n        sBagMenuDisplay->pocketScrollArrowsTask = TASK_NONE;\n        sBagMenuDisplay->pocketSwitchArrowsTask = TASK_NONE;\n        if (location == ITEMMENULOCATION_ITEMPC)\n            sBagMenuDisplay->pocketSwitchMode = 1;\n        else if (location == ITEMMENULOCATION_OLD_MAN)\n            sBagMenuDisplay->pocketSwitchMode = 2;\n        else\n            sBagMenuDisplay->pocketSwitchMode = 0;\n        for (i = 0; i < 4; i++)\n        {\n            sBagMenuDisplay->data[i] = 0;\n        }\n        if (pocket == OPEN_BAG_ITEMS || pocket == OPEN_BAG_KEYITEMS || pocket == OPEN_BAG_POKEBALLS)\n            gBagMenuState.pocket = pocket;\n        gTextFlags.autoScroll = FALSE;\n        gSpecialVar_ItemId = ITEM_NONE;\n        SetMainCallback2(CB2_OpenBagMenu);\n    }\n}\n\nvoid CB2_BagMenuFromStartMenu(void)\n{\n    GoToBagMenu(ITEMMENULOCATION_FIELD, OPEN_BAG_LAST, CB2_ReturnToFieldWithOpenMenu);\n}\n\nvoid CB2_BagMenuFromBattle(void)\n{\n    GoToBagMenu(ITEMMENULOCATION_BATTLE, OPEN_BAG_LAST, SetCB2ToReshowScreenAfterMenu2);\n}\n\nstatic void CB2_BagMenuRun(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    DoScheduledBgTilemapCopiesToVram();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB_BagMenuRun(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void CB2_OpenBagMenu(void)\n{\n    while (1)\n    {\n        if (IsActiveOverworldLinkBusy() == TRUE)\n            break;\n        if (LoadBagMenuGraphics() == TRUE)\n            break;\n        if (MenuHelpers_IsLinkActive() == TRUE)\n            break;\n    }\n}\n\nstatic bool8 LoadBagMenuGraphics(void)\n{\n    u8 taskId;\n\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankHBlankCallbacksToNull();\n        ClearScheduledBgCopiesToVram();\n        gMain.state++;\n        break;\n    case 1:\n        ScanlineEffect_Stop();\n        gMain.state++;\n        break;\n    case 2:\n        FreeAllSpritePalettes();\n        gMain.state++;\n        break;\n    case 3:\n        ResetPaletteFade();\n        gPaletteFade.bufferTransferDisabled = TRUE;\n        gMain.state++;\n        break;\n    case 4:\n        ResetSpriteData();\n        gMain.state++;\n        break;\n    case 5:\n        ResetItemMenuIconState();\n        gMain.state++;\n        break;\n    case 6:\n        if (!MenuHelpers_IsLinkActive())\n        {\n            ResetTasks();\n        }\n        gMain.state++;\n        break;\n    case 7:\n        if (BagMenuInitBgsAndAllocTilemapBuffer())\n        {\n            sBagMenuDisplay->data[0] = 0;\n            gMain.state++;\n        }\n        else\n        {\n            FadeOutOfBagMenu();\n            return TRUE;\n        }\n        break;\n    case 8:\n        if (DoLoadBagGraphics() == TRUE)\n            gMain.state++;\n        break;\n    case 9:\n        InitBagWindows();\n        gMain.state++;\n        break;\n    case 10:\n        All_CalculateNItemsAndMaxShowed();\n        CalculateInitialCursorPosAndItemsAbove();\n        UpdatePocketScrollPositions();\n        gMain.state++;\n        break;\n    case 11:\n        if (!TryAllocListMenuBuffers())\n        {\n            FadeOutOfBagMenu();\n            return TRUE;\n        }\n        gMain.state++;\n        break;\n    case 12:\n        Bag_BuildListMenuTemplate(gBagMenuState.pocket);\n        gMain.state++;\n        break;\n    case 13:\n        if (gBagMenuState.location != ITEMMENULOCATION_ITEMPC)\n            PrintBagPocketName();\n        else\n            BagDrawDepositItemTextBox();\n        gMain.state++;\n        break;\n    case 14:\n        taskId = CreateBagInputHandlerTask(gBagMenuState.location);\n        gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n        gTasks[taskId].data[3] = 0;\n        gTasks[taskId].data[8] = 0;\n        gMain.state++;\n        break;\n    case 15:\n        CreateBagSprite(gBagMenuState.pocket);\n        gMain.state++;\n        break;\n    case 16:\n        CreatePocketScrollArrowPair();\n        CreatePocketSwitchArrowPair();\n        gMain.state++;\n        break;\n    case 17:\n        CreateSwapLine();\n        gMain.state++;\n        break;\n    case 18:\n        ShowBagOrBeginWin0OpenTask();\n        gMain.state++;\n        break;\n    case 19:\n        if (gBagMenuState.location == ITEMMENULOCATION_ITEMPC)\n            SetHelpContext(HELPCONTEXT_PLAYERS_PC_ITEMS);\n        else\n            SetHelpContext(HELPCONTEXT_BAG);\n        gPaletteFade.bufferTransferDisabled = FALSE;\n        gMain.state++;\n        break;\n    default:\n        SetVBlankCallback(VBlankCB_BagMenuRun);\n        SetMainCallback2(CB2_BagMenuRun);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void FadeOutOfBagMenu(void)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK);\n    CreateTask(Task_WaitFadeOutOfBagMenu, 0);\n    SetVBlankCallback(VBlankCB_BagMenuRun);\n    SetMainCallback2(CB2_BagMenuRun);\n}\n\nstatic void Task_WaitFadeOutOfBagMenu(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        SetMainCallback2(gBagMenuState.bagCallback);\n        DestroyBagMenuResources();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void NullBagMenuBufferPtrs(void)\n{\n    sBagMenuDisplay = NULL;\n    sBagBgTilemapBuffer = NULL;\n    sListMenuItems = NULL;\n    sListMenuItemStrings = NULL;\n}\n\nstatic bool8 BagMenuInitBgsAndAllocTilemapBuffer(void)\n{\n    void **buff;\n    ResetAllBgsCoordinatesAndBgCntRegs();\n    buff = &sBagBgTilemapBuffer;\n    *buff = Alloc(0x800);\n    if (*buff == NULL)\n        return FALSE;\n    memset(*buff, 0, 0x800);\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));\n    SetBgTilemapBuffer(1, *buff);\n    ScheduleBgCopyTilemapToVram(1);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON);\n    ShowBg(0);\n    ShowBg(1);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    return TRUE;\n}\n\nstatic bool8 DoLoadBagGraphics(void)\n{\n    switch (sBagMenuDisplay->data[0])\n    {\n    case 0:\n        ResetTempTileDataBuffers();\n        DecompressAndCopyTileDataToVram(1, gBagBg_Gfx, 0, 0, 0);\n        sBagMenuDisplay->data[0]++;\n        break;\n    case 1:\n        if (FreeTempTileDataBuffersIfPossible() != TRUE)\n        {\n            if (gBagMenuState.location != ITEMMENULOCATION_ITEMPC)\n                LZDecompressWram(gBagBg_Tilemap, sBagBgTilemapBuffer);\n            else\n                LZDecompressWram(gBagBg_ItemPC_Tilemap, sBagBgTilemapBuffer);\n            sBagMenuDisplay->data[0]++;\n        }\n        break;\n    case 2:\n        LoadCompressedPalette(gBagBgPalette, BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP);\n        if (!BagIsTutorial() && gSaveBlock2Ptr->playerGender != MALE)\n            LoadCompressedPalette(gBagBgPalette_FemaleOverride, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n        sBagMenuDisplay->data[0]++;\n        break;\n    case 3:\n        if (BagIsTutorial() == TRUE || gSaveBlock2Ptr->playerGender == MALE)\n            LoadCompressedSpriteSheet(&gSpriteSheet_BagMale);\n        else\n            LoadCompressedSpriteSheet(&gSpriteSheet_BagFemale);\n        sBagMenuDisplay->data[0]++;\n        break;\n    case 4:\n        LoadCompressedSpritePalette(&gSpritePalette_Bag);\n        sBagMenuDisplay->data[0]++;\n        break;\n    case 5:\n        LoadCompressedSpriteSheet(&gBagSwapSpriteSheet);\n        sBagMenuDisplay->data[0]++;\n        break;\n    default:\n        LoadCompressedSpritePalette(&gBagSwapSpritePalette);\n        sBagMenuDisplay->data[0] = 0;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic u8 CreateBagInputHandlerTask(u8 location)\n{\n    switch (location)\n    {\n    case ITEMMENULOCATION_OLD_MAN:\n        return CreateTask(Task_Bag_OldManTutorial, 0);\n    case ITEMMENULOCATION_TTVSCR_REGISTER:\n        return CreateTask(Task_Bag_TeachyTvRegister, 0);\n    case ITEMMENULOCATION_TTVSCR_TMS:\n        return CreateTask(Task_Bag_TeachyTvTMs, 0);\n    case ITEMMENULOCATION_TTVSCR_STATUS:\n        return CreateTask(Task_Bag_TeachyTvStatus, 0);\n    case ITEMMENULOCATION_TTVSCR_CATCHING:\n        return CreateTask(Task_Bag_TeachyTvCatching, 0);\n    default:\n        return CreateTask(Task_BagMenu_HandleInput, 0);\n    }\n}\n\nstatic bool8 TryAllocListMenuBuffers(void)\n{\n    // The items pocket has the highest capacity, + 1 for CANCEL\n    sListMenuItems = Alloc((BAG_HELD_ITEMS_COUNT + 1) * sizeof(struct ListMenuItem));\n    if (sListMenuItems == NULL)\n        return FALSE;\n    sListMenuItemStrings = Alloc((BAG_HELD_ITEMS_COUNT + 1) * sizeof(*sListMenuItemStrings));\n    if (sListMenuItemStrings == NULL)\n        return FALSE;\n    return TRUE;\n}\n\nstatic void Bag_BuildListMenuTemplate(u8 pocket)\n{\n    u32 i;\n    struct BagPocket * bagPocket = &gBagPockets[pocket];\n    for (i = 0; i < sBagMenuDisplay->nItems[pocket]; i++)\n    {\n        BagListMenuGetItemNameColored(sListMenuItemStrings[i], bagPocket->itemSlots[i].itemId);\n        sListMenuItems[i].label = sListMenuItemStrings[i];\n        sListMenuItems[i].index = i;\n    }\n    StringCopy(sListMenuItemStrings[i], sListItemTextColor_RegularItem);\n    StringAppend(sListMenuItemStrings[i], gFameCheckerText_Cancel);\n    sListMenuItems[i].label = sListMenuItemStrings[i];\n    sListMenuItems[i].index = i;\n    gMultiuseListMenuTemplate.items = sListMenuItems;\n    gMultiuseListMenuTemplate.totalItems = sBagMenuDisplay->nItems[pocket] + 1;\n    gMultiuseListMenuTemplate.windowId = 0;\n    gMultiuseListMenuTemplate.header_X = 0;\n    gMultiuseListMenuTemplate.item_X = 9;\n    gMultiuseListMenuTemplate.cursor_X = 1;\n    gMultiuseListMenuTemplate.lettersSpacing = 0;\n    gMultiuseListMenuTemplate.itemVerticalPadding = 2;\n    gMultiuseListMenuTemplate.upText_Y = 2;\n    gMultiuseListMenuTemplate.maxShowed = sBagMenuDisplay->maxShowed[pocket];\n    gMultiuseListMenuTemplate.fontId = FONT_NORMAL;\n    gMultiuseListMenuTemplate.cursorPal = 2;\n    gMultiuseListMenuTemplate.fillValue = 0;\n    gMultiuseListMenuTemplate.cursorShadowPal = 3;\n    gMultiuseListMenuTemplate.moveCursorFunc = BagListMenuMoveCursorFunc;\n    gMultiuseListMenuTemplate.itemPrintFunc = BagListMenuItemPrintFunc;\n    gMultiuseListMenuTemplate.cursorKind = 0;\n    gMultiuseListMenuTemplate.scrollMultiple = 0;\n}\n\nstatic void BagListMenuGetItemNameColored(u8 *dest, u16 itemId)\n{\n    if (itemId == ITEM_TM_CASE || itemId == ITEM_BERRY_POUCH)\n        StringCopy(dest, sListItemTextColor_TmCase_BerryPouch);\n    else\n        StringCopy(dest, sListItemTextColor_RegularItem);\n    StringAppend(dest, ItemId_GetName(itemId));\n}\n\nstatic void BagListMenuMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)\n{\n    if (onInit != TRUE)\n    {\n        PlaySE(SE_BAG_CURSOR);\n        ShakeBagSprite();\n    }\n    if (sBagMenuDisplay->itemOriginalLocation == 0xFF)\n    {\n        DestroyItemMenuIcon(sBagMenuDisplay->itemMenuIcon ^ 1);\n        if (sBagMenuDisplay->nItems[gBagMenuState.pocket] != itemIndex)\n            CreateItemMenuIcon(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, itemIndex), sBagMenuDisplay->itemMenuIcon);\n        else\n            CreateItemMenuIcon(ITEMS_COUNT, sBagMenuDisplay->itemMenuIcon);\n        sBagMenuDisplay->itemMenuIcon ^= 1;\n        if (!sBagMenuDisplay->inhibitItemDescriptionPrint)\n            PrintItemDescriptionOnMessageWindow(itemIndex);\n    }\n}\n\nstatic void BagListMenuItemPrintFunc(u8 windowId, u32 itemId, u8 y)\n{\n    u16 bagItemId;\n    u16 bagItemQuantity;\n    if (sBagMenuDisplay->itemOriginalLocation != 0xFF)\n    {\n        if (sBagMenuDisplay->itemOriginalLocation == (u8)itemId)\n            bag_menu_print_cursor(y, 2);\n        else\n            bag_menu_print_cursor(y, 0xFF);\n    }\n    if (itemId != -2 && sBagMenuDisplay->nItems[gBagMenuState.pocket] != itemId)\n    {\n        bagItemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, itemId);\n        bagItemQuantity = BagGetQuantityByPocketPosition(gBagMenuState.pocket + 1, itemId);\n        if (gBagMenuState.pocket != POCKET_KEY_ITEMS - 1 && ItemId_GetImportance(bagItemId) == 0)\n        {\n            ConvertIntToDecimalStringN(gStringVar1, bagItemQuantity, STR_CONV_MODE_RIGHT_ALIGN, 3);\n            StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n            BagPrintTextOnWindow(windowId, FONT_SMALL, gStringVar4, 0x6e, y, 0, 0, 0xFF, 1);\n        }\n        else if (gSaveBlock1Ptr->registeredItem != ITEM_NONE && gSaveBlock1Ptr->registeredItem == bagItemId)\n        {\n            BlitBitmapToWindow(windowId, sBlit_SelectButton, 0x70, y, 0x18, 0x10);\n        }\n    }\n}\n\nstatic void bag_menu_print_cursor_(u8 taskId, u8 colorIdx)\n{\n    bag_menu_print_cursor(ListMenuGetYCoordForPrintingArrowCursor(taskId), colorIdx);\n}\n\nstatic void bag_menu_print_cursor(u8 y, u8 colorIdx)\n{\n    if (colorIdx == 0xFF)\n    {\n        FillWindowPixelRect(0, PIXEL_FILL(0), 1, y, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), GetMenuCursorDimensionByFont(FONT_NORMAL, 1));\n    }\n    else\n    {\n        BagPrintTextOnWindow(0, FONT_NORMAL, gText_SelectorArrow2, 1, y, 0, 0, 0, colorIdx);\n    }\n}\n\nstatic void PrintBagPocketName(void)\n{\n    FillWindowPixelBuffer(2, PIXEL_FILL(0));\n    BagPrintTextOnWin1CenteredColor0(sPocketNames[gBagMenuState.pocket], gBagMenuState.pocket);\n}\n\nstatic void PrintItemDescriptionOnMessageWindow(s32 itemIndex)\n{\n    const u8 *description;\n    if (itemIndex != sBagMenuDisplay->nItems[gBagMenuState.pocket])\n        description = ItemId_GetDescription(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, itemIndex));\n    else\n        description = gText_CloseBag;\n    StringExpandPlaceholders(gStringVar4, description);\n    FillWindowPixelBuffer(1, PIXEL_FILL(0));\n    BagPrintTextOnWindow(1, FONT_NORMAL, description, 0, 3, 2, 0, 0, 0);\n}\n\nstatic void CreatePocketScrollArrowPair(void)\n{\n    sBagMenuDisplay->pocketScrollArrowsTask = AddScrollIndicatorArrowPairParameterized(\n        SCROLL_ARROW_UP,\n        160,\n        8,\n        104,\n        sBagMenuDisplay->nItems[gBagMenuState.pocket] - sBagMenuDisplay->maxShowed[gBagMenuState.pocket] + 1,\n        110,\n        110,\n        &gBagMenuState.cursorPos[gBagMenuState.pocket]\n    );\n}\n\nstatic void CreatePocketSwitchArrowPair(void)\n{\n    u16 pocketForLeftRightArrows = POCKET_KEY_ITEMS; // makes left/right scroll arrows always on.\n    if (sBagMenuDisplay->pocketSwitchMode != 1)\n    {\n        sBagMenuDisplay->pocketSwitchArrowsTask = AddScrollIndicatorArrowPair(&sPocketSwitchArrowPairTemplate, &pocketForLeftRightArrows);\n    }\n}\n\nstatic void CreatePocketScrollArrowPair_SellQuantity(void)\n{\n    sBagMenuDisplay->contextMenuSelectedItem = 1;\n    sBagMenuDisplay->pocketScrollArrowsTask = AddScrollIndicatorArrowPairParameterized(\n        SCROLL_ARROW_UP,\n        152,\n        72,\n        104,\n        2,\n        110,\n        110,\n        &sBagMenuDisplay->contextMenuSelectedItem\n    );\n}\n\nstatic void CreateArrowPair_QuantitySelect(void)\n{\n    sBagMenuDisplay->contextMenuSelectedItem = 1;\n    sBagMenuDisplay->pocketScrollArrowsTask = AddScrollIndicatorArrowPairParameterized(\n        SCROLL_ARROW_UP,\n        212,\n        120,\n        152,\n        2,\n        110,\n        110,\n        &sBagMenuDisplay->contextMenuSelectedItem\n    );\n}\n\nstatic void BagDestroyPocketScrollArrowPair(void)\n{\n    if (sBagMenuDisplay->pocketScrollArrowsTask != 0xFF)\n    {\n        RemoveScrollIndicatorArrowPair(sBagMenuDisplay->pocketScrollArrowsTask);\n        sBagMenuDisplay->pocketScrollArrowsTask = 0xFF;\n    }\n    BagDestroyPocketSwitchArrowPair();\n}\n\nstatic void BagDestroyPocketSwitchArrowPair(void)\n{\n    if (sBagMenuDisplay->pocketSwitchArrowsTask != 0xFF)\n    {\n        RemoveScrollIndicatorArrowPair(sBagMenuDisplay->pocketSwitchArrowsTask);\n        sBagMenuDisplay->pocketSwitchArrowsTask = 0xFF;\n    }\n}\n\nvoid ResetBagCursorPositions(void)\n{\n    u32 i;\n    gBagMenuState.pocket = POCKET_ITEMS - 1;\n    gBagMenuState.bagOpen = FALSE;\n    for (i = 0; i < 5; i++)\n    {\n        gBagMenuState.itemsAbove[i] = 0;\n        gBagMenuState.cursorPos[i] = 0;\n    }\n}\n\nvoid PocketCalculateInitialCursorPosAndItemsAbove(u8 pocketId)\n{\n    if (gBagMenuState.cursorPos[pocketId] != 0 && gBagMenuState.cursorPos[pocketId] + sBagMenuDisplay->maxShowed[pocketId] > sBagMenuDisplay->nItems[pocketId] + 1)\n    {\n        gBagMenuState.cursorPos[pocketId] = (sBagMenuDisplay->nItems[pocketId] + 1) - sBagMenuDisplay->maxShowed[pocketId];\n    }\n    if (gBagMenuState.cursorPos[pocketId] + gBagMenuState.itemsAbove[pocketId] >= sBagMenuDisplay->nItems[pocketId] + 1)\n    {\n        if (sBagMenuDisplay->nItems[pocketId] + 1 < 2)\n            gBagMenuState.itemsAbove[pocketId] = 0;\n        else\n            gBagMenuState.itemsAbove[pocketId] = sBagMenuDisplay->nItems[pocketId];\n    }\n}\n\nstatic void CalculateInitialCursorPosAndItemsAbove(void)\n{\n    u32 i;\n    for (i = 0; i < 5; i++)\n    {\n        PocketCalculateInitialCursorPosAndItemsAbove(i);\n    }\n}\n\nstatic void UpdatePocketScrollPositions(void)\n{\n    u32 i;\n    u32 j;\n\n    for (i = 0; i < 5; i++)\n    {\n        if (gBagMenuState.itemsAbove[i] > 3)\n        {\n            for (j = 0; j <= gBagMenuState.itemsAbove[i] - 3; gBagMenuState.itemsAbove[i]--, gBagMenuState.cursorPos[i]++, j++)\n            {\n                if (gBagMenuState.cursorPos[i] + sBagMenuDisplay->maxShowed[i] == sBagMenuDisplay->nItems[i] + 1)\n                    break;\n            }\n        }\n    }\n}\n\nstatic void DestroyBagMenuResources(void)\n{\n    FREE_IF_SET(sBagMenuDisplay);\n    FREE_IF_SET(sBagBgTilemapBuffer);\n    FREE_IF_SET(sListMenuItems);\n    FREE_IF_SET(sListMenuItemStrings);\n    FreeAllWindowBuffers();\n}\n\nvoid ItemMenu_StartFadeToExitCallback(u8 taskId)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK);\n    gTasks[taskId].func = Task_ItemMenu_WaitFadeAndSwitchToExitCallback;\n}\n\nstatic void Task_ItemMenu_WaitFadeAndSwitchToExitCallback(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active && FuncIsActiveTask(Task_AnimateWin0v) != TRUE)\n    {\n        DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n        if (sBagMenuDisplay->exitCB != NULL)\n            SetMainCallback2(sBagMenuDisplay->exitCB);\n        else\n            SetMainCallback2(gBagMenuState.bagCallback);\n        BagDestroyPocketScrollArrowPair();\n        DestroyBagMenuResources();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void ShowBagOrBeginWin0OpenTask(void)\n{\n    u16 paldata = RGB_BLACK;\n    u8 taskId;\n\n    SetBackdropFromPalette(&paldata);\n    SetGpuReg(REG_OFFSET_WININ, 0);\n    SetGpuReg(REG_OFFSET_WINOUT, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);\n    BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n    if (gBagMenuState.bagOpen == TRUE)\n    {\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH));\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 0));\n    }\n    else\n    {\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH));\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, DISPLAY_HEIGHT));\n        taskId = CreateTask(Task_AnimateWin0v, 0);\n        gTasks[taskId].data[0] = 192;\n        gTasks[taskId].data[1] = -16;\n        gBagMenuState.bagOpen = TRUE;\n    }\n}\n\nvoid Bag_BeginCloseWin0Animation(void)\n{\n\n    u8 taskId = CreateTask(Task_AnimateWin0v, 0);\n    gTasks[taskId].data[0] = -16;\n    gTasks[taskId].data[1] =  16;\n    gBagMenuState.bagOpen = FALSE;\n}\n\nvoid CB2_SetUpReshowBattleScreenAfterMenu(void)\n{\n    gBagMenuState.bagOpen = FALSE;\n}\n\nstatic void Task_AnimateWin0v(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    data[0] += data[1];\n    if (data[0] > 160)\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 160));\n    else\n        SetGpuReg(REG_OFFSET_WIN0V, data[0]);\n    if ((data[1] == 16 && data[0] == 160) || (data[1] == -16 && data[0] == 0))\n        DestroyTask(taskId);\n}\n\nvoid MoveItemSlotInList(struct ItemSlot * itemSlots_, u32 from, u32 to_)\n{\n    // dumb assignments needed to match\n    struct ItemSlot *itemSlots = itemSlots_;\n    u32 to = to_;\n\n    if (from != to)\n    {\n        s16 i, count;\n        struct ItemSlot firstSlot = itemSlots[from];\n\n        if (to > from)\n        {\n            to--;\n            for (i = from, count = to; i < count; i++)\n                itemSlots[i] = itemSlots[i + 1];\n        }\n        else\n        {\n            for (i = from, count = to; i > count; i--)\n                itemSlots[i] = itemSlots[i - 1];\n        }\n        itemSlots[to] = firstSlot;\n    }\n}\n\nvoid Pocket_CalculateNItemsAndMaxShowed(u8 pocketId)\n{\n    u32 i;\n    struct BagPocket * pocket = &gBagPockets[pocketId];\n    BagPocketCompaction(pocket->itemSlots, pocket->capacity);\n    sBagMenuDisplay->nItems[pocketId] = 0;\n    for (i = 0; i < pocket->capacity; i++)\n    {\n        if (pocket->itemSlots[i].itemId == ITEM_NONE)\n            break;\n        sBagMenuDisplay->nItems[pocketId]++;\n    }\n    if (sBagMenuDisplay->nItems[pocketId] + 1 > 6)\n        sBagMenuDisplay->maxShowed[pocketId] = 6;\n    else\n        sBagMenuDisplay->maxShowed[pocketId] = sBagMenuDisplay->nItems[pocketId] + 1;\n}\n\nstatic void All_CalculateNItemsAndMaxShowed(void)\n{\n    u32 i;\n    for (i = 0; i < 5; i++)\n        Pocket_CalculateNItemsAndMaxShowed(i);\n}\n\nvoid DisplayItemMessageInBag(u8 taskId, u8 fontId, const u8 * string, TaskFunc followUpFunc)\n{\n    s16 *data = gTasks[taskId].data;\n    data[10] = OpenBagWindow(5);\n    FillWindowPixelBuffer(data[10], PIXEL_FILL(1));\n    DisplayMessageAndContinueTask(taskId, data[10], 0x06D, 0x0D, fontId, GetTextSpeedSetting(), string, followUpFunc);\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nvoid ItemMenu_SetExitCallback(MainCallback cb)\n{\n    sBagMenuDisplay->exitCB = cb;\n}\n\nstatic u8 GetSelectedItemIndex(u8 pocket)\n{\n    return gBagMenuState.cursorPos[pocket] + gBagMenuState.itemsAbove[pocket];\n}\n\nstatic void Task_BagMenu_HandleInput(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u16 cursorPos;\n    u16 itemsAbove;\n    s32 input;\n\n    if (gPaletteFade.active)\n        return;\n    if (FuncIsActiveTask(Task_AnimateWin0v) == TRUE)\n        return;\n    if (IsActiveOverworldLinkBusy() == TRUE)\n        return;\n    switch (ProcessPocketSwitchInput(taskId, gBagMenuState.pocket))\n    {\n    case 1:\n        SwitchPockets(taskId, -1, FALSE);\n        return;\n    case 2:\n        SwitchPockets(taskId,  1, FALSE);\n        return;\n    case 3: //to poke balls from items\n        SwitchPockets(taskId, 4, FALSE);\n        return;\n    case 4: //to items from poke balls\n        SwitchPockets(taskId, -4, FALSE);\n        return;\n\n    default:\n        if (JOY_NEW(SELECT_BUTTON) && gBagMenuState.location == ITEMMENULOCATION_FIELD)\n        {\n            ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);\n            if (cursorPos + itemsAbove != sBagMenuDisplay->nItems[gBagMenuState.pocket])\n            {\n                PlaySE(SE_SELECT);\n                BagDestroyPocketScrollArrowPair();\n                CreatePocketScrollArrowPair();\n                BeginMovingItemInPocket(taskId, cursorPos + itemsAbove);\n                return;\n            }\n        }\n        else if (JOY_NEW(START_BUTTON))\n        {\n            if ((sBagMenuDisplay->nItems[gBagMenuState.pocket]) <= 1)\n            {\n                PlaySE(SE_FAILURE);\n                BagDestroyPocketScrollArrowPair();\n                DisplayItemMessageInBag(taskId, 2, sText_NothingToSort, Task_WaitAButtonAndCloseContextMenu);\n                break;\n            }\n            data[1] = ListMenu_ProcessInput(data[0]);\n            data[2] = BagGetQuantityByPocketPosition(gBagMenuState.pocket + 1, data[1]);\n            if (cursorPos + itemsAbove != sBagMenuDisplay->nItems[gBagMenuState.pocket])\n                gSpecialVar_ItemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]);\n            else\n                break;\n\n            PlaySE(SE_SELECT);\n            BagDestroyPocketScrollArrowPair();\n            bag_menu_print_cursor_(data[0], 2);\n            ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);\n            gTasks[taskId].func = Task_LoadBagSortOptions;\n        }\n        break;\n    }\n    input = ListMenu_ProcessInput(data[0]);\n    ListMenuGetScrollAndRow(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n    switch (input)\n    {\n    case LIST_NOTHING_CHOSEN:\n        return;\n    case LIST_CANCEL:\n        PlaySE(SE_SELECT);\n        gSpecialVar_ItemId = ITEM_NONE;\n        Bag_BeginCloseWin0Animation();\n        gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;\n        break;\n    default:\n        PlaySE(SE_SELECT);\n        if (input == sBagMenuDisplay->nItems[gBagMenuState.pocket])\n        {\n            gSpecialVar_ItemId = ITEM_NONE;\n            Bag_BeginCloseWin0Animation();\n            gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;\n        }\n        else\n        {\n            BagDestroyPocketScrollArrowPair();\n            bag_menu_print_cursor_(data[0], 2);\n            data[1] = input;\n            data[2] = BagGetQuantityByPocketPosition(gBagMenuState.pocket + 1, input);\n            gSpecialVar_ItemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, input);\n            gTasks[taskId].func = Task_ItemContextMenuByLocation;\n        }\n        break;\n    }\n}\n\nstatic void Task_ItemContextMenuByLocation(u8 taskId)\n{\n    Bag_FillMessageBoxWithPalette(1);\n    sItemContextTaskFuncs[gBagMenuState.location](taskId);\n}\n\nstatic void Task_RedrawArrowsAndReturnToBagMenuSelect(u8 taskId)\n{\n    Bag_FillMessageBoxWithPalette(0);\n    CreatePocketScrollArrowPair();\n    CreatePocketSwitchArrowPair();\n    gTasks[taskId].func = Task_BagMenu_HandleInput;\n}\n\nstatic void Bag_FillMessageBoxWithPalette(u32 a0)\n{\n    SetBgTilemapPalette(1, 0, 14, 30, 6, a0 + 1);\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nstatic u8 ProcessPocketSwitchInput(u8 taskId, s16 pocketId)\n{\n    u8 lrState;\n    if (sBagMenuDisplay->pocketSwitchMode != 0)\n        return 0;\n    lrState = GetLRKeysPressed();\n    if(pocketId == -4)\n        pocketId = POCKET_ITEMS - 1;\n    if(pocketId == 8)\n        pocketId = POCKET_POKE_BALLS - 1;\n    if (JOY_NEW(DPAD_LEFT) || lrState == MENU_L_PRESSED)\n    {\n        PlaySE(SE_BAG_POCKET);\n        if (pocketId == POCKET_ITEMS - 1)\n            return 3;\n        return 1;\n    }\n    if (JOY_NEW(DPAD_RIGHT) || lrState == MENU_R_PRESSED)\n    {\n        PlaySE(SE_BAG_POCKET);\n        if (pocketId == POCKET_POKE_BALLS - 1)\n            return 4;\n        return 2;\n    }\n    return 0;\n}\n\nstatic void SwitchPockets(u8 taskId, s16 direction, bool16 a2)\n{\n    s16 *data = gTasks[taskId].data;\n    tSwitchState = 0;\n    tSwitchCounter = 0;\n    tSwitchDir = direction;\n    if (!a2)\n    {\n        ClearWindowTilemap(0);\n        ClearWindowTilemap(1);\n        ClearWindowTilemap(2);\n        DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n        ScheduleBgCopyTilemapToVram(0);\n        DestroyItemMenuIcon(sBagMenuDisplay->itemMenuIcon ^ 1);\n        BagDestroyPocketScrollArrowPair();\n    }\n    FillBgTilemapBufferRect_Palette0(1, 0x02D, 11, 1, 18, 12);\n    ScheduleBgCopyTilemapToVram(1);\n    if(direction == 4)\n        SetBagVisualPocketId(POCKET_POKE_BALLS - 1);\n    else if(direction == -4)\n        SetBagVisualPocketId(POCKET_ITEMS - 1);\n    else\n        SetBagVisualPocketId(gBagMenuState.pocket + direction);\n    SetTaskFuncWithFollowupFunc(taskId, Task_AnimateSwitchPockets, gTasks[taskId].func);\n}\n\nstatic void Task_AnimateSwitchPockets(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!MenuHelpers_IsLinkActive() && !BagIsTutorial())\n    {\n        switch (ProcessPocketSwitchInput(taskId, gBagMenuState.pocket + tSwitchDir))\n        {\n        case 1:\n            if(tSwitchDir == 4 && (gBagMenuState.pocket != POCKET_ITEMS - 1))\n                tSwitchDir = -1;\n            gBagMenuState.pocket += tSwitchDir;\n            SwitchTaskToFollowupFunc(taskId);\n            SwitchPockets(taskId, -1, TRUE);\n            return;\n        case 2:\n            if(tSwitchDir == -4 && (gBagMenuState.pocket != POCKET_POKE_BALLS - 1))\n                tSwitchDir = 1;\n            gBagMenuState.pocket += tSwitchDir;\n            SwitchTaskToFollowupFunc(taskId);\n            SwitchPockets(taskId,  1, TRUE);\n            return;\n        case 3: //to poke balls from items\n            gBagMenuState.pocket = POCKET_POKE_BALLS - 1;\n            SwitchTaskToFollowupFunc(taskId);\n            SwitchPockets(taskId, 4, TRUE);\n            return;\n        case 4: //to items from poke balls\n            gBagMenuState.pocket = POCKET_ITEMS - 1;\n            SwitchTaskToFollowupFunc(taskId);\n            SwitchPockets(taskId,  -4, TRUE);\n            return;\n        }\n    }\n    switch (tSwitchState)\n    {\n    case 0:\n        // Animate the item list being revealed from the bottom row up\n        if (tSwitchCounter != SHRT_MAX)\n        {\n            tSwitchCounter++;\n            DrawItemListRow(tSwitchCounter);\n            if (tSwitchCounter == LIST_TILES_HEIGHT)\n                tSwitchCounter = SHRT_MAX;\n        }\n        if (tSwitchCounter == SHRT_MAX)\n            tSwitchState++;\n        break;\n    case 1:\n        if(gBagMenuState.pocket == (POCKET_ITEMS - 1) && tSwitchDir == -4)\n            gBagMenuState.pocket == POCKET_POKE_BALLS - 1;\n        else if(gBagMenuState.pocket == POCKET_POKE_BALLS - 1 && tSwitchDir == 4)\n            gBagMenuState.pocket == (POCKET_ITEMS - 1);\n        else\n            gBagMenuState.pocket += tSwitchDir;\n        PrintBagPocketName();\n        Bag_BuildListMenuTemplate(gBagMenuState.pocket);\n        data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n        PutWindowTilemap(1);\n        PutWindowTilemap(2);\n        ScheduleBgCopyTilemapToVram(0);\n        CreatePocketScrollArrowPair();\n        CreatePocketSwitchArrowPair();\n        SwitchTaskToFollowupFunc(taskId);\n        break;\n    }\n}\n\nstatic void BeginMovingItemInPocket(u8 taskId, s16 itemIndex)\n{\n    u16 itemsAbove;\n    u16 cursorPos;\n    s16 *data = gTasks[taskId].data;\n    ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);\n    ListMenuSetTemplateField(data[0], LISTFIELD_CURSORKIND, 1);\n    data[1] = itemIndex;\n    sBagMenuDisplay->itemOriginalLocation = itemIndex;\n    StringCopy(gStringVar1, ItemId_GetName(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])));\n    StringExpandPlaceholders(gStringVar4, gOtherText_WhereShouldTheStrVar1BePlaced);\n    FillWindowPixelBuffer(1, PIXEL_FILL(0));\n    BagPrintTextOnWindow(1, FONT_NORMAL, gStringVar4, 0, 3, 2, 0, 0, 0);\n    UpdateSwapLinePos(0, ListMenuGetYCoordForPrintingArrowCursor(data[0]));\n    SetSwapLineInvisibility(FALSE);\n    BagDestroyPocketSwitchArrowPair();\n    bag_menu_print_cursor_(data[0], 2);\n    gTasks[taskId].func = Task_MoveItemInPocket_HandleInput;\n}\n\nstatic void Task_MoveItemInPocket_HandleInput(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    s32 input;\n    u16 itemsAbove;\n    u16 cursorPos;\n    if (IsActiveOverworldLinkBusy() == TRUE)\n        return;\n    input = ListMenu_ProcessInput(data[0]);\n    ListMenuGetScrollAndRow(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n    UpdateSwapLinePos(0, ListMenuGetYCoordForPrintingArrowCursor(data[0]));\n    if (JOY_NEW(SELECT_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        sBagMenuDisplay->itemOriginalLocation = 0xFF;\n        ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);\n        ExecuteMoveItemInPocket(taskId, cursorPos + itemsAbove);\n        return;\n    }\n    switch (input)\n    {\n    case LIST_NOTHING_CHOSEN:\n        return;\n    case LIST_CANCEL:\n        PlaySE(SE_SELECT);\n        sBagMenuDisplay->itemOriginalLocation = 0xFF;\n        ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);\n        AbortMovingItemInPocket(taskId, cursorPos + itemsAbove);\n        break;\n    default:\n        PlaySE(SE_SELECT);\n        sBagMenuDisplay->itemOriginalLocation = 0xFF;\n        ExecuteMoveItemInPocket(taskId, input);\n        break;\n    }\n}\n\nstatic void ExecuteMoveItemInPocket(u8 taskId, u32 itemIndex)\n{\n    s16 *data = gTasks[taskId].data;\n    if (data[1] == itemIndex || data[1] == itemIndex - 1)\n    {\n        AbortMovingItemInPocket(taskId, itemIndex);\n    }\n    else\n    {\n        MoveItemSlotInList(gBagPockets[gBagMenuState.pocket].itemSlots, data[1], itemIndex);\n        DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n        if (data[1] < itemIndex)\n            gBagMenuState.itemsAbove[gBagMenuState.pocket]--;\n        Bag_BuildListMenuTemplate(gBagMenuState.pocket);\n        data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n        SetSwapLineInvisibility(TRUE);\n        CreatePocketSwitchArrowPair();\n        gTasks[taskId].func = Task_BagMenu_HandleInput;\n    }\n}\n\nstatic void AbortMovingItemInPocket(u8 taskId, u32 itemIndex)\n{\n    s16 *data = gTasks[taskId].data;\n    DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n    if (data[1] < itemIndex)\n        gBagMenuState.itemsAbove[gBagMenuState.pocket]--;\n    Bag_BuildListMenuTemplate(gBagMenuState.pocket);\n    data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n    SetSwapLineInvisibility(TRUE);\n    CreatePocketSwitchArrowPair();\n    gTasks[taskId].func = Task_BagMenu_HandleInput;\n}\n\nstatic void InitQuantityToTossOrDeposit(u16 cursorPos, const u8 *str)\n{\n    u8 r4;\n    u8 r5 = ShowBagWindow(6, 2);\n    CopyItemName(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, cursorPos), gStringVar1);\n    StringExpandPlaceholders(gStringVar4, str);\n    BagPrintTextOnWindow(r5, FONT_NORMAL, gStringVar4, 0, 2, 1, 0, 0, 1);\n    r4 = ShowBagWindow(0, 0);\n    ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 3);\n    StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n    BagPrintTextOnWindow(r4, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0, 1);\n    CreateArrowPair_QuantitySelect();\n}\n\nstatic void UpdateQuantityToTossOrDeposit(s16 value, u8 ndigits)\n{\n    u8 r6 = GetBagWindow(0);\n    FillWindowPixelBuffer(r6, PIXEL_FILL(1));\n    ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, ndigits);\n    StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n    BagPrintTextOnWindow(r6, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0, 1);\n}\n\n// row of 0 is the bottom row in the list, up to LIST_TILES_HEIGHT at the top\nstatic void DrawItemListRow(u8 row)\n{\n    CopyToBgTilemapBufferRect(1, &sItemListTilemap[(LIST_TILES_HEIGHT - row) * LIST_TILES_WIDTH], 11, 1 + LIST_TILES_HEIGHT - row, LIST_TILES_WIDTH, 1);\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nstatic bool8 IsUnregisterableKeyItem(u16 item)\n{\n    switch(item)\n    {\n        case ITEM_MACH_BIKE ... ITEM_SUPER_ROD:\n        case ITEM_WAILMER_PAIL:\n        case ITEM_SOOT_SACK:\n        case ITEM_ACRO_BIKE:\n        case ITEM_POKEBLOCK_CASE:\n        case ITEM_POKE_FLUTE:\n        case ITEM_BICYCLE ... ITEM_TEACHY_TV:\n        case ITEM_POWDER_JAR:\n            return FALSE;\n    }\n    return TRUE;\n}\n\nstatic void OpenContextMenu(u8 taskId)\n{\n    u8 r6;\n    u8 r4;\n    switch (gBagMenuState.location)\n    {\n    case ITEMMENULOCATION_BATTLE:\n    case ITEMMENULOCATION_TTVSCR_STATUS:\n        if (gSpecialVar_ItemId == ITEM_BERRY_POUCH)\n        {\n            sContextMenuItemsBuffer[0] = ITEMMENUACTION_OPEN_BERRIES;\n            sContextMenuItemsBuffer[1] = ITEMMENUACTION_CANCEL;\n            sContextMenuItemsPtr = sContextMenuItemsBuffer;\n            sContextMenuNumItems = 2;\n        }\n        else if (ItemId_GetBattleUsage(gSpecialVar_ItemId))\n        {\n            sContextMenuItemsPtr = sContextMenuItems_BattleUse;\n            sContextMenuNumItems = 2;\n        }\n        else\n        {\n            sContextMenuItemsPtr = sContextMenuItems_Cancel;\n            sContextMenuNumItems = 1;\n        }\n        break;\n    case ITEMMENULOCATION_OLD_MAN:\n    case ITEMMENULOCATION_TTVSCR_CATCHING:\n        sContextMenuItemsPtr = sContextMenuItems_BattleUse;\n        sContextMenuNumItems = 2;\n        break;\n    default:\n        if (MenuHelpers_IsLinkActive() == TRUE || InUnionRoom() == TRUE)\n        {\n            if (gSpecialVar_ItemId == ITEM_TM_CASE || gSpecialVar_ItemId == ITEM_BERRY_POUCH)\n            {\n                sContextMenuItemsPtr = sContextMenuItems_Open;\n                sContextMenuNumItems = 2;\n            }\n            else\n            {\n                if (gBagMenuState.pocket == POCKET_KEY_ITEMS - 1)\n                    sContextMenuNumItems = 1;\n                else\n                    sContextMenuNumItems = 2;\n                sContextMenuItemsPtr = sContextMenuItems_GiveIfNotKeyItemPocket[gBagMenuState.pocket];\n            }\n        }\n        else\n        {\n            switch (gBagMenuState.pocket)\n            {\n            case 0: //pockets in order of Items, Medicine, Key Items, Held Items, Poke Balls\n            case 1:\n                sContextMenuNumItems = 4;\n                if (ItemIsMail(gSpecialVar_ItemId) == TRUE)\n                    sContextMenuItemsPtr = sContextMenuItems_CheckGiveTossCancel;\n                else\n                    sContextMenuItemsPtr = sContextMenuItems_Field[gBagMenuState.pocket];\n                break;\n            case 2:\n                sContextMenuItemsPtr = sContextMenuItemsBuffer;\n                sContextMenuNumItems = 3;\n                sContextMenuItemsBuffer[2] = ITEMMENUACTION_CANCEL;\n                if (gSaveBlock1Ptr->registeredItem == gSpecialVar_ItemId)\n                    sContextMenuItemsBuffer[1] = ITEMMENUACTION_DESELECT;\n                else\n                    sContextMenuItemsBuffer[1] = ITEMMENUACTION_REGISTER;\n                if (gSpecialVar_ItemId == ITEM_TM_CASE || gSpecialVar_ItemId == ITEM_BERRY_POUCH)\n                    sContextMenuItemsBuffer[0] = ITEMMENUACTION_OPEN;\n                else if(IsUnregisterableKeyItem(gSpecialVar_ItemId))\n                {\n                    sContextMenuNumItems = 2;\n                    sContextMenuItemsBuffer[0] = ITEMMENUACTION_USE;\n                    sContextMenuItemsBuffer[1] = ITEMMENUACTION_CANCEL;\n                }\n                else if (gSpecialVar_ItemId == ITEM_BICYCLE && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE))\n                    sContextMenuItemsBuffer[0] = ITEMMENUACTION_WALK;\n                else\n                    sContextMenuItemsBuffer[0] = ITEMMENUACTION_USE;\n                break;\n            case 3:\n            case 4:\n                sContextMenuItemsPtr = sContextMenuItems_Field[gBagMenuState.pocket];\n                sContextMenuNumItems = 3;\n                break;\n            }\n        }\n    }\n    r6 = ShowBagWindow(10, sContextMenuNumItems - 1);\n    AddItemMenuActionTextPrinters(\n        r6,\n        FONT_NORMAL,\n        GetMenuCursorDimensionByFont(FONT_NORMAL, 0),\n        2,\n        GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING),\n        GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2,\n        sContextMenuNumItems,\n        sItemMenuContextActions,\n        sContextMenuItemsPtr\n    );\n    Menu_InitCursor(r6, FONT_NORMAL, 0, 2, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumItems, 0);\n    r4 = ShowBagWindow(6, 0);\n    CopyItemName(gSpecialVar_ItemId, gStringVar1);\n    StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected);\n    BagPrintTextOnWindow(r4, FONT_NORMAL, gStringVar4, 0, 2, 1, 0, 0, 1);\n}\n\nstatic void Task_ItemContext_FieldOrBattle(u8 taskId)\n{\n    OpenContextMenu(taskId);\n    gTasks[taskId].func = Task_FieldItemContextMenuHandleInput;\n}\n\nstatic void Task_FieldItemContextMenuHandleInput(u8 taskId)\n{\n    s16 input;\n    if (IsActiveOverworldLinkBusy() != TRUE)\n    {\n        input = Menu_ProcessInputNoWrapAround2();\n        switch (input)\n        {\n        case -1:\n            PlaySE(SE_SELECT);\n            sItemMenuContextActions[ITEMMENUACTION_CANCEL].func.void_u8(taskId);\n            break;\n        case -2:\n            break;\n        default:\n            PlaySE(SE_SELECT);\n            sItemMenuContextActions[sContextMenuItemsPtr[input]].func.void_u8(taskId);\n            break;\n        }\n    }\n}\n\nstatic void Task_ItemMenuAction_Use(u8 taskId)\n{\n    if (ItemId_GetFieldFunc(gSpecialVar_ItemId) != NULL)\n    {\n        HideBagWindow(10);\n        HideBagWindow(6);\n        PutWindowTilemap(0);\n        PutWindowTilemap(1);\n        ScheduleBgCopyTilemapToVram(0);\n        if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == ITEM_TYPE_PARTY_MENU)\n            Task_PrintThereIsNoPokemon(taskId);\n        else\n            ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);\n    }\n}\n\nstatic void Task_ItemMenuAction_Toss(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    ClearWindowTilemap(GetBagWindow(10));\n    ClearWindowTilemap(GetBagWindow(6));\n    HideBagWindow(10);\n    HideBagWindow(6);\n    PutWindowTilemap(0);\n    data[8] = 1;\n    if (data[2] == 1)\n    {\n        Task_ConfirmTossItems(taskId);\n    }\n    else\n    {\n        InitQuantityToTossOrDeposit(data[1], gText_TossOutHowManyStrVar1s);\n        gTasks[taskId].func = Task_SelectQuantityToToss;\n    }\n}\n\nstatic void Task_ConfirmTossItems(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);\n    StringExpandPlaceholders(gStringVar4, gText_ThrowAwayStrVar2OfThisItemQM);\n    BagPrintTextOnWindow(ShowBagWindow(6, 1), FONT_NORMAL, gStringVar4, 0, 2, 1, 0, 0, 1);\n    BagCreateYesNoMenuBottomRight(taskId, &sYesNoMenu_Toss);\n}\n\nstatic void Task_TossItem_No(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    HideBagWindow(6);\n    PutWindowTilemap(1);\n    ScheduleBgCopyTilemapToVram(0);\n    bag_menu_print_cursor_(data[0], 1);\n    Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);\n}\n\nstatic void Task_SelectQuantityToToss(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)\n    {\n        UpdateQuantityToTossOrDeposit(data[8], 3);\n    }\n    else if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        ClearWindowTilemap(GetBagWindow(6));\n        HideBagWindow(6);\n        HideBagWindow(0);\n        ScheduleBgCopyTilemapToVram(0);\n        BagDestroyPocketScrollArrowPair();\n        Task_ConfirmTossItems(taskId);\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        HideBagWindow(6);\n        HideBagWindow(0);\n        PutWindowTilemap(0);\n        PutWindowTilemap(1);\n        ScheduleBgCopyTilemapToVram(0);\n        bag_menu_print_cursor_(data[0], 1);\n        BagDestroyPocketScrollArrowPair();\n        Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);\n    }\n}\n\nstatic void Task_TossItem_Yes(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    HideBagWindow(6);\n    CopyItemName(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]), gStringVar1);\n    ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);\n    StringExpandPlaceholders(gStringVar4, gText_ThrewAwayStrVar2StrVar1s);\n    BagPrintTextOnWindow(ShowBagWindow(6, 3), FONT_NORMAL, gStringVar4, 0, 2, 1, 0, 0, 1);\n    gTasks[taskId].func = Task_WaitAB_RedrawAndReturnToBag;\n}\n\nstatic void Task_WaitAB_RedrawAndReturnToBag(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        RemoveBagItem(gSpecialVar_ItemId, data[8]);\n        HideBagWindow(6);\n        DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n        Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket);\n        PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket);\n        Bag_BuildListMenuTemplate(gBagMenuState.pocket);\n        data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n        PutWindowTilemap(1);\n        ScheduleBgCopyTilemapToVram(0);\n        bag_menu_print_cursor_(data[0], 1);\n        Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);\n    }\n}\n\nstatic void Task_ItemMenuAction_ToggleSelect(u8 taskId)\n{\n    u16 itemId;\n    s16 *data = gTasks[taskId].data;\n    itemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]);\n    if (gSaveBlock1Ptr->registeredItem == itemId)\n        gSaveBlock1Ptr->registeredItem = ITEM_NONE;\n    else\n        gSaveBlock1Ptr->registeredItem = itemId;\n\n    DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n    Bag_BuildListMenuTemplate(gBagMenuState.pocket);\n    data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n    CopyWindowToVram(0, COPYWIN_MAP);\n    Task_ItemMenuAction_Cancel(taskId);\n}\n\nstatic void Task_ItemMenuAction_Give(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u16 itemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]);\n    HideBagWindow(10);\n    HideBagWindow(6);\n    PutWindowTilemap(0);\n    PutWindowTilemap(1);\n    CopyWindowToVram(0, COPYWIN_MAP);\n    if (!IsWritingMailAllowed(itemId))\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_CantWriteMailHere, Task_WaitAButtonAndCloseContextMenu);\n    else if (ItemId_GetImportance(itemId) == 0)\n    {\n        if (CalculatePlayerPartyCount() == 0)\n        {\n            Task_PrintThereIsNoPokemon(taskId);\n        }\n        else\n        {\n            sBagMenuDisplay->exitCB = CB2_ChooseMonToGiveItem;\n            gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;\n        }\n    }\n    else\n        Task_PrintItemCantBeHeld(taskId);\n}\n\nstatic void Task_PrintThereIsNoPokemon(u8 taskId)\n{\n    DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_ThereIsNoPokemon, Task_WaitAButtonAndCloseContextMenu);\n}\n\nstatic void Task_PrintItemCantBeHeld(u8 taskId)\n{\n    CopyItemName(gSpecialVar_ItemId, gStringVar1);\n    StringExpandPlaceholders(gStringVar4, gText_ItemCantBeHeld);\n    DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_WaitAButtonAndCloseContextMenu);\n}\n\nstatic void Task_WaitAButtonAndCloseContextMenu(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        Task_ReturnToBagFromContextMenu(taskId);\n    }\n}\n\nvoid Task_ReturnToBagFromContextMenu(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    CloseBagWindow(5);\n    DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n    Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket);\n    PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket);\n    Bag_BuildListMenuTemplate(gBagMenuState.pocket);\n    data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n    ScheduleBgCopyTilemapToVram(0);\n    bag_menu_print_cursor_(data[0], 1);\n    Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);\n}\n\nstatic void Task_UnusedReturnToBag(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u16 itemsAbove;\n    u16 cursorPos;\n    ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);\n    PrintItemDescriptionOnMessageWindow(cursorPos + itemsAbove);\n    PutWindowTilemap(0);\n    ScheduleBgCopyTilemapToVram(0);\n    bag_menu_print_cursor_(data[0], 1);\n    Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);\n}\n\nstatic void Task_ItemMenuAction_Cancel(u8 taskId)\n{\n    HideBagWindow(10);\n    HideBagWindow(6);\n    PutWindowTilemap(0);\n    PutWindowTilemap(1);\n    ScheduleBgCopyTilemapToVram(0);\n    bag_menu_print_cursor_(gTasks[taskId].data[0], 1);\n    Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);\n}\n\nstatic void Task_ItemMenuAction_BattleUse(u8 taskId)\n{\n    if (ItemId_GetBattleFunc(gSpecialVar_ItemId) != NULL)\n    {\n        HideBagWindow(10);\n        HideBagWindow(6);\n        PutWindowTilemap(0);\n        PutWindowTilemap(1);\n        CopyWindowToVram(0, COPYWIN_MAP);\n        ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId);\n    }\n}\n\nstatic void Task_ItemContext_FieldGive(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u16 itemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]);\n    if (!IsWritingMailAllowed(itemId))\n    {\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_CantWriteMailHere, Task_WaitAButtonAndCloseContextMenu);\n    }\n    else if (itemId == ITEM_TM_CASE)\n    {\n        ItemMenu_SetExitCallback(GoToTMCase_Give);\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n    else if (itemId == ITEM_BERRY_POUCH)\n    {\n        ItemMenu_SetExitCallback(GoToBerryPouch_Give);\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n    else if (gBagMenuState.pocket != POCKET_KEY_ITEMS - 1 && ItemId_GetImportance(itemId) == 0)\n    {\n        Bag_BeginCloseWin0Animation();\n        gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;\n    }\n    else\n    {\n        Task_PrintItemCantBeHeld(taskId);\n    }\n}\n\nstatic void GoToTMCase_Give(void)\n{\n    InitTMCase(TMCASE_GIVE_PARTY, ReturnToBagMenuFromSubmenu_Give, FALSE);\n}\n\nstatic void GoToBerryPouch_Give(void)\n{\n    InitBerryPouch(BERRYPOUCH_FROMPARTYGIVE, ReturnToBagMenuFromSubmenu_Give, FALSE);\n}\n\nstatic void ReturnToBagMenuFromSubmenu_Give(void)\n{\n    CB2_SelectBagItemToGive();\n}\n\nstatic void Task_ItemContext_PcBoxGive(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u16 itemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1]);\n    if (ItemIsMail(itemId) == TRUE)\n    {\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_CantWriteMailHere, Task_WaitAButtonAndCloseContextMenu);\n    }\n    else if (itemId == ITEM_TM_CASE)\n    {\n        ItemMenu_SetExitCallback(GoToTMCase_PCBox);\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n    else if (itemId == ITEM_BERRY_POUCH)\n    {\n        ItemMenu_SetExitCallback(GoToBerryPouch_PCBox);\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n    else if (gBagMenuState.pocket != POCKET_KEY_ITEMS - 1 && ItemId_GetImportance(itemId) == 0)\n    {\n        Bag_BeginCloseWin0Animation();\n        gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;\n    }\n    else\n    {\n        Task_PrintItemCantBeHeld(taskId);\n    }\n}\n\nstatic void GoToTMCase_PCBox(void)\n{\n    InitTMCase(TMCASE_GIVE_PC, ReturnToBagMenuFromSubmenu_PCBox, FALSE);\n}\n\nstatic void GoToBerryPouch_PCBox(void)\n{\n    InitBerryPouch(BERRYPOUCH_FROMPOKEMONSTORAGEPC, ReturnToBagMenuFromSubmenu_PCBox, FALSE);\n}\n\nstatic void ReturnToBagMenuFromSubmenu_PCBox(void)\n{\n    GoToBagMenu(ITEMMENULOCATION_PCBOX, OPEN_BAG_LAST, CB2_ReturnToPokeStorage);\n}\n\nstatic void Task_ItemContext_Sell(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (gSpecialVar_ItemId == ITEM_TM_CASE)\n    {\n        ItemMenu_SetExitCallback(GoToTMCase_Sell);\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n    else if (gSpecialVar_ItemId == ITEM_BERRY_POUCH)\n    {\n        ItemMenu_SetExitCallback(GoToBerryPouch_Sell);\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n    else if (ItemId_GetPrice(gSpecialVar_ItemId) == 0)\n    {\n        CopyItemName(gSpecialVar_ItemId, gStringVar1);\n        StringExpandPlaceholders(gStringVar4, gText_OhNoICantBuyThat);\n        DisplayItemMessageInBag(taskId, GetDialogBoxFontId(), gStringVar4, Task_ReturnToBagFromContextMenu);\n    }\n    else\n    {\n        data[8] = 1;\n        if (data[2] == 1)\n        {\n            BagPrintMoneyAmount();\n            Task_PrintSaleConfirmationText(taskId);\n        }\n        else\n        {\n            if (data[2] > 99)\n                data[2] = 99;\n            CopyItemName(gSpecialVar_ItemId, gStringVar1);\n            StringExpandPlaceholders(gStringVar4, gText_HowManyWouldYouLikeToSell);\n            DisplayItemMessageInBag(taskId, GetDialogBoxFontId(), gStringVar4, Task_InitSaleQuantitySelectInterface);\n        }\n    }\n}\n\nstatic void GoToTMCase_Sell(void)\n{\n    InitTMCase(TMCASE_SELL, ReturnToBagMenuFromSubmenu_Sell, FALSE);\n}\n\nstatic void GoToBerryPouch_Sell(void)\n{\n    InitBerryPouch(BERRYPOUCH_FROMMARTSELL, ReturnToBagMenuFromSubmenu_Sell, FALSE);\n}\n\nstatic void ReturnToBagMenuFromSubmenu_Sell(void)\n{\n    GoToBagMenu(ITEMMENULOCATION_SHOP, OPEN_BAG_LAST, CB2_ReturnToField);\n}\n\nstatic void Task_PrintSaleConfirmationText(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    ConvertIntToDecimalStringN(gStringVar3, ItemId_GetPrice(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6);\n    StringExpandPlaceholders(gStringVar4, gText_ICanPayThisMuch_WouldThatBeOkay);\n    DisplayItemMessageInBag(taskId, GetDialogBoxFontId(), gStringVar4, Task_ShowSellYesNoMenu);\n}\n\nstatic void Task_ShowSellYesNoMenu(u8 taskId)\n{\n    BagCreateYesNoMenuTopRight(taskId, &sYesNoMenu_Sell);\n}\n\nstatic void Task_SellItem_No(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    HideBagWindow(2);\n    CloseBagWindow(5);\n    PutWindowTilemap(2);\n    PutWindowTilemap(0);\n    PutWindowTilemap(1);\n    ScheduleBgCopyTilemapToVram(0);\n    bag_menu_print_cursor_(data[0], 1);\n    Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);\n}\n\nstatic void Task_InitSaleQuantitySelectInterface(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u8 r4 = ShowBagWindow(0, 1);\n    ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 2);\n    StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n    BagPrintTextOnWindow(r4, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0xFF, 1);\n    UpdateSalePriceDisplay(ItemId_GetPrice(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])) / 2 * data[8]);\n    BagPrintMoneyAmount();\n    CreatePocketScrollArrowPair_SellQuantity();\n    gTasks[taskId].func = Task_SelectQuantityToSell;\n}\n\nstatic void UpdateSalePriceDisplay(s32 amount)\n{\n    PrintMoneyAmount(GetBagWindow(0), 56, 10, amount, 0);\n}\n\nstatic void Task_SelectQuantityToSell(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)\n    {\n        UpdateQuantityToTossOrDeposit(data[8], 2);\n        UpdateSalePriceDisplay(ItemId_GetPrice(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])) / 2 * data[8]);\n    }\n    else if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        HideBagWindow(0);\n        PutWindowTilemap(0);\n        ScheduleBgCopyTilemapToVram(0);\n        BagDestroyPocketScrollArrowPair();\n        Task_PrintSaleConfirmationText(taskId);\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        HideBagWindow(0);\n        HideBagWindow(2);\n        CloseBagWindow(5);\n        PutWindowTilemap(2);\n        PutWindowTilemap(0);\n        PutWindowTilemap(1);\n        ScheduleBgCopyTilemapToVram(0);\n        BagDestroyPocketScrollArrowPair();\n        bag_menu_print_cursor_(data[0], 1);\n        Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);\n    }\n}\n\nstatic void Task_SellItem_Yes(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    PutWindowTilemap(0);\n    ScheduleBgCopyTilemapToVram(0);\n    CopyItemName(gSpecialVar_ItemId, gStringVar1);\n    ConvertIntToDecimalStringN(gStringVar3, ItemId_GetPrice(BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6);\n    StringExpandPlaceholders(gStringVar4, gText_TurnedOverItemsWorthYen);\n    DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_FinalizeSaleToShop);\n}\n\nstatic void Task_FinalizeSaleToShop(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    PlaySE(SE_SHOP);\n    RemoveBagItem(gSpecialVar_ItemId, data[8]);\n    AddMoney(&gSaveBlock1Ptr->money, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * data[8]);\n    RecordItemTransaction(gSpecialVar_ItemId, data[8], QL_EVENT_SOLD_ITEM - QL_EVENT_USED_POKEMART);\n    DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n    Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket);\n    PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket);\n    sBagMenuDisplay->inhibitItemDescriptionPrint = TRUE;\n    Bag_BuildListMenuTemplate(gBagMenuState.pocket);\n    data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n    bag_menu_print_cursor_(data[0], 2);\n    BagDrawTextBoxOnWindow(GetBagWindow(2));\n    PrintMoneyAmountInMoneyBox(GetBagWindow(2), GetMoney(&gSaveBlock1Ptr->money), 0);\n    gTasks[taskId].func = Task_WaitPressAB_AfterSell;\n}\n\nstatic void Task_WaitPressAB_AfterSell(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        HideBagWindow(2);\n        PutWindowTilemap(2);\n        sBagMenuDisplay->inhibitItemDescriptionPrint = FALSE;\n        Task_ReturnToBagFromContextMenu(taskId);\n    }\n}\n\nstatic void Task_ItemContext_Deposit(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    data[8] = 1;\n    if (data[2] == 1)\n    {\n        Task_TryDoItemDeposit(taskId);\n    }\n    else\n    {\n        InitQuantityToTossOrDeposit(data[1], gText_DepositHowManyStrVars1);\n        gTasks[taskId].func = Task_SelectQuantityToDeposit;\n    }\n}\n\nstatic void Task_SelectQuantityToDeposit(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)\n    {\n        UpdateQuantityToTossOrDeposit(data[8], 3);\n    }\n    else if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        ClearWindowTilemap(GetBagWindow(6));\n        HideBagWindow(6);\n        HideBagWindow(0);\n        ScheduleBgCopyTilemapToVram(0);\n        BagDestroyPocketScrollArrowPair();\n        Task_TryDoItemDeposit(taskId);\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        HideBagWindow(6);\n        HideBagWindow(0);\n        PutWindowTilemap(1);\n        ScheduleBgCopyTilemapToVram(0);\n        bag_menu_print_cursor_(data[0], 1);\n        BagDestroyPocketScrollArrowPair();\n        Task_RedrawArrowsAndReturnToBagMenuSelect(taskId);\n    }\n}\n\nstatic void Task_TryDoItemDeposit(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (AddPCItem(gSpecialVar_ItemId, data[8]) == TRUE)\n    {\n        ItemUse_SetQuestLogEvent(QL_EVENT_DEPOSITED_ITEM_PC, 0, gSpecialVar_ItemId, 0xFFFF);\n        CopyItemName(gSpecialVar_ItemId, gStringVar1);\n        ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);\n        StringExpandPlaceholders(gStringVar4, gText_DepositedStrVar2StrVar1s);\n        BagPrintTextOnWindow(ShowBagWindow(6, 3), FONT_NORMAL, gStringVar4, 0, 2, 1, 0, 0, 1);\n        gTasks[taskId].func = Task_WaitAB_RedrawAndReturnToBag;\n    }\n    else\n    {\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_NoRoomToStoreItems, Task_WaitAButtonAndCloseContextMenu);\n    }\n}\n\nbool8 UseRegisteredKeyItemOnField(void)\n{\n    u8 taskId;\n    if (InUnionRoom() == TRUE)\n        return FALSE;\n    DismissMapNamePopup();\n    ChangeBgY(0, 0, 0);\n    if (gSaveBlock1Ptr->registeredItem != ITEM_NONE)\n    {\n        if (CheckBagHasItem(gSaveBlock1Ptr->registeredItem, 1) == TRUE)\n        {\n            LockPlayerFieldControls();\n            FreezeObjectEvents();\n            HandleEnforcedLookDirectionOnPlayerStopMoving();\n            StopPlayerAvatar();\n            gSpecialVar_ItemId = gSaveBlock1Ptr->registeredItem;\n            taskId = CreateTask(ItemId_GetFieldFunc(gSaveBlock1Ptr->registeredItem), 8);\n            gTasks[taskId].data[3] = 1;\n            return TRUE;\n        }\n        gSaveBlock1Ptr->registeredItem = ITEM_NONE;\n    }\n    ScriptContext_SetupScript(EventScript_BagItemCanBeRegistered);\n    return TRUE;\n}\n\nstatic bool8 BagIsTutorial(void)\n{\n    if (\n        gBagMenuState.location == ITEMMENULOCATION_OLD_MAN \n     || gBagMenuState.location == ITEMMENULOCATION_TTVSCR_CATCHING \n     || gBagMenuState.location == ITEMMENULOCATION_TTVSCR_STATUS \n     || gBagMenuState.location == ITEMMENULOCATION_TTVSCR_REGISTER \n     || gBagMenuState.location == ITEMMENULOCATION_TTVSCR_TMS\n    )\n        return TRUE;\n    return FALSE;\n}\n\nstatic void BackUpPlayerBag(void)\n{\n    u32 i;\n    sBackupPlayerBag = AllocZeroed(sizeof(struct BagSlots));\n    memcpy(sBackupPlayerBag->bagPocket_Items, gSaveBlock1Ptr->bagPocket_Items, BAG_ITEMS_COUNT * sizeof(struct ItemSlot));\n    memcpy(sBackupPlayerBag->bagPocket_KeyItems, gKeyItemSlots, BAG_KEYITEMS_COUNT * sizeof(struct ItemSlot));\n    memcpy(sBackupPlayerBag->bagPocket_PokeBalls, gSaveBlock1Ptr->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT * sizeof(struct ItemSlot));\n    memcpy(sBackupPlayerBag->bagPocket_Medicine, gSaveBlock1Ptr->bagPocket_Medicine, BAG_MEDICINE_COUNT * sizeof(struct ItemSlot));\n    memcpy(sBackupPlayerBag->bagPocket_HoldItems, gSaveBlock1Ptr->bagPocket_HoldItems, BAG_HELD_ITEMS_COUNT * sizeof(struct ItemSlot));\n    sBackupPlayerBag->registeredItem = gSaveBlock1Ptr->registeredItem;\n    sBackupPlayerBag->pocket = gBagMenuState.pocket;\n    for (i = 0; i < 5; i++)\n    {\n        sBackupPlayerBag->itemsAbove[i] = gBagMenuState.itemsAbove[i];\n        sBackupPlayerBag->cursorPos[i] = gBagMenuState.cursorPos[i];\n    }\n    ClearItemSlots(gSaveBlock1Ptr->bagPocket_Items, BAG_ITEMS_COUNT);\n    ClearItemSlots(gKeyItemSlots, BAG_KEYITEMS_COUNT);\n    ClearItemSlots(gSaveBlock1Ptr->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT);\n    ClearItemSlots(gSaveBlock1Ptr->bagPocket_Medicine, BAG_MEDICINE_COUNT);\n    ClearItemSlots(gSaveBlock1Ptr->bagPocket_HoldItems, BAG_HELD_ITEMS_COUNT);\n    gSaveBlock1Ptr->registeredItem = ITEM_NONE;\n    ResetBagCursorPositions();\n}\n\nstatic void RestorePlayerBag(void)\n{\n    u32 i;\n    memcpy(gSaveBlock1Ptr->bagPocket_Items, sBackupPlayerBag->bagPocket_Items, BAG_ITEMS_COUNT * sizeof(struct ItemSlot));\n    memcpy(gKeyItemSlots, sBackupPlayerBag->bagPocket_KeyItems, BAG_KEYITEMS_COUNT * sizeof(struct ItemSlot));\n    memcpy(gSaveBlock1Ptr->bagPocket_PokeBalls, sBackupPlayerBag->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT * sizeof(struct ItemSlot));\n    memcpy(gSaveBlock1Ptr->bagPocket_Medicine, sBackupPlayerBag->bagPocket_Medicine, BAG_MEDICINE_COUNT * sizeof(struct ItemSlot));\n    memcpy(gSaveBlock1Ptr->bagPocket_HoldItems, sBackupPlayerBag->bagPocket_HoldItems, BAG_HELD_ITEMS_COUNT * sizeof(struct ItemSlot));\n    gSaveBlock1Ptr->registeredItem = sBackupPlayerBag->registeredItem;\n    gBagMenuState.pocket = sBackupPlayerBag->pocket;\n    for (i = 0; i < 5; i++)\n    {\n        gBagMenuState.itemsAbove[i] = sBackupPlayerBag->itemsAbove[i];\n        gBagMenuState.cursorPos[i] = sBackupPlayerBag->cursorPos[i];\n    }\n    Free(sBackupPlayerBag);\n}\n\nvoid InitOldManBag(void)\n{\n    BackUpPlayerBag();\n    AddBagItem(ITEM_POTION, 1);\n    AddBagItem(ITEM_POKE_BALL, 1);\n    GoToBagMenu(ITEMMENULOCATION_OLD_MAN, OPEN_BAG_ITEMS, SetCB2ToReshowScreenAfterMenu2);\n}\n\nstatic void Task_Bag_OldManTutorial(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active)\n    {\n        switch (data[8])\n        {\n        case 102:\n        case 204:\n        case 306:\n        case 408:\n            PlaySE(SE_BAG_POCKET);\n            SwitchPockets(taskId, 1, FALSE);\n            break;\n        case 510:\n            PlaySE(SE_SELECT);\n            bag_menu_print_cursor_(data[0], 2);\n            Bag_FillMessageBoxWithPalette(1);\n            gSpecialVar_ItemId = ITEM_POKE_BALL;\n            OpenContextMenu(taskId);\n            break;\n        case 612:\n            PlaySE(SE_SELECT);\n            HideBagWindow(10);\n            HideBagWindow(6);\n            PutWindowTilemap(0);\n            PutWindowTilemap(1);\n            CopyWindowToVram(0, COPYWIN_MAP);\n            DestroyListMenuTask(data[0], NULL, NULL);\n            RestorePlayerBag();\n            Bag_BeginCloseWin0Animation();\n            gTasks[taskId].func = Task_Pokedude_FadeFromBag;\n            return;\n        }\n        data[8]++;\n    }\n}\n\nstatic void Task_Pokedude_FadeFromBag(u8 taskId)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK);\n    gTasks[taskId].func = Task_Pokedude_WaitFadeAndExitBag;\n}\n\nstatic void Task_Pokedude_WaitFadeAndExitBag(u8 taskId)\n{\n    if (!gPaletteFade.active && FuncIsActiveTask(Task_AnimateWin0v) != TRUE)\n    {\n        if (sBagMenuDisplay->exitCB != NULL)\n            SetMainCallback2(sBagMenuDisplay->exitCB);\n        else\n            SetMainCallback2(gBagMenuState.bagCallback);\n        BagDestroyPocketScrollArrowPair();\n        DestroyBagMenuResources();\n        DestroyTask(taskId);\n    }\n}\n\nvoid InitPokedudeBag(u8 a0)\n{\n    MainCallback cb2;\n    u8 location;\n    BackUpPlayerBag();\n    AddBagItem(ITEM_POTION, 1);\n    AddBagItem(ITEM_ANTIDOTE, 1);\n    AddBagItem(ITEM_TEACHY_TV, 1);\n    AddBagItem(ITEM_TM_CASE, 1);\n    AddBagItem(ITEM_POKE_BALL, 5);\n    AddBagItem(ITEM_GREAT_BALL, 1);\n    AddBagItem(ITEM_NEST_BALL, 1);\n    switch (a0)\n    {\n    default:\n        cb2 = CB2_ReturnToTeachyTV;\n        location = a0;\n        break;\n    case 7:\n        cb2 = SetCB2ToReshowScreenAfterMenu2;\n        location = ITEMMENULOCATION_TTVSCR_STATUS;\n        break;\n    case 8:\n        cb2 = SetCB2ToReshowScreenAfterMenu2;\n        location = ITEMMENULOCATION_TTVSCR_CATCHING;\n        break;\n    }\n    GoToBagMenu(location, OPEN_BAG_ITEMS, cb2);\n}\n\nstatic bool8 Task_BButtonInterruptTeachyTv(u8 taskId)\n{\n    if (JOY_NEW(B_BUTTON))\n    {\n        RestorePlayerBag();\n        SetTeachyTvControllerModeToResume();\n        sBagMenuDisplay->exitCB = CB2_ReturnToTeachyTV;\n        gTasks[taskId].func = Task_Pokedude_FadeFromBag;\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nstatic void Task_Bag_TeachyTvRegister(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active && Task_BButtonInterruptTeachyTv(taskId) != TRUE)\n    {\n        switch (data[8])\n        {\n        case 102:\n        case 204:\n            PlaySE(SE_BAG_POCKET);\n            SwitchPockets(taskId, 1, FALSE);\n            break;\n        case 306:\n            PlaySE(SE_SELECT);\n            bag_menu_print_cursor_(data[0], 2);\n            Bag_FillMessageBoxWithPalette(1);\n            gSpecialVar_ItemId = ITEM_TEACHY_TV;\n            OpenContextMenu(taskId);\n            break;\n        case 408:\n            PlaySE(SE_SELECT);\n            Menu_MoveCursorNoWrapAround(1);\n            break;\n        case 510:\n            PlaySE(SE_SELECT);\n            gSaveBlock1Ptr->registeredItem = gSpecialVar_ItemId;\n            HideBagWindow(10);\n            HideBagWindow(6);\n            PutWindowTilemap(0);\n            PutWindowTilemap(1);\n            DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n            Bag_BuildListMenuTemplate(gBagMenuState.pocket);\n            data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n            Bag_FillMessageBoxWithPalette(0);\n            bag_menu_print_cursor_(data[0], 1);\n            CopyWindowToVram(0, COPYWIN_MAP);\n            break;\n        case 612:\n        case 714:\n            gMain.newKeys = 0;\n            gMain.newAndRepeatedKeys = DPAD_DOWN;\n            ListMenu_ProcessInput(data[0]);\n            break;\n        case 816:\n            PlaySE(SE_SELECT);\n            DestroyListMenuTask(data[0], NULL, NULL);\n            RestorePlayerBag();\n            Bag_BeginCloseWin0Animation();\n            gTasks[taskId].func = Task_Pokedude_FadeFromBag;\n            return;\n        }\n        data[8]++;\n    }\n}\n\nstatic void Task_Bag_TeachyTvCatching(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active)\n    {\n        if (Task_BButtonInterruptTeachyTv(taskId) == TRUE)\n        {\n            FreeRestoreBattleData();\n            LoadPlayerParty();\n            return;\n        }\n        switch (data[8])\n        {\n        case 102:\n        case 204:\n        case 306:\n        case 408:\n            PlaySE(SE_BAG_POCKET);\n            SwitchPockets(taskId, 1, FALSE);\n            break;\n        case 510:\n        case 612:\n            gMain.newKeys = 0;\n            gMain.newAndRepeatedKeys = DPAD_DOWN;\n            ListMenu_ProcessInput(data[0]);\n            break;\n        case 714:\n        case 816:\n            gMain.newKeys = 0;\n            gMain.newAndRepeatedKeys = DPAD_UP;\n            ListMenu_ProcessInput(data[0]);\n            break;\n        case 918:\n            PlaySE(SE_SELECT);\n            bag_menu_print_cursor_(data[0], 2);\n            Bag_FillMessageBoxWithPalette(1);\n            gSpecialVar_ItemId = ITEM_POKE_BALL;\n            OpenContextMenu(taskId);\n            break;\n        case 1020:\n            PlaySE(SE_SELECT);\n            HideBagWindow(10);\n            HideBagWindow(6);\n            PutWindowTilemap(0);\n            PutWindowTilemap(1);\n            CopyWindowToVram(0, COPYWIN_MAP);\n            DestroyListMenuTask(data[0], NULL, NULL);\n            RestorePlayerBag();\n            Bag_BeginCloseWin0Animation();\n            gTasks[taskId].func = Task_Pokedude_FadeFromBag;\n            return;\n        }\n        data[8]++;\n    }\n}\n\nstatic void Task_Bag_TeachyTvStatus(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active)\n    {\n        if (Task_BButtonInterruptTeachyTv(taskId) == TRUE)\n        {\n            FreeRestoreBattleData();\n            LoadPlayerParty();\n            return;\n        }\n        switch (data[8])\n        {\n        case 102:\n            PlaySE(SE_BAG_POCKET);\n            SwitchPockets(taskId, 1, 0);\n            break;\n        case 204:\n            gMain.newKeys = 0;\n            gMain.newAndRepeatedKeys = DPAD_DOWN;\n            ListMenu_ProcessInput(data[0]);\n            break;\n        case 306:\n            PlaySE(SE_SELECT);\n            bag_menu_print_cursor_(data[0], 2);\n            Bag_FillMessageBoxWithPalette(1);\n            gSpecialVar_ItemId = ITEM_ANTIDOTE;\n            OpenContextMenu(taskId);\n            break;\n        case 408:\n            PlaySE(SE_SELECT);\n            HideBagWindow(10);\n            HideBagWindow(6);\n            PutWindowTilemap(0);\n            PutWindowTilemap(1);\n            CopyWindowToVram(0, COPYWIN_MAP);\n            DestroyListMenuTask(data[0], NULL, NULL);\n            RestorePlayerBag();\n            gItemUseCB = ItemUseCB_MedicineStep;\n            ItemMenu_SetExitCallback(Pokedude_ChooseMonForInBattleItem);\n            gTasks[taskId].func = Task_Pokedude_FadeFromBag;\n            return;\n        }\n        data[8]++;\n    }\n}\n\nstatic void Task_Bag_TeachyTvTMs(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active && Task_BButtonInterruptTeachyTv(taskId) != TRUE)\n    {\n        switch (data[8])\n        {\n        case 102:\n        case 204:\n            PlaySE(SE_BAG_POCKET);\n            SwitchPockets(taskId, 1, 0);\n            break;\n        case 306:\n            gMain.newKeys = 0;\n            gMain.newAndRepeatedKeys = DPAD_DOWN;\n            ListMenu_ProcessInput(data[0]);\n            break;\n        case 408:\n            PlaySE(SE_SELECT);\n            bag_menu_print_cursor_(data[0], 2);\n            Bag_FillMessageBoxWithPalette(1);\n            gSpecialVar_ItemId = ITEM_TM_CASE;\n            OpenContextMenu(taskId);\n            break;\n        case 510:\n            PlaySE(SE_SELECT);\n            HideBagWindow(10);\n            HideBagWindow(6);\n            PutWindowTilemap(0);\n            PutWindowTilemap(1);\n            CopyWindowToVram(0, COPYWIN_MAP);\n            DestroyListMenuTask(data[0], NULL, NULL);\n            RestorePlayerBag();\n            sBagMenuDisplay->exitCB = Pokedude_InitTMCase;\n            gTasks[taskId].func = Task_Pokedude_FadeFromBag;\n            return;\n        }\n        data[8]++;\n    }\n}\n\n\n// bag sorting\nenum BagSortOptions\n{\n    SORT_ALPHABETICALLY,\n    SORT_BY_TYPE,\n    SORT_BY_AMOUNT, //greatest->least\n    SORT_BY_NUMBER, //by itemID\n};\nenum ItemSortType\n{\n\tITEM_TYPE_FIELD_USE,\n\tITEM_TYPE_HEALTH_RECOVERY,\n\tITEM_TYPE_STATUS_RECOVERY,\n\tITEM_TYPE_PP_RECOVERY,\n\tITEM_TYPE_STAT_BOOST_DRINK,\n\tITEM_TYPE_EVOLUTION_STONE,\n\tITEM_TYPE_EVOLUTION_ITEM,\n\tITEM_TYPE_BATTLE_ITEM,\n\tITEM_TYPE_FLUTE,\n\tITEM_TYPE_STAT_BOOST_HELD_ITEM,\n\tITEM_TYPE_HELD_ITEM,\n\tITEM_TYPE_INCENSE,\n\tITEM_TYPE_MEGA_STONE,\n\tITEM_TYPE_SELLABLE,\n\tITEM_TYPE_SHARD,\n\tITEM_TYPE_FOSSIL,\n\tITEM_TYPE_MAIL_SORT,\n};\nstatic const u8 sText_SortItemsHow[] = _(\"Sort items how?\");\nstatic const u8 sText_Name[] = _(\"name\");\nstatic const u8 sText_Type[] = _(\"type\");\nstatic const u8 sText_Amount[] = _(\"amount\");\nstatic const u8 sText_Number[] = _(\"number\");\nstatic const u8 sText_ItemsSorted[] = _(\"Items sorted by {STR_VAR_1}!\");\nstatic const u8 *const sSortTypeStrings[] = \n{\n    [SORT_ALPHABETICALLY] = sText_Name,\n    [SORT_BY_TYPE] = sText_Type,\n    [SORT_BY_AMOUNT] = sText_Amount,\n    [SORT_BY_NUMBER] = sText_Number,\n};\n\nstatic const u8 sBagMenuSortItems[] =\n{\n    ITEMMENUACTION_BY_NAME,\n    ITEMMENUACTION_BY_TYPE,\n    ITEMMENUACTION_BY_AMOUNT,\n    ITEMMENUACTION_CANCEL,\n};\n\nstatic const u8 sBagMenuSortKeyItems[] =\n{\n    ITEMMENUACTION_BY_NAME,\n    ITEMMENUACTION_CANCEL,\n};\n\nstatic const u8 sBagMenuSortPokeBalls[] =\n{\n    ITEMMENUACTION_BY_NAME,\n    ITEMMENUACTION_BY_AMOUNT,\n    ITEMMENUACTION_CANCEL,\n};\n\nstatic const u8 sBagMenuSortTMBerries[] =\n{\n    ITEMMENUACTION_BY_NAME,\n    ITEMMENUACTION_BY_AMOUNT,\n    ITEMMENUACTION_BY_NUMBER,\n    ITEMMENUACTION_CANCEL,\n};\n\nstatic const u16 sItemsByType[ITEMS_COUNT] =\n{\n    [ITEM_REPEL] = ITEM_TYPE_FIELD_USE,\n    [ITEM_SUPER_REPEL] = ITEM_TYPE_FIELD_USE,\n    [ITEM_MAX_REPEL] = ITEM_TYPE_FIELD_USE,\n    [ITEM_ESCAPE_ROPE] = ITEM_TYPE_FIELD_USE,\n    [ITEM_HEART_SCALE] = ITEM_TYPE_FIELD_USE,\n\n    [ITEM_POTION] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_FULL_RESTORE] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_MAX_POTION] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_HYPER_POTION] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_SUPER_POTION] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_REVIVE] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_MAX_REVIVE] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_FRESH_WATER] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_SODA_POP] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_LEMONADE] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_MOOMOO_MILK] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_ENERGY_POWDER] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_ENERGY_ROOT] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_REVIVAL_HERB] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_BERRY_JUICE] = ITEM_TYPE_HEALTH_RECOVERY,\n    [ITEM_SACRED_ASH] = ITEM_TYPE_HEALTH_RECOVERY,\n\n    [ITEM_ANTIDOTE] = ITEM_TYPE_STATUS_RECOVERY,\n    [ITEM_BURN_HEAL] = ITEM_TYPE_STATUS_RECOVERY,\n    [ITEM_ICE_HEAL] = ITEM_TYPE_STATUS_RECOVERY,\n    [ITEM_AWAKENING] = ITEM_TYPE_STATUS_RECOVERY,\n    [ITEM_PARALYZE_HEAL] = ITEM_TYPE_STATUS_RECOVERY,\n    [ITEM_FULL_HEAL] = ITEM_TYPE_STATUS_RECOVERY,\n    [ITEM_LAVA_COOKIE] = ITEM_TYPE_STATUS_RECOVERY,\n\n    [ITEM_ETHER] = ITEM_TYPE_PP_RECOVERY,\n    [ITEM_MAX_ETHER] = ITEM_TYPE_PP_RECOVERY,\n    [ITEM_ELIXIR] = ITEM_TYPE_PP_RECOVERY,\n    [ITEM_MAX_ELIXIR] = ITEM_TYPE_PP_RECOVERY,\n\n    [ITEM_HP_UP] = ITEM_TYPE_STAT_BOOST_DRINK,\n    [ITEM_PROTEIN] = ITEM_TYPE_STAT_BOOST_DRINK,\n    [ITEM_IRON] = ITEM_TYPE_STAT_BOOST_DRINK,\n    [ITEM_CARBOS] = ITEM_TYPE_STAT_BOOST_DRINK,\n    [ITEM_CALCIUM] = ITEM_TYPE_STAT_BOOST_DRINK,\n    [ITEM_ZINC] = ITEM_TYPE_STAT_BOOST_DRINK,\n    [ITEM_RARE_CANDY] = ITEM_TYPE_STAT_BOOST_DRINK,\n    [ITEM_PP_UP] = ITEM_TYPE_STAT_BOOST_DRINK,\n    [ITEM_PP_MAX] = ITEM_TYPE_STAT_BOOST_DRINK,\n\n    [ITEM_MACHO_BRACE] = ITEM_TYPE_STAT_BOOST_HELD_ITEM,\n\n    [ITEM_SUN_STONE] = ITEM_TYPE_EVOLUTION_STONE,\n    [ITEM_MOON_STONE] = ITEM_TYPE_EVOLUTION_STONE,\n    [ITEM_FIRE_STONE] = ITEM_TYPE_EVOLUTION_STONE,\n    [ITEM_THUNDER_STONE] = ITEM_TYPE_EVOLUTION_STONE,\n    [ITEM_WATER_STONE] = ITEM_TYPE_EVOLUTION_STONE,\n    [ITEM_LEAF_STONE] = ITEM_TYPE_EVOLUTION_STONE,\n\n    [ITEM_KINGS_ROCK] = ITEM_TYPE_EVOLUTION_ITEM,\n    [ITEM_DEEP_SEA_TOOTH] = ITEM_TYPE_EVOLUTION_ITEM,\n    [ITEM_DEEP_SEA_SCALE] = ITEM_TYPE_EVOLUTION_ITEM,\n    [ITEM_EVERSTONE] = ITEM_TYPE_EVOLUTION_ITEM,\n    [ITEM_METAL_COAT] = ITEM_TYPE_EVOLUTION_ITEM,\n    [ITEM_DRAGON_SCALE] = ITEM_TYPE_EVOLUTION_ITEM,\n    [ITEM_UP_GRADE] = ITEM_TYPE_EVOLUTION_ITEM,\n\n    [ITEM_GUARD_SPEC] = ITEM_TYPE_BATTLE_ITEM,\n    [ITEM_DIRE_HIT] = ITEM_TYPE_BATTLE_ITEM,\n    [ITEM_X_ATTACK] = ITEM_TYPE_BATTLE_ITEM,\n    [ITEM_X_DEFEND] = ITEM_TYPE_BATTLE_ITEM,\n    [ITEM_X_SPEED] = ITEM_TYPE_BATTLE_ITEM,\n    [ITEM_X_ACCURACY] = ITEM_TYPE_BATTLE_ITEM,\n    [ITEM_X_SPECIAL] = ITEM_TYPE_BATTLE_ITEM,\n    [ITEM_POKE_DOLL] = ITEM_TYPE_BATTLE_ITEM,\n    [ITEM_FLUFFY_TAIL] = ITEM_TYPE_BATTLE_ITEM,\n\n    [ITEM_BRIGHT_POWDER] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_WHITE_HERB] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_EXP_SHARE] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_QUICK_CLAW] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_SOOTHE_BELL] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_MENTAL_HERB] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_CHOICE_BAND] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_SILVER_POWDER] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_AMULET_COIN] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_CLEANSE_TAG] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_SOUL_DEW] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_SMOKE_BALL] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_FOCUS_BAND] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_LUCKY_EGG] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_SCOPE_LENS] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_LEFTOVERS] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_LIGHT_BALL] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_SOFT_SAND] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_HARD_STONE] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_MIRACLE_SEED] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_BLACK_GLASSES] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_BLACK_BELT] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_MAGNET] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_MYSTIC_WATER] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_SHARP_BEAK] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_POISON_BARB] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_NEVER_MELT_ICE] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_SPELL_TAG] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_TWISTED_SPOON] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_CHARCOAL] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_DRAGON_FANG] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_SILK_SCARF] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_SHELL_BELL] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_LUCKY_PUNCH] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_METAL_POWDER] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_THICK_CLUB] = ITEM_TYPE_HELD_ITEM,\n    [ITEM_STICK] = ITEM_TYPE_HELD_ITEM,\n\n    [ITEM_SEA_INCENSE] = ITEM_TYPE_INCENSE,\n    [ITEM_LAX_INCENSE] = ITEM_TYPE_INCENSE,\n\n    [ITEM_RED_ORB] = ITEM_TYPE_MEGA_STONE,\n    [ITEM_BLUE_ORB] = ITEM_TYPE_MEGA_STONE,\n\n    [ITEM_BLUE_FLUTE] = ITEM_TYPE_FLUTE,\n    [ITEM_YELLOW_FLUTE] = ITEM_TYPE_FLUTE,\n    [ITEM_RED_FLUTE] = ITEM_TYPE_FLUTE,\n    [ITEM_BLACK_FLUTE] = ITEM_TYPE_FLUTE,\n    [ITEM_WHITE_FLUTE] = ITEM_TYPE_FLUTE,\n\n    [ITEM_SHOAL_SALT] = ITEM_TYPE_SELLABLE,\n    [ITEM_SHOAL_SHELL] = ITEM_TYPE_SELLABLE,\n    [ITEM_TINY_MUSHROOM] = ITEM_TYPE_SELLABLE,\n    [ITEM_BIG_MUSHROOM] = ITEM_TYPE_SELLABLE,\n    [ITEM_PEARL] = ITEM_TYPE_SELLABLE,\n    [ITEM_BIG_PEARL] = ITEM_TYPE_SELLABLE,\n    [ITEM_STARDUST] = ITEM_TYPE_SELLABLE,\n    [ITEM_STAR_PIECE] = ITEM_TYPE_SELLABLE,\n    [ITEM_NUGGET] = ITEM_TYPE_SELLABLE,\n\n    [ITEM_RED_SHARD] = ITEM_TYPE_SHARD,\n    [ITEM_BLUE_SHARD] = ITEM_TYPE_SHARD,\n    [ITEM_YELLOW_SHARD] = ITEM_TYPE_SHARD,\n    [ITEM_GREEN_SHARD] = ITEM_TYPE_SHARD,\n\n    [ITEM_HELIX_FOSSIL] = ITEM_TYPE_FOSSIL,\n    [ITEM_DOME_FOSSIL] = ITEM_TYPE_FOSSIL,\n    [ITEM_OLD_AMBER] = ITEM_TYPE_FOSSIL,\n\n    [ITEM_ORANGE_MAIL] = ITEM_TYPE_MAIL_SORT,\n    [ITEM_HARBOR_MAIL] = ITEM_TYPE_MAIL_SORT,\n    [ITEM_GLITTER_MAIL] = ITEM_TYPE_MAIL_SORT,\n    [ITEM_MECH_MAIL] = ITEM_TYPE_MAIL_SORT,\n    [ITEM_WOOD_MAIL] = ITEM_TYPE_MAIL_SORT,\n    [ITEM_WAVE_MAIL] = ITEM_TYPE_MAIL_SORT,\n    [ITEM_BEAD_MAIL] = ITEM_TYPE_MAIL_SORT,\n    [ITEM_SHADOW_MAIL] = ITEM_TYPE_MAIL_SORT,\n    [ITEM_TROPIC_MAIL] = ITEM_TYPE_MAIL_SORT,\n    [ITEM_DREAM_MAIL] = ITEM_TYPE_MAIL_SORT,\n    [ITEM_FAB_MAIL] = ITEM_TYPE_MAIL_SORT,\n    [ITEM_RETRO_MAIL] = ITEM_TYPE_MAIL_SORT,\n};\n\nstatic const u8 sFontColorTable[][3] =\n{\n    {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_DARK_GRAY},  // Default\n    {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE,      TEXT_COLOR_GREEN},      // Unused\n    {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_2,  TEXT_DYNAMIC_COLOR_3},  // Gender symbol\n    {TEXT_COLOR_WHITE,       TEXT_COLOR_DARK_GRAY,  TEXT_COLOR_LIGHT_GRAY}, // Selection actions\n    {TEXT_COLOR_WHITE,       TEXT_COLOR_BLUE,       TEXT_COLOR_LIGHT_BLUE}, // Field moves\n    {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE,      TEXT_COLOR_DARK_GRAY},  // Unused\n};\n\nvoid BagMenu_Print(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIndex)\n{\n    AddTextPrinterParameterized4(windowId, fontId, left, top, letterSpacing, lineSpacing, sFontColorTable[colorIndex], speed, str);\n}\n\nstatic void AddBagSortSubMenu(void)\n{\n    u8 windowId = 0;\n\n    switch (gBagMenuState.pocket + 1)\n    {\n        case POCKET_KEY_ITEMS:\n            sContextMenuItemsPtr = sBagMenuSortKeyItems;\n            memcpy(&sContextMenuItemsBuffer, &sBagMenuSortKeyItems, NELEMS(sBagMenuSortKeyItems));\n            sContextMenuNumItems = NELEMS(sBagMenuSortKeyItems);\n            break;\n        case POCKET_POKE_BALLS:\n            sContextMenuItemsPtr = sBagMenuSortPokeBalls;\n            memcpy(&sContextMenuItemsBuffer, &sBagMenuSortPokeBalls, NELEMS(sBagMenuSortPokeBalls));\n            sContextMenuNumItems = NELEMS(sBagMenuSortPokeBalls);\n            break;\n        case POCKET_BERRY_POUCH:\n            sContextMenuItemsPtr = sBagMenuSortTMBerries;\n            memcpy(&sContextMenuItemsBuffer, &sBagMenuSortTMBerries, NELEMS(sBagMenuSortTMBerries));\n            sContextMenuNumItems = NELEMS(sBagMenuSortTMBerries);\n            break;\n        default:\n            sContextMenuItemsPtr = sBagMenuSortItems;\n            memcpy(&sContextMenuItemsBuffer, &sBagMenuSortItems, NELEMS(sBagMenuSortItems));\n            sContextMenuNumItems = NELEMS(sBagMenuSortItems);\n            break;\n    }\n\n    StringExpandPlaceholders(gStringVar4, sText_SortItemsHow);\n    FillWindowPixelBuffer(1, PIXEL_FILL(0));\n    BagMenu_Print(1, 1, gStringVar4, 0, 3, 0, 0, 0, 5);\n\n    windowId = ShowBagWindow(10, sContextMenuNumItems -1);\n    AddItemMenuActionTextPrinters(windowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, GetFontAttribute(2, FONTATTR_LETTER_SPACING), GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumItems, sItemMenuContextActions, sContextMenuItemsPtr);\n    Menu_InitCursor              (windowId, 2, 0, 2, GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumItems, 0);\n}\n\nstatic void Task_FieldItemSortMenuHandleInput(u8 taskId)\n{\n    s16 input;\n    if (IsActiveOverworldLinkBusy() != TRUE)\n    {\n        input = Menu_ProcessInputNoWrapAround2();\n        switch (input)\n        {\n        case -1:\n            PlaySE(SE_SELECT);\n            CloseBagWindow(10);\n            Task_ReturnToBagFromContextMenu(taskId);\n            break;\n        case -2:\n            break;\n        default:\n            PlaySE(SE_SELECT);\n            if(sContextMenuItemsPtr[input] == ITEMMENUACTION_CANCEL)\n            {\n                PlaySE(SE_SELECT);\n                CloseBagWindow(10);\n                Task_ReturnToBagFromContextMenu(taskId);\n            }\n            else\n                sItemMenuContextActions[sContextMenuItemsPtr[input]].func.void_u8(taskId);\n            break;\n        }\n    }\n}\n\nstatic void Task_LoadBagSortOptions(u8 taskId)\n{\n    AddBagSortSubMenu();\n    gTasks[taskId].func = Task_FieldItemSortMenuHandleInput;\n}\n\n#define tSortType data[2]\nstatic void ItemMenu_SortByName(u8 taskId)\n{\n    gTasks[taskId].tSortType = SORT_ALPHABETICALLY;\n    StringCopy(gStringVar1, sSortTypeStrings[SORT_ALPHABETICALLY]);\n    gTasks[taskId].func = SortBagItems;\n}\nstatic void ItemMenu_SortByType(u8 taskId)\n{\n    gTasks[taskId].tSortType = SORT_BY_TYPE;\n    StringCopy(gStringVar1, sSortTypeStrings[SORT_BY_TYPE]);\n    gTasks[taskId].func = SortBagItems;\n}\nstatic void ItemMenu_SortByAmount(u8 taskId)\n{\n    gTasks[taskId].tSortType = SORT_BY_AMOUNT; //greatest->least\n    StringCopy(gStringVar1, sSortTypeStrings[SORT_BY_AMOUNT]);\n    gTasks[taskId].func = SortBagItems;\n}\nstatic void ItemMenu_SortByNumber(u8 taskId)\n{\n    gTasks[taskId].tSortType = SORT_BY_NUMBER; //by itemID\n    StringCopy(gStringVar1, sSortTypeStrings[SORT_BY_NUMBER]);\n    gTasks[taskId].func = SortBagItems;\n}\n\nstatic void SortBagItems(u8 taskId)\n{\n    s16* data = gTasks[taskId].data;\n\n    CloseBagWindow(10);\n    CloseBagWindow(5);\n    DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n    Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket);\n    PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket);\n    Bag_BuildListMenuTemplate(gBagMenuState.pocket);\n    data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]);\n    ScheduleBgCopyTilemapToVram(0);\n    bag_menu_print_cursor_(data[0], 1);\n    StringCopy(gStringVar1, sSortTypeStrings[tSortType]);\n    StringExpandPlaceholders(gStringVar4, sText_ItemsSorted);\n    DisplayItemMessageInBag(taskId, 1, gStringVar4, Task_SortFinish);\n}\n\nstatic void Task_SortFinish(u8 taskId)\n{\n    s16* data = gTasks[taskId].data;\n\n    if (gMain.newKeys & (A_BUTTON | B_BUTTON))\n    {\n        SortItemsInBag(gBagMenuState.pocket, tSortType);\n        PlaySE(SE_SELECT);\n        Task_ReturnToBagFromContextMenu(taskId);\n    }\n}\n\nstatic void SortItemsInBag(u8 pocket, u8 type)\n{\n    struct ItemSlot* itemMem;\n    u16 itemAmount;\n    s8 (*func)(struct ItemSlot*, struct ItemSlot*);\n    switch (pocket)\n    {\n    case (POCKET_ITEMS - 1):\n        itemMem = gSaveBlock1Ptr->bagPocket_Items;\n        itemAmount = BAG_ITEMS_COUNT;\n        break;\n    case (POCKET_MEDICINE - 1):\n        itemMem = gSaveBlock1Ptr->bagPocket_Medicine;\n        itemAmount = BAG_MEDICINE_COUNT;\n        break;\n    case (POCKET_KEY_ITEMS - 1):\n        itemMem = gKeyItemSlots;\n        itemAmount = BAG_KEYITEMS_COUNT;\n        break;\n    case (POCKET_HELD_ITEMS - 1):\n        itemMem = gSaveBlock1Ptr->bagPocket_HoldItems;\n        itemAmount = BAG_HELD_ITEMS_COUNT;\n        break;\n    case (POCKET_POKE_BALLS - 1):\n        itemMem = gSaveBlock1Ptr->bagPocket_PokeBalls;\n        itemAmount = BAG_POKEBALLS_COUNT;\n        break;\n    case (POCKET_BERRY_POUCH - 1):\n        itemMem = gSaveBlock1Ptr->bagPocket_Berries;\n        itemAmount = BAG_BERRIES_COUNT;\n        break;\n    default:\n        return;\n    }\n\n    switch (type)\n    {\n    case SORT_ALPHABETICALLY:\n        MergeSort(itemMem, 0, itemAmount - 1, CompareItemsAlphabetically);\n        break;\n    case SORT_BY_AMOUNT:\n        MergeSort(itemMem, 0, itemAmount - 1, CompareItemsByMost);\n        break;\n    case SORT_BY_NUMBER:\n        MergeSort(itemMem, 0, itemAmount - 1, CompareItemsById);\n        break;\n    default:\n        MergeSort(itemMem, 0, itemAmount - 1, CompareItemsByType);\n        break;\n    }\n}\n\nstatic void MergeSort(struct ItemSlot* array, u32 low, u32 high, s8 (*comparator)(struct ItemSlot*, struct ItemSlot*))\n{\n    u32 mid;\n\n    if (high <= low)\n        return;\n\n    mid = low + (high - low) / 2;\n    MergeSort(array, low, mid, comparator); //Sort left half.\n    MergeSort(array, mid + 1, high, comparator); //Sort right half.\n    Merge(array, low, mid, high, comparator); //Merge results.\n}\n\nstatic void Merge(struct ItemSlot* array, u32 low, u32 mid, u32 high, s8 (*comparator)(struct ItemSlot*, struct ItemSlot*))\n{\n    u32 i = low;\n    u32 j = mid + 1;\n    u32 k;\n    struct ItemSlot aux[high + 1];\n\n    for (k = low; k <= high; ++k)\n        aux[k] = array[k];\n\n    for (k = low; k <= high; ++k)\n    { //Merge back to a[low..high]\n        if (i > mid)\n            array[k] = aux[j++];\n        else if (j > high)\n            array[k] = aux[i++];\n        else if (comparator(&aux[j], &aux[i]) < 0)\n            array[k] = aux[j++];\n        else\n            array[k] = aux[i++];\n    }\n}\n\nstatic s8 CompareItemsAlphabetically(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2)\n{\n    u16 item1 = itemSlot1->itemId;\n    u16 item2 = itemSlot2->itemId;\n    int i;\n    const u8 *name1;\n    const u8 *name2;\n\n    if (item1 == ITEM_NONE)\n        return 1;\n    else if (item2 == ITEM_NONE)\n        return -1;\n\n    name1 = ItemId_GetName(item1);\n    name2 = ItemId_GetName(item2);\n\n    for (i = 0; ; ++i)\n    {\n        if (name1[i] == EOS && name2[i] != EOS)\n            return -1;\n        else if (name1[i] != EOS && name2[i] == EOS)\n            return 1;\n        else if (name1[i] == EOS && name2[i] == EOS)\n            return 0;\n\n        if (name1[i] < name2[i])\n            return -1;\n        else if (name1[i] > name2[i])\n            return 1;\n    }\n\n    return 0; //Will never be reached\n}\n\nstatic s8 CompareItemsByMost(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2)\n{\n    u16 quantity1 = GetBagItemQuantity(&itemSlot1->quantity);\n    u16 quantity2 = GetBagItemQuantity(&itemSlot2->quantity);\n\n    if (itemSlot1->itemId == ITEM_NONE)\n        return 1;\n    else if (itemSlot2->itemId == ITEM_NONE)\n        return -1;\n\n    if (quantity1 < quantity2)\n        return 1;\n    else if (quantity1 > quantity2)\n        return -1;\n\n    return CompareItemsAlphabetically(itemSlot1, itemSlot2); //Items have same quantity so sort alphabetically\n}\n\nstatic s8 CompareItemsById(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2)\n{\n    if (itemSlot1->itemId == ITEM_NONE)\n        return 1;\n    else if (itemSlot2->itemId == ITEM_NONE)\n        return -1;\n\n    if (itemSlot2->itemId < itemSlot1->itemId)\n        return 1;\n    else if (itemSlot2->itemId > itemSlot1->itemId)\n        return -1;\n\n    return CompareItemsByMost(itemSlot1, itemSlot2); //Items with the same ID are sorted by stack amount\n}\n\nstatic s8 CompareItemsByType(struct ItemSlot* itemSlot1, struct ItemSlot* itemSlot2)\n{\n    //Null items go last\n    u8 type1 = (itemSlot1->itemId == ITEM_NONE) ? 0xFF : sItemsByType[itemSlot1->itemId];\n    u8 type2 = (itemSlot2->itemId == ITEM_NONE) ? 0xFF : sItemsByType[itemSlot2->itemId];\n\n    if (type1 < type2)\n        return -1;\n    else if (type1 > type2)\n        return 1;\n\n    return CompareItemsAlphabetically(itemSlot1, itemSlot2); //Items are of same type so sort alphabetically\n}"
  },
  {
    "path": "src/item_menu_icons.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"graphics.h\"\n#include \"item_menu_icons.h\"\n#include \"constants/items.h\"\n\nenum {\n    TAG_BAG = 100,\n    TAG_SWAP_LINE,\n    TAG_ITEM_ICON,\n    TAG_ITEM_ICON_ALT,\n};\n\n#define NUM_SWAP_LINE_SPRITES 9\n\n// Indexes for sItemMenuIconSpriteIds\nenum {\n    SPR_BAG,\n    SPR_SWAP_LINE_START,\n    SPR_ITEM_ICON = SPR_SWAP_LINE_START + NUM_SWAP_LINE_SPRITES,\n    SPR_ITEM_ICON_ALT,\n    SPR_COUNT\n};\n\nenum {\n    ANIM_SWAP_LINE_START,\n    ANIM_SWAP_LINE_MID,\n    ANIM_SWAP_LINE_END,\n};\n\nenum {\n    AFFINEANIM_BAG_IDLE,\n    AFFINEANIM_BAG_SHAKE,\n};\n\nstatic EWRAM_DATA u8 sItemMenuIconSpriteIds[SPR_COUNT] = {0};\nstatic EWRAM_DATA void *sItemIconTilesBuffer = NULL;\nstatic EWRAM_DATA void *sItemIconTilesBufferPadded = NULL;\n\nstatic void SpriteCB_BagVisualSwitchingPockets(struct Sprite *sprite);\nstatic void SpriteCB_ShakeBagSprite(struct Sprite *sprite);\n\nstatic const struct OamData sOamData_Bag = {\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .shape = SPRITE_SHAPE(64x64),\n    .size = SPRITE_SIZE(64x64),\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_Bag_OpenPokeBallsPocket[] = {\n    ANIMCMD_FRAME(   0, 5),\n    ANIMCMD_FRAME(0x40, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Bag_OpenItemsPocket[] = {\n    ANIMCMD_FRAME(   0, 5),\n    ANIMCMD_FRAME(0x80, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Bag_OpenKeyItemsPocket[] = {\n    ANIMCMD_FRAME(   0, 5),\n    ANIMCMD_FRAME(0xc0, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Bag_OpenMedicinePocket[] = {\n    ANIMCMD_FRAME(   0, 5),\n    ANIMCMD_FRAME(0x100, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Bag_OpenHeldItemsPocket[] = {\n    ANIMCMD_FRAME(   0, 5),\n    ANIMCMD_FRAME(0x140, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_Bag[] = {\n    [POCKET_ITEMS - 1]      = sAnim_Bag_OpenItemsPocket,\n    [POCKET_MEDICINE - 1]   = sAnim_Bag_OpenMedicinePocket,\n    [POCKET_KEY_ITEMS - 1]  = sAnim_Bag_OpenKeyItemsPocket,\n    [POCKET_HELD_ITEMS - 1] = sAnim_Bag_OpenHeldItemsPocket,\n    [POCKET_POKE_BALLS - 1] = sAnim_Bag_OpenPokeBallsPocket,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_BagIdle[] = {\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_BagShake[] = {\n    AFFINEANIMCMD_FRAME(0, 0, -2, 2),\n    AFFINEANIMCMD_FRAME(0, 0,  2, 4),\n    AFFINEANIMCMD_FRAME(0, 0, -2, 4),\n    AFFINEANIMCMD_FRAME(0, 0,  2, 2),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sAffineAnimTable_Bag[] = {\n    [AFFINEANIM_BAG_IDLE]  = sAffineAnim_BagIdle,\n    [AFFINEANIM_BAG_SHAKE] = sAffineAnim_BagShake\n};\n\nconst struct CompressedSpriteSheet gSpriteSheet_BagMale = {\n    .data = gBagMale_Gfx,\n    .size = 0x3000,\n    .tag = TAG_BAG\n};\n\nconst struct CompressedSpriteSheet gSpriteSheet_BagFemale = {\n    .data = gBagFemale_Gfx,\n    .size = 0x3000,\n    .tag = TAG_BAG\n};\n\nconst struct CompressedSpritePalette gSpritePalette_Bag = {\n    .data = gBag_Pal,\n    .tag = TAG_BAG\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Bag = {\n    .tileTag = TAG_BAG,\n    .paletteTag = TAG_BAG,\n    .oam = &sOamData_Bag,\n    .anims = sAnims_Bag,\n    .images = NULL,\n    .affineAnims = sAffineAnimTable_Bag,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_SwapLine = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .shape = SPRITE_SHAPE(16x16),\n    .size = SPRITE_SIZE(16x16),\n    .priority = 1,\n    .paletteNum = 1\n};\n\nstatic const union AnimCmd sAnim_SwapLine_Start[] = {\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_SwapLine_Mid[] = {\n    ANIMCMD_FRAME(4, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_SwapLine_End[] = {\n    ANIMCMD_FRAME(0, 0, .hFlip = TRUE),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_SwapLine[] = {\n    [ANIM_SWAP_LINE_START] = sAnim_SwapLine_Start,\n    [ANIM_SWAP_LINE_MID]   = sAnim_SwapLine_Mid,\n    [ANIM_SWAP_LINE_END]   = sAnim_SwapLine_End\n};\n\nconst struct CompressedSpriteSheet gBagSwapSpriteSheet = {\n    .data = gSwapLine_Gfx,\n    .size = 0x100,\n    .tag = TAG_SWAP_LINE\n};\n\nconst struct CompressedSpritePalette gBagSwapSpritePalette = {\n    .data = gSwapLine_Pal,\n    .tag = TAG_SWAP_LINE\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_SwapLine = {\n    .tileTag = TAG_SWAP_LINE,\n    .paletteTag = TAG_SWAP_LINE,\n    .oam = &sOamData_SwapLine,\n    .anims = sAnims_SwapLine,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_ItemIcon = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .shape = SPRITE_SHAPE(32x32),\n    .size = SPRITE_SIZE(32x32),\n    .priority = 1,\n    .paletteNum = 2\n};\n\nstatic const union AnimCmd sAnim_ItemIcon[] = {\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_ItemIcon[] = {\n    sAnim_ItemIcon\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_ItemIcon = {\n    .tileTag = TAG_ITEM_ICON,\n    .paletteTag = TAG_ITEM_ICON,\n    .oam = &sOamData_ItemIcon,\n    .anims = sAnims_ItemIcon,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\n#include \"data/item_icon_table.h\"\n\nvoid ResetItemMenuIconState(void)\n{\n    u32 i;\n\n    for (i = 0; i < SPR_COUNT; i++)\n        sItemMenuIconSpriteIds[i] = SPRITE_NONE;\n}\n\nvoid CreateBagSprite(u8 animNum)\n{\n    sItemMenuIconSpriteIds[SPR_BAG] = CreateSprite(&sSpriteTemplate_Bag, 40, 68, 0);\n    SetBagVisualPocketId(animNum);\n}\n\nvoid SetBagVisualPocketId(u8 animNum)\n{\n    struct Sprite *sprite = &gSprites[sItemMenuIconSpriteIds[SPR_BAG]];\n    sprite->y2 = -5;\n    sprite->callback = SpriteCB_BagVisualSwitchingPockets;\n    StartSpriteAnim(sprite, animNum);\n}\n\nstatic void SpriteCB_BagVisualSwitchingPockets(struct Sprite *sprite)\n{\n    if (sprite->y2 != 0)\n        sprite->y2++;\n    else\n        sprite->callback = SpriteCallbackDummy;\n}\n\nvoid ShakeBagSprite(void)\n{\n    struct Sprite *sprite = &gSprites[sItemMenuIconSpriteIds[SPR_BAG]];\n    if (sprite->affineAnimEnded)\n    {\n        StartSpriteAffineAnim(sprite, AFFINEANIM_BAG_SHAKE);\n        sprite->callback = SpriteCB_ShakeBagSprite;\n    }\n}\n\nstatic void SpriteCB_ShakeBagSprite(struct Sprite *sprite)\n{\n    if (sprite->affineAnimEnded)\n    {\n        StartSpriteAffineAnim(sprite, AFFINEANIM_BAG_IDLE);\n        sprite->callback = SpriteCallbackDummy;\n    }\n}\n\nvoid CreateSwapLine(void)\n{\n    u32 i;\n    u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START];\n\n    for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++)\n    {\n        spriteIds[i] = CreateSprite(&sSpriteTemplate_SwapLine, i * 16 + 96, 7, 0);\n        switch (i)\n        {\n        case 0:\n            // ANIM_SWAP_LINE_START, by default\n            break;\n        case NUM_SWAP_LINE_SPRITES - 1:\n            StartSpriteAnim(&gSprites[spriteIds[i]], ANIM_SWAP_LINE_END);\n            break;\n        default:\n            StartSpriteAnim(&gSprites[spriteIds[i]], ANIM_SWAP_LINE_MID);\n            break;\n        }\n        gSprites[spriteIds[i]].invisible = TRUE;\n    }\n}\n\nvoid SetSwapLineInvisibility(bool8 invisible)\n{\n    u32 i;\n    u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START];\n\n    for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++)\n        gSprites[spriteIds[i]].invisible = invisible;\n}\n\nvoid UpdateSwapLinePos(s16 x, u16 y)\n{\n    u32 i;\n    u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START];\n\n    for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++)\n    {\n        gSprites[spriteIds[i]].x2 = x;\n        gSprites[spriteIds[i]].y = y + 7;\n    }\n}\n\nstatic bool8 TryAllocItemIconTilesBuffers(void)\n{\n    void ** ptr1, ** ptr2;\n\n    ptr1 = &sItemIconTilesBuffer;\n    *ptr1 = Alloc(0x120);\n    if (*ptr1 == NULL)\n        return FALSE;\n    ptr2 = &sItemIconTilesBufferPadded;\n    *ptr2 = AllocZeroed(0x200);\n    if (*ptr2 == NULL)\n    {\n        Free(*ptr1);\n        return FALSE;\n    }\n    return TRUE;\n}\n\nvoid CopyItemIconPicTo4x4Buffer(const void *src, void *dest)\n{\n    u32 i;\n\n    for (i = 0; i < 3; i++)\n        CpuCopy16(src + 0x60 * i, dest + 0x80 * i, 0x60);\n}\n\nu8 AddItemIconObject(u16 tilesTag, u16 paletteTag, u16 itemId)\n{\n    struct SpriteTemplate template;\n    struct SpriteSheet spriteSheet;\n    struct CompressedSpritePalette spritePalette;\n    u8 spriteId;\n\n    if (!TryAllocItemIconTilesBuffers())\n        return MAX_SPRITES;\n\n    LZDecompressWram(GetItemIconGfxPtr(itemId, ITEMICON_TILES), sItemIconTilesBuffer);\n    CopyItemIconPicTo4x4Buffer(sItemIconTilesBuffer, sItemIconTilesBufferPadded);\n    spriteSheet.data = sItemIconTilesBufferPadded;\n    spriteSheet.size = 0x200;\n    spriteSheet.tag = tilesTag;\n    LoadSpriteSheet(&spriteSheet);\n\n    spritePalette.data = GetItemIconGfxPtr(itemId, ITEMICON_PAL);\n    spritePalette.tag = paletteTag;\n    LoadCompressedSpritePalette(&spritePalette);\n\n    CpuCopy16(&sSpriteTemplate_ItemIcon, &template, sizeof(struct SpriteTemplate));\n    template.tileTag = tilesTag;\n    template.paletteTag = paletteTag;\n    spriteId = CreateSprite(&template, 0, 0, 0);\n\n    Free(sItemIconTilesBuffer);\n    Free(sItemIconTilesBufferPadded);\n    return spriteId;\n}\n\nu8 AddItemIconObjectWithCustomObjectTemplate(const struct SpriteTemplate * origTemplate, u16 tilesTag, u16 paletteTag, u16 itemId)\n{\n    struct SpriteTemplate template;\n    struct SpriteSheet spriteSheet;\n    struct CompressedSpritePalette spritePalette;\n    u8 spriteId;\n\n    if (!TryAllocItemIconTilesBuffers())\n        return MAX_SPRITES;\n\n    LZDecompressWram(GetItemIconGfxPtr(itemId, ITEMICON_TILES), sItemIconTilesBuffer);\n    CopyItemIconPicTo4x4Buffer(sItemIconTilesBuffer, sItemIconTilesBufferPadded);\n    spriteSheet.data = sItemIconTilesBufferPadded;\n    spriteSheet.size = 0x200;\n    spriteSheet.tag = tilesTag;\n    LoadSpriteSheet(&spriteSheet);\n\n    spritePalette.data = GetItemIconGfxPtr(itemId, ITEMICON_PAL);\n    spritePalette.tag = paletteTag;\n    LoadCompressedSpritePalette(&spritePalette);\n\n    CpuCopy16(origTemplate, &template, sizeof(struct SpriteTemplate));\n    template.tileTag = tilesTag;\n    template.paletteTag = paletteTag;\n    spriteId = CreateSprite(&template, 0, 0, 0);\n\n    Free(sItemIconTilesBuffer);\n    Free(sItemIconTilesBufferPadded);\n    return spriteId;\n}\n\nvoid CreateItemMenuIcon(u16 itemId, u8 idx)\n{\n    u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON];\n    u8 spriteId;\n\n    if (spriteIds[idx] == SPRITE_NONE)\n    {\n        // Either TAG_ITEM_ICON or TAG_ITEM_ICON_ALT\n        FreeSpriteTilesByTag(TAG_ITEM_ICON + idx);\n        FreeSpritePaletteByTag(TAG_ITEM_ICON + idx);\n        spriteId = AddItemIconObject(TAG_ITEM_ICON + idx, TAG_ITEM_ICON + idx, itemId);\n        if (spriteId != MAX_SPRITES)\n        {\n            spriteIds[idx] = spriteId;\n            gSprites[spriteId].x2 = 24;\n            gSprites[spriteId].y2 = 140;\n        }\n    }\n}\n\nvoid DestroyItemMenuIcon(u8 idx)\n{\n    u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON];\n\n    if (spriteIds[idx] != SPRITE_NONE)\n    {\n        DestroySpriteAndFreeResources(&gSprites[spriteIds[idx]]);\n        spriteIds[idx] = SPRITE_NONE;\n    }\n}\n\n// attrId is either ITEMICON_TILES or ITEMICON_PAL\nconst u32 *GetItemIconGfxPtr(u16 itemId, u8 attrId)\n{\n    if (itemId > ITEMS_COUNT)\n        itemId = ITEM_NONE;\n    return sItemIconTable[itemId][attrId];\n}\n\nvoid CreateBerryPouchItemIcon(u16 itemId, u8 idx)\n{\n    u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON];\n    u8 spriteId;\n\n    if (spriteIds[idx] == SPRITE_NONE)\n    {\n        // Either TAG_ITEM_ICON or TAG_ITEM_ICON_ALT\n        FreeSpriteTilesByTag(TAG_ITEM_ICON + idx);\n        FreeSpritePaletteByTag(TAG_ITEM_ICON + idx);\n        spriteId = AddItemIconObject(TAG_ITEM_ICON + idx, TAG_ITEM_ICON + idx, itemId);\n        if (spriteId != MAX_SPRITES)\n        {\n            spriteIds[idx] = spriteId;\n            gSprites[spriteId].x2 = 24;\n            gSprites[spriteId].y2 = 147; // This value is the only difference from CreateItemMenuIcon\n        }\n    }\n}\n"
  },
  {
    "path": "src/item_pc.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"decompress.h\"\n#include \"graphics.h\"\n#include \"help_system.h\"\n#include \"item.h\"\n#include \"item_menu.h\"\n#include \"item_menu_icons.h\"\n#include \"list_menu.h\"\n#include \"item_pc.h\"\n#include \"item_use.h\"\n#include \"menu.h\"\n#include \"menu_helpers.h\"\n#include \"menu_indicators.h\"\n#include \"new_menu_helpers.h\"\n#include \"party_menu.h\"\n#include \"pc_screen_effect.h\"\n#include \"scanline_effect.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"text_window.h\"\n#include \"constants/items.h\"\n#include \"constants/quest_log.h\"\n#include \"constants/songs.h\"\n\nstruct ItemPcResources\n{\n    MainCallback savedCallback;\n    u8 moveModeOrigPos;\n    u8 itemMenuIconSlot;\n    u8 maxShowed;\n    u8 nItems;\n    u8 scrollIndicatorArrowPairId;\n    u16 withdrawQuantitySubmenuCursorPos;\n    s16 data[3];\n};\n\nstruct ItemPcStaticResources\n{\n    MainCallback savedCallback;\n    u16 scroll;\n    u16 row;\n    u8 initialized;\n};\n\nstatic EWRAM_DATA struct ItemPcResources * sStateDataPtr = NULL;\nstatic EWRAM_DATA u8 * sBg1TilemapBuffer = NULL;\nstatic EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL;\nstatic EWRAM_DATA u8 * sUnusedStringAllocation = NULL;\nstatic EWRAM_DATA struct ItemPcStaticResources sListMenuState = {};\nstatic EWRAM_DATA u8 sSubmenuWindowIds[3] = {};\n\nextern const struct CompressedSpriteSheet gBagSwapSpriteSheet;\nextern const struct CompressedSpritePalette gBagSwapSpritePalette;\n\nstatic void ItemPc_RunSetup(void);\nstatic bool8 ItemPc_DoGfxSetup(void);\nstatic void ItemPc_FadeAndBail(void);\nstatic void Task_ItemPcWaitFadeAndBail(u8 taskId);\nstatic bool8 ItemPc_InitBgs(void);\nstatic bool8 ItemPc_LoadGraphics(void);\nstatic bool8 ItemPc_AllocateResourcesForListMenu(void);\nstatic void ItemPc_BuildListMenuTemplate(void);\nstatic void ItemPc_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list);\nstatic void ItemPc_ItemPrintFunc(u8 windowId, u32 itemId, u8 y);\nstatic void ItemPc_PrintOrRemoveCursorAt(u8 y, u8 state);\nstatic void ItemPc_PrintWithdrawItem(void);\nstatic void ItemPc_PlaceTopMenuScrollIndicatorArrows(void);\nstatic void ItemPc_SetCursorPosition(void);\nstatic void ItemPc_FreeResources(void);\nstatic void Task_ItemPcTurnOff2(u8 taskId);\nstatic u16 ItemPc_GetItemIdBySlotId(u16 itemIndex);\nstatic u16 ItemPc_GetItemQuantityBySlotId(u16 itemIndex);\nstatic void ItemPc_CountPcItems(void);\nstatic void ItemPc_SetScrollPosition(void);\nstatic void Task_ItemPcMain(u8 taskId);\nstatic void ItemPc_MoveItemModeInit(u8 taskId, s16 pos);\nstatic void Task_ItemPcMoveItemModeRun(u8 taskId);\nstatic void ItemPc_InsertItemIntoNewSlot(u8 taskId, u32 pos);\nstatic void ItemPc_MoveItemModeCancel(u8 taskId, u32 pos);\nstatic void Task_ItemPcSubmenuInit(u8 taskId);\nstatic void Task_ItemPcSubmenuRun(u8 taskId);\nstatic void Task_ItemPcWithdraw(u8 taskId);\nstatic void ItemPc_DoWithdraw(u8 taskId);\nstatic void Task_ItemPcWaitButtonAndFinishWithdrawMultiple(u8 taskId);\nstatic void Task_ItemPcWaitButtonWithdrawMultipleFailed(u8 taskId);\nstatic void Task_ItemPcCleanUpWithdraw(u8 taskId);\nstatic void ItemPc_WithdrawMultipleInitWindow(u16 slotId);\nstatic void Task_ItemPcHandleWithdrawMultiple(u8 taskId);\nstatic void Task_ItemPcGive(u8 taskId);\nstatic void ItemPc_CB2_SwitchToPartyMenu(void);\nstatic void ItemPc_CB2_ReturnFromPartyMenu(void);\nstatic void gTask_ItemPcWaitButtonAndExitSubmenu(u8 taskId);\nstatic void Task_ItemPcCancel(u8 taskId);\nstatic void ItemPc_InitWindows(void);\nstatic void ItemPc_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx);\nstatic void ItemPc_SetBorderStyleOnWindow(u8 windowId);\nstatic u8 ItemPc_GetOrCreateSubwindow(u8 idx);\nstatic void ItemPc_DestroySubwindow(u8 idx);\nstatic void ItemPc_PrintOnWindow5WithContinueTask(u8 taskId, const u8 * str, TaskFunc taskFunc);\n\nstatic const struct BgTemplate sBgTemplates[2] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .priority = 0\n    }, {\n        .bg = 1,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 30,\n        .priority = 1\n    }\n};\n\nstatic const struct MenuAction sItemPcSubmenuOptions[] = {\n    {gText_Withdraw,          {.void_u8 = Task_ItemPcWithdraw}},\n    {gOtherText_Give,         {.void_u8 = Task_ItemPcGive}},\n    {gFameCheckerText_Cancel, {.void_u8 = Task_ItemPcCancel}}\n};\n\nstatic const u8 sTextColors[][3] = {\n    {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY},\n    {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY},\n    {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_DARK_GRAY},\n    {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_1, TEXT_COLOR_DARK_GRAY}\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 7,\n        .tilemapTop = 1,\n        .width = 19,\n        .height = 12,\n        .paletteNum = 15,\n        .baseBlock = 0x02bf\n    }, {\n        .bg = 0,\n        .tilemapLeft = 5,\n        .tilemapTop = 14,\n        .width = 25,\n        .height = 6,\n        .paletteNum = 13,\n        .baseBlock = 0x0229\n    }, {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 5,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x0215\n    }, {\n        .bg = 0,\n        .tilemapLeft = 24,\n        .tilemapTop = 15,\n        .width = 5,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x0201\n    }, {\n        .bg = 0,\n        .tilemapLeft = 22,\n        .tilemapTop = 13,\n        .width = 7,\n        .height = 6,\n        .paletteNum = 15,\n        .baseBlock = 0x01d7\n    }, {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 11,\n        .baseBlock = 0x016f\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sSubwindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 15,\n        .width = 14,\n        .height = 4,\n        .paletteNum = 12,\n        .baseBlock = 0x0137\n    }, {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 15,\n        .width = 16,\n        .height = 4,\n        .paletteNum = 12,\n        .baseBlock = 0x0137\n    }, {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 15,\n        .width = 23,\n        .height = 4,\n        .paletteNum = 12,\n        .baseBlock = 0x009b\n    }\n};\n\nvoid ItemPc_Init(u8 kind, MainCallback callback)\n{\n    u32 i;\n\n    if (kind >= 2)\n    {\n        SetMainCallback2(callback);\n        return;\n    }\n    if ((sStateDataPtr = Alloc(sizeof(struct ItemPcResources))) == NULL)\n    {\n        SetMainCallback2(callback);\n        return;\n    }\n    if (kind != 1)\n    {\n        sListMenuState.savedCallback = callback;\n        sListMenuState.scroll = sListMenuState.row = 0;\n    }\n    sStateDataPtr->moveModeOrigPos = 0xFF;\n    sStateDataPtr->itemMenuIconSlot = 0;\n    sStateDataPtr->scrollIndicatorArrowPairId = 0xFF;\n    sStateDataPtr->savedCallback = 0;\n    for (i = 0; i < 3; i++)\n    {\n        sStateDataPtr->data[i] = 0;\n    }\n    SetMainCallback2(ItemPc_RunSetup);\n}\n\nstatic void ItemPc_MainCB(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    DoScheduledBgTilemapCopiesToVram();\n    UpdatePaletteFade();\n}\n\nstatic void ItemPc_VBlankCB(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void ItemPc_RunSetup(void)\n{\n    while (1)\n    {\n        if (ItemPc_DoGfxSetup() == TRUE)\n            break;\n        if (MenuHelpers_IsLinkActive() == TRUE)\n            break;\n    }\n}\n\nstatic bool8 ItemPc_DoGfxSetup(void)\n{\n    u8 taskId;\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankHBlankCallbacksToNull();\n        ClearScheduledBgCopiesToVram();\n        gMain.state++;\n        break;\n    case 1:\n        ScanlineEffect_Stop();\n        gMain.state++;\n        break;\n    case 2:\n        FreeAllSpritePalettes();\n        gMain.state++;\n        break;\n    case 3:\n        ResetPaletteFade();\n        gMain.state++;\n        break;\n    case 4:\n        ResetSpriteData();\n        gMain.state++;\n        break;\n    case 5:\n        ResetItemMenuIconState();\n        gMain.state++;\n        break;\n    case 6:\n        ResetTasks();\n        gMain.state++;\n        break;\n    case 7:\n        if (ItemPc_InitBgs())\n        {\n            sStateDataPtr->data[0] = 0;\n            gMain.state++;\n        }\n        else\n        {\n            ItemPc_FadeAndBail();\n            return TRUE;\n        }\n        break;\n    case 8:\n        if (ItemPc_LoadGraphics() == TRUE)\n            gMain.state++;\n        break;\n    case 9:\n        ItemPc_InitWindows();\n        gMain.state++;\n        break;\n    case 10:\n        ItemPc_CountPcItems();\n        ItemPc_SetCursorPosition();\n        ItemPc_SetScrollPosition();\n        gMain.state++;\n        break;\n    case 11:\n        if (ItemPc_AllocateResourcesForListMenu())\n            gMain.state++;\n        else\n        {\n            ItemPc_FadeAndBail();\n            return TRUE;\n        }\n        break;\n    case 12:\n        ItemPc_BuildListMenuTemplate();\n        gMain.state++;\n        break;\n    case 13:\n        ItemPc_PrintWithdrawItem();\n        gMain.state++;\n        break;\n    case 14:\n        CreateSwapLine();\n        gMain.state++;\n        break;\n    case 15:\n        taskId = CreateTask(Task_ItemPcMain, 0);\n        gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row);\n        gMain.state++;\n        break;\n    case 16:\n        ItemPc_PlaceTopMenuScrollIndicatorArrows();\n        gMain.state++;\n        break;\n    case 17:\n        SetHelpContext(HELPCONTEXT_PLAYERS_PC_ITEMS);\n        gMain.state++;\n        break;\n    case 18:\n        if (sListMenuState.initialized == 1)\n        {\n            BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        }\n        gMain.state++;\n        break;\n    case 19:\n        if (sListMenuState.initialized == 1)\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        }\n        else\n        {\n            BeginPCScreenEffect_TurnOn(0, 0, 0);\n            ItemPc_SetInitializedFlag(TRUE);\n            PlaySE(SE_PC_LOGIN);\n        }\n        gMain.state++;\n        break;\n    case 20:\n        if (IsActiveOverworldLinkBusy() != TRUE)\n            gMain.state++;\n        break;\n    default:\n        SetVBlankCallback(ItemPc_VBlankCB);\n        SetMainCallback2(ItemPc_MainCB);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void ItemPc_FadeAndBail(void)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n    CreateTask(Task_ItemPcWaitFadeAndBail, 0);\n    SetVBlankCallback(ItemPc_VBlankCB);\n    SetMainCallback2(ItemPc_MainCB);\n}\n\nstatic void Task_ItemPcWaitFadeAndBail(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        SetMainCallback2(sListMenuState.savedCallback);\n        ItemPc_FreeResources();\n        DestroyTask(taskId);\n    }\n}\n\nstatic bool8 ItemPc_InitBgs(void)\n{\n    ResetAllBgsCoordinatesAndBgCntRegs();\n    sBg1TilemapBuffer = Alloc(0x800);\n    if (sBg1TilemapBuffer == NULL)\n        return FALSE;\n    memset(sBg1TilemapBuffer, 0, 0x800);\n    ResetBgsAndClearDma3BusyFlags(0);\n    InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));\n    SetBgTilemapBuffer(1, sBg1TilemapBuffer);\n    ScheduleBgCopyTilemapToVram(1);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n    SetGpuReg(REG_OFFSET_BLDCNT , 0);\n    ShowBg(0);\n    ShowBg(1);\n    return TRUE;\n}\n\nstatic bool8 ItemPc_LoadGraphics(void)\n{\n    switch (sStateDataPtr->data[0])\n    {\n    case 0:\n        ResetTempTileDataBuffers();\n        DecompressAndCopyTileDataToVram(1, gItemPcTiles, 0, 0, 0);\n        sStateDataPtr->data[0]++;\n        break;\n    case 1:\n        if (FreeTempTileDataBuffersIfPossible() != TRUE)\n        {\n            LZDecompressWram(gItemPcTilemap, sBg1TilemapBuffer);\n            sStateDataPtr->data[0]++;\n        }\n        break;\n    case 2:\n        LoadCompressedPalette(gItemPcBgPals, BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP);\n        sStateDataPtr->data[0]++;\n        break;\n    case 3:\n        LoadCompressedSpriteSheet(&gBagSwapSpriteSheet);\n        sStateDataPtr->data[0]++;\n        break;\n    default:\n        LoadCompressedSpritePalette(&gBagSwapSpritePalette);\n        sStateDataPtr->data[0] = 0;\n        return TRUE;\n    }\n    return FALSE;\n}\n\n#define try_alloc(ptr__, size) ({ \\\n    void ** ptr = (void **)&(ptr__);             \\\n    *ptr = Alloc(size);                 \\\n    if (*ptr == NULL)                   \\\n    {                                   \\\n        ItemPc_FreeResources();                  \\\n        ItemPc_FadeAndBail();                  \\\n        return FALSE;                   \\\n    }                                   \\\n})\n\nstatic bool8 ItemPc_AllocateResourcesForListMenu(void)\n{\n    try_alloc(sListMenuItems, sizeof(struct ListMenuItem) * (PC_ITEMS_COUNT + 1));\n    try_alloc(sUnusedStringAllocation, 14 * (PC_ITEMS_COUNT + 1));\n    return TRUE;\n}\n\nstatic void ItemPc_BuildListMenuTemplate(void)\n{\n    u32 i;\n\n    for (i = 0; i < sStateDataPtr->nItems; i++)\n    {\n        sListMenuItems[i].label = ItemId_GetName(gSaveBlock1Ptr->pcItems[i].itemId);\n        sListMenuItems[i].index = i;\n    }\n    sListMenuItems[i].label = gFameCheckerText_Cancel;\n    sListMenuItems[i].index = -2;\n\n    gMultiuseListMenuTemplate.items = sListMenuItems;\n    gMultiuseListMenuTemplate.totalItems = sStateDataPtr->nItems + 1;\n    gMultiuseListMenuTemplate.windowId = 0;\n    gMultiuseListMenuTemplate.header_X = 0;\n    gMultiuseListMenuTemplate.item_X = 9;\n    gMultiuseListMenuTemplate.cursor_X = 1;\n    gMultiuseListMenuTemplate.lettersSpacing = 1;\n    gMultiuseListMenuTemplate.itemVerticalPadding = 2;\n    gMultiuseListMenuTemplate.upText_Y = 2;\n    gMultiuseListMenuTemplate.maxShowed = sStateDataPtr->maxShowed;\n    gMultiuseListMenuTemplate.fontId = FONT_NORMAL;\n    gMultiuseListMenuTemplate.cursorPal = 2;\n    gMultiuseListMenuTemplate.fillValue = 0;\n    gMultiuseListMenuTemplate.cursorShadowPal = 3;\n    gMultiuseListMenuTemplate.moveCursorFunc = ItemPc_MoveCursorFunc;\n    gMultiuseListMenuTemplate.itemPrintFunc = ItemPc_ItemPrintFunc;\n    gMultiuseListMenuTemplate.scrollMultiple = 0;\n    gMultiuseListMenuTemplate.cursorKind = 0;\n}\n\nstatic void ItemPc_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list)\n{\n    u16 itemId;\n    const u8 * desc;\n    if (onInit != TRUE)\n        PlaySE(SE_SELECT);\n\n    if (sStateDataPtr->moveModeOrigPos == 0xFF)\n    {\n        DestroyItemMenuIcon(sStateDataPtr->itemMenuIconSlot ^ 1);\n        if (itemIndex != -2)\n        {\n            itemId = ItemPc_GetItemIdBySlotId(itemIndex);\n            CreateItemMenuIcon(itemId, sStateDataPtr->itemMenuIconSlot);\n            if (ItemId_GetPocket(itemId) == POCKET_TM_CASE)\n                desc = gMoveNames[ItemIdToBattleMoveId(itemId)];\n            else\n                desc = ItemId_GetDescription(itemId);\n        }\n        else\n        {\n            CreateItemMenuIcon(ITEMS_COUNT, sStateDataPtr->itemMenuIconSlot);\n            desc = gText_ReturnToPC;\n        }\n        sStateDataPtr->itemMenuIconSlot ^= 1;\n        FillWindowPixelBuffer(1, 0);\n        ItemPc_AddTextPrinterParameterized(1, FONT_NORMAL, desc, 0, 3, 2, 0, 0, 3);\n    }\n}\n\nstatic void ItemPc_ItemPrintFunc(u8 windowId, u32 itemId, u8 y)\n{\n    if (sStateDataPtr->moveModeOrigPos != 0xFF)\n    {\n        if (sStateDataPtr->moveModeOrigPos == (u8)itemId)\n            ItemPc_PrintOrRemoveCursorAt(y, 2);\n        else\n            ItemPc_PrintOrRemoveCursorAt(y, 0xFF);\n    }\n    if (itemId != -2)\n    {\n        u16 quantity = ItemPc_GetItemQuantityBySlotId(itemId);\n        ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_RIGHT_ALIGN, 3);\n        StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n        ItemPc_AddTextPrinterParameterized(windowId, FONT_SMALL, gStringVar4, 110, y, 0, 0, 0xFF, 1);\n    }\n}\n\nstatic void ItemPc_PrintOrRemoveCursor(u8 listMenuId, u8 colorIdx)\n{\n    ItemPc_PrintOrRemoveCursorAt(ListMenuGetYCoordForPrintingArrowCursor(listMenuId), colorIdx);\n}\n\nstatic void ItemPc_PrintOrRemoveCursorAt(u8 y, u8 colorIdx)\n{\n    if (colorIdx == 0xFF)\n    {\n        u8 maxWidth = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_WIDTH);\n        u8 maxHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT);\n        FillWindowPixelRect(0, 0, 0, y, maxWidth, maxHeight);\n    }\n    else\n    {\n        ItemPc_AddTextPrinterParameterized(0, FONT_NORMAL, gText_SelectorArrow2, 0, y, 0, 0, 0, colorIdx);\n    }\n}\n\nstatic void ItemPc_PrintWithdrawItem(void)\n{\n    ItemPc_AddTextPrinterParameterized(2, FONT_SMALL, gText_WithdrawItem, 0, 1, 0, 1, 0, 0);\n}\n\nstatic void ItemPc_PlaceTopMenuScrollIndicatorArrows(void)\n{\n    sStateDataPtr->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParameterized(2, 128, 8, 104, sStateDataPtr->nItems - sStateDataPtr->maxShowed + 1, 110, 110, &sListMenuState.scroll);\n}\n\nstatic void ItemPc_PlaceWithdrawQuantityScrollIndicatorArrows(void)\n{\n    sStateDataPtr->withdrawQuantitySubmenuCursorPos = 1;\n    sStateDataPtr->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParameterized(2, 212, 120, 152, 2, 110, 110, &sStateDataPtr->withdrawQuantitySubmenuCursorPos);\n}\n\nstatic void ItemPc_RemoveScrollIndicatorArrowPair(void)\n{\n    if (sStateDataPtr->scrollIndicatorArrowPairId != 0xFF)\n    {\n        RemoveScrollIndicatorArrowPair(sStateDataPtr->scrollIndicatorArrowPairId);\n        sStateDataPtr->scrollIndicatorArrowPairId = 0xFF;\n    }\n}\n\nstatic void ItemPc_SetCursorPosition(void)\n{\n    if (sListMenuState.scroll != 0 && sListMenuState.scroll + sStateDataPtr->maxShowed > sStateDataPtr->nItems + 1)\n        sListMenuState.scroll = (sStateDataPtr->nItems + 1) - sStateDataPtr->maxShowed;\n    if (sListMenuState.scroll + sListMenuState.row >= sStateDataPtr->nItems + 1)\n    {\n        if (sStateDataPtr->nItems + 1 < 2)\n            sListMenuState.row = 0;\n        else\n            sListMenuState.row = sStateDataPtr->nItems;\n    }\n}\n\n#define try_free(ptr) ({        \\\n    void ** ptr__ = (void **)&(ptr);   \\\n    if (*ptr__ != NULL)                \\\n        Free(*ptr__);                  \\\n})\n\nstatic void ItemPc_FreeResources(void)\n{\n    try_free(sStateDataPtr);\n    try_free(sBg1TilemapBuffer);\n    try_free(sListMenuItems);\n    try_free(sUnusedStringAllocation);\n    FreeAllWindowBuffers();\n}\n\nstatic void Task_ItemPcTurnOff1(u8 taskId)\n{\n    if (sListMenuState.initialized == 1)\n    {\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n    }\n    else\n    {\n        BeginPCScreenEffect_TurnOff(0, 0, 0);\n        PlaySE(SE_PC_OFF);\n    }\n    gTasks[taskId].func = Task_ItemPcTurnOff2;\n}\n\nstatic void Task_ItemPcTurnOff2(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (!gPaletteFade.active && !IsPCScreenEffectRunning_TurnOff())\n    {\n        DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row);\n        if (sStateDataPtr->savedCallback != NULL)\n            SetMainCallback2(sStateDataPtr->savedCallback);\n        else\n            SetMainCallback2(sListMenuState.savedCallback);\n        ItemPc_RemoveScrollIndicatorArrowPair();\n        ItemPc_FreeResources();\n        DestroyTask(taskId);\n    }\n}\n\nstatic u8 ItemPc_GetCursorPosition(void)\n{\n    return sListMenuState.scroll + sListMenuState.row;\n}\n\nstatic u16 ItemPc_GetItemIdBySlotId(u16 idx)\n{\n    return gSaveBlock1Ptr->pcItems[idx].itemId;\n}\n\nstatic u16 ItemPc_GetItemQuantityBySlotId(u16 idx)\n{\n    return GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[idx].quantity);\n}\n\nstatic void ItemPc_CountPcItems(void)\n{\n    u32 i;\n\n    ItemPcCompaction();\n    sStateDataPtr->nItems = 0;\n    for (i = 0; i < PC_ITEMS_COUNT; sStateDataPtr->nItems++, i++)\n    {\n        if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE)\n            break;\n    }\n    sStateDataPtr->maxShowed = sStateDataPtr->nItems + 1 <= 6 ? sStateDataPtr->nItems + 1 : 6;\n}\n\nstatic void ItemPc_SetScrollPosition(void)\n{\n    u32 i;\n\n    if (sListMenuState.row > 3)\n    {\n        for (i = 0; i <= sListMenuState.row - 3; sListMenuState.row--, sListMenuState.scroll++, i++)\n        {\n            if (sListMenuState.scroll + sStateDataPtr->maxShowed == sStateDataPtr->nItems + 1)\n                break;\n        }\n    }\n}\n\nstatic void ItemPc_SetMessageWindowPalette(int palIdx)\n{\n    SetBgTilemapPalette(1, 0, 14, 30, 6, palIdx + 1);\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nvoid ItemPc_SetInitializedFlag(bool8 flag)\n{\n    sListMenuState.initialized = flag;\n}\n\nstatic void Task_ItemPcMain(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    u16 scroll;\n    u16 row;\n    s32 input;\n\n    if (!gPaletteFade.active && !IsPCScreenEffectRunning_TurnOn())\n    {\n        if (JOY_NEW(SELECT_BUTTON))\n        {\n            ListMenuGetScrollAndRow(data[0], &scroll, &row);\n            if (scroll + row != sStateDataPtr->nItems)\n            {\n                PlaySE(SE_SELECT);\n                ItemPc_MoveItemModeInit(taskId, scroll + row);\n                return;\n            }\n        }\n        input = ListMenu_ProcessInput(data[0]);\n        ListMenuGetScrollAndRow(data[0], &sListMenuState.scroll, &sListMenuState.row);\n        switch (input)\n        {\n        case -1:\n            break;\n        case -2:\n            PlaySE(SE_SELECT);\n            ItemPc_SetInitializedFlag(FALSE);\n            gTasks[taskId].func = Task_ItemPcTurnOff1;\n            break;\n        default:\n            PlaySE(SE_SELECT);\n            ItemPc_SetMessageWindowPalette(1);\n            ItemPc_RemoveScrollIndicatorArrowPair();\n            data[1] = input;\n            data[2] = ItemPc_GetItemQuantityBySlotId(input);\n            ItemPc_PrintOrRemoveCursor(data[0], 2);\n            gTasks[taskId].func = Task_ItemPcSubmenuInit;\n            break;\n        }\n    }\n}\n\nstatic void ItemPc_ReturnFromSubmenu(u8 taskId)\n{\n    ItemPc_SetMessageWindowPalette(0);\n    ItemPc_PlaceTopMenuScrollIndicatorArrows();\n    gTasks[taskId].func = Task_ItemPcMain;\n}\n\nstatic void ItemPc_MoveItemModeInit(u8 taskId, s16 pos)\n{\n    s16 * data = gTasks[taskId].data;\n\n    ListMenuSetTemplateField(data[0], LISTFIELD_CURSORKIND, 1);\n    data[1] = pos;\n    sStateDataPtr->moveModeOrigPos = pos;\n    StringCopy(gStringVar1, ItemId_GetName(ItemPc_GetItemIdBySlotId(data[1])));\n    StringExpandPlaceholders(gStringVar4, gOtherText_WhereShouldTheStrVar1BePlaced);\n    FillWindowPixelBuffer(1, 0x00);\n    ItemPc_AddTextPrinterParameterized(1, FONT_NORMAL, gStringVar4, 0, 3, 2, 3, 0, 0);\n    UpdateSwapLinePos(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0]));\n    SetSwapLineInvisibility(FALSE);\n    ItemPc_PrintOrRemoveCursor(data[0], 2);\n    gTasks[taskId].func = Task_ItemPcMoveItemModeRun;\n}\n\nstatic void Task_ItemPcMoveItemModeRun(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    ListMenu_ProcessInput(data[0]);\n    ListMenuGetScrollAndRow(data[0], &sListMenuState.scroll, &sListMenuState.row);\n    UpdateSwapLinePos(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0]));\n    if (JOY_NEW(A_BUTTON | SELECT_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        sStateDataPtr->moveModeOrigPos = 0xFF;\n        ItemPc_InsertItemIntoNewSlot(taskId, sListMenuState.scroll + sListMenuState.row);\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        sStateDataPtr->moveModeOrigPos = 0xFF;\n        ItemPc_MoveItemModeCancel(taskId, sListMenuState.scroll + sListMenuState.row);\n    }\n}\n\nstatic void ItemPc_InsertItemIntoNewSlot(u8 taskId, u32 pos)\n{\n    s16 * data = gTasks[taskId].data;\n    if (data[1] == pos || data[1] == pos - 1)\n        ItemPc_MoveItemModeCancel(taskId, pos);\n    else\n    {\n        MoveItemSlotInList(gSaveBlock1Ptr->pcItems, data[1], pos);\n        DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row);\n        if (data[1] < pos)\n            sListMenuState.row--;\n        ItemPc_BuildListMenuTemplate();\n        data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row);\n        SetSwapLineInvisibility(TRUE);\n        gTasks[taskId].func = Task_ItemPcMain;\n    }\n}\n\nstatic void ItemPc_MoveItemModeCancel(u8 taskId, u32 pos)\n{\n    s16 * data = gTasks[taskId].data;\n\n    DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row);\n    if (data[1] < pos)\n        sListMenuState.row--;\n    ItemPc_BuildListMenuTemplate();\n    data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row);\n    SetSwapLineInvisibility(TRUE);\n    gTasks[taskId].func = Task_ItemPcMain;\n}\n\nstatic void Task_ItemPcSubmenuInit(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    u8 windowId;\n\n    ItemPc_SetBorderStyleOnWindow(4);\n    windowId = ItemPc_GetOrCreateSubwindow(0);\n    PrintTextArray(4, FONT_NORMAL, 8, 2, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, 3, sItemPcSubmenuOptions);\n    Menu_InitCursor(4, FONT_NORMAL, 0, 2, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, 3, 0);\n    CopyItemName(ItemPc_GetItemIdBySlotId(data[1]), gStringVar1);\n    StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected);\n    ItemPc_AddTextPrinterParameterized(windowId, FONT_NORMAL, gStringVar4, 0, 2, 1, 0, 0, 1);\n    ScheduleBgCopyTilemapToVram(0);\n    gTasks[taskId].func = Task_ItemPcSubmenuRun;\n}\n\nstatic void Task_ItemPcSubmenuRun(u8 taskId)\n{\n    s8 input = Menu_ProcessInputNoWrapAround();\n    switch (input)\n    {\n    case -1:\n        PlaySE(SE_SELECT);\n        Task_ItemPcCancel(taskId);\n        break;\n    case -2:\n        break;\n    default:\n        PlaySE(SE_SELECT);\n        sItemPcSubmenuOptions[input].func.void_u8(taskId);\n    }\n}\n\nstatic void Task_ItemPcWithdraw(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    ClearStdWindowAndFrameToTransparent(4, FALSE);\n    ItemPc_DestroySubwindow(0);\n    ClearWindowTilemap(4);\n    data[8] = 1;\n    if (ItemPc_GetItemQuantityBySlotId(data[1]) == 1)\n    {\n        PutWindowTilemap(0);\n        ScheduleBgCopyTilemapToVram(0);\n        ItemPc_DoWithdraw(taskId);\n    }\n    else\n    {\n        PutWindowTilemap(0);\n        ItemPc_WithdrawMultipleInitWindow(data[1]);\n        ItemPc_PlaceWithdrawQuantityScrollIndicatorArrows();\n        gTasks[taskId].func = Task_ItemPcHandleWithdrawMultiple;\n    }\n}\n\nstatic void ItemPc_DoWithdraw(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    u16 itemId = ItemPc_GetItemIdBySlotId(data[1]);\n    u8 windowId;\n\n    if (AddBagItem(itemId, data[8]) == TRUE)\n    {\n        ItemUse_SetQuestLogEvent(QL_EVENT_WITHDREW_ITEM_PC, NULL, itemId, 0xFFFF);\n        CopyItemName(itemId, gStringVar1);\n        ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);\n        StringExpandPlaceholders(gStringVar4, gText_WithdrewQuantItem);\n        windowId = ItemPc_GetOrCreateSubwindow(2);\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, gStringVar4, 0, 2, 0, NULL);\n        gTasks[taskId].func = Task_ItemPcWaitButtonAndFinishWithdrawMultiple;\n    }\n    else\n    {\n        windowId = ItemPc_GetOrCreateSubwindow(2);\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_NoMoreRoomInBag, 0, 2, 0, NULL);\n        gTasks[taskId].func = Task_ItemPcWaitButtonWithdrawMultipleFailed;\n    }\n}\n\nstatic void Task_ItemPcWaitButtonAndFinishWithdrawMultiple(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    u16 itemId;\n\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        itemId = ItemPc_GetItemIdBySlotId(data[1]);\n        RemovePCItem(itemId, data[8]);\n        ItemPcCompaction();\n        Task_ItemPcCleanUpWithdraw(taskId);\n    }\n}\n\nstatic void Task_ItemPcWaitButtonWithdrawMultipleFailed(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        Task_ItemPcCleanUpWithdraw(taskId);\n    }\n}\n\nstatic void Task_ItemPcCleanUpWithdraw(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    ItemPc_DestroySubwindow(2);\n    PutWindowTilemap(1);\n    DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row);\n    ItemPc_CountPcItems();\n    ItemPc_SetCursorPosition();\n    ItemPc_BuildListMenuTemplate();\n    data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row);\n    ScheduleBgCopyTilemapToVram(0);\n    ItemPc_ReturnFromSubmenu(taskId);\n}\n\nstatic void ItemPc_WithdrawMultipleInitWindow(u16 slotId)\n{\n    u16 itemId = ItemPc_GetItemIdBySlotId(slotId);\n\n    CopyItemName(itemId, gStringVar1);\n    StringExpandPlaceholders(gStringVar4, gText_WithdrawHowMany);\n    AddTextPrinterParameterized(ItemPc_GetOrCreateSubwindow(1), FONT_NORMAL, gStringVar4, 0, 2, 0, NULL);\n    ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 3);\n    StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n    ItemPc_SetBorderStyleOnWindow(3);\n    ItemPc_AddTextPrinterParameterized(3, FONT_SMALL, gStringVar4, 8, 10, 1, 0, 0, 1);\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nstatic void UpdateWithdrawQuantityDisplay(s16 quantity)\n{\n    FillWindowPixelRect(3, PIXEL_FILL(1), 10, 10, 28, 12);\n    ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_LEADING_ZEROS, 3);\n    StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n    ItemPc_AddTextPrinterParameterized(3, FONT_SMALL, gStringVar4, 8, 10, 1, 0, 0, 1);\n}\n\nstatic void Task_ItemPcHandleWithdrawMultiple(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)\n        UpdateWithdrawQuantityDisplay(data[8]);\n    else if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        ItemPc_DestroySubwindow(1);\n        ClearWindowTilemap(3);\n        PutWindowTilemap(0);\n        ItemPc_PrintOrRemoveCursor(data[0], 1);\n        ScheduleBgCopyTilemapToVram(0);\n        ItemPc_RemoveScrollIndicatorArrowPair();\n        ItemPc_DoWithdraw(taskId);\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        ClearStdWindowAndFrameToTransparent(3, FALSE);\n        ItemPc_DestroySubwindow(1);\n        ClearWindowTilemap(3);\n        PutWindowTilemap(0);\n        PutWindowTilemap(1);\n        ItemPc_PrintOrRemoveCursor(data[0], 1);\n        ScheduleBgCopyTilemapToVram(0);\n        ItemPc_RemoveScrollIndicatorArrowPair();\n        ItemPc_ReturnFromSubmenu(taskId);\n    }\n}\n\nstatic void Task_ItemPcGive(u8 taskId)\n{\n    if (CalculatePlayerPartyCount() == 0)\n    {\n        ClearStdWindowAndFrameToTransparent(4, FALSE);\n        ItemPc_DestroySubwindow(0);\n        ClearWindowTilemap(4);\n        PutWindowTilemap(0);\n        ItemPc_PrintOnWindow5WithContinueTask(taskId, gText_ThereIsNoPokemon, gTask_ItemPcWaitButtonAndExitSubmenu);\n    }\n    else\n    {\n        sStateDataPtr->savedCallback = ItemPc_CB2_SwitchToPartyMenu;\n        Task_ItemPcTurnOff1(taskId);\n    }\n}\n\nstatic void ItemPc_CB2_SwitchToPartyMenu(void)\n{\n    InitPartyMenu(0, 0, 6, 0, 6, Task_HandleChooseMonInput, ItemPc_CB2_ReturnFromPartyMenu);\n    gPartyMenu.bagItem = ItemPc_GetItemIdBySlotId(ItemPc_GetCursorPosition());\n}\n\nstatic void ItemPc_CB2_ReturnFromPartyMenu(void)\n{\n    ItemPc_Init(1, NULL);\n}\n\nstatic void gTask_ItemPcWaitButtonAndExitSubmenu(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        ClearDialogWindowAndFrameToTransparent(5, FALSE);\n        ClearWindowTilemap(5);\n        PutWindowTilemap(1);\n        ItemPc_PrintOrRemoveCursor(data[0], 1);\n        ScheduleBgCopyTilemapToVram(0);\n        ItemPc_ReturnFromSubmenu(taskId);\n    }\n}\n\nstatic void Task_ItemPcCancel(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    ClearStdWindowAndFrameToTransparent(4, FALSE);\n    ItemPc_DestroySubwindow(0);\n    ClearWindowTilemap(4);\n    PutWindowTilemap(0);\n    PutWindowTilemap(1);\n    ItemPc_PrintOrRemoveCursor(data[0], 1);\n    ScheduleBgCopyTilemapToVram(0);\n    ItemPc_ReturnFromSubmenu(taskId);\n}\n\nstatic void ItemPc_InitWindows(void)\n{\n    u32 i;\n\n    InitWindows(sWindowTemplates);\n    DeactivateAllTextPrinters();\n    LoadUserWindowGfx(0, 0x3C0, BG_PLTT_ID(14));\n    LoadStdWindowGfx(0, 0x3A3, BG_PLTT_ID(12));\n    LoadMenuMessageWindowGfx(0, 0x3AC, BG_PLTT_ID(11));\n    LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(13), PLTT_SIZE_4BPP);\n    LoadPalette(gStandardMenuPalette, BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n    for (i = 0; i < 3; i++)\n    {\n        FillWindowPixelBuffer(i, 0x00);\n        PutWindowTilemap(i);\n    }\n    ScheduleBgCopyTilemapToVram(0);\n    for (i = 0; i < 3; i++)\n        sSubmenuWindowIds[i] = 0xFF;\n}\n\nstatic void unused_ItemPc_AddTextPrinterParameterized(u8 windowId, const u8 * string, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed)\n{\n    struct TextPrinterTemplate template;\n\n    template.currentChar = string;\n    template.windowId = windowId;\n    template.fontId = FONT_NORMAL_COPY_2;\n    template.x = x;\n    template.y = y;\n    template.currentX = x;\n    template.currentY = y;\n    template.fgColor = 2;\n    template.bgColor = 0;\n    template.shadowColor = 3;\n    template.unk = GetFontAttribute(FONT_NORMAL_COPY_2, FONTATTR_UNKNOWN);\n    template.letterSpacing = letterSpacing + GetFontAttribute(FONT_NORMAL_COPY_2, FONTATTR_LETTER_SPACING);\n    template.lineSpacing = lineSpacing + GetFontAttribute(FONT_NORMAL_COPY_2, FONTATTR_LINE_SPACING);\n    AddTextPrinter(&template, speed, NULL);\n}\n\nstatic void ItemPc_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx)\n{\n    AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, sTextColors[colorIdx], speed, str);\n}\n\nstatic void ItemPc_SetBorderStyleOnWindow(u8 windowId)\n{\n    DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, 0x3C0, 14);\n}\n\nstatic u8 ItemPc_GetOrCreateSubwindow(u8 idx)\n{\n    if (sSubmenuWindowIds[idx] == 0xFF)\n    {\n        sSubmenuWindowIds[idx] = AddWindow(&sSubwindowTemplates[idx]);\n        DrawStdFrameWithCustomTileAndPalette(sSubmenuWindowIds[idx], TRUE, 0x3A3, 12);\n    }\n\n    return sSubmenuWindowIds[idx];\n}\n\nstatic void ItemPc_DestroySubwindow(u8 idx)\n{\n    ClearStdWindowAndFrameToTransparent(sSubmenuWindowIds[idx], FALSE);\n    ClearWindowTilemap(sSubmenuWindowIds[idx]); // redundant\n    RemoveWindow(sSubmenuWindowIds[idx]);\n    sSubmenuWindowIds[idx] = 0xFF;\n}\n\nstatic u8 ItemPc_GetSubwindow(u8 idx)\n{\n    return sSubmenuWindowIds[idx];\n}\n\nstatic void ItemPc_PrintOnWindow5WithContinueTask(u8 taskId, const u8 * str, TaskFunc taskFunc)\n{\n    DisplayMessageAndContinueTask(taskId, 5, 0x3AC, 0x0B, FONT_NORMAL, GetTextSpeedSetting(), str, taskFunc);\n    ScheduleBgCopyTilemapToVram(0);\n}\n"
  },
  {
    "path": "src/item_use.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"berry_pouch.h\"\n#include \"berry_powder.h\"\n#include \"bike.h\"\n#include \"coins.h\"\n#include \"event_data.h\"\n#include \"field_effect.h\"\n#include \"field_fadetransition.h\"\n#include \"event_object_movement.h\"\n#include \"field_player_avatar.h\"\n#include \"field_specials.h\"\n#include \"field_weather.h\"\n#include \"fieldmap.h\"\n#include \"item.h\"\n#include \"item_menu.h\"\n#include \"item_use.h\"\n#include \"itemfinder.h\"\n#include \"mail.h\"\n#include \"event_object_lock.h\"\n#include \"metatile_behavior.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"quest_log.h\"\n#include \"region_map.h\"\n#include \"script.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"teachy_tv.h\"\n#include \"tm_case.h\"\n#include \"vs_seeker.h\"\n#include \"constants/sound.h\"\n#include \"constants/items.h\"\n#include \"constants/item_effects.h\"\n#include \"constants/maps.h\"\n#include \"constants/moves.h\"\n#include \"constants/songs.h\"\n#include \"constants/field_weather.h\"\n\nstatic EWRAM_DATA void (*sItemUseOnFieldCB)(u8 taskId) = NULL;\n\nstatic void FieldCB_FadeInFromBlack(void);\nstatic void Task_WaitFadeIn_CallItemUseOnFieldCB(u8 taskId);\nstatic void Task_ItemUse_CloseMessageBoxAndReturnToField(u8 taskId);\nstatic void Task_ItemUseWaitForFade(u8 taskId);\nstatic bool8 FieldCB2_UseItemFromField(void);\nstatic void CB2_CheckMail(void);\nstatic void ItemUseOnFieldCB_Bicycle(u8 taskId);\nstatic bool8 CanFish(void);\nstatic void ItemUseOnFieldCB_Rod(u8 taskId);\nstatic void Task_PlayPokeFlute(u8 taskId);\nstatic void Task_DisplayPokeFluteMessage(u8 taskId);\nstatic void InitTMCaseFromBag(void);\nstatic void Task_InitTMCaseFromField(u8 taskId);\nstatic void InitBerryPouchFromBag(void);\nstatic void Task_InitBerryPouchFromField(u8 taskId);\nstatic void InitBerryPouchFromBattle(void);\nstatic void InitTeachyTvFromBag(void);\nstatic void Task_InitTeachyTvFromField(u8 taskId);\nstatic void Task_UseRepel(u8 taskId);\nstatic void RemoveUsedItem(void);\nstatic void Task_UsedBlackWhiteFlute(u8 taskId);\nstatic void ItemUseOnFieldCB_EscapeRope(u8 taskId);\nstatic void UseTownMapFromBag(void);\nstatic void Task_UseTownMapFromField(u8 taskId);\nstatic void UseFameCheckerFromBag(void);\nstatic void Task_UseFameCheckerFromField(u8 taskId);\nstatic void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId);\nstatic void Task_BattleUse_StatBooster_WaitButton_ReturnToBattle(u8 taskId);\n\n// unknown unused data.\n// It's curiously about the size of an array of values indexed by species (including padding),\n// but the arrangement of values is not sensible (e.g., not giving all \"old unown\" the same value).\nstatic const u8 sUnused[] = {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x04, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x21, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x40, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x40, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x40, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x40, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x1f, 0x00, 0xe0, 0x03, 0x00, 0x7c,\n    0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\n\nstatic void (*const sExitCallbackByItemType[])(void) = {\n    [ITEM_TYPE_PARTY_MENU - 1] = CB2_ShowPartyMenuForItemUse,\n    [ITEM_TYPE_FIELD      - 1] = CB2_ReturnToField,\n    [ITEM_TYPE_UNUSED     - 1] = NULL,\n    [ITEM_TYPE_BAG_MENU   - 1] = NULL,\n};\n\nstatic void SetUpItemUseCallback(u8 taskId)\n{\n    u8 itemType;\n    if (gSpecialVar_ItemId == ITEM_ENIGMA_BERRY)\n        itemType = gTasks[taskId].data[4] - 1;\n    else\n        itemType = ItemId_GetType(gSpecialVar_ItemId) - 1;\n    if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH)\n    {\n        BerryPouch_SetExitCallback(sExitCallbackByItemType[itemType]);\n        BerryPouch_StartFadeToExitCallback(taskId);\n    }\n    else\n    {\n        ItemMenu_SetExitCallback(sExitCallbackByItemType[itemType]);\n        if (itemType == ITEM_TYPE_FIELD - 1)\n            Bag_BeginCloseWin0Animation();\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n}\n\nstatic void SetUpItemUseOnFieldCallback(u8 taskId)\n{\n    if (gTasks[taskId].data[3] != 1)\n    {\n        gFieldCallback = FieldCB_FadeInFromBlack;\n        SetUpItemUseCallback(taskId);\n    }\n    else\n        sItemUseOnFieldCB(taskId);\n}\n\nstatic void FieldCB_FadeInFromBlack(void)\n{\n    FadeInFromBlack();\n    CreateTask(Task_WaitFadeIn_CallItemUseOnFieldCB, 8);\n}\n\nstatic void Task_WaitFadeIn_CallItemUseOnFieldCB(u8 taskId)\n{\n    if (IsWeatherNotFadingIn() == TRUE)\n        sItemUseOnFieldCB(taskId);\n}\n\nstatic void DisplayItemMessageInCurrentContext(u8 taskId, bool8 inField, u8 fontId, const u8 *str)\n{\n    StringExpandPlaceholders(gStringVar4, str);\n    if (inField == FALSE)\n        DisplayItemMessageInBag(taskId, fontId, gStringVar4, Task_ReturnToBagFromContextMenu);\n    else\n        DisplayItemMessageOnField(taskId, fontId, gStringVar4, Task_ItemUse_CloseMessageBoxAndReturnToField);\n}\n\nstatic void PrintNotTheTimeToUseThat(u8 taskId, bool8 inField)\n{\n    DisplayItemMessageInCurrentContext(taskId, inField, FONT_MALE, gText_OakForbidsUseOfItemHere);\n}\n\nstatic void Task_ItemUse_CloseMessageBoxAndReturnToField(u8 taskId)\n{\n    ClearDialogWindowAndFrame(0, 1);\n    DestroyTask(taskId);\n    ClearPlayerHeldMovementAndUnfreezeObjectEvents();\n    UnlockPlayerFieldControls();\n}\n\nu8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId)\n{\n    if (ItemId_GetPocket(itemId) == POCKET_TM_CASE)\n        return 1;\n    else if (ItemId_GetFieldFunc(itemId) == FieldUseFunc_EvoItem)\n        return 2;\n    else\n        return 0;\n}\n\nstatic void SetFieldCallback2ForItemUse(void)\n{\n    gFieldCallback2 = FieldCB2_UseItemFromField;\n}\n\nstatic bool8 FieldCB2_UseItemFromField(void)\n{\n    FreezeObjectEvents();\n    LockPlayerFieldControls();\n    FadeInFromBlack();\n    CreateTask(Task_ItemUseWaitForFade, 10);\n    gExitStairsMovementDisabled = FALSE;\n    return TRUE;\n}\n\nstatic void Task_ItemUseWaitForFade(u8 taskId)\n{\n    if (IsWeatherNotFadingIn() == TRUE)\n    {\n        UnfreezeObjectEvents();\n        UnlockPlayerFieldControls();\n        DestroyTask(taskId);\n    }\n}\n\nvoid FieldUseFunc_Mail(u8 taskId)\n{\n    ItemMenu_SetExitCallback(CB2_CheckMail);\n    ItemMenu_StartFadeToExitCallback(taskId);\n}\n\nstatic void CB2_CheckMail(void)\n{\n    struct Mail mail;\n\n    mail.itemId = gSpecialVar_ItemId;\n    ReadMail(&mail, CB2_BagMenuFromStartMenu, FALSE);\n}\n\nvoid FieldUseFunc_Bike(u8 taskId)\n{\n    s16 x, y;\n    u8 behavior;\n\n    PlayerGetDestCoords(&x, &y);\n    behavior = MapGridGetMetatileBehaviorAt(x, y);\n\n    if (FlagGet(FLAG_SYS_ON_CYCLING_ROAD) == TRUE\n     || MetatileBehavior_IsVerticalRail(behavior) == TRUE\n     || MetatileBehavior_IsHorizontalRail(behavior) == TRUE\n     || MetatileBehavior_IsIsolatedVerticalRail(behavior) == TRUE\n     || MetatileBehavior_IsIsolatedHorizontalRail(behavior) == TRUE)\n        DisplayItemMessageInCurrentContext(taskId, gTasks[taskId].data[3], FONT_NORMAL, gText_CantDismountBike);\n    else if (Overworld_IsBikingAllowed() == TRUE && !IsBikingDisallowedByPlayer())\n    {\n        sItemUseOnFieldCB = ItemUseOnFieldCB_Bicycle;\n        SetUpItemUseOnFieldCallback(taskId);\n    }\n    else\n        PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]);\n}\n\nstatic void ItemUseOnFieldCB_Bicycle(u8 taskId)\n{\n    if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))\n        PlaySE(SE_BIKE_BELL);\n    GetOnOffBike(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE);\n    ClearPlayerHeldMovementAndUnfreezeObjectEvents();\n    UnlockPlayerFieldControls();\n    DestroyTask(taskId);\n}\n\nvoid FieldUseFunc_Rod(u8 taskId)\n{\n    if (CanFish() == TRUE)\n    {\n        sItemUseOnFieldCB = ItemUseOnFieldCB_Rod;\n        SetUpItemUseOnFieldCallback(taskId);\n    }\n    else\n        PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]);\n}\n\nstatic bool8 CanFish(void)\n{\n    s16 x, y;\n    u16 behavior;\n\n    GetXYCoordsOneStepInFrontOfPlayer(&x, &y);\n    behavior = MapGridGetMetatileBehaviorAt(x, y);\n\n    if (MetatileBehavior_IsWaterfall(behavior))\n        return FALSE;\n    if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_UNDERWATER))\n        return FALSE;\n    if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))\n    {\n        if (IsPlayerFacingSurfableFishableWater())\n            return TRUE;\n    }\n    else\n    {\n        if (MetatileBehavior_IsSurfable(behavior) && MapGridGetCollisionAt(x, y) == 0)\n            return TRUE;\n        if (MetatileBehavior_IsBridge(behavior) == TRUE)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void ItemUseOnFieldCB_Rod(u8 taskId)\n{\n    StartFishing(ItemId_GetSecondaryId(gSpecialVar_ItemId));\n    DestroyTask(taskId);\n}\n\nvoid ItemUseOutOfBattle_Itemfinder(u8 taskId)\n{\n    IncrementGameStat(GAME_STAT_USED_ITEMFINDER);\n    sItemUseOnFieldCB = ItemUseOnFieldCB_Itemfinder;\n    SetUpItemUseOnFieldCallback(taskId);\n}\n\nvoid FieldUseFunc_CoinCase(u8 taskId)\n{\n    ConvertIntToDecimalStringN(gStringVar1, GetCoins(), STR_CONV_MODE_LEFT_ALIGN, 4);\n    StringExpandPlaceholders(gStringVar4, gText_CoinCase);\n    ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);\n    if (gTasks[taskId].data[3] == 0)\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_ReturnToBagFromContextMenu);\n    else\n        DisplayItemMessageOnField(taskId, FONT_NORMAL, gStringVar4, Task_ItemUse_CloseMessageBoxAndReturnToField);\n}\n\nvoid FieldUseFunc_PowderJar(u8 taskId)\n{\n    ConvertIntToDecimalStringN(gStringVar1, GetBerryPowder(), STR_CONV_MODE_LEFT_ALIGN, 5);\n    StringExpandPlaceholders(gStringVar4, gText_PowderQty);\n    ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);\n    if (gTasks[taskId].data[3] == 0)\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_ReturnToBagFromContextMenu);\n    else\n        DisplayItemMessageOnField(taskId, FONT_NORMAL, gStringVar4, Task_ItemUse_CloseMessageBoxAndReturnToField);\n}\n\nvoid FieldUseFunc_SootSack(u8 taskId)\n{\n    ConvertIntToDecimalStringN(gStringVar1, GetAshCount(), STR_CONV_MODE_LEFT_ALIGN, 5);\n    StringExpandPlaceholders(gStringVar4, gText_AshQuantity);\n    ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);\n    if (gTasks[taskId].data[3] == 0)\n        DisplayItemMessageInBag(taskId, 2, gStringVar4, Task_ReturnToBagFromContextMenu);\n    else\n        DisplayItemMessageOnField(taskId, 2, gStringVar4, Task_ItemUse_CloseMessageBoxAndReturnToField);\n}\n\nu16 GetAshCount(void)\n{\n\tu16 *ashGatherCount;\n\tashGatherCount = GetVarPointer(VAR_ASH_GATHER_COUNT);\n\treturn *ashGatherCount;\n}\n\nvoid FieldUseFunc_PokeFlute(u8 taskId)\n{\n    bool8 wokeSomeoneUp = FALSE;\n    u32 i;\n\n    for (i = 0; i < CalculatePlayerPartyCount(); i++)\n    {\n        if (!ExecuteTableBasedItemEffect(&gPlayerParty[i], ITEM_AWAKENING, i, 0))\n            wokeSomeoneUp = TRUE;\n    }\n\n    if (wokeSomeoneUp)\n    {\n        ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);\n        if (gTasks[taskId].data[3] == 0)\n            DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_PlayedPokeFlute, Task_PlayPokeFlute);\n        else\n            DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_PlayedPokeFlute, Task_PlayPokeFlute);\n    }\n    else\n    {\n        if (gTasks[taskId].data[3] == 0)\n            DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_PlayedPokeFluteCatchy, Task_ReturnToBagFromContextMenu);\n        else\n            DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_PlayedPokeFluteCatchy, Task_ItemUse_CloseMessageBoxAndReturnToField);\n    }\n}\n\nstatic void Task_PlayPokeFlute(u8 taskId)\n{\n    PlayFanfareByFanfareNum(FANFARE_POKE_FLUTE);\n    gTasks[taskId].func = Task_DisplayPokeFluteMessage;\n}\n\nstatic void Task_DisplayPokeFluteMessage(u8 taskId)\n{\n    if (WaitFanfare(FALSE))\n    {\n        if (gTasks[taskId].data[3] == 0)\n            DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_PokeFluteAwakenedMon, Task_ReturnToBagFromContextMenu);\n        else\n            DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_PokeFluteAwakenedMon, Task_ItemUse_CloseMessageBoxAndReturnToField);\n    }\n}\n\nstatic void DoSetUpItemUseCallback(u8 taskId)\n{\n    SetUpItemUseCallback(taskId);\n}\n\nvoid FieldUseFunc_Medicine(u8 taskId)\n{\n    gItemUseCB = ItemUseCB_Medicine;\n    DoSetUpItemUseCallback(taskId);\n}\n\nvoid FieldUseFunc_Ether(u8 taskId)\n{\n    gItemUseCB = ItemUseCB_TryRestorePP;\n    DoSetUpItemUseCallback(taskId);\n}\n\nvoid FieldUseFunc_PpUp(u8 taskId)\n{\n    gItemUseCB = ItemUseCB_PPUp;\n    DoSetUpItemUseCallback(taskId);\n}\n\nvoid FieldUseFunc_RareCandy(u8 taskId)\n{\n    gItemUseCB = ItemUseCB_RareCandy;\n    DoSetUpItemUseCallback(taskId);\n}\n\nvoid FieldUseFunc_EvoItem(u8 taskId)\n{\n    gItemUseCB = ItemUseCB_EvolutionStone;\n    DoSetUpItemUseCallback(taskId);\n}\n\nvoid FieldUseFunc_SacredAsh(u8 taskId)\n{\n    gItemUseCB = ItemUseCB_SacredAsh;\n    SetUpItemUseCallback(taskId);\n}\n\nvoid FieldUseFunc_TmCase(u8 taskId)\n{\n    if (gTasks[taskId].data[3] == 0)\n    {\n        ItemMenu_SetExitCallback(InitTMCaseFromBag);\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n    else\n    {\n        StopPokemonLeagueLightingEffectTask();\n        FadeScreen(FADE_TO_BLACK, 0);\n        gTasks[taskId].func = Task_InitTMCaseFromField;\n    }\n}\n\nstatic void InitTMCaseFromBag(void)\n{\n    InitTMCase(TMCASE_FIELD, CB2_BagMenuFromStartMenu, FALSE);\n}\n\nstatic void Task_InitTMCaseFromField(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        CleanupOverworldWindowsAndTilemaps();\n        SetFieldCallback2ForItemUse();\n        InitTMCase(TMCASE_FIELD, CB2_ReturnToField, TRUE);\n        DestroyTask(taskId);\n    }\n}\n\nvoid FieldUseFunc_BerryPouch(u8 taskId)\n{\n    if (gTasks[taskId].data[3] == 0)\n    {\n        ItemMenu_SetExitCallback(InitBerryPouchFromBag);\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n    else\n    {\n        StopPokemonLeagueLightingEffectTask();\n        FadeScreen(FADE_TO_BLACK, 0);\n        gTasks[taskId].func = Task_InitBerryPouchFromField;\n    }\n}\n\nstatic void InitBerryPouchFromBag(void)\n{\n    InitBerryPouch(BERRYPOUCH_FROMFIELD, CB2_BagMenuFromStartMenu, 0);\n}\n\nstatic void Task_InitBerryPouchFromField(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        CleanupOverworldWindowsAndTilemaps();\n        SetFieldCallback2ForItemUse();\n        InitBerryPouch(BERRYPOUCH_FROMFIELD, CB2_ReturnToField, 1);\n        DestroyTask(taskId);\n    }\n}\n\nvoid BattleUseFunc_BerryPouch(u8 taskId)\n{\n    ItemMenu_SetExitCallback(InitBerryPouchFromBattle);\n    ItemMenu_StartFadeToExitCallback(taskId);\n}\n\nstatic void InitBerryPouchFromBattle(void)\n{\n    InitBerryPouch(BERRYPOUCH_FROMBATTLE, CB2_BagMenuFromBattle, 0);\n}\n\nvoid FieldUseFunc_TeachyTv(u8 taskId)\n{\n    ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);\n    if (gTasks[taskId].data[3] == 0)\n    {\n        ItemMenu_SetExitCallback(InitTeachyTvFromBag);\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n    else\n    {\n        StopPokemonLeagueLightingEffectTask();\n        FadeScreen(FADE_TO_BLACK, 0);\n        gTasks[taskId].func = Task_InitTeachyTvFromField;\n    }\n}\n\nstatic void InitTeachyTvFromBag(void)\n{\n    InitTeachyTvController(0, CB2_BagMenuFromStartMenu);\n}\n\nstatic void Task_InitTeachyTvFromField(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        CleanupOverworldWindowsAndTilemaps();\n        SetFieldCallback2ForItemUse();\n        InitTeachyTvController(0, CB2_ReturnToField);\n        DestroyTask(taskId);\n    }\n}\n\nvoid FieldUseFunc_Repel(u8 taskId)\n{\n    if (VarGet(VAR_REPEL_STEP_COUNT) == 0)\n    {\n        PlaySE(SE_REPEL);\n        gTasks[taskId].func = Task_UseRepel;\n    }\n    else\n        // An earlier repel is still in effect\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_RepelEffectsLingered, Task_ReturnToBagFromContextMenu);\n}\n\nstatic void Task_UseRepel(u8 taskId)\n{\n    if (!IsSEPlaying())\n    {\n        ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);\n        VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId));\n        VarSet(VAR_LAST_REPEL_USED, gSpecialVar_ItemId);\n        RemoveUsedItem();\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_ReturnToBagFromContextMenu);\n    }\n}\n\nstatic void RemoveUsedItem(void)\n{\n    RemoveBagItem(gSpecialVar_ItemId, 1);\n    Pocket_CalculateNItemsAndMaxShowed(ItemId_GetPocket(gSpecialVar_ItemId));\n    PocketCalculateInitialCursorPosAndItemsAbove(ItemId_GetPocket(gSpecialVar_ItemId));\n    CopyItemName(gSpecialVar_ItemId, gStringVar2);\n    StringExpandPlaceholders(gStringVar4, gText_PlayerUsedVar2);\n}\n\nvoid FieldUseFunc_BlackWhiteFlute(u8 taskId)\n{\n    ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);\n    if (gSpecialVar_ItemId == ITEM_WHITE_FLUTE)\n    {\n        FlagSet(FLAG_SYS_WHITE_FLUTE_ACTIVE);\n        FlagClear(FLAG_SYS_BLACK_FLUTE_ACTIVE);\n        CopyItemName(gSpecialVar_ItemId, gStringVar2);\n        StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildLured);\n        gTasks[taskId].func = Task_UsedBlackWhiteFlute;\n        gTasks[taskId].data[8] = 0;\n    }\n    else if (gSpecialVar_ItemId == ITEM_BLACK_FLUTE)\n    {\n        FlagSet(FLAG_SYS_BLACK_FLUTE_ACTIVE);\n        FlagClear(FLAG_SYS_WHITE_FLUTE_ACTIVE);\n        CopyItemName(gSpecialVar_ItemId, gStringVar2);\n        StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildRepelled);\n        gTasks[taskId].func = Task_UsedBlackWhiteFlute;\n        gTasks[taskId].data[8] = 0;\n    }\n}\n\nstatic void Task_UsedBlackWhiteFlute(u8 taskId)\n{\n    if (++gTasks[taskId].data[8] > 7)\n    {\n        PlaySE(SE_GLASS_FLUTE);\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, Task_ReturnToBagFromContextMenu);\n    }\n}\n\nbool8 CanUseEscapeRopeOnCurrMap(void)\n{\n    if (gMapHeader.allowEscaping)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid ItemUseOutOfBattle_EscapeRope(u8 taskId)\n{\n    if (CanUseEscapeRopeOnCurrMap() == TRUE)\n    {\n        ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, gMapHeader.regionMapSectionId);\n        sItemUseOnFieldCB = ItemUseOnFieldCB_EscapeRope;\n        SetUpItemUseOnFieldCallback(taskId);\n    }\n    else\n        PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]);\n}\n\nstatic void ItemUseOnFieldCB_EscapeRope(u8 taskId)\n{\n    Overworld_ResetStateAfterDigEscRope();\n    RemoveUsedItem();\n    gTasks[taskId].data[0] = 0;\n    DisplayItemMessageOnField(taskId, FONT_NORMAL, gStringVar4, Task_UseDigEscapeRopeOnField);\n}\n\nvoid Task_UseDigEscapeRopeOnField(u8 taskId)\n{\n    ResetInitialPlayerAvatarState();\n    StartEscapeRopeFieldEffect();\n    DestroyTask(taskId);\n}\n\nvoid FieldUseFunc_TownMap(u8 taskId)\n{\n    if (gTasks[taskId].data[3] == 0)\n    {\n        ItemMenu_SetExitCallback(UseTownMapFromBag);\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n    else\n    {\n        StopPokemonLeagueLightingEffectTask();\n        FadeScreen(FADE_TO_BLACK, 0);\n        gTasks[taskId].func = Task_UseTownMapFromField;\n    }\n}\n\nstatic void UseTownMapFromBag(void)\n{\n    //if(gMapHeader.regionMapSectionId <= 0x55) //MAPSEC_SKY_PILLAR\n        //InitRegionMapWithExitCB(REGIONMAP_TYPE_HOENN, CB2_BagMenuFromStartMenu);\n    //else\n        InitRegionMapWithExitCB(REGIONMAP_TYPE_NORMAL, CB2_BagMenuFromStartMenu);\n}\n\nstatic void Task_UseTownMapFromField(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        CleanupOverworldWindowsAndTilemaps();\n        SetFieldCallback2ForItemUse();\n        InitRegionMapWithExitCB(REGIONMAP_TYPE_NORMAL, CB2_ReturnToField);\n        DestroyTask(taskId);\n    }\n}\n\nvoid FieldUseFunc_FameChecker(u8 taskId)\n{\n    ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);\n    if (gTasks[taskId].data[3] == 0)\n    {\n        ItemMenu_SetExitCallback(UseFameCheckerFromBag);\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n    else\n    {\n        StopPokemonLeagueLightingEffectTask();\n        FadeScreen(FADE_TO_BLACK, 0);\n        gTasks[taskId].func = Task_UseFameCheckerFromField;\n    }\n}\n\nstatic void UseFameCheckerFromBag(void)\n{\n    UseFameChecker(CB2_BagMenuFromStartMenu);\n}\n\nstatic void Task_UseFameCheckerFromField(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        CleanupOverworldWindowsAndTilemaps();\n        SetFieldCallback2ForItemUse();\n        UseFameChecker(CB2_ReturnToField);\n        DestroyTask(taskId);\n    }\n}\n\nvoid FieldUseFunc_VsSeeker(u8 taskId)\n{\n    if ((gMapHeader.mapType != MAP_TYPE_ROUTE\n      && gMapHeader.mapType != MAP_TYPE_TOWN\n      && gMapHeader.mapType != MAP_TYPE_CITY)\n     || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(VIRIDIAN_FOREST)\n      && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(VIRIDIAN_FOREST)\n       || gSaveBlock1Ptr->location.mapNum == MAP_NUM(MT_EMBER_EXTERIOR)\n       || gSaveBlock1Ptr->location.mapNum == MAP_NUM(THREE_ISLAND_BERRY_FOREST)\n       || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SIX_ISLAND_PATTERN_BUSH))))\n    {\n        PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]);\n    }\n    else\n    {\n        sItemUseOnFieldCB = Task_VsSeeker_0;\n        SetUpItemUseOnFieldCallback(taskId);\n    }\n}\n\nvoid Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8 taskId)\n{\n    Task_ItemUse_CloseMessageBoxAndReturnToField(taskId);\n}\n\nvoid BattleUseFunc_PokeBallEtc(u8 taskId)\n{\n    if (!IsPlayerPartyAndPokemonStorageFull())\n    {\n        RemoveBagItem(gSpecialVar_ItemId, 1);\n        Bag_BeginCloseWin0Animation();\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n    else\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_BoxFull, Task_ReturnToBagFromContextMenu);\n}\n\nvoid BattleUseFunc_PokeFlute(u8 taskId)\n{\n    Bag_BeginCloseWin0Animation();\n    ItemMenu_StartFadeToExitCallback(taskId);\n}\n\nvoid BattleUseFunc_StatBooster(u8 taskId)\n{\n    if (ExecuteTableBasedItemEffect(&gPlayerParty[gBattlerPartyIndexes[gBattlerInMenuId]], gSpecialVar_ItemId, gBattlerPartyIndexes[gBattlerInMenuId], 0))\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, gText_WontHaveEffect, Task_ReturnToBagFromContextMenu);\n    else\n    {\n        gTasks[taskId].data[8] = 0;\n        gTasks[taskId].func = Task_BattleUse_StatBooster_DelayAndPrint;\n    }\n}\n\nstatic void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (++data[8] > 7)\n    {\n        u16 itemId = gSpecialVar_ItemId;\n        PlaySE(SE_USE_ITEM);\n        RemoveBagItem(itemId, 1);\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, Battle_PrintStatBoosterEffectMessage(itemId), Task_BattleUse_StatBooster_WaitButton_ReturnToBattle);\n    }\n}\n\nstatic void Task_BattleUse_StatBooster_WaitButton_ReturnToBattle(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        Bag_BeginCloseWin0Animation();\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n}\n\nstatic void ItemUse_SwitchToPartyMenuInBattle(u8 taskId)\n{\n    if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH)\n    {\n        BerryPouch_SetExitCallback(EnterPartyFromItemMenuInBattle);\n        BerryPouch_StartFadeToExitCallback(taskId);\n    }\n    else\n    {\n        ItemMenu_SetExitCallback(EnterPartyFromItemMenuInBattle);\n        ItemMenu_StartFadeToExitCallback(taskId);\n    }\n}\n\nvoid BattleUseFunc_Medicine(u8 taskId)\n{\n    gItemUseCB = ItemUseCB_MedicineStep;\n    ItemUse_SwitchToPartyMenuInBattle(taskId);\n}\n\n// Unused. Sacred Ash cannot be used in battle\nstatic void BattleUseFunc_SacredAsh(u8 taskId)\n{\n    gItemUseCB = ItemUseCB_SacredAsh;\n    ItemUse_SwitchToPartyMenuInBattle(taskId);\n}\n\nvoid BattleUseFunc_Ether(u8 taskId)\n{\n    gItemUseCB = ItemUseCB_TryRestorePP;\n    ItemUse_SwitchToPartyMenuInBattle(taskId);\n}\n\nvoid BattleUseFunc_PokeDoll(u8 taskId)\n{\n    if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER))\n    {\n        RemoveUsedItem();\n        ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, 0, gSpecialVar_ItemId, 0xFFFF);\n        DisplayItemMessageInBag(taskId, FONT_NORMAL, gStringVar4, ItemMenu_StartFadeToExitCallback);\n    }\n    else\n        PrintNotTheTimeToUseThat(taskId, 0);\n}\n\nvoid ItemUseOutOfBattle_EnigmaBerry(u8 taskId)\n{\n    switch (GetItemEffectType(gSpecialVar_ItemId))\n    {\n    case ITEM_EFFECT_HEAL_HP:\n    case ITEM_EFFECT_CURE_POISON:\n    case ITEM_EFFECT_CURE_SLEEP:\n    case ITEM_EFFECT_CURE_BURN:\n    case ITEM_EFFECT_CURE_FREEZE:\n    case ITEM_EFFECT_CURE_PARALYSIS:\n    case ITEM_EFFECT_CURE_ALL_STATUS:\n    case ITEM_EFFECT_ATK_EV:\n    case ITEM_EFFECT_HP_EV:\n    case ITEM_EFFECT_SPATK_EV:\n    case ITEM_EFFECT_SPDEF_EV:\n    case ITEM_EFFECT_SPEED_EV:\n    case ITEM_EFFECT_DEF_EV:\n        gTasks[taskId].data[4] = 1;\n        FieldUseFunc_Medicine(taskId);\n        break;\n    case ITEM_EFFECT_SACRED_ASH:\n        gTasks[taskId].data[4] = 1;\n        FieldUseFunc_SacredAsh(taskId);\n        break;\n    case ITEM_EFFECT_RAISE_LEVEL:\n        gTasks[taskId].data[4] = 1;\n        FieldUseFunc_RareCandy(taskId);\n        break;\n    case ITEM_EFFECT_PP_UP:\n    case ITEM_EFFECT_PP_MAX:\n        gTasks[taskId].data[4] = 1;\n        FieldUseFunc_PpUp(taskId);\n        break;\n    case ITEM_EFFECT_HEAL_PP:\n        gTasks[taskId].data[4] = 1;\n        FieldUseFunc_Ether(taskId);\n        break;\n    default:\n        gTasks[taskId].data[4] = 4;\n        FieldUseFunc_OakStopsYou(taskId);\n    }\n}\n\nvoid ItemUseInBattle_EnigmaBerry(u8 taskId)\n{\n    switch (GetItemEffectType(gSpecialVar_ItemId))\n    {\n    case ITEM_EFFECT_X_ITEM:\n        BattleUseFunc_StatBooster(taskId);\n        break;\n    case ITEM_EFFECT_HEAL_HP:\n    case ITEM_EFFECT_CURE_POISON:\n    case ITEM_EFFECT_CURE_SLEEP:\n    case ITEM_EFFECT_CURE_BURN:\n    case ITEM_EFFECT_CURE_FREEZE:\n    case ITEM_EFFECT_CURE_PARALYSIS:\n    case ITEM_EFFECT_CURE_CONFUSION:\n    case ITEM_EFFECT_CURE_INFATUATION:\n    case ITEM_EFFECT_CURE_ALL_STATUS:\n        BattleUseFunc_Medicine(taskId);\n        break;\n    case ITEM_EFFECT_HEAL_PP:\n        BattleUseFunc_Ether(taskId);\n        break;\n    default:\n        FieldUseFunc_OakStopsYou(taskId);\n    }\n}\n\nvoid FieldUseFunc_OakStopsYou(u8 taskId)\n{\n    if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH)\n    {\n        StringExpandPlaceholders(gStringVar4, gText_OakForbidsUseOfItemHere);\n        DisplayItemMessageInBerryPouch(taskId, FONT_MALE, gStringVar4, Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu);\n    }\n    else\n        PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]);\n}\n\nvoid ItemUse_SetQuestLogEvent(u8 eventId, struct Pokemon *pokemon, u16 itemId, u16 param)\n{\n    struct QuestLogEvent_Item *data = Alloc(sizeof(*data));\n\n    data->itemId = itemId;\n    data->itemParam = param;\n    if (pokemon != NULL)\n        data->species = GetMonData(pokemon, MON_DATA_SPECIES_OR_EGG);\n    else\n        data->species = 0xFFFF;\n    SetQuestLogEvent(eventId, (void *)data);\n    Free(data);\n}\n\nvoid ItemUseOutOfBattle_ReduceEV(u8 taskId)\n{\n    gItemUseCB = ItemUseCB_ReduceEV;\n    DoSetUpItemUseCallback(taskId);\n}"
  },
  {
    "path": "src/itemfinder.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"new_menu_helpers.h\"\n#include \"strings.h\"\n#include \"event_scripts.h\"\n#include \"event_object_lock.h\"\n#include \"script.h\"\n#include \"event_data.h\"\n#include \"field_player_avatar.h\"\n#include \"field_specials.h\"\n#include \"fieldmap.h\"\n#include \"constants/songs.h\"\n\nstatic void Task_NoResponse_CleanUp(u8 taskId);\nstatic void Task_ItemfinderResponseSoundsAndAnims(u8 taskId);\nstatic void Task_ItemfinderUnderfootSoundsAndAnims(u8 taskId);\nstatic bool8 HiddenItemIsWithinRangeOfPlayer(const struct MapEvents * events, u8 taskId);\nstatic void SetUnderfootHiddenItem(u8 taskId, u32 hiddenItem);\nstatic void SetNormalHiddenItem(u8 taskId);\nstatic void FindHiddenItemsInConnectedMaps(u8 taskId);\nstatic void RegisterHiddenItemRelativeCoordsIfCloser(u8 taskId, s16 dx, s16 dy);\nstatic u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY);\nstatic void Task_ItemfinderResponsePrintMessage(u8 taskId);\nstatic void Task_ItemfinderResponseCleanUp(u8 taskId);\nstatic void Task_ItemfinderUnderfootPrintMessage(u8 taskId);\nstatic void Task_ItemfinderUnderfootDigUpItem(u8 taskId);\nstatic void DestroyArrowAndStarTiles(void);\nstatic void LoadArrowAndStarTiles(void);\nstatic void CreateArrowSprite(u8 animNum, u8 direction);\nstatic void SpriteCallback_Arrow(struct Sprite *sprite);\nstatic void SpriteCallback_DestroyArrow(struct Sprite *sprite);\nstatic u8 CreateStarSprite(void);\nstatic void SpriteCallback_Star(struct Sprite *sprite);\nstatic void SpriteCallback_DestroyStar(struct Sprite *sprite);\n\n#define ARROW_TILE_TAG 2000\n\nstatic const u16 sArrowAndStarSpriteTiles[] = INCBIN_U16(\"graphics/itemfinder/spr_tiles.4bpp\");\n\nstatic const union AnimCmd sArrowAnim0[] = {\n    ANIMCMD_FRAME( 0, 10),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sArrowAnim1[] = {\n    ANIMCMD_FRAME( 4, 10),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sArrowAnim2[] = {\n    ANIMCMD_FRAME( 8, 10),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sArrowAnim3[] = {\n    ANIMCMD_FRAME(12, 10),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sStarAnim[] = {\n    ANIMCMD_FRAME(16, 10),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sArrowAndStarSpriteAnimTable[] = {\n    sArrowAnim0,\n    sArrowAnim1,\n    sArrowAnim2,\n    sArrowAnim3,\n    sStarAnim\n};\n\nstatic const struct OamData sArrowAndStarSpriteOamData = {\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .shape = ST_OAM_SQUARE,\n    .size = ST_OAM_SIZE_1\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Left[] = {\n    AFFINEANIMCMD_FRAME(0, 0, 0x00, 1),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Down[] = {\n    AFFINEANIMCMD_FRAME(0, 0, 0x40, 1),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Right[] = {\n    AFFINEANIMCMD_FRAME(0, 0, 0x80, 1),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Up[] = {\n    AFFINEANIMCMD_FRAME(0, 0, 0xc0, 1),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sArrowAndStarSpriteAffineAnimTable[] = {\n    sAffineAnim_Left,\n    sAffineAnim_Down,\n    sAffineAnim_Right,\n    sAffineAnim_Up\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_ArrowAndStar = {\n    .tileTag = ARROW_TILE_TAG,\n    .paletteTag = 0xFFFF,\n    .oam = &sArrowAndStarSpriteOamData,\n    .anims = sArrowAndStarSpriteAnimTable,\n    .affineAnims = sArrowAndStarSpriteAffineAnimTable,\n    .callback = SpriteCallback_Arrow\n};\n\nstatic const struct SpriteSheet sArrowAndStarSpriteSheet = {\n    .data = sArrowAndStarSpriteTiles,\n    .size = sizeof(sArrowAndStarSpriteTiles),\n    .tag = ARROW_TILE_TAG\n};\n\n#define tItemX data[0]\n#define tItemY data[1]\n#define tHiddenItemFound data[2]\n#define tDingTimer data[3]\n#define tNumDingsRemaining data[4]\n#define tDingNum data[5]\n#define tUnderfoot data[6]\n#define tStartSpriteId data[7]\n\nvoid ItemUseOnFieldCB_Itemfinder(u8 taskId)\n{\n    u32 i;\n    for (i = 0; i < 16; i++)\n        gTasks[taskId].data[i] = 0;\n    if (HiddenItemIsWithinRangeOfPlayer(gMapHeader.events, taskId) == TRUE)\n    {\n        LoadArrowAndStarTiles();\n        if (gTasks[taskId].tUnderfoot == TRUE)\n            gTasks[taskId].func = Task_ItemfinderUnderfootSoundsAndAnims;\n        else\n            gTasks[taskId].func = Task_ItemfinderResponseSoundsAndAnims;\n    }\n    else\n    {\n        DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_NopeTheresNoResponse, Task_NoResponse_CleanUp);\n    }\n}\n\nstatic void Task_NoResponse_CleanUp(u8 taskId)\n{\n    ClearDialogWindowAndFrame(0, TRUE);\n    ClearPlayerHeldMovementAndUnfreezeObjectEvents();\n    UnlockPlayerFieldControls();\n    DestroyTask(taskId);\n}\n\nstatic void Task_ItemfinderResponseSoundsAndAnims(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u8 direction;\n    if (tDingTimer % 25 == 0)\n    {\n        direction = GetPlayerDirectionTowardsHiddenItem(tItemX, tItemY);\n        if (tNumDingsRemaining == 0)\n        {\n            gTasks[taskId].func = Task_ItemfinderResponsePrintMessage;\n            return;\n        }\n        else\n        {\n            PlaySE(SE_ITEMFINDER);\n            CreateArrowSprite(tDingNum, direction);\n            tDingNum++;\n            tNumDingsRemaining--;\n        }\n    }\n    tDingTimer++;\n}\n\nstatic void Task_ItemfinderUnderfootSoundsAndAnims(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (tDingTimer % 25 == 0)\n    {\n        if (tNumDingsRemaining == 0)\n        {\n            gTasks[taskId].func = Task_ItemfinderUnderfootPrintMessage;\n            return;\n        }\n        else\n        {\n            PlaySE(SE_ITEMFINDER);\n            tStartSpriteId = CreateStarSprite();\n            tDingNum++;\n            tNumDingsRemaining--;\n        }\n    }\n    tDingTimer++;\n}\n\nstatic bool8 HiddenItemIsWithinRangeOfPlayer(const struct MapEvents * events, u8 taskId)\n{\n    s16 x, y, i, dx, dy;\n    PlayerGetDestCoords(&x, &y);\n    gTasks[taskId].tHiddenItemFound = FALSE;\n    for (i = 0; i < events->bgEventCount; i++)\n    {\n        if (events->bgEvents[i].kind == 7 && !FlagGet(GetHiddenItemAttr(events->bgEvents[i].bgUnion.hiddenItem, HIDDEN_ITEM_FLAG)))\n        {\n            dx = events->bgEvents[i].x + 7 - x;\n            dy = events->bgEvents[i].y + 7 - y;\n            if (GetHiddenItemAttr(events->bgEvents[i].bgUnion.hiddenItem, HIDDEN_ITEM_UNDERFOOT) == TRUE)\n            {\n                if (dx == 0 && dy == 0)\n                {\n                    SetUnderfootHiddenItem(taskId, events->bgEvents[i].bgUnion.hiddenItem);\n                    return TRUE;\n                }\n            }\n            else if (\n                dx >= -7\n             && dx <=  7\n             && dy >= -5\n             && dy <=  5\n            )\n            {\n                RegisterHiddenItemRelativeCoordsIfCloser(taskId, dx, dy);\n            }\n        }\n    }\n    FindHiddenItemsInConnectedMaps(taskId);\n    if (gTasks[taskId].tHiddenItemFound == TRUE)\n    {\n        SetNormalHiddenItem(taskId);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void SetUnderfootHiddenItem(u8 taskId, u32 hiddenItem)\n{\n    s16 *data = gTasks[taskId].data;\n    gSpecialVar_0x8004 = GetHiddenItemAttr(hiddenItem, HIDDEN_ITEM_FLAG);\n    gSpecialVar_0x8005 = GetHiddenItemAttr(hiddenItem, HIDDEN_ITEM_ITEM);\n    gSpecialVar_0x8006 = 1; // Quantity. The 'HIDDEN_ITEM_QUANTITY' data is ignored for underfoot items\n    TV_PrintIntToStringVar(0, gSpecialVar_0x8005);\n    tHiddenItemFound = TRUE;\n    tItemX = 0;\n    tItemY = 0;\n    tNumDingsRemaining = 3;\n    tUnderfoot = TRUE;\n}\n\nstatic void SetNormalHiddenItem(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    s16 absY = tItemY;\n    s16 absX = tItemX;\n    \n    // The strength of the response increases inversely with distance to the item.\n    if (tItemX == 0 && tItemY == 0)\n        tNumDingsRemaining = 4;\n    else\n    {\n        if (tItemX < 0)\n            absX = tItemX * -1;\n        if (tItemY < 0)\n            absY = tItemY * -1;\n        if (absX > absY)\n        {\n            if (absX > 3)\n                tNumDingsRemaining = 2;\n            else\n                tNumDingsRemaining = 4;\n        }\n        else\n        {\n            if (absY > 3)\n                tNumDingsRemaining = 2;\n            else\n                tNumDingsRemaining = 4;\n        }\n    }\n}\n\nstatic bool8 HiddenItemAtPos(const struct MapEvents * events, s16 x, s16 y)\n{\n    u8 bgEventCount = events->bgEventCount;\n    const struct BgEvent * bgEvents = events->bgEvents;\n    u16 eventFlag;\n    int i;\n\n    for (i = 0; i < bgEventCount; i++)\n    {\n        if (\n            bgEvents[i].kind == 7\n         && x == bgEvents[i].x\n         && y == bgEvents[i].y\n        )\n        {\n            eventFlag = GetHiddenItemAttr(bgEvents[i].bgUnion.hiddenItem, HIDDEN_ITEM_FLAG);\n            if (GetHiddenItemAttr(bgEvents[i].bgUnion.hiddenItem, HIDDEN_ITEM_UNDERFOOT) != TRUE && !FlagGet(eventFlag))\n                return TRUE;\n            else\n                return FALSE;\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 HiddenItemInConnectedMapAtPos(const struct MapConnection * connection, s32 x, s32 y)\n{\n    const struct MapHeader * mapHeader;\n    u16 localX, localY;\n    u32 localOffset;\n    s32 localLength;\n\n    mapHeader = GetMapHeaderFromConnection(connection);\n\n    switch (connection->direction)\n    {\n    // same weird temp variable behavior seen in HiddenItemAtPos\n    case CONNECTION_NORTH:\n        localOffset = connection->offset + 7;\n        localX = x - localOffset;\n        localLength = mapHeader->mapLayout->height - 7;\n        localY = localLength + y; // additions are reversed for some reason\n        break;\n    case CONNECTION_SOUTH:\n        localOffset = connection->offset + 7;\n        localX = x - localOffset;\n        localLength = gMapHeader.mapLayout->height + 7;\n        localY = y - localLength;\n        break;\n    case CONNECTION_WEST:\n        localLength = mapHeader->mapLayout->width - 7;\n        localX = localLength + x; // additions are reversed for some reason\n        localOffset = connection->offset + 7;\n        localY = y - localOffset;\n        break;\n    case CONNECTION_EAST:\n        localLength = gMapHeader.mapLayout->width + 7;\n        localX = x - localLength;\n        localOffset = connection->offset + 7;\n        localY = y - localOffset;\n        break;\n    default:\n        return FALSE;\n    }\n    return HiddenItemAtPos(mapHeader->events, localX, localY);\n}\n\nstatic void FindHiddenItemsInConnectedMaps(u8 taskId)\n{\n    s16 x, y;\n    s16 curX, curY;\n    s16 width = gMapHeader.mapLayout->width + 7;\n    s16 height = gMapHeader.mapLayout->height + 7;\n\n    s16 var1 = 7;\n    s16 var2 = 7;\n\n    PlayerGetDestCoords(&x, &y);\n\n    for (curX = x - 7; curX <= x + 7; curX++)\n    {\n        for (curY = y - 5; curY <= y + 5; curY++)\n        {\n            if (var1 > curX\n                || curX >= width\n                || var2 > curY\n                || curY >= height)\n            {\n                const struct MapConnection * conn = GetMapConnectionAtPos(curX, curY);\n                if (conn != NULL && HiddenItemInConnectedMapAtPos(conn, curX, curY) == TRUE)\n                    RegisterHiddenItemRelativeCoordsIfCloser(taskId, curX - x, curY - y);\n            }\n        }\n    }\n}\n\nstatic void RegisterHiddenItemRelativeCoordsIfCloser(u8 taskId, s16 dx, s16 dy)\n{\n    s16 *data = gTasks[taskId].data;\n    s16 dx2, dy2, dx3, dy3;\n\n    if (tHiddenItemFound == FALSE)\n    {\n        tItemX = dx;\n        tItemY = dy;\n        tHiddenItemFound = TRUE;\n    }\n    else\n    {\n        // tItemX and tItemY contain the player's coordinates.\n        // dx and dy contain the item's coordinates.\n        if (tItemX < 0)\n            dx2 = tItemX * -1; // item is to the left\n        else\n            dx2 = tItemX; // item is to the right\n\n        if (tItemY < 0)\n            dy2 = tItemY * -1; // item is to the north\n        else\n            dy2 = tItemY; // item is to the south\n\n        if (dx < 0)\n            dx3 = dx * -1;\n        else\n            dx3 = dx;\n\n        if (dy < 0)\n            dy3 = dy * -1;\n        else\n            dy3 = dy;\n\n        if (dx2 + dy2 > dx3 + dy3)\n        {\n            tItemX = dx;\n            tItemY = dy;\n        }\n        else\n        {\n            if (dx2 + dy2 == dx3 + dy3 && (dy2 > dy3 || (dy2 == dy3 && tItemY < dy)))\n            {\n                tItemX = dx;\n                tItemY = dy;\n            }\n        }\n    }\n}\n\nstatic u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY)\n{\n    s16 abX, abY;\n\n    if (itemX == 0 && itemY == 0)\n        return DIR_NONE; // player is standing on the item.\n\n    // get absolute X distance.\n    if (itemX < 0)\n        abX = itemX * -1;\n    else\n        abX = itemX;\n\n    // get absolute Y distance.\n    if (itemY < 0)\n        abY = itemY * -1;\n    else\n        abY = itemY;\n\n    if (abX > abY)\n    {\n        if (itemX < 0)\n            return DIR_EAST;\n        else\n            return DIR_NORTH;\n    }\n    else\n    {\n        if (abX < abY)\n        {\n            if (itemY < 0)\n                return DIR_SOUTH;\n            else\n                return DIR_WEST;\n        }\n        if (abX == abY)\n        {\n            if (itemY < 0)\n                return DIR_SOUTH;\n            else\n                return DIR_WEST;\n        }\n        return DIR_NONE; // should never get here. return something so it doesnt crash.\n    }\n}\n\nstatic void Task_ItemfinderResponsePrintMessage(u8 taskId)\n{\n    DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_ItemfinderResponding, Task_ItemfinderResponseCleanUp);\n}\n\nstatic void Task_ItemfinderResponseCleanUp(u8 taskId)\n{\n    DestroyArrowAndStarTiles();\n    ClearDialogWindowAndFrame(0, TRUE);\n    ClearPlayerHeldMovementAndUnfreezeObjectEvents();\n    UnlockPlayerFieldControls();\n    DestroyTask(taskId);\n}\n\nstatic void Task_ItemfinderUnderfootPrintMessage(u8 taskId)\n{\n    DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_ItemfinderShakingWildly, Task_ItemfinderUnderfootDigUpItem);\n}\n\nstatic void Task_ItemfinderUnderfootDigUpItem(u8 taskId)\n{\n    DestroyArrowAndStarTiles();\n    DestroyTask(taskId);\n    ScriptContext_SetupScript(EventScript_ItemfinderDigUpUnderfootItem);\n    LockPlayerFieldControls();\n}\n\n#undef tStartSpriteId\n#undef tUnderfoot\n#undef tDingNum\n#undef tNumDingsRemaining\n#undef tDingTimer\n#undef tHiddenItemFound\n#undef tItemY\n#undef tItemX\n\n#define spData0 data[0]\n#define spDeltaX data[1]\n#define spDeltaY data[2]\n#define spCurX data[3]\n#define spCurY data[4]\n#define spCenterX data[5]\n#define spCenterY data[6]\n#define spAnimNum data[7]\n\nstatic void LoadArrowAndStarTiles(void)\n{\n    LoadSpriteSheet(&sArrowAndStarSpriteSheet);\n}\n\nstatic void DestroyArrowAndStarTiles(void)\n{\n    FreeSpriteTilesByTag(ARROW_TILE_TAG);\n}\n\nstatic void CreateArrowSprite(u8 animNum, u8 direction)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_ArrowAndStar, 120, 76, 0);\n    gSprites[spriteId].oam.paletteNum = 0;\n    StartSpriteAnim(&gSprites[spriteId], animNum);\n    gSprites[spriteId].spAnimNum = animNum;\n    gSprites[spriteId].spData0 = 0;\n    gSprites[spriteId].spCurX = 0;\n    gSprites[spriteId].spCurY = 0;\n    gSprites[spriteId].spCenterX = 120;\n    gSprites[spriteId].spCenterY = 76;\n    switch (direction)\n    {\n    case DIR_NONE:\n        switch (GetPlayerFacingDirection())\n        {\n        case DIR_WEST:\n            gSprites[spriteId].spDeltaX = -100;\n            gSprites[spriteId].spDeltaY = 0;\n            StartSpriteAffineAnim(&gSprites[spriteId], 0);\n            break;\n        case DIR_NORTH:\n            gSprites[spriteId].spDeltaX = 0;\n            gSprites[spriteId].spDeltaY = -100;\n            StartSpriteAffineAnim(&gSprites[spriteId], 3);\n            break;\n        case DIR_EAST:\n            gSprites[spriteId].spDeltaX = 100;\n            gSprites[spriteId].spDeltaY = 0;\n            StartSpriteAffineAnim(&gSprites[spriteId], 2);\n            break;\n        case DIR_SOUTH:\n            gSprites[spriteId].spDeltaX = 0;\n            gSprites[spriteId].spDeltaY = 100;\n            StartSpriteAffineAnim(&gSprites[spriteId], 1);\n            break;\n        }\n        break;\n    case DIR_SOUTH:\n        gSprites[spriteId].spDeltaX = 0;\n        gSprites[spriteId].spDeltaY = -100;\n        StartSpriteAffineAnim(&gSprites[spriteId], 3);\n        break;\n    case DIR_NORTH:\n        gSprites[spriteId].spDeltaX = 100;\n        gSprites[spriteId].spDeltaY = 0;\n        StartSpriteAffineAnim(&gSprites[spriteId], 2);\n        break;\n    case DIR_WEST:\n        gSprites[spriteId].spDeltaX = 0;\n        gSprites[spriteId].spDeltaY = 100;\n        StartSpriteAffineAnim(&gSprites[spriteId], 1);\n        break;\n    case DIR_EAST:\n        gSprites[spriteId].spDeltaX = -100;\n        gSprites[spriteId].spDeltaY = 0;\n        break;\n    }\n}\n\nstatic void SpriteCallback_Arrow(struct Sprite *sprite)\n{\n    s16 x, y;\n    sprite->spCurX += sprite->spDeltaX;\n    sprite->spCurY += sprite->spDeltaY;\n    sprite->x = sprite->spCenterX + (sprite->spCurX >> 8);\n    sprite->y = sprite->spCenterY + (sprite->spCurY >> 8);\n    if (sprite->x <= 104\n     || sprite->x > 132\n     || sprite->y <= 60\n     || sprite->y > 88)\n        sprite->callback = SpriteCallback_DestroyArrow;\n}\n\nstatic void SpriteCallback_DestroyArrow(struct Sprite *sprite)\n{\n    FreeSpriteOamMatrix(sprite);\n    DestroySprite(sprite);\n}\n\nstatic u8 CreateStarSprite(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_ArrowAndStar, 120, 76, 0);\n    gSprites[spriteId].oam.paletteNum = 0;\n    gSprites[spriteId].callback = SpriteCallback_Star;\n    StartSpriteAnim(&gSprites[spriteId], 4);\n    gSprites[spriteId].spAnimNum = 0;\n    gSprites[spriteId].spData0 = 0;\n    gSprites[spriteId].spCurX = 0;\n    gSprites[spriteId].spCurY = 0;\n    gSprites[spriteId].spCenterX = 120;\n    gSprites[spriteId].spCenterY = 76;\n    gSprites[spriteId].spDeltaX = 0;\n    gSprites[spriteId].spDeltaY = -100;\n    return spriteId;\n}\n\nstatic void SpriteCallback_Star(struct Sprite *sprite)\n{\n    s16 x, y;\n    sprite->spCurX += sprite->spDeltaX;\n    sprite->spCurY += sprite->spDeltaY;\n    sprite->x = sprite->spCenterX + (sprite->spCurX >> 8);\n    sprite->y = sprite->spCenterY + (sprite->spCurY >> 8);\n    if (sprite->x <= 104\n        || sprite->x > 132\n        || sprite->y <= 60\n        || sprite->y > 88)\n        sprite->callback = SpriteCallback_DestroyStar;\n}\n\nstatic void SpriteCallback_DestroyStar(struct Sprite *sprite)\n{\n    DestroySprite(sprite);\n}\n\n#undef spAnimNum\n#undef spCenterY\n#undef spCenterX\n#undef spCurY\n#undef spCurX\n#undef spDeltaY\n#undef spDeltaX\n#undef spData0\n"
  },
  {
    "path": "src/key_system_menu.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"scanline_effect.h\"\n#include \"text_window_graphics.h\"\n#include \"main_menu.h\"\n#include \"menu.h\"\n#include \"task.h\"\n#include \"overworld.h\"\n#include \"help_system.h\"\n#include \"text_window.h\"\n#include \"strings.h\"\n#include \"field_fadetransition.h\"\n#include \"gba/m4a_internal.h\"\n\n// can't include the one in menu_helpers.h since Task_KeySystemMenu needs bool32 for matching\nbool32 IsActiveOverworldLinkBusy(void);\n\n// Menu items\nenum\n{\n    MENUITEM_VERSION = 0,\n    MENUITEM_DIFFICULTY,\n    MENUITEM_ADVANCED,\n    MENUITEM_CANCEL,\n    MENUITEM_COUNT\n};\n\nenum\n{\n    MENUITEM_NUZLOCKE = 0,\n    MENUITEM_IV,\n    MENUITEM_EV,\n    MENUITEM_NO_PMC,\n    MENUITEM_EXP_MOD,\n    MENUITEM_BACK,\n    MENUITEM_COUNT2\n};\n\n// Window Ids\nenum\n{\n    WIN_TEXT_KEY,\n    WIN_KEYS\n};\n\n// RAM symbols\nstruct KeySystemMenu\n{\n    /*0x00*/ u16 option[MENUITEM_COUNT];\n             u16 subOption[MENUITEM_COUNT2];\n    /*0x0E*/ u8 cursorPos;\n    /*0x10*/ u8 loadState;\n    /*0x11*/ u8 state;\n    /*0x12*/ u8 loadPaletteState;\n             bool8 inSubMenu;\n\n};\n\nstatic EWRAM_DATA struct KeySystemMenu *sKeySystemMenuPtr = NULL;\n\n//Function Declarations\nstatic void CB2_InitKeySystemMenu(void);\nstatic void VBlankCB_KeySystemMenu(void);\nstatic void KeySystemMenu_InitCallbacks(void);\nstatic void KeySystemMenu_SetVBlankCallback(void);\nstatic void CB2_KeySystemMenu(void);\nstatic void SetKeySystemMenuTask(void);\nstatic void InitKeySystemMenuBg(void);\nstatic void KeySystemMenu_PickSwitchCancel(void);\nstatic void KeySystemMenu_ResetSpriteData(void);\nstatic bool8 LoadKeySystemMenuPalette(void);\nstatic void Task_KeySystemMenu(u8 taskId);\nstatic u8 KeySystemMenu_ProcessInput(void);\nstatic void BufferKeySystemMenuString(u8 selection);\nstatic void CloseAndSaveKeySystemMenu(u8 taskId);\nstatic void PrintKeySystemMenuHeader(void);\nstatic void DrawKeySystemMenuBg(void);\nstatic void LoadKeySystemMenuItemNames(void);\nstatic void UpdateSettingSelectionDisplay(u16 selection);\n\n// Data Definitions\nstatic const struct WindowTemplate sKeySystemMenuWinTemplates[] =\n{\n    {\n        .bg = 1,\n        .tilemapLeft = 2,\n        .tilemapTop = 3,\n        .width = 26,\n        .height = 2,\n        .paletteNum = 1,\n        .baseBlock = 2\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 7,\n        .width = 26,\n        .height = 12,\n        .paletteNum = 1,\n        .baseBlock = 0x36\n    },\n    {\n        .bg = 2,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 30,\n        .height = 2,\n        .paletteNum = 0xF,\n        .baseBlock = 0x16e\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct BgTemplate sKeySystemMenuBgTemplates[] =\n{\n   {\n       .bg = 1,\n       .charBaseIndex = 1,\n       .mapBaseIndex = 30,\n       .screenSize = 0,\n       .paletteMode = 0,\n       .priority = 0,\n       .baseTile = 0\n   },\n   {\n       .bg = 0,\n       .charBaseIndex = 1,\n       .mapBaseIndex = 31,\n       .screenSize = 0,\n       .paletteMode = 0,\n       .priority = 1,\n       .baseTile = 0\n   },\n   {\n       .bg = 2,\n       .charBaseIndex = 1,\n       .mapBaseIndex = 29,\n       .screenSize = 0,\n       .paletteMode = 0,\n       .priority = 2,\n       .baseTile = 0\n   },\n};\n\nstatic const u16 sKeySystemMenuPalette[] = INCBIN_U16(\"graphics/misc/option_menu.gbapal\");\nstatic const u16 sKeySystemMenuItemCounts[MENUITEM_COUNT] = {2, 3, 1, 0};\nstatic const u16 sKeySystemSubMenuItemCounts[MENUITEM_COUNT2] = {2, 3, 2, 2, 4, 0};\n\nstatic const u8 *const sKeySystemMenuItemsNames[MENUITEM_COUNT] =\n{\n    [MENUITEM_VERSION]    = gText_Version,\n    [MENUITEM_DIFFICULTY] = gText_Difficulty,\n    [MENUITEM_ADVANCED]   = gText_Advanced,\n    [MENUITEM_CANCEL]     = gText_OptionMenuSaveAndExit,\n};\n\nstatic const u8 *const sKeySystemSubMenuItemsNames[MENUITEM_COUNT2] ={\n    [MENUITEM_NUZLOCKE]   = gText_Nuzlocke,\n    [MENUITEM_IV]         = gText_IVCalc,\n    [MENUITEM_EV]         = gText_EVCalc,\n    [MENUITEM_NO_PMC]     = gText_NoPMC,\n    [MENUITEM_EXP_MOD]    = gText_ExpMod,\n    [MENUITEM_BACK]       = gText_Back,\n};\n\nstatic const u8 *const sVersionOptions[] =\n{\n    gText_FireredVersion, \n    gText_LeafgreenVersion\n};\n\nstatic const u8 *const sDifficultyOptions[] =\n{\n    gText_NormalDifficulty,\n    gText_ChallengeDifficulty,\n    gText_EasyDifficulty\n};\n\nstatic const u8 *const sAdvancedOptions[] =\n{\n    gText_BattleScenePressA\n};\n\nstatic const u8 *const sNuzlockeOptions[] =\n{\n    gText_Nuzlocke_Off,\n    gText_Nuzlocke_On\n};\n\nstatic const u8 *const sIVCalcOptions[] =\n{\n    gText_IVCalcStandard,\n    gText_IVCalcPerfect,\n    gText_IVCalcZero\n};\n\nstatic const u8 *const sEVCalcOptions[] =\n{\n    gText_EVCalcStandard,\n\tgText_EVCalcZero\n};\n\nstatic const u8 *const sExpModOptions[] = \n{\n    gText_ExpModZero,\n    gText_ExpModHalf,\n    gText_ExpModNormal,\n    gText_ExpModTwice\n};\n\nstatic const u8 sKeySystemMenuPickSwitchCancelTextColor[] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY};\nstatic const u8 sKeySystemMenuTextColor[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_RED};\n\n// Functions\nstatic void CB2_InitKeySystemMenu(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB_KeySystemMenu(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid CB2_KeySystemMenuFromContinueScreen(void)\n{\n    u32 i;\n    if (gMain.savedCallback == NULL)\n        gMain.savedCallback = CB2_InitMainMenu; //changed to continue screen callback\n    sKeySystemMenuPtr = AllocZeroed(sizeof(struct KeySystemMenu));\n    sKeySystemMenuPtr->loadState = 0;\n    sKeySystemMenuPtr->loadPaletteState = 0;\n    sKeySystemMenuPtr->state = 0;\n    sKeySystemMenuPtr->cursorPos = 0;\n    sKeySystemMenuPtr->inSubMenu = 0;\n    sKeySystemMenuPtr->option[MENUITEM_VERSION] = gSaveBlock1Ptr->keyFlags.version;\n    sKeySystemMenuPtr->option[MENUITEM_DIFFICULTY] = gSaveBlock1Ptr->keyFlags.difficulty;\n    sKeySystemMenuPtr->option[MENUITEM_ADVANCED] = 0;\n    sKeySystemMenuPtr->subOption[MENUITEM_NUZLOCKE] = gSaveBlock1Ptr->keyFlags.nuzlocke;\n    sKeySystemMenuPtr->subOption[MENUITEM_IV] = gSaveBlock1Ptr->keyFlags.ivCalcMode;\n    sKeySystemMenuPtr->subOption[MENUITEM_EV] = gSaveBlock1Ptr->keyFlags.evCalcMode;\n    sKeySystemMenuPtr->subOption[MENUITEM_NO_PMC] = gSaveBlock1Ptr->keyFlags.noPMC;\n    sKeySystemMenuPtr->subOption[MENUITEM_EXP_MOD] = gSaveBlock1Ptr->keyFlags.expMod;\n    if(gSaveBlock1Ptr->keyFlags.changedCalcMode != 1)\n        gSaveBlock1Ptr->keyFlags.changedCalcMode = 0;\n    gSaveBlock1Ptr->keyFlags.inKeySystemMenu = 1;\n\n    for (i = 0; i < MENUITEM_COUNT - 1; i++)\n    {\n        if (sKeySystemMenuPtr->option[i] > (sKeySystemMenuItemCounts[i]) - 1)\n            sKeySystemMenuPtr->option[i] = 0;\n    }\n    for (i = 0; i < MENUITEM_COUNT2 - 1; i++)\n    {\n        if (sKeySystemMenuPtr->subOption[i] > (sKeySystemSubMenuItemCounts[i]) - 1)\n            sKeySystemMenuPtr->subOption[i] = 0;\n    }\n    SetHelpContext(HELPCONTEXT_KEY_SYSTEM);\n    SetMainCallback2(CB2_KeySystemMenu);\n}\n\nstatic void KeySystemMenu_InitCallbacks(void)\n{\n    SetVBlankCallback(NULL);\n    SetHBlankCallback(NULL);\n}\n\nstatic void KeySystemMenu_SetVBlankCallback(void)\n{\n    SetVBlankCallback(VBlankCB_KeySystemMenu);\n}\n\nstatic void CB2_KeySystemMenu(void)\n{\n    u8 i, state;\n    state = sKeySystemMenuPtr->state;\n    switch (state)\n    {\n    case 0:\n        KeySystemMenu_InitCallbacks();\n        break;\n    case 1:\n        InitKeySystemMenuBg();\n        break;\n    case 2:\n        KeySystemMenu_ResetSpriteData();\n        break;\n    case 3:\n        if (LoadKeySystemMenuPalette() != TRUE)\n            return;\n        break;\n    case 4:\n        PrintKeySystemMenuHeader();\n        break;\n    case 5:\n        DrawKeySystemMenuBg();\n        break;\n    case 6:\n        LoadKeySystemMenuItemNames();\n        break;\n    case 7:\n        if(!sKeySystemMenuPtr->inSubMenu)\n        {\n            for (i = 0; i < MENUITEM_COUNT; i++)\n                BufferKeySystemMenuString(i);\n        }\n        else\n        {\n            for (i = 0; i < MENUITEM_COUNT2; i++)\n                BufferKeySystemMenuString(i);\n        }\n        break;\n    case 8:\n        UpdateSettingSelectionDisplay(sKeySystemMenuPtr->cursorPos);\n        break;\n    case 9:\n        KeySystemMenu_PickSwitchCancel();\n        break;\n    default:\n        SetKeySystemMenuTask();\n\t\tbreak;\n    }\n    sKeySystemMenuPtr->state++;\n}\n\nstatic void SetKeySystemMenuTask(void)\n{\n    CreateTask(Task_KeySystemMenu, 0);\n    SetMainCallback2(CB2_InitKeySystemMenu);\n}\n\nstatic void InitKeySystemMenuBg(void)\n{\n    void * dest = (void *)VRAM;\n    DmaClearLarge16(3, dest, VRAM_SIZE, 0x1000);    \n    DmaClear32(3, (void *)OAM, OAM_SIZE);\n    DmaClear16(3, (void *)PLTT, PLTT_SIZE);    \n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0);\n    ResetBgsAndClearDma3BusyFlags(0);\n    InitBgsFromTemplates(0, sKeySystemMenuBgTemplates, NELEMS(sKeySystemMenuBgTemplates));\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n    InitWindows(sKeySystemMenuWinTemplates);\n    DeactivateAllTextPrinters();\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_EFFECT_LIGHTEN);\n    SetGpuReg(REG_OFFSET_BLDY, BLDCNT_TGT1_BG1);\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON);\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n};\n\nstatic void KeySystemMenu_PickSwitchCancel(void)\n{\n    s32 x;\n    FillWindowPixelBuffer(2, PIXEL_FILL(15)); \n    if(!sKeySystemMenuPtr->inSubMenu)\n    {\n        if(sKeySystemMenuPtr->cursorPos == MENUITEM_ADVANCED)\n        {\n            x = 0xE4 - GetStringWidth(0, gText_PickSwitchCancelA, 0);\n            AddTextPrinterParameterized3(2, 0, x, 0, sKeySystemMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancelA);\n        }\n        else if(sKeySystemMenuPtr->cursorPos == MENUITEM_CANCEL)\n        {\n            x = 0xE4 - GetStringWidth(0, gText_PickSwitchExit, 0);\n            AddTextPrinterParameterized3(2, 0, x, 0, sKeySystemMenuPickSwitchCancelTextColor, 0, gText_PickSwitchExit);\n        }\n        else\n        {\n            x = 0xE4 - GetStringWidth(0, gText_PickSwitchCancel, 0);\n            AddTextPrinterParameterized3(2, 0, x, 0, sKeySystemMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancel);\n        }\n    }\n    else\n    {\n        x = 0xE4 - GetStringWidth(0, gText_PickSwitchBack, 0);\n        AddTextPrinterParameterized3(2, 0, x, 0, sKeySystemMenuPickSwitchCancelTextColor, 0, gText_PickSwitchBack);\n    }\n    PutWindowTilemap(2);\n    CopyWindowToVram(2, COPYWIN_FULL);\n}\n\nstatic void KeySystemMenu_ResetSpriteData(void)\n{\n    ResetSpriteData();\n    ResetPaletteFade();\n    FreeAllSpritePalettes();\n    ResetTasks();\n    ScanlineEffect_Stop();\n}\n\nstatic bool8 LoadKeySystemMenuPalette(void)\n{\n    switch (sKeySystemMenuPtr->loadPaletteState)\n    {\n    case 0:\n        LoadBgTiles(1, GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1AA);\n        break;\n    case 1:\n        LoadPalette(GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType)->palette, 0x20, 0x20);\n        break;\n    case 2:\n        LoadPalette(sKeySystemMenuPalette, 0x10, 0x20);\n        LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n        break;\n    case 3:\n        LoadStdWindowGfxOnBg(1, 0x1B3, BG_PLTT_ID(3));\n        break;\n    default:\n        return TRUE;\n    }\n    sKeySystemMenuPtr->loadPaletteState++;\n    return FALSE;\n}\n\nstatic void Task_KeySystemMenu(u8 taskId)\n{\n    switch (sKeySystemMenuPtr->loadState)\n    {\n    case 0:\n        BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);\n        KeySystemMenu_SetVBlankCallback();\n        sKeySystemMenuPtr->loadState++;\n        break;\n    case 1:\n        if (gPaletteFade.active)\n            return;\n        sKeySystemMenuPtr->loadState++;\n        break;\n    case 2:\n        if (((bool32)IsActiveOverworldLinkBusy()) == TRUE)\n            break;\n        switch (KeySystemMenu_ProcessInput())\n        {\n        case 0:\n            break;\n        case 1:\n            sKeySystemMenuPtr->loadState++;\n            break;\n        case 2:\n            LoadBgTiles(1, GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1AA);\n            LoadPalette(GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType)->palette, 0x20, 0x20);\n            BufferKeySystemMenuString(sKeySystemMenuPtr->cursorPos);\n            break;\n        case 3:\n            UpdateSettingSelectionDisplay(sKeySystemMenuPtr->cursorPos);\n            break;\n        case 4:\n            BufferKeySystemMenuString(sKeySystemMenuPtr->cursorPos);\n            break;\n        case 6:\n            if(!sKeySystemMenuPtr->inSubMenu)\n            {\n                sKeySystemMenuPtr->inSubMenu = TRUE;\n                PrintKeySystemMenuHeader();\n                sKeySystemMenuPtr->state = 6;\n                sKeySystemMenuPtr->loadState = 1;\n                sKeySystemMenuPtr->cursorPos = 0;\n                SetHelpContext(HELPCONTEXT_KEY_SYSTEM_SUBMENU);\n                DestroyTask(taskId);\n                SetMainCallback2(CB2_KeySystemMenu);\n                break;\n            }\n            else\n            {\n                sKeySystemMenuPtr->inSubMenu = FALSE;\n                PrintKeySystemMenuHeader();\n                sKeySystemMenuPtr->state = 6;\n                sKeySystemMenuPtr->loadState = 1;\n                sKeySystemMenuPtr->cursorPos = MENUITEM_ADVANCED;\n                SetHelpContext(HELPCONTEXT_KEY_SYSTEM);\n                DestroyTask(taskId);\n                SetMainCallback2(CB2_KeySystemMenu);\n                break;\n            }\n        }\n        break;\n    case 3:\n        BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);\n        sKeySystemMenuPtr->loadState++;\n        break;\n    case 4:\n        if (gPaletteFade.active)\n            return;\n        sKeySystemMenuPtr->loadState++;\n        break;\n    case 5:\n        CloseAndSaveKeySystemMenu(taskId);\n        break;\n    }\n}\n\nstatic u8 KeySystemMenu_ProcessInput(void)\n{ \n    u16 current;\n    u16* curr;\n\n    if (JOY_REPT(DPAD_RIGHT))\n    {\n        if(!sKeySystemMenuPtr->inSubMenu)\n        {        \n            current = sKeySystemMenuPtr->option[(sKeySystemMenuPtr->cursorPos)];\n            if (current == (sKeySystemMenuItemCounts[sKeySystemMenuPtr->cursorPos] - 1))\n                sKeySystemMenuPtr->option[sKeySystemMenuPtr->cursorPos] = 0;\n            else\n                sKeySystemMenuPtr->option[sKeySystemMenuPtr->cursorPos] = current + 1;\n            return 4;\n        }\n        else\n        {\n            current = sKeySystemMenuPtr->subOption[(sKeySystemMenuPtr->cursorPos)];\n            if (current == (sKeySystemSubMenuItemCounts[sKeySystemMenuPtr->cursorPos] - 1))\n                sKeySystemMenuPtr->subOption[sKeySystemMenuPtr->cursorPos] = 0;\n            else\n                sKeySystemMenuPtr->subOption[sKeySystemMenuPtr->cursorPos] = current + 1;\n            return 4;\n        }\n    }\n    else if (JOY_REPT(DPAD_LEFT))\n    {\n        if(!sKeySystemMenuPtr->inSubMenu)\n        {\n            curr = &sKeySystemMenuPtr->option[sKeySystemMenuPtr->cursorPos];\n            if (*curr == 0)\n                *curr = sKeySystemMenuItemCounts[sKeySystemMenuPtr->cursorPos] - 1;\n            else\n                --*curr;\n            return 4;\n        }\n        else\n        {\n            curr = &sKeySystemMenuPtr->subOption[sKeySystemMenuPtr->cursorPos];\n            if (*curr == 0)\n                *curr = sKeySystemSubMenuItemCounts[sKeySystemMenuPtr->cursorPos] - 1;\n            else\n                --*curr;\n            return 4;\n        }\n    }\n    else if (JOY_REPT(DPAD_UP))\n    {\n        if(!sKeySystemMenuPtr->inSubMenu)\n        {\n            if (sKeySystemMenuPtr->cursorPos == MENUITEM_VERSION)\n                sKeySystemMenuPtr->cursorPos = MENUITEM_CANCEL;\n            else\n                sKeySystemMenuPtr->cursorPos = sKeySystemMenuPtr->cursorPos - 1;\n        }\n        else\n        {\n            if (sKeySystemMenuPtr->cursorPos == MENUITEM_NUZLOCKE)\n                sKeySystemMenuPtr->cursorPos = MENUITEM_BACK;\n            else\n                sKeySystemMenuPtr->cursorPos = sKeySystemMenuPtr->cursorPos - 1;\n        }\n        KeySystemMenu_PickSwitchCancel();\n        return 3;             \n    }\n    else if (JOY_REPT(DPAD_DOWN))\n    {\n        if(!sKeySystemMenuPtr->inSubMenu)\n        {\n            if (sKeySystemMenuPtr->cursorPos == MENUITEM_CANCEL)\n                sKeySystemMenuPtr->cursorPos = MENUITEM_VERSION;\n            else\n                sKeySystemMenuPtr->cursorPos = sKeySystemMenuPtr->cursorPos + 1;\n        }\n        else\n        {\n            if (sKeySystemMenuPtr->cursorPos == MENUITEM_BACK)\n                sKeySystemMenuPtr->cursorPos = MENUITEM_NUZLOCKE;\n            else\n                sKeySystemMenuPtr->cursorPos = sKeySystemMenuPtr->cursorPos + 1;\n        }\n        KeySystemMenu_PickSwitchCancel();\n        return 3;\n    }\n    else if (JOY_NEW(A_BUTTON))\n    {\n        if(!sKeySystemMenuPtr->inSubMenu)\n        {\n            if(sKeySystemMenuPtr->cursorPos == MENUITEM_ADVANCED)\n                return 6;\n            if(sKeySystemMenuPtr->cursorPos == MENUITEM_CANCEL)\n                return 1;\n        }\n        else\n            return 6;\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        if(sKeySystemMenuPtr->inSubMenu)\n            return 6;\n        else\n            return 1;\n    }\n    else\n    {\n        return 0;\n    }\n}\n\nstatic void BufferKeySystemMenuString(u8 selection)\n{\n    u8 str[20];\n    u8 buf[12];\n    u8 dst[3];\n    u8 x, y;\n    \n    memcpy(dst, sKeySystemMenuTextColor, 3);\n    x = 0x69;\n    y = ((GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) - 1) * selection) + 2;\n    FillWindowPixelRect(1, 1, x, y, 0x6F, GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT));\n\n    if(!sKeySystemMenuPtr->inSubMenu)\n    {\n        switch (selection)\n        {\n            case MENUITEM_VERSION:\n                AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sVersionOptions[sKeySystemMenuPtr->option[selection]]);\n                break;\n            case MENUITEM_DIFFICULTY:\n                AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sDifficultyOptions[sKeySystemMenuPtr->option[selection]]);\n                break;\n            case MENUITEM_ADVANCED:\n                AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sAdvancedOptions[sKeySystemMenuPtr->option[selection]]);\n                break;\n            default:\n                break;\n        }\n    }\n    else\n    {\n        switch (selection)\n        {\n            case MENUITEM_NUZLOCKE:\n                AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sNuzlockeOptions[sKeySystemMenuPtr->subOption[selection]]);\n                break;\n            case MENUITEM_IV:\n                AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sIVCalcOptions[sKeySystemMenuPtr->subOption[selection]]);\n                break;\n            case MENUITEM_EV:\n                AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sEVCalcOptions[sKeySystemMenuPtr->subOption[selection]]);\n                break;\n            case MENUITEM_NO_PMC:\n                AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sNuzlockeOptions[sKeySystemMenuPtr->subOption[selection]]);\n                break;\n            case MENUITEM_EXP_MOD:\n                AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sExpModOptions[sKeySystemMenuPtr->subOption[selection]]);\n                break;\n            default:\n                break;\n        }\n    }\n    PutWindowTilemap(1);\n    CopyWindowToVram(1, COPYWIN_FULL);\n}\n\nstatic void CloseAndSaveKeySystemMenu(u8 taskId)\n{\n    gFieldCallback = FieldCB_DefaultWarpExit;\n    SetMainCallback2(gMain.savedCallback);\n    FreeAllWindowBuffers();\n    gSaveBlock1Ptr->keyFlags.version = sKeySystemMenuPtr->option[MENUITEM_VERSION];\n    gSaveBlock1Ptr->keyFlags.difficulty = sKeySystemMenuPtr->option[MENUITEM_DIFFICULTY];\n    gSaveBlock1Ptr->keyFlags.nuzlocke = sKeySystemMenuPtr->subOption[MENUITEM_NUZLOCKE];\n    if(gSaveBlock1Ptr->keyFlags.ivCalcMode != sKeySystemMenuPtr->subOption[MENUITEM_IV] || gSaveBlock1Ptr->keyFlags.evCalcMode != sKeySystemMenuPtr->subOption[MENUITEM_EV])\n    {\n        gSaveBlock1Ptr->keyFlags.changedCalcMode = 1; //iv or ev calc mode changed, recalculate party stats on saveload.\n    }\n    gSaveBlock1Ptr->keyFlags.ivCalcMode = sKeySystemMenuPtr->subOption[MENUITEM_IV];\n    gSaveBlock1Ptr->keyFlags.evCalcMode = sKeySystemMenuPtr->subOption[MENUITEM_EV];\n    gSaveBlock1Ptr->keyFlags.noPMC = sKeySystemMenuPtr->subOption[MENUITEM_NO_PMC];\n    gSaveBlock1Ptr->keyFlags.expMod = sKeySystemMenuPtr->subOption[MENUITEM_EXP_MOD];\n    gSaveBlock1Ptr->keyFlags.inKeySystemMenu = 0;\n    FREE_AND_SET_NULL(sKeySystemMenuPtr);\n    DestroyTask(taskId);\n}\n\nstatic void PrintKeySystemMenuHeader(void)\n{\n    FillWindowPixelBuffer(0, PIXEL_FILL(1));\n    if(!sKeySystemMenuPtr->inSubMenu)\n        AddTextPrinterParameterized(WIN_TEXT_KEY, 2, gText_KeySystemSettings, 8, 1, TEXT_SKIP_DRAW, NULL);\n    else\n        AddTextPrinterParameterized(WIN_TEXT_KEY, 2, gText_Advanced, 8, 1, TEXT_SKIP_DRAW, NULL);\n    PutWindowTilemap(0);\n    CopyWindowToVram(0, COPYWIN_FULL);\n}\n\nstatic void DrawKeySystemMenuBg(void)\n{\n    u8 h;\n    h = 2;\n    \n    FillBgTilemapBufferRect(1, 0x1B3, 1, 2, 1, 1, 3);\n    FillBgTilemapBufferRect(1, 0x1B4, 2, 2, 0x1B, 1, 3);\n    FillBgTilemapBufferRect(1, 0x1B5, 0x1C, 2, 1, 1, 3);\n    FillBgTilemapBufferRect(1, 0x1B6, 1, 3, 1, h, 3);\n    FillBgTilemapBufferRect(1, 0x1B8, 0x1C, 3, 1, h, 3);\n    FillBgTilemapBufferRect(1, 0x1B9, 1, 5, 1, 1, 3);\n    FillBgTilemapBufferRect(1, 0x1BA, 2, 5, 0x1B, 1, 3);\n    FillBgTilemapBufferRect(1, 0x1BB, 0x1C, 5, 1, 1, 3);\n    FillBgTilemapBufferRect(1, 0x1AA, 1, 6, 1, 1, h);\n    FillBgTilemapBufferRect(1, 0x1AB, 2, 6, 0x1A, 1, h);\n    FillBgTilemapBufferRect(1, 0x1AC, 0x1C, 6, 1, 1, h);\n    FillBgTilemapBufferRect(1, 0x1AD, 1, 7, 1, 0x10, h);\n    FillBgTilemapBufferRect(1, 0x1AF, 0x1C, 7, 1, 0x10, h);\n    FillBgTilemapBufferRect(1, 0x1B0, 1, 0x13, 1, 1, h);\n    FillBgTilemapBufferRect(1, 0x1B1, 2, 0x13, 0x1A, 1, h);\n    FillBgTilemapBufferRect(1, 0x1B2, 0x1C, 0x13, 1, 1, h);\n    CopyBgTilemapBufferToVram(1);\n}\n\nstatic void LoadKeySystemMenuItemNames(void)\n{\n    u32 i;\n    \n    FillWindowPixelBuffer(1, PIXEL_FILL(1));\n    if(!sKeySystemMenuPtr->inSubMenu)\n    {\n        for (i = 0; i < MENUITEM_COUNT; i++)\n        {\n            AddTextPrinterParameterized(WIN_KEYS, 2, sKeySystemMenuItemsNames[i], 8, (u8)((i * (GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT))) + 2) - i, TEXT_SKIP_DRAW, NULL);    \n        }\n    }\n    else\n    {\n        for (i = 0; i < MENUITEM_COUNT2; i++)\n        {\n            AddTextPrinterParameterized(WIN_KEYS, 2, sKeySystemMenuItemsNames[i + MENUITEM_COUNT], 8, (u8)((i * (GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT))) + 2) - i, TEXT_SKIP_DRAW, NULL);    \n        }\n    }\n}\n\nstatic void UpdateSettingSelectionDisplay(u16 selection)\n{\n    u16 maxLetterHeight, y;\n    \n    maxLetterHeight = GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT);\n    y = selection * (maxLetterHeight - 1) + 0x3A;\n    SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(y, y + maxLetterHeight));\n    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0x10, 0xE0));\n}\n"
  },
  {
    "path": "src/keyboard_text.c",
    "content": "#include \"global.h\"\n\n// Easy Chat keyboard\nconst u8 gText_EasyChatKeyboard_ABCDEFothers[] = _(\"{CLEAR 11}A{CLEAR 6}B{CLEAR 6}C{CLEAR 26}D{CLEAR 6}E{CLEAR 6}F{CLEAR 26}others\");\nconst u8 gText_EasyChatKeyboard_GHIJKL[] = _(\"{CLEAR 11}G{CLEAR 6}H{CLEAR 6}I{CLEAR 26}J{CLEAR 6}K{CLEAR 6}L\");\nconst u8 gText_EasyChatKeyboard_MNOPQRS[] = _(\"{CLEAR 11}M{CLEAR 6}N{CLEAR 6}O{CLEAR 26}P{CLEAR 6}Q{CLEAR 6}R{CLEAR 6}S{CLEAR 26} \");\nconst u8 gText_EasyChatKeyboard_TUVWXYZ[] = _(\"{CLEAR 11}T{CLEAR 6}U{CLEAR 6}V{CLEAR 26}W{CLEAR 6}X{CLEAR 6}Y{CLEAR 6}Z{CLEAR 26} \");\n\n// Naming Screen keyboard\nconst u8 gText_NamingScreenKeyboard_abcdef[] = _(\"{CLEAR 11}a{CLEAR 6}b{CLEAR 6}c{CLEAR 26}d{CLEAR 6}e{CLEAR 6}f{CLEAR 6} {CLEAR 26}.\");\nconst u8 gText_NamingScreenKeyboard_ghijkl[] = _(\"{CLEAR 11}g{CLEAR 6}h{CLEAR 7}i{CLEAR 27}j{CLEAR 6}k{CLEAR 6}l{CLEAR 7} {CLEAR 26},\");\nconst u8 gText_NamingScreenKeyboard_mnopqrs[] = _(\"{CLEAR 11}m{CLEAR 6}n{CLEAR 7}o{CLEAR 26}p{CLEAR 6}q{CLEAR 7}r{CLEAR 6}s{CLEAR 27} \");\nconst u8 gText_NamingScreenKeyboard_tuvwxyz[] = _(\"{CLEAR 12}t{CLEAR 6}u{CLEAR 6}v{CLEAR 26}w{CLEAR 6}x{CLEAR 6}y{CLEAR 6}z{CLEAR 26} \");\nconst u8 gText_NamingScreenKeyboard_ABCDEF[] = _(\"{CLEAR 11}A{CLEAR 6}B{CLEAR 6}C{CLEAR 26}D{CLEAR 6}E{CLEAR 6}F{CLEAR 6} {CLEAR 26}.\");\nconst u8 gText_NamingScreenKeyboard_GHIJKL[] = _(\"{CLEAR 11}G{CLEAR 6}H{CLEAR 6}I{CLEAR 26}J{CLEAR 6}K{CLEAR 6}L{CLEAR 6} {CLEAR 26},\");\nconst u8 gText_NamingScreenKeyboard_MNOPQRS[] = _(\"{CLEAR 11}M{CLEAR 6}N{CLEAR 6}O{CLEAR 26}P{CLEAR 6}Q{CLEAR 6}R{CLEAR 6}S{CLEAR 26} \");\nconst u8 gText_NamingScreenKeyboard_TUVWXYZ[] = _(\"{CLEAR 11}T{CLEAR 6}U{CLEAR 6}V{CLEAR 26}W{CLEAR 6}X{CLEAR 6}Y{CLEAR 6}Z{CLEAR 26} \");\nconst u8 gText_NamingScreenKeyboard_01234[] = _(\"{CLEAR 11}0{CLEAR 16}1{CLEAR 16}2{CLEAR 16}3{CLEAR 16}4{CLEAR 16} \");\nconst u8 gText_NamingScreenKeyboard_56789[] = _(\"{CLEAR 11}5{CLEAR 16}6{CLEAR 16}7{CLEAR 16}8{CLEAR 16}9{CLEAR 16} \");\nconst u8 gText_NamingScreenKeyboard_Symbols1[] = _(\"{CLEAR 11}!{CLEAR 16}?{CLEAR 16}♂{CLEAR 16}♀{CLEAR 16}/{CLEAR 16}-\");\nconst u8 gText_NamingScreenKeyboard_Symbols2[] = _(\"{CLEAR 11}…{CLEAR 16}“{CLEAR 16}”{CLEAR 18}‘{CLEAR 18}'{CLEAR 18} \");\n\n// Union Room Chat keyboard\nconst u8 gText_UnionRoomChatKeyboard_ABCDE[] = _(\"ABCDE\");\nconst u8 gText_UnionRoomChatKeyboard_FGHIJ[] = _(\"FGHIJ\");\nconst u8 gText_UnionRoomChatKeyboard_KLMNO[] = _(\"KLMNO\");\nconst u8 gText_UnionRoomChatKeyboard_PQRST[] = _(\"PQRST\");\nconst u8 gText_UnionRoomChatKeyboard_UVWXY[] = _(\"UVWXY\");\nconst u8 gText_UnionRoomChatKeyboard_Z[] = _(\"Z    \");\nconst u8 gText_UnionRoomChatKeyboard_01234Upper[] = _(\"01234\");\nconst u8 gText_UnionRoomChatKeyboard_56789Upper[] = _(\"56789\");\nconst u8 gText_UnionRoomChatKeyboard_PunctuationUpper[] = _(\".,!? \");\nconst u8 gText_UnionRoomChatKeyboard_SymbolsUpper[] = _(\"-/&… \");\nconst u8 gText_UnionRoomChatKeyboard_abcde[] = _(\"abcde\");\nconst u8 gText_UnionRoomChatKeyboard_fghij[] = _(\"fghij\");\nconst u8 gText_UnionRoomChatKeyboard_klmno[] = _(\"klmno\");\nconst u8 gText_UnionRoomChatKeyboard_pqrst[] = _(\"pqrst\");\nconst u8 gText_UnionRoomChatKeyboard_uvwxy[] = _(\"uvwxy\");\nconst u8 gText_UnionRoomChatKeyboard_z[] = _(\"z    \");\nconst u8 gText_UnionRoomChatKeyboard_01234Lower[] = _(\"01234\");\nconst u8 gText_UnionRoomChatKeyboard_56789Lower[] = _(\"56789\");\nconst u8 gText_UnionRoomChatKeyboard_PunctuationLower[] = _(\".,!? \");\nconst u8 gText_UnionRoomChatKeyboard_SymbolsLower[] = _(\"-/&… \");\n\nconst u8 gText_EmptyTextInput1[] = _(\"\");\nconst u8 gText_EmptyTextInput2[] = _(\"\");\nconst u8 gText_EmptyTextInput3[] = _(\"\");\nconst u8 gText_EmptyTextInput4[] = _(\"\");\nconst u8 gText_EmptyTextInput5[] = _(\"\");\nconst u8 gText_EmptyTextInput6[] = _(\"\");\nconst u8 gText_EmptyTextInput7[] = _(\"\");\nconst u8 gText_EmptyTextInput8[] = _(\"\");\n\n// Union Room Chat keyboard emojis\nconst u8 gText_UnionRoomChatKeyboard_Emoji1[] = _(\"{EMOJI_MISCHIEVOUS}{EMOJI_HAPPY}{EMOJI_ANGRY}{EMOJI_SURPRISED}{EMOJI_BIGANGER}\");\nconst u8 gText_UnionRoomChatKeyboard_Emoji2[] = _(\"{EMOJI_BIGSMILE}{EMOJI_EVIL}{EMOJI_NEUTRAL}{EMOJI_TIRED}{EMOJI_SHOCKED}\");\nconst u8 gText_UnionRoomChatKeyboard_Emoji3[] = _(\"{EMOJI_LEAF}{EMOJI_FIRE}{EMOJI_WATER}{EMOJI_BOLT}{EMOJI_BALL}\");\nconst u8 gText_UnionRoomChatKeyboard_Emoji4[] = _(\"♂♀{EMOJI_LEFT_PAREN}{EMOJI_RIGHT_PAREN}{EMOJI_TILDE}\");\nconst u8 gText_UnionRoomChatKeyboard_Emoji5[] = _(\"{EMOJI_LEFT_EYE}{EMOJI_RIGHT_EYE}{EMOJI_SMALLWHEEL}{EMOJI_SPHERE}{EMOJI_IRRITATED}\");\nconst u8 gText_UnionRoomChatKeyboard_Emoji6[] = _(\"{EMOJI_AT}{EMOJI_BIGWHEEL}{EMOJI_TONGUE}{EMOJI_ACUTE}{EMOJI_GRAVE}\");\nconst u8 gText_UnionRoomChatKeyboard_Emoji7[] = _(\"{EMOJI_RIGHT_FIST}{EMOJI_LEFT_FIST}{EMOJI_TRIANGLE_OUTLINE}{EMOJI_UNION}{EMOJI_GREATER_THAN}\");\nconst u8 gText_UnionRoomChatKeyboard_Emoji8[] = _(\"{EMOJI_CIRCLE}{EMOJI_TRIANGLE}{EMOJI_SQUARE}{EMOJI_HEART}{EMOJI_MOON}\");\nconst u8 gText_UnionRoomChatKeyboard_Emoji9[] = _(\"{EMOJI_NOTE}{EMOJI_PLUS}{EMOJI_MINUS}{EMOJI_EQUALS}{EMOJI_PIPE}\");\nconst u8 gText_UnionRoomChatKeyboard_Emoji10[] = _(\"{EMOJI_HIGHBAR}{EMOJI_UNDERSCORE};: \");\n"
  },
  {
    "path": "src/learn_move.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"script.h\"\n#include \"task.h\"\n#include \"data.h\"\n#include \"trig.h\"\n#include \"field_fadetransition.h\"\n#include \"overworld.h\"\n#include \"new_menu_helpers.h\"\n#include \"menu.h\"\n#include \"list_menu.h\"\n#include \"event_data.h\"\n#include \"text_window.h\"\n#include \"pokemon_summary_screen.h\"\n#include \"graphics.h\"\n#include \"strings.h\"\n#include \"constants/songs.h\"\n#include \"constants/moves.h\"\n\n/*\n * Move relearner state machine\n * ------------------------\n * \n * CB2_MoveRelearner_Init\n *   - Creates listMenuScrollPos to listen to right/left buttons.\n *   - Creates listMenuScrollRow to listen to up/down buttons.\n * MoveRelearnerStateMachine: MENU_STATE_FADE_TO_BLACK\n * MoveRelearnerStateMachine: MENU_STATE_WAIT_FOR_FADE\n *   - Go to MENU_STATE_IDLE_BATTLE_MODE\n * \n * MoveRelearnerStateMachine: MENU_STATE_SETUP_BATTLE_MODE\n * MoveRelearnerStateMachine: MENU_STATE_IDLE_BATTLE_MODE\n *   - If the player selected a move (pressed A), go to MENU_STATE_PRINT_TEACH_MOVE_PROMPT.\n *   - If the player cancelled (pressed B), go to MENU_STATE_PRINT_GIVE_UP_PROMPT.\n * \n * MoveRelearnerStateMachine: MENU_STATE_PRINT_TEACH_MOVE_PROMPT\n * MoveRelearnerStateMachine: MENU_STATE_TEACH_MOVE_CONFIRM\n *   - Wait for the player to confirm.\n *   - If cancelled, go to MENU_STATE_SETUP_BATTLE_MODE.\n *   - If confirmed and the pokemon had an empty move slot, set VAR_0x8004 to TRUE and go to\n *     MENU_STATE_PRINT_TEXT_THEN_FANFARE.\n *   - If confirmed and the pokemon doesn't have an empty move slot, go to\n *     MENU_STATE_PRINT_TRYING_TO_LEARN_PROMPT.\n * \n * MoveRelearnerStateMachine: MENU_STATE_PRINT_TRYING_TO_LEARN_PROMPT\n * MoveRelearnerStateMachine: MENU_STATE_WAIT_FOR_TRYING_TO_LEARN\n * MoveRelearnerStateMachine: MENU_STATE_CONFIRM_DELETE_OLD_MOVE\n *   - If the player confirms, go to MENU_STATE_PRINT_WHICH_MOVE_PROMPT.\n *   - If the player cancels, go to MENU_STATE_PRINT_STOP_TEACHING\n * \n * MoveRelearnerStateMachine: MENU_STATE_PRINT_STOP_TEACHING\n * MoveRelearnerStateMachine: MENU_STATE_WAIT_FOR_STOP_TEACHING\n * MoveRelearnerStateMachine: MENU_STATE_CONFIRM_STOP_TEACHING\n *   - If the player confirms, go to MENU_STATE_CHOOSE_SETUP_STATE.\n *   - If the player cancels, go back to MENU_STATE_PRINT_TRYING_TO_LEARN_PROMPT.\n * \n * MoveRelearnerStateMachine: MENU_STATE_PRINT_WHICH_MOVE_PROMPT\n * MoveRelearnerStateMachine: MENU_STATE_SHOW_MOVE_SUMMARY_SCREEN\n *   - Go to ShowSelectMovePokemonSummaryScreen. When done, control returns to\n *     CB2_MoveRelearner_Resume.\n * \n * MoveRelearnerStateMachine: MENU_STATE_DOUBLE_FANFARE_FORGOT_MOVE\n * MoveRelearnerStateMachine: MENU_STATE_PRINT_TEXT_THEN_FANFARE\n * MoveRelearnerStateMachine: MENU_STATE_WAIT_FOR_FANFARE\n * MoveRelearnerStateMachine: MENU_STATE_WAIT_FOR_A_BUTTON\n * MoveRelearnerStateMachine: MENU_STATE_FADE_AND_RETURN\n * MoveRelearnerStateMachine: MENU_STATE_RETURN_TO_FIELD\n *   - Clean up and go to CB2_ReturnToField.\n * \n * MoveRelearnerStateMachine: MENU_STATE_PRINT_GIVE_UP_PROMPT\n * MoveRelearnerStateMachine: MENU_STATE_GIVE_UP_CONFIRM\n *   - If the player confirms, go to MENU_STATE_FADE_AND_RETURN, and set VAR_0x8004 to FALSE.\n *   - If the player cancels, go to MENU_STATE_SETUP_BATTLE_MODE.\n * \n * CB2_MoveRelearner_Resume:\n *   - Do most of the same stuff as CB2_MoveRelearner_Init.\n * MoveRelearnerStateMachine: MENU_STATE_FADE_FROM_SUMMARY_SCREEN\n * MoveRelearnerStateMachine: MENU_STATE_TRY_OVERWRITE_MOVE\n *   - If any of the pokemon's existing moves were chosen, overwrite the move and\n *     go to MENU_STATE_DOUBLE_FANFARE_FORGOT_MOVE and set VAR_0x8004 to TRUE.\n *   - If the chosen move is the one the player selected before the summary screen,\n *     go to MENU_STATE_PRINT_STOP_TEACHING.\n * \n */\n \n#define MENU_STATE_FADE_TO_BLACK 0\n#define MENU_STATE_WAIT_FOR_FADE 1\n#define MENU_STATE_UNREACHABLE 2\n#define MENU_STATE_SETUP_BATTLE_MODE 3\n#define MENU_STATE_IDLE_BATTLE_MODE 4\n// States 5, 6, and 7 are skipped.\n#define MENU_STATE_PRINT_TEACH_MOVE_PROMPT 8\n#define MENU_STATE_TEACH_MOVE_CONFIRM 9\n// States 10 and 11 are skipped.\n#define MENU_STATE_PRINT_GIVE_UP_PROMPT 12\n#define MENU_STATE_GIVE_UP_CONFIRM 13\n#define MENU_STATE_FADE_AND_RETURN 14\n#define MENU_STATE_RETURN_TO_FIELD 15\n#define MENU_STATE_PRINT_TRYING_TO_LEARN_PROMPT 16\n#define MENU_STATE_WAIT_FOR_TRYING_TO_LEARN 17\n#define MENU_STATE_CONFIRM_DELETE_OLD_MOVE 18\n#define MENU_STATE_PRINT_WHICH_MOVE_PROMPT 19\n#define MENU_STATE_SHOW_MOVE_SUMMARY_SCREEN 20\n// States 21, 22, and 23 are skipped.\n#define MENU_STATE_PRINT_STOP_TEACHING 24\n#define MENU_STATE_WAIT_FOR_STOP_TEACHING 25\n#define MENU_STATE_CONFIRM_STOP_TEACHING 26\n#define MENU_STATE_CHOOSE_SETUP_STATE 27\n#define MENU_STATE_FADE_FROM_SUMMARY_SCREEN 28\n#define MENU_STATE_TRY_OVERWRITE_MOVE 29\n#define MENU_STATE_DOUBLE_FANFARE_FORGOT_MOVE 30\n#define MENU_STATE_PRINT_TEXT_THEN_FANFARE 31\n#define MENU_STATE_WAIT_FOR_FANFARE 32\n#define MENU_STATE_WAIT_FOR_A_BUTTON 33\n\nstruct MoveTutorMoveInfoHeaders\n{\n    const u8 *text;\n    u8 left;\n    u8 right;\n    u8 index; // unused\n};\n\nstruct LearnMoveGfxResources\n{\n    u8 state;\n    u8 unk_01;\n    u8 unk_02;\n    u8 spriteIds[2];\n    u8 filler_05[0x13];\n    u8 unk_18;\n    u8 scrollPositionMaybe;\n    u8 numLearnableMoves;\n    u8 unk_1B;\n    u8 unk_1C;\n    u8 unk_1D;\n    u8 unk_1E;\n    struct ListMenuItem listMenuItems[25];\n    u16 learnableMoves[25];\n    u8 listMenuStrbufs[25][13];\n    bool8 scheduleMoveInfoUpdate;\n    u8 selectedPartyMember;\n    u8 selectedMoveSlot;\n    u8 unk_262;\n    u8 listMenuTaskId;\n    u8 bg1TilemapBuffer[BG_SCREEN_SIZE]; // 264\n    u8 textColor[3]; // A64\n    u8 selectedIndex;\n    u16 listMenuScrollPos;\n    u16 listMenuScrollRow;\n};\n\nstatic EWRAM_DATA struct LearnMoveGfxResources * sMoveRelearner = NULL;\n\nstatic void Task_InitMoveRelearnerMenu(u8 taskId);\nstatic void CB2_MoveRelearner_Init(void);\nstatic void CB2_MoveRelearner(void);\nstatic void MoveRelearnerStateMachine(void);\nstatic void DrawTextBorderOnWindows6and7(void);\nstatic void PrintTeachWhichMoveToStrVar1(bool8 onInit);\nstatic void InitMoveRelearnerStateVariables(void);\nstatic void SpriteCB_ListMenuScrollIndicators(struct Sprite *sprite);\nstatic void SpawnListMenuScrollIndicatorSprites(void);\nstatic void MoveRelearnerInitListMenuBuffersEtc(void);\nstatic void MoveRelearnerMenuHandleInput(void);\nstatic void MoveLearnerInitListMenu(void);\nstatic void LoadMoveInfoUI(void);\nstatic void PrintMoveInfoHandleCancel_CopyToVram(void);\nstatic void MoveRelearnerMenu_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list);\nstatic s8 YesNoMenuProcessInput(void);\nstatic void PrintTextOnWindow(u8 windowId, const u8 *str, u8 x, u8 y, s32 speed, s32 colorIdx);\n\nstatic const u16 sLearnMoveInterfaceSpritesPalette[] = INCBIN_U16(\"graphics/learn_move/interface_sprites.gbapal\");\nstatic const u16 sLearnMoveInterfaceSpritesTiles[] = INCBIN_U16(\"graphics/learn_move/interface_sprites.4bpp\");\n\nstatic const u8 sMoveTutorMenuWindowFrameDimensions[][4] =\n{\n    { 0,  0, 19, 13},\n    {20,  0, 29, 13},\n    { 2, 14, 27, 19}\n};\n\nstatic const struct SpriteSheet sSpriteSheet_ListMenuScrollIndicators = {\n    sLearnMoveInterfaceSpritesTiles, 0x180, 5525\n};\n\nstatic const struct SpritePalette sSpritePalette_ListMenuScrollIndicators = {\n    sLearnMoveInterfaceSpritesPalette, 5526\n};\n\nstatic const struct OamData sOamdata_MoveRelearnerListMenuScrollIndicators = {\n    .shape = SPRITE_SHAPE(16x8),\n    .size = SPRITE_SIZE(16x8)\n};\n\nstatic const union AnimCmd sAnimCmd_ScrollIndicatorDown[] = {\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_ScrollIndicatorUp[] = {\n    ANIMCMD_FRAME(6, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_MoveRelearnerListMenuScrollIndicators[] = {\n    sAnimCmd_ScrollIndicatorDown,\n    sAnimCmd_ScrollIndicatorUp\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_MoveRelearnerListMenuScrollIndicators = {\n    5525, 5526, &sOamdata_MoveRelearnerListMenuScrollIndicators, sSpriteAnimTable_MoveRelearnerListMenuScrollIndicators, NULL, gDummySpriteAffineAnimTable, SpriteCB_ListMenuScrollIndicators\n};\n\nstatic const struct BgTemplate sBgTemplates[2] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 31,\n        .priority = 0\n    },\n    {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 8,\n        .priority = 1\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates[9] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 6,\n        .height = 7,\n        .paletteNum = 13,\n        .baseBlock = 0x014\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 10,\n        .tilemapTop = 0,\n        .width = 5,\n        .height = 5,\n        .paletteNum = 13,\n        .baseBlock = 0x03e\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 5,\n        .tilemapTop = 0,\n        .width = 5,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x057\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 15,\n        .tilemapTop = 0,\n        .width = 3,\n        .height = 5,\n        .paletteNum = 15,\n        .baseBlock = 0x061\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 5,\n        .tilemapTop = 2,\n        .width = 3,\n        .height = 3,\n        .paletteNum = 15,\n        .baseBlock = 0x070\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 6,\n        .width = 15,\n        .height = 8,\n        .paletteNum = 15,\n        .baseBlock = 0x079\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 19,\n        .tilemapTop = 1,\n        .width = 10,\n        .height = 12,\n        .paletteNum = 15,\n        .baseBlock = 0x0f1\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x169\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sMoveRelearnerYesNoMenuTemplate = {\n    .bg = 0,\n    .tilemapLeft = 21,\n    .tilemapTop = 8,\n    .width = 6,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x1d1\n};\n\nstatic const struct ListMenuTemplate sMoveRelearnerListMenuTemplate = {\n    .items = NULL,\n    .moveCursorFunc = MoveRelearnerMenu_MoveCursorFunc,\n    .itemPrintFunc = NULL,\n    .totalItems = 0,\n    .maxShowed = 7,\n    .windowId = 6,\n    .header_X = 0,\n    .item_X = 8,\n    .cursor_X = 0,\n    .upText_Y = 0,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 1,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = 0,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0,\n};\n\nstatic void VBlankCB_MoveRelearner(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid DisplayMoveTutorMenu(void)\n{\n    LockPlayerFieldControls();\n    CreateTask(Task_InitMoveRelearnerMenu, 10);\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n}\n\nstatic void Task_InitMoveRelearnerMenu(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        SetMainCallback2(CB2_MoveRelearner_Init);\n        gFieldCallback = FieldCB_ContinueScriptHandleMusic;\n        DestroyTask(taskId);\n    }\n}\n\nstatic void MoveRelearnerLoadBgGfx(void)\n{\n    int i;\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));\n    ResetTempTileDataBuffers();\n    if (InitWindows(sWindowTemplates))\n    {\n        DeactivateAllTextPrinters();\n        for (i = 0; i < NELEMS(sWindowTemplates); i++)\n        {\n            ClearWindowTilemap(i);\n            FillWindowPixelBuffer(i, PIXEL_FILL(0));\n        }\n        FillWindowPixelBuffer(7, PIXEL_FILL(1));\n        FillBgTilemapBufferRect(0, 0x000, 0, 0, 30, 20, 15);\n        SetBgTilemapBuffer(1, sMoveRelearner->bg1TilemapBuffer);\n        LoadUserWindowGfx(0, 1, BG_PLTT_ID(14));\n        ListMenuLoadStdPalAt(BG_PLTT_ID(13), 1);\n        LoadPalette(gMoveRelearner_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n        DecompressAndLoadBgGfxUsingHeap(1, gMoveRelearner_Gfx, 0, 0, 0);\n        CopyToBgTilemapBuffer(1, gMoveRelearner_Tilemap, 0, 0);\n        CopyBgTilemapBufferToVram(1);\n        SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG1VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n    }\n}\n\nstatic void CB2_MoveRelearner_Init(void)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    ResetSpriteData();\n    FreeAllSpritePalettes();\n    ResetTasks();\n    sMoveRelearner = AllocZeroed(sizeof(struct LearnMoveGfxResources));\n    InitMoveRelearnerStateVariables();\n    sMoveRelearner->selectedPartyMember = gSpecialVar_0x8004;\n    MoveRelearnerInitListMenuBuffersEtc();\n    SetVBlankCallback(VBlankCB_MoveRelearner);\n    MoveRelearnerLoadBgGfx();\n    SpawnListMenuScrollIndicatorSprites();\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n    SetMainCallback2(CB2_MoveRelearner);\n}\n\nstatic void CB2_MoveRelearner_Resume(void)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    ResetSpriteData();\n    FreeAllSpritePalettes();\n    ResetTasks();\n    MoveRelearnerInitListMenuBuffersEtc();\n    sMoveRelearner->selectedMoveSlot = gSpecialVar_0x8005;\n    SetVBlankCallback(VBlankCB_MoveRelearner);\n    MoveRelearnerLoadBgGfx();\n    SpawnListMenuScrollIndicatorSprites();\n    SetBackdropFromColor(RGB_BLACK);\n\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n    SetMainCallback2(CB2_MoveRelearner);\n}\n\nstatic void CB2_MoveRelearner(void)\n{\n    if (!IsTextPrinterActive(7))\n        MoveRelearnerStateMachine();\n    if (sMoveRelearner->scheduleMoveInfoUpdate)\n    {\n        PrintMoveInfoHandleCancel_CopyToVram();\n        sMoveRelearner->scheduleMoveInfoUpdate = FALSE;\n    }\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void StringExpandPlaceholdersAndPrintTextOnWindow7Color2(const u8 *str)\n{\n    StringExpandPlaceholders(gStringVar4, str);\n    PrintTextOnWindow(7, gStringVar4, 0, 2, GetTextSpeedSetting(), 2);\n}\n\nstatic void MoveRelearnerStateMachine(void)\n{\n    u16 move;\n\n    switch (sMoveRelearner->state)\n    {\n    case MENU_STATE_FADE_TO_BLACK:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        ShowBg(0);\n        ShowBg(1);\n        LoadMoveInfoUI();\n        sMoveRelearner->state++;\n        DrawTextBorderOnWindows6and7();\n        PrintTeachWhichMoveToStrVar1(FALSE);\n        MoveLearnerInitListMenu();\n        sMoveRelearner->scheduleMoveInfoUpdate = TRUE;\n        break;\n    case MENU_STATE_WAIT_FOR_FADE:\n        if (!gPaletteFade.active)\n            sMoveRelearner->state = 4;\n        break;\n    case MENU_STATE_UNREACHABLE:\n        sMoveRelearner->state++;\n        break;\n    case MENU_STATE_SETUP_BATTLE_MODE:\n        PrintTeachWhichMoveToStrVar1(FALSE);\n        sMoveRelearner->scheduleMoveInfoUpdate = TRUE;\n        sMoveRelearner->state++;\n        break;\n    case MENU_STATE_IDLE_BATTLE_MODE:\n        MoveRelearnerMenuHandleInput();\n        break;\n    case MENU_STATE_PRINT_TEACH_MOVE_PROMPT:\n        CreateYesNoMenu(&sMoveRelearnerYesNoMenuTemplate, FONT_NORMAL_COPY_2, 0, 2, 0x001, 14, 0);\n        sMoveRelearner->state++;\n        break;\n    case MENU_STATE_TEACH_MOVE_CONFIRM :\n        switch (YesNoMenuProcessInput())\n        {\n        case 0:\n            if (GiveMoveToMon(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex]) != 0xFFFF)\n            {\n                StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_MonLearnedMove);\n                gSpecialVar_0x8004 = TRUE;\n                sMoveRelearner->state = 31;\n            }\n            else\n            {\n                sMoveRelearner->state = 16;\n            }\n            break;\n        case 1:\n        case -1:\n            sMoveRelearner->state = 3;\n            break;\n        }\n        break;\n    case MENU_STATE_PRINT_GIVE_UP_PROMPT:\n        CreateYesNoMenu(&sMoveRelearnerYesNoMenuTemplate, FONT_NORMAL_COPY_2, 0, 2, 0x001, 14, 0);\n        sMoveRelearner->state++;\n        break;\n    case MENU_STATE_GIVE_UP_CONFIRM:\n        switch (YesNoMenuProcessInput())\n        {\n        case 0:\n            gSpecialVar_0x8004 = FALSE;\n            sMoveRelearner->state = 14;\n            break;\n        case 1:\n        case -1:\n            sMoveRelearner->state = 3;\n            break;\n        }\n        break;\n    case MENU_STATE_PRINT_TRYING_TO_LEARN_PROMPT:\n        StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_MonIsTryingToLearnMove);\n        sMoveRelearner->state++;\n        break;\n    case MENU_STATE_WAIT_FOR_TRYING_TO_LEARN:\n        CreateYesNoMenu(&sMoveRelearnerYesNoMenuTemplate, FONT_NORMAL_COPY_2, 0, 2, 0x001, 14, 0);\n        sMoveRelearner->state = 18;\n        break;\n    case MENU_STATE_CONFIRM_DELETE_OLD_MOVE:\n        switch (YesNoMenuProcessInput())\n        {\n        case 0:\n            StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_WhichMoveShouldBeForgotten);\n            sMoveRelearner->state = 19;\n            break;\n        case 1:\n        case -1:\n            sMoveRelearner->state = 24;\n            break;\n        }\n        break;\n    case MENU_STATE_PRINT_STOP_TEACHING:\n        StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_StopLearningMove);\n        sMoveRelearner->state++;\n        break;\n    case MENU_STATE_WAIT_FOR_STOP_TEACHING:\n        CreateYesNoMenu(&sMoveRelearnerYesNoMenuTemplate, FONT_NORMAL_COPY_2, 0, 2, 0x001, 14, 0);\n        sMoveRelearner->state = 26;\n        break;\n    case MENU_STATE_CONFIRM_STOP_TEACHING:\n        switch (YesNoMenuProcessInput())\n        {\n        case 0:\n            sMoveRelearner->state = 27;\n            break;\n        case 1:\n        case -1:\n            sMoveRelearner->state = 16;\n            break;\n        }\n        break;\n    case MENU_STATE_CHOOSE_SETUP_STATE :\n        sMoveRelearner->state = 3;\n        break;\n    case MENU_STATE_PRINT_WHICH_MOVE_PROMPT:\n        sMoveRelearner->state = 20;\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        break;\n    case MENU_STATE_SHOW_MOVE_SUMMARY_SCREEN:\n        if (!gPaletteFade.active)\n        {\n            ListMenuGetScrollAndRow(sMoveRelearner->listMenuTaskId, &sMoveRelearner->listMenuScrollPos, &sMoveRelearner->listMenuScrollRow);\n            FreeAllWindowBuffers();\n            ShowSelectMovePokemonSummaryScreen(gPlayerParty, sMoveRelearner->selectedPartyMember, gPlayerPartyCount - 1, CB2_MoveRelearner_Resume, sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex]);\n            sMoveRelearner->state = 28;\n        }\n        break;\n    case 21:\n        sMoveRelearner->state = 14;\n        break;\n    case 22:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        break;\n    case MENU_STATE_FADE_AND_RETURN:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sMoveRelearner->state++;\n        break;\n    case MENU_STATE_RETURN_TO_FIELD:\n        if (!gPaletteFade.active)\n        {\n            FreeAllWindowBuffers();\n            Free(sMoveRelearner);\n            SetMainCallback2(CB2_ReturnToField);\n        }\n        break;\n    case MENU_STATE_FADE_FROM_SUMMARY_SCREEN:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        ShowBg(0);\n        ShowBg(1);\n        sMoveRelearner->state++;\n        LoadMoveInfoUI();\n        DrawTextBorderOnWindows6and7();\n        MoveLearnerInitListMenu();\n        PrintTeachWhichMoveToStrVar1(TRUE);\n        PrintMoveInfoHandleCancel_CopyToVram();\n        break;\n    case MENU_STATE_TRY_OVERWRITE_MOVE:\n        if (!gPaletteFade.active)\n        {\n            if (sMoveRelearner->selectedMoveSlot == 4)\n            {\n                sMoveRelearner->state = 24;\n            }\n            else\n            {\n                move = GetMonData(&gPlayerParty[sMoveRelearner->selectedPartyMember], MON_DATA_MOVE1 + sMoveRelearner->selectedMoveSlot);\n                StringCopy(gStringVar3, gMoveNames[move]);\n                RemoveMonPPBonus(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->selectedMoveSlot);\n                SetMonMoveSlot(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex], sMoveRelearner->selectedMoveSlot);\n                StringCopy(gStringVar2, gMoveNames[sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex]]);\n                StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_1_2_and_Poof);\n                sMoveRelearner->state = 30;\n                gSpecialVar_0x8004 = TRUE;\n            }\n        }\n        break;\n    case MENU_STATE_DOUBLE_FANFARE_FORGOT_MOVE:\n        StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_MonForgotOldMoveAndMonLearnedNewMove);\n        sMoveRelearner->state = 31;\n        PlayFanfare(MUS_LEVEL_UP);\n        break;\n    case MENU_STATE_PRINT_TEXT_THEN_FANFARE:\n        PlayFanfare(MUS_LEVEL_UP);\n        sMoveRelearner->state = 32;\n        break;\n    case MENU_STATE_WAIT_FOR_FANFARE:\n        if (IsFanfareTaskInactive())\n            sMoveRelearner->state = 33;\n        break;\n    case MENU_STATE_WAIT_FOR_A_BUTTON:\n        if (JOY_NEW(A_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            sMoveRelearner->state = 14;\n        }\n        break;\n    }\n}\n\nstatic void DrawTextBorderOnWindows6and7(void)\n{\n    int i;\n    for (i = 6; i < 8; i++)\n        DrawTextBorderOuter(i, 0x001, 14);\n}\n\nstatic void PrintTeachWhichMoveToStrVar1(bool8 onInit)\n{\n    if (!onInit)\n    {\n        StringExpandPlaceholders(gStringVar4, gText_TeachWhichMoveToMon);\n        PrintTextOnWindow(7, gStringVar4, 0, 2, 0, 2);\n        PutWindowTilemap(7);\n        CopyWindowToVram(7, COPYWIN_FULL);\n    }\n}\n\nstatic void InitMoveRelearnerStateVariables(void)\n{\n    int i;\n    sMoveRelearner->state = 0;\n    sMoveRelearner->unk_02 = 0;\n    sMoveRelearner->scrollPositionMaybe = 0;\n    sMoveRelearner->unk_18 = 0;\n    sMoveRelearner->unk_1C = 0;\n    sMoveRelearner->numLearnableMoves = 0;\n    sMoveRelearner->unk_1B = 0;\n    sMoveRelearner->unk_1D = 0;\n    sMoveRelearner->unk_1E = 0;\n    sMoveRelearner->scheduleMoveInfoUpdate = FALSE;\n    for (i = 0; i < 20; i++)\n        sMoveRelearner->learnableMoves[i] = MOVE_NONE;\n}\n\nstatic void SpriteCB_ListMenuScrollIndicators(struct Sprite *sprite)\n{\n    s16 abcissa = (sprite->data[1] * 10) & 0xFF;\n    switch (sprite->data[0])\n    {\n    case 0:\n        break;\n    case 1:\n        sprite->x2 = Sin(abcissa, 3) * sprite->data[2];\n        break;\n    case 2:\n        sprite->y2 = Sin(abcissa, 1) * sprite->data[2];\n        break;\n    }\n    sprite->data[1]++;\n}\n\nstatic void SpawnListMenuScrollIndicatorSprites(void)\n{\n    int i;\n    LoadSpriteSheet(&sSpriteSheet_ListMenuScrollIndicators);\n    LoadSpritePalette(&sSpritePalette_ListMenuScrollIndicators);\n    sMoveRelearner->spriteIds[0] = CreateSprite(&sSpriteTemplate_MoveRelearnerListMenuScrollIndicators, 200, 4, 0);\n    StartSpriteAnim(&gSprites[sMoveRelearner->spriteIds[0]], 1);\n    gSprites[sMoveRelearner->spriteIds[0]].data[0] = 2;\n    gSprites[sMoveRelearner->spriteIds[0]].data[2] = -1;\n\n    // Bug: This should be using the second element of spriteIds.\n    sMoveRelearner->spriteIds[0] = CreateSprite(&sSpriteTemplate_MoveRelearnerListMenuScrollIndicators, 200, 108, 0);\n    gSprites[sMoveRelearner->spriteIds[0]].data[0] = 2;\n    gSprites[sMoveRelearner->spriteIds[0]].data[2] = 1;\n    for (i = 0; i < 2; i++)\n        gSprites[sMoveRelearner->spriteIds[i]].invisible = TRUE;\n}\n\nstatic void MoveRelearnerInitListMenuBuffersEtc(void)\n{\n    int i;\n    s32 count;\n    u8 nickname[11];\n\n    sMoveRelearner->numLearnableMoves = GetMoveRelearnerMoves(&gPlayerParty[sMoveRelearner->selectedPartyMember], sMoveRelearner->learnableMoves);\n    count = sMoveRelearner->numLearnableMoves;\n    for (i = 0; i < sMoveRelearner->numLearnableMoves; i++)\n        StringCopy(sMoveRelearner->listMenuStrbufs[i], gMoveNames[sMoveRelearner->learnableMoves[i]]);\n    GetMonData(&gPlayerParty[sMoveRelearner->selectedPartyMember], MON_DATA_NICKNAME, nickname);\n    StringCopy_Nickname(gStringVar1, nickname);\n    StringCopy(sMoveRelearner->listMenuStrbufs[sMoveRelearner->numLearnableMoves], gFameCheckerText_Cancel);\n    sMoveRelearner->numLearnableMoves++;\n    for (i = 0; i < count; i++)\n    {\n        sMoveRelearner->listMenuItems[i].label = sMoveRelearner->listMenuStrbufs[i];\n        sMoveRelearner->listMenuItems[i].index = i;\n    }\n    sMoveRelearner->listMenuItems[i].label = gFameCheckerText_Cancel;\n    sMoveRelearner->listMenuItems[i].index = 0xFE;\n    gMultiuseListMenuTemplate = sMoveRelearnerListMenuTemplate;\n    gMultiuseListMenuTemplate.items = sMoveRelearner->listMenuItems;\n    gMultiuseListMenuTemplate.totalItems = count + 1;\n}\n\nstatic void MoveRelearnerMenuHandleInput(void)\n{\n    ListMenu_ProcessInput(sMoveRelearner->listMenuTaskId);\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        if (sMoveRelearner->selectedIndex != 0xFE)\n        {\n            sMoveRelearner->state = 8;\n            StringCopy(gStringVar2, sMoveRelearner->listMenuStrbufs[sMoveRelearner->selectedIndex]);\n            StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_TeachMoveQues);\n        }\n        else\n        {\n            StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_GiveUpTryingToTeachNewMove);\n            sMoveRelearner->state = 12;\n        }\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        sMoveRelearner->state = 12;\n        StringExpandPlaceholdersAndPrintTextOnWindow7Color2(gText_GiveUpTryingToTeachNewMove);\n    }\n    if (sMoveRelearner->numLearnableMoves > 6)\n    {\n        gSprites[0].invisible = FALSE;\n        gSprites[1].invisible = FALSE;\n        if (sMoveRelearner->scrollPositionMaybe == 0)\n            gSprites[0].invisible = TRUE;\n        else if (sMoveRelearner->scrollPositionMaybe == sMoveRelearner->numLearnableMoves - 6)\n            gSprites[1].invisible = TRUE;\n    }\n}\n\nstatic void MoveLearnerInitListMenu(void)\n{\n    sMoveRelearner->listMenuTaskId = ListMenuInit(&gMultiuseListMenuTemplate, sMoveRelearner->listMenuScrollPos, sMoveRelearner->listMenuScrollRow);\n    CopyWindowToVram(6, COPYWIN_MAP);\n}\n\nstatic void PrintMoveInfo(u16 move)\n{\n    u8 buffer[50];\n    BlitMenuInfoIcon(2, gBattleMoves[move].type + 1, 1, 4);\n\n    if (gBattleMoves[move].power < 2)\n    {\n        PrintTextOnWindow(3, gText_ThreeHyphens, 1, 4, 0, 0);\n    }\n    else\n    {\n        ConvertIntToDecimalStringN(buffer, gBattleMoves[move].power, STR_CONV_MODE_RIGHT_ALIGN, 3);\n        PrintTextOnWindow(3, buffer, 1, 4, 0, 0);\n    }\n\n    if (gBattleMoves[move].accuracy == 0)\n    {\n        PrintTextOnWindow(3, gText_ThreeHyphens, 1, 18, 0, 1);\n    }\n    else\n    {\n        ConvertIntToDecimalStringN(buffer, gBattleMoves[move].accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3);\n        PrintTextOnWindow(3, buffer, 1, 18, 0, 1);\n    }\n    ConvertIntToDecimalStringN(buffer, gBattleMoves[move].pp, STR_CONV_MODE_LEFT_ALIGN, 2);\n    PrintTextOnWindow(4, buffer, 2, 2, 0, 0);\n    PrintTextOnWindow(5, gMoveDescriptionPointers[move - 1], 1, 0, 0, 0);\n}\n\nstatic void LoadMoveInfoUI(void)\n{\n    BlitMenuInfoIcon(0, MENU_INFO_ICON_TYPE, 1, 4);\n    BlitMenuInfoIcon(1, MENU_INFO_ICON_POWER, 0, 4);\n    BlitMenuInfoIcon(1, MENU_INFO_ICON_ACCURACY, 0, 19);\n    BlitMenuInfoIcon(0, MENU_INFO_ICON_PP, 1, 19);\n    BlitMenuInfoIcon(0, MENU_INFO_ICON_EFFECT, 1, 34);\n    PutWindowTilemap(0);\n    PutWindowTilemap(1);\n    PutWindowTilemap(4);\n    PutWindowTilemap(3);\n    PutWindowTilemap(5);\n    PutWindowTilemap(2);\n    PutWindowTilemap(7);\n    CopyWindowToVram(0, COPYWIN_GFX);\n    CopyWindowToVram(1, COPYWIN_GFX);\n}\n\nstatic void PrintMoveInfoHandleCancel_CopyToVram(void)\n{\n    int i;\n    if (sMoveRelearner->selectedIndex != 0xFE)\n    {\n        PrintMoveInfo(sMoveRelearner->learnableMoves[sMoveRelearner->selectedIndex]);\n    }\n    else\n    {\n        for (i = 2; i < 6; i++)\n        {\n            FillWindowPixelBuffer(i, PIXEL_FILL(0));\n            CopyWindowToVram(i, COPYWIN_GFX);\n        }\n    }\n    CopyWindowToVram(3, COPYWIN_GFX);\n    CopyWindowToVram(4, COPYWIN_GFX);\n    CopyWindowToVram(2, COPYWIN_GFX);\n    CopyWindowToVram(2, COPYWIN_GFX);\n    CopyWindowToVram(5, COPYWIN_GFX);\n    CopyWindowToVram(7, COPYWIN_FULL);\n}\n\nstatic void MoveRelearnerMenu_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)\n{\n    if (!onInit)\n    {\n        PlaySE(SE_SELECT);\n        sMoveRelearner->scheduleMoveInfoUpdate = TRUE;\n        sMoveRelearner->selectedIndex = itemIndex;\n    }\n}\n\nstatic s8 YesNoMenuProcessInput(void)\n{\n    s8 input = Menu_ProcessInputNoWrapClearOnChoose();\n    if (input != -2)\n    {\n        PutWindowTilemap(6);\n        CopyWindowToVram(6, COPYWIN_MAP);\n    }\n    return input;\n}\n\nstatic void PrintTextOnWindow(u8 windowId, const u8 *str, u8 x, u8 y, s32 speed, s32 colorIdx)\n{\n    s32 letterSpacing = 1;\n    s32 lineSpacing = 1;\n    if (colorIdx == 0 || colorIdx == 1)\n    {\n        letterSpacing = 0;\n        lineSpacing = 0;\n    }\n    switch (colorIdx)\n    {\n    case 0:\n    case 1:\n        sMoveRelearner->textColor[0] = 0;\n        sMoveRelearner->textColor[1] = 2;\n        sMoveRelearner->textColor[2] = 3;\n        break;\n    case 2:\n        sMoveRelearner->textColor[0] = 1;\n        sMoveRelearner->textColor[1] = 2;\n        sMoveRelearner->textColor[2] = 3;\n    }\n    if (colorIdx != 1)\n        FillWindowPixelBuffer(windowId, PIXEL_FILL(sMoveRelearner->textColor[0]));\n    AddTextPrinterParameterized4(windowId, FONT_NORMAL_COPY_2, x, y, letterSpacing, lineSpacing, sMoveRelearner->textColor, speed, str);\n}\n"
  },
  {
    "path": "src/libagbsyscall.s",
    "content": "\t.include \"constants/gba_constants.inc\"\n\t.include \"asm/macros.inc\"\n\n\t.syntax unified\n\n\t.text\n\n\tthumb_func_start ArcTan2\nArcTan2:\n\tsvc 0xA\n\tbx lr\n\tthumb_func_end ArcTan2\n\n\tthumb_func_start BgAffineSet\nBgAffineSet:\n\tsvc 0xE\n\tbx lr\n\tthumb_func_end BgAffineSet\n\n\tthumb_func_start CpuFastSet\nCpuFastSet:\n\tsvc 0xC\n\tbx lr\n\tthumb_func_end CpuFastSet\n\n\tthumb_func_start CpuSet\nCpuSet:\n\tsvc 0xB\n\tbx lr\n\tthumb_func_end CpuSet\n\n\tthumb_func_start Div\nDiv:\n\tsvc 0x6\n\tbx lr\n\tthumb_func_end Div\n\n\tthumb_func_start LZ77UnCompVram\nLZ77UnCompVram:\n\tsvc 0x12\n\tbx lr\n\tthumb_func_end LZ77UnCompVram\n\n\tthumb_func_start LZ77UnCompWram\nLZ77UnCompWram:\n\tsvc 0x11\n\tbx lr\n\tthumb_func_end LZ77UnCompWram\n\n\tthumb_func_start MultiBoot\nMultiBoot:\n\tmovs r1, 0x1\n\tsvc 0x25\n\tbx lr\n\tthumb_func_end MultiBoot\n\n\tthumb_func_start ObjAffineSet\nObjAffineSet:\n\tsvc 0xF\n\tbx lr\n\tthumb_func_end ObjAffineSet\n\n\tthumb_func_start RegisterRamReset\nRegisterRamReset:\n\tsvc 0x1\n\tbx lr\n\tthumb_func_end RegisterRamReset\n\n\tthumb_func_start SoftReset\nSoftReset:\n\tldr r3, =REG_IME\n\tmovs r2, 0\n\tstrb r2, [r3]\n\tldr r1, =0x03007f00 @ User Stack\n\tmov sp, r1\n\tsvc 0x1\n\tsvc 0\n\t.pool\n\tthumb_func_end SoftReset\n\n\tthumb_func_start Sqrt\nSqrt:\n\tsvc 0x8\n\tbx lr\n\tthumb_func_end Sqrt\n\n\tthumb_func_start VBlankIntrWait\nVBlankIntrWait:\n\tmovs r2, 0\n\tsvc 0x5\n\tbx lr\n\tthumb_func_end VBlankIntrWait\n\n\t.align 2, 0 @ Don't pad with nop.\n"
  },
  {
    "path": "src/libgcnmultiboot.s",
    "content": "@ This library can be used to download and execute a multi-boot image from\n@ a GameCube using the JOY Bus protocol over the link cable.\n\n\t.include \"asm/macros.inc\"\n\t.include \"constants/constants.inc\"\n\n\t.equiv GCMB_STRUCT_COUNTER1,            0x00\n\t.equiv GCMB_STRUCT_COUNTER2,            0x01\n\t.equiv GCMB_STRUCT_MBPROGRESS,          0x02\n\t.equiv GCMB_STRUCT_SAVEDVCOUNT,         0x03\n\t.equiv GCMB_STRUCT_KEYA,                0x04\n\t.equiv GCMB_STRUCT_KEYB,                0x08\n\t.equiv GCMB_STRUCT_KEYC,                0x0C\n\t.equiv GCMB_STRUCT_BOOT_KEY,            0x10\n\t.equiv GCMB_STRUCT_IMAGE_SIZE,          0x12\n\t.equiv GCMB_STRUCT_SESSION_KEY,         0x14\n\t.equiv GCMB_STRUCT_HASH_VAL,            0x18\n\t.equiv GCMB_STRUCT_KEYC_DERIVATION,     0x1C\n\t.equiv GCMB_STRUCT_BASE_DEST_PTR,       0x20\n\t.equiv GCMB_STRUCT_CUR_DEST_PTR,        0x24\n\t.equiv GCMB_STRUCT_SERIAL_INTR_HANDLER, 0x28\n\n\t.equiv ROM_HEADER_NINTENDO_LOGO_OFFSET, 0x04\n\t.equiv ROM_HEADER_NINTENDO_LOGO_LENGTH, 0x98\n\t.equiv ROM_HEADER_NINTENDO_LOGO_END,    0xA0\n\t\n\t.equiv MBPROGRESS_NONE,                 0x00\n\t.equiv MBPROGRESS_LOGO_CORRECT,         0x01\n\t.equiv MBPROGRESS_READY_TO_BOOT,        0x02\n\t\n\t.equiv GCMB_MAGIC_BOOTKEY_HASHVAL,      0xBB\n\t.equiv GCMB_MAGIC_BOOTKEY,              0xBB\n\t.equiv GCMB_MAGIC_COUNTER2,             0xCC\n\t.equiv GCMB_MAGIC_KEYA,                 0xDD\n\t.equiv GCMB_MAGIC_KEYB,                 0xEE\n\t.equiv GCMB_MAGIC_KEYCDERIVATION,       0xFF\n\n\t.syntax unified\n\n\t.text\n\n\tthumb_func_start GameCubeMultiBoot_Hash\nGameCubeMultiBoot_Hash:\n\tpush {r4,lr}\n\tldr r4, pool_HashVal\n\teors r3, r1\n\tmovs r2, 0x20\n\nGameCubeMultiBoot_Hash_Loop:\n\tlsrs r3, 1\n\tbcc GameCubeMultiBoot_Hash_SkipEor\n\n\teors r3, r4\n\nGameCubeMultiBoot_Hash_SkipEor:\n\tsubs r2, 0x1\n\tbne GameCubeMultiBoot_Hash_Loop\n\n\tpop {r4,pc}\n\tthumb_func_end GameCubeMultiBoot_Hash\n\n\tthumb_func_start GameCubeMultiBoot_Main\n@ void GameCubeMultiBoot_Main(struct GameCubeMultiBoot *mb)@\nGameCubeMultiBoot_Main:\n\t@ If there is no interrupt handler, skip counter manipulation\n\tldr r1, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]\n\tcmp r1, 0\n\tbeq GameCubeMultiBoot_Main_SkipCounters\n\t@ Increment the second counter\n\tldrb r1, [r0, GCMB_STRUCT_COUNTER2]\n\tadds r1, 0x1\n\tstrb r1, [r0, GCMB_STRUCT_COUNTER2]\n\t@ If there is nothing more to do, bail out\n\tldrb r1, [r0, GCMB_STRUCT_MBPROGRESS]\n\tcmp r1, MBPROGRESS_READY_TO_BOOT\n\tbeq GameCubeMultiBoot_Main_Return\n\t@ Save current interrupt master register value\n\tldr r3, pool_InterruptRegs\n\tldrh r2, [r3, OFFSET_REG_IME - 0x200]\n\t@ Disable all interrupts\n\tmovs r1, 0\n\tstrh r1, [r3, OFFSET_REG_IME - 0x200]\n\t@ Increment the first counter, if it's less than or equal to 10.\n\tldrb r1, [r0, GCMB_STRUCT_COUNTER1]\n\tcmp r1, 0xA\n\tbgt GameCubeMultiBoot_Main_SkipCounter1Inc\n\tadds r1, 0x1\n\tstrb r1, [r0, GCMB_STRUCT_COUNTER1]\nGameCubeMultiBoot_Main_SkipCounter1Inc:\n\t@ Load the saved interrupt master register value (re-enables interrupts if they were enabled before)\n\tstrh r2, [r3, OFFSET_REG_IME - 0x200]\nGameCubeMultiBoot_Main_SkipCounters:\n\t@ Initialise multiboot structures if required\n\tbcs GameCubeMultiBoot_Init\n\t@ Skip this section (check Nintendo logo) if the check has already passed\n\tldrb r1, [r0, GCMB_STRUCT_MBPROGRESS]\n\tcmp r1, MBPROGRESS_NONE\n\tbne GameCubeMultiBoot_Main_SkipLogoCheck\n\t@ Bail out if no multiboot image data has been transferred yet\n\tldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]\n\tldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR]\n\tsubs r1, r2\n\tbeq GameCubeMultiBoot_Main_Return2\n\t@ Also bail out if not enough data has been transferred\n\tcmp r1, ROM_HEADER_NINTENDO_LOGO_END\n\tbcc GameCubeMultiBoot_Main_Return2\n\t@ Compare the Nintendo logo of the transferred multiboot image header, with the one in the ROM image of the inserted cart\n\tpush {r4-r6}\n\tmovs r1, ROM_HEADER_NINTENDO_LOGO_LENGTH\n\tadds r2, ROM_HEADER_NINTENDO_LOGO_OFFSET\n\tldr r4, pool_NintendoLogo\nGameCubeMultiBoot_Main_LogoCmpLoop:\n\tldm r2!, {r5}\n\tldm r4!, {r6}\n\tcmp r5, r6\n\tbne GameCubeMultiBoot_Main_LogoCmpEnd\n\tsubs r1, 0x4\n\tbne GameCubeMultiBoot_Main_LogoCmpLoop\n\tldm r2!, {r5}\n\tldm r4!, {r6}\n\teors r5, r6\n\tlsrs r5, 8\n\tstr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR]\nGameCubeMultiBoot_Main_LogoCmpEnd:\n\tpop {r4-r6}\n\t@ Throw everything away if the logo data didn't match\n\tbne GameCubeMultiBoot_Init\n\t@ Logo matched, set the relevent multiboot progress bit\n\tmovs r1, MBPROGRESS_LOGO_CORRECT\n\tstrb r1, [r0, GCMB_STRUCT_MBPROGRESS]\n\t@ XOR together KeyA and KeyB to get the initial multiboot image checksum value\n\tldr r1, [r0, GCMB_STRUCT_KEYA]\n\tldr r2, [r0, GCMB_STRUCT_KEYB]\n\teors r1, r2\n\tstr r1, [r0, GCMB_STRUCT_HASH_VAL]\n\t@ ...also use it as the initial value for the image encryption session key. Algorithm is the same as the GBA BIOS multiboot: sessionkey = (initialvalue * 0x6177614b) + 1\n\tldr r2, pool_Kawa\n\tmuls r1, r2\n\tadds r1, 0x1\n\tstr r1, [r0, GCMB_STRUCT_SESSION_KEY]\nGameCubeMultiBoot_Main_Return:\n\tbx lr\nGameCubeMultiBoot_Main_SkipLogoCheck:\n\t@ If this code is executed, then the logo check has passed, and the data being transferred in is encrypted.\n\t@ Set up registers.\n\tldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]\n\tmov r12, r1\n\tldr r3, [r0, GCMB_STRUCT_HASH_VAL]\n\tpush {r4-r7}\n\tldr r4, [r0, GCMB_STRUCT_BASE_DEST_PTR]\n\tldr r5, pool_Kawa\n\tldr r6, [r0, GCMB_STRUCT_SESSION_KEY]\n\tldr r7, pool_HashVal\nGameCubeMultiBoot_Main_ImageDecryptHashLoop:\n\t@ If there's no more data, break out of the loop\n\tcmp r4, r12\n\tbcs GameCubeMultiBoot_Main_ImageDecryptHashEnd\n\t@ Get the next uint32\n\tldr r1, [r4]\n\t@ Decrypt the ciphertext: plaintext = (ciphertext ^ sessionkey) + hashval\n\teors r1, r6\n\tadds r1, r3\n\t@ Save the current uint32 of plaintext and advance the pointer\n\tstm r4!, {r1}\n\t@ Advance the hashval with this uint32 of plaintext -- this is the same code as GameCubeMultiBoot_Hash.\n\teors r3, r1\n\tmovs r2, 0x20\nGameCubeMultiBoot_Main_HashLoop:\n\tlsrs r3, 1\n\tbcc GameCubeMultiBoot_Main_HashSkipEor\n\teors r3, r7\nGameCubeMultiBoot_Main_HashSkipEor:\n\tsubs r2, 0x1\n\tbne GameCubeMultiBoot_Main_HashLoop\n\t@ Advance the sessionkey with the usual algorithm: sessionkey = (sessionkey * 0x6177614b) + 1\n\tmuls r6, r5\n\tadds r6, 0x1\n\tb GameCubeMultiBoot_Main_ImageDecryptHashLoop\nGameCubeMultiBoot_Main_ImageDecryptHashEnd:\n\t@ Save the new pointer, sessionkey, hashval\n\tstr r4, [r0, GCMB_STRUCT_BASE_DEST_PTR]\n\tstr r6, [r0, GCMB_STRUCT_SESSION_KEY]\n\tpop {r4-r7}\n\tstr r3, [r0, GCMB_STRUCT_HASH_VAL]\n\t@ Bail out if the image size is unknown\n\tldrh r1, [r0, GCMB_STRUCT_IMAGE_SIZE]\n\tcmp r1, 0\n\tbne GameCubeMultiBoot_Main_Return2\n\t@ Bail out if no image data has been transferred\n\tldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]\n\tldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR]\n\tcmp r1, r2\n\tbne GameCubeMultiBoot_Main_Return2\n\t@ If KeyC hasn't been generated yet, go generate it\n\tldr r1, [r0, GCMB_STRUCT_KEYC]\n\tcmp r1, 0\n\tbeq GameCubeMultiBoot_Main_GenerateKeyC\n\t@ If the other side hasn't sent its boot key yet, bail out\n\tldrh r1, [r0, GCMB_STRUCT_BOOT_KEY]\n\tcmp r1, 0\n\tbeq GameCubeMultiBoot_Main_Return\n\t@ Save off LR so it doesn't get clobbered by the upcoming function call\n\tmov r12, lr\n\t@ Generate the real boot key, which is the checksum of a hardcoded value and KeyC\n\tmovs r1, GCMB_MAGIC_BOOTKEY_HASHVAL\n\tldr r3, [r0, GCMB_STRUCT_KEYC]\n\tbl GameCubeMultiBoot_Hash\n\tldrh r1, [r0, GCMB_STRUCT_BOOT_KEY]\n\t@ Restore the saved LR value\n\tmov lr, r12\n\t@ Compare the two boot keys (real and passed in), if they don't match then throw everything away\n\tsubs r1, r3\n\tbne GameCubeMultiBoot_Init\n\t@ The two boot keys matched, tell the caller that the image is ready to boot\n\tmovs r1, MBPROGRESS_READY_TO_BOOT\n\tstrb r1, [r0, GCMB_STRUCT_MBPROGRESS]\n\t@ Nothing more to do, return.\n\tbx lr\nGameCubeMultiBoot_Main_GenerateKeyC:\n\t@ Save off LR so it doesn't get clobbered by the upcoming function call\n\tmov r12, lr\n\t@ KeyC = (SavedVCount << 24) - 1\n\tldrb r1, [r0, GCMB_STRUCT_SAVEDVCOUNT]\n\tlsls r1, 24\n\tsubs r1, 0x1\n\tstr r1, [r0, GCMB_STRUCT_KEYC]\n\t@ Hash the KeyC with the multiboot image checksum to generate the KeyC derivation material to be sent to the other side of the link\n\tbl GameCubeMultiBoot_Hash\n\t@ Make sure the sent KeyC derivation material contains a magic value so that the other side can detect it\n\tlsls r3, 8\n\tadds r3, GCMB_MAGIC_KEYCDERIVATION\n\t@ Save off the KeyC derivation material and return to caller\n\tstr r3, [r0, GCMB_STRUCT_KEYC_DERIVATION]\n\tbx r12\nGameCubeMultiBoot_Main_Return2:\n\tbx lr\n\tthumb_func_end GameCubeMultiBoot_Main\n\n\t.align 2, 0\n\npool_HashVal: .4byte 0xa1c1\n\npool_Kawa: .ascii \"Kawa\" @ name of BIOS developer\n\npool_NintendoLogo: .4byte RomHeaderNintendoLogo\n\n\tthumb_func_start GameCubeMultiBoot_ExecuteProgram\n@ void GameCubeMultiBoot_ExecuteProgram(struct GameCubeMultiBoot *mb)@\nGameCubeMultiBoot_ExecuteProgram:\n\t@ If there's no multiboot image ready, just return to caller\n\tldrb r1, [r0, GCMB_STRUCT_MBPROGRESS]\n\tcmp r1, MBPROGRESS_READY_TO_BOOT\n\tbne GameCubeMultiBoot_ExecuteProgram_Fail\n\t@ Disable interrupts\n\tldr r3, pool_InterruptRegs\n\tmovs r1, 0\n\tstrh r1, [r3, OFFSET_REG_IME - 0x200]\n\t@ Jump to the real entry point of the multiboot image (past the image header), in ARM mode\n\tldr r1, pool_MultiBootLoadAddr\n\tadds r1, 0xC0\n\tbx r1\nGameCubeMultiBoot_ExecuteProgram_Fail:\n\tbx lr\n\tthumb_func_end GameCubeMultiBoot_ExecuteProgram\n\n\tthumb_func_start GameCubeMultiBoot_Init\n@ void GameCubeMultiBoot_Init(struct GameCubeMultiBoot *mb)@\nGameCubeMultiBoot_Init:\n\tldr r3, pool_InterruptRegs\n\n@ Save IME register.\n\tldrh r2, [r3, OFFSET_REG_IME - 0x200]\n\n@ Disable interrupts.\n\tmovs r1, 0\n\tstrh r1, [r3, OFFSET_REG_IME - 0x200]\n\n@ Set the handler to the \"Stop\" routine.\n@ Unless the first command that is received is a device reset command, the\n@ \"Stop\" routine will be executed and no further commands will be processed.\n\tadr r3, GcMbIntrHandler_Stop\n\tstr r3, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]\n\n\tldrb r3, [r0, 0x3]\n\tpush {r3}\n\tldrb r3, [r0, 0x1]\n\tpush {r0,r3}\n\n\tadds r3, r0, 0\n\tadds r3, GCMB_STRUCT_BASE_DEST_PTR\n\n@ clear all but the last 3 fields of the struct\nGameCubeMultiBoot_Init_ClearStructLoop:\n\tstm r0!, {r1}\n\tcmp r0, r3\n\tblo GameCubeMultiBoot_Init_ClearStructLoop\n\n\tpop {r0,r3}\n\tlsrs r3, 1\n\tstrb r3, [r0, 0x3]\n\tpop {r3}\n\tstrb r3, [r0, 0x1]\n\n\tldr r3, pool_SerialRegs\n\n@ Turn off JOY Bus mode.\n\tlsls r0, r3, 10\n\tstrh r0, [r3, OFFSET_REG_RCNT - 0x120]\n\n@ Turn on JOY Bus mode.\n\tmovs r0, 0xC0\n\tlsls r0, 8\n\tstrh r0, [r3, OFFSET_REG_RCNT - 0x120]\n\n@ Init JOY Bus registers.\n\tmovs r0, 0x47\n\tstrh r0, [r3, OFFSET_REG_JOYCNT - 0x120]\n\tstrh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]\n\n\tldr r3, pool_InterruptRegs\n\n@ Acknowledge serial interrupt.\n\tmovs r0, INTR_FLAG_SERIAL\n\tstrh r0, [r3, OFFSET_REG_IF - 0x200]\n\n@ Enable serial interrupt.\n\tldrh r1, [r3, OFFSET_REG_IE - 0x200]\n\torrs r1, r0\n\tstrh r1, [r3, OFFSET_REG_IE - 0x200]\n\n@ Restore IME register.\n\tstrh r2, [r3, OFFSET_REG_IME - 0x200]\n\n\tbx lr\n\tthumb_func_end GameCubeMultiBoot_Init\n\n\tnon_word_aligned_thumb_func_start GameCubeMultiBoot_HandleSerialInterrupt\n@ void GameCubeMultiBoot_HandleSerialInterrupt(struct GameCubeMultiBoot *mb)@\nGameCubeMultiBoot_HandleSerialInterrupt:\n\tldr r3, pool_SerialRegs\n\n@ Acknowledge reset/receive/send flags.\n\tldrh r1, [r3, OFFSET_REG_JOYCNT - 0x120]\n\tstrh r1, [r3, OFFSET_REG_JOYCNT - 0x120]\n\n\tmovs r2, 0\n\tstrb r2, [r0]\n\n\tldr r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]\n\tcmp r2, 0\n\tbeq GameCubeMultiBoot_HandleSerialInterruptDone\n\n\tlsrs r1, 1 @ was a device reset command received?\n\tbcs GameCubeMultiBoot_BeginHandshake @ branch if so\n\n\tmov pc, r2\n\n\t.align 2, 0\n\n@ Zero the status and the interrupt handler pointer.\n@ Commands from the GameCube will not be processed after this is executed\n@ unless GameCubeMultiBoot_Init() is called again.\nGcMbIntrHandler_Stop:\n\tmovs r2, 0\n\tstrh r2, [r3, OFFSET_REG_JOYSTAT - 0x120]\n\nGameCubeMultiBoot_SetInterruptHandler:\n\tstr r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]\n\nGameCubeMultiBoot_ReadVCount:\n\tldr r3, pool_RegDispstat\n\tldrh r1, [r3, OFFSET_REG_VCOUNT - OFFSET_REG_DISPSTAT]\n\tstrb r1, [r0, 0x3]\n\nGameCubeMultiBoot_HandleSerialInterruptDone:\n\tbx lr\n\nGameCubeMultiBoot_BeginHandshake:\n\t@ Throw away anything that got sent\n\tldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]\n\t@ Send the game code, the other side of the link must send back the same game code\n\tldr r1, pool_RubyUSAGameCode\n\tstr r1, [r3, OFFSET_REG_JOY_TRANS - 0x120]\n\tmovs r1, 0x10\n\tstrh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]\n\t@ Use the saved VCount value to provide 8 bits of entropy for KeyB\n\tldrb r1, [r0, GCMB_STRUCT_SAVEDVCOUNT]\n\tstrb r1, [r0, GCMB_STRUCT_KEYB + 1]\n\t@ If a multiboot image has been transferred at least enough such that the Nintendo logo check has passed, stop everything.\n\tldrb r1, [r0, GCMB_STRUCT_MBPROGRESS]\n\tcmp r1, 0\n\tbne GcMbIntrHandler_Stop\n\t@ Set the image destination pointers.\n\tldr r1, pool_MultiBootLoadAddr\n\tstr r1, [r0, GCMB_STRUCT_BASE_DEST_PTR]\n\tstr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]\n\t@ Set the new interrupt handler.\n\tadr r2, GcMbIntrHandler_CheckGameCodeSent\n\tb GameCubeMultiBoot_SetInterruptHandler\n\n\t.align 2, 0\n\nGcMbIntrHandler_CheckGameCodeSent:\n\tlsls r1, 31\n\tbcc GcMbIntrHandler_Stop @ stop if send failed\n\tbmi GameCubeMultiBoot_CheckHandshakeResponse @ branch if receive is complete\n\n@ If the response hasn't been fully received yet,\n@ check again upon the next interrupt.\n\tadr r2, GcMbIntrHandler_CheckHandshakeResponse\n\tb GameCubeMultiBoot_SetInterruptHandler\n\n\t.align 2, 0\n\nGcMbIntrHandler_CheckHandshakeResponse:\n\tlsrs r1, 1 @ is receive complete?\n\tbcc GcMbIntrHandler_Stop @ stop if not\n\nGameCubeMultiBoot_CheckHandshakeResponse:\n\tldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]\n\tldr r2, pool_RubyUSAGameCode\n\tcmp r1, r2\n\tbne GcMbIntrHandler_Stop @ stop if the GameCube didn't reply with the same game code\n\t@ Use the saved VCount value to provide another 8 bits of entropy for KeyB.\n\tldrb r1, [r0, GCMB_STRUCT_SAVEDVCOUNT]\n\tstrb r1, [r0, GCMB_STRUCT_KEYB + 3]\n\tadr r2, GcMbIntrHandler_ReceiveKeyA\n\tb GameCubeMultiBoot_SetInterruptHandler\n\n\t.align 2, 0\n\nGcMbIntrHandler_ReceiveKeyA:\n\tlsrs r1, 1 @ is receive complete?\n\tbcc GcMbIntrHandler_Stop @ branch if not\n\tldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]\n\t@ make sure top 8 bits of the received value is the KeyA magic number, stop if KeyA is invalid \n\tlsrs r2, r1, 24\n\tcmp r2, GCMB_MAGIC_KEYA\n\tbne GcMbIntrHandler_Stop\n\t@ save received KeyA\n\tstr r1, [r0, GCMB_STRUCT_KEYA]\n\t@ use the second GameCubeMultiBoot_Main() counter as another 8 bits of entropy for KeyB\n\tldrb r1, [r0, GCMB_STRUCT_COUNTER2]\n\tstrb r1, [r0, GCMB_STRUCT_KEYB + 2]\n\tmovs r2, 0\n\tmovs r3, 0\n\tldr r1, [r0, GCMB_STRUCT_KEYB]\n\tlsrs r1, 8\n\t@ make sure KeyB is valid (other side of the link is supposed to check KeyB too), if it's not then change the byte that was just set so it is\nGameCubeMultiBoot_KeyBCheckLoop:\n\tlsrs r1, 1\n\tadcs r2, r3\n\tcmp r1, 0\n\tbne GameCubeMultiBoot_KeyBCheckLoop\n\tcmp r2, 0xE\n\tbgt GameCubeMultiBoot_KeyBSaveNewByte\n\tcmp r2, 0x7\n\tbge GameCubeMultiBoot_KeyBCheckEnd\n\tmovs r1, 0xFF\nGameCubeMultiBoot_KeyBSaveNewByte:\n\tstrb r1, [r0, GCMB_STRUCT_KEYB + 2]\nGameCubeMultiBoot_KeyBCheckEnd:\n\t@ add in the KeyB magic number and send off KeyB\n\tldr r1, [r0, GCMB_STRUCT_KEYB]\n\tadds r1, GCMB_MAGIC_KEYB\n\tldr r3, pool_SerialRegs\n\tstr r1, [r3, OFFSET_REG_JOY_TRANS - 0x120]\n\tmovs r1, 0x30\n\tstrh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]\n\t@ set new interrupt handler\n\tadr r2, GcMbIntrHandler_CheckKeyBSent\n\tb GameCubeMultiBoot_SetInterruptHandler\n\n\t.align 2, 0\n\nGcMbIntrHandler_CheckKeyBSent:\n\tlsls r1, 31\n\tbcc GcMbIntrHandler_Stop @ stop if send failed\n\tbmi GameCubeMultiBoot_CheckImageSizeResponse @ branch if receive is complete\n\tadr r2, GcMbIntrHandler_CheckImageSizeResponse\n\tb GameCubeMultiBoot_SetInterruptHandler\n\n\t.align 2, 0\n\nGcMbIntrHandler_CheckImageSizeResponse:\n\tlsrs r1, 1 @ is receive complete?\n\tbcc GcMbIntrHandler_Stop @ branch if not\nGameCubeMultiBoot_CheckImageSizeResponse:\n\tldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]\n\tldr r2, GameCubeMultiBoot_MaximumImageSizeUInt32s\n\tcmp r1, r2\n\tbhs GcMbIntrHandler_Stop\n\tadds r1, 0x1\n\tadds r1, r1\n\tstrh r1, [r0, GCMB_STRUCT_IMAGE_SIZE]\n\tldrb r1, [r0, GCMB_STRUCT_MBPROGRESS]\n\tcmp r1, 0\nGcMbIntrHandler_StopIfNotEqual:\n\tbne GcMbIntrHandler_Stop\n\tldr r1, pool_MultiBootLoadAddr\n\tstr r1, [r0, GCMB_STRUCT_BASE_DEST_PTR]\n\tstr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]\n\tadr r2, GcMbIntrHandler_CheckImageResponse\n\tb GameCubeMultiBoot_SetInterruptHandler\n\n\t.align 2, 0\n\nGcMbIntrHandler_CheckImageResponse:\n\tlsrs r1, 1 @ is receive complete?\n\tbcc GcMbIntrHandler_Stop @ branch if not\n\tldr r2, [r0, GCMB_STRUCT_CUR_DEST_PTR]\n\tmovs r1, 0x4\n\tands r1, r2\n\tadds r1, 0x8\n\tlsls r1, 2\n\tstrh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]\n\t@ get the recieved uint32\n\tldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]\n\t@ put it in the current destination pointer and advance that pointer\n\tstm r2!, {r1}\n\t@ save off the advanced pointer\n\tstr r2, [r0, GCMB_STRUCT_CUR_DEST_PTR]\n\t@ decrease the image size (in uint32s)\n\tldrh r1, [r0, GCMB_STRUCT_IMAGE_SIZE]\n\tsubs r1, 0x1\n\tstrh r1, [r0, GCMB_STRUCT_IMAGE_SIZE]\n\t@ branch away if the transfer is not yet complete\n\tbne GameCubeMultiBoot_ReadVCount\n\nGcMbIntrHandler_SendCounter2:\n\t@ send counter2 with magic number\n\tldrb r1, [r0, GCMB_STRUCT_COUNTER2]\n\tlsls r1, 8\n\tadds r1, GCMB_MAGIC_COUNTER2\n\tstr r1, [r3, OFFSET_REG_JOY_TRANS - 0x120]\n\tadr r2, GcMbIntrHandler_CheckCounter2Sent\n\tb GameCubeMultiBoot_SetInterruptHandler\n\n\t.align 2, 0\n\nGcMbIntrHandler_CheckCounter2Sent:\n\tlsls r1, 31\n\nGcMbIntrHandler_StopIfSendFailed:\n\tbcc GcMbIntrHandler_Stop @ stop if send failed\n\t@ if KeyC derivation value has not yet been generated, send Counter2 again, otherwise, send KeyC derivation\n\tldr r1, [r0, GCMB_STRUCT_KEYC_DERIVATION]\n\tcmp r1, 0\n\tbeq GcMbIntrHandler_SendCounter2\n\tstr r1, [r3, OFFSET_REG_JOY_TRANS - 0x120]\n\tadr r2, GcMbIntrHandler_CheckKeyCDerivationSent\n\tb GameCubeMultiBoot_SetInterruptHandler\n\n\t.align 2, 0\n\nGcMbIntrHandler_CheckKeyCDerivationSent:\n\tlsls r1, 31\n\tbcc GcMbIntrHandler_StopIfSendFailed @ branch if send failed\n\tbmi GameCubeMultiBoot_CheckBootKeyResponse @ branch if receive is complete\n\tadr r2, GcMbIntrHandler_CheckBootKeyResponse\n\tb GameCubeMultiBoot_SetInterruptHandler\n\n\t.align 2, 0\n\nGcMbIntrHandler_CheckBootKeyResponse:\n\tlsrs r1, 1 @ is receive complete?\n\tbcc GcMbIntrHandler_StopIfSendFailed @ branch if not\n\nGameCubeMultiBoot_CheckBootKeyResponse:\n\tldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]\n\t@ make sure received boot key contains expected magic number, stop if not\n\tlsrs r2, r1, 24\n\tcmp r2, GCMB_MAGIC_BOOTKEY\n\tbne GcMbIntrHandler_StopIfNotEqual\n\t@ save received bootkey to be checked in GameCubeMultiBoot_Main()\n\tstrh r1, [r0, GCMB_STRUCT_BOOT_KEY]\n\t@ stop if anything more gets sent\n\tadr r2, GcMbIntrHandler_StopUnconditionally\n\tb GameCubeMultiBoot_SetInterruptHandler\n\n\t.align 2, 0\n\nGcMbIntrHandler_StopUnconditionally:\n\tb GcMbIntrHandler_Stop\n\n\tthumb_func_end GameCubeMultiBoot_HandleSerialInterrupt\n\n\tnon_word_aligned_thumb_func_start GameCubeMultiBoot_Quit\n@ void GameCubeMultiBoot_Quit()@\nGameCubeMultiBoot_Quit:\n\tldr r3, pool_InterruptRegs\n\n@ Save IME register.\n\tldrh r2, [r3, OFFSET_REG_IME - 0x200]\n\n@ Disable interrupts.\n\tmovs r1, 0\n\tstrh r1, [r3, OFFSET_REG_IME - 0x200]\n\n\tldr r3, pool_SerialRegs\n\n@ Acknowledge all JOYCNT flags.\n\tmovs r0, 0x7\n\tstrh r0, [r3, OFFSET_REG_JOYCNT - 0x120]\n\n@ Turn off JOY Bus mode.\n\tlsls r0, r3, 10\n\tstrh r0, [r3, OFFSET_REG_RCNT - 0x120] @ store 0x8000\n\n\tldr r3, pool_InterruptRegs\n\n@ Acknowledge serial interrupt.\n\tmovs r0, INTR_FLAG_SERIAL\n\tstrh r0, [r3, OFFSET_REG_IF - 0x200]\n\n@ Disable serial interrupt.\n\tldrh r1, [r3, OFFSET_REG_IE - 0x200]\n\tbics r1, r0\n\tstrh r1, [r3, OFFSET_REG_IE - 0x200]\n\n@ Restore IME register.\n\tstrh r2, [r3, OFFSET_REG_IME - 0x200]\n\n\tbx lr\n\tthumb_func_end GameCubeMultiBoot_Quit\n\n\t.align 2, 0\n\nGameCubeMultiBoot_MaximumImageSizeUInt32s: .4byte 0x00004000\n\npool_InterruptRegs: .4byte REG_BASE + 0x200\n\npool_SerialRegs: .4byte REG_BASE + 0x120\n\npool_RegDispstat: .4byte REG_DISPSTAT\n\npool_RubyUSAGameCode: .ascii \"AXVE\"\n\npool_MultiBootLoadAddr: .4byte EWRAM_START\n\n\t.align 2, 0 @ Don't pad with nop.\n"
  },
  {
    "path": "src/librfu_intr.c",
    "content": "#include \"librfu.h\"\n\nstatic void sio32intr_clock_master(void);\nstatic void sio32intr_clock_slave(void);\nstatic u16 handshake_wait(u16 slot);\nstatic void STWI_set_timer_in_RAM(u8 count);\nstatic void STWI_stop_timer_in_RAM(void);\nstatic void STWI_init_slave(void);\nstatic void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)());\nstatic void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16));\nstatic void Callback_Dummy_ID(void (*callbackId)(void));\n\nvoid IntrSIO32(void)\n{\n    if (gSTWIStatus->state == 10)\n    {\n        if (gSTWIStatus->callbackID != NULL)\n            Callback_Dummy_ID(gSTWIStatus->callbackID);\n    }\n    else\n    {\n        if (gSTWIStatus->msMode == AGB_CLK_MASTER)\n            sio32intr_clock_master();\n        else\n            sio32intr_clock_slave();\n    }\n}\n\nstatic void sio32intr_clock_master(void)\n{\n    u32 regSIODATA32;\n    u32 ackLen;\n\n    STWI_set_timer_in_RAM(80);\n    regSIODATA32 = REG_SIODATA32;\n\n    if (gSTWIStatus->state == 0) // master send req\n    {\n        if (regSIODATA32 == 0x80000000)\n        {\n            if (gSTWIStatus->reqNext <= gSTWIStatus->reqLength)\n            {\n                REG_SIODATA32 = ((u32 *)gSTWIStatus->txPacket->rfuPacket8.data)[gSTWIStatus->reqNext];\n                gSTWIStatus->reqNext++;\n            }\n            else\n            {\n                gSTWIStatus->state = 1; // master wait ack\n                REG_SIODATA32 = 0x80000000;\n            }\n        }\n        else\n        {\n            STWI_stop_timer_in_RAM();\n            STWI_set_timer_in_RAM(130);\n            return;\n        }\n    }\n    else if (gSTWIStatus->state == 1) // master wait ack\n    {\n        if ((regSIODATA32 & 0xFFFF0000) == 0x99660000)\n        {\n            gSTWIStatus->ackNext = 0;\n            ((u32 *)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32;\n            gSTWIStatus->ackNext++;\n            gSTWIStatus->ackActiveCommand = regSIODATA32;\n            gSTWIStatus->ackLength = ackLen = regSIODATA32 >> 8;\n            if ((ackLen = gSTWIStatus->ackLength) >= gSTWIStatus->ackNext)\n            {\n                gSTWIStatus->state = 2; // master receive ack\n                REG_SIODATA32 = 0x80000000;\n            }\n            else\n            {\n                gSTWIStatus->state = 3; // master done ack\n            }\n        }\n        else\n        {\n            STWI_stop_timer_in_RAM();\n            STWI_set_timer_in_RAM(130);\n            return;\n        }\n    }\n    else if (gSTWIStatus->state == 2) // master receive ack\n    {\n        ((u32 *)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32;\n        gSTWIStatus->ackNext++;\n        if (gSTWIStatus->ackLength < gSTWIStatus->ackNext)\n            gSTWIStatus->state = 3; // master done ack\n        else\n            REG_SIODATA32 = 0x80000000;\n    }\n\n    if (handshake_wait(1) == 1)\n        return;\n\n    REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_MULTI_SD;\n\n    if (handshake_wait(0) == 1)\n        return;\n\n    STWI_stop_timer_in_RAM();\n\n    if (gSTWIStatus->state == 3) // master done ack\n    {\n        if (\n            gSTWIStatus->ackActiveCommand == (0x80 | ID_MS_CHANGE_REQ)\n         || gSTWIStatus->ackActiveCommand == (0x80 | ID_DATA_TX_AND_CHANGE_REQ)\n         || gSTWIStatus->ackActiveCommand == (0x80 | ID_UNK35_REQ)\n         || gSTWIStatus->ackActiveCommand == (0x80 | ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)\n        )\n        {\n\n            gSTWIStatus->msMode = AGB_CLK_SLAVE;\n            REG_SIODATA32 = 0x80000000;\n            REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS;\n            REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE;\n            gSTWIStatus->state = 5; // slave receive req init\n        }\n        else\n        {\n            if (gSTWIStatus->ackActiveCommand == 0xEE)\n            {\n                REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;\n                gSTWIStatus->state = 4; // error\n                gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION;\n            }\n            else\n            {\n                REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;\n                gSTWIStatus->state = 4; // error\n            }\n        }\n        gSTWIStatus->sending = 0;\n        if (gSTWIStatus->callbackM != NULL)\n            Callback_Dummy_M(gSTWIStatus->reqActiveCommand, gSTWIStatus->error, gSTWIStatus->callbackM);\n    }\n    else\n    {\n        REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;\n        REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_ENABLE;\n    }\n}\n\nstatic void sio32intr_clock_slave(void)\n{\n    u32 regSIODATA32;\n    u32 r0;\n    u32 reqLen;\n\n    gSTWIStatus->timerActive = 0;\n    STWI_set_timer_in_RAM(100);\n    if (handshake_wait(0) == 1)\n        return;\n    REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_MULTI_SD;\n    regSIODATA32 = REG_SIODATA32;\n    if (gSTWIStatus->state == 5) // slave receive req init\n    {\n        ((u32 *)gSTWIStatus->rxPacket)[0] = regSIODATA32;\n        gSTWIStatus->reqNext = 1;\n        r0 = 0x99660000;\n        // variable reuse required\n        reqLen = (regSIODATA32 >> 16);\n        if (reqLen == (r0 >> 16))\n        {\n            // only reqLen = regSIODATA32 >> 8 is required to match, but it looks a bit\n            // more consistent when both lines update the variables. Might have been a macro?\n            gSTWIStatus->reqLength = reqLen = regSIODATA32 >> 8;\n            gSTWIStatus->reqActiveCommand = reqLen = (regSIODATA32 >> 0);\n            if (gSTWIStatus->reqLength == 0)\n            {\n                if (\n                    gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ\n                 || gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ\n                 || gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ\n                 || gSTWIStatus->reqActiveCommand == ID_UNK36_REQ\n                )\n                {\n                    gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80;\n                    ((u32 *)gSTWIStatus->txPacket)[0] = 0x99660000 + gSTWIStatus->ackActiveCommand;\n                    gSTWIStatus->ackLength = 0;\n                }\n                else\n                {\n                    ((u32 *)gSTWIStatus->txPacket)[0] = 0x996601EE;\n                    if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D)\n                    {\n                        ((u32 *)gSTWIStatus->txPacket)[1] = 1;\n                    }\n                    else\n                    {\n                        ((u32 *)gSTWIStatus->txPacket)[1] = 2;\n                    }\n                    gSTWIStatus->ackLength = 1;\n                    gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION;\n                }\n                REG_SIODATA32 = ((u32 *)gSTWIStatus->txPacket)[0];\n                gSTWIStatus->ackNext = 1;\n                gSTWIStatus->state = 7; // slave send ack\n            }\n            else\n            {\n                REG_SIODATA32 = 0x80000000;\n                gSTWIStatus->reqNext = 1;\n                gSTWIStatus->state = 6; // slave receive req\n            }\n        }\n        else\n        {\n            STWI_stop_timer_in_RAM();\n            STWI_set_timer_in_RAM(100);\n            return;\n        }\n    }\n    else if (gSTWIStatus->state == 6) // slave receive req\n    {\n        ((u32 *)gSTWIStatus->rxPacket)[gSTWIStatus->reqNext] = regSIODATA32;\n        gSTWIStatus->reqNext++;\n        if (gSTWIStatus->reqLength < gSTWIStatus->reqNext)\n        {\n            if (\n                gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ\n             || gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ\n             || gSTWIStatus->reqActiveCommand == ID_UNK36_REQ\n            )\n            {\n                gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80;\n                ((u32 *)gSTWIStatus->txPacket)[0] = 0x99660000 | gSTWIStatus->ackActiveCommand;\n                gSTWIStatus->ackLength = 0;\n            }\n            else\n            {\n                ((u32 *)gSTWIStatus->txPacket)[0] = 0x996601EE;\n                if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D)\n                {\n                    ((u32 *)gSTWIStatus->txPacket)[1] = 1;\n                }\n                else\n                {\n                    ((u32 *)gSTWIStatus->txPacket)[1] = 2;\n                }\n                gSTWIStatus->ackLength = 1;\n                gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION;\n            }\n            REG_SIODATA32 = ((u32 *)gSTWIStatus->txPacket)[0];\n            gSTWIStatus->ackNext = 1;\n            gSTWIStatus->state = 7; // slave send ack\n        }\n        else\n        {\n            REG_SIODATA32 = 0x80000000;\n        }\n    }\n    else if (gSTWIStatus->state == 7) // slave send ack\n    {\n        if (regSIODATA32 == 0x80000000)\n        {\n            if (gSTWIStatus->ackLength < gSTWIStatus->ackNext)\n            {\n                gSTWIStatus->state = 8; // slave done ack\n            }\n            else\n            {\n                REG_SIODATA32 = ((u32 *)gSTWIStatus->txPacket)[gSTWIStatus->ackNext];\n                gSTWIStatus->ackNext++;\n            }\n        }\n        else\n        {\n            STWI_stop_timer_in_RAM();\n            STWI_set_timer_in_RAM(100);\n            return;\n        }\n    }\n    if (handshake_wait(1) == 1)\n        return;\n    if (gSTWIStatus->state == 8) // slave done ack\n    {\n        REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS;\n        STWI_stop_timer_in_RAM();\n        if (gSTWIStatus->error == ERR_REQ_CMD_ACK_REJECTION)\n        {\n            STWI_init_slave();\n            if (gSTWIStatus->callbackS != NULL)\n            {\n                Callback_Dummy_S(0x1EE, gSTWIStatus->callbackS);\n            }\n        }\n        else\n        {\n            REG_SIODATA32 = 0;\n            REG_SIOCNT = 0;\n            REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;\n            gSTWIStatus->msMode = AGB_CLK_MASTER;\n            gSTWIStatus->state = 0; // master send req\n            if (gSTWIStatus->callbackS != NULL)\n            {\n                Callback_Dummy_S((gSTWIStatus->reqLength << 8) | (gSTWIStatus->reqActiveCommand), gSTWIStatus->callbackS);\n            }\n        }\n    }\n    else\n    {\n        REG_IME = 0;\n        if (REG_TM0CNT_H & TIMER_ENABLE)\n        {\n            if ((REG_TM0CNT_H & 0x03) == TIMER_1CLK)\n            {\n                while (REG_TM0CNT_L > 0xFF9B);\n            }\n            else\n            {\n                while (REG_TM0CNT_L > 0xFFFE);\n            }\n        }\n        REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS;\n        REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE;\n        REG_IME = 1;\n    }\n}\n\nstatic u16 handshake_wait(u16 slot)\n{\n    do\n    {\n        if ((gSTWIStatus->timerActive & 0xFF) == 1)\n        {\n            gSTWIStatus->timerActive = 0;\n            return 1;\n        }\n    } while ((REG_SIOCNT & SIO_MULTI_SI) != (slot << SIO_MULTI_SI_SHIFT));\n    return 0;\n}\n\nstatic void STWI_set_timer_in_RAM(u8 count)\n{\n    vu16* regTMCNTL = (vu16*)(REG_ADDR_TMCNT_L + gSTWIStatus->timerSelect * 4);\n    vu16* regTMCNTH = (vu16*)(REG_ADDR_TMCNT_H + gSTWIStatus->timerSelect * 4);\n    REG_IME = 0;\n    switch (count)\n    {\n    case 50:\n        *regTMCNTL = 0xFCCB;\n        gSTWIStatus->timerState = 1;\n        break;\n    case 80:\n        *regTMCNTL = 0xFAE0;\n        gSTWIStatus->timerState = 2;\n        break;\n    case 100:\n        *regTMCNTL = 0xF996;\n        gSTWIStatus->timerState = 3;\n        break;\n    case 130:\n        *regTMCNTL = 0xF7AD;\n        gSTWIStatus->timerState = 4;\n        break;\n    }\n    *regTMCNTH = TIMER_ENABLE | TIMER_64CLK | TIMER_256CLK | TIMER_INTR_ENABLE;\n    REG_IF = INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect;\n    REG_IME = 1;\n}\n\nstatic void STWI_stop_timer_in_RAM(void)\n{\n    gSTWIStatus->timerState = 0;\n    REG_TMCNT_L(gSTWIStatus->timerSelect) = 0;\n    REG_TMCNT_H(gSTWIStatus->timerSelect) = 0;\n}\n\nstatic void STWI_init_slave(void)\n{\n    gSTWIStatus->state = 5; // slave receive req init\n    gSTWIStatus->msMode = AGB_CLK_SLAVE;\n    gSTWIStatus->reqLength = 0;\n    gSTWIStatus->reqNext = 0;\n    gSTWIStatus->reqActiveCommand = 0;\n    gSTWIStatus->ackLength = 0;\n    gSTWIStatus->ackNext = 0;\n    gSTWIStatus->ackActiveCommand = 0;\n    gSTWIStatus->timerState = 0;\n    gSTWIStatus->timerActive = 0;\n    gSTWIStatus->error = 0;\n    gSTWIStatus->recoveryCount = 0;\n    REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE;\n}\n\nNAKED\nstatic void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)())\n{\n    asm(\"bx r2\");\n}\n\nNAKED\nstatic void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16))\n{\n    asm(\"bx r1\");\n}\n\nNAKED\nstatic void Callback_Dummy_ID(void (*callbackId)(void))\n{\n    asm(\"bx r0\");\n}\n"
  },
  {
    "path": "src/librfu_rfu.c",
    "content": "#include <limits.h>\n#include \"librfu.h\"\n\nstruct LLSFStruct\n{\n    u8 frameSize;\n    u8 recvFirstShift;\n    u8 connSlotFlagShift;\n    u8 slotStateShift;\n    u8 ackShift;\n    u8 phaseShit;\n    u8 nShift;\n    u8 recvFirstMask;\n    u8 connSlotFlagMask;\n    u8 slotStateMask;\n    u8 ackMask;\n    u8 phaseMask;\n    u8 nMask;\n    u16 framesMask;\n};\n\nstruct RfuLocalStruct\n{\n    u8 recvFirst;\n    u8 connSlotFlag;\n    u8 slotState;\n    u8 ack;\n    u8 phase;\n    u8 n;\n    u16 frame;\n};\n\nstatic void rfu_CB_defaultCallback(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_reset(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_configGameData(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_stopMode(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_startSearchChild(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_pollAndEndSearchChild(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_startSearchParent(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_pollSearchParent(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_disconnect(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_CHILD_pollConnectRecovery(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_sendData(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_sendData2(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_sendData3(u8 reqCommand, u16 reqResult);\nstatic void rfu_CB_recvData(u8 reqCommand, u16 reqResult);\nstatic void rfu_enableREQCallback(bool8 enable);\nstatic void rfu_STC_clearAPIVariables(void);\nstatic void rfu_STC_readChildList(void);\nstatic void rfu_STC_readParentCandidateList(void);\nstatic void rfu_STC_REQ_callback(u8 reqCommand, u16 reqResult);\nstatic void rfu_STC_removeLinkData(u8, u8);\nstatic void rfu_STC_fastCopy(const u8 **, u8 **, s32);\nstatic void rfu_STC_clearLinkStatus(u8);\nstatic void rfu_NI_checkCommFailCounter(void);\nstatic u16 rfu_STC_setSendData_org(u8, u8, u8, const void *, u32);\nstatic void rfu_constructSendLLFrame(void);\nstatic u16 rfu_STC_NI_constructLLSF(u8, u8 **, struct NIComm *);\nstatic u16 rfu_STC_UNI_constructLLSF(u8, u8 **);\nstatic void rfu_STC_PARENT_analyzeRecvPacket(void);\nstatic void rfu_STC_CHILD_analyzeRecvPacket(void);\nstatic u16 rfu_STC_analyzeLLSF(u8, const u8 *, u16);\nstatic void rfu_STC_UNI_receive(u8, const struct RfuLocalStruct *, const u8 *);\nstatic void rfu_STC_NI_receive_Receiver(u8, const struct RfuLocalStruct *, const u8 *);\nstatic void rfu_STC_NI_receive_Sender(u8, u8, const struct RfuLocalStruct *, const u8 *);\nstatic void rfu_STC_NI_initSlot_asRecvDataEntity(u8, struct NIComm *);\nstatic void rfu_STC_NI_initSlot_asRecvControllData(u8, struct NIComm *);\n\nstruct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX];\nstruct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX];\nstruct RfuLinkStatus *gRfuLinkStatus;\nstruct RfuStatic *gRfuStatic;\nstruct RfuFixed *gRfuFixed;\n\nstatic const struct LLSFStruct llsf_struct[2] = {\n    [MODE_CHILD] = {\n        .frameSize = 2,\n        .recvFirstShift = 14,\n        .connSlotFlagShift = 0,\n        .slotStateShift = 10,\n        .ackShift = 9,\n        .phaseShit = 5,\n        .nShift = 7,\n        .recvFirstMask = 2,\n        .connSlotFlagMask = 0,\n        .slotStateMask = 15,\n        .ackMask = 1,\n        .phaseMask = 3,\n        .nMask = 3,\n        .framesMask = 0x1f\n    },\n    [MODE_PARENT] = {\n        .frameSize = 3,\n        .recvFirstShift = 22,\n        .connSlotFlagShift = 18,\n        .slotStateShift = 14,\n        .ackShift = 13,\n        .phaseShit = 9,\n        .nShift = 11,\n        .recvFirstMask = 3,\n        .connSlotFlagMask = 15,\n        .slotStateMask = 15,\n        .ackMask = 1,\n        .phaseMask = 3,\n        .nMask = 3,\n        .framesMask = 0x7f\n    }\n};\n\n#define xstr(s) str(s)\n#define str(s) #s\nstatic const char version_string[] = \"RFU_V\" xstr(LIBRFU_VERSION);\n\nstatic const char str_checkMbootLL[] = \"RFU-MBOOT\";\n\n#define COPY(src, dst, iterator, size) do {         \\\n    const u16 *_src = (const u16 *)(src);           \\\n    u16 *_dst = (u16 *)(dst);                       \\\n    (iterator) = (size);                            \\\n    while ((iterator)-- != 0)                       \\\n        *_dst++ = *_src++;                          \\\n} while (0)\n\nu16 rfu_initializeAPI(u32 *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam)\n{\n    u16 i;\n    u16 *dst;\n    const u16 *src;\n    u16 buffByteSizeMax;\n\n    // is in EWRAM?\n    if (((uintptr_t)APIBuffer & 0xF000000) == 0x2000000 && copyInterruptToRam)\n        return ERR_RFU_API_BUFF_ADR;\n    // is not 4-byte aligned?\n    if ((u32)APIBuffer & 3)\n        return ERR_RFU_API_BUFF_ADR;\n    if (copyInterruptToRam)\n    {\n        // An assert/debug print may have existed before, ie\n        // printf(\"%s %u < %u\", \"somefile.c:12345\", buffByteSize, num)\n        // to push this into buffByteSizeMax?\n        buffByteSizeMax = RFU_API_BUFF_SIZE_RAM;\n        if (buffByteSize < buffByteSizeMax)\n            return ERR_RFU_API_BUFF_SIZE;\n    }\n    if (!copyInterruptToRam)\n    {\n        buffByteSizeMax = RFU_API_BUFF_SIZE_ROM; // same issue as above\n        if (buffByteSize < buffByteSizeMax)\n            return ERR_RFU_API_BUFF_SIZE;\n    }\n    gRfuLinkStatus = (void *)APIBuffer + 0;\n    gRfuStatic = (void *)APIBuffer + 0xb4; // + sizeof(*gRfuLinkStatus)\n    gRfuFixed = (void *)APIBuffer + 0xdc; // + sizeof(*gRfuStatic)\n    gRfuSlotStatusNI[0] = (void *)APIBuffer + 0x1bc; // + sizeof(*gRfuFixed)\n    gRfuSlotStatusUNI[0] = (void *)APIBuffer + 0x37c; // + sizeof(*gRfuSlotStatusNI[0]) * RFU_CHILD_MAX\n    for (i = 1; i < RFU_CHILD_MAX; ++i)\n    {\n        gRfuSlotStatusNI[i] = &gRfuSlotStatusNI[i - 1][1];\n        gRfuSlotStatusUNI[i] = &gRfuSlotStatusUNI[i - 1][1];\n    }\n    // remaining space in API buffer is used for `struct RfuIntrStruct`. \n    gRfuFixed->STWIBuffer = (struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1];\n    STWI_init_all((struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1], sioIntrTable_p, copyInterruptToRam);\n    rfu_STC_clearAPIVariables();\n    for (i = 0; i < RFU_CHILD_MAX; ++i)\n    {\n        gRfuSlotStatusNI[i]->recvBuffer = NULL;\n        gRfuSlotStatusNI[i]->recvBufferSize = 0;\n        gRfuSlotStatusUNI[i]->recvBuffer = NULL;\n        gRfuSlotStatusUNI[i]->recvBufferSize = 0;\n    }\n    // rfu_REQ_changeMasterSlave is the function next to rfu_STC_fastCopy\n#if LIBRFU_VERSION < 1026\n    src = (const u16 *)((uintptr_t)&rfu_STC_fastCopy & ~1);\n    dst = gRfuFixed->fastCopyBuffer;\n    buffByteSizeMax = ((void *)rfu_REQ_changeMasterSlave - (void *)rfu_STC_fastCopy) / sizeof(u16);\n    while (buffByteSizeMax-- != 0)\n        *dst++ = *src++;\n#else\n    COPY(\n        (uintptr_t)&rfu_STC_fastCopy & ~1,\n        gRfuFixed->fastCopyBuffer,\n        buffByteSizeMax,\n        0x60 / sizeof(u16)\n        );\n#endif\n    gRfuFixed->fastCopyPtr = (void *)gRfuFixed->fastCopyBuffer + 1;\n    return 0;\n}\n\nstatic void rfu_STC_clearAPIVariables(void)\n{\n    u16 IMEBackup = REG_IME;\n    u8 i, flags;\n\n    REG_IME = 0;\n    flags = gRfuStatic->flags;\n    CpuFill16(0, gRfuStatic, sizeof(struct RfuStatic));\n    gRfuStatic->flags = flags & 8;\n    CpuFill16(0, gRfuLinkStatus, sizeof(struct RfuLinkStatus));\n    gRfuLinkStatus->watchInterval = 4;\n    gRfuStatic->nowWatchInterval = 0;\n    gRfuLinkStatus->parentChild = MODE_NEUTRAL;\n    rfu_clearAllSlot();\n    gRfuStatic->SCStartFlag = 0;\n    for (i = 0; i < RFU_CHILD_MAX; ++i)\n        gRfuStatic->cidBak[i] = 0;\n    REG_IME = IMEBackup;\n}\n\nvoid rfu_REQ_PARENT_resumeRetransmitAndChange(void)\n{\n    STWI_set_Callback_M(rfu_STC_REQ_callback);\n    STWI_send_ResumeRetransmitAndChangeREQ();\n}\n\nu16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag)\n{\n    u8 *buf;\n\n    *ackFlag = 0;\n    if (gRfuLinkStatus->parentChild != MODE_PARENT)\n        return ERR_MODE_NOT_PARENT;\n    buf = rfu_getSTWIRecvBuffer();\n    switch (*buf)\n    {\n    case 40:\n    case 54:\n        if (buf[1] == 0)\n            *ackFlag = gRfuLinkStatus->connSlotFlag;\n        else\n            *ackFlag = buf[4];\n        return 0;\n    default:\n        return ERR_REQ_CMD_ID;\n    }\n}\n\nvoid rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p)\n{\n    STWI_init_timer(timerIntrTable_p, timerNo);\n}\n\nu8 *rfu_getSTWIRecvBuffer(void)\n{\n    return (u8 *)gRfuFixed->STWIBuffer;\n}\n\nvoid rfu_setMSCCallback(void (*callback)(u16 reqCommandId))\n{\n    STWI_set_Callback_S(callback);\n}\n\nvoid rfu_setREQCallback(void (*callback)(u16 reqCommandId, u16 reqResult))\n{\n    gRfuFixed->reqCallback = callback;\n    rfu_enableREQCallback(callback != NULL);\n}\n\nstatic void rfu_enableREQCallback(bool8 enable)\n{\n    if (enable)\n        gRfuStatic->flags |= 8;\n    else\n        gRfuStatic->flags &= 0xF7;\n}\n\nstatic void rfu_STC_REQ_callback(u8 reqCommand, u16 reqResult)\n{\n    STWI_set_Callback_M(rfu_CB_defaultCallback);\n    gRfuStatic->reqResult = reqResult;\n    if (gRfuStatic->flags & 8)\n        gRfuFixed->reqCallback(reqCommand, reqResult);\n}\n\nstatic void rfu_CB_defaultCallback(u8 reqCommand, u16 reqResult)\n{\n    s32 bmSlotFlags;\n    u8 i;\n\n    if (reqCommand == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ)\n    {\n        if (gRfuStatic->flags & 8)\n            gRfuFixed->reqCallback(reqCommand, reqResult);\n        bmSlotFlags = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;\n        for (i = 0; i < RFU_CHILD_MAX; ++i)\n            if ((bmSlotFlags >> i) & 1)\n                rfu_STC_removeLinkData(i, 1);\n        gRfuLinkStatus->parentChild = MODE_NEUTRAL;\n    }\n}\n\nu16 rfu_waitREQComplete(void)\n{\n    STWI_poll_CommandEnd();\n    return gRfuStatic->reqResult;\n}\n\nvoid rfu_REQ_RFUStatus(void)\n{\n    STWI_set_Callback_M(rfu_STC_REQ_callback);\n    STWI_send_SystemStatusREQ();\n}\n\nu16 rfu_getRFUStatus(u8 *rfuState)\n{\n    if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] != 0x93)\n        return ERR_REQ_CMD_ID;\n    if (STWI_poll_CommandEnd() == 0)\n        *rfuState = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7];\n    else\n        *rfuState = 0xFF;\n    return 0;\n}\n\n/*\n * RFU Multiboot images are loaded into IWRAM\n * struct RfuMbootLL\n * {\n *   struct RfuLinkStatus status;\n *   u8 filler_B4[0x3C];\n *   char name[10];\n *   u16 checksum;\n * }\n * Returns 1 if the packet to inherit is malformed.\n */\nu16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void)\n{\n    const char *s1 = str_checkMbootLL;\n    char *s2 = (char *)0x30000F0;\n    u16 checksum;\n    u16 *mb_buff_iwram_p;\n    u8 i;\n\n    // if (strcmp(s1, s2) != 0) return 1;\n    while (*s1 != '\\0')\n        if (*s1++ != *s2++)\n            return 1;\n    mb_buff_iwram_p = (u16 *)0x3000000;\n\n    // The size of struct RfuLinkStatus is 180\n    checksum = 0;\n    for (i = 0; i < 180/2; ++i)\n        checksum += *mb_buff_iwram_p++;\n    if (checksum != *(u16 *)0x30000FA)\n        return 1;\n    CpuCopy16((u16 *)0x3000000, gRfuLinkStatus, sizeof(struct RfuLinkStatus));\n    gRfuStatic->flags |= 0x80; // mboot\n    return 0;\n}\n\nvoid rfu_REQ_stopMode(void)\n{\n    vu32 *timerReg;\n\n    if (REG_IME == 0)\n    {\n        rfu_STC_REQ_callback(ID_STOP_MODE_REQ, 6);\n        gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE;\n    }\n    else\n    {\n        AgbRFU_SoftReset();\n        rfu_STC_clearAPIVariables();\n        if (AgbRFU_checkID(8) == RFU_ID)\n        {\n            timerReg = &REG_TMCNT(gSTWIStatus->timerSelect);\n            *timerReg = 0;\n            *timerReg = (TIMER_ENABLE | TIMER_1024CLK) << 16;\n            while (*timerReg << 16 < 262 << 16)\n                ;\n            *timerReg = 0;\n            STWI_set_Callback_M(rfu_CB_stopMode);\n            STWI_send_StopModeREQ();\n        }\n        else\n        {\n            REG_SIOCNT = SIO_MULTI_MODE;\n            rfu_STC_REQ_callback(ID_STOP_MODE_REQ, 0);\n        }\n    }\n}\n\nstatic void rfu_CB_stopMode(u8 reqCommand, u16 reqResult)\n{\n    if (reqResult == 0)\n        REG_SIOCNT = SIO_MULTI_MODE;\n    rfu_STC_REQ_callback(reqCommand, reqResult);\n}\n\nu32 rfu_REQBN_softReset_and_checkID(void)\n{\n    u32 id;\n\n    if (REG_IME == 0)\n        return ERR_ID_CHECK_IME_DISABLE;\n    AgbRFU_SoftReset();\n    rfu_STC_clearAPIVariables();\n    if ((id = AgbRFU_checkID(30)) == 0)\n        REG_SIOCNT = SIO_MULTI_MODE;\n    return id;\n}\n\nvoid rfu_REQ_reset(void)\n{\n    STWI_set_Callback_M(rfu_CB_reset);\n    STWI_send_ResetREQ();\n}\n\nstatic void rfu_CB_reset(u8 reqCommand, u16 reqResult)\n{\n    if (reqResult == 0)\n        rfu_STC_clearAPIVariables();\n    rfu_STC_REQ_callback(reqCommand, reqResult);\n}\n\nvoid rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer)\n{\n    STWI_set_Callback_M(rfu_STC_REQ_callback);\n    STWI_send_SystemConfigREQ((availSlotFlag & AVAIL_SLOT1) | 0x3C, maxMFrame, mcTimer);\n    if (mcTimer == 0)\n    {\n        gRfuStatic->linkEmergencyLimit = 1;\n    }\n    else\n    {\n        u16 IMEBackup = REG_IME;\n\n        REG_IME = 0;\n        gRfuStatic->linkEmergencyLimit = Div(600, mcTimer);\n        REG_IME = IMEBackup;\n    }\n}\n\nvoid rfu_REQ_configGameData(u8 mbootFlag, u16 serialNo, const u8 *gname, const u8 *uname)\n{\n    u8 packet[16];\n    u8 i;\n    u8 check_sum;\n    const u8 *gnameBackup = gname;\n    const u8 *unameBackup;\n\n    packet[0] = serialNo;\n    packet[1] = serialNo >> 8;\n    if (mbootFlag != 0)\n        packet[1] = (serialNo >> 8) | 0x80;\n    for (i = 2; i < 15; ++i)\n        packet[i] = *gname++;\n    check_sum = 0;\n    unameBackup = uname;\n    for (i = 0; i < 8; ++i)\n    {\n        check_sum += *unameBackup++;\n        check_sum += *gnameBackup++;\n    }\n    packet[15] = ~check_sum;\n    if (mbootFlag != 0)\n        packet[14] = 0;\n    STWI_set_Callback_M(rfu_CB_configGameData);\n    STWI_send_GameConfigREQ(packet, uname);\n}\n\nstatic void rfu_CB_configGameData(u8 reqCommand, u16 reqResult)\n{\n    s32 serialNo;\n    u8 *gname_uname_p;\n    u8 i;\n    u8 *packet_p;\n\n    if (reqResult == 0)\n    {\n        packet_p = gSTWIStatus->txPacket->rfuPacket8.data;\n        serialNo = gRfuLinkStatus->my.serialNo = packet_p[4];\n        gRfuLinkStatus->my.serialNo = (packet_p[5] << 8) | serialNo;\n        gname_uname_p = &packet_p[6];\n        if (gRfuLinkStatus->my.serialNo & 0x8000)\n        {\n            gRfuLinkStatus->my.serialNo = gRfuLinkStatus->my.serialNo ^ 0x8000;\n            gRfuLinkStatus->my.mbootFlag = 1;\n        }\n        else\n        {\n            gRfuLinkStatus->my.mbootFlag = 0;\n        }\n        for (i = 0; i < RFU_GAME_NAME_LENGTH; ++i)\n            gRfuLinkStatus->my.gname[i] = *gname_uname_p++;\n        ++gname_uname_p;\n        for (i = 0; i < RFU_USER_NAME_LENGTH; ++i)\n            gRfuLinkStatus->my.uname[i] = *gname_uname_p++;\n    }\n    rfu_STC_REQ_callback(reqCommand, reqResult);\n}\n\nvoid rfu_REQ_startSearchChild(void)\n{\n    u16 result;\n#if LIBRFU_VERSION >= 1026\n    u16 i;\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        gRfuStatic->lsFixedCount[i] = 0;\n    }\n#endif\n\n    STWI_set_Callback_M(rfu_CB_defaultCallback);\n    STWI_send_SystemStatusREQ();\n    result = STWI_poll_CommandEnd();\n    if (result == 0)\n    {\n        if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0)\n            rfu_STC_clearLinkStatus(MODE_PARENT);\n    }\n    else\n    {\n        rfu_STC_REQ_callback(ID_SC_START_REQ, result);\n    }\n    STWI_set_Callback_M(rfu_CB_startSearchChild);\n    STWI_send_SC_StartREQ();\n}\n\nstatic void rfu_CB_startSearchChild(u8 reqCommand, u16 reqResult)\n{\n    if (reqResult == 0)\n        gRfuStatic->SCStartFlag = 1;\n    rfu_STC_REQ_callback(reqCommand, reqResult);\n}\n\nstatic void rfu_STC_clearLinkStatus(u8 parentChild)\n{\n    u8 i;\n\n    rfu_clearAllSlot();\n    if (parentChild != MODE_CHILD)\n    {\n        CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner));\n        gRfuLinkStatus->findParentCount = 0;\n    }\n    for (i = 0; i < RFU_CHILD_MAX; ++i)\n        gRfuLinkStatus->strength[i] = 0;\n    gRfuLinkStatus->connCount = 0;\n    gRfuLinkStatus->connSlotFlag = 0;\n    gRfuLinkStatus->linkLossSlotFlag = 0;\n    gRfuLinkStatus->getNameFlag = 0;\n}\n\nvoid rfu_REQ_pollSearchChild(void)\n{\n    STWI_set_Callback_M(rfu_CB_pollAndEndSearchChild);\n    STWI_send_SC_PollingREQ();\n}\n\nvoid rfu_REQ_endSearchChild(void)\n{\n    STWI_set_Callback_M(rfu_CB_pollAndEndSearchChild);\n    STWI_send_SC_EndREQ();\n}\n\nstatic void rfu_CB_pollAndEndSearchChild(u8 reqCommand, u16 reqResult)\n{\n    if (reqResult == 0)\n        rfu_STC_readChildList();\n    if (reqCommand == ID_SC_POLL_REQ)\n    {\n        if (gRfuLinkStatus->my.id == 0)\n        {\n            STWI_set_Callback_M(rfu_CB_defaultCallback);\n            STWI_send_SystemStatusREQ();\n            if (STWI_poll_CommandEnd() == 0)\n                gRfuLinkStatus->my.id = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];\n        }\n    }\n    else if (reqCommand == ID_SC_END_REQ)\n    {\n        if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)\n            gRfuLinkStatus->my.id = 0;\n        gRfuStatic->SCStartFlag = 0;\n    }\n    rfu_STC_REQ_callback(reqCommand, reqResult);\n}\n\nstatic void rfu_STC_readChildList(void)\n{\n    u32 stwiParam;\n    u8 numSlots = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1];\n    u8 *data_p;\n    u8 i;\n    u8 bm_slot_id;\n#if LIBRFU_VERSION < 1026\n    u8 true_slots[RFU_CHILD_MAX];\n#endif\n\n#if LIBRFU_VERSION < 1026\n    if (numSlots != 0)\n    {\n        stwiParam = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];\n        STWI_set_Callback_M(rfu_CB_defaultCallback);\n        STWI_send_LinkStatusREQ();\n        if (STWI_poll_CommandEnd() == 0)\n        {\n            data_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];\n            for (i = 0; i < RFU_CHILD_MAX; ++i)\n                true_slots[i] = *data_p++;\n        }\n        gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = stwiParam;\n    }\n#endif\n    for (data_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];\n         numSlots != 0;\n         data_p += 4)\n    {\n        bm_slot_id = data_p[2];\n        if (bm_slot_id < RFU_CHILD_MAX && !((gRfuLinkStatus->connSlotFlag >> bm_slot_id) & 1) && !((gRfuLinkStatus->linkLossSlotFlag >> bm_slot_id) & 1))\n        {\n        #if LIBRFU_VERSION < 1026\n            if (true_slots[bm_slot_id] != 0)\n                ++gRfuStatic->lsFixedCount[bm_slot_id];\n            if (gRfuStatic->lsFixedCount[bm_slot_id] >= 4)\n            {\n                gRfuStatic->lsFixedCount[bm_slot_id] = 0;\n                gRfuLinkStatus->strength[bm_slot_id] = 255;\n                gRfuLinkStatus->connSlotFlag |= 1 << bm_slot_id;\n                ++gRfuLinkStatus->connCount;\n                gRfuLinkStatus->partner[bm_slot_id].id = *(u16 *)data_p;\n                gRfuLinkStatus->partner[bm_slot_id].slot = bm_slot_id;\n                gRfuLinkStatus->parentChild = MODE_PARENT;\n                gRfuStatic->flags &= 0x7F;\n                gRfuStatic->cidBak[bm_slot_id] = gRfuLinkStatus->partner[bm_slot_id].id;\n            }\n        #else\n            gRfuStatic->lsFixedCount[bm_slot_id] = 0xF0;\n            gRfuLinkStatus->strength[bm_slot_id] = 16;\n            gRfuLinkStatus->connSlotFlag |= 1 << bm_slot_id;\n            ++gRfuLinkStatus->connCount;\n            gRfuLinkStatus->partner[bm_slot_id].id = *(u16 *)data_p;\n            gRfuLinkStatus->partner[bm_slot_id].slot = bm_slot_id;\n            gRfuLinkStatus->parentChild = MODE_PARENT;\n            gRfuStatic->flags &= 0x7F;\n            gRfuStatic->cidBak[bm_slot_id] = gRfuLinkStatus->partner[bm_slot_id].id;\n        #endif\n        }\n        --numSlots;\n    }\n}\n\nvoid rfu_REQ_startSearchParent(void)\n{\n    STWI_set_Callback_M(rfu_CB_startSearchParent);\n    STWI_send_SP_StartREQ();\n}\n\nstatic void rfu_CB_startSearchParent(u8 reqCommand, u16 reqResult)\n{\n    if (reqResult == 0)\n        rfu_STC_clearLinkStatus(MODE_CHILD);\n    rfu_STC_REQ_callback(reqCommand, reqResult);\n}\n\nvoid rfu_REQ_pollSearchParent(void)\n{\n    STWI_set_Callback_M(rfu_CB_pollSearchParent);\n    STWI_send_SP_PollingREQ();\n}\n\nstatic void rfu_CB_pollSearchParent(u8 reqCommand, u16 reqResult)\n{\n    if (reqResult == 0)\n        rfu_STC_readParentCandidateList();\n    rfu_STC_REQ_callback(reqCommand, reqResult);\n}\n\nvoid rfu_REQ_endSearchParent(void)\n{\n    STWI_set_Callback_M(rfu_STC_REQ_callback);\n    STWI_send_SP_EndREQ();\n}\n\nstatic void rfu_STC_readParentCandidateList(void)\n{\n    u8 numSlots, i, check_sum, my_check_sum, j;\n    u8 *uname_p, *packet_p;\n    struct RfuTgtData *target;\n\n    CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner));\n    packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0];\n    numSlots = packet_p[1];\n    packet_p += 4;\n    gRfuLinkStatus->findParentCount = 0;\n    for (i = 0; i < RFU_CHILD_MAX && numSlots != 0; ++i)\n    {\n        numSlots -= 7;\n        uname_p = packet_p + 6;\n        packet_p += 19;\n        check_sum = ~*packet_p;\n        ++packet_p;\n        my_check_sum = 0;\n        for (j = 0; j < 8; ++j)\n        {\n            my_check_sum += *packet_p++;\n            my_check_sum += *uname_p++;\n        }\n        if (my_check_sum == check_sum)\n        {\n            packet_p -= 28;\n            target = &gRfuLinkStatus->partner[gRfuLinkStatus->findParentCount];\n            target->id = *(u16 *)packet_p;\n            packet_p += 2;\n            target->slot = *packet_p;\n            packet_p += 2;\n            target->serialNo = *(u16 *)packet_p & 0x7FFF;\n            if (*(u16 *)packet_p & 0x8000)\n                target->mbootFlag = 1;\n            else\n                target->mbootFlag = 0;\n            packet_p += 2;\n            for (j = 0; j < RFU_GAME_NAME_LENGTH; ++j)\n                target->gname[j] = *packet_p++;\n            ++packet_p;\n            for (j = 0; j < RFU_USER_NAME_LENGTH; ++j)\n                target->uname[j] = *packet_p++;\n            ++gRfuLinkStatus->findParentCount;\n        }\n    }\n}\n\nvoid rfu_REQ_startConnectParent(u16 pid)\n{\n    u16 result = 0;\n    u8 i;\n    for (i = 0; i < RFU_CHILD_MAX && gRfuLinkStatus->partner[i].id != pid; ++i)\n        ;\n    if (i == RFU_CHILD_MAX)\n        result = ERR_PID_NOT_FOUND;\n    if (result == 0)\n    {\n        gRfuStatic->tryPid = pid;\n        STWI_set_Callback_M(rfu_STC_REQ_callback);\n        STWI_send_CP_StartREQ(pid);\n    }\n    else\n    {\n        rfu_STC_REQ_callback(ID_CP_START_REQ, result);\n    }\n}\n\nvoid rfu_REQ_pollConnectParent(void)\n{\n    STWI_set_Callback_M(rfu_CB_pollConnectParent);\n    STWI_send_CP_PollingREQ();\n}\n\nstatic void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult)\n{\n    u16 id;\n    u8 slot;\n    u8 bm_slot_flag, i;\n    struct RfuTgtData *target_p;\n    struct RfuTgtData target_local;\n\n    if (reqResult == 0)\n    {\n        id = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];\n        slot = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6];\n        if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0)\n        {\n            bm_slot_flag = 1 << slot;\n            if (!(bm_slot_flag & gRfuLinkStatus->connSlotFlag))\n            {\n                gRfuLinkStatus->connSlotFlag |= bm_slot_flag;\n                gRfuLinkStatus->linkLossSlotFlag &= ~bm_slot_flag;\n                gRfuLinkStatus->my.id = id;\n                ++gRfuLinkStatus->connCount;\n                gRfuLinkStatus->parentChild = MODE_CHILD;\n                gRfuStatic->flags |= 0x80;\n                for (i = 0; i < RFU_CHILD_MAX; ++i)\n                {\n                    if (gRfuLinkStatus->partner[i].id == gRfuStatic->tryPid)\n                    {\n                        if (gRfuLinkStatus->findParentCount != 0)\n                        {\n                            target_p = &target_local;\n                            CpuCopy16(&gRfuLinkStatus->partner[i], &target_local, sizeof(struct RfuTgtData));\n                            CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner));\n                            gRfuLinkStatus->findParentCount = 0;\n                        }\n                        else\n                        {\n                            target_p = &gRfuLinkStatus->partner[i];\n                        }\n                        break;\n                    }\n                }\n                if (i < RFU_CHILD_MAX)\n                {\n                    CpuCopy16(target_p, &gRfuLinkStatus->partner[slot], sizeof(struct RfuTgtData));\n                    gRfuLinkStatus->partner[slot].slot = slot;\n                }\n            }\n        }\n    }\n    rfu_STC_REQ_callback(reqCommand, reqResult);\n}\n\nu16 rfu_getConnectParentStatus(u8 *status, u8 *connectSlotNo)\n{\n    u8 *packet_p;\n\n    *status = 0xFF;\n    packet_p = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data;\n    if (packet_p[0] == 0xa0 || packet_p[0] == 0xa1)\n    {\n        packet_p += 6;\n        *connectSlotNo = packet_p[0];\n        *status = packet_p[1];\n        return 0;\n    }\n    return ERR_REQ_CMD_ID;\n}\n\nvoid rfu_REQ_endConnectParent(void)\n{\n    STWI_set_Callback_M(rfu_CB_pollConnectParent);\n    STWI_send_CP_EndREQ();\n    if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6] < 4)\n        gRfuStatic->linkEmergencyFlag[gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6]] = 0;\n}\n\nu16 rfu_syncVBlank(void)\n{\n    u8 masterSlave, i;\n    s32 bmSlotFlag;\n\n    rfu_NI_checkCommFailCounter();\n    if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)\n        return 0;\n    if (gRfuStatic->nowWatchInterval != 0)\n        --gRfuStatic->nowWatchInterval;\n    masterSlave = rfu_getMasterSlave();\n    if (!(gRfuStatic->flags & 2))\n    {\n        if (masterSlave == AGB_CLK_SLAVE)\n        {\n            gRfuStatic->flags |= 4;\n            gRfuStatic->watchdogTimer = 360;\n        }\n    }\n    else if (masterSlave != AGB_CLK_SLAVE)\n    {\n        gRfuStatic->flags &= 0xFB;\n    }\n    if (masterSlave != AGB_CLK_SLAVE)\n        gRfuStatic->flags &= 0xFD;\n    else\n        gRfuStatic->flags |= 2;\n    if (!(gRfuStatic->flags & 4))\n        return 0;\n    if (gRfuStatic->watchdogTimer == 0)\n    {\n        gRfuStatic->flags &= 0xFB;\n        bmSlotFlag = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;\n        for (i = 0; i < RFU_CHILD_MAX; ++i)\n            if ((bmSlotFlag >> i) & 1)\n                rfu_STC_removeLinkData(i, 1);\n        gRfuLinkStatus->parentChild = MODE_NEUTRAL;\n        return 1;\n    }\n    --gRfuStatic->watchdogTimer;\n    return 0;\n}\n\nu16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason, u8 *parentBmLinkRecoverySlot)\n{\n    u8 reasonMaybe = 0;\n    u8 reqResult = 0;\n    u8 i;\n    s32 stwiCommand, stwiParam;\n    u8 *packet_p;\n    u8 to_req_disconnect, newLinkLossFlag, num_packets, connSlotFlag, to_disconnect;\n\n    *bmLinkLossSlot = 0;\n    *linkLossReason = REASON_DISCONNECTED;\n    *parentBmLinkRecoverySlot = 0;\n    if (gRfuLinkStatus->parentChild == MODE_NEUTRAL || gSTWIStatus->msMode == 0)\n        return 0;\n    if (gRfuStatic->flags & 4)\n        gRfuStatic->watchdogTimer = 360;\n    if (gRfuStatic->nowWatchInterval == 0)\n    {\n    #if LIBRFU_VERSION < 1026\n        gRfuStatic->nowWatchInterval = gRfuLinkStatus->watchInterval;\n    #else\n        gRfuStatic->nowWatchInterval = 4;\n    #endif\n        reasonMaybe = 1;\n    }\n    if ((u8)reqCommandId == ID_DISCONNECTED_AND_CHANGE_REQ)\n    {\n        u8 *packet_p_2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data;\n\n        *bmLinkLossSlot = packet_p_2[4];\n        *linkLossReason = packet_p_2[5];\n        if (*linkLossReason == REASON_LINK_LOSS)\n            *bmLinkLossSlot = gRfuLinkStatus->connSlotFlag;\n        reasonMaybe = 2;\n    }\n    else\n    {\n        if (reqCommandId == 0x0136)\n        {\n            newLinkLossFlag = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5];\n            newLinkLossFlag ^= gRfuLinkStatus->connSlotFlag;\n            *bmLinkLossSlot = newLinkLossFlag & gRfuLinkStatus->connSlotFlag;\n            *linkLossReason = REASON_LINK_LOSS;\n            for (i = 0; i < RFU_CHILD_MAX; ++i)\n            {\n                if ((*bmLinkLossSlot >> i) & 1)\n                {\n                    gRfuLinkStatus->strength[i] = 0;\n                    rfu_STC_removeLinkData(i, 0);\n                }\n            }\n        }\n        if (reasonMaybe == 0)\n            return 0;\n    }\n    stwiCommand = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command;\n    stwiParam = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];\n    STWI_set_Callback_M(rfu_CB_defaultCallback);\n    STWI_send_LinkStatusREQ();\n    reqResult = STWI_poll_CommandEnd();\n    if (reqResult == 0)\n    {\n        packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];\n        for (i = 0; i < RFU_CHILD_MAX; ++i)\n            gRfuLinkStatus->strength[i] = *packet_p++;\n        to_req_disconnect = 0;\n        i = 0;\n    }\n    else\n    {\n        rfu_STC_REQ_callback(ID_LINK_STATUS_REQ, reqResult);\n        return reqResult;\n    }\n    for (; i < RFU_CHILD_MAX; ++i)\n    {\n    #if LIBRFU_VERSION >= 1026\n        if (gRfuStatic->lsFixedCount[i] != 0)\n        {\n            gRfuStatic->lsFixedCount[i] -= 4;\n            if (gRfuLinkStatus->strength[i] <= 15)\n                gRfuLinkStatus->strength[i] = 16;\n        }\n    #endif\n        newLinkLossFlag = 1 << i;\n        if (reqResult == 0)\n        {\n            if (reasonMaybe == 1 && (gRfuLinkStatus->connSlotFlag & newLinkLossFlag))\n            {\n                if (gRfuLinkStatus->strength[i] == 0)\n                {\n                    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n                    {\n                        ++gRfuStatic->linkEmergencyFlag[i];\n                        if (gRfuStatic->linkEmergencyFlag[i] > 3)\n                        {\n                            *bmLinkLossSlot |= newLinkLossFlag;\n                            *linkLossReason = REASON_LINK_LOSS;\n                        }\n                    }\n                    else\n                    {\n                        STWI_send_SystemStatusREQ();\n                        if (STWI_poll_CommandEnd() == 0)\n                        {\n                            if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0)\n                            {\n                                *bmLinkLossSlot |= newLinkLossFlag;\n                                *linkLossReason = REASON_LINK_LOSS;\n                            }\n                            else\n                            {\n                                if (++gRfuStatic->linkEmergencyFlag[i] > gRfuStatic->linkEmergencyLimit)\n                                {\n                                    gRfuStatic->linkEmergencyFlag[i] = 0;\n                                    STWI_send_DisconnectREQ(gRfuLinkStatus->connSlotFlag);\n                                    STWI_poll_CommandEnd();\n                                    *bmLinkLossSlot |= newLinkLossFlag;\n                                    *linkLossReason = REASON_LINK_LOSS;\n                                }\n                            }\n                        }\n                    }\n                }\n                else\n                {\n                    gRfuStatic->linkEmergencyFlag[i] = 0;\n                }\n            }\n            if (gRfuLinkStatus->parentChild == MODE_PARENT && gRfuLinkStatus->strength[i] != 0)\n            {\n                if (newLinkLossFlag & gRfuLinkStatus->linkLossSlotFlag)\n                {\n                    if (gRfuLinkStatus->strength[i] > 10)\n                    {\n                        *parentBmLinkRecoverySlot |= newLinkLossFlag;\n                        gRfuLinkStatus->connSlotFlag |= newLinkLossFlag;\n                        gRfuLinkStatus->linkLossSlotFlag &= ~newLinkLossFlag;\n                        ++gRfuLinkStatus->connCount;\n                        gRfuStatic->linkEmergencyFlag[i] = 0;\n                    }\n                    else\n                    {\n                        gRfuLinkStatus->strength[i] = 0;\n                    }\n                }\n                else\n                {\n                    if (!((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & newLinkLossFlag))\n                    {\n                        STWI_send_SlotStatusREQ();\n                        STWI_poll_CommandEnd();\n                        packet_p = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data;\n                        num_packets = packet_p[1] - 1;\n                        for (packet_p += 8; num_packets != 0; packet_p += 4, --num_packets)\n                        {\n                            u16 cid = *(u16 *)packet_p;\n\n                            if (packet_p[2] == i && cid == gRfuStatic->cidBak[i])\n                            {\n                                to_req_disconnect |= 1 << i;\n                                break;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        connSlotFlag = gRfuLinkStatus->connSlotFlag;\n        to_disconnect = *bmLinkLossSlot;\n        to_disconnect &= connSlotFlag;\n        if (newLinkLossFlag & to_disconnect)\n            rfu_STC_removeLinkData(i, 0);\n    }\n    if (to_req_disconnect != 0)\n    {\n        STWI_send_DisconnectREQ(to_req_disconnect);\n        STWI_poll_CommandEnd();\n    }\n    // equivalent to:\n    // gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command = stwiCommand;\n    *(u32 *)gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data = stwiCommand;\n    gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = stwiParam;\n    return 0;\n}\n\nstatic void rfu_STC_removeLinkData(u8 bmConnectedPartnerId, u8 bmDisconnect)\n{\n    u8 bmLinkLossFlag = 1 << bmConnectedPartnerId;\n    s32 bmLinkRetainedFlag;\n\n#if LIBRFU_VERSION >= 1026\n    gRfuStatic->lsFixedCount[bmConnectedPartnerId] = 0;\n#endif\n    if ((gRfuLinkStatus->connSlotFlag & bmLinkLossFlag) && gRfuLinkStatus->connCount != 0)\n        --gRfuLinkStatus->connCount;\n    gRfuLinkStatus->connSlotFlag &= bmLinkRetainedFlag = ~bmLinkLossFlag;\n    gRfuLinkStatus->linkLossSlotFlag |= bmLinkLossFlag;\n    if (gRfuLinkStatus->parentChild == MODE_CHILD && gRfuLinkStatus->connSlotFlag == 0)\n        gRfuLinkStatus->parentChild = MODE_NEUTRAL;\n    if (bmDisconnect)\n    {\n        CpuFill16(0, &gRfuLinkStatus->partner[bmConnectedPartnerId], sizeof(struct RfuTgtData));\n        gRfuLinkStatus->linkLossSlotFlag &= bmLinkRetainedFlag;\n        gRfuLinkStatus->getNameFlag &= bmLinkRetainedFlag;\n        gRfuLinkStatus->strength[bmConnectedPartnerId] = 0;\n    }\n}\n\nvoid rfu_REQ_disconnect(u8 bmDisconnectSlot)\n{\n    u16 result;\n\n    if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmDisconnectSlot)\n    {\n        gRfuStatic->recoveryBmSlot = bmDisconnectSlot;\n        if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && gRfuStatic->flags & 0x80)\n        {\n            if (gRfuLinkStatus->linkLossSlotFlag & bmDisconnectSlot)\n                rfu_CB_disconnect(48, 0);\n        }\n        else if (gRfuStatic->SCStartFlag\n              && (STWI_set_Callback_M(rfu_CB_defaultCallback),\n                  STWI_send_SC_EndREQ(),\n                  (result = STWI_poll_CommandEnd()) != 0))\n        {\n            rfu_STC_REQ_callback(ID_SC_END_REQ, result);\n        }\n        else\n        {\n            STWI_set_Callback_M(rfu_CB_disconnect);\n            STWI_send_DisconnectREQ(bmDisconnectSlot);\n        }\n    }\n}\n\nstatic void rfu_CB_disconnect(u8 reqCommand, u16 reqResult)\n{\n    u8 i, bm_slot_flag;\n\n    if (reqResult == 3 && gRfuLinkStatus->parentChild == MODE_CHILD)\n    {\n        STWI_set_Callback_M(rfu_CB_defaultCallback);\n        STWI_send_SystemStatusREQ();\n        if (STWI_poll_CommandEnd() == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0)\n            reqResult = 0;\n    }\n    gRfuStatic->recoveryBmSlot &= gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;\n    gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8] = gRfuStatic->recoveryBmSlot;\n    if (reqResult == 0)\n    {\n        for (i = 0; i < RFU_CHILD_MAX; ++i)\n        {\n            bm_slot_flag = 1 << i;\n            if (bm_slot_flag & gRfuStatic->recoveryBmSlot)\n                rfu_STC_removeLinkData(i, 1);\n        }\n    }\n    if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) == 0)\n        gRfuLinkStatus->parentChild = MODE_NEUTRAL;\n    rfu_STC_REQ_callback(reqCommand, reqResult);\n    if (gRfuStatic->SCStartFlag)\n    {\n        STWI_set_Callback_M(rfu_CB_defaultCallback);\n        STWI_send_SC_StartREQ();\n        reqResult = STWI_poll_CommandEnd();\n        if (reqResult != 0)\n            rfu_STC_REQ_callback(ID_SC_START_REQ, reqResult);\n    }\n}\n\nvoid rfu_REQ_CHILD_startConnectRecovery(u8 bmRecoverySlot)\n{\n    u8 i;\n\n    gRfuStatic->recoveryBmSlot = bmRecoverySlot;\n    for (i = 0; i < RFU_CHILD_MAX && !((bmRecoverySlot >> i) & 1); ++i)\n        ;\n    STWI_set_Callback_M(rfu_STC_REQ_callback);\n    // if i == 4, gRfuLinkStatus->partner[i].id becomes gRfuLinkStatus->my.id\n    STWI_send_CPR_StartREQ(gRfuLinkStatus->partner[i].id, gRfuLinkStatus->my.id, bmRecoverySlot);\n}\n\nvoid rfu_REQ_CHILD_pollConnectRecovery(void)\n{\n    STWI_set_Callback_M(rfu_CB_CHILD_pollConnectRecovery);\n    STWI_send_CPR_PollingREQ();\n}\n\nstatic void rfu_CB_CHILD_pollConnectRecovery(u8 reqCommand, u16 reqResult)\n{\n    u8 bm_slot_flag, i;\n    struct RfuLinkStatus *rfuLinkStatus;\n\n    if (reqResult == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot)\n    {\n        gRfuLinkStatus->parentChild = MODE_CHILD;\n        for (i = 0; i < RFU_CHILD_MAX; ++i)\n        {\n            bm_slot_flag = 1 << i;\n            rfuLinkStatus = gRfuLinkStatus; // ???\n            if (gRfuStatic->recoveryBmSlot & bm_slot_flag & rfuLinkStatus->linkLossSlotFlag)\n            {\n                gRfuLinkStatus->connSlotFlag |= bm_slot_flag;\n                gRfuLinkStatus->linkLossSlotFlag &= ~bm_slot_flag;\n                ++gRfuLinkStatus->connCount;\n                gRfuStatic->linkEmergencyFlag[i] = 0;\n            }\n        }\n        gRfuStatic->recoveryBmSlot = 0;\n    }\n    rfu_STC_REQ_callback(reqCommand, reqResult);\n}\n\nu16 rfu_CHILD_getConnectRecoveryStatus(u8 *status)\n{\n    *status = 0xFF;\n    if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] == 0xB3 || gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] == 0xB4)\n    {\n        *status = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];\n        return 0;\n    }\n    return ERR_REQ_CMD_ID;\n}\n\nvoid rfu_REQ_CHILD_endConnectRecovery(void)\n{\n    STWI_set_Callback_M(rfu_CB_CHILD_pollConnectRecovery);\n    STWI_send_CPR_EndREQ();\n}\n\nstatic void rfu_STC_fastCopy(const u8 **src_p, u8 **dst_p, s32 size)\n{\n    const u8 *src = *src_p;\n    u8 *dst = *dst_p;\n    s32 i;\n\n    for (i = size - 1; i != -1; --i)\n        *dst++ = *src++;\n    *src_p = src;\n    *dst_p = dst;\n}\n\nvoid rfu_REQ_changeMasterSlave(void)\n{\n    if (STWI_read_status(1) == AGB_CLK_MASTER)\n    {\n        STWI_set_Callback_M(rfu_STC_REQ_callback);\n        STWI_send_MS_ChangeREQ();\n    }\n    else\n    {\n        rfu_STC_REQ_callback(ID_MS_CHANGE_REQ, 0);\n    }\n}\n\nbool8 rfu_getMasterSlave(void)\n{\n    bool8 masterSlave = STWI_read_status(1);\n\n    if (masterSlave == AGB_CLK_MASTER)\n    {\n        if (gSTWIStatus->sending)\n        {\n            if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ\n             || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ\n             || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)\n                masterSlave = AGB_CLK_SLAVE;\n        }\n    }\n    return masterSlave;\n}\n\nvoid rfu_clearAllSlot(void)\n{\n    u16 i;\n    u16 IMEBackup = REG_IME;\n\n    REG_IME = 0;\n    for (i = 0; i < RFU_CHILD_MAX; ++i)\n    {\n        CpuFill16(0, gRfuSlotStatusNI[i], 2 * sizeof(struct NIComm));\n        CpuFill16(0, gRfuSlotStatusUNI[i], sizeof(struct UNISend) + sizeof(struct UNIRecv));\n        gRfuLinkStatus->remainLLFrameSizeChild[i] = 16;\n    }\n    gRfuLinkStatus->remainLLFrameSizeParent = LLF_P_SIZE;\n    gRfuLinkStatus->sendSlotNIFlag = 0;\n    gRfuLinkStatus->recvSlotNIFlag = 0;\n    gRfuLinkStatus->sendSlotUNIFlag = 0;\n    gRfuStatic->recvRenewalFlag = 0;\n    REG_IME = IMEBackup;\n}\n\nstatic void rfu_STC_releaseFrame(u8 bm_slot_id, u8 send_recv, struct NIComm *NI_comm)\n{\n\n    if (!(gRfuStatic->flags & 0x80))\n    {\n        if (send_recv == 0)\n            gRfuLinkStatus->remainLLFrameSizeParent += NI_comm->payloadSize;\n        gRfuLinkStatus->remainLLFrameSizeParent += 3;\n    }\n    else\n    {\n        if (send_recv == 0)\n            gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id] += NI_comm->payloadSize;\n        gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id] += 2;\n    }\n}\n\nu16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex)\n{\n    u16 imeBak, send_recv, i;\n    struct NIComm *NI_comm;\n\n    if (slotStatusIndex >= RFU_CHILD_MAX)\n        return ERR_SLOT_NO;\n    if (!(connTypeFlag & (TYPE_UNI_SEND | TYPE_UNI_RECV | TYPE_NI_SEND | TYPE_NI_RECV)))\n        return ERR_COMM_TYPE;\n    imeBak = REG_IME;\n    REG_IME = 0;\n    if (connTypeFlag & (TYPE_NI_SEND | TYPE_NI_RECV))\n    {\n        for (send_recv = 0; send_recv < 2; ++send_recv)\n        {\n            NI_comm = NULL;\n            if (send_recv == 0)\n            {\n                if (connTypeFlag & TYPE_NI_SEND)\n                {\n                    NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->send;\n                    gRfuLinkStatus->sendSlotNIFlag &= ~NI_comm->bmSlotOrg;\n                }\n            }\n            else\n            {\n                if (connTypeFlag & TYPE_NI_RECV)\n                {\n                    NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->recv;\n                    gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex);\n                }\n            }\n            if (NI_comm != NULL)\n            {\n                if (NI_comm->state & SLOT_BUSY_FLAG)\n                {\n                    rfu_STC_releaseFrame(slotStatusIndex, send_recv, NI_comm);\n                    for (i = 0; i < RFU_CHILD_MAX; ++i)\n                        if ((NI_comm->bmSlotOrg >> i) & 1)\n                            NI_comm->failCounter = 0;\n                }\n                CpuFill16(0, NI_comm, sizeof(struct NIComm));\n            }\n        }\n    }\n    if (connTypeFlag & TYPE_UNI_SEND)\n    {\n        struct RfuSlotStatusUNI *slotStatusUNI = gRfuSlotStatusUNI[slotStatusIndex];\n\n        if (slotStatusUNI->send.state & SLOT_BUSY_FLAG)\n        {\n            if (!(gRfuStatic->flags & 0x80))\n                gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)slotStatusUNI->send.payloadSize;\n            else\n                gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] += 2 + (u8)slotStatusUNI->send.payloadSize;\n            gRfuLinkStatus->sendSlotUNIFlag &= ~slotStatusUNI->send.bmSlot;\n        }\n        CpuFill16(0, &slotStatusUNI->send, sizeof(struct UNISend));\n    }\n    if (connTypeFlag & TYPE_UNI_RECV)\n    {\n        CpuFill16(0, &gRfuSlotStatusUNI[slotStatusIndex]->recv, sizeof(struct UNIRecv));\n    }\n    REG_IME = imeBak;\n    return 0;\n}\n\nu16 rfu_setRecvBuffer(u8 connType, u8 slotNo, void *buffer, u32 buffSize)\n{\n    if (slotNo >= RFU_CHILD_MAX)\n        return ERR_SLOT_NO;\n    if (connType & TYPE_NI)\n    {\n        gRfuSlotStatusNI[slotNo]->recvBuffer = buffer;\n        gRfuSlotStatusNI[slotNo]->recvBufferSize = buffSize;\n    }\n    else if (!(connType & TYPE_UNI))\n    {\n        return ERR_COMM_TYPE;\n    }\n    else\n    {\n        gRfuSlotStatusUNI[slotNo]->recvBuffer = buffer;\n        gRfuSlotStatusUNI[slotNo]->recvBufferSize = buffSize;\n    }\n    return 0;\n}\n\nu16 rfu_NI_setSendData(u8 bmSendSlot, u8 subFrameSize, const void *src, u32 size)\n{\n    return rfu_STC_setSendData_org(32, bmSendSlot, subFrameSize, src, size);\n}\n\nu16 rfu_UNI_setSendData(u8 bmSendSlot, const void *src, u8 size)\n{\n    u8 subFrameSize;\n\n    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n        subFrameSize = size + 3;\n    else\n        subFrameSize = size + 2;\n    return rfu_STC_setSendData_org(16, bmSendSlot, subFrameSize, src, 0);\n}\n\nu16 rfu_NI_CHILD_setSendGameName(u8 slotNo, u8 subFrameSize)\n{\n    return rfu_STC_setSendData_org(64, 1 << slotNo, subFrameSize, &gRfuLinkStatus->my.serialNo, 26);\n}\n\nstatic u16 rfu_STC_setSendData_org(u8 ni_or_uni, u8 bmSendSlot, u8 subFrameSize, const void *src, u32 dataSize)\n{\n    u8 bm_slot_id, sendSlotFlag;\n    u8 frameSize;\n    u8 *llFrameSize_p;\n    u8 sending;\n    u8 i;\n    u16 imeBak;\n    struct RfuSlotStatusUNI *slotStatus_UNI;\n    struct RfuSlotStatusNI *slotStatus_NI;\n\n    if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)\n        return ERR_MODE_NOT_CONNECTED;\n    if (!(bmSendSlot & 0xF))\n        return ERR_SLOT_NO;\n    if (((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmSendSlot) != bmSendSlot)\n        return ERR_SLOT_NOT_CONNECTED;\n    if (ni_or_uni & 0x10)\n        sendSlotFlag = gRfuLinkStatus->sendSlotUNIFlag;\n    else\n        sendSlotFlag = gRfuLinkStatus->sendSlotNIFlag;\n    if (sendSlotFlag & bmSendSlot)\n        return ERR_SLOT_BUSY;\n    for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX && !((bmSendSlot >> bm_slot_id) & 1); ++bm_slot_id)\n        ;\n    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n        llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeParent;\n    else if (gRfuLinkStatus->parentChild == MODE_CHILD)\n        llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id];\n    frameSize = llsf_struct[gRfuLinkStatus->parentChild].frameSize;\n    if (subFrameSize > *llFrameSize_p || subFrameSize <= frameSize)\n        return ERR_SUBFRAME_SIZE;\n    imeBak = REG_IME;\n    REG_IME = 0;\n    sending = ni_or_uni & 0x20;\n    if (sending || ni_or_uni == 0x40)\n    {\n        slotStatus_NI = gRfuSlotStatusNI[bm_slot_id];\n        slotStatus_UNI = NULL;\n        slotStatus_NI->send.errorCode = 0;\n        slotStatus_NI->send.now_p[0] = &slotStatus_NI->send.dataType;\n        slotStatus_NI->send.remainSize = 7;\n        slotStatus_NI->send.bmSlotOrg = bmSendSlot;\n        slotStatus_NI->send.bmSlot = bmSendSlot;\n        slotStatus_NI->send.payloadSize = subFrameSize - frameSize;\n        if (sending != 0)\n            slotStatus_NI->send.dataType = 0;\n        else\n            slotStatus_NI->send.dataType = 1;\n        slotStatus_NI->send.dataSize = dataSize;\n        slotStatus_NI->send.src = src;\n        slotStatus_NI->send.ack = 0;\n        slotStatus_NI->send.phase = 0;\n        for (i = 0; i < WINDOW_COUNT; ++i)\n        {\n            slotStatus_NI->send.recvAckFlag[i] = 0;\n            slotStatus_NI->send.n[i] = 1;\n        }\n        for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id)\n        {\n            do\n            {\n                if ((bmSendSlot >> bm_slot_id) & 1)\n                    gRfuSlotStatusNI[bm_slot_id]->send.failCounter = 0;\n            } while (0);\n        }\n        gRfuLinkStatus->sendSlotNIFlag |= bmSendSlot;\n        *llFrameSize_p -= subFrameSize;\n        slotStatus_NI->send.state = SLOT_STATE_SEND_START;\n    }\n    else if (ni_or_uni & 0x10)\n    {\n        slotStatus_UNI = gRfuSlotStatusUNI[bm_slot_id];\n        slotStatus_UNI->send.bmSlot = bmSendSlot;\n        slotStatus_UNI->send.src = src;\n        slotStatus_UNI->send.payloadSize = subFrameSize - frameSize;\n        *llFrameSize_p -= subFrameSize;\n        slotStatus_UNI->send.state = SLOT_STATE_SEND_UNI;\n        gRfuLinkStatus->sendSlotUNIFlag |= bmSendSlot;\n    }\n    REG_IME = imeBak;\n    return 0;\n}\n\nu16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot)\n{\n    struct RfuSlotStatusNI *slotStatusNI;\n    u16 imeBak;\n    u8 i;\n\n    if (slotStatusIndex >= RFU_CHILD_MAX)\n        return ERR_SLOT_NO;\n    if (connType == 0x20)\n    {\n        slotStatusNI = gRfuSlotStatusNI[slotStatusIndex];\n        if ((slotStatusNI->send.state & SLOT_BUSY_FLAG)\n         && (slotStatusNI->send.state & SLOT_SEND_FLAG))\n        {\n            connType = bmNewTgtSlot ^ slotStatusNI->send.bmSlot;\n\n            if (!(connType & bmNewTgtSlot))\n            {\n                if (connType)\n                {\n                    imeBak = REG_IME;\n                    REG_IME = 0;\n                    for (i = 0; i < RFU_CHILD_MAX; ++i)\n                    {\n                        if ((connType >> i) & 1)\n                            gRfuSlotStatusNI[i]->send.failCounter = 0;\n                    }\n                    gRfuLinkStatus->sendSlotNIFlag &= ~connType;\n                    slotStatusNI->send.bmSlot = bmNewTgtSlot;\n                    if (slotStatusNI->send.bmSlot == 0)\n                    {\n                        rfu_STC_releaseFrame(slotStatusIndex, 0, &slotStatusNI->send);\n                        slotStatusNI->send.state = SLOT_STATE_SEND_FAILED;\n                    }\n                    REG_IME = imeBak;\n                }\n            }\n            else\n            {\n                return ERR_SLOT_TARGET;\n            }\n        }\n        else\n        {\n            return ERR_SLOT_NOT_SENDING;\n        }\n    }\n    else\n    {\n        if (connType == 16)\n        {\n            s32 bmSlot;\n\n            if (gRfuSlotStatusUNI[slotStatusIndex]->send.state != SLOT_STATE_SEND_UNI)\n                return ERR_SLOT_NOT_SENDING;\n            for (bmSlot = 0, i = 0; i < RFU_CHILD_MAX; ++i)\n                if (i != slotStatusIndex)\n                    bmSlot |= gRfuSlotStatusUNI[i]->send.bmSlot;\n            if (bmNewTgtSlot & bmSlot)\n                return ERR_SLOT_TARGET;\n            imeBak = REG_IME;\n            REG_IME = 0;\n            gRfuLinkStatus->sendSlotUNIFlag &= ~gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot;\n            gRfuLinkStatus->sendSlotUNIFlag |= bmNewTgtSlot;\n            gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot = bmNewTgtSlot;\n            REG_IME = imeBak;\n        }\n        else\n        {\n            return ERR_COMM_TYPE;\n        }\n    }\n    return 0;\n}\n\nu16 rfu_NI_stopReceivingData(u8 slotStatusIndex)\n{\n    struct NIComm *NI_comm;\n    u16 imeBak;\n\n    if (slotStatusIndex >= RFU_CHILD_MAX)\n        return ERR_SLOT_NO;\n    NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->recv;\n    imeBak = REG_IME;\n    ++imeBak; --imeBak; // fix imeBak, NI_comm register swap\n    REG_IME = 0;\n    if (gRfuSlotStatusNI[slotStatusIndex]->recv.state & SLOT_BUSY_FLAG)\n    {\n        if (gRfuSlotStatusNI[slotStatusIndex]->recv.state == SLOT_STATE_RECV_LAST)\n            gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN;\n        else\n            gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_FAILED;\n        gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex);\n        rfu_STC_releaseFrame(slotStatusIndex, 1, NI_comm);\n    }\n    REG_IME = imeBak;\n    return 0;\n}\n\nu16 rfu_UNI_changeAndReadySendData(u8 slotStatusIndex, const void *src, u8 size)\n{\n    struct UNISend *UNI_send;\n    u8 *frame_p;\n    u16 imeBak;\n    u8 frameEnd;\n\n    if (slotStatusIndex >= RFU_CHILD_MAX)\n        return ERR_SLOT_NO;\n    UNI_send = &gRfuSlotStatusUNI[slotStatusIndex]->send;\n    if (UNI_send->state != SLOT_STATE_SEND_UNI)\n        return ERR_SLOT_NOT_SENDING;\n    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n    {\n        frame_p = &gRfuLinkStatus->remainLLFrameSizeParent;\n        frameEnd = gRfuLinkStatus->remainLLFrameSizeParent + (u8)UNI_send->payloadSize;\n    }\n    else\n    {\n        frame_p = &gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex];\n        frameEnd = gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] + (u8)UNI_send->payloadSize;\n    }\n    if (frameEnd < size)\n        return ERR_SUBFRAME_SIZE;\n    imeBak = REG_IME;\n    REG_IME = 0;\n    UNI_send->src = src;\n    *frame_p = frameEnd - size;\n    UNI_send->payloadSize = size;\n    UNI_send->dataReadyFlag = 1;\n    REG_IME = imeBak;\n    return 0;\n}\n\nvoid rfu_UNI_readySendData(u8 slotStatusIndex)\n{\n    if (slotStatusIndex < RFU_CHILD_MAX)\n    {\n        if (gRfuSlotStatusUNI[slotStatusIndex]->send.state == SLOT_STATE_SEND_UNI)\n            gRfuSlotStatusUNI[slotStatusIndex]->send.dataReadyFlag = 1;\n    }\n}\n\nvoid rfu_UNI_clearRecvNewDataFlag(u8 slotStatusIndex)\n{\n    if (slotStatusIndex < RFU_CHILD_MAX)\n        gRfuSlotStatusUNI[slotStatusIndex]->recv.newDataFlag = 0;\n}\n\nvoid rfu_REQ_sendData(bool8 clockChangeFlag)\n{\n    if (gRfuLinkStatus->parentChild != MODE_NEUTRAL)\n    {\n        if (gRfuLinkStatus->parentChild == MODE_PARENT\n         && !(gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag))\n        {\n            if (gRfuStatic->commExistFlag)\n            {\n                gRfuStatic->emberCount = 16;\n                gRfuStatic->nullFrameCount = 0;\n            }\n            if (gRfuStatic->emberCount)\n                --gRfuStatic->emberCount;\n            else\n                ++gRfuStatic->nullFrameCount;\n            if (gRfuStatic->emberCount\n             || !(gRfuStatic->nullFrameCount & 0xF))\n            {\n                gRfuFixed->LLFBuffer[0] = 1;\n                gRfuFixed->LLFBuffer[4] = 0xFF;\n                STWI_set_Callback_M(rfu_CB_sendData3);\n                if (!clockChangeFlag)\n                    STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, 1);\n                else\n                    STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, 1);\n                return;\n            }\n        }\n        else\n        {\n            if (!gRfuLinkStatus->LLFReadyFlag)\n                rfu_constructSendLLFrame();\n            if (gRfuLinkStatus->LLFReadyFlag)\n            {\n                STWI_set_Callback_M(rfu_CB_sendData);\n                if (clockChangeFlag)\n                {\n                    STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4);\n                    return;\n                }\n                STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4);\n            }\n        }\n        if (clockChangeFlag)\n        {\n            if (gRfuLinkStatus->parentChild == MODE_PARENT)\n            {\n                if (gSTWIStatus->callbackS != NULL)\n                    gSTWIStatus->callbackS(39);\n            }\n            else\n            {\n                STWI_set_Callback_M(rfu_CB_sendData2);\n                STWI_send_MS_ChangeREQ();\n            }\n        }\n    }\n}\n\nstatic void rfu_CB_sendData(u8 reqCommand, u16 reqResult)\n{\n    u8 i;\n    struct NIComm *NI_comm;\n\n    if (reqResult == 0)\n    {\n        for (i = 0; i < RFU_CHILD_MAX; ++i)\n        {\n            if (gRfuSlotStatusUNI[i]->send.dataReadyFlag)\n                gRfuSlotStatusUNI[i]->send.dataReadyFlag = 0;\n            NI_comm = &gRfuSlotStatusNI[i]->send;\n            if (NI_comm->state == SLOT_STATE_SEND_NULL)\n            {\n                rfu_STC_releaseFrame(i, 0, NI_comm);\n                gRfuLinkStatus->sendSlotNIFlag &= ~NI_comm->bmSlot;\n                if (NI_comm->dataType == 1)\n                    gRfuLinkStatus->getNameFlag |= 1 << i;\n                NI_comm->state = SLOT_STATE_SEND_SUCCESS;\n            }\n        }\n    }\n    gRfuLinkStatus->LLFReadyFlag = 0;\n    rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult);\n}\n\nstatic void rfu_CB_sendData2(u8 reqCommand, u16 reqResult)\n{\n    rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult);\n}\n\nstatic void rfu_CB_sendData3(u8 reqCommand, u16 reqResult)\n{\n    if (reqResult != 0)\n        rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult);\n    else if (reqCommand == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ)\n        rfu_STC_REQ_callback(ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ, 0);\n}\n\nstatic void rfu_constructSendLLFrame(void)\n{\n    u32 pakcketSize, currSize;\n    u8 i;\n    u8 *llf_p;\n    struct RfuSlotStatusNI *slotStatusNI;\n\n    if (gRfuLinkStatus->parentChild != MODE_NEUTRAL\n     && gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag)\n    {\n        gRfuLinkStatus->LLFReadyFlag = 0;\n        pakcketSize = 0;\n        llf_p = (u8 *)&gRfuFixed->LLFBuffer[1];\n        for (i = 0; i < RFU_CHILD_MAX; ++i)\n        {\n            currSize = 0;\n            if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG)\n                currSize = rfu_STC_NI_constructLLSF(i, &llf_p, &gRfuSlotStatusNI[i]->send);\n            if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG)\n                currSize += rfu_STC_NI_constructLLSF(i, &llf_p, &gRfuSlotStatusNI[i]->recv);\n            if (gRfuSlotStatusUNI[i]->send.state == SLOT_STATE_SEND_UNI)\n                currSize += rfu_STC_UNI_constructLLSF(i, &llf_p);\n            if (currSize != 0)\n            {\n                if (gRfuLinkStatus->parentChild == MODE_PARENT)\n                    pakcketSize += currSize;\n                else\n                    pakcketSize |= currSize << (5 * i + 8);\n            }\n        }\n        if (pakcketSize != 0)\n        {\n            while ((u32)llf_p & 3)\n                *llf_p++ = 0;\n            gRfuFixed->LLFBuffer[0] = pakcketSize;\n            if (gRfuLinkStatus->parentChild == MODE_CHILD)\n            {\n                u8 *maxSize = llf_p - offsetof(struct RfuFixed, LLFBuffer[1]);\n\n                pakcketSize = maxSize - *(u8 *volatile *)&gRfuFixed;\n            }\n        }\n        gRfuStatic->totalPacketSize = pakcketSize;\n    }\n}\n\nstatic u16 rfu_STC_NI_constructLLSF(u8 bm_slot_id, u8 **dest_pp, struct NIComm *NI_comm)\n{\n    u16 size;\n    u32 frame;\n    u8 i;\n    u8 *frame8_p;\n    const struct LLSFStruct *llsf = &llsf_struct[gRfuLinkStatus->parentChild];\n\n    if (NI_comm->state == SLOT_STATE_SENDING)\n    {\n        while (NI_comm->now_p[NI_comm->phase] >= (const u8 *)NI_comm->src + NI_comm->dataSize)\n        {\n            ++NI_comm->phase;\n            if (NI_comm->phase == 4)\n                NI_comm->phase = 0;\n        }\n    }\n    if (NI_comm->state & SLOT_RECV_FLAG)\n    {\n        size = 0;\n    }\n    else if (NI_comm->state == SLOT_STATE_SENDING)\n    {\n        if (NI_comm->now_p[NI_comm->phase] + NI_comm->payloadSize > (const u8 *)NI_comm->src + NI_comm->dataSize)\n            size = (const u8 *)NI_comm->src + NI_comm->dataSize - NI_comm->now_p[NI_comm->phase];\n        else\n            size = NI_comm->payloadSize;\n    }\n    else\n    {\n        if (NI_comm->remainSize >= NI_comm->payloadSize)\n            size = NI_comm->payloadSize;\n        else\n            size = NI_comm->remainSize;\n    }\n    frame = (NI_comm->state & 0xF) << llsf->slotStateShift\n         | NI_comm->ack << llsf->ackShift\n         | NI_comm->phase << llsf->phaseShit\n         | NI_comm->n[NI_comm->phase] << llsf->nShift\n         | size;\n    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n        frame |= NI_comm->bmSlot << 18;\n    frame8_p = (u8 *)&frame;\n    for (i = 0; i < llsf->frameSize; ++i)\n        *(*dest_pp)++ = *frame8_p++;\n    if (size != 0)\n    {\n        const u8 *src = NI_comm->now_p[NI_comm->phase];\n\n        gRfuFixed->fastCopyPtr(&src, dest_pp, size);\n    }\n    if (NI_comm->state == SLOT_STATE_SENDING)\n    {\n        ++NI_comm->phase;\n        if (NI_comm->phase == 4)\n            NI_comm->phase = 0;\n    }\n    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n        gRfuLinkStatus->LLFReadyFlag = 1;\n    else\n        gRfuLinkStatus->LLFReadyFlag |= 1 << bm_slot_id;\n    return size + llsf->frameSize;\n}\n\nstatic u16 rfu_STC_UNI_constructLLSF(u8 bm_slot_id, u8 **dest_p)\n{\n    const struct LLSFStruct *llsf;\n    const u8 *src_p;\n    u32 frame;\n    u8 *frame8_p;\n    u8 i;\n    struct UNISend *UNI_send = &gRfuSlotStatusUNI[bm_slot_id]->send;\n\n    if (!UNI_send->dataReadyFlag || !UNI_send->bmSlot)\n        return 0;\n    llsf = &llsf_struct[gRfuLinkStatus->parentChild];\n    frame = (UNI_send->state & 0xF) << llsf->slotStateShift\n         | UNI_send->payloadSize;\n    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n        frame |= UNI_send->bmSlot << 18;\n    frame8_p = (u8 *)&frame;\n    for (i = 0; i < llsf->frameSize; ++i)\n        *(*dest_p)++ = *frame8_p++;\n    src_p = UNI_send->src;\n    gRfuFixed->fastCopyPtr(&src_p, dest_p, UNI_send->payloadSize);\n    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n        gRfuLinkStatus->LLFReadyFlag = 16;\n    else\n        gRfuLinkStatus->LLFReadyFlag |= 16 << bm_slot_id;\n    return llsf->frameSize + UNI_send->payloadSize;\n}\n\nvoid rfu_REQ_recvData(void)\n{\n    if (gRfuLinkStatus->parentChild != MODE_NEUTRAL)\n    {\n        gRfuStatic->commExistFlag = gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag;\n        gRfuStatic->recvErrorFlag = 0;\n        STWI_set_Callback_M(rfu_CB_recvData);\n        STWI_send_DataRxREQ();\n    }\n}\n\nstatic void rfu_CB_recvData(u8 reqCommand, u16 reqResult)\n{\n    u8 i;\n    struct RfuSlotStatusNI *slotStatusNI;\n    struct NIComm *NI_comm;\n\n    if (reqResult == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1])\n    {\n        gRfuStatic->NIEndRecvFlag = 0;\n        if (gRfuLinkStatus->parentChild == MODE_PARENT)\n            rfu_STC_PARENT_analyzeRecvPacket();\n        else\n            rfu_STC_CHILD_analyzeRecvPacket();\n        for (i = 0; i < RFU_CHILD_MAX; ++i)\n        {\n            slotStatusNI = gRfuSlotStatusNI[i];\n            if (slotStatusNI->recv.state == SLOT_STATE_RECV_LAST && !((gRfuStatic->NIEndRecvFlag >> i) & 1))\n            {\n                NI_comm = &slotStatusNI->recv;\n                if (NI_comm->dataType == 1)\n                    gRfuLinkStatus->getNameFlag |= 1 << i;\n                rfu_STC_releaseFrame(i, 1, NI_comm);\n                gRfuLinkStatus->recvSlotNIFlag &= ~NI_comm->bmSlot;\n                slotStatusNI->recv.state = SLOT_STATE_RECV_SUCCESS;\n            }\n        }\n        if (gRfuStatic->recvErrorFlag)\n            reqResult = gRfuStatic->recvErrorFlag | ERR_DATA_RECV;\n    }\n    rfu_STC_REQ_callback(reqCommand, reqResult);\n}\n\nstatic void rfu_STC_PARENT_analyzeRecvPacket(void)\n{\n    u32 frames32;\n    u8 bm_slot_id;\n    u8 frame_counts[RFU_CHILD_MAX];\n    u8 *packet_p;\n\n    frames32 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] >> 8;\n    for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id)\n    {\n        frame_counts[bm_slot_id] = frames32 & 0x1F;\n        frames32 >>= 5;\n        if (frame_counts[bm_slot_id] == 0)\n            gRfuStatic->NIEndRecvFlag |= 1 << bm_slot_id;\n    }\n    packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8];\n    for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id)\n    {\n        if (frame_counts[bm_slot_id])\n        {\n            u8 *frames_p = &frame_counts[bm_slot_id];\n\n            do\n            {\n                u8 analyzed_frames = rfu_STC_analyzeLLSF(bm_slot_id, packet_p, *frames_p);\n\n                packet_p += analyzed_frames;\n                *frames_p -= analyzed_frames;\n            } while (!(*frames_p & 0x80) && (*frames_p));\n        }\n    }\n}\n\nstatic void rfu_STC_CHILD_analyzeRecvPacket(void)\n{\n    u16 frames_remaining;\n    u8 *packet_p;\n    u16 analyzed_frames;\n\n    frames_remaining = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] & 0x7F;\n    packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8];\n    if (frames_remaining == 0)\n        gRfuStatic->NIEndRecvFlag = 15;\n    do\n    {\n        if (frames_remaining == 0)\n            break;\n        analyzed_frames = rfu_STC_analyzeLLSF(0, packet_p, frames_remaining);\n        packet_p += analyzed_frames;\n        frames_remaining -= analyzed_frames;\n    } while (!(frames_remaining & 0x8000));\n}\n\nstatic u16 rfu_STC_analyzeLLSF(u8 slot_id, const u8 *src, u16 last_frame)\n{\n    struct RfuLocalStruct llsf_NI;\n    const struct LLSFStruct *llsf_p;\n    u32 frames;\n    u8 i;\n    u16 retVal;\n\n    llsf_p = &llsf_struct[~gRfuLinkStatus->parentChild & (MODE_NEUTRAL & MODE_PARENT)];\n    if (last_frame < llsf_p->frameSize)\n        return last_frame;\n    frames = 0;\n    for (i = 0; i < llsf_p->frameSize; ++i)\n        frames |= *src++ << 8 * i;\n    llsf_NI.recvFirst = (frames >> llsf_p->recvFirstShift) & llsf_p->recvFirstMask;\n    llsf_NI.connSlotFlag = (frames >> llsf_p->connSlotFlagShift) & llsf_p->connSlotFlagMask;\n    llsf_NI.slotState = (frames >> llsf_p->slotStateShift) & llsf_p->slotStateMask;\n    llsf_NI.ack = (frames >> llsf_p->ackShift) & llsf_p->ackMask;\n    llsf_NI.phase = (frames >> llsf_p->phaseShit) & llsf_p->phaseMask;\n    llsf_NI.n = (frames >> llsf_p->nShift) & llsf_p->nMask;\n    llsf_NI.frame = (frames  & llsf_p->framesMask) & frames;\n    retVal = llsf_NI.frame + llsf_p->frameSize;\n    if (llsf_NI.recvFirst == 0)\n    {\n        if (gRfuLinkStatus->parentChild == MODE_PARENT)\n        {\n            if ((gRfuLinkStatus->connSlotFlag >> slot_id) & 1)\n            {\n                if (llsf_NI.slotState == LCOM_UNI)\n                {\n                    rfu_STC_UNI_receive(slot_id, &llsf_NI, src);\n                }\n                else if (llsf_NI.ack == 0)\n                {\n                    rfu_STC_NI_receive_Receiver(slot_id, &llsf_NI, src);\n                }\n                else\n                {\n                    for (i = 0; i < RFU_CHILD_MAX; ++i)\n                        if (((gRfuSlotStatusNI[i]->send.bmSlot >> slot_id) & 1)\n                         && ((gRfuLinkStatus->sendSlotNIFlag >> slot_id) & 1))\n                            break;\n                    if (i < RFU_CHILD_MAX)\n                        rfu_STC_NI_receive_Sender(i, slot_id, &llsf_NI, src);\n                }\n            }\n        }\n        else\n        {\n            s32 conSlots = gRfuLinkStatus->connSlotFlag & llsf_NI.connSlotFlag;\n\n            if (conSlots)\n            {\n                for (i = 0; i < RFU_CHILD_MAX; ++i)\n                {\n                    if ((conSlots >> i) & 1)\n                    {\n                        if (llsf_NI.slotState == LCOM_UNI)\n                            rfu_STC_UNI_receive(i, &llsf_NI, src);\n                        else if (llsf_NI.ack == 0)\n                            rfu_STC_NI_receive_Receiver(i, &llsf_NI, src);\n                        else if ((gRfuLinkStatus->sendSlotNIFlag >> i) & 1)\n                            rfu_STC_NI_receive_Sender(i, i, &llsf_NI, src);\n                    }\n                }\n            }\n        }\n    }\n    return retVal;\n}\n\nstatic void rfu_STC_UNI_receive(u8 bm_slot_id, const struct RfuLocalStruct *llsf_NI, const u8 *src)\n{\n    u8 *dest;\n    u32 size;\n    struct RfuSlotStatusUNI *slotStatusUNI = gRfuSlotStatusUNI[bm_slot_id];\n    struct UNIRecv *UNI_recv = &slotStatusUNI->recv;\n\n    UNI_recv->errorCode = 0;\n    if (gRfuSlotStatusUNI[bm_slot_id]->recvBufferSize < llsf_NI->frame)\n    {\n        slotStatusUNI->recv.state = SLOT_STATE_RECV_IGNORE;\n        UNI_recv->errorCode = ERR_RECV_BUFF_OVER;\n    }\n    else\n    {\n        if (UNI_recv->dataBlockFlag)\n        {\n            if (UNI_recv->newDataFlag)\n            {\n                UNI_recv->errorCode = ERR_RECV_UNK;\n                goto force_tail_merge;\n            }\n        }\n        else\n        {\n            if (UNI_recv->newDataFlag)\n                UNI_recv->errorCode = ERR_RECV_DATA_OVERWRITED;\n        }\n        UNI_recv->state = SLOT_STATE_RECEIVING;\n        size = UNI_recv->dataSize = llsf_NI->frame;\n        dest = gRfuSlotStatusUNI[bm_slot_id]->recvBuffer;\n        gRfuFixed->fastCopyPtr(&src, &dest, size);\n        UNI_recv->newDataFlag = 1;\n        UNI_recv->state = 0;\n    }\nforce_tail_merge:\n    if (UNI_recv->errorCode)\n        gRfuStatic->recvErrorFlag |= 16 << bm_slot_id;\n}\n\nstatic void rfu_STC_NI_receive_Sender(u8 NI_slot, u8 bm_flag, const struct RfuLocalStruct *llsf_NI, const u8 *data_p)\n{\n    struct NIComm *NI_comm = &gRfuSlotStatusNI[NI_slot]->send;\n    u16 state = NI_comm->state;\n    u8 n = NI_comm->n[llsf_NI->phase];\n    u8 i;\n    u16 imeBak;\n\n    if ((llsf_NI->slotState == LCOM_NI && state == SLOT_STATE_SENDING)\n     || (llsf_NI->slotState == LCOM_NI_START && state == SLOT_STATE_SEND_START)\n     || (llsf_NI->slotState == LCOM_NI_END && state == SLOT_STATE_SEND_LAST))\n    {\n        if (NI_comm->n[llsf_NI->phase] == llsf_NI->n)\n            NI_comm->recvAckFlag[llsf_NI->phase] |= 1 << bm_flag;\n    }\n    if ((NI_comm->recvAckFlag[llsf_NI->phase] & NI_comm->bmSlot) == NI_comm->bmSlot)\n    {\n        NI_comm->n[llsf_NI->phase] = (NI_comm->n[llsf_NI->phase] + 1) & 3;\n        NI_comm->recvAckFlag[llsf_NI->phase] = 0;\n        if ((u16)(NI_comm->state + ~SLOT_STATE_SEND_NULL) <= 1)\n        {\n            if (NI_comm->state == SLOT_STATE_SEND_START)\n                NI_comm->now_p[llsf_NI->phase] += NI_comm->payloadSize;\n            else\n                NI_comm->now_p[llsf_NI->phase] += NI_comm->payloadSize << 2;\n            NI_comm->remainSize -= NI_comm->payloadSize;\n            switch (NI_comm->remainSize)\n            {\n            default:\n            case 0:\n                NI_comm->phase = 0;\n                if (NI_comm->state == SLOT_STATE_SEND_START)\n                {\n                    for (i = 0; i < WINDOW_COUNT; ++i)\n                    {\n                        NI_comm->n[i] = 1;\n                        NI_comm->now_p[i] = NI_comm->src + NI_comm->payloadSize * i;\n                    }\n                    NI_comm->remainSize = NI_comm->dataSize;\n                    NI_comm->state = SLOT_STATE_SENDING;\n                }\n                else\n                {\n                    NI_comm->n[0] = 0;\n                    NI_comm->remainSize = 0;\n                    NI_comm->state = SLOT_STATE_SEND_LAST;\n                }\n                break;\n            case 1 ... INT_MAX:\n                break;\n            }\n        }\n        else if (NI_comm->state == SLOT_STATE_SEND_LAST)\n        {\n            NI_comm->state = SLOT_STATE_SEND_NULL;\n        }\n    }\n    if (NI_comm->state != state\n     || NI_comm->n[llsf_NI->phase] != n\n     || (NI_comm->recvAckFlag[llsf_NI->phase] >> bm_flag) & 1)\n    {\n        imeBak = REG_IME;\n        REG_IME = 0;\n        gRfuStatic->recvRenewalFlag |= 16 << bm_flag;\n        gRfuSlotStatusNI[bm_flag]->send.failCounter = 0;\n        REG_IME = imeBak;\n    }\n}\n\nstatic void rfu_STC_NI_receive_Receiver(u8 bm_slot_id, const struct RfuLocalStruct *llsf_NI, const u8 *data_p)\n{\n    u16 imeBak;\n    u32 state_check = 0;\n    struct RfuSlotStatusNI *slotStatus_NI = gRfuSlotStatusNI[bm_slot_id];\n    struct NIComm *recvSlot = &slotStatus_NI->recv;\n    u16 state = slotStatus_NI->recv.state;\n    u8 n = slotStatus_NI->recv.n[llsf_NI->phase];\n\n    if (llsf_NI->slotState == LCOM_NI_END)\n    {\n        gRfuStatic->NIEndRecvFlag |= 1 << bm_slot_id;\n        if (slotStatus_NI->recv.state == SLOT_STATE_RECEIVING)\n        {\n            slotStatus_NI->recv.phase = 0;\n            slotStatus_NI->recv.n[0] = 0;\n            slotStatus_NI->recv.state = SLOT_STATE_RECV_LAST;\n        }\n    }\n    else if (llsf_NI->slotState == LCOM_NI)\n    {\n        if (state == SLOT_STATE_RECV_START && !recvSlot->remainSize)\n            rfu_STC_NI_initSlot_asRecvDataEntity(bm_slot_id, recvSlot);\n        if (recvSlot->state == SLOT_STATE_RECEIVING)\n            state_check = 1;\n    }\n    else if (llsf_NI->slotState == LCOM_NI_START)\n    {\n        if (state == SLOT_STATE_RECV_START)\n        {\n            state_check = 1;\n        }\n        else\n        {\n            rfu_STC_NI_initSlot_asRecvControllData(bm_slot_id, recvSlot);\n            if (slotStatus_NI->recv.state != SLOT_STATE_RECV_START)\n                return;\n            state_check = 1;\n        }\n    }\n    if (state_check != 0)\n    {\n        if (llsf_NI->n == ((recvSlot->n[llsf_NI->phase] + 1) & 3))\n        {\n            gRfuFixed->fastCopyPtr(&data_p, (u8 **)&recvSlot->now_p[llsf_NI->phase], llsf_NI->frame);\n            if (recvSlot->state == SLOT_STATE_RECEIVING)\n                recvSlot->now_p[llsf_NI->phase] += 3 * recvSlot->payloadSize;\n            recvSlot->remainSize -= llsf_NI->frame;\n            recvSlot->n[llsf_NI->phase] = llsf_NI->n;\n        }\n    }\n    if (recvSlot->errorCode == 0)\n    {\n        recvSlot->phase = llsf_NI->phase;\n        if (recvSlot->state != state || recvSlot->n[llsf_NI->phase] != n || recvSlot->n[llsf_NI->phase] == llsf_NI->n)\n        {\n            imeBak = REG_IME;\n            REG_IME = 0;\n            gRfuStatic->recvRenewalFlag |= 1 << bm_slot_id;\n            recvSlot->failCounter = 0;\n            REG_IME = imeBak;\n        }\n    }\n}\n\nstatic void rfu_STC_NI_initSlot_asRecvControllData(u8 bm_slot_id, struct NIComm *NI_comm)\n{\n    u8 *llFrameSize_p;\n    u32 llFrameSize;\n    u8 bm_slot_flag;\n\n    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n    {\n        llFrameSize = 3;\n        llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeParent;\n    }\n    else\n    {\n        llFrameSize = 2;\n        llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id];\n    }\n    bm_slot_flag = 1 << bm_slot_id;\n    if (NI_comm->state == 0)\n    {\n        if (*llFrameSize_p < llFrameSize)\n        {\n            NI_comm->state = SLOT_STATE_RECV_IGNORE;\n            NI_comm->errorCode = ERR_RECV_REPLY_SUBFRAME_SIZE;\n            gRfuStatic->recvErrorFlag |= bm_slot_flag;\n        }\n        else\n        {\n            NI_comm->errorCode = 0;\n            *llFrameSize_p -= llFrameSize;\n            NI_comm->now_p[0] = &NI_comm->dataType;\n            NI_comm->remainSize = 7;\n            NI_comm->ack = 1;\n            NI_comm->payloadSize = 0;\n            NI_comm->bmSlot = bm_slot_flag;\n            NI_comm->state = SLOT_STATE_RECV_START;\n            gRfuLinkStatus->recvSlotNIFlag |= bm_slot_flag;\n        }\n    }\n}\n\nstatic void rfu_STC_NI_initSlot_asRecvDataEntity(u8 bm_slot_id, struct NIComm *NI_comm)\n{\n    u8 bm_slot_flag, win_id;\n\n    if (NI_comm->dataType == 1)\n    {\n        NI_comm->now_p[0] = (void *)&gRfuLinkStatus->partner[bm_slot_id].serialNo;\n    }\n    else\n    {\n        if (NI_comm->dataSize > gRfuSlotStatusNI[bm_slot_id]->recvBufferSize)\n        {\n            bm_slot_flag = 1 << bm_slot_id;\n            gRfuStatic->recvErrorFlag |= bm_slot_flag;\n            gRfuLinkStatus->recvSlotNIFlag &= ~bm_slot_flag;\n            NI_comm->errorCode = ERR_RECV_BUFF_OVER;\n            NI_comm->state = SLOT_STATE_RECV_FAILED;\n            rfu_STC_releaseFrame(bm_slot_id, 1, NI_comm);\n            return;\n        }\n        NI_comm->now_p[0] = gRfuSlotStatusNI[bm_slot_id]->recvBuffer;\n    }\n    for (win_id = 0; win_id < WINDOW_COUNT; ++win_id)\n    {\n        NI_comm->n[win_id] = 0;\n        NI_comm->now_p[win_id] = &NI_comm->now_p[0][NI_comm->payloadSize * win_id];\n    }\n    NI_comm->remainSize = NI_comm->dataSize;\n    NI_comm->state = SLOT_STATE_RECEIVING;\n}\n\nstatic void rfu_NI_checkCommFailCounter(void)\n{\n    u16 imeBak;\n    u32 recvRenewalFlag;\n    u8 bm_slot_flag, bm_slot_id;\n\n    if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag)\n    {\n        imeBak = REG_IME;\n        REG_IME = 0;\n        recvRenewalFlag = gRfuStatic->recvRenewalFlag >> 4;\n        for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id)\n        {\n            bm_slot_flag = 1 << bm_slot_id;\n            if (gRfuLinkStatus->sendSlotNIFlag & bm_slot_flag\n             && !(gRfuStatic->recvRenewalFlag & bm_slot_flag))\n                ++gRfuSlotStatusNI[bm_slot_id]->send.failCounter;\n            if (gRfuLinkStatus->recvSlotNIFlag & bm_slot_flag\n             && !(recvRenewalFlag & bm_slot_flag))\n                ++gRfuSlotStatusNI[bm_slot_id]->recv.failCounter;\n        }\n        gRfuStatic->recvRenewalFlag = 0;\n        REG_IME = imeBak;\n    }\n}\n\nvoid rfu_REQ_noise(void)\n{\n    STWI_set_Callback_M(rfu_STC_REQ_callback);\n    STWI_send_TestModeREQ(1, 0);\n}\n"
  },
  {
    "path": "src/librfu_sio32id.c",
    "content": "#include \"librfu.h\"\n\nstatic void Sio32IDIntr(void);\nstatic void Sio32IDInit(void);\nstatic s32 Sio32IDMain(void);\n\nstruct RfuSIO32Id\n{\n    u8 MS_mode;\n    u8 state;\n    u16 count;\n    u16 send_id;\n    u16 recv_id;\n    u16 unk8; // unused\n    u16 lastId;\n};\n\nstruct RfuSIO32Id gRfuSIO32Id;\n\nstatic const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO\nstatic const char Sio32IDLib_Var[] = \"Sio32ID_030820\";\n\ns32 AgbRFU_checkID(u8 maxTries)\n{\n    u16 ieBak;\n    vu16 *regTMCNTL;\n    s32 id;\n\n    // Interrupts must be enabled\n    if (REG_IME == 0)\n        return -1;\n    ieBak = REG_IE;\n    gSTWIStatus->state = 10;\n    STWI_set_Callback_ID(Sio32IDIntr);\n    Sio32IDInit();\n    regTMCNTL = &REG_TMCNT_L(gSTWIStatus->timerSelect);\n    maxTries *= 8;\n    while (--maxTries != 0xFF)\n    {\n        id = Sio32IDMain();\n        if (id != 0)\n            break;\n        regTMCNTL[1] = 0;\n        regTMCNTL[0] = 0;\n        regTMCNTL[1] = TIMER_1024CLK | TIMER_ENABLE;\n        while (regTMCNTL[0] < 32)\n            ;\n        regTMCNTL[1] = 0;\n        regTMCNTL[0] = 0;\n    }\n    REG_IME = 0;\n    REG_IE = ieBak;\n    REG_IME = 1;\n    gSTWIStatus->state = 0;\n    STWI_set_Callback_ID(NULL);\n    return id;\n}\n\nstatic void Sio32IDInit(void)\n{\n    REG_IME = 0;\n    REG_IE &= ~((8 << gSTWIStatus->timerSelect) | INTR_FLAG_SERIAL);\n    REG_IME = 1;\n    REG_RCNT = 0;\n    REG_SIOCNT = SIO_32BIT_MODE;\n    REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE;\n    CpuFill32(0, &gRfuSIO32Id, sizeof(struct RfuSIO32Id));\n    REG_IF = INTR_FLAG_SERIAL;\n}\n\nstatic s32 Sio32IDMain(void)\n{\n    switch (gRfuSIO32Id.state)\n    {\n    case 0:\n        gRfuSIO32Id.MS_mode = AGB_CLK_MASTER;\n        REG_SIOCNT |= SIO_38400_BPS;\n        REG_IME = 0;\n        REG_IE |= INTR_FLAG_SERIAL;\n        REG_IME = 1;\n        gRfuSIO32Id.state = 1;\n        *(vu8 *)&REG_SIOCNT |= SIO_ENABLE;\n        break;\n    case 1:\n        if (gRfuSIO32Id.lastId == 0)\n        {\n            if (gRfuSIO32Id.MS_mode == AGB_CLK_MASTER)\n            {\n                if (gRfuSIO32Id.count == 0)\n                {\n                    REG_IME = 0;\n                    REG_SIOCNT |= SIO_ENABLE;\n                    REG_IME = 1;\n                }\n            }\n            else if (gRfuSIO32Id.send_id != RFU_ID && !gRfuSIO32Id.count)\n            {\n                REG_IME = 0;\n                REG_IE &= ~INTR_FLAG_SERIAL;\n                REG_IME = 1;\n                REG_SIOCNT = 0;\n                REG_SIOCNT = SIO_32BIT_MODE;\n                REG_IF = INTR_FLAG_SERIAL;\n                REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE;\n                REG_IME = 0;\n                REG_IE |= INTR_FLAG_SERIAL;\n                REG_IME = 1;\n            }\n            break;\n        }\n        else\n        {\n            gRfuSIO32Id.state = 2;\n            // fallthrough\n        }\n    default:\n        return gRfuSIO32Id.lastId;\n    }\n    return 0;\n}\n\nstatic void Sio32IDIntr(void)\n{\n    u32 regSIODATA32;\n    u16 delay;\n    u32 rfuSIO32IdUnk0_times_16;\n    u16 negRfuSIO32IdUnk6;\n\n    regSIODATA32 = REG_SIODATA32;\n    if (gRfuSIO32Id.MS_mode != AGB_CLK_MASTER)\n        REG_SIOCNT |= SIO_ENABLE;\n    rfuSIO32IdUnk0_times_16 = (regSIODATA32 << (16 * gRfuSIO32Id.MS_mode)) >> 16;\n    regSIODATA32 = (regSIODATA32 << 16 * (1 - gRfuSIO32Id.MS_mode)) >> 16;\n    if (gRfuSIO32Id.lastId == 0)\n    {\n        u16 backup = rfuSIO32IdUnk0_times_16;\n        if (backup == gRfuSIO32Id.recv_id)\n        {\n            if (gRfuSIO32Id.count < 4)\n            {\n                backup = (u16)~gRfuSIO32Id.send_id;\n                if (gRfuSIO32Id.recv_id == backup)\n                {\n                    if (regSIODATA32 == (u16)~gRfuSIO32Id.recv_id)\n                        ++gRfuSIO32Id.count;\n                }\n            }\n            else\n                gRfuSIO32Id.lastId = regSIODATA32;\n        }\n        else\n        {\n            gRfuSIO32Id.count = 0;\n        }\n    }\n    if (gRfuSIO32Id.count < 4)\n        gRfuSIO32Id.send_id = *(gRfuSIO32Id.count + Sio32ConnectionData);\n    else\n        gRfuSIO32Id.send_id = RFU_ID;\n    gRfuSIO32Id.recv_id = ~regSIODATA32;\n    REG_SIODATA32 = (gRfuSIO32Id.send_id << 16 * (1 - gRfuSIO32Id.MS_mode))\n                  + (gRfuSIO32Id.recv_id << 16 * gRfuSIO32Id.MS_mode);\n    if (gRfuSIO32Id.MS_mode == AGB_CLK_MASTER && (gRfuSIO32Id.count != 0 || regSIODATA32 == 0x494e))\n    {\n        for (delay = 0; delay < 600; ++delay)\n            ;\n        if (gRfuSIO32Id.lastId == 0)\n            REG_SIOCNT |= SIO_ENABLE;\n    }\n}\n"
  },
  {
    "path": "src/librfu_stwi.c",
    "content": "#include \"librfu.h\"\n\nstatic void STWI_intr_timer(void);\nstatic u16 STWI_init(u8 request);\nstatic s32 STWI_start_Command(void);\nstatic void STWI_set_timer(u8 unk);\nstatic void STWI_stop_timer(void);\nstatic s32 STWI_restart_Command(void);\nstatic s32 STWI_reset_ClockCounter(void);\n\nstruct STWIStatus *gSTWIStatus;\n\nvoid STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam)\n{\n    // If we're copying our interrupt into RAM, DMA it to block1 and use\n    // block2 for our STWIStatus, otherwise block1 holds the STWIStatus.\n    // interrupt usually is a pointer to gIntrTable[1]\n    if (copyInterruptToRam == TRUE)\n    {\n        *interrupt = (IntrFunc)interruptStruct->block1;\n        DmaCopy16(3, &IntrSIO32, interruptStruct->block1, sizeof(interruptStruct->block1));\n        gSTWIStatus = &interruptStruct->block2;\n    }\n    else\n    {\n        *interrupt = IntrSIO32;\n        gSTWIStatus = (struct STWIStatus *)interruptStruct->block1;\n    }\n    gSTWIStatus->rxPacket = &interruptStruct->rxPacketAlloc;\n    gSTWIStatus->txPacket = &interruptStruct->txPacketAlloc;\n    gSTWIStatus->msMode = AGB_CLK_MASTER;\n    gSTWIStatus->state = 0; // master send req\n    gSTWIStatus->reqLength = 0;\n    gSTWIStatus->reqNext = 0;\n    gSTWIStatus->ackLength = 0;\n    gSTWIStatus->ackNext = 0;\n    gSTWIStatus->ackActiveCommand = 0;\n    gSTWIStatus->timerState = 0;\n    gSTWIStatus->timerActive = 0;\n    gSTWIStatus->error = 0;\n    gSTWIStatus->recoveryCount = 0;\n    gSTWIStatus->sending = 0;\n    REG_RCNT = 0x100; // TODO: mystery bit? \n    REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;\n    STWI_init_Callback_M();\n    STWI_init_Callback_S();\n    IntrEnable(INTR_FLAG_SERIAL);\n}\n\nvoid STWI_init_timer(IntrFunc *interrupt, s32 timerSelect)\n{\n    *interrupt = STWI_intr_timer;\n    gSTWIStatus->timerSelect = timerSelect;\n    IntrEnable(INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect);\n}\n\nvoid AgbRFU_SoftReset(void)\n{\n    vu16 *timerL;\n    vu16 *timerH;\n\n    REG_RCNT = 0x8000;\n    REG_RCNT = 0x80A0; // all these bits are undocumented\n    timerL = &REG_TMCNT_L(gSTWIStatus->timerSelect);\n    timerH = &REG_TMCNT_H(gSTWIStatus->timerSelect);\n    *timerH = 0;\n    *timerL = 0;\n    *timerH = TIMER_ENABLE | TIMER_1024CLK;\n    while (*timerL <= 0x11)\n        REG_RCNT = 0x80A2;\n    *timerH = 3;\n    REG_RCNT = 0x80A0;\n    REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;\n    gSTWIStatus->state = 0; // master send req\n    gSTWIStatus->reqLength = 0;\n    gSTWIStatus->reqNext = 0;\n    gSTWIStatus->reqActiveCommand = 0;\n    gSTWIStatus->ackLength = 0;\n    gSTWIStatus->ackNext = 0;\n    gSTWIStatus->ackActiveCommand = 0;\n    gSTWIStatus->timerState = 0;\n    gSTWIStatus->timerActive = 0;\n    gSTWIStatus->error = 0;\n    gSTWIStatus->msMode = AGB_CLK_MASTER;\n    gSTWIStatus->recoveryCount = 0;\n    gSTWIStatus->sending = 0;\n}\n\nvoid STWI_set_MS_mode(u8 mode)\n{\n    gSTWIStatus->msMode = mode;\n}\n\nu16 STWI_read_status(u8 index)\n{\n    switch (index)\n    {\n    case 0:\n        return gSTWIStatus->error;\n    case 1:\n        return gSTWIStatus->msMode;\n    case 2:\n        return gSTWIStatus->state;\n    case 3:\n        return gSTWIStatus->reqActiveCommand;\n    default:\n        return 0xFFFF;\n    }\n}\n\nvoid STWI_init_Callback_M(void)\n{\n    STWI_set_Callback_M(NULL);\n}\n\nvoid STWI_init_Callback_S(void)\n{\n    STWI_set_Callback_S(NULL);\n}\n\n// The callback can take 2 or 3 arguments.\nvoid STWI_set_Callback_M(void *callbackM)\n{\n    gSTWIStatus->callbackM = callbackM;\n}\n\nvoid STWI_set_Callback_S(void (*callbackS)(u16))\n{\n    gSTWIStatus->callbackS = callbackS;\n}\n\nvoid STWI_set_Callback_ID(void (*func)(void)) // name in SDK, but is actually setting a function pointer\n{\n    gSTWIStatus->callbackID = func;\n}\n\nu16 STWI_poll_CommandEnd(void)\n{\n    while (gSTWIStatus->sending == 1)\n        ;\n    return gSTWIStatus->error;\n}\n\nvoid STWI_send_ResetREQ(void)\n{\n    if (!STWI_init(ID_RESET_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_LinkStatusREQ(void)\n{\n    if (!STWI_init(ID_LINK_STATUS_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_VersionStatusREQ(void)\n{\n    if (!STWI_init(ID_VERSION_STATUS_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_SystemStatusREQ(void)\n{\n    if (!STWI_init(ID_SYSTEM_STATUS_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_SlotStatusREQ(void)\n{\n    if (!STWI_init(ID_SLOT_STATUS_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_ConfigStatusREQ(void)\n{\n    if (!STWI_init(ID_CONFIG_STATUS_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_GameConfigREQ(const u8 *serial_gname, const u8 *uname)\n{\n    u8 *packetBytes;\n    s32 i;\n\n    if (!STWI_init(ID_GAME_CONFIG_REQ))\n    {\n        gSTWIStatus->reqLength = 6;\n        packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;\n        packetBytes += sizeof(u32);\n        *(u16 *)packetBytes = *(u16 *)serial_gname;\n        packetBytes += sizeof(u16);\n        serial_gname += sizeof(u16);\n        for (i = 0; i < 14; ++i)\n        {\n            *packetBytes = *serial_gname;\n            ++packetBytes;\n            ++serial_gname;\n        }\n        for (i = 0; i < 8; ++i)\n        {\n            *packetBytes = *uname;\n            ++packetBytes;\n            ++uname;\n        }\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_SystemConfigREQ(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer)\n{\n    if (!STWI_init(ID_SYSTEM_CONFIG_REQ))\n    {\n        u8 *packetBytes;\n\n        gSTWIStatus->reqLength = 1;\n        packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;\n        packetBytes += sizeof(u32);\n        *packetBytes++ = mcTimer;\n        *packetBytes++ = maxMFrame;\n        *(u16 *)packetBytes = availSlotFlag;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_SC_StartREQ(void)\n{\n    if (!STWI_init(ID_SC_START_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_SC_PollingREQ(void)\n{\n    if (!STWI_init(ID_SC_POLL_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_SC_EndREQ(void)\n{\n    if (!STWI_init(ID_SC_END_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_SP_StartREQ(void)\n{\n    if (!STWI_init(ID_SP_START_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_SP_PollingREQ(void)\n{\n    if (!STWI_init(ID_SP_POLL_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_SP_EndREQ(void)\n{\n    if (!STWI_init(ID_SP_END_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_CP_StartREQ(u16 unk1)\n{\n    if (!STWI_init(ID_CP_START_REQ))\n    {\n        gSTWIStatus->reqLength = 1;\n        gSTWIStatus->txPacket->rfuPacket32.data[0] = unk1;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_CP_PollingREQ(void)\n{\n    if (!STWI_init(ID_CP_POLL_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_CP_EndREQ(void)\n{\n    if (!STWI_init(ID_CP_END_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_DataTxREQ(const void *in, u8 size)\n{\n    if (!STWI_init(ID_DATA_TX_REQ))\n    {\n        u8 reqLength = (size / sizeof(u32));\n        if (size & (sizeof(u32) - 1))\n            reqLength += 1;\n        gSTWIStatus->reqLength = reqLength;\n        CpuCopy32(in, gSTWIStatus->txPacket->rfuPacket32.data, gSTWIStatus->reqLength * sizeof(u32));\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_DataTxAndChangeREQ(const void *in, u8 size)\n{\n    if (!STWI_init(ID_DATA_TX_AND_CHANGE_REQ))\n    {\n        u8 reqLength = (size / sizeof(u32));\n        if (size & (sizeof(u32) - 1))\n            reqLength += 1;\n        gSTWIStatus->reqLength = reqLength;\n        CpuCopy32(in, gSTWIStatus->txPacket->rfuPacket32.data, gSTWIStatus->reqLength * sizeof(u32));\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_DataRxREQ(void)\n{\n    if (!STWI_init(ID_DATA_RX_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_MS_ChangeREQ(void)\n{\n    if (!STWI_init(ID_MS_CHANGE_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_DataReadyAndChangeREQ(u8 unk)\n{\n    if (!STWI_init(ID_DATA_READY_AND_CHANGE_REQ))\n    {\n        if (!unk)\n        {\n            gSTWIStatus->reqLength = 0;\n        }\n        else\n        {\n            u8 *packetBytes;\n\n            gSTWIStatus->reqLength = 1;\n            packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;\n            packetBytes += sizeof(u32);\n            *packetBytes++ = unk;\n            *packetBytes++ = 0;\n            *packetBytes++ = 0;\n            *packetBytes = 0;\n        }\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1)\n{\n    if (!STWI_init(ID_DISCONNECTED_AND_CHANGE_REQ))\n    {\n        u8 *packetBytes;\n\n        gSTWIStatus->reqLength = 1;\n        packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;\n        packetBytes += sizeof(u32);\n        *packetBytes++ = unk0;\n        *packetBytes++ = unk1;\n        *packetBytes++ = 0;\n        *packetBytes = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_ResumeRetransmitAndChangeREQ(void)\n{\n    if (!STWI_init(ID_RESUME_RETRANSMIT_AND_CHANGE_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_DisconnectREQ(u8 unk)\n{\n    if (!STWI_init(ID_DISCONNECT_REQ))\n    {\n        gSTWIStatus->reqLength = 1;\n        gSTWIStatus->txPacket->rfuPacket32.data[0] = unk;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_TestModeREQ(u8 unk0, u8 unk1)\n{\n    if (!STWI_init(ID_TEST_MODE_REQ))\n    {\n        gSTWIStatus->reqLength = 1;\n        gSTWIStatus->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8);\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2)\n{\n    u32 *packetData;\n    u32 arg1;\n\n    if (!STWI_init(ID_CPR_START_REQ))\n    {\n        gSTWIStatus->reqLength = 2;\n        arg1 = unk1 | (unk0 << 16);\n        packetData = gSTWIStatus->txPacket->rfuPacket32.data;\n        packetData[0] = arg1;\n        packetData[1] = unk2;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_CPR_PollingREQ(void)\n{\n    if (!STWI_init(ID_CPR_POLL_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_CPR_EndREQ(void)\n{\n    if (!STWI_init(ID_CPR_END_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nvoid STWI_send_StopModeREQ(void)\n{\n    if (!STWI_init(ID_STOP_MODE_REQ))\n    {\n        gSTWIStatus->reqLength = 0;\n        STWI_start_Command();\n    }\n}\n\nstatic void STWI_intr_timer(void)\n{\n    switch (gSTWIStatus->timerState)\n    {\n    // TODO: Make an enum for these\n    case 2:\n        gSTWIStatus->timerActive = 1;\n        STWI_set_timer(50);\n        break;\n    case 1:\n    case 4:\n        STWI_stop_timer();\n        STWI_restart_Command();\n        break;\n    case 3:\n        gSTWIStatus->timerActive = 1;\n        STWI_stop_timer();\n        STWI_reset_ClockCounter();\n        if (gSTWIStatus->callbackM != NULL)\n            gSTWIStatus->callbackM(ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ, 0);\n        break;\n    }\n}\n\nstatic void STWI_set_timer(u8 count)\n{\n    vu16 *timerL = &REG_TMCNT_L(gSTWIStatus->timerSelect);\n    vu16 *timerH = &REG_TMCNT_H(gSTWIStatus->timerSelect);\n    REG_IME = 0;\n    switch (count)\n    {\n    case 50:\n        *timerL = 0xFCCB;\n        gSTWIStatus->timerState = 1;\n        break;\n    case 80:\n        *timerL = 0xFAE0;\n        gSTWIStatus->timerState = 2;\n        break;\n    case 100:\n        *timerL = 0xF996;\n        gSTWIStatus->timerState = 3;\n        break;\n    case 130:\n        *timerL = 0xF7AD;\n        gSTWIStatus->timerState = 4;\n        break;\n    }\n    *timerH = TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_1024CLK;\n    REG_IF = INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect;\n    REG_IME = 1;\n}\n\nstatic void STWI_stop_timer(void)\n{\n    gSTWIStatus->timerState = 0;\n    REG_TMCNT_L(gSTWIStatus->timerSelect) = 0;\n    REG_TMCNT_H(gSTWIStatus->timerSelect) = 0;\n}\n\n/*\n * Set up STWI to send REQ. Returns 1 if error (see below).\n */\nstatic u16 STWI_init(u8 request)\n{\n    if (!REG_IME)\n    {\n        // Can't start sending if IME is disabled.\n        gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE;\n        if (gSTWIStatus->callbackM != NULL)\n            gSTWIStatus->callbackM(request, gSTWIStatus->error);\n        return TRUE;\n    }\n    else if (gSTWIStatus->sending == 1)\n    {\n        // Already sending something. Cancel and error.\n        gSTWIStatus->error = ERR_REQ_CMD_SENDING;\n        gSTWIStatus->sending = 0;\n        if (gSTWIStatus->callbackM != NULL)\n            gSTWIStatus->callbackM(request, gSTWIStatus->error);\n        return TRUE;\n    }\n    else if (gSTWIStatus->msMode == AGB_CLK_SLAVE)\n    {\n        // Can't send if clock slave\n        gSTWIStatus->error = ERR_REQ_CMD_CLOCK_SLAVE;\n        if (gSTWIStatus->callbackM != NULL)\n            gSTWIStatus->callbackM(request, gSTWIStatus->error, gSTWIStatus);\n        return TRUE;\n    }\n    else\n    {\n        // Good to go, start sending\n        gSTWIStatus->sending = 1;\n        gSTWIStatus->reqActiveCommand = request;\n        gSTWIStatus->state = 0; // master send req\n        gSTWIStatus->reqLength = 0;\n        gSTWIStatus->reqNext = 0;\n        gSTWIStatus->ackLength = 0;\n        gSTWIStatus->ackNext = 0;\n        gSTWIStatus->ackActiveCommand = 0;\n        gSTWIStatus->timerState = 0;\n        gSTWIStatus->timerActive = 0;\n        gSTWIStatus->error = 0;\n        gSTWIStatus->recoveryCount = 0;\n        REG_RCNT = 0x100;\n        REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;\n        return FALSE;\n    }\n}\n\nstatic s32 STWI_start_Command(void)\n{\n    u16 imeTemp;\n\n    // equivalent to gSTWIStatus->txPacket->rfuPacket32.command, \n    // but the cast here is required to avoid register issue\n    *(u32 *)gSTWIStatus->txPacket->rfuPacket8.data = 0x99660000 | (gSTWIStatus->reqLength << 8) | gSTWIStatus->reqActiveCommand;\n    REG_SIODATA32 = gSTWIStatus->txPacket->rfuPacket32.command;\n    gSTWIStatus->state = 0; // master send req\n    gSTWIStatus->reqNext = 1;\n    imeTemp = REG_IME;\n    REG_IME = 0;\n    REG_IE |= (INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect);\n    REG_IE |= INTR_FLAG_SERIAL;\n    REG_IME = imeTemp;\n    REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_MULTI_BUSY | SIO_115200_BPS;\n    return 0;\n}\n\nstatic s32 STWI_restart_Command(void)\n{\n    if (gSTWIStatus->recoveryCount < 2)\n    {\n        ++gSTWIStatus->recoveryCount;\n        STWI_start_Command();\n    }\n    else\n    {\n        if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_UNK35_REQ || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)\n        {\n            gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT;\n            gSTWIStatus->sending = 0;\n            if (gSTWIStatus->callbackM != NULL)\n                gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error);\n        }\n        else\n        {\n            gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT;\n            gSTWIStatus->sending = 0;\n            if (gSTWIStatus->callbackM != NULL)\n                gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error);\n            gSTWIStatus->state = 4; // error\n        }\n    }\n    return 0;\n}\n\nstatic s32 STWI_reset_ClockCounter(void)\n{\n    gSTWIStatus->state = 5; // slave receive req init\n    gSTWIStatus->reqLength = 0;\n    gSTWIStatus->reqNext = 0;\n    REG_SIODATA32 = (1 << 31);\n    REG_SIOCNT = 0;\n    REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;\n    REG_SIOCNT = (SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS) + 0x7F;\n    return 0;\n}\n"
  },
  {
    "path": "src/link.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"m4a.h\"\n#include \"scanline_effect.h\"\n#include \"bg_regs.h\"\n#include \"decompress.h\"\n#include \"save.h\"\n#include \"battle.h\"\n#include \"quest_log.h\"\n#include \"link_rfu.h\"\n#include \"librfu.h\"\n#include \"random.h\"\n#include \"task.h\"\n#include \"event_data.h\"\n#include \"item_menu.h\"\n#include \"trade.h\"\n#include \"menu.h\"\n#include \"overworld.h\"\n#include \"new_menu_helpers.h\"\n#include \"link.h\"\n#include \"graphics.h\"\n#include \"strings.h\"\n#include \"help_system.h\"\n#include \"reset_save_heap.h\"\n#include \"constants/battle.h\"\n#include \"constants/songs.h\"\n\nextern u16 gHeldKeyCodeToSend;\n\nstruct BlockTransfer\n{\n    u16 pos;\n    u16 size;\n    const u8 *src;\n    bool8 active;\n    u8 multiplayerId;\n};\n\nstruct LinkTestBGInfo\n{\n    u32 screenBaseBlock;\n    u32 paletteNum;\n    u32 baseChar;\n    u32 unused;\n};\n\n#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT)\n\nstatic struct BlockTransfer sBlockSend;\nALIGNED(8) static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS];\nstatic u32 sBlockSendDelayCounter;\nstatic u32 sDummy1; // Never read\nstatic u8 sDummy2; // Never assigned, read in unused function\nstatic u32 sPlayerDataExchangeStatus;\nstatic u32 sDummy3; // Never read\nstatic u8 sLinkTestLastBlockSendPos;\nALIGNED(8) static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS];\nstatic u8 sNumVBlanksWithoutSerialIntr;\nstatic bool8 sSendBufferEmpty;\nstatic u16 sSendNonzeroCheck;\nstatic u16 sRecvNonzeroCheck;\nstatic u8 sChecksumAvailable;\nstatic u8 sHandshakePlayerCount;\n\nu16 gLinkPartnersHeldKeys[6];\nu32 gLinkDebugSeed;\nstruct LinkPlayerBlock gLocalLinkPlayerBlock;\nbool8 gLinkErrorOccurred;\nu32 gLinkDebugFlags;\nu32 gLinkFiller1;\nbool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS];\nu8 gBlockReceivedStatus[MAX_LINK_PLAYERS];\nu32 gLinkFiller2;\nu16 gLinkHeldKeys;\nu16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH];\nu32 gLinkStatus;\nbool8 gLinkDummy1; // Never read\nbool8 gLinkDummy2; // Never read\nbool8 gReadyToExitStandby[MAX_LINK_PLAYERS];\nbool8 gReadyToCloseLink[MAX_LINK_PLAYERS];\nu16 gReadyCloseLinkType;\nu8 gSuppressLinkErrorMessage;\nu8 gWirelessCommType;\nu8 gSavedLinkPlayerCount;\nu16 gSendCmd[CMD_LENGTH];\nu8 gSavedMultiplayerId;\nbool8 gReceivedRemoteLinkPlayers;\nstruct LinkTestBGInfo gLinkTestBGInfo;\nvoid (*gLinkCallback)(void);\nu8 gShouldAdvanceLinkState;\nu16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS];\nu8 gBlockRequestType;\nu32 gLinkFiller3; // file\nu32 gLinkFiller4; // boundary\nu32 gLinkFiller5; // here?\nu8 gLastSendQueueCount;\nstruct Link gLink;\nu8 gLastRecvQueueCount;\nu16 gLinkSavedIme;\n\nstatic EWRAM_DATA bool8 sLinkTestDebugValuesEnabled = FALSE;\nstatic EWRAM_DATA bool8 sDummyFlag = FALSE;\nEWRAM_DATA u32 gBerryBlenderKeySendAttempts = 0;\nEWRAM_DATA u16 gBlockRecvBuffer[MAX_RFU_PLAYERS][BLOCK_BUFFER_SIZE / 2] = {};\nEWRAM_DATA u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE] = {};\nstatic EWRAM_DATA bool8 sLinkOpen = FALSE;\nEWRAM_DATA u16 gLinkType = 0;\nstatic EWRAM_DATA u16 sTimeOutCounter = 0;\nEWRAM_DATA struct LinkPlayer gLocalLinkPlayer = {};\nEWRAM_DATA struct LinkPlayer gLinkPlayers[MAX_RFU_PLAYERS] = {};\nEWRAM_DATA struct LinkPlayer gSavedLinkPlayers[MAX_RFU_PLAYERS] = {};\nEWRAM_DATA struct {\n    u32 status;\n    u8 lastRecvQueueCount;\n    u8 lastSendQueueCount;\n    bool8 disconnected;\n} sLinkErrorBuffer = {};\nstatic EWRAM_DATA u16 sReadyCloseLinkAttempts = 0; // never read\nstatic EWRAM_DATA void *sLinkErrorBgTilemapBuffer = NULL;\n\nstatic void InitLocalLinkPlayer(void);\nstatic void VBlankCB_LinkError(void);\nstatic void CB2_LinkTest(void);\nstatic void ProcessRecvCmds(u8 id);\nstatic void LinkCB_SendHeldKeys(void);\nstatic void ResetBlockSend(void);\nstatic bool32 InitBlockSend(const void *src, size_t size);\nstatic void LinkCB_BlockSendBegin(void);\nstatic void LinkCB_BlockSend(void);\nstatic void LinkCB_BlockSendEnd(void);\nstatic void SetBerryBlenderLinkCallback(void);\nstatic void SetBlockReceivedFlag(u8 id);\nstatic u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size);\nstatic void LinkTest_PrintHex(u32 pos, u8 a0, u8 a1, u8 a2);\nstatic void LinkCB_RequestPlayerDataExchange(void);\nstatic void Task_PrintTestData(u8 taskId);\nstatic void LinkCB_ReadyCloseLink(void);\nstatic void LinkCB_WaitCloseLink(void);\nstatic void LinkCB_Standby(void);\nstatic void LinkCB_StandbyForAll(void);\nstatic void CheckErrorStatus(void);\nstatic void CB2_PrintErrorMessage(void);\nstatic void SetWirelessCommType0_Internal(void);\nstatic void DisableSerial(void);\nstatic void EnableSerial(void);\nstatic bool8 IsSioMultiMaster(void);\nstatic void CheckMasterOrSlave(void);\nstatic void InitTimer(void);\nstatic void EnqueueSendCmd(u16 *sendCmd);\nstatic void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]);\nstatic void StartTransfer(void);\nstatic bool8 DoHandshake(void);\nstatic void DoRecv(void);\nstatic void DoSend(void);\nstatic void StopTimer(void);\nstatic void SendRecvDone(void);\n\nstatic const u16 sWirelessLinkDisplayPal[] = INCBIN_U16(\"graphics/link/wireless_display.gbapal\");\nstatic const u16 sWirelessLinkDisplayGfx[] = INCBIN_U16(\"graphics/link/wireless_display.4bpp.lz\");\nstatic const u16 sWirelessLinkDisplayTilemap[] = INCBIN_U16(\"graphics/link/wireless_display.bin.lz\");\nstatic const u16 sLinkTestFontPal[] = INCBIN_U16(\"graphics/link/test_font.gbapal\");\nstatic const u16 sLinkTestFontGfx[] = INCBIN_U16(\"graphics/link/test_font.4bpp\");\n\nstatic const struct BlockRequest sBlockRequests[] = {\n    [BLOCK_REQ_SIZE_NONE] = { gBlockSendBuffer, 200 },\n    [BLOCK_REQ_SIZE_200]  = { gBlockSendBuffer, 200 },\n    [BLOCK_REQ_SIZE_100]  = { gBlockSendBuffer, 100 },\n    [BLOCK_REQ_SIZE_220]  = { gBlockSendBuffer, 220 },\n    [BLOCK_REQ_SIZE_40]   = { gBlockSendBuffer,  40 }\n};\nstatic const char sASCIIGameFreakInc[] = \"GameFreak inc.\";\nstatic const char sASCIITestPrint[] = \"TEST PRINT\\nP0\\nP1\\nP2\\nP3\";\n\nstatic const struct BgTemplate sLinkErrorBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 31,\n        .priority = 0\n    }, {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 8,\n        .priority = 1\n    }\n};\n\nstatic const struct WindowTemplate sLinkErrorWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 30,\n        .height = 5,\n        .paletteNum = 15,\n        .baseBlock = 0x002\n    }, {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 6,\n        .width = 30,\n        .height = 7,\n        .paletteNum = 15,\n        .baseBlock = 0x098\n    }, {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 13,\n        .width = 30,\n        .height = 7,\n        .paletteNum = 15,\n        .baseBlock = 0x16A\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const u8 sLinkErrorTextColor[] = { 0x00, 0x01, 0x02 };\n\nbool32 IsWirelessAdapterConnected(void)\n{\n    if (QL_IS_PLAYBACK_STATE)\n        return FALSE;\n\n    SetWirelessCommType1();\n    InitRFUAPI();\n    RfuSetIgnoreError(TRUE);\n    if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID)\n    {\n        rfu_REQ_stopMode();\n        rfu_waitREQComplete();\n        return TRUE;\n    }\n    SetWirelessCommType0_Internal();\n    CloseLink();\n    RestoreSerialTimer3IntrHandlers();\n    return FALSE;\n}\n\nvoid Task_DestroySelf(u8 taskId)\n{\n    DestroyTask(taskId);\n}\n\nvoid InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock, u16 baseChar)\n{\n    LoadPalette(sLinkTestFontPal, BG_PLTT_ID(paletteNum), PLTT_SIZE_4BPP);\n    DmaCopy16(3, sLinkTestFontGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock) + (16 * baseChar), sizeof sLinkTestFontGfx);\n    gLinkTestBGInfo.screenBaseBlock = screenBaseBlock;\n    gLinkTestBGInfo.paletteNum = paletteNum;\n    gLinkTestBGInfo.baseChar = baseChar;\n    switch (bgNum)\n    {\n    case 1:\n        SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock));\n        break;\n    case 2:\n        SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock));\n        break;\n    case 3:\n        SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock));\n        break;\n    }\n    SetGpuReg(REG_OFFSET_BG0HOFS + bgNum * 4, 0);\n    SetGpuReg(REG_OFFSET_BG0VOFS + bgNum * 4, 0);\n}\n\n// Unused\nstatic void LoadLinkTestBgGfx(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock)\n{\n    LoadPalette(sLinkTestFontPal, BG_PLTT_ID(paletteNum), PLTT_SIZE_4BPP);\n    DmaCopy16(3, sLinkTestFontGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock), sizeof sLinkTestFontGfx);\n    gLinkTestBGInfo.screenBaseBlock = screenBaseBlock;\n    gLinkTestBGInfo.paletteNum = paletteNum;\n    gLinkTestBGInfo.baseChar = 0;\n    SetGpuReg(gBGControlRegOffsets[bgNum], BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock));\n}\n\n// Unused\nstatic void LinkTestScreen(void)\n{\n    int i;\n\n    ResetSpriteData();\n    FreeAllSpritePalettes();\n    ResetTasks();\n    SetVBlankCallback(VBlankCB_LinkError);\n    ResetBlockSend();\n    gLinkType = LINKTYPE_TRADE;\n    OpenLink();\n    SeedRng(gMain.vblankCounter2);\n    for (i = 0; i < TRAINER_ID_LENGTH; i++)\n        gSaveBlock2Ptr->playerTrainerId[i] = Random() % 256;\n\n    InitLinkTestBG(0, 2, 4, 0, 0);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON);\n    CreateTask(Task_DestroySelf, 0);\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n    sDummy3 = FALSE;\n    InitLocalLinkPlayer();\n    CreateTask(Task_PrintTestData, 0);\n    SetMainCallback2(CB2_LinkTest);\n}\n\nvoid SetLocalLinkPlayerId(u8 playerId)\n{\n    gLocalLinkPlayer.id = playerId;\n}\n\nstatic void InitLocalLinkPlayer(void)\n{\n    gLocalLinkPlayer.trainerId = gSaveBlock2Ptr->playerTrainerId[0] | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[3] << 24);\n    StringCopy(gLocalLinkPlayer.name, gSaveBlock2Ptr->playerName);\n    gLocalLinkPlayer.gender = gSaveBlock2Ptr->playerGender;\n    gLocalLinkPlayer.linkType = gLinkType;\n    gLocalLinkPlayer.language = gGameLanguage;\n    gLocalLinkPlayer.version = gGameVersion + 0x4000;\n    gLocalLinkPlayer.lp_field_2 = 0x8000;\n    gLocalLinkPlayer.progressFlags = TRUE; //IsNationalPokedexEnabled();\n    gLocalLinkPlayer.progressFlags |= 0x10;\n    gLocalLinkPlayer.neverRead = gSaveBlock1Ptr->masterTrainerTitle; // should only ever be read by FRLG++\n}\n\nstatic void VBlankCB_LinkError(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid InitLink(void)\n{\n    int i;\n\n    for (i = 0; i < CMD_LENGTH; i++)\n        gSendCmd[i] = LINKCMD_NONE;\n\n    sLinkOpen = TRUE;\n    EnableSerial();\n}\n\nvoid Task_TriggerHandshake(u8 taskId)\n{\n    if (++gTasks[taskId].data[0] == 5)\n    {\n        gShouldAdvanceLinkState = 1;\n        DestroyTask(taskId);\n    }\n}\n\nvoid OpenLink(void)\n{\n    int i;\n\n    if (!gWirelessCommType)\n    {\n        ResetSerial();\n        InitLink();\n        gLinkCallback = LinkCB_RequestPlayerDataExchange;\n        gLinkVSyncDisabled = FALSE;\n        gLinkErrorOccurred = FALSE;\n        gSuppressLinkErrorMessage = FALSE;\n        ResetBlockReceivedFlags();\n        ResetBlockSend();\n        sDummy1 = FALSE;\n        gLinkDummy2 = FALSE;\n        gLinkDummy1 = FALSE;\n        gReadyCloseLinkType = 0;\n        CreateTask(Task_TriggerHandshake, 2);\n    }\n    else\n    {\n        InitRFUAPI();\n    }\n    gReceivedRemoteLinkPlayers = FALSE;\n    for (i = 0; i < MAX_LINK_PLAYERS; i++)\n    {\n        gRemoteLinkPlayersNotReceived[i] = TRUE;\n        gReadyToCloseLink[i] = FALSE;\n        gReadyToExitStandby[i] = FALSE;\n    }\n}\n\nvoid CloseLink(void)\n{\n    gReceivedRemoteLinkPlayers = FALSE;\n    if (gWirelessCommType)\n        LinkRfu_Shutdown();\n    sLinkOpen = FALSE;\n    DisableSerial();\n}\n\nstatic void TestBlockTransfer(u8 unused0, u8 unused1, u8 unused2)\n{\n    u8 i;\n    u8 status;\n\n    if (sLinkTestLastBlockSendPos != sBlockSend.pos)\n    {\n        LinkTest_PrintHex(sBlockSend.pos, 2, 3, 2);\n        sLinkTestLastBlockSendPos = sBlockSend.pos;\n    }\n    for (i = 0; i < MAX_LINK_PLAYERS; i++)\n    {\n        if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos)\n        {\n            LinkTest_PrintHex(sBlockRecv[i].pos, 2, i + 4, 2);\n            sLinkTestLastBlockRecvPos[i] = sBlockRecv[i].pos;\n        }\n    }\n    status = GetBlockReceivedStatus();\n    if (status == 0xF) // 0b1111\n    {\n        for (i = 0; i < MAX_LINK_PLAYERS; i++)\n        {\n            if ((status >> i) & 1)\n            {\n                gLinkTestBlockChecksums[i] = LinkTestCalcBlockChecksum(gBlockRecvBuffer[i], sBlockRecv[i].size);\n                ResetBlockReceivedFlag(i);\n                if (gLinkTestBlockChecksums[i] != 0x0342)\n                {\n                    sLinkTestDebugValuesEnabled = FALSE;\n                    sDummyFlag = FALSE;\n                }\n            }\n        }\n    }\n}\n\nstatic void LinkTestProcessKeyInput(void)\n{\n    if (JOY_NEW(A_BUTTON))\n        gShouldAdvanceLinkState = 1;\n\n    if (JOY_HELD(B_BUTTON))\n        InitBlockSend(gHeap + 0x4000, 0x2004);\n\n    if (JOY_NEW(L_BUTTON))\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB(2, 0, 0));\n\n    if (JOY_NEW(START_BUTTON))\n        SetSuppressLinkErrorMessage(TRUE);\n\n    if (JOY_NEW(R_BUTTON))\n        TrySavingData(SAVE_LINK);\n\n    if (JOY_NEW(SELECT_BUTTON))\n        SetCloseLinkCallback();\n\n    if (sLinkTestDebugValuesEnabled)\n        SetLinkDebugValues(gMain.vblankCounter2, gLinkCallback ? gLinkVSyncDisabled : gLinkVSyncDisabled | 0x10);\n}\n\nstatic void CB2_LinkTest(void)\n{\n    LinkTestProcessKeyInput();\n    TestBlockTransfer(1, 1, 0);\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nu16 LinkMain2(const u16 *heldKeys)\n{\n    u8 i;\n\n    if (!sLinkOpen)\n        return 0;\n\n    for (i = 0; i < CMD_LENGTH; i++)\n        gSendCmd[i] = 0;\n\n    gLinkHeldKeys = *heldKeys;\n    if (gLinkStatus & LINK_STAT_CONN_ESTABLISHED)\n    {\n        ProcessRecvCmds(SIO_MULTI_CNT->id);\n        if (gLinkCallback != NULL)\n            gLinkCallback();\n        CheckErrorStatus();\n    }\n    return gLinkStatus;\n}\n\nstatic void HandleReceiveRemoteLinkPlayer(u8 who)\n{\n    int i;\n    int count;\n\n    count = 0;\n    gRemoteLinkPlayersNotReceived[who] = FALSE;\n    for (i = 0; i < GetLinkPlayerCount_2(); i++)\n        count += gRemoteLinkPlayersNotReceived[i];\n\n    if (count == 0 && !gReceivedRemoteLinkPlayers)\n        gReceivedRemoteLinkPlayers = TRUE;\n}\n\nstatic void ProcessRecvCmds(u8 unused)\n{\n    u16 i;\n\n    for (i = 0; i < MAX_LINK_PLAYERS; i++)\n    {\n        gLinkPartnersHeldKeys[i] = 0;\n        if (gRecvCmds[i][0] == 0)\n            continue;\n\n        switch (gRecvCmds[i][0])\n        {\n        case LINKCMD_SEND_LINK_TYPE:\n        {\n            struct LinkPlayerBlock * block;\n\n            InitLocalLinkPlayer();\n            block = &gLocalLinkPlayerBlock;\n            block->linkPlayer = gLocalLinkPlayer;\n            memcpy(block->magic1, sASCIIGameFreakInc, sizeof(block->magic1) - 1);\n            memcpy(block->magic2, sASCIIGameFreakInc, sizeof(block->magic2) - 1);\n            InitBlockSend(block, sizeof(*block));\n            break;\n        }\n        case LINKCMD_BLENDER_SEND_KEYS:\n            gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];\n            break;\n        case LINKCMD_DUMMY_1:\n            gLinkDummy2 = TRUE;\n            break;\n        case LINKCMD_DUMMY_2:\n            gLinkDummy2 = TRUE;\n            break;\n        case LINKCMD_INIT_BLOCK:\n        {\n            struct BlockTransfer * blockRecv;\n\n            blockRecv = &sBlockRecv[i];\n            blockRecv->pos = 0;\n            blockRecv->size = gRecvCmds[i][1];\n            blockRecv->multiplayerId = gRecvCmds[i][2];\n            break;\n        }\n        case LINKCMD_CONT_BLOCK:\n        {\n            if (sBlockRecv[i].size > BLOCK_BUFFER_SIZE)\n            {\n                u16 *buffer;\n                u16 j;\n\n                buffer = (u16 *)gDecompressionBuffer;\n                for (j = 0; j < CMD_LENGTH - 1; j++)\n                    buffer[(sBlockRecv[i].pos / 2) + j] = gRecvCmds[i][j + 1];\n            }\n            else\n            {\n                u16 j;\n\n                for (j = 0; j < CMD_LENGTH - 1; j++)\n                    gBlockRecvBuffer[i][(sBlockRecv[i].pos / 2) + j] = gRecvCmds[i][j + 1];\n            }\n\n            sBlockRecv[i].pos += (CMD_LENGTH - 1) * 2;\n\n            if (sBlockRecv[i].pos >= sBlockRecv[i].size)\n            {\n                if (gRemoteLinkPlayersNotReceived[i] == TRUE)\n                {\n                    struct LinkPlayerBlock * block;\n                    struct LinkPlayer * linkPlayer;\n\n                    block = (struct LinkPlayerBlock *)&gBlockRecvBuffer[i];\n                    linkPlayer = &gLinkPlayers[i];\n                    *linkPlayer = block->linkPlayer;\n                    if ((linkPlayer->version & 0xFF) == VERSION_RUBY || (linkPlayer->version & 0xFF) == VERSION_SAPPHIRE)\n                    {\n                        linkPlayer->progressFlagsCopy = 0;\n                        linkPlayer->neverRead = 0;\n                        linkPlayer->progressFlags = 0;\n                    }\n                    ConvertLinkPlayerName(linkPlayer);\n                    if (strcmp(block->magic1, sASCIIGameFreakInc) != 0\n                     || strcmp(block->magic2, sASCIIGameFreakInc) != 0)\n                        SetMainCallback2(CB2_LinkError);\n                    else\n                        HandleReceiveRemoteLinkPlayer(i);\n                }\n                else\n                {\n                    SetBlockReceivedFlag(i);\n                }\n            }\n        }\n            break;\n        case LINKCMD_READY_CLOSE_LINK:\n            gReadyToCloseLink[i] = TRUE;\n            break;\n        case LINKCMD_READY_EXIT_STANDBY:\n            gReadyToExitStandby[i] = TRUE;\n            break;\n        case LINKCMD_BLENDER_NO_PBLOCK_SPACE:\n            SetBerryBlenderLinkCallback();\n            break;\n        case LINKCMD_SEND_BLOCK_REQ:\n            SendBlock(0, sBlockRequests[gRecvCmds[i][1]].address, sBlockRequests[gRecvCmds[i][1]].size);\n            break;\n        case LINKCMD_SEND_HELD_KEYS:\n            gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];\n            break;\n        }\n    }\n}\n\nvoid BuildSendCmd(u16 command)\n{\n    switch (command)\n    {\n    case LINKCMD_SEND_LINK_TYPE:\n        gSendCmd[0] = LINKCMD_SEND_LINK_TYPE;\n        gSendCmd[1] = gLinkType;\n        break;\n    case LINKCMD_READY_EXIT_STANDBY:\n        gSendCmd[0] = LINKCMD_READY_EXIT_STANDBY;\n        break;\n    case LINKCMD_BLENDER_SEND_KEYS:\n        gSendCmd[0] = LINKCMD_BLENDER_SEND_KEYS;\n        gSendCmd[1] = gMain.heldKeys;\n        break;\n    case LINKCMD_DUMMY_1:\n        gSendCmd[0] = LINKCMD_DUMMY_1;\n        break;\n    case LINKCMD_SEND_EMPTY:\n        gSendCmd[0] = LINKCMD_SEND_EMPTY;\n        gSendCmd[1] = 0;\n        break;\n    case LINKCMD_SEND_0xEE:\n    {\n        u8 i;\n\n        gSendCmd[0] = LINKCMD_SEND_0xEE;\n        for (i = 0; i < 5; i++)\n            gSendCmd[i + 1] = 0xEE;\n        break;\n    }\n    case LINKCMD_INIT_BLOCK:\n        gSendCmd[0] = LINKCMD_INIT_BLOCK;\n        gSendCmd[1] = sBlockSend.size;\n        gSendCmd[2] = sBlockSend.multiplayerId + 0x80;\n        break;\n    case LINKCMD_BLENDER_NO_PBLOCK_SPACE:\n        gSendCmd[0] = LINKCMD_BLENDER_NO_PBLOCK_SPACE;\n        break;\n    case LINKCMD_SEND_ITEM:\n        gSendCmd[0] = LINKCMD_SEND_ITEM;\n        gSendCmd[1] = gSpecialVar_ItemId;\n        break;\n    case LINKCMD_SEND_BLOCK_REQ:\n        gSendCmd[0] = LINKCMD_SEND_BLOCK_REQ;\n        gSendCmd[1] = gBlockRequestType;\n        break;\n    case LINKCMD_READY_CLOSE_LINK:\n        gSendCmd[0] = LINKCMD_READY_CLOSE_LINK;\n        gSendCmd[1] = gReadyCloseLinkType;\n        break;\n    case LINKCMD_DUMMY_2:\n        gSendCmd[0] = LINKCMD_DUMMY_2;\n        break;\n    case LINKCMD_SEND_HELD_KEYS:\n        if (gHeldKeyCodeToSend == 0 || gLinkTransferringData)\n        {\n            break;\n        }\n        gSendCmd[0] = LINKCMD_SEND_HELD_KEYS;\n        gSendCmd[1] = gHeldKeyCodeToSend;\n        break;\n    }\n}\n\nvoid StartSendingKeysToLink(void)\n{\n    if (gWirelessCommType)\n        StartSendingKeysToRfu();\n\n    gLinkCallback = LinkCB_SendHeldKeys;\n}\n\nbool32 IsSendingKeysToLink(void)\n{\n    if (gWirelessCommType)\n        return IsSendingKeysToRfu();\n\n    if (gLinkCallback == LinkCB_SendHeldKeys)\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic void LinkCB_SendHeldKeys(void)\n{\n    if (gReceivedRemoteLinkPlayers == TRUE)\n        BuildSendCmd(LINKCMD_SEND_HELD_KEYS);\n}\n\nvoid ClearLinkCallback(void)\n{\n    gLinkCallback = NULL;\n}\n\nvoid ClearLinkCallback_2(void)\n{\n    if (gWirelessCommType)\n        ClearLinkRfuCallback();\n    else\n        gLinkCallback = NULL;\n}\n\nu8 GetLinkPlayerCount(void)\n{\n    if (gWirelessCommType)\n        return Rfu_GetLinkPlayerCount();\n\n    return EXTRACT_PLAYER_COUNT(gLinkStatus);\n}\n\nvoid OpenLinkTimed(void)\n{\n    sPlayerDataExchangeStatus = EXCHANGE_NOT_STARTED;\n    sTimeOutCounter = 0;\n    OpenLink();\n}\n\nu8 GetLinkPlayerDataExchangeStatusTimed(int minPlayers, int maxPlayers)\n{\n    int i;\n    int count;\n    u32 index;\n    u8 numPlayers;\n    u32 linkType1;\n    u32 linkType2;\n\n    count = 0;\n    if (gReceivedRemoteLinkPlayers == TRUE)\n    {\n        numPlayers = GetLinkPlayerCount_2();\n        if (minPlayers > numPlayers || numPlayers > maxPlayers)\n        {\n            sPlayerDataExchangeStatus = EXCHANGE_WRONG_NUM_PLAYERS;\n            return sPlayerDataExchangeStatus;\n        }\n        else\n        {\n            if (GetLinkPlayerCount() == 0)\n            {\n                gLinkErrorOccurred = TRUE;\n                CloseLink();\n            }\n            for (i = 0, index = 0; i < GetLinkPlayerCount(); index++, i++)\n            {\n                if (gLinkPlayers[index].linkType == gLinkPlayers[0].linkType)\n                    count++;\n            }\n            if (count == GetLinkPlayerCount())\n            {\n                if (gLinkPlayers[0].linkType == LINKTYPE_TRADE_SETUP)\n                {\n                    switch (GetGameProgressForLinkTrade())\n                    {\n                    case TRADE_BOTH_PLAYERS_READY:\n                        sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;\n                        break;\n                    case TRADE_PLAYER_NOT_READY:\n                        sPlayerDataExchangeStatus = EXCHANGE_PLAYER_NOT_READY;\n                        break;\n                    case TRADE_PARTNER_NOT_READY:\n                        sPlayerDataExchangeStatus = EXCHANGE_PARTNER_NOT_READY;\n                        break;\n                    }\n                }\n                else\n                {\n                    sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;\n                }\n            }\n            else\n            {\n                sPlayerDataExchangeStatus = EXCHANGE_DIFF_SELECTIONS;\n            }\n        }\n    }\n    else if (++sTimeOutCounter > 600)\n    {\n        sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT;\n    }\n    return sPlayerDataExchangeStatus;\n}\n\nbool8 IsLinkPlayerDataExchangeComplete(void)\n{\n    u8 i;\n    u8 count;\n    bool8 retval;\n\n    count = 0;\n    for (i = 0; i < GetLinkPlayerCount(); i++)\n    {\n        if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType)\n            count++;\n    }\n    if (count == GetLinkPlayerCount())\n    {\n        retval = TRUE;\n        sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;\n    }\n    else\n    {\n        retval = FALSE;\n        sPlayerDataExchangeStatus = EXCHANGE_DIFF_SELECTIONS;\n    }\n    return retval;\n}\n\nu32 GetLinkPlayerTrainerId(u8 who)\n{\n    return gLinkPlayers[who].trainerId;\n}\n\nvoid ResetLinkPlayers(void)\n{\n    int i;\n\n    for (i = 0; i <= MAX_LINK_PLAYERS; i++)\n        gLinkPlayers[i] = (struct LinkPlayer){};\n}\n\nstatic void ResetBlockSend(void)\n{\n    sBlockSend.active = FALSE;\n    sBlockSend.pos = 0;\n    sBlockSend.size = 0;\n    sBlockSend.src = NULL;\n}\n\nstatic bool32 InitBlockSend(const void *src, size_t size)\n{\n    if (sBlockSend.active)\n        return FALSE;\n\n    sBlockSend.multiplayerId = GetMultiplayerId();\n    sBlockSend.active = TRUE;\n    sBlockSend.size = size;\n    sBlockSend.pos = 0;\n    if (size > BLOCK_BUFFER_SIZE)\n    {\n        sBlockSend.src = src;\n    }\n    else\n    {\n        if (src != gBlockSendBuffer)\n            memcpy(gBlockSendBuffer, src, size);\n\n        sBlockSend.src = gBlockSendBuffer;\n    }\n    BuildSendCmd(LINKCMD_INIT_BLOCK);\n    gLinkCallback = LinkCB_BlockSendBegin;\n    sBlockSendDelayCounter = 0;\n    return TRUE;\n}\n\nstatic void LinkCB_BlockSendBegin(void)\n{\n    if (++sBlockSendDelayCounter > 2)\n        gLinkCallback = LinkCB_BlockSend;\n}\n\nstatic void LinkCB_BlockSend(void)\n{\n    int i;\n    const u8 *src;\n\n    src = sBlockSend.src;\n    gSendCmd[0] = LINKCMD_CONT_BLOCK;\n    for (i = 0; i < CMD_LENGTH - 1; i++)\n        gSendCmd[i + 1] = (src[sBlockSend.pos + i * 2 + 1] << 8) | src[sBlockSend.pos + i * 2];\n\n    sBlockSend.pos += 14;\n    if (sBlockSend.size <= sBlockSend.pos)\n    {\n        sBlockSend.active = FALSE;\n        gLinkCallback = LinkCB_BlockSendEnd;\n    }\n}\n\nstatic void LinkCB_BlockSendEnd(void)\n{\n    gLinkCallback = NULL;\n}\n\nstatic void LinkCB_BerryBlenderSendHeldKeys(void)\n{\n    GetMultiplayerId();\n    BuildSendCmd(LINKCMD_BLENDER_SEND_KEYS);\n    gBerryBlenderKeySendAttempts++;\n}\n\nstatic void SetBerryBlenderLinkCallback(void)\n{\n    gBerryBlenderKeySendAttempts = 0;\n    gLinkCallback = LinkCB_BerryBlenderSendHeldKeys;\n}\n\n// Unused\nstatic u32 GetBerryBlenderKeySendAttempts(void)\n{\n    return gBerryBlenderKeySendAttempts;\n}\n\n// Unused\nstatic void SendBerryBlenderNoSpaceForPokeblocks(void)\n{\n    BuildSendCmd(LINKCMD_BLENDER_NO_PBLOCK_SPACE);\n}\n\nu8 GetMultiplayerId(void)\n{\n    if (gWirelessCommType == 1)\n        return Rfu_GetMultiplayerId();\n\n    return SIO_MULTI_CNT->id;\n}\n\nu8 BitmaskAllOtherLinkPlayers(void)\n{\n    u8 mpId;\n\n    mpId = GetMultiplayerId();\n    return ((1 << MAX_LINK_PLAYERS) - 1) ^ (1 << mpId);\n}\n\nbool8 SendBlock(u8 unused, const void *src, u16 size)\n{\n    if (gWirelessCommType == 1)\n        return Rfu_InitBlockSend(src, size);\n\n    return InitBlockSend(src, size);\n}\n\nbool8 SendBlockRequest(u8 blockRequestType)\n{\n    if (gWirelessCommType == 1)\n        return Rfu_SendBlockRequest(blockRequestType);\n\n    if (gLinkCallback == NULL)\n    {\n        gBlockRequestType = blockRequestType;\n        BuildSendCmd(LINKCMD_SEND_BLOCK_REQ);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nbool8 IsLinkTaskFinished(void)\n{\n    if (gWirelessCommType == 1)\n        return IsLinkRfuTaskFinished();\n\n    return gLinkCallback == NULL;\n}\n\nu8 GetBlockReceivedStatus(void)\n{\n    if (gWirelessCommType == 1)\n        return Rfu_GetBlockReceivedStatus();\n\n    return (gBlockReceivedStatus[3] << 3) | (gBlockReceivedStatus[2] << 2) | (gBlockReceivedStatus[1] << 1) | (gBlockReceivedStatus[0] << 0);\n}\n\nstatic void SetBlockReceivedFlag(u8 who)\n{\n    if (gWirelessCommType == 1)\n        Rfu_SetBlockReceivedFlag(who);\n    else\n        gBlockReceivedStatus[who] = TRUE;\n}\n\nvoid ResetBlockReceivedFlags(void)\n{\n    int i;\n\n    if (gWirelessCommType == 1)\n    {\n        for (i = 0; i < MAX_RFU_PLAYERS; i++)\n            Rfu_ResetBlockReceivedFlag(i);\n    }\n    else\n    {\n        for (i = 0; i < MAX_LINK_PLAYERS; i++)\n            gBlockReceivedStatus[i] = FALSE;\n    }\n}\n\nvoid ResetBlockReceivedFlag(u8 who)\n{\n    if (gWirelessCommType == 1)\n        Rfu_ResetBlockReceivedFlag(who);\n    else if (gBlockReceivedStatus[who])\n        gBlockReceivedStatus[who] = FALSE;\n}\n\nvoid CheckShouldAdvanceLinkState(void)\n{\n    if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1)\n        gShouldAdvanceLinkState = 1;\n}\n\nstatic u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size)\n{\n    u16 checksum;\n    u16 i;\n\n    checksum = 0;\n    for (i = 0; i < size / 2; i++)\n        checksum += src[i];\n\n    return checksum;\n}\n\nstatic void LinkTest_PrintNumChar(char val, u8 x, u8 y)\n{\n    u16 *vAddr;\n\n    vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock);\n    vAddr[y * 32 + x] = (gLinkTestBGInfo.paletteNum << 12) | (val + 1 + gLinkTestBGInfo.baseChar);\n}\n\nstatic void LinkTest_PrintChar(char val, u8 x, u8 y)\n{\n    u16 *vAddr;\n\n    vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock);\n    vAddr[y * 32 + x] = (gLinkTestBGInfo.paletteNum << 12) | (val + gLinkTestBGInfo.baseChar);\n}\n\nstatic void LinkTest_PrintHex(u32 num, u8 x, u8 y, u8 length)\n{\n    char buff[16];\n    int i;\n\n    for (i = 0; i < length; i++)\n    {\n        buff[i] = num & 0xf;\n        num >>= 4;\n    }\n    for (i = length - 1; i >= 0; i--)\n    {\n        LinkTest_PrintNumChar(buff[i], x, y);\n        x++;\n    }\n}\n\nstatic void LinkTest_PrintString(const char *str, u8 x, u8 y)\n{\n    int xOffset;\n    int i;\n    int yOffset;\n\n    yOffset = 0;\n    xOffset = 0;\n    for (i = 0; str[i] != 0; str++)\n    {\n        if (str[i] == *\"\\n\")\n        {\n            yOffset++;\n            xOffset = 0;\n        }\n        else\n        {\n            LinkTest_PrintChar(str[i], x + xOffset, y + yOffset);\n            xOffset++;\n        }\n    }\n}\n\nstatic void LinkCB_RequestPlayerDataExchange(void)\n{\n    if (gLinkStatus & LINK_STAT_MASTER)\n        BuildSendCmd(LINKCMD_SEND_LINK_TYPE);\n\n    gLinkCallback = NULL;\n}\n\nstatic void Task_PrintTestData(u8 taskId)\n{\n    char testTitle[32];\n    int i;\n\n    strcpy(testTitle, sASCIITestPrint);\n    LinkTest_PrintString(testTitle, 5, 2);\n    LinkTest_PrintHex(gShouldAdvanceLinkState, 2, 1, 2);\n    LinkTest_PrintHex(gLinkStatus, 15, 1, 8);\n    LinkTest_PrintHex(gLink.state, 2, 10, 2);\n    LinkTest_PrintHex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2);\n    LinkTest_PrintHex(GetMultiplayerId(), 15, 12, 2);\n    LinkTest_PrintHex(gLastSendQueueCount, 25, 1, 2);\n    LinkTest_PrintHex(gLastRecvQueueCount, 25, 2, 2);\n    LinkTest_PrintHex(GetBlockReceivedStatus(), 15, 5, 2);\n    LinkTest_PrintHex(gLinkDebugSeed, 2, 12, 8);\n    LinkTest_PrintHex(gLinkDebugFlags, 2, 13, 8);\n    LinkTest_PrintHex(GetSioMultiSI(), 25, 5, 1);\n    LinkTest_PrintHex(IsSioMultiMaster(), 25, 6, 1);\n    LinkTest_PrintHex(IsLinkConnectionEstablished(), 25, 7, 1);\n    LinkTest_PrintHex(HasLinkErrorOccurred(), 25, 8, 1);\n\n    for (i = 0; i < MAX_LINK_PLAYERS; i++)\n        LinkTest_PrintHex(gLinkTestBlockChecksums[i], 10, 4 + i, 4);\n}\n\nvoid SetLinkDebugValues(u32 seed, u32 flags)\n{\n    gLinkDebugSeed = seed;\n    gLinkDebugFlags = flags;\n}\n\nu8 GetSavedLinkPlayerCountAsBitFlags(void)\n{\n    int i;\n    u8 flags;\n\n    flags = 0;\n    for (i = 0; i < gSavedLinkPlayerCount; i++)\n        flags |= (1 << i);\n\n    return flags;\n}\n\nu8 GetLinkPlayerCountAsBitFlags(void)\n{\n    int i;\n    u8 flags;\n\n    flags = 0;\n    for (i = 0; i < GetLinkPlayerCount(); i++)\n        flags |= (1 << i);\n\n    return flags;\n}\n\nvoid SaveLinkPlayers(u8 numPlayers)\n{\n    int i;\n\n    gSavedLinkPlayerCount = numPlayers;\n    gSavedMultiplayerId = GetMultiplayerId();\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n        gSavedLinkPlayers[i] = gLinkPlayers[i];\n}\n\n// The number of players when trading began. This is frequently compared against the\n// current number of connected players to check if anyone dropped out.\nu8 GetSavedPlayerCount(void)\n{\n    return gSavedLinkPlayerCount;\n}\n\n// Unused\nstatic u8 GetSavedMultiplayerId(void)\n{\n    return gSavedMultiplayerId;\n}\n\n// Unused\nstatic bool8 DoesLinkPlayerCountMatchSaved(void)\n{\n    int i;\n    u32 count = 0;\n\n    for (i = 0; i < gSavedLinkPlayerCount; i++)\n    {\n        if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId)\n            count++;\n    }\n\n    if (count == gSavedLinkPlayerCount)\n        return TRUE;\n\n    return FALSE;\n}\n\nvoid CheckLinkPlayersMatchSaved(void)\n{\n    u8 i;\n\n    for (i = 0; i < gSavedLinkPlayerCount; i++)\n    {\n        if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId \n         || StringCompare(gSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0)\n        {\n            gLinkErrorOccurred = TRUE;\n            CloseLink();\n            SetMainCallback2(CB2_LinkError);\n        }\n    }\n}\n\nvoid ResetLinkPlayerCount(void)\n{\n    gSavedLinkPlayerCount = 0;\n    gSavedMultiplayerId = 0;\n}\n\nu8 GetLinkPlayerCount_2(void)\n{\n    return EXTRACT_PLAYER_COUNT(gLinkStatus);\n}\n\nbool8 IsLinkMaster(void)\n{\n    if (gWirelessCommType)\n        return Rfu_IsMaster();\n\n    return EXTRACT_MASTER(gLinkStatus);\n}\n\n// Unused\nstatic u8 GetDummy2(void)\n{\n    return sDummy2;\n}\n\nvoid SetCloseLinkCallbackAndType(u16 type)\n{\n    if (gWirelessCommType == 1)\n    {\n        Rfu_SetCloseLinkCallback();\n    }\n    else\n    {\n        if (gLinkCallback == NULL)\n        {\n            gLinkCallback = LinkCB_ReadyCloseLink;\n            gLinkDummy1 = FALSE;\n            gReadyCloseLinkType = type;\n        }\n    }\n}\n\nvoid SetCloseLinkCallback(void)\n{\n    if (gWirelessCommType == 1)\n    {\n        Rfu_SetCloseLinkCallback();\n    }\n    else\n    {\n        if (gLinkCallback != NULL)\n        {\n            sReadyCloseLinkAttempts++;\n        }\n        else\n        {\n            gLinkCallback = LinkCB_ReadyCloseLink;\n            gLinkDummy1 = FALSE;\n            gReadyCloseLinkType = 0;\n        }\n    }\n}\n\nstatic void LinkCB_ReadyCloseLink(void)\n{\n    if (gLastRecvQueueCount == 0)\n    {\n        BuildSendCmd(LINKCMD_READY_CLOSE_LINK);\n        gLinkCallback = LinkCB_WaitCloseLink;\n    }\n}\n\nstatic void LinkCB_WaitCloseLink(void)\n{\n    int i;\n    unsigned count;\n\n    // Wait for all players to be ready\n    u8 linkPlayerCount = GetLinkPlayerCount();\n    count = 0;\n    for (i = 0; i < linkPlayerCount; i++)\n    {\n        if (gReadyToCloseLink[i])\n            count++;\n    }\n\n    if (count == linkPlayerCount)\n    {\n        // All ready, close link\n        gBattleTypeFlags &= ~(BATTLE_TYPE_LINK_IN_BATTLE | 0xFFFF0000);\n        gLinkVSyncDisabled = TRUE;\n        CloseLink();\n        gLinkCallback = NULL;\n        gLinkDummy1 = TRUE;\n    }\n}\n\nvoid SetLinkStandbyCallback(void)\n{\n    if (gWirelessCommType == 1)\n    {\n        Rfu_SetLinkStandbyCallback();\n    }\n    else\n    {\n        if (gLinkCallback == NULL)\n            gLinkCallback = LinkCB_Standby;\n\n        gLinkDummy1 = FALSE;\n    }\n}\n\nstatic void LinkCB_Standby(void)\n{\n    if (gLastRecvQueueCount == 0)\n    {\n        BuildSendCmd(LINKCMD_READY_EXIT_STANDBY);\n        gLinkCallback = LinkCB_StandbyForAll;\n    }\n}\n\nstatic void LinkCB_StandbyForAll(void)\n{\n    u8 i;\n    u8 linkPlayerCount = GetLinkPlayerCount();\n    for (i = 0; i < linkPlayerCount; i++)\n    {\n        if (!gReadyToExitStandby[i])\n            break;\n    }\n\n    // If true, all players ready to exit standby\n    if (i == linkPlayerCount)\n    {\n        for (i = 0; i < MAX_LINK_PLAYERS; i++)\n            gReadyToExitStandby[i] = FALSE;\n\n        gLinkCallback = NULL;\n    }\n}\n\nstatic void CheckErrorStatus(void)\n{\n    // Check if a link error has occurred\n    if (sLinkOpen && EXTRACT_LINK_ERRORS(gLinkStatus))\n    {\n        // Link error has occurred, handle message details if\n        // necessary, then stop the link.\n        if (!gSuppressLinkErrorMessage)\n        {\n            sLinkErrorBuffer.status = gLinkStatus;\n            sLinkErrorBuffer.lastRecvQueueCount = gLastRecvQueueCount;\n            sLinkErrorBuffer.lastSendQueueCount = gLastSendQueueCount;\n            SetMainCallback2(CB2_LinkError);\n        }\n        gLinkErrorOccurred = TRUE;\n        CloseLink();\n    }\n}\n\nvoid SetLinkErrorFromRfu(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 isConnectionError)\n{\n    sLinkErrorBuffer.status = status;\n    sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount;\n    sLinkErrorBuffer.lastRecvQueueCount = lastRecvQueueCount;\n    sLinkErrorBuffer.disconnected = isConnectionError;\n}\n\nvoid CB2_LinkError(void)\n{\n    u8 *tilemapBuffer;\n\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    m4aMPlayStop(&gMPlayInfo_SE1);\n    m4aMPlayStop(&gMPlayInfo_SE2);\n    m4aMPlayStop(&gMPlayInfo_SE3);\n    InitHeap(gHeap, HEAP_SIZE);\n    ResetSpriteData();\n    FreeAllSpritePalettes();\n    ResetPaletteFadeControl();\n    SetBackdropFromColor(RGB_BLACK);\n    ResetTasks();\n    ScanlineEffect_Stop();\n    if (gWirelessCommType)\n    {\n        if (!sLinkErrorBuffer.disconnected)\n            gWirelessCommType = 3;\n\n        ResetLinkRfuGFLayer();\n    }\n    SetVBlankCallback(VBlankCB_LinkError);\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sLinkErrorBgTemplates, ARRAY_COUNT(sLinkErrorBgTemplates));\n    sLinkErrorBgTilemapBuffer = tilemapBuffer = malloc(BG_SCREEN_SIZE);\n    SetBgTilemapBuffer(1, tilemapBuffer);\n    if (InitWindows(sLinkErrorWindowTemplates))\n    {\n        DeactivateAllTextPrinters();\n        ResetTempTileDataBuffers();\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG1VOFS, 0);\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON);\n        LoadPalette(gStandardMenuPalette, BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n        gSoftResetDisabled = FALSE;\n        CreateTask(Task_DestroySelf, 0);\n        StopMapMusic();\n        gMain.callback1 = NULL;\n        RunTasks();\n        AnimateSprites();\n        BuildOamBuffer();\n        UpdatePaletteFade();\n        SetMainCallback2(CB2_PrintErrorMessage);\n    }\n}\n\nstatic void ErrorMsg_MoveCloserToPartner(void)\n{\n    DecompressAndLoadBgGfxUsingHeap(1, sWirelessLinkDisplayGfx, FALSE, 0, 0);\n    CopyToBgTilemapBuffer(1, sWirelessLinkDisplayTilemap, 0, 0);\n    CopyBgTilemapBufferToVram(1);\n    LoadPalette(sWirelessLinkDisplayPal, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n    FillWindowPixelBuffer(0, PIXEL_FILL(0));\n    FillWindowPixelBuffer(2, PIXEL_FILL(0));\n    AddTextPrinterParameterized3(0, FONT_NORMAL_COPY_2, 2, 5, sLinkErrorTextColor, 0, gText_CommErrorEllipsis);\n    AddTextPrinterParameterized3(2, FONT_NORMAL_COPY_2, 2, 2, sLinkErrorTextColor, 0, gText_MoveCloserToLinkPartner);\n    PutWindowTilemap(0);\n    PutWindowTilemap(2);\n    CopyWindowToVram(0, COPYWIN_NONE); // Does nothing\n    CopyWindowToVram(2, COPYWIN_FULL);\n    ShowBg(0);\n    ShowBg(1);\n}\n\nstatic void ErrorMsg_CheckConnections(void)\n{\n    FillWindowPixelBuffer(1, PIXEL_FILL(0));\n    FillWindowPixelBuffer(2, PIXEL_FILL(0));\n    AddTextPrinterParameterized3(1, FONT_NORMAL_COPY_2, 2, 0, sLinkErrorTextColor, 0, gText_CommErrorCheckConnections);\n    PutWindowTilemap(1);\n    PutWindowTilemap(2);\n    CopyWindowToVram(1, COPYWIN_NONE); // Does nothing\n    CopyWindowToVram(2, COPYWIN_FULL);\n    ShowBg(0);\n}\n\nstatic void CB2_PrintErrorMessage(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        // Below is only true for the RFU, so the other error\n        // type is inferred to be from a wired connection\n        if (sLinkErrorBuffer.disconnected)\n            ErrorMsg_MoveCloserToPartner();\n        else\n            ErrorMsg_CheckConnections();\n        break;\n    case 30:\n        PlaySE(SE_BOO);\n        break;\n    case 60:\n        PlaySE(SE_BOO);\n        break;\n    case 90:\n        PlaySE(SE_BOO);\n        break;\n    case 130:\n        if (gWirelessCommType == 2)\n            AddTextPrinterParameterized3(0, FONT_NORMAL_COPY_2, 2, 20, sLinkErrorTextColor, 0, gText_ABtnTitleScreen);\n        else if (gWirelessCommType == 1)\n            AddTextPrinterParameterized3(0, FONT_NORMAL_COPY_2, 2, 20, sLinkErrorTextColor, 0, gText_ABtnRegistrationCounter);\n        break;\n    }\n    if (gMain.state == 160)\n    {\n        if (gWirelessCommType == 1)\n        {\n            if (JOY_NEW(A_BUTTON))\n            {\n                HelpSystem_Enable();\n                PlaySE(SE_PIN);\n                gWirelessCommType = 0;\n                sLinkErrorBuffer.disconnected = 0;\n                ReloadSave();\n            }\n        }\n        else if (gWirelessCommType == 2)\n        {\n            if (JOY_NEW(A_BUTTON))\n            {\n                HelpSystem_Enable();\n                rfu_REQ_stopMode();\n                rfu_waitREQComplete();\n                DoSoftReset();\n            }\n        }\n    }\n    if (gMain.state != 160)\n        gMain.state++;\n}\n\nbool8 GetSioMultiSI(void)\n{\n    return (REG_SIOCNT & SIO_MULTI_SI) != 0;\n}\n\nstatic bool8 IsSioMultiMaster(void)\n{\n    return (REG_SIOCNT & SIO_MULTI_SD) && !(REG_SIOCNT & SIO_MULTI_SI);\n}\n\nbool8 IsLinkConnectionEstablished(void)\n{\n    return EXTRACT_CONN_ESTABLISHED(gLinkStatus);\n}\n\nvoid SetSuppressLinkErrorMessage(bool8 flag)\n{\n    gSuppressLinkErrorMessage = flag;\n}\n\nbool8 HasLinkErrorOccurred(void)\n{\n    return gLinkErrorOccurred;\n}\n\nvoid LocalLinkPlayerToBlock(void)\n{\n    struct LinkPlayerBlock * block;\n\n    InitLocalLinkPlayer();\n    block = &gLocalLinkPlayerBlock;\n    block->linkPlayer = gLocalLinkPlayer;\n    memcpy(block->magic1, sASCIIGameFreakInc, sizeof(block->magic1) - 1);\n    memcpy(block->magic2, sASCIIGameFreakInc, sizeof(block->magic2) - 1);\n    memcpy(gBlockSendBuffer, block, sizeof(*block));\n}\n\nvoid LinkPlayerFromBlock(u32 who)\n{\n    u8 who_ = who;\n    struct LinkPlayerBlock * block;\n    struct LinkPlayer * player;\n\n    block = (struct LinkPlayerBlock *)gBlockRecvBuffer[who_];\n    player = &gLinkPlayers[who_];\n    *player = block->linkPlayer;\n    ConvertLinkPlayerName(player);\n\n    if (strcmp(block->magic1, sASCIIGameFreakInc) != 0\n     || strcmp(block->magic2, sASCIIGameFreakInc) != 0)\n    {\n        SetMainCallback2(CB2_LinkError);\n    }\n}\n\n// When this function returns TRUE the callbacks are skipped\nbool8 HandleLinkConnection(void)\n{\n    bool32 main1Failed;\n    bool32 main2Failed;\n\n    if (gWirelessCommType == 0)\n    {\n        gLinkStatus = LinkMain1(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds);\n        LinkMain2(&gMain.heldKeys);\n        if ((gLinkStatus & LINK_STAT_RECEIVED_NOTHING) && IsSendingKeysOverCable() == TRUE)\n            return TRUE;\n    }\n    else\n    {\n        main1Failed = RfuMain1(); // Always returns FALSE\n        main2Failed = RfuMain2();\n        if (IsSendingKeysOverCable() == TRUE)\n        {\n            // This will never be reached.\n            // IsSendingKeysOverCable is always FALSE for wireless communication\n            if (main1Failed == TRUE || IsRfuRecvQueueEmpty() || main2Failed)\n                return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nvoid SetWirelessCommType1(void)\n{\n    if (!gReceivedRemoteLinkPlayers)\n        gWirelessCommType = 1;\n}\n\nstatic void SetWirelessCommType0_Internal(void)\n{\n    if (!gReceivedRemoteLinkPlayers)\n        gWirelessCommType = 0;\n}\n\n// Unused\nvoid SetWirelessCommType0(void)\n{\n    if (!gReceivedRemoteLinkPlayers)\n        gWirelessCommType = 0;\n}\n\nu32 GetLinkRecvQueueLength(void)\n{\n    if (gWirelessCommType != 0)\n        return GetRfuRecvQueueLength();\n\n    return gLink.recvQueue.count;\n}\n\nbool32 IsLinkRecvQueueAtOverworldMax(void)\n{\n    if (GetLinkRecvQueueLength() >= OVERWORLD_RECV_QUEUE_MAX)\n        return TRUE;\n\n    return FALSE;\n}\n\nvoid ConvertLinkPlayerName(struct LinkPlayer * player)\n{\n    player->progressFlagsCopy = player->progressFlags; // ? Perhaps relocating for a longer name field\n    ConvertInternationalString(player->name, player->language);\n}\n\n// File break?\n\nstatic void DisableSerial(void)\n{\n    DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);\n    REG_SIOCNT = SIO_MULTI_MODE;\n    REG_TM3CNT_H = 0;\n    REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL;\n    REG_SIOMLT_SEND = 0;\n    REG_SIOMLT_RECV = 0;\n    CpuFill32(0, &gLink, sizeof(gLink));\n}\n\nstatic void EnableSerial(void)\n{\n    DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);\n    REG_RCNT = 0;\n    REG_SIOCNT = SIO_MULTI_MODE;\n    REG_SIOCNT |= SIO_115200_BPS | SIO_INTR_ENABLE;\n    EnableInterrupts(INTR_FLAG_SERIAL);\n    REG_SIOMLT_SEND = 0;\n    CpuFill32(0, &gLink, sizeof(gLink));\n    sNumVBlanksWithoutSerialIntr = 0;\n    sSendNonzeroCheck = 0;\n    sRecvNonzeroCheck = 0;\n    sChecksumAvailable = 0;\n    sHandshakePlayerCount = 0;\n    gLastSendQueueCount = 0;\n    gLastRecvQueueCount = 0;\n}\n\nvoid ResetSerial(void)\n{\n    EnableSerial();\n    DisableSerial();\n}\n\nu32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[CMD_LENGTH])\n{\n    u32 retVal;\n    u32 retVal2;\n\n    switch (gLink.state)\n    {\n    case LINK_STATE_START0:\n        DisableSerial();\n        gLink.state = LINK_STATE_START1;\n        break;\n    case LINK_STATE_START1:\n        if (*shouldAdvanceLinkState == 1)\n        {\n            EnableSerial();\n            gLink.state = LINK_STATE_HANDSHAKE;\n        }\n        break;\n    case LINK_STATE_HANDSHAKE:\n        switch (*shouldAdvanceLinkState)\n        {\n        default:\n            CheckMasterOrSlave();\n            break;\n        case 1:\n            if (gLink.isMaster == LINK_MASTER && gLink.playerCount > 1)\n                gLink.handshakeAsMaster = TRUE;\n            break;\n        case 2:\n            gLink.state = LINK_STATE_START0;\n            REG_SIOMLT_SEND = 0;\n            break;\n        }\n        break;\n    case LINK_STATE_INIT_TIMER:\n        InitTimer();\n        gLink.state = LINK_STATE_CONN_ESTABLISHED;\n        // fallthrough\n    case LINK_STATE_CONN_ESTABLISHED:\n        EnqueueSendCmd(sendCmd);\n        DequeueRecvCmds(recvCmds);\n        break;\n    }\n    *shouldAdvanceLinkState = 0;\n    retVal = gLink.localId;\n    retVal |= (gLink.playerCount << LINK_STAT_PLAYER_COUNT_SHIFT);\n    if (gLink.isMaster == LINK_MASTER)\n    {\n        retVal |= LINK_STAT_MASTER;\n    }\n    {\n        u32 receivedNothing = gLink.receivedNothing << LINK_STAT_RECEIVED_NOTHING_SHIFT;\n        u32 link_field_F = gLink.link_field_F << LINK_STAT_UNK_FLAG_9_SHIFT;\n        u32 hardwareError = gLink.hardwareError << LINK_STAT_ERROR_HARDWARE_SHIFT;\n        u32 badChecksum = gLink.badChecksum << LINK_STAT_ERROR_CHECKSUM_SHIFT;\n        u32 queueFull = gLink.queueFull << LINK_STAT_ERROR_QUEUE_FULL_SHIFT;\n        u32 val;\n\n        if (gLink.state == LINK_STATE_CONN_ESTABLISHED)\n        {\n            val = LINK_STAT_CONN_ESTABLISHED;\n            val |= receivedNothing;\n            val |= retVal;\n            val |= link_field_F;\n            val |= hardwareError;\n            val |= badChecksum;\n            val |= queueFull;\n        }\n        else\n        {\n            val = retVal;\n            val |= receivedNothing;\n            val |= link_field_F;\n            val |= hardwareError;\n            val |= badChecksum;\n            val |= queueFull;\n        }\n\n        retVal = val;\n    }\n\n    if (gLink.lag == LAG_MASTER)\n        retVal |= LINK_STAT_ERROR_LAG_MASTER;\n\n    if (gLink.localId >= MAX_LINK_PLAYERS)\n        retVal |= LINK_STAT_ERROR_INVALID_ID;\n\n    retVal2 = retVal;\n    if (gLink.lag == LAG_SLAVE)\n        retVal2 |= LINK_STAT_ERROR_LAG_SLAVE;\n\n    return retVal2;\n}\n\nstatic void CheckMasterOrSlave(void)\n{\n    u32 terminals;\n\n    terminals = *(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SD | SIO_MULTI_SI);\n    if (terminals == SIO_MULTI_SD && gLink.localId == 0)\n        gLink.isMaster = LINK_MASTER;\n    else\n        gLink.isMaster = LINK_SLAVE;\n}\n\nstatic void InitTimer(void)\n{\n    if (gLink.isMaster)\n    {\n        REG_TM3CNT_L = -197;\n        REG_TM3CNT_H = TIMER_64CLK | TIMER_INTR_ENABLE;\n        EnableInterrupts(INTR_FLAG_TIMER3);\n    }\n}\n\nstatic void EnqueueSendCmd(u16 *sendCmd)\n{\n    u8 i;\n    u8 offset;\n\n    gLinkSavedIme = REG_IME;\n    REG_IME = 0;\n    if (gLink.sendQueue.count < QUEUE_CAPACITY)\n    {\n        offset = gLink.sendQueue.pos + gLink.sendQueue.count;\n        if (offset >= QUEUE_CAPACITY)\n            offset -= QUEUE_CAPACITY;\n\n        for (i = 0; i < CMD_LENGTH; i++)\n        {\n            sSendNonzeroCheck |= *sendCmd;\n            gLink.sendQueue.data[i][offset] = *sendCmd;\n            *sendCmd = 0;\n            sendCmd++;\n        }\n    }\n    else\n    {\n        gLink.queueFull = QUEUE_FULL_SEND;\n    }\n    if (sSendNonzeroCheck)\n    {\n        gLink.sendQueue.count++;\n        sSendNonzeroCheck = 0;\n    }\n    REG_IME = gLinkSavedIme;\n    gLastSendQueueCount = gLink.sendQueue.count;\n}\n\nstatic void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH])\n{\n    u8 i;\n    u8 j;\n\n    gLinkSavedIme = REG_IME;\n    REG_IME = 0;\n    if (gLink.recvQueue.count == 0)\n    {\n        for (i = 0; i < gLink.playerCount; i++)\n        {\n            for (j = 0; j < CMD_LENGTH; j++)\n                recvCmds[i][j] = 0;\n        }\n        gLink.receivedNothing = TRUE;\n    }\n    else\n    {\n        for (i = 0; i < gLink.playerCount; i++)\n        {\n            for (j = 0; j < CMD_LENGTH; j++)\n                recvCmds[i][j] = gLink.recvQueue.data[i][j][gLink.recvQueue.pos];\n        }\n        gLink.recvQueue.count--;\n        gLink.recvQueue.pos++;\n        if (gLink.recvQueue.pos >= QUEUE_CAPACITY)\n            gLink.recvQueue.pos = 0;\n        gLink.receivedNothing = FALSE;\n    }\n    REG_IME = gLinkSavedIme;\n}\n\nvoid LinkVSync(void)\n{\n    if (gLink.isMaster)\n    {\n        switch (gLink.state)\n        {\n        case LINK_STATE_CONN_ESTABLISHED:\n            if (gLink.serialIntrCounter < 9)\n            {\n                if (gLink.hardwareError != TRUE)\n                    gLink.lag = LAG_MASTER;\n                else\n                    StartTransfer();\n            }\n            else if (gLink.lag != LAG_MASTER)\n            {\n                gLink.serialIntrCounter = 0;\n                StartTransfer();\n            }\n            break;\n        case LINK_STATE_HANDSHAKE:\n            StartTransfer();\n            break;\n        }\n    }\n    else if (gLink.state == LINK_STATE_CONN_ESTABLISHED || gLink.state == LINK_STATE_HANDSHAKE)\n    {\n        if (++sNumVBlanksWithoutSerialIntr > 10)\n        {\n            if (gLink.state == LINK_STATE_CONN_ESTABLISHED)\n                gLink.lag = LAG_SLAVE;\n\n            if (gLink.state == LINK_STATE_HANDSHAKE)\n            {\n                gLink.playerCount = 0;\n                gLink.link_field_F = FALSE;\n            }\n        }\n    }\n}\n\nvoid Timer3Intr(void)\n{\n    StopTimer();\n    StartTransfer();\n}\n\nvoid SerialCB(void)\n{\n    gLink.localId = SIO_MULTI_CNT->id;\n    switch (gLink.state)\n    {\n    case LINK_STATE_CONN_ESTABLISHED:\n        gLink.hardwareError = SIO_MULTI_CNT->error;\n        DoRecv();\n        DoSend();\n        SendRecvDone();\n        break;\n    case LINK_STATE_HANDSHAKE:\n        if (DoHandshake())\n        {\n            if (gLink.isMaster)\n            {\n                gLink.state = LINK_STATE_INIT_TIMER;\n                gLink.serialIntrCounter = 8;\n            }\n            else\n            {\n                gLink.state = LINK_STATE_CONN_ESTABLISHED;\n            }\n        }\n        break;\n    }\n    gLink.serialIntrCounter++;\n    sNumVBlanksWithoutSerialIntr = 0;\n    if (gLink.serialIntrCounter == 8)\n        gLastRecvQueueCount = gLink.recvQueue.count;\n}\n\nstatic void StartTransfer(void)\n{\n    REG_SIOCNT |= SIO_START;\n}\n\nstatic bool8 DoHandshake(void)\n{\n    u8 i;\n    u8 playerCount;\n    u16 minRecv;\n\n    playerCount = 0;\n    minRecv = 0xFFFF;\n    if (gLink.handshakeAsMaster == TRUE)\n        REG_SIOMLT_SEND = MASTER_HANDSHAKE;\n    else\n        REG_SIOMLT_SEND = SLAVE_HANDSHAKE;\n    *(u64 *)gLink.tempRecvBuffer = REG_SIOMLT_RECV;\n    REG_SIOMLT_RECV = 0;\n    gLink.handshakeAsMaster = FALSE;\n    for (i = 0; i < 4; i++)\n    {\n        if ((gLink.tempRecvBuffer[i] & ~0x3) == SLAVE_HANDSHAKE || gLink.tempRecvBuffer[i] == MASTER_HANDSHAKE)\n        {\n            playerCount++;\n            if (minRecv > gLink.tempRecvBuffer[i] && gLink.tempRecvBuffer[i] != 0)\n                minRecv = gLink.tempRecvBuffer[i];\n        }\n        else\n        {\n            if (gLink.tempRecvBuffer[i] != 0xFFFF)\n                playerCount = 0;\n            break;\n        }\n    }\n    gLink.playerCount = playerCount;\n    if (gLink.playerCount > 1 && gLink.playerCount == sHandshakePlayerCount && gLink.tempRecvBuffer[0] == MASTER_HANDSHAKE)\n        return TRUE;\n\n    if (gLink.playerCount > 1)\n        gLink.link_field_F = (minRecv & 3) + 1;\n    else\n        gLink.link_field_F = 0;\n    sHandshakePlayerCount = gLink.playerCount;\n    return FALSE;\n}\n\nstatic void DoRecv(void)\n{\n    u16 recv[4];\n    u8 i;\n    u8 index;\n\n    *(u64 *)recv = REG_SIOMLT_RECV;\n    if (gLink.sendCmdIndex == 0)\n    {\n        for (i = 0; i < gLink.playerCount; i++)\n        {\n            if (gLink.checksum != recv[i] && sChecksumAvailable)\n                gLink.badChecksum = TRUE;\n        }\n        gLink.checksum = 0;\n        sChecksumAvailable = TRUE;\n    }\n    else\n    {\n        index = gLink.recvQueue.pos + gLink.recvQueue.count;\n        if (index >= QUEUE_CAPACITY)\n            index -= QUEUE_CAPACITY;\n\n        if (gLink.recvQueue.count < QUEUE_CAPACITY)\n        {\n            for (i = 0; i < gLink.playerCount; i++)\n            {\n                gLink.checksum += recv[i];\n                sRecvNonzeroCheck |= recv[i];\n                gLink.recvQueue.data[i][gLink.recvCmdIndex][index] = recv[i];\n            }\n        }\n        else\n        {\n            gLink.queueFull = QUEUE_FULL_RECV;\n        }\n        gLink.recvCmdIndex++;\n        if (gLink.recvCmdIndex == CMD_LENGTH && sRecvNonzeroCheck)\n        {\n            gLink.recvQueue.count++;\n            sRecvNonzeroCheck = 0;\n        }\n    }\n}\n\nstatic void DoSend(void)\n{\n    if (gLink.sendCmdIndex == CMD_LENGTH)\n    {\n        REG_SIOMLT_SEND = gLink.checksum;\n        if (!sSendBufferEmpty)\n        {\n            gLink.sendQueue.count--;\n            gLink.sendQueue.pos++;\n            if (gLink.sendQueue.pos >= QUEUE_CAPACITY)\n                gLink.sendQueue.pos = 0;\n        }\n        else\n        {\n            sSendBufferEmpty = FALSE;\n        }\n    }\n    else\n    {\n        if (!sSendBufferEmpty && gLink.sendQueue.count == 0)\n            sSendBufferEmpty = TRUE;\n\n        if (sSendBufferEmpty)\n            REG_SIOMLT_SEND = 0;\n        else\n            REG_SIOMLT_SEND = gLink.sendQueue.data[gLink.sendCmdIndex][gLink.sendQueue.pos];\n        gLink.sendCmdIndex++;\n    }\n}\n\nstatic void StopTimer(void)\n{\n    if (gLink.isMaster)\n    {\n        REG_TM3CNT_H &= ~TIMER_ENABLE;\n        REG_TM3CNT_L = -197;\n    }\n}\n\nstatic void SendRecvDone(void)\n{\n    if (gLink.recvCmdIndex == CMD_LENGTH)\n    {\n        gLink.sendCmdIndex = 0;\n        gLink.recvCmdIndex = 0;\n    }\n    else if (gLink.isMaster)\n    {\n        REG_TM3CNT_H |= TIMER_ENABLE;\n    }\n}\n\nvoid ResetSendBuffer(void)\n{\n    u8 i;\n    u8 j;\n\n    gLink.sendQueue.count = 0;\n    gLink.sendQueue.pos = 0;\n    for (i = 0; i < CMD_LENGTH; i++)\n    {\n        for (j = 0; j < QUEUE_CAPACITY; j++)\n            gLink.sendQueue.data[i][j] = LINKCMD_NONE;\n    }\n}\n\nvoid ResetRecvBuffer(void)\n{\n    u8 i;\n    u8 j;\n    u8 k;\n\n    gLink.recvQueue.count = 0;\n    gLink.recvQueue.pos = 0;\n    for (i = 0; i < MAX_LINK_PLAYERS; i++)\n    {\n        for (j = 0; j < CMD_LENGTH; j++)\n        {\n            for (k = 0; k < QUEUE_CAPACITY; k++)\n                gLink.recvQueue.data[i][j][k] = LINKCMD_NONE;\n        }\n    }\n}\n"
  },
  {
    "path": "src/link_rfu_2.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"librfu.h\"\n#include \"battle.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"mystery_gift_menu.h\"\n#include \"overworld.h\"\n#include \"quest_log.h\"\n#include \"random.h\"\n#include \"task.h\"\n#include \"constants/union_room.h\"\n\nenum {\n    RFUSTATE_INIT,\n    RFUSTATE_INIT_END,\n    RFUSTATE_PARENT_CONNECT,\n    RFUSTATE_PARENT_CONNECT_END,\n    RFUSTATE_STOP_MANAGER,\n    RFUSTATE_STOP_MANAGER_END,\n    RFUSTATE_CHILD_CONNECT,\n    RFUSTATE_CHILD_CONNECT_END,\n    RFUSTATE_UNUSED,\n    RFUSTATE_RECONNECTED,\n    RFUSTATE_CONNECTED,\n    RFUSTATE_CHILD_TRY_JOIN,\n    RFUSTATE_CHILD_JOINED,\n    RFUSTATE_UR_PLAYER_EXCHANGE,\n    RFUSTATE_UR_STOP_MANAGER,\n    RFUSTATE_UR_STOP_MANAGER_END,\n    RFUSTATE_UR_FINALIZE,\n};\n// These states are used for different purposes\n// depending on the link mode (parent, child, union room)\n#define RFUSTATE_PARENT_FINALIZE_START 17\n#define RFUSTATE_PARENT_FINALIZE       18\n#define RFUSTATE_UR_CONNECT     17\n#define RFUSTATE_UR_CONNECT_END 18\n#define RFUSTATE_FINALIZED 20\n\n// States for the 'receiving' field of RfuBlockSend\nenum {\n    RECV_STATE_READY,\n    RECV_STATE_RECEIVING,\n    RECV_STATE_FINISHED,\n};\n\nstruct SioInfo\n{\n    char magic[sizeof(\"PokemonSioInfo\")];\n    u8 playerCount;\n    u8 linkPlayerIdx[RFU_CHILD_MAX];\n    struct LinkPlayer linkPlayers[MAX_RFU_PLAYERS];\n    u8 filler[92];\n};\n\nstruct RfuDebug\n{\n    u8 unused0[6];\n    u16 recvCount;\n    u8 unused1[6];\n    vu8 unkFlag;\n    bool8 childJoined;\n    u8 unused2[84];\n    u16 blockSendFailures;\n    u8 unused3[29];\n    u8 blockSendTime;\n    u8 unused4[88];\n};\n\nstatic EWRAM_DATA INIT_PARAM sRfuReqConfig = {};\nstatic EWRAM_DATA struct RfuDebug sRfuDebug = {};\n\nstatic u32 sRfuAPIBuffer[RFU_API_BUFF_SIZE_RAM / 4];\nstatic u8 sResendBlock8[CMD_LENGTH * 2];\nstatic u16 sResendBlock16[CMD_LENGTH];\n\nstruct RfuGameData gHostRfuGameData;\nstruct RfuManager gRfu;\nu8 gHostRfuUsername[PLAYER_NAME_LENGTH + 1];\n\nstatic void InitChildRecvBuffers(void);\nstatic void InitParentSendData(void);\nstatic void MscCallback_Child(u16 REQ_commandID);\nstatic void MSCCallback_Parent(u16 REQ_commandID);\nstatic void UpdateBackupQueue(void);\nstatic void RfuHandleReceiveCommand(u8 unused);\nstatic void ResetSendDataManager(struct RfuBlockSend *data);\nstatic void RfuPrepareSendBuffer(u16 command);\nstatic void HandleBlockSend(void);\nstatic void SendNextBlock(void);\nstatic void SendLastBlock(void);\nstatic void CallRfuFunc(void);\nstatic void UpdateChildStatuses(void);\nstatic s32 GetJoinGroupStatus(void);\nstatic void Task_PlayerExchange(u8 taskId);\nstatic void ClearSelectedLinkPlayerIds(u16 disconnectMask);\nstatic void ValidateAndReceivePokemonSioInfo(void *recvBuffer);\nstatic void Task_PlayerExchangeUpdate(u8 taskId);\nstatic void Task_PlayerExchangeChat(u8 taskId);\nstatic void RfuSetErrorParams(u32 errorInfo);\nstatic void ParentResetChildRecvMetadata(s32 slot);\nstatic void CB2_RfuIdle(void);\nstatic u8 GetPartnerIndexByNameAndTrainerID(const u8 *trainerName, u16 trainerId);\nstatic void RfuReqDisconnectSlot(u32 bmDisconnectSlot);\nstatic void SendDisconnectCommand(u32 playersToDisconnect, u32 disconnectMode);\nstatic void Task_TryConnectToUnionRoomParent(u8 taskId);\nstatic void Debug_PrintEmpty(void);\nstatic void Task_Idle(u8 taskId);\n\nstatic const INIT_PARAM sRfuReqConfigTemplate = {\n    .maxMFrame = 4,\n    .MC_TimerCount = 32,\n    .availSlot_flag = 0,\n    .mboot_flag = 0,\n    .serialNo = RFU_SERIAL_GAME,\n    .gameName = (void *)&gHostRfuGameData,\n    .userName = gHostRfuUsername,\n    .fastSearchParent_flag = TRUE,\n    .linkRecovery_enable = FALSE,\n    .linkRecovery_period = 600,\n    .NI_failCounter_limit = 300\n};\n\nstatic const u8 sAvailSlots[] = {\n    [1] = AVAIL_SLOT1,\n    [2] = AVAIL_SLOT2,\n    [3] = AVAIL_SLOT3,\n    [4] = AVAIL_SLOT4\n};\n\n#define BLOCK_MASK(bitNum)((1 << (bitNum)) - 1)\nstatic const u32 sAllBlocksReceived[] = {\n    BLOCK_MASK(0),\n    BLOCK_MASK(1),\n    BLOCK_MASK(2),\n    BLOCK_MASK(3),\n    BLOCK_MASK(4),\n    BLOCK_MASK(5),\n    BLOCK_MASK(6),\n    BLOCK_MASK(7),\n    BLOCK_MASK(8),\n    BLOCK_MASK(9),\n    BLOCK_MASK(10),\n    BLOCK_MASK(11),\n    BLOCK_MASK(12),\n    BLOCK_MASK(13),\n    BLOCK_MASK(14),\n    BLOCK_MASK(15),\n    BLOCK_MASK(16),\n    BLOCK_MASK(17),\n    BLOCK_MASK(18),\n    BLOCK_MASK(19),\n    BLOCK_MASK(20),\n    BLOCK_MASK(21),\n    BLOCK_MASK(22),\n    BLOCK_MASK(23),\n    BLOCK_MASK(24),\n};\n#undef BLOCK_MASK\n\nstatic const u8 sSlotToLinkPlayerTableId[] = {\n    0, 0, 1,\n    1, 2, 2,\n    2, 2, 3\n};\n\n// Effectively just returns the number of bits set in the index value\n// Used for masks of the other players, MAX_RFU_PLAYERS - 1 excludes self\nstatic const u8 sPlayerBitsToCount[1 << (MAX_RFU_PLAYERS - 1)] = {\n    0, // 0000\n    1, // 0001\n    1, // 0010\n    2, // 0011\n    1, // 0100\n    2, // 0101\n    2, // 0110\n    3, // 0111\n    1, // 1000\n    2, // 1001\n    2, // 1010\n    3, // 1011\n    2, // 1100\n    3, // 1101\n    3, // 1110\n    4  // 1111\n};\n\n// If the 4 bits representing child slots were an array, this table\n// would return the index of the most recently set bit\nstatic const u8 sPlayerBitsToNewChildIdx[1 << (MAX_RFU_PLAYERS - 1)] = {\n    0, // 0000\n    0, // 0001\n    1, // 0010\n    0, // 0011\n    2, // 0100\n    0, // 0101\n    1, // 0110\n    0, // 0111\n    3, // 1000\n    0, // 1001\n    1, // 1010\n    0, // 1011\n    2, // 1100\n    0, // 1101\n    1, // 1110\n    0  // 1111\n};\n\nstatic const struct BlockRequest sBlockRequests[] = {\n    [BLOCK_REQ_SIZE_NONE] = { gBlockSendBuffer, 200 },\n    [BLOCK_REQ_SIZE_200]  = { gBlockSendBuffer, 200 },\n    [BLOCK_REQ_SIZE_100]  = { gBlockSendBuffer, 100 },\n    [BLOCK_REQ_SIZE_220]  = { gBlockSendBuffer, 220 },\n    [BLOCK_REQ_SIZE_40]   = { gBlockSendBuffer,  40 }\n};\n\nstatic const u16 sAcceptedSerialNos[] = {\n    RFU_SERIAL_GAME,\n    RFU_SERIAL_WONDER_DISTRIBUTOR,\n    RFU_SERIAL_END\n};\n\nstatic const char sASCII_RfuCmds[][15] = {\n    \"RFU WAIT\",\n    \"RFU BOOT\",\n    \"RFU ERROR\",\n    \"RFU RESET\",\n    \"RFU CONFIG\",\n    \"RFU START\",\n    \"RFU SC POLL\",\n    \"RFU SP POLL\",\n    \"RFU START\",\n    \"RFU SEND ERR\",\n    \"RFU CP POLL\"\n};\n\nstatic const char sASCII_RecoverCmds[][16] = {\n    \"              \",\n    \"RECOVER START \",\n    \"DISSCONECT    \",\n    \"RECOVER SUUSES\",\n    \"RECOVER FAILED\"\n};\n\n// List of additional tasks to destroy (if active) when the RFU shuts down\nstatic const TaskFunc sShutdownTasks[] = {\n    Task_PlayerExchange,\n    Task_PlayerExchangeUpdate,\n    Task_PlayerExchangeChat\n};\n\nstatic void Debug_PrintString(const void *string, u8 x, u8 y)\n{\n\n}\n\nstatic void Debug_PrintNum(u16 num, u8 x, u8 y, u8 numDigits)\n{\n\n}\n\nvoid ResetLinkRfuGFLayer(void)\n{\n    s32 i;\n    u8 errorState = gRfu.errorState;\n    CpuFill16(0, &gRfu, sizeof gRfu);\n    gRfu.parentChild = MODE_NEUTRAL;\n    gRfu.errorState = errorState;\n    if (gRfu.errorState != RFU_ERROR_STATE_IGNORE)\n        gRfu.errorState = RFU_ERROR_STATE_NONE;\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n        ResetSendDataManager(&gRfu.recvBlock[i]);\n    ResetSendDataManager(&gRfu.sendBlock);\n    RfuRecvQueue_Reset(&gRfu.recvQueue);\n    RfuSendQueue_Reset(&gRfu.sendQueue);\n    CpuFill16(0, gSendCmd, sizeof gSendCmd);\n    CpuFill16(0, gRecvCmds, sizeof gRecvCmds);\n    CpuFill16(0, gLinkPlayers, sizeof gLinkPlayers);\n}\n\nvoid InitRFU(void)\n{\n    IntrFunc serialIntr = gIntrTable[1];\n    IntrFunc timerIntr = gIntrTable[2];\n    InitRFUAPI();\n    rfu_REQ_stopMode();\n    rfu_waitREQComplete();\n    REG_IME = 0;\n    gIntrTable[1] = serialIntr;\n    gIntrTable[2] = timerIntr;\n    REG_IME = INTR_FLAG_VBLANK;\n}\n\nvoid InitRFUAPI(void)\n{\n    if (!rfu_initializeAPI(sRfuAPIBuffer, RFU_API_BUFF_SIZE_RAM, &gIntrTable[1], TRUE))\n    {\n        gLinkType = 0;\n        // ClearSavedLinkPlayers(); // Em fix\n        RfuSetIgnoreError(FALSE);\n        ResetLinkRfuGFLayer();\n        rfu_setTimerInterrupt(3, &gIntrTable[2]);\n    }\n}\n\nstatic void Task_ParentSearchForChildren(u8 taskId)\n{\n    UpdateChildStatuses();\n    switch (gRfu.state)\n    {\n    case RFUSTATE_INIT:\n        rfu_LMAN_initializeRFU(&sRfuReqConfig);\n        gRfu.state = RFUSTATE_INIT_END;\n        gTasks[taskId].data[1] = 1;\n        break;\n    case RFUSTATE_INIT_END:\n        break;\n    case RFUSTATE_PARENT_CONNECT:\n        rfu_LMAN_establishConnection(gRfu.parentChild, 0, 240, (u16 *)sAcceptedSerialNos);\n        gRfu.state = RFUSTATE_PARENT_CONNECT_END;\n        gTasks[taskId].data[1] = 6;\n        break;\n    case RFUSTATE_PARENT_CONNECT_END:\n        break;\n    case RFUSTATE_STOP_MANAGER:\n        rfu_LMAN_stopManager(FALSE);\n        gRfu.state = RFUSTATE_STOP_MANAGER_END;\n        break;\n    case RFUSTATE_STOP_MANAGER_END:\n        break;\n    case RFUSTATE_PARENT_FINALIZE:\n        gRfu.parentFinished = FALSE;\n        rfu_LMAN_setMSCCallback(MSCCallback_Parent);\n        InitChildRecvBuffers();\n        InitParentSendData();\n        gRfu.state = RFUSTATE_FINALIZED;\n        gTasks[taskId].data[1] = 8;\n        CreateTask(Task_PlayerExchange, 5);\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic u8 Rfu_GetIndexOfNewestChild(u8 bits)\n{\n    return sPlayerBitsToNewChildIdx[bits];\n}\n\nstatic void SetLinkPlayerIdsFromSlots(s32 baseSlots, s32 addSlots)\n{\n    u8 i;\n    u8 baseId = 1;\n    s32 baseSlotsCopy = baseSlots;\n    s32 newId = 0;\n    if (addSlots == -1)\n    {\n        // Initialize\n        for (i = 0; i < RFU_CHILD_MAX; baseSlots >>= 1, i++)\n        {\n            if (baseSlots & 1)\n            {\n                gRfu.linkPlayerIdx[i] = baseId;\n                baseId++;\n            }\n        }\n    }\n    else\n    {\n        // Clear id for any empty slot\n        for (i = 0; i < RFU_CHILD_MAX; baseSlotsCopy >>= 1, i++)\n        {\n            if (!(baseSlotsCopy & 1))\n                gRfu.linkPlayerIdx[i] = 0;\n        }\n\n        // Get starting id by checking existing slots\n        for (baseId = RFU_CHILD_MAX; baseId != 0; baseId--)\n        {\n            for (i = 0; i < RFU_CHILD_MAX && gRfu.linkPlayerIdx[i] != baseId; i++)\n                ;\n            if (i == RFU_CHILD_MAX)\n                newId = baseId;\n        }\n\n        // Set id for new slots\n        for (addSlots &= ~baseSlots, i = 0; i < RFU_CHILD_MAX; addSlots >>= 1, i++)\n        {\n            if (addSlots & 1)\n                gRfu.linkPlayerIdx[i] = newId++;\n        }\n    }\n}\n\nstatic void Task_ChildSearchForParent(u8 taskId)\n{\n    switch (gRfu.state)\n    {\n    case RFUSTATE_INIT:\n        rfu_LMAN_initializeRFU((INIT_PARAM*)&sRfuReqConfigTemplate);\n        gRfu.state = RFUSTATE_INIT_END;\n        gTasks[taskId].data[1] = 1;\n        break;\n    case RFUSTATE_INIT_END:\n        break;\n    case RFUSTATE_CHILD_CONNECT:\n        rfu_LMAN_establishConnection(gRfu.parentChild, 0, 240, (u16 *)sAcceptedSerialNos);\n        gRfu.state = RFUSTATE_CHILD_CONNECT_END;\n        gTasks[taskId].data[1] = 7;\n        break;\n    case RFUSTATE_CHILD_CONNECT_END:\n        break;\n    case RFUSTATE_RECONNECTED:\n        gTasks[taskId].data[1] = 10;\n        break;\n    case RFUSTATE_CHILD_TRY_JOIN:\n        switch (GetJoinGroupStatus())\n        {\n        case RFU_STATUS_JOIN_GROUP_OK:\n            gRfu.state = RFUSTATE_CHILD_JOINED;\n            break;\n        case RFU_STATUS_JOIN_GROUP_NO:\n        case RFU_STATUS_LEAVE_GROUP:\n            rfu_LMAN_requestChangeAgbClockMaster();\n            gRfu.disconnectMode = RFU_DISCONNECT_NORMAL;\n            DestroyTask(taskId);\n            break;\n        }\n        break;\n    case RFUSTATE_CHILD_JOINED:\n    {\n        u8 bmChildSlot = 1 << gRfu.childSlot;\n        rfu_clearSlot(TYPE_NI_SEND | TYPE_NI_RECV, gRfu.childSlot);\n        rfu_setRecvBuffer(TYPE_UNI, gRfu.childSlot, gRfu.childRecvQueue, sizeof(gRfu.childRecvQueue));\n        rfu_UNI_setSendData(bmChildSlot, gRfu.childSendBuffer, sizeof(gRfu.childSendBuffer));\n        gTasks[taskId].data[1] = 8;\n        DestroyTask(taskId);\n        if (!sRfuDebug.childJoined)\n        {\n            Debug_PrintEmpty();\n            sRfuDebug.childJoined++;\n        }\n        CreateTask(Task_PlayerExchange, 5);\n        break;\n    }\n    }\n}\n\nstatic void InitChildRecvBuffers(void)\n{\n    u8 i;\n    u8 acceptSlot = lman.acceptSlot_flag;\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (acceptSlot & 1)\n        {\n            rfu_setRecvBuffer(TYPE_UNI, i, gRfu.childRecvBuffer[i], sizeof(gRfu.childRecvBuffer[i]));\n            rfu_clearSlot(TYPE_UNI_SEND | TYPE_UNI_RECV, i);\n        }\n        acceptSlot >>= 1;\n    }\n}\n\nstatic void InitParentSendData(void)\n{\n    u8 acceptSlot = lman.acceptSlot_flag;\n    rfu_UNI_setSendData(acceptSlot, gRfu.recvCmds, sizeof(gRfu.recvCmds));\n    gRfu.parentSendSlot = Rfu_GetIndexOfNewestChild(acceptSlot);\n    gRfu.parentSlots = acceptSlot;\n    SetLinkPlayerIdsFromSlots(acceptSlot, -1);\n    gRfu.parentChild = MODE_PARENT;\n}\n\n#define tConnectingForChat data[7]\n\nstatic void Task_UnionRoomListen(u8 taskId)\n{\n    if (GetHostRfuGameData()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM) && RfuGetStatus() == RFU_STATUS_NEW_CHILD_DETECTED)\n    {\n        rfu_REQ_disconnect(lman.acceptSlot_flag);\n        rfu_waitREQComplete();\n        RfuSetStatus(RFU_STATUS_OK, 0);\n    }\n    switch (gRfu.state)\n    {\n    case RFUSTATE_INIT:\n        rfu_LMAN_initializeRFU(&sRfuReqConfig);\n        gRfu.state = RFUSTATE_INIT_END;\n        gTasks[taskId].data[1] = 1;\n        break;\n    case RFUSTATE_INIT_END:\n        break;\n    case RFUSTATE_UR_CONNECT:\n        rfu_LMAN_establishConnection(MODE_P_C_SWITCH, 0, 240, (u16 *)sAcceptedSerialNos);\n        rfu_LMAN_setMSCCallback(MscCallback_Child);\n        gRfu.state = RFUSTATE_UR_CONNECT_END;\n        break;\n    case RFUSTATE_UR_CONNECT_END:\n        break;\n    case RFUSTATE_UR_PLAYER_EXCHANGE:\n        if (rfu_UNI_setSendData(1 << gRfu.childSlot, gRfu.childSendBuffer, sizeof(gRfu.childSendBuffer)) == 0)\n        {\n            gRfu.parentChild = MODE_CHILD;\n            DestroyTask(taskId);\n            if (gTasks[taskId].tConnectingForChat)\n                CreateTask(Task_PlayerExchangeChat, 1);\n            else\n                CreateTask(Task_PlayerExchange, 5);\n        }\n        break;\n    case RFUSTATE_UR_STOP_MANAGER:\n        rfu_LMAN_stopManager(FALSE);\n        gRfu.state = RFUSTATE_UR_STOP_MANAGER_END;\n        break;\n    case RFUSTATE_UR_STOP_MANAGER_END:\n        break;\n    case RFUSTATE_UR_FINALIZE:\n        gRfu.parentFinished = FALSE;\n        rfu_LMAN_setMSCCallback(MSCCallback_Parent);\n        UpdateGameData_GroupLockedIn(TRUE);\n        InitChildRecvBuffers();\n        InitParentSendData();\n        gRfu.state = RFUSTATE_FINALIZED;\n        gTasks[taskId].data[1] = 8;\n        gRfu.parentChild = MODE_PARENT;\n        CreateTask(Task_PlayerExchange, 5);\n        gRfu.playerExchangeActive = TRUE;\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nvoid LinkRfu_CreateConnectionAsParent(void)\n{\n    rfu_LMAN_establishConnection(MODE_PARENT, 0, 240, (u16 *)sAcceptedSerialNos);\n}\n\nvoid LinkRfu_StopManagerBeforeEnteringChat(void)\n{\n    rfu_LMAN_stopManager(FALSE);\n}\n\n// Argument is provided by the RFU and is unused.\nstatic void MscCallback_Child(u16 REQ_commandID)\n{\n    s32 i;\n\n    for (i = 0; i < COMM_SLOT_LENGTH; i++)\n        gRfu.childSendBuffer[i] = 0;\n\n    rfu_REQ_recvData();\n    rfu_waitREQComplete();\n    if (gRfuSlotStatusUNI[gRfu.childSlot]->recv.newDataFlag)\n    {\n        gRfu.childSendCount++;\n        RfuRecvQueue_Enqueue(&gRfu.recvQueue, gRfu.childRecvQueue);\n        sRfuDebug.recvCount++;\n        UpdateBackupQueue();\n        rfu_UNI_readySendData(gRfu.childSlot);\n        rfu_UNI_clearRecvNewDataFlag(gRfu.childSlot);\n    }\n    rfu_LMAN_REQ_sendData(TRUE);\n}\n\n// Argument is provided by the RFU and is unused.\nstatic void MSCCallback_Parent(u16 REQ_commandID)\n{\n    gRfu.parentFinished = TRUE;\n}\n\nvoid LinkRfu_Shutdown(void)\n{\n    u8 i;\n\n    if (QL_IS_PLAYBACK_STATE)\n        return;\n\n    rfu_LMAN_powerDownRFU();\n    if (gRfu.parentChild == MODE_PARENT)\n    {\n        // Stop parent searching for children\n        if (FuncIsActiveTask(Task_ParentSearchForChildren) == TRUE)\n        {\n            DestroyTask(gRfu.searchTaskId);\n            ResetLinkRfuGFLayer();\n        }\n    }\n    else if (gRfu.parentChild == MODE_CHILD)\n    {\n        // Stop child searching for parent\n        if (FuncIsActiveTask(Task_ChildSearchForParent) == TRUE)\n        {\n            DestroyTask(gRfu.searchTaskId);\n            ResetLinkRfuGFLayer();\n        }\n    }\n    else if (gRfu.parentChild == MODE_P_C_SWITCH)\n    {\n        // Stop parent-child switching mode (union room)\n        if (FuncIsActiveTask(Task_UnionRoomListen) == TRUE)\n        {\n            DestroyTask(gRfu.searchTaskId);\n            ResetLinkRfuGFLayer();\n        }\n    }\n\n    // Destroy additional tasks\n    for (i = 0; i < ARRAY_COUNT(sShutdownTasks); i++)\n    {\n        if (FuncIsActiveTask(sShutdownTasks[i]) == TRUE)\n            DestroyTask(FindTaskIdByFunc(sShutdownTasks[i]));\n    }\n}\n\nstatic void CreateTask_ParentSearchForChildren(void)\n{\n    if (QL_IS_PLAYBACK_STATE)\n        return;\n    gRfu.searchTaskId = CreateTask(Task_ParentSearchForChildren, 1);\n}\n\n// If no parent ID (or if child connection not ready) can't reconnect with parent yet\nstatic bool8 CanTryReconnectParent(void)\n{\n    if (gRfu.state == RFUSTATE_CHILD_CONNECT_END && gRfu.parentId)\n        return TRUE;\n    return FALSE;\n}\n\nstatic bool32 TryReconnectParent(void)\n{\n    if (gRfu.state == RFUSTATE_CHILD_CONNECT_END && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[gRfu.reconnectParentId].id, 240))\n    {\n        gRfu.state = RFUSTATE_RECONNECTED;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void CreateTask_ChildSearchForParent(void)\n{\n    if (QL_IS_PLAYBACK_STATE)\n        return;\n    gRfu.searchTaskId = CreateTask(Task_ChildSearchForParent, 1);\n}\n\nbool8 LmanAcceptSlotFlagIsNotZero(void)\n{\n    if (lman.acceptSlot_flag)\n        return TRUE;\n    return FALSE;\n}\n\nvoid LinkRfu_StopManagerAndFinalizeSlots(void)\n{\n    gRfu.state = RFUSTATE_STOP_MANAGER;\n    gRfu.acceptSlot_flag = lman.acceptSlot_flag;\n}\n\nbool32 WaitRfuState(bool32 force)\n{\n    if (gRfu.state == RFUSTATE_PARENT_FINALIZE_START || force)\n    {\n        gRfu.state = RFUSTATE_PARENT_FINALIZE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid StopUnionRoomLinkManager(void)\n{\n    gRfu.state = RFUSTATE_UR_STOP_MANAGER;\n}\n\n// Unused\nstatic void ReadySendDataForSlots(u8 slots)\n{\n    u8 i;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (slots & 1)\n        {\n            rfu_UNI_readySendData(i);\n            break;\n        }\n        slots >>= 1;\n    }\n}\n\nstatic void ReadAllPlayerRecvCmds(void)\n{\n    s32 i, j;\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        struct RfuManager *ptr = &gRfu;\n        for (j = 0; j < CMD_LENGTH - 1; j++)\n        {\n            ptr->recvCmds[i][j][1] = gRecvCmds[i][j] >> 8;\n            ptr->recvCmds[i][j][0] = gRecvCmds[i][j];\n        }\n    }\n    CpuFill16(0, gRecvCmds, sizeof gRecvCmds);\n}\n\nstatic void MoveSendCmdToRecv(void)\n{\n    s32 i;\n    for (i = 0; i < CMD_LENGTH - 1; i++)\n        gRecvCmds[0][i] = gSendCmd[i];\n\n    for (i = 0; i < CMD_LENGTH - 1; i++)\n        gSendCmd[i] = 0;\n}\n\nstatic void UpdateBackupQueue(void)\n{\n    if (gRfu.linkRecovered)\n    {\n        bool8 backupEmpty = RfuBackupQueue_Dequeue(&gRfu.backupQueue, gRfu.childSendBuffer);\n        if (gRfu.backupQueue.count == 0)\n            gRfu.linkRecovered = FALSE;\n\n        if (backupEmpty)\n            return;\n    }\n    if (!gRfu.linkRecovered)\n    {\n        RfuSendQueue_Dequeue(&gRfu.sendQueue, gRfu.childSendBuffer);\n        RfuBackupQueue_Enqueue(&gRfu.backupQueue, gRfu.childSendBuffer);\n    }\n}\n\nbool32 IsRfuRecvQueueEmpty(void)\n{\n    s32 i;\n    s32 j;\n\n    if (gRfuLinkStatus->sendSlotUNIFlag == 0)\n        return FALSE;\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n        for (j = 0; j < CMD_LENGTH - 1; j++)\n            if (gRecvCmds[i][j] != 0)\n                return FALSE;\n\n    return TRUE;\n}\n\nstatic bool32 RfuMain1_Parent(void)\n{\n    if (gRfu.state < RFUSTATE_FINALIZED)\n    {\n        rfu_REQ_recvData();\n        rfu_waitREQComplete();\n        rfu_LMAN_REQ_sendData(FALSE);\n    }\n    else\n    {\n        gRfu.parentFinished = FALSE;\n        if ((gRfu.parentSlots & gRfuLinkStatus->connSlotFlag) == gRfu.parentSlots && (gRfu.parentSlots & gRfuLinkStatus->connSlotFlag))\n        {\n            if (!gRfu.parentMain2Failed)\n            {\n                if (gRfu.disconnectSlots)\n                {\n                    RfuReqDisconnectSlot(gRfu.disconnectSlots);\n                    gRfu.disconnectSlots = 0;\n                    if (gRfu.disconnectMode == RFU_DISCONNECT_ERROR)\n                    {\n                        RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_8);\n                        RfuSetErrorParams(F_RFU_ERROR_8);\n                        return FALSE;\n                    }\n                    if (!lman.acceptSlot_flag)\n                    {\n                        LinkRfu_Shutdown();\n                        gReceivedRemoteLinkPlayers = FALSE;\n                        return FALSE;\n                    }\n                }\n                ReadAllPlayerRecvCmds();\n                rfu_UNI_readySendData(gRfu.parentSendSlot);\n                rfu_LMAN_REQ_sendData(TRUE);\n            }\n            else\n            {\n                rfu_REQ_PARENT_resumeRetransmitAndChange();\n            }\n            gRfu.runParentMain2 = TRUE;\n        }\n    }\n    return FALSE;\n}\n\nstatic bool32 RfuMain2_Parent(void)\n{\n    u16 i;\n    u16 flags;\n    u8 r0;\n    u16 j;\n    bool8 failed;\n\n    if (gRfu.state >= RFUSTATE_FINALIZED && gRfu.runParentMain2 == TRUE)\n    {\n        rfu_waitREQComplete();\n        while (!gRfu.parentFinished)\n        {\n            if (gRfu.errorState != RFU_ERROR_STATE_NONE)\n                return FALSE;\n        }\n        rfu_REQ_recvData();\n        rfu_waitREQComplete();\n        if ((lman.parentAck_flag & gRfu.parentSlots) == gRfu.parentSlots)\n        {\n            gRfu.parentMain2Failed = FALSE;\n            sRfuDebug.recvCount++;\n            flags = lman.acceptSlot_flag;\n            for (i = 0; i < RFU_CHILD_MAX; i++)\n            {\n                if (flags & 1)\n                {\n                    if (gRfu.childRecvBuffer[i][1])\n                    {\n                        if (gRfu.childRecvIds[i] != 0xFF && (gRfu.childRecvBuffer[i][0] >> 5) != ((gRfu.childRecvIds[i] + 1) & 7))\n                        {\n                            if (++gRfu.numChildRecvErrors[i] > 4)\n                                RfuSetErrorParams(F_RFU_ERROR_8 | F_RFU_ERROR_1);\n                        }\n                        else\n                        {\n                            gRfu.childRecvIds[i] = gRfu.childRecvBuffer[i][0] / 32;\n                            gRfu.numChildRecvErrors[i] = 0;\n                            gRfu.childRecvBuffer[i][0] &= 0x1f;\n                            r0 = gRfu.linkPlayerIdx[i];\n                            for (j = 0; j < CMD_LENGTH - 1; j++)\n                            {\n                                gRecvCmds[r0][j] = (gRfu.childRecvBuffer[i][(j << 1) + 1] << 8) | gRfu.childRecvBuffer[i][(j << 1) + 0];\n                                gRfu.childRecvBuffer[i][(j << 1) + 1] = 0;\n                                gRfu.childRecvBuffer[i][(j << 1) + 0] = 0;\n                            }\n                        }\n                    }\n                    rfu_UNI_clearRecvNewDataFlag(i);\n                }\n                flags >>= 1;\n            }\n            MoveSendCmdToRecv();\n            RfuHandleReceiveCommand(0);\n            CallRfuFunc();\n            if (gRfu.nextChildBits && !gRfu.stopNewConnections)\n            {\n                sRfuDebug.unkFlag = FALSE;\n                rfu_clearSlot(TYPE_UNI_SEND | TYPE_UNI_RECV, gRfu.parentSendSlot);\n                for (i = 0; i < RFU_CHILD_MAX; i++)\n                {\n                    if ((gRfu.nextChildBits >> i) & 1)\n                        rfu_setRecvBuffer(TYPE_UNI, i, gRfu.childRecvBuffer[i], sizeof(gRfu.childRecvBuffer[i]));\n                }\n                SetLinkPlayerIdsFromSlots(gRfu.parentSlots, gRfu.parentSlots | gRfu.nextChildBits);\n                gRfu.incomingChild = gRfu.nextChildBits;\n                gRfu.parentSlots |= gRfu.nextChildBits;\n                gRfu.nextChildBits = 0;\n                rfu_UNI_setSendData(gRfu.parentSlots, gRfu.recvCmds, sizeof(gRfu.recvCmds));\n                gRfu.parentSendSlot = Rfu_GetIndexOfNewestChild(gRfu.parentSlots);\n                CreateTask(Task_PlayerExchangeUpdate, 0);\n            }\n        }\n        else\n        {\n            gRfu.parentMain2Failed = TRUE;\n            gRfu.runParentMain2 = FALSE;\n        }\n        gRfu.runParentMain2 = FALSE;\n    }\n    failed = gRfu.parentMain2Failed;\n    return gRfuLinkStatus->sendSlotUNIFlag ? failed & 1 : FALSE;\n}\n\nstatic void ChildBuildSendCmd(u16 *sendCmd, u8 *dst)\n{\n    s32 i;\n\n    if (sendCmd[0])\n    {\n        sendCmd[0] |= (gRfu.childSendCmdId << 5);\n        gRfu.childSendCmdId = (gRfu.childSendCmdId + 1) & 7;\n        for (i = 0; i < CMD_LENGTH - 1; i++)\n        {\n            dst[2 * i + 1] = sendCmd[i] >> 8;\n            dst[2 * i + 0] = sendCmd[i];\n        }\n    }\n    else\n    {\n        for (i = 0; i < 2 * (CMD_LENGTH - 1); i++)\n            dst[i] = 0;\n    }\n}\n\nstatic bool32 RfuMain1_Child(void)\n{\n    u8 i;\n    u8 j;\n    u8 recvBuf[MAX_RFU_PLAYERS * (2 * (CMD_LENGTH - 1))];\n    u8 sendBuf[2 * (CMD_LENGTH - 1)];\n    u8 status;\n\n    RfuRecvQueue_Dequeue(&gRfu.recvQueue, recvBuf);\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        for (j = 0; j < CMD_LENGTH - 1; j++)\n        {\n            gRecvCmds[i][j] = (recvBuf[i * COMM_SLOT_LENGTH + (j * 2) + 1] << 8)\n                             | recvBuf[i * COMM_SLOT_LENGTH + (j * 2) + 0];\n        }\n    }\n    RfuHandleReceiveCommand(0);\n    if (lman.childClockSlave_flag == 0 && gRfu.disconnectMode != RFU_DISCONNECT_NONE)\n    {\n        rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);\n        rfu_waitREQComplete();\n        status = RfuGetStatus();\n        if (status != RFU_STATUS_FATAL_ERROR\n         && status != RFU_STATUS_JOIN_GROUP_NO\n         && status != RFU_STATUS_LEAVE_GROUP)\n            RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_8);\n        rfu_clearAllSlot();\n        gReceivedRemoteLinkPlayers = FALSE;\n        gRfu.callback = NULL;\n        if (gRfu.disconnectMode == RFU_DISCONNECT_ERROR)\n        {\n            RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_8);\n            RfuSetErrorParams(F_RFU_ERROR_5 | F_RFU_ERROR_8);\n        }\n        lman.state = lman.next_state = 0;\n        gRfu.disconnectMode = RFU_DISCONNECT_NONE;\n    }\n    if (gRfu.childSendCount)\n    {\n        gRfu.childSendCount--;\n        CallRfuFunc();\n        ChildBuildSendCmd(gSendCmd, sendBuf);\n        RfuSendQueue_Enqueue(&gRfu.sendQueue, sendBuf);\n        for (i = 0; i < CMD_LENGTH - 1; i++)\n            gSendCmd[i] = 0;\n    }\n    return IsRfuRecvQueueEmpty();\n}\n\nstatic void HandleSendFailure(u8 unused, u32 flags)\n{\n    s32 i, j, temp;\n\n    const u8 *payload = gRfu.sendBlock.payload;\n    for (i = 0; i < gRfu.sendBlock.count; i++)\n    {\n        if (!(flags & 1))\n        {\n            sResendBlock16[0] = RFUCMD_SEND_BLOCK | i;\n            for (j = 0; j < CMD_LENGTH - 1; j++)\n            {\n                temp = j * 2;\n                sResendBlock16[j + 1] = (payload[(COMM_SLOT_LENGTH - 2) * i + temp + 1] << 8)\n                                       | payload[(COMM_SLOT_LENGTH - 2) * i + temp + 0];\n            }\n            for (j = 0; j < CMD_LENGTH - 1; j++)\n            {\n                temp = j * 2;\n                sResendBlock8[temp + 1] = sResendBlock16[j] >> 8;\n                sResendBlock8[temp + 0] = sResendBlock16[j];\n            }\n            RfuSendQueue_Enqueue(&gRfu.sendQueue, sResendBlock8);\n            gRfu.sendBlock.failedFlags |= (1 << i);\n        }\n        flags >>= 1;\n    }\n}\n\nvoid Rfu_SetBlockReceivedFlag(u8 linkPlayerId)\n{\n    if (gRfu.parentChild == MODE_PARENT && linkPlayerId != 0)\n        gRfu.numBlocksReceived[linkPlayerId] = 1;\n    else\n        gRfu.blockReceived[linkPlayerId] = TRUE;\n}\n\nvoid Rfu_ResetBlockReceivedFlag(u8 linkPlayerId)\n{\n    gRfu.blockReceived[linkPlayerId] = FALSE;\n    gRfu.recvBlock[linkPlayerId].receiving = RECV_STATE_READY;\n}\n\nstatic u8 LoadLinkPlayerIds(const u8 *ids)\n{\n    u8 i;\n\n    if (gRfu.parentChild == MODE_PARENT)\n        return FALSE;\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n        gRfu.linkPlayerIdx[i] = ids[i];\n    return ids[gRfu.childSlot];\n}\n\nstatic void SendKeysToRfu(void)\n{\n    static u8 heldKeyCount;\n    if (gReceivedRemoteLinkPlayers\n        && gHeldKeyCodeToSend != LINK_KEY_CODE_NULL\n        && gLinkTransferringData != TRUE)\n    {\n        heldKeyCount++;\n        gHeldKeyCodeToSend |= (heldKeyCount << 8);\n        RfuPrepareSendBuffer(RFUCMD_SEND_HELD_KEYS);\n    }\n}\n\nstruct RfuGameData *GetHostRfuGameData(void)\n{\n    return &gHostRfuGameData;\n}\n\nbool32 IsSendingKeysToRfu(void)\n{\n    return gRfu.callback == SendKeysToRfu;\n}\n\nvoid StartSendingKeysToRfu(void)\n{\n// This is the original symbol and field name, which is baked into the assert below\n#define Rfu gRfu\n#define RfuFunc callback\n    AGB_ASSERT_EX(Rfu.RfuFunc == NULL, ABSPATH(\"rfu.c\"), 1473);\n#undef RfuFunc\n#undef Rfu\n\n    gRfu.callback = SendKeysToRfu;\n}\n\nvoid ClearLinkRfuCallback(void)\n{\n    gRfu.callback = NULL;\n}\n\n/*\nstatic void Rfu_BerryBlenderSendHeldKeys(void)\n{\n    RfuPrepareSendBuffer(RFUCMD_BLENDER_SEND_KEYS);\n    if (GetMultiplayerId() == 0)\n        gSendCmd[BLENDER_COMM_ARROW_POS] = GetBlenderArrowPosition();\n    gBerryBlenderKeySendAttempts++;\n}\n\nvoid Rfu_SetBerryBlenderLinkCallback(void)\n{\n    if (gRfu.callback == NULL)\n        gRfu.callback = Rfu_BerryBlenderSendHeldKeys;\n}\n*/\n\nstatic void RfuHandleReceiveCommand(u8 unused)\n{\n    u16 i;\n    u16 j;\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        switch (gRecvCmds[i][0] & RFUCMD_MASK)\n        {\n        case RFUCMD_SEND_PLAYER_IDS_NEW:\n            if (gRfu.parentChild == MODE_CHILD && gReceivedRemoteLinkPlayers)\n                return;\n            // fallthrough\n        case RFUCMD_SEND_PLAYER_IDS:\n            if (gRfuLinkStatus->parentChild == MODE_CHILD)\n            {\n                gRfu.playerCount = gRecvCmds[i][1];\n                gRfu.multiplayerId = LoadLinkPlayerIds((u8 *)(gRecvCmds[i] + 2));\n            }\n            break;\n        case RFUCMD_SEND_BLOCK_INIT:\n            if (gRfu.recvBlock[i].receiving == RECV_STATE_READY)\n            {\n                gRfu.recvBlock[i].next = 0;\n                gRfu.recvBlock[i].count = gRecvCmds[i][1];\n                gRfu.recvBlock[i].owner = gRecvCmds[i][2];\n                gRfu.recvBlock[i].receivedFlags = 0;\n                gRfu.recvBlock[i].receiving = RECV_STATE_RECEIVING;\n                gRfu.blockReceived[i] = FALSE;\n            }\n            break;\n        case RFUCMD_SEND_BLOCK:\n            if (gRfu.recvBlock[i].receiving == RECV_STATE_RECEIVING)\n            {\n                gRfu.recvBlock[i].next = gRecvCmds[i][0] & ~RFUCMD_MASK;\n                gRfu.recvBlock[i].receivedFlags |= (1 << gRfu.recvBlock[i].next);\n                for (j = 0; j < 6; j++)\n                    gBlockRecvBuffer[i][gRfu.recvBlock[i].next * 6 + j] = gRecvCmds[i][j + 1];\n                if (gRfu.recvBlock[i].receivedFlags == sAllBlocksReceived[gRfu.recvBlock[i].count])\n                {\n                    gRfu.recvBlock[i].receiving = RECV_STATE_FINISHED;\n                    Rfu_SetBlockReceivedFlag(i);\n                    if (GetHostRfuGameData()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM) && gReceivedRemoteLinkPlayers && gRfu.parentChild == MODE_CHILD)\n                        ValidateAndReceivePokemonSioInfo(gBlockRecvBuffer);\n                }\n            }\n            break;\n        case RFUCMD_SEND_BLOCK_REQ:\n            Rfu_InitBlockSend(sBlockRequests[gRecvCmds[i][1]].address, (u16)sBlockRequests[gRecvCmds[i][1]].size);\n            break;\n        case RFUCMD_READY_CLOSE_LINK:\n            gRfu.readyCloseLink[i] = TRUE;\n            break;\n        case RFUCMD_READY_EXIT_STANDBY:\n            if (gRfu.resendExitStandbyCount == gRecvCmds[i][1])\n                gRfu.readyExitStandby[i] = TRUE;\n            break;\n        case RFUCMD_DISCONNECT:\n            if (gRfu.parentChild == MODE_CHILD)\n            {\n                // Disconnect child\n                if (gReceivedRemoteLinkPlayers)\n                {\n                    if (gRecvCmds[i][1] & gRfuLinkStatus->connSlotFlag)\n                    {\n                        gReceivedRemoteLinkPlayers = FALSE;\n                        rfu_LMAN_requestChangeAgbClockMaster();\n                        gRfu.disconnectMode = gRecvCmds[i][2];\n                    }\n                    gRfu.playerCount = gRecvCmds[i][3];\n                    ClearSelectedLinkPlayerIds(gRecvCmds[i][1]);\n                }\n            }\n            else\n            {\n                // Disconnect parent\n                RfuPrepareSendBuffer(RFUCMD_DISCONNECT_PARENT);\n                gSendCmd[1] = gRecvCmds[i][1];\n                gSendCmd[2] = gRecvCmds[i][2];\n                gSendCmd[3] = gRecvCmds[i][3];\n            }\n            break;\n        case RFUCMD_DISCONNECT_PARENT:\n            if (gRfu.parentChild == MODE_PARENT)\n            {\n                gRfu.disconnectSlots |= gRecvCmds[i][1];\n                gRfu.disconnectMode = gRecvCmds[i][2];\n                ClearSelectedLinkPlayerIds(gRecvCmds[i][1]);\n            }\n            break;\n      //case RFUCMD_BLENDER_SEND_KEYS:\n        case RFUCMD_SEND_HELD_KEYS:\n            gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];\n            break;\n        }\n        if (gRfu.parentChild == MODE_PARENT && gRfu.numBlocksReceived[i])\n        {\n            if (gRfu.numBlocksReceived[i] == 4)\n            {\n                gRfu.blockReceived[i] = TRUE;\n                gRfu.numBlocksReceived[i] = 0;\n            }\n            else\n                gRfu.numBlocksReceived[i]++;\n        }\n    }\n}\n\nstatic bool8 AreAllPlayersReadyToReceive(void)\n{\n    s32 i;\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        if (gRfu.recvBlock[i].receiving != RECV_STATE_READY)\n            return FALSE;\n    }\n    return TRUE;\n}\n\nstatic bool8 AreAllPlayersFinishedReceiving(void)\n{\n    s32 i;\n\n    for (i = 0; i < gRfu.playerCount; i++)\n    {\n        if (gRfu.recvBlock[i].receiving != RECV_STATE_FINISHED || gRfu.blockReceived[i] != TRUE)\n            return FALSE;\n    }\n    return TRUE;\n}\n\nstatic void ResetSendDataManager(struct RfuBlockSend *data)\n{\n    data->next = 0;\n    data->count = 0;\n    data->payload = NULL;\n    data->receivedFlags = 0;\n    data->sending = FALSE;\n    data->owner = 0;\n    data->receiving = RECV_STATE_READY;\n}\n\nu8 Rfu_GetBlockReceivedStatus(void)\n{\n    u8 flags = 0;\n    s32 i;\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        if (gRfu.recvBlock[i].receiving == RECV_STATE_FINISHED && gRfu.blockReceived[i] == TRUE)\n            flags |= (1 << i);\n    }\n    return flags;\n}\n\nstatic void RfuPrepareSendBuffer(u16 command)\n{\n    u8 i;\n    u8 *buff;\n    u8 tmp;\n\n    gSendCmd[0] = command;\n    switch (command)\n    {\n    case RFUCMD_SEND_BLOCK_INIT:\n        gSendCmd[1] = gRfu.sendBlock.count;\n        gSendCmd[2] = gRfu.sendBlock.owner + 0x80;\n        break;\n    case RFUCMD_SEND_BLOCK_REQ:\n        if (AreAllPlayersReadyToReceive())\n            gSendCmd[1] = gRfu.blockRequestType;\n        break;\n    case RFUCMD_SEND_PLAYER_IDS:\n    case RFUCMD_SEND_PLAYER_IDS_NEW:\n        tmp = gRfu.parentSlots ^ gRfu.disconnectSlots;\n        gRfu.playerCount = sPlayerBitsToCount[tmp] + 1;\n        gSendCmd[1] = gRfu.playerCount;\n        buff = (u8 *)&gSendCmd[2];\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n            buff[i] = gRfu.linkPlayerIdx[i];\n        break;\n    case RFUCMD_READY_EXIT_STANDBY:\n    case RFUCMD_READY_CLOSE_LINK:\n        gSendCmd[1] = gRfu.resendExitStandbyCount;\n        break;\n    case RFUCMD_SEND_PACKET:\n        for (i = 0; i < RFU_PACKET_SIZE; i++)\n            gSendCmd[1 + i] = gRfu.packet[i];\n        break;\n    case RFUCMD_SEND_HELD_KEYS:\n        gSendCmd[1] = gHeldKeyCodeToSend;\n        break;\n    case RFUCMD_DISCONNECT_PARENT:\n    case RFUCMD_DISCONNECT:\n        break;\n    }\n}\n\nvoid Rfu_SendPacket(void *data)\n{\n    if (IsSendCmdComplete() && !RfuHasErrored())\n    {\n        memcpy(gRfu.packet, data, sizeof(gRfu.packet));\n        RfuPrepareSendBuffer(RFUCMD_SEND_PACKET);\n    }\n}\n\nbool32 Rfu_InitBlockSend(const u8 *src, size_t size)\n{\n    bool8 round;\n    AGB_ASSERT_EX(size<=252, ABSPATH(\"rfu.c\"), 1793);\n\n    if (gRfu.callback != NULL)\n        return FALSE;\n    if (gSendCmd[0] != 0)\n        return FALSE;\n    if (gRfu.sendBlock.sending)\n    {\n        sRfuDebug.blockSendTime++;\n        return FALSE;\n    }\n    round = (size % 12) != 0;\n    gRfu.sendBlock.owner = GetMultiplayerId();\n    gRfu.sendBlock.sending = TRUE;\n    gRfu.sendBlock.count = (size / 12) + round;\n    gRfu.sendBlock.next = 0;\n    if (size > BLOCK_BUFFER_SIZE)\n        gRfu.sendBlock.payload = src;\n    else\n    {\n        if (src != gBlockSendBuffer)\n            memcpy(gBlockSendBuffer, src, size);\n        gRfu.sendBlock.payload = gBlockSendBuffer;\n    }\n    RfuPrepareSendBuffer(RFUCMD_SEND_BLOCK_INIT);\n    gRfu.callback = HandleBlockSend;\n    gRfu.sendBlockInitDelay = 0;\n    return TRUE;\n}\n\nstatic void HandleBlockSend(void)\n{\n    if (IsSendCmdComplete())\n    {\n        RfuPrepareSendBuffer(RFUCMD_SEND_BLOCK_INIT);\n        if (gRfu.parentChild == MODE_PARENT)\n        {\n            if (++gRfu.sendBlockInitDelay > 2)\n                gRfu.callback = SendNextBlock;\n        }\n        else\n        {\n            if ((gRecvCmds[GetMultiplayerId()][0] & RFUCMD_MASK) == RFUCMD_SEND_BLOCK_INIT)\n                gRfu.callback = SendNextBlock;\n        }\n    }\n}\nstatic void SendNextBlock(void)\n{\n    s32 i;\n    const u8 *src = gRfu.sendBlock.payload;\n    gSendCmd[0] = RFUCMD_SEND_BLOCK | gRfu.sendBlock.next;\n    for (i = 0; i < CMD_LENGTH - 1; i++)\n        gSendCmd[i + 1] = (src[(i << 1) + gRfu.sendBlock.next * 12 + 1] << 8) | src[(i << 1) + gRfu.sendBlock.next * 12 + 0];\n    gRfu.sendBlock.next++;\n    if (gRfu.sendBlock.count <= gRfu.sendBlock.next)\n    {\n        gRfu.sendBlock.sending = FALSE;\n        gRfu.callback = SendLastBlock;\n    }\n}\n\nstatic void SendLastBlock(void)\n{\n    const u8 *src = gRfu.sendBlock.payload;\n    u8 mpId = GetMultiplayerId();\n    s32 i;\n    if (gRfu.parentChild == MODE_CHILD)\n    {\n        gSendCmd[0] = RFUCMD_SEND_BLOCK | (gRfu.sendBlock.count - 1);\n        for (i = 0; i < CMD_LENGTH - 1; i++)\n            gSendCmd[i + 1] = (src[(i << 1) + (gRfu.sendBlock.count - 1) * 12 + 1] << 8) | src[(i << 1) + (gRfu.sendBlock.count - 1) * 12 + 0];\n        if ((u8)gRecvCmds[mpId][0] == gRfu.sendBlock.count - 1)\n        {\n            if (gRfu.recvBlock[mpId].receivedFlags != sAllBlocksReceived[gRfu.recvBlock[mpId].count])\n            {\n                HandleSendFailure(mpId, gRfu.recvBlock[mpId].receivedFlags);\n                sRfuDebug.blockSendFailures++;\n            }\n            else\n                gRfu.callback = NULL;\n        }\n    }\n    else\n        gRfu.callback = NULL;\n}\n\nbool8 Rfu_SendBlockRequest(u8 blockRequestType)\n{\n    gRfu.blockRequestType = blockRequestType;\n    RfuPrepareSendBuffer(RFUCMD_SEND_BLOCK_REQ);\n    return TRUE;\n}\n\nstatic void RfuShutdownAfterDisconnect(void)\n{\n    rfu_clearAllSlot();\n    rfu_LMAN_powerDownRFU();\n    gReceivedRemoteLinkPlayers = FALSE;\n    gRfu.isShuttingDown = TRUE;\n    gRfu.callback = NULL;\n}\n\nstatic void DisconnectRfu(void)\n{\n    rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);\n    rfu_waitREQComplete();\n    RfuShutdownAfterDisconnect();\n}\n\nstatic void TryDisconnectRfu(void)\n{\n    if (gRfu.parentChild == MODE_CHILD)\n    {\n        rfu_LMAN_requestChangeAgbClockMaster();\n        gRfu.disconnectMode = RFU_DISCONNECT_NORMAL;\n    }\n    else\n        gRfu.callback = DisconnectRfu;\n}\n\nvoid LinkRfu_FatalError(void)\n{\n    rfu_LMAN_requestChangeAgbClockMaster();\n    gRfu.disconnectMode = RFU_DISCONNECT_ERROR;\n    gRfu.disconnectSlots = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;\n}\n\n// RFU equivalent of LinkCB_WaitCloseLink\nstatic void WaitAllReadyToCloseLink(void)\n{\n    s32 i;\n    u8 playerCount = gRfu.playerCount;\n    s32 count = 0;\n\n    // Wait for all players to be ready\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        if (gRfu.readyCloseLink[i])\n            count++;\n    }\n    if (count == playerCount)\n    {\n        // All ready, close link\n        gBattleTypeFlags &= ~(BATTLE_TYPE_LINK_IN_BATTLE | 0xFFFF0000);\n        if (gRfu.parentChild == MODE_CHILD)\n        {\n            gRfu.errorState = RFU_ERROR_STATE_DISCONNECTING;\n            TryDisconnectRfu();\n        }\n        else\n            gRfu.callback = TryDisconnectRfu;\n    }\n}\n\nstatic void SendReadyCloseLink(void)\n{\n    if (IsSendCmdComplete() && !gRfu.playerExchangeActive)\n    {\n        RfuPrepareSendBuffer(RFUCMD_READY_CLOSE_LINK);\n        gRfu.callback = WaitAllReadyToCloseLink;\n    }\n}\n\nstatic void Task_TryReadyCloseLink(u8 taskId)\n{\n    if (gRfu.callback == NULL)\n    {\n        gRfu.stopNewConnections = TRUE;\n        gRfu.callback = SendReadyCloseLink;\n        DestroyTask(taskId);\n    }\n}\n\nvoid Rfu_SetCloseLinkCallback(void)\n{\n    if (!FuncIsActiveTask(Task_TryReadyCloseLink))\n        CreateTask(Task_TryReadyCloseLink, 5);\n}\n\nstatic void SendReadyExitStandbyUntilAllReady(void)\n{\n    u8 playerCount;\n    u8 i;\n\n    if (GetMultiplayerId() != 0) // child\n    {\n        if (gRfu.recvQueue.count == 0 && gRfu.resendExitStandbyTimer > 60)\n        {\n            RfuPrepareSendBuffer(RFUCMD_READY_EXIT_STANDBY);\n            gRfu.resendExitStandbyTimer = 0;\n        }\n    }\n    playerCount = GetLinkPlayerCount();\n    for (i = 0; i < playerCount; i++)\n    {\n        if (!gRfu.readyExitStandby[i])\n            break;\n    }\n    if (i == playerCount)\n    {\n        for (i = 0; i < MAX_RFU_PLAYERS; i++)\n            gRfu.readyExitStandby[i] = FALSE;\n        gRfu.resendExitStandbyCount++;\n        gRfu.callback = NULL;\n    }\n    gRfu.resendExitStandbyTimer++;\n}\n\nstatic void LinkLeaderReadyToExitStandby(void)\n{\n    if (gRfu.recvQueue.count == 0 && IsSendCmdComplete())\n    {\n        RfuPrepareSendBuffer(RFUCMD_READY_EXIT_STANDBY);\n        gRfu.callback = SendReadyExitStandbyUntilAllReady;\n    }\n}\n\n// RFU equivalent of LinkCB_Standby and LinkCB_StandbyForAll\nstatic void Rfu_LinkStandby(void)\n{\n    u8 i;\n    u8 playerCount;\n\n    if (GetMultiplayerId() != 0)\n    {\n        // Not link leader, send exit standby when ready\n        if (gRfu.recvQueue.count == 0 && IsSendCmdComplete())\n        {\n            RfuPrepareSendBuffer(RFUCMD_READY_EXIT_STANDBY);\n            gRfu.callback = SendReadyExitStandbyUntilAllReady;\n        }\n    }\n    else\n    {\n        // Link leader, wait for all members to send exit ready\n        playerCount = GetLinkPlayerCount();\n        for (i = 1; i < playerCount; i++)\n        {\n            if (!gRfu.readyExitStandby[i])\n                break;\n        }\n        if (i == playerCount)\n        {\n            if (gRfu.recvQueue.count == 0 && IsSendCmdComplete())\n            {\n                RfuPrepareSendBuffer(RFUCMD_READY_EXIT_STANDBY);\n                gRfu.callback = LinkLeaderReadyToExitStandby;\n            }\n        }\n    }\n}\n\nvoid Rfu_SetLinkStandbyCallback(void)\n{\n    if (gRfu.callback == NULL)\n    {\n        gRfu.callback = Rfu_LinkStandby;\n        gRfu.resendExitStandbyTimer = 0;\n    }\n}\n\nbool32 IsRfuSerialNumberValid(u32 serialNo)\n{\n    s32 i;\n    for (i = 0; sAcceptedSerialNos[i] != serialNo; i++)\n    {\n        if (sAcceptedSerialNos[i] == RFU_SERIAL_END)\n            return FALSE;\n    }\n    return TRUE;\n}\n\nu8 Rfu_SetLinkRecovery(bool32 enable)\n{\n    if (!enable)\n        return rfu_LMAN_setLinkRecovery(FALSE, 0);\n    rfu_LMAN_setLinkRecovery(TRUE, 600);\n    return 0;\n}\n\nvoid Rfu_StopPartnerSearch(void)\n{\n    gRfu.stopNewConnections = TRUE;\n    rfu_LMAN_stopManager(FALSE);\n}\n\nu8 Rfu_GetMultiplayerId(void)\n{\n    if (gRfu.parentChild == MODE_PARENT)\n        return 0;\n    return gRfu.multiplayerId;\n}\n\nu8 Rfu_GetLinkPlayerCount(void)\n{\n    return gRfu.playerCount;\n}\n\nbool8 IsLinkRfuTaskFinished(void)\n{\n    return gRfu.callback != NULL ? FALSE : TRUE;\n}\n\nstatic void CallRfuFunc(void)\n{\n    if (gRfu.callback != NULL)\n        gRfu.callback();\n}\n\nstatic bool8 CheckForLeavingGroupMembers(void)\n{\n    s32 i;\n    bool8 memberLeft = FALSE;\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (gRfu.partnerSendStatuses[i] < RFU_STATUS_JOIN_GROUP_OK\n         || gRfu.partnerSendStatuses[i] > RFU_STATUS_JOIN_GROUP_NO)\n        {\n            if (gRfuSlotStatusNI[i]->recv.state == SLOT_STATE_RECV_SUCCESS\n             || gRfuSlotStatusNI[i]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN)\n            {\n                if (gRfu.partnerRecvStatuses[i] == RFU_STATUS_LEAVE_GROUP_NOTICE)\n                {\n                    gRfu.partnerSendStatuses[i] = RFU_STATUS_LEAVE_GROUP;\n                    gRfu.partnerRecvStatuses[i] = RFU_STATUS_CHILD_LEAVE_READY;\n                    rfu_clearSlot(TYPE_NI_RECV, i);\n                    rfu_NI_setSendData(1 << i, 8, &gRfu.partnerSendStatuses[i], 1);\n                    memberLeft = TRUE;\n                }\n\n            }\n            else if (gRfuSlotStatusNI[gRfu.childSlot]->recv.state == SLOT_STATE_RECV_FAILED)\n            {\n                rfu_clearSlot(TYPE_NI_RECV, i);\n            }\n        }\n    }\n    return memberLeft;\n}\n\nbool32 RfuTryDisconnectLeavingChildren(void)\n{\n    u8 childrenLeaving = 0;\n    s32 i;\n\n    // Check all children, get those waiting to be disconnected\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (gRfu.partnerRecvStatuses[i] == RFU_STATUS_CHILD_LEAVE)\n        {\n            childrenLeaving |= (1 << i);\n            gRfu.partnerRecvStatuses[i] = RFU_STATUS_OK;\n        }\n    }\n\n    // Disconnect any leaving children\n    if (childrenLeaving)\n    {\n        rfu_REQ_disconnect(childrenLeaving);\n        rfu_waitREQComplete();\n    }\n\n    // Return true if any children have left or are still waiting to leave\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (gRfu.partnerRecvStatuses[i] == RFU_STATUS_CHILD_LEAVE_READY\n         || gRfu.partnerRecvStatuses[i] == RFU_STATUS_CHILD_LEAVE)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nbool32 HasTrainerLeftPartnersList(u16 trainerId, const u8 *name)\n{\n    u8 idx = GetPartnerIndexByNameAndTrainerID(name, trainerId);\n    if (idx == 0xFF)\n        return TRUE;\n    if (gRfu.partnerSendStatuses[idx] == RFU_STATUS_LEAVE_GROUP)\n        return TRUE;\n    return FALSE;\n}\n\nvoid SendRfuStatusToPartner(u8 status, u16 trainerId, const u8 *name)\n{\n    u8 idx = GetPartnerIndexByNameAndTrainerID(name, trainerId);\n    gRfu.partnerSendStatuses[idx] = status;\n    rfu_clearSlot(TYPE_NI_SEND, idx);\n    rfu_NI_setSendData(1 << idx, 8, &gRfu.partnerSendStatuses[idx], 1);\n}\n\nvoid SendLeaveGroupNotice(void)\n{\n    gRfu.sendStatus = RFU_STATUS_LEAVE_GROUP_NOTICE;\n    rfu_clearSlot(TYPE_NI_SEND, gRfu.childSlot);\n    rfu_NI_setSendData(1 << gRfu.childSlot, 8, &gRfu.sendStatus, 1);\n}\n\nu32 WaitSendRfuStatusToPartner(u16 trainerId, const u8 *name)\n{\n    u8 idx = GetPartnerIndexByNameAndTrainerID(name, trainerId);\n    if (idx == 0xFF)\n        return 2;\n    if (gRfuSlotStatusNI[idx]->send.state == SLOT_STATE_READY)\n        return 1;\n    return 0;\n}\n\nstatic void UpdateChildStatuses(void)\n{\n    s32 i;\n\n    CheckForLeavingGroupMembers();\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (gRfuSlotStatusNI[i]->send.state == SLOT_STATE_SEND_SUCCESS\n         || gRfuSlotStatusNI[i]->send.state == SLOT_STATE_SEND_FAILED)\n        {\n            if (gRfu.partnerRecvStatuses[i] == RFU_STATUS_CHILD_LEAVE_READY)\n                gRfu.partnerRecvStatuses[i] = RFU_STATUS_CHILD_LEAVE;\n            rfu_clearSlot(TYPE_NI_SEND, i);\n        }\n    }\n}\n\nstatic s32 GetJoinGroupStatus(void)\n{\n    s32 status = RFU_STATUS_OK;\n    if (gRfu.sendStatus == RFU_STATUS_LEAVE_GROUP_NOTICE)\n    {\n        if (gRfuSlotStatusNI[gRfu.childSlot]->send.state == SLOT_STATE_SEND_SUCCESS\n         || gRfuSlotStatusNI[gRfu.childSlot]->send.state == SLOT_STATE_SEND_FAILED)\n            rfu_clearSlot(TYPE_NI_SEND, gRfu.childSlot);\n    }\n    if (gRfuSlotStatusNI[gRfu.childSlot]->recv.state == SLOT_STATE_RECV_SUCCESS\n     || gRfuSlotStatusNI[gRfu.childSlot]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN)\n    {\n        rfu_clearSlot(TYPE_NI_RECV, gRfu.childSlot);\n        RfuSetStatus(gRfu.recvStatus, 0);\n        status = gRfu.recvStatus;\n    }\n    else if (gRfuSlotStatusNI[gRfu.childSlot]->recv.state == SLOT_STATE_RECV_FAILED)\n    {\n        rfu_clearSlot(TYPE_NI_RECV, gRfu.childSlot);\n        status = RFU_STATUS_JOIN_GROUP_NO;\n    }\n    return status;\n}\n\n#define tState data[0]\n\nstatic void Task_PlayerExchange(u8 taskId)\n{\n    s32 i;\n\n    if (gRfu.status == RFU_STATUS_FATAL_ERROR || gRfu.status == RFU_STATUS_CONNECTION_ERROR)\n    {\n        gRfu.playerExchangeActive = FALSE;\n        DestroyTask(taskId);\n    }\n    switch (gTasks[taskId].tState)\n    {\n    case 0:\n        if (AreAllPlayersReadyToReceive())\n        {\n            ResetBlockReceivedFlags();\n            LocalLinkPlayerToBlock();\n            gTasks[taskId].tState++;\n        }\n        break;\n    case 1:\n        if (gRfu.parentChild == MODE_PARENT)\n        {\n            if (gReceivedRemoteLinkPlayers)\n                RfuPrepareSendBuffer(RFUCMD_SEND_PLAYER_IDS_NEW);\n            else\n                RfuPrepareSendBuffer(RFUCMD_SEND_PLAYER_IDS);\n            gTasks[taskId].tState = 101;\n        }\n        else\n            gTasks[taskId].tState = 2;\n        break;\n    case 101:\n        if (IsSendCmdComplete())\n            gTasks[taskId].tState = 2;\n        break;\n    case 2:\n        if (gRfu.playerCount)\n            gTasks[taskId].tState++;\n        break;\n    case 3:\n        if (gRfu.parentChild == MODE_PARENT)\n        {\n            if (AreAllPlayersReadyToReceive())\n            {\n                gRfu.blockRequestType = BLOCK_REQ_SIZE_NONE;\n                RfuPrepareSendBuffer(RFUCMD_SEND_BLOCK_REQ);\n                gTasks[taskId].tState++;\n            }\n        }\n        else\n            gTasks[taskId].tState++;\n        break;\n    case 4:\n        if (AreAllPlayersFinishedReceiving())\n            gTasks[taskId].tState++;\n        break;\n    case 5:\n        for (i = 0; i < gRfu.playerCount; i++)\n        {\n            LinkPlayerFromBlock(i);\n            Rfu_ResetBlockReceivedFlag(i);\n        }\n        gTasks[taskId].tState++;\n        break;\n    case 6:\n        DestroyTask(taskId);\n        gReceivedRemoteLinkPlayers = TRUE;\n        gRfu.playerExchangeActive = FALSE;\n        rfu_LMAN_setLinkRecovery(1, 600);\n        if (gRfu.newChildQueue)\n        {\n            for (i = 0; i < RFU_CHILD_MAX; i++)\n            {\n                if ((gRfu.newChildQueue >> i) & 1)\n                {\n                    gRfu.nextChildBits = 1 << i;\n                    gRfu.newChildQueue ^= (1 << i);\n                }\n            }\n        }\n        break;\n    }\n}\n\nstatic void ClearSelectedLinkPlayerIds(u16 selected)\n{\n    s32 i;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if ((selected >> i) & 1)\n            gRfu.linkPlayerIdx[i] = 0;\n    }\n}\n\nstatic void ReceiveRfuLinkPlayers(const struct SioInfo *sioInfo)\n{\n    s32 i;\n    gRfu.playerCount = sioInfo->playerCount;\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n        gRfu.linkPlayerIdx[i] = sioInfo->linkPlayerIdx[i];\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        gLinkPlayers[i] = sioInfo->linkPlayers[i];\n        ConvertLinkPlayerName(gLinkPlayers + i);\n    }\n}\n\n// Could be relocated to top of file, but would also require relocating assert strings\nstatic const char sASCII_PokemonSioInfo[] = \"PokemonSioInfo\";\nstatic const u8 sText_Akito[] = _(\"　あきと\"); // Presumably \"Akito Mori\", one of Game Freak's programmers\nstatic const char sASCII_LinkLossDisconnect[] = \"LINK LOSS DISCONNECT!\";\nstatic const char sASCII_LinkLossRecoveryNow[] = \"LINK LOSS RECOVERY NOW\";\nALIGNED(4) static const char sASCII_30Spaces[] = {\"                              \"};\nstatic const char sASCII_15Spaces[] = {\"               \"};\nstatic const char sASCII_8Spaces[] = {\"        \"};\nALIGNED(4) static const char sASCII_Space[] = {\" \"};\nstatic const char sASCII_Asterisk[] = {\"*\"};\nstatic const char sASCII_NowSlot[] = \"NOWSLOT\";\n\nstatic const char sASCII_ClockCmds[][12] = {\n    \"           \",\n    \"CLOCK DRIFT\",\n    \"BUSY SEND  \",\n    \"CMD REJECT \",\n    \"CLOCK SLAVE\"\n};\n\nstatic const char sASCII_ChildParentSearch[][8] = {\n    \"CHILD \",\n    \"PARENT\",\n    \"SEARCH\"\n};\n\nstatic void ValidateAndReceivePokemonSioInfo(void *recvBuffer)\n{\n    if (strcmp(sASCII_PokemonSioInfo, recvBuffer) == 0)\n    {\n        ReceiveRfuLinkPlayers(recvBuffer);\n        CpuFill16(0, recvBuffer, sizeof(struct SioInfo));\n        ResetBlockReceivedFlag(0);\n    }\n}\n\n// Equivalent to Task_PlayerExchange, but for when new children arrive after the first exchange\nstatic void Task_PlayerExchangeUpdate(u8 taskId)\n{\n    s32 i;\n    struct LinkPlayerBlock *playerBlock;\n    struct SioInfo *sio;\n    u8 playerId = gRfu.linkPlayerIdx[sSlotToLinkPlayerTableId[gRfu.incomingChild]];\n    if (gRfu.status == RFU_STATUS_FATAL_ERROR || gRfu.status == RFU_STATUS_CONNECTION_ERROR)\n    {\n        gRfu.playerExchangeActive = FALSE;\n        DestroyTask(taskId);\n    }\n    switch (gTasks[taskId].tState)\n    {\n    case 0:\n        if (IsSendCmdComplete())\n        {\n            ResetBlockReceivedFlag(playerId);\n            RfuPrepareSendBuffer(RFUCMD_SEND_PLAYER_IDS_NEW);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case 1:\n        if (IsSendCmdComplete())\n            gTasks[taskId].tState++;\n        break;\n    case 2:\n        if ((GetBlockReceivedStatus() >> playerId) & 1)\n        {\n            ResetBlockReceivedFlag(playerId);\n            playerBlock = (struct LinkPlayerBlock *)gBlockRecvBuffer[playerId];\n            gLinkPlayers[playerId] = playerBlock->linkPlayer;\n            ConvertLinkPlayerName(&gLinkPlayers[playerId]);\n            gTasks[taskId].tState++;\n        }\n        break;\n    case 3:\n        // Prepare send block\n        sio = (struct SioInfo *)gBlockSendBuffer;\n        memcpy(sio->magic, sASCII_PokemonSioInfo, sizeof sASCII_PokemonSioInfo);\n        sio->playerCount = gRfu.playerCount;\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n            sio->linkPlayerIdx[i] = gRfu.linkPlayerIdx[i];\n        memcpy(sio->linkPlayers, gLinkPlayers, sizeof gLinkPlayers);\n        gTasks[taskId].tState++;\n        // fallthrough\n    case 4:\n        sio = (struct SioInfo *)gBlockSendBuffer;\n        sio->playerCount = gRfu.playerCount;\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n            sio->linkPlayerIdx[i] = gRfu.linkPlayerIdx[i];\n        memcpy(sio->linkPlayers, gLinkPlayers, sizeof gLinkPlayers);\n        if (SendBlock(0, gBlockSendBuffer, 0xa0))\n            gTasks[taskId].tState++;\n        break;\n    case 5:\n        if (IsLinkTaskFinished() && GetBlockReceivedStatus() & 1)\n        {\n            CpuFill16(0, gBlockRecvBuffer, sizeof(struct SioInfo));\n            ResetBlockReceivedFlag(0);\n            gRfu.playerExchangeActive = FALSE;\n            if (gRfu.newChildQueue)\n            {\n                for (i = 0; i < RFU_CHILD_MAX; i++)\n                {\n                    if ((gRfu.newChildQueue >> i) & 1)\n                    {\n                        gRfu.nextChildBits = 1 << i;\n                        gRfu.newChildQueue ^= (1 << i);\n                        gRfu.playerExchangeActive = TRUE;\n                        break;\n                    }\n                }\n            }\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\n// Equivalent to Task_PlayerExchange but for chatting with a Union Room partner\nstatic void Task_PlayerExchangeChat(u8 taskId)\n{\n    if (gRfu.status == RFU_STATUS_FATAL_ERROR || gRfu.status == RFU_STATUS_CONNECTION_ERROR)\n        DestroyTask(taskId);\n    switch (gTasks[taskId].tState)\n    {\n    case 0:\n        if (gRfu.playerCount != 0)\n        {\n            LocalLinkPlayerToBlock();\n            SendBlock(0, gBlockSendBuffer, sizeof(struct LinkPlayerBlock));\n            gTasks[taskId].tState++;\n        }\n        break;\n    case 1:\n        if (IsLinkTaskFinished())\n            gTasks[taskId].tState++;\n        break;\n    case 2:\n        if (GetBlockReceivedStatus() & 1)\n        {\n            ReceiveRfuLinkPlayers((const struct SioInfo *)gBlockRecvBuffer);\n            ResetBlockReceivedFlag(0);\n            gReceivedRemoteLinkPlayers = TRUE;\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void RfuCheckErrorStatus(void)\n{\n    if (gRfu.errorState == RFU_ERROR_STATE_OCCURRED && lman.childClockSlave_flag == 0)\n    {\n        if (gMain.callback2 == CB2_MysteryGiftEReader)\n            gWirelessCommType = 2;\n        SetMainCallback2(CB2_LinkError);\n        gMain.savedCallback = CB2_LinkError;\n        SetLinkErrorFromRfu(\n            (gRfu.errorInfo << 16) | (gRfu.errorParams[0] << 8) | gRfu.errorParams[1],\n            gRfu.recvQueue.count,\n            gRfu.sendQueue.count,\n            RfuGetStatus() == RFU_STATUS_CONNECTION_ERROR\n        );\n        gRfu.errorState = RFU_ERROR_STATE_PROCESSED;\n        CloseLink();\n    }\n    else if (gRfu.sendQueue.full == TRUE || gRfu.recvQueue.full == TRUE)\n    {\n        if (lman.childClockSlave_flag)\n            rfu_LMAN_requestChangeAgbClockMaster();\n        RfuSetStatus(RFU_STATUS_FATAL_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_6 | F_RFU_ERROR_7);\n        RfuSetErrorParams(F_RFU_ERROR_5 | F_RFU_ERROR_6 | F_RFU_ERROR_7);\n    }\n}\n\nstatic void RfuMain1_UnionRoom(void)\n{\n    if (lman.parent_child == MODE_PARENT)\n    {\n        rfu_REQ_recvData();\n        rfu_waitREQComplete();\n        rfu_LMAN_REQ_sendData(RFU_CHILD_CLOCK_SLAVE_OFF);\n    }\n}\n\n// Rfu equivalent of LinkMain1\nbool32 RfuMain1(void)\n{\n    bool32 retval = FALSE;\n    gRfu.parentId = 0;\n    rfu_LMAN_manager_entity(Random());\n    if (!gRfu.isShuttingDown)\n    {\n        switch (gRfu.parentChild)\n        {\n        case MODE_PARENT:\n            RfuMain1_Parent();\n            break;\n        case MODE_CHILD:\n            retval = RfuMain1_Child();\n            break;\n        case MODE_P_C_SWITCH:\n            RfuMain1_UnionRoom();\n            break;\n        }\n    }\n    return retval;\n}\n\n// Rfu equivalent of LinkMain2\nbool32 RfuMain2(void)\n{\n    bool32 retval = FALSE;\n    if (!gRfu.isShuttingDown)\n    {\n        if (gRfu.parentChild == MODE_PARENT)\n            retval = RfuMain2_Parent();\n        RfuCheckErrorStatus();\n    }\n    return retval;\n}\n\nstatic void SetHostRfuUsername(void)\n{\n    StringCopy(gHostRfuUsername, gSaveBlock2Ptr->playerName);\n}\n\nvoid ResetHostRfuGameData(void)\n{\n    memset(&gHostRfuGameData, 0, RFU_GAME_NAME_LENGTH);\n    InitHostRfuGameData(&gHostRfuGameData, ACTIVITY_NONE, FALSE, 0);\n}\n\nvoid SetHostRfuGameData(u8 activity, u32 partnerInfo, u32 startedActivity)\n{\n    InitHostRfuGameData(&gHostRfuGameData, activity, startedActivity, partnerInfo);\n}\n\nvoid SetHostRfuWonderFlags(bool32 hasNews, bool32 hasCard)\n{\n    gHostRfuGameData.compatibility.hasNews = hasNews;\n    gHostRfuGameData.compatibility.hasCard = hasCard;\n}\n\nvoid SetTradeBoardRegisteredMonInfo(u32 type, u32 species, u32 level)\n{\n    gHostRfuGameData.tradeType = type;\n    gHostRfuGameData.tradeSpecies = species;\n    gHostRfuGameData.tradeLevel = level;\n}\n\nvoid UpdateGameData_GroupLockedIn(bool8 startedActivity)\n{\n    gHostRfuGameData.startedActivity = startedActivity;\n    rfu_REQ_configGameData(0, RFU_SERIAL_GAME, (void *)&gHostRfuGameData, gHostRfuUsername);\n}\n\nvoid UpdateGameData_SetActivity(u8 activity, u32 partnerInfo, u32 startedActivity)\n{\n    if (activity != ACTIVITY_NONE)\n        SetHostRfuGameData(activity, partnerInfo, startedActivity);\n    rfu_REQ_configGameData(0, RFU_SERIAL_GAME, (void *)&gHostRfuGameData, gHostRfuUsername);\n}\n\nvoid SetUnionRoomChatPlayerData(u32 numPlayers)\n{\n    s32 i;\n    u32 numConnectedChildren;\n    u32 partnerInfo;\n    s32 slots;\n\n    if (GetHostRfuGameData()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM))\n    {\n        numConnectedChildren = 0;\n        partnerInfo = 0;\n        slots = gRfu.parentSlots ^ gRfu.disconnectSlots;\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n        {\n            if ((slots >> i) & 1)\n            {\n                // Only trainerId is shifted by the number of children, so the active flag and gender\n                // are only ever set for the first child\n                partnerInfo |= ((PINFO_ACTIVE_FLAG\n                             | ((gLinkPlayers[gRfu.linkPlayerIdx[i]].gender & 1) << PINFO_GENDER_SHIFT)\n                             | (gLinkPlayers[gRfu.linkPlayerIdx[i]].trainerId & PINFO_TID_MASK)) << (numConnectedChildren * 8));\n                numConnectedChildren++;\n                if (numConnectedChildren == numPlayers - 1)\n                    break;\n            }\n        }\n        UpdateGameData_SetActivity(ACTIVITY_CHAT | IN_UNION_ROOM, partnerInfo, FALSE);\n    }\n}\n\nstatic void RfuSetErrorParams(u32 errorInfo)\n{\n    if (gRfu.errorState == RFU_ERROR_STATE_NONE)\n    {\n        gRfu.errorParams[0] = lman.param[0];\n        gRfu.errorParams[1] = lman.param[1];\n        gRfu.errorInfo = errorInfo;\n        gRfu.errorState = RFU_ERROR_STATE_OCCURRED;\n    }\n}\n\nstatic void ResetErrorState(void)\n{\n    gRfu.errorState = RFU_ERROR_STATE_NONE;\n}\n\nvoid RfuSetIgnoreError(bool32 enable)\n{\n    if (!enable)\n        gRfu.errorState = RFU_ERROR_STATE_NONE;\n    else\n        gRfu.errorState = RFU_ERROR_STATE_IGNORE;\n}\n\nstatic void DisconnectNewChild(void)\n{\n    SendDisconnectCommand(lman.acceptSlot_flag, RFU_DISCONNECT_ERROR);\n    gRfu.callback = NULL;\n}\n\nstatic void StartDisconnectNewChild(void)\n{\n    gRfu.callback = DisconnectNewChild;\n}\n\nstatic void LinkManagerCB_Parent(u8 msg, u8 param_count)\n{\n    u8 i;\n    u8 disconnectFlag = 0;\n    switch (msg)\n    {\n    case LMAN_MSG_INITIALIZE_COMPLETED:\n        gRfu.state = RFUSTATE_PARENT_CONNECT;\n        break;\n    case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED:\n        break;\n    case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED:\n        ParentResetChildRecvMetadata(lman.param[0]);\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n        {\n            if ((lman.param[0] >> i) & 1)\n            {\n                struct RfuGameData *structPtr = (void *)&gRfuLinkStatus->partner[i].gname;\n                if (structPtr->activity == GetHostRfuGameData()->activity)\n                {\n                    gRfu.partnerSendStatuses[i] = RFU_STATUS_OK;\n                    gRfu.partnerRecvStatuses[i] = RFU_STATUS_OK;\n                    rfu_setRecvBuffer(TYPE_NI, i, &gRfu.partnerRecvStatuses[i], sizeof(gRfu.partnerRecvStatuses[0]));\n                }\n                else\n                {\n                    disconnectFlag |= (1 << i);\n                }\n            }\n        }\n        if (disconnectFlag)\n        {\n            rfu_REQ_disconnect(disconnectFlag);\n            rfu_waitREQComplete();\n        }\n        break;\n    case LMAN_MSG_NEW_CHILD_CONNECT_REJECTED:\n        break;\n    case LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED:\n        break;\n    case LMAN_MSG_END_WAIT_CHILD_NAME:\n        if (gRfu.acceptSlot_flag != lman.acceptSlot_flag)\n        {\n            rfu_REQ_disconnect(gRfu.acceptSlot_flag ^ lman.acceptSlot_flag);\n            rfu_waitREQComplete();\n        }\n        gRfu.state = RFUSTATE_PARENT_FINALIZE_START;\n        break;\n    case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY:\n        gRfu.linkLossRecoveryState = 1;\n        break;\n    case LMAN_MSG_LINK_RECOVERY_SUCCESSED:\n        gRfu.linkLossRecoveryState = 3;\n        break;\n    case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED:\n    case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED:\n        gRfu.linkLossRecoveryState = 4;\n        gRfu.parentSlots &= ~lman.param[0];\n        if (gReceivedRemoteLinkPlayers == 1)\n        {\n            if (gRfu.parentSlots == 0)\n                RfuSetErrorParams(msg);\n            else\n                StartDisconnectNewChild();\n        }\n        RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);\n        break;\n    case 0x34: // ? Not a valid LMAN_MSG value\n    case LMAN_MSG_RFU_POWER_DOWN:\n    case LMAN_MSG_MANAGER_STOPPED:\n    case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET:\n        break;\n    case LMAN_MSG_LMAN_API_ERROR_RETURN:\n        RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg);\n        RfuSetErrorParams(msg);\n        gRfu.isShuttingDown = TRUE;\n        break;\n    case LMAN_MSG_REQ_API_ERROR:\n    case LMAN_MSG_WATCH_DOG_TIMER_ERROR:\n    case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA:\n    case LMAN_MSG_RFU_FATAL_ERROR:\n        RfuSetErrorParams(msg);\n        RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg);\n        gRfu.parentFinished = TRUE;\n        break;\n    }\n}\n\nstatic void LinkManagerCB_Child(u8 msg, u8 param_count)\n{\n    switch (msg)\n    {\n    case LMAN_MSG_INITIALIZE_COMPLETED:\n        gRfu.state = RFUSTATE_CHILD_CONNECT;\n        break;\n    case LMAN_MSG_PARENT_FOUND:\n        gRfu.parentId = lman.param[0];\n        break;\n    case LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED:\n        break;\n    case LMAN_MSG_CONNECT_PARENT_SUCCESSED:\n        gRfu.childSlot = lman.param[0];\n        break;\n    case LMAN_MSG_CONNECT_PARENT_FAILED:\n        RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);\n        break;\n    case LMAN_MSG_CHILD_NAME_SEND_COMPLETED:\n        gRfu.state = RFUSTATE_CHILD_TRY_JOIN;\n        gRfu.sendStatus = RFU_STATUS_OK;\n        gRfu.recvStatus = RFU_STATUS_OK;\n        rfu_setRecvBuffer(TYPE_NI, gRfu.childSlot, &gRfu.recvStatus, sizeof(gRfu.recvStatus));\n        rfu_setRecvBuffer(TYPE_UNI, gRfu.childSlot, gRfu.childRecvQueue, sizeof(gRfu.childRecvQueue));\n        break;\n    case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED:\n        RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);\n        break;\n    case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED:\n        gRfu.linkLossRecoveryState = 2;\n        if (gRfu.recvStatus == RFU_STATUS_JOIN_GROUP_NO)\n            break;\n    case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED:\n        if (gRfu.linkLossRecoveryState != 2)\n            gRfu.linkLossRecoveryState = 4;\n        if (gRfu.recvStatus != RFU_STATUS_LEAVE_GROUP)\n            RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);\n        Debug_PrintString(sASCII_LinkLossDisconnect, 5, 5);\n        if (gReceivedRemoteLinkPlayers == 1)\n            RfuSetErrorParams(msg);\n        break;\n    case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY:\n        gRfu.linkLossRecoveryState = 1;\n        Debug_PrintString(sASCII_LinkLossRecoveryNow, 5, 5);\n        break;\n    case LMAN_MSG_LINK_RECOVERY_SUCCESSED:\n        gRfu.linkLossRecoveryState = 3;\n        gRfu.linkRecovered = TRUE;\n        break;\n    case 0x34: // ? Not a valid LMAN_MSG value\n        break;\n    case LMAN_MSG_RFU_POWER_DOWN:\n    case LMAN_MSG_MANAGER_STOPPED:\n    case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET:\n        break;\n    case LMAN_MSG_LMAN_API_ERROR_RETURN:\n        RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg);\n        RfuSetErrorParams(msg);\n        gRfu.isShuttingDown = TRUE;\n        break;\n    case LMAN_MSG_REQ_API_ERROR:\n    case LMAN_MSG_WATCH_DOG_TIMER_ERROR:\n    case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA:\n    case LMAN_MSG_RFU_FATAL_ERROR:\n        RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg);\n        RfuSetErrorParams(msg);\n        gRfu.parentFinished = TRUE;\n        break;\n    }\n}\n\nstatic void ParentResetChildRecvMetadata(s32 slot)\n{\n    s32 i;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if ((slot >> i) & 1)\n        {\n            gRfu.numChildRecvErrors[i] = 0;\n            gRfu.childRecvIds[i] = 0xFF;\n        }\n    }\n}\n\nstatic u8 GetNewChildrenInUnionRoomChat(s32 emptySlotMask)\n{\n    u8 ret = 0;\n    u8 i;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if ((emptySlotMask >> i) & 1)\n        {\n            struct RfuGameData *data = (void *)&gRfuLinkStatus->partner[i].gname;\n            if (data->activity == (ACTIVITY_CHAT | IN_UNION_ROOM))\n                ret |= (1 << i);\n        }\n    }\n\n    return ret;\n}\n\nstatic void LinkManagerCB_UnionRoom(u8 msg, u8 param_count)\n{\n    u8 acceptSlot;\n\n    switch (msg)\n    {\n    case LMAN_MSG_INITIALIZE_COMPLETED:\n        gRfu.state = RFUSTATE_UR_CONNECT;\n        break;\n    case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED:\n        RfuSetStatus(RFU_STATUS_NEW_CHILD_DETECTED, 0);\n        break;\n    case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED:\n        if (GetHostRfuGameData()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM) && !gRfu.stopNewConnections)\n        {\n            u8 newChildren = GetNewChildrenInUnionRoomChat(lman.param[0]);\n            if (newChildren != 0)\n            {\n                acceptSlot = 1 << Rfu_GetIndexOfNewestChild(newChildren);\n                if (gRfu.newChildQueue == 0 && !gRfu.playerExchangeActive)\n                {\n                    gRfu.nextChildBits = acceptSlot;\n                    gRfu.newChildQueue |= (acceptSlot ^ newChildren);\n                    gRfu.playerExchangeActive = TRUE;\n                }\n                else\n                {\n                    gRfu.newChildQueue |= newChildren;\n                }\n            }\n            if (newChildren != lman.param[0])\n            {\n                gRfu.disconnectSlots |= (newChildren ^ lman.param[0]);\n                gRfu.disconnectMode = RFU_DISCONNECT_NORMAL;\n            }\n        }\n        else if (GetHostRfuGameData()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM))\n        {\n            rfu_REQ_disconnect(lman.acceptSlot_flag);\n            rfu_waitREQComplete();\n        }\n        ParentResetChildRecvMetadata(lman.param[0]);\n        break;\n    case LMAN_MSG_NEW_CHILD_CONNECT_REJECTED:\n        break;\n    case LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED:\n        break;\n    case LMAN_MSG_END_WAIT_CHILD_NAME:\n        if (GetHostRfuGameData()->activity != (ACTIVITY_CHAT | IN_UNION_ROOM) && lman.acceptCount > 1)\n        {\n            acceptSlot = 1 << Rfu_GetIndexOfNewestChild(lman.param[0]);\n            rfu_REQ_disconnect(lman.acceptSlot_flag ^ acceptSlot);\n            rfu_waitREQComplete();\n        }\n        if (gRfu.state == RFUSTATE_UR_STOP_MANAGER_END)\n            gRfu.state = RFUSTATE_UR_FINALIZE;\n        break;\n    case LMAN_MSG_PARENT_FOUND:\n        gRfu.parentId = lman.param[0];\n        break;\n    case LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED:\n        break;\n    case LMAN_MSG_CONNECT_PARENT_SUCCESSED:\n        gRfu.childSlot = lman.param[0];\n        break;\n    case LMAN_MSG_CONNECT_PARENT_FAILED:\n        gRfu.state = RFUSTATE_UR_CONNECT_END;\n        if (gRfu.connectParentFailures < 2)\n        {\n            gRfu.connectParentFailures++;\n            CreateTask(Task_TryConnectToUnionRoomParent, 2);\n        }\n        else\n        {\n            RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);\n        }\n        break;\n    case LMAN_MSG_CHILD_NAME_SEND_COMPLETED:\n        gRfu.state = RFUSTATE_UR_PLAYER_EXCHANGE;\n        RfuSetStatus(RFU_STATUS_CHILD_SEND_COMPLETE, 0);\n        rfu_setRecvBuffer(TYPE_UNI, gRfu.childSlot, gRfu.childRecvQueue, sizeof(gRfu.childRecvQueue));\n        break;\n    case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED:\n        RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);\n        break;\n    case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY:\n        if (lman.acceptSlot_flag & lman.param[0])\n            gRfu.linkLossRecoveryState = 1;\n        break;\n    case LMAN_MSG_LINK_RECOVERY_SUCCESSED:\n        gRfu.linkLossRecoveryState = 3;\n        if (gRfuLinkStatus->parentChild == MODE_CHILD)\n            gRfu.linkRecovered = TRUE;\n        break;\n    case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED:\n        gRfu.linkLossRecoveryState = 2;\n        // fallthrough\n    case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED:\n        if (gRfu.linkLossRecoveryState != 2)\n            gRfu.linkLossRecoveryState = 4;\n        if (gRfu.parentChild == MODE_PARENT)\n        {\n            if (gReceivedRemoteLinkPlayers == 1)\n            {\n                gRfu.parentSlots &= ~(lman.param[0]);\n                if (gRfu.parentSlots == 0)\n                    RfuSetErrorParams(msg);\n                else\n                    StartDisconnectNewChild();\n            }\n        }\n        else if (gRfu.disconnectMode != RFU_DISCONNECT_NORMAL && gReceivedRemoteLinkPlayers == 1)\n        {\n            RfuSetErrorParams(msg);\n            rfu_LMAN_stopManager(0);\n        }\n\n        if (gRfuLinkStatus->parentChild == MODE_NEUTRAL\n            && lman.pcswitch_flag == 0 &&\n            FuncIsActiveTask(Task_UnionRoomListen) == TRUE)\n            gRfu.state = RFUSTATE_UR_CONNECT;\n\n        RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);\n        break;\n    case LMAN_MSG_LINK_DISCONNECTED_BY_USER:\n        gRfu.disconnectSlots = 0;\n        break;\n    case LMAN_MSG_RFU_POWER_DOWN:\n    case LMAN_MSG_MANAGER_STOPPED:\n    case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET:\n        break;\n    case LMAN_MSG_LMAN_API_ERROR_RETURN:\n        RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg);\n        RfuSetErrorParams(msg);\n        gRfu.isShuttingDown = TRUE;\n        break;\n    case LMAN_MSG_REQ_API_ERROR:\n    case LMAN_MSG_WATCH_DOG_TIMER_ERROR:\n    case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA:\n    case LMAN_MSG_RFU_FATAL_ERROR:\n        RfuSetErrorParams(msg);\n        RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg);\n        gRfu.parentFinished = FALSE;\n        break;\n    }\n}\n\nvoid RfuSetNormalDisconnectMode(void)\n{\n    gRfu.disconnectMode = RFU_DISCONNECT_NORMAL;\n}\n\nvoid RfuSetStatus(u8 status, u16 errorInfo)\n{\n    gRfu.status = status;\n    gRfu.errorInfo = errorInfo;\n}\n\nu8 RfuGetStatus(void)\n{\n    return gRfu.status;\n}\n\nbool32 RfuHasErrored(void)\n{\n    u32 status = RfuGetStatus();\n    if (status == RFU_STATUS_FATAL_ERROR || status == RFU_STATUS_CONNECTION_ERROR)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool32 Rfu_IsPlayerExchangeActive(void)\n{\n    return gRfu.playerExchangeActive;\n}\n\nbool8 Rfu_IsMaster(void)\n{\n    return gRfu.parentChild;\n}\n\nvoid RfuVSync(void)\n{\n    rfu_LMAN_syncVBlank();\n}\n\nvoid ClearRecvCommands(void)\n{\n    CpuFill32(0, gRecvCmds, sizeof(gRecvCmds));\n}\n\nstatic void VBlank_RfuIdle(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\n// Unused\nstatic void Debug_RfuIdle(void)\n{\n    s32 i;\n\n    ResetSpriteData();\n    FreeAllSpritePalettes();\n    ResetTasks();\n    ResetPaletteFade();\n    SetVBlankCallback(VBlank_RfuIdle);\n    if (IsWirelessAdapterConnected())\n    {\n        gLinkType = LINKTYPE_TRADE;\n        SetWirelessCommType1();\n        OpenLink();\n        SeedRng(gMain.vblankCounter2);\n        for (i = 0; i < TRAINER_ID_LENGTH; i++)\n            gSaveBlock2Ptr->playerTrainerId[i] = Random() % 256;\n\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_1D_MAP);\n        RunTasks();\n        AnimateSprites();\n        BuildOamBuffer();\n        UpdatePaletteFade();\n        CreateTask_RfuIdle();\n        SetMainCallback2(CB2_RfuIdle);\n    }\n}\n\nbool32 IsUnionRoomListenTaskActive(void)\n{\n    return FuncIsActiveTask(Task_UnionRoomListen);\n}\n\nvoid CreateTask_RfuIdle(void)\n{\n    if (!FuncIsActiveTask(Task_Idle))\n        gRfu.idleTaskId = CreateTask(Task_Idle, 0);\n}\n\nvoid DestroyTask_RfuIdle(void)\n{\n    if (FuncIsActiveTask(Task_Idle) == TRUE)\n        DestroyTask(gRfu.idleTaskId);\n}\n\nstatic void CB2_RfuIdle(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nvoid InitializeRfuLinkManager_LinkLeader(u32 groupMax)\n{\n    gRfu.parentChild = MODE_PARENT;\n    SetHostRfuUsername();\n    rfu_LMAN_initializeManager(LinkManagerCB_Parent, NULL);\n    sRfuReqConfig = sRfuReqConfigTemplate;\n    sRfuReqConfig.availSlot_flag = sAvailSlots[groupMax - 1];\n    CreateTask_ParentSearchForChildren();\n}\n\nvoid InitializeRfuLinkManager_JoinGroup(void)\n{\n    gRfu.parentChild = MODE_CHILD;\n    SetHostRfuUsername();\n    rfu_LMAN_initializeManager(LinkManagerCB_Child, MscCallback_Child);\n    CreateTask_ChildSearchForParent();\n}\n\nvoid InitializeRfuLinkManager_EnterUnionRoom(void)\n{\n    if (QL_IS_PLAYBACK_STATE)\n        return;\n    gRfu.parentChild = MODE_P_C_SWITCH;\n    SetHostRfuUsername();\n    rfu_LMAN_initializeManager(LinkManagerCB_UnionRoom, NULL);\n    sRfuReqConfig = sRfuReqConfigTemplate;\n    sRfuReqConfig.linkRecovery_enable = 0;\n    sRfuReqConfig.linkRecovery_period = 600;\n    gRfu.searchTaskId = CreateTask(Task_UnionRoomListen, 1);\n}\n\nstatic u16 ReadU16(const void *ptr)\n{\n    const u8 *ptr_ = ptr;\n    return (ptr_[1] << 8) | (ptr_[0]);\n}\n\n/*\n * ================================================================\n * Looks up the player by uname and pid. Returns the index in\n * gRfuLinkStatus->partner of the first match with a valid slot ID.\n * Returns 0xFF if not found.\n * ================================================================\n */\nstatic u8 GetPartnerIndexByNameAndTrainerID(const u8 *name, u16 trainerId)\n{\n    u8 i;\n    u8 idx = 0xFF;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        u16 partnerTrainerId = ReadU16(((struct RfuGameData *)gRfuLinkStatus->partner[i].gname)->compatibility.playerTrainerId);\n        if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[i].serialNo)\n            && !StringCompare(name, gRfuLinkStatus->partner[i].uname)\n            && trainerId == partnerTrainerId)\n        {\n            idx = i;\n            if (gRfuLinkStatus->partner[i].slot != 0xFF)\n                break;\n        }\n    }\n\n    return idx;\n}\n\nstatic void RfuReqDisconnectSlot(u32 slot)\n{\n    rfu_REQ_disconnect(slot);\n    rfu_waitREQComplete();\n    gRfu.parentSlots &= ~slot;\n    rfu_clearSlot(TYPE_UNI_SEND, gRfu.parentSendSlot);\n    rfu_UNI_setSendData(gRfu.parentSlots, gRfu.recvCmds, sizeof(gRfu.recvCmds));\n    gRfu.parentSendSlot = Rfu_GetIndexOfNewestChild(gRfu.parentSlots);\n}\n\nvoid RequestDisconnectSlotByTrainerNameAndId(const u8 *trainerName, u16 trainerId)\n{\n    u8 index = GetPartnerIndexByNameAndTrainerID(trainerName, trainerId);\n    if (index != 0xFF)\n        RfuReqDisconnectSlot(1 << index);\n}\n\nvoid Rfu_DisconnectPlayerById(u32 playerIdx)\n{\n    if (playerIdx != 0)\n    {\n        s32 i;\n        u8 toDisconnect = 0;\n\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n        {\n            if (gRfu.linkPlayerIdx[i] == playerIdx && (gRfu.parentSlots >> i) & 1)\n                toDisconnect |= 1 << i;\n        }\n        if (toDisconnect)\n            SendDisconnectCommand(toDisconnect, RFU_DISCONNECT_NORMAL);\n    }\n}\n\n#define tDisconnectPlayers data[0]\n#define tDisconnectMode    data[1]\n\nstatic void Task_SendDisconnectCommand(u8 taskId)\n{\n    if (IsSendCmdComplete() && !gRfu.playerExchangeActive)\n    {\n        RfuPrepareSendBuffer(RFUCMD_DISCONNECT);\n        gSendCmd[1] = gTasks[taskId].tDisconnectPlayers;\n        gSendCmd[2] = gTasks[taskId].tDisconnectMode;\n        gRfu.playerCount -= sPlayerBitsToCount[gTasks[taskId].tDisconnectPlayers];\n        gSendCmd[3] = gRfu.playerCount;\n        DestroyTask(taskId);\n    }\n}\n\nstatic void SendDisconnectCommand(u32 playersToDisconnect, u32 disconnectMode)\n{\n    u8 taskId = FindTaskIdByFunc(Task_SendDisconnectCommand);\n    if (taskId == TASK_NONE)\n    {\n        taskId = CreateTask(Task_SendDisconnectCommand, 5);\n        gTasks[taskId].tDisconnectPlayers = playersToDisconnect;\n    }\n    else\n    {\n        // Task is already active, just add the new players to disconnect\n        gTasks[taskId].tDisconnectPlayers |= playersToDisconnect;\n    }\n\n    gTasks[taskId].tDisconnectMode = disconnectMode;\n}\n\n#undef tDisconnectPlayers\n#undef tDisconnectMode\n\n#define tTime data[15]\n\nstatic void Task_RfuReconnectWithParent(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (CanTryReconnectParent())\n    {\n        u8 id = GetPartnerIndexByNameAndTrainerID((u8 *)data, ReadU16(&data[8]));\n        if (id != 0xFF)\n        {\n            if (gRfuLinkStatus->partner[id].slot != 0xFF)\n            {\n                gRfu.reconnectParentId = id;\n                if (TryReconnectParent())\n                    DestroyTask(taskId);\n            }\n            else if (GetHostRfuGameData()->activity == ACTIVITY_WONDER_CARD\n                  || GetHostRfuGameData()->activity == ACTIVITY_WONDER_NEWS)\n            {\n                tTime++;\n            }\n            else\n            {\n                // Error, unable to reconnect to parent\n                RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_6 | F_RFU_ERROR_7);\n                DestroyTask(taskId);\n            }\n        }\n        else\n        {\n            tTime++;\n            gRfu.reconnectParentId = id;\n        }\n    }\n    else\n    {\n        tTime++;\n    }\n\n    if (tTime > 240)\n    {\n        // Timeout error\n        RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_6 | F_RFU_ERROR_7);\n        DestroyTask(taskId);\n    }\n}\n\n#undef tTime\n\nvoid CreateTask_RfuReconnectWithParent(const u8 *name, u16 trainerId)\n{\n    u8 taskId;\n    s16 *data;\n\n    gRfu.status = RFU_STATUS_OK;\n    taskId = CreateTask(Task_RfuReconnectWithParent, 3);\n    data = gTasks[taskId].data;\n    StringCopy((u8 *)(data), name);\n    data[8] = trainerId;\n}\n\nstatic bool32 IsPartnerActivityIncompatible(s16 activity, struct RfuGameData *partner)\n{\n    if (GetHostRfuGameData()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM))\n    {\n        // Host trying to chat, but partner isn't\n        if (partner->activity != (ACTIVITY_CHAT | IN_UNION_ROOM))\n            return TRUE;\n    }\n    else if (partner->activity != IN_UNION_ROOM)\n    {\n        // Partner not in union room\n        return TRUE;\n    }\n    else if (activity == (ACTIVITY_TRADE | IN_UNION_ROOM))\n    {\n        // Verify that the trade offered hasn't changed\n        struct RfuGameData *original = (struct RfuGameData *)&gRfu.parent.gname;\n        if (original->tradeSpecies == SPECIES_EGG)\n        {\n            if (partner->tradeSpecies == original->tradeSpecies)\n                return FALSE;\n            else\n                return TRUE;\n        }\n        else if (partner->tradeSpecies != original->tradeSpecies\n              || partner->tradeLevel != original->tradeLevel\n              || partner->tradeType != original->tradeType)\n        {\n            return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\n#define tTime     data[0]\n#define tActivity data[1]\n\nstatic void Task_TryConnectToUnionRoomParent(u8 taskId)\n{\n    // Stop task if player is the new parent\n    if (gRfu.status == RFU_STATUS_NEW_CHILD_DETECTED)\n        DestroyTask(taskId);\n\n    if (++gTasks[taskId].data[0] > 300)\n    {\n        // Timeout error\n        RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_6 | F_RFU_ERROR_7);\n        DestroyTask(taskId);\n    }\n\n    // Check if parent should be searched for\n    if (gRfu.parentId != 0 && lman.parent_child == MODE_CHILD)\n    {\n        // Search for parent\n        u16 trainerId = ReadU16(((struct RfuGameData *)&gRfu.parent.gname)->compatibility.playerTrainerId);\n        u8 id = GetPartnerIndexByNameAndTrainerID(gRfu.parent.uname, trainerId);\n        if (id != 0xFF)\n        {\n            // Parent found, try to connect\n            if (!IsPartnerActivityIncompatible(gTasks[taskId].data[1], (struct RfuGameData *)&gRfuLinkStatus->partner[id].gname))\n            {\n                if (gRfuLinkStatus->partner[id].slot != 0xFF && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[id].id, 90))\n                {\n                    // Succesfully connected to parent\n                    gRfu.state = RFUSTATE_CONNECTED;\n                    DestroyTask(taskId);\n                }\n            }\n            else\n            {\n                // Incompatible partner activity\n                RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, F_RFU_ERROR_5 | F_RFU_ERROR_6 | F_RFU_ERROR_7);\n                DestroyTask(taskId);\n            }\n        }\n    }\n}\n\nvoid TryConnectToUnionRoomParent(const u8 *name, struct RfuGameData *parent, u8 activity)\n{\n    u8 taskId, listenTaskId;\n\n    gRfu.connectParentFailures = 0;\n    gRfu.status = RFU_STATUS_OK;\n    StringCopy(gRfu.parent.uname, name);\n    memcpy(gRfu.parent.gname, parent, RFU_GAME_NAME_LENGTH);\n    rfu_LMAN_forceChangeSP();\n    taskId = CreateTask(Task_TryConnectToUnionRoomParent, 2);\n    gTasks[taskId].tActivity = activity;\n    listenTaskId = FindTaskIdByFunc(Task_UnionRoomListen);\n    if (activity == (ACTIVITY_CHAT | IN_UNION_ROOM))\n    {\n        if (listenTaskId != TASK_NONE)\n            gTasks[listenTaskId].tConnectingForChat = TRUE;\n    }\n    else\n    {\n        if (listenTaskId != TASK_NONE)\n            gTasks[listenTaskId].tConnectingForChat = FALSE;\n    }\n}\n\nbool8 IsRfuRecoveringFromLinkLoss(void)\n{\n    if (gRfu.linkLossRecoveryState == 1)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool32 IsRfuCommunicatingWithAllChildren(void)\n{\n    s32 i;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        // RFU_STATUS_OK is the default status.\n        // If any connected child is receiving a status other\n        // than OK, then the parent is communicating with them\n        if ((lman.acceptSlot_flag >> i) & 1 && gRfu.partnerSendStatuses[i] == RFU_STATUS_OK)\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic void Debug_PrintEmpty(void)\n{\n    s32 i;\n\n    for (i = 0; i < 20; i++)\n        Debug_PrintString(sASCII_30Spaces, 0, i);\n}\n\nstatic void Debug_PrintStatus(void)\n{\n    s32 i, j;\n\n    Debug_PrintNum(GetBlockReceivedStatus(), 28, 19, 2);\n    Debug_PrintNum(gRfuLinkStatus->connSlotFlag, 20, 1, 1);\n    Debug_PrintNum(gRfuLinkStatus->linkLossSlotFlag, 23, 1, 1);\n    if (gRfu.parentChild == MODE_PARENT)\n    {\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n        {\n            if ((gRfuLinkStatus->getNameFlag >> i) & 1)\n            {\n                Debug_PrintNum(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4);\n                Debug_PrintString((void *) &gRfuLinkStatus->partner[i].gname, 6, i + 3);\n                Debug_PrintString(gRfuLinkStatus->partner[i].uname, 22, i + 3);\n            }\n        }\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n        {\n            for (j = 0; j < COMM_SLOT_LENGTH; j++)\n                Debug_PrintNum(gRfu.childRecvBuffer[i][j], j * 2, i + 11, 2);\n        }\n        Debug_PrintString(sASCII_NowSlot, 1, 15);\n    }\n    else if (gRfuLinkStatus->connSlotFlag != 0 && gRfuLinkStatus->getNameFlag != 0)\n    {\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n        {\n            Debug_PrintNum(0, 1, i + 3, 4);\n            Debug_PrintString(sASCII_15Spaces, 6, i + 3);\n            Debug_PrintString(sASCII_8Spaces, 22, i + 3);\n        }\n        Debug_PrintNum(gRfuLinkStatus->partner[gRfu.childSlot].serialNo, 1, 3, 4);\n        Debug_PrintString(gRfuLinkStatus->partner[gRfu.childSlot].gname, 6, 3);\n        Debug_PrintString(gRfuLinkStatus->partner[gRfu.childSlot].uname, 22, 3);\n    }\n    else\n    {\n        for (i = 0; i < gRfuLinkStatus->findParentCount; i++)\n        {\n            if (gRfuLinkStatus->partner[i].slot != 0xFF)\n            {\n                Debug_PrintNum(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4);\n                Debug_PrintNum(gRfuLinkStatus->partner[i].id, 6, i + 3, 4);\n                Debug_PrintString(gRfuLinkStatus->partner[i].uname, 22, i + 3);\n            }\n        }\n        for (; i < RFU_CHILD_MAX; i++)\n        {\n            Debug_PrintNum(0, 1, i + 3, 4);\n            Debug_PrintString(sASCII_15Spaces, 6, i + 3);\n            Debug_PrintString(sASCII_8Spaces, 22, i + 3);\n        }\n    }\n}\n\nstatic u32 GetRfuSendQueueLength(void)\n{\n    return gRfu.sendQueue.count;\n}\n\nu32 GetRfuRecvQueueLength(void)\n{\n    return gRfu.recvQueue.count;\n}\n\nstatic void Task_Idle(u8 taskId)\n{\n\n}\n"
  },
  {
    "path": "src/link_rfu_3.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"event_data.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"random.h\"\n\nenum {\n    WIRELESS_STATUS_ANIM_3_BARS,\n    WIRELESS_STATUS_ANIM_2_BARS,\n    WIRELESS_STATUS_ANIM_1_BAR,\n    WIRELESS_STATUS_ANIM_SEARCHING,\n    WIRELESS_STATUS_ANIM_ERROR,\n};\n\n#define TAG_GFX_STATUS_INDICATOR 0xD431\n#define TAG_PAL_STATUS_INDICATOR 0xD432\n\n#define UNUSED_QUEUE_NUM_SLOTS 2\n#define UNUSED_QUEUE_SLOT_LENGTH 256\n\nstruct RfuUnusedQueue\n{\n    u8 slots[UNUSED_QUEUE_NUM_SLOTS][UNUSED_QUEUE_SLOT_LENGTH];\n    vu8 recvSlot;\n    vu8 sendSlot;\n    vu8 count;\n    vu8 full;\n};\n\nstatic EWRAM_DATA u8 sWirelessStatusIndicatorSpriteId = 0;\n\nstatic const u16 sWirelessLinkIconPalette[] = INCBIN_U16(\"graphics/link/wireless_icon.gbapal\");\nstatic const u32 sWirelessLinkIconPic[] = INCBIN_U32(\"graphics/link/wireless_icon.4bpp.lz\");\n\n// Most of the below two tables won't make sense with ASCII encoding.\nstatic const u8 sWireless_ASCIItoRSETable[] = {\n    EOS,\n    0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x37,\n    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,\n    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,\n    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,\n    [' '] = CHAR_SPACE,\n    ['!'] = CHAR_EXCL_MARK,\n    0xb5, 0xb6, 0xb1, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0xb2, 0xf1, 0x00,\n    ['-'] = CHAR_HYPHEN,\n    ['.'] = CHAR_PERIOD,\n    ['/'] = CHAR_SLASH,\n    ['0'] = CHAR_0,\n    ['1'] = CHAR_1,\n    ['2'] = CHAR_2,\n    ['3'] = CHAR_3,\n    ['4'] = CHAR_4,\n    ['5'] = CHAR_5,\n    ['6'] = CHAR_6,\n    ['7'] = CHAR_7,\n    ['8'] = CHAR_8,\n    ['9'] = CHAR_9,\n    0x00, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x00,\n    ['A'] = CHAR_A,\n    ['B'] = CHAR_B,\n    ['C'] = CHAR_C,\n    ['D'] = CHAR_D,\n    ['E'] = CHAR_E,\n    ['F'] = CHAR_F,\n    ['G'] = CHAR_G,\n    ['H'] = CHAR_H,\n    ['I'] = CHAR_I,\n    ['J'] = CHAR_J,\n    ['K'] = CHAR_K,\n    ['L'] = CHAR_L,\n    ['M'] = CHAR_M,\n    ['N'] = CHAR_N,\n    ['O'] = CHAR_O,\n    ['P'] = CHAR_P,\n    ['Q'] = CHAR_Q,\n    ['R'] = CHAR_R,\n    ['S'] = CHAR_S,\n    ['T'] = CHAR_T,\n    ['U'] = CHAR_U,\n    ['V'] = CHAR_V,\n    ['W'] = CHAR_W,\n    ['X'] = CHAR_X,\n    ['Y'] = CHAR_Y,\n    ['Z'] = CHAR_Z,\n    0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00,\n    ['a'] = CHAR_a,\n    ['b'] = CHAR_b,\n    ['c'] = CHAR_c,\n    ['d'] = CHAR_d,\n    ['e'] = CHAR_e,\n    ['f'] = CHAR_f,\n    ['g'] = CHAR_g,\n    ['h'] = CHAR_h,\n    ['i'] = CHAR_i,\n    ['j'] = CHAR_j,\n    ['k'] = CHAR_k,\n    ['l'] = CHAR_l,\n    ['m'] = CHAR_m,\n    ['n'] = CHAR_n,\n    ['o'] = CHAR_o,\n    ['p'] = CHAR_p,\n    ['q'] = CHAR_q,\n    ['r'] = CHAR_r,\n    ['s'] = CHAR_s,\n    ['t'] = CHAR_t,\n    ['u'] = CHAR_u,\n    ['v'] = CHAR_v,\n    ['w'] = CHAR_w,\n    ['x'] = CHAR_x,\n    ['y'] = CHAR_y,\n    ['z'] = CHAR_z,\n    0x2d, 0x2f, 0x30, 0x31, 0x32,\n    0x33, 0x34, 0x35, 0x36, 0x50, 0x00, 0x01, 0x02,\n    0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,\n    0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,\n    0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,\n    0x1b, 0xad, 0xb3, 0xb4, 0x00, 0xaf, 0x7d, 0x7f,\n    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0xa0,\n    0xae, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,\n    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,\n    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,\n    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7e, 0xb0, 0xac,\n    0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,\n    0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,\n    0x2c, 0x2e, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c,\n    0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94\n};\n\nstatic const u8 sWireless_RSEtoASCIITable[] = {\n    [CHAR_SPACE] = ' ',\n    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d,\n    0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,\n    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d,\n    0x9e, 0x9f, 0xa0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4,\n    0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec,\n    0xed, 0xee, 0xef, 0xf0, 0x7b, 0xf1, 0x7c, 0x7d,\n    0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x07, 0x08,\n    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,\n    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,\n    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x84,\n    0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8,\n    0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,\n    0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8,\n    0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,\n    0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,\n    0xd9, 0xda, 0xdb, 0xdc, 0xa6, 0xdd, 0xa7, 0xa8,\n    0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xf2, 0xf3,\n    0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,\n    0xfc, 0xfd, 0xfe, 0xff, 0x01, 0x02, 0x03, 0x04,\n    0x05, 0x06, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0xaf,\n    [CHAR_0] = '0',\n    [CHAR_1] = '1',\n    [CHAR_2] = '2',\n    [CHAR_3] = '3',\n    [CHAR_4] = '4',\n    [CHAR_5] = '5',\n    [CHAR_6] = '6',\n    [CHAR_7] = '7',\n    [CHAR_8] = '8',\n    [CHAR_9] = '9',\n    [CHAR_EXCL_MARK] = '!',\n    0xdf, 0xa1, 0xb0, 0xa5, 0xde, 0x24, 0x2a,\n    0xa2, 0xa3, 0x22, 0x23, 0x20, 0xa4, 0x20,\n    [CHAR_SLASH] = '/',\n    [CHAR_A] = 'A',\n    [CHAR_B] = 'B',\n    [CHAR_C] = 'C',\n    [CHAR_D] = 'D',\n    [CHAR_E] = 'E',\n    [CHAR_F] = 'F',\n    [CHAR_G] = 'G',\n    [CHAR_H] = 'H',\n    [CHAR_I] = 'I',\n    [CHAR_J] = 'J',\n    [CHAR_K] = 'K',\n    [CHAR_L] = 'L',\n    [CHAR_M] = 'M',\n    [CHAR_N] = 'N',\n    [CHAR_O] = 'O',\n    [CHAR_P] = 'P',\n    [CHAR_Q] = 'Q',\n    [CHAR_R] = 'R',\n    [CHAR_S] = 'S',\n    [CHAR_T] = 'T',\n    [CHAR_U] = 'U',\n    [CHAR_V] = 'V',\n    [CHAR_W] = 'W',\n    [CHAR_X] = 'X',\n    [CHAR_Y] = 'Y',\n    [CHAR_Z] = 'Z',\n    [CHAR_a] = 'a',\n    [CHAR_b] = 'b',\n    [CHAR_c] = 'c',\n    [CHAR_d] = 'd',\n    [CHAR_e] = 'e',\n    [CHAR_f] = 'f',\n    [CHAR_g] = 'g',\n    [CHAR_h] = 'h',\n    [CHAR_i] = 'i',\n    [CHAR_j] = 'j',\n    [CHAR_k] = 'k',\n    [CHAR_l] = 'l',\n    [CHAR_m] = 'm',\n    [CHAR_n] = 'n',\n    [CHAR_o] = 'o',\n    [CHAR_p] = 'p',\n    [CHAR_q] = 'q',\n    [CHAR_r] = 'r',\n    [CHAR_s] = 's',\n    [CHAR_t] = 't',\n    [CHAR_u] = 'u',\n    [CHAR_v] = 'v',\n    [CHAR_w] = 'w',\n    [CHAR_x] = 'x',\n    [CHAR_y] = 'y',\n    [CHAR_z] = 'z',\n    0x20, 0x20, 0x2b, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,\n    [CHAR_DYNAMIC] = ' ',\n    [CHAR_KEYPAD_ICON] = ' ',\n    [CHAR_EXTRA_SYMBOL] = ' ',\n    [CHAR_PROMPT_SCROLL] = ' ',\n    [CHAR_PROMPT_CLEAR] = ' ',\n    [EXT_CTRL_CODE_BEGIN] = ' ',\n    [PLACEHOLDER_BEGIN] = ' ',\n    [CHAR_NEWLINE] = ' ',\n    [EOS] = 0\n};\n\nstatic const struct OamData sWirelessStatusIndicatorOamData =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n};\n\nstatic const union AnimCmd sWirelessStatusIndicator_3Bars[] = {\n    ANIMCMD_FRAME( 4,  5),\n    ANIMCMD_FRAME( 8,  5),\n    ANIMCMD_FRAME(12,  5),\n    ANIMCMD_FRAME(16, 10),\n    ANIMCMD_FRAME(12,  5),\n    ANIMCMD_FRAME( 8,  5),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sWirelessStatusIndicator_2Bars[] = {\n    ANIMCMD_FRAME( 4,  5),\n    ANIMCMD_FRAME( 8,  5),\n    ANIMCMD_FRAME(12, 10),\n    ANIMCMD_FRAME( 8,  5),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sWirelessStatusIndicator_1Bar[] = {\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sWirelessStatusIndicator_Searching[] = {\n    ANIMCMD_FRAME( 4, 10),\n    ANIMCMD_FRAME(20, 10),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sWirelessStatusIndicator_Error[] = {\n    ANIMCMD_FRAME(24, 10),\n    ANIMCMD_FRAME( 4, 10),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sWirelessStatusIndicatorAnims[] = {\n    [WIRELESS_STATUS_ANIM_3_BARS]    = sWirelessStatusIndicator_3Bars,\n    [WIRELESS_STATUS_ANIM_2_BARS]    = sWirelessStatusIndicator_2Bars,\n    [WIRELESS_STATUS_ANIM_1_BAR]     = sWirelessStatusIndicator_1Bar,\n    [WIRELESS_STATUS_ANIM_SEARCHING] = sWirelessStatusIndicator_Searching,\n    [WIRELESS_STATUS_ANIM_ERROR]     = sWirelessStatusIndicator_Error\n};\n\nstatic const struct CompressedSpriteSheet sWirelessStatusIndicatorSpriteSheet = {\n    sWirelessLinkIconPic, 0x0380, TAG_GFX_STATUS_INDICATOR\n};\n\nstatic const struct SpritePalette sWirelessStatusIndicatorSpritePalette = {\n    sWirelessLinkIconPalette, TAG_PAL_STATUS_INDICATOR\n};\n\nstatic const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = {\n    .tileTag = TAG_GFX_STATUS_INDICATOR,\n    .paletteTag = TAG_PAL_STATUS_INDICATOR,\n    .oam = &sWirelessStatusIndicatorOamData,\n    .anims = sWirelessStatusIndicatorAnims,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\n// A bunch of FIFO queues\n\nvoid RfuRecvQueue_Reset(struct RfuRecvQueue *queue)\n{\n    s32 i;\n    s32 j;\n\n    for (i = 0; i < RECV_QUEUE_NUM_SLOTS; i++)\n    {\n        for (j = 0; j < COMM_SLOT_LENGTH * MAX_RFU_PLAYERS; j++)\n            queue->slots[i][j] = 0;\n    }\n    queue->sendSlot = 0;\n    queue->recvSlot = 0;\n    queue->count = 0;\n    queue->full = FALSE;\n}\n\nvoid RfuSendQueue_Reset(struct RfuSendQueue *queue)\n{\n    s32 i;\n    s32 j;\n\n    for (i = 0; i < SEND_QUEUE_NUM_SLOTS; i++)\n    {\n        for (j = 0; j < COMM_SLOT_LENGTH; j++)\n            queue->slots[i][j] = 0;\n    }\n    queue->sendSlot = 0;\n    queue->recvSlot = 0;\n    queue->count = 0;\n    queue->full = FALSE;\n}\n\nstatic void RfuUnusedQueue_Reset(struct RfuUnusedQueue *queue)\n{\n    s32 i;\n    s32 j;\n\n    for (i = 0; i < UNUSED_QUEUE_NUM_SLOTS; i++)\n    {\n        for (j = 0; j < UNUSED_QUEUE_SLOT_LENGTH; j++)\n            queue->slots[i][j] = 0;\n    }\n    queue->sendSlot = 0;\n    queue->recvSlot = 0;\n    queue->count = 0;\n    queue->full = FALSE;\n}\n\nvoid RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *src)\n{\n    s32 i;\n    u16 imeBak;\n    u8 count;\n\n    if (queue->count < RECV_QUEUE_NUM_SLOTS)\n    {\n        imeBak = REG_IME;\n        REG_IME = 0;\n        count = 0;\n        for (i = 0; i < COMM_SLOT_LENGTH * MAX_RFU_PLAYERS; i += COMM_SLOT_LENGTH)\n        {\n            if (src[i] == 0 && src[i + 1] == 0)\n                count++;\n        }\n        if (count != MAX_RFU_PLAYERS)\n        {\n            for (i = 0; i < COMM_SLOT_LENGTH * MAX_RFU_PLAYERS; i++)\n                queue->slots[queue->recvSlot][i] = src[i];\n            queue->recvSlot++;\n            queue->recvSlot %= RECV_QUEUE_NUM_SLOTS;\n            queue->count++;\n            for (i = 0; i < COMM_SLOT_LENGTH * MAX_RFU_PLAYERS; i++)\n                src[i] = 0;\n        }\n        REG_IME = imeBak;\n    }\n    else\n    {\n        queue->full = TRUE;\n    }\n}\n\nvoid RfuSendQueue_Enqueue(struct RfuSendQueue *queue, u8 *src)\n{\n    s32 i;\n    u16 imeBak;\n\n    if (queue->count < SEND_QUEUE_NUM_SLOTS)\n    {\n        imeBak = REG_IME;\n        REG_IME = 0;\n        for (i = 0; i < COMM_SLOT_LENGTH; i++)\n        {\n            if (src[i] != 0)\n                break;\n        }\n        if (i != COMM_SLOT_LENGTH)\n        {\n            for (i = 0; i < COMM_SLOT_LENGTH; i++)\n                queue->slots[queue->recvSlot][i] = src[i];\n            queue->recvSlot++;\n            queue->recvSlot %= SEND_QUEUE_NUM_SLOTS;\n            queue->count++;\n            for (i = 0; i < COMM_SLOT_LENGTH; i++)\n                src[i] = 0;\n        }\n        REG_IME = imeBak;\n    }\n    else\n    {\n        queue->full = TRUE;\n    }\n}\n\nbool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue *queue, u8 *dest)\n{\n    u16 imeBak;\n    s32 i;\n\n    imeBak = REG_IME;\n    REG_IME = 0;\n    if (queue->recvSlot == queue->sendSlot || queue->full)\n    {\n        for (i = 0; i < COMM_SLOT_LENGTH * MAX_RFU_PLAYERS; i++)\n            dest[i] = 0;\n        REG_IME = imeBak;\n        return FALSE;\n    }\n    for (i = 0; i < COMM_SLOT_LENGTH * MAX_RFU_PLAYERS; i++)\n        dest[i] = queue->slots[queue->sendSlot][i];\n    queue->sendSlot++;\n    queue->sendSlot %= RECV_QUEUE_NUM_SLOTS;\n    queue->count--;\n    REG_IME = imeBak;\n    return TRUE;\n}\n\nbool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *dest)\n{\n    s32 i;\n    u16 imeBak;\n\n    if (queue->recvSlot == queue->sendSlot || queue->full)\n        return FALSE;\n    imeBak = REG_IME;\n    REG_IME = 0;\n    for (i = 0; i < COMM_SLOT_LENGTH; i++)\n        dest[i] = queue->slots[queue->sendSlot][i];\n    queue->sendSlot++;\n    queue->sendSlot %= SEND_QUEUE_NUM_SLOTS;\n    queue->count--;\n    REG_IME = imeBak;\n    return TRUE;\n}\n\nvoid RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *dest)\n{\n    s32 i;\n\n    if (dest[1] == 0)\n    {\n        RfuBackupQueue_Dequeue(queue, NULL);\n    }\n    else\n    {\n        for (i = 0; i < COMM_SLOT_LENGTH; i++)\n            queue->slots[queue->recvSlot][i] = dest[i];\n        queue->recvSlot++;\n        queue->recvSlot %= BACKUP_QUEUE_NUM_SLOTS;\n        if (queue->count < BACKUP_QUEUE_NUM_SLOTS)\n            queue->count++;\n        else\n            queue->sendSlot = queue->recvSlot;\n    }\n}\n\nbool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *dest)\n{\n    s32 i;\n\n    if (queue->count == 0)\n        return FALSE;\n\n    if (dest != NULL)\n    {\n        for (i = 0; i < COMM_SLOT_LENGTH; i++)\n            dest[i] = queue->slots[queue->sendSlot][i];\n    }\n    queue->sendSlot++;\n    queue->sendSlot %= BACKUP_QUEUE_NUM_SLOTS;\n    queue->count--;\n    return TRUE;\n}\n\nstatic void RfuUnusedQueue_Dequeue(struct RfuUnusedQueue *queue, u8 *dest)\n{\n    s32 i;\n\n    if (queue->count < UNUSED_QUEUE_NUM_SLOTS)\n    {\n        for (i = 0; i < UNUSED_QUEUE_SLOT_LENGTH; i++)\n            queue->slots[queue->recvSlot][i] = dest[i];\n        queue->recvSlot++;\n        queue->recvSlot %= UNUSED_QUEUE_NUM_SLOTS;\n        queue->count++;\n    }\n    else\n    {\n        queue->full = TRUE;\n    }\n}\n\nstatic bool8 RfuUnusedQueue_Enqueue(struct RfuUnusedQueue *queue, u8 *dest)\n{\n    s32 i;\n\n    if (queue->recvSlot == queue->sendSlot || queue->full)\n        return FALSE;\n\n    for (i = 0; i < UNUSED_QUEUE_SLOT_LENGTH; i++)\n        dest[i] = queue->slots[queue->sendSlot][i];\n\n    queue->sendSlot++;\n    queue->sendSlot %= UNUSED_QUEUE_NUM_SLOTS;\n    queue->count--;\n    return TRUE;\n}\n\n// Unused\n// Populates an array with a sequence of numbers (which numbers depends on the mode)\n// and sets the final element to the total of the other elements\n#define SEQ_ARRAY_MAX_SIZE 200\nstatic void PopulateArrayWithSequence(u8 *arr, u8 mode)\n{\n    s32 i;\n    u8 rval;\n    u16 total = 0;\n    static u8 counter;\n\n    switch (mode)\n    {\n    case 0:\n        // Populate with numbers 1-200\n        // Total will be 20100\n        for (i = 0; i < SEQ_ARRAY_MAX_SIZE; i++)\n        {\n            arr[i] = i + 1;\n            total += i + 1;\n        }\n        *((u16 *)(arr + i)) = total;\n        break;\n    case 1:\n        // Populate with numbers 1-100\n        // Total will be 5050\n        for (i = 0; i < 100; i++)\n        {\n            arr[i] = i + 1;\n            total += i + 1;\n        }\n        *((u16 *)(arr + SEQ_ARRAY_MAX_SIZE)) = total;\n        break;\n    case 2:\n        // Populate with random numbers 0-255\n        // Total will be a number 0-51000\n        for (i = 0; i < SEQ_ARRAY_MAX_SIZE; i++)\n        {\n            rval = Random();\n            arr[i] = rval;\n            total += rval;\n        }\n        *((u16 *)(arr + i)) = total;\n        break;\n    case 3:\n        // Populate with numbers 1-200 + counter\n        // Total will be a number 20100-51000\n        for (i = 0; i < SEQ_ARRAY_MAX_SIZE; i++)\n        {\n            arr[i] = i + 1 + counter;\n            total += (i + 1 + counter) & 0xFF;\n        }\n        *((u16 *)(arr + i)) = total;\n        counter++;\n        break;\n    }\n}\n\nstatic void PkmnStrToASCII(u8 *dest, const u8 *src)\n{\n    s32 i;\n\n    for (i = 0; src[i] != EOS; i++)\n        dest[i] = sWireless_RSEtoASCIITable[src[i]];\n    dest[i] = 0;\n}\n\nstatic void ASCIIToPkmnStr(u8 *dest, const u8 *src)\n{\n    s32 i;\n\n    for (i = 0; src[i] != 0; i++)\n        dest[i] = sWireless_ASCIItoRSETable[src[i]];\n    dest[i] = EOS;\n}\n\nstatic u8 GetConnectedChildStrength(u8 maxFlags)\n{\n    u8 flagCount = 0;\n    u8 flags = gRfuLinkStatus->connSlotFlag;\n    u8 i;\n\n    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n    {\n        for (i = 0; i < 4; i++)\n        {\n            if (flags & 1)\n            {\n                if (maxFlags == flagCount + 1)\n                {\n                    return gRfuLinkStatus->strength[i];\n                    break; // This break is needed to match\n                }\n                flagCount++;\n            }\n            flags >>= 1;\n        }\n    }\n    else\n    {\n        for (i = 0; i < 4; i++)\n        {\n            if (flags & 1)\n                return gRfuLinkStatus->strength[i];\n            flags >>= 1;\n        }\n    }\n    return 0;\n}\n\nvoid InitHostRfuGameData(struct RfuGameData *data, u8 activity, bool32 startedActivity, s32 partnerInfo)\n{\n    s32 i;\n\n    for (i = 0; i < (s32)ARRAY_COUNT(data->compatibility.playerTrainerId); i++)\n        data->compatibility.playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        data->partnerInfo[i] = partnerInfo;\n        partnerInfo >>= 8; // Each element is 1 byte\n    }\n    data->playerGender = gSaveBlock2Ptr->playerGender;\n    data->activity = activity;\n    data->startedActivity = startedActivity;\n    data->compatibility.language = GAME_LANGUAGE;\n    data->compatibility.version = GAME_VERSION;\n    data->compatibility.hasNews = FALSE;\n    data->compatibility.hasCard = FALSE;\n    data->compatibility.unknown = FALSE;\n    data->compatibility.canLinkNationally = TRUE; //FlagGet(FLAG_SYS_CAN_LINK_WITH_RS);\n    data->compatibility.hasNationalDex = TRUE; //IsNationalPokedexEnabled();\n    data->compatibility.gameClear = FlagGet(FLAG_SYS_GAME_CLEAR_OLD);\n}\n\n/*\n * ================================================================\n * Returns 1 if parent, 0 if child or neutral.\n * If partner serial number is valid, copies gameData and username.\n * Otherwise, blanks these.\n * ================================================================\n */\nbool8 Rfu_GetCompatiblePlayerData(struct RfuGameData *gameData, u8 *username, u8 idx)\n{\n    bool8 retVal;\n\n    if (lman.parent_child == MODE_PARENT)\n    {\n        retVal = TRUE;\n        if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1))\n        {\n            memcpy(gameData, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);\n            memcpy(username, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH);\n        }\n        else\n        {\n            memset(gameData, 0, RFU_GAME_NAME_LENGTH);\n            memset(username, 0, RFU_USER_NAME_LENGTH);\n        }\n    }\n    else\n    {\n        retVal = FALSE;\n        if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[idx].serialNo))\n        {\n            memcpy(gameData, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);\n            memcpy(username, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH);\n        }\n        else\n        {\n            memset(gameData, 0, RFU_GAME_NAME_LENGTH);\n            memset(username, 0, RFU_USER_NAME_LENGTH);\n        }\n    }\n    return retVal;\n}\n\nbool8 Rfu_GetWonderDistributorPlayerData(struct RfuGameData *gameData, u8 *username, u8 idx)\n{\n    bool8 retVal = FALSE;\n    if (gRfuLinkStatus->partner[idx].serialNo == RFU_SERIAL_WONDER_DISTRIBUTOR)\n    {\n        memcpy(gameData, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);\n        memcpy(username, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH);\n        retVal = TRUE;\n    }\n    else\n    {\n        memset(gameData, 0, RFU_GAME_NAME_LENGTH);\n        memset(username, 0, RFU_USER_NAME_LENGTH);\n    }\n    return retVal;\n}\n\nvoid CopyHostRfuGameDataAndUsername(struct RfuGameData *gameData, u8 *username)\n{\n    memcpy(gameData, &gHostRfuGameData, RFU_GAME_NAME_LENGTH);\n    memcpy(username, gHostRfuUsername, RFU_USER_NAME_LENGTH);\n}\n\n#define sNextAnimNum  data[0]\n#define sSavedAnimNum data[1]\n#define sCurrAnimNum  data[2]\n#define sFrameDelay   data[3]\n#define sFrameIdx     data[4]\n#define sTileStart    data[6]\n#define sValidator    data[7]\n#define STATUS_INDICATOR_ACTIVE 0x1234 // Used to validate active indicator\n\nvoid CreateWirelessStatusIndicatorSprite(u8 x, u8 y)\n{\n    u8 sprId;\n\n    if (x == 0 && y == 0)\n    {\n        x = 231;\n        y =   8;\n    }\n    if (gRfuLinkStatus->parentChild == MODE_PARENT)\n    {\n        sprId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0);\n        gSprites[sprId].sValidator = STATUS_INDICATOR_ACTIVE;\n        gSprites[sprId].sTileStart = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag);\n        gSprites[sprId].invisible = TRUE;\n        sWirelessStatusIndicatorSpriteId = sprId;\n    }\n    else\n    {\n        sWirelessStatusIndicatorSpriteId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0);\n        gSprites[sWirelessStatusIndicatorSpriteId].sValidator = STATUS_INDICATOR_ACTIVE;\n        gSprites[sWirelessStatusIndicatorSpriteId].sTileStart = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag);\n        gSprites[sWirelessStatusIndicatorSpriteId].invisible = TRUE;\n    }\n}\n\nvoid DestroyWirelessStatusIndicatorSprite(void)\n{\n    if (gSprites[sWirelessStatusIndicatorSpriteId].sValidator == STATUS_INDICATOR_ACTIVE)\n    {\n        gSprites[sWirelessStatusIndicatorSpriteId].sValidator = 0;\n        DestroySprite(&gSprites[sWirelessStatusIndicatorSpriteId]);\n        gMain.oamBuffer[125] = gDummyOamData;\n        CpuCopy16(&gDummyOamData, (struct OamData *)OAM + 125, sizeof(struct OamData));\n    }\n}\n\nvoid LoadWirelessStatusIndicatorSpriteGfx(void)\n{\n    if (GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag) == 0xFFFF)\n        LoadCompressedSpriteSheet(&sWirelessStatusIndicatorSpriteSheet);\n    LoadSpritePalette(&sWirelessStatusIndicatorSpritePalette);\n    sWirelessStatusIndicatorSpriteId = SPRITE_NONE;\n}\n\nstatic u8 GetParentSignalStrength(void)\n{\n    u8 i;\n    u8 flags = gRfuLinkStatus->connSlotFlag;\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (flags & 1)\n            return gRfuLinkStatus->strength[i];\n        flags >>= 1;\n    }\n    return 0;\n}\n\nstatic void SetAndRestartWirelessStatusIndicatorAnim(struct Sprite *sprite, s32 animNum)\n{\n    if (sprite->sCurrAnimNum != animNum)\n    {\n        sprite->sCurrAnimNum = animNum;\n        sprite->sFrameDelay = 0;\n        sprite->sFrameIdx = 0;\n    }\n}\n\nvoid UpdateWirelessStatusIndicatorSprite(void)\n{\n    if (sWirelessStatusIndicatorSpriteId != SPRITE_NONE && gSprites[sWirelessStatusIndicatorSpriteId].sValidator == STATUS_INDICATOR_ACTIVE)\n    {\n        struct Sprite *sprite = &gSprites[sWirelessStatusIndicatorSpriteId];\n        u8 signalStrength = RFU_LINK_ICON_LEVEL4_MAX;\n        u8 i = 0;\n\n        // Get weakest signal strength\n        if (gRfuLinkStatus->parentChild == MODE_PARENT)\n        {\n            for (i = 0; i < GetLinkPlayerCount() - 1; i++)\n            {\n                if (signalStrength >= GetConnectedChildStrength(i + 1))\n                    signalStrength = GetConnectedChildStrength(i + 1);\n            }\n        }\n        else\n        {\n            signalStrength = GetParentSignalStrength();\n        }\n\n        // Set signal strength sprite anim number\n        if (IsRfuRecoveringFromLinkLoss() == TRUE)\n            sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_ERROR;\n        else if (signalStrength <= RFU_LINK_ICON_LEVEL1_MAX)\n            sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_SEARCHING;\n        else if (signalStrength >= RFU_LINK_ICON_LEVEL2_MIN && signalStrength <= RFU_LINK_ICON_LEVEL2_MAX)\n            sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_1_BAR;\n        else if (signalStrength >= RFU_LINK_ICON_LEVEL3_MIN && signalStrength <= RFU_LINK_ICON_LEVEL3_MAX)\n            sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_2_BARS;\n        else if (signalStrength >= RFU_LINK_ICON_LEVEL4_MIN)\n            sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_3_BARS;\n\n        if (sprite->sNextAnimNum != sprite->sSavedAnimNum)\n        {\n            SetAndRestartWirelessStatusIndicatorAnim(sprite, sprite->sNextAnimNum);\n            sprite->sSavedAnimNum = sprite->sNextAnimNum;\n        }\n        if (sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].frame.duration < sprite->sFrameDelay)\n        {\n            sprite->sFrameIdx++;\n            sprite->sFrameDelay = 0;\n            if (sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].type == -2) // ANIMCMD_JUMP\n                sprite->sFrameIdx = 0;\n        }\n        else\n        {\n            sprite->sFrameDelay++;\n        }\n        gMain.oamBuffer[125] = sWirelessStatusIndicatorOamData;\n        gMain.oamBuffer[125].x = sprite->x + sprite->centerToCornerVecX;\n        gMain.oamBuffer[125].y = sprite->y + sprite->centerToCornerVecY;\n        gMain.oamBuffer[125].paletteNum = sprite->oam.paletteNum;\n        gMain.oamBuffer[125].tileNum = sprite->sTileStart + sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].frame.imageValue;\n        CpuCopy16(gMain.oamBuffer + 125, (struct OamData *)OAM + 125, sizeof(struct OamData));\n        if (RfuGetStatus() == RFU_STATUS_FATAL_ERROR)\n        {\n            DestroyWirelessStatusIndicatorSprite();\n        }\n    }\n}\n\n#undef sNextAnimNum\n#undef sSavedAnimNum\n#undef sCurrAnimNum\n#undef sFrameDelay\n#undef sFrameIdx\n#undef sTileStart\n#undef sValidator\n\nstatic void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name)\n{\n    int i;\n    dest->trainerId = trainerId;\n    for (i = 0; i < PLAYER_NAME_LENGTH; i++)\n    {\n        if (name[i] == EOS)\n            break;\n        dest->trainerName[i] = name[i];\n    }\n    dest->trainerName[i] = EOS;\n}\n\nstatic void ZeroName(u8 *name)\n{\n    s32 i;\n\n    for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)\n        *name++ = 0;\n}\n\nstatic bool32 NameIsEmpty(const u8 *name)\n{\n    s32 i;\n\n    for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)\n    {\n        if (*name++ != 0)\n            return FALSE;\n    }\n    return TRUE;\n}\n\n// Save the currently connected players into the trainer records, shifting all previous records down.\nvoid SaveLinkTrainerNames(void)\n{\n    if (gWirelessCommType != 0)\n    {\n        s32 i;\n        s32 j;\n        s32 nextSpace;\n        s32 connectedTrainerRecordIndices[5];\n        struct TrainerNameRecord *newRecords = AllocZeroed(sizeof(gSaveBlock1Ptr->trainerNameRecords));\n\n        // Check if we already have a record saved for connected trainers.\n        for (i = 0; i < GetLinkPlayerCount(); i++)\n        {\n            connectedTrainerRecordIndices[i] = -1;\n            for (j = 0; j < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); j++)\n            {\n                if ((u16)gLinkPlayers[i].trainerId ==  gSaveBlock1Ptr->trainerNameRecords[j].trainerId && StringCompare(gLinkPlayers[i].name, gSaveBlock1Ptr->trainerNameRecords[j].trainerName) == 0)\n                {\n                    connectedTrainerRecordIndices[i] = j;\n                }\n            }\n        }\n\n        // Save the connected trainers first, at the top of the list.\n        nextSpace = 0;\n        for (i = 0; i < GetLinkPlayerCount(); i++)\n        {\n            if (i != GetMultiplayerId() && gLinkPlayers[i].language != LANGUAGE_JAPANESE)\n            {\n                CopyTrainerRecord(&newRecords[nextSpace], (u16)gLinkPlayers[i].trainerId, gLinkPlayers[i].name);\n\n                // If we already had a record for this trainer, wipe it so that the next step doesn't duplicate it.\n                if (connectedTrainerRecordIndices[i] >= 0)\n                    ZeroName(gSaveBlock1Ptr->trainerNameRecords[connectedTrainerRecordIndices[i]].trainerName);\n                nextSpace++;\n            }\n        }\n\n        // Copy all non-empty records to the new list, in the order they appear on the old list. If the list is full,\n        // the last (oldest) records will be dropped.\n        for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); i++)\n        {\n            if (!NameIsEmpty(gSaveBlock1Ptr->trainerNameRecords[i].trainerName))\n            {\n                CopyTrainerRecord(&newRecords[nextSpace], gSaveBlock1Ptr->trainerNameRecords[i].trainerId, gSaveBlock1Ptr->trainerNameRecords[i].trainerName);\n                if (++nextSpace >= (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords))\n                    break;\n            }\n        }\n\n        // Finalize the new list, and clean up.\n        memcpy(gSaveBlock1Ptr->trainerNameRecords, newRecords, sizeof(gSaveBlock1Ptr->trainerNameRecords));\n        Free(newRecords);\n    }\n}\n\nbool32 PlayerHasMetTrainerBefore(u16 id, u8 *name)\n{\n    s32 i;\n\n    for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); i++)\n    {\n        if (StringCompareN(gSaveBlock1Ptr->trainerNameRecords[i].trainerName, name, PLAYER_NAME_LENGTH) == 0\n         && gSaveBlock1Ptr->trainerNameRecords[i].trainerId == id)\n            return TRUE;\n\n        if (NameIsEmpty(gSaveBlock1Ptr->trainerNameRecords[i].trainerName))\n            return FALSE;\n    }\n    return FALSE;\n}\n"
  },
  {
    "path": "src/list_menu.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"menu.h\"\n#include \"list_menu.h\"\n#include \"menu_indicators.h\"\n#include \"new_menu_helpers.h\"\n#include \"text_window.h\"\n#include \"task.h\"\n#include \"graphics.h\"\n#include \"strings.h\"\n#include \"pokemon_icon.h\"\n#include \"constants/songs.h\"\n\nstruct MysteryGiftLinkMenuStruct\n{\n    u32 currItemId;\n    u8 state;\n    u8 windowId;\n    u8 listTaskId;\n};\n\nstruct ListMenuOverride\n{\n    u8 cursorPal:4;\n    u8 fillValue:4;\n    u8 cursorShadowPal:4;\n    u8 lettersSpacing:6;\n    u8 field_2_2:6; // unused\n    u8 fontId:7;\n    bool8 enabled:1;\n};\n\nstruct MoveMenuInfoIcon\n{\n    u8 width;\n    u8 height;\n    u16 offset;\n};\n\nstatic EWRAM_DATA struct MysteryGiftLinkMenuStruct sMysteryGiftLinkMenu = {0};\n\nstruct ListMenuOverride gListMenuOverride;\nstruct ListMenuTemplate gMultiuseListMenuTemplate;\n\nstatic u8 ListMenuInitInternal(const struct ListMenuTemplate *listMenuTemplate, u16 cursorPos, u16 itemsAbove);\nstatic bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown);\nstatic void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count);\nstatic void ListMenuDrawCursor(struct ListMenu *list);\nstatic void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit);\nstatic u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind);\n\nstatic const struct MoveMenuInfoIcon sMenuInfoIcons[] =\n{   // { width, height, offset }\n    [MENU_INFO_ICON_CAUGHT] = { 12, 12, 0x00 },\n    [TYPE_NORMAL + 1]   = { 32, 12, 0x20 },\n    [TYPE_FIGHTING + 1] = { 32, 12, 0x64 },\n    [TYPE_FLYING + 1]   = { 32, 12, 0x60 },\n    [TYPE_POISON + 1]   = { 32, 12, 0x80 },\n    [TYPE_GROUND + 1]   = { 32, 12, 0x48 },\n    [TYPE_ROCK + 1]     = { 32, 12, 0x44 },\n    [TYPE_BUG + 1]      = { 32, 12, 0x6C },\n    [TYPE_GHOST + 1]    = { 32, 12, 0x68 },\n    [TYPE_STEEL + 1]    = { 32, 12, 0x88 },\n    [TYPE_MYSTERY + 1]  = { 32, 12, 0xA4 },\n    [TYPE_FIRE + 1]     = { 32, 12, 0x24 },\n    [TYPE_WATER + 1]    = { 32, 12, 0x28 },\n    [TYPE_GRASS + 1]    = { 32, 12, 0x2C },\n    [TYPE_ELECTRIC + 1] = { 32, 12, 0x40 },\n    [TYPE_PSYCHIC + 1]  = { 32, 12, 0x84 },\n    [TYPE_ICE + 1]      = { 32, 12, 0x4C },\n    [TYPE_DRAGON + 1]   = { 32, 12, 0xA0 },\n    [TYPE_DARK + 1]     = { 32, 12, 0x8C },\n    [MENU_INFO_ICON_TYPE]      = { 40, 12, 0xA8 },\n    [MENU_INFO_ICON_POWER]     = { 40, 12, 0xC0 },\n    [MENU_INFO_ICON_ACCURACY]  = { 40, 12, 0xC8 },\n    [MENU_INFO_ICON_PP]        = { 40, 12, 0xE0 },\n    [MENU_INFO_ICON_EFFECT]    = { 40, 12, 0xE8 },\n};\n\nstatic void ListMenuDummyTask(u8 taskId)\n{\n}\n\nu32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palOffset)\n{\n    switch (sMysteryGiftLinkMenu.state)\n    {\n    case 0:\n    default:\n        sMysteryGiftLinkMenu.windowId = AddWindow(windowTemplate);\n        switch (arg2)\n        {\n        case 2:\n            LoadUserWindowGfx(sMysteryGiftLinkMenu.windowId, tileNum, palOffset);\n        case 1:\n            DrawTextBorderOuter(sMysteryGiftLinkMenu.windowId, tileNum, palOffset / 16);\n            break;\n        }\n        gMultiuseListMenuTemplate = *listMenuTemplate;\n        gMultiuseListMenuTemplate.windowId = sMysteryGiftLinkMenu.windowId;\n        sMysteryGiftLinkMenu.listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);\n        CopyWindowToVram(sMysteryGiftLinkMenu.windowId, COPYWIN_MAP);\n        sMysteryGiftLinkMenu.state = 1;\n        break;\n    case 1:\n        sMysteryGiftLinkMenu.currItemId = ListMenu_ProcessInput(sMysteryGiftLinkMenu.listTaskId);\n        if (JOY_NEW(A_BUTTON))\n        {\n            sMysteryGiftLinkMenu.state = 2;\n        }\n        if (JOY_NEW(B_BUTTON))\n        {\n            sMysteryGiftLinkMenu.currItemId = LIST_CANCEL;\n            sMysteryGiftLinkMenu.state = 2;\n        }\n        if (sMysteryGiftLinkMenu.state == 2)\n        {\n            if (!arg2)\n            {\n                ClearWindowTilemap(sMysteryGiftLinkMenu.windowId);\n            }\n            else\n            {\n                switch (arg2)\n                {\n                case 0: // can never be reached, because of the if statement above\n                    ClearStdWindowAndFrame(sMysteryGiftLinkMenu.windowId, FALSE);\n                    break;\n                case 2:\n                case 1:\n                    ClearStdWindowAndFrame(sMysteryGiftLinkMenu.windowId, FALSE);\n                    break;\n                }\n            }\n            CopyWindowToVram(sMysteryGiftLinkMenu.windowId, COPYWIN_MAP);\n        }\n        break;\n    case 2:\n        DestroyListMenuTask(sMysteryGiftLinkMenu.listTaskId, NULL, NULL);\n        RemoveWindow(sMysteryGiftLinkMenu.windowId);\n        sMysteryGiftLinkMenu.state = 0;\n        return sMysteryGiftLinkMenu.currItemId;\n    }\n    return LIST_NOTHING_CHOSEN;\n}\n\nu8 ListMenuInit(const struct ListMenuTemplate *listMenuTemplate, u16 cursorPos, u16 itemsAbove)\n{\n    u8 taskId = ListMenuInitInternal(listMenuTemplate, cursorPos, itemsAbove);\n    PutWindowTilemap(listMenuTemplate->windowId);\n    CopyWindowToVram(listMenuTemplate->windowId, COPYWIN_GFX);\n    return taskId;\n}\n\nu8 ListMenuInitInRect(const struct ListMenuTemplate *listMenuTemplate, const struct ListMenuWindowRect *rect, u16 cursorPos, u16 itemsAbove)\n{\n    s32 i;\n    u8 taskId = ListMenuInitInternal(listMenuTemplate, cursorPos, itemsAbove);\n    \n    for (i = 0; rect[i].palNum != 0xFF; i++)\n        PutWindowRectTilemapOverridePalette(listMenuTemplate->windowId, rect[i].x, rect[i].y, rect[i].width, rect[i].height, rect[i].palNum);\n    CopyWindowToVram(listMenuTemplate->windowId, COPYWIN_GFX);\n    return taskId;\n}\n\ns32 ListMenu_ProcessInput(u8 listTaskId)\n{\n    struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        return list->template.items[list->cursorPos + list->itemsAbove].index;\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        return LIST_CANCEL;\n    }\n    else if (gMain.newAndRepeatedKeys & DPAD_UP)\n    {\n        ListMenuChangeSelection(list, TRUE, 1, FALSE);\n        return LIST_NOTHING_CHOSEN;\n    }\n    else if (gMain.newAndRepeatedKeys & DPAD_DOWN)\n    {\n        ListMenuChangeSelection(list, TRUE, 1, TRUE);\n        return LIST_NOTHING_CHOSEN;\n    }\n    else // try to move by one window scroll\n    {\n        bool16 rightButton, leftButton;\n        switch (list->template.scrollMultiple)\n        {\n        case LIST_NO_MULTIPLE_SCROLL:\n        default:\n            leftButton = FALSE;\n            rightButton = FALSE;\n            break;\n        case LIST_MULTIPLE_SCROLL_DPAD:\n            leftButton = gMain.newAndRepeatedKeys & DPAD_LEFT;\n            rightButton = gMain.newAndRepeatedKeys & DPAD_RIGHT;\n            break;\n        case LIST_MULTIPLE_SCROLL_L_R:\n            leftButton = gMain.newAndRepeatedKeys & L_BUTTON;\n            rightButton = gMain.newAndRepeatedKeys & R_BUTTON;\n            break;\n        }\n        if (leftButton)\n        {\n            ListMenuChangeSelection(list, TRUE, list->template.maxShowed, FALSE);\n            return LIST_NOTHING_CHOSEN;\n        }\n        else if (rightButton)\n        {\n            ListMenuChangeSelection(list, TRUE, list->template.maxShowed, TRUE);\n            return LIST_NOTHING_CHOSEN;\n        }\n        else\n        {\n            return LIST_NOTHING_CHOSEN;\n        }\n    }\n}\n\nvoid DestroyListMenuTask(u8 listTaskId, u16 *cursorPos, u16 *itemsAbove)\n{\n    struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;\n\n    if (cursorPos != NULL)\n        *cursorPos = list->cursorPos;\n    if (itemsAbove != NULL)\n        *itemsAbove = list->itemsAbove;\n\n    if (list->taskId != TAIL_SENTINEL)\n        ListMenuRemoveCursorObject(list->taskId, list->template.cursorKind - 2);\n\n    DestroyTask(listTaskId);\n}\n\nvoid RedrawListMenu(u8 listTaskId)\n{\n    struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;\n\n    FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue));\n    ListMenuPrintEntries(list, list->cursorPos, 0, list->template.maxShowed);\n    ListMenuDrawCursor(list);\n    CopyWindowToVram(list->template.windowId, COPYWIN_GFX);\n}\n\nstatic void ChangeListMenuPals(u8 listTaskId, u8 cursorPal, u8 fillValue, u8 cursorShadowPal)\n{\n    struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;\n\n    list->template.cursorPal = cursorPal;\n    list->template.fillValue = fillValue;\n    list->template.cursorShadowPal = cursorShadowPal;\n}\n\nstatic void ChangeListMenuCoords(u8 listTaskId, u8 x, u8 y)\n{\n    struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;\n\n    SetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT, x);\n    SetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP, y);\n}\n\nstatic s32 ListMenuTestInput(struct ListMenuTemplate *template, u32 cursorPos, u32 itemsAbove, u16 keys, u16 *newCursorPos, u16 *newItemsAbove)\n{\n    struct ListMenu list;\n\n    list.template = *template;\n    list.cursorPos = cursorPos;\n    list.itemsAbove = itemsAbove;\n    list.unk_1C = 0;\n    list.unk_1D = 0;\n    if (keys == DPAD_UP)\n        ListMenuChangeSelection(&list, FALSE, 1, FALSE);\n    if (keys == DPAD_DOWN)\n        ListMenuChangeSelection(&list, FALSE, 1, TRUE);\n\n    if (newCursorPos != NULL)\n        *newCursorPos = list.cursorPos;\n    if (newItemsAbove != NULL)\n        *newItemsAbove = list.itemsAbove;\n    return LIST_NOTHING_CHOSEN;\n}\n\nstatic void ListMenuGetCurrentItemArrayId(u8 listTaskId, u16 *arrayId)\n{\n    struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;\n\n    if (arrayId != NULL)\n        *arrayId = list->cursorPos + list->itemsAbove;\n}\n\nvoid ListMenuGetScrollAndRow(u8 listTaskId, u16 *cursorPos, u16 *itemsAbove)\n{\n    struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;\n\n    if (cursorPos != NULL)\n        *cursorPos = list->cursorPos;\n    if (itemsAbove != NULL)\n        *itemsAbove = list->itemsAbove;\n}\n\nu16 ListMenuGetYCoordForPrintingArrowCursor(u8 listTaskId)\n{\n    struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;\n    u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;\n\n    return list->itemsAbove * yMultiplier + list->template.upText_Y;\n}\n\nstatic u8 ListMenuInitInternal(const struct ListMenuTemplate *listMenuTemplate, u16 cursorPos, u16 itemsAbove)\n{\n    u8 listTaskId = CreateTask(ListMenuDummyTask, 0);\n    struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;\n\n    list->template = *listMenuTemplate;\n    list->cursorPos = cursorPos;\n    list->itemsAbove = itemsAbove;\n    list->unk_1C = 0;\n    list->unk_1D = 0;\n    list->taskId = TAIL_SENTINEL;\n    list->unk_1F = 0;\n    gListMenuOverride.cursorPal = list->template.cursorPal;\n    gListMenuOverride.fillValue = list->template.fillValue;\n    gListMenuOverride.cursorShadowPal = list->template.cursorShadowPal;\n    gListMenuOverride.lettersSpacing = list->template.lettersSpacing;\n    gListMenuOverride.fontId = list->template.fontId;\n    gListMenuOverride.enabled = FALSE;\n    if (list->template.totalItems < list->template.maxShowed)\n        list->template.maxShowed = list->template.totalItems;\n    FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue));\n    ListMenuPrintEntries(list, list->cursorPos, 0, list->template.maxShowed);\n    ListMenuDrawCursor(list);\n    ListMenuCallSelectionChangedCallback(list, TRUE);\n\n    return listTaskId;\n}\n\nstatic void ListMenuPrint(struct ListMenu *list, const u8 *str, u8 x, u8 y)\n{\n    u8 colors[3];\n    if (gListMenuOverride.enabled)\n    {\n        colors[0] = gListMenuOverride.fillValue;\n        colors[1] = gListMenuOverride.cursorPal;\n        colors[2] = gListMenuOverride.cursorShadowPal;\n        AddTextPrinterParameterized4(list->template.windowId, gListMenuOverride.fontId, x, y, gListMenuOverride.lettersSpacing, 0, colors, TEXT_SKIP_DRAW, str);\n        gListMenuOverride.enabled = FALSE;\n    }\n    else\n    {\n        colors[0] = list->template.fillValue;\n        colors[1] = list->template.cursorPal;\n        colors[2] = list->template.cursorShadowPal;\n        AddTextPrinterParameterized4(list->template.windowId, list->template.fontId, x, y, list->template.lettersSpacing, 0, colors, TEXT_SKIP_DRAW, str);\n    }\n}\n\nstatic void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count)\n{\n    s32 i;\n    u8 x, y;\n    u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;\n\n    for (i = 0; i < count; i++)\n    {\n        if (list->template.items[startIndex].index != LIST_HEADER)\n            x = list->template.item_X;\n        else\n            x = list->template.header_X;\n        y = (yOffset + i) * yMultiplier + list->template.upText_Y;\n        if (list->template.itemPrintFunc != NULL)\n            list->template.itemPrintFunc(list->template.windowId, list->template.items[startIndex].index, y);\n        ListMenuPrint(list, list->template.items[startIndex].label, x, y);\n        startIndex++;\n    }\n}\n\nstatic void ListMenuDrawCursor(struct ListMenu *list)\n{\n    u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;\n    u8 x = list->template.cursor_X;\n    u8 y = list->itemsAbove * yMultiplier + list->template.upText_Y;\n    \n    switch (list->template.cursorKind)\n    {\n    case 0:\n        ListMenuPrint(list, gText_SelectorArrow2, x, y);\n        break;\n    case 1:\n        break;\n    case 2:\n        if (list->taskId == TAIL_SENTINEL)\n            list->taskId = ListMenuAddCursorObject(list, 0);\n        ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 - 1, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y - 1, 0);\n        break;\n    case 3:\n        if (list->taskId == TAIL_SENTINEL)\n            list->taskId = ListMenuAddCursorObject(list, 1);\n        ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 + x, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y, 1);\n        break;\n    }\n}\n\nstatic u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind)\n{\n    struct CursorStruct cursor;\n\n    cursor.left = 0;\n    cursor.top = 160;\n    cursor.rowWidth = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8 + 2;\n    cursor.rowHeight = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + 2;\n    cursor.tileTag = 0x4000;\n    cursor.palTag = TAG_NONE;\n    cursor.palNum = 15;\n    return ListMenuAddCursorObjectInternal(&cursor, cursorKind);\n}\n\nstatic void ListMenuErasePrintedCursor(struct ListMenu *list, u16 itemsAbove)\n{\n    u8 cursorKind = list->template.cursorKind;\n    if (cursorKind == 0)\n    {\n        u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;\n        u8 width  = GetMenuCursorDimensionByFont(list->template.fontId, 0);\n        u8 height = GetMenuCursorDimensionByFont(list->template.fontId, 1);\n        FillWindowPixelRect(list->template.windowId,\n                            PIXEL_FILL(list->template.fillValue),\n                            list->template.cursor_X,\n                            itemsAbove * yMultiplier + list->template.upText_Y,\n                            width,\n                            height);\n    }\n}\n\nstatic u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, bool8 movingDown)\n{\n    u16 itemsAbove = list->itemsAbove;\n    u16 cursorPos = list->cursorPos;\n    u16 newRow;\n    u32 newScroll;\n\n    if (!movingDown)\n    {\n        if (list->template.maxShowed == 1)\n            newRow = 0;\n        else\n            newRow = list->template.maxShowed - ((list->template.maxShowed / 2) + (list->template.maxShowed % 2)) - 1;\n\n        if (cursorPos == 0)\n        {\n            while (itemsAbove != 0)\n            {\n                itemsAbove--;\n                if (list->template.items[cursorPos + itemsAbove].index != LIST_HEADER)\n                {\n                    list->itemsAbove = itemsAbove;\n                    return 1;\n                }\n            }\n            return 0;\n        }\n        else\n        {\n            while (itemsAbove > newRow)\n            {\n                itemsAbove--;\n                if (list->template.items[cursorPos + itemsAbove].index != LIST_HEADER)\n                {\n                    list->itemsAbove = itemsAbove;\n                    return 1;\n                }\n            }\n            newScroll = cursorPos - 1;\n        }\n    }\n    else\n    {\n        if (list->template.maxShowed == 1)\n            newRow = 0;\n        else\n            newRow = ((list->template.maxShowed / 2) + (list->template.maxShowed % 2));\n\n        if (cursorPos == list->template.totalItems - list->template.maxShowed)\n        {\n            while (itemsAbove < list->template.maxShowed - 1)\n            {\n                itemsAbove++;\n                if (list->template.items[cursorPos + itemsAbove].index != LIST_HEADER)\n                {\n                    list->itemsAbove = itemsAbove;\n                    return 1;\n                }\n            }\n            return 0;\n        }\n        else\n        {\n            while (itemsAbove < newRow)\n            {\n                itemsAbove++;\n                if (list->template.items[cursorPos + itemsAbove].index != LIST_HEADER)\n                {\n                    list->itemsAbove = itemsAbove;\n                    return 1;\n                }\n            }\n            newScroll = cursorPos + 1;\n        }\n    }\n    list->itemsAbove = newRow;\n    list->cursorPos = newScroll;\n    return 2;\n}\n\nstatic void ListMenuScroll(struct ListMenu *list, u8 count, bool8 movingDown)\n{\n    if (count >= list->template.maxShowed)\n    {\n        FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue));\n        ListMenuPrintEntries(list, list->cursorPos, 0, list->template.maxShowed);\n    }\n    else\n    {\n        u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;\n\n        if (!movingDown)\n        {\n            u16 y, width, height;\n\n            ScrollWindow(list->template.windowId, 1, count * yMultiplier, PIXEL_FILL(list->template.fillValue));\n            ListMenuPrintEntries(list, list->cursorPos, 0, count);\n\n            y = (list->template.maxShowed * yMultiplier) + list->template.upText_Y;\n            width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8;\n            height = (GetWindowAttribute(list->template.windowId, WINDOW_HEIGHT) * 8) - y;\n            FillWindowPixelRect(list->template.windowId,\n                                PIXEL_FILL(list->template.fillValue),\n                                0, y, width, height);\n        }\n        else\n        {\n            u16 width;\n\n            ScrollWindow(list->template.windowId, 0, count * yMultiplier, PIXEL_FILL(list->template.fillValue));\n            ListMenuPrintEntries(list, list->cursorPos + (list->template.maxShowed - count), list->template.maxShowed - count, count);\n\n            width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8;\n            FillWindowPixelRect(list->template.windowId,\n                                PIXEL_FILL(list->template.fillValue),\n                                0, 0, width, list->template.upText_Y);\n        }\n    }\n}\n\nstatic bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown)\n{\n    u16 oldSelectedRow;\n    u8 selectionChange, i, cursorCount;\n\n    oldSelectedRow = list->itemsAbove;\n    cursorCount = 0;\n    selectionChange = 0;\n    for (i = 0; i < count; i++)\n    {\n        do\n        {\n            u8 ret = ListMenuUpdateSelectedRowIndexAndScrollOffset(list, movingDown);\n            \n            selectionChange |= ret;\n            if (ret != 2)\n                break;\n            cursorCount++;\n        }\n        while (list->template.items[list->cursorPos + list->itemsAbove].index == LIST_HEADER);\n    }\n\n    if (updateCursorAndCallCallback)\n    {\n        switch (selectionChange)\n        {\n        case 0:\n        default:\n            return TRUE;\n        case 1:\n            ListMenuErasePrintedCursor(list, oldSelectedRow);\n            ListMenuDrawCursor(list);\n            ListMenuCallSelectionChangedCallback(list, FALSE);\n            CopyWindowToVram(list->template.windowId, COPYWIN_GFX);\n            break;\n        case 2:\n        case 3:\n            ListMenuErasePrintedCursor(list, oldSelectedRow);\n            ListMenuScroll(list, cursorCount, movingDown);\n            ListMenuDrawCursor(list);\n            ListMenuCallSelectionChangedCallback(list, FALSE);\n            CopyWindowToVram(list->template.windowId, COPYWIN_GFX);\n            break;\n        }\n    }\n    return FALSE;\n}\n\nstatic void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit)\n{\n    if (list->template.moveCursorFunc != NULL)\n        list->template.moveCursorFunc(list->template.items[list->cursorPos + list->itemsAbove].index, onInit, list);\n}\n\nvoid ListMenuOverrideSetColors(u8 cursorPal, u8 fillValue, u8 cursorShadowPal)\n{\n    gListMenuOverride.cursorPal = cursorPal;\n    gListMenuOverride.fillValue = fillValue;\n    gListMenuOverride.cursorShadowPal = cursorShadowPal;\n    gListMenuOverride.enabled = TRUE;\n}\n\nvoid ListMenuDefaultCursorMoveFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)\n{\n    if (!onInit)\n        PlaySE(SE_SELECT);\n}\n\nstatic s32 ListMenuGetTemplateField(u8 taskId, u8 field)\n{\n    struct ListMenu *data = (struct ListMenu *)gTasks[taskId].data;\n\n    switch (field)\n    {\n    case LISTFIELD_MOVECURSORFUNC:\n    case LISTFIELD_MOVECURSORFUNC2:\n        return (s32)(data->template.moveCursorFunc);\n    case LISTFIELD_TOTALITEMS:\n        return data->template.totalItems;\n    case LISTFIELD_MAXSHOWED:\n        return data->template.maxShowed;\n    case LISTFIELD_WINDOWID:\n        return data->template.windowId;\n    case LISTFIELD_HEADERX:\n        return data->template.header_X;\n    case LISTFIELD_ITEMX:\n        return data->template.item_X;\n    case LISTFIELD_CURSORX:\n        return data->template.cursor_X;\n    case LISTFIELD_UPTEXTY:\n        return data->template.upText_Y;\n    case LISTFIELD_CURSORPAL:\n        return data->template.cursorPal;\n    case LISTFIELD_FILLVALUE:\n        return data->template.fillValue;\n    case LISTFIELD_CURSORSHADOWPAL:\n        return data->template.cursorShadowPal;\n    case LISTFIELD_LETTERSPACING:\n        return data->template.lettersSpacing;\n    case LISTFIELD_ITEMVERTICALPADDING:\n        return data->template.itemVerticalPadding;\n    case LISTFIELD_SCROLLMULTIPLE:\n        return data->template.scrollMultiple;\n    case LISTFIELD_FONTID:\n        return data->template.fontId;\n    case LISTFIELD_CURSORKIND:\n        return data->template.cursorKind;\n    default:\n        return -1;\n    }\n}\n\nvoid ListMenuSetTemplateField(u8 taskId, u8 field, s32 value)\n{\n    struct ListMenu *data = (struct ListMenu *)gTasks[taskId].data;\n\n    switch (field)\n    {\n    case LISTFIELD_MOVECURSORFUNC:\n    case LISTFIELD_MOVECURSORFUNC2:\n        data->template.moveCursorFunc = (void *)value;\n        break;\n    case LISTFIELD_TOTALITEMS:\n        data->template.totalItems = value;\n        break;\n    case LISTFIELD_MAXSHOWED:\n        data->template.maxShowed = value;\n        break;\n    case LISTFIELD_WINDOWID:\n        data->template.windowId = value;\n        break;\n    case LISTFIELD_HEADERX:\n        data->template.header_X = value;\n        break;\n    case LISTFIELD_ITEMX:\n        data->template.item_X = value;\n        break;\n    case LISTFIELD_CURSORX:\n        data->template.cursor_X = value;\n        break;\n    case LISTFIELD_UPTEXTY:\n        data->template.upText_Y = value;\n        break;\n    case LISTFIELD_CURSORPAL:\n        data->template.cursorPal = value;\n        break;\n    case LISTFIELD_FILLVALUE:\n        data->template.fillValue = value;\n        break;\n    case LISTFIELD_CURSORSHADOWPAL:\n        data->template.cursorShadowPal = value;\n        break;\n    case LISTFIELD_LETTERSPACING:\n        data->template.lettersSpacing = value;\n        break;\n    case LISTFIELD_ITEMVERTICALPADDING:\n        data->template.itemVerticalPadding = value;\n        break;\n    case LISTFIELD_SCROLLMULTIPLE:\n        data->template.scrollMultiple = value;\n        break;\n    case LISTFIELD_FONTID:\n        data->template.fontId = value;\n        break;\n    case LISTFIELD_CURSORKIND:\n        data->template.cursorKind = value;\n        break;\n    }\n}\n\nvoid ListMenu_LoadMonIconPalette(u8 palOffset, u16 speciesId)\n{\n    LoadPalette(GetValidMonIconPalettePtr(speciesId), palOffset, PLTT_SIZE_4BPP);\n}\n\nvoid ListMenu_DrawMonIconGraphics(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y)\n{\n    BlitBitmapToWindow(windowId, GetMonIconPtr(speciesId, personality, 1), x, y, 32, 32);\n}\n\nvoid ListMenuLoadStdPalAt(u8 palOffset, u8 palId)\n{\n    const u16 *palette;\n\n    switch (palId)\n    {\n    case 0:\n    default:\n        palette = gMenuInfoElements1_Pal;\n        break;\n    case 1:\n        palette = gMenuInfoElements2_Pal;\n        break;\n    }\n    LoadPalette(palette, palOffset, PLTT_SIZE_4BPP);\n}\n\nvoid BlitMenuInfoIcon(u8 windowId, u8 iconId, u16 x, u16 y)\n{\n    BlitBitmapRectToWindow(windowId, &gMenuInfoElements_Gfx[sMenuInfoIcons[iconId].offset * TILE_SIZE_4BPP], 0, 0, 128, 128, x, y, sMenuInfoIcons[iconId].width, sMenuInfoIcons[iconId].height);\n}\n"
  },
  {
    "path": "src/load_save.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"gba/flash_internal.h\"\n#include \"load_save.h\"\n#include \"pokemon.h\"\n#include \"pokemon_storage_system.h\"\n#include \"random.h\"\n#include \"item.h\"\n#include \"save_location.h\"\n#include \"berry_powder.h\"\n#include \"overworld.h\"\n#include \"quest_log.h\"\n#include \"constants/items.h\"\n\n#define SAVEBLOCK_MOVE_RANGE    128\n\nstruct LoadedSaveData\n{\n /*0x0000*/ struct ItemSlot items[BAG_ITEMS_COUNT];\n /*0x0078*/ struct ItemSlot keyItems[BAG_KEYITEMS_COUNT];\n /*0x00F0*/ struct ItemSlot pokeBalls[BAG_POKEBALLS_COUNT];\n /*0x0130*/ struct ItemSlot TMsHMs[BAG_TMHM_COUNT];\n /*0x0230*/ struct ItemSlot berries[BAG_BERRIES_COUNT];\n /*0x02E8*/ struct Mail mail[MAIL_COUNT];\n            struct ItemSlot medicine[BAG_MEDICINE_COUNT];\n            struct ItemSlot heldItems[BAG_HELD_ITEMS_COUNT];\n};\n\n// EWRAM DATA\nEWRAM_DATA struct SaveBlock2 gSaveBlock2 = {0};\nEWRAM_DATA u8 gSaveBlock2_DMA[SAVEBLOCK_MOVE_RANGE] = {0};\n\nEWRAM_DATA struct SaveBlock1 gSaveBlock1 = {0};\nEWRAM_DATA u8 gSaveBlock1_DMA[SAVEBLOCK_MOVE_RANGE] = {0};\n\nEWRAM_DATA struct PokemonStorage gPokemonStorage = {0};\nEWRAM_DATA u8 gSaveBlock3_DMA[SAVEBLOCK_MOVE_RANGE] = {0};\n\nEWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0};\nEWRAM_DATA u32 gLastEncryptionKey = 0;\n\n// IWRAM common\nbool32 gFlashMemoryPresent;\nstruct SaveBlock1 *gSaveBlock1Ptr;\nstruct SaveBlock2 *gSaveBlock2Ptr;\nstruct PokemonStorage *gPokemonStoragePtr;\n\nextern struct ItemSlot gKeyItemSlots[BAG_KEYITEMS_COUNT];\n\nvoid CheckForFlashMemory(void)\n{\n    if (!IdentifyFlash())\n    {\n        gFlashMemoryPresent = TRUE;\n        InitFlashTimer();\n    }\n    else\n    {\n        gFlashMemoryPresent = FALSE;\n    }\n}\n\nvoid ClearSav2(void)\n{\n    CpuFill16(0, &gSaveBlock2, sizeof(struct SaveBlock2) + sizeof(gSaveBlock2_DMA));\n}\n\nvoid ClearSav1(void)\n{\n    CpuFill16(0, &gSaveBlock1, sizeof(struct SaveBlock1) + sizeof(gSaveBlock1_DMA));\n}\n\nvoid SetSaveBlocksPointers(void)\n{\n    u32 offset;\n    struct SaveBlock1** sav1_LocalVar = &gSaveBlock1Ptr;\n    void *oldSave = (void *)gSaveBlock1Ptr;\n\n    offset = (Random()) & ((SAVEBLOCK_MOVE_RANGE - 1) & ~3);\n\n    gSaveBlock2Ptr = (void *)(&gSaveBlock2) + offset;\n    *sav1_LocalVar = (void *)(&gSaveBlock1) + offset;\n    gPokemonStoragePtr = (void *)(&gPokemonStorage) + offset;\n\n    SetBagPocketsPointers();\n    QL_AddASLROffset(oldSave);\n}\n\nvoid MoveSaveBlocks_ResetHeap(void)\n{\n    void *vblankCB, *hblankCB;\n    u32 encryptionKey;\n    struct SaveBlock2 *saveBlock2Copy;\n    struct SaveBlock1 *saveBlock1Copy;\n    struct PokemonStorage *pokemonStorageCopy;\n\n    // save interrupt functions and turn them off\n    vblankCB = gMain.vblankCallback;\n    hblankCB = gMain.hblankCallback;\n    gMain.vblankCallback = NULL;\n    gMain.hblankCallback = NULL;\n    gMain.vblankCounter1 = NULL;\n    \n    saveBlock2Copy = (struct SaveBlock2 *)(gHeap);\n    saveBlock1Copy = (struct SaveBlock1 *)(gHeap + sizeof(struct SaveBlock2));\n    pokemonStorageCopy = (struct PokemonStorage *)(gHeap + sizeof(struct SaveBlock2) + sizeof(struct SaveBlock1));\n\n    // backup the saves.\n    *saveBlock2Copy = *gSaveBlock2Ptr;\n    *saveBlock1Copy = *gSaveBlock1Ptr;\n    *pokemonStorageCopy = *gPokemonStoragePtr;\n\n    // change saveblocks' pointers\n    SetSaveBlocksPointers(); // unlike Emerald, this does not use\n                             // the trainer ID sum for an offset.\n\n    // restore saveblock data since the pointers changed\n    *gSaveBlock2Ptr = *saveBlock2Copy;\n    *gSaveBlock1Ptr = *saveBlock1Copy;\n    *gPokemonStoragePtr = *pokemonStorageCopy;\n\n    // heap was destroyed in the copying process, so reset it\n    InitHeap(gHeap, HEAP_SIZE);\n\n    // restore interrupt functions\n    gMain.hblankCallback = hblankCB;\n    gMain.vblankCallback = vblankCB;\n\n    // create a new encryption key\n    encryptionKey = (Random() << 0x10) + (Random());\n    ApplyNewEncryptionKeyToAllEncryptedData(encryptionKey);\n    gSaveBlock2Ptr->encryptionKey = encryptionKey;\n}\n\nu32 UseContinueGameWarp(void)\n{\n    return gSaveBlock2Ptr->specialSaveWarpFlags & CONTINUE_GAME_WARP;\n}\n\nvoid ClearContinueGameWarpStatus(void)\n{\n    gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP;\n}\n\nvoid SetContinueGameWarpStatus(void)\n{\n    gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP;\n}\n\nvoid SetContinueGameWarpStatusToDynamicWarp(void)\n{\n    SetContinueGameWarpToDynamicWarp(0);\n    gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP;\n}\n\nvoid ClearContinueGameWarpStatus2(void)\n{\n    gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP;\n}\n\nvoid SavePlayerParty(void)\n{\n    int i;\n\n    gSaveBlock1Ptr->playerPartyCount = gPlayerPartyCount;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n        gSaveBlock1Ptr->playerParty[i] = gPlayerParty[i];\n}\n\nvoid LoadPlayerParty(void)\n{\n    int i;\n\n    gPlayerPartyCount = gSaveBlock1Ptr->playerPartyCount;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n        gPlayerParty[i] = gSaveBlock1Ptr->playerParty[i];\n}\n\nvoid SaveObjectEvents(void)\n{\n    int i;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n        gSaveBlock1Ptr->objectEvents[i] = gObjectEvents[i];\n}\n\nvoid LoadObjectEvents(void)\n{\n    int i;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n        gObjectEvents[i] = gSaveBlock1Ptr->objectEvents[i];\n}\n\nvoid SaveSerializedGame(void)\n{\n    SavePlayerParty();\n    SaveObjectEvents();\n    SerializeKeyItemSlots();\n}\n\nvoid LoadSerializedGame(void)\n{\n    LoadPlayerParty();\n    LoadObjectEvents();\n    DeserializeTmHmItemSlots();\n    DeserializeKeyItemSlots();\n}\n\nvoid SerializeKeyItemSlots(void)\n{\n    u32 i;\n    for (i = 0; i < BAG_KEYITEMS_COUNT; i++)\n    {\n        if(gKeyItemSlots[i].itemId > 258 && gKeyItemSlots[i].itemId < 289) //RS Key Items\n        {\n            gSaveBlock1Ptr->bagPocket_KeyItems[i] = (u8)(gKeyItemSlots[i].itemId - 258);\n        }\n        if(gKeyItemSlots[i].itemId > 348) //FRLGE Key Items\n        {\n            gSaveBlock1Ptr->bagPocket_KeyItems[i] = (u8)(gKeyItemSlots[i].itemId - 348 + 30);\n        }\n        if(gKeyItemSlots[i].itemId == ITEM_LINK_BRACELET)\n        {\n            gSaveBlock1Ptr->bagPocket_KeyItems[i] = 59;\n        }\n    }\n}\n\nvoid LoadPlayerBag(void)\n{\n    int i;\n\n    // load player items.\n    for (i = 0; i < BAG_ITEMS_COUNT; i++)\n        gLoadedSaveData.items[i] = gSaveBlock1Ptr->bagPocket_Items[i];\n\n    // load player key items.\n    for (i = 0; i < BAG_KEYITEMS_COUNT; i++)\n        gLoadedSaveData.keyItems[i] = gKeyItemSlots[i];\n\n    // load player pokeballs.\n    for (i = 0; i < BAG_POKEBALLS_COUNT; i++)\n        gLoadedSaveData.pokeBalls[i] = gSaveBlock1Ptr->bagPocket_PokeBalls[i];\n\n    // load player TMs and HMs.\n    for (i = 0; i < BAG_TMHM_COUNT; i++)\n        gLoadedSaveData.TMsHMs[i] = gTmHmItemSlots[i];\n\n    // load player berries.\n    for (i = 0; i < BAG_BERRIES_COUNT; i++)\n        gLoadedSaveData.berries[i] = gSaveBlock1Ptr->bagPocket_Berries[i];\n\n    // load mail.\n    for (i = 0; i < MAIL_COUNT; i++)\n        gLoadedSaveData.mail[i] = gSaveBlock1Ptr->mail[i];\n\n    // load player medicine.\n    for (i = 0; i < BAG_BERRIES_COUNT; i++)\n        gLoadedSaveData.medicine[i] = gSaveBlock1Ptr->bagPocket_Medicine[i];\n\n    // load player held items.\n    for (i = 0; i < BAG_BERRIES_COUNT; i++)\n        gLoadedSaveData.heldItems[i] = gSaveBlock1Ptr->bagPocket_HoldItems[i];\n\n    gLastEncryptionKey = gSaveBlock2Ptr->encryptionKey;\n}\n\nvoid SavePlayerBag(void)\n{\n    int i;\n    u32 encryptionKeyBackup;\n\n    // save player items.\n    for (i = 0; i < BAG_ITEMS_COUNT; i++)\n        gSaveBlock1Ptr->bagPocket_Items[i] = gLoadedSaveData.items[i];\n\n    // save player key items.\n    for (i = 0; i < BAG_KEYITEMS_COUNT; i++)\n    {\n        if(gLoadedSaveData.keyItems[i].itemId > 258 && gLoadedSaveData.keyItems[i].itemId < 289) //RS Key Items\n        {\n            gSaveBlock1Ptr->bagPocket_KeyItems[i] = (u8)(gLoadedSaveData.keyItems[i].itemId - 258);\n        }\n        if(gLoadedSaveData.keyItems[i].itemId > 348) //FRLGE Key Items\n        {\n            gSaveBlock1Ptr->bagPocket_KeyItems[i] = (u8)(gLoadedSaveData.keyItems[i].itemId - 348 + 30);\n        }\n        if(gLoadedSaveData.keyItems[i].itemId == ITEM_LINK_BRACELET)\n        {\n            gSaveBlock1Ptr->bagPocket_KeyItems[i] = 59;\n        }\n    }\n\n    // save player pokeballs.\n    for (i = 0; i < BAG_POKEBALLS_COUNT; i++)\n        gSaveBlock1Ptr->bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i];\n\n    // save player TMs and HMs.\n    for (i = 0; i < BAG_TMHM_COUNT; i++)\n        gTmHmItemSlots[i] = gLoadedSaveData.TMsHMs[i];\n\n    // save player berries.\n    for (i = 0; i < BAG_BERRIES_COUNT; i++)\n        gSaveBlock1Ptr->bagPocket_Berries[i] = gLoadedSaveData.berries[i];\n\n    // save mail.\n    for (i = 0; i < MAIL_COUNT; i++)\n        gSaveBlock1Ptr->mail[i] = gLoadedSaveData.mail[i];\n\n    // save player medicine.\n    for (i = 0; i < BAG_BERRIES_COUNT; i++)\n        gSaveBlock1Ptr->bagPocket_Medicine[i] = gLoadedSaveData.medicine[i];\n\n    // save player held items.\n    for (i = 0; i < BAG_BERRIES_COUNT; i++)\n        gSaveBlock1Ptr->bagPocket_HoldItems[i] = gLoadedSaveData.heldItems[i];\n\n    encryptionKeyBackup = gSaveBlock2Ptr->encryptionKey;\n    gSaveBlock2Ptr->encryptionKey = gLastEncryptionKey;\n    ApplyNewEncryptionKeyToBagItems(encryptionKeyBackup);\n    gSaveBlock2Ptr->encryptionKey = encryptionKeyBackup;\n}\n\nvoid ApplyNewEncryptionKeyToHword(u16 *hWord, u32 newKey)\n{\n    *hWord ^= gSaveBlock2Ptr->encryptionKey;\n    *hWord ^= newKey;\n}\n\nvoid ApplyNewEncryptionKeyToWord(u32 *word, u32 newKey)\n{\n    *word ^= gSaveBlock2Ptr->encryptionKey;\n    *word ^= newKey;\n}\n\nvoid ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey)\n{\n    int i;\n\n    for(i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++)\n        ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->trainerTower[i].bestTime, encryptionKey);\n\n    ApplyNewEncryptionKeyToGameStats(encryptionKey);\n    ApplyNewEncryptionKeyToBagItems_(encryptionKey);\n    ApplyNewEncryptionKeyToBerryPowder(encryptionKey);\n    ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->money, encryptionKey);\n    ApplyNewEncryptionKeyToHword(&gSaveBlock1Ptr->coins, encryptionKey);\n}\n"
  },
  {
    "path": "src/m4a.c",
    "content": "#include <string.h>\n#include \"gba/m4a_internal.h\"\n\nextern const u8 gCgb3Vol[];\n\n#define BSS_CODE __attribute__((section(\".bss.code\")))\n\nBSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0};\n\nstruct SoundInfo gSoundInfo;\nstruct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES];\nstruct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES];\nMPlayFunc gMPlayJumpTable[36];\nstruct CgbChannel gCgbChans[4];\nstruct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2];\nstruct PokemonCrySong gPokemonCrySong;\nstruct MusicPlayerInfo gMPlayInfo_BGM;\nstruct MusicPlayerInfo gMPlayInfo_SE1;\nstruct MusicPlayerInfo gMPlayInfo_SE2;\nstruct MusicPlayerInfo gMPlayInfo_SE3;\nu8 gMPlayMemAccArea[0x10];\n\nu32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust)\n{\n    u32 val1;\n    u32 val2;\n    u32 fineAdjustShifted = fineAdjust << 24;\n\n    if (key > 178)\n    {\n        key = 178;\n        fineAdjustShifted = 255 << 24;\n    }\n\n    val1 = gScaleTable[key];\n    val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4);\n\n    val2 = gScaleTable[key + 1];\n    val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4);\n\n    return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted));\n}\n\nvoid UnusedDummyFunc(void)\n{\n}\n\nvoid MPlayContinue(struct MusicPlayerInfo *mplayInfo)\n{\n    if (mplayInfo->ident == ID_NUMBER)\n    {\n        mplayInfo->ident++;\n        mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE;\n        mplayInfo->ident = ID_NUMBER;\n    }\n}\n\nvoid MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed)\n{\n    if (mplayInfo->ident == ID_NUMBER)\n    {\n        mplayInfo->ident++;\n        mplayInfo->fadeOC = speed;\n        mplayInfo->fadeOI = speed;\n        mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT);\n        mplayInfo->ident = ID_NUMBER;\n    }\n}\n\nvoid m4aSoundInit(void)\n{\n    s32 i;\n\n    CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer));\n\n    SoundInit(&gSoundInfo);\n    MPlayExtender(gCgbChans);\n    m4aSoundMode(SOUND_MODE_DA_BIT_8\n               | SOUND_MODE_FREQ_13379\n               | (12 << SOUND_MODE_MASVOL_SHIFT)\n               | (5 << SOUND_MODE_MAXCHN_SHIFT));\n\n    for (i = 0; i < NUM_MUSIC_PLAYERS; i++)\n    {\n        struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info;\n        MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8);\n        mplayInfo->unk_B = gMPlayTable[i].unk_A;\n        mplayInfo->memAccArea = gMPlayMemAccArea;\n    }\n\n    memcpy(&gPokemonCrySong, &gPokemonCrySongTemplate, sizeof(struct PokemonCrySong));\n\n    for (i = 0; i < MAX_POKEMON_CRIES; i++)\n    {\n        struct MusicPlayerInfo *mplayInfo = &gPokemonCryMusicPlayers[i];\n        struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2];\n        MPlayOpen(mplayInfo, track, 2);\n        track->chan = 0;\n    }\n}\n\nvoid m4aSoundMain(void)\n{\n    SoundMain();\n}\n\nvoid m4aSongNumStart(u16 n)\n{\n    const struct MusicPlayer *mplayTable = gMPlayTable;\n    const struct Song *songTable = gSongTable;\n    const struct Song *song = &songTable[n];\n    const struct MusicPlayer *mplay = &mplayTable[song->ms];\n\n    MPlayStart(mplay->info, song->header);\n}\n\nvoid m4aSongNumStartOrChange(u16 n)\n{\n    const struct MusicPlayer *mplayTable = gMPlayTable;\n    const struct Song *songTable = gSongTable;\n    const struct Song *song = &songTable[n];\n    const struct MusicPlayer *mplay = &mplayTable[song->ms];\n\n    if (mplay->info->songHeader != song->header)\n    {\n        MPlayStart(mplay->info, song->header);\n    }\n    else\n    {\n        if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0\n         || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE))\n        {\n            MPlayStart(mplay->info, song->header);\n        }\n    }\n}\n\nvoid m4aSongNumStartOrContinue(u16 n)\n{\n    const struct MusicPlayer *mplayTable = gMPlayTable;\n    const struct Song *songTable = gSongTable;\n    const struct Song *song = &songTable[n];\n    const struct MusicPlayer *mplay = &mplayTable[song->ms];\n\n    if (mplay->info->songHeader != song->header)\n        MPlayStart(mplay->info, song->header);\n    else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0)\n        MPlayStart(mplay->info, song->header);\n    else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)\n        MPlayContinue(mplay->info);\n}\n\nvoid m4aSongNumStop(u16 n)\n{\n    const struct MusicPlayer *mplayTable = gMPlayTable;\n    const struct Song *songTable = gSongTable;\n    const struct Song *song = &songTable[n];\n    const struct MusicPlayer *mplay = &mplayTable[song->ms];\n\n    if (mplay->info->songHeader == song->header)\n        m4aMPlayStop(mplay->info);\n}\n\nvoid m4aSongNumContinue(u16 n)\n{\n    const struct MusicPlayer *mplayTable = gMPlayTable;\n    const struct Song *songTable = gSongTable;\n    const struct Song *song = &songTable[n];\n    const struct MusicPlayer *mplay = &mplayTable[song->ms];\n\n    if (mplay->info->songHeader == song->header)\n        MPlayContinue(mplay->info);\n}\n\nvoid m4aMPlayAllStop(void)\n{\n    s32 i;\n\n    for (i = 0; i < NUM_MUSIC_PLAYERS; i++)\n        m4aMPlayStop(gMPlayTable[i].info);\n\n    for (i = 0; i < MAX_POKEMON_CRIES; i++)\n        m4aMPlayStop(&gPokemonCryMusicPlayers[i]);\n}\n\nvoid m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo)\n{\n    MPlayContinue(mplayInfo);\n}\n\nvoid m4aMPlayAllContinue(void)\n{\n    s32 i;\n\n    for (i = 0; i < NUM_MUSIC_PLAYERS; i++)\n        MPlayContinue(gMPlayTable[i].info);\n\n    for (i = 0; i < MAX_POKEMON_CRIES; i++)\n        MPlayContinue(&gPokemonCryMusicPlayers[i]);\n}\n\nvoid m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed)\n{\n    MPlayFadeOut(mplayInfo, speed);\n}\n\nvoid m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed)\n{\n    if (mplayInfo->ident == ID_NUMBER)\n    {\n        mplayInfo->ident++;\n        mplayInfo->fadeOC = speed;\n        mplayInfo->fadeOI = speed;\n        mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE;\n        mplayInfo->ident = ID_NUMBER;\n    }\n}\n\nvoid m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed)\n{\n    if (mplayInfo->ident == ID_NUMBER)\n    {\n        mplayInfo->ident++;\n        mplayInfo->fadeOC = speed;\n        mplayInfo->fadeOI = speed;\n        mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN;\n        mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE;\n        mplayInfo->ident = ID_NUMBER;\n    }\n}\n\nvoid m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo)\n{\n    s32 trackCount = mplayInfo->trackCount;\n    struct MusicPlayerTrack *track = mplayInfo->tracks;\n\n    while (trackCount > 0)\n    {\n        if (track->flags & MPT_FLG_EXIST)\n        {\n            if (track->flags & MPT_FLG_START)\n            {\n                Clear64byte(track);\n                track->flags = MPT_FLG_EXIST;\n                track->bendRange = 2;\n                track->volX = 64;\n                track->lfoSpeed = 22;\n                track->tone.type = 1;\n            }\n        }\n\n        trackCount--;\n        track++;\n    }\n}\n\nvoid MPlayExtender(struct CgbChannel *cgbChans)\n{\n    struct SoundInfo *soundInfo;\n    u32 ident;\n\n    REG_SOUNDCNT_X = SOUND_MASTER_ENABLE\n                   | SOUND_4_ON\n                   | SOUND_3_ON\n                   | SOUND_2_ON\n                   | SOUND_1_ON;\n    REG_SOUNDCNT_L = 0; // set master volume to zero\n    REG_NR12 = 0x8;\n    REG_NR22 = 0x8;\n    REG_NR42 = 0x8;\n    REG_NR14 = 0x80;\n    REG_NR24 = 0x80;\n    REG_NR44 = 0x80;\n    REG_NR30 = 0;\n    REG_NR50 = 0x77;\n\n    soundInfo = SOUND_INFO_PTR;\n\n    ident = soundInfo->ident;\n\n    if (ident != ID_NUMBER)\n        return;\n\n    soundInfo->ident++;\n\n    gMPlayJumpTable[8] = ply_memacc;\n    gMPlayJumpTable[17] = ply_lfos;\n    gMPlayJumpTable[19] = ply_mod;\n    gMPlayJumpTable[28] = ply_xcmd;\n    gMPlayJumpTable[29] = ply_endtie;\n    gMPlayJumpTable[30] = SampleFreqSet;\n    gMPlayJumpTable[31] = TrackStop;\n    gMPlayJumpTable[32] = FadeOutBody;\n    gMPlayJumpTable[33] = TrkVolPitSet;\n\n    soundInfo->cgbChans = cgbChans;\n    soundInfo->CgbSound = CgbSound;\n    soundInfo->CgbOscOff = CgbOscOff;\n    soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq;\n    soundInfo->maxLines = MAX_LINES;\n\n    CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4);\n\n    cgbChans[0].type = 1;\n    cgbChans[0].panMask = 0x11;\n    cgbChans[1].type = 2;\n    cgbChans[1].panMask = 0x22;\n    cgbChans[2].type = 3;\n    cgbChans[2].panMask = 0x44;\n    cgbChans[3].type = 4;\n    cgbChans[3].panMask = 0x88;\n\n    soundInfo->ident = ident;\n}\n\nvoid MusicPlayerJumpTableCopy(void)\n{\n    asm(\"swi 0x2A\");\n}\n\nvoid ClearChain(void *x)\n{\n    void (*func)(void *) = *(&gMPlayJumpTable[34]);\n    func(x);\n}\n\nvoid Clear64byte(void *x)\n{\n    void (*func)(void *) = *(&gMPlayJumpTable[35]);\n    func(x);\n}\n\nvoid SoundInit(struct SoundInfo *soundInfo)\n{\n    soundInfo->ident = 0;\n\n    if (REG_DMA1CNT & (DMA_REPEAT << 16))\n        REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;\n\n    if (REG_DMA2CNT & (DMA_REPEAT << 16))\n        REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;\n\n    REG_DMA1CNT_H = DMA_32BIT;\n    REG_DMA2CNT_H = DMA_32BIT;\n    REG_SOUNDCNT_X = SOUND_MASTER_ENABLE\n                   | SOUND_4_ON\n                   | SOUND_3_ON\n                   | SOUND_2_ON\n                   | SOUND_1_ON;\n    REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT\n                   | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT\n                   | SOUND_ALL_MIX_FULL;\n    REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40;\n\n    REG_DMA1SAD = (s32)soundInfo->pcmBuffer;\n    REG_DMA1DAD = (s32)&REG_FIFO_A;\n    REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE;\n    REG_DMA2DAD = (s32)&REG_FIFO_B;\n\n    SOUND_INFO_PTR = soundInfo;\n    CpuFill32(0, soundInfo, sizeof(struct SoundInfo));\n\n    soundInfo->maxChans = 8;\n    soundInfo->masterVolume = 15;\n    soundInfo->plynote = ply_note;\n    soundInfo->CgbSound = DummyFunc;\n    soundInfo->CgbOscOff = (CgbOscOffFunc)DummyFunc;\n    soundInfo->MidiKeyToCgbFreq = (MidiKeyToCgbFreqFunc)DummyFunc;\n    soundInfo->ExtVolPit = (ExtVolPitFunc)DummyFunc;\n\n    MPlayJumpTableCopy(gMPlayJumpTable);\n\n    soundInfo->MPlayJumpTable = gMPlayJumpTable;\n\n    SampleFreqSet(SOUND_MODE_FREQ_13379);\n\n    soundInfo->ident = ID_NUMBER;\n}\n\nvoid SampleFreqSet(u32 freq)\n{\n    struct SoundInfo *soundInfo = SOUND_INFO_PTR;\n\n    freq = (freq & 0xF0000) >> 16;\n    soundInfo->freq = freq;\n    soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1];\n    soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank;\n\n    // LCD refresh rate 59.7275Hz\n    soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000;\n\n    // CPU frequency 16.78Mhz\n    soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1;\n\n    // Turn off timer 0.\n    REG_TM0CNT_H = 0;\n\n    // cycles per LCD fresh 280896\n    REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank);\n\n    m4aSoundVSyncOn();\n\n    while (*(vu8 *)REG_ADDR_VCOUNT == 159)\n        ;\n\n    while (*(vu8 *)REG_ADDR_VCOUNT != 159)\n        ;\n\n    REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK;\n}\n\nvoid m4aSoundMode(u32 mode)\n{\n    struct SoundInfo *soundInfo = SOUND_INFO_PTR;\n    u32 temp;\n\n    if (soundInfo->ident != ID_NUMBER)\n        return;\n\n    soundInfo->ident++;\n\n    temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL);\n\n    if (temp)\n        soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL;\n\n    temp = mode & SOUND_MODE_MAXCHN;\n\n    if (temp)\n    {\n        struct SoundChannel *chan;\n\n        soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT;\n\n        temp = MAX_DIRECTSOUND_CHANNELS;\n        chan = &soundInfo->chans[0];\n\n        while (temp != 0)\n        {\n            chan->statusFlags = 0;\n            temp--;\n            chan++;\n        }\n    }\n\n    temp = mode & SOUND_MODE_MASVOL;\n\n    if (temp)\n        soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT;\n\n    temp = mode & SOUND_MODE_DA_BIT;\n\n    if (temp)\n    {\n        temp = (temp & 0x300000) >> 14;\n        REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp;\n    }\n\n    temp = mode & SOUND_MODE_FREQ;\n\n    if (temp)\n    {\n        m4aSoundVSyncOff();\n        SampleFreqSet(temp);\n    }\n\n    soundInfo->ident = ID_NUMBER;\n}\n\nvoid SoundClear(void)\n{\n    struct SoundInfo *soundInfo = SOUND_INFO_PTR;\n    s32 i;\n    void *chan;\n\n    if (soundInfo->ident != ID_NUMBER)\n        return;\n\n    soundInfo->ident++;\n\n    i = MAX_DIRECTSOUND_CHANNELS;\n    chan = &soundInfo->chans[0];\n\n    while (i > 0)\n    {\n        ((struct SoundChannel *)chan)->statusFlags = 0;\n        i--;\n        chan = (void *)((s32)chan + sizeof(struct SoundChannel));\n    }\n\n    chan = soundInfo->cgbChans;\n\n    if (chan)\n    {\n        i = 1;\n\n        while (i <= 4)\n        {\n            soundInfo->CgbOscOff(i);\n            ((struct CgbChannel *)chan)->statusFlags = 0;\n            i++;\n            chan = (void *)((s32)chan + sizeof(struct CgbChannel));\n        }\n    }\n\n    soundInfo->ident = ID_NUMBER;\n}\n\nvoid m4aSoundVSyncOff(void)\n{\n    struct SoundInfo *soundInfo = SOUND_INFO_PTR;\n\n    if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1)\n    {\n        soundInfo->ident += 10;\n\n        if (REG_DMA1CNT & (DMA_REPEAT << 16))\n            REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;\n\n        if (REG_DMA2CNT & (DMA_REPEAT << 16))\n            REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;\n\n        REG_DMA1CNT_H = DMA_32BIT;\n        REG_DMA2CNT_H = DMA_32BIT;\n\n        CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer));\n    }\n}\n\nvoid m4aSoundVSyncOn(void)\n{\n    struct SoundInfo *soundInfo = SOUND_INFO_PTR;\n    u32 ident = soundInfo->ident;\n\n    if (ident == ID_NUMBER)\n        return;\n\n    REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT;\n    REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT;\n\n    soundInfo->pcmDmaCounter = 0;\n    soundInfo->ident = ident - 10;\n}\n\nvoid MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount)\n{\n    struct SoundInfo *soundInfo;\n\n    if (trackCount == 0)\n        return;\n\n    if (trackCount > MAX_MUSICPLAYER_TRACKS)\n        trackCount = MAX_MUSICPLAYER_TRACKS;\n\n    soundInfo = SOUND_INFO_PTR;\n\n    if (soundInfo->ident != ID_NUMBER)\n        return;\n\n    soundInfo->ident++;\n\n    Clear64byte(mplayInfo);\n\n    mplayInfo->tracks = tracks;\n    mplayInfo->trackCount = trackCount;\n    mplayInfo->status = MUSICPLAYER_STATUS_PAUSE;\n\n    while (trackCount != 0)\n    {\n        tracks->flags = 0;\n        trackCount--;\n        tracks++;\n    }\n\n    // append music player and MPlayMain to linked list\n\n    if (soundInfo->MPlayMainHead != NULL)\n    {\n        mplayInfo->MPlayMainNext = soundInfo->MPlayMainHead;\n        mplayInfo->musicPlayerNext = soundInfo->musicPlayerHead;\n        // NULL assignment semantically useless, but required for match\n        soundInfo->MPlayMainHead = NULL;\n    }\n\n    soundInfo->musicPlayerHead = mplayInfo;\n    soundInfo->MPlayMainHead = MPlayMain;\n    soundInfo->ident = ID_NUMBER;\n    mplayInfo->ident = ID_NUMBER;\n}\n\nvoid MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader)\n{\n    s32 i;\n    u8 unk_B;\n    struct MusicPlayerTrack *track;\n\n    if (mplayInfo->ident != ID_NUMBER)\n        return;\n\n    unk_B = mplayInfo->unk_B;\n\n    if (!unk_B\n        || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START))\n            && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0\n                || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE)))\n        || (mplayInfo->priority <= songHeader->priority))\n    {\n        mplayInfo->ident++;\n        mplayInfo->status = 0;\n        mplayInfo->songHeader = songHeader;\n        mplayInfo->tone = songHeader->tone;\n        mplayInfo->priority = songHeader->priority;\n        mplayInfo->clock = 0;\n        mplayInfo->tempoD = 150;\n        mplayInfo->tempoI = 150;\n        mplayInfo->tempoU = 0x100;\n        mplayInfo->tempoC = 0;\n        mplayInfo->fadeOI = 0;\n\n        i = 0;\n        track = mplayInfo->tracks;\n\n        while (i < songHeader->trackCount && i < mplayInfo->trackCount)\n        {\n            TrackStop(mplayInfo, track);\n            track->flags = MPT_FLG_EXIST | MPT_FLG_START;\n            track->chan = 0;\n            track->cmdPtr = songHeader->part[i];\n            i++;\n            track++;\n        }\n\n        while (i < mplayInfo->trackCount)\n        {\n            TrackStop(mplayInfo, track);\n            track->flags = 0;\n            i++;\n            track++;\n        }\n\n        if (songHeader->reverb & SOUND_MODE_REVERB_SET)\n            m4aSoundMode(songHeader->reverb);\n\n        mplayInfo->ident = ID_NUMBER;\n    }\n}\n\nvoid m4aMPlayStop(struct MusicPlayerInfo *mplayInfo)\n{\n    s32 i;\n    struct MusicPlayerTrack *track;\n\n    if (mplayInfo->ident != ID_NUMBER)\n        return;\n\n    mplayInfo->ident++;\n    mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE;\n\n    i = mplayInfo->trackCount;\n    track = mplayInfo->tracks;\n\n    while (i > 0)\n    {\n        TrackStop(mplayInfo, track);\n        i--;\n        track++;\n    }\n\n    mplayInfo->ident = ID_NUMBER;\n}\n\nvoid FadeOutBody(struct MusicPlayerInfo *mplayInfo)\n{\n    s32 i;\n    struct MusicPlayerTrack *track;\n    u16 fadeOV;\n\n    if (mplayInfo->fadeOI == 0)\n        return;\n    if (--mplayInfo->fadeOC != 0)\n        return;\n\n    mplayInfo->fadeOC = mplayInfo->fadeOI;\n\n    if (mplayInfo->fadeOV & FADE_IN)\n    {\n        if ((u16)(mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT)) >= (64 << FADE_VOL_SHIFT))\n        {\n            mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT);\n            mplayInfo->fadeOI = 0;\n        }\n    }\n    else\n    {\n        if ((s16)(mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT)) <= 0)\n        {\n            i = mplayInfo->trackCount;\n            track = mplayInfo->tracks;\n\n            while (i > 0)\n            {\n                u32 val;\n\n                TrackStop(mplayInfo, track);\n\n                val = TEMPORARY_FADE;\n                fadeOV = mplayInfo->fadeOV;\n                val &= fadeOV;\n\n                if (!val)\n                    track->flags = 0;\n\n                i--;\n                track++;\n            }\n\n            if (mplayInfo->fadeOV & TEMPORARY_FADE)\n                mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE;\n            else\n                mplayInfo->status = MUSICPLAYER_STATUS_PAUSE;\n\n            mplayInfo->fadeOI = 0;\n            return;\n        }\n    }\n\n    i = mplayInfo->trackCount;\n    track = mplayInfo->tracks;\n\n    while (i > 0)\n    {\n        if (track->flags & MPT_FLG_EXIST)\n        {\n            fadeOV = mplayInfo->fadeOV;\n\n            track->volX = (fadeOV >> FADE_VOL_SHIFT);\n            track->flags |= MPT_FLG_VOLCHG;\n        }\n\n        i--;\n        track++;\n    }\n}\n\nvoid TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    if (track->flags & MPT_FLG_VOLSET)\n    {\n        s32 x;\n        s32 y;\n\n        x = (u32)(track->vol * track->volX) >> 5;\n\n        if (track->modT == 1)\n            x = (u32)(x * (track->modM + 128)) >> 7;\n\n        y = 2 * track->pan + track->panX;\n\n        if (track->modT == 2)\n            y += track->modM;\n\n        if (y < -128)\n            y = -128;\n        else if (y > 127)\n            y = 127;\n\n        track->volMR = (u32)((y + 128) * x) >> 8;\n        track->volML = (u32)((127 - y) * x) >> 8;\n    }\n\n    if (track->flags & MPT_FLG_PITSET)\n    {\n        s32 bend = track->bend * track->bendRange;\n        s32 x = (track->tune + bend)\n              * 4\n              + (track->keyShift << 8)\n              + (track->keyShiftX << 8)\n              + track->pitX;\n\n        if (track->modT == 0)\n            x += 16 * track->modM;\n\n        track->keyM = x >> 8;\n        track->pitM = x;\n    }\n\n    track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET);\n}\n\nu32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust)\n{\n    if (chanNum == 4)\n    {\n        if (key <= 20)\n        {\n            key = 0;\n        }\n        else\n        {\n            key -= 21;\n            if (key > 59)\n                key = 59;\n        }\n\n        return gNoiseTable[key];\n    }\n    else\n    {\n        s32 val1;\n        s32 val2;\n\n        if (key <= 35)\n        {\n            fineAdjust = 0;\n            key = 0;\n        }\n        else\n        {\n            key -= 36;\n            if (key > 130)\n            {\n                key = 130;\n                fineAdjust = 255;\n            }\n        }\n\n        val1 = gCgbScaleTable[key];\n        val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4);\n\n        val2 = gCgbScaleTable[key + 1];\n        val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4);\n\n        return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048;\n    }\n}\n\nvoid CgbOscOff(u8 chanNum)\n{\n    switch (chanNum)\n    {\n    case 1:\n        REG_NR12 = 8;\n        REG_NR14 = 0x80;\n        break;\n    case 2:\n        REG_NR22 = 8;\n        REG_NR24 = 0x80;\n        break;\n    case 3:\n        REG_NR30 = 0;\n        break;\n    default:\n        REG_NR42 = 8;\n        REG_NR44 = 0x80;\n    }\n}\n\nstatic inline int CgbPan(struct CgbChannel *chan)\n{\n    u32 rightVolume = chan->rightVolume;\n    u32 leftVolume = chan->leftVolume;\n\n    if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume))\n    {\n        if (rightVolume / 2 >= leftVolume)\n        {\n            chan->pan = 0x0F;\n            return 1;\n        }\n    }\n    else\n    {\n        if (leftVolume / 2 >= rightVolume)\n        {\n            chan->pan = 0xF0;\n            return 1;\n        }\n    }\n\n    return 0;\n}\n\nvoid CgbModVol(struct CgbChannel *chan)\n{\n    struct SoundInfo *soundInfo = SOUND_INFO_PTR;\n\n    if ((soundInfo->mode & 1) || !CgbPan(chan))\n    {\n        chan->pan = 0xFF;\n        chan->envelopeGoal = (u32)(chan->leftVolume + chan->rightVolume);\n        chan->envelopeGoal /= 16;\n    }\n    else\n    {\n        chan->envelopeGoal = (u32)(chan->leftVolume + chan->rightVolume);\n        chan->envelopeGoal /= 16;\n        if (chan->envelopeGoal > 15)\n            chan->envelopeGoal = 15;\n    }\n\n    chan->sustainGoal = (chan->envelopeGoal * chan->sustain + 15) >> 4;\n    chan->pan &= chan->panMask;\n}\n\nvoid CgbSound(void)\n{\n    s32 ch;\n    struct CgbChannel *channels;\n    s32 prevC15;\n    struct SoundInfo *soundInfo = SOUND_INFO_PTR;\n    vu8 *nrx0ptr;\n    vu8 *nrx1ptr;\n    vu8 *nrx2ptr;\n    vu8 *nrx3ptr;\n    vu8 *nrx4ptr;\n    s32 envelopeStepTimeAndDir;\n\n    // Most comparision operations that cast to s8 perform 'and' by 0xFF.\n    int mask = 0xff;\n\n    if (soundInfo->c15)\n        soundInfo->c15--;\n    else\n        soundInfo->c15 = 14;\n\n    for (ch = 1, channels = soundInfo->cgbChans; ch <= 4; ch++, channels++)\n    {\n        if (!(channels->statusFlags & SOUND_CHANNEL_SF_ON))\n            continue;\n\n        /* 1. determine hardware channel registers */\n        switch (ch)\n        {\n        case 1:\n            nrx0ptr = (vu8 *)(REG_ADDR_NR10);\n            nrx1ptr = (vu8 *)(REG_ADDR_NR11);\n            nrx2ptr = (vu8 *)(REG_ADDR_NR12);\n            nrx3ptr = (vu8 *)(REG_ADDR_NR13);\n            nrx4ptr = (vu8 *)(REG_ADDR_NR14);\n            break;\n        case 2:\n            nrx0ptr = (vu8 *)(REG_ADDR_NR10+1);\n            nrx1ptr = (vu8 *)(REG_ADDR_NR21);\n            nrx2ptr = (vu8 *)(REG_ADDR_NR22);\n            nrx3ptr = (vu8 *)(REG_ADDR_NR23);\n            nrx4ptr = (vu8 *)(REG_ADDR_NR24);\n            break;\n        case 3:\n            nrx0ptr = (vu8 *)(REG_ADDR_NR30);\n            nrx1ptr = (vu8 *)(REG_ADDR_NR31);\n            nrx2ptr = (vu8 *)(REG_ADDR_NR32);\n            nrx3ptr = (vu8 *)(REG_ADDR_NR33);\n            nrx4ptr = (vu8 *)(REG_ADDR_NR34);\n            break;\n        default:\n            nrx0ptr = (vu8 *)(REG_ADDR_NR30+1);\n            nrx1ptr = (vu8 *)(REG_ADDR_NR41);\n            nrx2ptr = (vu8 *)(REG_ADDR_NR42);\n            nrx3ptr = (vu8 *)(REG_ADDR_NR43);\n            nrx4ptr = (vu8 *)(REG_ADDR_NR44);\n            break;\n        }\n\n        prevC15 = soundInfo->c15;\n        envelopeStepTimeAndDir = *nrx2ptr;\n\n        /* 2. calculate envelope volume */\n        if (channels->statusFlags & SOUND_CHANNEL_SF_START)\n        {\n            if (!(channels->statusFlags & SOUND_CHANNEL_SF_STOP))\n            {\n                channels->statusFlags = SOUND_CHANNEL_SF_ENV_ATTACK;\n                channels->modify = CGB_CHANNEL_MO_PIT | CGB_CHANNEL_MO_VOL;\n                CgbModVol(channels);\n                switch (ch)\n                {\n                case 1:\n                    *nrx0ptr = channels->sweep;\n                    // fallthrough\n                case 2:\n                    *nrx1ptr = ((u32)channels->wavePointer << 6) + channels->length;\n                    goto init_env_step_time_dir;\n                case 3:\n                    if (channels->wavePointer != channels->currentPointer)\n                    {\n                        *nrx0ptr = 0x40;\n                        REG_WAVE_RAM0 = channels->wavePointer[0];\n                        REG_WAVE_RAM1 = channels->wavePointer[1];\n                        REG_WAVE_RAM2 = channels->wavePointer[2];\n                        REG_WAVE_RAM3 = channels->wavePointer[3];\n                        channels->currentPointer = channels->wavePointer;\n                    }\n                    *nrx0ptr = 0;\n                    *nrx1ptr = channels->length;\n                    if (channels->length)\n                        channels->n4 = 0xC0;\n                    else\n                        channels->n4 = 0x80;\n                    break;\n                default:\n                    *nrx1ptr = channels->length;\n                    *nrx3ptr = (u32)channels->wavePointer << 3;\n                init_env_step_time_dir:\n                    envelopeStepTimeAndDir = channels->attack + CGB_NRx2_ENV_DIR_INC;\n                    if (channels->length)\n                        channels->n4 = 0x40;\n                    else\n                        channels->n4 = 0x00;\n                    break;\n                }\n                channels->envelopeCounter = channels->attack;\n                if ((s8)(channels->attack & mask))\n                {\n                    channels->envelopeVolume = 0;\n                    goto envelope_step_complete;\n                }\n                else\n                {\n                    // skip attack phase if attack is instantaneous (=0)\n                    goto envelope_decay_start;\n                }\n            }\n            else\n            {\n                goto oscillator_off;\n            }\n        }\n        else if (channels->statusFlags & SOUND_CHANNEL_SF_IEC)\n        {\n            channels->pseudoEchoLength--;\n            if ((s8)(channels->pseudoEchoLength & mask) <= 0)\n            {\n            oscillator_off:\n                CgbOscOff(ch);\n                channels->statusFlags = 0;\n                goto channel_complete;\n            }\n            goto envelope_complete;\n        }\n        else if ((channels->statusFlags & SOUND_CHANNEL_SF_STOP) && (channels->statusFlags & SOUND_CHANNEL_SF_ENV))\n        {\n            channels->statusFlags &= ~SOUND_CHANNEL_SF_ENV;\n            channels->envelopeCounter = channels->release;\n            if ((s8)(channels->release & mask))\n            {\n                channels->modify |= CGB_CHANNEL_MO_VOL;\n                if (ch != 3)\n                    envelopeStepTimeAndDir = channels->release | CGB_NRx2_ENV_DIR_DEC;\n                goto envelope_step_complete;\n            }\n            else\n            {\n                goto envelope_pseudoecho_start;\n            }\n        }\n        else\n        {\n        envelope_step_repeat:\n            if (channels->envelopeCounter == 0)\n            {\n                if (ch == 3)\n                    channels->modify |= CGB_CHANNEL_MO_VOL;\n\n                CgbModVol(channels);\n                if ((channels->statusFlags & SOUND_CHANNEL_SF_ENV) == SOUND_CHANNEL_SF_ENV_RELEASE)\n                {\n                    channels->envelopeVolume--;\n                    if ((s8)(channels->envelopeVolume & mask) <= 0)\n                    {\n                    envelope_pseudoecho_start:\n                        channels->envelopeVolume = ((channels->envelopeGoal * channels->pseudoEchoVolume) + 0xFF) >> 8;\n                        if (channels->envelopeVolume)\n                        {\n                            channels->statusFlags |= SOUND_CHANNEL_SF_IEC;\n                            channels->modify |= CGB_CHANNEL_MO_VOL;\n                            if (ch != 3)\n                                envelopeStepTimeAndDir = 0 | CGB_NRx2_ENV_DIR_INC;\n                            goto envelope_complete;\n                        }\n                        else\n                        {\n                            goto oscillator_off;\n                        }\n                    }\n                    else\n                    {\n                        channels->envelopeCounter = channels->release;\n                    }\n                }\n                else if ((channels->statusFlags & SOUND_CHANNEL_SF_ENV) == SOUND_CHANNEL_SF_ENV_SUSTAIN)\n                {\n                envelope_sustain:\n                    channels->envelopeVolume = channels->sustainGoal;\n                    channels->envelopeCounter = 7;\n                }\n                else if ((channels->statusFlags & SOUND_CHANNEL_SF_ENV) == SOUND_CHANNEL_SF_ENV_DECAY)\n                {\n                    int envelopeVolume, sustainGoal;\n\n                    channels->envelopeVolume--;\n                    envelopeVolume = (s8)(channels->envelopeVolume & mask);\n                    sustainGoal = (s8)(channels->sustainGoal);\n                    if (envelopeVolume <= sustainGoal)\n                    {\n                    envelope_sustain_start:\n                        if (channels->sustain == 0)\n                        {\n                            channels->statusFlags &= ~SOUND_CHANNEL_SF_ENV;\n                            goto envelope_pseudoecho_start;\n                        }\n                        else\n                        {\n                            channels->statusFlags--;\n                            channels->modify |= CGB_CHANNEL_MO_VOL;\n                            if (ch != 3)\n                                envelopeStepTimeAndDir = 0 | CGB_NRx2_ENV_DIR_INC;\n                            goto envelope_sustain;\n                        }\n                    }\n                    else\n                    {\n                        channels->envelopeCounter = channels->decay;\n                    }\n                }\n                else\n                {\n                    channels->envelopeVolume++;\n                    if ((u8)(channels->envelopeVolume & mask) >= channels->envelopeGoal)\n                    {\n                    envelope_decay_start:\n                        channels->statusFlags--;\n                        channels->envelopeCounter = channels->decay;\n                        if ((u8)(channels->envelopeCounter & mask))\n                        {\n                            channels->modify |= CGB_CHANNEL_MO_VOL;\n                            channels->envelopeVolume = channels->envelopeGoal;\n                            if (ch != 3)\n                                envelopeStepTimeAndDir = channels->decay | CGB_NRx2_ENV_DIR_DEC;\n                        }\n                        else\n                        {\n                            goto envelope_sustain_start;\n                        }\n                    }\n                    else\n                    {\n                        channels->envelopeCounter = channels->attack;\n                    }\n                }\n            }\n        }\n\n    envelope_step_complete:\n        // every 15 frames, envelope calculation has to be done twice\n        // to keep up with the hardware envelope rate (1/64 s)\n        channels->envelopeCounter--;\n        if (prevC15 == 0)\n        {\n            prevC15--;\n            goto envelope_step_repeat;\n        }\n\n    envelope_complete:\n        /* 3. apply pitch to HW registers */\n        if (channels->modify & CGB_CHANNEL_MO_PIT)\n        {\n            if (ch < 4 && (channels->type & TONEDATA_TYPE_FIX))\n            {\n                int dac_pwm_rate = REG_SOUNDBIAS_H;\n\n                if (dac_pwm_rate < 0x40)        // if PWM rate = 32768 Hz\n                    channels->frequency = (channels->frequency + 2) & 0x7fc;\n                else if (dac_pwm_rate < 0x80)   // if PWM rate = 65536 Hz\n                    channels->frequency = (channels->frequency + 1) & 0x7fe;\n            }\n\n            if (ch != 4)\n                *nrx3ptr = channels->frequency;\n            else\n                *nrx3ptr = (*nrx3ptr & 0x08) | channels->frequency;\n            channels->n4 = (channels->n4 & 0xC0) + (*((u8 *)(&channels->frequency) + 1));\n            *nrx4ptr = (s8)(channels->n4 & mask);\n        }\n\n        /* 4. apply envelope & volume to HW registers */\n        if (channels->modify & CGB_CHANNEL_MO_VOL)\n        {\n            REG_NR51 = (REG_NR51 & ~channels->panMask) | channels->pan;\n            if (ch == 3)\n            {\n                *nrx2ptr = gCgb3Vol[channels->envelopeVolume];\n                if (channels->n4 & 0x80)\n                {\n                    *nrx0ptr = 0x80;\n                    *nrx4ptr = channels->n4;\n                    channels->n4 &= 0x7f;\n                }\n            }\n            else\n            {\n                u32 envMask = 0xF;\n                *nrx2ptr = (envelopeStepTimeAndDir & envMask) + (channels->envelopeVolume << 4);\n                *nrx4ptr = channels->n4 | 0x80;\n                if (ch == 1 && !(*nrx0ptr & 0x08))\n                    *nrx4ptr = channels->n4 | 0x80;\n            }\n        }\n\n    channel_complete:\n        channels->modify = 0;\n    }\n}\n\nvoid m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo)\n{\n    if (mplayInfo->ident == ID_NUMBER)\n    {\n        mplayInfo->ident++;\n        mplayInfo->tempoU = tempo;\n        mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8;\n        mplayInfo->ident = ID_NUMBER;\n    }\n}\n\nvoid m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume)\n{\n    s32 i;\n    u32 bit;\n    struct MusicPlayerTrack *track;\n\n    if (mplayInfo->ident != ID_NUMBER)\n        return;\n\n    mplayInfo->ident++;\n\n    i = mplayInfo->trackCount;\n    track = mplayInfo->tracks;\n    bit = 1;\n\n    while (i > 0)\n    {\n        if (trackBits & bit)\n        {\n            if (track->flags & MPT_FLG_EXIST)\n            {\n                track->volX = volume / 4;\n                track->flags |= MPT_FLG_VOLCHG;\n            }\n        }\n\n        i--;\n        track++;\n        bit <<= 1;\n    }\n\n    mplayInfo->ident = ID_NUMBER;\n}\n\nvoid m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch)\n{\n    s32 i;\n    u32 bit;\n    struct MusicPlayerTrack *track;\n\n    if (mplayInfo->ident != ID_NUMBER)\n        return;\n\n    mplayInfo->ident++;\n\n    i = mplayInfo->trackCount;\n    track = mplayInfo->tracks;\n    bit = 1;\n\n    while (i > 0)\n    {\n        if (trackBits & bit)\n        {\n            if (track->flags & MPT_FLG_EXIST)\n            {\n                track->keyShiftX = pitch >> 8;\n                track->pitX = pitch;\n                track->flags |= MPT_FLG_PITCHG;\n            }\n        }\n\n        i--;\n        track++;\n        bit <<= 1;\n    }\n\n    mplayInfo->ident = ID_NUMBER;\n}\n\nvoid m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan)\n{\n    s32 i;\n    u32 bit;\n    struct MusicPlayerTrack *track;\n\n    if (mplayInfo->ident != ID_NUMBER)\n        return;\n\n    mplayInfo->ident++;\n\n    i = mplayInfo->trackCount;\n    track = mplayInfo->tracks;\n    bit = 1;\n\n    while (i > 0)\n    {\n        if (trackBits & bit)\n        {\n            if (track->flags & MPT_FLG_EXIST)\n            {\n                track->panX = pan;\n                track->flags |= MPT_FLG_VOLCHG;\n            }\n        }\n\n        i--;\n        track++;\n        bit <<= 1;\n    }\n\n    mplayInfo->ident = ID_NUMBER;\n}\n\nvoid ClearModM(struct MusicPlayerTrack *track)\n{\n    track->lfoSpeedC = 0;\n    track->modM = 0;\n\n    if (track->modT == 0)\n        track->flags |= MPT_FLG_PITCHG;\n    else\n        track->flags |= MPT_FLG_VOLCHG;\n}\n\nvoid m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth)\n{\n    s32 i;\n    u32 bit;\n    struct MusicPlayerTrack *track;\n\n    if (mplayInfo->ident != ID_NUMBER)\n        return;\n\n    mplayInfo->ident++;\n\n    i = mplayInfo->trackCount;\n    track = mplayInfo->tracks;\n    bit = 1;\n\n    while (i > 0)\n    {\n        if (trackBits & bit)\n        {\n            if (track->flags & MPT_FLG_EXIST)\n            {\n                track->mod = modDepth;\n\n                if (!track->mod)\n                    ClearModM(track);\n            }\n        }\n\n        i--;\n        track++;\n        bit <<= 1;\n    }\n\n    mplayInfo->ident = ID_NUMBER;\n}\n\nvoid m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed)\n{\n    s32 i;\n    u32 bit;\n    struct MusicPlayerTrack *track;\n\n    if (mplayInfo->ident != ID_NUMBER)\n        return;\n\n    mplayInfo->ident++;\n\n    i = mplayInfo->trackCount;\n    track = mplayInfo->tracks;\n    bit = 1;\n\n    while (i > 0)\n    {\n        if (trackBits & bit)\n        {\n            if (track->flags & MPT_FLG_EXIST)\n            {\n                track->lfoSpeed = lfoSpeed;\n\n                if (!track->lfoSpeed)\n                    ClearModM(track);\n            }\n        }\n\n        i--;\n        track++;\n        bit <<= 1;\n    }\n\n    mplayInfo->ident = ID_NUMBER;\n}\n\n#define MEMACC_COND_JUMP(cond) \\\nif (cond)                      \\\n    goto cond_true;            \\\nelse                           \\\n    goto cond_false;           \\\n\nvoid ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    u32 op;\n    u8 *addr;\n    u8 data;\n\n    op = *track->cmdPtr;\n    track->cmdPtr++;\n\n    addr = mplayInfo->memAccArea + *track->cmdPtr;\n    track->cmdPtr++;\n\n    data = *track->cmdPtr;\n    track->cmdPtr++;\n\n    switch (op)\n    {\n    case 0:\n        *addr = data;\n        return;\n    case 1:\n        *addr += data;\n        return;\n    case 2:\n        *addr -= data;\n        return;\n    case 3:\n        *addr = mplayInfo->memAccArea[data];\n        return;\n    case 4:\n        *addr += mplayInfo->memAccArea[data];\n        return;\n    case 5:\n        *addr -= mplayInfo->memAccArea[data];\n        return;\n    case 6:\n        MEMACC_COND_JUMP(*addr == data)\n        return;\n    case 7:\n        MEMACC_COND_JUMP(*addr != data)\n        return;\n    case 8:\n        MEMACC_COND_JUMP(*addr > data)\n        return;\n    case 9:\n        MEMACC_COND_JUMP(*addr >= data)\n        return;\n    case 10:\n        MEMACC_COND_JUMP(*addr <= data)\n        return;\n    case 11:\n        MEMACC_COND_JUMP(*addr < data)\n        return;\n    case 12:\n        MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data])\n        return;\n    case 13:\n        MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data])\n        return;\n    case 14:\n        MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data])\n        return;\n    case 15:\n        MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data])\n        return;\n    case 16:\n        MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data])\n        return;\n    case 17:\n        MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data])\n        return;\n    default:\n        return;\n    }\n\ncond_true:\n    {\n        // *& is required for matching\n        (*&gMPlayJumpTable[1])(mplayInfo, track);\n        return;\n    }\n\ncond_false:\n    track->cmdPtr += 4;\n}\n\nvoid ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    u32 n = *track->cmdPtr;\n    track->cmdPtr++;\n\n    gXcmdTable[n](mplayInfo, track);\n}\n\nvoid ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    gMPlayJumpTable[0](mplayInfo, track);\n}\n\n#define READ_XCMD_BYTE(var, n)       \\\n{                                    \\\n    u32 byte = track->cmdPtr[(n)]; \\\n    byte <<= n * 8;                  \\\n    (var) &= ~(0xFF << (n * 8));     \\\n    (var) |= byte;                   \\\n}\n\nvoid ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    u32 wav;\n\n#ifdef UBFIX\n    wav = 0;\n#endif\n\n    READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable\n    READ_XCMD_BYTE(wav, 1)\n    READ_XCMD_BYTE(wav, 2)\n    READ_XCMD_BYTE(wav, 3)\n\n    track->tone.wav = (struct WaveData *)wav;\n    track->cmdPtr += 4;\n}\n\nvoid ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    track->tone.type = *track->cmdPtr;\n    track->cmdPtr++;\n}\n\nvoid ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    track->tone.attack = *track->cmdPtr;\n    track->cmdPtr++;\n}\n\nvoid ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    track->tone.decay = *track->cmdPtr;\n    track->cmdPtr++;\n}\n\nvoid ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    track->tone.sustain = *track->cmdPtr;\n    track->cmdPtr++;\n}\n\nvoid ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    track->tone.release = *track->cmdPtr;\n    track->cmdPtr++;\n}\n\nvoid ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    track->pseudoEchoVolume = *track->cmdPtr;\n    track->cmdPtr++;\n}\n\nvoid ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    track->pseudoEchoLength = *track->cmdPtr;\n    track->cmdPtr++;\n}\n\nvoid ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    track->tone.length = *track->cmdPtr;\n    track->cmdPtr++;\n}\n\nvoid ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    track->tone.pan_sweep = *track->cmdPtr;\n    track->cmdPtr++;\n}\n\nvoid ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    u32 unk;\n\n#ifdef UBFIX\n    unk = 0;\n#endif\n\n    READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable\n    READ_XCMD_BYTE(unk, 1)\n\n    if (track->unk_3A < (u16)unk)\n    {\n        track->unk_3A++;\n        track->cmdPtr -= 2;\n        track->wait = 1;\n    }\n    else\n    {\n        track->unk_3A = 0;\n        track->cmdPtr += 2;\n    }\n}\n\nvoid ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)\n{\n    u32 unk;\n\n#ifdef UBFIX\n    unk = 0;\n#endif\n\n    READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable\n    READ_XCMD_BYTE(unk, 1)\n    READ_XCMD_BYTE(unk, 2)\n    READ_XCMD_BYTE(unk, 3)\n\n    track->unk_3C = unk;\n    track->cmdPtr += 4;\n}\n\nvoid DummyFunc(void)\n{\n}\n\nstruct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone)\n{\n    u32 maxClock = 0;\n    s32 maxClockIndex = 0;\n    s32 i;\n    struct MusicPlayerInfo *mplayInfo;\n\n    for (i = 0; i < MAX_POKEMON_CRIES; i++)\n    {\n        struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2];\n\n        if (!track->flags && (!track->chan || track->chan->track != track))\n            goto start_song;\n\n        if (maxClock < gPokemonCryMusicPlayers[i].clock)\n        {\n            maxClock = gPokemonCryMusicPlayers[i].clock;\n            maxClockIndex = i;\n        }\n    }\n\n    i = maxClockIndex;\n\nstart_song:\n    mplayInfo = &gPokemonCryMusicPlayers[i];\n    mplayInfo->ident++;\n\n    gPokemonCrySongs[i] = gPokemonCrySong;\n\n    gPokemonCrySongs[i].tone = tone;\n    gPokemonCrySongs[i].part[0] = &gPokemonCrySongs[i].part0;\n    gPokemonCrySongs[i].part[1] = &gPokemonCrySongs[i].part1;\n    gPokemonCrySongs[i].gotoTarget = (u32)&gPokemonCrySongs[i].cont;\n\n    mplayInfo->ident = ID_NUMBER;\n\n    MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i]));\n\n    return mplayInfo;\n}\n\nvoid SetPokemonCryVolume(u8 val)\n{\n    gPokemonCrySong.volumeValue = val & 0x7F;\n}\n\nvoid SetPokemonCryPanpot(s8 val)\n{\n    gPokemonCrySong.panValue = (val + C_V) & 0x7F;\n}\n\nvoid SetPokemonCryPitch(s16 val)\n{\n    s16 b = val + 0x80;\n    u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue;\n    gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F;\n    gPokemonCrySong.tuneValue = (b >> 1) & 0x7F;\n    gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F;\n}\n\nvoid SetPokemonCryLength(u16 val)\n{\n    gPokemonCrySong.unkCmd0CParam = val;\n}\n\nvoid SetPokemonCryRelease(u8 val)\n{\n    gPokemonCrySong.releaseValue = val;\n}\n\nvoid SetPokemonCryProgress(u32 val)\n{\n    gPokemonCrySong.unkCmd0DParam = val;\n}\n\nbool32 IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo)\n{\n    struct MusicPlayerTrack *track = mplayInfo->tracks;\n\n    if (track->chan && track->chan->track == track)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid SetPokemonCryChorus(s8 val)\n{\n    if (val)\n    {\n        gPokemonCrySong.trackCount = 2;\n        gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F;\n    }\n    else\n    {\n        gPokemonCrySong.trackCount = 1;\n    }\n}\n\nvoid SetPokemonCryStereo(u32 val)\n{\n    struct SoundInfo *soundInfo = SOUND_INFO_PTR;\n\n    if (val)\n    {\n        REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT\n                       | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT\n                       | SOUND_ALL_MIX_FULL;\n        soundInfo->mode &= ~1;\n    }\n    else\n    {\n        REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT\n                       | SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT\n                       | SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL;\n        soundInfo->mode |= 1;\n    }\n}\n\nvoid SetPokemonCryPriority(u8 val)\n{\n    gPokemonCrySong.priority = val;\n}\n"
  },
  {
    "path": "src/m4a_1.s",
    "content": "\t.include \"asm/macros.inc\"\n\t.include \"constants/gba_constants.inc\"\n\t.include \"constants/m4a_constants.inc\"\n\n\t.syntax unified\n\n\t.text\n\n\tthumb_func_start umul3232H32\numul3232H32:\n\tadr r2, __umul3232H32\n\tbx r2\n\t.arm\n__umul3232H32:\n\tumull r2, r3, r0, r1\n\tadd r0, r3, 0\n\tbx lr\n\tthumb_func_end umul3232H32\n\n\tthumb_func_start SoundMain\nSoundMain:\n\tldr r0, lt_SOUND_INFO_PTR\n\tldr r0, [r0]\n\tldr r2, lt_ID_NUMBER\n\tldr r3, [r0, o_SoundInfo_ident]\n\tcmp r2, r3\n\tbeq SoundMain_1\n\tbx lr @ Exit the function if ident doesn't match ID_NUMBER.\nSoundMain_1:\n\tadds r3, 1\n\tstr r3, [r0, o_SoundInfo_ident]\n\tpush {r4-r7,lr}\n\tmov r1, r8\n\tmov r2, r9\n\tmov r3, r10\n\tmov r4, r11\n\tpush {r0-r4}\n\tsub sp, 0x18\n\tldrb r1, [r0, o_SoundInfo_maxLines]\n\tcmp r1, 0 @ if maxLines is 0, there is no maximum\n\tbeq SoundMain_3\n\tldr r2, lt_REG_VCOUNT\n\tldrb r2, [r2]\n\tcmp r2, VCOUNT_VBLANK\n\tbhs SoundMain_2\n\tadds r2, TOTAL_SCANLINES\nSoundMain_2:\n\tadds r1, r2\nSoundMain_3:\n\tstr r1, [sp, 0x14]\n\tldr r3, [r0, o_SoundInfo_MPlayMainHead]\n\tcmp r3, 0\n\tbeq SoundMain_4\n\tldr r0, [r0, o_SoundInfo_musicPlayerHead]\n\tbl _081DD25E\n\tldr r0, [sp, 0x18]\nSoundMain_4:\n\tldr r3, [r0, o_SoundInfo_CgbSound]\n\tbl _081DD25E\n\tldr r0, [sp, 0x18]\n\tldr r3, [r0, o_SoundInfo_pcmSamplesPerVBlank]\n\tmov r8, r3\n\tldr r5, lt_o_SoundInfo_pcmBuffer\n\tadds r5, r0\n\tldrb r4, [r0, o_SoundInfo_pcmDmaCounter]\n\tsubs r7, r4, 1\n\tbls SoundMain_5\n\tldrb r1, [r0, o_SoundInfo_pcmDmaPeriod]\n\tsubs r1, r7\n\tmov r2, r8\n\tmuls r2, r1\n\tadds r5, r2\nSoundMain_5:\n\tstr r5, [sp, 0x8]\n\tldr r6, lt_PCM_DMA_BUF_SIZE\n\tldr r3, lt_SoundMainRAM_Buffer\n\tbx r3\n\n\t.align 2, 0\nlt_SOUND_INFO_PTR:        .word SOUND_INFO_PTR\nlt_ID_NUMBER:             .word ID_NUMBER\nlt_SoundMainRAM_Buffer:   .word SoundMainRAM_Buffer + 1\nlt_REG_VCOUNT:            .word REG_VCOUNT\nlt_o_SoundInfo_pcmBuffer: .word o_SoundInfo_pcmBuffer\nlt_PCM_DMA_BUF_SIZE:      .word PCM_DMA_BUF_SIZE\n\tthumb_func_end SoundMain\n\n\tthumb_func_start SoundMainRAM\nSoundMainRAM:\n\tldrb r3, [r0, o_SoundInfo_reverb]\n\tcmp r3, 0\n\tbeq SoundMainRAM_NoReverb\n\tadr r1, SoundMainRAM_Reverb\n\tbx r1\n\t.arm\nSoundMainRAM_Reverb:\n\tcmp r4, 0x2\n\taddeq r7, r0, o_SoundInfo_pcmBuffer\n\taddne r7, r5, r8\n\tmov r4, r8\n_081DCEC4:\n\tldrsb r0, [r5, r6]\n\tldrsb r1, [r5]\n\tadd r0, r0, r1\n\tldrsb r1, [r7, r6]\n\tadd r0, r0, r1\n\tldrsb r1, [r7], 0x1\n\tadd r0, r0, r1\n\tmul r1, r0, r3\n\tmov r0, r1, asr 9\n\ttst r0, 0x80\n\taddne r0, r0, 0x1\n\tstrb r0, [r5, r6]\n\tstrb r0, [r5], 0x1\n\tsubs r4, r4, 0x1\n\tbgt _081DCEC4\n\tadr r0, _081DCF36 + 1 @ plus 1 because THUMB\n\tbx r0\n\t.thumb\nSoundMainRAM_NoReverb:\n\tmovs r0, 0\n\tmov r1, r8\n\tadds r6, r5\n\tlsrs r1, 3\n\tbcc SoundMainRAM_NoReverb_Ok\n\tstm r5!, {r0}\n\tstm r6!, {r0}\nSoundMainRAM_NoReverb_Ok:\n\tlsrs r1, 1\n\tbcc SoundMainRAM_NoReverb_Loop\n\tstm r5!, {r0}\n\tstm r6!, {r0}\n\tstm r5!, {r0}\n\tstm r6!, {r0}\nSoundMainRAM_NoReverb_Loop:\n\tstm r5!, {r0}\n\tstm r6!, {r0}\n\tstm r5!, {r0}\n\tstm r6!, {r0}\n\tstm r5!, {r0}\n\tstm r6!, {r0}\n\tstm r5!, {r0}\n\tstm r6!, {r0}\n\tsubs r1, 1\n\tbgt SoundMainRAM_NoReverb_Loop\n_081DCF36:\n\tldr r4, [sp, 0x18]\n\tldr r0, [r4, o_SoundInfo_divFreq]\n\tmov r12, r0\n\tldrb r0, [r4, o_SoundInfo_maxChans]\n\tadds r4, o_SoundInfo_chans\n\nSoundMainRAM_ChanLoop:\n\tstr r0, [sp, 0x4]\n\tldr r3, [r4, o_SoundChannel_wav]\n\tldr r0, [sp, 0x14]\n\tcmp r0, 0\n\tbeq _081DCF60\n\tldr r1, =REG_VCOUNT\n\tldrb r1, [r1]\n\tcmp r1, VCOUNT_VBLANK\n\tbhs _081DCF54\n\tadds r1, TOTAL_SCANLINES\n_081DCF54:\n\tcmp r1, r0\n\tblo _081DCF60\n\tb _081DD24A\n\n\t.pool\n\n_081DCF60:\n\tldrb r6, [r4, o_SoundChannel_statusFlags]\n\tmovs r0, SOUND_CHANNEL_SF_ON\n\ttst r0, r6\n\tbne _081DCF6A\n\tb _081DD240\n_081DCF6A:\n\tmovs r0, SOUND_CHANNEL_SF_START\n\ttst r0, r6\n\tbeq _081DCFA0\n\tmovs r0, SOUND_CHANNEL_SF_STOP\n\ttst r0, r6\n\tbne _081DCFB0\n\tmovs r6, SOUND_CHANNEL_SF_ENV_ATTACK\n\tstrb r6, [r4, o_SoundChannel_statusFlags]\n\tadds r0, r3, 0\n\tadds r0, o_WaveData_data\n\tldr r1, [r4, o_SoundChannel_count]\n\tadds r0, r1\n\tstr r0, [r4, o_SoundChannel_currentPointer]\n\tldr r0, [r3, o_WaveData_size]\n\tsubs r0, r1\n\tstr r0, [r4, o_SoundChannel_count]\n\tmovs r5, 0\n\tstrb r5, [r4, o_SoundChannel_envelopeVolume]\n\tstr r5, [r4, o_SoundChannel_fw]\n\tldrb r2, [r3, o_WaveData_flags]\n\tmovs r0, WAVE_DATA_FLAG_LOOP\n\ttst r0, r2\n\tbeq _081DCFF8\n\tmovs r0, SOUND_CHANNEL_SF_LOOP\n\torrs r6, r0\n\tstrb r6, [r4, o_SoundChannel_statusFlags]\n\tb _081DCFF8\n_081DCFA0:\n\tldrb r5, [r4, o_SoundChannel_envelopeVolume]\n\tmovs r0, SOUND_CHANNEL_SF_IEC\n\ttst r0, r6\n\tbeq _081DCFB6\n\tldrb r0, [r4, o_SoundChannel_pseudoEchoLength]\n\tsubs r0, 1\n\tstrb r0, [r4, o_SoundChannel_pseudoEchoLength]\n\tbhi _081DD006\n_081DCFB0:\n\tmovs r0, 0\n\tstrb r0, [r4, o_SoundChannel_statusFlags]\n\tb _081DD240\n_081DCFB6:\n\tmovs r0, SOUND_CHANNEL_SF_STOP\n\ttst r0, r6\n\tbeq _081DCFD6\n\tldrb r0, [r4, o_SoundChannel_release]\n\tmuls r5, r0\n\tlsrs r5, 8\n\tldrb r0, [r4, o_SoundChannel_pseudoEchoVolume]\n\tcmp r5, r0\n\tbhi _081DD006\n_081DCFC8:\n\tldrb r5, [r4, o_SoundChannel_pseudoEchoVolume]\n\tcmp r5, 0\n\tbeq _081DCFB0\n\tmovs r0, SOUND_CHANNEL_SF_IEC\n\torrs r6, r0\n\tstrb r6, [r4, o_SoundChannel_statusFlags]\n\tb _081DD006\n_081DCFD6:\n\tmovs r2, SOUND_CHANNEL_SF_ENV\n\tands r2, r6\n\tcmp r2, SOUND_CHANNEL_SF_ENV_DECAY\n\tbne _081DCFF4\n\tldrb r0, [r4, o_SoundChannel_decay]\n\tmuls r5, r0\n\tlsrs r5, 8\n\tldrb r0, [r4, o_SoundChannel_sustain]\n\tcmp r5, r0\n\tbhi _081DD006\n\tadds r5, r0, 0\n\tbeq _081DCFC8\n\tsubs r6, 0x1\n\tstrb r6, [r4, o_SoundChannel_statusFlags]\n\tb _081DD006\n_081DCFF4:\n\tcmp r2, SOUND_CHANNEL_SF_ENV_ATTACK\n\tbne _081DD006\n_081DCFF8:\n\tldrb r0, [r4, o_SoundChannel_attack]\n\tadds r5, r0\n\tcmp r5, 0xFF\n\tbcc _081DD006\n\tmovs r5, 0xFF\n\tsubs r6, 0x1\n\tstrb r6, [r4, o_SoundChannel_statusFlags]\n_081DD006:\n\tstrb r5, [r4, o_SoundChannel_envelopeVolume]\n\tldr r0, [sp, 0x18]\n\tldrb r0, [r0, o_SoundChannel_release]\n\tadds r0, 0x1\n\tmuls r0, r5\n\tlsrs r5, r0, 4\n\tldrb r0, [r4, o_SoundChannel_rightVolume]\n\tmuls r0, r5\n\tlsrs r0, 8\n\tstrb r0, [r4, o_SoundChannel_envelopeVolumeRight]\n\tldrb r0, [r4, o_SoundChannel_leftVolume]\n\tmuls r0, r5\n\tlsrs r0, 8\n\tstrb r0, [r4, o_SoundChannel_envelopeVolumeLeft]\n\tmovs r0, SOUND_CHANNEL_SF_LOOP\n\tands r0, r6\n\tstr r0, [sp, 0x10]\n\tbeq _081DD03A\n\tadds r0, r3, 0\n\tadds r0, o_WaveData_data\n\tldr r1, [r3, o_WaveData_loopStart]\n\tadds r0, r1\n\tstr r0, [sp, 0xC]\n\tldr r0, [r3, o_WaveData_size]\n\tsubs r0, r1\n\tstr r0, [sp, 0x10]\n_081DD03A:\n\tldr r5, [sp, 0x8]\n\tldr r2, [r4, o_SoundChannel_count]\n\tldr r3, [r4, o_SoundChannel_currentPointer]\n\tadr r0, _081DD044\n\tbx r0\n\t.arm\n_081DD044:\n\tstr r8, [sp]\n\tldr r9, [r4, o_SoundChannel_fw]\n\tldrb r10, [r4, o_SoundChannel_envelopeVolumeRight]\n\tldrb r11, [r4, o_SoundChannel_envelopeVolumeLeft]\n\tldrb r0, [r4, o_SoundChannel_type]\n\ttst r0, TONEDATA_TYPE_CMP | TONEDATA_TYPE_REV\n\tbeq _081DD068\n\tbl SoundMainRAM_Unk1\n\tb _081DD228\n_081DD068:\n\tmov r10, r10, lsl 16\n\tmov r11, r11, lsl 16\n\tldrb r0, [r4, o_SoundChannel_type]\n\ttst r0, 0x8\n\tbeq _081DD19C\n_081DD07C:\n\tcmp r2, 0x4\n\tble _081DD0EC\n\tsubs r2, r2, r8\n\tmovgt r9, 0\n\tbgt _081DD0A8\n\tmov r9, r8\n\tadd r2, r2, r8\n\tsub r8, r2, 0x4\n\tsub r9, r9, r8\n\tands r2, r2, 0x3\n\tmoveq r2, 0x4\n_081DD0A8:\n\tldr r6, [r5]\n\tldr r7, [r5, PCM_DMA_BUF_SIZE]\n_081DD0B0:\n\tldrsb r0, [r3], 0x1\n\tmul r1, r10, r0\n\tbic r1, r1, 0xFF0000\n\tadd r6, r1, r6, ror 8\n\tmul r1, r11, r0\n\tbic r1, r1, 0xFF0000\n\tadd r7, r1, r7, ror 8\n\tadds r5, r5, 0x40000000\n\tbcc _081DD0B0\n\tstr r7, [r5, PCM_DMA_BUF_SIZE]\n\tstr r6, [r5], 0x4\n\tsubs r8, r8, 0x4\n\tbgt _081DD0A8\n\tadds r8, r8, r9\n\tbeq _081DD22C\n_081DD0EC:\n\tldr r6, [r5]\n\tldr r7, [r5, PCM_DMA_BUF_SIZE]\n_081DD0F4:\n\tldrsb r0, [r3], 0x1\n\tmul r1, r10, r0\n\tbic r1, r1, 0xFF0000\n\tadd r6, r1, r6, ror 8\n\tmul r1, r11, r0\n\tbic r1, r1, 0xFF0000\n\tadd r7, r1, r7, ror 8\n\tsubs r2, r2, 0x1\n\tbeq _081DD164\n_081DD118:\n\tadds r5, r5, 0x40000000\n\tbcc _081DD0F4\n\tstr r7, [r5, PCM_DMA_BUF_SIZE]\n\tstr r6, [r5], 0x4\n\tsubs r8, r8, 0x4\n\tbgt _081DD07C\n\tb _081DD22C\n_081DD134:\n\tldr r0, [sp, 0x18]\n\tcmp r0, 0\n\tbeq _081DD158\n\tldr r3, [sp, 0x14]\n\trsb lr, r2, 0\n_081DD148:\n\tadds r2, r0, r2\n\tbgt _081DD1FC\n\tsub lr, lr, r0\n\tb _081DD148\n_081DD158:\n\tpop {r4,r12}\n\tmov r2, 0\n\tb _081DD174\n_081DD164:\n\tldr r2, [sp, 0x10]\n\tcmp r2, 0\n\tldrne r3, [sp, 0xC]\n\tbne _081DD118\n_081DD174:\n\tstrb r2, [r4, o_SoundChannel_statusFlags]\n\tmov r0, r5, lsr 30\n\tbic r5, r5, 0xC0000000\n\trsb r0, r0, 0x3\n\tmov r0, r0, lsl 3\n\tmov r6, r6, ror r0\n\tmov r7, r7, ror r0\n\tstr r7, [r5, PCM_DMA_BUF_SIZE]\n\tstr r6, [r5], 0x4\n\tb _081DD234\n_081DD19C:\n\tpush {r4,r12}\n\tldr r1, [r4, o_SoundChannel_frequency]\n\tmul r4, r12, r1\n\tldrsb r0, [r3]\n\tldrsb r1, [r3, 0x1]!\n\tsub r1, r1, r0\n_081DD1B4:\n\tldr r6, [r5]\n\tldr r7, [r5, PCM_DMA_BUF_SIZE]\n_081DD1BC:\n\tmul lr, r9, r1\n\tadd lr, r0, lr, asr 23\n\tmul r12, r10, lr\n\tbic r12, r12, 0xFF0000\n\tadd r6, r12, r6, ror 8\n\tmul r12, r11, lr\n\tbic r12, r12, 0xFF0000\n\tadd r7, r12, r7, ror 8\n\tadd r9, r9, r4\n\tmovs lr, r9, lsr 23\n\tbeq _081DD208\n\tbic r9, r9, 0x3F800000\n\tsubs r2, r2, lr\n\tble _081DD134\n\tsubs lr, lr, 0x1\n\taddeq r0, r0, r1\n_081DD1FC:\n\tldrsbne r0, [r3, lr]!\n\tldrsb r1, [r3, 0x1]!\n\tsub r1, r1, r0\n_081DD208:\n\tadds r5, r5, 0x40000000\n\tbcc _081DD1BC\n\tstr r7, [r5, PCM_DMA_BUF_SIZE]\n\tstr r6, [r5], 0x4\n\tsubs r8, r8, 0x4\n\tbgt _081DD1B4\n\tsub r3, r3, 0x1\n\tpop {r4,r12}\n_081DD228:\n\tstr r9, [r4, o_SoundChannel_fw]\n_081DD22C:\n\tstr r2, [r4, o_SoundChannel_count]\n\tstr r3, [r4, o_SoundChannel_currentPointer]\n_081DD234:\n\tldr r8, [sp]\n\tadd r0, pc, 0x1\n\tbx r0\n\t.thumb\n_081DD240:\n\tldr r0, [sp, 0x4]\n\tsubs r0, 1\n\tble _081DD24A\n\tadds r4, SoundChannel_size\n\tb SoundMainRAM_ChanLoop\n_081DD24A:\n\tldr r0, [sp, 0x18]\n\tldr r3, =ID_NUMBER\n\tstr r3, [r0]\n\tadd sp, 0x1C\n\tpop {r0-r7}\n\tmov r8, r0\n\tmov r9, r1\n\tmov r10, r2\n\tmov r11, r3\n\tpop {r3}\n_081DD25E:\n\tbx r3\n\t.pool\n\tthumb_func_end SoundMainRAM\n\n@ Not present in GBA SDK 3.0\n\tarm_func_start SoundMainRAM_Unk1\nSoundMainRAM_Unk1:\n\tldr r6, [r4, o_SoundChannel_wav]\n\tldrb r0, [r4, o_SoundChannel_statusFlags]\n\ttst r0, SOUND_CHANNEL_SF_SPECIAL\n\tbne _081DD2B4\n\torr r0, r0, SOUND_CHANNEL_SF_SPECIAL\n\tstrb r0, [r4, o_SoundChannel_statusFlags]\n\tldrb r0, [r4, o_SoundChannel_type]\n\ttst r0, TONEDATA_TYPE_REV\n\tbeq _081DD29C\n\tldr r1, [r6, o_WaveData_size]\n\tadd r1, r1, r6, lsl 1\n\tadd r1, r1, 0x20\n\tsub r3, r1, r3\n\tstr r3, [r4, o_SoundChannel_currentPointer]\n_081DD29C:\n\tldrh r0, [r6, o_WaveData_type]\n\tcmp r0, 0\n\tbeq _081DD2B4\n\tsub r3, r3, r6\n\tsub r3, r3, 0x10\n\tstr r3, [r4, o_SoundChannel_currentPointer]\n_081DD2B4:\n\tpush {r8,r12,lr}\n\tmov r10, r10, lsl 16\n\tmov r11, r11, lsl 16\n\tldr r1, [r4, o_SoundChannel_frequency]\n\tldrb r0, [r4, o_SoundChannel_type]\n\ttst r0, TONEDATA_TYPE_FIX\n\tmovne r8, 0x800000\n\tmuleq r8, r12, r1\n\tldrh r0, [r6, o_WaveData_type]\n\tcmp r0, 0\n\tbeq _081DD468\n\tmov r0, 0xFF000000\n\tstr r0, [r4, o_SoundChannel_xpi]\n\tldrb r0, [r4, o_SoundChannel_type]\n\ttst r0, TONEDATA_TYPE_REV\n\tbne _081DD3C0\n\tbl SoundMainRAM_Unk2\n\tmov r0, r1\n\tadd r3, r3, 0x1\n\tbl SoundMainRAM_Unk2\n\tsub r1, r1, r0\n_081DD308:\n\tldr r6, [r5]\n\tldr r7, [r5, PCM_DMA_BUF_SIZE]\n_081DD310:\n\tmul lr, r9, r1\n\tadd lr, r0, lr, asr 23\n\tmul r12, r10, lr\n\tbic r12, r12, 0xFF0000\n\tadd r6, r12, r6, ror 8\n\tmul r12, r11, lr\n\tbic r12, r12, 0xFF0000\n\tadd r7, r12, r7, ror 8\n\tadd r9, r9, r8\n\tmovs lr, r9, lsr 23\n\tbeq _081DD370\n\tbic r9, r9, 0x3F800000\n\tsubs r2, r2, lr\n\tble _081DD398\n\tsubs lr, lr, 0x1\n\tbne _081DD358\n\tadd r0, r0, r1\n\tb _081DD364\n_081DD358:\n\tadd r3, r3, lr\n\tbl SoundMainRAM_Unk2\n\tmov r0, r1\n_081DD364:\n\tadd r3, r3, 0x1\n\tbl SoundMainRAM_Unk2\n\tsub r1, r1, r0\n_081DD370:\n\tadds r5, r5, 0x40000000\n\tbcc _081DD310\n\tstr r7, [r5, PCM_DMA_BUF_SIZE]\n\tstr r6, [r5], 0x4\n\tldr r6, [sp]\n\tsubs r6, r6, 0x4\n\tstr r6, [sp]\n\tbgt _081DD308\n\tsub r3, r3, 0x1\n\tb _081DD4F0\n_081DD398:\n\tldr r0, [sp, 0x1C]\n\tcmp r0, 0\n\tbeq _081DD4F4\n\tldr r3, [r4, o_SoundChannel_wav]\n\tldr r3, [r3, o_WaveData_loopStart]\n\trsb lr, r2, 0\n_081DD3B0:\n\tadds r2, r2, r0\n\tbgt _081DD358\n\tsub lr, lr, r0\n\tb _081DD3B0\n_081DD3C0:\n\tsub r3, r3, 0x1\n\tbl SoundMainRAM_Unk2\n\tmov r0, r1\n\tsub r3, r3, 0x1\n\tbl SoundMainRAM_Unk2\n\tsub r1, r1, r0\n_081DD3D8:\n\tldr r6, [r5]\n\tldr r7, [r5, PCM_DMA_BUF_SIZE]\n_081DD3E0:\n\tmul lr, r9, r1\n\tadd lr, r0, lr, asr 23\n\tmul r12, r10, lr\n\tbic r12, r12, 0xFF0000\n\tadd r6, r12, r6, ror 8\n\tmul r12, r11, lr\n\tbic r12, r12, 0xFF0000\n\tadd r7, r12, r7, ror 8\n\tadd r9, r9, r8\n\tmovs lr, r9, lsr 23\n\tbeq _081DD440\n\tbic r9, r9, 0x3F800000\n\tsubs r2, r2, lr\n\tble _081DD4F4\n\tsubs lr, lr, 0x1\n\tbne _081DD428\n\tadd r0, r0, r1\n\tb _081DD434\n_081DD428:\n\tsub r3, r3, lr\n\tbl SoundMainRAM_Unk2\n\tmov r0, r1\n_081DD434:\n\tsub r3, r3, 0x1\n\tbl SoundMainRAM_Unk2\n\tsub r1, r1, r0\n_081DD440:\n\tadds r5, r5, 0x40000000\n\tbcc _081DD3E0\n\tstr r7, [r5, PCM_DMA_BUF_SIZE]\n\tstr r6, [r5], 0x4\n\tldr r6, [sp]\n\tsubs r6, r6, 0x4\n\tstr r6, [sp]\n\tbgt _081DD3D8\n\tadd r3, r3, 0x2\n\tb _081DD4F0\n_081DD468:\n\tldrb r0, [r4, o_SoundChannel_type]\n\ttst r0, TONEDATA_TYPE_REV\n\tbeq _081DD4F0\n\tldrsb r0, [r3, -0x1]!\n\tldrsb r1, [r3, -0x1]\n\tsub r1, r1, r0\n_081DD480:\n\tldr r6, [r5]\n\tldr r7, [r5, 0x630]\n_081DD488:\n\tmul lr, r9, r1\n\tadd lr, r0, lr, asr 23\n\tmul r12, r10, lr\n\tbic r12, r12, 0xFF0000\n\tadd r6, r12, r6, ror 8\n\tmul r12, r11, lr\n\tbic r12, r12, 0xFF0000\n\tadd r7, r12, r7, ror 8\n\tadd r9, r9, r8\n\tmovs lr, r9, lsr 23\n\tbeq _081DD4CC\n\tbic r9, r9, 0x3F800000\n\tsubs r2, r2, lr\n\tble _081DD4F4\n\tldrsb r0, [r3, -lr]!\n\tldrsb r1, [r3, -0x1]\n\tsub r1, r1, r0\n_081DD4CC:\n\tadds r5, r5, 0x40000000\n\tbcc _081DD488\n\tstr r7, [r5, 0x630]\n\tstr r6, [r5], 0x4\n\tldr r6, [sp]\n\tsubs r6, r6, 0x4\n\tstr r6, [sp]\n\tbgt _081DD480\n\tadd r3, r3, 0x1\n_081DD4F0:\n\tpop {r8,r12,pc}\n_081DD4F4:\n\tmov r2, 0\n\tstrb r2, [r4, o_SoundChannel_statusFlags]\n\tmov r0, r5, lsr 30\n\tbic r5, r5, 0xC0000000\n\trsb r0, r0, 0x3\n\tmov r0, r0, lsl 3\n\tmov r6, r6, ror r0\n\tmov r7, r7, ror r0\n\tstr r7, [r5, 0x630]\n\tstr r6, [r5], 0x4\n\tpop {r8,r12,pc}\n\tarm_func_end SoundMainRAM_Unk1\n\n@ Not present in GBA SDK 3.0\n\tarm_func_start SoundMainRAM_Unk2\nSoundMainRAM_Unk2:\n\tpush {r0,r2,r5-r7,lr}\n\tmov r0, r3, lsr 6\n\tldr r1, [r4, o_SoundChannel_xpi]\n\tcmp r0, r1\n\tbeq _081DD594\n\tstr r0, [r4, o_SoundChannel_xpi]\n\tmov r1, 0x21\n\tmul r2, r1, r0\n\tldr r1, [r4, o_SoundChannel_wav]\n\tadd r2, r2, r1\n\tadd r2, r2, 0x10\n\tldr r5, =sDecodingBuffer\n\tldr r6, =gDeltaEncodingTable\n\tmov r7, 0x40\n\tldrb lr, [r2], 1\n\tstrb lr, [r5], 1\n\tldrb r1, [r2], 1\n\tb _081DD57C\n_081DD568:\n\tldrb r1, [r2], 1\n\tmov r0, r1, lsr 4\n\tldrsb r0, [r6, r0]\n\tadd lr, lr, r0\n\tstrb lr, [r5], 1\n_081DD57C:\n\tand r0, r1, 0xF\n\tldrsb r0, [r6, r0]\n\tadd lr, lr, r0\n\tstrb lr, [r5], 1\n\tsubs r7, r7, 2\n\tbgt _081DD568\n_081DD594:\n\tldr r5, =sDecodingBuffer\n\tand r0, r3, 0x3F\n\tldrsb r1, [r5, r0]\n\tpop {r0,r2,r5-r7,pc}\n\t.pool\n\tarm_func_end SoundMainRAM_Unk2\n\n\tthumb_func_start SoundMainBTM\nSoundMainBTM:\n\tmov r12, r4\n\tmovs r1, 0\n\tmovs r2, 0\n\tmovs r3, 0\n\tmovs r4, 0\n\tstm r0!, {r1-r4}\n\tstm r0!, {r1-r4}\n\tstm r0!, {r1-r4}\n\tstm r0!, {r1-r4}\n\tmov r4, r12\n\tbx lr\n\tthumb_func_end SoundMainBTM\n\n\tthumb_func_start RealClearChain\nRealClearChain:\n\tldr r3, [r0, o_SoundChannel_track]\n\tcmp r3, 0\n\tbeq _081DD5E2\n\tldr r1, [r0, o_SoundChannel_nextChannelPointer]\n\tldr r2, [r0, o_SoundChannel_prevChannelPointer]\n\tcmp r2, 0\n\tbeq _081DD5D6\n\tstr r1, [r2, o_SoundChannel_nextChannelPointer]\n\tb _081DD5D8\n_081DD5D6:\n\tstr r1, [r3, o_MusicPlayerTrack_chan]\n_081DD5D8:\n\tcmp r1, 0\n\tbeq _081DD5DE\n\tstr r2, [r1, o_SoundChannel_prevChannelPointer]\n_081DD5DE:\n\tmovs r1, 0\n\tstr r1, [r0, o_SoundChannel_track]\n_081DD5E2:\n\tbx lr\n\tthumb_func_end RealClearChain\n\n\tthumb_func_start ply_fine\nply_fine:\n\tpush {r4,r5,lr}\n\tadds r5, r1, 0\n\tldr r4, [r5, o_MusicPlayerTrack_chan]\n\tcmp r4, 0\n\tbeq ply_fine_done\nply_fine_loop:\n\tldrb r1, [r4, o_SoundChannel_statusFlags]\n\tmovs r0, SOUND_CHANNEL_SF_ON\n\ttst r0, r1\n\tbeq ply_fine_ok\n\tmovs r0, SOUND_CHANNEL_SF_STOP\n\torrs r1, r0\n\tstrb r1, [r4, o_SoundChannel_statusFlags]\nply_fine_ok:\n\tadds r0, r4, 0\n\tbl RealClearChain\n\tldr r4, [r4, o_SoundChannel_nextChannelPointer]\n\tcmp r4, 0\n\tbne ply_fine_loop\nply_fine_done:\n\tmovs r0, 0\n\tstrb r0, [r5, o_MusicPlayerTrack_flags]\n\tpop {r4,r5}\n\tpop {r0}\n\tbx r0\n\tthumb_func_end ply_fine\n\n\tthumb_func_start MPlayJumpTableCopy\nMPlayJumpTableCopy:\n\tmov r12, lr\n\tmovs r1, 0x24\n\tldr r2, lt_MPlayJumpTableTemplate\nMPlayJumpTableCopy_Loop:\n\tldr r3, [r2]\n\tbl chk_adr_r2\n\tstm r0!, {r3}\n\tadds r2, 0x4\n\tsubs r1, 0x1\n\tbgt MPlayJumpTableCopy_Loop\n\tbx r12\n\tthumb_func_end MPlayJumpTableCopy\n\n\t.align 2, 0\n\t.thumb_func\nldrb_r3_r2:\n\tldrb r3, [r2]\n\n@ This attempts to protect against reading anything from the BIOS ROM\n@ besides the jump table template.\n@ It assumes that the jump table template is located at the end of the ROM.\n\t.thumb_func\nchk_adr_r2:\n\tpush {r0}\n\tlsrs r0, r2, 25\n\tbne chk_adr_r2_done @ if adr >= 0x2000000 (i.e. not in BIOS ROM), accept it\n\tldr r0, lt_MPlayJumpTableTemplate\n\tcmp r2, r0\n\tblo chk_adr_r2_reject @ if adr < gMPlayJumpTableTemplate, reject it\n\tlsrs r0, r2, 14\n\tbeq chk_adr_r2_done @ if adr < 0x40000 (i.e. in BIOS ROM), accept it\nchk_adr_r2_reject:\n\tmovs r3, 0\nchk_adr_r2_done:\n\tpop {r0}\n\tbx lr\n\n\t.align 2, 0\nlt_MPlayJumpTableTemplate: .word gMPlayJumpTableTemplate\n\n\tthumb_func_start ld_r3_tp_adr_i\nld_r3_tp_adr_i:\n\tldr r2, [r1, o_MusicPlayerTrack_cmdPtr]\n_081DD64A:\n\tadds r3, r2, 0x1\n\tstr r3, [r1, o_MusicPlayerTrack_cmdPtr]\n\tldrb r3, [r2]\n\tb chk_adr_r2\n\tthumb_func_end ld_r3_tp_adr_i\n\n\tthumb_func_start ply_goto\nply_goto:\n\tpush {lr}\nply_goto_1:\n\tldr r2, [r1, o_MusicPlayerTrack_cmdPtr]\n\tldrb r0, [r2, 0x3]\n\tlsls r0, 8\n\tldrb r3, [r2, 0x2]\n\torrs r0, r3\n\tlsls r0, 8\n\tldrb r3, [r2, 0x1]\n\torrs r0, r3\n\tlsls r0, 8\n\tbl ldrb_r3_r2\n\torrs r0, r3\n\tstr r0, [r1, o_MusicPlayerTrack_cmdPtr]\n\tpop {r0}\n\tbx r0\n\tthumb_func_end ply_goto\n\n\tthumb_func_start ply_patt\nply_patt:\n\tldrb r2, [r1, o_MusicPlayerTrack_patternLevel]\n\tcmp r2, 3\n\tbhs ply_patt_done\n\tlsls r2, 2\n\tadds r3, r1, r2\n\tldr r2, [r1, o_MusicPlayerTrack_cmdPtr]\n\tadds r2, 0x4\n\tstr r2, [r3, o_MusicPlayerTrack_patternStack]\n\tldrb r2, [r1, o_MusicPlayerTrack_patternLevel]\n\tadds r2, 1\n\tstrb r2, [r1, o_MusicPlayerTrack_patternLevel]\n\tb ply_goto\nply_patt_done:\n\tb ply_fine\n\tthumb_func_end ply_patt\n\n\tthumb_func_start ply_pend\nply_pend:\n\tldrb r2, [r1, o_MusicPlayerTrack_patternLevel]\n\tcmp r2, 0\n\tbeq ply_pend_done\n\tsubs r2, 1\n\tstrb r2, [r1, o_MusicPlayerTrack_patternLevel]\n\tlsls r2, 2\n\tadds r3, r1, r2\n\tldr r2, [r3, o_MusicPlayerTrack_patternStack]\n\tstr r2, [r1, o_MusicPlayerTrack_cmdPtr]\nply_pend_done:\n\tbx lr\n\tthumb_func_end ply_pend\n\n\tthumb_func_start ply_rept\nply_rept:\n\tpush {lr}\n\tldr r2, [r1, o_MusicPlayerTrack_cmdPtr]\n\tldrb r3, [r2]\n\tcmp r3, 0\n\tbne ply_rept_1\n\tadds r2, 1\n\tstr r2, [r1, o_MusicPlayerTrack_cmdPtr]\n\tb ply_goto_1\nply_rept_1:\n\tldrb r3, [r1, o_MusicPlayerTrack_repN]\n\tadds r3, 1\n\tstrb r3, [r1, o_MusicPlayerTrack_repN]\n\tmov r12, r3\n\tbl ld_r3_tp_adr_i\n\tcmp r12, r3\n\tbhs ply_rept_2\n\tb ply_goto_1\nply_rept_2:\n\tmovs r3, 0\n\tstrb r3, [r1, o_MusicPlayerTrack_repN]\n\tadds r2, 5\n\tstr r2, [r1, o_MusicPlayerTrack_cmdPtr]\n\tpop {r0}\n\tbx r0\n\tthumb_func_end ply_rept\n\n\tthumb_func_start ply_prio\nply_prio:\n\tmov r12, lr\n\tbl ld_r3_tp_adr_i\n\tstrb r3, [r1, o_MusicPlayerTrack_priority]\n\tbx r12\n\tthumb_func_end ply_prio\n\n\tthumb_func_start ply_tempo\nply_tempo:\n\tmov r12, lr\n\tbl ld_r3_tp_adr_i\n\tlsls r3, 1\n\tstrh r3, [r0, o_MusicPlayerInfo_tempoD]\n\tldrh r2, [r0, o_MusicPlayerInfo_tempoU]\n\tmuls r3, r2\n\tlsrs r3, 8\n\tstrh r3, [r0, o_MusicPlayerInfo_tempoI]\n\tbx r12\n\tthumb_func_end ply_tempo\n\n\tthumb_func_start ply_keysh\nply_keysh:\n\tmov r12, lr\n\tbl ld_r3_tp_adr_i\n\tstrb r3, [r1, o_MusicPlayerTrack_keyShift]\n\tldrb r3, [r1, o_MusicPlayerTrack_flags]\n\tmovs r2, 0xC\n\torrs r3, r2\n\tstrb r3, [r1, o_MusicPlayerTrack_flags]\n\tbx r12\n\tthumb_func_end ply_keysh\n\n\tthumb_func_start ply_voice\nply_voice:\n\tmov r12, lr\n\tldr r2, [r1, o_MusicPlayerTrack_cmdPtr]\n\tldrb r3, [r2]\n\tadds r2, 1\n\tstr r2, [r1, o_MusicPlayerTrack_cmdPtr]\n\tlsls r2, r3, 1\n\tadds r2, r3\n\tlsls r2, 2\n\tldr r3, [r0, o_MusicPlayerInfo_tone]\n\tadds r2, r3\n\tldr r3, [r2, o_ToneData_type]\n\tbl chk_adr_r2\n\tstr r3, [r1, o_MusicPlayerTrack_ToneData_type]\n\tldr r3, [r2, o_ToneData_wav]\n\tbl chk_adr_r2\n\tstr r3, [r1, o_MusicPlayerTrack_ToneData_wav]\n\tldr r3, [r2, o_ToneData_attack]\n\tbl chk_adr_r2\n\tstr r3, [r1, o_MusicPlayerTrack_ToneData_attack]\n\tbx r12\n\tthumb_func_end ply_voice\n\n\tthumb_func_start ply_vol\nply_vol:\n\tmov r12, lr\n\tbl ld_r3_tp_adr_i\n\tstrb r3, [r1, o_MusicPlayerTrack_vol]\n\tldrb r3, [r1, o_MusicPlayerTrack_flags]\n\tmovs r2, MPT_FLG_VOLCHG\n\torrs r3, r2\n\tstrb r3, [r1, o_MusicPlayerTrack_flags]\n\tbx r12\n\tthumb_func_end ply_vol\n\n\tthumb_func_start ply_pan\nply_pan:\n\tmov r12, lr\n\tbl ld_r3_tp_adr_i\n\tsubs r3, C_V\n\tstrb r3, [r1, o_MusicPlayerTrack_pan]\n\tldrb r3, [r1, o_MusicPlayerTrack_flags]\n\tmovs r2, MPT_FLG_VOLCHG\n\torrs r3, r2\n\tstrb r3, [r1, o_MusicPlayerTrack_flags]\n\tbx r12\n\tthumb_func_end ply_pan\n\n\tthumb_func_start ply_bend\nply_bend:\n\tmov r12, lr\n\tbl ld_r3_tp_adr_i\n\tsubs r3, C_V\n\tstrb r3, [r1, o_MusicPlayerTrack_bend]\n\tldrb r3, [r1, o_MusicPlayerTrack_flags]\n\tmovs r2, MPT_FLG_PITCHG\n\torrs r3, r2\n\tstrb r3, [r1, o_MusicPlayerTrack_flags]\n\tbx r12\n\tthumb_func_end ply_bend\n\n\tthumb_func_start ply_bendr\nply_bendr:\n\tmov r12, lr\n\tbl ld_r3_tp_adr_i\n\tstrb r3, [r1, o_MusicPlayerTrack_bendRange]\n\tldrb r3, [r1, o_MusicPlayerTrack_flags]\n\tmovs r2, MPT_FLG_PITCHG\n\torrs r3, r2\n\tstrb r3, [r1, o_MusicPlayerTrack_flags]\n\tbx r12\n\tthumb_func_end ply_bendr\n\n\tthumb_func_start ply_lfodl\nply_lfodl:\n\tmov r12, lr\n\tbl ld_r3_tp_adr_i\n\tstrb r3, [r1, o_MusicPlayerTrack_lfoDelay]\n\tbx r12\n\tthumb_func_end ply_lfodl\n\n\tthumb_func_start ply_modt\nply_modt:\n\tmov r12, lr\n\tbl ld_r3_tp_adr_i\n\tldrb r0, [r1, o_MusicPlayerTrack_modT]\n\tcmp r0, r3\n\tbeq _081DD7AA\n\tstrb r3, [r1, o_MusicPlayerTrack_modT]\n\tldrb r3, [r1, o_MusicPlayerTrack_flags]\n\tmovs r2, MPT_FLG_VOLCHG | MPT_FLG_PITCHG\n\torrs r3, r2\n\tstrb r3, [r1, o_MusicPlayerTrack_flags]\n_081DD7AA:\n\tbx r12\n\tthumb_func_end ply_modt\n\n\tthumb_func_start ply_tune\nply_tune:\n\tmov r12, lr\n\tbl ld_r3_tp_adr_i\n\tsubs r3, C_V\n\tstrb r3, [r1, o_MusicPlayerTrack_tune]\n\tldrb r3, [r1, o_MusicPlayerTrack_flags]\n\tmovs r2, MPT_FLG_PITCHG\n\torrs r3, r2\n\tstrb r3, [r1, o_MusicPlayerTrack_flags]\n\tbx r12\n\tthumb_func_end ply_tune\n\n\tthumb_func_start ply_port\nply_port:\n\tmov r12, lr\n\tldr r2, [r1, o_MusicPlayerTrack_cmdPtr]\n\tldrb r3, [r2]\n\tadds r2, 1\n\tldr r0, =REG_SOUND1CNT_L @ sound register base address\n\tadds r0, r3\n\tbl _081DD64A\n\tstrb r3, [r0]\n\tbx r12\n\t.pool\n\tthumb_func_end ply_port\n\n\tthumb_func_start m4aSoundVSync\nm4aSoundVSync:\n\tldr r0, lt2_SOUND_INFO_PTR\n\tldr r0, [r0]\n\n\t@ Exit the function if ident is not ID_NUMBER or ID_NUMBER+1.\n\tldr r2, lt2_ID_NUMBER\n\tldr r3, [r0, o_SoundInfo_ident]\n\tsubs r3, r2\n\tcmp r3, 1\n\tbhi m4aSoundVSync_Done\n\n\t@ Decrement the PCM DMA counter. If it reaches 0, we need to do a DMA.\n\tldrb r1, [r0, o_SoundInfo_pcmDmaCounter]\n\tsubs r1, 1\n\tstrb r1, [r0, o_SoundInfo_pcmDmaCounter]\n\tbgt m4aSoundVSync_Done\n\n\t@ Reload the PCM DMA counter.\n\tldrb r1, [r0, o_SoundInfo_pcmDmaPeriod]\n\tstrb r1, [r0, o_SoundInfo_pcmDmaCounter]\n\n\tldr r2, =REG_DMA1\n\n\tldr r1, [r2, 0x8] @ DMA1CNT\n\tlsls r1, 7\n\tbcc m4aSoundVSync_SkipDMA1 @ branch if repeat bit isn't set\n\n\tldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4\n\tstr r1, [r2, 0x8] @ DMA1CNT\n\nm4aSoundVSync_SkipDMA1:\n\tldr r1, [r2, 0xC + 0x8] @ DMA2CNT\n\tlsls r1, 7\n\tbcc m4aSoundVSync_SkipDMA2 @ branch if repeat bit isn't set\n\n\tldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4\n\tstr r1, [r2, 0xC + 0x8] @ DMA2CNT\n\nm4aSoundVSync_SkipDMA2:\n\n\t@ turn off DMA1/DMA2\n\tmovs r1, DMA_32BIT >> 8\n\tlsls r1, 8\n\tstrh r1, [r2, 0xA]       @ DMA1CNT_H\n\tstrh r1, [r2, 0xC + 0xA] @ DMA2CNT_H\n\n\t@ turn on DMA1/DMA2 direct-sound FIFO mode\n\tmovs r1, (DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT) >> 8\n\tlsls r1, 8 @ LSB is 0, so DMA_SRC_INC is used (destination is always fixed in FIFO mode)\n\tstrh r1, [r2, 0xA]       @ DMA1CNT_H\n\tstrh r1, [r2, 0xC + 0xA] @ DMA2CNT_H\n\nm4aSoundVSync_Done:\n\tbx lr\n\n\t.pool\n\tthumb_func_end m4aSoundVSync\n\n\tthumb_func_start MPlayMain\nMPlayMain:\n\tldr r2, lt2_ID_NUMBER\n\tldr r3, [r0, o_MusicPlayerInfo_ident]\n\tcmp r2, r3\n\tbeq _081DD82E\n\tbx lr\n_081DD82E:\n\tadds r3, 0x1\n\tstr r3, [r0, o_MusicPlayerInfo_ident]\n\tpush {r0,lr}\n\tldr r3, [r0, o_MusicPlayerInfo_func]\n\tcmp r3, 0\n\tbeq _081DD840\n\tldr r0, [r0, o_MusicPlayerInfo_intp]\n\tbl call_r3\n_081DD840:\n\tpop {r0}\n\tpush {r4-r7}\n\tmov r4, r8\n\tmov r5, r9\n\tmov r6, r10\n\tmov r7, r11\n\tpush {r4-r7}\n\tadds r7, r0, 0\n\tldr r0, [r7, o_MusicPlayerInfo_status]\n\tcmp r0, 0\n\tbge _081DD858\n\tb _081DDA6C\n_081DD858:\n\tldr r0, lt2_SOUND_INFO_PTR\n\tldr r0, [r0]\n\tmov r8, r0\n\tadds r0, r7, 0\n\tbl FadeOutBody\n\tldr r0, [r7, o_MusicPlayerInfo_status]\n\tcmp r0, 0\n\tbge _081DD86C\n\tb _081DDA6C\n_081DD86C:\n\tldrh r0, [r7, o_MusicPlayerInfo_tempoC]\n\tldrh r1, [r7, o_MusicPlayerInfo_tempoI]\n\tadds r0, r1\n\tb _081DD9BC\n_081DD874:\n\tldrb r6, [r7, o_MusicPlayerInfo_trackCount]\n\tldr r5, [r7, o_MusicPlayerInfo_tracks]\n\tmovs r3, 0x1\n\tmovs r4, 0\n_081DD87C:\n\tldrb r0, [r5, o_MusicPlayerTrack_flags]\n\tmovs r1, MPT_FLG_EXIST\n\ttst r1, r0\n\tbne _081DD886\n\tb _081DD998\n_081DD886:\n\tmov r10, r3\n\torrs r4, r3\n\tmov r11, r4\n\tldr r4, [r5, o_MusicPlayerTrack_chan]\n\tcmp r4, 0\n\tbeq _081DD8BA\n_081DD892:\n\tldrb r1, [r4, o_SoundChannel_statusFlags]\n\tmovs r0, SOUND_CHANNEL_SF_ON\n\ttst r0, r1\n\tbeq _081DD8AE\n\tldrb r0, [r4, o_SoundChannel_gateTime]\n\tcmp r0, 0\n\tbeq _081DD8B4\n\tsubs r0, 0x1\n\tstrb r0, [r4, o_SoundChannel_gateTime]\n\tbne _081DD8B4\n\tmovs r0, SOUND_CHANNEL_SF_STOP\n\torrs r1, r0\n\tstrb r1, [r4, o_SoundChannel_statusFlags]\n\tb _081DD8B4\n_081DD8AE:\n\tadds r0, r4, 0\n\tbl ClearChain\n_081DD8B4:\n\tldr r4, [r4, o_SoundChannel_nextChannelPointer]\n\tcmp r4, 0\n\tbne _081DD892\n_081DD8BA:\n\tldrb r3, [r5, o_MusicPlayerTrack_flags]\n\tmovs r0, MPT_FLG_START\n\ttst r0, r3\n\tbeq _081DD938\n\tadds r0, r5, 0\n\tbl Clear64byte\n\tmovs r0, MPT_FLG_EXIST\n\tstrb r0, [r5, o_MusicPlayerTrack_flags]\n\tmovs r0, 0x2\n\tstrb r0, [r5, o_MusicPlayerTrack_bendRange]\n\tmovs r0, 0x40\n\tstrb r0, [r5, o_MusicPlayerTrack_volX]\n\tmovs r0, 0x16\n\tstrb r0, [r5, o_MusicPlayerTrack_lfoSpeed]\n\tmovs r0, 0x1\n\tadds r1, r5, 0x6\n\tstrb r0, [r1, o_MusicPlayerTrack_ToneData_type - 0x6]\n\tb _081DD938\n_081DD8E0:\n\tldr r2, [r5, o_MusicPlayerTrack_cmdPtr]\n\tldrb r1, [r2]\n\tcmp r1, 0x80\n\tbhs _081DD8EC\n\tldrb r1, [r5, o_MusicPlayerTrack_runningStatus]\n\tb _081DD8F6\n_081DD8EC:\n\tadds r2, 0x1\n\tstr r2, [r5, o_MusicPlayerTrack_cmdPtr]\n\tcmp r1, 0xBD\n\tbcc _081DD8F6\n\tstrb r1, [r5, o_MusicPlayerTrack_runningStatus]\n_081DD8F6:\n\tcmp r1, 0xCF\n\tbcc _081DD90C\n\tmov r0, r8\n\tldr r3, [r0, o_SoundInfo_plynote]\n\tadds r0, r1, 0\n\tsubs r0, 0xCF\n\tadds r1, r7, 0\n\tadds r2, r5, 0\n\tbl call_r3\n\tb _081DD938\n_081DD90C:\n\tcmp r1, 0xB0\n\tbls _081DD92E\n\tadds r0, r1, 0\n\tsubs r0, 0xB1\n\tstrb r0, [r7, o_MusicPlayerInfo_cmd]\n\tmov r3, r8\n\tldr r3, [r3, o_SoundInfo_MPlayJumpTable]\n\tlsls r0, 2\n\tldr r3, [r3, r0]\n\tadds r0, r7, 0\n\tadds r1, r5, 0\n\tbl call_r3\n\tldrb r0, [r5, o_MusicPlayerTrack_flags]\n\tcmp r0, 0\n\tbeq _081DD994\n\tb _081DD938\n_081DD92E:\n\tldr r0, lt_gClockTable\n\tsubs r1, 0x80\n\tadds r1, r0\n\tldrb r0, [r1]\n\tstrb r0, [r5, o_MusicPlayerTrack_wait]\n_081DD938:\n\tldrb r0, [r5, o_MusicPlayerTrack_wait]\n\tcmp r0, 0\n\tbeq _081DD8E0\n\tsubs r0, 0x1\n\tstrb r0, [r5, o_MusicPlayerTrack_wait]\n\tldrb r1, [r5, o_MusicPlayerTrack_lfoSpeed]\n\tcmp r1, 0\n\tbeq _081DD994\n\tldrb r0, [r5, o_MusicPlayerTrack_mod]\n\tcmp r0, 0\n\tbeq _081DD994\n\tldrb r0, [r5, o_MusicPlayerTrack_lfoDelayC]\n\tcmp r0, 0\n\tbeq _081DD95A\n\tsubs r0, 0x1\n\tstrb r0, [r5, o_MusicPlayerTrack_lfoDelayC]\n\tb _081DD994\n_081DD95A:\n\tldrb r0, [r5, o_MusicPlayerTrack_lfoSpeedC]\n\tadds r0, r1\n\tstrb r0, [r5, o_MusicPlayerTrack_lfoSpeedC]\n\tadds r1, r0, 0\n\tsubs r0, 0x40\n\tlsls r0, 24\n\tbpl _081DD96E\n\tlsls r2, r1, 24\n\tasrs r2, 24\n\tb _081DD972\n_081DD96E:\n\tmovs r0, 0x80\n\tsubs r2, r0, r1\n_081DD972:\n\tldrb r0, [r5, o_MusicPlayerTrack_mod]\n\tmuls r0, r2\n\tasrs r2, r0, 6\n\tldrb r0, [r5, o_MusicPlayerTrack_modM]\n\teors r0, r2\n\tlsls r0, 24\n\tbeq _081DD994\n\tstrb r2, [r5, o_MusicPlayerTrack_modM]\n\tldrb r0, [r5]\n\tldrb r1, [r5, o_MusicPlayerTrack_modT]\n\tcmp r1, 0\n\tbne _081DD98E\n\tmovs r1, MPT_FLG_PITCHG\n\tb _081DD990\n_081DD98E:\n\tmovs r1, MPT_FLG_VOLCHG\n_081DD990:\n\torrs r0, r1\n\tstrb r0, [r5, o_MusicPlayerTrack_flags]\n_081DD994:\n\tmov r3, r10\n\tmov r4, r11\n_081DD998:\n\tsubs r6, 0x1\n\tble _081DD9A4\n\tmovs r0, MusicPlayerTrack_size\n\tadds r5, r0\n\tlsls r3, 1\n\tb _081DD87C\n_081DD9A4:\n\tldr r0, [r7, o_MusicPlayerInfo_clock]\n\tadds r0, 0x1\n\tstr r0, [r7, o_MusicPlayerInfo_clock]\n\tcmp r4, 0\n\tbne _081DD9B6\n\tmovs r0, 0x80\n\tlsls r0, 24\n\tstr r0, [r7, o_MusicPlayerInfo_status]\n\tb _081DDA6C\n_081DD9B6:\n\tstr r4, [r7, o_MusicPlayerInfo_status]\n\tldrh r0, [r7, o_MusicPlayerInfo_tempoC]\n\tsubs r0, 150\n_081DD9BC:\n\tstrh r0, [r7, o_MusicPlayerInfo_tempoC]\n\tcmp r0, 150\n\tbcc _081DD9C4\n\tb _081DD874\n_081DD9C4:\n\tldrb r2, [r7, o_MusicPlayerInfo_trackCount]\n\tldr r5, [r7, o_MusicPlayerInfo_tracks]\n_081DD9C8:\n\tldrb r0, [r5, o_MusicPlayerTrack_flags]\n\tmovs r1, 0x80\n\ttst r1, r0\n\tbeq _081DDA62\n\tmovs r1, MPT_FLG_VOLCHG | MPT_FLG_PITCHG\n\ttst r1, r0\n\tbeq _081DDA62\n\tmov r9, r2\n\tadds r0, r7, 0\n\tadds r1, r5, 0\n\tbl TrkVolPitSet\n\tldr r4, [r5, o_MusicPlayerTrack_chan]\n\tcmp r4, 0\n\tbeq _081DDA58\n_081DD9E6:\n\tldrb r1, [r4, o_SoundChannel_statusFlags]\n\tmovs r0, SOUND_CHANNEL_SF_ON\n\ttst r0, r1\n\tbne _081DD9F6\n\tadds r0, r4, 0\n\tbl ClearChain\n\tb _081DDA52\n_081DD9F6:\n\tldrb r0, [r4, o_SoundChannel_type]\n\tmovs r6, TONEDATA_TYPE_CGB\n\tands r6, r0\n\tldrb r3, [r5, o_MusicPlayerTrack_flags]\n\tmovs r0, MPT_FLG_VOLCHG\n\ttst r0, r3\n\tbeq _081DDA14\n\tbl ChnVolSetAsm\n\tcmp r6, 0\n\tbeq _081DDA14\n\tldrb r0, [r4, o_CgbChannel_modify]\n\tmovs r1, CGB_CHANNEL_MO_VOL\n\torrs r0, r1\n\tstrb r0, [r4, o_CgbChannel_modify]\n_081DDA14:\n\tldrb r3, [r5, o_MusicPlayerTrack_flags]\n\tmovs r0, MPT_FLG_PITCHG\n\ttst r0, r3\n\tbeq _081DDA52\n\tldrb r1, [r4, o_SoundChannel_key]\n\tmovs r0, o_MusicPlayerTrack_keyM\n\tldrsb r0, [r5, r0]\n\tadds r2, r1, r0\n\tbpl _081DDA28\n\tmovs r2, 0\n_081DDA28:\n\tcmp r6, 0\n\tbeq _081DDA46\n\tmov r0, r8\n\tldr r3, [r0, o_SoundInfo_MidiKeyToCgbFreq]\n\tadds r1, r2, 0\n\tldrb r2, [r5, o_MusicPlayerTrack_pitM]\n\tadds r0, r6, 0\n\tbl call_r3\n\tstr r0, [r4, o_CgbChannel_frequency]\n\tldrb r0, [r4, o_CgbChannel_modify]\n\tmovs r1, CGB_CHANNEL_MO_PIT\n\torrs r0, r1\n\tstrb r0, [r4, o_CgbChannel_modify]\n\tb _081DDA52\n_081DDA46:\n\tadds r1, r2, 0\n\tldrb r2, [r5, o_MusicPlayerTrack_pitM]\n\tldr r0, [r4, o_SoundChannel_wav]\n\tbl MidiKeyToFreq\n\tstr r0, [r4, o_SoundChannel_frequency]\n_081DDA52:\n\tldr r4, [r4, o_SoundChannel_nextChannelPointer]\n\tcmp r4, 0\n\tbne _081DD9E6\n_081DDA58:\n\tldrb r0, [r5, o_MusicPlayerTrack_flags]\n\tmovs r1, 0xF0\n\tands r0, r1\n\tstrb r0, [r5, o_MusicPlayerTrack_flags]\n\tmov r2, r9\n_081DDA62:\n\tsubs r2, 0x1\n\tble _081DDA6C\n\tmovs r0, MusicPlayerTrack_size\n\tadds r5, r0\n\tbgt _081DD9C8\n_081DDA6C:\n\tldr r0, lt2_ID_NUMBER\n\tstr r0, [r7, o_MusicPlayerInfo_ident]\n\tpop {r0-r7}\n\tmov r8, r0\n\tmov r9, r1\n\tmov r10, r2\n\tmov r11, r3\n\tpop {r3}\n\ncall_r3:\n\tbx r3\n\n\t.align 2, 0\nlt_gClockTable:     .word gClockTable\nlt2_SOUND_INFO_PTR: .word SOUND_INFO_PTR\nlt2_ID_NUMBER:      .word ID_NUMBER\n\tthumb_func_end MPlayMain\n\n\tthumb_func_start TrackStop\nTrackStop:\n\tpush {r4-r6,lr}\n\tadds r5, r1, 0\n\tldrb r1, [r5, o_MusicPlayerTrack_flags]\n\tmovs r0, MPT_FLG_EXIST\n\ttst r0, r1\n\tbeq TrackStop_Done\n\tldr r4, [r5, o_MusicPlayerTrack_chan]\n\tcmp r4, 0\n\tbeq TrackStop_3\n\tmovs r6, 0\nTrackStop_Loop:\n\tldrb r0, [r4, o_SoundChannel_statusFlags]\n\tcmp r0, 0\n\tbeq TrackStop_2\n\tldrb r0, [r4, o_SoundChannel_type]\n\tmovs r3, TONEDATA_TYPE_CGB\n\tands r0, r3\n\tbeq TrackStop_1\n\tldr r3, =SOUND_INFO_PTR\n\tldr r3, [r3]\n\tldr r3, [r3, o_SoundInfo_CgbOscOff]\n\tbl call_r3\nTrackStop_1:\n\tstrb r6, [r4, o_SoundChannel_statusFlags]\nTrackStop_2:\n\tstr r6, [r4, o_SoundChannel_track]\n\tldr r4, [r4, o_SoundChannel_nextChannelPointer]\n\tcmp r4, 0\n\tbne TrackStop_Loop\nTrackStop_3:\n\tstr r4, [r5, o_MusicPlayerTrack_chan]\nTrackStop_Done:\n\tpop {r4-r6}\n\tpop {r0}\n\tbx r0\n\t.pool\n\tthumb_func_end TrackStop\n\n\tthumb_func_start ChnVolSetAsm\nChnVolSetAsm:\n\tldrb r1, [r4, o_SoundChannel_velocity]\n\tmovs r0, o_SoundChannel_rhythmPan\n\tldrsb r2, [r4, r0]\n\tmovs r3, 0x80\n\tadds r3, r2\n\tmuls r3, r1\n\tldrb r0, [r5, o_MusicPlayerTrack_volMR]\n\tmuls r0, r3\n\tasrs r0, 14\n\tcmp r0, 0xFF\n\tbls _081DDAE8\n\tmovs r0, 0xFF\n_081DDAE8:\n\tstrb r0, [r4, o_SoundChannel_rightVolume]\n\tmovs r3, 0x7F\n\tsubs r3, r2\n\tmuls r3, r1\n\tldrb r0, [r5, o_MusicPlayerTrack_volML]\n\tmuls r0, r3\n\tasrs r0, 14\n\tcmp r0, 0xFF\n\tbls _081DDAFC\n\tmovs r0, 0xFF\n_081DDAFC:\n\tstrb r0, [r4, o_SoundChannel_leftVolume]\n\tbx lr\n\tthumb_func_end ChnVolSetAsm\n\n\tthumb_func_start ply_note\nply_note:\n\tpush {r4-r7,lr}\n\tmov r4, r8\n\tmov r5, r9\n\tmov r6, r10\n\tmov r7, r11\n\tpush {r4-r7}\n\tsub sp, 0x18\n\tstr r1, [sp]\n\tadds r5, r2, 0\n\tldr r1, =SOUND_INFO_PTR\n\tldr r1, [r1]\n\tstr r1, [sp, 0x4]\n\tldr r1, =gClockTable\n\tadds r0, r1\n\tldrb r0, [r0]\n\tstrb r0, [r5, o_MusicPlayerTrack_gateTime]\n\tldr r3, [r5, o_MusicPlayerTrack_cmdPtr]\n\tldrb r0, [r3]\n\tcmp r0, 0x80\n\tbhs _081DDB46\n\tstrb r0, [r5, o_MusicPlayerTrack_key]\n\tadds r3, 0x1\n\tldrb r0, [r3]\n\tcmp r0, 0x80\n\tbhs _081DDB44\n\tstrb r0, [r5, o_MusicPlayerTrack_velocity]\n\tadds r3, 0x1\n\tldrb r0, [r3]\n\tcmp r0, 0x80\n\tbhs _081DDB44\n\tldrb r1, [r5, o_MusicPlayerTrack_gateTime]\n\tadds r1, r0\n\tstrb r1, [r5, o_MusicPlayerTrack_gateTime]\n\tadds r3, 0x1\n_081DDB44:\n\tstr r3, [r5, o_MusicPlayerTrack_cmdPtr]\n_081DDB46:\n\tmovs r0, 0\n\tstr r0, [sp, 0x14]\n\tadds r4, r5, 0\n\tadds r4, o_MusicPlayerTrack_ToneData_type\n\tldrb r2, [r4]\n\tmovs r0, TONEDATA_TYPE_RHY | TONEDATA_TYPE_SPL\n\ttst r0, r2\n\tbeq _081DDB98\n\tldrb r3, [r5, o_MusicPlayerTrack_key]\n\tmovs r0, TONEDATA_TYPE_SPL\n\ttst r0, r2\n\tbeq _081DDB66\n\tldr r1, [r5, o_MusicPlayerTrack_ToneData_keySplitTable]\n\tadds r1, r3\n\tldrb r0, [r1]\n\tb _081DDB68\n_081DDB66:\n\tadds r0, r3, 0\n_081DDB68:\n\tlsls r1, r0, 1\n\tadds r1, r0\n\tlsls r1, 2\n\tldr r0, [r5, o_MusicPlayerTrack_ToneData_wav]\n\tadds r1, r0\n\tmov r9, r1\n\tmov r6, r9\n\tldrb r1, [r6]\n\tmovs r0, TONEDATA_TYPE_SPL | TONEDATA_TYPE_RHY\n\ttst r0, r1\n\tbeq _081DDB80\n\tb _081DDCEA\n_081DDB80:\n\tmovs r0, TONEDATA_TYPE_RHY\n\ttst r0, r2\n\tbeq _081DDB9C\n\tldrb r1, [r6, o_ToneData_pan_sweep]\n\tmovs r0, 0x80\n\ttst r0, r1\n\tbeq _081DDB94\n\tsubs r1, TONEDATA_P_S_PAN\n\tlsls r1, 1\n\tstr r1, [sp, 0x14]\n_081DDB94:\n\tldrb r3, [r6, o_SoundChannel_type]\n\tb _081DDB9C\n_081DDB98:\n\tmov r9, r4\n\tldrb r3, [r5, o_MusicPlayerTrack_key]\n_081DDB9C:\n\tstr r3, [sp, 0x8]\n\tldr r6, [sp]\n\tldrb r1, [r6, o_MusicPlayerInfo_priority]\n\tldrb r0, [r5, o_MusicPlayerTrack_priority]\n\tadds r0, r1\n\tcmp r0, 0xFF\n\tbls _081DDBAC\n\tmovs r0, 0xFF\n_081DDBAC:\n\tstr r0, [sp, 0x10]\n\tmov r6, r9\n\tldrb r0, [r6, o_ToneData_type]\n\tmovs r6, TONEDATA_TYPE_CGB\n\tands r6, r0\n\tstr r6, [sp, 0xC]\n\tbeq _081DDBEC\n\tldr r0, [sp, 0x4]\n\tldr r4, [r0, o_SoundInfo_cgbChans]\n\tcmp r4, 0\n\tbne _081DDBC4\n\tb _081DDCEA\n_081DDBC4:\n\tsubs r6, 0x1\n\tlsls r0, r6, 6\n\tadds r4, r0\n\tldrb r1, [r4, o_CgbChannel_statusFlags]\n\tmovs r0, SOUND_CHANNEL_SF_ON\n\ttst r0, r1\n\tbeq _081DDC40\n\tmovs r0, SOUND_CHANNEL_SF_STOP\n\ttst r0, r1\n\tbne _081DDC40\n\tldrb r1, [r4, o_CgbChannel_priority]\n\tldr r0, [sp, 0x10]\n\tcmp r1, r0\n\tbcc _081DDC40\n\tbeq _081DDBE4\n\tb _081DDCEA\n_081DDBE4:\n\tldr r0, [r4, o_CgbChannel_track]\n\tcmp r0, r5\n\tbcs _081DDC40\n\tb _081DDCEA\n_081DDBEC:\n\tldr r6, [sp, 0x10]\n\tadds r7, r5, 0\n\tmovs r2, 0\n\tmov r8, r2\n\tldr r4, [sp, 0x4]\n\tldrb r3, [r4, o_SoundInfo_maxChans]\n\tadds r4, o_SoundInfo_chans\n_081DDBFA:\n\tldrb r1, [r4, o_SoundChannel_statusFlags]\n\tmovs r0, SOUND_CHANNEL_SF_ON\n\ttst r0, r1\n\tbeq _081DDC40\n\tmovs r0, SOUND_CHANNEL_SF_STOP\n\ttst r0, r1\n\tbeq _081DDC14\n\tcmp r2, 0\n\tbne _081DDC18\n\tadds r2, 0x1\n\tldrb r6, [r4, o_SoundChannel_priority]\n\tldr r7, [r4, o_SoundChannel_track]\n\tb _081DDC32\n_081DDC14:\n\tcmp r2, 0\n\tbne _081DDC34\n_081DDC18:\n\tldrb r0, [r4, o_SoundChannel_priority]\n\tcmp r0, r6\n\tbcs _081DDC24\n\tadds r6, r0, 0\n\tldr r7, [r4, o_SoundChannel_track]\n\tb _081DDC32\n_081DDC24:\n\tbhi _081DDC34\n\tldr r0, [r4, o_SoundChannel_track]\n\tcmp r0, r7\n\tbls _081DDC30\n\tadds r7, r0, 0\n\tb _081DDC32\n_081DDC30:\n\tbcc _081DDC34\n_081DDC32:\n\tmov r8, r4\n_081DDC34:\n\tadds r4, SoundChannel_size\n\tsubs r3, 0x1\n\tbgt _081DDBFA\n\tmov r4, r8\n\tcmp r4, 0\n\tbeq _081DDCEA\n_081DDC40:\n\tadds r0, r4, 0\n\tbl ClearChain\n\tmovs r1, 0\n\tstr r1, [r4, o_SoundChannel_prevChannelPointer]\n\tldr r3, [r5, o_MusicPlayerTrack_chan]\n\tstr r3, [r4, o_SoundChannel_nextChannelPointer]\n\tcmp r3, 0\n\tbeq _081DDC54\n\tstr r4, [r3, o_SoundChannel_prevChannelPointer]\n_081DDC54:\n\tstr r4, [r5, o_MusicPlayerTrack_chan]\n\tstr r5, [r4, o_SoundChannel_track]\n\tldrb r0, [r5, o_MusicPlayerTrack_lfoDelay]\n\tstrb r0, [r5, o_MusicPlayerTrack_lfoDelayC]\n\tcmp r0, r1\n\tbeq _081DDC66\n\tadds r1, r5, 0\n\tbl clear_modM\n_081DDC66:\n\tldr r0, [sp]\n\tadds r1, r5, 0\n\tbl TrkVolPitSet\n\tldr r0, [r5, o_MusicPlayerTrack_gateTime]\n\tstr r0, [r4, o_SoundChannel_gateTime]\n\tldr r0, [sp, 0x10]\n\tstrb r0, [r4, o_SoundChannel_priority]\n\tldr r0, [sp, 0x8]\n\tstrb r0, [r4, o_SoundChannel_key]\n\tldr r0, [sp, 0x14]\n\tstrb r0, [r4, o_SoundChannel_rhythmPan]\n\tmov r6, r9\n\tldrb r0, [r6, o_ToneData_type]\n\tstrb r0, [r4, o_SoundChannel_type]\n\tldr r7, [r6, o_ToneData_wav]\n\tstr r7, [r4, o_SoundChannel_wav]\n\tldr r0, [r6, o_ToneData_attack]\n\tstr r0, [r4, o_SoundChannel_attack]\n\tldrh r0, [r5, o_MusicPlayerTrack_pseudoEchoVolume]\n\tstrh r0, [r4, o_SoundChannel_pseudoEchoVolume]\n\tbl ChnVolSetAsm\n\tldrb r1, [r4, o_SoundChannel_key]\n\tmovs r0, o_MusicPlayerTrack_keyM\n\tldrsb r0, [r5, r0]\n\tadds r3, r1, r0\n\tbpl _081DDCA0\n\tmovs r3, 0\n_081DDCA0:\n\tldr r6, [sp, 0xC]\n\tcmp r6, 0\n\tbeq _081DDCCE\n\tmov r6, r9\n\tldrb r0, [r6, o_ToneData_length]\n\tstrb r0, [r4, o_CgbChannel_length]\n\tldrb r1, [r6, o_ToneData_pan_sweep]\n\tmovs r0, 0x80\n\ttst r0, r1\n\tbne _081DDCBA\n\tmovs r0, 0x70\n\ttst r0, r1\n\tbne _081DDCBC\n_081DDCBA:\n\tmovs r1, 0x8\n_081DDCBC:\n\tstrb r1, [r4, o_CgbChannel_sweep]\n\tldrb r2, [r5, o_MusicPlayerTrack_pitM]\n\tadds r1, r3, 0\n\tldr r0, [sp, 0xC]\n\tldr r3, [sp, 0x4]\n\tldr r3, [r3, o_SoundInfo_MidiKeyToCgbFreq]\n\tbl call_r3\n\tb _081DDCDC\n_081DDCCE:\n\tldr r0, [r5, o_MusicPlayerTrack_unk_3C]\n\tstr r0, [r4, o_SoundChannel_count]\n\tldrb r2, [r5, o_MusicPlayerTrack_pitM]\n\tadds r1, r3, 0\n\tadds r0, r7, 0\n\tbl MidiKeyToFreq\n_081DDCDC:\n\tstr r0, [r4, o_SoundChannel_frequency]\n\tmovs r0, SOUND_CHANNEL_SF_START\n\tstrb r0, [r4, o_SoundChannel_statusFlags]\n\tldrb r1, [r5, o_MusicPlayerTrack_flags]\n\tmovs r0, 0xF0\n\tands r0, r1\n\tstrb r0, [r5, o_MusicPlayerTrack_flags]\n_081DDCEA:\n\tadd sp, 0x18\n\tpop {r0-r7}\n\tmov r8, r0\n\tmov r9, r1\n\tmov r10, r2\n\tmov r11, r3\n\tpop {r0}\n\tbx r0\n\t.pool\n\tthumb_func_end ply_note\n\n\tthumb_func_start ply_endtie\nply_endtie:\n\tpush {r4,r5}\n\tldr r2, [r1, o_MusicPlayerTrack_cmdPtr]\n\tldrb r3, [r2]\n\tcmp r3, 0x80\n\tbhs _081DDD16\n\tstrb r3, [r1, o_MusicPlayerTrack_key]\n\tadds r2, 0x1\n\tstr r2, [r1, o_MusicPlayerTrack_cmdPtr]\n\tb _081DDD18\n_081DDD16:\n\tldrb r3, [r1, o_MusicPlayerTrack_key]\n_081DDD18:\n\tldr r1, [r1, o_MusicPlayerTrack_chan]\n\tcmp r1, 0\n\tbeq _081DDD40\n\tmovs r4, SOUND_CHANNEL_SF_START | SOUND_CHANNEL_SF_ENV\n\tmovs r5, SOUND_CHANNEL_SF_STOP\n_081DDD22:\n\tldrb r2, [r1, o_SoundChannel_statusFlags]\n\ttst r2, r4\n\tbeq _081DDD3A\n\ttst r2, r5\n\tbne _081DDD3A\n\tldrb r0, [r1, o_SoundChannel_midiKey]\n\tcmp r0, r3\n\tbne _081DDD3A\n\tmovs r0, SOUND_CHANNEL_SF_STOP\n\torrs r2, r0\n\tstrb r2, [r1, o_SoundChannel_statusFlags]\n\tb _081DDD40\n_081DDD3A:\n\tldr r1, [r1, o_SoundChannel_nextChannelPointer]\n\tcmp r1, 0\n\tbne _081DDD22\n_081DDD40:\n\tpop {r4,r5}\n\tbx lr\n\tthumb_func_end ply_endtie\n\n\tthumb_func_start clear_modM\nclear_modM:\n\tmovs r2, 0\n\tstrb r2, [r1, o_MusicPlayerTrack_modM]\n\tstrb r2, [r1, o_MusicPlayerTrack_lfoSpeedC]\n\tldrb r2, [r1, o_MusicPlayerTrack_modT]\n\tcmp r2, 0\n\tbne _081DDD54\n\tmovs r2, MPT_FLG_PITCHG\n\tb _081DDD56\n_081DDD54:\n\tmovs r2, MPT_FLG_VOLCHG\n_081DDD56:\n\tldrb r3, [r1, o_MusicPlayerTrack_flags]\n\torrs r3, r2\n\tstrb r3, [r1, o_MusicPlayerTrack_flags]\n\tbx lr\n\tthumb_func_end clear_modM\n\n\tthumb_func_start ld_r3_tp_adr_i\nld_r3_tp_adr_i_unchecked:\n\tldr r2, [r1, o_MusicPlayerTrack_cmdPtr]\n\tadds r3, r2, 1\n\tstr r3, [r1, o_MusicPlayerTrack_cmdPtr]\n\tldrb r3, [r2]\n\tbx lr\n\tthumb_func_end ld_r3_tp_adr_i\n\n\tthumb_func_start ply_lfos\nply_lfos:\n\tmov r12, lr\n\tbl ld_r3_tp_adr_i_unchecked\n\tstrb r3, [r1, o_MusicPlayerTrack_lfoSpeed]\n\tcmp r3, 0\n\tbne _081DDD7C\n\tbl clear_modM\n_081DDD7C:\n\tbx r12\n\tthumb_func_end ply_lfos\n\n\tthumb_func_start ply_mod\nply_mod:\n\tmov r12, lr\n\tbl ld_r3_tp_adr_i_unchecked\n\tstrb r3, [r1, o_MusicPlayerTrack_mod]\n\tcmp r3, 0\n\tbne _081DDD90\n\tbl clear_modM\n_081DDD90:\n\tbx r12\n\tthumb_func_end ply_mod\n\n\t.align 2, 0 @ Don't pad with nop.\n\n\t.bss\n\t.align 3\nsDecodingBuffer: @ Used as a buffer for audio decoded from compressed DPCM\n\t.space 0x40\n\t.size sDecodingBuffer, .-sDecodingBuffer\n"
  },
  {
    "path": "src/m4a_tables.c",
    "content": "#include \"gba/m4a_internal.h\"\n\n// Some of these functions have different signatures, so we need to make this\n// an array of void pointers or a struct. It's simpler to just make it an array\n// for now.\nvoid *const gMPlayJumpTableTemplate[] =\n{\n    ply_fine,\n    ply_goto,\n    ply_patt,\n    ply_pend,\n    ply_rept,\n    ply_fine,\n    ply_fine,\n    ply_fine,\n    ply_fine,\n    ply_prio,\n    ply_tempo,\n    ply_keysh,\n    ply_voice,\n    ply_vol,\n    ply_pan,\n    ply_bend,\n    ply_bendr,\n    ply_lfos,\n    ply_lfodl,\n    ply_mod,\n    ply_modt,\n    ply_fine,\n    ply_fine,\n    ply_tune,\n    ply_fine,\n    ply_fine,\n    ply_fine,\n    ply_port,\n    ply_fine,\n    ply_endtie,\n    SampleFreqSet,\n    TrackStop,\n    FadeOutBody,\n    TrkVolPitSet,\n    RealClearChain,\n    SoundMainBTM,\n};\n\n// This is a table of deltas between sample values in compressed PCM data.\nconst s8 gDeltaEncodingTable[] =\n{\n      0,\n      1,\n      4,\n      9,\n     16,\n     25,\n     36,\n     49,\n    -64,\n    -49,\n    -36,\n    -25,\n    -16,\n     -9,\n     -4,\n     -1,\n};\n\nconst u8 gScaleTable[] =\n{\n    0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB,\n    0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB,\n    0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB,\n    0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB,\n    0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB,\n    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B,\n    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B,\n    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B,\n    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B,\n    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B,\n    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B,\n    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,\n    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B,\n    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,\n    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,\n};\n\nconst u32 gFreqTable[] =\n{\n    2147483648u,\n    2275179671u,\n    2410468894u,\n    2553802834u,\n    2705659852u,\n    2866546760u,\n    3037000500u,\n    3217589947u,\n    3408917802u,\n    3611622603u,\n    3826380858u,\n    4053909305u,\n};\n\nconst u16 gPcmSamplesPerVBlankTable[] =\n{\n    96,\n    132,\n    176,\n    224,\n    264,\n    304,\n    352,\n    448,\n    528,\n    608,\n    672,\n    704,\n};\n\nconst u8 gCgbScaleTable[] =\n{\n    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,\n    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,\n    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B,\n    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,\n    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B,\n    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B,\n    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B,\n    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B,\n    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B,\n    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B,\n    0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB,\n};\n\nconst s16 gCgbFreqTable[] =\n{\n    -2004,\n    -1891,\n    -1785,\n    -1685,\n    -1591,\n    -1501,\n    -1417,\n    -1337,\n    -1262,\n    -1192,\n    -1125,\n    -1062,\n};\n\nconst u8 gNoiseTable[] =\n{\n    0xD7, 0xD6, 0xD5, 0xD4,\n    0xC7, 0xC6, 0xC5, 0xC4,\n    0xB7, 0xB6, 0xB5, 0xB4,\n    0xA7, 0xA6, 0xA5, 0xA4,\n    0x97, 0x96, 0x95, 0x94,\n    0x87, 0x86, 0x85, 0x84,\n    0x77, 0x76, 0x75, 0x74,\n    0x67, 0x66, 0x65, 0x64,\n    0x57, 0x56, 0x55, 0x54,\n    0x47, 0x46, 0x45, 0x44,\n    0x37, 0x36, 0x35, 0x34,\n    0x27, 0x26, 0x25, 0x24,\n    0x17, 0x16, 0x15, 0x14,\n    0x07, 0x06, 0x05, 0x04,\n    0x03, 0x02, 0x01, 0x00,\n};\n\nconst u8 gCgb3Vol[] =\n{\n    0x00, 0x00,\n    0x60, 0x60, 0x60, 0x60,\n    0x40, 0x40, 0x40, 0x40,\n    0x80, 0x80, 0x80, 0x80,\n    0x20, 0x20,\n};\n\nconst u8 gClockTable[] =\n{\n    0x00,\n    0x01,\n    0x02,\n    0x03,\n    0x04,\n    0x05,\n    0x06,\n    0x07,\n    0x08,\n    0x09,\n    0x0A,\n    0x0B,\n    0x0C,\n    0x0D,\n    0x0E,\n    0x0F,\n    0x10,\n    0x11,\n    0x12,\n    0x13,\n    0x14,\n    0x15,\n    0x16,\n    0x17,\n    0x18,\n    0x1C,\n    0x1E,\n    0x20,\n    0x24,\n    0x28,\n    0x2A,\n    0x2C,\n    0x30,\n    0x34,\n    0x36,\n    0x38,\n    0x3C,\n    0x40,\n    0x42,\n    0x44,\n    0x48,\n    0x4C,\n    0x4E,\n    0x50,\n    0x54,\n    0x58,\n    0x5A,\n    0x5C,\n    0x60,\n};\n\n#define FINE   0xb1\n#define GOTO   0xb2\n#define PATT   0xb3\n#define PEND   0xb4\n#define REPT   0xb5\n#define MEMACC 0xb9\n#define PRIO   0xba\n#define TEMPO  0xbb\n#define KEYSH  0xbc\n#define VOICE  0xbd\n#define VOL    0xbe\n#define PAN    0xbf\n#define BEND   0xc0\n#define BENDR  0xc1\n#define LFOS   0xc2\n#define LFODL  0xc3\n#define MOD    0xc4\n#define MODT   0xc5\n#define TUNE   0xc8\n\n#define XCMD   0xcd\n#define xRELE  0x07\n#define xIECV  0x08\n#define xIECL  0x09\n\n#define EOT    0xce\n#define TIE    0xcf\n\nconst struct PokemonCrySong gPokemonCrySongTemplate =\n{\n    1, // track count\n    0, // block count\n    255, // priority\n    0, // reverb\n    (struct ToneData *)&voicegroup000,\n    NULL,\n    NULL,\n    0,\n    TUNE, // part 0\n    C_V, // TUNE value\n    GOTO,\n    0, // GOTO target address\n    TUNE, // part 1\n    C_V + 16, // TUNE value\n    {VOICE, 0}, // part 0 jumps here with GOTO\n    VOL,\n    127, // volume\n    {XCMD, 0x0D},\n    0, // unk value\n    {XCMD, xRELE},\n    0, // release\n    PAN,\n    C_V, // PAN value\n    TIE,\n    60, // TIE key (default is Cn3)\n    127, // TIE velocity\n    {XCMD, 0x0C},\n    60, // unk value\n    {EOT, FINE} // end\n};\n\nconst XcmdFunc gXcmdTable[] =\n{\n    ply_xxx,\n    ply_xwave,\n    ply_xtype,\n    ply_xxx,\n    ply_xatta,\n    ply_xdeca,\n    ply_xsust,\n    ply_xrele,\n    ply_xiecv,\n    ply_xiecl,\n    ply_xleng,\n    ply_xswee,\n    ply_xcmd_0C,\n    ply_xcmd_0D,\n};\n"
  },
  {
    "path": "src/mail.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"scanline_effect.h\"\n#include \"palette.h\"\n#include \"text_window.h\"\n#include \"easy_chat.h\"\n#include \"mail.h\"\n#include \"task.h\"\n#include \"menu.h\"\n#include \"mail_data.h\"\n#include \"player_pc.h\"\n#include \"overworld.h\"\n#include \"help_system.h\"\n#include \"menu_helpers.h\"\n#include \"new_menu_helpers.h\"\n#include \"graphics.h\"\n#include \"pokemon_icon.h\"\n#include \"string_util.h\"\n#include \"strings.h\"\n#include \"constants/items.h\"\n\nenum MailIconParam\n{\n    MAIL_ICON_NONE = 0,\n    MAIL_ICON_BEAD,\n    MAIL_ICON_DREAM\n};\n\nstruct MailEcWordLayout\n{\n    u32 numWordsInLine:2;\n    u32 lineXoffset:6;\n    u32 lineHeight:8;\n};\n\nstruct MailAttrStruct\n{\n    u8 numRows;\n    u8 nameY;\n    u8 nameX;\n    u8 messageTop;\n    u8 messageLeft;\n    const struct MailEcWordLayout * linesLayout;\n};\n\nstruct MailGfxData\n{\n    const void *pal;\n    const void *tiles;\n    const void *map;\n    u32 size;\n    u16 textpals[2];\n};\n\nstruct MailViewResources {\n    u8 messageLinesBuffer[8][26];\n    u8 authorNameBuffer[12];\n    void (*savedCallback)(void);\n    void (*showMailCallback)(void);\n    struct Mail * mail;\n    bool8 messageExists;\n    u8 nameX;\n    u8 mailType;\n    u8 monIconType;\n    u8 monIconSpriteId;\n    u8 unused;\n    u8 mailArrangementType;\n    u8 *(*copyEasyChatWord)(u8 *dest, u16 word);\n    u8 *(*convertEasyChatWordsToString)(u8 *dest, const u16 *src, u16 length1, u16 length2);\n    const struct MailAttrStruct * messageLayout;\n    u16 bg1TilemapBuffer[BG_SCREEN_SIZE];\n    u16 bg2TilemapBuffer[BG_SCREEN_SIZE];\n};\n\nstatic EWRAM_DATA struct MailViewResources * sMailViewResources = NULL;\n\nstatic void CB2_InitMailView(void);\nstatic void BufferMailMessage(void);\nstatic void AddMailMessagePrinters(void);\nstatic void VBlankCB_ShowMail(void);\nstatic void CB2_RunShowMailCB(void);\nstatic void ShowMailCB_WaitFadeIn(void);\nstatic void ShowMailCB_WaitButton(void);\nstatic void ShowMailCB_Teardown(void);\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 4,\n        .width = 24,\n        .height = 10,\n        .paletteNum = 15,\n        .baseBlock = 0x001\n    }, {\n        .bg = 0,\n        .tilemapLeft = 15,\n        .tilemapTop = 15,\n        .width = 13,\n        .height = 3,\n        .paletteNum = 15,\n        .baseBlock = 0x0F2\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const u8 sTextColor[] = { 0, 10, 11 };\n\nstatic const u16 sGenderPals[][2] = {\n    { RGB(13, 22, 26), RGB(05, 13, 20) },\n    { RGB(28, 15, 17), RGB(20, 06, 14) }\n};\n\nstatic const struct MailGfxData sGfxHeaders[] = {\n    [ITEM_TO_MAIL(ITEM_ORANGE_MAIL)]  = {\n        .pal = gFile_graphics_mail_orange_palette_pal,\n        .tiles = gFile_graphics_mail_orange_tiles_sheet,\n        .map = gFile_graphics_mail_orange_map_tilemap,\n        .size = 0x2c0,\n        .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) }\n    },\n    [ITEM_TO_MAIL(ITEM_HARBOR_MAIL)]  = {\n        .pal = gFile_graphics_mail_harbor_palette_pal,\n        .tiles = gFile_graphics_mail_harbor_tiles_sheet,\n        .map = gFile_graphics_mail_harbor_map_tilemap,\n        .size = 0x2e0,\n        .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) }\n    },\n    [ITEM_TO_MAIL(ITEM_GLITTER_MAIL)] = {\n        .pal = gFile_graphics_mail_glitter_palette_pal,\n        .tiles = gFile_graphics_mail_glitter_tiles_sheet,\n        .map = gFile_graphics_mail_glitter_map_tilemap,\n        .size = 0x400,\n        .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) }\n    },\n    [ITEM_TO_MAIL(ITEM_MECH_MAIL)]    = {\n        .pal = gFile_graphics_mail_mech_palette_pal,\n        .tiles = gFile_graphics_mail_mech_tiles_sheet,\n        .map = gFile_graphics_mail_mech_map_tilemap,\n        .size = 0x1e0,\n        .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) }\n    },\n    [ITEM_TO_MAIL(ITEM_WOOD_MAIL)]    = {\n        .pal = gFile_graphics_mail_wood_palette_pal,\n        .tiles = gFile_graphics_mail_wood_tiles_sheet,\n        .map = gFile_graphics_mail_wood_map_tilemap,\n        .size = 0x2e0,\n        .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) }\n    },\n    [ITEM_TO_MAIL(ITEM_WAVE_MAIL)]    = {\n        .pal = gFile_graphics_mail_wave_palette_pal,\n        .tiles = gFile_graphics_mail_wave_tiles_sheet,\n        .map = gFile_graphics_mail_wave_map_tilemap,\n        .size = 0x300,\n        .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) }\n    },\n    [ITEM_TO_MAIL(ITEM_BEAD_MAIL)]    = {\n        .pal = gFile_graphics_mail_bead_palette_pal,\n        .tiles = gFile_graphics_mail_bead_tiles_sheet,\n        .map = gFile_graphics_mail_bead_map_tilemap,\n        .size = 0x140,\n        .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) }\n    },\n    [ITEM_TO_MAIL(ITEM_SHADOW_MAIL)]  = {\n        .pal = gFile_graphics_mail_shadow_palette_pal,\n        .tiles = gFile_graphics_mail_shadow_tiles_sheet,\n        .map = gFile_graphics_mail_shadow_map_tilemap,\n        .size = 0x300,\n        .textpals = { RGB(31, 31, 31), RGB(17, 17, 17) }\n    },\n    [ITEM_TO_MAIL(ITEM_TROPIC_MAIL)]  = {\n        .pal = gFile_graphics_mail_tropic_palette_pal,\n        .tiles = gFile_graphics_mail_tropic_tiles_sheet,\n        .map = gFile_graphics_mail_tropic_map_tilemap,\n        .size = 0x220,\n        .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) }\n    },\n    [ITEM_TO_MAIL(ITEM_DREAM_MAIL)]   = {\n        .pal = gFile_graphics_mail_dream_palette_pal,\n        .tiles = gFile_graphics_mail_dream_tiles_sheet,\n        .map = gFile_graphics_mail_dream_map_tilemap,\n        .size = 0x340,\n        .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) }\n    },\n    [ITEM_TO_MAIL(ITEM_FAB_MAIL)]     = {\n        .pal = gFile_graphics_mail_fab_palette_pal,\n        .tiles = gFile_graphics_mail_fab_tiles_sheet,\n        .map = gFile_graphics_mail_fab_map_tilemap,\n        .size = 0x2a0,\n        .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) }\n    },\n    [ITEM_TO_MAIL(ITEM_RETRO_MAIL)]   = {\n        .pal = gFile_graphics_mail_retro_palette_pal,\n        .tiles = gFile_graphics_mail_retro_tiles_sheet,\n        .map = gFile_graphics_mail_retro_map_tilemap,\n        .size = 0x520,\n        .textpals = { RGB(10, 10, 10), RGB(25, 25, 25) }\n    }\n};\n\nstatic const struct MailEcWordLayout sLayout_3x3[] = {\n    { .numWordsInLine = 3, .lineXoffset = 0, .lineHeight = 16 },\n    { .numWordsInLine = 3, .lineXoffset = 0, .lineHeight = 16 },\n    { .numWordsInLine = 3, .lineXoffset = 0, .lineHeight = 16 }\n};\n\nstatic const struct MailAttrStruct sMessageLayouts_3x3[] = {\n    [ITEM_TO_MAIL(ITEM_ORANGE_MAIL)]  = {\n    \t.numRows = 3,\n    \t.nameY = 0,\n    \t.nameX = 0,\n    \t.messageTop = 2,\n    \t.messageLeft = 4,\n    \t.linesLayout = sLayout_3x3\n    },\n    [ITEM_TO_MAIL(ITEM_HARBOR_MAIL)]  = {\n    \t.numRows = 3,\n    \t.nameY = 0,\n    \t.nameX = 0,\n    \t.messageTop = 2,\n    \t.messageLeft = 4,\n    \t.linesLayout = sLayout_3x3\n    },\n    [ITEM_TO_MAIL(ITEM_GLITTER_MAIL)] = {\n    \t.numRows = 3,\n    \t.nameY = 0,\n    \t.nameX = 0,\n    \t.messageTop = 2,\n    \t.messageLeft = 4,\n    \t.linesLayout = sLayout_3x3\n    },\n    [ITEM_TO_MAIL(ITEM_MECH_MAIL)]    = {\n    \t.numRows = 3,\n    \t.nameY = 0,\n    \t.nameX = 0,\n    \t.messageTop = 2,\n    \t.messageLeft = 4,\n    \t.linesLayout = sLayout_3x3\n    },\n    [ITEM_TO_MAIL(ITEM_WOOD_MAIL)]    = {\n    \t.numRows = 3,\n    \t.nameY = 0,\n    \t.nameX = 0,\n    \t.messageTop = 2,\n    \t.messageLeft = 4,\n    \t.linesLayout = sLayout_3x3\n    },\n    [ITEM_TO_MAIL(ITEM_WAVE_MAIL)]    = {\n    \t.numRows = 3,\n    \t.nameY = 0,\n    \t.nameX = 0,\n    \t.messageTop = 2,\n    \t.messageLeft = 4,\n    \t.linesLayout = sLayout_3x3\n    },\n    [ITEM_TO_MAIL(ITEM_BEAD_MAIL)]    = {\n    \t.numRows = 3,\n    \t.nameY = 0,\n    \t.nameX = 0,\n    \t.messageTop = 2,\n    \t.messageLeft = 4,\n    \t.linesLayout = sLayout_3x3\n    },\n    [ITEM_TO_MAIL(ITEM_SHADOW_MAIL)]  = {\n    \t.numRows = 3,\n    \t.nameY = 0,\n    \t.nameX = 0,\n    \t.messageTop = 2,\n    \t.messageLeft = 4,\n    \t.linesLayout = sLayout_3x3\n    },\n    [ITEM_TO_MAIL(ITEM_TROPIC_MAIL)]  = {\n    \t.numRows = 3,\n    \t.nameY = 0,\n    \t.nameX = 0,\n    \t.messageTop = 2,\n    \t.messageLeft = 4,\n    \t.linesLayout = sLayout_3x3\n    },\n    [ITEM_TO_MAIL(ITEM_DREAM_MAIL)]   = {\n    \t.numRows = 3,\n    \t.nameY = 0,\n    \t.nameX = 0,\n    \t.messageTop = 2,\n    \t.messageLeft = 4,\n    \t.linesLayout = sLayout_3x3\n    },\n    [ITEM_TO_MAIL(ITEM_FAB_MAIL)]     = {\n    \t.numRows = 3,\n    \t.nameY = 8,\n    \t.nameX = 0,\n    \t.messageTop = 2,\n    \t.messageLeft = 4,\n    \t.linesLayout = sLayout_3x3\n    },\n    [ITEM_TO_MAIL(ITEM_RETRO_MAIL)]   = {\n    \t.numRows = 3,\n    \t.nameY = 0,\n    \t.nameX = 0,\n    \t.messageTop = 2,\n    \t.messageLeft = 0,\n    \t.linesLayout = sLayout_3x3\n    },\n};\n\nstatic const struct MailEcWordLayout sLayout_5x2[] = {\n    { .numWordsInLine = 2, .lineXoffset = 0, .lineHeight = 16 },\n    { .numWordsInLine = 2, .lineXoffset = 0, .lineHeight = 16 },\n    { .numWordsInLine = 2, .lineXoffset = 0, .lineHeight = 16 },\n    { .numWordsInLine = 2, .lineXoffset = 0, .lineHeight = 16 },\n    { .numWordsInLine = 1, .lineXoffset = 0, .lineHeight = 16 }\n};\n\nstatic const struct MailAttrStruct sMessageLayouts_5x2[] = {\n    [ITEM_TO_MAIL(ITEM_ORANGE_MAIL)]  = {\n      \t.numRows = 5,\n      \t.nameY = 0,\n      \t.nameX = 8,\n      \t.messageTop = 3,\n      \t.messageLeft = 8,\n      \t.linesLayout = sLayout_5x2\n    },\n    [ITEM_TO_MAIL(ITEM_HARBOR_MAIL)]  = {\n      \t.numRows = 5,\n      \t.nameY = 3,\n      \t.nameX = 14,\n      \t.messageTop = 3,\n      \t.messageLeft = 8,\n      \t.linesLayout = sLayout_5x2\n    },\n    [ITEM_TO_MAIL(ITEM_GLITTER_MAIL)] = {\n      \t.numRows = 5,\n      \t.nameY = 0,\n      \t.nameX = 16,\n      \t.messageTop = 3,\n      \t.messageLeft = 8,\n      \t.linesLayout = sLayout_5x2\n    },\n    [ITEM_TO_MAIL(ITEM_MECH_MAIL)]    = {\n      \t.numRows = 5,\n      \t.nameY = 0,\n      \t.nameX = 14,\n      \t.messageTop = 3,\n      \t.messageLeft = 8,\n      \t.linesLayout = sLayout_5x2\n    },\n    [ITEM_TO_MAIL(ITEM_WOOD_MAIL)]    = {\n      \t.numRows = 5,\n      \t.nameY = 3,\n      \t.nameX = 12,\n      \t.messageTop = 3,\n      \t.messageLeft = 8,\n      \t.linesLayout = sLayout_5x2\n    },\n    [ITEM_TO_MAIL(ITEM_WAVE_MAIL)]    = {\n      \t.numRows = 5,\n      \t.nameY = 0,\n      \t.nameX = 18,\n      \t.messageTop = 3,\n      \t.messageLeft = 8,\n      \t.linesLayout = sLayout_5x2\n    },\n    [ITEM_TO_MAIL(ITEM_BEAD_MAIL)]    = {\n      \t.numRows = 5,\n      \t.nameY = 0,\n      \t.nameX = 20,\n      \t.messageTop = 3,\n      \t.messageLeft = 8,\n      \t.linesLayout = sLayout_5x2\n    },\n    [ITEM_TO_MAIL(ITEM_SHADOW_MAIL)]  = {\n      \t.numRows = 5,\n      \t.nameY = 6,\n      \t.nameX = 20,\n      \t.messageTop = 3,\n      \t.messageLeft = 8,\n      \t.linesLayout = sLayout_5x2\n    },\n    [ITEM_TO_MAIL(ITEM_TROPIC_MAIL)]  = {\n      \t.numRows = 5,\n      \t.nameY = 0,\n      \t.nameX = 16,\n      \t.messageTop = 3,\n      \t.messageLeft = 8,\n      \t.linesLayout = sLayout_5x2\n    },\n    [ITEM_TO_MAIL(ITEM_DREAM_MAIL)]   = {\n      \t.numRows = 5,\n      \t.nameY = 0,\n      \t.nameX = 14,\n      \t.messageTop = 3,\n      \t.messageLeft = 8,\n      \t.linesLayout = sLayout_5x2\n    },\n    [ITEM_TO_MAIL(ITEM_FAB_MAIL)]     = {\n      \t.numRows = 5,\n      \t.nameY = 8,\n      \t.nameX = 16,\n      \t.messageTop = 3,\n      \t.messageLeft = 8,\n      \t.linesLayout = sLayout_5x2\n    },\n    [ITEM_TO_MAIL(ITEM_RETRO_MAIL)]   = {\n      \t.numRows = 5,\n      \t.nameY = 0,\n      \t.nameX = 16,\n      \t.messageTop = 3,\n      \t.messageLeft = 8,\n      \t.linesLayout = sLayout_5x2\n    },\n};\n\nvoid ReadMail(struct Mail * mail, void (*savedCallback)(void), bool8 messageExists)\n{\n    u16 sp0;\n    u16 species;\n    sMailViewResources = AllocZeroed(sizeof(struct MailViewResources));\n    sMailViewResources->unused = 2;\n    sMailViewResources->mailArrangementType = 1;\n    sMailViewResources->copyEasyChatWord = CopyEasyChatWord;\n    sMailViewResources->convertEasyChatWordsToString = ConvertEasyChatWordsToString;\n    if (IS_ITEM_MAIL(mail->itemId))\n    {\n        sMailViewResources->mailType = ITEM_TO_MAIL(mail->itemId);\n    }\n    else\n    {\n        sMailViewResources->mailType = ITEM_TO_MAIL(ITEM_ORANGE_MAIL);\n        messageExists = FALSE;\n    }\n    switch (sMailViewResources->mailArrangementType)\n    {\n    case 0:\n    default:\n        sMailViewResources->messageLayout = &sMessageLayouts_3x3[sMailViewResources->mailType];\n        break;\n    case 1:\n        sMailViewResources->messageLayout = &sMessageLayouts_5x2[sMailViewResources->mailType];\n        break;\n    }\n    species = MailSpeciesToSpecies(mail->species, &sp0);\n    if (species != SPECIES_NONE && species < NUM_SPECIES)\n    {\n        switch (sMailViewResources->mailType)\n        {\n        default:\n            sMailViewResources->monIconType = MAIL_ICON_NONE;\n            break;\n        case ITEM_TO_MAIL(ITEM_BEAD_MAIL):\n            sMailViewResources->monIconType = MAIL_ICON_BEAD;\n            break;\n        case ITEM_TO_MAIL(ITEM_DREAM_MAIL):\n            sMailViewResources->monIconType = MAIL_ICON_DREAM;\n            break;\n        }\n    }\n    else\n    {\n        sMailViewResources->monIconType = MAIL_ICON_NONE;\n    }\n    sMailViewResources->mail = mail;\n    sMailViewResources->savedCallback = savedCallback;\n    sMailViewResources->messageExists = messageExists;\n    SetMainCallback2(CB2_InitMailView);\n}\n\nstatic bool8 DoInitMailView(void)\n{\n    u16 iconId;\n\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        ScanlineEffect_Stop();\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        if (gPlayerPcMenuManager.notInRoom == FALSE)\n            SetHelpContext(HELPCONTEXT_BEDROOM_PC_MAILBOX);\n        else\n            SetHelpContext(HELPCONTEXT_PLAYERS_PC_MAILBOX);\n        break;\n    case 1:\n        CpuFill16(0, (void *)OAM, OAM_SIZE);\n        break;\n    case 2:\n        ResetPaletteFade();\n        break;\n    case 3:\n        ResetTasks();\n        break;\n    case 4:\n        ResetSpriteData();\n        break;\n    case 5:\n        FreeAllSpritePalettes();\n        ResetTempTileDataBuffers();\n        SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG1VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG2HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG3HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG3VOFS, 0);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        break;\n    case 6:\n        ResetBgsAndClearDma3BusyFlags(FALSE);\n        InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));\n        SetBgTilemapBuffer(1, sMailViewResources->bg1TilemapBuffer);\n        SetBgTilemapBuffer(2, sMailViewResources->bg2TilemapBuffer);\n        break;\n    case 7:\n        InitWindows(sWindowTemplates);\n        DeactivateAllTextPrinters();\n        break;\n    case 8:\n        DecompressAndCopyTileDataToVram(1, sGfxHeaders[sMailViewResources->mailType].tiles, 0, 0x000, 0);\n        break;\n    case 9:\n        if (FreeTempTileDataBuffersIfPossible())\n            return FALSE;\n        break;\n    case 10:\n        FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);\n        FillBgTilemapBufferRect_Palette0(2, 0x001, 0, 0, 30, 20);\n        CopyToBgTilemapBuffer(1, sGfxHeaders[sMailViewResources->mailType].map, 0, 0x000);\n        break;\n    case 11:\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(2);\n        break;\n    case 12:\n        LoadPalette(GetTextWindowPalette(0), BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n        gPlttBufferUnfaded[BG_PLTT_ID(15) + 10] = sGfxHeaders[sMailViewResources->mailType].textpals[0];\n        gPlttBufferFaded[BG_PLTT_ID(15) + 10] = sGfxHeaders[sMailViewResources->mailType].textpals[0];\n        gPlttBufferUnfaded[BG_PLTT_ID(15) + 11] = sGfxHeaders[sMailViewResources->mailType].textpals[1];\n        gPlttBufferFaded[BG_PLTT_ID(15) + 11] = sGfxHeaders[sMailViewResources->mailType].textpals[1];\n\n        LoadPalette(sGfxHeaders[sMailViewResources->mailType].pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n        gPlttBufferUnfaded[BG_PLTT_ID(0) + 10] = sGenderPals[gSaveBlock2Ptr->playerGender][0];\n        gPlttBufferFaded[BG_PLTT_ID(0) + 10] = sGenderPals[gSaveBlock2Ptr->playerGender][0];\n        gPlttBufferUnfaded[BG_PLTT_ID(0) + 11] = sGenderPals[gSaveBlock2Ptr->playerGender][1];\n        gPlttBufferFaded[BG_PLTT_ID(0) + 11] = sGenderPals[gSaveBlock2Ptr->playerGender][1];\n        break;\n    case 13:\n        if (sMailViewResources->messageExists)\n            BufferMailMessage();\n        break;\n    case 14:\n        if (sMailViewResources->messageExists)\n        {\n            AddMailMessagePrinters();\n            RunTextPrinters();\n        }\n        break;\n    case 15:\n        if (Overworld_LinkRecvQueueLengthMoreThan2() == TRUE)\n            return FALSE;\n        break;\n    case 16:\n        SetVBlankCallback(VBlankCB_ShowMail);\n        gPaletteFade.bufferTransferDisabled = TRUE;\n        break;\n    case 17:\n        iconId = MailSpeciesToIconSpecies(sMailViewResources->mail->species);\n        switch (sMailViewResources->monIconType)\n        {\n        case MAIL_ICON_BEAD:\n            LoadMonIconPalette(iconId);\n            sMailViewResources->monIconSpriteId = CreateMonIcon_HandleDeoxys(iconId, SpriteCallbackDummy, 0x60, 0x80, 0, FALSE);\n            break;\n        case MAIL_ICON_DREAM:\n            LoadMonIconPalette(iconId);\n            sMailViewResources->monIconSpriteId = CreateMonIcon_HandleDeoxys(iconId, SpriteCallbackDummy, 0x28, 0x80, 0, FALSE);\n            break;\n        }\n        break;\n    case 18:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n        ShowBg(0);\n        ShowBg(1);\n        ShowBg(2);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        gPaletteFade.bufferTransferDisabled = FALSE;\n        sMailViewResources->showMailCallback = ShowMailCB_WaitFadeIn;\n        return TRUE;\n    default:\n        return FALSE;\n    }\n    gMain.state++;\n    return FALSE;\n}\n\nstatic void CB2_InitMailView(void)\n{\n    do\n    {\n        if (DoInitMailView() == TRUE)\n        {\n            SetMainCallback2(CB2_RunShowMailCB);\n            break;\n        }\n    } while (MenuHelpers_IsLinkActive() != TRUE);\n}\n\nstatic void BufferMailMessage(void)\n{\n    u32 i;\n    u8 j = 0;\n    for (i = 0; i < sMailViewResources->messageLayout->numRows; i++)\n    {\n        ConvertEasyChatWordsToString(sMailViewResources->messageLinesBuffer[i], &sMailViewResources->mail->words[j], sMailViewResources->messageLayout->linesLayout[i].numWordsInLine, 1);\n        j += sMailViewResources->messageLayout->linesLayout[i].numWordsInLine;\n    }\n    if (sMailViewResources->mailArrangementType == 0)\n    {\n        StringCopy(StringCopy(sMailViewResources->authorNameBuffer, sMailViewResources->mail->playerName), gText_From); // ???\n        sMailViewResources->nameX = sMailViewResources->messageLayout->nameX + 0x60 - 8 * StringLength(sMailViewResources->authorNameBuffer);\n    }\n    else\n    {\n        StringCopy(sMailViewResources->authorNameBuffer, sMailViewResources->mail->playerName);\n        if (StringLength(sMailViewResources->authorNameBuffer) < 6)\n            ConvertInternationalString(sMailViewResources->authorNameBuffer, LANGUAGE_JAPANESE);\n        sMailViewResources->nameX = sMailViewResources->messageLayout->nameX;\n    }\n}\n\nstatic void AddMailMessagePrinters(void)\n{\n    u8 y = 0;\n    u32 i;\n    u32 width;\n\n    PutWindowTilemap(0);\n    PutWindowTilemap(1);\n    FillWindowPixelBuffer(0, PIXEL_FILL(0));\n    FillWindowPixelBuffer(1, PIXEL_FILL(0));\n    for (i = 0; i < sMailViewResources->messageLayout->numRows; i++)\n    {\n        if (sMailViewResources->messageLinesBuffer[i][0] != EOS && sMailViewResources->messageLinesBuffer[i][0] != CHAR_SPACE)\n        {\n            AddTextPrinterParameterized3(0, FONT_NORMAL_COPY_1, sMailViewResources->messageLayout->linesLayout[i].lineXoffset + sMailViewResources->messageLayout->messageLeft, y + sMailViewResources->messageLayout->messageTop, sTextColor, 0, sMailViewResources->messageLinesBuffer[i]);\n            y += sMailViewResources->messageLayout->linesLayout[i].lineHeight;\n        }\n    }\n    width = GetStringWidth(FONT_NORMAL_COPY_1, gText_From, 0);\n    AddTextPrinterParameterized3(1, FONT_NORMAL_COPY_1, sMailViewResources->nameX, sMailViewResources->messageLayout->nameY, sTextColor, 0, gText_From);\n    AddTextPrinterParameterized3(1, FONT_NORMAL_COPY_1, sMailViewResources->nameX + width, sMailViewResources->messageLayout->nameY, sTextColor, 0, sMailViewResources->authorNameBuffer);\n    CopyWindowToVram(0, COPYWIN_FULL);\n    CopyWindowToVram(1, COPYWIN_FULL);\n}\n\nstatic void VBlankCB_ShowMail(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void CB2_RunShowMailCB(void)\n{\n    if (sMailViewResources->monIconType != MAIL_ICON_NONE)\n    {\n        AnimateSprites();\n        BuildOamBuffer();\n    }\n    sMailViewResources->showMailCallback();\n}\n\nstatic void ShowMailCB_WaitFadeIn(void)\n{\n    if (!UpdatePaletteFade())\n        sMailViewResources->showMailCallback = ShowMailCB_WaitButton;\n}\n\nstatic void ShowMailCB_WaitButton(void)\n{\n    if (JOY_NEW(A_BUTTON | B_BUTTON))\n    {\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sMailViewResources->showMailCallback = ShowMailCB_Teardown;\n    }\n}\n\nstatic void ShowMailCB_Teardown(void)\n{\n    if (!UpdatePaletteFade())\n    {\n        SetMainCallback2(sMailViewResources->savedCallback);\n        switch (sMailViewResources->monIconType)\n        {\n        case MAIL_ICON_BEAD:\n        case MAIL_ICON_DREAM:\n            FreeMonIconPalette(MailSpeciesToIconSpecies(sMailViewResources->mail->species));\n            DestroyMonIcon(&gSprites[sMailViewResources->monIconSpriteId]);\n            break;\n        }\n        *sMailViewResources = (struct MailViewResources){};\n        ResetPaletteFade();\n        FreeAllWindowBuffers();\n        FREE_AND_SET_NULL(sMailViewResources);\n    }\n}\n"
  },
  {
    "path": "src/mail_data.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"mail.h\"\n#include \"mail_data.h\"\n#include \"constants/items.h\"\n#include \"pokemon_icon.h\"\n\n#define UNOWN_OFFSET 30000\n\nvoid ClearMailData(void)\n{\n    u32 i;\n\n    for (i = 0; i < MAIL_COUNT; i++)\n        ClearMailStruct(&gSaveBlock1Ptr->mail[i]);\n}\n\nvoid ClearMailStruct(struct Mail *mail)\n{\n    s32 i;\n\n    for (i = 0; i < MAIL_WORDS_COUNT; i++)\n        mail->words[i] = 0xFFFF;\n    for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)\n        mail->playerName[i] = EOS;\n    for (i = 0; i < 4; i++)\n        mail->trainerId[i] = 0;\n    mail->species = SPECIES_BULBASAUR;\n    mail->itemId = ITEM_NONE;\n}\n\nbool8 MonHasMail(struct Pokemon *mon)\n{\n    u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM);\n    if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nu8 GiveMailToMon(struct Pokemon *mon, u16 itemId)\n{\n    u8 heldItem[2];\n    u8 id, i;\n    u16 species;\n    u32 personality;\n\n    heldItem[0] = itemId;\n    heldItem[1] = itemId >> 8;\n    for (id = 0; id < PARTY_SIZE; id++)\n    {\n        if (gSaveBlock1Ptr->mail[id].itemId == 0)\n        {\n            for (i = 0; i < MAIL_WORDS_COUNT; i++)\n                gSaveBlock1Ptr->mail[id].words[i] = 0xFFFF;\n            for (i = 0; i < PLAYER_NAME_LENGTH && gSaveBlock2Ptr->playerName[i] != EOS; i++)\n                gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i];\n            for (; i <= 5; i++)\n                gSaveBlock1Ptr->mail[id].playerName[i] = CHAR_SPACE;\n            gSaveBlock1Ptr->mail[id].playerName[i] = EOS;\n            for (i = 0; i < 4; i++)\n                gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];\n            species = GetBoxMonData(&mon->box, MON_DATA_SPECIES);\n            personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY);\n            gSaveBlock1Ptr->mail[id].species = SpeciesToMailSpecies(species, personality);\n            gSaveBlock1Ptr->mail[id].itemId = itemId;\n            SetMonData(mon, MON_DATA_MAIL, &id);\n            SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);\n            return id;\n        }\n    }\n    return 0xFF;\n}\n\nu16 SpeciesToMailSpecies(u16 species, u32 personality)\n{\n    if (species == SPECIES_UNOWN) {\n        u32 mailSpecies = GetUnownLetterByPersonality(personality) + UNOWN_OFFSET;\n        return mailSpecies;\n    }\n    return species;\n}\n\nu16 MailSpeciesToSpecies(u16 mailSpecies, u16 *unownLetter)\n{\n    u16 result;\n\n    if (mailSpecies >= UNOWN_OFFSET && mailSpecies < (UNOWN_OFFSET + NUM_UNOWN_FORMS))\n    {\n        result = SPECIES_UNOWN;\n        *unownLetter = mailSpecies - UNOWN_OFFSET;\n    }\n    else\n    {\n        result = mailSpecies;\n    }\n    return result;\n}\n\nu8 GiveMailToMon2(struct Pokemon *mon, struct Mail *mail)\n{\n    u8 heldItem[2];\n    u16 itemId = mail->itemId;\n    u8 mailId = GiveMailToMon(mon, itemId);\n\n    if (mailId == 0xFF)\n        return 0xFF;\n    gSaveBlock1Ptr->mail[mailId] = *mail;\n    SetMonData(mon, MON_DATA_MAIL, &mailId);\n    heldItem[0] = itemId;\n    heldItem[1] = itemId >> 8;\n\n    SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);\n\n    return mailId;\n}\n\nstatic bool32 DummyMailFunc(void)\n{\n    return FALSE;\n}\n\nvoid TakeMailFromMon(struct Pokemon *mon)\n{\n    u8 heldItem[2];\n    u8 mailId;\n\n    if (MonHasMail(mon))\n    {\n        mailId = GetMonData(mon, MON_DATA_MAIL);\n        gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE;\n        mailId = 0xFF;\n        heldItem[0] = ITEM_NONE;\n        heldItem[1] = ITEM_NONE << 8;\n        SetMonData(mon, MON_DATA_MAIL, &mailId);\n        SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);\n    }\n}\n\nvoid ClearMailItemId(u8 mailId)\n{\n    gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE;\n}\n\nu8 TakeMailFromMon2(struct Pokemon *mon)\n{\n    u8 i, newMailId;\n    u8 newHeldItem[2];\n\n    newHeldItem[0] = ITEM_NONE;\n    newHeldItem[1] = ITEM_NONE << 8;\n    newMailId = 0xFF;\n    for (i = PARTY_SIZE; i < MAIL_COUNT; i++)\n    {\n        if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE)\n        {\n            memcpy(&gSaveBlock1Ptr->mail[i], &gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct Mail));\n            gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)].itemId = ITEM_NONE;\n            SetMonData(mon, MON_DATA_MAIL, &newMailId);\n            SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem);\n            return i;\n        }\n    }\n    return 0xFF;\n}\n\nbool8 ItemIsMail(u16 itemId)\n{\n    switch (itemId)\n    {\n    case ITEM_ORANGE_MAIL:\n    case ITEM_HARBOR_MAIL:\n    case ITEM_GLITTER_MAIL:\n    case ITEM_MECH_MAIL:\n    case ITEM_WOOD_MAIL:\n    case ITEM_WAVE_MAIL:\n    case ITEM_BEAD_MAIL:\n    case ITEM_SHADOW_MAIL:\n    case ITEM_TROPIC_MAIL:\n    case ITEM_DREAM_MAIL:\n    case ITEM_FAB_MAIL:\n    case ITEM_RETRO_MAIL:\n        return TRUE;\n    default:\n        return FALSE;\n    }\n}\n"
  },
  {
    "path": "src/mailbox_pc.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"list_menu.h\"\n#include \"player_pc.h\"\n#include \"strings.h\"\n#include \"menu_indicators.h\"\n#include \"constants/songs.h\"\n\nstatic EWRAM_DATA u8 sWindowIds[3] = {};\nstatic EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL;\n\nstatic void MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list);\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 10,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x008\n    }, {\n        .bg = 0,\n        .tilemapLeft = 19,\n        .tilemapTop = 1,\n        .width = 10,\n        .height = 18,\n        .paletteNum = 15,\n        .baseBlock = 0x01c\n    }, {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 15,\n        .height = 8,\n        .paletteNum = 15,\n        .baseBlock = 0x01c\n    }\n};\n\nstatic const u8 sTextColor[3] = {1, 2, 3};\nstatic const u8 sString_Dummy[] = _(\"\");\n\nbool8 MailboxPC_InitBuffers(u8 num)\n{\n    u32 i;\n\n    sListMenuItems = Alloc(sizeof(struct ListMenuItem) * (num + 1));\n    if (sListMenuItems == NULL)\n        return FALSE;\n    for (i = 0; i < NELEMS(sWindowIds); i++)\n        sWindowIds[i] = 0xFF;\n    return TRUE;\n}\n\nu8 MailboxPC_GetAddWindow(u8 winIdx)\n{\n    if (sWindowIds[winIdx] == 0xFF)\n    {\n        sWindowIds[winIdx] = AddWindow(&sWindowTemplates[winIdx]);\n        SetStdWindowBorderStyle(sWindowIds[winIdx], 0);\n    }\n    return sWindowIds[winIdx];\n}\n\nvoid MailboxPC_RemoveWindow(u8 winIdx)\n{\n    ClearStdWindowAndFrameToTransparent(sWindowIds[winIdx], FALSE);\n    ClearWindowTilemap(sWindowIds[winIdx]);\n    RemoveWindow(sWindowIds[winIdx]);\n    sWindowIds[winIdx] = 0xFF;\n}\n\nu8 MailboxPC_GetWindowId(u8 winIdx)\n{\n    return sWindowIds[winIdx];\n}\n\nstatic void ItemPrintFunc(u8 windowId, u32 itemId, u8 y)\n{\n    u8 strbuf[30];\n    if (itemId != -2)\n    {\n        StringCopy(strbuf, gSaveBlock1Ptr->mail[itemId + PARTY_SIZE].playerName);\n        if (StringLength(strbuf) <= 5)\n            ConvertInternationalString(strbuf, LANGUAGE_JAPANESE);\n        AddTextPrinterParameterized4(windowId, FONT_NORMAL, 8, y, 0, 0, sTextColor, -1, strbuf);\n    }\n}\n\nu8 MailboxPC_InitListMenu(struct PlayerPCItemPageStruct * playerPcStruct)\n{\n    u32 i;\n    for (i = 0; i < playerPcStruct->count; i++)\n    {\n        sListMenuItems[i].label = sString_Dummy;\n        sListMenuItems[i].index = i;\n    }\n    sListMenuItems[i].label = gFameCheckerText_Cancel;\n    sListMenuItems[i].index = -2;\n\n    gMultiuseListMenuTemplate.items = sListMenuItems;\n    gMultiuseListMenuTemplate.totalItems = playerPcStruct->count + 1;\n    gMultiuseListMenuTemplate.windowId = sWindowIds[1];\n    gMultiuseListMenuTemplate.header_X = 0;\n    gMultiuseListMenuTemplate.item_X = GetMenuCursorDimensionByFont(FONT_NORMAL, 0);\n    gMultiuseListMenuTemplate.cursor_X = 0;\n    gMultiuseListMenuTemplate.lettersSpacing = 0;\n    gMultiuseListMenuTemplate.itemVerticalPadding = 2;\n    gMultiuseListMenuTemplate.maxShowed = 8;\n    gMultiuseListMenuTemplate.fontId = FONT_NORMAL;\n    gMultiuseListMenuTemplate.upText_Y = 10;\n    gMultiuseListMenuTemplate.cursorPal = 2;\n    gMultiuseListMenuTemplate.fillValue = 1;\n    gMultiuseListMenuTemplate.cursorShadowPal = 3;\n    gMultiuseListMenuTemplate.moveCursorFunc = MoveCursorFunc;\n    gMultiuseListMenuTemplate.itemPrintFunc = ItemPrintFunc;\n    gMultiuseListMenuTemplate.cursorKind = 0;\n    gMultiuseListMenuTemplate.scrollMultiple = 0;\n    return ListMenuInit(&gMultiuseListMenuTemplate, playerPcStruct->cursorPos, playerPcStruct->itemsAbove);\n}\n\nstatic void MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list)\n{\n    if (onInit != TRUE)\n        PlaySE(SE_SELECT);\n}\n\nvoid MailboxPC_AddScrollIndicatorArrows(struct PlayerPCItemPageStruct * playerPcStruct)\n{\n    playerPcStruct->scrollIndicatorId = AddScrollIndicatorArrowPairParameterized(2, 0xC2, 0xC, 0x94, playerPcStruct->count - playerPcStruct->pageItems + 1, 110, 110, &playerPcStruct->cursorPos);\n}\n\nvoid MailboxPC_DestroyListMenuBuffer(void)\n{\n    Free(sListMenuItems);\n}\n"
  },
  {
    "path": "src/main.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"load_save.h\"\n#include \"m4a.h\"\n#include \"random.h\"\n#include \"gba/flash_internal.h\"\n#include \"help_system.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"play_time.h\"\n#include \"intro.h\"\n#include \"battle_controllers.h\"\n#include \"scanline_effect.h\"\n#include \"save_failed_screen.h\"\n#include \"quest_log.h\"\n\nextern u32 intr_main[];\n\nstatic void VBlankIntr(void);\nstatic void HBlankIntr(void);\nstatic void VCountIntr(void);\nstatic void SerialIntr(void);\nstatic void IntrDummy(void);\n\nconst u8 gGameVersion = GAME_VERSION;\n\nconst u8 gGameLanguage = GAME_LANGUAGE;\n\n#if MODERN\nconst char BuildDateTime[] = __DATE__ \" \" __TIME__;\n#else\nconst char BuildDateTime[] = \"2004 04 26 11:20\";\n#endif //MODERN\n\nconst IntrFunc gIntrTableTemplate[] =\n{\n    VCountIntr, // V-count interrupt\n    SerialIntr, // Serial interrupt\n    Timer3Intr, // Timer 3 interrupt\n    HBlankIntr, // H-blank interrupt\n    VBlankIntr, // V-blank interrupt\n    IntrDummy,  // Timer 0 interrupt\n    IntrDummy,  // Timer 1 interrupt\n    IntrDummy,  // Timer 2 interrupt\n    IntrDummy,  // DMA 0 interrupt\n    IntrDummy,  // DMA 1 interrupt\n    IntrDummy,  // DMA 2 interrupt\n    IntrDummy,  // DMA 3 interrupt\n    IntrDummy,  // Key interrupt\n    IntrDummy,  // Game Pak interrupt\n};\n\n#define INTR_COUNT ((int)(sizeof(gIntrTableTemplate)/sizeof(IntrFunc)))\n\nu16 gKeyRepeatStartDelay;\nu8 gLinkTransferringData;\nstruct Main gMain;\nu16 gKeyRepeatContinueDelay;\nu8 gSoftResetDisabled;\nIntrFunc gIntrTable[INTR_COUNT];\nbool8 gLinkVSyncDisabled;\nu32 IntrMain_Buffer[0x200];\nu8 gPcmDmaCounter;\n\n// These variables are not defined in RS or Emerald, and are never read.\n// They were likely used to debug the audio engine and VCount interrupt.\nu8 sVcountAfterSound;\nu8 sVcountAtIntr;\nu8 sVcountBeforeSound;\n\nstatic IntrFunc * const sTimerIntrFunc = gIntrTable + 0x7;\n\nEWRAM_DATA u8 gDecompressionBuffer[0x4000] = {0};\nEWRAM_DATA u16 gTrainerId = 0;\n\nstatic void UpdateLinkAndCallCallbacks(void);\nstatic void InitMainCallbacks(void);\nstatic void CallCallbacks(void);\nstatic void ReadKeys(void);\nvoid InitIntrHandlers(void);\nstatic void WaitForVBlank(void);\nvoid EnableVCountIntrAtLine150(void);\n\n#define B_START_SELECT (B_BUTTON | START_BUTTON | SELECT_BUTTON)\n\nvoid AgbMain()\n{\n#if MODERN\n    // Modern compilers are liberal with the stack on entry to this function,\n    // so RegisterRamReset may crash if it resets IWRAM.\n    RegisterRamReset(RESET_ALL & ~RESET_IWRAM);\n    asm(\"mov\\tr1, #0xC0\\n\"\n        \"\\tlsl\\tr1, r1, #0x12\\n\"\n        \"\\tmov\\tr2, #0xFC\\n\"\n        \"\\tlsl\\tr2, r2, #0x7\\n\"\n        \"\\tadd\\tr2, r1, r2\\n\"\n        \"\\tmov\\tr0, #0\\n\"\n        \"\\tmov\\tr3, r0\\n\"\n        \"\\tmov\\tr4, r0\\n\"\n        \"\\tmov\\tr5, r0\\n\"\n        \".LCU%=:\\n\"\n        \"\\tstmia\\tr1!, {r0, r3, r4, r5}\\n\"\n        \"\\tstmia\\tr1!, {r0, r3, r4, r5}\\n\"\n        \"\\tstmia\\tr1!, {r0, r3, r4, r5}\\n\"\n        \"\\tstmia\\tr1!, {r0, r3, r4, r5}\\n\"\n        \"\\tstmia\\tr1!, {r0, r3, r4, r5}\\n\"\n        \"\\tstmia\\tr1!, {r0, r3, r4, r5}\\n\"\n        \"\\tstmia\\tr1!, {r0, r3, r4, r5}\\n\"\n        \"\\tstmia\\tr1!, {r0, r3, r4, r5}\\n\"\n        \"\\tcmp\\tr1, r2\\n\"\n        \"\\tbcc\\t.LCU%=\\n\"\n        :\n        :\n        : \"r0\", \"r1\", \"r2\", \"r3\", \"r4\", \"r5\", \"memory\"\n    );\n#else\n    RegisterRamReset(RESET_ALL);\n#endif //MODERN\n    *(vu16 *)BG_PLTT = RGB_WHITE;\n    InitGpuRegManager();\n    REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3;\n    InitKeys();\n    InitIntrHandlers();\n    m4aSoundInit();\n    EnableVCountIntrAtLine150();\n    InitRFU();\n    CheckForFlashMemory();\n    InitMainCallbacks();\n    InitMapMusic();\n    ClearDma3Requests();\n    ResetBgs();\n    InitHeap(gHeap, HEAP_SIZE);\n    SetDefaultFontsPointer();\n\n    gSoftResetDisabled = FALSE;\n    gHelpSystemEnabled = FALSE;\n\n    SetNotInSaveFailedScreen();\n\n#ifndef NDEBUG\n#if (LOG_HANDLER == LOG_HANDLER_MGBA_PRINT)\n    (void) MgbaOpen();\n#elif (LOG_HANDLER == LOG_HANDLER_AGB_PRINT)\n    AGBPrintInit();\n#endif\n#endif\n\n    if (gFlashMemoryPresent != TRUE)\n        SetMainCallback2(NULL);\n\n    gLinkTransferringData = FALSE;\n\n    for (;;)\n    {\n        ReadKeys();\n\n        if (gSoftResetDisabled == FALSE\n         && (gMain.heldKeysRaw & A_BUTTON)\n         && (gMain.heldKeysRaw & B_START_SELECT) == B_START_SELECT)\n        {\n            rfu_REQ_stopMode();\n            rfu_waitREQComplete();\n            DoSoftReset();\n        }\n\n        if (Overworld_SendKeysToLinkIsRunning() == TRUE)\n        {\n            gLinkTransferringData = TRUE;\n            UpdateLinkAndCallCallbacks();\n            gLinkTransferringData = FALSE;\n        }\n        else\n        {\n            gLinkTransferringData = FALSE;\n            UpdateLinkAndCallCallbacks();\n\n            if (Overworld_RecvKeysFromLinkIsRunning() == 1)\n            {\n                gMain.newKeys = 0;\n                ClearSpriteCopyRequests();\n                gLinkTransferringData = TRUE;\n                UpdateLinkAndCallCallbacks();\n                gLinkTransferringData = FALSE;\n            }\n        }\n\n        PlayTimeCounter_Update();\n        MapMusicMain();\n        WaitForVBlank();\n    }\n}\n\nstatic void UpdateLinkAndCallCallbacks(void)\n{\n    if (!HandleLinkConnection())\n        CallCallbacks();\n}\n\nstatic void InitMainCallbacks(void)\n{\n    gMain.vblankCounter1 = 0;\n    gMain.vblankCounter2 = 0;\n    gMain.callback1 = NULL;\n    SetMainCallback2(CB2_InitCopyrightScreenAfterBootup);\n    gSaveBlock2Ptr = &gSaveBlock2;\n    gSaveBlock1Ptr = &gSaveBlock1;\n    gSaveBlock2.encryptionKey = 0;\n    gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n}\n\nstatic void CallCallbacks(void)\n{\n    if (!RunSaveFailedScreen() && !RunHelpSystemCallback())\n    {\n        if (gMain.callback1)\n            gMain.callback1();\n\n        if (gMain.callback2)\n            gMain.callback2();\n    }\n}\n\nvoid SetMainCallback2(MainCallback callback)\n{\n    gMain.callback2 = callback;\n    gMain.state = 0;\n}\n\nvoid StartTimer1(void)\n{\n    REG_TM1CNT_H = 0x80;\n}\n\nvoid SeedRngAndSetTrainerId(void)\n{\n    u16 val = REG_TM1CNT_L;\n    SeedRng(val);\n    REG_TM1CNT_H = 0;\n    gTrainerId = val;\n}\n\nu16 GetGeneratedTrainerIdLower(void)\n{\n    return gTrainerId;\n}\n\nvoid EnableVCountIntrAtLine150(void)\n{\n    u16 gpuReg = (GetGpuReg(REG_OFFSET_DISPSTAT) & 0xFF) | (150 << 8);\n    SetGpuReg(REG_OFFSET_DISPSTAT, gpuReg | DISPSTAT_VCOUNT_INTR);\n    EnableInterrupts(INTR_FLAG_VCOUNT);\n}\n\nvoid InitKeys(void)\n{\n    gKeyRepeatContinueDelay = 5;\n    gKeyRepeatStartDelay = 40;\n\n    gMain.heldKeys = 0;\n    gMain.newKeys = 0;\n    gMain.newAndRepeatedKeys = 0;\n    gMain.heldKeysRaw = 0;\n    gMain.newKeysRaw = 0;\n}\n\nstatic void ReadKeys(void)\n{\n    u16 keyInput = REG_KEYINPUT ^ KEYS_MASK;\n    gMain.newKeysRaw = keyInput & ~gMain.heldKeysRaw;\n    gMain.newKeys = gMain.newKeysRaw;\n    gMain.newAndRepeatedKeys = gMain.newKeysRaw;\n\n    // BUG: Key repeat won't work when pressing L using L=A button mode\n    // because it compares the raw key input with the remapped held keys.\n    // Note that newAndRepeatedKeys is never remapped either.\n\n    if (keyInput != 0 && gMain.heldKeys == keyInput)\n    {\n        gMain.keyRepeatCounter--;\n\n        if (gMain.keyRepeatCounter == 0)\n        {\n            gMain.newAndRepeatedKeys = keyInput;\n            gMain.keyRepeatCounter = gKeyRepeatContinueDelay;\n        }\n    }\n    else\n    {\n        // If there is no input or the input has changed, reset the counter.\n        gMain.keyRepeatCounter = gKeyRepeatStartDelay;\n    }\n\n    gMain.heldKeysRaw = keyInput;\n    gMain.heldKeys = gMain.heldKeysRaw;\n\n    // Remap L to A if the L=A option is enabled.\n    if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A)\n    {\n        if (JOY_NEW(L_BUTTON))\n            gMain.newKeys |= A_BUTTON;\n\n        if (JOY_HELD(L_BUTTON))\n            gMain.heldKeys |= A_BUTTON;\n    }\n\n    if (JOY_NEW(gMain.watchedKeysMask))\n        gMain.watchedKeysPressed = TRUE;\n}\n\nvoid InitIntrHandlers(void)\n{\n    int i;\n\n    for (i = 0; i < INTR_COUNT; i++)\n        gIntrTable[i] = gIntrTableTemplate[i];\n\n    DmaCopy32(3, intr_main, IntrMain_Buffer, sizeof(IntrMain_Buffer));\n\n    INTR_VECTOR = IntrMain_Buffer;\n\n    SetVBlankCallback(NULL);\n    SetHBlankCallback(NULL);\n    SetSerialCallback(NULL);\n\n    REG_IME = 1;\n\n    EnableInterrupts(INTR_FLAG_VBLANK);\n}\n\nvoid SetVBlankCallback(IntrCallback callback)\n{\n    gMain.vblankCallback = callback;\n}\n\nvoid SetHBlankCallback(IntrCallback callback)\n{\n    gMain.hblankCallback = callback;\n}\n\nvoid SetVCountCallback(IntrCallback callback)\n{\n    gMain.vcountCallback = callback;\n}\n\nvoid SetSerialCallback(IntrCallback callback)\n{\n    gMain.serialCallback = callback;\n}\n\nextern void CopyBufferedValuesToGpuRegs(void);\nextern void ProcessDma3Requests(void);\n\nstatic void VBlankIntr(void)\n{\n    if (gWirelessCommType)\n        RfuVSync();\n    else if (!gLinkVSyncDisabled)\n        LinkVSync();\n\n    if (gMain.vblankCounter1)\n        (*gMain.vblankCounter1)++;\n\n    if (gMain.vblankCallback)\n        gMain.vblankCallback();\n\n    gMain.vblankCounter2++;\n\n    CopyBufferedValuesToGpuRegs();\n    ProcessDma3Requests();\n\n    gPcmDmaCounter = gSoundInfo.pcmDmaCounter;\n\n#ifndef NDEBUG\n    sVcountBeforeSound = REG_VCOUNT;\n#endif\n    m4aSoundMain();\n#ifndef NDEBUG\n    sVcountAfterSound = REG_VCOUNT;\n#endif\n\n    TryReceiveLinkBattleData();\n    Random();\n    UpdateWirelessStatusIndicatorSprite();\n\n    INTR_CHECK |= INTR_FLAG_VBLANK;\n    gMain.intrCheck |= INTR_FLAG_VBLANK;\n}\n\nvoid InitFlashTimer(void)\n{\n    IntrFunc **func = (IntrFunc **)&sTimerIntrFunc;\n    SetFlashTimerIntr(2, *func);\n}\n\nstatic void HBlankIntr(void)\n{\n    if (gMain.hblankCallback)\n        gMain.hblankCallback();\n\n    INTR_CHECK |= INTR_FLAG_HBLANK;\n    gMain.intrCheck |= INTR_FLAG_HBLANK;\n}\n\nstatic void VCountIntr(void)\n{\n#ifndef NDEBUG\n    sVcountAtIntr = REG_VCOUNT;\n#endif\n    m4aSoundVSync();\n    INTR_CHECK |= INTR_FLAG_VCOUNT;\n    gMain.intrCheck |= INTR_FLAG_VCOUNT;\n}\n\nstatic void SerialIntr(void)\n{\n    if (gMain.serialCallback)\n        gMain.serialCallback();\n\n    INTR_CHECK |= INTR_FLAG_SERIAL;\n    gMain.intrCheck |= INTR_FLAG_SERIAL;\n}\n\nvoid RestoreSerialTimer3IntrHandlers(void)\n{\n    gIntrTable[1] = SerialIntr;\n    gIntrTable[2] = Timer3Intr;\n}\n\nstatic void IntrDummy(void)\n{}\n\nstatic void WaitForVBlank(void)\n{\n    gMain.intrCheck &= ~INTR_FLAG_VBLANK;\n    if(!gWirelessCommType)\n    {\n        asm(\"swi 0x5\");\n        return;\n    }\n    while (!(gMain.intrCheck & INTR_FLAG_VBLANK))\n        ;\n}\n\nvoid SetVBlankCounter1Ptr(u32 *ptr)\n{\n    gMain.vblankCounter1 = ptr;\n}\n\nvoid DisableVBlankCounter1(void)\n{\n    gMain.vblankCounter1 = NULL;\n}\n\nvoid DoSoftReset(void)\n{\n    REG_IME = 0;\n    m4aSoundVSyncOff();\n    ScanlineEffect_Stop();\n    DmaStop(1);\n    DmaStop(2);\n    DmaStop(3);\n    SoftReset(RESET_ALL & ~RESET_SIO_REGS);\n}\n\nvoid ClearPokemonCrySongs(void)\n{\n    CpuFill16(0, gPokemonCrySongs, MAX_POKEMON_CRIES * sizeof(struct PokemonCrySong));\n}\n"
  },
  {
    "path": "src/main_menu.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"scanline_effect.h\"\n#include \"task.h\"\n#include \"save.h\"\n#include \"event_data.h\"\n#include \"menu.h\"\n#include \"link.h\"\n#include \"oak_speech.h\"\n#include \"overworld.h\"\n#include \"quest_log.h\"\n#include \"mystery_gift_menu.h\"\n#include \"strings.h\"\n#include \"title_screen.h\"\n#include \"help_system.h\"\n#include \"pokedex.h\"\n#include \"text_window.h\"\n#include \"text_window_graphics.h\"\n#include \"constants/songs.h\"\n\nenum MainMenuType\n{\n    MAIN_MENU_NEWGAME = 0,\n    MAIN_MENU_CONTINUE,\n    MAIN_MENU_MYSTERYGIFT,\n    MAIN_MENU_KEYSYSTEM\n};\n\nenum MainMenuWindow\n{\n    MAIN_MENU_WINDOW_NEWGAME_ONLY = 0,\n    MAIN_MENU_WINDOW_CONTINUE,\n    MAIN_MENU_WINDOW_NEWGAME,\n    MAIN_MENU_WINDOW_MYSTERYGIFT,\n    MAIN_MENU_WINDOW_KEYSYSTEM,\n    MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED,\n    MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY,\n    MAIN_MENU_WINDOW_ERROR,\n    MAIN_MENU_WINDOW_FRLG_CHOICE,\n    MAIN_MENU_WINDOW_COUNT\n};\n\n#define tMenuType  data[0]\n#define tCursorPos data[1]\n\n#define tUnused8         data[8]\n#define tMGErrorMsgState data[9]\n#define tMGErrorType     data[10]\n\nextern void CB2_KeySystemMenuFromContinueScreen(void);\n\nstatic bool32 MainMenuGpuInit(u8 a0);\nstatic void Task_SetWin0BldRegsAndCheckSaveFile(u8 taskId);\nstatic void PrintSaveErrorStatus(u8 taskId, const u8 *str);\nstatic void Task_SaveErrorStatus_RunPrinterThenWaitButton(u8 taskId);\nstatic void Task_SetWin0BldRegsNoSaveFileCheck(u8 taskId);\nstatic void Task_WaitFadeAndPrintMainMenuText(u8 taskId);\nstatic void Task_PrintMainMenuText(u8 taskId);\nstatic void Task_WaitDma3AndFadeIn(u8 taskId);\nstatic void Task_UpdateVisualSelection(u8 taskId);\nstatic void Task_HandleMenuInput(u8 taskId);\nstatic void Task_ExecuteMainMenuSelection(u8 taskId);\nstatic void Task_MysteryGiftError(u8 taskId);\nstatic void Task_ReturnToTileScreen(u8 taskId);\nstatic void MoveWindowByMenuTypeAndCursorPos(u8 menuType, u8 cursorPos);\nstatic bool8 HandleMenuInput(u8 taskId);\nstatic void PrintMessageOnWindow4(const u8 *str);\nstatic void PrintContinueStats(void);\nstatic void PrintPlayerName(void);\nstatic void PrintPlayTime(void);\nstatic void PrintDexCount(void);\nstatic void PrintBadgeCount(void);\nstatic void LoadUserFrameToBg(u8 bgId);\nstatic void SetStdFrame0OnBg(u8 bgId);\nstatic void MainMenu_DrawWindow(const struct WindowTemplate * template);\nstatic void MainMenu_EraseWindow(const struct WindowTemplate * template);\nstatic void Task_DoFireredOrLeafgreenMultichoice(u8 taskId);\nstatic void Task_ChooseVersionOnNewGame(u8 taskId);\nstatic void Task_StartNewGame(u8 taskId);\nstatic void CreateFRLGChoiceMenu(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos);\nstatic void MainMenu_DrawWindow_WindowFunction(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);\nstatic void DrawFRLGChoiceFrame(u8 windowId, bool8 copyToVram, u16 baseTileNum, u8 paletteNum);\n\n\nstatic const u8 sString_Dummy[] = _(\"\");\nstatic const u8 sString_Newline[] = _(\"\\n\");\n\nstatic const struct WindowTemplate sWindowTemplate[] = {\n    [MAIN_MENU_WINDOW_NEWGAME_ONLY] = {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 1,\n        .width = 24,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x001\n    }, \n    [MAIN_MENU_WINDOW_CONTINUE] = {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 1,\n        .width = 24,\n        .height = 6,\n        .paletteNum = 15,\n        .baseBlock = 0x001\n    }, \n    [MAIN_MENU_WINDOW_NEWGAME] = {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 9,\n        .width = 24,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x091\n    }, \n    [MAIN_MENU_WINDOW_MYSTERYGIFT] = {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 13,\n        .width = 24,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x0C1\n    }, \n    [MAIN_MENU_WINDOW_KEYSYSTEM] = {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 13,\n        .width = 24,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x0C1\n    },\n    [MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED] = {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 17,\n        .width = 24,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0xF1\n    },\n    [MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY] = {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 5,\n        .width = 24,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x31\n    }, \n    [MAIN_MENU_WINDOW_ERROR] = {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 15,\n        .width = 24,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x001\n    }, \n    [MAIN_MENU_WINDOW_FRLG_CHOICE] = {\n        .bg = 0x00,\n        .tilemapLeft = 0x13,\n        .tilemapTop = 0x0f,\n        .width = 0x08,\n        .height = 0x04,\n        .paletteNum = 2,\n        .baseBlock = 0x0155\n    },\n    [MAIN_MENU_WINDOW_COUNT] = DUMMY_WIN_TEMPLATE\n};\n\nstatic const u16 sBg_Pal[] = INCBIN_U16(\"graphics/main_menu/bg.gbapal\");\nstatic const u16 sTextbox_Pal[] = INCBIN_U16(\"graphics/main_menu/textbox.gbapal\");\n\nstatic const u8 sTextColor1[] = { 10, 11, 12 };\n\nstatic const u8 sTextColor2[] = { 10,  1, 12 };\n\nstatic const struct BgTemplate sBgTemplate[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .priority = 0\n    }\n};\n\nstatic const u8 sMenuCursorYMax[] = { 1, 2, 3 };\n\nstatic void CB2_MainMenu(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB_MainMenu(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid CB2_InitMainMenu(void)\n{\n    MainMenuGpuInit(1);\n}\n\nstatic void CB2_InitMainMenu_2(void)\n{\n    MainMenuGpuInit(1);\n}\n\nstatic bool32 MainMenuGpuInit(u8 a0)\n{\n    u8 taskId;\n\n    SetVBlankCallback(NULL);\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    SetGpuReg(REG_OFFSET_BG2CNT, 0);\n    SetGpuReg(REG_OFFSET_BG1CNT, 0);\n    SetGpuReg(REG_OFFSET_BG0CNT, 0);\n    SetGpuReg(REG_OFFSET_BG2HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n    DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);\n    DmaFill32(3, 0, (void *)OAM, OAM_SIZE);\n    DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);\n    ScanlineEffect_Stop();\n    ResetTasks();\n    ResetSpriteData();\n    FreeAllSpritePalettes();\n    ResetPaletteFade();\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sBgTemplate, NELEMS(sBgTemplate));\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    InitWindows(sWindowTemplate);\n    DeactivateAllTextPrinters();\n    LoadPalette(sBg_Pal, BG_PLTT_ID(0), sizeof(sBg_Pal));\n    LoadPalette(sTextbox_Pal, BG_PLTT_ID(15), sizeof(sTextbox_Pal));\n    SetGpuReg(REG_OFFSET_WIN0H, 0);\n    SetGpuReg(REG_OFFSET_WIN0V, 0);\n    SetGpuReg(REG_OFFSET_WININ, 0);\n    SetGpuReg(REG_OFFSET_WINOUT, 0);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    SetMainCallback2(CB2_MainMenu);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON);\n    taskId = CreateTask(Task_SetWin0BldRegsAndCheckSaveFile, 0);\n    gTasks[taskId].tCursorPos = 0;\n    gTasks[taskId].tUnused8 = 0;\n    return FALSE;\n}\n\n/*\n * The entire screen is darkened slightly except at WIN0 to indicate\n * the player cursor position.\n */\n\nstatic void Task_SetWin0BldRegsAndCheckSaveFile(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        SetGpuReg(REG_OFFSET_WIN0H, 0);\n        SetGpuReg(REG_OFFSET_WIN0V, 0);\n        SetGpuReg(REG_OFFSET_WININ, 0x0001);\n        SetGpuReg(REG_OFFSET_WINOUT, 0x0021);\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));\n        SetGpuReg(REG_OFFSET_BLDY, 7);\n        switch (gSaveFileStatus)\n        {\n        case SAVE_STATUS_OK:\n            LoadUserFrameToBg(0);\n            if (IsMysteryGiftEnabled() == TRUE)\n            {\n                gTasks[taskId].tMenuType = MAIN_MENU_MYSTERYGIFT;\n            }\n            else\n            {\n                gTasks[taskId].tMenuType = MAIN_MENU_CONTINUE;\n            }\n            gTasks[taskId].func = Task_SetWin0BldRegsNoSaveFileCheck;\n            break;\n        case SAVE_STATUS_INVALID:\n            SetStdFrame0OnBg(0);\n            gTasks[taskId].tMenuType = MAIN_MENU_NEWGAME;\n            PrintSaveErrorStatus(taskId, gText_SaveFileHasBeenDeleted);\n            break;\n        case SAVE_STATUS_ERROR:\n            SetStdFrame0OnBg(0);\n            gTasks[taskId].tMenuType = MAIN_MENU_CONTINUE;\n            PrintSaveErrorStatus(taskId, gText_SaveFileCorrupted);\n            if (IsMysteryGiftEnabled() == TRUE)\n            {\n                gTasks[taskId].tMenuType = MAIN_MENU_MYSTERYGIFT;\n            }\n            else\n            {\n                gTasks[taskId].tMenuType = MAIN_MENU_CONTINUE;\n            }\n            break;\n        case SAVE_STATUS_EMPTY:\n            SetStdFrame0OnBg(0);\n            gTasks[taskId].tMenuType = MAIN_MENU_NEWGAME;\n            gTasks[taskId].tUnused8 = 3;\n            PrintSaveErrorStatus(taskId, gChooseVersionNewGame);\n            break;\n        default:\n            LoadUserFrameToBg(0);\n            gTasks[taskId].tMenuType = MAIN_MENU_NEWGAME;\n            gTasks[taskId].func = Task_SetWin0BldRegsNoSaveFileCheck;\n            break;\n        case SAVE_STATUS_NO_FLASH:\n            SetStdFrame0OnBg(0);\n            gTasks[taskId].tMenuType = MAIN_MENU_NEWGAME;\n            PrintSaveErrorStatus(taskId, gText_1MSubCircuitBoardNotInstalled);\n            break;\n        }\n    }\n}\n\nstatic void PrintSaveErrorStatus(u8 taskId, const u8 *str)\n{\n    PrintMessageOnWindow4(str);\n    gTasks[taskId].func = Task_SaveErrorStatus_RunPrinterThenWaitButton;\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0xFFFF);\n    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240));\n    SetGpuReg(REG_OFFSET_WIN0V, ((0x0 << 8) + (2 << 8)) | ((0xA0) - 2));\n    ShowBg(0);\n    SetVBlankCallback(VBlankCB_MainMenu);\n}\n\nstatic void Task_SaveErrorStatus_RunPrinterThenWaitButton(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        RunTextPrinters();\n        if(gTasks[taskId].tUnused8 == 3)\n        {\n            if(!IsTextPrinterActive(MAIN_MENU_WINDOW_ERROR))\n            {\n                gTasks[taskId].func = Task_DoFireredOrLeafgreenMultichoice;\n            }\n        }\n        else\n        {\n            if (!IsTextPrinterActive(MAIN_MENU_WINDOW_ERROR) && JOY_NEW(A_BUTTON))\n            {\n                ClearWindowTilemap(MAIN_MENU_WINDOW_ERROR);\n                MainMenu_EraseWindow(&sWindowTemplate[MAIN_MENU_WINDOW_ERROR]);\n                LoadUserFrameToBg(0);\n\n                if (gTasks[taskId].tMenuType == MAIN_MENU_NEWGAME)\n                    gTasks[taskId].func = Task_SetWin0BldRegsNoSaveFileCheck;\n                else\n                    gTasks[taskId].func = Task_PrintMainMenuText;\n            }\n        }\n    }\n}\n\nstatic void Task_SetWin0BldRegsNoSaveFileCheck(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        SetGpuReg(REG_OFFSET_WIN0H, 0);\n        SetGpuReg(REG_OFFSET_WIN0V, 0);\n        SetGpuReg(REG_OFFSET_WININ, 0x0001);\n        SetGpuReg(REG_OFFSET_WINOUT, 0x0021);\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));\n        SetGpuReg(REG_OFFSET_BLDY, 7);\n        if (gTasks[taskId].tMenuType == MAIN_MENU_NEWGAME)\n            gTasks[taskId].func = Task_ExecuteMainMenuSelection;\n        else\n            gTasks[taskId].func = Task_WaitFadeAndPrintMainMenuText;\n    }\n}\n\nstatic void Task_WaitFadeAndPrintMainMenuText(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        Task_PrintMainMenuText(taskId);\n    }\n}\n\nstatic void Task_PrintMainMenuText(u8 taskId)\n{\n    u16 pal;\n    SetGpuReg(REG_OFFSET_WIN0H, 0);\n    SetGpuReg(REG_OFFSET_WIN0V, 0);\n    SetGpuReg(REG_OFFSET_WININ, 0x0001);\n    SetGpuReg(REG_OFFSET_WINOUT, 0x0021);\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));\n    SetGpuReg(REG_OFFSET_BLDY, 7);\n    if (gSaveBlock2Ptr->playerGender == MALE)\n        pal = RGB(4, 16, 31);\n    else\n        pal = RGB(31, 3, 21);\n    LoadPalette(&pal, BG_PLTT_ID(15) + 1, PLTT_SIZEOF(1));\n    switch (gTasks[taskId].tMenuType)\n    {\n    case MAIN_MENU_NEWGAME:\n    default:\n        FillWindowPixelBuffer(MAIN_MENU_WINDOW_NEWGAME_ONLY, PIXEL_FILL(10));\n        FillWindowPixelBuffer(MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY, PIXEL_FILL(10));\n        AddTextPrinterParameterized3(MAIN_MENU_WINDOW_NEWGAME_ONLY, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_NewGame);\n        AddTextPrinterParameterized3(MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_KeySystemSettings);\n        MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_NEWGAME_ONLY]);\n        MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY]);\n        PutWindowTilemap(MAIN_MENU_WINDOW_NEWGAME_ONLY);\n        PutWindowTilemap(MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY);\n        CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME_ONLY, COPYWIN_GFX);\n        CopyWindowToVram(MAIN_MENU_WINDOW_KEYSYSTEM_NEWGAME_ONLY, COPYWIN_FULL);\n        break;\n    case MAIN_MENU_CONTINUE:\n        FillWindowPixelBuffer(MAIN_MENU_WINDOW_CONTINUE, PIXEL_FILL(10));\n        FillWindowPixelBuffer(MAIN_MENU_WINDOW_NEWGAME, PIXEL_FILL(10));\n        FillWindowPixelBuffer(MAIN_MENU_WINDOW_KEYSYSTEM, PIXEL_FILL(10));\n        AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_Continue);\n        AddTextPrinterParameterized3(MAIN_MENU_WINDOW_NEWGAME, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_NewGame);\n        AddTextPrinterParameterized3(MAIN_MENU_WINDOW_KEYSYSTEM, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_KeySystemSettings);\n        PrintContinueStats();\n        MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_CONTINUE]);\n        MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_NEWGAME]);\n        MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_KEYSYSTEM]);\n        PutWindowTilemap(MAIN_MENU_WINDOW_CONTINUE);\n        PutWindowTilemap(MAIN_MENU_WINDOW_NEWGAME);\n        PutWindowTilemap(MAIN_MENU_WINDOW_KEYSYSTEM);\n        CopyWindowToVram(MAIN_MENU_WINDOW_CONTINUE, COPYWIN_GFX);\n        CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME, COPYWIN_GFX);\n        CopyWindowToVram(MAIN_MENU_WINDOW_KEYSYSTEM, COPYWIN_FULL);\n        break;\n    case MAIN_MENU_MYSTERYGIFT:\n        FillWindowPixelBuffer(MAIN_MENU_WINDOW_CONTINUE, PIXEL_FILL(10));\n        FillWindowPixelBuffer(MAIN_MENU_WINDOW_NEWGAME, PIXEL_FILL(10));\n        FillWindowPixelBuffer(MAIN_MENU_WINDOW_MYSTERYGIFT, PIXEL_FILL(10));\n        FillWindowPixelBuffer(MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED, PIXEL_FILL(10));\n        AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_Continue);\n        AddTextPrinterParameterized3(MAIN_MENU_WINDOW_NEWGAME, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_NewGame);\n        gTasks[taskId].tMGErrorType = 1;\n        AddTextPrinterParameterized3(MAIN_MENU_WINDOW_MYSTERYGIFT, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_MysteryGift);\n        AddTextPrinterParameterized3(MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED, FONT_NORMAL, 2, 2, sTextColor1, -1, gText_KeySystemSettings);\n        PrintContinueStats();\n        MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_CONTINUE]);\n        MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_NEWGAME]);\n        MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_MYSTERYGIFT]);\n        MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED]);\n        PutWindowTilemap(MAIN_MENU_WINDOW_CONTINUE);\n        PutWindowTilemap(MAIN_MENU_WINDOW_NEWGAME);\n        PutWindowTilemap(MAIN_MENU_WINDOW_MYSTERYGIFT);\n        PutWindowTilemap(MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED);\n        CopyWindowToVram(MAIN_MENU_WINDOW_CONTINUE, COPYWIN_GFX);\n        CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME, COPYWIN_GFX);\n        CopyWindowToVram(MAIN_MENU_WINDOW_MYSTERYGIFT, COPYWIN_GFX);\n        CopyWindowToVram(MAIN_MENU_WINDOW_KEYSYSTEM_MYSTERYGIFT_ENABLED, COPYWIN_FULL);\n        break;\n    }\n    gTasks[taskId].func = Task_WaitDma3AndFadeIn;\n}\n\nstatic void Task_WaitDma3AndFadeIn(u8 taskId)\n{\n    if (WaitDma3Request(-1) != -1)\n    {\n        gTasks[taskId].func = Task_UpdateVisualSelection;\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0xFFFF);\n        ShowBg(0);\n        SetVBlankCallback(VBlankCB_MainMenu);\n    }\n}\n\nstatic void Task_UpdateVisualSelection(u8 taskId)\n{\n    MoveWindowByMenuTypeAndCursorPos(gTasks[taskId].tMenuType, gTasks[taskId].tCursorPos);\n    gTasks[taskId].func = Task_HandleMenuInput;\n}\n\nstatic void Task_HandleMenuInput(u8 taskId)\n{\n    if (!gPaletteFade.active && HandleMenuInput(taskId))\n    {\n        gTasks[taskId].func = Task_UpdateVisualSelection;\n    }\n}\n\nstatic void Task_ExecuteMainMenuSelection(u8 taskId)\n{\n    s32 menuAction;\n    if (!gPaletteFade.active)\n    {\n        switch (gTasks[taskId].tMenuType)\n        {\n        default:\n        case MAIN_MENU_NEWGAME:\n            switch (gTasks[taskId].tCursorPos)\n            {\n            default:\n            case 0:\n                menuAction = MAIN_MENU_NEWGAME;\n                break;\n            case 1:\n                menuAction = MAIN_MENU_KEYSYSTEM;\n                break;\n            }\n            break;\n        case MAIN_MENU_CONTINUE:\n            switch (gTasks[taskId].tCursorPos)\n            {\n            default:\n            case 0:\n                menuAction = MAIN_MENU_CONTINUE;\n                break;\n            case 1:\n                menuAction = MAIN_MENU_NEWGAME;\n                break;\n            case 2:\n                menuAction = MAIN_MENU_KEYSYSTEM;\n                break;\n            }\n            break;\n        case MAIN_MENU_MYSTERYGIFT:\n            switch (gTasks[taskId].tCursorPos)\n            {\n            default:\n            case 0:\n                menuAction = MAIN_MENU_CONTINUE;\n                break;\n            case 1:\n                menuAction = MAIN_MENU_NEWGAME;\n                break;\n            case 2:\n                if (!IsWirelessAdapterConnected())\n                {\n                    SetStdFrame0OnBg(0);\n                    gTasks[taskId].func = Task_MysteryGiftError;\n                    BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n                    return;\n                }\n                else\n                {\n                    menuAction = MAIN_MENU_MYSTERYGIFT;\n                }\n                break;\n            case 3:\n                menuAction = MAIN_MENU_KEYSYSTEM;\n                break;\n            }\n            break;\n        }\n        switch (menuAction)\n        {\n        default:\n        case MAIN_MENU_NEWGAME:\n            SetStdFrame0OnBg(0);\n            gTasks[taskId].func = Task_ChooseVersionOnNewGame;\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n            return;\n        case MAIN_MENU_CONTINUE:\n            gPlttBufferUnfaded[0] = RGB_BLACK;\n            gPlttBufferFaded[0] = RGB_BLACK;\n            gExitStairsMovementDisabled = FALSE;\n            FreeAllWindowBuffers();\n            TryStartQuestLogPlayback(taskId);\n            break;\n        case MAIN_MENU_MYSTERYGIFT:\n            SetMainCallback2(CB2_InitMysteryGift);\n            HelpSystem_Disable();\n            FreeAllWindowBuffers();\n            DestroyTask(taskId);\n            break;\n        case MAIN_MENU_KEYSYSTEM:\n            SetMainCallback2(CB2_KeySystemMenuFromContinueScreen);\n            //HelpSystem_Disable();\n            FreeAllWindowBuffers();\n            DestroyTask(taskId);\n            break;\n        }\n    }\n}\n\nstatic void Task_DoFireredOrLeafgreenMultichoice(u8 taskId)\n{\n    struct WindowTemplate windowTemplate;\n    s8 input;\n\n    switch (gTasks[taskId].tUnused8)\n    {\n    case 3:\n        //StringExpandPlaceholders(gStringVar4, gChooseVersionNewGame);\n        //MAIN_MENU_WINDOW_ERROR = AddWindow(&sWindowTemplate_Prompt_FRLG);\n        //FillWindowPixelBuffer(MAIN_MENU_WINDOW_ERROR, 0x11);\n        //AddTextPrinterParameterized4(MAIN_MENU_WINDOW_ERROR, 2, 0, 2, 0, 2, sMG_Ereader_TextColor_2, 0, gStringVar4);\n        //DrawTextBorderOuter(MAIN_MENU_WINDOW_ERROR, 0x001, 0x0F);\n        //CopyWindowToVram(MAIN_MENU_WINDOW_ERROR, COPYWIN_GFX);\n        //PutWindowTilemap(MAIN_MENU_WINDOW_ERROR);\n        gTasks[taskId].tUnused8++;\n        break;\n    case 4:\n        windowTemplate = sWindowTemplate[MAIN_MENU_WINDOW_FRLG_CHOICE];\n        windowTemplate.tilemapTop = 9;\n        CreateFRLGChoiceMenu(&windowTemplate, 2, 0, 2, 0x0155, 2, 0);\n        gTasks[taskId].tUnused8++;\n        break;\n    case 5:\n        input = Menu_ProcessInputNoWrapAround();\n        if (input == 0 || input == 1)\n        {\n            if(input == 0)\n            {\n                gSaveBlock1Ptr->keyFlags.version = 0;\n            }\n            else\n            {\n                gSaveBlock1Ptr->keyFlags.version = 1;\n            }\n            PlaySE(SE_SELECT);\n            BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);\n            gTasks[taskId].tUnused8 = 3;\n            rbox_fill_rectangle(MAIN_MENU_WINDOW_ERROR);\n            ClearWindowTilemap(MAIN_MENU_WINDOW_ERROR);\n            CopyWindowToVram(MAIN_MENU_WINDOW_ERROR, COPYWIN_MAP);\n            RemoveWindow(MAIN_MENU_WINDOW_ERROR);\n            gTasks[taskId].func = Task_StartNewGame;\n            break;\n        }\n        break;\n    /*case 0xFF:\n        if(input == 0)\n        {\n            gSaveBlock1Ptr->keyFlags.version = 0;\n        }\n        else\n        {\n            gSaveBlock1Ptr->keyFlags.version = 1;\n        }\n        PlaySE(SE_SELECT);\n        BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);\n        gTasks[taskId].tUnused8 = 3;\n        rbox_fill_rectangle(MAIN_MENU_WINDOW_ERROR);\n        ClearWindowTilemap(MAIN_MENU_WINDOW_ERROR);\n        CopyWindowToVram(MAIN_MENU_WINDOW_ERROR, COPYWIN_MAP);\n        RemoveWindow(MAIN_MENU_WINDOW_ERROR);\n        gTasks[taskId].func = Task_StartNewGame;\n        break;*/\n    }\n}\n\nvoid CreateFRLGChoiceMenu(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos)\n{\n    struct TextPrinterTemplate textSubPrinter;\n    u8 YesNoWindowId;\n\n    YesNoWindowId = AddWindow(window);\n    DrawFRLGChoiceFrame(YesNoWindowId, 1, baseTileNum, paletteNum);\n    textSubPrinter.currentChar = gFRLG_Multichoice;\n    textSubPrinter.windowId = YesNoWindowId;\n    textSubPrinter.fontId = fontId;\n    textSubPrinter.x = GetMenuCursorDimensionByFont(fontId, 0) + left;\n    textSubPrinter.y = top;\n    textSubPrinter.currentX = textSubPrinter.x;\n    textSubPrinter.currentY = textSubPrinter.y;\n    textSubPrinter.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND);\n    textSubPrinter.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND);\n    textSubPrinter.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW);\n    textSubPrinter.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN);\n    textSubPrinter.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING);\n    textSubPrinter.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING);\n    AddTextPrinter(&textSubPrinter, 0xFF, NULL);\n    Menu_InitCursor(YesNoWindowId, fontId, left, top, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT) + textSubPrinter.lineSpacing, 2, initialCursorPos);\n}\n\nstatic void DrawFRLGChoiceFrame(u8 windowId, bool8 copyToVram, u16 baseTileNum, u8 paletteNum)\n{\n    u16 TileNum;\n    u8 PaletteNum;\n\n    TileNum = baseTileNum;\n    PaletteNum = paletteNum;\n    CallWindowFunction(windowId, MainMenu_DrawWindow_WindowFunction);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    PutWindowTilemap(windowId);\n    if (copyToVram == TRUE)\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void Task_ChooseVersionOnNewGame(u8 taskId)\n{\n    s8 state = 0;\n\n    //undarken screen\n    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240));\n    SetGpuReg(REG_OFFSET_WIN0V, ((0x0 << 8) + (2 << 8)) | ((0xA0) - 2));\n    switch (gTasks[taskId].tUnused8)\n    {\n    case 0:\n        FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);\n        PrintMessageOnWindow4(gChooseVersionNewGame);\n        gTasks[taskId].tUnused8++;\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n            gTasks[taskId].tUnused8++;\n        break;\n    case 2:\n        RunTextPrinters();\n        if (!IsTextPrinterActive(MAIN_MENU_WINDOW_ERROR))\n            gTasks[taskId].tUnused8++;\n        break;\n    case 3: //yesno here\n        gTasks[taskId].func = Task_DoFireredOrLeafgreenMultichoice;\n        //PlaySE(SE_SELECT);\n        //BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);\n        //gTasks[taskId].func = Task_StartNewGame;\n        break;\n    }\n}\n\nstatic void Task_StartNewGame(u8 taskId)\n{\n    gExitStairsMovementDisabled = 0;\n    FreeAllWindowBuffers();\n    DestroyTask(taskId);\n    StartNewGameScene();\n}\n\nstatic void Task_MysteryGiftError(u8 taskId)\n{\n    switch (gTasks[taskId].tMGErrorMsgState)\n    {\n    case 0:\n        FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);\n        if (gTasks[taskId].tMGErrorType == 1)\n            PrintMessageOnWindow4(gText_WirelessNotConnected);\n        else\n            PrintMessageOnWindow4(gText_MysteryGiftCantUse);\n        gTasks[taskId].tMGErrorMsgState++;\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n            gTasks[taskId].tMGErrorMsgState++;\n        break;\n    case 2:\n        RunTextPrinters();\n        if (!IsTextPrinterActive(MAIN_MENU_WINDOW_ERROR))\n            gTasks[taskId].tMGErrorMsgState++;\n        break;\n    case 3:\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            gTasks[taskId].func = Task_ReturnToTileScreen;\n        }\n        break;\n    }\n}\n\nstatic void Task_ReturnToTileScreen(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        SetMainCallback2(CB2_InitTitleScreen);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void MoveWindowByMenuTypeAndCursorPos(u8 menuType, u8 cursorPos)\n{\n    u16 win0vTop, win0vBot;\n    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(18, 222));\n    switch (menuType)\n    {\n    default:\n    case MAIN_MENU_NEWGAME:\n        switch (cursorPos)\n        {\n            default:\n            case 0: // NEW GAME\n                win0vTop = 0x00 << 8;\n                win0vBot = 0x20;\n                break;\n            case 1: // KEY SYSTEM SETTINGS\n                win0vTop = 0x20 << 8;\n                win0vBot = 0x40;\n                break;\n        }\n    case MAIN_MENU_CONTINUE:\n        switch (cursorPos)\n        {\n        default:\n        case 0: // CONTINUE\n            win0vTop = 0x00 << 8;\n            win0vBot = 0x40;\n            break;\n        case 1: // NEW GAME\n            win0vTop = 0x40 << 8;\n            win0vBot = 0x60;\n            break;\n        case 2: // KEY SYSTEM SETTINGS\n            win0vTop = 0x60 << 8;\n            win0vBot = 0x80;\n            break;\n        }\n    case MAIN_MENU_MYSTERYGIFT:\n        switch (cursorPos)\n        {\n        default:\n        case 0: // CONTINUE\n            win0vTop = 0x00 << 8;\n            win0vBot = 0x40;\n            break;\n        case 1: // NEW GAME\n            win0vTop = 0x40 << 8;\n            win0vBot = 0x60;\n            break;\n        case 2: // MYSTERY GIFT\n            win0vTop = 0x60 << 8;\n            win0vBot = 0x80;\n            break;\n        case 3: // KEY SYSTEM SETTINGS\n            win0vTop = 0x80 << 8;\n            win0vBot = 0xA0;\n            break;\n        }\n        break;\n    }\n    SetGpuReg(REG_OFFSET_WIN0V, (win0vTop + (2 << 8)) | (win0vBot - 2));\n}\n\nstatic bool8 HandleMenuInput(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        IsWirelessAdapterConnected(); // called for its side effects only\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        gTasks[taskId].func = Task_ExecuteMainMenuSelection;\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240));\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 160));\n        gTasks[taskId].func = Task_ReturnToTileScreen;\n    }\n    else if (JOY_NEW(DPAD_UP) && gTasks[taskId].tCursorPos > 0)\n    {\n        gTasks[taskId].tCursorPos--;\n        return TRUE;\n    }\n    else if (JOY_NEW(DPAD_DOWN) && gTasks[taskId].tCursorPos < sMenuCursorYMax[gTasks[taskId].tMenuType])\n    {\n        gTasks[taskId].tCursorPos++;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic void PrintMessageOnWindow4(const u8 *str)\n{\n    FillWindowPixelBuffer(MAIN_MENU_WINDOW_ERROR, PIXEL_FILL(10));\n    MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_ERROR]);\n    AddTextPrinterParameterized3(MAIN_MENU_WINDOW_ERROR, FONT_NORMAL, 0, 2, sTextColor1, 2, str);\n    PutWindowTilemap(MAIN_MENU_WINDOW_ERROR);\n    CopyWindowToVram(MAIN_MENU_WINDOW_ERROR, COPYWIN_GFX);\n    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE( 19, 221));\n    SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(115, 157));\n}\n\nstatic void PrintContinueStats(void)\n{\n    PrintPlayerName();\n    PrintDexCount();\n    PrintPlayTime();\n    PrintBadgeCount();\n}\n\nstatic void PrintPlayerName(void)\n{\n    s32 i;\n    u8 name[PLAYER_NAME_LENGTH + 1];\n    u8 *ptr;\n    AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 2, 18, sTextColor2, -1, gText_Player);\n    ptr = name;\n    for (i = 0; i < PLAYER_NAME_LENGTH; i++)\n        *ptr++ = gSaveBlock2Ptr->playerName[i];\n    *ptr = EOS;\n    AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 52, 18, sTextColor2, -1, name);\n}\n\nstatic void PrintPlayTime(void)\n{\n    u8 strbuf[30];\n    u8 *ptr;\n\n    AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 2, 34, sTextColor2, -1, gText_Time);\n    ptr = ConvertIntToDecimalStringN(strbuf, gSaveBlock2Ptr->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);\n    *ptr++ = CHAR_COLON;\n    ConvertIntToDecimalStringN(ptr, gSaveBlock2Ptr->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);\n    AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 52, 34, sTextColor2, -1, strbuf);\n}\n\nstatic void PrintDexCount(void)\n{\n    u8 strbuf[30];\n    u8 *ptr;\n    u16 dexcount;\n    if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE)\n    {\n        if (IsNationalPokedexEnabled())\n            dexcount = GetNationalPokedexCount(FLAG_GET_CAUGHT);\n        else if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n            dexcount = GetExtendedPokedexCount(FLAG_GET_CAUGHT);\n        else\n            dexcount = GetKantoPokedexCount(FLAG_GET_CAUGHT);\n        AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 112, 18, sTextColor2, -1, gText_Pokedex);\n        ptr = ConvertIntToDecimalStringN(strbuf, dexcount, STR_CONV_MODE_LEFT_ALIGN, 3);\n        StringAppend(ptr, gTextJPDummy_Hiki);\n        AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 162, 18, sTextColor2, -1, strbuf);\n    }\n}\n\nstatic void PrintBadgeCount(void)\n{\n    u8 strbuf[30];\n    u8 *ptr;\n    u32 flagId;\n    u8 nbadges = 0;\n    for (flagId = FLAG_BADGE01_GET; flagId < FLAG_BADGE01_GET + 8; flagId++)\n    {\n        if (FlagGet(flagId))\n            nbadges++;\n    }\n    AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 112, 34, sTextColor2, -1, gText_Badges);\n    ptr = ConvertIntToDecimalStringN(strbuf, nbadges, STR_CONV_MODE_LEADING_ZEROS, 1);\n    StringAppend(ptr, gTextJPDummy_Ko);\n    AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, FONT_NORMAL, 162, 34, sTextColor2, -1, strbuf);\n}\n\nstatic void LoadUserFrameToBg(u8 bgId)\n{\n    LoadBgTiles(bgId, GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1B1);\n    LoadPalette(GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType)->palette, BG_PLTT_ID(2), PLTT_SIZE_4BPP);\n    MainMenu_EraseWindow(&sWindowTemplate[MAIN_MENU_WINDOW_ERROR]);\n}\n\nstatic void SetStdFrame0OnBg(u8 bgId)\n{\n    LoadStdWindowGfx(MAIN_MENU_WINDOW_NEWGAME_ONLY, 0x1B1, BG_PLTT_ID(2));\n    MainMenu_EraseWindow(&sWindowTemplate[MAIN_MENU_WINDOW_ERROR]);\n}\n\nstatic void MainMenu_DrawWindow_WindowFunction(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)\n{\n    FillBgTilemapBufferRect(\n        bg, \n        0x1B1, \n        tilemapLeft - 1, \n        tilemapTop - 1,\n        1,\n        1,\n        2\n    );\n    FillBgTilemapBufferRect(\n        bg, \n        0x1B2, \n        tilemapLeft, \n        tilemapTop - 1, \n        width, \n        height, \n        2\n    );\n    FillBgTilemapBufferRect(\n        bg, \n        0x1B3, \n        tilemapLeft + \n        width, \n        tilemapTop - 1,\n        1,\n        1,\n        2\n    );\n    FillBgTilemapBufferRect(\n        bg, \n        0x1B4, \n        tilemapLeft - 1, \n        tilemapTop,\n        1, \n        height,\n        2\n    );\n    FillBgTilemapBufferRect(\n        bg, \n        0x1B6, \n        tilemapLeft + \n        width, \n        tilemapTop,\n        1, \n        height,\n        2\n    );\n    FillBgTilemapBufferRect(\n        bg, \n        0x1B7, \n        tilemapLeft - 1, \n        tilemapTop + \n        height,\n        1,\n        1,\n        2\n    );\n    FillBgTilemapBufferRect(\n        bg, \n        0x1B8, \n        tilemapLeft, \n        tilemapTop + \n        height, \n        width,\n        1,\n        2\n    );\n    FillBgTilemapBufferRect(\n        bg, \n        0x1B9, \n        tilemapLeft + \n        width, \n        tilemapTop + \n        height,\n        1,\n        1,\n        2\n    );\n    CopyBgTilemapBufferToVram(bg);\n}\n\nstatic void MainMenu_DrawWindow(const struct WindowTemplate * windowTemplate)\n{\n    FillBgTilemapBufferRect(\n        windowTemplate->bg, \n        0x1B1, \n        windowTemplate->tilemapLeft - 1, \n        windowTemplate->tilemapTop - 1,\n        1,\n        1,\n        2\n    );\n    FillBgTilemapBufferRect(\n        windowTemplate->bg, \n        0x1B2, \n        windowTemplate->tilemapLeft, \n        windowTemplate->tilemapTop - 1, \n        windowTemplate->width, \n        windowTemplate->height, \n        2\n    );\n    FillBgTilemapBufferRect(\n        windowTemplate->bg, \n        0x1B3, \n        windowTemplate->tilemapLeft + \n        windowTemplate->width, \n        windowTemplate->tilemapTop - 1,\n        1,\n        1,\n        2\n    );\n    FillBgTilemapBufferRect(\n        windowTemplate->bg, \n        0x1B4, \n        windowTemplate->tilemapLeft - 1, \n        windowTemplate->tilemapTop,\n        1, \n        windowTemplate->height,\n        2\n    );\n    FillBgTilemapBufferRect(\n        windowTemplate->bg, \n        0x1B6, \n        windowTemplate->tilemapLeft + \n        windowTemplate->width, \n        windowTemplate->tilemapTop,\n        1, \n        windowTemplate->height,\n        2\n    );\n    FillBgTilemapBufferRect(\n        windowTemplate->bg, \n        0x1B7, \n        windowTemplate->tilemapLeft - 1, \n        windowTemplate->tilemapTop + \n        windowTemplate->height,\n        1,\n        1,\n        2\n    );\n    FillBgTilemapBufferRect(\n        windowTemplate->bg, \n        0x1B8, \n        windowTemplate->tilemapLeft, \n        windowTemplate->tilemapTop + \n        windowTemplate->height, \n        windowTemplate->width,\n        1,\n        2\n    );\n    FillBgTilemapBufferRect(\n        windowTemplate->bg, \n        0x1B9, \n        windowTemplate->tilemapLeft + \n        windowTemplate->width, \n        windowTemplate->tilemapTop + \n        windowTemplate->height,\n        1,\n        1,\n        2\n    );\n    CopyBgTilemapBufferToVram(windowTemplate->bg);\n}\n\nstatic void MainMenu_EraseWindow(const struct WindowTemplate * windowTemplate)\n{\n    FillBgTilemapBufferRect(\n        windowTemplate->bg, \n        0x000, \n        windowTemplate->tilemapLeft - 1, \n        windowTemplate->tilemapTop - 1,  \n        windowTemplate->tilemapLeft + \n        windowTemplate->width + 1, \n        windowTemplate->tilemapTop + \n        windowTemplate->height + 1,\n        2\n    );\n    CopyBgTilemapBufferToVram(windowTemplate->bg);\n}\n"
  },
  {
    "path": "src/malloc.c",
    "content": "#include \"global.h\"\n\nstatic void *sHeapStart;\nstatic u32 sHeapSize;\n\nstatic EWRAM_DATA struct MemBlock *head = NULL;\nstatic EWRAM_DATA struct MemBlock *pos = NULL;\nstatic EWRAM_DATA struct MemBlock *splitBlock = NULL;\n\n#define MALLOC_SYSTEM_ID 0xA3A3\n\nstruct MemBlock {\n    // Whether this block is currently allocated.\n    bool16 flag;\n\n    // Magic number used for error checking. Should equal MALLOC_SYSTEM_ID.\n    u16 magic_number;\n\n    // Size of the block (not including this header struct).\n    u32 size;\n\n    // Previous block pointer. Equals sHeapStart if this is the first block.\n    struct MemBlock *prev;\n\n    // Next block pointer. Equals sHeapStart if this is the last block.\n    struct MemBlock *next;\n\n    // Data in the memory block. (Arrays of length 0 are a GNU extension.)\n    u8 data[0];\n};\n\nvoid PutMemBlockHeader(void *block, struct MemBlock *prev, struct MemBlock *next, u32 size)\n{\n    struct MemBlock *header = (struct MemBlock *)block;\n\n    header->flag = FALSE;\n    header->magic_number = MALLOC_SYSTEM_ID;\n    header->size = size;\n    header->prev = prev;\n    header->next = next;\n}\n\nvoid PutFirstMemBlockHeader(void *block, u32 size)\n{\n    PutMemBlockHeader(block, (struct MemBlock *)block, (struct MemBlock *)block, size - sizeof(struct MemBlock));\n}\n\nvoid *AllocInternal(void *heapStart, u32 size)\n{\n    u32 foundBlockSize;\n\n    head = (struct MemBlock *)heapStart;\n    pos = head;\n\n    // Alignment\n    if (size & 3)\n        size = 4 * ((size / 4) + 1);\n\n    for (;;) {\n        // Loop through the blocks looking for unused block that's big enough.\n\n        if (!pos->flag) {\n            foundBlockSize = pos->size;\n\n            if (foundBlockSize >= size) {\n                if (foundBlockSize - size < 2 * sizeof(struct MemBlock)) {\n                    // The block isn't much bigger than the requested size,\n                    // so just use it.\n                    pos->flag = TRUE;\n                    return pos->data;\n                } else {\n                    // The block is significantly bigger than the requested\n                    // size, so split the rest into a separate block.\n                    int splitBlockSize = foundBlockSize;\n                    splitBlockSize -= sizeof(struct MemBlock);\n                    splitBlockSize -= size;\n\n                    splitBlock = (struct MemBlock *)(pos->data + size);\n\n                    pos->flag = TRUE;\n                    pos->size = size;\n\n                    PutMemBlockHeader(splitBlock, pos, pos->next, splitBlockSize);\n\n                    pos->next = splitBlock;\n\n                    if (splitBlock->next != head)\n                        splitBlock->next->prev = splitBlock;\n                    return pos->data;\n                }\n            }\n        }\n\n        if (pos->next == head)\n        {\n            AGB_ASSERT_EX(0, ABSPATH(\"gflib/malloc.c\"), 174);\n            return NULL;\n        }\n\n        pos = pos->next;\n    }\n}\n\nvoid FreeInternal(void *heapStart, void *p)\n{\n    AGB_ASSERT_EX(p != NULL, ABSPATH(\"gflib/malloc.c\"), 195);\n\n    if (p) {\n        struct MemBlock *head = (struct MemBlock *)heapStart;\n        struct MemBlock *pos = (struct MemBlock *)((u8 *)p - sizeof(struct MemBlock));\n        AGB_ASSERT_EX(pos->magic_number == MALLOC_SYSTEM_ID, ABSPATH(\"gflib/malloc.c\"), 204);\n        AGB_ASSERT_EX(pos->flag == TRUE, ABSPATH(\"gflib/malloc.c\"), 205);\n        pos->flag = FALSE;\n\n        // If the freed block isn't the last one, merge with the next block\n        // if it's not in use.\n        if (pos->next != head) {\n            if (!pos->next->flag) {\n                AGB_ASSERT_EX(pos->next->magic_number == MALLOC_SYSTEM_ID, ABSPATH(\"gflib/malloc.c\"), 211);\n                pos->size += sizeof(struct MemBlock) + pos->next->size;\n                pos->next->magic_number = 0;\n                pos->next = pos->next->next;\n                if (pos->next != head)\n                    pos->next->prev = pos;\n            }\n        }\n\n        // If the freed block isn't the first one, merge with the previous block\n        // if it's not in use.\n        if (pos != head) {\n            if (!pos->prev->flag) {\n                AGB_ASSERT_EX(pos->prev->magic_number == MALLOC_SYSTEM_ID, ABSPATH(\"gflib/malloc.c\"), 228);\n\n                pos->prev->next = pos->next;\n\n                if (pos->next != head)\n                    pos->next->prev = pos->prev;\n\n                pos->magic_number = 0;\n                pos->prev->size += sizeof(struct MemBlock) + pos->size;\n            }\n        }\n    }\n}\n\nvoid *AllocZeroedInternal(void *heapStart, u32 size)\n{\n    void *mem = AllocInternal(heapStart, size);\n\n    if (mem != NULL) {\n        if (size & 3)\n            size = 4 * ((size / 4) + 1);\n\n        CpuFill32(0, mem, size);\n    }\n\n    return mem;\n}\n\nbool32 CheckMemBlockInternal(void *heapStart, void *pointer)\n{\n    struct MemBlock *head = (struct MemBlock *)heapStart;\n    struct MemBlock *block = (struct MemBlock *)((u8 *)pointer - sizeof(struct MemBlock));\n\n    if (block->magic_number != MALLOC_SYSTEM_ID)\n        return FALSE;\n\n    if (block->next->magic_number != MALLOC_SYSTEM_ID)\n        return FALSE;\n\n    if (block->next != head && block->next->prev != block)\n        return FALSE;\n\n    if (block->prev->magic_number != MALLOC_SYSTEM_ID)\n        return FALSE;\n\n    if (block->prev != head && block->prev->next != block)\n        return FALSE;\n\n    if (block->next != head && block->next != (struct MemBlock *)(block->data + block->size))\n        return FALSE;\n\n    return TRUE;\n}\n\nvoid InitHeap(void *heapStart, u32 heapSize)\n{\n    sHeapStart = heapStart;\n    sHeapSize = heapSize;\n    PutFirstMemBlockHeader(heapStart, heapSize);\n}\n\nvoid *Alloc(u32 size)\n{\n    return AllocInternal(sHeapStart, size);\n}\n\nvoid *AllocZeroed(u32 size)\n{\n    return AllocZeroedInternal(sHeapStart, size);\n}\n\nvoid Free(void *pointer)\n{\n    FreeInternal(sHeapStart, pointer);\n}\n\nbool32 CheckMemBlock(void *pointer)\n{\n    return CheckMemBlockInternal(sHeapStart, pointer);\n}\n\nbool32 CheckHeap()\n{\n    struct MemBlock *pos = (struct MemBlock *)sHeapStart;\n\n    do {\n        if (!CheckMemBlockInternal(sHeapStart, pos->data))\n            return FALSE;\n        pos = pos->next;\n    } while (pos != (struct MemBlock *)sHeapStart);\n\n    return TRUE;\n}\n"
  },
  {
    "path": "src/map_name_popup.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"event_data.h\"\n#include \"text_window.h\"\n#include \"quest_log.h\"\n#include \"region_map.h\"\n#include \"strings.h\"\n#include \"constants/flags.h\"\n#include \"constants/maps.h\"\n#include \"constants/map_groups.h\"\n#include \"constants/map_types.h\"\n#include \"constants/region_map_sections.h\"\n\n#define FLOOR_ROOFTOP 127\n\nstatic void Task_MapNamePopup(u8 taskId);\nstatic u16 MapNamePopupCreateWindow(bool32 palIntoFadedBuffer);\nstatic void MapNamePopupPrintMapNameOnWindow(u16 windowId);\nstatic u8 *MapNamePopupAppendFloorNum(u8 *dest, s8 flags);\n\n#define tState              data[0]\n#define tTimer              data[1]\n#define tPos                data[2]\n#define tReshow             data[3]\n#define tWindowId           data[4]\n#define tWindowExists       data[5]\n#define tWindowCleared      data[6]\n#define tWindowDestroyed    data[7]\n#define tPalIntoFadedBuffer data[8]\n\nvoid ShowMapNamePopup(bool32 palIntoFadedBuffer)\n{\n    u8 taskId;\n    if (FlagGet(FLAG_DONT_SHOW_MAP_NAME_POPUP) != TRUE && !QL_IS_PLAYBACK_STATE)\n    {\n        taskId = FindTaskIdByFunc(Task_MapNamePopup);\n        if (taskId == TASK_NONE)\n        {\n            taskId = CreateTask(Task_MapNamePopup, 90);\n            ChangeBgX(0,  0x0000, 0);\n            ChangeBgY(0, -0x1081, 0);\n            gTasks[taskId].tState = 0;\n            gTasks[taskId].tPos = 0;\n            gTasks[taskId].tPalIntoFadedBuffer = palIntoFadedBuffer;\n        }\n        else\n        {\n            if (gTasks[taskId].tState != 4)\n                gTasks[taskId].tState = 4;\n            gTasks[taskId].tReshow = TRUE;\n        }\n    }\n}\n\nstatic void Task_MapNamePopup(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->tState)\n    {\n    case 0:\n        task->tWindowId = MapNamePopupCreateWindow(task->tPalIntoFadedBuffer);\n        task->tWindowExists = TRUE;\n        task->tState = 1;\n        break;\n    case 1:\n        if (IsDma3ManagerBusyWithBgCopy())\n            break;\n        // fallthrough\n    case 2:\n        task->tPos -= 2;\n        if (task->tPos <= -24)\n        {\n            task->tState = 3;\n            task->tTimer = 0;\n        }\n        break;\n    case 3:\n        task->tTimer++;\n        if (task->tTimer > 120)\n        {\n            task->tTimer = 0;\n            task->tState = 4;\n        }\n        break;\n    case 4:\n        task->tPos += 2;\n        if (task->tPos >= 0)\n        {\n            if (task->tReshow)\n            {\n                MapNamePopupPrintMapNameOnWindow(task->tWindowId);\n                CopyWindowToVram(task->tWindowId, COPYWIN_GFX);\n                task->tState = 1;\n                task->tReshow = FALSE;\n            }\n            else\n            {\n                task->tState = 6;\n                return;\n            }\n        }\n    case 5:\n        break;\n    case 6:\n        if (task->tWindowExists && !task->tWindowCleared)\n        {\n            rbox_fill_rectangle(task->tWindowId);\n            CopyWindowToVram(task->tWindowId, COPYWIN_MAP);\n            task->tWindowCleared = TRUE;\n        }\n        task->tState = 7;\n        return;\n    case 7:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            if (task->tWindowExists)\n            {\n                RemoveWindow(task->tWindowId);\n                task->tWindowExists = FALSE;\n                task->tWindowDestroyed = TRUE;\n            }\n            task->tState = 8;\n            ChangeBgY(0, 0x00000000, 0);\n        }\n        return;\n    case 8:\n        DestroyTask(taskId);\n        return;\n    }\n    SetGpuReg(REG_OFFSET_BG0VOFS, task->tPos);\n}\n\nvoid DismissMapNamePopup(void)\n{\n    u8 taskId;\n    s16 *data;\n    taskId = FindTaskIdByFunc(Task_MapNamePopup);\n    if (taskId != TASK_NONE)\n    {\n        data = gTasks[taskId].data;\n        if (tState < 6)\n            tState = 6;\n    }\n}\n\nbool32 IsMapNamePopupTaskActive(void)\n{\n    return FindTaskIdByFunc(Task_MapNamePopup) != TASK_NONE ? TRUE : FALSE;\n}\n\n#define WIN_PAL_NUM  13\n\nstatic u16 MapNamePopupCreateWindow(bool32 palintoFadedBuffer)\n{\n    struct WindowTemplate windowTemplate = {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 29,\n        .width = 14,\n        .height = 2,\n        .paletteNum = WIN_PAL_NUM,\n        .baseBlock = 0x001\n    };\n    u16 windowId;\n    u16 tileNum = 0x01D;\n    if (gMapHeader.floorNum != 0)\n    {\n        if (gMapHeader.floorNum != FLOOR_ROOFTOP)\n        {\n            windowTemplate.width += 5;\n            tileNum = 0x027;\n        }\n        else\n        {\n            // ROOFTOP\n            windowTemplate.width += 8;\n            tileNum = 0x02D;\n        }\n    }\n    windowId = AddWindow(&windowTemplate);\n    if (palintoFadedBuffer)\n        LoadPalette(GetTextWindowPalette(3), BG_PLTT_ID(WIN_PAL_NUM), PLTT_SIZE_4BPP);\n    else\n        CpuCopy16(GetTextWindowPalette(3), &gPlttBufferUnfaded[BG_PLTT_ID(WIN_PAL_NUM)], PLTT_SIZE_4BPP);\n    LoadStdWindowTiles(windowId, tileNum);\n    DrawTextBorderOuter(windowId, tileNum, WIN_PAL_NUM);\n    PutWindowTilemap(windowId);\n    MapNamePopupPrintMapNameOnWindow(windowId);\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n    return windowId;\n}\n\nstatic void MapNamePopupPrintMapNameOnWindow(u16 windowId)\n{\n    u8 mapName[25];\n    u32 maxWidth = 112;\n    u32 xpos;\n    u8 *ptr = GetMapName(mapName, gMapHeader.regionMapSectionId, 0);\n    if(gMapHeader.mapType == MAP_TYPE_UNDERWATER)\n    {\n        ptr = GetMapName(mapName, MAPSEC_UNDERWATER_124, 0);\n    }\n    else if(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(RS_BATTLE_TOWER) && (gSaveBlock1Ptr->location.mapNum >= MAP_NUM(RS_BATTLE_TOWER)\n        && gSaveBlock1Ptr->location.mapNum <= MAP_NUM(RS_BATTLE_TOWER_BATTLE_ROOM))) //overwrite Battle Frontier name\n    {\n        ptr = StringCopy(mapName, gText_BattleTower);\n    }\n    /*\n    else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FACTORY_LOBBY)\n     && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FACTORY_LOBBY)) //overwrite Battle Frontier name\n    {\n        ptr = StringCopy(mapName, gText_BattleFactory);\n    }\n    else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_ARENA_LOBBY)\n     && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_ARENA_LOBBY)) //overwrite Battle Frontier name\n    {\n        ptr = StringCopy(mapName, gText_BattleArena);\n    }\n    else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_PIKE_LOBBY)\n     && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_PIKE_LOBBY)) //overwrite Battle Frontier name\n    {\n        ptr = StringCopy(mapName, gText_BattlePike);\n    }\n    else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_PALACE_LOBBY)\n     && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_PALACE_LOBBY)) //overwrite Battle Frontier name\n    {\n        ptr = StringCopy(mapName, gText_BattlePalace);\n    }\n    else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_PYRAMID_LOBBY)\n     && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_PYRAMID_LOBBY)) //overwrite Battle Frontier name\n    {\n        ptr = StringCopy(mapName, gText_BattlePyramid);\n    }\n    else if(gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_TOWER_LOBBY)\n     && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_TOWER_LOBBY)) //overwrite Battle Frontier name\n    {\n        ptr = StringCopy(mapName, gText_BattleTower);\n    }*/\n    if (gMapHeader.floorNum != 0)\n    {\n        ptr = MapNamePopupAppendFloorNum(ptr, gMapHeader.floorNum);\n        maxWidth = gMapHeader.floorNum != FLOOR_ROOFTOP ? 152 : 176;\n    }\n    xpos = (maxWidth - GetStringWidth(FONT_NORMAL, mapName, -1)) / 2;\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    AddTextPrinterParameterized(windowId, FONT_NORMAL, mapName, xpos, 2, TEXT_SKIP_DRAW, NULL);\n}\n\nstatic u8 *MapNamePopupAppendFloorNum(u8 *dest, s8 floorNum)\n{\n    if (floorNum == 0)\n        return dest;\n    *dest++ = CHAR_SPACE;\n    if (floorNum == FLOOR_ROOFTOP)\n        return StringCopy(dest, gText_Rooftop2);\n    if (floorNum < 0)\n    {\n        *dest++ = CHAR_B;\n        floorNum *= -1;\n    }\n    dest = ConvertIntToDecimalStringN(dest, floorNum, STR_CONV_MODE_LEFT_ALIGN, 2);\n    *dest++ = CHAR_F;\n    *dest = EOS;\n    return dest;\n}\n\n#undef tPalIntoFadedBuffer\n#undef tWindowDestroyed\n#undef tWindowCleared\n#undef tWindowExists\n#undef tWindowId\n#undef tReshow\n#undef tPos\n#undef tTimer\n#undef tState\n"
  },
  {
    "path": "src/map_preview_screen.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"quest_log.h\"\n#include \"new_menu_helpers.h\"\n#include \"region_map.h\"\n#include \"menu.h\"\n#include \"field_fadetransition.h\"\n#include \"field_weather.h\"\n#include \"script.h\"\n#include \"overworld.h\"\n#include \"event_data.h\"\n#include \"map_preview_screen.h\"\n#include \"constants/region_map_sections.h\"\n\nstatic EWRAM_DATA bool8 sHasVisitedMapBefore = FALSE;\nstatic EWRAM_DATA bool8 sAllocedBg0TilemapBuffer = FALSE;\n\nstatic void Task_RunMapPreviewScreenForest(u8 taskId);\n\nstatic const u8 sViridianForestMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/viridian_forest/tiles.gbapal\");\nstatic const u8 sViridianForestMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/viridian_forest/tiles.4bpp.lz\");\nstatic const u8 sViridianForestMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/viridian_forest/tilemap.bin.lz\");\nstatic const u8 sRockTunnelMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/rock_tunnel/tiles.gbapal\");\nstatic const u8 sRockTunnelMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/rock_tunnel/tiles.4bpp.lz\");\nstatic const u8 sRockTunnelMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/rock_tunnel/tilemap.bin.lz\");\nstatic const u8 sRocketHideoutMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/rocket_hideout/tiles.gbapal\");\nstatic const u8 sRocketHideoutMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/rocket_hideout/tiles.4bpp.lz\");\nstatic const u8 sRocketHideoutMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/rocket_hideout/tilemap.bin.lz\");\nstatic const u8 sPowerPlantMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/power_plant/tiles.gbapal\");\nstatic const u8 sPowerPlantMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/power_plant/tiles.4bpp.lz\");\nstatic const u8 sPowerPlantMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/power_plant/tilemap.bin.lz\");\nstatic const u8 sPokemonMansionMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/pokemon_mansion/tiles.gbapal\");\nstatic const u8 sPokemonMansionMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/pokemon_mansion/tiles.4bpp.lz\");\nstatic const u8 sPokemonMansionMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/pokemon_mansion/tilemap.bin.lz\");\nstatic const u8 sPokemonTowerMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/pokemon_tower/tiles.gbapal\");\nstatic const u8 sPokemonTowerMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/pokemon_tower/tiles.4bpp.lz\");\nstatic const u8 sPokemonTowerMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/pokemon_tower/tilemap.bin.lz\");\nstatic const u8 sSilphCoMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/silph_co/tiles.gbapal\");\nstatic const u8 sSilphCoMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/silph_co/tiles.4bpp.lz\");\nstatic const u8 sSilphCoMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/silph_co/tilemap.bin.lz\");\nstatic const u8 sMtMoonMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/mt_moon/tiles.gbapal\");\nstatic const u8 sMtMoonMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/mt_moon/tiles.4bpp.lz\");\nstatic const u8 sMtMoonMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/mt_moon/tilemap.bin.lz\");\nstatic const u8 sSeafoamIslandsMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/seafoam_islands/tiles.gbapal\");\nstatic const u8 sSeafoamIslandsMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/seafoam_islands/tiles.4bpp.lz\");\nstatic const u8 sSeafoamIslandsMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/seafoam_islands/tilemap.bin.lz\");\nstatic const u8 sRocketWarehouseMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/rocket_warehouse/tiles.gbapal\");\nstatic const u8 sRocketWarehouseMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/rocket_warehouse/tiles.4bpp.lz\");\nstatic const u8 sRocketWarehouseMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/rocket_warehouse/tilemap.bin.lz\");\nstatic const u8 sVictoryRoadMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/victory_road/tiles.gbapal\");\nstatic const u8 sVictoryRoadMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/victory_road/tiles.4bpp.lz\");\nstatic const u8 sVictoryRoadMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/victory_road/tilemap.bin.lz\");\nstatic const u8 sMtEmberMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/mt_ember/tiles.gbapal\");\nstatic const u8 sMtEmberMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/mt_ember/tiles.4bpp.lz\");\nstatic const u8 sMtEmberMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/mt_ember/tilemap.bin.lz\");\nstatic const u8 sSafariZoneMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/safari_zone/tiles.gbapal\");\nstatic const u8 sSafariZoneMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/safari_zone/tiles.4bpp.lz\");\nstatic const u8 sSafariZoneMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/safari_zone/tilemap.bin.lz\");\nstatic const u8 sMoneanChamberMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/monean_chamber/tiles.gbapal\");\nstatic const u8 sMoneanChamberMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/monean_chamber/tiles.4bpp.lz\");\nstatic const u8 sMoneanChamberMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/monean_chamber/tilemap.bin.lz\");\nstatic const u8 sDottedHoleMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/dotted_hole/tiles.gbapal\");\nstatic const u8 sDottedHoleMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/dotted_hole/tiles.4bpp.lz\");\nstatic const u8 sDottedHoleMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/dotted_hole/tilemap.bin.lz\");\nstatic const u8 sCeruleanCaveMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/cerulean_cave/tiles.gbapal\");\nstatic const u8 sCeruleanCaveMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/cerulean_cave/tiles.4bpp.lz\");\nstatic const u8 sCeruleanCaveMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/cerulean_cave/tilemap.bin.lz\");\nstatic const u8 sDiglettsCaveMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/digletts_cave/tiles.gbapal\");\nstatic const u8 sDiglettsCaveMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/digletts_cave/tiles.4bpp.lz\");\nstatic const u8 sDiglettsCaveMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/digletts_cave/tilemap.bin.lz\");\nstatic const u8 sLostCaveMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/lost_cave/tiles.gbapal\");\nstatic const u8 sLostCaveMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/lost_cave/tiles.4bpp.lz\");\nstatic const u8 sLostCaveMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/lost_cave/tilemap.bin.lz\");\nstatic const u8 sBerryForestMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/berry_forest/tiles.gbapal\");\nstatic const u8 sBerryForestMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/berry_forest/tiles.4bpp.lz\");\nstatic const u8 sBerryForestMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/berry_forest/tilemap.bin.lz\");\nstatic const u8 sIcefallCaveMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/icefall_cave/tiles.gbapal\");\nstatic const u8 sIcefallCaveMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/icefall_cave/tiles.4bpp.lz\");\nstatic const u8 sIcefallCaveMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/icefall_cave/tilemap.bin.lz\");\nstatic const u8 sAlteringCaveMapPreviewPalette[] = INCBIN_U8(\"graphics/map_preview/altering_cave/tiles.gbapal\");\nstatic const u8 sAlteringCaveMapPreviewTiles[] = INCBIN_U8(\"graphics/map_preview/altering_cave/tiles.4bpp.lz\");\nstatic const u8 sAlteringCaveMapPreviewTilemap[] = INCBIN_U8(\"graphics/map_preview/altering_cave/tilemap.bin.lz\");\n\nstatic const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {\n    [MPS_VIRIDIAN_FOREST] = {\n        .mapsec = MAPSEC_VIRIDIAN_FOREST,\n        .type = MPS_TYPE_FOREST,\n        .flagId = FLAG_WORLD_MAP_VIRIDIAN_FOREST,\n        .tilesptr = sViridianForestMapPreviewTiles,\n        .tilemapptr = sViridianForestMapPreviewTilemap,\n        .palptr = sViridianForestMapPreviewPalette\n    },\n    [MPS_MT_MOON] = {\n        .mapsec = MAPSEC_MT_MOON,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_MT_MOON_1F,\n        .tilesptr = sMtMoonMapPreviewTiles,\n        .tilemapptr = sMtMoonMapPreviewTilemap,\n        .palptr = sMtMoonMapPreviewPalette\n    },\n    [MPS_DIGLETTS_CAVE] = {\n        .mapsec = MAPSEC_DIGLETTS_CAVE,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_DIGLETTS_CAVE_B1F,\n        .tilesptr = sDiglettsCaveMapPreviewTiles,\n        .tilemapptr = sDiglettsCaveMapPreviewTilemap,\n        .palptr = sDiglettsCaveMapPreviewPalette\n    },\n    [MPS_ROCK_TUNNEL] = {\n        .mapsec = MAPSEC_ROCK_TUNNEL,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_ROCK_TUNNEL_1F,\n        .tilesptr = sRockTunnelMapPreviewTiles,\n        .tilemapptr = sRockTunnelMapPreviewTilemap,\n        .palptr = sRockTunnelMapPreviewPalette\n    },\n    [MPS_POKEMON_TOWER] = {\n        .mapsec = MAPSEC_POKEMON_TOWER,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_POKEMON_TOWER_1F,\n        .tilesptr = sPokemonTowerMapPreviewTiles,\n        .tilemapptr = sPokemonTowerMapPreviewTilemap,\n        .palptr = sPokemonTowerMapPreviewPalette\n    },\n    [MPS_SAFARI_ZONE] = {\n        .mapsec = MAPSEC_KANTO_SAFARI_ZONE,\n        .type = MPS_TYPE_FOREST,\n        .flagId = FLAG_WORLD_MAP_SAFARI_ZONE_CENTER,\n        .tilesptr = sSafariZoneMapPreviewTiles,\n        .tilemapptr = sSafariZoneMapPreviewTilemap,\n        .palptr = sSafariZoneMapPreviewPalette\n    },\n    [MPS_SEAFOAM_ISLANDS] = {\n        .mapsec = MAPSEC_SEAFOAM_ISLANDS,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_SEAFOAM_ISLANDS_1F,\n        .tilesptr = sSeafoamIslandsMapPreviewTiles,\n        .tilemapptr = sSeafoamIslandsMapPreviewTilemap,\n        .palptr = sSeafoamIslandsMapPreviewPalette\n    },\n    [MPS_POKEMON_MANSION] = {\n        .mapsec = MAPSEC_POKEMON_MANSION,\n        .type = MPS_TYPE_FOREST,\n        .flagId = FLAG_WORLD_MAP_POKEMON_MANSION_1F,\n        .tilesptr = sPokemonMansionMapPreviewTiles,\n        .tilemapptr = sPokemonMansionMapPreviewTilemap,\n        .palptr = sPokemonMansionMapPreviewPalette\n    },\n    [MPS_ROCKET_HIDEOUT] = {\n        .mapsec = MAPSEC_ROCKET_HIDEOUT,\n        .type = MPS_TYPE_FOREST,\n        .flagId = FLAG_WORLD_MAP_ROCKET_HIDEOUT_B1F,\n        .tilesptr = sRocketHideoutMapPreviewTiles,\n        .tilemapptr = sRocketHideoutMapPreviewTilemap,\n        .palptr = sRocketHideoutMapPreviewPalette\n    },\n    [MPS_SILPH_CO] = {\n        .mapsec = MAPSEC_SILPH_CO,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_SILPH_CO_1F,\n        .tilesptr = sSilphCoMapPreviewTiles,\n        .tilemapptr = sSilphCoMapPreviewTilemap,\n        .palptr = sSilphCoMapPreviewPalette\n    },\n    [MPS_VICTORY_ROAD] = {\n        .mapsec = MAPSEC_KANTO_VICTORY_ROAD,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_VICTORY_ROAD_1F,\n        .tilesptr = sVictoryRoadMapPreviewTiles,\n        .tilemapptr = sVictoryRoadMapPreviewTilemap,\n        .palptr = sVictoryRoadMapPreviewPalette\n    },\n    [MPS_CERULEAN_CAVE] = {\n        .mapsec = MAPSEC_CERULEAN_CAVE,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_CERULEAN_CAVE_1F,\n        .tilesptr = sCeruleanCaveMapPreviewTiles,\n        .tilemapptr = sCeruleanCaveMapPreviewTilemap,\n        .palptr = sCeruleanCaveMapPreviewPalette\n    },\n    [MPS_POWER_PLANT] = {\n        .mapsec = MAPSEC_POWER_PLANT,\n        .type = MPS_TYPE_FOREST,\n        .flagId = FLAG_WORLD_MAP_POWER_PLANT,\n        .tilesptr = sPowerPlantMapPreviewTiles,\n        .tilemapptr = sPowerPlantMapPreviewTilemap,\n        .palptr = sPowerPlantMapPreviewPalette\n    },\n    [MPS_MT_EMBER] = {\n        .mapsec = MAPSEC_MT_EMBER,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_MT_EMBER_EXTERIOR,\n        .tilesptr = sMtEmberMapPreviewTiles,\n        .tilemapptr = sMtEmberMapPreviewTilemap,\n        .palptr = sMtEmberMapPreviewPalette\n    },\n    [MPS_ROCKET_WAREHOUSE] = {\n        .mapsec = MAPSEC_ROCKET_WAREHOUSE,\n        .type = MPS_TYPE_FOREST,\n        .flagId = FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST,\n        .tilesptr = sRocketWarehouseMapPreviewTiles,\n        .tilemapptr = sRocketWarehouseMapPreviewTilemap,\n        .palptr = sRocketWarehouseMapPreviewPalette\n    },\n    [MPS_MONEAN_CHAMBER] = {\n        .mapsec = MAPSEC_MONEAN_CHAMBER,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,\n        .tilesptr = sMoneanChamberMapPreviewTiles,\n        .tilemapptr = sMoneanChamberMapPreviewTilemap,\n        .palptr = sMoneanChamberMapPreviewPalette\n    },\n    [MPS_DOTTED_HOLE] = {\n        .mapsec = MAPSEC_DOTTED_HOLE,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_SIX_ISLAND_DOTTED_HOLE_1F,\n        .tilesptr = sDottedHoleMapPreviewTiles,\n        .tilemapptr = sDottedHoleMapPreviewTilemap,\n        .palptr = sDottedHoleMapPreviewPalette\n    },\n    [MPS_BERRY_FOREST] = {\n        .mapsec = MAPSEC_BERRY_FOREST,\n        .type = MPS_TYPE_FOREST,\n        .flagId = FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST,\n        .tilesptr = sBerryForestMapPreviewTiles,\n        .tilemapptr = sBerryForestMapPreviewTilemap,\n        .palptr = sBerryForestMapPreviewPalette\n    },\n    [MPS_ICEFALL_CAVE] = {\n        .mapsec = MAPSEC_ICEFALL_CAVE,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE,\n        .tilesptr = sIcefallCaveMapPreviewTiles,\n        .tilemapptr = sIcefallCaveMapPreviewTilemap,\n        .palptr = sIcefallCaveMapPreviewPalette\n    },\n    [MPS_LOST_CAVE] = {\n        .mapsec = MAPSEC_LOST_CAVE,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE,\n        .tilesptr = sLostCaveMapPreviewTiles,\n        .tilemapptr = sLostCaveMapPreviewTilemap,\n        .palptr = sLostCaveMapPreviewPalette\n    },\n    [MPS_ALTERING_CAVE] = {\n        .mapsec = MAPSEC_ALTERING_CAVE,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_SIX_ISLAND_ALTERING_CAVE,\n        .tilesptr = sAlteringCaveMapPreviewTiles,\n        .tilemapptr = sAlteringCaveMapPreviewTilemap,\n        .palptr = sAlteringCaveMapPreviewPalette\n    },\n    [MPS_PATTERN_BUSH] = {\n        .mapsec = MAPSEC_PATTERN_BUSH,\n        .type = MPS_TYPE_FOREST,\n        .flagId = FLAG_WORLD_MAP_SIX_ISLAND_PATTERN_BUSH,\n        .tilesptr = sViridianForestMapPreviewTiles,\n        .tilemapptr = sViridianForestMapPreviewTilemap,\n        .palptr = sViridianForestMapPreviewPalette\n    },\n    [MPS_LIPTOO_CHAMBER] = {\n        .mapsec = MAPSEC_LIPTOO_CHAMBER,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,\n        .tilesptr = sMoneanChamberMapPreviewTiles,\n        .tilemapptr = sMoneanChamberMapPreviewTilemap,\n        .palptr = sMoneanChamberMapPreviewPalette\n    },\n    [MPS_WEEPTH_CHAMBER] = {\n        .mapsec = MAPSEC_WEEPTH_CHAMBER,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,\n        .tilesptr = sMoneanChamberMapPreviewTiles,\n        .tilemapptr = sMoneanChamberMapPreviewTilemap,\n        .palptr = sMoneanChamberMapPreviewPalette\n    },\n    [MPS_TDILFORD_CHAMBER] = {\n        .mapsec = MAPSEC_DILFORD_CHAMBER,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,\n        .tilesptr = sMoneanChamberMapPreviewTiles,\n        .tilemapptr = sMoneanChamberMapPreviewTilemap,\n        .palptr = sMoneanChamberMapPreviewPalette\n    },\n    [MPS_SCUFIB_CHAMBER] = {\n        .mapsec = MAPSEC_SCUFIB_CHAMBER,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,\n        .tilesptr = sMoneanChamberMapPreviewTiles,\n        .tilemapptr = sMoneanChamberMapPreviewTilemap,\n        .palptr = sMoneanChamberMapPreviewPalette\n    },\n    [MPS_RIXY_CHAMBER] = {\n        .mapsec = MAPSEC_RIXY_CHAMBER,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,\n        .tilesptr = sMoneanChamberMapPreviewTiles,\n        .tilemapptr = sMoneanChamberMapPreviewTilemap,\n        .palptr = sMoneanChamberMapPreviewPalette\n    },\n    [MPS_VIAPOIS_CHAMBER] = {\n        .mapsec = MAPSEC_VIAPOIS_CHAMBER,\n        .type = MPS_TYPE_CAVE,\n        .flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,\n        .tilesptr = sMoneanChamberMapPreviewTiles,\n        .tilemapptr = sMoneanChamberMapPreviewTilemap,\n        .palptr = sMoneanChamberMapPreviewPalette\n    }\n};\n\nstatic const struct WindowTemplate sMapNameWindow = {\n    .bg = 0,\n    .tilemapLeft = 0,\n    .tilemapTop = 0,\n    .width = 13,\n    .height = 2,\n    .paletteNum = 14,\n    .baseBlock = 0x1C2\n};\n\nstatic const struct BgTemplate sMapPreviewBgTemplate[1] = {\n    {\n        .mapBaseIndex = 31\n    }\n};\n\nstatic u8 GetMapPreviewScreenIdx(u8 mapsec)\n{\n    s32 i;\n\n    for (i = 0; i < MPS_COUNT; i++)\n    {\n        if (sMapPreviewScreenData[i].mapsec == mapsec)\n        {\n            return i;\n        }\n    }\n    return MPS_COUNT;\n}\n\nbool8 MapHasPreviewScreen(u8 mapsec, u8 type)\n{\n    u8 idx;\n\n    idx = GetMapPreviewScreenIdx(mapsec);\n    if (idx != MPS_COUNT)\n    {\n        if (type == MPS_TYPE_ANY)\n        {\n            return TRUE;\n        }\n        else\n        {\n            return sMapPreviewScreenData[idx].type == type ? TRUE : FALSE;\n        }\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nbool32 MapHasPreviewScreen_HandleQLState2(u8 mapsec, u8 type)\n{\n    if (gQuestLogState == QL_STATE_PLAYBACK)\n    {\n        return FALSE;\n    }\n    else\n    {\n        return MapHasPreviewScreen(mapsec, type);\n    }\n}\n\nvoid MapPreview_InitBgs(void)\n{\n    InitBgsFromTemplates(0, sMapPreviewBgTemplate, NELEMS(sMapPreviewBgTemplate));\n    ShowBg(0);\n}\n\nvoid MapPreview_LoadGfx(u8 mapsec)\n{\n    u8 idx;\n\n    idx = GetMapPreviewScreenIdx(mapsec);\n    if (idx != MPS_COUNT)\n    {\n       ResetTempTileDataBuffers();\n       LoadPalette(sMapPreviewScreenData[idx].palptr, BG_PLTT_ID(13), 3 * PLTT_SIZE_4BPP);\n       DecompressAndCopyTileDataToVram(0, sMapPreviewScreenData[idx].tilesptr, 0, 0, 0);\n       if (GetBgTilemapBuffer(0) == NULL)\n       {\n           SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE));\n           sAllocedBg0TilemapBuffer = TRUE;\n       }\n       else\n       {\n           sAllocedBg0TilemapBuffer = FALSE;\n       }\n       CopyToBgTilemapBuffer(0, sMapPreviewScreenData[idx].tilemapptr, 0, 0x000);\n       CopyBgTilemapBufferToVram(0);\n    }\n}\n\nvoid MapPreview_Unload(s32 windowId)\n{\n    RemoveWindow(windowId);\n    if (sAllocedBg0TilemapBuffer)\n    {\n        Free(GetBgTilemapBuffer(0));\n    }\n}\n\nbool32 MapPreview_IsGfxLoadFinished(void)\n{\n    return FreeTempTileDataBuffersIfPossible();\n}\n\nvoid MapPreview_StartForestTransition(u8 mapsec)\n{\n    u8 taskId;\n\n    taskId = CreateTask(Task_RunMapPreviewScreenForest, 0);\n    gTasks[taskId].data[2] = GetBgAttribute(0, BG_ATTR_PRIORITY);\n    gTasks[taskId].data[4] = GetGpuReg(REG_OFFSET_BLDCNT);\n    gTasks[taskId].data[5] = GetGpuReg(REG_OFFSET_BLDALPHA);\n    gTasks[taskId].data[3] = GetGpuReg(REG_OFFSET_DISPCNT);\n    gTasks[taskId].data[6] = GetGpuReg(REG_OFFSET_WININ);\n    gTasks[taskId].data[7] = GetGpuReg(REG_OFFSET_WINOUT);\n    gTasks[taskId].data[10] = MapPreview_GetDuration(mapsec);\n    gTasks[taskId].data[8] = 16;\n    gTasks[taskId].data[9] = 0;\n    SetBgAttribute(0, BG_ATTR_PRIORITY, 0);\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));\n    SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_CLR | WININ_WIN1_CLR);\n    SetGpuRegBits(REG_OFFSET_WINOUT, WINOUT_WIN01_CLR);\n    gTasks[taskId].data[11] = MapPreview_CreateMapNameWindow(mapsec);\n    LockPlayerFieldControls();\n}\n\nu16 MapPreview_CreateMapNameWindow(u8 mapsec)\n{\n    u16 windowId;\n    u32 xctr;\n    u8 color[3];\n\n    windowId = AddWindow(&sMapNameWindow);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    PutWindowTilemap(windowId);\n    color[0] = TEXT_COLOR_WHITE; // Access violation\n    color[1] = TEXT_COLOR_RED; // Access violation\n    color[2] = TEXT_COLOR_LIGHT_GRAY; // Access violation\n    GetMapName(gStringVar4, mapsec, 0);\n    xctr = 104 - GetStringWidth(FONT_NORMAL, gStringVar4, 0);\n    AddTextPrinterParameterized4(windowId, FONT_NORMAL, xctr / 2, 2, 0, 0, color/* Access violation */, -1, gStringVar4);\n    return windowId;\n}\n\nbool32 ForestMapPreviewScreenIsRunning(void)\n{\n    if (FuncIsActiveTask(Task_RunMapPreviewScreenForest) == TRUE)\n    {\n        return FALSE;\n    }\n    else\n    {\n        return TRUE;\n    }\n}\n\nstatic void Task_RunMapPreviewScreenForest(u8 taskId)\n{\n    s16 * data;\n\n    data = gTasks[taskId].data;\n    switch (data[0])\n    {\n    case 0:\n        if (!MapPreview_IsGfxLoadFinished() && !IsDma3ManagerBusyWithBgCopy())\n        {\n            CopyWindowToVram(data[11], COPYWIN_FULL);\n            data[0]++;\n        }\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            FadeInFromBlack();\n            data[0]++;\n        }\n        break;\n    case 2:\n        if (IsWeatherNotFadingIn())\n        {\n            Overworld_PlaySpecialMapMusic();\n            data[0]++;\n        }\n        break;\n    case 3:\n        data[1]++;\n        if (data[1] > data[10])\n        {\n            data[1] = 0;\n            data[0]++;\n        }\n        break;\n    case 4:\n        switch (data[1])\n        {\n        case 0:\n            data[9]++;\n            if (data[9] > 16)\n            {\n                data[9] = 16;\n            }\n            break;\n        case 1:\n            data[8]--;\n            if (data[8] < 0)\n            {\n                data[8] = 0;\n            }\n            break;\n        }\n        data[1] = (data[1] + 1) % 3;\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(data[8], data[9]));\n        if (data[8] == 0 && data[9] == 16)\n        {\n            FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);\n            CopyBgTilemapBufferToVram(0);\n            data[0]++;\n        }\n        break;\n    case 5:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            MapPreview_Unload(data[11]);\n            SetBgAttribute(0, BG_ATTR_PRIORITY, data[2]);\n            SetGpuReg(REG_OFFSET_DISPCNT, data[3]);\n            SetGpuReg(REG_OFFSET_BLDCNT, data[4]);\n            SetGpuReg(REG_OFFSET_BLDALPHA, data[5]);\n            SetGpuReg(REG_OFFSET_WININ, data[6]);\n            SetGpuReg(REG_OFFSET_WINOUT, data[7]);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nconst struct MapPreviewScreen * GetDungeonMapPreviewScreenInfo(u8 mapsec)\n{\n    u8 idx;\n\n    idx = GetMapPreviewScreenIdx(mapsec);\n    if (idx == MPS_COUNT)\n    {\n        return NULL;\n    }\n    else\n    {\n        return &sMapPreviewScreenData[idx];\n    }\n}\n\nu16 MapPreview_GetDuration(u8 mapsec)\n{\n    u8 idx;\n    u16 flagId;\n\n    idx = GetMapPreviewScreenIdx(mapsec);\n    if (idx == MPS_COUNT)\n    {\n        return 0;\n    }\n    flagId = sMapPreviewScreenData[idx].flagId;\n    if (sMapPreviewScreenData[idx].type == MPS_TYPE_CAVE)\n    {\n        if (!FlagGet(flagId))\n        {\n            return 120;\n        }\n        else\n        {\n            return 40;\n        }\n    }\n    else {\n        if (sHasVisitedMapBefore)\n        {\n            return 120;\n        }\n        else\n        {\n            return 40;\n        }\n    }\n}\n\nvoid MapPreview_SetFlag(u16 flagId)\n{\n    if (!FlagGet(flagId))\n    {\n        sHasVisitedMapBefore = TRUE;\n    }\n    else\n    {\n        sHasVisitedMapBefore = FALSE;\n    }\n    FlagSet(flagId);\n}\n"
  },
  {
    "path": "src/math_util.c",
    "content": "#include \"global.h\"\n#include \"math_util.h\"\n\ns16 Q_8_8_mul(s16 x, s16 y)\n{\n    s32 result;\n\n    result = x;\n    result *= y;\n    result /= 256;\n    return result;\n}\n\ns16 Q_N_S_mul(u8 s, s16 x, s16 y)\n{\n    s32 result;\n\n    result = x;\n    result *= y;\n    result /= (1 << s);\n    return result;\n}\n\ns32 Q_24_8_mul(s32 x, s32 y)\n{\n    s64 result;\n\n    result = x;\n    result *= y;\n    result /= 256;\n    return result;\n}\n\ns16 Q_8_8_div(s16 x, s16 y)\n{\n    if (y == 0)\n    {\n        return 0;\n    }\n    return (x << 8) / y;\n}\n\ns16 Q_N_S_div(u8 s, s16 x, s16 y)\n{\n    if (y == 0)\n    {\n        return 0;\n    }\n    return (x << s) / y;\n}\n\ns32 Q_24_8_div(s32 x, s32 y)\n{\n    s64 _x;\n\n    if (y == 0)\n    {\n        return 0;\n    }\n    _x = x;\n    _x *= 256;\n    return _x / y;\n}\n\ns16 Q_8_8_inv(s16 y)\n{\n    s32 x;\n\n    x = 0x10000;\n    return x / y;\n}\n\ns16 Q_N_S_inv(u8 s, s16 y)\n{\n    s32 x;\n\n    x = 0x100 << s;\n    return x / y;\n}\n\ns32 Q_24_8_inv(s32 y)\n{\n    s64 x;\n\n    x = 0x10000;\n    return x / y;\n}\n"
  },
  {
    "path": "src/menu.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"menu.h\"\n#include \"menu_helpers.h\"\n#include \"strings.h\"\n#include \"text_window.h\"\n#include \"constants/songs.h\"\n\nstruct Menu\n{\n    u8 left;\n    u8 top;\n    s8 cursorPos;\n    s8 minCursorPos;\n    s8 maxCursorPos;\n    u8 windowId;\n    u8 fontId;\n    u8 optionWidth;\n    u8 optionHeight;\n    u8 columns;\n    u8 rows;\n    bool8 APressMuted;\n};\n\nstatic EWRAM_DATA struct Menu sMenu = {0};\nstatic EWRAM_DATA u16 sTileNum = 0;\nstatic EWRAM_DATA u8 sPaletteNum = 0;\nstatic EWRAM_DATA u8 sYesNoWindowId = 0;\nstatic EWRAM_DATA u8 sTopBarWindowId = 0;\n\nstatic void WindowFunc_DrawDialogFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);\nstatic void WindowFunc_ClearDialogWindowAndFrameNullPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);\nstatic void WindowFunc_DrawStdFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);\nstatic void WindowFunc_ClearStdWindowAndFrameToTransparent(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);\nstatic u8 MultichoiceGrid_MoveCursor(s8 deltaX, s8 deltaY);\n\nstatic const u8 sTopBarWindowTextColors[3] = {15, 1, 2};\n\nvoid DrawDialogFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 tileNum, u8 paletteNum)\n{\n    sTileNum = tileNum;\n    sPaletteNum = paletteNum;\n    CallWindowFunction(windowId, WindowFunc_DrawDialogFrameWithCustomTileAndPalette);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    PutWindowTilemap(windowId);\n    if (copyToVram == TRUE)\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\n// not used\nstatic void DrawDialogFrameWithCustomTile(u8 windowId, bool8 copyToVram, u16 tileNum)\n{\n    sTileNum = tileNum;\n    sPaletteNum = GetWindowAttribute(windowId, WINDOW_PALETTE_NUM);\n    CallWindowFunction(windowId, WindowFunc_DrawDialogFrameWithCustomTileAndPalette);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    PutWindowTilemap(windowId);\n    if (copyToVram == TRUE)\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void WindowFunc_DrawDialogFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)\n{\n    FillBgTilemapBufferRect(bg, sTileNum,                      tilemapLeft - 2,         tilemapTop - 1, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 1,                  tilemapLeft - 1,         tilemapTop - 1, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 2,                  tilemapLeft,             tilemapTop - 1, width, 1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 3,                  tilemapLeft + width,     tilemapTop - 1, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 4,                  tilemapLeft + width + 1, tilemapTop - 1, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 5,                  tilemapLeft - 2,         tilemapTop,     1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 6,                  tilemapLeft - 1,         tilemapTop,     1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 8,                  tilemapLeft + width,     tilemapTop,     1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 9,                  tilemapLeft + width + 1, tilemapTop,     1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 10,                 tilemapLeft - 2,         tilemapTop + 1, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 11,                 tilemapLeft - 1,         tilemapTop + 1, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 12,                 tilemapLeft + width,     tilemapTop + 1, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 13,                 tilemapLeft + width + 1, tilemapTop + 1, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 10), tilemapLeft - 2,         tilemapTop + 2, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 11), tilemapLeft - 1,         tilemapTop + 2, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 12), tilemapLeft + width,     tilemapTop + 2, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 13), tilemapLeft + width + 1, tilemapTop + 2, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 5),  tilemapLeft - 2,         tilemapTop + 3, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 6),  tilemapLeft - 1,         tilemapTop + 3, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 8),  tilemapLeft + width,     tilemapTop + 3, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 9),  tilemapLeft + width + 1, tilemapTop + 3, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum),      tilemapLeft - 2,         tilemapTop + 4, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 1),  tilemapLeft - 1,         tilemapTop + 4, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 2),  tilemapLeft,             tilemapTop + 4, width, 1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 3),  tilemapLeft + width,     tilemapTop + 4, 1,     1, sPaletteNum);\n    FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 4),  tilemapLeft + width + 1, tilemapTop + 4, 1,     1, sPaletteNum);\n}\n\nvoid ClearDialogWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram)\n{\n    // The palette slot doesn't matter, since the tiles are transparent.\n    CallWindowFunction(windowId, WindowFunc_ClearDialogWindowAndFrameNullPalette);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(0));\n    ClearWindowTilemap(windowId);\n    if (copyToVram == TRUE)\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void WindowFunc_ClearDialogWindowAndFrameNullPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)\n{\n    FillBgTilemapBufferRect(bg, 0, tilemapLeft - 2, tilemapTop - 1, width + 4, height + 2, 0);\n}\n\nvoid DrawStdFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 baseTileNum, u8 paletteNum)\n{\n    sTileNum = baseTileNum;\n    sPaletteNum = paletteNum;\n    CallWindowFunction(windowId, WindowFunc_DrawStdFrameWithCustomTileAndPalette);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    PutWindowTilemap(windowId);\n    if (copyToVram == TRUE)\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\n// not used\nstatic void DrawStdFrameWithCustomTile(u8 windowId, bool8 copyToVram, u16 baseTileNum)\n{\n    sTileNum = baseTileNum;\n    sPaletteNum = GetWindowAttribute(windowId, WINDOW_PALETTE_NUM);\n    CallWindowFunction(windowId, WindowFunc_DrawStdFrameWithCustomTileAndPalette);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    PutWindowTilemap(windowId);\n    if (copyToVram == TRUE)\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void WindowFunc_DrawStdFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)\n{\n    FillBgTilemapBufferRect(bg, sTileNum,     tilemapLeft - 1,     tilemapTop - 1,      1,     1,      sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 1, tilemapLeft,         tilemapTop - 1,      width, 1,      sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 2, tilemapLeft + width, tilemapTop - 1,      1,     1,      sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 3, tilemapLeft - 1,     tilemapTop,          1,     height, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 5, tilemapLeft + width, tilemapTop,          1,     height, sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 6, tilemapLeft - 1,     tilemapTop + height, 1,     1,      sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 7, tilemapLeft,         tilemapTop + height, width, 1,      sPaletteNum);\n    FillBgTilemapBufferRect(bg, sTileNum + 8, tilemapLeft + width, tilemapTop + height, 1,     1,      sPaletteNum);\n}\n\nvoid ClearStdWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram)\n{\n    CallWindowFunction(windowId, WindowFunc_ClearStdWindowAndFrameToTransparent);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(0));\n    ClearWindowTilemap(windowId);\n    if (copyToVram == TRUE)\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void WindowFunc_ClearStdWindowAndFrameToTransparent(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)\n{\n    FillBgTilemapBufferRect(bg, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, 0);\n}\n\n/*\n   The following functions are used for handling top bar window\n   in hall of fame screen and story mode screen before oak intro. \n   However, you can still designate a yPos value to place that bar\n   as well as the bar width.\n   The xPos is simply computed according to width (always right aligned). \n*/\nu8 CreateTopBarWindowLoadPalette(u8 bg, u8 width, u8 yPos, u8 palette, u16 baseTile)\n{\n    struct WindowTemplate window;\n\n    memset(&window, 0, sizeof(window));\n    if (bg > 3)\n        window.bg = 0;\n    else\n        window.bg = bg;\n    window.tilemapTop = yPos;\n    window.height = 2;\n    window.tilemapLeft = 0x1E - width;\n    window.width = width;\n    window.paletteNum = palette;\n    window.baseBlock = baseTile;\n    sTopBarWindowId = AddWindow(&window);\n    if (palette > 15)\n        palette = BG_PLTT_ID(15);\n    else\n        palette = BG_PLTT_ID(palette);\n    LoadPalette(GetTextWindowPalette(2), palette, PLTT_SIZE_4BPP);\n    return sTopBarWindowId;\n}\n\nvoid TopBarWindowPrintString(const u8 *string, u8 unused, bool8 copyToVram)\n{\n    s32 width;\n\n    if (sTopBarWindowId != 0xFF)\n    {\n        PutWindowTilemap(sTopBarWindowId);\n        FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15));\n        width = GetStringWidth(FONT_SMALL, string, 0);\n        AddTextPrinterParameterized3(sTopBarWindowId, FONT_SMALL, -20 - width, 1, sTopBarWindowTextColors, 0, string);\n        if (copyToVram)\n            CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL);\n    }\n}\n\nvoid TopBarWindowPrintTwoStrings(const u8 *string, const u8 *string2, bool8 fgColorChooser, u8 unused, bool8 copyToVram)\n{\n    u8 color[3];\n    s32 fgColor, width;\n\n    if ( sTopBarWindowId != 0xFF )\n    {\n        if (fgColorChooser)\n        {\n            color[0] = 0;\n            color[1] = 1;\n            color[2] = 2;\n        }\n        else\n        {\n            color[0] = 15;\n            color[1] = 1;\n            color[2] = 2;\n        }\n\n        PutWindowTilemap(sTopBarWindowId);\n        FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15));\n        if (string2)\n        {\n            width = GetStringWidth(FONT_SMALL, string2, 0);\n            AddTextPrinterParameterized3(sTopBarWindowId, FONT_SMALL, -20 - width, 1, color, 0, string2);\n        }\n        AddTextPrinterParameterized4(sTopBarWindowId, FONT_NORMAL_COPY_1, 4, 1, 0, 0, color, 0, string);\n        if (copyToVram)\n            CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL);\n    }\n}\n\n// not used\nstatic void CopyTopBarWindowToVram(void)\n{\n    if (sTopBarWindowId != 0xFF)\n        CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL);\n}\n\nvoid ClearTopBarWindow(void)\n{\n    if (sTopBarWindowId != 0xFF)\n    {\n        FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15));\n        CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL);\n    }\n}\n\nvoid DestroyTopBarWindow(void)\n{\n    if (sTopBarWindowId != 0xFF)\n    {\n        FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(0));\n        ClearWindowTilemap(sTopBarWindowId);\n        CopyWindowToVram(sTopBarWindowId, COPYWIN_FULL);\n        RemoveWindow(sTopBarWindowId);\n        sTopBarWindowId = 0xFF;\n    }\n}\n\nu8 Menu_InitCursorInternal(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos, bool8 APressMuted)\n{\n    s32 pos;\n\n    sMenu.left = left;\n    sMenu.top = top;\n    sMenu.minCursorPos = 0;\n    sMenu.maxCursorPos = numChoices - 1;\n    sMenu.windowId = windowId;\n    sMenu.fontId = fontId;\n    sMenu.optionHeight = cursorHeight;\n    sMenu.APressMuted = APressMuted;\n    pos = initialCursorPos;\n    if (pos < 0 || pos > sMenu.maxCursorPos)\n        sMenu.cursorPos = 0;\n    else\n        sMenu.cursorPos = pos;\n\n    Menu_MoveCursor(0);\n    return sMenu.cursorPos;\n}\n\nu8 Menu_InitCursor(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos)\n{\n    return Menu_InitCursorInternal(windowId, fontId, left, top, cursorHeight, numChoices, initialCursorPos, 0);\n}\n\n// Unused\nstatic u8 InitMenuDefaultCursorHeight(u8 windowId, u8 fontId, u8 left, u8 top, u8 numChoices, u8 initialCursorPos)\n{\n    return Menu_InitCursor(windowId, fontId, left, top, GetMenuCursorDimensionByFont(fontId, 1), numChoices, initialCursorPos);\n}\n\nstatic void Menu_RedrawCursor(u8 oldPos, u8 newPos)\n{\n    u8 width, height;\n\n    width = GetMenuCursorDimensionByFont(sMenu.fontId, 0);\n    height = GetMenuCursorDimensionByFont(sMenu.fontId, 1);\n    FillWindowPixelRect(sMenu.windowId, 1, sMenu.left, sMenu.optionHeight * oldPos + sMenu.top, width, height);\n    AddTextPrinterParameterized(sMenu.windowId, sMenu.fontId, gText_SelectorArrow2, sMenu.left, sMenu.optionHeight * newPos + sMenu.top, 0, 0);\n}\n\nu8 Menu_MoveCursor(s8 cursorDelta)\n{\n    u8 oldPos = sMenu.cursorPos;\n    s32 newPos = sMenu.cursorPos + cursorDelta;\n\n    if (newPos < sMenu.minCursorPos)\n        sMenu.cursorPos = sMenu.maxCursorPos;\n    else if (newPos > sMenu.maxCursorPos)\n        sMenu.cursorPos = sMenu.minCursorPos;\n    else\n        sMenu.cursorPos += cursorDelta;\n    Menu_RedrawCursor(oldPos, sMenu.cursorPos);\n    return sMenu.cursorPos;\n}\n\nu8 Menu_MoveCursorNoWrapAround(s8 cursorDelta)\n{\n    u8 oldPos = sMenu.cursorPos;\n    s32 newPos = sMenu.cursorPos + cursorDelta;\n\n    if (newPos < sMenu.minCursorPos)\n        sMenu.cursorPos = sMenu.minCursorPos;\n    else if (newPos > sMenu.maxCursorPos)\n        sMenu.cursorPos = sMenu.maxCursorPos;\n    else\n        sMenu.cursorPos += cursorDelta;\n\n    Menu_RedrawCursor(oldPos, sMenu.cursorPos);\n    return sMenu.cursorPos;\n}\n\nu8 Menu_GetCursorPos(void)\n{\n    return sMenu.cursorPos;\n}\n\ns8 Menu_ProcessInput(void)\n{\n    if (JOY_NEW(A_BUTTON))\n    {\n        if (!sMenu.APressMuted)\n            PlaySE(SE_SELECT);\n        return sMenu.cursorPos;\n    }\n    if (JOY_NEW(B_BUTTON))\n    {\n        return MENU_B_PRESSED;\n    }\n    if (JOY_NEW(DPAD_UP))\n    {\n        PlaySE(SE_SELECT);\n        Menu_MoveCursor(-1);\n        return MENU_NOTHING_CHOSEN;\n    }\n    if (JOY_NEW(DPAD_DOWN))\n    {\n        PlaySE(SE_SELECT);\n        Menu_MoveCursor(1);\n        return MENU_NOTHING_CHOSEN;\n    }\n    return MENU_NOTHING_CHOSEN;\n}\n\ns8 Menu_ProcessInputNoWrapAround(void)\n{\n    u8 oldPos = sMenu.cursorPos;\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        if (!sMenu.APressMuted)\n            PlaySE(SE_SELECT);\n        return sMenu.cursorPos;\n    }\n    if (JOY_NEW(B_BUTTON))\n    {\n        return MENU_B_PRESSED;\n    }\n    if (JOY_NEW(DPAD_UP))\n    {\n        if (oldPos != Menu_MoveCursorNoWrapAround(-1))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    if (JOY_NEW(DPAD_DOWN))\n    {\n        if (oldPos != Menu_MoveCursorNoWrapAround(1))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    return MENU_NOTHING_CHOSEN;\n}\n\ns16 Menu_ProcessInputNoWrapAround2(void)\n{\n    u16 oldPos = sMenu.cursorPos;\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        if (!sMenu.APressMuted)\n            PlaySE(SE_SELECT);\n        return sMenu.cursorPos;\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        return MENU_B_PRESSED;\n    }\n    else if (JOY_NEW(DPAD_UP))\n    {\n        if (oldPos != Menu_MoveCursorNoWrapAround(-1))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_NEW(DPAD_DOWN))\n    {\n        if (oldPos != Menu_MoveCursorNoWrapAround(1))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    return MENU_NOTHING_CHOSEN;\n}\n\ns8 Menu_ProcessInput_other(void)\n{\n    if (JOY_NEW(A_BUTTON))\n    {\n        if (!sMenu.APressMuted)\n            PlaySE(SE_SELECT);\n        return sMenu.cursorPos;\n    }\n    if (JOY_NEW(B_BUTTON))\n    {\n        return MENU_B_PRESSED;\n    }\n    if (JOY_REPT(DPAD_ANY) == DPAD_UP)\n    {\n        PlaySE(SE_SELECT);\n        Menu_MoveCursor(-1);\n        return MENU_NOTHING_CHOSEN;\n    }\n    if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)\n    {\n        PlaySE(SE_SELECT);\n        Menu_MoveCursor(1);\n        return MENU_NOTHING_CHOSEN;\n    }\n    return MENU_NOTHING_CHOSEN;\n}\n\ns8 Menu_ProcessInputNoWrapAround_other(void)\n{\n    u8 oldPos = sMenu.cursorPos;\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        if (!sMenu.APressMuted)\n            PlaySE(SE_SELECT);\n        return sMenu.cursorPos;\n    }\n    if (JOY_NEW(B_BUTTON))\n    {\n        return MENU_B_PRESSED;\n    }\n    if (JOY_REPT(DPAD_ANY) == DPAD_UP)\n    {\n        if (oldPos != Menu_MoveCursorNoWrapAround(-1))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)\n    {\n        if (oldPos != Menu_MoveCursorNoWrapAround(1))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    return MENU_NOTHING_CHOSEN;\n}\n\nvoid PrintTextArray(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs)\n{\n    u32 i;\n\n    for (i = 0; i < itemCount; i++)\n        AddTextPrinterParameterized(windowId, fontId, strs[i].text, left, (lineHeight * i) + top, 0xFF, NULL);\n    CopyWindowToVram(windowId, COPYWIN_GFX);\n}\n\nvoid MultichoiceList_PrintItems(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, u8 letterSpacing, u8 lineSpacing)\n{\n    u32 i;\n\n    for (i = 0; i < itemCount; i++)\n        AddTextPrinterParameterized5(windowId, fontId, strs[i].text, left, (lineHeight * i) + top, 0xFF, NULL, letterSpacing, lineSpacing);\n    CopyWindowToVram(windowId, COPYWIN_GFX);\n}\n\nvoid PrintMenuTable(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs)\n{\n    u8 left = GetMenuCursorDimensionByFont(fontId, 0);\n\n    PrintTextArray(windowId, fontId, left, 0, lineHeight, itemCount, strs);\n}\n\nvoid AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *orderArray)\n{\n    u32 i;\n    struct TextPrinterTemplate printer;\n\n    printer.windowId = windowId;\n    printer.fontId = fontId;\n    printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND);\n    printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND);\n    printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW);\n    printer.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN);\n    printer.letterSpacing = letterSpacing;\n    printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING);\n    printer.x = left;\n    printer.currentX = left;\n    for (i = 0; i < itemCount; i++)\n    {\n        printer.currentChar = strs[orderArray[i]].text;\n        printer.y = (lineHeight * i) + top;\n        printer.currentY = printer.y;\n        AddTextPrinter(&printer, 0xFF, NULL);\n    }\n    CopyWindowToVram(windowId, COPYWIN_GFX);\n}\n\n// Unused\nstatic void PrintMenuActionTextsAtTopById(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *orderArray)\n{\n    AddItemMenuActionTextPrinters(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 0, GetFontAttribute(fontId, FONTATTR_LETTER_SPACING), lineHeight, itemCount, strs, orderArray);\n}\n\nstruct WindowTemplate SetWindowTemplateFields(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock)\n{\n    struct WindowTemplate template;\n\n    template.bg = bg;\n    template.tilemapLeft = left;\n    template.tilemapTop = top;\n    template.width = width;\n    template.height = height;\n    template.paletteNum = paletteNum;\n    template.baseBlock = baseBlock;\n    return template;\n}\n\n// not used\nstatic u16 CreateWindowTemplate(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock)\n{\n    struct WindowTemplate template = SetWindowTemplateFields(bg, left, top, width, height, paletteNum, baseBlock);\n    return AddWindow(&template);\n}\n\nvoid CreateYesNoMenu(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos)\n{\n    struct TextPrinterTemplate textSubPrinter;\n\n    sYesNoWindowId = AddWindow(window);\n    DrawStdFrameWithCustomTileAndPalette(sYesNoWindowId, 1, baseTileNum, paletteNum);\n    textSubPrinter.currentChar = gText_YesNo;\n    textSubPrinter.windowId = sYesNoWindowId;\n    textSubPrinter.fontId = fontId;\n    textSubPrinter.x = GetMenuCursorDimensionByFont(fontId, 0) + left;\n    textSubPrinter.y = top;\n    textSubPrinter.currentX = textSubPrinter.x;\n    textSubPrinter.currentY = textSubPrinter.y;\n    textSubPrinter.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND);\n    textSubPrinter.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND);\n    textSubPrinter.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW);\n    textSubPrinter.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN);\n    textSubPrinter.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING);\n    textSubPrinter.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING);\n    AddTextPrinter(&textSubPrinter, 0xFF, NULL);\n    Menu_InitCursor(sYesNoWindowId, fontId, left, top, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT) + textSubPrinter.lineSpacing, 2, initialCursorPos);\n}\n\n// not used\nstatic void CreateYesNoMenu2(const struct WindowTemplate *window, u8 fontId, u16 baseTileNum, u8 initialCursorPos)\n{\n    CreateYesNoMenu(window, fontId, 0, 0, baseTileNum, initialCursorPos, 0);\n}\n\ns8 Menu_ProcessInputNoWrapClearOnChoose(void)\n{\n    s8 result = Menu_ProcessInputNoWrapAround();\n    if (result != MENU_NOTHING_CHOSEN)\n        DestroyYesNoMenu();\n    return result;\n}\n\nvoid DestroyYesNoMenu(void)\n{\n    ClearStdWindowAndFrameToTransparent(sYesNoWindowId, TRUE);\n    RemoveWindow(sYesNoWindowId);\n}\n\nvoid MultichoiceGrid_PrintItems(u8 windowId, u8 fontId, u8 itemWidth, u8 itemHeight, u8 cols, u8 rows, const struct MenuAction *strs)\n{\n    u8 width, i, j, yOffset;\n\n    fontId = fontId;\n    itemWidth = itemWidth;\n    itemHeight = itemHeight;\n    width = GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH);\n    yOffset = (16 - GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT)) / 2;\n    for (i = 0; i < rows; ++i)\n        for (j = 0; j < cols; ++j)\n            AddTextPrinterParameterized(windowId, fontId, strs[i * cols + j].text, itemWidth * j + width, yOffset + itemHeight * i, 0xFF, 0);\n    CopyWindowToVram(windowId, COPYWIN_GFX);\n}\n\n//not used\nstatic void MultichoiceGrid_PrintItemsCustomOrder(u8 windowId, u8 fontId, u8 itemWidth, u8 itemHeight, u8 cols, u8 rows, const struct MenuAction *strs, const u8 *orderArray)\n{\n    u8 width, i, j;\n\n    fontId = fontId;\n    itemWidth = itemWidth;\n    itemHeight = itemHeight;\n    width = GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH);\n    for (i = 0; i < rows; ++i)\n        for (j = 0; j < cols; ++j)\n            AddTextPrinterParameterized(windowId, fontId, strs[orderArray[i * cols + j]].text, itemWidth * j + width, itemHeight * i, 0xFF, 0);\n    CopyWindowToVram(windowId, COPYWIN_GFX);\n}\n\nstatic u8 MultichoiceGrid_InitCursorInternal(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 cursorHeight, u8 cols, u8 rows, u8 numChoices, u8 cursorPos)\n{\n    s32 pos;\n\n    sMenu.left = left;\n    sMenu.top = top;\n    sMenu.minCursorPos = 0;\n    sMenu.maxCursorPos = numChoices - 1;\n    sMenu.windowId = windowId;\n    sMenu.fontId = fontId;\n    sMenu.optionWidth = optionWidth;\n    sMenu.optionHeight = cursorHeight;\n    sMenu.columns = cols;\n    sMenu.rows = rows;\n    pos = cursorPos;\n    if (pos < 0 || pos > sMenu.maxCursorPos)\n        sMenu.cursorPos = 0;\n    else\n        sMenu.cursorPos = pos;\n    MultichoiceGrid_MoveCursor(0, 0);\n    return sMenu.cursorPos;\n}\n\nu8 MultichoiceGrid_InitCursor(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 cols, u8 rows, u8 cursorPos)\n{\n    s32 cursorHeight = 16;\n    u8 numChoices = cols * rows;\n\n    return MultichoiceGrid_InitCursorInternal(windowId, fontId, left, top, optionWidth, cursorHeight, cols, rows, numChoices, cursorPos);\n}\n\nstatic void MultichoiceGrid_RedrawCursor(u8 oldCursorPos, u8 newCursorPos)\n{\n    u8 cursorWidth = GetMenuCursorDimensionByFont(sMenu.fontId, 0);\n    u8 cursorHeight = GetMenuCursorDimensionByFont(sMenu.fontId, 1);\n    u8 xPos = (oldCursorPos % sMenu.columns) * sMenu.optionWidth + sMenu.left;\n    u8 yPos = (oldCursorPos / sMenu.columns) * sMenu.optionHeight + sMenu.top;\n    \n    FillWindowPixelRect(sMenu.windowId, PIXEL_FILL(1), xPos, yPos, cursorWidth, cursorHeight);\n    xPos = (newCursorPos % sMenu.columns) * sMenu.optionWidth + sMenu.left;\n    yPos = (newCursorPos / sMenu.columns) * sMenu.optionHeight + sMenu.top;\n    AddTextPrinterParameterized(sMenu.windowId, sMenu.fontId, gText_SelectorArrow2, xPos, yPos, 0, 0);\n}\n\nstatic u8 MultichoiceGrid_MoveCursor(s8 deltaX, s8 deltaY)\n{\n    u8 oldPos = sMenu.cursorPos;\n\n    if (deltaX)\n    {\n        if ((sMenu.cursorPos % sMenu.columns) + deltaX < 0)\n            sMenu.cursorPos += sMenu.columns - 1;\n        else if ((sMenu.cursorPos % sMenu.columns) + deltaX >= sMenu.columns)\n            sMenu.cursorPos = (sMenu.cursorPos / sMenu.columns) * sMenu.columns;\n        else\n            sMenu.cursorPos += deltaX;\n    }\n    if (deltaY)\n    {\n        if ((sMenu.cursorPos / sMenu.columns) + deltaY < 0)\n            sMenu.cursorPos += sMenu.columns * (sMenu.rows - 1);\n        else if ((sMenu.cursorPos / sMenu.columns) + deltaY >= sMenu.rows)\n            sMenu.cursorPos -= sMenu.columns * (sMenu.rows - 1);\n        else\n            sMenu.cursorPos += (sMenu.columns * deltaY);\n    }\n    if (sMenu.cursorPos > sMenu.maxCursorPos)\n    {\n        sMenu.cursorPos = oldPos;\n        return sMenu.cursorPos;\n    }\n    else\n    {\n        MultichoiceGrid_RedrawCursor(oldPos, sMenu.cursorPos);\n        return sMenu.cursorPos;\n    }\n}\n\nstatic u8 MultichoiceGrid_MoveCursorIfValid(s8 deltaX, s8 deltaY)\n{\n    u8 oldPos = sMenu.cursorPos;\n\n    if (deltaX)\n    {\n        if (((sMenu.cursorPos % sMenu.columns) + deltaX >= 0) && ((sMenu.cursorPos % sMenu.columns) + deltaX < sMenu.columns))\n            sMenu.cursorPos += deltaX;\n    }\n    if (deltaY)\n    {\n        if (((sMenu.cursorPos / sMenu.columns) + deltaY >= 0) && ((sMenu.cursorPos / sMenu.columns) + deltaY < sMenu.rows))\n            sMenu.cursorPos += (sMenu.columns * deltaY);\n    }\n    if (sMenu.cursorPos > sMenu.maxCursorPos)\n    {\n        sMenu.cursorPos = oldPos;\n        return sMenu.cursorPos;\n    }\n    else\n    {\n        MultichoiceGrid_RedrawCursor(oldPos, sMenu.cursorPos);\n        return sMenu.cursorPos;\n    }\n}\n\n// Unused\nstatic s8 Menu_ProcessGridInput_NoSoundLimit(void)\n{\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        return sMenu.cursorPos;\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        return MENU_B_PRESSED;\n    }\n    else if (JOY_NEW(DPAD_UP))\n    {\n        PlaySE(SE_SELECT);\n        MultichoiceGrid_MoveCursor(0, -1);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_NEW(DPAD_DOWN))\n    {\n        PlaySE(SE_SELECT);\n        MultichoiceGrid_MoveCursor(0, 1);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_NEW(DPAD_LEFT) || GetLRKeysPressed() == MENU_L_PRESSED)\n    {\n        PlaySE(SE_SELECT);\n        MultichoiceGrid_MoveCursor(-1, 0);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_NEW(DPAD_RIGHT) || GetLRKeysPressed() == MENU_R_PRESSED)\n    {\n        PlaySE(SE_SELECT);\n        MultichoiceGrid_MoveCursor(1, 0);\n        return MENU_NOTHING_CHOSEN;\n    }\n    return MENU_NOTHING_CHOSEN;\n}\n\ns8 Menu_ProcessInputGridLayout(void)\n{\n    u8 oldPos = sMenu.cursorPos;\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        return sMenu.cursorPos;\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        return MENU_B_PRESSED;\n    }\n    else if (JOY_NEW(DPAD_UP))\n    {\n        if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, -1))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_NEW(DPAD_DOWN))\n    {\n        if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, 1))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_NEW(DPAD_LEFT) || GetLRKeysPressed() == MENU_L_PRESSED)\n    {\n        if (oldPos != MultichoiceGrid_MoveCursorIfValid(-1, 0))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_NEW(DPAD_RIGHT) || GetLRKeysPressed() == MENU_R_PRESSED)\n    {\n        if (oldPos != MultichoiceGrid_MoveCursorIfValid(1, 0))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    return MENU_NOTHING_CHOSEN;\n}\n\n// Unused\nstatic s8 Menu_ProcessGridInputRepeat_NoSoundLimit(void)\n{\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        return sMenu.cursorPos;\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        return MENU_B_PRESSED;\n    }\n    else if (JOY_REPT(DPAD_ANY) == DPAD_UP)\n    {\n        PlaySE(SE_SELECT);\n        MultichoiceGrid_MoveCursor(0, -1);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)\n    {\n        PlaySE(SE_SELECT);\n        MultichoiceGrid_MoveCursor(0, 1);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_REPT(DPAD_ANY) == DPAD_LEFT || GetLRKeysPressedAndHeld() == MENU_L_PRESSED)\n    {\n        PlaySE(SE_SELECT);\n        MultichoiceGrid_MoveCursor(-1, 0);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_REPT(DPAD_ANY) == DPAD_RIGHT || GetLRKeysPressedAndHeld() == MENU_R_PRESSED)\n    {\n        PlaySE(SE_SELECT);\n        MultichoiceGrid_MoveCursor(1, 0);\n        return MENU_NOTHING_CHOSEN;\n    }\n\n    return MENU_NOTHING_CHOSEN;\n}\n\n// Unused\nstatic s8 Menu_ProcessGridInputRepeat(void)\n{\n    u8 oldPos = sMenu.cursorPos;\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        return sMenu.cursorPos;\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        return MENU_B_PRESSED;\n    }\n    else if (JOY_REPT(DPAD_ANY) == DPAD_UP)\n    {\n        if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, -1))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)\n    {\n        if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, 1))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_REPT(DPAD_ANY) == DPAD_LEFT || GetLRKeysPressedAndHeld() == MENU_L_PRESSED)\n    {\n        if (oldPos != MultichoiceGrid_MoveCursorIfValid(-1, 0))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    else if (JOY_REPT(DPAD_ANY) == DPAD_RIGHT || GetLRKeysPressedAndHeld() == MENU_R_PRESSED)\n    {\n        if (oldPos != MultichoiceGrid_MoveCursorIfValid(1, 0))\n            PlaySE(SE_SELECT);\n        return MENU_NOTHING_CHOSEN;\n    }\n    return MENU_NOTHING_CHOSEN;\n}\n"
  },
  {
    "path": "src/menu2.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"wild_encounter.h\"\n\n// Not actually \"old\" given these were introduced in Gen 3,\n// but they're used as equivalents here alongside the other OLD_UNOWN\n#define SPECIES_OLD_UNOWN_EMARK (NUM_SPECIES + 0)\n#define SPECIES_OLD_UNOWN_QMARK (NUM_SPECIES + 1)\n\nstatic void Task_SmoothBlendLayers(u8 taskId);\n\nstatic const u8 sMonSpriteAnchorCoords[][5] = {\n    [SPECIES_BULBASAUR       - 1] = {0x16, 0x1b, 0x30, 0x16, 0x29},\n    [SPECIES_IVYSAUR         - 1] = {0x14, 0x1b, 0x30, 0x15, 0x2a},\n    [SPECIES_VENUSAUR        - 1] = {0x1b, 0x20, 0x20, 0x1b, 0x33},\n    [SPECIES_CHARMANDER      - 1] = {0x14, 0x0f, 0x38, 0x13, 0x1e},\n    [SPECIES_CHARMELEON      - 1] = {0x0d, 0x11, 0x30, 0x0f, 0x22},\n    [SPECIES_CHARIZARD       - 1] = {0x1b, 0x07, 0x28, 0x1a, 0x19},\n    [SPECIES_SQUIRTLE        - 1] = {0x19, 0x13, 0x30, 0x1a, 0x22},\n    [SPECIES_WARTORTLE       - 1] = {0x16, 0x13, 0x30, 0x17, 0x21},\n    [SPECIES_BLASTOISE       - 1] = {0x12, 0x08, 0x28, 0x15, 0x19},\n    [SPECIES_CATERPIE        - 1] = {0x15, 0x14, 0x30, 0x13, 0x24},\n    [SPECIES_METAPOD         - 1] = {0x13, 0x1d, 0x30, 0x18, 0x2a},\n    [SPECIES_BUTTERFREE      - 1] = {0x12, 0x1b, 0x08, 0x12, 0x2a},\n    [SPECIES_WEEDLE          - 1] = {0x16, 0x1c, 0x30, 0x15, 0x2b},\n    [SPECIES_KAKUNA          - 1] = {0x19, 0x13, 0x30, 0x1a, 0x24},\n    [SPECIES_BEEDRILL        - 1] = {0x19, 0x16, 0x08, 0x19, 0x25},\n    [SPECIES_PIDGEY          - 1] = {0x15, 0x12, 0x30, 0x12, 0x1e},\n    [SPECIES_PIDGEOTTO       - 1] = {0x24, 0x0e, 0x30, 0x1f, 0x1e},\n    [SPECIES_PIDGEOT         - 1] = {0x0c, 0x13, 0x08, 0x0a, 0x23},\n    [SPECIES_RATTATA         - 1] = {0x17, 0x1e, 0x30, 0x18, 0x2d},\n    [SPECIES_RATICATE        - 1] = {0x12, 0x14, 0x30, 0x10, 0x26},\n    [SPECIES_SPEAROW         - 1] = {0x15, 0x14, 0x30, 0x15, 0x1f},\n    [SPECIES_FEAROW          - 1] = {0x0c, 0x27, 0x00, 0x0b, 0x3f},\n    [SPECIES_EKANS           - 1] = {0x11, 0x0f, 0x30, 0x14, 0x1d},\n    [SPECIES_ARBOK           - 1] = {0x1b, 0x01, 0x28, 0x1d, 0x10},\n    [SPECIES_PIKACHU         - 1] = {0x19, 0x13, 0x30, 0x1a, 0x1f},\n    [SPECIES_RAICHU          - 1] = {0x19, 0x14, 0x28, 0x1c, 0x22},\n    [SPECIES_SANDSHREW       - 1] = {0x17, 0x16, 0x30, 0x18, 0x25},\n    [SPECIES_SANDSLASH       - 1] = {0x11, 0x13, 0x28, 0x13, 0x22},\n    [SPECIES_NIDORAN_F       - 1] = {0x16, 0x15, 0x30, 0x18, 0x21},\n    [SPECIES_NIDORINA        - 1] = {0x1f, 0x17, 0x30, 0x1e, 0x28},\n    [SPECIES_NIDOQUEEN       - 1] = {0x10, 0x0b, 0x28, 0x13, 0x1c},\n    [SPECIES_NIDORAN_M       - 1] = {0x15, 0x22, 0x28, 0x15, 0x31},\n    [SPECIES_NIDORINO        - 1] = {0x13, 0x1e, 0x28, 0x1b, 0x2d},\n    [SPECIES_NIDOKING        - 1] = {0x12, 0x15, 0x28, 0x13, 0x27},\n    [SPECIES_CLEFAIRY        - 1] = {0x19, 0x14, 0x30, 0x1b, 0x24},\n    [SPECIES_CLEFABLE        - 1] = {0x1c, 0x12, 0x30, 0x1d, 0x21},\n    [SPECIES_VULPIX          - 1] = {0x10, 0x16, 0x30, 0x0e, 0x25},\n    [SPECIES_NINETALES       - 1] = {0x28, 0x10, 0x28, 0x27, 0x1e},\n    [SPECIES_JIGGLYPUFF      - 1] = {0x1d, 0x15, 0x30, 0x1e, 0x25},\n    [SPECIES_WIGGLYTUFF      - 1] = {0x1a, 0x12, 0x30, 0x1c, 0x22},\n    [SPECIES_ZUBAT           - 1] = {0x14, 0x1d, 0x08, 0x14, 0x29},\n    [SPECIES_GOLBAT          - 1] = {0x23, 0x1a, 0x00, 0x21, 0x2e},\n    [SPECIES_ODDISH          - 1] = {0x1d, 0x20, 0x28, 0x1d, 0x2b},\n    [SPECIES_GLOOM           - 1] = {0x1c, 0x18, 0x28, 0x1c, 0x27},\n    [SPECIES_VILEPLUME       - 1] = {0x1c, 0x1e, 0x28, 0x1d, 0x2a},\n    [SPECIES_PARAS           - 1] = {0x1d, 0x1a, 0x30, 0x1c, 0x27},\n    [SPECIES_PARASECT        - 1] = {0x1e, 0x1c, 0x28, 0x20, 0x2e},\n    [SPECIES_VENONAT         - 1] = {0x1b, 0x16, 0x10, 0x1a, 0x29},\n    [SPECIES_VENOMOTH        - 1] = {0x12, 0x19, 0x08, 0x16, 0x27},\n    [SPECIES_DIGLETT         - 1] = {0x1e, 0x16, 0x30, 0x1c, 0x23},\n    [SPECIES_DUGTRIO         - 1] = {0x1a, 0x11, 0x30, 0x1a, 0x1f},\n    [SPECIES_MEOWTH          - 1] = {0x1c, 0x16, 0x30, 0x1c, 0x23},\n    [SPECIES_PERSIAN         - 1] = {0x13, 0x13, 0x30, 0x13, 0x21},\n    [SPECIES_PSYDUCK         - 1] = {0x1c, 0x13, 0x30, 0x17, 0x29},\n    [SPECIES_GOLDUCK         - 1] = {0x17, 0x12, 0x28, 0x17, 0x22},\n    [SPECIES_MANKEY          - 1] = {0x1c, 0x15, 0x30, 0x1b, 0x23},\n    [SPECIES_PRIMEAPE        - 1] = {0x1e, 0x16, 0x30, 0x1a, 0x27},\n    [SPECIES_GROWLITHE       - 1] = {0x14, 0x17, 0x30, 0x14, 0x24},\n    [SPECIES_ARCANINE        - 1] = {0x0f, 0x09, 0x28, 0x0c, 0x19},\n    [SPECIES_POLIWAG         - 1] = {0x15, 0x14, 0x30, 0x13, 0x1f},\n    [SPECIES_POLIWHIRL       - 1] = {0x1f, 0x10, 0x30, 0x1e, 0x17},\n    [SPECIES_POLIWRATH       - 1] = {0x22, 0x0c, 0x30, 0x21, 0x18},\n    [SPECIES_ABRA            - 1] = {0x1f, 0x13, 0x30, 0x1f, 0x21},\n    [SPECIES_KADABRA         - 1] = {0x1b, 0x12, 0x30, 0x1c, 0x25},\n    [SPECIES_ALAKAZAM        - 1] = {0x1c, 0x11, 0x28, 0x1d, 0x26},\n    [SPECIES_MACHOP          - 1] = {0x1b, 0x11, 0x30, 0x1b, 0x1e},\n    [SPECIES_MACHOKE         - 1] = {0x1d, 0x11, 0x30, 0x1d, 0x1f},\n    [SPECIES_MACHAMP         - 1] = {0x1a, 0x0d, 0x28, 0x1c, 0x1b},\n    [SPECIES_BELLSPROUT      - 1] = {0x15, 0x0e, 0x30, 0x0e, 0x1c},\n    [SPECIES_WEEPINBELL      - 1] = {0x1a, 0x1c, 0x10, 0x15, 0x32},\n    [SPECIES_VICTREEBEL      - 1] = {0x1e, 0x0f, 0x30, 0x1c, 0x1b},\n    [SPECIES_TENTACOOL       - 1] = {0x1a, 0x15, 0x30, 0x1e, 0x26},\n    [SPECIES_TENTACRUEL      - 1] = {0x1b, 0x10, 0x28, 0x1c, 0x26},\n    [SPECIES_GEODUDE         - 1] = {0x1c, 0x20, 0x28, 0x1d, 0x2d},\n    [SPECIES_GRAVELER        - 1] = {0x1d, 0x19, 0x28, 0x1e, 0x26},\n    [SPECIES_GOLEM           - 1] = {0x19, 0x1b, 0x28, 0x1c, 0x27},\n    [SPECIES_PONYTA          - 1] = {0x0f, 0x11, 0x30, 0x0e, 0x23},\n    [SPECIES_RAPIDASH        - 1] = {0x2f, 0x0f, 0x28, 0x2b, 0x1e},\n    [SPECIES_SLOWPOKE        - 1] = {0x14, 0x1f, 0x28, 0x15, 0x2f},\n    [SPECIES_SLOWBRO         - 1] = {0x0e, 0x0d, 0x28, 0x0c, 0x1f},\n    [SPECIES_MAGNEMITE       - 1] = {0x20, 0x1b, 0x10, 0x1f, 0x29},\n    [SPECIES_MAGNETON        - 1] = {0x1f, 0x14, 0x08, 0x1f, 0x22},\n    [SPECIES_FARFETCHD       - 1] = {0x16, 0x14, 0x30, 0x16, 0x29},\n    [SPECIES_DODUO           - 1] = {0x11, 0x16, 0x30, 0x0d, 0x2c},\n    [SPECIES_DODRIO          - 1] = {0x1d, 0x04, 0x28, 0x0e, 0x07},\n    [SPECIES_SEEL            - 1] = {0x1b, 0x24, 0x20, 0x17, 0x35},\n    [SPECIES_DEWGONG         - 1] = {0x12, 0x0a, 0x30, 0x0e, 0x1a},\n    [SPECIES_GRIMER          - 1] = {0x1f, 0x10, 0x30, 0x1d, 0x25},\n    [SPECIES_MUK             - 1] = {0x17, 0x0f, 0x30, 0x19, 0x22},\n    [SPECIES_SHELLDER        - 1] = {0x1a, 0x18, 0x30, 0x17, 0x29},\n    [SPECIES_CLOYSTER        - 1] = {0x19, 0x1e, 0x28, 0x1d, 0x2c},\n    [SPECIES_GASTLY          - 1] = {0x1a, 0x1f, 0x08, 0x19, 0x30},\n    [SPECIES_HAUNTER         - 1] = {0x20, 0x14, 0x08, 0x1d, 0x26},\n    [SPECIES_GENGAR          - 1] = {0x1a, 0x16, 0x30, 0x19, 0x28},\n    [SPECIES_ONIX            - 1] = {0x1f, 0x24, 0x20, 0x28, 0x36},\n    [SPECIES_DROWZEE         - 1] = {0x1a, 0x0e, 0x30, 0x1a, 0x1e},\n    [SPECIES_HYPNO           - 1] = {0x1c, 0x12, 0x30, 0x19, 0x24},\n    [SPECIES_KRABBY          - 1] = {0x1d, 0x1d, 0x30, 0x1a, 0x2b},\n    [SPECIES_KINGLER         - 1] = {0x1e, 0x1f, 0x28, 0x1c, 0x30},\n    [SPECIES_VOLTORB         - 1] = {0x1c, 0x1b, 0x30, 0x1b, 0x2b},\n    [SPECIES_ELECTRODE       - 1] = {0x1c, 0x18, 0x30, 0x1d, 0x2e},\n    [SPECIES_EXEGGCUTE       - 1] = {0x21, 0x17, 0x30, 0x20, 0x24},\n    [SPECIES_EXEGGUTOR       - 1] = {0x1c, 0x17, 0x28, 0x1b, 0x25},\n    [SPECIES_CUBONE          - 1] = {0x1b, 0x12, 0x30, 0x1b, 0x22},\n    [SPECIES_MAROWAK         - 1] = {0x14, 0x0f, 0x30, 0x11, 0x23},\n    [SPECIES_HITMONLEE       - 1] = {0x2e, 0x11, 0x30, 0x28, 0x22},\n    [SPECIES_HITMONCHAN      - 1] = {0x22, 0x0e, 0x30, 0x1e, 0x1d},\n    [SPECIES_LICKITUNG       - 1] = {0x14, 0x11, 0x30, 0x14, 0x24},\n    [SPECIES_KOFFING         - 1] = {0x1e, 0x14, 0x10, 0x1d, 0x20},\n    [SPECIES_WEEZING         - 1] = {0x11, 0x0d, 0x10, 0x0f, 0x1c},\n    [SPECIES_RHYHORN         - 1] = {0x0e, 0x23, 0x20, 0x14, 0x33},\n    [SPECIES_RHYDON          - 1] = {0x0d, 0x12, 0x28, 0x17, 0x22},\n    [SPECIES_CHANSEY         - 1] = {0x1a, 0x0d, 0x30, 0x1a, 0x1a},\n    [SPECIES_TANGELA         - 1] = {0x1c, 0x18, 0x30, 0x1d, 0x29},\n    [SPECIES_KANGASKHAN      - 1] = {0x1b, 0x06, 0x28, 0x1c, 0x14},\n    [SPECIES_HORSEA          - 1] = {0x1c, 0x14, 0x30, 0x16, 0x23},\n    [SPECIES_SEADRA          - 1] = {0x10, 0x17, 0x30, 0x09, 0x2a},\n    [SPECIES_GOLDEEN         - 1] = {0x16, 0x23, 0x20, 0x15, 0x34},\n    [SPECIES_SEAKING         - 1] = {0x16, 0x0f, 0x30, 0x10, 0x18},\n    [SPECIES_STARYU          - 1] = {0x1c, 0x18, 0x30, 0x1a, 0x26},\n    [SPECIES_STARMIE         - 1] = {0x1d, 0x13, 0x30, 0x1b, 0x20},\n    [SPECIES_MR_MIME         - 1] = {0x24, 0x11, 0x30, 0x25, 0x1e},\n    [SPECIES_SCYTHER         - 1] = {0x10, 0x19, 0x28, 0x12, 0x27},\n    [SPECIES_JYNX            - 1] = {0x1b, 0x0f, 0x30, 0x19, 0x1c},\n    [SPECIES_ELECTABUZZ      - 1] = {0x14, 0x11, 0x30, 0x17, 0x20},\n    [SPECIES_MAGMAR          - 1] = {0x10, 0x0e, 0x30, 0x0b, 0x19},\n    [SPECIES_PINSIR          - 1] = {0x1d, 0x1c, 0x28, 0x20, 0x2b},\n    [SPECIES_TAUROS          - 1] = {0x11, 0x1d, 0x28, 0x13, 0x2e},\n    [SPECIES_MAGIKARP        - 1] = {0x16, 0x15, 0x30, 0x13, 0x23},\n    [SPECIES_GYARADOS        - 1] = {0x0b, 0x18, 0x28, 0x16, 0x29},\n    [SPECIES_LAPRAS          - 1] = {0x16, 0x08, 0x28, 0x15, 0x16},\n    [SPECIES_DITTO           - 1] = {0x24, 0x12, 0x30, 0x1f, 0x20},\n    [SPECIES_EEVEE           - 1] = {0x16, 0x16, 0x30, 0x16, 0x23},\n    [SPECIES_VAPOREON        - 1] = {0x18, 0x23, 0x28, 0x18, 0x30},\n    [SPECIES_JOLTEON         - 1] = {0x14, 0x1b, 0x30, 0x16, 0x28},\n    [SPECIES_FLAREON         - 1] = {0x16, 0x17, 0x30, 0x14, 0x25},\n    [SPECIES_PORYGON         - 1] = {0x18, 0x12, 0x30, 0x10, 0x23},\n    [SPECIES_OMANYTE         - 1] = {0x1d, 0x1d, 0x30, 0x1c, 0x2b},\n    [SPECIES_OMASTAR         - 1] = {0x16, 0x1a, 0x30, 0x19, 0x2d},\n    [SPECIES_KABUTO          - 1] = {0x1b, 0x16, 0x30, 0x1a, 0x27},\n    [SPECIES_KABUTOPS        - 1] = {0x15, 0x11, 0x30, 0x15, 0x1f},\n    [SPECIES_AERODACTYL      - 1] = {0x13, 0x1d, 0x00, 0x14, 0x30},\n    [SPECIES_SNORLAX         - 1] = {0x35, 0x09, 0x30, 0x2e, 0x14},\n    [SPECIES_ARTICUNO        - 1] = {0x18, 0x0b, 0x18, 0x17, 0x17},\n    [SPECIES_ZAPDOS          - 1] = {0x0e, 0x0e, 0x10, 0x04, 0x28},\n    [SPECIES_MOLTRES         - 1] = {0x0b, 0x2a, 0x08, 0x0b, 0x38},\n    [SPECIES_DRATINI         - 1] = {0x0d, 0x12, 0x30, 0x0b, 0x21},\n    [SPECIES_DRAGONAIR       - 1] = {0x18, 0x0e, 0x30, 0x13, 0x1c},\n    [SPECIES_DRAGONITE       - 1] = {0x1b, 0x07, 0x18, 0x19, 0x17},\n    [SPECIES_MEWTWO          - 1] = {0x2b, 0x09, 0x28, 0x2c, 0x18},\n    [SPECIES_MEW             - 1] = {0x19, 0x14, 0x10, 0x1f, 0x21},\n    [SPECIES_CHIKORITA       - 1] = {0x1b, 0x17, 0x30, 0x1b, 0x24},\n    [SPECIES_BAYLEEF         - 1] = {0x1d, 0x10, 0x30, 0x20, 0x1d},\n    [SPECIES_MEGANIUM        - 1] = {0x05, 0x0d, 0x28, 0x0d, 0x1b},\n    [SPECIES_CYNDAQUIL       - 1] = {0x11, 0x1b, 0x30, 0x14, 0x27},\n    [SPECIES_QUILAVA         - 1] = {0x25, 0x18, 0x30, 0x27, 0x26},\n    [SPECIES_TYPHLOSION      - 1] = {0x09, 0x10, 0x28, 0x10, 0x1c},\n    [SPECIES_TOTODILE        - 1] = {0x16, 0x10, 0x30, 0x19, 0x20},\n    [SPECIES_CROCONAW        - 1] = {0x16, 0x10, 0x30, 0x18, 0x21},\n    [SPECIES_FERALIGATR      - 1] = {0x0e, 0x0a, 0x28, 0x08, 0x1a},\n    [SPECIES_SENTRET         - 1] = {0x1e, 0x0a, 0x30, 0x1d, 0x15},\n    [SPECIES_FURRET          - 1] = {0x21, 0x0e, 0x30, 0x21, 0x19},\n    [SPECIES_HOOTHOOT        - 1] = {0x1d, 0x15, 0x30, 0x1c, 0x24},\n    [SPECIES_NOCTOWL         - 1] = {0x19, 0x0e, 0x30, 0x18, 0x1c},\n    [SPECIES_LEDYBA          - 1] = {0x1b, 0x15, 0x30, 0x1c, 0x24},\n    [SPECIES_LEDIAN          - 1] = {0x18, 0x12, 0x10, 0x1c, 0x21},\n    [SPECIES_SPINARAK        - 1] = {0x20, 0x20, 0x28, 0x20, 0x2d},\n    [SPECIES_ARIADOS         - 1] = {0x17, 0x23, 0x28, 0x15, 0x30},\n    [SPECIES_CROBAT          - 1] = {0x22, 0x1e, 0x08, 0x23, 0x2b},\n    [SPECIES_CHINCHOU        - 1] = {0x1f, 0x1d, 0x30, 0x1f, 0x29},\n    [SPECIES_LANTURN         - 1] = {0x10, 0x23, 0x28, 0x19, 0x33},\n    [SPECIES_PICHU           - 1] = {0x1e, 0x17, 0x30, 0x1e, 0x24},\n    [SPECIES_CLEFFA          - 1] = {0x1c, 0x18, 0x30, 0x1e, 0x26},\n    [SPECIES_IGGLYBUFF       - 1] = {0x1f, 0x19, 0x30, 0x1f, 0x24},\n    [SPECIES_TOGEPI          - 1] = {0x21, 0x15, 0x30, 0x1f, 0x20},\n    [SPECIES_TOGETIC         - 1] = {0x1b, 0x10, 0x30, 0x1c, 0x1c},\n    [SPECIES_NATU            - 1] = {0x1c, 0x17, 0x30, 0x15, 0x21},\n    [SPECIES_XATU            - 1] = {0x1b, 0x08, 0x30, 0x19, 0x14},\n    [SPECIES_MAREEP          - 1] = {0x16, 0x15, 0x30, 0x15, 0x24},\n    [SPECIES_FLAAFFY         - 1] = {0x19, 0x12, 0x30, 0x18, 0x21},\n    [SPECIES_AMPHAROS        - 1] = {0x0f, 0x0a, 0x30, 0x10, 0x1b},\n    [SPECIES_BELLOSSOM       - 1] = {0x1f, 0x13, 0x30, 0x1f, 0x20},\n    [SPECIES_MARILL          - 1] = {0x1d, 0x15, 0x30, 0x1d, 0x22},\n    [SPECIES_AZUMARILL       - 1] = {0x1a, 0x12, 0x30, 0x17, 0x1f},\n    [SPECIES_SUDOWOODO       - 1] = {0x20, 0x10, 0x30, 0x20, 0x1f},\n    [SPECIES_POLITOED        - 1] = {0x1d, 0x0f, 0x30, 0x1e, 0x20},\n    [SPECIES_HOPPIP          - 1] = {0x23, 0x25, 0x08, 0x25, 0x33},\n    [SPECIES_SKIPLOOM        - 1] = {0x1e, 0x18, 0x08, 0x1c, 0x27},\n    [SPECIES_JUMPLUFF        - 1] = {0x1d, 0x21, 0x08, 0x20, 0x2f},\n    [SPECIES_AIPOM           - 1] = {0x1e, 0x29, 0x18, 0x1e, 0x35},\n    [SPECIES_SUNKERN         - 1] = {0x1f, 0x20, 0x08, 0x24, 0x2e},\n    [SPECIES_SUNFLORA        - 1] = {0x1c, 0x0c, 0x30, 0x1b, 0x19},\n    [SPECIES_YANMA           - 1] = {0x1b, 0x28, 0x08, 0x16, 0x35},\n    [SPECIES_WOOPER          - 1] = {0x1d, 0x13, 0x30, 0x1f, 0x21},\n    [SPECIES_QUAGSIRE        - 1] = {0x15, 0x09, 0x30, 0x12, 0x18},\n    [SPECIES_ESPEON          - 1] = {0x11, 0x1b, 0x30, 0x11, 0x29},\n    [SPECIES_UMBREON         - 1] = {0x23, 0x15, 0x30, 0x23, 0x22},\n    [SPECIES_MURKROW         - 1] = {0x24, 0x13, 0x30, 0x20, 0x22},\n    [SPECIES_SLOWKING        - 1] = {0x1e, 0x13, 0x28, 0x1d, 0x25},\n    [SPECIES_MISDREAVUS      - 1] = {0x28, 0x21, 0x08, 0x26, 0x2e},\n    [SPECIES_UNOWN           - 1] = {0x20, 0x17, 0x08, 0x1f, 0x21},\n    [SPECIES_WOBBUFFET       - 1] = {0x1d, 0x09, 0x30, 0x1d, 0x1a},\n    [SPECIES_GIRAFARIG       - 1] = {0x0b, 0x0d, 0x28, 0x11, 0x1d},\n    [SPECIES_PINECO          - 1] = {0x1d, 0x12, 0x10, 0x19, 0x25},\n    [SPECIES_FORRETRESS      - 1] = {0x19, 0x17, 0x08, 0x1e, 0x26},\n    [SPECIES_DUNSPARCE       - 1] = {0x10, 0x1b, 0x30, 0x0c, 0x2d},\n    [SPECIES_GLIGAR          - 1] = {0x1e, 0x13, 0x08, 0x1d, 0x23},\n    [SPECIES_STEELIX         - 1] = {0x0c, 0x0d, 0x28, 0x0d, 0x1c},\n    [SPECIES_SNUBBULL        - 1] = {0x1b, 0x15, 0x30, 0x1a, 0x23},\n    [SPECIES_GRANBULL        - 1] = {0x1c, 0x09, 0x30, 0x19, 0x18},\n    [SPECIES_QWILFISH        - 1] = {0x1f, 0x26, 0x20, 0x1d, 0x33},\n    [SPECIES_SCIZOR          - 1] = {0x15, 0x0f, 0x10, 0x1a, 0x1a},\n    [SPECIES_SHUCKLE         - 1] = {0x25, 0x0a, 0x30, 0x24, 0x18},\n    [SPECIES_HERACROSS       - 1] = {0x18, 0x19, 0x28, 0x1a, 0x26},\n    [SPECIES_SNEASEL         - 1] = {0x1c, 0x13, 0x30, 0x1d, 0x24},\n    [SPECIES_TEDDIURSA       - 1] = {0x1e, 0x12, 0x30, 0x1b, 0x23},\n    [SPECIES_URSARING        - 1] = {0x1e, 0x04, 0x28, 0x1d, 0x14},\n    [SPECIES_SLUGMA          - 1] = {0x20, 0x18, 0x30, 0x20, 0x28},\n    [SPECIES_MAGCARGO        - 1] = {0x16, 0x11, 0x30, 0x17, 0x23},\n    [SPECIES_SWINUB          - 1] = {0x1c, 0x18, 0x30, 0x1b, 0x25},\n    [SPECIES_PILOSWINE       - 1] = {0x18, 0x23, 0x20, 0x18, 0x36},\n    [SPECIES_CORSOLA         - 1] = {0x19, 0x1d, 0x28, 0x19, 0x2b},\n    [SPECIES_REMORAID        - 1] = {0x15, 0x1f, 0x28, 0x13, 0x2b},\n    [SPECIES_OCTILLERY       - 1] = {0x1c, 0x11, 0x30, 0x1a, 0x20},\n    [SPECIES_DELIBIRD        - 1] = {0x1d, 0x11, 0x30, 0x1b, 0x1f},\n    [SPECIES_MANTINE         - 1] = {0x16, 0x1e, 0x28, 0x1f, 0x27},\n    [SPECIES_SKARMORY        - 1] = {0x1e, 0x00, 0x28, 0x13, 0x07},\n    [SPECIES_HOUNDOUR        - 1] = {0x25, 0x11, 0x30, 0x25, 0x1f},\n    [SPECIES_HOUNDOOM        - 1] = {0x0d, 0x13, 0x30, 0x0d, 0x24},\n    [SPECIES_KINGDRA         - 1] = {0x0e, 0x13, 0x28, 0x0a, 0x2c},\n    [SPECIES_PHANPY          - 1] = {0x1b, 0x11, 0x30, 0x19, 0x24},\n    [SPECIES_DONPHAN         - 1] = {0x11, 0x15, 0x30, 0x19, 0x2c},\n    [SPECIES_PORYGON2        - 1] = {0x18, 0x11, 0x30, 0x11, 0x20},\n    [SPECIES_STANTLER        - 1] = {0x15, 0x15, 0x28, 0x17, 0x28},\n    [SPECIES_SMEARGLE        - 1] = {0x18, 0x10, 0x30, 0x1b, 0x25},\n    [SPECIES_TYROGUE         - 1] = {0x1e, 0x12, 0x30, 0x1f, 0x1f},\n    [SPECIES_HITMONTOP       - 1] = {0x1a, 0x39, 0x10, 0x1a, 0x2b},\n    [SPECIES_SMOOCHUM        - 1] = {0x20, 0x18, 0x30, 0x21, 0x26},\n    [SPECIES_ELEKID          - 1] = {0x1d, 0x14, 0x30, 0x1d, 0x23},\n    [SPECIES_MAGBY           - 1] = {0x1c, 0x15, 0x30, 0x1a, 0x24},\n    [SPECIES_MILTANK         - 1] = {0x18, 0x0e, 0x30, 0x18, 0x1e},\n    [SPECIES_BLISSEY         - 1] = {0x1d, 0x09, 0x30, 0x1d, 0x19},\n    [SPECIES_RAIKOU          - 1] = {0x29, 0x0c, 0x28, 0x27, 0x1e},\n    [SPECIES_ENTEI           - 1] = {0x08, 0x09, 0x28, 0x0b, 0x18},\n    [SPECIES_SUICUNE         - 1] = {0x23, 0x1d, 0x28, 0x26, 0x2c},\n    [SPECIES_LARVITAR        - 1] = {0x1c, 0x18, 0x30, 0x1a, 0x24},\n    [SPECIES_PUPITAR         - 1] = {0x1b, 0x19, 0x30, 0x1b, 0x28},\n    [SPECIES_TYRANITAR       - 1] = {0x06, 0x0b, 0x28, 0x0d, 0x19},\n    [SPECIES_LUGIA           - 1] = {0x08, 0x2a, 0x08, 0x14, 0x34},\n    [SPECIES_HO_OH           - 1] = {0x0d, 0x25, 0x08, 0x0e, 0x34},\n    [SPECIES_CELEBI          - 1] = {0x15, 0x21, 0x08, 0x1a, 0x2b},\n    [SPECIES_OLD_UNOWN_B     - 1] = {0x1f, 0x12, 0x08, 0x1e, 0x1c},\n    [SPECIES_OLD_UNOWN_C     - 1] = {0x20, 0x17, 0x08, 0x1f, 0x21},\n    [SPECIES_OLD_UNOWN_D     - 1] = {0x1c, 0x19, 0x08, 0x1b, 0x23},\n    [SPECIES_OLD_UNOWN_E     - 1] = {0x21, 0x19, 0x08, 0x20, 0x23},\n    [SPECIES_OLD_UNOWN_F     - 1] = {0x1b, 0x13, 0x08, 0x1a, 0x1d},\n    [SPECIES_OLD_UNOWN_G     - 1] = {0x20, 0x16, 0x08, 0x1f, 0x21},\n    [SPECIES_OLD_UNOWN_H     - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},\n    [SPECIES_OLD_UNOWN_I     - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},\n    [SPECIES_OLD_UNOWN_J     - 1] = {0x20, 0x16, 0x08, 0x1f, 0x20},\n    [SPECIES_OLD_UNOWN_K     - 1] = {0x1d, 0x1a, 0x08, 0x1c, 0x24},\n    [SPECIES_OLD_UNOWN_L     - 1] = {0x20, 0x16, 0x08, 0x1f, 0x1f},\n    [SPECIES_OLD_UNOWN_M     - 1] = {0x20, 0x1c, 0x08, 0x1f, 0x26},\n    [SPECIES_OLD_UNOWN_N     - 1] = {0x20, 0x1a, 0x08, 0x1f, 0x23},\n    [SPECIES_OLD_UNOWN_O     - 1] = {0x20, 0x1a, 0x08, 0x1f, 0x23},\n    [SPECIES_OLD_UNOWN_P     - 1] = {0x20, 0x16, 0x08, 0x1f, 0x20},\n    [SPECIES_OLD_UNOWN_Q     - 1] = {0x1d, 0x16, 0x08, 0x1c, 0x20},\n    [SPECIES_OLD_UNOWN_R     - 1] = {0x20, 0x15, 0x08, 0x1f, 0x1f},\n    [SPECIES_OLD_UNOWN_S     - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},\n    [SPECIES_OLD_UNOWN_T     - 1] = {0x20, 0x1e, 0x08, 0x1f, 0x28},\n    [SPECIES_OLD_UNOWN_U     - 1] = {0x20, 0x17, 0x08, 0x1f, 0x21},\n    [SPECIES_OLD_UNOWN_V     - 1] = {0x1e, 0x1e, 0x08, 0x1d, 0x28},\n    [SPECIES_OLD_UNOWN_W     - 1] = {0x20, 0x1d, 0x08, 0x1f, 0x27},\n    [SPECIES_OLD_UNOWN_X     - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},\n    [SPECIES_OLD_UNOWN_Y     - 1] = {0x20, 0x15, 0x08, 0x1f, 0x1f},\n    [SPECIES_OLD_UNOWN_Z     - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},\n    [SPECIES_TREECKO         - 1] = {0x1a, 0x0f, 0x30, 0x19, 0x20},\n    [SPECIES_GROVYLE         - 1] = {0x0d, 0x05, 0x10, 0x05, 0x13},\n    [SPECIES_SCEPTILE        - 1] = {0x10, 0x04, 0x28, 0x0c, 0x12},\n    [SPECIES_TORCHIC         - 1] = {0x17, 0x18, 0x30, 0x15, 0x25},\n    [SPECIES_COMBUSKEN       - 1] = {0x20, 0x12, 0x28, 0x1e, 0x20},\n    [SPECIES_BLAZIKEN        - 1] = {0x1a, 0x07, 0x28, 0x1d, 0x13},\n    [SPECIES_MUDKIP          - 1] = {0x1b, 0x1d, 0x28, 0x19, 0x2c},\n    [SPECIES_MARSHTOMP       - 1] = {0x1d, 0x11, 0x30, 0x1c, 0x20},\n    [SPECIES_SWAMPERT        - 1] = {0x1b, 0x11, 0x28, 0x1b, 0x23},\n    [SPECIES_POOCHYENA       - 1] = {0x14, 0x12, 0x30, 0x0f, 0x20},\n    [SPECIES_MIGHTYENA       - 1] = {0x09, 0x0d, 0x28, 0x09, 0x1c},\n    [SPECIES_ZIGZAGOON       - 1] = {0x0b, 0x1a, 0x30, 0x09, 0x2b},\n    [SPECIES_LINOONE         - 1] = {0x0d, 0x28, 0x18, 0x0b, 0x37},\n    [SPECIES_WURMPLE         - 1] = {0x21, 0x17, 0x30, 0x1f, 0x26},\n    [SPECIES_SILCOON         - 1] = {0x13, 0x1c, 0x30, 0x11, 0x2a},\n    [SPECIES_BEAUTIFLY       - 1] = {0x0f, 0x1b, 0x08, 0x0e, 0x28},\n    [SPECIES_CASCOON         - 1] = {0x14, 0x1d, 0x30, 0x11, 0x2c},\n    [SPECIES_DUSTOX          - 1] = {0x14, 0x19, 0x08, 0x16, 0x26},\n    [SPECIES_LOTAD           - 1] = {0x19, 0x25, 0x28, 0x17, 0x32},\n    [SPECIES_LOMBRE          - 1] = {0x22, 0x10, 0x30, 0x29, 0x1d},\n    [SPECIES_LUDICOLO        - 1] = {0x1c, 0x0f, 0x28, 0x1b, 0x24},\n    [SPECIES_SEEDOT          - 1] = {0x1b, 0x17, 0x30, 0x18, 0x28},\n    [SPECIES_NUZLEAF         - 1] = {0x20, 0x0d, 0x30, 0x1a, 0x1d},\n    [SPECIES_SHIFTRY         - 1] = {0x32, 0x11, 0x28, 0x2e, 0x23},\n    [SPECIES_NINCADA         - 1] = {0x18, 0x1a, 0x30, 0x17, 0x28},\n    [SPECIES_NINJASK         - 1] = {0x17, 0x21, 0x00, 0x17, 0x2f},\n    [SPECIES_SHEDINJA        - 1] = {0x16, 0x19, 0x08, 0x18, 0x2a},\n    [SPECIES_TAILLOW         - 1] = {0x17, 0x10, 0x30, 0x14, 0x1e},\n    [SPECIES_SWELLOW         - 1] = {0x0c, 0x0a, 0x28, 0x05, 0x16},\n    [SPECIES_SHROOMISH       - 1] = {0x1f, 0x16, 0x30, 0x1d, 0x23},\n    [SPECIES_BRELOOM         - 1] = {0x25, 0x0c, 0x30, 0x23, 0x19},\n    [SPECIES_SPINDA          - 1] = {0x21, 0x16, 0x30, 0x1f, 0x27},\n    [SPECIES_WINGULL         - 1] = {0x1a, 0x16, 0x10, 0x15, 0x26},\n    [SPECIES_PELIPPER        - 1] = {0x1d, 0x0a, 0x10, 0x09, 0x1b},\n    [SPECIES_SURSKIT         - 1] = {0x1d, 0x16, 0x30, 0x1c, 0x25},\n    [SPECIES_MASQUERAIN      - 1] = {0x1a, 0x21, 0x08, 0x14, 0x30},\n    [SPECIES_WAILMER         - 1] = {0x17, 0x17, 0x30, 0x16, 0x28},\n    [SPECIES_WAILORD         - 1] = {0x17, 0x03, 0x30, 0x09, 0x13},\n    [SPECIES_SKITTY          - 1] = {0x24, 0x1a, 0x30, 0x22, 0x2a},\n    [SPECIES_DELCATTY        - 1] = {0x1e, 0x12, 0x30, 0x1c, 0x21},\n    [SPECIES_KECLEON         - 1] = {0x19, 0x10, 0x30, 0x13, 0x1e},\n    [SPECIES_BALTOY          - 1] = {0x1d, 0x15, 0x30, 0x1b, 0x22},\n    [SPECIES_CLAYDOL         - 1] = {0x1e, 0x0d, 0x28, 0x1d, 0x24},\n    [SPECIES_NOSEPASS        - 1] = {0x1f, 0x10, 0x30, 0x15, 0x23},\n    [SPECIES_TORKOAL         - 1] = {0x0e, 0x19, 0x28, 0x0a, 0x27},\n    [SPECIES_SABLEYE         - 1] = {0x1e, 0x16, 0x30, 0x1d, 0x27},\n    [SPECIES_BARBOACH        - 1] = {0x17, 0x12, 0x30, 0x15, 0x1e},\n    [SPECIES_WHISCASH        - 1] = {0x18, 0x20, 0x28, 0x17, 0x31},\n    [SPECIES_LUVDISC         - 1] = {0x19, 0x0f, 0x30, 0x13, 0x1c},\n    [SPECIES_CORPHISH        - 1] = {0x1f, 0x14, 0x30, 0x1d, 0x23},\n    [SPECIES_CRAWDAUNT       - 1] = {0x14, 0x0c, 0x28, 0x18, 0x23},\n    [SPECIES_FEEBAS          - 1] = {0x18, 0x1e, 0x28, 0x16, 0x2f},\n    [SPECIES_MILOTIC         - 1] = {0x20, 0x0c, 0x28, 0x1f, 0x1d},\n    [SPECIES_CARVANHA        - 1] = {0x16, 0x19, 0x30, 0x13, 0x22},\n    [SPECIES_SHARPEDO        - 1] = {0x19, 0x0c, 0x28, 0x17, 0x27},\n    [SPECIES_TRAPINCH        - 1] = {0x29, 0x13, 0x30, 0x17, 0x18},\n    [SPECIES_VIBRAVA         - 1] = {0x10, 0x27, 0x20, 0x0e, 0x34},\n    [SPECIES_FLYGON          - 1] = {0x22, 0x07, 0x10, 0x21, 0x13},\n    [SPECIES_MAKUHITA        - 1] = {0x22, 0x13, 0x30, 0x1c, 0x23},\n    [SPECIES_HARIYAMA        - 1] = {0x24, 0x0f, 0x28, 0x26, 0x1c},\n    [SPECIES_ELECTRIKE       - 1] = {0x11, 0x18, 0x30, 0x14, 0x27},\n    [SPECIES_MANECTRIC       - 1] = {0x2f, 0x18, 0x28, 0x2e, 0x29},\n    [SPECIES_NUMEL           - 1] = {0x10, 0x1a, 0x30, 0x0d, 0x2a},\n    [SPECIES_CAMERUPT        - 1] = {0x0d, 0x22, 0x28, 0x0e, 0x36},\n    [SPECIES_SPHEAL          - 1] = {0x1e, 0x0f, 0x30, 0x18, 0x1f},\n    [SPECIES_SEALEO          - 1] = {0x1c, 0x09, 0x30, 0x1a, 0x18},\n    [SPECIES_WALREIN         - 1] = {0x19, 0x01, 0x28, 0x10, 0x16},\n    [SPECIES_CACNEA          - 1] = {0x1f, 0x17, 0x30, 0x1d, 0x29},\n    [SPECIES_CACTURNE        - 1] = {0x1d, 0x0e, 0x28, 0x1d, 0x1b},\n    [SPECIES_SNORUNT         - 1] = {0x1e, 0x16, 0x30, 0x1e, 0x26},\n    [SPECIES_GLALIE          - 1] = {0x1a, 0x1c, 0x08, 0x1a, 0x31},\n    [SPECIES_LUNATONE        - 1] = {0x1c, 0x16, 0x08, 0x19, 0x2c},\n    [SPECIES_SOLROCK         - 1] = {0x18, 0x18, 0x10, 0x17, 0x31},\n    [SPECIES_AZURILL         - 1] = {0x1b, 0x10, 0x30, 0x18, 0x1f},\n    [SPECIES_SPOINK          - 1] = {0x21, 0x14, 0x30, 0x1b, 0x28},\n    [SPECIES_GRUMPIG         - 1] = {0x14, 0x10, 0x30, 0x15, 0x20},\n    [SPECIES_PLUSLE          - 1] = {0x1c, 0x16, 0x08, 0x1d, 0x25},\n    [SPECIES_MINUN           - 1] = {0x21, 0x16, 0x08, 0x1f, 0x26},\n    [SPECIES_MAWILE          - 1] = {0x2d, 0x14, 0x30, 0x2f, 0x24},\n    [SPECIES_MEDITITE        - 1] = {0x1f, 0x17, 0x30, 0x1e, 0x25},\n    [SPECIES_MEDICHAM        - 1] = {0x21, 0x0f, 0x28, 0x1e, 0x1d},\n    [SPECIES_SWABLU          - 1] = {0x1b, 0x16, 0x10, 0x17, 0x23},\n    [SPECIES_ALTARIA         - 1] = {0x1d, 0x0b, 0x10, 0x1a, 0x1a},\n    [SPECIES_WYNAUT          - 1] = {0x1a, 0x15, 0x30, 0x1b, 0x26},\n    [SPECIES_DUSKULL         - 1] = {0x10, 0x18, 0x08, 0x14, 0x2e},\n    [SPECIES_DUSCLOPS        - 1] = {0x1c, 0x0f, 0x30, 0x1a, 0x28},\n    [SPECIES_ROSELIA         - 1] = {0x1e, 0x11, 0x30, 0x1d, 0x20},\n    [SPECIES_SLAKOTH         - 1] = {0x19, 0x1e, 0x30, 0x18, 0x2f},\n    [SPECIES_VIGOROTH        - 1] = {0x10, 0x12, 0x28, 0x14, 0x24},\n    [SPECIES_SLAKING         - 1] = {0x37, 0x0f, 0x30, 0x29, 0x21},\n    [SPECIES_GULPIN          - 1] = {0x1b, 0x18, 0x30, 0x17, 0x26},\n    [SPECIES_SWALOT          - 1] = {0x1f, 0x06, 0x30, 0x15, 0x13},\n    [SPECIES_TROPIUS         - 1] = {0x18, 0x0a, 0x28, 0x20, 0x18},\n    [SPECIES_WHISMUR         - 1] = {0x1f, 0x19, 0x30, 0x1d, 0x29},\n    [SPECIES_LOUDRED         - 1] = {0x1c, 0x12, 0x28, 0x22, 0x27},\n    [SPECIES_EXPLOUD         - 1] = {0x10, 0x10, 0x28, 0x1a, 0x2a},\n    [SPECIES_CLAMPERL        - 1] = {0x20, 0x1a, 0x30, 0x1e, 0x26},\n    [SPECIES_HUNTAIL         - 1] = {0x13, 0x1e, 0x28, 0x15, 0x33},\n    [SPECIES_GOREBYSS        - 1] = {0x0d, 0x1f, 0x28, 0x03, 0x32},\n    [SPECIES_ABSOL           - 1] = {0x2a, 0x11, 0x28, 0x2a, 0x22},\n    [SPECIES_SHUPPET         - 1] = {0x16, 0x19, 0x08, 0x17, 0x27},\n    [SPECIES_BANETTE         - 1] = {0x1c, 0x14, 0x08, 0x1b, 0x23},\n    [SPECIES_SEVIPER         - 1] = {0x0e, 0x0d, 0x30, 0x0b, 0x1e},\n    [SPECIES_ZANGOOSE        - 1] = {0x18, 0x0c, 0x28, 0x15, 0x1a},\n    [SPECIES_RELICANTH       - 1] = {0x0c, 0x1f, 0x30, 0x09, 0x2d},\n    [SPECIES_ARON            - 1] = {0x18, 0x1c, 0x30, 0x1a, 0x2c},\n    [SPECIES_LAIRON          - 1] = {0x0b, 0x21, 0x30, 0x12, 0x2f},\n    [SPECIES_AGGRON          - 1] = {0x10, 0x0b, 0x28, 0x16, 0x1b},\n    [SPECIES_CASTFORM        - 1] = {0x1d, 0x18, 0x08, 0x1b, 0x26},\n    [SPECIES_VOLBEAT         - 1] = {0x25, 0x15, 0x08, 0x21, 0x25},\n    [SPECIES_ILLUMISE        - 1] = {0x20, 0x12, 0x08, 0x1f, 0x20},\n    [SPECIES_LILEEP          - 1] = {0x1e, 0x11, 0x30, 0x1f, 0x1e},\n    [SPECIES_CRADILY         - 1] = {0x12, 0x16, 0x28, 0x15, 0x28},\n    [SPECIES_ANORITH         - 1] = {0x1c, 0x1e, 0x30, 0x1b, 0x2b},\n    [SPECIES_ARMALDO         - 1] = {0x15, 0x05, 0x28, 0x14, 0x13},\n    [SPECIES_RALTS           - 1] = {0x1f, 0x17, 0x30, 0x20, 0x23},\n    [SPECIES_KIRLIA          - 1] = {0x1c, 0x12, 0x30, 0x1f, 0x1e},\n    [SPECIES_GARDEVOIR       - 1] = {0x35, 0x07, 0x28, 0x32, 0x14},\n    [SPECIES_BAGON           - 1] = {0x17, 0x13, 0x30, 0x16, 0x26},\n    [SPECIES_SHELGON         - 1] = {0x19, 0x1b, 0x30, 0x19, 0x2c},\n    [SPECIES_SALAMENCE       - 1] = {0x09, 0x11, 0x30, 0x0a, 0x21},\n    [SPECIES_BELDUM          - 1] = {0x16, 0x19, 0x08, 0x18, 0x23},\n    [SPECIES_METANG          - 1] = {0x22, 0x0f, 0x10, 0x1f, 0x21},\n    [SPECIES_METAGROSS       - 1] = {0x24, 0x1b, 0x28, 0x22, 0x2b},\n    [SPECIES_REGIROCK        - 1] = {0x16, 0x07, 0x28, 0x14, 0x12},\n    [SPECIES_REGICE          - 1] = {0x19, 0x0c, 0x28, 0x17, 0x19},\n    [SPECIES_REGISTEEL       - 1] = {0x19, 0x0d, 0x28, 0x19, 0x19},\n    [SPECIES_KYOGRE          - 1] = {0x0e, 0x19, 0x28, 0x0b, 0x26},\n    [SPECIES_GROUDON         - 1] = {0x04, 0x0b, 0x28, 0x0a, 0x19},\n    [SPECIES_RAYQUAZA        - 1] = {0x0c, 0x0e, 0x10, 0x0e, 0x1f},\n    [SPECIES_LATIAS          - 1] = {0x1e, 0x0c, 0x10, 0x23, 0x19},\n    [SPECIES_LATIOS          - 1] = {0x05, 0x0e, 0x10, 0x05, 0x1d},\n    [SPECIES_JIRACHI         - 1] = {0x1c, 0x15, 0x08, 0x1e, 0x22},\n    [SPECIES_DEOXYS          - 1] = {0x1b, 0x08, 0x28, 0x1c, 0x16},\n    [SPECIES_CHIMECHO        - 1] = {0x1d, 0x0c, 0x08, 0x1c, 0x1a},\n    [SPECIES_OLD_UNOWN_EMARK - 1] = {0x20, 0x21, 0x08, 0x20, 0x2b},\n    [SPECIES_OLD_UNOWN_QMARK - 1] = {0x20, 0x23, 0x08, 0x20, 0x2d}\n};\n\nvoid AddTextPrinterParameterized3(u8 windowId, u8 fontId, u8 x, u8 y, const u8 * color, s8 speed, const u8 * str)\n{\n    struct TextPrinterTemplate printer;\n\n    printer.currentChar = str;\n    printer.windowId = windowId;\n    printer.fontId = fontId;\n    printer.x = x;\n    printer.y = y;\n    printer.currentX = printer.x;\n    printer.currentY = printer.y;\n    printer.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING);\n    printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING);\n    printer.unk = 0;\n    printer.fgColor = color[1];\n    printer.bgColor = color[0];\n    printer.shadowColor = color[2];\n    AddTextPrinter(&printer, speed, NULL);\n}\n\nvoid AddTextPrinterParameterized4(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, const u8 *color, s8 speed, const u8 *str)\n{\n    struct TextPrinterTemplate printer;\n\n    printer.currentChar = str;\n    printer.windowId = windowId;\n    printer.fontId = fontId;\n    printer.x = x;\n    printer.y = y;\n    printer.currentX = printer.x;\n    printer.currentY = printer.y;\n    printer.letterSpacing = letterSpacing;\n    printer.lineSpacing = lineSpacing;\n    printer.unk = 0;\n    printer.fgColor = color[1];\n    printer.bgColor = color[0];\n    printer.shadowColor = color[2];\n    AddTextPrinter(&printer, speed, NULL);\n}\n\nvoid AddTextPrinterParameterized5(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 letterSpacing, u8 lineSpacing)\n{\n    struct TextPrinterTemplate printer;\n\n    printer.currentChar = str;\n    printer.windowId = windowId;\n    printer.fontId = fontId;\n    printer.x = x;\n    printer.y = y;\n    printer.currentX = x;\n    printer.currentY = y;\n    printer.letterSpacing = letterSpacing;\n    printer.lineSpacing = lineSpacing;\n    printer.unk = 0;\n    printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND);\n    printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND);\n    printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW);\n    AddTextPrinter(&printer, speed, callback);\n}\n\nvoid Menu_PrintFormatIntlPlayerName(u8 windowId, const u8 * src, u16 x, u16 y)\n{\n    s32 i;\n\n    for (i = 0; gSaveBlock2Ptr->playerName[i] != EOS; i++)\n        ;\n\n    StringExpandPlaceholders(gStringVar4, src);\n    if (i != 5)\n    {\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, gStringVar4, x, y, 0xFF, NULL);\n    }\n    else\n    {\n        AddTextPrinterParameterized5(windowId, FONT_NORMAL, gStringVar4, x, y, 0xFF, NULL, 0, 0);\n    }\n}\n\nstatic void UnusedBlitBitmapRect(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height)\n{\n    s32 loopSrcY, loopDstY, loopSrcX, loopDstX, xEnd, yEnd, multiplierSrcY, multiplierDstY;\n    u16 toOrr;\n    u8 *pixelsSrc;\n    u8 *pixelsDst;\n\n    if (dst->width - dstX < width)\n        xEnd = dst->width - dstX + srcX;\n    else\n        xEnd = width + srcX;\n\n    if (dst->height - dstY < height)\n        yEnd = srcY + dst->height - dstY;\n    else\n        yEnd = srcY + height;\n    multiplierSrcY = (src->width + (src->width & 7)) >> 3;\n    multiplierDstY = (dst->width + (dst->width & 7)) >> 3;\n    for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)\n    {\n        for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)\n        {\n            pixelsSrc = (u8 *)(src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B));\n            pixelsDst = (u8 *)(dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + ((( loopDstY >> 3) * multiplierDstY) << 5) + ((u32)( loopDstY << 0x1d) >> 0x1B));\n\n            if ((u32)pixelsDst & 0x1)\n            {\n                pixelsDst--;\n                if (loopDstX & 0x1)\n                {\n                    toOrr = *(vu16 *)pixelsDst & 0x0fff;\n                    if (loopSrcX & 0x1)\n                        toOrr |= ((*pixelsSrc & 0xf0) << 8);\n                    else\n                        toOrr |= ((*pixelsSrc & 0x0f) << 12);\n                }\n                else\n                {\n                    toOrr = *(vu16 *)pixelsDst & 0xf0ff;\n                    if (loopSrcX & 0x1)\n                        toOrr |= ((*pixelsSrc & 0xf0) << 4);\n                    else\n                        toOrr |= ((*pixelsSrc & 0x0f) << 8);\n                }\n            }\n            else\n            {\n                if (loopDstX & 1)\n                {\n                    toOrr = *(vu16 *)pixelsDst & 0xff0f;\n                    if (loopSrcX & 1)\n                        toOrr |= ((*pixelsSrc & 0xf0) << 0);\n                    else\n                        toOrr |= ((*pixelsSrc & 0x0f) << 4);\n                }\n                else\n                {\n                    toOrr = *(vu16 *)pixelsDst & 0xfff0;\n                    if (loopSrcX & 1)\n                        toOrr |= ((*pixelsSrc & 0xf0) >> 4);\n                    else\n                        toOrr |= ((*pixelsSrc & 0x0f) >> 0);\n                }\n            }\n            *(vu16 *)pixelsDst = toOrr;\n        }\n    }\n}\n\n#define tEvA data[0]\n#define tEvB data[1]\n#define tEvAEnd data[2]\n#define tEvBEnd data[3]\n#define tEvADelta data[4]\n#define tEvBDelta data[5]\n#define tEvWhich data[6]\n#define tEvStepCount data[8]\n\nvoid StartBlendTask(u8 eva_start, u8 evb_start, u8 eva_end, u8 evb_end, u8 ev_step, u8 priority)\n{\n    u8 taskId = CreateTask(Task_SmoothBlendLayers, priority);\n    gTasks[taskId].tEvA = eva_start << 8;\n    gTasks[taskId].tEvB = evb_start << 8;\n    gTasks[taskId].tEvAEnd = eva_end;\n    gTasks[taskId].tEvBEnd = evb_end;\n    gTasks[taskId].tEvADelta = (eva_end - eva_start) * 256 / ev_step;\n    gTasks[taskId].tEvBDelta = (evb_end - evb_start) * 256 / ev_step;\n    gTasks[taskId].tEvStepCount = ev_step;\n    SetGpuReg(REG_OFFSET_BLDALPHA, (evb_start << 8) | eva_start);\n}\n\nbool8 IsBlendTaskActive(void)\n{\n    return FuncIsActiveTask(Task_SmoothBlendLayers);\n}\n\nstatic void Task_SmoothBlendLayers(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (tEvStepCount != 0)\n    {\n        if (tEvWhich == 0)\n        {\n            tEvA += tEvADelta;\n            tEvWhich = 1;\n        }\n        else\n        {\n            if (--tEvStepCount != 0)\n            {\n                tEvB += tEvBDelta;\n            }\n            else\n            {\n                tEvA = tEvAEnd << 8;\n                tEvB = tEvBEnd << 8;\n            }\n            tEvWhich = 0;\n        }\n        SetGpuReg(REG_OFFSET_BLDALPHA, (tEvB & ~0xFF) | ((u16)tEvA >> 8));\n        if (tEvStepCount == 0)\n            DestroyTask(taskId);\n    }\n}\n\nu8 Menu2_GetMonSpriteAnchorCoord(u16 species, u32 personality, u8 a2)\n{\n    if (species == SPECIES_UNOWN)\n    {\n        u8 unownLetter = GetUnownLetterByPersonalityLoByte(personality);\n        switch (unownLetter)\n        {\n        case 0:\n            break;\n        case 26:\n            species = SPECIES_OLD_UNOWN_EMARK;\n            break;\n        case 27:\n            species = SPECIES_OLD_UNOWN_QMARK;\n            break;\n        default:\n            species = SPECIES_OLD_UNOWN_B + unownLetter - 1;\n            break;\n        }\n    }\n    if (species != SPECIES_NONE && a2 < 5)\n    {\n        species--;\n        if (sMonSpriteAnchorCoords[species][a2] != 0xFF)\n            return sMonSpriteAnchorCoords[species][a2];\n    }\n    return 32;\n}\n\ns8 Menu2_GetMonSpriteAnchorCoordMinusx20(u16 species, u32 personality, u8 a2)\n{\n    return Menu2_GetMonSpriteAnchorCoord(species, personality, a2) - 32;\n}\n"
  },
  {
    "path": "src/menu_helpers.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"menu.h\"\n#include \"menu_helpers.h\"\n#include \"new_menu_helpers.h\"\n#include \"link.h\"\n#include \"overworld.h\"\n#include \"mail_data.h\"\n#include \"field_specials.h\"\n#include \"constants/songs.h\"\n#include \"constants/items.h\"\n#include \"constants/maps.h\"\n\nstatic EWRAM_DATA const struct YesNoFuncTable *sYesNo = NULL;\nstatic EWRAM_DATA TaskFunc sMessageNextTask = NULL;\nstatic EWRAM_DATA u8 sMessageWindowId = {0};\n\nstatic void Task_ContinueTaskAfterMessagePrints(u8 taskId);\n\nvoid DisplayMessageAndContinueTask(u8 taskId, u8 windowId, u16 tileNum, u8 paletteNum, u8 fontId, u8 textSpeed, const u8 *string, void *taskFunc)\n{\n    sMessageWindowId = windowId;\n    DrawDialogFrameWithCustomTileAndPalette(windowId, TRUE, tileNum, paletteNum);\n\n    if (string != gStringVar4)\n        StringExpandPlaceholders(gStringVar4, string);\n\n    gTextFlags.canABSpeedUpPrint = 1;\n    AddTextPrinterParameterized2(windowId, fontId, gStringVar4, textSpeed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    sMessageNextTask = taskFunc;\n    gTasks[taskId].func = Task_ContinueTaskAfterMessagePrints;\n}\n\nbool16 RunTextPrinters_CheckActive(u8 textPrinterId)\n{\n    RunTextPrinters();\n    return IsTextPrinterActive(textPrinterId);\n}\n\nstatic void Task_ContinueTaskAfterMessagePrints(u8 taskId)\n{\n    if (!RunTextPrinters_CheckActive(sMessageWindowId))\n        sMessageNextTask(taskId);\n}\n\nstatic void Task_CallYesOrNoCallback(u8 taskId)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0:\n        PlaySE(SE_SELECT);\n        gTasks[taskId].func = sYesNo->yesFunc;\n        break;\n    case 1:\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        gTasks[taskId].func = sYesNo->noFunc;\n        break;\n    }\n}\n\nvoid CreateYesNoMenuWithCallbacks(u8 taskId, const struct WindowTemplate *template, u8 fontId, u8 left, u8 top, u16 tileStart, u8 palette, const struct YesNoFuncTable *yesNo)\n{\n    CreateYesNoMenu(template, fontId, left, top, tileStart, palette, 0);\n    sYesNo = yesNo;\n    gTasks[taskId].func = Task_CallYesOrNoCallback;\n}\n\nu8 GetLRKeysPressed(void)\n{\n    if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)\n    {\n        if (JOY_NEW(L_BUTTON))\n            return MENU_L_PRESSED;\n        if (JOY_NEW(R_BUTTON))\n            return MENU_R_PRESSED;\n    }\n    return 0;\n}\n\nu8 GetLRKeysPressedAndHeld(void)\n{\n    if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)\n    {\n        if (JOY_REPT(L_BUTTON))\n            return MENU_L_PRESSED;\n        if (JOY_REPT(R_BUTTON))\n            return MENU_R_PRESSED;\n    }\n    return 0;\n}\n\nbool8 IsHoldingItemAllowed(u16 itemId)\n{\n    // Enigma Berry can't be held in link areas\n    if (itemId == ITEM_ENIGMA_BERRY\n     && ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRADE_CENTER)\n       && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRADE_CENTER))\n       || InUnionRoom() == TRUE))\n        return FALSE;\n    else\n        return TRUE;\n}\n\nbool8 IsWritingMailAllowed(u16 itemId)\n{\n    if ((IsUpdateLinkStateCBActive() == TRUE || InUnionRoom() == TRUE) && ItemIsMail(itemId) == TRUE)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nbool8 MenuHelpers_IsLinkActive(void)\n{\n    if (IsUpdateLinkStateCBActive() == TRUE || gReceivedRemoteLinkPlayers == 1)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 IsActiveOverworldLinkBusy(void)\n{\n    if (!MenuHelpers_IsLinkActive())\n        return FALSE;\n    else\n        return (u8)Overworld_LinkRecvQueueLengthMoreThan2();\n}\n\nbool8 MenuHelpers_ShouldWaitForLinkRecv(void)\n{\n    if (IsActiveOverworldLinkBusy() == TRUE || IsLinkRecvQueueAtOverworldMax() == TRUE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid SetVBlankHBlankCallbacksToNull(void)\n{\n    SetVBlankCallback(NULL);\n    SetHBlankCallback(NULL);\n}\n\nvoid ResetVramOamAndBgCntRegs(void)\n{\n    ResetAllBgsCoordinatesAndBgCntRegs();\n    CpuFill16(0, (void *) VRAM, VRAM_SIZE);\n    CpuFill32(0, (void *) OAM, OAM_SIZE);\n    CpuFill16(0, (void *) PLTT, PLTT_SIZE);\n}\n\nvoid ResetAllBgsCoordinatesAndBgCntRegs(void)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    SetGpuReg(REG_OFFSET_BG3CNT, 0);\n    SetGpuReg(REG_OFFSET_BG2CNT, 0);\n    SetGpuReg(REG_OFFSET_BG1CNT, 0);\n    SetGpuReg(REG_OFFSET_BG0CNT, 0);\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n}\n\nbool8 AdjustQuantityAccordingToDPadInput(s16 *quantity_p, u16 qmax)\n{\n    s16 valBefore = (*quantity_p);\n\n    if (JOY_REPT(DPAD_ANY) == DPAD_UP)\n    {\n        (*quantity_p)++;\n        if ((*quantity_p) > qmax)\n            (*quantity_p) = 1;\n\n        if ((*quantity_p) == valBefore)\n        {\n            return FALSE;\n        }\n        else\n        {\n            PlaySE(SE_SELECT);\n            return TRUE;\n        }\n    }\n    else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)\n    {\n        (*quantity_p)--;\n        if ((*quantity_p) <= 0)\n            (*quantity_p) = qmax;\n        if ((*quantity_p) == valBefore)\n        {\n            return FALSE;\n        }\n        else\n        {\n            PlaySE(SE_SELECT);\n            return TRUE;\n        }\n    }\n    else if (JOY_REPT(DPAD_ANY) == DPAD_RIGHT)\n    {\n        (*quantity_p) += 10;\n        if ((*quantity_p) > qmax)\n            (*quantity_p) = qmax;\n        if ((*quantity_p) == valBefore)\n        {\n            return FALSE;\n        }\n        else\n        {\n            PlaySE(SE_SELECT);\n            return TRUE;\n        }\n    }\n    else if (JOY_REPT(DPAD_ANY) == DPAD_LEFT)\n    {\n        (*quantity_p) -= 10;\n        if ((*quantity_p) <= 0)\n            (*quantity_p) = 1;\n        if ((*quantity_p) == valBefore)\n        {\n            return FALSE;\n        }\n        else\n        {\n            PlaySE(SE_SELECT);\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nu8 GetDialogBoxFontId(void)\n{\n    if (ContextNpcGetTextColor() == NPC_TEXT_COLOR_MALE)\n        return FONT_MALE;\n    else\n        return FONT_FEMALE;\n}\n"
  },
  {
    "path": "src/menu_indicators.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"decompress.h\"\n#include \"trig.h\"\n#include \"list_menu.h\"\n#include \"menu_indicators.h\"\n\nstruct ScrollIndicatorPair\n{\n    u8 field_0;\n    u16 *scrollOffset;\n    u16 fullyUpThreshold;\n    u16 fullyDownThreshold;\n    u8 topSpriteId;\n    u8 bottomSpriteId;\n    u16 tileTag;\n    u16 palTag;\n};\n\nstruct RedOutlineCursor\n{\n    struct SubspriteTable subspriteTable;\n    struct Subsprite *subspritesPtr;\n    u8 spriteId;\n    u16 tileTag;\n    u16 palTag;\n};\n\nstruct RedArrowCursor\n{\n    u8 spriteId;\n    u16 tileTag;\n    u16 palTag;\n};\n\nstruct ScrollIndicatorTemplate\n{\n    u8 animNum:4;\n    u8 bounceDir:4;\n    u8 multiplier;\n    s16 frequency;\n};\n\nstatic EWRAM_DATA struct ScrollArrowsTemplate sTempScrollArrowTemplate = {0};\n\nstatic void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite);\nstatic void SpriteCallback_RedArrowCursor(struct Sprite *sprite);\nstatic void Task_ScrollIndicatorArrowPair(u8 taskId);\nstatic u8 ListMenuAddRedArrowCursorObject(const struct CursorStruct *cursor);\nstatic void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y);\nstatic void ListMenuRemoveRedArrowCursorObject(u8 taskId);\n\nstatic const struct ScrollIndicatorTemplate sScrollIndicatorTemplates[] =\n{\n    {\n        .animNum = 0,\n        .bounceDir = 0,\n        .multiplier = 2,\n        .frequency = 8,\n    },\n    {\n        .animNum = 1,\n        .bounceDir = 0,\n        .multiplier = 2,\n        .frequency = -8,\n    },\n    {\n        .animNum = 2,\n        .bounceDir = 1,\n        .multiplier = 2,\n        .frequency = 8,\n    },\n    {\n        .animNum = 3,\n        .bounceDir = 1,\n        .multiplier = 2,\n        .frequency = -8,\n    },\n};\n\nstatic const struct OamData sOamData_ScrollArrowIndicator =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = 0,\n    .mosaic = FALSE,\n    .bpp = 0,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sSpriteAnim_ScrollArrowIndicator0[] =\n{\n    ANIMCMD_FRAME(0, 30),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSpriteAnim_ScrollArrowIndicator1[] =\n{\n    ANIMCMD_FRAME(0, 30, 1, 0),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSpriteAnim_ScrollArrowIndicator2[] =\n{\n    ANIMCMD_FRAME(4, 30),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSpriteAnim_ScrollArrowIndicator3[] =\n{\n    ANIMCMD_FRAME(4, 30, 0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_ScrollArrowIndicator[] =\n{\n    sSpriteAnim_ScrollArrowIndicator0,\n    sSpriteAnim_ScrollArrowIndicator1,\n    sSpriteAnim_ScrollArrowIndicator2,\n    sSpriteAnim_ScrollArrowIndicator3,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_ScrollArrowIndicator =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &sOamData_ScrollArrowIndicator,\n    .anims = sSpriteAnimTable_ScrollArrowIndicator,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallback_ScrollIndicatorArrow,\n};\n\nstatic const struct Subsprite sSubsprite_RedOutline1 =\n{\n    .x = 0,\n    .y = 0,\n    .shape = SPRITE_SHAPE(8x8),\n    .size = SPRITE_SIZE(8x8),\n    .tileOffset = 0,\n    .priority = 0,\n};\n\nstatic const struct Subsprite sSubsprite_RedOutline2 =\n{\n    .x = 0,\n    .y = 0,\n    .shape = SPRITE_SHAPE(8x8),\n    .size = SPRITE_SIZE(8x8),\n    .tileOffset = 1,\n    .priority = 0,\n};\n\nstatic const struct Subsprite sSubsprite_RedOutline3 =\n{\n    .x = 0,\n    .y = 0,\n    .shape = SPRITE_SHAPE(8x8),\n    .size = SPRITE_SIZE(8x8),\n    .tileOffset = 2,\n    .priority = 0,\n};\n\nstatic const struct Subsprite sSubsprite_RedOutline4 =\n{\n    .x = 0,\n    .y = 0,\n    .shape = SPRITE_SHAPE(8x8),\n    .size = SPRITE_SIZE(8x8),\n    .tileOffset = 3,\n    .priority = 0,\n};\n\nstatic const struct Subsprite sSubsprite_RedOutline5 =\n{\n    .x = 0,\n    .y = 0,\n    .shape = SPRITE_SHAPE(8x8),\n    .size = SPRITE_SIZE(8x8),\n    .tileOffset = 4,\n    .priority = 0,\n};\n\nstatic const struct Subsprite sSubsprite_RedOutline6 =\n{\n    .x = 0,\n    .y = 0,\n    .shape = SPRITE_SHAPE(8x8),\n    .size = SPRITE_SIZE(8x8),\n    .tileOffset = 5,\n    .priority = 0,\n};\n\nstatic const struct Subsprite sSubsprite_RedOutline7 =\n{\n    .x = 0,\n    .y = 0,\n    .shape = SPRITE_SHAPE(8x8),\n    .size = SPRITE_SIZE(8x8),\n    .tileOffset = 6,\n    .priority = 0,\n};\n\nstatic const struct Subsprite sSubsprite_RedOutline8 =\n{\n    .x = 0,\n    .y = 0,\n    .shape = SPRITE_SHAPE(8x8),\n    .size = SPRITE_SIZE(8x8),\n    .tileOffset = 7,\n    .priority = 0,\n};\n\nstatic const struct OamData sOamData_RedArrowCursor =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = 0,\n    .mosaic = FALSE,\n    .bpp = 0,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sSpriteAnim_RedArrowCursor[] =\n{\n    ANIMCMD_FRAME(0, 30),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_RedArrowCursor[] = { sSpriteAnim_RedArrowCursor };\n\nstatic const struct SpriteTemplate sSpriteTemplate_RedArrowCursor =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &sOamData_RedArrowCursor,\n    .anims = sSpriteAnimTable_RedArrowCursor,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallback_RedArrowCursor,\n};\n\nstatic const u16 sRedArrowPal[] = INCBIN_U16(\"graphics/interface/red_arrow.gbapal\");\nstatic const u32 sRedArrowOtherGfx[] = INCBIN_U32(\"graphics/interface/red_arrow_other.4bpp.lz\");\nstatic const u32 sSelectorOutlineGfx[] = INCBIN_U32(\"graphics/interface/selector_outline.4bpp.lz\");\nstatic const u32 sRedArrowGfx[] = INCBIN_U32(\"graphics/interface/red_arrow.4bpp.lz\");\n\n#define tState data[0]\n#define tAnimNum data[1]\n#define tBounceDir data[2]\n#define tMultiplier data[3]\n#define tFrequency data[4]\n#define tSinePos data[5]\n\nstatic void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite)\n{\n    s32 multiplier;\n\n    switch (sprite->tState)\n    {\n    case 0:\n        StartSpriteAnim(sprite, sprite->tAnimNum);\n        sprite->tState++;\n        break;\n    case 1:\n        switch (sprite->tBounceDir)\n        {\n        case 0:\n            multiplier = sprite->tMultiplier;\n            sprite->x2 = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256;\n            break;\n        case 1:\n            multiplier = sprite->tMultiplier;\n            sprite->y2 = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256;\n            break;\n        }\n        sprite->tSinePos += sprite->tFrequency;\n        break;\n    }\n}\n\nstatic u8 AddScrollIndicatorArrowObject(u8 arrowDir, u8 x, u8 y, u16 tileTag, u16 palTag)\n{\n    u8 spriteId;\n    struct SpriteTemplate spriteTemplate;\n\n    spriteTemplate = sSpriteTemplate_ScrollArrowIndicator;\n    spriteTemplate.tileTag = tileTag;\n    spriteTemplate.paletteTag = palTag;\n    spriteId = CreateSprite(&spriteTemplate, x, y, 0);\n    gSprites[spriteId].invisible = TRUE;\n    gSprites[spriteId].tState = 0;\n    gSprites[spriteId].tAnimNum = sScrollIndicatorTemplates[arrowDir].animNum;\n    gSprites[spriteId].tBounceDir = sScrollIndicatorTemplates[arrowDir].bounceDir;\n    gSprites[spriteId].tMultiplier = sScrollIndicatorTemplates[arrowDir].multiplier;\n    gSprites[spriteId].tFrequency = sScrollIndicatorTemplates[arrowDir].frequency;\n    gSprites[spriteId].tSinePos = 0;\n    return spriteId;\n}\n\n#undef tState\n#undef tAnimNum\n#undef tBounceDir\n#undef tMultiplier\n#undef tFrequency\n#undef tSinePos\n\nu8 AddScrollIndicatorArrowPair(const struct ScrollArrowsTemplate *arrowInfo, u16 *scrollOffset)\n{\n    struct CompressedSpriteSheet spriteSheet;\n    struct SpritePalette spritePal;\n    struct ScrollIndicatorPair *data;\n    u8 taskId;\n\n    spriteSheet.data = sRedArrowOtherGfx;\n    spriteSheet.size = 0x100;\n    spriteSheet.tag = arrowInfo->tileTag;\n    LoadCompressedSpriteSheet(&spriteSheet);\n    if (arrowInfo->palTag == TAG_NONE)\n    {\n        LoadPalette(sRedArrowPal, OBJ_PLTT_ID(arrowInfo->palNum), sizeof(sRedArrowPal));\n    }\n    else\n    {\n        spritePal.data = sRedArrowPal;\n        spritePal.tag = arrowInfo->palTag;\n        LoadSpritePalette(&spritePal);\n    }\n    taskId = CreateTask(Task_ScrollIndicatorArrowPair, 0);\n    data = (struct ScrollIndicatorPair *)gTasks[taskId].data;\n\n    data->field_0 = 0;\n    data->scrollOffset = scrollOffset;\n    data->fullyUpThreshold = arrowInfo->fullyUpThreshold;\n    data->fullyDownThreshold = arrowInfo->fullyDownThreshold;\n    data->tileTag = arrowInfo->tileTag;\n    data->palTag = arrowInfo->palTag;\n    data->topSpriteId = AddScrollIndicatorArrowObject(arrowInfo->firstArrowType, arrowInfo->firstX, arrowInfo->firstY, arrowInfo->tileTag, arrowInfo->palTag);\n    data->bottomSpriteId = AddScrollIndicatorArrowObject(arrowInfo->secondArrowType, arrowInfo->secondX, arrowInfo->secondY, arrowInfo->tileTag, arrowInfo->palTag);\n\n    if (arrowInfo->palTag == TAG_NONE)\n    {\n        gSprites[data->topSpriteId].oam.paletteNum = arrowInfo->palNum;\n        gSprites[data->bottomSpriteId].oam.paletteNum = arrowInfo->palNum;\n    }\n    return taskId;\n}\n\nu8 AddScrollIndicatorArrowPairParameterized(u32 arrowType, s32 commonPos, s32 firstPos, s32 secondPos, s32 fullyDownThreshold, s32 tileTag, s32 palTag, u16 *scrollOffset)\n{\n    if (arrowType == SCROLL_ARROW_UP || arrowType == SCROLL_ARROW_DOWN)\n    {\n        sTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_UP;\n        sTempScrollArrowTemplate.firstX = commonPos;\n        sTempScrollArrowTemplate.firstY = firstPos;\n        sTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_DOWN;\n        sTempScrollArrowTemplate.secondX = commonPos;\n        sTempScrollArrowTemplate.secondY = secondPos;\n    }\n    else\n    {\n        sTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_LEFT;\n        sTempScrollArrowTemplate.firstX = firstPos;\n        sTempScrollArrowTemplate.firstY = commonPos;\n        sTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_RIGHT;\n        sTempScrollArrowTemplate.secondX = secondPos;\n        sTempScrollArrowTemplate.secondY = commonPos;\n    }\n    sTempScrollArrowTemplate.fullyUpThreshold = 0;\n    sTempScrollArrowTemplate.fullyDownThreshold = fullyDownThreshold;\n    sTempScrollArrowTemplate.tileTag = tileTag;\n    sTempScrollArrowTemplate.palTag = palTag;\n    sTempScrollArrowTemplate.palNum = 0;\n\n    return AddScrollIndicatorArrowPair(&sTempScrollArrowTemplate, scrollOffset);\n}\n\nstatic void Task_ScrollIndicatorArrowPair(u8 taskId)\n{\n    struct ScrollIndicatorPair *data = (struct ScrollIndicatorPair *)gTasks[taskId].data;\n    u16 currItem = (*data->scrollOffset);\n\n    if (currItem == data->fullyUpThreshold)\n        gSprites[data->topSpriteId].invisible = TRUE;\n    else\n        gSprites[data->topSpriteId].invisible = FALSE;\n\n    if (currItem == data->fullyDownThreshold)\n        gSprites[data->bottomSpriteId].invisible = TRUE;\n    else\n        gSprites[data->bottomSpriteId].invisible = FALSE;\n}\n\nvoid RemoveScrollIndicatorArrowPair(u8 taskId)\n{\n    struct ScrollIndicatorPair *data = (struct ScrollIndicatorPair *)gTasks[taskId].data;\n\n    if (data->tileTag != TAG_NONE)\n        FreeSpriteTilesByTag(data->tileTag);\n    if (data->palTag != TAG_NONE)\n        FreeSpritePaletteByTag(data->palTag);\n    DestroySprite(&gSprites[data->topSpriteId]);\n    DestroySprite(&gSprites[data->bottomSpriteId]);\n    DestroyTask(taskId);\n}\n\nu8 ListMenuAddCursorObjectInternal(const struct CursorStruct *cursor, u32 cursorKind)\n{\n    switch (cursorKind)\n    {\n    case 0:\n    default:\n        return ListMenuAddRedOutlineCursorObject(cursor);\n    case 1:\n        return ListMenuAddRedArrowCursorObject(cursor);\n    }\n}\n\nvoid ListMenuUpdateCursorObject(u8 taskId, u16 x, u16 y, u32 cursorKind)\n{\n    switch (cursorKind)\n    {\n    case 0:\n        ListMenuUpdateRedOutlineCursorObject(taskId, x, y);\n        break;\n    case 1:\n        ListMenuUpdateRedArrowCursorObject(taskId, x, y);\n        break;\n    }\n}\n\nvoid ListMenuRemoveCursorObject(u8 taskId, u32 cursorKind)\n{\n    switch (cursorKind)\n    {\n    case 0:\n        ListMenuRemoveRedOutlineCursorObject(taskId);\n        break;\n    case 1:\n        ListMenuRemoveRedArrowCursorObject(taskId);\n        break;\n    }\n}\n\nvoid Task_RedOutlineCursor(u8 taskId)\n{\n}\n\nu8 ListMenuGetRedOutlineCursorSpriteCount(u16 rowWidth, u16 rowHeight)\n{\n    s32 i, count = 4;\n\n    if (rowWidth > 16)\n        for (i = 8; i < (rowWidth - 8); i += 8)\n            count += 2;\n    if (rowHeight > 16)\n        for (i = 8; i < (rowHeight - 8); i += 8)\n            count += 2;\n    return count;\n}\n\nvoid ListMenuSetUpRedOutlineCursorSpriteOamTable(u16 rowWidth, u16 rowHeight, struct Subsprite *subsprites)\n{\n    s32 i, j, id = 0;\n\n    subsprites[id] = sSubsprite_RedOutline1;\n    subsprites[id].x = 136;\n    subsprites[id].y = 136;\n    id++;\n    subsprites[id] = sSubsprite_RedOutline2;\n    subsprites[id].x = rowWidth + 128;\n    subsprites[id].y = 136;\n    id++;\n    subsprites[id] = sSubsprite_RedOutline7;\n    subsprites[id].x = 136;\n    subsprites[id].y = rowHeight + 128;\n    id++;\n    subsprites[id] = sSubsprite_RedOutline8;\n    subsprites[id].x = rowWidth + 128;\n    subsprites[id].y = rowHeight + 128;\n    id++;\n    if (rowWidth > 16)\n    {\n        for (i = 8; i < rowWidth - 8; i += 8)\n        {\n            subsprites[id] = sSubsprite_RedOutline3;\n            subsprites[id].x = i - 120;\n            subsprites[id].y = 136;\n            id++;\n\n            subsprites[id] = sSubsprite_RedOutline6;\n            subsprites[id].x = i - 120;\n            subsprites[id].y = rowHeight + 128;\n            id++;\n        }\n    }\n    if (rowHeight > 16)\n    {\n        for (j = 8; j < rowHeight - 8; j += 8)\n        {\n            subsprites[id] = sSubsprite_RedOutline4;\n            subsprites[id].x = 136;\n            subsprites[id].y = j - 120;\n            id++;\n            subsprites[id] = sSubsprite_RedOutline5;\n            subsprites[id].x = rowWidth + 128;\n            subsprites[id].y = j - 120;\n            id++;\n        }\n    }\n}\n\nu8 ListMenuAddRedOutlineCursorObject(const struct CursorStruct *cursor)\n{\n    struct CompressedSpriteSheet spriteSheet;\n    struct SpritePalette spritePal;\n    struct RedOutlineCursor *data;\n    struct SpriteTemplate spriteTemplate;\n    u8 taskId;\n\n    spriteSheet.data = sSelectorOutlineGfx;\n    spriteSheet.size = 0x100;\n    spriteSheet.tag = cursor->tileTag;\n    LoadCompressedSpriteSheet(&spriteSheet);\n    if (cursor->palTag == TAG_NONE)\n    {\n        LoadPalette(sRedArrowPal, OBJ_PLTT_ID(cursor->palNum), sizeof(sRedArrowPal));\n    }\n    else\n    {\n        spritePal.data = sRedArrowPal;\n        spritePal.tag = cursor->palTag;\n        LoadSpritePalette(&spritePal);\n    }\n    taskId = CreateTask(Task_RedOutlineCursor, 0);\n    data = (struct RedOutlineCursor *)gTasks[taskId].data;\n    data->tileTag = cursor->tileTag;\n    data->palTag = cursor->palTag;\n    data->subspriteTable.subspriteCount = ListMenuGetRedOutlineCursorSpriteCount(cursor->rowWidth, cursor->rowHeight);\n    data->subspriteTable.subsprites = data->subspritesPtr = Alloc(data->subspriteTable.subspriteCount * 4);\n    ListMenuSetUpRedOutlineCursorSpriteOamTable(cursor->rowWidth, cursor->rowHeight, data->subspritesPtr);\n    spriteTemplate = gDummySpriteTemplate;\n    spriteTemplate.tileTag = cursor->tileTag;\n    spriteTemplate.paletteTag = cursor->palTag;\n    data->spriteId = CreateSprite(&spriteTemplate, cursor->left + 120, cursor->top + 120, 0);\n    SetSubspriteTables(&gSprites[data->spriteId], &data->subspriteTable);\n    gSprites[data->spriteId].oam.priority = 0;\n    gSprites[data->spriteId].subpriority = 0;\n    gSprites[data->spriteId].subspriteTableNum = 0;\n    if (cursor->palTag == TAG_NONE)\n        gSprites[data->spriteId].oam.paletteNum = cursor->palNum;\n    return taskId;\n}\n\nvoid ListMenuUpdateRedOutlineCursorObject(u8 taskId, u16 x, u16 y)\n{\n    struct RedOutlineCursor *data = (struct RedOutlineCursor *)gTasks[taskId].data;\n\n    gSprites[data->spriteId].x = x + 120;\n    gSprites[data->spriteId].y = y + 120;\n}\n\nvoid ListMenuRemoveRedOutlineCursorObject(u8 taskId)\n{\n    struct RedOutlineCursor *data = (struct RedOutlineCursor *)gTasks[taskId].data;\n\n    Free(data->subspritesPtr);\n    if (data->tileTag != TAG_NONE)\n        FreeSpriteTilesByTag(data->tileTag);\n    if (data->palTag != TAG_NONE)\n        FreeSpritePaletteByTag(data->palTag);\n    DestroySprite(&gSprites[data->spriteId]);\n    DestroyTask(taskId);\n}\n\nstatic void SpriteCallback_RedArrowCursor(struct Sprite *sprite)\n{\n    sprite->x2 = gSineTable[(u8)(sprite->data[0])] / 64;\n    sprite->data[0] += 8;\n}\n\nstatic void Task_RedArrowCursor(u8 taskId)\n{\n}\n\nstatic u8 ListMenuAddRedArrowCursorObject(const struct CursorStruct *cursor)\n{\n    struct CompressedSpriteSheet spriteSheet;\n    struct SpritePalette spritePal;\n    struct RedArrowCursor *data;\n    struct SpriteTemplate spriteTemplate;\n    u8 taskId;\n\n    spriteSheet.data = sRedArrowGfx;\n    spriteSheet.size = 0x80;\n    spriteSheet.tag = cursor->tileTag;\n    LoadCompressedSpriteSheet(&spriteSheet);\n    if (cursor->palTag == TAG_NONE)\n    {\n        LoadPalette(sRedArrowPal, OBJ_PLTT_ID(cursor->palNum), sizeof(sRedArrowPal));\n    }\n    else\n    {\n        spritePal.data = sRedArrowPal;\n        spritePal.tag = cursor->palTag;\n        LoadSpritePalette(&spritePal);\n    }\n    taskId = CreateTask(Task_RedArrowCursor, 0);\n    data = (struct RedArrowCursor *)gTasks[taskId].data;\n    data->tileTag = cursor->tileTag;\n    data->palTag = cursor->palTag;\n    spriteTemplate = sSpriteTemplate_RedArrowCursor;\n    spriteTemplate.tileTag = cursor->tileTag;\n    spriteTemplate.paletteTag = cursor->palTag;\n    data->spriteId = CreateSprite(&spriteTemplate, cursor->left, cursor->top, 0);\n    gSprites[data->spriteId].x2 = 8;\n    gSprites[data->spriteId].y2 = 8;\n    if (cursor->palTag == TAG_NONE)\n        gSprites[data->spriteId].oam.paletteNum = cursor->palNum;\n    return taskId;\n}\n\nstatic void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y)\n{\n    struct RedArrowCursor *data = (struct RedArrowCursor *)gTasks[taskId].data;\n\n    gSprites[data->spriteId].x = x;\n    gSprites[data->spriteId].y = y;\n}\n\nstatic void ListMenuRemoveRedArrowCursorObject(u8 taskId)\n{\n    struct RedArrowCursor *data = (struct RedArrowCursor *)gTasks[taskId].data;\n\n    if (data->tileTag != TAG_NONE)\n        FreeSpriteTilesByTag(data->tileTag);\n    if (data->palTag != TAG_NONE)\n        FreeSpritePaletteByTag(data->palTag);\n    DestroySprite(&gSprites[data->spriteId]);\n    DestroyTask(taskId);\n}\n"
  },
  {
    "path": "src/metatile_behavior.c",
    "content": "#include \"global.h\"\n#include \"metatile_behavior.h\"\n#include \"constants/metatile_behaviors.h\"\n\nstatic const bool8 sBehaviorSurfable[NUM_METATILE_BEHAVIORS] = {\n    [MB_POND_WATER]         = TRUE,\n    [MB_FAST_WATER]         = TRUE,\n    [MB_DEEP_WATER]         = TRUE,\n    [MB_WATERFALL]          = TRUE,\n    [MB_OCEAN_WATER]        = TRUE,\n    [MB_UNUSED_WATER]       = TRUE,\n    [MB_CYCLING_ROAD_WATER] = TRUE,\n    [MB_EASTWARD_CURRENT]   = TRUE,\n    [MB_WESTWARD_CURRENT]   = TRUE,\n    [MB_NORTHWARD_CURRENT]  = TRUE,\n    [MB_SOUTHWARD_CURRENT]  = TRUE\n};\n\nstatic const u8 sTileBitAttributes[32] = {\n    [0] = 0,\n    [1] = 1 << 0,\n    [2] = 1 << 1,\n    [3] = 1 << 2,\n    [4] = 1 << 3,\n};\n\nbool8 MetatileBehavior_IsATile(u8 metatileBehavior)\n{\n    return TRUE;\n}\n\nbool8 MetatileBehavior_IsJumpEast(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_JUMP_EAST)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsJumpWest(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_JUMP_WEST)\n            return TRUE;\n        else\n            return FALSE;\n}\n\nbool8 MetatileBehavior_IsJumpNorth(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_JUMP_NORTH)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsJumpSouth(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_JUMP_SOUTH)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsPokeGrass(u8 metatileBehavior)\n{\n    if(metatileBehavior == MB_TALL_GRASS || metatileBehavior == MB_CYCLING_ROAD_PULL_DOWN_GRASS || metatileBehavior == MB_LONG_GRASS || metatileBehavior == MB_ASHGRASS)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSand(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SAND || metatileBehavior == MB_SAND_CAVE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSandOrShallowFlowingWater(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SAND || metatileBehavior == MB_SHALLOW_WATER)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsDeepSand(u8 metatileBehavior) { return FALSE; }\n\nbool8 MetatileBehavior_IsReflective(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_POND_WATER\n     || metatileBehavior == MB_PUDDLE\n     || metatileBehavior == MB_UNUSED_WATER\n     || metatileBehavior == MB_CYCLING_ROAD_WATER\n     || metatileBehavior == MB_ICE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsIce(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_ICE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsWarpDoor(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_WARP_DOOR)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsWarpDoor_2(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_WARP_DOOR)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsEscalator(u8 metatileBehavior)\n{\n    if (metatileBehavior >= MB_UP_ESCALATOR && metatileBehavior <= MB_DOWN_ESCALATOR)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsDirectionalUpRightStairWarp(u8 metatileBehavior)\n{\n    u8 result = FALSE;\n\n    if (metatileBehavior == MB_UP_RIGHT_STAIR_WARP)\n        result = TRUE;\n\n    return result;\n}\n\nbool8 MetatileBehavior_IsDirectionalUpLeftStairWarp(u8 metatileBehavior)\n{\n    u8 result = FALSE;\n\n    if (metatileBehavior == MB_UP_LEFT_STAIR_WARP)\n        result = TRUE;\n\n    return result;\n}\n\nbool8 MetatileBehavior_IsDirectionalDownRightStairWarp(u8 metatileBehavior)\n{\n    u8 result = FALSE;\n\n    if (metatileBehavior == MB_DOWN_RIGHT_STAIR_WARP)\n        result = TRUE;\n\n    return result;\n}\n\nbool8 MetatileBehavior_IsDirectionalDownLeftStairWarp(u8 metatileBehavior)\n{\n    u8 result = FALSE;\n\n    if (metatileBehavior == MB_DOWN_LEFT_STAIR_WARP)\n        result = TRUE;\n\n    return result;\n}\n\nbool8 MetatileBehavior_IsDirectionalStairWarp(u8 metatileBehavior)\n{\n    bool8 result = FALSE;\n\n    if (metatileBehavior >= MB_UP_RIGHT_STAIR_WARP && metatileBehavior <= MB_DOWN_LEFT_STAIR_WARP)\n        result = TRUE;\n    else\n        result = FALSE;\n\n    return result;\n}\n\nbool8 MetatileBehavior_IsLadder(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_LADDER)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsNonAnimDoor(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_CAVE_DOOR)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsDeepSouthWarp(u8 metatileBehavior) { return FALSE; }\n\nbool8 MetatileBehavior_IsSurfable(u8 metatileBehavior)\n{\n    if (sBehaviorSurfable[metatileBehavior] & 1)\n        return TRUE;\n    else\n        return FALSE;\n}\n\n// Water that's too fast to surf on\nbool8 MetatileBehavior_IsFastWater(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_FAST_WATER)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsEastArrowWarp(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_EAST_ARROW_WARP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsWestArrowWarp(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_WEST_ARROW_WARP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsNorthArrowWarp(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_NORTH_ARROW_WARP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSouthArrowWarp(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SOUTH_ARROW_WARP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsArrowWarp(u8 metatileBehavior)\n{\n    u8 result = FALSE;\n\n    if (MetatileBehavior_IsEastArrowWarp(metatileBehavior)\n     || MetatileBehavior_IsWestArrowWarp(metatileBehavior)\n     || MetatileBehavior_IsNorthArrowWarp(metatileBehavior)\n     || MetatileBehavior_IsSouthArrowWarp(metatileBehavior))\n        result = TRUE;\n\n    return result;\n}\n\nbool8 MetatileBehavior_IsForcedMovementTile(u8 metatileBehavior)\n{\n    if ((metatileBehavior >= MB_WALK_EAST && metatileBehavior <= MB_TRICK_HOUSE_PUZZLE_8_FLOOR)\n      || (metatileBehavior >= MB_EASTWARD_CURRENT && metatileBehavior <= MB_SOUTHWARD_CURRENT)\n      ||  metatileBehavior == MB_WATERFALL\n      ||  metatileBehavior == MB_ICE\n      || (metatileBehavior >= MB_SPIN_RIGHT && metatileBehavior <= MB_SPIN_DOWN))\n            return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsIce_2(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_ICE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsTrickHouseSlipperyFloor(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_TRICK_HOUSE_PUZZLE_8_FLOOR)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsWalkNorth(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_WALK_NORTH)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsWalkSouth(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_WALK_SOUTH)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsWalkWest(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_WALK_WEST)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsWalkEast(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_WALK_EAST)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsNorthwardCurrent(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_NORTHWARD_CURRENT)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSouthwardCurrent(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SOUTHWARD_CURRENT)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsWestwardCurrent(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_WESTWARD_CURRENT)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsEastwardCurrent(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_EASTWARD_CURRENT)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSlideNorth(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SLIDE_NORTH)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSlideSouth(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SLIDE_SOUTH)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSlideWest(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SLIDE_WEST)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSlideEast(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SLIDE_EAST)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsCounter(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_COUNTER)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsPlayerFacingTVScreen(u8 metatileBehavior, u8 playerDirection)\n{\n    if (playerDirection != DIR_NORTH)\n        return FALSE;\n    else if (metatileBehavior == MB_TELEVISION)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsPC(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_PC)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_HasRipples(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_POND_WATER || metatileBehavior == MB_PUDDLE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsPuddle(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_PUDDLE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsTallGrass(u8 metatileBehavior)\n{\n    if(metatileBehavior == MB_TALL_GRASS || metatileBehavior == MB_CYCLING_ROAD_PULL_DOWN_GRASS || metatileBehavior == MB_ASHGRASS)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsLongGrass(u8 metatileBehavior)\n{\n    if(metatileBehavior == MB_LONG_GRASS)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsFootprints(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsBridge(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_GetBridgeType(u8 metatileBehavior) { return FALSE; }\n\nbool8 MetatileBehavior_IsUnused01(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_UNUSED_01)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_UnusedIsTallGrass(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_TALL_GRASS)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsIndoorEncounter(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_INDOOR_ENCOUNTER)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsMountain(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_MOUNTAIN_TOP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsDiveable(u8 metatileBehavior)\n{\n    if (metatileBehavior >= MB_FAST_WATER && metatileBehavior <= MB_DEEP_WATER)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsUnableToEmerge(u8 metatileBehavior)\n{\n    if(metatileBehavior == MB_UNDERWATER_BLOCKED_ABOVE || metatileBehavior == MB_SEAWEED_NO_SURFACING)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsShallowFlowingWater(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SHALLOW_WATER)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsThinIce(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_THIN_ICE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsCrackedIce(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_CRACKED_ICE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsDeepWaterTerrain(u8 metatileBehavior)\n{\n    if ((metatileBehavior >= MB_FAST_WATER && metatileBehavior <= MB_DEEP_WATER)\n      || metatileBehavior == MB_OCEAN_WATER)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsUnusedWater(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_UNUSED_WATER)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSurfableAndNotWaterfall(u8 metatileBehavior)\n{\n    if (MetatileBehavior_IsSurfable(metatileBehavior)\n        && !MetatileBehavior_IsWaterfall(metatileBehavior))\n            return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsEastBlocked(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_IMPASSABLE_EAST\n     || metatileBehavior == MB_IMPASSABLE_NORTHEAST\n     || metatileBehavior == MB_IMPASSABLE_SOUTHEAST)\n            return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsWestBlocked(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_IMPASSABLE_WEST\n     || metatileBehavior == MB_IMPASSABLE_NORTHWEST\n     || metatileBehavior == MB_IMPASSABLE_SOUTHWEST)\n            return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsNorthBlocked(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_IMPASSABLE_NORTH\n     || metatileBehavior == MB_IMPASSABLE_NORTHEAST\n     || metatileBehavior == MB_IMPASSABLE_NORTHWEST)\n            return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSouthBlocked(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_IMPASSABLE_SOUTH\n     || metatileBehavior == MB_IMPASSABLE_SOUTHEAST\n     || metatileBehavior == MB_IMPASSABLE_SOUTHWEST)\n            return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsShortGrass(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SHORT_GRASS)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsHotSprings(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_HOT_SPRINGS)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsWaterfall(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_WATERFALL)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsFortreeBridge(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsPacifidlogVerticalLogTop(u8 metatileBehavior){ return FALSE; }\nbool8 MetatileBehavior_IsPacifidlogVerticalLogBottom(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsPacifidlogHorizontalLogLeft(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsPacifidlogHorizontalLogRight(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsPacifidlogLog(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsTrickHousePuzzleDoor(u8 metatileBehavior) { return FALSE; }\n\nbool8 MetatileBehavior_IsRegionMap(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_REGION_MAP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsRoulette(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsPokeblockFeeder(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsSecretBaseJumpMat(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsSecretBaseSpinMat(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsLavaridgeB1FWarp(u8 metatileBehavior) { return FALSE; }\n\nbool8 MetatileBehavior_IsLavaridge1FWarp(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_LAVARIDGE_1F_WARP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsWarpPad(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_REGULAR_WARP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsUnionRoomWarp(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_UNION_ROOM_WARP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsWater(u8 metatileBehavior)\n{\n    if ((metatileBehavior >= MB_POND_WATER && metatileBehavior <= MB_DEEP_WATER)\n     ||  metatileBehavior == MB_OCEAN_WATER\n     || (metatileBehavior >= MB_EASTWARD_CURRENT && metatileBehavior <= MB_SOUTHWARD_CURRENT))\n            return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsFallWarp(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_FALL_WARP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsCrackedFloor(u8 metatileBehavior){ return FALSE; }\n\nbool32 MetatileBehavior_IsCyclingRoadPullDownTile(u8 metatileBehavior)\n{\n    if (metatileBehavior >= MB_CYCLING_ROAD_PULL_DOWN && metatileBehavior <= MB_CYCLING_ROAD_PULL_DOWN_GRASS)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsCyclingRoadPullDownTileGrass(u8 metatileBehavior)\n{\n    return metatileBehavior == MB_CYCLING_ROAD_PULL_DOWN_GRASS;\n}\n\nbool8 MetatileBehavior_IsBumpySlope(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsIsolatedVerticalRail(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsIsolatedHorizontalRail(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsVerticalRail(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsHorizontalRail(u8 metatileBehavior) { return FALSE; }\n\nbool8 MetatileBehavior_IsSeaweed(u8 metatileBehavior)\n{\n    if(metatileBehavior == MB_SEAWEED || metatileBehavior == MB_SEAWEED_NO_SURFACING)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsRunningDisallowed(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_RUNNING_DISALLOWED)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSafariExtensionSign(u8 metatileBehavior, u8 playerDirection)\n{\n    if(playerDirection != DIR_NORTH && playerDirection != DIR_EAST)\n        return FALSE;\n    else if(metatileBehavior == MB_SAFARI_ZONE_EXTENSION_SIGN)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsBookshelf(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_BOOKSHELF)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsPokeMartShelf(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_POKEMART_SHELF)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsPlayerFacingPokemonCenterSign(u8 metatileBehavior, u8 playerDirection)\n{\n    if (playerDirection != DIR_NORTH)\n        return FALSE;\n    else if (metatileBehavior == MB_POKEMON_CENTER_SIGN)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsPlayerFacingPokeMartSign(u8 metatileBehavior, u8 playerDirection)\n{\n    if (playerDirection != DIR_NORTH)\n        return FALSE;\n    else if (metatileBehavior == MB_POKEMART_SIGN)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_UnknownDummy1(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_UnknownDummy2(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_UnknownDummy3(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_UnknownDummy4(u8 metatileBehavior) { return FALSE; }\n\nbool8 TestMetatileAttributeBit(u8 arg1, u8 arg2)\n{\n    if (sTileBitAttributes[arg1] & arg2)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSpinRight(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SPIN_RIGHT)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSpinLeft(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SPIN_LEFT)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSpinUp(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SPIN_UP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSpinDown(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SPIN_DOWN)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsStopSpinning(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_STOP_SPINNING)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSpinTile(u8 metatileBehavior)\n{\n    bool8 result = FALSE;\n\n    if (metatileBehavior >= MB_SPIN_RIGHT && metatileBehavior <= MB_SPIN_DOWN)\n        result = TRUE;\n    else\n        result = FALSE;\n\n    return result;\n}\n\nbool8 MetatileBehavior_IsSignpost(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SIGNPOST)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsCabinet(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_CABINET)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsKitchen(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_KITCHEN)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsDresser(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_DRESSER)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsSnacks(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_SNACKS)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsStrengthButton(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_STRENGTH_BUTTON)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsPlayerFacingCableClubWirelessMonitor(u8 metatileBehavior, u8 playerDirection)\n{\n    if (playerDirection != DIR_NORTH)\n        return FALSE;\n    else if (metatileBehavior == MB_CABLE_CLUB_WIRELESS_MONITOR)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsPlayerFacingBattleRecords(u8 metatileBehavior, u8 playerDirection)\n{\n    if (playerDirection != DIR_NORTH)\n        return FALSE;\n    else if (metatileBehavior == MB_BATTLE_RECORDS)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsQuestionnaire(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_QUESTIONNAIRE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsIndigoPlateauSign1(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_INDIGO_PLATEAU_SIGN_1)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsIndigoPlateauSign2(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_INDIGO_PLATEAU_SIGN_2)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsFood(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_FOOD)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsRockStairs(u8 metatileBehavior)\n{\n    bool8 result = FALSE;\n\n    if (metatileBehavior == MB_ROCK_STAIRS)\n        result = TRUE;\n    else\n        result = FALSE;\n\n    return result;\n}\n\nbool8 MetatileBehavior_IsBlueprints(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_BLUEPRINTS)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsPainting(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_PAINTING)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsPowerPlantMachine(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_POWER_PLANT_MACHINE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsTelephone(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_TELEPHONE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsComputer(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_COMPUTER)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsAdvertisingPoster(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_ADVERTISING_POSTER)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsTastyFood(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_FOOD_SMELLS_TASTY)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsTrashBin(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_TRASH_BIN)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsCup(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_CUP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsPolishedWindow(u8 metatileBehavior) { return FALSE; }\nbool8 MetatileBehavior_IsBeautifulSkyWindow(u8 metatileBehavior) { return FALSE; }\n\nbool8 MetatileBehavior_IsBlinkingLights(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_BLINKING_LIGHTS)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsNeatlyLinedUpTools(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_NEATLY_LINED_UP_TOOLS)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsImpressiveMachine(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_IMPRESSIVE_MACHINE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsVideoGame(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_VIDEO_GAME)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsBurglary(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_BURGLARY)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsTrainerTowerMonitor(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_TRAINER_TOWER_MONITOR)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 MetatileBehavior_IsAshGrass(u8 metatileBehavior)\n{\n    if (metatileBehavior == MB_ASHGRASS)\n        return TRUE;\n    else\n        return FALSE;\n}\n"
  },
  {
    "path": "src/mini_printf.c",
    "content": "/*\n * The Minimal snprintf() implementation\n *\n * Copyright (c) 2013,2014 Michal Ludvig <michal@logix.cz>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of the auhor nor the names of its contributors\n *       may be used to endorse or promote products derived from this software\n *       without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * mini-printf courtesy of https://github.com/mludvig/mini-printf\n * stripped to reduce file size for agb needs\n */\n\n#include \"mini_printf.h\"\n#include \"gba/types.h\"\n#include \"gba/defines.h\"\n#include \"config.h\"\n#include \"characters.h\"\n#include \"string_util.h\"\n\n#ifndef NDEBUG\n#if (PRETTY_PRINT_HANDLER != PRETTY_PRINT_OFF)\n\nstruct mini_buff \n{\n    char *buffer, *pbuffer;\n    u32 buffer_len;\n};\n\nstatic inline char mini_pchar_decode(char encoded)\n{\n    char ret = '?';\n    if (encoded >= CHAR_a && encoded <= CHAR_z)\n        ret = encoded-(CHAR_a-'a'); // lower-case characters\n    else if (encoded >= CHAR_A && encoded <= CHAR_Z)\n        ret = encoded-(CHAR_A-'A'); // upper-case characters\n    else if (encoded >= CHAR_0 && encoded <= CHAR_9)\n        ret = encoded-(CHAR_0-'0'); // numbers\n    else if (encoded == CHAR_SPACE)\n        ret = ' '; // space\n    else if (encoded == CHAR_EXCL_MARK)\n        ret = '!'; // exclamation point\n    else if (encoded == CHAR_QUESTION_MARK)\n        ret = '?'; // question mark\n    else if (encoded == CHAR_PERIOD)\n        ret = '.'; // period\n    else if (encoded == CHAR_DBL_QUOTE_LEFT || encoded == CHAR_DBL_QUOTE_RIGHT)\n        ret = '\"'; // double quote\n    else if (encoded == CHAR_SGL_QUOTE_LEFT || encoded == CHAR_SGL_QUOTE_RIGHT)\n        ret = '\\''; // single quote\n    else if (encoded == CHAR_CURRENCY)\n        ret = '$'; // currency mark (pokemonies in game, dollar sign in logs)\n    else if (encoded == CHAR_COMMA)\n        ret = ','; // comma\n    else if (encoded == CHAR_MULT_SIGN)\n        ret = '#'; // pound, hashtag, octothorpe, whatever\n    else if (encoded == CHAR_SLASH)\n        ret = '/'; // slash\n    else if (encoded == CHAR_LESS_THAN)\n        ret = '<'; // less than sign\n    else if (encoded == CHAR_GREATER_THAN)\n        ret = '>'; // greater than sign\n    else if (encoded == CHAR_PERCENT)\n        ret = '%'; // percentage\n    else if (encoded == CHAR_LEFT_PAREN)\n        ret = '('; // opening parentheses\n    else if (encoded == CHAR_RIGHT_PAREN)\n        ret = ')'; // closing parentheses\n    return ret;\n}\n\nstatic s32 _putsAscii(char *s, s32 len, void *buf)\n{\n    char *p0;\n    s32 i;\n    struct mini_buff *b;\n\n    if (!buf) \n        return len;\n\n    b = buf;\n    p0 = b->buffer;\n\n    /* Copy to buffer */\n    for (i = 0; i < len; i++) {\n        if(b->pbuffer == b->buffer + b->buffer_len - 1) {\n            break;\n        }\n        *(b->pbuffer ++) = s[i];\n    }\n    *(b->pbuffer) = 0;\n    return b->pbuffer - p0;\n}\n\nstatic s32 _putsEncoded(char *s, s32 len, void *buf)\n{\n    char *p0;\n    s32 i;\n    struct mini_buff *b;\n\n    if (!buf) \n        return len;\n\n    b = buf;\n    p0 = b->buffer;\n\n    /* Copy to buffer */\n    for (i = 0; i < len; i++) {\n        if(b->pbuffer == b->buffer + b->buffer_len - 1) {\n            break;\n        }\n        *(b->pbuffer ++) = mini_pchar_decode(s[i]);\n    }\n    *(b->pbuffer) = 0;\n    return b->pbuffer - p0;\n}\n\nstatic s32 mini_strlen(const char *s)\n{\n    s32 len = 0;\n    while (s[len] != '\\0') len++;\n    return len;\n}\n\nstatic s32 mini_itoa(s32 value, u32 radix, s32 uppercase, bool32 unsig, char *buffer)\n{\n    char *pbuffer = buffer;\n    s32 negative = 0;\n    s32 i, len;\n\n    /* No support for unusual radixes. */\n    if (radix > 16)\n        return 0;\n\n    if (value < 0 && !unsig)\n    {\n        negative = 1;\n        value = -value;\n    }\n\n    /* This builds the string back to front ... */\n    do \n    {\n        s32 digit = value % radix;\n        *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10);\n        value /= radix;\n    } while (value > 0);\n\n    if (negative)\n        *(pbuffer++) = '-';\n\n    *(pbuffer) = '\\0';\n\n    /* ... now we reverse it (could do it recursively but will\n     * conserve the stack space) */\n    len = (pbuffer - buffer);\n    for (i = 0; i < len / 2; i++)\n    {\n        char j = buffer[i];\n        buffer[i] = buffer[len-i-1];\n        buffer[len-i-1] = j;\n    }\n\n    return len;\n}\n\nstatic s32 mini_pad(char* ptr, s32 len, char pad_char, s32 pad_to, char *buffer)\n{\n    s32 i;\n    bool32 overflow = FALSE;\n    char * pbuffer = buffer;\n    if(pad_to == 0)\n        pad_to = len;\n    if (len > pad_to) {\n        len = pad_to;\n        overflow = TRUE;\n    }\n    for(i = pad_to - len; i > 0; i --)\n    {\n        *(pbuffer++) = pad_char;\n    }\n    for(i = len; i > 0; i --)\n    {\n        *(pbuffer++) = *(ptr++);\n    }\n    len = pbuffer - buffer;\n    if(overflow)\n    {\n        for (i = 0; i < 3 && pbuffer > buffer; i ++)\n        {\n            *(pbuffer-- - 1) = '*';\n        }\n    }\n    return len;\n}\n\ns32 mini_vsnprintf(char *buffer, u32 buffer_len, const char *fmt, va_list va)\n{\n    struct mini_buff b;\n    s32 n;\n    b.buffer = buffer;\n    b.pbuffer = buffer;\n    b.buffer_len = buffer_len;\n    if (buffer_len == 0)\n        buffer = NULL;\n    n = mini_vpprintf((buffer != NULL) ? &b : NULL, fmt, va);\n    if (buffer == NULL)\n        return n;\n    return b.pbuffer - b.buffer;\n}\n\ns32 mini_vpprintf(void* buf, const char *fmt, va_list va)\n{\n    char bf[24];\n    char bf2[24];\n    char ch;\n    s32 n;\n    n = 0;\n    while ((ch=*(fmt++)))\n    {\n        s32 len;\n        if (ch != '%')\n        {\n            len = 1;\n            len = _putsAscii(&ch, len, buf);\n        } else \n        {\n            char pad_char = ' ';\n            s32 pad_to = 0;\n            char l = 0;\n            char *ptr;\n\n            ch=*(fmt++);\n\n            /* Zero padding requested */\n            if (ch == '0')\n                pad_char = '0';\n            while (ch >= '0' && ch <= '9')\n            {\n                pad_to = pad_to * 10 + (ch - '0');\n                ch= *(fmt++);\n            }\n            if(pad_to > (s32) sizeof(bf))\n            {\n                pad_to = sizeof(bf);\n            }\n            if (ch == 'l')\n            {\n                l = 1;\n                ch=*(fmt++);\n            }\n\n            switch (ch) \n            {\n                case 0:\n                    goto end;\n                case 'u':\n                case 'd':\n                    if(l)\n                    {\n                        len = mini_itoa(va_arg(va, u32), 10, 0, (ch=='u'), bf2);\n                    } else\n                    {\n                        if(ch == 'u')\n                        {\n                            len = mini_itoa((u32) va_arg(va, u32), 10, 0, 1, bf2);\n                        }\n                        else\n                        {\n                            len = mini_itoa((s32) va_arg(va, s32), 10, 0, 0, bf2);\n                        }\n                    }\n                    len = mini_pad(bf2, len, pad_char, pad_to, bf);\n                    len = _putsAscii(bf, len, buf);\n                    break;\n\n                case 'x':\n                case 'X':\n                    if(l)\n                    {\n                        len = mini_itoa(va_arg(va, u32), 16, (ch=='X'), 1, bf2);\n                    }\n                    else\n                    {\n                        len = mini_itoa((u32) va_arg(va, u32), 16, (ch=='X'), 1, bf2);\n                    }\n                    len = mini_pad(bf2, len, pad_char, pad_to, bf);\n                    len = _putsAscii(bf, len, buf);\n                    break;\n\n                case 'c' :\n                    ch = (char)(va_arg(va, s32));\n                    len = mini_pad(&ch, 1, pad_char, pad_to, bf);\n                    len = _putsAscii(bf, len, buf);\n                    break;\n\n                case 's' :\n                    ptr = va_arg(va, char*);\n                    len = mini_strlen(ptr);\n                    if (pad_to > 0)\n                    {\n                        len = mini_pad(ptr, len, pad_char, pad_to, bf);\n                        len = _putsAscii(bf, len, buf);\n                    } else\n                    {\n                        len = _putsAscii(ptr, len, buf);\n                    }\n                    break;\n                case 'S' : // preproc encoded string handler\n                    ptr = va_arg(va, char*);\n                    len = StringLength(ptr);\n                    if (pad_to > 0)\n                    {\n                        len = mini_pad(ptr, len, pad_char, pad_to, bf);\n                        len = _putsEncoded(bf, len, buf);\n                    } else\n                    {\n                        len = _putsEncoded(ptr, len, buf);\n                    }\n                    break;\n                default:\n                    len = 1;\n                    len = _putsAscii(&ch, len, buf);\n                    break;\n            }\n        }\n        n = n + len;\n    }\nend:\n    return n;\n}\n\n#endif\n#endif\n"
  },
  {
    "path": "src/minigame_countdown.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"constants/songs.h\"\n\nstatic void Task_MinigameCountdown(u8 taskId);\nstatic bool32 RunMinigameCountdownDigitsAnim(u8 spriteId);\nstatic void StartStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3);\nstatic bool32 IsStartGraphicAnimRunning(u8 spriteId);\nstatic void SpriteCB_Start(struct Sprite *sprite);\nstatic void Load321StartGfx(u16 tilesTag, u16 palTag);\nstatic u8 CreateNumberSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority);\nstatic void CreateStartSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p);\n\n#define tState       data[0]\n#define tTilesTag    data[2]\n#define tPalTag      data[3]\n#define tX           data[4]\n#define tY           data[5]\n#define tSubpriority data[6]\n#define tSpriteId1   data[7]\n#define tSpriteId2   data[8]\n#define tSpriteId3   data[9]\n\nvoid StartMinigameCountdown(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)\n{\n    u8 taskId = CreateTask(Task_MinigameCountdown, 80);\n    gTasks[taskId].tTilesTag = tilesTag;\n    gTasks[taskId].tPalTag = palTag;\n    gTasks[taskId].tX = x;\n    gTasks[taskId].tY = y;\n    gTasks[taskId].tSubpriority = subpriority;\n}\n\nbool32 IsMinigameCountdownRunning(void)\n{\n    return FuncIsActiveTask(Task_MinigameCountdown);\n}\n\nstatic void Task_MinigameCountdown(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    switch (tState)\n    {\n    case 0:\n        Load321StartGfx(tTilesTag, tPalTag);\n        tSpriteId1 = CreateNumberSprite(tTilesTag, tPalTag, tX, tY, tSubpriority);\n        CreateStartSprite(tTilesTag, tPalTag, tX, tY, tSubpriority, &tSpriteId2, &tSpriteId3);\n        tState++;\n        break;\n    case 1:\n        if (!RunMinigameCountdownDigitsAnim(tSpriteId1))\n        {\n            StartStartGraphic(tSpriteId1, tSpriteId2, tSpriteId3);\n            FreeSpriteOamMatrix(&gSprites[tSpriteId1]);\n            DestroySprite(&gSprites[tSpriteId1]);\n            tState++;\n        }\n        break;\n    case 2:\n        if (!IsStartGraphicAnimRunning(tSpriteId2))\n        {\n            DestroySprite(&gSprites[tSpriteId2]);\n            DestroySprite(&gSprites[tSpriteId3]);\n            FreeSpriteTilesByTag(tTilesTag);\n            FreeSpritePaletteByTag(tPalTag);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic bool32 RunMinigameCountdownDigitsAnim(u8 spriteId)\n{\n    struct Sprite *sprite = &gSprites[spriteId];\n\n    switch (sprite->data[0])\n    {\n    case 0:\n        SetSpriteMatrixAnchor(sprite, NO_ANCHOR, 26);\n        sprite->data[0]++;\n        // fallthrough\n    case 1:\n        if (sprite->data[2] == 0)\n            PlaySE(SE_BALL_BOUNCE_2);\n        if (++sprite->data[2] >= 20)\n        {\n            sprite->data[2] = 0;\n            StartSpriteAffineAnim(sprite, 1);\n            sprite->data[0]++;\n        }\n        break;\n    case 2:\n        if (sprite->affineAnimEnded)\n            sprite->data[0]++;\n        break;\n    case 3:\n        if (++sprite->data[2] >= 4)\n        {\n            sprite->data[2] = 0;\n            sprite->data[0]++;\n            StartSpriteAffineAnim(sprite, 2);\n        }\n        break;\n    case 4:\n        sprite->y -= 4;\n        if (++sprite->data[2] >= 8)\n        {\n            if (sprite->data[4] < 2)\n            {\n                StartSpriteAnim(sprite, sprite->data[4] + 1);\n                sprite->data[2] = 0;\n                sprite->data[0]++;\n            }\n            else\n            {\n                sprite->data[0] = 7;\n                return FALSE;\n            }\n        }\n        break;\n    case 5:\n        sprite->y += 4;\n        if (++sprite->data[2] >= 8)\n        {\n            sprite->data[2] = 0;\n            StartSpriteAffineAnim(sprite, 3);\n            sprite->data[0]++;\n        }\n        break;\n    case 6:\n        if (sprite->affineAnimEnded)\n        {\n            sprite->data[4]++;\n            sprite->data[0] = 1;\n        }\n        break;\n    case 7:\n        return FALSE;\n    }\n    return TRUE;\n}\n\nstatic void StartStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3)\n{\n    gSprites[spriteId2].y2 = -40;\n    gSprites[spriteId3].y2 = -40;\n    gSprites[spriteId2].invisible = FALSE;\n    gSprites[spriteId3].invisible = FALSE;\n    gSprites[spriteId2].callback = SpriteCB_Start;\n    gSprites[spriteId3].callback = SpriteCB_Start;\n}\n\nstatic bool32 IsStartGraphicAnimRunning(u8 spriteId)\n{\n    return gSprites[spriteId].callback == SpriteCB_Start;\n}\n\nstatic void SpriteCB_Start(struct Sprite *sprite)\n{\n    s16 * data = sprite->data;\n    s32 y;\n\n    switch (sprite->data[0])\n    {\n    case 0:\n        data[4] = 64;\n        data[5] = sprite->y2 << 4;\n        data[0]++;\n        //fallthrough\n    case 1:\n        data[5] += data[4];\n        data[4]++;\n        sprite->y2 = data[5] >> 4;\n        if (sprite->y2 >= 0)\n        {\n            PlaySE(SE_BALL_BOUNCE_2);\n            sprite->y2 = 0;\n            data[0]++;\n        }\n        break;\n    case 2:\n        data[1] += 12;\n        if (data[1] >= 128)\n        {\n            PlaySE(SE_BALL_BOUNCE_2);\n            data[1] = 0;\n            data[0]++;\n        }\n        y = gSineTable[data[1]];\n        sprite->y2 = -(y >> 4);\n        break;\n    case 3:\n        data[1] += 16;\n        if (data[1] >= 128)\n        {\n            PlaySE(SE_BALL_BOUNCE_2);\n            data[1] = 0;\n            data[0]++;\n        }\n        sprite->y2 = -(gSineTable[data[1]] >> 5);\n        break;\n    case 4:\n        if (++data[1] > 40)\n            sprite->callback = SpriteCallbackDummy;\n        break;\n    }\n}\n\nstatic const u16 sSpritePal_321Start[] = INCBIN_U16(\"graphics/misc/minigame_countdown.gbapal\");\nstatic const u16 sSpriteSheet_321Start[] = INCBIN_U16(\"graphics/misc/minigame_countdown.4bpp.lz\");\n\nstatic void Load321StartGfx(u16 tilesTag, u16 palTag)\n{\n    struct CompressedSpriteSheet spriteSheet = {(const void *)sSpriteSheet_321Start, 0xE00};\n    struct SpritePalette spritePalette = {sSpritePal_321Start};\n    spriteSheet.tag = tilesTag;\n    spritePalette.tag = palTag;\n    LoadCompressedSpriteSheet(&spriteSheet);\n    LoadSpritePalette(&spritePalette);\n}\n\nstatic const struct OamData sOamData_Numbers = {\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .shape = SPRITE_SHAPE(32x32),\n    .size = SPRITE_SIZE(32x32)\n};\n\nstatic const struct OamData sOamData_Start = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .shape = SPRITE_SHAPE(64x32),\n    .size = SPRITE_SIZE(64x32)\n};\n\nstatic const union AnimCmd sAnim_Numbers_Three[] = {\n    ANIMCMD_FRAME( 0, 1),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Numbers_Two[] = {\n    ANIMCMD_FRAME(16, 1),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Numbers_One[] = {\n    ANIMCMD_FRAME(32, 1),\n\tANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnimTable_Numbers[] = {\n    sAnim_Numbers_Three,\n    sAnim_Numbers_Two,\n    sAnim_Numbers_One\n};\n\nstatic const union AnimCmd sAnim_StartLeft[] = {\n    ANIMCMD_FRAME(48, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_StartRight[] = {\n    ANIMCMD_FRAME(80, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnimTable_Start[] = {\n    sAnim_StartLeft,\n    sAnim_StartRight\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Numbers_0[] = {\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n\tAFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Numbers_1[] = {\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n\tAFFINEANIMCMD_FRAME( 0x10, -0x10, 0, 8),\n\tAFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Numbers_2[] = {\n    AFFINEANIMCMD_FRAME(-0x12,  0x12, 0, 8),\n\tAFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Numbers_3[] = {\n    AFFINEANIMCMD_FRAME(  0x6,  -0x6, 0, 8),\n\tAFFINEANIMCMD_FRAME( -0x4,   0x4, 0, 8),\n\tAFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n\tAFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sAffineAnimTable_Numbers[] = {\n    sAffineAnim_Numbers_0,\n    sAffineAnim_Numbers_1,\n    sAffineAnim_Numbers_2,\n    sAffineAnim_Numbers_3\n};\n\nstatic u8 CreateNumberSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)\n{\n    struct SpriteTemplate spriteTemplate = {\n        .oam = &sOamData_Numbers,\n        .anims = sAnimTable_Numbers,\n        .affineAnims = sAffineAnimTable_Numbers,\n        .callback = SpriteCallbackDummy\n    };\n    spriteTemplate.tileTag = tilesTag;\n    spriteTemplate.paletteTag = palTag;\n    return CreateSprite(&spriteTemplate, x, y, subpriority);\n}\n\nstatic void CreateStartSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p)\n{\n    struct SpriteTemplate spriteTemplate = {\n        .oam = &sOamData_Start,\n        .anims = sAnimTable_Start,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    };\n    spriteTemplate.tileTag = tilesTag;\n    spriteTemplate.paletteTag = palTag;\n    *spriteId2_p = CreateSprite(&spriteTemplate, x - 32, y, subpriority);\n    *spriteId3_p = CreateSprite(&spriteTemplate, x + 32, y, subpriority);\n    gSprites[*spriteId2_p].invisible = TRUE;\n    gSprites[*spriteId3_p].invisible = TRUE;\n    StartSpriteAnim(&gSprites[*spriteId3_p], 1);\n}\n"
  },
  {
    "path": "src/mon_markings.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"text_window_graphics.h\"\n#include \"mon_markings.h\"\n#include \"graphics.h\"\n#include \"constants/songs.h\"\n\n#define ANIM_CURSOR (NUM_MON_MARKINGS * 2)\n#define ANIM_TEXT   (ANIM_CURSOR + 1)\n\n#define SELECTION_OK NUM_MON_MARKINGS\n#define SELECTION_CANCEL (SELECTION_OK + 1)\n\nstatic void CreateMonMarkingsMenuSprites(s16, s16, u16, u16);\nstatic void SpriteCB_Dummy(struct Sprite *);\nstatic void SpriteCB_Marking(struct Sprite *);\nstatic void SpriteCB_Cursor(struct Sprite *);\nstatic struct Sprite *CreateMarkingComboSprite(u16, u16, const u16 *, u16);\n\nstatic const u16 sMonMarkings_Pal[] = INCBIN_U16(\"graphics/misc/mon_markings.gbapal\");\nstatic const u16 sMonMarkings_Gfx[] = INCBIN_U16(\"graphics/misc/mon_markings.4bpp\");\nstatic const u8 sUnused[] = {0x09, 0x50, 0x13, 0x02, 0xFF};\n\nstatic const struct OamData sOamData_MenuWindow =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\n// Used for the markings, OK/Cancel text, and cursor sprites\nstatic const struct OamData sOamData_8x8 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sAnim_Marking_CircleOff[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Marking_CircleOn[] =\n{\n    ANIMCMD_FRAME(1, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Marking_SquareOff[] =\n{\n    ANIMCMD_FRAME(2, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Marking_SquareOn[] =\n{\n    ANIMCMD_FRAME(3, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Marking_TriangleOff[] =\n{\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Marking_TriangleOn[] =\n{\n    ANIMCMD_FRAME(5, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Marking_HeartOff[] =\n{\n    ANIMCMD_FRAME(6, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Marking_HeartOn[] =\n{\n    ANIMCMD_FRAME(7, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_Cursor[] =\n{\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_OKCancelText[] =\n{\n    ANIMCMD_FRAME(9, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_MenuSprite[] =\n{\n    sAnim_Marking_CircleOff,\n    sAnim_Marking_CircleOn,\n    sAnim_Marking_SquareOff,\n    sAnim_Marking_SquareOn,\n    sAnim_Marking_TriangleOff,\n    sAnim_Marking_TriangleOn,\n    sAnim_Marking_HeartOff,\n    sAnim_Marking_HeartOn,\n    [ANIM_CURSOR] = sAnim_Cursor,\n    [ANIM_TEXT] = sAnim_OKCancelText,\n};\n\nstatic const union AnimCmd sAnim_MenuWindow_UpperHalf[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MenuWindow_LowerHalf[] =\n{\n    ANIMCMD_FRAME(64, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_MenuWindow[] =\n{\n    sAnim_MenuWindow_UpperHalf,\n    sAnim_MenuWindow_LowerHalf,\n};\n\nstatic const struct OamData sOamData_MarkingCombo =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x8),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_AllOff[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_Circle[] =\n{\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_Square[] =\n{\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_CircleSquare[] =\n{\n    ANIMCMD_FRAME(12, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_Triangle[] =\n{\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_CircleTriangle[] =\n{\n    ANIMCMD_FRAME(20, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_SquareTriangle[] =\n{\n    ANIMCMD_FRAME(24, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_CircleSquareTriangle[] =\n{\n    ANIMCMD_FRAME(28, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_Heart[] =\n{\n    ANIMCMD_FRAME(32, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_CircleHeart[] =\n{\n    ANIMCMD_FRAME(36, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_SquareHeart[] =\n{\n    ANIMCMD_FRAME(40, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_CircleSquareHeart[] =\n{\n    ANIMCMD_FRAME(44, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_TriangleHeart[] =\n{\n    ANIMCMD_FRAME(48, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_CircleTriangleHeart[] =\n{\n    ANIMCMD_FRAME(52, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_SquareTriangleHeart[] =\n{\n    ANIMCMD_FRAME(56, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sAnim_MarkingCombo_AllOn[] =\n{\n    ANIMCMD_FRAME(60, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sAnims_MarkingCombo[] =\n{\n    sAnim_MarkingCombo_AllOff,\n    sAnim_MarkingCombo_Circle,\n    sAnim_MarkingCombo_Square,\n    sAnim_MarkingCombo_CircleSquare,\n    sAnim_MarkingCombo_Triangle,\n    sAnim_MarkingCombo_CircleTriangle,\n    sAnim_MarkingCombo_SquareTriangle,\n    sAnim_MarkingCombo_CircleSquareTriangle,\n    sAnim_MarkingCombo_Heart,\n    sAnim_MarkingCombo_CircleHeart,\n    sAnim_MarkingCombo_SquareHeart,\n    sAnim_MarkingCombo_CircleSquareHeart,\n    sAnim_MarkingCombo_TriangleHeart,\n    sAnim_MarkingCombo_CircleTriangleHeart,\n    sAnim_MarkingCombo_SquareTriangleHeart,\n    sAnim_MarkingCombo_AllOn,\n};\n\nstatic EWRAM_DATA struct MonMarkingsMenu *sMenu = NULL;\n\nvoid InitMonMarkingsMenu(struct MonMarkingsMenu *ptr)\n{\n    sMenu = ptr;\n}\n\nstatic void BufferMenuWindowTiles(void)\n{\n    const struct TextWindowGraphics *frame = GetUserWindowGraphics(gSaveBlock2Ptr->optionsWindowFrameType);\n    sMenu->frameTiles = frame->tiles;\n    sMenu->framePalette = frame->palette;\n    sMenu->tileLoadState = 0;\n    CpuFill16(0, sMenu->windowSpriteTiles, sizeof(sMenu->windowSpriteTiles));\n}\n\nstatic bool8 BufferMenuFrameTiles(void)\n{\n    u32 i;\n    u8 *dest = sMenu->windowSpriteTiles + sMenu->tileLoadState * 0x100;\n\n    switch (sMenu->tileLoadState)\n    {\n    case 0:\n        CpuFastCopy(sMenu->frameTiles, dest, TILE_SIZE_4BPP);\n        for (i = 0; i < 6; i++)\n            CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);\n\n        CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 2, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);\n        sMenu->tileLoadState++;\n        break;\n    default:\n        CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 3, dest, TILE_SIZE_4BPP);\n        for (i = 0; i < 6; i++)\n            CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 4, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);\n\n        CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 5, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);\n        sMenu->tileLoadState++;\n        break;\n    case 13:\n        CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 6, dest, TILE_SIZE_4BPP);\n        for (i = 0; i < 6; i++)\n            CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 7, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);\n\n        CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 8, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);\n        sMenu->tileLoadState++;\n        return FALSE;\n    case 14:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nvoid BufferMonMarkingsMenuTiles(void)\n{\n    BufferMenuWindowTiles();\n    while (BufferMenuFrameTiles());\n}\n\nvoid OpenMonMarkingsMenu(u8 markings, s16 x, s16 y)\n{\n    u32 i;\n    sMenu->cursorPos = 0;\n    sMenu->markings = markings;\n    for (i = 0; i < NUM_MON_MARKINGS; i++)\n        sMenu->markingsArray[i] = (sMenu->markings >> i) & 1;\n    CreateMonMarkingsMenuSprites(x, y, sMenu->baseTileTag, sMenu->basePaletteTag);\n}\n\nvoid FreeMonMarkingsMenu(void)\n{\n    u32 i;\n    for (i = 0; i < 3; i++)\n        FreeSpriteTilesByTag(sMenu->baseTileTag + i);\n\n    FreeSpritePaletteByTag(sMenu->basePaletteTag);\n    FreeSpritePaletteByTag(sMenu->basePaletteTag + 1);\n    for (i = 0; i < ARRAY_COUNT(sMenu->windowSprites); i++)\n    {\n        if (sMenu->windowSprites[i] == NULL)\n            return; // break;\n        DestroySprite(sMenu->windowSprites[i]);\n    }\n    for (i = 0; i < NUM_MON_MARKINGS; i++)\n    {\n        if (sMenu->markingSprites[i] == NULL)\n            return; // break;\n        DestroySprite(sMenu->markingSprites[i]);\n    }\n    if (sMenu->cursorSprite != NULL)\n        DestroySprite(sMenu->cursorSprite);\n    if (sMenu->textSprite != NULL)\n        DestroySprite(sMenu->textSprite);\n}\n\nbool8 HandleMonMarkingsMenuInput(void)\n{\n    u32 i;\n    if (JOY_NEW(DPAD_UP))\n    {\n        PlaySE(SE_SELECT);\n        if (--sMenu->cursorPos < 0)\n            sMenu->cursorPos = SELECTION_CANCEL;\n        return TRUE;\n    }\n\n    if (JOY_NEW(DPAD_DOWN))\n    {\n        PlaySE(SE_SELECT);\n        if (++sMenu->cursorPos > SELECTION_CANCEL)\n            sMenu->cursorPos = 0;\n        return TRUE;\n    }\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n\n        switch (sMenu->cursorPos)\n        {\n        case SELECTION_OK:\n            sMenu->markings = 0;\n            for (i = 0; i < NUM_MON_MARKINGS; i++)\n                sMenu->markings |= sMenu->markingsArray[i] << i;\n            return FALSE;\n        case SELECTION_CANCEL:\n            return FALSE;\n        }\n\n        sMenu->markingsArray[sMenu->cursorPos] = !sMenu->markingsArray[sMenu->cursorPos];\n        return TRUE;\n    }\n\n    if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\n#define sMarkingId data[0]\n#define sCursorYOffset data[0]\n\nstatic void CreateMonMarkingsMenuSprites(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag)\n{\n    u32 i;\n    u8 spriteId;\n\n    struct SpriteSheet sheets[] =\n    {\n        { sMenu->windowSpriteTiles, 0x1000, baseTileTag },\n        { gMonMarkingsMenu_Gfx, 0x320, baseTileTag + 1 },\n        {}\n    };\n\n    struct SpritePalette palettes[] =\n    {\n        { sMenu->framePalette, basePaletteTag },\n        { gMonMarkingsMenu_Pal, basePaletteTag + 1},\n        {}\n    };\n\n    struct SpriteTemplate template =\n    {\n        .tileTag = baseTileTag,\n        .paletteTag = basePaletteTag,\n        .oam = &sOamData_MenuWindow,\n        .anims = sAnims_MenuWindow,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_Dummy,\n    };\n\n    LoadSpriteSheets(sheets);\n    LoadSpritePalettes(palettes);\n\n    // Create window sprites\n    for (i = 0; i < ARRAY_COUNT(sMenu->windowSprites); i++)\n    {\n        spriteId = CreateSprite(&template, x + 32, y + 32, 1);\n        if (spriteId != MAX_SPRITES)\n        {\n            sMenu->windowSprites[i] = &gSprites[spriteId];\n            StartSpriteAnim(&gSprites[spriteId], i);\n        }\n        else\n        {\n            sMenu->windowSprites[i] = NULL;\n            return;\n        }\n    }\n    sMenu->windowSprites[1]->y = y + 96;\n\n    // Create marking sprites\n    template.tileTag++;\n    template.paletteTag++;\n    template.anims = sAnims_MenuSprite;\n    template.callback = SpriteCB_Marking;\n    template.oam = &sOamData_8x8;\n    for (i = 0; i < NUM_MON_MARKINGS; i++)\n    {\n        spriteId = CreateSprite(&template, x + 32, y + 16 + 16 * i, 0);\n        if (spriteId != MAX_SPRITES)\n        {\n            sMenu->markingSprites[i] = &gSprites[spriteId];\n            gSprites[spriteId].sMarkingId = i;\n        }\n        else\n        {\n            sMenu->markingSprites[i] = NULL;\n            return;\n        }\n    }\n\n    // Create OK/Cancel text sprite\n    template.callback = SpriteCallbackDummy;\n    spriteId = CreateSprite(&template, 0, 0, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sMenu->textSprite = &gSprites[spriteId];\n        sMenu->textSprite->oam.shape = SPRITE_SHAPE(32x32);\n        sMenu->textSprite->oam.size = SPRITE_SIZE(32x32);\n        StartSpriteAnim(sMenu->textSprite, ANIM_TEXT);\n        sMenu->textSprite->x = x + 32;\n        sMenu->textSprite->y = y + 80;\n        CalcCenterToCornerVec(sMenu->textSprite, SPRITE_SHAPE(32x16), SPRITE_SIZE(32x16), ST_OAM_AFFINE_OFF);\n    }\n    else\n    {\n        sMenu->textSprite = NULL;\n    }\n\n    // Create cursor sprite\n    template.callback = SpriteCB_Cursor;\n    spriteId = CreateSprite(&template, x + 12, 0, 0);\n    if (spriteId != MAX_SPRITES)\n    {\n        sMenu->cursorSprite = &gSprites[spriteId];\n        sMenu->cursorSprite->sCursorYOffset = y + 16;\n        StartSpriteAnim(sMenu->cursorSprite, ANIM_CURSOR);\n    }\n    else\n    {\n        sMenu->cursorSprite = NULL;\n    }\n}\n\nstatic void SpriteCB_Dummy(struct Sprite *sprite)\n{\n}\n\nstatic void SpriteCB_Marking(struct Sprite *sprite)\n{\n    if (sMenu->markingsArray[sprite->sMarkingId])\n        StartSpriteAnim(sprite, 2 * sprite->sMarkingId + 1); // Set marking 'on'\n    else\n        StartSpriteAnim(sprite, 2 * sprite->sMarkingId); // Set marking 'off'\n}\n\n#undef sMarkingId\n\nstatic void SpriteCB_Cursor(struct Sprite *sprite)\n{\n    sprite->y = (16 * sMenu->cursorPos) + sprite->sCursorYOffset;\n}\n\n#undef sCursorYOffset\n\n// Creates a mon marking combination sprite with a spritesheet that holds every possible combination, used by the summary screen / Pokénav\nstruct Sprite *CreateMonMarkingAllCombosSprite(u16 tileTag, u16 paletteTag, const u16 *palette)\n{\n    if (palette == NULL)\n        palette = sMonMarkings_Pal;\n    return CreateMarkingComboSprite(tileTag, paletteTag, palette, 1 << NUM_MON_MARKINGS);\n}\n\n// Creates a mon marking combination sprite with a spritesheet that holds only one combination, used for the currently selected PC mon\nstruct Sprite *CreateMonMarkingComboSprite(u16 tileTag, u16 paletteTag, const u16 *palette)\n{\n    if (palette == NULL)\n        palette = sMonMarkings_Pal;\n    return CreateMarkingComboSprite(tileTag, paletteTag, palette, 1);\n}\n\nstatic struct Sprite *CreateMarkingComboSprite(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size)\n{\n    u8 spriteId;\n    struct SpriteTemplate template;\n    struct SpriteSheet sheet = { sMonMarkings_Gfx, 0x80, tileTag };\n    struct SpritePalette sprPalette = { palette, paletteTag };\n\n    template.tileTag = tileTag;\n    template.paletteTag = paletteTag;\n    template.oam = &sOamData_MarkingCombo;\n    template.anims = sAnims_MarkingCombo;\n    template.images = NULL;\n    template.affineAnims = gDummySpriteAffineAnimTable;\n    template.callback = SpriteCB_Dummy;\n\n    sheet.size = size * 0x80;\n\n    LoadSpriteSheet(&sheet);\n    LoadSpritePalette(&sprPalette);\n\n    spriteId = CreateSprite(&template, 0, 0, 0);\n    if (spriteId != MAX_SPRITES)\n        return &gSprites[spriteId];\n    else\n        return NULL;\n}\n\n// Update what combination is shown, used for sprites created with CreateMonMarkingComboSprite\nvoid UpdateMonMarkingTiles(u8 markings, void *dest)\n{\n    RequestDma3Copy(&sMonMarkings_Gfx[64 * markings], dest, 0x80, DMA3_32BIT);\n}\n\n"
  },
  {
    "path": "src/money.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"event_data.h\"\n#include \"menu.h\"\n#include \"text_window.h\"\n#include \"strings.h\"\n\n#define MAX_MONEY 999999\n\nEWRAM_DATA static u8 sMoneyBoxWindowId = 0;\n\nu32 GetMoney(u32 *moneyPtr)\n{\n    return *moneyPtr ^ gSaveBlock2Ptr->encryptionKey;\n}\n\nvoid SetMoney(u32 *moneyPtr, u32 newValue)\n{\n    *moneyPtr = gSaveBlock2Ptr->encryptionKey ^ newValue;\n}\n\nbool8 IsEnoughMoney(u32 *moneyPtr, u32 cost)\n{\n    if (GetMoney(moneyPtr) >= cost)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid AddMoney(u32 *moneyPtr, u32 toAdd)\n{\n    u32 toSet = GetMoney(moneyPtr);\n\n    // can't have more money than MAX\n    if (toSet + toAdd > MAX_MONEY)\n    {\n        toSet = MAX_MONEY;\n    }\n    else\n    {\n        toSet += toAdd;\n        // check overflow, can't have less money after you receive more\n        if (toSet < GetMoney(moneyPtr))\n            toSet = MAX_MONEY;\n    }\n\n    SetMoney(moneyPtr, toSet);\n}\n\nvoid RemoveMoney(u32 *moneyPtr, u32 toSub)\n{\n    u32 toSet = GetMoney(moneyPtr);\n\n    // can't subtract more than you already have\n    if (toSet < toSub)\n        toSet = 0;\n    else\n        toSet -= toSub;\n\n    SetMoney(moneyPtr, toSet);\n}\n\nbool8 IsEnoughForCostInVar0x8005(void)\n{\n    return IsEnoughMoney(&gSaveBlock1Ptr->money, gSpecialVar_0x8005);\n}\n\nvoid SubtractMoneyFromVar0x8005(void)\n{\n    RemoveMoney(&gSaveBlock1Ptr->money, gSpecialVar_0x8005);\n}\n\nvoid PrintMoneyAmountInMoneyBox(u8 windowId, int amount, u8 speed)\n{\n    u8 *txtPtr;\n    s32 strLength;\n\n    ConvertIntToDecimalStringN(gStringVar1, amount, STR_CONV_MODE_LEFT_ALIGN, 6);\n\n    strLength = 6 - StringLength(gStringVar1);\n    txtPtr = gStringVar4;\n\n    while (strLength-- != 0)\n        *(txtPtr++) = 0;\n\n    StringExpandPlaceholders(txtPtr, gText_PokedollarVar1);\n    AddTextPrinterParameterized(windowId, FONT_SMALL, gStringVar4, 64 - GetStringWidth(FONT_SMALL, gStringVar4, 0), 0xC, speed, NULL);\n}\n\nvoid PrintMoneyAmount(u8 windowId, u8 x, u8 y, int amount, u8 speed)\n{\n    u8 *txtPtr;\n    s32 strLength;\n\n    ConvertIntToDecimalStringN(gStringVar1, amount, STR_CONV_MODE_LEFT_ALIGN, 6);\n\n    strLength = 6 - StringLength(gStringVar1);\n    txtPtr = gStringVar4;\n\n    while (strLength-- != 0)\n        *(txtPtr++) = 0;\n\n    StringExpandPlaceholders(txtPtr, gText_PokedollarVar1);\n    AddTextPrinterParameterized(windowId, FONT_SMALL, gStringVar4, x, y, speed, NULL);\n}\n\nvoid PrintMoneyAmountInMoneyBoxWithBorder(u8 windowId, u16 tileStart, u8 paletteNum, int amount)\n{\n    DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, tileStart, paletteNum);\n    AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_TrainerCardMoney, 0, 0, 0xFF, 0);\n    PrintMoneyAmountInMoneyBox(windowId, amount, 0);\n}\n\nvoid ChangeAmountInMoneyBox(int amount)\n{\n    PrintMoneyAmountInMoneyBox(sMoneyBoxWindowId, amount, 0);\n}\n\nvoid DrawMoneyBox(int amount, u8 x, u8 y)\n{\n    struct WindowTemplate template;\n\n    template = SetWindowTemplateFields(0, x + 1, y + 1, 8, 3, 15, 8);\n    sMoneyBoxWindowId = AddWindow(&template);\n    FillWindowPixelBuffer(sMoneyBoxWindowId, 0);\n    PutWindowTilemap(sMoneyBoxWindowId);\n    LoadStdWindowGfx(sMoneyBoxWindowId, 0x21D, BG_PLTT_ID(13));\n    PrintMoneyAmountInMoneyBoxWithBorder(sMoneyBoxWindowId, 0x21D, 13, amount);\n}\n\nvoid HideMoneyBox(void)\n{\n    ClearStdWindowAndFrameToTransparent(sMoneyBoxWindowId, FALSE);\n    CopyWindowToVram(sMoneyBoxWindowId, COPYWIN_GFX);\n    RemoveWindow(sMoneyBoxWindowId);\n}\n"
  },
  {
    "path": "src/move_descriptions.c",
    "content": "#include \"global.h\"\n#include \"constants/moves.h\"\n\nconst u8 gMoveDescription_Pound[] = _(\"A physical attack\\ndelivered with a\\nlong tail or a\\nforeleg, etc.\");\nconst u8 gMoveDescription_KarateChop[] = _(\"The foe is attacked\\nwith a sharp chop.\\nIt has a high\\ncritical-hit ratio.\");\nconst u8 gMoveDescription_DoubleSlap[] = _(\"The foe is slapped\\nrepeatedly, back\\nand forth, two to\\nfive times.\");\nconst u8 gMoveDescription_CometPunch[] = _(\"The foe is hit with\\na flurry of punches\\nthat strike two to\\nfive times.\");\nconst u8 gMoveDescription_MegaPunch[] = _(\"The foe is slugged\\nby a punch thrown\\nwith muscle-packed\\npower.\");\nconst u8 gMoveDescription_PayDay[] = _(\"Numerous coins are\\nhurled at the foe.\\nMoney is earned\\nafter battle.\");\nconst u8 gMoveDescription_FirePunch[] = _(\"The foe is punched\\nwith a fiery fist.\\nIt may leave the\\nfoe with a burn.\");\nconst u8 gMoveDescription_IcePunch[] = _(\"The foe is punched\\nwith an icy fist.\\nIt may leave the\\nfoe frozen.\");\nconst u8 gMoveDescription_ThunderPunch[] = _(\"The foe is punched\\nwith an electrified\\nfist. It may leave\\nthe foe paralyzed.\");\nconst u8 gMoveDescription_Scratch[] = _(\"Hard, pointed, and\\nsharp claws rake\\nthe foe.\");\nconst u8 gMoveDescription_ViceGrip[] = _(\"Huge, impressive\\npincers grip and\\nsqueeze the foe.\");\nconst u8 gMoveDescription_Guillotine[] = _(\"A vicious tearing\\nattack with pincers.\\nThe foe will faint\\nif it hits.\");\nconst u8 gMoveDescription_RazorWind[] = _(\"Blades of wind hit\\nthe foe on the 2nd\\nturn. It has a high\\ncritical-hit ratio.\");\nconst u8 gMoveDescription_SwordsDance[] = _(\"A frenetic dance of\\nfighting. It sharply\\nraises the ATTACK\\nstat.\");\nconst u8 gMoveDescription_Cut[] = _(\"A basic attack.\\nIt can be used to\\ncut down thin trees\\nand grass.\");\nconst u8 gMoveDescription_Gust[] = _(\"Strikes the foe\\nwith a gust of wind\\nwhipped up by\\nwings.\");\nconst u8 gMoveDescription_WingAttack[] = _(\"The foe is struck\\nwith large, imposing\\nwings spread wide.\");\nconst u8 gMoveDescription_Whirlwind[] = _(\"The foe is made to\\nswitch out with an\\nally. In the wild,\\nthe battle ends.\");\nconst u8 gMoveDescription_Fly[] = _(\"A 2-turn move that\\nhits on the 2nd\\nturn. Use it to fly\\nto any known town.\");\nconst u8 gMoveDescription_Bind[] = _(\"A long body or\\ntentacles are used\\nto bind the foe for\\ntwo to five turns.\");\nconst u8 gMoveDescription_Slam[] = _(\"The foe is struck\\nwith a long tail,\\nvines, etc.\");\nconst u8 gMoveDescription_VineWhip[] = _(\"The foe is struck\\nwith slender, whip-\\nlike vines.\");\nconst u8 gMoveDescription_Stomp[] = _(\"The foe is stomped\\nwith a big foot.\\nIt may make the\\nfoe flinch.\");\nconst u8 gMoveDescription_DoubleKick[] = _(\"Two legs are used\\nto quickly kick the\\nfoe twice in one\\nturn.\");\nconst u8 gMoveDescription_MegaKick[] = _(\"The foe is attacked\\nby a kick fired\\nwith muscle-packed\\npower.\");\nconst u8 gMoveDescription_JumpKick[] = _(\"The user jumps up\\nhigh, then kicks.\\nIf it misses, the\\nuser hurts itself.\");\nconst u8 gMoveDescription_RollingKick[] = _(\"A quick kick from a\\nrolling spin.\\nIt may make the\\nfoe flinch.\");\nconst u8 gMoveDescription_SandAttack[] = _(\"A lot of sand is\\nhurled in the foe's\\nface, reducing its\\naccuracy.\");\nconst u8 gMoveDescription_Headbutt[] = _(\"The user sticks its\\nhead out and rams.\\nIt may make the\\nfoe flinch.\");\nconst u8 gMoveDescription_HornAttack[] = _(\"The foe is jabbed\\nwith a sharply\\npointed horn to\\ninflict damage.\");\nconst u8 gMoveDescription_FuryAttack[] = _(\"The foe is jabbed\\nrepeatedly with a\\nhorn or beak two to\\nfive times.\");\nconst u8 gMoveDescription_HornDrill[] = _(\"The horn is rotated\\nlike a drill to ram.\\nThe foe will faint\\nif it hits.\");\nconst u8 gMoveDescription_Tackle[] = _(\"A physical attack\\nin which the user\\ncharges, full body,\\ninto the foe.\");\nconst u8 gMoveDescription_BodySlam[] = _(\"The user drops its\\nfull body on the\\nfoe. It may leave\\nthe foe paralyzed.\");\nconst u8 gMoveDescription_Wrap[] = _(\"A long body or\\nvines are used to\\nwrap the foe for\\ntwo to five turns.\");\nconst u8 gMoveDescription_TakeDown[] = _(\"A reckless, full-\\nbody charge attack\\nthat also hurts the\\nuser a little.\");\nconst u8 gMoveDescription_Thrash[] = _(\"The user rampages\\nabout for two to\\nthree turns, then\\nbecomes confused.\");\nconst u8 gMoveDescription_DoubleEdge[] = _(\"A reckless, life-\\nrisking tackle that\\nalso hurts the user\\na little.\");\nconst u8 gMoveDescription_TailWhip[] = _(\"The user wags its\\ntail cutely, making\\nthe foe lower its\\nDEFENSE stat.\");\nconst u8 gMoveDescription_PoisonSting[] = _(\"The foe is stabbed\\nwith a toxic barb,\\netc. It may poison\\nthe foe.\");\nconst u8 gMoveDescription_Twineedle[] = _(\"The foe is stabbed\\ntwice with foreleg\\nstingers. It may\\npoison the foe.\");\nconst u8 gMoveDescription_PinMissile[] = _(\"Sharp pins are shot\\nat the foe and hit\\ntwo to five times\\nat once.\");\nconst u8 gMoveDescription_Leer[] = _(\"The foe is given an\\nintimidating look\\nthat lowers its\\nDEFENSE stat.\");\nconst u8 gMoveDescription_Bite[] = _(\"The user bites with\\nvicious fangs.\\nIt may make the\\nfoe flinch.\");\nconst u8 gMoveDescription_Growl[] = _(\"The user growls in\\na cute way, making\\nthe foe lower its\\nATTACK stat.\");\nconst u8 gMoveDescription_Roar[] = _(\"The foe is made to\\nswitch out with an\\nally. In the wild,\\nthe battle ends.\");\nconst u8 gMoveDescription_Sing[] = _(\"A soothing song\\nin a calming voice\\nlulls the foe into\\na deep slumber.\");\nconst u8 gMoveDescription_Supersonic[] = _(\"The user generates\\nodd sound waves.\\nIt may confuse the\\nfoe.\");\nconst u8 gMoveDescription_SonicBoom[] = _(\"The foe is hit with\\na shock wave that\\nalways inflicts 20-\\nHP damage.\");\nconst u8 gMoveDescription_Disable[] = _(\"For a few turns,\\nit prevents the foe\\nfrom using the move\\nit last used.\");\nconst u8 gMoveDescription_Acid[] = _(\"The foe is sprayed\\nwith a harsh, hide-\\nmelting acid that\\nmay lower DEFENSE.\");\nconst u8 gMoveDescription_Ember[] = _(\"The foe is attacked\\nwith small flames.\\nThe foe may suffer\\na burn.\");\nconst u8 gMoveDescription_Flamethrower[] = _(\"The foe is scorched\\nwith intense flames.\\nThe foe may suffer\\na burn.\");\nconst u8 gMoveDescription_Mist[] = _(\"The ally party is\\nprotected by a\\nmist that prevents\\nstat reductions.\");\nconst u8 gMoveDescription_WaterGun[] = _(\"The foe is struck\\nwith a lot of water\\nexpelled forcibly\\nfrom the mouth.\");\nconst u8 gMoveDescription_HydroPump[] = _(\"A high volume of\\nwater is blasted at\\nthe foe under great\\npressure.\");\nconst u8 gMoveDescription_Surf[] = _(\"A big wave crashes\\ndown on the foe.\\nCan also be used\\nfor crossing water.\");\nconst u8 gMoveDescription_IceBeam[] = _(\"The foe is struck\\nwith an icy beam.\\nIt may freeze the\\nfoe solid.\");\nconst u8 gMoveDescription_Blizzard[] = _(\"The foe is blasted\\nwith a blizzard.\\nIt may freeze the\\nfoe solid.\");\nconst u8 gMoveDescription_Psybeam[] = _(\"A peculiar ray is\\nshot at the foe.\\nIt may leave the\\nfoe confused.\");\nconst u8 gMoveDescription_BubbleBeam[] = _(\"A spray of bubbles\\nstrikes the foe.\\nIt may lower the\\nfoe's SPEED stat.\");\nconst u8 gMoveDescription_AuroraBeam[] = _(\"A rainbow-colored\\nattack beam.\\nIt may lower the\\nfoe's ATTACK stat.\");\nconst u8 gMoveDescription_HyperBeam[] = _(\"A severely damaging\\nattack that makes\\nthe user rest on\\nthe next turn.\");\nconst u8 gMoveDescription_Peck[] = _(\"The foe is jabbed\\nwith a sharply\\npointed beak or\\nhorn.\");\nconst u8 gMoveDescription_DrillPeck[] = _(\"A corkscrewing\\nattack with the\\nsharp beak acting\\nas a drill.\");\nconst u8 gMoveDescription_Submission[] = _(\"A reckless, full-\\nbody throw attack\\nthat also hurts the\\nuser a little.\");\nconst u8 gMoveDescription_LowKick[] = _(\"A low, tripping kick\\nthat inflicts more\\ndamage on heavier\\nfoes.\");\nconst u8 gMoveDescription_Counter[] = _(\"A retaliation move\\nthat counters any\\nphysical hit with\\ndouble the damage.\");\nconst u8 gMoveDescription_SeismicToss[] = _(\"A gravity-fed throw\\nthat causes damage\\nmatching the user's\\nlevel.\");\nconst u8 gMoveDescription_Strength[] = _(\"The foe is slugged\\nat maximum power.\\nCan also be used\\nto move boulders.\");\nconst u8 gMoveDescription_Absorb[] = _(\"An attack that\\nabsorbs half the\\ndamage it inflicted\\nto restore HP.\");\nconst u8 gMoveDescription_MegaDrain[] = _(\"A tough attack that\\ndrains half the\\ndamage it inflicted\\nto restore HP.\");\nconst u8 gMoveDescription_LeechSeed[] = _(\"A seed is planted\\non the foe to steal\\nsome HP for the \\nuser on every turn.\");\nconst u8 gMoveDescription_Growth[] = _(\"The user's body is\\nforced to grow,\\nraising the SP.\\nATK stat.\");\nconst u8 gMoveDescription_RazorLeaf[] = _(\"The foe is hit with\\na cutting leaf.\\nIt has a high\\ncritical-hit ratio.\");\nconst u8 gMoveDescription_SolarBeam[] = _(\"A 2-turn move that\\nblasts the foe with\\nabsorbed energy in\\nthe 2nd turn.\");\nconst u8 gMoveDescription_PoisonPowder[] = _(\"A cloud of toxic\\ndust is scattered.\\nIt may poison the\\nfoe.\");\nconst u8 gMoveDescription_StunSpore[] = _(\"Paralyzing dust is\\nscattered wildly.\\nIt may paralyze\\nthe foe.\");\nconst u8 gMoveDescription_SleepPowder[] = _(\"A sleep-inducing\\ndust is scattered\\nin high volume\\naround a foe.\");\nconst u8 gMoveDescription_PetalDance[] = _(\"The user attacks\\nwith petals for two\\nto three turns,\\nthen gets confused.\");\nconst u8 gMoveDescription_StringShot[] = _(\"The foe is bound\\nwith strings shot\\nfrom the mouth to\\nreduce its SPEED.\");\nconst u8 gMoveDescription_DragonRage[] = _(\"The foe is hit with\\na shock wave that\\nalways inflicts 40-\\nHP damage.\");\nconst u8 gMoveDescription_FireSpin[] = _(\"The foe is trapped\\nin an intense spiral\\nof fire that rages\\ntwo to five turns.\");\nconst u8 gMoveDescription_ThunderShock[] = _(\"An electric shock\\nattack that may\\nalso leave the foe\\nparalyzed.\");\nconst u8 gMoveDescription_Thunderbolt[] = _(\"A strong electrical\\nattack that may\\nalso leave the foe\\nparalyzed.\");\nconst u8 gMoveDescription_ThunderWave[] = _(\"A weak electric\\nshock that is sure\\nto cause paralysis\\nif it hits.\");\nconst u8 gMoveDescription_Thunder[] = _(\"A brutal lightning\\nattack that may\\nalso leave the foe\\nparalyzed.\");\nconst u8 gMoveDescription_RockThrow[] = _(\"The foe is attacked\\nwith a shower of\\nsmall, easily\\nthrown rocks.\");\nconst u8 gMoveDescription_Earthquake[] = _(\"An earthquake that\\nstrikes all POKéMON\\nin battle excluding\\nthe user.\");\nconst u8 gMoveDescription_Fissure[] = _(\"The foe is dropped\\ninto a fissure.\\nThe foe faints if it\\nhits.\");\nconst u8 gMoveDescription_Dig[] = _(\"An attack that hits\\non the 2nd turn.\\nCan also be used\\nto exit dungeons.\");\nconst u8 gMoveDescription_Toxic[] = _(\"A move that badly\\npoisons the foe.\\nIts poison damage\\nworsens every turn.\");\nconst u8 gMoveDescription_Confusion[] = _(\"A weak telekinetic\\nattack that may\\nalso leave the foe\\nconfused.\");\nconst u8 gMoveDescription_Psychic[] = _(\"A strong telekinetic\\nattack. It may also\\nlower the foe's\\nSP. DEF stat.\");\nconst u8 gMoveDescription_Hypnosis[] = _(\"Hypnotic suggestion\\nis used to make the\\nfoe fall into a\\ndeep sleep.\");\nconst u8 gMoveDescription_Meditate[] = _(\"The user meditates\\nto awaken its power\\nand raise its\\nATTACK stat.\");\nconst u8 gMoveDescription_Agility[] = _(\"The user relaxes\\nand lightens its\\nbody to sharply\\nboost its SPEED.\");\nconst u8 gMoveDescription_QuickAttack[] = _(\"An almost invisibly\\nfast attack that\\nis certain to strike\\nfirst.\");\nconst u8 gMoveDescription_Rage[] = _(\"An attack that\\nbecomes stronger\\neach time the user\\nis hit in battle.\");\nconst u8 gMoveDescription_Teleport[] = _(\"Use it to flee from\\nany wild POKéMON.\\nAlso warps to the\\nlast POKé CENTER.\");\nconst u8 gMoveDescription_NightShade[] = _(\"An attack with a\\nmirage that inflicts\\ndamage matching\\nthe user's level.\");\nconst u8 gMoveDescription_Mimic[] = _(\"The user copies the\\nmove last used by\\nthe foe for the\\nrest of the battle.\");\nconst u8 gMoveDescription_Screech[] = _(\"An ear-splitting\\nscreech is emitted\\nto sharply reduce\\nthe foe's DEFENSE.\");\nconst u8 gMoveDescription_DoubleTeam[] = _(\"The user creates\\nillusory copies of\\nitself to raise its\\nevasiveness.\");\nconst u8 gMoveDescription_Recover[] = _(\"A self-healing move\\nthat restores HP by\\nup to half of the\\nuser's maximum HP.\");\nconst u8 gMoveDescription_Harden[] = _(\"The user stiffens\\nall the muscles in\\nits body to raise\\nits DEFENSE stat.\");\nconst u8 gMoveDescription_Minimize[] = _(\"The user compresses\\nall the cells in its\\nbody to raise its\\nevasiveness.\");\nconst u8 gMoveDescription_Smokescreen[] = _(\"An obscuring cloud\\nof smoke or ink\\nreduces the foe's\\naccuracy.\");\nconst u8 gMoveDescription_ConfuseRay[] = _(\"The foe is exposed\\nto a sinister ray\\nthat triggers\\nconfusion.\");\nconst u8 gMoveDescription_Withdraw[] = _(\"The user withdraws\\nits body in its hard\\nshell, raising its\\nDEFENSE stat.\");\nconst u8 gMoveDescription_DefenseCurl[] = _(\"The user curls up\\nto conceal weak\\nspots and raise its\\nDEFENSE stat.\");\nconst u8 gMoveDescription_Barrier[] = _(\"The user creates a\\nsturdy wall that\\nsharply raises its\\nDEFENSE stat.\");\nconst u8 gMoveDescription_LightScreen[] = _(\"A wall of light\\ncuts damage from\\nSP. ATK attacks\\nfor five turns.\");\nconst u8 gMoveDescription_Haze[] = _(\"Eliminates all stat\\nchanges among all\\nPOKéMON engaged in\\nbattle.\");\nconst u8 gMoveDescription_Reflect[] = _(\"A wall of light\\ncuts damage from\\nphysical attacks\\nfor five turns.\");\nconst u8 gMoveDescription_FocusEnergy[] = _(\"The user takes a\\ndeep breath and\\nfocuses to raise its\\ncritical-hit ratio.\");\nconst u8 gMoveDescription_Bide[] = _(\"The user endures\\nattacks for two\\nturns, then strikes\\nback double.\");\nconst u8 gMoveDescription_Metronome[] = _(\"Waggles a finger\\nand stimulates the\\nbrain into using any\\nmove at random.\");\nconst u8 gMoveDescription_MirrorMove[] = _(\"The user counters\\nthe move last used\\nby the foe with the\\nsame move.\");\nconst u8 gMoveDescription_SelfDestruct[] = _(\"The user blows up\\nto inflict severe\\ndamage, even\\nmaking itself faint.\");\nconst u8 gMoveDescription_EggBomb[] = _(\"A large egg is\\nhurled with great\\nforce at the foe to\\ninflict damage.\");\nconst u8 gMoveDescription_Lick[] = _(\"The foe is licked\\nand hit with a long\\ntongue. It may\\nalso paralyze.\");\nconst u8 gMoveDescription_Smog[] = _(\"The foe is attacked\\nwith exhaust gases.\\nIt may also poison\\nthe foe.\");\nconst u8 gMoveDescription_Sludge[] = _(\"Toxic sludge is\\nhurled at the foe.\\nIt may poison the\\ntarget.\");\nconst u8 gMoveDescription_BoneClub[] = _(\"The foe is clubbed\\nwith a bone held in\\nhand. It may make\\nthe foe flinch.\");\nconst u8 gMoveDescription_FireBlast[] = _(\"The foe is hit with\\nan intense flame.\\nIt may leave the\\ntarget with a burn.\");\nconst u8 gMoveDescription_Waterfall[] = _(\"A powerful charge\\nattack. It can also\\nbe used to climb\\na waterfall.\");\nconst u8 gMoveDescription_Clamp[] = _(\"The foe is clamped\\nand squeezed by\\nthe user's shell for\\ntwo to five turns.\");\nconst u8 gMoveDescription_Swift[] = _(\"Star-shaped rays\\nthat never miss are\\nfired at all foes in\\nbattle.\");\nconst u8 gMoveDescription_SkullBash[] = _(\"The user raises its\\nDEFENSE in the 1st\\nturn, then attacks\\nin the 2nd turn.\");\nconst u8 gMoveDescription_SpikeCannon[] = _(\"Sharp spikes are\\nfired at the foe to\\nstrike two to five\\ntimes.\");\nconst u8 gMoveDescription_Constrict[] = _(\"The foe is attacked\\nwith long tentacles\\nor vines. It may\\nlower SPEED.\");\nconst u8 gMoveDescription_Amnesia[] = _(\"Forgets about\\nsomething and\\nsharply raises\\nSP. DEF.\");\nconst u8 gMoveDescription_Kinesis[] = _(\"The user distracts\\nthe foe by bending\\na spoon. It may\\nlower accuracy.\");\nconst u8 gMoveDescription_SoftBoiled[] = _(\"Heals the user by\\nup to half its full\\nHP. It can be used\\nto heal an ally.\");\nconst u8 gMoveDescription_HiJumpKick[] = _(\"A strong jumping\\nknee kick. If it\\nmisses, the user is\\nhurt.\");\nconst u8 gMoveDescription_Glare[] = _(\"The user intimidates\\nthe foe with the\\ndesign on its belly\\nto cause paralysis.\");\nconst u8 gMoveDescription_DreamEater[] = _(\"Absorbs half the\\ndamage it inflicted\\non a sleeping foe\\nto restore HP.\");\nconst u8 gMoveDescription_PoisonGas[] = _(\"The foe is sprayed\\nwith a cloud of\\ntoxic gas that may\\npoison the foe.\");\nconst u8 gMoveDescription_Barrage[] = _(\"Round objects are\\nhurled at the foe\\nto strike two to\\nfive times.\");\nconst u8 gMoveDescription_LeechLife[] = _(\"An attack that\\nabsorbs half the\\ndamage it inflicted\\nto restore HP.\");\nconst u8 gMoveDescription_LovelyKiss[] = _(\"The user forces a\\nkiss on the foe\\nwith a scary face\\nthat induces sleep.\");\nconst u8 gMoveDescription_SkyAttack[] = _(\"A 2nd-turn attack\\nmove with a high\\ncritical-hit ratio.\\nThe foe may flinch.\");\nconst u8 gMoveDescription_Transform[] = _(\"The user transforms\\ninto a copy of the\\nfoe with even the\\nsame move set.\");\nconst u8 gMoveDescription_Bubble[] = _(\"A spray of bubbles\\nhits the foe.\\nIt may lower the\\nfoe's SPEED stat.\");\nconst u8 gMoveDescription_DizzyPunch[] = _(\"The foe is hit with\\na rhythmic punch\\nthat may leave it\\nconfused.\");\nconst u8 gMoveDescription_Spore[] = _(\"The user scatters\\nbursts of fine\\nspores that induce\\nsleep.\");\nconst u8 gMoveDescription_Flash[] = _(\"A blast of light\\nthat cuts the foe's\\naccuracy. It also\\nilluminates caves.\");\nconst u8 gMoveDescription_Psywave[] = _(\"The foe is attacked\\nwith an odd, hot\\nenergy wave that\\nvaries in intensity.\");\nconst u8 gMoveDescription_Splash[] = _(\"The user just flops\\nand splashes around\\nwithout having any\\neffect.\");\nconst u8 gMoveDescription_AcidArmor[] = _(\"The user alters its\\ncells to liquefy\\nitself and sharply\\nraise DEFENSE.\");\nconst u8 gMoveDescription_Crabhammer[] = _(\"A large pincer is\\nused to hammer the\\nfoe. It has a high\\ncritical-hit ratio.\");\nconst u8 gMoveDescription_Explosion[] = _(\"The user explodes\\nto inflict terrible\\ndamage even while\\nfainting itself.\");\nconst u8 gMoveDescription_FurySwipes[] = _(\"The foe is raked\\nwith sharp claws or\\nscythes two to five\\ntimes.\");\nconst u8 gMoveDescription_Bonemerang[] = _(\"The user throws a\\nbone that hits the\\nfoe once, then once\\nagain on return.\");\nconst u8 gMoveDescription_Rest[] = _(\"The user sleeps for\\ntwo turns to fully\\nrestore HP and heal\\nany status problem.\");\nconst u8 gMoveDescription_RockSlide[] = _(\"Large boulders are\\nhurled at the foe.\\nIt may make the\\nfoe flinch.\");\nconst u8 gMoveDescription_HyperFang[] = _(\"The foe is attacked\\nwith sharp fangs.\\nIt may make the\\nfoe flinch.\");\nconst u8 gMoveDescription_Sharpen[] = _(\"The user reduces\\nits polygon count\\nto sharpen edges\\nand raise ATTACK.\");\nconst u8 gMoveDescription_Conversion[] = _(\"The user changes\\nits type to match\\nthe type of one of\\nits moves.\");\nconst u8 gMoveDescription_TriAttack[] = _(\"A simultaneous\\n3-beam attack that\\nmay paralyze, burn,\\nor freeze the foe.\");\nconst u8 gMoveDescription_SuperFang[] = _(\"The user attacks\\nwith sharp fangs\\nand halves the\\nfoe's HP.\");\nconst u8 gMoveDescription_Slash[] = _(\"The foe is slashed\\nwith claws, etc.\\nIt has a high\\ncritical-hit ratio.\");\nconst u8 gMoveDescription_Substitute[] = _(\"The user creates a\\ndecoy using one-\\nquarter of its full\\nHP.\");\nconst u8 gMoveDescription_Struggle[] = _(\"An attack that is\\nused only if there\\nis no PP. It also\\nhurts the user.\");\nconst u8 gMoveDescription_Sketch[] = _(\"This move copies\\nthe move last used\\nby the foe, then\\ndisappears.\");\nconst u8 gMoveDescription_TripleKick[] = _(\"A 3-kick attack\\nthat becomes more\\npowerful with each\\nsuccessive hit.\");\nconst u8 gMoveDescription_Thief[] = _(\"An attack that may\\ntake the foe's held\\nitem if the user\\nisn't holding one.\");\nconst u8 gMoveDescription_SpiderWeb[] = _(\"Ensnares the foe \\nwith sticky string\\nso it doesn't flee\\nor switch out.\");\nconst u8 gMoveDescription_MindReader[] = _(\"The user predicts\\nthe foe's action to\\nensure its next\\nattack hits.\");\nconst u8 gMoveDescription_Nightmare[] = _(\"A sleeping foe is\\nshown a nightmare\\nthat inflicts some\\ndamage every turn.\");\nconst u8 gMoveDescription_FlameWheel[] = _(\"The user makes a\\nfiery charge at the\\nfoe. It may cause\\na burn.\");\nconst u8 gMoveDescription_Snore[] = _(\"An attack that can\\nbe used only while\\nasleep. It may\\ncause flinching.\");\nconst u8 gMoveDescription_Curse[] = _(\"A move that works\\ndifferently for the\\nGHOST-type and all\\nthe other types.\");\nconst u8 gMoveDescription_Flail[] = _(\"A desperate attack\\nthat becomes more\\npowerful the less\\nHP the user has.\");\nconst u8 gMoveDescription_Conversion2[] = _(\"The user changes\\ntype to make itself\\nresistant to the\\nlast attack it took.\");\nconst u8 gMoveDescription_Aeroblast[] = _(\"A vortex of air is\\nshot at the foe.\\nIt has a high\\ncritical-hit ratio.\");\nconst u8 gMoveDescription_CottonSpore[] = _(\"Cotton-like spores\\ncling to the foe,\\nsharply reducing\\nits SPEED stat.\");\nconst u8 gMoveDescription_Reversal[] = _(\"An all-out attack\\nthat becomes more\\npowerful the less\\nHP the user has.\");\nconst u8 gMoveDescription_Spite[] = _(\"A move that cuts\\n2 to 5 PP from the\\nmove last used by\\nthe foe.\");\nconst u8 gMoveDescription_PowderSnow[] = _(\"Blasts the foe with\\na snowy gust.\\nIt may cause\\nfreezing.\");\nconst u8 gMoveDescription_Protect[] = _(\"Enables the user to\\nevade all attacks.\\nIt may fail if used\\nin succession.\");\nconst u8 gMoveDescription_MachPunch[] = _(\"A punch thrown at\\nblinding speed.\\nIt is certain to\\nstrike first.\");\nconst u8 gMoveDescription_ScaryFace[] = _(\"Frightens the foe\\nwith a scary face\\nto sharply reduce\\nits SPEED.\");\nconst u8 gMoveDescription_FaintAttack[] = _(\"The user draws up\\nclose to the foe\\ndisarmingly, then\\nhits without fail.\");\nconst u8 gMoveDescription_SweetKiss[] = _(\"The user kisses\\nthe foe with sweet\\ncuteness that\\ncauses confusion.\");\nconst u8 gMoveDescription_BellyDrum[] = _(\"The user maximizes\\nits ATTACK stat at\\nthe cost of half\\nits full HP.\");\nconst u8 gMoveDescription_SludgeBomb[] = _(\"Filthy sludge is\\nhurled at the foe.\\nIt may poison the\\ntarget.\");\nconst u8 gMoveDescription_MudSlap[] = _(\"Mud is hurled in\\nthe foe's face to\\ninflict damage and\\nlower its accuracy.\");\nconst u8 gMoveDescription_Octazooka[] = _(\"Ink is blasted in\\nthe foe's face or\\neyes to damage and\\nlower accuracy.\");\nconst u8 gMoveDescription_Spikes[] = _(\"A trap of spikes is\\nlaid around the\\nfoe's party to hurt\\nfoes switching in.\");\nconst u8 gMoveDescription_ZapCannon[] = _(\"An electric blast is\\nfired like a cannon\\nto inflict damage\\nand paralyze.\");\nconst u8 gMoveDescription_Foresight[] = _(\"Completely negates\\nthe foe's efforts to\\nheighten its ability\\nto evade.\");\nconst u8 gMoveDescription_DestinyBond[] = _(\"If the user faints,\\nthe foe delivering\\nthe final hit also\\nfaints.\");\nconst u8 gMoveDescription_PerishSong[] = _(\"Any battler that\\nhears this faints\\nin three turns\\nunless it switches.\");\nconst u8 gMoveDescription_IcyWind[] = _(\"A chilling wind is\\nused to attack.\\nIt also lowers the\\nSPEED stat.\");\nconst u8 gMoveDescription_Detect[] = _(\"Enables the user to\\nevade all attacks.\\nIt may fail if used\\nin succession.\");\nconst u8 gMoveDescription_BoneRush[] = _(\"The user strikes\\nthe foe with a bone\\nin hand two to five\\ntimes.\");\nconst u8 gMoveDescription_LockOn[] = _(\"The user locks on\\nto the foe, making\\nthe next move sure\\nto hit.\");\nconst u8 gMoveDescription_Outrage[] = _(\"The user thrashes\\nabout for two to\\nthree turns, then\\nbecomes confused.\");\nconst u8 gMoveDescription_Sandstorm[] = _(\"A 5-turn sandstorm\\nthat damages all\\ntypes except ROCK,\\nGROUND, and STEEL.\");\nconst u8 gMoveDescription_GigaDrain[] = _(\"A harsh attack that\\nabsorbs half the\\ndamage it inflicted\\nto restore HP.\");\nconst u8 gMoveDescription_Endure[] = _(\"The user endures\\nany hit with 1 HP\\nleft. It may fail if\\nused in succession.\");\nconst u8 gMoveDescription_Charm[] = _(\"The foe is charmed\\nby the user's cute\\nappeals, sharply\\ncutting its ATTACK.\");\nconst u8 gMoveDescription_Rollout[] = _(\"A 5-turn rolling\\nattack that becomes\\nstronger each time\\nit hits.\");\nconst u8 gMoveDescription_FalseSwipe[] = _(\"A restrained attack\\nthat always leaves\\nthe foe with at\\nleast 1 HP.\");\nconst u8 gMoveDescription_Swagger[] = _(\"A move that makes\\nthe foe confused,\\nbut also sharply\\nraises its ATTACK.\");\nconst u8 gMoveDescription_MilkDrink[] = _(\"Heals the user by\\nup to half its full\\nHP. It can be used\\nto heal an ally.\");\nconst u8 gMoveDescription_Spark[] = _(\"An electrically\\ncharged tackle that\\nmay also paralyze\\nthe foe.\");\nconst u8 gMoveDescription_FuryCutter[] = _(\"An attack that\\ngrows stronger on\\neach successive\\nhit.\");\nconst u8 gMoveDescription_SteelWing[] = _(\"The foe is hit with\\nwings of steel.\\nIt may also raise\\nthe user's DEFENSE.\");\nconst u8 gMoveDescription_MeanLook[] = _(\"The foe is fixed\\nwith a mean look\\nthat prevents it\\nfrom escaping.\");\nconst u8 gMoveDescription_Attract[] = _(\"If it is the other\\ngender, the foe is\\nmade infatuated and\\nunlikely to attack.\");\nconst u8 gMoveDescription_SleepTalk[] = _(\"While asleep, the\\nuser randomly uses\\none of the moves it\\nknows.\");\nconst u8 gMoveDescription_HealBell[] = _(\"A soothing bell\\nchimes to heal the\\nstatus problems of\\nall allies.\");\nconst u8 gMoveDescription_Return[] = _(\"This attack move\\ngrows more powerful\\nthe more the user\\nlikes its TRAINER.\");\nconst u8 gMoveDescription_Present[] = _(\"The foe is given a\\nbooby-trapped gift.\\nIt restores HP\\nsometimes, however.\");\nconst u8 gMoveDescription_Frustration[] = _(\"This attack move\\ngrows more powerful\\nthe less the user\\nlikes its TRAINER.\");\nconst u8 gMoveDescription_Safeguard[] = _(\"It protects the\\nuser's party from\\nall status problems\\nfor five turns.\");\nconst u8 gMoveDescription_PainSplit[] = _(\"The user adds its\\nHP to the foe's HP,\\nthen equally shares\\nthe total HP.\");\nconst u8 gMoveDescription_SacredFire[] = _(\"A mystical and\\npowerful fire\\nattack that may\\ninflict a burn.\");\nconst u8 gMoveDescription_Magnitude[] = _(\"A ground-shaking\\nattack against all\\nstanding POKéMON.\\nIts power varies.\");\nconst u8 gMoveDescription_DynamicPunch[] = _(\"The foe is punched\\nwith the user's full\\npower. It confuses\\nthe foe if it hits.\");\nconst u8 gMoveDescription_Megahorn[] = _(\"A brutal ramming\\nattack delivered\\nwith a tough and\\nimpressive horn.\");\nconst u8 gMoveDescription_DragonBreath[] = _(\"The foe is hit with\\nan incredible blast\\nof breath that may\\nalso paralyze.\");\nconst u8 gMoveDescription_BatonPass[] = _(\"The user switches\\nout, passing along\\nany stat changes\\nto the new battler.\");\nconst u8 gMoveDescription_Encore[] = _(\"Makes the foe use\\nthe move it last\\nused repeatedly for\\ntwo to six turns.\");\nconst u8 gMoveDescription_Pursuit[] = _(\"An attack move that\\nworks especially\\nwell on a foe that\\nis switching out.\");\nconst u8 gMoveDescription_RapidSpin[] = _(\"An attack that\\nfrees the user from\\nBIND, WRAP, LEECH\\nSEED, and SPIKES.\");\nconst u8 gMoveDescription_SweetScent[] = _(\"Allures the foe to\\nreduce evasiveness.\\nIt also attracts\\nwild POKéMON.\");\nconst u8 gMoveDescription_IronTail[] = _(\"An attack with a\\nsteel-hard tail.\\nIt may lower the\\nfoe's DEFENSE stat.\");\nconst u8 gMoveDescription_MetalClaw[] = _(\"The foe is attacked\\nwith steel claws.\\nIt may also raise\\nthe user's ATTACK.\");\nconst u8 gMoveDescription_VitalThrow[] = _(\"Makes the user\\nattack after the\\nfoe. In return,\\nit will not miss.\");\nconst u8 gMoveDescription_MorningSun[] = _(\"Restores the user's\\nHP. The amount of\\nHP regained varies\\nwith the weather.\");\nconst u8 gMoveDescription_Synthesis[] = _(\"Restores the user's\\nHP. The amount of\\nHP regained varies\\nwith the weather.\");\nconst u8 gMoveDescription_Moonlight[] = _(\"Restores the user's\\nHP. The amount of\\nHP regained varies\\nwith the weather.\");\nconst u8 gMoveDescription_HiddenPower[] = _(\"An attack that\\nvaries in type and\\nintensity depending\\non the user.\");\nconst u8 gMoveDescription_CrossChop[] = _(\"The foe is hit with\\ndouble chops.\\nIt has a high\\ncritical-hit ratio.\");\nconst u8 gMoveDescription_Twister[] = _(\"A vicious twister\\nattacks the foe.\\nIt may make the\\nfoe flinch.\");\nconst u8 gMoveDescription_RainDance[] = _(\"A heavy rain falls\\nfor five turns,\\npowering up WATER-\\ntype moves.\");\nconst u8 gMoveDescription_SunnyDay[] = _(\"The sun blazes for\\nfive turns, powering\\nup FIRE-type\\nmoves.\");\nconst u8 gMoveDescription_Crunch[] = _(\"The foe is crunched\\nwith sharp fangs.\\nIt may lower the\\nfoe's SP. DEF.\");\nconst u8 gMoveDescription_MirrorCoat[] = _(\"A retaliation move\\nthat pays back the\\nfoe's special attack\\ndouble.\");\nconst u8 gMoveDescription_PsychUp[] = _(\"The user hypnotizes\\nitself into copying\\nany stat change\\nmade by the foe.\");\nconst u8 gMoveDescription_ExtremeSpeed[] = _(\"A blindingly speedy\\ncharge attack that\\nalways goes before\\nany other.\");\nconst u8 gMoveDescription_AncientPower[] = _(\"An ancient power is\\nused to attack. It\\nmay also raise all\\nthe user's stats.\");\nconst u8 gMoveDescription_ShadowBall[] = _(\"A shadowy blob is\\nhurled at the foe.\\nMay also lower the\\nfoe's SP. DEF.\");\nconst u8 gMoveDescription_FutureSight[] = _(\"Two turns after\\nthis move is used,\\nthe foe is attacked\\npsychically.\");\nconst u8 gMoveDescription_RockSmash[] = _(\"An attack that may\\nalso cut DEFENSE.\\nIt can also smash\\ncracked boulders.\");\nconst u8 gMoveDescription_Whirlpool[] = _(\"The foe is trapped\\nin a fast, vicious\\nwhirlpool for two\\nto five turns.\");\nconst u8 gMoveDescription_BeatUp[] = _(\"All party POKéMON\\njoin in the attack.\\nThe more allies,\\nthe more damage.\");\nconst u8 gMoveDescription_FakeOut[] = _(\"An attack that hits\\nfirst and causes\\nflinching. Usable\\nonly on 1st turn.\");\nconst u8 gMoveDescription_Uproar[] = _(\"The user attacks in\\nan uproar that\\nprevents sleep for\\ntwo to five turns.\");\nconst u8 gMoveDescription_Stockpile[] = _(\"The user charges\\nup power for use\\nlater. It can be\\nused three times.\");\nconst u8 gMoveDescription_SpitUp[] = _(\"The power built\\nusing STOCKPILE is\\nreleased at once\\nfor attack.\");\nconst u8 gMoveDescription_Swallow[] = _(\"The energy it built\\nusing STOCKPILE is\\nabsorbed to restore\\nHP.\");\nconst u8 gMoveDescription_HeatWave[] = _(\"The user exhales a\\nheated breath to\\nattack. It may also\\ninflict a burn.\");\nconst u8 gMoveDescription_Hail[] = _(\"A hailstorm lasting\\nfive turns damages\\nall POKéMON except\\nthe ICE-type.\");\nconst u8 gMoveDescription_Torment[] = _(\"It enrages the foe,\\nmaking it incapable\\nof using the same\\nmove successively.\");\nconst u8 gMoveDescription_Flatter[] = _(\"Flattery is used to\\nconfuse the foe,\\nbut its SP. ATK\\nalso rises.\");\nconst u8 gMoveDescription_WillOWisp[] = _(\"A sinister, bluish\\nwhite flame is shot\\nat the foe to\\ninflict a burn.\");\nconst u8 gMoveDescription_Memento[] = _(\"The user faints,\\nbut sharply lowers\\nthe foe's ATTACK\\nand SP. ATK.\");\nconst u8 gMoveDescription_Facade[] = _(\"An attack that is\\nboosted if user is\\nburned, poisoned,\\nor paralyzed.\");\nconst u8 gMoveDescription_FocusPunch[] = _(\"An attack that is\\nexecuted last.\\nThe user flinches\\nif hit beforehand.\");\nconst u8 gMoveDescription_SmellingSalt[] = _(\"Doubly effective on\\na paralyzed foe,\\nbut it also cures\\nthe foe's paralysis.\");\nconst u8 gMoveDescription_FollowMe[] = _(\"The user draws\\nattention to itself,\\nmaking foes attack\\nonly the user.\");\nconst u8 gMoveDescription_NaturePower[] = _(\"An attack that\\nchanges type\\ndepending on the\\nuser's location.\");\nconst u8 gMoveDescription_Charge[] = _(\"The user charges\\npower to boost the\\nELECTRIC move it\\nuses next.\");\nconst u8 gMoveDescription_Taunt[] = _(\"The foe is taunted\\ninto a rage that\\nallows it to use\\nonly attack moves.\");\nconst u8 gMoveDescription_HelpingHand[] = _(\"A move that boosts\\nthe power of the\\nally's attack in a\\nbattle.\");\nconst u8 gMoveDescription_Trick[] = _(\"A move that tricks\\nthe foe into\\ntrading held items\\nwith the user.\");\nconst u8 gMoveDescription_RolePlay[] = _(\"The user mimics the\\nfoe completely and\\ncopies the foe's\\nability.\");\nconst u8 gMoveDescription_Wish[] = _(\"A self-healing move\\nthat restores half\\nthe full HP on the\\nnext turn.\");\nconst u8 gMoveDescription_Assist[] = _(\"The user randomly\\npicks and uses a\\nmove of an allied\\nPOKéMON.\");\nconst u8 gMoveDescription_Ingrain[] = _(\"The user lays roots\\nthat restore HP on\\nevery turn.\\nIt can't switch out.\");\nconst u8 gMoveDescription_Superpower[] = _(\"A powerful attack,\\nbut it also lowers\\nthe user's ATTACK\\nand DEFENSE stats.\");\nconst u8 gMoveDescription_MagicCoat[] = _(\"Reflects back the\\nfoe's LEECH SEED\\nand any status-\\ndamaging move.\");\nconst u8 gMoveDescription_Recycle[] = _(\"A move that\\nrecycles a used\\nitem for use once\\nmore.\");\nconst u8 gMoveDescription_Revenge[] = _(\"An attack move that\\ngains in intensity if\\nthe target has hurt\\nthe user.\");\nconst u8 gMoveDescription_BrickBreak[] = _(\"An attack that also\\nbreaks any barrier\\nlike LIGHT SCREEN\\nand REFLECT.\");\nconst u8 gMoveDescription_Yawn[] = _(\"A huge yawn lulls\\nthe foe into falling\\nasleep on the next\\nturn.\");\nconst u8 gMoveDescription_KnockOff[] = _(\"Knocks down the\\nfoe's held item to\\nprevent its use\\nduring the battle.\");\nconst u8 gMoveDescription_Endeavor[] = _(\"Gains power the\\nfewer HP the user\\nhas compared with\\nthe foe.\");\nconst u8 gMoveDescription_Eruption[] = _(\"The higher the\\nuser's HP, the more\\npowerful this\\nattack becomes.\");\nconst u8 gMoveDescription_SkillSwap[] = _(\"The user employs\\nits psychic power\\nto swap abilities\\nwith the foe.\");\nconst u8 gMoveDescription_Imprison[] = _(\"Prevents foes from\\nusing any move\\nthat is also known\\nby the user.\");\nconst u8 gMoveDescription_Refresh[] = _(\"A self-healing move\\nthat cures the user\\nof a poisoning,\\nburn, or paralysis.\");\nconst u8 gMoveDescription_Grudge[] = _(\"If the user faints,\\nthis move deletes\\nthe PP of the move\\nthat finished it.\");\nconst u8 gMoveDescription_Snatch[] = _(\"Steals the effects\\nof the foe's\\nhealing or status-\\nchanging move.\");\nconst u8 gMoveDescription_SecretPower[] = _(\"An attack that may\\nhave an additional\\neffect that varies\\nwith the terrain.\");\nconst u8 gMoveDescription_Dive[] = _(\"The user dives\\nunderwater on the\\nfirst turn and\\nstrikes next turn.\");\nconst u8 gMoveDescription_ArmThrust[] = _(\"A quick flurry of\\nstraight-arm\\npunches that hit\\ntwo to five times.\");\nconst u8 gMoveDescription_Camouflage[] = _(\"Alters the user's\\ntype depending on\\nthe location's\\nterrain.\");\nconst u8 gMoveDescription_TailGlow[] = _(\"The user flashes a\\nlight that sharply\\nraises its SP. ATK\\nstat.\");\nconst u8 gMoveDescription_LusterPurge[] = _(\"A burst of light\\ninjures the foe. It\\nmay also lower the\\nfoe's SP. DEF.\");\nconst u8 gMoveDescription_MistBall[] = _(\"A flurry of down\\nhits the foe. It\\nmay also lower the\\nfoe's SP. ATK.\");\nconst u8 gMoveDescription_FeatherDance[] = _(\"The foe is covered\\nwith a mass of down\\nthat sharply cuts\\nthe ATTACK stat.\");\nconst u8 gMoveDescription_TeeterDance[] = _(\"A wobbly dance\\nthat confuses all\\nthe POKéMON in\\nbattle.\");\nconst u8 gMoveDescription_BlazeKick[] = _(\"A fiery kick with a\\nhigh critical-hit\\nratio. It may also\\nburn the foe.\");\nconst u8 gMoveDescription_MudSport[] = _(\"Weakens ELECTRIC-\\ntype attacks while\\nthe user is in the\\nbattle.\");\nconst u8 gMoveDescription_IceBall[] = _(\"A 5-turn rolling\\nattack that becomes\\nstronger each time\\nit rolls.\");\nconst u8 gMoveDescription_NeedleArm[] = _(\"An attack using\\nthorny arms.\\nIt may make the\\nfoe flinch.\");\nconst u8 gMoveDescription_SlackOff[] = _(\"The user slacks off\\nand restores its HP\\nby half its full\\nHP.\");\nconst u8 gMoveDescription_HyperVoice[] = _(\"The user lets loose\\na horribly loud\\nshout with the\\npower to damage.\");\nconst u8 gMoveDescription_PoisonFang[] = _(\"The foe is bitten\\nwith toxic fangs.\\nIt may also badly\\npoison the foe.\");\nconst u8 gMoveDescription_CrushClaw[] = _(\"The foe is attacked\\nwith sharp claws.\\nIt may also lower\\nthe foe's DEFENSE.\");\nconst u8 gMoveDescription_BlastBurn[] = _(\"The foe is hit with\\na huge explosion.\\nThe user can't move\\non the next turn.\");\nconst u8 gMoveDescription_HydroCannon[] = _(\"The foe is hit with\\na watery cannon.\\nThe user can't move\\non the next turn.\");\nconst u8 gMoveDescription_MeteorMash[] = _(\"The foe is hit with\\na hard, fast punch.\\nIt may also raise\\nthe user's ATTACK.\");\nconst u8 gMoveDescription_Astonish[] = _(\"An attack using a\\nstartling shout.\\nIt also may make\\nthe foe flinch.\");\nconst u8 gMoveDescription_WeatherBall[] = _(\"An attack that\\nvaries in power and\\ntype depending on\\nthe weather.\");\nconst u8 gMoveDescription_Aromatherapy[] = _(\"A soothing scent is\\nreleased to heal\\nall status problems\\nin the user's party.\");\nconst u8 gMoveDescription_FakeTears[] = _(\"The user feigns\\ncrying to sharply\\nlower the foe's\\nSP. DEF stat.\");\nconst u8 gMoveDescription_AirCutter[] = _(\"The foe is hit with\\nrazor-like wind.\\nIt has a high\\ncritical-hit ratio.\");\nconst u8 gMoveDescription_Overheat[] = _(\"An intense attack\\nthat also sharply\\nreduces the user's\\nSP. ATK stat.\");\nconst u8 gMoveDescription_OdorSleuth[] = _(\"Completely negates\\nthe foe's efforts to\\nheighten its ability\\nto evade.\");\nconst u8 gMoveDescription_RockTomb[] = _(\"Boulders are hurled\\nat the foe. It also\\nlowers the foe's\\nSPEED if it hits.\");\nconst u8 gMoveDescription_SilverWind[] = _(\"The foe is attacked\\nwith a silver dust.\\nIt may raise all\\nthe user's stats.\");\nconst u8 gMoveDescription_MetalSound[] = _(\"A horrible metallic\\nscreech is used to\\nsharply lower the\\nfoe's SP. DEF.\");\nconst u8 gMoveDescription_GrassWhistle[] = _(\"A pleasant melody\\nis played to lull\\nthe foe into a deep\\nsleep.\");\nconst u8 gMoveDescription_Tickle[] = _(\"The foe is made to\\nlaugh, reducing its\\nATTACK and DEFENSE\\nstats.\");\nconst u8 gMoveDescription_CosmicPower[] = _(\"The user absorbs a\\nmystic power to\\nraise its DEFENSE\\nand SP. DEF.\");\nconst u8 gMoveDescription_WaterSpout[] = _(\"The higher the\\nuser's HP, the more\\npowerful this\\nattack becomes.\");\nconst u8 gMoveDescription_SignalBeam[] = _(\"The foe is hit with\\na flashing beam\\nthat may also\\ncause confusion.\");\nconst u8 gMoveDescription_ShadowPunch[] = _(\"The user throws a\\npunch from the\\nshadows. It cannot\\nbe evaded.\");\nconst u8 gMoveDescription_Extrasensory[] = _(\"The user attacks\\nwith an odd power\\nthat may make the\\nfoe flinch.\");\nconst u8 gMoveDescription_SkyUppercut[] = _(\"The user attacks\\nwith an uppercut\\nthrown skywards\\nwith force.\");\nconst u8 gMoveDescription_SandTomb[] = _(\"The foe is trapped\\ninside a painful\\nsandstorm for two\\nto five turns.\");\nconst u8 gMoveDescription_SheerCold[] = _(\"The foe is attacked\\nwith ultimate cold\\nthat causes fainting\\nif it hits.\");\nconst u8 gMoveDescription_MuddyWater[] = _(\"The user attacks\\nwith muddy water.\\nIt may also lower\\nthe foe's accuracy.\");\nconst u8 gMoveDescription_BulletSeed[] = _(\"The user shoots\\nseeds at the foe.\\nTwo to five seeds\\nare shot at once.\");\nconst u8 gMoveDescription_AerialAce[] = _(\"An extremely fast\\nattack against one\\ntarget. It can't be\\nevaded.\");\nconst u8 gMoveDescription_IcicleSpear[] = _(\"Sharp icicles are\\nfired at the foe.\\nIt strikes two to\\nfive times.\");\nconst u8 gMoveDescription_IronDefense[] = _(\"The user hardens\\nits body's surface\\nto sharply raise its\\nDEFENSE stat.\");\nconst u8 gMoveDescription_Block[] = _(\"The user blocks the\\nfoe's way with arms\\nspread wide to\\nprevent escape.\");\nconst u8 gMoveDescription_Howl[] = _(\"The user howls to\\nraise its spirit and\\nboost its ATTACK\\nstat.\");\nconst u8 gMoveDescription_DragonClaw[] = _(\"Sharp, huge claws\\nhook and slash the\\nfoe quickly and\\nwith great power.\");\nconst u8 gMoveDescription_FrenzyPlant[] = _(\"The foe is hit with\\nan enormous branch.\\nThe user can't move\\non the next turn.\");\nconst u8 gMoveDescription_BulkUp[] = _(\"The user bulks up\\nits body to boost\\nboth its ATTACK and\\nDEFENSE stats.\");\nconst u8 gMoveDescription_Bounce[] = _(\"The user bounces\\non the foe on the\\n2nd turn. It may\\nparalyze the foe.\");\nconst u8 gMoveDescription_MudShot[] = _(\"The user attacks by\\nhurling mud.\\nIt also reduces the\\nfoe's SPEED.\");\nconst u8 gMoveDescription_PoisonTail[] = _(\"An attack with a\\nhigh critical-hit\\nratio. It may also\\npoison the foe.\");\nconst u8 gMoveDescription_Covet[] = _(\"A cutely executed\\nattack that also\\nsteals the foe's\\nhold item.\");\nconst u8 gMoveDescription_VoltTackle[] = _(\"The user throws an\\nelectrified tackle.\\nIt hurts the user\\na little.\");\nconst u8 gMoveDescription_MagicalLeaf[] = _(\"The foe is attacked\\nwith a strange leaf\\nthat cannot be\\nevaded.\");\nconst u8 gMoveDescription_WaterSport[] = _(\"Weakens FIRE-type\\nattacks while the\\nuser is in the\\nbattle.\");\nconst u8 gMoveDescription_CalmMind[] = _(\"The user focuses\\nits mind to raise\\nthe SP. ATK and\\nSP. DEF stats.\");\nconst u8 gMoveDescription_LeafBlade[] = _(\"The foe is slashed\\nwith a sharp leaf.\\nIt has a high\\ncritical-hit ratio.\");\nconst u8 gMoveDescription_DragonDance[] = _(\"A mystic, powerful\\ndance that boosts\\nthe user's ATTACK\\nand SPEED stats.\");\nconst u8 gMoveDescription_RockBlast[] = _(\"The user hurls two\\nto five hard rocks\\nat the foe to\\nattack.\");\nconst u8 gMoveDescription_ShockWave[] = _(\"A rapid jolt of\\nelectricity strikes\\nthe foe. It can't\\nbe evaded.\");\nconst u8 gMoveDescription_WaterPulse[] = _(\"An attack with a\\npulsing blast of\\nwater. It may also\\nconfuse the foe.\");\nconst u8 gMoveDescription_DoomDesire[] = _(\"A move that attacks\\nthe foe with a\\nblast of light two\\nturns after use.\");\nconst u8 gMoveDescription_PsychoBoost[] = _(\"An intense attack\\nthat also sharply\\nreduces the user's\\nSP. ATK stat.\");\n\nconst u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = {\n    [MOVE_POUND         - 1] = gMoveDescription_Pound,\n    [MOVE_KARATE_CHOP   - 1] = gMoveDescription_KarateChop,\n    [MOVE_DOUBLE_SLAP   - 1] = gMoveDescription_DoubleSlap,\n    [MOVE_COMET_PUNCH   - 1] = gMoveDescription_CometPunch,\n    [MOVE_MEGA_PUNCH    - 1] = gMoveDescription_MegaPunch,\n    [MOVE_PAY_DAY       - 1] = gMoveDescription_PayDay,\n    [MOVE_FIRE_PUNCH    - 1] = gMoveDescription_FirePunch,\n    [MOVE_ICE_PUNCH     - 1] = gMoveDescription_IcePunch,\n    [MOVE_THUNDER_PUNCH - 1] = gMoveDescription_ThunderPunch,\n    [MOVE_SCRATCH       - 1] = gMoveDescription_Scratch,\n    [MOVE_VICE_GRIP     - 1] = gMoveDescription_ViceGrip,\n    [MOVE_GUILLOTINE    - 1] = gMoveDescription_Guillotine,\n    [MOVE_RAZOR_WIND    - 1] = gMoveDescription_RazorWind,\n    [MOVE_SWORDS_DANCE  - 1] = gMoveDescription_SwordsDance,\n    [MOVE_CUT           - 1] = gMoveDescription_Cut,\n    [MOVE_GUST          - 1] = gMoveDescription_Gust,\n    [MOVE_WING_ATTACK   - 1] = gMoveDescription_WingAttack,\n    [MOVE_WHIRLWIND     - 1] = gMoveDescription_Whirlwind,\n    [MOVE_FLY           - 1] = gMoveDescription_Fly,\n    [MOVE_BIND          - 1] = gMoveDescription_Bind,\n    [MOVE_SLAM          - 1] = gMoveDescription_Slam,\n    [MOVE_VINE_WHIP     - 1] = gMoveDescription_VineWhip,\n    [MOVE_STOMP         - 1] = gMoveDescription_Stomp,\n    [MOVE_DOUBLE_KICK   - 1] = gMoveDescription_DoubleKick,\n    [MOVE_MEGA_KICK     - 1] = gMoveDescription_MegaKick,\n    [MOVE_JUMP_KICK     - 1] = gMoveDescription_JumpKick,\n    [MOVE_ROLLING_KICK  - 1] = gMoveDescription_RollingKick,\n    [MOVE_SAND_ATTACK   - 1] = gMoveDescription_SandAttack,\n    [MOVE_HEADBUTT      - 1] = gMoveDescription_Headbutt,\n    [MOVE_HORN_ATTACK   - 1] = gMoveDescription_HornAttack,\n    [MOVE_FURY_ATTACK   - 1] = gMoveDescription_FuryAttack,\n    [MOVE_HORN_DRILL    - 1] = gMoveDescription_HornDrill,\n    [MOVE_TACKLE        - 1] = gMoveDescription_Tackle,\n    [MOVE_BODY_SLAM     - 1] = gMoveDescription_BodySlam,\n    [MOVE_WRAP          - 1] = gMoveDescription_Wrap,\n    [MOVE_TAKE_DOWN     - 1] = gMoveDescription_TakeDown,\n    [MOVE_THRASH        - 1] = gMoveDescription_Thrash,\n    [MOVE_DOUBLE_EDGE   - 1] = gMoveDescription_DoubleEdge,\n    [MOVE_TAIL_WHIP     - 1] = gMoveDescription_TailWhip,\n    [MOVE_POISON_STING  - 1] = gMoveDescription_PoisonSting,\n    [MOVE_TWINEEDLE     - 1] = gMoveDescription_Twineedle,\n    [MOVE_PIN_MISSILE   - 1] = gMoveDescription_PinMissile,\n    [MOVE_LEER          - 1] = gMoveDescription_Leer,\n    [MOVE_BITE          - 1] = gMoveDescription_Bite,\n    [MOVE_GROWL         - 1] = gMoveDescription_Growl,\n    [MOVE_ROAR          - 1] = gMoveDescription_Roar,\n    [MOVE_SING          - 1] = gMoveDescription_Sing,\n    [MOVE_SUPERSONIC    - 1] = gMoveDescription_Supersonic,\n    [MOVE_SONIC_BOOM    - 1] = gMoveDescription_SonicBoom,\n    [MOVE_DISABLE       - 1] = gMoveDescription_Disable,\n    [MOVE_ACID          - 1] = gMoveDescription_Acid,\n    [MOVE_EMBER         - 1] = gMoveDescription_Ember,\n    [MOVE_FLAMETHROWER  - 1] = gMoveDescription_Flamethrower,\n    [MOVE_MIST          - 1] = gMoveDescription_Mist,\n    [MOVE_WATER_GUN     - 1] = gMoveDescription_WaterGun,\n    [MOVE_HYDRO_PUMP    - 1] = gMoveDescription_HydroPump,\n    [MOVE_SURF          - 1] = gMoveDescription_Surf,\n    [MOVE_ICE_BEAM      - 1] = gMoveDescription_IceBeam,\n    [MOVE_BLIZZARD      - 1] = gMoveDescription_Blizzard,\n    [MOVE_PSYBEAM       - 1] = gMoveDescription_Psybeam,\n    [MOVE_BUBBLE_BEAM   - 1] = gMoveDescription_BubbleBeam,\n    [MOVE_AURORA_BEAM   - 1] = gMoveDescription_AuroraBeam,\n    [MOVE_HYPER_BEAM    - 1] = gMoveDescription_HyperBeam,\n    [MOVE_PECK          - 1] = gMoveDescription_Peck,\n    [MOVE_DRILL_PECK    - 1] = gMoveDescription_DrillPeck,\n    [MOVE_SUBMISSION    - 1] = gMoveDescription_Submission,\n    [MOVE_LOW_KICK      - 1] = gMoveDescription_LowKick,\n    [MOVE_COUNTER       - 1] = gMoveDescription_Counter,\n    [MOVE_SEISMIC_TOSS  - 1] = gMoveDescription_SeismicToss,\n    [MOVE_STRENGTH      - 1] = gMoveDescription_Strength,\n    [MOVE_ABSORB        - 1] = gMoveDescription_Absorb,\n    [MOVE_MEGA_DRAIN    - 1] = gMoveDescription_MegaDrain,\n    [MOVE_LEECH_SEED    - 1] = gMoveDescription_LeechSeed,\n    [MOVE_GROWTH        - 1] = gMoveDescription_Growth,\n    [MOVE_RAZOR_LEAF    - 1] = gMoveDescription_RazorLeaf,\n    [MOVE_SOLAR_BEAM    - 1] = gMoveDescription_SolarBeam,\n    [MOVE_POISON_POWDER - 1] = gMoveDescription_PoisonPowder,\n    [MOVE_STUN_SPORE    - 1] = gMoveDescription_StunSpore,\n    [MOVE_SLEEP_POWDER  - 1] = gMoveDescription_SleepPowder,\n    [MOVE_PETAL_DANCE   - 1] = gMoveDescription_PetalDance,\n    [MOVE_STRING_SHOT   - 1] = gMoveDescription_StringShot,\n    [MOVE_DRAGON_RAGE   - 1] = gMoveDescription_DragonRage,\n    [MOVE_FIRE_SPIN     - 1] = gMoveDescription_FireSpin,\n    [MOVE_THUNDER_SHOCK - 1] = gMoveDescription_ThunderShock,\n    [MOVE_THUNDERBOLT   - 1] = gMoveDescription_Thunderbolt,\n    [MOVE_THUNDER_WAVE  - 1] = gMoveDescription_ThunderWave,\n    [MOVE_THUNDER       - 1] = gMoveDescription_Thunder,\n    [MOVE_ROCK_THROW    - 1] = gMoveDescription_RockThrow,\n    [MOVE_EARTHQUAKE    - 1] = gMoveDescription_Earthquake,\n    [MOVE_FISSURE       - 1] = gMoveDescription_Fissure,\n    [MOVE_DIG           - 1] = gMoveDescription_Dig,\n    [MOVE_TOXIC         - 1] = gMoveDescription_Toxic,\n    [MOVE_CONFUSION     - 1] = gMoveDescription_Confusion,\n    [MOVE_PSYCHIC       - 1] = gMoveDescription_Psychic,\n    [MOVE_HYPNOSIS      - 1] = gMoveDescription_Hypnosis,\n    [MOVE_MEDITATE      - 1] = gMoveDescription_Meditate,\n    [MOVE_AGILITY       - 1] = gMoveDescription_Agility,\n    [MOVE_QUICK_ATTACK  - 1] = gMoveDescription_QuickAttack,\n    [MOVE_RAGE          - 1] = gMoveDescription_Rage,\n    [MOVE_TELEPORT      - 1] = gMoveDescription_Teleport,\n    [MOVE_NIGHT_SHADE   - 1] = gMoveDescription_NightShade,\n    [MOVE_MIMIC         - 1] = gMoveDescription_Mimic,\n    [MOVE_SCREECH       - 1] = gMoveDescription_Screech,\n    [MOVE_DOUBLE_TEAM   - 1] = gMoveDescription_DoubleTeam,\n    [MOVE_RECOVER       - 1] = gMoveDescription_Recover,\n    [MOVE_HARDEN        - 1] = gMoveDescription_Harden,\n    [MOVE_MINIMIZE      - 1] = gMoveDescription_Minimize,\n    [MOVE_SMOKESCREEN   - 1] = gMoveDescription_Smokescreen,\n    [MOVE_CONFUSE_RAY   - 1] = gMoveDescription_ConfuseRay,\n    [MOVE_WITHDRAW      - 1] = gMoveDescription_Withdraw,\n    [MOVE_DEFENSE_CURL  - 1] = gMoveDescription_DefenseCurl,\n    [MOVE_BARRIER       - 1] = gMoveDescription_Barrier,\n    [MOVE_LIGHT_SCREEN  - 1] = gMoveDescription_LightScreen,\n    [MOVE_HAZE          - 1] = gMoveDescription_Haze,\n    [MOVE_REFLECT       - 1] = gMoveDescription_Reflect,\n    [MOVE_FOCUS_ENERGY  - 1] = gMoveDescription_FocusEnergy,\n    [MOVE_BIDE          - 1] = gMoveDescription_Bide,\n    [MOVE_METRONOME     - 1] = gMoveDescription_Metronome,\n    [MOVE_MIRROR_MOVE   - 1] = gMoveDescription_MirrorMove,\n    [MOVE_SELF_DESTRUCT - 1] = gMoveDescription_SelfDestruct,\n    [MOVE_EGG_BOMB      - 1] = gMoveDescription_EggBomb,\n    [MOVE_LICK          - 1] = gMoveDescription_Lick,\n    [MOVE_SMOG          - 1] = gMoveDescription_Smog,\n    [MOVE_SLUDGE        - 1] = gMoveDescription_Sludge,\n    [MOVE_BONE_CLUB     - 1] = gMoveDescription_BoneClub,\n    [MOVE_FIRE_BLAST    - 1] = gMoveDescription_FireBlast,\n    [MOVE_WATERFALL     - 1] = gMoveDescription_Waterfall,\n    [MOVE_CLAMP         - 1] = gMoveDescription_Clamp,\n    [MOVE_SWIFT         - 1] = gMoveDescription_Swift,\n    [MOVE_SKULL_BASH    - 1] = gMoveDescription_SkullBash,\n    [MOVE_SPIKE_CANNON  - 1] = gMoveDescription_SpikeCannon,\n    [MOVE_CONSTRICT     - 1] = gMoveDescription_Constrict,\n    [MOVE_AMNESIA       - 1] = gMoveDescription_Amnesia,\n    [MOVE_KINESIS       - 1] = gMoveDescription_Kinesis,\n    [MOVE_SOFT_BOILED   - 1] = gMoveDescription_SoftBoiled,\n    [MOVE_HI_JUMP_KICK  - 1] = gMoveDescription_HiJumpKick,\n    [MOVE_GLARE         - 1] = gMoveDescription_Glare,\n    [MOVE_DREAM_EATER   - 1] = gMoveDescription_DreamEater,\n    [MOVE_POISON_GAS    - 1] = gMoveDescription_PoisonGas,\n    [MOVE_BARRAGE       - 1] = gMoveDescription_Barrage,\n    [MOVE_LEECH_LIFE    - 1] = gMoveDescription_LeechLife,\n    [MOVE_LOVELY_KISS   - 1] = gMoveDescription_LovelyKiss,\n    [MOVE_SKY_ATTACK    - 1] = gMoveDescription_SkyAttack,\n    [MOVE_TRANSFORM     - 1] = gMoveDescription_Transform,\n    [MOVE_BUBBLE        - 1] = gMoveDescription_Bubble,\n    [MOVE_DIZZY_PUNCH   - 1] = gMoveDescription_DizzyPunch,\n    [MOVE_SPORE         - 1] = gMoveDescription_Spore,\n    [MOVE_FLASH         - 1] = gMoveDescription_Flash,\n    [MOVE_PSYWAVE       - 1] = gMoveDescription_Psywave,\n    [MOVE_SPLASH        - 1] = gMoveDescription_Splash,\n    [MOVE_ACID_ARMOR    - 1] = gMoveDescription_AcidArmor,\n    [MOVE_CRABHAMMER    - 1] = gMoveDescription_Crabhammer,\n    [MOVE_EXPLOSION     - 1] = gMoveDescription_Explosion,\n    [MOVE_FURY_SWIPES   - 1] = gMoveDescription_FurySwipes,\n    [MOVE_BONEMERANG    - 1] = gMoveDescription_Bonemerang,\n    [MOVE_REST          - 1] = gMoveDescription_Rest,\n    [MOVE_ROCK_SLIDE    - 1] = gMoveDescription_RockSlide,\n    [MOVE_HYPER_FANG    - 1] = gMoveDescription_HyperFang,\n    [MOVE_SHARPEN       - 1] = gMoveDescription_Sharpen,\n    [MOVE_CONVERSION    - 1] = gMoveDescription_Conversion,\n    [MOVE_TRI_ATTACK    - 1] = gMoveDescription_TriAttack,\n    [MOVE_SUPER_FANG    - 1] = gMoveDescription_SuperFang,\n    [MOVE_SLASH         - 1] = gMoveDescription_Slash,\n    [MOVE_SUBSTITUTE    - 1] = gMoveDescription_Substitute,\n    [MOVE_STRUGGLE      - 1] = gMoveDescription_Struggle,\n    [MOVE_SKETCH        - 1] = gMoveDescription_Sketch,\n    [MOVE_TRIPLE_KICK   - 1] = gMoveDescription_TripleKick,\n    [MOVE_THIEF         - 1] = gMoveDescription_Thief,\n    [MOVE_SPIDER_WEB    - 1] = gMoveDescription_SpiderWeb,\n    [MOVE_MIND_READER   - 1] = gMoveDescription_MindReader,\n    [MOVE_NIGHTMARE     - 1] = gMoveDescription_Nightmare,\n    [MOVE_FLAME_WHEEL   - 1] = gMoveDescription_FlameWheel,\n    [MOVE_SNORE         - 1] = gMoveDescription_Snore,\n    [MOVE_CURSE         - 1] = gMoveDescription_Curse,\n    [MOVE_FLAIL         - 1] = gMoveDescription_Flail,\n    [MOVE_CONVERSION_2  - 1] = gMoveDescription_Conversion2,\n    [MOVE_AEROBLAST     - 1] = gMoveDescription_Aeroblast,\n    [MOVE_COTTON_SPORE  - 1] = gMoveDescription_CottonSpore,\n    [MOVE_REVERSAL      - 1] = gMoveDescription_Reversal,\n    [MOVE_SPITE         - 1] = gMoveDescription_Spite,\n    [MOVE_POWDER_SNOW   - 1] = gMoveDescription_PowderSnow,\n    [MOVE_PROTECT       - 1] = gMoveDescription_Protect,\n    [MOVE_MACH_PUNCH    - 1] = gMoveDescription_MachPunch,\n    [MOVE_SCARY_FACE    - 1] = gMoveDescription_ScaryFace,\n    [MOVE_FAINT_ATTACK  - 1] = gMoveDescription_FaintAttack,\n    [MOVE_SWEET_KISS    - 1] = gMoveDescription_SweetKiss,\n    [MOVE_BELLY_DRUM    - 1] = gMoveDescription_BellyDrum,\n    [MOVE_SLUDGE_BOMB   - 1] = gMoveDescription_SludgeBomb,\n    [MOVE_MUD_SLAP      - 1] = gMoveDescription_MudSlap,\n    [MOVE_OCTAZOOKA     - 1] = gMoveDescription_Octazooka,\n    [MOVE_SPIKES        - 1] = gMoveDescription_Spikes,\n    [MOVE_ZAP_CANNON    - 1] = gMoveDescription_ZapCannon,\n    [MOVE_FORESIGHT     - 1] = gMoveDescription_Foresight,\n    [MOVE_DESTINY_BOND  - 1] = gMoveDescription_DestinyBond,\n    [MOVE_PERISH_SONG   - 1] = gMoveDescription_PerishSong,\n    [MOVE_ICY_WIND      - 1] = gMoveDescription_IcyWind,\n    [MOVE_DETECT        - 1] = gMoveDescription_Detect,\n    [MOVE_BONE_RUSH     - 1] = gMoveDescription_BoneRush,\n    [MOVE_LOCK_ON       - 1] = gMoveDescription_LockOn,\n    [MOVE_OUTRAGE       - 1] = gMoveDescription_Outrage,\n    [MOVE_SANDSTORM     - 1] = gMoveDescription_Sandstorm,\n    [MOVE_GIGA_DRAIN    - 1] = gMoveDescription_GigaDrain,\n    [MOVE_ENDURE        - 1] = gMoveDescription_Endure,\n    [MOVE_CHARM         - 1] = gMoveDescription_Charm,\n    [MOVE_ROLLOUT       - 1] = gMoveDescription_Rollout,\n    [MOVE_FALSE_SWIPE   - 1] = gMoveDescription_FalseSwipe,\n    [MOVE_SWAGGER       - 1] = gMoveDescription_Swagger,\n    [MOVE_MILK_DRINK    - 1] = gMoveDescription_MilkDrink,\n    [MOVE_SPARK         - 1] = gMoveDescription_Spark,\n    [MOVE_FURY_CUTTER   - 1] = gMoveDescription_FuryCutter,\n    [MOVE_STEEL_WING    - 1] = gMoveDescription_SteelWing,\n    [MOVE_MEAN_LOOK     - 1] = gMoveDescription_MeanLook,\n    [MOVE_ATTRACT       - 1] = gMoveDescription_Attract,\n    [MOVE_SLEEP_TALK    - 1] = gMoveDescription_SleepTalk,\n    [MOVE_HEAL_BELL     - 1] = gMoveDescription_HealBell,\n    [MOVE_RETURN        - 1] = gMoveDescription_Return,\n    [MOVE_PRESENT       - 1] = gMoveDescription_Present,\n    [MOVE_FRUSTRATION   - 1] = gMoveDescription_Frustration,\n    [MOVE_SAFEGUARD     - 1] = gMoveDescription_Safeguard,\n    [MOVE_PAIN_SPLIT    - 1] = gMoveDescription_PainSplit,\n    [MOVE_SACRED_FIRE   - 1] = gMoveDescription_SacredFire,\n    [MOVE_MAGNITUDE     - 1] = gMoveDescription_Magnitude,\n    [MOVE_DYNAMIC_PUNCH - 1] = gMoveDescription_DynamicPunch,\n    [MOVE_MEGAHORN      - 1] = gMoveDescription_Megahorn,\n    [MOVE_DRAGON_BREATH - 1] = gMoveDescription_DragonBreath,\n    [MOVE_BATON_PASS    - 1] = gMoveDescription_BatonPass,\n    [MOVE_ENCORE        - 1] = gMoveDescription_Encore,\n    [MOVE_PURSUIT       - 1] = gMoveDescription_Pursuit,\n    [MOVE_RAPID_SPIN    - 1] = gMoveDescription_RapidSpin,\n    [MOVE_SWEET_SCENT   - 1] = gMoveDescription_SweetScent,\n    [MOVE_IRON_TAIL     - 1] = gMoveDescription_IronTail,\n    [MOVE_METAL_CLAW    - 1] = gMoveDescription_MetalClaw,\n    [MOVE_VITAL_THROW   - 1] = gMoveDescription_VitalThrow,\n    [MOVE_MORNING_SUN   - 1] = gMoveDescription_MorningSun,\n    [MOVE_SYNTHESIS     - 1] = gMoveDescription_Synthesis,\n    [MOVE_MOONLIGHT     - 1] = gMoveDescription_Moonlight,\n    [MOVE_HIDDEN_POWER  - 1] = gMoveDescription_HiddenPower,\n    [MOVE_CROSS_CHOP    - 1] = gMoveDescription_CrossChop,\n    [MOVE_TWISTER       - 1] = gMoveDescription_Twister,\n    [MOVE_RAIN_DANCE    - 1] = gMoveDescription_RainDance,\n    [MOVE_SUNNY_DAY     - 1] = gMoveDescription_SunnyDay,\n    [MOVE_CRUNCH        - 1] = gMoveDescription_Crunch,\n    [MOVE_MIRROR_COAT   - 1] = gMoveDescription_MirrorCoat,\n    [MOVE_PSYCH_UP      - 1] = gMoveDescription_PsychUp,\n    [MOVE_EXTREME_SPEED - 1] = gMoveDescription_ExtremeSpeed,\n    [MOVE_ANCIENT_POWER - 1] = gMoveDescription_AncientPower,\n    [MOVE_SHADOW_BALL   - 1] = gMoveDescription_ShadowBall,\n    [MOVE_FUTURE_SIGHT  - 1] = gMoveDescription_FutureSight,\n    [MOVE_ROCK_SMASH    - 1] = gMoveDescription_RockSmash,\n    [MOVE_WHIRLPOOL     - 1] = gMoveDescription_Whirlpool,\n    [MOVE_BEAT_UP       - 1] = gMoveDescription_BeatUp,\n    [MOVE_FAKE_OUT      - 1] = gMoveDescription_FakeOut,\n    [MOVE_UPROAR        - 1] = gMoveDescription_Uproar,\n    [MOVE_STOCKPILE     - 1] = gMoveDescription_Stockpile,\n    [MOVE_SPIT_UP       - 1] = gMoveDescription_SpitUp,\n    [MOVE_SWALLOW       - 1] = gMoveDescription_Swallow,\n    [MOVE_HEAT_WAVE     - 1] = gMoveDescription_HeatWave,\n    [MOVE_HAIL          - 1] = gMoveDescription_Hail,\n    [MOVE_TORMENT       - 1] = gMoveDescription_Torment,\n    [MOVE_FLATTER       - 1] = gMoveDescription_Flatter,\n    [MOVE_WILL_O_WISP   - 1] = gMoveDescription_WillOWisp,\n    [MOVE_MEMENTO       - 1] = gMoveDescription_Memento,\n    [MOVE_FACADE        - 1] = gMoveDescription_Facade,\n    [MOVE_FOCUS_PUNCH   - 1] = gMoveDescription_FocusPunch,\n    [MOVE_SMELLING_SALT - 1] = gMoveDescription_SmellingSalt,\n    [MOVE_FOLLOW_ME     - 1] = gMoveDescription_FollowMe,\n    [MOVE_NATURE_POWER  - 1] = gMoveDescription_NaturePower,\n    [MOVE_CHARGE        - 1] = gMoveDescription_Charge,\n    [MOVE_TAUNT         - 1] = gMoveDescription_Taunt,\n    [MOVE_HELPING_HAND  - 1] = gMoveDescription_HelpingHand,\n    [MOVE_TRICK         - 1] = gMoveDescription_Trick,\n    [MOVE_ROLE_PLAY     - 1] = gMoveDescription_RolePlay,\n    [MOVE_WISH          - 1] = gMoveDescription_Wish,\n    [MOVE_ASSIST        - 1] = gMoveDescription_Assist,\n    [MOVE_INGRAIN       - 1] = gMoveDescription_Ingrain,\n    [MOVE_SUPERPOWER    - 1] = gMoveDescription_Superpower,\n    [MOVE_MAGIC_COAT    - 1] = gMoveDescription_MagicCoat,\n    [MOVE_RECYCLE       - 1] = gMoveDescription_Recycle,\n    [MOVE_REVENGE       - 1] = gMoveDescription_Revenge,\n    [MOVE_BRICK_BREAK   - 1] = gMoveDescription_BrickBreak,\n    [MOVE_YAWN          - 1] = gMoveDescription_Yawn,\n    [MOVE_KNOCK_OFF     - 1] = gMoveDescription_KnockOff,\n    [MOVE_ENDEAVOR      - 1] = gMoveDescription_Endeavor,\n    [MOVE_ERUPTION      - 1] = gMoveDescription_Eruption,\n    [MOVE_SKILL_SWAP    - 1] = gMoveDescription_SkillSwap,\n    [MOVE_IMPRISON      - 1] = gMoveDescription_Imprison,\n    [MOVE_REFRESH       - 1] = gMoveDescription_Refresh,\n    [MOVE_GRUDGE        - 1] = gMoveDescription_Grudge,\n    [MOVE_SNATCH        - 1] = gMoveDescription_Snatch,\n    [MOVE_SECRET_POWER  - 1] = gMoveDescription_SecretPower,\n    [MOVE_DIVE          - 1] = gMoveDescription_Dive,\n    [MOVE_ARM_THRUST    - 1] = gMoveDescription_ArmThrust,\n    [MOVE_CAMOUFLAGE    - 1] = gMoveDescription_Camouflage,\n    [MOVE_TAIL_GLOW     - 1] = gMoveDescription_TailGlow,\n    [MOVE_LUSTER_PURGE  - 1] = gMoveDescription_LusterPurge,\n    [MOVE_MIST_BALL     - 1] = gMoveDescription_MistBall,\n    [MOVE_FEATHER_DANCE - 1] = gMoveDescription_FeatherDance,\n    [MOVE_TEETER_DANCE  - 1] = gMoveDescription_TeeterDance,\n    [MOVE_BLAZE_KICK    - 1] = gMoveDescription_BlazeKick,\n    [MOVE_MUD_SPORT     - 1] = gMoveDescription_MudSport,\n    [MOVE_ICE_BALL      - 1] = gMoveDescription_IceBall,\n    [MOVE_NEEDLE_ARM    - 1] = gMoveDescription_NeedleArm,\n    [MOVE_SLACK_OFF     - 1] = gMoveDescription_SlackOff,\n    [MOVE_HYPER_VOICE   - 1] = gMoveDescription_HyperVoice,\n    [MOVE_POISON_FANG   - 1] = gMoveDescription_PoisonFang,\n    [MOVE_CRUSH_CLAW    - 1] = gMoveDescription_CrushClaw,\n    [MOVE_BLAST_BURN    - 1] = gMoveDescription_BlastBurn,\n    [MOVE_HYDRO_CANNON  - 1] = gMoveDescription_HydroCannon,\n    [MOVE_METEOR_MASH   - 1] = gMoveDescription_MeteorMash,\n    [MOVE_ASTONISH      - 1] = gMoveDescription_Astonish,\n    [MOVE_WEATHER_BALL  - 1] = gMoveDescription_WeatherBall,\n    [MOVE_AROMATHERAPY  - 1] = gMoveDescription_Aromatherapy,\n    [MOVE_FAKE_TEARS    - 1] = gMoveDescription_FakeTears,\n    [MOVE_AIR_CUTTER    - 1] = gMoveDescription_AirCutter,\n    [MOVE_OVERHEAT      - 1] = gMoveDescription_Overheat,\n    [MOVE_ODOR_SLEUTH   - 1] = gMoveDescription_OdorSleuth,\n    [MOVE_ROCK_TOMB     - 1] = gMoveDescription_RockTomb,\n    [MOVE_SILVER_WIND   - 1] = gMoveDescription_SilverWind,\n    [MOVE_METAL_SOUND   - 1] = gMoveDescription_MetalSound,\n    [MOVE_GRASS_WHISTLE - 1] = gMoveDescription_GrassWhistle,\n    [MOVE_TICKLE        - 1] = gMoveDescription_Tickle,\n    [MOVE_COSMIC_POWER  - 1] = gMoveDescription_CosmicPower,\n    [MOVE_WATER_SPOUT   - 1] = gMoveDescription_WaterSpout,\n    [MOVE_SIGNAL_BEAM   - 1] = gMoveDescription_SignalBeam,\n    [MOVE_SHADOW_PUNCH  - 1] = gMoveDescription_ShadowPunch,\n    [MOVE_EXTRASENSORY  - 1] = gMoveDescription_Extrasensory,\n    [MOVE_SKY_UPPERCUT  - 1] = gMoveDescription_SkyUppercut,\n    [MOVE_SAND_TOMB     - 1] = gMoveDescription_SandTomb,\n    [MOVE_SHEER_COLD    - 1] = gMoveDescription_SheerCold,\n    [MOVE_MUDDY_WATER   - 1] = gMoveDescription_MuddyWater,\n    [MOVE_BULLET_SEED   - 1] = gMoveDescription_BulletSeed,\n    [MOVE_AERIAL_ACE    - 1] = gMoveDescription_AerialAce,\n    [MOVE_ICICLE_SPEAR  - 1] = gMoveDescription_IcicleSpear,\n    [MOVE_IRON_DEFENSE  - 1] = gMoveDescription_IronDefense,\n    [MOVE_BLOCK         - 1] = gMoveDescription_Block,\n    [MOVE_HOWL          - 1] = gMoveDescription_Howl,\n    [MOVE_DRAGON_CLAW   - 1] = gMoveDescription_DragonClaw,\n    [MOVE_FRENZY_PLANT  - 1] = gMoveDescription_FrenzyPlant,\n    [MOVE_BULK_UP       - 1] = gMoveDescription_BulkUp,\n    [MOVE_BOUNCE        - 1] = gMoveDescription_Bounce,\n    [MOVE_MUD_SHOT      - 1] = gMoveDescription_MudShot,\n    [MOVE_POISON_TAIL   - 1] = gMoveDescription_PoisonTail,\n    [MOVE_COVET         - 1] = gMoveDescription_Covet,\n    [MOVE_VOLT_TACKLE   - 1] = gMoveDescription_VoltTackle,\n    [MOVE_MAGICAL_LEAF  - 1] = gMoveDescription_MagicalLeaf,\n    [MOVE_WATER_SPORT   - 1] = gMoveDescription_WaterSport,\n    [MOVE_CALM_MIND     - 1] = gMoveDescription_CalmMind,\n    [MOVE_LEAF_BLADE    - 1] = gMoveDescription_LeafBlade,\n    [MOVE_DRAGON_DANCE  - 1] = gMoveDescription_DragonDance,\n    [MOVE_ROCK_BLAST    - 1] = gMoveDescription_RockBlast,\n    [MOVE_SHOCK_WAVE    - 1] = gMoveDescription_ShockWave,\n    [MOVE_WATER_PULSE   - 1] = gMoveDescription_WaterPulse,\n    [MOVE_DOOM_DESIRE   - 1] = gMoveDescription_DoomDesire,\n    [MOVE_PSYCHO_BOOST  - 1] = gMoveDescription_PsychoBoost,\n};\n"
  },
  {
    "path": "src/multiboot.c",
    "content": "#include \"global.h\"\n#include \"multiboot.h\"\n\nstatic u16 MultiBoot_required_data[MULTIBOOT_NCHILD];\n\nstatic int MultiBootSend(struct MultiBootParam *mp, u16 data);\nstatic int MultiBootHandShake(struct MultiBootParam *mp);\nstatic void MultiBootWaitCycles(u32 cycles);\nstatic void MultiBootWaitSendDone(void);\n\nvoid MultiBootInit(struct MultiBootParam *mp)\n{\n    mp->client_bit = 0;\n    mp->probe_count = 0;\n    mp->response_bit = 0;\n    mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT;\n    mp->sendflag = 0;\n    mp->handshake_timeout = 0;\n    REG_RCNT = 0;\n    REG_SIOCNT = SIO_MULTI_MODE | SIO_115200_BPS;\n    REG_SIODATA8 = 0;\n}\n\nint MultiBootMain(struct MultiBootParam *mp)\n{\n    int i, j, k;\n\n    if (MultiBootCheckComplete(mp))\n    {\n        return 0;\n    }\n    if (mp->check_wait > MULTIBOOT_CONNECTION_CHECK_WAIT)\n    {\n        mp->check_wait--;\n        return 0;\n    }\noutput_burst:\n    if (mp->sendflag)\n    {\n        mp->sendflag = 0;\n\n        i = REG_SIOCNT & (SIO_MULTI_BUSY | SIO_ERROR | SIO_ID | SIO_MULTI_SD | SIO_MULTI_SI);\n        if (i != SIO_MULTI_SD)\n        {\n            MultiBootInit(mp);\n            return i ^ SIO_MULTI_SD;\n        }\n    }\n    if (mp->probe_count >= 0xe0)\n    {\n        i = MultiBootHandShake(mp);\n        if (i)\n        {\n            return i;\n        }\n\n        if (mp->server_type == MULTIBOOT_SERVER_TYPE_QUICK\n         && mp->probe_count > 0xe1\n         && MultiBootCheckComplete(mp) == 0)\n        {\n            MultiBootWaitSendDone();\n            goto output_burst;\n        }\n\n        if (MultiBootCheckComplete(mp) == 0)\n        {\n            if (mp->handshake_timeout == 0)\n            {\n                MultiBootInit(mp);\n                return MULTIBOOT_ERROR_HANDSHAKE_FAILURE;\n            }\n            mp->handshake_timeout--;\n        }\n\n        return 0;\n    }\n    switch (mp->probe_count)\n    {\n    case 0:\n        k = 0x0e;\n        for (i = MULTIBOOT_NCHILD; i != 0; i--)\n        {\n            if (*(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2) != 0xffff)\n            {\n                break;\n            }\n            k >>= 1;\n        }\n        k &= 0x0e;\n        mp->response_bit = k;\n        for (i = MULTIBOOT_NCHILD; i != 0; i--)\n        {\n            j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);\n            if (mp->client_bit & (1 << i))\n            {\n                if (j != ((MULTIBOOT_CLIENT_INFO << 8) | (1 << i)))\n                {\n                    k = 0;\n                    break;\n                }\n            }\n        }\n        mp->client_bit &= k;\n        if (k == 0)\n        {\n            mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT;\n        }\n\n        if (mp->check_wait)\n        {\n            mp->check_wait--;\n        }\n        else\n        {\n            if (mp->response_bit != mp->client_bit)\n            {\n                MultiBootStartProbe(mp);\n                goto case_1;\n            }\n        }\n    output_master_info:\n        return MultiBootSend(mp, (MULTIBOOT_MASTER_INFO << 8) | mp->client_bit);\n    case_1:\n    case 1:\n        mp->probe_target_bit = 0;\n        for (i = MULTIBOOT_NCHILD; i != 0; i--)\n        {\n            j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);\n            if ((j >> 8) == MULTIBOOT_CLIENT_INFO)\n            {\n                MultiBoot_required_data[i - 1] = j;\n                j &= 0xff;\n                if (j == (1 << i))\n                {\n                    mp->probe_target_bit |= j;\n                }\n            }\n        }\n        if (mp->response_bit != mp->probe_target_bit)\n        {\n            goto output_master_info;\n        }\n        mp->probe_count = 2;\n        return MultiBootSend(mp, (MULTIBOOT_MASTER_START_PROBE << 8) | mp->probe_target_bit);\n    case 2:\n        for (i = MULTIBOOT_NCHILD; i != 0; i--)\n        {\n            if (mp->probe_target_bit & (1 << i))\n            {\n                j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);\n                if (j != MultiBoot_required_data[i - 1])\n                {\n                    mp->probe_target_bit ^= 1 << i;\n                }\n            }\n        }\n        goto output_header;\n    case 0xd0:\n        k = 1;\n        for (i = MULTIBOOT_NCHILD; i != 0; i--)\n        {\n            j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);\n            mp->client_data[i - 1] = j;\n            if (mp->probe_target_bit & (1 << i))\n            {\n                if ((j >> 8) != MULTIBOOT_CLIENT_INFO\n                 && (j >> 8) != MULTIBOOT_CLIENT_DLREADY)\n                {\n                    MultiBootInit(mp);\n                    return MULTIBOOT_ERROR_NO_DLREADY;\n                }\n                if (j == MultiBoot_required_data[i - 1])\n                {\n                    k = 0;\n                }\n            }\n        }\n        if (k == 0)\n        {\n            return MultiBootSend(mp, (MULTIBOOT_MASTER_REQUEST_DLREADY << 8) | mp->palette_data);\n        }\n        mp->probe_count = 0xd1;\n        k = 0x11;\n        for (i = MULTIBOOT_NCHILD; i != 0; i--)\n        {\n            k += mp->client_data[i - 1];\n        }\n        mp->handshake_data = k;\n        return MultiBootSend(mp, (MULTIBOOT_MASTER_START_DL << 8) | (k & 0xff));\n    case 0xd1:\n        for (i = MULTIBOOT_NCHILD; i != 0; i--)\n        {\n            j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);\n            if (mp->probe_target_bit & (1 << i))\n            {\n                if ((j >> 8) != MULTIBOOT_CLIENT_DLREADY)\n                {\n                    MultiBootInit(mp);\n                    return MULTIBOOT_ERROR_NO_DLREADY;\n                }\n            }\n        }\n        i = MultiBoot(mp);\n        if (i == 0)\n        {\n            mp->probe_count = 0xe0;\n            mp->handshake_timeout = MULTIBOOT_HANDSHAKE_TIMEOUT;\n            return 0;\n        }\n        MultiBootInit(mp);\n        mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT * 2;\n        return MULTIBOOT_ERROR_BOOT_FAILURE;\n    default:\n        for (i = MULTIBOOT_NCHILD; i != 0; i--)\n        {\n            if (mp->probe_target_bit & (1 << i))\n            {\n                j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);\n                if ((j >> 8) != (MULTIBOOT_MASTER_START_PROBE + 1 - (mp->probe_count >> 1))\n                 || ((j & 0xff) != (1 << i)))\n                {\n                    mp->probe_target_bit ^= 1 << i;\n                }\n            }\n        }\n        if (mp->probe_count == 0xc4)\n        {\n            mp->client_bit = mp->probe_target_bit & 0x0e;\n            mp->probe_count = 0;\n            goto output_master_info;\n        }\n    output_header:\n        if (mp->probe_target_bit == 0)\n        {\n            MultiBootInit(mp);\n            return MULTIBOOT_ERROR_NO_PROBE_TARGET;\n        }\n        mp->probe_count += 2;\n        if (mp->probe_count == 0xc4)\n        {\n            goto output_master_info;\n        }\n        i = MultiBootSend(mp,\n            (mp->masterp[mp->probe_count - 4 + 1] << 8)\n            | mp->masterp[mp->probe_count - 4]);\n        if (i)\n        {\n            return i;\n        }\n        if (mp->server_type == MULTIBOOT_SERVER_TYPE_QUICK)\n        {\n            MultiBootWaitSendDone();\n            goto output_burst;\n        }\n        return 0;\n    }\n}\n\nstatic int MultiBootSend(struct MultiBootParam *mp, u16 data)\n{\n    int i = REG_SIOCNT & (SIO_MULTI_BUSY | SIO_MULTI_SD | SIO_MULTI_SI);\n    if (i != SIO_MULTI_SD)\n    {\n        MultiBootInit(mp);\n        return i ^ SIO_MULTI_SD;\n    }\n    REG_SIODATA8 = data;\n    REG_SIOCNT = SIO_MULTI_MODE | SIO_START | SIO_115200_BPS;\n    mp->sendflag = 1;\n    return 0;\n}\n\nvoid MultiBootStartProbe(struct MultiBootParam *mp)\n{\n    if (mp->probe_count != 0)\n    {\n        MultiBootInit(mp);\n        return;\n    }\n    mp->check_wait = 0;\n    mp->client_bit = 0;\n    mp->probe_count = 1;\n}\n\nvoid MultiBootStartMaster(struct MultiBootParam *mp, const u8 *srcp, int length, u8 palette_color, s8 palette_speed)\n{\n    int i = 0;\n\n    if (mp->probe_count != 0\n     || mp->client_bit == 0\n     || mp->check_wait != 0)\n    {\n        MultiBootInit(mp);\n        return;\n    }\n    mp->boot_srcp = srcp;\n    length = (length + 15) & ~15;\n    if (length < MULTIBOOT_SEND_SIZE_MIN || length > MULTIBOOT_SEND_SIZE_MAX)\n    {\n        MultiBootInit(mp);\n        return;\n    }\n    mp->boot_endp = srcp + length;\n    switch (palette_speed)\n    {\n    case -4:\n    case -3:\n    case -2:\n    case -1:\n        i = (palette_color << 3) | (3 - palette_speed);\n        break;\n    case 0:\n        i = 0x38 | palette_color;\n        break;\n    case 1:\n    case 2:\n    case 3:\n    case 4:\n        i = (palette_color << 3) | (palette_speed - 1);\n        break;\n    }\n    mp->palette_data = ((i & 0x3f) << 1) | 0x81;\n    mp->probe_count = 0xd0;\n}\n\nbool32 MultiBootCheckComplete(struct MultiBootParam *mp)\n{\n    if (mp->probe_count == 0xe9)\n        return 1;\n    else\n        return 0;\n}\n\nstatic int MultiBootHandShake(struct MultiBootParam *mp)\n{\n    int i, j;\n\n#define send_data (mp->system_work[0])\n#define must_data (mp->system_work[1])\n    switch (mp->probe_count)\n    {\n    case_0xe0:\n    case 0xe0:\n        mp->probe_count = 0xe1;\n        must_data = 0x0000;\n        send_data = 0x100000;\n        return MultiBootSend(mp, 0x0000);\n    default:\n        for (i = MULTIBOOT_NCHILD; i != 0; i--)\n        {\n            j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);\n            if ((mp->client_bit & (1 << i))\n                && j != must_data)\n            {\n                goto case_0xe0;\n            }\n        }\n        mp->probe_count++;\n        must_data = send_data & 0xffff;\n        if (send_data == 0x0000)\n        {\n            must_data = mp->masterp[0xac] | (mp->masterp[0xad] << 8);\n            send_data = must_data << 5;\n        }\n        send_data >>= 5;\n    output_common:\n        return MultiBootSend(mp, send_data);\n    case 0xe7:\n    case 0xe8:\n        for (i = MULTIBOOT_NCHILD; i != 0; i--)\n        {\n            j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);\n            if ((mp->client_bit & (1 << i)) && j != must_data)\n            {\n                MultiBootInit(mp);\n                return MULTIBOOT_ERROR_HANDSHAKE_FAILURE;\n            }\n        }\n\n        mp->probe_count++;\n        if (mp->probe_count == 0xe9)\n        {\n            return 0;\n        }\n        send_data = mp->masterp[0xae] | (mp->masterp[0xaf] << 8);\n        must_data = send_data;\n        goto output_common;\n    }\n#undef send_data\n#undef must_data\n}\n\nstatic NOINLINE void MultiBootWaitCycles(u32 cycles)\n{\n    asm(\"mov r2, pc\");\n    asm(\"lsr r2, #24\");\n    asm(\"mov r1, #12\");\n    asm(\"cmp r2, #0x02\");\n    asm(\"beq MultiBootWaitCyclesLoop\");\n    asm(\"mov r1, #13\");\n    asm(\"cmp r2, #0x08\");\n    asm(\"beq MultiBootWaitCyclesLoop\");\n    asm(\"mov r1, #4\");\n\n    asm(\"MultiBootWaitCyclesLoop:\");\n    asm(\"sub r0, r1\");\n    asm(\"bgt MultiBootWaitCyclesLoop\");\n}\n\nstatic void MultiBootWaitSendDone(void)\n{\n    int i;\n\n    for (i = 0; (i < 31069) && (REG_SIOCNT & SIO_START); i++);\n    MultiBootWaitCycles(600);\n}\n"
  },
  {
    "path": "src/mystery_event_msg.c",
    "content": "#include \"global.h\"\n\nconst u8 gText_MysteryGiftBerry[] = _(\"Obtained a {STR_VAR_2} BERRY!\\nDad has it at PETALBURG GYM.\");\nconst u8 gText_MysteryGiftBerryTransform[] = _(\"The {STR_VAR_1} BERRY transformed into\\none {STR_VAR_2} BERRY.\");\nconst u8 gText_MysteryGiftBerryObtained[] = _(\"The {STR_VAR_1} BERRY has already been\\nobtained.\");\nconst u8 gText_MysteryGiftSpecialRibbon[] = _(\"A special RIBBON was awarded to\\nyour party POKéMON.\");\nconst u8 gText_MysteryGiftNationalDex[] = _(\"The POKéDEX has been upgraded\\nwith the NATIONAL MODE.\");\nconst u8 gText_MysteryGiftRareWord[] = _(\"A rare word has been added.\");\nconst u8 gText_MysteryGiftSentOver[] = _(\"{STR_VAR_1} was sent over!\");\nconst u8 gText_MysteryGiftFullParty[] = _(\"Your party is full.\\n{STR_VAR_1} could not be sent over.\");\nconst u8 gText_MysteryGiftNewTrainer[] = _(\"A new TRAINER has arrived in\\nHOENN.\");\nconst u8 gText_MysteryGiftCantBeUsed[] = _(\"This data can't be used in\\nthis version.\");\n"
  },
  {
    "path": "src/mystery_event_script.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"berry.h\"\n#include \"battle_tower.h\"\n#include \"easy_chat.h\"\n#include \"event_data.h\"\n#include \"mail_data.h\"\n#include \"mystery_event_script.h\"\n#include \"pokedex.h\"\n#include \"pokemon_size_record.h\"\n#include \"script.h\"\n#include \"strings.h\"\n#include \"util.h\"\n#include \"mystery_event_msg.h\"\n#include \"pokemon_storage_system.h\"\n\nextern ScrCmdFunc gMysteryEventScriptCmdTable[];\nextern ScrCmdFunc gMysteryEventScriptCmdTableEnd[];\n\n#define LANGUAGE_MASK 0x1\n#define VERSION_MASK 0x1\n\nEWRAM_DATA static struct ScriptContext sMysteryEventScriptContext = {0};\n\nstatic bool32 CheckCompatibility(u16 a1, u32 a2, u16 a3, u32 a4)\n{\n    if (!(a1 & LANGUAGE_MASK))\n        return FALSE;\n\n    if (!(a2 & LANGUAGE_MASK))\n        return FALSE;\n\n    if (!(a3 & 0x1))\n        return FALSE;\n\n    if (!(a4 & VERSION_MASK))\n        return FALSE;\n\n    return TRUE;\n}\n\nstatic void SetIncompatible(void)\n{\n    StringExpandPlaceholders(gStringVar4, gText_MysteryGiftCantBeUsed);\n    SetMysteryEventScriptStatus(3);\n}\n\nstatic void InitMysteryEventScript(struct ScriptContext *ctx, u8 *script)\n{\n    InitScriptContext(ctx, gMysteryEventScriptCmdTable, gMysteryEventScriptCmdTableEnd);\n    SetupBytecodeScript(ctx, script);\n    ctx->data[0] = (u32)script;\n    ctx->data[1] = 0;\n    ctx->data[2] = 0;\n    ctx->data[3] = 0;\n}\n\nstatic bool32 RunMysteryEventScriptCommand(struct ScriptContext *ctx)\n{\n    if (RunScriptCommand(ctx) && ctx->data[3])\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid MEventScript_InitContext(u8 *script)\n{\n    InitMysteryEventScript(&sMysteryEventScriptContext, script);\n}\n\nbool32 MEventScript_Run(u32 *a0)\n{\n    bool32 ret = RunMysteryEventScriptCommand(&sMysteryEventScriptContext);\n    *a0 = sMysteryEventScriptContext.data[2];\n\n    return ret;\n}\n\nu32 RunMysteryEventScript(u8 *script)\n{\n    u32 ret;\n    MEventScript_InitContext(script);\n    while (MEventScript_Run(&ret));\n\n    return ret;\n}\n\nvoid SetMysteryEventScriptStatus(u32 val)\n{\n    sMysteryEventScriptContext.data[2] = val;\n}\n\nbool8 MEScrCmd_end(struct ScriptContext *ctx)\n{\n    StopScript(ctx);\n    return TRUE;\n}\n\nbool8 MEScrCmd_checkcompat(struct ScriptContext *ctx)\n{\n    u16 v1;\n    u32 v2;\n    u16 v3;\n    u32 v4;\n\n    ctx->data[1] = ScriptReadWord(ctx);\n    v1 = ScriptReadHalfword(ctx);\n    v2 = ScriptReadWord(ctx);\n    v3 = ScriptReadHalfword(ctx);\n    v4 = ScriptReadWord(ctx);\n\n    if (CheckCompatibility(v1, v2, v3, v4) == TRUE)\n        ctx->data[3] = 1;\n    else\n        SetIncompatible();\n\n    return TRUE;\n}\n\nbool8 MEScrCmd_nop(struct ScriptContext *ctx)\n{\n    return FALSE;\n}\n\nbool8 MEScrCmd_setstatus(struct ScriptContext *ctx)\n{\n    u8 value = ScriptReadByte(ctx);\n    ctx->data[2] = value;\n    return FALSE;\n}\n\nbool8 MEScrCmd_setmsg(struct ScriptContext *ctx)\n{\n    u8 value = ScriptReadByte(ctx);\n    u8 *str = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);\n    if (value == 0xFF || value == ctx->data[2])\n        StringExpandPlaceholders(gStringVar4, str);\n    return FALSE;\n}\n\nbool8 MEScrCmd_runscript(struct ScriptContext *ctx)\n{\n    u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);\n    RunScriptImmediately(script);\n    return FALSE;\n}\n\nbool8 MEScrCmd_setenigmaberry(struct ScriptContext *ctx)\n{\n    u8 *str;\n    const u8 *message;\n    bool32 haveBerry = IsEnigmaBerryValid();\n    u8 *berry = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);\n    StringCopyN(gStringVar1, gSaveBlock1Ptr->enigmaBerry.berry.name, BERRY_NAME_LENGTH + 1);\n    SetEnigmaBerry(berry);\n    StringCopyN(gStringVar2, gSaveBlock1Ptr->enigmaBerry.berry.name, BERRY_NAME_LENGTH + 1);\n\n    if (!haveBerry)\n    {\n        str = gStringVar4;\n        message = gText_MysteryGiftBerry;\n    }\n    else if (StringCompare(gStringVar1, gStringVar2))\n    {\n        str = gStringVar4;\n        message = gText_MysteryGiftBerryTransform;\n    }\n    else\n    {\n        str = gStringVar4;\n        message = gText_MysteryGiftBerryObtained;\n    }\n\n    StringExpandPlaceholders(str, message);\n\n    ctx->data[2] = 2;\n\n    if (IsEnigmaBerryValid() == TRUE)\n        VarSet(VAR_ENIGMA_BERRY_AVAILABLE, 1);\n    else\n        ctx->data[2] = 1;\n\n    return FALSE;\n}\n\nbool8 MEScrCmd_giveribbon(struct ScriptContext *ctx)\n{\n    u8 index = ScriptReadByte(ctx);\n    u8 ribbonId = ScriptReadByte(ctx);\n    GiveGiftRibbonToParty(index, ribbonId);\n    StringExpandPlaceholders(gStringVar4, gText_MysteryGiftSpecialRibbon);\n    ctx->data[2] = 2;\n    return FALSE;\n}\n\nbool8 MEScrCmd_initramscript(struct ScriptContext *ctx)\n{\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u8 objectId = ScriptReadByte(ctx);\n    u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);\n    u8 *scriptEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);\n    InitRamScript(script, scriptEnd - script, mapGroup, mapNum, objectId);\n    return FALSE;\n}\n\nbool8 MEScrCmd_givenationaldex(struct ScriptContext *ctx)\n{\n    EnableNationalPokedex();\n    StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNationalDex);\n    ctx->data[2] = 2;\n    return FALSE;\n}\n\nbool8 MEScrCmd_addrareword(struct ScriptContext *ctx)\n{\n    EnableRareWord(ScriptReadByte(ctx));\n    StringExpandPlaceholders(gStringVar4, gText_MysteryGiftRareWord);\n    ctx->data[2] = 2;\n    return FALSE;\n}\n\nbool8 MEScrCmd_setrecordmixinggift(struct ScriptContext *ctx)\n{\n    SetIncompatible();\n    ctx->data[3] = 0;\n    return TRUE;\n}\n\nbool8 MEScrCmd_givepokemon(struct ScriptContext *ctx)\n{\n    struct Mail mail;\n    struct Pokemon pokemon;\n    u16 species;\n    u16 heldItem;\n    u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0];\n    void *pokemonPtr = (void *)data;\n    void *mailPtr = (void *)(data + sizeof(struct Pokemon));\n\n    pokemon = *(struct Pokemon *)pokemonPtr;\n    species = GetMonData(&pokemon, MON_DATA_SPECIES_OR_EGG);\n\n    if (species == SPECIES_EGG)\n        StringCopyN(gStringVar1, gText_EggNickname, POKEMON_NAME_LENGTH + 1);\n    else\n        StringCopyN(gStringVar1, gText_MenuPokemon, POKEMON_NAME_LENGTH + 1);\n\n    if (gPlayerPartyCount == PARTY_SIZE)\n    {\n        StringExpandPlaceholders(gStringVar4, gText_MysteryGiftFullParty);\n        ctx->data[2] = 3;\n    }\n    else\n    {\n        memcpy(&gPlayerParty[5], pokemonPtr, sizeof(struct Pokemon));\n        memcpy(&mail, mailPtr, sizeof(struct Mail));\n\n        if (species != SPECIES_EGG)\n        {\n            u16 pokedexNum = SpeciesToNationalPokedexNum(species);\n            GetSetPokedexFlag(pokedexNum, FLAG_SET_SEEN);\n            GetSetPokedexFlag(pokedexNum, FLAG_SET_CAUGHT);\n        }\n\n        heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM);\n        if (ItemIsMail(heldItem))\n            GiveMailToMon2(&gPlayerParty[5], &mail);\n        CompactPartySlots();\n        CalculatePlayerPartyCount();\n        StringExpandPlaceholders(gStringVar4, gText_MysteryGiftSentOver);\n        ctx->data[2] = 2;\n    }\n\n    return FALSE;\n}\n\nbool8 MEScrCmd_addtrainer(struct ScriptContext *ctx)\n{\n    u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0];\n    memcpy(&gSaveBlock2Ptr->battleTower.ereaderTrainer, (void *)data, sizeof(struct BattleTowerEReaderTrainer));\n    ValidateEReaderTrainer();\n    StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNewTrainer);\n    ctx->data[2] = 2;\n    return FALSE;\n}\n\nbool8 MEScrCmd_enableresetrtc(struct ScriptContext *ctx)\n{\n    SetIncompatible();\n    ctx->data[3] = 0;\n    return TRUE;\n}\n\nbool8 MEScrCmd_checksum(struct ScriptContext *ctx)\n{\n    int checksum = ScriptReadWord(ctx);\n    u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);\n    u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);\n    if (checksum != CalcByteArraySum(data, dataEnd - data))\n    {\n        ctx->data[3] = 0;\n        ctx->data[2] = 1;\n    }\n    return TRUE;\n}\n\nbool8 MEScrCmd_crc(struct ScriptContext *ctx)\n{\n    int crc = ScriptReadWord(ctx);\n    u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);\n    u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);\n    if (crc != CalcCRC16(data, dataEnd - data))\n    {\n        ctx->data[3] = 0;\n        ctx->data[2] = 1;\n    }\n    return TRUE;\n}\n"
  },
  {
    "path": "src/mystery_gift.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"constants/songs.h\"\n#include \"easy_chat.h\"\n#include \"task.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"util.h\"\n#include \"script.h\"\n#include \"event_data.h\"\n#include \"battle_tower.h\"\n#include \"new_game.h\"\n#include \"wonder_news.h\"\n#include \"mystery_gift_menu.h\"\n#include \"help_system.h\"\n#include \"mystery_gift.h\"\n#include \"strings.h\"\n\n#define CALC_CRC(data) CalcCRC16WithTable((void *)&(data), sizeof(data))\n\nstatic bool32 ValidateWonderNews(const struct WonderNews * src);\nstatic void ClearSavedWonderNews(void);\nstatic void ClearSavedWonderNewsMetadata(void);\nstatic bool32 ValidateWonderCard(const struct WonderCard * src);\nstatic void ClearSavedWonderCard(void);\nstatic void ClearSavedWonderCardMetadata(void);\nstatic void IncrementCardStatForNewTrainer(u32 eventId, u32 trainerId, u32 *idsList, s32 count);\nstatic void ClearSavedTrainerIds(void);\n\nstatic const u16 sReceivedGiftFlags[] = {\n    FLAG_RECEIVED_AURORA_TICKET,\n    FLAG_RECEIVED_MYSTIC_TICKET,\n    FLAG_RECEIVED_OLD_SEA_MAP, // Not used until Emerald\n    FLAG_WONDER_CARD_UNUSED_1,\n    FLAG_WONDER_CARD_UNUSED_2,\n    FLAG_WONDER_CARD_UNUSED_3,\n    FLAG_WONDER_CARD_UNUSED_4,\n    FLAG_WONDER_CARD_UNUSED_5,\n    FLAG_WONDER_CARD_UNUSED_6,\n    FLAG_WONDER_CARD_UNUSED_7,\n    FLAG_WONDER_CARD_UNUSED_8,\n    FLAG_WONDER_CARD_UNUSED_9,\n    FLAG_WONDER_CARD_UNUSED_10,\n    FLAG_WONDER_CARD_UNUSED_11,\n    FLAG_WONDER_CARD_UNUSED_12,\n    FLAG_WONDER_CARD_UNUSED_13,\n    FLAG_WONDER_CARD_UNUSED_14,\n    FLAG_WONDER_CARD_UNUSED_15,\n    FLAG_WONDER_CARD_UNUSED_16,\n    FLAG_WONDER_CARD_UNUSED_17\n};\n\nstatic EWRAM_DATA bool32 sStatsEnabled = FALSE;\n\nvoid ClearMysteryGift(void)\n{\n    CpuFill32(0, &gSaveBlock1Ptr->mysteryGift, sizeof(gSaveBlock1Ptr->mysteryGift));\n    ClearSavedWonderNewsMetadata();\n    InitQuestionnaireWords();\n}\n\nstruct WonderNews * GetSavedWonderNews(void)\n{\n    return &gSaveBlock1Ptr->mysteryGift.news;\n}\n\nstruct WonderCard * GetSavedWonderCard(void)\n{\n    return &gSaveBlock1Ptr->mysteryGift.card;\n}\n\nstruct WonderCardMetadata * GetSavedWonderCardMetadata(void)\n{\n    return &gSaveBlock1Ptr->mysteryGift.cardMetadata;\n}\n\nstruct WonderNewsMetadata * GetSavedWonderNewsMetadata(void)\n{\n    return &gSaveBlock1Ptr->mysteryGift.newsMetadata;\n}\n\nu16 * GetQuestionnaireWordsPtr(void)\n{\n    return gSaveBlock1Ptr->mysteryGift.questionnaireWords;\n}\n\n// Equivalent to ClearSavedWonderCardAndRelated, but nothing else to clear\nvoid ClearSavedWonderNewsAndRelated(void)\n{\n    ClearSavedWonderNews();\n}\n\nbool32 SaveWonderNews(const struct WonderNews * news)\n{\n    if (!ValidateWonderNews(news))\n        return FALSE;\n\n    ClearSavedWonderNews();\n    gSaveBlock1Ptr->mysteryGift.news = *news;\n    gSaveBlock1Ptr->mysteryGift.newsCrc = CALC_CRC(gSaveBlock1Ptr->mysteryGift.news);\n    return TRUE;\n}\n\nbool32 ValidateSavedWonderNews(void)\n{\n    if (CALC_CRC(gSaveBlock1Ptr->mysteryGift.news) != gSaveBlock1Ptr->mysteryGift.newsCrc)\n        return FALSE;\n    if (!ValidateWonderNews(&gSaveBlock1Ptr->mysteryGift.news))\n        return FALSE;\n    return TRUE;\n}\n\nstatic bool32 ValidateWonderNews(const struct WonderNews * news)\n{\n    if (news->id == 0)\n        return FALSE;\n    return TRUE;\n}\n\nbool32 IsSendingSavedWonderNewsAllowed(void)\n{\n    const struct WonderNews * news = &gSaveBlock1Ptr->mysteryGift.news;\n    if (news->sendType == SEND_TYPE_DISALLOWED)\n        return FALSE;\n    return TRUE;\n}\n\nstatic void ClearSavedWonderNews(void)\n{\n    CpuFill32(0, GetSavedWonderNews(), sizeof(gSaveBlock1Ptr->mysteryGift.news));\n    gSaveBlock1Ptr->mysteryGift.newsCrc = 0;\n}\n\nstatic void ClearSavedWonderNewsMetadata(void)\n{\n    CpuFill32(0, GetSavedWonderNewsMetadata(), sizeof(gSaveBlock1Ptr->mysteryGift.newsMetadata));\n    WonderNews_Reset();\n}\n\nbool32 IsWonderNewsSameAsSaved(const u8 * news)\n{\n    const u8 * savedNews = (const u8 *)&gSaveBlock1Ptr->mysteryGift.news;\n    u32 i;\n    if (!ValidateSavedWonderNews())\n        return FALSE;\n\n    for (i = 0; i < sizeof(gSaveBlock1Ptr->mysteryGift.news); i++)\n    {\n        if (savedNews[i] != news[i])\n            return FALSE;\n    }\n    return TRUE;\n}\n\nvoid ClearSavedWonderCardAndRelated(void)\n{\n    ClearSavedWonderCard();\n    ClearSavedWonderCardMetadata();\n    ClearSavedTrainerIds();\n    ClearRamScript();\n    ClearMysteryGiftFlags();\n    ClearMysteryGiftVars();\n    ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer);\n}\n\nbool32 SaveWonderCard(const struct WonderCard * card)\n{\n    struct WonderCardMetadata * metadata;\n    if (!ValidateWonderCard(card))\n        return FALSE;\n\n    ClearSavedWonderCardAndRelated();\n    memcpy(&gSaveBlock1Ptr->mysteryGift.card, card, sizeof(struct WonderCard));\n    gSaveBlock1Ptr->mysteryGift.cardCrc = CALC_CRC(gSaveBlock1Ptr->mysteryGift.card);\n    metadata = &gSaveBlock1Ptr->mysteryGift.cardMetadata;\n    metadata->iconSpecies = (&gSaveBlock1Ptr->mysteryGift.card)->iconSpecies;\n    return TRUE;\n}\n\nbool32 ValidateSavedWonderCard(void)\n{\n    if (gSaveBlock1Ptr->mysteryGift.cardCrc != CALC_CRC(gSaveBlock1Ptr->mysteryGift.card))\n        return FALSE;\n    if (!ValidateWonderCard(&gSaveBlock1Ptr->mysteryGift.card))\n        return FALSE;\n    if (!ValidateRamScript())\n        return FALSE;\n    return TRUE;\n}\n\nstatic bool32 ValidateWonderCard(const struct WonderCard * card)\n{\n    if (card->flagId == 0)\n        return FALSE;\n    if (card->type >= CARD_TYPE_COUNT)\n        return FALSE;\n    if (!(card->sendType == SEND_TYPE_DISALLOWED\n       || card->sendType == SEND_TYPE_ALLOWED\n       || card->sendType == SEND_TYPE_ALLOWED_ALWAYS))\n        return FALSE;\n    if (card->bgType >= NUM_WONDER_BGS)\n        return FALSE;\n    if (card->maxStamps > MAX_STAMP_CARD_STAMPS)\n        return FALSE;\n    return TRUE;\n}\n\nbool32 IsSendingSavedWonderCardAllowed(void)\n{\n    const struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card;\n    if (card->sendType == SEND_TYPE_DISALLOWED)\n        return FALSE;\n    return TRUE;\n}\n\nstatic void ClearSavedWonderCard(void)\n{\n    CpuFill32(0, &gSaveBlock1Ptr->mysteryGift.card, sizeof(gSaveBlock1Ptr->mysteryGift.card));\n    gSaveBlock1Ptr->mysteryGift.cardCrc = 0;\n}\n\nstatic void ClearSavedWonderCardMetadata(void)\n{\n    CpuFill32(0, GetSavedWonderCardMetadata(), sizeof(gSaveBlock1Ptr->mysteryGift.cardMetadata));\n    gSaveBlock1Ptr->mysteryGift.cardMetadataCrc = 0;\n}\n\nu16 GetWonderCardFlagId(void)\n{\n    if (ValidateSavedWonderCard())\n        return gSaveBlock1Ptr->mysteryGift.card.flagId;\n    return 0;\n}\n\nvoid DisableWonderCardSending(struct WonderCard * card)\n{\n    if (card->sendType == SEND_TYPE_ALLOWED)\n        card->sendType = SEND_TYPE_DISALLOWED;\n}\n\nstatic bool32 IsWonderCardFlagIDInValidRange(u16 flagId)\n{\n    if (flagId >= WONDER_CARD_FLAG_OFFSET && flagId < WONDER_CARD_FLAG_OFFSET + NUM_WONDER_CARD_FLAGS)\n        return TRUE;\n    return FALSE;\n}\n\nbool32 IsSavedWonderCardGiftNotReceived(void)\n{\n    u16 value = GetWonderCardFlagId();\n    if (!IsWonderCardFlagIDInValidRange(value))\n        return FALSE;\n\n    // If flag is set, player has received gift from this card\n    if (FlagGet(sReceivedGiftFlags[value - WONDER_CARD_FLAG_OFFSET]) == TRUE)\n        return FALSE;\n    return TRUE;\n}\n\nstatic s32 GetNumStampsInMetadata(const struct WonderCardMetadata * data, s32 size)\n{\n    s32 numStamps = 0;\n    s32 i;\n    for (i = 0; i < size; i++)\n    {\n        if (data->stampData[STAMP_ID][i] && data->stampData[STAMP_SPECIES][i])\n            numStamps++;\n    }\n    return numStamps;\n}\n\nstatic bool32 IsStampInMetadata(const struct WonderCardMetadata * metadata, const u16 * stamp, s32 maxStamps)\n{\n    s32 i;\n    for (i = 0; i < maxStamps; i++)\n    {\n        if (metadata->stampData[STAMP_ID][i] == stamp[STAMP_ID])\n            return TRUE;\n        if (metadata->stampData[STAMP_SPECIES][i] == stamp[STAMP_SPECIES])\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool32 ValidateStamp(const u16 * stamp)\n{\n    if (stamp[STAMP_ID] == 0)\n        return FALSE;\n    if (stamp[STAMP_SPECIES] == SPECIES_NONE)\n        return FALSE;\n    if (stamp[STAMP_SPECIES] >= NUM_SPECIES)\n        return FALSE;\n    return TRUE;\n}\n\nstatic s32 GetNumStampsInSavedCard(void)\n{\n    struct WonderCard * card;\n    if (!ValidateSavedWonderCard())\n        return 0;\n    card = &gSaveBlock1Ptr->mysteryGift.card;\n    if (card->type != CARD_TYPE_STAMP)\n        return 0;\n    return GetNumStampsInMetadata(&gSaveBlock1Ptr->mysteryGift.cardMetadata, card->maxStamps);\n}\n\nbool32 MysteryGift_TrySaveStamp(const u16 * stamp)\n{\n    struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card;\n    s32 maxStamps = card->maxStamps;\n    s32 i;\n    if (!ValidateStamp(stamp))\n        return FALSE;\n    if (IsStampInMetadata(&gSaveBlock1Ptr->mysteryGift.cardMetadata, stamp, maxStamps))\n        return FALSE;\n    for (i = 0; i < maxStamps; i++)\n    {\n        if (gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[STAMP_ID][i] == 0\n         && gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[STAMP_SPECIES][i] == SPECIES_NONE)\n        {\n            gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[STAMP_ID][i] = stamp[STAMP_ID];\n            gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[STAMP_SPECIES][i] = stamp[STAMP_SPECIES];\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\n#define GAME_DATA_VALID_VAR 0x101\n\n#if defined(FIRERED)\n#define VERSION_CODE 1\n#elif defined(LEAFGREEN)\n#define VERSION_CODE 2\n#endif\n\nvoid MysteryGift_LoadLinkGameData(struct MysteryGiftLinkGameData * data)\n{\n    s32 i;\n    CpuFill32(0, data, sizeof(*data));\n    // Magic\n    data->unk_00 = GAME_DATA_VALID_VAR;\n    data->unk_04 = 1;\n    data->unk_08 = 1;\n    data->unk_0C = 1;\n    data->unk_10 = VERSION_CODE;\n\n    // Check whether a card already exists\n    if (ValidateSavedWonderCard())\n    {\n        // Populate fields\n        data->flagId = GetSavedWonderCard()->flagId;\n        data->cardMetadata = *GetSavedWonderCardMetadata();\n        data->maxStamps = GetSavedWonderCard()->maxStamps;\n    }\n    else\n    {\n        data->flagId = 0;\n    }\n\n    for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++)\n        data->questionnaireWords[i] = gSaveBlock1Ptr->mysteryGift.questionnaireWords[i];\n\n    CopyTrainerId(data->playerTrainerId, gSaveBlock2Ptr->playerTrainerId);\n    StringCopy(data->playerName, gSaveBlock2Ptr->playerName);\n    for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++)\n        data->easyChatProfile[i] = gSaveBlock1Ptr->easyChatProfile[i];\n\n    memcpy(data->gameCode, RomHeaderGameCode, GAME_CODE_LENGTH);\n    data->version = RomHeaderSoftwareVersion;\n}\n\nbool32 MysteryGift_ValidateLinkGameData(const struct MysteryGiftLinkGameData * data)\n{\n    if (data->unk_00 != GAME_DATA_VALID_VAR)\n        return FALSE;\n    if (!(data->unk_04 & 1))\n        return FALSE;\n    if (!(data->unk_08 & 1))\n        return FALSE;\n    if (!(data->unk_0C & 1))\n        return FALSE;\n    if (!(data->unk_10 & 0x0F))\n        return FALSE;\n    return TRUE;\n}\n\nu32 MysteryGift_CompareCardFlags(const u16 * flagId, const struct MysteryGiftLinkGameData * data, const void *unused)\n{\n    // Has a Wonder Card already?\n    if (data->flagId == 0)\n        return 0;\n\n    // Has this Wonder Card already?\n    if (*flagId == data->flagId)\n        return 1;\n\n    // Player has a different Wonder Card\n    return 2;\n}\n\nu32 MysteryGift_CheckStamps(const u16 * stamp, const struct MysteryGiftLinkGameData * data, const void *unused)\n{\n    s32 stampsMissing = data->maxStamps - GetNumStampsInMetadata(&data->cardMetadata, data->maxStamps);\n    \n    // Has full stamp card?\n    if (stampsMissing == 0)\n        return 1;\n\n    // Already has stamp?\n    if (IsStampInMetadata(&data->cardMetadata, stamp, data->maxStamps))\n        return 3;\n\n    // Only 1 empty stamp left?\n    if (stampsMissing == 1)\n        return 4;\n\n    // This is a new stamp\n    return 2;\n}\n\nbool32 MysteryGift_DoesQuestionnaireMatch(const struct MysteryGiftLinkGameData * data, const u16 * words)\n{\n    s32 i;\n    for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++)\n    {\n        if (data->questionnaireWords[i] != words[i])\n            return FALSE;\n    }\n    return TRUE;\n}\n\nstatic s32 GetNumStampsInLinkData(const struct MysteryGiftLinkGameData * data)\n{\n    return GetNumStampsInMetadata(&data->cardMetadata, data->maxStamps);\n}\n\nu16 MysteryGift_GetCardStatFromLinkData(const struct MysteryGiftLinkGameData * data, u32 stat)\n{\n    switch (stat)\n    {\n    case CARD_STAT_BATTLES_WON:\n        return data->cardMetadata.battlesWon;\n    case CARD_STAT_BATTLES_LOST:\n        return data->cardMetadata.battlesLost;\n    case CARD_STAT_NUM_TRADES:\n        return data->cardMetadata.numTrades;\n    case CARD_STAT_NUM_STAMPS:\n        return GetNumStampsInLinkData(data);\n    case CARD_STAT_MAX_STAMPS:\n        return data->maxStamps;\n    default:\n        AGB_ASSERT_EX(0, ABSPATH(\"mevent.c\"), 825);\n        return 0;\n    }\n}\n\nstatic void IncrementCardStat(u32 statType)\n{\n    struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card;\n    if (card->type == CARD_TYPE_LINK_STAT)\n    {\n        u16 * stat = NULL;\n        switch (statType)\n        {\n        case CARD_STAT_BATTLES_WON:\n            stat = &gSaveBlock1Ptr->mysteryGift.cardMetadata.battlesWon;\n            break;\n        case CARD_STAT_BATTLES_LOST:\n            stat = &gSaveBlock1Ptr->mysteryGift.cardMetadata.battlesLost;\n            break;\n        case CARD_STAT_NUM_TRADES:\n            stat = &gSaveBlock1Ptr->mysteryGift.cardMetadata.numTrades;\n            break;\n        case CARD_STAT_NUM_STAMPS:\n        case CARD_STAT_MAX_STAMPS:\n            break;\n        }\n        if (stat == NULL)\n        {\n             AGB_ASSERT_EX(0, ABSPATH(\"mevent.c\"), 868);\n        }\n        else if (++(*stat) > MAX_WONDER_CARD_STAT)\n        {\n            *stat = MAX_WONDER_CARD_STAT;\n        }\n    }\n}\n\nu16 MysteryGift_GetCardStat(u32 stat)\n{\n    switch (stat)\n    {\n    case CARD_STAT_BATTLES_WON:\n    {\n        struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card;\n        if (card->type == CARD_TYPE_LINK_STAT)\n        {\n            struct WonderCardMetadata * metadata = &gSaveBlock1Ptr->mysteryGift.cardMetadata;\n            return metadata->battlesWon;\n        }\n        break;\n    }\n    case CARD_STAT_BATTLES_LOST:\n    {\n        struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card;\n        if (card->type == CARD_TYPE_LINK_STAT)\n        {\n            struct WonderCardMetadata * metadata = &gSaveBlock1Ptr->mysteryGift.cardMetadata;\n            return metadata->battlesLost;\n        }\n        break;\n    }\n    case CARD_STAT_NUM_TRADES:\n    {\n        struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card;\n        if (card->type == CARD_TYPE_LINK_STAT)\n        {\n            struct WonderCardMetadata * metadata = &gSaveBlock1Ptr->mysteryGift.cardMetadata;\n            return metadata->numTrades;\n        }\n        break;\n    }\n    case CARD_STAT_NUM_STAMPS:\n    {\n        struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card;\n        if (card->type == CARD_TYPE_STAMP)\n            return GetNumStampsInSavedCard();\n        break;\n    }\n    case CARD_STAT_MAX_STAMPS:\n    {\n        struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card;\n        if (card->type == CARD_TYPE_STAMP)\n            return card->maxStamps;\n        break;\n    }\n    }\n    AGB_ASSERT_EX(0, ABSPATH(\"mevent.c\"), 913);\n    return 0;\n}\n\nvoid MysteryGift_DisableStats(void)\n{\n    sStatsEnabled = FALSE;\n}\n\nbool32 MysteryGift_TryEnableStatsByFlagId(u16 flagId)\n{\n    sStatsEnabled = FALSE;\n    if (flagId == 0)\n        return FALSE;\n    if (!ValidateSavedWonderCard())\n        return FALSE;\n    if (gSaveBlock1Ptr->mysteryGift.card.flagId != flagId)\n        return FALSE;\n    sStatsEnabled = TRUE;\n    return TRUE;\n}\n\nvoid MysteryGift_TryIncrementStat(u32 stat, u32 trainerId)\n{\n    if (sStatsEnabled)\n    {\n        switch (stat)\n        {\n        case CARD_STAT_NUM_TRADES:\n            IncrementCardStatForNewTrainer(CARD_STAT_NUM_TRADES,\n                                            trainerId,\n                                            gSaveBlock1Ptr->mysteryGift.trainerIds[1],\n                                            ARRAY_COUNT(gSaveBlock1Ptr->mysteryGift.trainerIds[1]));\n            break;\n        case CARD_STAT_BATTLES_WON:\n            IncrementCardStatForNewTrainer(CARD_STAT_BATTLES_WON,\n                                            trainerId,\n                                            gSaveBlock1Ptr->mysteryGift.trainerIds[0],\n                                            ARRAY_COUNT(gSaveBlock1Ptr->mysteryGift.trainerIds[0]));\n            break;\n        case CARD_STAT_BATTLES_LOST:\n            IncrementCardStatForNewTrainer(CARD_STAT_BATTLES_LOST,\n                                            trainerId,\n                                            gSaveBlock1Ptr->mysteryGift.trainerIds[0],\n                                            ARRAY_COUNT(gSaveBlock1Ptr->mysteryGift.trainerIds[0]));\n            break;\n        default:\n             AGB_ASSERT_EX(0, ABSPATH(\"mevent.c\"), 988);\n             break;\n        }\n    }\n}\n\nstatic void ClearSavedTrainerIds(void)\n{\n    CpuFill32(0, gSaveBlock1Ptr->mysteryGift.trainerIds, sizeof(gSaveBlock1Ptr->mysteryGift.trainerIds));\n}\n\n// Returns TRUE if it's a new trainer id, FALSE if an existing one.\n// In either case the given trainerId is saved in element 0\nstatic bool32 RecordTrainerId(u32 trainerId, u32 * trainerIds, s32 size)\n{\n    s32 i;\n    s32 j;\n\n    for (i = 0; i < size; i++)\n    {\n        if (trainerIds[i] == trainerId)\n            break;\n    }\n\n    if (i == size)\n    {\n        // New trainer, shift array and insert new id at front\n        for (j = size - 1; j > 0; j--)\n            trainerIds[j] = trainerIds[j - 1];\n\n        trainerIds[0] = trainerId;\n        return TRUE;\n    }\n    else\n    {\n        // Existing trainer, shift back to old slot and move id to front\n        for (j = i; j > 0; j--)\n            trainerIds[j] = trainerIds[j - 1];\n\n        trainerIds[0] = trainerId;\n        return FALSE;\n    }\n}\n\nstatic void IncrementCardStatForNewTrainer(u32 stat, u32 trainerId, u32 * trainerIds, s32 size)\n{\n    if (RecordTrainerId(trainerId, trainerIds, size))\n        IncrementCardStat(stat);\n}\n"
  },
  {
    "path": "src/mystery_gift_client.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"overworld.h\"\n#include \"script.h\"\n#include \"battle_tower.h\"\n#include \"mystery_event_script.h\"\n#include \"mystery_gift.h\"\n#include \"mystery_gift_client.h\"\n#include \"mystery_gift_server.h\"\n\nenum {\n    FUNC_INIT,\n    FUNC_DONE,\n    FUNC_RECV,\n    FUNC_SEND,\n    FUNC_RUN,\n    FUNC_WAIT,\n    FUNC_RUN_MEVENT,\n    FUNC_RUN_BUFFER,\n};\n\nstatic EWRAM_DATA struct MysteryGiftClient * sClient = NULL;\n\nstatic void MysteryGiftClient_Init(struct MysteryGiftClient *, u32, u32);\nstatic u32 MysteryGiftClient_CallFunc(struct MysteryGiftClient *);\nstatic void MysteryGiftClient_Free(struct MysteryGiftClient *);\n\nextern const struct MysteryGiftClientCmd gMysteryGiftClientScript_Init[];\n\nvoid MysteryGiftClient_Create(void)\n{\n    sClient = AllocZeroed(sizeof(*sClient));\n    MysteryGiftClient_Init(sClient, 1, 0);\n}\n\nu32 MysteryGiftClient_Run(u16 * endVal)\n{\n    u32 result;\n    if (sClient == NULL)\n        return CLI_RET_END;\n    result = MysteryGiftClient_CallFunc(sClient);\n    if (result == CLI_RET_END)\n    {\n        *endVal = sClient->param;\n        MysteryGiftClient_Free(sClient);\n        FREE_AND_SET_NULL(sClient);\n    }\n    return result;\n}\n\nvoid MysteryGiftClient_AdvanceState(void)\n{\n    sClient->funcState++;\n}\n\nvoid *MysteryGiftClient_GetMsg(void)\n{\n    return sClient->msg;\n}\n\nvoid MysteryGiftClient_SetParam(u32 val)\n{\n    sClient->param = val;\n}\n\nstatic void MysteryGiftClient_Init(struct MysteryGiftClient * client, u32 sendPlayerId, u32 recvPlayerId)\n{\n    client->unused = 0;\n    client->funcId = FUNC_INIT;\n    client->funcState = 0;\n    client->sendBuffer = AllocZeroed(MG_LINK_BUFFER_SIZE);\n    client->recvBuffer = AllocZeroed(MG_LINK_BUFFER_SIZE);\n    client->script = AllocZeroed(MG_LINK_BUFFER_SIZE);\n    client->msg = AllocZeroed(CLIENT_MAX_MSG_SIZE);\n    MysteryGiftLink_Init(&client->link, sendPlayerId, recvPlayerId);\n}\n\nstatic void MysteryGiftClient_Free(struct MysteryGiftClient * client)\n{\n    Free(client->sendBuffer);\n    Free(client->recvBuffer);\n    Free(client->script);\n    Free(client->msg);\n}\n\nstatic void MysteryGiftClient_CopyRecvScript(struct MysteryGiftClient * client)\n{\n    memcpy(client->script, client->recvBuffer, MG_LINK_BUFFER_SIZE);\n    client->cmdidx = 0;\n}\n\nstatic void MysteryGiftClient_InitSendWord(struct MysteryGiftClient * client, u32 ident, u32 word)\n{\n    CpuFill32(0, client->sendBuffer, MG_LINK_BUFFER_SIZE);\n    *(u32 *)client->sendBuffer = word;\n    MysteryGiftLink_InitSend(&client->link, ident, client->sendBuffer, sizeof(word));\n}\n\nstatic u32 Client_Init(struct MysteryGiftClient * client)\n{\n    memcpy(client->script, gMysteryGiftClientScript_Init, MG_LINK_BUFFER_SIZE);\n    client->cmdidx = 0;\n    client->funcId = FUNC_RUN;\n    client->funcState = 0;\n    return CLI_RET_INIT;\n}\n\nstatic u32 Client_Done(struct MysteryGiftClient * client)\n{\n    return CLI_RET_END;\n}\n\nstatic u32 Client_Recv(struct MysteryGiftClient * client)\n{\n    if (MysteryGiftLink_Recv(&client->link))\n    {\n        client->funcId = FUNC_RUN;\n        client->funcState = 0;\n    }\n    return CLI_RET_ACTIVE;\n}\n\nstatic u32 Client_Send(struct MysteryGiftClient * client)\n{\n    if (MysteryGiftLink_Send(&client->link))\n    {\n        client->funcId = FUNC_RUN;\n        client->funcState = 0;\n    }\n    return CLI_RET_ACTIVE;\n}\n\nstatic u32 Client_Run(struct MysteryGiftClient * client)\n{\n    // process command\n    struct MysteryGiftClientCmd * cmd = &client->script[client->cmdidx];\n    client->cmdidx++;\n    switch (cmd->instr)\n    {\n    case CLI_NONE:\n        break;\n    case CLI_RETURN:\n        client->param = cmd->parameter; // Set for endVal in MysteryGiftClient_Run\n        client->funcId = FUNC_DONE;\n        client->funcState = 0;\n        break;\n    case CLI_RECV:\n        MysteryGiftLink_InitRecv(&client->link, cmd->parameter, client->recvBuffer);\n        client->funcId = FUNC_RECV;\n        client->funcState = 0;\n        break;\n    case CLI_SEND_LOADED:\n        // Send without a MysteryGiftLink_InitSend\n        // Sends whatever has been loaded already\n        client->funcId = FUNC_SEND;\n        client->funcState = 0;\n        break;\n    case CLI_SEND_READY_END:\n        MysteryGiftLink_InitSend(&client->link, MG_LINKID_READY_END, client->sendBuffer, 0);\n        client->funcId = FUNC_SEND;\n        client->funcState = 0;\n        break;\n    case CLI_SEND_STAT:\n        MysteryGiftClient_InitSendWord(client, MG_LINKID_GAME_STAT, GetGameStat(cmd->parameter));\n        client->funcId = FUNC_SEND;\n        client->funcState = 0;\n        break;\n    case CLI_COPY_RECV_IF_N:\n        if (client->param == FALSE)\n            MysteryGiftClient_CopyRecvScript(client);\n        break;\n    case CLI_COPY_RECV_IF:\n        if (client->param == TRUE)\n            MysteryGiftClient_CopyRecvScript(client);\n        break;\n    case CLI_COPY_RECV:\n        MysteryGiftClient_CopyRecvScript(client);\n        break;\n    case CLI_YES_NO:\n        memcpy(client->msg, client->recvBuffer, CLIENT_MAX_MSG_SIZE);\n        client->funcId = FUNC_WAIT;\n        client->funcState = 0;\n        return CLI_RET_YES_NO;\n    case CLI_PRINT_MSG:\n        memcpy(client->msg, client->recvBuffer, CLIENT_MAX_MSG_SIZE);\n        client->funcId = FUNC_WAIT;\n        client->funcState = 0;\n        return CLI_RET_PRINT_MSG;\n    case CLI_COPY_MSG:\n        memcpy(client->msg, client->recvBuffer, CLIENT_MAX_MSG_SIZE);\n        client->funcId = FUNC_WAIT;\n        client->funcState = 0;\n        return CLI_RET_COPY_MSG;\n    case CLI_ASK_TOSS:\n        client->funcId = FUNC_WAIT;\n        client->funcState = 0;\n        return CLI_RET_ASK_TOSS;\n    case CLI_LOAD_GAME_DATA:\n        MysteryGift_LoadLinkGameData(client->sendBuffer);\n        MysteryGiftLink_InitSend(&client->link, MG_LINKID_GAME_DATA, client->sendBuffer, sizeof(struct MysteryGiftLinkGameData));\n        break;\n    case CLI_LOAD_TOSS_RESPONSE:\n        // param here is set by MG_STATE_CLIENT_ASK_TOSS or MG_STATE_CLIENT_ASK_TOSS_UNRECEIVED\n        MysteryGiftClient_InitSendWord(client, MG_LINKID_RESPONSE, client->param);\n        break;\n    case CLI_SAVE_CARD:\n        SaveWonderCard(client->recvBuffer);\n        break;\n    case CLI_SAVE_NEWS:\n        if (!IsWonderNewsSameAsSaved(client->recvBuffer))\n        {\n            SaveWonderNews(client->recvBuffer);\n            MysteryGiftClient_InitSendWord(client, MG_LINKID_RESPONSE, FALSE);\n        }\n        else\n        {\n            // Wonder News has already been saved (or is invalid).\n            // Prepare a signal to indicate it was not saved.\n            MysteryGiftClient_InitSendWord(client, MG_LINKID_RESPONSE, TRUE);\n        }\n        break;\n    case CLI_RUN_MEVENT_SCRIPT:\n        client->funcId = FUNC_RUN_MEVENT;\n        client->funcState = 0;\n        break;\n    case CLI_SAVE_STAMP:\n        MysteryGift_TrySaveStamp(client->recvBuffer);\n        break;\n    case CLI_SAVE_RAM_SCRIPT:\n        InitRamScript_NoObjectEvent(client->recvBuffer, sizeof(struct RamScriptData));\n        break;\n    case CLI_RECV_EREADER_TRAINER:\n        memcpy(&gSaveBlock2Ptr->battleTower.ereaderTrainer, client->recvBuffer, sizeof(gSaveBlock2Ptr->battleTower.ereaderTrainer));\n        ValidateEReaderTrainer();\n        break;\n    case CLI_RUN_BUFFER_SCRIPT:\n        memcpy(gDecompressionBuffer, client->recvBuffer, MG_LINK_BUFFER_SIZE);\n        client->funcId = FUNC_RUN_BUFFER;\n        client->funcState = 0;\n        break;\n    }\n\n    return CLI_RET_ACTIVE;\n}\n\nstatic u32 Client_Wait(struct MysteryGiftClient * client)\n{\n    if (client->funcState)\n    {\n        client->funcId = FUNC_RUN;\n        client->funcState = 0;\n    }\n    return CLI_RET_ACTIVE;\n}\n\nstatic u32 Client_RunMysteryEventScript(struct MysteryGiftClient * client)\n{\n    switch (client->funcState)\n    {\n    case 0:\n        MEventScript_InitContext(client->recvBuffer);\n        client->funcState++;\n        break;\n    case 1:\n        if (!MEventScript_Run(&client->param))\n        {\n            client->funcId = FUNC_RUN;\n            client->funcState = 0;\n        }\n        break;\n    }\n    return CLI_RET_ACTIVE;\n}\n\nstatic u32 Client_RunBufferScript(struct MysteryGiftClient * client)\n{\n    u32 (*func)(u32 *, struct SaveBlock2 *, struct SaveBlock1 *) = (void *)gDecompressionBuffer;\n    if (func(&client->param, gSaveBlock2Ptr, gSaveBlock1Ptr) == 1)\n    {\n        client->funcId = FUNC_RUN;\n        client->funcState = 0;\n    }\n    return CLI_RET_ACTIVE;\n}\n\nstatic u32 MysteryGiftClient_CallFunc(struct MysteryGiftClient * client)\n{\n    u32 (*funcs[])(struct MysteryGiftClient *) = {\n        [FUNC_INIT] = Client_Init,\n        [FUNC_DONE] = Client_Done,\n        [FUNC_RECV] = Client_Recv,\n        [FUNC_SEND] = Client_Send,\n        [FUNC_RUN]  = Client_Run,\n        [FUNC_WAIT] = Client_Wait,\n        [FUNC_RUN_MEVENT] = Client_RunMysteryEventScript,\n        [FUNC_RUN_BUFFER] = Client_RunBufferScript\n    };\n    return funcs[client->funcId](client);\n}\n"
  },
  {
    "path": "src/mystery_gift_link.c",
    "content": "#include \"global.h\"\n#include \"util.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"mystery_gift_server.h\"\n\n/*\n    Handles the link connection functions used by the Mystery Gift client/server.\n    Note: MysteryGiftLink is shortened to MGL for internal functions.\n*/\n\nstruct SendRecvHeader\n{\n    u16 ident;\n    u16 crc;\n    u16 size;\n};\n\nstatic u32 MGL_Receive(struct MysteryGiftLink *);\nstatic u32 MGL_Send(struct MysteryGiftLink *);\n\nu32 MysteryGiftLink_Recv(struct MysteryGiftLink * link)\n{\n    return link->recvFunc(link);\n}\n\nu32 MysteryGiftLink_Send(struct MysteryGiftLink * link)\n{\n    return link->sendFunc(link);\n}\n\nvoid MysteryGiftLink_Init(struct MysteryGiftLink * link, u32 sendPlayerId, u32 recvPlayerId)\n{\n    link->sendPlayerId = sendPlayerId;\n    link->recvPlayerId = recvPlayerId;\n    link->state = 0;\n    link->sendCRC = 0;\n    link->sendSize = 0;\n    link->sendCounter = 0;\n    link->recvCRC = 0;\n    link->recvSize = 0;\n    link->recvCounter = 0;\n    link->sendBuffer = NULL;\n    link->recvBuffer = NULL;\n    link->sendFunc = MGL_Send;\n    link->recvFunc = MGL_Receive;\n}\n\nvoid MysteryGiftLink_InitSend(struct MysteryGiftLink * link, u32 ident, const void *src, u32 size)\n{\n    link->state = 0;\n    link->sendIdent = ident;\n    link->sendCounter = 0;\n    link->sendCRC = 0;\n    if (size != 0)\n        link->sendSize = size;\n    else\n        link->sendSize = MG_LINK_BUFFER_SIZE;\n    link->sendBuffer = src;\n}\n\nvoid MysteryGiftLink_InitRecv(struct MysteryGiftLink * link, u32 ident, void *dest)\n{\n    link->state = 0;\n    link->recvIdent = ident;\n    link->recvCounter = 0;\n    link->recvCRC = 0;\n    link->recvSize = 0;\n    link->recvBuffer = dest;\n}\n\nstatic void MGL_ReceiveBlock(u32 playerId, void *dest, size_t size)\n{\n    memcpy(dest, gBlockRecvBuffer[playerId], size);\n}\n\nstatic bool32 MGL_HasReceived(u32 playerId)\n{\n    if ((GetBlockReceivedStatus() >> playerId) & 1)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void MGL_ResetReceived(u32 playerId)\n{\n    ResetBlockReceivedFlag(playerId);\n}\n\nstatic bool32 MGL_Receive(struct MysteryGiftLink * link)\n{\n    struct SendRecvHeader header;\n\n    switch (link->state)\n    {\n    case 0:\n        if (MGL_HasReceived(link->recvPlayerId))\n        {\n            MGL_ReceiveBlock(link->recvPlayerId, &header, sizeof(header));\n            link->recvSize = header.size;\n            link->recvCRC = header.crc;\n            if (link->recvSize > MG_LINK_BUFFER_SIZE)\n            {\n                LinkRfu_FatalError();\n                return FALSE;\n            }\n            else if (link->recvIdent != header.ident)\n            {\n                LinkRfu_FatalError();\n                return FALSE;\n            }\n            else\n            {\n                link->recvCounter = 0;\n                MGL_ResetReceived(link->recvPlayerId);\n                link->state++;\n            }\n        }\n        break;\n    case 1:\n        if (MGL_HasReceived(link->recvPlayerId))\n        {\n            size_t blocksize = link->recvCounter * 252;\n            if (link->recvSize - blocksize <= 252)\n            {\n                MGL_ReceiveBlock(link->recvPlayerId, link->recvBuffer + blocksize, link->recvSize - blocksize);\n                link->recvCounter++;\n                link->state++;\n            }\n            else\n            {\n                MGL_ReceiveBlock(link->recvPlayerId, link->recvBuffer + blocksize, 252);\n                link->recvCounter++;\n            }\n            MGL_ResetReceived(link->recvPlayerId);\n        }\n        break;\n    case 2:\n        if (CalcCRC16WithTable(link->recvBuffer, link->recvSize) != link->recvCRC)\n        {\n            LinkRfu_FatalError();\n            return FALSE;\n        }\n        else\n        {\n            link->state = 0;\n            return TRUE;\n        }\n        break;\n    }\n\n    return FALSE;\n}\n\nstatic bool32 MGL_Send(struct MysteryGiftLink * link)\n{\n    struct SendRecvHeader header;\n\n    switch (link->state)\n    {\n    case 0:\n        if (IsLinkTaskFinished())\n        {\n            header.ident = link->sendIdent;\n            header.size = link->sendSize;\n            header.crc = CalcCRC16WithTable(link->sendBuffer, link->sendSize);\n            link->sendCRC = header.crc;\n            link->sendCounter = 0;\n            SendBlock(0, &header, sizeof(header));\n            link->state++;\n        }\n        break;\n    case 1:\n        if (IsLinkTaskFinished())\n        {\n            if (MGL_HasReceived(link->sendPlayerId))\n            {\n                size_t blocksize;\n                MGL_ResetReceived(link->sendPlayerId);\n                blocksize = 252 * link->sendCounter;\n                if (link->sendSize - blocksize <= 252)\n                {\n                    SendBlock(0, link->sendBuffer + blocksize, link->sendSize - blocksize);\n                    link->sendCounter++;\n                    link->state++;\n                }\n                else\n                {\n                    SendBlock(0, link->sendBuffer + blocksize, 252);\n                    link->sendCounter++;\n                }\n            }\n        }\n        break;\n    case 2:\n        if (IsLinkTaskFinished())\n        {\n            if (CalcCRC16WithTable(link->sendBuffer, link->sendSize) != link->sendCRC)\n                LinkRfu_FatalError();\n            else\n                link->state++;\n        }\n        break;\n    case 3:\n        if (MGL_HasReceived(link->sendPlayerId))\n        {\n            MGL_ResetReceived(link->sendPlayerId);\n            link->state = 0;\n            return TRUE;\n        }\n        break;\n    }\n\n    return FALSE;\n}\n"
  },
  {
    "path": "src/mystery_gift_menu.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"scanline_effect.h\"\n#include \"text_window.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"mystery_gift_menu.h\"\n#include \"title_screen.h\"\n#include \"list_menu.h\"\n#include \"link_rfu.h\"\n#include \"mystery_gift.h\"\n#include \"save.h\"\n#include \"link.h\"\n#include \"event_data.h\"\n#include \"mystery_gift_server.h\"\n#include \"mystery_gift_client.h\"\n#include \"wonder_news.h\"\n#include \"help_system.h\"\n#include \"strings.h\"\n#include \"decompress.h\"\n#include \"constants/cable_club.h\"\n#include \"constants/songs.h\"\n#include \"constants/union_room.h\"\n\nEWRAM_DATA u8 sDownArrowCounterAndYCoordIdx[8] = {};\nEWRAM_DATA bool8 gGiftIsFromEReader = FALSE;\n\nstatic void CreateMysteryGiftTask(void);\nstatic void Task_MysteryGift(u8 taskId);\nextern void CreateEReaderTask(void);\n\nstatic const u16 sTextboxBorder_Pal[] = INCBIN_U16(\"graphics/interface/mystery_gift_textbox_border.gbapal\");\nstatic const u32 sTextboxBorder_Gfx[] = INCBIN_U32(\"graphics/interface/mystery_gift_textbox_border.4bpp.lz\");\n\nstruct MysteryGiftTaskData\n{\n    u16 var; // Multipurpose\n    u16 unused1;\n    u16 unused2;\n    u16 unused3;\n    u8 state;\n    u8 textState;\n    u8 unused4;\n    u8 unused5;\n    bool8 isWonderNews;\n    bool8 sourceIsFriend;\n    u8 msgId;\n    u8 * clientMsg;\n};\n\nstatic const struct BgTemplate sBGTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 15,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 14,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 13,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000\n    }, {\n        .bg = 3,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 12,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct WindowTemplate sMainWindows[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 30,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x0013\n    }, {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 15,\n        .width = 28,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x004f\n    }, {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 15,\n        .width = 30,\n        .height = 5,\n        .paletteNum = 13,\n        .baseBlock = 0x004f\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sWindowTemplate_YesNoMsg_Wide = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 15,\n    .width = 28,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x00e5\n};\n\nstatic const struct WindowTemplate sWindowTemplate_YesNoMsg = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 15,\n    .width = 20,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x00e5\n};\n\nstatic const struct WindowTemplate sWindowTemplate_GiftSelect = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 15,\n    .width = 19,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x00e5\n};\n\nstatic const struct WindowTemplate sWindowTemplate_ThreeOptions = {\n    .bg = 0,\n    .tilemapLeft = 8,\n    .tilemapTop = 5,\n    .width = 14,\n    .height = 5,\n    .paletteNum = 14,\n    .baseBlock = 0x0155\n};\n\nstatic const struct WindowTemplate sWindowTemplate_YesNoBox = {\n    .bg = 0,\n    .tilemapLeft = 23,\n    .tilemapTop = 15,\n    .width = 6,\n    .height = 4,\n    .paletteNum = 14,\n    .baseBlock = 0x0155\n};\n\nstatic const struct WindowTemplate sWindowTemplate_GiftSelect_3Options = {\n    .bg = 0,\n    .tilemapLeft = 22,\n    .tilemapTop = 12,\n    .width = 7,\n    .height = 7,\n    .paletteNum = 14,\n    .baseBlock = 0x0155\n};\n\nstatic const struct WindowTemplate sWindowTemplate_GiftSelect_2Options = {\n    .bg = 0,\n    .tilemapLeft = 22,\n    .tilemapTop = 14,\n    .width = 7,\n    .height = 5,\n    .paletteNum = 14,\n    .baseBlock = 0x0155\n};\n\nstatic const struct WindowTemplate sWindowTemplate_GiftSelect_1Option = {\n    .bg = 0,\n    .tilemapLeft = 22,\n    .tilemapTop = 15,\n    .width = 7,\n    .height = 4,\n    .paletteNum = 14,\n    .baseBlock = 0x0155\n};\n\nstatic const struct ListMenuItem sListMenuItems_CardsOrNews[] = {\n    { gText_WonderCards,  0 },\n    { gText_WonderNews,   1 },\n    { gText_Exit3,        LIST_CANCEL }\n};\n\nstatic const struct ListMenuItem sListMenuItems_WirelessOrFriend[] = {\n    { gText_WirelessCommunication,  0 },\n    { gText_Friend2,                1 },\n    { gFameCheckerText_Cancel,      LIST_CANCEL }\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_ThreeOptions = {\n    .items = NULL,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = NULL,\n    .totalItems = 3,\n    .maxShowed = 3,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 8,\n    .cursor_X = 0,\n    .upText_Y = 0,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 0,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = 0,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0\n};\n\nstatic const struct ListMenuItem sListMenuItems_ReceiveSendToss[] = {\n    { gText_Receive,  0 },\n    { gText_Send,     1 },\n    { gText_Toss,     2 },\n    { gFameCheckerText_Cancel, LIST_CANCEL }\n};\n\nstatic const struct ListMenuItem sListMenuItems_ReceiveToss[] = {\n    { gText_Receive,  0 },\n    { gText_Toss,     2 },\n    { gFameCheckerText_Cancel, LIST_CANCEL }\n};\n\nstatic const struct ListMenuItem sListMenuItems_ReceiveSend[] = {\n    { gText_Receive,  0 },\n    { gText_Send,     1 },\n    { gFameCheckerText_Cancel, LIST_CANCEL }\n};\n\nstatic const struct ListMenuItem sListMenuItems_Receive[] = {\n    { gText_Receive,  0 },\n    { gFameCheckerText_Cancel, LIST_CANCEL }\n};\n\nstatic const struct ListMenuTemplate sListMenu_ReceiveSendToss = {\n    .items = sListMenuItems_ReceiveSendToss,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = NULL,\n    .totalItems = 4,\n    .maxShowed = 4,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 8,\n    .cursor_X = 0,\n    .upText_Y = 2,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 0,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = 0,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0\n};\n\nstatic const struct ListMenuTemplate sListMenu_ReceiveToss = {\n    .items = sListMenuItems_ReceiveToss,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = NULL,\n    .totalItems = 3,\n    .maxShowed = 3,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 8,\n    .cursor_X = 0,\n    .upText_Y = 0,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 0,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = 0,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0\n};\n\nstatic const struct ListMenuTemplate sListMenu_ReceiveSend = {\n    .items = sListMenuItems_ReceiveSend,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = NULL,\n    .totalItems = 3,\n    .maxShowed = 3,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 8,\n    .cursor_X = 0,\n    .upText_Y = 0,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 0,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = 0,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0\n};\n\nstatic const struct ListMenuTemplate sListMenu_Receive = {\n    .items = sListMenuItems_Receive,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = NULL,\n    .totalItems = 2,\n    .maxShowed = 2,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 8,\n    .cursor_X = 0,\n    .upText_Y = 0,\n    .cursorPal = 2,\n    .fillValue = 1,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 0,\n    .itemVerticalPadding = 2,\n    .scrollMultiple = 0,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0\n};\n\nstatic const u8 *const sUnusedMenuTexts[] = {\n    gText_VarietyOfEventsImportedWireless,\n    gText_WonderCardsInPossession,\n    gText_ReadNewsThatArrived,\n    gText_ReturnToTitle\n};\n\nALIGNED(4) static const u8 sTextColors_TopMenu[3]      = { 0, 1, 2 };\nALIGNED(4) static const u8 sTextColors_TopMenu_Copy[3] = { 0, 1, 2 };\nALIGNED(4) static const u8 sMG_Ereader_TextColor_2[3]  = { 1, 2, 3 };\n\nstatic const u8 sText_Test[] = _(\"テスト\");\nstatic const u8 sText_EonTicket[] = _(\"むげんのチケット\");\n\nstatic void VBlankCB_MysteryGiftEReader(void)\n{\n    ProcessSpriteCopyRequests();\n    LoadOam();\n    TransferPlttBuffer();\n}\n\nvoid CB2_MysteryGiftEReader(void)\n{\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n}\n\nbool32 HandleMysteryGiftOrEReaderSetup(s32 isEReader)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        ResetPaletteFade();\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        ResetTasks();\n        ScanlineEffect_Stop();\n        ResetBgsAndClearDma3BusyFlags(1);\n\n        InitBgsFromTemplates(0, sBGTemplates, ARRAY_COUNT(sBGTemplates));\n        ChangeBgX(0, 0, BG_COORD_SET);\n        ChangeBgY(0, 0, BG_COORD_SET);\n        ChangeBgX(1, 0, BG_COORD_SET);\n        ChangeBgY(1, 0, BG_COORD_SET);\n        ChangeBgX(2, 0, BG_COORD_SET);\n        ChangeBgY(2, 0, BG_COORD_SET);\n        ChangeBgX(3, 0, BG_COORD_SET);\n        ChangeBgY(3, 0, BG_COORD_SET);\n\n        SetBgTilemapBuffer(3, Alloc(BG_SCREEN_SIZE));\n        SetBgTilemapBuffer(2, Alloc(BG_SCREEN_SIZE));\n        SetBgTilemapBuffer(1, Alloc(BG_SCREEN_SIZE));\n        SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE));\n\n        LoadUserWindowGfx2(0, 10, BG_PLTT_ID(14));\n        LoadStdWindowGfxOnBg(0,  1, BG_PLTT_ID(15));\n        DecompressAndLoadBgGfxUsingHeap(3, sTextboxBorder_Gfx, 0x100, 0, 0);\n        InitWindows(sMainWindows);\n        DeactivateAllTextPrinters();\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        gMain.state++;\n        break;\n    case 1:\n        LoadPalette(sTextboxBorder_Pal, BG_PLTT_ID(0), sizeof(sTextboxBorder_Pal));\n        LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(13), PLTT_SIZE_4BPP);\n        FillBgTilemapBufferRect(0, 0x000, 0, 0, 32, 32, 17);\n        FillBgTilemapBufferRect(1, 0x000, 0, 0, 32, 32, 17);\n        FillBgTilemapBufferRect(2, 0x000, 0, 0, 32, 32, 17);\n        MG_DrawCheckerboardPattern();\n        PrintMysteryGiftOrEReaderTopMenu(isEReader, FALSE);\n        gMain.state++;\n        break;\n    case 2:\n        CopyBgTilemapBufferToVram(3);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(0);\n        gMain.state++;\n        break;\n    case 3:\n        ShowBg(0);\n        ShowBg(3);\n        PlayBGM(MUS_MYSTERY_GIFT);\n        SetVBlankCallback(VBlankCB_MysteryGiftEReader);\n        EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nvoid CB2_InitMysteryGift(void)\n{\n    if (HandleMysteryGiftOrEReaderSetup(FALSE))\n    {\n        SetMainCallback2(CB2_MysteryGiftEReader);\n        gGiftIsFromEReader = FALSE;\n        CreateMysteryGiftTask();\n    }\n}\n\nvoid CB2_InitEReader(void)\n{\n    if (HandleMysteryGiftOrEReaderSetup(TRUE))\n    {\n        SetMainCallback2(CB2_MysteryGiftEReader);\n        gGiftIsFromEReader = TRUE;\n        CreateEReaderTask();\n    }\n}\n\nvoid MainCB_FreeAllBuffersAndReturnToInitTitleScreen(void)\n{\n    gGiftIsFromEReader = FALSE;\n    FreeAllWindowBuffers();\n    Free(GetBgTilemapBuffer(0));\n    Free(GetBgTilemapBuffer(1));\n    Free(GetBgTilemapBuffer(2));\n    Free(GetBgTilemapBuffer(3));\n    SetMainCallback2(CB2_InitTitleScreen);\n}\n\nvoid PrintMysteryGiftOrEReaderTopMenu(bool8 isEReader, bool32 useCancel)\n{\n    const u8 * options;\n    s32 width;\n    FillWindowPixelBuffer(0, 0x00);\n    if (!isEReader)\n    {\n        options = useCancel == TRUE ? gText_PickOKExit : gText_PickOKCancel;\n        AddTextPrinterParameterized4(0, FONT_NORMAL, 2, 2, 0, 0, sTextColors_TopMenu, 0, gText_MysteryGift2);\n        width = 222 - GetStringWidth(FONT_SMALL, options, 0);\n        AddTextPrinterParameterized4(0, FONT_SMALL, width, 2, 0, 0, sTextColors_TopMenu, 0, options);\n    }\n    else\n    {\n        AddTextPrinterParameterized4(0, FONT_NORMAL, 2, 2, 0, 0, sTextColors_TopMenu, 0, gJPText_MysteryGift);\n        AddTextPrinterParameterized4(0, FONT_SMALL, 120, 2, 0, 0, sTextColors_TopMenu, 0, gJPText_DecideStop);\n    }\n    CopyWindowToVram(0, COPYWIN_GFX);\n    PutWindowTilemap(0);\n}\n\nvoid MG_DrawTextBorder(u8 windowId)\n{\n    DrawTextBorderOuter(windowId, 0x01, 15);\n}\n\nvoid MG_DrawCheckerboardPattern(void)\n{\n    s32 i = 0, j;\n\n    FillBgTilemapBufferRect(3, 0x003, 0, 0, 32, 2, 17);\n\n    for (i = 0; i < 18; i++)\n    {\n        for (j = 0; j < 32; j++)\n        {\n            if ((i & 1) != (j & 1))\n                FillBgTilemapBufferRect(3, 1, j, i + 2, 1, 1, 17);\n            else\n                FillBgTilemapBufferRect(3, 2, j, i + 2, 1, 1, 17);\n        }\n    }\n}\n\nvoid ClearScreenInBg0(bool32 ignoreTopTwoRows)\n{\n    switch (ignoreTopTwoRows)\n    {\n    case 0:\n        FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 17);\n        break;\n    case 1:\n        FillBgTilemapBufferRect(0, 0, 0, 2, 32, 30, 17);\n        break;\n    }\n    CopyBgTilemapBufferToVram(0);\n}\n\nvoid AddTextPrinterToWindow1(const u8 *str)\n{\n    StringExpandPlaceholders(gStringVar4, str);\n    FillWindowPixelBuffer(1, 0x11);\n    AddTextPrinterParameterized4(1, FONT_NORMAL, 0, 2, 0, 2, sMG_Ereader_TextColor_2, 0, gStringVar4);\n    DrawTextBorderOuter(1, 0x001, 15);\n    PutWindowTilemap(1);\n    CopyWindowToVram(1, COPYWIN_FULL);\n}\n\nstatic void ClearTextWindow(void)\n{\n    rbox_fill_rectangle(1);\n    ClearWindowTilemap(1);\n    CopyWindowToVram(1, COPYWIN_MAP);\n}\n\n#define DOWN_ARROW_X 208\n#define DOWN_ARROW_Y 20\n\nbool32 PrintMysteryGiftMenuMessage(u8 *textState, const u8 *str)\n{\n    switch (*textState)\n    {\n    case 0:\n        AddTextPrinterToWindow1(str);\n        goto inc;\n    case 1:\n        DrawDownArrow(1, DOWN_ARROW_X, DOWN_ARROW_Y, 1, FALSE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]);\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n        {\n            inc:\n            (*textState)++;\n        }\n        break;\n    case 2:\n        DrawDownArrow(1, DOWN_ARROW_X, DOWN_ARROW_Y, 1, TRUE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]);\n        *textState = 0;\n        ClearTextWindow();\n        return TRUE;\n    case 0xFF:\n        *textState = 2;\n        break;\n    }\n    return FALSE;\n}\n\nstatic void HideDownArrow(void)\n{\n    DrawDownArrow(1, DOWN_ARROW_X, DOWN_ARROW_Y, 1, FALSE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]);\n}\n\nstatic void ShowDownArrow(void)\n{\n    DrawDownArrow(1, DOWN_ARROW_X, DOWN_ARROW_Y, 1, TRUE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]);\n}\n\n// Unused\nstatic bool32 HideDownArrowAndWaitButton(u8 * textState)\n{\n    switch (*textState)\n    {\n    case 0:\n        HideDownArrow();\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n            (*textState)++;\n        break;\n    case 1:\n        ShowDownArrow();\n        *textState = 0;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool32 PrintStringAndWait2Seconds(u8 * counter, const u8 * str)\n{\n    if (*counter == 0)\n        AddTextPrinterToWindow1(str);\n\n    if (++(*counter) > 120)\n    {\n        *counter = 0;\n        ClearTextWindow();\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nstatic u32 MysteryGift_HandleThreeOptionMenu(u8 * unused0, u16 * unused1, u8 whichMenu)\n{\n    struct ListMenuTemplate listMenuTemplate = sListMenuTemplate_ThreeOptions;\n    struct WindowTemplate windowTemplate = sWindowTemplate_ThreeOptions;\n    u32 width;\n    s32 finalWidth;\n    s32 response;\n    u32 i;\n\n    if (whichMenu == 0)\n        listMenuTemplate.items = sListMenuItems_CardsOrNews;\n    else\n        listMenuTemplate.items = sListMenuItems_WirelessOrFriend;\n\n    width = 0;\n    for (i = 0; i < listMenuTemplate.totalItems; i++)\n    {\n        u32 curWidth = GetStringWidth(FONT_NORMAL, listMenuTemplate.items[i].label, listMenuTemplate.lettersSpacing);\n        if (curWidth > width)\n            width = curWidth;\n    }\n    finalWidth = (((width + 9) / 8) + 2) & ~1;\n    windowTemplate.width = finalWidth;\n    windowTemplate.tilemapLeft = (30 - finalWidth) / 2;\n    response = DoMysteryGiftListMenu(&windowTemplate, &listMenuTemplate, 1, 0x00A, BG_PLTT_ID(14));\n    if (response != LIST_NOTHING_CHOSEN)\n    {\n        ClearWindowTilemap(2);\n        CopyWindowToVram(2, COPYWIN_MAP);\n    }\n    return response;\n}\n\ns8 DoMysteryGiftYesNo(u8 * textState, u16 * windowId, bool8 yesNoBoxPlacement, const u8 * str)\n{\n    struct WindowTemplate windowTemplate;\n    s8 input;\n\n    switch (*textState)\n    {\n    case 0:\n        // Print question message\n        StringExpandPlaceholders(gStringVar4, str);\n        if (yesNoBoxPlacement == 0)\n            *windowId = AddWindow(&sWindowTemplate_YesNoMsg_Wide);\n        else\n            *windowId = AddWindow(&sWindowTemplate_YesNoMsg);\n        FillWindowPixelBuffer(*windowId, 0x11);\n        AddTextPrinterParameterized4(*windowId, FONT_NORMAL, 0, 2, 0, 2, sMG_Ereader_TextColor_2, 0, gStringVar4);\n        DrawTextBorderOuter(*windowId, 0x001, 15);\n        CopyWindowToVram(*windowId, COPYWIN_GFX);\n        PutWindowTilemap(*windowId);\n        (*textState)++;\n        break;\n    case 1:\n        // Create Yes/No\n        windowTemplate = sWindowTemplate_YesNoBox;\n        if (yesNoBoxPlacement == 0)\n            windowTemplate.tilemapTop = 9;\n        else\n            windowTemplate.tilemapTop = 15;\n        CreateYesNoMenu(&windowTemplate, FONT_NORMAL, 0, 2, 10, 14, 0);\n        (*textState)++;\n        break;\n    case 2:\n        // Handle Yes/No input\n        input = Menu_ProcessInputNoWrapClearOnChoose();\n        if (input == MENU_B_PRESSED || input == 0 || input == 1)\n        {\n            *textState = 0;\n            rbox_fill_rectangle(*windowId);\n            ClearWindowTilemap(*windowId);\n            CopyWindowToVram(*windowId, COPYWIN_MAP);\n            RemoveWindow(*windowId);\n            return input;\n        }\n        break;\n    case 0xFF:\n        *textState = 0;\n        rbox_fill_rectangle(*windowId);\n        ClearWindowTilemap(*windowId);\n        CopyWindowToVram(*windowId, COPYWIN_MAP);\n        RemoveWindow(*windowId);\n        return MENU_B_PRESSED;\n    }\n\n    return MENU_NOTHING_CHOSEN;\n}\n\n// Handle the \"Receive/Send/Toss\" menu that appears when selecting Wonder Card/News\nstatic s32 HandleMysteryGiftListMenu(u8 * textState, u16 * windowId, bool32 cannotToss, bool32 cannotSend)\n{\n    struct WindowTemplate windowTemplate;\n    s32 input;\n\n    switch (*textState)\n    {\n    case 0:\n        // Print menu message\n        if (!cannotToss)\n            StringExpandPlaceholders(gStringVar4, gText_WhatToDoWithCards);\n        else\n            StringExpandPlaceholders(gStringVar4, gText_WhatToDoWithNews);\n        *windowId = AddWindow(&sWindowTemplate_GiftSelect);\n        FillWindowPixelBuffer(*windowId, 0x11);\n        AddTextPrinterParameterized4(*windowId, FONT_NORMAL, 0, 2, 0, 2, sMG_Ereader_TextColor_2, 0, gStringVar4);\n        DrawTextBorderOuter(*windowId, 0x001, 15);\n        CopyWindowToVram(*windowId, COPYWIN_GFX);\n        PutWindowTilemap(*windowId);\n        (*textState)++;\n        break;\n    case 1:\n        windowTemplate = sWindowTemplate_YesNoBox;\n        if (cannotSend)\n        {\n            if (!cannotToss)\n                input = DoMysteryGiftListMenu(&sWindowTemplate_GiftSelect_2Options, &sListMenu_ReceiveToss, 1, 0x00A, BG_PLTT_ID(14));\n            else\n                input = DoMysteryGiftListMenu(&sWindowTemplate_GiftSelect_1Option, &sListMenu_Receive, 1, 0x00A, BG_PLTT_ID(14));\n        }\n        else\n        {\n            if (!cannotToss)\n                input = DoMysteryGiftListMenu(&sWindowTemplate_GiftSelect_3Options, &sListMenu_ReceiveSendToss, 1, 0x00A, BG_PLTT_ID(14));\n            else\n                input = DoMysteryGiftListMenu(&sWindowTemplate_GiftSelect_2Options, &sListMenu_ReceiveSend, 1, 0x00A, BG_PLTT_ID(14));\n        }\n        if (input != LIST_NOTHING_CHOSEN)\n        {\n            *textState = 0;\n            rbox_fill_rectangle(*windowId);\n            ClearWindowTilemap(*windowId);\n            CopyWindowToVram(*windowId, COPYWIN_MAP);\n            RemoveWindow(*windowId);\n            return input;\n        }\n        break;\n    case 0xFF:\n        *textState = 0;\n        rbox_fill_rectangle(*windowId);\n        ClearWindowTilemap(*windowId);\n        CopyWindowToVram(*windowId, COPYWIN_MAP);\n        RemoveWindow(*windowId);\n        return LIST_CANCEL;\n    }\n\n    return LIST_NOTHING_CHOSEN;\n}\n\nstatic bool32 ValidateCardOrNews(bool32 isWonderNews)\n{\n    if (!isWonderNews)\n        return ValidateSavedWonderCard();\n    else\n        return ValidateSavedWonderNews();\n}\n\nstatic bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 isWonderNews)\n{\n    switch (*state)\n    {\n    case 0:\n        if (!isWonderNews)\n            WonderCard_Init(GetSavedWonderCard(), GetSavedWonderCardMetadata());\n        else\n            WonderNews_Init(GetSavedWonderNews());\n        (*state)++;\n        break;\n    case 1:\n        if (!isWonderNews)\n        {\n            if (!WonderCard_Enter())\n                return FALSE;\n        }\n        else\n        {\n            if (!WonderNews_Enter())\n                return FALSE;\n        }\n        *state = 0;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool32 ClearSavedNewsOrCard(bool32 isWonderNews)\n{\n    if (!isWonderNews)\n        ClearSavedWonderCardAndRelated();\n    else\n        ClearSavedWonderNewsAndRelated();\n    return TRUE;\n}\n\nstatic bool32 ExitWonderCardOrNews(bool32 isWonderNews, bool32 useCancel)\n{\n    if (!isWonderNews)\n    {\n        if (WonderCard_Exit(useCancel))\n        {\n            WonderCard_Destroy();\n            return TRUE;\n        }\n        else\n        {\n            return FALSE;\n        }\n    }\n    else\n    {\n        if (WonderNews_Exit(useCancel))\n        {\n            WonderNews_Destroy();\n            return TRUE;\n        }\n        else\n        {\n            return FALSE;\n        }\n    }\n}\n\nstatic s32 AskDiscardGift(u8 * textState, u16 * windowId, bool32 isWonderNews)\n{\n    if (!isWonderNews)\n        return DoMysteryGiftYesNo(textState, windowId, TRUE, gText_IfThrowAwayCardEventWontHappen);\n    else\n        return DoMysteryGiftYesNo(textState, windowId, TRUE, gText_OkayToDiscardNews);\n}\n\nstatic bool32 PrintThrownAway(u8 * textState, bool32 isWonderNews)\n{\n    if (!isWonderNews)\n        return PrintMysteryGiftMenuMessage(textState, gText_WonderCardThrownAway);\n    else\n        return PrintMysteryGiftMenuMessage(textState, gText_WonderNewsThrownAway);\n}\n\nstatic bool32 SaveOnMysteryGiftMenu(u8 * state)\n{\n    switch (*state)\n    {\n    case 0:\n        AddTextPrinterToWindow1(gText_DataWillBeSaved);\n        (*state)++;\n        break;\n    case 1:\n        TrySavingData(SAVE_NORMAL);\n        (*state)++;\n        break;\n    case 2:\n        AddTextPrinterToWindow1(gText_SaveCompletedPressA);\n        (*state)++;\n        break;\n    case 3:\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n            (*state)++;\n        break;\n    case 4:\n        *state = 0;\n        ClearTextWindow();\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic const u8 * GetClientResultMessage(bool32 * successMsg, bool8 isWonderNews, bool8 sourceIsFriend, u32 msgId)\n{\n    const u8 * msg = NULL;\n    *successMsg = FALSE;\n\n    switch (msgId)\n    {\n    case CLI_MSG_NOTHING_SENT:\n        *successMsg = FALSE;\n        msg = gText_NothingSentOver;\n        break;\n    case CLI_MSG_RECORD_UPLOADED:\n        *successMsg = FALSE;\n        msg = gText_RecordUploadedViaWireless;\n        break;\n    case CLI_MSG_CARD_RECEIVED:\n        *successMsg = TRUE;\n        msg = !sourceIsFriend ? gText_WonderCardReceived : gText_WonderCardReceivedFrom;\n        break;\n    case CLI_MSG_NEWS_RECEIVED:\n        *successMsg = TRUE;\n        msg = !sourceIsFriend ? gText_WonderNewsReceived : gText_WonderNewsReceivedFrom;\n        break;\n    case CLI_MSG_STAMP_RECEIVED:\n        *successMsg = TRUE;\n        msg = gText_NewStampReceived;\n        break;\n    case CLI_MSG_HAD_CARD:\n        *successMsg = FALSE;\n        msg = gText_AlreadyHadCard;\n        break;\n    case CLI_MSG_HAD_STAMP:\n        *successMsg = FALSE;\n        msg = gText_AlreadyHadStamp;\n        break;\n    case CLI_MSG_HAD_NEWS:\n        *successMsg = FALSE;\n        msg = gText_AlreadyHadNews;\n        break;\n    case CLI_MSG_NO_ROOM_STAMPS:\n        *successMsg = FALSE;\n        msg = gText_NoMoreRoomForStamps;\n        break;\n    case CLI_MSG_COMM_CANCELED:\n        *successMsg = FALSE;\n        msg = gText_CommunicationCanceled;\n        break;\n    case CLI_MSG_CANT_ACCEPT:\n        *successMsg = FALSE;\n        msg = !isWonderNews ? gText_CantAcceptCardFromTrainer : gText_CantAcceptNewsFromTrainer;\n        break;\n    case CLI_MSG_COMM_ERROR:\n        *successMsg = FALSE;\n        msg = gText_CommunicationError;\n        break;\n    case CLI_MSG_TRAINER_RECEIVED:\n        *successMsg = TRUE;\n        msg = gText_NewTrainerReceived;\n        break;\n    case CLI_MSG_BUFFER_SUCCESS:\n        *successMsg = TRUE;\n        // msg is NULL, use buffer\n        break;\n    case CLI_MSG_BUFFER_FAILURE:\n        *successMsg = FALSE;\n        // msg is NULL, use buffer\n        break;\n    }\n\n    return msg;\n}\n\nstatic bool32 PrintSuccessMessage(u8 * state, const u8 * msg, u16 * timer)\n{\n    switch (*state)\n    {\n    case 0:\n        if (msg != NULL)\n            AddTextPrinterToWindow1(msg);\n        PlayFanfare(MUS_OBTAIN_ITEM);\n        *timer = 0;\n        (*state)++;\n        break;\n    case 1:\n        if (++(*timer) > 240)\n            (*state)++;\n        break;\n    case 2:\n        if (IsFanfareTaskInactive())\n        {\n            *state = 0;\n            ClearTextWindow();\n            return TRUE;\n        }\n        break;\n    }\n    return FALSE;\n}\n\nstatic const u8 * GetServerResultMessage(bool32 * wonderSuccess, u8 unused, u32 msgId)\n{\n    const u8 * result = gText_CommunicationError;\n    *wonderSuccess = FALSE;\n    switch (msgId)\n    {\n    case SVR_MSG_NOTHING_SENT:\n        result = gText_NothingSentOver;\n        break;\n    case SVR_MSG_RECORD_UPLOADED:\n        result = gText_RecordUploadedViaWireless;\n        break;\n    case SVR_MSG_CARD_SENT:\n        result = gText_WonderCardSentTo;\n        *wonderSuccess = TRUE;\n        break;\n    case SVR_MSG_NEWS_SENT:\n        result = gText_WonderNewsSentTo;\n        *wonderSuccess = TRUE;\n        break;\n    case SVR_MSG_STAMP_SENT:\n        result = gText_StampSentTo;\n        break;\n    case SVR_MSG_HAS_CARD:\n        result = gText_OtherTrainerHasCard;\n        break;\n    case SVR_MSG_HAS_STAMP:\n        result = gText_OtherTrainerHasStamp;\n        break;\n    case SVR_MSG_HAS_NEWS:\n        result = gText_OtherTrainerHasNews;\n        break;\n    case SVR_MSG_NO_ROOM_STAMPS:\n        result = gText_NoMoreRoomForStamps;\n        break;\n    case SVR_MSG_CLIENT_CANCELED:\n        result = gText_OtherTrainerCanceled;\n        break;\n    case SVR_MSG_CANT_SEND_GIFT_1:\n        result = gText_CantSendGiftToTrainer;\n        break;\n    case SVR_MSG_COMM_ERROR:\n        result = gText_CommunicationError;\n        break;\n    case SVR_MSG_GIFT_SENT_1:\n        result = gText_GiftSentTo;\n        break;\n    case SVR_MSG_GIFT_SENT_2:\n        result = gText_GiftSentTo;\n        break;\n    case SVR_MSG_CANT_SEND_GIFT_2:\n        result = gText_CantSendGiftToTrainer;\n        break;\n    }\n    return result;\n}\n\nstatic bool32 PrintServerResultMessage(u8 * state, u16 * timer, bool8 sourceIsFriend, u32 msgId)\n{\n    bool32 wonderSuccess;\n    const u8 * str = GetServerResultMessage(&wonderSuccess, sourceIsFriend, msgId);\n    if (wonderSuccess)\n        return PrintSuccessMessage(state, str, timer);\n    else\n        return PrintMysteryGiftMenuMessage(state, str);\n}\n\n// States for Task_MysteryGift.\n// CLIENT states are for when the player is receiving a gift, and use mystery_gift_client.c link functions.\n// SERVER states are for when the player is sending a gift, and use mystery_gift_server.c link functions.\n// Other states handle the general Mystery Gift menu usage.\nenum {\n    MG_STATE_TO_MAIN_MENU,\n    MG_STATE_MAIN_MENU,\n    MG_STATE_DONT_HAVE_ANY,\n    MG_STATE_SOURCE_PROMPT,\n    MG_STATE_SOURCE_PROMPT_INPUT,\n    MG_STATE_CLIENT_LINK_START,\n    MG_STATE_CLIENT_LINK_WAIT,\n    MG_STATE_CLIENT_COMMUNICATING,\n    MG_STATE_CLIENT_LINK,\n    MG_STATE_CLIENT_YES_NO,\n    MG_STATE_CLIENT_MESSAGE,\n    MG_STATE_CLIENT_ASK_TOSS,\n    MG_STATE_CLIENT_ASK_TOSS_UNRECEIVED,\n    MG_STATE_CLIENT_LINK_END,\n    MG_STATE_CLIENT_COMM_COMPLETED,\n    MG_STATE_CLIENT_RESULT_MSG,\n    MG_STATE_CLIENT_ERROR,\n    MG_STATE_SAVE_LOAD_GIFT,\n    MG_STATE_LOAD_GIFT,\n    MG_STATE_UNUSED,\n    MG_STATE_HANDLE_GIFT_INPUT,\n    MG_STATE_HANDLE_GIFT_SELECT,\n    MG_STATE_ASK_TOSS,\n    MG_STATE_ASK_TOSS_UNRECEIVED,\n    MG_STATE_TOSS,\n    MG_STATE_TOSS_SAVE,\n    MG_STATE_TOSSED,\n    MG_STATE_GIFT_INPUT_EXIT,\n    MG_STATE_RECEIVE,\n    MG_STATE_SEND,\n    MG_STATE_SERVER_LINK_WAIT,\n    MG_STATE_SERVER_LINK_START,\n    MG_STATE_SERVER_LINK,\n    MG_STATE_SERVER_LINK_END,\n    MG_STATE_SERVER_LINK_END_WAIT,\n    MG_STATE_SERVER_RESULT_MSG,\n    MG_STATE_SERVER_ERROR,\n    MG_STATE_EXIT,\n};\n\nstatic void CreateMysteryGiftTask(void)\n{\n    u8 taskId = CreateTask(Task_MysteryGift, 0);\n    struct MysteryGiftTaskData * data = (void *)gTasks[taskId].data;\n    data->state = MG_STATE_TO_MAIN_MENU;\n    data->textState = 0;\n    data->unused4 = 0;\n    data->unused5 = 0;\n    data->isWonderNews = FALSE;\n    data->sourceIsFriend = FALSE;\n    data->var = 0;\n    data->unused1 = 0;\n    data->unused2 = 0;\n    data->unused3 = 0;\n    data->msgId = 0;\n    data->clientMsg = AllocZeroed(CLIENT_MAX_MSG_SIZE);\n}\n\nstatic void Task_MysteryGift(u8 taskId)\n{\n    struct MysteryGiftTaskData * data = (void *)gTasks[taskId].data;\n    bool32 successMsg, input;\n    const u8 * msg;\n\n    switch (data->state)\n    {\n    case MG_STATE_TO_MAIN_MENU:\n        data->state = MG_STATE_MAIN_MENU;\n        break;\n    case MG_STATE_MAIN_MENU:\n        // Main Mystery Gift menu, player can select Wonder Cards or News (or exit)\n        switch (MysteryGift_HandleThreeOptionMenu(&data->textState, &data->var, FALSE))\n        {\n        case 0: // \"Wonder Cards\"\n            data->isWonderNews = FALSE;\n            if (ValidateSavedWonderCard() == TRUE)\n                data->state = MG_STATE_LOAD_GIFT;\n            else\n                data->state = MG_STATE_DONT_HAVE_ANY;\n            break;\n        case 1: // \"Wonder News\"\n            data->isWonderNews = TRUE;\n            if (ValidateSavedWonderNews() == TRUE)\n                data->state = MG_STATE_LOAD_GIFT;\n            else\n                data->state = MG_STATE_DONT_HAVE_ANY;\n            break;\n        case LIST_CANCEL:\n            data->state = MG_STATE_EXIT;\n            break;\n        }\n        break;\n    case MG_STATE_DONT_HAVE_ANY:\n    {\n        // Player doesn't have any Wonder Card/News\n        // Start prompt to ask where to read one from\n        if (!data->isWonderNews)\n        {\n            if (PrintMysteryGiftMenuMessage(&data->textState, gText_DontHaveCardNewOneInput))\n            {\n                data->state = MG_STATE_SOURCE_PROMPT;\n                PrintMysteryGiftOrEReaderTopMenu(FALSE, TRUE);\n            }\n        }\n        else\n        {\n            if (PrintMysteryGiftMenuMessage(&data->textState, gText_DontHaveNewsNewOneInput))\n            {\n                data->state = MG_STATE_SOURCE_PROMPT;\n                PrintMysteryGiftOrEReaderTopMenu(FALSE, TRUE);\n            }\n        }\n        break;\n    }\n    case MG_STATE_SOURCE_PROMPT:\n        if (!data->isWonderNews)\n            AddTextPrinterToWindow1(gText_WhereShouldCardBeAccessed);\n        else\n            AddTextPrinterToWindow1(gText_WhereShouldNewsBeAccessed);\n        data->state = MG_STATE_SOURCE_PROMPT_INPUT;\n        break;\n    case MG_STATE_SOURCE_PROMPT_INPUT:\n        // Choose where to access the Wonder Card/News from\n        switch (MysteryGift_HandleThreeOptionMenu(&data->textState, &data->var, TRUE))\n        {\n        case 0: // \"Wireless Communication\"\n            ClearTextWindow();\n            data->state = MG_STATE_CLIENT_LINK_START;\n            data->sourceIsFriend = FALSE;\n            break;\n        case 1: // \"Friend\"\n            ClearTextWindow();\n            data->state = MG_STATE_CLIENT_LINK_START;\n            data->sourceIsFriend = TRUE;\n            break;\n        case LIST_CANCEL:\n            ClearTextWindow();\n            if (ValidateCardOrNews(data->isWonderNews))\n            {\n                data->state = MG_STATE_LOAD_GIFT;\n            }\n            else\n            {\n                data->state = MG_STATE_TO_MAIN_MENU;\n                PrintMysteryGiftOrEReaderTopMenu(FALSE, FALSE);\n            }\n            break;\n        }\n        break;\n    case MG_STATE_CLIENT_LINK_START:\n        *gStringVar1 = EOS;\n        *gStringVar2 = EOS;\n        *gStringVar3 = EOS;\n\n        switch (data->isWonderNews)\n        {\n        case FALSE:\n            if (data->sourceIsFriend == TRUE)\n                CreateTask_LinkMysteryGiftWithFriend(ACTIVITY_WONDER_CARD);\n            else if (data->sourceIsFriend == FALSE)\n                CreateTask_LinkMysteryGiftOverWireless(ACTIVITY_WONDER_CARD);\n            break;\n        case TRUE:\n            if (data->sourceIsFriend == TRUE)\n                CreateTask_LinkMysteryGiftWithFriend(ACTIVITY_WONDER_NEWS);\n            else if (data->sourceIsFriend == FALSE)\n                CreateTask_LinkMysteryGiftOverWireless(ACTIVITY_WONDER_NEWS);\n            break;\n        }\n        data->state = MG_STATE_CLIENT_LINK_WAIT;\n        break;\n    case MG_STATE_CLIENT_LINK_WAIT:\n        if (gReceivedRemoteLinkPlayers)\n        {\n            ClearScreenInBg0(TRUE);\n            data->state = MG_STATE_CLIENT_COMMUNICATING;\n            MysteryGiftClient_Create();\n        }\n        else if (gSpecialVar_Result == LINKUP_FAILED)\n        {\n            // Link failed, return to link start menu\n            ClearScreenInBg0(TRUE);\n            data->state = MG_STATE_SOURCE_PROMPT;\n        }\n        break;\n    case MG_STATE_CLIENT_COMMUNICATING:\n        AddTextPrinterToWindow1(gText_Communicating);\n        data->state = MG_STATE_CLIENT_LINK;\n        break;\n    case MG_STATE_CLIENT_LINK:\n        switch (MysteryGiftClient_Run(&data->var))\n        {\n        case CLI_RET_END:\n            Rfu_SetCloseLinkCallback();\n            data->msgId = data->var;\n            data->state = MG_STATE_CLIENT_LINK_END;\n            break;\n        case CLI_RET_COPY_MSG:\n            memcpy(data->clientMsg, MysteryGiftClient_GetMsg(), CLIENT_MAX_MSG_SIZE);\n            MysteryGiftClient_AdvanceState();\n            break;\n        case CLI_RET_PRINT_MSG:\n            data->state = MG_STATE_CLIENT_MESSAGE;\n            break;\n        case CLI_RET_YES_NO:\n            data->state = MG_STATE_CLIENT_YES_NO;\n            break;\n        case CLI_RET_ASK_TOSS:\n            data->state = MG_STATE_CLIENT_ASK_TOSS;\n            StringCopy(gStringVar1, gLinkPlayers[0].name);\n            break;\n        }\n        break;\n    case MG_STATE_CLIENT_YES_NO:\n        input = DoMysteryGiftYesNo(&data->textState, &data->var, FALSE, MysteryGiftClient_GetMsg());\n        switch (input)\n        {\n        case 0: // Yes\n            MysteryGiftClient_SetParam(FALSE);\n            MysteryGiftClient_AdvanceState();\n            data->state = MG_STATE_CLIENT_COMMUNICATING;\n            break;\n        case 1: // No\n        case MENU_B_PRESSED:\n            MysteryGiftClient_SetParam(TRUE);\n            MysteryGiftClient_AdvanceState();\n            data->state = MG_STATE_CLIENT_COMMUNICATING;\n            break;\n        }\n        break;\n    case MG_STATE_CLIENT_MESSAGE:\n        if (PrintMysteryGiftMenuMessage(&data->textState, MysteryGiftClient_GetMsg()))\n        {\n            MysteryGiftClient_AdvanceState();\n            data->state = MG_STATE_CLIENT_COMMUNICATING;\n        }\n        break;\n    case MG_STATE_CLIENT_ASK_TOSS:\n        // Player is receiving a new Wonder Card/News but needs to toss an existing one to make room.\n        // Ask for confirmation.\n        input = DoMysteryGiftYesNo(&data->textState, &data->var, FALSE, gText_ThrowAwayWonderCard);\n        switch (input)\n        {\n        case 0: // Yes\n            if (IsSavedWonderCardGiftNotReceived() == TRUE)\n            {\n                data->state = MG_STATE_CLIENT_ASK_TOSS_UNRECEIVED;\n            }\n            else\n            {\n                MysteryGiftClient_SetParam(FALSE);\n                MysteryGiftClient_AdvanceState();\n                data->state = MG_STATE_CLIENT_COMMUNICATING;\n            }\n            break;\n        case 1: // No\n        case MENU_B_PRESSED:\n            MysteryGiftClient_SetParam(TRUE);\n            MysteryGiftClient_AdvanceState();\n            data->state = MG_STATE_CLIENT_COMMUNICATING;\n            break;\n        }\n        break;\n    case MG_STATE_CLIENT_ASK_TOSS_UNRECEIVED:\n        // Player has selected to toss a Wonder Card that they haven't received the gift for.\n        // Ask for confirmation again.\n        input = DoMysteryGiftYesNo(&data->textState, &data->var, FALSE, gText_HaventReceivedCardsGift);\n        switch (input)\n        {\n        case 0: // Yes\n            MysteryGiftClient_SetParam(FALSE);\n            MysteryGiftClient_AdvanceState();\n            data->state = MG_STATE_CLIENT_COMMUNICATING;\n            break;\n        case 1: // No\n        case MENU_B_PRESSED:\n            MysteryGiftClient_SetParam(TRUE);\n            MysteryGiftClient_AdvanceState();\n            data->state = MG_STATE_CLIENT_COMMUNICATING;\n            break;\n        }\n        break;\n    case MG_STATE_CLIENT_LINK_END:\n        if (IsLinkRfuTaskFinished())\n        {\n            DestroyWirelessStatusIndicatorSprite();\n            data->state = MG_STATE_CLIENT_COMM_COMPLETED;\n        }\n        break;\n    case MG_STATE_CLIENT_COMM_COMPLETED:\n        if (PrintStringAndWait2Seconds(&data->textState, gText_CommunicationCompleted))\n        {\n            if (data->sourceIsFriend == TRUE)\n                StringCopy(gStringVar1, gLinkPlayers[0].name);\n            data->state = MG_STATE_CLIENT_RESULT_MSG;\n        }\n        break;\n    case MG_STATE_CLIENT_RESULT_MSG:\n        msg = GetClientResultMessage(&successMsg, data->isWonderNews, data->sourceIsFriend, data->msgId);\n        if (msg == NULL)\n            msg = data->clientMsg;\n        if (successMsg)\n            input = PrintSuccessMessage(&data->textState, msg, &data->var);\n        else\n            input = PrintMysteryGiftMenuMessage(&data->textState, msg);\n\n        // input var re-used, here it is TRUE if the message is finished\n        if (input)\n        {\n            if (data->msgId == CLI_MSG_NEWS_RECEIVED)\n            {\n                if (data->sourceIsFriend == TRUE)\n                    WonderNews_SetReward(WONDER_NEWS_RECV_FRIEND);\n                else\n                    WonderNews_SetReward(WONDER_NEWS_RECV_WIRELESS);\n            }\n            if (!successMsg)\n            {\n                // Did not receive card/news, return to main menu\n                data->state = MG_STATE_TO_MAIN_MENU;\n                PrintMysteryGiftOrEReaderTopMenu(FALSE, FALSE);\n            }\n            else\n            {\n                data->state = MG_STATE_SAVE_LOAD_GIFT;\n            }\n        }\n        break;\n    case MG_STATE_SAVE_LOAD_GIFT:\n        if (SaveOnMysteryGiftMenu(&data->textState))\n        {\n            data->state = MG_STATE_TO_MAIN_MENU;\n            PrintMysteryGiftOrEReaderTopMenu(FALSE, FALSE);\n        }\n        break;\n    case MG_STATE_LOAD_GIFT:\n        if (HandleLoadWonderCardOrNews(&data->textState, data->isWonderNews))\n            data->state = MG_STATE_HANDLE_GIFT_INPUT;\n        break;\n    case MG_STATE_HANDLE_GIFT_INPUT:\n        if (!data->isWonderNews)\n        {\n            // Handle Wonder Card input\n            if (JOY_NEW(A_BUTTON))\n                data->state = MG_STATE_HANDLE_GIFT_SELECT;\n            if (JOY_NEW(B_BUTTON))\n                data->state = MG_STATE_GIFT_INPUT_EXIT;\n        }\n        else\n        {\n            switch (WonderNews_GetInput(gMain.newKeys))\n            {\n            case NEWS_INPUT_A:\n                WonderNews_RemoveScrollIndicatorArrowPair();\n                data->state = MG_STATE_HANDLE_GIFT_SELECT;\n                break;\n            case NEWS_INPUT_B:\n                data->state = MG_STATE_GIFT_INPUT_EXIT;\n                break;\n            }\n        }\n        break;\n    case MG_STATE_HANDLE_GIFT_SELECT:\n    {\n        // A Wonder Card/News has been selected, handle its menu\n        u32 result;\n        if (!data->isWonderNews)\n        {\n            if (IsSendingSavedWonderCardAllowed())\n                result = HandleMysteryGiftListMenu(&data->textState, &data->var, data->isWonderNews, FALSE);\n            else\n                result = HandleMysteryGiftListMenu(&data->textState, &data->var, data->isWonderNews, TRUE);\n        }\n        else\n        {\n            if (IsSendingSavedWonderNewsAllowed())\n                result = HandleMysteryGiftListMenu(&data->textState, &data->var, data->isWonderNews, FALSE);\n            else\n                result = HandleMysteryGiftListMenu(&data->textState, &data->var, data->isWonderNews, TRUE);\n        }\n        switch (result)\n        {\n        case 0: // Receive\n            data->state = MG_STATE_RECEIVE;\n            break;\n        case 1: // Send\n            data->state = MG_STATE_SEND;\n            break;\n        case 2: // Toss\n            data->state = MG_STATE_ASK_TOSS;\n            break;\n        case LIST_CANCEL:\n            if (data->isWonderNews == TRUE)\n                WonderNews_AddScrollIndicatorArrowPair();\n            data->state = MG_STATE_HANDLE_GIFT_INPUT;\n            break;\n        }\n        break;\n    }\n    case MG_STATE_ASK_TOSS:\n        // Player is attempting to discard a saved Wonder Card/News\n        switch (AskDiscardGift(&data->textState, &data->var, data->isWonderNews))\n        {\n        case 0: // Yes\n            if (!data->isWonderNews && IsSavedWonderCardGiftNotReceived() == TRUE)\n                data->state = MG_STATE_ASK_TOSS_UNRECEIVED;\n            else\n                data->state = MG_STATE_TOSS;\n            break;\n        case 1: // No\n        case MENU_B_PRESSED:\n            data->state = MG_STATE_HANDLE_GIFT_SELECT;\n            break;\n        }\n        break;\n    case MG_STATE_ASK_TOSS_UNRECEIVED:\n        // Player has selected to toss a Wonder Card that they haven't received the gift for.\n        // Ask for confirmation again.\n        switch ((u32)DoMysteryGiftYesNo(&data->textState, &data->var, TRUE, gText_HaventReceivedGiftOkayToDiscard))\n        {\n        case 0: // Yes\n            data->state = MG_STATE_TOSS;\n            break;\n        case 1: // No\n        case MENU_B_PRESSED:\n            data->state = MG_STATE_HANDLE_GIFT_SELECT;\n            break;\n        }\n        break;\n    case MG_STATE_TOSS:\n        if (ExitWonderCardOrNews(data->isWonderNews, TRUE))\n        {\n            ClearSavedNewsOrCard(data->isWonderNews);\n            data->state = MG_STATE_TOSS_SAVE;\n        }\n        break;\n    case MG_STATE_TOSS_SAVE:\n        if (SaveOnMysteryGiftMenu(&data->textState))\n            data->state = MG_STATE_TOSSED;\n        break;\n    case MG_STATE_TOSSED:\n        if (PrintThrownAway(&data->textState, data->isWonderNews))\n        {\n            data->state = MG_STATE_TO_MAIN_MENU;\n            PrintMysteryGiftOrEReaderTopMenu(FALSE, FALSE);\n        }\n        break;\n    case MG_STATE_GIFT_INPUT_EXIT:\n        if (ExitWonderCardOrNews(data->isWonderNews, FALSE))\n            data->state = MG_STATE_TO_MAIN_MENU;\n        break;\n    case MG_STATE_RECEIVE:\n        if (ExitWonderCardOrNews(data->isWonderNews, TRUE))\n            data->state = MG_STATE_SOURCE_PROMPT;\n        break;\n    case MG_STATE_SEND:\n        if (ExitWonderCardOrNews(data->isWonderNews, TRUE))\n        {\n            switch (data->isWonderNews)\n            {\n            case FALSE:\n                CreateTask_SendMysteryGift(ACTIVITY_WONDER_CARD);\n                break;\n            case TRUE:\n                CreateTask_SendMysteryGift(ACTIVITY_WONDER_NEWS);\n                break;\n            }\n            data->sourceIsFriend = TRUE;\n            data->state = MG_STATE_SERVER_LINK_WAIT;\n        }\n        break;\n    case MG_STATE_SERVER_LINK_WAIT:\n        if (gReceivedRemoteLinkPlayers)\n        {\n            ClearScreenInBg0(TRUE);\n            data->state = MG_STATE_SERVER_LINK_START;\n        }\n        else if (gSpecialVar_Result == LINKUP_FAILED)\n        {\n            ClearScreenInBg0(TRUE);\n            data->state = MG_STATE_LOAD_GIFT;\n        }\n        break;\n    case MG_STATE_SERVER_LINK_START:\n        *gStringVar1 = EOS;\n        *gStringVar2 = EOS;\n        *gStringVar3 = EOS;\n        if (!data->isWonderNews)\n        {\n            AddTextPrinterToWindow1(gText_SendingWonderCard);\n            MysterGiftServer_CreateForCard();\n        }\n        else\n        {\n            AddTextPrinterToWindow1(gText_SendingWonderNews);\n            MysterGiftServer_CreateForNews();\n        }\n        data->state = MG_STATE_SERVER_LINK;\n        break;\n    case MG_STATE_SERVER_LINK:\n        if (MysterGiftServer_Run(&data->var) == SVR_RET_END)\n        {\n            data->msgId = data->var;\n            data->state = MG_STATE_SERVER_LINK_END;\n        }\n        break;\n    case MG_STATE_SERVER_LINK_END:\n        Rfu_SetCloseLinkCallback();\n        StringCopy(gStringVar1, gLinkPlayers[1].name);\n        data->state = MG_STATE_SERVER_LINK_END_WAIT;\n        break;\n    case MG_STATE_SERVER_LINK_END_WAIT:\n        if (IsLinkRfuTaskFinished())\n        {\n            DestroyWirelessStatusIndicatorSprite();\n            data->state = MG_STATE_SERVER_RESULT_MSG;\n        }\n        break;\n    case MG_STATE_SERVER_RESULT_MSG:\n        if (PrintServerResultMessage(&data->textState, &data->var, data->sourceIsFriend, data->msgId))\n        {\n            if (data->sourceIsFriend == TRUE && data->msgId == SVR_MSG_NEWS_SENT)\n            {\n                WonderNews_SetReward(WONDER_NEWS_SENT);\n                data->state = MG_STATE_SAVE_LOAD_GIFT;\n            }\n            else\n            {\n                data->state = MG_STATE_TO_MAIN_MENU;\n                PrintMysteryGiftOrEReaderTopMenu(FALSE, FALSE);\n            }\n        }\n        break;\n    case MG_STATE_CLIENT_ERROR:\n    case MG_STATE_SERVER_ERROR:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gText_CommunicationError))\n        {\n            data->state = MG_STATE_TO_MAIN_MENU;\n            PrintMysteryGiftOrEReaderTopMenu(FALSE, FALSE);\n        }\n        break;\n    case MG_STATE_EXIT:\n        CloseLink();\n        HelpSystem_Enable();\n        Free(data->clientMsg);\n        DestroyTask(taskId);\n        SetMainCallback2(MainCB_FreeAllBuffersAndReturnToInitTitleScreen);\n        break;\n    }\n}\n\nu16 GetMysteryGiftBaseBlock(void)\n{\n    return 0x19B;\n}\n"
  },
  {
    "path": "src/mystery_gift_scripts.c",
    "content": "#include \"global.h\"\n#include \"mystery_gift_server.h\"\n#include \"mystery_gift_client.h\"\n#include \"constants/mystery_gift.h\"\n\nextern const struct MysteryGiftServerCmd gServerScript_ClientCanceledCard[];\n\n// Unreferenced\nstatic const u8 sText_CollectedAllStamps[] = _(\"You have collected all STAMPs!\\nWant to input a CARD as a prize?\");\n\n//==================\n// Client scripts\n//==================\n\nconst struct MysteryGiftClientCmd gMysteryGiftClientScript_Init[] = {\n    {CLI_RECV, MG_LINKID_CLIENT_SCRIPT},\n    {CLI_COPY_RECV}\n};\n\nstatic const struct MysteryGiftClientCmd sClientScript_SendGameData[] = {\n    {CLI_LOAD_GAME_DATA},\n    {CLI_SEND_LOADED},\n    {CLI_RECV, MG_LINKID_CLIENT_SCRIPT},\n    {CLI_COPY_RECV}\n};\n\nstatic const struct MysteryGiftClientCmd sClientScript_CantAccept[] = {\n    {CLI_SEND_READY_END},\n    {CLI_RETURN, CLI_MSG_CANT_ACCEPT}\n};\n\nstatic const struct MysteryGiftClientCmd sClientScript_CommError[] = {\n    {CLI_SEND_READY_END},\n    {CLI_RETURN, CLI_MSG_COMM_ERROR}\n};\n\nstatic const struct MysteryGiftClientCmd sClientScript_NothingSent[] = {\n    {CLI_SEND_READY_END},\n    {CLI_RETURN, CLI_MSG_NOTHING_SENT}\n};\n\nstatic const struct MysteryGiftClientCmd sClientScript_SaveCard[] = {\n    {CLI_RECV, MG_LINKID_CARD},\n    {CLI_SAVE_CARD},\n    {CLI_RECV, MG_LINKID_RAM_SCRIPT},\n    {CLI_SAVE_RAM_SCRIPT},\n    {CLI_SEND_READY_END},\n    {CLI_RETURN, CLI_MSG_CARD_RECEIVED}\n};\n\nstatic const struct MysteryGiftClientCmd sClientScript_SaveNews[] = {\n    {CLI_RECV, MG_LINKID_NEWS},\n    {CLI_SAVE_NEWS},\n    {CLI_SEND_LOADED}, // Send whether or not the News was saved (read by sServerScript_SendNews)\n    {CLI_RECV, MG_LINKID_CLIENT_SCRIPT},\n    {CLI_COPY_RECV}\n};\n\nstatic const struct MysteryGiftClientCmd sClientScript_HadNews[] = {\n    {CLI_SEND_READY_END},\n    {CLI_RETURN, CLI_MSG_HAD_NEWS}\n};\n\nstatic const struct MysteryGiftClientCmd sClientScript_NewsReceived[] = {\n    {CLI_SEND_READY_END},\n    {CLI_RETURN, CLI_MSG_NEWS_RECEIVED}\n};\n\nstatic const struct MysteryGiftClientCmd sClientScript_AskToss[] = {\n    {CLI_ASK_TOSS},\n    {CLI_LOAD_TOSS_RESPONSE},\n    {CLI_SEND_LOADED},\n    {CLI_RECV, MG_LINKID_CLIENT_SCRIPT},\n    {CLI_COPY_RECV}\n};\n\nstatic const struct MysteryGiftClientCmd sClientScript_Canceled[] = {\n    {CLI_SEND_READY_END},\n    {CLI_RETURN, CLI_MSG_COMM_CANCELED}\n};\n\nstatic const struct MysteryGiftClientCmd sClientScript_HadCard[] = {\n    {CLI_SEND_READY_END},\n    {CLI_RETURN, CLI_MSG_HAD_CARD}\n};\n\nstatic const struct MysteryGiftClientCmd sClientScript_DynamicSuccess[] = {\n    {CLI_RECV, MG_LINKID_DYNAMIC_MSG},\n    {CLI_COPY_MSG},\n    {CLI_SEND_READY_END},\n    {CLI_RETURN, CLI_MSG_BUFFER_SUCCESS}\n};\n\n//==================\n// Server scripts\n//==================\n\nstatic const struct MysteryGiftServerCmd sServerScript_CantSend[] = {\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_CantAccept)},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_READY_END},\n    {SVR_RETURN, SVR_MSG_CANT_SEND_GIFT_1}\n};\n\nstatic const struct MysteryGiftServerCmd sServerScript_CommError[] = {\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_CommError)},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_READY_END},\n    {SVR_RETURN, SVR_MSG_COMM_ERROR}\n};\n\nstatic const struct MysteryGiftServerCmd sServerScript_ClientCanceledNews[] = {\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_Canceled)},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_READY_END},\n    {SVR_RETURN, SVR_MSG_CLIENT_CANCELED}\n};\n\nstatic const struct MysteryGiftServerCmd sServerScript_HasNews[] = {\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_HadNews)},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_READY_END},\n    {SVR_RETURN, SVR_MSG_HAS_NEWS}\n};\n\nstatic const struct MysteryGiftServerCmd sServerScript_SendNews[] = {\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_SaveNews)},\n    {SVR_SEND},\n    {SVR_LOAD_NEWS},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_RESPONSE},\n    {SVR_READ_RESPONSE},\n    {SVR_GOTO_IF_EQ, TRUE, sServerScript_HasNews}, // Wonder News was not saved\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_NewsReceived)},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_READY_END},\n    {SVR_RETURN, SVR_MSG_NEWS_SENT}\n};\n\nstatic const struct MysteryGiftServerCmd sServerScript_SendCard[] = {\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_SaveCard)},\n    {SVR_SEND},\n    {SVR_LOAD_CARD},\n    {SVR_SEND},\n    {SVR_LOAD_RAM_SCRIPT},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_READY_END},\n    {SVR_RETURN, SVR_MSG_CARD_SENT}\n};\n\nstatic const struct MysteryGiftServerCmd sServerScript_TossPrompt[] = {\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_AskToss)},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_RESPONSE},\n    {SVR_READ_RESPONSE},\n    {SVR_GOTO_IF_EQ, FALSE, sServerScript_SendCard},    // Tossed old card, send new one\n    {SVR_GOTO, .ptr = gServerScript_ClientCanceledCard} // Kept old card, cancel new one\n};\n\nstatic const struct MysteryGiftServerCmd sServerScript_HasCard[] = {\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_HadCard)},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_READY_END},\n    {SVR_RETURN, SVR_MSG_HAS_CARD}\n};\n\nstatic const struct MysteryGiftServerCmd sServerScript_NothingSent[] = {\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_NothingSent)},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_READY_END},\n    {SVR_RETURN, SVR_MSG_NOTHING_SENT}\n};\n\nconst struct MysteryGiftServerCmd gMysteryGiftServerScript_SendWonderNews[] = {\n    {SVR_COPY_SAVED_NEWS},\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_SendGameData)},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_GAME_DATA},\n    {SVR_COPY_GAME_DATA},\n    {SVR_CHECK_GAME_DATA},\n    {SVR_GOTO_IF_EQ, FALSE, sServerScript_CantSend},\n    {SVR_GOTO, .ptr = sServerScript_SendNews},\n};\n\nconst struct MysteryGiftServerCmd gMysteryGiftServerScript_SendWonderCard[] = {\n    {SVR_COPY_SAVED_CARD},\n    {SVR_COPY_SAVED_RAM_SCRIPT},\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_SendGameData)},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_GAME_DATA},\n    {SVR_COPY_GAME_DATA},\n    {SVR_CHECK_GAME_DATA},\n    {SVR_GOTO_IF_EQ, FALSE, sServerScript_CantSend},\n    {SVR_CHECK_EXISTING_CARD},\n    {SVR_GOTO_IF_EQ, HAS_DIFF_CARD, sServerScript_TossPrompt},\n    {SVR_GOTO_IF_EQ, HAS_NO_CARD, sServerScript_SendCard},\n    {SVR_GOTO, .ptr = sServerScript_HasCard} // HAS_SAME_CARD\n};\n"
  },
  {
    "path": "src/mystery_gift_server.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"script.h\"\n#include \"mystery_gift.h\"\n#include \"mystery_gift_server.h\"\n\n// Assert statements use the original GF names, which are defined below.\n// Note that their name \"flag\" is especially misleading,\n// as it's not a boolean (for example it can contain a size argument).\n// 'parameter' is shortened to param explicitly to avoid a collision with\n// the original name for a different field.\n#define mainseqno funcId\n#define func_tbl sFuncTable\n#define parameter ptr\n#define flag param\n#define ME_SEND_BUF_SIZE MG_LINK_BUFFER_SIZE\n#define FILE ABSPATH(\"mevent_server.c\")\n\n#define ASSERT_PTR_EMPTY(lineNum)       AGB_ASSERT_EX(cmd->parameter == NULL,                       FILE, (lineNum));\n#define ASSERT_PARAM_EMPTY(lineNum)     AGB_ASSERT_EX(cmd->flag == FALSE,                           FILE, (lineNum));\n#define ASSERT_PTR_PARAM_EMPTY(lineNum) AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, FILE, (lineNum));\n#define ASSERT_VALID_FUNC(lineNum)      AGB_ASSERT_EX(svr->mainseqno < NELEMS(func_tbl),            FILE, (lineNum));\n#define ASSERT_SIZE_OK(lineNum)         AGB_ASSERT_EX(size <= ME_SEND_BUF_SIZE,                     FILE, (lineNum));\n\nenum {\n    FUNC_INIT,\n    FUNC_DONE,\n    FUNC_RECV,\n    FUNC_SEND,\n    FUNC_RUN,\n};\n\nstatic EWRAM_DATA struct MysteryGiftServer * sServer = NULL;\n\nstatic void MysteryGiftServer_Init(struct MysteryGiftServer *, const void *, u32, u32);\nstatic void MysteryGiftServer_Free(struct MysteryGiftServer *);\nstatic u32 MysteryGiftServer_CallFunc(struct MysteryGiftServer *);\n\nextern const struct MysteryGiftServerCmd gMysteryGiftServerScript_SendWonderNews[];\nextern const struct MysteryGiftServerCmd gMysteryGiftServerScript_SendWonderCard[];\n\nvoid MysterGiftServer_CreateForNews(void)\n{\n    sServer = AllocZeroed(sizeof(*sServer));\n    MysteryGiftServer_Init(sServer, gMysteryGiftServerScript_SendWonderNews, 0, 1);\n}\n\nvoid MysterGiftServer_CreateForCard(void)\n{\n    sServer = AllocZeroed(sizeof(*sServer));\n    MysteryGiftServer_Init(sServer, gMysteryGiftServerScript_SendWonderCard, 0, 1);\n}\n\nu32 MysterGiftServer_Run(u16 * endVal)\n{\n    u32 result;\n    if (sServer == NULL)\n        return SVR_RET_END;\n    result = MysteryGiftServer_CallFunc(sServer);\n    if (result == SVR_RET_END)\n    {\n        *endVal = sServer->param;\n        MysteryGiftServer_Free(sServer);\n        FREE_AND_SET_NULL(sServer);\n    }\n    return result;\n}\n\nstatic void MysteryGiftServer_Init(struct MysteryGiftServer * svr, const void *script, u32 sendPlayerId, u32 recvPlayerId)\n{\n    svr->unused = 0;\n    svr->funcId = FUNC_INIT;\n    svr->card = AllocZeroed(sizeof(*svr->card));\n    svr->news = AllocZeroed(sizeof(*svr->news));\n    svr->recvBuffer = AllocZeroed(MG_LINK_BUFFER_SIZE);\n    svr->linkGameData = AllocZeroed(sizeof(*svr->linkGameData));\n    svr->script = script;\n    svr->cmdidx = 0;\n    MysteryGiftLink_Init(&svr->manager, sendPlayerId, recvPlayerId);\n}\n\nstatic void MysteryGiftServer_Free(struct MysteryGiftServer * svr)\n{\n    Free(svr->card);\n    Free(svr->news);\n    Free(svr->recvBuffer);\n    Free(svr->linkGameData);\n}\n\nstatic void MysteryGiftServer_InitSend(struct MysteryGiftServer * svr, u32 ident, const void *src, u32 size)\n{\n    ASSERT_SIZE_OK(257);\n    MysteryGiftLink_InitSend(&svr->manager, ident, src, size);\n}\n\n// Given the command pointer parameter and the 'default' normal data.\n// If the command's pointer is not empty use that as the send data, otherwise use the default.\nstatic const void *MysteryGiftServer_GetSendData(const void *dynamicData, const void *defaultData)\n{\n    if (dynamicData != NULL)\n        return dynamicData;\n    else\n        return defaultData;\n}\n\nstatic u32 MysteryGiftServer_Compare(const void *a, const void *b)\n{\n    if (b < a)\n        return 0;\n    else if (b == a)\n        return 1;\n    else\n        return 2;\n}\n\nstatic u32 Server_Init(struct MysteryGiftServer * svr)\n{\n    svr->funcId = FUNC_RUN;\n    return SVR_RET_INIT;\n}\n\nstatic u32 Server_Done(struct MysteryGiftServer * svr)\n{\n    return SVR_RET_END;\n}\n\nstatic u32 Server_Recv(struct MysteryGiftServer * svr)\n{\n    if (MysteryGiftLink_Recv(&svr->manager))\n        svr->funcId = FUNC_RUN;\n    return SVR_RET_ACTIVE;\n}\n\nstatic u32 Server_Send(struct MysteryGiftServer * svr)\n{\n    if (MysteryGiftLink_Send(&svr->manager))\n        svr->funcId = FUNC_RUN;\n    return SVR_RET_ACTIVE;\n}\n\nstatic u32 Server_Run(struct MysteryGiftServer * svr)\n{\n    // process command\n    const struct MysteryGiftServerCmd * cmd = &svr->script[svr->cmdidx];\n    const void *ptr;\n    svr->cmdidx++;\n\n    switch (cmd->instr)\n    {\n    case SVR_RETURN:\n        ASSERT_PTR_EMPTY(354);\n        svr->funcId = FUNC_DONE;\n        svr->param = cmd->param; // Set for endVal in MysteryGiftServer_Run\n        break;\n    case SVR_SEND:\n        svr->funcId = FUNC_SEND;\n        break;\n    case SVR_RECV:\n        ASSERT_PTR_EMPTY(364);\n        MysteryGiftLink_InitRecv(&svr->manager, cmd->param, svr->recvBuffer);\n        svr->funcId = FUNC_RECV;\n        break;\n    case SVR_GOTO:\n        ASSERT_PARAM_EMPTY(370);\n        svr->cmdidx = 0;\n        svr->script = cmd->ptr;\n        break;\n    case SVR_COPY_GAME_DATA:\n        ASSERT_PARAM_EMPTY(376);\n        ASSERT_PTR_EMPTY(377);\n        memcpy(svr->linkGameData, svr->recvBuffer, sizeof(*svr->linkGameData));\n        break;\n    case SVR_CHECK_GAME_DATA:\n        ASSERT_PARAM_EMPTY(382);\n        ASSERT_PTR_EMPTY(383);\n        svr->param = MysteryGift_ValidateLinkGameData(svr->linkGameData);\n        break;\n    case SVR_GOTO_IF_EQ:\n        if (svr->param == cmd->param)\n        {\n            svr->cmdidx = 0;\n            svr->script = cmd->ptr;\n        }\n        break;\n    case SVR_CHECK_EXISTING_CARD:\n        ASSERT_PARAM_EMPTY(396);\n        ptr = MysteryGiftServer_GetSendData(cmd->ptr, svr->card);\n        svr->param = MysteryGift_CompareCardFlags(ptr, svr->linkGameData, ptr);\n        break;\n    case SVR_READ_RESPONSE:\n        ASSERT_PARAM_EMPTY(402);\n        ASSERT_PTR_EMPTY(403);\n        svr->param = *(u32 *)svr->recvBuffer;\n        break;\n    case SVR_CHECK_EXISTING_STAMPS:\n        ASSERT_PARAM_EMPTY(408);\n        ptr = MysteryGiftServer_GetSendData(cmd->ptr, &svr->stamp);\n        svr->param = MysteryGift_CheckStamps(ptr, svr->linkGameData, ptr);\n        break;\n    case SVR_GET_CARD_STAT:\n        ASSERT_PTR_EMPTY(415);\n        svr->param = MysteryGift_GetCardStatFromLinkData(svr->linkGameData, cmd->param);\n        break;\n    case SVR_CHECK_QUESTIONNAIRE:\n        ASSERT_PARAM_EMPTY(420);\n        svr->param = MysteryGift_DoesQuestionnaireMatch(svr->linkGameData, cmd->ptr);\n        break;\n    case SVR_COMPARE:\n        ASSERT_PARAM_EMPTY(426);\n        svr->param = MysteryGiftServer_Compare(cmd->ptr, *(void **)svr->recvBuffer);\n        break;\n    case SVR_LOAD_NEWS:\n        ASSERT_PARAM_EMPTY(432);\n        MysteryGiftServer_InitSend(svr, MG_LINKID_NEWS, MysteryGiftServer_GetSendData(cmd->ptr, svr->news), sizeof(struct WonderNews));\n        break;\n    case SVR_LOAD_CARD:\n        ASSERT_PARAM_EMPTY(438);\n        MysteryGiftServer_InitSend(svr, MG_LINKID_CARD, MysteryGiftServer_GetSendData(cmd->ptr, svr->card), sizeof(struct WonderCard));\n        break;\n    case SVR_LOAD_STAMP:\n        ASSERT_PARAM_EMPTY(444);\n        MysteryGiftServer_InitSend(svr, MG_LINKID_STAMP, MysteryGiftServer_GetSendData(cmd->ptr, &svr->stamp), sizeof(svr->stamp));\n        break;\n    case SVR_LOAD_RAM_SCRIPT:\n        if (cmd->ptr == NULL)\n            MysteryGiftServer_InitSend(svr, MG_LINKID_RAM_SCRIPT, svr->ramScript, svr->ramScriptSize);\n        else\n            MysteryGiftServer_InitSend(svr, MG_LINKID_RAM_SCRIPT, cmd->ptr, cmd->param);\n        break;\n    case SVR_LOAD_CLIENT_SCRIPT:\n        if (cmd->ptr == NULL)\n            MysteryGiftServer_InitSend(svr, MG_LINKID_CLIENT_SCRIPT, svr->clientScript, svr->clientScriptSize);\n        else\n            MysteryGiftServer_InitSend(svr, MG_LINKID_CLIENT_SCRIPT, cmd->ptr, cmd->param);\n        break;\n    case SVR_LOAD_EREADER_TRAINER:\n        ASSERT_PARAM_EMPTY(466);\n        MysteryGiftServer_InitSend(svr, MG_LINKID_EREADER_TRAINER, cmd->ptr, sizeof(struct BattleTowerEReaderTrainer));\n        break;\n    case SVR_LOAD_MSG:\n        MysteryGiftServer_InitSend(svr, MG_LINKID_DYNAMIC_MSG, cmd->ptr, cmd->param);\n        break;\n    case SVR_LOAD_UNK_2:\n        MysteryGiftServer_InitSend(svr, MG_LINKID_UNK_2, cmd->ptr, cmd->param);\n        break;\n    case SVR_COPY_CARD:\n        ASSERT_PARAM_EMPTY(481);\n        memcpy(svr->card, cmd->ptr, sizeof(*svr->card));\n        break;\n    case SVR_COPY_NEWS:\n        ASSERT_PARAM_EMPTY(486);\n        memcpy(svr->news, cmd->ptr, sizeof(*svr->news));\n        break;\n    case SVR_COPY_STAMP:\n        ASSERT_PARAM_EMPTY(491);\n        svr->stamp = *(u32 *)cmd->ptr;\n        break;\n    case SVR_SET_RAM_SCRIPT:\n        svr->ramScript = cmd->ptr;\n        svr->ramScriptSize = cmd->param;\n        break;\n    case SVR_SET_CLIENT_SCRIPT:\n        svr->clientScript = cmd->ptr;\n        svr->clientScriptSize = cmd->param;\n        break;\n    case SVR_COPY_SAVED_CARD:\n        ASSERT_PTR_PARAM_EMPTY(506);\n        memcpy(svr->card, GetSavedWonderCard(), sizeof(*svr->card));\n        DisableWonderCardSending(svr->card);\n        break;\n    case SVR_COPY_SAVED_NEWS:\n        ASSERT_PTR_PARAM_EMPTY(512);\n        memcpy(svr->news, GetSavedWonderNews(), sizeof(*svr->news));\n        break;\n    case SVR_COPY_SAVED_RAM_SCRIPT:\n        ASSERT_PTR_PARAM_EMPTY(517);\n        svr->ramScript = GetSavedRamScriptIfValid();\n        break;\n    case SVR_LOAD_UNK_1:\n        MysteryGiftServer_InitSend(svr, MG_LINKID_UNK_1, cmd->ptr, cmd->param);\n        break;\n    }\n\n    return SVR_RET_ACTIVE;\n}\n\nstatic u32 (*const sFuncTable[])(struct MysteryGiftServer *) = {\n    [FUNC_INIT] = Server_Init,\n    [FUNC_DONE] = Server_Done,\n    [FUNC_RECV] = Server_Recv,\n    [FUNC_SEND] = Server_Send,\n    [FUNC_RUN] = Server_Run\n};\n\nstatic u32 MysteryGiftServer_CallFunc(struct MysteryGiftServer * svr)\n{\n    u32 response;\n    ASSERT_VALID_FUNC(546)\n    response = sFuncTable[svr->funcId](svr);\n    ASSERT_VALID_FUNC(548)\n    return response;\n}\n"
  },
  {
    "path": "src/mystery_gift_show_card.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"pokemon_icon.h\"\n#include \"mystery_gift_menu.h\"\n#include \"mystery_gift.h\"\n#include \"battle_anim.h\"\n#include \"constants/mystery_gift.h\"\n\nenum {\n    WIN_HEADER,\n    WIN_BODY,\n    WIN_FOOTER,\n    WIN_COUNT\n};\n\n#define TAG_STAMP_SHADOW 0x8000\n\nstruct CardStatTextData\n{\n    u8 width;\n    u8 statText[WONDER_CARD_TEXT_LENGTH + 1];\n    u8 statNumberText[4];\n};\n\nstruct WonderCardData\n{\n    /*0000*/ struct WonderCard card;\n    /*014c*/ struct WonderCardMetadata cardMetadata;\n    /*0170*/ const struct WonderGraphics * gfx;\n    /*0174*/ u8 enterExitState;\n    /*0175*/ u8 recordIdx;\n    /*0176*/ u16 windowIds[WIN_COUNT];\n    /*017C*/ u8 monIconSpriteId;\n    /*017D*/ u8 stampSpriteIds[MAX_STAMP_CARD_STAMPS][2]; // 2 sprites each, 1 for the shadow and 1 for the Pokémon\n    /*018B*/ u8 titleText[WONDER_CARD_TEXT_LENGTH + 1];\n    /*01B4*/ u8 subtitleText[WONDER_CARD_TEXT_LENGTH + 1];\n    /*01DD*/ u8 idNumberText[7];\n    /*01E4*/ u8 bodyText[WONDER_CARD_BODY_TEXT_LINES][WONDER_CARD_TEXT_LENGTH + 1];\n    /*0288*/ u8 footerLine1Text[WONDER_CARD_TEXT_LENGTH + 1];\n    /*02B1*/ u8 footerLine2Text[WONDER_CARD_TEXT_LENGTH + 1];\n    /*02DC*/ struct CardStatTextData statTextData[8];\n    /*045C*/ u8 bgTilemapBuffer[0x1000];\n};\n\nstatic EWRAM_DATA struct WonderCardData * sWonderCardData = NULL;\n\nstatic void BufferCardText(void);\nstatic void DrawCardWindow(u8 whichWindow);\nstatic void CreateCardSprites(void);\nstatic void DestroyCardSprites(void);\n\nstatic const u8 sTextColorTable[][3] = {\n    {0, 2, 3},\n    {0, 1, 2}\n};\n\nstatic const u8 ALIGNED(4) sFooterTextOffsets[CARD_TYPE_COUNT] =\n{\n    [CARD_TYPE_GIFT] = 7,\n    [CARD_TYPE_STAMP] = 4,\n    [CARD_TYPE_LINK_STAT] = 7\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    [WIN_HEADER] = {\n        .bg = 1,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 25,\n        .height = 4,\n        .paletteNum = 15, \n        .baseBlock = 0x29c\n    },\n    [WIN_BODY] = {\n        .bg = 1,\n        .tilemapLeft = 1,\n        .tilemapTop = 6,\n        .width = 28,\n        .height = 8,\n        .paletteNum = 15, \n        .baseBlock = 0x1bc\n    },\n    [WIN_FOOTER] = {\n        .bg = 1,\n        .tilemapLeft = 1,\n        .tilemapTop = 14,\n        .width = 28,\n        .height = 5,\n        .paletteNum = 15, \n        .baseBlock = 0x130\n    }\n};\n\nstatic const u16 sCard0Pal[] = INCBIN_U16(\"graphics/wonder_card/bg0.gbapal\");\nconst u16 gCard1Pal[] = INCBIN_U16(\"graphics/wonder_card/bg1.gbapal\");\nconst u16 gCard2Pal[] = INCBIN_U16(\"graphics/wonder_card/bg2.gbapal\");\nconst u16 gCard3Pal[] = INCBIN_U16(\"graphics/wonder_card/bg3.gbapal\");\nconst u16 gCard4Pal[] = INCBIN_U16(\"graphics/wonder_card/bg4.gbapal\");\nconst u16 gCard5Pal[] = INCBIN_U16(\"graphics/wonder_card/bg5.gbapal\");\nstatic const u16 sCard6Pal[] = INCBIN_U16(\"graphics/wonder_card/bg6.gbapal\");\nstatic const u16 sCard7Pal[] = INCBIN_U16(\"graphics/wonder_card/bg7.gbapal\");\nstatic const u8 sCard0Gfx[] = INCBIN_U8(\"graphics/wonder_card/bg0.4bpp.lz\");\nstatic const u8 sCard0Map[] = INCBIN_U8(\"graphics/wonder_card/bg0.bin.lz\");\nstatic const u8 sCard1Gfx[] = INCBIN_U8(\"graphics/wonder_card/bg1.4bpp.lz\");\nstatic const u8 sCard1Map[] = INCBIN_U8(\"graphics/wonder_card/bg1.bin.lz\");\nstatic const u8 sCard2Gfx[] = INCBIN_U8(\"graphics/wonder_card/bg2.4bpp.lz\");\nstatic const u8 sCard2Map[] = INCBIN_U8(\"graphics/wonder_card/bg2.bin.lz\");\nstatic const u8 sCard6Gfx[] = INCBIN_U8(\"graphics/wonder_card/bg6.4bpp.lz\");\nstatic const u8 sCard6Map[] = INCBIN_U8(\"graphics/wonder_card/bg6.bin.lz\");\nstatic const u8 sCard7Gfx[] = INCBIN_U8(\"graphics/wonder_card/bg7.4bpp.lz\");\nstatic const u8 sCard7Map[] = INCBIN_U8(\"graphics/wonder_card/bg7.bin.lz\");\nstatic const u16 sStampShadowPal0[] = INCBIN_U16(\"graphics/wonder_card/stamp_shadow_0.gbapal\");\nstatic const u16 sStampShadowPal1[] = INCBIN_U16(\"graphics/wonder_card/stamp_shadow_1.gbapal\");\nstatic const u16 sStampShadowPal2[] = INCBIN_U16(\"graphics/wonder_card/stamp_shadow_2.gbapal\");\nstatic const u16 sStampShadowPal3[] = INCBIN_U16(\"graphics/wonder_card/stamp_shadow_3.gbapal\");\nstatic const u16 sStampShadowPal4[] = INCBIN_U16(\"graphics/wonder_card/stamp_shadow_4.gbapal\");\nstatic const u16 sStampShadowPal5[] = INCBIN_U16(\"graphics/wonder_card/stamp_shadow_5.gbapal\");\nstatic const u16 sStampShadowPal6[] = INCBIN_U16(\"graphics/wonder_card/stamp_shadow_6.gbapal\");\nstatic const u16 sStampShadowPal7[] = INCBIN_U16(\"graphics/wonder_card/stamp_shadow_7.gbapal\");\nstatic const u32 sStampShadowGfx[] = INCBIN_U32(\"graphics/wonder_card/stamp_shadow.4bpp.lz\");\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_StampShadow = {\n    sStampShadowGfx, 0x100, TAG_STAMP_SHADOW\n};\n\nstatic const struct SpritePalette sSpritePalettes_StampShadow[] = {\n    {sStampShadowPal0, TAG_STAMP_SHADOW},\n    {sStampShadowPal1, TAG_STAMP_SHADOW},\n    {sStampShadowPal2, TAG_STAMP_SHADOW},\n    {sStampShadowPal3, TAG_STAMP_SHADOW},\n    {sStampShadowPal4, TAG_STAMP_SHADOW},\n    {sStampShadowPal5, TAG_STAMP_SHADOW},\n    {sStampShadowPal6, TAG_STAMP_SHADOW},\n    {sStampShadowPal7, TAG_STAMP_SHADOW}\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_StampShadow = {\n    .tileTag = TAG_STAMP_SHADOW,\n    .paletteTag = TAG_STAMP_SHADOW,\n    .oam = &gOamData_AffineOff_ObjNormal_32x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct WonderGraphics sCardGraphics[NUM_WONDER_BGS] = {\n    {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 0, .tiles = sCard0Gfx, .map = sCard0Map, .pal = sCard0Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 1, .tiles = sCard1Gfx, .map = sCard1Map, .pal = gCard1Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 2, .tiles = sCard2Gfx, .map = sCard2Map, .pal = gCard2Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 3, .tiles = sCard2Gfx, .map = sCard2Map, .pal = gCard3Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 4, .tiles = sCard2Gfx, .map = sCard2Map, .pal = gCard4Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 5, .tiles = sCard2Gfx, .map = sCard2Map, .pal = gCard5Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 6, .tiles = sCard6Gfx, .map = sCard6Map, .pal = sCard6Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 7, .tiles = sCard7Gfx, .map = sCard7Map, .pal = sCard7Pal}\n};\n\nbool32 WonderCard_Init(struct WonderCard * card, struct WonderCardMetadata * metadata)\n{\n    if (card == NULL || metadata == NULL)\n        return FALSE;\n    sWonderCardData = AllocZeroed(sizeof(*sWonderCardData));\n    if (sWonderCardData == NULL)\n        return FALSE;\n    sWonderCardData->card = *card;\n    sWonderCardData->cardMetadata = *metadata;\n    if (sWonderCardData->card.bgType >= NUM_WONDER_BGS)\n        sWonderCardData->card.bgType = 0;\n    if (sWonderCardData->card.type >= CARD_TYPE_COUNT)\n        sWonderCardData->card.type = 0;\n    if (sWonderCardData->card.maxStamps > MAX_STAMP_CARD_STAMPS)\n        sWonderCardData->card.maxStamps = 0;\n    sWonderCardData->gfx = &sCardGraphics[sWonderCardData->card.bgType];\n    return TRUE;\n}\n\nvoid WonderCard_Destroy(void)\n{\n    if (sWonderCardData != NULL)\n    {\n        *sWonderCardData = (struct WonderCardData){};\n        FREE_AND_SET_NULL(sWonderCardData);\n    }\n}\n\ns32 WonderCard_Enter(void)\n{\n    if (sWonderCardData == NULL)\n        return -1;\n    switch(sWonderCardData->enterExitState)\n    {\n        case 0:\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            break;\n        case 1:\n            if (UpdatePaletteFade())\n                return 0;\n            break;\n        case 2:\n            FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);\n            FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);\n            FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);\n            CopyBgTilemapBufferToVram(0);\n            CopyBgTilemapBufferToVram(1);\n            CopyBgTilemapBufferToVram(2);\n            DecompressAndCopyTileDataToVram(2, sWonderCardData->gfx->tiles, 0, 0x008, 0);\n            sWonderCardData->windowIds[WIN_HEADER] = AddWindow(&sWindowTemplates[WIN_HEADER]);\n            sWonderCardData->windowIds[WIN_BODY] = AddWindow(&sWindowTemplates[WIN_BODY]);\n            sWonderCardData->windowIds[WIN_FOOTER] = AddWindow(&sWindowTemplates[WIN_FOOTER]);\n            break;\n        case 3:\n            if (FreeTempTileDataBuffersIfPossible())\n                return 0;\n            gPaletteFade.bufferTransferDisabled = TRUE;\n            LoadPalette(sWonderCardData->gfx->pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP);\n            LZ77UnCompWram(sWonderCardData->gfx->map, sWonderCardData->bgTilemapBuffer);\n            CopyRectToBgTilemapBufferRect(2, sWonderCardData->bgTilemapBuffer, 0, 0, 30, 20, 0, 0, 30, 20, 1, 0x008, 0);\n            CopyBgTilemapBufferToVram(2);\n            break;\n        case 4:\n            BufferCardText();\n            break;\n        case 5:\n            DrawCardWindow(WIN_HEADER);\n            DrawCardWindow(WIN_BODY);\n            DrawCardWindow(WIN_FOOTER);\n            CopyBgTilemapBufferToVram(1);\n            break;\n        case 6:\n            LoadMonIconPalettes();\n            break;\n        case 7:\n            ShowBg(1);\n            ShowBg(2);\n            gPaletteFade.bufferTransferDisabled = FALSE;\n            CreateCardSprites();\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n            UpdatePaletteFade();\n            break;\n        default:\n            if (UpdatePaletteFade())\n                return 0;\n            sWonderCardData->enterExitState = 0;\n            return 1;\n    }\n    sWonderCardData->enterExitState++;\n    return 0;\n}\n\ns32 WonderCard_Exit(bool32 useCancel)\n{\n    if (sWonderCardData == NULL)\n        return -1;\n    switch (sWonderCardData->enterExitState)\n    {\n        case 0:\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            break;\n        case 1:\n            if (UpdatePaletteFade())\n                return 0;\n            break;\n        case 2:\n            FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);\n            FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);\n            FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);\n            CopyBgTilemapBufferToVram(0);\n            CopyBgTilemapBufferToVram(1);\n            CopyBgTilemapBufferToVram(2);\n            break;\n        case 3:\n            HideBg(1);\n            HideBg(2);\n            RemoveWindow(sWonderCardData->windowIds[WIN_FOOTER]);\n            RemoveWindow(sWonderCardData->windowIds[WIN_BODY]);\n            RemoveWindow(sWonderCardData->windowIds[WIN_HEADER]);\n            break;\n        case 4:\n            DestroyCardSprites();\n            FreeMonIconPalettes();\n            break;\n        case 5:\n            PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, useCancel);\n            break;\n        case 6:\n            CopyBgTilemapBufferToVram(0);\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n            break;\n        default:\n            if (UpdatePaletteFade())\n                return 0;\n            sWonderCardData->enterExitState = 0;\n            return 1;\n    }\n    sWonderCardData->enterExitState++;\n    return 0;\n}\n\nstatic void BufferCardText(void)\n{\n    u16 i = 0;\n    u16 charsUntilStat;\n    u16 stats[3] = {0, 0, 0};\n\n    // Copy title/subtitle text\n    memcpy(sWonderCardData->titleText, sWonderCardData->card.titleText, WONDER_CARD_TEXT_LENGTH);\n    sWonderCardData->titleText[WONDER_CARD_TEXT_LENGTH] = EOS;\n    memcpy(sWonderCardData->subtitleText, sWonderCardData->card.subtitleText, WONDER_CARD_TEXT_LENGTH);\n    sWonderCardData->subtitleText[WONDER_CARD_TEXT_LENGTH] = EOS;\n\n    // Copy card id number\n    if (sWonderCardData->card.idNumber > 999999)\n        sWonderCardData->card.idNumber = 999999;\n    ConvertIntToDecimalStringN(sWonderCardData->idNumberText, sWonderCardData->card.idNumber, STR_CONV_MODE_LEFT_ALIGN, 6);\n\n    // Copy body text\n    for (i = 0; i < WONDER_CARD_BODY_TEXT_LINES; i++)\n    {\n        memcpy(sWonderCardData->bodyText[i], sWonderCardData->card.bodyText[i], WONDER_CARD_TEXT_LENGTH);\n        sWonderCardData->bodyText[i][WONDER_CARD_TEXT_LENGTH] = EOS;\n    }\n\n    // Copy footer line 1\n    memcpy(sWonderCardData->footerLine1Text, sWonderCardData->card.footerLine1Text, WONDER_CARD_TEXT_LENGTH);\n    sWonderCardData->footerLine1Text[WONDER_CARD_TEXT_LENGTH] = EOS;\n    \n    // Copy footer line 2\n    switch (sWonderCardData->card.type)\n    {\n    case CARD_TYPE_GIFT:\n        memcpy(sWonderCardData->footerLine2Text, sWonderCardData->card.footerLine2Text, WONDER_CARD_TEXT_LENGTH);\n        sWonderCardData->footerLine2Text[WONDER_CARD_TEXT_LENGTH] = EOS;\n        break;\n    case CARD_TYPE_STAMP:\n        sWonderCardData->footerLine2Text[0] = EOS;\n        break;\n    case CARD_TYPE_LINK_STAT:\n        sWonderCardData->footerLine2Text[0] = EOS;\n        \n        // Load stats\n        stats[0] = sWonderCardData->cardMetadata.battlesWon < MAX_WONDER_CARD_STAT ? sWonderCardData->cardMetadata.battlesWon : MAX_WONDER_CARD_STAT;\n        stats[1] = sWonderCardData->cardMetadata.battlesLost < MAX_WONDER_CARD_STAT ? sWonderCardData->cardMetadata.battlesLost : MAX_WONDER_CARD_STAT;\n        stats[2] = sWonderCardData->cardMetadata.numTrades < MAX_WONDER_CARD_STAT ? sWonderCardData->cardMetadata.numTrades : MAX_WONDER_CARD_STAT;\n        \n        // Init stat text arrays\n        for (i = 0; i < ARRAY_COUNT(sWonderCardData->statTextData); i++)\n        {\n            memset(sWonderCardData->statTextData[i].statNumberText, EOS, sizeof(sWonderCardData->statTextData[i].statNumberText));\n            memset(sWonderCardData->statTextData[i].statText,       EOS, sizeof(sWonderCardData->statTextData[i].statText));\n        }\n\n        // Copy stat texts\n        for (i = 0, charsUntilStat = 0; i < WONDER_CARD_TEXT_LENGTH; i++)\n        {\n            if (sWonderCardData->card.footerLine2Text[i] != CHAR_DYNAMIC)\n            {\n                // Regular text, just copy as is\n                sWonderCardData->statTextData[sWonderCardData->recordIdx].statText[charsUntilStat] = sWonderCardData->card.footerLine2Text[i];\n                charsUntilStat++;\n            }\n            else\n            {\n                // Dynamic char encountered\n                // These are used to give the id of which stat to print\n                u8 id = sWonderCardData->card.footerLine2Text[i + 1];\n                if (id >= ARRAY_COUNT(stats))\n                {\n                    // Invalid stat id, skip ahead\n                    i += 2;\n                }\n                else\n                {\n                    // Copy stat number\n                    ConvertIntToDecimalStringN(sWonderCardData->statTextData[sWonderCardData->recordIdx].statNumberText, stats[id], STR_CONV_MODE_LEADING_ZEROS, 3);\n                    sWonderCardData->statTextData[sWonderCardData->recordIdx].width = sWonderCardData->card.footerLine2Text[i + 2];\n                    sWonderCardData->recordIdx++;\n                    if (sWonderCardData->recordIdx >= ARRAY_COUNT(sWonderCardData->statTextData))\n                        break;\n                    charsUntilStat = 0;\n                    i += 2;\n                }\n            }\n        }\n    }\n}\n\nstatic void DrawCardWindow(u8 whichWindow)\n{\n    s8 i = 0;\n    s32 windowId = sWonderCardData->windowIds[whichWindow];\n    PutWindowTilemap(windowId);\n    FillWindowPixelBuffer(windowId, 0);\n    switch (whichWindow)\n    {\n    case WIN_HEADER:\n    {\n        // Print card title/subtitle\n        s32 x;\n        AddTextPrinterParameterized3(windowId, FONT_NORMAL_COPY_2, 0, 1, sTextColorTable[sWonderCardData->gfx->titleTextPal], 0, sWonderCardData->titleText);\n        x = 160 - GetStringWidth(FONT_NORMAL_COPY_2, sWonderCardData->subtitleText, GetFontAttribute(FONT_NORMAL_COPY_2, FONTATTR_LETTER_SPACING));\n        if (x < 0)\n            x = 0;\n        AddTextPrinterParameterized3(windowId, FONT_NORMAL_COPY_2, x, 17, sTextColorTable[sWonderCardData->gfx->titleTextPal], 0, sWonderCardData->subtitleText);\n        \n        // Print id number\n        if (sWonderCardData->card.idNumber != 0)\n            AddTextPrinterParameterized3(windowId, FONT_NORMAL, 166, 17, sTextColorTable[sWonderCardData->gfx->titleTextPal], 0, sWonderCardData->idNumberText);\n        break;\n    }\n    case WIN_BODY:\n        // Print body text\n        for (; i < WONDER_CARD_BODY_TEXT_LINES; i++)\n            AddTextPrinterParameterized3(windowId, FONT_NORMAL_COPY_2, 0, 16 * i + 2, sTextColorTable[sWonderCardData->gfx->bodyTextPal], 0, sWonderCardData->bodyText[i]);\n        break;\n    case WIN_FOOTER:\n        // Print footer line 1\n        AddTextPrinterParameterized3(windowId, FONT_NORMAL_COPY_2, 0,\n                                     sFooterTextOffsets[sWonderCardData->card.type],\n                                     sTextColorTable[sWonderCardData->gfx->footerTextPal],\n                                     0, sWonderCardData->footerLine1Text);\n        \n        // Print footer line 2\n        if (sWonderCardData->card.type != CARD_TYPE_LINK_STAT)\n        {\n            // Print gift text\n            // Odd that CARD_TYPE_STAMP is not ignored, it has empty text for this\n            AddTextPrinterParameterized3(windowId, FONT_NORMAL_COPY_2, 0,\n                                         16 + sFooterTextOffsets[sWonderCardData->card.type],\n                                         sTextColorTable[sWonderCardData->gfx->footerTextPal],\n                                         0, sWonderCardData->footerLine2Text);\n        }\n        else\n        {\n            s32 x = 0;\n            s32 y = sFooterTextOffsets[sWonderCardData->card.type] + 16;\n            s32 spacing = GetFontAttribute(FONT_NORMAL_COPY_2, FONTATTR_LETTER_SPACING);\n            for (; i < sWonderCardData->recordIdx; i++)\n            {\n                // Print stat text\n                AddTextPrinterParameterized3(windowId, FONT_NORMAL_COPY_2, x, y, sTextColorTable[sWonderCardData->gfx->footerTextPal], 0, sWonderCardData->statTextData[i].statText);\n                if (sWonderCardData->statTextData[i].statNumberText[0] != EOS)\n                {\n                    // Print stat number\n                    x += GetStringWidth(FONT_NORMAL_COPY_2, sWonderCardData->statTextData[i].statText, spacing);\n                    AddTextPrinterParameterized3(windowId, FONT_NORMAL, x, y,\n                                                 sTextColorTable[sWonderCardData->gfx->footerTextPal],\n                                                 0, sWonderCardData->statTextData[i].statNumberText);\n                    x += GetStringWidth(FONT_NORMAL_COPY_2, sWonderCardData->statTextData[i].statNumberText, spacing) + sWonderCardData->statTextData[i].width;\n                }\n            }\n        }\n        break;\n    }\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void CreateCardSprites(void)\n{\n    u8 i = 0;\n    sWonderCardData->monIconSpriteId = SPRITE_NONE;\n    \n    // Create icon sprite\n    if (sWonderCardData->cardMetadata.iconSpecies != SPECIES_NONE)\n    {\n        sWonderCardData->monIconSpriteId = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sWonderCardData->cardMetadata.iconSpecies), SpriteCallbackDummy, 220, 20, 0, FALSE);\n        gSprites[sWonderCardData->monIconSpriteId].oam.priority = 2;\n    }\n    \n    // Create stamp sprites\n    if (sWonderCardData->card.maxStamps != 0 && sWonderCardData->card.type == CARD_TYPE_STAMP)\n    {\n        LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_StampShadow);\n        LoadSpritePalette(&sSpritePalettes_StampShadow[sWonderCardData->gfx->stampShadowPal]);\n        for (; i < sWonderCardData->card.maxStamps; i++)\n        {\n            sWonderCardData->stampSpriteIds[i][0] = SPRITE_NONE;\n            sWonderCardData->stampSpriteIds[i][1] = SPRITE_NONE;\n            sWonderCardData->stampSpriteIds[i][0] = CreateSprite(&sSpriteTemplate_StampShadow, 216 - 32 * i, 0x90, 8);\n            if (sWonderCardData->cardMetadata.stampData[0][i] != 0)\n            {\n                sWonderCardData->stampSpriteIds[i][1] = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sWonderCardData->cardMetadata.stampData[0][i]), SpriteCallbackDummy, 216 - 32 * i, 136, 0, 0);\n                gSprites[sWonderCardData->stampSpriteIds[i][1]].oam.priority = 2;\n            }\n        }\n    }\n}\n\nstatic void DestroyCardSprites(void)\n{\n    u8 i = 0;\n    \n    // Destroy icon sprite\n    if (sWonderCardData->monIconSpriteId != SPRITE_NONE)\n        DestroyMonIcon(&gSprites[sWonderCardData->monIconSpriteId]);\n    \n    // Destroy stamp sprites\n    if (sWonderCardData->card.maxStamps != 0 && sWonderCardData->card.type == CARD_TYPE_STAMP)\n    {\n        for (; i < sWonderCardData->card.maxStamps; i++)\n        {\n            if (sWonderCardData->stampSpriteIds[i][0] != SPRITE_NONE)\n            {\n                DestroySprite(&gSprites[sWonderCardData->stampSpriteIds[i][0]]);\n            #ifdef BUGFIX\n                if (sWonderCardData->stampSpriteIds[i][1] != SPRITE_NONE)\n            #else\n                if (sWonderCardData->stampSpriteIds[i][0] != SPRITE_NONE)\n            #endif\n                    DestroyMonIcon(&gSprites[sWonderCardData->stampSpriteIds[i][1]]);\n            }\n        }\n        FreeSpriteTilesByTag(TAG_STAMP_SHADOW);\n        FreeSpritePaletteByTag(TAG_STAMP_SHADOW);\n    }\n}\n"
  },
  {
    "path": "src/mystery_gift_show_news.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"menu_indicators.h\"\n#include \"new_menu_helpers.h\"\n#include \"mystery_gift.h\"\n#include \"mystery_gift_menu.h\"\n#include \"menu.h\"\n#include \"link_rfu.h\"\n#include \"list_menu.h\"\n#include \"constants/mystery_gift.h\"\n\nenum {\n    WIN_TITLE,\n    WIN_BODY,\n    WIN_COUNT\n};\n\n#define TAG_ARROWS 0x1000\n\nstruct WonderNewsData\n{\n    struct WonderNews news;\n    const struct WonderGraphics * gfx;\n    bool8 verticalScrollDisabled:1;\n    u8 enterExitState:7;\n    u8 arrowTaskId;\n    bool8 scrolling:1;\n    u8 scrollIncrement:7;\n    bool8 scrollingDown:1;\n    u8 scrollTotal:7;\n    u16 scrollEnd;\n    u16 scrollOffset;\n    u16 windowIds[WIN_COUNT];\n    u8 unused[2];\n    u8 titleText[WONDER_NEWS_TEXT_LENGTH + 1];\n    u8 bodyText[WONDER_NEWS_BODY_TEXT_LINES][WONDER_NEWS_TEXT_LENGTH + 1];\n    struct ScrollArrowsTemplate arrowsTemplate;\n    u8 bgTilemapBuffer[0x1000];\n};\n\nstatic EWRAM_DATA struct WonderNewsData * sWonderNewsData = NULL;\n\nstatic void BufferNewsText(void);\nstatic void DrawNewsWindows(void);\nstatic void UpdateNewsScroll(void);\n\nstatic const u8 sTextColorTable[][3] = {\n    {0, 2, 3},\n    {0, 1, 2}\n};\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    [WIN_TITLE] = {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 0,\n        .width = 28,\n        .height = 3,\n        .paletteNum = 15,\n        .baseBlock = 0x000\n    },\n    [WIN_BODY] = {\n        .bg = 2,\n        .tilemapLeft = 1,\n        .tilemapTop = 3,\n        .width = 28,\n        .height = 20,\n        .paletteNum = 15,\n        .baseBlock = 0x000\n    }\n};\nstatic const struct ScrollArrowsTemplate sArrowsTemplate = {\n    .firstArrowType = SCROLL_ARROW_UP,\n    .firstX = 232,\n    .firstY = 24,\n    .secondArrowType = SCROLL_ARROW_DOWN,\n    .secondX = 232,\n    .secondY = 152,\n    .fullyUpThreshold = 0,\n    .fullyDownThreshold = 2,\n    .tileTag = TAG_ARROWS,\n    .palTag = TAG_ARROWS,\n    .palNum = 0\n};\n\nstatic const u16 sNews0Pal[] = INCBIN_U16(\"graphics/wonder_news/bg0.gbapal\");\nstatic const u16 sNews6Pal[] = INCBIN_U16(\"graphics/wonder_news/bg6.gbapal\");\nstatic const u16 sNews7Pal[] = INCBIN_U16(\"graphics/wonder_news/bg7.gbapal\");\nstatic const u8 sNews0Gfx[] = INCBIN_U8(\"graphics/wonder_news/bg0.4bpp.lz\");\nstatic const u8 sNews0Map[] = INCBIN_U8(\"graphics/wonder_news/bg0.bin.lz\");\nstatic const u8 sNews1Gfx[] = INCBIN_U8(\"graphics/wonder_news/bg1.4bpp.lz\");\nstatic const u8 sNews1Map[] = INCBIN_U8(\"graphics/wonder_news/bg1.bin.lz\");\nstatic const u8 sNews2Gfx[] = INCBIN_U8(\"graphics/wonder_news/bg2.4bpp.lz\");\nstatic const u8 sNews2Map[] = INCBIN_U8(\"graphics/wonder_news/bg2.bin.lz\");\nstatic const u8 sNews6Gfx[] = INCBIN_U8(\"graphics/wonder_news/bg6.4bpp.lz\");\nstatic const u8 sNews6Map[] = INCBIN_U8(\"graphics/wonder_news/bg6.bin.lz\");\nstatic const u8 sNews7Gfx[] = INCBIN_U8(\"graphics/wonder_news/bg7.4bpp.lz\");\nstatic const u8 sNews7Map[] = INCBIN_U8(\"graphics/wonder_news/bg7.bin.lz\");\n\nstatic const struct WonderGraphics sNewsGraphics[NUM_WONDER_BGS] = {\n    {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews0Gfx, .map = sNews0Map, .pal = sNews0Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews1Gfx, .map = sNews1Map, .pal = gCard1Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews2Gfx, .map = sNews2Map, .pal = gCard2Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews2Gfx, .map = sNews2Map, .pal = gCard3Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews2Gfx, .map = sNews2Map, .pal = gCard4Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews2Gfx, .map = sNews2Map, .pal = gCard5Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews6Gfx, .map = sNews6Map, .pal = sNews6Pal},\n    {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews7Gfx, .map = sNews7Map, .pal = sNews7Pal}\n};\n\nbool32 WonderNews_Init(const struct WonderNews * news)\n{\n    if (news == NULL)\n        return FALSE;\n    sWonderNewsData = AllocZeroed(sizeof(*sWonderNewsData));\n    if (sWonderNewsData == NULL)\n        return FALSE;\n    sWonderNewsData->news = *news;\n    if (sWonderNewsData->news.bgType >= NUM_WONDER_BGS)\n        sWonderNewsData->news.bgType = 0;\n    sWonderNewsData->gfx = &sNewsGraphics[sWonderNewsData->news.bgType];\n    sWonderNewsData->arrowTaskId = TASK_NONE;\n    return TRUE;\n}\n\nvoid WonderNews_Destroy(void)\n{\n    if (sWonderNewsData != NULL)\n    {\n        *sWonderNewsData = (struct WonderNewsData){};\n        FREE_AND_SET_NULL(sWonderNewsData);\n    }\n}\n\ns32 WonderNews_Enter(void)\n{\n    if (sWonderNewsData == NULL)\n        return -1;\n\n    switch (sWonderNewsData->enterExitState)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        break;\n    case 1:\n        if (UpdatePaletteFade())\n            return 0;\n        ChangeBgY(0, 0, BG_COORD_SET);\n        ChangeBgY(1, 0, BG_COORD_SET);\n        ChangeBgY(2, 0, BG_COORD_SET);\n        ChangeBgY(3, 0, BG_COORD_SET);\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH));\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(26, 152));\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ);\n        SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ);\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        break;\n    case 2:\n        FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);\n        FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);\n        FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);\n        FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 20);\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(3);\n        DecompressAndCopyTileDataToVram(3, sWonderNewsData->gfx->tiles, 0, 8, 0);\n        sWonderNewsData->windowIds[WIN_TITLE] = AddWindow(&sWindowTemplates[WIN_TITLE]);\n        sWonderNewsData->windowIds[WIN_BODY] = AddWindow(&sWindowTemplates[WIN_BODY]);\n        break;\n    case 3:\n        if (FreeTempTileDataBuffersIfPossible())\n            return 0;\n        gPaletteFade.bufferTransferDisabled = TRUE;\n        LoadPalette(sWonderNewsData->gfx->pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP);\n        LZ77UnCompWram(sWonderNewsData->gfx->map, sWonderNewsData->bgTilemapBuffer);\n        CopyRectToBgTilemapBufferRect(1, sWonderNewsData->bgTilemapBuffer, 0, 0, 30, 3, 0, 0, 30, 3, 1, 8, 0);\n        CopyRectToBgTilemapBufferRect(3, sWonderNewsData->bgTilemapBuffer, 0, 3, 30, 23, 0, 3, 30, 23, 1, 8, 0);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(3);\n        break;\n    case 4:\n        BufferNewsText();\n        break;\n    case 5:\n        DrawNewsWindows();\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(2);\n        break;\n    case 6:\n        ShowBg(1);\n        ShowBg(2);\n        ShowBg(3);\n        gPaletteFade.bufferTransferDisabled = FALSE;\n        sWonderNewsData->arrowTaskId = AddScrollIndicatorArrowPair(&sWonderNewsData->arrowsTemplate, &sWonderNewsData->scrollOffset);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        UpdatePaletteFade();\n        break;\n    default:\n        if (UpdatePaletteFade())\n            return 0;\n        sWonderNewsData->enterExitState = 0;\n        return 1;\n    }\n\n    sWonderNewsData->enterExitState++;\n    return 0;\n}\n\ns32 WonderNews_Exit(bool32 useCancel)\n{\n    if (sWonderNewsData == NULL)\n        return -1;\n    switch (sWonderNewsData->enterExitState)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        break;\n    case 1:\n        if (UpdatePaletteFade())\n            return 0;\n        ChangeBgY(2, 0, BG_COORD_SET);\n        SetGpuReg(REG_OFFSET_WIN0H, 0);\n        SetGpuReg(REG_OFFSET_WIN0V, 0);\n        SetGpuReg(REG_OFFSET_WININ, 0);\n        SetGpuReg(REG_OFFSET_WINOUT, 0);\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        break;\n    case 2:\n        FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);\n        FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);\n        FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 24);\n        FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 24);\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(3);\n        break;\n    case 3:\n        HideBg(1);\n        HideBg(2);\n        RemoveWindow(sWonderNewsData->windowIds[WIN_BODY]);\n        RemoveWindow(sWonderNewsData->windowIds[WIN_TITLE]);\n        break;\n    case 4:\n        ChangeBgY(2, 0, BG_COORD_SET);\n        ChangeBgY(3, 0, BG_COORD_SET);\n        if (sWonderNewsData->arrowTaskId != TASK_NONE)\n        {\n            RemoveScrollIndicatorArrowPair(sWonderNewsData->arrowTaskId);\n            sWonderNewsData->arrowTaskId = TASK_NONE;\n        }\n        break;\n    case 5:\n        PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, useCancel);\n        break;\n    case 6:\n        MG_DrawCheckerboardPattern();\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(3);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        break;\n    default:\n        if (UpdatePaletteFade())\n            return 0;\n        sWonderNewsData->enterExitState = 0;\n        return 1;\n    }\n    ++sWonderNewsData->enterExitState;\n    return 0;\n}\n\nvoid WonderNews_RemoveScrollIndicatorArrowPair(void)\n{\n    if (!sWonderNewsData->verticalScrollDisabled && sWonderNewsData->arrowTaskId != TASK_NONE)\n    {\n        RemoveScrollIndicatorArrowPair(sWonderNewsData->arrowTaskId);\n        sWonderNewsData->arrowTaskId = TASK_NONE;\n        sWonderNewsData->verticalScrollDisabled = TRUE;\n    }\n}\n\n\nvoid WonderNews_AddScrollIndicatorArrowPair(void)\n{\n    if (sWonderNewsData->verticalScrollDisabled)\n    {\n        sWonderNewsData->arrowTaskId = AddScrollIndicatorArrowPair(&sWonderNewsData->arrowsTemplate, &sWonderNewsData->scrollOffset);\n        sWonderNewsData->verticalScrollDisabled = FALSE;\n    }\n}\n\nu32 WonderNews_GetInput(u16 input)\n{\n    if (sWonderNewsData->scrolling)\n    {\n        UpdateNewsScroll();\n        return NEWS_INPUT_NONE;\n    }\n    switch (input)\n    {\n    case A_BUTTON:\n        return NEWS_INPUT_A;\n    case B_BUTTON:\n        return NEWS_INPUT_B;\n    case DPAD_UP:\n        if (sWonderNewsData->scrollOffset == 0)\n            return NEWS_INPUT_NONE;\n        if (sWonderNewsData->verticalScrollDisabled)\n            return NEWS_INPUT_NONE;\n        sWonderNewsData->scrollingDown = FALSE;\n        break;\n    case DPAD_DOWN:\n        if (sWonderNewsData->scrollOffset == sWonderNewsData->scrollEnd)\n            return NEWS_INPUT_NONE;\n        if (sWonderNewsData->verticalScrollDisabled)\n            return NEWS_INPUT_NONE;\n        sWonderNewsData->scrollingDown = TRUE;\n        break;\n    default:\n        return NEWS_INPUT_NONE;\n    }\n\n    // Init scroll\n    sWonderNewsData->scrolling = TRUE;\n    sWonderNewsData->scrollIncrement = 2;\n    sWonderNewsData->scrollTotal = 0;\n    if (!sWonderNewsData->scrollingDown)\n        return NEWS_INPUT_SCROLL_UP;\n    else\n        return NEWS_INPUT_SCROLL_DOWN;\n}\n\nstatic void BufferNewsText(void)\n{\n    u8 i = 0;\n\n    // Copy title text\n    memcpy(sWonderNewsData->titleText, sWonderNewsData->news.titleText, WONDER_NEWS_TEXT_LENGTH);\n    sWonderNewsData->titleText[WONDER_NEWS_TEXT_LENGTH] = EOS;\n\n    // Copy body text\n    for (; i < WONDER_NEWS_BODY_TEXT_LINES; i++)\n    {\n        memcpy(sWonderNewsData->bodyText[i], sWonderNewsData->news.bodyText[i], WONDER_NEWS_TEXT_LENGTH);\n        sWonderNewsData->bodyText[i][WONDER_NEWS_TEXT_LENGTH] = EOS;\n        if (i > 7 && sWonderNewsData->bodyText[i][0] != EOS)\n            sWonderNewsData->scrollEnd++;\n    }\n    sWonderNewsData->arrowsTemplate = sArrowsTemplate;\n    sWonderNewsData->arrowsTemplate.fullyDownThreshold = sWonderNewsData->scrollEnd;\n}\n\nstatic void DrawNewsWindows(void)\n{\n    u8 i = 0;\n    s32 x;\n    PutWindowTilemap(sWonderNewsData->windowIds[WIN_TITLE]);\n    PutWindowTilemap(sWonderNewsData->windowIds[WIN_BODY]);\n    FillWindowPixelBuffer(sWonderNewsData->windowIds[WIN_TITLE], 0);\n    FillWindowPixelBuffer(sWonderNewsData->windowIds[WIN_BODY], 0);\n\n    // Print title text\n    x = (224 - GetStringWidth(FONT_NORMAL_COPY_2, sWonderNewsData->titleText, GetFontAttribute(FONT_NORMAL_COPY_2, FONTATTR_LETTER_SPACING))) / 2;\n    if (x < 0)\n        x = 0;\n    AddTextPrinterParameterized3(sWonderNewsData->windowIds[WIN_TITLE], FONT_NORMAL_COPY_2, x, 6, sTextColorTable[sWonderNewsData->gfx->titleTextPal], 0, sWonderNewsData->titleText);\n    \n    // Print body text\n    for (; i < WONDER_NEWS_BODY_TEXT_LINES; ++i)\n    {\n        AddTextPrinterParameterized3(sWonderNewsData->windowIds[WIN_BODY], FONT_NORMAL_COPY_2, 0,\n                                     16 * i + 2,\n                                     sTextColorTable[sWonderNewsData->gfx->bodyTextPal],\n                                     0, sWonderNewsData->bodyText[i]);\n    }\n    CopyWindowToVram(sWonderNewsData->windowIds[WIN_TITLE], COPYWIN_FULL);\n    CopyWindowToVram(sWonderNewsData->windowIds[WIN_BODY], COPYWIN_FULL);\n}\n\nstatic void UpdateNewsScroll(void)\n{\n    u16 bgMove = sWonderNewsData->scrollIncrement;\n    bgMove *= 256;\n    if (sWonderNewsData->scrollingDown)\n    {\n        ChangeBgY(2, bgMove, BG_COORD_ADD);\n        ChangeBgY(3, bgMove, BG_COORD_ADD);\n    }\n    else\n    {\n        ChangeBgY(2, bgMove, BG_COORD_SUB);\n        ChangeBgY(3, bgMove, BG_COORD_SUB);\n    }\n    sWonderNewsData->scrollTotal += sWonderNewsData->scrollIncrement;\n    if (sWonderNewsData->scrollTotal > 15)\n    {\n        if (sWonderNewsData->scrollingDown)\n            sWonderNewsData->scrollOffset++;\n        else\n            sWonderNewsData->scrollOffset--;\n        sWonderNewsData->scrolling = FALSE;\n        sWonderNewsData->scrollTotal = 0;\n    }\n}\n"
  },
  {
    "path": "src/naming_screen.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"keyboard_text.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"event_scripts.h\"\n#include \"field_effect.h\"\n#include \"field_player_avatar.h\"\n#include \"field_specials.h\"\n#include \"graphics.h\"\n#include \"help_system.h\"\n#include \"menu.h\"\n#include \"overworld.h\"\n#include \"naming_screen.h\"\n#include \"new_menu_helpers.h\"\n#include \"pokemon_icon.h\"\n#include \"pokemon_storage_system.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"text_window.h\"\n#include \"trig.h\"\n#include \"constants/event_object_movement.h\"\n#include \"constants/help_system.h\"\n#include \"constants/songs.h\"\n#include \"constants/event_objects.h\"\n\nenum {\n    INPUT_NONE,\n    INPUT_DPAD_UP,\n    INPUT_DPAD_DOWN,\n    INPUT_DPAD_LEFT,\n    INPUT_DPAD_RIGHT,\n    INPUT_A_BUTTON,\n    INPUT_B_BUTTON,\n    INPUT_LR_BUTTON,\n    INPUT_SELECT,\n    INPUT_START,\n};\n\n#define KBROW_COUNT 4\n#define KBCOL_COUNT 8\n\nenum {\n    GFXTAG_BACK_BUTTON,\n    GFXTAG_OK_BUTTON,\n    GFXTAG_PAGE_SWAP_FRAME,\n    GFXTAG_PAGE_SWAP_BUTTON,\n    GFXTAG_PAGE_SWAP_UPPER,\n    GFXTAG_PAGE_SWAP_LOWER,\n    GFXTAG_PAGE_SWAP_OTHERS,\n    GFXTAG_CURSOR,\n    GFXTAG_CURSOR_SQUISHED,\n    GFXTAG_CURSOR_FILLED,\n    GFXTAG_INPUT_ARROW,\n    GFXTAG_UNDERSCORE,\n    GFXTAG_RIVAL = 255,\n};\n\nenum {\n    PALTAG_MENU, // Also the PC icon\n    PALTAG_PAGE_SWAP_UPPER,\n    PALTAG_PAGE_SWAP_LOWER,\n    PALTAG_PAGE_SWAP_OTHERS, // Also the input arrow/underscore\n    PALTAG_PAGE_SWAP,\n    PALTAG_CURSOR,\n    PALTAG_BACK_BUTTON,\n    PALTAG_OK_BUTTON,\n    PALTAG_RIVAL = 255,\n};\n\nenum {\n    WIN_KB_PAGE_1, // Which of these two windows is in front is cycled as the player swaps\n    WIN_KB_PAGE_2, // Initially WIN_KB_PAGE_1 is in front, with WIN_KB_PAGE_2 on deck\n    WIN_TEXT_ENTRY,\n    WIN_TEXT_ENTRY_BOX,\n    WIN_BANNER,\n    WIN_COUNT,\n};\n\n// The constants for the pages are needlessly complicated because GF didn't keep the indexing order consistent\n// This set is used for sNamingScreen->currentPage. It uses the order that the pages are cycled in\nenum {\n    KBPAGE_SYMBOLS,\n    KBPAGE_LETTERS_UPPER,\n    KBPAGE_LETTERS_LOWER,\n    KBPAGE_COUNT,\n};\n\n// This set is used for initializing a page's keyboard text and getting its number of columns\nenum {\n    KEYBOARD_LETTERS_LOWER,\n    KEYBOARD_LETTERS_UPPER,\n    KEYBOARD_SYMBOLS,\n};\n\n// This set is used for getting the gfx/pal tags of the page's swap button\nenum {\n    PAGE_SWAP_UPPER,\n    PAGE_SWAP_OTHERS,\n    PAGE_SWAP_LOWER,\n};\n\nenum {\n    KEY_ROLE_CHAR,\n    KEY_ROLE_PAGE,\n    KEY_ROLE_BACKSPACE,\n    KEY_ROLE_OK,\n};\n\nenum {\n    BUTTON_PAGE,\n    BUTTON_BACK,\n    BUTTON_OK,\n    BUTTON_COUNT,\n};\n\n// states for Task_NamingScreen\nenum {\n    STATE_FADE_IN,\n    STATE_WAIT_FADE_IN,\n    STATE_HANDLE_INPUT,\n    STATE_MOVE_TO_OK_BUTTON,\n    STATE_START_PAGE_SWAP,\n    STATE_WAIT_PAGE_SWAP,\n    STATE_PRESSED_OK,\n    STATE_WAIT_SENT_TO_PC_MESSAGE,\n    STATE_FADE_OUT,\n    STATE_EXIT,\n};\n\n// sates for Task_HandleInput\nenum\n{\n    INPUT_STATE_DISABLED,\n    INPUT_STATE_ENABLED,\n};\n\nstruct NamingScreenTemplate\n{\n    u8 copyExistingString;\n    u8 maxChars;\n    u8 iconFunction;\n    u8 addGenderIcon;\n    u8 initialPage;\n    const u8 *title;\n};\n\nstruct NamingScreenData\n{\n    /*0x0*/    u8 tilemapBuffer1[0x800];\n    /*0x800*/  u8 tilemapBuffer2[0x800];\n    /*0x800*/  u8 tilemapBuffer3[0x800];\n    /*0x1800*/ u8 textBuffer[0x10];\n    /*0x1810*/ u8 tileBuffer[0x600];\n    /*0x1E10*/ u8 state;\n    /*0x1E11*/ u8 windows[WIN_COUNT];\n    /*0x1E16*/ u16 inputCharBaseXPos;\n    /*0x1E18*/ u16 bg1vOffset;\n    /*0x1E1A*/ u16 bg2vOffset;\n    /*0x1E1C*/ u16 bg1Priority;\n    /*0x1E1E*/ u16 bg2Priority;\n    /*0x1E20*/ u8 bgToReveal;\n    /*0x1E21*/ u8 bgToHide;\n    /*0x1E22*/ u8 currentPage;\n    /*0x1E23*/ u8 cursorSpriteId;\n    /*0x1E24*/ u8 swapBtnFrameSpriteId;\n    /*0x1E25*/ u8 keyRepeatStartDelayCopy;\n    /*0x1E28*/ const struct NamingScreenTemplate *template;\n    /*0x1E2C*/ u8 templateNum;\n    /*0x1E30*/ u8 *destBuffer;\n    /*0x1E34*/ u16 monSpecies;\n    /*0x1E36*/ u16 monGender;\n    /*0x1E38*/ u32 monPersonality;\n    /*0x1E3C*/ MainCallback returnCallback;\n};\n\nstatic EWRAM_DATA struct NamingScreenData * sNamingScreen = NULL;\n\nstatic void CB2_LoadNamingScreen(void);\nstatic void NamingScreen_Init(void);\nstatic void NamingScreen_InitBGs(void);\nstatic void CreateNamingScreenTask(void);\nstatic void Task_NamingScreen(u8);\nstatic bool8 MainState_FadeIn(void);\nstatic bool8 MainState_WaitFadeIn(void);\nstatic bool8 MainState_HandleInput(void);\nstatic bool8 MainState_MoveToOKButton(void);\nstatic bool8 MainState_PressedOKButton(void);\nstatic bool8 MainState_FadeOut(void);\nstatic bool8 MainState_Exit(void);\nstatic void DisplaySentToPCMessage(void);\nstatic bool8 MainState_WaitSentToPCMessage(void);\nstatic bool8 MainState_StartPageSwap(void);\nstatic bool8 MainState_WaitPageSwap(void);\nstatic void StartPageSwapAnim(void);\nstatic void Task_HandlePageSwapAnim(u8);\nstatic bool8 IsPageSwapAnimNotInProgress(void);\nstatic bool8 PageSwapAnimState_Init(struct Task *);\nstatic bool8 PageSwapAnimState_1(struct Task *);\nstatic bool8 PageSwapAnimState_2(struct Task *);\nstatic bool8 PageSwapAnimState_Done(struct Task *);\nstatic void TryStartButtonFlash(u8, u8, u8);\nstatic void Task_UpdateButtonFlash(u8);\nstatic u16 GetButtonPalOffset(u8);\nstatic void RestoreButtonColor(u8);\nstatic void StartButtonFlash(struct Task *, u8, u8);\nstatic void SpriteCB_Cursor(struct Sprite *);\nstatic void SpriteCB_InputArrow(struct Sprite *);\nstatic void SpriteCB_Underscore(struct Sprite *);\nstatic void CreateSprites(void);\nstatic void CreateCursorSprite(void);\nstatic void SetCursorPos(s16, s16);\nstatic void GetCursorPos(s16 *, s16 *);\nstatic void MoveCursorToOKButton(void);\nstatic void SetCursorInvisibility(u8);\nstatic void SetCursorFlashing(u8);\nstatic bool8 IsCursorAnimFinished(void);\nstatic u8 GetCurrentPageColumnCount(void);\nstatic void CreatePageSwapButtonSprites(void);\nstatic void StartPageSwapButtonAnim(void);\nstatic bool8 PageSwapSprite_Init(struct Sprite *);\nstatic bool8 PageSwapSprite_Idle(struct Sprite *);\nstatic bool8 PageSwapSprite_SlideOff(struct Sprite *);\nstatic bool8 PageSwapSprite_SlideOn(struct Sprite *);\nstatic void SetPageSwapButtonGfx(u8, struct Sprite *, struct Sprite *);\nstatic void CreateBackOkSprites(void);\nstatic void CreateTextEntrySprites(void);\nstatic void CreateInputTargetIcon(void);\nstatic void NamingScreen_NoIcon(void);\nstatic void NamingScreen_CreatePlayerIcon(void);\nstatic void NamingScreen_CreatePCIcon(void);\nstatic void NamingScreen_CreateMonIcon(void);\nstatic void NamingScreen_CreateRivalIcon(void);\nstatic bool8 HandleKeyboardEvent(void);\nstatic bool8 KeyboardKeyHandler_Character(u8);\nstatic bool8 KeyboardKeyHandler_Page(u8);\nstatic bool8 KeyboardKeyHandler_Backspace(u8);\nstatic bool8 KeyboardKeyHandler_OK(u8);\nstatic bool8 SwapKeyboardPage(void);\nstatic u8 GetInputEvent(void);\nstatic void SetInputState(u8);\nstatic void Task_HandleInput(u8);\nstatic void Input_Disabled(struct Task *);\nstatic void Input_Enabled(struct Task *);\nstatic void HandleDpadMovement(struct Task *);\nstatic void DrawTextEntryBox(void);\nstatic void DummyGenderIcon(void);\nstatic void DrawGenderIcon(void);\nstatic void DeleteTextCharacter(void);\nstatic u8 GetTextEntryPosition(void);\nstatic bool8 AddTextCharacter(void);\nstatic void BufferCharacter(u8 character);\nstatic void SaveInputText(void);\nstatic void LoadGfx(void);\nstatic void CreateHelperTasks(void);\nstatic void LoadPalettes(void);\nstatic void DecompressToBgTilemapBuffer(u8, const u32 *);\nstatic void DrawTextEntry(void);\nstatic void PrintKeyboardKeys(u8, u8);\nstatic void DrawKeyboardPageOnDeck(void);\nstatic void PrintControls(void);\nstatic void CB2_NamingScreen(void);\nstatic void ResetVHBlank(void);\nstatic void SetVBlank(void);\nstatic void VBlankCB_NamingScreen(void);\nstatic void NamingScreen_ShowBgs(void);\nstatic bool8 IsWideLetter(u8);\n\nstatic const struct SubspriteTable sSubspriteTable_PageSwapFrame[];\nstatic const struct SubspriteTable sSubspriteTable_PageSwapText[];\nstatic const struct SubspriteTable sSubspriteTable_Button[];\nstatic const struct SubspriteTable sSubspriteTable_PCIcon[];\nstatic const struct SpriteTemplate sSpriteTemplate_PageSwapFrame;\nstatic const struct SpriteTemplate sSpriteTemplate_PageSwapButton;\nstatic const struct SpriteTemplate sSpriteTemplate_PageSwapText;\nstatic const struct SpriteTemplate sSpriteTemplate_BackButton;\nstatic const struct SpriteTemplate sSpriteTemplate_OkButton;\nstatic const struct SpriteTemplate sSpriteTemplate_Cursor;\nstatic const struct SpriteTemplate sSpriteTemplate_InputArrow;\nstatic const struct SpriteTemplate sSpriteTemplate_Underscore;\nstatic const struct SpriteTemplate sSpriteTemplate_PCIcon;\nstatic const u8 *const sNamingScreenKeyboardText[][KBROW_COUNT];\nstatic const struct SpriteSheet sSpriteSheets[];\nstatic const struct SpritePalette sSpritePalettes[];\nstatic const struct NamingScreenTemplate *const sNamingScreenTemplates[];\n\nstatic const u16 sPCIconOff_Gfx[] = INCBIN_U16(\"graphics/naming_screen/pc_icon_off.4bpp\");\nstatic const u16 sPCIconOn_Gfx[] = INCBIN_U16(\"graphics/naming_screen/pc_icon_on.4bpp\");\nstatic const u16 sRival_Gfx[] = INCBIN_U16(\"graphics/naming_screen/rival.4bpp\");\n\nstatic const u8 *const sTransferredToPCMessages[] =\n{\n    Text_MonSentToBoxInSomeonesPC,\n    Text_MonSentToBoxInBillsPC,\n    Text_MonSentToBoxSomeonesBoxFull,\n    Text_MonSentToBoxBillsBoxFull\n};\n\nstatic const struct BgTemplate sBgTemplates[] =\n{\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .priority = 0,\n    },{\n        .bg = 1,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 29,\n        .priority = 1,\n    }, {\n        .bg = 2,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 28,\n        .priority = 2,\n    }, {\n        .bg = 3,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 31,\n        .priority = 3,\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates[WIN_COUNT + 1] =\n{\n    [WIN_KB_PAGE_1] = {\n        .bg = 1,\n        .tilemapLeft = 3,\n        .tilemapTop = 10,\n        .width = 19,\n        .height = 8,\n        .paletteNum = 10,\n        .baseBlock = 0x0030\n    },\n    [WIN_KB_PAGE_2] = {\n        .bg = 2,\n        .tilemapLeft = 3,\n        .tilemapTop = 10,\n        .width = 19,\n        .height = 8,\n        .paletteNum = 10,\n        .baseBlock = 0x00c8\n    },\n    [WIN_TEXT_ENTRY] = {\n        .bg = 3,\n        .tilemapLeft = 8,\n        .tilemapTop = 6,\n        .width = 14,\n        .height = 2,\n        .paletteNum = 10,\n        .baseBlock = 0x0030\n    },\n    [WIN_TEXT_ENTRY_BOX] = {\n        .bg = 3,\n        .tilemapLeft = 9,\n        .tilemapTop = 4,\n        .width = 16,\n        .height = 2,\n        .paletteNum = 10,\n        .baseBlock = 0x004c\n    },\n    [WIN_BANNER] = {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 30,\n        .height = 2,\n        .paletteNum = 11,\n        .baseBlock = 0x006c\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\n// This handles what characters get inserted when a key is pressed\n// The keys shown on the keyboard are handled separately by sNamingScreenKeyboardText\nstatic const u8 sKeyboardChars[KBPAGE_COUNT][KBROW_COUNT][KBCOL_COUNT] = {\n    [KEYBOARD_LETTERS_LOWER] = {\n        __(\"abcdef .\"),\n        __(\"ghijkl ,\"),\n        __(\"mnopqrs\"),\n        __(\"tuvwxyz\"),\n    },\n    [KEYBOARD_LETTERS_UPPER] = {\n        __(\"ABCDEF .\"),\n        __(\"GHIJKL ,\"),\n        __(\"MNOPQRS\"),\n        __(\"TUVWXYZ\"),\n    },\n    [KEYBOARD_SYMBOLS] = {\n        __(\"01234\"),\n        __(\"56789\"),\n        __(\"!?♂♀/-\"),\n        __(\"…“”‘'\"),\n    }\n};\n\nstatic const u8 sPageColumnCounts[] = {\n    [KEYBOARD_LETTERS_LOWER] = KBCOL_COUNT,\n    [KEYBOARD_LETTERS_UPPER] = KBCOL_COUNT,\n    [KEYBOARD_SYMBOLS]       = 6\n};\n\nstatic const u8 sPageColumnXPos[KBPAGE_COUNT][KBCOL_COUNT] = {\n    [KEYBOARD_LETTERS_LOWER] = {0, 12, 24, 56, 68, 80, 92, 123},\n    [KEYBOARD_LETTERS_UPPER] = {0, 12, 24, 56, 68, 80, 92, 123},\n    [KEYBOARD_SYMBOLS]       = {0, 22, 44, 66, 88, 110}\n};\n\nvoid DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGender, u32 monPersonality, MainCallback returnCallback)\n{\n    sNamingScreen = Alloc(sizeof(struct NamingScreenData));\n    if (!sNamingScreen)\n    {\n        SetMainCallback2(returnCallback);\n    }\n    else\n    {\n        sNamingScreen->templateNum = templateNum;\n        sNamingScreen->monSpecies = monSpecies;\n        sNamingScreen->monGender = monGender;\n        sNamingScreen->monPersonality = monPersonality;\n        sNamingScreen->destBuffer = destBuffer;\n        sNamingScreen->returnCallback = returnCallback;\n\n        if (templateNum == NAMING_SCREEN_PLAYER)\n            StartTimer1();\n\n        SetMainCallback2(CB2_LoadNamingScreen);\n    }\n}\n\nstatic void CB2_LoadNamingScreen(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        ResetVHBlank();\n        NamingScreen_Init();\n        gMain.state++;\n        break;\n    case 1:\n        NamingScreen_InitBGs();\n        gMain.state++;\n        break;\n    case 2:\n        ResetPaletteFade();\n        gMain.state++;\n        break;\n    case 3:\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        gMain.state++;\n        break;\n    case 4:\n        ResetTasks();\n        gMain.state++;\n        break;\n    case 5:\n        LoadPalettes();\n        gMain.state++;\n        break;\n    case 6:\n        LoadGfx();\n        gMain.state++;\n        break;\n    case 7:\n        CreateSprites();\n        UpdatePaletteFade();\n        NamingScreen_ShowBgs();\n        gMain.state++;\n        break;\n    default:\n        CreateHelperTasks();\n        CreateNamingScreenTask();\n        break;\n    }\n}\n\nstatic void NamingScreen_Init(void)\n{\n    sNamingScreen->state = STATE_FADE_IN;\n    sNamingScreen->bg1vOffset = 0;\n    sNamingScreen->bg2vOffset = 0;\n    sNamingScreen->bg1Priority = BGCNT_PRIORITY(1);\n    sNamingScreen->bg2Priority = BGCNT_PRIORITY(2);\n    sNamingScreen->bgToReveal = 0;\n    sNamingScreen->bgToHide = 1;\n    sNamingScreen->template = sNamingScreenTemplates[sNamingScreen->templateNum];\n    sNamingScreen->currentPage = sNamingScreen->template->initialPage;\n    sNamingScreen->inputCharBaseXPos = (DISPLAY_WIDTH - sNamingScreen->template->maxChars * 8) / 2 + 6;\n    sNamingScreen->keyRepeatStartDelayCopy = gKeyRepeatStartDelay;\n    memset(sNamingScreen->textBuffer, EOS, sizeof(sNamingScreen->textBuffer));\n    if (sNamingScreen->template->copyExistingString)\n        StringCopy(sNamingScreen->textBuffer, sNamingScreen->destBuffer);\n    gKeyRepeatStartDelay = 16;\n}\n\nstatic void SetSpritesVisible(void)\n{\n    u32 i;\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        if (gSprites[i].inUse)\n            gSprites[i].invisible = FALSE;\n    }\n    SetCursorInvisibility(0);\n}\n\nstatic void NamingScreen_InitBGs(void)\n{\n    u32 i;\n\n    DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);\n    DmaClear32(3, (void *)OAM, OAM_SIZE);\n    DmaClear16(3, (void *)PLTT, PLTT_SIZE);\n\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0);\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));\n\n    ChangeBgX(0, 0, BG_COORD_SET);\n    ChangeBgY(0, 0, BG_COORD_SET);\n    ChangeBgX(1, 0, BG_COORD_SET);\n    ChangeBgY(1, 0, BG_COORD_SET);\n    ChangeBgX(2, 0, BG_COORD_SET);\n    ChangeBgY(2, 0, BG_COORD_SET);\n    ChangeBgX(3, 0, BG_COORD_SET);\n    ChangeBgY(3, 0, BG_COORD_SET);\n\n    InitStandardTextBoxWindows();\n    InitTextBoxGfxAndPrinters();\n\n    for (i = 0; i < WIN_COUNT; i++)\n        sNamingScreen->windows[i] = AddWindow(&sWindowTemplates[i]);\n\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8));\n\n    SetBgTilemapBuffer(1, sNamingScreen->tilemapBuffer1);\n    SetBgTilemapBuffer(2, sNamingScreen->tilemapBuffer2);\n    SetBgTilemapBuffer(3, sNamingScreen->tilemapBuffer3);\n\n    FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 0x20, 0x20);\n    FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 0x20, 0x20);\n    FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 0x20, 0x20);\n}\n\nstatic void CreateNamingScreenTask(void)\n{\n    CreateTask(Task_NamingScreen, 2);\n    SetMainCallback2(CB2_NamingScreen);\n    BackupHelpContext();\n    SetHelpContext(HELPCONTEXT_NAMING_SCREEN);\n}\n\nstatic void Task_NamingScreen(u8 taskId)\n{\n    switch (sNamingScreen->state)\n    {\n    case STATE_FADE_IN:\n        MainState_FadeIn();\n        SetSpritesVisible();\n        SetVBlank();\n        break;\n    case STATE_WAIT_FADE_IN:\n        MainState_WaitFadeIn();\n        break;\n    case STATE_HANDLE_INPUT:\n        MainState_HandleInput();\n        break;\n    case STATE_MOVE_TO_OK_BUTTON:\n        MainState_MoveToOKButton();\n        break;\n    case STATE_START_PAGE_SWAP:\n        MainState_StartPageSwap();\n        break;\n    case STATE_WAIT_PAGE_SWAP:\n        MainState_WaitPageSwap();\n        break;\n    case STATE_PRESSED_OK:\n        MainState_PressedOKButton();\n        break;\n    case STATE_WAIT_SENT_TO_PC_MESSAGE:\n        MainState_WaitSentToPCMessage();\n        break;\n    case STATE_FADE_OUT:\n        MainState_FadeOut();\n        break;\n    case STATE_EXIT:\n        MainState_Exit();\n        break;\n    }\n}\n\n// Which gfx/pal to load for the swap page button\nstatic const u8 sPageToNextGfxId[KBPAGE_COUNT] =\n{\n    [KBPAGE_SYMBOLS]       = PAGE_SWAP_UPPER,\n    [KBPAGE_LETTERS_UPPER] = PAGE_SWAP_LOWER,\n    [KBPAGE_LETTERS_LOWER] = PAGE_SWAP_OTHERS\n};\n\nstatic const u8 sPageToNextKeyboardId[KBPAGE_COUNT] =\n{\n    [KBPAGE_SYMBOLS]       = KEYBOARD_LETTERS_UPPER,\n    [KBPAGE_LETTERS_UPPER] = KEYBOARD_LETTERS_LOWER,\n    [KBPAGE_LETTERS_LOWER] = KEYBOARD_SYMBOLS\n};\n\nstatic const u8 sPageToKeyboardId[KBPAGE_COUNT] =\n{\n    [KBPAGE_SYMBOLS]       = KEYBOARD_SYMBOLS,\n    [KBPAGE_LETTERS_UPPER] = KEYBOARD_LETTERS_UPPER,\n    [KBPAGE_LETTERS_LOWER] = KEYBOARD_LETTERS_LOWER\n};\n\nstatic u8 PageToNextGfxId(u8 page)\n{\n    return sPageToNextGfxId[page];\n}\n\nstatic u8 CurrentPageToNextKeyboardId(void)\n{\n    return sPageToNextKeyboardId[sNamingScreen->currentPage];\n}\n\nstatic u8 CurrentPageToKeyboardId(void)\n{\n    return sPageToKeyboardId[sNamingScreen->currentPage];\n}\n\nstatic bool8 MainState_FadeIn(void)\n{\n    DecompressToBgTilemapBuffer(3, gNamingScreenBackground_Tilemap);\n    sNamingScreen->currentPage = KBPAGE_LETTERS_UPPER;\n    DecompressToBgTilemapBuffer(2, gNamingScreenKeyboardLower_Tilemap);\n    DecompressToBgTilemapBuffer(1, gNamingScreenKeyboardUpper_Tilemap);\n    PrintKeyboardKeys(sNamingScreen->windows[WIN_KB_PAGE_2], KEYBOARD_LETTERS_LOWER);\n    PrintKeyboardKeys(sNamingScreen->windows[WIN_KB_PAGE_1], KEYBOARD_LETTERS_UPPER);\n    DrawTextEntry();\n    DrawTextEntryBox();\n    PrintControls();\n    CopyBgTilemapBufferToVram(1);\n    CopyBgTilemapBufferToVram(2);\n    CopyBgTilemapBufferToVram(3);\n    BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n    sNamingScreen->state++;\n    return FALSE;\n}\n\nstatic bool8 MainState_WaitFadeIn(void)\n{\n    if (!gPaletteFade.active)\n    {\n        SetInputState(INPUT_STATE_ENABLED);\n        SetCursorFlashing(TRUE);\n        sNamingScreen->state++;\n    }\n    return FALSE;\n}\n\nstatic bool8 MainState_HandleInput(void)\n{\n    return HandleKeyboardEvent();\n}\n\nstatic bool8 MainState_MoveToOKButton(void)\n{\n    if (IsCursorAnimFinished())\n    {\n        SetInputState(INPUT_STATE_ENABLED);\n        MoveCursorToOKButton();\n        sNamingScreen->state = STATE_HANDLE_INPUT;\n    }\n    return FALSE;\n}\n\nstatic bool8 MainState_PressedOKButton(void)\n{\n    SaveInputText();\n    SetInputState(INPUT_STATE_DISABLED);\n    SetCursorFlashing(FALSE);\n    TryStartButtonFlash(BUTTON_COUNT, FALSE, TRUE);\n    if (sNamingScreen->templateNum == NAMING_SCREEN_CAUGHT_MON\n        && CalculatePlayerPartyCount() >= PARTY_SIZE)\n    {\n        DisplaySentToPCMessage();\n        sNamingScreen->state = STATE_WAIT_SENT_TO_PC_MESSAGE;\n        return FALSE;\n    }\n    else\n    {\n        sNamingScreen->state = STATE_FADE_OUT;\n        return TRUE;  //Exit the naming screen\n    }\n}\n\nstatic bool8 MainState_FadeOut(void)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n    sNamingScreen->state++;\n    return FALSE;\n}\n\nstatic bool8 MainState_Exit(void)\n{\n    if (!gPaletteFade.active)\n    {\n        if (sNamingScreen->templateNum == NAMING_SCREEN_PLAYER)\n            SeedRngAndSetTrainerId();\n        SetMainCallback2(sNamingScreen->returnCallback);\n        DestroyTask(FindTaskIdByFunc(Task_NamingScreen));\n        FreeAllWindowBuffers();\n        FREE_AND_SET_NULL(sNamingScreen);\n        RestoreHelpContext();\n    }\n    return FALSE;\n}\n\nstatic void DisplaySentToPCMessage(void)\n{\n    u8 stringToDisplay = 0;\n\n    if (!IsDestinationBoxFull())\n    {\n        StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON)));\n        StringCopy(gStringVar2, sNamingScreen->destBuffer);\n    }\n    else\n    {\n        StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON)));\n        StringCopy(gStringVar2, sNamingScreen->destBuffer);\n        StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon()));\n        stringToDisplay = 2;\n    }\n\n    if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC))\n        stringToDisplay++;\n\n    StringExpandPlaceholders(gStringVar4, sTransferredToPCMessages[stringToDisplay]);\n    DrawDialogueFrame(0, FALSE);\n    gTextFlags.canABSpeedUpPrint = TRUE;\n    AddTextPrinterParameterized2(0, FONT_NORMAL, gStringVar4, GetTextSpeedSetting(), NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    CopyWindowToVram(0, COPYWIN_FULL);\n}\n\nstatic bool8 MainState_WaitSentToPCMessage(void)\n{\n    RunTextPrinters();\n    if (!IsTextPrinterActive(0) && JOY_NEW(A_BUTTON))\n        sNamingScreen->state = STATE_FADE_OUT;\n\n    return FALSE;\n}\n\nstatic bool8 MainState_StartPageSwap(void)\n{\n    SetInputState(INPUT_STATE_DISABLED);\n    StartPageSwapButtonAnim();\n    StartPageSwapAnim();\n    SetCursorInvisibility(TRUE);\n    TryStartButtonFlash(BUTTON_PAGE, FALSE, TRUE);\n    PlaySE(SE_WIN_OPEN);\n    sNamingScreen->state = STATE_WAIT_PAGE_SWAP;\n    return FALSE;\n}\n\nstatic bool8 MainState_WaitPageSwap(void)\n{\n    s16 cursorX;\n    s16 cursorY;\n    bool32 onLastColumn;\n\n    if (IsPageSwapAnimNotInProgress())\n    {\n\n        GetCursorPos(&cursorX, &cursorY);\n        onLastColumn = (cursorX == GetCurrentPageColumnCount());\n\n        sNamingScreen->state = STATE_HANDLE_INPUT;\n        sNamingScreen->currentPage++;\n        sNamingScreen->currentPage %= KBPAGE_COUNT;\n\n        if (onLastColumn)\n        {\n            cursorX = GetCurrentPageColumnCount();\n        }\n        else\n        {\n            if (cursorX >= GetCurrentPageColumnCount())\n                cursorX = GetCurrentPageColumnCount() - 1;\n        }\n\n        SetCursorPos(cursorX, cursorY);\n        DrawKeyboardPageOnDeck();\n        SetInputState(INPUT_STATE_ENABLED);\n        SetCursorInvisibility(FALSE);\n    }\n    return FALSE;\n}\n\n//--------------------------------------------------\n// Page Swap\n//--------------------------------------------------\n\n#define tState data[0]\n#define tFrameCount data[1]\n\nstatic bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *task) =\n{\n    PageSwapAnimState_Init,\n    PageSwapAnimState_1,\n    PageSwapAnimState_2,\n    PageSwapAnimState_Done\n};\n\nstatic void StartPageSwapAnim(void)\n{\n    u8 taskId = CreateTask(Task_HandlePageSwapAnim, 0);\n    Task_HandlePageSwapAnim(taskId);\n}\n\nstatic void Task_HandlePageSwapAnim(u8 taskId)\n{\n    while (sPageSwapAnimStateFuncs[gTasks[taskId].tState](&gTasks[taskId]))\n        ;\n}\n\nstatic bool8 IsPageSwapAnimNotInProgress(void)\n{\n    if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == TASK_NONE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic bool8 PageSwapAnimState_Init(struct Task *task)\n{\n    sNamingScreen->bg1vOffset = 0;\n    sNamingScreen->bg2vOffset = 0;\n    task->tState++;\n    return 0;\n}\n\nstatic bool8 PageSwapAnimState_1(struct Task *task)\n{\n    u16 *const vOffsets[] =\n    {\n        &sNamingScreen->bg2vOffset,\n        &sNamingScreen->bg1vOffset\n    };\n\n    task->tFrameCount += 4;\n    *vOffsets[sNamingScreen->bgToReveal] = Sin(task->tFrameCount, 40);\n    *vOffsets[sNamingScreen->bgToHide] = Sin((task->tFrameCount + 128) & 0xFF, 40);\n    if (task->tFrameCount >= 64)\n    {\n        u8 temp;\n        SWAP(sNamingScreen->bg1Priority, sNamingScreen->bg2Priority, temp);\n        task->tState++;\n    }\n    return 0;\n}\n\nstatic bool8 PageSwapAnimState_2(struct Task *task)\n{\n    u16 *const vOffsets[] =\n    {\n        &sNamingScreen->bg2vOffset,\n        &sNamingScreen->bg1vOffset\n    };\n\n    task->tFrameCount += 4;\n    *vOffsets[sNamingScreen->bgToReveal] = Sin(task->tFrameCount, 40);\n    *vOffsets[sNamingScreen->bgToHide] = Sin((task->tFrameCount + 128) & 0xFF, 40);\n    if (task->tFrameCount >= 128)\n    {\n        u8 temp;\n        SWAP(sNamingScreen->bgToReveal, sNamingScreen->bgToHide, temp);\n        task->tState++;\n    }\n    return 0;\n}\n\nstatic bool8 PageSwapAnimState_Done(struct Task *task)\n{\n    DestroyTask(FindTaskIdByFunc(Task_HandlePageSwapAnim));\n    return 0;\n}\n\n#undef tState\n#undef tFrameCount\n\n//--------------------------------------------------\n// Cursor blink\n//--------------------------------------------------\n\n#define tButtonId     data[0]\n#define tKeepFlashing data[1]\n#define tAllowFlash   data[2]\n#define tColor        data[3]\n#define tColorIncr    data[4]\n#define tColorDelay   data[5]\n#define tColorDelta   data[6]\n\nstatic void CreateButtonFlashTask(void)\n{\n    u8 taskId = CreateTask(Task_UpdateButtonFlash, 3);\n    gTasks[taskId].tButtonId = BUTTON_COUNT;\n}\n\nstatic void TryStartButtonFlash(u8 button, bool8 keepFlashing, bool8 interruptCurFlash)\n{\n    struct Task *task = &gTasks[FindTaskIdByFunc(Task_UpdateButtonFlash)];\n\n    if (button == task->tButtonId && !interruptCurFlash)\n    {\n        task->tKeepFlashing = keepFlashing;\n        task->tAllowFlash = TRUE;\n        return;\n    }\n    if (button == BUTTON_COUNT && !task->tKeepFlashing && !interruptCurFlash)\n        return;\n\n    if (task->tButtonId != BUTTON_COUNT)\n        RestoreButtonColor(task->tButtonId);\n    StartButtonFlash(task, button, keepFlashing);\n}\n\nstatic void Task_UpdateButtonFlash(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (task->tButtonId == BUTTON_COUNT || !task->tAllowFlash)\n        return;\n\n    MultiplyInvertedPaletteRGBComponents(GetButtonPalOffset(task->tButtonId), task->tColor, task->tColor, task->tColor);\n\n    if (task->tColorDelay && --task->tColorDelay)\n        return;\n\n    task->tColorDelay = 2;\n    if (task->tColorIncr >= 0)\n    {\n        if (task->tColor < 14)\n        {\n            task->tColor += task->tColorIncr;\n            task->tColorDelta += task->tColorIncr;\n        }\n        else\n        {\n            task->tColor = 16;\n            task->tColorDelta++;\n        }\n    }\n    else\n    {\n        task->tColor += task->tColorIncr;\n        task->tColorDelta += task->tColorIncr;\n    }\n\n    if (task->tColor == 16 && task->tColorDelta == 22)\n    {\n        task->tColorIncr = -4;\n    }\n    else if (task->tColor == 0)\n    {\n        task->tAllowFlash = task->tKeepFlashing;\n        task->tColorIncr = 2;\n        task->tColorDelta = 0;\n    }\n}\n\nstatic u16 GetButtonPalOffset(u8 button)\n{\n    const u16 palOffsets[BUTTON_COUNT + 1] =\n    {\n        [BUTTON_PAGE]  = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_PAGE_SWAP)) + 14,\n        [BUTTON_BACK]  = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_BACK_BUTTON)) + 14,\n        [BUTTON_OK]    = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_OK_BUTTON)) + 14,\n        [BUTTON_COUNT] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_OK_BUTTON)) + 1,\n    };\n\n    return palOffsets[button];\n}\n\nstatic void RestoreButtonColor(u8 button)\n{\n    u16 index = GetButtonPalOffset(button);\n    gPlttBufferFaded[index] = gPlttBufferUnfaded[index];\n}\n\nstatic void StartButtonFlash(struct Task *task, u8 button, u8 keepFlashing)\n{\n    task->tButtonId = button;\n    task->tKeepFlashing = keepFlashing;\n    task->tAllowFlash = TRUE;\n    task->tColor = 4;\n    task->tColorIncr = 2;\n    task->tColorDelay = 0;\n    task->tColorDelta = 4;\n}\n\n#undef tButtonId\n#undef tKeepFlashing\n#undef tAllowFlash\n#undef tColor\n#undef tColorIncr\n#undef tColorDelay\n#undef tColorDelta\n\n//--------------------------------------------------\n// Cursor\n//--------------------------------------------------\n\n// Sprite data for the the cursor\n#define sX          data[0]\n#define sY          data[1]\n#define sPrevX      data[2]\n#define sPrevY      data[3]\n#define sInvisible  data[4] & 0x00FF\n#define sFlashing   data[4] & 0xFF00\n#define sColor      data[5]\n#define sColorIncr  data[6]\n#define sColorDelay data[7]\n\nstatic void SpriteCB_Cursor(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n        StartSpriteAnim(sprite, 0);\n\n    // Hide cursor when on button column\n    sprite->invisible = sprite->sInvisible;\n    if (sprite->sX == GetCurrentPageColumnCount())\n        sprite->invisible = TRUE;\n\n    if (sprite->invisible\n        || !(sprite->sFlashing)\n        || sprite->sX != sprite->sPrevX\n        || sprite->sY != sprite->sPrevY)\n    {\n        sprite->sColor = 0;\n        sprite->sColorIncr = 2;\n        sprite->sColorDelay = 2;\n    }\n\n    sprite->sColorDelay--;\n    if (sprite->sColorDelay == 0)\n    {\n        sprite->sColor += sprite->sColorIncr;\n        if (sprite->sColor == 16 || sprite->sColor == 0)\n            sprite->sColorIncr = -sprite->sColorIncr;\n        sprite->sColorDelay = 2;\n    }\n\n    if (sprite->sFlashing)\n    {\n        s8 gb = sprite->sColor;\n        s8 r = sprite->sColor >> 1;\n        u16 index = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_CURSOR)) + 1;\n\n        MultiplyInvertedPaletteRGBComponents(index, r, gb, gb);\n    }\n}\n\n#define sDelay  data[0]\n#define sXPosId data[1]\n\nstatic void SpriteCB_InputArrow(struct Sprite *sprite)\n{\n    const s16 x[] = {0, -4, -2, -1};\n\n    if (sprite->sDelay == 0 || --sprite->sDelay == 0)\n    {\n        sprite->sDelay = 8;\n        sprite->sXPosId = (sprite->sXPosId + 1) & (ARRAY_COUNT(x) - 1);\n    }\n    sprite->x2 = x[sprite->sXPosId];\n}\n\n#undef sDelay\n#undef sXPosId\n\n#define sId     data[0] // set in CreateTextEntrySprites\n#define sYPosId data[1]\n#define sDelay  data[2]\n\nstatic void SpriteCB_Underscore(struct Sprite *sprite)\n{\n    const s16 y[] = {2, 3, 2, 1};\n    u8 pos = GetTextEntryPosition();\n\n    if (pos != (u8)sprite->sId)\n    {\n        sprite->y2 = 0;\n        sprite->sYPosId = 0;\n        sprite->sDelay = 0;\n    }\n    else\n    {\n        sprite->y2 = y[sprite->sYPosId];\n        sprite->sDelay++;\n        if (sprite->sDelay > 8)\n        {\n            sprite->sYPosId = (sprite->sYPosId + 1) & (ARRAY_COUNT(y) - 1);\n            sprite->sDelay = 0;\n        }\n    }\n}\n\n#undef sId\n#undef sYPosId\n#undef sDelay\n\nstatic void CreateSprites(void)\n{\n    CreateCursorSprite();\n    CreatePageSwapButtonSprites();\n    CreateBackOkSprites();\n    CreateTextEntrySprites();\n    CreateInputTargetIcon();\n}\n\nstatic void CreateCursorSprite(void)\n{\n    sNamingScreen->cursorSpriteId = CreateSprite(&sSpriteTemplate_Cursor, 38, 88, 1);\n    SetCursorInvisibility(TRUE);\n    gSprites[sNamingScreen->cursorSpriteId].oam.priority = 1;\n    gSprites[sNamingScreen->cursorSpriteId].oam.objMode = ST_OAM_OBJ_BLEND;\n    gSprites[sNamingScreen->cursorSpriteId].sColorIncr = 1; // ? immediately overwritten\n    gSprites[sNamingScreen->cursorSpriteId].sColorIncr = 2;\n    SetCursorPos(0, 0);\n}\n\nstatic void SetCursorPos(s16 x, s16 y)\n{\n    struct Sprite *cursorSprite = &gSprites[sNamingScreen->cursorSpriteId];\n\n    if (x < sPageColumnCounts[CurrentPageToKeyboardId()])\n        cursorSprite->x = sPageColumnXPos[CurrentPageToKeyboardId()][x] + 38;\n    else\n        cursorSprite->x = 0;\n\n    cursorSprite->y = y * 16 + 88;\n    cursorSprite->sPrevX = cursorSprite->sX;\n    cursorSprite->sPrevY = cursorSprite->sY;\n    cursorSprite->sX = x;\n    cursorSprite->sY = y;\n}\n\nstatic void GetCursorPos(s16 *x, s16 *y)\n{\n    struct Sprite *cursorSprite = &gSprites[sNamingScreen->cursorSpriteId];\n\n    *x = cursorSprite->sX;\n    *y = cursorSprite->sY;\n}\n\nstatic void MoveCursorToOKButton(void)\n{\n    SetCursorPos(GetCurrentPageColumnCount(), 2);\n}\n\nstatic void SetCursorInvisibility(bool8 invisible)\n{\n    gSprites[sNamingScreen->cursorSpriteId].data[4] &= 0xFF00;\n    gSprites[sNamingScreen->cursorSpriteId].data[4] |= invisible; // sInvisible\n    StartSpriteAnim(&gSprites[sNamingScreen->cursorSpriteId], 0);\n}\n\nstatic void SetCursorFlashing(bool8 flashing)\n{\n    gSprites[sNamingScreen->cursorSpriteId].data[4] &= 0xFF;\n    gSprites[sNamingScreen->cursorSpriteId].data[4] |= flashing << 8; // sFlashing\n}\n\nstatic void SquishCursor(void)\n{\n    StartSpriteAnim(&gSprites[sNamingScreen->cursorSpriteId], 1);\n}\n\nstatic bool8 IsCursorAnimFinished(void)\n{\n    return gSprites[sNamingScreen->cursorSpriteId].animEnded;\n}\n\nstatic const u8 sButtonKeyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK};\n\nstatic u8 GetKeyRoleAtCursorPos(void)\n{\n    s16 cursorX;\n    s16 cursorY;\n\n    GetCursorPos(&cursorX, &cursorY);\n    if (cursorX < GetCurrentPageColumnCount())\n        return KEY_ROLE_CHAR;\n    else\n        return sButtonKeyRoles[cursorY];\n}\n\n// If the cursor's x is equal to the column count, cursor is in the button column\nstatic u8 GetCurrentPageColumnCount(void)\n{\n    return sPageColumnCounts[CurrentPageToKeyboardId()];\n}\n\n#undef sX\n#undef sY\n#undef sPrevX\n#undef sPrevY\n#undef sInvisible\n#undef sFlashing\n#undef sColor\n#undef sColorIncr\n#undef sColorDelay\n\n#define sState          data[0]\n#define sPage           data[1]\n#define sTextSpriteId   data[6]\n#define sButtonSpriteId data[7]\n\nstatic void CreatePageSwapButtonSprites(void)\n{\n    u8 frameSpriteId;\n    u8 textSpriteId;\n    u8 buttonSpriteId;\n\n    frameSpriteId = CreateSprite(&sSpriteTemplate_PageSwapFrame, 204, 88, 0);\n    sNamingScreen->swapBtnFrameSpriteId = frameSpriteId;\n    SetSubspriteTables(&gSprites[frameSpriteId], sSubspriteTable_PageSwapFrame);\n    gSprites[frameSpriteId].invisible = TRUE;\n\n    textSpriteId = CreateSprite(&sSpriteTemplate_PageSwapText, 204, 84, 1);\n    gSprites[frameSpriteId].data[6] = textSpriteId;\n    SetSubspriteTables(&gSprites[textSpriteId], sSubspriteTable_PageSwapText);\n    gSprites[textSpriteId].invisible = TRUE;\n\n    buttonSpriteId = CreateSprite(&sSpriteTemplate_PageSwapButton, 204, 83, 2);\n    gSprites[buttonSpriteId].oam.priority = 1;\n    gSprites[frameSpriteId].data[7] = buttonSpriteId;\n    gSprites[buttonSpriteId].invisible = TRUE;\n}\n\nstatic void StartPageSwapButtonAnim(void)\n{\n    struct Sprite *sprite = &gSprites[sNamingScreen->swapBtnFrameSpriteId];\n\n    sprite->sState = 2; // go to PageSwapSprite_SlideOff\n    sprite->sPage = sNamingScreen->currentPage;\n}\n\nstatic bool8 (*const sPageSwapSpriteFuncs[])(struct Sprite *sprite) =\n{\n    PageSwapSprite_Init,\n    PageSwapSprite_Idle,\n    PageSwapSprite_SlideOff,\n    PageSwapSprite_SlideOn\n};\n\nstatic void SpriteCB_PageSwap(struct Sprite *sprite)\n{\n    while (sPageSwapSpriteFuncs[sprite->sState](sprite))\n        ;\n}\n\nstatic bool8 PageSwapSprite_Init(struct Sprite *sprite)\n{\n    struct Sprite *text = &gSprites[sprite->sTextSpriteId];\n    struct Sprite *button = &gSprites[sprite->sButtonSpriteId];\n\n    SetPageSwapButtonGfx(PageToNextGfxId(sNamingScreen->currentPage), text, button);\n    sprite->sState++;\n    return FALSE;\n}\n\nstatic bool8 PageSwapSprite_Idle(struct Sprite *sprite)\n{\n    return FALSE;\n}\n\nstatic bool8 PageSwapSprite_SlideOff(struct Sprite *sprite)\n{\n    struct Sprite *text = &gSprites[sprite->sTextSpriteId];\n    struct Sprite *button = &gSprites[sprite->sButtonSpriteId];\n\n    if (++text->y2 > 7)\n    {\n        sprite->sState++;\n        text->y2 = -4;\n        text->invisible = TRUE;\n        SetPageSwapButtonGfx(PageToNextGfxId(((u8)sprite->sPage + 1) % KBPAGE_COUNT), text, button);\n    }\n    return FALSE;\n}\n\nstatic bool8 PageSwapSprite_SlideOn(struct Sprite *sprite)\n{\n    struct Sprite *text = &gSprites[sprite->sTextSpriteId];\n\n    text->invisible = FALSE;\n    if (++text->y2 >= 0)\n    {\n        text->y2 = 0;\n        sprite->sState = 1; // go to PageSwapSprite_Idle\n    }\n    return FALSE;\n}\n\nstatic const u16 sPageSwapPalTags[] = {\n    [PAGE_SWAP_UPPER]  = PALTAG_PAGE_SWAP_UPPER,\n    [PAGE_SWAP_OTHERS] = PALTAG_PAGE_SWAP_OTHERS,\n    [PAGE_SWAP_LOWER]  = PALTAG_PAGE_SWAP_LOWER\n};\n\nstatic const u16 sPageSwapGfxTags[] = {\n    [PAGE_SWAP_UPPER]  = GFXTAG_PAGE_SWAP_UPPER,\n    [PAGE_SWAP_OTHERS] = GFXTAG_PAGE_SWAP_OTHERS,\n    [PAGE_SWAP_LOWER]  = GFXTAG_PAGE_SWAP_LOWER\n};\n\nstatic void SetPageSwapButtonGfx(u8 page, struct Sprite *text, struct Sprite *button)\n{\n    button->oam.paletteNum = IndexOfSpritePaletteTag(sPageSwapPalTags[page]);\n    text->sheetTileStart = GetSpriteTileStartByTag(sPageSwapGfxTags[page]);\n    text->subspriteTableNum = page;\n}\n\n#undef sState\n#undef sPage\n#undef sTextSpriteId\n#undef sButtonSpriteId\n\nstatic void CreateBackOkSprites(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_BackButton, 204, 116, 0);\n    SetSubspriteTables(&gSprites[spriteId], sSubspriteTable_Button);\n    gSprites[spriteId].invisible = TRUE;\n\n    spriteId = CreateSprite(&sSpriteTemplate_OkButton, 204, 140, 0);\n    SetSubspriteTables(&gSprites[spriteId], sSubspriteTable_Button);\n    gSprites[spriteId].invisible = TRUE;\n}\n\nstatic void CreateTextEntrySprites(void)\n{\n    u8 spriteId;\n    s16 xPos;\n    u32 i;\n\n    xPos = sNamingScreen->inputCharBaseXPos - 5;\n    spriteId = CreateSprite(&sSpriteTemplate_InputArrow, xPos, 56, 0);\n    gSprites[spriteId].oam.priority = 3;\n    gSprites[spriteId].invisible = TRUE;\n    xPos = sNamingScreen->inputCharBaseXPos;\n    for (i = 0; i < sNamingScreen->template->maxChars; i++, xPos += 8)\n    {\n        spriteId = CreateSprite(&sSpriteTemplate_Underscore, xPos + 3, 60, 0);\n        gSprites[spriteId].oam.priority = 3;\n        gSprites[spriteId].data[0] = i;\n        gSprites[spriteId].invisible = TRUE;\n    }\n}\n\n//--------------------------------------------------\n// Icon creation (the thing you're naming or giving input to)\n//--------------------------------------------------\n\nstatic void (*const sIconFunctions[])(void) =\n{\n    NamingScreen_NoIcon,\n    NamingScreen_CreatePlayerIcon,\n    NamingScreen_CreatePCIcon,\n    NamingScreen_CreateMonIcon,\n    NamingScreen_CreateRivalIcon\n};\n\nstatic void CreateInputTargetIcon(void)\n{\n    sIconFunctions[sNamingScreen->template->iconFunction]();\n}\n\nstatic void NamingScreen_NoIcon(void)\n{\n\n}\n\nstatic void NamingScreen_CreatePlayerIcon(void)\n{\n    u8 rivalGfxId;\n    u8 spriteId;\n\n    rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, sNamingScreen->monSpecies);\n    spriteId = CreateObjectGraphicsSprite(rivalGfxId, SpriteCallbackDummy, 56, 37, 0);\n    gSprites[spriteId].oam.priority = 3;\n    StartSpriteAnim(&gSprites[spriteId], ANIM_STD_GO_SOUTH);\n}\n\nstatic void NamingScreen_CreatePCIcon(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_PCIcon, 56, 41, 0);\n    SetSubspriteTables(&gSprites[spriteId], sSubspriteTable_PCIcon);\n    gSprites[spriteId].oam.priority = 3;\n}\n\nstatic void NamingScreen_CreateMonIcon(void)\n{\n    u8 spriteId;\n\n    LoadMonIconPalettes();\n    spriteId = CreateMonIcon(sNamingScreen->monSpecies, SpriteCallbackDummy, 56, 40, 0, sNamingScreen->monPersonality, 1);\n    gSprites[spriteId].oam.priority = 3;\n}\n\nstatic const union AnimCmd sAnim_Rival[] =\n{\n    ANIMCMD_FRAME( 0, 10),\n    ANIMCMD_FRAME(24, 10),\n    ANIMCMD_FRAME( 0, 10),\n    ANIMCMD_FRAME(32, 10),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_Rival[] =\n{\n    sAnim_Rival\n};\n\nstatic void NamingScreen_CreateRivalIcon(void)\n{\n    const struct SpriteSheet sheet = {\n        sRival_Gfx, 0x900, GFXTAG_RIVAL\n    };\n    const struct SpritePalette palette = {\n        gNamingScreenRival_Pal, PALTAG_RIVAL\n    };\n    struct SpriteTemplate template;\n    const struct SubspriteTable * tables_p;\n    u8 spriteId;\n\n    CopyObjectGraphicsInfoToSpriteTemplate(OBJ_EVENT_GFX_RED_NORMAL, SpriteCallbackDummy, &template, &tables_p);\n\n    template.tileTag = sheet.tag;\n    template.paletteTag = palette.tag;\n    template.anims = sAnims_Rival;\n    LoadSpriteSheet(&sheet);\n    LoadSpritePalette(&palette);\n    spriteId = CreateSprite(&template, 56, 37, 0);\n    gSprites[spriteId].oam.priority = 3;\n}\n\nstatic bool8 (*const sKeyboardKeyHandlers[])(u8) =\n{\n    [KEY_ROLE_CHAR]      = KeyboardKeyHandler_Character,\n    [KEY_ROLE_PAGE]      = KeyboardKeyHandler_Page,\n    [KEY_ROLE_BACKSPACE] = KeyboardKeyHandler_Backspace,\n    [KEY_ROLE_OK]        = KeyboardKeyHandler_OK,\n};\n\nstatic bool8 HandleKeyboardEvent(void)\n{\n    u8 input = GetInputEvent();\n    u8 keyRole = GetKeyRoleAtCursorPos();\n\n    if (input == INPUT_SELECT)\n    {\n        return SwapKeyboardPage();\n    }\n    else if (input == INPUT_B_BUTTON)\n    {\n        DeleteTextCharacter();\n        return FALSE;\n    }\n    else if (input == INPUT_START)\n    {\n        MoveCursorToOKButton();\n        return FALSE;\n    }\n    else\n    {\n        return sKeyboardKeyHandlers[keyRole](input);\n    }\n}\n\nstatic bool8 KeyboardKeyHandler_Character(u8 input)\n{\n    TryStartButtonFlash(BUTTON_COUNT, FALSE, FALSE);\n    if (input == INPUT_A_BUTTON)\n    {\n        bool8 textFull = AddTextCharacter();\n\n        if (sNamingScreen->currentPage == KBPAGE_LETTERS_UPPER && GetTextEntryPosition() == 1)\n            MainState_StartPageSwap();\n\n        SquishCursor();\n        if (textFull)\n        {\n            SetInputState(INPUT_STATE_DISABLED);\n            sNamingScreen->state = STATE_MOVE_TO_OK_BUTTON;\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 KeyboardKeyHandler_Page(u8 input)\n{\n    TryStartButtonFlash(BUTTON_PAGE, TRUE, FALSE);\n    if (input == INPUT_A_BUTTON)\n        return SwapKeyboardPage();\n    else\n        return FALSE;\n}\n\nstatic bool8 KeyboardKeyHandler_Backspace(u8 input)\n{\n    TryStartButtonFlash(BUTTON_BACK, TRUE, FALSE);\n    if (input == INPUT_A_BUTTON)\n        DeleteTextCharacter();\n    return FALSE;\n}\n\nstatic bool8 KeyboardKeyHandler_OK(u8 input)\n{\n    TryStartButtonFlash(BUTTON_OK, TRUE, FALSE);\n    if (input == INPUT_A_BUTTON)\n    {\n        PlaySE(SE_SELECT);\n        sNamingScreen->state = STATE_PRESSED_OK;\n        return TRUE;\n    }\n    else\n        return FALSE;\n}\n\nstatic bool8 SwapKeyboardPage(void)\n{\n    sNamingScreen->state = STATE_START_PAGE_SWAP;\n    return TRUE;\n}\n\n//--------------------------------------------------\n// Input handling\n//--------------------------------------------------\n\n#define tState data[0]\n#define tKeyboardEvent data[1]\n#define tButtonId data[2]\n\nstatic void (*const sInputFuncs[])(struct Task *) =\n{\n    [INPUT_STATE_DISABLED] = Input_Disabled,\n    [INPUT_STATE_ENABLED]  = Input_Enabled,\n};\n\nstatic void CreateInputHandlerTask(void)\n{\n    CreateTask(Task_HandleInput, 1);\n}\n\nstatic u8 GetInputEvent(void)\n{\n    u8 taskId = FindTaskIdByFunc(Task_HandleInput);\n\n    return gTasks[taskId].tKeyboardEvent;\n}\n\nstatic void SetInputState(u8 state)\n{\n    u8 taskId = FindTaskIdByFunc(Task_HandleInput);\n\n    gTasks[taskId].tState = state;\n}\n\nstatic void Task_HandleInput(u8 taskId)\n{\n    sInputFuncs[gTasks[taskId].tState](&gTasks[taskId]);\n}\n\nstatic void Input_Disabled(struct Task *task)\n{\n    task->tKeyboardEvent = INPUT_NONE;\n}\n\nstatic void Input_Enabled(struct Task *task)\n{\n    task->tKeyboardEvent = INPUT_NONE;\n\n    if (JOY_NEW(A_BUTTON))\n        task->tKeyboardEvent = INPUT_A_BUTTON;\n    else if (JOY_NEW(B_BUTTON))\n        task->tKeyboardEvent = INPUT_B_BUTTON;\n    else if (JOY_NEW(SELECT_BUTTON))\n        task->tKeyboardEvent = INPUT_SELECT;\n    else if (JOY_NEW(START_BUTTON))\n        task->tKeyboardEvent = INPUT_START;\n    else\n        HandleDpadMovement(task);\n}\n\nstatic void HandleDpadMovement(struct Task *task)\n{\n    const s16 sDpadDeltaX[] = {\n        [INPUT_NONE]       = 0,\n        [INPUT_DPAD_UP]    = 0,\n        [INPUT_DPAD_DOWN]  = 0,\n        [INPUT_DPAD_LEFT]  = -1,\n        [INPUT_DPAD_RIGHT] = 1\n    };\n\n    const s16 sDpadDeltaY[] = {\n        [INPUT_NONE]       = 0,\n        [INPUT_DPAD_UP]    = -1,\n        [INPUT_DPAD_DOWN]  = 1,\n        [INPUT_DPAD_LEFT]  = 0,\n        [INPUT_DPAD_RIGHT] = 0\n    };\n\n    const s16 sKeyRowToButtonRow[KBROW_COUNT] = {0, 1, 1, 2};\n    const s16 sButtonRowToKeyRow[BUTTON_COUNT] = {0, 0, 3};\n\n    s16 cursorX;\n    s16 cursorY;\n    u16 input;\n    s16 prevCursorX;\n\n    GetCursorPos(&cursorX, &cursorY);\n    input = INPUT_NONE;\n    if (JOY_REPT(DPAD_UP))\n        input = INPUT_DPAD_UP;\n    if (JOY_REPT(DPAD_DOWN))\n        input = INPUT_DPAD_DOWN;\n    if (JOY_REPT(DPAD_LEFT))\n        input = INPUT_DPAD_LEFT;\n    if (JOY_REPT(DPAD_RIGHT))\n        input = INPUT_DPAD_RIGHT;\n\n    // Get new cursor position\n    prevCursorX = cursorX;\n    cursorX += sDpadDeltaX[input];\n    cursorY += sDpadDeltaY[input];\n\n    //Wrap cursor position in the X direction\n    if (cursorX < 0)\n        cursorX = GetCurrentPageColumnCount();\n    if (cursorX > GetCurrentPageColumnCount())\n        cursorX = 0;\n\n    // Handle moving on/off the button column\n    if (sDpadDeltaX[input] != 0)\n    {\n        if (cursorX == GetCurrentPageColumnCount())\n        {\n            // Moved onto button column\n            // Save cursor pos in tButtonId for moving back onto keys\n            task->tButtonId = cursorY;\n            cursorY = sKeyRowToButtonRow[cursorY];\n        }\n        else if (prevCursorX == GetCurrentPageColumnCount())\n        {\n            // Moved off button column\n            // If you're on the middle button, go to the row that\n            // the cursor was on previously (saved in tButtonId above)\n            if (cursorY == BUTTON_COUNT / 2)\n                cursorY = task->tButtonId;\n            else\n                cursorY = sButtonRowToKeyRow[cursorY];\n        }\n    }\n\n    // Wrap cursor position in the y direction\n    if (cursorX == GetCurrentPageColumnCount())\n    {\n        // There are only 3 keys in the button column\n        // so wrap Y accordingly\n        if (cursorY < 0)\n            cursorY = BUTTON_COUNT - 1;\n        if (cursorY >= BUTTON_COUNT)\n            cursorY = 0;\n\n        if (cursorY == 0)\n            task->tButtonId = BUTTON_BACK;\n        else if (cursorY == BUTTON_COUNT - 1)\n            task->tButtonId = BUTTON_OK;\n    }\n    else\n    {\n        if (cursorY < 0)\n            cursorY = KBROW_COUNT - 1;\n        if (cursorY >= KBROW_COUNT)\n            cursorY = 0;\n    }\n    SetCursorPos(cursorX, cursorY);\n}\n\n#undef tState\n#undef tKeyboardEvent\n#undef tButtonId\n\nstatic void DrawNormalTextEntryBox(void)\n{\n    FillWindowPixelBuffer(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX], PIXEL_FILL(1));\n    AddTextPrinterParameterized(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX], FONT_NORMAL_COPY_1, sNamingScreen->template->title, 1, 1, 0, NULL);\n    PutWindowTilemap(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX]);\n}\n\nstatic void DrawMonTextEntryBox(void)\n{\n    u8 buffer[32];\n\n    StringCopy(buffer, gSpeciesNames[sNamingScreen->monSpecies]);\n    StringAppendN(buffer, sNamingScreen->template->title, 15);\n    FillWindowPixelBuffer(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX], PIXEL_FILL(1));\n    AddTextPrinterParameterized(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX], FONT_NORMAL_COPY_1, buffer, 1, 1, 0, NULL);\n    PutWindowTilemap(sNamingScreen->windows[WIN_TEXT_ENTRY_BOX]);\n}\n\nstatic void (*const sDrawTextEntryBoxFuncs[])(void) =\n{\n    [NAMING_SCREEN_PLAYER]     = DrawNormalTextEntryBox,\n    [NAMING_SCREEN_BOX]        = DrawNormalTextEntryBox,\n    [NAMING_SCREEN_CAUGHT_MON] = DrawMonTextEntryBox,\n    [NAMING_SCREEN_NICKNAME]   = DrawMonTextEntryBox,\n    [NAMING_SCREEN_RIVAL]      = DrawNormalTextEntryBox\n};\n\nstatic void DrawTextEntryBox(void)\n{\n    sDrawTextEntryBoxFuncs[sNamingScreen->templateNum]();\n}\n\nstatic void (*const sDrawGenderIconFuncs[])(void) =\n{\n    [FALSE] = DummyGenderIcon,\n    [TRUE]  = DrawGenderIcon,\n};\n\nstatic void TryDrawGenderIcon(void)\n{\n    sDrawGenderIconFuncs[sNamingScreen->template->addGenderIcon]();\n}\n\nstatic void DummyGenderIcon(void)\n{\n\n}\n\nstatic const u8 sGenderColors[2][3] = {\n    [MALE]   = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_BLUE, TEXT_COLOR_BLUE},\n    [FEMALE] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_RED}\n};\n\nstatic void DrawGenderIcon(void)\n{\n    u8 genderSymbol[2];\n    bool8 gender = MALE;\n\n    StringCopy(genderSymbol, gText_MaleSymbol);\n\n    if (sNamingScreen->monGender != MON_GENDERLESS)\n    {\n        if (sNamingScreen->monGender == MON_FEMALE)\n        {\n            StringCopy(genderSymbol, gText_FemaleSymbol);\n            gender = FEMALE;\n        }\n        AddTextPrinterParameterized3(sNamingScreen->windows[2], FONT_NORMAL, 0x68, 1, sGenderColors[gender], TEXT_SKIP_DRAW, genderSymbol);\n    }\n}\n\nstatic u8 GetCharAtKeyboardPos(s16 x, s16 y)\n{\n    return sKeyboardChars[CurrentPageToKeyboardId()][y][x];\n}\n\nstatic u8 GetTextEntryPosition(void)\n{\n    u32 i;\n\n    for (i = 0; i < sNamingScreen->template->maxChars; i++)\n    {\n        if (sNamingScreen->textBuffer[i] == EOS)\n            return i;\n    }\n    return sNamingScreen->template->maxChars - 1;\n}\n\nstatic u8 GetPreviousTextCaretPosition(void)\n{\n    s32 i;\n\n    for (i = sNamingScreen->template->maxChars - 1; i > 0; i--)\n    {\n        if (sNamingScreen->textBuffer[i] != EOS)\n            return i;\n    }\n    return 0;\n}\n\nstatic void DeleteTextCharacter(void)\n{\n    u8 index;\n    u8 keyRole;\n\n    index = GetPreviousTextCaretPosition();\n    // Temporarily make this a space for redrawing purposes\n    sNamingScreen->textBuffer[index] = CHAR_SPACE;\n    DrawTextEntry();\n    CopyBgTilemapBufferToVram(3);\n    sNamingScreen->textBuffer[index] = EOS;\n    keyRole = GetKeyRoleAtCursorPos();\n\n    // The below flashes the Back key once on delete\n    // It incorrectly leaves the Back key 1 shade lighter than its default\n    if (keyRole == KEY_ROLE_CHAR || keyRole == KEY_ROLE_BACKSPACE)\n        TryStartButtonFlash(BUTTON_BACK, FALSE, TRUE);\n    PlaySE(SE_BALL);\n}\n\n// Returns TRUE if the text entry is now full\nstatic bool8 AddTextCharacter(void)\n{\n    s16 x;\n    s16 y;\n\n    GetCursorPos(&x, &y);\n    BufferCharacter(GetCharAtKeyboardPos(x, y));\n    DrawTextEntry();\n    CopyBgTilemapBufferToVram(3);\n    PlaySE(SE_SELECT);\n\n    if (GetPreviousTextCaretPosition() != sNamingScreen->template->maxChars - 1)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic void BufferCharacter(u8 ch)\n{\n    u8 index = GetTextEntryPosition();\n    sNamingScreen->textBuffer[index] = ch;\n}\n\nstatic void SaveInputText(void)\n{\n    // Copy from the first non-whitespace character\n    u32 i;\n\n    for (i = 0; i < sNamingScreen->template->maxChars; i++)\n    {\n        if (sNamingScreen->textBuffer[i] != CHAR_SPACE && sNamingScreen->textBuffer[i] != EOS)\n        {\n            StringCopyN(sNamingScreen->destBuffer, sNamingScreen->textBuffer, sNamingScreen->template->maxChars + 1);\n            break;\n        }\n    }\n}\n\nstatic void LoadGfx(void)\n{\n    LZ77UnCompWram(gNamingScreenMenu_Gfx, sNamingScreen->tileBuffer);\n    LoadBgTiles(1, sNamingScreen->tileBuffer, sizeof(sNamingScreen->tileBuffer), 0);\n    LoadBgTiles(2, sNamingScreen->tileBuffer, sizeof(sNamingScreen->tileBuffer), 0);\n    LoadBgTiles(3, sNamingScreen->tileBuffer, sizeof(sNamingScreen->tileBuffer), 0);\n    LoadSpriteSheets(sSpriteSheets);\n    LoadSpritePalettes(sSpritePalettes);\n}\n\nstatic void CreateHelperTasks(void)\n{\n    CreateInputHandlerTask();\n    CreateButtonFlashTask();\n}\n\nstatic void LoadPalettes(void)\n{\n    LoadPalette(gNamingScreenMenu_Pal, BG_PLTT_ID(0), sizeof(gNamingScreenMenu_Pal));\n    LoadPalette(gNamingScreenKeyboard_Pal, BG_PLTT_ID(10), PLTT_SIZE_4BPP);\n    LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(11), PLTT_SIZE_4BPP);\n}\n\nstatic void DecompressToBgTilemapBuffer(u8 bg, const u32 *src)\n{\n    CopyToBgTilemapBuffer(bg, src, 0, 0);\n}\n\nstatic void DrawTextEntry(void)\n{\n    u32 i;\n    u8 temp[2];\n    u16 extraWidth;\n    u8 maxChars = sNamingScreen->template->maxChars;\n    u16 xpos = sNamingScreen->inputCharBaseXPos - 0x40;\n\n    FillWindowPixelBuffer(sNamingScreen->windows[WIN_TEXT_ENTRY], PIXEL_FILL(1));\n\n    for (i = 0; i < maxChars; i++)\n    {\n        temp[0] = sNamingScreen->textBuffer[i];\n        temp[1] = gExpandedPlaceholder_Empty[0];\n        extraWidth = (IsWideLetter(temp[0]) == TRUE) ? 2 : 0;\n\n        AddTextPrinterParameterized(sNamingScreen->windows[WIN_TEXT_ENTRY], FONT_NORMAL, temp, i * 8 + xpos + extraWidth, 1, TEXT_SKIP_DRAW, NULL);\n    }\n\n    TryDrawGenderIcon();\n    CopyWindowToVram(sNamingScreen->windows[WIN_TEXT_ENTRY], COPYWIN_GFX);\n    PutWindowTilemap(sNamingScreen->windows[WIN_TEXT_ENTRY]);\n}\n\nstruct TextColor   // Needed because of alignment\n{\n    u8 colors[3][4];\n};\n\nstatic const struct TextColor sTextColorStruct = {\n    {\n        {TEXT_DYNAMIC_COLOR_4, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY},\n        {TEXT_DYNAMIC_COLOR_5, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY},\n        {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}\n    }\n};\n\nstatic const u8 sFillValues[KBPAGE_COUNT] =\n{\n    [KEYBOARD_LETTERS_LOWER] = PIXEL_FILL(14),\n    [KEYBOARD_LETTERS_UPPER] = PIXEL_FILL(13),\n    [KEYBOARD_SYMBOLS]       = PIXEL_FILL(15)\n};\n\nstatic const u8 *const sKeyboardTextColors[KBPAGE_COUNT] =\n{\n    [KEYBOARD_LETTERS_LOWER] = sTextColorStruct.colors[1],\n    [KEYBOARD_LETTERS_UPPER] = sTextColorStruct.colors[0],\n    [KEYBOARD_SYMBOLS]       = sTextColorStruct.colors[2]\n};\n\nstatic void PrintKeyboardKeys(u8 window, u8 page)\n{\n    u32 i;\n\n    FillWindowPixelBuffer(window, sFillValues[page]);\n\n    for (i = 0; i < KBROW_COUNT; i++)\n        AddTextPrinterParameterized3(window, FONT_NORMAL_COPY_1, 0, i * 16 + 1, sKeyboardTextColors[page], 0, sNamingScreenKeyboardText[page][i]);\n\n    PutWindowTilemap(window);\n}\n\nstatic const u32 *const sNextKeyboardPageTilemaps[] = {\n    [KBPAGE_SYMBOLS]       = gNamingScreenKeyboardUpper_Tilemap,\n    [KBPAGE_LETTERS_UPPER] = gNamingScreenKeyboardLower_Tilemap,\n    [KBPAGE_LETTERS_LOWER] = gNamingScreenKeyboardSymbols_Tilemap\n};\n\nstatic void DrawKeyboardPageOnDeck(void)\n{\n    u8 bgId;\n    u8 bgId_copy;\n    u8 windowId;\n    u8 bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3;\n    u8 bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3;\n\n    if (bg1Priority > bg2Priority)\n    {\n        bgId = 1;\n        bgId_copy = 1;\n        windowId = sNamingScreen->windows[WIN_KB_PAGE_1];\n    }\n    else\n    {\n        bgId = 2;\n        bgId_copy = 2;\n        windowId = sNamingScreen->windows[WIN_KB_PAGE_2];\n    }\n\n    DecompressToBgTilemapBuffer(bgId, sNextKeyboardPageTilemaps[sNamingScreen->currentPage]);\n    PrintKeyboardKeys(windowId, CurrentPageToNextKeyboardId());\n    CopyBgTilemapBufferToVram(bgId_copy);\n}\n\nstatic void PrintControls(void)\n{\n    const u8 color[3] = { TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY };\n    int strwidth = GetStringWidth(FONT_SMALL, gText_MoveOkBack, 0);\n\n    FillWindowPixelBuffer(sNamingScreen->windows[WIN_BANNER], PIXEL_FILL(15));\n    AddTextPrinterParameterized3(sNamingScreen->windows[WIN_BANNER], FONT_SMALL, DISPLAY_WIDTH - 4 - strwidth, 0, color, 0, gText_MoveOkBack);\n    PutWindowTilemap(sNamingScreen->windows[WIN_BANNER]);\n    CopyWindowToVram(sNamingScreen->windows[WIN_BANNER], COPYWIN_FULL);\n}\n\nstatic void CB2_NamingScreen(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void ResetVHBlank(void)\n{\n    SetVBlankCallback(NULL);\n    SetHBlankCallback(NULL);\n}\n\nstatic void SetVBlank(void)\n{\n    SetVBlankCallback(VBlankCB_NamingScreen);\n}\n\nstatic void VBlankCB_NamingScreen(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n    SetGpuReg(REG_OFFSET_BG1VOFS, sNamingScreen->bg1vOffset);\n    SetGpuReg(REG_OFFSET_BG2VOFS, sNamingScreen->bg2vOffset);\n    SetGpuReg(REG_OFFSET_BG1CNT, GetGpuReg(REG_OFFSET_BG1CNT) & 0xFFFC); // clear priority bits\n    SetGpuRegBits(REG_OFFSET_BG1CNT, sNamingScreen->bg1Priority);\n    SetGpuReg(REG_OFFSET_BG2CNT, GetGpuReg(REG_OFFSET_BG2CNT) & 0xFFFC); // clear priority bits\n    SetGpuRegBits(REG_OFFSET_BG2CNT, sNamingScreen->bg2Priority);\n}\n\nstatic void NamingScreen_ShowBgs(void)\n{\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n    ShowBg(3);\n}\n\n// Always false (presumably for non-latin languages)\nstatic bool8 IsWideLetter(u8 character)\n{\n    u32 i;\n\n    for (i = 0; gText_AlphabetUpperLower[i] != EOS; i++)\n    {\n        if (character == gText_AlphabetUpperLower[i])\n            return TRUE;\n    }\n    return FALSE;\n}\n\n//--------------------------------------------------\n// Unused debug functions\n//--------------------------------------------------\n\nstatic void Debug_NamingScreenPlayer(void)\n{\n    DoNamingScreen(NAMING_SCREEN_PLAYER, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu);\n}\n\nstatic void Debug_NamingScreenBox(void)\n{\n    DoNamingScreen(NAMING_SCREEN_BOX, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu);\n}\n\nstatic void Debug_NamingScreenCaughtMon(void)\n{\n    DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu);\n}\n\nstatic void Debug_NamingScreenNickname(void)\n{\n    DoNamingScreen(NAMING_SCREEN_NICKNAME, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu);\n}\n\nstatic void Debug_NamingScreenRival(void)\n{\n    DoNamingScreen(NAMING_SCREEN_RIVAL, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu);\n}\n\n//--------------------------------------------------\n// Forward-declared variables\n//--------------------------------------------------\n\nstatic const struct NamingScreenTemplate sPlayerNamingScreenTemplate = {\n    .copyExistingString = FALSE,\n    .maxChars = PLAYER_NAME_LENGTH,\n    .iconFunction = 1,\n    .addGenderIcon = 0,\n    .initialPage = KBPAGE_LETTERS_UPPER,\n    .title = gText_YourName,\n};\n\nstatic const struct NamingScreenTemplate sPcBoxNamingScreenTemplate = {\n    .copyExistingString = FALSE,\n    .maxChars = BOX_NAME_LENGTH,\n    .iconFunction = 2,\n    .addGenderIcon = 0,\n    .initialPage = KBPAGE_LETTERS_UPPER,\n    .title = gText_BoxName,\n};\n\nstatic const struct NamingScreenTemplate sMonNamingScreenTemplate = {\n    .copyExistingString = FALSE,\n    .maxChars = POKEMON_NAME_LENGTH,\n    .iconFunction = 3,\n    .addGenderIcon = 1,\n    .initialPage = KBPAGE_LETTERS_UPPER,\n    .title = gText_PkmnsNickname,\n};\n\nstatic const struct NamingScreenTemplate sRivalNamingScreenTemplate = {\n    .copyExistingString = FALSE,\n    .maxChars = PLAYER_NAME_LENGTH,\n    .iconFunction = 4,\n    .addGenderIcon = 0,\n    .initialPage = KBPAGE_LETTERS_UPPER,\n    .title = gText_RivalsName,\n};\n\nstatic const struct NamingScreenTemplate *const sNamingScreenTemplates[] =\n{\n    [NAMING_SCREEN_PLAYER]     = &sPlayerNamingScreenTemplate,\n    [NAMING_SCREEN_BOX]        = &sPcBoxNamingScreenTemplate,\n    [NAMING_SCREEN_CAUGHT_MON] = &sMonNamingScreenTemplate,\n    [NAMING_SCREEN_NICKNAME]   = &sMonNamingScreenTemplate,\n    [NAMING_SCREEN_RIVAL]      = &sRivalNamingScreenTemplate,\n};\n\nstatic const struct OamData sOam_8x8 = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n};\n\nstatic const struct OamData sOam_16x16 = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n};\n\nstatic const struct OamData sOam_32x16 = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x16),\n    .x = 0,\n    .size = SPRITE_SIZE(32x16),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n};\n\nstatic const struct Subsprite sSubsprites_PageSwapFrame[] = {\n    {\n        .x = -20,\n        .y = -16,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 1\n    }, {\n        .x =  12,\n        .y = -16,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 4,\n        .priority = 1\n    }, {\n        .x = -20,\n        .y = -8,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 5,\n        .priority = 1\n    }, {\n        .x =  12,\n        .y = -8,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 9,\n        .priority = 1\n    }, {\n        .x = -20,\n        .y =  0,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 10,\n        .priority = 1\n    }, {\n        .x =  12,\n        .y =  0,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 14,\n        .priority = 1\n    }, {\n        .x = -20,\n        .y =  8,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 15,\n        .priority = 1\n    }, {\n        .x =  12,\n        .y =  8,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 19,\n        .priority = 1\n    }\n};\n\nstatic const struct Subsprite sSubsprites_PageSwapText[] = {\n    {\n        .x = -12,\n        .y = -4,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 0,\n        .priority = 1\n    }, {\n        .x =   4,\n        .y = -4,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 2,\n        .priority = 1\n    }\n};\n\nstatic const struct Subsprite sSubsprites_Button[] = {\n    {\n        .x = -20,\n        .y = -12,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 0,\n        .priority = 1\n    }, {\n        .x =  12,\n        .y = -12,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 4,\n        .priority = 1\n    }, {\n        .x = -20,\n        .y = -4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 5,\n        .priority = 1\n    }, {\n        .x =  12,\n        .y = -4,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 9,\n        .priority = 1\n    }, {\n        .x = -20,\n        .y =  4,\n        .shape = SPRITE_SHAPE(32x8),\n        .size = SPRITE_SIZE(32x8),\n        .tileOffset = 10,\n        .priority = 1\n    }, {\n        .x =  12,\n        .y =  4,\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .tileOffset = 14,\n        .priority = 1\n    }\n};\n\nstatic const struct Subsprite sSubsprites_PCIcon[] = {\n    {\n        .x = -8,\n        .y = -12,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 0,\n        .priority = 3\n    }, {\n        .x = -8,\n        .y = -4,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 2,\n        .priority = 3\n    }, {\n        .x = -8,\n        .y =  4,\n        .shape = SPRITE_SHAPE(16x8),\n        .size = SPRITE_SIZE(16x8),\n        .tileOffset = 4,\n        .priority = 3\n    }\n};\n\nstatic const struct SubspriteTable sSubspriteTable_PageSwapFrame[] = {\n    {ARRAY_COUNT(sSubsprites_PageSwapFrame), sSubsprites_PageSwapFrame}\n};\n\nstatic const struct SubspriteTable sSubspriteTable_PageSwapText[] = {\n    {ARRAY_COUNT(sSubsprites_PageSwapText), sSubsprites_PageSwapText},\n    {ARRAY_COUNT(sSubsprites_PageSwapText), sSubsprites_PageSwapText},\n    {ARRAY_COUNT(sSubsprites_PageSwapText), sSubsprites_PageSwapText}\n};\n\nstatic const struct SubspriteTable sSubspriteTable_Button[] = {\n    {ARRAY_COUNT(sSubsprites_Button), sSubsprites_Button}\n};\n\nstatic const struct SubspriteTable sSubspriteTable_PCIcon[] = {\n    {ARRAY_COUNT(sSubsprites_PCIcon), sSubsprites_PCIcon}\n};\n\nstatic const struct SpriteFrameImage sImageTable_PCIcon[] = {\n    {sPCIconOff_Gfx, sizeof(sPCIconOff_Gfx)},\n    {sPCIconOn_Gfx, sizeof(sPCIconOn_Gfx)},\n};\n\nstatic const union AnimCmd sAnim_Loop[] = {\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_CursorSquish[] = {\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(8, 8),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_PCIcon[] = {\n    ANIMCMD_FRAME(0, 2),\n    ANIMCMD_FRAME(1, 2),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_Loop[] = {\n    sAnim_Loop\n};\n\nstatic const union AnimCmd *const sAnims_Cursor[] = {\n    sAnim_Loop,\n    sAnim_CursorSquish\n};\n\nstatic const union AnimCmd *const sAnims_PCIcon[] = {\n    sAnim_PCIcon\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_PageSwapFrame = {\n    .tileTag = GFXTAG_PAGE_SWAP_FRAME,\n    .paletteTag = PALTAG_PAGE_SWAP,\n    .oam = &sOam_8x8,\n    .anims = sAnims_Loop,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_PageSwap\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_PageSwapButton = {\n    .tileTag = GFXTAG_PAGE_SWAP_BUTTON,\n    .paletteTag = PALTAG_PAGE_SWAP_UPPER,\n    .oam = &sOam_32x16,\n    .anims = sAnims_Loop,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_PageSwapText = {\n    .tileTag = GFXTAG_PAGE_SWAP_UPPER,\n    .paletteTag = PALTAG_PAGE_SWAP,\n    .oam = &sOam_8x8,\n    .anims = sAnims_Loop,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_BackButton = {\n    .tileTag = GFXTAG_BACK_BUTTON,\n    .paletteTag = PALTAG_BACK_BUTTON,\n    .oam = &sOam_8x8,\n    .anims = sAnims_Loop,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_OkButton = {\n    .tileTag = GFXTAG_OK_BUTTON,\n    .paletteTag = PALTAG_OK_BUTTON,\n    .oam = &sOam_8x8,\n    .anims = sAnims_Loop,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Cursor = {\n    .tileTag = GFXTAG_CURSOR,\n    .paletteTag = PALTAG_CURSOR,\n    .oam = &sOam_16x16,\n    .anims = sAnims_Cursor,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_Cursor\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_InputArrow = {\n    .tileTag = GFXTAG_INPUT_ARROW,\n    .paletteTag = PALTAG_PAGE_SWAP_OTHERS,\n    .oam = &sOam_8x8,\n    .anims = sAnims_Loop,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_InputArrow\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Underscore = {\n    .tileTag = GFXTAG_UNDERSCORE,\n    .paletteTag = PALTAG_PAGE_SWAP_OTHERS,\n    .oam = &sOam_8x8,\n    .anims = sAnims_Loop,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_Underscore\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_PCIcon = {\n    .tileTag = TAG_NONE,\n    .paletteTag = PALTAG_MENU,\n    .oam = &sOam_8x8,\n    .anims = sAnims_PCIcon,\n    .images = sImageTable_PCIcon,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const u8 *const sNamingScreenKeyboardText[KBPAGE_COUNT][KBROW_COUNT] = {\n    [KEYBOARD_LETTERS_LOWER] = {\n        gText_NamingScreenKeyboard_abcdef,\n        gText_NamingScreenKeyboard_ghijkl,\n        gText_NamingScreenKeyboard_mnopqrs,\n        gText_NamingScreenKeyboard_tuvwxyz\n    },\n    [KEYBOARD_LETTERS_UPPER] = {\n        gText_NamingScreenKeyboard_ABCDEF,\n        gText_NamingScreenKeyboard_GHIJKL,\n        gText_NamingScreenKeyboard_MNOPQRS,\n        gText_NamingScreenKeyboard_TUVWXYZ\n    },\n    [KEYBOARD_SYMBOLS] = {\n        gText_NamingScreenKeyboard_01234,\n        gText_NamingScreenKeyboard_56789,\n        gText_NamingScreenKeyboard_Symbols1,\n        gText_NamingScreenKeyboard_Symbols2\n    },\n};\n\nstatic const struct SpriteSheet sSpriteSheets[] = {\n    {gNamingScreenBackButton_Gfx,     0x1E0,  GFXTAG_BACK_BUTTON},\n    {gNamingScreenOKButton_Gfx,       0x1E0,  GFXTAG_OK_BUTTON},\n    {gNamingScreenPageSwapFrame_Gfx,  0x280,  GFXTAG_PAGE_SWAP_FRAME},\n    {gNamingScreenPageSwapButton_Gfx, 0x100,  GFXTAG_PAGE_SWAP_BUTTON},\n    {gNamingScreenPageSwapUpper_Gfx,  0x060,  GFXTAG_PAGE_SWAP_UPPER},\n    {gNamingScreenPageSwapLower_Gfx,  0x060,  GFXTAG_PAGE_SWAP_LOWER},\n    {gNamingScreenPageSwapOthers_Gfx, 0x060,  GFXTAG_PAGE_SWAP_OTHERS},\n    {gNamingScreenCursor_Gfx,         0x080,  GFXTAG_CURSOR},\n    {gNamingScreenCursorSquished_Gfx, 0x080,  GFXTAG_CURSOR_SQUISHED},\n    {gNamingScreenCursorFilled_Gfx,   0x080,  GFXTAG_CURSOR_FILLED},\n    {gNamingScreenInputArrow_Gfx,     0x020,  GFXTAG_INPUT_ARROW},\n    {gNamingScreenUnderscore_Gfx,     0x020,  GFXTAG_UNDERSCORE},\n    {} // terminator\n};\n\nstatic const struct SpritePalette sSpritePalettes[] = {\n    {gNamingScreenMenu_Pal[0], PALTAG_MENU},\n    {gNamingScreenMenu_Pal[1], PALTAG_PAGE_SWAP_UPPER},\n    {gNamingScreenMenu_Pal[2], PALTAG_PAGE_SWAP_LOWER},\n    {gNamingScreenMenu_Pal[3], PALTAG_PAGE_SWAP_OTHERS},\n    {gNamingScreenMenu_Pal[4], PALTAG_PAGE_SWAP},\n    {gNamingScreenMenu_Pal[5], PALTAG_CURSOR},\n    {gNamingScreenMenu_Pal[4], PALTAG_BACK_BUTTON},\n    {gNamingScreenMenu_Pal[4], PALTAG_OK_BUTTON},\n    {} // terminator\n};\n"
  },
  {
    "path": "src/new_game.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"random.h\"\n#include \"overworld.h\"\n#include \"constants/maps.h\"\n#include \"load_save.h\"\n#include \"item_menu.h\"\n#include \"tm_case.h\"\n#include \"berry_pouch.h\"\n#include \"quest_log.h\"\n#include \"wild_encounter.h\"\n#include \"event_data.h\"\n#include \"mail_data.h\"\n#include \"play_time.h\"\n#include \"money.h\"\n#include \"battle_records.h\"\n#include \"pokemon_size_record.h\"\n#include \"pokemon_storage_system.h\"\n#include \"roamer.h\"\n#include \"item.h\"\n#include \"player_pc.h\"\n#include \"berry.h\"\n#include \"easy_chat.h\"\n#include \"union_room_chat.h\"\n#include \"mystery_gift.h\"\n#include \"renewable_hidden_items.h\"\n#include \"trainer_tower.h\"\n#include \"script.h\"\n#include \"berry_powder.h\"\n#include \"pokemon_jump.h\"\n#include \"event_scripts.h\"\n\n// this file's functions\nstatic void ResetMiniGamesResults(void);\n\n// EWRAM vars\nEWRAM_DATA bool8 gDifferentSaveFile = FALSE;\n\nvoid SetTrainerId(u32 trainerId, u8 *dst)\n{\n    dst[0] = trainerId;\n    dst[1] = trainerId >> 8;\n    dst[2] = trainerId >> 16;\n    dst[3] = trainerId >> 24;\n}\n\nvoid CopyTrainerId(u8 *dst, u8 *src)\n{\n    s32 i;\n    for (i = 0; i < 4; i++)\n        dst[i] = src[i];\n}\n\nstatic void InitPlayerTrainerId(void)\n{\n    u32 trainerId = (Random() << 0x10) | GetGeneratedTrainerIdLower();\n    SetTrainerId(trainerId, gSaveBlock2Ptr->playerTrainerId);\n}\n\nstatic void SetDefaultOptions(void)\n{\n    gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_FAST;\n    gSaveBlock2Ptr->optionsWindowFrameType = 0;\n    gSaveBlock2Ptr->optionsSound = OPTIONS_SOUND_STEREO;\n    gSaveBlock2Ptr->optionsBattleStyle = OPTIONS_BATTLE_STYLE_PREDICT;\n    gSaveBlock2Ptr->optionsButtonMode = OPTIONS_BUTTON_MODE_HELP;\n    \n    gSaveBlock2Ptr->optionsBattleTransitions = FALSE;\n    gSaveBlock2Ptr->optionsBattleIntroAnim = 0;\n    gSaveBlock2Ptr->optionsBattleSceneOff = FALSE;\n    gSaveBlock2Ptr->optionsHpBarAnimSpeed = 0;\n    gSaveBlock2Ptr->optionsExpBarAnimSpeed = 0;\n}\n\nstatic void ClearPokedexFlags(void)\n{\n    memset(&gSaveBlock2Ptr->pokedex.owned, 0, sizeof(gSaveBlock2Ptr->pokedex.owned));\n    memset(&gSaveBlock2Ptr->pokedex.seen, 0, sizeof(gSaveBlock2Ptr->pokedex.seen));\n}\n\nstatic void ClearBattleTower(void)\n{\n    CpuFill32(0, &gSaveBlock2Ptr->battleTower, sizeof(gSaveBlock2Ptr->battleTower));\n}\n\nstatic void WarpToPlayersRoom(void)\n{\n    SetWarpDestination(MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F), MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F), -1, 6, 6);\n    WarpIntoMap();\n}\n\nvoid Sav2_ClearSetDefault(void)\n{\n    ClearSav2();\n    SetDefaultOptions();\n}\n\nvoid ResetMenuAndMonGlobals(void)\n{\n    gDifferentSaveFile = FALSE;\n    ZeroPlayerPartyMons();\n    ZeroEnemyPartyMons();\n    ResetBagCursorPositions();\n    ResetTMCaseCursorPos();\n    BerryPouch_CursorResetToTop();\n    ResetQuestLog();\n    SeedWildEncounterRng(Random());\n    ResetSpecialVars();\n}\n\nvoid NewGameInitData(void)\n{\n    u8 rivalName[PLAYER_NAME_LENGTH + 1];\n\n    StringCopy(rivalName, gSaveBlock1Ptr->rivalName);\n    gDifferentSaveFile = TRUE;\n    gSaveBlock2Ptr->encryptionKey = 0;\n    ZeroPlayerPartyMons();\n    ZeroEnemyPartyMons();\n    ClearBattleTower();\n    ClearSav1();\n    ClearMailData();\n    gSaveBlock2Ptr->specialSaveWarpFlags = 0;\n    gSaveBlock2Ptr->gcnLinkFlags = 0;\n    gSaveBlock2Ptr->unkFlag1 = TRUE;\n    gSaveBlock2Ptr->unkFlag2 = FALSE;\n    InitPlayerTrainerId();\n    PlayTimeCounter_Reset();\n    ClearPokedexFlags();\n    InitEventData();\n    ResetFameChecker();\n    SetMoney(&gSaveBlock1Ptr->money, 3000);\n    ResetGameStats();\n    ClearPlayerLinkBattleRecords();\n    InitHeracrossSizeRecord();\n    InitMagikarpSizeRecord();\n    EnableNationalPokedex_RSE();\n    gPlayerPartyCount = 0;\n    ZeroPlayerPartyMons();\n    ResetPokemonStorageSystem();\n    ClearRoamerData();\n    gSaveBlock1Ptr->registeredItem = 0;\n    ClearBag();\n    DeserializeTmHmItemSlots();\n    NewGameInitPCItems();\n    ClearEnigmaBerries();\n    InitEasyChatPhrases();\n    ResetTrainerFanClub();\n    UnionRoomChat_InitializeRegisteredTexts();\n    ResetMiniGamesResults();\n    ClearMysteryGift();\n    SetAllRenewableItemFlags();\n    WarpToPlayersRoom();\n    RunScriptImmediately(EventScript_ResetAllMapFlags);\n    StringCopy(gSaveBlock1Ptr->rivalName, rivalName);\n    ResetTrainerTowerResults();\n    gSaveBlock1Ptr->keyFlags.expMod = 2; // normal exp\n}\n\nstatic void ResetMiniGamesResults(void)\n{\n    CpuFill16(0, &gSaveBlock2Ptr->berryCrush, sizeof(struct BerryCrush));\n    SetBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount, 0);\n    ResetPokemonJumpRecords();\n    CpuFill16(0, &gSaveBlock2Ptr->berryPick, sizeof(struct BerryPickingResults));\n}\n"
  },
  {
    "path": "src/new_menu_helpers.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"help_message.h\"\n#include \"menu.h\"\n#include \"menu_helpers.h\"\n#include \"new_menu_helpers.h\"\n#include \"quest_log.h\"\n#include \"field_specials.h\"\n#include \"text_window.h\"\n#include \"script.h\"\n\n#define DLG_WINDOW_PALETTE_NUM 15\n#define DLG_WINDOW_BASE_TILE_NUM 0x200\n#define STD_WINDOW_PALETTE_NUM 14\n#define STD_WINDOW_BASE_TILE_NUM 0x214\n\nstatic EWRAM_DATA bool8 sScheduledBgCopiesToVram[4] = {FALSE};\nstatic EWRAM_DATA u16 sTempTileDataBufferCursor = {0};\nstatic EWRAM_DATA void *sTempTileDataBuffers[0x20] = {NULL};\nstatic EWRAM_DATA u8 sStartMenuWindowId = {0};\n\nstatic const u16 sUnusedWindow_Gfx[] = INCBIN_U16(\"graphics/text_window/unused.4bpp\");\nconst u16 gMenuMessageWindow_Gfx[] = INCBIN_U16(\"graphics/text_window/menu_message.4bpp\");\n\nconst u16 gStandardMenuPalette[] = INCBIN_U16(\"graphics/interface/std_menu.gbapal\");\n\nstatic const u8 sTextSpeedFrameDelays[] =\n{\n    [OPTIONS_TEXT_SPEED_SLOW] = 8,\n    [OPTIONS_TEXT_SPEED_MID]  = 4,\n    [OPTIONS_TEXT_SPEED_FAST] = 1,\n    [OPTIONS_TEXT_SPEED_INSTANT] = 1\n};\n\nstatic const struct WindowTemplate sStandardTextBox_WindowTemplates[] = \n{\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = DLG_WINDOW_PALETTE_NUM,\n        .baseBlock = 0x198,\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sYesNo_WindowTemplate = \n{\n    .bg = 0,\n    .tilemapLeft = 21,\n    .tilemapTop = 9,\n    .width = 6,\n    .height = 4,\n    .paletteNum = DLG_WINDOW_PALETTE_NUM,\n    .baseBlock = 0x125,\n};\n\nstatic const struct FontInfo gFontInfos[] = \n{\n    [FONT_SMALL] = {\n        .fontFunction = FontFunc_Small,\n        .maxLetterWidth = 8,\n        .maxLetterHeight = 13,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .fgColor = 2,\n        .bgColor = 1,\n        .shadowColor = 3,\n    },\n    [FONT_NORMAL_COPY_1] = {\n        .fontFunction = FontFunc_NormalCopy1,\n        .maxLetterWidth = 8,\n        .maxLetterHeight = 14,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .fgColor = 2,\n        .bgColor = 1,\n        .shadowColor = 3,\n    },\n    [FONT_NORMAL] = {\n        .fontFunction = FontFunc_Normal,\n        .maxLetterWidth = 10,\n        .maxLetterHeight = 14,\n        .letterSpacing = 1,\n        .lineSpacing = 0,\n        .fgColor = 2,\n        .bgColor = 1,\n        .shadowColor = 3,\n    },\n    [FONT_NORMAL_COPY_2] = {\n        .fontFunction = FontFunc_NormalCopy2,\n        .maxLetterWidth = 10,\n        .maxLetterHeight = 14,\n        .letterSpacing = 1,\n        .lineSpacing = 0,\n        .fgColor = 2,\n        .bgColor = 1,\n        .shadowColor = 3,\n    },\n    [FONT_MALE] = {\n        .fontFunction = FontFunc_Male,\n        .maxLetterWidth = 10,\n        .maxLetterHeight = 14,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .fgColor = 2,\n        .bgColor = 1,\n        .shadowColor = 3,\n    },\n    [FONT_FEMALE] = {\n        .fontFunction = FontFunc_Female,\n        .maxLetterWidth = 10,\n        .maxLetterHeight = 14,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .fgColor = 2,\n        .bgColor = 1,\n        .shadowColor = 3,\n    },\n    [FONT_BRAILLE] = {\n        .fontFunction = FontFunc_Braille,\n        .maxLetterWidth = 8,\n        .maxLetterHeight = 16,\n        .letterSpacing = 0,\n        .lineSpacing = 2,\n        .fgColor = 2,\n        .bgColor = 1,\n        .shadowColor = 3,\n    },\n    [FONT_BOLD] = {\n        .fontFunction = NULL,\n        .maxLetterWidth = 8,\n        .maxLetterHeight = 8,\n        .letterSpacing = 0,\n        .lineSpacing = 0,\n        .fgColor = 1,\n        .bgColor = 2,\n        .shadowColor = 15,\n    }\n};\n\nstatic const u8 gMenuCursorDimensions[][2] = \n{\n    [FONT_SMALL]         = { 8,  13 },\n    [FONT_NORMAL_COPY_1] = { 8,  14 },\n    [FONT_NORMAL]        = { 8,  14 },\n    [FONT_NORMAL_COPY_2] = { 8,  14 },\n    [FONT_MALE]          = { 8,  14 },\n    [FONT_FEMALE]        = { 8,  14 },\n    [FONT_BRAILLE]       = { 8,  16 },\n    [FONT_BOLD]          = {}\n};\n\nstatic u16 CopyDecompressedTileDataToVram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode);\nstatic void WindowFunc_DrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);\nstatic void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);\nstatic void WindowFunc_ClearDialogWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);\nstatic void WindowFunc_ClearStdWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);\nstatic void TaskFreeBufAfterCopyingTileDataToVram(u8 taskId);\n\nvoid ClearScheduledBgCopiesToVram(void)\n{\n    memset(sScheduledBgCopiesToVram, 0, sizeof(sScheduledBgCopiesToVram));\n}\n\nvoid ScheduleBgCopyTilemapToVram(u8 bgId)\n{\n    sScheduledBgCopiesToVram[bgId] = TRUE;\n}\n\nvoid DoScheduledBgTilemapCopiesToVram(void)\n{\n    if (sScheduledBgCopiesToVram[0] == TRUE)\n    {\n        CopyBgTilemapBufferToVram(0);\n        sScheduledBgCopiesToVram[0] = FALSE;\n    }\n    if (sScheduledBgCopiesToVram[1] == TRUE)\n    {\n        CopyBgTilemapBufferToVram(1);\n        sScheduledBgCopiesToVram[1] = FALSE;\n    }\n    if (sScheduledBgCopiesToVram[2] == TRUE)\n    {\n        CopyBgTilemapBufferToVram(2);\n        sScheduledBgCopiesToVram[2] = FALSE;\n    }\n    if (sScheduledBgCopiesToVram[3] == TRUE)\n    {\n        CopyBgTilemapBufferToVram(3);\n        sScheduledBgCopiesToVram[3] = FALSE;\n    }\n}\n\nvoid ResetTempTileDataBuffers(void)\n{\n    int i;\n\n    for (i = 0; i < (s32)NELEMS(sTempTileDataBuffers); i++)\n    {\n        sTempTileDataBuffers[i] = NULL;\n    }\n    sTempTileDataBufferCursor = 0;\n}\n\nbool8 FreeTempTileDataBuffersIfPossible(void)\n{\n    int i;\n\n    if (!IsDma3ManagerBusyWithBgCopy())\n    {\n        if (sTempTileDataBufferCursor)\n        {\n            for (i = 0; i < sTempTileDataBufferCursor; i++)\n            {\n                FREE_AND_SET_NULL(sTempTileDataBuffers[i]);\n            }\n            sTempTileDataBufferCursor = 0;\n        }\n        return FALSE;\n    }\n    else\n    {\n        return TRUE;\n    }\n}\n\nvoid *DecompressAndCopyTileDataToVram(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)\n{\n    u32 sizeOut;\n\n    if (sTempTileDataBufferCursor < NELEMS(sTempTileDataBuffers))\n    {\n        void *ptr = MallocAndDecompress(src, &sizeOut);\n        if (!size)\n            size = sizeOut;\n        if (ptr)\n        {\n            CopyDecompressedTileDataToVram(bgId, ptr, size, offset, mode);\n            sTempTileDataBuffers[sTempTileDataBufferCursor++] = ptr;\n        }\n        return ptr;\n    }\n    return NULL;\n}\n\nvoid *DecompressAndCopyTileDataToVram2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)\n{\n    u32 sizeOut;\n\n    if (sTempTileDataBufferCursor < NELEMS(sTempTileDataBuffers))\n    {\n        void *ptr = MallocAndDecompress(src, &sizeOut);\n        if (sizeOut > size)\n            sizeOut = size;\n        if (ptr)\n        {\n            CopyDecompressedTileDataToVram(bgId, ptr, sizeOut, offset, mode);\n            sTempTileDataBuffers[sTempTileDataBufferCursor++] = ptr;\n        }\n        return ptr;\n    }\n    return NULL;\n}\n\nvoid DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)\n{\n    u32 sizeOut;\n\n    void *ptr = MallocAndDecompress(src, &sizeOut);\n    if (!size)\n        size = sizeOut;\n    if (ptr)\n    {\n        u8 taskId = CreateTask(TaskFreeBufAfterCopyingTileDataToVram, 0);\n        gTasks[taskId].data[0] = CopyDecompressedTileDataToVram(bgId, ptr, size, offset, mode);\n        SetWordTaskArg(taskId, 1, (u32)ptr);\n    }\n}\n\nvoid DecompressAndLoadBgGfxUsingHeap2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)\n{\n    u32 sizeOut;\n\n    void *ptr = MallocAndDecompress(src, &sizeOut);\n    if (sizeOut > size)\n        sizeOut = size;\n    if (ptr)\n    {\n        u8 taskId = CreateTask(TaskFreeBufAfterCopyingTileDataToVram, 0);\n        gTasks[taskId].data[0] = CopyDecompressedTileDataToVram(bgId, ptr, sizeOut, offset, mode);\n        SetWordTaskArg(taskId, 1, (u32)ptr);\n    }\n}\n\nstatic void TaskFreeBufAfterCopyingTileDataToVram(u8 taskId)\n{\n    if (!WaitDma3Request(gTasks[taskId].data[0]))\n    {\n        Free((void *)GetWordTaskArg(taskId, 1));\n        DestroyTask(taskId);\n    }\n}\n\nvoid *MallocAndDecompress(const void *src, u32 *size)\n{\n    void *ptr;\n    u8 *sizeAsBytes = (u8 *)size;\n    const u8 *srcAsBytes = src;\n\n    sizeAsBytes[0] = srcAsBytes[1];\n    sizeAsBytes[1] = srcAsBytes[2];\n    sizeAsBytes[2] = srcAsBytes[3];\n    sizeAsBytes[3] = 0;\n\n    ptr = Alloc(*size);\n    if (ptr)\n        LZ77UnCompWram(src, ptr);\n    return ptr;\n}\n\nstatic u16 CopyDecompressedTileDataToVram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode)\n{\n    switch (mode)\n    {\n    case 1:\n        break;\n    case 0:        \n    default:\n        return LoadBgTiles(bgId, src, size, offset);\n    }\n    return LoadBgTilemap(bgId, src, size, offset);\n}\n\nvoid SetBgTilemapPalette(u8 bgId, u8 left, u8 top, u8 width, u8 height, u8 palette)\n{\n    u8 i, j;\n    u16 *ptr = GetBgTilemapBuffer(bgId);\n\n    for (i = top; i < top + height; i++)\n    {\n        for (j = left; j < left + width; j++)\n        {\n            ptr[(i * 32) + j] = (ptr[(i * 32) + j] & 0xFFF) | (palette << 12);\n        }\n    }\n}\n\nvoid CopyToBufferFromBgTilemap(u8 bgId, u16 *dest, u8 left, u8 top, u8 width, u8 height)\n{\n    u8 i,j;\n    const u16 *src = GetBgTilemapBuffer(bgId);\n\n    for (i = 0; i < height; i++)\n    {\n        for (j = 0; j < width; j++)\n        {\n            dest[(i * width) + j] = src[(i + top) * 32 + j + left];\n        }\n    }\n}\n\nvoid ResetBgPositions(void)\n{\n    ChangeBgX(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgY(3, 0, 0);\n}\n\nvoid InitStandardTextBoxWindows(void)\n{\n    InitWindows(sStandardTextBox_WindowTemplates);\n    sStartMenuWindowId = 0xFF;\n    MapNamePopupWindowIdSetDummy();\n}\n\nvoid FreeAllOverworldWindowBuffers(void)\n{\n    FreeAllWindowBuffers();\n}\n\nvoid InitTextBoxGfxAndPrinters(void)\n{\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    DeactivateAllTextPrinters();\n    LoadStdWindowFrameGfx();\n}\n\nu16 RunTextPrinters_CheckPrinter0Active(void)\n{\n    RunTextPrinters();\n    return IsTextPrinterActive(0);\n}\n\nu16 AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 fgColor, u8 bgColor, u8 shadowColor)\n{\n    struct TextPrinterTemplate printer;\n\n    printer.currentChar = str;\n    printer.windowId = windowId;\n    printer.fontId = fontId;\n    printer.x = 0;\n    printer.y = 1;\n    printer.currentX = 0;\n    printer.currentY = 1;\n    printer.letterSpacing = 1;\n    printer.lineSpacing = 1;\n    printer.unk = 0;\n    printer.fgColor = fgColor;\n    printer.bgColor = bgColor;\n    printer.shadowColor = shadowColor;\n    gTextFlags.useAlternateDownArrow = 0;\n    return AddTextPrinter(&printer, speed, callback);\n}\n\nvoid AddTextPrinterDiffStyle(bool8 allowSkippingDelayWithButtonPress)\n{\n    u8 color;\n    void *nptr = NULL;\n\n    gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress;    \n    color = ContextNpcGetTextColor();\n    if (color == NPC_TEXT_COLOR_MALE)\n        AddTextPrinterParameterized2(0, FONT_MALE, gStringVar4, GetTextSpeedSetting(), nptr, TEXT_COLOR_BLUE, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    else if (color == NPC_TEXT_COLOR_FEMALE)\n        AddTextPrinterParameterized2(0, FONT_FEMALE, gStringVar4, GetTextSpeedSetting(), nptr, TEXT_COLOR_RED, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    else // NPC_TEXT_COLOR_MON / NPC_TEXT_COLOR_NEUTRAL\n        AddTextPrinterParameterized2(0, FONT_NORMAL, gStringVar4, GetTextSpeedSetting(), nptr, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n}\n\nvoid AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress)\n{\n    gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress;\n    AddTextPrinterParameterized2(0, FONT_NORMAL, gStringVar4, GetTextSpeedSetting(), NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n}\n\nvoid AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonPress, u8 speed)\n{\n    gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress;\n    AddTextPrinterParameterized2(0, FONT_NORMAL, gStringVar4, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n}\n\nvoid LoadStdWindowFrameGfx(void)\n{\n    if (gQuestLogState == QL_STATE_PLAYBACK)\n    {\n        gTextFlags.autoScroll = 1;\n        LoadQuestLogWindowTiles(0, DLG_WINDOW_BASE_TILE_NUM);\n    }\n    else\n    {\n        Menu_LoadStdPal();\n        LoadMenuMessageWindowGfx(0, DLG_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM));\n    }\n    LoadUserWindowGfx(0, STD_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(STD_WINDOW_PALETTE_NUM));\n}\n\nvoid DrawDialogueFrame(u8 windowId, bool8 copyToVram)\n{\n    CallWindowFunction(windowId, WindowFunc_DrawDialogueFrame);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    PutWindowTilemap(windowId);\n    if (copyToVram == TRUE)\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nvoid DrawStdWindowFrame(u8 windowId, bool8 copyToVram)\n{\n    CallWindowFunction(windowId, WindowFunc_DrawStandardFrame);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    PutWindowTilemap(windowId);\n    if (copyToVram == TRUE)\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nvoid ClearDialogWindowAndFrame(u8 windowId, bool8 copyToVram)\n{\n    CallWindowFunction(windowId, WindowFunc_ClearDialogWindowAndFrame);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    ClearWindowTilemap(windowId);\n    if (copyToVram == TRUE)\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n    if (gQuestLogState == QL_STATE_PLAYBACK)\n        CommitQuestLogWindow1();\n}\n\nvoid ClearStdWindowAndFrame(u8 windowId, bool8 copyToVram)\n{\n    CallWindowFunction(windowId, WindowFunc_ClearStdWindowAndFrame);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    ClearWindowTilemap(windowId);\n    if (copyToVram == TRUE)\n        CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)\n{\n    int i;\n\n    FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 1, tilemapTop - 1, 1, 1, STD_WINDOW_PALETTE_NUM);\n    FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 1, tilemapLeft, tilemapTop - 1, width, 1, STD_WINDOW_PALETTE_NUM);\n    FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 2, tilemapLeft + width, tilemapTop - 1, 1, 1, STD_WINDOW_PALETTE_NUM);\n    for (i = tilemapTop; i < tilemapTop + height; i++)\n    {\n        FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 3, tilemapLeft - 1, i, 1, 1, STD_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 5, tilemapLeft + width, i, 1, 1, STD_WINDOW_PALETTE_NUM);\n    }\n    FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop + height, 1, 1, STD_WINDOW_PALETTE_NUM);\n    FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 7, tilemapLeft, tilemapTop + height, width, 1, STD_WINDOW_PALETTE_NUM);\n    FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop + height, 1, 1, STD_WINDOW_PALETTE_NUM);\n}\n\nstatic void WindowFunc_DrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)\n{\n    if (!IsMsgSignpost() || gQuestLogState == QL_STATE_PLAYBACK)\n    {\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 2, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 2, tilemapLeft, tilemapTop - 1, width, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 5, tilemapLeft - 2, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 10), tilemapLeft - 2, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 11), tilemapLeft - 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 12), tilemapLeft + width, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 13), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 5), tilemapLeft - 2, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 6), tilemapLeft - 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 8), tilemapLeft + width, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 9), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), tilemapLeft - 2, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), tilemapLeft, tilemapTop + 4, width, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);\n    }\n    else\n    {\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 2, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 2, tilemapLeft, tilemapTop - 1, width, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 5, tilemapLeft - 2, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 5), tilemapLeft - 2, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 6), tilemapLeft - 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 8), tilemapLeft + width, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 9), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 10), tilemapLeft - 2, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 11), tilemapLeft - 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 12), tilemapLeft + width, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 13), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), tilemapLeft - 2, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), tilemapLeft, tilemapTop + 4, width, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);\n        FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);\n    }\n}\n\nstatic void WindowFunc_ClearStdWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)\n{\n    FillBgTilemapBufferRect(bg, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, STD_WINDOW_PALETTE_NUM);\n}\n\nstatic void WindowFunc_ClearDialogWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)\n{\n    FillBgTilemapBufferRect(bg, 0, tilemapLeft - 2, tilemapTop - 1, width + 4, height + 2, STD_WINDOW_PALETTE_NUM);\n}\n\nvoid EraseFieldMessageBox(bool8 copyToVram)\n{\n    FillBgTilemapBufferRect(0, 0, 0, 0, 0x20, 0x20, 17);\n    if (copyToVram == TRUE)\n        CopyBgTilemapBufferToVram(0);\n}\n\nvoid SetStdWindowBorderStyle(u8 windowId, bool8 copyToVram)\n{\n    DrawStdFrameWithCustomTileAndPalette(windowId, copyToVram, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM);\n}\n\nvoid LoadMessageBoxAndFrameGfx(u8 windowId, bool8 copyToVram)\n{\n    if (gQuestLogState == QL_STATE_PLAYBACK)\n    {\n        gTextFlags.autoScroll = 1;\n        LoadQuestLogWindowTiles(0, DLG_WINDOW_BASE_TILE_NUM);\n    }\n    else\n    {\n        LoadMenuMessageWindowGfx(windowId, DLG_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM));\n    }\n    DrawDialogFrameWithCustomTileAndPalette(windowId, copyToVram, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM);\n}\n\nvoid Menu_LoadStdPal(void)\n{\n    LoadPalette(gStandardMenuPalette, BG_PLTT_ID(STD_WINDOW_PALETTE_NUM), PLTT_SIZEOF(10));\n}\n\nvoid Menu_LoadStdPalAt(u16 offset)\n{\n    LoadPalette(gStandardMenuPalette, offset, PLTT_SIZEOF(10));\n}\n\n// Unused\nstatic const u16 *GetStdMenuPalette(void)\n{\n    return gStandardMenuPalette;\n}\n\nstatic u16 GetStdPalColor(u8 colorNum)\n{\n    if (colorNum > 15)\n        colorNum = 0;\n    return gStandardMenuPalette[colorNum];\n}\n\nvoid DisplayItemMessageOnField(u8 taskId, u8 fontId, const u8 *string, TaskFunc callback)\n{\n    LoadStdWindowFrameGfx();\n    DisplayMessageAndContinueTask(taskId, 0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM, fontId, GetTextSpeedSetting(), string, callback);\n    CopyWindowToVram(0, COPYWIN_FULL);\n}\n\nvoid DisplayYesNoMenuDefaultYes(void)\n{\n    CreateYesNoMenu(&sYesNo_WindowTemplate, FONT_NORMAL, 0, 2, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 0);\n}\n\nvoid DisplayYesNoMenuDefaultNo(void)\n{\n    CreateYesNoMenu(&sYesNo_WindowTemplate, FONT_NORMAL, 0, 2, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 1);\n}\n\nu8 GetTextSpeedSetting(void)\n{\n    u32 speed;\n    if (gSaveBlock2Ptr->optionsTextSpeed > OPTIONS_TEXT_SPEED_INSTANT)\n        gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_MID;\n    return sTextSpeedFrameDelays[gSaveBlock2Ptr->optionsTextSpeed];\n}\n\nu8 CreateStartMenuWindow(u8 height)\n{\n    if (sStartMenuWindowId == 0xFF)\n    {\n        struct WindowTemplate template = SetWindowTemplateFields(0, 0x16, 1, 7, height * 2 - 1, DLG_WINDOW_PALETTE_NUM, 0x13D);\n        sStartMenuWindowId = AddWindow(&template);\n        PutWindowTilemap(sStartMenuWindowId);\n    }\n    return sStartMenuWindowId;\n}\n\nu8 GetStartMenuWindowId(void)\n{\n    return sStartMenuWindowId;\n}\n\nvoid RemoveStartMenuWindow(void)\n{\n    if (sStartMenuWindowId != 0xFF)\n    {\n        RemoveWindow(sStartMenuWindowId);\n        sStartMenuWindowId = 0xFF;\n    }\n}\n\nstatic u16 GetDlgWindowBaseTileNum(void)\n{\n    return DLG_WINDOW_BASE_TILE_NUM;\n}\n\nu16 GetStdWindowBaseTileNum(void)\n{\n    return STD_WINDOW_BASE_TILE_NUM;\n}\n\nvoid DrawHelpMessageWindowWithText(const u8 * text)\n{\n    LoadHelpMessageWindowGfx(CreateHelpMessageWindow(), DLG_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM));\n    PrintTextOnHelpMessageWindow(text, 2);\n}\n\nvoid DestroyHelpMessageWindow_(void)\n{\n    DestroyHelpMessageWindow(2);\n}\n\nvoid LoadSignpostWindowFrameGfx(void)\n{\n    Menu_LoadStdPal();\n    LoadSignpostWindowGfx(0, DLG_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(DLG_WINDOW_PALETTE_NUM));\n    LoadUserWindowGfx(0, STD_WINDOW_BASE_TILE_NUM, BG_PLTT_ID(STD_WINDOW_PALETTE_NUM));\n}\n\nvoid SetDefaultFontsPointer(void)\n{\n    SetFontsPointer(&gFontInfos[0]);\n}\n\nu8 GetFontAttribute(u8 fontId, u8 attributeId)\n{\n    int result = 0;\n\n    switch (attributeId)\n    {\n    case FONTATTR_MAX_LETTER_WIDTH:\n        result = gFontInfos[fontId].maxLetterWidth;\n        break;\n    case FONTATTR_MAX_LETTER_HEIGHT:\n        result = gFontInfos[fontId].maxLetterHeight;\n        break;\n    case FONTATTR_LETTER_SPACING:\n        result = gFontInfos[fontId].letterSpacing;\n        break;\n    case FONTATTR_LINE_SPACING:\n        result = gFontInfos[fontId].lineSpacing;\n        break;\n    case FONTATTR_UNKNOWN:\n        result = gFontInfos[fontId].unk;\n        break;\n    case FONTATTR_COLOR_FOREGROUND:\n        result = gFontInfos[fontId].fgColor;\n        break;\n    case FONTATTR_COLOR_BACKGROUND:\n        result = gFontInfos[fontId].bgColor;\n        break;\n    case FONTATTR_COLOR_SHADOW:\n        result = gFontInfos[fontId].shadowColor;\n        break;\n    }\n    return result;\n}\n\nu8 GetMenuCursorDimensionByFont(u8 fontId, u8 whichDimension)\n{\n    return gMenuCursorDimensions[fontId][whichDimension];\n}\n"
  },
  {
    "path": "src/oak_speech.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"task.h\"\n#include \"blend_palette.h\"\n#include \"text_window.h\"\n#include \"menu.h\"\n#include \"help_system.h\"\n#include \"new_menu_helpers.h\"\n#include \"event_scripts.h\"\n#include \"scanline_effect.h\"\n#include \"pokeball.h\"\n#include \"naming_screen.h\"\n#include \"math_util.h\"\n#include \"overworld.h\"\n#include \"random.h\"\n#include \"data.h\"\n#include \"constants/songs.h\"\n\n#define INTRO_SPECIES SPECIES_NIDORAN_F\n\nenum\n{\n    WIN_INTRO_TEXTBOX,\n    WIN_INTRO_BOYGIRL,\n    WIN_INTRO_YESNO,\n    WIN_INTRO_NAMES,\n    NUM_INTRO_WINDOWS,\n};\n\nstruct OakSpeechResources\n{\n    void *oakSpeechBackgroundTiles;\n    void *trainerPicTilemap;\n    void *pikachuIntroTilemap;\n    void *unused1;\n    u16 hasPlayerBeenNamed;\n    u16 currentPage;\n    u16 windowIds[NUM_INTRO_WINDOWS];\n    u8 textColor[3];\n    u8 textSpeed;\n    u8 unused2[0x1800];\n    u8 bg2TilemapBuffer[0x400];\n    u8 bg1TilemapBuffer[0x800];\n};\n\nstatic EWRAM_DATA struct OakSpeechResources *sOakSpeechResources = NULL;\n\nstatic void Task_NewGameScene(u8);\n\nstatic void ControlsGuide_LoadPage1(void);\nstatic void Task_ControlsGuide_HandleInput(u8);\nstatic void Task_ControlsGuide_ChangePage(u8);\nstatic void Task_ControlsGuide_Clear(u8);\n\nstatic void Task_PikachuIntro_LoadPage1(u8);\nstatic void Task_PikachuIntro_HandleInput(u8);\nstatic void Task_PikachuIntro_Clear(u8);\n\nstatic void Task_OakSpeech_Init(u8);\nstatic void Task_OakSpeech_WelcomeToTheWorld(u8);\nstatic void Task_OakSpeech_ThisWorld(u8);\nstatic void Task_OakSpeech_ReleaseNidoranFFromPokeBall(u8);\nstatic void Task_OakSpeech_IsInhabitedFarAndWide(u8);\nstatic void Task_OakSpeech_IStudyPokemon(u8);\nstatic void Task_OakSpeech_ReturnNidoranFToPokeBall(u8);\nstatic void Task_OakSpeech_TellMeALittleAboutYourself(u8);\nstatic void Task_OakSpeech_FadeOutOak(u8);\nstatic void Task_OakSpeech_AskPlayerGender(u8);\nstatic void Task_OakSpeech_ShowGenderOptions(u8);\nstatic void Task_OakSpeech_HandleGenderInput(u8);\nstatic void Task_OakSpeech_ClearGenderWindows(u8);\nstatic void Task_OakSpeech_LoadPlayerPic(u8);\nstatic void Task_OakSpeech_YourNameWhatIsIt(u8);\nstatic void Task_OakSpeech_FadeOutForPlayerNamingScreen(u8);\nstatic void Task_OakSpeech_HandleRivalNameInput(u8);\nstatic void Task_OakSpeech_DoNamingScreen(u8);\nstatic void Task_OakSpeech_ConfirmName(u8);\nstatic void Task_OakSpeech_HandleConfirmNameInput(u8);\nstatic void Task_OakSpeech_FadeOutPlayerPic(u8);\nstatic void Task_OakSpeech_FadeOutRivalPic(u8);\nstatic void Task_OakSpeech_FadeInRivalPic(u8);\nstatic void Task_OakSpeech_AskRivalsName(u8);\nstatic void Task_OakSpeech_ReshowPlayersPic(u8);\nstatic void Task_OakSpeech_LetsGo(u8);\nstatic void Task_OakSpeech_FadeOutBGM(u8);\nstatic void Task_OakSpeech_SetUpExitAnimation(u8);\nstatic void Task_OakSpeech_SetUpShrinkPlayerPic(u8);\nstatic void Task_OakSpeech_ShrinkPlayerPic(u8);\nstatic void Task_OakSpeech_SetUpDestroyPlatformSprites(u8);\nstatic void Task_OakSpeech_DestroyPlatformSprites(u8);\nstatic void Task_OakSpeech_SetUpFadePlayerPicWhite(u8);\nstatic void Task_OakSpeech_FadePlayerPicWhite(u8);\nstatic void Task_OakSpeech_FadePlayerPicToBlack(u8);\nstatic void Task_OakSpeech_WaitForFade(u8);\nstatic void Task_OakSpeech_FreeResources(u8);\n\nstatic void CB2_ReturnFromNamingScreen(void);\nstatic void CreateNidoranFSprite(u8);\nstatic void CreatePikachuOrPlatformSprites(u8, u8);\nstatic void DestroyPikachuOrPlatformSprites(u8, u8);\nstatic void LoadTrainerPic(u16, u16);\nstatic void ClearTrainerPic(void);\nstatic void CreateFadeInTask(u8, u8);\nstatic void CreateFadeOutTask(u8, u8);\nstatic void PrintNameChoiceOptions(u8, u8);\nstatic void GetDefaultName(u8, u8);\n\nextern const u8 gText_Controls[];\nextern const u8 gText_ABUTTONNext[];\nextern const u8 gText_ABUTTONNext_BBUTTONBack[];\nextern const u8 gText_Boy[];\nextern const u8 gText_Girl[];\nextern const struct OamData gOamData_AffineOff_ObjBlend_32x32;\nextern const struct OamData gOamData_AffineOff_ObjNormal_32x32;\nextern const struct OamData gOamData_AffineOff_ObjNormal_32x16;\nextern const struct OamData gOamData_AffineOff_ObjNormal_16x8;\n\nstatic const u16 sOakSpeech_Background_Pals[] = INCBIN_U16(\"graphics/oak_speech/bg_tiles.gbapal\"); // Shared by the Controls Guide, Pikachu Intro and Oak Speech scenes\nstatic const u32 sControlsGuide_PikachuIntro_Background_Tiles[] = INCBIN_U32(\"graphics/oak_speech/bg_tiles.4bpp.lz\");\nstatic const u32 sPikachuIntro_Background_Tilemap[] = INCBIN_U32(\"graphics/oak_speech/pikachu_intro/tilemap.bin.lz\");\nstatic const u32 sOakSpeech_Background_Tiles[] = INCBIN_U32(\"graphics/oak_speech/oak_speech_bg.4bpp.lz\");\nstatic const u32 sOakSpeech_Background_Tilemap[] = INCBIN_U32(\"graphics/oak_speech/oak_speech_bg.bin.lz\");\nstatic const u16 sControlsGuide_Tilemap_Page2[] = INCBIN_U16(\"graphics/oak_speech/controls_guide_page_2.bin\");\nstatic const u16 sControlsGuide_Tilemap_Page3[] = INCBIN_U16(\"graphics/oak_speech/controls_guide_page_3.bin\");\nstatic const u16 sOakSpeech_Leaf_Pal[] = INCBIN_U16(\"graphics/oak_speech/leaf/pal.gbapal\");\nstatic const u32 sOakSpeech_Leaf_Tiles[] = INCBIN_U32(\"graphics/oak_speech/leaf/pic.8bpp.lz\");\nstatic const u16 sOakSpeech_Red_Pal[] = INCBIN_U16(\"graphics/oak_speech/red/pal.gbapal\");\nstatic const u32 sOakSpeech_Red_Tiles[] = INCBIN_U32(\"graphics/oak_speech/red/pic.8bpp.lz\");\nstatic const u16 sOakSpeech_Oak_Pal[] = INCBIN_U16(\"graphics/oak_speech/oak/pal.gbapal\");\nstatic const u32 sOakSpeech_Oak_Tiles[] = INCBIN_U32(\"graphics/oak_speech/oak/pic.8bpp.lz\");\nstatic const u16 sOakSpeech_Rival_Pal[] = INCBIN_U16(\"graphics/oak_speech/rival/pal.gbapal\");\nstatic const u32 sOakSpeech_Rival_Tiles[] = INCBIN_U32(\"graphics/oak_speech/rival/pic.8bpp.lz\");\nstatic const u16 sOakSpeech_Platform_Pal[] = INCBIN_U16(\"graphics/oak_speech/platform.gbapal\");\nstatic const u16 sPikachuIntro_Pikachu_Pal[] = INCBIN_U16(\"graphics/oak_speech/pikachu_intro/pikachu.gbapal\");\nstatic const u32 sOakSpeech_Platform_Gfx[] = INCBIN_U32(\"graphics/oak_speech/platform.4bpp.lz\");\nstatic const u32 sPikachuIntro_PikachuBody_Gfx[] = INCBIN_U32(\"graphics/oak_speech/pikachu_intro/body.4bpp.lz\");\nstatic const u32 sPikachuIntro_PikachuEars_Gfx[] = INCBIN_U32(\"graphics/oak_speech/pikachu_intro/ears.4bpp.lz\");\nstatic const u32 sPikachuIntro_PikachuEyes_Gfx[] = INCBIN_U32(\"graphics/oak_speech/pikachu_intro/eyes.4bpp.lz\");\n\nstatic const struct BgTemplate sBgTemplates[] =\n{\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0\n    },\n    {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0\n    },\n    {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 28,\n        .screenSize = 1,\n        .paletteMode = 1,\n        .priority = 1,\n        .baseTile = 0\n    }\n};\n\nenum\n{\n    CONTROLS_GUIDE_PAGE_1_WINDOW,\n    NUM_CONTROLS_GUIDE_PAGE_1_WINDOWS,\n};\n\nstatic const struct WindowTemplate sControlsGuide_WindowTemplate_Page1[NUM_CONTROLS_GUIDE_PAGE_1_WINDOWS + 1] =\n{\n    [CONTROLS_GUIDE_PAGE_1_WINDOW] =\n    {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 7,\n        .width = 30,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 1\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nenum\n{\n    CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP,\n    CONTROLS_GUIDE_PAGES_2_3_WINDOW_MIDDLE,\n    CONTROLS_GUIDE_PAGES_2_3_WINDOW_BOTTOM,\n    NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS,\n};\n\nstatic const struct WindowTemplate sControlsGuide_WindowTemplate_Page2[NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS + 1] =\n{\n    [CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP] =\n    {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 3,\n        .width = 24,\n        .height = 6,\n        .paletteNum = 15,\n        .baseBlock = 1\n    },\n    [CONTROLS_GUIDE_PAGES_2_3_WINDOW_MIDDLE] =\n    {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 10,\n        .width = 24,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 146\n    },\n    [CONTROLS_GUIDE_PAGES_2_3_WINDOW_BOTTOM] =\n    {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 15,\n        .width = 24,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 243\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sControlsGuide_WindowTemplate_Page3[NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS + 1] =\n{\n    [CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP] =\n    {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 3,\n        .width = 24,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 1\n    },\n    [CONTROLS_GUIDE_PAGES_2_3_WINDOW_MIDDLE] =\n    {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 8,\n        .width = 24,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 98\n    },\n    [CONTROLS_GUIDE_PAGES_2_3_WINDOW_BOTTOM] =\n    {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 13,\n        .width = 24,\n        .height = 6,\n        .paletteNum = 15,\n        .baseBlock = 195\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nenum\n{\n    CONTROLS_GUIDE_PAGE_1,\n    CONTROLS_GUIDE_PAGE_2,\n    CONTROLS_GUIDE_PAGE_3,\n    NUM_CONTROLS_GUIDE_PAGES,\n};\n\nstatic const struct WindowTemplate *const sControlsGuide_WindowTemplates[NUM_CONTROLS_GUIDE_PAGES] =\n{\n    [CONTROLS_GUIDE_PAGE_1] = sControlsGuide_WindowTemplate_Page1,\n    [CONTROLS_GUIDE_PAGE_2] = sControlsGuide_WindowTemplate_Page2,\n    [CONTROLS_GUIDE_PAGE_3] = sControlsGuide_WindowTemplate_Page3\n};\n\nstatic const struct WindowTemplate sIntro_WindowTemplates[NUM_INTRO_WINDOWS + 1] =\n{\n    [WIN_INTRO_TEXTBOX] =\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 4,\n        .width = 28,\n        .height = 15,\n        .paletteNum = 15,\n        .baseBlock = 1\n    },\n    [WIN_INTRO_BOYGIRL] =\n    {\n        .bg = 0,\n        .tilemapLeft = 18,\n        .tilemapTop = 9,\n        .width = 9,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 372\n    },\n    [WIN_INTRO_YESNO] =\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 2,\n        .width = 6,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 384\n    },\n    [WIN_INTRO_NAMES] =\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 2,\n        .width = 12,\n        .height = 10,\n        .paletteNum = 15,\n        .baseBlock = 1\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const u8 sTextColor_White[] = { 0, 1, 2, 0 };\nstatic const u8 sTextColor_DarkGray[] = { 0, 2, 3, 0 };\n\nenum\n{\n    PIKACHU_INTRO_PAGE_1,\n    PIKACHU_INTRO_PAGE_2,\n    PIKACHU_INTRO_PAGE_3,\n    NUM_PIKACHU_INTRO_PAGES,\n};\n\nstatic const u8 *const sPikachuIntro_Strings[NUM_PIKACHU_INTRO_PAGES] =\n{\n    [PIKACHU_INTRO_PAGE_1] = gPikachuIntro_Text_Page1,\n    [PIKACHU_INTRO_PAGE_2] = gPikachuIntro_Text_Page2,\n    [PIKACHU_INTRO_PAGE_3] = gPikachuIntro_Text_Page3\n};\n\n#define GFX_TAG_PLATFORM     0x1000\n#define GFX_TAG_PIKACHU      0x1001\n#define GFX_TAG_PIKACHU_EARS 0x1002\n#define GFX_TAG_PIKACHU_EYES 0x1003\n\n#define PAL_TAG_PLATFORM     0x1000\n#define PAL_TAG_PIKACHU      0x1001\n\nenum\n{\n    SPRITE_TYPE_PIKACHU,\n    SPRITE_TYPE_PLATFORM,\n};\n\nenum\n{\n    PIKACHU_BODY_PLATFORM_LEFT,\n    PIKACHU_EARS_PLATFORM_MIDDLE,\n    PIKACHU_EYES_PLATFORM_RIGHT,\n    NUM_PIKACHU_PLATFORM_SPRITES,\n};\n\nstatic const struct CompressedSpriteSheet sPikachuIntro_Pikachu_SpriteSheets[] =\n{\n    [PIKACHU_BODY_PLATFORM_LEFT] =\n    {\n        .data = sPikachuIntro_PikachuBody_Gfx,\n        .size = 0x400,\n        .tag = GFX_TAG_PIKACHU\n    },\n    [PIKACHU_EARS_PLATFORM_MIDDLE] =\n    {\n        .data = sPikachuIntro_PikachuEars_Gfx,\n        .size = 0x200,\n        .tag = GFX_TAG_PIKACHU_EARS\n    },\n    [PIKACHU_EYES_PLATFORM_RIGHT] =\n    {\n        .data = sPikachuIntro_PikachuEyes_Gfx,\n        .size = 0x80,\n        .tag = GFX_TAG_PIKACHU_EYES\n    },\n};\n\nstatic const struct CompressedSpriteSheet sOakSpeech_Platform_SpriteSheet =\n{\n    .data = sOakSpeech_Platform_Gfx,\n    .size = 0x600,\n    .tag = GFX_TAG_PLATFORM\n};\n\nstatic const struct SpritePalette sPikachuIntro_Pikachu_SpritePalette =\n{\n    .data = sPikachuIntro_Pikachu_Pal,\n    .tag = PAL_TAG_PIKACHU\n};\n\nstatic const struct SpritePalette sOakSpeech_Platform_SpritePalette =\n{\n    .data = sOakSpeech_Platform_Pal,\n    .tag = PAL_TAG_PLATFORM\n};\n\nstatic const union AnimCmd sOakSpeech_PlatformLeft_Anim[] =\n{\n    ANIMCMD_FRAME( 0, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sOakSpeech_PlatformMiddle_Anim[] =\n{\n    ANIMCMD_FRAME(16, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sOakSpeech_PlatformRight_Anim[] =\n{\n    ANIMCMD_FRAME(32, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sOakSpeech_PlatformLeft_Anims[] =\n{\n    sOakSpeech_PlatformLeft_Anim\n};\n\nstatic const union AnimCmd *const sOakSpeech_PlatformMiddle_Anims[] =\n{\n    sOakSpeech_PlatformMiddle_Anim\n};\n\nstatic const union AnimCmd *const sOakSpeech_PlatformRight_Anims[] =\n{\n    sOakSpeech_PlatformRight_Anim\n};\n\nstatic const struct SpriteTemplate sOakSpeech_Platform_SpriteTemplates[] =\n{\n    [PIKACHU_BODY_PLATFORM_LEFT] =\n    {\n        .tileTag = GFX_TAG_PLATFORM,\n        .paletteTag = PAL_TAG_PLATFORM,\n        .oam = &gOamData_AffineOff_ObjBlend_32x32,\n        .anims = sOakSpeech_PlatformLeft_Anims,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    },\n    [PIKACHU_EARS_PLATFORM_MIDDLE] =\n    {\n        .tileTag = GFX_TAG_PLATFORM,\n        .paletteTag = PAL_TAG_PLATFORM,\n        .oam = &gOamData_AffineOff_ObjBlend_32x32,\n        .anims = sOakSpeech_PlatformMiddle_Anims,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    },\n    [PIKACHU_EYES_PLATFORM_RIGHT] =\n    {\n        .tileTag = GFX_TAG_PLATFORM,\n        .paletteTag = PAL_TAG_PLATFORM,\n        .oam = &gOamData_AffineOff_ObjBlend_32x32,\n        .anims = sOakSpeech_PlatformRight_Anims,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    },\n};\n\nstatic const union AnimCmd sPikachuIntro_PikachuBody_Anim[] =\n{\n    ANIMCMD_FRAME( 0, 30),\n    ANIMCMD_FRAME(16, 30),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sPikachuIntro_PikachuEars_Anim[] =\n{\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(8, 12),\n    ANIMCMD_FRAME(0, 12),\n    ANIMCMD_FRAME(8, 12),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(8, 12),\n    ANIMCMD_FRAME(0, 12),\n    ANIMCMD_FRAME(8, 12),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sPikachuIntro_PikachuEyes_Anim[] =\n{\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(2,  8),\n    ANIMCMD_FRAME(0,  8),\n    ANIMCMD_FRAME(2,  8),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(0, 60),\n    ANIMCMD_FRAME(2,  8),\n    ANIMCMD_FRAME(0,  8),\n    ANIMCMD_FRAME(2,  8),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sPikachuIntro_PikachuBody_Anims[] =\n{\n    sPikachuIntro_PikachuBody_Anim\n};\n\nstatic const union AnimCmd *const sPikachuIntro_PikachuEars_Anims[] =\n{\n    sPikachuIntro_PikachuEars_Anim\n};\n\nstatic const union AnimCmd *const sPikachuIntro_PikachuEyes_Anims[] =\n{\n    sPikachuIntro_PikachuEyes_Anim\n};\n\nstatic const struct SpriteTemplate sPikachuIntro_Pikachu_SpriteTemplates[NUM_PIKACHU_PLATFORM_SPRITES] =\n{\n    [PIKACHU_BODY_PLATFORM_LEFT] =\n    {\n        .tileTag = GFX_TAG_PIKACHU,\n        .paletteTag = PAL_TAG_PIKACHU,\n        .oam = &gOamData_AffineOff_ObjNormal_32x32,\n        .anims = sPikachuIntro_PikachuBody_Anims,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    },\n    [PIKACHU_EARS_PLATFORM_MIDDLE] =\n    {\n        .tileTag = GFX_TAG_PIKACHU_EARS,\n        .paletteTag = PAL_TAG_PIKACHU,\n        .oam = &gOamData_AffineOff_ObjNormal_32x16,\n        .anims = sPikachuIntro_PikachuEars_Anims,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    },\n    [PIKACHU_EYES_PLATFORM_RIGHT] =\n    {\n        .tileTag = GFX_TAG_PIKACHU_EYES,\n        .paletteTag = PAL_TAG_PIKACHU,\n        .oam = &gOamData_AffineOff_ObjNormal_16x8,\n        .anims = sPikachuIntro_PikachuEyes_Anims,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    }\n};\n\n#define CONTROLS_GUIDE_STRINGS_PER_PAGE 3\n\nstatic const u8 *const sControlsGuide_Pages2And3_Strings[CONTROLS_GUIDE_STRINGS_PER_PAGE * 2] =\n{\n    // Page 2\n    gControlsGuide_Text_DPad,\n    gControlsGuide_Text_AButton,\n    gControlsGuide_Text_BButton,\n    // Page 3\n    gControlsGuide_Text_StartButton,\n    gControlsGuide_Text_SelectButton,\n    gControlsGuide_Text_LRButtons\n};\n\nstatic const u8 *const sMaleNameChoices_FR[] = {\n    gNameChoice_Red,\n    gNameChoice_Fire,\n    gNameChoice_Ash,\n    gNameChoice_Kene,\n    gNameChoice_Geki,\n    gNameChoice_Jak,\n    gNameChoice_Janne,\n    gNameChoice_Jonn,\n    gNameChoice_Kamon,\n    gNameChoice_Karl,\n    gNameChoice_Taylor,\n    gNameChoice_Oscar,\n    gNameChoice_Hiro,\n    gNameChoice_Max,\n    gNameChoice_Jon,\n    gNameChoice_Ralph,\n    gNameChoice_Kay,\n    gNameChoice_Tosh,\n    gNameChoice_Roak\n};\n\nstatic const u8 *const sMaleNameChoices_LG[] = {\n    gNameChoice_Green,\n    gNameChoice_Leaf,\n    gNameChoice_Gary,\n    gNameChoice_Kaz,\n    gNameChoice_Toru,\n    gNameChoice_Jak,\n    gNameChoice_Janne,\n    gNameChoice_Jonn,\n    gNameChoice_Kamon,\n    gNameChoice_Karl,\n    gNameChoice_Taylor,\n    gNameChoice_Oscar,\n    gNameChoice_Hiro,\n    gNameChoice_Max,\n    gNameChoice_Jon,\n    gNameChoice_Ralph,\n    gNameChoice_Kay,\n    gNameChoice_Tosh,\n    gNameChoice_Roak\n};\n\nstatic const u8 *const sFemaleNameChoices_FR[] = {\n    gNameChoice_Red,\n    gNameChoice_Fire,\n    gNameChoice_Omi,\n    gNameChoice_Jodi,\n    gNameChoice_Amanda,\n    gNameChoice_Hillary,\n    gNameChoice_Makey,\n    gNameChoice_Michi,\n    gNameChoice_Paula,\n    gNameChoice_June,\n    gNameChoice_Cassie,\n    gNameChoice_Rey,\n    gNameChoice_Seda,\n    gNameChoice_Kiko,\n    gNameChoice_Mina,\n    gNameChoice_Norie,\n    gNameChoice_Sai,\n    gNameChoice_Momo,\n    gNameChoice_Suzi\n};\n\nstatic const u8 *const sFemaleNameChoices_LG[] = {\n    gNameChoice_Green,\n    gNameChoice_Leaf,\n    gNameChoice_Omi,\n    gNameChoice_Jodi,\n    gNameChoice_Amanda,\n    gNameChoice_Hillary,\n    gNameChoice_Makey,\n    gNameChoice_Michi,\n    gNameChoice_Paula,\n    gNameChoice_June,\n    gNameChoice_Cassie,\n    gNameChoice_Rey,\n    gNameChoice_Seda,\n    gNameChoice_Kiko,\n    gNameChoice_Mina,\n    gNameChoice_Norie,\n    gNameChoice_Sai,\n    gNameChoice_Momo,\n    gNameChoice_Suzi\n};\n\nstatic const u8 *const sRivalNameChoices_FR[] = {\n    gNameChoice_Green,\n    gNameChoice_Gary,\n    gNameChoice_Kaz,\n    gNameChoice_Toru\n};\n\nstatic const u8 *const sRivalNameChoices_LG[] = {\n    gNameChoice_Red,\n    gNameChoice_Ash,\n    gNameChoice_Kene,\n    gNameChoice_Geki\n};\n\nenum\n{\n    MALE_PLAYER_PIC,\n    FEMALE_PLAYER_PIC,\n    RIVAL_PIC,\n    OAK_PIC\n};\n\nstatic void VBlankCB_NewGameScene(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void CB2_NewGameScene(void)\n{\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nvoid StartNewGameScene(void)\n{\n    gPlttBufferUnfaded[0] = RGB_BLACK;\n    gPlttBufferFaded[0]   = RGB_BLACK;\n    CreateTask(Task_NewGameScene, 0);\n    SetMainCallback2(CB2_NewGameScene);\n}\n\n#define tSpriteTimer                data[0]\n#define tTrainerPicPosX             data[1]\n#define tTrainerPicFadeState        data[2]\n#define tTimer                      data[3]\n#define tNidoranFSpriteId           data[4]\n#define tTextCursorSpriteId         data[5]\n#define tPokeBallSpriteId           data[6]\n#define tPikachuPlatformSpriteId(i) data[7 + i] // Pikachu and the platform are built of three sprites,\n                                 // data[8]     // so these are used to hold their sprite IDs\n                                 // data[9]     //\n#define tMenuWindowId               data[13]\n#define tTextboxWindowId            data[14]\n#define tDelta                      data[15]\n\nstatic void Task_NewGameScene(u8 taskId)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        SetHBlankCallback(NULL);\n        DmaFill16(3, 0, VRAM, VRAM_SIZE);\n        DmaFill32(3, 0, OAM, OAM_SIZE);\n        DmaFill16(3, 0, PLTT + sizeof(u16), PLTT_SIZE - 2);\n        ResetPaletteFade();\n        ScanlineEffect_Stop();\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        ResetTempTileDataBuffers();\n        SetHelpContext(HELPCONTEXT_NEW_GAME);\n        break;\n    case 1:\n        sOakSpeechResources = AllocZeroed(sizeof(*sOakSpeechResources));\n        CreateMonSpritesGfxManager(1, 1);\n        break;\n    case 2:\n        SetGpuReg(REG_OFFSET_WIN0H, 0);\n        SetGpuReg(REG_OFFSET_WIN0V, 0);\n        SetGpuReg(REG_OFFSET_WIN1H, 0);\n        SetGpuReg(REG_OFFSET_WIN1V, 0);\n        SetGpuReg(REG_OFFSET_WININ, 0);\n        SetGpuReg(REG_OFFSET_WINOUT, 0);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        break;\n    case 3:\n        ResetBgsAndClearDma3BusyFlags(0);\n        InitBgsFromTemplates(1, sBgTemplates, ARRAY_COUNT(sBgTemplates));\n        SetBgTilemapBuffer(1, sOakSpeechResources->bg1TilemapBuffer);\n        SetBgTilemapBuffer(2, sOakSpeechResources->bg2TilemapBuffer);\n        ChangeBgX(1, 0, BG_COORD_SET);\n        ChangeBgY(1, 0, BG_COORD_SET);\n        ChangeBgX(2, 0, BG_COORD_SET);\n        ChangeBgY(2, 0, BG_COORD_SET);\n        gSpriteCoordOffsetX = 0;\n        gSpriteCoordOffsetY = 0;\n        break;\n    case 4:\n        gPaletteFade.bufferTransferDisabled = TRUE;\n        InitStandardTextBoxWindows();\n        InitTextBoxGfxAndPrinters();\n        Menu_LoadStdPalAt(BG_PLTT_ID(13));\n        LoadPalette(sOakSpeech_Background_Pals, BG_PLTT_ID(0), sizeof(sOakSpeech_Background_Pals));\n        LoadPalette(GetTextWindowPalette(2) + 15, BG_PLTT_ID(0), PLTT_SIZEOF(1));\n        break;\n    case 5:\n        sOakSpeechResources->textSpeed = GetTextSpeedSetting();\n        gTextFlags.canABSpeedUpPrint = TRUE;\n        DecompressAndCopyTileDataToVram(1, sControlsGuide_PikachuIntro_Background_Tiles, 0, 0, 0);\n        break;\n    case 6:\n        if (FreeTempTileDataBuffersIfPossible())\n            return;\n        ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE);\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 32);\n        CopyBgTilemapBufferToVram(1);\n        break;\n    case 7:\n        CreateTopBarWindowLoadPalette(0, 30, 0, 13, 0x1C4);\n        FillBgTilemapBufferRect_Palette0(1, 0xD00F, 0,  0, 30, 2);\n        FillBgTilemapBufferRect_Palette0(1, 0xD002, 0,  2, 30, 1);\n        FillBgTilemapBufferRect_Palette0(1, 0xD00E, 0, 19, 30, 1);\n        ControlsGuide_LoadPage1();\n        gPaletteFade.bufferTransferDisabled = FALSE;\n        gTasks[taskId].tTextCursorSpriteId = CreateTextCursorSprite(0, 230, 149, 0, 0);\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        break;\n    case 10:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n        ShowBg(0);\n        ShowBg(1);\n        SetVBlankCallback(VBlankCB_NewGameScene);\n        PlayBGM(MUS_NEW_GAME_INSTRUCT);\n        gTasks[taskId].func = Task_ControlsGuide_HandleInput;\n        gMain.state = 0;\n        return;\n    }\n\n    gMain.state++;\n}\n\nstatic void ControlsGuide_LoadPage1(void)\n{\n    TopBarWindowPrintTwoStrings(gText_Controls, gText_ABUTTONNext, FALSE, 0, TRUE);\n    sOakSpeechResources->windowIds[0] = AddWindow(sControlsGuide_WindowTemplates[sOakSpeechResources->currentPage]);\n    PutWindowTilemap(sOakSpeechResources->windowIds[0]);\n    FillWindowPixelBuffer(sOakSpeechResources->windowIds[0], PIXEL_FILL(0));\n    AddTextPrinterParameterized4(sOakSpeechResources->windowIds[0], FONT_NORMAL, 2, 0, 1, 1, sTextColor_White, 0, gControlsGuide_Text_Intro);\n    CopyWindowToVram(sOakSpeechResources->windowIds[0], COPYWIN_FULL);\n    FillBgTilemapBufferRect_Palette0(1, 0x3000, 1, 3, 5, 16);\n    CopyBgTilemapBufferToVram(1);\n}\n\nstatic void Task_ControlsGuide_LoadPage(u8 taskId)\n{\n    u8 currWindow = 0;\n    u8 page2Or3 = sOakSpeechResources->currentPage - 1; // 0 if page 2, 1 if page 3\n    if (sOakSpeechResources->currentPage == CONTROLS_GUIDE_PAGE_1)\n    {\n        ControlsGuide_LoadPage1();\n    }\n    else\n    {\n        TopBarWindowPrintString(gText_ABUTTONNext_BBUTTONBack, 0, TRUE);\n        for (currWindow = CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP; currWindow < NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS; currWindow++)\n        {\n            sOakSpeechResources->windowIds[currWindow] = AddWindow(&sControlsGuide_WindowTemplates[sOakSpeechResources->currentPage][currWindow]);\n            PutWindowTilemap(sOakSpeechResources->windowIds[currWindow]);\n            FillWindowPixelBuffer(sOakSpeechResources->windowIds[currWindow], PIXEL_FILL(0));\n            AddTextPrinterParameterized4(sOakSpeechResources->windowIds[currWindow], FONT_NORMAL, 6, 0, 1, 1, sTextColor_White, 0, sControlsGuide_Pages2And3_Strings[currWindow + page2Or3 * CONTROLS_GUIDE_STRINGS_PER_PAGE]);\n            CopyWindowToVram(sOakSpeechResources->windowIds[currWindow], COPYWIN_FULL);\n        }\n\n        if (sOakSpeechResources->currentPage == CONTROLS_GUIDE_PAGE_2)\n            CopyToBgTilemapBufferRect(1, sControlsGuide_Tilemap_Page2, 1, 3, 5, 16);\n        else // CONTROLS_GUIDE_PAGE_3\n            CopyToBgTilemapBufferRect(1, sControlsGuide_Tilemap_Page3, 1, 3, 5, 16);\n        CopyBgTilemapBufferToVram(1);\n    }\n    BeginNormalPaletteFade(PALETTES_OBJECTS | 0xDFFF, -1, 16, 0, GetTextWindowPalette(2)[15]);\n    gTasks[taskId].func = Task_ControlsGuide_HandleInput;\n}\n\nstatic void Task_ControlsGuide_HandleInput(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        if(JOY_NEW((A_BUTTON | B_BUTTON)))\n        {\n            if (JOY_NEW(A_BUTTON))\n            {\n                gTasks[taskId].tDelta = 1;\n\n                if (sOakSpeechResources->currentPage < CONTROLS_GUIDE_PAGE_3)\n                    BeginNormalPaletteFade(PALETTES_OBJECTS | 0xDFFF, -1, 0, 16, GetTextWindowPalette(2)[15]);\n            }\n            else // B_BUTTON\n            {\n                if (sOakSpeechResources->currentPage == CONTROLS_GUIDE_PAGE_1)\n                    return;\n\n                gTasks[taskId].tDelta = -1;\n                BeginNormalPaletteFade(PALETTES_OBJECTS | 0xDFFF, -1, 0, 16, GetTextWindowPalette(2)[15]);\n            }\n\n            PlaySE(SE_SELECT);\n            gTasks[taskId].func = Task_ControlsGuide_ChangePage;\n        }\n    }\n}\n\nstatic void Task_ControlsGuide_ChangePage(u8 taskId)\n{\n    u8 numWindows = 0;\n    u32 i;\n\n    if (!gPaletteFade.active)\n    {\n        switch (sOakSpeechResources->currentPage)\n        {\n        case CONTROLS_GUIDE_PAGE_1:\n            numWindows = NUM_CONTROLS_GUIDE_PAGE_1_WINDOWS;\n            break;\n        case CONTROLS_GUIDE_PAGE_2:\n        case CONTROLS_GUIDE_PAGE_3:\n            numWindows = NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS;\n            break;\n        }\n        sOakSpeechResources->currentPage += gTasks[taskId].tDelta;\n        if (sOakSpeechResources->currentPage < NUM_CONTROLS_GUIDE_PAGES)\n        {\n            for (i = 0; i < numWindows; i++)\n            {\n                FillWindowPixelBuffer(sOakSpeechResources->windowIds[i], PIXEL_FILL(0));\n                ClearWindowTilemap(sOakSpeechResources->windowIds[i]);\n                CopyWindowToVram(sOakSpeechResources->windowIds[i], COPYWIN_FULL);\n                RemoveWindow(sOakSpeechResources->windowIds[i]);\n                sOakSpeechResources->windowIds[i] = 0;\n            }\n            gTasks[taskId].func = Task_ControlsGuide_LoadPage;\n        }\n        else\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, 0);\n            gTasks[taskId].func = Task_ControlsGuide_Clear;\n        }\n    }\n}\n\n#undef tDelta\n\nstatic void Task_ControlsGuide_Clear(u8 taskId)\n{\n    u8 i = 0;\n    if (!gPaletteFade.active)\n    {\n        for (i = 0; i < NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS; i++)\n        {\n            FillWindowPixelBuffer(sOakSpeechResources->windowIds[i], PIXEL_FILL(0));\n            ClearWindowTilemap(sOakSpeechResources->windowIds[i]);\n            CopyWindowToVram(sOakSpeechResources->windowIds[i], COPYWIN_FULL);\n            RemoveWindow(sOakSpeechResources->windowIds[i]);\n            sOakSpeechResources->windowIds[i] = 0;\n        }\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 30, 18);\n        CopyBgTilemapBufferToVram(1);\n        DestroyTextCursorSprite(gTasks[taskId].tTextCursorSpriteId);\n        sOakSpeechResources->windowIds[0] = RGB_BLACK;\n        LoadPalette(sOakSpeechResources->windowIds, BG_PLTT_ID(0), PLTT_SIZEOF(1));\n        gTasks[taskId].tTimer = 32;\n        gTasks[taskId].func = Task_PikachuIntro_LoadPage1;\n    }\n}\n\nenum\n{\n    PIKACHU_INTRO_SET_GPU_REGS,\n    PIKACHU_INTRO_HANDLE_INPUT,\n    PIKACHU_INTRO_PRINT_PAGE_TEXT,\n    PIKACHU_INTRO_FADE_IN_PAGE,\n    PIKACHU_INTRO_EXIT,\n};\n\n#define tBlendTarget data[15]\n\nstatic void Task_PikachuIntro_LoadPage1(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u32 size = 0;\n\n    if (tTimer != 0)\n    {\n        tTimer--;\n    }\n    else\n    {\n        PlayBGM(MUS_NEW_GAME_INTRO);\n        ClearTopBarWindow();\n        TopBarWindowPrintString(gText_ABUTTONNext, 0, 1);\n        sOakSpeechResources->pikachuIntroTilemap = MallocAndDecompress(sPikachuIntro_Background_Tilemap, &size);\n        CopyToBgTilemapBufferRect(1, sOakSpeechResources->pikachuIntroTilemap, 0, 2, 30, 19);\n        CopyBgTilemapBufferToVram(1);\n        Free(sOakSpeechResources->pikachuIntroTilemap);\n        sOakSpeechResources->pikachuIntroTilemap = NULL;\n        tTextboxWindowId = AddWindow(&sIntro_WindowTemplates[WIN_INTRO_TEXTBOX]);\n        PutWindowTilemap(tTextboxWindowId);\n        FillWindowPixelBuffer(tTextboxWindowId, PIXEL_FILL(0));\n        CopyWindowToVram(tTextboxWindowId, COPYWIN_FULL);\n        sOakSpeechResources->currentPage = PIKACHU_INTRO_PAGE_1;\n        gMain.state = PIKACHU_INTRO_SET_GPU_REGS;\n        tBlendTarget = 16;\n        AddTextPrinterParameterized4(tTextboxWindowId, FONT_NORMAL, 3, 5, 1, 0, sTextColor_DarkGray, 0, sPikachuIntro_Strings[PIKACHU_INTRO_PAGE_1]);\n        tTextCursorSpriteId = CreateTextCursorSprite(0, 226, 145, 0, 0);\n        gSprites[tTextCursorSpriteId].oam.objMode = ST_OAM_OBJ_BLEND;\n        gSprites[tTextCursorSpriteId].oam.priority = 0;\n        CreatePikachuOrPlatformSprites(taskId, SPRITE_TYPE_PIKACHU);\n        BeginNormalPaletteFade(PALETTES_ALL, 2, 16, 0, 0);\n        gTasks[taskId].func = Task_PikachuIntro_HandleInput;\n    }\n}\n\nstatic void Task_PikachuIntro_HandleInput(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    switch (gMain.state)\n    {\n    case PIKACHU_INTRO_SET_GPU_REGS:\n        if (!gPaletteFade.active)\n        {\n            SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH);\n            SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(16, DISPLAY_HEIGHT));\n            SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);\n            SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ);\n            SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n            gMain.state = PIKACHU_INTRO_HANDLE_INPUT;\n        }\n        break;\n    case PIKACHU_INTRO_HANDLE_INPUT:\n        if (JOY_NEW((A_BUTTON | B_BUTTON)))\n        {\n            if (JOY_NEW(A_BUTTON))\n            {\n                sOakSpeechResources->currentPage++;\n            }\n            else // B_BUTTON\n            {\n                if (sOakSpeechResources->currentPage != PIKACHU_INTRO_PAGE_1)\n                    sOakSpeechResources->currentPage--;\n                else\n                    break;\n            }\n            PlaySE(SE_SELECT);\n            if (sOakSpeechResources->currentPage == NUM_PIKACHU_INTRO_PAGES)\n            {\n                gMain.state = PIKACHU_INTRO_EXIT;\n            }\n            else\n            {\n                SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1);\n                SetGpuReg(REG_OFFSET_BLDALPHA, (16 - tBlendTarget) | tBlendTarget);\n                gMain.state++;\n            }\n        }\n        break;\n    case PIKACHU_INTRO_PRINT_PAGE_TEXT:\n        tBlendTarget -= 2;\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(tBlendTarget, 16 - tBlendTarget));\n        if (tBlendTarget <= 0)\n        {\n            FillWindowPixelBuffer(tTextboxWindowId, PIXEL_FILL(0));\n            AddTextPrinterParameterized4(tTextboxWindowId, FONT_NORMAL, 3, 5, 1, 0, sTextColor_DarkGray, 0, sPikachuIntro_Strings[sOakSpeechResources->currentPage]);\n            if (sOakSpeechResources->currentPage == PIKACHU_INTRO_PAGE_1)\n            {\n                ClearTopBarWindow();\n                TopBarWindowPrintString(gText_ABUTTONNext, 0, 1);\n            }\n            else\n            {\n                ClearTopBarWindow();\n                TopBarWindowPrintString(gText_ABUTTONNext_BBUTTONBack, 0, 1);\n            }\n            gMain.state++;\n        }\n        break;\n    case PIKACHU_INTRO_FADE_IN_PAGE:\n        tBlendTarget += 2;\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(tBlendTarget, 16 - tBlendTarget));\n        if (tBlendTarget >= 16)\n        {\n            tBlendTarget = 16;\n            SetGpuReg(REG_OFFSET_BLDCNT, 0);\n            SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n            gMain.state = PIKACHU_INTRO_HANDLE_INPUT;\n        }\n        break;\n    case PIKACHU_INTRO_EXIT:\n        DestroyTextCursorSprite(gTasks[taskId].tTextCursorSpriteId);\n        PlayBGM(MUS_NEW_GAME_EXIT);\n        tBlendTarget = 24;\n        gMain.state++;\n        break;\n    default:\n        if (tBlendTarget != 0)\n        {\n            tBlendTarget--;\n        }\n        else\n        {\n            gMain.state = 0;\n            sOakSpeechResources->currentPage = 0;\n            SetGpuReg(REG_OFFSET_WIN0H, 0);\n            SetGpuReg(REG_OFFSET_WIN0V, 0);\n            SetGpuReg(REG_OFFSET_WININ, 0);\n            SetGpuReg(REG_OFFSET_WINOUT, 0);\n            ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n            BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK);\n            gTasks[taskId].func = Task_PikachuIntro_Clear;\n        }\n        break;\n    }\n}\n\n#undef tBlendTarget\n\nstatic void Task_PikachuIntro_Clear(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active)\n    {\n        DestroyTopBarWindow();\n        FillWindowPixelBuffer(tTextboxWindowId, PIXEL_FILL(0));\n        ClearWindowTilemap(tTextboxWindowId);\n        CopyWindowToVram(tTextboxWindowId, COPYWIN_FULL);\n        RemoveWindow(tTextboxWindowId);\n        tTextboxWindowId = 0;\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20);\n        CopyBgTilemapBufferToVram(1);\n        DestroyPikachuOrPlatformSprites(taskId, SPRITE_TYPE_PIKACHU);\n        tTimer = 80;\n        gTasks[taskId].func = Task_OakSpeech_Init;\n    }\n}\n\nstatic void Task_OakSpeech_Init(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u32 size = 0;\n    if (tTimer != 0)\n    {\n        tTimer--;\n    }\n    else\n    {\n        sOakSpeechResources->oakSpeechBackgroundTiles = MallocAndDecompress(sOakSpeech_Background_Tiles, &size);\n        LoadBgTiles(1, sOakSpeechResources->oakSpeechBackgroundTiles, size, 0);\n        CopyToBgTilemapBuffer(1, sOakSpeech_Background_Tilemap, 0, 0);\n        CopyBgTilemapBufferToVram(1);\n        CreateNidoranFSprite(taskId);\n        LoadTrainerPic(OAK_PIC, 0);\n        CreatePikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM);\n        PlayBGM(MUS_ROUTE24);\n        BeginNormalPaletteFade(PALETTES_ALL, 5, 16, 0, RGB_BLACK);\n        tTimer = 80;\n        ShowBg(2);\n        gTasks[taskId].func = Task_OakSpeech_WelcomeToTheWorld;\n    }\n}\n\n#define OakSpeechPrintMessage(str, speed) ({                                                                                                                 \\\n    DrawDialogueFrame(WIN_INTRO_TEXTBOX, FALSE);                                                                                                             \\\n    if (str != gStringVar4)                                                                                                                                  \\\n    {                                                                                                                                                        \\\n        StringExpandPlaceholders(gStringVar4, str);                                                                                                          \\\n        AddTextPrinterParameterized2(WIN_INTRO_TEXTBOX, FONT_MALE, gStringVar4, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); \\\n    }                                                                                                                                                        \\\n    else                                                                                                                                                     \\\n    {                                                                                                                                                        \\\n        AddTextPrinterParameterized2(WIN_INTRO_TEXTBOX, FONT_MALE, str, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);         \\\n    }                                                                                                                                                        \\\n    CopyWindowToVram(WIN_INTRO_TEXTBOX, COPYWIN_FULL);                                                                                                       \\\n})\n\nstatic void Task_OakSpeech_WelcomeToTheWorld(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active)\n    {\n        if (tTimer != 0)\n        {\n            tTimer--;\n        }\n        else\n        {\n            OakSpeechPrintMessage(gOakSpeech_Text_WelcomeToTheWorld, sOakSpeechResources->textSpeed);\n            gTasks[taskId].func = Task_OakSpeech_ThisWorld;\n        }\n    }\n}\n\nstatic void Task_OakSpeech_ThisWorld(u8 taskId)\n{\n    if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX))\n    {\n        OakSpeechPrintMessage(gOakSpeech_Text_ThisWorld, sOakSpeechResources->textSpeed);\n        gTasks[taskId].tTimer = 30;\n        gTasks[taskId].func = Task_OakSpeech_ReleaseNidoranFFromPokeBall;\n    }\n}\n\nstatic void Task_OakSpeech_ReleaseNidoranFFromPokeBall(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u8 spriteId;\n\n    if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX))\n    {\n        if (tTimer != 0)\n            tTimer--;\n        spriteId = gTasks[taskId].tNidoranFSpriteId;\n        gSprites[spriteId].invisible = FALSE;\n        gSprites[spriteId].tSpriteTimer = 0;\n        CreatePokeballSpriteToReleaseMon(spriteId, gSprites[spriteId].oam.paletteNum, 100, 66, 0, 0, 32, 0xFFFF1FFF);\n        gTasks[taskId].func = Task_OakSpeech_IsInhabitedFarAndWide;\n        gTasks[taskId].tTimer = 0;\n    }\n}\n\nstatic void Task_OakSpeech_IsInhabitedFarAndWide(u8 taskId)\n{\n    if (IsCryFinished())\n    {\n        if (gTasks[taskId].tTimer >= 96)\n            gTasks[taskId].func = Task_OakSpeech_IStudyPokemon;\n    }\n    if (gTasks[taskId].tTimer < 0x4000)\n    {\n        gTasks[taskId].tTimer++;\n        if (gTasks[taskId].tTimer == 32)\n        {\n            OakSpeechPrintMessage(gOakSpeech_Text_IsInhabitedFarAndWide, sOakSpeechResources->textSpeed);\n            PlayCry_Normal(INTRO_SPECIES, 0);\n        }\n    }\n}\n\nstatic void Task_OakSpeech_IStudyPokemon(u8 taskId)\n{\n    if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX))\n    {\n        OakSpeechPrintMessage(gOakSpeech_Text_IStudyPokemon, sOakSpeechResources->textSpeed);\n        gTasks[taskId].func = Task_OakSpeech_ReturnNidoranFToPokeBall;\n    }\n}\n\nstatic void Task_OakSpeech_ReturnNidoranFToPokeBall(u8 taskId)\n{\n    u8 spriteId;\n\n    if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX))\n    {\n        ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE);\n        spriteId = gTasks[taskId].tNidoranFSpriteId;\n        gTasks[taskId].tPokeBallSpriteId = CreateTradePokeballSprite(spriteId, gSprites[spriteId].oam.paletteNum, 100, 66, 0, 0, 32, 0xFFFF1F3F);\n        gTasks[taskId].tTimer = 48;\n        gTasks[taskId].tSpriteTimer = 64;\n        gTasks[taskId].func = Task_OakSpeech_TellMeALittleAboutYourself;\n    }\n}\n\nstatic void Task_OakSpeech_TellMeALittleAboutYourself(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (tSpriteTimer != 0)\n    {\n        if (tSpriteTimer < 24)\n            gSprites[tNidoranFSpriteId].y--;\n        tSpriteTimer--;\n    }\n    else\n    {\n        if (tTimer == 48)\n        {\n            DestroySprite(&gSprites[tNidoranFSpriteId]);\n            DestroySprite(&gSprites[tPokeBallSpriteId]);\n        }\n        if (tTimer != 0)\n        {\n            tTimer--;\n        }\n        else\n        {\n            OakSpeechPrintMessage(gOakSpeech_Text_TellMeALittleAboutYourself, sOakSpeechResources->textSpeed);\n            gTasks[taskId].func = Task_OakSpeech_FadeOutOak;\n        }\n    }\n}\n\nstatic void Task_OakSpeech_FadeOutOak(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX))\n    {\n        ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, 1);\n        CreateFadeInTask(taskId, 2);\n        tTimer = 48;\n        gTasks[taskId].func = Task_OakSpeech_AskPlayerGender;\n    }\n}\n\nstatic void Task_OakSpeech_AskPlayerGender(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (tTrainerPicFadeState != 0)\n    {\n        if (tTimer != 0)\n        {\n            tTimer--;\n        }\n        else\n        {\n            tTrainerPicPosX = -60;\n            ClearTrainerPic();\n            OakSpeechPrintMessage(gOakSpeech_Text_AskPlayerGender, sOakSpeechResources->textSpeed);\n            gTasks[taskId].func = Task_OakSpeech_ShowGenderOptions;\n        }\n    }\n}\n\nstatic void Task_OakSpeech_ShowGenderOptions(u8 taskId)\n{\n    if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX))\n    {\n        gTasks[taskId].tMenuWindowId = AddWindow(&sIntro_WindowTemplates[WIN_INTRO_BOYGIRL]);\n        PutWindowTilemap(gTasks[taskId].tMenuWindowId);\n        DrawStdFrameWithCustomTileAndPalette(gTasks[taskId].tMenuWindowId, TRUE, GetStdWindowBaseTileNum(), 14);\n        FillWindowPixelBuffer(gTasks[taskId].tMenuWindowId, PIXEL_FILL(1));\n        sOakSpeechResources->textColor[0] = 1;\n        sOakSpeechResources->textColor[1] = 2;\n        sOakSpeechResources->textColor[2] = 3;\n        AddTextPrinterParameterized3(gTasks[taskId].tMenuWindowId, FONT_NORMAL, 8, 1, sOakSpeechResources->textColor, 0, gText_Boy);\n        sOakSpeechResources->textColor[0] = 1;\n        sOakSpeechResources->textColor[1] = 2;\n        sOakSpeechResources->textColor[2] = 3;\n        AddTextPrinterParameterized3(gTasks[taskId].tMenuWindowId, FONT_NORMAL, 8, 17, sOakSpeechResources->textColor, 0, gText_Girl);\n        Menu_InitCursor(gTasks[taskId].tMenuWindowId, FONT_NORMAL, 0, 1, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, 2, 0);\n        CopyWindowToVram(gTasks[taskId].tMenuWindowId, COPYWIN_FULL);\n        gTasks[taskId].func = Task_OakSpeech_HandleGenderInput;\n    }\n}\n\nstatic void Task_OakSpeech_HandleGenderInput(u8 taskId)\n{\n    s8 input = Menu_ProcessInputNoWrapAround();\n    switch (input)\n    {\n    case 0: // BOY\n        gSaveBlock2Ptr->playerGender = MALE;\n        break;\n    case 1: // GIRL\n        gSaveBlock2Ptr->playerGender = FEMALE;\n        break;\n    case MENU_B_PRESSED:\n    case MENU_NOTHING_CHOSEN:\n        return;\n    }\n    gTasks[taskId].func = Task_OakSpeech_ClearGenderWindows;\n\n}\n\nstatic void Task_OakSpeech_ClearGenderWindows(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    ClearStdWindowAndFrameToTransparent(tMenuWindowId, TRUE);\n    RemoveWindow(tMenuWindowId);\n    tMenuWindowId = WIN_INTRO_TEXTBOX;\n    ClearDialogWindowAndFrame(tMenuWindowId, TRUE);\n    FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);\n    CopyBgTilemapBufferToVram(0);\n    gTasks[taskId].func = Task_OakSpeech_LoadPlayerPic;\n}\n\nstatic void Task_OakSpeech_LoadPlayerPic(u8 taskId)\n{\n    if (gSaveBlock2Ptr->playerGender == MALE)\n        LoadTrainerPic(MALE_PLAYER_PIC, 0);\n    else\n        LoadTrainerPic(FEMALE_PLAYER_PIC, 0);\n    CreateFadeOutTask(taskId, 2);\n    gTasks[taskId].tTimer = 32;\n    gTasks[taskId].func = Task_OakSpeech_YourNameWhatIsIt;\n}\n\nstatic void Task_OakSpeech_YourNameWhatIsIt(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (tTrainerPicFadeState != 0)\n    {\n        if (tTimer != 0)\n        {\n            tTimer--;\n        }\n        else\n        {\n            tTrainerPicPosX = 0;\n            OakSpeechPrintMessage(gOakSpeech_Text_YourNameWhatIsIt, sOakSpeechResources->textSpeed);\n            gTasks[taskId].func = Task_OakSpeech_FadeOutForPlayerNamingScreen;\n        }\n    }\n}\n\nstatic void Task_OakSpeech_FadeOutForPlayerNamingScreen(u8 taskId)\n{\n    if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX))\n    {\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sOakSpeechResources->hasPlayerBeenNamed = FALSE;\n        gTasks[taskId].func = Task_OakSpeech_DoNamingScreen;\n    }\n}\n\nstatic void Task_OakSpeech_MoveRivalDisplayNameOptions(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX))\n    {\n        if (tTrainerPicPosX > -60)\n        {\n            tTrainerPicPosX -= 2;\n            gSpriteCoordOffsetX += 2;\n            ChangeBgX(2, 0x200, BG_COORD_SUB);\n        }\n        else\n        {\n            tTrainerPicPosX = -60;\n            PrintNameChoiceOptions(taskId, sOakSpeechResources->hasPlayerBeenNamed);\n            gTasks[taskId].func = Task_OakSpeech_HandleRivalNameInput;\n        }\n    }\n}\n\nstatic void Task_OakSpeech_RepeatNameQuestion(u8 taskId)\n{\n    PrintNameChoiceOptions(taskId, sOakSpeechResources->hasPlayerBeenNamed);\n    if (sOakSpeechResources->hasPlayerBeenNamed == FALSE)\n        OakSpeechPrintMessage(gOakSpeech_Text_YourNameWhatIsIt, 0);\n    else\n        OakSpeechPrintMessage(gOakSpeech_Text_YourRivalsNameWhatWasIt, 0);\n    gTasks[taskId].func = Task_OakSpeech_HandleRivalNameInput;\n}\n\n#define tNameNotConfirmed data[15]\n\nstatic void Task_OakSpeech_HandleRivalNameInput(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    s8 input = Menu_ProcessInput();\n    switch (input)\n    {\n    case 0: // NEW NAME\n        PlaySE(SE_SELECT);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        gTasks[taskId].func = Task_OakSpeech_DoNamingScreen;\n        break;\n    case 1: // Default name options\n    case 2: //\n    case 3: //\n    case 4: //\n        PlaySE(SE_SELECT);\n        ClearStdWindowAndFrameToTransparent(tMenuWindowId, TRUE);\n        RemoveWindow(tMenuWindowId);\n        GetDefaultName(sOakSpeechResources->hasPlayerBeenNamed, input - 1);\n        tNameNotConfirmed = TRUE;\n        gTasks[taskId].func = Task_OakSpeech_ConfirmName;\n        break;\n    case MENU_B_PRESSED:\n        break;\n    }\n}\n\nstatic void Task_OakSpeech_DoNamingScreen(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        GetDefaultName(sOakSpeechResources->hasPlayerBeenNamed, 0);\n        if (sOakSpeechResources->hasPlayerBeenNamed == FALSE)\n        {\n            DoNamingScreen(NAMING_SCREEN_PLAYER, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnFromNamingScreen);\n        }\n        else\n        {\n            ClearStdWindowAndFrameToTransparent(gTasks[taskId].tMenuWindowId, TRUE);\n            RemoveWindow(gTasks[taskId].tMenuWindowId);\n            DoNamingScreen(NAMING_SCREEN_RIVAL, gSaveBlock1Ptr->rivalName, 0, 0, 0, CB2_ReturnFromNamingScreen);\n        }\n        DestroyPikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM);\n        FreeAllWindowBuffers();\n    }\n}\n\nstatic void Task_OakSpeech_ConfirmName(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active)\n    {\n        if (tNameNotConfirmed == TRUE)\n        {\n            if (sOakSpeechResources->hasPlayerBeenNamed == FALSE)\n                StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_SoYourNameIsPlayer);\n            else\n                StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_ConfirmRivalName);\n            OakSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed);\n            tNameNotConfirmed = FALSE;\n            tTimer = 25;\n        }\n        else if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX))\n        {\n            if (tTimer != 0)\n            {\n                tTimer--;\n            }\n            else\n            {\n                CreateYesNoMenu(&sIntro_WindowTemplates[WIN_INTRO_YESNO], FONT_NORMAL, 0, 2, GetStdWindowBaseTileNum(), 14, 0);\n                gTasks[taskId].func = Task_OakSpeech_HandleConfirmNameInput;\n            }\n        }\n    }\n}\n\nstatic void Task_OakSpeech_HandleConfirmNameInput(u8 taskId)\n{\n    s8 input = Menu_ProcessInputNoWrapClearOnChoose();\n    switch (input)\n    {\n    case 0: // YES\n        PlaySE(SE_SELECT);\n        gTasks[taskId].tTimer = 40;\n        if (sOakSpeechResources->hasPlayerBeenNamed == FALSE)\n        {\n            ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE);\n            CreateFadeInTask(taskId, 2);\n            gTasks[taskId].func = Task_OakSpeech_FadeOutPlayerPic;\n        }\n        else\n        {\n            StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_RememberRivalsName);\n            OakSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed);\n            gTasks[taskId].func = Task_OakSpeech_FadeOutRivalPic;\n        }\n        break;\n    case 1: // NO\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        if (sOakSpeechResources->hasPlayerBeenNamed == FALSE)\n            gTasks[taskId].func = Task_OakSpeech_FadeOutForPlayerNamingScreen;\n        else\n            gTasks[taskId].func = Task_OakSpeech_RepeatNameQuestion;\n        break;\n    }\n}\n\nstatic void Task_OakSpeech_FadeOutPlayerPic(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (tTrainerPicFadeState != 0)\n    {\n        ClearTrainerPic();\n        if (tTimer != 0)\n            tTimer--;\n        else\n            gTasks[taskId].func = Task_OakSpeech_FadeInRivalPic;\n    }\n}\n\nstatic void Task_OakSpeech_FadeOutRivalPic(u8 taskId)\n{\n    if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX))\n    {\n        ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE);\n        CreateFadeInTask(taskId, 2);\n        gTasks[taskId].func = Task_OakSpeech_ReshowPlayersPic;\n    }\n}\n\nstatic void Task_OakSpeech_FadeInRivalPic(u8 taskId)\n{\n    ChangeBgX(2, 0, BG_COORD_SET);\n    gTasks[taskId].tTrainerPicPosX = 0;\n    gSpriteCoordOffsetX = 0;\n    LoadTrainerPic(RIVAL_PIC, 0);\n    CreateFadeOutTask(taskId, 2);\n    gTasks[taskId].func = Task_OakSpeech_AskRivalsName;\n}\n\nstatic void Task_OakSpeech_AskRivalsName(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (tTrainerPicFadeState != 0)\n    {\n        OakSpeechPrintMessage(gOakSpeech_Text_WhatWasHisName, sOakSpeechResources->textSpeed);\n        sOakSpeechResources->hasPlayerBeenNamed = TRUE;\n        gTasks[taskId].func = Task_OakSpeech_MoveRivalDisplayNameOptions;\n    }\n}\n\nstatic void Task_OakSpeech_ReshowPlayersPic(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (tTrainerPicFadeState != 0)\n    {\n        ClearTrainerPic();\n        if (tTimer != 0)\n        {\n            tTimer--;\n        }\n        else\n        {\n            if (gSaveBlock2Ptr->playerGender == MALE)\n                LoadTrainerPic(MALE_PLAYER_PIC, 0);\n            else\n                LoadTrainerPic(FEMALE_PLAYER_PIC, 0);\n            gTasks[taskId].tTrainerPicPosX = 0;\n            gSpriteCoordOffsetX = 0;\n            ChangeBgX(2, 0, BG_COORD_SET);\n            CreateFadeOutTask(taskId, 2);\n            gTasks[taskId].func = Task_OakSpeech_LetsGo;\n        }\n    }\n}\n\nstatic void Task_OakSpeech_LetsGo(u8 taskId)\n{\n    if (gTasks[taskId].tTrainerPicFadeState != 0)\n    {\n        StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_LetsGo);\n        OakSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed);\n        gTasks[taskId].tTimer = 30;\n        gTasks[taskId].func = Task_OakSpeech_FadeOutBGM;\n    }\n}\n\nstatic void Task_OakSpeech_FadeOutBGM(u8 taskId)\n{\n    if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX))\n    {\n        if (gTasks[taskId].tTimer != 0)\n        {\n            gTasks[taskId].tTimer--;\n        }\n        else\n        {\n            FadeOutBGM(4);\n            gTasks[taskId].func = Task_OakSpeech_SetUpExitAnimation;\n        }\n    }\n}\n\n// The sOakSpeechResources struct's currentPage field is reused below as a timer for shrinking the player pic\n#define shrinkTimer currentPage\n\nstatic void Task_OakSpeech_SetUpExitAnimation(u8 taskId)\n{\n    sOakSpeechResources->shrinkTimer = 0;\n    Task_OakSpeech_SetUpDestroyPlatformSprites(taskId);\n    Task_OakSpeech_SetUpFadePlayerPicWhite(taskId);\n    Task_OakSpeech_SetUpShrinkPlayerPic(taskId);\n}\n\n#define tPlayerPicFadeOutTimer data[0]\n#define tScaleDelta            data[2]\n#define tPlayerIsShrunk        data[15]\n\nstatic void Task_OakSpeech_SetUpShrinkPlayerPic(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    SetBgAttribute(2, BG_ATTR_WRAPAROUND, 1);\n    tPlayerPicFadeOutTimer = 0;\n    data[1] = 0; // assigned, but never read\n    tScaleDelta = 256;\n    tPlayerIsShrunk = FALSE;\n    gTasks[taskId].func = Task_OakSpeech_ShrinkPlayerPic;\n}\n\nstatic void Task_OakSpeech_ShrinkPlayerPic(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    s16 x, y;\n    u16 oldScaleDelta;\n\n    sOakSpeechResources->shrinkTimer++;\n    if (sOakSpeechResources->shrinkTimer % 20 == 0)\n    {\n        if (sOakSpeechResources->shrinkTimer == 40)\n            PlaySE(SE_WARP_IN);\n        oldScaleDelta = tScaleDelta;\n        tScaleDelta -= 32;\n        x = Q_8_8_inv(oldScaleDelta - 8);\n        y = Q_8_8_inv(tScaleDelta - 16);\n        SetBgAffine(2, 0x7800, 0x5400, 120, 84, x, y, 0);\n        if (tScaleDelta <= 96)\n        {\n            tPlayerIsShrunk = TRUE;\n            tPlayerPicFadeOutTimer = 36;\n            gTasks[taskId].func = Task_OakSpeech_FadePlayerPicToBlack;\n        }\n    }\n}\n\n#define tBGFadeStarted data[1]\n\nstatic void Task_OakSpeech_SetUpDestroyPlatformSprites(u8 taskId)\n{\n    u8 taskId2 = CreateTask(Task_OakSpeech_DestroyPlatformSprites, 1);\n    s16 *data = gTasks[taskId2].data;\n    data[0] = 0; // assigned, but never read\n    tBGFadeStarted = 0;\n    data[2] = 0; // assigned, but never read\n    data[15] = 0; // assigned, but never read\n    BeginNormalPaletteFade(PALETTES_OBJECTS | 0x0FCF, 4, 0, 16, RGB_BLACK);\n}\n\nstatic void Task_OakSpeech_DestroyPlatformSprites(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active)\n    {\n        if (tBGFadeStarted != 0)\n        {\n            DestroyTask(taskId);\n            // As this function's taskId is in fact taskId2 above, in\n            // Task_OakSpeech_SetUpDestroyPlatformSprites, the platform sprite\n            // IDs have not been assigned to this task's data[7], data[8] and\n            // data[9].\n            // As a result, the function below will only delete the sprite with\n            // ID 0.\n            // This can be verified by looking at the sprite viewer in an\n            // emulator at the end of the Oak speech.\n            DestroyPikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM);\n        }\n        else\n        {\n            tBGFadeStarted++;\n            BeginNormalPaletteFade(0x0000 | 0xF000, 0, 0, 16, RGB_BLACK);\n        }\n    }\n}\n\n#undef tBGFadeStarted\n\n#define tPlayerPicFadeWhiteTimer data[0]\n#define tUnderflowingTimer       data[1]\n#define tSecondaryTimer          data[2]\n#define tBlendCoefficient        data[14]\n\nstatic void Task_OakSpeech_SetUpFadePlayerPicWhite(u8 taskId)\n{\n    u8 taskId2 = CreateTask(Task_OakSpeech_FadePlayerPicWhite, 2);\n    s16 *data = gTasks[taskId2].data;\n    tPlayerPicFadeWhiteTimer = 8;\n    tUnderflowingTimer = 0;\n    tSecondaryTimer = 8;\n    tBlendCoefficient = 0;\n    data[15] = 0; // assigned, but never read\n}\n\nstatic void Task_OakSpeech_FadePlayerPicWhite(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u32 i;\n\n    if (tPlayerPicFadeWhiteTimer != 0)\n    {\n        tPlayerPicFadeWhiteTimer--;\n    }\n    else\n    {\n        if (tUnderflowingTimer <= 0 && tSecondaryTimer != 0)\n            tSecondaryTimer--;\n        BlendPalette(BG_PLTT_ID(4), 0x20, tBlendCoefficient, RGB_WHITE);\n        tBlendCoefficient++;\n        tUnderflowingTimer--;\n        tPlayerPicFadeWhiteTimer = tSecondaryTimer;\n        if (tBlendCoefficient > 14)\n        {\n            for (i = 0; i < 32; i++)\n            {\n                gPlttBufferFaded[i + BG_PLTT_ID(4)] = RGB_WHITE;\n                gPlttBufferUnfaded[i + BG_PLTT_ID(4)] = RGB_WHITE;\n            }\n            DestroyTask(taskId);\n        }\n    }\n}\n\nstatic void Task_OakSpeech_FadePlayerPicToBlack(u8 taskId)\n{\n    if (gTasks[taskId].tPlayerPicFadeOutTimer != 0)\n    {\n        gTasks[taskId].tPlayerPicFadeOutTimer--;\n    }\n    else\n    {\n        BeginNormalPaletteFade(0x0000 | 0x0030, 2, 0, 16, RGB_BLACK);\n        gTasks[taskId].func = Task_OakSpeech_WaitForFade;\n    }\n}\n\nstatic void Task_OakSpeech_WaitForFade(u8 taskId)\n{\n    if (!gPaletteFade.active)\n        gTasks[taskId].func = Task_OakSpeech_FreeResources;\n}\n\nstatic void Task_OakSpeech_FreeResources(u8 taskId)\n{\n    FreeAllWindowBuffers();\n    DestroyMonSpritesGfxManager();\n    Free(sOakSpeechResources);\n    sOakSpeechResources = NULL;\n    gTextFlags.canABSpeedUpPrint = FALSE;\n    SetMainCallback2(CB2_NewGame);\n    DestroyTask(taskId);\n}\n\nstatic void CB2_ReturnFromNamingScreen(void)\n{\n    u8 taskId;\n\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        DmaFill16(3, 0, VRAM, VRAM_SIZE);\n        DmaFill32(3, 0, OAM, OAM_SIZE);\n        DmaFill16(3, RGB_BLACK, PLTT + sizeof(u16), PLTT_SIZE - sizeof(u16));\n        ResetPaletteFade();\n        ScanlineEffect_Stop();\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        ResetTempTileDataBuffers();\n        break;\n    case 1:\n        ResetBgsAndClearDma3BusyFlags(0);\n        InitBgsFromTemplates(1, sBgTemplates, ARRAY_COUNT(sBgTemplates));\n        SetBgTilemapBuffer(1, sOakSpeechResources->bg1TilemapBuffer);\n        SetBgTilemapBuffer(2, sOakSpeechResources->bg2TilemapBuffer);\n        ChangeBgX(1, 0, BG_COORD_SET);\n        ChangeBgY(1, 0, BG_COORD_SET);\n        ChangeBgX(2, 0, BG_COORD_SET);\n        ChangeBgY(2, 0, BG_COORD_SET);\n        break;\n    case 2:\n        SetGpuReg(REG_OFFSET_WIN0H, 0);\n        SetGpuReg(REG_OFFSET_WIN0V, 0);\n        SetGpuReg(REG_OFFSET_WININ, 0);\n        SetGpuReg(REG_OFFSET_WINOUT, 0);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        break;\n    case 3:\n        FreeAllWindowBuffers();\n        InitStandardTextBoxWindows();\n        InitTextBoxGfxAndPrinters();\n        // Below is reading 48 colors beyond the background palette (into the tiles that follow it).\n        // This color range is used by the player and rival pic, which will overwrite them with the correct colors.\n#ifdef BUGFIX\n        LoadPalette(sOakSpeech_Background_Pals, BG_PLTT_ID(0), sizeof(sOakSpeech_Background_Pals));\n#else\n        LoadPalette(sOakSpeech_Background_Pals, BG_PLTT_ID(0), sizeof(sOakSpeech_Background_Pals) + PLTT_SIZEOF(48));\n#endif\n        break;\n    case 4:\n        DecompressAndCopyTileDataToVram(1, sOakSpeech_Background_Tiles, 0, 0, 0);\n        break;\n    case 5:\n        if (FreeTempTileDataBuffersIfPossible())\n            return;\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20);\n        CopyToBgTilemapBuffer(1, sOakSpeech_Background_Tilemap, 0, 0);\n        FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 20);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(2);\n        break;\n    case 6:\n        taskId = CreateTask(Task_OakSpeech_ConfirmName, 0);\n        if (sOakSpeechResources->hasPlayerBeenNamed == FALSE)\n        {\n            if (gSaveBlock2Ptr->playerGender == MALE)\n                LoadTrainerPic(MALE_PLAYER_PIC, 0);\n            else\n                LoadTrainerPic(FEMALE_PLAYER_PIC, 0);\n        }\n        else\n        {\n            LoadTrainerPic(RIVAL_PIC, 0);\n        }\n        gTasks[taskId].tTrainerPicPosX = -60;\n        gSpriteCoordOffsetX += 60;\n        ChangeBgX(2, 0xFFFFC400, BG_COORD_SET);\n        CreatePikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM);\n        gTasks[taskId].tNameNotConfirmed = TRUE;\n        break;\n    case 7:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n        ShowBg(0);\n        ShowBg(1);\n        ShowBg(2);\n        EnableInterrupts(INTR_FLAG_VBLANK);\n        SetVBlankCallback(VBlankCB_NewGameScene);\n        gTextFlags.canABSpeedUpPrint = TRUE;\n        SetMainCallback2(CB2_NewGameScene);\n        return;\n    }\n\n    gMain.state++;\n}\n\nstatic void CreateNidoranFSprite(u8 taskId)\n{\n    u8 spriteId;\n\n    DecompressPicFromTable(&gMonFrontPicTable[INTRO_SPECIES], MonSpritesGfxManager_GetSpritePtr(0), INTRO_SPECIES);\n    LoadCompressedSpritePaletteUsingHeap(&gMonPaletteTable[INTRO_SPECIES]);\n    SetMultiuseSpriteTemplateToPokemon(INTRO_SPECIES, 0);\n    spriteId = CreateSprite(&gMultiuseSpriteTemplate, 96, 96, 1);\n    gSprites[spriteId].callback = SpriteCallbackDummy;\n    gSprites[spriteId].oam.priority = 1;\n    gSprites[spriteId].invisible = TRUE;\n    gTasks[taskId].tNidoranFSpriteId = spriteId;\n}\n\n#define sBodySpriteId data[0]\n\nstatic void SpriteCB_Pikachu(struct Sprite *sprite)\n{\n    sprite->y2 = gSprites[sprite->sBodySpriteId].animCmdIndex;\n}\n\nstatic void CreatePikachuOrPlatformSprites(u8 taskId, u8 spriteType)\n{\n    u8 spriteId;\n    u8 i = 0;\n\n    switch (spriteType)\n    {\n    case SPRITE_TYPE_PIKACHU:\n        LoadCompressedSpriteSheet(&sPikachuIntro_Pikachu_SpriteSheets[PIKACHU_BODY_PLATFORM_LEFT]);\n        LoadCompressedSpriteSheet(&sPikachuIntro_Pikachu_SpriteSheets[PIKACHU_EARS_PLATFORM_MIDDLE]);\n        LoadCompressedSpriteSheet(&sPikachuIntro_Pikachu_SpriteSheets[PIKACHU_EYES_PLATFORM_RIGHT]);\n        LoadSpritePalette(&sPikachuIntro_Pikachu_SpritePalette);\n        spriteId = CreateSprite(&sPikachuIntro_Pikachu_SpriteTemplates[PIKACHU_BODY_PLATFORM_LEFT], 16, 17, 2);\n        gSprites[spriteId].oam.priority = 0;\n        gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_BODY_PLATFORM_LEFT) = spriteId;\n        spriteId = CreateSprite(&sPikachuIntro_Pikachu_SpriteTemplates[PIKACHU_EARS_PLATFORM_MIDDLE], 16, 9, 3);\n        gSprites[spriteId].oam.priority = 0;\n        gSprites[spriteId].sBodySpriteId = gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_BODY_PLATFORM_LEFT);\n        gSprites[spriteId].callback = SpriteCB_Pikachu;\n        gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_EARS_PLATFORM_MIDDLE) = spriteId;\n        spriteId = CreateSprite(&sPikachuIntro_Pikachu_SpriteTemplates[PIKACHU_EYES_PLATFORM_RIGHT], 24, 13, 1);\n        gSprites[spriteId].oam.priority = 0;\n        gSprites[spriteId].sBodySpriteId = gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_BODY_PLATFORM_LEFT);\n        gSprites[spriteId].callback = SpriteCB_Pikachu;\n        gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_EYES_PLATFORM_RIGHT) = spriteId;\n        break;\n    case SPRITE_TYPE_PLATFORM:\n        LoadCompressedSpriteSheet(&sOakSpeech_Platform_SpriteSheet);\n        LoadSpritePalette(&sOakSpeech_Platform_SpritePalette);\n        for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++)\n        {\n            spriteId = CreateSprite(&sOakSpeech_Platform_SpriteTemplates[i], i * 32 + 88, 112, 1);\n            gSprites[spriteId].oam.priority = 2;\n            gSprites[spriteId].animPaused = TRUE;\n            gSprites[spriteId].coordOffsetEnabled = TRUE;\n            gTasks[taskId].tPikachuPlatformSpriteId(i) = spriteId;\n        }\n        break;\n    }\n}\n\nstatic void DestroyPikachuOrPlatformSprites(u8 taskId, u8 spriteType)\n{\n    u32 i;\n    for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++)\n        DestroySprite(&gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)]);\n\n    switch (spriteType)\n    {\n    case SPRITE_TYPE_PIKACHU:\n        FreeSpriteTilesByTag(GFX_TAG_PIKACHU_EYES);\n        FreeSpriteTilesByTag(GFX_TAG_PIKACHU_EARS);\n        FreeSpriteTilesByTag(GFX_TAG_PIKACHU);\n        FreeSpritePaletteByTag(PAL_TAG_PIKACHU);\n        break;\n    case SPRITE_TYPE_PLATFORM:\n        FreeSpriteTilesByTag(GFX_TAG_PLATFORM);\n        FreeSpritePaletteByTag(PAL_TAG_PLATFORM);\n        break;\n    }\n}\n\nstatic void LoadTrainerPic(u16 whichPic, u16 tileOffset)\n{\n    u32 i;\n\n    switch (whichPic)\n    {\n    case MALE_PLAYER_PIC:\n        LoadPalette(sOakSpeech_Red_Pal, BG_PLTT_ID(4), sizeof(sOakSpeech_Red_Pal));\n        LZ77UnCompVram(sOakSpeech_Red_Tiles, (void *)VRAM + 0x600 + tileOffset);\n        break;\n    case FEMALE_PLAYER_PIC:\n        LoadPalette(sOakSpeech_Leaf_Pal, BG_PLTT_ID(4), sizeof(sOakSpeech_Leaf_Pal));\n        LZ77UnCompVram(sOakSpeech_Leaf_Tiles, (void *)VRAM + 0x600 + tileOffset);\n        break;\n    case RIVAL_PIC:\n        LoadPalette(sOakSpeech_Rival_Pal, BG_PLTT_ID(6), sizeof(sOakSpeech_Rival_Pal));\n        LZ77UnCompVram(sOakSpeech_Rival_Tiles, (void *)VRAM + 0x600 + tileOffset);\n        break;\n    case OAK_PIC:\n        LoadPalette(sOakSpeech_Oak_Pal, BG_PLTT_ID(6), sizeof(sOakSpeech_Oak_Pal));\n        LZ77UnCompVram(sOakSpeech_Oak_Tiles, (void *)VRAM + 0x600 + tileOffset);\n        break;\n    default:\n        return;\n    }\n\n    sOakSpeechResources->trainerPicTilemap = AllocZeroed(0x60);\n    for (i = 0; i < 0x60; i++)\n        ((u8 *)sOakSpeechResources->trainerPicTilemap)[i] = i;\n    FillBgTilemapBufferRect(2, 0, 0, 0, 32, 32, 16);\n    CopyRectToBgTilemapBufferRect(2, sOakSpeechResources->trainerPicTilemap, 0, 0, 8, 12, 11, 2, 8, 12, 16, (tileOffset / 64) + 24, 0);\n    CopyBgTilemapBufferToVram(2);\n    Free(sOakSpeechResources->trainerPicTilemap);\n    sOakSpeechResources->trainerPicTilemap = 0;\n}\n\nstatic void ClearTrainerPic(void)\n{\n    FillBgTilemapBufferRect(2, 0, 11, 1, 8, 12, 16);\n    CopyBgTilemapBufferToVram(2);\n}\n\n#define tParentTaskId data[0]\n#define tBlendTarget1 data[1]\n#define tBlendTarget2 data[2]\n#define tUnusedState  data[3]\n#define tFadeTimer    data[4]\n\nstatic void Task_SlowFadeIn(u8 taskId)\n{\n    u8 i = 0;\n    if (gTasks[taskId].tBlendTarget1 == 0)\n    {\n        gTasks[gTasks[taskId].tParentTaskId].tTrainerPicFadeState = 1;\n        DestroyTask(taskId);\n        for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++)\n            gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)].invisible = TRUE;\n    }\n    else\n    {\n        if (gTasks[taskId].tFadeTimer != 0)\n        {\n            gTasks[taskId].tFadeTimer--;\n        }\n        else\n        {\n            gTasks[taskId].tFadeTimer = gTasks[taskId].tTimer;\n            gTasks[taskId].tBlendTarget1--;\n            gTasks[taskId].tBlendTarget2++;\n            if (gTasks[taskId].tBlendTarget1 == 8)\n            {\n                for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++)\n                    gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)].invisible ^= TRUE;\n            }\n            SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].tBlendTarget2 * 256) + gTasks[taskId].tBlendTarget1);\n        }\n    }\n}\n\nstatic void CreateFadeInTask(u8 taskId, u8 delay)\n{\n    u8 taskId2;\n    u8 i = 0;\n\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    gTasks[taskId].tTrainerPicFadeState = 0;\n    taskId2 = CreateTask(Task_SlowFadeIn, 0);\n    gTasks[taskId2].tParentTaskId = taskId;\n    gTasks[taskId2].tBlendTarget1 = 16;\n    gTasks[taskId2].tBlendTarget2 = 0;\n    gTasks[taskId2].tUnusedState = delay; // assigned, but never read\n    gTasks[taskId2].tFadeTimer = delay;\n    for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++)\n        gTasks[taskId2].tPikachuPlatformSpriteId(i) = gTasks[taskId].tPikachuPlatformSpriteId(i);\n}\n\nstatic void Task_SlowFadeOut(u8 taskId)\n{\n    u8 i = 0;\n\n    if (gTasks[taskId].tBlendTarget1 == 16)\n    {\n        if (!gPaletteFade.active)\n        {\n            gTasks[gTasks[taskId].tParentTaskId].tTrainerPicFadeState = 1;\n            DestroyTask(taskId);\n        }\n    }\n    else\n    {\n        if (gTasks[taskId].tFadeTimer != 0)\n        {\n            gTasks[taskId].tFadeTimer--;\n        }\n        else\n        {\n            gTasks[taskId].tFadeTimer = gTasks[taskId].tTimer;\n            gTasks[taskId].tBlendTarget1 += 2;\n            gTasks[taskId].tBlendTarget2 -= 2;\n            if (gTasks[taskId].tBlendTarget1 == 8)\n            {\n                for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++)\n                    gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)].invisible ^= TRUE;\n            }\n            SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].tBlendTarget2 * 256) + gTasks[taskId].tBlendTarget1);\n        }\n    }\n}\n\nstatic void CreateFadeOutTask(u8 taskId, u8 delay)\n{\n    u8 taskId2;\n    u8 i = 0;\n\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    gTasks[taskId].tTrainerPicFadeState = 0;\n\n    taskId2 = CreateTask(Task_SlowFadeOut, 0);\n    gTasks[taskId2].tParentTaskId = taskId;\n    gTasks[taskId2].tBlendTarget1 = 0;\n    gTasks[taskId2].tBlendTarget2 = 16;\n    gTasks[taskId2].tUnusedState = delay; // assigned, but never read\n    gTasks[taskId2].tFadeTimer = delay;\n    for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++)\n        gTasks[taskId2].tPikachuPlatformSpriteId(i) = gTasks[taskId].tPikachuPlatformSpriteId(i);\n}\n\nstatic void PrintNameChoiceOptions(u8 taskId, u8 hasPlayerBeenNamed)\n{\n    s16 *data = gTasks[taskId].data;\n    const u8 *const *textPtrs;\n    u32 i;\n\n    tMenuWindowId = AddWindow(&sIntro_WindowTemplates[WIN_INTRO_NAMES]);\n    PutWindowTilemap(tMenuWindowId);\n    DrawStdFrameWithCustomTileAndPalette(tMenuWindowId, 1, GetStdWindowBaseTileNum(), 14);\n    FillWindowPixelBuffer(gTasks[taskId].tMenuWindowId, PIXEL_FILL(1));\n    AddTextPrinterParameterized(tMenuWindowId, FONT_NORMAL, gOtherText_NewName, 8, 1, 0, NULL);\n    if (hasPlayerBeenNamed == FALSE)\n    {\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n            textPtrs = gSaveBlock2Ptr->playerGender == MALE ? sMaleNameChoices_FR : sFemaleNameChoices_FR;\n        else\n            textPtrs = gSaveBlock2Ptr->playerGender == MALE ? sMaleNameChoices_LG : sFemaleNameChoices_LG;\n    }\n    else\n    {\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n            textPtrs = sRivalNameChoices_FR;\n        else\n            textPtrs = sRivalNameChoices_LG;\n    }\n    for (i = 0; i < ARRAY_COUNT(sRivalNameChoices_FR); i++)\n        AddTextPrinterParameterized(tMenuWindowId, FONT_NORMAL, textPtrs[i], 8, 16 * (i + 1) + 1, 0, NULL);\n    Menu_InitCursor(tMenuWindowId, FONT_NORMAL, 0, 1, 16, 5, 0);\n    CopyWindowToVram(tMenuWindowId, COPYWIN_FULL);\n}\n\nstatic void GetDefaultName(u8 hasPlayerBeenNamed, u8 rivalNameChoice)\n{\n    const u8 *src;\n    u8 *dest;\n    u32 i;\n    if (hasPlayerBeenNamed == FALSE)\n    {\n        if (gSaveBlock2Ptr->playerGender == MALE)\n        {\n            if(gSaveBlock1Ptr->keyFlags.version == 0)\n                src = sMaleNameChoices_FR[Random() % ARRAY_COUNT(sMaleNameChoices_FR)];\n            else\n                src = sMaleNameChoices_LG[Random() % ARRAY_COUNT(sMaleNameChoices_LG)];\n        }\n        else\n        {\n            if(gSaveBlock1Ptr->keyFlags.version == 0)\n                src = sFemaleNameChoices_FR[Random() % ARRAY_COUNT(sFemaleNameChoices_FR)];\n            else\n                src = sFemaleNameChoices_LG[Random() % ARRAY_COUNT(sFemaleNameChoices_LG)];\n        }\n        dest = gSaveBlock2Ptr->playerName;\n    }\n    else\n    {\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n            src = sRivalNameChoices_FR[rivalNameChoice];\n        else\n            src = sRivalNameChoices_LG[rivalNameChoice];\n        dest = gSaveBlock1Ptr->rivalName;\n    }\n    for (i = 0; i < PLAYER_NAME_LENGTH && src[i] != EOS; i++)\n        dest[i] = src[i];\n    for (; i < PLAYER_NAME_LENGTH + 1; i++)\n        dest[i] = EOS;\n}\n\n#undef tSpriteTimer\n#undef tTrainerPicPosX\n#undef tTrainerPicFadeState\n#undef tTimer\n#undef tNidoranFSpriteId\n#undef tTextCursorSpriteId\n#undef tPokeBallSpriteId\n#undef tMenuWindowId\n#undef tTextboxWindowId\n#undef tDelta\n#undef tPlayerPicFadeOutTimer\n#undef tScaleDelta\n#undef tPlayerIsShrunk\n#undef shrinkTimer\n#undef tPlayerPicFadeWhiteTimer\n#undef tUnderflowingTimer\n#undef tSecondaryTimer\n#undef tBlendCoefficient\n#undef tNameNotConfirmed\n#undef sBodySpriteId\n#undef tParentTaskId\n#undef tBlendTarget1\n#undef tBlendTarget2\n#undef tUnusedState\n#undef tFadeTimer\n"
  },
  {
    "path": "src/option_menu.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"scanline_effect.h\"\n#include \"text_window_graphics.h\"\n#include \"menu.h\"\n#include \"task.h\"\n#include \"overworld.h\"\n#include \"help_system.h\"\n#include \"text_window.h\"\n#include \"strings.h\"\n#include \"event_data.h\"\n#include \"field_fadetransition.h\"\n#include \"gba/m4a_internal.h\"\n\n// can't include the one in menu_helpers.h since Task_OptionMenu needs bool32 for matching\nbool32 IsActiveOverworldLinkBusy(void);\n\n// Menu items\nenum\n{\n    MENUITEM_TEXTSPEED = 0,\n    MENUITEM_BATTLESCENE,\n    MENUITEM_BATTLESTYLE,\n    MENUITEM_SOUND,\n    MENUITEM_BUTTONMODE,\n    MENUITEM_FRAMETYPE,\n    MENUITEM_CANCEL,\n    MENUITEM_COUNT\n};\n\nenum\n{\n    MENUITEM_BATTLETRANSITIONS = 0,\n    MENUITEM_BATTLEINTROANIM,\n    MENUITEM_MOVEANIMATIONS,\n    MENUITEM_HPBARANIMSPEED,\n    MENUITEM_EXPBARANIMSPEED,\n    MENUITEM_BACK,\n    MENUITEM_COUNT2\n};\n\n// Window Ids\nenum\n{\n    WIN_TEXT_OPTION,\n    WIN_OPTIONS\n};\n\n// RAM symbols\nstruct OptionMenu\n{\n    /*0x00*/ u16 option[MENUITEM_COUNT];\n    /*0x0E*/ u8 cursorPos;\n             u16 subOption[MENUITEM_COUNT2];\n    /*0x10*/ u8 loadState;\n    /*0x11*/ u8 state;\n    /*0x12*/ u8 loadPaletteState;\n             bool8 inSubMenu;\n};\n\nstatic EWRAM_DATA struct OptionMenu *sOptionMenuPtr = NULL;\n\n//Function Declarataions\nstatic void CB2_InitOptionMenu(void);\nstatic void VBlankCB_OptionMenu(void);\nstatic void OptionMenu_InitCallbacks(void);\nstatic void OptionMenu_SetVBlankCallback(void);\nstatic void CB2_OptionMenu(void);\nstatic void SetOptionMenuTask(void);\nstatic void InitOptionMenuBg(void);\nstatic void OptionMenu_PickSwitchCancel(void);\nstatic void OptionMenu_ResetSpriteData(void);\nstatic bool8 LoadOptionMenuPalette(void);\nstatic void Task_OptionMenu(u8 taskId);\nstatic u8 OptionMenu_ProcessInput(void);\nstatic void BufferOptionMenuString(u8 selection);\nstatic void CloseAndSaveOptionMenu(u8 taskId);\nstatic void PrintOptionMenuHeader(void);\nstatic void DrawOptionMenuBg(void);\nstatic void LoadOptionMenuItemNames(void);\nstatic void UpdateSettingSelectionDisplay(u16 selection);\n\n// Data Definitions\nstatic const struct WindowTemplate sOptionMenuWinTemplates[] =\n{\n    {\n        .bg = 1,\n        .tilemapLeft = 2,\n        .tilemapTop = 3,\n        .width = 26,\n        .height = 2,\n        .paletteNum = 1,\n        .baseBlock = 2\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 7,\n        .width = 26,\n        .height = 12,\n        .paletteNum = 1,\n        .baseBlock = 0x36\n    },\n    {\n        .bg = 2,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 30,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x16e\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct BgTemplate sOptionMenuBgTemplates[] =\n{\n   {\n       .bg = 1,\n       .charBaseIndex = 1,\n       .mapBaseIndex = 30,\n       .screenSize = 0,\n       .paletteMode = 0,\n       .priority = 0,\n       .baseTile = 0\n   },\n   {\n       .bg = 0,\n       .charBaseIndex = 1,\n       .mapBaseIndex = 31,\n       .screenSize = 0,\n       .paletteMode = 0,\n       .priority = 1,\n       .baseTile = 0\n   },\n   {\n       .bg = 2,\n       .charBaseIndex = 1,\n       .mapBaseIndex = 29,\n       .screenSize = 0,\n       .paletteMode = 0,\n       .priority = 2,\n       .baseTile = 0\n   },\n};\n\nstatic const u16 sOptionMenuPalette[] = INCBIN_U16(\"graphics/misc/option_menu.gbapal\");\nstatic const u16 sOptionMenuItemCounts[MENUITEM_COUNT]     = {4, 1, 3, 2, 3, 11, 0};\nstatic const u16 sOptionSubMenuItemCounts[MENUITEM_COUNT2] = {2, 2, 2, 4, 2, 0};\n\nstatic const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] =\n{\n    [MENUITEM_TEXTSPEED]   = gText_TextSpeed,\n    [MENUITEM_BATTLESCENE] = gText_BattleScene,\n    [MENUITEM_BATTLESTYLE] = gText_BattleStyle,\n    [MENUITEM_SOUND]       = gText_Sound,\n    [MENUITEM_BUTTONMODE]  = gText_ButtonMode,\n    [MENUITEM_FRAMETYPE]   = gText_Frame,\n    [MENUITEM_CANCEL]      = gText_OptionMenuSaveAndExit,\n};\n\nstatic const u8 *const sOptionSubmenuItemsNames[MENUITEM_COUNT2] =\n{\n    [MENUITEM_BATTLETRANSITIONS] = gText_BattleTransitions,\n    [MENUITEM_BATTLEINTROANIM] = gText_BattleIntroAnimation,\n    [MENUITEM_MOVEANIMATIONS] = gText_MoveAnims,\n    [MENUITEM_HPBARANIMSPEED] = gText_HpBarAnimSpeed,\n    [MENUITEM_EXPBARANIMSPEED] = gText_ExpBarAnimSpeed,\n    [MENUITEM_BACK] = gText_Back,\n};\n\n\nstatic const u8 *const sTextSpeedOptions[] =\n{\n    gText_TextSpeedSlow, \n    gText_TextSpeedMid, \n    gText_TextSpeedFast,\n    gText_TextSpeedInstant\n};\n\nstatic const u8 *const sBattleSceneOptions[] =\n{\n    gText_BattleScenePressA\n};\n\nstatic const u8 *const sBattleStyleOptions[] =\n{\n    gText_BattleStylePredict,\n    gText_BattleStyleShift,\n    gText_BattleStyleSet\n};\n\nstatic const u8 *const sSoundOptions[] =\n{\n    gText_SoundMono, \n    gText_SoundStereo\n};\n\nstatic const u8 *const sButtonTypeOptions[] =\n{\n    gText_ButtonTypeHelp,\n\tgText_ButtonTypeLR,\n\tgText_ButtonTypeLEqualsA\n};\n\nstatic const u8 *const sBattleTransitionOptions[] = \n{\n    gText_BattleSceneOn, \n    gText_BattleSceneOff\n};\n\nstatic const u8 *const sBattleIntroAnimOptions[] = \n{\n    gText_BattleSceneOn, \n    gText_BattleSceneOff\n};\n\nstatic const u8 *const sMoveAnimOptions[] = \n{\n    gText_BattleSceneOn, \n    gText_BattleSceneOff\n};\n\nstatic const u8 *const sHpBarAnimSpeedOptions[] = \n{\n    gText_IVCalcStandard, \n    gText_TextSpeedFast,\n    gText_TextSpeedFaster,\n    gText_TextSpeedInstant\n};\n\nstatic const u8 *const sExpBarAnimSpeedOptions[] = \n{\n    gText_IVCalcStandard, \n    gText_TextSpeedInstant\n};\n\nstatic const u8 sOptionMenuPickSwitchCancelTextColor[] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY};\nstatic const u8 sOptionMenuTextColor[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_RED};\n\n// Functions\nstatic void CB2_InitOptionMenu(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB_OptionMenu(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid CB2_OptionsMenuFromStartMenu(void)\n{\n    u32 i;\n    \n    if (gMain.savedCallback == NULL)\n        gMain.savedCallback = CB2_ReturnToFieldWithOpenMenu;\n    sOptionMenuPtr = AllocZeroed(sizeof(struct OptionMenu));\n    sOptionMenuPtr->loadState = 0;\n    sOptionMenuPtr->loadPaletteState = 0;\n    sOptionMenuPtr->state = 0;\n    sOptionMenuPtr->cursorPos = 0;\n    sOptionMenuPtr->inSubMenu = 0;\n    sOptionMenuPtr->option[MENUITEM_TEXTSPEED] = gSaveBlock2Ptr->optionsTextSpeed;\n    sOptionMenuPtr->option[MENUITEM_BATTLESCENE] = 0;\n    sOptionMenuPtr->option[MENUITEM_BATTLESTYLE] = gSaveBlock2Ptr->optionsBattleStyle;\n    sOptionMenuPtr->option[MENUITEM_SOUND] = gSaveBlock2Ptr->optionsSound;\n    sOptionMenuPtr->option[MENUITEM_BUTTONMODE] = gSaveBlock2Ptr->optionsButtonMode;\n    sOptionMenuPtr->option[MENUITEM_FRAMETYPE] = gSaveBlock2Ptr->optionsWindowFrameType;\n    sOptionMenuPtr->subOption[MENUITEM_BATTLETRANSITIONS] = gSaveBlock2Ptr->optionsBattleTransitions;\n    sOptionMenuPtr->subOption[MENUITEM_BATTLEINTROANIM] = gSaveBlock2Ptr->optionsBattleIntroAnim;\n    sOptionMenuPtr->subOption[MENUITEM_MOVEANIMATIONS] = gSaveBlock2Ptr->optionsBattleSceneOff;\n    sOptionMenuPtr->subOption[MENUITEM_HPBARANIMSPEED] = gSaveBlock2Ptr->optionsHpBarAnimSpeed;\n    sOptionMenuPtr->subOption[MENUITEM_EXPBARANIMSPEED] = gSaveBlock2Ptr->optionsExpBarAnimSpeed;\n    \n    for (i = 0; i < MENUITEM_COUNT - 1; i++)\n    {\n        if (sOptionMenuPtr->option[i] > (sOptionMenuItemCounts[i]) - 1)\n            sOptionMenuPtr->option[i] = 0;\n    }\n    for (i = 0; i < MENUITEM_COUNT2 - 1; i++)\n    {\n        if (sOptionMenuPtr->subOption[i] > (sOptionSubMenuItemCounts[i]) - 1)\n            sOptionMenuPtr->subOption[i] = 0;\n    }\n    FlagSet(FLAG_SYS_IN_OPTIONS_MENU);\n    SetHelpContext(HELPCONTEXT_OPTIONS);\n    SetMainCallback2(CB2_OptionMenu);\n}\n\nstatic void OptionMenu_InitCallbacks(void)\n{\n    SetVBlankCallback(NULL);\n    SetHBlankCallback(NULL);\n}\n\nstatic void OptionMenu_SetVBlankCallback(void)\n{\n    SetVBlankCallback(VBlankCB_OptionMenu);\n}\n\nstatic void CB2_OptionMenu(void)\n{\n    u8 i, state;\n    state = sOptionMenuPtr->state;\n    switch (state)\n    {\n    case 0:\n        OptionMenu_InitCallbacks();\n        break;\n    case 1:\n        InitOptionMenuBg();\n        break;\n    case 2:\n        OptionMenu_ResetSpriteData();\n        break;\n    case 3:\n        if (LoadOptionMenuPalette() != TRUE)\n            return;\n        break;\n    case 4:\n        PrintOptionMenuHeader();\n        break;\n    case 5:\n        DrawOptionMenuBg();\n        break;\n    case 6:\n        LoadOptionMenuItemNames();\n        break;\n    case 7:\n        if(!sOptionMenuPtr->inSubMenu)\n        {\n            for (i = 0; i < MENUITEM_COUNT; i++)\n                BufferOptionMenuString(i);\n        }\n        else\n        {\n            for (i = 0; i < MENUITEM_COUNT2; i++)\n                BufferOptionMenuString(i);\n        }\n        break;\n    case 8:\n        UpdateSettingSelectionDisplay(sOptionMenuPtr->cursorPos);\n        break;\n    case 9:\n        OptionMenu_PickSwitchCancel();\n        break;\n    default:\n        SetOptionMenuTask();\n\t\tbreak;\n    }\n    sOptionMenuPtr->state++;\n}\n\nstatic void SetOptionMenuTask(void)\n{\n    CreateTask(Task_OptionMenu, 0);\n    SetMainCallback2(CB2_InitOptionMenu);\n}\n\nstatic void InitOptionMenuBg(void)\n{\n    void *dest = (void *)VRAM;\n    DmaClearLarge16(3, dest, VRAM_SIZE, 0x1000);    \n    DmaClear32(3, (void *)OAM, OAM_SIZE);\n    DmaClear16(3, (void *)PLTT, PLTT_SIZE);    \n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0);\n    ResetBgsAndClearDma3BusyFlags(0);\n    InitBgsFromTemplates(0, sOptionMenuBgTemplates, NELEMS(sOptionMenuBgTemplates));\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n    InitWindows(sOptionMenuWinTemplates);\n    DeactivateAllTextPrinters();\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_EFFECT_LIGHTEN);\n    SetGpuReg(REG_OFFSET_BLDY, BLDCNT_TGT1_BG1);\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON);\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n};\n\nstatic void OptionMenu_PickSwitchCancel(void)\n{\n    s32 x;\n    FillWindowPixelBuffer(2, PIXEL_FILL(15)); \n    if(!sOptionMenuPtr->inSubMenu)\n    {\n        if(sOptionMenuPtr->cursorPos == MENUITEM_BATTLESCENE)\n        {\n            x = 0xE4 - GetStringWidth(FONT_SMALL, gText_PickSwitchCancelA, 0);\n            AddTextPrinterParameterized3(2, FONT_SMALL, x, 0, sOptionMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancelA);\n        }\n        else if(sOptionMenuPtr->cursorPos == MENUITEM_CANCEL)\n        {\n            x = 0xE4 - GetStringWidth(FONT_SMALL, gText_PickSwitchExit, 0);\n            AddTextPrinterParameterized3(2, FONT_SMALL, x, 0, sOptionMenuPickSwitchCancelTextColor, 0, gText_PickSwitchExit);\n        }\n        else\n        {\n            x = 0xE4 - GetStringWidth(FONT_SMALL, gText_PickSwitchCancel, 0);\n            AddTextPrinterParameterized3(2, FONT_SMALL, x, 0, sOptionMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancel);\n        }\n    }\n    else\n    {\n        x = 0xE4 - GetStringWidth(FONT_SMALL, gText_PickSwitchBack, 0);\n        AddTextPrinterParameterized3(2, FONT_SMALL, x, 0, sOptionMenuPickSwitchCancelTextColor, 0, gText_PickSwitchBack);\n    }\n    PutWindowTilemap(2);\n    CopyWindowToVram(2, COPYWIN_FULL);\n}\n\nstatic void OptionMenu_ResetSpriteData(void)\n{\n    ResetSpriteData();\n    ResetPaletteFade();\n    FreeAllSpritePalettes();\n    ResetTasks();\n    ScanlineEffect_Stop();\n}\n\nstatic bool8 LoadOptionMenuPalette(void)\n{\n    switch (sOptionMenuPtr->loadPaletteState)\n    {\n    case 0:\n        LoadBgTiles(1, GetUserWindowGraphics(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->tiles, 0x120, 0x1AA);\n        break;\n    case 1:\n        LoadPalette(GetUserWindowGraphics(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->palette, BG_PLTT_ID(2), PLTT_SIZE_4BPP);\n        break;\n    case 2:\n        LoadPalette(sOptionMenuPalette, BG_PLTT_ID(1), sizeof(sOptionMenuPalette));\n        LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n        break;\n    case 3:\n        LoadStdWindowGfxOnBg(1, 0x1B3, BG_PLTT_ID(3));\n        break;\n    default:\n        return TRUE;\n    }\n    sOptionMenuPtr->loadPaletteState++;\n    return FALSE;\n}\n\nstatic void Task_OptionMenu(u8 taskId)\n{\n    switch (sOptionMenuPtr->loadState)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);\n        OptionMenu_SetVBlankCallback();\n        sOptionMenuPtr->loadState++;\n        break;\n    case 1:\n        if (gPaletteFade.active)\n            return;\n        sOptionMenuPtr->loadState++;\n        break;\n    case 2:\n        if (((bool32)IsActiveOverworldLinkBusy()) == TRUE)\n            break;\n        switch (OptionMenu_ProcessInput())\n        {\n        case 0:\n            break;\n        case 1:\n            sOptionMenuPtr->loadState++;\n            break;\n        case 2:\n            LoadBgTiles(1, GetUserWindowGraphics(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->tiles, 0x120, 0x1AA);\n            LoadPalette(GetUserWindowGraphics(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->palette, BG_PLTT_ID(2), PLTT_SIZE_4BPP);\n            BufferOptionMenuString(sOptionMenuPtr->cursorPos);\n            break;\n        case 3:\n            UpdateSettingSelectionDisplay(sOptionMenuPtr->cursorPos);\n            break;\n        case 4:\n            BufferOptionMenuString(sOptionMenuPtr->cursorPos);\n            break;\n        case 6:\n            if(!sOptionMenuPtr->inSubMenu)\n            {\n                sOptionMenuPtr->inSubMenu = TRUE;\n                PrintOptionMenuHeader();\n                sOptionMenuPtr->state = 6;\n                sOptionMenuPtr->loadState = 1;\n                sOptionMenuPtr->cursorPos = 0;\n                SetHelpContext(HELPCONTEXT_OPTIONS_SUBMENU);\n                DestroyTask(taskId);\n                SetMainCallback2(CB2_OptionMenu);\n                break;\n            }\n            else\n            {\n                sOptionMenuPtr->inSubMenu = FALSE;\n                PrintOptionMenuHeader();\n                sOptionMenuPtr->state = 6;\n                sOptionMenuPtr->loadState = 1;\n                sOptionMenuPtr->cursorPos = 1;\n                SetHelpContext(HELPCONTEXT_OPTIONS);\n                DestroyTask(taskId);\n                SetMainCallback2(CB2_OptionMenu);\n                break;\n            }\n        }\n        break;\n    case 3:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n        sOptionMenuPtr->loadState++;\n        break;\n    case 4:\n        if (gPaletteFade.active)\n            return;\n        sOptionMenuPtr->loadState++;\n        break;\n    case 5:\n        CloseAndSaveOptionMenu(taskId);\n        break;\n    }\n}\n\nstatic u8 OptionMenu_ProcessInput(void)\n{ \n    u16 current;\n    u16 *curr;\n    if (JOY_REPT(DPAD_RIGHT))\n    {\n        if(!sOptionMenuPtr->inSubMenu)\n        {        \n            current = sOptionMenuPtr->option[(sOptionMenuPtr->cursorPos)];\n            if (current == (sOptionMenuItemCounts[sOptionMenuPtr->cursorPos] - 1))\n                sOptionMenuPtr->option[sOptionMenuPtr->cursorPos] = 0;\n            else\n                sOptionMenuPtr->option[sOptionMenuPtr->cursorPos] = current + 1;\n            if (sOptionMenuPtr->cursorPos == MENUITEM_FRAMETYPE)\n                return 2;\n            else\n                return 4;\n        }\n        else\n        {\n            current = sOptionMenuPtr->subOption[(sOptionMenuPtr->cursorPos)];\n            if (current == (sOptionSubMenuItemCounts[sOptionMenuPtr->cursorPos] - 1))\n                sOptionMenuPtr->subOption[sOptionMenuPtr->cursorPos] = 0;\n            else\n                sOptionMenuPtr->subOption[sOptionMenuPtr->cursorPos] = current + 1;\n            return 4;\n        }\n    }\n    else if (JOY_REPT(DPAD_LEFT))\n    {\n        if(!sOptionMenuPtr->inSubMenu)\n        {\n            curr = &sOptionMenuPtr->option[sOptionMenuPtr->cursorPos];\n            if (*curr == 0)\n                *curr = sOptionMenuItemCounts[sOptionMenuPtr->cursorPos] - 1;\n            else\n                --*curr;\n            \n            if (sOptionMenuPtr->cursorPos == MENUITEM_FRAMETYPE)\n                return 2;\n            else\n                return 4;\n        }\n        else\n        {\n            curr = &sOptionMenuPtr->subOption[sOptionMenuPtr->cursorPos];\n            if (*curr == 0)\n                *curr = sOptionSubMenuItemCounts[sOptionMenuPtr->cursorPos] - 1;\n            else\n                --*curr;\n            return 4;\n        }\n    }\n    else if (JOY_REPT(DPAD_UP))\n    {\n        if(!sOptionMenuPtr->inSubMenu)\n        {\n            if (sOptionMenuPtr->cursorPos == MENUITEM_TEXTSPEED)\n                sOptionMenuPtr->cursorPos = MENUITEM_CANCEL;\n            else\n                sOptionMenuPtr->cursorPos = sOptionMenuPtr->cursorPos - 1;\n        }\n        else\n        {\n            if (sOptionMenuPtr->cursorPos == MENUITEM_BATTLETRANSITIONS)\n                sOptionMenuPtr->cursorPos = MENUITEM_BACK;\n            else\n                sOptionMenuPtr->cursorPos = sOptionMenuPtr->cursorPos - 1;\n        }\n        OptionMenu_PickSwitchCancel();\n        return 3;        \n    }\n    else if (JOY_REPT(DPAD_DOWN))\n    {\n        if(!sOptionMenuPtr->inSubMenu)\n        {\n            if (sOptionMenuPtr->cursorPos == MENUITEM_CANCEL)\n                sOptionMenuPtr->cursorPos = MENUITEM_TEXTSPEED;\n            else\n                sOptionMenuPtr->cursorPos = sOptionMenuPtr->cursorPos + 1;\n        }\n        else\n        {\n            if (sOptionMenuPtr->cursorPos == MENUITEM_BACK)\n                sOptionMenuPtr->cursorPos = MENUITEM_BATTLETRANSITIONS;\n            else\n                sOptionMenuPtr->cursorPos = sOptionMenuPtr->cursorPos + 1;\n        }\n        OptionMenu_PickSwitchCancel();\n        return 3;\n    }\n    else if (JOY_NEW(A_BUTTON))\n    {\n        if(!sOptionMenuPtr->inSubMenu)\n        {\n            if(sOptionMenuPtr->cursorPos == MENUITEM_BATTLESCENE)\n                return 6;\n            if(sOptionMenuPtr->cursorPos == MENUITEM_CANCEL)\n                return 1;\n        }\n        else\n            return 6;\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        if(sOptionMenuPtr->inSubMenu)\n            return 6;\n        else\n            return 1;\n    }\n    else\n    {\n        return 0;\n    }\n}\n\nstatic void BufferOptionMenuString(u8 selection)\n{\n    u8 str[20];\n    u8 buf[12];\n    u8 dst[3];\n    u8 x, y;\n    \n    memcpy(dst, sOptionMenuTextColor, 3);\n    x = 0x82;\n    y = ((GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) - 1) * selection) + 2;\n    FillWindowPixelRect(1, 1, x, y, 0x46, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT));\n\n    if(!sOptionMenuPtr->inSubMenu)\n    {\n        switch (selection)\n        {\n            case MENUITEM_TEXTSPEED:\n                AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sTextSpeedOptions[sOptionMenuPtr->option[selection]]);\n                break;\n            case MENUITEM_BATTLESCENE:\n                AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sBattleSceneOptions[sOptionMenuPtr->option[selection]]);\n                break;\n            case MENUITEM_BATTLESTYLE:\n                AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sBattleStyleOptions[sOptionMenuPtr->option[selection]]);\n                break;\n            case MENUITEM_SOUND:\n                AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sSoundOptions[sOptionMenuPtr->option[selection]]);\n                break;\n            case MENUITEM_BUTTONMODE:\n                AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sButtonTypeOptions[sOptionMenuPtr->option[selection]]);\n                break;\n            case MENUITEM_FRAMETYPE:\n                StringCopy(str, gText_FrameType);\n                ConvertIntToDecimalStringN(buf, sOptionMenuPtr->option[selection] + 1, 1, 2);\n                StringAppendN(str, buf, 3);\n                AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, str);\n                break;\n            default:\n                break;\n        }\n    }\n    else\n    {\n        switch (selection)\n        {\n            case MENUITEM_BATTLETRANSITIONS:\n                AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sBattleTransitionOptions[sOptionMenuPtr->subOption[selection]]);\n                break;\n            case MENUITEM_BATTLEINTROANIM:\n                AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sBattleIntroAnimOptions[sOptionMenuPtr->subOption[selection]]);\n                break;\n            case MENUITEM_MOVEANIMATIONS:\n                AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sMoveAnimOptions[sOptionMenuPtr->subOption[selection]]);\n                break;\n            case MENUITEM_HPBARANIMSPEED:\n                AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sHpBarAnimSpeedOptions[sOptionMenuPtr->subOption[selection]]);\n                break;\n            case MENUITEM_EXPBARANIMSPEED:\n                AddTextPrinterParameterized3(1, FONT_NORMAL, x, y, dst, -1, sExpBarAnimSpeedOptions[sOptionMenuPtr->subOption[selection]]);\n                break;\n            default:\n                break;\n        }\n    }\n    \n    PutWindowTilemap(1);\n    CopyWindowToVram(1, COPYWIN_FULL);\n}\n\nstatic void CloseAndSaveOptionMenu(u8 taskId)\n{\n    gFieldCallback = FieldCB_DefaultWarpExit;\n    SetMainCallback2(gMain.savedCallback);\n    FreeAllWindowBuffers();\n    gSaveBlock2Ptr->optionsTextSpeed = sOptionMenuPtr->option[MENUITEM_TEXTSPEED];\n    gSaveBlock2Ptr->optionsBattleStyle = sOptionMenuPtr->option[MENUITEM_BATTLESTYLE];\n    gSaveBlock2Ptr->optionsSound = sOptionMenuPtr->option[MENUITEM_SOUND];\n    gSaveBlock2Ptr->optionsButtonMode = sOptionMenuPtr->option[MENUITEM_BUTTONMODE];\n    gSaveBlock2Ptr->optionsWindowFrameType = sOptionMenuPtr->option[MENUITEM_FRAMETYPE];\n\n    gSaveBlock2Ptr->optionsBattleTransitions = sOptionMenuPtr->subOption[MENUITEM_BATTLETRANSITIONS];\n    gSaveBlock2Ptr->optionsBattleIntroAnim = sOptionMenuPtr->subOption[MENUITEM_BATTLEINTROANIM];\n    gSaveBlock2Ptr->optionsBattleSceneOff = sOptionMenuPtr->subOption[MENUITEM_MOVEANIMATIONS];\n    gSaveBlock2Ptr->optionsHpBarAnimSpeed = sOptionMenuPtr->subOption[MENUITEM_HPBARANIMSPEED];\n    gSaveBlock2Ptr->optionsExpBarAnimSpeed = sOptionMenuPtr->subOption[MENUITEM_EXPBARANIMSPEED];\n    SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);\n    FREE_AND_SET_NULL(sOptionMenuPtr);\n    FlagClear(FLAG_SYS_IN_OPTIONS_MENU);\n    DestroyTask(taskId);\n}\n\nstatic void PrintOptionMenuHeader(void)\n{\n    FillWindowPixelBuffer(0, PIXEL_FILL(1));\n    if(!sOptionMenuPtr->inSubMenu)\n        AddTextPrinterParameterized(WIN_TEXT_OPTION, FONT_NORMAL, gText_MenuOption, 8, 1, TEXT_SKIP_DRAW, NULL);\n    else\n        AddTextPrinterParameterized(WIN_TEXT_OPTION, FONT_NORMAL, gText_BattleScene, 8, 1, TEXT_SKIP_DRAW, NULL);\n    PutWindowTilemap(0);\n    CopyWindowToVram(0, COPYWIN_FULL);\n}\n\nstatic void DrawOptionMenuBg(void)\n{\n    u8 h;\n    h = 2;\n    \n    FillBgTilemapBufferRect(1, 0x1B3, 1, 2, 1, 1, 3);\n    FillBgTilemapBufferRect(1, 0x1B4, 2, 2, 0x1B, 1, 3);\n    FillBgTilemapBufferRect(1, 0x1B5, 0x1C, 2, 1, 1, 3);\n    FillBgTilemapBufferRect(1, 0x1B6, 1, 3, 1, h, 3);\n    FillBgTilemapBufferRect(1, 0x1B8, 0x1C, 3, 1, h, 3);\n    FillBgTilemapBufferRect(1, 0x1B9, 1, 5, 1, 1, 3);\n    FillBgTilemapBufferRect(1, 0x1BA, 2, 5, 0x1B, 1, 3);\n    FillBgTilemapBufferRect(1, 0x1BB, 0x1C, 5, 1, 1, 3);\n    FillBgTilemapBufferRect(1, 0x1AA, 1, 6, 1, 1, h);\n    FillBgTilemapBufferRect(1, 0x1AB, 2, 6, 0x1A, 1, h);\n    FillBgTilemapBufferRect(1, 0x1AC, 0x1C, 6, 1, 1, h);\n    FillBgTilemapBufferRect(1, 0x1AD, 1, 7, 1, 0x10, h);\n    FillBgTilemapBufferRect(1, 0x1AF, 0x1C, 7, 1, 0x10, h);\n    FillBgTilemapBufferRect(1, 0x1B0, 1, 0x13, 1, 1, h);\n    FillBgTilemapBufferRect(1, 0x1B1, 2, 0x13, 0x1A, 1, h);\n    FillBgTilemapBufferRect(1, 0x1B2, 0x1C, 0x13, 1, 1, h);\n    CopyBgTilemapBufferToVram(1);\n}\n\nstatic void LoadOptionMenuItemNames(void)\n{\n    u32 i;\n    \n    FillWindowPixelBuffer(1, PIXEL_FILL(1));\n    if(!sOptionMenuPtr->inSubMenu)\n    {\n        for (i = 0; i < MENUITEM_COUNT; i++)\n        {\n            AddTextPrinterParameterized(WIN_OPTIONS, FONT_NORMAL, sOptionMenuItemsNames[i], 8, (u8)((i * (GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT))) + 2) - i, TEXT_SKIP_DRAW, NULL);    \n        }\n    }\n    else\n    {\n        for (i = 0; i < MENUITEM_COUNT2; i++)\n        {\n            AddTextPrinterParameterized(WIN_OPTIONS, FONT_NORMAL, sOptionMenuItemsNames[i + MENUITEM_COUNT], 8, (u8)((i * (GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT))) + 2) - i, TEXT_SKIP_DRAW, NULL);    \n        }\n    }\n}\n\nstatic void UpdateSettingSelectionDisplay(u16 selection)\n{\n    u16 maxLetterHeight, y;\n    \n    maxLetterHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT);\n    y = selection * (maxLetterHeight - 1) + 0x3A;\n    SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(y, y + maxLetterHeight));\n    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0x10, 0xE0));\n}\n"
  },
  {
    "path": "src/orre_met_location_handler.c",
    "content": "#include \"global.h\"\n#include \"pokemon.h\"\n#include \"strings.h\"\n#include \"string_util.h\"\n#include \"constants/species.h\"\n#include \"orre_met_location_strings.h\"\n\nu8* DetermineOrreMetLocation(struct Pokemon *);\nu8* GetOrreMetLocationString(struct Pokemon *);\nu8* ResolveOrreMetLocationCollision(struct Pokemon *);\n\nu8 *WriteOrreMapName(u8 *dst0, u8 *string, u16 fill)\n{\n    u8 *dst;\n    dst = StringCopy(dst0, string);\n    return dst;\n}\n\nu8* DetermineOrreMetLocation(struct Pokemon *mon)\n{\n\tu8 *stringToUse;\n\tu8 locationMet = GetMonData(mon, MON_DATA_MET_LOCATION);\n\tif(locationMet == 76 || locationMet == 109 || locationMet == 110 || locationMet == 111 || locationMet == 67 || locationMet == 69 || locationMet == 0 || locationMet == 254)\n\t{\n\t\tstringToUse = ResolveOrreMetLocationCollision(mon);\n\t}\n\telse\n\t{\n\t\tstringToUse = GetOrreMetLocationString(mon);\n\t}\n\treturn (u8 *)stringToUse;\n}\n\nu8* GetOrreMetLocationString(struct Pokemon *mon)\n{\n\tu8 locationMet = GetMonData(mon, MON_DATA_MET_LOCATION);\n\tconst u8 *locationString;\n\tswitch (locationMet)\n\t{\n\t\t\t//valid Colosseum locations\n\t\t\tcase 39: //only valid Agate Village location\n\t\t\t\tlocationString = gAgate_Village;\n\t\t\t\tbreak;\n\t\t\tcase 125: //only valid Deep Colosseum location\n\t\t\t\tlocationString = gDeep_Colosseum;\n\t\t\t\tbreak;\n\t\t\tcase 68: //only valid Laboratory location\n\t\t\t\tlocationString = gLaboratory;\n\t\t\t\tbreak;\n\t\t\tcase 5: //only valid Mayor's House location\n\t\t\t\tlocationString = gMayors_House;\n\t\t\t\tbreak;\n\t\t\tcase 30: //only valid Miror's Hideout location, Remoraid and Mantine 2nd chance here or Pyrite Cave?\n\t\t\t\tlocationString = gMirors_Hideout;\n\t\t\t\tbreak;\n\t\t\tcase 1: //only valid Outskirt Stand location\n\t\t\t\tlocationString = gOutskirt_Stand;\n\t\t\t\tbreak;\n\t\t\tcase 3: //only normally valid Phenac City location\n\t\t\tcase 128: //eReader Pokemon are from here in Phenac City\n\t\t\t\tlocationString = gPhenac_City;\n\t\t\t\tbreak;\n\t\t\tcase 25:\n\t\t\tcase 28: //only valid Pyrite Building locations\n\t\t\t\tlocationString = gPyrite_Bldg;\n\t\t\t\tbreak;\n\t\t\tcase 29:\n\t\t\tcase 31:\n\t\t\tcase 32: //only valid Pyrite Cave locations\n\t\t\t\tlocationString = gPyrite_Cave;\n\t\t\t\tbreak;\n\t\t\tcase 15: //only valid Pyrite Town location\n\t\t\t\tlocationString = gPyrite_Town;\n\t\t\t\tbreak;\n\t\t\tcase 115:\n\t\t\tcase 117: //valid Realgam Tower locations; see below comment\n\t\t\t\tlocationString = gRealgam_Tower;\n\t\t\t\tbreak;\n\t\t\tcase 104:\n\t\t\tcase 106: //Do these three display as Realgam Tower instead in game?\n\t\t\tcase 113: //only valid RealgamTwr Dome locations\n\t\t\t\tlocationString = gRealgamTwr_Dome;\n\t\t\t\tbreak;\n\t\t\tcase 132:\n\t\t\tcase 133:\n\t\t\tcase 134: //only valid Snagem Hideout locations\n\t\t\t\tlocationString = gSnagem_Hideout;\n\t\t\t\tbreak;\n\t\t\tcase 47:\n\t\t\tcase 55: //only valid The Under locations\n\t\t\t\tlocationString = gThe_Under;\n\t\t\t\tbreak;\n\t\t\tcase 58: //only valid The Under Subway location\n\t\t\t\tlocationString = gThe_Under_Subway;\n\t\t\t\tbreak;\n\t\t\tcase 118: //only valid Tower Colosseum location\n\t\t\t\tlocationString = gTower_Colosseum;\n\t\t\t\tbreak;\n\t\t\t//valid XD locations\n\t\t\tcase 92: //only valid Cave Poke Spot location\n\t\t\t\tlocationString = gCave;\n\t\t\t\tbreak;\n\t\t\tcase 64:\n\t\t\tcase 65:\n\t\t\tcase 66:\n\t\t\tcase 70:\n\t\t\tcase 71: //only valid Cipher Key Lair locations\n\t\t\t\tlocationString = gCipher_Key_Lair;\n\t\t\t\tbreak;\n\t\t\tcase 8:\n\t\t\tcase 9:\n\t\t\tcase 10:\n\t\t\tcase 11: //only valid Cipher Lab locations\n\t\t\t\tlocationString = gCipher_Lab;\n\t\t\t\tbreak;\n\t\t\tcase 73:\n\t\t\tcase 74:\n\t\t\tcase 75:\n\t\t\tcase 77:\n\t\t\tcase 80:\n\t\t\tcase 81:\n\t\t\tcase 84:\n\t\t\tcase 85:\n\t\t\tcase 87:\n\t\t\tcase 88: //only valid Citadark Isle locations\n\t\t\t\tlocationString = gCitadark_Isle;\n\t\t\t\tbreak;\n\t\t\tcase 153:\n\t\t\tcase 162: //only valid Gateon Port locations\n\t\t\t\tlocationString = gGateon_Port;\n\t\t\t\tbreak;\n\t\t\tcase 16: //only valid Mt. Battle location; gift Johto Starters\n\t\t\t\tlocationString = gMt_Battle;\n\t\t\t\tbreak;\n\t\t\tcase 91: //only valid Oasis Poke Spot location\n\t\t\t\tlocationString = gOasis;\n\t\t\t\tbreak;\n\t\t\tcase 164: //only valid Outskirt Stand location\n\t\t\t\tlocationString = gOutskirt_Stand;\n\t\t\t\tbreak;\n\t\t\tcase 94:\n\t\t\tcase 96:\n\t\t\tcase 97:\n\t\t\tcase 100:\n\t\t\tcase 107: //only valid Phenac City locations\n\t\t\t\tlocationString = gPhenac_City;\n\t\t\t\tbreak;\n\t\t\tcase 143: //only valid Pokemon HQ Lab location\n\t\t\t\tlocationString = gPokemon_HQ_Lab;\n\t\t\t\tbreak;\n\t\t\tcase 116:\n\t\t\tcase 119: //only valid Pyrite Town locations\n\t\t\t\tlocationString = gPyrite_Town;\n\t\t\t\tbreak;\n\t\t\tcase 59: //only valid Realgam Tower location\n\t\t\t\tlocationString = gRealgam_Tower;\n\t\t\t\tbreak;\n\t\t\tcase 90: //only valid Rock Poke Spot location\n\t\t\t\tlocationString = gRock;\n\t\t\t\tbreak;\n\t\t\tdefault: //if any other location index is present, use generic distant land text.\n\t\t\t\tlocationString = gOtherText_MetDistantLand;\n\t\t\t\tbreak;\n\t}\n\treturn (u8 *)locationString;\n}\n\nu8* ResolveOrreMetLocationCollision(struct Pokemon *mon)\n{\n\tu16 species;\n\tu8 locationMet;\n\tu8 language;\n\tconst u8 *locationString;\n    u8 obedient = GetMonData(mon, MON_DATA_MODERN_FATEFUL_ENCOUNTER); //all XD Pokemon have this bit set\n\tlocationMet = GetMonData(mon, MON_DATA_MET_LOCATION);\n\tspecies = GetMonData(mon, MON_DATA_SPECIES);\n\tlanguage = GetMonData(mon, MON_DATA_LANGUAGE);\n\tswitch (locationMet)\n\t{\n\t\tcase 67:\n\t\tcase 69: //Colosseum: Laboratory; XD: Cipher Key Lair\n\t\t\t//if(species == SPECIES_PRIMEAPE || species == SPECIES_HYPNO || species == SPECIES_TANGELA || species == SPECIES_BUTTERFREE || species == SPECIES_MAGNETON)\n            if(obedient)\n\t\t\t\tlocationString = gCipher_Key_Lair;\n\t\t\telse\n\t\t\t\tlocationString = gLaboratory;\n\t\t\tbreak;\n\t\tcase 76: //Colosseum: Mt. Battle; XD: Citadark Isle\n\t\t\t//if(species == SPECIES_ENTEI)\n            if(!obedient)\n\t\t\t\tlocationString = gMt_Battle;\n\t\t\telse\n\t\t\t\tlocationString = gCitadark_Isle;\n\t\t\tbreak;\n\t\tcase 109:\n\t\tcase 110:\n\t\tcase 111: //Colosseum: RealgamTwr Dome; XD: Pyrite Town\n\t\t\t//if(species == SPECIES_SUNFLORA || species == SPECIES_DELIBIRD || species == SPECIES_SUICUNE || species == SPECIES_HERACROSS)\n            if(!obedient)\n\t\t\t\tlocationString = gRealgamTwr_Dome;\n\t\t\telse\n\t\t\t\tlocationString = gPyrite_Town;\n\t\t\tbreak;\n\t\tcase 0: //XD Starter Eevee\n\t\t\tif((species >= SPECIES_EEVEE && species <= SPECIES_FLAREON) || species == SPECIES_ESPEON || species == SPECIES_UMBREON)\n\t\t\t{\n\t\t\t\tif(language == LANGUAGE_JAPANESE)\n\t\t\t\t\tlocationString = gXD_Eevee_Met_Location_JP;\n\t\t\t\telse\n\t\t\t\t\tlocationString = gXD_Eevee_Met_Location;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 254: //Colosseum Starter Espeon and Umbreon and Duking's Plusle\n\t\t\tif(species == SPECIES_ESPEON || species == SPECIES_UMBREON)\n\t\t\t{\n\t\t\t\tif(language == LANGUAGE_JAPANESE)\n\t\t\t\t\tlocationString = gColosseum_Starter_Met_Location_JP;\n\t\t\t\telse\n\t\t\t\t\tlocationString = gColosseum_Starter_Met_Location;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(language == LANGUAGE_JAPANESE)\n\t\t\t\t\tlocationString = gDukings_Plusle_JP;\n\t\t\t\telse\n\t\t\t\t\tlocationString = gDukings_Plusle;\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault: //error handler; default to generic distant land text\n\t\t\tlocationString = gOtherText_MetDistantLand;\n\t\t\tbreak;\n\t}\n\treturn (u8 *)locationString;\n}"
  },
  {
    "path": "src/orre_met_location_strings.c",
    "content": "#include \"global.h\"\n#include \"strings.h\"\n#include \"orre_met_location_strings.h\"\n\nconst u8 gAgate_Village[] = _(\"AGATE VILLAGE$\");\nconst u8 gDeep_Colosseum[] = _(\"DEEP COLOSSEUM$\");\nconst u8 gLaboratory[] = _(\"LABORATORY$\");\nconst u8 gMayors_House[] = _(\"MAYOR'S HOUSE$\");\nconst u8 gMirors_Hideout[] = _(\"MIROR'S HIDEOUT$\");\nconst u8 gOutskirt_Stand[] = _(\"OUTSKIRT STAND$\");\nconst u8 gPhenac_City[] = _(\"PHENAC CITY$\");\nconst u8 gPyrite_Bldg[] = _(\"PYRITE BLDG$\");\nconst u8 gPyrite_Cave[] = _(\"PYRITE CAVE$\");\nconst u8 gPyrite_Town[] = _(\"PYRITE TOWN$\");\nconst u8 gRealgam_Tower[] = _(\"REALGAM TOWER$\");\nconst u8 gRealgamTwr_Dome[] = _(\"REALGAMTWR DOME$\");\nconst u8 gSnagem_Hideout[] = _(\"SNAGEM HIDEOUT$\");\nconst u8 gThe_Under[] = _(\"THE UNDER$\");\nconst u8 gThe_Under_Subway[] = _(\"THE UNDER SUBWAY$\");\nconst u8 gTower_Colosseum[] = _(\"TOWER COLOSSEUM$\");\nconst u8 gCave[] = _(\"CAVE$\");\nconst u8 gCipher_Key_Lair[] = _(\"CIPHER KEY LAIR$\");\nconst u8 gCipher_Lab[] = _(\"CIPHER LAB$\");\nconst u8 gCitadark_Isle[] = _(\"CITADARK ISLE$\");\nconst u8 gGateon_Port[] = _(\"GATEON PORT$\");\nconst u8 gMt_Battle[] = _(\"MT. BATTLE$\");\nconst u8 gOasis[] = _(\"OASIS$\");\nconst u8 gPokemon_HQ_Lab[] = _(\"POKéMON HQ LAB$\");\nconst u8 gRock[] = _(\"ROCK$\");\nconst u8 gXD_Eevee_Met_Location[] = _(\"obtained from {DYNAMIC 0x03}'s dad.\\n\\n\\n$\");\nconst u8 gColosseum_Starter_Met_Location[] = _(\"was {DYNAMIC 0x03}'s old friend.\\n\\n\\n$\");\nconst u8 gDukings_Plusle[] = _(\"received from {DYNAMIC 0x03}\\n$\");\nconst u8 gXD_Eevee_Met_Location_JP[] = _(\"obtained from {JPN}{DYNAMIC 0x03}{ENG}'s\\ndad.\\n\\n\\n$\");\nconst u8 gColosseum_Starter_Met_Location_JP[] = _(\"was {JPN}{DYNAMIC 0x03}{ENG}'s old friend.\\n\\n\\n$\");\nconst u8 gDukings_Plusle_JP[] = _(\"received from {JPN}{DYNAMIC 0x03}{ENG}\\n$\");\nconst u8 gOtherText_MetDistantLand[] = _(\"a distant land.$\");\n\n// Pokemon Box Egg string\nconst u8 gText_PeculiarEggPokemonBox[] = _(\"A wondrously peculiar POKéMON EGG\\nobtained from BRIGETTE at a nice place.\");\nconst u8 gText_Azusa[] = _(\"AZUSA\");\n\n"
  },
  {
    "path": "src/overworld.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"bg_regs.h\"\n#include \"cable_club.h\"\n#include \"credits.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"event_scripts.h\"\n#include \"field_camera.h\"\n#include \"field_control_avatar.h\"\n#include \"field_effect.h\"\n#include \"field_fadetransition.h\"\n#include \"field_message_box.h\"\n#include \"field_player_avatar.h\"\n#include \"field_screen_effect.h\"\n#include \"field_specials.h\"\n#include \"field_tasks.h\"\n#include \"field_weather.h\"\n#include \"fieldmap.h\"\n#include \"fldeff.h\"\n#include \"heal_location.h\"\n#include \"help_system.h\"\n#include \"item.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"load_save.h\"\n#include \"m4a.h\"\n#include \"map_name_popup.h\"\n#include \"map_preview_screen.h\"\n#include \"metatile_behavior.h\"\n#include \"money.h\"\n#include \"new_game.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"play_time.h\"\n#include \"pokedex.h\"\n#include \"pokemon_storage_system.h\"\n#include \"quest_log.h\"\n#include \"quest_log_objects.h\"\n#include \"random.h\"\n#include \"renewable_hidden_items.h\"\n#include \"roamer.h\"\n#include \"safari_zone.h\"\n#include \"save_location.h\"\n#include \"scanline_effect.h\"\n#include \"script.h\"\n#include \"script_pokemon_util.h\"\n#include \"start_menu.h\"\n#include \"tileset_anims.h\"\n#include \"trainer_pokemon_sprites.h\"\n#include \"vs_seeker.h\"\n#include \"wild_encounter.h\"\n#include \"constants/abilities.h\"\n#include \"constants/cable_club.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/maps.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/songs.h\"\n#include \"constants/items.h\"\n#include \"constants/sound.h\"\n\n#define PLAYER_LINK_STATE_IDLE 0x80\n#define PLAYER_LINK_STATE_BUSY 0x81\n#define PLAYER_LINK_STATE_READY 0x82\n#define PLAYER_LINK_STATE_EXITING_ROOM 0x83\n\n#define FACING_NONE 0\n#define FACING_UP 1\n#define FACING_DOWN 2\n#define FACING_LEFT 3\n#define FACING_RIGHT 4\n#define FACING_FORCED_UP 7\n#define FACING_FORCED_DOWN 8\n#define FACING_FORCED_LEFT 9\n#define FACING_FORCED_RIGHT 10\n\ntypedef u16 (*KeyInterCB)(u32 key);\n\nstruct InitialPlayerAvatarState\n{\n    u8 transitionFlags;\n    u8 direction;\n    bool8 hasDirectionSet;\n};\n\nstruct CableClubPlayer\n{\n    u8 playerId;\n    bool8 isLocalPlayer;\n    u8 movementMode;\n    u8 facing;\n    struct MapPosition pos;\n    u16 metatileBehavior;\n};\n\nEWRAM_DATA struct WarpData gLastUsedWarp = {};\nstatic EWRAM_DATA struct WarpData sWarpDestination = {};\nstatic EWRAM_DATA struct WarpData sFixedDiveWarp = {};\nstatic EWRAM_DATA struct WarpData sFixedHoleWarp = {};\n\nstatic EWRAM_DATA struct InitialPlayerAvatarState sInitialPlayerAvatarState = {};\n\nEWRAM_DATA bool8 gDisableMapMusicChangeOnMapLoad = MUSIC_DISABLE_OFF;\nstatic EWRAM_DATA u16 sAmbientCrySpecies = SPECIES_NONE;\nstatic EWRAM_DATA bool8 sIsAmbientCryWaterMon = FALSE;\n\nALIGNED(4) EWRAM_DATA bool8 gExitStairsMovementDisabled = FALSE;\nstatic EWRAM_DATA const struct CreditsOverworldCmd *sCreditsOverworld_Script = NULL;\nstatic EWRAM_DATA s16 sCreditsOverworld_CmdLength = 0;\nstatic EWRAM_DATA s16 sCreditsOverworld_CmdIndex = 0;\n\nEWRAM_DATA struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4] = {};\n\nu16 *gBGTilemapBuffers1;\nu16 *gBGTilemapBuffers2;\nu16 *gBGTilemapBuffers3;\nvoid (*gFieldCallback)(void);\nbool8 (*gFieldCallback2)(void);\nu16 gHeldKeyCodeToSend;\nu8 gLocalLinkPlayerId;\nu8 gFieldLinkPlayerCount;\n\nstatic u8 sPlayerLinkStates[MAX_LINK_PLAYERS];\nstatic KeyInterCB sPlayerKeyInterceptCallback;\nstatic bool8 sReceivingFromLink;\nstatic u8 sRfuKeepAliveTimer;\n\nstatic u8 CountBadgesForOverworldWhiteOutLossCalculation(void);\nstatic void Overworld_ResetStateAfterWhitingOut(void);\nstatic void Overworld_SetWhiteoutRespawnPoint(void);\nstatic u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *playerStruct, u16 metatileBehavior, u8 mapType);\nstatic u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStruct, u8 transitionFlags, u16 metatileBehavior, u8 mapType);\nstatic u16 GetCenterScreenMetatileBehavior(void);\nstatic void SetDefaultFlashLevel(void);\nstatic void Overworld_TryMapConnectionMusicTransition(void);\nstatic void ChooseAmbientCrySpecies(void);\n\nstatic void CB2_Overworld(void);\nstatic void CB2_LoadMap2(void);\nstatic void CB2_LoadMapOnReturnToFieldCableClub(void);\nstatic void CB2_ReturnToFieldLocal(void);\nstatic void CB2_ReturnToFieldLink(void);\nstatic void FieldClearVBlankHBlankCallbacks(void);\nstatic void SetFieldVBlankCallback(void);\nstatic void VBlankCB_Field(void);\n\nstatic bool32 LoadMapInStepsLink(u8 *state);\nstatic bool32 ReturnToFieldLocal(u8 *state);\nstatic bool32 ReturnToFieldLink(u8 *state);\nstatic void MoveSaveBlocks_ResetHeap_(void);\nstatic void ResetScreenForMapLoad(void);\nstatic void InitViewGraphics(void);\nstatic void InitOverworldGraphicsRegisters(void);\nstatic void ResumeMap(bool32 inLink);\nstatic void InitObjectEventsLink(void);\nstatic void InitObjectEventsLocal(void);\nstatic void ReloadObjectsAndRunReturnToFieldMapScript(void);\nstatic void SetCameraToTrackPlayer(void);\nstatic void SetCameraToTrackGuestPlayer(void);\nstatic void SetCameraToTrackGuestPlayer_2(void);\nstatic void OffsetCameraFocusByLinkPlayerId(void);\nstatic void SpawnLinkPlayers(void);\nstatic void CreateLinkPlayerSprites(void);\nstatic void CB2_LoadMapForQLPlayback(void);\nstatic void DoLoadMap_QLPlayback(u8 *state);\nstatic bool32 LoadMap_QLPlayback(u8 *state);\nstatic bool32 SetUpScrollSceneForCredits(u8 *state, u8 unused);\nstatic bool8 MapLdr_Credits(void);\nstatic void CameraCB_CreditsPan(struct CameraObject * camera);\nstatic void Task_OvwldCredits_FadeOut(u8 taskId);\nstatic void Task_OvwldCredits_WaitFade(u8 taskId);\n\nstatic void CB1_UpdateLinkState(void);\nstatic void ResetAllMultiplayerState(void);\nstatic void ClearAllPlayerKeys(void);\nstatic void SetKeyInterceptCallback(KeyInterCB callback);\nstatic void ResetAllLinkStates(void);\nstatic void UpdateAllLinkPlayers(u16 *linkKeys, s32 selfId);\nstatic void UpdateHeldKeyCode(u16 interceptedKeys);\nstatic u32 GetLinkSendQueueLength(void);\nstatic u16 GetDirectionForDpadKey(u16 key);\nstatic void SetPlayerFacingDirection(u8 linkPlayerId, u8 setFacing);\nstatic void ResetPlayerHeldKeys(u16 *linkKeys);\nstatic u16 KeyInterCB_SelfIdle(u32 linkPlayerId);\nstatic u16 KeyInterCB_DeferToEventScript(u32 linkPlayerId);\nstatic u16 KeyInterCB_DeferToRecvQueue(u32 linkPlayerId);\nstatic u16 KeyInterCB_DeferToSendQueue(u32 linkPlayerId);\nstatic void LoadCableClubPlayer(s32 i, s32 selfId, struct CableClubPlayer *player);\nstatic bool32 PlayerIsAtSouthExit(struct CableClubPlayer *player);\nstatic const u8 *TryGetTileEventScript(struct CableClubPlayer *player);\nstatic const u8 *TryInteractWithPlayer(struct CableClubPlayer *player);\nstatic bool32 IsCableClubPlayerUnfrozen(struct CableClubPlayer *player);\nstatic bool32 CanCableClubPlayerPressStart(struct CableClubPlayer *player);\nstatic u16 GetDirectionForEventScript(const u8 *script);\nstatic void InitLinkPlayerQueueScript(void);\nstatic void CreateConfirmLeaveTradeRoomPrompt(void);\nstatic void InitLinkRoomStartMenuScript(void);\nstatic void InitMenuBasedScript(const u8 *script);\nstatic void RunInteractLocalPlayerScript(const u8 *script);\nstatic void RunTerminateLinkScript(void);\nstatic void SpawnLinkPlayerObjectEvent(u8 i, s16 x, s16 y, u8 gender);\nstatic void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s16 y);\nstatic u8 GetSpriteForLinkedPlayer(u8 linkPlayerId);\nstatic void GetLinkPlayerCoords(u8 linkPlayerId, u16 *x, u16 *y);\nstatic u8 GetLinkPlayerFacingDirection(u8 linkPlayerId);\nstatic u8 GetLinkPlayerElevation(u8 linkPlayerId);\nstatic u8 GetLinkPlayerIdAt(s16 x, s16 y);\nstatic void CreateLinkPlayerSprite(u8 i, u8 version);\nstatic u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8);\nstatic u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8);\nstatic u8 MovementEventModeCB_Normal_2(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8);\nstatic u8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8);\nstatic u8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8);\nstatic u8 FacingHandler_ForcedFacingChange(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8);\nstatic void MovementStatusHandler_EnterFreeMode(struct LinkPlayerObjectEvent *, struct ObjectEvent *);\nstatic void MovementStatusHandler_TryAdvanceScript(struct LinkPlayerObjectEvent *, struct ObjectEvent *);\nstatic u8 FlipVerticalAndClearForced(u8 newFacing, u8 oldFacing);\nstatic u8 LinkPlayerDetectCollision(u8 selfObjEventId, u8 a2, s16 x, s16 y);\nstatic void SpriteCB_LinkPlayer(struct Sprite *sprite);\n\nextern const struct MapLayout * gMapLayouts[];\nextern const struct MapHeader *const *gMapGroups[];\n\n// Routines related to game state on warping in\n\nstatic const u8 sWhiteOutMoneyLossMultipliers[] = {\n     2,\n     4,\n     6,\n     9,\n    12,\n    16,\n    20,\n    25,\n    30\n};\n\nstatic const u16 sWhiteOutMoneyLossBadgeFlagIDs[] = {\n    FLAG_BADGE01_GET,\n    FLAG_BADGE02_GET,\n    FLAG_BADGE03_GET,\n    FLAG_BADGE04_GET,\n    FLAG_BADGE05_GET,\n    FLAG_BADGE06_GET,\n    FLAG_BADGE07_GET,\n    FLAG_BADGE08_GET\n};\n\nbool8 CheckNationalDexEligibilityOnSaveLoad(void)\n{\n    u16 mapGroup = gSaveBlock1Ptr->location.mapGroup;\n    s8 mapNum = gSaveBlock1Ptr->location.mapNum;\n    if((mapGroup == MAP_GROUP(VIRIDIAN_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(VIRIDIAN_CITY_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(PEWTER_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(PEWTER_CITY_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(CERULEAN_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(CERULEAN_CITY_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(LAVENDER_TOWN_POKEMON_CENTER_1F) && mapNum == MAP_NUM(LAVENDER_TOWN_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(VERMILION_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(VERMILION_CITY_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(CELADON_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(CELADON_CITY_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(FUCHSIA_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(FUCHSIA_CITY_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(CINNABAR_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(CINNABAR_ISLAND_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(INDIGO_PLATEAU_POKEMON_CENTER_1F) && mapNum == MAP_NUM(INDIGO_PLATEAU_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(SAFFRON_CITY_POKEMON_CENTER_1F) && mapNum == MAP_NUM(SAFFRON_CITY_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(ROUTE4_POKEMON_CENTER_1F) && mapNum == MAP_NUM(ROUTE4_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(ROUTE10_POKEMON_CENTER_1F) && mapNum == MAP_NUM(ROUTE10_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(ONE_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(ONE_ISLAND_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(TWO_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(TWO_ISLAND_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(THREE_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(THREE_ISLAND_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(FOUR_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(FOUR_ISLAND_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(FIVE_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(FIVE_ISLAND_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(SEVEN_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(SEVEN_ISLAND_POKEMON_CENTER_1F)) ||\n       (mapGroup == MAP_GROUP(SIX_ISLAND_POKEMON_CENTER_1F) && mapNum == MAP_NUM(SIX_ISLAND_POKEMON_CENTER_1F)))\n    {\n        if(!IsNationalPokedexEnabled() && HasNationalMon())\n        {\n            VarSet(VAR_TEMP_0, 0);\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nbool8 DoCoordsMatchPMCExitMat(void)\n{\n    s16 x;\n    s16 y;\n    switch(gMapHeader.regionMapSectionId)\n    {\n        case MAPSEC_INDIGO_PLATEAU:\n            x = 11;\n            y = 16;\n            break;\n        case MAPSEC_ONE_ISLAND:\n            x = 9;\n            y = 9;\n            break;\n        default:\n            x = 7;\n            y = 8;\n            break;\n    }\n    if(gSaveBlock1Ptr->pos.x == x && gSaveBlock1Ptr->pos.y == y)\n    {\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void DoWhiteOut(void)\n{\n    RunScriptImmediately(EventScript_ResetEliteFourEnd);\n    RemoveMoney(&gSaveBlock1Ptr->money, ComputeWhiteOutMoneyLoss());\n    HealPlayerParty();\n    Overworld_ResetStateAfterWhitingOut();\n    Overworld_SetWhiteoutRespawnPoint();\n    WarpIntoMap();\n}\n\nu32 ComputeWhiteOutMoneyLoss(void)\n{\n    u8 nbadges = CountBadgesForOverworldWhiteOutLossCalculation();\n    u8 toplevel = GetPlayerPartyHighestLevel();\n    u32 losings = toplevel * 4 * sWhiteOutMoneyLossMultipliers[nbadges];\n    u32 money = GetMoney(&gSaveBlock1Ptr->money);\n    if (losings > money)\n        losings = money;\n    return losings;\n}\n\nvoid OverworldWhiteOutGetMoneyLoss(void)\n{\n    u32 losings = ComputeWhiteOutMoneyLoss();\n    ConvertIntToDecimalStringN(gStringVar1, losings, STR_CONV_MODE_LEFT_ALIGN, CountDigits(losings));\n}\n\nstatic u8 CountBadgesForOverworldWhiteOutLossCalculation(void)\n{\n    int i;\n    u8 nbadges = 0;\n    for (i = 0; i < NELEMS(sWhiteOutMoneyLossBadgeFlagIDs); i++)\n    {\n        if (FlagGet(sWhiteOutMoneyLossBadgeFlagIDs[i]))\n            nbadges++;\n    }\n    return nbadges;\n}\n\nvoid Overworld_ResetStateAfterFly(void)\n{\n    ResetInitialPlayerAvatarState();\n    FlagClear(FLAG_SYS_ON_CYCLING_ROAD);\n    VarSet(VAR_MAP_SCENE_ROUTE16, 0);\n    FlagClear(FLAG_SYS_CRUISE_MODE);\n    FlagClear(FLAG_SYS_SAFARI_MODE);\n    VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0);\n    FlagClear(FLAG_SYS_USE_STRENGTH);\n    FlagClear(FLAG_SYS_FLASH_ACTIVE);\n    FlagClear(FLAG_SYS_QL_DEPARTED);\n    VarSet(VAR_QL_ENTRANCE, 0);\n}\n\nvoid Overworld_ResetStateAfterTeleport(void)\n{\n    ResetInitialPlayerAvatarState();\n    FlagClear(FLAG_SYS_ON_CYCLING_ROAD);\n    VarSet(VAR_MAP_SCENE_ROUTE16, 0);\n    FlagClear(FLAG_SYS_CRUISE_MODE);\n    FlagClear(FLAG_SYS_SAFARI_MODE);\n    VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0);\n    FlagClear(FLAG_SYS_USE_STRENGTH);\n    FlagClear(FLAG_SYS_FLASH_ACTIVE);\n    FlagClear(FLAG_SYS_QL_DEPARTED);\n    VarSet(VAR_QL_ENTRANCE, 0);\n}\n\nvoid Overworld_ResetStateAfterDigEscRope(void)\n{\n    ResetInitialPlayerAvatarState();\n    FlagClear(FLAG_SYS_ON_CYCLING_ROAD);\n    VarSet(VAR_MAP_SCENE_ROUTE16, 0);\n    FlagClear(FLAG_SYS_CRUISE_MODE);\n    FlagClear(FLAG_SYS_SAFARI_MODE);\n    VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0);\n    FlagClear(FLAG_SYS_USE_STRENGTH);\n    FlagClear(FLAG_SYS_FLASH_ACTIVE);\n    FlagClear(FLAG_SYS_QL_DEPARTED);\n    VarSet(VAR_QL_ENTRANCE, 0);\n}\n\nstatic void Overworld_ResetStateAfterWhitingOut(void)\n{\n    ResetInitialPlayerAvatarState();\n    FlagClear(FLAG_SYS_ON_CYCLING_ROAD);\n    VarSet(VAR_MAP_SCENE_ROUTE16, 0);\n    FlagClear(FLAG_SYS_CRUISE_MODE);\n    FlagClear(FLAG_SYS_SAFARI_MODE);\n    VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0);\n    FlagClear(FLAG_SYS_USE_STRENGTH);\n    FlagClear(FLAG_SYS_FLASH_ACTIVE);\n    FlagClear(FLAG_SYS_QL_DEPARTED);\n    VarSet(VAR_QL_ENTRANCE, 0);\n}\n\nstatic void Overworld_ResetStateOnContinue(void)\n{\n    FlagClear(FLAG_SYS_SAFARI_MODE);\n    VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0);\n    ChooseAmbientCrySpecies();\n    UpdateLocationHistoryForRoamer();\n    RoamerMoveToOtherLocationSet();\n}\n\n// Routines related to game stats\n\nvoid ResetGameStats(void)\n{\n    int i;\n\n    for (i = 0; i < NUM_GAME_STATS; i++)\n    {\n        gSaveBlock1Ptr->gameStats[i] = 0;\n    }\n}\n\nvoid IncrementGameStat(u8 statId)\n{\n    u32 statVal;\n    if (statId >= NUM_USED_GAME_STATS)\n        return;\n    statVal = GetGameStat(statId);\n    if (statVal < 0xFFFFFF)\n        statVal++;\n    else\n        statVal = 0xFFFFFF;\n    SetGameStat(statId, statVal);\n}\n\nu32 GetGameStat(u8 statId)\n{\n    if (statId >= NUM_USED_GAME_STATS)\n        return 0;\n    else\n        return gSaveBlock1Ptr->gameStats[statId] ^ gSaveBlock2Ptr->encryptionKey;\n}\n\nvoid SetGameStat(u8 statId, u32 statVal)\n{\n    if (statId >= NUM_USED_GAME_STATS)\n        return;\n    gSaveBlock1Ptr->gameStats[statId] = statVal ^ gSaveBlock2Ptr->encryptionKey;\n}\n\nvoid ApplyNewEncryptionKeyToGameStats(u32 newKey)\n{\n    u32 i;\n    for (i = 0; i < NUM_GAME_STATS; i++)\n    {\n        ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->gameStats[i], newKey);\n    }\n}\n\n// Routines related to object events\n\nstatic void LoadObjEventTemplatesFromHeader(void)\n{\n    u8 i, j;\n    for (i = 0, j = 0; i < gMapHeader.events->objectEventCount; i++)\n    {\n        if (gMapHeader.events->objectEvents[i].kind == OBJ_KIND_CLONE)\n        {\n            // load target object from the connecting map\n            u8 localId = gMapHeader.events->objectEvents[i].objUnion.clone.targetLocalId;\n            u8 mapNum = gMapHeader.events->objectEvents[i].objUnion.clone.targetMapNum;\n            u8 mapGroup = gMapHeader.events->objectEvents[i].objUnion.clone.targetMapGroup;\n            const struct MapHeader * connectionMap = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum);\n\n            gSaveBlock1Ptr->objectEventTemplates[j] = connectionMap->events->objectEvents[localId - 1];\n            gSaveBlock1Ptr->objectEventTemplates[j].localId = gMapHeader.events->objectEvents[i].localId;\n            gSaveBlock1Ptr->objectEventTemplates[j].x = gMapHeader.events->objectEvents[i].x;\n            gSaveBlock1Ptr->objectEventTemplates[j].y = gMapHeader.events->objectEvents[i].y;\n            gSaveBlock1Ptr->objectEventTemplates[j].objUnion.clone.targetLocalId = localId;\n            gSaveBlock1Ptr->objectEventTemplates[j].objUnion.clone.targetMapNum = mapNum;\n            gSaveBlock1Ptr->objectEventTemplates[j].objUnion.clone.targetMapGroup = mapGroup;\n            gSaveBlock1Ptr->objectEventTemplates[j].kind = OBJ_KIND_CLONE;\n            j++;\n        }\n        else\n        {\n            gSaveBlock1Ptr->objectEventTemplates[j] = gMapHeader.events->objectEvents[i];\n            j++;\n        }\n    }\n}\n\nstatic void LoadSaveblockObjEventScripts(void)\n{\n    int i;\n    const struct ObjectEventTemplate * src = gMapHeader.events->objectEvents;\n    struct ObjectEventTemplate * savObjTemplates = gSaveBlock1Ptr->objectEventTemplates;\n\n    for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++)\n    {\n        savObjTemplates[i].script = src[i].script;\n    }\n}\n\nvoid SetObjEventTemplateCoords(u8 localId, s16 x, s16 y)\n{\n    int i;\n    struct ObjectEventTemplate * savObjTemplates = gSaveBlock1Ptr->objectEventTemplates;\n    for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++)\n    {\n        if (savObjTemplates[i].localId == localId)\n        {\n            savObjTemplates[i].x = x;\n            savObjTemplates[i].y = y;\n            break;\n        }\n    }\n}\n\nvoid SetObjEventTemplateMovementType(u8 localId, u8 movementType)\n{\n    s32 i;\n\n    struct ObjectEventTemplate *savObjTemplates = gSaveBlock1Ptr->objectEventTemplates;\n    for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++)\n    {\n        struct ObjectEventTemplate *objectEventTemplate = &savObjTemplates[i];\n        if (objectEventTemplate->localId == localId)\n        {\n            objectEventTemplate->objUnion.normal.movementType = movementType;\n            return;\n        }\n    }\n}\n\nvoid ResetObjEventTemplateMovementType(u8 localId)\n{\n    s32 i;\n    struct ObjectEventTemplate *savObjTemplates = gSaveBlock1Ptr->objectEventTemplates;\n    for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++)\n    {\n        struct ObjectEventTemplate *objectEventTemplate = &savObjTemplates[i];\n        const struct ObjectEventTemplate * headerObjectEventTemplate = &gMapHeader.events->objectEvents[i];\n        if (objectEventTemplate->localId == localId)\n        {\n            objectEventTemplate->objUnion.normal.movementType = headerObjectEventTemplate->objUnion.normal.movementType;\n            SetObjectMovementType(localId, headerObjectEventTemplate->objUnion.normal.movementType);\n            return;\n        }\n    }\n}\n\n// Routines related to the map layout\n\nstatic void InitMapView(void)\n{\n    move_tilemap_camera_to_upper_left_corner();\n    CopyMapTilesetsToVram(gMapHeader.mapLayout);\n    LoadMapTilesetPalettes(gMapHeader.mapLayout);\n    DrawWholeMapView();\n    InitTilesetAnimations();\n}\n\nstatic const struct MapLayout *GetMapLayout(void)\n{\n    u16 mapLayoutId = gSaveBlock1Ptr->mapLayoutId;\n    if (mapLayoutId)\n        return gMapLayouts[mapLayoutId - 1];\n    return NULL;\n}\n\n// Routines related to warps\n\nstatic const struct WarpData sDummyWarpData = {\n    .mapGroup = MAP_GROUP(UNDEFINED),\n    .mapNum = MAP_NUM(UNDEFINED),\n    .warpId = 0xFF,\n    .x = -1,\n    .y = -1\n};\n\nstatic void ApplyCurrentWarp(void)\n{\n    gLastUsedWarp = gSaveBlock1Ptr->location;\n    gSaveBlock1Ptr->location = sWarpDestination;\n    sFixedDiveWarp = sDummyWarpData;\n    sFixedHoleWarp = sDummyWarpData;\n}\n\nstatic void SetWarpData(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)\n{\n    warp->mapGroup = mapGroup;\n    warp->mapNum = mapNum;\n    warp->warpId = warpId;\n    warp->x = x;\n    warp->y = y;\n}\n\nstatic bool32 IsDummyWarp(struct WarpData *warp)\n{\n    if (warp->mapGroup != (s8)MAP_GROUP(UNDEFINED))\n        return FALSE;\n    else if (warp->mapNum != (s8)MAP_NUM(UNDEFINED))\n        return FALSE;\n    else if (warp->warpId != -1)\n        return FALSE;\n    else if (warp->x != -1)\n        return FALSE;\n    else if (warp->y != -1)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstruct MapHeader const *const Overworld_GetMapHeaderByGroupAndId(u16 mapGroup, u16 mapNum)\n{\n    return gMapGroups[mapGroup][mapNum];\n}\n\nstruct MapHeader const *const GetDestinationWarpMapHeader(void)\n{\n    return Overworld_GetMapHeaderByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum);\n}\n\nstatic void LoadCurrentMapData(void)\n{\n    gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum);\n    gSaveBlock1Ptr->mapLayoutId = gMapHeader.mapLayoutId;\n    gMapHeader.mapLayout = GetMapLayout();\n}\n\nstatic void LoadSaveblockMapHeader(void)\n{\n    gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum);\n    gMapHeader.mapLayout = GetMapLayout();\n}\n\nstatic void SetPlayerCoordsFromWarp(void)\n{\n    if (gSaveBlock1Ptr->location.warpId >= 0 && gSaveBlock1Ptr->location.warpId < gMapHeader.events->warpCount)\n    {\n        gSaveBlock1Ptr->pos.x = gMapHeader.events->warps[gSaveBlock1Ptr->location.warpId].x;\n        gSaveBlock1Ptr->pos.y = gMapHeader.events->warps[gSaveBlock1Ptr->location.warpId].y;\n    }\n    else if (gSaveBlock1Ptr->location.x >= 0 && gSaveBlock1Ptr->location.y >= 0)\n    {\n        gSaveBlock1Ptr->pos.x = gSaveBlock1Ptr->location.x;\n        gSaveBlock1Ptr->pos.y = gSaveBlock1Ptr->location.y;\n    }\n    else\n    {\n        gSaveBlock1Ptr->pos.x = gMapHeader.mapLayout->width / 2;\n        gSaveBlock1Ptr->pos.y = gMapHeader.mapLayout->height / 2;\n    }\n}\n\nvoid WarpIntoMap(void)\n{\n    ApplyCurrentWarp();\n    LoadCurrentMapData();\n    SetPlayerCoordsFromWarp();\n}\n\nvoid SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)\n{\n    SetWarpData(&sWarpDestination, mapGroup, mapNum, warpId, x, y);\n}\n\nvoid SetWarpDestinationToMapWarp(s8 mapGroup, s8 mapNum, s8 warpId)\n{\n    SetWarpDestination(mapGroup, mapNum, warpId, -1, -1);\n}\n\nvoid SetDynamicWarp(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId)\n{\n    SetWarpData(&gSaveBlock1Ptr->dynamicWarp, mapGroup, mapNum, warpId, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y);\n}\n\nvoid SetDynamicWarpWithCoords(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)\n{\n    SetWarpData(&gSaveBlock1Ptr->dynamicWarp, mapGroup, mapNum, warpId, x, y);\n}\n\nvoid SetWarpDestinationToDynamicWarp(u8 unusedWarpId)\n{\n    sWarpDestination = gSaveBlock1Ptr->dynamicWarp;\n}\n\nvoid SetWarpDestinationToHealLocation(u8 healLocationId)\n{\n    const struct HealLocation *warp = GetHealLocation(healLocationId);\n    if (warp)\n        SetWarpDestination(warp->group, warp->map, -1, warp->x, warp->y);\n}\n\nvoid SetWarpDestinationToLastHealLocation(void)\n{\n    sWarpDestination = gSaveBlock1Ptr->lastHealLocation;\n}\n\nstatic void Overworld_SetWhiteoutRespawnPoint(void)\n{\n    SetWhiteoutRespawnWarpAndHealerNpc(&sWarpDestination);\n}\n\nvoid SetLastHealLocationWarp(u32 healLocationId)\n{\n    const struct HealLocation *healLocation = GetHealLocation(healLocationId);\n    if (healLocation)\n        SetWarpData(&gSaveBlock1Ptr->lastHealLocation, healLocation->group, healLocation->map, -1, healLocation->x, healLocation->y);\n}\n\nvoid UpdateEscapeWarp(s16 x, s16 y)\n{\n    u8 currMapType = GetCurrentMapType();\n    u8 destMapType = GetMapTypeByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum);\n    u8 delta;\n    if (IsMapTypeOutdoors(currMapType) && IsMapTypeOutdoors(destMapType) != TRUE && !(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(VIRIDIAN_FOREST) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(VIRIDIAN_FOREST)))\n    {\n        delta = GetPlayerFacingDirection() != DIR_SOUTH;\n        SetEscapeWarp(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x - 7, y - 7 + delta);\n    }\n}\n\nvoid SetEscapeWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)\n{\n    SetWarpData(&gSaveBlock1Ptr->escapeWarp, mapGroup, mapNum, warpId, x, y);\n}\n\nvoid SetWarpDestinationToEscapeWarp(void)\n{\n    sWarpDestination = gSaveBlock1Ptr->escapeWarp;\n}\n\nvoid SetFixedDiveWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)\n{\n    SetWarpData(&sFixedDiveWarp, mapGroup, mapNum, warpId, x, y);\n}\n\nstatic void SetWarpDestinationToDiveWarp(void)\n{\n    sWarpDestination = sFixedDiveWarp;\n}\n\nvoid SetFixedHoleWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)\n{\n    SetWarpData(&sFixedHoleWarp, mapGroup, mapNum, warpId, x, y);\n}\n\nvoid SetWarpDestinationToFixedHoleWarp(s16 x, s16 y)\n{\n    if (IsDummyWarp(&sFixedHoleWarp) == TRUE)\n        sWarpDestination = gLastUsedWarp;\n    else\n        SetWarpDestination(sFixedHoleWarp.mapGroup, sFixedHoleWarp.mapNum, -1, x, y);\n}\n\nstatic void SetWarpDestinationToContinueGameWarp(void)\n{\n    sWarpDestination = gSaveBlock1Ptr->continueGameWarp;\n}\n\nstatic void SetContinueGameWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)\n{\n    SetWarpData(&gSaveBlock1Ptr->continueGameWarp, mapGroup, mapNum, warpId, x, y);\n}\n\nvoid SetContinueGameWarpToHealLocation(u8 healLocationId)\n{\n    const struct HealLocation *warp = GetHealLocation(healLocationId);\n    if (warp)\n        SetWarpData(&gSaveBlock1Ptr->continueGameWarp, warp->group, warp->map, -1, warp->x, warp->y);\n}\n\nvoid SetContinueGameWarpToDynamicWarp(int unused)\n{\n    gSaveBlock1Ptr->continueGameWarp = gSaveBlock1Ptr->dynamicWarp;\n}\n\nstatic const struct MapConnection * GetMapConnection(u8 dir)\n{\n    s32 i;\n    s32 count = gMapHeader.connections->count;\n    const struct MapConnection *connection = gMapHeader.connections->connections;\n\n    if (connection == NULL)\n        return NULL;\n\n    for(i = 0; i < count; i++, connection++)\n        if (connection->direction == dir)\n            return connection;\n\n    return NULL;\n}\n\nstatic bool8 SetDiveWarp(u8 dir, u16 x, u16 y)\n{\n    const struct MapConnection *connection = GetMapConnection(dir);\n\n    if (connection != NULL)\n    {\n        SetWarpDestination(connection->mapGroup, connection->mapNum, -1, x, y);\n    }\n    else\n    {\n        RunOnDiveWarpMapScript();\n        if (IsDummyWarp(&sFixedDiveWarp))\n            return FALSE;\n        SetWarpDestinationToDiveWarp();\n    }\n    return TRUE;\n}\n\nbool8 SetDiveWarpEmerge(u16 x, u16 y)\n{\n    return SetDiveWarp(CONNECTION_EMERGE, x, y);\n}\n\nbool8 SetDiveWarpDive(u16 x, u16 y)\n{\n    return SetDiveWarp(CONNECTION_DIVE, x, y);\n}\n\n// Map loaders\n\nvoid LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum)\n{\n    int paletteIndex;\n\n    SetWarpDestination(mapGroup, mapNum, -1, -1, -1);\n    Overworld_TryMapConnectionMusicTransition();\n    ApplyCurrentWarp();\n    LoadCurrentMapData();\n    LoadObjEventTemplatesFromHeader();\n    TrySetMapSaveWarpStatus();\n    ClearTempFieldEventData();\n    ResetCyclingRoadChallengeData();\n    RestartWildEncounterImmunitySteps();\n    MapResetTrainerRematches(mapGroup, mapNum);\n    SetSavedWeatherFromCurrMapHeader();\n    ChooseAmbientCrySpecies();\n    SetDefaultFlashLevel();\n    Overworld_ClearSavedMusic();\n    RunOnTransitionMapScript();\n    TryRegenerateRenewableHiddenItems();\n    InitMap();\n    CopySecondaryTilesetToVramUsingHeap(gMapHeader.mapLayout);\n    LoadSecondaryTilesetPalette(gMapHeader.mapLayout);\n    for (paletteIndex = 7; paletteIndex < 13; paletteIndex++)\n        ApplyWeatherGammaShiftToPal(paletteIndex);\n    InitSecondaryTilesetAnimation();\n    UpdateLocationHistoryForRoamer();\n    RoamerMove();\n    QL_ResetDefeatedWildMonRecord();\n    DoCurrentWeather();\n    ResetFieldTasksArgs();\n    RunOnResumeMapScript();\n    if (GetLastUsedWarpMapSectionId() != gMapHeader.regionMapSectionId)\n        ShowMapNamePopup(TRUE);\n}\n\nstatic void LoadMapFromWarp(bool32 unused)\n{\n    bool8 isOutdoors;\n\n    LoadCurrentMapData();\n    LoadObjEventTemplatesFromHeader();\n    isOutdoors = IsMapTypeOutdoors(gMapHeader.mapType);\n\n    TrySetMapSaveWarpStatus();\n    ClearTempFieldEventData();\n    ResetCyclingRoadChallengeData();\n    RestartWildEncounterImmunitySteps();\n    MapResetTrainerRematches(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum);\n    SetSavedWeatherFromCurrMapHeader();\n    ChooseAmbientCrySpecies();\n    if (isOutdoors)\n        FlagClear(FLAG_SYS_FLASH_ACTIVE);\n    SetDefaultFlashLevel();\n    Overworld_ClearSavedMusic();\n    RunOnTransitionMapScript();\n    TryRegenerateRenewableHiddenItems();\n    UpdateLocationHistoryForRoamer();\n    RoamerMoveToOtherLocationSet();\n    QL_ResetDefeatedWildMonRecord();\n    InitMap();\n}\n\nstatic void QL_LoadMapNormal(void)\n{\n    bool8 isOutdoors;\n\n    LoadCurrentMapData();\n    LoadObjEventTemplatesFromHeader();\n    isOutdoors = IsMapTypeOutdoors(gMapHeader.mapType);\n    TrySetMapSaveWarpStatus();\n    SetSavedWeatherFromCurrMapHeader();\n    ChooseAmbientCrySpecies();\n    SetDefaultFlashLevel();\n    QL_ResetDefeatedWildMonRecord();\n    QL_RestoreMapLayoutId();\n    LoadSaveblockMapHeader();\n    InitMap();\n}\n\n// Routines related to the initial player avatar state\n\nvoid ResetInitialPlayerAvatarState(void)\n{\n    sInitialPlayerAvatarState.direction = DIR_SOUTH;\n    sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_ON_FOOT;\n    sInitialPlayerAvatarState.hasDirectionSet = FALSE;\n}\n\nvoid SetInitialPlayerAvatarStateWithDirection(u8 dirn)\n{\n    sInitialPlayerAvatarState.direction = dirn;\n    sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_ON_FOOT;\n    sInitialPlayerAvatarState.hasDirectionSet = TRUE;\n}\n\nvoid StoreInitialPlayerAvatarState(void)\n{\n    sInitialPlayerAvatarState.direction = GetPlayerFacingDirection();\n\n    if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE))\n        sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_MACH_BIKE;\n    else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE))\n        sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_ACRO_BIKE;\n    else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))\n        sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_SURFING;\n    else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_UNDERWATER))\n        sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_UNDERWATER;\n    else\n        sInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_ON_FOOT;\n    sInitialPlayerAvatarState.hasDirectionSet = FALSE;\n}\n\nstruct InitialPlayerAvatarState *GetInitialPlayerAvatarState(void)\n{\n    struct InitialPlayerAvatarState playerStruct;\n    u8 mapType = GetCurrentMapType();\n    u16 metatileBehavior = GetCenterScreenMetatileBehavior();\n    u8 transitionFlags = GetAdjustedInitialTransitionFlags(&sInitialPlayerAvatarState, metatileBehavior, mapType);\n    playerStruct.transitionFlags = transitionFlags;\n    playerStruct.direction = GetAdjustedInitialDirection(&sInitialPlayerAvatarState, transitionFlags, metatileBehavior, mapType);\n    playerStruct.hasDirectionSet = FALSE;\n    sInitialPlayerAvatarState = playerStruct;\n    return &sInitialPlayerAvatarState;\n}\n\nstatic u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *playerStruct, u16 metatileBehavior, u8 mapType)\n{\n    if (mapType != MAP_TYPE_INDOOR && FlagGet(FLAG_SYS_CRUISE_MODE))\n        return PLAYER_AVATAR_FLAG_ON_FOOT;\n    else if (mapType == MAP_TYPE_UNDERWATER)\n        return PLAYER_AVATAR_FLAG_UNDERWATER;\n    else if (MetatileBehavior_IsSurfableInSeafoamIslands(metatileBehavior) == TRUE)\n        return PLAYER_AVATAR_FLAG_ON_FOOT;\n    else if (MetatileBehavior_IsSurfable(metatileBehavior) == TRUE)\n        return PLAYER_AVATAR_FLAG_SURFING;\n    else if (Overworld_IsBikingAllowed() != TRUE)\n        return PLAYER_AVATAR_FLAG_ON_FOOT;\n    else if (playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_MACH_BIKE)\n        return PLAYER_AVATAR_FLAG_MACH_BIKE;\n    else if (playerStruct->transitionFlags != PLAYER_AVATAR_FLAG_ACRO_BIKE)\n        return PLAYER_AVATAR_FLAG_ON_FOOT;\n    else\n        return PLAYER_AVATAR_FLAG_ACRO_BIKE;\n}\n\nbool8 MetatileBehavior_IsSurfableInSeafoamIslands(u16 metatileBehavior)\n{\n    if (MetatileBehavior_IsSurfable(metatileBehavior) != TRUE)\n        return FALSE;\n    if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEAFOAM_ISLANDS_B3F)\n          && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEAFOAM_ISLANDS_B3F))\n     || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEAFOAM_ISLANDS_B4F)\n          && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEAFOAM_ISLANDS_B4F)))\n        return TRUE;\n    return FALSE;\n}\n\nstatic u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStruct, u8 transitionFlags, u16 metatileBehavior, u8 mapType)\n{\n    if (FlagGet(FLAG_SYS_CRUISE_MODE) && mapType == MAP_TYPE_OCEAN_ROUTE)\n        return DIR_EAST;\n    else if (MetatileBehavior_IsDeepSouthWarp(metatileBehavior) == TRUE)\n        return DIR_NORTH;\n    else if (MetatileBehavior_IsNonAnimDoor(metatileBehavior) == TRUE || MetatileBehavior_IsWarpDoor_2(metatileBehavior) == TRUE)\n        return DIR_SOUTH;\n    else if (MetatileBehavior_IsSouthArrowWarp(metatileBehavior) == TRUE)\n        return DIR_NORTH;\n    else if (MetatileBehavior_IsNorthArrowWarp(metatileBehavior) == TRUE)\n        return DIR_SOUTH;\n    else if (MetatileBehavior_IsWestArrowWarp(metatileBehavior) == TRUE)\n        return DIR_EAST;\n    else if (MetatileBehavior_IsEastArrowWarp(metatileBehavior) == TRUE)\n        return DIR_WEST;\n    else if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior) == TRUE || MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior) == TRUE)\n        return DIR_WEST;\n    else if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior) == TRUE || MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior) == TRUE)\n        return DIR_EAST;\n    else if ((playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_UNDERWATER  && transitionFlags == PLAYER_AVATAR_FLAG_SURFING)\n             || (playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_SURFING && transitionFlags == PLAYER_AVATAR_FLAG_UNDERWATER ))\n        return playerStruct->direction;\n    else if (MetatileBehavior_IsLadder(metatileBehavior) == TRUE)\n        return playerStruct->direction;\n    else if (playerStruct->hasDirectionSet)\n        return playerStruct->direction;\n    else\n        return DIR_SOUTH;\n}\n\nstatic u16 GetCenterScreenMetatileBehavior(void)\n{\n    return MapGridGetMetatileBehaviorAt(gSaveBlock1Ptr->pos.x + 7, gSaveBlock1Ptr->pos.y + 7);\n}\n\n// Routines related to flash level and map perms\n\nbool32 Overworld_IsBikingAllowed(void)\n{\n    if (!gMapHeader.bikingAllowed)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic void SetDefaultFlashLevel(void)\n{\n    if (!gMapHeader.cave)\n        gSaveBlock1Ptr->flashLevel = 0;\n    else if (FlagGet(FLAG_SYS_FLASH_ACTIVE))\n        gSaveBlock1Ptr->flashLevel = 0;\n    else\n        gSaveBlock1Ptr->flashLevel = gMaxFlashLevel;\n}\n\nvoid SetFlashLevel(s32 flashLevel)\n{\n    if (flashLevel < 0 || flashLevel > gMaxFlashLevel)\n        flashLevel = 0;\n    gSaveBlock1Ptr->flashLevel = flashLevel;\n}\n\nu8 Overworld_GetFlashLevel(void)\n{\n    return gSaveBlock1Ptr->flashLevel;\n}\n\nvoid SetCurrentMapLayout(u16 mapLayoutId)\n{\n    gSaveBlock1Ptr->mapLayoutId = mapLayoutId;\n    gMapHeader.mapLayout = GetMapLayout();\n}\n\nvoid Overworld_SetWarpDestinationFromWarp(struct WarpData * warp)\n{\n    sWarpDestination = *warp;\n}\n\n// Routines related to map music\n\nstatic u16 GetLocationMusic(struct WarpData * warp)\n{\n    if(FlagGet(FLAG_SYS_ON_CYCLING_ROAD))\n        return MUS_CYCLING;\n    return Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum)->music;\n}\n\nstatic u16 GetCurrLocationDefaultMusic(void)\n{\n    u16 music;\n    music = GetLocationMusic(&gSaveBlock1Ptr->location);\n    if(music == MUS_SILPH && FlagGet(FLAG_HIDE_SILPH_ROCKETS))\n    {\n        music = MUS_GSC_PEWTER;\n    }\n    return music;\n}\n\nstatic u16 GetWarpDestinationMusic(void)\n{\n    u16 music = GetLocationMusic(&sWarpDestination);\n    if(music == MUS_SILPH && FlagGet(FLAG_HIDE_SILPH_ROCKETS))\n    {\n        music = MUS_GSC_PEWTER;\n    }\n    return music;\n}\n\nvoid Overworld_ResetMapMusic(void)\n{\n    ResetMapMusic();\n}\n\nvoid Overworld_PlaySpecialMapMusic(void)\n{\n    u16 music;\n    s16 x, y;\n\n    if (gDisableMapMusicChangeOnMapLoad == MUSIC_DISABLE_STOP)\n    {\n        StopMapMusic();\n        return;\n    }\n    if (gDisableMapMusicChangeOnMapLoad == MUSIC_DISABLE_KEEP)\n        return;\n\n    if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(POKEMON_LEAGUE_CHAMPIONS_ROOM) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(POKEMON_LEAGUE_CHAMPIONS_ROOM))\n    {\n        PlayerGetDestCoords(&x, &y);\n        if (y - 7 < 11 && gMPlayInfo_BGM.songHeader == &mus_victory_gym_leader)\n        {\n            FadeInBGM(4);\n            return;\n        }\n    }\n\n    music = GetCurrLocationDefaultMusic();\n\n    if (gSaveBlock1Ptr->savedMusic)\n        music = gSaveBlock1Ptr->savedMusic;\n    else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && Overworld_MusicCanOverrideMapMusic(MUS_SURF))\n        music = MUS_SURF;\n\n    if (music != GetCurrentMapMusic())\n        PlayNewMapMusic(music);\n}\n\nvoid Overworld_SetSavedMusic(u16 songNum)\n{\n    gSaveBlock1Ptr->savedMusic = songNum;\n}\n\nvoid Overworld_ClearSavedMusic(void)\n{\n    gSaveBlock1Ptr->savedMusic = 0;\n}\n\nstatic void Overworld_TryMapConnectionMusicTransition(void)\n{\n    u16 newMusic;\n    u16 currentMusic;\n\n    if (gDisableMapMusicChangeOnMapLoad == MUSIC_DISABLE_STOP)\n    {\n        StopMapMusic();\n        return;\n    }\n    if (gDisableMapMusicChangeOnMapLoad == MUSIC_DISABLE_KEEP)\n        return;\n\n    if (FlagGet(FLAG_DONT_TRANSITION_MUSIC) != TRUE)\n    {\n        newMusic = GetWarpDestinationMusic();\n        currentMusic = GetCurrentMapMusic();\n        if (currentMusic == MUS_SURF)\n            return;\n        if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && Overworld_MusicCanOverrideMapMusic(MUS_SURF))\n            newMusic = MUS_SURF;\n        if (newMusic != currentMusic)\n        {\n            if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))\n                FadeOutAndFadeInNewMapMusic(newMusic, 4, 4);\n            else\n                FadeOutAndPlayNewMapMusic(newMusic, 8);\n        }\n    }\n}\n\nvoid Overworld_ChangeMusicToDefault(void)\n{\n    u16 currentMusic = GetCurrentMapMusic();\n    if (currentMusic != GetCurrLocationDefaultMusic())\n        FadeOutAndPlayNewMapMusic(GetCurrLocationDefaultMusic(), 8);\n}\n\nvoid Overworld_ChangeMusicTo(u16 newMusic)\n{\n    u16 currentMusic = GetCurrentMapMusic();\n    if (currentMusic != newMusic)\n        FadeOutAndPlayNewMapMusic(newMusic, 8);\n}\n\n// rendered unused as a QoL feature. Warps are almost instant without the artificial music delay.\nstatic u8 GetMapMusicFadeoutSpeed(void)\n{\n    const struct MapHeader *mapHeader = GetDestinationWarpMapHeader();\n    if (IsMapTypeIndoors(mapHeader->mapType) == TRUE)\n        return 2;\n    else\n        return 4;\n}\n\nvoid TryFadeOutOldMapMusic(void)\n{\n    u16 warpMusic = GetWarpDestinationMusic();\n    if (FlagGet(FLAG_DONT_TRANSITION_MUSIC) != TRUE && warpMusic != GetCurrentMapMusic())\n    {\n        FadeOutMapMusic(1);\n    }\n}\n\nbool8 BGMusicStopped(void)\n{\n    return IsNotWaitingForBGMStop();\n}\n\nvoid Overworld_FadeOutMapMusic(void)\n{\n    FadeOutMapMusic(4);\n}\n\nstatic void PlayAmbientCry(void)\n{\n    s16 x, y;\n    s8 pan;\n    s8 volume;\n\n    PlayerGetDestCoords(&x, &y);\n    if (sIsAmbientCryWaterMon == TRUE\n        && !MetatileBehavior_IsSurfable(MapGridGetMetatileBehaviorAt(x, y)))\n        return;\n    pan = (Random() % 88) + 212;\n    volume = (Random() % 30) + 50;\n\n    if (gDisableMapMusicChangeOnMapLoad == MUSIC_DISABLE_STOP)\n    {\n        StopMapMusic();\n        return;\n    }\n    if (gDisableMapMusicChangeOnMapLoad == MUSIC_DISABLE_KEEP)\n        return;\n\n    PlayCry_NormalNoDucking(sAmbientCrySpecies, pan, volume, CRY_PRIORITY_AMBIENT);\n}\n\nvoid UpdateAmbientCry(s16 *state, u16 *delayCounter)\n{\n    u8 i, monsCount, divBy;\n\n    switch (*state)\n    {\n    case 0:\n        if (sAmbientCrySpecies == SPECIES_NONE)\n            *state = 4;\n        else\n            *state = 1;\n        break;\n    case 1:\n        *delayCounter = (Random() % 2400) + 1200;\n        *state = 3;\n        break;\n    case 2:\n        divBy = 1;\n        monsCount = CalculatePlayerPartyCount();\n        for (i = 0; i < monsCount; i++)\n        {\n            if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)\n                && GetMonAbility(&gPlayerParty[0]) == ABILITY_SWARM)\n            {\n                divBy = 2;\n                break;\n            }\n        }\n        *delayCounter = ((Random() % 1200) + 1200) / divBy;\n        *state = 3;\n        break;\n    case 3:\n        (*delayCounter)--;\n        if (*delayCounter == 0)\n        {\n            PlayAmbientCry();\n            *state = 2;\n        }\n        break;\n    case 4:\n        break;\n    }\n}\n\nstatic void ChooseAmbientCrySpecies(void)\n{\n    sAmbientCrySpecies = GetLocalWildMon(&sIsAmbientCryWaterMon);\n}\n\nbool32 Overworld_MusicCanOverrideMapMusic(u16 music)\n{\n    if (music == MUS_CYCLING || music == MUS_SURF)\n    {\n        if (gMapHeader.regionMapSectionId == MAPSEC_KANTO_VICTORY_ROAD || gMapHeader.regionMapSectionId == MAPSEC_ROUTE_23 || gMapHeader.regionMapSectionId == MAPSEC_INDIGO_PLATEAU)\n            return FALSE;\n    }\n    return TRUE;\n}\n\nu8 GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum)\n{\n    return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->mapType;\n}\n\nstatic u8 GetMapTypeByWarpData(struct WarpData *warp)\n{\n    return GetMapTypeByGroupAndId(warp->mapGroup, warp->mapNum);\n}\n\nu8 GetCurrentMapType(void)\n{\n    return GetMapTypeByWarpData(&gSaveBlock1Ptr->location);\n}\n\nu8 GetLastUsedWarpMapType(void)\n{\n    return GetMapTypeByWarpData(&gLastUsedWarp);\n}\n\nu8 GetLastUsedWarpMapSectionId(void)\n{\n    return Overworld_GetMapHeaderByGroupAndId(gLastUsedWarp.mapGroup, gLastUsedWarp.mapNum)->regionMapSectionId;\n}\n\nbool8 IsMapTypeOutdoors(u8 mapType)\n{\n    if (mapType == MAP_TYPE_ROUTE\n        || mapType == MAP_TYPE_TOWN\n        || mapType == MAP_TYPE_UNDERWATER\n        || mapType == MAP_TYPE_CITY\n        || mapType == MAP_TYPE_OCEAN_ROUTE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType)\n{\n    if(GetCurrentRegionMapSectionId() == MAPSEC_FARAWAY_ISLAND || GetCurrentRegionMapSectionId() == MAPSEC_SOUTHERN_ISLAND)\n        return FALSE;\n    if(GetCurrentRegionMapSectionId() == MAPSEC_BATTLE_FRONTIER)\n        return FALSE;\n    if (mapType == MAP_TYPE_ROUTE\n        || mapType == MAP_TYPE_TOWN\n        || mapType == MAP_TYPE_OCEAN_ROUTE\n        || mapType == MAP_TYPE_CITY)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 IsMapTypeIndoors(u8 mapType)\n{\n    if (mapType == MAP_TYPE_INDOOR\n        || mapType == MAP_TYPE_SECRET_BASE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic u8 GetSavedWarpRegionMapSectionId(void)\n{\n    return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->dynamicWarp.mapGroup, gSaveBlock1Ptr->dynamicWarp.mapNum)->regionMapSectionId;\n}\n\nu8 GetCurrentRegionMapSectionId(void)\n{\n    return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->regionMapSectionId;\n}\n\nu8 GetCurrentMapBattleScene(void)\n{\n    return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->battleType;\n}\n\nstatic const int sUnusedData[] = {\n    1200,\n    3600,\n    1200,\n    2400,\n      50,\n      80,\n     -44,\n      44\n};\n\nconst struct Coords32 gDirectionToVectors[] = \n{\n    [DIR_NONE]      = { 0,  0},\n    [DIR_SOUTH]     = { 0,  1},\n    [DIR_NORTH]     = { 0, -1},\n    [DIR_WEST]      = {-1,  0},\n    [DIR_EAST]      = { 1,  0},\n    [DIR_SOUTHWEST] = {-1,  1},\n    [DIR_SOUTHEAST] = { 1,  1},\n    [DIR_NORTHWEST] = {-1, -1},\n    [DIR_NORTHEAST] = { 1, -1},\n};\n\nstatic const struct BgTemplate sOverworldBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 28,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000\n    }, {\n        .bg = 3,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }\n};\n\nstatic void InitOverworldBgs(void)\n{\n    MoveSaveBlocks_ResetHeap_();\n    ResetScreenForMapLoad();\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sOverworldBgTemplates, NELEMS(sOverworldBgTemplates));\n    SetBgAttribute(1, BG_ATTR_MOSAIC, TRUE);\n    SetBgAttribute(2, BG_ATTR_MOSAIC, TRUE);\n    SetBgAttribute(3, BG_ATTR_MOSAIC, TRUE);\n    gBGTilemapBuffers2 = AllocZeroed(BG_SCREEN_SIZE);\n    gBGTilemapBuffers1 = AllocZeroed(BG_SCREEN_SIZE);\n    gBGTilemapBuffers3 = AllocZeroed(BG_SCREEN_SIZE);\n    SetBgTilemapBuffer(1, gBGTilemapBuffers2);\n    SetBgTilemapBuffer(2, gBGTilemapBuffers1);\n    SetBgTilemapBuffer(3, gBGTilemapBuffers3);\n    InitStandardTextBoxWindows();\n    InitTextBoxGfxAndPrinters();\n    InitFieldMessageBox();\n}\n\nstatic void InitOverworldBgs_NoResetHeap(void)\n{\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sOverworldBgTemplates, NELEMS(sOverworldBgTemplates));\n    SetBgAttribute(1, BG_ATTR_MOSAIC, TRUE);\n    SetBgAttribute(2, BG_ATTR_MOSAIC, TRUE);\n    SetBgAttribute(3, BG_ATTR_MOSAIC, TRUE);\n    gBGTilemapBuffers2 = AllocZeroed(BG_SCREEN_SIZE);\n    gBGTilemapBuffers1 = AllocZeroed(BG_SCREEN_SIZE);\n    gBGTilemapBuffers3 = AllocZeroed(BG_SCREEN_SIZE);\n    SetBgTilemapBuffer(1, gBGTilemapBuffers2);\n    SetBgTilemapBuffer(2, gBGTilemapBuffers1);\n    SetBgTilemapBuffer(3, gBGTilemapBuffers3);\n    InitStandardTextBoxWindows();\n    InitTextBoxGfxAndPrinters();\n    InitFieldMessageBox();\n}\n\nvoid CleanupOverworldWindowsAndTilemaps(void)\n{\n    FreeAllOverworldWindowBuffers();\n    Free(gBGTilemapBuffers3);\n    Free(gBGTilemapBuffers1);\n    Free(gBGTilemapBuffers2);\n}\n\nstatic void ResetSafariZoneFlag_(void)\n{\n    ResetSafariZoneFlag();\n}\n\nbool32 IsUpdateLinkStateCBActive(void)\n{\n    if (gMain.callback1 == CB1_UpdateLinkState)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void DoCB1_Overworld(u16 newKeys, u16 heldKeys)\n{\n    struct FieldInput fieldInput;\n\n    QL_TryRunActions();\n    UpdatePlayerAvatarTransitionState();\n    FieldClearPlayerInput(&fieldInput);\n    FieldGetPlayerInput(&fieldInput, newKeys, heldKeys);\n    FieldInput_HandleCancelSignpost(&fieldInput);\n    if (!ArePlayerFieldControlsLocked())\n    {\n        if (ProcessPlayerFieldInput(&fieldInput) == TRUE)\n        {\n            if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RECORDING)\n                QL_RecordFieldInput(&gFieldInputRecord);\n            LockPlayerFieldControls();\n            DismissMapNamePopup();\n        }\n        else\n        {\n            player_step(fieldInput.dpadDirection, newKeys, heldKeys);\n        }\n    }\n    RunQuestLogCB();\n}\n\nstatic void DoCB1_Overworld_QuestLogPlayback(void)\n{\n    struct FieldInput fieldInput;\n\n    QL_TryRunActions();\n    UpdatePlayerAvatarTransitionState();\n    QL_HandleInput();\n    FieldClearPlayerInput(&fieldInput);\n    fieldInput = gQuestLogFieldInput;\n    FieldInput_HandleCancelSignpost(&fieldInput);\n    if (!ArePlayerFieldControlsLocked())\n    {\n        if (ProcessPlayerFieldInput(&fieldInput) == TRUE)\n        {\n            LockPlayerFieldControls();\n            DismissMapNamePopup();\n        }\n        else\n        {\n            RunQuestLogCB();\n        }\n    }\n    else if (QuestLogScenePlaybackIsEnding() == TRUE)\n    {\n        RunQuestLogCB();\n    }\n    FieldClearPlayerInput(&gQuestLogFieldInput);\n}\n\nvoid CB1_Overworld(void)\n{\n    if (gMain.callback2 == CB2_Overworld)\n    {\n        if (QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING || gQuestLogState == QL_STATE_PLAYBACK)\n            DoCB1_Overworld_QuestLogPlayback();\n        else\n            DoCB1_Overworld(gMain.newKeys, gMain.heldKeys);\n    }\n}\n\nstatic void OverworldBasic(void)\n{\n    ScriptContext_RunScript();\n    RunTasks();\n    AnimateSprites();\n    CameraUpdate();\n    SetQuestLogEvent_Arrived();\n    UpdateCameraPanning();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n    UpdateTilesetAnimations();\n    DoScheduledBgTilemapCopiesToVram();\n}\n\n// This CB2 is used when starting\nvoid CB2_OverworldBasic(void)\n{\n    OverworldBasic();\n}\n\nstatic void CB2_Overworld(void)\n{\n    bool32 fading = !!gPaletteFade.active;\n    if (fading)\n        SetVBlankCallback(NULL);\n    OverworldBasic();\n    if (fading)\n        SetFieldVBlankCallback();\n}\n\nvoid SetMainCallback1(MainCallback cb)\n{\n    gMain.callback1 = cb;\n}\n\nstatic bool8 RunFieldCallback(void)\n{\n    if (gFieldCallback2)\n    {\n        if (!gFieldCallback2())\n            return FALSE;\n        else\n        {\n            gFieldCallback2 = NULL;\n            gFieldCallback = NULL;\n        }\n    }\n    else\n    {\n        if (gFieldCallback)\n            gFieldCallback();\n        else\n            FieldCB_DefaultWarpExit();\n\n        gFieldCallback = NULL;\n    }\n\n    return TRUE;\n}\n\nvoid CB2_NewGame(void)\n{\n    u8 versionBackup = gSaveBlock1Ptr->keyFlags.version;\n    FieldClearVBlankHBlankCallbacks();\n    StopMapMusic();\n    ResetSafariZoneFlag_();\n    NewGameInitData();\n    AddBagItem(ITEM_BERRY_POUCH, 1);\n    AddBagItem(ITEM_TM_CASE, 1);\n    gSaveBlock1Ptr->keyFlags.version = versionBackup;\n    ResetInitialPlayerAvatarState();\n    PlayTimeCounter_Start();\n    ScriptContext_Init();\n    UnlockPlayerFieldControls();\n    gFieldCallback = FieldCB_WarpExitFadeFromBlack;\n    gFieldCallback2 = NULL;\n    DoMapLoadLoop(&gMain.state);\n    SetFieldVBlankCallback();\n    SetMainCallback1(CB1_Overworld);\n    SetMainCallback2(CB2_Overworld);\n}\n\nvoid CB2_WhiteOut(void)\n{\n    u8 val;\n\n    if (++gMain.state >= 120)\n    {\n        FieldClearVBlankHBlankCallbacks();\n        StopMapMusic();\n        ResetSafariZoneFlag_();\n        DoWhiteOut();\n        SetInitialPlayerAvatarStateWithDirection(DIR_NORTH);\n        ScriptContext_Init();\n        UnlockPlayerFieldControls();\n        gFieldCallback = FieldCB_RushInjuredPokemonToCenter;\n        val = 0;\n        if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 || gSaveBlock1Ptr->keyFlags.noPMC == 1)\n        {\n            if(GetFirstAliveBoxMon() == 420) //no usable Pokemon\n            {\n                gGlobalFieldTintMode = 1; //should grayscale palettes?\n            }\n        }\n        DoMapLoadLoop(&val);\n        QuestLog_CutRecording();\n        SetFieldVBlankCallback();\n        SetMainCallback1(CB1_Overworld);\n        SetMainCallback2(CB2_Overworld);\n    }\n}\n\nvoid CB2_LoadMap(void)\n{\n    FieldClearVBlankHBlankCallbacks();\n    ScriptContext_Init();\n    UnlockPlayerFieldControls();\n    SetMainCallback1(NULL);\n    SetMainCallback2(CB2_DoChangeMap);\n    gMain.savedCallback = CB2_LoadMap2;\n}\n\nstatic void CB2_LoadMap2(void)\n{\n    DoMapLoadLoop(&gMain.state);\n    if (QuestLog_ShouldEndSceneOnMapChange() == TRUE)\n    {\n        QuestLog_AdvancePlayhead_();\n    }\n    else\n    {\n        SetFieldVBlankCallback();\n        SetMainCallback1(CB1_Overworld);\n        SetMainCallback2(CB2_Overworld);\n    }\n}\n\nvoid CB2_ReturnToFieldCableClub(void)\n{\n    FieldClearVBlankHBlankCallbacks();\n    gFieldCallback = FieldCB_ReturnToFieldWirelessLink;\n    SetMainCallback2(CB2_LoadMapOnReturnToFieldCableClub);\n}\n\nstatic void CB2_LoadMapOnReturnToFieldCableClub(void)\n{\n    if (LoadMapInStepsLink(&gMain.state))\n    {\n        SetFieldVBlankCallback();\n        SetMainCallback1(CB1_UpdateLinkState);\n        ResetAllMultiplayerState();\n        SetMainCallback2(CB2_Overworld);\n    }\n}\n\nvoid CB2_ReturnToField(void)\n{\n    if (IsUpdateLinkStateCBActive() == TRUE)\n    {\n        SetMainCallback2(CB2_ReturnToFieldLink);\n    }\n    else\n    {\n        FieldClearVBlankHBlankCallbacks();\n        SetMainCallback2(CB2_ReturnToFieldLocal);\n    }\n}\n\nstatic void CB2_ReturnToFieldLocal(void)\n{\n    if (ReturnToFieldLocal(&gMain.state))\n    {\n        SetFieldVBlankCallback();\n        SetMainCallback2(CB2_Overworld);\n    }\n}\n\nstatic void CB2_ReturnToFieldLink(void)\n{\n    if (!Overworld_LinkRecvQueueLengthMoreThan2() && ReturnToFieldLink(&gMain.state))\n        SetMainCallback2(CB2_Overworld);\n}\n\nvoid CB2_ReturnToFieldFromMultiplayer(void)\n{\n    FieldClearVBlankHBlankCallbacks();\n    StopMapMusic();\n    SetMainCallback1(CB1_UpdateLinkState);\n    ResetAllMultiplayerState();\n\n    if (gWirelessCommType != 0)\n        gFieldCallback = FieldCB_ReturnToFieldWirelessLink;\n    else\n        gFieldCallback = FieldCB_ReturnToFieldCableLink;\n\n    ScriptContext_Init();\n    UnlockPlayerFieldControls();\n    CB2_ReturnToField();\n}\n\nvoid CB2_ReturnToFieldWithOpenMenu(void)\n{\n    FieldClearVBlankHBlankCallbacks();\n    gFieldCallback2 = FieldCB_ReturnToFieldOpenStartMenu;\n    CB2_ReturnToField();\n}\n\nvoid CB2_ReturnToFieldContinueScript(void)\n{\n    FieldClearVBlankHBlankCallbacks();\n    gFieldCallback = FieldCB_ContinueScript;\n    CB2_ReturnToField();\n}\n\nvoid CB2_ReturnToFieldContinueScriptPlayMapMusic(void)\n{\n    FieldClearVBlankHBlankCallbacks();\n    gFieldCallback = FieldCB_ContinueScriptHandleMusic;\n    CB2_ReturnToField();\n}\n\nvoid CB2_ReturnToFieldFromDiploma(void)\n{\n    FieldClearVBlankHBlankCallbacks();\n    gFieldCallback = FieldCB_WarpExitFadeFromBlack;\n    CB2_ReturnToField();\n}\n\nstatic void FieldCB_ShowMapNameOnContinue(void)\n{\n    if (gMapHeader.showMapName == TRUE)\n        ShowMapNamePopup(FALSE);\n    FieldCB_WarpExitFadeFromBlack();\n}\n\nvoid CB2_ContinueSavedGame(void)\n{\n    FieldClearVBlankHBlankCallbacks();\n    StopMapMusic();\n    ResetSafariZoneFlag_();\n    LoadSaveblockMapHeader();\n    LoadSaveblockObjEventScripts();\n    UnfreezeObjectEvents();\n    Overworld_ResetStateOnContinue();\n    InitMapFromSavedGame();\n    PlayTimeCounter_Start();\n    ScriptContext_Init();\n    UnlockPlayerFieldControls();\n    gFieldCallback2 = NULL;\n    gExitStairsMovementDisabled = TRUE;\n    if (UseContinueGameWarp() == TRUE)\n    {\n        ClearContinueGameWarpStatus();\n        SetWarpDestinationToContinueGameWarp();\n        WarpIntoMap();\n        SetMainCallback2(CB2_LoadMap);\n    }\n    else\n    {\n        gFieldCallback = FieldCB_ShowMapNameOnContinue;\n        SetMainCallback1(CB1_Overworld);\n        CB2_ReturnToField();\n    }\n}\n\nstatic void FieldClearVBlankHBlankCallbacks(void)\n{\n    if (UsedPokemonCenterWarp() == TRUE)\n        CloseLink();\n\n    if (gWirelessCommType != 0)\n    {\n        EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);\n        DisableInterrupts(INTR_FLAG_HBLANK);\n    }\n    else\n    {\n        DisableInterrupts(INTR_FLAG_HBLANK);\n        EnableInterrupts(INTR_FLAG_VBLANK);\n    }\n\n    SetVBlankCallback(NULL);\n    SetHBlankCallback(NULL);\n}\n\nstatic void SetFieldVBlankCallback(void)\n{\n    SetVBlankCallback(VBlankCB_Field);\n}\n\nstatic void VBlankCB_Field(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    ScanlineEffect_InitHBlankDmaTransfer();\n    FieldUpdateBgTilemapScroll();\n    TransferPlttBuffer();\n    TransferTilesetAnimsBuffer();\n}\n\nstatic void InitCurrentFlashLevelScanlineEffect(void)\n{\n    u8 flashLevel = Overworld_GetFlashLevel();\n    if (flashLevel != 0)\n    {\n        WriteFlashScanlineEffectBuffer(flashLevel);\n        ScanlineEffect_SetParams((struct ScanlineEffectParams){\n            .dmaDest = &REG_WIN0H,\n            .dmaControl = (2 >> 1) | ((DMA_16BIT | DMA_DEST_RELOAD | DMA_SRC_INC | DMA_REPEAT | DMA_START_HBLANK | DMA_ENABLE) << 16),\n            .initState = 1,\n            .unused9 = 0\n        });\n    }\n}\n\nstatic bool32 LoadMapInStepsLink(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        InitOverworldBgs();\n        ScriptContext_Init();\n        UnlockPlayerFieldControls();\n        (*state)++;\n        break;\n    case 1:\n        LoadMapFromWarp(TRUE);\n        (*state)++;\n        break;\n    case 2:\n        ResumeMap(TRUE);\n        (*state)++;\n        break;\n    case 3:\n        OffsetCameraFocusByLinkPlayerId();\n        InitObjectEventsLink();\n        SpawnLinkPlayers();\n        SetCameraToTrackGuestPlayer();\n        SetHelpContextForMap();\n        (*state)++;\n        break;\n    case 4:\n        InitCurrentFlashLevelScanlineEffect();\n        InitOverworldGraphicsRegisters();\n        (*state)++;\n        break;\n    case 5:\n        move_tilemap_camera_to_upper_left_corner();\n        (*state)++;\n        break;\n    case 6:\n        CopyPrimaryTilesetToVram(gMapHeader.mapLayout);\n        (*state)++;\n        break;\n    case 7:\n        CopySecondaryTilesetToVram(gMapHeader.mapLayout);\n        (*state)++;\n        break;\n    case 8:\n        if (FreeTempTileDataBuffersIfPossible() != TRUE)\n        {\n            LoadMapTilesetPalettes(gMapHeader.mapLayout);\n            (*state)++;\n        }\n        break;\n    case 9:\n        DrawWholeMapView();\n        (*state)++;\n        break;\n    case 10:\n        InitTilesetAnimations();\n        (*state)++;\n        break;\n    case 11:\n        if (gWirelessCommType != 0)\n        {\n            LoadWirelessStatusIndicatorSpriteGfx();\n            CreateWirelessStatusIndicatorSprite(0, 0);\n        }\n        (*state)++;\n        break;\n    case 12:\n        if (RunFieldCallback())\n            (*state)++;\n        break;\n    case 13:\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool32 LoadMapInStepsLocal(u8 *state, bool32 inLink)\n{\n    switch (*state)\n    {\n    case 0:\n        InitOverworldBgs();\n        FieldClearVBlankHBlankCallbacks();\n        LoadMapFromWarp(inLink);\n        (*state)++;\n        break;\n    case 1:\n        QuestLog_InitPalettesBackup();\n        (*state)++;\n        break;\n    case 2:\n        ResumeMap(inLink);\n        (*state)++;\n        break;\n    case 3:\n        if (QuestLog_ShouldEndSceneOnMapChange() == TRUE)\n            return TRUE;\n        (*state)++;\n        break;\n    case 4:\n        InitObjectEventsLocal();\n        SetCameraToTrackPlayer();\n        if (gQuestLogState != QL_STATE_PLAYBACK)\n        {\n            QuestLog_CheckDepartingIndoorsMap();\n            QuestLog_TryRecordDepartedLocation();\n        }\n        SetHelpContextForMap();\n        (*state)++;\n        break;\n    case 5:\n        InitCurrentFlashLevelScanlineEffect();\n        InitOverworldGraphicsRegisters();\n        (*state)++;\n        break;\n    case 6:\n        move_tilemap_camera_to_upper_left_corner();\n        (*state)++;\n        break;\n    case 7:\n        CopyPrimaryTilesetToVram(gMapHeader.mapLayout);\n        (*state)++;\n        break;\n    case 8:\n        CopySecondaryTilesetToVram(gMapHeader.mapLayout);\n        (*state)++;\n        break;\n    case 9:\n        if (FreeTempTileDataBuffersIfPossible() != TRUE)\n        {\n            LoadMapTilesetPalettes(gMapHeader.mapLayout);\n            (*state)++;\n        }\n        break;\n    case 10:\n        DrawWholeMapView();\n        (*state)++;\n        break;\n    case 11:\n        InitTilesetAnimations();\n        (*state)++;\n        break;\n    case 12:\n        if (GetLastUsedWarpMapSectionId() != gMapHeader.regionMapSectionId && MapHasPreviewScreen_HandleQLState2(gMapHeader.regionMapSectionId, MPS_TYPE_FOREST) == TRUE)\n        {\n            MapPreview_LoadGfx(gMapHeader.regionMapSectionId);\n            MapPreview_StartForestTransition(gMapHeader.regionMapSectionId);\n        }\n        else if (gMapHeader.showMapName == TRUE)\n        {\n            ShowMapNamePopup(FALSE);\n        }\n        (*state)++;\n        break;\n    case 13:\n        if (RunFieldCallback())\n            (*state)++;\n        break;\n    case 14:\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool32 ReturnToFieldLocal(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        InitOverworldBgs();\n        QuestLog_InitPalettesBackup();\n        ResumeMap(FALSE);\n        ReloadObjectsAndRunReturnToFieldMapScript();\n        SetCameraToTrackPlayer();\n        (*state)++;\n        break;\n    case 1:\n        (*state)++;\n        break;\n    case 2:\n        InitViewGraphics();\n        SetHelpContextForMap();\n        (*state)++;\n        break;\n    case 3:\n        if (RunFieldCallback())\n            (*state)++;\n        break;\n    case 4:\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool32 ReturnToFieldLink(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        InitOverworldBgs();\n        FieldClearVBlankHBlankCallbacks();\n        (*state)++;\n        break;\n    case 1:\n        QuestLog_InitPalettesBackup();\n        ResumeMap(TRUE);\n        (*state)++;\n        break;\n    case 2:\n        CreateLinkPlayerSprites();\n        ReloadObjectsAndRunReturnToFieldMapScript();\n        SetCameraToTrackGuestPlayer_2();\n        SetHelpContextForMap();\n        (*state)++;\n        break;\n    case 3:\n        InitCurrentFlashLevelScanlineEffect();\n        InitOverworldGraphicsRegisters();\n        (*state)++;\n        break;\n    case 4:\n        move_tilemap_camera_to_upper_left_corner();\n        (*state)++;\n        break;\n    case 5:\n        CopyPrimaryTilesetToVram(gMapHeader.mapLayout);\n        (*state)++;\n        break;\n    case 6:\n        CopySecondaryTilesetToVram(gMapHeader.mapLayout);\n        (*state)++;\n        break;\n    case 7:\n        if (FreeTempTileDataBuffersIfPossible() != TRUE)\n        {\n            LoadMapTilesetPalettes(gMapHeader.mapLayout);\n            (*state)++;\n        }\n        break;\n    case 8:\n        DrawWholeMapView();\n        (*state)++;\n        break;\n    case 9:\n        InitTilesetAnimations();\n        (*state)++;\n        break;\n    case 10:\n        (*state)++;\n        break;\n    case 11:\n        if (gWirelessCommType != 0)\n        {\n            LoadWirelessStatusIndicatorSpriteGfx();\n            CreateWirelessStatusIndicatorSprite(0, 0);\n        }\n        (*state)++;\n        break;\n    case 12:\n        if (RunFieldCallback())\n            (*state)++;\n        break;\n    case 13:\n        SetFieldVBlankCallback();\n        (*state)++;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nvoid DoMapLoadLoop(u8 *state)\n{\n    while (!LoadMapInStepsLocal(state, FALSE)) ;\n}\n\nstatic void MoveSaveBlocks_ResetHeap_(void)\n{\n    MoveSaveBlocks_ResetHeap();\n}\n\nstatic void ResetScreenForMapLoad(void)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    ScanlineEffect_Stop();\n\n    DmaClear16(3, PLTT + 2, PLTT_SIZE - 2);\n    DmaFillLarge16(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000);\n    ResetOamRange(0, 128);\n    LoadOam();\n}\n\nstatic void InitViewGraphics(void)\n{\n    InitCurrentFlashLevelScanlineEffect();\n    InitOverworldGraphicsRegisters();\n    InitMapView();\n}\n\nstatic void InitOverworldGraphicsRegisters(void)\n{\n    ClearScheduledBgCopiesToVram();\n    ResetTempTileDataBuffers();\n    SetGpuReg(REG_OFFSET_MOSAIC, 0);\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WINOBJ_BG0);\n    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 255));\n    SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 255));\n    SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(255, 255));\n    SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(255, 255));\n    SetGpuReg(REG_OFFSET_BLDCNT, gOverworldBackgroundLayerFlags[1] | gOverworldBackgroundLayerFlags[2] | gOverworldBackgroundLayerFlags[3]\n                                 | BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(13, 7));\n    ScheduleBgCopyTilemapToVram(1);\n    ScheduleBgCopyTilemapToVram(2);\n    ScheduleBgCopyTilemapToVram(3);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | 0x20 | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n    ShowBg(3);\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n}\n\nstatic void ResumeMap(bool32 inLink)\n{\n    ResetTasks();\n    ResetSpriteData();\n    ResetPaletteFade();\n    ScanlineEffect_Clear();\n    ResetAllPicSprites();\n    ResetCameraUpdateInfo();\n    InstallCameraPanAheadCallback();\n    if (!inLink)\n        InitObjectEventPalettes(0);\n    else\n        InitObjectEventPalettes(1);\n\n    FieldEffectActiveListClear();\n    StartWeather();\n    ResumePausedWeather();\n    if (!inLink)\n        SetUpFieldTasks();\n    RunOnResumeMapScript();\n}\n\nstatic void InitObjectEventsLink(void)\n{\n    gTotalCameraPixelOffsetX = 0;\n    gTotalCameraPixelOffsetY = 0;\n    ResetObjectEvents();\n    TrySpawnObjectEvents(0, 0);\n    TryRunOnWarpIntoMapScript();\n}\n\nstatic void InitObjectEventsLocal(void)\n{\n    s16 x, y;\n    struct InitialPlayerAvatarState *player;\n\n    gTotalCameraPixelOffsetX = 0;\n    gTotalCameraPixelOffsetY = 0;\n    ResetObjectEvents();\n    GetCameraFocusCoords(&x, &y);\n    player = GetInitialPlayerAvatarState();\n    InitPlayerAvatar(x, y, player->direction, gSaveBlock2Ptr->playerGender);\n    SetPlayerAvatarTransitionFlags(player->transitionFlags);\n    ResetInitialPlayerAvatarState();\n    TrySpawnObjectEvents(0, 0);\n    TryRunOnWarpIntoMapScript();\n}\n\nstatic void ReloadObjectsAndRunReturnToFieldMapScript(void)\n{\n    SpawnObjectEventsOnReturnToField(0, 0);\n    RunOnReturnToFieldMapScript();\n}\n\nstatic void SetCameraToTrackPlayer(void)\n{\n    gObjectEvents[gPlayerAvatar.objectEventId].trackedByCamera = TRUE;\n    InitCameraUpdateCallback(gPlayerAvatar.spriteId);\n}\n\nstatic void SetCameraToTrackGuestPlayer(void)\n{\n    InitCameraUpdateCallback(GetSpriteForLinkedPlayer(gLocalLinkPlayerId));\n}\n\n// Duplicate function.\nstatic void SetCameraToTrackGuestPlayer_2(void)\n{\n    InitCameraUpdateCallback(GetSpriteForLinkedPlayer(gLocalLinkPlayerId));\n}\n\nstatic void OffsetCameraFocusByLinkPlayerId(void)\n{\n    u16 x, y;\n    GetCameraFocusCoords(&x, &y);\n\n    // This is a hack of some kind; it's undone in SpawnLinkPlayers, which is called\n    // soon after this function.\n    SetCameraFocusCoords(x + gLocalLinkPlayerId, y);\n}\n\nstatic void SpawnLinkPlayers(void)\n{\n    u32 i;\n    u16 x, y;\n\n    GetCameraFocusCoords(&x, &y);\n    x -= gLocalLinkPlayerId;\n\n    for (i = 0; i < gFieldLinkPlayerCount; i++)\n    {\n        SpawnLinkPlayerObjectEvent(i, i + x, y, gLinkPlayers[i].gender);\n        CreateLinkPlayerSprite(i, gLinkPlayers[i].version);\n    }\n\n    ClearAllPlayerKeys();\n}\n\nstatic void CreateLinkPlayerSprites(void)\n{\n    u32 i;\n    for (i = 0; i < gFieldLinkPlayerCount; i++)\n        CreateLinkPlayerSprite(i, gLinkPlayers[i].version);\n}\n\n// Quest Log\n\nvoid CB2_SetUpOverworldForQLPlaybackWithWarpExit(void)\n{\n    FieldClearVBlankHBlankCallbacks();\n    gGlobalFieldTintMode = QL_TINT_GRAYSCALE;\n    ScriptContext_Init();\n    UnlockPlayerFieldControls();\n    SetMainCallback1(NULL);\n    SetMainCallback2(CB2_DoChangeMap);\n    gMain.savedCallback = CB2_LoadMapForQLPlayback;\n}\n\nvoid CB2_SetUpOverworldForQLPlayback(void)\n{\n    FieldClearVBlankHBlankCallbacks();\n    gGlobalFieldTintMode = QL_TINT_GRAYSCALE;\n    LoadSaveblockMapHeader();\n    ScriptContext_Init();\n    UnlockPlayerFieldControls();\n    SetMainCallback1(NULL);\n    SetMainCallback2(CB2_LoadMapForQLPlayback);\n}\n\nstatic void CB2_LoadMapForQLPlayback(void)\n{\n    DoLoadMap_QLPlayback(&gMain.state);\n    SetFieldVBlankCallback();\n    SetMainCallback1(CB1_Overworld);\n    SetMainCallback2(CB2_Overworld);\n}\n\nstatic void DoLoadMap_QLPlayback(u8 *state)\n{\n    while (!LoadMap_QLPlayback(state))\n        ;\n}\n\nstatic bool32 LoadMap_QLPlayback(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        InitOverworldBgs();\n        FieldClearVBlankHBlankCallbacks();\n        QuestLog_InitPalettesBackup();\n        QL_CopySaveState();\n        QL_ResetPartyAndPC();\n        if (GetQuestLogStartType() == QL_START_WARP)\n        {\n            gExitStairsMovementDisabled = FALSE;\n            LoadMapFromWarp(FALSE);\n        }\n        else\n        {\n            gExitStairsMovementDisabled = TRUE;\n            QL_LoadMapNormal();\n        }\n        (*state)++;\n        break;\n    case 1:\n        QL_InitSceneObjectsAndActions();\n        (*state)++;\n        break;\n    case 2:\n        ResumeMap(FALSE);\n        (*state)++;\n        break;\n    case 3:\n        ReloadObjectsAndRunReturnToFieldMapScript();\n        SetCameraToTrackPlayer();\n        (*state)++;\n        break;\n    case 4:\n        InitCurrentFlashLevelScanlineEffect();\n        InitOverworldGraphicsRegisters();\n        (*state)++;\n        break;\n    case 5:\n        move_tilemap_camera_to_upper_left_corner();\n        (*state)++;\n        break;\n    case 6:\n        CopyPrimaryTilesetToVram(gMapHeader.mapLayout);\n        (*state)++;\n        break;\n    case 7:\n        CopySecondaryTilesetToVram(gMapHeader.mapLayout);\n        (*state)++;\n        break;\n    case 8:\n        if (FreeTempTileDataBuffersIfPossible() != TRUE)\n        {\n            LoadMapTilesetPalettes(gMapHeader.mapLayout);\n            (*state)++;\n        }\n        break;\n    case 9:\n        DrawWholeMapView();\n        (*state)++;\n        break;\n    case 10:\n        InitTilesetAnimations();\n        QL_TryStopSurfing();\n        (*state)++;\n        break;\n    default:\n        if (RunFieldCallback())\n            return TRUE;\n        break;\n    }\n    return FALSE;\n}\n\nvoid CB2_EnterFieldFromQuestLog(void)\n{\n    FieldClearVBlankHBlankCallbacks();\n    StopMapMusic();\n    gGlobalFieldTintMode = QL_TINT_BACKUP_GRAYSCALE;\n    ResetSafariZoneFlag_();\n    LoadSaveblockMapHeader();\n    LoadSaveblockObjEventScripts();\n    UnfreezeObjectEvents();\n    Overworld_ResetStateOnContinue();\n    InitMapFromSavedGame();\n    PlayTimeCounter_Start();\n    CheckNationalDexEligibilityOnSaveLoad();\n    ScriptContext_Init();\n    gExitStairsMovementDisabled = TRUE;\n    if (UseContinueGameWarp() == TRUE)\n    {\n        ClearContinueGameWarpStatus();\n        SetWarpDestinationToContinueGameWarp();\n        WarpIntoMap();\n        SetMainCallback2(CB2_LoadMap);\n    }\n    else\n    {\n        SetMainCallback1(CB1_Overworld);\n        CB2_ReturnToField();\n    }\n}\n\n// Credits\n\nvoid Overworld_CreditsMainCB(void)\n{\n    bool8 fading = !!gPaletteFade.active;\n    if (fading)\n        SetVBlankCallback(NULL);\n    RunTasks();\n    AnimateSprites();\n    CameraUpdateNoObjectRefresh();\n    UpdateCameraPanning();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n    UpdateTilesetAnimations();\n    DoScheduledBgTilemapCopiesToVram();\n    if (fading)\n        SetFieldVBlankCallback();\n}\n\nstatic bool8 FieldCB2_Credits_WaitFade(void)\n{\n    if (gPaletteFade.active)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool32 Overworld_DoScrollSceneForCredits(u8 *state_p, const struct CreditsOverworldCmd * script, u8 tintMode)\n{\n    sCreditsOverworld_Script = script;\n    gGlobalFieldTintMode = tintMode;\n    return SetUpScrollSceneForCredits(state_p, 0);\n}\n\nstatic bool32 SetUpScrollSceneForCredits(u8 *state, u8 unused)\n{\n    struct WarpData warp;\n    switch (*state)\n    {\n    case 0:\n        sCreditsOverworld_CmdIndex = 0;\n        sCreditsOverworld_CmdLength = 0;\n        (*state)++;\n        return FALSE;\n    case 1:\n        warp.mapGroup = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_2;\n        warp.mapNum = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_4;\n        warp.warpId = -1;\n        sCreditsOverworld_CmdIndex++;\n        warp.x = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_0;\n        warp.y = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_2;\n        sWarpDestination = warp;\n        sCreditsOverworld_CmdLength = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_4;\n        WarpIntoMap();\n        gPaletteFade.bufferTransferDisabled = TRUE;\n        ScriptContext_Init();\n        UnlockPlayerFieldControls();\n        SetMainCallback1(NULL);\n        gFieldCallback2 = FieldCB2_Credits_WaitFade;\n        gMain.state = 0;\n        (*state)++;\n        return FALSE;\n    case 2:\n        if (MapLdr_Credits())\n        {\n            (*state)++;\n            return FALSE;\n        }\n        break;\n    case 3:\n        gFieldCamera.callback = CameraCB_CreditsPan;\n        SetFieldVBlankCallback();\n        *state = 0;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 MapLdr_Credits(void)\n{\n    u8 *state = &gMain.state;\n    switch (*state)\n    {\n    case 0:\n        InitOverworldBgs_NoResetHeap();\n        LoadMapFromWarp(FALSE);\n        (*state)++;\n        break;\n    case 1:\n        ScanlineEffect_Clear();\n        ResetAllPicSprites();\n        ResetCameraUpdateInfo();\n        InstallCameraPanAheadCallback();\n        FieldEffectActiveListClear();\n        StartWeather();\n        ResumePausedWeather();\n        SetUpFieldTasks();\n        RunOnResumeMapScript();\n        (*state)++;\n        break;\n    case 2:\n        InitCurrentFlashLevelScanlineEffect();\n        InitOverworldGraphicsRegisters();\n        (*state)++;\n        break;\n    case 3:\n        move_tilemap_camera_to_upper_left_corner();\n        (*state)++;\n        break;\n    case 4:\n        CopyPrimaryTilesetToVram(gMapHeader.mapLayout);\n        (*state)++;\n        break;\n    case 5:\n        CopySecondaryTilesetToVram(gMapHeader.mapLayout);\n        (*state)++;\n        break;\n    case 6:\n        if (FreeTempTileDataBuffersIfPossible() != TRUE)\n        {\n            LoadMapTilesetPalettes(gMapHeader.mapLayout);\n            (*state)++;\n        }\n        break;\n    case 7:\n        DrawWholeMapView();\n        (*state)++;\n        break;\n    case 8:\n        InitTilesetAnimations();\n        gPaletteFade.bufferTransferDisabled = FALSE;\n        FadeSelectedPals(FADE_FROM_BLACK, 0, 0x3FFFFFFF);\n        (*state)++;\n        break;\n    default:\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void CameraCB_CreditsPan(struct CameraObject * camera)\n{\n    if (sCreditsOverworld_CmdLength == 0)\n    {\n        sCreditsOverworld_CmdIndex++;\n        switch (sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_0)\n        {\n        case CREDITSOVWLDCMD_FC:\n        case CREDITSOVWLDCMD_LOADMAP:\n            return;\n        case CREDITSOVWLDCMD_FF:\n            camera->movementSpeedX = 0;\n            camera->movementSpeedY = 0;\n            camera->callback = NULL;\n            CreateTask(Task_OvwldCredits_FadeOut, 0);\n            return;\n        case CREDITSOVWLDCMD_FB:\n            camera->movementSpeedX = 0;\n            camera->movementSpeedY = 0;\n            camera->callback = NULL;\n            break;\n        case CREDITSOVWLDCMD_END:\n            camera->movementSpeedX = 0;\n            camera->movementSpeedY = 0;\n            camera->callback = NULL;\n            return;\n        default:\n            sCreditsOverworld_CmdLength = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_4;\n            camera->movementSpeedX = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_0;\n            camera->movementSpeedY = sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_2;\n            break;\n        }\n    }\n    if (sCreditsOverworld_Script[sCreditsOverworld_CmdIndex].unk_0 == 0xFF)\n    {\n        camera->movementSpeedX = 0;\n        camera->movementSpeedY = 0;\n    }\n    else\n        sCreditsOverworld_CmdLength--;\n}\n\nstatic void Task_OvwldCredits_FadeOut(u8 taskId)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n    gTasks[taskId].func = Task_OvwldCredits_WaitFade;\n}\n\nstatic void Task_OvwldCredits_WaitFade(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        CleanupOverworldWindowsAndTilemaps();\n        SetMainCallback2(CB2_LoadMap);\n        DestroyTask(taskId);\n    }\n}\n\n// Link related\n\nstatic u8 (*const sLinkPlayerMovementModes[])(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8) =\n{\n    [MOVEMENT_MODE_FREE]     = MovementEventModeCB_Normal,\n    [MOVEMENT_MODE_FROZEN]   = MovementEventModeCB_Ignored,\n    [MOVEMENT_MODE_SCRIPTED] = MovementEventModeCB_Normal_2,\n};\n\n// These handlers return TRUE if the movement was scripted and successful, and FALSE otherwise.\nstatic bool8 (*const sLinkPlayerFacingHandlers[])(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8) =\n{\n    [DIR_NONE]  = FacingHandler_DoNothing,\n    [DIR_SOUTH] = FacingHandler_DpadMovement,\n    [DIR_NORTH] = FacingHandler_DpadMovement,\n    [DIR_WEST]  = FacingHandler_DpadMovement,\n    [DIR_EAST]  = FacingHandler_DpadMovement,\n};\n\nstatic bool8 (*const sUnusedLinkPlayerFacingHandlers[])(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8) =\n{\n    FacingHandler_DoNothing,\n    FacingHandler_DoNothing,\n    FacingHandler_ForcedFacingChange,\n    FacingHandler_ForcedFacingChange,\n    FacingHandler_ForcedFacingChange,\n    FacingHandler_ForcedFacingChange,\n};\n\n// These handlers are run after an attempted movement.\nstatic void (*const sMovementStatusHandler[])(struct LinkPlayerObjectEvent *, struct ObjectEvent *) = {\n    [FALSE] = MovementStatusHandler_EnterFreeMode,\n    [TRUE]  = MovementStatusHandler_TryAdvanceScript,\n};\n\nstatic void CB1_UpdateLinkState(void)\n{\n    if (gWirelessCommType == 0 || !IsRfuRecvQueueEmpty() || !IsSendingKeysToLink())\n    {\n        u8 selfId = gLocalLinkPlayerId;\n        UpdateAllLinkPlayers(gLinkPartnersHeldKeys, selfId);\n\n        // Note: Because guestId is between 0 and 4, while the smallest key code is\n        // LINK_KEY_CODE_EMPTY, this is functionally equivalent to `sPlayerKeyInterceptCallback(0)`.\n        // It is expecting the callback to be KeyInterCB_SelfIdle, and that will\n        // completely ignore any input parameters.\n        //\n        // UpdateHeldKeyCode performs a sanity check on its input; if\n        // sPlayerKeyInterceptCallback echoes back the argument, which is selfId, then\n        // it'll use LINK_KEY_CODE_EMPTY instead.\n        //\n        // Note 2: There are some key intercept callbacks that treat the key as a player\n        // ID. It's so hacky.\n        UpdateHeldKeyCode(sPlayerKeyInterceptCallback(selfId));\n        ClearAllPlayerKeys();\n    }\n}\n\nstatic void ResetAllMultiplayerState(void)\n{\n    ResetAllLinkStates();\n    SetKeyInterceptCallback(KeyInterCB_SelfIdle);\n}\n\nstatic void ClearAllPlayerKeys(void)\n{\n    ResetPlayerHeldKeys(gLinkPartnersHeldKeys);\n}\n\nstatic void SetKeyInterceptCallback(KeyInterCB func)\n{\n    sRfuKeepAliveTimer = 0;\n    sPlayerKeyInterceptCallback = func;\n}\n\n// Once every ~60 frames, if the link state hasn't changed (timer reset by calls\n// to SetKeyInterceptCallback), it does a bunch of sanity checks on the connection.\n// I'm not sure if sRfuKeepAliveTimer is reset in the process, though; rfu stuff is\n// still undocumented.\nstatic void CheckRfuKeepAliveTimer(void)\n{\n    if (gWirelessCommType != 0 && ++sRfuKeepAliveTimer > 60)\n        LinkRfu_FatalError();\n}\n\nstatic void ResetAllLinkStates(void)\n{\n    s32 i;\n    for (i = 0; i < 4; i++)\n        sPlayerLinkStates[i] = PLAYER_LINK_STATE_IDLE;\n}\n\n// Returns true if all connected players are in linkState.\nstatic bool32 AreAllPlayersInLinkState(u16 linkState)\n{\n    s32 i;\n    s32 count = gFieldLinkPlayerCount;\n\n    for (i = 0; i < count; i++)\n        if (sPlayerLinkStates[i] != linkState)\n            return FALSE;\n    return TRUE;\n}\n\nstatic bool32 IsAnyPlayerInLinkState(u16 linkState)\n{\n    s32 i;\n    s32 count = gFieldLinkPlayerCount;\n\n    for (i = 0; i < count; i++)\n        if (sPlayerLinkStates[i] == linkState)\n            return TRUE;\n    return FALSE;\n}\n\nstatic void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct CableClubPlayer *player, u16 *forceFacing)\n{\n    const u8 *script;\n\n    if (sPlayerLinkStates[playerId] == PLAYER_LINK_STATE_IDLE)\n    {\n        script = TryGetTileEventScript(player);\n        if (script)\n        {\n            *forceFacing = GetDirectionForEventScript(script);\n            sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY;\n            if (player->isLocalPlayer)\n            {\n                SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);\n                RunInteractLocalPlayerScript(script);\n            }\n            return;\n        }\n        if (IsAnyPlayerInLinkState(PLAYER_LINK_STATE_EXITING_ROOM) == TRUE)\n        {\n            sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY;\n            if (player->isLocalPlayer)\n            {\n                SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);\n                RunTerminateLinkScript();\n            }\n            return;\n        }\n\n        switch (key)\n        {\n        case LINK_KEY_CODE_START_BUTTON:\n            if (CanCableClubPlayerPressStart(player))\n            {\n                sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY;\n                if (player->isLocalPlayer)\n                {\n                    SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);\n                    InitLinkRoomStartMenuScript();\n                }\n            }\n            break;\n        case LINK_KEY_CODE_DPAD_DOWN:\n            if (PlayerIsAtSouthExit(player) == TRUE)\n            {\n                sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY;\n                if (player->isLocalPlayer)\n                {\n                    SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);\n                    CreateConfirmLeaveTradeRoomPrompt();\n                }\n            }\n            break;\n        case LINK_KEY_CODE_A_BUTTON:\n            script = TryInteractWithPlayer(player);\n            if (script)\n            {\n                sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY;\n                if (player->isLocalPlayer)\n                {\n                    SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);\n                    InitMenuBasedScript(script);\n                }\n            }\n            break;\n        case LINK_KEY_CODE_HANDLE_RECV_QUEUE:\n            if (IsCableClubPlayerUnfrozen(player))\n            {\n                sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY;\n                if (player->isLocalPlayer)\n                {\n                    SetKeyInterceptCallback(KeyInterCB_DeferToRecvQueue);\n                    InitLinkPlayerQueueScript();\n                }\n            }\n            break;\n        case LINK_KEY_CODE_HANDLE_SEND_QUEUE:\n            if (IsCableClubPlayerUnfrozen(player))\n            {\n                sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY;\n                if (player->isLocalPlayer)\n                {\n                    SetKeyInterceptCallback(KeyInterCB_DeferToSendQueue);\n                    InitLinkPlayerQueueScript();\n                }\n            }\n            break;\n        }\n    }\n\n    switch (key)\n    {\n    case LINK_KEY_CODE_EXIT_ROOM:\n        sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_EXITING_ROOM;\n        break;\n    case LINK_KEY_CODE_READY:\n        sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_READY;\n        break;\n    case LINK_KEY_CODE_IDLE:\n        sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_IDLE;\n        if (player->isLocalPlayer)\n            SetKeyInterceptCallback(KeyInterCB_SelfIdle);\n        break;\n    case LINK_KEY_CODE_EXIT_SEAT:\n        if (sPlayerLinkStates[playerId] == PLAYER_LINK_STATE_READY)\n            sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY;\n        break;\n    }\n}\n\nstatic void UpdateAllLinkPlayers(u16 *keys, s32 selfId)\n{\n    struct CableClubPlayer player;\n    s32 i;\n\n    for (i = 0; i < MAX_LINK_PLAYERS; i++)\n    {\n        u8 key = keys[i];\n        u16 setFacing = FACING_NONE;\n        LoadCableClubPlayer(i, selfId, &player);\n        HandleLinkPlayerKeyInput(i, key, &player, &setFacing);\n        if (sPlayerLinkStates[i] == PLAYER_LINK_STATE_IDLE)\n            setFacing = GetDirectionForDpadKey(key);\n        SetPlayerFacingDirection(i, setFacing);\n    }\n}\n\nstatic void UpdateHeldKeyCode(u16 key)\n{\n    if (key >= LINK_KEY_CODE_EMPTY && key <= LINK_KEY_CODE_EXIT_SEAT)\n        gHeldKeyCodeToSend = key;\n    else\n        gHeldKeyCodeToSend = LINK_KEY_CODE_EMPTY;\n\n    if (gWirelessCommType != 0\n        && GetLinkSendQueueLength() > 1\n        && IsUpdateLinkStateCBActive() == TRUE\n        && IsSendingKeysToLink() == TRUE)\n    {\n        switch (key)\n        {\n        case LINK_KEY_CODE_EMPTY:\n        case LINK_KEY_CODE_DPAD_DOWN:\n        case LINK_KEY_CODE_DPAD_UP:\n        case LINK_KEY_CODE_DPAD_LEFT:\n        case LINK_KEY_CODE_DPAD_RIGHT:\n        case LINK_KEY_CODE_START_BUTTON:\n        case LINK_KEY_CODE_A_BUTTON:\n            gHeldKeyCodeToSend = LINK_KEY_CODE_NULL;\n            break;\n        }\n    }\n}\n\nstatic u16 KeyInterCB_ReadButtons(u32 key)\n{\n    if (JOY_HELD(DPAD_UP))\n        return LINK_KEY_CODE_DPAD_UP;\n    else if (JOY_HELD(DPAD_DOWN))\n        return LINK_KEY_CODE_DPAD_DOWN;\n    else if (JOY_HELD(DPAD_LEFT))\n        return LINK_KEY_CODE_DPAD_LEFT;\n    else if (JOY_HELD(DPAD_RIGHT))\n        return LINK_KEY_CODE_DPAD_RIGHT;\n    else if (JOY_NEW(START_BUTTON))\n        return LINK_KEY_CODE_START_BUTTON;\n    else if (JOY_NEW(A_BUTTON))\n        return LINK_KEY_CODE_A_BUTTON;\n    else\n        return LINK_KEY_CODE_EMPTY;\n}\n\nstatic u16 GetDirectionForDpadKey(u16 a1)\n{\n    switch (a1)\n    {\n    case LINK_KEY_CODE_DPAD_RIGHT:\n        return FACING_RIGHT;\n    case LINK_KEY_CODE_DPAD_LEFT:\n        return FACING_LEFT;\n    case LINK_KEY_CODE_DPAD_UP:\n        return FACING_UP;\n    case LINK_KEY_CODE_DPAD_DOWN:\n        return FACING_DOWN;\n    default:\n        return FACING_NONE;\n    }\n}\n\n// Overwrites the keys with 0x11\nstatic void ResetPlayerHeldKeys(u16 *keys)\n{\n    s32 i;\n    for (i = 0; i < 4; i++)\n        keys[i] = LINK_KEY_CODE_EMPTY;\n}\n\nstatic u16 KeyInterCB_SelfIdle(u32 key)\n{\n    if (ArePlayerFieldControlsLocked() == TRUE)\n        return LINK_KEY_CODE_EMPTY;\n    if (GetLinkRecvQueueLength() > 4)\n        return LINK_KEY_CODE_HANDLE_RECV_QUEUE;\n    if (GetLinkSendQueueLength() <= 4)\n        return KeyInterCB_ReadButtons(key);\n    return LINK_KEY_CODE_HANDLE_SEND_QUEUE;\n}\n\nstatic u16 KeyInterCB_Idle(u32 key)\n{\n    CheckRfuKeepAliveTimer();\n    return LINK_KEY_CODE_EMPTY;\n}\n\n// Ignore the player's inputs as long as there is an event script\n// in ScriptContext2.\nstatic u16 KeyInterCB_DeferToEventScript(u32 key)\n{\n    u16 retVal;\n    if (ArePlayerFieldControlsLocked() == TRUE)\n    {\n        retVal = LINK_KEY_CODE_EMPTY;\n    }\n    else\n    {\n        retVal = LINK_KEY_CODE_IDLE;\n        SetKeyInterceptCallback(KeyInterCB_Idle);\n    }\n    return retVal;\n}\n\n// Ignore the player's inputs as long as there are events being recived.\nstatic u16 KeyInterCB_DeferToRecvQueue(u32 key)\n{\n    u16 retVal;\n    if (GetLinkRecvQueueLength() > 2)\n    {\n        retVal = LINK_KEY_CODE_EMPTY;\n    }\n    else\n    {\n        retVal = LINK_KEY_CODE_IDLE;\n        UnlockPlayerFieldControls();\n        SetKeyInterceptCallback(KeyInterCB_Idle);\n    }\n    return retVal;\n}\n\n// Ignore the player's inputs as long as there are events being sent.\nstatic u16 KeyInterCB_DeferToSendQueue(u32 key)\n{\n    u16 retVal;\n    if (GetLinkSendQueueLength() > 2)\n    {\n        retVal = LINK_KEY_CODE_EMPTY;\n    }\n    else\n    {\n        retVal = LINK_KEY_CODE_IDLE;\n        UnlockPlayerFieldControls();\n        SetKeyInterceptCallback(KeyInterCB_Idle);\n    }\n    return retVal;\n}\n\nstatic u16 KeyInterCB_DoNothingAndKeepAlive(u32 key)\n{\n    CheckRfuKeepAliveTimer();\n    return LINK_KEY_CODE_EMPTY;\n}\n\nstatic u16 KeyInterCB_Ready(u32 keyOrPlayerId)\n{\n    if (sPlayerLinkStates[keyOrPlayerId] == PLAYER_LINK_STATE_READY)\n    {\n        if (JOY_NEW(B_BUTTON))\n        {\n            SetKeyInterceptCallback(KeyInterCB_DoNothingAndKeepAlive);\n            return LINK_KEY_CODE_EXIT_SEAT;\n        }\n        else\n        {\n            return LINK_KEY_CODE_EMPTY;\n        }\n    }\n    else\n    {\n        CheckRfuKeepAliveTimer();\n        return LINK_KEY_CODE_EMPTY;\n    }\n}\n\nstatic u16 KeyInterCB_SetReady(u32 a1)\n{\n    SetKeyInterceptCallback(KeyInterCB_Ready);\n    return LINK_KEY_CODE_READY;\n}\n\nstatic u16 KeyInterCB_SendNothing(u32 key)\n{\n    return LINK_KEY_CODE_EMPTY;\n}\n\nstatic u16 KeyInterCB_WaitForPlayersToExit(u32 keyOrPlayerId)\n{\n    // keyOrPlayerId could be any keycode. This callback does no sanity checking\n    // on the size of the key. It's assuming that it is being called from\n    // CB1_UpdateLinkState.\n    if (sPlayerLinkStates[keyOrPlayerId] != PLAYER_LINK_STATE_EXITING_ROOM)\n        CheckRfuKeepAliveTimer();\n    if (AreAllPlayersInLinkState(PLAYER_LINK_STATE_EXITING_ROOM) == TRUE)\n    {\n        ScriptContext_SetupScript(CableClub_EventScript_DoLinkRoomExit);\n        SetKeyInterceptCallback(KeyInterCB_SendNothing);\n    }\n    return LINK_KEY_CODE_EMPTY;\n}\n\nstatic u16 KeyInterCB_SendExitRoomKey(u32 key)\n{\n    SetKeyInterceptCallback(KeyInterCB_WaitForPlayersToExit);\n    return LINK_KEY_CODE_EXIT_ROOM;\n}\n\n// Duplicate function.\nstatic u16 KeyInterCB_SendNothing_2(u32 key)\n{\n    return LINK_KEY_CODE_EMPTY;\n}\n\nu32 GetCableClubPartnersReady(void)\n{\n    if (IsAnyPlayerInLinkState(PLAYER_LINK_STATE_EXITING_ROOM) == TRUE)\n        return CABLE_SEAT_FAILED;\n    if (sPlayerKeyInterceptCallback == KeyInterCB_Ready && sPlayerLinkStates[gLocalLinkPlayerId] != PLAYER_LINK_STATE_READY)\n        return CABLE_SEAT_WAITING;\n    if (sPlayerKeyInterceptCallback == KeyInterCB_DoNothingAndKeepAlive && sPlayerLinkStates[gLocalLinkPlayerId] == PLAYER_LINK_STATE_BUSY)\n        return CABLE_SEAT_FAILED;\n    if (AreAllPlayersInLinkState(PLAYER_LINK_STATE_READY) != FALSE)\n        return CABLE_SEAT_SUCCESS;\n    return CABLE_SEAT_WAITING;\n}\n\nstatic bool32 IsAnyPlayerExitingCableClub(void)\n{\n    return IsAnyPlayerInLinkState(PLAYER_LINK_STATE_EXITING_ROOM);\n}\n\nu16 SetInCableClubSeat(void)\n{\n    SetKeyInterceptCallback(KeyInterCB_SetReady);\n    return 0;\n}\n\nu16 SetLinkWaitingForScript(void)\n{\n    SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);\n    return 0;\n}\n\n// The exit room key will be sent at the next opportunity.\n// The return value is meaningless.\nu16 QueueExitLinkRoomKey(void)\n{\n    SetKeyInterceptCallback(KeyInterCB_SendExitRoomKey);\n    return 0;\n}\n\nu16 SetStartedCableClubActivity(void)\n{\n    SetKeyInterceptCallback(KeyInterCB_SendNothing_2);\n    return 0;\n}\n\nstatic void LoadCableClubPlayer(s32 linkPlayerId, s32 myPlayerId, struct CableClubPlayer *player)\n{\n    s16 x, y;\n\n    player->playerId = linkPlayerId;\n    player->isLocalPlayer = (linkPlayerId == myPlayerId) ? TRUE : FALSE;\n    player->movementMode = gLinkPlayerObjectEvents[linkPlayerId].movementMode;\n    player->facing = GetLinkPlayerFacingDirection(linkPlayerId);\n    GetLinkPlayerCoords(linkPlayerId, &x, &y);\n    player->pos.x = x;\n    player->pos.y = y;\n    player->pos.elevation = GetLinkPlayerElevation(linkPlayerId);\n    player->metatileBehavior = MapGridGetMetatileBehaviorAt(x, y);\n}\n\nstatic bool32 IsCableClubPlayerUnfrozen(struct CableClubPlayer *player)\n{\n    u8 mode = player->movementMode;\n    if (mode == MOVEMENT_MODE_SCRIPTED || mode == MOVEMENT_MODE_FREE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\n// Duplicate function.\nstatic bool32 CanCableClubPlayerPressStart(struct CableClubPlayer *player)\n{\n    u8 mode = player->movementMode;\n    if (mode == MOVEMENT_MODE_SCRIPTED || mode == MOVEMENT_MODE_FREE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic const u8 *TryGetTileEventScript(struct CableClubPlayer *player)\n{\n    if (player->movementMode != MOVEMENT_MODE_SCRIPTED)\n        return FACING_NONE;\n    return GetCoordEventScriptAtMapPosition(&player->pos);\n}\n\nstatic bool32 PlayerIsAtSouthExit(struct CableClubPlayer *player)\n{\n    if (player->movementMode != MOVEMENT_MODE_SCRIPTED && player->movementMode != MOVEMENT_MODE_FREE)\n        return FALSE;\n    else if (!MetatileBehavior_IsSouthArrowWarp(player->metatileBehavior))\n        return FALSE;\n    else if (player->facing != DIR_SOUTH)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic const u8 *TryInteractWithPlayer(struct CableClubPlayer *player)\n{\n    struct MapPosition otherPlayerPos;\n    u8 linkPlayerId;\n\n    if (player->movementMode != MOVEMENT_MODE_FREE && player->movementMode != MOVEMENT_MODE_SCRIPTED)\n        return FACING_NONE;\n\n    otherPlayerPos = player->pos;\n    otherPlayerPos.x += gDirectionToVectors[player->facing].x;\n    otherPlayerPos.y += gDirectionToVectors[player->facing].y;\n    otherPlayerPos.elevation = 0;\n    linkPlayerId = GetLinkPlayerIdAt(otherPlayerPos.x, otherPlayerPos.y);\n\n    if (linkPlayerId != 4)\n    {\n        if (!player->isLocalPlayer)\n            return CableClub_EventScript_TooBusyToNotice;\n        else if (sPlayerLinkStates[linkPlayerId] != PLAYER_LINK_STATE_IDLE)\n            return CableClub_EventScript_TooBusyToNotice;\n        else if (!GetSeeingLinkPlayerCardMsg(linkPlayerId))\n            return CableClub_EventScript_ReadTrainerCard;\n        else\n            return CableClub_EventScript_ReadTrainerCardColored;\n    }\n\n    return GetInteractedLinkPlayerScript(&otherPlayerPos, player->metatileBehavior, player->facing);\n}\n\n// This returns which direction to force the player to look when one of\n// these event scripts runs.\nstatic u16 GetDirectionForEventScript(const u8 *script)\n{\n    if (script == BattleColosseum_4P_EventScript_PlayerSpot0)\n        return FACING_FORCED_RIGHT;\n    else if (script == BattleColosseum_4P_EventScript_PlayerSpot1)\n        return FACING_FORCED_LEFT;\n    else if (script == BattleColosseum_4P_EventScript_PlayerSpot2)\n        return FACING_FORCED_RIGHT;\n    else if (script == BattleColosseum_4P_EventScript_PlayerSpot3)\n        return FACING_FORCED_LEFT;\n    else if (script == RecordCorner_EventScript_Spot0)\n        return FACING_FORCED_RIGHT;\n    else if (script == RecordCorner_EventScript_Spot1)\n        return FACING_FORCED_LEFT;\n    else if (script == RecordCorner_EventScript_Spot2)\n        return FACING_FORCED_RIGHT;\n    else if (script == RecordCorner_EventScript_Spot3)\n        return FACING_FORCED_LEFT;\n    else if (script == BattleColosseum_2P_EventScript_PlayerSpot0)\n        return FACING_FORCED_RIGHT;\n    else if (script == BattleColosseum_2P_EventScript_PlayerSpot1)\n        return FACING_FORCED_LEFT;\n    else if (script == TradeCenter_EventScript_Chair0)\n        return FACING_FORCED_RIGHT;\n    else if (script == TradeCenter_EventScript_Chair1)\n        return FACING_FORCED_LEFT;\n    else\n        return FACING_NONE;\n}\n\nstatic void InitLinkPlayerQueueScript(void)\n{\n    LockPlayerFieldControls();\n}\n\nstatic void InitLinkRoomStartMenuScript(void)\n{\n    PlaySE(SE_WIN_OPEN);\n    ShowStartMenu();\n    LockPlayerFieldControls();\n}\n\nstatic void RunInteractLocalPlayerScript(const u8 *script)\n{\n    PlaySE(SE_SELECT);\n    ScriptContext_SetupScript(script);\n    LockPlayerFieldControls();\n}\n\nstatic void CreateConfirmLeaveTradeRoomPrompt(void)\n{\n    PlaySE(SE_WIN_OPEN);\n    ScriptContext_SetupScript(TradeCenter_ConfirmLeaveRoom);\n    LockPlayerFieldControls();\n}\n\nstatic void InitMenuBasedScript(const u8 *script)\n{\n    PlaySE(SE_SELECT);\n    ScriptContext_SetupScript(script);\n    LockPlayerFieldControls();\n}\n\nstatic void RunTerminateLinkScript(void)\n{\n    ScriptContext_SetupScript(TradeCenter_TerminateLink);\n    LockPlayerFieldControls();\n}\n\nbool32 Overworld_LinkRecvQueueLengthMoreThan2(void)\n{\n    if (!IsUpdateLinkStateCBActive())\n        return FALSE;\n    if (GetLinkRecvQueueLength() >= 3)\n        sReceivingFromLink = TRUE;\n    else\n        sReceivingFromLink = FALSE;\n    return sReceivingFromLink;\n}\n\nbool32 Overworld_RecvKeysFromLinkIsRunning(void)\n{\n    u8 temp;\n\n    if (GetLinkRecvQueueLength() < 2)\n        return FALSE;\n    else if (IsUpdateLinkStateCBActive() != TRUE)\n        return FALSE;\n    else if (IsSendingKeysToLink() != TRUE)\n        return FALSE;\n    else if (sPlayerKeyInterceptCallback == KeyInterCB_DeferToRecvQueue)\n        return TRUE;\n    else if (sPlayerKeyInterceptCallback != KeyInterCB_DeferToEventScript)\n        return FALSE;\n\n    temp = sReceivingFromLink;\n    sReceivingFromLink = FALSE;\n\n    if (temp == TRUE)\n        return TRUE;\n    else if (gPaletteFade.active && gPaletteFade.softwareFadeFinishing)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool32 Overworld_SendKeysToLinkIsRunning(void)\n{\n    if (GetLinkSendQueueLength() < 2)\n        return FALSE;\n    else if (IsUpdateLinkStateCBActive() != TRUE)\n        return FALSE;\n    else if (IsSendingKeysToLink() != TRUE)\n        return FALSE;\n    else if (sPlayerKeyInterceptCallback == KeyInterCB_DeferToSendQueue)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool32 IsSendingKeysOverCable(void)\n{\n    if (gWirelessCommType != 0)\n        return FALSE;\n    else if (!IsSendingKeysToLink())\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic u32 GetLinkSendQueueLength(void)\n{\n    if (gWirelessCommType != 0)\n        return gRfu.sendQueue.count;\n    else\n        return gLink.sendQueue.count;\n}\n\nstatic void ZeroLinkPlayerObjectEvent(struct LinkPlayerObjectEvent *linkPlayerObjEvent)\n{\n    memset(linkPlayerObjEvent, 0, sizeof(struct LinkPlayerObjectEvent));\n}\n\nvoid ClearLinkPlayerObjectEvents(void)\n{\n    memset(gLinkPlayerObjectEvents, 0, sizeof(gLinkPlayerObjectEvents));\n}\n\nstatic void ZeroObjectEvent(struct ObjectEvent *objEvent)\n{\n    memset(objEvent, 0, sizeof(struct ObjectEvent));\n}\n\n// Note: Emerald reuses the direction and range variables during Link mode\n// as special gender and direction values. The types and placement\n// conflict with the usual Event Object struct, thus the definitions.\n#define linkGender(obj) obj->singleMovementActive\n// not even one can reference *byte* aligned bitfield members...\n#define linkDirection(obj) ((u8 *)obj)[offsetof(typeof(*obj), fieldEffectSpriteId) - 1] // -> rangeX\n\nstatic void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 gender)\n{\n    u8 objEventId = GetFirstInactiveObjectEventId();\n    struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];\n    struct ObjectEvent *objEvent = &gObjectEvents[objEventId];\n\n    ZeroLinkPlayerObjectEvent(linkPlayerObjEvent);\n    ZeroObjectEvent(objEvent);\n\n    linkPlayerObjEvent->active = TRUE;\n    linkPlayerObjEvent->linkPlayerId = linkPlayerId;\n    linkPlayerObjEvent->objEventId = objEventId;\n    linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FREE;\n\n    objEvent->active = TRUE;\n    linkGender(objEvent) = gender;\n    linkDirection(objEvent) = DIR_NORTH;\n    objEvent->spriteId = MAX_SPRITES;\n\n    InitLinkPlayerObjectEventPos(objEvent, x, y);\n}\n\nstatic void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s16 y)\n{\n    objEvent->currentCoords.x = x;\n    objEvent->currentCoords.y = y;\n    objEvent->previousCoords.x = x;\n    objEvent->previousCoords.y = y;\n    SetSpritePosToMapCoords(x, y, &objEvent->initialCoords.x, &objEvent->initialCoords.y);\n    objEvent->initialCoords.x += 8;\n    ObjectEventUpdateElevation(objEvent);\n}\n\nstatic void SetLinkPlayerObjectRange(u8 linkPlayerId, u8 dir)\n{\n    if (gLinkPlayerObjectEvents[linkPlayerId].active)\n    {\n        u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;\n        struct ObjectEvent *objEvent = &gObjectEvents[objEventId];\n        linkDirection(objEvent) = dir;\n    }\n}\n\nstatic void DestroyLinkPlayerObject(u8 linkPlayerId)\n{\n    struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];\n    u8 objEventId = linkPlayerObjEvent->objEventId;\n    struct ObjectEvent *objEvent = &gObjectEvents[objEventId];\n    if (objEvent->spriteId != MAX_SPRITES)\n        DestroySprite(&gSprites[objEvent->spriteId]);\n    linkPlayerObjEvent->active = FALSE;\n    objEvent->active = FALSE;\n}\n\n// Returns the spriteId corresponding to this player.\nstatic u8 GetSpriteForLinkedPlayer(u8 linkPlayerId)\n{\n    u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;\n    struct ObjectEvent *objEvent = &gObjectEvents[objEventId];\n    return objEvent->spriteId;\n}\n\nstatic void GetLinkPlayerCoords(u8 linkPlayerId, u16 *x, u16 *y)\n{\n    u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;\n    struct ObjectEvent *objEvent = &gObjectEvents[objEventId];\n    *x = objEvent->currentCoords.x;\n    *y = objEvent->currentCoords.y;\n}\n\nstatic u8 GetLinkPlayerFacingDirection(u8 linkPlayerId)\n{\n    u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;\n    struct ObjectEvent *objEvent = &gObjectEvents[objEventId];\n    return linkDirection(objEvent);\n}\n\nstatic u8 GetLinkPlayerElevation(u8 linkPlayerId)\n{\n    u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;\n    struct ObjectEvent *objEvent = &gObjectEvents[objEventId];\n    return objEvent->currentElevation;\n}\n\nstatic s32 GetLinkPlayerObjectStepTimer(u8 linkPlayerId)\n{\n    u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;\n    struct ObjectEvent *objEvent = &gObjectEvents[objEventId];\n    return 16 - (s8)objEvent->directionSequenceIndex;\n}\n\nstatic u8 GetLinkPlayerIdAt(s16 x, s16 y)\n{\n    u32 i;\n    for (i = 0; i < MAX_LINK_PLAYERS; i++)\n    {\n        if (gLinkPlayerObjectEvents[i].active\n            && (gLinkPlayerObjectEvents[i].movementMode == 0 || gLinkPlayerObjectEvents[i].movementMode == 2))\n        {\n            struct ObjectEvent *objEvent = &gObjectEvents[gLinkPlayerObjectEvents[i].objEventId];\n            if (objEvent->currentCoords.x == x && objEvent->currentCoords.y == y)\n                return i;\n        }\n    }\n    return 4;\n}\n\nstatic void SetPlayerFacingDirection(u8 linkPlayerId, u8 facing)\n{\n    struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];\n    u8 objEventId = linkPlayerObjEvent->objEventId;\n    struct ObjectEvent *objEvent = &gObjectEvents[objEventId];\n\n    if (linkPlayerObjEvent->active)\n    {\n        if (facing > FACING_FORCED_RIGHT)\n        {\n            objEvent->triggerGroundEffectsOnMove = TRUE;\n        }\n        else\n        {\n            // This is a hack to split this code onto two separate lines, without declaring a local variable.\n            // C++ style inline variables would be nice here.\n#define TEMP sLinkPlayerMovementModes[linkPlayerObjEvent->movementMode](linkPlayerObjEvent, objEvent, facing)\n\n            sMovementStatusHandler[TEMP](linkPlayerObjEvent, objEvent);\n\n            // Clean up the hack.\n#undef TEMP\n        }\n    }\n}\n\nstatic u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)\n{\n    return sLinkPlayerFacingHandlers[dir](linkPlayerObjEvent, objEvent, dir);\n}\n\nstatic u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)\n{\n    return FACING_UP;\n}\n\n// Duplicate Function\nstatic u8 MovementEventModeCB_Normal_2(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)\n{\n    return sLinkPlayerFacingHandlers[dir](linkPlayerObjEvent, objEvent, dir);\n}\n\nstatic bool8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)\n{\n    return FALSE;\n}\n\nstatic bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)\n{\n    s16 x, y;\n\n    linkDirection(objEvent) = FlipVerticalAndClearForced(dir, linkDirection(objEvent));\n    ObjectEventMoveDestCoords(objEvent, linkDirection(objEvent), &x, &y);\n\n    if (LinkPlayerDetectCollision(linkPlayerObjEvent->objEventId, linkDirection(objEvent), x, y))\n    {\n        return FALSE;\n    }\n    else\n    {\n        objEvent->directionSequenceIndex = 16;\n        ShiftObjectEventCoords(objEvent, x, y);\n        ObjectEventUpdateElevation(objEvent);\n        return TRUE;\n    }\n}\n\nstatic bool8 FacingHandler_ForcedFacingChange(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)\n{\n    linkDirection(objEvent) = FlipVerticalAndClearForced(dir, linkDirection(objEvent));\n    return FALSE;\n}\n\n// This is called every time a free movement happens. Most of the time it's a No-Op.\nstatic void MovementStatusHandler_EnterFreeMode(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent)\n{\n    linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FREE;\n}\n\nstatic void MovementStatusHandler_TryAdvanceScript(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent)\n{\n    objEvent->directionSequenceIndex--;\n    linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FROZEN;\n    MoveCoords(linkDirection(objEvent), &objEvent->initialCoords.x, &objEvent->initialCoords.y);\n    if (!objEvent->directionSequenceIndex)\n    {\n        ShiftStillObjectEventCoords(objEvent);\n        linkPlayerObjEvent->movementMode = MOVEMENT_MODE_SCRIPTED;\n    }\n}\n\n// Flip Up/Down facing codes. If newFacing doesn't specify a direction, default\n// to oldFacing. Note that this clears also the \"FORCED\" part of the facing code,\n// even for Left/Right codes.\nstatic u8 FlipVerticalAndClearForced(u8 newFacing, u8 oldFacing)\n{\n    switch (newFacing)\n    {\n    case FACING_UP:\n    case FACING_FORCED_UP:\n        return DIR_NORTH;\n    case FACING_DOWN:\n    case FACING_FORCED_DOWN:\n        return DIR_SOUTH;\n    case FACING_LEFT:\n    case FACING_FORCED_LEFT:\n        return DIR_WEST;\n    case FACING_RIGHT:\n    case FACING_FORCED_RIGHT:\n        return DIR_EAST;\n    }\n    return oldFacing;\n}\n\nstatic bool8 LinkPlayerDetectCollision(u8 selfObjEventId, u8 a2, s16 x, s16 y)\n{\n    u32 i;\n    for (i = 0; i < 16; i++)\n    {\n        if (i != selfObjEventId)\n        {\n            if ((gObjectEvents[i].currentCoords.x == x && gObjectEvents[i].currentCoords.y == y)\n                || (gObjectEvents[i].previousCoords.x == x && gObjectEvents[i].previousCoords.y == y))\n            {\n                return TRUE;\n            }\n        }\n    }\n    return MapGridGetCollisionAt(x, y);\n}\n\nstatic void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion)\n{\n    struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];\n    u8 objEventId = linkPlayerObjEvent->objEventId;\n    struct ObjectEvent *objEvent = &gObjectEvents[objEventId];\n    struct Sprite *sprite;\n\n    if (linkPlayerObjEvent->active)\n    {\n        if (gameVersion == VERSION_FIRE_RED || gameVersion == VERSION_LEAF_GREEN)\n        {\n            objEvent->spriteId = CreateObjectGraphicsSprite(\n                GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, linkGender(objEvent)),\n                SpriteCB_LinkPlayer, 0, 0, 0);\n        }\n        else if (gameVersion == VERSION_EMERALD)\n        {\n            objEvent->spriteId = CreateObjectGraphicsSprite(GetEMAvatarGraphicsIdByGender(linkGender(objEvent)), SpriteCB_LinkPlayer, 0, 0, 0);\n        }\n        else\n        {\n            objEvent->spriteId = CreateObjectGraphicsSprite(GetRSAvatarGraphicsIdByGender(linkGender(objEvent)), SpriteCB_LinkPlayer, 0, 0, 0);\n        }\n\n        sprite = &gSprites[objEvent->spriteId];\n        sprite->coordOffsetEnabled = TRUE;\n        sprite->data[0] = linkPlayerId;\n        objEvent->triggerGroundEffectsOnMove = FALSE;\n    }\n}\n\nstatic void SpriteCB_LinkPlayer(struct Sprite *sprite)\n{\n    struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[sprite->data[0]];\n    struct ObjectEvent *objEvent = &gObjectEvents[linkPlayerObjEvent->objEventId];\n    sprite->x = objEvent->initialCoords.x;\n    sprite->y = objEvent->initialCoords.y;\n    SetObjectSubpriorityByElevation(objEvent->previousElevation, sprite, 1);\n    sprite->oam.priority = ElevationToPriority(objEvent->previousElevation);\n\n    if (!linkPlayerObjEvent->movementMode != MOVEMENT_MODE_FREE)\n        StartSpriteAnim(sprite, GetFaceDirectionAnimNum(linkDirection(objEvent)));\n    else\n        StartSpriteAnimIfDifferent(sprite, GetMoveDirectionAnimNum(linkDirection(objEvent)));\n\n    UpdateObjectEventSpriteInvisibility(sprite, FALSE);\n    if (objEvent->triggerGroundEffectsOnMove)\n    {\n        sprite->invisible = ((sprite->data[7] & 4) >> 2);\n        sprite->data[7]++;\n    }\n}\n"
  },
  {
    "path": "src/palette.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"util.h\"\n#include \"decompress.h\"\n#include \"task.h\"\n\nenum\n{\n    NORMAL_FADE,\n    FAST_FADE,\n    HARDWARE_FADE,\n};\n\n// These are structs for some unused palette system.\n// The full functionality of this system is unknown.\n\n#define NUM_PALETTE_STRUCTS 16\n\nstruct PaletteStructTemplate\n{\n    u16 id;\n    u16 *src;\n    bool16 pst_field_8_0:1;\n    u16 unused:9;\n    u16 size:5;\n    u8 time1;\n    u8 srcCount:5;\n    u8 state:3;\n    u8 time2;\n};\n\nstruct PaletteStruct\n{\n    const struct PaletteStructTemplate *template;\n    bool32 active:1;\n    bool32 flag:1;\n    u32 baseDestOffset:9;\n    u16 destOffset:10;\n    u16 srcIndex:7;\n    u8 countdown1;\n    u8 countdown2;\n};\n\nstatic void PaletteStruct_Copy(struct PaletteStruct *, u32 *);\nstatic void PaletteStruct_Blend(struct PaletteStruct *, u32 *);\nstatic void PaletteStruct_TryEnd(struct PaletteStruct *);\nstatic void PaletteStruct_Reset(u8 paletteNum);\nstatic u8 PaletteStruct_GetPalNum(u16);\nstatic u8 UpdateNormalPaletteFade(void);\nstatic void BeginFastPaletteFadeInternal(u8);\nstatic u8 UpdateFastPaletteFade(void);\nstatic u8 UpdateHardwarePaletteFade(void);\nstatic void UpdateBlendRegisters(void);\nstatic bool8 IsSoftwarePaletteFadeFinishing(void);\nstatic void Task_BlendPalettesGradually(u8 taskId);\n\nALIGNED(4) EWRAM_DATA u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE] = {0};\nALIGNED(4) EWRAM_DATA u16 gPlttBufferFaded[PLTT_BUFFER_SIZE] = {0};\nstatic EWRAM_DATA struct PaletteStruct sPaletteStructs[NUM_PALETTE_STRUCTS] = {0};\nEWRAM_DATA struct PaletteFadeControl gPaletteFade = {0};\nstatic EWRAM_DATA u32 sPlttBufferTransferPending = 0;\nEWRAM_DATA u8 gPaletteDecompressionBuffer[PLTT_SIZE] = {0};\n\nstatic const struct PaletteStructTemplate sDummyPaletteStructTemplate =\n{\n    .id = 0xFFFF,\n    .state = 1\n};\n\nstatic const u8 sRoundedDownGrayscaleMap[] =\n{\n     0,  0,  0,  0,  0,\n     5,  5,  5,  5,  5,\n    11, 11, 11, 11, 11,\n    16, 16, 16, 16, 16,\n    21, 21, 21, 21, 21,\n    27, 27, 27, 27, 27,\n    31, 31\n};\n\nvoid LoadCompressedPalette(const u32 *src, u16 offset, u16 size)\n{\n    LZDecompressWram(src, gPaletteDecompressionBuffer);\n    CpuCopy16(gPaletteDecompressionBuffer, &gPlttBufferUnfaded[offset], size);\n    CpuCopy16(gPaletteDecompressionBuffer, &gPlttBufferFaded[offset], size);\n}\n\nvoid LoadPalette(const void *src, u16 offset, u16 size)\n{\n    CpuCopy16(src, &gPlttBufferUnfaded[offset], size);\n    CpuCopy16(src, &gPlttBufferFaded[offset], size);\n}\n\nvoid FillPalette(u16 value, u16 offset, u16 size)\n{\n    CpuFill16(value, &gPlttBufferUnfaded[offset], size);\n    CpuFill16(value, &gPlttBufferFaded[offset], size);\n}\n\nvoid TransferPlttBuffer(void)\n{\n    if (!gPaletteFade.bufferTransferDisabled)\n    {\n        void *src = gPlttBufferFaded;\n        void *dest = (void *)PLTT;\n        DmaCopy16(3, src, dest, PLTT_SIZE);\n        sPlttBufferTransferPending = FALSE;\n        if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active)\n            UpdateBlendRegisters();\n    }\n}\n\nu8 UpdatePaletteFade(void)\n{\n    u8 result;\n    u8 dummy = 0;\n\n    if (sPlttBufferTransferPending)\n        return PALETTE_FADE_STATUS_LOADING;\n    if (gPaletteFade.mode == NORMAL_FADE)\n        result = UpdateNormalPaletteFade();\n    else if (gPaletteFade.mode == FAST_FADE)\n        result = UpdateFastPaletteFade();\n    else\n        result = UpdateHardwarePaletteFade();\n    sPlttBufferTransferPending = gPaletteFade.multipurpose1 | dummy;\n    return result;\n}\n\nvoid ResetPaletteFade(void)\n{\n    u32 i;\n\n    for (i = 0; i < NUM_PALETTE_STRUCTS; ++i)\n        PaletteStruct_Reset(i);\n    ResetPaletteFadeControl();\n}\n\nvoid ReadPlttIntoBuffers(void)\n{\n    u32 i;\n    u16 *pltt = (u16 *)PLTT;\n\n    for (i = 0; i < PLTT_BUFFER_SIZE; ++i)\n    {\n        gPlttBufferUnfaded[i] = pltt[i];\n        gPlttBufferFaded[i] = pltt[i];\n    }\n}\n\nbool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor)\n{\n    u8 temp;\n    u16 color = blendColor;\n\n    if (gPaletteFade.active)\n    {\n        return FALSE;\n    }\n    else\n    {\n        gPaletteFade.deltaY = 2;\n        if (delay < 0)\n        {\n            gPaletteFade.deltaY += (delay * -1);\n            delay = 0;\n        }\n        gPaletteFade_selectedPalettes = selectedPalettes;\n        gPaletteFade.delayCounter = delay;\n        gPaletteFade_delay = delay;\n        gPaletteFade.y = startY;\n        gPaletteFade.targetY = targetY;\n        gPaletteFade.blendColor = color;\n        gPaletteFade.active = TRUE;\n        gPaletteFade.mode = NORMAL_FADE;\n        if (startY < targetY)\n            gPaletteFade.yDec = FALSE;\n        else\n            gPaletteFade.yDec = TRUE;\n        UpdatePaletteFade();\n        temp = gPaletteFade.bufferTransferDisabled;\n        gPaletteFade.bufferTransferDisabled = FALSE;\n        CpuCopy32(gPlttBufferFaded, (void *)PLTT, PLTT_SIZE);\n        sPlttBufferTransferPending = FALSE;\n        if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active)\n            UpdateBlendRegisters();\n        gPaletteFade.bufferTransferDisabled = temp;\n        return TRUE;\n    }\n}\n\n// Unused\nstatic bool8 BeginPlttFade(u32 selectedPalettes, u8 delay, u8 startY, u8 targetY, u16 blendColor)\n{\n    ReadPlttIntoBuffers();\n    return BeginNormalPaletteFade(selectedPalettes, delay, startY, targetY, blendColor);\n}\n\n// Unused\nstatic void PaletteStruct_Run(u8 a1, u32 *unkFlags)\n{\n    u32 i;\n\n    for (i = 0; i < NUM_PALETTE_STRUCTS; ++i)\n    {\n        struct PaletteStruct *palstruct = &sPaletteStructs[i];\n\n        if (palstruct->active)\n        {\n            if (palstruct->template->pst_field_8_0 == a1)\n            {\n                u8 srcIndex = palstruct->srcIndex;\n                u8 srcCount = palstruct->template->srcCount;\n\n                if (srcIndex == srcCount)\n                {\n                    PaletteStruct_TryEnd(palstruct);\n                    if (!palstruct->active)\n                        continue;\n                }\n                if (palstruct->countdown1 == 0)\n                    PaletteStruct_Copy(palstruct, unkFlags);\n                else\n                    palstruct->countdown1--;\n                PaletteStruct_Blend(palstruct, unkFlags);\n            }\n        }\n    }\n}\n\nstatic void PaletteStruct_Copy(struct PaletteStruct *palStruct, u32 *unkFlags)\n{\n    s32 srcIndex;\n    s32 srcCount;\n    u8 i = 0;\n    u16 srcOffset = palStruct->srcIndex * palStruct->template->size;\n\n    if (!palStruct->template->pst_field_8_0)\n    {\n        while (i < palStruct->template->size)\n        {\n            gPlttBufferUnfaded[palStruct->destOffset] = palStruct->template->src[srcOffset];\n            gPlttBufferFaded[palStruct->destOffset] = palStruct->template->src[srcOffset];\n            i++;\n            palStruct->destOffset++;\n            srcOffset++;\n        }\n    }\n    else\n    {\n        while (i < palStruct->template->size)\n        {\n            gPlttBufferFaded[palStruct->destOffset] = palStruct->template->src[srcOffset];\n            i++;\n            palStruct->destOffset++;\n            srcOffset++;\n        }\n    }\n    palStruct->destOffset = palStruct->baseDestOffset;\n    palStruct->countdown1 = palStruct->template->time1;\n    palStruct->srcIndex++;\n    srcIndex = palStruct->srcIndex;\n    srcCount = palStruct->template->srcCount;\n    if (srcIndex >= srcCount)\n    {\n        if (palStruct->countdown2)\n            palStruct->countdown2--;\n        palStruct->srcIndex = 0;\n    }\n    *unkFlags |= 1 << (palStruct->baseDestOffset >> 4);\n}\n\nstatic void PaletteStruct_Blend(struct PaletteStruct *palStruct, u32 *unkFlags)\n{\n    if (gPaletteFade.active && ((1 << (palStruct->baseDestOffset >> 4)) & gPaletteFade_selectedPalettes))\n    {\n        if (!palStruct->template->pst_field_8_0)\n        {\n            if (gPaletteFade.delayCounter != gPaletteFade_delay)\n                BlendPalette(palStruct->baseDestOffset,\n                             palStruct->template->size,\n                             gPaletteFade.y,\n                             gPaletteFade.blendColor);\n        }\n        else\n        {\n            if (!gPaletteFade.delayCounter)\n            {\n                if (palStruct->countdown1 != palStruct->template->time1)\n                {\n                    u32 srcOffset = palStruct->srcIndex * palStruct->template->size;\n                    u32 i;\n\n                    for (i = 0; i < palStruct->template->size; i++)\n                        gPlttBufferFaded[palStruct->baseDestOffset + i] = palStruct->template->src[srcOffset + i];\n                }\n            }\n        }\n    }\n}\n\nstatic void PaletteStruct_TryEnd(struct PaletteStruct *palStruct)\n{\n    if (!palStruct->countdown2)\n    {\n        s32 state = palStruct->template->state;\n\n        if (state == 0)\n        {\n            palStruct->srcIndex = 0;\n            palStruct->countdown1 = palStruct->template->time1;\n            palStruct->countdown2 = palStruct->template->time2;\n            palStruct->destOffset = palStruct->baseDestOffset;\n        }\n        else\n        {\n            if (state < 0)\n                return;\n            if (state > 2)\n                return;\n            PaletteStruct_ResetById(palStruct->template->id);\n        }\n    }\n    else\n    {\n        palStruct->countdown2--;\n    }\n}\n\nvoid PaletteStruct_ResetById(u16 id)\n{\n    u8 paletteNum = PaletteStruct_GetPalNum(id);\n    if (paletteNum != NUM_PALETTE_STRUCTS)\n        PaletteStruct_Reset(paletteNum);\n}\n\nstatic void PaletteStruct_Reset(u8 paletteNum)\n{\n    sPaletteStructs[paletteNum].template = &sDummyPaletteStructTemplate;\n    sPaletteStructs[paletteNum].active = FALSE;\n    sPaletteStructs[paletteNum].baseDestOffset = 0;\n    sPaletteStructs[paletteNum].destOffset = 0;\n    sPaletteStructs[paletteNum].srcIndex = 0;\n    sPaletteStructs[paletteNum].flag = FALSE;\n    sPaletteStructs[paletteNum].countdown1 = 0;\n    sPaletteStructs[paletteNum].countdown2 = 0;\n}\n\nvoid ResetPaletteFadeControl(void)\n{\n    gPaletteFade.multipurpose1 = 0;\n    gPaletteFade.multipurpose2 = 0;\n    gPaletteFade.delayCounter = 0;\n    gPaletteFade.y = 0;\n    gPaletteFade.targetY = 0;\n    gPaletteFade.blendColor = 0;\n    gPaletteFade.active = FALSE;\n    gPaletteFade.multipurpose2 = 0; // assign same value twice\n    gPaletteFade.yDec = FALSE;\n    gPaletteFade.bufferTransferDisabled = FALSE;\n    gPaletteFade.shouldResetBlendRegisters = FALSE;\n    gPaletteFade.hardwareFadeFinishing = FALSE;\n    gPaletteFade.softwareFadeFinishing = FALSE;\n    gPaletteFade.softwareFadeFinishingCounter = 0;\n    gPaletteFade.objPaletteToggle = 0;\n    gPaletteFade.deltaY = 2;\n}\n\nstatic void PaletteStruct_SetUnusedFlag(u16 id)\n{\n    u8 paletteNum = PaletteStruct_GetPalNum(id);\n    if (paletteNum != NUM_PALETTE_STRUCTS)\n        sPaletteStructs[paletteNum].flag = TRUE;\n}\n\nstatic void PaletteStruct_ClearUnusedFlag(u16 id)\n{\n    u8 paletteNum = PaletteStruct_GetPalNum(id);\n    if (paletteNum != NUM_PALETTE_STRUCTS)\n        sPaletteStructs[paletteNum].flag = FALSE;\n}\n\nstatic u8 PaletteStruct_GetPalNum(u16 id)\n{\n    u32 i;\n\n    for (i = 0; i < NUM_PALETTE_STRUCTS; i++)\n        if (sPaletteStructs[i].template->id == id)\n            return i;\n    return NUM_PALETTE_STRUCTS;\n}\n\nstatic u8 UpdateNormalPaletteFade(void)\n{\n    u16 paletteOffset;\n    u16 selectedPalettes;\n\n    if (!gPaletteFade.active)\n        return PALETTE_FADE_STATUS_DONE;\n    if (IsSoftwarePaletteFadeFinishing())\n    {\n        return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE;\n    }\n    else\n    {\n        if (!gPaletteFade.objPaletteToggle)\n        {\n            if (gPaletteFade.delayCounter < gPaletteFade_delay)\n            {\n                gPaletteFade.delayCounter++;\n                return 2;\n            }\n            gPaletteFade.delayCounter = 0;\n        }\n        paletteOffset = 0;\n        if (!gPaletteFade.objPaletteToggle)\n        {\n            selectedPalettes = gPaletteFade_selectedPalettes;\n        }\n        else\n        {\n            selectedPalettes = gPaletteFade_selectedPalettes >> 16;\n            paletteOffset = OBJ_PLTT_OFFSET;\n        }\n        while (selectedPalettes)\n        {\n            if (selectedPalettes & 1)\n                BlendPalette(paletteOffset,\n                             16,\n                             gPaletteFade.y,\n                             gPaletteFade.blendColor);\n            selectedPalettes >>= 1;\n            paletteOffset += 16;\n        }\n        gPaletteFade.objPaletteToggle ^= 1;\n        if (!gPaletteFade.objPaletteToggle)\n        {\n            if (gPaletteFade.y == gPaletteFade.targetY)\n            {\n                gPaletteFade_selectedPalettes = 0;\n                gPaletteFade.softwareFadeFinishing = TRUE;\n            }\n            else\n            {\n                s8 val;\n\n                if (!gPaletteFade.yDec)\n                {\n                    val = gPaletteFade.y;\n                    val += gPaletteFade.deltaY;\n                    if (val > gPaletteFade.targetY)\n                        val = gPaletteFade.targetY;\n                    gPaletteFade.y = val;\n                }\n                else\n                {\n                    val = gPaletteFade.y;\n                    val -= gPaletteFade.deltaY;\n                    if (val < gPaletteFade.targetY)\n                        val = gPaletteFade.targetY;\n                    gPaletteFade.y = val;\n                }\n            }\n        }\n        // gPaletteFade.active cannot change since the last time it was checked. So this\n        // is equivalent to `return PALETTE_FADE_STATUS_ACTIVE;`\n        return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE;\n    }\n}\n\nvoid InvertPlttBuffer(u32 selectedPalettes)\n{\n    u16 paletteOffset = 0;\n\n    while (selectedPalettes)\n    {\n        if (selectedPalettes & 1)\n        {\n            u32 i;\n\n            for (i = 0; i < 16; ++i)\n                gPlttBufferFaded[paletteOffset + i] = ~gPlttBufferFaded[paletteOffset + i];\n        }\n        selectedPalettes >>= 1;\n        paletteOffset += 16;\n    }\n}\n\nvoid TintPlttBuffer(u32 selectedPalettes, s8 r, s8 g, s8 b)\n{\n    u16 paletteOffset = 0;\n\n    while (selectedPalettes)\n    {\n        if (selectedPalettes & 1)\n        {\n            u32 i;\n\n            for (i = 0; i < 16; ++i)\n            {\n                struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[paletteOffset + i];\n                \n                data->r += r;\n                data->g += g;\n                data->b += b;\n            }\n        }\n        selectedPalettes >>= 1;\n        paletteOffset += 16;\n    }\n}\n\nvoid UnfadePlttBuffer(u32 selectedPalettes)\n{\n    u16 paletteOffset = 0;\n\n    while (selectedPalettes)\n    {\n        if (selectedPalettes & 1)\n        {\n            u32 i;\n\n            for (i = 0; i < 16; ++i)\n                gPlttBufferFaded[paletteOffset + i] = gPlttBufferUnfaded[paletteOffset + i];\n        }\n        selectedPalettes >>= 1;\n        paletteOffset += 16;\n    }\n}\n\nvoid BeginFastPaletteFade(u8 submode)\n{\n    gPaletteFade.deltaY = 2;\n    BeginFastPaletteFadeInternal(submode);\n}\n\nstatic void BeginFastPaletteFadeInternal(u8 submode)\n{\n    gPaletteFade.y = 31;\n    gPaletteFade_submode = submode & 0x3F;\n    gPaletteFade.active = TRUE;\n    gPaletteFade.mode = FAST_FADE;\n    if (submode == FAST_FADE_IN_FROM_BLACK)\n        CpuFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE);\n    if (submode == FAST_FADE_IN_FROM_WHITE)\n        CpuFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE);\n    UpdatePaletteFade();\n}\n\nstatic u8 UpdateFastPaletteFade(void)\n{\n    u32 i;\n    u16 paletteOffsetStart, paletteOffsetEnd;\n    s8 r0, g0, b0, r, g, b;\n\n    if (!gPaletteFade.active)\n        return PALETTE_FADE_STATUS_DONE;\n    if (IsSoftwarePaletteFadeFinishing())\n        return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE;\n    if (gPaletteFade.objPaletteToggle)\n    {\n        paletteOffsetStart = OBJ_PLTT_OFFSET;\n        paletteOffsetEnd = PLTT_BUFFER_SIZE;\n    }\n    else\n    {\n        paletteOffsetStart = 0;\n        paletteOffsetEnd = OBJ_PLTT_OFFSET;\n    }\n    switch (gPaletteFade_submode)\n    {\n    case FAST_FADE_IN_FROM_WHITE:\n        for (i = paletteOffsetStart; i < paletteOffsetEnd; ++i)\n        {\n            struct PlttData *unfaded;\n            struct PlttData *faded;\n\n            unfaded = (struct PlttData *)&gPlttBufferUnfaded[i];\n            r0 = unfaded->r;\n            g0 = unfaded->g;\n            b0 = unfaded->b;\n            faded = (struct PlttData *)&gPlttBufferFaded[i];\n            r = faded->r - 2;\n            g = faded->g - 2;\n            b = faded->b - 2;\n            if (r < r0)\n                r = r0;\n            if (g < g0)\n                g = g0;\n            if (b < b0)\n                b = b0;\n            gPlttBufferFaded[i] = r | (g << 5) | (b << 10);\n        }\n        break;\n    case FAST_FADE_OUT_TO_WHITE:\n        for (i = paletteOffsetStart; i < paletteOffsetEnd; ++i)\n        {\n            struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i];\n\n            r = data->r + 2;\n            g = data->g + 2;\n            b = data->b + 2;\n            if (r > 31)\n                r = 31;\n            if (g > 31)\n                g = 31;\n            if (b > 31)\n                b = 31;\n            gPlttBufferFaded[i] = r | (g << 5) | (b << 10);\n        }\n        break;\n    case FAST_FADE_IN_FROM_BLACK:\n        for (i = paletteOffsetStart; i < paletteOffsetEnd; ++i)\n        {\n            struct PlttData *unfaded;\n            struct PlttData *faded;\n\n            unfaded = (struct PlttData *)&gPlttBufferUnfaded[i];\n            r0 = unfaded->r;\n            g0 = unfaded->g;\n            b0 = unfaded->b;\n            faded = (struct PlttData *)&gPlttBufferFaded[i];\n            r = faded->r + 2;\n            g = faded->g + 2;\n            b = faded->b + 2;\n            if (r > r0)\n                r = r0;\n            if (g > g0)\n                g = g0;\n            if (b > b0)\n                b = b0;\n            gPlttBufferFaded[i] = r | (g << 5) | (b << 10);\n        }\n        break;\n    case FAST_FADE_OUT_TO_BLACK:\n        for (i = paletteOffsetStart; i < paletteOffsetEnd; ++i)\n        {\n            struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i];\n\n            r = data->r - 2;\n            g = data->g - 2;\n            b = data->b - 2;\n            if (r < 0)\n                r = 0;\n            if (g < 0)\n                g = 0;\n            if (b < 0)\n                b = 0;\n            gPlttBufferFaded[i] = r | (g << 5) | (b << 10);\n        }\n    }\n    gPaletteFade.objPaletteToggle ^= 1;\n    if (gPaletteFade.objPaletteToggle)\n        // gPaletteFade.active cannot change since the last time it was checked. So this\n        // is equivalent to `return PALETTE_FADE_STATUS_ACTIVE;`\n        return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE;\n    if (gPaletteFade.y - gPaletteFade.deltaY < 0)\n        gPaletteFade.y = 0;\n    else\n        gPaletteFade.y -= gPaletteFade.deltaY;\n    if (gPaletteFade.y == 0)\n    {\n        switch (gPaletteFade_submode)\n        {\n        case FAST_FADE_IN_FROM_WHITE:\n        case FAST_FADE_IN_FROM_BLACK:\n            CpuCopy32(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE);\n            break;\n        case FAST_FADE_OUT_TO_WHITE:\n            CpuFill32(0xFFFFFFFF, gPlttBufferFaded, PLTT_SIZE);\n            break;\n        case FAST_FADE_OUT_TO_BLACK:\n            CpuFill32(0x00000000, gPlttBufferFaded, PLTT_SIZE);\n            break;\n        }\n        gPaletteFade.mode = NORMAL_FADE;\n        gPaletteFade.softwareFadeFinishing = TRUE;\n    }\n    // gPaletteFade.active cannot change since the last time it was checked. So this\n    // is equivalent to `return PALETTE_FADE_STATUS_ACTIVE;`\n    return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE;\n}\n\nvoid BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters)\n{\n    gPaletteFade_blendCnt = blendCnt;\n    gPaletteFade.delayCounter = delay;\n    gPaletteFade_delay = delay;\n    gPaletteFade.y = y;\n    gPaletteFade.targetY = targetY;\n    gPaletteFade.active = TRUE;\n    gPaletteFade.mode = HARDWARE_FADE;\n    gPaletteFade.shouldResetBlendRegisters = shouldResetBlendRegisters & 1;\n    gPaletteFade.hardwareFadeFinishing = FALSE;\n    if (y < targetY)\n        gPaletteFade.yDec = FALSE;\n    else\n        gPaletteFade.yDec = TRUE;\n}\n\nstatic u8 UpdateHardwarePaletteFade(void)\n{\n    if (!gPaletteFade.active)\n        return PALETTE_FADE_STATUS_DONE;\n    if (gPaletteFade.delayCounter < gPaletteFade_delay)\n    {\n        gPaletteFade.delayCounter++;\n        return PALETTE_FADE_STATUS_DELAY;\n    }\n    gPaletteFade.delayCounter = 0;\n    if (!gPaletteFade.yDec)\n    {\n        gPaletteFade.y++;\n        if (gPaletteFade.y > gPaletteFade.targetY)\n        {\n            gPaletteFade.hardwareFadeFinishing++;\n            gPaletteFade.y--;\n        }\n    }\n    else\n    {\n        if (gPaletteFade.y-- - 1 < gPaletteFade.targetY)\n        {\n            gPaletteFade.hardwareFadeFinishing++;\n            gPaletteFade.y++;\n        }\n    }\n\n    if (gPaletteFade.hardwareFadeFinishing)\n    {\n        if (gPaletteFade.shouldResetBlendRegisters)\n        {\n            gPaletteFade_blendCnt = 0;\n            gPaletteFade.y = 0;\n        }\n        gPaletteFade.shouldResetBlendRegisters = FALSE;\n    }\n    // gPaletteFade.active cannot change since the last time it was checked. So this\n    // is equivalent to `return PALETTE_FADE_STATUS_ACTIVE;`\n    return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE;\n}\n\nstatic void UpdateBlendRegisters(void)\n{\n    SetGpuReg(REG_OFFSET_BLDCNT, (u16)gPaletteFade_blendCnt);\n    SetGpuReg(REG_OFFSET_BLDY, gPaletteFade.y);\n    if (gPaletteFade.hardwareFadeFinishing)\n    {\n        gPaletteFade.hardwareFadeFinishing = FALSE;\n        gPaletteFade.mode = 0;\n        gPaletteFade_blendCnt = 0;\n        gPaletteFade.y = 0;\n        gPaletteFade.active = FALSE;\n    }\n}\n\nstatic bool8 IsSoftwarePaletteFadeFinishing(void)\n{\n    if (gPaletteFade.softwareFadeFinishing)\n    {\n        if (gPaletteFade.softwareFadeFinishingCounter == 4)\n        {\n            gPaletteFade.active = FALSE;\n            gPaletteFade.softwareFadeFinishing = FALSE;\n            gPaletteFade.softwareFadeFinishingCounter = 0;\n        }\n        else\n        {\n            gPaletteFade.softwareFadeFinishingCounter++;\n        }\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nvoid BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color)\n{\n    u16 paletteOffset;\n\n    for (paletteOffset = 0; selectedPalettes; paletteOffset += 16)\n    {\n        if (selectedPalettes & 1)\n            BlendPalette(paletteOffset, 16, coeff, color);\n        selectedPalettes >>= 1;\n    }\n}\n\nvoid BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color)\n{\n    // This copy is done via DMA in both RUBY and EMERALD\n    CpuFastCopy(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE);\n    BlendPalettes(selectedPalettes, coeff, color);\n}\n\nvoid TintPalette_GrayScale(u16 *palette, u16 count)\n{\n    s32 r, g, b, i;\n    u32 gray;\n\n    for (i = 0; i < count; ++i)\n    {\n        r = GET_R(*palette);\n        g = GET_G(*palette);\n        b = GET_B(*palette);\n        gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;\n        *palette++ = RGB2(gray, gray, gray);\n    }\n}\n\nvoid TintPalette_GrayScale2(u16 *palette, u16 count)\n{\n    s32 r, g, b, i;\n    u32 gray;\n\n    for (i = 0; i < count; ++i)\n    {\n        r = GET_R(*palette);\n        g = GET_G(*palette);\n        b = GET_B(*palette);\n        gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;\n\n        if (gray > 31)\n            gray = 31;\n        gray = sRoundedDownGrayscaleMap[gray];\n        *palette++ = RGB2(gray, gray, gray);\n    }\n}\n\nvoid TintPalette_SepiaTone(u16 *palette, u16 count)\n{\n    s32 r, g, b, i;\n    u32 gray;\n\n    for (i = 0; i < count; ++i)\n    {\n        r = GET_R(*palette);\n        g = GET_G(*palette);\n        b = GET_B(*palette);\n        gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;\n        r = (u16)((Q_8_8(1.2) * gray)) >> 8;\n        g = (u16)((Q_8_8(1.0) * gray)) >> 8;\n        b = (u16)((Q_8_8(0.94) * gray)) >> 8;\n        if (r > 31)\n            r = 31;\n        *palette++ = RGB2(r, g, b);\n    }\n}\n\nvoid TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone)\n{\n    s32 r, g, b, i;\n    u32 gray;\n\n    for (i = 0; i < count; ++i)\n    {\n        r = GET_R(*palette);\n        g = GET_G(*palette);\n        b = GET_B(*palette);\n        gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;\n        r = (u16)((rTone * gray)) >> 8;\n        g = (u16)((gTone * gray)) >> 8;\n        b = (u16)((bTone * gray)) >> 8;\n        if (r > 31)\n            r = 31;\n        if (g > 31)\n            g = 31;\n        if (b > 31)\n            b = 31;\n        *palette++ = RGB2(r, g, b);\n    }\n}\n\nvoid CopyPaletteInvertedTint(const u16 *src, u16 *dst, u16 count, u8 tone)\n{\n    s32 r, g, b, i;\n    u32 gray;\n\n    if (!tone)\n    {\n        for (i = 0; i < count; i++)\n            *dst++ = *src++;\n    }\n    else\n    {\n        for (i = 0; i < count; src++, dst++, i++)\n        {\n            r = GET_R(*src);\n            g = GET_G(*src);\n            b = GET_B(*src);\n            gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;\n            r += (tone * (gray - r) >> 4);\n            g += (tone * (gray - g) >> 4);\n            b += (tone * (gray - b) >> 4);\n            *dst = RGB2(r, g, b);\n        }\n    }\n}\n\n#define tCoeff       data[0]\n#define tCoeffTarget data[1]\n#define tCoeffDelta  data[2]\n#define tDelay       data[3]\n#define tDelayTimer  data[4]\n#define IDX_PALETTES      5  // data[5] and data[6], set/get via Set/GetWordTaskArg\n#define tColor       data[7]\n#define tId          data[8]\n\n// Blend the selected palettes in a series of steps toward or away from the color.\nvoid BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id)\n{\n    u8 taskId;\n\n    taskId = CreateTask(Task_BlendPalettesGradually, priority);\n    gTasks[taskId].tCoeff = coeff;\n    gTasks[taskId].tCoeffTarget = coeffTarget;\n    if (delay >= 0)\n    {\n        gTasks[taskId].tDelay = delay;\n        gTasks[taskId].tCoeffDelta = 1;\n    }\n    else\n    {\n        gTasks[taskId].tDelay = 0;\n        gTasks[taskId].tCoeffDelta = -delay + 1;\n    }\n    if (coeffTarget < coeff)\n        gTasks[taskId].tCoeffDelta *= -1;\n    SetWordTaskArg(taskId, IDX_PALETTES, selectedPalettes);\n    gTasks[taskId].tColor = color;\n    gTasks[taskId].tId = id;\n    gTasks[taskId].func(taskId);\n}\n\nbool32 IsBlendPalettesGraduallyTaskActive(u8 id)\n{\n    s32 i;\n\n    for (i = 0; i < NUM_TASKS; ++i)\n        if (gTasks[i].isActive == TRUE\n         && gTasks[i].func == Task_BlendPalettesGradually\n         && gTasks[i].tId == id)\n            return TRUE;\n    return FALSE;\n}\n\nvoid DestroyBlendPalettesGraduallyTask(void)\n{\n    u8 taskId;\n\n    while (TRUE)\n    {\n        taskId = FindTaskIdByFunc(Task_BlendPalettesGradually);\n        if (taskId == TASK_NONE)\n            break;\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_BlendPalettesGradually(u8 taskId)\n{\n    u32 palettes;\n    s16 *data;\n    s16 target;\n\n    data = gTasks[taskId].data;\n    palettes = GetWordTaskArg(taskId, IDX_PALETTES);\n    if (++tDelayTimer > tDelay)\n    {\n        tDelayTimer = 0;\n        BlendPalettes(palettes, tCoeff, tColor);\n        target = tCoeffTarget;\n        if (tCoeff == target)\n        {\n            DestroyTask(taskId);\n        }\n        else\n        {\n            tCoeff += tCoeffDelta;\n            if (tCoeffDelta >= 0)\n            {\n                if (tCoeff < target)\n                    return;\n            }\n            else if (tCoeff > target)\n            {\n                return;\n            }\n            tCoeff = target;\n        }\n    }\n}\n"
  },
  {
    "path": "src/palette_util.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"palette_util.h\"\n#include \"util.h\"\n\n// \"RouletteFlash\" is more accurately a general flashing/fading util.\n// This file handles fading the palettes for the color/icon selections on the Roulette wheel\n// but it also handles the \"pulse blend\" effect of Mirage Tower.\n// Neither exist in FRLG, so everything in this file goes unused.\n\nvoid RouletteFlash_Reset(struct RouletteFlashUtil *flash)\n{\n    flash->enabled = 0;\n    flash->flags = 0;\n    memset(&flash->palettes, 0, sizeof(flash->palettes));\n}\n\nu8 RouletteFlash_Add(struct RouletteFlashUtil *flash, u8 id, const struct RouletteFlashSettings *settings)\n{\n    if (id >= ARRAY_COUNT(flash->palettes) || flash->palettes[id].available)\n        return 0xFF;\n\n    flash->palettes[id].settings.color = settings->color;\n    flash->palettes[id].settings.paletteOffset = settings->paletteOffset;\n    flash->palettes[id].settings.numColors = settings->numColors;\n    flash->palettes[id].settings.delay = settings->delay;\n    flash->palettes[id].settings.unk6 = settings->unk6;\n    flash->palettes[id].settings.numFadeCycles = settings->numFadeCycles;\n    flash->palettes[id].settings.unk7_5 = settings->unk7_5;\n    flash->palettes[id].settings.colorDeltaDir = settings->colorDeltaDir;\n    flash->palettes[id].state = 0;\n    flash->palettes[id].available = TRUE;\n    flash->palettes[id].fadeCycleCounter = 0;\n    flash->palettes[id].delayCounter = 0;\n    if (flash->palettes[id].settings.colorDeltaDir < 0)\n        flash->palettes[id].colorDelta = -1;\n    else\n        flash->palettes[id].colorDelta = 1;\n\n    return id;\n}\n\nstatic u8 RouletteFlash_Remove(struct RouletteFlashUtil *flash, u8 id)\n{\n    if (id >= ARRAY_COUNT(flash->palettes))\n        return 0xFF;\n    if (!flash->palettes[id].available)\n        return 0xFF;\n\n    memset(&flash->palettes[id], 0, sizeof(flash->palettes[id]));\n    return id;\n}\n\nstatic u8 RouletteFlash_FadePalette(struct RouletteFlashPalette *pal)\n{\n    u32 i;\n    u8 returnval;\n\n    for (i = 0; i < pal->settings.numColors; i++)\n    {\n        struct PlttData *faded =   (struct PlttData *)&gPlttBufferFaded[pal->settings.paletteOffset + i];\n        struct PlttData *unfaded = (struct PlttData *)&gPlttBufferUnfaded[pal->settings.paletteOffset + i];\n\n        switch (pal->state)\n        {\n        case 1:\n            // Fade color\n            if (faded->r + pal->colorDelta >= 0 && faded->r + pal->colorDelta < 32)\n                faded->r += pal->colorDelta;\n            if (faded->g + pal->colorDelta >= 0 && faded->g + pal->colorDelta < 32)\n                faded->g += pal->colorDelta;\n            if (faded->b + pal->colorDelta >= 0 && faded->b + pal->colorDelta < 32)\n                faded->b += pal->colorDelta;\n            break;\n        case 2:\n            // Fade back to original color\n            if (pal->colorDelta < 0)\n            {\n                if (faded->r + pal->colorDelta >= unfaded->r)\n                    faded->r += pal->colorDelta;\n                if (faded->g + pal->colorDelta >= unfaded->g)\n                    faded->g += pal->colorDelta;\n                if (faded->b + pal->colorDelta >= unfaded->b)\n                    faded->b += pal->colorDelta;\n            }\n            else\n            {\n                if (faded->r + pal->colorDelta <= unfaded->r)\n                    faded->r += pal->colorDelta;\n                if (faded->g + pal->colorDelta <= unfaded->g)\n                    faded->g += pal->colorDelta;\n                if (faded->b + pal->colorDelta <= unfaded->b)\n                    faded->b += pal->colorDelta;\n            }\n            break;\n        }\n    }\n    if ((u32)pal->fadeCycleCounter++ != pal->settings.numFadeCycles)\n    {\n        returnval = 0;\n    }\n    else\n    {\n        pal->fadeCycleCounter = 0;\n        pal->colorDelta *= -1;\n        if (pal->state == 1)\n            pal->state++;\n        else\n            pal->state--;\n        returnval = 1;\n    }\n    return returnval;\n}\n\nstatic u8 RouletteFlash_FlashPalette(struct RouletteFlashPalette *pal)\n{\n    u8 i = 0;\n\n    switch (pal->state)\n    {\n    case 1:\n        // Flash to color\n        for (i = 0; i < pal->settings.numColors; i++)\n            gPlttBufferFaded[pal->settings.paletteOffset + i] = pal->settings.color;\n        pal->state++;\n        break;\n    case 2:\n        // Restore to original color\n        for (i = 0; i < pal->settings.numColors; i++)\n            gPlttBufferFaded[pal->settings.paletteOffset + i] = gPlttBufferUnfaded[pal->settings.paletteOffset + i];\n        pal->state--;\n        break;\n    }\n    return 1;\n}\n\nvoid RouletteFlash_Run(struct RouletteFlashUtil *flash)\n{\n    u8 i = 0;\n\n    if (flash->enabled)\n    {\n        for (i = 0; i < ARRAY_COUNT(flash->palettes); i++)\n        {\n            if ((flash->flags >> i) & 1)\n            {\n                if (--flash->palettes[i].delayCounter == (u8)-1)\n                {\n                    if (flash->palettes[i].settings.color & FLASHUTIL_USE_EXISTING_COLOR)\n                        RouletteFlash_FadePalette(&flash->palettes[i]);\n                    else\n                        RouletteFlash_FlashPalette(&flash->palettes[i]);\n\n                    flash->palettes[i].delayCounter = flash->palettes[i].settings.delay;\n                }\n            }\n        }\n    }\n}\n\nvoid RouletteFlash_Enable(struct RouletteFlashUtil *flash, u16 flags)\n{\n    u8 i = 0;\n\n    flash->enabled++;\n    for (i = 0; i < ARRAY_COUNT(flash->palettes); i++)\n    {\n        if ((flags >> i) & 1)\n        {\n            if (flash->palettes[i].available)\n            {\n                flash->flags |= 1 << i;\n                flash->palettes[i].state = 1;\n            }\n        }\n    }\n}\n\nvoid RouletteFlash_Stop(struct RouletteFlashUtil *flash, u16 flags)\n{\n    u32 i;\n\n    for (i = 0; i < ARRAY_COUNT(flash->palettes); i++)\n    {\n        if ((flash->flags >> i) & 1)\n        {\n            if (flash->palettes[i].available)\n            {\n                if ((flags >> i) & 1)\n                {\n                    u32 offset = flash->palettes[i].settings.paletteOffset;\n                    u16 *faded = &gPlttBufferFaded[offset];\n                    u16 *unfaded = &gPlttBufferUnfaded[offset];\n                    memcpy(faded, unfaded, flash->palettes[i].settings.numColors * 2);\n                    flash->palettes[i].state = 0;\n                    flash->palettes[i].fadeCycleCounter = 0;\n                    flash->palettes[i].delayCounter = 0;\n                    if (flash->palettes[i].settings.colorDeltaDir < 0)\n                        flash->palettes[i].colorDelta = -1;\n                    else\n                        flash->palettes[i].colorDelta = 1;\n                }\n            }\n        }\n    }\n    if (flags == 0xFFFF)\n    {\n        // Stopped all\n        flash->enabled = 0;\n        flash->flags = 0;\n    }\n    else\n    {\n        flash->flags &= ~flags;\n    }\n}\n\nvoid InitPulseBlend(struct PulseBlend *pulseBlend)\n{\n    u8 i = 0;\n    pulseBlend->usedPulseBlendPalettes = 0;\n    memset(&pulseBlend->pulseBlendPalettes, 0, sizeof(pulseBlend->pulseBlendPalettes));\n    for (; i < 16; i++)\n        pulseBlend->pulseBlendPalettes[i].paletteSelector = i;\n}\n\nint InitPulseBlendPaletteSettings(struct PulseBlend *pulseBlend, const struct PulseBlendSettings *settings)\n{\n    u8 i = 0;\n    struct PulseBlendPalette *pulseBlendPalette = NULL;\n\n    if (!pulseBlend->pulseBlendPalettes[0].inUse)\n    {\n        pulseBlendPalette = &pulseBlend->pulseBlendPalettes[0];\n    }\n    else\n    {\n        while (++i < 16)\n        {\n            if (!pulseBlend->pulseBlendPalettes[i].inUse)\n            {\n                pulseBlendPalette = &pulseBlend->pulseBlendPalettes[i];\n                break;\n            }\n        }\n    }\n\n    if (pulseBlendPalette == NULL)\n        return 0xFF;\n    \n    pulseBlendPalette->blendCoeff = 0;\n    pulseBlendPalette->fadeDirection = 0;\n    pulseBlendPalette->available = 1;\n    pulseBlendPalette->inUse = 1;\n    pulseBlendPalette->delayCounter = 0;\n    pulseBlendPalette->fadeCycleCounter = 0;\n    memcpy(&pulseBlendPalette->pulseBlendSettings, settings, sizeof(*settings));\n    return i;\n}\n\nstatic void ClearPulseBlendPalettesSettings(struct PulseBlendPalette *pulseBlendPalette)\n{\n    u32 i;\n\n    if (!pulseBlendPalette->available && pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload)\n    {\n        for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++)\n            gPlttBufferFaded[i] = gPlttBufferUnfaded[i];\n    }\n\n    memset(&pulseBlendPalette->pulseBlendSettings, 0, sizeof(pulseBlendPalette->pulseBlendSettings));\n    pulseBlendPalette->blendCoeff = 0;\n    pulseBlendPalette->fadeDirection = 0;\n    pulseBlendPalette->unk1_5 = 0;\n    pulseBlendPalette->available = 1;\n    pulseBlendPalette->inUse = 0;\n    pulseBlendPalette->fadeCycleCounter = 0;\n    pulseBlendPalette->delayCounter = 0;\n}\n\nvoid UnloadUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection)\n{\n    u16 i = 0;\n\n    if (!multiSelection)\n    {\n        ClearPulseBlendPalettesSettings(&pulseBlend->pulseBlendPalettes[pulseBlendPaletteSelector & 0xF]);\n    }\n    else\n    {\n        for (i = 0; i < 16; i++)\n        {\n            if ((pulseBlendPaletteSelector & 1) && pulseBlend->pulseBlendPalettes[i].inUse)\n                ClearPulseBlendPalettesSettings(&pulseBlend->pulseBlendPalettes[i]);\n\n            pulseBlendPaletteSelector >>= 1;\n        }\n    }\n}\n\nvoid MarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection)\n{\n    u8 i = 0;\n\n    if (!multiSelection)\n    {\n        i = pulseBlendPaletteSelector & 0xF;\n        pulseBlend->pulseBlendPalettes[i].available = 0;\n        pulseBlend->usedPulseBlendPalettes |= 1 << i;\n    }\n    else\n    {\n        for (i = 0; i < 16; i++)\n        {\n            if (!(pulseBlendPaletteSelector & 1) || !pulseBlend->pulseBlendPalettes[i].inUse || !pulseBlend->pulseBlendPalettes[i].available)\n            {\n                pulseBlendPaletteSelector <<= 1;\n            }\n            else\n            {\n                pulseBlend->pulseBlendPalettes[i].available = 0;\n                pulseBlend->usedPulseBlendPalettes |= 1 << i;\n            }\n        }\n    }    \n}\n\nvoid UnmarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection)\n{\n    u32 i;\n    struct PulseBlendPalette *pulseBlendPalette;\n    u8 j = 0;\n\n    if (!multiSelection)\n    {\n        pulseBlendPalette = &pulseBlend->pulseBlendPalettes[pulseBlendPaletteSelector & 0xF];\n        if (!pulseBlendPalette->available && pulseBlendPalette->inUse)\n        {\n            if (pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload)\n            {\n                for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++)\n                    gPlttBufferFaded[i] = gPlttBufferUnfaded[i];\n            }\n\n            pulseBlendPalette->available = 1;\n            pulseBlend->usedPulseBlendPalettes &= ~(1 << j);\n        }\n    }\n    else\n    {\n        for (j = 0; j < 16; j++)\n        {\n            pulseBlendPalette = &pulseBlend->pulseBlendPalettes[j];\n            if (!(pulseBlendPaletteSelector & 1) || pulseBlendPalette->available || !pulseBlendPalette->inUse)\n            {\n                pulseBlendPaletteSelector <<= 1;\n            }\n            else\n            {\n                if (pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload)\n                {\n                    for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++)\n                        gPlttBufferFaded[i] = gPlttBufferUnfaded[i];\n                }\n\n                pulseBlendPalette->available = 1;\n                pulseBlend->usedPulseBlendPalettes &= ~(1 << j);\n            }\n        }\n    }\n}\n\nvoid UpdatePulseBlend(struct PulseBlend *pulseBlend)\n{\n    struct PulseBlendPalette *pulseBlendPalette;\n    u8 i = 0;\n\n    if (pulseBlend->usedPulseBlendPalettes)\n    {\n        for (i = 0; i < 16; i++)\n        {\n            pulseBlendPalette = &pulseBlend->pulseBlendPalettes[i];\n            if ((!pulseBlendPalette->available && pulseBlendPalette->inUse) && (!gPaletteFade.active || !pulseBlendPalette->pulseBlendSettings.unk7_7))\n            {\n                if (--pulseBlendPalette->delayCounter == 0xFF)\n                {\n                    pulseBlendPalette->delayCounter = pulseBlendPalette->pulseBlendSettings.delay;\n                    BlendPalette(pulseBlendPalette->pulseBlendSettings.paletteOffset, pulseBlendPalette->pulseBlendSettings.numColors, pulseBlendPalette->blendCoeff, pulseBlendPalette->pulseBlendSettings.blendColor);\n                    switch (pulseBlendPalette->pulseBlendSettings.fadeType)\n                    {\n                    case 0: // Fade all the way to the max blend amount, then wrap around\n                        // BUG: This comparison will never be true for maxBlendCoeff values that are >= 8. This is because\n                        // maxBlendCoeff is a signed 4-bit field, but blendCoeff is an unsigned 4-bit field. This code is never\n                        // reached, anyway, so the bug is not observable in vanilla gameplay.\n                        if (pulseBlendPalette->blendCoeff++ == pulseBlendPalette->pulseBlendSettings.maxBlendCoeff)\n                        {\n                            pulseBlendPalette->fadeCycleCounter++;\n                            pulseBlendPalette->blendCoeff = 0;\n                        }\n                        break;\n                    case 1: // Fade in and out\n                        if (pulseBlendPalette->fadeDirection)\n                        {\n                            if (--pulseBlendPalette->blendCoeff == 0)\n                            {\n                                pulseBlendPalette->fadeCycleCounter++;\n                                pulseBlendPalette->fadeDirection ^= 1;\n                            }\n                        }\n                        else\n                        {\n                            u8 max = (pulseBlendPalette->pulseBlendSettings.maxBlendCoeff - 1) & 0xF;\n                            if (pulseBlendPalette->blendCoeff++ == max)\n                            {\n                                pulseBlendPalette->fadeCycleCounter++;\n                                pulseBlendPalette->fadeDirection ^= 1;\n                            }\n                        }\n                        break;\n                    case 2: // Flip back and forth\n                        if (pulseBlendPalette->fadeDirection)\n                            pulseBlendPalette->blendCoeff = 0;\n                        else\n                            pulseBlendPalette->blendCoeff = pulseBlendPalette->pulseBlendSettings.maxBlendCoeff & 0xF;\n                        \n                        pulseBlendPalette->fadeDirection ^= 1;\n                        pulseBlendPalette->fadeCycleCounter++;\n                        break;\n                    }\n\n                    if (pulseBlendPalette->pulseBlendSettings.numFadeCycles != 0xFF\n                     && pulseBlendPalette->fadeCycleCounter == pulseBlendPalette->pulseBlendSettings.numFadeCycles)\n                        UnmarkUsedPulseBlendPalettes(pulseBlend, pulseBlendPalette->paletteSelector, FALSE);\n                }\n            }\n        }\n    }\n}\n\n// Below used for the Roulette grid\nvoid FillTilemapRect(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height)\n{\n    u16 *_dest;\n    u32 i;\n    u32 j;\n    i = 0;\n    dest = &dest[top * 32 + left];\n    for (; i < height; i++)\n    {\n        _dest = dest + i * 32;\n        for (j = 0; j < width; j++)\n        {\n            *_dest++ = src;\n        }\n    }\n}\n\nvoid SetTilemapRect(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height)\n{\n    u16 *_dest;\n    u16 *_src = src;\n    u32 i;\n    u32 j;\n    i = 0;\n    dest = &dest[top * 32 + left];\n    for (; i < height; i++)\n    {\n        _dest = dest + i * 32;\n        for (j = 0; j < width; j++)\n        {\n            *_dest++ = *_src++;\n        }\n    }\n}\n"
  },
  {
    "path": "src/party_menu.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"battle_controllers.h\"\n#include \"battle_gfx_sfx_util.h\"\n#include \"battle_interface.h\"\n#include \"battle_tower.h\"\n#include \"berry_pouch.h\"\n#include \"data.h\"\n#include \"decompress.h\"\n#include \"easy_chat.h\"\n#include \"event_data.h\"\n#include \"evolution_scene.h\"\n#include \"field_effect.h\"\n#include \"field_player_avatar.h\"\n#include \"field_fadetransition.h\"\n#include \"field_weather.h\"\n#include \"fieldmap.h\"\n#include \"fldeff.h\"\n#include \"graphics.h\"\n#include \"help_message.h\"\n#include \"help_system.h\"\n#include \"item.h\"\n#include \"item_menu.h\"\n#include \"item_use.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"load_save.h\"\n#include \"mail.h\"\n#include \"mail_data.h\"\n#include \"main.h\"\n#include \"menu.h\"\n#include \"menu_helpers.h\"\n#include \"new_menu_helpers.h\"\n#include \"metatile_behavior.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"player_pc.h\"\n#include \"pokedex.h\"\n#include \"pokemon.h\"\n#include \"pokemon_icon.h\"\n#include \"pokemon_jump.h\"\n#include \"pokemon_special_anim.h\"\n#include \"pokemon_summary_screen.h\"\n#include \"quest_log.h\"\n#include \"region_map.h\"\n#include \"reshow_battle_screen.h\"\n#include \"scanline_effect.h\"\n#include \"script.h\"\n#include \"start_menu.h\"\n#include \"string_util.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"teachy_tv.h\"\n#include \"text_window.h\"\n#include \"tm_case.h\"\n#include \"trade.h\"\n#include \"union_room.h\"\n#include \"constants/battle.h\"\n#include \"constants/easy_chat.h\"\n#include \"constants/field_effects.h\"\n#include \"constants/item_effects.h\"\n#include \"constants/items.h\"\n#include \"constants/maps.h\"\n#include \"constants/moves.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/quest_log.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n\n#define PARTY_PAL_SELECTED     (1 << 0)\n#define PARTY_PAL_FAINTED      (1 << 1)\n#define PARTY_PAL_TO_SWITCH    (1 << 2)\n#define PARTY_PAL_MULTI_ALT    (1 << 3)\n#define PARTY_PAL_SWITCHING    (1 << 4)\n#define PARTY_PAL_TO_SOFTBOIL  (1 << 5)\n#define PARTY_PAL_NO_MON       (1 << 6)\n#define PARTY_PAL_UNUSED       (1 << 7)\n\n#define MENU_DIR_DOWN     1\n#define MENU_DIR_UP      -1\n#define MENU_DIR_RIGHT    2\n#define MENU_DIR_LEFT    -2\n\n#define SLOT_CONFIRM (PARTY_SIZE)\n#define SLOT_CANCEL  (PARTY_SIZE + 1)\n\nenum\n{\n    CAN_LEARN_MOVE,\n    CANNOT_LEARN_MOVE,\n    ALREADY_KNOWS_MOVE,\n    CANNOT_LEARN_MOVE_IS_EGG\n};\n\nenum\n{\n    LEARN_VIA_TMHM,\n    LEARN_VIA_LEVEL_UP,\n    LEARN_VIA_TUTOR,\n};\n\nenum\n{\n    DRAW_TEXT_ONLY,\n    DRAW_MENU_BOX_AND_TEXT,\n    DRAW_MENU_BOX_ONLY,\n};\n\nstruct PartyMenuBoxInfoRects\n{\n    void (*blitFunc)(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 hideHP);\n    u8 dimensions[24];\n    u8 descTextLeft;\n    u8 descTextTop;\n    u8 descTextWidth;\n    u8 descTextHeight;\n};\n\nstruct PartyMenuInternal\n{\n    TaskFunc task;\n    MainCallback exitCallback;\n    u32 chooseMultiple:1;\n    u32 lastSelectedSlot:3;  // Used to return to same slot when going left/right bewtween columns\n    u32 spriteIdConfirmPokeball:7;\n    u32 spriteIdCancelPokeball:7;\n    u32 messageId:14;\n    u8 windowId[3];\n    u8 actions[8];\n    u8 numActions;\n    u16 palBuffer[BG_PLTT_SIZE / sizeof(u16)];\n    s16 data[16];\n};\n\nstruct PartyMenuBox\n{\n    const struct PartyMenuBoxInfoRects *infoRects;\n    const u8 *spriteCoords;\n    u8 windowId;\n    u8 monSpriteId;\n    u8 itemSpriteId;\n    u8 pokeballSpriteId;\n    u8 statusSpriteId;\n};\n\nstatic void BlitBitmapToPartyWindow_LeftColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 hideHP);\nstatic void BlitBitmapToPartyWindow_RightColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 hideHP);\nstatic void CursorCB_Summary(u8 taskId);\nstatic void CursorCB_Switch(u8 taskId);\nstatic void CursorCB_Cancel1(u8 taskId);\nstatic void CursorCB_Item(u8 taskId);\nstatic void CursorCB_Give(u8 taskId);\nstatic void CursorCB_TakeItem(u8 taskId);\nstatic void CursorCB_Mail(u8 taskId);\nstatic void CursorCB_Read(u8 taskId);\nstatic void CursorCB_TakeMail(u8 taskId);\nstatic void CursorCB_Cancel2(u8 taskId);\nstatic void CursorCB_SendMon(u8 taskId);\nstatic void CursorCB_Enter(u8 taskId);\nstatic void CursorCB_NoEntry(u8 taskId);\nstatic void CursorCB_Store(u8 taskId);\nstatic void CursorCB_Register(u8 taskId);\nstatic void CursorCB_Trade1(u8 taskId);\nstatic void CursorCB_Trade2(u8 taskId);\nstatic void CursorCB_FieldMove(u8 taskId);\nstatic bool8 SetUpFieldMove_Fly(void);\nstatic bool8 SetUpFieldMove_Waterfall(void);\nstatic bool8 SetUpFieldMove_Surf(void);\nstatic void CB2_InitPartyMenu(void);\nstatic void ResetPartyMenu(void);\nstatic bool8 ShowPartyMenu(void);\nstatic void SetPartyMonsAllowedInMinigame(void);\nstatic void ExitPartyMenu(void);\nstatic bool8 CreatePartyMonSpritesLoop(void);\nstatic bool8 AllocPartyMenuBg(void);\nstatic bool8 AllocPartyMenuBgGfx(void);\nstatic void InitPartyMenuWindows(u8 layout);\nstatic void InitPartyMenuBoxes(u8 layout);\nstatic void LoadPartyMenuPokeballGfx(void);\nstatic void LoadPartyMenuAilmentGfx(void);\nstatic bool8 RenderPartyMenuBoxes(void);\nstatic void CreateCancelConfirmPokeballSprites(void);\nstatic void CreateCancelConfirmWindows(bool8 chooseMultiple);\nstatic void Task_ExitPartyMenu(u8 taskId);\nstatic void FreePartyPointers(void);\nstatic void PartyPaletteBufferCopy(u8 offset);\nstatic void DisplayPartyPokemonDataForMultiBattle(u8 slot);\nstatic void DisplayPartyPokemonDataForChooseMultiple(u8 slot);\nstatic bool8 DisplayPartyPokemonDataForMoveTutorOrEvolutionItem(u8 slot);\nstatic void DisplayPartyPokemonData(u8 slot);\nstatic void DisplayPartyPokemonDataForWirelessMinigame(u8 slot);\nstatic void LoadPartyBoxPalette(struct PartyMenuBox *menuBox, u8 palFlags);\nstatic void DrawEmptySlot(u8 windowId);\nstatic void DisplayPartyPokemonNickname(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText);\nstatic void DisplayPartyPokemonLevelCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText);\nstatic void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText);\nstatic void DisplayPartyPokemonHPCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText);\nstatic void DisplayPartyPokemonMaxHPCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText);\nstatic void DisplayPartyPokemonHPBarCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox);\nstatic void DisplayPartyPokemonDescriptionText(u8 stringId, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText);\nstatic bool8 GetBattleEntryEligibility(struct Pokemon *mon);\nstatic bool8 IsMonAllowedInMinigame(u8 slot);\nstatic void DisplayPartyPokemonDataToTeachMove(u8 slot, u16 item, u8 tutor);\nstatic u8 CanMonLearnTMTutor(struct Pokemon *mon, u16 item, u8 tutor);\nstatic void DisplayPartyPokemonBarDetail(u8 windowId, const u8 *str, u8 color, const u8 *dimensions);\nstatic void DisplayPartyPokemonLevel(u8 level, struct PartyMenuBox *menuBox);\nstatic void DisplayPartyPokemonGender(u8 gender, u16 species, u8 *nickname, struct PartyMenuBox *menuBox);\nstatic void DisplayPartyPokemonHP(u16 hp, struct PartyMenuBox *menuBox);\nstatic void DisplayPartyPokemonMaxHP(u16 maxhp, struct PartyMenuBox *menuBox);\nstatic void DisplayPartyPokemonHPBar(u16 hp, u16 maxhp, struct PartyMenuBox *menuBox);\nstatic void CreatePartyMonIconSpriteParameterized(u16 species, u32 pid, struct PartyMenuBox *menuBox, u8 priority, bool32 handleDeoxys);\nstatic void CreatePartyMonHeldItemSpriteParameterized(u16 species, u16 item, struct PartyMenuBox *menuBox);\nstatic void CreatePartyMonPokeballSpriteParameterized(u16 species, struct PartyMenuBox *menuBox);\nstatic void CreatePartyMonStatusSpriteParameterized(u16 species, u8 status, struct PartyMenuBox *menuBox);\nstatic void CreatePartyMonIconSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox, u32 slot);\nstatic void CreatePartyMonHeldItemSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox);\nstatic void CreatePartyMonPokeballSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox);\nstatic void CreatePartyMonStatusSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox);\nstatic void CreateCancelConfirmPokeballSprites(void);\nstatic void DrawCancelConfirmButtons(void);\nstatic u8 CreatePokeballButtonSprite(u8 x, u8 y);\nstatic u8 CreateSmallPokeballButtonSprite(u8 x, u8 y);\nstatic u8 GetPartyBoxPaletteFlags(u8 slot, u8 animNum);\nstatic void AnimateSelectedPartyIcon(u8 spriteId, u8 animNum);\nstatic void PartyMenuStartSpriteAnim(u8 spriteId, u8 animNum);\nstatic void Task_ClosePartyMenuAndSetCB2(u8 taskId);\nstatic void UpdatePartyToFieldOrder(void);\nstatic s8 *GetCurrentPartySlotPtr(void);\nstatic u16 PartyMenuButtonHandler(s8 *slotPtr);\nstatic void HandleChooseMonSelection(u8 taskId, s8 *slotPtr);\nstatic void HandleChooseMonCancel(u8 taskId, s8 *slotPtr);\nstatic void MoveCursorToConfirm(void);\nstatic bool8 IsSelectedMonNotEgg(u8 *slotPtr);\nstatic void TryTutorSelectedMon(u8 taskId);\nstatic void TryGiveMailToSelectedMon(u8 taskId);\nstatic void SwitchSelectedMons(u8 taskId);\nstatic void TryEnterMonForMinigame(u8 taskId, u8 slot);\nstatic void Task_TryCreateSelectionWindow(u8 taskId);\nstatic void TryGiveItemOrMailToSelectedMon(u8 taskId);\nstatic void PartyMenuRemoveWindow(u8 *windowId);\nstatic void CB2_SetUpExitToBattleScreen(void);\nstatic void Task_ClosePartyMenuAfterText(u8 taskId);\nstatic void FinishTwoMonAction(u8 taskId);\nstatic void CancelParticipationPrompt(u8 taskId);\nstatic void DisplayCancelChooseMonYesNo(u8 taskId);\nstatic void Task_CancelChooseMonYesNo(u8 taskId);\nstatic void Task_HandleCancelChooseMonYesNoInput(u8 taskId);\nstatic void PartyMenuDisplayYesNoMenu(void);\nstatic void Task_ReturnToChooseMonAfterText(u8 taskId);\nstatic void UpdateCurrentPartySelection(s8 *slotPtr, s8 movementDir);\nstatic void UpdatePartySelectionSingleLayout(s8 *slotPtr, s8 movementDir);\nstatic void UpdatePartySelectionDoubleLayout(s8 *slotPtr, s8 movementDir);\nstatic s8 GetNewSlotDoubleLayout(s8 slotId, s8 movementDir);\nstatic void Task_PrintAndWaitForText(u8 taskId);\nstatic void PartyMenuPrintText(const u8 *text);\nstatic void SetSwappedHeldItemQuestLogEvent(struct Pokemon *mon, u16 item, u16 item2);\nstatic bool16 IsMonAllowedInPokemonJump(struct Pokemon *mon);\nstatic bool16 IsMonAllowedInDodrioBerryPicking(struct Pokemon *mon);\nstatic void Task_CancelParticipationYesNo(u8 taskId);\nstatic void Task_HandleCancelParticipationYesNoInput(u8 taskId);\nstatic void Task_TryCreateSelectionWindow(u8 taskId);\nstatic u16 GetTutorMove(u8 tutor);\nstatic bool8 CanLearnTutorMove(u16 species, u8 tutor);\nstatic void CreateSelectionWindow(void);\nstatic bool8 ShouldUseChooseMonText(void);\nstatic void UpdatePartyMonHPBar(u8 spriteId, struct Pokemon *mon);\nstatic void SpriteCB_UpdatePartyMonIcon(struct Sprite *sprite);\nstatic void SpriteCB_BouncePartyMonIcon(struct Sprite *sprite);\nstatic void SpriteCB_HeldItem(struct Sprite *sprite);\nstatic void UpdatePartyMonHeldItemSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox);\nstatic void ShowOrHideHeldItemSprite(u16 item, struct PartyMenuBox *menuBox);\nstatic void CreateHeldItemSpriteForTrade(u8 spriteId, bool8 isMail);\nstatic void SetPartyMonAilmentGfx(struct Pokemon *mon, struct PartyMenuBox *menuBox);\nstatic void UpdatePartyMonAilmentGfx(u8 status, struct PartyMenuBox *menuBox);\nstatic void SetPartyMonFieldSelectionActions(struct Pokemon *mons, u8 slotId);\nstatic u8 GetPartyMenuActionsTypeInBattle(struct Pokemon *mon);\nstatic u8 GetPartySlotEntryStatus(s8 slot);\nstatic void Task_HandleSelectionMenuInput(u8 taskId);\nstatic void CB2_ShowPokemonSummaryScreen(void);\nstatic void CB2_ReturnToPartyMenuFromSummaryScreen(void);\nstatic void UpdatePartyToBattleOrder(void);\nstatic void SlidePartyMenuBoxOneStep(u8 taskId);\nstatic void Task_SlideSelectedSlotsOffscreen(u8 taskId);\nstatic void SwitchPartyMon(void);\nstatic void Task_SlideSelectedSlotsOnscreen(u8 taskId);\nstatic void CB2_WriteMailToGiveMon(void);\nstatic void Task_SwitchHoldItemsPrompt(u8 taskId);\nstatic void Task_GiveHoldItem(u8 taskId);\nstatic void Task_UpdateHeldItemSprite(u8 taskId);\nstatic void Task_HandleSwitchItemsYesNoInput(u8 taskId);\nstatic void Task_SwitchItemsYesNo(u8 taskId);\nstatic void Task_WriteMailToGiveMonAfterText(u8 taskId);\nstatic void CB2_ReturnToPartyMenuFromWritingMail(void);\nstatic void Task_DisplayGaveMailFromPartyMessage(u8 taskId);\nstatic void CB2_ReadHeldMail(void);\nstatic void CB2_ReturnToPartyMenuFromReadingMail(void);\nstatic void Task_SendMailToPCYesNo(u8 taskId);\nstatic void Task_HandleSendMailToPCYesNoInput(u8 taskId);\nstatic void Task_LoseMailMessageYesNo(u8 taskId);\nstatic void Task_HandleLoseMailMessageYesNoInput(u8 taskId);\nstatic bool8 TrySwitchInPokemon(void);\nstatic void DisplayCantUseFlashMessage(void);\nstatic void DisplayCantUseSurfMessage(void);\nstatic void Task_CancelAfterAorBPress(u8 taskId);\nstatic void DisplayFieldMoveExitAreaMessage(u8 taskId);\nstatic void Task_FieldMoveExitAreaYesNo(u8 taskId);\nstatic void Task_HandleFieldMoveExitAreaYesNoInput(u8 taskId);\nstatic void Task_FieldMoveWaitForFade(u8 taskId);\nstatic u16 GetFieldMoveMonSpecies(void);\nstatic u8 GetPartyLayoutFromBattleType(void);\nstatic void Task_SetSacredAshCB(u8 taskId);\nstatic void CB2_ReturnToBagMenu(void);\nstatic u8 GetPartyIdFromBattleSlot(u8 slot);\nstatic void Task_DisplayHPRestoredMessage(u8 taskId);\nstatic void SetSelectedMoveForPPItem(u8 taskId);\nstatic void ReturnToUseOnWhichMon(u8 taskId);\nstatic void TryUsePPItemInBattle(u8 taskId);\nstatic void ItemUseCB_LearnedMove(u8 taskId, TaskFunc func);\nstatic void Task_LearnedMove(u8 taskId);\nstatic void Task_ReplaceMoveYesNo(u8 taskId);\nstatic void Task_DoLearnedMoveFanfareAfterText(u8 taskId);\nstatic void Task_TryLearningNextMove(u8 taskId);\nstatic void Task_LearnNextMoveOrClosePartyMenu(u8 taskId);\nstatic void Task_HandleReplaceMoveYesNoInput(u8 taskId);\nstatic void StopLearningMovePrompt(u8 taskId);\nstatic void Task_ShowSummaryScreenToForgetMove(u8 taskId);\nstatic void CB2_ShowSummaryScreenToForgetMove(void);\nstatic void CB2_ReturnToPartyMenuWhileLearningMove(void);\nstatic void Task_ReturnToPartyMenuWhileLearningMove(u8 taskId);\nstatic void DisplayPartyMenuForgotMoveMessage(u8 taskId);\nstatic void Task_PartyMenuReplaceMove(u8 taskId);\nstatic void Task_StopLearningMoveYesNo(u8 taskId);\nstatic void Task_HandleStopLearningMoveYesNoInput(u8 taskId);\nstatic void Task_TryLearningNextMoveAfterText(u8 taskId);\nstatic void ItemUseCB_RareCandyStep(u8 taskId, TaskFunc func);\nstatic void Task_DisplayLevelUpStatsPg1(u8 taskId);\nstatic void Task_DisplayLevelUpStatsPg2(u8 taskId);\nstatic void UpdateMonDisplayInfoAfterRareCandy(u8 slot, struct Pokemon *mon);\nstatic void DisplayLevelUpStatsPg1(u8 taskId);\nstatic void DisplayLevelUpStatsPg2(u8 taskId);\nstatic void Task_TryLearnNewMoves(u8 taskId);\nstatic void PartyMenuTryEvolution(u8 taskId);\nstatic void DisplayMonNeedsToReplaceMove(u8 taskId);\nstatic void DisplayMonLearnedMove(u8 taskId, u16 move);\nstatic void Task_SacredAshDisplayHPRestored(u8 taskId);\nstatic void Task_SacredAshLoop(u8 taskId);\nstatic void UseSacredAsh(u8 taskId);\nstatic void CB2_ReturnToBerryPouchMenu(void);\nstatic void CB2_ReturnToTMCaseMenu(void);\nstatic void GiveItemOrMailToSelectedMon(u8 taskId);\nstatic void RemoveItemToGiveFromBag(u16 item);\nstatic void DisplayItemMustBeRemovedFirstMessage(u8 taskId);\nstatic void CB2_WriteMailToGiveMonFromBag(void);\nstatic void GiveItemToSelectedMon(u8 taskId);\nstatic void Task_UpdateHeldItemSpriteAndClosePartyMenu(u8 taskId);\nstatic void Task_SwitchItemsFromBagYesNo(u8 taskId);\nstatic void CB2_ReturnToPartyOrBagMenuFromWritingMail(void);\nstatic bool8 ReturnGiveItemToBagOrPC(u16 item);\nstatic void Task_DisplayGaveMailFromBagMessage(u8 taskId);\nstatic void Task_HandleSwitchItemsFromBagYesNoInput(u8 taskId);\nstatic void Task_ValidateChosenMonsForBattle(u8 taskId);\nstatic bool8 HasPartySlotAlreadyBeenSelected(u8 slot);\nstatic void Task_ContinueChoosingMonsForBattle(u8 taskId);\nstatic void BufferBattlePartyOrder(u8 *partyBattleOrder, u8 flankId);\nstatic void BufferBattlePartyOrderBySide(u8 *partyBattleOrder, u8 flankId, u8 battlerId);\nstatic void Task_InitMultiPartnerPartySlideIn(u8 taskId);\nstatic void Task_WaitAfterMultiPartnerPartySlideIn(u8 taskId);\nstatic void SlideMultiPartyMenuBoxSpritesOneStep(u8 taskId);\nstatic void Task_MultiPartnerPartySlideIn(u8 taskId);\nstatic bool8 CB2_FadeFromPartyMenu(void);\nstatic void Task_PartyMenuWaitForFade(u8 taskId);\nstatic void Task_FirstBattleEnterParty_DarkenScreen(u8 taskId);\nstatic void Task_FirstBattleEnterParty_WaitDarken(u8 taskId);\nstatic void Task_FirstBattleEnterParty_CreatePrinter(u8 taskId);\nstatic void Task_FirstBattleEnterParty_RunPrinterMsg1(u8 taskId);\nstatic void Task_FirstBattleEnterParty_LightenFirstMonIcon(u8 taskId);\nstatic void Task_FirstBattleEnterParty_WaitLightenFirstMonIcon(u8 taskId);\nstatic void Task_FirstBattleEnterParty_StartPrintMsg2(u8 taskId);\nstatic void Task_FirstBattleEnterParty_RunPrinterMsg2(u8 taskId);\nstatic void Task_FirstBattleEnterParty_FadeNormal(u8 taskId);\nstatic void Task_FirstBattleEnterParty_WaitFadeNormal(u8 taskId);\nstatic void Task_PartyMenu_PokedudeStep(u8 taskId);\nstatic void Task_PartyMenuFromBag_PokedudeStep(u8 taskId);\nstatic bool8 PartyMenuPokedudeIsCancelled(u8 taskId);\nstatic void PartyMenuHandlePokedudeCancel(void);\nstatic void PartyMenu_Oak_PrintText(u8 windowId, const u8 *str);\nstatic u8 FirstBattleEnterParty_CreateWindowAndMsg1Printer(void);\nstatic void FirstBattleEnterParty_DestroyVoiceoverWindow(u8 windowId);\nstatic void SetSwitchedPartyOrderQuestLogEvent(void);\nstatic void SetUsedFieldMoveQuestLogEvent(struct Pokemon *mon, u8 fieldMove);\nstatic void CB2_DoUseItemAnim(void);\nstatic void CB2_UseItem(void);\nstatic void TryUsePPItemOutsideBattle(u8 taskId);\nstatic void ItemUseCB_RestorePP(u8 taskId, TaskFunc func);\nstatic void ItemUseCB_ReplaceMoveWithTMHM(u8 taskId, TaskFunc func);\nstatic void Task_ReplaceMoveWithTMHM(u8 taskId);\nstatic void CB2_UseEvolutionStone(void);\nstatic bool8 MonCanEvolve(void);\nstatic u16 ItemEffectToMonEv(struct Pokemon *mon, u8 effectType);\nstatic void ItemEffectToStatString(u8 effectType, u8 *dest);\nstatic bool8 SetUpFieldMove_Dive(void);\n\nstatic EWRAM_DATA struct PartyMenuInternal *sPartyMenuInternal = NULL;\nEWRAM_DATA struct PartyMenu gPartyMenu = {0};\nstatic EWRAM_DATA struct PartyMenuBox *sPartyMenuBoxes = NULL;\nstatic EWRAM_DATA u8 *sPartyBgGfxTilemap = NULL;\nstatic EWRAM_DATA u8 *sPartyBgTilemapBuffer = NULL;\nEWRAM_DATA bool8 gPartyMenuUseExitCallback = FALSE;\nEWRAM_DATA u8 gSelectedMonPartyId = 0;\nEWRAM_DATA MainCallback gPostMenuFieldCallback = NULL;\nstatic EWRAM_DATA u16 *sSlot1TilemapBuffer = NULL; // for switching party slots\nstatic EWRAM_DATA u16 *sSlot2TilemapBuffer = NULL;\nstatic EWRAM_DATA struct Pokemon *sSacredAshQuestLogMonBackup = NULL;\nEWRAM_DATA u8 gSelectedOrderFromParty[3] = {0};\nstatic EWRAM_DATA u16 sPartyMenuItemId = ITEM_NONE;\nALIGNED(4) EWRAM_DATA u8 gBattlePartyCurrentOrder[PARTY_SIZE / 2] = {0}; // bits 0-3 are the current pos of Slot 1, 4-7 are Slot 2, and so on\n\nvoid (*gItemUseCB)(u8, TaskFunc);\n\n#include \"data/pokemon/tutor_learnsets.h\"\n#include \"data/party_menu.h\"\n\nvoid InitPartyMenu(u8 menuType, u8 layout, u8 partyAction, bool8 keepCursorPos, u8 messageId, TaskFunc task, MainCallback callback)\n{\n    u32 i;\n\n    ResetPartyMenu();\n    sPartyMenuInternal = Alloc(sizeof(struct PartyMenuInternal));\n    if (sPartyMenuInternal == NULL)\n        SetMainCallback2(callback);\n    else\n    {\n        gPartyMenu.menuType = menuType;\n        gPartyMenu.exitCallback = callback;\n        gPartyMenu.action = partyAction;\n        sPartyMenuInternal->messageId = messageId;\n        sPartyMenuInternal->task = task;\n        sPartyMenuInternal->exitCallback = NULL;\n        sPartyMenuInternal->lastSelectedSlot = 0;\n        if (menuType == PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS)\n            sPartyMenuInternal->chooseMultiple = TRUE;\n        else\n            sPartyMenuInternal->chooseMultiple = FALSE;\n        if (layout != KEEP_PARTY_LAYOUT)\n            gPartyMenu.layout = layout;\n        for (i = 0; i < ARRAY_COUNT(sPartyMenuInternal->data); ++i)\n            sPartyMenuInternal->data[i] = 0;\n        for (i = 0; i < ARRAY_COUNT(sPartyMenuInternal->windowId); ++i)\n            sPartyMenuInternal->windowId[i] = WINDOW_NONE;\n        if (!keepCursorPos)\n            gPartyMenu.slotId = 0;\n        else if (gPartyMenu.slotId > PARTY_SIZE - 1 || GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES) == SPECIES_NONE)\n            gPartyMenu.slotId = 0;\n        gTextFlags.autoScroll = FALSE;\n        CalculatePlayerPartyCount();\n        SetMainCallback2(CB2_InitPartyMenu);\n    }\n}\n\nstatic void CB2_UpdatePartyMenu(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    DoScheduledBgTilemapCopiesToVram();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB_PartyMenu(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void CB2_InitPartyMenu(void)\n{\n    while (TRUE)\n    {\n        if (MenuHelpers_ShouldWaitForLinkRecv() == TRUE || ShowPartyMenu() == TRUE || MenuHelpers_IsLinkActive() == TRUE)\n            break;\n    }\n}\n\nstatic bool8 ShowPartyMenu(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankHBlankCallbacksToNull();\n        ResetVramOamAndBgCntRegs();\n        ClearScheduledBgCopiesToVram();\n        ++gMain.state;\n        break;\n    case 1:\n        ScanlineEffect_Stop();\n        ++gMain.state;\n        break;\n    case 2:\n        ResetPaletteFade();\n        gPaletteFade.bufferTransferDisabled = TRUE;\n        ++gMain.state;\n        break;\n    case 3:\n        ResetSpriteData();\n        ++gMain.state;\n        break;\n    case 4:\n        FreeAllSpritePalettes();\n        ++gMain.state;\n        break;\n    case 5:\n        if (!MenuHelpers_IsLinkActive())\n            ResetTasks();\n        ++gMain.state;\n        break;\n    case 6:\n        SetPartyMonsAllowedInMinigame();\n        ++gMain.state;\n        break;\n    case 7:\n        if (!AllocPartyMenuBg())\n        {\n            ExitPartyMenu();\n            return TRUE;\n        }\n        else\n        {\n            sPartyMenuInternal->data[0] = 0;\n            ++gMain.state;\n        }\n        break;\n    case 8:\n        if (AllocPartyMenuBgGfx())\n            ++gMain.state;\n        break;\n    case 9:\n        InitPartyMenuWindows(gPartyMenu.layout);\n        ++gMain.state;\n        break;\n    case 10:\n        InitPartyMenuBoxes(gPartyMenu.layout);\n        sPartyMenuInternal->data[0] = 0;\n        ++gMain.state;\n        break;\n    case 11:\n        LoadHeldItemIcons();\n        ++gMain.state;\n        break;\n    case 12:\n        LoadPartyMenuPokeballGfx();\n        ++gMain.state;\n        break;\n    case 13:\n        LoadPartyMenuAilmentGfx();\n        ++gMain.state;\n        break;\n    case 14:\n        LoadMonIconPalettes();\n        ++gMain.state;\n        break;\n    case 15:\n        if (CreatePartyMonSpritesLoop())\n        {\n            sPartyMenuInternal->data[0] = 0;\n            ++gMain.state;\n        }\n        break;\n    case 16:\n        if (RenderPartyMenuBoxes())\n        {\n            sPartyMenuInternal->data[0] = 0;\n            ++gMain.state;\n        }\n        break;\n    case 17:\n        CreateCancelConfirmPokeballSprites();\n        ++gMain.state;\n        break;\n    case 18:\n        CreateCancelConfirmWindows(sPartyMenuInternal->chooseMultiple);\n        ++gMain.state;\n        break;\n    case 19:\n        SetHelpContext(HELPCONTEXT_PARTY_MENU);\n        ++gMain.state;\n        break;\n    case 20:\n        CreateTask(sPartyMenuInternal->task, 0);\n        DisplayPartyMenuStdMessage(sPartyMenuInternal->messageId);\n        ++gMain.state;\n        break;\n    case 21:\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        ++gMain.state;\n        break;\n    case 22:\n        BeginNormalPaletteFade(PALETTES_ALL, -2, 16, 0, RGB_BLACK);\n        gPaletteFade.bufferTransferDisabled = FALSE;\n        ++gMain.state;\n        break;\n    default:\n        SetVBlankCallback(VBlankCB_PartyMenu);\n        SetMainCallback2(CB2_UpdatePartyMenu);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void ExitPartyMenu(void)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK);\n    CreateTask(Task_ExitPartyMenu, 0);\n    SetVBlankCallback(VBlankCB_PartyMenu);\n    SetMainCallback2(CB2_UpdatePartyMenu);\n}\n\nstatic void Task_ExitPartyMenu(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        SetMainCallback2(gPartyMenu.exitCallback);\n        FreePartyPointers();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void ResetPartyMenu(void)\n{\n    sPartyMenuInternal = NULL;\n    sPartyBgTilemapBuffer = NULL;\n    sPartyMenuBoxes = NULL;\n    sPartyBgGfxTilemap = NULL;\n}\n\nstatic bool8 AllocPartyMenuBg(void)\n{\n    ResetAllBgsCoordinatesAndBgCntRegs();\n    sPartyBgTilemapBuffer = Alloc(0x800);\n    if (sPartyBgTilemapBuffer == NULL)\n        return FALSE;\n    memset(sPartyBgTilemapBuffer, 0, 0x800);\n    ResetBgsAndClearDma3BusyFlags(0);\n    InitBgsFromTemplates(0, sPartyMenuBgTemplates, ARRAY_COUNT(sPartyMenuBgTemplates));\n    SetBgTilemapBuffer(1, sPartyBgTilemapBuffer);\n    ScheduleBgCopyTilemapToVram(1);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n    return TRUE;\n}\n\nstatic bool8 AllocPartyMenuBgGfx(void)\n{\n    u32 sizeout;\n\n    switch (sPartyMenuInternal->data[0])\n    {\n    case 0:\n        sPartyBgGfxTilemap = MallocAndDecompress(gPartyMenuBg_Gfx, &sizeout);\n        LoadBgTiles(1, sPartyBgGfxTilemap, sizeout, 0);\n        ++sPartyMenuInternal->data[0];\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            LZDecompressWram(gPartyMenuBg_Tilemap, sPartyBgTilemapBuffer);\n            ++sPartyMenuInternal->data[0];\n        }\n        break;\n    case 2:\n        LoadCompressedPalette(gPartyMenuBg_Pal, BG_PLTT_ID(0), 11 * PLTT_SIZE_4BPP);\n        CpuCopy16(gPlttBufferUnfaded, sPartyMenuInternal->palBuffer, 11 * PLTT_SIZE_4BPP);\n        ++sPartyMenuInternal->data[0];\n        break;\n    case 3:\n        PartyPaletteBufferCopy(4);\n        ++sPartyMenuInternal->data[0];\n        break;\n    case 4:\n        PartyPaletteBufferCopy(5);\n        ++sPartyMenuInternal->data[0];\n        break;\n    case 5:\n        PartyPaletteBufferCopy(6);\n        ++sPartyMenuInternal->data[0];\n        break;\n    case 6:\n        PartyPaletteBufferCopy(7);\n        ++sPartyMenuInternal->data[0];\n        break;\n    case 7:\n        PartyPaletteBufferCopy(8);\n        ++sPartyMenuInternal->data[0];\n        break;\n    default:\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void PartyPaletteBufferCopy(u8 offset)\n{\n    offset = PLTT_ID(offset);\n    CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(3)], &gPlttBufferUnfaded[offset], PLTT_SIZE_4BPP);\n    CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(3)], &gPlttBufferFaded[offset], PLTT_SIZE_4BPP);\n}\n\nstatic void FreePartyPointers(void)\n{\n    if (sPartyMenuInternal)\n        Free(sPartyMenuInternal);\n    if (sPartyBgTilemapBuffer)\n        Free(sPartyBgTilemapBuffer);\n    if (sPartyBgGfxTilemap)\n        Free(sPartyBgGfxTilemap);\n    if (sPartyMenuBoxes)\n        Free(sPartyMenuBoxes);\n    FreeAllWindowBuffers();\n}\n\nstatic void InitPartyMenuBoxes(u8 layout)\n{\n    u32 i;\n\n    sPartyMenuBoxes = Alloc(sizeof(struct PartyMenuBox[PARTY_SIZE]));\n    for (i = 0; i < PARTY_SIZE; ++i)\n    {\n        sPartyMenuBoxes[i].infoRects = &sPartyBoxInfoRects[PARTY_BOX_RIGHT_COLUMN];\n        sPartyMenuBoxes[i].spriteCoords = sPartyMenuSpriteCoords[layout][i];\n        sPartyMenuBoxes[i].windowId = i;\n    }\n    // The first party mon goes in the left column\n    sPartyMenuBoxes[0].infoRects = &sPartyBoxInfoRects[PARTY_BOX_LEFT_COLUMN];\n    if (layout == PARTY_LAYOUT_MULTI_SHOWCASE)\n        sPartyMenuBoxes[3].infoRects = &sPartyBoxInfoRects[PARTY_BOX_LEFT_COLUMN];\n    else if (layout != PARTY_LAYOUT_SINGLE)\n        sPartyMenuBoxes[1].infoRects = &sPartyBoxInfoRects[PARTY_BOX_LEFT_COLUMN];\n}\n\nstatic void RenderPartyMenuBox(u8 slot)\n{\n    if (gPartyMenu.menuType == PARTY_MENU_TYPE_MULTI_SHOWCASE && slot >= MULTI_PARTY_SIZE)\n    {\n        DisplayPartyPokemonDataForMultiBattle(slot);\n        LoadPartyBoxPalette(&sPartyMenuBoxes[slot], PARTY_PAL_MULTI_ALT);\n        CopyWindowToVram(sPartyMenuBoxes[slot].windowId, COPYWIN_GFX);\n        PutWindowTilemap(sPartyMenuBoxes[slot].windowId);\n        ScheduleBgCopyTilemapToVram(2);\n    }\n    else\n    {\n        if (GetMonData(&gPlayerParty[slot], MON_DATA_SPECIES) == SPECIES_NONE)\n        {\n            DrawEmptySlot(sPartyMenuBoxes[slot].windowId);\n            CopyWindowToVram(sPartyMenuBoxes[slot].windowId, COPYWIN_GFX);\n        }\n        else\n        {\n            if (gPartyMenu.menuType == PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS)\n                DisplayPartyPokemonDataForChooseMultiple(slot);\n            else if (gPartyMenu.menuType == PARTY_MENU_TYPE_MINIGAME)\n                DisplayPartyPokemonDataForWirelessMinigame(slot);\n            else if (!DisplayPartyPokemonDataForMoveTutorOrEvolutionItem(slot))\n                DisplayPartyPokemonData(slot);\n            if (gPartyMenu.menuType == PARTY_MENU_TYPE_MULTI_SHOWCASE)\n                AnimatePartySlot(slot, 0);\n            else if (gPartyMenu.slotId == slot)\n                AnimatePartySlot(slot, 1);\n            else\n                AnimatePartySlot(slot, 0);\n        }\n        PutWindowTilemap(sPartyMenuBoxes[slot].windowId);\n        ScheduleBgCopyTilemapToVram(0);\n    }\n}\n\nstatic void DisplayPartyPokemonData(u8 slot)\n{\n    if (GetMonData(&gPlayerParty[slot], MON_DATA_IS_EGG))\n    {\n        sPartyMenuBoxes[slot].infoRects->blitFunc(sPartyMenuBoxes[slot].windowId, 0, 0, 0, 0, TRUE);\n        DisplayPartyPokemonNickname(&gPlayerParty[slot], &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY);\n    }\n    else\n    {\n        sPartyMenuBoxes[slot].infoRects->blitFunc(sPartyMenuBoxes[slot].windowId, 0, 0, 0, 0, FALSE);\n        DisplayPartyPokemonNickname(&gPlayerParty[slot], &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY);\n        DisplayPartyPokemonLevelCheck(&gPlayerParty[slot], &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY);\n        DisplayPartyPokemonGenderNidoranCheck(&gPlayerParty[slot], &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY);\n        DisplayPartyPokemonHPCheck(&gPlayerParty[slot], &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY);\n        DisplayPartyPokemonMaxHPCheck(&gPlayerParty[slot], &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY);\n        DisplayPartyPokemonHPBarCheck(&gPlayerParty[slot], &sPartyMenuBoxes[slot]);\n    }\n}\n\nstatic void DisplayPartyPokemonDescriptionData(u8 slot, u8 stringId)\n{\n    struct Pokemon *mon = &gPlayerParty[slot];\n\n    sPartyMenuBoxes[slot].infoRects->blitFunc(sPartyMenuBoxes[slot].windowId, 0, 0, 0, 0, TRUE);\n    DisplayPartyPokemonNickname(mon, &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY);\n    if (!GetMonData(mon, MON_DATA_IS_EGG))\n    {\n        DisplayPartyPokemonLevelCheck(mon, &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY);\n        DisplayPartyPokemonGenderNidoranCheck(mon, &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY);\n    }\n    DisplayPartyPokemonDescriptionText(stringId, &sPartyMenuBoxes[slot], DRAW_TEXT_ONLY);\n}\n\nstatic void DisplayPartyPokemonDataForChooseMultiple(u8 slot)\n{\n    u32 i;\n    struct Pokemon *mon = &gPlayerParty[slot];\n    u8 *order = gSelectedOrderFromParty;\n    u8 maxBattlers;\n\n    if (!GetBattleEntryEligibility(mon))\n        DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_NOT_ABLE);\n    else\n    {\n        if (gPartyMenu.chooseMonsBattleType == CHOOSE_MONS_FOR_UNION_ROOM_BATTLE)\n            maxBattlers = 2;\n        else\n            maxBattlers = 3;\n        for (i = 0; i < maxBattlers; ++i)\n        {\n            if (order[i] != 0 && (order[i] - 1) == slot)\n            {\n                DisplayPartyPokemonDescriptionData(slot, i + PARTYBOX_DESC_FIRST);\n                return;\n            }\n        }\n        DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_ABLE_3);\n    }\n}\n\nstatic void DisplayPartyPokemonDataForWirelessMinigame(u8 slot)\n{\n    if (IsMonAllowedInMinigame(slot) == TRUE)\n        DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_ABLE);\n    else\n        DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_NOT_ABLE);\n}\n\n// Returns TRUE if teaching move or cant evolve with item (i.e. description data is shown), FALSE otherwise\nstatic bool8 DisplayPartyPokemonDataForMoveTutorOrEvolutionItem(u8 slot)\n{\n    struct Pokemon *currentPokemon = &gPlayerParty[slot];\n    u16 item = gSpecialVar_ItemId;\n\n    if (gPartyMenu.action == PARTY_ACTION_MOVE_TUTOR)\n    {\n        gSpecialVar_Result = FALSE;\n        if (gSpecialVar_0x8005 >= TUTOR_MOVE_COUNT)\n            return FALSE;\n        DisplayPartyPokemonDataToTeachMove(slot, 0, gSpecialVar_0x8005);\n    }\n    else\n    {\n        if (gPartyMenu.action != PARTY_ACTION_USE_ITEM)\n            return FALSE;\n        switch (CheckIfItemIsTMHMOrEvolutionStone(item))\n        {\n        default:\n            return FALSE;\n        case 1: // TM/HM\n            DisplayPartyPokemonDataToTeachMove(slot, item, 0);\n            break;\n        case 2: // Evolution stone\n            if (!GetMonData(currentPokemon, MON_DATA_IS_EGG) && GetEvolutionTargetSpecies(currentPokemon, EVO_MODE_ITEM_CHECK, item) != SPECIES_NONE)\n                return FALSE;\n            DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_NO_USE);\n            break;\n        }\n    }\n    return TRUE;\n}\n\nstatic void DisplayPartyPokemonDataToTeachMove(u8 slot, u16 item, u8 tutor)\n{\n    switch (CanMonLearnTMTutor(&gPlayerParty[slot], item, tutor))\n    {\n    case CANNOT_LEARN_MOVE:\n    case CANNOT_LEARN_MOVE_IS_EGG:\n        DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_NOT_ABLE_2);\n        break;\n    case ALREADY_KNOWS_MOVE:\n        DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_LEARNED);\n        break;\n    default:\n        DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_ABLE_2);\n        break;\n    }\n}\n\nstatic void DisplayPartyPokemonDataForMultiBattle(u8 slot)\n{\n    struct PartyMenuBox *menuBox = &sPartyMenuBoxes[slot];\n    u8 actualSlot = slot - (3);\n\n    if (gMultiPartnerParty[actualSlot].species == SPECIES_NONE)\n        DrawEmptySlot(menuBox->windowId);\n    else\n    {\n        menuBox->infoRects->blitFunc(menuBox->windowId, 0, 0, 0, 0, FALSE);\n        StringCopy(gStringVar1, gMultiPartnerParty[actualSlot].nickname);\n        StringGet_Nickname(gStringVar1);\n        if (StringLength(gStringVar1) <= 5)\n            ConvertInternationalString(gStringVar1, 1);\n        DisplayPartyPokemonBarDetail(menuBox->windowId, gStringVar1, 0, menuBox->infoRects->dimensions);\n        DisplayPartyPokemonLevel(gMultiPartnerParty[actualSlot].level, menuBox);\n        DisplayPartyPokemonGender(gMultiPartnerParty[actualSlot].gender, gMultiPartnerParty[actualSlot].species, gMultiPartnerParty[actualSlot].nickname, menuBox);\n        DisplayPartyPokemonHP(gMultiPartnerParty[actualSlot].hp, menuBox);\n        DisplayPartyPokemonMaxHP(gMultiPartnerParty[actualSlot].maxhp, menuBox);\n        DisplayPartyPokemonHPBar(gMultiPartnerParty[actualSlot].hp, gMultiPartnerParty[actualSlot].maxhp, menuBox);\n    }\n}\n\nstatic bool8 RenderPartyMenuBoxes(void)\n{\n    RenderPartyMenuBox(sPartyMenuInternal->data[0]);\n    if (++sPartyMenuInternal->data[0] == PARTY_SIZE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic u8 *GetPartyMenuBgTile(u16 tileId)\n{\n    return &sPartyBgGfxTilemap[tileId << 5];\n}\n\nstatic void CreatePartyMonSprites(u8 slot)\n{\n    u8 actualSlot;\n\n    if (gPartyMenu.menuType == PARTY_MENU_TYPE_MULTI_SHOWCASE && slot >= MULTI_PARTY_SIZE)\n    {\n        u8 status;\n\n        actualSlot = slot - MULTI_PARTY_SIZE;\n        if (gMultiPartnerParty[actualSlot].species != SPECIES_NONE)\n        {\n            CreatePartyMonIconSpriteParameterized(gMultiPartnerParty[actualSlot].species, gMultiPartnerParty[actualSlot].personality, &sPartyMenuBoxes[slot], 0, FALSE);\n            CreatePartyMonHeldItemSpriteParameterized(gMultiPartnerParty[actualSlot].species, gMultiPartnerParty[actualSlot].heldItem, &sPartyMenuBoxes[slot]);\n            CreatePartyMonPokeballSpriteParameterized(gMultiPartnerParty[actualSlot].species, &sPartyMenuBoxes[slot]);\n            if (gMultiPartnerParty[actualSlot].hp == 0)\n                status = AILMENT_FNT;\n            else\n                status = GetAilmentFromStatus(gMultiPartnerParty[actualSlot].status);\n            CreatePartyMonStatusSpriteParameterized(gMultiPartnerParty[actualSlot].species, status, &sPartyMenuBoxes[slot]);\n        }\n    }\n    else if (GetMonData(&gPlayerParty[slot], MON_DATA_SPECIES) != SPECIES_NONE)\n    {\n        CreatePartyMonIconSprite(&gPlayerParty[slot], &sPartyMenuBoxes[slot], slot);\n        CreatePartyMonHeldItemSprite(&gPlayerParty[slot], &sPartyMenuBoxes[slot]);\n        CreatePartyMonPokeballSprite(&gPlayerParty[slot], &sPartyMenuBoxes[slot]);\n        CreatePartyMonStatusSprite(&gPlayerParty[slot], &sPartyMenuBoxes[slot]);\n    }\n}\n\nstatic bool8 CreatePartyMonSpritesLoop(void)\n{\n    CreatePartyMonSprites(sPartyMenuInternal->data[0]);\n    if (++sPartyMenuInternal->data[0] == PARTY_SIZE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void CreateCancelConfirmPokeballSprites(void)\n{\n    if (gPartyMenu.menuType == PARTY_MENU_TYPE_MULTI_SHOWCASE)\n    {\n        // The showcase has no Cancel/Confirm buttons\n        FillBgTilemapBufferRect(1, 14, 23, 17, 7, 2, 1);\n    }\n    else\n    {\n        if (sPartyMenuInternal->chooseMultiple)\n        {\n            sPartyMenuInternal->spriteIdConfirmPokeball = CreateSmallPokeballButtonSprite(0xBF, 0x88);\n            DrawCancelConfirmButtons();\n            sPartyMenuInternal->spriteIdCancelPokeball = CreateSmallPokeballButtonSprite(0xBF, 0x98);\n        }\n        else\n            sPartyMenuInternal->spriteIdCancelPokeball = CreatePokeballButtonSprite(198, 148);\n\n        AnimatePartySlot(gPartyMenu.slotId, 1);\n    }\n}\n\nvoid AnimatePartySlot(u8 slot, u8 animNum)\n{\n    u8 spriteId;\n\n    switch (slot)\n    {\n    default:\n        if (GetMonData(&gPlayerParty[slot], MON_DATA_SPECIES) != SPECIES_NONE)\n        {\n            LoadPartyBoxPalette(&sPartyMenuBoxes[slot], GetPartyBoxPaletteFlags(slot, animNum));\n            AnimateSelectedPartyIcon(sPartyMenuBoxes[slot].monSpriteId, animNum);\n            PartyMenuStartSpriteAnim(sPartyMenuBoxes[slot].pokeballSpriteId, animNum);\n        }\n        return;\n    case SLOT_CONFIRM:\n        if (animNum == 0)\n            SetBgTilemapPalette(1, 23, 16, 7, 2, 1);\n        else\n            SetBgTilemapPalette(1, 23, 16, 7, 2, 2);\n        spriteId = sPartyMenuInternal->spriteIdConfirmPokeball;\n        break;\n    case SLOT_CANCEL:\n        // The position of the Cancel button changes if Confirm is present\n        if (!sPartyMenuInternal->chooseMultiple)\n        {\n            if (animNum == 0)\n                SetBgTilemapPalette(1, 23, 17, 7, 2, 1);\n            else\n                SetBgTilemapPalette(1, 23, 17, 7, 2, 2);\n        }\n        else\n        {\n            if (animNum == 0)\n                SetBgTilemapPalette(1, 23, 18, 7, 2, 1);\n            else\n                SetBgTilemapPalette(1, 23, 18, 7, 2, 2);\n        }\n        spriteId = sPartyMenuInternal->spriteIdCancelPokeball;\n        break;\n    }\n    PartyMenuStartSpriteAnim(spriteId, animNum);\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nstatic u8 GetPartyBoxPaletteFlags(u8 slot, u8 animNum)\n{\n    u8 palFlags = 0;\n\n    if (animNum == 1)\n        palFlags |= PARTY_PAL_SELECTED;\n    if (GetMonData(&gPlayerParty[slot], MON_DATA_HP) == 0)\n        palFlags |= PARTY_PAL_FAINTED;\n    if (gPartyMenu.layout == PARTY_LAYOUT_MULTI\n     && (slot == 1 || slot == 4 || slot == 5))\n        palFlags |= PARTY_PAL_MULTI_ALT;\n    if (gPartyMenu.action == PARTY_ACTION_SWITCHING)\n        palFlags |= PARTY_PAL_SWITCHING;\n    if (gPartyMenu.action == PARTY_ACTION_SWITCH)\n    {\n        if (slot == gPartyMenu.slotId || slot == gPartyMenu.slotId2)\n            palFlags |= PARTY_PAL_TO_SWITCH;\n    }\n    if (gPartyMenu.action == PARTY_ACTION_SOFTBOILED && slot == gPartyMenu.slotId )\n        palFlags |= PARTY_PAL_TO_SOFTBOIL;\n    return palFlags;\n}\n\nstatic void DrawCancelConfirmButtons(void)\n{\n    CopyToBgTilemapBufferRect_ChangePalette(1, sConfirmButton_Tilemap, 23, 16, 7, 2, 17);\n    CopyToBgTilemapBufferRect_ChangePalette(1, sCancelButton_Tilemap, 23, 18, 7, 2, 17);\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nbool8 IsMultiBattle(void)\n{\n    if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattleTypeFlags & BATTLE_TYPE_LINK)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void SwapPartyPokemon(struct Pokemon *mon1, struct Pokemon *mon2)\n{\n    struct Pokemon *buffer = Alloc(sizeof(struct Pokemon));\n\n    *buffer = *mon1;\n    *mon1 = *mon2;\n    *mon2 = *buffer;\n    Free(buffer);\n}\n\nstatic void Task_ClosePartyMenu(u8 taskId)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK);\n    gTasks[taskId].func = Task_ClosePartyMenuAndSetCB2;\n}\n\nstatic void Task_ClosePartyMenuAndSetCB2(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE)\n            UpdatePartyToFieldOrder();\n        if (sPartyMenuInternal->exitCallback != NULL)\n            SetMainCallback2(sPartyMenuInternal->exitCallback);\n        else\n            SetMainCallback2(gPartyMenu.exitCallback);\n        FreePartyPointers();\n        DestroyTask(taskId);\n    }\n}\n\nu8 GetCursorSelectionMonId(void)\n{\n    return gPartyMenu.slotId;\n}\n\nu8 GetPartyMenuType(void)\n{\n    return gPartyMenu.menuType;\n}\n\nvoid Task_HandleChooseMonInput(u8 taskId)\n{\n    if (!gPaletteFade.active && MenuHelpers_ShouldWaitForLinkRecv() != TRUE)\n    {\n        s8 *slotPtr = GetCurrentPartySlotPtr();\n\n        switch (PartyMenuButtonHandler(slotPtr))\n        {\n        case A_BUTTON:\n            HandleChooseMonSelection(taskId, slotPtr);\n            break;\n        case B_BUTTON: // also handles pressing A_BUTTON on Cancel\n            HandleChooseMonCancel(taskId, slotPtr);\n            break;\n        case START_BUTTON:\n            if (sPartyMenuInternal->chooseMultiple)\n            {\n                PlaySE(SE_SELECT);\n                MoveCursorToConfirm();\n            }\n            break;\n        case 9:\n            DestroyTask(taskId);\n            break;\n        }\n    }\n}\n\nstatic s8 *GetCurrentPartySlotPtr(void)\n{\n    if (gPartyMenu.action == PARTY_ACTION_SWITCH || gPartyMenu.action == PARTY_ACTION_SOFTBOILED)\n        return &gPartyMenu.slotId2;\n    else\n        return &gPartyMenu.slotId;\n}\n\nstatic void HandleChooseMonSelection(u8 taskId, s8 *slotPtr)\n{\n    if (*slotPtr == SLOT_CONFIRM)\n        gPartyMenu.task(taskId); // task here is always Task_ValidateChosenMonsForBattle\n    else\n    {\n        switch (gPartyMenu.action)\n        {\n        case PARTY_ACTION_SOFTBOILED:\n            if (IsSelectedMonNotEgg((u8 *)slotPtr))\n                Task_TryUseSoftboiledOnPartyMon(taskId);\n            break;\n        case PARTY_ACTION_USE_ITEM:\n            if (IsSelectedMonNotEgg((u8 *)slotPtr))\n            {\n                if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE)\n                    sPartyMenuInternal->exitCallback = CB2_SetUpExitToBattleScreen;\n                gItemUseCB(taskId, Task_ClosePartyMenuAfterText);\n            }\n            break;\n        case PARTY_ACTION_MOVE_TUTOR:\n            if (IsSelectedMonNotEgg((u8 *)slotPtr))\n            {\n                PlaySE(SE_SELECT);\n                TryTutorSelectedMon(taskId);\n            }\n            break;\n        case PARTY_ACTION_GIVE_MAILBOX_MAIL:\n            if (IsSelectedMonNotEgg((u8 *)slotPtr))\n            {\n                PlaySE(SE_SELECT);\n                TryGiveMailToSelectedMon(taskId);\n            }\n            break;\n        case PARTY_ACTION_GIVE_ITEM:\n        case PARTY_ACTION_GIVE_PC_ITEM:\n            if (IsSelectedMonNotEgg((u8 *)slotPtr))\n            {\n                PlaySE(SE_SELECT);\n                TryGiveItemOrMailToSelectedMon(taskId);\n            }\n            break;\n        case PARTY_ACTION_SWITCH:\n            PlaySE(SE_SELECT);\n            SwitchSelectedMons(taskId);\n            break;\n        case PARTY_ACTION_CHOOSE_AND_CLOSE:\n            PlaySE(SE_SELECT);\n            gSpecialVar_0x8004 = *slotPtr;\n            if (gPartyMenu.menuType == PARTY_MENU_TYPE_MOVE_RELEARNER)\n            {\n                u16 moves[20] = {MOVE_NONE};\n                gSpecialVar_0x8005 = GetMoveRelearnerMoves(&gPlayerParty[*slotPtr], moves);\n            }\n            Task_ClosePartyMenu(taskId);\n            break;\n        case PARTY_ACTION_MINIGAME:\n            if (IsSelectedMonNotEgg((u8 *)slotPtr))\n                TryEnterMonForMinigame(taskId, (u8)*slotPtr);\n            break;\n        default:\n        case PARTY_ACTION_ABILITY_PREVENTS:\n        case PARTY_ACTION_SWITCHING:\n            PlaySE(SE_SELECT);\n            Task_TryCreateSelectionWindow(taskId);\n            break;\n        }\n    }\n}\n\nstatic bool8 IsSelectedMonNotEgg(u8 *slotPtr)\n{\n    if (GetMonData(&gPlayerParty[*slotPtr], MON_DATA_IS_EGG) == TRUE)\n    {\n        PlaySE(SE_FAILURE);\n        return FALSE;\n    }\n    return TRUE;\n}\n\nstatic void HandleChooseMonCancel(u8 taskId, s8 *slotPtr)\n{\n    switch (gPartyMenu.action)\n    {\n    case PARTY_ACTION_SEND_OUT:\n        PlaySE(SE_FAILURE);\n        break;\n    case PARTY_ACTION_SWITCH:\n    case PARTY_ACTION_SOFTBOILED:\n        PlaySE(SE_SELECT);\n        FinishTwoMonAction(taskId);\n        break;\n    case PARTY_ACTION_MINIGAME:\n        PlaySE(SE_SELECT);\n        CancelParticipationPrompt(taskId);\n        break;\n    default:\n        PlaySE(SE_SELECT);\n        if (gPartyMenu.menuType == PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS)\n            DisplayCancelChooseMonYesNo(taskId);\n        else\n        {\n            if (!MenuHelpers_IsLinkActive())\n                gSpecialVar_0x8004 = SLOT_CANCEL;\n            gPartyMenuUseExitCallback = FALSE;\n            *slotPtr = SLOT_CANCEL;\n            Task_ClosePartyMenu(taskId);\n        }\n        break;\n    }\n}\n\nstatic void DisplayCancelChooseMonYesNo(u8 taskId)\n{\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    StringExpandPlaceholders(gStringVar4, gText_CancelBattle);\n    DisplayPartyMenuMessage(gStringVar4, TRUE);\n    gTasks[taskId].func = Task_CancelChooseMonYesNo;\n}\n\nstatic void Task_CancelChooseMonYesNo(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        PartyMenuDisplayYesNoMenu();\n        gTasks[taskId].func = Task_HandleCancelChooseMonYesNoInput;\n    }\n}\n\nstatic void Task_HandleCancelChooseMonYesNoInput(u8 taskId)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0:\n        gPartyMenuUseExitCallback = FALSE;\n        gPartyMenu.slotId = SLOT_CANCEL;\n        ClearSelectedPartyOrder();\n        Task_ClosePartyMenu(taskId);\n        break;\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        // fallthrough\n    case 1:\n        Task_ReturnToChooseMonAfterText(taskId);\n        break;\n    }\n}\n\nstatic u16 PartyMenuButtonHandler(s8 *slotPtr)\n{\n    s8 movementDir;\n    u8 taskId;\n\n    switch (gMain.newAndRepeatedKeys)\n    {\n    case DPAD_UP:\n        movementDir = MENU_DIR_UP;\n        break;\n    case DPAD_DOWN:\n        movementDir = MENU_DIR_DOWN;\n        break;\n    case DPAD_LEFT:\n        movementDir = MENU_DIR_LEFT;\n        break;\n    case DPAD_RIGHT:\n        movementDir = MENU_DIR_RIGHT;\n        break;\n    default:\n        switch (GetLRKeysPressedAndHeld())\n        {\n        case MENU_L_PRESSED:\n            movementDir = MENU_DIR_UP;\n            break;\n        case MENU_R_PRESSED:\n            movementDir = MENU_DIR_DOWN;\n            break;\n        default:\n            movementDir = 0;\n            break;\n        }\n        break;\n    }\n    if (JOY_NEW(START_BUTTON))\n        return START_BUTTON;\n    if (JOY_NEW(SELECT_BUTTON) && CalculatePlayerPartyCount() > 1)\n    {\n        if(gPartyMenu.menuType != PARTY_MENU_TYPE_FIELD)\n            return START_BUTTON;\n        if(*slotPtr == PARTY_SIZE + 1)\n            return START_BUTTON; // do nothing if select is pressed on Cancel\n        if(gPartyMenu.action != PARTY_ACTION_SWITCH)\n        {\n            taskId = CreateTask(CursorCB_Switch, 1);\n            return 9;\n        }\n        return 1; //select acts as A button when in switch mode\n    }\n    if (movementDir)\n    {\n        UpdateCurrentPartySelection(slotPtr, movementDir);\n        return 0;\n    }\n    if (JOY_NEW(A_BUTTON) && *slotPtr == SLOT_CANCEL)\n        return B_BUTTON;\n    return JOY_NEW(A_BUTTON | B_BUTTON);\n}\n\nstatic void UpdateCurrentPartySelection(s8 *slotPtr, s8 movementDir)\n{\n    s8 newSlotId = *slotPtr;\n    u8 layout = gPartyMenu.layout;\n\n    if (layout == PARTY_LAYOUT_SINGLE)\n        UpdatePartySelectionSingleLayout(slotPtr, movementDir);\n    else\n        UpdatePartySelectionDoubleLayout(slotPtr, movementDir);\n    if (*slotPtr != newSlotId)\n    {\n        PlaySE(SE_SELECT);\n        AnimatePartySlot(newSlotId, 0);\n        AnimatePartySlot(*slotPtr, 1);\n    }\n}\n\nstatic void UpdatePartySelectionSingleLayout(s8 *slotPtr, s8 movementDir)\n{\n    switch (movementDir)\n    {\n    case MENU_DIR_UP:\n        if (*slotPtr == 0)\n            *slotPtr = SLOT_CANCEL;\n        else if (*slotPtr == SLOT_CONFIRM)\n            *slotPtr = gPlayerPartyCount - 1;\n        else if (*slotPtr == SLOT_CANCEL)\n        {\n            if (sPartyMenuInternal->chooseMultiple)\n                *slotPtr = SLOT_CONFIRM;\n            else\n                *slotPtr = gPlayerPartyCount - 1;\n        }\n        else\n            --*slotPtr;\n        break;\n    case MENU_DIR_DOWN:\n        if (*slotPtr == SLOT_CANCEL)\n            *slotPtr = 0;\n        else if (*slotPtr == gPlayerPartyCount - 1)\n        {\n            if (sPartyMenuInternal->chooseMultiple)\n                *slotPtr = SLOT_CONFIRM;\n            else\n                *slotPtr = SLOT_CANCEL;\n        }\n        else\n            ++*slotPtr;\n        break;\n    case MENU_DIR_RIGHT:\n        if (gPlayerPartyCount != 1 && *slotPtr == 0)\n        {\n            if (sPartyMenuInternal->lastSelectedSlot == 0)\n                *slotPtr = 1;\n            else\n                *slotPtr = sPartyMenuInternal->lastSelectedSlot;\n        }\n        break;\n    case MENU_DIR_LEFT:\n        if (*slotPtr != 0 && *slotPtr != SLOT_CONFIRM && *slotPtr != SLOT_CANCEL)\n        {\n            sPartyMenuInternal->lastSelectedSlot = *slotPtr;\n            *slotPtr = 0;\n        }\n        break;\n    }\n}\n\nstatic void UpdatePartySelectionDoubleLayout(s8 *slotPtr, s8 movementDir)\n{\n    // newSlot is used temporarily as a movement direction during its later assignment\n    s8 newSlot = movementDir;\n\n    switch (movementDir)\n    {\n    case MENU_DIR_UP:\n        if (*slotPtr == 0)\n        {\n            *slotPtr = SLOT_CANCEL;\n            break;\n        }\n        else if (*slotPtr == SLOT_CONFIRM)\n        {\n            *slotPtr = gPlayerPartyCount - 1;\n            break;\n        }\n        else if (*slotPtr == SLOT_CANCEL)\n        {\n            if (sPartyMenuInternal->chooseMultiple)\n            {\n                *slotPtr = SLOT_CONFIRM;\n                break;\n            }\n            --*slotPtr;\n        }\n        newSlot = GetNewSlotDoubleLayout(*slotPtr, newSlot);\n        if (newSlot != -1)\n            *slotPtr = newSlot;\n        break;\n    case MENU_DIR_DOWN:\n        if (*slotPtr == SLOT_CONFIRM)\n            *slotPtr = SLOT_CANCEL;\n        else if (*slotPtr == SLOT_CANCEL)\n            *slotPtr = 0;\n        else\n        {\n            newSlot = GetNewSlotDoubleLayout(*slotPtr, MENU_DIR_DOWN);\n            if (newSlot == -1)\n            {\n                if (sPartyMenuInternal->chooseMultiple)\n                    *slotPtr = SLOT_CONFIRM;\n                else\n                    *slotPtr = SLOT_CANCEL;\n            }\n            else\n                *slotPtr = newSlot;\n        }\n        break;\n    case MENU_DIR_RIGHT:\n        if (*slotPtr == 0)\n        {\n            if (sPartyMenuInternal->lastSelectedSlot == 3)\n            {\n                if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES) != SPECIES_NONE)\n                    *slotPtr = 3;\n            }\n            else if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES) != SPECIES_NONE)\n                *slotPtr = 2;\n\n        }\n        else if (*slotPtr == 1)\n        {\n            if (sPartyMenuInternal->lastSelectedSlot == 5)\n            {\n                if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES) != SPECIES_NONE)\n                    *slotPtr = 5;\n            }\n            else if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES) != SPECIES_NONE)\n                *slotPtr = 4;\n\n        }\n        break;\n    case MENU_DIR_LEFT:\n        if (*slotPtr == 2 || *slotPtr == 3)\n        {\n            sPartyMenuInternal->lastSelectedSlot = *slotPtr;\n            *slotPtr = 0;\n        }\n        else if (*slotPtr == 4 || *slotPtr == 5)\n        {\n            sPartyMenuInternal->lastSelectedSlot = *slotPtr;\n            *slotPtr = 1;\n        }\n        break;\n    }\n}\n\nstatic s8 GetNewSlotDoubleLayout(s8 slotId, s8 movementDir)\n{\n    while (TRUE)\n    {\n        slotId += movementDir;\n        if ((u8)slotId >= SLOT_CONFIRM)\n            return -1;\n        if (GetMonData(&gPlayerParty[slotId], MON_DATA_SPECIES) != SPECIES_NONE)\n            return slotId;\n    }\n}\n\nu8 *GetMonNickname(struct Pokemon *mon, u8 *dest)\n{\n    GetMonData(mon, MON_DATA_NICKNAME, dest);\n    return StringGet_Nickname(dest);\n}\n\n#define tKeepOpen  data[0]\n\nu8 DisplayPartyMenuMessage(const u8 *str, bool8 keepOpen)\n{\n    u8 taskId;\n\n    PartyMenuPrintText(str);\n    taskId = CreateTask(Task_PrintAndWaitForText, 1);\n    gTasks[taskId].tKeepOpen = keepOpen;\n    return taskId;\n}\n\nstatic void Task_PrintAndWaitForText(u8 taskId)\n{\n    if (RunTextPrinters_CheckActive(6) != TRUE)\n    {\n        if (gTasks[taskId].tKeepOpen == FALSE)\n        {\n            ClearStdWindowAndFrameToTransparent(6, FALSE);\n            ClearWindowTilemap(6);\n        }\n        DestroyTask(taskId);\n    }\n}\n\n#undef tKeepOpen\n\nbool8 IsPartyMenuTextPrinterActive(void)\n{\n    return FuncIsActiveTask(Task_PrintAndWaitForText);\n}\n\nstatic void Task_WaitForLinkAndReturnToChooseMon(u8 taskId)\n{\n    if (MenuHelpers_ShouldWaitForLinkRecv() != TRUE)\n    {\n        DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON);\n        gTasks[taskId].func = Task_HandleChooseMonInput;\n    }\n}\n\nstatic void Task_ReturnToChooseMonAfterText(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        ClearStdWindowAndFrameToTransparent(6, FALSE);\n        ClearWindowTilemap(6);\n        if (MenuHelpers_IsLinkActive() == TRUE)\n        {\n            gTasks[taskId].func = Task_WaitForLinkAndReturnToChooseMon;\n        }\n        else\n        {\n            DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON);\n            gTasks[taskId].func = Task_HandleChooseMonInput;\n        }\n    }\n}\n\nstatic void DisplayGaveHeldItemMessage(struct Pokemon *mon, u16 item, bool8 keepOpen, bool8 fromBagMenu)\n{\n    if (!fromBagMenu) // Used Give option from party menu\n        ItemUse_SetQuestLogEvent(QL_EVENT_GAVE_HELD_ITEM, mon, item, 0xFFFF);\n    else if (gPartyMenu.action == PARTY_ACTION_GIVE_PC_ITEM)\n        ItemUse_SetQuestLogEvent(QL_EVENT_GAVE_HELD_ITEM_PC, mon, item, 0xFFFF);\n    else\n        ItemUse_SetQuestLogEvent(QL_EVENT_GAVE_HELD_ITEM_BAG, mon, item, 0xFFFF);\n    GetMonNickname(mon, gStringVar1);\n    CopyItemName(item, gStringVar2);\n    StringExpandPlaceholders(gStringVar4, gText_PkmnWasGivenItem);\n    DisplayPartyMenuMessage(gStringVar4, keepOpen);\n    ScheduleBgCopyTilemapToVram(2);\n}\n\nstatic void DisplayTookHeldItemMessage(struct Pokemon *mon, u16 item, bool8 keepOpen)\n{\n    ItemUse_SetQuestLogEvent(QL_EVENT_TOOK_HELD_ITEM, mon, item, 0xFFFF);\n    GetMonNickname(mon, gStringVar1);\n    CopyItemName(item, gStringVar2);\n    StringExpandPlaceholders(gStringVar4, gText_ReceivedItemFromPkmn);\n    DisplayPartyMenuMessage(gStringVar4, keepOpen);\n    ScheduleBgCopyTilemapToVram(2);\n}\n\nstatic void DisplayAlreadyHoldingItemSwitchMessage(struct Pokemon *mon, u16 item, bool8 keepOpen)\n{\n    GetMonNickname(mon, gStringVar1);\n    CopyItemName(item, gStringVar2);\n    StringExpandPlaceholders(gStringVar4, gText_PkmnAlreadyHoldingItemSwitch);\n    DisplayPartyMenuMessage(gStringVar4, keepOpen);\n    ScheduleBgCopyTilemapToVram(2);\n}\n\nstatic void DisplaySwitchedHeldItemMessage(u16 item, u16 item2, bool8 keepOpen)\n{\n    SetSwappedHeldItemQuestLogEvent(&gPlayerParty[gPartyMenu.slotId], item2, item);\n    CopyItemName(item, gStringVar1);\n    CopyItemName(item2, gStringVar2);\n    StringExpandPlaceholders(gStringVar4, gText_SwitchedPkmnItem);\n    DisplayPartyMenuMessage(gStringVar4, keepOpen);\n    ScheduleBgCopyTilemapToVram(2);\n}\n\nstatic void GiveItemToMon(struct Pokemon *mon, u16 item)\n{\n    u8 itemBytes[2];\n\n    if (ItemIsMail(item) == TRUE)\n    {\n        if (GiveMailToMon(mon, item) == 0xFF)\n            return;\n    }\n    itemBytes[0] = item;\n    itemBytes[1] = item >> 8;\n    SetMonData(mon, MON_DATA_HELD_ITEM, itemBytes);\n}\n\nstatic u8 TryTakeMonItem(struct Pokemon *mon)\n{\n    u16 item = GetMonData(mon, MON_DATA_HELD_ITEM);\n\n    if (item == ITEM_NONE)\n        return 0;\n    if (AddBagItem(item, 1) == FALSE)\n        return 1;\n    item = ITEM_NONE;\n    SetMonData(mon, MON_DATA_HELD_ITEM, &item);\n    return 2;\n}\n\nstatic void BufferBagFullCantTakeItemMessage(u16 itemId)\n{\n    const u8 *string;\n\n    switch (ItemId_GetPocket(itemId))\n    {\n    default:\n        string = gText_MenuBag;\n        break;\n    case POCKET_TM_CASE:\n        string = ItemId_GetName(ITEM_TM_CASE);\n        break;\n    case POCKET_BERRY_POUCH:\n        string = ItemId_GetName(ITEM_BERRY_POUCH);\n        break;\n    }\n    StringCopy(gStringVar1, string);\n    StringExpandPlaceholders(gStringVar4, gText_BagFullCouldNotRemoveItem);\n}\n\n#define tHP           data[0]\n#define tMaxHP        data[1]\n#define tHPIncrement  data[2]\n#define tHPToAdd      data[3]\n#define tPartyId      data[4]\n#define tStartHP      data[5]\n\nstatic void Task_PartyMenuModifyHP(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    tHP += tHPIncrement;\n    --tHPToAdd;\n    SetMonData(&gPlayerParty[tPartyId], MON_DATA_HP, &tHP);\n    DisplayPartyPokemonHPCheck(&gPlayerParty[tPartyId], &sPartyMenuBoxes[tPartyId], DRAW_MENU_BOX_AND_TEXT);\n    DisplayPartyPokemonHPBarCheck(&gPlayerParty[tPartyId], &sPartyMenuBoxes[tPartyId]);\n    if (tHPToAdd == 0 || tHP == 0 || tHP == tMaxHP)\n    {\n        // If HP was recovered, buffer the amount recovered\n        if (tHP > tStartHP)\n            ConvertIntToDecimalStringN(gStringVar2, tHP - tStartHP, STR_CONV_MODE_LEFT_ALIGN, 3);\n        SwitchTaskToFollowupFunc(taskId);\n    }\n}\n\nvoid PartyMenuModifyHP(u8 taskId, u8 slot, s8 hpIncrement, s16 hpDifference, TaskFunc task)\n{\n    struct Pokemon *mon = &gPlayerParty[slot];\n    s16 *data = gTasks[taskId].data;\n\n    tHP = GetMonData(mon, MON_DATA_HP);\n    tMaxHP = GetMonData(mon, MON_DATA_MAX_HP);\n    tHPIncrement = hpIncrement;\n    tHPToAdd = hpDifference;\n    tPartyId = slot;\n    tStartHP = tHP;\n    SetTaskFuncWithFollowupFunc(taskId, Task_PartyMenuModifyHP, task);\n}\n\n// The usage of hp in this function is mostly nonsense\n// Because caseId is always passed 0, none of the other cases ever occur\nstatic void ResetHPTaskData(u8 taskId, u8 caseId, u32 hp)\n{\n    s16 *data = gTasks[taskId].data;\n\n    switch (caseId) // always zero\n    {\n    case 0:\n        tHP = hp;\n        tStartHP = hp;\n        break;\n    case 1:\n        tMaxHP = hp;\n        break;\n    case 2:\n        tHPIncrement = hp;\n        break;\n    case 3:\n        tHPToAdd = hp;\n        break;\n    case 4:\n        tPartyId = hp;\n        break;\n    case 5:\n        SetTaskFuncWithFollowupFunc(taskId, Task_PartyMenuModifyHP, (TaskFunc)hp); // >casting hp as a taskfunc\n        break;\n    }\n}\n\n#undef tHP\n#undef tMaxHP\n#undef tHPIncrement\n#undef tHPToAdd\n#undef tPartyId\n#undef tStartHP\n\nu8 GetAilmentFromStatus(u32 status)\n{\n    if (status & STATUS1_PSN_ANY)\n        return AILMENT_PSN;\n    if (status & STATUS1_PARALYSIS)\n        return AILMENT_PRZ;\n    if (status & STATUS1_SLEEP)\n        return AILMENT_SLP;\n    if (status & STATUS1_FREEZE)\n        return AILMENT_FRZ;\n    if (status & STATUS1_BURN)\n        return AILMENT_BRN;\n    return AILMENT_NONE;\n}\n\nu8 GetMonAilment(struct Pokemon *mon)\n{\n    u8 ailment;\n\n    if (GetMonData(mon, MON_DATA_HP) == 0)\n        return AILMENT_FNT;\n    ailment = GetAilmentFromStatus(GetMonData(mon, MON_DATA_STATUS));\n    if (ailment != AILMENT_NONE)\n        return ailment;\n    if (CheckPartyPokerus(mon, 0))\n        return AILMENT_PKRS;\n    return AILMENT_NONE;\n}\n\n#define minigameBitflag data[0]\n\nstatic void SetPartyMonsAllowedInMinigame(void)\n{\n    if (gPartyMenu.menuType == PARTY_MENU_TYPE_MINIGAME)\n    {\n        u32 i;\n        s16 *data = gPartyMenu.data;\n        minigameBitflag = 0;\n        if (gSpecialVar_0x8005 == 0)\n        {\n            for (i = 0; i < gPlayerPartyCount; ++i)\n                minigameBitflag += IsMonAllowedInPokemonJump(&gPlayerParty[i]) << i;\n        }\n        else\n        {\n            for (i = 0; i < gPlayerPartyCount; ++i)\n                minigameBitflag += IsMonAllowedInDodrioBerryPicking(&gPlayerParty[i]) << i;\n        }\n    }\n}\n\nstatic bool16 IsMonAllowedInPokemonJump(struct Pokemon *mon)\n{\n    if (GetMonData(mon, MON_DATA_IS_EGG) != TRUE && IsSpeciesAllowedInPokemonJump(GetMonData(mon, MON_DATA_SPECIES)))\n        return TRUE;\n    return FALSE;\n}\n\nstatic bool16 IsMonAllowedInDodrioBerryPicking(struct Pokemon *mon)\n{\n    if (GetMonData(mon, MON_DATA_IS_EGG) != TRUE && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_DODRIO)\n        return TRUE;\n    return FALSE;\n}\n\nstatic bool8 IsMonAllowedInMinigame(u8 slot)\n{\n    if (!((gPartyMenu.minigameBitflag >> slot) & 1))\n        return FALSE;\n    return TRUE;\n}\n\n#undef minigameBitflag\n\nstatic void TryEnterMonForMinigame(u8 taskId, u8 slot)\n{\n    if (IsMonAllowedInMinigame(slot) == TRUE)\n    {\n        PlaySE(SE_SELECT);\n        gSpecialVar_0x8004 = slot;\n        Task_ClosePartyMenu(taskId);\n    }\n    else\n    {\n        PlaySE(SE_FAILURE);\n        DisplayPartyMenuMessage(gText_PkmnCantParticipate, FALSE);\n        ScheduleBgCopyTilemapToVram(2);\n        gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n    }\n}\n\nstatic void CancelParticipationPrompt(u8 taskId)\n{\n    DisplayPartyMenuMessage(gText_CancelParticipation, TRUE);\n    ScheduleBgCopyTilemapToVram(2);\n    gTasks[taskId].func = Task_CancelParticipationYesNo;\n}\n\nstatic void Task_CancelParticipationYesNo(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        PartyMenuDisplayYesNoMenu();\n        gTasks[taskId].func = Task_HandleCancelParticipationYesNoInput;\n    }\n}\n\nstatic void Task_HandleCancelParticipationYesNoInput(u8 taskId)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0:\n        gSpecialVar_0x8004 = SLOT_CANCEL;\n        Task_ClosePartyMenu(taskId);\n        break;\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        // fallthrough\n    case 1:\n        gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n        break;\n    }\n}\n\nstatic u8 CanMonLearnTMTutor(struct Pokemon *mon, u16 item, u8 tutor)\n{\n    u16 move;\n\n    if (GetMonData(mon, MON_DATA_IS_EGG))\n        return CANNOT_LEARN_MOVE_IS_EGG;\n\n    if (item >= ITEM_TM01_FOCUS_PUNCH)\n    {\n        if (!CanMonLearnTMHM(mon, item - ITEM_TM01_FOCUS_PUNCH))\n            return CANNOT_LEARN_MOVE;\n        else\n            move = ItemIdToBattleMoveId(item);\n    }\n    else if (CanLearnTutorMove(GetMonData(mon, MON_DATA_SPECIES), tutor) == FALSE)\n        return CANNOT_LEARN_MOVE;\n    else\n        move = GetTutorMove(tutor);\n\n    if (MonKnowsMove(mon, move) == TRUE)\n        return ALREADY_KNOWS_MOVE;\n    else\n        return CAN_LEARN_MOVE;\n}\n\nstatic u16 GetTutorMove(u8 tutor)\n{\n    switch (tutor)\n    {\n    case TUTOR_MOVE_FRENZY_PLANT:\n        return MOVE_FRENZY_PLANT;\n    case TUTOR_MOVE_BLAST_BURN:\n        return MOVE_BLAST_BURN;\n    case TUTOR_MOVE_HYDRO_CANNON:\n        return MOVE_HYDRO_CANNON;\n    default:\n        return sTutorMoves[tutor];\n    }\n}\n\nstatic bool8 CanLearnTutorMove(u16 species, u8 tutor)\n{\n    switch (tutor)\n    {\n    case TUTOR_MOVE_FRENZY_PLANT:\n        if (species == SPECIES_VENUSAUR)\n            return TRUE;\n        else\n            return FALSE;\n    case TUTOR_MOVE_BLAST_BURN:\n        if (species == SPECIES_CHARIZARD)\n            return TRUE;\n        else\n            return FALSE;\n    case TUTOR_MOVE_HYDRO_CANNON:\n        if (species == SPECIES_BLASTOISE)\n            return TRUE;\n        else\n            return FALSE;\n    default:\n        if (sTutorLearnsets[species] & ((u64) 1 << tutor))\n            return TRUE;\n        else\n            return FALSE;\n    }\n}\n\n// Tutorial battle messages\n\nstatic void Task_FirstBattleEnterParty_WaitFadeIn(u8 taskId)\n{\n    if (!gPaletteFade.active)\n        gTasks[taskId].func = Task_FirstBattleEnterParty_DarkenScreen;\n}\n\nstatic void Task_FirstBattleEnterParty_DarkenScreen(u8 taskId)\n{\n    BeginNormalPaletteFade(0xFFFF1FFF, 4, 0, 6, RGB_BLACK);\n    gTasks[taskId].func = Task_FirstBattleEnterParty_WaitDarken;\n}\n\nstatic void Task_FirstBattleEnterParty_WaitDarken(u8 taskId)\n{\n    if (!gPaletteFade.active)\n        gTasks[taskId].func = Task_FirstBattleEnterParty_CreatePrinter;\n}\n\nstatic void Task_FirstBattleEnterParty_CreatePrinter(u8 taskId)\n{\n    gTasks[taskId].data[0] = FirstBattleEnterParty_CreateWindowAndMsg1Printer();\n    gTasks[taskId].func = Task_FirstBattleEnterParty_RunPrinterMsg1;\n}\n\nstatic void Task_FirstBattleEnterParty_RunPrinterMsg1(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (RunTextPrinters_CheckActive((u8)data[0]) != TRUE)\n        gTasks[taskId].func = Task_FirstBattleEnterParty_LightenFirstMonIcon;\n}\n\nstatic void Task_FirstBattleEnterParty_LightenFirstMonIcon(u8 taskId)\n{\n    BeginNormalPaletteFade(0xFFFF0008, 4, 6, 0, RGB_BLACK);\n    gTasks[taskId].func = Task_FirstBattleEnterParty_WaitLightenFirstMonIcon;\n}\n\nstatic void Task_FirstBattleEnterParty_WaitLightenFirstMonIcon(u8 taskId)\n{\n    if (!gPaletteFade.active)\n        gTasks[taskId].func = Task_FirstBattleEnterParty_StartPrintMsg2;\n}\n\nstatic void Task_FirstBattleEnterParty_StartPrintMsg2(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    PartyMenu_Oak_PrintText(data[0], gText_OakThisIsListOfPokemon);\n    gTasks[taskId].func = Task_FirstBattleEnterParty_RunPrinterMsg2;\n}\n\nstatic void Task_FirstBattleEnterParty_RunPrinterMsg2(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (RunTextPrinters_CheckActive((u8)data[0]) != TRUE)\n    {\n        FirstBattleEnterParty_DestroyVoiceoverWindow((u8)data[0]);\n        gTasks[taskId].func = Task_FirstBattleEnterParty_FadeNormal;\n    }\n}\n\nstatic void Task_FirstBattleEnterParty_FadeNormal(u8 taskId)\n{\n    BeginNormalPaletteFade(0x0000FFF7, 4, 6, 0, RGB_BLACK);\n    gTasks[taskId].func = Task_FirstBattleEnterParty_WaitFadeNormal;\n}\n\nstatic void Task_FirstBattleEnterParty_WaitFadeNormal(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        LoadUserWindowGfx(0, 0x4F, BG_PLTT_ID(13));\n        LoadStdWindowGfx(0, 0x58, BG_PLTT_ID(15));\n        if (gPartyMenu.action == PARTY_ACTION_USE_ITEM)\n            DisplayPartyMenuStdMessage(PARTY_MSG_USE_ON_WHICH_MON);\n        else\n            DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON);\n        gTasks[taskId].func = Task_HandleChooseMonInput;\n    }\n}\n\n// Pokedude switches Pokemon\nstatic void Task_PartyMenu_Pokedude(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    data[0] = 0;\n    gTasks[taskId].func = Task_PartyMenu_PokedudeStep;\n}\n\nstatic void Task_PartyMenu_PokedudeStep(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (!gPaletteFade.active && PartyMenuPokedudeIsCancelled(taskId) != TRUE)\n    {\n        switch (data[0])\n        {\n        case 80:\n            UpdateCurrentPartySelection(&gPartyMenu.slotId, MENU_DIR_RIGHT);\n            break;\n        case 160:\n            PlaySE(SE_SELECT);\n            CreateSelectionWindow();\n            break;\n        case 240:\n            PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[2]);\n            sCursorOptions[sPartyMenuInternal->actions[0]].func(taskId);\n            break;\n        }\n        ++data[0];\n    }\n}\n\nstatic bool8 PartyMenuPokedudeIsCancelled(u8 taskId)\n{\n    if (JOY_NEW(B_BUTTON))\n    {\n        sPartyMenuInternal->exitCallback = PartyMenuHandlePokedudeCancel;\n        Task_ClosePartyMenu(taskId);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void PartyMenuHandlePokedudeCancel(void)\n{\n    FreeRestoreBattleData();\n    LoadPlayerParty();\n    SetTeachyTvControllerModeToResume();\n    SetMainCallback2(CB2_ReturnToTeachyTV);\n}\n\n// Pokedude uses item on his own Pokemon\nstatic void Task_PartyMenuFromBag_Pokedude(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    data[0] = 0;\n    gTasks[taskId].func = Task_PartyMenuFromBag_PokedudeStep;\n}\n\nstatic void Task_PartyMenuFromBag_PokedudeStep(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (!gPaletteFade.active && PartyMenuPokedudeIsCancelled(taskId) != TRUE)\n    {\n        if (data[0] != 80)\n        {\n            ++data[0];\n        }\n        else\n        {\n            sPartyMenuInternal->exitCallback = CB2_SetUpExitToBattleScreen;\n            gItemUseCB(taskId, Task_ClosePartyMenuAfterText);\n        }\n    }\n}\n\nstatic void InitPartyMenuWindows(u8 layout)\n{\n    u32 i;\n\n    switch (layout)\n    {\n    case PARTY_LAYOUT_SINGLE:\n        InitWindows(sSinglePartyMenuWindowTemplate);\n        break;\n    case PARTY_LAYOUT_DOUBLE:\n        InitWindows(sDoublePartyMenuWindowTemplate);\n        break;\n    case PARTY_LAYOUT_MULTI:\n        InitWindows(sMultiPartyMenuWindowTemplate);\n        break;\n    default: // PARTY_LAYOUT_MULTI_SHOWCASE\n        InitWindows(sShowcaseMultiPartyMenuWindowTemplate);\n        break;\n    }\n    DeactivateAllTextPrinters();\n    for (i = 0; i < PARTY_SIZE; ++i)\n        FillWindowPixelBuffer(i, PIXEL_FILL(0));\n    LoadUserWindowGfx(0, 0x4F, BG_PLTT_ID(13));\n    LoadStdWindowGfx(0, 0x58, BG_PLTT_ID(15));\n    LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(12), PLTT_SIZE_4BPP);\n    LoadPalette(GetTextWindowPalette(0), BG_PLTT_ID(14), PLTT_SIZE_4BPP);\n}\n\nstatic void CreateCancelConfirmWindows(bool8 chooseMultiple)\n{\n    u8 confirmWindowId;\n    u8 cancelWindowId;\n    u8 offset;\n\n    if (gPartyMenu.menuType != PARTY_MENU_TYPE_MULTI_SHOWCASE)\n    {\n        if (chooseMultiple == TRUE)\n        {\n            confirmWindowId = AddWindow(&sConfirmButtonWindowTemplate);\n            FillWindowPixelBuffer(confirmWindowId, PIXEL_FILL(0));\n            AddTextPrinterParameterized4(confirmWindowId, FONT_SMALL, (48 - GetStringWidth(FONT_SMALL, gText_PartyMenu_OK, 0)) / 2u, 1, 0, 0, sFontColorTable[0], -1, gText_PartyMenu_OK);\n            PutWindowTilemap(confirmWindowId);\n            CopyWindowToVram(confirmWindowId, COPYWIN_GFX);\n            cancelWindowId = AddWindow(&sMultiCancelButtonWindowTemplate);\n            offset = 0;\n        }\n        else\n        {\n            cancelWindowId = AddWindow(&sCancelButtonWindowTemplate);\n            offset = 3;\n        }\n        FillWindowPixelBuffer(cancelWindowId, PIXEL_FILL(0));\n        // Branches are functionally identical. Second branch is never reached, Spin Trade wasnt fully implemented\n        if (gPartyMenu.menuType != PARTY_MENU_TYPE_SPIN_TRADE)\n        {\n            offset += (48 - GetStringWidth(FONT_SMALL, gFameCheckerText_Cancel, 0)) / 2;\n            AddTextPrinterParameterized3(cancelWindowId, FONT_SMALL, offset, 1, sFontColorTable[0], -1, gFameCheckerText_Cancel);\n        }\n        else\n        {\n            offset += (48 - GetStringWidth(FONT_SMALL, gOtherText_Exit, 0)) / 2;\n            AddTextPrinterParameterized3(cancelWindowId, FONT_SMALL, offset, 1, sFontColorTable[0], -1, gOtherText_Exit);\n        }\n        PutWindowTilemap(cancelWindowId);\n        CopyWindowToVram(cancelWindowId, COPYWIN_GFX);\n        ScheduleBgCopyTilemapToVram(0);\n    }\n}\n\nstatic u16 *GetPartyMenuPalBufferPtr(u8 paletteId)\n{\n    return &sPartyMenuInternal->palBuffer[paletteId];\n}\n\nstatic void BlitBitmapToPartyWindow(u8 windowId, const u8 *tileNums, u8 menuBoxWidth, u8 x, u8 y, u8 width, u8 height)\n{\n    u8 *pixels = AllocZeroed(height * width * 32);\n    u8 i, j;\n\n    if (pixels != NULL)\n    {\n        for (i = 0; i < height; ++i)\n            for (j = 0; j < width; ++j)\n                CpuCopy16(GetPartyMenuBgTile(tileNums[x + j + ((y + i) * menuBoxWidth)]), &pixels[(i * width + j) * 32], 32);\n        BlitBitmapToWindow(windowId, pixels, x * 8, y * 8, width * 8, height * 8);\n        Free(pixels);\n    }\n}\n\nstatic void BlitBitmapToPartyWindow_LeftColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 hideHP)\n{\n    if (width == 0 && height == 0)\n    {\n        width = 10;\n        height = 7;\n    }\n    if (!hideHP)\n        BlitBitmapToPartyWindow(windowId, sSlotTilemap_Main, 10, x, y, width, height);\n    else\n        BlitBitmapToPartyWindow(windowId, sSlotTilemap_MainNoHP, 10, x, y, width, height);\n}\n\nstatic void BlitBitmapToPartyWindow_RightColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 hideHP)\n{\n    if (width == 0 && height == 0)\n    {\n        width = 18;\n        height = 3;\n    }\n    if (!hideHP)\n        BlitBitmapToPartyWindow(windowId, sSlotTilemap_Wide, 18, x, y, width, height);\n    else\n        BlitBitmapToPartyWindow(windowId, sSlotTilemap_WideNoHP, 18, x, y, width, height);\n}\n\nstatic void DrawEmptySlot(u8 windowId)\n{\n    BlitBitmapToPartyWindow(windowId, sSlotTilemap_WideEmpty, 18, 0, 0, 18, 3);\n}\n\n#define LOAD_PARTY_BOX_PAL(paletteIds, paletteOffsets)                                                    \\\n{                                                                                                         \\\n    LoadPalette(GetPartyMenuPalBufferPtr(paletteIds[0]), paletteOffsets[0] + palOffset, PLTT_SIZEOF(1));  \\\n    LoadPalette(GetPartyMenuPalBufferPtr(paletteIds[1]), paletteOffsets[1] + palOffset, PLTT_SIZEOF(1));  \\\n    LoadPalette(GetPartyMenuPalBufferPtr(paletteIds[2]), paletteOffsets[2] + palOffset, PLTT_SIZEOF(1));  \\\n}\n\nstatic void LoadPartyBoxPalette(struct PartyMenuBox *menuBox, u8 palFlags)\n{\n    u8 palOffset = BG_PLTT_ID(GetWindowAttribute(menuBox->windowId, WINDOW_PALETTE_NUM));\n\n    if (palFlags & PARTY_PAL_TO_SOFTBOIL)\n    {\n        if (palFlags & PARTY_PAL_SELECTED)\n        {\n            LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds1, sPartyBoxPalOffsets1);\n            LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionPalIds2, sPartyBoxPalOffsets2);\n        }\n        else\n        {\n            LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds1, sPartyBoxPalOffsets1);\n            LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds2, sPartyBoxPalOffsets2);\n        }\n    }\n    else if (palFlags & PARTY_PAL_SWITCHING)\n    {\n        LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds1, sPartyBoxPalOffsets1);\n        LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds2, sPartyBoxPalOffsets2);\n    }\n    else if (palFlags & PARTY_PAL_TO_SWITCH)\n    {\n        if (palFlags & PARTY_PAL_SELECTED)\n        {\n            LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds1, sPartyBoxPalOffsets1);\n            LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionPalIds2, sPartyBoxPalOffsets2);\n        }\n        else\n        {\n            LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds1, sPartyBoxPalOffsets1);\n            LOAD_PARTY_BOX_PAL(sPartyBoxSelectedForActionPalIds2, sPartyBoxPalOffsets2);\n        }\n    }\n    else if (palFlags & PARTY_PAL_FAINTED)\n    {\n        if (palFlags & PARTY_PAL_SELECTED)\n        {\n            LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionFaintedPalIds, sPartyBoxPalOffsets1);\n            LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionPalIds2, sPartyBoxPalOffsets2);\n        }\n        else\n        {\n            LOAD_PARTY_BOX_PAL(sPartyBoxFaintedPalIds1, sPartyBoxPalOffsets1);\n            LOAD_PARTY_BOX_PAL(sPartyBoxFaintedPalIds2, sPartyBoxPalOffsets2);\n        }\n    }\n    else if (palFlags & PARTY_PAL_MULTI_ALT)\n    {\n        if (palFlags & PARTY_PAL_SELECTED)\n        {\n            LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionMultiPalIds, sPartyBoxPalOffsets1);\n            LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionPalIds2, sPartyBoxPalOffsets2);\n        }\n        else\n        {\n            LOAD_PARTY_BOX_PAL(sPartyBoxMultiPalIds1, sPartyBoxPalOffsets1);\n            LOAD_PARTY_BOX_PAL(sPartyBoxMultiPalIds2, sPartyBoxPalOffsets2);\n        }\n    }\n    else if (palFlags & PARTY_PAL_SELECTED)\n    {\n        LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionPalIds1, sPartyBoxPalOffsets1);\n        LOAD_PARTY_BOX_PAL(sPartyBoxCurrSelectionPalIds2, sPartyBoxPalOffsets2);\n    }\n    else\n    {\n        LOAD_PARTY_BOX_PAL(sPartyBoxEmptySlotPalIds1, sPartyBoxPalOffsets1);\n        LOAD_PARTY_BOX_PAL(sPartyBoxEmptySlotPalIds2, sPartyBoxPalOffsets2);\n    }\n}\n\nstatic void DisplayPartyPokemonBarDetail(u8 windowId, const u8 *str, u8 color, const u8 *dimensions)\n{\n    AddTextPrinterParameterized3(windowId, FONT_SMALL, dimensions[0], dimensions[1], sFontColorTable[color], 0, str);\n}\n\nstatic void DisplayPartyPokemonNickname(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText)\n{\n    u8 nickname[POKEMON_NAME_LENGTH + 1];\n\n    if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)\n    {\n        if (drawMenuBoxOrText == DRAW_MENU_BOX_AND_TEXT)\n            menuBox->infoRects->blitFunc(menuBox->windowId, menuBox->infoRects->dimensions[0] / 8, menuBox->infoRects->dimensions[1] / 8, menuBox->infoRects->dimensions[2] / 8, menuBox->infoRects->dimensions[3] / 8, FALSE);\n        GetMonNickname(mon, nickname);\n        DisplayPartyPokemonBarDetail(menuBox->windowId, nickname, 0, menuBox->infoRects->dimensions);\n    }\n}\n\nstatic void DisplayPartyPokemonLevelCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText)\n{\n    if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)\n    {\n        u8 ailment = GetMonAilment(mon);\n\n        if (ailment == AILMENT_NONE || ailment == AILMENT_PKRS)\n        {\n            if (drawMenuBoxOrText != DRAW_TEXT_ONLY)\n                menuBox->infoRects->blitFunc(menuBox->windowId, menuBox->infoRects->dimensions[4] / 8, (menuBox->infoRects->dimensions[5] / 8) + 1, menuBox->infoRects->dimensions[6] / 8, menuBox->infoRects->dimensions[7] / 8, FALSE);\n            if (drawMenuBoxOrText != DRAW_MENU_BOX_ONLY)\n                DisplayPartyPokemonLevel(GetMonData(mon, MON_DATA_LEVEL), menuBox);\n        }\n    }\n}\n\nstatic void DisplayPartyPokemonLevel(u8 level, struct PartyMenuBox *menuBox)\n{\n    ConvertIntToDecimalStringN(gStringVar2, level, STR_CONV_MODE_LEFT_ALIGN, 3);\n    StringCopy(gStringVar1, gText_Lv);\n    StringAppend(gStringVar1, gStringVar2);\n    DisplayPartyPokemonBarDetail(menuBox->windowId, gStringVar1, 0, &menuBox->infoRects->dimensions[4]);\n}\n\nstatic void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText)\n{\n    u8 nickname[POKEMON_NAME_LENGTH + 1];\n\n    if (drawMenuBoxOrText == DRAW_MENU_BOX_AND_TEXT)\n        menuBox->infoRects->blitFunc(menuBox->windowId, menuBox->infoRects->dimensions[8] / 8, (menuBox->infoRects->dimensions[9] / 8) + 1, menuBox->infoRects->dimensions[10] / 8, menuBox->infoRects->dimensions[11] / 8, FALSE);\n    GetMonNickname(mon, nickname);\n    DisplayPartyPokemonGender(GetMonGender(mon), GetMonData(mon, MON_DATA_SPECIES), nickname, menuBox);\n}\n\nstatic void DisplayPartyPokemonGender(u8 gender, u16 species, u8 *nickname, struct PartyMenuBox *menuBox)\n{\n    u8 palOffset = BG_PLTT_ID(GetWindowAttribute(menuBox->windowId, WINDOW_PALETTE_NUM));\n\n    if (species == SPECIES_NONE)\n        return;\n    if ((species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) && StringCompare(nickname, gSpeciesNames[species]) == 0)\n        return;\n    switch (gender)\n    {\n    case MON_MALE:\n        LoadPalette(GetPartyMenuPalBufferPtr(sGenderMalePalIds[0]), sGenderPalOffsets[0] + palOffset, PLTT_SIZEOF(1));\n        LoadPalette(GetPartyMenuPalBufferPtr(sGenderMalePalIds[1]), sGenderPalOffsets[1] + palOffset, PLTT_SIZEOF(1));\n        DisplayPartyPokemonBarDetail(menuBox->windowId, gText_MaleSymbol, 2, &menuBox->infoRects->dimensions[8]);\n        break;\n    case MON_FEMALE:\n        LoadPalette(GetPartyMenuPalBufferPtr(sGenderFemalePalIds[0]), sGenderPalOffsets[0] + palOffset, PLTT_SIZEOF(1));\n        LoadPalette(GetPartyMenuPalBufferPtr(sGenderFemalePalIds[1]), sGenderPalOffsets[1] + palOffset, PLTT_SIZEOF(1));\n        DisplayPartyPokemonBarDetail(menuBox->windowId, gText_FemaleSymbol, 2, &menuBox->infoRects->dimensions[8]);\n        break;\n    }\n}\n\nstatic void DisplayPartyPokemonHPCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText)\n{\n    if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)\n    {\n        if (drawMenuBoxOrText != DRAW_TEXT_ONLY)\n            menuBox->infoRects->blitFunc(menuBox->windowId, menuBox->infoRects->dimensions[12] / 8, (menuBox->infoRects->dimensions[13] / 8) + 1, menuBox->infoRects->dimensions[14] / 8, menuBox->infoRects->dimensions[15] / 8, FALSE);\n        if (drawMenuBoxOrText != DRAW_MENU_BOX_ONLY)\n            DisplayPartyPokemonHP(GetMonData(mon, MON_DATA_HP), menuBox);\n    }\n}\n\nstatic void DisplayPartyPokemonHP(u16 hp, struct PartyMenuBox *menuBox)\n{\n    u8 *strOut = ConvertIntToDecimalStringN(gStringVar1, hp, STR_CONV_MODE_RIGHT_ALIGN, 3);\n\n    strOut[0] = CHAR_SLASH;\n    strOut[1] = EOS;\n    DisplayPartyPokemonBarDetail(menuBox->windowId, gStringVar1, 0, &menuBox->infoRects->dimensions[12]);\n}\n\nstatic void DisplayPartyPokemonMaxHPCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText)\n{\n    if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)\n    {\n        if (drawMenuBoxOrText != DRAW_TEXT_ONLY)\n            menuBox->infoRects->blitFunc(menuBox->windowId, (menuBox->infoRects->dimensions[16] / 8) + 1, (menuBox->infoRects->dimensions[17] / 8) + 1, menuBox->infoRects->dimensions[18] / 8, menuBox->infoRects->dimensions[19] / 8, FALSE);\n        if (drawMenuBoxOrText != DRAW_MENU_BOX_ONLY)\n            DisplayPartyPokemonMaxHP(GetMonData(mon, MON_DATA_MAX_HP), menuBox);\n    }\n}\n\nstatic void DisplayPartyPokemonMaxHP(u16 maxhp, struct PartyMenuBox *menuBox)\n{\n    ConvertIntToDecimalStringN(gStringVar2, maxhp, STR_CONV_MODE_RIGHT_ALIGN, 3);\n    StringCopy(gStringVar1, gText_Slash);\n    StringAppend(gStringVar1, gStringVar2);\n    DisplayPartyPokemonBarDetail(menuBox->windowId, gStringVar1, 0, &menuBox->infoRects->dimensions[16]);\n}\n\nstatic void DisplayPartyPokemonHPBarCheck(struct Pokemon *mon, struct PartyMenuBox *menuBox)\n{\n    if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)\n        DisplayPartyPokemonHPBar(GetMonData(mon, MON_DATA_HP), GetMonData(mon, MON_DATA_MAX_HP), menuBox);\n}\n\nstatic void DisplayPartyPokemonHPBar(u16 hp, u16 maxhp, struct PartyMenuBox *menuBox)\n{\n    u8 palOffset = BG_PLTT_ID(GetWindowAttribute(menuBox->windowId, WINDOW_PALETTE_NUM));\n    u8 hpFraction;\n\n    switch (GetHPBarLevel(hp, maxhp))\n    {\n    case HP_BAR_GREEN:\n    case HP_BAR_FULL:\n        LoadPalette(GetPartyMenuPalBufferPtr(sHPBarGreenPalIds[0]), sHPBarPalOffsets[0] + palOffset, PLTT_SIZEOF(1));\n        LoadPalette(GetPartyMenuPalBufferPtr(sHPBarGreenPalIds[1]), sHPBarPalOffsets[1] + palOffset, PLTT_SIZEOF(1));\n        break;\n    case HP_BAR_YELLOW:\n        LoadPalette(GetPartyMenuPalBufferPtr(sHPBarYellowPalIds[0]), sHPBarPalOffsets[0] + palOffset, PLTT_SIZEOF(1));\n        LoadPalette(GetPartyMenuPalBufferPtr(sHPBarYellowPalIds[1]), sHPBarPalOffsets[1] + palOffset, PLTT_SIZEOF(1));\n        break;\n    default:\n        LoadPalette(GetPartyMenuPalBufferPtr(sHPBarRedPalIds[0]), sHPBarPalOffsets[0] + palOffset, PLTT_SIZEOF(1));\n        LoadPalette(GetPartyMenuPalBufferPtr(sHPBarRedPalIds[1]), sHPBarPalOffsets[1] + palOffset, PLTT_SIZEOF(1));\n        break;\n    }\n    hpFraction = GetScaledHPFraction(hp, maxhp, menuBox->infoRects->dimensions[22]);\n    FillWindowPixelRect(menuBox->windowId, sHPBarPalOffsets[1], menuBox->infoRects->dimensions[20], menuBox->infoRects->dimensions[21], hpFraction, 1);\n    FillWindowPixelRect(menuBox->windowId, sHPBarPalOffsets[0], menuBox->infoRects->dimensions[20], menuBox->infoRects->dimensions[21] + 1, hpFraction, 2);\n    if (hpFraction != menuBox->infoRects->dimensions[22])\n    {\n        // This appears to be an alternating fill\n        FillWindowPixelRect(menuBox->windowId, 0x0D, menuBox->infoRects->dimensions[20] + hpFraction, menuBox->infoRects->dimensions[21], menuBox->infoRects->dimensions[22] - hpFraction, 1);\n        FillWindowPixelRect(menuBox->windowId, 0x02, menuBox->infoRects->dimensions[20] + hpFraction, menuBox->infoRects->dimensions[21] + 1, menuBox->infoRects->dimensions[22] - hpFraction, 2);\n    }\n    CopyWindowToVram(menuBox->windowId, COPYWIN_GFX);\n}\n\nstatic void DisplayPartyPokemonDescriptionText(u8 stringId, struct PartyMenuBox *menuBox, u8 drawMenuBoxOrText)\n{\n    if (drawMenuBoxOrText != DRAW_TEXT_ONLY)\n        menuBox->infoRects->blitFunc(menuBox->windowId, menuBox->infoRects->descTextLeft / 8, menuBox->infoRects->descTextTop / 8, menuBox->infoRects->descTextWidth / 8, menuBox->infoRects->descTextHeight / 8, TRUE);\n    if (drawMenuBoxOrText != DRAW_MENU_BOX_ONLY)\n        AddTextPrinterParameterized3(menuBox->windowId, FONT_NORMAL_COPY_1, menuBox->infoRects->descTextLeft, menuBox->infoRects->descTextTop, sFontColorTable[0], 0, sDescriptionStringTable[stringId]);\n}\n\nstatic void PartyMenuRemoveWindow(u8 *windowId)\n{\n    if (*windowId != WINDOW_NONE)\n    {\n        ClearStdWindowAndFrameToTransparent(*windowId, FALSE);\n        RemoveWindow(*windowId);\n        *windowId = WINDOW_NONE;\n        ScheduleBgCopyTilemapToVram(2);\n    }\n}\n\nvoid DisplayPartyMenuStdMessage(u32 stringId)\n{\n    u8 *windowPtr = &sPartyMenuInternal->windowId[1];\n\n    if (*windowPtr != WINDOW_NONE)\n        PartyMenuRemoveWindow(windowPtr);\n\n    if (stringId != PARTY_MSG_NONE)\n    {\n        switch (stringId)\n        {\n        case PARTY_MSG_DO_WHAT_WITH_MON:\n            *windowPtr = AddWindow(&sDoWhatWithMonMsgWindowTemplate);\n            break;\n        case PARTY_MSG_DO_WHAT_WITH_ITEM:\n            *windowPtr = AddWindow(&sDoWhatWithItemMsgWindowTemplate);\n            break;\n        case PARTY_MSG_DO_WHAT_WITH_MAIL:\n            *windowPtr = AddWindow(&sDoWhatWithMailMsgWindowTemplate);\n            break;\n        case PARTY_MSG_RESTORE_WHICH_MOVE:\n        case PARTY_MSG_BOOST_PP_WHICH_MOVE:\n            *windowPtr = AddWindow(&sWhichMoveMsgWindowTemplate);\n            break;\n        default:\n            *windowPtr = AddWindow(&sDefaultPartyMsgWindowTemplate);\n            break;\n        }\n\n        if (stringId == PARTY_MSG_CHOOSE_MON)\n        {\n            if (sPartyMenuInternal->chooseMultiple)\n                stringId = PARTY_MSG_CHOOSE_MON_AND_CONFIRM;\n            else if (!ShouldUseChooseMonText())\n                stringId = PARTY_MSG_CHOOSE_MON_OR_CANCEL;\n        }\n        DrawStdFrameWithCustomTileAndPalette(*windowPtr, FALSE, 0x58, 15);\n        StringExpandPlaceholders(gStringVar4, sActionStringTable[stringId]);\n        AddTextPrinterParameterized(*windowPtr, FONT_NORMAL, gStringVar4, 0, 2, 0, 0);\n        ScheduleBgCopyTilemapToVram(2);\n    }\n}\n\nstatic bool8 ShouldUseChooseMonText(void)\n{\n    struct Pokemon *party = gPlayerParty;\n    u32 i;\n    u8 numAliveMons = 0;\n\n    if (gPartyMenu.action == PARTY_ACTION_SEND_OUT)\n        return TRUE;\n    for (i = 0; i < PARTY_SIZE; ++i)\n    {\n        if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && (GetMonData(&party[i], MON_DATA_HP) != 0 || GetMonData(&party[i], MON_DATA_IS_EGG)))\n            ++numAliveMons;\n        if (numAliveMons > 1)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic u8 DisplaySelectionWindow(u8 windowType)\n{\n    struct WindowTemplate window;\n    u8 cursorDimension;\n    u8 fontAttribute;\n    u32 i;\n\n    switch (windowType)\n    {\n    case SELECTWINDOW_ACTIONS:\n        window = SetWindowTemplateFields(2, 19, 19 - (sPartyMenuInternal->numActions * 2), 10, sPartyMenuInternal->numActions * 2, 14, 0x2BF);\n        break;\n    case SELECTWINDOW_ITEM:\n        window = sItemGiveTakeWindowTemplate;\n        break;\n    case SELECTWINDOW_MAIL:\n        window = sMailReadTakeWindowTemplate;\n        break;\n    default: // SELECTWINDOW_MOVES\n        window = sMoveSelectWindowTemplate;\n        break;\n    }\n    sPartyMenuInternal->windowId[0] = AddWindow(&window);\n    DrawStdFrameWithCustomTileAndPalette(sPartyMenuInternal->windowId[0], FALSE, 0x4F, 13);\n    if (windowType == SELECTWINDOW_MOVES)\n        return sPartyMenuInternal->windowId[0];\n    cursorDimension = GetMenuCursorDimensionByFont(FONT_NORMAL, 0);\n    fontAttribute = GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING);\n    for (i = 0; i < sPartyMenuInternal->numActions; ++i)\n    {\n        u8 fontColorsId = (sPartyMenuInternal->actions[i] >= CURSOR_OPTION_FIELD_MOVES) ? 4 : 3;\n        \n        AddTextPrinterParameterized4(sPartyMenuInternal->windowId[0], FONT_NORMAL, cursorDimension, (i * 16) + 2, fontAttribute, 0, sFontColorTable[fontColorsId], 0, sCursorOptions[sPartyMenuInternal->actions[i]].text);\n    }\n    Menu_InitCursorInternal(sPartyMenuInternal->windowId[0], FONT_NORMAL, 0, 2, 16, sPartyMenuInternal->numActions, 0, 1);\n    ScheduleBgCopyTilemapToVram(2);\n    return sPartyMenuInternal->windowId[0];\n}\n\nstatic void PartyMenuPrintText(const u8 *text)\n{\n    DrawStdFrameWithCustomTileAndPalette(6, FALSE, 0x4F, 13);\n    gTextFlags.canABSpeedUpPrint = TRUE;\n    AddTextPrinterParameterized2(6, FONT_NORMAL, text, GetTextSpeedSetting(), 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n}\n\nstatic void PartyMenuDisplayYesNoMenu(void)\n{\n    CreateYesNoMenu(&sPartyMenuYesNoWindowTemplate, FONT_NORMAL, 0, 2, 0x4F, 13, 0);\n}\n\nstatic u8 CreateLevelUpStatsWindow(void)\n{\n    sPartyMenuInternal->windowId[0] = AddWindow(&sLevelUpStatsWindowTemplate);\n    DrawStdFrameWithCustomTileAndPalette(sPartyMenuInternal->windowId[0], FALSE, 0x4F, 13);\n    return sPartyMenuInternal->windowId[0];\n}\n\nstatic void RemoveLevelUpStatsWindow(void)\n{\n    ClearWindowTilemap(sPartyMenuInternal->windowId[0]);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n}\n\nstatic void PartyMenu_Oak_PrintText(u8 windowId, const u8 *str)\n{\n    StringExpandPlaceholders(gStringVar4, str);\n    gTextFlags.canABSpeedUpPrint = TRUE;\n    AddTextPrinterParameterized2(windowId, FONT_MALE, gStringVar4, GetTextSpeedSetting(), NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n}\n\nstatic bool8 FirstBattleEnterParty_CreateWindowAndMsg1Printer(void)\n{\n    u8 windowId = AddWindow(&sWindowTemplate_FirstBattleOakVoiceover);\n\n    LoadMenuMessageWindowGfx(windowId, 0x4F, BG_PLTT_ID(14));\n    DrawDialogFrameWithCustomTileAndPalette(windowId, 1, 0x4F, 0xE);\n    PartyMenu_Oak_PrintText(windowId, gText_OakImportantToGetToKnowPokemonThroughly);\n    return windowId;\n}\n\nstatic void FirstBattleEnterParty_DestroyVoiceoverWindow(u8 windowId)\n{\n    ClearWindowTilemap(windowId);\n    ClearDialogWindowAndFrameToTransparent(windowId, FALSE);\n    RemoveWindow(windowId);\n    ScheduleBgCopyTilemapToVram(2);\n}\n\nstatic void ToggleFieldMoveDescriptionWindow(u8 action)\n{\n    u8 letterSpacing;\n    struct PartyMenuInternal *ptr = sPartyMenuInternal;\n\n    if (action < CURSOR_OPTION_FIELD_MOVES)\n    {\n        if (ptr->windowId[2] != WINDOW_NONE)\n        {\n            ClearWindowTilemap(ptr->windowId[2]);\n            RemoveWindow(ptr->windowId[2]);\n            ptr->windowId[2] = WINDOW_NONE;\n            ScheduleBgCopyTilemapToVram(2);\n        }\n    }\n    else\n    {\n        if (ptr->windowId[2] == WINDOW_NONE)\n            ptr->windowId[2] = AddWindow(&sFieldMoveDescriptionWindowTemplate);\n        DrawHelpMessageWindowTilesById(ptr->windowId[2]);\n        letterSpacing = GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING);\n        AddTextPrinterParameterized4(ptr->windowId[2], FONT_NORMAL, 3, 6, letterSpacing, 0, sFontColorTable[5], 0, sFieldMoveDescriptionTable[action - CURSOR_OPTION_FIELD_MOVES]);\n        PutWindowTilemap(ptr->windowId[2]);\n        ScheduleBgCopyTilemapToVram(2);\n    }\n}\n\nstatic void CreatePartyMonIconSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox, u32 slot)\n{\n    bool32 handleDeoxys = TRUE;\n    u16 species2;\n    u32 personality;\n\n    // If in a multi battle, show partners Deoxys icon as Normal forme\n    if (IsMultiBattle() == TRUE && gMain.inBattle)\n        handleDeoxys = (sMultiBattlePartnersPartyMask[slot] ^ handleDeoxys) ? TRUE : FALSE;\n    species2 = GetMonData(mon, MON_DATA_SPECIES_OR_EGG);\n    if(species2 == SPECIES_DEOXYS && handleDeoxys)\n    {\n        personality = GetMonData(mon, MON_DATA_FORME);\n    }\n\n    CreatePartyMonIconSpriteParameterized(species2, personality, menuBox, 1, handleDeoxys);\n    UpdatePartyMonHPBar(menuBox->monSpriteId, mon);\n}\n\nstatic void CreatePartyMonIconSpriteParameterized(u16 species, u32 pid, struct PartyMenuBox *menuBox, u8 priority, bool32 handleDeoxys)\n{\n    if (species != SPECIES_NONE)\n    {\n        menuBox->monSpriteId = CreateMonIcon(species, SpriteCB_MonIcon, menuBox->spriteCoords[0], menuBox->spriteCoords[1], 4, pid, handleDeoxys);\n        gSprites[menuBox->monSpriteId].oam.priority = priority;\n    }\n}\n\nstatic void UpdateHPBar(u8 spriteId, u16 hp, u16 maxhp)\n{\n    switch (GetHPBarLevel(hp, maxhp))\n    {\n    case HP_BAR_FULL:\n        SetPartyHPBarSprite(&gSprites[spriteId], 0);\n        break;\n    case HP_BAR_GREEN:\n        SetPartyHPBarSprite(&gSprites[spriteId], 1);\n        break;\n    case HP_BAR_YELLOW:\n        SetPartyHPBarSprite(&gSprites[spriteId], 2);\n        break;\n    case HP_BAR_RED:\n        SetPartyHPBarSprite(&gSprites[spriteId], 3);\n        break;\n    default:\n        SetPartyHPBarSprite(&gSprites[spriteId], 4);\n        break;\n    }\n}\n\nstatic void UpdatePartyMonHPBar(u8 spriteId, struct Pokemon *mon)\n{\n    UpdateHPBar(spriteId, GetMonData(mon, MON_DATA_HP), GetMonData(mon, MON_DATA_MAX_HP));\n}\n\nstatic void AnimateSelectedPartyIcon(u8 spriteId, u8 animNum)\n{\n    gSprites[spriteId].data[0] = 0;\n    if (animNum == 0)\n    {\n        if (gSprites[spriteId].x == 16)\n        {\n            gSprites[spriteId].x2 = 0;\n            gSprites[spriteId].y2 = -4;\n        }\n        else\n        {\n            gSprites[spriteId].x2 = -4;\n            gSprites[spriteId].y2 = 0;\n        }\n        gSprites[spriteId].callback = SpriteCB_UpdatePartyMonIcon;\n    }\n    else\n    {\n        gSprites[spriteId].x2 = 0;\n        gSprites[spriteId].y2 = 0;\n        gSprites[spriteId].callback = SpriteCB_BouncePartyMonIcon;\n    }\n}\n\nstatic void SpriteCB_BouncePartyMonIcon(struct Sprite *sprite)\n{\n    u8 animCmd = UpdateMonIconFrame(sprite);\n\n    if (animCmd != 0)\n    {\n        if (animCmd & 1) // % 2 also matches\n            sprite->y2 = -3;\n        else\n            sprite->y2 = 1;\n    }\n}\n\nstatic void SpriteCB_UpdatePartyMonIcon(struct Sprite *sprite)\n{\n    UpdateMonIconFrame(sprite);\n}\n\nstatic void CreatePartyMonHeldItemSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox)\n{\n    if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)\n    {\n        menuBox->itemSpriteId = CreateSprite(&sSpriteTemplate_HeldItem, menuBox->spriteCoords[2], menuBox->spriteCoords[3], 0);\n        UpdatePartyMonHeldItemSprite(mon, menuBox);\n    }\n}\n\nstatic void CreatePartyMonHeldItemSpriteParameterized(u16 species, u16 item, struct PartyMenuBox *menuBox)\n{\n    if (species != SPECIES_NONE)\n    {\n        menuBox->itemSpriteId = CreateSprite(&sSpriteTemplate_HeldItem, menuBox->spriteCoords[2], menuBox->spriteCoords[3], 0);\n        gSprites[menuBox->itemSpriteId].oam.priority = 0;\n        ShowOrHideHeldItemSprite(item, menuBox);\n    }\n}\n\nstatic void UpdatePartyMonHeldItemSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox)\n{\n    ShowOrHideHeldItemSprite(GetMonData(mon, MON_DATA_HELD_ITEM), menuBox);\n}\n\nstatic void ShowOrHideHeldItemSprite(u16 item, struct PartyMenuBox *menuBox)\n{\n    if (item == ITEM_NONE)\n    {\n        gSprites[menuBox->itemSpriteId].invisible = TRUE;\n    }\n    else\n    {\n        if (ItemIsMail(item))\n            StartSpriteAnim(&gSprites[menuBox->itemSpriteId], 1);\n        else\n            StartSpriteAnim(&gSprites[menuBox->itemSpriteId], 0);\n        gSprites[menuBox->itemSpriteId].invisible = FALSE;\n    }\n}\n\nvoid LoadHeldItemIcons(void)\n{\n    LoadSpriteSheet(&sSpriteSheet_HeldItem);\n    LoadSpritePalette(&sSpritePalette_HeldItem);\n}\n\nvoid DrawHeldItemIconsForTrade(u8 *partyCounts, u8 *partySpriteIds, u8 whichParty)\n{\n    u32 i;\n    u16 item;\n\n    switch (whichParty)\n    {\n    case TRADE_PLAYER:\n        for (i = 0; i < partyCounts[TRADE_PLAYER]; ++i)\n        {\n            item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);\n            if (item != ITEM_NONE)\n                CreateHeldItemSpriteForTrade(partySpriteIds[i], ItemIsMail(item));\n        }\n        break;\n    case TRADE_PARTNER:\n        for (i = 0; i < partyCounts[TRADE_PARTNER]; ++i)\n        {\n            item = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM);\n            if (item != ITEM_NONE)\n                CreateHeldItemSpriteForTrade(partySpriteIds[i + PARTY_SIZE], ItemIsMail(item));\n        }\n        break;\n    }\n}\n\nstatic void CreateHeldItemSpriteForTrade(u8 spriteId, bool8 isMail)\n{\n    u8 subpriority = gSprites[spriteId].subpriority;\n    u8 newSpriteId = CreateSprite(&sSpriteTemplate_HeldItem, 250, 170, subpriority - 1);\n\n    gSprites[newSpriteId].x2 = 4;\n    gSprites[newSpriteId].y2 = 10;\n    gSprites[newSpriteId].callback = SpriteCB_HeldItem;\n    gSprites[newSpriteId].data[7] = spriteId;\n    StartSpriteAnim(&gSprites[newSpriteId], isMail);\n    gSprites[newSpriteId].callback(&gSprites[newSpriteId]);\n}\n\nstatic void SpriteCB_HeldItem(struct Sprite *sprite)\n{\n    u8 otherSpriteId = sprite->data[7];\n\n    if (gSprites[otherSpriteId].invisible)\n    {\n        sprite->invisible = TRUE;\n    }\n    else\n    {\n        sprite->invisible = FALSE;\n        sprite->x = gSprites[otherSpriteId].x + gSprites[otherSpriteId].x2;\n        sprite->y = gSprites[otherSpriteId].y + gSprites[otherSpriteId].y2;\n    }\n}\n\nstatic void CreatePartyMonPokeballSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox)\n{\n    if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)\n        menuBox->pokeballSpriteId = CreateSprite(&sSpriteTemplate_MenuPokeball, menuBox->spriteCoords[6], menuBox->spriteCoords[7], 8);\n}\n\nstatic void CreatePartyMonPokeballSpriteParameterized(u16 species, struct PartyMenuBox *menuBox)\n{\n    if (species != SPECIES_NONE)\n    {\n        menuBox->pokeballSpriteId = CreateSprite(&sSpriteTemplate_MenuPokeball, menuBox->spriteCoords[6], menuBox->spriteCoords[7], 8);\n        gSprites[menuBox->pokeballSpriteId].oam.priority = 0;\n    }\n}\n\n// For Cancel when Confirm isnt present\nstatic u8 CreatePokeballButtonSprite(u8 x, u8 y)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_MenuPokeball, x, y, 8);\n\n    gSprites[spriteId].oam.priority = 2;\n    return spriteId;\n}\n\n// For Confirm and Cancel when both are present\nstatic u8 CreateSmallPokeballButtonSprite(u8 x, u8 y)\n{\n    return CreateSprite(&sSpriteTemplate_MenuPokeballSmall, x, y, 8);\n}\n\nstatic void PartyMenuStartSpriteAnim(u8 spriteId, u8 animNum)\n{\n    StartSpriteAnim(&gSprites[spriteId], animNum);\n}\n\n// Unused. Might explain the large blank section in gPartyMenuPokeballSmall_Gfx\n// At the very least this is how the unused anim cmds for sSpriteAnimTable_MenuPokeballSmall were meant to be accessed\nvoid SpriteCB_BounceConfirmCancelButton(u8 spriteId, u8 spriteId2, u8 animNum)\n{\n    if (animNum == 0)\n    {\n        StartSpriteAnim(&gSprites[spriteId], 2);\n        StartSpriteAnim(&gSprites[spriteId2], 4);\n        gSprites[spriteId].y2 = 0;\n        gSprites[spriteId2].y2 = 0;\n    }\n    else\n    {\n        StartSpriteAnim(&gSprites[spriteId], 3);\n        StartSpriteAnim(&gSprites[spriteId2], 5);\n        gSprites[spriteId].y2 = -4;\n        gSprites[spriteId2].y2 = 4;\n    }\n}\n\nstatic void LoadPartyMenuPokeballGfx(void)\n{\n    LoadCompressedSpriteSheet(&sSpriteSheet_MenuPokeball);\n    LoadCompressedSpriteSheet(&sSpriteSheet_MenuPokeballSmall);\n    LoadCompressedSpritePalette(&sSpritePalette_MenuPokeball);\n}\n\nstatic void CreatePartyMonStatusSprite(struct Pokemon *mon, struct PartyMenuBox *menuBox)\n{\n    if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)\n    {\n        menuBox->statusSpriteId = CreateSprite(&sSpriteTemplate_StatusIcons, menuBox->spriteCoords[4], menuBox->spriteCoords[5], 0);\n        SetPartyMonAilmentGfx(mon, menuBox);\n    }\n}\n\nstatic void CreatePartyMonStatusSpriteParameterized(u16 species, u8 status, struct PartyMenuBox *menuBox)\n{\n    if (species != SPECIES_NONE)\n    {\n        menuBox->statusSpriteId = CreateSprite(&sSpriteTemplate_StatusIcons, menuBox->spriteCoords[4], menuBox->spriteCoords[5], 0);\n        UpdatePartyMonAilmentGfx(status, menuBox);\n        gSprites[menuBox->statusSpriteId].oam.priority = 0;\n    }\n}\n\nstatic void SetPartyMonAilmentGfx(struct Pokemon *mon, struct PartyMenuBox *menuBox)\n{\n    UpdatePartyMonAilmentGfx(GetMonAilment(mon), menuBox);\n}\n\nstatic void UpdatePartyMonAilmentGfx(u8 status, struct PartyMenuBox *menuBox)\n{\n    switch (status)\n    {\n    case AILMENT_NONE:\n    case AILMENT_PKRS:\n        gSprites[menuBox->statusSpriteId].invisible = TRUE;\n        break;\n    default:\n        StartSpriteAnim(&gSprites[menuBox->statusSpriteId], status - 1);\n        gSprites[menuBox->statusSpriteId].invisible = FALSE;\n        break;\n    }\n}\n\nstatic void LoadPartyMenuAilmentGfx(void)\n{\n    LoadCompressedSpriteSheet(&sSpriteSheet_StatusIcons);\n    LoadCompressedSpritePalette(&sSpritePalette_StatusIcons);\n}\n\nstatic void SetPartyMonSelectionActions(struct Pokemon *mons, u8 slotId, u8 action)\n{\n    u32 i;\n\n    if (action == ACTIONS_NONE)\n    {\n        SetPartyMonFieldSelectionActions(mons, slotId);\n    }\n    else\n    {\n        sPartyMenuInternal->numActions = sPartyMenuActionCounts[action];\n        for (i = 0; i < sPartyMenuInternal->numActions; ++i)\n            sPartyMenuInternal->actions[i] = sPartyMenuActions[action][i];\n    }\n}\n\nstatic void SetPartyMonFieldSelectionActions(struct Pokemon *mons, u8 slotId)\n{\n    u8 i, j;\n\n    sPartyMenuInternal->numActions = 0;\n    AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, CURSOR_OPTION_SUMMARY);\n    // Add field moves to action list\n    for (i = 0; i < MAX_MON_MOVES; ++i)\n    {\n        for (j = 0; sFieldMoves[j] != FIELD_MOVE_END; ++j)\n        {\n            if (GetMonData(&mons[slotId], i + MON_DATA_MOVE1) == sFieldMoves[j])\n            {\n                AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, j + CURSOR_OPTION_FIELD_MOVES);\n                break;\n            }\n        }\n    }\n    if (GetMonData(&mons[1], MON_DATA_SPECIES) != SPECIES_NONE)\n        AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, CURSOR_OPTION_SWITCH);\n    if (ItemIsMail(GetMonData(&mons[slotId], MON_DATA_HELD_ITEM)))\n        AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, CURSOR_OPTION_MAIL);\n    else\n        AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, CURSOR_OPTION_ITEM);\n    AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, CURSOR_OPTION_CANCEL1);\n}\n\nstatic u8 GetPartyMenuActionsType(struct Pokemon *mon)\n{\n    u32 actionType;\n\n    switch (gPartyMenu.menuType)\n    {\n    case PARTY_MENU_TYPE_FIELD:\n        if (GetMonData(mon, MON_DATA_IS_EGG))\n            actionType = ACTIONS_SWITCH;\n        else\n            actionType = ACTIONS_NONE; // actions populated by SetPartyMonFieldSelectionActions\n        break;\n    case PARTY_MENU_TYPE_IN_BATTLE:\n        actionType = GetPartyMenuActionsTypeInBattle(mon);\n        break;\n    case PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS:\n        switch (GetPartySlotEntryStatus(gPartyMenu.slotId))\n        {\n        default: // Not eligible\n            actionType = ACTIONS_SUMMARY_ONLY;\n            break;\n        case 0: // Eligible\n            actionType = ACTIONS_ENTER;\n            break;\n        case 1: // Already selected\n            actionType = ACTIONS_NO_ENTRY;\n            break;\n        }\n        break;\n    case PARTY_MENU_TYPE_DAYCARE:\n        actionType = (GetMonData(mon, MON_DATA_IS_EGG)) ? ACTIONS_SUMMARY_ONLY : ACTIONS_STORE;\n        break;\n    case PARTY_MENU_TYPE_UNION_ROOM_REGISTER:\n        actionType = ACTIONS_REGISTER;\n        break;\n    case PARTY_MENU_TYPE_UNION_ROOM_TRADE:\n        actionType = ACTIONS_TRADE;\n        break;\n    case PARTY_MENU_TYPE_SPIN_TRADE:\n        actionType = ACTIONS_SPIN_TRADE;\n        break;\n    // The following have no selection actions (i.e. they exit immediately upon selection)\n    // PARTY_MENU_TYPE_CONTEST\n    // PARTY_MENU_TYPE_CHOOSE_SINGLE_MON\n    // PARTY_MENU_TYPE_MULTI_SHOWCASE\n    // PARTY_MENU_TYPE_MOVE_RELEARNER\n    // PARTY_MENU_TYPE_MINIGAME\n    default:\n        actionType = ACTIONS_NONE;\n        break;\n    }\n    return actionType;\n}\n\nstatic void CreateSelectionWindow(void)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n\n    GetMonNickname(mon, gStringVar1);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    SetPartyMonSelectionActions(gPlayerParty, gPartyMenu.slotId, GetPartyMenuActionsType(mon));\n    DisplaySelectionWindow(SELECTWINDOW_ACTIONS);\n    DisplayPartyMenuStdMessage(PARTY_MSG_DO_WHAT_WITH_MON);\n}\n\nstatic void Task_TryCreateSelectionWindow(u8 taskId)\n{\n    CreateSelectionWindow();\n    gTasks[taskId].data[0] = (u8)MENU_B_PRESSED;\n    gTasks[taskId].func = Task_HandleSelectionMenuInput;\n}\n\nstatic void Task_HandleSelectionMenuInput(u8 taskId)\n{\n    if (!gPaletteFade.active && MenuHelpers_ShouldWaitForLinkRecv() != TRUE)\n    {\n        s8 input;\n        s16 *data = gTasks[taskId].data;\n\n        if (sPartyMenuInternal->numActions <= 3)\n            input = Menu_ProcessInputNoWrapAround_other();\n        else\n            input = Menu_ProcessInput_other();\n\n        if (data[0] != Menu_GetCursorPos())\n            ToggleFieldMoveDescriptionWindow(sPartyMenuInternal->actions[Menu_GetCursorPos()]);\n\n        data[0] = Menu_GetCursorPos();\n        switch (input)\n        {\n        case MENU_NOTHING_CHOSEN:\n            break;\n        case MENU_B_PRESSED:\n            PlaySE(SE_SELECT);\n            PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[2]);\n            sCursorOptions[sPartyMenuInternal->actions[sPartyMenuInternal->numActions - 1]].func(taskId);\n            break;\n        default:\n            PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[2]);\n            sCursorOptions[sPartyMenuInternal->actions[input]].func(taskId);\n            break;\n        }\n    }\n}\n\nstatic void CursorCB_Summary(u8 taskId)\n{\n    PlaySE(SE_SELECT);\n    sPartyMenuInternal->exitCallback = CB2_ShowPokemonSummaryScreen;\n    Task_ClosePartyMenu(taskId);\n}\n\nstatic void CB2_ShowPokemonSummaryScreen(void)\n{\n    if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE)\n        UpdatePartyToBattleOrder();\n    ShowPokemonSummaryScreen(gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuFromSummaryScreen, PSS_MODE_NORMAL);\n}\n\nstatic void CB2_ReturnToPartyMenuFromSummaryScreen(void)\n{\n    gPaletteFade.bufferTransferDisabled = TRUE;\n    gPartyMenu.slotId = GetLastViewedMonIndex();\n    InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_DO_WHAT_WITH_MON, Task_TryCreateSelectionWindow, gPartyMenu.exitCallback);\n}\n\nstatic void CursorCB_Switch(u8 taskId)\n{\n    PlaySE(SE_SELECT);\n    gPartyMenu.action = PARTY_ACTION_SWITCH;\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    DisplayPartyMenuStdMessage(PARTY_MSG_MOVE_TO_WHERE);\n    AnimatePartySlot(gPartyMenu.slotId, 1);\n    gPartyMenu.slotId2 = gPartyMenu.slotId;\n    gTasks[taskId].func = Task_HandleChooseMonInput;\n}\n\n#define tSlot1Left     data[0]\n#define tSlot1Top      data[1]\n#define tSlot1Width    data[2]\n#define tSlot1Height   data[3]\n#define tSlot2Left     data[4]\n#define tSlot2Top      data[5]\n#define tSlot2Width    data[6]\n#define tSlot2Height   data[7]\n#define tSlot1Offset   data[8]\n#define tSlot2Offset   data[9]\n#define tSlot1SlideDir data[10]\n#define tSlot2SlideDir data[11]\n\nstatic void SwitchSelectedMons(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u8 windowIds[2];\n\n    if (gPartyMenu.slotId2 == gPartyMenu.slotId)\n    {\n        FinishTwoMonAction(taskId);\n    }\n    else\n    {\n        // Initialize switching party mons slide animation\n        SetSwitchedPartyOrderQuestLogEvent();\n        windowIds[0] = sPartyMenuBoxes[gPartyMenu.slotId].windowId;\n        tSlot1Left = GetWindowAttribute(windowIds[0], WINDOW_TILEMAP_LEFT);\n        tSlot1Top = GetWindowAttribute(windowIds[0], WINDOW_TILEMAP_TOP);\n        tSlot1Width = GetWindowAttribute(windowIds[0], WINDOW_WIDTH);\n        tSlot1Height = GetWindowAttribute(windowIds[0], WINDOW_HEIGHT);\n        tSlot1Offset = 0;\n        if (tSlot1Width == 10)\n            tSlot1SlideDir = -1;\n        else\n            tSlot1SlideDir = 1;\n        windowIds[1] = sPartyMenuBoxes[gPartyMenu.slotId2].windowId;\n        tSlot2Left = GetWindowAttribute(windowIds[1], WINDOW_TILEMAP_LEFT);\n        tSlot2Top = GetWindowAttribute(windowIds[1], WINDOW_TILEMAP_TOP);\n        tSlot2Width = GetWindowAttribute(windowIds[1], WINDOW_WIDTH);\n        tSlot2Height = GetWindowAttribute(windowIds[1], WINDOW_HEIGHT);\n        tSlot2Offset = 0;\n        if (tSlot2Width == 10)\n            tSlot2SlideDir = -1;\n        else\n            tSlot2SlideDir = 1;\n        sSlot1TilemapBuffer = Alloc(tSlot1Width * (tSlot1Height << 1));\n        sSlot2TilemapBuffer = Alloc(tSlot2Width * (tSlot2Height << 1));\n        CopyToBufferFromBgTilemap(0, sSlot1TilemapBuffer, tSlot1Left, tSlot1Top, tSlot1Width, tSlot1Height);\n        CopyToBufferFromBgTilemap(0, sSlot2TilemapBuffer, tSlot2Left, tSlot2Top, tSlot2Width, tSlot2Height);\n        ClearWindowTilemap(windowIds[0]);\n        ClearWindowTilemap(windowIds[1]);\n        gPartyMenu.action = PARTY_ACTION_SWITCHING;\n        AnimatePartySlot(gPartyMenu.slotId, 1);\n        AnimatePartySlot(gPartyMenu.slotId2, 1);\n        SlidePartyMenuBoxOneStep(taskId);\n        gTasks[taskId].func = Task_SlideSelectedSlotsOffscreen;\n    }\n}\n\n// returns FALSE if the slot has slid fully offscreen / back onscreen\nstatic bool8 TryMovePartySlot(s16 x, s16 width, u8 *leftMove, u8 *newX, u8 *newWidth)\n{\n    if ((x + width) < 0)\n        return FALSE;\n    if (x > 31)\n        return FALSE;\n    if (x < 0)\n    {\n        *leftMove = x * -1;\n        *newX = 0;\n        *newWidth = width + x;\n    }\n    else\n    {\n        *leftMove = 0;\n        *newX = x;\n        if ((x + width) > 31)\n            *newWidth = 32 - x;\n        else\n            *newWidth = width;\n    }\n    return TRUE;\n}\n\nstatic void MoveAndBufferPartySlot(const void *rectSrc, s16 x, s16 y, s16 width, s16 height, s16 dir)\n{\n    // The use of the dimension parameters here is a mess\n    u8 leftMove, newX, newWidth; // leftMove is used as a srcX, newX is used as both x and srcHeight, newWidth is used as both width and destY\n\n    if (TryMovePartySlot(x, width, &leftMove, &newX, &newWidth))\n    {\n        FillBgTilemapBufferRect_Palette0(0, 0, newX, y, newWidth, height);\n        if (TryMovePartySlot(x + dir, width, &leftMove, &newX, &newWidth))\n            CopyRectToBgTilemapBufferRect(0, rectSrc, leftMove, 0, width, height, newX, y, newWidth, height, 17, 0, 0);\n    }\n}\n\nstatic void MovePartyMenuBoxSprites(struct PartyMenuBox *menuBox, s16 offset)\n{\n    gSprites[menuBox->pokeballSpriteId].x2 += offset * 8;\n    gSprites[menuBox->itemSpriteId].x2 += offset * 8;\n    gSprites[menuBox->monSpriteId].x2 += offset * 8;\n    gSprites[menuBox->statusSpriteId].x2 += offset * 8;\n}\n\nstatic void SlidePartyMenuBoxSpritesOneStep(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (tSlot1SlideDir != 0)\n        MovePartyMenuBoxSprites(&sPartyMenuBoxes[gPartyMenu.slotId], tSlot1SlideDir);\n    if (tSlot2SlideDir != 0)\n        MovePartyMenuBoxSprites(&sPartyMenuBoxes[gPartyMenu.slotId2], tSlot2SlideDir);\n}\n\nstatic void SlidePartyMenuBoxOneStep(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (tSlot1SlideDir != 0)\n        MoveAndBufferPartySlot(sSlot1TilemapBuffer, tSlot1Left + tSlot1Offset, tSlot1Top, tSlot1Width, tSlot1Height, tSlot1SlideDir);\n    if (tSlot2SlideDir != 0)\n        MoveAndBufferPartySlot(sSlot2TilemapBuffer, tSlot2Left + tSlot2Offset, tSlot2Top, tSlot2Width, tSlot2Height, tSlot2SlideDir);\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nstatic void Task_SlideSelectedSlotsOffscreen(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u16 slidingSlotPositions[2];\n\n    SlidePartyMenuBoxOneStep(taskId);\n    SlidePartyMenuBoxSpritesOneStep(taskId);\n    tSlot1Offset += tSlot1SlideDir;\n    tSlot2Offset += tSlot2SlideDir;\n    slidingSlotPositions[0] = tSlot1Left + tSlot1Offset;\n    slidingSlotPositions[1] = tSlot2Left + tSlot2Offset;\n    // Both slots have slid offscreen\n    if (slidingSlotPositions[0] > 33 && slidingSlotPositions[1] > 33)\n    {\n        tSlot1SlideDir *= -1;\n        tSlot2SlideDir *= -1;\n        SwitchPartyMon();\n        DisplayPartyPokemonData(gPartyMenu.slotId);\n        DisplayPartyPokemonData(gPartyMenu.slotId2);\n        PutWindowTilemap(sPartyMenuBoxes[gPartyMenu.slotId].windowId);\n        PutWindowTilemap(sPartyMenuBoxes[gPartyMenu.slotId2].windowId);\n        CopyToBufferFromBgTilemap(0, sSlot1TilemapBuffer, tSlot1Left, tSlot1Top, tSlot1Width, tSlot1Height);\n        CopyToBufferFromBgTilemap(0, sSlot2TilemapBuffer, tSlot2Left, tSlot2Top, tSlot2Width, tSlot2Height);\n        ClearWindowTilemap(sPartyMenuBoxes[gPartyMenu.slotId].windowId);\n        ClearWindowTilemap(sPartyMenuBoxes[gPartyMenu.slotId2].windowId);\n        gTasks[taskId].func = Task_SlideSelectedSlotsOnscreen;\n    }\n}\n\nstatic void Task_SlideSelectedSlotsOnscreen(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    SlidePartyMenuBoxOneStep(taskId);\n    SlidePartyMenuBoxSpritesOneStep(taskId);\n\n    // Both slots have slide back onscreen\n    if (tSlot1SlideDir == 0 && tSlot2SlideDir == 0)\n    {\n        PutWindowTilemap(sPartyMenuBoxes[gPartyMenu.slotId].windowId);\n        PutWindowTilemap(sPartyMenuBoxes[gPartyMenu.slotId2].windowId);\n        ScheduleBgCopyTilemapToVram(0);\n        Free(sSlot1TilemapBuffer);\n        Free(sSlot2TilemapBuffer);\n        FinishTwoMonAction(taskId);\n    }\n    // Continue sliding\n    else\n    {\n        tSlot1Offset += tSlot1SlideDir;\n        tSlot2Offset += tSlot2SlideDir;\n        if (tSlot1Offset == 0)\n            tSlot1SlideDir = 0;\n        if (tSlot2Offset == 0)\n            tSlot2SlideDir = 0;\n    }\n}\n\nstatic void SwitchMenuBoxSprites(u8 *spriteIdPtr1, u8 *spriteIdPtr2)\n{\n    u8 spriteIdBuffer = *spriteIdPtr1;\n    u16 xBuffer1, yBuffer1, xBuffer2, yBuffer2;\n\n    *spriteIdPtr1 = *spriteIdPtr2;\n    *spriteIdPtr2 = spriteIdBuffer;\n    xBuffer1 = gSprites[*spriteIdPtr1].x;\n    yBuffer1 = gSprites[*spriteIdPtr1].y;\n    xBuffer2 = gSprites[*spriteIdPtr1].x2;\n    yBuffer2 = gSprites[*spriteIdPtr1].y2;\n    gSprites[*spriteIdPtr1].x = gSprites[*spriteIdPtr2].x;\n    gSprites[*spriteIdPtr1].y = gSprites[*spriteIdPtr2].y;\n    gSprites[*spriteIdPtr1].x2 = gSprites[*spriteIdPtr2].x2;\n    gSprites[*spriteIdPtr1].y2 = gSprites[*spriteIdPtr2].y2;\n    gSprites[*spriteIdPtr2].x = xBuffer1;\n    gSprites[*spriteIdPtr2].y = yBuffer1;\n    gSprites[*spriteIdPtr2].x2 = xBuffer2;\n    gSprites[*spriteIdPtr2].y2 = yBuffer2;\n}\n\nstatic void SwitchPartyMon(void)\n{\n    struct PartyMenuBox *menuBoxes[2];\n    struct Pokemon *mon1, *mon2;\n    struct Pokemon *monBuffer;\n\n    menuBoxes[0] = &sPartyMenuBoxes[gPartyMenu.slotId];\n    menuBoxes[1] = &sPartyMenuBoxes[gPartyMenu.slotId2];\n    mon1 = &gPlayerParty[gPartyMenu.slotId];\n    mon2 = &gPlayerParty[gPartyMenu.slotId2];\n    monBuffer = Alloc(sizeof(struct Pokemon));\n    *monBuffer = *mon1;\n    *mon1 = *mon2;\n    *mon2 = *monBuffer;\n    Free(monBuffer);\n    SwitchMenuBoxSprites(&menuBoxes[0]->pokeballSpriteId, &menuBoxes[1]->pokeballSpriteId);\n    SwitchMenuBoxSprites(&menuBoxes[0]->itemSpriteId, &menuBoxes[1]->itemSpriteId);\n    SwitchMenuBoxSprites(&menuBoxes[0]->monSpriteId, &menuBoxes[1]->monSpriteId);\n    SwitchMenuBoxSprites(&menuBoxes[0]->statusSpriteId, &menuBoxes[1]->statusSpriteId);\n}\n\nstatic void SetSwitchedPartyOrderQuestLogEvent(void)\n{\n    struct QuestLogEvent_SwitchedPartyOrder * data = Alloc(sizeof(*data));\n\n    data->species1 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES_OR_EGG);\n    data->species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId2], MON_DATA_SPECIES_OR_EGG);\n    SetQuestLogEvent(QL_EVENT_SWITCHED_PARTY_ORDER, (const u16 *)data);\n    Free(data);\n}\n\n// Finish switching mons or using Softboiled\nstatic void FinishTwoMonAction(u8 taskId)\n{\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    gPartyMenu.action = PARTY_ACTION_CHOOSE_MON;\n    AnimatePartySlot(gPartyMenu.slotId, 0);\n    gPartyMenu.slotId = gPartyMenu.slotId2;\n    AnimatePartySlot(gPartyMenu.slotId2, 1);\n    DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON);\n    gTasks[taskId].func = Task_HandleChooseMonInput;\n}\n\n#undef tSlot1Left\n#undef tSlot1Top\n#undef tSlot1Width\n#undef tSlot1Height\n#undef tSlot2Left\n#undef tSlot2Top\n#undef tSlot2Width\n#undef tSlot2Height\n#undef tSlot1Offset\n#undef tSlot2Offset\n#undef tSlot1SlideDir\n#undef tSlot2SlideDir\n\nstatic void CursorCB_Cancel1(u8 taskId)\n{\n    PlaySE(SE_SELECT);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    if (gPartyMenu.menuType == PARTY_MENU_TYPE_DAYCARE)\n        DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON_2);\n    else\n        DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON);\n    gTasks[taskId].func = Task_HandleChooseMonInput;\n}\n\nstatic void CursorCB_Item(u8 taskId)\n{\n    PlaySE(SE_SELECT);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    SetPartyMonSelectionActions(gPlayerParty, gPartyMenu.slotId, ACTIONS_ITEM);\n    DisplaySelectionWindow(SELECTWINDOW_ITEM);\n    DisplayPartyMenuStdMessage(PARTY_MSG_DO_WHAT_WITH_ITEM);\n    gTasks[taskId].data[0] = (u8)MENU_B_PRESSED;\n    gTasks[taskId].func = Task_HandleSelectionMenuInput;\n}\n\nstatic void CursorCB_Give(u8 taskId)\n{\n    PlaySE(SE_SELECT);\n    sPartyMenuInternal->exitCallback = CB2_SelectBagItemToGive;\n    Task_ClosePartyMenu(taskId);\n}\n\nvoid CB2_SelectBagItemToGive(void)\n{\n    GoToBagMenu(ITEMMENULOCATION_PARTY, OPEN_BAG_LAST, CB2_GiveHoldItem);\n}\n\nvoid CB2_GiveHoldItem(void)\n{\n    if (gSpecialVar_ItemId == ITEM_NONE)\n    {\n        InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_NONE, Task_TryCreateSelectionWindow, gPartyMenu.exitCallback);\n    }\n    else\n    {\n        sPartyMenuItemId = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_HELD_ITEM);\n        // Already holding item\n        if (sPartyMenuItemId != ITEM_NONE)\n        {\n            InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_NONE, Task_SwitchHoldItemsPrompt, gPartyMenu.exitCallback);\n        }\n        // Give mail\n        else if (ItemIsMail(gSpecialVar_ItemId))\n        {\n            RemoveBagItem(gSpecialVar_ItemId, 1);\n            GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId);\n            CB2_WriteMailToGiveMon();\n        }\n        // Give item\n        else\n        {\n            InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_NONE, Task_GiveHoldItem, gPartyMenu.exitCallback);\n        }\n    }\n}\n\nstatic void Task_GiveHoldItem(u8 taskId)\n{\n    u16 item;\n\n    if (!gPaletteFade.active)\n    {\n        item = gSpecialVar_ItemId;\n        DisplayGaveHeldItemMessage(&gPlayerParty[gPartyMenu.slotId], item, FALSE, FALSE);\n        GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], item);\n        RemoveBagItem(item, 1);\n        gTasks[taskId].func = Task_UpdateHeldItemSprite;\n    }\n}\n\nstatic void Task_SwitchHoldItemsPrompt(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        DisplayAlreadyHoldingItemSwitchMessage(&gPlayerParty[gPartyMenu.slotId], sPartyMenuItemId, TRUE);\n        gTasks[taskId].func = Task_SwitchItemsYesNo;\n    }\n}\n\nstatic void Task_SwitchItemsYesNo(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        PartyMenuDisplayYesNoMenu();\n        gTasks[taskId].func = Task_HandleSwitchItemsYesNoInput;\n    }\n}\n\nstatic void Task_HandleSwitchItemsYesNoInput(u8 taskId)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0: // Yes, switch items\n        RemoveBagItem(gSpecialVar_ItemId, 1);\n        \n        // No room to return held item to bag\n        if (AddBagItem(sPartyMenuItemId, 1) == FALSE)\n        {\n            AddBagItem(gSpecialVar_ItemId, 1);\n            BufferBagFullCantTakeItemMessage(sPartyMenuItemId);\n            DisplayPartyMenuMessage(gStringVar4, FALSE);\n            gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n        }\n        // Giving mail\n        else if (ItemIsMail(gSpecialVar_ItemId))\n        {\n            GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId);\n            gTasks[taskId].func = Task_WriteMailToGiveMonAfterText;\n        }\n        // Giving item\n        else\n        {\n            GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId);\n            DisplaySwitchedHeldItemMessage(gSpecialVar_ItemId, sPartyMenuItemId, TRUE);\n            gTasks[taskId].func = Task_UpdateHeldItemSprite;\n        }\n        break;\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        // fallthrough\n    case 1: // No\n        gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n        break;\n    }\n}\n\nstatic void Task_WriteMailToGiveMonAfterText(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        sPartyMenuInternal->exitCallback = CB2_WriteMailToGiveMon;\n        Task_ClosePartyMenu(taskId);\n    }\n}\n\nstatic void CB2_WriteMailToGiveMon(void)\n{\n    u8 mail = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MAIL);\n\n    DoEasyChatScreen(EASY_CHAT_TYPE_MAIL,\n                     gSaveBlock1Ptr->mail[mail].words,\n                     CB2_ReturnToPartyMenuFromWritingMail);\n}\n\nstatic void CB2_ReturnToPartyMenuFromWritingMail(void)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    u16 item = GetMonData(mon, MON_DATA_HELD_ITEM);\n\n    // Canceled writing mail\n    if (gSpecialVar_Result == FALSE)\n    {\n        TakeMailFromMon(mon);\n        SetMonData(mon, MON_DATA_HELD_ITEM, &sPartyMenuItemId);\n        RemoveBagItem(sPartyMenuItemId, 1);\n        AddBagItem(item, 1);\n        InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_CHOOSE_MON, Task_TryCreateSelectionWindow, gPartyMenu.exitCallback);\n    }\n    // Wrote mail\n    else\n    {\n        InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_CHOOSE_MON, Task_DisplayGaveMailFromPartyMessage, gPartyMenu.exitCallback);\n    }\n}\n\n// Nearly redundant with Task_DisplayGaveMailFromBagMessgae\nstatic void Task_DisplayGaveMailFromPartyMessage(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        if (sPartyMenuItemId == ITEM_NONE)\n            DisplayGaveHeldItemMessage(&gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId, FALSE, FALSE);\n        else\n            DisplaySwitchedHeldItemMessage(gSpecialVar_ItemId, sPartyMenuItemId, FALSE);\n        gTasks[taskId].func = Task_UpdateHeldItemSprite;\n    }\n}\n\nstatic void Task_UpdateHeldItemSprite(u8 taskId)\n{\n    s8 slotId = gPartyMenu.slotId;\n\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        UpdatePartyMonHeldItemSprite(&gPlayerParty[slotId], &sPartyMenuBoxes[slotId]);\n        Task_ReturnToChooseMonAfterText(taskId);\n    }\n}\n\nstatic void CursorCB_TakeItem(u8 taskId)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    u16 item = GetMonData(mon, MON_DATA_HELD_ITEM);\n\n    PlaySE(SE_SELECT);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    switch (TryTakeMonItem(mon))\n    {\n    case 0: // Not holding item\n        GetMonNickname(mon, gStringVar1);\n        StringExpandPlaceholders(gStringVar4, gText_PkmnNotHolding);\n        DisplayPartyMenuMessage(gStringVar4, TRUE);\n        break;\n    case 1: // No room to take item\n        BufferBagFullCantTakeItemMessage(item);\n        DisplayPartyMenuMessage(gStringVar4, TRUE);\n        break;\n    default: // Took item\n        DisplayTookHeldItemMessage(mon, item, TRUE);\n        break;\n    }\n    ScheduleBgCopyTilemapToVram(2);\n    gTasks[taskId].func = Task_UpdateHeldItemSprite;\n}\n\nstatic void CursorCB_Mail(u8 taskId)\n{\n    PlaySE(SE_SELECT);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    SetPartyMonSelectionActions(gPlayerParty, gPartyMenu.slotId, ACTIONS_MAIL);\n    DisplaySelectionWindow(SELECTWINDOW_MAIL);\n    DisplayPartyMenuStdMessage(PARTY_MSG_DO_WHAT_WITH_MAIL);\n    gTasks[taskId].data[0] = (u8)MENU_B_PRESSED;\n    gTasks[taskId].func = Task_HandleSelectionMenuInput;\n}\n\nstatic void CursorCB_Read(u8 taskId)\n{\n    PlaySE(SE_SELECT);\n    sPartyMenuInternal->exitCallback = CB2_ReadHeldMail;\n    Task_ClosePartyMenu(taskId);\n}\n\nstatic void CB2_ReadHeldMail(void)\n{\n    ReadMail(&gSaveBlock1Ptr->mail[GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MAIL)], CB2_ReturnToPartyMenuFromReadingMail, 1);\n}\n\nstatic void CB2_ReturnToPartyMenuFromReadingMail(void)\n{\n    gPaletteFade.bufferTransferDisabled = TRUE;\n    InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_DO_WHAT_WITH_MON, Task_TryCreateSelectionWindow, gPartyMenu.exitCallback);\n}\n\nstatic void CursorCB_TakeMail(u8 taskId)\n{\n    PlaySE(SE_SELECT);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    DisplayPartyMenuMessage(gText_SendMailToPC, TRUE);\n    gTasks[taskId].func = Task_SendMailToPCYesNo;\n}\n\nstatic void Task_SendMailToPCYesNo(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        PartyMenuDisplayYesNoMenu();\n        gTasks[taskId].func = Task_HandleSendMailToPCYesNoInput;\n    }\n}\n\nstatic void Task_HandleSendMailToPCYesNoInput(u8 taskId)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0: // Yes, send to PC\n        if (TakeMailFromMon2(&gPlayerParty[gPartyMenu.slotId]) != 0xFF)\n        {\n            DisplayPartyMenuMessage(gText_MailSentToPC, FALSE);\n            gTasks[taskId].func = Task_UpdateHeldItemSprite;\n        }\n        else\n        {\n            DisplayPartyMenuMessage(gText_PCMailboxFull, FALSE);\n            gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n        }\n        break;\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        // fallthrough\n    case 1:\n        DisplayPartyMenuMessage(gText_MailMessageWillBeLost, TRUE);\n        gTasks[taskId].func = Task_LoseMailMessageYesNo;\n        break;\n    }\n}\n\nstatic void Task_LoseMailMessageYesNo(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        PartyMenuDisplayYesNoMenu();\n        gTasks[taskId].func = Task_HandleLoseMailMessageYesNoInput;\n    }\n}\n\nstatic void Task_HandleLoseMailMessageYesNoInput(u8 taskId)\n{\n    u16 item;\n\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0: // Yes, lose mail message\n        item = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_HELD_ITEM);\n        if (AddBagItem(item, 1) == TRUE)\n        {\n            TakeMailFromMon(&gPlayerParty[gPartyMenu.slotId]);\n            DisplayPartyMenuMessage(gText_MailTakenFromPkmn, FALSE);\n            gTasks[taskId].func = Task_UpdateHeldItemSprite;\n        }\n        else\n        {\n            BufferBagFullCantTakeItemMessage(item);\n            DisplayPartyMenuMessage(gStringVar4, FALSE);\n            gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n        }\n        break;\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        // fallthrough\n    case 1:\n        gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n        break;\n    }\n}\n\nstatic void CursorCB_Cancel2(u8 taskId)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n\n    PlaySE(SE_SELECT);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    SetPartyMonSelectionActions(gPlayerParty, gPartyMenu.slotId, GetPartyMenuActionsType(mon));\n    DisplaySelectionWindow(SELECTWINDOW_ACTIONS);\n    DisplayPartyMenuStdMessage(PARTY_MSG_DO_WHAT_WITH_MON);\n    gTasks[taskId].data[0] = (u8)MENU_B_PRESSED;\n    gTasks[taskId].func = Task_HandleSelectionMenuInput;\n}\n\nstatic void CursorCB_SendMon(u8 taskId)\n{\n    PlaySE(SE_SELECT);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    if (TrySwitchInPokemon() == TRUE)\n    {\n        Task_ClosePartyMenu(taskId);\n    }\n    else\n    {\n        // gStringVar4 below is the error message buffered by TrySwitchInPokemon\n        PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n        DisplayPartyMenuMessage(gStringVar4, TRUE);\n        gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n    }\n}\n\nstatic void CursorCB_Enter(u8 taskId)\n{\n    u8 maxBattlers;\n    u32 i;\n    const u8 *str;\n    \n    if (gPartyMenu.chooseMonsBattleType == CHOOSE_MONS_FOR_UNION_ROOM_BATTLE)\n    {\n        maxBattlers = 2;\n        str = gText_NoMoreThanTwoMayEnter;\n    }\n    else\n    {\n        maxBattlers = 3;\n        str = gText_NoMoreThanThreeMayEnter;\n    }\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    for (i = 0; i < maxBattlers; ++i)\n    {\n        if (gSelectedOrderFromParty[i] == 0)\n        {\n            PlaySE(SE_SELECT);\n            gSelectedOrderFromParty[i] = gPartyMenu.slotId + 1;\n            DisplayPartyPokemonDescriptionText(i + PARTYBOX_DESC_FIRST, &sPartyMenuBoxes[gPartyMenu.slotId], 1);\n            if (i == (maxBattlers - 1))\n                MoveCursorToConfirm();\n            DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON);\n            gTasks[taskId].func = Task_HandleChooseMonInput;\n            return;\n        }\n    }\n    PlaySE(SE_FAILURE);\n    DisplayPartyMenuMessage(str, TRUE);\n    gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n}\n\nstatic void MoveCursorToConfirm(void)\n{\n    AnimatePartySlot(gPartyMenu.slotId, 0);\n    gPartyMenu.slotId = SLOT_CONFIRM;\n    AnimatePartySlot(gPartyMenu.slotId, 1);\n}\n\nstatic void CursorCB_NoEntry(u8 taskId)\n{\n    u32 i;\n\n    PlaySE(SE_SELECT);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    for (i = 0; i < 3; ++i)\n    {\n        if (gSelectedOrderFromParty[i] ==  gPartyMenu.slotId + 1)\n        {\n            gSelectedOrderFromParty[i] = 0;\n            switch (i)\n            {\n            case 0:\n                gSelectedOrderFromParty[0] = gSelectedOrderFromParty[1];\n                gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2];\n                gSelectedOrderFromParty[2] = 0;\n                break;\n            case 1:\n                gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2];\n                gSelectedOrderFromParty[2] = 0;\n                break;\n            }\n            break;\n        }\n    }\n    DisplayPartyPokemonDescriptionText(PARTYBOX_DESC_ABLE_3, &sPartyMenuBoxes[gPartyMenu.slotId], DRAW_MENU_BOX_AND_TEXT);\n    if (gSelectedOrderFromParty[0] != 0)\n        DisplayPartyPokemonDescriptionText(PARTYBOX_DESC_FIRST, &sPartyMenuBoxes[gSelectedOrderFromParty[0] - 1], DRAW_MENU_BOX_AND_TEXT);\n    if (gSelectedOrderFromParty[1] != 0)\n        DisplayPartyPokemonDescriptionText(PARTYBOX_DESC_SECOND, &sPartyMenuBoxes[gSelectedOrderFromParty[1] - 1], DRAW_MENU_BOX_AND_TEXT);\n    DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON);\n    gTasks[taskId].func = Task_HandleChooseMonInput;\n}\n\nstatic void CursorCB_Store(u8 taskId)\n{\n    PlaySE(SE_SELECT);\n    gSpecialVar_0x8004 = gPartyMenu.slotId;\n    Task_ClosePartyMenu(taskId);\n}\n\n// Register mon for the Trading Board in Union Room\nstatic void CursorCB_Register(u8 taskId)\n{\n    u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES_OR_EGG);\n    u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);\n    u8 isModernFatefulEncounter = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MODERN_FATEFUL_ENCOUNTER);\n\n    switch (CanRegisterMonForTradingBoard(*(struct RfuGameCompatibilityData *)GetHostRfuGameData(), species2, species, isModernFatefulEncounter))\n    {\n    case CANT_REGISTER_MON:\n        StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow);\n        break;\n    case CANT_REGISTER_EGG:\n        StringExpandPlaceholders(gStringVar4, gText_EggCantBeTradedNow);\n        break;\n    default:\n        PlaySE(SE_SELECT);\n        Task_ClosePartyMenu(taskId);\n        return;\n    }\n    PlaySE(SE_FAILURE);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    StringAppend(gStringVar4, gText_PauseUntilPress);\n    DisplayPartyMenuMessage(gStringVar4, TRUE);\n    gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n}\n\nstatic void CursorCB_Trade1(u8 taskId)\n{\n    u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES_OR_EGG);\n    u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);\n    u8 isModernFatefulEncounter = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MODERN_FATEFUL_ENCOUNTER);\n    u32 stringId = GetUnionRoomTradeMessageId(*(struct RfuGameCompatibilityData *)GetHostRfuGameData(), gRfuPartnerCompatibilityData, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, isModernFatefulEncounter);\n\n    if (stringId != UR_TRADE_MSG_NONE)\n    {\n        StringExpandPlaceholders(gStringVar4, sUnionRoomTradeMessages[stringId - 1]);\n        PlaySE(SE_FAILURE);\n        PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n        PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n        StringAppend(gStringVar4, gText_PauseUntilPress);\n        DisplayPartyMenuMessage(gStringVar4, TRUE);\n        gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n    }\n    else\n    {\n        PlaySE(SE_SELECT);\n        Task_ClosePartyMenu(taskId);\n    }\n}\n\n// Spin Trade (based on the translation of the Japanese trade prompt)\n// Not implemented, and normally unreachable because PARTY_MENU_TYPE_SPIN_TRADE is never used\nstatic void CursorCB_Trade2(u8 taskId)\n{\n}\n\nstatic void CursorCB_FieldMove(u8 taskId)\n{\n    u8 fieldMove = sPartyMenuInternal->actions[Menu_GetCursorPos()] - CURSOR_OPTION_FIELD_MOVES;\n    const struct MapHeader *mapHeader;\n\n    PlaySE(SE_SELECT);\n    if (sFieldMoveCursorCallbacks[fieldMove].fieldMoveFunc == NULL)\n        return;\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]);\n    if (MenuHelpers_IsLinkActive() == TRUE || InUnionRoom() == TRUE)\n    {\n        if (fieldMove == FIELD_MOVE_MILK_DRINK || fieldMove == FIELD_MOVE_SOFT_BOILED)\n            DisplayPartyMenuStdMessage(PARTY_MSG_CANT_USE_HERE);\n        else\n            DisplayPartyMenuStdMessage(sFieldMoveCursorCallbacks[fieldMove].msgId);\n        gTasks[taskId].func = Task_CancelAfterAorBPress;\n    }\n    else\n    {\n        if(fieldMove == FIELD_MOVE_DIVE && !FlagGet(FLAG_SYS_CAN_LINK_WITH_RS))\n        {\n            DisplayPartyMenuMessage(gText_CantUseUntilNewHM, TRUE);\n            gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n        }\n        // All field moves before WATERFALL are HMs.\n        else if ((fieldMove <= FIELD_MOVE_WATERFALL && fieldMove != FIELD_MOVE_DIVE) && FlagGet(FLAG_BADGE01_GET + fieldMove) != TRUE)\n        {\n            DisplayPartyMenuMessage(gText_CantUseUntilNewBadge, TRUE);\n            gTasks[taskId].func = Task_ReturnToChooseMonAfterText;\n        }\n        else if (sFieldMoveCursorCallbacks[fieldMove].fieldMoveFunc() == TRUE)\n        {\n            switch (fieldMove)\n            {\n            case FIELD_MOVE_MILK_DRINK:\n            case FIELD_MOVE_SOFT_BOILED:\n                ChooseMonForSoftboiled(taskId);\n                break;\n            case FIELD_MOVE_TELEPORT:\n                mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->lastHealLocation.mapGroup, gSaveBlock1Ptr->lastHealLocation.mapNum);\n                GetMapNameGeneric(gStringVar1, mapHeader->regionMapSectionId);\n                StringExpandPlaceholders(gStringVar4, gText_ReturnToHealingSpot);\n                DisplayFieldMoveExitAreaMessage(taskId);\n                sPartyMenuInternal->data[0] = fieldMove;\n                break;\n            case FIELD_MOVE_DIG:\n                mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->escapeWarp.mapGroup, gSaveBlock1Ptr->escapeWarp.mapNum);\n                GetMapNameGeneric(gStringVar1, mapHeader->regionMapSectionId);\n                StringExpandPlaceholders(gStringVar4, gText_EscapeFromHereAndReturnTo);\n                DisplayFieldMoveExitAreaMessage(taskId);\n                sPartyMenuInternal->data[0] = fieldMove;\n                break;\n            case FIELD_MOVE_FLY:\n                gPartyMenu.exitCallback = CB2_OpenFlyMap;\n                Task_ClosePartyMenu(taskId);\n                break;\n            default:\n                gPartyMenu.exitCallback = CB2_ReturnToField;\n                SetUsedFieldMoveQuestLogEvent(&gPlayerParty[GetCursorSelectionMonId()], fieldMove);\n                Task_ClosePartyMenu(taskId);\n                break;\n            }\n        }\n        // Cant use Field Move\n        else\n        {\n            switch (fieldMove)\n            {\n            case FIELD_MOVE_SURF:\n                DisplayCantUseSurfMessage();\n                break;\n            case FIELD_MOVE_FLASH:\n                DisplayCantUseFlashMessage();\n                break;\n            default:\n                DisplayPartyMenuStdMessage(sFieldMoveCursorCallbacks[fieldMove].msgId);\n                break;\n            }\n            gTasks[taskId].func = Task_CancelAfterAorBPress;\n        }\n    }\n}\n\nstatic void DisplayFieldMoveExitAreaMessage(u8 taskId)\n{\n    DisplayPartyMenuMessage(gStringVar4, TRUE);\n    gTasks[taskId].func = Task_FieldMoveExitAreaYesNo;\n}\n\nstatic void Task_FieldMoveExitAreaYesNo(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        PartyMenuDisplayYesNoMenu();\n        gTasks[taskId].func = Task_HandleFieldMoveExitAreaYesNoInput;\n    }\n}\n\nstatic void Task_HandleFieldMoveExitAreaYesNoInput(u8 taskId)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0: // Yes\n        gPartyMenu.exitCallback = CB2_ReturnToField;\n        SetUsedFieldMoveQuestLogEvent(&gPlayerParty[GetCursorSelectionMonId()], sPartyMenuInternal->data[0]);\n        Task_ClosePartyMenu(taskId);\n        break;\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        // fallthrough\n    case 1: // No\n        gFieldCallback2 = NULL;\n        gPostMenuFieldCallback = NULL;\n        Task_ReturnToChooseMonAfterText(taskId);\n        break;\n    }\n}\n\nbool8 FieldCallback_PrepareFadeInFromMenu(void)\n{\n    FadeInFromBlack();\n    CreateTask(Task_FieldMoveWaitForFade, 8);\n    return TRUE;\n}\n\nstatic void Task_FieldMoveWaitForFade(u8 taskId)\n{\n    if (IsWeatherNotFadingIn() == TRUE)\n    {\n        gFieldEffectArguments[0] = GetFieldMoveMonSpecies();\n        gPostMenuFieldCallback();\n        DestroyTask(taskId);\n    }\n}\n\nstatic u16 GetFieldMoveMonSpecies(void)\n{\n    return GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);\n}\n\nstatic void Task_CancelAfterAorBPress(u8 taskId)\n{\n    if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))\n        CursorCB_Cancel1(taskId);\n}\n\nstatic void DisplayCantUseFlashMessage(void)\n{\n    if (FlagGet(FLAG_SYS_FLASH_ACTIVE) == TRUE)\n        DisplayPartyMenuStdMessage(PARTY_MSG_ALREADY_IN_USE);\n    else\n        DisplayPartyMenuStdMessage(PARTY_MSG_CANT_USE_HERE);\n}\n\nstatic void FieldCallback_Surf(void)\n{\n    gFieldEffectArguments[0] = GetCursorSelectionMonId();\n    FieldEffectStart(FLDEFF_USE_SURF);\n}\n\nstatic bool8 SetUpFieldMove_Surf(void)\n{\n    s16 x, y;\n    \n    GetXYCoordsOneStepInFrontOfPlayer(&x, &y);\n    if (MetatileBehavior_IsFastWater(MapGridGetMetatileBehaviorAt(x, y)) != TRUE\n     && PartyHasMonWithSurf() == TRUE\n     && IsPlayerFacingSurfableFishableWater() == TRUE)\n    {\n        gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;\n        gPostMenuFieldCallback = FieldCallback_Surf;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void DisplayCantUseSurfMessage(void)\n{\n    s16 x, y;\n    \n    if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))\n    {\n        DisplayPartyMenuStdMessage(PARTY_MSG_ALREADY_SURFING);\n    }\n    else\n    {\n        GetXYCoordsOneStepInFrontOfPlayer(&x, &y);\n        if (MetatileBehavior_IsFastWater(MapGridGetMetatileBehaviorAt(x, y)) == TRUE)\n            DisplayPartyMenuStdMessage(PARTY_MSG_CURRENT_TOO_FAST);\n        else if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE17))\n              && ((gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE17))\n                 || (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE18))))\n            DisplayPartyMenuStdMessage(PARTY_MSG_ENJOY_CYCLING);\n        else\n            DisplayPartyMenuStdMessage(PARTY_MSG_CANT_SURF_HERE);\n    }\n}\n\nstatic bool8 SetUpFieldMove_Fly(void)\n{\n    if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid CB2_ReturnToPartyMenuFromFlyMap(void)\n{\n    InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, TRUE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, CB2_ReturnToFieldWithOpenMenu);\n}\n\nstatic void FieldCallback_Waterfall(void)\n{\n    gFieldEffectArguments[0] = GetCursorSelectionMonId();\n    FieldEffectStart(FLDEFF_USE_WATERFALL);\n}\n\nstatic bool8 SetUpFieldMove_Waterfall(void)\n{\n    s16 x, y;\n\n    GetXYCoordsOneStepInFrontOfPlayer(&x, &y);\n    if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE && IsPlayerSurfingNorth() == TRUE)\n    {\n        gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;\n        gPostMenuFieldCallback = FieldCallback_Waterfall;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void SetSwappedHeldItemQuestLogEvent(struct Pokemon *mon, u16 item, u16 item2)\n{\n    struct QuestLogEvent_SwappedHeldItem *data = Alloc(sizeof(*data));\n\n    data->species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG);\n    data->takenItemId = item;\n    data->givenItemId = item2;\n    if (gPartyMenu.action == PARTY_ACTION_GIVE_PC_ITEM)\n        SetQuestLogEvent(QL_EVENT_SWAPPED_HELD_ITEM_PC, (void *)data);\n    else\n        SetQuestLogEvent(QL_EVENT_SWAPPED_HELD_ITEM, (void *)data);\n    Free(data);\n}\n\nstatic void SetUsedFieldMoveQuestLogEvent(struct Pokemon *mon, u8 fieldMove)\n{\n    struct QuestLogEvent_FieldMove *data = Alloc(sizeof(*data));\n\n    data->species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG);\n    data->fieldMove = fieldMove;\n    switch (data->fieldMove)\n    {\n    case FIELD_MOVE_TELEPORT:\n        data->mapSec = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->lastHealLocation.mapGroup, gSaveBlock1Ptr->lastHealLocation.mapNum)->regionMapSectionId;\n        break;\n    case FIELD_MOVE_DIG:\n        data->mapSec = gMapHeader.regionMapSectionId;\n        break;\n    default:\n        data->mapSec = 0xFF;\n    }\n    SetQuestLogEvent(QL_EVENT_USED_FIELD_MOVE, (const u16 *)data);\n    Free(data);\n}\n\nvoid SetUsedFlyQuestLogEvent(const u8 *healLocCtrlData)\n{\n    const struct MapHeader *mapHeader;\n    struct QuestLogEvent_FieldMove *data;\n    struct\n    {\n        s8 group;\n        s8 num;\n        u32 unused;\n    } *map = Alloc(sizeof(*map));\n\n    map->group = healLocCtrlData[0];\n    map->num = healLocCtrlData[1];\n    mapHeader = Overworld_GetMapHeaderByGroupAndId(map->group, map->num);\n    Free(map);\n\n    data = Alloc(sizeof(*data));\n    data->species = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_SPECIES_OR_EGG);\n    data->fieldMove = FIELD_MOVE_FLY;\n    data->mapSec = mapHeader->regionMapSectionId;\n    SetQuestLogEvent(QL_EVENT_USED_FIELD_MOVE, (const u16 *)data);\n    Free(data);\n}\n\nvoid CB2_ShowPartyMenuForItemUse(void)\n{\n    MainCallback callback = CB2_ReturnToBagMenu;\n    u8 partyLayout;\n    u8 menuType;\n    u32 i;\n    u8 msgId;\n    TaskFunc task;\n\n    if (gMain.inBattle)\n    {\n        menuType = PARTY_MENU_TYPE_IN_BATTLE;\n        partyLayout = GetPartyLayoutFromBattleType();\n    }\n    else\n    {\n        menuType = PARTY_MENU_TYPE_FIELD;\n        partyLayout = PARTY_LAYOUT_SINGLE;\n    }\n\n    if (GetItemEffectType(gSpecialVar_ItemId) == ITEM_EFFECT_SACRED_ASH)\n    {\n        gPartyMenu.slotId = 0;\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0)\n            {\n                gPartyMenu.slotId = i;\n                break;\n            }\n        }\n        if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH)\n            callback = CB2_ReturnToBerryPouchMenu;\n        task = Task_SetSacredAshCB;\n        msgId = PARTY_MSG_NONE;\n    }\n    else\n    {\n        switch (GetPocketByItemId(gSpecialVar_ItemId))\n        {\n        default:\n            msgId = PARTY_MSG_USE_ON_WHICH_MON;\n            break;\n        case POCKET_TM_CASE:\n            msgId = PARTY_MSG_TEACH_WHICH_MON;\n            callback = CB2_ReturnToTMCaseMenu;\n            break;\n        case POCKET_BERRY_POUCH:\n            msgId = PARTY_MSG_USE_ON_WHICH_MON;\n            callback = CB2_ReturnToBerryPouchMenu;\n            break;\n        }\n        task = Task_HandleChooseMonInput;\n    }\n    InitPartyMenu(menuType, partyLayout, PARTY_ACTION_USE_ITEM, TRUE, msgId, task, callback);\n}\n\nstatic void CB2_ReturnToBagMenu(void)\n{\n    GoToBagMenu(ITEMMENULOCATION_LAST, OPEN_BAG_LAST, NULL);\n}\n\nstatic void CB2_ReturnToTMCaseMenu(void)\n{\n    InitTMCase(TMCASE_REOPENING, NULL, TMCASE_KEEP_PREV);\n}\n\nstatic void CB2_ReturnToBerryPouchMenu(void)\n{\n    InitBerryPouch(BERRYPOUCH_NA, NULL, 0xFF);\n}\n\nstatic void Task_DoUseItemAnim(u8 taskId)\n{\n    sPartyMenuInternal->exitCallback = CB2_DoUseItemAnim;\n    Task_ClosePartyMenu(taskId);\n}\n\nstatic void CB2_DoUseItemAnim(void)\n{\n    if (CheckIfItemIsTMHMOrEvolutionStone(gSpecialVar_ItemId) == 2) // Evolution stone\n    {\n        if (MonCanEvolve() == TRUE)\n            StartUseItemAnim_Normal(gPartyMenu.slotId, gSpecialVar_ItemId, CB2_UseEvolutionStone);\n        else\n            StartUseItemAnim_CantEvolve(gPartyMenu.slotId, gSpecialVar_ItemId, gPartyMenu.exitCallback);\n    }\n    else\n        StartUseItemAnim_Normal(gPartyMenu.slotId, gSpecialVar_ItemId, CB2_UseItem);\n}\n\nstatic void CB2_UseItem(void)\n{\n    if (ItemId_GetPocket(gSpecialVar_ItemId) == POCKET_TM_CASE && PSA_IsCancelDisabled() == TRUE)\n    {\n        GiveMoveToMon(&gPlayerParty[gPartyMenu.slotId], ItemIdToBattleMoveId(gSpecialVar_ItemId));\n        AdjustFriendship(&gPlayerParty[gPartyMenu.slotId], FRIENDSHIP_EVENT_LEARN_TMHM);\n        SetMainCallback2(gPartyMenu.exitCallback);\n    }\n    else\n        InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, PARTY_ACTION_CHOOSE_MON, gPartyMenu.slotId, PARTY_MSG_NONE, Task_SetSacredAshCB, gPartyMenu.exitCallback);\n}\n\nstatic void CB2_UseTMHMAfterForgettingMove(void)\n{\n    if (PSA_IsCancelDisabled() == TRUE)\n    {\n        struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n        u8 moveIdx = GetMoveSlotToReplace();\n        u16 move = GetMonData(mon, moveIdx + MON_DATA_MOVE1);\n        u8 oldpp = GetMonData(mon, moveIdx + MON_DATA_PP1);\n\n        RemoveMonPPBonus(mon, moveIdx);\n        SetMonMoveSlot(mon, ItemIdToBattleMoveId(gSpecialVar_ItemId), moveIdx);\n        if(oldpp < gBattleMoves[ItemIdToBattleMoveId(gSpecialVar_ItemId)].pp)\n        {   //if TM used, don't restore PP\n            SetMonData(mon, MON_DATA_PP1 + moveIdx, &oldpp);\n        }\n        AdjustFriendship(mon, FRIENDSHIP_EVENT_LEARN_TMHM);\n        ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, gSpecialVar_ItemId, move);\n        SetMainCallback2(gPartyMenu.exitCallback);\n    }\n    else\n        InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, gPartyMenu.slotId, PARTY_MSG_NONE, Task_SetSacredAshCB, gPartyMenu.exitCallback);\n}\n\nstatic void Task_SetSacredAshCB(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE)\n            sPartyMenuInternal->exitCallback = CB2_SetUpExitToBattleScreen;\n        gItemUseCB(taskId, Task_ClosePartyMenuAfterText); // ItemUseCB_SacredAsh in this case\n    }\n}\n\nstatic bool8 IsHPRecoveryItem(u16 item)\n{\n    const u8 *effect;\n\n    if (item == ITEM_ENIGMA_BERRY)\n        effect = gSaveBlock1Ptr->enigmaBerry.itemEffect;\n    else\n        effect = gItemEffectTable[item - ITEM_POTION];\n    if (effect[4] & ITEM4_HEAL_HP)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void GetMedicineItemEffectMessage(u16 item)\n{\n    switch (GetItemEffectType(item))\n    {\n    case ITEM_EFFECT_CURE_POISON:\n        StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfPoison);\n        break;\n    case ITEM_EFFECT_CURE_SLEEP:\n        StringExpandPlaceholders(gStringVar4, gText_PkmnWokeUp2);\n        break;\n    case ITEM_EFFECT_CURE_BURN:\n        StringExpandPlaceholders(gStringVar4, gText_PkmnBurnHealed);\n        break;\n    case ITEM_EFFECT_CURE_FREEZE:\n        StringExpandPlaceholders(gStringVar4, gText_PkmnThawedOut);\n        break;\n    case ITEM_EFFECT_CURE_PARALYSIS:\n        StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfParalysis);\n        break;\n    case ITEM_EFFECT_CURE_CONFUSION:\n        StringExpandPlaceholders(gStringVar4, gText_PkmnSnappedOutOfConfusion);\n        break;\n    case ITEM_EFFECT_CURE_INFATUATION:\n        StringExpandPlaceholders(gStringVar4, gText_PkmnGotOverInfatuation);\n        break;\n    case ITEM_EFFECT_CURE_ALL_STATUS:\n        StringExpandPlaceholders(gStringVar4, gText_PkmnBecameHealthy);\n        break;\n    case ITEM_EFFECT_HP_EV:\n        StringCopy(gStringVar2, gText_ItemEffect_HP);\n        StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);\n        break;\n    case ITEM_EFFECT_ATK_EV:\n        StringCopy(gStringVar2, gText_ItemEffect_Attack);\n        StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);\n        break;\n    case ITEM_EFFECT_DEF_EV:\n        StringCopy(gStringVar2, gText_ItemEffect_Defense);\n        StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);\n        break;\n    case ITEM_EFFECT_SPEED_EV:\n        StringCopy(gStringVar2, gText_ItemEffect_Speed);\n        StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);\n        break;\n    case ITEM_EFFECT_SPATK_EV:\n        StringCopy(gStringVar2, gText_ItemEffect_SpAtk);\n        StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);\n        break;\n    case ITEM_EFFECT_SPDEF_EV:\n        StringCopy(gStringVar2, gText_ItemEffect_SpDef);\n        StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);\n        break;\n    case ITEM_EFFECT_PP_UP:\n    case ITEM_EFFECT_PP_MAX:\n        StringExpandPlaceholders(gStringVar4, gText_MovesPPIncreased);\n        break;\n    case ITEM_EFFECT_HEAL_PP:\n        StringExpandPlaceholders(gStringVar4, gText_PPWasRestored);\n        break;\n    default:\n        StringExpandPlaceholders(gStringVar4, gText_WontHaveEffect);\n        break;\n    }\n}\n\nstatic bool8 NotUsingHPEVItemOnShedinja(struct Pokemon *mon, u16 item)\n{\n    if (GetItemEffectType(item) == ITEM_EFFECT_HP_EV && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_SHEDINJA)\n        return FALSE;\n    return TRUE;\n}\n\nstatic bool8 IsItemFlute(u16 item)\n{\n    if (item == ITEM_BLUE_FLUTE || item == ITEM_RED_FLUTE || item == ITEM_YELLOW_FLUTE)\n        return TRUE;\n    return FALSE;\n}\n\nstatic bool8 ExecuteTableBasedItemEffect_(u8 partyMonIndex, u16 item, u8 monMoveIndex)\n{\n    if (gMain.inBattle)\n        return ExecuteTableBasedItemEffect(&gPlayerParty[partyMonIndex], item, GetPartyIdFromBattleSlot(partyMonIndex), monMoveIndex);\n    else\n        return ExecuteTableBasedItemEffect(&gPlayerParty[partyMonIndex], item, partyMonIndex, monMoveIndex);\n}\n\nvoid ItemUseCB_Medicine(u8 taskId, TaskFunc func)\n{\n    u16 hp;\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    u16 item = gSpecialVar_ItemId;\n    bool8 canHeal;\n\n    if (!NotUsingHPEVItemOnShedinja(mon, item))\n    {\n        canHeal = TRUE;\n    }\n    else\n    {\n        if (IsHPRecoveryItem(item) == TRUE)\n        {\n            hp = GetMonData(mon, MON_DATA_HP);\n            if (hp == GetMonData(mon, MON_DATA_MAX_HP))\n                canHeal = FALSE;\n        }\n        canHeal = PokemonItemUseNoEffect(mon, item, gPartyMenu.slotId, 0);\n    }\n    PlaySE(SE_SELECT);\n    if (canHeal)\n    {\n        gPartyMenuUseExitCallback = FALSE;\n        DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE);\n        ScheduleBgCopyTilemapToVram(2);\n        gTasks[taskId].func = func;\n    }\n    else\n    {\n        ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, item, 0xFFFF);\n        Task_DoUseItemAnim(taskId);\n        gItemUseCB = ItemUseCB_MedicineStep;\n    }\n}\n\nvoid ItemUseCB_MedicineStep(u8 taskId, TaskFunc func)\n{\n    u16 hp = 0;\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    u16 item = gSpecialVar_ItemId;\n    bool8 canHeal;\n    bool8 cannotHeal;\n\n    if (NotUsingHPEVItemOnShedinja(mon, item) == FALSE)\n        cannotHeal = TRUE;\n    else\n    {\n        canHeal = IsHPRecoveryItem(item);\n        if (canHeal == TRUE)\n        {\n            hp = GetMonData(mon, MON_DATA_HP);\n            if (hp == GetMonData(mon, MON_DATA_MAX_HP))\n                canHeal = FALSE;\n        }\n\n        cannotHeal = ExecuteTableBasedItemEffect_(gPartyMenu.slotId, item, 0);\n    }\n\n    if (cannotHeal != FALSE)\n    {\n        gPartyMenuUseExitCallback = FALSE;\n        PlaySE(SE_SELECT);\n        DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE);\n        ScheduleBgCopyTilemapToVram(2);\n        gTasks[taskId].func = func;\n    }\n    else\n    {\n        gPartyMenuUseExitCallback = TRUE;\n        if (!IsItemFlute(item))\n        {\n            PlaySE(SE_USE_ITEM);\n            if (gPartyMenu.action != PARTY_ACTION_REUSABLE_ITEM)\n                RemoveBagItem(item, 1);\n        }\n        else\n            PlaySE(SE_GLASS_FLUTE);\n\n        SetPartyMonAilmentGfx(mon, &sPartyMenuBoxes[gPartyMenu.slotId]);\n        if (gSprites[sPartyMenuBoxes[gPartyMenu.slotId].statusSpriteId].invisible)\n            DisplayPartyPokemonLevelCheck(mon, &sPartyMenuBoxes[gPartyMenu.slotId], 1);\n        if (canHeal == TRUE)\n        {\n            if (hp == 0)\n                AnimatePartySlot(gPartyMenu.slotId, 1);\n            PartyMenuModifyHP(taskId, gPartyMenu.slotId, 1, GetMonData(mon, MON_DATA_HP) - hp, Task_DisplayHPRestoredMessage);\n            ResetHPTaskData(taskId, 0, hp);\n        }\n        else\n        {\n            GetMonNickname(mon, gStringVar1);\n            GetMedicineItemEffectMessage(item);\n            DisplayPartyMenuMessage(gStringVar4, TRUE);\n            ScheduleBgCopyTilemapToVram(2);\n            gTasks[taskId].func = func;\n        }\n    }\n}\n\nstatic void Task_DisplayHPRestoredMessage(u8 taskId)\n{\n    GetMonNickname(&gPlayerParty[gPartyMenu.slotId], gStringVar1);\n    StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2);\n    DisplayPartyMenuMessage(gStringVar4, FALSE);\n    ScheduleBgCopyTilemapToVram(2);\n    HandleBattleLowHpMusicChange();\n    gTasks[taskId].func = Task_ClosePartyMenuAfterText;\n}\n\nstatic void Task_ClosePartyMenuAfterText(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        if (gPartyMenuUseExitCallback == FALSE)\n            sPartyMenuInternal->exitCallback = NULL;\n        Task_ClosePartyMenu(taskId);\n    }\n}\n\nstatic void ShowMoveSelectWindow(u8 slot)\n{\n    u32 i;\n    u8 moveCount = 0;\n    u8 fontId = FONT_NORMAL;\n    u8 windowId = DisplaySelectionWindow(SELECTWINDOW_MOVES);\n    u16 move;\n\n    for (i = 0; i < MAX_MON_MOVES; ++i)\n    {\n        move = GetMonData(&gPlayerParty[slot], MON_DATA_MOVE1 + i);\n        AddTextPrinterParameterized(windowId,\n                                    fontId,\n                                    gMoveNames[move],\n                                    GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH) + GetFontAttribute(fontId, FONTATTR_LETTER_SPACING),\n                                    (i * 16) + 2,\n                                    TEXT_SKIP_DRAW,\n                                    NULL);\n        if (move != MOVE_NONE)\n            ++moveCount;\n    }\n    Menu_InitCursor(windowId, fontId, 0, 2, 16, moveCount, FALSE);\n    ScheduleBgCopyTilemapToVram(2);\n}\n\nstatic void Task_HandleRestoreWhichMoveInput(u8 taskId)\n{\n    s8 input = Menu_ProcessInput();\n\n    if (input != MENU_NOTHING_CHOSEN)\n    {\n        if (input == MENU_B_PRESSED)\n        {\n            PlaySE(SE_SELECT);\n            ReturnToUseOnWhichMon(taskId);\n        }\n        else\n            SetSelectedMoveForPPItem(taskId);\n    }\n}\n\n#define ppMoveSlot data[0]\n\nvoid ItemUseCB_TryRestorePP(u8 taskId, TaskFunc func)\n{\n    const u8 *effect;\n    u16 item = gSpecialVar_ItemId;\n\n    if (item == ITEM_ENIGMA_BERRY)\n        effect = gSaveBlock1Ptr->enigmaBerry.itemEffect;\n    else\n        effect = gItemEffectTable[item - ITEM_POTION];\n\n    if (!(effect[4] & ITEM4_HEAL_PP_ONE))\n    {\n        gPartyMenu.ppMoveSlot = 0;\n        if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE)\n            TryUsePPItemInBattle(taskId);\n        else\n            TryUsePPItemOutsideBattle(taskId);\n    }\n    else\n    {\n        PlaySE(SE_SELECT);\n        DisplayPartyMenuStdMessage(PARTY_MSG_RESTORE_WHICH_MOVE);\n        ShowMoveSelectWindow(gPartyMenu.slotId);\n        gTasks[taskId].func = Task_HandleRestoreWhichMoveInput;\n    }\n}\n\nstatic void SetSelectedMoveForPPItem(u8 taskId)\n{\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    gPartyMenu.ppMoveSlot = Menu_GetCursorPos();\n    if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE)\n        TryUsePPItemInBattle(taskId);\n    else\n        TryUsePPItemOutsideBattle(taskId);\n}\n\nstatic void ReturnToUseOnWhichMon(u8 taskId)\n{\n    gTasks[taskId].func = Task_HandleChooseMonInput;\n    sPartyMenuInternal->exitCallback = NULL;\n    PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);\n    DisplayPartyMenuStdMessage(PARTY_MSG_USE_ON_WHICH_MON);\n}\n\nstatic void TryUsePPItemOutsideBattle(u8 taskId)\n{\n    bool8 noEffect = PokemonItemUseNoEffect(&gPlayerParty[gPartyMenu.slotId],\n                                            gSpecialVar_ItemId,\n                                            gPartyMenu.slotId,\n                                            gPartyMenu.ppMoveSlot);\n    PlaySE(SE_SELECT);\n    if (noEffect)\n    {\n        gPartyMenuUseExitCallback = FALSE;\n        DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE);\n        ScheduleBgCopyTilemapToVram(2);\n        gTasks[taskId].func = Task_ClosePartyMenuAfterText;\n    }\n    else\n    {\n        Task_DoUseItemAnim(taskId);\n        gItemUseCB = ItemUseCB_RestorePP;\n    }\n}\n\nstatic void ItemUseCB_RestorePP(u8 taskId, TaskFunc func)\n{\n    u16 move;\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n\n    ExecuteTableBasedItemEffect_(gPartyMenu.slotId, gSpecialVar_ItemId, (u8)gPartyMenu.ppMoveSlot);\n    gPartyMenuUseExitCallback = TRUE;\n    ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, gSpecialVar_ItemId, 0xFFFF);\n    PlaySE(SE_USE_ITEM);\n    RemoveBagItem(gSpecialVar_ItemId, 1);\n    move = GetMonData(mon, gPartyMenu.ppMoveSlot + MON_DATA_MOVE1);\n    StringCopy(gStringVar1, gMoveNames[move]);\n    GetMedicineItemEffectMessage(gSpecialVar_ItemId);\n    DisplayPartyMenuMessage(gStringVar4, 1);\n    ScheduleBgCopyTilemapToVram(2);\n    gTasks[taskId].func = Task_ClosePartyMenuAfterText;\n}\n\nstatic void TryUsePPItemInBattle(u8 taskId)\n{\n    u16 move = MOVE_NONE;\n    s16 *moveSlot = &gPartyMenu.ppMoveSlot;\n    u16 item = gSpecialVar_ItemId;\n    struct PartyMenu *ptr = &gPartyMenu;\n    struct Pokemon *mon;\n\n    if (ExecuteTableBasedItemEffect_(ptr->slotId, item, *moveSlot))\n    {\n        gPartyMenuUseExitCallback = FALSE;\n        PlaySE(SE_SELECT);\n        DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE);\n        ScheduleBgCopyTilemapToVram(2);\n        gTasks[taskId].func = Task_ClosePartyMenuAfterText;\n    }\n    else\n    {\n        gPartyMenuUseExitCallback = TRUE;\n        mon = &gPlayerParty[ptr->slotId];\n        ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, item, 0xFFFF);\n        PlaySE(SE_USE_ITEM);\n        RemoveBagItem(item, 1);\n        move = GetMonData(mon, MON_DATA_MOVE1 + *moveSlot);\n        StringCopy(gStringVar1, gMoveNames[move]);\n        GetMedicineItemEffectMessage(item);\n        DisplayPartyMenuMessage(gStringVar4, TRUE);\n        ScheduleBgCopyTilemapToVram(2);\n        gTasks[taskId].func = Task_ClosePartyMenuAfterText;\n    }\n}\n\n#undef ppMoveSlot\n\nvoid ItemUseCB_PPUp(u8 taskId, TaskFunc func)\n{\n    PlaySE(SE_SELECT);\n    DisplayPartyMenuStdMessage(PARTY_MSG_BOOST_PP_WHICH_MOVE);\n    ShowMoveSelectWindow(gPartyMenu.slotId);\n    gTasks[taskId].func = Task_HandleRestoreWhichMoveInput;\n}\n\nu16 ItemIdToBattleMoveId(u16 item)\n{\n    u16 tmNumber = item - ITEM_TM01_FOCUS_PUNCH;\n\n    return sTMHMMoves[tmNumber];\n}\n\nbool8 IsMoveHm(u16 move)\n{\n    u32 i;\n\n    for (i = 0; i < NUM_HIDDEN_MACHINES; ++i)\n        if (sTMHMMoves[i + NUM_TECHNICAL_MACHINES] == move)\n            return TRUE;\n    return FALSE;\n}\n\nbool8 MonKnowsMove(struct Pokemon *mon, u16 move)\n{\n    u32 i;\n\n    for (i = 0; i < MAX_MON_MOVES; ++i)\n    {\n        if (GetMonData(mon, MON_DATA_MOVE1 + i) == move)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void DisplayLearnMoveMessage(const u8 *str)\n{\n    StringExpandPlaceholders(gStringVar4, str);\n    DisplayPartyMenuMessage(gStringVar4, TRUE);\n    ScheduleBgCopyTilemapToVram(2);\n}\n\nstatic void DisplayLearnMoveMessageAndClose(u8 taskId, const u8 *str)\n{\n    DisplayLearnMoveMessage(str);\n    gTasks[taskId].func = Task_ClosePartyMenuAfterText;\n}\n\n#define learnMoveId     data[0]\n#define learnMoveMethod data[1]\n\nvoid ItemUseCB_TMHM(u8 taskId, TaskFunc func)\n{\n    struct Pokemon *mon;\n    s16 *data;\n    u16 item;\n\n    PlaySE(SE_SELECT);\n    mon = &gPlayerParty[gPartyMenu.slotId];\n    data = gPartyMenu.data;\n    item = gSpecialVar_ItemId;\n    GetMonNickname(mon, gStringVar1);\n    learnMoveId = ItemIdToBattleMoveId(item);\n    StringCopy(gStringVar2, gMoveNames[learnMoveId]);\n    learnMoveMethod = LEARN_VIA_TMHM;\n    switch (CanMonLearnTMTutor(mon, item, 0))\n    {\n    case CANNOT_LEARN_MOVE:\n        DisplayLearnMoveMessageAndClose(taskId, gText_PkmnCantLearnMove);\n        return;\n    case ALREADY_KNOWS_MOVE:\n        DisplayLearnMoveMessageAndClose(taskId, gText_PkmnAlreadyKnows);\n        return;\n    }\n    if (GiveMoveToMon(mon, learnMoveId) != MON_HAS_MAX_MOVES)\n    {\n        ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, item, 0xFFFF);\n        Task_DoUseItemAnim(taskId);\n        gItemUseCB = ItemUseCB_LearnedMove;\n    }\n    else\n    {\n        DisplayLearnMoveMessage(gText_PkmnNeedsToReplaceMove);\n        gTasks[taskId].func = Task_ReplaceMoveYesNo;\n    }\n}\n\nstatic void ItemUseCB_LearnedMove(u8 taskId, TaskFunc func)\n{\n    Task_LearnedMove(taskId);\n}\n\nstatic void Task_LearnedMove(u8 taskId)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    s16 *data = gPartyMenu.data;\n    u16 item = gSpecialVar_ItemId;\n\n    if (learnMoveMethod == LEARN_VIA_TMHM)\n    {\n        AdjustFriendship(mon, FRIENDSHIP_EVENT_LEARN_TMHM);\n    }\n    GetMonNickname(mon, gStringVar1);\n    StringCopy(gStringVar2, gMoveNames[learnMoveId]);\n    StringExpandPlaceholders(gStringVar4, gText_PkmnLearnedMove3);\n    DisplayPartyMenuMessage(gStringVar4, TRUE);\n    ScheduleBgCopyTilemapToVram(2);\n    gTasks[taskId].func = Task_DoLearnedMoveFanfareAfterText;\n}\n\nstatic void Task_DoLearnedMoveFanfareAfterText(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        PlayFanfare(MUS_LEVEL_UP);\n        gTasks[taskId].func = Task_LearnNextMoveOrClosePartyMenu;\n    }\n}\n\nstatic void Task_LearnNextMoveOrClosePartyMenu(u8 taskId)\n{\n    if (IsFanfareTaskInactive() && ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)))\n    {\n        if (gPartyMenu.learnMoveMethod == LEARN_VIA_LEVEL_UP)\n            Task_TryLearningNextMove(taskId);\n        else\n        {\n            if (gPartyMenu.learnMoveMethod == LEARN_VIA_TUTOR)\n                gSpecialVar_Result = TRUE;\n            Task_ClosePartyMenu(taskId);\n        }\n    }\n}\n\nstatic void Task_ReplaceMoveYesNo(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        PartyMenuDisplayYesNoMenu();\n        gTasks[taskId].func = Task_HandleReplaceMoveYesNoInput;\n    }\n}\n\nstatic void Task_HandleReplaceMoveYesNoInput(u8 taskId)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0: // Yes\n        DisplayPartyMenuMessage(gText_WhichMoveToForget, TRUE);\n        gTasks[taskId].func = Task_ShowSummaryScreenToForgetMove;\n        break;\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        // fallthrough\n    case 1: // No\n        StopLearningMovePrompt(taskId);\n        break;\n    }\n}\n\nstatic void Task_ShowSummaryScreenToForgetMove(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        sPartyMenuInternal->exitCallback = CB2_ShowSummaryScreenToForgetMove;\n        Task_ClosePartyMenu(taskId);\n    }\n}\n\nstatic void CB2_ShowSummaryScreenToForgetMove(void)\n{\n    ShowSelectMovePokemonSummaryScreen(gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuWhileLearningMove, gPartyMenu.learnMoveId);\n}\n\nstatic void CB2_ReturnToPartyMenuWhileLearningMove(void)\n{\n    u8 moveIdx = GetMoveSlotToReplace();\n    u16 move;\n    s32 learnMethod = gPartyMenu.learnMoveMethod;\n\n    if (learnMethod == LEARN_VIA_TMHM && moveIdx != MAX_MON_MOVES)\n    {\n        move = GetMonData(&gPlayerParty[gPartyMenu.slotId], moveIdx + MON_DATA_MOVE1);\n        StartUseItemAnim_ForgetMoveAndLearnTMorHM(gPartyMenu.slotId, gSpecialVar_ItemId, move, CB2_UseTMHMAfterForgettingMove);\n        gItemUseCB = ItemUseCB_ReplaceMoveWithTMHM;\n        gPartyMenu.action = PARTY_ACTION_CHOOSE_MON;\n    }\n    else\n        InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, TRUE, PARTY_MSG_NONE, Task_ReturnToPartyMenuWhileLearningMove, gPartyMenu.exitCallback);\n}\n\nstatic void Task_ReturnToPartyMenuWhileLearningMove(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        if (GetMoveSlotToReplace() != MAX_MON_MOVES)\n            DisplayPartyMenuForgotMoveMessage(taskId);\n        else\n            StopLearningMovePrompt(taskId);\n    }\n}\n\nstatic void ItemUseCB_ReplaceMoveWithTMHM(u8 taskId, TaskFunc func)\n{\n    Task_ReplaceMoveWithTMHM(taskId);\n}\n\nstatic void Task_ReplaceMoveWithTMHM(u8 taskId)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    u8 moveIdx = GetMoveSlotToReplace();\n    u16 move = GetMonData(mon, moveIdx + MON_DATA_MOVE1);\n\n    ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, gSpecialVar_ItemId, move);\n    GetMonNickname(mon, gStringVar1);\n    StringCopy(gStringVar2, gMoveNames[move]);\n    RemoveMonPPBonus(mon, moveIdx);\n    SetMonMoveSlot(mon, gPartyMenu.learnMoveId, moveIdx);\n    Task_LearnedMove(taskId);\n}\n\nstatic void DisplayPartyMenuForgotMoveMessage(u8 taskId)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    u16 move = GetMonData(mon, MON_DATA_MOVE1 + GetMoveSlotToReplace());\n\n    GetMonNickname(mon, gStringVar1);\n    StringCopy(gStringVar2, gMoveNames[move]);\n    DisplayLearnMoveMessage(gText_12PoofForgotMove);\n    gTasks[taskId].func = Task_PartyMenuReplaceMove;\n}\n\nstatic void Task_PartyMenuReplaceMove(u8 taskId)\n{\n    struct Pokemon *mon;\n    u16 move;\n\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        mon = &gPlayerParty[gPartyMenu.slotId];\n        RemoveMonPPBonus(mon, GetMoveSlotToReplace());\n        move = gPartyMenu.learnMoveId;\n        SetMonMoveSlot(mon, move, GetMoveSlotToReplace());\n        Task_LearnedMove(taskId);\n    }\n}\n\nstatic void StopLearningMovePrompt(u8 taskId)\n{\n    StringCopy(gStringVar2, gMoveNames[gPartyMenu.learnMoveId]);\n    StringExpandPlaceholders(gStringVar4, gText_StopLearningMove2);\n    DisplayPartyMenuMessage(gStringVar4, TRUE);\n    ScheduleBgCopyTilemapToVram(2);\n    gTasks[taskId].func = Task_StopLearningMoveYesNo;\n}\n\nstatic void Task_StopLearningMoveYesNo(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        PartyMenuDisplayYesNoMenu();\n        gTasks[taskId].func = Task_HandleStopLearningMoveYesNoInput;\n    }\n}\n\nstatic void Task_HandleStopLearningMoveYesNoInput(u8 taskId)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0: // Yes\n        GetMonNickname(mon, gStringVar1);\n        StringCopy(gStringVar2, gMoveNames[gPartyMenu.learnMoveId]);\n        StringExpandPlaceholders(gStringVar4, gText_MoveNotLearned);\n        DisplayPartyMenuMessage(gStringVar4, TRUE);\n        if (gPartyMenu.learnMoveMethod == LEARN_VIA_LEVEL_UP)\n        {\n            gTasks[taskId].func = Task_TryLearningNextMoveAfterText;\n        }\n        else\n        {\n            if (gPartyMenu.learnMoveMethod == LEARN_VIA_TUTOR)\n                gSpecialVar_Result = FALSE;\n            gTasks[taskId].func = Task_ClosePartyMenuAfterText;\n        }\n        break;\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        // fallthrough\n    case 1: // No\n        GetMonNickname(mon, gStringVar1);\n        StringCopy(gStringVar2, gMoveNames[gPartyMenu.learnMoveId]);\n        DisplayLearnMoveMessage(gText_PkmnNeedsToReplaceMove);\n        gTasks[taskId].func = Task_ReplaceMoveYesNo;\n        break;\n    }\n}\n\nstatic void Task_TryLearningNextMoveAfterText(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n        Task_TryLearningNextMove(taskId);\n}\n\nvoid ItemUseCB_RareCandy(u8 taskId, TaskFunc func)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    u16 item = gSpecialVar_ItemId;\n    bool8 noEffect;\n\n    if (GetMonData(mon, MON_DATA_LEVEL) != MAX_LEVEL)\n        noEffect = PokemonItemUseNoEffect(mon, item, gPartyMenu.slotId, 0);\n    else\n        noEffect = TRUE;\n    PlaySE(SE_SELECT);\n    if (noEffect)\n    {\n        gPartyMenuUseExitCallback = FALSE;\n        DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE);\n        ScheduleBgCopyTilemapToVram(2);\n        gTasks[taskId].func = func;\n    }\n    else\n    {\n        Task_DoUseItemAnim(taskId);\n        gItemUseCB = ItemUseCB_RareCandyStep;\n    }\n}\n\nstatic void ItemUseCB_RareCandyStep(u8 taskId, TaskFunc func)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    struct PartyMenuInternal *ptr = sPartyMenuInternal;\n    s16 *arrayPtr = ptr->data;\n    u8 level;\n\n    GetMonLevelUpWindowStats(mon, arrayPtr);\n    ExecuteTableBasedItemEffect_(gPartyMenu.slotId, gSpecialVar_ItemId, 0);\n    GetMonLevelUpWindowStats(mon, &ptr->data[NUM_STATS]);\n    gPartyMenuUseExitCallback = TRUE;\n    ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, gSpecialVar_ItemId, 0xFFFF);\n    PlayFanfareByFanfareNum(FANFARE_LEVEL_UP);\n    UpdateMonDisplayInfoAfterRareCandy(gPartyMenu.slotId, mon);\n    RemoveBagItem(gSpecialVar_ItemId, 1);\n    GetMonNickname(mon, gStringVar1);\n    level = GetMonData(mon, MON_DATA_LEVEL);\n    ConvertIntToDecimalStringN(gStringVar2, level, STR_CONV_MODE_LEFT_ALIGN, 3);\n    StringExpandPlaceholders(gStringVar4, gText_PkmnElevatedToLvVar2);\n    DisplayPartyMenuMessage(gStringVar4, TRUE);\n    ScheduleBgCopyTilemapToVram(2);\n    gTasks[taskId].func = Task_DisplayLevelUpStatsPg1;\n}\n\nstatic void UpdateMonDisplayInfoAfterRareCandy(u8 slot, struct Pokemon *mon)\n{\n    SetPartyMonAilmentGfx(mon, &sPartyMenuBoxes[slot]);\n    if (gSprites[sPartyMenuBoxes[slot].statusSpriteId].invisible)\n        DisplayPartyPokemonLevelCheck(mon, &sPartyMenuBoxes[slot], DRAW_MENU_BOX_AND_TEXT);\n    DisplayPartyPokemonHPCheck(mon, &sPartyMenuBoxes[slot], DRAW_MENU_BOX_AND_TEXT);\n    DisplayPartyPokemonMaxHPCheck(mon, &sPartyMenuBoxes[slot], DRAW_MENU_BOX_AND_TEXT);\n    DisplayPartyPokemonHPBarCheck(mon, &sPartyMenuBoxes[slot]);\n    UpdatePartyMonHPBar(sPartyMenuBoxes[slot].monSpriteId, mon);\n    AnimatePartySlot(slot, 1);\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nstatic void Task_DisplayLevelUpStatsPg1(u8 taskId)\n{\n    if (WaitFanfare(FALSE) && IsPartyMenuTextPrinterActive() != TRUE && (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)))\n    {\n        PlaySE(SE_SELECT);\n        DisplayLevelUpStatsPg1(taskId);\n        gTasks[taskId].func = Task_DisplayLevelUpStatsPg2;\n    }\n}\n\nstatic void Task_DisplayLevelUpStatsPg2(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        DisplayLevelUpStatsPg2(taskId);\n        gTasks[taskId].func = Task_TryLearnNewMoves;\n    }\n}\n\nstatic void DisplayLevelUpStatsPg1(u8 taskId)\n{\n    s16 *arrayPtr = sPartyMenuInternal->data;\n\n    arrayPtr[12] = CreateLevelUpStatsWindow();\n    DrawLevelUpWindowPg1(arrayPtr[12], arrayPtr, &arrayPtr[6], TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY);\n    CopyWindowToVram(arrayPtr[12], COPYWIN_GFX);\n    ScheduleBgCopyTilemapToVram(2);\n}\n\nstatic void DisplayLevelUpStatsPg2(u8 taskId)\n{\n    s16 *arrayPtr = sPartyMenuInternal->data;\n\n    DrawLevelUpWindowPg2(arrayPtr[12], &arrayPtr[6], TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY);\n    CopyWindowToVram(arrayPtr[12], COPYWIN_GFX);\n    ScheduleBgCopyTilemapToVram(2);\n}\n\nstatic void Task_TryLearnNewMoves(u8 taskId)\n{\n    u16 learnMove;\n\n    if (WaitFanfare(FALSE) && (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)))\n    {\n        RemoveLevelUpStatsWindow();\n        learnMove = MonTryLearningNewMove(&gPlayerParty[gPartyMenu.slotId], TRUE);\n        gPartyMenu.learnMoveMethod = LEARN_VIA_LEVEL_UP;\n        switch (learnMove)\n        {\n        case MOVE_NONE: // No moves to learn\n            PartyMenuTryEvolution(taskId);\n            break;\n        case MON_HAS_MAX_MOVES:\n            DisplayMonNeedsToReplaceMove(taskId);\n            break;\n        case MON_ALREADY_KNOWS_MOVE:\n            gTasks[taskId].func = Task_TryLearningNextMove;\n            break;\n        default:\n            DisplayMonLearnedMove(taskId, learnMove);\n            break;\n        }\n    }\n}\n\nstatic void Task_TryLearningNextMove(u8 taskId)\n{\n    u16 result = MonTryLearningNewMove(&gPlayerParty[gPartyMenu.slotId], FALSE);\n\n    switch (result)\n    {\n    case MOVE_NONE: // No moves to learn\n        PartyMenuTryEvolution(taskId);\n        break;\n    case MON_HAS_MAX_MOVES:\n        DisplayMonNeedsToReplaceMove(taskId);\n        break;\n    case MON_ALREADY_KNOWS_MOVE:\n        return;\n    default:\n        DisplayMonLearnedMove(taskId, result);\n        break;\n    }\n}\n\nstatic void PartyMenuTryEvolution(u8 taskId)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    u16 targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_NORMAL, ITEM_NONE);\n\n    if (targetSpecies != SPECIES_NONE)\n    {\n        FreePartyPointers();\n        gCB2_AfterEvolution = gPartyMenu.exitCallback;\n        BeginEvolutionScene(mon, targetSpecies, TRUE, gPartyMenu.slotId);\n        DestroyTask(taskId);\n    }\n    else\n        gTasks[taskId].func = Task_ClosePartyMenuAfterText;\n}\n\nstatic void DisplayMonNeedsToReplaceMove(u8 taskId)\n{\n    GetMonNickname(&gPlayerParty[gPartyMenu.slotId], gStringVar1);\n    StringCopy(gStringVar2, gMoveNames[gMoveToLearn]);\n    StringExpandPlaceholders(gStringVar4, gText_PkmnNeedsToReplaceMove);\n    DisplayPartyMenuMessage(gStringVar4, TRUE);\n    ScheduleBgCopyTilemapToVram(2);\n    gPartyMenu.learnMoveId = gMoveToLearn;\n    gTasks[taskId].func = Task_ReplaceMoveYesNo;\n}\n\nstatic void DisplayMonLearnedMove(u8 taskId, u16 move)\n{\n    GetMonNickname(&gPlayerParty[gPartyMenu.slotId], gStringVar1);\n    StringCopy(gStringVar2, gMoveNames[move]);\n    StringExpandPlaceholders(gStringVar4, gText_PkmnLearnedMove3);\n    DisplayPartyMenuMessage(gStringVar4, TRUE);\n    ScheduleBgCopyTilemapToVram(2);\n    gPartyMenu.learnMoveId = move;\n    gTasks[taskId].func = Task_DoLearnedMoveFanfareAfterText;\n}\n\n#define tUsedOnSlot   data[0]\n#define tHadEffect    data[1]\n#define tLastSlotUsed data[2]\n\nvoid ItemUseCB_SacredAsh(u8 taskId, TaskFunc func)\n{\n    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n    {   //Sacred Ash always fails in Nuzlocke mode\n        gPartyMenuUseExitCallback = FALSE;\n        DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE);\n        ScheduleBgCopyTilemapToVram(2);\n        gTasks[taskId].func = Task_ClosePartyMenuAfterText;\n        gPartyMenu.slotId = 0;\n        return;\n    }\n    sPartyMenuInternal->tUsedOnSlot = FALSE;\n    sPartyMenuInternal->tHadEffect = FALSE;\n    sPartyMenuInternal->tLastSlotUsed = gPartyMenu.slotId;\n    UseSacredAsh(taskId);\n}\n\nstatic void UseSacredAsh(u8 taskId)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    u16 hp;\n\n    if (GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NONE)\n    {\n        gTasks[taskId].func = Task_SacredAshLoop;\n        return;\n    }\n    hp = GetMonData(mon, MON_DATA_HP);\n    if (ExecuteTableBasedItemEffect_(gPartyMenu.slotId, gSpecialVar_ItemId, 0))\n    {\n        gTasks[taskId].func = Task_SacredAshLoop;\n        return;\n    }\n    PlaySE(SE_USE_ITEM);\n    if (sPartyMenuInternal->tHadEffect == 0)\n        sSacredAshQuestLogMonBackup = mon;\n    SetPartyMonAilmentGfx(mon, &sPartyMenuBoxes[gPartyMenu.slotId]);\n    if (gSprites[sPartyMenuBoxes[gPartyMenu.slotId].statusSpriteId].invisible)\n        DisplayPartyPokemonLevelCheck(mon, &sPartyMenuBoxes[gPartyMenu.slotId], DRAW_MENU_BOX_AND_TEXT);\n    AnimatePartySlot(sPartyMenuInternal->tLastSlotUsed, 0);\n    AnimatePartySlot(gPartyMenu.slotId, 1);\n    PartyMenuModifyHP(taskId, gPartyMenu.slotId, 1, GetMonData(mon, MON_DATA_HP) - hp, Task_SacredAshDisplayHPRestored);\n    ResetHPTaskData(taskId, 0, hp);\n    sPartyMenuInternal->tUsedOnSlot = TRUE;\n    sPartyMenuInternal->tHadEffect = TRUE;\n}\n\nstatic void Task_SacredAshLoop(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        if (sPartyMenuInternal->tUsedOnSlot == TRUE)\n        {\n            sPartyMenuInternal->tUsedOnSlot = FALSE;\n            sPartyMenuInternal->tLastSlotUsed = gPartyMenu.slotId;\n        }\n        if (++(gPartyMenu.slotId) == PARTY_SIZE)\n        {\n            if (sPartyMenuInternal->tHadEffect == FALSE)\n            {\n                gPartyMenuUseExitCallback = FALSE;\n                DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE);\n                ScheduleBgCopyTilemapToVram(2);\n            }\n            else\n            {\n                gPartyMenuUseExitCallback = TRUE;\n                if (gPartyMenu.menuType != PARTY_MENU_TYPE_IN_BATTLE)\n                    ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, sSacredAshQuestLogMonBackup, gSpecialVar_ItemId, 0xFFFF);\n                RemoveBagItem(gSpecialVar_ItemId, 1);\n            }\n            gTasks[taskId].func = Task_ClosePartyMenuAfterText;\n            gPartyMenu.slotId = 0;\n        }\n        else\n        {\n            UseSacredAsh(taskId);\n        }\n    }\n}\n\nstatic void Task_SacredAshDisplayHPRestored(u8 taskId)\n{\n    GetMonNickname(&gPlayerParty[gPartyMenu.slotId], gStringVar1);\n    StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2);\n    DisplayPartyMenuMessage(gStringVar4, FALSE);\n    ScheduleBgCopyTilemapToVram(2);\n    gTasks[taskId].func = Task_SacredAshLoop;\n}\n\n#undef tUsedOnSlot\n#undef tHadEffect\n#undef tLastSlotUsed\n\nvoid ItemUseCB_EvolutionStone(u8 taskId, TaskFunc func)\n{\n    bool8 noEffect;\n\n    PlaySE(SE_SELECT);\n    noEffect = PokemonItemUseNoEffect(&gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId, gPartyMenu.slotId, 0);\n    if (noEffect)\n    {\n        gPartyMenuUseExitCallback = FALSE;\n        DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE);\n        ScheduleBgCopyTilemapToVram(2);\n        gTasks[taskId].func = func;\n    }\n    else\n        Task_DoUseItemAnim(taskId);\n}\n\nstatic void CB2_UseEvolutionStone(void)\n{\n    u16 species;\n    gCB2_AfterEvolution = gPartyMenu.exitCallback;\n    ExecuteTableBasedItemEffect_(gPartyMenu.slotId, gSpecialVar_ItemId, 0);\n    ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, &gPlayerParty[gPartyMenu.slotId], gSpecialVar_ItemId, 0xFFFF);\n    if(gSpecialVar_ItemId != ITEM_LINK_BRACELET)\n        RemoveBagItem(gSpecialVar_ItemId, 1);\n    species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);\n    if(species == SPECIES_SLOWPOKE || species == SPECIES_POLIWHIRL || species == SPECIES_ONIX\n    || species == SPECIES_SEADRA || species == SPECIES_SCYTHER || species == SPECIES_PORYGON\n    || species == SPECIES_CLAMPERL)\n    { //just evolved by Link Bracelet, remove held item of trade+item mons\n        u16 heldItem = 0;\n        SetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_HELD_ITEM, &heldItem);\n    }\n}\n\nstatic bool8 MonCanEvolve(void)\n{\n    /*\n    if (!IsNationalPokedexEnabled()\n     && GetEvolutionTargetSpecies(&gPlayerParty[gPartyMenu.slotId], EVO_MODE_ITEM_USE, gSpecialVar_ItemId) > KANTO_DEX_COUNT)\n        return FALSE;\n    else*/\n        return TRUE;\n}\n\nu8 GetItemEffectType(u16 item)\n{\n    const u8 *itemEffect;\n    u32 statusCure;\n\n    if (!IS_POKEMON_ITEM(item))\n        return ITEM_EFFECT_NONE;\n    // Read the item's effect properties.\n    if (item == ITEM_ENIGMA_BERRY)\n        itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect;\n    else\n        itemEffect = gItemEffectTable[item - ITEM_POTION];\n    if ((itemEffect[0] & (ITEM0_DIRE_HIT | ITEM0_X_ATTACK)) || itemEffect[1] || itemEffect[2] || (itemEffect[3] & ITEM3_GUARD_SPEC))\n        return ITEM_EFFECT_X_ITEM;\n    else if (itemEffect[0] & ITEM0_SACRED_ASH)\n        return ITEM_EFFECT_SACRED_ASH;\n    else if (itemEffect[3] & ITEM3_LEVEL_UP)\n        return ITEM_EFFECT_RAISE_LEVEL;\n    statusCure = itemEffect[3] & ITEM3_STATUS_ALL;\n    if (statusCure || (itemEffect[0] >> 7))\n    {\n        if (statusCure == ITEM3_SLEEP)\n            return ITEM_EFFECT_CURE_SLEEP;\n        else if (statusCure == ITEM3_POISON)\n            return ITEM_EFFECT_CURE_POISON;\n        else if (statusCure == ITEM3_BURN)\n            return ITEM_EFFECT_CURE_BURN;\n        else if (statusCure == ITEM3_FREEZE)\n            return ITEM_EFFECT_CURE_FREEZE;\n        else if (statusCure == ITEM3_PARALYSIS)\n            return ITEM_EFFECT_CURE_PARALYSIS;\n        else if (statusCure == ITEM3_CONFUSION)\n            return ITEM_EFFECT_CURE_CONFUSION;\n        else if (itemEffect[0] >> 7 && !statusCure)\n            return ITEM_EFFECT_CURE_INFATUATION;\n        else\n            return ITEM_EFFECT_CURE_ALL_STATUS;\n    }\n    if (itemEffect[4] & (ITEM4_REVIVE | ITEM4_HEAL_HP))\n        return ITEM_EFFECT_HEAL_HP;\n    else if (itemEffect[4] & ITEM4_EV_ATK)\n        return ITEM_EFFECT_ATK_EV;\n    else if (itemEffect[4] & ITEM4_EV_HP)\n        return ITEM_EFFECT_HP_EV;\n    else if (itemEffect[5] & ITEM5_EV_SPATK)\n        return ITEM_EFFECT_SPATK_EV;\n    else if (itemEffect[5] & ITEM5_EV_SPDEF)\n        return ITEM_EFFECT_SPDEF_EV;\n    else if (itemEffect[5] & ITEM5_EV_SPEED)\n        return ITEM_EFFECT_SPEED_EV;\n    else if (itemEffect[5] & ITEM5_EV_DEF)\n        return ITEM_EFFECT_DEF_EV;\n    else if (itemEffect[4] & ITEM4_EVO_STONE)\n        return ITEM_EFFECT_EVO_STONE;\n    else if (itemEffect[4] & ITEM4_PP_UP)\n        return ITEM_EFFECT_PP_UP;\n    else if (itemEffect[5] & ITEM5_PP_MAX)\n        return ITEM_EFFECT_PP_MAX;\n    else if (itemEffect[4] & (ITEM4_HEAL_PP_ALL | ITEM4_HEAL_PP_ONE))\n        return ITEM_EFFECT_HEAL_PP;\n    else\n        return ITEM_EFFECT_NONE;\n}\n\nstatic void TryTutorSelectedMon(u8 taskId)\n{\n    struct Pokemon *mon;\n    s16 *data;\n\n    if (!gPaletteFade.active)\n    {\n        mon = &gPlayerParty[gPartyMenu.slotId];\n        data = gPartyMenu.data;\n        GetMonNickname(mon, gStringVar1);\n        gPartyMenu.learnMoveId = GetTutorMove(gSpecialVar_0x8005);\n        StringCopy(gStringVar2, gMoveNames[gPartyMenu.learnMoveId]);\n        learnMoveMethod = LEARN_VIA_TUTOR;\n        switch (CanMonLearnTMTutor(mon, 0, gSpecialVar_0x8005))\n        {\n        case CANNOT_LEARN_MOVE:\n            DisplayLearnMoveMessageAndClose(taskId, gText_PkmnCantLearnMove);\n            return;\n        case ALREADY_KNOWS_MOVE:\n            DisplayLearnMoveMessageAndClose(taskId, gText_PkmnAlreadyKnows);\n            return;\n        default:\n            if (GiveMoveToMon(mon, gPartyMenu.learnMoveId) != MON_HAS_MAX_MOVES)\n            {\n                Task_LearnedMove(taskId);\n                return;\n            }\n            break;\n        }\n        DisplayLearnMoveMessage(gText_PkmnNeedsToReplaceMove);\n        gTasks[taskId].func = Task_ReplaceMoveYesNo;\n    }\n}\n\n#undef learnMoveId\n#undef learnMoveMethod\n\nvoid CB2_PartyMenuFromStartMenu(void)\n{\n    InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, CB2_ReturnToFieldWithOpenMenu);\n}\n\n// Giving an item by selecting Give from the bag menu\n// As opposted to by selecting Give in the party menu, which is handled by CursorCB_Give\nvoid CB2_ChooseMonToGiveItem(void)\n{\n    MainCallback callback;\n\n    switch (GetPocketByItemId(gSpecialVar_ItemId))\n    {\n    default:\n        callback = CB2_ReturnToBagMenu;\n        break;\n    case POCKET_TM_CASE:\n        callback = CB2_ReturnToTMCaseMenu;\n        break;\n    case POCKET_BERRY_POUCH:\n        callback = CB2_ReturnToBerryPouchMenu;\n        break;\n    }\n    InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_GIVE_ITEM, FALSE, PARTY_MSG_GIVE_TO_WHICH_MON, Task_HandleChooseMonInput, callback);\n    gPartyMenu.bagItem = gSpecialVar_ItemId;\n}\n\nstatic void TryGiveItemOrMailToSelectedMon(u8 taskId)\n{\n    sPartyMenuItemId = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_HELD_ITEM);\n    if (sPartyMenuItemId == ITEM_NONE)\n    {\n        GiveItemOrMailToSelectedMon(taskId);\n    }\n    else if (ItemIsMail(sPartyMenuItemId))\n    {\n        DisplayItemMustBeRemovedFirstMessage(taskId);\n    }\n    else\n    {\n        DisplayAlreadyHoldingItemSwitchMessage(&gPlayerParty[gPartyMenu.slotId], sPartyMenuItemId, TRUE);\n        gTasks[taskId].func = Task_SwitchItemsFromBagYesNo;\n    }\n}\n\nstatic void GiveItemOrMailToSelectedMon(u8 taskId)\n{\n    if (ItemIsMail(gPartyMenu.bagItem))\n    {\n        RemoveItemToGiveFromBag(gPartyMenu.bagItem);\n        sPartyMenuInternal->exitCallback = CB2_WriteMailToGiveMonFromBag;\n        Task_ClosePartyMenu(taskId);\n    }\n    else\n    {\n        GiveItemToSelectedMon(taskId);\n    }\n}\n\nstatic void GiveItemToSelectedMon(u8 taskId)\n{\n    u16 item;\n\n    if (!gPaletteFade.active)\n    {\n        item = gPartyMenu.bagItem;\n        DisplayGaveHeldItemMessage(&gPlayerParty[gPartyMenu.slotId], item, FALSE, TRUE);\n        GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], item);\n        RemoveItemToGiveFromBag(item);\n        gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu;\n    }\n}\n\nstatic void Task_UpdateHeldItemSpriteAndClosePartyMenu(u8 taskId)\n{\n    s8 slot = gPartyMenu.slotId;\n\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        UpdatePartyMonHeldItemSprite(&gPlayerParty[slot], &sPartyMenuBoxes[slot]);\n        Task_ClosePartyMenu(taskId);\n    }\n}\n\nstatic void CB2_WriteMailToGiveMonFromBag(void)\n{\n    u8 mail;\n\n    GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], gPartyMenu.bagItem);\n    mail = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_MAIL);\n    DoEasyChatScreen(EASY_CHAT_TYPE_MAIL, gSaveBlock1Ptr->mail[mail].words, CB2_ReturnToPartyOrBagMenuFromWritingMail);\n}\n\nstatic void CB2_ReturnToPartyOrBagMenuFromWritingMail(void)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    u16 item = GetMonData(mon, MON_DATA_HELD_ITEM);\n\n    // Canceled writing mail\n    if (gSpecialVar_Result == FALSE)\n    {\n        TakeMailFromMon(mon);\n        SetMonData(mon, MON_DATA_HELD_ITEM, &sPartyMenuItemId);\n        RemoveBagItem(sPartyMenuItemId, 1);\n        ReturnGiveItemToBagOrPC(item);\n        SetMainCallback2(gPartyMenu.exitCallback);\n    }\n    // Wrote mail\n    else\n    {\n        InitPartyMenu(gPartyMenu.menuType, KEEP_PARTY_LAYOUT, gPartyMenu.action, TRUE, PARTY_MSG_NONE, Task_DisplayGaveMailFromBagMessage, gPartyMenu.exitCallback);\n    }\n}\n\nstatic void Task_DisplayGaveMailFromBagMessage(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        if (sPartyMenuItemId != ITEM_NONE)\n            DisplaySwitchedHeldItemMessage(gPartyMenu.bagItem, sPartyMenuItemId, FALSE);\n        else\n            DisplayGaveHeldItemMessage(&gPlayerParty[gPartyMenu.slotId], gPartyMenu.bagItem, FALSE, TRUE);\n        gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu;\n    }\n}\n\nstatic void Task_SwitchItemsFromBagYesNo(u8 taskId)\n{\n    if (IsPartyMenuTextPrinterActive() != TRUE)\n    {\n        PartyMenuDisplayYesNoMenu();\n        gTasks[taskId].func = Task_HandleSwitchItemsFromBagYesNoInput;\n    }\n}\n\nstatic void Task_HandleSwitchItemsFromBagYesNoInput(u8 taskId)\n{\n    u16 item;\n\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0: // Yes, switch items\n        item = gPartyMenu.bagItem;\n        RemoveItemToGiveFromBag(item);\n        if (AddBagItem(sPartyMenuItemId, 1) == FALSE)\n        {\n            ReturnGiveItemToBagOrPC(item);\n            BufferBagFullCantTakeItemMessage(sPartyMenuItemId);\n            DisplayPartyMenuMessage(gStringVar4, FALSE);\n            gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu;\n        }\n        else if (ItemIsMail(item))\n        {\n            sPartyMenuInternal->exitCallback = CB2_WriteMailToGiveMonFromBag;\n            Task_ClosePartyMenu(taskId);\n        }\n        else\n        {\n            GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], item);\n            DisplaySwitchedHeldItemMessage(item, sPartyMenuItemId, TRUE);\n            gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu;\n        }\n        break;\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        // fallthrough\n    case 1: // No, dont switch items\n        gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu;\n        break;\n    }\n}\n\nstatic void DisplayItemMustBeRemovedFirstMessage(u8 taskId)\n{\n    DisplayPartyMenuMessage(gText_RemoveMailBeforeItem, TRUE);\n    ScheduleBgCopyTilemapToVram(2);\n    gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu;\n}\n\nstatic void RemoveItemToGiveFromBag(u16 item)\n{\n    if (gPartyMenu.action == PARTY_ACTION_GIVE_PC_ITEM) // Unused, never occurs\n        RemovePCItem(item, 1);\n    else\n        RemoveBagItem(item, 1);\n}\n\n// Returns FALSE if there was no space to return the item\n// but there always should be, and the return is ignored in all uses\nstatic bool8 ReturnGiveItemToBagOrPC(u16 item)\n{\n    if (gPartyMenu.action == PARTY_ACTION_GIVE_ITEM) \n        return AddBagItem(item, 1);\n    else\n        return AddPCItem(item, 1);\n}\n\nvoid ChooseMonToGiveMailFromMailbox(void)\n{\n    InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_GIVE_MAILBOX_MAIL, FALSE, PARTY_MSG_GIVE_TO_WHICH_MON, Task_HandleChooseMonInput, Mailbox_ReturnToMailListAfterDeposit);\n}\n\nstatic void TryGiveMailToSelectedMon(u8 taskId)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    struct Mail *mail;\n\n    gPartyMenuUseExitCallback = FALSE;\n    mail = &gSaveBlock1Ptr->mail[gPlayerPcMenuManager.cursorPos + 6 + gPlayerPcMenuManager.itemsAbove];\n    if (GetMonData(mon, MON_DATA_HELD_ITEM) != ITEM_NONE)\n    {\n        DisplayPartyMenuMessage(gText_PkmnHoldingItemCantHoldMail, TRUE);\n    }\n    else\n    {\n        GiveMailToMon2(mon, mail);\n        ClearMailStruct(mail);\n        DisplayPartyMenuMessage(gText_MailTransferredFromMailbox, TRUE);\n    }\n    ScheduleBgCopyTilemapToVram(2);\n    gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu;\n}\n\nvoid InitChooseMonsForBattle(u8 chooseMonsBattleType)\n{\n    ClearSelectedPartyOrder();\n    InitPartyMenu(PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, gMain.savedCallback);\n    gPartyMenu.chooseMonsBattleType = chooseMonsBattleType;\n    gPartyMenu.task = Task_ValidateChosenMonsForBattle;\n}\n\nvoid ClearSelectedPartyOrder(void)\n{\n    memset(gSelectedOrderFromParty, 0, sizeof(gSelectedOrderFromParty));\n}\n\nstatic u8 GetPartySlotEntryStatus(s8 slot)\n{\n    if (GetBattleEntryEligibility(&gPlayerParty[slot]) == FALSE)\n        return 2; // Not eligible\n    else if (HasPartySlotAlreadyBeenSelected(slot + 1) == TRUE)\n        return 1; // Already selected\n    else\n        return 0; // Eligible, not selected\n}\n\nstatic bool8 GetBattleEntryEligibility(struct Pokemon *mon)\n{\n    u16 species;\n    u16 i = 0;\n\n    if (GetMonData(mon, MON_DATA_IS_EGG))\n        return FALSE;\n    switch (gPartyMenu.chooseMonsBattleType)\n    {\n    default:\n        if (GetMonData(mon, MON_DATA_LEVEL) > 30)\n            return FALSE;\n        break;\n    case CHOOSE_MONS_FOR_CABLE_CLUB_BATTLE:\n        if (GetMonData(mon, MON_DATA_HP) == 0)\n            return FALSE;\n        break;\n    case CHOOSE_MONS_FOR_BATTLE_TOWER:\n        if (gSaveBlock2Ptr->battleTower.battleTowerLevelType == 0 // level 50\n         && GetMonData(mon, MON_DATA_LEVEL) > 50)\n            return FALSE;\n        species = GetMonData(mon, MON_DATA_SPECIES);\n        for (; gBattleTowerBannedSpecies[i] != 0xFFFF; ++i)\n            if (gBattleTowerBannedSpecies[i] == species)\n                return FALSE;\n        break;\n    }\n    return TRUE;\n}\n\nstatic u8 CheckBattleEntriesAndGetMessage(void)\n{\n    u8 i, j;\n    struct Pokemon *party = gPlayerParty;\n    u8 *order = gSelectedOrderFromParty;\n    \n    switch (gPartyMenu.chooseMonsBattleType)\n    {\n    case CHOOSE_MONS_FOR_BATTLE_TOWER:\n        if (order[2] == 0)\n            return PARTY_MSG_THREE_MONS_ARE_NEEDED;\n        for (i = 0; i < 2; ++i)\n        {\n            sPartyMenuInternal->data[15] = GetMonData(&party[order[i] - 1], MON_DATA_SPECIES);\n            sPartyMenuInternal->data[14] = GetMonData(&party[order[i] - 1], MON_DATA_HELD_ITEM);\n            for (j = i + 1; j < 3; ++j)\n            {\n                if (sPartyMenuInternal->data[15] == GetMonData(&party[order[j] - 1], MON_DATA_SPECIES))\n                    return PARTY_MSG_MONS_CANT_BE_SAME;\n                if (sPartyMenuInternal->data[14] != ITEM_NONE && sPartyMenuInternal->data[14] == GetMonData(&party[order[j] - 1], MON_DATA_HELD_ITEM))\n                    return PARTY_MSG_NO_SAME_HOLD_ITEMS;\n            }\n        }\n        break;\n    case CHOOSE_MONS_FOR_UNION_ROOM_BATTLE:\n        if (order[1] == 0)\n            return PARTY_MSG_TWO_MONS_ARE_NEEDED;\n        break;\n    }\n    return 0xFF;\n}\n\nstatic bool8 HasPartySlotAlreadyBeenSelected(u8 slot)\n{\n    u32 i;\n\n    for (i = 0; i < NELEMS(gSelectedOrderFromParty); ++i)\n        if (gSelectedOrderFromParty[i] == slot)\n            return TRUE;\n    return FALSE;\n}\n\nstatic void Task_ValidateChosenMonsForBattle(u8 taskId)\n{\n    u8 msgId = CheckBattleEntriesAndGetMessage();\n\n    if (msgId != 0xFF)\n    {\n        PlaySE(SE_FAILURE);\n        DisplayPartyMenuStdMessage(msgId);\n        gTasks[taskId].func = Task_ContinueChoosingMonsForBattle;\n    }\n    else\n    {\n        if (gSelectedOrderFromParty[0] != 0)\n        {\n            PlaySE(SE_SELECT);\n            Task_ClosePartyMenu(taskId);\n        }\n        else\n        {\n            PlaySE(SE_FAILURE);\n            DisplayPartyMenuStdMessage(PARTY_MSG_NO_MON_FOR_BATTLE);\n            gTasks[taskId].func = Task_ContinueChoosingMonsForBattle;\n        }\n    }\n}\n\nstatic void Task_ContinueChoosingMonsForBattle(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON);\n        gTasks[taskId].func = Task_HandleChooseMonInput;\n    }\n}\n\nvoid ChooseMonForTradingBoard(u8 menuType, MainCallback callback)\n{\n    InitPartyMenu(menuType,\n                  PARTY_LAYOUT_SINGLE,\n                  PARTY_ACTION_CHOOSE_MON,\n                  FALSE,\n                  PARTY_MSG_CHOOSE_MON,\n                  Task_HandleChooseMonInput,\n                  callback);\n}\n\nvoid ChooseMonForMoveTutor(void)\n{\n    if (gSpecialVar_0x8005 < TUTOR_MOVE_COUNT)\n    {\n        InitPartyMenu(PARTY_MENU_TYPE_FIELD,\n                      PARTY_LAYOUT_SINGLE,\n                      PARTY_ACTION_MOVE_TUTOR,\n                      FALSE,\n                      PARTY_MSG_TEACH_WHICH_MON,\n                      Task_HandleChooseMonInput,\n                      CB2_ReturnToFieldContinueScriptPlayMapMusic);\n    }\n    else\n    {\n        InitPartyMenu(PARTY_MENU_TYPE_FIELD,\n                      PARTY_LAYOUT_SINGLE,\n                      PARTY_ACTION_MOVE_TUTOR,\n                      FALSE,\n                      PARTY_MSG_NONE,\n                      TryTutorSelectedMon,\n                      CB2_ReturnToFieldContinueScriptPlayMapMusic);\n        gPartyMenu.slotId = gSpecialVar_0x8007;\n    }\n}\n\nvoid ChooseMonForWirelessMinigame(void)\n{\n    InitPartyMenu(PARTY_MENU_TYPE_MINIGAME, PARTY_LAYOUT_SINGLE, PARTY_ACTION_MINIGAME, FALSE, PARTY_MSG_CHOOSE_MON_OR_CANCEL, Task_HandleChooseMonInput, CB2_ReturnToFieldContinueScriptPlayMapMusic);\n}\n\nstatic u8 GetPartyLayoutFromBattleType(void)\n{\n    if (IsDoubleBattle() == FALSE)\n        return PARTY_LAYOUT_SINGLE;\n    if (IsMultiBattle() == TRUE)\n        return PARTY_LAYOUT_MULTI;\n    return PARTY_LAYOUT_DOUBLE;\n}\n\nvoid OpenPartyMenuInTutorialBattle(u8 partyAction)\n{\n    if (!BtlCtrl_OakOldMan_TestState2Flag(FIRST_BATTLE_MSG_FLAG_PARTY_MENU) && (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE))\n    {\n        InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE,\n                      GetPartyLayoutFromBattleType(),\n                      partyAction,\n                      FALSE,\n                      PARTY_MSG_NONE,\n                      Task_FirstBattleEnterParty_WaitFadeIn,\n                      SetCB2ToReshowScreenAfterMenu);\n        BtlCtrl_OakOldMan_SetState2Flag(FIRST_BATTLE_MSG_FLAG_PARTY_MENU);\n    }\n    else\n    {\n        InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE,\n                      GetPartyLayoutFromBattleType(),\n                      partyAction,\n                      FALSE,\n                      PARTY_MSG_CHOOSE_MON,\n                      Task_HandleChooseMonInput,\n                      SetCB2ToReshowScreenAfterMenu);\n    }\n    ReshowBattleScreenDummy();\n    UpdatePartyToBattleOrder();\n}\n\nvoid Pokedude_OpenPartyMenuInBattle(void)\n{\n    InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), PARTY_ACTION_CHOOSE_MON, FALSE, PARTY_MSG_CHOOSE_MON, Task_PartyMenu_Pokedude, SetCB2ToReshowScreenAfterMenu);\n    ReshowBattleScreenDummy();\n    UpdatePartyToBattleOrder();\n}\n\nvoid Pokedude_ChooseMonForInBattleItem(void)\n{\n    InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), PARTY_ACTION_REUSABLE_ITEM, FALSE, PARTY_MSG_USE_ON_WHICH_MON, Task_PartyMenuFromBag_Pokedude, CB2_BagMenuFromBattle);\n    ReshowBattleScreenDummy();\n    UpdatePartyToBattleOrder();\n}\n\nvoid EnterPartyFromItemMenuInBattle(void)\n{\n    if (!BtlCtrl_OakOldMan_TestState2Flag(FIRST_BATTLE_MSG_FLAG_PARTY_MENU) && (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE))\n    {\n        InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE,\n                      GetPartyLayoutFromBattleType(),\n                      PARTY_ACTION_USE_ITEM,\n                      FALSE,\n                      PARTY_MSG_NONE,\n                      Task_FirstBattleEnterParty_WaitFadeIn,\n                      CB2_BagMenuFromBattle);\n        BtlCtrl_OakOldMan_SetState2Flag(FIRST_BATTLE_MSG_FLAG_PARTY_MENU);\n    }\n    else\n    {\n        MainCallback callback;\n\n        if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH)\n            callback = CB2_ReturnToBerryPouchMenu;\n        else\n            callback = CB2_BagMenuFromBattle;\n        InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE,\n                      GetPartyLayoutFromBattleType(),\n                      PARTY_ACTION_USE_ITEM,\n                      FALSE,\n                      PARTY_MSG_USE_ON_WHICH_MON,\n                      Task_HandleChooseMonInput,\n                      callback);\n    }\n    ReshowBattleScreenDummy();\n    UpdatePartyToBattleOrder();\n}\n\nstatic u8 GetPartyMenuActionsTypeInBattle(struct Pokemon *mon)\n{\n    if (GetMonData(&gPlayerParty[1], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(mon, MON_DATA_IS_EGG))\n        return ACTIONS_SUMMARY_ONLY;\n    else if (gPartyMenu.action == PARTY_ACTION_SEND_OUT)\n        return ACTIONS_SEND_OUT;\n    else\n        return ACTIONS_SHIFT;\n}\n\nstatic bool8 TrySwitchInPokemon(void)\n{\n    u8 slot = GetCursorSelectionMonId();\n    u8 newSlot;\n    u32 i;\n\n    // In a multi battle, slots 1, 4, and 5 are the partner's pokemon\n    if (IsMultiBattle() == TRUE && (slot == 1 || slot == 4 || slot == 5))\n    {\n        StringCopy(gStringVar1, GetTrainerPartnerName());\n        StringExpandPlaceholders(gStringVar4, gText_CantSwitchWithAlly);\n        return FALSE;\n    }\n    if (GetMonData(&gPlayerParty[slot], MON_DATA_HP) == 0)\n    {\n        GetMonNickname(&gPlayerParty[slot], gStringVar1);\n        StringExpandPlaceholders(gStringVar4, gText_PkmnHasNoEnergy);\n        return FALSE;\n    }\n    for (i = 0; i < gBattlersCount; ++i)\n    {\n        if (GetBattlerSide(i) == B_SIDE_PLAYER && GetPartyIdFromBattleSlot(slot) == gBattlerPartyIndexes[i])\n        {\n            GetMonNickname(&gPlayerParty[slot], gStringVar1);\n            StringExpandPlaceholders(gStringVar4, gText_PkmnAlreadyInBattle);\n            return FALSE;\n        }\n    }\n    if (GetMonData(&gPlayerParty[slot], MON_DATA_IS_EGG))\n    {\n        StringExpandPlaceholders(gStringVar4, gText_EggCantBattle);\n        return FALSE;\n    }\n    if (GetPartyIdFromBattleSlot(slot) == gBattleStruct->playerPartyIdx)\n    {\n        GetMonNickname(&gPlayerParty[slot], gStringVar1);\n        StringExpandPlaceholders(gStringVar4, gText_PkmnAlreadySelected);\n        return FALSE;\n    }\n    if (gPartyMenu.action == PARTY_ACTION_ABILITY_PREVENTS)\n    {\n        SetMonPreventsSwitchingString();\n        return FALSE;\n    }\n    if (gPartyMenu.action == PARTY_ACTION_CANT_SWITCH)\n    {\n        u8 currBattler = gBattlerInMenuId;\n\n        GetMonNickname(&gPlayerParty[GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[currBattler])], gStringVar1);\n        StringExpandPlaceholders(gStringVar4, gText_PkmnCantSwitchOut);\n        return FALSE;\n    }\n    gSelectedMonPartyId = GetPartyIdFromBattleSlot(slot);\n    gPartyMenuUseExitCallback = TRUE;\n    newSlot = GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[gBattlerInMenuId]);\n    SwitchPartyMonSlots(newSlot, slot);\n    SwapPartyPokemon(&gPlayerParty[newSlot], &gPlayerParty[slot]);\n    return TRUE;\n}\n\nvoid BufferBattlePartyCurrentOrder(void)\n{\n    BufferBattlePartyOrder(gBattlePartyCurrentOrder, GetPlayerFlankId());\n}\n\nstatic void BufferBattlePartyOrder(u8 *partyBattleOrder, u8 flankId)\n{\n    u8 partyIds[PARTY_SIZE];\n    s32 i, j;\n\n    if (IsMultiBattle() == TRUE)\n    {\n        // Party ids are packed in 4 bits at a time\n        // i.e. the party id order below would be 0, 3, 5, 4, 2, 1, and the two parties would be 0,5,4 and 3,2,1\n        if (flankId != 0)\n        {\n            partyBattleOrder[0] = 0 | (3 << 4);\n            partyBattleOrder[1] = 5 | (4 << 4);\n            partyBattleOrder[2] = 2 | (1 << 4);\n        }\n        else\n        {\n            partyBattleOrder[0] = 3 | (0 << 4);\n            partyBattleOrder[1] = 2 | (1 << 4);\n            partyBattleOrder[2] = 5 | (4 << 4);\n        }\n        return;\n    }\n    else if (IsDoubleBattle() == FALSE)\n    {\n        j = 1;\n        partyIds[0] = gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (i != partyIds[0])\n            {\n                partyIds[j] = i;\n                ++j;\n            }\n        }\n    }\n    else\n    {\n        j = 2;\n        partyIds[0] = gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)];\n        partyIds[1] = gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (i != partyIds[0] && i != partyIds[1])\n            {\n                partyIds[j] = i;\n                ++j;\n            }\n        }\n    }\n    for (i = 0; i < (s32)NELEMS(gBattlePartyCurrentOrder); ++i)\n        partyBattleOrder[i] = (partyIds[0 + (i * 2)] << 4) | partyIds[1 + (i * 2)];\n}\n\nvoid BufferBattlePartyCurrentOrderBySide(u8 battlerId, u8 flankId)\n{\n    BufferBattlePartyOrderBySide(gBattleStruct->battlerPartyOrders[battlerId], flankId, battlerId);\n}\n\n// when GetBattlerSide(battlerId) == B_SIDE_PLAYER, this function is identical the one above\nstatic void BufferBattlePartyOrderBySide(u8 *partyBattleOrder, u8 flankId, u8 battlerId)\n{\n    u8 partyIndexes[PARTY_SIZE];\n    s32 i, j;\n    u8 leftBattler;\n    u8 rightBattler;\n\n    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n    {\n        leftBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);\n        rightBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);\n    }\n    else\n    {\n        leftBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        rightBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n    }\n    if (IsMultiBattle() == TRUE)\n    {\n        if (flankId != 0)\n        {\n            partyBattleOrder[0] = 0 | (3 << 4);\n            partyBattleOrder[1] = 5 | (4 << 4);\n            partyBattleOrder[2] = 2 | (1 << 4);\n        }\n        else\n        {\n            partyBattleOrder[0] = 3 | (0 << 4);\n            partyBattleOrder[1] = 2 | (1 << 4);\n            partyBattleOrder[2] = 5 | (4 << 4);\n        }\n        return;\n    }\n    else if (IsDoubleBattle() == FALSE)\n    {\n        j = 1;\n        partyIndexes[0] = gBattlerPartyIndexes[leftBattler];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (i != partyIndexes[0])\n            {\n                partyIndexes[j] = i;\n                ++j;\n            }\n        }\n    }\n    else\n    {\n        j = 2;\n        partyIndexes[0] = gBattlerPartyIndexes[leftBattler];\n        partyIndexes[1] = gBattlerPartyIndexes[rightBattler];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (i != partyIndexes[0] && i != partyIndexes[1])\n            {\n                partyIndexes[j] = i;\n                ++j;\n            }\n        }\n    }\n    for (i = 0; i < 3; ++i)\n        partyBattleOrder[i] = (partyIndexes[0 + (i * 2)] << 4) | partyIndexes[1 + (i * 2)];\n}\n\nvoid SwitchPartyOrderLinkMulti(u8 battlerId, u8 slot, u8 slot2)\n{\n    u8 partyIds[PARTY_SIZE];\n    u8 tempSlot = 0;\n    s32 i, j;\n    u8 *partyBattleOrder;\n    u8 partyIdBuffer;\n\n    if (IsMultiBattle())\n    {\n        partyBattleOrder = gBattleStruct->battlerPartyOrders[battlerId];\n        for (i = j = 0; i < 3; ++j, ++i)\n        {\n            partyIds[j] = partyBattleOrder[i] >> 4;\n            ++j;\n            partyIds[j] = partyBattleOrder[i] & 0xF;\n        }\n        partyIdBuffer = partyIds[slot2];\n        for (i = 0; i < PARTY_SIZE; ++i)\n        {\n            if (partyIds[i] == slot)\n            {\n                tempSlot = partyIds[i];\n                partyIds[i] = partyIdBuffer;\n                break;\n            }\n        }\n        if (i != PARTY_SIZE)\n        {\n            partyIds[slot2] = tempSlot;\n            partyBattleOrder[0] = (partyIds[0] << 4) | partyIds[1];\n            partyBattleOrder[1] = (partyIds[2] << 4) | partyIds[3];\n            partyBattleOrder[2] = (partyIds[4] << 4) | partyIds[5];\n        }\n    }\n}\n\nstatic u8 GetPartyIdFromBattleSlot(u8 slot)\n{\n    u8 modResult = slot & 1;\n    u8 retVal;\n\n    slot /= 2;\n    if (modResult != 0)\n        retVal = gBattlePartyCurrentOrder[slot] & 0xF;\n    else\n        retVal = gBattlePartyCurrentOrder[slot] >> 4;\n    return retVal;\n}\n\nstatic void SetPartyIdAtBattleSlot(u8 slot, u8 setVal)\n{\n    bool32 modResult = slot & 1;\n\n    slot /= 2;\n    if (modResult != 0)\n        gBattlePartyCurrentOrder[slot] = (gBattlePartyCurrentOrder[slot] & 0xF0) | setVal;\n    else\n        gBattlePartyCurrentOrder[slot] = (gBattlePartyCurrentOrder[slot] & 0xF) | (setVal << 4);\n}\n\nvoid SwitchPartyMonSlots(u8 slot, u8 slot2)\n{\n    u8 partyId = GetPartyIdFromBattleSlot(slot);\n\n    SetPartyIdAtBattleSlot(slot, GetPartyIdFromBattleSlot(slot2));\n    SetPartyIdAtBattleSlot(slot2, partyId);\n}\n\nu8 GetPartyIdFromBattlePartyId(u8 battlePartyId)\n{\n    u8 i, j;\n\n    for (j = i = 0; i < (s32)NELEMS(gBattlePartyCurrentOrder); ++j, ++i)\n    {\n        if ((gBattlePartyCurrentOrder[i] >> 4) != battlePartyId)\n        {\n            ++j;\n            if ((gBattlePartyCurrentOrder[i] & 0xF) == battlePartyId)\n                return j;\n        }\n        else\n        {\n            return j;\n        }\n    }\n    return 0;\n}\n\nstatic void UpdatePartyToBattleOrder(void)\n{\n    struct Pokemon *partyBuffer = Alloc(sizeof(gPlayerParty));\n    u32 i;\n\n    memcpy(partyBuffer, gPlayerParty, sizeof(gPlayerParty));\n    for (i = 0; i < PARTY_SIZE; ++i)\n        memcpy(&gPlayerParty[GetPartyIdFromBattlePartyId(i)], &partyBuffer[i], sizeof(struct Pokemon));\n    Free(partyBuffer);\n}\n\nstatic void UpdatePartyToFieldOrder(void)\n{\n    struct Pokemon *partyBuffer = Alloc(sizeof(gPlayerParty));\n    u32 i;\n\n    memcpy(partyBuffer, gPlayerParty, sizeof(gPlayerParty));\n    for (i = 0; i < PARTY_SIZE; ++i)\n        memcpy(&gPlayerParty[GetPartyIdFromBattleSlot(i)], &partyBuffer[i], sizeof(struct Pokemon));\n    Free(partyBuffer);\n}\n\n// not used\nstatic void SwitchAliveMonIntoLeadSlot(void)\n{\n    u32 i;\n    struct Pokemon *mon;\n    u8 partyId;\n\n    for (i = 1; i < PARTY_SIZE; ++i)\n    {\n        mon = &gPlayerParty[GetPartyIdFromBattleSlot(i)];\n        if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE && GetMonData(mon, MON_DATA_HP) != 0)\n        {\n            partyId = GetPartyIdFromBattleSlot(0);\n            SwitchPartyMonSlots(0, i);\n            SwapPartyPokemon(&gPlayerParty[partyId], mon);\n            break;\n        }\n    }\n}\n\nstatic void CB2_SetUpExitToBattleScreen(void)\n{\n    CB2_SetUpReshowBattleScreenAfterMenu();\n    SetMainCallback2(SetCB2ToReshowScreenAfterMenu);\n}\n\nvoid ShowPartyMenuToShowcaseMultiBattleParty(void)\n{\n    InitPartyMenu(PARTY_MENU_TYPE_MULTI_SHOWCASE, PARTY_LAYOUT_MULTI_SHOWCASE, PARTY_ACTION_CHOOSE_MON, FALSE, PARTY_MSG_NONE, Task_InitMultiPartnerPartySlideIn, gMain.savedCallback);\n}\n\n#define tXPos  data[0]\n\nstatic void Task_InitMultiPartnerPartySlideIn(u8 taskId)\n{\n    // The first slide step also sets the sprites offscreen\n    gTasks[taskId].tXPos = 256;\n    SlideMultiPartyMenuBoxSpritesOneStep(taskId);\n    ChangeBgX(2, 0x10000, 0);\n    gTasks[taskId].func = Task_MultiPartnerPartySlideIn;\n}\n\nstatic void Task_MultiPartnerPartySlideIn(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u32 i;\n\n    if (!gPaletteFade.active)\n    {\n        tXPos -= 8;\n        SlideMultiPartyMenuBoxSpritesOneStep(taskId);\n        if (tXPos == 0)\n        {\n            for (i = 3; i < PARTY_SIZE; ++i)\n            {\n                if (gMultiPartnerParty[i - MULTI_PARTY_SIZE].species != SPECIES_NONE)\n                    AnimateSelectedPartyIcon(sPartyMenuBoxes[i].monSpriteId, 0);\n            }\n            PlaySE(SE_M_HARDEN); // The Harden SE plays once the partners party mons have slid on screen\n            gTasks[taskId].func = Task_WaitAfterMultiPartnerPartySlideIn;\n        }\n    }\n}\n\nstatic void Task_WaitAfterMultiPartnerPartySlideIn(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    // data[0] used as a timer afterwards rather than the x pos\n    if (++data[0] == 256)\n        Task_ClosePartyMenu(taskId);\n}\n\nstatic void MoveMultiPartyMenuBoxSprite(u8 spriteId, s16 x)\n{\n    if (x >= 0)\n        gSprites[spriteId].x2 = x;\n}\n\nstatic void SlideMultiPartyMenuBoxSpritesOneStep(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u32 i;\n\n    for (i = 3; i < PARTY_SIZE; ++i)\n    {\n        if (gMultiPartnerParty[i - MULTI_PARTY_SIZE].species != SPECIES_NONE)\n        {\n            MoveMultiPartyMenuBoxSprite(sPartyMenuBoxes[i].monSpriteId, tXPos - 8);\n            MoveMultiPartyMenuBoxSprite(sPartyMenuBoxes[i].itemSpriteId, tXPos - 8);\n            MoveMultiPartyMenuBoxSprite(sPartyMenuBoxes[i].pokeballSpriteId, tXPos - 8);\n            MoveMultiPartyMenuBoxSprite(sPartyMenuBoxes[i].statusSpriteId, tXPos - 8);\n        }\n    }\n    ChangeBgX(2, 0x800, 1);\n}\n\n#undef tXpos\n\nvoid ChooseMonForDaycare(void)\n{\n    gFieldCallback2 = CB2_FadeFromPartyMenu;\n    InitPartyMenu(PARTY_MENU_TYPE_DAYCARE, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, FALSE, PARTY_MSG_CHOOSE_MON_2, Task_HandleChooseMonInput, CB2_ReturnToField);\n}\n\nvoid ChoosePartyMonByMenuType(u8 menuType)\n{\n    gFieldCallback2 = CB2_FadeFromPartyMenu;\n    InitPartyMenu(menuType, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_AND_CLOSE, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, CB2_ReturnToField);\n}\n\nstatic bool8 CB2_FadeFromPartyMenu(void)\n{\n    FadeInFromBlack();\n    CreateTask(Task_PartyMenuWaitForFade, 10);\n    return TRUE;\n}\n\nstatic void Task_PartyMenuWaitForFade(u8 taskId)\n{\n    if (IsWeatherNotFadingIn())\n    {\n        DestroyTask(taskId);\n        UnlockPlayerFieldControls();\n        ScriptContext_Enable();\n    }\n}\n\nvoid ItemUseCB_ReduceEV(u8 taskId, TaskFunc task)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    u16 item = gSpecialVar_ItemId;\n    u8 effectType = GetItemEffectType(item);\n    u16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP);\n    u16 ev = ItemEffectToMonEv(mon, effectType);\n    u16 hp = GetMonData(mon, MON_DATA_HP);\n    bool8 cannotUseEffect = ExecuteTableBasedItemEffect_(gPartyMenu.slotId, item, 0);\n    u16 newFriendship = GetMonData(mon, MON_DATA_FRIENDSHIP);\n    u16 newEv = ItemEffectToMonEv(mon, effectType);\n\n    if (cannotUseEffect || (friendship == newFriendship && ev == newEv))\n    {\n        gPartyMenuUseExitCallback = FALSE;\n        PlaySE(SE_SELECT);\n        DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE);\n        ScheduleBgCopyTilemapToVram(2);\n        gTasks[taskId].func = task;\n    }\n    else //can use effect, restore old ev, friendship, hp\n    {\n        SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);\n        switch (effectType)\n        {\n        case ITEM_EFFECT_HP_EV:\n            SetMonData(mon, MON_DATA_HP_EV, &ev);\n            //SetMonData(mon, MON_DATA_HP, &hp);\n            break;\n        case ITEM_EFFECT_ATK_EV:\n            SetMonData(mon, MON_DATA_ATK_EV, &ev);\n            break;\n        case ITEM_EFFECT_DEF_EV:\n            SetMonData(mon, MON_DATA_DEF_EV, &ev);\n            break;\n        case ITEM_EFFECT_SPEED_EV:\n            SetMonData(mon, MON_DATA_SPEED_EV, &ev);\n            break;\n        case ITEM_EFFECT_SPATK_EV:\n            SetMonData(mon, MON_DATA_SPATK_EV, &ev);\n            break;\n        case ITEM_EFFECT_SPDEF_EV:\n            SetMonData(mon, MON_DATA_SPDEF_EV, &ev);\n            break;\n        }\n\n        ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, item, 0xFFFF);\n        Task_DoUseItemAnim(taskId);\n        gItemUseCB = ItemUseCB_ReduceEV2;\n    }\n}\n\nvoid ItemUseCB_ReduceEV2(u8 taskId, TaskFunc task)\n{\n    struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];\n    u16 item = gSpecialVar_ItemId;\n    u8 effectType = GetItemEffectType(item);\n    u16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP);\n    u16 ev = ItemEffectToMonEv(mon, effectType);\n    bool8 cannotUseEffect = ExecuteTableBasedItemEffect_(gPartyMenu.slotId, item, 0);\n    u16 newFriendship = GetMonData(mon, MON_DATA_FRIENDSHIP);\n    u16 newEv = ItemEffectToMonEv(mon, effectType);\n\n    if (cannotUseEffect || (friendship == newFriendship && ev == newEv))\n    {\n        gPartyMenuUseExitCallback = FALSE;\n        PlaySE(SE_SELECT);\n        DisplayPartyMenuMessage(gText_WontHaveEffect, TRUE);\n        ScheduleBgCopyTilemapToVram(2);\n        gTasks[taskId].func = task;\n    }\n    else\n    {\n        gPartyMenuUseExitCallback = TRUE;\n        PlaySE(SE_USE_ITEM);\n        RemoveBagItem(item, 1);\n        GetMonNickname(mon, gStringVar1);\n        ItemEffectToStatString(effectType, gStringVar2);\n        if (friendship != newFriendship)\n        {\n            if (ev != newEv)\n                StringExpandPlaceholders(gStringVar4, gText_PkmnFriendlyBaseVar2Fell);\n            else\n                StringExpandPlaceholders(gStringVar4, gText_PkmnFriendlyBaseVar2CantFall);\n        }\n        else\n        {\n            StringExpandPlaceholders(gStringVar4, gText_PkmnAdoresBaseVar2Fell);\n        }\n        DisplayPartyMenuMessage(gStringVar4, TRUE);\n        ScheduleBgCopyTilemapToVram(2);\n        gTasks[taskId].func = task;\n    }\n}\n\nstatic u16 ItemEffectToMonEv(struct Pokemon *mon, u8 effectType)\n{\n    switch (effectType)\n    {\n    case ITEM_EFFECT_HP_EV:\n        if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_SHEDINJA)\n            return GetMonData(mon, MON_DATA_HP_EV);\n        break;\n    case ITEM_EFFECT_ATK_EV:\n        return GetMonData(mon, MON_DATA_ATK_EV);\n    case ITEM_EFFECT_DEF_EV:\n        return GetMonData(mon, MON_DATA_DEF_EV);\n    case ITEM_EFFECT_SPEED_EV:\n        return GetMonData(mon, MON_DATA_SPEED_EV);\n    case ITEM_EFFECT_SPATK_EV:\n        return GetMonData(mon, MON_DATA_SPATK_EV);\n    case ITEM_EFFECT_SPDEF_EV:\n        return GetMonData(mon, MON_DATA_SPDEF_EV);\n    }\n    return 0;\n}\n\nstatic void ItemEffectToStatString(u8 effectType, u8 *dest)\n{\n    switch (effectType)\n    {\n    case ITEM_EFFECT_HP_EV:\n        StringCopy(dest, gText_ItemEffect_HP);\n        break;\n    case ITEM_EFFECT_ATK_EV:\n        StringCopy(dest, gText_ItemEffect_Attack);\n        break;\n    case ITEM_EFFECT_DEF_EV:\n        StringCopy(dest, gText_ItemEffect_Defense);\n        break;\n    case ITEM_EFFECT_SPEED_EV:\n        StringCopy(dest, gText_ItemEffect_Speed);\n        break;\n    case ITEM_EFFECT_SPATK_EV:\n        StringCopy(dest, gText_ItemEffect_SpAtk);\n        break;\n    case ITEM_EFFECT_SPDEF_EV:\n        StringCopy(dest, gText_ItemEffect_SpDef);\n        break;\n    }\n}\n\n// dive\nstatic void FieldCallback_Dive(void)\n{\n    gFieldEffectArguments[0] = GetCursorSelectionMonId();\n    FieldEffectStart(FLDEFF_USE_DIVE);\n}\n\nstatic bool8 SetUpFieldMove_Dive(void)\n{\n    gFieldEffectArguments[1] = TrySetDiveWarp();\n    if (gFieldEffectArguments[1] != 0)\n    {\n        gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;\n        gPostMenuFieldCallback = FieldCallback_Dive;\n        return TRUE;\n    }\n    return FALSE;\n}\n\n"
  },
  {
    "path": "src/party_menu_specials.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"script.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"field_fadetransition.h\"\n#include \"pokemon_summary_screen.h\"\n#include \"event_data.h\"\n#include \"constants/moves.h\"\n\nstatic void Task_ChoosePartyMon(u8 taskId);\n\nvoid ChoosePartyMon(void)\n{\n    u8 taskId;\n\n    LockPlayerFieldControls();\n    taskId = CreateTask(Task_ChoosePartyMon, 10);\n    gTasks[taskId].data[0] = PARTY_MENU_TYPE_CHOOSE_SINGLE_MON;\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n}\n\nvoid SelectMoveTutorMon(void)\n{\n    u8 taskId;\n\n    LockPlayerFieldControls();\n    taskId = CreateTask(Task_ChoosePartyMon, 10);\n    gTasks[taskId].data[0] = PARTY_MENU_TYPE_MOVE_RELEARNER;\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);\n}\n\nstatic void Task_ChoosePartyMon(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        gPaletteFade.bufferTransferDisabled = TRUE;\n        ChoosePartyMonByMenuType((u8)gTasks[taskId].data[0]);\n        DestroyTask(taskId);\n    }\n}\n\nvoid SelectMoveDeleterMove(void)\n{\n    ShowSelectMovePokemonSummaryScreen(gPlayerParty, gSpecialVar_0x8004, gPlayerPartyCount - 1, CB2_ReturnToField, 0);\n    SetPokemonSummaryScreenMode(PSS_MODE_FORGET_MOVE);\n    gFieldCallback = FieldCB_ContinueScriptHandleMusic;\n}\n\nvoid GetNumMovesSelectedMonHas(void)\n{\n    u32 i;\n\n    gSpecialVar_Result = 0;\n    for (i = 0; i < MAX_MON_MOVES; ++i)\n        if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_MOVE1 + i) != MOVE_NONE)\n            ++gSpecialVar_Result;\n}\n\nvoid BufferMoveDeleterNicknameAndMove(void)\n{\n    struct Pokemon *mon = &gPlayerParty[gSpecialVar_0x8004];\n    u16 move = GetMonData(mon, MON_DATA_MOVE1 + gSpecialVar_0x8005);\n\n    GetMonNickname(mon, gStringVar1);\n    StringCopy(gStringVar2, gMoveNames[move]);\n}\n\nstatic void ShiftMoveSlot(struct Pokemon *mon, u8 slotTo, u8 slotFrom)\n{\n    u16 move1 = GetMonData(mon, MON_DATA_MOVE1 + slotTo);\n    u16 move0 = GetMonData(mon, MON_DATA_MOVE1 + slotFrom);\n    u8 pp1 = GetMonData(mon, MON_DATA_PP1 + slotTo);\n    u8 pp0 = GetMonData(mon, MON_DATA_PP1 + slotFrom);\n    u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);\n    u8 ppBonusMask1 = gPPUpGetMask[slotTo];\n    u8 ppBonusMove1 = (ppBonuses & ppBonusMask1) >> (slotTo * 2);\n    u8 ppBonusMask2 = gPPUpGetMask[slotFrom];\n    u8 ppBonusMove2 = (ppBonuses & ppBonusMask2) >> (slotFrom * 2);\n\n    ppBonuses &= ~ppBonusMask1;\n    ppBonuses &= ~ppBonusMask2;\n    ppBonuses |= (ppBonusMove1 << (slotFrom * 2)) + (ppBonusMove2 << (slotTo * 2));\n    SetMonData(mon, MON_DATA_MOVE1 + slotTo, &move0);\n    SetMonData(mon, MON_DATA_MOVE1 + slotFrom, &move1);\n    SetMonData(mon, MON_DATA_PP1 + slotTo, &pp0);\n    SetMonData(mon, MON_DATA_PP1 + slotFrom, &pp1);\n    SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);\n}\n\nvoid MoveDeleterForgetMove(void)\n{\n    u32 i;\n\n    SetMonMoveSlot(&gPlayerParty[gSpecialVar_0x8004], MOVE_NONE, gSpecialVar_0x8005);\n    RemoveMonPPBonus(&gPlayerParty[gSpecialVar_0x8004], gSpecialVar_0x8005);\n    for (i = gSpecialVar_0x8005; i < MAX_MON_MOVES - 1; ++i)\n        ShiftMoveSlot(&gPlayerParty[gSpecialVar_0x8004], i, i + 1);\n}\n\nvoid IsSelectedMonEgg(void)\n{\n    if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_IS_EGG))\n        gSpecialVar_Result = TRUE;\n    else\n        gSpecialVar_Result = FALSE;\n}\n"
  },
  {
    "path": "src/pc_screen_effect.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n\n/*\n * Animates the screen as though it was a CRT monitor turning on or off.\n */\n\n#define tState data[0]\n#define tXSpeed data[1]\n#define tYSpeed data[2]\n#define tWin0Left data[3]\n#define tWin0Right data[4]\n#define tWin0Top data[5]\n#define tWin0Bottom data[6]\n#define tBldCntBak data[7]\n#define tBldYBak data[8]\n\nstatic void BeginPCScreenEffect(TaskFunc func, u16 a2, u16 a3, u8 priority);\nstatic void Task_PCScreenEffect_TurnOn(u8 taskId);\nstatic void Task_PCScreenEffect_TurnOff(u8 taskId);\n\nvoid BeginPCScreenEffect_TurnOn(u16 xspeed, u16 yspeed, u8 priority)\n{\n    BeginPCScreenEffect(Task_PCScreenEffect_TurnOn, xspeed, yspeed, priority);\n}\n\nvoid BeginPCScreenEffect_TurnOff(u16 xspeed, u16 yspeed, u8 priority)\n{\n    BeginPCScreenEffect(Task_PCScreenEffect_TurnOff, xspeed, yspeed, priority);\n}\n\nbool8 IsPCScreenEffectRunning_TurnOn(void)\n{\n    return FuncIsActiveTask(Task_PCScreenEffect_TurnOn);\n}\n\nbool8 IsPCScreenEffectRunning_TurnOff(void)\n{\n    return FuncIsActiveTask(Task_PCScreenEffect_TurnOff);\n}\n\nstatic void BeginPCScreenEffect(TaskFunc func, u16 speed, u16 unused, u8 priority)\n{\n    u8 taskId = CreateTask(func, priority);\n\n    gTasks[taskId].tState = 0;\n    gTasks[taskId].tXSpeed = speed == 0 ? 16 : speed;\n    gTasks[taskId].tYSpeed = speed == 0 ? 20 : speed; // Bug? should be the unused param, not speed\n    gTasks[taskId].func(taskId);\n}\n\nstatic void Task_PCScreenEffect_TurnOn(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->tState)\n    {\n    case 0:\n        task->tWin0Left = 120;\n        task->tWin0Right = 120;\n        task->tWin0Top = 80;\n        task->tWin0Bottom = 81;\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWin0Left, task->tWin0Right));\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWin0Top, task->tWin0Bottom));\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);\n        SetGpuReg(REG_OFFSET_WINOUT, 0);\n        break;\n    case 1:\n        task->tBldCntBak = GetGpuReg(REG_OFFSET_BLDCNT);\n        task->tBldYBak = GetGpuReg(REG_OFFSET_BLDY);\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_LIGHTEN);\n        SetGpuReg(REG_OFFSET_BLDY, 16);\n        break;\n    case 2:\n        task->tWin0Left -= task->tXSpeed;\n        task->tWin0Right += task->tXSpeed;\n        if (task->tWin0Left <= 0 || task->tWin0Right >= DISPLAY_WIDTH)\n        {\n            task->tWin0Left = 0;\n            task->tWin0Right = DISPLAY_WIDTH;\n            SetGpuReg(REG_OFFSET_BLDY, 0);\n            SetGpuReg(REG_OFFSET_BLDCNT, task->tBldCntBak);\n            BlendPalettes(PALETTES_ALL, 0, RGB_BLACK);\n            gPlttBufferFaded[BG_PLTT_ID(0)] = 0;\n        }\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWin0Left, task->tWin0Right));\n        if (task->tWin0Left)\n            return;\n        break;\n    case 3:\n        task->tWin0Top -= task->tYSpeed;\n        task->tWin0Bottom += task->tYSpeed;\n        if (task->tWin0Top <= 0 || task->tWin0Bottom >= DISPLAY_HEIGHT)\n        {\n            task->tWin0Top = 0;\n            task->tWin0Bottom = DISPLAY_HEIGHT;\n            ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        }\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWin0Top, task->tWin0Bottom));\n        if (task->tWin0Top)\n            return;\n        break;\n    default:\n        SetGpuReg(REG_OFFSET_BLDCNT, task->tBldCntBak);\n        DestroyTask(taskId);\n        return;\n    }\n    ++task->tState;\n}\n\nstatic void Task_PCScreenEffect_TurnOff(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->tState)\n    {\n    case 0:\n        gPlttBufferFaded[BG_PLTT_ID(0)] = 0;\n        break;\n    case 1:\n        task->tWin0Left = 0;\n        task->tWin0Right = DISPLAY_WIDTH;\n        task->tWin0Top = 0;\n        task->tWin0Bottom = DISPLAY_HEIGHT;\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWin0Left, task->tWin0Right));\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWin0Top, task->tWin0Bottom));\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);\n        SetGpuReg(REG_OFFSET_WINOUT, 0);\n        break;\n    case 2:\n        task->tWin0Top += task->tYSpeed;\n        task->tWin0Bottom -= task->tYSpeed;\n        if (task->tWin0Top >= 80 || task->tWin0Bottom <= 81)\n        {\n            task->tWin0Top = 80;\n            task->tWin0Bottom = 81;\n            SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_LIGHTEN);\n            SetGpuReg(REG_OFFSET_BLDY, 16);\n        }\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWin0Top, task->tWin0Bottom));\n        if (task->tWin0Top != 80)\n            return;\n        break;\n    case 3:\n        task->tWin0Left += task->tXSpeed;\n        task->tWin0Right -= task->tXSpeed;\n        if (task->tWin0Left >= 120 || task->tWin0Right <= 120)\n        {\n            task->tWin0Left = 120;\n            task->tWin0Right = 120;\n            BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK);\n            gPlttBufferFaded[BG_PLTT_ID(0)] = 0;\n        }\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWin0Left, task->tWin0Right));\n        if (task->tWin0Left != 120)\n            return;\n        break;\n    default:\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        DestroyTask(taskId);\n        return;\n    }\n    ++task->tState;\n}\n\n#undef tBldYBak\n#undef tBldCntBak\n#undef tWin0Bottom\n#undef tWin0Top\n#undef tWin0Right\n#undef tWin0Left\n#undef tYSpeed\n#undef tXSpeed\n#undef tState\n"
  },
  {
    "path": "src/play_time.c",
    "content": "#include \"play_time.h\"\n\nstatic u8 sPlayTimeCounterState;\n\nenum\n{\n    STOPPED,\n    RUNNING,\n    MAXED_OUT,\n};\n\nvoid PlayTimeCounter_Reset(void)\n{\n    sPlayTimeCounterState = STOPPED;\n    gSaveBlock2Ptr->playTimeHours = 0;\n    gSaveBlock2Ptr->playTimeMinutes = 0;\n    gSaveBlock2Ptr->playTimeSeconds = 0;\n    gSaveBlock2Ptr->playTimeVBlanks = 0;\n}\n\nvoid PlayTimeCounter_Start(void)\n{\n    sPlayTimeCounterState = RUNNING;\n    if (gSaveBlock2Ptr->playTimeHours > 999)\n        PlayTimeCounter_SetToMax();\n}\n\nvoid PlayTimeCounter_Stop(void)\n{\n    sPlayTimeCounterState = STOPPED;\n}\n\nvoid PlayTimeCounter_Update(void)\n{\n    if (sPlayTimeCounterState == RUNNING)\n    {\n        gSaveBlock2Ptr->playTimeVBlanks++;\n        if (gSaveBlock2Ptr->playTimeVBlanks > 59)\n        {\n            gSaveBlock2Ptr->playTimeVBlanks = 0;\n            gSaveBlock2Ptr->playTimeSeconds++;\n            if (gSaveBlock2Ptr->playTimeSeconds > 59)\n            {\n                gSaveBlock2Ptr->playTimeSeconds = 0;\n                gSaveBlock2Ptr->playTimeMinutes++;\n                if (gSaveBlock2Ptr->playTimeMinutes > 59)\n                {\n                    gSaveBlock2Ptr->playTimeMinutes = 0;\n                    gSaveBlock2Ptr->playTimeHours++;\n                    if (gSaveBlock2Ptr->playTimeHours > 999)\n                        PlayTimeCounter_SetToMax();\n                }\n            }\n        }\n    }\n}\n\nvoid PlayTimeCounter_SetToMax(void)\n{\n    sPlayTimeCounterState = MAXED_OUT;\n    gSaveBlock2Ptr->playTimeHours = 999;\n    gSaveBlock2Ptr->playTimeMinutes = 59;\n    gSaveBlock2Ptr->playTimeSeconds = 59;\n    gSaveBlock2Ptr->playTimeVBlanks = 59;\n}\n"
  },
  {
    "path": "src/player_pc.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"item.h\"\n#include \"task.h\"\n#include \"menu_indicators.h\"\n#include \"new_menu_helpers.h\"\n#include \"strings.h\"\n#include \"menu.h\"\n#include \"mail.h\"\n#include \"mail_data.h\"\n#include \"help_system.h\"\n#include \"overworld.h\"\n#include \"script.h\"\n#include \"mailbox_pc.h\"\n#include \"player_pc.h\"\n#include \"field_weather.h\"\n#include \"event_scripts.h\"\n#include \"field_fadetransition.h\"\n#include \"item_menu.h\"\n#include \"item_pc.h\"\n#include \"party_menu.h\"\n#include \"constants/items.h\"\n#include \"constants/songs.h\"\n#include \"constants/field_weather.h\"\n\n#define PC_ITEM_ID  0\n#define PC_QUANTITY 1\n#define NEW_GAME_PC_ITEMS(i, type) (((u16 *)gNewGamePCItems + type)[i * 2])\n\n#define tCount          data[2]\n#define tPageItems      data[4]\n#define tItemPcParam    data[6]\n#define tWindowId       data[10]\n#define tListMenuTaskId data[11]\n\nstatic EWRAM_DATA const u8 *sItemOrder = NULL;\nstatic EWRAM_DATA u8 sTopMenuItemCount = 0;\nEWRAM_DATA struct PlayerPCItemPageStruct gPlayerPcMenuManager = {};\n\n#define SELECTED_MAIL (gSaveBlock1Ptr->mail[PC_MAIL_NUM(gPlayerPcMenuManager.cursorPos) + gPlayerPcMenuManager.itemsAbove])\n\nstatic void Task_DrawPlayerPcTopMenu(u8 taskId);\nstatic void Task_TopMenuHandleInput(u8 taskId);\nstatic void Task_PlayerPcItemStorage(u8 taskId);\nstatic void Task_PlayerPcMailbox(u8 taskId);\nstatic void Task_PlayerPcTurnOff(u8 taskId);\nstatic void Task_CreateItemStorageSubmenu(u8 taskId, u8 cursorPos);\nstatic void PrintStringOnWindow0WithDialogueFrame(const u8 *str);\nstatic void Task_TopMenu_ItemStorageSubmenu_HandleInput(u8 taskId);\nstatic void Task_PlayerPcDepositItem(u8 taskId);\nstatic void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId);\nstatic void CB2_ReturnFromDepositMenu(void);\nstatic void Task_PlayerPcWithdrawItem(u8 taskId);\nstatic void CB2_ReturnFromWithdrawMenu(void);\nstatic void Task_WithdrawItemBeginFade(u8 taskId);\nstatic void Task_PlayerPcCancel(u8 taskId);\nstatic void Task_SetPageItemVars(u8 taskId);\nstatic u8 CountPCMail(void);\nstatic void PCMailCompaction(void);\nstatic void Task_DrawMailboxPcMenu(u8 taskId);\nstatic void Task_MailboxPcHandleInput(u8 taskId);\nstatic void Task_PrintWhatToDoWithSelectedMail(u8 taskId);\nstatic void Task_DestroyMailboxPcViewAndCancel(u8 taskId);\nstatic void Task_DrawMailSubmenu(u8 taskId);\nstatic void Task_MailSubmenuHandleInput(u8 taskId);\nstatic void Task_PlayerPcReadMail(u8 taskId);\nstatic void Task_WaitFadeAndReadSelectedMail(u8 taskId);\nstatic void CB2_SetCbToReturnToMailbox(void);\nstatic void Task_PlayerPcMoveMailToBag(u8 taskId);\nstatic void Task_DrawYesNoMenuToConfirmMoveToBag(u8 taskId);\nstatic void Task_MoveToBagYesNoMenuHandleInput(u8 taskId);\nstatic void Task_TryPutMailInBag_DestroyMsgIfSuccessful(u8 taskId);\nstatic void Task_DeclinedMoveMailToBag(u8 taskId);\nstatic void Task_PlayerPcGiveMailToMon(u8 taskId);\nstatic void Task_WaitFadeAndGoToPartyMenu(u8 taskId);\nstatic void Task_Error_NoPokemon(u8 taskId);\nstatic void Task_PlayerPcExitMailSubmenu(u8 taskId);\n\nstatic const u8 *const sItemStorageActionDescriptionPtrs[] = {\n    gText_TakeOutItemsFromThePC,\n    gText_StoreItemsInThePC,\n    gText_GoBackToThePreviousMenu\n};\n\nstatic const struct MenuAction sMenuActions_TopMenu[] = {\n    {gText_ItemStorage, Task_PlayerPcItemStorage},\n    {gText_Mailbox, Task_PlayerPcMailbox},\n    {gText_TurnOff, Task_PlayerPcTurnOff}\n};\n\nstatic const u8 sItemOrder_BedroomPC[] = { 0, 1, 2 };\nstatic const u8 sItemOrder_PlayerPC[] = { 0, 1, 2 };\n\nstatic const struct MenuAction sMenuActions_ItemPc[] = {\n    {gText_WithdrawItem2, Task_PlayerPcWithdrawItem},\n    {gText_DepositItem2, Task_PlayerPcDepositItem},\n    {gFameCheckerText_Cancel, Task_PlayerPcCancel}\n};\n\nstatic const struct ItemSlot gNewGamePCItems[] = {\n    { ITEM_POTION, 1 },\n    { ITEM_NONE,   0 }\n};\n\nstatic const struct MenuAction sMenuActions_MailSubmenu[] = {\n    {gOtherText_Read, Task_PlayerPcReadMail},\n    {gOtherText_MoveToBag, Task_PlayerPcMoveMailToBag},\n    {gOtherText_Give2, Task_PlayerPcGiveMailToMon},\n    {gOtherText_Exit, Task_PlayerPcExitMailSubmenu}\n};\n\nstatic const struct WindowTemplate sWindowTemplate_TopMenu_3Items = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 1,\n    .width = 13,\n    .height = 6,\n    .paletteNum = 15,\n    .baseBlock = 0x008\n};\n\nstatic const struct WindowTemplate sWindowTemplate_TopMenu_4Items = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 1,\n    .width = 13,\n    .height = 8,\n    .paletteNum = 15,\n    .baseBlock = 0x008\n};\n\nstatic const struct WindowTemplate sWindowTemplate_ItemStorageSubmenu = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 1,\n    .width = 14,\n    .height = 6,\n    .paletteNum = 15,\n    .baseBlock = 0x008\n};\n\nvoid NewGameInitPCItems(void)\n{\n    u32 i;\n\n    for (i = 0, ClearPCItemSlots(); NEW_GAME_PC_ITEMS(i, PC_ITEM_ID) && NEW_GAME_PC_ITEMS(i, PC_QUANTITY) &&\n                                    AddPCItem(NEW_GAME_PC_ITEMS(i, PC_ITEM_ID), NEW_GAME_PC_ITEMS(i, PC_QUANTITY)) == TRUE; i++)\n        ;\n}\n\nvoid BedroomPC(void)\n{\n    u8 taskId;\n\n    gPlayerPcMenuManager.notInRoom = FALSE;\n    BackupHelpContext();\n    sItemOrder = sItemOrder_BedroomPC;\n    sTopMenuItemCount = 3;\n    taskId = CreateTask(TaskDummy, 0);\n    DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu);\n}\n\nvoid PlayerPC(void)\n{\n    u8 taskId;\n\n    gPlayerPcMenuManager.notInRoom = TRUE;\n    BackupHelpContext();\n    sItemOrder = sItemOrder_PlayerPC;\n    sTopMenuItemCount = 3;\n    taskId = CreateTask(TaskDummy, 0);\n    DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu);\n}\n\nstatic void Task_DrawPlayerPcTopMenu(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (sTopMenuItemCount == 3)\n        tWindowId = AddWindow(&sWindowTemplate_TopMenu_3Items);\n    else\n        tWindowId = AddWindow(&sWindowTemplate_TopMenu_4Items);\n    SetStdWindowBorderStyle(tWindowId, 0);\n    AddItemMenuActionTextPrinters(tWindowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING), 16, sTopMenuItemCount, sMenuActions_TopMenu, sItemOrder);\n    Menu_InitCursor(tWindowId, FONT_NORMAL, 0, 2, 16, sTopMenuItemCount, 0);\n    ScheduleBgCopyTilemapToVram(0);\n    gTasks[taskId].func = Task_TopMenuHandleInput;\n}\n\nstatic void Task_TopMenuHandleInput(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    s8 input = Menu_ProcessInputNoWrapAround();\n    switch (input)\n    {\n    case -2:\n        break;\n    case -1:\n        PlaySE(SE_SELECT);\n        ClearStdWindowAndFrameToTransparent(tWindowId, FALSE);\n        ClearWindowTilemap(tWindowId);\n        RemoveWindow(tWindowId);\n        ScheduleBgCopyTilemapToVram(0);\n        gTasks[taskId].func = Task_PlayerPcTurnOff;\n        break;\n    default:\n        ClearStdWindowAndFrameToTransparent(tWindowId, FALSE);\n        ClearWindowTilemap(tWindowId);\n        RemoveWindow(tWindowId);\n        ScheduleBgCopyTilemapToVram(0);\n        gTasks[taskId].func = sMenuActions_TopMenu[sItemOrder[input]].func.void_u8;\n        break;\n    }\n}\n\nstatic void Task_ReturnToTopMenu(u8 taskId)\n{\n    RestoreHelpContext();\n    DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu);\n}\n\nstatic void Task_PlayerPcItemStorage(u8 taskId)\n{\n    Task_CreateItemStorageSubmenu(taskId, FALSE);\n    gTasks[taskId].func = Task_TopMenu_ItemStorageSubmenu_HandleInput;\n}\n\nstatic void Task_PlayerPcMailbox(u8 taskId)\n{\n    gPlayerPcMenuManager.count = CountPCMail();\n    if (gPlayerPcMenuManager.count == 0)\n    {\n        DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_TheresNoMailHere, Task_ReturnToTopMenu);\n    }\n    else\n    {\n        gPlayerPcMenuManager.itemsAbove = 0;\n        gPlayerPcMenuManager.cursorPos = 0;\n        PCMailCompaction();\n        Task_SetPageItemVars(taskId);\n        if (gPlayerPcMenuManager.notInRoom == FALSE)\n            SetHelpContext(HELPCONTEXT_BEDROOM_PC_MAILBOX);\n        else\n            SetHelpContext(HELPCONTEXT_PLAYERS_PC_MAILBOX);\n        if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE)\n        {\n            ClearDialogWindowAndFrame(0, FALSE);\n            Task_DrawMailboxPcMenu(taskId);\n            gTasks[taskId].func = Task_MailboxPcHandleInput;\n        }\n        else\n        {\n            DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_TheresNoMailHere, Task_ReturnToTopMenu);\n        }\n    }\n}\n\nstatic void Task_PlayerPcTurnOff(u8 taskId)\n{\n    if (gPlayerPcMenuManager.notInRoom == FALSE)\n        ScriptContext_SetupScript(EventScript_PalletTown_PlayersHouse_2F_ShutDownPC);\n    else\n        ScriptContext_Enable();\n    DestroyTask(taskId);\n}\n\nstatic void Task_CreateItemStorageSubmenu(u8 taskId, u8 cursorPos)\n{\n    s16 *data = gTasks[taskId].data;\n    if (gPlayerPcMenuManager.notInRoom == FALSE)\n        SetHelpContext(HELPCONTEXT_BEDROOM_PC_ITEMS);\n    else\n        SetHelpContext(HELPCONTEXT_PLAYERS_PC_ITEMS);\n    tWindowId = AddWindow(&sWindowTemplate_ItemStorageSubmenu);\n    SetStdWindowBorderStyle(tWindowId, FALSE);\n    PrintTextArray(tWindowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, 16, 3, sMenuActions_ItemPc);\n    Menu_InitCursor(tWindowId, FONT_NORMAL, 0, 2, 16, 3, cursorPos);\n    ScheduleBgCopyTilemapToVram(0);\n    PrintStringOnWindow0WithDialogueFrame(sItemStorageActionDescriptionPtrs[cursorPos]);\n}\n\nstatic void PrintStringOnWindow0WithDialogueFrame(const u8 *str)\n{\n    DrawDialogueFrame(0, FALSE);\n    AddTextPrinterParameterized(0, FONT_NORMAL, str, 0, 1, 0, NULL);\n}\n\nstatic void Task_TopMenu_ItemStorageSubmenu_HandleInput(u8 taskId)\n{\n    if (JOY_REPT(DPAD_UP))\n    {\n        if (Menu_GetCursorPos() != 0)\n        {\n            PlaySE(SE_SELECT);\n            Menu_MoveCursor(-1);\n            PrintStringOnWindow0WithDialogueFrame(sItemStorageActionDescriptionPtrs[Menu_GetCursorPos()]);\n        }\n    }\n    else if (JOY_REPT(DPAD_DOWN))\n    {\n        if (Menu_GetCursorPos() != 2)\n        {\n            PlaySE(SE_SELECT);\n            Menu_MoveCursor(+1);\n            PrintStringOnWindow0WithDialogueFrame(sItemStorageActionDescriptionPtrs[Menu_GetCursorPos()]);\n        }\n    }\n    else if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        sMenuActions_ItemPc[Menu_GetCursorPos()].func.void_u8(taskId);\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        sMenuActions_ItemPc[2].func.void_u8(taskId);\n    }\n}\n\nstatic void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        CleanupOverworldWindowsAndTilemaps();\n        GoToBagMenu(ITEMMENULOCATION_ITEMPC, OPEN_BAG_ITEMS, CB2_ReturnToField);\n        gFieldCallback = CB2_ReturnFromDepositMenu;\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_PlayerPcDepositItem(u8 taskId)\n{\n    gTasks[taskId].func = Task_DepositItem_WaitFadeAndGoToBag;\n    FadeScreen(FADE_TO_BLACK, 0);\n}\n\nstatic void Task_ReturnToItemStorageSubmenu(u8 taskId)\n{\n    if (IsWeatherNotFadingIn() == TRUE)\n        gTasks[taskId].func = Task_TopMenu_ItemStorageSubmenu_HandleInput;\n}\n\nstatic void CB2_ReturnFromDepositMenu(void)\n{\n    u8 taskId;\n    LoadStdWindowFrameGfx();\n    DrawDialogueFrame(0, TRUE);\n    taskId = CreateTask(Task_ReturnToItemStorageSubmenu, 0);\n    Task_CreateItemStorageSubmenu(taskId, 1);\n    FadeInFromBlack();\n}\n\nstatic void Task_PlayerPcWithdrawItem(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    tCount = CountItemsInPC();\n    if (tCount != 0)\n    {\n        tItemPcParam = 0;\n        gTasks[taskId].func = Task_WithdrawItemBeginFade;\n        gFieldCallback = CB2_ReturnFromWithdrawMenu;\n    }\n    else\n    {\n        ClearStdWindowAndFrameToTransparent(tWindowId, FALSE);\n        ClearWindowTilemap(tWindowId);\n        RemoveWindow(tWindowId);\n        DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_ThereAreNoItems, Task_PlayerPcItemStorage);\n    }\n}\n\nstatic void CB2_ReturnFromWithdrawMenu(void)\n{\n    u8 taskId;\n    LoadStdWindowFrameGfx();\n    DrawDialogueFrame(0, TRUE);\n    taskId = CreateTask(Task_ReturnToItemStorageSubmenu, 0);\n    Task_CreateItemStorageSubmenu(taskId, 0);\n    FadeInFromBlack();\n}\n\nstatic void Task_WithdrawItem_WaitFadeAndGoToItemStorage(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active)\n    {\n        CleanupOverworldWindowsAndTilemaps();\n        ItemPc_Init(tItemPcParam, CB2_ReturnToField);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_WithdrawItemBeginFade(u8 taskId)\n{\n    gTasks[taskId].func = Task_WithdrawItem_WaitFadeAndGoToItemStorage;\n    ItemPc_SetInitializedFlag(FALSE);\n    FadeScreen(FADE_TO_BLACK, 0);\n}\n\nstatic void Task_PlayerPcCancel(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    ClearStdWindowAndFrameToTransparent(tWindowId, FALSE);\n    ClearWindowTilemap(tWindowId);\n    CopyWindowToVram(tWindowId, COPYWIN_MAP);\n    RemoveWindow(tWindowId);\n    Task_ReturnToTopMenu(taskId);\n}\n\nstatic void Task_SetPageItemVars(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (tCount >= 8)\n        tPageItems = 8;\n    else\n        tPageItems = tCount + 1;\n    if (gPlayerPcMenuManager.count >= 8)\n        gPlayerPcMenuManager.pageItems = 8;\n    else\n        gPlayerPcMenuManager.pageItems = gPlayerPcMenuManager.count + 1;\n}\n\nstatic u8 CountPCMail(void)\n{\n    u8 count = 0;\n    u32 i;\n\n    for (i = PC_MAIL_NUM(0); i < MAIL_COUNT; i++)\n    {\n        if (gSaveBlock1Ptr->mail[i].itemId != ITEM_NONE)\n            count++;\n    }\n    return count;\n}\n\nstatic void PCMailCompaction(void)\n{\n    u32 i;\n    u32 j;\n    for (i = PC_MAIL_NUM(0); i < MAIL_COUNT - 1; i++)\n    {\n        for (j = i + 1; j < MAIL_COUNT; j++)\n        {\n            if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE)\n            {\n                struct Mail mail = gSaveBlock1Ptr->mail[i];\n                gSaveBlock1Ptr->mail[i] = gSaveBlock1Ptr->mail[j];\n                gSaveBlock1Ptr->mail[j] = mail;\n            }\n        }\n    }\n}\n\nstatic void Task_DrawMailboxPcMenu(u8 taskId)\n{\n    u8 windowId = MailboxPC_GetAddWindow(0);\n    s32 width = GetStringWidth(FONT_NORMAL, gText_Mailbox, 0);\n    MailboxPC_GetAddWindow(1);\n    AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_Mailbox, (80 - width) / 2, 2, 0, NULL);\n    ScheduleBgCopyTilemapToVram(0);\n    gTasks[taskId].tListMenuTaskId = MailboxPC_InitListMenu(&gPlayerPcMenuManager);\n    MailboxPC_AddScrollIndicatorArrows(&gPlayerPcMenuManager);\n}\n\nstatic void Task_MailboxPcHandleInput(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    s32 input;\n    if (!gPaletteFade.active)\n    {\n        input = ListMenu_ProcessInput(tListMenuTaskId);\n        ListMenuGetScrollAndRow(tListMenuTaskId, &gPlayerPcMenuManager.cursorPos, &gPlayerPcMenuManager.itemsAbove);\n        switch (input)\n        {\n        case -1:\n            break;\n        case -2:\n            PlaySE(SE_SELECT);\n            RemoveScrollIndicatorArrowPair(gPlayerPcMenuManager.scrollIndicatorId);\n            Task_DestroyMailboxPcViewAndCancel(taskId);\n            break;\n        default:\n            PlaySE(SE_SELECT);\n            MailboxPC_RemoveWindow(0);\n            MailboxPC_RemoveWindow(1);\n            DestroyListMenuTask(tListMenuTaskId, &gPlayerPcMenuManager.cursorPos, &gPlayerPcMenuManager.itemsAbove);\n            ScheduleBgCopyTilemapToVram(0);\n            RemoveScrollIndicatorArrowPair(gPlayerPcMenuManager.scrollIndicatorId);\n            gTasks[taskId].func = Task_PrintWhatToDoWithSelectedMail;\n            break;\n        }\n    }\n}\n\nstatic void Task_PrintWhatToDoWithSelectedMail(u8 taskId)\n{\n    s32 length;\n    s32 i;\n    u8 *ptr;\n    StringCopy(gStringVar1, SELECTED_MAIL.playerName);\n    length = StringLength(gStringVar1);\n    if (length > 5)\n    {\n        for (ptr = gStringVar1 + length - 1; ptr >= gStringVar1; ptr--)\n        {\n            if (*ptr)\n                break;\n            *ptr = EOS;\n        }\n    }\n    else\n    {\n        ConvertInternationalString(gStringVar1, LANGUAGE_JAPANESE);\n    }\n    StringExpandPlaceholders(gStringVar4, gText_WhatWouldYouLikeToDoWithPlayersMail);\n    DisplayItemMessageOnField(taskId, FONT_NORMAL, gStringVar4, Task_DrawMailSubmenu);\n}\n\nstatic void Task_DestroyMailboxPcViewAndCancel(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    MailboxPC_RemoveWindow(0);\n    MailboxPC_RemoveWindow(1);\n    DestroyListMenuTask(tListMenuTaskId, NULL, NULL);\n    ScheduleBgCopyTilemapToVram(0);\n    MailboxPC_DestroyListMenuBuffer();\n    Task_ReturnToTopMenu(taskId);\n}\n\nstatic void Task_DrawMailSubmenu(u8 taskId)\n{\n    u8 windowId = MailboxPC_GetAddWindow(2);\n    PrintTextArray(windowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, 16, 4, sMenuActions_MailSubmenu);\n    Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 16, 4, 0);\n    ScheduleBgCopyTilemapToVram(0);\n    gTasks[taskId].func = Task_MailSubmenuHandleInput;\n}\n\nstatic void Task_MailSubmenuHandleInput(u8 taskId)\n{\n    s8 input = Menu_ProcessInput_other();\n    switch (input)\n    {\n    case -1:\n        PlaySE(SE_SELECT);\n        Task_PlayerPcExitMailSubmenu(taskId);\n        break;\n    case -2:\n        break;\n    default:\n        PlaySE(SE_SELECT);\n        sMenuActions_MailSubmenu[input].func.void_u8(taskId);\n        break;\n    }\n}\n\nstatic void Task_PlayerPcReadMail(u8 taskId)\n{\n    FadeScreen(FADE_TO_BLACK, 0);\n    gTasks[taskId].func = Task_WaitFadeAndReadSelectedMail;\n}\n\nstatic void Task_WaitFadeAndReadSelectedMail(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        MailboxPC_DestroyListMenuBuffer();\n        CleanupOverworldWindowsAndTilemaps();\n        ReadMail(&SELECTED_MAIL, CB2_SetCbToReturnToMailbox, 1);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_WaitFadeAndReturnToMailboxPcInputHandler(u8 taskId)\n{\n    if (IsWeatherNotFadingIn() == TRUE)\n        gTasks[taskId].func = Task_MailboxPcHandleInput;\n}\n\nstatic void CB2_ReturnToMailbox(void)\n{\n    u8 taskId;\n    if (gPlayerPcMenuManager.notInRoom == FALSE)\n        SetHelpContext(HELPCONTEXT_BEDROOM_PC_MAILBOX);\n    else\n        SetHelpContext(HELPCONTEXT_PLAYERS_PC_MAILBOX);\n    LoadStdWindowFrameGfx();\n    taskId = CreateTask(Task_WaitFadeAndReturnToMailboxPcInputHandler, 0);\n    if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE)\n        Task_DrawMailboxPcMenu(taskId);\n    else\n        DestroyTask(taskId);\n    FadeInFromBlack();\n}\n\nstatic void CB2_SetCbToReturnToMailbox(void)\n{\n    gFieldCallback = CB2_ReturnToMailbox;\n    SetMainCallback2(CB2_ReturnToField);\n}\n\nstatic void Task_PlayerPcMoveMailToBag(u8 taskId)\n{\n    DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_MessageWillBeLost, Task_DrawYesNoMenuToConfirmMoveToBag);\n}\n\nstatic void Task_DrawYesNoMenuToConfirmMoveToBag(u8 taskId)\n{\n    DisplayYesNoMenuDefaultYes();\n    gTasks[taskId].func = Task_MoveToBagYesNoMenuHandleInput;\n}\n\nstatic void Task_MoveToBagYesNoMenuHandleInput(u8 taskId)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case -2:\n        break;\n    case 0:\n        Task_TryPutMailInBag_DestroyMsgIfSuccessful(taskId);\n        break;\n    case -1:\n        PlaySE(SE_SELECT);\n        // fallthrough\n    case 1:\n        Task_DeclinedMoveMailToBag(taskId);\n        break;\n    }\n}\n\nstatic void Task_TryPutMailInBag_DestroyMsgIfSuccessful(u8 taskId)\n{\n    struct Mail * mail = &SELECTED_MAIL;\n    if (!AddBagItem(mail->itemId, 1))\n    {\n        DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_BagIsFull, Task_PlayerPcExitMailSubmenu);\n    }\n    else\n    {\n        DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_MailReturnedToBagMessageErased, Task_PlayerPcExitMailSubmenu);\n        ClearMailStruct(mail);\n        PCMailCompaction();\n        gPlayerPcMenuManager.count--;\n        if (gPlayerPcMenuManager.count < gPlayerPcMenuManager.pageItems + gPlayerPcMenuManager.cursorPos)\n        {\n            if (gPlayerPcMenuManager.cursorPos != 0)\n                gPlayerPcMenuManager.cursorPos--;\n        }\n        Task_SetPageItemVars(taskId);\n    }\n}\n\nstatic void Task_DeclinedMoveMailToBag(u8 taskId)\n{\n    Task_PlayerPcExitMailSubmenu(taskId);\n}\n\nstatic void Task_PlayerPcGiveMailToMon(u8 taskId)\n{\n    if (CalculatePlayerPartyCount() == 0)\n    {\n        Task_Error_NoPokemon(taskId);\n    }\n    else\n    {\n        FadeScreen(FADE_TO_BLACK, 0);\n        gTasks[taskId].func = Task_WaitFadeAndGoToPartyMenu;\n    }\n}\n\nstatic void Task_WaitFadeAndGoToPartyMenu(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        MailboxPC_DestroyListMenuBuffer();\n        CleanupOverworldWindowsAndTilemaps();\n        ChooseMonToGiveMailFromMailbox();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void CB2_ReturnToMailboxPc_UpdateScrollVariables(void)\n{\n    u8 taskId;\n    u8 count;\n    if (gPlayerPcMenuManager.notInRoom == FALSE)\n        SetHelpContext(HELPCONTEXT_BEDROOM_PC_MAILBOX);\n    else\n        SetHelpContext(HELPCONTEXT_PLAYERS_PC_MAILBOX);\n    taskId = CreateTask(Task_WaitFadeAndReturnToMailboxPcInputHandler, 0);\n    count = gPlayerPcMenuManager.count;\n    gPlayerPcMenuManager.count = CountPCMail();\n    PCMailCompaction();\n    if (count != gPlayerPcMenuManager.count)\n    {\n        if (gPlayerPcMenuManager.count < gPlayerPcMenuManager.pageItems + gPlayerPcMenuManager.cursorPos)\n        {\n            if (gPlayerPcMenuManager.cursorPos != 0)\n                gPlayerPcMenuManager.cursorPos--;\n        }\n    }\n    Task_SetPageItemVars(taskId);\n    LoadStdWindowFrameGfx();\n    if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE)\n        Task_DrawMailboxPcMenu(taskId);\n    else\n        DestroyTask(taskId);\n    FadeInFromBlack();\n}\n\nvoid Mailbox_ReturnToMailListAfterDeposit(void)\n{\n    gFieldCallback = CB2_ReturnToMailboxPc_UpdateScrollVariables;\n    SetMainCallback2(CB2_ReturnToField);\n}\n\nstatic void Task_Error_NoPokemon(u8 taskId)\n{\n    DisplayItemMessageOnField(taskId, FONT_NORMAL, gText_ThereIsNoPokemon, Task_PlayerPcExitMailSubmenu);\n}\n\nstatic void Task_RedrawPlayerPcMailboxAndSetUpInputHandler(u8 taskId)\n{\n    ClearDialogWindowAndFrame(0, FALSE);\n    Task_DrawMailboxPcMenu(taskId);\n    ScheduleBgCopyTilemapToVram(0);\n    gTasks[taskId].func = Task_MailboxPcHandleInput;\n}\n\nstatic void Task_PlayerPcExitMailSubmenu(u8 taskId)\n{\n    MailboxPC_RemoveWindow(2);\n    ScheduleBgCopyTilemapToVram(0);\n    gTasks[taskId].func = Task_RedrawPlayerPcMailboxAndSetUpInputHandler;\n}\n\n#undef tListMenuTaskId\n#undef tWindowId\n#undef tItemPcParam\n#undef tPageItems\n#undef tCount\n"
  },
  {
    "path": "src/pokeball.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"decompress.h\"\n#include \"graphics.h\"\n#include \"m4a.h\"\n#include \"pokeball.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"util.h\"\n#include \"link.h\"\n#include \"battle_gfx_sfx_util.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n\nstatic void Task_DoPokeballSendOutAnim(u8 taskId);\nstatic void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite);\nstatic void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite);\nstatic void SpriteCB_OpponentMonSendOut(struct Sprite *sprite);\nstatic void SpriteCB_BallThrow(struct Sprite *sprite);\nstatic void SpriteCB_BallThrow_ReachMon(struct Sprite *sprite);\nstatic void SpriteCB_BallThrow_StartShrinkMon(struct Sprite *sprite);\nstatic void SpriteCB_BallThrow_ShrinkMon(struct Sprite *sprite);\nstatic void SpriteCB_BallThrow_Close(struct Sprite *sprite);\nstatic void SpriteCB_BallThrow_FallToGround(struct Sprite *sprite);\nstatic void SpriteCB_BallThrow_StartShakes(struct Sprite *sprite);\nstatic void SpriteCB_BallThrow_Shake(struct Sprite *sprite);\nstatic void SpriteCB_BallThrow_StartCaptureMon(struct Sprite *sprite);\nstatic void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite);\nstatic void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite);\nstatic void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite);\nstatic void HandleBallAnimEnd(struct Sprite *sprite);\nstatic void SpriteCB_PokeballReleaseMon(struct Sprite *sprite);\nstatic void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite);\nstatic void SpriteCB_TradePokeball(struct Sprite *sprite);\nstatic void SpriteCB_TradePokeballSendOff(struct Sprite *sprite);\nstatic void SpriteCB_TradePokeballEnd(struct Sprite *sprite);\nstatic void SpriteCB_HealthboxSlideInDelayed(struct Sprite *sprite);\nstatic void SpriteCB_HealthboxSlideIn(struct Sprite *sprite);\nstatic void SpriteCB_HitAnimHealthoxEffect(struct Sprite *sprite);\nstatic u16 GetBattlerPokeballItemId(u8 battlerId);\n\n// rom const data\n\n#define GFX_TAG_POKE_BALL    55000\n#define GFX_TAG_GREAT_BALL   55001\n#define GFX_TAG_SAFARI_BALL  55002\n#define GFX_TAG_ULTRA_BALL   55003\n#define GFX_TAG_MASTER_BALL  55004\n#define GFX_TAG_NET_BALL     55005\n#define GFX_TAG_DIVE_BALL    55006\n#define GFX_TAG_NEST_BALL    55007\n#define GFX_TAG_REPEAT_BALL  55008\n#define GFX_TAG_TIMER_BALL   55009\n#define GFX_TAG_LUXURY_BALL  55010\n#define GFX_TAG_PREMIER_BALL 55011\n\nconst struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT] =\n{\n    [BALL_POKE]    = {gBallGfx_Poke,    384, GFX_TAG_POKE_BALL},\n    [BALL_GREAT]   = {gBallGfx_Great,   384, GFX_TAG_GREAT_BALL},\n    [BALL_SAFARI]  = {gBallGfx_Safari,  384, GFX_TAG_SAFARI_BALL},\n    [BALL_ULTRA]   = {gBallGfx_Ultra,   384, GFX_TAG_ULTRA_BALL},\n    [BALL_MASTER]  = {gBallGfx_Master,  384, GFX_TAG_MASTER_BALL},\n    [BALL_NET]     = {gBallGfx_Net,     384, GFX_TAG_NET_BALL},\n    [BALL_DIVE]    = {gBallGfx_Dive,    384, GFX_TAG_DIVE_BALL},\n    [BALL_NEST]    = {gBallGfx_Nest,    384, GFX_TAG_NEST_BALL},\n    [BALL_REPEAT]  = {gBallGfx_Repeat,  384, GFX_TAG_REPEAT_BALL},\n    [BALL_TIMER]   = {gBallGfx_Timer,   384, GFX_TAG_TIMER_BALL},\n    [BALL_LUXURY]  = {gBallGfx_Luxury,  384, GFX_TAG_LUXURY_BALL},\n    [BALL_PREMIER] = {gBallGfx_Premier, 384, GFX_TAG_PREMIER_BALL},\n};\n\nconst struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT] =\n{\n    [BALL_POKE]    = {gBallPal_Poke,    GFX_TAG_POKE_BALL},\n    [BALL_GREAT]   = {gBallPal_Great,   GFX_TAG_GREAT_BALL},\n    [BALL_SAFARI]  = {gBallPal_Safari,  GFX_TAG_SAFARI_BALL},\n    [BALL_ULTRA]   = {gBallPal_Ultra,   GFX_TAG_ULTRA_BALL},\n    [BALL_MASTER]  = {gBallPal_Master,  GFX_TAG_MASTER_BALL},\n    [BALL_NET]     = {gBallPal_Net,     GFX_TAG_NET_BALL},\n    [BALL_DIVE]    = {gBallPal_Dive,    GFX_TAG_DIVE_BALL},\n    [BALL_NEST]    = {gBallPal_Nest,    GFX_TAG_NEST_BALL},\n    [BALL_REPEAT]  = {gBallPal_Repeat,  GFX_TAG_REPEAT_BALL},\n    [BALL_TIMER]   = {gBallPal_Timer,   GFX_TAG_TIMER_BALL},\n    [BALL_LUXURY]  = {gBallPal_Luxury,  GFX_TAG_LUXURY_BALL},\n    [BALL_PREMIER] = {gBallPal_Premier, GFX_TAG_PREMIER_BALL},\n};\n\nstatic const struct OamData sBallOamData =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const union AnimCmd sBallAnimSeq3[] =\n{\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sBallAnimSeq5[] =\n{\n    ANIMCMD_FRAME(4, 1),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sBallAnimSeq4[] =\n{\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sBallAnimSeq6[] =\n{\n    ANIMCMD_FRAME(12, 1),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sBallAnimSeq0[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sBallAnimSeq1[] =\n{\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sBallAnimSeq2[] =\n{\n    ANIMCMD_FRAME(4, 5),\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sBallAnimSequences[] =\n{\n    sBallAnimSeq0,\n    sBallAnimSeq1,\n    sBallAnimSeq2,\n    sBallAnimSeq3,\n    sBallAnimSeq4,\n    sBallAnimSeq5,\n    sBallAnimSeq6,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_BallRotate_0[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, 0, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sAffineAnim_BallRotate_Right[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, -3, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sAffineAnim_BallRotate_Left[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, 3, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd sAffineAnim_BallRotate_3[] =\n{\n    AFFINEANIMCMD_FRAME(256, 256, 0, 0),\n    AFFINEANIMCMD_END,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_BallRotate_4[] =\n{\n    AFFINEANIMCMD_FRAME(0, 0, 25, 1),\n    AFFINEANIMCMD_JUMP(0),\n};\n\nstatic const union AffineAnimCmd *const sAffineAnim_BallRotate[] =\n{\n    [BALL_AFFINE_ANIM_0] = sAffineAnim_BallRotate_0,\n    [BALL_ROTATE_RIGHT]  = sAffineAnim_BallRotate_Right,\n    [BALL_ROTATE_LEFT]   = sAffineAnim_BallRotate_Left,\n    [BALL_AFFINE_ANIM_3] = sAffineAnim_BallRotate_3,\n    [BALL_AFFINE_ANIM_4] = sAffineAnim_BallRotate_4,\n};\n\nconst struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =\n{\n    [BALL_POKE] =\n    {\n        .tileTag = GFX_TAG_POKE_BALL,\n        .paletteTag = GFX_TAG_POKE_BALL,\n        .oam = &sBallOamData,\n        .anims = sBallAnimSequences,\n        .images = NULL,\n        .affineAnims = sAffineAnim_BallRotate,\n        .callback = SpriteCB_BallThrow,\n    },\n    [BALL_GREAT] =\n    {\n        .tileTag = GFX_TAG_GREAT_BALL,\n        .paletteTag = GFX_TAG_GREAT_BALL,\n        .oam = &sBallOamData,\n        .anims = sBallAnimSequences,\n        .images = NULL,\n        .affineAnims = sAffineAnim_BallRotate,\n        .callback = SpriteCB_BallThrow,\n    },\n    [BALL_SAFARI] =\n    {\n        .tileTag = GFX_TAG_SAFARI_BALL,\n        .paletteTag = GFX_TAG_SAFARI_BALL,\n        .oam = &sBallOamData,\n        .anims = sBallAnimSequences,\n        .images = NULL,\n        .affineAnims = sAffineAnim_BallRotate,\n        .callback = SpriteCB_BallThrow,\n    },\n    [BALL_ULTRA] =\n    {\n        .tileTag = GFX_TAG_ULTRA_BALL,\n        .paletteTag = GFX_TAG_ULTRA_BALL,\n        .oam = &sBallOamData,\n        .anims = sBallAnimSequences,\n        .images = NULL,\n        .affineAnims = sAffineAnim_BallRotate,\n        .callback = SpriteCB_BallThrow,\n    },\n    [BALL_MASTER] =\n    {\n        .tileTag = GFX_TAG_MASTER_BALL,\n        .paletteTag = GFX_TAG_MASTER_BALL,\n        .oam = &sBallOamData,\n        .anims = sBallAnimSequences,\n        .images = NULL,\n        .affineAnims = sAffineAnim_BallRotate,\n        .callback = SpriteCB_BallThrow,\n    },\n    [BALL_NET] =\n    {\n        .tileTag = GFX_TAG_NET_BALL,\n        .paletteTag = GFX_TAG_NET_BALL,\n        .oam = &sBallOamData,\n        .anims = sBallAnimSequences,\n        .images = NULL,\n        .affineAnims = sAffineAnim_BallRotate,\n        .callback = SpriteCB_BallThrow,\n    },\n    [BALL_DIVE] =\n    {\n        .tileTag = GFX_TAG_DIVE_BALL,\n        .paletteTag = GFX_TAG_DIVE_BALL,\n        .oam = &sBallOamData,\n        .anims = sBallAnimSequences,\n        .images = NULL,\n        .affineAnims = sAffineAnim_BallRotate,\n        .callback = SpriteCB_BallThrow,\n    },\n    [BALL_NEST] =\n    {\n        .tileTag = GFX_TAG_NEST_BALL,\n        .paletteTag = GFX_TAG_NEST_BALL,\n        .oam = &sBallOamData,\n        .anims = sBallAnimSequences,\n        .images = NULL,\n        .affineAnims = sAffineAnim_BallRotate,\n        .callback = SpriteCB_BallThrow,\n    },\n    [BALL_REPEAT] =\n    {\n        .tileTag = GFX_TAG_REPEAT_BALL,\n        .paletteTag = GFX_TAG_REPEAT_BALL,\n        .oam = &sBallOamData,\n        .anims = sBallAnimSequences,\n        .images = NULL,\n        .affineAnims = sAffineAnim_BallRotate,\n        .callback = SpriteCB_BallThrow,\n    },\n    [BALL_TIMER] =\n    {\n        .tileTag = GFX_TAG_TIMER_BALL,\n        .paletteTag = GFX_TAG_TIMER_BALL,\n        .oam = &sBallOamData,\n        .anims = sBallAnimSequences,\n        .images = NULL,\n        .affineAnims = sAffineAnim_BallRotate,\n        .callback = SpriteCB_BallThrow,\n    },\n    [BALL_LUXURY] =\n    {\n        .tileTag = GFX_TAG_LUXURY_BALL,\n        .paletteTag = GFX_TAG_LUXURY_BALL,\n        .oam = &sBallOamData,\n        .anims = sBallAnimSequences,\n        .images = NULL,\n        .affineAnims = sAffineAnim_BallRotate,\n        .callback = SpriteCB_BallThrow,\n    },\n    [BALL_PREMIER] =\n    {\n        .tileTag = GFX_TAG_PREMIER_BALL,\n        .paletteTag = GFX_TAG_PREMIER_BALL,\n        .oam = &sBallOamData,\n        .anims = sBallAnimSequences,\n        .images = NULL,\n        .affineAnims = sAffineAnim_BallRotate,\n        .callback = SpriteCB_BallThrow,\n    },\n};\n\n#define tFrames          data[0]\n#define tPan             data[1]\n#define tThrowId         data[2]\n#define tBattler         data[3]\n#define tOpponentBattler data[4]\n\nu8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow)\n{\n    u8 taskId;\n\n    gDoingBattleAnim = TRUE;\n    gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive = TRUE;\n\n    taskId = CreateTask(Task_DoPokeballSendOutAnim, 5);\n    gTasks[taskId].tPan = pan;\n    gTasks[taskId].tThrowId = kindOfThrow;\n    gTasks[taskId].tBattler = gActiveBattler;\n\n    return 0;\n}\n\n#define sBattler         data[6]\n\nstatic void Task_DoPokeballSendOutAnim(u8 taskId)\n{\n    u16 throwCaseId;\n    u8 battlerId;\n    u16 itemId, ballId;\n    u8 ballSpriteId;\n    bool8 notSendOut = FALSE;\n    s16 x, y;\n    u32 gender;\n\n    if (gTasks[taskId].tFrames == 0)\n    {\n        gTasks[taskId].tFrames++;\n        return;\n    }\n\n    throwCaseId = gTasks[taskId].tThrowId;\n    battlerId = gTasks[taskId].tBattler;\n\n    if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n        itemId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL);\n    else\n        itemId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL);\n\n    ballId = ItemIdToBallId(itemId);\n    LoadBallGfx(ballId);\n\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n        gender = gLinkPlayers[GetBattlerMultiplayerId(battlerId)].gender;\n    else\n        gender = gSaveBlock2Ptr->playerGender;\n\n    ballSpriteId = CreateSprite(&gBallSpriteTemplates[ballId], 32, 80, 29);\n    gSprites[ballSpriteId].data[0] = 0x80;\n    gSprites[ballSpriteId].data[1] = 0;\n    gSprites[ballSpriteId].data[7] = throwCaseId;\n\n    switch (throwCaseId)\n    {\n    case POKEBALL_PLAYER_SENDOUT:\n        if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)\n        {\n            x = 32;\n            y = 64;\n        }\n        else\n        {\n            gender = !!gender; // something unknown got optimized out\n            x = 48;\n            y = 70;\n        }\n\n        gBattlerTarget = battlerId;\n        gSprites[ballSpriteId].x = x;\n        gSprites[ballSpriteId].y = y;\n        gSprites[ballSpriteId].callback = SpriteCB_PlayerMonSendOut_1;\n        break;\n    case POKEBALL_OPPONENT_SENDOUT:\n        gSprites[ballSpriteId].x = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X);\n        gSprites[ballSpriteId].y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 24;\n        gBattlerTarget = battlerId;\n        gSprites[ballSpriteId].data[0] = 0;\n        gSprites[ballSpriteId].callback = SpriteCB_OpponentMonSendOut;\n        break;\n    default:\n        gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        notSendOut = TRUE;\n        break;\n    }\n\n    gSprites[ballSpriteId].sBattler = gBattlerTarget;\n    if (!notSendOut)\n    {\n        DestroyTask(taskId);\n        return;\n    }\n\n    // this will perform an unused ball throw animation\n    gSprites[ballSpriteId].data[0] = 34;\n    gSprites[ballSpriteId].data[2] = GetBattlerSpriteCoord(gBattlerTarget, BATTLER_COORD_X);\n    gSprites[ballSpriteId].data[4] = GetBattlerSpriteCoord(gBattlerTarget, BATTLER_COORD_Y) - 16;\n    gSprites[ballSpriteId].data[5] = -40;\n    InitAnimArcTranslation(&gSprites[ballSpriteId]);\n    gSprites[ballSpriteId].oam.affineParam = taskId;\n    gTasks[taskId].tOpponentBattler = gBattlerTarget;\n    gTasks[taskId].func = TaskDummy;\n    PlaySE(SE_BALL_THROW);\n}\n\n// This sequence of functions is very similar to those that get run when\n// a Pokéball gets thrown at a wild Pokémon, starting at SpriteCB_Ball_Arc.\n// These do not seem to get run.\nstatic void SpriteCB_BallThrow(struct Sprite *sprite)\n{\n    if (TranslateAnimHorizontalArc(sprite))\n    {\n        u16 ballId;\n        u8 taskId = sprite->oam.affineParam;\n        u8 opponentBattler = gTasks[taskId].tOpponentBattler;\n        u8 noOfShakes = gTasks[taskId].tThrowId;\n\n        StartSpriteAnim(sprite, 1);\n        sprite->affineAnimPaused = TRUE;\n        sprite->x += sprite->x2;\n        sprite->y += sprite->y2;\n        sprite->x2 = 0;\n        sprite->y2 = 0;\n        sprite->data[5] = 0;\n        ballId = ItemIdToBallId(GetBattlerPokeballItemId(opponentBattler));\n        AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId);\n        sprite->data[0] = LaunchBallFadeMonTask(FALSE, opponentBattler, 14, ballId);\n        sprite->sBattler = opponentBattler;\n        sprite->data[7] = noOfShakes;\n        DestroyTask(taskId);\n        sprite->callback = SpriteCB_BallThrow_ReachMon;\n    }\n}\n\n#undef tFrames\n#undef tPan\n#undef tThrowId\n#undef tBattler\n#undef tOpponentBattler\n\nstatic void SpriteCB_BallThrow_ReachMon(struct Sprite *sprite)\n{\n    sprite->callback = SpriteCB_BallThrow_StartShrinkMon;\n}\n\nstatic void SpriteCB_BallThrow_StartShrinkMon(struct Sprite *sprite)\n{\n    if (++sprite->data[5] == 10)\n    {\n        sprite->data[5] = 0;\n        sprite->callback = SpriteCB_BallThrow_ShrinkMon;\n        StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_RETURN);\n        AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);\n        gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0;\n    }\n}\n\nstatic void SpriteCB_BallThrow_ShrinkMon(struct Sprite *sprite)\n{\n    sprite->data[5]++;\n    if (sprite->data[5] == 11)\n        PlaySE(SE_BALL_TRADE);\n\n    if (gSprites[gBattlerSpriteIds[sprite->sBattler]].affineAnimEnded)\n    {\n        StartSpriteAnim(sprite, 2);\n        gSprites[gBattlerSpriteIds[sprite->sBattler]].invisible = TRUE;\n        sprite->data[5] = 0;\n        sprite->callback = SpriteCB_BallThrow_Close;\n    }\n    else\n    {\n        gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] += 0x60;\n        gSprites[gBattlerSpriteIds[sprite->sBattler]].y2 = -gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] >> 8;\n    }\n}\n\nstatic void SpriteCB_BallThrow_Close(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n    {\n        sprite->data[5]++;\n        if (sprite->data[5] == 1)\n        {\n            sprite->data[3] = 0;\n            sprite->data[4] = 32;\n            sprite->data[5] = 0;\n            sprite->y += Cos(0, 32);\n            sprite->y2 = -Cos(0, sprite->data[4]);\n            sprite->callback = SpriteCB_BallThrow_FallToGround;\n        }\n    }\n}\n\nstatic void SpriteCB_BallThrow_FallToGround(struct Sprite *sprite)\n{\n    bool8 r5 = FALSE;\n\n    switch (sprite->data[3] & 0xFF)\n    {\n    case 0:\n        sprite->y2 = -Cos(sprite->data[5], sprite->data[4]);\n        sprite->data[5] += 4 + (sprite->data[3] >> 8);\n        if (sprite->data[5] >= 64)\n        {\n            sprite->data[4] -= 10;\n            sprite->data[3] += 0x101;\n            if (sprite->data[3] >> 8 == 4)\n                r5 = TRUE;\n            switch (sprite->data[3] >> 8)\n            {\n            case 1:\n                PlaySE(SE_BALL_BOUNCE_1);\n                break;\n            case 2:\n                PlaySE(SE_BALL_BOUNCE_2);\n                break;\n            case 3:\n                PlaySE(SE_BALL_BOUNCE_3);\n                break;\n            default:\n                PlaySE(SE_BALL_BOUNCE_4);\n                break;\n            }\n        }\n        break;\n    case 1:\n        sprite->y2 = -Cos(sprite->data[5], sprite->data[4]);\n        sprite->data[5] -= 4 + (sprite->data[3] >> 8);\n        if (sprite->data[5] <= 0)\n        {\n            sprite->data[5] = 0;\n            sprite->data[3] &= 0xFF00;\n        }\n        break;\n    }\n    if (r5)\n    {\n        sprite->data[3] = 0;\n        sprite->y += Cos(64, 32);\n        sprite->y2 = 0;\n        if (sprite->data[7] == 0)\n        {\n            sprite->callback = SpriteCB_ReleaseMonFromBall;\n        }\n        else\n        {\n            sprite->callback = SpriteCB_BallThrow_StartShakes;\n            sprite->data[4] = 1;\n            sprite->data[5] = 0;\n        }\n    }\n}\n\nstatic void SpriteCB_BallThrow_StartShakes(struct Sprite *sprite)\n{\n    sprite->data[3]++;\n    if (sprite->data[3] == 31)\n    {\n        sprite->data[3] = 0;\n        sprite->affineAnimPaused = TRUE;\n        StartSpriteAffineAnim(sprite, 1);\n        sprite->callback = SpriteCB_BallThrow_Shake;\n        PlaySE(SE_BALL);\n    }\n}\n\nstatic void SpriteCB_BallThrow_Shake(struct Sprite *sprite)\n{\n    switch (sprite->data[3] & 0xFF)\n    {\n    case 0:\n    case 2:\n        sprite->x2 += sprite->data[4];\n        sprite->data[5] += sprite->data[4];\n        sprite->affineAnimPaused = FALSE;\n        if (sprite->data[5] > 3 || sprite->data[5] < -3)\n        {\n            sprite->data[3]++;\n            sprite->data[5] = 0;\n        }\n        break;\n    case 1:\n        sprite->data[5]++;\n        if (sprite->data[5] == 1)\n        {\n            sprite->data[5] = 0;\n            sprite->data[4] = -sprite->data[4];\n            sprite->data[3]++;\n            sprite->affineAnimPaused = FALSE;\n            if (sprite->data[4] < 0)\n                ChangeSpriteAffineAnim(sprite, 2);\n            else\n                ChangeSpriteAffineAnim(sprite, 1);\n        }\n        else\n        {\n            sprite->affineAnimPaused = TRUE;\n        }\n        break;\n    case 3:\n        sprite->data[3] += 0x100;\n        if (sprite->data[3] >> 8 == sprite->data[7])\n        {\n            sprite->callback = SpriteCB_ReleaseMonFromBall;\n        }\n        else\n        {\n            if (sprite->data[7] == 4 && sprite->data[3] >> 8 == 3)\n            {\n                sprite->callback = SpriteCB_BallThrow_StartCaptureMon;\n                sprite->affineAnimPaused = TRUE;\n            }\n            else\n            {\n                sprite->data[3]++;\n                sprite->affineAnimPaused = TRUE;\n            }\n        }\n        break;\n    case 4:\n    default:\n        sprite->data[5]++;\n        if (sprite->data[5] == 31)\n        {\n            sprite->data[5] = 0;\n            sprite->data[3] &= 0xFF00;\n            StartSpriteAffineAnim(sprite, 3);\n            if (sprite->data[4] < 0)\n                StartSpriteAffineAnim(sprite, 2);\n            else\n                StartSpriteAffineAnim(sprite, 1);\n\n            PlaySE(SE_BALL);\n        }\n        break;\n    }\n}\n\n#define tCryTaskSpecies         data[0]\n#define tCryTaskPan             data[1]\n#define tCryTaskWantedCry       data[2]\n#define tCryTaskMonPtr1         data[3]\n#define tCryTaskMonPtr2         data[4]\n#define tCryTaskFrames          data[10]\n#define tCryTaskState           data[15]\n\nstatic void Task_PlayCryWhenReleasedFromBall(u8 taskId)\n{\n    u8 wantedCry = gTasks[taskId].tCryTaskWantedCry;\n    s8 pan = gTasks[taskId].tCryTaskPan;\n    u16 species = gTasks[taskId].tCryTaskSpecies;\n    struct Pokemon *mon = (void *)(u32)((gTasks[taskId].tCryTaskMonPtr1 << 16) | (u16)(gTasks[taskId].tCryTaskMonPtr2));\n\n    switch (gTasks[taskId].tCryTaskState)\n    {\n    case 0:\n    default:\n        if (gTasks[taskId].data[8] < 3)\n            gTasks[taskId].data[8]++;\n        else\n            gTasks[taskId].tCryTaskState = wantedCry + 1;\n        break;\n    case 1:\n        // Play single cry\n        if (ShouldPlayNormalMonCry(mon) == TRUE)\n            PlayCry_ByMode(species, pan, CRY_MODE_NORMAL);\n        else\n            PlayCry_ByMode(species, pan, CRY_MODE_WEAK);\n\n        DestroyTask(taskId);\n        break;\n    case 2:\n        StopCryAndClearCrySongs();\n        gTasks[taskId].tCryTaskFrames = 3;\n        gTasks[taskId].tCryTaskState = 20;\n        break;\n    case 20:\n        if (gTasks[taskId].tCryTaskFrames == 0)\n        {\n            // Play first doubles cry\n            if (ShouldPlayNormalMonCry(mon) == TRUE)\n                PlayCry_ReleaseDouble(species, pan, CRY_MODE_DOUBLES);\n            else\n                PlayCry_ReleaseDouble(species, pan, CRY_MODE_WEAK_DOUBLES);\n\n            DestroyTask(taskId);\n        }\n        else\n        {\n            gTasks[taskId].tCryTaskFrames--;\n        }\n        break;\n    case 3:\n        gTasks[taskId].tCryTaskFrames = 6;\n        gTasks[taskId].tCryTaskState = 30;\n        break;\n    case 30:\n        if (gTasks[taskId].tCryTaskFrames != 0)\n        {\n            gTasks[taskId].tCryTaskFrames--;\n            break;\n        }\n        gTasks[taskId].tCryTaskState++;\n        // fall through\n    case 31:\n        if (!IsCryPlayingOrClearCrySongs())\n        {\n            StopCryAndClearCrySongs();\n            gTasks[taskId].tCryTaskFrames = 3;\n            gTasks[taskId].tCryTaskState++;\n        }\n        break;\n    case 32:\n        if (gTasks[taskId].tCryTaskFrames != 0)\n        {\n            gTasks[taskId].tCryTaskFrames--;\n            break;\n        }\n        // Play second doubles cry\n        if (ShouldPlayNormalMonCry(mon) == TRUE)\n            PlayCry_ReleaseDouble(species, pan, CRY_MODE_NORMAL);\n        else\n            PlayCry_ReleaseDouble(species, pan, CRY_MODE_WEAK);\n\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)\n{\n    u8 battlerId = sprite->sBattler;\n    u32 ballId;\n\n    StartSpriteAnim(sprite, 1);\n    ballId = ItemIdToBallId(GetBattlerPokeballItemId(battlerId));\n    AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId);\n    sprite->data[0] = LaunchBallFadeMonTask(TRUE, sprite->sBattler, 14, ballId);\n    sprite->callback = HandleBallAnimEnd;\n\n    if (gMain.inBattle)\n    {\n        struct Pokemon *mon;\n        u16 species;\n        s8 pan;\n        u16 wantedCryCase;\n        u8 taskId;\n\n        if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n        {\n            mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]];\n            pan = 25;\n        }\n        else\n        {\n            mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]];\n            pan = -25;\n        }\n\n        species = GetMonData(mon, MON_DATA_SPECIES);\n        if ((battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))\n         && IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive)\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n            {\n                if (IsBGMPlaying())\n                    m4aMPlayStop(&gMPlayInfo_BGM);\n            }\n            else\n            {\n                m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 128);\n            }\n        }\n\n        if (!IsDoubleBattle() || !gBattleSpritesDataPtr->animationData->introAnimActive)\n            wantedCryCase = 0;\n        else if (battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))\n            wantedCryCase = 1;\n        else\n            wantedCryCase = 2;\n\n        taskId = CreateTask(Task_PlayCryWhenReleasedFromBall, 3);\n        gTasks[taskId].tCryTaskSpecies = species;\n        gTasks[taskId].tCryTaskPan = pan;\n        gTasks[taskId].tCryTaskWantedCry = wantedCryCase;\n        gTasks[taskId].tCryTaskMonPtr1 = (u32)(mon) >> 16;\n        gTasks[taskId].tCryTaskMonPtr2 = (u32)(mon);\n        gTasks[taskId].tCryTaskState = 0;\n    }\n\n    StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_EMERGE);\n    AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);\n    gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0x1000;\n}\n\n#undef tCryTaskSpecies\n#undef tCryTaskPan\n#undef tCryTaskWantedCry\n#undef tCryTaskMonPtr1\n#undef tCryTaskMonPtr2\n#undef tCryTaskFrames\n#undef tCryTaskState\n\nstatic void SpriteCB_BallThrow_StartCaptureMon(struct Sprite *sprite)\n{\n    sprite->animPaused = TRUE;\n    sprite->callback = SpriteCB_BallThrow_CaptureMon;\n    sprite->data[3] = 0;\n    sprite->data[4] = 0;\n    sprite->data[5] = 0;\n}\n\nstatic void HandleBallAnimEnd(struct Sprite *sprite)\n{\n    bool8 affineAnimEnded = FALSE;\n    u8 battlerId = sprite->sBattler;\n\n    gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE;\n    if (sprite->animEnded)\n        sprite->invisible = TRUE;\n    if (gSprites[gBattlerSpriteIds[battlerId]].affineAnimEnded)\n    {\n        StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battlerId]], BATTLER_AFFINE_NORMAL);\n        affineAnimEnded = TRUE;\n    }\n    else\n    {\n        gSprites[gBattlerSpriteIds[battlerId]].data[1] -= 288;\n        gSprites[gBattlerSpriteIds[battlerId]].y2 = gSprites[gBattlerSpriteIds[battlerId]].data[1] >> 8;\n    }\n    if (sprite->animEnded && affineAnimEnded)\n    {\n        s32 i, doneBattlers;\n\n        gSprites[gBattlerSpriteIds[battlerId]].y2 = 0;\n        gDoingBattleAnim = FALSE;\n        gBattleSpritesDataPtr->healthBoxesData[battlerId].ballAnimActive = FALSE;\n        FreeSpriteOamMatrix(sprite);\n        DestroySprite(sprite);\n\n        for (doneBattlers = 0, i = 0; i < MAX_BATTLERS_COUNT; i++)\n        {\n            if (gBattleSpritesDataPtr->healthBoxesData[i].ballAnimActive == FALSE)\n                doneBattlers++;\n        }\n        if (doneBattlers == MAX_BATTLERS_COUNT)\n        {\n            for (i = 0; i < POKEBALL_COUNT; i++)\n                FreeBallGfx(i);\n        }\n    }\n}\n\nstatic void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite)\n{\n    u8 battlerId = sprite->sBattler;\n\n    sprite->data[4]++;\n    if (sprite->data[4] == 40)\n    {\n        return;\n    }\n    else if (sprite->data[4] == 95)\n    {\n        gDoingBattleAnim = FALSE;\n        m4aMPlayAllStop();\n        PlaySE(MUS_CAUGHT_INTRO);\n    }\n    else if (sprite->data[4] == 315)\n    {\n        FreeOamMatrix(gSprites[gBattlerSpriteIds[sprite->sBattler]].oam.matrixNum);\n        DestroySprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);\n        DestroySpriteAndFreeResources(sprite);\n        if (gMain.inBattle)\n            gBattleSpritesDataPtr->healthBoxesData[battlerId].ballAnimActive = FALSE;\n    }\n}\n\nstatic void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite)\n{\n    sprite->data[0] = 25;\n    sprite->data[2] = GetBattlerSpriteCoord(sprite->sBattler, BATTLER_COORD_X_2);\n    sprite->data[4] = GetBattlerSpriteCoord(sprite->sBattler, BATTLER_COORD_Y_PIC_OFFSET) + 24;\n    sprite->data[5] = -30;\n    sprite->oam.affineParam = sprite->sBattler;\n    InitAnimArcTranslation(sprite);\n    sprite->callback = SpriteCB_PlayerMonSendOut_2;\n}\n\n#define HIBYTE(x) (((x) >> 8) & 0xFF)\n\nstatic void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite)\n{\n    u32 r6;\n    u32 r7;\n\n    if (HIBYTE(sprite->data[7]) >= 35 && HIBYTE(sprite->data[7]) < 80)\n    {\n        s16 r4;\n\n        if ((sprite->oam.affineParam & 0xFF00) == 0)\n        {\n            r6 = sprite->data[1] & 1;\n            r7 = sprite->data[2] & 1;\n            sprite->data[1] = ((sprite->data[1] / 3) & ~1) | r6;\n            sprite->data[2] = ((sprite->data[2] / 3) & ~1) | r7;\n            StartSpriteAffineAnim(sprite, 4);\n        }\n        r4 = sprite->data[0];\n        AnimTranslateLinear(sprite);\n        sprite->data[7] += sprite->sBattler / 3;\n        sprite->y2 += Sin(HIBYTE(sprite->data[7]), sprite->data[5]);\n        sprite->oam.affineParam += 0x100;\n        if ((sprite->oam.affineParam >> 8) % 3 != 0)\n            sprite->data[0] = r4;\n        else\n            sprite->data[0] = r4 - 1;\n        if (HIBYTE(sprite->data[7]) >= 80)\n        {\n            r6 = sprite->data[1] & 1;\n            r7 = sprite->data[2] & 1;\n            sprite->data[1] = ((sprite->data[1] * 3) & ~1) | r6;\n            sprite->data[2] = ((sprite->data[2] * 3) & ~1) | r7;\n        }\n    }\n    else\n    {\n        if (TranslateAnimHorizontalArc(sprite))\n        {\n            sprite->x += sprite->x2;\n            sprite->y += sprite->y2;\n            sprite->y2 = 0;\n            sprite->x2 = 0;\n            sprite->sBattler = sprite->oam.affineParam & 0xFF;\n            sprite->data[0] = 0;\n\n            if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive\n             && sprite->sBattler == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT))\n                sprite->callback = SpriteCB_ReleaseMon2FromBall;\n            else\n                sprite->callback = SpriteCB_ReleaseMonFromBall;\n\n            StartSpriteAffineAnim(sprite, 0);\n        }\n    }\n}\n\nstatic void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite)\n{\n    if (sprite->data[0]++ > 24)\n    {\n        sprite->data[0] = 0;\n        sprite->callback = SpriteCB_ReleaseMonFromBall;\n    }\n}\n\nstatic void SpriteCB_OpponentMonSendOut(struct Sprite *sprite)\n{\n    sprite->data[0]++;\n    if (sprite->data[0] > 15)\n    {\n        sprite->data[0] = 0;\n        if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive\n         && sprite->sBattler == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))\n            sprite->callback = SpriteCB_ReleaseMon2FromBall;\n        else\n            sprite->callback = SpriteCB_ReleaseMonFromBall;\n    }\n}\n\n#undef sBattler\n\nstatic u8 AnimateBallOpenParticlesForPokeball(u8 x, u8 y, u8 kindOfStars, u8 subpriority)\n{\n    return AnimateBallOpenParticles(x, y, kindOfStars, subpriority, BALL_POKE);\n}\n\nstatic u8 LaunchBallFadeMonTaskForPokeball(bool8 unFadeLater, u8 spritePalNum, u32 selectedPalettes)\n{\n    return LaunchBallFadeMonTask(unFadeLater, spritePalNum, selectedPalettes, BALL_POKE);\n}\n\n// Sprite data for the pokeball\n#define sMonSpriteId data[0]\n#define sDelay       data[1]\n#define sMonPalNum   data[2]\n#define sFadePalsLo  data[3]\n#define sFadePalsHi  data[4]\n#define sFinalMonX   data[5]\n#define sFinalMonY   data[6]\n#define sTrigIdx     data[7]\n\n// Pokeball in Oak intro, and when receiving via trade\nvoid CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 delay, u32 fadePalettes)\n{\n    u8 spriteId;\n\n    LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[BALL_POKE]);\n    LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[BALL_POKE]);\n    spriteId = CreateSprite(&gBallSpriteTemplates[BALL_POKE], x, y, subpriortiy);\n\n    gSprites[spriteId].sMonSpriteId = monSpriteId;\n    gSprites[spriteId].sFinalMonX = gSprites[monSpriteId].x;\n    gSprites[spriteId].sFinalMonY = gSprites[monSpriteId].y;\n\n    gSprites[monSpriteId].x = x;\n    gSprites[monSpriteId].y = y;\n\n    gSprites[spriteId].sDelay = delay;\n    gSprites[spriteId].sMonPalNum = monPalNum;\n    gSprites[spriteId].sFadePalsLo = fadePalettes;\n    gSprites[spriteId].sFadePalsHi = fadePalettes >> 16;\n    gSprites[spriteId].oam.priority = oamPriority;\n    gSprites[spriteId].callback = SpriteCB_PokeballReleaseMon;\n\n    gSprites[monSpriteId].invisible = TRUE;\n}\n\nstatic void SpriteCB_PokeballReleaseMon(struct Sprite *sprite)\n{\n    if (sprite->sDelay == 0)\n    {\n        u8 subpriority;\n        u8 spriteId = sprite->sMonSpriteId;\n        u8 monPalNum = sprite->sMonPalNum;\n        u32 selectedPalettes = (u16)sprite->sFadePalsLo | ((u16)sprite->sFadePalsHi << 16);\n\n        if (sprite->subpriority != 0)\n            subpriority = sprite->subpriority - 1;\n        else\n            subpriority = 0;\n\n        StartSpriteAnim(sprite, 1);\n        AnimateBallOpenParticlesForPokeball(sprite->x, sprite->y - 5, sprite->oam.priority, subpriority);\n        // sDelay re-used to store task id but never read\n        sprite->sDelay = LaunchBallFadeMonTaskForPokeball(TRUE, monPalNum, selectedPalettes);\n        sprite->callback = SpriteCB_ReleasedMonFlyOut;\n        gSprites[spriteId].invisible = FALSE;\n        StartSpriteAffineAnim(&gSprites[spriteId], BATTLER_AFFINE_EMERGE);\n        AnimateSprite(&gSprites[spriteId]);\n        gSprites[spriteId].data[1] = 0x1000;\n        sprite->sTrigIdx = 0;\n    }\n    else\n    {\n        sprite->sDelay--;\n    }\n}\n\nstatic void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite)\n{\n    bool8 emergeAnimFinished = FALSE;\n    bool8 atFinalPosition = FALSE;\n    u8 monSpriteId = sprite->sMonSpriteId;\n    u16 x, y;\n\n    if (sprite->animEnded)\n        sprite->invisible = TRUE;\n\n    if (gSprites[monSpriteId].affineAnimEnded)\n    {\n        StartSpriteAffineAnim(&gSprites[monSpriteId], BATTLER_AFFINE_NORMAL);\n        emergeAnimFinished = TRUE;\n    }\n\n    x = (sprite->sFinalMonX - sprite->x) * sprite->sTrigIdx / 128 + sprite->x;\n    y = (sprite->sFinalMonY - sprite->y) * sprite->sTrigIdx / 128 + sprite->y;\n    gSprites[monSpriteId].x = x;\n    gSprites[monSpriteId].y = y;\n\n    if (sprite->sTrigIdx < 128)\n    {\n        s16 sine = -(gSineTable[(u8)sprite->sTrigIdx] / 8);\n\n        sprite->sTrigIdx += 4;\n        gSprites[monSpriteId].x2 = sine;\n        gSprites[monSpriteId].y2 = sine;\n    }\n    else\n    {\n        gSprites[monSpriteId].x = sprite->sFinalMonX;\n        gSprites[monSpriteId].y = sprite->sFinalMonY;\n        gSprites[monSpriteId].x2 = 0;\n        gSprites[monSpriteId].y2 = 0;\n        atFinalPosition = TRUE;\n    }\n    if (sprite->animEnded && emergeAnimFinished && atFinalPosition)\n    {\n        DestroySpriteAndFreeResources(sprite);\n    }\n}\n\n#undef sFinalMonX\n#undef sFinalMonY\n#undef sTrigIdx\n\n#define sTimer       data[5]\n\nu8 CreateTradePokeballSprite(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 delay, u32 fadePalettes)\n{\n    u8 spriteId;\n\n    LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[BALL_POKE]);\n    LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[BALL_POKE]);\n    spriteId = CreateSprite(&gBallSpriteTemplates[BALL_POKE], x, y, subPriority);\n    gSprites[spriteId].sMonSpriteId = monSpriteId;\n    gSprites[spriteId].sDelay = delay;\n    gSprites[spriteId].sMonPalNum = monPalNum;\n    gSprites[spriteId].sFadePalsLo = fadePalettes;\n    gSprites[spriteId].sFadePalsHi = fadePalettes >> 16;\n    gSprites[spriteId].oam.priority = oamPriority;\n    gSprites[spriteId].callback = SpriteCB_TradePokeball;\n    return spriteId;\n}\n\nstatic void SpriteCB_TradePokeball(struct Sprite *sprite)\n{\n    if (sprite->sDelay == 0)\n    {\n        u8 subpriority;\n        u8 monSpriteId = sprite->sMonSpriteId;\n        u8 monPalNum = sprite->sMonPalNum;\n        u32 selectedPalettes = (u16)sprite->sFadePalsLo | ((u16)sprite->sFadePalsHi << 16);\n\n        if (sprite->subpriority != 0)\n            subpriority = sprite->subpriority - 1;\n        else\n            subpriority = 0;\n\n        StartSpriteAnim(sprite, 1);\n        AnimateBallOpenParticlesForPokeball(sprite->x, sprite->y - 5, sprite->oam.priority, subpriority);\n        // sDelay re-used to store task id but never read\n        sprite->sDelay = LaunchBallFadeMonTaskForPokeball(TRUE, monPalNum, selectedPalettes);\n        sprite->callback = SpriteCB_TradePokeballSendOff;\n#ifdef BUGFIX\n        // FIX: If this is used on a sprite that has previously had an affine animation, it will not\n        // play the shrink anim properly due to being paused.\n        gSprites[monSpriteId].affineAnimPaused = FALSE;\n#endif // BUGFIX\n        StartSpriteAffineAnim(&gSprites[monSpriteId], BATTLER_AFFINE_RETURN);\n        AnimateSprite(&gSprites[monSpriteId]);\n        gSprites[monSpriteId].data[1] = 0;\n    }\n    else\n    {\n        sprite->sDelay--;\n    }\n}\n\nstatic void SpriteCB_TradePokeballSendOff(struct Sprite *sprite)\n{\n    u8 monSpriteId;\n\n    sprite->sTimer++;\n    if (sprite->sTimer == 11)\n        PlaySE(SE_BALL_TRADE);\n\n    monSpriteId = sprite->sMonSpriteId;\n    if (gSprites[monSpriteId].affineAnimEnded)\n    {\n        StartSpriteAnim(sprite, 2);\n        gSprites[monSpriteId].invisible = TRUE;\n        sprite->sTimer = 0;\n        sprite->callback = SpriteCB_TradePokeballEnd;\n    }\n    else\n    {\n        gSprites[monSpriteId].data[1] += 96;\n        gSprites[monSpriteId].y2 = -gSprites[monSpriteId].data[1] >> 8;\n    }\n}\n\nstatic void SpriteCB_TradePokeballEnd(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n        sprite->callback = SpriteCallbackDummy;\n}\n\n#undef sMonSpriteId\n#undef sDelay\n#undef sMonPalNum\n#undef sFadePalsLo\n#undef sFadePalsHi\n#undef sTimer\n\n// Unreferenced in RSE, but used here, possibly by mistake.\nvoid DestroySpriteAndFreeResources_Ball(struct Sprite *sprite)\n{\n    DestroySpriteAndFreeResources(sprite);\n}\n\n#define sSpeedX data[0]\n#define sSpeedY data[1]\n\n#define sDelayTimer data[1]\n\nvoid StartHealthboxSlideIn(u8 battlerId)\n{\n    struct Sprite *healthboxSprite = &gSprites[gHealthboxSpriteIds[battlerId]];\n\n    healthboxSprite->sSpeedX = 5;\n    healthboxSprite->sSpeedY = 0;\n    healthboxSprite->x2 = 0x73;\n    healthboxSprite->y2 = 0;\n    healthboxSprite->callback = SpriteCB_HealthboxSlideIn;\n    if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n    {\n        healthboxSprite->sSpeedX = -healthboxSprite->sSpeedX;\n        healthboxSprite->sSpeedY = -healthboxSprite->sSpeedY;\n        healthboxSprite->x2 = -healthboxSprite->x2;\n        healthboxSprite->y2 = -healthboxSprite->y2;\n    }\n    gSprites[healthboxSprite->data[5]].callback(&gSprites[healthboxSprite->data[5]]);\n    if (GetBattlerPosition(battlerId) == B_POSITION_PLAYER_RIGHT)\n        healthboxSprite->callback = SpriteCB_HealthboxSlideInDelayed;\n}\n\nstatic void SpriteCB_HealthboxSlideInDelayed(struct Sprite *sprite)\n{\n    sprite->sDelayTimer++;\n    if (sprite->sDelayTimer == 20)\n    {\n        sprite->sDelayTimer = 0;\n        sprite->callback = SpriteCB_HealthboxSlideIn;\n    }\n}\n\nstatic void SpriteCB_HealthboxSlideIn(struct Sprite *sprite)\n{\n    sprite->x2 -= sprite->sSpeedX;\n    sprite->y2 -= sprite->sSpeedY;\n    if (sprite->x2 == 0 && sprite->y2 == 0)\n        sprite->callback = SpriteCallbackDummy;\n}\n\n#undef sSpeedX\n#undef sSpeedY\n#undef sDelayTimer\n\nvoid DoHitAnimHealthboxEffect(u8 battlerId)\n{\n    u8 spriteId;\n\n    spriteId = CreateInvisibleSpriteWithCallback(SpriteCB_HitAnimHealthoxEffect);\n    gSprites[spriteId].data[0] = 1;\n    gSprites[spriteId].data[1] = gHealthboxSpriteIds[battlerId];\n    gSprites[spriteId].callback = SpriteCB_HitAnimHealthoxEffect;\n}\n\nstatic void SpriteCB_HitAnimHealthoxEffect(struct Sprite *sprite)\n{\n    u8 r1 = sprite->data[1];\n\n    gSprites[r1].y2 = sprite->data[0];\n    sprite->data[0] = -sprite->data[0];\n    sprite->data[2]++;\n    if (sprite->data[2] == 21)\n    {\n        gSprites[r1].x2 = 0;\n        gSprites[r1].y2 = 0;\n        DestroySprite(sprite);\n    }\n}\n\nvoid LoadBallGfx(u8 ballId)\n{\n    u16 var;\n\n    if (GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag) == TAG_NONE)\n    {\n        LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[ballId]);\n        LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[ballId]);\n    }\n\n    switch (ballId)\n    {\n    case BALL_DIVE:\n    case BALL_LUXURY:\n    case BALL_PREMIER:\n        break;\n    default:\n        var = GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag);\n        LZDecompressVram(gOpenPokeballGfx, (void *)(OBJ_VRAM0 + 0x100 + var * 32));\n        break;\n    }\n}\n\nvoid FreeBallGfx(u8 ballId)\n{\n    FreeSpriteTilesByTag(gBallSpriteSheets[ballId].tag);\n    FreeSpritePaletteByTag(gBallSpritePalettes[ballId].tag);\n}\n\nstatic u16 GetBattlerPokeballItemId(u8 battlerId)\n{\n    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n        return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL);\n    else\n        return GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL);\n}\n\n"
  },
  {
    "path": "src/pokedex.c",
    "content": "#include \"global.h\"\n#include \"pokedex.h\"\n#include \"pokedex_screen.h\"\n\n// Unused\nconst u8 *GetPokedexCategoryName(u16 dexNum)\n{\n    return gPokedexEntries[dexNum].categoryName;\n}\n\nu16 GetPokedexHeightWeight(u16 dexNum, u8 data)\n{\n    switch (data)\n    {\n    case 0:  // height\n        return gPokedexEntries[dexNum].height;\n    case 1:  // weight\n        return gPokedexEntries[dexNum].weight;\n    default:\n        return 1;\n    }\n}\n\ns8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID)\n{\n    return DexScreen_GetSetPokedexFlag(nationalDexNo, caseID, 0);\n}\n\nu16 GetNationalPokedexCount(u8 caseID)\n{\n    u16 count = 0;\n    u32 i;\n\n    for (i = 0; i < NATIONAL_DEX_COUNT; i++)\n    {\n        switch (caseID)\n        {\n        case FLAG_GET_SEEN:\n            if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN))\n                count++;\n            break;\n        case FLAG_GET_CAUGHT:\n            if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))\n                count++;\n            break;\n        }\n    }\n    return count;\n}\n\n/*\nu16 GetHoennPokedexCount(u8 caseID)\n{\n    u16 count = 0;\n    u16 i;\n\n    for (i = 0; i < HOENN_DEX_COUNT; i++)\n    {\n        switch (caseID)\n        {\n        case FLAG_GET_SEEN:\n            if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_SEEN))\n                count++;\n            break;\n        case FLAG_GET_CAUGHT:\n            if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT))\n                count++;\n            break;\n        }\n    }\n    return count;\n}\n*/\n\nu16 GetKantoPokedexCount(u8 caseID)\n{\n    u16 count = 0;\n    u32 i;\n\n    for (i = 0; i < KANTO_DEX_COUNT; i++)\n    {\n        switch (caseID)\n        {\n        case FLAG_GET_SEEN:\n            if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN))\n                count++;\n            break;\n        case FLAG_GET_CAUGHT:\n            if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))\n                count++;\n            break;\n        }\n    }\n    return count;\n}\n\nu16 GetExtendedPokedexCount(u8 caseID)\n{\n    u16 count = 0;\n    u32 i;\n\n    for (i = 0; i < EXTENDED_DEX_COUNT; i++)\n    {\n        switch (caseID)\n        {\n        case FLAG_GET_SEEN:\n            if (GetSetPokedexFlag(ExtendedToNationalOrder(i + 1), FLAG_GET_SEEN))\n                count++;\n            break;\n        case FLAG_GET_CAUGHT:\n            if (GetSetPokedexFlag(ExtendedToNationalOrder(i + 1), FLAG_GET_CAUGHT))\n                count++;\n            break;\n        }\n    }\n    return count;\n}\n\nbool16 HasAllHoennMons(void)\n{\n    u32 i;\n\n    // -2 excludes Jirachi and Deoxys\n    for (i = 0; i < HOENN_DEX_COUNT - 2; i++)\n    {\n        if (!GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT))\n            return FALSE;\n    }\n    return TRUE;\n}\n\nbool16 HasAllExtendedMons(void)\n{\n    u32 i;\n\n    for (i = 0; i < EXTENDED_DEX_COUNT - 2; i++)\n    {\n        if (!GetSetPokedexFlag(ExtendedToNationalOrder(i + 1), FLAG_GET_CAUGHT))\n            return FALSE;\n    }\n    return TRUE;\n}\n\nbool16 HasAllKantoMons(void)\n{\n    u32 i;\n\n    // -1 excludes Mew\n    for (i = 0; i < KANTO_DEX_COUNT - 1; i++)\n    {\n        if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))\n            return FALSE;\n    }\n    return TRUE;\n}\n\nbool16 HasAllMons(void)\n{\n    u32 i;\n\n    // -1 excludes Mew\n    for (i = 0; i < KANTO_DEX_COUNT - 1; i++)\n    {\n        if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))\n            return FALSE;\n    }\n\n    // -3 excludes Lugia, Ho-Oh, and Celebi\n    for (i = KANTO_DEX_COUNT; i < JOHTO_DEX_COUNT - 3; i++)\n    {\n        if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))\n            return FALSE;\n    }\n\n    // -2 excludes Jirachi and Deoxys\n    for (i = JOHTO_DEX_COUNT; i < NATIONAL_DEX_COUNT - 2; i++)\n    {\n        if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))\n            return FALSE;\n    }\n    return TRUE;\n}\n\nbool16 HasNationalMon(void)\n{   // checks if the player has a mon not in the Extended Dex\n    u32 i;\n\n    for (i = EXTENDED_DEX_COUNT + 1; i < NATIONAL_DEX_COUNT; i++)\n    {\n        if (GetSetPokedexFlag(ExtendedToNationalOrder(i + 1), FLAG_GET_CAUGHT))\n            return TRUE;\n    }\n    return FALSE;\n}\n\nbool16 HasAllKantoMonsNew(void)\n{   // separate from the old one because of link Trainer cards\n    // this one includes Mew.\n    u32 i;\n\n    for (i = 0; i < KANTO_DEX_COUNT; i++)\n    {\n        if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))\n            return FALSE;\n    }\n    return TRUE;\n}\n\nbool16 HasAllMonsNew(void)\n{   // separate from the old one because of link Trainer cards\n    // this one includes obtainable mythicals.\n    u32 i;\n\n    for (i = 0; i < NATIONAL_DEX_HO_OH; i++)\n    {\n        if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))\n            return FALSE;\n    }\n    for (i = NATIONAL_DEX_CELEBI; i < NATIONAL_DEX_RAYQUAZA; i++)\n    {\n        if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))\n            return FALSE;\n    }\n    if (!GetSetPokedexFlag(NATIONAL_DEX_DEOXYS, FLAG_GET_CAUGHT))\n            return FALSE;\n    return TRUE;\n}"
  },
  {
    "path": "src/pokedex_area_markers.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"task.h\"\n#include \"wild_pokemon_area.h\"\n#include \"pokedex_area_markers.h\"\n#include \"pokedex.h\"\n\n/*\n    Controls the red ellipse markers that appear on the pokedex maps to show where a species is found.\n    All of the markers together are a single sprite, with each individual marker being represented by\n    a subsprite of the necessary size and shape.\n\n    The data about each area marker is in sAreaMarkers, each specified by a DEX_AREA constant.\n    A MAPSEC is associated with a DEX_AREA constant by a series of arrays in wild_pokemon_area.c\n*/\n\nstruct PAM_TaskData\n{\n    struct SubspriteTable subsprites;\n    void *buffer;\n    u8 unused;\n    u8 spriteId;\n    u16 tilesTag;\n    u16 paletteTag; // Never read\n};\n\nenum {\n    MARKER_CIRCULAR,\n    MARKER_SMALL_H,\n    MARKER_SMALL_V,\n    MARKER_MED_H,\n    MARKER_MED_V,\n    MARKER_LARGE_H,\n    MARKER_LARGE_V,\n};\n\nstatic const u16 sMarkerPal[] = INCBIN_U16(\"graphics/pokedex/area_markers/marker.gbapal\");\nstatic const u32 sMarkerTiles[] = INCBIN_U32(\"graphics/pokedex/area_markers/marker.4bpp.lz\");\n\nstatic const struct Subsprite sSubsprite_Circular = {\n    .size = SPRITE_SIZE(8x8),\n    .shape = SPRITE_SHAPE(8x8),\n    .priority = 1,\n    .tileOffset = 0\n};\n\nstatic const struct Subsprite sSubsprite_SmallHorizontal = {\n    .size = SPRITE_SIZE(16x8),\n    .shape = SPRITE_SHAPE(16x8),\n    .priority = 1,\n    .tileOffset = 1\n};\n\nstatic const struct Subsprite sSubsprite_SmallVertical = {\n    .size = SPRITE_SIZE(8x16),\n    .shape = SPRITE_SHAPE(8x16),\n    .priority = 1,\n    .tileOffset = 3\n};\n\nstatic const struct Subsprite sSubsprite_MediumHorizontal = {\n    .size = SPRITE_SIZE(32x16),\n    .shape = SPRITE_SHAPE(32x16),\n    .priority = 1,\n    .tileOffset = 5\n};\n\nstatic const struct Subsprite sSubsprite_MediumVertical = {\n    .size = SPRITE_SIZE(16x32),\n    .shape = SPRITE_SHAPE(16x32),\n    .priority = 1,\n    .tileOffset = 13\n};\n\nstatic const struct Subsprite sSubsprite_LargeHorizontal = {\n    .size = SPRITE_SIZE(32x16),\n    .shape = SPRITE_SHAPE(32x16),\n    .priority = 1,\n    .tileOffset = 21\n};\n\nstatic const struct Subsprite sSubsprite_LargeVertical = {\n    .size = SPRITE_SIZE(16x32),\n    .shape = SPRITE_SHAPE(16x32),\n    .priority = 1,\n    .tileOffset = 29\n};\n\n\nstatic const struct Subsprite *const sSubsprites[] = {\n    [MARKER_CIRCULAR] = &sSubsprite_Circular,\n    [MARKER_SMALL_H]  = &sSubsprite_SmallHorizontal,\n    [MARKER_SMALL_V]  = &sSubsprite_SmallVertical,\n    [MARKER_MED_H]    = &sSubsprite_MediumHorizontal,\n    [MARKER_MED_V]    = &sSubsprite_MediumVertical,\n    [MARKER_LARGE_H]  = &sSubsprite_LargeHorizontal,\n    [MARKER_LARGE_V]  = &sSubsprite_LargeVertical\n};\n\nstatic const s8 sAreaMarkers[][4] = {\n                                  // Marker,          x,    y\n    [DEX_AREA_NONE]             = {},\n    [DEX_AREA_PALLET_TOWN]      = { MARKER_CIRCULAR,  54,  44 },\n    [DEX_AREA_VIRIDIAN_CITY]    = { MARKER_CIRCULAR,  54,  28 },\n    [DEX_AREA_PEWTER_CITY]      = { MARKER_CIRCULAR,  54,  12 },\n    [DEX_AREA_CERULEAN_CITY]    = { MARKER_CIRCULAR,  92,  12 },\n    [DEX_AREA_LAVENDER_TOWN]    = { MARKER_CIRCULAR, 110,  24 },\n    [DEX_AREA_VERMILION_CITY]   = { MARKER_CIRCULAR,  92,  36 },\n    [DEX_AREA_CELADON_CITY]     = { MARKER_CIRCULAR,  76,  24 },\n    [DEX_AREA_FUCHSIA_CITY]     = { MARKER_CIRCULAR,  78,  52 },\n    [DEX_AREA_CINNABAR_ISLAND]  = { MARKER_CIRCULAR,  54,  62 },\n    [DEX_AREA_INDIGO_PLATEAU]   = { MARKER_CIRCULAR,  42,   2 },\n    [DEX_AREA_SAFFRON_CITY]     = { MARKER_CIRCULAR,  92,  24 },\n    [DEX_AREA_ROUTE_1]          = { MARKER_SMALL_V,   54,  32 },\n    [DEX_AREA_ROUTE_2]          = { MARKER_SMALL_V,   54,  16 },\n    [DEX_AREA_ROUTE_3]          = { MARKER_SMALL_H,   61,  12 },\n    [DEX_AREA_ROUTE_4]          = { MARKER_SMALL_H,   77,  12 },\n    [DEX_AREA_ROUTE_5]          = { MARKER_CIRCULAR,  92,  18 },\n    [DEX_AREA_ROUTE_6]          = { MARKER_CIRCULAR,  92,  30 },\n    [DEX_AREA_ROUTE_7]          = { MARKER_CIRCULAR,  84,  24 },\n    [DEX_AREA_ROUTE_8]          = { MARKER_SMALL_H,   98,  24 },\n    [DEX_AREA_ROUTE_9]          = { MARKER_SMALL_H,   98,  12 },\n    [DEX_AREA_ROUTE_10]         = { MARKER_SMALL_V,  110,  12 },\n    [DEX_AREA_ROUTE_11]         = { MARKER_SMALL_H,   98,  36 },\n    [DEX_AREA_ROUTE_12]         = { MARKER_MED_V,    106,  25 },\n    [DEX_AREA_ROUTE_13]         = { MARKER_SMALL_H,  100,  46 },\n    [DEX_AREA_ROUTE_14]         = { MARKER_SMALL_V,   94,  45 },\n    [DEX_AREA_ROUTE_15]         = { MARKER_SMALL_H,   85,  52 },\n    [DEX_AREA_ROUTE_16]         = { MARKER_CIRCULAR,  68,  24 },\n    [DEX_AREA_ROUTE_17]         = { MARKER_MED_V,     62,  26 },\n    [DEX_AREA_ROUTE_18]         = { MARKER_SMALL_H,   64,  52 },\n    [DEX_AREA_ROUTE_19]         = { MARKER_CIRCULAR,  78,  60 },\n    [DEX_AREA_ROUTE_20]         = { MARKER_MED_H,     55,  58 },\n    [DEX_AREA_ROUTE_21]         = { MARKER_SMALL_V,   54,  50 },\n    [DEX_AREA_ROUTE_22]         = { MARKER_SMALL_H,   40,  28 },\n    [DEX_AREA_ROUTE_23]         = { MARKER_MED_V,     38,   4 },\n    [DEX_AREA_ROUTE_24]         = { MARKER_CIRCULAR,  92,   4 },\n    [DEX_AREA_ROUTE_25]         = { MARKER_MED_H,     90,  -2 },\n    [DEX_AREA_VIRIDIAN_FOREST]  = { MARKER_CIRCULAR,  51,  20 },\n    [DEX_AREA_DIGLETTS_CAVE]    = { MARKER_SMALL_H,   61,  18 },\n    [DEX_AREA_MT_MOON]          = { MARKER_CIRCULAR,  72,   8 },\n    [DEX_AREA_CERULEAN_CAVE]    = { MARKER_CIRCULAR,  87,   8 },\n    [DEX_AREA_ROCK_TUNNEL]      = { MARKER_CIRCULAR, 112,  14 },\n    [DEX_AREA_POWER_PLANT]      = { MARKER_CIRCULAR, 113,  20 },\n    [DEX_AREA_POKEMON_TOWER]    = { MARKER_CIRCULAR, 113,  25 },\n    [DEX_AREA_SAFARI_ZONE]      = { MARKER_SMALL_H,   78,  44 },\n    [DEX_AREA_SEAFOAM_ISLANDS]  = { MARKER_CIRCULAR,  65,  60 },\n    [DEX_AREA_POKEMON_MANSION]  = { MARKER_CIRCULAR,  52,  62 },\n    [DEX_AREA_VICTORY_ROAD]     = { MARKER_CIRCULAR,  45,   7 },\n    [DEX_AREA_ONE_ISLAND]       = { MARKER_CIRCULAR,  10,  10 },\n    [DEX_AREA_TWO_ISLAND]       = { MARKER_CIRCULAR,  12,  35 },\n    [DEX_AREA_THREE_ISLAND]     = { MARKER_CIRCULAR,  14,  52 },\n    [DEX_AREA_FOUR_ISLAND]      = { MARKER_CIRCULAR,  12,  84 },\n    [DEX_AREA_FIVE_ISLAND]      = { MARKER_CIRCULAR,  45,  81 },\n    [DEX_AREA_SIX_ISLAND]       = { MARKER_CIRCULAR,  76,  84 },\n    [DEX_AREA_SEVEN_ISLAND]     = { MARKER_CIRCULAR, 104,  82 },\n    [DEX_AREA_KINDLE_ROAD]      = { MARKER_SMALL_V,   14,   2 },\n    [DEX_AREA_TREASURE_BEACH]   = { MARKER_CIRCULAR,  10,  15 },\n    [DEX_AREA_CAPE_BRINK]       = { MARKER_CIRCULAR,  12,  29 },\n    [DEX_AREA_BOND_BRIDGE]      = { MARKER_SMALL_H,    2,  52 },\n    [DEX_AREA_THREE_ISLE_PATH]  = { MARKER_SMALL_H,   12,  56 },\n    [DEX_AREA_RESORT_GORGEOUS]  = { MARKER_SMALL_H,   44,  74 },\n    [DEX_AREA_WATER_LABYRINTH]  = { MARKER_SMALL_H,   36,  78 },\n    [DEX_AREA_FIVE_ISLE_MEADOW] = { MARKER_SMALL_V,   48,  80 },\n    [DEX_AREA_MEMORIAL_PILLAR]  = { MARKER_SMALL_V,   52,  86 },\n    [DEX_AREA_OUTCAST_ISLAND]   = { MARKER_CIRCULAR,  72,  74 },\n    [DEX_AREA_GREEN_PATH]       = { MARKER_SMALL_H,   72,  78 },\n    [DEX_AREA_WATER_PATH]       = { MARKER_SMALL_V,   81,  80 },\n    [DEX_AREA_RUIN_VALLEY]      = { MARKER_CIRCULAR,  76,  92 },\n    [DEX_AREA_TRAINER_TOWER]    = { MARKER_CIRCULAR, 104,  75 },\n    [DEX_AREA_CANYON_ENTRANCE]  = { MARKER_CIRCULAR, 104,  86 },\n    [DEX_AREA_SEVAULT_CANYON]   = { MARKER_SMALL_V,  108,  83 },\n    [DEX_AREA_TANOBY_RUINS]     = { MARKER_MED_H,     96,  90 },\n    [DEX_AREA_MT_EMBER]         = { MARKER_CIRCULAR,  14,   1 },\n    [DEX_AREA_BERRY_FOREST]     = { MARKER_CIRCULAR,   5,  52 },\n    [DEX_AREA_ICEFALL_CAVE]     = { MARKER_CIRCULAR,  13,  80 },\n    [DEX_AREA_LOST_CAVE]        = { MARKER_CIRCULAR,  54,  74 },\n    [DEX_AREA_ALTERING_CAVE]    = { MARKER_CIRCULAR,  69,  73 },\n    [DEX_AREA_PATTERN_BUSH]     = { MARKER_CIRCULAR,  76,  77 },\n    [DEX_AREA_DOTTED_HOLE]      = { MARKER_CIRCULAR,  73,  95 },\n    [DEX_AREA_TANOBY_CHAMBER]   = { MARKER_MED_H,     96,  90 },\n};\n\nstatic void Task_ShowAreaMarkers(u8 taskId)\n{\n    struct PAM_TaskData * data = (void *)gTasks[taskId].data;\n    gSprites[data->spriteId].invisible = FALSE;\n}\n\nu8 CreatePokedexAreaMarkers(u16 species, u16 tilesTag, u8 palIdx, u8 y)\n{\n    struct SpriteTemplate spriteTemplate;\n    struct CompressedSpriteSheet spriteSheet;\n    u8 taskId;\n    struct PAM_TaskData * data;\n    struct Subsprite * subsprites;\n\n    // Load gfx\n    spriteSheet.data = sMarkerTiles;\n    spriteSheet.size = 0x4A0;\n    spriteSheet.tag = tilesTag;\n    LoadCompressedSpriteSheet(&spriteSheet);\n    LoadPalette(sMarkerPal, OBJ_PLTT_ID(palIdx), sizeof(sMarkerPal));\n\n    // Get marker subsprites\n    taskId = CreateTask(Task_ShowAreaMarkers, 0);\n    data = (void *)gTasks[taskId].data;\n    data->unused = 0;\n    data->tilesTag = tilesTag;\n    data->paletteTag = TAG_NONE;\n    subsprites = Alloc(120 * sizeof(struct Subsprite));\n    data->buffer = subsprites;\n    data->subsprites.subsprites = subsprites;\n    data->subsprites.subspriteCount = GetSpeciesPokedexAreaMarkers(species, subsprites);\n\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_BD);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8));\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_CLR);\n\n    // Set marker subsprites on full sprite\n    spriteTemplate = gDummySpriteTemplate;\n    spriteTemplate.tileTag = tilesTag;\n    data->spriteId = CreateSprite(&spriteTemplate, 104, y + 32, 0);\n    SetSubspriteTables(&gSprites[data->spriteId], &data->subsprites);\n    gSprites[data->spriteId].oam.objMode = ST_OAM_OBJ_WINDOW;\n    gSprites[data->spriteId].oam.paletteNum = palIdx;\n    gSprites[data->spriteId].subspriteTableNum = 0;\n    gSprites[data->spriteId].invisible = TRUE;\n\n    // Show markers\n    HideBg(1);\n    SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);\n    FillBgTilemapBufferRect_Palette0(1, 0x00F, 0, 0, 30, 20);\n    CopyBgTilemapBufferToVram(1);\n    ShowBg(1);\n    return taskId;\n}\n\nvoid DestroyPokedexAreaMarkers(u8 taskId)\n{\n    struct PAM_TaskData * data = (void *)gTasks[taskId].data;\n    FreeSpriteTilesByTag(data->tilesTag);\n    DestroySprite(&gSprites[data->spriteId]);\n    Free(data->buffer);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ);\n    ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);\n    HideBg(1);\n    SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 2);\n    FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);\n    CopyBgTilemapBufferToVram(1);\n    ShowBg(1);\n    DestroyTask(taskId);\n}\n\nvoid GetAreaMarkerSubsprite(s32 i, s32 dexArea, struct Subsprite * subsprites)\n{\n    subsprites[i] = *sSubsprites[sAreaMarkers[dexArea][0]];\n    subsprites[i].x = sAreaMarkers[dexArea][1];\n    subsprites[i].y = sAreaMarkers[dexArea][2];\n}\n\nu8 GetNumPokedexAreaMarkers(u8 taskId)\n{\n    struct PAM_TaskData * data = (void *)gTasks[taskId].data;\n    return data->subsprites.subspriteCount;\n}\n"
  },
  {
    "path": "src/pokedex_screen.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"graphics.h\"\n#include \"m4a.h\"\n#include \"scanline_effect.h\"\n#include \"task.h\"\n#include \"new_menu_helpers.h\"\n#include \"event_data.h\"\n#include \"help_system.h\"\n#include \"menu_indicators.h\"\n#include \"overworld.h\"\n#include \"strings.h\"\n#include \"menu.h\"\n#include \"pokedex_screen.h\"\n#include \"data.h\"\n#include \"pokedex.h\"\n#include \"trainer_pokemon_sprites.h\"\n#include \"decompress.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n#include \"pokedex_area_markers.h\"\n#include \"field_specials.h\"\n\n#define TAG_AREA_MARKERS 2001\n\nenum TextMode {\n    TEXT_LEFT,\n    TEXT_CENTER,\n    TEXT_RIGHT\n};\n\nstruct PokedexScreenData\n{\n    u8 taskId;\n    u8 state;\n    u8 data[2];\n    u8 areaMarkersTaskId;\n    u32 unlockedCategories;\n    u32 modeSelectInput;\n    u16 modeSelectItemsAbove;\n    u16 modeSelectCursorPos;\n    u8 modeSelectWindowId;\n    u8 selectionIconWindowId;\n    u8 dexCountsWindowId;\n    u8 modeSelectListMenuId;\n    u16 pageSpecies[4];\n    u8 categoryMonWindowIds[4];\n    u8 categoryMonInfoWindowIds[4];\n    u8 category;\n    u8 firstPageInCategory;\n    u8 lastPageInCategory;\n    u8 pageNum;\n    u8 numMonsOnPage;\n    u8 categoryCursorPosInPage;\n    u8 categoryPageSelectionCursorTimer;\n    u8 parentOfCategoryMenu;\n    u32 characteristicMenuInput;\n    u16 kantoOrderMenuItemsAbove;\n    u16 kantoOrderMenuCursorPos;\n    u16 characteristicOrderMenuItemsAbove;\n    u16 characteristicOrderMenuCursorPos;\n    u16 nationalOrderMenuItemsAbove;\n    u16 nationalOrderMenuCursorPos;\n    u8 numericalOrderWindowId;\n    u8 orderedListMenuTaskId;\n    u8 dexOrderId;\n    struct ListMenuItem * listItems;\n    u16 orderedDexCount;\n    u8 windowIds[0x10];\n    u16 dexSpecies;\n    u16 * bgBufsMem;\n    u8 scrollArrowsTaskId;\n    u8 categoryPageCursorTaskId;\n    u16 modeSelectCursorPosBak;\n    u8 unlockedSeviiAreas;\n    u16 numSeenKanto;\n    u16 numOwnedKanto;\n    u16 numSeenNational;\n    u16 numOwnedNational;\n};\n\nstruct PokedexScreenWindowGfx\n{\n    const u32 * tiles;\n    const u16 * pal;\n};\n\nstruct PokedexCategoryPage\n{\n    const u16 * species;\n    u8 count;\n};\n\nEWRAM_DATA static struct PokedexScreenData * sPokedexScreenData = NULL;\n\nstatic void Task_PokedexScreen(u8 taskId);\nstatic void DexScreen_InitGfxForTopMenu(void);\nstatic void Task_DexScreen_NumericalOrder(u8 taskId);\nstatic void DexScreen_InitGfxForNumericalOrderList(void);\nstatic void Task_DexScreen_CharacteristicOrder(u8 taskId);\nstatic void DexScreen_CreateCharacteristicListMenu(void);\nstatic u16 DexScreen_CountMonsInOrderedList(u8 orderIdx);\nstatic void DexScreen_InitListMenuForOrderedList(const struct ListMenuTemplate * template, u8 order);\nstatic u8 DexScreen_CreateDexOrderScrollArrows(void);\nstatic void DexScreen_DestroyDexOrderListMenu(u8 order);\nstatic void Task_DexScreen_CategorySubmenu(u8 taskId);\nstatic u8 DexScreen_CreateCategoryMenuScrollArrows(void);\nstatic int DexScreen_InputHandler_GetShoulderInput(void);\nstatic void Task_DexScreen_ShowMonPage(u8 taskId);\nstatic bool32 DexScreen_TryScrollMonsVertical(u8 direction);\nstatic void DexScreen_RemoveWindow(u8 *windowId_p);\nstatic void DexScreen_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx);\nstatic void DexScreen_PrintNum3RightAlign(u8 windowId, u8 fontId, u16 num, u8 x, u8 y, u8 colorIdx);\nstatic void DexScreen_PrintMonDexNo(u8 windowId, u8 fontId, u16 species, u8 x, u8 y);\nstatic u16 DexScreen_GetDexCount(u8 caseId, u8 whichDex);\nstatic void DexScreen_PrintControlInfo(const u8 *src);\nstatic void DexScreen_DestroyCategoryPageMonIconAndInfoWindows(void);\nstatic bool8 DexScreen_CreateCategoryListGfx(bool8 justRegistered);\nstatic void DexScreen_CreateCategoryPageSelectionCursor(u8 cursorPos);\nstatic void DexScreen_UpdateCategoryPageCursorObject(u8 taskId, u8 cursorPos, u8 numMonsInPage);\nstatic bool8 DexScreen_FlipCategoryPageInDirection(u8 direction);\nvoid DexScreen_DexPageZoomEffectFrame(u8 bg, u8 scale);\nstatic u8 DexScreen_DrawMonDexPage(bool8 justRegistered);\nu8 RemoveDexPageWindows(void);\nu8 DexScreen_DrawMonAreaPage(void);\nstatic bool8 DexScreen_IsPageUnlocked(u8 category, u8 pageNum);\nstatic bool8 DexScreen_IsCategoryUnlocked(u8 category);\nstatic u8 DexScreen_GetPageLimitsForCategory(u8 category);\nstatic bool8 DexScreen_LookUpCategoryBySpecies(u16 species);\nu8 DexScreen_DestroyAreaScreenResources(void);\nvoid DexScreen_CreateCategoryPageSpeciesList(u8 category, u8 pageNum);\nstatic u8 DexScreen_PageNumberToRenderablePages(u16 page);\nvoid DexScreen_InputHandler_StartToCry(void);\nvoid DexScreen_PrintStringWithAlignment(const u8 *str, s32 mode);\nstatic void MoveCursorFunc_DexModeSelect(s32 itemIndex, bool8 onInit, struct ListMenu *list);\nstatic void ItemPrintFunc_DexModeSelect(u8 windowId, u32 itemId, u8 y);\nstatic void ItemPrintFunc_OrderedListMenu(u8 windowId, u32 itemId, u8 y);\nstatic void Task_DexScreen_RegisterNonKantoMonBeforeNationalDex(u8 taskId);\nstatic void Task_DexScreen_RegisterMonToPokedex(u8 taskId);\n\n#include \"data/pokemon_graphics/footprint_table.h\"\n\nconst u32 sCategoryMonInfoBgTiles[] = INCBIN_U32(\"graphics/pokedex/mini_page.4bpp.lz\");\nconst u32 sKantoDexTiles[] = INCBIN_U32(\"graphics/pokedex/kanto_dex_bgtiles.4bpp.lz\");\nconst u32 sNatDexTiles[] = INCBIN_U32(\"graphics/pokedex/national_dex_bgtiles.4bpp.lz\");\nconst u16 sKantoDexPalette[0x100] = INCBIN_U16(\"graphics/pokedex/kanto_dex_bgpals.gbapal\");\n\nconst u16 sDexScreen_CategoryCursorPals[] = {\n    RGB(24, 22, 17), RGB(26, 24, 20),\n    RGB(26, 20, 15), RGB(27, 23, 19),\n    RGB(28, 18, 15), RGB(28, 22, 19),\n    RGB(30, 16, 13), RGB(29, 21, 18),\n    RGB(28, 18, 15), RGB(28, 22, 19),\n    RGB(26, 20, 15), RGB(27, 23, 19)\n};\n\nconst u16 sNationalDexPalette[0x100] = INCBIN_U16(\"graphics/pokedex/national_dex_bgpals.gbapal\");\nconst u32 sTopMenuIconTiles_Cave[] = INCBIN_U32(\"graphics/pokedex/cat_icon_cave.4bpp.lz\");\nconst u32 sTopMenuIconTiles_Urban[] = INCBIN_U32(\"graphics/pokedex/cat_icon_urban.4bpp.lz\");\nconst u32 sTopMenuSelectionIconTiles_Cancel[] = INCBIN_U32(\"graphics/pokedex/cat_icon_cancel.4bpp.lz\");\nconst u32 sTopMenuIconTiles_Forest[] = INCBIN_U32(\"graphics/pokedex/cat_icon_forest.4bpp.lz\");\nconst u32 sTopMenuIconTiles_Grassland[] = INCBIN_U32(\"graphics/pokedex/cat_icon_grassland.4bpp.lz\");\nconst u32 sTopMenuIconTiles_QuestionMark[] = INCBIN_U32(\"graphics/pokedex/cat_icon_qmark.4bpp.lz\");\nconst u32 sTopMenuIconTiles_Mountain[] = INCBIN_U32(\"graphics/pokedex/cat_icon_mountain.4bpp.lz\");\nconst u32 sTopMenuIconTiles_Rare[] = INCBIN_U32(\"graphics/pokedex/cat_icon_rare.4bpp.lz\");\nconst u32 sTopMenuIconTiles_Sea[] = INCBIN_U32(\"graphics/pokedex/cat_icon_sea.4bpp.lz\");\nconst u32 sTopMenuIconTiles_Numerical[] = INCBIN_U32(\"graphics/pokedex/cat_icon_numerical.4bpp.lz\");\nconst u32 sTopMenuIconTiles_RoughTerrain[] = INCBIN_U32(\"graphics/pokedex/cat_icon_rough_terrain.4bpp.lz\");\nconst u32 sTopMenuIconTiles_WatersEdge[] = INCBIN_U32(\"graphics/pokedex/cat_icon_waters_edge.4bpp.lz\");\nconst u32 sTopMenuIconTiles_Type[] = INCBIN_U32(\"graphics/pokedex/cat_icon_type.4bpp.lz\");\nconst u32 sTopMenuIconTiles_Lightest[] = INCBIN_U32(\"graphics/pokedex/cat_icon_lightest.4bpp.lz\");\nconst u32 sTopMenuIconTiles_Smallest[] = INCBIN_U32(\"graphics/pokedex/cat_icon_smallest.4bpp.lz\");\nconst u16 sTopMenuIconPals_Cave[] = INCBIN_U16(\"graphics/pokedex/cat_icon_cave.gbapal\");\nconst u16 sTopMenuIconPals_Urban[] = INCBIN_U16(\"graphics/pokedex/cat_icon_urban.gbapal\");\nconst u16 sTopMenuSelectionIconPals_Cancel[] = INCBIN_U16(\"graphics/pokedex/cat_icon_cancel.gbapal\");\nconst u16 sTopMenuIconPals_Forest[] = INCBIN_U16(\"graphics/pokedex/cat_icon_forest.gbapal\");\nconst u16 sTopMenuIconPals_Grassland[] = INCBIN_U16(\"graphics/pokedex/cat_icon_grassland.gbapal\");\nconst u16 sTopMenuIconPals_QuestionMark[] = INCBIN_U16(\"graphics/pokedex/cat_icon_qmark.gbapal\");\nconst u16 sTopMenuIconPals_Mountain[] = INCBIN_U16(\"graphics/pokedex/cat_icon_mountain.gbapal\");\nconst u16 sTopMenuIconPals_Rare[] = INCBIN_U16(\"graphics/pokedex/cat_icon_rare.gbapal\");\nconst u16 sTopMenuIconPals_Sea[] = INCBIN_U16(\"graphics/pokedex/cat_icon_sea.gbapal\");\nconst u16 sTopMenuIconPals_Numerical[] = INCBIN_U16(\"graphics/pokedex/cat_icon_numerical.gbapal\");\nconst u16 sTopMenuIconPals_RoughTerrain[] = INCBIN_U16(\"graphics/pokedex/cat_icon_rough_terrain.gbapal\");\nconst u16 sTopMenuIconPals_WatersEdge[] = INCBIN_U16(\"graphics/pokedex/cat_icon_waters_edge.gbapal\");\nconst u16 sTopMenuIconPals_Type[] = INCBIN_U16(\"graphics/pokedex/cat_icon_type.gbapal\");\nconst u16 sTopMenuIconPals_Lightest[] = INCBIN_U16(\"graphics/pokedex/cat_icon_lightest.gbapal\");\nconst u16 sTopMenuIconPals_Smallest[] = INCBIN_U16(\"graphics/pokedex/cat_icon_smallest.gbapal\");\nconst u8 sDexScreen_CaughtIcon[] = INCBIN_U8(\"graphics/pokedex/caught_marker.4bpp\");\nconst u32 sTilemap_AreaMap_Kanto[] = INCBIN_U32(\"graphics/pokedex/map_kanto.4bpp.lz\");\nconst u32 sTilemap_AreaMap_OneIsland[] = INCBIN_U32(\"graphics/pokedex/map_one_island.4bpp.lz\");\nconst u32 sTilemap_AreaMap_TwoIsland[] = INCBIN_U32(\"graphics/pokedex/map_two_island.4bpp.lz\");\nconst u32 sTilemap_AreaMap_ThreeIsland[] = INCBIN_U32(\"graphics/pokedex/map_three_island.4bpp.lz\");\nconst u32 sTilemap_AreaMap_FourIsland[] = INCBIN_U32(\"graphics/pokedex/map_four_island.4bpp.lz\");\nconst u32 sTilemap_AreaMap_FiveIsland[] = INCBIN_U32(\"graphics/pokedex/map_five_island.4bpp.lz\");\nconst u32 sTilemap_AreaMap_SixIsland[] = INCBIN_U32(\"graphics/pokedex/map_six_island.4bpp.lz\");\nconst u32 sTilemap_AreaMap_SevenIsland[] = INCBIN_U32(\"graphics/pokedex/map_seven_island.4bpp.lz\");\nconst u16 sBlitTiles_WideEllipse[] = INCBIN_U16(\"graphics/pokedex/blit_wide_ellipse.4bpp\");\n\n#include \"data/pokemon/pokedex_orders.h\"\n\nstatic const u8 gExpandedPlaceholder_PokedexDescription[] = _(\"\");\n\n#include \"data/pokemon/pokedex_text_fr.h\"\n#include \"data/pokemon/pokedex_text_lg.h\"\n#include \"data/pokemon/pokedex_entries.h\"\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 5,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x0000\n    },\n    {\n        .bg = 1,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 4,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x0000\n    },\n    {\n        .bg = 2,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 6,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x0000\n    },\n    {\n        .bg = 3,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 7,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x0000\n    },\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 30,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x03c4\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 18,\n        .width = 30,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x0388\n    },\n    {\n        .bg = 255,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 0,\n        .height = 0,\n        .paletteNum = 0,\n        .baseBlock = 0x0000\n    },\n};\n\nstatic const struct PokedexScreenData sDexScreenDataInitialState = {\n    .modeSelectItemsAbove = 1,\n    .modeSelectWindowId = -1,\n    .selectionIconWindowId = -1,\n    .dexCountsWindowId = -1,\n    .pageSpecies = {-1, -1, -1, -1},\n    .categoryMonWindowIds = {-1, -1, -1, -1},\n    .categoryMonInfoWindowIds = {-1, -1, -1, -1},\n    .numericalOrderWindowId = -1,\n    .windowIds = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    .scrollArrowsTaskId = -1,\n    .categoryPageCursorTaskId = -1,\n};\n\n\nstatic const struct WindowTemplate sWindowTemplate_ModeSelect = {\n    .bg = 1,\n    .tilemapLeft = 1,\n    .tilemapTop = 2,\n    .width = 20,\n    .height = 16,\n    .paletteNum = 0,\n    .baseBlock = 0x0008\n};\n\nstatic const struct WindowTemplate sWindowTemplate_SelectionIcon = {\n    .bg = 1,\n    .tilemapLeft = 21,\n    .tilemapTop = 11,\n    .width = 8,\n    .height = 6,\n    .paletteNum = 1,\n    .baseBlock = 0x0148\n};\n\nstatic const struct WindowTemplate sWindowTemplate_DexCounts = {\n    .bg = 1,\n    .tilemapLeft = 21,\n    .tilemapTop = 2,\n    .width = 9,\n    .height = 9,\n    .paletteNum = 0,\n    .baseBlock = 0x0178\n};\n\nstatic const struct ListMenuItem sListMenuItems_KantoDexModeSelect[] = {\n    {gText_PokemonList,                  LIST_HEADER},\n    {gText_NumericalMode,                DEX_MODE(NUMERICAL_KANTO)},\n    {gText_PokemonHabitats,              LIST_HEADER},\n    {gText_DexCategory_GrasslandPkmn,    DEX_CATEGORY_GRASSLAND},\n    {gText_DexCategory_ForestPkmn,       DEX_CATEGORY_FOREST},\n    {gText_DexCategory_WatersEdgePkmn,   DEX_CATEGORY_WATERS_EDGE},\n    {gText_DexCategory_SeaPkmn,          DEX_CATEGORY_SEA},\n    {gText_DexCategory_CavePkmn,         DEX_CATEGORY_CAVE},\n    {gText_DexCategory_MountainPkmn,     DEX_CATEGORY_MOUNTAIN},\n    {gText_DexCategory_RoughTerrainPkmn, DEX_CATEGORY_ROUGH_TERRAIN},\n    {gText_DexCategory_UrbanPkmn,        DEX_CATEGORY_URBAN},\n    {gText_DexCategory_RarePkmn,         DEX_CATEGORY_RARE},\n    {gText_Search,                       LIST_HEADER},\n    {gText_AToZMode,                     DEX_MODE(ATOZ)},\n    {gText_TypeMode,                     DEX_MODE(TYPE)},\n    {gText_LightestMode,                 DEX_MODE(LIGHTEST)},\n    {gText_SmallestMode,                 DEX_MODE(SMALLEST)},\n    {gText_PokedexOther,                 LIST_HEADER},\n    {gText_ClosePokedex,                 LIST_CANCEL},\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_KantoDexModeSelect = {\n    .items = sListMenuItems_KantoDexModeSelect,\n    .moveCursorFunc = MoveCursorFunc_DexModeSelect,\n    .itemPrintFunc = ItemPrintFunc_DexModeSelect,\n    .totalItems = NELEMS(sListMenuItems_KantoDexModeSelect),\n    .maxShowed = 9,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 12,\n    .cursor_X = 4,\n    .upText_Y = 2,\n    .cursorPal = 1,\n    .fillValue = 0,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 1,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = 0,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0,\n};\n\nstatic const struct ListMenuItem sListMenuItems_NatDexModeSelect[] = {\n    {gText_PokemonList,                  LIST_HEADER},\n    {gText_NumericalModeKanto,           DEX_MODE(NUMERICAL_KANTO)},\n    {gText_NumericalModeNational,        DEX_MODE(NUMERICAL_NATIONAL)},\n    {gText_PokemonHabitats,              LIST_HEADER},\n    {gText_DexCategory_GrasslandPkmn,    DEX_CATEGORY_GRASSLAND},\n    {gText_DexCategory_ForestPkmn,       DEX_CATEGORY_FOREST},\n    {gText_DexCategory_WatersEdgePkmn,   DEX_CATEGORY_WATERS_EDGE},\n    {gText_DexCategory_SeaPkmn,          DEX_CATEGORY_SEA},\n    {gText_DexCategory_CavePkmn,         DEX_CATEGORY_CAVE},\n    {gText_DexCategory_MountainPkmn,     DEX_CATEGORY_MOUNTAIN},\n    {gText_DexCategory_RoughTerrainPkmn, DEX_CATEGORY_ROUGH_TERRAIN},\n    {gText_DexCategory_UrbanPkmn,        DEX_CATEGORY_URBAN},\n    {gText_DexCategory_RarePkmn,         DEX_CATEGORY_RARE},\n    {gText_Search,                       LIST_HEADER},\n    {gText_AToZMode,                     DEX_MODE(ATOZ)},\n    {gText_TypeMode,                     DEX_MODE(TYPE)},\n    {gText_LightestMode,                 DEX_MODE(LIGHTEST)},\n    {gText_SmallestMode,                 DEX_MODE(SMALLEST)},\n    {gText_PokedexOther,                 LIST_HEADER},\n    {gText_ClosePokedex,                 LIST_CANCEL},\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_NatDexModeSelect = {\n    .items = sListMenuItems_NatDexModeSelect,\n    .moveCursorFunc = MoveCursorFunc_DexModeSelect,\n    .itemPrintFunc = ItemPrintFunc_DexModeSelect,\n    .totalItems = NELEMS(sListMenuItems_NatDexModeSelect),\n    .maxShowed = 9,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 12,\n    .cursor_X = 4,\n    .upText_Y = 2,\n    .cursorPal = 1,\n    .fillValue = 0,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 1,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = 0,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0,\n};\n\nstatic const struct ListMenuItem sListMenuItems_KantoExtended[] = {\n    {gText_PokemonList, -3},\n    {gText_NumericalModeKanto, 9},\n    {gText_NumericalModeExtended, 14},\n    {gText_PokemonHabitats, -3},\n    {gText_DexCategory_GrasslandPkmn, 0},\n    {gText_DexCategory_ForestPkmn, 1},\n    {gText_DexCategory_WatersEdgePkmn, 2},\n    {gText_DexCategory_SeaPkmn, 3},\n    {gText_DexCategory_CavePkmn, 4},\n    {gText_DexCategory_MountainPkmn, 5},\n    {gText_DexCategory_RoughTerrainPkmn, 6},\n    {gText_DexCategory_UrbanPkmn, 7},\n    {gText_DexCategory_RarePkmn, 8},\n    {gText_Search, -3},\n    {gText_AToZMode, 10},\n    {gText_TypeMode, 11},\n    {gText_LightestMode, 12},\n    {gText_SmallestMode, 13},\n    {gText_PokedexOther, -3},\n    {gText_ClosePokedex, -2},\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_KantoExtended = {\n    .items = sListMenuItems_KantoExtended,\n    .moveCursorFunc = MoveCursorFunc_DexModeSelect,\n    .itemPrintFunc = ItemPrintFunc_DexModeSelect,\n    .totalItems = NELEMS(sListMenuItems_KantoExtended),\n    .maxShowed = 9,\n    .windowId = 0, \n    .header_X = 0, \n    .item_X = 12, \n    .cursor_X = 4,\n    .upText_Y = 2,\n    .cursorPal = 1,\n    .fillValue = 0,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 1,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = 0,\n    .fontId = 2,\n    .cursorKind = 0,\n};\n\nstatic const struct ListMenuItem sListMenuItems_ExtendedNational[] = {\n    {gText_PokemonList, -3},\n    {gText_NumericalModeExtended, 9},\n    {gText_NumericalModeNational, 14},\n    {gText_PokemonHabitats, -3},\n    {gText_DexCategory_GrasslandPkmn, 0},\n    {gText_DexCategory_ForestPkmn, 1},\n    {gText_DexCategory_WatersEdgePkmn, 2},\n    {gText_DexCategory_SeaPkmn, 3},\n    {gText_DexCategory_CavePkmn, 4},\n    {gText_DexCategory_MountainPkmn, 5},\n    {gText_DexCategory_RoughTerrainPkmn, 6},\n    {gText_DexCategory_UrbanPkmn, 7},\n    {gText_DexCategory_RarePkmn, 8},\n    {gText_Search, -3},\n    {gText_AToZMode, 10},\n    {gText_TypeMode, 11},\n    {gText_LightestMode, 12},\n    {gText_SmallestMode, 13},\n    {gText_PokedexOther, -3},\n    {gText_ClosePokedex, -2},\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_ExtendedNational = {\n    .items = sListMenuItems_ExtendedNational,\n    .moveCursorFunc = MoveCursorFunc_DexModeSelect,\n    .itemPrintFunc = ItemPrintFunc_DexModeSelect,\n    .totalItems = NELEMS(sListMenuItems_ExtendedNational),\n    .maxShowed = 9,\n    .windowId = 0, \n    .header_X = 0, \n    .item_X = 12, \n    .cursor_X = 4,\n    .upText_Y = 2,\n    .cursorPal = 1,\n    .fillValue = 0,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 1,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = 0,\n    .fontId = 2,\n    .cursorKind = 0,\n};\n\nstatic const struct ScrollArrowsTemplate sScrollArrowsTemplate_KantoDex = {\n    .firstArrowType = 2,\n    .firstX = 200,\n    .firstY = 19,\n    .secondArrowType = 3,\n    .secondX = 200,\n    .secondY = 141,\n    .fullyUpThreshold = 0,\n    .fullyDownThreshold = 10,\n    .tileTag = 2000,\n    .palTag = 0xFFFF,\n    .palNum = 1\n};\n\nstatic const struct ScrollArrowsTemplate sScrollArrowsTemplate_NatDex = {\n    .firstArrowType = 2,\n    .firstX = 200,\n    .firstY = 19,\n    .secondArrowType = 3,\n    .secondX = 200,\n    .secondY = 141,\n    .fullyUpThreshold = 0,\n    .fullyDownThreshold = 11,\n    .tileTag = 2000,\n    .palTag = 0xFFFF,\n    .palNum = 1\n};\n\n\nstatic const struct PokedexScreenWindowGfx sTopMenuSelectionIconGfxPtrs[] = {\n    [DEX_CATEGORY_GRASSLAND] = {\n        .tiles = sTopMenuIconTiles_Grassland,\n        .pal   = sTopMenuIconPals_Grassland\n    },\n    [DEX_CATEGORY_FOREST] = {\n        .tiles = sTopMenuIconTiles_Forest,\n        .pal   = sTopMenuIconPals_Forest\n    },\n    [DEX_CATEGORY_WATERS_EDGE] = {\n        .tiles = sTopMenuIconTiles_WatersEdge,\n        .pal   = sTopMenuIconPals_WatersEdge\n    },\n    [DEX_CATEGORY_SEA] = {\n        .tiles = sTopMenuIconTiles_Sea,\n        .pal   = sTopMenuIconPals_Sea\n    },\n    [DEX_CATEGORY_CAVE] = {\n        .tiles = sTopMenuIconTiles_Cave,\n        .pal   = sTopMenuIconPals_Cave\n    },\n    [DEX_CATEGORY_MOUNTAIN] = {\n        .tiles = sTopMenuIconTiles_Mountain,\n        .pal   = sTopMenuIconPals_Mountain\n    },\n    [DEX_CATEGORY_ROUGH_TERRAIN] = {\n        .tiles = sTopMenuIconTiles_RoughTerrain,\n        .pal   = sTopMenuIconPals_RoughTerrain\n    },\n    [DEX_CATEGORY_URBAN] = {\n        .tiles = sTopMenuIconTiles_Urban,\n        .pal   = sTopMenuIconPals_Urban\n    },\n    [DEX_CATEGORY_RARE] = {\n        .tiles = sTopMenuIconTiles_Rare,\n        .pal   = sTopMenuIconPals_Rare\n    },\n    [DEX_MODE(NUMERICAL_KANTO)] = {\n        .tiles = sTopMenuIconTiles_Numerical,\n        .pal   = sTopMenuIconPals_Numerical\n    },\n    [DEX_MODE(ATOZ)] = {\n        .tiles = gDexScreen_TopMenuIconTiles_AtoZ,\n        .pal   = gDexScreen_TopMenuIconPals_AtoZ\n    },\n    [DEX_MODE(TYPE)] = {\n        .tiles = sTopMenuIconTiles_Type,\n        .pal   = sTopMenuIconPals_Type\n    },\n    [DEX_MODE(LIGHTEST)] = {\n        .tiles = sTopMenuIconTiles_Lightest,\n        .pal   = sTopMenuIconPals_Lightest\n    },\n    [DEX_MODE(SMALLEST)] = {\n        .tiles = sTopMenuIconTiles_Smallest,\n        .pal   = sTopMenuIconPals_Smallest\n    },\n    [DEX_MODE(NUMERICAL_NATIONAL)] = {\n        .tiles = sTopMenuIconTiles_Numerical,\n        .pal   = sTopMenuIconPals_Numerical\n    },\n};\n\nstatic const struct WindowTemplate sWindowTemplate_OrderedListMenu = {\n    .bg = 1,\n    .tilemapLeft = 2,\n    .tilemapTop = 2,\n    .width = 23,\n    .height = 16,\n    .paletteNum = 0,\n    .baseBlock = 0x0008\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate_OrderedListMenu = {\n    .items = sListMenuItems_KantoDexModeSelect,\n    .moveCursorFunc = ListMenuDefaultCursorMoveFunc,\n    .itemPrintFunc = ItemPrintFunc_OrderedListMenu,\n    .totalItems = 0,\n    .maxShowed = 9,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 56,\n    .cursor_X = 4,\n    .upText_Y = 2,\n    .cursorPal = 1,\n    .fillValue = 0,\n    .cursorShadowPal = 3,\n    .lettersSpacing = 1,\n    .itemVerticalPadding = 0,\n    .scrollMultiple = 1,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0,\n};\n\nstatic const struct ListMenuWindowRect sListMenuRects_OrderedList[] = {\n    {\n        .x = 0,\n        .y = 0,\n        .width = 5,\n        .height = 16,\n        .palNum = 0\n    }, {\n        .x = 5,\n        .y = 0,\n        .width = 2,\n        .height = 16,\n        .palNum = 1\n    }, {\n        .x = 7,\n        .y = 0,\n        .width = 8,\n        .height = 16,\n        .palNum = 0\n    }, {\n        .x = 15,\n        .y = 0,\n        .width = 8,\n        .height = 16,\n        .palNum = 2,\n    }, {\n        .x = 0xFF,\n        .y = 0xFF,\n        .width = 0xFF,\n        .height = 0xFF,\n        .palNum = 0xFF\n    }\n};\n\nstatic const struct ScrollArrowsTemplate sDexOrderScrollArrowsTemplate = {\n    .firstArrowType = 2,\n    .firstX = 200,\n    .firstY = 19,\n    .secondArrowType = 3,\n    .secondX = 200,\n    .secondY = 141,\n    .fullyUpThreshold = 0,\n    .fullyDownThreshold = 0,\n    .tileTag = 2000,\n    .palTag = 0xFFFF,\n    .palNum = 1,\n};\n\nstatic const struct WindowTemplate sWindowTemplate_CategoryMonIcon = {\n    .bg = 2,\n    .tilemapLeft = 0,\n    .tilemapTop = 0,\n    .width = 8,\n    .height = 8,\n    .paletteNum = 0,\n    .baseBlock = 0x0000\n};\n\nstatic const struct WindowTemplate sWindowTemplate_CategoryMonInfo = {\n    .bg = 1,\n    .tilemapLeft = 0,\n    .tilemapTop = 0,\n    .width = 8,\n    .height = 5,\n    .paletteNum = 0,\n    .baseBlock = 0x0000\n};\n\nconst struct WindowTemplate sWindowTemplate_DexEntry_MonPic = {\n    .bg = 1,\n    .tilemapLeft = 19,\n    .tilemapTop = 3,\n    .width = 8,\n    .height = 8,\n    .paletteNum = 9,\n    .baseBlock = 0x01a8\n};\n\nconst struct WindowTemplate sWindowTemplate_DexEntry_SpeciesStats = {\n    .bg = 1,\n    .tilemapLeft = 2,\n    .tilemapTop = 3,\n    .width = 13,\n    .height = 8,\n    .paletteNum = 0,\n    .baseBlock = 0x01e8\n};\n\nconst struct WindowTemplate sWindowTemplate_DexEntry_FlavorText = {\n    .bg = 1,\n    .tilemapLeft = 0,\n    .tilemapTop = 11,\n    .width = 30,\n    .height = 7,\n    .paletteNum = 0,\n    .baseBlock = 0x0250\n};\n\nconst struct WindowTemplate sWindowTemplate_AreaMap_MonIcon = {\n    .bg = 2,\n    .tilemapLeft = 1,\n    .tilemapTop = 2,\n    .width = 4,\n    .height = 4,\n    .paletteNum = 10,\n    .baseBlock = 0x01a8\n};\n\nconst struct WindowTemplate sWindowTemplate_AreaMap_SpeciesName = {\n    .bg = 2,\n    .tilemapLeft = 5,\n    .tilemapTop = 2,\n    .width = 8,\n    .height = 3,\n    .paletteNum = 0,\n    .baseBlock = 0x01b8\n};\n\nconst struct WindowTemplate sWindowTemplate_AreaMap_Size = {\n    .bg = 2,\n    .tilemapLeft = 2,\n    .tilemapTop = 7,\n    .width = 10,\n    .height = 2,\n    .paletteNum = 0,\n    .baseBlock = 0x01d0\n};\n\nconst struct WindowTemplate sWindowTemplate_AreaMap_Area = {\n    .bg = 2,\n    .tilemapLeft = 18,\n    .tilemapTop = 2,\n    .width = 10,\n    .height = 2,\n    .paletteNum = 0,\n    .baseBlock = 0x01e4\n};\n\nconst struct WindowTemplate sWindowTemplate_AreaMap_MonTypes = {\n    .bg = 2,\n    .tilemapLeft = 5,\n    .tilemapTop = 5,\n    .width = 8,\n    .height = 2,\n    .paletteNum = 11,\n    .baseBlock = 0x01f8\n};\n\nconst struct WindowTemplate sWindowTemplate_AreaMap_Kanto = {\n    .bg = 2,\n    .tilemapLeft = 17,\n    .tilemapTop = 4,\n    .width = 12,\n    .height = 9,\n    .paletteNum = 0,\n    .baseBlock = 0x0208\n};\n\nstatic const struct WindowTemplate sWindowTemplate_AreaMap_OneIsland = {\n    .bg = 2,\n    .tilemapLeft = 13,\n    .tilemapTop = 4,\n    .width = 4,\n    .height = 3,\n    .paletteNum = 0,\n    .baseBlock = 0x0274\n};\n\nstatic const struct WindowTemplate sWindowTemplate_AreaMap_TwoIsland = {\n    .bg = 2,\n    .tilemapLeft = 13,\n    .tilemapTop = 7,\n    .width = 4,\n    .height = 3,\n    .paletteNum = 0,\n    .baseBlock = 0x0280\n};\n\nstatic const struct WindowTemplate sWindowTemplate_AreaMap_ThreeIsland = {\n    .bg = 2,\n    .tilemapLeft = 13,\n    .tilemapTop = 10,\n    .width = 4,\n    .height = 3,\n    .paletteNum = 0,\n    .baseBlock = 0x028c\n};\n\nstatic const struct WindowTemplate sWindowTemplate_AreaMap_FourIsland = {\n    .bg = 2,\n    .tilemapLeft = 13,\n    .tilemapTop = 13,\n    .width = 4,\n    .height = 4,\n    .paletteNum = 0,\n    .baseBlock = 0x0298\n};\n\nstatic const struct WindowTemplate sWindowTemplate_AreaMap_FiveIsland = {\n    .bg = 2,\n    .tilemapLeft = 17,\n    .tilemapTop = 13,\n    .width = 4,\n    .height = 4,\n    .paletteNum = 0,\n    .baseBlock = 0x02a8\n};\n\nstatic const struct WindowTemplate sWindowTemplate_AreaMap_SixIsland = {\n    .bg = 2,\n    .tilemapLeft = 21,\n    .tilemapTop = 13,\n    .width = 4,\n    .height = 4,\n    .paletteNum = 0,\n    .baseBlock = 0x02b8\n};\n\nstatic const struct WindowTemplate sWindowTemplate_AreaMap_SevenIsland = {\n    .bg = 2,\n    .tilemapLeft = 25,\n    .tilemapTop = 13,\n    .width = 4,\n    .height = 4,\n    .paletteNum = 0,\n    .baseBlock = 0x02c8\n};\n\nstruct {\n    const struct WindowTemplate * window;\n    const u32 * tiles;\n} const sAreaMapStructs_SeviiIslands[] = {\n    {&sWindowTemplate_AreaMap_OneIsland,   sTilemap_AreaMap_OneIsland},\n    {&sWindowTemplate_AreaMap_TwoIsland,   sTilemap_AreaMap_TwoIsland},\n    {&sWindowTemplate_AreaMap_ThreeIsland, sTilemap_AreaMap_ThreeIsland},\n    {&sWindowTemplate_AreaMap_FourIsland,  sTilemap_AreaMap_FourIsland},\n    {&sWindowTemplate_AreaMap_FiveIsland,  sTilemap_AreaMap_FiveIsland},\n    {&sWindowTemplate_AreaMap_SixIsland,   sTilemap_AreaMap_SixIsland},\n    {&sWindowTemplate_AreaMap_SevenIsland, sTilemap_AreaMap_SevenIsland},\n};\n\nstatic const u16 sCategoryPageIconWindowBg[] = INCBIN_U16(\"graphics/pokedex/page_icon_tilemap.bin\");\n\n// Circular window x/y; Rectangular window x/y\nstatic const u8 sPageIconCoords_1Mon[1][4] = {\n    {11,  3, 11, 11},\n};\n\nstatic const u8 sPageIconCoords_2Mons[2][4] = {\n    { 3,  3, 11,  3},\n    {18,  9, 10, 11},\n};\n\nstatic const u8 sPageIconCoords_3Mons[3][4] = {\n    { 1,  2,  9,  2},\n    {11,  9,  3, 11},\n    {21,  3, 21, 11}\n};\n\nstatic const u8 sPageIconCoords_4Mons[4][4] = {\n    { 0,  2,  6,  3},\n    { 7, 10,  0, 12},\n    {15, 10, 22, 11},\n    {22,  2, 15,  4}\n};\n\nconst u8 (*const sCategoryPageIconCoords[])[4] = {\n    sPageIconCoords_1Mon,\n    sPageIconCoords_2Mons,\n    sPageIconCoords_3Mons,\n    sPageIconCoords_4Mons,\n};\n\nstatic const u8 *const sDexCategoryNamePtrs[] = {\n    gText_DexCategory_GrasslandPkmn,\n    gText_DexCategory_ForestPkmn,\n    gText_DexCategory_WatersEdgePkmn,\n    gText_DexCategory_SeaPkmn,\n    gText_DexCategory_CavePkmn,\n    gText_DexCategory_MountainPkmn,\n    gText_DexCategory_RoughTerrainPkmn,\n    gText_DexCategory_UrbanPkmn,\n    gText_DexCategory_RarePkmn,\n};\n\nconst u16 sPalette_Silhouette[] = INCBIN_U16(\"graphics/pokedex/silhouette_sprite_pal.gbapal\");\n\nstatic const u8 sDexScreenPageTurnColumns[][30] = {\n    {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30},\n    { 5, 11, 17, 23, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30},\n    { 2,  5,  8, 11, 14, 17, 20, 23, 26, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30},\n    { 2,  3,  5,  7,  9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30},\n    { 2,  4,  5,  7,  8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30},\n    { 1,  2,  3,  4,  7,  8,  9, 10, 11, 12, 13, 15, 16, 17, 19, 20, 21, 23, 24, 25, 27, 28, 29, 30, 30, 30, 30, 30, 30, 30},\n    { 1,  2,  3,  4,  5,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 30, 30, 30},\n    { 1,  2,  3,  4,  5,  6,  7,  8,  9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 30, 30},\n    { 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30},\n    { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29},\n};\n\nstatic const struct ScrollArrowsTemplate sScrollArrowsTemplate_CategoryMenu = {\n    .firstArrowType = 0,\n    .firstX = 16,\n    .firstY = 80,\n    .secondArrowType = 1,\n    .secondX = 224,\n    .secondY = 80,\n    .fullyUpThreshold = 0,\n    .fullyDownThreshold = 0,\n    .tileTag = 2000,\n    .palTag = 0xFFFF,\n    .palNum = 1,\n};\n\nconst struct CursorStruct sCursorStruct_CategoryPage = {\n    .left = 0,\n    .top = 160,\n    .rowWidth = 64,\n    .rowHeight = 40,\n    .tileTag = 2002,\n    .palTag = 0xFFFF,\n    .palNum = 4,\n};\n\n#include \"data/pokemon/pokedex_categories.h\"\n\nvoid VBlankCB(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid CB2_PokedexScreen(void)\n{\n    if (!gPaletteFade.active || IsDma3ManagerBusyWithBgCopy())\n    {\n        RunTasks();\n        RunTextPrinters();\n        AnimateSprites();\n        BuildOamBuffer();\n    }\n    else\n    {\n        UpdatePaletteFade();\n    }\n}\n\nvoid DexScreen_LoadResources(void)\n{\n    bool8 natDex;\n    u8 taskId;\n\n    natDex = IsNationalPokedexEnabled();\n    m4aSoundVSyncOff();\n    SetVBlankCallback(NULL);\n    ResetPaletteFade();\n    ResetSpriteData();\n    ResetTasks();\n    ScanlineEffect_Stop();\n    ResetBgsAndClearDma3BusyFlags(TRUE);\n    InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));\n    SetBgTilemapBuffer(3, (u16 *)Alloc(BG_SCREEN_SIZE));\n    SetBgTilemapBuffer(2, (u16 *)Alloc(BG_SCREEN_SIZE));\n    SetBgTilemapBuffer(1, (u16 *)Alloc(BG_SCREEN_SIZE));\n    SetBgTilemapBuffer(0, (u16 *)Alloc(BG_SCREEN_SIZE));\n    if (natDex)\n        DecompressAndLoadBgGfxUsingHeap(3, (void *)sNatDexTiles, BG_SCREEN_SIZE, 0, 0);\n    else\n        DecompressAndLoadBgGfxUsingHeap(3, (void *)sKantoDexTiles, BG_SCREEN_SIZE, 0, 0);\n    InitWindows(sWindowTemplates);\n    DeactivateAllTextPrinters();\n    m4aSoundVSyncOn();\n    SetVBlankCallback(VBlankCB);\n    EnableInterrupts(INTR_FLAG_VBLANK);\n    taskId = CreateTask(Task_PokedexScreen, 0);\n    sPokedexScreenData = Alloc(sizeof(struct PokedexScreenData));\n    *sPokedexScreenData = sDexScreenDataInitialState;\n    sPokedexScreenData->taskId = taskId;\n    sPokedexScreenData->listItems = Alloc(NATIONAL_DEX_COUNT * sizeof(struct ListMenuItem));\n    sPokedexScreenData->numSeenNational = DexScreen_GetDexCount(FLAG_GET_SEEN, 1);\n    sPokedexScreenData->numOwnedNational = DexScreen_GetDexCount(FLAG_GET_CAUGHT, 1);\n    sPokedexScreenData->numSeenKanto = DexScreen_GetDexCount(FLAG_GET_SEEN, 0);\n    sPokedexScreenData->numOwnedKanto = DexScreen_GetDexCount(FLAG_GET_CAUGHT, 0);\n    SetBGMVolume_SuppressHelpSystemReduction(0x80);\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n    gPaletteFade.bufferTransferDisabled = TRUE;\n    if (natDex)\n        LoadPalette(sNationalDexPalette, BG_PLTT_ID(0), sizeof(sNationalDexPalette));\n    else\n        LoadPalette(sKantoDexPalette, BG_PLTT_ID(0), sizeof(sKantoDexPalette));\n    FillBgTilemapBufferRect(3, 0x001, 0,  0, 32, 32, 0);\n    FillBgTilemapBufferRect(2, 0x000, 0,  0, 32, 32, 17);\n    FillBgTilemapBufferRect(1, 0x000, 0,  0, 32, 32, 17);\n    FillBgTilemapBufferRect(0, 0x003, 0,  0, 32,  2, 15);\n    FillBgTilemapBufferRect(0, 0x000, 0,  2, 32, 16, 17);\n    FillBgTilemapBufferRect(0, 0x003, 0, 18, 32,  2, 15);\n}\n\nvoid CB2_OpenPokedexFromStartMenu(void)\n{\n    DexScreen_LoadResources();\n    ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    SetMainCallback2(CB2_PokedexScreen);\n    SetHelpContext(HELPCONTEXT_POKEDEX);\n}\n\n#define FREE_IF_NOT_NULL(ptr0) ({ void *ptr = (ptr0); if (ptr) Free(ptr); })\n\nbool8 DoClosePokedex(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        gMain.state++;\n        return FALSE;\n    case 1:\n        if (!gPaletteFade.active)\n            gMain.state = 2;\n        else\n            UpdatePaletteFade();\n        return FALSE;\n    case 2:\n        FREE_IF_NOT_NULL(sPokedexScreenData->listItems);\n        FREE_IF_NOT_NULL(sPokedexScreenData);\n        FreeAllWindowBuffers();\n        FREE_IF_NOT_NULL(GetBgTilemapBuffer(0));\n        FREE_IF_NOT_NULL(GetBgTilemapBuffer(1));\n        FREE_IF_NOT_NULL(GetBgTilemapBuffer(2));\n        FREE_IF_NOT_NULL(GetBgTilemapBuffer(3));\n        BGMVolumeMax_EnableHelpSystemReduction();\n        break;\n    }\n    return TRUE;\n}\n\nvoid CB2_ClosePokedex(void)\n{\n    if (DoClosePokedex())\n    {\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);\n        SetMainCallback2(CB2_ReturnToFieldWithOpenMenu);\n    }\n}\n\nstatic void Task_PokedexScreen(u8 taskId)\n{\n    int i;\n    switch (sPokedexScreenData->state)\n    {\n    case 0:\n        sPokedexScreenData->unlockedCategories = 0;\n        for (i = 0; i < 9; i++)\n            sPokedexScreenData->unlockedCategories |= (DexScreen_IsCategoryUnlocked(i) << i);\n        sPokedexScreenData->state = 2;\n        break;\n    case 1:\n        RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId);\n        DexScreen_RemoveWindow(&sPokedexScreenData->modeSelectWindowId);\n        DexScreen_RemoveWindow(&sPokedexScreenData->selectionIconWindowId);\n        DexScreen_RemoveWindow(&sPokedexScreenData->dexCountsWindowId);\n        SetMainCallback2(CB2_ClosePokedex);\n        DestroyTask(taskId);\n        break;\n    case 2:\n        DexScreen_InitGfxForTopMenu();\n        sPokedexScreenData->state = 3;\n        break;\n    case 3:\n        CopyBgTilemapBufferToVram(3);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(0);\n        sPokedexScreenData->state = 4;\n        break;\n    case 4:\n        ShowBg(3);\n        ShowBg(2);\n        ShowBg(1);\n        ShowBg(0);\n        if (gPaletteFade.bufferTransferDisabled)\n        {\n            gPaletteFade.bufferTransferDisabled = FALSE;\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0, RGB_WHITEALPHA);\n        }\n        else\n            BeginNormalPaletteFade(~0x8000, 0, 16, 0, RGB_WHITEALPHA);\n        sPokedexScreenData->state = 5;\n        break;\n    case 5:\n        ListMenuGetScrollAndRow(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPosBak, NULL);\n        if (IsNationalPokedexEnabled())\n            sPokedexScreenData->scrollArrowsTaskId = AddScrollIndicatorArrowPair(&sScrollArrowsTemplate_NatDex, &sPokedexScreenData->modeSelectCursorPosBak);\n        else if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !(IsNationalPokedexEnabled()))\n            sPokedexScreenData->scrollArrowsTaskId = AddScrollIndicatorArrowPair(&sScrollArrowsTemplate_NatDex, &sPokedexScreenData->modeSelectCursorPosBak);\n        else\n            sPokedexScreenData->scrollArrowsTaskId = AddScrollIndicatorArrowPair(&sScrollArrowsTemplate_KantoDex, &sPokedexScreenData->modeSelectCursorPosBak);\n        sPokedexScreenData->state = 6;\n        break;\n    case 6:\n        sPokedexScreenData->modeSelectInput = ListMenu_ProcessInput(sPokedexScreenData->modeSelectListMenuId);\n        ListMenuGetScrollAndRow(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPosBak, NULL);\n        if (JOY_NEW(A_BUTTON))\n        {\n            switch (sPokedexScreenData->modeSelectInput)\n            {\n            case LIST_CANCEL:\n                sPokedexScreenData->state = 1;\n                break;\n            case DEX_CATEGORY_GRASSLAND:\n            case DEX_CATEGORY_FOREST:\n            case DEX_CATEGORY_WATERS_EDGE:\n            case DEX_CATEGORY_SEA:\n            case DEX_CATEGORY_CAVE:\n            case DEX_CATEGORY_MOUNTAIN:\n            case DEX_CATEGORY_ROUGH_TERRAIN:\n            case DEX_CATEGORY_URBAN:\n            case DEX_CATEGORY_RARE:\n                if (DexScreen_IsCategoryUnlocked(sPokedexScreenData->modeSelectInput))\n                {\n                    RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId);\n                    sPokedexScreenData->category = sPokedexScreenData->modeSelectInput;\n                    BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA);\n                    sPokedexScreenData->state = 7;\n                }\n                break;\n            case DEX_MODE(NUMERICAL_KANTO):\n            case DEX_MODE(NUMERICAL_NATIONAL):\n                RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId);\n                sPokedexScreenData->dexOrderId = sPokedexScreenData->modeSelectInput - DEX_CATEGORY_COUNT;\n                BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA);\n                sPokedexScreenData->state = 9;\n                break;\n            case DEX_MODE(ATOZ):\n            case DEX_MODE(TYPE):\n            case DEX_MODE(LIGHTEST):\n            case DEX_MODE(SMALLEST):\n                RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId);\n                sPokedexScreenData->dexOrderId = sPokedexScreenData->modeSelectInput - DEX_CATEGORY_COUNT;\n                sPokedexScreenData->characteristicOrderMenuItemsAbove = sPokedexScreenData->characteristicOrderMenuCursorPos = 0;\n                BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA);\n                sPokedexScreenData->state = 8;\n                break;\n            }\n            break;\n        }\n        if (JOY_NEW(B_BUTTON))\n        {\n            sPokedexScreenData->state = 1;\n        }\n        if ((JOY_NEW(SELECT_BUTTON)))\n        {\n            RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId);\n            BeginNormalPaletteFade(0xFFFF7FFF, 0, 0, 16, RGB_WHITEALPHA);\n            sPokedexScreenData->dexSpecies = gSaveBlock1Ptr->lastViewedPokedexEntry; //species for entry\n            //Below commented out code adjusts the cursor position that the last Pokedex entry backs out to.\n            //It works IF the Pokemon is in the Kanto Dex and is not in the last position possible.\n            //I could not get it to work. Instead, the cursor defaults to position 0 of the Kanto Dex.\n            /*sPokedexScreenData->kantoOrderMenuCursorPos = sPokedexScreenData->dexSpecies - 1; //cursor position; Kanto?\n            gUnknown_203ACF0->field_48 = sub_8103518(sPokedexScreenData->dexOrderId); //setting up max shown? idk\n            sub_8104664(0); //fixing cursor position at endpoints? Kanto?\n            sPokedexScreenData->kantoOrderMenuItemsAbove -= 1; //is items above cursor position, automatically adjusted by above call; Kanto?\n            */\n            sPokedexScreenData->kantoOrderMenuCursorPos = 0; //cursor pos reset Kanto/Extended\n            sPokedexScreenData->kantoOrderMenuItemsAbove = 0; //items above reset Kanto/Extended\n            sPokedexScreenData->nationalOrderMenuCursorPos = 0; //cursor pos reset Extended/National\n            sPokedexScreenData->nationalOrderMenuItemsAbove = 0; //items above reset Extended/National\n            sPokedexScreenData->state = 10;\n        }\n        /* //debugging to test new dex mode and combos\n        if ((JOY_NEW(START_BUTTON)))\n        {\n            PlaySE(SE_SELECT);\n            if(FlagGet(FLAG_SYS_NATIONAL_DEX))\n                FlagClear(FLAG_SYS_NATIONAL_DEX);\n            else\n                FlagSet(FLAG_SYS_NATIONAL_DEX);\n        }\n        if ((JOY_NEW(R_BUTTON)))\n        {\n            PlaySE(SE_SELECT);\n            if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX))\n            {\n                FlagClear(FLAG_SYS_RECEIVED_EXTENDED_DEX);\n                FlagClear(FLAG_SYS_EXTENDED_DEX_TOGGLE);\n            }\n            else\n            {\n                FlagSet(FLAG_SYS_RECEIVED_EXTENDED_DEX);\n                FlagSet(FLAG_SYS_EXTENDED_DEX_TOGGLE);\n            }\n        }*/\n        break;\n    case 7:\n        DestroyListMenuTask(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPos, &sPokedexScreenData->modeSelectItemsAbove);\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20);\n        CopyBgTilemapBufferToVram(1);\n        DexScreen_RemoveWindow(&sPokedexScreenData->modeSelectWindowId);\n        DexScreen_RemoveWindow(&sPokedexScreenData->selectionIconWindowId);\n        DexScreen_RemoveWindow(&sPokedexScreenData->dexCountsWindowId);\n        sPokedexScreenData->pageNum = 0;\n        sPokedexScreenData->categoryCursorPosInPage = 0;\n        sPokedexScreenData->parentOfCategoryMenu = 0;\n        gTasks[taskId].func = Task_DexScreen_CategorySubmenu;\n        sPokedexScreenData->state = 0;\n        break;\n    case 8:\n        DestroyListMenuTask(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPos, &sPokedexScreenData->modeSelectItemsAbove);\n        HideBg(1);\n        DexScreen_RemoveWindow(&sPokedexScreenData->modeSelectWindowId);\n        DexScreen_RemoveWindow(&sPokedexScreenData->selectionIconWindowId);\n        DexScreen_RemoveWindow(&sPokedexScreenData->dexCountsWindowId);\n        gTasks[taskId].func = Task_DexScreen_CharacteristicOrder;\n        sPokedexScreenData->state = 0;\n        break;\n    case 9:\n        DestroyListMenuTask(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPos, &sPokedexScreenData->modeSelectItemsAbove);\n        HideBg(1);\n        DexScreen_RemoveWindow(&sPokedexScreenData->modeSelectWindowId);\n        DexScreen_RemoveWindow(&sPokedexScreenData->selectionIconWindowId);\n        DexScreen_RemoveWindow(&sPokedexScreenData->dexCountsWindowId);\n        gTasks[taskId].func = Task_DexScreen_NumericalOrder;\n        sPokedexScreenData->state = 0;\n        break;\n    case 10:\n        DestroyListMenuTask(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPos, &sPokedexScreenData->modeSelectItemsAbove);\n        HideBg(1);\n        DexScreen_RemoveWindow(&sPokedexScreenData->modeSelectWindowId);\n        DexScreen_RemoveWindow(&sPokedexScreenData->selectionIconWindowId);\n        DexScreen_RemoveWindow(&sPokedexScreenData->dexCountsWindowId);\n        DexScreen_InitGfxForNumericalOrderList();\n        gTasks[taskId].func = Task_DexScreen_NumericalOrder;\n        sPokedexScreenData->state = 7;\n        break;\n    }\n}\n\nstatic void DexScreen_InitGfxForTopMenu(void)\n{\n    struct ListMenuTemplate listMenuTemplate;\n    FillBgTilemapBufferRect(3, 0x00E, 0, 0, 30, 20, 0);\n    FillBgTilemapBufferRect(2, 0x000, 0, 0, 30, 20, 17);\n    FillBgTilemapBufferRect(1, 0x000, 0, 0, 30, 20, 17);\n    sPokedexScreenData->modeSelectWindowId = AddWindow(&sWindowTemplate_ModeSelect);\n    sPokedexScreenData->selectionIconWindowId = AddWindow(&sWindowTemplate_SelectionIcon);\n    sPokedexScreenData->dexCountsWindowId = AddWindow(&sWindowTemplate_DexCounts);\n    if (IsNationalPokedexEnabled())\n    {\n        if(FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE))\n            listMenuTemplate = sListMenuTemplate_ExtendedNational;\n        else\n            listMenuTemplate = sListMenuTemplate_NatDexModeSelect;\n        listMenuTemplate.windowId = sPokedexScreenData->modeSelectWindowId;\n        sPokedexScreenData->modeSelectListMenuId = ListMenuInit(&listMenuTemplate, sPokedexScreenData->modeSelectCursorPos, sPokedexScreenData->modeSelectItemsAbove);\n        FillWindowPixelBuffer(sPokedexScreenData->dexCountsWindowId, PIXEL_FILL(0));\n        DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Seen, 0, 2, 0);\n        if(!FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE))\n        {\n            sPokedexScreenData->numSeenKanto = DexScreen_GetDexCount(0, 0);\n            sPokedexScreenData->numOwnedKanto = DexScreen_GetDexCount(1, 0);\n            DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Kanto, 8, 13, 0);\n            DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numSeenKanto, 52, 13, 2);\n            DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_National, 8, 24, 0);\n            DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numSeenNational, 52, 24, 2);\n            DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Owned, 0, 37, 0);\n            DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Kanto, 8, 48, 0);\n            DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numOwnedKanto, 52, 48, 2);\n            DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_National, 8, 59, 0);\n            DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numOwnedNational, 52, 59, 2);\n        }\n        else\n        {\n            sPokedexScreenData->numSeenKanto = DexScreen_GetDexCount(0, 2);\n            sPokedexScreenData->numOwnedKanto = DexScreen_GetDexCount(1, 2);\n            DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Extended, 8, 13, 0);\n            DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numSeenKanto, 52, 13, 2);\n            DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_National, 8, 24, 0);\n            DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numSeenNational, 52, 24, 2);\n            DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Owned, 0, 37, 0);\n            DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_Extended, 8, 48, 0);\n            DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numOwnedKanto, 52, 48, 2);\n            DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, 0, gText_National, 8, 59, 0);\n            DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numOwnedNational, 52, 59, 2);\n        }\n    }\n    else if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX))\n    {\n        listMenuTemplate = sListMenuTemplate_KantoExtended;\n        listMenuTemplate.windowId = sPokedexScreenData->modeSelectWindowId;\n        sPokedexScreenData->modeSelectListMenuId = ListMenuInit(&listMenuTemplate, sPokedexScreenData->modeSelectCursorPos, sPokedexScreenData->modeSelectItemsAbove);\n        FillWindowPixelBuffer(sPokedexScreenData->dexCountsWindowId, PIXEL_FILL(0));\n        DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_SMALL, gText_Seen, 0, 2, 0);\n        sPokedexScreenData->numSeenKanto = DexScreen_GetDexCount(0, 0);\n        sPokedexScreenData->numOwnedKanto = DexScreen_GetDexCount(1, 0);\n        sPokedexScreenData->numSeenNational = DexScreen_GetDexCount(0, 2);\n        sPokedexScreenData->numOwnedNational = DexScreen_GetDexCount(1, 2);\n        DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_SMALL, gText_Kanto, 8, 13, 0);\n        DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numSeenKanto, 52, 13, 2);\n        DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_SMALL, gText_Extended, 8, 24, 0);\n        DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numSeenNational, 52, 24, 2);\n        DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_SMALL, gText_Owned, 0, 37, 0);\n        DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_SMALL, gText_Kanto, 8, 48, 0);\n        DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numOwnedKanto, 52, 48, 2);\n        DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_SMALL, gText_Extended, 8, 59, 0);\n        DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 0, sPokedexScreenData->numOwnedNational, 52, 59, 2);\n    }\n    else\n    {\n        listMenuTemplate = sListMenuTemplate_KantoDexModeSelect;\n        listMenuTemplate.windowId = sPokedexScreenData->modeSelectWindowId;\n        sPokedexScreenData->modeSelectListMenuId = ListMenuInit(&listMenuTemplate, sPokedexScreenData->modeSelectCursorPos, sPokedexScreenData->modeSelectItemsAbove);\n        FillWindowPixelBuffer(sPokedexScreenData->dexCountsWindowId, PIXEL_FILL(0));\n        DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_NORMAL_COPY_1, gText_Seen, 0, 9, 0);\n        DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 1, sPokedexScreenData->numSeenKanto, 32, 21, 2);\n        DexScreen_AddTextPrinterParameterized(sPokedexScreenData->dexCountsWindowId, FONT_NORMAL_COPY_1, gText_Owned, 0, 37, 0);\n        DexScreen_PrintNum3RightAlign(sPokedexScreenData->dexCountsWindowId, 1, sPokedexScreenData->numOwnedKanto, 32, 49, 2);\n    }\n    FillWindowPixelBuffer(0, PIXEL_FILL(15));\n    DexScreen_PrintStringWithAlignment(gText_PokedexTableOfContents, TEXT_CENTER);\n    FillWindowPixelBuffer(1, PIXEL_FILL(15));\n    DexScreen_PrintControlInfo(gText_PickOK);\n    PutWindowTilemap(0);\n    CopyWindowToVram(0, COPYWIN_GFX);\n    PutWindowTilemap(1);\n    CopyWindowToVram(1, COPYWIN_GFX);\n    PutWindowTilemap(sPokedexScreenData->dexCountsWindowId);\n    CopyWindowToVram(sPokedexScreenData->dexCountsWindowId, COPYWIN_GFX);\n}\n\nstatic void MoveCursorFunc_DexModeSelect(s32 itemIndex, bool8 onInit, struct ListMenu *list)\n{\n    if (!onInit)\n        PlaySE(SE_SELECT);\n    if (itemIndex == LIST_CANCEL)\n    {\n        CopyToWindowPixelBuffer(sPokedexScreenData->selectionIconWindowId, sTopMenuSelectionIconTiles_Cancel, 0x000, 0x000);\n        LoadPalette(sTopMenuSelectionIconPals_Cancel, BG_PLTT_ID(1), PLTT_SIZE_4BPP);\n    }\n    else\n    {\n        CopyToWindowPixelBuffer(sPokedexScreenData->selectionIconWindowId, sTopMenuSelectionIconGfxPtrs[itemIndex].tiles, 0x000, 0x000);\n        LoadPalette(sTopMenuSelectionIconGfxPtrs[itemIndex].pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP);\n    }\n    PutWindowTilemap(sPokedexScreenData->selectionIconWindowId);\n    CopyWindowToVram(sPokedexScreenData->selectionIconWindowId, COPYWIN_GFX);\n}\n\nstatic void ItemPrintFunc_DexModeSelect(u8 windowId, u32 itemId, u8 y)\n{\n    if (itemId >= DEX_CATEGORY_COUNT || sPokedexScreenData->unlockedCategories & (1 << itemId))\n        ListMenuOverrideSetColors(TEXT_COLOR_WHITE, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY);\n    else\n        ListMenuOverrideSetColors(TEXT_DYNAMIC_COLOR_1, TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_2);\n}\n\nstatic void Task_DexScreen_NumericalOrder(u8 taskId)\n{\n    if(sPokedexScreenData->dexOrderId == DEX_ORDER_NUMERICAL_NATIONAL && !IsNationalPokedexEnabled())\n    {\n        //FlagSet(FLAG_SYS_EXTENDED_DEX_TOGGLE);\n    }\n    switch (sPokedexScreenData->state)\n    {\n    case 0:\n        ListMenuLoadStdPalAt(BG_PLTT_ID(1), 0);\n        ListMenuLoadStdPalAt(BG_PLTT_ID(2), 1);\n        sPokedexScreenData->orderedDexCount = DexScreen_CountMonsInOrderedList(sPokedexScreenData->dexOrderId);\n        sPokedexScreenData->state = 2;\n        break;\n    case 1:\n        DexScreen_DestroyDexOrderListMenu(sPokedexScreenData->dexOrderId);\n        HideBg(1);\n        DexScreen_RemoveWindow(&sPokedexScreenData->numericalOrderWindowId);\n        gTasks[taskId].func = Task_PokedexScreen;\n        sPokedexScreenData->state = 0;\n        break;\n    case 2:\n        DexScreen_InitGfxForNumericalOrderList();\n        sPokedexScreenData->state = 3;\n        break;\n    case 3:\n        CopyBgTilemapBufferToVram(3);\n        CopyBgTilemapBufferToVram(1);\n        sPokedexScreenData->state = 4;\n        break;\n    case 4:\n        ShowBg(1);\n        BeginNormalPaletteFade(~0x8000, 0, 16, 0, RGB_WHITEALPHA);\n        sPokedexScreenData->state = 5;\n        break;\n    case 5:\n        ListMenuGetScrollAndRow(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPosBak, NULL);\n        sPokedexScreenData->scrollArrowsTaskId = DexScreen_CreateDexOrderScrollArrows();\n        sPokedexScreenData->state = 6;\n        break;\n    case 6:\n        sPokedexScreenData->characteristicMenuInput = ListMenu_ProcessInput(sPokedexScreenData->orderedListMenuTaskId);\n        ListMenuGetScrollAndRow(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPosBak, NULL);\n        if (JOY_NEW(A_BUTTON))\n        {\n            if ((sPokedexScreenData->characteristicMenuInput >> 16) & 1)\n            {\n                sPokedexScreenData->dexSpecies = sPokedexScreenData->characteristicMenuInput;\n                RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId);\n                BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA);\n                sPokedexScreenData->state = 7;\n            }\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId);\n            BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA);\n            if(!IsNationalPokedexEnabled() && FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE))\n                FlagClear(FLAG_SYS_EXTENDED_DEX_TOGGLE);\n            sPokedexScreenData->state = 1;\n        }\n        else if (JOY_NEW(START_BUTTON) && FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && sPokedexScreenData->dexOrderId == 0 && IsNationalPokedexEnabled())\n        {\n            PlaySE(SE_SELECT);\n            RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId);\n            if(FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE))\n                FlagClear(FLAG_SYS_EXTENDED_DEX_TOGGLE);\n            else\n                FlagSet(FLAG_SYS_EXTENDED_DEX_TOGGLE);\n            sPokedexScreenData->dexOrderId = 0;\n            DexScreen_DestroyDexOrderListMenu(sPokedexScreenData->dexOrderId);\n            //BeginNormalPaletteFade(0xFFFF7FFF, 0, 0, 16, RGB_WHITEALPHA);\n            // can't get a smooth white transition like the other Pokedex transitions\n            // The BeginNormalPaletteFade function seems to just not work correctly here.\n            FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 32, 20);\n            CopyBgTilemapBufferToVram(1);\n            DexScreen_RemoveWindow(&sPokedexScreenData->numericalOrderWindowId);\n            sPokedexScreenData->kantoOrderMenuCursorPos = 0; //cursor pos reset\n            sPokedexScreenData->kantoOrderMenuItemsAbove = 0; //items above reset\n            DexScreen_RemoveWindow(&sPokedexScreenData->modeSelectWindowId);\n            DexScreen_RemoveWindow(&sPokedexScreenData->selectionIconWindowId);\n            DexScreen_RemoveWindow(&sPokedexScreenData->dexCountsWindowId);\n            gTasks[taskId].func = Task_DexScreen_NumericalOrder;\n            sPokedexScreenData->state = 0;\n            break;\n        }\n        break;\n    case 7:\n        DexScreen_DestroyDexOrderListMenu(sPokedexScreenData->dexOrderId);\n        FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 32, 20);\n        CopyBgTilemapBufferToVram(1);\n        DexScreen_RemoveWindow(&sPokedexScreenData->numericalOrderWindowId);\n        gTasks[taskId].func = Task_DexScreen_ShowMonPage;\n        sPokedexScreenData->state = 0;\n        break;\n    }\n}\n\nstatic void DexScreen_InitGfxForNumericalOrderList(void)\n{\n    struct ListMenuTemplate template;\n    FillBgTilemapBufferRect(3, 0x00E, 0, 0, 30, 20, 0);\n    FillBgTilemapBufferRect(1, 0x000, 0, 0, 32, 32, 17);\n    sPokedexScreenData->numericalOrderWindowId = AddWindow(&sWindowTemplate_OrderedListMenu);\n    template = sListMenuTemplate_OrderedListMenu;\n    template.items = sPokedexScreenData->listItems;\n    template.windowId = sPokedexScreenData->numericalOrderWindowId;\n    template.totalItems = sPokedexScreenData->orderedDexCount;\n    DexScreen_InitListMenuForOrderedList(&template, sPokedexScreenData->dexOrderId);\n    FillWindowPixelBuffer(0, PIXEL_FILL(15));\n    DexScreen_PrintStringWithAlignment(gText_PokemonListNoColor, TEXT_CENTER);\n    FillWindowPixelBuffer(1, PIXEL_FILL(15));\n    if(sPokedexScreenData->dexOrderId == DEX_ORDER_NUMERICAL_KANTO && IsNationalPokedexEnabled()) //viewing Kanto Dex\n    {\n        if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE))\n            DexScreen_AddTextPrinterParameterized(1, 0, gText_SwapToKanto, 8, 2, 4);  //print switch to Kanto\n        if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE))\n            DexScreen_AddTextPrinterParameterized(1, 0, gText_SwapToExtended, 8, 2, 4);  //print switch to Extended\n    }\n    DexScreen_PrintControlInfo(gText_PickOKExit);\n    CopyWindowToVram(0, COPYWIN_GFX);\n    CopyWindowToVram(1, COPYWIN_GFX);\n}\n\nstatic void Task_DexScreen_CharacteristicOrder(u8 taskId)\n{\n    switch (sPokedexScreenData->state)\n    {\n    case 0:\n        ListMenuLoadStdPalAt(BG_PLTT_ID(1), 0);\n        ListMenuLoadStdPalAt(BG_PLTT_ID(2), 1);\n        sPokedexScreenData->orderedDexCount = DexScreen_CountMonsInOrderedList(sPokedexScreenData->dexOrderId);\n        sPokedexScreenData->state = 2;\n        break;\n    case 1:\n        DexScreen_DestroyDexOrderListMenu(sPokedexScreenData->dexOrderId);\n        HideBg(1);\n        DexScreen_RemoveWindow(&sPokedexScreenData->numericalOrderWindowId);\n        gTasks[taskId].func = Task_PokedexScreen;\n        sPokedexScreenData->state = 0;\n        break;\n    case 2:\n        DexScreen_CreateCharacteristicListMenu();\n        sPokedexScreenData->state = 3;\n        break;\n    case 3:\n        CopyBgTilemapBufferToVram(3);\n        CopyBgTilemapBufferToVram(1);\n        sPokedexScreenData->state = 4;\n        break;\n    case 4:\n        ShowBg(1);\n        BeginNormalPaletteFade(~0x8000, 0, 16, 0, RGB_WHITEALPHA);\n        sPokedexScreenData->state = 5;\n        break;\n    case 5:\n        ListMenuGetScrollAndRow(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPosBak, NULL);\n        sPokedexScreenData->scrollArrowsTaskId = DexScreen_CreateDexOrderScrollArrows();\n        sPokedexScreenData->state = 6;\n        break;\n    case 6:\n        sPokedexScreenData->characteristicMenuInput = ListMenu_ProcessInput(sPokedexScreenData->orderedListMenuTaskId);\n        ListMenuGetScrollAndRow(sPokedexScreenData->modeSelectListMenuId, &sPokedexScreenData->modeSelectCursorPosBak, NULL);\n        if (JOY_NEW(A_BUTTON))\n        {\n            if (((sPokedexScreenData->characteristicMenuInput >> 16) & 1) && !DexScreen_LookUpCategoryBySpecies(sPokedexScreenData->characteristicMenuInput))\n            {\n                RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId);\n                BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA);\n                sPokedexScreenData->state = 7;\n            }\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId);\n            BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA);\n            sPokedexScreenData->state = 1;\n        }\n        break;\n    case 7:\n        DexScreen_DestroyDexOrderListMenu(sPokedexScreenData->dexOrderId);\n        FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 32, 20);\n        CopyBgTilemapBufferToVram(1);\n        DexScreen_RemoveWindow(&sPokedexScreenData->numericalOrderWindowId);\n        sPokedexScreenData->parentOfCategoryMenu = 1;\n        gTasks[taskId].func = Task_DexScreen_CategorySubmenu;\n        sPokedexScreenData->state = 0;\n        break;\n    }\n}\n\nstatic void DexScreen_CreateCharacteristicListMenu(void) //search mode printer\n{\n    struct ListMenuTemplate template;\n    FillBgTilemapBufferRect(3, 0x00E, 0, 0, 30, 20, 0);\n    FillBgTilemapBufferRect(1, 0x000, 0, 0, 32, 32, 17);\n    sPokedexScreenData->numericalOrderWindowId = AddWindow(&sWindowTemplate_OrderedListMenu);\n    template = sListMenuTemplate_OrderedListMenu;\n    template.items = sPokedexScreenData->listItems;\n    template.windowId = sPokedexScreenData->numericalOrderWindowId;\n    template.totalItems = sPokedexScreenData->orderedDexCount;\n    DexScreen_InitListMenuForOrderedList(&template, sPokedexScreenData->dexOrderId);\n    FillWindowPixelBuffer(0, PIXEL_FILL(15));\n    DexScreen_PrintStringWithAlignment(gText_SearchNoColor, TEXT_CENTER);\n    FillWindowPixelBuffer(1, PIXEL_FILL(15));\n    DexScreen_PrintControlInfo(gText_PickOKExit);\n    CopyWindowToVram(0, COPYWIN_GFX);\n    CopyWindowToVram(1, COPYWIN_GFX);\n}\n\nstatic int DexScreen_CanShowMonInDex(u16 species)\n{\n    if (IsNationalPokedexEnabled() == TRUE)\n        return TRUE;\n    if (FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && SpeciesToExtendedPokedexNum(species) <= EXTENDED_DEX_COUNT)\n        return TRUE;\n    if (SpeciesToNationalPokedexNum(species) <= KANTO_DEX_COUNT)\n        return TRUE;\n    return FALSE;\n}\n\nstatic u16 DexScreen_CountMonsInOrderedList(u8 orderIdx)\n{\n    s32 max_n;\n    u16 ndex_num;\n    u16 highest_dex_num;\n    u16 ret = NATIONAL_DEX_NONE;\n    s32 i;\n    bool8 caught;\n    bool8 seen;\n\n    if(IsNationalPokedexEnabled())\n        max_n = NATIONAL_DEX_COUNT;\n    else if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n        max_n = EXTENDED_DEX_COUNT;\n    else    //Kanto only\n        max_n = KANTO_DEX_COUNT;\n\n    switch (orderIdx)\n    {\n    default:\n    case DEX_ORDER_NUMERICAL_KANTO: //regular kanto dex list populator\n        if(!IsNationalPokedexEnabled() || !FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE))\n        {\n            for (i = 0; i < KANTO_DEX_COUNT; i++)\n            {\n                ndex_num = i + 1;\n                seen = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_SEEN, 0);\n                caught = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_CAUGHT, 0);\n                if (seen)\n                {\n                    sPokedexScreenData->listItems[i].label = gSpeciesNames[NationalPokedexNumToSpecies(ndex_num)];\n                    ret = ndex_num;\n                }\n                else\n                {\n                    sPokedexScreenData->listItems[i].label = gText_5Dashes;\n                }\n                sPokedexScreenData->listItems[i].index = (caught << 17) + (seen << 16) + NationalPokedexNumToSpecies(ndex_num);\n            }\n            break;\n        }\n        if(FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE) && IsNationalPokedexEnabled())\n        {\n            for (i = 0; i < EXTENDED_DEX_COUNT; i++)\n            {\n                ndex_num = i + 1;\n                seen = DexScreen_GetSetPokedexFlag(ExtendedToNationalOrder(ndex_num), FLAG_GET_SEEN, 0);\n                caught = DexScreen_GetSetPokedexFlag(ExtendedToNationalOrder(ndex_num), FLAG_GET_CAUGHT, 0);\n                if (seen)\n                {\n                    sPokedexScreenData->listItems[i].label = gSpeciesNames[ExtendedPokedexNumToSpecies(ndex_num)];\n                    ret = ndex_num;\n                }\n                else\n                {\n                    sPokedexScreenData->listItems[i].label = gText_5Dashes;\n                }\n                sPokedexScreenData->listItems[i].index = (caught << 17) + (seen << 16) + ExtendedPokedexNumToSpecies(ndex_num);\n            }\n            break;\n        }\n    case DEX_ORDER_ATOZ:\n        for (i = 0; i < NUM_SPECIES - 1; i++)\n        {\n            highest_dex_num = gPokedexOrder_Alphabetical[i];\n            if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n            {\n                ndex_num = NationalToExtendedOrder(gPokedexOrder_Alphabetical[i]);\n                highest_dex_num = ndex_num;\n                if(DexScreen_CanShowMonInDex(ndex_num) == FALSE) //not in highest dex mode\n                    continue;\n            }\n            ndex_num = gPokedexOrder_Alphabetical[i];\n            if (highest_dex_num <= max_n)\n            {\n                seen = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_SEEN, FALSE);\n                caught = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_CAUGHT, FALSE);\n                if (seen)\n                {\n                    sPokedexScreenData->listItems[ret].label = gSpeciesNames[NationalPokedexNumToSpecies(ndex_num)];\n                    sPokedexScreenData->listItems[ret].index = (caught << 17) + (seen << 16) + NationalPokedexNumToSpecies(ndex_num);\n                    ret++;\n                }\n            }\n        }\n        break;\n    case DEX_ORDER_TYPE:\n        for (i = 0; i < NUM_SPECIES - 1; i++)\n        {\n            if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n                ndex_num = SpeciesToExtendedPokedexNum(gPokedexOrder_TypeExtended[i]);\n            else    \n                ndex_num = SpeciesToNationalPokedexNum(gPokedexOrder_Type[i]);\n            if(DexScreen_CanShowMonInDex(ndex_num) == FALSE) //not in highest dex mode\n                continue;\n            if (ndex_num <= max_n)\n            {\n                seen = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_SEEN, FALSE);\n                caught = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_CAUGHT, FALSE);\n                if (caught)\n                {\n                    if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n                    {\n                        sPokedexScreenData->listItems[ret].label = gSpeciesNames[ExtendedPokedexNumToSpecies(ndex_num)];\n                        sPokedexScreenData->listItems[ret].index = (caught << 17) + (seen << 16) + ExtendedPokedexNumToSpecies(ndex_num);\n                    }\n                    else\n                    {\n                        sPokedexScreenData->listItems[ret].label = gSpeciesNames[NationalPokedexNumToSpecies(ndex_num)];\n                        sPokedexScreenData->listItems[ret].index = (caught << 17) + (seen << 16) + NationalPokedexNumToSpecies(ndex_num);\n                    }\n                    ret++;\n                }\n            }\n        }\n        break;\n    case DEX_ORDER_LIGHTEST:\n        for (i = 0; i < NATIONAL_DEX_COUNT; i++)\n        {\n            highest_dex_num = gPokedexOrder_Weight[i];\n            if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n            {\n                ndex_num = NationalToExtendedOrder(gPokedexOrder_Weight[i]);\n                highest_dex_num = ndex_num;\n                if(DexScreen_CanShowMonInDex(ndex_num) == FALSE) //not in highest dex mode\n                    continue;\n            }\n            ndex_num = gPokedexOrder_Weight[i];\n            if (highest_dex_num <= max_n)\n            {\n                seen = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_SEEN, FALSE);\n                caught = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_CAUGHT, FALSE);\n                if (caught)\n                {\n                    sPokedexScreenData->listItems[ret].label = gSpeciesNames[NationalPokedexNumToSpecies(ndex_num)];\n                    sPokedexScreenData->listItems[ret].index = (caught << 17) + (seen << 16) + NationalPokedexNumToSpecies(ndex_num);\n                    ret++;\n                }\n            }\n        }\n        break;\n    case DEX_ORDER_SMALLEST:\n        for (i = 0; i < NATIONAL_DEX_COUNT; i++)\n        {\n            highest_dex_num = gPokedexOrder_Height[i];\n            if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n            {\n                ndex_num = NationalToExtendedOrder(gPokedexOrder_Height[i]);\n                highest_dex_num = ndex_num;\n                if(DexScreen_CanShowMonInDex(ndex_num) == FALSE) //not in highest dex mode\n                    continue;\n            }\n            ndex_num = gPokedexOrder_Height[i];\n            if (highest_dex_num <= max_n)\n            {\n                seen = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_SEEN, FALSE);\n                caught = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_CAUGHT, FALSE);\n                if (caught)\n                {\n                    sPokedexScreenData->listItems[ret].label = gSpeciesNames[NationalPokedexNumToSpecies(ndex_num)];\n                    sPokedexScreenData->listItems[ret].index = (caught << 17) + (seen << 16) + NationalPokedexNumToSpecies(ndex_num);\n                    ret++;\n                }\n            }\n        }\n        break;\n    case DEX_ORDER_NUMERICAL_NATIONAL: //national dex list populator\n        if(IsNationalPokedexEnabled())\n        {\n            for (i = 0; i < NATIONAL_DEX_COUNT; i++)\n            {\n                ndex_num = i + 1;\n                seen = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_SEEN, 0);\n                caught = DexScreen_GetSetPokedexFlag(ndex_num, FLAG_GET_CAUGHT, 0);\n                if (seen)\n                {\n                    sPokedexScreenData->listItems[i].label = gSpeciesNames[NationalPokedexNumToSpecies(ndex_num)];\n                    ret = ndex_num;\n                }\n                else\n                {\n                    sPokedexScreenData->listItems[i].label = gText_5Dashes;\n                }\n                sPokedexScreenData->listItems[i].index = (caught << 17) + (seen << 16) + NationalPokedexNumToSpecies(ndex_num);\n            }\n            break;\n        }\n        else\n        {\n            for (i = 0; i < EXTENDED_DEX_COUNT; i++)\n            {\n                ndex_num = i + 1;\n                seen = DexScreen_GetSetPokedexFlag(ExtendedToNationalOrder(ndex_num), FLAG_GET_SEEN, 0);\n                caught = DexScreen_GetSetPokedexFlag(ExtendedToNationalOrder(ndex_num), FLAG_GET_CAUGHT, 0);\n                if (seen)\n                {\n                    sPokedexScreenData->listItems[i].label = gSpeciesNames[ExtendedPokedexNumToSpecies(ndex_num)];\n                    ret = ndex_num;\n                }\n                else\n                {\n                    sPokedexScreenData->listItems[i].label = gText_5Dashes;\n                }\n                sPokedexScreenData->listItems[i].index = (caught << 17) + (seen << 16) + ExtendedPokedexNumToSpecies(ndex_num);\n            }\n            break;\n        }\n    }\n    return ret;\n}\n\nstatic void DexScreen_InitListMenuForOrderedList(const struct ListMenuTemplate * template, u8 order)\n{\n    switch (order)\n    {\n    default:\n    case DEX_ORDER_NUMERICAL_KANTO:\n        sPokedexScreenData->orderedListMenuTaskId = ListMenuInitInRect(template, sListMenuRects_OrderedList, sPokedexScreenData->kantoOrderMenuCursorPos, sPokedexScreenData->kantoOrderMenuItemsAbove);\n        break;\n    case DEX_ORDER_ATOZ:\n    case DEX_ORDER_TYPE:\n    case DEX_ORDER_LIGHTEST:\n    case DEX_ORDER_SMALLEST:\n        sPokedexScreenData->orderedListMenuTaskId = ListMenuInitInRect(template, sListMenuRects_OrderedList, sPokedexScreenData->characteristicOrderMenuCursorPos, sPokedexScreenData->characteristicOrderMenuItemsAbove);\n        break;\n    case DEX_ORDER_NUMERICAL_NATIONAL:\n        sPokedexScreenData->orderedListMenuTaskId = ListMenuInitInRect(template, sListMenuRects_OrderedList, sPokedexScreenData->nationalOrderMenuCursorPos, sPokedexScreenData->nationalOrderMenuItemsAbove);\n        break;\n    }\n}\n\nstatic void DexScreen_DestroyDexOrderListMenu(u8 order)\n{\n    switch (order)\n    {\n    default:\n    case DEX_ORDER_NUMERICAL_KANTO:\n        DestroyListMenuTask(sPokedexScreenData->orderedListMenuTaskId, &sPokedexScreenData->kantoOrderMenuCursorPos, &sPokedexScreenData->kantoOrderMenuItemsAbove);\n        break;\n    case DEX_ORDER_ATOZ:\n    case DEX_ORDER_TYPE:\n    case DEX_ORDER_LIGHTEST:\n    case DEX_ORDER_SMALLEST:\n        DestroyListMenuTask(sPokedexScreenData->orderedListMenuTaskId, &sPokedexScreenData->characteristicOrderMenuCursorPos, &sPokedexScreenData->characteristicOrderMenuItemsAbove);\n        break;\n    case DEX_ORDER_NUMERICAL_NATIONAL:\n        DestroyListMenuTask(sPokedexScreenData->orderedListMenuTaskId, &sPokedexScreenData->nationalOrderMenuCursorPos, &sPokedexScreenData->nationalOrderMenuItemsAbove);\n        break;\n    }\n}\n\nstatic u8 DexScreen_CreateDexOrderScrollArrows(void)\n{\n    struct ScrollArrowsTemplate template = sDexOrderScrollArrowsTemplate;\n    if (sPokedexScreenData->orderedDexCount > sListMenuTemplate_OrderedListMenu.maxShowed)\n        template.fullyDownThreshold = sPokedexScreenData->orderedDexCount - sListMenuTemplate_OrderedListMenu.maxShowed;\n    else\n        template.fullyDownThreshold = 0;\n    return AddScrollIndicatorArrowPair(&template, &sPokedexScreenData->modeSelectCursorPosBak);\n}\n\nstruct PokedexListItem\n{\n    u16 species;\n    bool8 seen:1;\n    bool8 caught:1;\n};\n\nstatic void ItemPrintFunc_OrderedListMenu(u8 windowId, u32 itemId, u8 y)\n{\n    u16 species = itemId;\n    bool8 seen = (itemId >> 16) & 1;  // not used but required to match\n    bool8 caught = (itemId >> 17) & 1;\n    u8 type1;\n    DexScreen_PrintMonDexNo(sPokedexScreenData->numericalOrderWindowId, FONT_SMALL, species, 12, y); //controls Pokedex num on scrolling lists\n    if (caught)\n    {\n        BlitMenuInfoIcon(sPokedexScreenData->numericalOrderWindowId, MENU_INFO_ICON_CAUGHT, 0x28, y);\n        type1 = gSpeciesInfo[species].types[0];\n        BlitMenuInfoIcon(sPokedexScreenData->numericalOrderWindowId, type1 + 1, 0x78, y);\n        if (type1 != gSpeciesInfo[species].types[1])\n            BlitMenuInfoIcon(sPokedexScreenData->numericalOrderWindowId, gSpeciesInfo[species].types[1] + 1, 0x98, y);\n    }\n}\n\nstatic void Task_DexScreen_CategorySubmenu(u8 taskId) // habitat pages\n{\n    int pageFlipCmd;\n    u8 *ptr;\n    switch (sPokedexScreenData->state)\n    {\n    case 0:\n        HideBg(3);\n        HideBg(2);\n        HideBg(1);\n        DexScreen_GetPageLimitsForCategory(sPokedexScreenData->category);\n        if (sPokedexScreenData->pageNum < sPokedexScreenData->firstPageInCategory)\n            sPokedexScreenData->pageNum = sPokedexScreenData->firstPageInCategory;\n        sPokedexScreenData->state = 2;\n        break;\n    case 1:\n        DexScreen_DestroyCategoryPageMonIconAndInfoWindows();\n        HideBg(2);\n        HideBg(1);\n        switch (sPokedexScreenData->parentOfCategoryMenu)\n        {\n        case 0:\n        default:\n            gTasks[taskId].func = Task_PokedexScreen;\n            break;\n        case 1:\n            gTasks[taskId].func = Task_DexScreen_CharacteristicOrder;\n            break;\n        }\n        sPokedexScreenData->state = 0;\n        break;\n    case 2:\n        DexScreen_CreateCategoryListGfx(FALSE);\n        CopyBgTilemapBufferToVram(3);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        DexScreen_CreateCategoryPageSelectionCursor(0xFF);\n        sPokedexScreenData->state = 3;\n        break;\n    case 3:\n        BeginNormalPaletteFade(~0x8000, 0, 16, 0, RGB_WHITEALPHA);\n        ShowBg(3);\n        ShowBg(2);\n        ShowBg(1);\n        sPokedexScreenData->state = 4;\n        break;\n    case 4:\n        sPokedexScreenData->scrollArrowsTaskId = DexScreen_CreateCategoryMenuScrollArrows();\n        sPokedexScreenData->categoryPageCursorTaskId = ListMenuAddCursorObjectInternal(&sCursorStruct_CategoryPage, 0);\n        sPokedexScreenData->state = 5;\n        break;\n    case 5:\n        DexScreen_CreateCategoryPageSelectionCursor(sPokedexScreenData->categoryCursorPosInPage);\n        DexScreen_UpdateCategoryPageCursorObject(sPokedexScreenData->categoryPageCursorTaskId, sPokedexScreenData->categoryCursorPosInPage, sPokedexScreenData->numMonsOnPage);\n        sPokedexScreenData->modeSelectCursorPosBak = sPokedexScreenData->pageNum;\n        pageFlipCmd = 0;\n        if (JOY_NEW(A_BUTTON) && DexScreen_GetSetPokedexFlag(sPokedexScreenData->pageSpecies[sPokedexScreenData->categoryCursorPosInPage], FLAG_GET_SEEN, TRUE))\n        {\n            RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId);\n            ListMenuRemoveCursorObject(sPokedexScreenData->categoryPageCursorTaskId, 0);\n            if(sPokedexScreenData->dexOrderId == DEX_ORDER_NUMERICAL_KANTO)\n                sPokedexScreenData->dexOrderId = DEX_ORDER_NUMERICAL_NATIONAL; //making always use correct numbering?\n            sPokedexScreenData->state = 12;\n            break;\n        }\n        if (!JOY_HELD(R_BUTTON) && JOY_REPT(DPAD_LEFT))\n        {\n            if (sPokedexScreenData->categoryCursorPosInPage != 0)\n            {\n                sPokedexScreenData->categoryCursorPosInPage--;\n                PlaySE(SE_SELECT);\n                break;\n            }\n            else\n                pageFlipCmd = 1;\n        }\n        if (!JOY_HELD(R_BUTTON) && JOY_REPT(DPAD_RIGHT))\n        {\n            if (sPokedexScreenData->categoryCursorPosInPage < sPokedexScreenData->numMonsOnPage - 1)\n            {\n                sPokedexScreenData->categoryCursorPosInPage++;\n                PlaySE(SE_SELECT);\n                break;\n            }\n            else\n                pageFlipCmd = 2;\n        }\n        if (pageFlipCmd == 0)\n            pageFlipCmd = DexScreen_InputHandler_GetShoulderInput();\n        switch (pageFlipCmd)\n        {\n        case 0: // No action\n            break;\n        case 1: // Left\n            while (sPokedexScreenData->pageNum > sPokedexScreenData->firstPageInCategory)\n            {\n                sPokedexScreenData->pageNum--;\n                if (DexScreen_IsPageUnlocked(sPokedexScreenData->category, sPokedexScreenData->pageNum))\n                {\n                    sPokedexScreenData->state = 8;\n                    break;\n                }\n            }\n            if (sPokedexScreenData->state != 8)\n                sPokedexScreenData->state = 6;\n            break;\n        case 2: // Right\n            while (sPokedexScreenData->pageNum < sPokedexScreenData->lastPageInCategory - 1)\n            {\n                sPokedexScreenData->pageNum++;\n                if (DexScreen_IsPageUnlocked(sPokedexScreenData->category, sPokedexScreenData->pageNum))\n                {\n                    sPokedexScreenData->state = 10;\n                    break;\n                }\n            }\n            if (sPokedexScreenData->state != 10)\n                sPokedexScreenData->state = 6;\n            break;\n        }\n        if (JOY_NEW(B_BUTTON))\n        {\n            sPokedexScreenData->state = 6;\n        }\n        break;\n    case 6:\n    case 7:\n        RemoveScrollIndicatorArrowPair(sPokedexScreenData->scrollArrowsTaskId);\n        ListMenuRemoveCursorObject(sPokedexScreenData->categoryPageCursorTaskId, 0);\n        BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA);\n        sPokedexScreenData->state = 1;\n        break;\n    case 8:\n    case 10:\n        DexScreen_DestroyCategoryPageMonIconAndInfoWindows();\n        DexScreen_CreateCategoryPageSelectionCursor(0xFF);\n        ListMenuUpdateCursorObject(sPokedexScreenData->categoryPageCursorTaskId, 0, 0xA0, 0);\n        sPokedexScreenData->categoryPageSelectionCursorTimer = 0;\n        sPokedexScreenData->data[0] = 0;\n        sPokedexScreenData->state++;\n        break;\n    case 9:\n        if (DexScreen_FlipCategoryPageInDirection(0))\n        {\n            sPokedexScreenData->categoryCursorPosInPage = sPokedexScreenData->numMonsOnPage - 1;\n            sPokedexScreenData->state = 5;\n        }\n        break;\n    case 11:\n        if (DexScreen_FlipCategoryPageInDirection(1))\n        {\n            sPokedexScreenData->categoryCursorPosInPage = 0;\n            sPokedexScreenData->state = 5;\n        }\n        break;\n    case 12:\n        sPokedexScreenData->dexSpecies = sPokedexScreenData->pageSpecies[sPokedexScreenData->categoryCursorPosInPage];\n        PlaySE(SE_SELECT);\n        sPokedexScreenData->state = 14;\n        break;\n    case 13:\n        RemoveDexPageWindows();\n        sPokedexScreenData->state = 4;\n        break;\n    case 14:\n        DexScreen_DrawMonDexPage(FALSE);\n        sPokedexScreenData->state = 15;\n        break;\n    case 15:\n        sPokedexScreenData->data[0] = 0;\n        sPokedexScreenData->data[1] = 0;\n        sPokedexScreenData->state++;\n        // fallthrough\n    case 16:\n        if (sPokedexScreenData->data[1] < 6)\n        {\n            if (sPokedexScreenData->data[0])\n            {\n                DexScreen_DexPageZoomEffectFrame(0, sPokedexScreenData->data[1]);\n                CopyBgTilemapBufferToVram(0);\n                sPokedexScreenData->data[0] = 4;\n                sPokedexScreenData->data[1]++;\n            }\n            else\n            {\n                sPokedexScreenData->data[0]--;\n            }\n        }\n        else\n        {\n            FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16);\n            CopyBgTilemapBufferToVram(3);\n            CopyBgTilemapBufferToVram(2);\n            CopyBgTilemapBufferToVram(1);\n            CopyBgTilemapBufferToVram(0);\n            PlayCry_NormalNoDucking(sPokedexScreenData->dexSpecies, 0, CRY_VOLUME_RS, CRY_PRIORITY_NORMAL);\n            gSaveBlock1Ptr->lastViewedPokedexEntry = sPokedexScreenData->dexSpecies;\n            sPokedexScreenData->data[0] = 0;\n            sPokedexScreenData->state = 17;\n        }\n        break;\n    case 17:\n        if (JOY_NEW(A_BUTTON))\n        {\n            RemoveDexPageWindows();\n            FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 16);\n            CopyBgTilemapBufferToVram(1);\n            sPokedexScreenData->state = 21;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            sPokedexScreenData->state = 18;\n        }\n        else\n        {\n            DexScreen_InputHandler_StartToCry();\n        }\n        break;\n    case 18:\n        DexScreen_CreateCategoryListGfx(FALSE);\n        DexScreen_DexPageZoomEffectFrame(0, 6);\n        CopyBgTilemapBufferToVram(3);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(0);\n        sPokedexScreenData->state = 19;\n        break;\n    case 19:\n        sPokedexScreenData->data[0] = 0;\n        sPokedexScreenData->data[1] = 6;\n        sPokedexScreenData->state++;\n        // fallthrough\n    case 20:\n        if (sPokedexScreenData->data[1])\n        {\n            if (sPokedexScreenData->data[0])\n            {\n                sPokedexScreenData->data[1]--;\n                FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16);\n                DexScreen_DexPageZoomEffectFrame(0, sPokedexScreenData->data[1]);\n                CopyBgTilemapBufferToVram(0);\n                sPokedexScreenData->data[0] = 1;\n            }\n            else\n                sPokedexScreenData->data[0]--;\n        }\n        else\n        {\n            FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16);\n            CopyBgTilemapBufferToVram(0);\n            sPokedexScreenData->state = 13;\n        }\n        break;\n    case 21:\n        DexScreen_DrawMonAreaPage();\n        sPokedexScreenData->state = 22;\n        break;\n    case 22:\n        CopyBgTilemapBufferToVram(3);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(0);\n        sPokedexScreenData->state = 23;\n        break;\n    case 23:\n        if (JOY_NEW(A_BUTTON))\n        {\n            FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 2, 30, 16);\n            FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 16);\n            FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16);\n            CopyBgTilemapBufferToVram(2);\n            CopyBgTilemapBufferToVram(1);\n            CopyBgTilemapBufferToVram(0);\n            sPokedexScreenData->state = 26;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 2, 30, 16);\n            FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 16);\n            FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16);\n            CopyBgTilemapBufferToVram(2);\n            CopyBgTilemapBufferToVram(1);\n            CopyBgTilemapBufferToVram(0);\n            sPokedexScreenData->state = 24;\n        }\n        else\n        {\n            DexScreen_InputHandler_StartToCry();\n        }\n        break;\n    case 24:\n        DexScreen_DestroyAreaScreenResources();\n        sPokedexScreenData->state = 25;\n        break;\n    case 25:\n        DexScreen_DrawMonDexPage(FALSE);\n        CopyBgTilemapBufferToVram(3);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(0);\n        sPokedexScreenData->state = 17;\n        break;\n    case 26:\n        DexScreen_DestroyAreaScreenResources();\n        sPokedexScreenData->state = 18;\n        break;\n    }\n}\n\nstatic u8 DexScreen_CreateCategoryMenuScrollArrows(void)\n{\n    struct ScrollArrowsTemplate template = sScrollArrowsTemplate_CategoryMenu;\n    template.fullyUpThreshold = sPokedexScreenData->firstPageInCategory;\n    template.fullyDownThreshold = sPokedexScreenData->lastPageInCategory - 1;\n    sPokedexScreenData->modeSelectCursorPosBak = sPokedexScreenData->pageNum;\n    return AddScrollIndicatorArrowPair(&template, &sPokedexScreenData->modeSelectCursorPosBak);\n}\n\n/*\n * Returns 1 to flip pages left, 2 to flip pages right, 0 for no action\n */\nstatic int DexScreen_InputHandler_GetShoulderInput(void)\n{\n    switch (gSaveBlock2Ptr->optionsButtonMode)\n    {\n    case OPTIONS_BUTTON_MODE_L_EQUALS_A:\n        // Using the JOY_HELD and JOY_NEW macros here does not match!\n        if ((gMain.heldKeys & R_BUTTON) && (gMain.newKeys & DPAD_LEFT))\n            return 1;\n        else if ((gMain.heldKeys & R_BUTTON) && (gMain.newKeys & DPAD_RIGHT))\n            return 2;\n        else\n            return 0;\n    case OPTIONS_BUTTON_MODE_LR:\n        if (gMain.newKeys & L_BUTTON)\n            return 1;\n        else if (gMain.newKeys & R_BUTTON)\n            return 2;\n        else\n            return 0;\n    case OPTIONS_BUTTON_MODE_HELP:\n    default:\n        return 0;\n    }\n}\n\nstatic void Task_DexScreen_ShowMonPage(u8 taskId)\n{\n    switch (sPokedexScreenData->state)\n    {\n    case 0:\n        HideBg(3);\n        HideBg(2);\n        HideBg(1);\n        sPokedexScreenData->state = 2;\n        break;\n    case 1:\n        HideBg(2);\n        HideBg(1);\n        gTasks[taskId].func = Task_DexScreen_NumericalOrder;\n        sPokedexScreenData->state = 0;\n        break;\n    case 2:\n        sPokedexScreenData->numMonsOnPage = 1;\n        DexScreen_DrawMonDexPage(FALSE);\n        sPokedexScreenData->state = 3;\n        break;\n    case 3:\n        CopyBgTilemapBufferToVram(3);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(0);\n        PlayCry_NormalNoDucking(sPokedexScreenData->dexSpecies, 0, CRY_VOLUME_RS, CRY_PRIORITY_NORMAL);\n        gSaveBlock1Ptr->lastViewedPokedexEntry = sPokedexScreenData->dexSpecies;\n        sPokedexScreenData->state = 4;\n        break;\n    case 4:\n        BeginNormalPaletteFade(~0x8000, 0, 16, 0, RGB_WHITEALPHA);\n        ShowBg(3);\n        ShowBg(2);\n        ShowBg(1);\n        sPokedexScreenData->state = 5;\n        break;\n    case 5:\n        if (JOY_NEW(A_BUTTON))\n        {\n            RemoveDexPageWindows();\n            FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 16);\n            CopyBgTilemapBufferToVram(1);\n            sPokedexScreenData->state = 7;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            RemoveDexPageWindows();\n            BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA);\n            sPokedexScreenData->state = 1;\n        }\n        else if (JOY_NEW(DPAD_UP) && DexScreen_TryScrollMonsVertical(1))\n        {\n            RemoveDexPageWindows();\n            BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA);\n            sPokedexScreenData->state = 6;\n        }\n        else if (JOY_NEW(DPAD_DOWN) && DexScreen_TryScrollMonsVertical(0))\n        {\n            RemoveDexPageWindows();\n            BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA);\n            sPokedexScreenData->state = 6;\n        }\n        else\n        {\n            DexScreen_InputHandler_StartToCry();\n        }\n        break;\n    case 6:\n        HideBg(2);\n        HideBg(1);\n        sPokedexScreenData->dexSpecies = sPokedexScreenData->characteristicMenuInput;\n        sPokedexScreenData->state = 2;\n        break;\n    case 7:\n        DexScreen_DrawMonAreaPage();\n        sPokedexScreenData->state = 8;\n        break;\n    case 8:\n        CopyBgTilemapBufferToVram(3);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(0);\n        sPokedexScreenData->state = 9;\n        break;\n    case 9:\n        if (JOY_NEW(A_BUTTON))\n        {\n            BeginNormalPaletteFade(~0x8000, 0, 0, 16, RGB_WHITEALPHA);\n            sPokedexScreenData->state = 12;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 2, 30, 16);\n            FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 16);\n            FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16);\n            CopyBgTilemapBufferToVram(2);\n            CopyBgTilemapBufferToVram(1);\n            CopyBgTilemapBufferToVram(0);\n            sPokedexScreenData->state = 10;\n        }\n        else\n        {\n            DexScreen_InputHandler_StartToCry();\n        }\n        break;\n    case 10:\n        DexScreen_DestroyAreaScreenResources();\n        sPokedexScreenData->state = 11;\n        break;\n    case 11:\n        DexScreen_DrawMonDexPage(FALSE);\n        CopyBgTilemapBufferToVram(3);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(0);\n        sPokedexScreenData->state = 5;\n        break;\n    case 12:\n        DexScreen_DestroyAreaScreenResources();\n        FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 2, 30, 16);\n        CopyBgTilemapBufferToVram(0);\n        sPokedexScreenData->state = 1;\n        break;\n    }\n}\n\nstatic bool32 DexScreen_TryScrollMonsVertical(u8 direction)\n{\n    int selectedIndex;\n    u16 *itemsAbove_p, *cursorPos_p;\n\n    switch (sPokedexScreenData->dexOrderId)\n    {\n    default:\n    case DEX_ORDER_NUMERICAL_KANTO:\n        cursorPos_p = &sPokedexScreenData->kantoOrderMenuCursorPos;\n        itemsAbove_p = &sPokedexScreenData->kantoOrderMenuItemsAbove;\n        break;\n    case DEX_ORDER_ATOZ:\n    case DEX_ORDER_TYPE:\n    case DEX_ORDER_LIGHTEST:\n    case DEX_ORDER_SMALLEST:\n        cursorPos_p = &sPokedexScreenData->characteristicOrderMenuCursorPos;\n        itemsAbove_p = &sPokedexScreenData->characteristicOrderMenuItemsAbove;\n        break;\n    case DEX_ORDER_NUMERICAL_NATIONAL:\n        cursorPos_p = &sPokedexScreenData->nationalOrderMenuCursorPos;\n        itemsAbove_p = &sPokedexScreenData->nationalOrderMenuItemsAbove;\n        break;\n    }\n\n    selectedIndex = *cursorPos_p + *itemsAbove_p;\n    if (direction) // Seek up\n    {\n        if (selectedIndex == 0)\n            return FALSE;\n\n        selectedIndex--;\n        while (selectedIndex >= 0) //Should be while (--selectedIndex >= 0) without the selectedIndex-- in the body or before the while at all, but this is needed to match.\n        {\n            if ((sPokedexScreenData->listItems[selectedIndex].index >> 16) & 1)\n            {\n                break;\n            }\n            selectedIndex--;\n        }\n\n        if (selectedIndex < 0)\n        {\n            return FALSE;\n        }\n    }\n    else // Seek down\n    {\n        if (selectedIndex == sPokedexScreenData->orderedDexCount - 1)\n        {\n            return FALSE;\n        }\n\n        selectedIndex++;\n        while (selectedIndex < sPokedexScreenData->orderedDexCount) //Should be while (++selectedIndex < sPokedexScreenData->orderedDexCount) without the selectedIndex++ in the body or before the while at all, but this is needed to match.\n        {\n            if ((sPokedexScreenData->listItems[selectedIndex].index >> 16) & 1)\n                break;\n            selectedIndex++;\n        }\n        if (selectedIndex >= sPokedexScreenData->orderedDexCount)\n        {\n            return FALSE;\n        }\n    }\n    sPokedexScreenData->characteristicMenuInput = sPokedexScreenData->listItems[selectedIndex].index;\n\n    if (sPokedexScreenData->orderedDexCount > 9)\n    {\n        if (selectedIndex < 4)\n        {\n            *cursorPos_p = 0;\n            *itemsAbove_p = selectedIndex;\n        }\n        else if (selectedIndex >= (sPokedexScreenData->orderedDexCount - 4))\n        {\n            *cursorPos_p = (sPokedexScreenData->orderedDexCount - 9);\n            *itemsAbove_p = selectedIndex + 9 - (sPokedexScreenData->orderedDexCount);\n        }\n        else\n        {\n            *cursorPos_p = selectedIndex - 4;\n            *itemsAbove_p = 4;\n        }\n    }\n    else\n    {\n        *cursorPos_p = 0;\n        *itemsAbove_p = selectedIndex;\n    }\n    return TRUE;\n}\n\nstatic void DexScreen_RemoveWindow(u8 *windowId_p)\n{\n    if (*windowId_p != 0xFF)\n    {\n        RemoveWindow(*windowId_p);\n        *windowId_p = 0xFF;\n    }\n}\n\nstatic void DexScreen_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx)\n{\n    u8 textColor[3];\n    switch (colorIdx)\n    {\n    case 0:\n        textColor[0] = 0;\n        textColor[1] = 1;\n        textColor[2] = 3;\n        break;\n    case 1:\n        textColor[0] = 0;\n        textColor[1] = 5;\n        textColor[2] = 1;\n        break;\n    case 2:\n        textColor[0] = 0;\n        textColor[1] = 15;\n        textColor[2] = 14;\n        break;\n    case 3:\n        textColor[0] = 0;\n        textColor[1] = 11;\n        textColor[2] = 1;\n        break;\n    case 4:\n        textColor[0] = 0;\n        textColor[1] = 1;\n        textColor[2] = 2;\n        break;\n    }\n    AddTextPrinterParameterized4(windowId, fontId, x, y, fontId == FONT_SMALL ? 0 : 1, 0, textColor, -1, str);\n}\n\nstatic void DexScreen_PrintNum3LeadingZeroes(u8 windowId, u8 fontId, u16 num, u8 x, u8 y, u8 colorIdx)\n{\n    u8 buff[4];\n    buff[0] = (num / 100) + CHAR_0;\n    buff[1] = ((num %= 100) / 10) + CHAR_0;\n    buff[2] = (num % 10) + CHAR_0;\n    buff[3] = EOS;\n    DexScreen_AddTextPrinterParameterized(windowId, fontId, buff, x, y, colorIdx);\n}\n\nstatic void DexScreen_PrintNum3RightAlign(u8 windowId, u8 fontId, u16 num, u8 x, u8 y, u8 colorIdx)\n{\n    u8 buff[4];\n    int i;\n    buff[0] = (num / 100) + CHAR_0;\n    buff[1] = ((num %= 100) / 10) + CHAR_0;\n    buff[2] = (num % 10) + CHAR_0;\n    buff[3] = EOS;\n    for (i = 0; i < 3; i++)\n    {\n        if (buff[i] != CHAR_0)\n            break;\n        buff[i] = CHAR_SPACE;\n    }\n    DexScreen_AddTextPrinterParameterized(windowId, fontId, buff, x, y, colorIdx);\n}\n\nstatic u32 DexScreen_GetDefaultPersonality(int species)\n{\n    switch (species)\n    {\n    case SPECIES_SPINDA:\n        return gSaveBlock2Ptr->pokedex.spindaPersonality;\n    case SPECIES_UNOWN:\n        return gSaveBlock2Ptr->pokedex.unownPersonality;\n    default:\n        return 0;\n    }\n}\n\nstatic void DexScreen_LoadMonPicInWindow(u8 windowId, u16 species, u16 paletteOffset)\n{\n    LoadMonPicInWindow(species, SHINY_ODDS, DexScreen_GetDefaultPersonality(species), TRUE, paletteOffset >> 4, windowId);\n}\n\nstatic void DexScreen_PrintMonDexNo(u8 windowId, u8 fontId, u16 species, u8 x, u8 y)\n{\n    u8 state;\n    u8 numToPrint;\n    if(IsNationalPokedexEnabled())\n        state = 3;\n    else if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n        state = 2;\n    else    //Kanto only\n        state = 1;\n\n    switch(state) //setting up which numbers to print\n    {\n        case 1: //only Kanto, always national ordering\n            numToPrint = 0;\n            break;\n        case 2: //extended but not national, conditional\n            if(sPokedexScreenData->dexOrderId == 0)\n                numToPrint = 0;\n            else if(sPokedexScreenData->dexOrderId == 5)\n                numToPrint = 1;\n            else\n                numToPrint = 1;\n            break;\n        case 3: //national\n            if(sPokedexScreenData->dexOrderId == 0)\n            {\n                if(FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE))\n                    numToPrint = 1;\n                else\n                    numToPrint = 0;\n            }\n            else\n                numToPrint = 0;\n            break;\n    }\n\n    if(!numToPrint)\n    {   // use national numbering\n        u16 dexNum = SpeciesToNationalPokedexNum(species);\n        DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0);\n        DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0);\n        return;\n    }\n    else\n    {   // use extended numbering\n        u16 dexNum = SpeciesToExtendedPokedexNum(species);\n        DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0);\n        DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0);\n        return;\n    }\n    /*\n    if(sPokedexScreenData->dexOrderId == 0)\n    {\n        if(FlagGet(FLAG_SYS_EXTENDED_DEX_TOGGLE) && IsNationalPokedexEnabled())\n        {   // use extended numbering\n            u16 dexNum = SpeciesToExtendedPokedexNum(species);\n            DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0);\n            DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0);\n            return;\n        }\n        else\n        {   // use national numbering\n            u16 dexNum = SpeciesToNationalPokedexNum(species);\n            DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0);\n            DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0);\n            return;\n        }\n    }\n    if(sPokedexScreenData->dexOrderId == 5)\n    {   \n        if(!IsNationalPokedexEnabled())\n        {   // use extended numbering, on natdex page but no natdex\n            u16 dexNum = SpeciesToExtendedPokedexNum(species);\n            DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0);\n            DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0);\n            return;\n        }\n        else\n        {   //with natdex, always use national numbering on natdex page\n            u16 dexNum = SpeciesToNationalPokedexNum(species);\n            DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0);\n            DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0);\n            return;\n        }\n    }\n    if(sPokedexScreenData->dexOrderId != 0 && sPokedexScreenData->dexOrderId != 5)\n    {   //for ABC, Weight, Height, etc. modes\n        if(IsNationalPokedexEnabled() || (!IsNationalPokedexEnabled() && !FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX)))\n        {   //just Kanto Dex, or have National dex\n            u16 dexNum = SpeciesToNationalPokedexNum(species);\n            DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0);\n            DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0);\n            return;\n        }\n        if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n        {   //just Extended but not national\n            u16 dexNum = SpeciesToExtendedPokedexNum(species);\n            DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0);\n            DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0);\n            return;\n        }\n    }*/\n}\n\nstatic void HabitatNameTagNumPrinter(u8 windowId, u8 fontId, u16 species, u8 x, u8 y)\n{\n    bool8 numToPrint = 0;\n\n    if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n        numToPrint = 1;\n\n    if(!numToPrint)\n    {   // use national numbering\n        u16 dexNum = SpeciesToNationalPokedexNum(species);\n        DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0);\n        DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0);\n        return;\n    }\n    else\n    {   // use extended numbering\n        u16 dexNum = SpeciesToExtendedPokedexNum(species);\n        DexScreen_AddTextPrinterParameterized(windowId, fontId, gText_PokedexNo, x, y, 0);\n        DexScreen_PrintNum3LeadingZeroes(windowId, fontId, dexNum, x + 9, y, 0);\n        return;\n    }\n}\n\ns8 DexScreen_GetSetPokedexFlag(u16 nationalDexNo, u8 caseId, bool8 indexIsSpecies)\n{\n    u8 index;\n    u8 bit;\n    u8 mask;\n    s8 retVal;\n\n    if (indexIsSpecies)\n        nationalDexNo = SpeciesToNationalPokedexNum(nationalDexNo);\n\n    nationalDexNo--;\n    index = nationalDexNo / 8;\n    bit = nationalDexNo % 8;\n    mask = 1 << bit;\n    retVal = 0;\n    switch (caseId)\n    {\n    case FLAG_GET_SEEN:\n        if (gSaveBlock2Ptr->pokedex.seen[index] & mask)\n        {\n            retVal = 1;\n        }\n        break;\n    case FLAG_GET_CAUGHT:\n        if (gSaveBlock2Ptr->pokedex.owned[index] & mask)\n        {\n            if ((gSaveBlock2Ptr->pokedex.owned[index] & mask) == (gSaveBlock2Ptr->pokedex.seen[index] & mask))\n                retVal = 1;\n        }\n        break;\n    case FLAG_SET_SEEN:\n        gSaveBlock2Ptr->pokedex.seen[index] |= mask;\n        break;\n    case FLAG_SET_CAUGHT:\n        gSaveBlock2Ptr->pokedex.owned[index] |= mask;\n        break;\n    }\n    return retVal;\n}\n\nstatic u16 DexScreen_GetDexCount(u8 caseId, u8 whichDex)\n{\n    u16 count = 0;\n    u32 i;\n\n    switch (whichDex)\n    {\n    case 0: // Kanto\n        for (i = 0; i < KANTO_DEX_COUNT; i++)\n        {\n            if (DexScreen_GetSetPokedexFlag(i + 1, caseId, FALSE))\n                count++;\n        }\n        break;\n    case 1: // National\n        for (i = 0; i < NATIONAL_DEX_COUNT; i++)\n        {\n            if (DexScreen_GetSetPokedexFlag(i + 1, caseId, FALSE))\n                count++;\n\n        }\n        break;\n    case 2: // Extended\n        for (i = 0; i < EXTENDED_DEX_COUNT; i++)\n        {\n            if (DexScreen_GetSetPokedexFlag(ExtendedToNationalOrder(i + 1), caseId, FALSE))\n                count++;\n\n        }\n        break;\n    }\n    return count;\n}\n\nstatic void DexScreen_PrintControlInfo(const u8 *src)\n{\n    DexScreen_AddTextPrinterParameterized(1, FONT_SMALL, src, 236 - GetStringWidth(FONT_SMALL, src, 0), 2, 4);\n}\n\nbool8 DexScreen_DrawMonPicInCategoryPage(u16 species, u8 slot, u8 numSlots)\n{\n    struct WindowTemplate template;\n    numSlots--;\n    CopyToBgTilemapBufferRect_ChangePalette(3, sCategoryPageIconWindowBg, sCategoryPageIconCoords[numSlots][slot][0], sCategoryPageIconCoords[numSlots][slot][1], 8, 8, slot + 5);\n    if (sPokedexScreenData->categoryMonWindowIds[slot] == 0xFF)\n    {\n        template = sWindowTemplate_CategoryMonIcon;\n        template.tilemapLeft = sCategoryPageIconCoords[numSlots][slot][0];\n        template.tilemapTop = sCategoryPageIconCoords[numSlots][slot][1];\n        template.paletteNum = slot + 1;\n        template.baseBlock = slot * 64 + 8;\n        sPokedexScreenData->categoryMonWindowIds[slot] = AddWindow(&template);\n        FillWindowPixelBuffer(sPokedexScreenData->categoryMonWindowIds[slot], PIXEL_FILL(0));\n        DexScreen_LoadMonPicInWindow(sPokedexScreenData->categoryMonWindowIds[slot], species, slot * 16 + 16);\n        PutWindowTilemap(sPokedexScreenData->categoryMonWindowIds[slot]);\n        CopyWindowToVram(sPokedexScreenData->categoryMonWindowIds[slot], COPYWIN_GFX);\n    }\n    else\n        PutWindowTilemap(sPokedexScreenData->categoryMonWindowIds[slot]);\n\n    if (sPokedexScreenData->categoryMonInfoWindowIds[slot] == 0xFF)\n    {\n        if (species != SPECIES_NONE)\n        {\n            template = sWindowTemplate_CategoryMonInfo;\n            template.tilemapLeft = sCategoryPageIconCoords[numSlots][slot][2];\n            template.tilemapTop = sCategoryPageIconCoords[numSlots][slot][3];\n            template.baseBlock = slot * 40 + 0x108;\n            sPokedexScreenData->categoryMonInfoWindowIds[slot] = AddWindow(&template);\n            CopyToWindowPixelBuffer(sPokedexScreenData->categoryMonInfoWindowIds[slot], sCategoryMonInfoBgTiles, 0, 0);\n            DexScreen_PrintMonDexNo(sPokedexScreenData->categoryMonInfoWindowIds[slot], FONT_SMALL, species, 12, 0);\n            DexScreen_AddTextPrinterParameterized(sPokedexScreenData->categoryMonInfoWindowIds[slot], FONT_NORMAL, gSpeciesNames[species], 2, 13, 0);\n            if (DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, TRUE))\n                BlitBitmapRectToWindow(sPokedexScreenData->categoryMonInfoWindowIds[slot], sDexScreen_CaughtIcon, 0, 0, 8, 8, 2, 3, 8, 8);\n            PutWindowTilemap(sPokedexScreenData->categoryMonInfoWindowIds[slot]);\n            CopyWindowToVram(sPokedexScreenData->categoryMonInfoWindowIds[slot], COPYWIN_GFX);\n        }\n    }\n    else\n        PutWindowTilemap(sPokedexScreenData->categoryMonInfoWindowIds[slot]);\n\n    return TRUE;\n}\n\nstatic void DexScreen_DestroyCategoryPageMonIconAndInfoWindows(void)\n{\n    int i;\n    for (i = 0; i < 4; i++)\n    {\n        DexScreen_RemoveWindow(&sPokedexScreenData->categoryMonWindowIds[i]);\n        DexScreen_RemoveWindow(&sPokedexScreenData->categoryMonInfoWindowIds[i]);\n    }\n}\n\nstatic void DexScreen_PrintCategoryPageNumbers(u8 windowId, u16 currentPage, u16 totalPages, u16 x, u16 y)\n{\n    u8 buffer[30];\n    u8 *ptr = StringCopy(buffer, gText_Page);\n    ptr = ConvertIntToDecimalStringN(ptr, currentPage, STR_CONV_MODE_RIGHT_ALIGN, 2);\n    *ptr++ = CHAR_SLASH;\n    ptr = ConvertIntToDecimalStringN(ptr, totalPages, STR_CONV_MODE_RIGHT_ALIGN, 2);\n    DexScreen_PrintStringWithAlignment(buffer, TEXT_RIGHT);\n}\n\nstatic bool8 DexScreen_CreateCategoryListGfx(bool8 justRegistered)\n{\n    FillBgTilemapBufferRect_Palette0(3, 2, 0, 0, 30, 20);\n    FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 20);\n    FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20);\n    DexScreen_CreateCategoryPageSpeciesList(sPokedexScreenData->category, sPokedexScreenData->pageNum);\n    FillWindowPixelBuffer(0, PIXEL_FILL(15));\n    if (justRegistered)\n    {\n        DexScreen_PrintStringWithAlignment(sDexCategoryNamePtrs[sPokedexScreenData->category], TEXT_CENTER);\n    }\n    else\n    {\n        DexScreen_PrintStringWithAlignment(sDexCategoryNamePtrs[sPokedexScreenData->category], TEXT_LEFT);\n        DexScreen_PrintCategoryPageNumbers(0, DexScreen_PageNumberToRenderablePages(sPokedexScreenData->pageNum), DexScreen_PageNumberToRenderablePages(sPokedexScreenData->lastPageInCategory - 1), 160, 2);\n    }\n    CopyWindowToVram(0, COPYWIN_GFX);\n    FillWindowPixelBuffer(1, PIXEL_FILL(15));\n    if (!justRegistered)\n        DexScreen_PrintControlInfo(gText_PickFlipPageCheckCancel);\n    CopyWindowToVram(1, COPYWIN_GFX);\n    if (sPokedexScreenData->pageSpecies[0] != 0xFFFF)\n        DexScreen_DrawMonPicInCategoryPage(sPokedexScreenData->pageSpecies[0], 0, sPokedexScreenData->numMonsOnPage);\n    if (sPokedexScreenData->pageSpecies[1] != 0xFFFF)\n        DexScreen_DrawMonPicInCategoryPage(sPokedexScreenData->pageSpecies[1], 1, sPokedexScreenData->numMonsOnPage);\n    if (sPokedexScreenData->pageSpecies[2] != 0xFFFF)\n        DexScreen_DrawMonPicInCategoryPage(sPokedexScreenData->pageSpecies[2], 2, sPokedexScreenData->numMonsOnPage);\n    if (sPokedexScreenData->pageSpecies[3] != 0xFFFF)\n        DexScreen_DrawMonPicInCategoryPage(sPokedexScreenData->pageSpecies[3], 3, sPokedexScreenData->numMonsOnPage);\n    return FALSE;\n}\n\nstatic void DexScreen_CreateCategoryPageSelectionCursor(u8 cursorPos)\n{\n    int i;\n    u32 palIdx;\n\n    if (cursorPos == 0xFF)\n    {\n        for (i = 0; i < 4; i++)\n        {\n            LoadPalette(&sDexScreen_CategoryCursorPals[0], PLTT_ID(i) + PLTT_ID(5) + 2 + BG_PLTT_OFFSET, PLTT_SIZEOF(1));\n            LoadPalette(&sDexScreen_CategoryCursorPals[1], PLTT_ID(i) + PLTT_ID(5) + 8 + BG_PLTT_OFFSET, PLTT_SIZEOF(1));\n        }\n        LoadPalette(&sDexScreen_CategoryCursorPals[0], 0x141, PLTT_SIZEOF(1));\n        sPokedexScreenData->categoryPageSelectionCursorTimer = 0;\n    }\n    else\n    {\n        sPokedexScreenData->categoryPageSelectionCursorTimer++;\n        if (sPokedexScreenData->categoryPageSelectionCursorTimer == 16)\n            sPokedexScreenData->categoryPageSelectionCursorTimer = 0;\n        palIdx = sPokedexScreenData->categoryPageSelectionCursorTimer >> 2;\n        for (i = 0; i < 4; i++)\n        {\n            if (i == cursorPos)\n            {\n                LoadPalette(&sDexScreen_CategoryCursorPals[2 * palIdx + 2], PLTT_ID(i) + PLTT_ID(5) + 2 + BG_PLTT_OFFSET, PLTT_SIZEOF(1));\n                LoadPalette(&sDexScreen_CategoryCursorPals[2 * palIdx + 3], PLTT_ID(i) + PLTT_ID(5) + 8 + BG_PLTT_OFFSET, PLTT_SIZEOF(1));\n            }\n            else\n            {\n                LoadPalette(&sDexScreen_CategoryCursorPals[0], PLTT_ID(i) + PLTT_ID(5) + 2 + BG_PLTT_OFFSET, PLTT_SIZEOF(1));\n                LoadPalette(&sDexScreen_CategoryCursorPals[1], PLTT_ID(i) + PLTT_ID(5) + 8 + BG_PLTT_OFFSET, PLTT_SIZEOF(1));\n            }\n        }\n        LoadPalette(&sDexScreen_CategoryCursorPals[2 * palIdx + 2], OBJ_PLTT_ID(4) + 1, PLTT_SIZEOF(1));\n    }\n}\n\nstatic void DexScreen_UpdateCategoryPageCursorObject(u8 taskId, u8 cursorPos, u8 numMonsInPage)\n{\n    numMonsInPage--;\n    ListMenuUpdateCursorObject(taskId, sCategoryPageIconCoords[numMonsInPage][cursorPos][2] * 8, sCategoryPageIconCoords[numMonsInPage][cursorPos][3] * 8, 0);\n}\n\nbool8 DexPage_TileBuffer_CopyCol(const u16 *srcBuf, u8 srcCol, u16 *dstBuf, u8 dstCol)\n{\n    int i;\n    const u16 *src = &srcBuf[srcCol];\n    u16 *dst = &dstBuf[dstCol];\n    for (i = 0; i < 20; i++)\n    {\n        *dst = *src;\n        dst += 32;\n        src += 32;\n    }\n    return FALSE;\n}\n\nbool8 DexPage_TileBuffer_FillCol(u16 tileNo, u16 *tileBuf, u8 x)\n{\n    int i;\n    u16 *dst = &tileBuf[x];\n    for (i = 0; i < 20; i++)\n    {\n        *dst = tileNo;\n        dst += 32;\n    }\n    return FALSE;\n}\n\nbool8 DexScreen_TurnCategoryPage_BgEffect(u8 page)\n{\n    int dstCol;\n    int srcCol;\n    u16 *bg1buff = GetBgTilemapBuffer(1);\n    u16 *bg2buff = GetBgTilemapBuffer(2);\n    u16 *bg3buff = GetBgTilemapBuffer(3);\n    u16 *bg1mem = sPokedexScreenData->bgBufsMem + 0x800;\n    u16 *bg2mem = sPokedexScreenData->bgBufsMem + 0x400;\n    u16 *bg3mem = sPokedexScreenData->bgBufsMem + 0x000;\n    for (dstCol = 0; dstCol < 30; dstCol++)\n    {\n        srcCol = sDexScreenPageTurnColumns[page][dstCol];\n        if (srcCol == 30)\n        {\n            DexPage_TileBuffer_FillCol(0x000, bg1buff, dstCol);\n            DexPage_TileBuffer_FillCol(0x000, bg2buff, dstCol);\n            DexPage_TileBuffer_FillCol(0x00C, bg3buff, dstCol);\n        }\n        else\n        {\n            DexPage_TileBuffer_CopyCol(bg1mem, srcCol, bg1buff, dstCol);\n            DexPage_TileBuffer_CopyCol(bg2mem, srcCol, bg2buff, dstCol);\n            DexPage_TileBuffer_CopyCol(bg3mem, srcCol, bg3buff, dstCol);\n        }\n    }\n    CopyBgTilemapBufferToVram(1);\n    CopyBgTilemapBufferToVram(2);\n    CopyBgTilemapBufferToVram(3);\n    return FALSE;\n}\n\n/*\n * Direction = 0: Left; 1: Right\n */\nstatic bool8 DexScreen_FlipCategoryPageInDirection(u8 direction)\n{\n    u16 color;\n    if (IsNationalPokedexEnabled())\n        color = sNationalDexPalette[7];\n    else\n        color = sKantoDexPalette[7];\n    switch (sPokedexScreenData->data[0])\n    {\n    case 0:\n        sPokedexScreenData->bgBufsMem = Alloc(3 * BG_SCREEN_SIZE);\n        if (direction)\n            sPokedexScreenData->data[0] = 6;\n        else\n            sPokedexScreenData->data[0] = 2;\n        break;\n    case 1:\n        Free(sPokedexScreenData->bgBufsMem);\n        return TRUE;\n        // Go left\n    case 2:\n        BeginNormalPaletteFade(0x00007FFF, 0, 0, 16, color);\n        sPokedexScreenData->data[0]++;\n        break;\n    case 3:\n        FillBgTilemapBufferRect_Palette0(3, 0x00C, 0, 0, 30, 20);\n        FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 32, 20);\n        FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 32, 20);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(3);\n        sPokedexScreenData->data[0]++;\n        break;\n    case 4:\n        BeginNormalPaletteFade(0x00007FFF, 0, 0, 0, color);\n        DexScreen_CreateCategoryListGfx(FALSE);\n        CpuFastCopy(GetBgTilemapBuffer(3), &sPokedexScreenData->bgBufsMem[0 * BG_SCREEN_SIZE / 2], BG_SCREEN_SIZE);\n        CpuFastCopy(GetBgTilemapBuffer(2), &sPokedexScreenData->bgBufsMem[1 * BG_SCREEN_SIZE / 2], BG_SCREEN_SIZE);\n        CpuFastCopy(GetBgTilemapBuffer(1), &sPokedexScreenData->bgBufsMem[2 * BG_SCREEN_SIZE / 2], BG_SCREEN_SIZE);\n        FillBgTilemapBufferRect_Palette0(3, 0x00C, 0, 0, 30, 20);\n        FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 32, 20);\n        FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 32, 20);\n\n        sPokedexScreenData->data[1] = 0;\n        sPokedexScreenData->data[0]++;\n        PlaySE(SE_BALL_TRAY_ENTER);\n        break;\n    case 5:\n        if (sPokedexScreenData->data[1] < 10)\n        {\n            DexScreen_TurnCategoryPage_BgEffect(sPokedexScreenData->data[1]);\n            sPokedexScreenData->data[1]++;\n        }\n        else\n        {\n            sPokedexScreenData->data[0] = 1;\n        }\n        break;\n        // Go right\n    case 6:\n        CpuFastCopy(GetBgTilemapBuffer(3), &sPokedexScreenData->bgBufsMem[0 * BG_SCREEN_SIZE / 2], BG_SCREEN_SIZE);\n        CpuFastCopy(GetBgTilemapBuffer(2), &sPokedexScreenData->bgBufsMem[1 * BG_SCREEN_SIZE / 2], BG_SCREEN_SIZE);\n        CpuFastCopy(GetBgTilemapBuffer(1), &sPokedexScreenData->bgBufsMem[2 * BG_SCREEN_SIZE / 2], BG_SCREEN_SIZE);\n\n        sPokedexScreenData->data[1] = 9;\n        sPokedexScreenData->data[0]++;\n        PlaySE(SE_BALL_TRAY_ENTER);\n        break;\n    case 7:\n        if (sPokedexScreenData->data[1] != 0)\n        {\n            DexScreen_TurnCategoryPage_BgEffect(sPokedexScreenData->data[1]);\n            sPokedexScreenData->data[1]--;\n        }\n        else\n        {\n#ifdef BUGFIX\n            DexScreen_TurnCategoryPage_BgEffect(0);\n#else\n            DexScreen_TurnCategoryPage_BgEffect(sPokedexScreenData->data[0]);\n#endif\n            BeginNormalPaletteFade(0x00007FFF, 0, 16, 16, color);\n            sPokedexScreenData->data[0]++;\n        }\n        break;\n    case 8:\n        gPaletteFade.bufferTransferDisabled = TRUE;\n        DexScreen_CreateCategoryListGfx(FALSE);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(3);\n        sPokedexScreenData->data[0]++;\n        break;\n    case 9:\n        gPaletteFade.bufferTransferDisabled = FALSE;\n        BeginNormalPaletteFade(0x00007FFF, 0, 16, 0, color);\n        sPokedexScreenData->data[0] = 1;\n        break;\n    }\n    return FALSE;\n}\n\n// Scale from 0 to 6\nvoid DexScreen_DexPageZoomEffectFrame(u8 bg, u8 scale)\n{\n    u8 tileLeft, tileTop, width, height;\n    s16 left, top, divY;\n\n    if (!sPokedexScreenData->numMonsOnPage)\n    {\n        tileLeft = sCategoryPageIconCoords[0][0][2];\n        tileTop = sCategoryPageIconCoords[0][0][3];\n    }\n    else\n    {\n        tileLeft = sCategoryPageIconCoords[sPokedexScreenData->numMonsOnPage - 1][sPokedexScreenData->categoryCursorPosInPage][2];\n        tileTop = sCategoryPageIconCoords[sPokedexScreenData->numMonsOnPage - 1][sPokedexScreenData->categoryCursorPosInPage][3];\n    }\n\n    width = 6 + (scale * 4);\n    height = 3 + (scale * 2);\n    if (width >= 28) // Make sure it's not wider than the screen\n        width = 28;\n    if (height >= 14) // Make sure it's not taller than the screen\n        height = 14;\n\n    left = tileLeft - ((scale * 4) / 2);\n    top = tileTop - ((scale * 2) / 2);\n    if ((left + width + 2) >= 30) // Don't wrap right...\n        left -= ((left + width + 2) - 30);\n    else if (left < 0) // ... left ...\n        left = 0;\n    if ((top + height + 2) >= 18) // ... down ...\n        top -= ((top + height + 2) - 18);\n    else if (top < 2) // or up.\n        top = 2;\n\n    divY = (top + 1) + ((height / 2) + 1); // The horizontal divider\n\n    // Top edge\n    FillBgTilemapBufferRect_Palette0(bg, 4, left, top, 1, 1);\n    FillBgTilemapBufferRect_Palette0(bg, 5, left + 1, top, width, 1);\n    FillBgTilemapBufferRect_Palette0(bg, BG_TILE_H_FLIP(4), left + 1 + width, top, 1, 1);\n\n    // Bottom edge\n    FillBgTilemapBufferRect_Palette0(bg, 10, left, top + 1 + height, 1, 1);\n    FillBgTilemapBufferRect_Palette0(bg, 11, left + 1, top + 1 + height, width, 1);\n    FillBgTilemapBufferRect_Palette0(bg, BG_TILE_H_FLIP(10), left + 1 + width, top + 1 + height, 1, 1);\n\n    // Left edge\n    FillBgTilemapBufferRect_Palette0(bg, 6, left, top + 1, 1, divY - top - 1);\n    FillBgTilemapBufferRect_Palette0(bg, 7, left, divY, 1, 1);\n    FillBgTilemapBufferRect_Palette0(bg, 9, left, divY + 1, 1, top + height - divY);\n\n    // Right edge\n    FillBgTilemapBufferRect_Palette0(bg, BG_TILE_H_FLIP(6), left + 1 + width, top + 1, 1, divY - top - 1);\n    FillBgTilemapBufferRect_Palette0(bg, BG_TILE_H_FLIP(7), left + 1 + width, divY, 1, 1);\n    FillBgTilemapBufferRect_Palette0(bg, BG_TILE_H_FLIP(9), left + 1 + width, divY + 1, 1, top + height - divY);\n\n    // Interior\n    FillBgTilemapBufferRect_Palette0(bg, 1, left + 1, top + 1, width, divY - top - 1);\n    FillBgTilemapBufferRect_Palette0(bg, 8, left + 1, divY, width, 1);\n    FillBgTilemapBufferRect_Palette0(bg, 2, left + 1, divY + 1, width, top + height - divY);\n}\n\nvoid DexScreen_PrintMonCategory(u8 windowId, u16 species, u8 x, u8 y)\n{\n    u8 * categoryName;\n    u8 index, categoryStr[12];\n\n    species = SpeciesToNationalPokedexNum(species);\n\n    categoryName = (u8 *)gPokedexEntries[species].categoryName;\n    index = 0;\n    if (DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, FALSE))\n    {\n        while ((categoryName[index] != EOS) && (index < 11))\n        {\n            categoryStr[index] = categoryName[index];\n            index++;\n        }\n    }\n    else\n    {\n        while (index < 11)\n        {\n            categoryStr[index] = CHAR_QUESTION_MARK;\n            index++;\n        }\n    }\n\n    categoryStr[index] = EOS;\n\n    DexScreen_AddTextPrinterParameterized(windowId, FONT_SMALL, categoryStr, x, y, 0);\n    x += GetStringWidth(FONT_SMALL, categoryStr, 0);\n    DexScreen_AddTextPrinterParameterized(windowId, FONT_SMALL, gText_PokedexPokemon, x, y, 0);\n}\n\nvoid DexScreen_PrintMonHeight(u8 windowId, u16 species, u8 x, u8 y)\n{\n    u16 height;\n    u32 inches, feet;\n    const u8 *labelText;\n    u8 buffer[32];\n    u8 i;\n\n    species = SpeciesToNationalPokedexNum(species);\n    height = gPokedexEntries[species].height;\n    labelText = gText_HT;\n\n    i = 0;\n    buffer[i++] = EXT_CTRL_CODE_BEGIN;\n    buffer[i++] = EXT_CTRL_CODE_MIN_LETTER_SPACING;\n    buffer[i++] = 5;\n    buffer[i++] = CHAR_SPACE;\n\n    if (DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, FALSE))\n    {\n        inches = 10000 * height / 254; // actually tenths of inches here\n        if (inches % 10 >= 5)\n            inches += 10;\n        feet = inches / 120;\n        inches = (inches - (feet * 120)) / 10;\n        if (feet / 10 == 0)\n        {\n            buffer[i++] = 0;\n            buffer[i++] = feet + CHAR_0;\n        }\n        else\n        {\n            buffer[i++] = feet / 10 + CHAR_0;\n            buffer[i++] = feet % 10 + CHAR_0;\n        }\n        buffer[i++] = CHAR_SGL_QUOTE_RIGHT;\n        buffer[i++] = inches / 10 + CHAR_0;\n        buffer[i++] = inches % 10 + CHAR_0;\n        buffer[i++] = CHAR_DBL_QUOTE_RIGHT;\n        buffer[i++] = EOS;\n    }\n    else\n    {\n        buffer[i++] = CHAR_QUESTION_MARK;\n        buffer[i++] = CHAR_QUESTION_MARK;\n        buffer[i++] = CHAR_SGL_QUOTE_RIGHT;\n        buffer[i++] = CHAR_QUESTION_MARK;\n        buffer[i++] = CHAR_QUESTION_MARK;\n        buffer[i++] = CHAR_DBL_QUOTE_RIGHT;\n    }\n\n    buffer[i++] = EOS;\n    DexScreen_AddTextPrinterParameterized(windowId, FONT_SMALL, labelText, x, y, 0);\n    x += 30;\n    DexScreen_AddTextPrinterParameterized(windowId, FONT_SMALL, buffer, x, y, 0);\n}\n\nvoid DexScreen_PrintMonWeight(u8 windowId, u16 species, u8 x, u8 y)\n{\n    u16 weight;\n    u32 lbs;\n    bool8 output;\n    const u8 * labelText;\n    const u8 * lbsText;\n    u8 buffer[32];\n    u8 i;\n    u32 j;\n\n    species = SpeciesToNationalPokedexNum(species);\n    weight = gPokedexEntries[species].weight;\n    labelText = gText_WT;\n    lbsText = gText_Lbs;\n\n    i = 0;\n    buffer[i++] = EXT_CTRL_CODE_BEGIN;\n    buffer[i++] = EXT_CTRL_CODE_MIN_LETTER_SPACING;\n    buffer[i++] = 5;\n\n    if (DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, FALSE))\n    {\n        lbs = (weight * 100000) / 4536; // Convert to hundredths of lb\n\n        // Round up to the nearest 0.1 lb\n        if (lbs % 10 >= 5)\n            lbs += 10;\n\n        output = FALSE;\n\n        if ((buffer[i] = (lbs / 100000) + CHAR_0) == CHAR_0 && !output)\n        {\n            buffer[i++] = CHAR_SPACE;\n        }\n        else\n        {\n            output = TRUE;\n            i++;\n        }\n\n        lbs %= 100000;\n        if ((buffer[i] = (lbs / 10000) + CHAR_0) == CHAR_0 && !output)\n        {\n            buffer[i++] = CHAR_SPACE;\n        }\n        else\n        {\n            output = TRUE;\n            i++;\n        }\n\n        lbs %= 10000;\n        if ((buffer[i] = (lbs / 1000) + CHAR_0) == CHAR_0 && !output)\n        {\n            buffer[i++] = CHAR_SPACE;\n        }\n        else\n        {\n            output = TRUE;\n            i++;\n        }\n\n        lbs %= 1000;\n        buffer[i++] = (lbs / 100) + CHAR_0;\n        lbs %= 100;\n        buffer[i++] = CHAR_PERIOD;\n        buffer[i++] = (lbs / 10) + CHAR_0;\n    }\n    else\n    {\n        buffer[i++] = CHAR_QUESTION_MARK;\n        buffer[i++] = CHAR_QUESTION_MARK;\n        buffer[i++] = CHAR_QUESTION_MARK;\n        buffer[i++] = CHAR_QUESTION_MARK;\n        buffer[i++] = CHAR_PERIOD;\n        buffer[i++] = CHAR_QUESTION_MARK;\n    }\n    buffer[i++] = CHAR_SPACE;\n    buffer[i++] = EXT_CTRL_CODE_BEGIN;\n    buffer[i++] = EXT_CTRL_CODE_MIN_LETTER_SPACING;\n    buffer[i++] = 0;\n\n    for (j = 0; j < 33 - i && lbsText[j] != EOS; j++)\n        buffer[i + j] = lbsText[j];\n\n    buffer[i + j] = EOS;\n    DexScreen_AddTextPrinterParameterized(windowId, FONT_SMALL, labelText, x, y, 0);\n    x += 30;\n    DexScreen_AddTextPrinterParameterized(windowId, FONT_SMALL, buffer, x, y, 0);\n}\n\nvoid DexScreen_PrintMonFlavorText(u8 windowId, u16 species, u8 x, u8 y)\n{\n    struct TextPrinterTemplate printerTemplate;\n    u16 length;\n    s32 xCenter;\n\n    species = SpeciesToNationalPokedexNum(species);\n\n    if (DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, FALSE))\n    {\n        if(gSaveBlock1Ptr->keyFlags.version == 0) //FR\n            printerTemplate.currentChar = gPokedexEntries[species].description_FR;\n        else\n            printerTemplate.currentChar = gPokedexEntries[species].description_LG;\n        printerTemplate.windowId = windowId;\n        printerTemplate.fontId = FONT_NORMAL;\n        printerTemplate.letterSpacing = 1;\n        printerTemplate.lineSpacing = 0;\n        printerTemplate.unk = 0;\n        printerTemplate.fgColor = 1;\n        printerTemplate.bgColor = 0;\n        printerTemplate.shadowColor = 2;\n\n        if(gSaveBlock1Ptr->keyFlags.version == 0) //FR\n            length = GetStringWidth(FONT_NORMAL, gPokedexEntries[species].description_FR, 0);\n        else\n            length = GetStringWidth(FONT_NORMAL, gPokedexEntries[species].description_LG, 0);\n        xCenter = x + (240 - length) / 2;\n\n        if (xCenter > 0)\n            x = xCenter;\n        else\n            x = 0;\n\n        printerTemplate.x = x;\n        printerTemplate.y = y;\n        printerTemplate.currentX = x;\n        printerTemplate.currentY = y;\n\n        AddTextPrinter(&printerTemplate, TEXT_SKIP_DRAW, NULL);\n    }\n}\n\nvoid DexScreen_DrawMonFootprint(u8 windowId, u16 species, u8 x, u8 y)\n{\n    u16 i, j, unused, tileIdx;\n    u8 footprintPixel, footprintTile;\n    u8 * buffer;\n    u8 * footprint;\n\n    if (!(DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, TRUE)))\n        return;\n    footprint = (u8 *)(gMonFootprintTable[species]);\n    buffer = gDecompressionBuffer;\n    unused = 0;\n    tileIdx = 0;\n\n    // Expand 1bpp to 4bpp\n    for (i = 0; i < 32; i++)\n    {\n        footprintPixel = footprint[i];\n        for (j = 0; j < 8 / 2; j++)\n        {\n            footprintTile = 0;\n            if (footprintPixel & (1 << (j * 2)))\n                footprintTile |= 0x01;\n            if (footprintPixel & (2 << (j * 2)))\n                footprintTile |= 0x10;\n            buffer[tileIdx] = footprintTile;\n            tileIdx++;\n        }\n    }\n    BlitBitmapRectToWindow(windowId, buffer, 0, 0, 16, 16, x, y, 16, 16);\n}\n\nstatic u8 DexScreen_DrawMonDexPage(bool8 justRegistered)\n{\n    DexScreen_DexPageZoomEffectFrame(3, 6);\n    FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 20);\n    FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20);\n    FillBgTilemapBufferRect_Palette0(0, 0, 0, 2, 30, 16);\n\n    sPokedexScreenData->windowIds[0] = AddWindow(&sWindowTemplate_DexEntry_MonPic);\n    sPokedexScreenData->windowIds[1] = AddWindow(&sWindowTemplate_DexEntry_SpeciesStats);\n    sPokedexScreenData->windowIds[2] = AddWindow(&sWindowTemplate_DexEntry_FlavorText);\n\n    // Mon pic\n    FillWindowPixelBuffer(sPokedexScreenData->windowIds[0], PIXEL_FILL(0));\n    DexScreen_LoadMonPicInWindow(sPokedexScreenData->windowIds[0], sPokedexScreenData->dexSpecies, 144);\n    PutWindowTilemap(sPokedexScreenData->windowIds[0]);\n    CopyWindowToVram(sPokedexScreenData->windowIds[0], COPYWIN_GFX);\n\n    // Species stats\n    FillWindowPixelBuffer(sPokedexScreenData->windowIds[1], PIXEL_FILL(0));\n    DexScreen_PrintMonDexNo(sPokedexScreenData->windowIds[1], FONT_SMALL, sPokedexScreenData->dexSpecies, 0, 8);\n    DexScreen_AddTextPrinterParameterized(sPokedexScreenData->windowIds[1], FONT_NORMAL, gSpeciesNames[sPokedexScreenData->dexSpecies], 28, 8, 0);\n    DexScreen_PrintMonCategory(sPokedexScreenData->windowIds[1], sPokedexScreenData->dexSpecies, 0, 24);\n    DexScreen_PrintMonHeight(sPokedexScreenData->windowIds[1], sPokedexScreenData->dexSpecies, 0, 36);\n    DexScreen_PrintMonWeight(sPokedexScreenData->windowIds[1], sPokedexScreenData->dexSpecies, 0, 48);\n    DexScreen_DrawMonFootprint(sPokedexScreenData->windowIds[1], sPokedexScreenData->dexSpecies, 88, 40);\n    PutWindowTilemap(sPokedexScreenData->windowIds[1]);\n    CopyWindowToVram(sPokedexScreenData->windowIds[1], COPYWIN_GFX);\n\n    // Dex entry\n    FillWindowPixelBuffer(sPokedexScreenData->windowIds[2], PIXEL_FILL(0));\n    DexScreen_PrintMonFlavorText(sPokedexScreenData->windowIds[2], sPokedexScreenData->dexSpecies, 0, 8);\n    PutWindowTilemap(sPokedexScreenData->windowIds[2]);\n    CopyWindowToVram(sPokedexScreenData->windowIds[2], COPYWIN_GFX);\n\n    // Control info\n    FillWindowPixelBuffer(1, PIXEL_FILL(15));\n    if (justRegistered == FALSE)\n    {\n        DexScreen_AddTextPrinterParameterized(1, FONT_SMALL, gText_Cry, 8, 2, 4);\n        DexScreen_PrintControlInfo(gText_NextDataCancel);\n    }\n    else\n        // Just registered\n        DexScreen_PrintControlInfo(gText_Next);\n    PutWindowTilemap(1);\n    CopyWindowToVram(1, COPYWIN_GFX);\n\n    return 1;\n}\n\nu8 RemoveDexPageWindows(void)\n{\n    DexScreen_RemoveWindow(&sPokedexScreenData->windowIds[0]);\n    DexScreen_RemoveWindow(&sPokedexScreenData->windowIds[1]);\n    DexScreen_RemoveWindow(&sPokedexScreenData->windowIds[2]);\n\n    return 0;\n}\n\nu8 DexScreen_DrawMonAreaPage(void)\n{\n    int i;\n    u8 width, height;\n    bool8 monIsCaught;\n    s16 left, top;\n    u16 speciesId, species;\n    u16 kantoMapVoff;\n\n    species = sPokedexScreenData->dexSpecies;\n    speciesId = SpeciesToNationalPokedexNum(species);\n    monIsCaught = DexScreen_GetSetPokedexFlag(species, FLAG_GET_CAUGHT, TRUE);\n    width = 28;\n    height = 14;\n    left = 0;\n    top = 2;\n\n    FillBgTilemapBufferRect_Palette0(3, 4, left, top, 1, 1);\n    FillBgTilemapBufferRect_Palette0(3, BG_TILE_H_FLIP(4), left + 1 + width, top, 1, 1);\n    FillBgTilemapBufferRect_Palette0(3, BG_TILE_V_FLIP(4), left, top + 1 + height, 1, 1);\n    FillBgTilemapBufferRect_Palette0(3, BG_TILE_H_V_FLIP(4), left + 1 + width, top + 1 + height, 1, 1);\n    FillBgTilemapBufferRect_Palette0(3, 5, left + 1, top, width, 1);\n    FillBgTilemapBufferRect_Palette0(3, BG_TILE_V_FLIP(5), left + 1, top + 1 + height, width, 1);\n    FillBgTilemapBufferRect_Palette0(3, 6, left, top + 1, 1, height);\n    FillBgTilemapBufferRect_Palette0(3, BG_TILE_H_FLIP(6), left + 1 + width, top + 1, 1, height);\n    FillBgTilemapBufferRect_Palette0(3, 1, left + 1, top + 1, width, height);\n    FillBgTilemapBufferRect_Palette0(0, 0, 0, 2, 30, 16);\n\n    width = 10;\n    height = 6;\n    left = 1;\n    top = 9;\n\n    FillBgTilemapBufferRect_Palette0(0, 29, left, top, 1, 1);\n    FillBgTilemapBufferRect_Palette0(0, BG_TILE_H_FLIP(29), left + 1 + width, top, 1, 1);\n    FillBgTilemapBufferRect_Palette0(0, BG_TILE_V_FLIP(29), left, top + 1 + height, 1, 1);\n    FillBgTilemapBufferRect_Palette0(0, BG_TILE_H_V_FLIP(29), left + 1 + width, top + 1 + height, 1, 1);\n    FillBgTilemapBufferRect_Palette0(0, 30, left + 1, top, width, 1);\n    FillBgTilemapBufferRect_Palette0(0, BG_TILE_V_FLIP(30), left + 1, top + 1 + height, width, 1);\n    FillBgTilemapBufferRect_Palette0(0, 31, left, top + 1, 1, height);\n    FillBgTilemapBufferRect_Palette0(0, BG_TILE_H_FLIP(31), left + 1 + width, top + 1, 1, height);\n    FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 20);\n    FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20);\n\n    sPokedexScreenData->unlockedSeviiAreas = GetUnlockedSeviiAreas();\n    kantoMapVoff = 4;\n    // If any of the postgame islands are unlocked, Kanto map needs to be flush with the\n    // top of the screen.\n    for (i = 3; i < 7; i++)\n        if ((sPokedexScreenData->unlockedSeviiAreas >> i) & 1)\n            kantoMapVoff = 0;\n\n    sPokedexScreenData->windowIds[0] = AddWindow(&sWindowTemplate_AreaMap_Kanto);\n    CopyToWindowPixelBuffer(sPokedexScreenData->windowIds[0], (void *)sTilemap_AreaMap_Kanto, 0, 0);\n    SetWindowAttribute(sPokedexScreenData->windowIds[0], WINDOW_TILEMAP_TOP,\n                       GetWindowAttribute(sPokedexScreenData->windowIds[0], WINDOW_TILEMAP_TOP) + kantoMapVoff);\n    PutWindowTilemap(sPokedexScreenData->windowIds[0]);\n    for (i = 0; i < 7; i++)\n        if ((sPokedexScreenData->unlockedSeviiAreas >> i) & 1)\n        {\n            sPokedexScreenData->windowIds[i + 1] = AddWindow(sAreaMapStructs_SeviiIslands[i].window);\n            CopyToWindowPixelBuffer(sPokedexScreenData->windowIds[i + 1], sAreaMapStructs_SeviiIslands[i].tiles, 0, 0);\n            SetWindowAttribute(sPokedexScreenData->windowIds[i + 1], WINDOW_TILEMAP_TOP, GetWindowAttribute(sPokedexScreenData->windowIds[i + 1], WINDOW_TILEMAP_TOP) + kantoMapVoff);\n            PutWindowTilemap(sPokedexScreenData->windowIds[i + 1]);\n            CopyWindowToVram(sPokedexScreenData->windowIds[i + 1], COPYWIN_GFX);\n        }\n    sPokedexScreenData->windowIds[8] = AddWindow(&sWindowTemplate_AreaMap_SpeciesName);\n    sPokedexScreenData->windowIds[9] = AddWindow(&sWindowTemplate_AreaMap_Size);\n    sPokedexScreenData->windowIds[10] = AddWindow(&sWindowTemplate_AreaMap_Area);\n    sPokedexScreenData->windowIds[11] = AddWindow(&sWindowTemplate_AreaMap_MonIcon);\n    sPokedexScreenData->windowIds[12] = AddWindow(&sWindowTemplate_AreaMap_MonTypes);\n\n    // Draw the mon icon\n    FillWindowPixelBuffer(sPokedexScreenData->windowIds[11], PIXEL_FILL(0));\n    ListMenu_LoadMonIconPalette(BG_PLTT_ID(10), species);\n    ListMenu_DrawMonIconGraphics(sPokedexScreenData->windowIds[11], species, DexScreen_GetDefaultPersonality(species), 0, 0);\n    PutWindowTilemap(sPokedexScreenData->windowIds[11]);\n    CopyWindowToVram(sPokedexScreenData->windowIds[11], COPYWIN_GFX);\n\n    // Print \"Size\"\n    FillWindowPixelBuffer(sPokedexScreenData->windowIds[9], PIXEL_FILL(0));\n    {\n        s32 strWidth = GetStringWidth(FONT_SMALL, gText_Size, 0);\n        DexScreen_AddTextPrinterParameterized(sPokedexScreenData->windowIds[9], FONT_SMALL, gText_Size, (sWindowTemplate_AreaMap_Size.width * 8 - strWidth) / 2, 4, 0);\n    }\n    PutWindowTilemap(sPokedexScreenData->windowIds[9]);\n    CopyWindowToVram(sPokedexScreenData->windowIds[9], COPYWIN_GFX);\n\n    // Print \"Area\"\n    FillWindowPixelBuffer(sPokedexScreenData->windowIds[10], PIXEL_FILL(0));\n    {\n        s32 strWidth = GetStringWidth(FONT_SMALL, gText_Area, 0);\n        DexScreen_AddTextPrinterParameterized(sPokedexScreenData->windowIds[10], FONT_SMALL, gText_Area, (sWindowTemplate_AreaMap_Area.width * 8 - strWidth) / 2, 4, 0);\n    }\n    SetWindowAttribute(sPokedexScreenData->windowIds[10], WINDOW_TILEMAP_TOP, GetWindowAttribute(sPokedexScreenData->windowIds[10], WINDOW_TILEMAP_TOP) + kantoMapVoff);\n    PutWindowTilemap(sPokedexScreenData->windowIds[10]);\n    CopyWindowToVram(sPokedexScreenData->windowIds[10], COPYWIN_GFX);\n\n    // Print species name\n    FillWindowPixelBuffer(sPokedexScreenData->windowIds[8], PIXEL_FILL(0));\n    DexScreen_PrintMonDexNo(sPokedexScreenData->windowIds[8], FONT_SMALL, species, 0, 0);\n    DexScreen_AddTextPrinterParameterized(sPokedexScreenData->windowIds[8], FONT_NORMAL, gSpeciesNames[species], 3, 12, 0);\n    PutWindowTilemap(sPokedexScreenData->windowIds[8]);\n    CopyWindowToVram(sPokedexScreenData->windowIds[8], COPYWIN_GFX);\n\n    // Type icons\n    FillWindowPixelBuffer(sPokedexScreenData->windowIds[12], PIXEL_FILL(0));\n    ListMenuLoadStdPalAt(BG_PLTT_ID(11), 1);\n\n    if (monIsCaught)\n    {\n        BlitMenuInfoIcon(sPokedexScreenData->windowIds[12], 1 + gSpeciesInfo[species].types[0], 0, 1);\n        if (gSpeciesInfo[species].types[0] != gSpeciesInfo[species].types[1])\n            BlitMenuInfoIcon(sPokedexScreenData->windowIds[12], 1 + gSpeciesInfo[species].types[1], 32, 1);\n    }\n    PutWindowTilemap(sPokedexScreenData->windowIds[12]);\n    CopyWindowToVram(sPokedexScreenData->windowIds[12], COPYWIN_GFX);\n\n    // Show size comparison\n    ResetAllPicSprites();\n    LoadPalette(sPalette_Silhouette, OBJ_PLTT_ID(2), PLTT_SIZE_4BPP);\n\n    if (monIsCaught)\n    {\n        sPokedexScreenData->windowIds[14] = CreateMonPicSprite_HandleDeoxys(species, SHINY_ODDS, DexScreen_GetDefaultPersonality(species), TRUE, 40, 104, 0, 0xFFFF);\n        gSprites[sPokedexScreenData->windowIds[14]].oam.paletteNum = 2;\n        gSprites[sPokedexScreenData->windowIds[14]].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n        gSprites[sPokedexScreenData->windowIds[14]].oam.matrixNum = 2;\n        gSprites[sPokedexScreenData->windowIds[14]].oam.priority = 1;\n        gSprites[sPokedexScreenData->windowIds[14]].y2 = gPokedexEntries[speciesId].pokemonOffset;\n        SetOamMatrix(2, gPokedexEntries[speciesId].pokemonScale, 0, 0, gPokedexEntries[speciesId].pokemonScale);\n        sPokedexScreenData->windowIds[15] = CreateTrainerPicSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender, TRUE), 1, 80, 104, 0, 0xFFFF);\n        gSprites[sPokedexScreenData->windowIds[15]].oam.paletteNum = 2;\n        gSprites[sPokedexScreenData->windowIds[15]].oam.affineMode = ST_OAM_AFFINE_NORMAL;\n        gSprites[sPokedexScreenData->windowIds[15]].oam.matrixNum = 1;\n        gSprites[sPokedexScreenData->windowIds[15]].oam.priority = 1;\n        gSprites[sPokedexScreenData->windowIds[15]].y2 = gPokedexEntries[speciesId].trainerOffset;\n        SetOamMatrix(1, gPokedexEntries[speciesId].trainerScale, 0, 0, gPokedexEntries[speciesId].trainerScale);\n    }\n    else\n    {\n        sPokedexScreenData->windowIds[14] = 0xff;\n        sPokedexScreenData->windowIds[15] = 0xff;\n    }\n\n    // Create the area markers\n    sPokedexScreenData->areaMarkersTaskId = CreatePokedexAreaMarkers(species, TAG_AREA_MARKERS, 3, kantoMapVoff * 8);\n    if (GetNumPokedexAreaMarkers(sPokedexScreenData->areaMarkersTaskId) == 0)\n    {\n        // No markers, display \"Area Unknown\"\n        BlitBitmapRectToWindow(sPokedexScreenData->windowIds[0], (void *)sBlitTiles_WideEllipse, 0, 0, 88, 16, 4, 28, 88, 16);\n        {\n            s32 strWidth = GetStringWidth(FONT_SMALL, gText_AreaUnknown, 0);\n            DexScreen_AddTextPrinterParameterized(sPokedexScreenData->windowIds[0], FONT_SMALL, gText_AreaUnknown, (96 - strWidth) / 2, 29, 0);\n        }\n    }\n    CopyWindowToVram(sPokedexScreenData->windowIds[0], COPYWIN_GFX);\n\n    // Draw the control info\n    FillWindowPixelBuffer(1, PIXEL_FILL(15));\n    DexScreen_AddTextPrinterParameterized(1, FONT_SMALL, gText_Cry, 8, 2, 4);\n    DexScreen_PrintControlInfo(gText_CancelPreviousData);\n    PutWindowTilemap(1);\n    CopyWindowToVram(1, COPYWIN_GFX);\n\n    return 1;\n}\n\n\nu8 DexScreen_DestroyAreaScreenResources(void)\n{\n    int i;\n\n    DestroyPokedexAreaMarkers(sPokedexScreenData->areaMarkersTaskId);\n\n    for (i = 0; i < 13; i++)\n        DexScreen_RemoveWindow(&sPokedexScreenData->windowIds[i]);\n    if (sPokedexScreenData->windowIds[15] != 0xff)\n        FreeAndDestroyTrainerPicSprite(sPokedexScreenData->windowIds[15]);\n    if (sPokedexScreenData->windowIds[14] != 0xff)\n        FreeAndDestroyMonPicSprite(sPokedexScreenData->windowIds[14]);\n    return 0;\n}\n\nstatic u8 DexScreen_IsPageUnlocked(u8 categoryNum, u8 pageNum)\n{\n    int i, count;\n    u16 species;\n\n    count = gDexCategories[categoryNum].page[pageNum].count;\n\n    for (i = 0; i < 4; i++)\n    {\n        if (i < count)\n        {\n            species = gDexCategories[categoryNum].page[pageNum].species[i];\n            if (DexScreen_CanShowMonInDex(species) == TRUE && DexScreen_GetSetPokedexFlag(species, FLAG_GET_SEEN, TRUE))\n                return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 DexScreen_IsCategoryUnlocked(u8 categoryNum)\n{\n    int i;\n    u8 count;\n\n    count = gDexCategories[categoryNum].count;\n\n    for (i = 0; i < count; i++)\n        if (DexScreen_IsPageUnlocked(categoryNum, i))\n            return 1;\n\n    return 0;\n}\n\nvoid DexScreen_CreateCategoryPageSpeciesList(u8 categoryNum, u8 pageNum)\n{\n    int i, count;\n    u16 species;\n\n    count = gDexCategories[categoryNum].page[pageNum].count;\n    sPokedexScreenData->numMonsOnPage = 0;\n\n    for (i = 0; i < 4; i++)\n        sPokedexScreenData->pageSpecies[i] = 0xffff;\n    for (i = 0; i < count; i++)\n    {\n        species = gDexCategories[categoryNum].page[pageNum].species[i];\n        if (DexScreen_CanShowMonInDex(species) == TRUE && DexScreen_GetSetPokedexFlag(species, FLAG_GET_SEEN, TRUE))\n        {\n            sPokedexScreenData->pageSpecies[sPokedexScreenData->numMonsOnPage] = gDexCategories[categoryNum].page[pageNum].species[i];\n            sPokedexScreenData->numMonsOnPage++;\n        }\n    }\n}\n\nstatic u8 DexScreen_GetPageLimitsForCategory(u8 category)\n{\n    int i;\n    u8 count, firstPage, lastPage;\n\n    count = gDexCategories[category].count;\n    firstPage = 0xff;\n    lastPage = 0xff;\n\n    for (i = 0; i < count; i++)\n        if (DexScreen_IsPageUnlocked(category, i))\n        {\n            if (firstPage == 0xff)\n                firstPage = i;\n            lastPage = i;\n        }\n    if (lastPage != 0xff)\n    {\n        sPokedexScreenData->firstPageInCategory = firstPage;\n        sPokedexScreenData->lastPageInCategory = lastPage + 1;\n        return FALSE;\n    }\n    else\n    {\n        sPokedexScreenData->firstPageInCategory = 0;\n        sPokedexScreenData->lastPageInCategory = 0;\n        return TRUE;\n    }\n}\n\nstatic u8 DexScreen_LookUpCategoryBySpecies(u16 species)\n{\n    int i, j, k, categoryCount, categoryPageCount, posInPage;\n    u16 dexSpecies;\n\n    for (i = 0; i < NELEMS(gDexCategories); i++)\n    {\n        categoryCount = gDexCategories[i].count;\n        for (j = 0; j < categoryCount; j++)\n        {\n            categoryPageCount = gDexCategories[i].page[j].count;\n            for (k = 0, posInPage = 0; k < categoryPageCount; k++)\n            {\n                dexSpecies = gDexCategories[i].page[j].species[k];\n                if (species == dexSpecies)\n                {\n                    sPokedexScreenData->category = i;\n                    sPokedexScreenData->pageNum = j;\n                    sPokedexScreenData->categoryCursorPosInPage = posInPage;\n                    return FALSE;\n                }\n                if (DexScreen_CanShowMonInDex(dexSpecies) == TRUE && DexScreen_GetSetPokedexFlag(dexSpecies, FLAG_GET_SEEN, TRUE))\n                    posInPage++;\n            }\n        }\n    }\n    return TRUE;\n}\n\nstatic u8 DexScreen_PageNumberToRenderablePages(u16 page)\n{\n    int i, count;\n\n    for (i = 0, count = 0; i < page; i++)\n        if (DexScreen_IsPageUnlocked(sPokedexScreenData->category, i))\n            count++;\n\n    return count + 1;\n}\n\nvoid DexScreen_InputHandler_StartToCry(void)\n{\n    if (JOY_NEW(START_BUTTON))\n        PlayCry_NormalNoDucking(sPokedexScreenData->dexSpecies, 0, CRY_VOLUME_RS, CRY_PRIORITY_NORMAL);\n}\n\nu8 DexScreen_RegisterMonToPokedex(u16 species)\n{\n    DexScreen_GetSetPokedexFlag(species, FLAG_SET_SEEN, TRUE);\n    DexScreen_GetSetPokedexFlag(species, FLAG_SET_CAUGHT, TRUE);\n\n    if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n        if(SpeciesToExtendedPokedexNum(species) > EXTENDED_DEX_COUNT)\n            return CreateTask(Task_DexScreen_RegisterNonKantoMonBeforeNationalDex, 0);\n\n    if (!FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled() && SpeciesToNationalPokedexNum(species) > KANTO_DEX_COUNT)\n        return CreateTask(Task_DexScreen_RegisterNonKantoMonBeforeNationalDex, 0);\n\n    DexScreen_LoadResources();\n    gTasks[sPokedexScreenData->taskId].func = Task_DexScreen_RegisterMonToPokedex;\n    DexScreen_LookUpCategoryBySpecies(species);\n\n    return sPokedexScreenData->taskId;\n}\n\nstatic void Task_DexScreen_RegisterNonKantoMonBeforeNationalDex(u8 taskId)\n{\n    DestroyTask(taskId);\n}\n\nstatic void Task_DexScreen_RegisterMonToPokedex(u8 taskId)\n{\n    switch (sPokedexScreenData->state)\n    {\n    case 0:\n        DexScreen_GetPageLimitsForCategory(sPokedexScreenData->category);\n        if (sPokedexScreenData->pageNum < sPokedexScreenData->firstPageInCategory)\n            sPokedexScreenData->pageNum = sPokedexScreenData->firstPageInCategory;\n        sPokedexScreenData->state = 3;\n        break;\n    case 1:\n        RemoveDexPageWindows();\n        DexScreen_DestroyCategoryPageMonIconAndInfoWindows();\n\n        gMain.state = 0;\n        sPokedexScreenData->state = 2;\n        break;\n    case 2:\n        if (DoClosePokedex())\n            DestroyTask(taskId);\n        break;\n    case 3:\n        DexScreen_CreateCategoryListGfx(TRUE);\n        PutWindowTilemap(0);\n        PutWindowTilemap(1);\n\n        CopyBgTilemapBufferToVram(3);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(0);\n\n        DexScreen_CreateCategoryPageSelectionCursor(0xff);\n\n        sPokedexScreenData->state = 4;\n        break;\n    case 4:\n        gPaletteFade.bufferTransferDisabled = 0;\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0xffff);\n        ShowBg(3);\n        ShowBg(2);\n        ShowBg(1);\n        ShowBg(0);\n\n        sPokedexScreenData->state = 5;\n        break;\n    case 5:\n        gTasks[taskId].data[0] = 30;\n        sPokedexScreenData->categoryPageCursorTaskId = ListMenuAddCursorObjectInternal(&sCursorStruct_CategoryPage, 0);\n        sPokedexScreenData->state = 6;\n        break;\n    case 6:\n        DexScreen_CreateCategoryPageSelectionCursor(sPokedexScreenData->categoryCursorPosInPage);\n        DexScreen_UpdateCategoryPageCursorObject(sPokedexScreenData->categoryPageCursorTaskId, sPokedexScreenData->categoryCursorPosInPage, sPokedexScreenData->numMonsOnPage);\n\n        if (gTasks[taskId].data[0])\n            gTasks[taskId].data[0]--;\n        else\n        {\n            ListMenuRemoveCursorObject(sPokedexScreenData->categoryPageCursorTaskId, 0);\n            sPokedexScreenData->state = 7;\n        }\n        break;\n    case 7:\n        sPokedexScreenData->dexSpecies = sPokedexScreenData->pageSpecies[sPokedexScreenData->categoryCursorPosInPage];\n        sPokedexScreenData->state = 8;\n        break;\n    case 8:\n        if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n            sPokedexScreenData->dexOrderId = DEX_ORDER_NUMERICAL_NATIONAL;\n        DexScreen_DrawMonDexPage(TRUE); //goes to first data page from freshly caught\n        sPokedexScreenData->state = 9;\n        break;\n    case 9:\n        sPokedexScreenData->data[0] = 0;\n        sPokedexScreenData->data[1] = 0;\n        sPokedexScreenData->state++;\n    case 10:\n        if (sPokedexScreenData->data[1] < 6)\n        {\n            if (sPokedexScreenData->data[0])\n            {\n                DexScreen_DexPageZoomEffectFrame(0, sPokedexScreenData->data[1]);\n                CopyBgTilemapBufferToVram(0);\n                sPokedexScreenData->data[0] = 4;\n                sPokedexScreenData->data[1]++;\n            }\n            else\n                sPokedexScreenData->data[0]--;\n        }\n        else\n        {\n            FillBgTilemapBufferRect_Palette0(0, 0, 0, 2, 30, 16);\n            CopyBgTilemapBufferToVram(3);\n            CopyBgTilemapBufferToVram(2);\n            CopyBgTilemapBufferToVram(1);\n            CopyBgTilemapBufferToVram(0);\n\n            PlayCry_NormalNoDucking(sPokedexScreenData->dexSpecies, 0, CRY_VOLUME_RS, CRY_PRIORITY_NORMAL);\n            sPokedexScreenData->data[0] = 0;\n            sPokedexScreenData->state = 11;\n        }\n        break;\n    case 11:\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n            sPokedexScreenData->state = 2;\n        break;\n    }\n}\n\nvoid DexScreen_PrintStringWithAlignment(const u8 * str, s32 mode)\n{\n    u32 x;\n\n    switch (mode)\n    {\n    case TEXT_LEFT:\n        x = 8;\n        break;\n    case TEXT_CENTER:\n        x = (u32)(240 - GetStringWidth(FONT_NORMAL, str, 0)) / 2;\n        break;\n    case TEXT_RIGHT:\n    default:\n        x = 232 - GetStringWidth(FONT_NORMAL, str, 0);\n        break;\n    }\n\n    DexScreen_AddTextPrinterParameterized(0, FONT_NORMAL, str, x, 2, 4);\n}\n"
  },
  {
    "path": "src/pokemon.c",
    "content": "#define IS_POKEMON_C\n\n#include \"global.h\"\n#include \"gflib.h\"\n#include \"random.h\"\n#include \"text.h\"\n#include \"data.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"item.h\"\n#include \"event_data.h\"\n#include \"util.h\"\n#include \"pokemon_storage_system.h\"\n#include \"battle_gfx_sfx_util.h\"\n#include \"battle_controllers.h\"\n#include \"evolution_scene.h\"\n#include \"battle_message.h\"\n#include \"battle_util.h\"\n#include \"link.h\"\n#include \"m4a.h\"\n#include \"pokedex.h\"\n#include \"strings.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"field_specials.h\"\n#include \"berry.h\"\n#include \"constants/items.h\"\n#include \"constants/item_effects.h\"\n#include \"constants/hoenn_cries.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/abilities.h\"\n#include \"constants/flags.h\"\n#include \"constants/map_types.h\"\n#include \"constants/moves.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/songs.h\"\n#include \"constants/item_effects.h\"\n#include \"constants/trainers.h\"\n#include \"constants/hold_effects.h\"\n#include \"constants/battle_move_effects.h\"\n#include \"constants/union_room.h\"\n\n//#include \"printf.h\"\n//#include \"mgba.h\"\n//#include \"string_util.h\"\n\n// Extracts the upper 16 bits of a 32-bit number\n#define HIHALF(n) (((n) & 0xFFFF0000) >> 16)\n\n// Extracts the lower 16 bits of a 32-bit number\n#define LOHALF(n) ((n) & 0xFFFF)\n\n#define SPECIES_TO_HOENN(name)      [SPECIES_##name - 1] = HOENN_DEX_##name\n#define SPECIES_TO_NATIONAL(name)   [SPECIES_##name - 1] = NATIONAL_DEX_##name\n#define HOENN_TO_NATIONAL(name)     [HOENN_DEX_##name - 1] = NATIONAL_DEX_##name\n#define SPECIES_TO_EXTENDED(name)   [SPECIES_##name - 1] = EXTENDED_DEX_##name\n#define EXTENDED_TO_NATIONAL(name)  [EXTENDED_DEX_##name - 1] = NATIONAL_DEX_##name\n\nstruct MonSpritesGfxManager\n{\n    u8 numSprites:4;\n    u8 battlePosition:4;\n    u8 numFrames;\n    u8 active;\n    u8 mode;\n    u32 dataSize;\n    u8 *spriteBuffer;\n    u8 **spritePointers;\n    struct SpriteTemplate *templates;\n    struct SpriteFrameImage *frameImages;\n};\n\nstatic EWRAM_DATA u8 sLearningMoveTableID = 0;\nEWRAM_DATA u8 gPlayerPartyCount = 0;\nEWRAM_DATA u8 gEnemyPartyCount = 0;\nEWRAM_DATA struct Pokemon gEnemyParty[PARTY_SIZE] = {};\nEWRAM_DATA struct Pokemon gPlayerParty[PARTY_SIZE] = {};\nEWRAM_DATA struct SpriteTemplate gMultiuseSpriteTemplate = {0};\nstatic EWRAM_DATA struct MonSpritesGfxManager *sMonSpritesGfxManager = NULL;\n\nstatic union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType);\nstatic u16 GetDeoxysStat(struct Pokemon *mon, s32 statId);\nstatic bool8 IsShinyOtIdPersonality(u32 otId, u32 personality);\nstatic u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex);\nu8 GetNatureFromPersonality(u32 personality);\nstatic bool8 PartyMonHasStatus(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);\nstatic bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);\nstatic bool8 IsPokemonStorageFull(void);\nstatic void EncryptBoxMon(struct BoxPokemon *boxMon);\nstatic void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);\nstatic void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon);\nstatic u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);\nstatic u8 GetLevelFromMonExp(struct Pokemon *mon);\nstatic u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon);\nstatic u8 PopulateSpeciesEvoLineForRelearner(u16 species, bool8 isHatched, u16 evoLine[]);\nstatic bool32 ShouldSkipFriendshipChange(void);\n\n#include \"data/battle_moves.h\"\n\n// Used in an unreferenced function in RS.\n// Unreferenced here and in Emerald.\nstruct CombinedMove\n{\n    u16 move1;\n    u16 move2;\n    u16 newMove;\n};\n\nstatic const struct CombinedMove sCombinedMoves[2] =\n{\n    {MOVE_EMBER, MOVE_GUST, MOVE_HEAT_WAVE},\n    {0xFFFF, 0xFFFF, 0xFFFF}\n};\n\n// NOTE: The order of the elements in the 3 arrays below is irrelevant.\n// To reorder the pokedex, see the values in include/constants/pokedex.h.\n\n // Assigns all species to the Hoenn Dex Index (Summary No. for Hoenn Dex)\nstatic const u16 sSpeciesToHoennPokedexNum[NUM_SPECIES - 1] =\n{\n    SPECIES_TO_HOENN(BULBASAUR),\n    SPECIES_TO_HOENN(IVYSAUR),\n    SPECIES_TO_HOENN(VENUSAUR),\n    SPECIES_TO_HOENN(CHARMANDER),\n    SPECIES_TO_HOENN(CHARMELEON),\n    SPECIES_TO_HOENN(CHARIZARD),\n    SPECIES_TO_HOENN(SQUIRTLE),\n    SPECIES_TO_HOENN(WARTORTLE),\n    SPECIES_TO_HOENN(BLASTOISE),\n    SPECIES_TO_HOENN(CATERPIE),\n    SPECIES_TO_HOENN(METAPOD),\n    SPECIES_TO_HOENN(BUTTERFREE),\n    SPECIES_TO_HOENN(WEEDLE),\n    SPECIES_TO_HOENN(KAKUNA),\n    SPECIES_TO_HOENN(BEEDRILL),\n    SPECIES_TO_HOENN(PIDGEY),\n    SPECIES_TO_HOENN(PIDGEOTTO),\n    SPECIES_TO_HOENN(PIDGEOT),\n    SPECIES_TO_HOENN(RATTATA),\n    SPECIES_TO_HOENN(RATICATE),\n    SPECIES_TO_HOENN(SPEAROW),\n    SPECIES_TO_HOENN(FEAROW),\n    SPECIES_TO_HOENN(EKANS),\n    SPECIES_TO_HOENN(ARBOK),\n    SPECIES_TO_HOENN(PIKACHU),\n    SPECIES_TO_HOENN(RAICHU),\n    SPECIES_TO_HOENN(SANDSHREW),\n    SPECIES_TO_HOENN(SANDSLASH),\n    SPECIES_TO_HOENN(NIDORAN_F),\n    SPECIES_TO_HOENN(NIDORINA),\n    SPECIES_TO_HOENN(NIDOQUEEN),\n    SPECIES_TO_HOENN(NIDORAN_M),\n    SPECIES_TO_HOENN(NIDORINO),\n    SPECIES_TO_HOENN(NIDOKING),\n    SPECIES_TO_HOENN(CLEFAIRY),\n    SPECIES_TO_HOENN(CLEFABLE),\n    SPECIES_TO_HOENN(VULPIX),\n    SPECIES_TO_HOENN(NINETALES),\n    SPECIES_TO_HOENN(JIGGLYPUFF),\n    SPECIES_TO_HOENN(WIGGLYTUFF),\n    SPECIES_TO_HOENN(ZUBAT),\n    SPECIES_TO_HOENN(GOLBAT),\n    SPECIES_TO_HOENN(ODDISH),\n    SPECIES_TO_HOENN(GLOOM),\n    SPECIES_TO_HOENN(VILEPLUME),\n    SPECIES_TO_HOENN(PARAS),\n    SPECIES_TO_HOENN(PARASECT),\n    SPECIES_TO_HOENN(VENONAT),\n    SPECIES_TO_HOENN(VENOMOTH),\n    SPECIES_TO_HOENN(DIGLETT),\n    SPECIES_TO_HOENN(DUGTRIO),\n    SPECIES_TO_HOENN(MEOWTH),\n    SPECIES_TO_HOENN(PERSIAN),\n    SPECIES_TO_HOENN(PSYDUCK),\n    SPECIES_TO_HOENN(GOLDUCK),\n    SPECIES_TO_HOENN(MANKEY),\n    SPECIES_TO_HOENN(PRIMEAPE),\n    SPECIES_TO_HOENN(GROWLITHE),\n    SPECIES_TO_HOENN(ARCANINE),\n    SPECIES_TO_HOENN(POLIWAG),\n    SPECIES_TO_HOENN(POLIWHIRL),\n    SPECIES_TO_HOENN(POLIWRATH),\n    SPECIES_TO_HOENN(ABRA),\n    SPECIES_TO_HOENN(KADABRA),\n    SPECIES_TO_HOENN(ALAKAZAM),\n    SPECIES_TO_HOENN(MACHOP),\n    SPECIES_TO_HOENN(MACHOKE),\n    SPECIES_TO_HOENN(MACHAMP),\n    SPECIES_TO_HOENN(BELLSPROUT),\n    SPECIES_TO_HOENN(WEEPINBELL),\n    SPECIES_TO_HOENN(VICTREEBEL),\n    SPECIES_TO_HOENN(TENTACOOL),\n    SPECIES_TO_HOENN(TENTACRUEL),\n    SPECIES_TO_HOENN(GEODUDE),\n    SPECIES_TO_HOENN(GRAVELER),\n    SPECIES_TO_HOENN(GOLEM),\n    SPECIES_TO_HOENN(PONYTA),\n    SPECIES_TO_HOENN(RAPIDASH),\n    SPECIES_TO_HOENN(SLOWPOKE),\n    SPECIES_TO_HOENN(SLOWBRO),\n    SPECIES_TO_HOENN(MAGNEMITE),\n    SPECIES_TO_HOENN(MAGNETON),\n    SPECIES_TO_HOENN(FARFETCHD),\n    SPECIES_TO_HOENN(DODUO),\n    SPECIES_TO_HOENN(DODRIO),\n    SPECIES_TO_HOENN(SEEL),\n    SPECIES_TO_HOENN(DEWGONG),\n    SPECIES_TO_HOENN(GRIMER),\n    SPECIES_TO_HOENN(MUK),\n    SPECIES_TO_HOENN(SHELLDER),\n    SPECIES_TO_HOENN(CLOYSTER),\n    SPECIES_TO_HOENN(GASTLY),\n    SPECIES_TO_HOENN(HAUNTER),\n    SPECIES_TO_HOENN(GENGAR),\n    SPECIES_TO_HOENN(ONIX),\n    SPECIES_TO_HOENN(DROWZEE),\n    SPECIES_TO_HOENN(HYPNO),\n    SPECIES_TO_HOENN(KRABBY),\n    SPECIES_TO_HOENN(KINGLER),\n    SPECIES_TO_HOENN(VOLTORB),\n    SPECIES_TO_HOENN(ELECTRODE),\n    SPECIES_TO_HOENN(EXEGGCUTE),\n    SPECIES_TO_HOENN(EXEGGUTOR),\n    SPECIES_TO_HOENN(CUBONE),\n    SPECIES_TO_HOENN(MAROWAK),\n    SPECIES_TO_HOENN(HITMONLEE),\n    SPECIES_TO_HOENN(HITMONCHAN),\n    SPECIES_TO_HOENN(LICKITUNG),\n    SPECIES_TO_HOENN(KOFFING),\n    SPECIES_TO_HOENN(WEEZING),\n    SPECIES_TO_HOENN(RHYHORN),\n    SPECIES_TO_HOENN(RHYDON),\n    SPECIES_TO_HOENN(CHANSEY),\n    SPECIES_TO_HOENN(TANGELA),\n    SPECIES_TO_HOENN(KANGASKHAN),\n    SPECIES_TO_HOENN(HORSEA),\n    SPECIES_TO_HOENN(SEADRA),\n    SPECIES_TO_HOENN(GOLDEEN),\n    SPECIES_TO_HOENN(SEAKING),\n    SPECIES_TO_HOENN(STARYU),\n    SPECIES_TO_HOENN(STARMIE),\n    SPECIES_TO_HOENN(MR_MIME),\n    SPECIES_TO_HOENN(SCYTHER),\n    SPECIES_TO_HOENN(JYNX),\n    SPECIES_TO_HOENN(ELECTABUZZ),\n    SPECIES_TO_HOENN(MAGMAR),\n    SPECIES_TO_HOENN(PINSIR),\n    SPECIES_TO_HOENN(TAUROS),\n    SPECIES_TO_HOENN(MAGIKARP),\n    SPECIES_TO_HOENN(GYARADOS),\n    SPECIES_TO_HOENN(LAPRAS),\n    SPECIES_TO_HOENN(DITTO),\n    SPECIES_TO_HOENN(EEVEE),\n    SPECIES_TO_HOENN(VAPOREON),\n    SPECIES_TO_HOENN(JOLTEON),\n    SPECIES_TO_HOENN(FLAREON),\n    SPECIES_TO_HOENN(PORYGON),\n    SPECIES_TO_HOENN(OMANYTE),\n    SPECIES_TO_HOENN(OMASTAR),\n    SPECIES_TO_HOENN(KABUTO),\n    SPECIES_TO_HOENN(KABUTOPS),\n    SPECIES_TO_HOENN(AERODACTYL),\n    SPECIES_TO_HOENN(SNORLAX),\n    SPECIES_TO_HOENN(ARTICUNO),\n    SPECIES_TO_HOENN(ZAPDOS),\n    SPECIES_TO_HOENN(MOLTRES),\n    SPECIES_TO_HOENN(DRATINI),\n    SPECIES_TO_HOENN(DRAGONAIR),\n    SPECIES_TO_HOENN(DRAGONITE),\n    SPECIES_TO_HOENN(MEWTWO),\n    SPECIES_TO_HOENN(MEW),\n    SPECIES_TO_HOENN(CHIKORITA),\n    SPECIES_TO_HOENN(BAYLEEF),\n    SPECIES_TO_HOENN(MEGANIUM),\n    SPECIES_TO_HOENN(CYNDAQUIL),\n    SPECIES_TO_HOENN(QUILAVA),\n    SPECIES_TO_HOENN(TYPHLOSION),\n    SPECIES_TO_HOENN(TOTODILE),\n    SPECIES_TO_HOENN(CROCONAW),\n    SPECIES_TO_HOENN(FERALIGATR),\n    SPECIES_TO_HOENN(SENTRET),\n    SPECIES_TO_HOENN(FURRET),\n    SPECIES_TO_HOENN(HOOTHOOT),\n    SPECIES_TO_HOENN(NOCTOWL),\n    SPECIES_TO_HOENN(LEDYBA),\n    SPECIES_TO_HOENN(LEDIAN),\n    SPECIES_TO_HOENN(SPINARAK),\n    SPECIES_TO_HOENN(ARIADOS),\n    SPECIES_TO_HOENN(CROBAT),\n    SPECIES_TO_HOENN(CHINCHOU),\n    SPECIES_TO_HOENN(LANTURN),\n    SPECIES_TO_HOENN(PICHU),\n    SPECIES_TO_HOENN(CLEFFA),\n    SPECIES_TO_HOENN(IGGLYBUFF),\n    SPECIES_TO_HOENN(TOGEPI),\n    SPECIES_TO_HOENN(TOGETIC),\n    SPECIES_TO_HOENN(NATU),\n    SPECIES_TO_HOENN(XATU),\n    SPECIES_TO_HOENN(MAREEP),\n    SPECIES_TO_HOENN(FLAAFFY),\n    SPECIES_TO_HOENN(AMPHAROS),\n    SPECIES_TO_HOENN(BELLOSSOM),\n    SPECIES_TO_HOENN(MARILL),\n    SPECIES_TO_HOENN(AZUMARILL),\n    SPECIES_TO_HOENN(SUDOWOODO),\n    SPECIES_TO_HOENN(POLITOED),\n    SPECIES_TO_HOENN(HOPPIP),\n    SPECIES_TO_HOENN(SKIPLOOM),\n    SPECIES_TO_HOENN(JUMPLUFF),\n    SPECIES_TO_HOENN(AIPOM),\n    SPECIES_TO_HOENN(SUNKERN),\n    SPECIES_TO_HOENN(SUNFLORA),\n    SPECIES_TO_HOENN(YANMA),\n    SPECIES_TO_HOENN(WOOPER),\n    SPECIES_TO_HOENN(QUAGSIRE),\n    SPECIES_TO_HOENN(ESPEON),\n    SPECIES_TO_HOENN(UMBREON),\n    SPECIES_TO_HOENN(MURKROW),\n    SPECIES_TO_HOENN(SLOWKING),\n    SPECIES_TO_HOENN(MISDREAVUS),\n    SPECIES_TO_HOENN(UNOWN),\n    SPECIES_TO_HOENN(WOBBUFFET),\n    SPECIES_TO_HOENN(GIRAFARIG),\n    SPECIES_TO_HOENN(PINECO),\n    SPECIES_TO_HOENN(FORRETRESS),\n    SPECIES_TO_HOENN(DUNSPARCE),\n    SPECIES_TO_HOENN(GLIGAR),\n    SPECIES_TO_HOENN(STEELIX),\n    SPECIES_TO_HOENN(SNUBBULL),\n    SPECIES_TO_HOENN(GRANBULL),\n    SPECIES_TO_HOENN(QWILFISH),\n    SPECIES_TO_HOENN(SCIZOR),\n    SPECIES_TO_HOENN(SHUCKLE),\n    SPECIES_TO_HOENN(HERACROSS),\n    SPECIES_TO_HOENN(SNEASEL),\n    SPECIES_TO_HOENN(TEDDIURSA),\n    SPECIES_TO_HOENN(URSARING),\n    SPECIES_TO_HOENN(SLUGMA),\n    SPECIES_TO_HOENN(MAGCARGO),\n    SPECIES_TO_HOENN(SWINUB),\n    SPECIES_TO_HOENN(PILOSWINE),\n    SPECIES_TO_HOENN(CORSOLA),\n    SPECIES_TO_HOENN(REMORAID),\n    SPECIES_TO_HOENN(OCTILLERY),\n    SPECIES_TO_HOENN(DELIBIRD),\n    SPECIES_TO_HOENN(MANTINE),\n    SPECIES_TO_HOENN(SKARMORY),\n    SPECIES_TO_HOENN(HOUNDOUR),\n    SPECIES_TO_HOENN(HOUNDOOM),\n    SPECIES_TO_HOENN(KINGDRA),\n    SPECIES_TO_HOENN(PHANPY),\n    SPECIES_TO_HOENN(DONPHAN),\n    SPECIES_TO_HOENN(PORYGON2),\n    SPECIES_TO_HOENN(STANTLER),\n    SPECIES_TO_HOENN(SMEARGLE),\n    SPECIES_TO_HOENN(TYROGUE),\n    SPECIES_TO_HOENN(HITMONTOP),\n    SPECIES_TO_HOENN(SMOOCHUM),\n    SPECIES_TO_HOENN(ELEKID),\n    SPECIES_TO_HOENN(MAGBY),\n    SPECIES_TO_HOENN(MILTANK),\n    SPECIES_TO_HOENN(BLISSEY),\n    SPECIES_TO_HOENN(RAIKOU),\n    SPECIES_TO_HOENN(ENTEI),\n    SPECIES_TO_HOENN(SUICUNE),\n    SPECIES_TO_HOENN(LARVITAR),\n    SPECIES_TO_HOENN(PUPITAR),\n    SPECIES_TO_HOENN(TYRANITAR),\n    SPECIES_TO_HOENN(LUGIA),\n    SPECIES_TO_HOENN(HO_OH),\n    SPECIES_TO_HOENN(CELEBI),\n    SPECIES_TO_HOENN(OLD_UNOWN_B),\n    SPECIES_TO_HOENN(OLD_UNOWN_C),\n    SPECIES_TO_HOENN(OLD_UNOWN_D),\n    SPECIES_TO_HOENN(OLD_UNOWN_E),\n    SPECIES_TO_HOENN(OLD_UNOWN_F),\n    SPECIES_TO_HOENN(OLD_UNOWN_G),\n    SPECIES_TO_HOENN(OLD_UNOWN_H),\n    SPECIES_TO_HOENN(OLD_UNOWN_I),\n    SPECIES_TO_HOENN(OLD_UNOWN_J),\n    SPECIES_TO_HOENN(OLD_UNOWN_K),\n    SPECIES_TO_HOENN(OLD_UNOWN_L),\n    SPECIES_TO_HOENN(OLD_UNOWN_M),\n    SPECIES_TO_HOENN(OLD_UNOWN_N),\n    SPECIES_TO_HOENN(OLD_UNOWN_O),\n    SPECIES_TO_HOENN(OLD_UNOWN_P),\n    SPECIES_TO_HOENN(OLD_UNOWN_Q),\n    SPECIES_TO_HOENN(OLD_UNOWN_R),\n    SPECIES_TO_HOENN(OLD_UNOWN_S),\n    SPECIES_TO_HOENN(OLD_UNOWN_T),\n    SPECIES_TO_HOENN(OLD_UNOWN_U),\n    SPECIES_TO_HOENN(OLD_UNOWN_V),\n    SPECIES_TO_HOENN(OLD_UNOWN_W),\n    SPECIES_TO_HOENN(OLD_UNOWN_X),\n    SPECIES_TO_HOENN(OLD_UNOWN_Y),\n    SPECIES_TO_HOENN(OLD_UNOWN_Z),\n    SPECIES_TO_HOENN(TREECKO),\n    SPECIES_TO_HOENN(GROVYLE),\n    SPECIES_TO_HOENN(SCEPTILE),\n    SPECIES_TO_HOENN(TORCHIC),\n    SPECIES_TO_HOENN(COMBUSKEN),\n    SPECIES_TO_HOENN(BLAZIKEN),\n    SPECIES_TO_HOENN(MUDKIP),\n    SPECIES_TO_HOENN(MARSHTOMP),\n    SPECIES_TO_HOENN(SWAMPERT),\n    SPECIES_TO_HOENN(POOCHYENA),\n    SPECIES_TO_HOENN(MIGHTYENA),\n    SPECIES_TO_HOENN(ZIGZAGOON),\n    SPECIES_TO_HOENN(LINOONE),\n    SPECIES_TO_HOENN(WURMPLE),\n    SPECIES_TO_HOENN(SILCOON),\n    SPECIES_TO_HOENN(BEAUTIFLY),\n    SPECIES_TO_HOENN(CASCOON),\n    SPECIES_TO_HOENN(DUSTOX),\n    SPECIES_TO_HOENN(LOTAD),\n    SPECIES_TO_HOENN(LOMBRE),\n    SPECIES_TO_HOENN(LUDICOLO),\n    SPECIES_TO_HOENN(SEEDOT),\n    SPECIES_TO_HOENN(NUZLEAF),\n    SPECIES_TO_HOENN(SHIFTRY),\n    SPECIES_TO_HOENN(NINCADA),\n    SPECIES_TO_HOENN(NINJASK),\n    SPECIES_TO_HOENN(SHEDINJA),\n    SPECIES_TO_HOENN(TAILLOW),\n    SPECIES_TO_HOENN(SWELLOW),\n    SPECIES_TO_HOENN(SHROOMISH),\n    SPECIES_TO_HOENN(BRELOOM),\n    SPECIES_TO_HOENN(SPINDA),\n    SPECIES_TO_HOENN(WINGULL),\n    SPECIES_TO_HOENN(PELIPPER),\n    SPECIES_TO_HOENN(SURSKIT),\n    SPECIES_TO_HOENN(MASQUERAIN),\n    SPECIES_TO_HOENN(WAILMER),\n    SPECIES_TO_HOENN(WAILORD),\n    SPECIES_TO_HOENN(SKITTY),\n    SPECIES_TO_HOENN(DELCATTY),\n    SPECIES_TO_HOENN(KECLEON),\n    SPECIES_TO_HOENN(BALTOY),\n    SPECIES_TO_HOENN(CLAYDOL),\n    SPECIES_TO_HOENN(NOSEPASS),\n    SPECIES_TO_HOENN(TORKOAL),\n    SPECIES_TO_HOENN(SABLEYE),\n    SPECIES_TO_HOENN(BARBOACH),\n    SPECIES_TO_HOENN(WHISCASH),\n    SPECIES_TO_HOENN(LUVDISC),\n    SPECIES_TO_HOENN(CORPHISH),\n    SPECIES_TO_HOENN(CRAWDAUNT),\n    SPECIES_TO_HOENN(FEEBAS),\n    SPECIES_TO_HOENN(MILOTIC),\n    SPECIES_TO_HOENN(CARVANHA),\n    SPECIES_TO_HOENN(SHARPEDO),\n    SPECIES_TO_HOENN(TRAPINCH),\n    SPECIES_TO_HOENN(VIBRAVA),\n    SPECIES_TO_HOENN(FLYGON),\n    SPECIES_TO_HOENN(MAKUHITA),\n    SPECIES_TO_HOENN(HARIYAMA),\n    SPECIES_TO_HOENN(ELECTRIKE),\n    SPECIES_TO_HOENN(MANECTRIC),\n    SPECIES_TO_HOENN(NUMEL),\n    SPECIES_TO_HOENN(CAMERUPT),\n    SPECIES_TO_HOENN(SPHEAL),\n    SPECIES_TO_HOENN(SEALEO),\n    SPECIES_TO_HOENN(WALREIN),\n    SPECIES_TO_HOENN(CACNEA),\n    SPECIES_TO_HOENN(CACTURNE),\n    SPECIES_TO_HOENN(SNORUNT),\n    SPECIES_TO_HOENN(GLALIE),\n    SPECIES_TO_HOENN(LUNATONE),\n    SPECIES_TO_HOENN(SOLROCK),\n    SPECIES_TO_HOENN(AZURILL),\n    SPECIES_TO_HOENN(SPOINK),\n    SPECIES_TO_HOENN(GRUMPIG),\n    SPECIES_TO_HOENN(PLUSLE),\n    SPECIES_TO_HOENN(MINUN),\n    SPECIES_TO_HOENN(MAWILE),\n    SPECIES_TO_HOENN(MEDITITE),\n    SPECIES_TO_HOENN(MEDICHAM),\n    SPECIES_TO_HOENN(SWABLU),\n    SPECIES_TO_HOENN(ALTARIA),\n    SPECIES_TO_HOENN(WYNAUT),\n    SPECIES_TO_HOENN(DUSKULL),\n    SPECIES_TO_HOENN(DUSCLOPS),\n    SPECIES_TO_HOENN(ROSELIA),\n    SPECIES_TO_HOENN(SLAKOTH),\n    SPECIES_TO_HOENN(VIGOROTH),\n    SPECIES_TO_HOENN(SLAKING),\n    SPECIES_TO_HOENN(GULPIN),\n    SPECIES_TO_HOENN(SWALOT),\n    SPECIES_TO_HOENN(TROPIUS),\n    SPECIES_TO_HOENN(WHISMUR),\n    SPECIES_TO_HOENN(LOUDRED),\n    SPECIES_TO_HOENN(EXPLOUD),\n    SPECIES_TO_HOENN(CLAMPERL),\n    SPECIES_TO_HOENN(HUNTAIL),\n    SPECIES_TO_HOENN(GOREBYSS),\n    SPECIES_TO_HOENN(ABSOL),\n    SPECIES_TO_HOENN(SHUPPET),\n    SPECIES_TO_HOENN(BANETTE),\n    SPECIES_TO_HOENN(SEVIPER),\n    SPECIES_TO_HOENN(ZANGOOSE),\n    SPECIES_TO_HOENN(RELICANTH),\n    SPECIES_TO_HOENN(ARON),\n    SPECIES_TO_HOENN(LAIRON),\n    SPECIES_TO_HOENN(AGGRON),\n    SPECIES_TO_HOENN(CASTFORM),\n    SPECIES_TO_HOENN(VOLBEAT),\n    SPECIES_TO_HOENN(ILLUMISE),\n    SPECIES_TO_HOENN(LILEEP),\n    SPECIES_TO_HOENN(CRADILY),\n    SPECIES_TO_HOENN(ANORITH),\n    SPECIES_TO_HOENN(ARMALDO),\n    SPECIES_TO_HOENN(RALTS),\n    SPECIES_TO_HOENN(KIRLIA),\n    SPECIES_TO_HOENN(GARDEVOIR),\n    SPECIES_TO_HOENN(BAGON),\n    SPECIES_TO_HOENN(SHELGON),\n    SPECIES_TO_HOENN(SALAMENCE),\n    SPECIES_TO_HOENN(BELDUM),\n    SPECIES_TO_HOENN(METANG),\n    SPECIES_TO_HOENN(METAGROSS),\n    SPECIES_TO_HOENN(REGIROCK),\n    SPECIES_TO_HOENN(REGICE),\n    SPECIES_TO_HOENN(REGISTEEL),\n    SPECIES_TO_HOENN(KYOGRE),\n    SPECIES_TO_HOENN(GROUDON),\n    SPECIES_TO_HOENN(RAYQUAZA),\n    SPECIES_TO_HOENN(LATIAS),\n    SPECIES_TO_HOENN(LATIOS),\n    SPECIES_TO_HOENN(JIRACHI),\n    SPECIES_TO_HOENN(DEOXYS),\n    SPECIES_TO_HOENN(CHIMECHO),\n};\n\n // Assigns all species to the National Dex Index (Summary No. for National Dex)\nstatic const u16 sSpeciesToNationalPokedexNum[NUM_SPECIES - 1] =\n{\n    SPECIES_TO_NATIONAL(BULBASAUR),\n    SPECIES_TO_NATIONAL(IVYSAUR),\n    SPECIES_TO_NATIONAL(VENUSAUR),\n    SPECIES_TO_NATIONAL(CHARMANDER),\n    SPECIES_TO_NATIONAL(CHARMELEON),\n    SPECIES_TO_NATIONAL(CHARIZARD),\n    SPECIES_TO_NATIONAL(SQUIRTLE),\n    SPECIES_TO_NATIONAL(WARTORTLE),\n    SPECIES_TO_NATIONAL(BLASTOISE),\n    SPECIES_TO_NATIONAL(CATERPIE),\n    SPECIES_TO_NATIONAL(METAPOD),\n    SPECIES_TO_NATIONAL(BUTTERFREE),\n    SPECIES_TO_NATIONAL(WEEDLE),\n    SPECIES_TO_NATIONAL(KAKUNA),\n    SPECIES_TO_NATIONAL(BEEDRILL),\n    SPECIES_TO_NATIONAL(PIDGEY),\n    SPECIES_TO_NATIONAL(PIDGEOTTO),\n    SPECIES_TO_NATIONAL(PIDGEOT),\n    SPECIES_TO_NATIONAL(RATTATA),\n    SPECIES_TO_NATIONAL(RATICATE),\n    SPECIES_TO_NATIONAL(SPEAROW),\n    SPECIES_TO_NATIONAL(FEAROW),\n    SPECIES_TO_NATIONAL(EKANS),\n    SPECIES_TO_NATIONAL(ARBOK),\n    SPECIES_TO_NATIONAL(PIKACHU),\n    SPECIES_TO_NATIONAL(RAICHU),\n    SPECIES_TO_NATIONAL(SANDSHREW),\n    SPECIES_TO_NATIONAL(SANDSLASH),\n    SPECIES_TO_NATIONAL(NIDORAN_F),\n    SPECIES_TO_NATIONAL(NIDORINA),\n    SPECIES_TO_NATIONAL(NIDOQUEEN),\n    SPECIES_TO_NATIONAL(NIDORAN_M),\n    SPECIES_TO_NATIONAL(NIDORINO),\n    SPECIES_TO_NATIONAL(NIDOKING),\n    SPECIES_TO_NATIONAL(CLEFAIRY),\n    SPECIES_TO_NATIONAL(CLEFABLE),\n    SPECIES_TO_NATIONAL(VULPIX),\n    SPECIES_TO_NATIONAL(NINETALES),\n    SPECIES_TO_NATIONAL(JIGGLYPUFF),\n    SPECIES_TO_NATIONAL(WIGGLYTUFF),\n    SPECIES_TO_NATIONAL(ZUBAT),\n    SPECIES_TO_NATIONAL(GOLBAT),\n    SPECIES_TO_NATIONAL(ODDISH),\n    SPECIES_TO_NATIONAL(GLOOM),\n    SPECIES_TO_NATIONAL(VILEPLUME),\n    SPECIES_TO_NATIONAL(PARAS),\n    SPECIES_TO_NATIONAL(PARASECT),\n    SPECIES_TO_NATIONAL(VENONAT),\n    SPECIES_TO_NATIONAL(VENOMOTH),\n    SPECIES_TO_NATIONAL(DIGLETT),\n    SPECIES_TO_NATIONAL(DUGTRIO),\n    SPECIES_TO_NATIONAL(MEOWTH),\n    SPECIES_TO_NATIONAL(PERSIAN),\n    SPECIES_TO_NATIONAL(PSYDUCK),\n    SPECIES_TO_NATIONAL(GOLDUCK),\n    SPECIES_TO_NATIONAL(MANKEY),\n    SPECIES_TO_NATIONAL(PRIMEAPE),\n    SPECIES_TO_NATIONAL(GROWLITHE),\n    SPECIES_TO_NATIONAL(ARCANINE),\n    SPECIES_TO_NATIONAL(POLIWAG),\n    SPECIES_TO_NATIONAL(POLIWHIRL),\n    SPECIES_TO_NATIONAL(POLIWRATH),\n    SPECIES_TO_NATIONAL(ABRA),\n    SPECIES_TO_NATIONAL(KADABRA),\n    SPECIES_TO_NATIONAL(ALAKAZAM),\n    SPECIES_TO_NATIONAL(MACHOP),\n    SPECIES_TO_NATIONAL(MACHOKE),\n    SPECIES_TO_NATIONAL(MACHAMP),\n    SPECIES_TO_NATIONAL(BELLSPROUT),\n    SPECIES_TO_NATIONAL(WEEPINBELL),\n    SPECIES_TO_NATIONAL(VICTREEBEL),\n    SPECIES_TO_NATIONAL(TENTACOOL),\n    SPECIES_TO_NATIONAL(TENTACRUEL),\n    SPECIES_TO_NATIONAL(GEODUDE),\n    SPECIES_TO_NATIONAL(GRAVELER),\n    SPECIES_TO_NATIONAL(GOLEM),\n    SPECIES_TO_NATIONAL(PONYTA),\n    SPECIES_TO_NATIONAL(RAPIDASH),\n    SPECIES_TO_NATIONAL(SLOWPOKE),\n    SPECIES_TO_NATIONAL(SLOWBRO),\n    SPECIES_TO_NATIONAL(MAGNEMITE),\n    SPECIES_TO_NATIONAL(MAGNETON),\n    SPECIES_TO_NATIONAL(FARFETCHD),\n    SPECIES_TO_NATIONAL(DODUO),\n    SPECIES_TO_NATIONAL(DODRIO),\n    SPECIES_TO_NATIONAL(SEEL),\n    SPECIES_TO_NATIONAL(DEWGONG),\n    SPECIES_TO_NATIONAL(GRIMER),\n    SPECIES_TO_NATIONAL(MUK),\n    SPECIES_TO_NATIONAL(SHELLDER),\n    SPECIES_TO_NATIONAL(CLOYSTER),\n    SPECIES_TO_NATIONAL(GASTLY),\n    SPECIES_TO_NATIONAL(HAUNTER),\n    SPECIES_TO_NATIONAL(GENGAR),\n    SPECIES_TO_NATIONAL(ONIX),\n    SPECIES_TO_NATIONAL(DROWZEE),\n    SPECIES_TO_NATIONAL(HYPNO),\n    SPECIES_TO_NATIONAL(KRABBY),\n    SPECIES_TO_NATIONAL(KINGLER),\n    SPECIES_TO_NATIONAL(VOLTORB),\n    SPECIES_TO_NATIONAL(ELECTRODE),\n    SPECIES_TO_NATIONAL(EXEGGCUTE),\n    SPECIES_TO_NATIONAL(EXEGGUTOR),\n    SPECIES_TO_NATIONAL(CUBONE),\n    SPECIES_TO_NATIONAL(MAROWAK),\n    SPECIES_TO_NATIONAL(HITMONLEE),\n    SPECIES_TO_NATIONAL(HITMONCHAN),\n    SPECIES_TO_NATIONAL(LICKITUNG),\n    SPECIES_TO_NATIONAL(KOFFING),\n    SPECIES_TO_NATIONAL(WEEZING),\n    SPECIES_TO_NATIONAL(RHYHORN),\n    SPECIES_TO_NATIONAL(RHYDON),\n    SPECIES_TO_NATIONAL(CHANSEY),\n    SPECIES_TO_NATIONAL(TANGELA),\n    SPECIES_TO_NATIONAL(KANGASKHAN),\n    SPECIES_TO_NATIONAL(HORSEA),\n    SPECIES_TO_NATIONAL(SEADRA),\n    SPECIES_TO_NATIONAL(GOLDEEN),\n    SPECIES_TO_NATIONAL(SEAKING),\n    SPECIES_TO_NATIONAL(STARYU),\n    SPECIES_TO_NATIONAL(STARMIE),\n    SPECIES_TO_NATIONAL(MR_MIME),\n    SPECIES_TO_NATIONAL(SCYTHER),\n    SPECIES_TO_NATIONAL(JYNX),\n    SPECIES_TO_NATIONAL(ELECTABUZZ),\n    SPECIES_TO_NATIONAL(MAGMAR),\n    SPECIES_TO_NATIONAL(PINSIR),\n    SPECIES_TO_NATIONAL(TAUROS),\n    SPECIES_TO_NATIONAL(MAGIKARP),\n    SPECIES_TO_NATIONAL(GYARADOS),\n    SPECIES_TO_NATIONAL(LAPRAS),\n    SPECIES_TO_NATIONAL(DITTO),\n    SPECIES_TO_NATIONAL(EEVEE),\n    SPECIES_TO_NATIONAL(VAPOREON),\n    SPECIES_TO_NATIONAL(JOLTEON),\n    SPECIES_TO_NATIONAL(FLAREON),\n    SPECIES_TO_NATIONAL(PORYGON),\n    SPECIES_TO_NATIONAL(OMANYTE),\n    SPECIES_TO_NATIONAL(OMASTAR),\n    SPECIES_TO_NATIONAL(KABUTO),\n    SPECIES_TO_NATIONAL(KABUTOPS),\n    SPECIES_TO_NATIONAL(AERODACTYL),\n    SPECIES_TO_NATIONAL(SNORLAX),\n    SPECIES_TO_NATIONAL(ARTICUNO),\n    SPECIES_TO_NATIONAL(ZAPDOS),\n    SPECIES_TO_NATIONAL(MOLTRES),\n    SPECIES_TO_NATIONAL(DRATINI),\n    SPECIES_TO_NATIONAL(DRAGONAIR),\n    SPECIES_TO_NATIONAL(DRAGONITE),\n    SPECIES_TO_NATIONAL(MEWTWO),\n    SPECIES_TO_NATIONAL(MEW),\n    SPECIES_TO_NATIONAL(CHIKORITA),\n    SPECIES_TO_NATIONAL(BAYLEEF),\n    SPECIES_TO_NATIONAL(MEGANIUM),\n    SPECIES_TO_NATIONAL(CYNDAQUIL),\n    SPECIES_TO_NATIONAL(QUILAVA),\n    SPECIES_TO_NATIONAL(TYPHLOSION),\n    SPECIES_TO_NATIONAL(TOTODILE),\n    SPECIES_TO_NATIONAL(CROCONAW),\n    SPECIES_TO_NATIONAL(FERALIGATR),\n    SPECIES_TO_NATIONAL(SENTRET),\n    SPECIES_TO_NATIONAL(FURRET),\n    SPECIES_TO_NATIONAL(HOOTHOOT),\n    SPECIES_TO_NATIONAL(NOCTOWL),\n    SPECIES_TO_NATIONAL(LEDYBA),\n    SPECIES_TO_NATIONAL(LEDIAN),\n    SPECIES_TO_NATIONAL(SPINARAK),\n    SPECIES_TO_NATIONAL(ARIADOS),\n    SPECIES_TO_NATIONAL(CROBAT),\n    SPECIES_TO_NATIONAL(CHINCHOU),\n    SPECIES_TO_NATIONAL(LANTURN),\n    SPECIES_TO_NATIONAL(PICHU),\n    SPECIES_TO_NATIONAL(CLEFFA),\n    SPECIES_TO_NATIONAL(IGGLYBUFF),\n    SPECIES_TO_NATIONAL(TOGEPI),\n    SPECIES_TO_NATIONAL(TOGETIC),\n    SPECIES_TO_NATIONAL(NATU),\n    SPECIES_TO_NATIONAL(XATU),\n    SPECIES_TO_NATIONAL(MAREEP),\n    SPECIES_TO_NATIONAL(FLAAFFY),\n    SPECIES_TO_NATIONAL(AMPHAROS),\n    SPECIES_TO_NATIONAL(BELLOSSOM),\n    SPECIES_TO_NATIONAL(MARILL),\n    SPECIES_TO_NATIONAL(AZUMARILL),\n    SPECIES_TO_NATIONAL(SUDOWOODO),\n    SPECIES_TO_NATIONAL(POLITOED),\n    SPECIES_TO_NATIONAL(HOPPIP),\n    SPECIES_TO_NATIONAL(SKIPLOOM),\n    SPECIES_TO_NATIONAL(JUMPLUFF),\n    SPECIES_TO_NATIONAL(AIPOM),\n    SPECIES_TO_NATIONAL(SUNKERN),\n    SPECIES_TO_NATIONAL(SUNFLORA),\n    SPECIES_TO_NATIONAL(YANMA),\n    SPECIES_TO_NATIONAL(WOOPER),\n    SPECIES_TO_NATIONAL(QUAGSIRE),\n    SPECIES_TO_NATIONAL(ESPEON),\n    SPECIES_TO_NATIONAL(UMBREON),\n    SPECIES_TO_NATIONAL(MURKROW),\n    SPECIES_TO_NATIONAL(SLOWKING),\n    SPECIES_TO_NATIONAL(MISDREAVUS),\n    SPECIES_TO_NATIONAL(UNOWN),\n    SPECIES_TO_NATIONAL(WOBBUFFET),\n    SPECIES_TO_NATIONAL(GIRAFARIG),\n    SPECIES_TO_NATIONAL(PINECO),\n    SPECIES_TO_NATIONAL(FORRETRESS),\n    SPECIES_TO_NATIONAL(DUNSPARCE),\n    SPECIES_TO_NATIONAL(GLIGAR),\n    SPECIES_TO_NATIONAL(STEELIX),\n    SPECIES_TO_NATIONAL(SNUBBULL),\n    SPECIES_TO_NATIONAL(GRANBULL),\n    SPECIES_TO_NATIONAL(QWILFISH),\n    SPECIES_TO_NATIONAL(SCIZOR),\n    SPECIES_TO_NATIONAL(SHUCKLE),\n    SPECIES_TO_NATIONAL(HERACROSS),\n    SPECIES_TO_NATIONAL(SNEASEL),\n    SPECIES_TO_NATIONAL(TEDDIURSA),\n    SPECIES_TO_NATIONAL(URSARING),\n    SPECIES_TO_NATIONAL(SLUGMA),\n    SPECIES_TO_NATIONAL(MAGCARGO),\n    SPECIES_TO_NATIONAL(SWINUB),\n    SPECIES_TO_NATIONAL(PILOSWINE),\n    SPECIES_TO_NATIONAL(CORSOLA),\n    SPECIES_TO_NATIONAL(REMORAID),\n    SPECIES_TO_NATIONAL(OCTILLERY),\n    SPECIES_TO_NATIONAL(DELIBIRD),\n    SPECIES_TO_NATIONAL(MANTINE),\n    SPECIES_TO_NATIONAL(SKARMORY),\n    SPECIES_TO_NATIONAL(HOUNDOUR),\n    SPECIES_TO_NATIONAL(HOUNDOOM),\n    SPECIES_TO_NATIONAL(KINGDRA),\n    SPECIES_TO_NATIONAL(PHANPY),\n    SPECIES_TO_NATIONAL(DONPHAN),\n    SPECIES_TO_NATIONAL(PORYGON2),\n    SPECIES_TO_NATIONAL(STANTLER),\n    SPECIES_TO_NATIONAL(SMEARGLE),\n    SPECIES_TO_NATIONAL(TYROGUE),\n    SPECIES_TO_NATIONAL(HITMONTOP),\n    SPECIES_TO_NATIONAL(SMOOCHUM),\n    SPECIES_TO_NATIONAL(ELEKID),\n    SPECIES_TO_NATIONAL(MAGBY),\n    SPECIES_TO_NATIONAL(MILTANK),\n    SPECIES_TO_NATIONAL(BLISSEY),\n    SPECIES_TO_NATIONAL(RAIKOU),\n    SPECIES_TO_NATIONAL(ENTEI),\n    SPECIES_TO_NATIONAL(SUICUNE),\n    SPECIES_TO_NATIONAL(LARVITAR),\n    SPECIES_TO_NATIONAL(PUPITAR),\n    SPECIES_TO_NATIONAL(TYRANITAR),\n    SPECIES_TO_NATIONAL(LUGIA),\n    SPECIES_TO_NATIONAL(HO_OH),\n    SPECIES_TO_NATIONAL(CELEBI),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_B),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_C),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_D),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_E),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_F),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_G),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_H),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_I),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_J),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_K),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_L),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_M),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_N),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_O),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_P),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_Q),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_R),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_S),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_T),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_U),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_V),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_W),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_X),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_Y),\n    SPECIES_TO_NATIONAL(OLD_UNOWN_Z),\n    SPECIES_TO_NATIONAL(TREECKO),\n    SPECIES_TO_NATIONAL(GROVYLE),\n    SPECIES_TO_NATIONAL(SCEPTILE),\n    SPECIES_TO_NATIONAL(TORCHIC),\n    SPECIES_TO_NATIONAL(COMBUSKEN),\n    SPECIES_TO_NATIONAL(BLAZIKEN),\n    SPECIES_TO_NATIONAL(MUDKIP),\n    SPECIES_TO_NATIONAL(MARSHTOMP),\n    SPECIES_TO_NATIONAL(SWAMPERT),\n    SPECIES_TO_NATIONAL(POOCHYENA),\n    SPECIES_TO_NATIONAL(MIGHTYENA),\n    SPECIES_TO_NATIONAL(ZIGZAGOON),\n    SPECIES_TO_NATIONAL(LINOONE),\n    SPECIES_TO_NATIONAL(WURMPLE),\n    SPECIES_TO_NATIONAL(SILCOON),\n    SPECIES_TO_NATIONAL(BEAUTIFLY),\n    SPECIES_TO_NATIONAL(CASCOON),\n    SPECIES_TO_NATIONAL(DUSTOX),\n    SPECIES_TO_NATIONAL(LOTAD),\n    SPECIES_TO_NATIONAL(LOMBRE),\n    SPECIES_TO_NATIONAL(LUDICOLO),\n    SPECIES_TO_NATIONAL(SEEDOT),\n    SPECIES_TO_NATIONAL(NUZLEAF),\n    SPECIES_TO_NATIONAL(SHIFTRY),\n    SPECIES_TO_NATIONAL(NINCADA),\n    SPECIES_TO_NATIONAL(NINJASK),\n    SPECIES_TO_NATIONAL(SHEDINJA),\n    SPECIES_TO_NATIONAL(TAILLOW),\n    SPECIES_TO_NATIONAL(SWELLOW),\n    SPECIES_TO_NATIONAL(SHROOMISH),\n    SPECIES_TO_NATIONAL(BRELOOM),\n    SPECIES_TO_NATIONAL(SPINDA),\n    SPECIES_TO_NATIONAL(WINGULL),\n    SPECIES_TO_NATIONAL(PELIPPER),\n    SPECIES_TO_NATIONAL(SURSKIT),\n    SPECIES_TO_NATIONAL(MASQUERAIN),\n    SPECIES_TO_NATIONAL(WAILMER),\n    SPECIES_TO_NATIONAL(WAILORD),\n    SPECIES_TO_NATIONAL(SKITTY),\n    SPECIES_TO_NATIONAL(DELCATTY),\n    SPECIES_TO_NATIONAL(KECLEON),\n    SPECIES_TO_NATIONAL(BALTOY),\n    SPECIES_TO_NATIONAL(CLAYDOL),\n    SPECIES_TO_NATIONAL(NOSEPASS),\n    SPECIES_TO_NATIONAL(TORKOAL),\n    SPECIES_TO_NATIONAL(SABLEYE),\n    SPECIES_TO_NATIONAL(BARBOACH),\n    SPECIES_TO_NATIONAL(WHISCASH),\n    SPECIES_TO_NATIONAL(LUVDISC),\n    SPECIES_TO_NATIONAL(CORPHISH),\n    SPECIES_TO_NATIONAL(CRAWDAUNT),\n    SPECIES_TO_NATIONAL(FEEBAS),\n    SPECIES_TO_NATIONAL(MILOTIC),\n    SPECIES_TO_NATIONAL(CARVANHA),\n    SPECIES_TO_NATIONAL(SHARPEDO),\n    SPECIES_TO_NATIONAL(TRAPINCH),\n    SPECIES_TO_NATIONAL(VIBRAVA),\n    SPECIES_TO_NATIONAL(FLYGON),\n    SPECIES_TO_NATIONAL(MAKUHITA),\n    SPECIES_TO_NATIONAL(HARIYAMA),\n    SPECIES_TO_NATIONAL(ELECTRIKE),\n    SPECIES_TO_NATIONAL(MANECTRIC),\n    SPECIES_TO_NATIONAL(NUMEL),\n    SPECIES_TO_NATIONAL(CAMERUPT),\n    SPECIES_TO_NATIONAL(SPHEAL),\n    SPECIES_TO_NATIONAL(SEALEO),\n    SPECIES_TO_NATIONAL(WALREIN),\n    SPECIES_TO_NATIONAL(CACNEA),\n    SPECIES_TO_NATIONAL(CACTURNE),\n    SPECIES_TO_NATIONAL(SNORUNT),\n    SPECIES_TO_NATIONAL(GLALIE),\n    SPECIES_TO_NATIONAL(LUNATONE),\n    SPECIES_TO_NATIONAL(SOLROCK),\n    SPECIES_TO_NATIONAL(AZURILL),\n    SPECIES_TO_NATIONAL(SPOINK),\n    SPECIES_TO_NATIONAL(GRUMPIG),\n    SPECIES_TO_NATIONAL(PLUSLE),\n    SPECIES_TO_NATIONAL(MINUN),\n    SPECIES_TO_NATIONAL(MAWILE),\n    SPECIES_TO_NATIONAL(MEDITITE),\n    SPECIES_TO_NATIONAL(MEDICHAM),\n    SPECIES_TO_NATIONAL(SWABLU),\n    SPECIES_TO_NATIONAL(ALTARIA),\n    SPECIES_TO_NATIONAL(WYNAUT),\n    SPECIES_TO_NATIONAL(DUSKULL),\n    SPECIES_TO_NATIONAL(DUSCLOPS),\n    SPECIES_TO_NATIONAL(ROSELIA),\n    SPECIES_TO_NATIONAL(SLAKOTH),\n    SPECIES_TO_NATIONAL(VIGOROTH),\n    SPECIES_TO_NATIONAL(SLAKING),\n    SPECIES_TO_NATIONAL(GULPIN),\n    SPECIES_TO_NATIONAL(SWALOT),\n    SPECIES_TO_NATIONAL(TROPIUS),\n    SPECIES_TO_NATIONAL(WHISMUR),\n    SPECIES_TO_NATIONAL(LOUDRED),\n    SPECIES_TO_NATIONAL(EXPLOUD),\n    SPECIES_TO_NATIONAL(CLAMPERL),\n    SPECIES_TO_NATIONAL(HUNTAIL),\n    SPECIES_TO_NATIONAL(GOREBYSS),\n    SPECIES_TO_NATIONAL(ABSOL),\n    SPECIES_TO_NATIONAL(SHUPPET),\n    SPECIES_TO_NATIONAL(BANETTE),\n    SPECIES_TO_NATIONAL(SEVIPER),\n    SPECIES_TO_NATIONAL(ZANGOOSE),\n    SPECIES_TO_NATIONAL(RELICANTH),\n    SPECIES_TO_NATIONAL(ARON),\n    SPECIES_TO_NATIONAL(LAIRON),\n    SPECIES_TO_NATIONAL(AGGRON),\n    SPECIES_TO_NATIONAL(CASTFORM),\n    SPECIES_TO_NATIONAL(VOLBEAT),\n    SPECIES_TO_NATIONAL(ILLUMISE),\n    SPECIES_TO_NATIONAL(LILEEP),\n    SPECIES_TO_NATIONAL(CRADILY),\n    SPECIES_TO_NATIONAL(ANORITH),\n    SPECIES_TO_NATIONAL(ARMALDO),\n    SPECIES_TO_NATIONAL(RALTS),\n    SPECIES_TO_NATIONAL(KIRLIA),\n    SPECIES_TO_NATIONAL(GARDEVOIR),\n    SPECIES_TO_NATIONAL(BAGON),\n    SPECIES_TO_NATIONAL(SHELGON),\n    SPECIES_TO_NATIONAL(SALAMENCE),\n    SPECIES_TO_NATIONAL(BELDUM),\n    SPECIES_TO_NATIONAL(METANG),\n    SPECIES_TO_NATIONAL(METAGROSS),\n    SPECIES_TO_NATIONAL(REGIROCK),\n    SPECIES_TO_NATIONAL(REGICE),\n    SPECIES_TO_NATIONAL(REGISTEEL),\n    SPECIES_TO_NATIONAL(KYOGRE),\n    SPECIES_TO_NATIONAL(GROUDON),\n    SPECIES_TO_NATIONAL(RAYQUAZA),\n    SPECIES_TO_NATIONAL(LATIAS),\n    SPECIES_TO_NATIONAL(LATIOS),\n    SPECIES_TO_NATIONAL(JIRACHI),\n    SPECIES_TO_NATIONAL(DEOXYS),\n    SPECIES_TO_NATIONAL(CHIMECHO),\n};\n\nstatic const u16 sSpeciesToExtendedPokedexNum[] = // Assigns all species to the Extended Dex Index (Summary No. for Extended Dex)\n{\n    SPECIES_TO_EXTENDED(BULBASAUR),\n    SPECIES_TO_EXTENDED(IVYSAUR),\n    SPECIES_TO_EXTENDED(VENUSAUR),\n    SPECIES_TO_EXTENDED(CHARMANDER),\n    SPECIES_TO_EXTENDED(CHARMELEON),\n    SPECIES_TO_EXTENDED(CHARIZARD),\n    SPECIES_TO_EXTENDED(SQUIRTLE),\n    SPECIES_TO_EXTENDED(WARTORTLE),\n    SPECIES_TO_EXTENDED(BLASTOISE),\n    SPECIES_TO_EXTENDED(CATERPIE),\n    SPECIES_TO_EXTENDED(METAPOD),\n    SPECIES_TO_EXTENDED(BUTTERFREE),\n    SPECIES_TO_EXTENDED(WEEDLE),\n    SPECIES_TO_EXTENDED(KAKUNA),\n    SPECIES_TO_EXTENDED(BEEDRILL),\n    SPECIES_TO_EXTENDED(PIDGEY),\n    SPECIES_TO_EXTENDED(PIDGEOTTO),\n    SPECIES_TO_EXTENDED(PIDGEOT),\n    SPECIES_TO_EXTENDED(RATTATA),\n    SPECIES_TO_EXTENDED(RATICATE),\n    SPECIES_TO_EXTENDED(SPEAROW),\n    SPECIES_TO_EXTENDED(FEAROW),\n    SPECIES_TO_EXTENDED(EKANS),\n    SPECIES_TO_EXTENDED(ARBOK),\n    SPECIES_TO_EXTENDED(PIKACHU),\n    SPECIES_TO_EXTENDED(RAICHU),\n    SPECIES_TO_EXTENDED(SANDSHREW),\n    SPECIES_TO_EXTENDED(SANDSLASH),\n    SPECIES_TO_EXTENDED(NIDORAN_F),\n    SPECIES_TO_EXTENDED(NIDORINA),\n    SPECIES_TO_EXTENDED(NIDOQUEEN),\n    SPECIES_TO_EXTENDED(NIDORAN_M),\n    SPECIES_TO_EXTENDED(NIDORINO),\n    SPECIES_TO_EXTENDED(NIDOKING),\n    SPECIES_TO_EXTENDED(CLEFAIRY),\n    SPECIES_TO_EXTENDED(CLEFABLE),\n    SPECIES_TO_EXTENDED(VULPIX),\n    SPECIES_TO_EXTENDED(NINETALES),\n    SPECIES_TO_EXTENDED(JIGGLYPUFF),\n    SPECIES_TO_EXTENDED(WIGGLYTUFF),\n    SPECIES_TO_EXTENDED(ZUBAT),\n    SPECIES_TO_EXTENDED(GOLBAT),\n    SPECIES_TO_EXTENDED(ODDISH),\n    SPECIES_TO_EXTENDED(GLOOM),\n    SPECIES_TO_EXTENDED(VILEPLUME),\n    SPECIES_TO_EXTENDED(PARAS),\n    SPECIES_TO_EXTENDED(PARASECT),\n    SPECIES_TO_EXTENDED(VENONAT),\n    SPECIES_TO_EXTENDED(VENOMOTH),\n    SPECIES_TO_EXTENDED(DIGLETT),\n    SPECIES_TO_EXTENDED(DUGTRIO),\n    SPECIES_TO_EXTENDED(MEOWTH),\n    SPECIES_TO_EXTENDED(PERSIAN),\n    SPECIES_TO_EXTENDED(PSYDUCK),\n    SPECIES_TO_EXTENDED(GOLDUCK),\n    SPECIES_TO_EXTENDED(MANKEY),\n    SPECIES_TO_EXTENDED(PRIMEAPE),\n    SPECIES_TO_EXTENDED(GROWLITHE),\n    SPECIES_TO_EXTENDED(ARCANINE),\n    SPECIES_TO_EXTENDED(POLIWAG),\n    SPECIES_TO_EXTENDED(POLIWHIRL),\n    SPECIES_TO_EXTENDED(POLIWRATH),\n    SPECIES_TO_EXTENDED(ABRA),\n    SPECIES_TO_EXTENDED(KADABRA),\n    SPECIES_TO_EXTENDED(ALAKAZAM),\n    SPECIES_TO_EXTENDED(MACHOP),\n    SPECIES_TO_EXTENDED(MACHOKE),\n    SPECIES_TO_EXTENDED(MACHAMP),\n    SPECIES_TO_EXTENDED(BELLSPROUT),\n    SPECIES_TO_EXTENDED(WEEPINBELL),\n    SPECIES_TO_EXTENDED(VICTREEBEL),\n    SPECIES_TO_EXTENDED(TENTACOOL),\n    SPECIES_TO_EXTENDED(TENTACRUEL),\n    SPECIES_TO_EXTENDED(GEODUDE),\n    SPECIES_TO_EXTENDED(GRAVELER),\n    SPECIES_TO_EXTENDED(GOLEM),\n    SPECIES_TO_EXTENDED(PONYTA),\n    SPECIES_TO_EXTENDED(RAPIDASH),\n    SPECIES_TO_EXTENDED(SLOWPOKE),\n    SPECIES_TO_EXTENDED(SLOWBRO),\n    SPECIES_TO_EXTENDED(MAGNEMITE),\n    SPECIES_TO_EXTENDED(MAGNETON),\n    SPECIES_TO_EXTENDED(FARFETCHD),\n    SPECIES_TO_EXTENDED(DODUO),\n    SPECIES_TO_EXTENDED(DODRIO),\n    SPECIES_TO_EXTENDED(SEEL),\n    SPECIES_TO_EXTENDED(DEWGONG),\n    SPECIES_TO_EXTENDED(GRIMER),\n    SPECIES_TO_EXTENDED(MUK),\n    SPECIES_TO_EXTENDED(SHELLDER),\n    SPECIES_TO_EXTENDED(CLOYSTER),\n    SPECIES_TO_EXTENDED(GASTLY),\n    SPECIES_TO_EXTENDED(HAUNTER),\n    SPECIES_TO_EXTENDED(GENGAR),\n    SPECIES_TO_EXTENDED(ONIX),\n    SPECIES_TO_EXTENDED(DROWZEE),\n    SPECIES_TO_EXTENDED(HYPNO),\n    SPECIES_TO_EXTENDED(KRABBY),\n    SPECIES_TO_EXTENDED(KINGLER),\n    SPECIES_TO_EXTENDED(VOLTORB),\n    SPECIES_TO_EXTENDED(ELECTRODE),\n    SPECIES_TO_EXTENDED(EXEGGCUTE),\n    SPECIES_TO_EXTENDED(EXEGGUTOR),\n    SPECIES_TO_EXTENDED(CUBONE),\n    SPECIES_TO_EXTENDED(MAROWAK),\n    SPECIES_TO_EXTENDED(HITMONLEE),\n    SPECIES_TO_EXTENDED(HITMONCHAN),\n    SPECIES_TO_EXTENDED(LICKITUNG),\n    SPECIES_TO_EXTENDED(KOFFING),\n    SPECIES_TO_EXTENDED(WEEZING),\n    SPECIES_TO_EXTENDED(RHYHORN),\n    SPECIES_TO_EXTENDED(RHYDON),\n    SPECIES_TO_EXTENDED(CHANSEY),\n    SPECIES_TO_EXTENDED(TANGELA),\n    SPECIES_TO_EXTENDED(KANGASKHAN),\n    SPECIES_TO_EXTENDED(HORSEA),\n    SPECIES_TO_EXTENDED(SEADRA),\n    SPECIES_TO_EXTENDED(GOLDEEN),\n    SPECIES_TO_EXTENDED(SEAKING),\n    SPECIES_TO_EXTENDED(STARYU),\n    SPECIES_TO_EXTENDED(STARMIE),\n    SPECIES_TO_EXTENDED(MR_MIME),\n    SPECIES_TO_EXTENDED(SCYTHER),\n    SPECIES_TO_EXTENDED(JYNX),\n    SPECIES_TO_EXTENDED(ELECTABUZZ),\n    SPECIES_TO_EXTENDED(MAGMAR),\n    SPECIES_TO_EXTENDED(PINSIR),\n    SPECIES_TO_EXTENDED(TAUROS),\n    SPECIES_TO_EXTENDED(MAGIKARP),\n    SPECIES_TO_EXTENDED(GYARADOS),\n    SPECIES_TO_EXTENDED(LAPRAS),\n    SPECIES_TO_EXTENDED(DITTO),\n    SPECIES_TO_EXTENDED(EEVEE),\n    SPECIES_TO_EXTENDED(VAPOREON),\n    SPECIES_TO_EXTENDED(JOLTEON),\n    SPECIES_TO_EXTENDED(FLAREON),\n    SPECIES_TO_EXTENDED(PORYGON),\n    SPECIES_TO_EXTENDED(OMANYTE),\n    SPECIES_TO_EXTENDED(OMASTAR),\n    SPECIES_TO_EXTENDED(KABUTO),\n    SPECIES_TO_EXTENDED(KABUTOPS),\n    SPECIES_TO_EXTENDED(AERODACTYL),\n    SPECIES_TO_EXTENDED(SNORLAX),\n    SPECIES_TO_EXTENDED(ARTICUNO),\n    SPECIES_TO_EXTENDED(ZAPDOS),\n    SPECIES_TO_EXTENDED(MOLTRES),\n    SPECIES_TO_EXTENDED(DRATINI),\n    SPECIES_TO_EXTENDED(DRAGONAIR),\n    SPECIES_TO_EXTENDED(DRAGONITE),\n    SPECIES_TO_EXTENDED(MEWTWO),\n    SPECIES_TO_EXTENDED(MEW),\n    SPECIES_TO_EXTENDED(CHIKORITA),\n    SPECIES_TO_EXTENDED(BAYLEEF),\n    SPECIES_TO_EXTENDED(MEGANIUM),\n    SPECIES_TO_EXTENDED(CYNDAQUIL),\n    SPECIES_TO_EXTENDED(QUILAVA),\n    SPECIES_TO_EXTENDED(TYPHLOSION),\n    SPECIES_TO_EXTENDED(TOTODILE),\n    SPECIES_TO_EXTENDED(CROCONAW),\n    SPECIES_TO_EXTENDED(FERALIGATR),\n    SPECIES_TO_EXTENDED(SENTRET),\n    SPECIES_TO_EXTENDED(FURRET),\n    SPECIES_TO_EXTENDED(HOOTHOOT),\n    SPECIES_TO_EXTENDED(NOCTOWL),\n    SPECIES_TO_EXTENDED(LEDYBA),\n    SPECIES_TO_EXTENDED(LEDIAN),\n    SPECIES_TO_EXTENDED(SPINARAK),\n    SPECIES_TO_EXTENDED(ARIADOS),\n    SPECIES_TO_EXTENDED(CROBAT),\n    SPECIES_TO_EXTENDED(CHINCHOU),\n    SPECIES_TO_EXTENDED(LANTURN),\n    SPECIES_TO_EXTENDED(PICHU),\n    SPECIES_TO_EXTENDED(CLEFFA),\n    SPECIES_TO_EXTENDED(IGGLYBUFF),\n    SPECIES_TO_EXTENDED(TOGEPI),\n    SPECIES_TO_EXTENDED(TOGETIC),\n    SPECIES_TO_EXTENDED(NATU),\n    SPECIES_TO_EXTENDED(XATU),\n    SPECIES_TO_EXTENDED(MAREEP),\n    SPECIES_TO_EXTENDED(FLAAFFY),\n    SPECIES_TO_EXTENDED(AMPHAROS),\n    SPECIES_TO_EXTENDED(BELLOSSOM),\n    SPECIES_TO_EXTENDED(MARILL),\n    SPECIES_TO_EXTENDED(AZUMARILL),\n    SPECIES_TO_EXTENDED(SUDOWOODO),\n    SPECIES_TO_EXTENDED(POLITOED),\n    SPECIES_TO_EXTENDED(HOPPIP),\n    SPECIES_TO_EXTENDED(SKIPLOOM),\n    SPECIES_TO_EXTENDED(JUMPLUFF),\n    SPECIES_TO_EXTENDED(AIPOM),\n    SPECIES_TO_EXTENDED(SUNKERN),\n    SPECIES_TO_EXTENDED(SUNFLORA),\n    SPECIES_TO_EXTENDED(YANMA),\n    SPECIES_TO_EXTENDED(WOOPER),\n    SPECIES_TO_EXTENDED(QUAGSIRE),\n    SPECIES_TO_EXTENDED(ESPEON),\n    SPECIES_TO_EXTENDED(UMBREON),\n    SPECIES_TO_EXTENDED(MURKROW),\n    SPECIES_TO_EXTENDED(SLOWKING),\n    SPECIES_TO_EXTENDED(MISDREAVUS),\n    SPECIES_TO_EXTENDED(UNOWN),\n    SPECIES_TO_EXTENDED(WOBBUFFET),\n    SPECIES_TO_EXTENDED(GIRAFARIG),\n    SPECIES_TO_EXTENDED(PINECO),\n    SPECIES_TO_EXTENDED(FORRETRESS),\n    SPECIES_TO_EXTENDED(DUNSPARCE),\n    SPECIES_TO_EXTENDED(GLIGAR),\n    SPECIES_TO_EXTENDED(STEELIX),\n    SPECIES_TO_EXTENDED(SNUBBULL),\n    SPECIES_TO_EXTENDED(GRANBULL),\n    SPECIES_TO_EXTENDED(QWILFISH),\n    SPECIES_TO_EXTENDED(SCIZOR),\n    SPECIES_TO_EXTENDED(SHUCKLE),\n    SPECIES_TO_EXTENDED(HERACROSS),\n    SPECIES_TO_EXTENDED(SNEASEL),\n    SPECIES_TO_EXTENDED(TEDDIURSA),\n    SPECIES_TO_EXTENDED(URSARING),\n    SPECIES_TO_EXTENDED(SLUGMA),\n    SPECIES_TO_EXTENDED(MAGCARGO),\n    SPECIES_TO_EXTENDED(SWINUB),\n    SPECIES_TO_EXTENDED(PILOSWINE),\n    SPECIES_TO_EXTENDED(CORSOLA),\n    SPECIES_TO_EXTENDED(REMORAID),\n    SPECIES_TO_EXTENDED(OCTILLERY),\n    SPECIES_TO_EXTENDED(DELIBIRD),\n    SPECIES_TO_EXTENDED(MANTINE),\n    SPECIES_TO_EXTENDED(SKARMORY),\n    SPECIES_TO_EXTENDED(HOUNDOUR),\n    SPECIES_TO_EXTENDED(HOUNDOOM),\n    SPECIES_TO_EXTENDED(KINGDRA),\n    SPECIES_TO_EXTENDED(PHANPY),\n    SPECIES_TO_EXTENDED(DONPHAN),\n    SPECIES_TO_EXTENDED(PORYGON2),\n    SPECIES_TO_EXTENDED(STANTLER),\n    SPECIES_TO_EXTENDED(SMEARGLE),\n    SPECIES_TO_EXTENDED(TYROGUE),\n    SPECIES_TO_EXTENDED(HITMONTOP),\n    SPECIES_TO_EXTENDED(SMOOCHUM),\n    SPECIES_TO_EXTENDED(ELEKID),\n    SPECIES_TO_EXTENDED(MAGBY),\n    SPECIES_TO_EXTENDED(MILTANK),\n    SPECIES_TO_EXTENDED(BLISSEY),\n    SPECIES_TO_EXTENDED(RAIKOU),\n    SPECIES_TO_EXTENDED(ENTEI),\n    SPECIES_TO_EXTENDED(SUICUNE),\n    SPECIES_TO_EXTENDED(LARVITAR),\n    SPECIES_TO_EXTENDED(PUPITAR),\n    SPECIES_TO_EXTENDED(TYRANITAR),\n    SPECIES_TO_EXTENDED(LUGIA),\n    SPECIES_TO_EXTENDED(HO_OH),\n    SPECIES_TO_EXTENDED(CELEBI),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_B),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_C),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_D),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_E),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_F),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_G),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_H),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_I),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_J),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_K),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_L),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_M),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_N),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_O),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_P),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_Q),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_R),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_S),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_T),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_U),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_V),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_W),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_X),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_Y),\n    SPECIES_TO_EXTENDED(OLD_UNOWN_Z),\n    SPECIES_TO_EXTENDED(TREECKO),\n    SPECIES_TO_EXTENDED(GROVYLE),\n    SPECIES_TO_EXTENDED(SCEPTILE),\n    SPECIES_TO_EXTENDED(TORCHIC),\n    SPECIES_TO_EXTENDED(COMBUSKEN),\n    SPECIES_TO_EXTENDED(BLAZIKEN),\n    SPECIES_TO_EXTENDED(MUDKIP),\n    SPECIES_TO_EXTENDED(MARSHTOMP),\n    SPECIES_TO_EXTENDED(SWAMPERT),\n    SPECIES_TO_EXTENDED(POOCHYENA),\n    SPECIES_TO_EXTENDED(MIGHTYENA),\n    SPECIES_TO_EXTENDED(ZIGZAGOON),\n    SPECIES_TO_EXTENDED(LINOONE),\n    SPECIES_TO_EXTENDED(WURMPLE),\n    SPECIES_TO_EXTENDED(SILCOON),\n    SPECIES_TO_EXTENDED(BEAUTIFLY),\n    SPECIES_TO_EXTENDED(CASCOON),\n    SPECIES_TO_EXTENDED(DUSTOX),\n    SPECIES_TO_EXTENDED(LOTAD),\n    SPECIES_TO_EXTENDED(LOMBRE),\n    SPECIES_TO_EXTENDED(LUDICOLO),\n    SPECIES_TO_EXTENDED(SEEDOT),\n    SPECIES_TO_EXTENDED(NUZLEAF),\n    SPECIES_TO_EXTENDED(SHIFTRY),\n    SPECIES_TO_EXTENDED(NINCADA),\n    SPECIES_TO_EXTENDED(NINJASK),\n    SPECIES_TO_EXTENDED(SHEDINJA),\n    SPECIES_TO_EXTENDED(TAILLOW),\n    SPECIES_TO_EXTENDED(SWELLOW),\n    SPECIES_TO_EXTENDED(SHROOMISH),\n    SPECIES_TO_EXTENDED(BRELOOM),\n    SPECIES_TO_EXTENDED(SPINDA),\n    SPECIES_TO_EXTENDED(WINGULL),\n    SPECIES_TO_EXTENDED(PELIPPER),\n    SPECIES_TO_EXTENDED(SURSKIT),\n    SPECIES_TO_EXTENDED(MASQUERAIN),\n    SPECIES_TO_EXTENDED(WAILMER),\n    SPECIES_TO_EXTENDED(WAILORD),\n    SPECIES_TO_EXTENDED(SKITTY),\n    SPECIES_TO_EXTENDED(DELCATTY),\n    SPECIES_TO_EXTENDED(KECLEON),\n    SPECIES_TO_EXTENDED(BALTOY),\n    SPECIES_TO_EXTENDED(CLAYDOL),\n    SPECIES_TO_EXTENDED(NOSEPASS),\n    SPECIES_TO_EXTENDED(TORKOAL),\n    SPECIES_TO_EXTENDED(SABLEYE),\n    SPECIES_TO_EXTENDED(BARBOACH),\n    SPECIES_TO_EXTENDED(WHISCASH),\n    SPECIES_TO_EXTENDED(LUVDISC),\n    SPECIES_TO_EXTENDED(CORPHISH),\n    SPECIES_TO_EXTENDED(CRAWDAUNT),\n    SPECIES_TO_EXTENDED(FEEBAS),\n    SPECIES_TO_EXTENDED(MILOTIC),\n    SPECIES_TO_EXTENDED(CARVANHA),\n    SPECIES_TO_EXTENDED(SHARPEDO),\n    SPECIES_TO_EXTENDED(TRAPINCH),\n    SPECIES_TO_EXTENDED(VIBRAVA),\n    SPECIES_TO_EXTENDED(FLYGON),\n    SPECIES_TO_EXTENDED(MAKUHITA),\n    SPECIES_TO_EXTENDED(HARIYAMA),\n    SPECIES_TO_EXTENDED(ELECTRIKE),\n    SPECIES_TO_EXTENDED(MANECTRIC),\n    SPECIES_TO_EXTENDED(NUMEL),\n    SPECIES_TO_EXTENDED(CAMERUPT),\n    SPECIES_TO_EXTENDED(SPHEAL),\n    SPECIES_TO_EXTENDED(SEALEO),\n    SPECIES_TO_EXTENDED(WALREIN),\n    SPECIES_TO_EXTENDED(CACNEA),\n    SPECIES_TO_EXTENDED(CACTURNE),\n    SPECIES_TO_EXTENDED(SNORUNT),\n    SPECIES_TO_EXTENDED(GLALIE),\n    SPECIES_TO_EXTENDED(LUNATONE),\n    SPECIES_TO_EXTENDED(SOLROCK),\n    SPECIES_TO_EXTENDED(AZURILL),\n    SPECIES_TO_EXTENDED(SPOINK),\n    SPECIES_TO_EXTENDED(GRUMPIG),\n    SPECIES_TO_EXTENDED(PLUSLE),\n    SPECIES_TO_EXTENDED(MINUN),\n    SPECIES_TO_EXTENDED(MAWILE),\n    SPECIES_TO_EXTENDED(MEDITITE),\n    SPECIES_TO_EXTENDED(MEDICHAM),\n    SPECIES_TO_EXTENDED(SWABLU),\n    SPECIES_TO_EXTENDED(ALTARIA),\n    SPECIES_TO_EXTENDED(WYNAUT),\n    SPECIES_TO_EXTENDED(DUSKULL),\n    SPECIES_TO_EXTENDED(DUSCLOPS),\n    SPECIES_TO_EXTENDED(ROSELIA),\n    SPECIES_TO_EXTENDED(SLAKOTH),\n    SPECIES_TO_EXTENDED(VIGOROTH),\n    SPECIES_TO_EXTENDED(SLAKING),\n    SPECIES_TO_EXTENDED(GULPIN),\n    SPECIES_TO_EXTENDED(SWALOT),\n    SPECIES_TO_EXTENDED(TROPIUS),\n    SPECIES_TO_EXTENDED(WHISMUR),\n    SPECIES_TO_EXTENDED(LOUDRED),\n    SPECIES_TO_EXTENDED(EXPLOUD),\n    SPECIES_TO_EXTENDED(CLAMPERL),\n    SPECIES_TO_EXTENDED(HUNTAIL),\n    SPECIES_TO_EXTENDED(GOREBYSS),\n    SPECIES_TO_EXTENDED(ABSOL),\n    SPECIES_TO_EXTENDED(SHUPPET),\n    SPECIES_TO_EXTENDED(BANETTE),\n    SPECIES_TO_EXTENDED(SEVIPER),\n    SPECIES_TO_EXTENDED(ZANGOOSE),\n    SPECIES_TO_EXTENDED(RELICANTH),\n    SPECIES_TO_EXTENDED(ARON),\n    SPECIES_TO_EXTENDED(LAIRON),\n    SPECIES_TO_EXTENDED(AGGRON),\n    SPECIES_TO_EXTENDED(CASTFORM),\n    SPECIES_TO_EXTENDED(VOLBEAT),\n    SPECIES_TO_EXTENDED(ILLUMISE),\n    SPECIES_TO_EXTENDED(LILEEP),\n    SPECIES_TO_EXTENDED(CRADILY),\n    SPECIES_TO_EXTENDED(ANORITH),\n    SPECIES_TO_EXTENDED(ARMALDO),\n    SPECIES_TO_EXTENDED(RALTS),\n    SPECIES_TO_EXTENDED(KIRLIA),\n    SPECIES_TO_EXTENDED(GARDEVOIR),\n    SPECIES_TO_EXTENDED(BAGON),\n    SPECIES_TO_EXTENDED(SHELGON),\n    SPECIES_TO_EXTENDED(SALAMENCE),\n    SPECIES_TO_EXTENDED(BELDUM),\n    SPECIES_TO_EXTENDED(METANG),\n    SPECIES_TO_EXTENDED(METAGROSS),\n    SPECIES_TO_EXTENDED(REGIROCK),\n    SPECIES_TO_EXTENDED(REGICE),\n    SPECIES_TO_EXTENDED(REGISTEEL),\n    SPECIES_TO_EXTENDED(KYOGRE),\n    SPECIES_TO_EXTENDED(GROUDON),\n    SPECIES_TO_EXTENDED(RAYQUAZA),\n    SPECIES_TO_EXTENDED(LATIAS),\n    SPECIES_TO_EXTENDED(LATIOS),\n    SPECIES_TO_EXTENDED(JIRACHI),\n    SPECIES_TO_EXTENDED(DEOXYS),\n    SPECIES_TO_EXTENDED(CHIMECHO),\n};\n\n// Assigns all Hoenn Dex Indexes to a National Dex Index\nstatic const u16 sHoennToNationalOrder[NUM_SPECIES - 1] =\n{\n    HOENN_TO_NATIONAL(TREECKO),\n    HOENN_TO_NATIONAL(GROVYLE),\n    HOENN_TO_NATIONAL(SCEPTILE),\n    HOENN_TO_NATIONAL(TORCHIC),\n    HOENN_TO_NATIONAL(COMBUSKEN),\n    HOENN_TO_NATIONAL(BLAZIKEN),\n    HOENN_TO_NATIONAL(MUDKIP),\n    HOENN_TO_NATIONAL(MARSHTOMP),\n    HOENN_TO_NATIONAL(SWAMPERT),\n    HOENN_TO_NATIONAL(POOCHYENA),\n    HOENN_TO_NATIONAL(MIGHTYENA),\n    HOENN_TO_NATIONAL(ZIGZAGOON),\n    HOENN_TO_NATIONAL(LINOONE),\n    HOENN_TO_NATIONAL(WURMPLE),\n    HOENN_TO_NATIONAL(SILCOON),\n    HOENN_TO_NATIONAL(BEAUTIFLY),\n    HOENN_TO_NATIONAL(CASCOON),\n    HOENN_TO_NATIONAL(DUSTOX),\n    HOENN_TO_NATIONAL(LOTAD),\n    HOENN_TO_NATIONAL(LOMBRE),\n    HOENN_TO_NATIONAL(LUDICOLO),\n    HOENN_TO_NATIONAL(SEEDOT),\n    HOENN_TO_NATIONAL(NUZLEAF),\n    HOENN_TO_NATIONAL(SHIFTRY),\n    HOENN_TO_NATIONAL(TAILLOW),\n    HOENN_TO_NATIONAL(SWELLOW),\n    HOENN_TO_NATIONAL(WINGULL),\n    HOENN_TO_NATIONAL(PELIPPER),\n    HOENN_TO_NATIONAL(RALTS),\n    HOENN_TO_NATIONAL(KIRLIA),\n    HOENN_TO_NATIONAL(GARDEVOIR),\n    HOENN_TO_NATIONAL(SURSKIT),\n    HOENN_TO_NATIONAL(MASQUERAIN),\n    HOENN_TO_NATIONAL(SHROOMISH),\n    HOENN_TO_NATIONAL(BRELOOM),\n    HOENN_TO_NATIONAL(SLAKOTH),\n    HOENN_TO_NATIONAL(VIGOROTH),\n    HOENN_TO_NATIONAL(SLAKING),\n    HOENN_TO_NATIONAL(ABRA),\n    HOENN_TO_NATIONAL(KADABRA),\n    HOENN_TO_NATIONAL(ALAKAZAM),\n    HOENN_TO_NATIONAL(NINCADA),\n    HOENN_TO_NATIONAL(NINJASK),\n    HOENN_TO_NATIONAL(SHEDINJA),\n    HOENN_TO_NATIONAL(WHISMUR),\n    HOENN_TO_NATIONAL(LOUDRED),\n    HOENN_TO_NATIONAL(EXPLOUD),\n    HOENN_TO_NATIONAL(MAKUHITA),\n    HOENN_TO_NATIONAL(HARIYAMA),\n    HOENN_TO_NATIONAL(GOLDEEN),\n    HOENN_TO_NATIONAL(SEAKING),\n    HOENN_TO_NATIONAL(MAGIKARP),\n    HOENN_TO_NATIONAL(GYARADOS),\n    HOENN_TO_NATIONAL(AZURILL),\n    HOENN_TO_NATIONAL(MARILL),\n    HOENN_TO_NATIONAL(AZUMARILL),\n    HOENN_TO_NATIONAL(GEODUDE),\n    HOENN_TO_NATIONAL(GRAVELER),\n    HOENN_TO_NATIONAL(GOLEM),\n    HOENN_TO_NATIONAL(NOSEPASS),\n    HOENN_TO_NATIONAL(SKITTY),\n    HOENN_TO_NATIONAL(DELCATTY),\n    HOENN_TO_NATIONAL(ZUBAT),\n    HOENN_TO_NATIONAL(GOLBAT),\n    HOENN_TO_NATIONAL(CROBAT),\n    HOENN_TO_NATIONAL(TENTACOOL),\n    HOENN_TO_NATIONAL(TENTACRUEL),\n    HOENN_TO_NATIONAL(SABLEYE),\n    HOENN_TO_NATIONAL(MAWILE),\n    HOENN_TO_NATIONAL(ARON),\n    HOENN_TO_NATIONAL(LAIRON),\n    HOENN_TO_NATIONAL(AGGRON),\n    HOENN_TO_NATIONAL(MACHOP),\n    HOENN_TO_NATIONAL(MACHOKE),\n    HOENN_TO_NATIONAL(MACHAMP),\n    HOENN_TO_NATIONAL(MEDITITE),\n    HOENN_TO_NATIONAL(MEDICHAM),\n    HOENN_TO_NATIONAL(ELECTRIKE),\n    HOENN_TO_NATIONAL(MANECTRIC),\n    HOENN_TO_NATIONAL(PLUSLE),\n    HOENN_TO_NATIONAL(MINUN),\n    HOENN_TO_NATIONAL(MAGNEMITE),\n    HOENN_TO_NATIONAL(MAGNETON),\n    HOENN_TO_NATIONAL(VOLTORB),\n    HOENN_TO_NATIONAL(ELECTRODE),\n    HOENN_TO_NATIONAL(VOLBEAT),\n    HOENN_TO_NATIONAL(ILLUMISE),\n    HOENN_TO_NATIONAL(ODDISH),\n    HOENN_TO_NATIONAL(GLOOM),\n    HOENN_TO_NATIONAL(VILEPLUME),\n    HOENN_TO_NATIONAL(BELLOSSOM),\n    HOENN_TO_NATIONAL(DODUO),\n    HOENN_TO_NATIONAL(DODRIO),\n    HOENN_TO_NATIONAL(ROSELIA),\n    HOENN_TO_NATIONAL(GULPIN),\n    HOENN_TO_NATIONAL(SWALOT),\n    HOENN_TO_NATIONAL(CARVANHA),\n    HOENN_TO_NATIONAL(SHARPEDO),\n    HOENN_TO_NATIONAL(WAILMER),\n    HOENN_TO_NATIONAL(WAILORD),\n    HOENN_TO_NATIONAL(NUMEL),\n    HOENN_TO_NATIONAL(CAMERUPT),\n    HOENN_TO_NATIONAL(SLUGMA),\n    HOENN_TO_NATIONAL(MAGCARGO),\n    HOENN_TO_NATIONAL(TORKOAL),\n    HOENN_TO_NATIONAL(GRIMER),\n    HOENN_TO_NATIONAL(MUK),\n    HOENN_TO_NATIONAL(KOFFING),\n    HOENN_TO_NATIONAL(WEEZING),\n    HOENN_TO_NATIONAL(SPOINK),\n    HOENN_TO_NATIONAL(GRUMPIG),\n    HOENN_TO_NATIONAL(SANDSHREW),\n    HOENN_TO_NATIONAL(SANDSLASH),\n    HOENN_TO_NATIONAL(SPINDA),\n    HOENN_TO_NATIONAL(SKARMORY),\n    HOENN_TO_NATIONAL(TRAPINCH),\n    HOENN_TO_NATIONAL(VIBRAVA),\n    HOENN_TO_NATIONAL(FLYGON),\n    HOENN_TO_NATIONAL(CACNEA),\n    HOENN_TO_NATIONAL(CACTURNE),\n    HOENN_TO_NATIONAL(SWABLU),\n    HOENN_TO_NATIONAL(ALTARIA),\n    HOENN_TO_NATIONAL(ZANGOOSE),\n    HOENN_TO_NATIONAL(SEVIPER),\n    HOENN_TO_NATIONAL(LUNATONE),\n    HOENN_TO_NATIONAL(SOLROCK),\n    HOENN_TO_NATIONAL(BARBOACH),\n    HOENN_TO_NATIONAL(WHISCASH),\n    HOENN_TO_NATIONAL(CORPHISH),\n    HOENN_TO_NATIONAL(CRAWDAUNT),\n    HOENN_TO_NATIONAL(BALTOY),\n    HOENN_TO_NATIONAL(CLAYDOL),\n    HOENN_TO_NATIONAL(LILEEP),\n    HOENN_TO_NATIONAL(CRADILY),\n    HOENN_TO_NATIONAL(ANORITH),\n    HOENN_TO_NATIONAL(ARMALDO),\n    HOENN_TO_NATIONAL(IGGLYBUFF),\n    HOENN_TO_NATIONAL(JIGGLYPUFF),\n    HOENN_TO_NATIONAL(WIGGLYTUFF),\n    HOENN_TO_NATIONAL(FEEBAS),\n    HOENN_TO_NATIONAL(MILOTIC),\n    HOENN_TO_NATIONAL(CASTFORM),\n    HOENN_TO_NATIONAL(STARYU),\n    HOENN_TO_NATIONAL(STARMIE),\n    HOENN_TO_NATIONAL(KECLEON),\n    HOENN_TO_NATIONAL(SHUPPET),\n    HOENN_TO_NATIONAL(BANETTE),\n    HOENN_TO_NATIONAL(DUSKULL),\n    HOENN_TO_NATIONAL(DUSCLOPS),\n    HOENN_TO_NATIONAL(TROPIUS),\n    HOENN_TO_NATIONAL(CHIMECHO),\n    HOENN_TO_NATIONAL(ABSOL),\n    HOENN_TO_NATIONAL(VULPIX),\n    HOENN_TO_NATIONAL(NINETALES),\n    HOENN_TO_NATIONAL(PICHU),\n    HOENN_TO_NATIONAL(PIKACHU),\n    HOENN_TO_NATIONAL(RAICHU),\n    HOENN_TO_NATIONAL(PSYDUCK),\n    HOENN_TO_NATIONAL(GOLDUCK),\n    HOENN_TO_NATIONAL(WYNAUT),\n    HOENN_TO_NATIONAL(WOBBUFFET),\n    HOENN_TO_NATIONAL(NATU),\n    HOENN_TO_NATIONAL(XATU),\n    HOENN_TO_NATIONAL(GIRAFARIG),\n    HOENN_TO_NATIONAL(PHANPY),\n    HOENN_TO_NATIONAL(DONPHAN),\n    HOENN_TO_NATIONAL(PINSIR),\n    HOENN_TO_NATIONAL(HERACROSS),\n    HOENN_TO_NATIONAL(RHYHORN),\n    HOENN_TO_NATIONAL(RHYDON),\n    HOENN_TO_NATIONAL(SNORUNT),\n    HOENN_TO_NATIONAL(GLALIE),\n    HOENN_TO_NATIONAL(SPHEAL),\n    HOENN_TO_NATIONAL(SEALEO),\n    HOENN_TO_NATIONAL(WALREIN),\n    HOENN_TO_NATIONAL(CLAMPERL),\n    HOENN_TO_NATIONAL(HUNTAIL),\n    HOENN_TO_NATIONAL(GOREBYSS),\n    HOENN_TO_NATIONAL(RELICANTH),\n    HOENN_TO_NATIONAL(CORSOLA),\n    HOENN_TO_NATIONAL(CHINCHOU),\n    HOENN_TO_NATIONAL(LANTURN),\n    HOENN_TO_NATIONAL(LUVDISC),\n    HOENN_TO_NATIONAL(HORSEA),\n    HOENN_TO_NATIONAL(SEADRA),\n    HOENN_TO_NATIONAL(KINGDRA),\n    HOENN_TO_NATIONAL(BAGON),\n    HOENN_TO_NATIONAL(SHELGON),\n    HOENN_TO_NATIONAL(SALAMENCE),\n    HOENN_TO_NATIONAL(BELDUM),\n    HOENN_TO_NATIONAL(METANG),\n    HOENN_TO_NATIONAL(METAGROSS),\n    HOENN_TO_NATIONAL(REGIROCK),\n    HOENN_TO_NATIONAL(REGICE),\n    HOENN_TO_NATIONAL(REGISTEEL),\n    HOENN_TO_NATIONAL(LATIAS),\n    HOENN_TO_NATIONAL(LATIOS),\n    HOENN_TO_NATIONAL(KYOGRE),\n    HOENN_TO_NATIONAL(GROUDON),\n    HOENN_TO_NATIONAL(RAYQUAZA),\n    HOENN_TO_NATIONAL(JIRACHI),\n    HOENN_TO_NATIONAL(DEOXYS),\n    HOENN_TO_NATIONAL(BULBASAUR), // Pokémon from here onwards are UNSEEN in the HoennDex.\n    HOENN_TO_NATIONAL(IVYSAUR),\n    HOENN_TO_NATIONAL(VENUSAUR),\n    HOENN_TO_NATIONAL(CHARMANDER),\n    HOENN_TO_NATIONAL(CHARMELEON),\n    HOENN_TO_NATIONAL(CHARIZARD),\n    HOENN_TO_NATIONAL(SQUIRTLE),\n    HOENN_TO_NATIONAL(WARTORTLE),\n    HOENN_TO_NATIONAL(BLASTOISE),\n    HOENN_TO_NATIONAL(CATERPIE),\n    HOENN_TO_NATIONAL(METAPOD),\n    HOENN_TO_NATIONAL(BUTTERFREE),\n    HOENN_TO_NATIONAL(WEEDLE),\n    HOENN_TO_NATIONAL(KAKUNA),\n    HOENN_TO_NATIONAL(BEEDRILL),\n    HOENN_TO_NATIONAL(PIDGEY),\n    HOENN_TO_NATIONAL(PIDGEOTTO),\n    HOENN_TO_NATIONAL(PIDGEOT),\n    HOENN_TO_NATIONAL(RATTATA),\n    HOENN_TO_NATIONAL(RATICATE),\n    HOENN_TO_NATIONAL(SPEAROW),\n    HOENN_TO_NATIONAL(FEAROW),\n    HOENN_TO_NATIONAL(EKANS),\n    HOENN_TO_NATIONAL(ARBOK),\n    HOENN_TO_NATIONAL(NIDORAN_F),\n    HOENN_TO_NATIONAL(NIDORINA),\n    HOENN_TO_NATIONAL(NIDOQUEEN),\n    HOENN_TO_NATIONAL(NIDORAN_M),\n    HOENN_TO_NATIONAL(NIDORINO),\n    HOENN_TO_NATIONAL(NIDOKING),\n    HOENN_TO_NATIONAL(CLEFAIRY),\n    HOENN_TO_NATIONAL(CLEFABLE),\n    HOENN_TO_NATIONAL(PARAS),\n    HOENN_TO_NATIONAL(PARASECT),\n    HOENN_TO_NATIONAL(VENONAT),\n    HOENN_TO_NATIONAL(VENOMOTH),\n    HOENN_TO_NATIONAL(DIGLETT),\n    HOENN_TO_NATIONAL(DUGTRIO),\n    HOENN_TO_NATIONAL(MEOWTH),\n    HOENN_TO_NATIONAL(PERSIAN),\n    HOENN_TO_NATIONAL(MANKEY),\n    HOENN_TO_NATIONAL(PRIMEAPE),\n    HOENN_TO_NATIONAL(GROWLITHE),\n    HOENN_TO_NATIONAL(ARCANINE),\n    HOENN_TO_NATIONAL(POLIWAG),\n    HOENN_TO_NATIONAL(POLIWHIRL),\n    HOENN_TO_NATIONAL(POLIWRATH),\n    HOENN_TO_NATIONAL(BELLSPROUT),\n    HOENN_TO_NATIONAL(WEEPINBELL),\n    HOENN_TO_NATIONAL(VICTREEBEL),\n    HOENN_TO_NATIONAL(PONYTA),\n    HOENN_TO_NATIONAL(RAPIDASH),\n    HOENN_TO_NATIONAL(SLOWPOKE),\n    HOENN_TO_NATIONAL(SLOWBRO),\n    HOENN_TO_NATIONAL(FARFETCHD),\n    HOENN_TO_NATIONAL(SEEL),\n    HOENN_TO_NATIONAL(DEWGONG),\n    HOENN_TO_NATIONAL(SHELLDER),\n    HOENN_TO_NATIONAL(CLOYSTER),\n    HOENN_TO_NATIONAL(GASTLY),\n    HOENN_TO_NATIONAL(HAUNTER),\n    HOENN_TO_NATIONAL(GENGAR),\n    HOENN_TO_NATIONAL(ONIX),\n    HOENN_TO_NATIONAL(DROWZEE),\n    HOENN_TO_NATIONAL(HYPNO),\n    HOENN_TO_NATIONAL(KRABBY),\n    HOENN_TO_NATIONAL(KINGLER),\n    HOENN_TO_NATIONAL(EXEGGCUTE),\n    HOENN_TO_NATIONAL(EXEGGUTOR),\n    HOENN_TO_NATIONAL(CUBONE),\n    HOENN_TO_NATIONAL(MAROWAK),\n    HOENN_TO_NATIONAL(HITMONLEE),\n    HOENN_TO_NATIONAL(HITMONCHAN),\n    HOENN_TO_NATIONAL(LICKITUNG),\n    HOENN_TO_NATIONAL(CHANSEY),\n    HOENN_TO_NATIONAL(TANGELA),\n    HOENN_TO_NATIONAL(KANGASKHAN),\n    HOENN_TO_NATIONAL(MR_MIME),\n    HOENN_TO_NATIONAL(SCYTHER),\n    HOENN_TO_NATIONAL(JYNX),\n    HOENN_TO_NATIONAL(ELECTABUZZ),\n    HOENN_TO_NATIONAL(MAGMAR),\n    HOENN_TO_NATIONAL(TAUROS),\n    HOENN_TO_NATIONAL(LAPRAS),\n    HOENN_TO_NATIONAL(DITTO),\n    HOENN_TO_NATIONAL(EEVEE),\n    HOENN_TO_NATIONAL(VAPOREON),\n    HOENN_TO_NATIONAL(JOLTEON),\n    HOENN_TO_NATIONAL(FLAREON),\n    HOENN_TO_NATIONAL(PORYGON),\n    HOENN_TO_NATIONAL(OMANYTE),\n    HOENN_TO_NATIONAL(OMASTAR),\n    HOENN_TO_NATIONAL(KABUTO),\n    HOENN_TO_NATIONAL(KABUTOPS),\n    HOENN_TO_NATIONAL(AERODACTYL),\n    HOENN_TO_NATIONAL(SNORLAX),\n    HOENN_TO_NATIONAL(ARTICUNO),\n    HOENN_TO_NATIONAL(ZAPDOS),\n    HOENN_TO_NATIONAL(MOLTRES),\n    HOENN_TO_NATIONAL(DRATINI),\n    HOENN_TO_NATIONAL(DRAGONAIR),\n    HOENN_TO_NATIONAL(DRAGONITE),\n    HOENN_TO_NATIONAL(MEWTWO),\n    HOENN_TO_NATIONAL(MEW),\n    HOENN_TO_NATIONAL(CHIKORITA),\n    HOENN_TO_NATIONAL(BAYLEEF),\n    HOENN_TO_NATIONAL(MEGANIUM),\n    HOENN_TO_NATIONAL(CYNDAQUIL),\n    HOENN_TO_NATIONAL(QUILAVA),\n    HOENN_TO_NATIONAL(TYPHLOSION),\n    HOENN_TO_NATIONAL(TOTODILE),\n    HOENN_TO_NATIONAL(CROCONAW),\n    HOENN_TO_NATIONAL(FERALIGATR),\n    HOENN_TO_NATIONAL(SENTRET),\n    HOENN_TO_NATIONAL(FURRET),\n    HOENN_TO_NATIONAL(HOOTHOOT),\n    HOENN_TO_NATIONAL(NOCTOWL),\n    HOENN_TO_NATIONAL(LEDYBA),\n    HOENN_TO_NATIONAL(LEDIAN),\n    HOENN_TO_NATIONAL(SPINARAK),\n    HOENN_TO_NATIONAL(ARIADOS),\n    HOENN_TO_NATIONAL(CLEFFA),\n    HOENN_TO_NATIONAL(TOGEPI),\n    HOENN_TO_NATIONAL(TOGETIC),\n    HOENN_TO_NATIONAL(MAREEP),\n    HOENN_TO_NATIONAL(FLAAFFY),\n    HOENN_TO_NATIONAL(AMPHAROS),\n    HOENN_TO_NATIONAL(SUDOWOODO),\n    HOENN_TO_NATIONAL(POLITOED),\n    HOENN_TO_NATIONAL(HOPPIP),\n    HOENN_TO_NATIONAL(SKIPLOOM),\n    HOENN_TO_NATIONAL(JUMPLUFF),\n    HOENN_TO_NATIONAL(AIPOM),\n    HOENN_TO_NATIONAL(SUNKERN),\n    HOENN_TO_NATIONAL(SUNFLORA),\n    HOENN_TO_NATIONAL(YANMA),\n    HOENN_TO_NATIONAL(WOOPER),\n    HOENN_TO_NATIONAL(QUAGSIRE),\n    HOENN_TO_NATIONAL(ESPEON),\n    HOENN_TO_NATIONAL(UMBREON),\n    HOENN_TO_NATIONAL(MURKROW),\n    HOENN_TO_NATIONAL(SLOWKING),\n    HOENN_TO_NATIONAL(MISDREAVUS),\n    HOENN_TO_NATIONAL(UNOWN),\n    HOENN_TO_NATIONAL(PINECO),\n    HOENN_TO_NATIONAL(FORRETRESS),\n    HOENN_TO_NATIONAL(DUNSPARCE),\n    HOENN_TO_NATIONAL(GLIGAR),\n    HOENN_TO_NATIONAL(STEELIX),\n    HOENN_TO_NATIONAL(SNUBBULL),\n    HOENN_TO_NATIONAL(GRANBULL),\n    HOENN_TO_NATIONAL(QWILFISH),\n    HOENN_TO_NATIONAL(SCIZOR),\n    HOENN_TO_NATIONAL(SHUCKLE),\n    HOENN_TO_NATIONAL(SNEASEL),\n    HOENN_TO_NATIONAL(TEDDIURSA),\n    HOENN_TO_NATIONAL(URSARING),\n    HOENN_TO_NATIONAL(SWINUB),\n    HOENN_TO_NATIONAL(PILOSWINE),\n    HOENN_TO_NATIONAL(REMORAID),\n    HOENN_TO_NATIONAL(OCTILLERY),\n    HOENN_TO_NATIONAL(DELIBIRD),\n    HOENN_TO_NATIONAL(MANTINE),\n    HOENN_TO_NATIONAL(HOUNDOUR),\n    HOENN_TO_NATIONAL(HOUNDOOM),\n    HOENN_TO_NATIONAL(PORYGON2),\n    HOENN_TO_NATIONAL(STANTLER),\n    HOENN_TO_NATIONAL(SMEARGLE),\n    HOENN_TO_NATIONAL(TYROGUE),\n    HOENN_TO_NATIONAL(HITMONTOP),\n    HOENN_TO_NATIONAL(SMOOCHUM),\n    HOENN_TO_NATIONAL(ELEKID),\n    HOENN_TO_NATIONAL(MAGBY),\n    HOENN_TO_NATIONAL(MILTANK),\n    HOENN_TO_NATIONAL(BLISSEY),\n    HOENN_TO_NATIONAL(RAIKOU),\n    HOENN_TO_NATIONAL(ENTEI),\n    HOENN_TO_NATIONAL(SUICUNE),\n    HOENN_TO_NATIONAL(LARVITAR),\n    HOENN_TO_NATIONAL(PUPITAR),\n    HOENN_TO_NATIONAL(TYRANITAR),\n    HOENN_TO_NATIONAL(LUGIA),\n    HOENN_TO_NATIONAL(HO_OH),\n    HOENN_TO_NATIONAL(CELEBI),\n    HOENN_TO_NATIONAL(OLD_UNOWN_B),\n    HOENN_TO_NATIONAL(OLD_UNOWN_C),\n    HOENN_TO_NATIONAL(OLD_UNOWN_D),\n    HOENN_TO_NATIONAL(OLD_UNOWN_E),\n    HOENN_TO_NATIONAL(OLD_UNOWN_F),\n    HOENN_TO_NATIONAL(OLD_UNOWN_G),\n    HOENN_TO_NATIONAL(OLD_UNOWN_H),\n    HOENN_TO_NATIONAL(OLD_UNOWN_I),\n    HOENN_TO_NATIONAL(OLD_UNOWN_J),\n    HOENN_TO_NATIONAL(OLD_UNOWN_K),\n    HOENN_TO_NATIONAL(OLD_UNOWN_L),\n    HOENN_TO_NATIONAL(OLD_UNOWN_M),\n    HOENN_TO_NATIONAL(OLD_UNOWN_N),\n    HOENN_TO_NATIONAL(OLD_UNOWN_O),\n    HOENN_TO_NATIONAL(OLD_UNOWN_P),\n    HOENN_TO_NATIONAL(OLD_UNOWN_Q),\n    HOENN_TO_NATIONAL(OLD_UNOWN_R),\n    HOENN_TO_NATIONAL(OLD_UNOWN_S),\n    HOENN_TO_NATIONAL(OLD_UNOWN_T),\n    HOENN_TO_NATIONAL(OLD_UNOWN_U),\n    HOENN_TO_NATIONAL(OLD_UNOWN_V),\n    HOENN_TO_NATIONAL(OLD_UNOWN_W),\n    HOENN_TO_NATIONAL(OLD_UNOWN_X),\n    HOENN_TO_NATIONAL(OLD_UNOWN_Y),\n    HOENN_TO_NATIONAL(OLD_UNOWN_Z),\n};\n\nstatic const u16 sExtendedToNationalOrder[] = // Assigns Extended Dex Pokémon (Using National Dex Index)\n{\n    EXTENDED_TO_NATIONAL(TREECKO),\n    EXTENDED_TO_NATIONAL(GROVYLE),\n    EXTENDED_TO_NATIONAL(SCEPTILE),\n    EXTENDED_TO_NATIONAL(TORCHIC),\n    EXTENDED_TO_NATIONAL(COMBUSKEN),\n    EXTENDED_TO_NATIONAL(BLAZIKEN),\n    EXTENDED_TO_NATIONAL(MUDKIP),\n    EXTENDED_TO_NATIONAL(MARSHTOMP),\n    EXTENDED_TO_NATIONAL(SWAMPERT),\n    EXTENDED_TO_NATIONAL(POOCHYENA),\n    EXTENDED_TO_NATIONAL(MIGHTYENA),\n    EXTENDED_TO_NATIONAL(ZIGZAGOON),\n    EXTENDED_TO_NATIONAL(LINOONE),\n    EXTENDED_TO_NATIONAL(WURMPLE),\n    EXTENDED_TO_NATIONAL(SILCOON),\n    EXTENDED_TO_NATIONAL(BEAUTIFLY),\n    EXTENDED_TO_NATIONAL(CASCOON),\n    EXTENDED_TO_NATIONAL(DUSTOX),\n    EXTENDED_TO_NATIONAL(LOTAD),\n    EXTENDED_TO_NATIONAL(LOMBRE),\n    EXTENDED_TO_NATIONAL(LUDICOLO),\n    EXTENDED_TO_NATIONAL(SEEDOT),\n    EXTENDED_TO_NATIONAL(NUZLEAF),\n    EXTENDED_TO_NATIONAL(SHIFTRY),\n    EXTENDED_TO_NATIONAL(TAILLOW),\n    EXTENDED_TO_NATIONAL(SWELLOW),\n    EXTENDED_TO_NATIONAL(WINGULL),\n    EXTENDED_TO_NATIONAL(PELIPPER),\n    EXTENDED_TO_NATIONAL(RALTS),\n    EXTENDED_TO_NATIONAL(KIRLIA),\n    EXTENDED_TO_NATIONAL(GARDEVOIR),\n    EXTENDED_TO_NATIONAL(SURSKIT),\n    EXTENDED_TO_NATIONAL(MASQUERAIN),\n    EXTENDED_TO_NATIONAL(SHROOMISH),\n    EXTENDED_TO_NATIONAL(BRELOOM),\n    EXTENDED_TO_NATIONAL(SLAKOTH),\n    EXTENDED_TO_NATIONAL(VIGOROTH),\n    EXTENDED_TO_NATIONAL(SLAKING),\n    EXTENDED_TO_NATIONAL(ABRA),\n    EXTENDED_TO_NATIONAL(KADABRA),\n    EXTENDED_TO_NATIONAL(ALAKAZAM),\n    EXTENDED_TO_NATIONAL(NINCADA),\n    EXTENDED_TO_NATIONAL(NINJASK),\n    EXTENDED_TO_NATIONAL(SHEDINJA),\n    EXTENDED_TO_NATIONAL(WHISMUR),\n    EXTENDED_TO_NATIONAL(LOUDRED),\n    EXTENDED_TO_NATIONAL(EXPLOUD),\n    EXTENDED_TO_NATIONAL(MAKUHITA),\n    EXTENDED_TO_NATIONAL(HARIYAMA),\n    EXTENDED_TO_NATIONAL(GOLDEEN),\n    EXTENDED_TO_NATIONAL(SEAKING),\n    EXTENDED_TO_NATIONAL(MAGIKARP),\n    EXTENDED_TO_NATIONAL(GYARADOS),\n    EXTENDED_TO_NATIONAL(AZURILL),\n    EXTENDED_TO_NATIONAL(MARILL),\n    EXTENDED_TO_NATIONAL(AZUMARILL),\n    EXTENDED_TO_NATIONAL(GEODUDE),\n    EXTENDED_TO_NATIONAL(GRAVELER),\n    EXTENDED_TO_NATIONAL(GOLEM),\n    EXTENDED_TO_NATIONAL(NOSEPASS),\n    EXTENDED_TO_NATIONAL(SKITTY),\n    EXTENDED_TO_NATIONAL(DELCATTY),\n    EXTENDED_TO_NATIONAL(ZUBAT),\n    EXTENDED_TO_NATIONAL(GOLBAT),\n    EXTENDED_TO_NATIONAL(CROBAT),\n    EXTENDED_TO_NATIONAL(TENTACOOL),\n    EXTENDED_TO_NATIONAL(TENTACRUEL),\n    EXTENDED_TO_NATIONAL(SABLEYE),\n    EXTENDED_TO_NATIONAL(MAWILE),\n    EXTENDED_TO_NATIONAL(ARON),\n    EXTENDED_TO_NATIONAL(LAIRON),\n    EXTENDED_TO_NATIONAL(AGGRON),\n    EXTENDED_TO_NATIONAL(MACHOP),\n    EXTENDED_TO_NATIONAL(MACHOKE),\n    EXTENDED_TO_NATIONAL(MACHAMP),\n    EXTENDED_TO_NATIONAL(MEDITITE),\n    EXTENDED_TO_NATIONAL(MEDICHAM),\n    EXTENDED_TO_NATIONAL(ELECTRIKE),\n    EXTENDED_TO_NATIONAL(MANECTRIC),\n    EXTENDED_TO_NATIONAL(PLUSLE),\n    EXTENDED_TO_NATIONAL(MINUN),\n    EXTENDED_TO_NATIONAL(MAGNEMITE),\n    EXTENDED_TO_NATIONAL(MAGNETON),\n    EXTENDED_TO_NATIONAL(VOLTORB),\n    EXTENDED_TO_NATIONAL(ELECTRODE),\n    EXTENDED_TO_NATIONAL(VOLBEAT),\n    EXTENDED_TO_NATIONAL(ILLUMISE),\n    EXTENDED_TO_NATIONAL(ODDISH),\n    EXTENDED_TO_NATIONAL(GLOOM),\n    EXTENDED_TO_NATIONAL(VILEPLUME),\n    EXTENDED_TO_NATIONAL(BELLOSSOM),\n    EXTENDED_TO_NATIONAL(DODUO),\n    EXTENDED_TO_NATIONAL(DODRIO),\n    EXTENDED_TO_NATIONAL(ROSELIA),\n    EXTENDED_TO_NATIONAL(GULPIN),\n    EXTENDED_TO_NATIONAL(SWALOT),\n    EXTENDED_TO_NATIONAL(CARVANHA),\n    EXTENDED_TO_NATIONAL(SHARPEDO),\n    EXTENDED_TO_NATIONAL(WAILMER),\n    EXTENDED_TO_NATIONAL(WAILORD),\n    EXTENDED_TO_NATIONAL(NUMEL),\n    EXTENDED_TO_NATIONAL(CAMERUPT),\n    EXTENDED_TO_NATIONAL(SLUGMA),\n    EXTENDED_TO_NATIONAL(MAGCARGO),\n    EXTENDED_TO_NATIONAL(TORKOAL),\n    EXTENDED_TO_NATIONAL(GRIMER),\n    EXTENDED_TO_NATIONAL(MUK),\n    EXTENDED_TO_NATIONAL(KOFFING),\n    EXTENDED_TO_NATIONAL(WEEZING),\n    EXTENDED_TO_NATIONAL(SPOINK),\n    EXTENDED_TO_NATIONAL(GRUMPIG),\n    EXTENDED_TO_NATIONAL(SANDSHREW),\n    EXTENDED_TO_NATIONAL(SANDSLASH),\n    EXTENDED_TO_NATIONAL(SPINDA),\n    EXTENDED_TO_NATIONAL(SKARMORY),\n    EXTENDED_TO_NATIONAL(TRAPINCH),\n    EXTENDED_TO_NATIONAL(VIBRAVA),\n    EXTENDED_TO_NATIONAL(FLYGON),\n    EXTENDED_TO_NATIONAL(CACNEA),\n    EXTENDED_TO_NATIONAL(CACTURNE),\n    EXTENDED_TO_NATIONAL(SWABLU),\n    EXTENDED_TO_NATIONAL(ALTARIA),\n    EXTENDED_TO_NATIONAL(ZANGOOSE),\n    EXTENDED_TO_NATIONAL(SEVIPER),\n    EXTENDED_TO_NATIONAL(LUNATONE),\n    EXTENDED_TO_NATIONAL(SOLROCK),\n    EXTENDED_TO_NATIONAL(BARBOACH),\n    EXTENDED_TO_NATIONAL(WHISCASH),\n    EXTENDED_TO_NATIONAL(CORPHISH),\n    EXTENDED_TO_NATIONAL(CRAWDAUNT),\n    EXTENDED_TO_NATIONAL(BALTOY),\n    EXTENDED_TO_NATIONAL(CLAYDOL),\n    EXTENDED_TO_NATIONAL(LILEEP),\n    EXTENDED_TO_NATIONAL(CRADILY),\n    EXTENDED_TO_NATIONAL(ANORITH),\n    EXTENDED_TO_NATIONAL(ARMALDO),\n    EXTENDED_TO_NATIONAL(IGGLYBUFF),\n    EXTENDED_TO_NATIONAL(JIGGLYPUFF),\n    EXTENDED_TO_NATIONAL(WIGGLYTUFF),\n    EXTENDED_TO_NATIONAL(FEEBAS),\n    EXTENDED_TO_NATIONAL(MILOTIC),\n    EXTENDED_TO_NATIONAL(CASTFORM),\n    EXTENDED_TO_NATIONAL(STARYU),\n    EXTENDED_TO_NATIONAL(STARMIE),\n    EXTENDED_TO_NATIONAL(KECLEON),\n    EXTENDED_TO_NATIONAL(SHUPPET),\n    EXTENDED_TO_NATIONAL(BANETTE),\n    EXTENDED_TO_NATIONAL(DUSKULL),\n    EXTENDED_TO_NATIONAL(DUSCLOPS),\n    EXTENDED_TO_NATIONAL(TROPIUS),\n    EXTENDED_TO_NATIONAL(CHIMECHO),\n    EXTENDED_TO_NATIONAL(ABSOL),\n    EXTENDED_TO_NATIONAL(VULPIX),\n    EXTENDED_TO_NATIONAL(NINETALES),\n    EXTENDED_TO_NATIONAL(PICHU),\n    EXTENDED_TO_NATIONAL(PIKACHU),\n    EXTENDED_TO_NATIONAL(RAICHU),\n    EXTENDED_TO_NATIONAL(PSYDUCK),\n    EXTENDED_TO_NATIONAL(GOLDUCK),\n    EXTENDED_TO_NATIONAL(WYNAUT),\n    EXTENDED_TO_NATIONAL(WOBBUFFET),\n    EXTENDED_TO_NATIONAL(NATU),\n    EXTENDED_TO_NATIONAL(XATU),\n    EXTENDED_TO_NATIONAL(GIRAFARIG),\n    EXTENDED_TO_NATIONAL(PHANPY),\n    EXTENDED_TO_NATIONAL(DONPHAN),\n    EXTENDED_TO_NATIONAL(PINSIR),\n    EXTENDED_TO_NATIONAL(HERACROSS),\n    EXTENDED_TO_NATIONAL(RHYHORN),\n    EXTENDED_TO_NATIONAL(RHYDON),\n    EXTENDED_TO_NATIONAL(SNORUNT),\n    EXTENDED_TO_NATIONAL(GLALIE),\n    EXTENDED_TO_NATIONAL(SPHEAL),\n    EXTENDED_TO_NATIONAL(SEALEO),\n    EXTENDED_TO_NATIONAL(WALREIN),\n    EXTENDED_TO_NATIONAL(CLAMPERL),\n    EXTENDED_TO_NATIONAL(HUNTAIL),\n    EXTENDED_TO_NATIONAL(GOREBYSS),\n    EXTENDED_TO_NATIONAL(RELICANTH),\n    EXTENDED_TO_NATIONAL(CORSOLA),\n    EXTENDED_TO_NATIONAL(CHINCHOU),\n    EXTENDED_TO_NATIONAL(LANTURN),\n    EXTENDED_TO_NATIONAL(LUVDISC),\n    EXTENDED_TO_NATIONAL(HORSEA),\n    EXTENDED_TO_NATIONAL(SEADRA),\n    EXTENDED_TO_NATIONAL(KINGDRA),\n    EXTENDED_TO_NATIONAL(BAGON),\n    EXTENDED_TO_NATIONAL(SHELGON),\n    EXTENDED_TO_NATIONAL(SALAMENCE),\n    EXTENDED_TO_NATIONAL(BELDUM),\n    EXTENDED_TO_NATIONAL(METANG),\n    EXTENDED_TO_NATIONAL(METAGROSS),\n    EXTENDED_TO_NATIONAL(REGIROCK),\n    EXTENDED_TO_NATIONAL(REGICE),\n    EXTENDED_TO_NATIONAL(REGISTEEL),\n    EXTENDED_TO_NATIONAL(LATIAS),\n    EXTENDED_TO_NATIONAL(LATIOS),\n    EXTENDED_TO_NATIONAL(KYOGRE),\n    EXTENDED_TO_NATIONAL(GROUDON),\n    EXTENDED_TO_NATIONAL(RAYQUAZA),\n    EXTENDED_TO_NATIONAL(JIRACHI),\n    EXTENDED_TO_NATIONAL(DEOXYS),\n    EXTENDED_TO_NATIONAL(BULBASAUR), // Pokémon from here onwards are UNSEEN in the HoennDex.\n    EXTENDED_TO_NATIONAL(IVYSAUR),\n    EXTENDED_TO_NATIONAL(VENUSAUR),\n    EXTENDED_TO_NATIONAL(CHARMANDER),\n    EXTENDED_TO_NATIONAL(CHARMELEON),\n    EXTENDED_TO_NATIONAL(CHARIZARD),\n    EXTENDED_TO_NATIONAL(SQUIRTLE),\n    EXTENDED_TO_NATIONAL(WARTORTLE),\n    EXTENDED_TO_NATIONAL(BLASTOISE),\n    EXTENDED_TO_NATIONAL(CATERPIE),\n    EXTENDED_TO_NATIONAL(METAPOD),\n    EXTENDED_TO_NATIONAL(BUTTERFREE),\n    EXTENDED_TO_NATIONAL(WEEDLE),\n    EXTENDED_TO_NATIONAL(KAKUNA),\n    EXTENDED_TO_NATIONAL(BEEDRILL),\n    EXTENDED_TO_NATIONAL(PIDGEY),\n    EXTENDED_TO_NATIONAL(PIDGEOTTO),\n    EXTENDED_TO_NATIONAL(PIDGEOT),\n    EXTENDED_TO_NATIONAL(RATTATA),\n    EXTENDED_TO_NATIONAL(RATICATE),\n    EXTENDED_TO_NATIONAL(SPEAROW),\n    EXTENDED_TO_NATIONAL(FEAROW),\n    EXTENDED_TO_NATIONAL(EKANS),\n    EXTENDED_TO_NATIONAL(ARBOK),\n    EXTENDED_TO_NATIONAL(NIDORAN_F),\n    EXTENDED_TO_NATIONAL(NIDORINA),\n    EXTENDED_TO_NATIONAL(NIDOQUEEN),\n    EXTENDED_TO_NATIONAL(NIDORAN_M),\n    EXTENDED_TO_NATIONAL(NIDORINO),\n    EXTENDED_TO_NATIONAL(NIDOKING),\n    EXTENDED_TO_NATIONAL(CLEFAIRY),\n    EXTENDED_TO_NATIONAL(CLEFABLE),\n    EXTENDED_TO_NATIONAL(PARAS),\n    EXTENDED_TO_NATIONAL(PARASECT),\n    EXTENDED_TO_NATIONAL(VENONAT),\n    EXTENDED_TO_NATIONAL(VENOMOTH),\n    EXTENDED_TO_NATIONAL(DIGLETT),\n    EXTENDED_TO_NATIONAL(DUGTRIO),\n    EXTENDED_TO_NATIONAL(MEOWTH),\n    EXTENDED_TO_NATIONAL(PERSIAN),\n    EXTENDED_TO_NATIONAL(MANKEY),\n    EXTENDED_TO_NATIONAL(PRIMEAPE),\n    EXTENDED_TO_NATIONAL(GROWLITHE),\n    EXTENDED_TO_NATIONAL(ARCANINE),\n    EXTENDED_TO_NATIONAL(POLIWAG),\n    EXTENDED_TO_NATIONAL(POLIWHIRL),\n    EXTENDED_TO_NATIONAL(POLIWRATH),\n    EXTENDED_TO_NATIONAL(BELLSPROUT),\n    EXTENDED_TO_NATIONAL(WEEPINBELL),\n    EXTENDED_TO_NATIONAL(VICTREEBEL),\n    EXTENDED_TO_NATIONAL(PONYTA),\n    EXTENDED_TO_NATIONAL(RAPIDASH),\n    EXTENDED_TO_NATIONAL(SLOWPOKE),\n    EXTENDED_TO_NATIONAL(SLOWBRO),\n    EXTENDED_TO_NATIONAL(FARFETCHD),\n    EXTENDED_TO_NATIONAL(SEEL),\n    EXTENDED_TO_NATIONAL(DEWGONG),\n    EXTENDED_TO_NATIONAL(SHELLDER),\n    EXTENDED_TO_NATIONAL(CLOYSTER),\n    EXTENDED_TO_NATIONAL(GASTLY),\n    EXTENDED_TO_NATIONAL(HAUNTER),\n    EXTENDED_TO_NATIONAL(GENGAR),\n    EXTENDED_TO_NATIONAL(ONIX),\n    EXTENDED_TO_NATIONAL(DROWZEE),\n    EXTENDED_TO_NATIONAL(HYPNO),\n    EXTENDED_TO_NATIONAL(KRABBY),\n    EXTENDED_TO_NATIONAL(KINGLER),\n    EXTENDED_TO_NATIONAL(EXEGGCUTE),\n    EXTENDED_TO_NATIONAL(EXEGGUTOR),\n    EXTENDED_TO_NATIONAL(CUBONE),\n    EXTENDED_TO_NATIONAL(MAROWAK),\n    EXTENDED_TO_NATIONAL(HITMONLEE),\n    EXTENDED_TO_NATIONAL(HITMONCHAN),\n    EXTENDED_TO_NATIONAL(LICKITUNG),\n    EXTENDED_TO_NATIONAL(CHANSEY),\n    EXTENDED_TO_NATIONAL(TANGELA),\n    EXTENDED_TO_NATIONAL(KANGASKHAN),\n    EXTENDED_TO_NATIONAL(MR_MIME),\n    EXTENDED_TO_NATIONAL(SCYTHER),\n    EXTENDED_TO_NATIONAL(JYNX),\n    EXTENDED_TO_NATIONAL(ELECTABUZZ),\n    EXTENDED_TO_NATIONAL(MAGMAR),\n    EXTENDED_TO_NATIONAL(TAUROS),\n    EXTENDED_TO_NATIONAL(LAPRAS),\n    EXTENDED_TO_NATIONAL(DITTO),\n    EXTENDED_TO_NATIONAL(EEVEE),\n    EXTENDED_TO_NATIONAL(VAPOREON),\n    EXTENDED_TO_NATIONAL(JOLTEON),\n    EXTENDED_TO_NATIONAL(FLAREON),\n    EXTENDED_TO_NATIONAL(PORYGON),\n    EXTENDED_TO_NATIONAL(OMANYTE),\n    EXTENDED_TO_NATIONAL(OMASTAR),\n    EXTENDED_TO_NATIONAL(KABUTO),\n    EXTENDED_TO_NATIONAL(KABUTOPS),\n    EXTENDED_TO_NATIONAL(AERODACTYL),\n    EXTENDED_TO_NATIONAL(SNORLAX),\n    EXTENDED_TO_NATIONAL(ARTICUNO),\n    EXTENDED_TO_NATIONAL(ZAPDOS),\n    EXTENDED_TO_NATIONAL(MOLTRES),\n    EXTENDED_TO_NATIONAL(DRATINI),\n    EXTENDED_TO_NATIONAL(DRAGONAIR),\n    EXTENDED_TO_NATIONAL(DRAGONITE),\n    EXTENDED_TO_NATIONAL(MEWTWO),\n    EXTENDED_TO_NATIONAL(MEW),\n    EXTENDED_TO_NATIONAL(CHIKORITA),\n    EXTENDED_TO_NATIONAL(BAYLEEF),\n    EXTENDED_TO_NATIONAL(MEGANIUM),\n    EXTENDED_TO_NATIONAL(CYNDAQUIL),\n    EXTENDED_TO_NATIONAL(QUILAVA),\n    EXTENDED_TO_NATIONAL(TYPHLOSION),\n    EXTENDED_TO_NATIONAL(TOTODILE),\n    EXTENDED_TO_NATIONAL(CROCONAW),\n    EXTENDED_TO_NATIONAL(FERALIGATR),\n    EXTENDED_TO_NATIONAL(SENTRET),\n    EXTENDED_TO_NATIONAL(FURRET),\n    EXTENDED_TO_NATIONAL(HOOTHOOT),\n    EXTENDED_TO_NATIONAL(NOCTOWL),\n    EXTENDED_TO_NATIONAL(LEDYBA),\n    EXTENDED_TO_NATIONAL(LEDIAN),\n    EXTENDED_TO_NATIONAL(SPINARAK),\n    EXTENDED_TO_NATIONAL(ARIADOS),\n    EXTENDED_TO_NATIONAL(CLEFFA),\n    EXTENDED_TO_NATIONAL(TOGEPI),\n    EXTENDED_TO_NATIONAL(TOGETIC),\n    EXTENDED_TO_NATIONAL(MAREEP),\n    EXTENDED_TO_NATIONAL(FLAAFFY),\n    EXTENDED_TO_NATIONAL(AMPHAROS),\n    EXTENDED_TO_NATIONAL(SUDOWOODO),\n    EXTENDED_TO_NATIONAL(POLITOED),\n    EXTENDED_TO_NATIONAL(HOPPIP),\n    EXTENDED_TO_NATIONAL(SKIPLOOM),\n    EXTENDED_TO_NATIONAL(JUMPLUFF),\n    EXTENDED_TO_NATIONAL(AIPOM),\n    EXTENDED_TO_NATIONAL(SUNKERN),\n    EXTENDED_TO_NATIONAL(SUNFLORA),\n    EXTENDED_TO_NATIONAL(YANMA),\n    EXTENDED_TO_NATIONAL(WOOPER),\n    EXTENDED_TO_NATIONAL(QUAGSIRE),\n    EXTENDED_TO_NATIONAL(ESPEON),\n    EXTENDED_TO_NATIONAL(UMBREON),\n    EXTENDED_TO_NATIONAL(MURKROW),\n    EXTENDED_TO_NATIONAL(SLOWKING),\n    EXTENDED_TO_NATIONAL(MISDREAVUS),\n    EXTENDED_TO_NATIONAL(UNOWN),\n    EXTENDED_TO_NATIONAL(PINECO),\n    EXTENDED_TO_NATIONAL(FORRETRESS),\n    EXTENDED_TO_NATIONAL(DUNSPARCE),\n    EXTENDED_TO_NATIONAL(GLIGAR),\n    EXTENDED_TO_NATIONAL(STEELIX),\n    EXTENDED_TO_NATIONAL(SNUBBULL),\n    EXTENDED_TO_NATIONAL(GRANBULL),\n    EXTENDED_TO_NATIONAL(QWILFISH),\n    EXTENDED_TO_NATIONAL(SCIZOR),\n    EXTENDED_TO_NATIONAL(SHUCKLE),\n    EXTENDED_TO_NATIONAL(SNEASEL),\n    EXTENDED_TO_NATIONAL(TEDDIURSA),\n    EXTENDED_TO_NATIONAL(URSARING),\n    EXTENDED_TO_NATIONAL(SWINUB),\n    EXTENDED_TO_NATIONAL(PILOSWINE),\n    EXTENDED_TO_NATIONAL(REMORAID),\n    EXTENDED_TO_NATIONAL(OCTILLERY),\n    EXTENDED_TO_NATIONAL(DELIBIRD),\n    EXTENDED_TO_NATIONAL(MANTINE),\n    EXTENDED_TO_NATIONAL(HOUNDOUR),\n    EXTENDED_TO_NATIONAL(HOUNDOOM),\n    EXTENDED_TO_NATIONAL(PORYGON2),\n    EXTENDED_TO_NATIONAL(STANTLER),\n    EXTENDED_TO_NATIONAL(SMEARGLE),\n    EXTENDED_TO_NATIONAL(TYROGUE),\n    EXTENDED_TO_NATIONAL(HITMONTOP),\n    EXTENDED_TO_NATIONAL(SMOOCHUM),\n    EXTENDED_TO_NATIONAL(ELEKID),\n    EXTENDED_TO_NATIONAL(MAGBY),\n    EXTENDED_TO_NATIONAL(MILTANK),\n    EXTENDED_TO_NATIONAL(BLISSEY),\n    EXTENDED_TO_NATIONAL(RAIKOU),\n    EXTENDED_TO_NATIONAL(ENTEI),\n    EXTENDED_TO_NATIONAL(SUICUNE),\n    EXTENDED_TO_NATIONAL(LARVITAR),\n    EXTENDED_TO_NATIONAL(PUPITAR),\n    EXTENDED_TO_NATIONAL(TYRANITAR),\n    EXTENDED_TO_NATIONAL(LUGIA),\n    EXTENDED_TO_NATIONAL(HO_OH),\n    EXTENDED_TO_NATIONAL(CELEBI),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_B),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_C),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_D),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_E),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_F),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_G),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_H),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_I),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_J),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_K),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_L),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_M),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_N),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_O),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_P),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_Q),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_R),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_S),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_T),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_U),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_V),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_W),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_X),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_Y),\n    EXTENDED_TO_NATIONAL(OLD_UNOWN_Z),\n};\n\nstatic const struct SpindaSpot sSpindaSpotGraphics[] =\n{\n    {.x = 16, .y = 7, .image = INCBIN_U16(\"graphics/spinda_spots/spot_0.bin\")},\n    {.x = 40, .y = 8, .image = INCBIN_U16(\"graphics/spinda_spots/spot_1.bin\")},\n    {.x = 22, .y = 25, .image = INCBIN_U16(\"graphics/spinda_spots/spot_2.bin\")},\n    {.x = 34, .y = 26, .image = INCBIN_U16(\"graphics/spinda_spots/spot_3.bin\")}\n};\n\n#include \"data/pokemon/item_effects.h\"\n\nconst u16 gEvolutionLines[NUM_SPECIES][EVOS_PER_LINE] =\n{\n    [SPECIES_BULBASAUR ... SPECIES_VENUSAUR]    = {SPECIES_BULBASAUR, SPECIES_IVYSAUR, SPECIES_VENUSAUR},\n    [SPECIES_CHARMANDER ... SPECIES_CHARIZARD]  = {SPECIES_CHARMANDER, SPECIES_CHARMELEON, SPECIES_CHARIZARD},\n    [SPECIES_SQUIRTLE ... SPECIES_BLASTOISE]    = {SPECIES_SQUIRTLE, SPECIES_WARTORTLE, SPECIES_BLASTOISE},\n    [SPECIES_CATERPIE ... SPECIES_BUTTERFREE]   = {SPECIES_CATERPIE, SPECIES_METAPOD, SPECIES_BUTTERFREE},\n    [SPECIES_WEEDLE ... SPECIES_BEEDRILL]       = {SPECIES_WEEDLE, SPECIES_KAKUNA, SPECIES_BEEDRILL},\n    [SPECIES_PIDGEY ... SPECIES_PIDGEOT]        = {SPECIES_PIDGEY, SPECIES_PIDGEOTTO, SPECIES_PIDGEOT},\n    [SPECIES_RATTATA ... SPECIES_RATICATE]      = {SPECIES_RATTATA, SPECIES_RATICATE},\n    [SPECIES_SPEAROW ... SPECIES_FEAROW]        = {SPECIES_SPEAROW, SPECIES_FEAROW},\n    [SPECIES_EKANS ... SPECIES_ARBOK]           = {SPECIES_EKANS, SPECIES_ARBOK},\n    [SPECIES_PIKACHU ... SPECIES_RAICHU]        = {SPECIES_PICHU, SPECIES_PIKACHU, SPECIES_RAICHU}, \n    [SPECIES_PICHU]                             = {SPECIES_PICHU, SPECIES_PIKACHU, SPECIES_RAICHU},\n    [SPECIES_SANDSHREW ... SPECIES_SANDSLASH]   = {SPECIES_SANDSHREW, SPECIES_SANDSLASH},\n    [SPECIES_NIDORAN_F ... SPECIES_NIDOQUEEN]   = {SPECIES_NIDORAN_F, SPECIES_NIDORINA, SPECIES_NIDOQUEEN},\n    [SPECIES_NIDORAN_M ... SPECIES_NIDOKING]    = {SPECIES_NIDORAN_M, SPECIES_NIDORINO, SPECIES_NIDOKING},\n    [SPECIES_CLEFAIRY ... SPECIES_CLEFABLE]     = {SPECIES_CLEFFA, SPECIES_CLEFAIRY, SPECIES_CLEFABLE},\n    [SPECIES_CLEFFA]                            = {SPECIES_CLEFFA, SPECIES_CLEFAIRY, SPECIES_CLEFABLE},\n    [SPECIES_VULPIX ... SPECIES_NINETALES]      = {SPECIES_VULPIX, SPECIES_NINETALES},\n    [SPECIES_JIGGLYPUFF ... SPECIES_WIGGLYTUFF] = {SPECIES_IGGLYBUFF, SPECIES_JIGGLYPUFF, SPECIES_WIGGLYTUFF},\n    [SPECIES_IGGLYBUFF]                         = {SPECIES_IGGLYBUFF, SPECIES_JIGGLYPUFF, SPECIES_WIGGLYTUFF},\n    [SPECIES_ZUBAT ... SPECIES_GOLBAT]          = {SPECIES_ZUBAT, SPECIES_GOLBAT, SPECIES_CROBAT},\n    [SPECIES_CROBAT]                            = {SPECIES_ZUBAT, SPECIES_GOLBAT, SPECIES_CROBAT},\n    [SPECIES_ODDISH ... SPECIES_VILEPLUME]      = {SPECIES_ODDISH, SPECIES_GLOOM, SPECIES_VILEPLUME, SPECIES_BELLOSSOM},\n    [SPECIES_BELLOSSOM]                         = {SPECIES_ODDISH, SPECIES_GLOOM, SPECIES_VILEPLUME, SPECIES_BELLOSSOM},\n    [SPECIES_PARAS ... SPECIES_PARASECT]        = {SPECIES_PARAS, SPECIES_PARASECT},\n    [SPECIES_VENONAT ... SPECIES_VENOMOTH]      = {SPECIES_VENONAT, SPECIES_VENOMOTH},\n    [SPECIES_DIGLETT ... SPECIES_DUGTRIO]       = {SPECIES_DIGLETT, SPECIES_DUGTRIO},\n    [SPECIES_MEOWTH ... SPECIES_PERSIAN]        = {SPECIES_MEOWTH, SPECIES_PERSIAN},\n    [SPECIES_PSYDUCK ... SPECIES_GOLDUCK]       = {SPECIES_PSYDUCK, SPECIES_GOLDUCK},\n    [SPECIES_MANKEY ... SPECIES_PRIMEAPE]       = {SPECIES_MANKEY, SPECIES_PRIMEAPE},\n    [SPECIES_GROWLITHE ... SPECIES_ARCANINE]    = {SPECIES_GROWLITHE, SPECIES_ARCANINE},\n    [SPECIES_POLIWAG ... SPECIES_POLIWRATH]     = {SPECIES_POLIWAG, SPECIES_POLIWHIRL, SPECIES_POLIWRATH, SPECIES_POLITOED},\n    [SPECIES_POLITOED]                          = {SPECIES_POLIWAG, SPECIES_POLIWHIRL, SPECIES_POLIWRATH, SPECIES_POLITOED},\n    [SPECIES_ABRA ... SPECIES_ALAKAZAM]         = {SPECIES_ABRA, SPECIES_KADABRA, SPECIES_ALAKAZAM},\n    [SPECIES_MACHOP ... SPECIES_MACHAMP]        = {SPECIES_MACHOP, SPECIES_MACHOKE, SPECIES_MACHAMP},\n    [SPECIES_BELLSPROUT ... SPECIES_VICTREEBEL] = {SPECIES_BELLSPROUT, SPECIES_WEEPINBELL, SPECIES_VICTREEBEL},\n    [SPECIES_TENTACOOL ... SPECIES_TENTACRUEL]  = {SPECIES_TENTACOOL, SPECIES_TENTACRUEL},\n    [SPECIES_GEODUDE ... SPECIES_GOLEM]         = {SPECIES_GEODUDE, SPECIES_GRAVELER, SPECIES_GOLEM},\n    [SPECIES_PONYTA ... SPECIES_RAPIDASH]       = {SPECIES_PONYTA, SPECIES_RAPIDASH},\n    [SPECIES_SLOWPOKE ... SPECIES_SLOWBRO]      = {SPECIES_SLOWPOKE, SPECIES_SLOWBRO, SPECIES_SLOWKING},\n    [SPECIES_SLOWKING]                          = {SPECIES_SLOWPOKE, SPECIES_SLOWBRO, SPECIES_SLOWKING},\n    [SPECIES_MAGNEMITE ... SPECIES_MAGNETON]    = {SPECIES_MAGNEMITE, SPECIES_MAGNETON},\n    [SPECIES_FARFETCHD]                         = {SPECIES_FARFETCHD},\n    [SPECIES_DODUO ... SPECIES_DODRIO]          = {SPECIES_DODUO, SPECIES_DODRIO},\n    [SPECIES_SEEL ... SPECIES_DEWGONG]          = {SPECIES_SEEL, SPECIES_DEWGONG},\n    [SPECIES_GRIMER ... SPECIES_MUK]            = {SPECIES_GRIMER, SPECIES_MUK},\n    [SPECIES_SHELLDER ... SPECIES_CLOYSTER]     = {SPECIES_SHELLDER, SPECIES_CLOYSTER},\n    [SPECIES_GASTLY ... SPECIES_GENGAR]         = {SPECIES_GASTLY, SPECIES_HAUNTER, SPECIES_GENGAR},\n    [SPECIES_ONIX]                              = {SPECIES_ONIX, SPECIES_STEELIX},\n    [SPECIES_STEELIX]                           = {SPECIES_ONIX, SPECIES_STEELIX},\n    [SPECIES_DROWZEE ... SPECIES_HYPNO]         = {SPECIES_DROWZEE, SPECIES_HYPNO},\n    [SPECIES_KRABBY ... SPECIES_KINGLER]        = {SPECIES_KRABBY, SPECIES_KINGLER},\n    [SPECIES_VOLTORB ... SPECIES_ELECTRODE]     = {SPECIES_VOLTORB, SPECIES_ELECTRODE},\n    [SPECIES_EXEGGCUTE ... SPECIES_EXEGGUTOR]   = {SPECIES_EXEGGCUTE, SPECIES_EXEGGUTOR},\n    [SPECIES_CUBONE ... SPECIES_MAROWAK]        = {SPECIES_CUBONE, SPECIES_MAROWAK},\n    [SPECIES_LICKITUNG]                         = {SPECIES_LICKITUNG},\n    [SPECIES_KOFFING ... SPECIES_WEEZING]       = {SPECIES_KOFFING, SPECIES_WEEZING},\n    [SPECIES_RHYHORN ... SPECIES_RHYDON]        = {SPECIES_RHYHORN, SPECIES_RHYDON},\n    [SPECIES_CHANSEY]                           = {SPECIES_CHANSEY, SPECIES_BLISSEY}, \n    [SPECIES_BLISSEY]                           = {SPECIES_CHANSEY, SPECIES_BLISSEY}, \n    [SPECIES_TANGELA]                           = {SPECIES_TANGELA},\n    [SPECIES_KANGASKHAN]                        = {SPECIES_KANGASKHAN},\n    [SPECIES_HORSEA ... SPECIES_SEADRA]         = {SPECIES_HORSEA, SPECIES_SEADRA, SPECIES_KINGDRA},\n    [SPECIES_KINGDRA]                           = {SPECIES_HORSEA, SPECIES_SEADRA, SPECIES_KINGDRA},\n    [SPECIES_GOLDEEN ... SPECIES_SEAKING]       = {SPECIES_GOLDEEN, SPECIES_SEAKING},\n    [SPECIES_STARYU ... SPECIES_STARMIE]        = {SPECIES_STARYU, SPECIES_STARMIE},\n    [SPECIES_MR_MIME]                           = {SPECIES_MR_MIME},\n    [SPECIES_SCYTHER]                           = {SPECIES_SCYTHER, SPECIES_SCIZOR},\n    [SPECIES_SCIZOR]                            = {SPECIES_SCYTHER, SPECIES_SCIZOR},\n    [SPECIES_PINSIR]                            = {SPECIES_PINSIR},\n    [SPECIES_TAUROS]                            = {SPECIES_TAUROS},\n    [SPECIES_MAGIKARP ... SPECIES_GYARADOS]     = {SPECIES_MAGIKARP, SPECIES_GYARADOS},\n    [SPECIES_LAPRAS]                            = {SPECIES_LAPRAS},\n    [SPECIES_DITTO]                             = {SPECIES_DITTO},\n    [SPECIES_EEVEE ... SPECIES_FLAREON]         = {SPECIES_EEVEE, SPECIES_JOLTEON, SPECIES_VAPOREON, SPECIES_FLAREON, SPECIES_ESPEON, SPECIES_UMBREON},\n    [SPECIES_ESPEON ... SPECIES_UMBREON]        = {SPECIES_EEVEE, SPECIES_JOLTEON, SPECIES_VAPOREON, SPECIES_FLAREON, SPECIES_ESPEON, SPECIES_UMBREON},\n    [SPECIES_PORYGON]                           = {SPECIES_PORYGON, SPECIES_PORYGON2},\n    [SPECIES_PORYGON2]                          = {SPECIES_PORYGON, SPECIES_PORYGON2},\n    [SPECIES_OMANYTE ... SPECIES_OMASTAR]       = {SPECIES_OMANYTE, SPECIES_OMASTAR},\n    [SPECIES_KABUTO ... SPECIES_KABUTOPS]       = {SPECIES_KABUTO, SPECIES_KABUTOPS},\n    [SPECIES_AERODACTYL]                        = {SPECIES_AERODACTYL},\n    [SPECIES_SNORLAX]                           = {SPECIES_SNORLAX},\n    [SPECIES_ARTICUNO]                          = {SPECIES_ARTICUNO},\n    [SPECIES_ZAPDOS]                            = {SPECIES_ZAPDOS},\n    [SPECIES_MOLTRES]                           = {SPECIES_MOLTRES},\n    [SPECIES_DRATINI ... SPECIES_DRAGONITE]     = {SPECIES_DRATINI, SPECIES_DRAGONAIR, SPECIES_DRAGONITE},\n    [SPECIES_MEWTWO]                            = {SPECIES_MEWTWO},\n    [SPECIES_MEW]                               = {SPECIES_MEW},\n    [SPECIES_CHIKORITA ... SPECIES_MEGANIUM]    = {SPECIES_CHIKORITA, SPECIES_BAYLEEF, SPECIES_MEGANIUM},\n    [SPECIES_CYNDAQUIL ... SPECIES_TYPHLOSION]  = {SPECIES_CYNDAQUIL, SPECIES_QUILAVA, SPECIES_TYPHLOSION},\n    [SPECIES_TOTODILE ... SPECIES_FERALIGATR]   = {SPECIES_TOTODILE, SPECIES_CROCONAW, SPECIES_FERALIGATR},\n    [SPECIES_SENTRET ... SPECIES_FURRET]        = {SPECIES_SENTRET, SPECIES_FURRET},\n    [SPECIES_HOOTHOOT ... SPECIES_NOCTOWL]      = {SPECIES_HOOTHOOT, SPECIES_NOCTOWL},\n    [SPECIES_LEDYBA ... SPECIES_LEDIAN]         = {SPECIES_LEDYBA, SPECIES_LEDIAN},\n    [SPECIES_SPINARAK ... SPECIES_ARIADOS]      = {SPECIES_SPINARAK, SPECIES_ARIADOS},\n    [SPECIES_CHINCHOU ... SPECIES_LANTURN]      = {SPECIES_CHINCHOU, SPECIES_LANTURN},\n    [SPECIES_TOGEPI ... SPECIES_TOGETIC]        = {SPECIES_TOGEPI, SPECIES_TOGETIC},\n    [SPECIES_NATU ... SPECIES_XATU]             = {SPECIES_NATU, SPECIES_XATU},\n    [SPECIES_MAREEP ... SPECIES_AMPHAROS]       = {SPECIES_MAREEP, SPECIES_FLAAFFY, SPECIES_AMPHAROS},\n    [SPECIES_MARILL ... SPECIES_AZUMARILL]      = {SPECIES_AZURILL, SPECIES_MARILL, SPECIES_AZUMARILL},\n    [SPECIES_AZURILL]                           = {SPECIES_AZURILL, SPECIES_MARILL, SPECIES_AZUMARILL},\n    [SPECIES_SUDOWOODO]                         = {SPECIES_SUDOWOODO},\n    [SPECIES_HOPPIP ... SPECIES_JUMPLUFF]       = {SPECIES_HOPPIP, SPECIES_SKIPLOOM, SPECIES_JUMPLUFF},\n    [SPECIES_AIPOM]                             = {SPECIES_AIPOM},\n    [SPECIES_SUNKERN ... SPECIES_SUNFLORA]      = {SPECIES_SUNKERN, SPECIES_SUNFLORA},\n    [SPECIES_YANMA]                             = {SPECIES_YANMA},\n    [SPECIES_WOOPER ... SPECIES_QUAGSIRE]       = {SPECIES_WOOPER, SPECIES_QUAGSIRE},\n    [SPECIES_MURKROW]                           = {SPECIES_MURKROW},\n    [SPECIES_MISDREAVUS]                        = {SPECIES_MISDREAVUS},\n    [SPECIES_UNOWN]                             = {SPECIES_UNOWN},\n    [SPECIES_GIRAFARIG]                         = {SPECIES_GIRAFARIG},\n    [SPECIES_PINECO ... SPECIES_FORRETRESS]     = {SPECIES_PINECO, SPECIES_FORRETRESS},\n    [SPECIES_DUNSPARCE]                         = {SPECIES_DUNSPARCE},\n    [SPECIES_GLIGAR]                            = {SPECIES_GLIGAR},\n    [SPECIES_SNUBBULL ... SPECIES_GRANBULL]     = {SPECIES_SNUBBULL, SPECIES_GRANBULL},\n    [SPECIES_QWILFISH]                          = {SPECIES_QWILFISH},\n    [SPECIES_SHUCKLE]                           = {SPECIES_SHUCKLE},\n    [SPECIES_HERACROSS]                         = {SPECIES_HERACROSS},\n    [SPECIES_SNEASEL]                           = {SPECIES_SNEASEL},\n    [SPECIES_TEDDIURSA ... SPECIES_URSARING]    = {SPECIES_TEDDIURSA, SPECIES_URSARING},\n    [SPECIES_SLUGMA ... SPECIES_MAGCARGO]       = {SPECIES_SLUGMA, SPECIES_MAGCARGO},\n    [SPECIES_SWINUB ... SPECIES_PILOSWINE]      = {SPECIES_SWINUB, SPECIES_PILOSWINE},\n    [SPECIES_CORSOLA]                           = {SPECIES_CORSOLA},\n    [SPECIES_REMORAID ... SPECIES_OCTILLERY]    = {SPECIES_REMORAID, SPECIES_OCTILLERY},\n    [SPECIES_DELIBIRD]                          = {SPECIES_DELIBIRD},\n    [SPECIES_MANTINE]                           = {SPECIES_MANTINE},\n    [SPECIES_SKARMORY]                          = {SPECIES_SKARMORY},\n    [SPECIES_HOUNDOUR ... SPECIES_HOUNDOOM]     = {SPECIES_HOUNDOUR, SPECIES_HOUNDOOM},\n    [SPECIES_PHANPY ... SPECIES_DONPHAN]        = {SPECIES_PHANPY, SPECIES_DONPHAN},\n    [SPECIES_STANTLER]                          = {SPECIES_STANTLER},\n    [SPECIES_SMEARGLE]                          = {SPECIES_SMEARGLE},\n    [SPECIES_TYROGUE ... SPECIES_HITMONTOP]     = {SPECIES_TYROGUE, SPECIES_HITMONCHAN, SPECIES_HITMONLEE, SPECIES_HITMONTOP},\n    [SPECIES_HITMONLEE ... SPECIES_HITMONCHAN]  = {SPECIES_TYROGUE, SPECIES_HITMONCHAN, SPECIES_HITMONLEE, SPECIES_HITMONTOP}, \n    [SPECIES_SMOOCHUM]                          = {SPECIES_SMOOCHUM, SPECIES_JYNX},\n    [SPECIES_JYNX]                              = {SPECIES_SMOOCHUM, SPECIES_JYNX},\n    [SPECIES_ELEKID]                            = {SPECIES_ELEKID, SPECIES_ELECTABUZZ},\n    [SPECIES_ELECTABUZZ]                        = {SPECIES_ELEKID, SPECIES_ELECTABUZZ},\n    [SPECIES_MAGBY]                             = {SPECIES_MAGBY, SPECIES_MAGMAR},\n    [SPECIES_MAGMAR]                            = {SPECIES_MAGBY, SPECIES_MAGMAR},\n    [SPECIES_MILTANK]                           = {SPECIES_MILTANK},\n    [SPECIES_RAIKOU]                            = {SPECIES_RAIKOU},\n    [SPECIES_ENTEI]                             = {SPECIES_ENTEI},\n    [SPECIES_SUICUNE]                           = {SPECIES_SUICUNE},\n    [SPECIES_LARVITAR ... SPECIES_TYRANITAR]    = {SPECIES_LARVITAR, SPECIES_PUPITAR, SPECIES_TYRANITAR},\n    [SPECIES_LUGIA]                             = {SPECIES_LUGIA},\n    [SPECIES_HO_OH]                             = {SPECIES_HO_OH},\n    [SPECIES_CELEBI]                            = {SPECIES_CELEBI},\n    [SPECIES_TREECKO ... SPECIES_SCEPTILE]      = {SPECIES_TREECKO, SPECIES_GROVYLE, SPECIES_SCEPTILE},\n    [SPECIES_TORCHIC ... SPECIES_BLAZIKEN]      = {SPECIES_TORCHIC, SPECIES_COMBUSKEN, SPECIES_BLAZIKEN},\n    [SPECIES_MUDKIP ... SPECIES_SWAMPERT]       = {SPECIES_MUDKIP, SPECIES_MARSHTOMP, SPECIES_SWAMPERT},\n    [SPECIES_POOCHYENA ... SPECIES_MIGHTYENA]   = {SPECIES_POOCHYENA, SPECIES_MIGHTYENA},\n    [SPECIES_ZIGZAGOON ... SPECIES_LINOONE]     = {SPECIES_ZIGZAGOON, SPECIES_LINOONE},\n    [SPECIES_WURMPLE ... SPECIES_DUSTOX]        = {SPECIES_WURMPLE, SPECIES_SILCOON, SPECIES_BEAUTIFLY, SPECIES_CASCOON, SPECIES_DUSTOX},\n    [SPECIES_LOTAD ... SPECIES_LUDICOLO]        = {SPECIES_LOTAD, SPECIES_LOMBRE, SPECIES_LUDICOLO},\n    [SPECIES_SEEDOT ... SPECIES_SHIFTRY]        = {SPECIES_SEEDOT, SPECIES_NUZLEAF, SPECIES_SHIFTRY},\n    [SPECIES_NINCADA ... SPECIES_SHEDINJA]      = {SPECIES_NINCADA, SPECIES_NINJASK, SPECIES_SHEDINJA},\n    [SPECIES_TAILLOW ... SPECIES_SWELLOW]       = {SPECIES_TAILLOW, SPECIES_SWELLOW},\n    [SPECIES_SHROOMISH ... SPECIES_BRELOOM]     = {SPECIES_SHROOMISH, SPECIES_BRELOOM},\n    [SPECIES_SPINDA]                            = {SPECIES_SPINDA},\n    [SPECIES_WINGULL ... SPECIES_PELIPPER]      = {SPECIES_WINGULL, SPECIES_PELIPPER},\n    [SPECIES_SURSKIT ... SPECIES_MASQUERAIN]    = {SPECIES_SURSKIT, SPECIES_MASQUERAIN},\n    [SPECIES_WAILMER ... SPECIES_WAILORD]       = {SPECIES_WAILMER, SPECIES_WAILORD},\n    [SPECIES_SKITTY ... SPECIES_DELCATTY]       = {SPECIES_SKITTY, SPECIES_DELCATTY},\n    [SPECIES_KECLEON]                           = {SPECIES_KECLEON},\n    [SPECIES_BALTOY ... SPECIES_CLAYDOL]        = {SPECIES_BALTOY, SPECIES_CLAYDOL},\n    [SPECIES_NOSEPASS]                          = {SPECIES_NOSEPASS},\n    [SPECIES_TORKOAL]                           = {SPECIES_TORKOAL},\n    [SPECIES_SABLEYE]                           = {SPECIES_SABLEYE},\n    [SPECIES_BARBOACH ... SPECIES_WHISCASH]     = {SPECIES_BARBOACH, SPECIES_WHISCASH},\n    [SPECIES_LUVDISC]                           = {SPECIES_LUVDISC},\n    [SPECIES_CORPHISH ... SPECIES_CRAWDAUNT]    = {SPECIES_CORPHISH, SPECIES_CRAWDAUNT},\n    [SPECIES_FEEBAS ... SPECIES_MILOTIC]        = {SPECIES_FEEBAS, SPECIES_MILOTIC},\n    [SPECIES_CARVANHA ... SPECIES_SHARPEDO]     = {SPECIES_CARVANHA, SPECIES_SHARPEDO},\n    [SPECIES_TRAPINCH ... SPECIES_FLYGON]       = {SPECIES_TRAPINCH, SPECIES_VIBRAVA, SPECIES_FLYGON},\n    [SPECIES_MAKUHITA ... SPECIES_HARIYAMA]     = {SPECIES_MAKUHITA, SPECIES_HARIYAMA},\n    [SPECIES_ELECTRIKE ... SPECIES_MANECTRIC]   = {SPECIES_ELECTRIKE, SPECIES_MANECTRIC},\n    [SPECIES_NUMEL ... SPECIES_CAMERUPT]        = {SPECIES_NUMEL, SPECIES_CAMERUPT},\n    [SPECIES_SPHEAL ... SPECIES_WALREIN]        = {SPECIES_SPHEAL, SPECIES_SEALEO, SPECIES_WALREIN},\n    [SPECIES_CACNEA ... SPECIES_CACTURNE]       = {SPECIES_CACNEA, SPECIES_CACTURNE},\n    [SPECIES_SNORUNT ... SPECIES_GLALIE]        = {SPECIES_SNORUNT, SPECIES_GLALIE},\n    [SPECIES_LUNATONE]                          = {SPECIES_LUNATONE},\n    [SPECIES_SOLROCK]                           = {SPECIES_SOLROCK},\n    [SPECIES_SPOINK ... SPECIES_GRUMPIG]        = {SPECIES_SPOINK, SPECIES_GRUMPIG},\n    [SPECIES_PLUSLE]                            = {SPECIES_PLUSLE},\n    [SPECIES_MINUN]                             = {SPECIES_MINUN},\n    [SPECIES_MAWILE]                            = {SPECIES_MAWILE},\n    [SPECIES_MEDITITE ... SPECIES_MEDICHAM]     = {SPECIES_MEDITITE, SPECIES_MEDICHAM},\n    [SPECIES_SWABLU ... SPECIES_ALTARIA]        = {SPECIES_SWABLU, SPECIES_ALTARIA},\n    [SPECIES_WYNAUT]                            = {SPECIES_WYNAUT, SPECIES_WOBBUFFET},\n    [SPECIES_WOBBUFFET]                         = {SPECIES_WYNAUT, SPECIES_WOBBUFFET},\n    [SPECIES_DUSKULL ... SPECIES_DUSCLOPS]      = {SPECIES_DUSKULL, SPECIES_DUSCLOPS},\n    [SPECIES_ROSELIA]                           = {SPECIES_ROSELIA},\n    [SPECIES_SLAKOTH ... SPECIES_SLAKING]       = {SPECIES_SLAKOTH, SPECIES_VIGOROTH, SPECIES_SLAKING},\n    [SPECIES_GULPIN ... SPECIES_SWALOT]         = {SPECIES_GULPIN, SPECIES_SWALOT},\n    [SPECIES_TROPIUS]                           = {SPECIES_TROPIUS},\n    [SPECIES_WHISMUR ... SPECIES_EXPLOUD]       = {SPECIES_WHISMUR, SPECIES_LOUDRED, SPECIES_EXPLOUD},\n    [SPECIES_CLAMPERL ... SPECIES_GOREBYSS]     = {SPECIES_CLAMPERL, SPECIES_HUNTAIL, SPECIES_GOREBYSS},\n    [SPECIES_ABSOL]                             = {SPECIES_ABSOL},\n    [SPECIES_SHUPPET ... SPECIES_BANETTE]       = {SPECIES_SHUPPET, SPECIES_BANETTE},\n    [SPECIES_SEVIPER]                           = {SPECIES_SEVIPER},\n    [SPECIES_ZANGOOSE]                          = {SPECIES_ZANGOOSE},\n    [SPECIES_RELICANTH]                         = {SPECIES_RELICANTH},\n    [SPECIES_ARON ... SPECIES_AGGRON]           = {SPECIES_ARON, SPECIES_LAIRON, SPECIES_AGGRON},\n    [SPECIES_CASTFORM]                          = {SPECIES_CASTFORM},\n    [SPECIES_VOLBEAT]                           = {SPECIES_VOLBEAT},\n    [SPECIES_ILLUMISE]                          = {SPECIES_ILLUMISE},\n    [SPECIES_LILEEP ... SPECIES_CRADILY]        = {SPECIES_LILEEP, SPECIES_CRADILY},\n    [SPECIES_ANORITH ... SPECIES_ARMALDO]       = {SPECIES_ANORITH, SPECIES_ARMALDO},\n    [SPECIES_RALTS ... SPECIES_GARDEVOIR]       = {SPECIES_RALTS, SPECIES_KIRLIA, SPECIES_GARDEVOIR},\n    [SPECIES_BAGON ... SPECIES_SALAMENCE]       = {SPECIES_BAGON, SPECIES_SHELGON, SPECIES_SALAMENCE},\n    [SPECIES_BELDUM ... SPECIES_METAGROSS]      = {SPECIES_BELDUM, SPECIES_METANG, SPECIES_METAGROSS},\n    [SPECIES_REGIROCK]                          = {SPECIES_REGIROCK},\n    [SPECIES_REGICE]                            = {SPECIES_REGICE},\n    [SPECIES_REGISTEEL]                         = {SPECIES_REGISTEEL},\n    [SPECIES_KYOGRE]                            = {SPECIES_KYOGRE},\n    [SPECIES_GROUDON]                           = {SPECIES_GROUDON},\n    [SPECIES_RAYQUAZA]                          = {SPECIES_RAYQUAZA},\n    [SPECIES_LATIAS]                            = {SPECIES_LATIAS},\n    [SPECIES_LATIOS]                            = {SPECIES_LATIOS},\n    [SPECIES_JIRACHI]                           = {SPECIES_JIRACHI},\n    [SPECIES_DEOXYS]                            = {SPECIES_DEOXYS},\n    [SPECIES_CHIMECHO]                          = {SPECIES_CHIMECHO},\n};\n\nstatic const s8 sNatureStatTable[NUM_NATURES][NUM_NATURE_STATS] =\n{                      // Attack  Defense  Speed  Sp.Atk  Sp.Def\n    [NATURE_HARDY]   = {    0,      0,      0,      0,      0   },\n    [NATURE_LONELY]  = {   +1,     -1,      0,      0,      0   },\n    [NATURE_BRAVE]   = {   +1,      0,     -1,      0,      0   },\n    [NATURE_ADAMANT] = {   +1,      0,      0,     -1,      0   },\n    [NATURE_NAUGHTY] = {   +1,      0,      0,      0,     -1   },\n    [NATURE_BOLD]    = {   -1,     +1,      0,      0,      0   },\n    [NATURE_DOCILE]  = {    0,      0,      0,      0,      0   },\n    [NATURE_RELAXED] = {    0,     +1,     -1,      0,      0   },\n    [NATURE_IMPISH]  = {    0,     +1,      0,     -1,      0   },\n    [NATURE_LAX]     = {    0,     +1,      0,      0,     -1   },\n    [NATURE_TIMID]   = {   -1,      0,     +1,      0,      0   },\n    [NATURE_HASTY]   = {    0,     -1,     +1,      0,      0   },\n    [NATURE_SERIOUS] = {    0,      0,      0,      0,      0   },\n    [NATURE_JOLLY]   = {    0,      0,     +1,     -1,      0   },\n    [NATURE_NAIVE]   = {    0,      0,     +1,      0,     -1   },\n    [NATURE_MODEST]  = {   -1,      0,      0,     +1,      0   },\n    [NATURE_MILD]    = {    0,     -1,      0,     +1,      0   },\n    [NATURE_QUIET]   = {    0,      0,     -1,     +1,      0   },\n    [NATURE_BASHFUL] = {    0,      0,      0,      0,      0   },\n    [NATURE_RASH]    = {    0,      0,      0,     +1,     -1   },\n    [NATURE_CALM]    = {   -1,      0,      0,      0,     +1   },\n    [NATURE_GENTLE]  = {    0,     -1,      0,      0,     +1   },\n    [NATURE_SASSY]   = {    0,      0,     -1,      0,     +1   },\n    [NATURE_CAREFUL] = {    0,      0,      0,     -1,     +1   },\n    [NATURE_QUIRKY]  = {    0,      0,      0,      0,      0   },\n};\n\n#include \"data/pokemon/tmhm_learnsets.h\"\n#include \"data/pokemon/trainer_class_lookups.h\"\n#include \"data/pokemon/cry_ids.h\"\n#include \"data/pokemon/experience_tables.h\"\n#include \"data/pokemon/species_info.h\"\n#include \"data/pokemon/level_up_learnsets.h\"\n#include \"data/pokemon/evolution.h\"\n#include \"data/pokemon/level_up_learnset_pointers.h\"\n\nstatic const s8 sPokeblockFlavorCompatibilityTable[NUM_NATURES * FLAVOR_COUNT] =\n{\n    // Cool, Beauty, Cute, Smart, Tough\n          0,      0,    0,     0,     0, // Hardy\n          1,      0,    0,     0,    -1, // Lonely\n          1,      0,   -1,     0,     0, // Brave\n          1,     -1,    0,     0,     0, // Adamant\n          1,      0,    0,    -1,     0, // Naughty\n         -1,      0,    0,     0,     1, // Bold\n          0,      0,    0,     0,     0, // Docile\n          0,      0,   -1,     0,     1, // Relaxed\n          0,     -1,    0,     0,     1, // Impish\n          0,      0,    0,    -1,     1, // Lax\n         -1,      0,    1,     0,     0, // Timid\n          0,      0,    1,     0,    -1, // Hasty\n          0,      0,    0,     0,     0, // Serious\n          0,     -1,    1,     0,     0, // Jolly\n          0,      0,    1,    -1,     0, // Naive\n         -1,      1,    0,     0,     0, // Modest\n          0,      1,    0,     0,    -1, // Mild\n          0,      1,   -1,     0,     0, // Quiet\n          0,      0,    0,     0,     0, // Bashful\n          0,      1,    0,    -1,     0, // Rash\n         -1,      0,    0,     1,     0, // Calm\n          0,      0,    0,     1,    -1, // Gentle\n          0,      0,   -1,     1,     0, // Sassy\n          0,     -1,    0,     1,     0, // Careful\n          0,      0,    0,     0,     0  // Quirky\n};\n\n#define PP_UP_SHIFTS(val)           val,        (val) << 2,        (val) << 4,        (val) << 6\n#define PP_UP_SHIFTS_INV(val) (u8)~(val), (u8)~((val) << 2), (u8)~((val) << 4), (u8)~((val) << 6)\n\n// PP Up bonuses are stored for a Pokémon as a single byte.\n// There are 2 bits (a value 0-3) for each move slot that\n// represent how many PP Ups have been applied.\n// The following arrays take a move slot id and return:\n// gPPUpGetMask - A mask to get the number of PP Ups applied to that move slot\n// gPPUpClearMask - A mask to clear the number of PP Ups applied to that move slot\n// gPPUpAddValues - A value to add to the PP Bonuses byte to apply 1 PP Up to that move slot\nconst u8 gPPUpGetMask[MAX_MON_MOVES]   = {PP_UP_SHIFTS(3)};\nconst u8 gPPUpClearMask[MAX_MON_MOVES] = {PP_UP_SHIFTS_INV(3)};\nconst u8 gPPUpAddValues[MAX_MON_MOVES] = {PP_UP_SHIFTS(1)};\n\nconst u8 gStatStageRatios[MAX_STAT_STAGE + 1][2] =\n{\n    {10, 40}, // -6, MIN_STAT_STAGE\n    {10, 35}, // -5\n    {10, 30}, // -4\n    {10, 25}, // -3\n    {10, 20}, // -2\n    {10, 15}, // -1\n    {10, 10}, //  0, DEFAULT_STAT_STAGE\n    {15, 10}, // +1\n    {20, 10}, // +2\n    {25, 10}, // +3\n    {30, 10}, // +4\n    {35, 10}, // +5\n    {40, 10}, // +6, MAX_STAT_STAGE\n};\n\nstatic const u8 sText_GameFreak[] = _(\"ゲーフリ\");\n\nstatic const u8 sHoldEffectToType[][2] = \n{\n    {HOLD_EFFECT_BUG_POWER, TYPE_BUG},\n    {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL},\n    {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND},\n    {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK},\n    {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS},\n    {HOLD_EFFECT_DARK_POWER, TYPE_DARK},\n    {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING},\n    {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC},\n    {HOLD_EFFECT_WATER_POWER, TYPE_WATER},\n    {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING},\n    {HOLD_EFFECT_POISON_POWER, TYPE_POISON},\n    {HOLD_EFFECT_ICE_POWER, TYPE_ICE},\n    {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST},\n    {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC},\n    {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE},\n    {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON},\n    {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL},\n};\n\nconst struct SpriteTemplate gSpriteTemplates_Battlers[MAX_BATTLERS_COUNT] = \n{\n    [B_POSITION_PLAYER_LEFT] = {\n        .tileTag = TAG_NONE,\n        .paletteTag = 0,\n        .oam = &gOamData_BattlerPlayer,\n        .anims = NULL, \n        .images = gBattlerPicTable_PlayerLeft,\n        .affineAnims = gAffineAnims_BattleSpritePlayerSide,\n        .callback = SpriteCB_AllyMon,\n    },\n    [B_POSITION_OPPONENT_LEFT] = {\n        .tileTag = TAG_NONE,\n        .paletteTag = 0,\n        .oam = &gOamData_BattlerOpponent,\n        .anims = NULL, \n        .images = gBattlerPicTable_OpponentLeft,\n        .affineAnims = gAffineAnims_BattleSpriteOpponentSide,\n        .callback = SpriteCB_EnemyMon,\n    },\n    [B_POSITION_PLAYER_RIGHT] = {\n        .tileTag = TAG_NONE,\n        .paletteTag = 0,\n        .oam = &gOamData_BattlerPlayer,\n        .anims = NULL, \n        .images = gBattlerPicTable_PlayerRight,\n        .affineAnims = gAffineAnims_BattleSpritePlayerSide,\n        .callback = SpriteCB_AllyMon,\n    },\n    [B_POSITION_OPPONENT_RIGHT] = {\n        .tileTag = TAG_NONE,\n        .paletteTag = 0,\n        .oam = &gOamData_BattlerOpponent,\n        .anims = NULL, \n        .images = gBattlerPicTable_OpponentRight,\n        .affineAnims = gAffineAnims_BattleSpriteOpponentSide,\n        .callback = SpriteCB_EnemyMon,\n    },\n};\n\nstatic const struct SpriteTemplate sTrainerBackSpriteTemplates[] = \n{\n    [TRAINER_BACK_PIC_RED] = {\n        .tileTag = TAG_NONE,\n        .paletteTag = 0,\n        .oam = &gOamData_BattlerPlayer,\n        .anims = NULL, \n        .images = gTrainerBackPicTable_Red,\n        .affineAnims = gAffineAnims_BattleSpritePlayerSide,\n        .callback = SpriteCB_AllyMon,\n    },\n    [TRAINER_BACK_PIC_LEAF] = {\n        .tileTag = TAG_NONE,\n        .paletteTag = 0,\n        .oam = &gOamData_BattlerPlayer,\n        .anims = NULL, \n        .images = gTrainerBackPicTable_Leaf,\n        .affineAnims = gAffineAnims_BattleSpritePlayerSide,\n        .callback = SpriteCB_AllyMon,\n    },\n    [TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN] = {\n        .tileTag = TAG_NONE,\n        .paletteTag = 0,\n        .oam = &gOamData_BattlerPlayer,\n        .anims = NULL, \n        .images = gTrainerBackPicTable_RSBrendan,\n        .affineAnims = gAffineAnims_BattleSpritePlayerSide,\n        .callback = SpriteCB_AllyMon,\n    },\n    [TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY] = {\n        .tileTag = TAG_NONE,\n        .paletteTag = 0,\n        .oam = &gOamData_BattlerPlayer,\n        .anims = NULL, \n        .images = gTrainerBackPicTable_RSMay,\n        .affineAnims = gAffineAnims_BattleSpritePlayerSide,\n        .callback = SpriteCB_AllyMon,\n    },\n    [TRAINER_BACK_PIC_POKEDUDE] = {\n        .tileTag = TAG_NONE,\n        .paletteTag = 0,\n        .oam = &gOamData_BattlerPlayer,\n        .anims = NULL, \n        .images = gTrainerBackPicTable_Pokedude,\n        .affineAnims = gAffineAnims_BattleSpritePlayerSide,\n        .callback = SpriteCB_AllyMon,\n    },\n    [TRAINER_BACK_PIC_OLD_MAN] = {\n        .tileTag = TAG_NONE,\n        .paletteTag = 0,\n        .oam = &gOamData_BattlerPlayer,\n        .anims = NULL, \n        .images = gTrainerBackPicTable_OldMan,\n        .affineAnims = gAffineAnims_BattleSpritePlayerSide,\n        .callback = SpriteCB_AllyMon,\n    },\n    [TRAINER_BACK_PIC_EMERALD_BRENDAN] = {\n        .tileTag = TAG_NONE,\n        .paletteTag = 0,\n        .oam = &gOamData_BattlerPlayer,\n        .anims = NULL, \n        .images = gTrainerBackPicTable_EmBrendan,\n        .affineAnims = gAffineAnims_BattleSpritePlayerSide,\n        .callback = SpriteCB_AllyMon,\n    },\n    [TRAINER_BACK_PIC_EMERALD_MAY] = {\n        .tileTag = TAG_NONE,\n        .paletteTag = 0,\n        .oam = &gOamData_BattlerPlayer,\n        .anims = NULL, \n        .images = gTrainerBackPicTable_EmMay,\n        .affineAnims = gAffineAnims_BattleSpritePlayerSide,\n        .callback = SpriteCB_AllyMon,\n    },\n};\n\n// Classes dummied out\n#define NUM_SECRET_BASE_CLASSES 5\nstatic const u8 sSecretBaseFacilityClasses[GENDER_COUNT][NUM_SECRET_BASE_CLASSES] = \n{\n    [MALE] = {\n        FACILITY_CLASS_YOUNGSTER,\n        FACILITY_CLASS_YOUNGSTER,\n        FACILITY_CLASS_YOUNGSTER,\n        FACILITY_CLASS_YOUNGSTER,\n        FACILITY_CLASS_YOUNGSTER\n    },\n    [FEMALE] = {\n        FACILITY_CLASS_YOUNGSTER,\n        FACILITY_CLASS_YOUNGSTER,\n        FACILITY_CLASS_YOUNGSTER,\n        FACILITY_CLASS_YOUNGSTER,\n        FACILITY_CLASS_YOUNGSTER\n    },\n};\n\nstatic const u8 sGetMonDataEVConstants[] = \n{\n    MON_DATA_HP_EV,\n    MON_DATA_ATK_EV,\n    MON_DATA_DEF_EV,\n    MON_DATA_SPEED_EV,\n    MON_DATA_SPDEF_EV,\n    MON_DATA_SPATK_EV\n};\n\n// For stat-raising items\nstatic const u8 sStatsToRaise[] = \n{\n    STAT_ATK, STAT_ATK, STAT_SPEED, STAT_DEF, STAT_SPATK, STAT_ACC\n};\n\n// 3 modifiers each for how much to change friendship for different ranges\n// 0-99, 100-199, 200+\nstatic const s8 sFriendshipEventDeltas[][3] = \n{\n    [FRIENDSHIP_EVENT_GROW_LEVEL]           = { 5,  3,  2 },\n    [FRIENDSHIP_EVENT_VITAMIN]              = { 5,  3,  2 },\n    [FRIENDSHIP_EVENT_BATTLE_ITEM]          = { 1,  1,  0 },\n    [FRIENDSHIP_EVENT_LEAGUE_BATTLE]        = { 3,  2,  1 },\n    [FRIENDSHIP_EVENT_LEARN_TMHM]           = { 1,  1,  0 },\n    [FRIENDSHIP_EVENT_WALKING]              = { 1,  1,  1 },\n    [FRIENDSHIP_EVENT_MASSAGE]              = { 3,  3,  3 },\n    [FRIENDSHIP_EVENT_FAINT_SMALL]          = {-1, -1, -1 },\n    [FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE] = {-5, -5, -10 },\n    [FRIENDSHIP_EVENT_FAINT_LARGE]          = {-5, -5, -10 },\n};\n\n#define HM_MOVES_END 0xFFFF\n\nstatic const u16 sHMMoves[] = \n{\n    MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH,\n    MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, HM_MOVES_END\n};\n\nstatic const u16 sDeoxysBaseStats[][6] = {\n    {   //Normal Forme\n        [STAT_HP]    = 50,\n        [STAT_ATK]   = 150,\n        [STAT_DEF]   = 50,\n        [STAT_SPEED] = 150,\n        [STAT_SPATK] = 150,\n        [STAT_SPDEF] = 50\n    },\n    {   //Attack Forme\n        [STAT_HP]    = 50,\n        [STAT_ATK]   = 180,\n        [STAT_DEF]   = 20,\n        [STAT_SPEED] = 150,\n        [STAT_SPATK] = 180,\n        [STAT_SPDEF] = 20\n    },\n    {   //Defense Forme\n        [STAT_HP]    = 50,\n        [STAT_ATK]   = 70,\n        [STAT_DEF]   = 160,\n        [STAT_SPEED] = 90,\n        [STAT_SPATK] = 70,\n        [STAT_SPDEF] = 160\n    },\n    {   //Speed Forme\n        [STAT_HP]    = 50,\n        [STAT_ATK]   = 95,\n        [STAT_DEF]   = 90,\n        [STAT_SPEED] = 180,\n        [STAT_SPATK] = 95,\n        [STAT_SPDEF] = 90\n    }\n};\n\nstatic const u16 sDeoxysLevelUpLearnsets[][15] = {\n    { //Normal Forme\n        LEVEL_UP_MOVE( 1, MOVE_LEER),\n        LEVEL_UP_MOVE( 1, MOVE_LEER),\n        LEVEL_UP_MOVE( 1, MOVE_LEER),\n        LEVEL_UP_MOVE( 1, MOVE_WRAP),\n        LEVEL_UP_MOVE( 5, MOVE_NIGHT_SHADE),\n        LEVEL_UP_MOVE(10, MOVE_TELEPORT),\n        LEVEL_UP_MOVE(15, MOVE_KNOCK_OFF),\n        LEVEL_UP_MOVE(20, MOVE_PURSUIT),\n        LEVEL_UP_MOVE(25, MOVE_PSYCHIC),\n        LEVEL_UP_MOVE(30, MOVE_SNATCH),\n        LEVEL_UP_MOVE(35, MOVE_COSMIC_POWER),\n        LEVEL_UP_MOVE(40, MOVE_RECOVER),\n        LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST),\n        LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM),\n        LEVEL_UP_END\n    },\n    { //Attack Forme\n        LEVEL_UP_MOVE( 1, MOVE_LEER),\n        LEVEL_UP_MOVE( 1, MOVE_LEER),\n        LEVEL_UP_MOVE( 1, MOVE_LEER),\n        LEVEL_UP_MOVE( 1, MOVE_WRAP),\n        LEVEL_UP_MOVE( 5, MOVE_NIGHT_SHADE),\n        LEVEL_UP_MOVE(10, MOVE_TELEPORT),\n        LEVEL_UP_MOVE(15, MOVE_TAUNT),\n        LEVEL_UP_MOVE(20, MOVE_PURSUIT),\n        LEVEL_UP_MOVE(25, MOVE_PSYCHIC),\n        LEVEL_UP_MOVE(30, MOVE_SUPERPOWER),\n        LEVEL_UP_MOVE(35, MOVE_COSMIC_POWER),\n        LEVEL_UP_MOVE(40, MOVE_ZAP_CANNON),\n        LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST),\n        LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM),\n        LEVEL_UP_END\n    },\n    { //Defense Forme\n        LEVEL_UP_MOVE( 1, MOVE_LEER),\n        LEVEL_UP_MOVE( 1, MOVE_WRAP),\n        LEVEL_UP_MOVE( 5, MOVE_NIGHT_SHADE),\n        LEVEL_UP_MOVE(10, MOVE_TELEPORT),\n        LEVEL_UP_MOVE(15, MOVE_KNOCK_OFF),\n        LEVEL_UP_MOVE(20, MOVE_SPIKES),\n        LEVEL_UP_MOVE(25, MOVE_PSYCHIC),\n        LEVEL_UP_MOVE(30, MOVE_SNATCH),\n        LEVEL_UP_MOVE(35, MOVE_IRON_DEFENSE),\n        LEVEL_UP_MOVE(35, MOVE_AMNESIA),\n        LEVEL_UP_MOVE(40, MOVE_RECOVER),\n        LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST),\n        LEVEL_UP_MOVE(50, MOVE_COUNTER),\n        LEVEL_UP_MOVE(50, MOVE_MIRROR_COAT),\n        LEVEL_UP_END\n    },\n    { //Speed Forme\n        LEVEL_UP_MOVE( 1, MOVE_LEER),\n        LEVEL_UP_MOVE( 1, MOVE_LEER),\n        LEVEL_UP_MOVE( 1, MOVE_LEER),\n        LEVEL_UP_MOVE( 1, MOVE_WRAP),\n        LEVEL_UP_MOVE( 5, MOVE_NIGHT_SHADE),\n        LEVEL_UP_MOVE(10, MOVE_DOUBLE_TEAM),\n        LEVEL_UP_MOVE(15, MOVE_KNOCK_OFF),\n        LEVEL_UP_MOVE(20, MOVE_PURSUIT),\n        LEVEL_UP_MOVE(25, MOVE_PSYCHIC),\n        LEVEL_UP_MOVE(30, MOVE_SWIFT),\n        LEVEL_UP_MOVE(35, MOVE_AGILITY),\n        LEVEL_UP_MOVE(40, MOVE_RECOVER),\n        LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST),\n        LEVEL_UP_MOVE(50, MOVE_EXTREME_SPEED),\n        LEVEL_UP_END\n    }\n};\n\n// The classes used by other players in the Union Room.\n// These should correspond with the overworld graphics in sUnionRoomObjGfxIds\nconst u16 gUnionRoomFacilityClasses[NUM_UNION_ROOM_CLASSES * GENDER_COUNT] = \n{\n    // Male\n    FACILITY_CLASS_COOLTRAINER_M,\n    FACILITY_CLASS_BLACK_BELT,\n    FACILITY_CLASS_CAMPER,\n    FACILITY_CLASS_YOUNGSTER,\n    FACILITY_CLASS_PSYCHIC_M,\n    FACILITY_CLASS_BUG_CATCHER,\n    FACILITY_CLASS_TAMER,\n    FACILITY_CLASS_JUGGLER,\n    // Female\n    FACILITY_CLASS_COOLTRAINER_F,\n    FACILITY_CLASS_CHANNELER,\n    FACILITY_CLASS_PICNICKER,\n    FACILITY_CLASS_LASS,\n    FACILITY_CLASS_PSYCHIC_F,\n    FACILITY_CLASS_CRUSH_GIRL,\n    FACILITY_CLASS_PKMN_BREEDER,\n    FACILITY_CLASS_BEAUTY,\n};\n\nstatic const struct OamData sOamData_64x64 = \n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_64x64 = \n{\n    .tileTag = TAG_NONE,\n    .paletteTag = TAG_NONE,\n    .oam = &sOamData_64x64,\n    .anims = gDummySpriteAnimTable, \n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nvoid ZeroBoxMonData(struct BoxPokemon *boxMon)\n{\n    u8 *raw = (u8 *)boxMon;\n    u32 i;\n    for (i = 0; i < sizeof(struct BoxPokemon); i++)\n        raw[i] = 0;\n}\n\nvoid ZeroMonData(struct Pokemon *mon)\n{\n    u32 arg;\n    ZeroBoxMonData(&mon->box);\n    arg = 0;\n    SetMonData(mon, MON_DATA_STATUS, &arg);\n    SetMonData(mon, MON_DATA_LEVEL, &arg);\n    SetMonData(mon, MON_DATA_HP, &arg);\n    SetMonData(mon, MON_DATA_MAX_HP, &arg);\n    SetMonData(mon, MON_DATA_ATK, &arg);\n    SetMonData(mon, MON_DATA_DEF, &arg);\n    SetMonData(mon, MON_DATA_SPEED, &arg);\n    SetMonData(mon, MON_DATA_SPATK, &arg);\n    SetMonData(mon, MON_DATA_SPDEF, &arg);\n    arg = MAIL_NONE;\n    SetMonData(mon, MON_DATA_MAIL, &arg);\n}\n\nvoid ZeroPlayerPartyMons(void)\n{\n    s32 i;\n    for (i = 0; i < PARTY_SIZE; i++)\n        ZeroMonData(&gPlayerParty[i]);\n}\n\nvoid ZeroEnemyPartyMons(void)\n{\n    s32 i;\n    for (i = 0; i < PARTY_SIZE; i++)\n        ZeroMonData(&gEnemyParty[i]);\n}\n\nvoid CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)\n{\n    u32 arg;\n    ZeroMonData(mon);\n    CreateBoxMon(&mon->box, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId);\n    SetMonData(mon, MON_DATA_LEVEL, &level);\n    arg = MAIL_NONE;\n    SetMonData(mon, MON_DATA_MAIL, &arg);\n    CalculateMonStats(mon, FALSE);\n}\n\nvoid CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)\n{\n    u8 speciesName[POKEMON_NAME_LENGTH + 1];\n    u32 personality;\n    u32 value;\n    u16 checksum;\n    u8 version;\n\n    ZeroBoxMonData(boxMon);\n\n    if (hasFixedPersonality)\n        personality = fixedPersonality;\n    else\n        personality = Random32();\n\n    SetBoxMonData(boxMon, MON_DATA_PERSONALITY, &personality);\n\n    //Determine original trainer ID\n    if (otIdType == OT_ID_RANDOM_NO_SHINY) //Pokemon cannot be shiny\n    {\n        u32 shinyValue;\n        do\n        {\n            value = Random32();\n            shinyValue = GET_SHINY_VALUE(value, personality);\n        } while (shinyValue < SHINY_ODDS);\n    }\n    else if (otIdType == OT_ID_PRESET) //Pokemon has a preset OT ID\n    {\n        value = fixedOtId;\n    }\n    else //Player is the OT\n    {\n        value = gSaveBlock2Ptr->playerTrainerId[0]\n              | (gSaveBlock2Ptr->playerTrainerId[1] << 8)\n              | (gSaveBlock2Ptr->playerTrainerId[2] << 16)\n              | (gSaveBlock2Ptr->playerTrainerId[3] << 24);\n    }\n\n    SetBoxMonData(boxMon, MON_DATA_OT_ID, &value);\n\n    checksum = CalculateBoxMonChecksum(boxMon);\n    SetBoxMonData(boxMon, MON_DATA_CHECKSUM, &checksum);\n    EncryptBoxMon(boxMon);\n    bufferspeciesname(speciesName, species);\n    SetBoxMonData(boxMon, MON_DATA_NICKNAME, speciesName);\n    SetBoxMonData(boxMon, MON_DATA_LANGUAGE, &gGameLanguage);\n    SetBoxMonData(boxMon, MON_DATA_OT_NAME, gSaveBlock2Ptr->playerName);\n    SetBoxMonData(boxMon, MON_DATA_SPECIES, &species);\n    SetBoxMonData(boxMon, MON_DATA_EXP, &gExperienceTables[gSpeciesInfo[species].growthRate][level]);\n    SetBoxMonData(boxMon, MON_DATA_FRIENDSHIP, &gSpeciesInfo[species].friendship);\n    value = GetCurrentRegionMapSectionId();\n    SetBoxMonData(boxMon, MON_DATA_MET_LOCATION, &value);\n    SetBoxMonData(boxMon, MON_DATA_MET_LEVEL, &level);\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        version = VERSION_FIRE_RED;\n    }\n    else\n    {\n        version = VERSION_LEAF_GREEN;\n    }\n    SetBoxMonData(boxMon, MON_DATA_MET_GAME, &version);\n    value = ITEM_POKE_BALL;\n    SetBoxMonData(boxMon, MON_DATA_POKEBALL, &value);\n    SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender);\n\n    if (fixedIV < USE_RANDOM_IVS)\n    {\n        SetBoxMonData(boxMon, MON_DATA_HP_IV, &fixedIV);\n        SetBoxMonData(boxMon, MON_DATA_ATK_IV, &fixedIV);\n        SetBoxMonData(boxMon, MON_DATA_DEF_IV, &fixedIV);\n        SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &fixedIV);\n        SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &fixedIV);\n        SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &fixedIV);\n    }\n    else\n    {\n        u32 iv;\n        value = Random();\n\n        iv = value & MAX_IV_MASK;\n        SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv);\n        iv = (value & (MAX_IV_MASK << 5)) >> 5;\n        SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv);\n        iv = (value & (MAX_IV_MASK << 10)) >> 10;\n        SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv);\n\n        value = Random();\n\n        iv = value & MAX_IV_MASK;\n        SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv);\n        iv = (value & (MAX_IV_MASK << 5)) >> 5;\n        SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv);\n        iv = (value & (MAX_IV_MASK << 10)) >> 10;\n        SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv);\n    }\n\n    if (gSpeciesInfo[species].abilities[1])\n    {\n        value = personality & 1;\n        SetBoxMonData(boxMon, MON_DATA_ABILITY_NUM, &value);\n    }\n\n    GiveBoxMonInitialMoveset(boxMon);\n}\n\nvoid CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature)\n{\n    u32 personality;\n\n    do\n    {\n        personality = Random32();\n    }\n    while (nature != GetNatureFromPersonality(personality));\n\n    CreateMon(mon, species, level, fixedIV, TRUE, personality, OT_ID_PLAYER_ID, 0);\n}\n\nvoid CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter)\n{\n    u32 personality;\n\n    if ((u8)(unownLetter - 1) < NUM_UNOWN_FORMS)\n    {\n        u16 actualLetter;\n\n        do\n        {\n            personality = Random32();\n            actualLetter = GET_UNOWN_LETTER(personality);\n        }\n        while (nature != GetNatureFromPersonality(personality)\n            || gender != GetGenderFromSpeciesAndPersonality(species, personality)\n            || actualLetter != unownLetter - 1);\n    }\n    else\n    {\n        do\n        {\n            personality = Random32();\n        }\n        while (nature != GetNatureFromPersonality(personality)\n            || gender != GetGenderFromSpeciesAndPersonality(species, personality));\n    }\n\n    CreateMon(mon, species, level, fixedIV, TRUE, personality, OT_ID_PLAYER_ID, 0);\n}\n\nvoid CreateMonWithGenderNatureAbility(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 abilityNum)\n{\n    u32 personality;\n\n    if(gSpeciesInfo[species].genderRatio == MON_GENDERLESS\n    || gSpeciesInfo[species].genderRatio == MON_FEMALE\n    || gSpeciesInfo[species].genderRatio == MON_MALE) //don't get stuck on forcing gender if set gender\n    {\n        do\n        {\n            personality = Random32();\n        }\n        while (nature != GetNatureFromPersonality(personality)\n            || abilityNum != personality % 2);\n    }\n    else\n    {\n        do\n        {\n            personality = Random32();\n        }\n        while (nature != GetNatureFromPersonality(personality)\n            || gender != GetGenderFromSpeciesAndPersonality(species, personality)\n            || abilityNum != personality % 2);\n    }\n    if(fixedIV == 31 || fixedIV == 255)\n    {\n        fixedIV = 31;\n        CreateMon(mon, species, level, fixedIV, 1, personality, OT_ID_RANDOM_NO_SHINY, 0);\n    }\n    else if(fixedIV == 1) //hidden power Ghost IVs\n    {\n        u8 ivs[NUM_STATS] = {31, 31, 30, 31, 31, 30};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else if(fixedIV == 2) //hidden power Ground IVs\n    {\n        u8 ivs[NUM_STATS] = {31, 31, 31, 31, 30, 30};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else if(fixedIV == 3) //hidden power Flying IVs\n    {\n        u8 ivs[NUM_STATS] = {31, 31, 31, 30, 30, 30};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else if(fixedIV == 4) //hidden power Fighting IVs\n    {\n        u8 ivs[NUM_STATS] = {31, 31, 30, 30, 30, 30};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else if(fixedIV == 5) //hidden power Bug IVs\n    {\n        u8 ivs[NUM_STATS] = {31, 31, 31, 30, 31, 30};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else if(fixedIV == 6) //hidden power Rock IVs\n    {\n        u8 ivs[NUM_STATS] = {31, 31, 30, 30, 31, 30};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else if(fixedIV == 7) //hidden power Grass IVs\n    {\n        u8 ivs[NUM_STATS] = {31, 30, 31, 31, 30, 31};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else if(fixedIV == 8) //hidden power Ice IVs\n    {\n        u8 ivs[NUM_STATS] = {31, 31, 31, 30, 31, 31};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else if(fixedIV == 9) //hidden power Fire IVs\n    {\n        u8 ivs[NUM_STATS] = {31, 31, 30, 30, 30, 31};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else if(fixedIV == 10) //hidden power Electric IVs\n    {\n        u8 ivs[NUM_STATS] = {31, 31, 31, 31, 30, 31};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else if(fixedIV == 11) //hidden power Water IVs\n    {\n        u8 ivs[NUM_STATS] = {31, 31, 31, 30, 30, 31};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else if (fixedIV == 12) // Challenge Erika's Victreebel\n    {\n        u8 ivs[NUM_STATS] = {30, 0, 30, 30, 9, 30};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else if (fixedIV == 13) // Challenge Erika's other mons\n    {\n        u8 ivs[NUM_STATS] = {30, 30, 30, 30, 30, 30};\n        CreateEnemyMonWithIVsPersonality(mon, species, level, ivs, personality);\n    }\n    else\n    {\n        CreateMon(mon, species, level, fixedIV, 1, personality, OT_ID_RANDOM_NO_SHINY, 0);\n    }\n}\n\nvoid CreateEnemyMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 personality)\n{\n    u32 i;\n    CreateMon(mon, species, level, 0, 1, personality, OT_ID_RANDOM_NO_SHINY, 0);\n    SetMonData(mon, MON_DATA_HP_IV, &ivs[0]);\n    SetMonData(mon, MON_DATA_ATK_IV, &ivs[1]);\n    SetMonData(mon, MON_DATA_DEF_IV, &ivs[2]);\n    SetMonData(mon, MON_DATA_SPEED_IV, &ivs[3]);\n    SetMonData(mon, MON_DATA_SPATK_IV, &ivs[4]);\n    SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[5]);\n    CalculateMonStats(mon, FALSE);\n}\n\n// Used to create the Old Man's Weedle?\nvoid CreateMaleMon(struct Pokemon *mon, u16 species, u8 level)\n{\n    u32 personality;\n    u32 otId;\n\n    do\n    {\n        otId = Random32();\n        personality = Random32();\n    }\n    while (GetGenderFromSpeciesAndPersonality(species, personality) != MON_MALE);\n    CreateMon(mon, species, level, USE_RANDOM_IVS, TRUE, personality, OT_ID_PRESET, otId);\n}\n\nvoid CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality)\n{   //used for roamer\n    CreateMon(mon, species, level, 0, TRUE, personality, OT_ID_PLAYER_ID, 0);\n    SetMonData(mon, MON_DATA_IVS, &ivs);\n    CalculateMonStats(mon, FALSE);\n}\n\nstatic void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId)\n{\n    CreateMon(mon, species, level, 0, FALSE, 0, OT_ID_PRESET, otId);\n    SetMonData(mon, MON_DATA_HP_IV, &ivs[STAT_HP]);\n    SetMonData(mon, MON_DATA_ATK_IV, &ivs[STAT_ATK]);\n    SetMonData(mon, MON_DATA_DEF_IV, &ivs[STAT_DEF]);\n    SetMonData(mon, MON_DATA_SPEED_IV, &ivs[STAT_SPEED]);\n    SetMonData(mon, MON_DATA_SPATK_IV, &ivs[STAT_SPATK]);\n    SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[STAT_SPDEF]);\n    CalculateMonStats(mon, FALSE);\n}\n\nvoid CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread)\n{\n    s32 i;\n    s32 statCount = 0;\n    u16 evAmount;\n    u8 evsBits;\n\n    CreateMon(mon, species, level, fixedIV, FALSE, 0, OT_ID_PLAYER_ID, 0);\n\n    evsBits = evSpread;\n\n    for (i = 0; i < NUM_STATS; i++)\n    {\n        if (evsBits & 1)\n            statCount++;\n        evsBits >>= 1;\n    }\n\n    evAmount = MAX_TOTAL_EVS / statCount;\n\n    evsBits = 1;\n\n    for (i = 0; i < NUM_STATS; i++)\n    {\n        if (evSpread & evsBits)\n            SetMonData(mon, MON_DATA_HP_EV + i, &evAmount);\n        evsBits <<= 1;\n    }\n\n    CalculateMonStats(mon, FALSE);\n}\n\nvoid CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src)\n{\n    s32 i;\n    u8 value;\n\n    CreateMon(mon, src->species, src->level, 0, TRUE, src->personality, OT_ID_PRESET, src->otId);\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n        SetMonMoveSlot(mon, src->moves[i], i);\n\n    SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses);\n    SetMonData(mon, MON_DATA_HELD_ITEM, &src->heldItem);\n\n    // Why is this commented out in FR/LG?\n    /*\n    StringCopy(nickname, src->nickname);\n\n    if (nickname[0] == EXT_CTRL_CODE_BEGIN && nickname[1] == EXT_CTRL_CODE_JPN)\n        language = LANGUAGE_JAPANESE;\n    else\n        language = GAME_LANGUAGE;\n\n    SetMonData(mon, MON_DATA_LANGUAGE, &language);\n    Text_StripExtCtrlCodes(nickname);\n    */\n\n    SetMonData(mon, MON_DATA_NICKNAME, &src->nickname);\n    SetMonData(mon, MON_DATA_FRIENDSHIP, &src->friendship);\n    SetMonData(mon, MON_DATA_HP_EV, &src->hpEV);\n    SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV);\n    SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV);\n    SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV);\n    SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV);\n    SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV);\n    value = src->abilityNum;\n    SetMonData(mon, MON_DATA_ABILITY_NUM, &value);\n    value = src->hpIV;\n    SetMonData(mon, MON_DATA_HP_IV, &value);\n    value = src->attackIV;\n    SetMonData(mon, MON_DATA_ATK_IV, &value);\n    value = src->defenseIV;\n    SetMonData(mon, MON_DATA_DEF_IV, &value);\n    value = src->speedIV;\n    SetMonData(mon, MON_DATA_SPEED_IV, &value);\n    value = src->spAttackIV;\n    SetMonData(mon, MON_DATA_SPATK_IV, &value);\n    value = src->spDefenseIV;\n    SetMonData(mon, MON_DATA_SPDEF_IV, &value);\n    CalculateMonStats(mon, TRUE);\n}\n\nstatic void CreateEventMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)\n{\n    bool32 isModernFatefulEncounter = TRUE;\n    u8 version = VERSION_EMERALD;\n    CreateMon(mon, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId);\n    SetMonData(mon, MON_DATA_MODERN_FATEFUL_ENCOUNTER, &isModernFatefulEncounter);\n    if(species == SPECIES_MEW || species == SPECIES_LATIAS || species == SPECIES_LATIOS)\n        SetMonData(mon, MON_DATA_MET_GAME, &version);\n}\n\nvoid ConvertPokemonToBattleTowerPokemon(struct Pokemon *mon, struct BattleTowerPokemon *dest)\n{\n    s32 i;\n    u16 heldItem;\n\n    dest->species = GetMonData(mon, MON_DATA_SPECIES, NULL);\n    heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL);\n\n    if (heldItem == ITEM_ENIGMA_BERRY)\n        heldItem = 0;\n\n    dest->heldItem = heldItem;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n        dest->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL);\n\n    dest->level = GetMonData(mon, MON_DATA_LEVEL, NULL);\n    dest->ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);\n    dest->otId = GetMonData(mon, MON_DATA_OT_ID, NULL);\n    dest->hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL);\n    dest->attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL);\n    dest->defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL);\n    dest->speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL);\n    dest->spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL);\n    dest->spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL);\n    dest->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL);\n    dest->hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL);\n    dest->attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL);\n    dest->defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL);\n    dest->speedIV  = GetMonData(mon, MON_DATA_SPEED_IV, NULL);\n    dest->spAttackIV  = GetMonData(mon, MON_DATA_SPATK_IV, NULL);\n    dest->spDefenseIV  = GetMonData(mon, MON_DATA_SPDEF_IV, NULL);\n    dest->abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL);\n    dest->personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);\n    GetMonData(mon, MON_DATA_NICKNAME, dest->nickname);\n}\n\nstatic u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon)\n{\n    u16 checksum = 0;\n    union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0);\n    union PokemonSubstruct *substruct1 = GetSubstruct(boxMon, boxMon->personality, 1);\n    union PokemonSubstruct *substruct2 = GetSubstruct(boxMon, boxMon->personality, 2);\n    union PokemonSubstruct *substruct3 = GetSubstruct(boxMon, boxMon->personality, 3);\n    s32 i;\n\n    for (i = 0; i < (s32)ARRAY_COUNT(substruct0->raw); i++)\n        checksum += substruct0->raw[i];\n\n    for (i = 0; i < (s32)ARRAY_COUNT(substruct1->raw); i++)\n        checksum += substruct1->raw[i];\n\n    for (i = 0; i < (s32)ARRAY_COUNT(substruct2->raw); i++)\n        checksum += substruct2->raw[i];\n\n    for (i = 0; i < (s32)ARRAY_COUNT(substruct3->raw); i++)\n        checksum += substruct3->raw[i];\n\n    return checksum;\n}\n\n#define CALC_STAT(base, iv, ev, statIndex, field)               \\\n{                                                               \\\n    u8 baseStat = gSpeciesInfo[species].base;                   \\\n    s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \\\n    u8 nature = GetNature(mon);                                 \\\n    n = ModifyStatByNature(nature, n, statIndex);               \\\n    SetMonData(mon, field, &n);                                 \\\n}\n\nvoid CalculateMonStats(struct Pokemon *mon, bool8 calcOverride)\n{\n    u8 ivCalcMode = gSaveBlock1Ptr->keyFlags.ivCalcMode;\n    u8 evCalcMode = gSaveBlock1Ptr->keyFlags.evCalcMode;\n\n    s32 oldMaxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL);\n    s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL);\n    s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL);\n    s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL);\n    s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL);\n    s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL);\n    s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL);\n    s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL);\n    s32 speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL);\n    s32 speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL);\n    s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL);\n    s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL);\n    s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL);\n    s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL);\n    u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);\n    s32 level = GetLevelFromMonExp(mon);\n    s32 newMaxHP;\n\n    if(!FlagGet(FLAG_SYS_IS_LINKING))\n    {\n        if(ivCalcMode == IV_CALC_PERFECT && calcOverride != TRUE)\n        {\n            hpIV = 31;\n            attackIV = 31;\n            defenseIV = 31;\n            speedIV = 31;\n            spAttackIV = 31;\n            spDefenseIV = 31;\n        }\n\n        if(ivCalcMode == IV_CALC_ZERO && calcOverride != TRUE)\n        {\n            hpIV = 0;\n            attackIV = 0;\n            defenseIV = 0;\n            speedIV = 0;\n            spAttackIV = 0;\n            spDefenseIV = 0;\n        }\n\n        if(evCalcMode == EV_CALC_ZERO && calcOverride != TRUE)\n        {\n            hpEV = 0;\n            attackEV = 0;\n            defenseEV = 0;\n            speedEV = 0;\n            spAttackEV = 0;\n            spDefenseEV = 0;\n        }\n    }\n    SetMonData(mon, MON_DATA_LEVEL, &level);\n\n    if (species == SPECIES_SHEDINJA)\n    {\n        newMaxHP = 1;\n    }\n    else\n    {\n        s32 n = 2 * gSpeciesInfo[species].baseHP + hpIV;\n        newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10;\n    }\n\n    gBattleScripting.levelUpHP = newMaxHP - oldMaxHP;\n    if (gBattleScripting.levelUpHP == 0)\n        gBattleScripting.levelUpHP = 1;\n\n    SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP);\n\n    CALC_STAT(baseAttack, attackIV, attackEV, STAT_ATK, MON_DATA_ATK)\n    CALC_STAT(baseDefense, defenseIV, defenseEV, STAT_DEF, MON_DATA_DEF)\n    CALC_STAT(baseSpeed, speedIV, speedEV, STAT_SPEED, MON_DATA_SPEED)\n    CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, STAT_SPATK, MON_DATA_SPATK)\n    CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, STAT_SPDEF, MON_DATA_SPDEF)\n\n    if (species == SPECIES_SHEDINJA)\n    {\n        if (currentHP != 0 || oldMaxHP == 0)\n            currentHP = 1;\n        else\n            return;\n    }\n    else\n    {\n        if (currentHP == 0 && oldMaxHP == 0)\n            currentHP = newMaxHP;\n        else if (currentHP != 0) {\n            currentHP += newMaxHP - oldMaxHP;\n            if (currentHP <= 0)\n                currentHP = 1;\n            if(currentHP > newMaxHP)\n                currentHP = newMaxHP;\n        }\n        else\n            return;\n    }\n\n    SetMonData(mon, MON_DATA_HP, &currentHP);\n}\n\nvoid BoxMonToMon(struct BoxPokemon *src, struct Pokemon *dest)\n{\n    u32 value = 0;\n    u32 statusField;\n    dest->box = *src;\n\n    if(gSaveBlock1Ptr->keyFlags.noPMC == 1)\n    {\n        value = GetBoxMonData(src, MON_DATA_BOX_STATUS, 0);\n        if(value < 8) //Sleep\n        {\n            statusField = value; //preserves sleep turns?\n        }\n        else\n        {\n            switch(value)\n            {\n                case 8: //PSN\n                    statusField = STATUS1_POISON;\n                    break;\n                case 9: //BRN\n                    statusField = STATUS1_BURN;\n                    break;\n                case 10: //FRZ\n                    statusField = STATUS1_FREEZE;\n                    break;\n                case 11: //PRZ\n                    statusField = STATUS1_PARALYSIS;\n                    break;\n                default: //FNT, none, or invalid\n                    statusField = 0;\n                    break;\n            }\n        }\n        SetMonData(dest, MON_DATA_STATUS, &statusField);\n    }\n    else\n    {\n        SetMonData(dest, MON_DATA_STATUS, &value); //to 0\n    }\n       \n    SetMonData(dest, MON_DATA_HP, &value);\n    SetMonData(dest, MON_DATA_MAX_HP, &value);\n    value = MAIL_NONE;\n    SetMonData(dest, MON_DATA_MAIL, &value);\n    CalculateMonStats(dest, FALSE);\n}\n\nstatic u8 GetLevelFromMonExp(struct Pokemon *mon)\n{\n    u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);\n    u32 exp = GetMonData(mon, MON_DATA_EXP, NULL);\n    s32 level = 1;\n\n    while (level <= MAX_LEVEL && gExperienceTables[gSpeciesInfo[species].growthRate][level] <= exp)\n        level++;\n\n    return level - 1;\n}\n\nu8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon)\n{\n    u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL);\n    u32 exp = GetBoxMonData(boxMon, MON_DATA_EXP, NULL);\n    s32 level = 1;\n\n    while (level <= MAX_LEVEL && gExperienceTables[gSpeciesInfo[species].growthRate][level] <= exp)\n        level++;\n\n    return level - 1;\n}\n\nu16 GiveMoveToMon(struct Pokemon *mon, u16 move)\n{\n    return GiveMoveToBoxMon(&mon->box, move);\n}\n\nstatic u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)\n{\n    s32 i;\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        u16 existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, NULL);\n        if (!existingMove)\n        {\n            SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &move);\n            SetBoxMonData(boxMon, MON_DATA_PP1 + i, &gBattleMoves[move].pp);\n            return move;\n        }\n        if (existingMove == move)\n            return MON_ALREADY_KNOWS_MOVE;\n    }\n    return MON_HAS_MAX_MOVES;\n}\n\nu16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move)\n{\n    s32 i;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        if (!mon->moves[i])\n        {\n            mon->moves[i] = move;\n            mon->pp[i] = gBattleMoves[move].pp;\n            return move;\n        }\n    }\n\n    return MON_HAS_MAX_MOVES;\n}\n\nvoid SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot)\n{\n    SetMonData(mon, MON_DATA_MOVE1 + slot, &move);\n    SetMonData(mon, MON_DATA_PP1 + slot, &gBattleMoves[move].pp);\n}\n\nvoid SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot)\n{\n    mon->moves[slot] = move;\n    mon->pp[slot] = gBattleMoves[move].pp;\n}\n\nstatic void GiveMonInitialMoveset(struct Pokemon *mon)\n{\n    GiveBoxMonInitialMoveset(&mon->box);\n}\n\nstatic void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon)\n{\n    u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL);\n    s32 level = GetLevelFromBoxMonExp(boxMon);\n    s32 i;\n\n    u8 deoxysForme;\n    if(species == SPECIES_DEOXYS)\n    {\n        deoxysForme = GetBoxMonData(boxMon, MON_DATA_FORME, NULL);\n        for (i = 0; sDeoxysLevelUpLearnsets[deoxysForme][i] != LEVEL_UP_END; i++)\n        {\n            u16 moveLevel;\n            u16 move;\n\n            moveLevel = (sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_LV);\n\n            if (moveLevel > (level << 9))\n                break;\n\n            move = (sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID);\n            if (GiveMoveToBoxMon(boxMon, move) == MON_HAS_MAX_MOVES)\n                DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, move);\n        }\n    }\n    else\n    {\n        for (i = 0; gLevelUpLearnsets[species][i] != LEVEL_UP_END; i++)\n        {\n            u16 moveLevel;\n            u16 move;\n\n            moveLevel = (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_LV);\n\n            if (moveLevel > (level << 9))\n                break;\n\n            move = (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID);\n\n            if (GiveMoveToBoxMon(boxMon, move) == MON_HAS_MAX_MOVES)\n                DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, move);\n        }\n    }\n}\n\nu16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove)\n{\n    u32 retVal = MOVE_NONE;\n    u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);\n    u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL);\n    u8 deoxysForme;\n\n    if(species == SPECIES_DEOXYS)\n    {\n        deoxysForme = GetMonData(mon, MON_DATA_FORME, NULL);\n        if (firstMove)\n        {\n            sLearningMoveTableID = 0;\n\n            while ((sDeoxysLevelUpLearnsets[deoxysForme][sLearningMoveTableID] & 0xFE00) != (level << 9))\n            {\n                sLearningMoveTableID++;\n                if (sDeoxysLevelUpLearnsets[deoxysForme][sLearningMoveTableID] == LEVEL_UP_END)\n                    return 0;\n            }\n        }\n\n        if ((sDeoxysLevelUpLearnsets[deoxysForme][sLearningMoveTableID] & 0xFE00) == (level << 9))\n        {\n            gMoveToLearn = (sDeoxysLevelUpLearnsets[deoxysForme][sLearningMoveTableID] & 0x1FF);\n            sLearningMoveTableID++;\n            retVal = GiveMoveToMon(mon, gMoveToLearn);\n        }\n    }\n    else\n    {\n        // since you can learn more than one move per level\n        // the game needs to know whether you decided to\n        // learn it or keep the old set to avoid asking\n        // you to learn the same move over and over again\n        if (firstMove)\n        {\n            sLearningMoveTableID = 0;\n\n            while ((gLevelUpLearnsets[species][sLearningMoveTableID] & LEVEL_UP_MOVE_LV) != (level << 9))\n            {\n                sLearningMoveTableID++;\n                if (gLevelUpLearnsets[species][sLearningMoveTableID] == LEVEL_UP_END)\n                    return MOVE_NONE;\n            }\n        }\n\n        if ((gLevelUpLearnsets[species][sLearningMoveTableID] & LEVEL_UP_MOVE_LV) == (level << 9))\n        {\n            gMoveToLearn = (gLevelUpLearnsets[species][sLearningMoveTableID] & LEVEL_UP_MOVE_ID);\n            sLearningMoveTableID++;\n            retVal = GiveMoveToMon(mon, gMoveToLearn);\n        }\n\n        return retVal;\n    }\n}\n\nvoid DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move)\n{\n    s32 i;\n    u16 moves[MAX_MON_MOVES];\n    u8 pp[MAX_MON_MOVES];\n    u8 ppBonuses;\n\n    for (i = 0; i < MAX_MON_MOVES - 1; i++)\n    {\n        moves[i] = GetMonData(mon, MON_DATA_MOVE2 + i, NULL);\n        pp[i] = GetMonData(mon, MON_DATA_PP2 + i, NULL);\n    }\n\n    ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);\n    ppBonuses >>= 2;\n    moves[MAX_MON_MOVES - 1] = move;\n    pp[MAX_MON_MOVES - 1] = gBattleMoves[move].pp;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        SetMonData(mon, MON_DATA_MOVE1 + i, &moves[i]);\n        SetMonData(mon, MON_DATA_PP1 + i, &pp[i]);\n    }\n\n    SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);\n}\n\nstatic void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)\n{\n    s32 i;\n    u16 moves[MAX_MON_MOVES];\n    u8 pp[MAX_MON_MOVES];\n    u8 ppBonuses;\n\n    for (i = 0; i < MAX_MON_MOVES - 1; i++)\n    {\n        moves[i] = GetBoxMonData(boxMon, MON_DATA_MOVE2 + i, NULL);\n        pp[i] = GetBoxMonData(boxMon, MON_DATA_PP2 + i, NULL);\n    }\n\n    ppBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, NULL);\n    ppBonuses >>= 2;\n    moves[MAX_MON_MOVES - 1] = move;\n    pp[MAX_MON_MOVES - 1] = gBattleMoves[move].pp;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &moves[i]);\n        SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp[i]);\n    }\n\n    SetBoxMonData(boxMon, MON_DATA_PP_BONUSES, &ppBonuses);\n}\n\n#define APPLY_STAT_MOD(var, mon, stat, statIndex)                                   \\\n{                                                                                   \\\n    (var) = (stat) * (gStatStageRatios)[(mon)->statStages[(statIndex)]][0];         \\\n    (var) /= (gStatStageRatios)[(mon)->statStages[(statIndex)]][1];                 \\\n}\n\n// Own function in pokeemerald\n#define ShouldGetStatBadgeBoost(flag, battler)\\\n    (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)) && FlagGet(flag) && gSaveBlock1Ptr->keyFlags.difficulty != DIFFICULTY_CHALLENGE && GetBattlerSide(battler) == B_SIDE_PLAYER)\n\ns32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 battlerIdAtk, u8 battlerIdDef)\n{\n    u32 i;\n    s32 damage = 0;\n    s32 damageHelper;\n    u8 type;\n    u16 attack, defense;\n    u16 spAttack, spDefense;\n    u8 defenderHoldEffect;\n    u8 defenderHoldEffectParam;\n    u8 attackerHoldEffect;\n    u8 attackerHoldEffectParam;\n\n    if (!powerOverride)\n    {\n        if(gBattleMoves[move].effect != EFFECT_HIDDEN_POWER)\n            gBattleMovePower = gBattleMoves[move].power;\n        else\n        {\n            s32 powerBits = ((attacker->hpIV & 2) >> 1)\n                         | ((attacker->attackIV & 2) << 0)\n                         | ((attacker->defenseIV & 2) << 1)\n                         | ((attacker->speedIV & 2) << 2)\n                         | ((attacker->spAttackIV & 2) << 3)\n                         | ((attacker->spDefenseIV & 2) << 4);\n\t\t\t  \n\t\t\tgBattleMovePower = (40 * powerBits) / 63 + 30;\n        }\n    }\n    else\n        gBattleMovePower = powerOverride;\n\n    if (!typeOverride)\n        type = gBattleMoves[move].type;\n    else\n        type = typeOverride & DYNAMIC_TYPE_MASK;\n\n    attack = attacker->attack;\n    defense = defender->defense;\n    spAttack = attacker->spAttack;\n    spDefense = defender->spDefense;\n\n    // Get attacker hold item info\n    if (attacker->item == ITEM_ENIGMA_BERRY)\n    {\n        attackerHoldEffect = gEnigmaBerries[battlerIdAtk].holdEffect;\n        attackerHoldEffectParam = gEnigmaBerries[battlerIdAtk].holdEffectParam;\n    }\n    else\n    {\n        attackerHoldEffect = ItemId_GetHoldEffect(attacker->item);\n        attackerHoldEffectParam = ItemId_GetHoldEffectParam(attacker->item);\n    }\n\n    // Get defender hold item info\n    if (defender->item == ITEM_ENIGMA_BERRY)\n    {\n        defenderHoldEffect = gEnigmaBerries[battlerIdDef].holdEffect;\n        defenderHoldEffectParam = gEnigmaBerries[battlerIdDef].holdEffectParam;\n    }\n    else\n    {\n        defenderHoldEffect = ItemId_GetHoldEffect(defender->item);\n        defenderHoldEffectParam = ItemId_GetHoldEffectParam(defender->item);\n    }\n\n    if (attacker->ability == ABILITY_HUGE_POWER || attacker->ability == ABILITY_PURE_POWER)\n        attack *= 2;\n\n    if (ShouldGetStatBadgeBoost(FLAG_BADGE01_GET, battlerIdAtk))\n        attack = (110 * attack) / 100;\n    if (ShouldGetStatBadgeBoost(FLAG_BADGE05_GET, battlerIdDef))\n        defense = (110 * defense) / 100;\n    if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerIdAtk))\n        spAttack = (110 * spAttack) / 100;\n    if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerIdDef))\n        spDefense = (110 * spDefense) / 100;\n\n    // Apply type-bonus hold item\n    for (i = 0; i < ARRAY_COUNT(sHoldEffectToType); i++)\n    {\n        if (attackerHoldEffect == sHoldEffectToType[i][0]\n            && type == sHoldEffectToType[i][1])\n        {\n            if (IS_TYPE_PHYSICAL(type))\n                attack = (attack * (attackerHoldEffectParam + 100)) / 100;\n            else\n                spAttack = (spAttack * (attackerHoldEffectParam + 100)) / 100;\n            break;\n        }\n    }\n\n    // Apply boosts from hold items\n    if (attackerHoldEffect == HOLD_EFFECT_CHOICE_BAND)\n        attack = (150 * attack) / 100;\n    if (attackerHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER)) && (attacker->species == SPECIES_LATIAS || attacker->species == SPECIES_LATIOS))\n        spAttack = (150 * spAttack) / 100;\n    if (defenderHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER)) && (defender->species == SPECIES_LATIAS || defender->species == SPECIES_LATIOS))\n        spDefense = (150 * spDefense) / 100;\n    if (attackerHoldEffect == HOLD_EFFECT_DEEP_SEA_TOOTH && attacker->species == SPECIES_CLAMPERL)\n        spAttack *= 2;\n    if (defenderHoldEffect == HOLD_EFFECT_DEEP_SEA_SCALE && defender->species == SPECIES_CLAMPERL)\n        spDefense *= 2;\n    if (attackerHoldEffect == HOLD_EFFECT_LIGHT_BALL && attacker->species == SPECIES_PIKACHU)\n        spAttack *= 2;\n    if (defenderHoldEffect == HOLD_EFFECT_METAL_POWDER && defender->species == SPECIES_DITTO)\n        defense *= 2;\n    if (attackerHoldEffect == HOLD_EFFECT_THICK_CLUB && (attacker->species == SPECIES_CUBONE || attacker->species == SPECIES_MAROWAK))\n        attack *= 2;\n    if (defender->ability == ABILITY_THICK_FAT && (type == TYPE_FIRE || type == TYPE_ICE))\n        spAttack /= 2;\n    if (attacker->ability == ABILITY_HUSTLE)\n        attack = (150 * attack) / 100;\n    if (attacker->ability == ABILITY_PLUS && ABILITY_ON_FIELD2(ABILITY_MINUS))\n        spAttack = (150 * spAttack) / 100;\n    if (attacker->ability == ABILITY_MINUS && ABILITY_ON_FIELD2(ABILITY_PLUS))\n        spAttack = (150 * spAttack) / 100;\n    if (attacker->ability == ABILITY_GUTS && attacker->status1)\n        attack = (150 * attack) / 100;\n    if (defender->ability == ABILITY_MARVEL_SCALE && defender->status1)\n        defense = (150 * defense) / 100;\n    if (type == TYPE_ELECTRIC && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_MUD_SPORT, 0))\n        gBattleMovePower /= 2;\n    if (type == TYPE_FIRE && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_WATER_SPORT, 0))\n        gBattleMovePower /= 2;\n    if (type == TYPE_GRASS && attacker->ability == ABILITY_OVERGROW && attacker->hp <= (attacker->maxHP / 3))\n        gBattleMovePower = (150 * gBattleMovePower) / 100;\n    if (type == TYPE_FIRE && attacker->ability == ABILITY_BLAZE && attacker->hp <= (attacker->maxHP / 3))\n        gBattleMovePower = (150 * gBattleMovePower) / 100;\n    if (type == TYPE_WATER && attacker->ability == ABILITY_TORRENT && attacker->hp <= (attacker->maxHP / 3))\n        gBattleMovePower = (150 * gBattleMovePower) / 100;\n    if (type == TYPE_BUG && attacker->ability == ABILITY_SWARM && attacker->hp <= (attacker->maxHP / 3))\n        gBattleMovePower = (150 * gBattleMovePower) / 100;\n\n    // Self-destruct / Explosion cut defense in half\n    if (gBattleMoves[gCurrentMove].effect == EFFECT_EXPLOSION)\n        defense /= 2;\n\n    if (IS_TYPE_PHYSICAL(type))\n    {\n        if (gCritMultiplier == 2)\n        {\n            // Critical hit, if attacker has lost attack stat stages then ignore stat drop\n            if (attacker->statStages[STAT_ATK] > DEFAULT_STAT_STAGE)\n                APPLY_STAT_MOD(damage, attacker, attack, STAT_ATK)\n            else\n                damage = attack;\n        }\n        else\n            APPLY_STAT_MOD(damage, attacker, attack, STAT_ATK)\n\n        damage = damage * gBattleMovePower;\n        damage *= (2 * attacker->level / 5 + 2);\n\n        if (gCritMultiplier == 2)\n        {\n            // Critical hit, if defender has gained defense stat stages then ignore stat increase\n            if (defender->statStages[STAT_DEF] < DEFAULT_STAT_STAGE)\n                APPLY_STAT_MOD(damageHelper, defender, defense, STAT_DEF)\n            else\n                damageHelper = defense;\n        }\n        else\n            APPLY_STAT_MOD(damageHelper, defender, defense, STAT_DEF)\n\n        damage = damage / damageHelper;\n        damage /= 50;\n\n        // Burn cuts attack in half\n        if ((attacker->status1 & STATUS1_BURN) && attacker->ability != ABILITY_GUTS)\n            damage /= 2;\n\n        // Apply Reflect\n        if ((sideStatus & SIDE_STATUS_REFLECT) && gCritMultiplier == 1)\n        {\n            if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2)\n                damage = 2 * (damage / 3);\n            else\n                damage /= 2;\n        }\n\n        // Moves hitting both targets do half damage in double battles\n        if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == MOVE_TARGET_BOTH && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2)\n            damage /= 2;\n\n        // Moves always do at least 1 damage.\n        if (damage == 0)\n            damage = 1;\n    }\n\n    if (type == TYPE_MYSTERY)\n        damage = 0; // is ??? type. does 0 damage.\n\n    if (IS_TYPE_SPECIAL(type))\n    {\n        if (gCritMultiplier == 2)\n        {\n            // Critical hit, if attacker has lost sp. attack stat stages then ignore stat drop\n            if (attacker->statStages[STAT_SPATK] > DEFAULT_STAT_STAGE)\n                APPLY_STAT_MOD(damage, attacker, spAttack, STAT_SPATK)\n            else\n                damage = spAttack;\n        }\n        else\n            APPLY_STAT_MOD(damage, attacker, spAttack, STAT_SPATK)\n\n        damage = damage * gBattleMovePower;\n        damage *= (2 * attacker->level / 5 + 2);\n\n        if (gCritMultiplier == 2)\n        {\n            // Critical hit, if defender has gained sp. defense stat stages then ignore stat increase\n            if (defender->statStages[STAT_SPDEF] < DEFAULT_STAT_STAGE)\n                APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_SPDEF)\n            else\n                damageHelper = spDefense;\n        }\n        else\n            APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_SPDEF)\n\n        damage = (damage / damageHelper);\n        damage /= 50;\n\n        // Apply Lightscreen\n        if ((sideStatus & SIDE_STATUS_LIGHTSCREEN) && gCritMultiplier == 1)\n        {\n            if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2)\n                damage = 2 * (damage / 3);\n            else\n                damage /= 2;\n        }\n\n        // Moves hitting both targets do half damage in double battles\n        if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == MOVE_TARGET_BOTH && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2)\n            damage /= 2;\n\n        // Are effects of weather negated with cloud nine or air lock\n        if (WEATHER_HAS_EFFECT2)\n        {\n            // Rain weakens Fire, boosts Water\n            if (gBattleWeather & B_WEATHER_RAIN_TEMPORARY)\n            {\n                switch (type)\n                {\n                case TYPE_FIRE:\n                    damage /= 2;\n                    break;\n                case TYPE_WATER:\n                    damage = (15 * damage) / 10;\n                    break;\n                }\n            }\n\n            // Any weather except sun weakens solar beam\n            if ((gBattleWeather & (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_HAIL_TEMPORARY)) && gCurrentMove == MOVE_SOLAR_BEAM)\n                damage /= 2;\n\n            // Sun boosts Fire, weakens Water\n            if (gBattleWeather & B_WEATHER_SUN)\n            {\n                switch (type)\n                {\n                case TYPE_FIRE:\n                    damage = (15 * damage) / 10;\n                    break;\n                case TYPE_WATER:\n                    damage /= 2;\n                    break;\n                }\n            }\n        }\n\n        // Flash fire triggered\n        if ((gBattleResources->flags->flags[battlerIdAtk] & RESOURCE_FLAG_FLASH_FIRE) && type == TYPE_FIRE)\n            damage = (15 * damage) / 10;\n    }\n\n    return damage + 2;\n}\n\nu8 CountAliveMonsInBattle(u8 caseId)\n{\n    s32 i;\n    u8 retVal = 0;\n\n    switch (caseId)\n    {\n    case BATTLE_ALIVE_EXCEPT_ACTIVE:\n        for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n        {\n            if (i != gActiveBattler && !(gAbsentBattlerFlags & gBitTable[i]))\n                retVal++;\n        }\n        break;\n    case BATTLE_ALIVE_ATK_SIDE:\n        for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n        {\n            if (GetBattlerSide(i) == GetBattlerSide(gBattlerAttacker) && !(gAbsentBattlerFlags & gBitTable[i]))\n                retVal++;\n        }\n        break;\n    case BATTLE_ALIVE_DEF_SIDE:\n        for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n        {\n            if (GetBattlerSide(i) == GetBattlerSide(gBattlerTarget) && !(gAbsentBattlerFlags & gBitTable[i]))\n                retVal++;\n        }\n        break;\n    }\n\n    return retVal;\n}\n\nu8 GetDefaultMoveTarget(u8 battlerId)\n{\n    u8 opposing = BATTLE_OPPOSITE(GetBattlerPosition(battlerId) & BIT_SIDE);\n\n    if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))\n        return GetBattlerAtPosition(opposing);\n    if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) > 1)\n    {\n        u8 position;\n\n        if ((Random() & 1) == 0)\n            position = BATTLE_PARTNER(opposing);\n        else\n            position = opposing;\n        return GetBattlerAtPosition(position);\n    }\n    else\n    {\n        if ((gAbsentBattlerFlags & gBitTable[opposing]))\n            return GetBattlerAtPosition(BATTLE_PARTNER(opposing));\n        else\n            return GetBattlerAtPosition(opposing);\n    }\n}\n\nu8 GetMonGender(struct Pokemon *mon)\n{\n    return GetBoxMonGender(&mon->box);\n}\n\nu8 GetBoxMonGender(struct BoxPokemon *boxMon)\n{\n    u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL);\n    u32 personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY, NULL);\n\n    switch (gSpeciesInfo[species].genderRatio)\n    {\n    case MON_MALE:\n    case MON_FEMALE:\n    case MON_GENDERLESS:\n        return gSpeciesInfo[species].genderRatio;\n    }\n\n    if (gSpeciesInfo[species].genderRatio > (personality & 0xFF))\n        return MON_FEMALE;\n    else\n        return MON_MALE;\n}\n\nu8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality)\n{\n    switch (gSpeciesInfo[species].genderRatio)\n    {\n    case MON_MALE:\n    case MON_FEMALE:\n    case MON_GENDERLESS:\n        return gSpeciesInfo[species].genderRatio;\n    }\n\n    if (gSpeciesInfo[species].genderRatio > (personality & 0xFF))\n        return MON_FEMALE;\n    else\n        return MON_MALE;\n}\n\nvoid SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition)\n{\n    if (gMonSpritesGfxPtr != NULL)\n    {\n        if (battlerPosition >= MAX_BATTLERS_COUNT)\n            battlerPosition = 0;\n\n        gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition];\n    }\n    else\n    {\n        if (sMonSpritesGfxManager)\n        {\n            if (battlerPosition >= (s8)sMonSpritesGfxManager->battlePosition) // why a cast?!? changing the unk0_2 type to s8 causes extra shifts, but a cast is the correct fix. why, compiler?\n                battlerPosition = 0;\n\n            gMultiuseSpriteTemplate = sMonSpritesGfxManager->templates[battlerPosition];\n        }\n        else\n        {\n            if (battlerPosition >= MAX_BATTLERS_COUNT)\n                battlerPosition = 0;\n\n            gMultiuseSpriteTemplate = gSpriteTemplates_Battlers[battlerPosition];\n        }\n    }\n    gMultiuseSpriteTemplate.paletteTag = speciesTag;\n    gMultiuseSpriteTemplate.anims = gAnims_MonPic;\n}\n\nvoid SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition)\n{\n    gMultiuseSpriteTemplate.paletteTag = trainerSpriteId;\n    if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT)\n    {\n        gMultiuseSpriteTemplate = sTrainerBackSpriteTemplates[trainerSpriteId];\n        gMultiuseSpriteTemplate.anims = gTrainerBackAnimsPtrTable[trainerSpriteId];\n    }\n    else\n    {\n        if (gMonSpritesGfxPtr != NULL)\n            gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition];\n        else\n            gMultiuseSpriteTemplate = gSpriteTemplates_Battlers[battlerPosition];\n        gMultiuseSpriteTemplate.anims = gTrainerFrontAnimsPtrTable[trainerSpriteId];\n    }\n}\n\nstatic void EncryptBoxMon(struct BoxPokemon *boxMon)\n{\n    u32 i;\n    for (i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++)\n    {\n        boxMon->secure.raw[i] ^= boxMon->personality;\n        boxMon->secure.raw[i] ^= boxMon->otId;\n    }\n}\n\nstatic void DecryptBoxMon(struct BoxPokemon *boxMon)\n{\n    u32 i;\n    for (i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++)\n    {\n        boxMon->secure.raw[i] ^= boxMon->otId;\n        boxMon->secure.raw[i] ^= boxMon->personality;\n    }\n}\n\n#define SUBSTRUCT_CASE(n, v1, v2, v3, v4)                               \\\ncase n:                                                                 \\\n    {                                                                   \\\n    union PokemonSubstruct *substructs0 = boxMon->secure.substructs;    \\\n    union PokemonSubstruct *substructs1 = boxMon->secure.substructs;    \\\n    union PokemonSubstruct *substructs2 = boxMon->secure.substructs;    \\\n    union PokemonSubstruct *substructs3 = boxMon->secure.substructs;    \\\n    union PokemonSubstruct *substructs4 = boxMon->secure.substructs;    \\\n    union PokemonSubstruct *substructs5 = boxMon->secure.substructs;    \\\n    union PokemonSubstruct *substructs6 = boxMon->secure.substructs;    \\\n    union PokemonSubstruct *substructs7 = boxMon->secure.substructs;    \\\n    union PokemonSubstruct *substructs8 = boxMon->secure.substructs;    \\\n    union PokemonSubstruct *substructs9 = boxMon->secure.substructs;    \\\n    union PokemonSubstruct *substructs10 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs11 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs12 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs13 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs14 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs15 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs16 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs17 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs18 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs19 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs20 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs21 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs22 = boxMon->secure.substructs;   \\\n    union PokemonSubstruct *substructs23 = boxMon->secure.substructs;   \\\n                                                                        \\\n        switch (substructType)                                          \\\n        {                                                               \\\n        case 0:                                                         \\\n            substruct = &substructs ## n [v1];                          \\\n            break;                                                      \\\n        case 1:                                                         \\\n            substruct = &substructs ## n [v2];                          \\\n            break;                                                      \\\n        case 2:                                                         \\\n            substruct = &substructs ## n [v3];                          \\\n            break;                                                      \\\n        case 3:                                                         \\\n            substruct = &substructs ## n [v4];                          \\\n            break;                                                      \\\n        }                                                               \\\n        break;                                                          \\\n    }                                                                   \\\n\nstatic union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType)\n{\n    union PokemonSubstruct *substruct = NULL;\n\n    switch (personality % 24)\n    {\n        SUBSTRUCT_CASE( 0,0,1,2,3)\n        SUBSTRUCT_CASE( 1,0,1,3,2)\n        SUBSTRUCT_CASE( 2,0,2,1,3)\n        SUBSTRUCT_CASE( 3,0,3,1,2)\n        SUBSTRUCT_CASE( 4,0,2,3,1)\n        SUBSTRUCT_CASE( 5,0,3,2,1)\n        SUBSTRUCT_CASE( 6,1,0,2,3)\n        SUBSTRUCT_CASE( 7,1,0,3,2)\n        SUBSTRUCT_CASE( 8,2,0,1,3)\n        SUBSTRUCT_CASE( 9,3,0,1,2)\n        SUBSTRUCT_CASE(10,2,0,3,1)\n        SUBSTRUCT_CASE(11,3,0,2,1)\n        SUBSTRUCT_CASE(12,1,2,0,3)\n        SUBSTRUCT_CASE(13,1,3,0,2)\n        SUBSTRUCT_CASE(14,2,1,0,3)\n        SUBSTRUCT_CASE(15,3,1,0,2)\n        SUBSTRUCT_CASE(16,2,3,0,1)\n        SUBSTRUCT_CASE(17,3,2,0,1)\n        SUBSTRUCT_CASE(18,1,2,3,0)\n        SUBSTRUCT_CASE(19,1,3,2,0)\n        SUBSTRUCT_CASE(20,2,1,3,0)\n        SUBSTRUCT_CASE(21,3,1,2,0)\n        SUBSTRUCT_CASE(22,2,3,1,0)\n        SUBSTRUCT_CASE(23,3,2,1,0)\n    }\n\n    return substruct;\n}\n\nu32 GetMonData(struct Pokemon *mon, s32 field, u8 *data)\n{\n    u32 ret;\n\n    switch (field)\n    {\n    case MON_DATA_STATUS:\n        ret = mon->status;\n        break;\n    case MON_DATA_LEVEL:\n        ret = mon->level;\n        break;\n    case MON_DATA_HP:\n        ret = mon->hp;\n        break;\n    case MON_DATA_MAX_HP:\n        ret = mon->maxHP;\n        break;\n    case MON_DATA_ATK:\n        ret = GetDeoxysStat(mon, STAT_ATK);\n        if (!ret)\n            ret = mon->attack;\n        break;\n    case MON_DATA_DEF:\n        ret = GetDeoxysStat(mon, STAT_DEF);\n        if (!ret)\n            ret = mon->defense;\n        break;\n    case MON_DATA_SPEED:\n        ret = GetDeoxysStat(mon, STAT_SPEED);\n        if (!ret)\n            ret = mon->speed;\n        break;\n    case MON_DATA_SPATK:\n        ret = GetDeoxysStat(mon, STAT_SPATK);\n        if (!ret)\n            ret = mon->spAttack;\n        break;\n    case MON_DATA_SPDEF:\n        ret = GetDeoxysStat(mon, STAT_SPDEF);\n        if (!ret)\n            ret = mon->spDefense;\n        break;\n    case MON_DATA_ATK2:\n        ret = mon->attack;\n        break;\n    case MON_DATA_DEF2:\n        ret = mon->defense;\n        break;\n    case MON_DATA_SPEED2:\n        ret = mon->speed;\n        break;\n    case MON_DATA_SPATK2:\n        ret = mon->spAttack;\n        break;\n    case MON_DATA_SPDEF2:\n        ret = mon->spDefense;\n        break;\n    case MON_DATA_MAIL:\n        ret = mon->mail;\n        break;\n    default:\n        ret = GetBoxMonData(&mon->box, field, data);\n        break;\n    }\n    return ret;\n}\n\nu32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data)\n{\n    s32 i;\n    u32 retVal = 0;\n    struct PokemonSubstruct0 *substruct0 = NULL;\n    struct PokemonSubstruct1 *substruct1 = NULL;\n    struct PokemonSubstruct2 *substruct2 = NULL;\n    struct PokemonSubstruct3 *substruct3 = NULL;\n\n    if (field > MON_DATA_ENCRYPT_SEPARATOR)\n    {\n        substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0);\n        substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1);\n        substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2);\n        substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3);\n\n        DecryptBoxMon(boxMon);\n\n        if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum)\n        {\n            boxMon->isBadEgg = TRUE;\n            boxMon->isEgg = TRUE;\n            substruct3->isEgg = TRUE;\n        }\n    }\n\n    switch (field)\n    {\n    case MON_DATA_PERSONALITY:\n        retVal = boxMon->personality;\n        break;\n    case MON_DATA_OT_ID:\n        retVal = boxMon->otId;\n        break;\n    case MON_DATA_NICKNAME:\n    {\n        if (boxMon->isBadEgg)\n        {\n            for (retVal = 0;\n                retVal < POKEMON_NAME_LENGTH && gText_BadEgg[retVal] != EOS;\n                data[retVal] = gText_BadEgg[retVal], retVal++) {}\n\n            data[retVal] = EOS;\n        }\n        else if (boxMon->isEgg)\n        {\n            StringCopy(data, gText_EggNickname);\n            retVal = StringLength(data);\n        }\n        else if (boxMon->language == LANGUAGE_JAPANESE)\n        {\n            data[0] = EXT_CTRL_CODE_BEGIN;\n            data[1] = EXT_CTRL_CODE_JPN;\n\n            // FRLG changed i < 7 to i < 6\n            for (retVal = 2, i = 0;\n                i < 6 && boxMon->nickname[i] != EOS;\n                data[retVal] = boxMon->nickname[i], retVal++, i++) {}\n\n            data[retVal++] = EXT_CTRL_CODE_BEGIN;\n            data[retVal++] = EXT_CTRL_CODE_ENG;\n            data[retVal] = EOS;\n        }\n        else\n        {\n            for (retVal = 0;\n                retVal < POKEMON_NAME_LENGTH;\n                data[retVal] = boxMon->nickname[retVal], retVal++){}\n\n            data[retVal] = EOS;\n        }\n        break;\n    }\n    case MON_DATA_LANGUAGE:\n        retVal = boxMon->language;\n        break;\n    case MON_DATA_SANITY_IS_BAD_EGG:\n        retVal = boxMon->isBadEgg;\n        break;\n    case MON_DATA_SANITY_HAS_SPECIES:\n        retVal = boxMon->hasSpecies;\n        break;\n    case MON_DATA_SANITY_IS_EGG:\n        retVal = boxMon->isEgg;\n        break;\n    case MON_DATA_OT_NAME:\n    {\n        retVal = 0;\n\n        while (retVal < PLAYER_NAME_LENGTH)\n        {\n            data[retVal] = boxMon->otName[retVal];\n            retVal++;\n        }\n\n        data[retVal] = EOS;\n        break;\n    }\n    case MON_DATA_MARKINGS:\n        retVal = boxMon->markings;\n        break;\n    case MON_DATA_CHECKSUM:\n        retVal = boxMon->checksum;\n        break;\n    case MON_DATA_ENCRYPT_SEPARATOR:\n        retVal = boxMon->unknown;\n        break;\n    case MON_DATA_SPECIES:\n        retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species;\n        break;\n    case MON_DATA_HELD_ITEM:\n        retVal = substruct0->heldItem;\n        break;\n    case MON_DATA_EXP:\n        retVal = substruct0->experience;\n        break;\n    case MON_DATA_PP_BONUSES:\n        retVal = substruct0->ppBonuses;\n        break;\n    case MON_DATA_FRIENDSHIP:\n        retVal = substruct0->friendship;\n        break;\n    case MON_DATA_MOVE1:\n    case MON_DATA_MOVE2:\n    case MON_DATA_MOVE3:\n    case MON_DATA_MOVE4:\n        retVal = substruct1->moves[field - MON_DATA_MOVE1];\n        break;\n    case MON_DATA_PP1:\n    case MON_DATA_PP2:\n    case MON_DATA_PP3:\n    case MON_DATA_PP4:\n        retVal = substruct1->pp[field - MON_DATA_PP1];\n        break;\n    case MON_DATA_HP_EV:\n        retVal = substruct2->hpEV;\n        break;\n    case MON_DATA_ATK_EV:\n        retVal = substruct2->attackEV;\n        break;\n    case MON_DATA_DEF_EV:\n        retVal = substruct2->defenseEV;\n        break;\n    case MON_DATA_SPEED_EV:\n        retVal = substruct2->speedEV;\n        break;\n    case MON_DATA_SPATK_EV:\n        retVal = substruct2->spAttackEV;\n        break;\n    case MON_DATA_SPDEF_EV:\n        retVal = substruct2->spDefenseEV;\n        break;\n    case MON_DATA_COOL:\n        retVal = substruct2->cool;\n        break;\n    case MON_DATA_BEAUTY:\n        retVal = substruct2->beauty;\n        break;\n    case MON_DATA_CUTE:\n        retVal = substruct2->cute;\n        break;\n    case MON_DATA_SMART:\n        retVal = substruct2->smart;\n        break;\n    case MON_DATA_TOUGH:\n        retVal = substruct2->tough;\n        break;\n    case MON_DATA_SHEEN:\n        retVal = substruct2->sheen;\n        break;\n    case MON_DATA_POKERUS:\n        retVal = substruct3->pokerus;\n        break;\n    case MON_DATA_MET_LOCATION:\n        retVal = substruct3->metLocation;\n        break;\n    case MON_DATA_MET_LEVEL:\n        retVal = substruct3->metLevel;\n        break;\n    case MON_DATA_MET_GAME:\n        retVal = substruct3->metGame;\n        break;\n    case MON_DATA_POKEBALL:\n        retVal = substruct3->pokeball;\n        break;\n    case MON_DATA_OT_GENDER:\n        retVal = substruct3->otGender;\n        break;\n    case MON_DATA_HP_IV:\n        retVal = substruct3->hpIV;\n        break;\n    case MON_DATA_ATK_IV:\n        retVal = substruct3->attackIV;\n        break;\n    case MON_DATA_DEF_IV:\n        retVal = substruct3->defenseIV;\n        break;\n    case MON_DATA_SPEED_IV:\n        retVal = substruct3->speedIV;\n        break;\n    case MON_DATA_SPATK_IV:\n        retVal = substruct3->spAttackIV;\n        break;\n    case MON_DATA_SPDEF_IV:\n        retVal = substruct3->spDefenseIV;\n        break;\n    case MON_DATA_IS_EGG:\n        retVal = substruct3->isEgg;\n        break;\n    case MON_DATA_ABILITY_NUM:\n        retVal = substruct3->abilityNum;\n        break;\n    case MON_DATA_COOL_RIBBON:\n        retVal = substruct3->coolRibbon;\n        break;\n    case MON_DATA_BEAUTY_RIBBON:\n        retVal = substruct3->beautyRibbon;\n        break;\n    case MON_DATA_CUTE_RIBBON:\n        retVal = substruct3->cuteRibbon;\n        break;\n    case MON_DATA_SMART_RIBBON:\n        retVal = substruct3->smartRibbon;\n        break;\n    case MON_DATA_TOUGH_RIBBON:\n        retVal = substruct3->toughRibbon;\n        break;\n    case MON_DATA_CHAMPION_RIBBON:\n        retVal = substruct3->championRibbon;\n        break;\n    case MON_DATA_WINNING_RIBBON:\n        retVal = substruct3->winningRibbon;\n        break;\n    case MON_DATA_VICTORY_RIBBON:\n        retVal = substruct3->victoryRibbon;\n        break;\n    case MON_DATA_ARTIST_RIBBON:\n        retVal = substruct3->artistRibbon;\n        break;\n    case MON_DATA_EFFORT_RIBBON:\n        retVal = substruct3->effortRibbon;\n        break;\n    case MON_DATA_MARINE_RIBBON:\n        retVal = substruct3->marineRibbon;\n        break;\n    case MON_DATA_LAND_RIBBON:\n        retVal = substruct3->landRibbon;\n        break;\n    case MON_DATA_SKY_RIBBON:\n        retVal = substruct3->skyRibbon;\n        break;\n    case MON_DATA_COUNTRY_RIBBON:\n        retVal = substruct3->countryRibbon;\n        break;\n    case MON_DATA_NATIONAL_RIBBON:\n        retVal = substruct3->nationalRibbon;\n        break;\n    case MON_DATA_EARTH_RIBBON:\n        retVal = substruct3->earthRibbon;\n        break;\n    case MON_DATA_WORLD_RIBBON:\n        retVal = substruct3->worldRibbon;\n        break;\n    case MON_DATA_UNUSED_RIBBONS:\n        retVal = substruct3->unusedRibbons;\n        break;\n    case MON_DATA_MODERN_FATEFUL_ENCOUNTER:\n        retVal = substruct3->modernFatefulEncounter;\n        break;\n    case MON_DATA_SPECIES_OR_EGG:\n        retVal = substruct0->species;\n        if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg))\n            retVal = SPECIES_EGG;\n        break;\n    case MON_DATA_IVS:\n        retVal = substruct3->hpIV\n              | (substruct3->attackIV << 5)\n              | (substruct3->defenseIV << 10)\n              | (substruct3->speedIV << 15)\n              | (substruct3->spAttackIV << 20)\n              | (substruct3->spDefenseIV << 25);\n        break;\n    case MON_DATA_KNOWN_MOVES:\n        if (substruct0->species && !substruct3->isEgg)\n        {\n            u16 *moves = (u16 *)data;\n            s32 i = 0;\n\n            while (moves[i] != MOVES_COUNT)\n            {\n                u16 move = moves[i];\n                if (substruct1->moves[0] == move\n                    || substruct1->moves[1] == move\n                    || substruct1->moves[2] == move\n                    || substruct1->moves[3] == move)\n                    retVal |= gBitTable[i];\n                i++;\n            }\n        }\n        break;\n    case MON_DATA_RIBBON_COUNT:\n        retVal = 0;\n        if (substruct0->species && !substruct3->isEgg)\n        {\n            retVal += substruct3->coolRibbon;\n            retVal += substruct3->beautyRibbon;\n            retVal += substruct3->cuteRibbon;\n            retVal += substruct3->smartRibbon;\n            retVal += substruct3->toughRibbon;\n            retVal += substruct3->championRibbon;\n            retVal += substruct3->winningRibbon;\n            retVal += substruct3->victoryRibbon;\n            retVal += substruct3->artistRibbon;\n            retVal += substruct3->effortRibbon;\n            retVal += substruct3->marineRibbon;\n            retVal += substruct3->landRibbon;\n            retVal += substruct3->skyRibbon;\n            retVal += substruct3->countryRibbon;\n            retVal += substruct3->nationalRibbon;\n            retVal += substruct3->earthRibbon;\n            retVal += substruct3->worldRibbon;\n        }\n        break;\n    case MON_DATA_RIBBONS:\n        retVal = 0;\n        if (substruct0->species && !substruct3->isEgg)\n        {\n            retVal = substruct3->championRibbon\n                | (substruct3->coolRibbon << 1)\n                | (substruct3->beautyRibbon << 4)\n                | (substruct3->cuteRibbon << 7)\n                | (substruct3->smartRibbon << 10)\n                | (substruct3->toughRibbon << 13)\n                | (substruct3->winningRibbon << 16)\n                | (substruct3->victoryRibbon << 17)\n                | (substruct3->artistRibbon << 18)\n                | (substruct3->effortRibbon << 19)\n                | (substruct3->marineRibbon << 20)\n                | (substruct3->landRibbon << 21)\n                | (substruct3->skyRibbon << 22)\n                | (substruct3->countryRibbon << 23)\n                | (substruct3->nationalRibbon << 24)\n                | (substruct3->earthRibbon << 25)\n                | (substruct3->worldRibbon << 26);\n        }\n        break;\n    case MON_DATA_FORME:\n        retVal = substruct0->forme;\n        break;\n    case MON_DATA_BOX_HP:\n        retVal = substruct0->boxHP;\n        break;\n    case MON_DATA_BOX_STATUS:\n        retVal = substruct0->boxStatus;\n        break;\n    default:\n        break;\n    }\n\n    if (field > MON_DATA_ENCRYPT_SEPARATOR)\n        EncryptBoxMon(boxMon);\n\n    return retVal;\n}\n\n#define SET8(lhs) (lhs) = *data\n#define SET16(lhs) (lhs) = data[0] + (data[1] << 8)\n#define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24)\n\nvoid SetMonData(struct Pokemon *mon, s32 field, const void *dataArg)\n{\n    const u8 *data = dataArg;\n\n    switch (field)\n    {\n    case MON_DATA_STATUS:\n        SET32(mon->status);\n        break;\n    case MON_DATA_LEVEL:\n        SET8(mon->level);\n        break;\n    case MON_DATA_HP:\n        SET16(mon->hp);\n        break;\n    case MON_DATA_MAX_HP:\n        SET16(mon->maxHP);\n        break;\n    case MON_DATA_ATK:\n    case MON_DATA_ATK2:\n        SET16(mon->attack);\n        break;\n    case MON_DATA_DEF:\n    case MON_DATA_DEF2:\n        SET16(mon->defense);\n        break;\n    case MON_DATA_SPEED:\n    case MON_DATA_SPEED2:\n        SET16(mon->speed);\n        break;\n    case MON_DATA_SPATK:\n    case MON_DATA_SPATK2:\n        SET16(mon->spAttack);\n        break;\n    case MON_DATA_SPDEF:\n    case MON_DATA_SPDEF2:\n        SET16(mon->spDefense);\n        break;\n    case MON_DATA_MAIL:\n        SET8(mon->mail);\n        break;\n    case MON_DATA_SPECIES_OR_EGG:\n        break;\n    // why did FRLG go out of its way to specify all of these for default?\n    case MON_DATA_IVS:\n    case MON_DATA_CHAMPION_RIBBON:\n    case MON_DATA_WINNING_RIBBON:\n    case MON_DATA_VICTORY_RIBBON:\n    case MON_DATA_ARTIST_RIBBON:\n    case MON_DATA_EFFORT_RIBBON:\n    case MON_DATA_MARINE_RIBBON:\n    case MON_DATA_LAND_RIBBON:\n    case MON_DATA_SKY_RIBBON:\n    case MON_DATA_COUNTRY_RIBBON:\n    case MON_DATA_NATIONAL_RIBBON:\n    case MON_DATA_EARTH_RIBBON:\n    case MON_DATA_WORLD_RIBBON:\n    case MON_DATA_UNUSED_RIBBONS:\n    case MON_DATA_MODERN_FATEFUL_ENCOUNTER:\n    case MON_DATA_KNOWN_MOVES:\n    case MON_DATA_RIBBON_COUNT:\n    case MON_DATA_RIBBONS:\n    default:\n        SetBoxMonData(&mon->box, field, data);\n        break;\n    }\n}\n\nvoid SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg)\n{\n    const u8 *data = dataArg;\n\n    struct PokemonSubstruct0 *substruct0 = NULL;\n    struct PokemonSubstruct1 *substruct1 = NULL;\n    struct PokemonSubstruct2 *substruct2 = NULL;\n    struct PokemonSubstruct3 *substruct3 = NULL;\n\n    if (field > MON_DATA_ENCRYPT_SEPARATOR)\n    {\n        substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0);\n        substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1);\n        substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2);\n        substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3);\n\n        DecryptBoxMon(boxMon);\n\n        if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum)\n        {\n            boxMon->isBadEgg = TRUE;\n            boxMon->isEgg = TRUE;\n            substruct3->isEgg = TRUE;\n            EncryptBoxMon(boxMon);\n            return;\n        }\n    }\n\n    switch (field)\n    {\n    case MON_DATA_PERSONALITY:\n        SET32(boxMon->personality);\n        break;\n    case MON_DATA_OT_ID:\n        SET32(boxMon->otId);\n        break;\n    case MON_DATA_NICKNAME:\n    {\n        s32 i;\n        for (i = 0; i < POKEMON_NAME_LENGTH; i++)\n            boxMon->nickname[i] = data[i];\n        break;\n    }\n    case MON_DATA_LANGUAGE:\n        SET8(boxMon->language);\n        break;\n    case MON_DATA_SANITY_IS_BAD_EGG:\n        SET8(boxMon->isBadEgg);\n        break;\n    case MON_DATA_SANITY_HAS_SPECIES:\n        SET8(boxMon->hasSpecies);\n        break;\n    case MON_DATA_SANITY_IS_EGG:\n        SET8(boxMon->isEgg);\n        break;\n    case MON_DATA_OT_NAME:\n    {\n        s32 i;\n        for (i = 0; i < PLAYER_NAME_LENGTH; i++)\n            boxMon->otName[i] = data[i];\n        break;\n    }\n    case MON_DATA_MARKINGS:\n        SET8(boxMon->markings);\n        break;\n    case MON_DATA_CHECKSUM:\n        SET16(boxMon->checksum);\n        break;\n    case MON_DATA_ENCRYPT_SEPARATOR:\n        SET16(boxMon->unknown);\n        break;\n    case MON_DATA_SPECIES:\n    {\n        SET16(substruct0->species);\n        if (substruct0->species)\n            boxMon->hasSpecies = TRUE;\n        else\n            boxMon->hasSpecies = FALSE;\n        break;\n    }\n    case MON_DATA_HELD_ITEM:\n        SET16(substruct0->heldItem);\n        break;\n    case MON_DATA_EXP:\n        SET32(substruct0->experience);\n        break;\n    case MON_DATA_PP_BONUSES:\n        SET8(substruct0->ppBonuses);\n        break;\n    case MON_DATA_FRIENDSHIP:\n        SET8(substruct0->friendship);\n        break;\n    case MON_DATA_MOVE1:\n    case MON_DATA_MOVE2:\n    case MON_DATA_MOVE3:\n    case MON_DATA_MOVE4:\n        SET16(substruct1->moves[field - MON_DATA_MOVE1]);\n        break;\n    case MON_DATA_PP1:\n    case MON_DATA_PP2:\n    case MON_DATA_PP3:\n    case MON_DATA_PP4:\n        SET8(substruct1->pp[field - MON_DATA_PP1]);\n        break;\n    case MON_DATA_HP_EV:\n        SET8(substruct2->hpEV);\n        break;\n    case MON_DATA_ATK_EV:\n        SET8(substruct2->attackEV);\n        break;\n    case MON_DATA_DEF_EV:\n        SET8(substruct2->defenseEV);\n        break;\n    case MON_DATA_SPEED_EV:\n        SET8(substruct2->speedEV);\n        break;\n    case MON_DATA_SPATK_EV:\n        SET8(substruct2->spAttackEV);\n        break;\n    case MON_DATA_SPDEF_EV:\n        SET8(substruct2->spDefenseEV);\n        break;\n    case MON_DATA_COOL:\n        SET8(substruct2->cool);\n        break;\n    case MON_DATA_BEAUTY:\n        SET8(substruct2->beauty);\n        break;\n    case MON_DATA_CUTE:\n        SET8(substruct2->cute);\n        break;\n    case MON_DATA_SMART:\n        SET8(substruct2->smart);\n        break;\n    case MON_DATA_TOUGH:\n        SET8(substruct2->tough);\n        break;\n    case MON_DATA_SHEEN:\n        SET8(substruct2->sheen);\n        break;\n    case MON_DATA_POKERUS:\n        SET8(substruct3->pokerus);\n        break;\n    case MON_DATA_MET_LOCATION:\n        SET8(substruct3->metLocation);\n        break;\n    case MON_DATA_MET_LEVEL:\n    {\n        u8 metLevel = *data;\n        substruct3->metLevel = metLevel;\n        break;\n    }\n    case MON_DATA_MET_GAME:\n        SET8(substruct3->metGame);\n        break;\n    case MON_DATA_POKEBALL:\n    {\n        u8 pokeball = *data;\n        substruct3->pokeball = pokeball;\n        break;\n    }\n    case MON_DATA_OT_GENDER:\n        SET8(substruct3->otGender);\n        break;\n    case MON_DATA_HP_IV:\n        SET8(substruct3->hpIV);\n        break;\n    case MON_DATA_ATK_IV:\n        SET8(substruct3->attackIV);\n        break;\n    case MON_DATA_DEF_IV:\n        SET8(substruct3->defenseIV);\n        break;\n    case MON_DATA_SPEED_IV:\n        SET8(substruct3->speedIV);\n        break;\n    case MON_DATA_SPATK_IV:\n        SET8(substruct3->spAttackIV);\n        break;\n    case MON_DATA_SPDEF_IV:\n        SET8(substruct3->spDefenseIV);\n        break;\n    case MON_DATA_IS_EGG:\n        SET8(substruct3->isEgg);\n        if (substruct3->isEgg)\n            boxMon->isEgg = TRUE;\n        else\n            boxMon->isEgg = FALSE;\n        break;\n    case MON_DATA_ABILITY_NUM:\n        SET8(substruct3->abilityNum);\n        break;\n    case MON_DATA_COOL_RIBBON:\n        SET8(substruct3->coolRibbon);\n        break;\n    case MON_DATA_BEAUTY_RIBBON:\n        SET8(substruct3->beautyRibbon);\n        break;\n    case MON_DATA_CUTE_RIBBON:\n        SET8(substruct3->cuteRibbon);\n        break;\n    case MON_DATA_SMART_RIBBON:\n        SET8(substruct3->smartRibbon);\n        break;\n    case MON_DATA_TOUGH_RIBBON:\n        SET8(substruct3->toughRibbon);\n        break;\n    case MON_DATA_CHAMPION_RIBBON:\n        SET8(substruct3->championRibbon);\n        break;\n    case MON_DATA_WINNING_RIBBON:\n        SET8(substruct3->winningRibbon);\n        break;\n    case MON_DATA_VICTORY_RIBBON:\n        SET8(substruct3->victoryRibbon);\n        break;\n    case MON_DATA_ARTIST_RIBBON:\n        SET8(substruct3->artistRibbon);\n        break;\n    case MON_DATA_EFFORT_RIBBON:\n        SET8(substruct3->effortRibbon);\n        break;\n    case MON_DATA_MARINE_RIBBON:\n        SET8(substruct3->marineRibbon);\n        break;\n    case MON_DATA_LAND_RIBBON:\n        SET8(substruct3->landRibbon);\n        break;\n    case MON_DATA_SKY_RIBBON:\n        SET8(substruct3->skyRibbon);\n        break;\n    case MON_DATA_COUNTRY_RIBBON:\n        SET8(substruct3->countryRibbon);\n        break;\n    case MON_DATA_NATIONAL_RIBBON:\n        SET8(substruct3->nationalRibbon);\n        break;\n    case MON_DATA_EARTH_RIBBON:\n        SET8(substruct3->earthRibbon);\n        break;\n    case MON_DATA_WORLD_RIBBON:\n        SET8(substruct3->worldRibbon);\n        break;\n    case MON_DATA_UNUSED_RIBBONS:\n        SET8(substruct3->unusedRibbons);\n        break;\n    case MON_DATA_MODERN_FATEFUL_ENCOUNTER:\n        SET8(substruct3->modernFatefulEncounter);\n        break;\n    case MON_DATA_IVS:\n    {\n        u32 ivs = *data; // Bug: Only the HP IV and the lower 3 bits of the Attack IV are read. The rest become 0.\n\n        substruct3->hpIV = ivs & MAX_IV_MASK;\n        substruct3->attackIV = (ivs >> 5) & MAX_IV_MASK;\n        substruct3->defenseIV = (ivs >> 10) & MAX_IV_MASK;\n        substruct3->speedIV = (ivs >> 15) & MAX_IV_MASK;\n        substruct3->spAttackIV = (ivs >> 20) & MAX_IV_MASK;\n        substruct3->spDefenseIV = (ivs >> 25) & MAX_IV_MASK;\n        break;\n    }\n    case MON_DATA_FORME:\n    {\n        u8 forme = *data;\n        substruct0->forme = forme;\n        break;\n    }\n    case MON_DATA_BOX_HP:\n    {\n        //u16 hp = *data;\n        SET16(substruct0->boxHP);\n        break;\n    }\n    case MON_DATA_BOX_STATUS:\n    {\n        u8 status = *data;\n        substruct0->boxStatus = status;\n    }\n    default:\n        break;\n    }\n\n    if (field > MON_DATA_ENCRYPT_SEPARATOR)\n    {\n        boxMon->checksum = CalculateBoxMonChecksum(boxMon);\n        EncryptBoxMon(boxMon);\n    }\n}\n\nvoid CopyMon(void *dest, void *src, size_t size)\n{\n    memcpy(dest, src, size);\n}\n\nu8 GiveMonToPlayer(struct Pokemon *mon)\n{\n    s32 i;\n\n    SetMonData(mon, MON_DATA_OT_NAME, gSaveBlock2Ptr->playerName);\n    SetMonData(mon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender);\n    SetMonData(mon, MON_DATA_OT_ID, gSaveBlock2Ptr->playerTrainerId);\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE)\n            break;\n    }\n\n    if (i >= PARTY_SIZE)\n        return SendMonToPC(mon);\n\n    CopyMon(&gPlayerParty[i], mon, sizeof(*mon));\n    CalculateMonStats(&gPlayerParty[i], FALSE);\n    gPlayerPartyCount = i + 1;\n    return MON_GIVEN_TO_PARTY;\n}\n\nu8 SendMonToPC(struct Pokemon* mon)\n{\n    s32 boxNo, boxPos;\n\n    SetPCBoxToSendMon(VarGet(VAR_PC_BOX_TO_SEND_MON));\n\n    boxNo = StorageGetCurrentBox();\n\n    do\n    {\n        for (boxPos = 0; boxPos < IN_BOX_COUNT; boxPos++)\n        {\n            struct BoxPokemon* checkingMon = GetBoxedMonPtr(boxNo, boxPos);\n            if (GetBoxMonData(checkingMon, MON_DATA_SPECIES, NULL) == SPECIES_NONE)\n            {\n                if(gSaveBlock1Ptr->keyFlags.noPMC != 1)\n                    MonRestorePP(mon);\n                StoreHPAndStatusInBoxMon(mon);\n                CopyMon(checkingMon, &mon->box, sizeof(mon->box));\n                gSpecialVar_MonBoxId = boxNo;\n                gSpecialVar_MonBoxPos = boxPos;\n                if (GetPCBoxToSendMon() != boxNo)\n                    FlagClear(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE);\n                VarSet(VAR_PC_BOX_TO_SEND_MON, boxNo);\n                return MON_GIVEN_TO_PC;\n            }\n        }\n\n        boxNo++;\n        if (boxNo == TOTAL_BOXES_COUNT)\n            boxNo = 0;\n    } while (boxNo != StorageGetCurrentBox());\n\n    return MON_CANT_GIVE;\n}\n\nu8 CalculatePlayerPartyCount(void)\n{\n    gPlayerPartyCount = 0;\n\n    while (gPlayerPartyCount < PARTY_SIZE\n        && GetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE)\n    {\n        gPlayerPartyCount++;\n    }\n\n    return gPlayerPartyCount;\n}\n\n\nu8 CalculateEnemyPartyCount(void)\n{\n    gEnemyPartyCount = 0;\n\n    while (gEnemyPartyCount < PARTY_SIZE\n        && GetMonData(&gEnemyParty[gEnemyPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE)\n    {\n        gEnemyPartyCount++;\n    }\n\n    return gEnemyPartyCount;\n}\n\nu8 GetMonsStateToDoubles(void)\n{\n    s32 aliveCount = 0;\n    s32 i;\n    CalculatePlayerPartyCount();\n\n    if (gPlayerPartyCount == 1)\n        return gPlayerPartyCount; // PLAYER_HAS_ONE_MON\n\n    for (i = 0; i < gPlayerPartyCount; i++)\n    {\n        // FRLG changed the order of these checks, but there's no point to doing that\n        // because of the requirement of all 3 of these checks.\n        if (GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0\n         && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_NONE\n         && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_EGG)\n            aliveCount++;\n    }\n\n    return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON;\n}\n\nu8 GetAbilityBySpecies(u16 species, bool8 abilityNum)\n{\n    if (abilityNum)\n        gLastUsedAbility = gSpeciesInfo[species].abilities[1];\n    else\n        gLastUsedAbility = gSpeciesInfo[species].abilities[0];\n\n    return gLastUsedAbility;\n}\n\nu8 GetMonAbility(struct Pokemon *mon)\n{\n    u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);\n    u8 abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL);\n    return GetAbilityBySpecies(species, abilityNum);\n}\n\nstatic void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)\n{\n    s32 i, j;\n\n    ZeroEnemyPartyMons();\n    *gBattleResources->secretBase = *secretBaseRecord;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (gBattleResources->secretBase->party.species[i])\n        {\n            CreateMon(&gEnemyParty[i],\n                gBattleResources->secretBase->party.species[i],\n                gBattleResources->secretBase->party.levels[i],\n                15,\n                TRUE,\n                gBattleResources->secretBase->party.personality[i],\n                OT_ID_RANDOM_NO_SHINY,\n                0);\n\n            SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->party.heldItems[i]);\n\n            for (j = 0; j < NUM_STATS; j++)\n                SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gBattleResources->secretBase->party.EVs[i]);\n\n            for (j = 0; j < MAX_MON_MOVES; j++)\n            {\n                SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->party.moves[i * MAX_MON_MOVES + j]);\n                SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->party.moves[i * MAX_MON_MOVES + j]].pp);\n            }\n        }\n    }\n    gBattleTypeFlags = BATTLE_TYPE_TRAINER;\n    gTrainerBattleOpponent_A = TRAINER_SECRET_BASE;\n}\n\nu8 GetSecretBaseTrainerPicIndex(void)\n{\n    u8 facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % 5];\n    return gFacilityClassToPicIndex[facilityClass];\n}\n\nu8 GetSecretBaseTrainerNameIndex(void)\n{\n    u8 facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % 5];\n    return gFacilityClassToTrainerClass[facilityClass];\n}\n\nbool8 IsPlayerPartyAndPokemonStorageFull(void)\n{\n    s32 i;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE)\n            return FALSE;\n\n    return IsPokemonStorageFull();\n}\n\nstatic bool8 IsPokemonStorageFull(void)\n{\n    s32 i, j;\n\n    for (i = 0; i < TOTAL_BOXES_COUNT; i++)\n        for (j = 0; j < IN_BOX_COUNT; j++)\n            if (GetBoxMonDataAt(i, j, MON_DATA_SPECIES) == SPECIES_NONE)\n                return FALSE;\n\n    return TRUE;\n}\n\nvoid bufferspeciesname(u8 *name, u16 species)\n{\n    s32 i;\n\n    // Hmm? FRLG has < while Ruby/Emerald has <=\n    for (i = 0; i < POKEMON_NAME_LENGTH; i++)\n    {\n        if (species > NUM_SPECIES)\n            name[i] = gSpeciesNames[0][i];\n        else\n            name[i] = gSpeciesNames[species][i];\n\n        if (name[i] == EOS)\n            break;\n    }\n\n    name[i] = EOS;\n}\n\nu8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex)\n{\n    u8 basePP = gBattleMoves[move].pp;\n    return basePP + ((basePP * 20 * ((gPPUpGetMask[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100);\n}\n\nvoid RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex)\n{\n    u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);\n    ppBonuses &= gPPUpClearMask[moveIndex];\n    SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);\n}\n\nvoid RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex)\n{\n    mon->ppBonuses &= gPPUpClearMask[moveIndex];\n}\n\nstatic void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex)\n{\n    u16 *hpSwitchout;\n    s32 i;\n    u8 nickname[POKEMON_NAME_LENGTH * 2]; // Why is the nickname array here longer in FR/LG?\n\n    gBattleMons[battlerId].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL);\n    gBattleMons[battlerId].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL);\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        gBattleMons[battlerId].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL);\n        gBattleMons[battlerId].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL);\n    }\n\n    gBattleMons[battlerId].ppBonuses = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP_BONUSES, NULL);\n    gBattleMons[battlerId].friendship = GetMonData(&gPlayerParty[partyIndex], MON_DATA_FRIENDSHIP, NULL);\n    gBattleMons[battlerId].experience = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EXP, NULL);\n    gBattleMons[battlerId].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL);\n    gBattleMons[battlerId].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL);\n    gBattleMons[battlerId].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL);\n    gBattleMons[battlerId].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED_IV, NULL);\n    gBattleMons[battlerId].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL);\n    gBattleMons[battlerId].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL);\n    gBattleMons[battlerId].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL);\n    gBattleMons[battlerId].status1 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_STATUS, NULL);\n    gBattleMons[battlerId].level = GetMonData(&gPlayerParty[partyIndex], MON_DATA_LEVEL, NULL);\n    gBattleMons[battlerId].hp = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL);\n    gBattleMons[battlerId].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL);\n    gBattleMons[battlerId].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL);\n    gBattleMons[battlerId].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL);\n    gBattleMons[battlerId].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED, NULL);\n    gBattleMons[battlerId].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL);\n    gBattleMons[battlerId].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL);\n    gBattleMons[battlerId].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL);\n    gBattleMons[battlerId].abilityNum = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ABILITY_NUM, NULL);\n    gBattleMons[battlerId].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL);\n    gBattleMons[battlerId].type1 = gSpeciesInfo[gBattleMons[battlerId].species].types[0];\n    gBattleMons[battlerId].type2 = gSpeciesInfo[gBattleMons[battlerId].species].types[1];\n    gBattleMons[battlerId].ability = GetAbilityBySpecies(gBattleMons[battlerId].species, gBattleMons[battlerId].abilityNum);\n    GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname);\n    StringCopy_Nickname(gBattleMons[battlerId].nickname, nickname);\n    GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battlerId].otName);\n\n    hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(battlerId)];\n    *hpSwitchout = gBattleMons[battlerId].hp;\n\n    for (i = 0; i < NUM_BATTLE_STATS; i++)\n        gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE;\n\n    gBattleMons[battlerId].status2 = 0;\n    UpdateSentPokesToOpponentValue(battlerId);\n    ClearTemporarySpeciesSpriteData(battlerId, FALSE);\n}\n\nbool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex)\n{\n    return PokemonUseItemEffects(mon, item, partyIndex, moveIndex, 0);\n}\n\n#define UPDATE_FRIENDSHIP_FROM_ITEM()                                                                   \\\n{                                                                                                       \\\n    if ((retVal == 0 || friendshipOnly) && !ShouldSkipFriendshipChange() && friendshipChange == 0)      \\\n    {                                                                                                   \\\n        friendshipChange = itemEffect[idx];                                                 \\\n        friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL);                                        \\\n        if (friendshipChange > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP)                            \\\n            friendship += 150 * friendshipChange / 100;                                                 \\\n        else                                                                                            \\\n            friendship += friendshipChange;                                                             \\\n        if (friendshipChange > 0)                                                                       \\\n        {                                                                                               \\\n            if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL)                           \\\n                friendship++;                                                                           \\\n            if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId())         \\\n                friendship++;                                                                           \\\n        }                                                                                               \\\n        if (friendship < 0)                                                                             \\\n            friendship = 0;                                                                             \\\n        if (friendship > MAX_FRIENDSHIP)                                                                \\\n            friendship = MAX_FRIENDSHIP;                                                                \\\n        SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);                                              \\\n        retVal = FALSE;                                                                                 \\\n    }                                                                                                   \\\n}\n\nbool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, bool8 usedByAI)\n{\n    u32 data;\n    s32 dataSigned;\n    s32 friendship;\n    s32 cmdIndex;\n    bool8 retVal = TRUE;\n    const u8 *itemEffect;\n    u8 idx = ITEM_EFFECT_ARG_START;\n    u32 i;\n    s8 friendshipChange = 0;\n    u8 holdEffect;\n    u8 battleMonId = MAX_BATTLERS_COUNT;\n    u16 heldItem;\n    u8 val;\n    u32 evDelta;\n    u32 friendshipOnly = FALSE;\n\n    // Get item hold effect\n    heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL);\n    if (heldItem == ITEM_ENIGMA_BERRY)\n    {\n        if (gMain.inBattle)\n            holdEffect = gEnigmaBerries[gBattlerInMenuId].holdEffect;\n        else\n            holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;\n    }\n    else\n    {\n        holdEffect = ItemId_GetHoldEffect(heldItem);\n    }\n\n    // Get battler id (if relevant)\n    gPotentialItemEffectBattler = gBattlerInMenuId;\n    if (gMain.inBattle)\n    {\n        gActiveBattler = gBattlerInMenuId;\n        cmdIndex = (GetBattlerSide(gActiveBattler) != B_SIDE_PLAYER);\n        while (cmdIndex < gBattlersCount)\n        {\n            if (gBattlerPartyIndexes[cmdIndex] == partyIndex)\n            {\n                battleMonId = cmdIndex;\n                break;\n            }\n            cmdIndex += 2;\n        }\n    }\n    else\n    {\n        gActiveBattler = 0;\n        battleMonId = MAX_BATTLERS_COUNT;\n    }\n\n    // Skip using the item if it won't do anything\n    if (!IS_POKEMON_ITEM(item))\n        return TRUE;\n    if (gItemEffectTable[item - ITEM_POTION] == NULL && item != ITEM_ENIGMA_BERRY)\n        return TRUE;\n\n    // Get item effect\n    if (item == ITEM_ENIGMA_BERRY)\n    {\n        if (gMain.inBattle)\n            itemEffect = gEnigmaBerries[gActiveBattler].itemEffect;\n        else\n            itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect;\n    }\n    else\n    {\n        itemEffect = gItemEffectTable[item - ITEM_POTION];\n    }\n\n    // Do item effect\n    for (cmdIndex = 0; cmdIndex < ITEM_EFFECT_ARG_START; cmdIndex++)\n    {\n        switch (cmdIndex)\n        {\n\n        // Handle ITEM0 effects (infatuation, Dire Hit, X Attack). ITEM0_SACRED_ASH is handled in party_menu.c\n        case 0:\n            // Cure infatuation\n            if ((itemEffect[cmdIndex] & ITEM0_INFATUATION)\n                && gMain.inBattle && battleMonId != MAX_BATTLERS_COUNT && (gBattleMons[battleMonId].status2 & STATUS2_INFATUATION))\n            {\n                gBattleMons[battleMonId].status2 &= ~STATUS2_INFATUATION;\n                retVal = FALSE;\n            }\n\n            // Dire Hit\n            if ((itemEffect[cmdIndex] & ITEM0_DIRE_HIT)\n             && !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY))\n            {\n                gBattleMons[gActiveBattler].status2 |= STATUS2_FOCUS_ENERGY;\n                retVal = FALSE;\n            }\n\n            // X Attack\n            if ((itemEffect[cmdIndex] & ITEM0_X_ATTACK)\n             && gBattleMons[gActiveBattler].statStages[STAT_ATK] < MAX_STAT_STAGE)\n            {\n                gBattleMons[gActiveBattler].statStages[STAT_ATK] += itemEffect[cmdIndex] & ITEM0_X_ATTACK;\n                if (gBattleMons[gActiveBattler].statStages[STAT_ATK] > MAX_STAT_STAGE)\n                    gBattleMons[gActiveBattler].statStages[STAT_ATK] = MAX_STAT_STAGE;\n                retVal = FALSE;\n            }\n            break;\n\n        // Handle ITEM1 effects (in-battle stat boosting effects)\n        case 1:\n            // X Defend\n            if ((itemEffect[cmdIndex] & ITEM1_X_DEFEND)\n             && gBattleMons[gActiveBattler].statStages[STAT_DEF] < MAX_STAT_STAGE)\n            {\n                gBattleMons[gActiveBattler].statStages[STAT_DEF] += (itemEffect[cmdIndex] & ITEM1_X_DEFEND) >> 4;\n                if (gBattleMons[gActiveBattler].statStages[STAT_DEF] > MAX_STAT_STAGE)\n                    gBattleMons[gActiveBattler].statStages[STAT_DEF] = MAX_STAT_STAGE;\n                retVal = FALSE;\n            }\n\n            // X Speed\n            if ((itemEffect[cmdIndex] & ITEM1_X_SPEED)\n             && gBattleMons[gActiveBattler].statStages[STAT_SPEED] < MAX_STAT_STAGE)\n            {\n                gBattleMons[gActiveBattler].statStages[STAT_SPEED] += itemEffect[cmdIndex] & ITEM1_X_SPEED;\n                if (gBattleMons[gActiveBattler].statStages[STAT_SPEED] > MAX_STAT_STAGE)\n                    gBattleMons[gActiveBattler].statStages[STAT_SPEED] = MAX_STAT_STAGE;\n                retVal = FALSE;\n            }\n            break;\n\n        // Handle ITEM2 effects (more stat boosting effects)\n        case 2:\n            // X Accuracy\n            if ((itemEffect[cmdIndex] & ITEM2_X_ACCURACY)\n             && gBattleMons[gActiveBattler].statStages[STAT_ACC] < MAX_STAT_STAGE)\n            {\n                gBattleMons[gActiveBattler].statStages[STAT_ACC] += (itemEffect[cmdIndex] & ITEM2_X_ACCURACY) >> 4;\n                if (gBattleMons[gActiveBattler].statStages[STAT_ACC] > MAX_STAT_STAGE)\n                    gBattleMons[gActiveBattler].statStages[STAT_ACC] = MAX_STAT_STAGE;\n                retVal = FALSE;\n            }\n\n            // X Sp Attack\n            if ((itemEffect[cmdIndex] & ITEM2_X_SPATK)\n             && gBattleMons[gActiveBattler].statStages[STAT_SPATK] < MAX_STAT_STAGE)\n            {\n                gBattleMons[gActiveBattler].statStages[STAT_SPATK] += itemEffect[cmdIndex] & ITEM2_X_SPATK;\n                if (gBattleMons[gActiveBattler].statStages[STAT_SPATK] > MAX_STAT_STAGE)\n                    gBattleMons[gActiveBattler].statStages[STAT_SPATK] = MAX_STAT_STAGE;\n                retVal = FALSE;\n            }\n            break;\n\n        // Handle ITEM3 effects (Guard Spec, Rare Candy, cure status)\n        case 3:\n            // Guard Spec\n            if ((itemEffect[cmdIndex] & ITEM3_GUARD_SPEC)\n             && gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer == 0)\n            {\n                gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer = 5;\n                retVal = FALSE;\n            }\n\n            // Rare Candy\n            if ((itemEffect[cmdIndex] & ITEM3_LEVEL_UP)\n             && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL)\n            {\n                data = gExperienceTables[gSpeciesInfo[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1];\n                SetMonData(mon, MON_DATA_EXP, &data);\n                CalculateMonStats(mon, FALSE);\n                retVal = FALSE;\n            }\n\n            // Cure status\n            if ((itemEffect[cmdIndex] & ITEM3_SLEEP)\n             && HealStatusConditions(mon, partyIndex, STATUS1_SLEEP, battleMonId) == 0)\n            {\n                if (battleMonId != MAX_BATTLERS_COUNT)\n                    gBattleMons[battleMonId].status2 &= ~STATUS2_NIGHTMARE;\n                retVal = FALSE;\n            }\n            if ((itemEffect[cmdIndex] & ITEM3_POISON) && HealStatusConditions(mon, partyIndex, STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER, battleMonId) == 0)\n                retVal = FALSE;\n            if ((itemEffect[cmdIndex] & ITEM3_BURN) && HealStatusConditions(mon, partyIndex, STATUS1_BURN, battleMonId) == 0)\n                retVal = FALSE;\n            if ((itemEffect[cmdIndex] & ITEM3_FREEZE) && HealStatusConditions(mon, partyIndex, STATUS1_FREEZE, battleMonId) == 0)\n                retVal = FALSE;\n            if ((itemEffect[cmdIndex] & ITEM3_PARALYSIS) && HealStatusConditions(mon, partyIndex, STATUS1_PARALYSIS, battleMonId) == 0)\n                retVal = FALSE;\n            if ((itemEffect[cmdIndex] & ITEM3_CONFUSION)  // heal confusion\n             && gMain.inBattle && battleMonId != MAX_BATTLERS_COUNT && (gBattleMons[battleMonId].status2 & STATUS2_CONFUSION))\n            {\n                gBattleMons[battleMonId].status2 &= ~STATUS2_CONFUSION;\n                retVal = FALSE;\n            }\n            break;\n\n        // Handle ITEM4 effects (Change HP/Atk EVs, HP heal, PP heal, PP up, Revive, and evolution stones)\n        case 4:\n            val = itemEffect[cmdIndex];\n\n            // PP Up\n            if (val & ITEM4_PP_UP)\n            {\n                val &= ~ITEM4_PP_UP;\n                data = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);\n                i = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);\n                if (data < 3 && i > 4)\n                {\n                    data = GetMonData(mon, MON_DATA_PP_BONUSES, NULL) + gPPUpAddValues[moveIndex];\n                    SetMonData(mon, MON_DATA_PP_BONUSES, &data);\n\n                    data = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - i;\n                    data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL) + data;\n                    SetMonData(mon, MON_DATA_PP1 + moveIndex, &data);\n                    retVal = FALSE;\n                }\n            }\n            i = 0;\n\n            // Loop through and try each of the remaining ITEM4 effects\n            while (val != 0)\n            {\n                if (val & 1)\n                {\n                    u16 evCount;\n                    s32 r5;\n     \n                    switch (i)\n                    {\n                    case 0: // ITEM4_EV_HP\n                    case 1: // ITEM4_EV_ATK\n                        evCount = GetMonEVCount(mon);\n                        dataSigned = GetMonData(mon, sGetMonDataEVConstants[i], NULL);\n                        if(itemEffect[idx] != 201) // if not EV-reducing berry\n                        {\n                            if (evCount >= MAX_TOTAL_EVS)\n                                return TRUE;\n                            if (dataSigned < EV_ITEM_RAISE_LIMIT)\n                            {\n                                if (dataSigned + itemEffect[idx] > EV_ITEM_RAISE_LIMIT)\n                                    evDelta = EV_ITEM_RAISE_LIMIT - (dataSigned + itemEffect[idx]) + itemEffect[idx];\n                                else\n                                    evDelta = itemEffect[idx];\n                                if (evCount + evDelta > MAX_TOTAL_EVS)\n                                    evDelta += MAX_TOTAL_EVS - (evCount + evDelta);\n                                dataSigned += evDelta;\n                            }\n                        }\n                        else\n                        {\n                            if (dataSigned == 0)\n                            {\n                                // No EVs to lose, but make sure friendship updates anyway\n                                friendshipOnly = TRUE;\n                                idx++;\n                                break;\n                                //do something with vars and break, EV is 0 already\n                            }\n                            dataSigned -= 10;\n                            if(dataSigned < 0)\n                            {\n                                dataSigned = 0;\n                            }\n                        }\n                        // Update EVs and stats\n                        SetMonData(mon, sGetMonDataEVConstants[i], &dataSigned);\n                        CalculateMonStats(mon, TRUE);\n                        idx++;\n                        retVal = FALSE;\n                        break;\n                    case 2: // ITEM4_HEAL_HP\n                        // If Revive, update number of times revive has been used\n                        if (val & (ITEM4_REVIVE >> 2))\n                        {\n                            if (gSaveBlock1Ptr->keyFlags.nuzlocke == 1 || GetMonData(mon, MON_DATA_HP, NULL) != 0)\n                            {\n                                idx++;\n                                break;\n                            }\n                            if (gMain.inBattle)\n                            {\n                                if (battleMonId != MAX_BATTLERS_COUNT)\n                                {\n                                    gAbsentBattlerFlags &= ~gBitTable[battleMonId];\n                                    CopyPlayerPartyMonToBattleData(battleMonId, GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battleMonId]));\n                                    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleResults.numRevivesUsed < 255)\n                                        gBattleResults.numRevivesUsed++;\n                                }\n                                else\n                                {\n                                    gAbsentBattlerFlags &= ~gBitTable[gActiveBattler ^ 2];\n                                    if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleResults.numRevivesUsed < 255)\n                                        gBattleResults.numRevivesUsed++;\n                                }\n                            }\n                        }\n                        else\n                        {\n                            if (GetMonData(mon, MON_DATA_HP, NULL) == 0)\n                            {\n                                idx++;\n                                break;\n                            }\n                        }\n\n                        // Get amount of HP to restore\n                        data = itemEffect[idx++];\n                        switch (data)\n                        {\n                        case ITEM6_HEAL_HP_FULL:\n                            data = GetMonData(mon, MON_DATA_MAX_HP, NULL) - GetMonData(mon, MON_DATA_HP, NULL);\n                            break;\n                        case ITEM6_HEAL_HP_HALF:\n                            data = GetMonData(mon, MON_DATA_MAX_HP, NULL) / 2;\n                            if (data == 0)\n                                data = 1;\n                            break;\n                        case ITEM6_HEAL_HP_LVL_UP:\n                            data = gBattleScripting.levelUpHP;\n                            break;\n                        }\n\n                        // Only restore HP if not at max health\n                        if (GetMonData(mon, MON_DATA_MAX_HP, NULL) != GetMonData(mon, MON_DATA_HP, NULL))\n                        {\n                            if (!usedByAI)\n                            {\n                                // Restore HP\n                                data = GetMonData(mon, MON_DATA_HP, NULL) + data;\n                                if (data > GetMonData(mon, MON_DATA_MAX_HP, NULL))\n                                    data = GetMonData(mon, MON_DATA_MAX_HP, NULL);\n                                SetMonData(mon, MON_DATA_HP, &data);\n                                \n                                // Update battler (if applicable)\n                                if (gMain.inBattle && battleMonId != MAX_BATTLERS_COUNT)\n                                {\n                                    gBattleMons[battleMonId].hp = data;\n                                    if (!(val & (ITEM4_REVIVE >> 2)) && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)\n                                    {\n                                        if (gBattleResults.numHealingItemsUsed < 255)\n                                            gBattleResults.numHealingItemsUsed++;\n\n                                        r5 = gActiveBattler;\n                                        gActiveBattler = battleMonId;\n                                        BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, 0);\n                                        MarkBattlerForControllerExec(gActiveBattler);\n                                        gActiveBattler = r5;\n                                    }\n                                }\n                            }\n                            else\n                            {\n                                gBattleMoveDamage = -data;\n                            }\n                            retVal = FALSE;\n                        }\n                        val &= ~(ITEM4_REVIVE >> 2);\n                        break;\n                    case 3: // ITEM4_HEAL_PP\n                        if (!(val & (ITEM4_HEAL_PP_ONE >> 3)))\n                        {\n                            // Heal PP for all moves\n                            for (r5 = 0; r5 < MAX_MON_MOVES; r5++)\n                            {\n                                u16 move_id;\n\n                                data = GetMonData(mon, MON_DATA_PP1 + r5, NULL);\n                                move_id = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL);\n                                if (data != CalculatePPWithBonus(move_id, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5))\n                                {\n                                    data += itemEffect[idx];\n                                    move_id = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL);\n                                    if (data > CalculatePPWithBonus(move_id, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5))\n                                    {\n                                        move_id = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL);\n                                        data = CalculatePPWithBonus(move_id, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5);\n                                    }\n                                    SetMonData(mon, MON_DATA_PP1 + r5, &data);\n                                    \n                                    // Heal battler PP too (if applicable)\n                                    if (gMain.inBattle && battleMonId != MAX_BATTLERS_COUNT && MOVE_IS_PERMANENT(battleMonId, r5))\n                                        gBattleMons[battleMonId].pp[r5] = data;\n\n                                    retVal = FALSE;\n                                }\n                            }\n                            idx++;\n                        }\n                        else\n                        {\n                            // Heal PP for one move\n                            u16 move_id;\n                            data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL);\n                            move_id = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL);\n                            if (data != CalculatePPWithBonus(move_id, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex))\n                            {\n                                data += itemEffect[idx++];\n                                move_id = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL);\n                                if (data > CalculatePPWithBonus(move_id, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex))\n                                {\n                                    move_id = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL);\n                                    data = CalculatePPWithBonus(move_id, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);\n                                }\n                                SetMonData(mon, MON_DATA_PP1 + moveIndex, &data);\n                                \n                                // Heal battler PP too (if applicable)\n                                if (gMain.inBattle && battleMonId != MAX_BATTLERS_COUNT && MOVE_IS_PERMANENT(battleMonId, moveIndex))\n                                    gBattleMons[battleMonId].pp[moveIndex] = data;\n\n                                retVal = FALSE;\n                            }\n                        }\n                        break;\n\n                    // cases 4-6 are ITEM4_HEAL_PP_ONE, ITEM4_PP_UP, and ITEM4_REVIVE, which\n                    // are already handled above by other cases or before the loop\n\n                    case 7: // ITEM4_EVO_STONE\n                        {\n                            u16 targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_ITEM_USE, item);\n\n                            if (targetSpecies != SPECIES_NONE)\n                            {\n                                BeginEvolutionScene(mon, targetSpecies, FALSE, partyIndex);\n                                return FALSE;\n                            }\n                        }\n                        break;\n                    }\n                }\n                i++;\n                val >>= 1;\n            }\n            break;\n\n        // Handle ITEM5 effects (Change Def/SpDef/SpAtk/Speed EVs, PP Max, and friendship changes)\n        case 5:\n            val = itemEffect[cmdIndex];\n            i = 0;\n\n            // Loop through and try each of the ITEM5 effects\n            while (val != 0)\n            {\n                if (val & 1)\n                {\n                    u16 evCount;\n\n                    switch (i)\n                    {\n                    case 0: // ITEM5_EV_DEF\n                    case 1: // ITEM5_EV_SPEED\n                    case 2: // ITEM5_EV_SPDEF\n                    case 3: // ITEM5_EV_SPATK\n                        evCount = GetMonEVCount(mon);\n                        dataSigned = GetMonData(mon, sGetMonDataEVConstants[i + 2], NULL);\n                        if(itemEffect[idx] != 201) // Not EV-reducing berry\n                        {\n                            // Has EV increase limit already been reached?\n                            if (evCount >= MAX_TOTAL_EVS)\n                                return TRUE;\n                            if (dataSigned >= EV_ITEM_RAISE_LIMIT)\n                                break;\n                            \n                            // Limit the increase\n                            if (dataSigned + itemEffect[idx] > EV_ITEM_RAISE_LIMIT)\n                                evDelta = EV_ITEM_RAISE_LIMIT - (dataSigned + itemEffect[idx]) + itemEffect[idx];\n                            else\n                                evDelta = itemEffect[idx];\n                            if (evCount + evDelta > MAX_TOTAL_EVS)\n                                evDelta += MAX_TOTAL_EVS - (evCount + evDelta);\n\n                            dataSigned += evDelta;\n                        }\n                        else\n                        {\n                            if (dataSigned == 0)\n                            {\n                                // No EVs to lose, but make sure friendship updates anyway\n                                friendshipOnly = TRUE;\n                                idx++;\n                                break;\n                                //do something with vars and break, EV is 0 already\n                            }\n                            dataSigned -= 10;\n                            if(dataSigned < 0)\n                            {\n                                dataSigned = 0;\n                            }\n                        }\n\n                        // Update EVs and stats\n                        SetMonData(mon, sGetMonDataEVConstants[i + 2], &dataSigned);\n                        CalculateMonStats(mon, TRUE);\n                        retVal = FALSE;\n                        idx++;\n                        break;\n                    case 4: // ITEM5_PP_MAX\n                        data = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);\n                        \n                        // Check if 3 PP Ups have been applied already\n                        if (data < 3)\n                        {\n                            evDelta = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);\n                            data = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);\n                            data &= gPPUpClearMask[moveIndex];\n                            data += gPPUpAddValues[moveIndex] * 3; // Apply 3 PP Ups (max)\n\n                            SetMonData(mon, MON_DATA_PP_BONUSES, &data);\n                            data = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - evDelta;\n                            data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL) + data;\n                            SetMonData(mon, MON_DATA_PP1 + moveIndex, &data);\n                            retVal = FALSE;\n                        }\n                        break;\n                    case 5: // ITEM5_FRIENDSHIP_LOW\n                        // Changes to friendship are given differently depending on\n                        // how much friendship the Pokémon already has.\n                        // In general, Pokémon with lower friendship receive more,\n                        // and Pokémon with higher friendship receive less.\n                        if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100)\n                            UPDATE_FRIENDSHIP_FROM_ITEM();\n                        idx++;\n                        break;\n                    case 6: // ITEM5_FRIENDSHIP_MID\n                        if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200)\n                            UPDATE_FRIENDSHIP_FROM_ITEM();\n                        idx++;\n                        break;\n                    case 7: // ITEM5_FRIENDSHIP_HIGH\n                        if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200)\n                            UPDATE_FRIENDSHIP_FROM_ITEM();\n                        idx++;\n                        break;\n                    }\n                }\n                i++;\n                val >>= 1;\n            }\n            break;\n        }\n    }\n    return retVal;\n}\n\nstatic bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)\n{\n    u32 status = GetMonData(mon, MON_DATA_STATUS, NULL);\n\n    if (status & healMask)\n    {\n        status &= ~healMask;\n        SetMonData(mon, MON_DATA_STATUS, &status);\n        if (gMain.inBattle && battleId != MAX_BATTLERS_COUNT)\n            gBattleMons[battleId].status1 &= ~healMask;\n        return FALSE;\n    }\n    else\n    {\n        return TRUE;\n    }\n}\n\nbool8 PokemonItemUseNoEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex)\n{\n    u32 data;\n    s32 tmp;\n    s32 cmdIndex;\n    bool8 retVal = TRUE;\n    const u8 *itemEffect;\n    u8 idx = ITEM_EFFECT_ARG_START;\n    u32 i;\n    s32 sp18 = 0;\n    u8 holdEffect;\n    u8 battlerId = MAX_BATTLERS_COUNT;\n    u16 heldItem;\n    u8 curEffect;\n    u32 curMoveId;\n\n    // Get item hold effect\n    heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL);\n    if (heldItem == ITEM_ENIGMA_BERRY)\n    {\n        if (gMain.inBattle)\n            holdEffect = gEnigmaBerries[gBattlerInMenuId].holdEffect;\n        else\n            holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;\n    }\n    else\n    {\n        holdEffect = ItemId_GetHoldEffect(heldItem);\n    }\n\n    // Get battler id (if relevant)\n    gPotentialItemEffectBattler = gBattlerInMenuId;\n    if (gMain.inBattle)\n    {\n        gActiveBattler = gBattlerInMenuId;\n        for (cmdIndex = GetBattlerSide(gActiveBattler) != B_SIDE_PLAYER;\n             cmdIndex < gBattlersCount;\n             cmdIndex += 2)\n        {\n            if (gBattlerPartyIndexes[cmdIndex] == partyIndex) \n            {\n                battlerId = cmdIndex;\n                break;\n            }\n        }\n    }\n    else\n    {\n        gActiveBattler = 0;\n        battlerId = MAX_BATTLERS_COUNT;\n    }\n\n    // Skip using the item if it won't do anything\n    if (!IS_POKEMON_ITEM(item))\n        return TRUE;\n    if (gItemEffectTable[item - ITEM_POTION] == NULL && item != ITEM_ENIGMA_BERRY)\n        return TRUE;\n\n    // Get item effect\n    if (item == ITEM_ENIGMA_BERRY)\n    {\n        if (gMain.inBattle)\n            itemEffect = gEnigmaBerries[gActiveBattler].itemEffect;\n        else\n            itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect;\n    }\n    else\n    {\n        itemEffect = gItemEffectTable[item - ITEM_POTION];\n    }\n\n    for (cmdIndex = 0; cmdIndex < ITEM_EFFECT_ARG_START; cmdIndex++)\n    {\n        switch (cmdIndex)\n        {\n        // status healing effects\n        case 0:\n            // Cure infatuation\n            if (itemEffect[cmdIndex] & ITEM0_INFATUATION && gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && gBattleMons[battlerId].status2 & STATUS2_INFATUATION)\n                retVal = FALSE;\n\n            // Dire Hit\n            if (itemEffect[cmdIndex] & ITEM0_DIRE_HIT && !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY))\n                retVal = FALSE;\n\n            // X Attack\n            if ((itemEffect[cmdIndex] & ITEM0_X_ATTACK)\n             && gBattleMons[gActiveBattler].statStages[STAT_ATK] < MAX_STAT_STAGE)\n                retVal = FALSE;\n            break;\n\n        // Handle ITEM1 effects (in-battle stat boosting effects)\n        case 1:\n            // X Defend\n            if ((itemEffect[cmdIndex] & ITEM1_X_DEFEND)\n             && gBattleMons[gActiveBattler].statStages[STAT_DEF] < MAX_STAT_STAGE)\n                retVal = FALSE;\n\n            // X Speed\n            if ((itemEffect[cmdIndex] & ITEM1_X_SPEED)\n             && gBattleMons[gActiveBattler].statStages[STAT_SPEED] < MAX_STAT_STAGE)\n                retVal = FALSE;\n            break;\n\n        // Handle ITEM2 effects (more stat boosting effects)\n        case 2:\n            // X Accuracy\n            if ((itemEffect[cmdIndex] & ITEM2_X_ACCURACY)\n             && gBattleMons[gActiveBattler].statStages[STAT_ACC] < MAX_STAT_STAGE)\n                retVal = FALSE;\n\n            // X Sp Attack\n            if ((itemEffect[cmdIndex] & ITEM2_X_SPATK)\n             && gBattleMons[gActiveBattler].statStages[STAT_SPATK] < MAX_STAT_STAGE)\n                retVal = FALSE;\n            break;\n\n        // Handle ITEM3 effects (Guard Spec, Rare Candy, cure status\n        case 3:\n            // Guard Spec\n            if ((itemEffect[cmdIndex] & ITEM3_GUARD_SPEC)\n             && gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer == 0)\n                retVal = FALSE;\n\n            // Rare Candy\n            if ((itemEffect[cmdIndex] & ITEM3_LEVEL_UP)\n             && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL)\n                retVal = FALSE;\n\n            // Cure status\n            if ((itemEffect[cmdIndex] & ITEM3_SLEEP)\n             && PartyMonHasStatus(mon, partyIndex, STATUS1_SLEEP, battlerId))\n                retVal = FALSE;\n            if ((itemEffect[cmdIndex] & ITEM3_POISON) && PartyMonHasStatus(mon, partyIndex, STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER, battlerId))\n                retVal = FALSE;\n            if ((itemEffect[cmdIndex] & ITEM3_BURN) && PartyMonHasStatus(mon, partyIndex, STATUS1_BURN, battlerId))\n                retVal = FALSE;\n            if ((itemEffect[cmdIndex] & ITEM3_FREEZE) && PartyMonHasStatus(mon, partyIndex, STATUS1_FREEZE, battlerId))\n                retVal = FALSE;\n            if ((itemEffect[cmdIndex] & ITEM3_PARALYSIS) && PartyMonHasStatus(mon, partyIndex, STATUS1_PARALYSIS, battlerId))\n                retVal = FALSE;\n            if (itemEffect[cmdIndex] & ITEM3_CONFUSION // heal confusion\n             && gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && (gBattleMons[battlerId].status2 & STATUS2_CONFUSION))\n                retVal = FALSE;\n            break;\n\n        // Handle ITEM4 effects (Change HP/Atk EVs, HP heal, PP heal, PP up, Revive, and evolution stones)\n        case 4:\n            curEffect = itemEffect[cmdIndex];\n            \n            // PP Up\n            if (curEffect & ITEM4_PP_UP)\n            {\n                curEffect &= ~ITEM4_PP_UP;\n                data = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);\n                i = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);\n                if (data < 3 && i > 4)\n                    retVal = FALSE;\n            }\n            i = 0;\n\n            // Loop through and try each of the remaining ITEM4 effects\n            while (curEffect)\n            {\n                if (curEffect & 1)\n                {\n                    switch (i)\n                    {\n                    case 0: // ITEM4_EV_HP\n                    case 1: // ITEM4_EV_ATK\n\n                        // Has EV increase limit already been reached?\n                        if (GetMonEVCount(mon) >= MAX_TOTAL_EVS)\n                            return TRUE;\n                        data = GetMonData(mon, sGetMonDataEVConstants[i], NULL);\n                        if (data < EV_ITEM_RAISE_LIMIT)\n                        {\n                            idx++;\n                            retVal = FALSE;\n                        }\n                        break;\n                    case 2: // ITEM4_HEAL_HP\n                        if (curEffect & (ITEM4_REVIVE >> 2))\n                        {\n                            if (gSaveBlock1Ptr->keyFlags.nuzlocke == 1 || GetMonData(mon, MON_DATA_HP, NULL) != 0)\n                            {\n                                idx++;\n                                break;\n                            }\n                        }\n                        else\n                        {\n                            if (GetMonData(mon, MON_DATA_HP, NULL) == 0)\n                            {\n                                idx++;\n                                break;\n                            }\n                        }\n                        if (GetMonData(mon, MON_DATA_MAX_HP, NULL) != GetMonData(mon, MON_DATA_HP, NULL))\n                            retVal = FALSE;\n                        idx++;\n                        curEffect &= ~(ITEM4_REVIVE >> 2);\n                        break;\n                    case 3:\n                        if (!(curEffect & (ITEM4_HEAL_PP_ONE >> 3)))\n                        {\n                            for (tmp = 0; tmp < MAX_MON_MOVES; tmp++)\n                            {\n                                data = GetMonData(mon, MON_DATA_PP1 + tmp, NULL);\n                                if (data != CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + tmp, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), tmp))\n                                    retVal = FALSE;\n                            }\n                            idx++;\n                        }\n                        else\n                        {\n                            data = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL);\n                            curMoveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL);\n                            if (data != CalculatePPWithBonus(curMoveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex))\n                            {\n                                idx++;\n                                retVal = FALSE;\n                            }\n                        }\n                        break;\n\n                    // cases 4-6 are ITEM4_HEAL_PP_ONE, ITEM4_PP_UP, and ITEM4_REVIVE, which\n                    // are already handled above by other cases or before the loop\n\n                    case 7: // ITEM4_EVO_STONE\n                        if (GetEvolutionTargetSpecies(mon, EVO_MODE_ITEM_USE, item) != SPECIES_NONE)\n                            return FALSE;\n                        break;\n                    }\n                }\n                i++;\n                curEffect >>= 1;\n            }\n            break;\n\n        // Handle ITEM5 effects (Change Def/SpDef/SpAtk/Speed EVs, PP Max, and friendship changes)\n        case 5:\n            curEffect = itemEffect[cmdIndex];\n            i = 0;\n\n            // Loop through and try each of the ITEM5 effects\n            while (curEffect)\n            {\n                if (curEffect & 1)\n                {\n                    switch (i)\n                    {\n                    case 0: // ITEM5_EV_DEF\n                    case 1: // ITEM5_EV_SPEED\n                    case 2: // ITEM5_EV_SPDEF\n                    case 3: // ITEM5_EV_SPATK\n                        if (GetMonEVCount(mon) >= MAX_TOTAL_EVS)\n                            return TRUE;\n                        data = GetMonData(mon, sGetMonDataEVConstants[i + 2], NULL);\n                        if (data < EV_ITEM_RAISE_LIMIT)\n                        {\n                            retVal = FALSE;\n                            idx++;\n                        }\n                        break;\n                    case 4: // ITEM5_PP_MAX\n                        data = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);\n                        tmp = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);\n\n                        // Check if 3 PP Ups have been applied already, and that the move has a total PP of at least 5 (excludes Sketch)\n                        if (data < 3 && tmp >= 5)\n                            retVal = FALSE;\n                        break;\n                    case 5: // ITEM5_FRIENDSHIP_LOW\n                        if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100\n                         && retVal == FALSE\n                         && sp18 == 0)\n                            sp18 = itemEffect[idx];\n                        idx++;\n                        break;\n                    case 6: // ITEM5_FRIENDSHIP_MID\n                        if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100\n                         && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200\n                         && retVal == FALSE\n                         && sp18 == 0)\n                            sp18 = itemEffect[idx];\n                        idx++;\n                        break;\n                    case 7: // ITEM5_FRIENDSHIP_HIGH\n                        if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200\n                         && retVal == FALSE\n                         && sp18 == 0)\n                            sp18 = itemEffect[idx];\n                        idx++;\n                        break;\n                    }\n                }\n                i++;\n                curEffect >>= 1;\n            }\n            break;\n        }\n    }\n    return retVal;\n}\n\nstatic bool8 PartyMonHasStatus(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)\n{\n    if ((GetMonData(mon, MON_DATA_STATUS, NULL) & healMask) != 0)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nu8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)\n{\n    const u8 *temp;\n    const u8 *itemEffect;\n    u8 offset;\n    int i;\n    u32 j;\n    u8 val;\n\n    offset = ITEM_EFFECT_ARG_START;\n\n    temp = gItemEffectTable[itemId - ITEM_POTION];\n\n    if (!temp && itemId != ITEM_ENIGMA_BERRY)\n        return 0;\n\n    if (itemId == ITEM_ENIGMA_BERRY)\n    {\n        temp = gEnigmaBerries[gActiveBattler].itemEffect;\n    }\n\n    itemEffect = temp;\n\n    for (i = 0; i < ITEM_EFFECT_ARG_START; i++)\n    {\n        switch (i)\n        {\n        case 0:\n        case 1:\n        case 2:\n        case 3:\n            if (i == effectByte)\n                return 0;\n            break;\n        case 4:\n            val = itemEffect[4];\n            if (val & ITEM4_PP_UP)\n                val &= ~ITEM4_PP_UP;\n            j = 0;\n            while (val)\n            {\n                if (val & 1)\n                {\n                    switch (j)\n                    {\n                    case 2: // ITEM4_HEAL_HP\n                        if (val & (ITEM4_REVIVE >> 2))\n                            val &= ~(ITEM4_REVIVE >> 2);\n                        // fallthrough\n                    case 0: // ITEM4_EV_HP\n                        if (i == effectByte && (val & effectBit))\n                            return offset;\n                        offset++;\n                        break;\n                    case 1: // ITEM4_EV_ATK\n                        if (i == effectByte && (val & effectBit))\n                            return offset;\n                        offset++;\n                        break;\n                    case 3: // ITEM4_HEAL_PP\n                        if (i == effectByte && (val & effectBit))\n                            return offset;\n                        offset++;\n                        break;\n                    case 7: // ITEM4_EVO_STONE\n                        if (i == effectByte)\n                            return 0;\n                        break;\n                    }\n                }\n                j++;\n                val >>= 1;\n                if (i == effectByte)\n                    effectBit >>= 1;\n            }\n            break;\n        case 5:\n            val = itemEffect[5];\n            j = 0;\n            while (val)\n            {\n                if (val & 1)\n                {\n                    switch (j)\n                    {\n                    case 0: // ITEM5_EV_DEF\n                    case 1: // ITEM5_EV_SPEED\n                    case 2: // ITEM5_EV_SPDEF\n                    case 3: // ITEM5_EV_SPATK\n                    case 4: // ITEM5_PP_MAX\n                    case 5: // ITEM5_FRIENDSHIP_LOW\n                    case 6: // ITEM5_FRIENDSHIP_MID\n                        if (i == effectByte && (val & effectBit))\n                            return offset;\n                        offset++;\n                        break;\n                    case 7: // ITEM5_FRIENDSHIP_HIGH\n                        if (i == effectByte)\n                            return 0;\n                        break;\n                    }\n                }\n                j++;\n                val >>= 1;\n                if (i == effectByte)\n                    effectBit >>= 1;\n            }\n            break;\n        }\n    }\n\n    return offset;\n}\n\nstatic void BufferStatRoseMessage(int statIdx)\n{\n    gBattlerTarget = gBattlerInMenuId;\n    StringCopy(gBattleTextBuff1, gStatNamesTable[sStatsToRaise[statIdx]]);\n    StringCopy(gBattleTextBuff2, gBattleText_Rose);\n    BattleStringExpandPlaceholdersToDisplayedString(gText_DefendersStatRose);\n}\n\nconst u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId)\n{\n    int i;\n    const u8 *itemEffect;\n\n    if (itemId == ITEM_ENIGMA_BERRY)\n    {\n        if (gMain.inBattle)\n        {\n            itemEffect = gEnigmaBerries[gBattlerInMenuId].itemEffect;\n        }\n        else\n        {\n            itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect;\n        }\n    }\n    else\n    {\n        itemEffect = gItemEffectTable[itemId - ITEM_POTION];\n    }\n\n    gPotentialItemEffectBattler = gBattlerInMenuId;\n\n    for (i = 0; i < 3; i++)\n    {\n        if (itemEffect[i] & (ITEM0_X_ATTACK | ITEM1_X_SPEED | ITEM2_X_SPATK))\n            BufferStatRoseMessage(i * 2);\n        if (itemEffect[i] & (ITEM0_DIRE_HIT | ITEM1_X_DEFEND | ITEM2_X_ACCURACY))\n        {\n            if (i != 0) // Dire Hit is the only ITEM0 above\n            {\n                BufferStatRoseMessage(i * 2 + 1);\n            }\n            else\n            {\n                gBattlerAttacker = gBattlerInMenuId;\n                BattleStringExpandPlaceholdersToDisplayedString(gBattleText_GetPumped);\n            }\n        }\n    }\n\n    if (itemEffect[3] & ITEM3_GUARD_SPEC)\n    {\n        gBattlerAttacker = gBattlerInMenuId;\n        BattleStringExpandPlaceholdersToDisplayedString(gBattleText_MistShroud);\n    }\n\n    return gDisplayedStringBattle;\n}\n\nu8 GetNature(struct Pokemon *mon)\n{\n    return GetMonData(mon, MON_DATA_PERSONALITY, NULL) % NUM_NATURES;\n}\n\nu8 GetNatureFromPersonality(u32 personality)\n{\n    return personality % NUM_NATURES;\n}\n\nu16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)\n{\n    int i;\n    u16 targetSpecies = 0;\n    u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);\n    u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL);\n    u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);\n    u8 level;\n    u16 friendship;\n    u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, NULL);\n    u16 upperPersonality = personality >> 16;\n    u8 holdEffect;\n\n    if (heldItem == ITEM_ENIGMA_BERRY)\n        holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;\n    else\n        holdEffect = ItemId_GetHoldEffect(heldItem);\n\n    // Prevent evolution with Everstone, unless we're just viewing the party menu with an evolution item\n    if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != EVO_MODE_ITEM_CHECK)\n        return 0;\n\n    switch (type)\n    {\n    case EVO_MODE_NORMAL:\n        level = GetMonData(mon, MON_DATA_LEVEL, NULL);\n        friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL);\n\n        for (i = 0; i < EVOS_PER_MON; i++)\n        {\n            switch (gEvolutionTable[species][i].method)\n            {\n            case EVO_FRIENDSHIP:\n                if (friendship >= 220)\n                    targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            case EVO_FRIENDSHIP_DAY: //changed to evolve by friendship outdoors (Towns and routes)\n                if (gMapHeader.mapType < MAP_TYPE_UNDERGROUND && friendship >= 220)\n                    targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            case EVO_FRIENDSHIP_NIGHT: //changed to evolve by friendship indoors (Caves and Indoors)\n                if (gMapHeader.mapType >= MAP_TYPE_UNDERGROUND && friendship >= 220)\n                    targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            case EVO_LEVEL:\n                if (gEvolutionTable[species][i].param <= level)\n                    targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            case EVO_LEVEL_ATK_GT_DEF:\n                if (gEvolutionTable[species][i].param <= level)\n                    if (GetMonData(mon, MON_DATA_ATK, NULL) > GetMonData(mon, MON_DATA_DEF, NULL))\n                        targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            case EVO_LEVEL_ATK_EQ_DEF:\n                if (gEvolutionTable[species][i].param <= level)\n                    if (GetMonData(mon, MON_DATA_ATK, NULL) == GetMonData(mon, MON_DATA_DEF, NULL))\n                        targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            case EVO_LEVEL_ATK_LT_DEF:\n                if (gEvolutionTable[species][i].param <= level)\n                    if (GetMonData(mon, MON_DATA_ATK, NULL) < GetMonData(mon, MON_DATA_DEF, NULL))\n                        targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            case EVO_LEVEL_SILCOON:\n                if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) <= 4)\n                    targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            case EVO_LEVEL_CASCOON:\n                if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) > 4)\n                    targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            case EVO_LEVEL_NINJASK:\n                if (gEvolutionTable[species][i].param <= level)\n                    targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            case EVO_BEAUTY:\n                if (gEvolutionTable[species][i].param <= beauty)\n                    targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            }\n        }\n        break;\n    case EVO_MODE_TRADE:\n        for (i = 0; i < EVOS_PER_MON; i++)\n        {\n            switch (gEvolutionTable[species][i].method)\n            {\n            case EVO_TRADE:\n                targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            case EVO_TRADE_ITEM:\n                if (gEvolutionTable[species][i].param == heldItem)\n                {\n                    targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                    heldItem = ITEM_NONE;\n                    SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem);\n                    targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                }\n                break;\n            }\n        }\n        break;\n    case EVO_MODE_ITEM_USE:\n    case EVO_MODE_ITEM_CHECK:\n        for (i = 0; i < EVOS_PER_MON; i++)\n        {\n            if (gEvolutionTable[species][i].method == EVO_ITEM\n             && gEvolutionTable[species][i].param == evolutionItem)\n            {\n                targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            }\n            if (gEvolutionTable[species][i].method == EVO_STONE_HELD\n             && gEvolutionTable[species][i].param == evolutionItem\n             && gEvolutionTable[species][i].param2 == heldItem)\n            {\n                targetSpecies = gEvolutionTable[species][i].targetSpecies;\n                break;\n            }\n        }\n        break;\n    }\n\n    return targetSpecies;\n}\n\nstatic u16 HoennPokedexNumToSpecies(u16 hoennNum)\n{\n    u16 species;\n\n    if (!hoennNum)\n        return 0;\n\n    species = 0;\n\n    while (species < NUM_SPECIES - 1 && sSpeciesToHoennPokedexNum[species] != hoennNum)\n        species++;\n\n    if (species == NUM_SPECIES - 1)\n        return 0;\n\n    return species + 1;\n}\n\nu16 NationalPokedexNumToSpecies(u16 nationalNum)\n{\n    u16 species;\n\n    if (!nationalNum)\n        return 0;\n\n    species = 0;\n\n    while (species < NUM_SPECIES - 1 && sSpeciesToNationalPokedexNum[species] != nationalNum)\n        species++;\n\n    if (species == NUM_SPECIES - 1)\n        return 0;\n\n    return species + 1;\n}\n\nu16 ExtendedPokedexNumToSpecies(u16 nationalNum)\n{\n    u16 species;\n\n    if (!nationalNum)\n        return 0;\n\n    species = 0;\n\n    while (species < NUM_SPECIES - 1 && sSpeciesToExtendedPokedexNum[species] != nationalNum)\n        species++;\n\n    if (species == NUM_SPECIES - 1)\n        return 0;\n\n    return species + 1;\n}\n\nstatic u16 NationalToHoennOrder(u16 nationalNum)\n{\n    u16 hoennNum;\n\n    if (!nationalNum)\n        return 0;\n\n    hoennNum = 0;\n\n    while (hoennNum < NUM_SPECIES - 1 && sHoennToNationalOrder[hoennNum] != nationalNum)\n        hoennNum++;\n\n    if (hoennNum == NUM_SPECIES - 1)\n        return 0;\n\n    return hoennNum + 1;\n}\n\nu16 NationalToExtendedOrder(u16 nationalNum)\n{\n    u16 extendedNum;\n\n    if (!nationalNum)\n        return 0;\n\n    extendedNum = 0;\n\n    while (extendedNum < NUM_SPECIES - 1 && sExtendedToNationalOrder[extendedNum] != nationalNum)\n        extendedNum++;\n\n    if (extendedNum == NUM_SPECIES - 1)\n        return 0;\n\n    return extendedNum + 1;\n}\n\nu16 SpeciesToNationalPokedexNum(u16 species)\n{\n    if (!species)\n        return 0;\n\n    return sSpeciesToNationalPokedexNum[species - 1];\n}\n\nstatic u16 SpeciesToHoennPokedexNum(u16 species)\n{\n    if (!species)\n        return 0;\n\n    return sSpeciesToHoennPokedexNum[species - 1];\n}\n\nu16 SpeciesToExtendedPokedexNum(u16 species)\n{\n    if (!species)\n        return 0;\n\n    return sSpeciesToExtendedPokedexNum[species - 1];\n}\n\nu16 HoennToNationalOrder(u16 hoennNum)\n{\n    if (!hoennNum)\n        return 0;\n\n    return sHoennToNationalOrder[hoennNum - 1];\n}\n\nu16 ExtendedToNationalOrder(u16 extendedNum)\n{\n    if (!extendedNum)\n        return 0;\n\n    return sExtendedToNationalOrder[extendedNum - 1];\n}\n\nu16 SpeciesToCryId(u16 species)\n{\n    if (species < SPECIES_OLD_UNOWN_B - 1)\n        return species;\n\n    if (species <= SPECIES_OLD_UNOWN_Z - 1)\n        return SPECIES_UNOWN - 1;\n\n    return sHoennSpeciesIdToCryId[species - ((SPECIES_OLD_UNOWN_Z + 1) - 1)];\n}\n\n// Spots can be drawn on Spinda's color indexes 1, 2, or 3\n#define FIRST_SPOT_COLOR 1\n#define LAST_SPOT_COLOR  3\n\n// To draw a spot pixel, add 4 to the color index\n#define SPOT_COLOR_ADJUSTMENT 4\n/*\n    The macro below handles drawing the randomly-placed spots on Spinda's front sprite.\n    Spinda has 4 spots, each with an entry in sSpindaSpotGraphics. Each entry contains\n    a base x and y coordinate for the spot and a 16x16 binary image. Each bit in the image\n    determines whether that pixel should be considered part of the spot.\n\n    The position of each spot is randomized using the Spinda's personality. The entire 32 bit\n    personality value is used, 4 bits for each coordinate of the 4 spots. If the personality\n    value is 0x87654321, then 0x1 will be used for the 1st spot's x coord, 0x2 will be used for\n    the 1st spot's y coord, 0x3 will be used for the 2nd spot's x coord, and so on. Each\n    coordinate is calculated as (baseCoord + (given 4 bits of personality) - 8). In effect this\n    means each spot can start at any position -8 to +7 off of its base coordinates (256 possibilities).\n\n    The macro then loops over the 16x16 spot image. For each bit in the spot's binary image, if\n    the bit is set then it's part of the spot; try to draw it. A pixel is drawn on Spinda if the\n    pixel on Spinda satisfies the following formula: ((u8)(colorIndex - 1) <= 2). The -1 excludes\n    transparent pixels, as these are index 0. Therefore only colors 1, 2, or 3 on Spinda will\n    allow a spot to be drawn. These color indexes are Spinda's light brown body colors. To create\n    the spot it adds 4 to the color index, so Spinda's spots will be colors 5, 6, and 7.\n\n    The above is done two different ways in the macro: one with << 4, and one without. This\n    is because Spinda's sprite is a 4 bits per pixel image, but the pointer to Spinda's pixels\n    (destPixels) is an 8 bit pointer, so it addresses two pixels. Shifting by 4 accesses the 2nd\n    of these pixels, so this is done every other time.\n*/\n#define DRAW_SPINDA_SPOTS(personality, dest)                                    \\\n{                                                                               \\\n    s32 i;                                                                      \\\n    for (i = 0; i < (s32)ARRAY_COUNT(sSpindaSpotGraphics); i++)                 \\\n    {                                                                           \\\n        s32 row;                                                                \\\n        u8 x = sSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8);           \\\n        u8 y = sSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8);    \\\n                                                                                \\\n        for (row = 0; row < SPINDA_SPOT_HEIGHT; row++)                          \\\n        {                                                                       \\\n            s32 column;                                                         \\\n            s32 spotPixelRow = sSpindaSpotGraphics[i].image[row];               \\\n                                                                                \\\n            for (column = x; column < x + SPINDA_SPOT_WIDTH; column++)          \\\n            {                                                                   \\\n                /* Get target pixels on Spinda's sprite */                      \\\n                u8 *destPixels = dest + ((column / 8) * TILE_SIZE_4BPP) +       \\\n                                        ((column % 8) / 2) +                    \\\n                                             ((y / 8) * TILE_SIZE_4BPP * 8) +   \\\n                                             ((y % 8) * 4);                     \\\n                                                                                \\\n                /* Is this pixel in the 16x16 spot image part of the spot? */   \\\n                if (spotPixelRow & 1)                                           \\\n                {                                                               \\\n                    /* destPixels addressess two pixels, alternate which */     \\\n                    /* of the two pixels is being considered for drawing */     \\\n                    if (column & 1)                                             \\\n                    {                                                           \\\n                        /* Draw spot pixel if this is Spinda's body color */    \\\n                        if ((u8)((*destPixels & 0xF0) - (FIRST_SPOT_COLOR << 4))\\\n                                 <= ((LAST_SPOT_COLOR - FIRST_SPOT_COLOR) << 4))\\\n                            *destPixels += (SPOT_COLOR_ADJUSTMENT << 4);        \\\n                    }                                                           \\\n                    else                                                        \\\n                    {                                                           \\\n                        /* Draw spot pixel if this is Spinda's body color */    \\\n                        if ((u8)((*destPixels & 0xF) - FIRST_SPOT_COLOR)        \\\n                                 <= (LAST_SPOT_COLOR - FIRST_SPOT_COLOR))       \\\n                            *destPixels += SPOT_COLOR_ADJUSTMENT;               \\\n                    }                                                           \\\n                }                                                               \\\n                                                                                \\\n                spotPixelRow >>= 1;                                             \\\n            }                                                                   \\\n                                                                                \\\n            y++;                                                                \\\n        }                                                                       \\\n                                                                                \\\n        personality >>= 8;                                                      \\\n    }                                                                           \\\n}\n\n// Same as DrawSpindaSpots but attempts to discern for itself whether or\n// not it's the front pic.\nstatic void DrawSpindaSpotsUnused(u16 species, u32 personality, u8 *dest)\n{\n    if (species == SPECIES_SPINDA\n        && dest != gMonSpritesGfxPtr->sprites[B_POSITION_PLAYER_LEFT]\n        && dest != gMonSpritesGfxPtr->sprites[B_POSITION_PLAYER_RIGHT])\n        DRAW_SPINDA_SPOTS(personality, dest);\n}\n\nvoid DrawSpindaSpots(u16 species, u32 personality, u8 *dest, bool8 isFrontPic)\n{\n    if (species == SPECIES_SPINDA && isFrontPic)\n        DRAW_SPINDA_SPOTS(personality, dest);\n}\n\nvoid EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies)\n{\n    u8 language;\n    GetMonData(mon, MON_DATA_NICKNAME, gStringVar1);\n    language = GetMonData(mon, MON_DATA_LANGUAGE, &language);\n    if (language == GAME_LANGUAGE && !StringCompare(gSpeciesNames[oldSpecies], gStringVar1))\n        SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]);\n}\n\n// The below two functions determine which side of a multi battle the trainer battles on\n// 0 is the left (top in  party menu), 1 is right (bottom in party menu)\nu8 GetPlayerFlankId(void)\n{\n    u8 flankId = 0;\n    switch (gLinkPlayers[GetMultiplayerId()].id)\n    {\n    case 0:\n    case 3:\n        flankId = 0;\n        break;\n    case 1:\n    case 2:\n        flankId = 1;\n        break;\n    }\n    return flankId;\n}\n\nu16 GetLinkTrainerFlankId(u8 linkPlayerId)\n{\n    u16 flankId = 0;\n    switch (gLinkPlayers[linkPlayerId].id)\n    {\n    case 0:\n    case 3:\n        flankId = 0;\n        break;\n    case 1:\n    case 2:\n        flankId = 1;\n        break;\n    }\n    return flankId;\n}\n\ns32 GetBattlerMultiplayerId(u16 id)\n{\n    s32 multiplayerId;\n    for (multiplayerId = 0; multiplayerId < MAX_LINK_PLAYERS; multiplayerId++)\n        if (gLinkPlayers[multiplayerId].id == id)\n            break;\n    return multiplayerId;\n}\n\nu8 GetTrainerEncounterMusicId(u16 trainerId)\n{\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    return ((sTrainers[trainerId].encounterMusic_gender & 0x7F));\n}\n\nstatic u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex)\n{\n// Because this is a u16 it will be unable to store the\n// result of the multiplication for any stat > 595 for a\n// positive nature and > 728 for a negative nature.\n// Neither occur in the base game, but this can happen if\n// any Nature-affected base stat is increased to a value\n// above 248. The closest by default is Shuckle at 230.\n#ifdef BUGFIX\n    u32 retVal;\n#else\n    u16 retVal;\n#endif\n\n    // Don't modify HP, Accuracy, or Evasion by nature\n    if (statIndex <= STAT_HP || statIndex > NUM_NATURE_STATS)\n        return stat;\n\n    switch (sNatureStatTable[nature][statIndex - 1])\n    {\n    case 1:\n        retVal = stat * 110;\n        retVal /= 100;\n        break;\n    case -1:\n        retVal = stat * 90;\n        retVal /= 100;\n        break;\n    default:\n        retVal = stat;\n        break;\n    }\n\n    return retVal;\n}\n\nvoid AdjustFriendship(struct Pokemon *mon, u8 event)\n{\n    u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL);\n    u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL);\n    u8 holdEffect;\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    if (heldItem == ITEM_ENIGMA_BERRY)\n    {\n        if (gMain.inBattle)\n            holdEffect = gEnigmaBerries[0].holdEffect;\n        else\n            holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;\n    }\n    else\n    {\n        holdEffect = ItemId_GetHoldEffect(heldItem);\n    }\n\n    if (species && species != SPECIES_EGG)\n    {\n        s8 delta;\n        // Friendship level refers to the column in sFriendshipEventDeltas.\n        // 0-99: Level 0 (maximum increase, typically)\n        // 100-199: Level 1\n        // 200-255: Level 2\n        u8 friendshipLevel = 0;\n        s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL);\n        if (friendship >= 100)\n            friendshipLevel++;\n        if (friendship >= 200)\n            friendshipLevel++;\n\n        if (event == FRIENDSHIP_EVENT_WALKING)\n        {\n            // 50% chance every 128 steps\n            if (Random() & 1)\n                return;\n        }\n        if (event == FRIENDSHIP_EVENT_LEAGUE_BATTLE)\n        {\n            // Only if it's a trainer battle with league progression significance\n            if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER))\n                return;\n            if (!(sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER\n                || sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR\n                || sTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION))\n                return;\n        }\n\n        delta = sFriendshipEventDeltas[event][friendshipLevel];\n        if (delta > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP)\n            // 50% increase, rounding down\n            delta = (150 * delta) / 100;\n\n        friendship += delta;\n        if (delta > 0)\n        {\n            if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL)\n                friendship++;\n            if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId())\n                friendship++;\n        }\n\n        if (friendship < 0)\n            friendship = 0;\n        if (friendship > MAX_FRIENDSHIP)\n            friendship = MAX_FRIENDSHIP;\n\n        SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);\n    }\n}\n\nvoid MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies)\n{\n    u8 evs[NUM_STATS];\n    u16 evIncrease = 0;\n    u16 totalEVs = 0;\n    u16 heldItem;\n    u8 holdEffect;\n    int i;\n\n    for (i = 0; i < NUM_STATS; i++)\n    {\n        evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, NULL);\n        totalEVs += evs[i];\n    }\n\n    for (i = 0; i < NUM_STATS; i++)\n    {\n        u8 hasHadPokerus;\n        int multiplier;\n\n        if (totalEVs >= MAX_TOTAL_EVS)\n            break;\n\n        hasHadPokerus = CheckPartyHasHadPokerus(mon, 0);\n\n        if (hasHadPokerus)\n            multiplier = 2;\n        else\n            multiplier = 1;\n\n        switch (i)\n        {\n        case STAT_HP:\n            evIncrease = gSpeciesInfo[defeatedSpecies].evYield_HP * multiplier;\n            break;\n        case STAT_ATK:\n            evIncrease = gSpeciesInfo[defeatedSpecies].evYield_Attack * multiplier;\n            break;\n        case STAT_DEF:\n            evIncrease = gSpeciesInfo[defeatedSpecies].evYield_Defense * multiplier;\n            break;\n        case STAT_SPEED:\n            evIncrease = gSpeciesInfo[defeatedSpecies].evYield_Speed * multiplier;\n            break;\n        case STAT_SPATK:\n            evIncrease = gSpeciesInfo[defeatedSpecies].evYield_SpAttack * multiplier;\n            break;\n        case STAT_SPDEF:\n            evIncrease = gSpeciesInfo[defeatedSpecies].evYield_SpDefense * multiplier;\n            break;\n        }\n\n        heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL);\n\n        if (heldItem == ITEM_ENIGMA_BERRY)\n        {\n            if (gMain.inBattle)\n                holdEffect = gEnigmaBerries[0].holdEffect;\n            else\n                holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;\n        }\n        else\n        {\n            holdEffect = ItemId_GetHoldEffect(heldItem);\n        }\n\n        if (holdEffect == HOLD_EFFECT_MACHO_BRACE)\n            evIncrease *= 2;\n\n        if (totalEVs + (s16)evIncrease > MAX_TOTAL_EVS)\n            evIncrease = ((s16)evIncrease + MAX_TOTAL_EVS) - (totalEVs + evIncrease);\n\n        if (evs[i] + (s16)evIncrease > MAX_PER_STAT_EVS)\n        {\n            int val1 = (s16)evIncrease + MAX_PER_STAT_EVS;\n            int val2 = evs[i] + evIncrease;\n            evIncrease = val1 - val2;\n        }\n\n        evs[i] += evIncrease;\n        totalEVs += evIncrease;\n        SetMonData(mon, MON_DATA_HP_EV + i, &evs[i]);\n    }\n}\n\nu16 GetMonEVCount(struct Pokemon *mon)\n{\n    int i;\n    u16 count = 0;\n\n    for (i = 0; i < NUM_STATS; i++)\n        count += GetMonData(mon, MON_DATA_HP_EV + i, NULL);\n\n    return count;\n}\n\n// This function was stubbed from RS, but it is stubbed badly.\n// This variable is likely the u8 passed to SetMonData in RSE.\n// The pointer reference causes agbcc to reserve it on the stack before even checking\n// whether it's used.\nvoid RandomlyGivePartyPokerus(struct Pokemon *party)\n{\n    u8 foo;\n    &foo;\n}\n\nu8 CheckPartyPokerus(struct Pokemon *party, u8 selection)\n{\n    u8 retVal;\n\n    int partyIndex = 0;\n    unsigned curBit = 1;\n    retVal = 0;\n\n    if (selection)\n    {\n        do\n        {\n            if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, NULL) & 0xF))\n                retVal |= curBit;\n            partyIndex++;\n            curBit <<= 1;\n            selection >>= 1;\n        }\n        while (selection);\n    }\n    else if (GetMonData(&party[0], MON_DATA_POKERUS, NULL) & 0xF)\n    {\n        retVal = 1;\n    }\n\n    return retVal;\n}\n\nu8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection)\n{\n    u8 retVal;\n\n    int partyIndex = 0;\n    unsigned curBit = 1;\n    retVal = 0;\n\n    if (selection)\n    {\n        do\n        {\n            if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, NULL))\n                retVal |= curBit;\n            partyIndex++;\n            curBit <<= 1;\n            selection >>= 1;\n        }\n        while (selection);\n    }\n    else if (GetMonData(&party[0], MON_DATA_POKERUS, NULL))\n    {\n        retVal = 1;\n    }\n\n    return retVal;\n}\n\n// These two functions are stubbed from RS, but they're stubbed badly.\n// See note on RandomlyGivePartyPokerus above.\nstatic void UpdatePartyPokerusTime(void)\n{\n    u8 foo;\n    &foo;\n}\n\nvoid PartySpreadPokerus(struct Pokemon *party)\n{\n    u8 foo;\n    &foo;\n}\n\nstatic void SetMonExpWithMaxLevelCheck(struct Pokemon *mon, int species, u8 unused, u32 data)\n{\n    if (data > gExperienceTables[gSpeciesInfo[species].growthRate][MAX_LEVEL])\n    {\n        data = gExperienceTables[gSpeciesInfo[species].growthRate][MAX_LEVEL];\n        SetMonData(mon, MON_DATA_EXP, &data);\n    }\n}\n\nbool8 TryIncrementMonLevel(struct Pokemon *mon)\n{\n    u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);\n    u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL);\n    u8 newLevel = level + 1;\n    u32 exp = GetMonData(mon, MON_DATA_EXP, NULL);\n\n    if (level < MAX_LEVEL)\n    {\n        if (exp > gExperienceTables[gSpeciesInfo[species].growthRate][newLevel])\n        {\n            SetMonData(mon, MON_DATA_LEVEL, &newLevel);\n            SetMonExpWithMaxLevelCheck(mon, species, newLevel, exp);\n            return TRUE;\n        }\n        else\n            return FALSE;\n    }\n    else\n    {\n        SetMonExpWithMaxLevelCheck(mon, species, level, exp);\n        return FALSE;\n    }\n}\n\nu32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm)\n{\n    u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL);\n    const u8 *learnableMoves;\n    if (species == SPECIES_EGG)\n    {\n        return 0;\n    }\n    learnableMoves = gTMHMLearnsets[species];\n    while (*learnableMoves != 0xFF)\n    {\n        if (*learnableMoves == tm)\n            return TRUE;\n        learnableMoves++;\n    }\n    return FALSE;\n}\n\nu8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves)\n{\n    u16 learnedMoves[MAX_MON_MOVES];\n    u8 numMoves = 0;\n    u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);\n    u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL);\n    bool8 isHatched = FALSE;\n    int ii, jj, i, j, k;\n    u8 deoxysForme;\n    s8 numInLine;\n    u16 maxEvo;\n    u8 tempMoveNum;\n    u16 evoLine[EVOS_PER_LINE] = {SPECIES_NONE, SPECIES_NONE, SPECIES_NONE, SPECIES_NONE, SPECIES_NONE, SPECIES_NONE};\n    if(GetMonData(mon, MON_DATA_MET_LEVEL, 0) == 0)\n    {\n        isHatched = TRUE;\n    }\n    else if((species == SPECIES_WYNAUT || species == SPECIES_WOBBUFFET) && GetMonData(mon, MON_DATA_MET_LOCATION, 0) == MAPSEC_ROUTE_130)\n    {   //Wynaut/Wobbuffet caught on Mirage Island can relearn baby moves; only catchable baby in Gen 3\n        isHatched = TRUE;\n    }\n    else if((species == SPECIES_ELEKID || species == SPECIES_ELECTABUZZ) && GetMonData(mon, MON_DATA_MET_LEVEL, 0) == 20 && GetMonData(mon, MON_DATA_MET_GAME, 0) == VERSION_GAMECUBE)\n    {   //Hordel's Elekid can relearn baby moves; only other unbred baby in Gen 3\n        isHatched = TRUE;\n    }\n    for (i = 0; i < MAX_MON_MOVES; i++)\n        learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL);\n\n    if(species == SPECIES_DEOXYS)\n    {\n        deoxysForme = GetMonData(mon, MON_DATA_FORME, 0);\n        for (i = 0; i < 20; i++)\n        {\n            u16 moveLevel;\n\n            if (sDeoxysLevelUpLearnsets[deoxysForme][i] == LEVEL_UP_END)\n                break;\n\n            moveLevel = sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_LV;\n\n            if (moveLevel <= (level << 9))\n            {\n                for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID); j++)\n                    ;\n\n                if (j == MAX_MON_MOVES)\n                {\n                    for (k = 0; k < numMoves && moves[k] != (sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID); k++)\n                        ;\n\n                    if (k == numMoves)\n                        moves[numMoves++] = sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID;\n                }\n            }\n        }\n    }\n    else\n    {\n        bool8 addMove = TRUE;\n        numInLine = PopulateSpeciesEvoLineForRelearner(species, isHatched, evoLine);\n        for(ii = 0; ii < numInLine; ii++)\n        {\n            species = evoLine[ii];\n            //mgba_printf(MGBA_LOG_DEBUG, \"Top of ii loop species: %d %s\", species, ConvertToAscii(gSpeciesNames[species]));\n            for (i = 0; i < 20; i++)\n            {\n                u16 moveLevel;\n\n                if (gLevelUpLearnsets[species][i] == LEVEL_UP_END)\n                    break;\n\n                moveLevel = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_LV;\n\n                if (moveLevel <= (level << 9))\n                {\n                    //mgba_printf(MGBA_LOG_DEBUG, \"Considering adding: %d %s\", species, ConvertToAscii(gMoveNames[gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID]));\n                    for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); j++)\n                        ; //skips adding already-known moves to list\n\n                    if (j == MAX_MON_MOVES) //if skipped all already-known moves\n                    {\n                        for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); k++)\n                            ; //skips moves that have already been added to the list?\n\n                        if (k == numMoves) //adds moves to back of list\n                        {\n                            if(addMove)\n                            {\n                                moves[numMoves++] = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID;\n                                addMove = TRUE;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        numInLine -= 1;\n        if(numInLine == 0)\n            return numMoves;\n        maxEvo = numInLine;\n        tempMoveNum = numMoves;\n        for(ii = 0; ii < tempMoveNum; ii++)\n        {\n            numInLine = maxEvo - 1;\n            //mgba_printf(MGBA_LOG_DEBUG, \"Considering removing: %s\", ConvertToAscii(gMoveNames[moves[ii]]));\n            for(i = 0; i < 20 && gLevelUpLearnsets[evoLine[maxEvo]][i] != LEVEL_UP_END; i++)\n            {\n                //mgba_printf(MGBA_LOG_DEBUG, \"Max evo is %d: %s\", evoLine[maxEvo], ConvertToAscii(gSpeciesNames[evoLine[maxEvo]]));\n                //mgba_printf(MGBA_LOG_DEBUG, \"Checking move %s in maxEvo's learnset.\", ConvertToAscii(gMoveNames[gLevelUpLearnsets[evoLine[maxEvo]][i] & LEVEL_UP_MOVE_ID]));\n                if(moves[ii] == (gLevelUpLearnsets[evoLine[maxEvo]][i] & LEVEL_UP_MOVE_ID))\n                {   //found move in max evo list\n                    //mgba_printf(MGBA_LOG_DEBUG, \"Found move %s in maxEvo's learnset.\", ConvertToAscii(gMoveNames[moves[ii]]));\n                    //mgba_printf(MGBA_LOG_DEBUG, \"numInLine == %d\", numInLine);\n                    while(numInLine > -1) //check all pre-evos for move\n                    {\n                        //mgba_printf(MGBA_LOG_DEBUG, \"numInLine == %d\", numInLine);\n                        for(j = 0; j < 20 && gLevelUpLearnsets[evoLine[numInLine]][j] != LEVEL_UP_END; j++)\n                        {\n                            if(moves[ii] == (gLevelUpLearnsets[evoLine[numInLine]][j] & LEVEL_UP_MOVE_ID))\n                            {   //found move in preevo list\n                                //mgba_printf(MGBA_LOG_DEBUG, \"Found move %s in preEvo's learnset.\", ConvertToAscii(gMoveNames[moves[ii]]));\n                                //mgba_printf(MGBA_LOG_DEBUG, \"About to check maxEvo's learnset for %s 's level.\", ConvertToAscii(gMoveNames[(gLevelUpLearnsets[evoLine[maxEvo]][i] & LEVEL_UP_MOVE_ID)]));\n                                if((gLevelUpLearnsets[evoLine[maxEvo]][i] & LEVEL_UP_MOVE_LV) > (level << 9))\n                                { //max evo too low to know this move, remove it\n                                    //mgba_printf(MGBA_LOG_DEBUG, \"Move level found is %d.\", (gLevelUpLearnsets[evoLine[maxEvo]][i] & LEVEL_UP_MOVE_LV) >> 9);\n                                    //mgba_printf(MGBA_LOG_DEBUG, \"Actual mon level is %d.\", level);\n                                    //mgba_printf(MGBA_LOG_DEBUG, \"Removing move %s in moves array.\", ConvertToAscii(gMoveNames[moves[ii]]));\n                                    moves[ii] = MOVE_NONE;\n                                    numMoves--;\n                                }\n                            }\n                        }\n                        numInLine--;\n                    }\n                }\n            }\n        }\n        //mgba_printf(MGBA_LOG_DEBUG, \"Before removing gaps.\");\n        //for(i = 0; i < 20; i++)\n            //mgba_printf(MGBA_LOG_DEBUG, \"List Move %d is %s.\", i, ConvertToAscii(gMoveNames[moves[i]]));\n        for(i = 0; i < 20; i++) //compact moves to remove gaps\n        {   \n            //mgba_printf(MGBA_LOG_DEBUG, \"i is %d.\", i);\n            if(moves[i] != MOVE_NONE)\n            {\n                //mgba_printf(MGBA_LOG_DEBUG, \"moves[i] is not MOVE_NONE, continuing.\");\n                continue;\n            }\n            for(j = i; j < 20; j++)\n            {\n                //mgba_printf(MGBA_LOG_DEBUG, \"j is %d.\", j);\n                if(moves[j] == MOVE_NONE)\n                {\n                    //mgba_printf(MGBA_LOG_DEBUG, \"moves[j] is MOVE_NONE, continuing.\");\n                    continue;\n                }\n                //mgba_printf(MGBA_LOG_DEBUG, \"moves[j] is %s\", ConvertToAscii(gMoveNames[moves[j]]));\n                moves[i] = moves[j];\n                //mgba_printf(MGBA_LOG_DEBUG, \"moves[i] now is %s\", ConvertToAscii(gMoveNames[moves[j]]));\n                moves[j] = MOVE_NONE;\n                //mgba_printf(MGBA_LOG_DEBUG, \"moves[j] now is MOVE_NONE\");\n                break;\n            }\n        }\n        //mgba_printf(MGBA_LOG_DEBUG, \"After removing gaps.\");\n        //for(i = 0; i < 20; i++)\n            //mgba_printf(MGBA_LOG_DEBUG, \"List Move %d is %s.\", i, ConvertToAscii(gMoveNames[moves[i]]));\n    }\n    return numMoves;\n}\n\nstatic u8 PopulateSpeciesEvoLineForRelearner(u16 species, bool8 isHatched, u16 evoLine[])\n{\n    s32 i;\n    s32 j;\n    u8 numInLine = 0;\n    u16 speciesToRemove1 = SPECIES_NONE;\n    u16 speciesToRemove2 = SPECIES_NONE;\n    if((species >= SPECIES_VAPOREON && species <= SPECIES_FLAREON) || (species == SPECIES_ESPEON || species == SPECIES_UMBREON))\n    {   //Eevee special handling\n        evoLine[0] = SPECIES_EEVEE;\n        evoLine[1] = species;\n        numInLine = 2;\n        return numInLine;\n    }\n    for (i = EVOS_PER_LINE - 1; i > -1; i--) //starting at highest evo\n    {\n        if(gEvolutionLines[species][i] <= species) //start at move relearner's species and work down (babies not included)\n            evoLine[i] = gEvolutionLines[species][i];\n        if(isHatched && gEvolutionLines[species][i] > species && i == 0) //add baby if move relearner mon was hatched && has baby form\n            evoLine[i] = gEvolutionLines[species][i];\n    }\n    switch(species) //remove species if branched evo and not in current branch\n    {\n        case SPECIES_BELLOSSOM:\n            speciesToRemove1 = SPECIES_VILEPLUME;\n            break;\n        case SPECIES_POLITOED:\n            speciesToRemove1 = SPECIES_POLIWRATH;\n            break;\n        case SPECIES_SLOWKING:\n            speciesToRemove1 = SPECIES_SLOWBRO;\n            break;\n        case SPECIES_HITMONTOP:\n            speciesToRemove1 = SPECIES_HITMONCHAN;\n            speciesToRemove2 = SPECIES_HITMONLEE;\n            break;\n        case SPECIES_HITMONCHAN:\n            speciesToRemove1 = SPECIES_HITMONLEE;\n            break;\n        case SPECIES_CASCOON:\n        case SPECIES_DUSTOX:\n            speciesToRemove1 = SPECIES_SILCOON;\n            speciesToRemove2 = SPECIES_BEAUTIFLY;\n            break;\n        case SPECIES_SHEDINJA:\n            speciesToRemove1 = SPECIES_NINJASK;\n            break;\n        case SPECIES_GOREBYSS:\n            speciesToRemove1 = SPECIES_HUNTAIL;\n            break;\n    }\n    for(i = 0; i < EVOS_PER_LINE; i++) //actual removal\n    {\n        if(speciesToRemove1 != SPECIES_NONE)\n        {\n            if(evoLine[i] == speciesToRemove1)\n                evoLine[i] = SPECIES_NONE;\n        }\n        if(speciesToRemove2 != SPECIES_NONE)\n        {\n            if(evoLine[i] == speciesToRemove2)\n                evoLine[i] = SPECIES_NONE;\n        }\n    }\n    //mgba_printf(MGBA_LOG_DEBUG, \"Before compaction:\", numInLine);\n    //for(i = 0; i < EVOS_PER_LINE; i++)\n        //mgba_printf(MGBA_LOG_DEBUG, \"%d %s\", evoLine[i], ConvertToAscii(gSpeciesNames[evoLine[i]]));\n    for(i = 0; i < EVOS_PER_LINE; i++) //compact species to front\n    {   \n        if(evoLine[i] != SPECIES_NONE)\n        {\n            continue;\n        }\n        for(j = i; j < EVOS_PER_LINE; j++)\n        {\n            if(evoLine[j] == SPECIES_NONE)\n                continue;\n            evoLine[i] = evoLine[j];\n            evoLine[j] = SPECIES_NONE;\n            break;\n        }\n    }\n    for(i = 0; i < EVOS_PER_LINE; i++)\n    {\n        if(evoLine[i] != SPECIES_NONE)\n            numInLine++;\n    }\n    //mgba_printf(MGBA_LOG_DEBUG, \"numInLine == %d; Result of compaction:\", numInLine);\n    //for(i = 0; i < EVOS_PER_LINE; i++)\n        //mgba_printf(MGBA_LOG_DEBUG, \"%d %s\", evoLine[i], ConvertToAscii(gSpeciesNames[evoLine[i]]));\n    return numInLine;\n}\n\nu8 GetLevelUpMovesBySpecies(u16 species, u16 *moves)\n{\n    u8 numMoves = 0;\n    int i;\n\n    for (i = 0; i < MAX_LEVEL_UP_MOVES && gLevelUpLearnsets[species][i] != LEVEL_UP_END; i++)\n         moves[numMoves++] = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID;\n\n     return numMoves;\n}\n\nu8 GetNumberOfRelearnableMoves(struct Pokemon *mon)\n{\n    u16 learnedMoves[MAX_MON_MOVES];\n    u16 moves[MAX_LEVEL_UP_MOVES];\n    u8 numMoves = 0;\n    u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL);\n    u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL);\n    int i, j, k;\n    u8 deoxysForme;\n\n    if (species == SPECIES_EGG)\n        return 0;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n        learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL);\n\n    if(species == SPECIES_DEOXYS)\n    {\n        deoxysForme = GetMonData(mon, MON_DATA_FORME, 0);\n        for (i = 0; i < MAX_LEVEL_UP_MOVES; i++)\n        {\n            u16 moveLevel;\n\n            if (sDeoxysLevelUpLearnsets[deoxysForme][i] == LEVEL_UP_END)\n                break;\n\n            moveLevel = sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_LV;\n\n            if (moveLevel <= (level << 9))\n            {\n                for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID); j++)\n                    ;\n\n                if (j == MAX_MON_MOVES)\n                {\n                    for (k = 0; k < numMoves && moves[k] != (sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID); k++)\n                        ;\n\n                    if (k == numMoves)\n                        moves[numMoves++] = sDeoxysLevelUpLearnsets[deoxysForme][i] & LEVEL_UP_MOVE_ID;\n                }\n            }\n        }\n    }\n    else\n    {\n        for (i = 0; i < MAX_LEVEL_UP_MOVES; i++)\n        {\n            u16 moveLevel;\n\n            if (gLevelUpLearnsets[species][i] == LEVEL_UP_END)\n                break;\n\n            moveLevel = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_LV;\n\n            if (moveLevel <= (level << 9))\n            {\n                for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); j++)\n                    ;\n\n                if (j == MAX_MON_MOVES)\n                {\n                    for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); k++)\n                        ;\n\n                    if (k == numMoves)\n                        moves[numMoves++] = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID;\n                }\n            }\n        }\n    }\n\n    return numMoves;\n}\n\nu16 SpeciesToPokedexNum(u16 species)\n{\n    species = SpeciesToNationalPokedexNum(species);\n\n    if(FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX) && !IsNationalPokedexEnabled())\n    {\n        species = SpeciesToExtendedPokedexNum(species);\n        if(species > EXTENDED_DEX_COUNT)\n            return 0xFFFF;\n        return species;\n    }\n\n    if (!IsNationalPokedexEnabled() && species > KANTO_SPECIES_END)\n        return 0xFFFF;\n    return species;\n}\n\nvoid ClearBattleMonForms(void)\n{\n    int i;\n    for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n        gBattleMonForms[i] = 0;\n}\n\nstatic u16 GetBattleBGM(void)\n{\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)\n        return MUS_VS_KYOGRE_GROUDON;\n    if (gBattleTypeFlags & BATTLE_TYPE_REGI)\n        return MUS_VS_REGI;\n    if (gBattleTypeFlags & BATTLE_TYPE_ROAMER)\n        return MUS_C_VS_LEGEND_BEAST;\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n        return MUS_RS_VS_TRAINER;\n    if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)\n        return MUS_RS_VS_TRAINER;\n    if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n    {\n        switch (sTrainers[gTrainerBattleOpponent_A].trainerClass)\n        {\n        case TRAINER_CLASS_PKMN_PROF:\n        case TRAINER_CLASS_CHAMPION:\n            return MUS_VS_CHAMPION;\n        case TRAINER_CLASS_LEADER:\n        case TRAINER_CLASS_ELITE_FOUR:\n            return MUS_VS_GYM_LEADER;\n        case TRAINER_CLASS_BOSS:\n        case TRAINER_CLASS_TEAM_ROCKET:\n        case TRAINER_CLASS_COOLTRAINER:\n        case TRAINER_CLASS_GENTLEMAN:\n        case TRAINER_CLASS_RIVAL_LATE:\n        default:\n            return MUS_VS_TRAINER;\n        }\n    }\n    if ((gMapHeader.regionMapSectionId == MAPSEC_ARTISAN_CAVE || gMapHeader.regionMapSectionId == MAPSEC_BATTLE_FRONTIER) && !(gBattleTypeFlags & BATTLE_TYPE_POKEDUDE))\n    {\n        return MUS_RS_VS_WILD;\n    }\n    return MUS_VS_WILD;\n}\n\nvoid PlayBattleBGM(void)\n{\n    ResetMapMusic();\n    m4aMPlayAllStop();\n    PlayBGM(GetBattleBGM());\n}\n\nvoid PlayMapChosenOrBattleBGM(u16 songId)\n{\n    ResetMapMusic();\n    m4aMPlayAllStop();\n    if (songId)\n        PlayNewMapMusic(songId);\n    else\n        PlayNewMapMusic(GetBattleBGM());\n}\n\nconst u32 *GetMonFrontSpritePal(struct Pokemon *mon)\n{\n    u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL);\n    u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL);\n    u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);\n    return GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality);\n}\n\nconst u32 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality)\n{\n    u32 shinyValue;\n    shinyValue = GET_SHINY_VALUE(otId, personality);\n\n    if (species >= 65530 && species <= 65533) //Deoxys\n    {\n        if(shinyValue < SHINY_ODDS)\n            return gMonShinyPaletteTable[SPECIES_DEOXYS].data;\n        else\n            return gMonPaletteTable[SPECIES_DEOXYS].data;\n    }\n\n    if (species > SPECIES_EGG)\n        return gMonPaletteTable[0].data;\n\n    if (shinyValue < SHINY_ODDS)\n        return gMonShinyPaletteTable[species].data;\n    else\n        return gMonPaletteTable[species].data;\n}\n\nconst struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon)\n{\n    u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL);\n    u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL);\n    u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);\n    return GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);\n}\n\nconst struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality)\n{\n    u32 shinyValue;\n\n    shinyValue = GET_SHINY_VALUE(otId, personality);\n    if (species >= 65530 && species <= 65533) //Deoxys\n    {\n        if(shinyValue < SHINY_ODDS)\n            return &gMonShinyPaletteTable[SPECIES_DEOXYS];\n        else\n            return &gMonPaletteTable[SPECIES_DEOXYS];\n    }\n    if (shinyValue < SHINY_ODDS)\n        return &gMonShinyPaletteTable[species];\n    else\n        return &gMonPaletteTable[species];\n}\n\nbool32 IsHMMove2(u16 move)\n{\n    int i = 0;\n    while (sHMMoves[i] != HM_MOVES_END)\n    {\n        if (sHMMoves[i++] == move)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nbool8 IsMonSpriteNotFlipped(u16 species)\n{\n    return gSpeciesInfo[species].noFlip;\n}\n\nstatic s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor)\n{\n    u8 nature = GetNature(mon);\n    return sPokeblockFlavorCompatibilityTable[nature * FLAVOR_COUNT + flavor];\n}\n\ns8 GetFlavorRelationByPersonality(u32 personality, u8 flavor)\n{\n    u8 nature = GetNatureFromPersonality(personality);\n    return sPokeblockFlavorCompatibilityTable[nature * FLAVOR_COUNT + flavor];\n}\n\nbool8 IsTradedMon(struct Pokemon *mon)\n{\n    u8 otName[PLAYER_NAME_LENGTH + 1];\n    u32 otId;\n    GetMonData(mon, MON_DATA_OT_NAME, otName);\n    otId = GetMonData(mon, MON_DATA_OT_ID, NULL);\n    return IsOtherTrainer(otId, otName);\n}\n\nbool8 IsOtherTrainer(u32 otId, u8 *otName)\n{\n    if (otId ==\n        (gSaveBlock2Ptr->playerTrainerId[0]\n         | (gSaveBlock2Ptr->playerTrainerId[1] << 8)\n         | (gSaveBlock2Ptr->playerTrainerId[2] << 16)\n         | (gSaveBlock2Ptr->playerTrainerId[3] << 24)))\n    {\n        int i;\n\n        for (i = 0; otName[i] != EOS; i++)\n            if (otName[i] != gSaveBlock2Ptr->playerName[i])\n                return TRUE;\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nvoid MonRestorePP(struct Pokemon *mon)\n{\n    BoxMonRestorePP(&mon->box);\n}\n\nvoid BoxMonRestorePP(struct BoxPokemon *boxMon)\n{\n    int i;\n\n    for (i = 0; i < MAX_MON_MOVES; i++)\n    {\n        if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0))\n        {\n            u16 move = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0);\n            u16 bonus = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, 0);\n            u8 pp = CalculatePPWithBonus(move, bonus, i);\n            SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp);\n        }\n    }\n}\n\nvoid SetMonPreventsSwitchingString(void)\n{\n    gLastUsedAbility = gBattleStruct -> abilityPreventingSwitchout;\n    gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN;\n    gBattleTextBuff1[1] = B_BUFF_MON_NICK_WITH_PREFIX;\n    gBattleTextBuff1[2] = gBattleStruct->battlerPreventingSwitchout;\n    gBattleTextBuff1[4] = B_BUFF_EOS;\n\n    if (GetBattlerSide(gBattleStruct->battlerPreventingSwitchout) == B_SIDE_PLAYER)\n        gBattleTextBuff1[3] = GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[gBattleStruct->battlerPreventingSwitchout]);\n    else\n        gBattleTextBuff1[3] = gBattlerPartyIndexes[gBattleStruct->battlerPreventingSwitchout];\n\n    PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff2, gBattlerInMenuId, GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[gBattlerInMenuId]))\n\n    BattleStringExpandPlaceholders(gText_PkmnsXPreventsSwitching, gStringVar4);\n}\n\nvoid SetWildMonHeldItem(void)\n{\n    if (!(gBattleTypeFlags & (BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER)))\n    {\n        u16 rnd = Random() % 100;\n        u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL);\n        u16 var1 = 45;\n        u16 var2 = 95;\n        bool8 isHighLeveledPikachu = FALSE;\n        if(species == SPECIES_PIKACHU && GetCurrentRegionMapSectionId() != MAPSEC_VIRIDIAN_FOREST)\n            isHighLeveledPikachu = TRUE;\n\n        if (!GetMonData(&gPlayerParty[0], MON_DATA_IS_EGG, 0)\n            && GetMonAbility(&gPlayerParty[0]) == ABILITY_COMPOUND_EYES)\n        {\n            var1 = 20;\n            var2 = 80;\n        }\n        if (gSpeciesInfo[species].itemCommon == gSpeciesInfo[species].itemRare && !isHighLeveledPikachu)\n        {\n            // Both held items are the same, 100% chance to hold item   \n            SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gSpeciesInfo[species].itemCommon);\n            return;\n        }\n\n        if (rnd < var1)\n            return;\n        if (rnd < var2)\n        {\n            if(isHighLeveledPikachu)\n            {   //Pikachu holds its RS items if not in Viridian Forest\n                u16 item = ITEM_ORAN_BERRY;\n                SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &item);\n            }\n            else\n                SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gSpeciesInfo[species].itemCommon);\n        }\n        else\n        {\n            if(isHighLeveledPikachu)\n            {   //Pikachu holds its RS items if not in Viridian Forest \n                u16 item = ITEM_LIGHT_BALL;\n                SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &item);\n            }\n            else\n            {\n                SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gSpeciesInfo[species].itemRare);\n\n                // Only underwater Gyarados can hold the DeepSeaTooth\n                if(gSpeciesInfo[species].itemRare == ITEM_DEEP_SEA_TOOTH)\n                {\n                    if(gMapHeader.mapType != MAP_TYPE_UNDERWATER)\n                    {\n                        u16 item = ITEM_NONE;\n                        SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &item);\n                    }\n                }\n            }\n        }\n    }\n}\n\nbool8 IsMonShiny(struct Pokemon *mon)\n{\n    u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL);\n    u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);\n    return IsShinyOtIdPersonality(otId, personality);\n}\n\nstatic bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)\n{\n    bool8 retVal = FALSE;\n    u32 shinyValue = GET_SHINY_VALUE(otId, personality);\n    if (shinyValue < SHINY_ODDS)\n        retVal = TRUE;\n    return retVal;\n}\n\nu8 *GetTrainerPartnerName(void)\n{\n    u8 id = GetMultiplayerId();\n    return gLinkPlayers[GetBattlerMultiplayerId(gLinkPlayers[id].id ^ 2)].name;\n}\n\nu8 GetPlayerPartyHighestLevel(void)\n{\n    s32 slot;\n    u8 level, monLevel;\n\n    level = 1;\n    for (slot = 0; slot < PARTY_SIZE; ++slot)\n    {\n        if (GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_HAS_SPECIES, NULL) == 1 && !GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_IS_EGG, NULL))\n        {\n            monLevel = GetMonData(&gPlayerParty[slot], MON_DATA_LEVEL, NULL);\n            if (monLevel > level)\n                level = monLevel;\n        }\n    }\n    return level;\n}\n\nu16 FacilityClassToPicIndex(u16 facilityClass)\n{\n    return gFacilityClassToPicIndex[facilityClass];\n}\n\n// If FALSE, should load this game's Deoxys form. If TRUE, should load normal Deoxys form\nbool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId)\n{\n    switch (caseId)\n    {\n    case 0:\n    default:\n        return FALSE;\n    case DEOXYS_CHECK_BATTLE_SPRITE:\n        if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n            return FALSE;\n        if (!gMain.inBattle)\n            return FALSE;\n        if (gLinkPlayers[GetMultiplayerId()].id == battlerId)\n            return FALSE;\n        break;\n    case 2:\n        break;\n    case DEOXYS_CHECK_TRADE_MAIN:\n        if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n            return FALSE;\n        if (!gMain.inBattle)\n            return FALSE;\n        if (battlerId == 1 || battlerId == 4 || battlerId == 5)\n            return TRUE;\n        return FALSE;\n    case 4:\n        break;\n    case DEOXYS_CHECK_BATTLE_ANIM:\n        if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n        {\n                if (!gMain.inBattle)\n                    return FALSE;\n                if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n                {\n                    if (gLinkPlayers[GetMultiplayerId()].id == battlerId)\n                        return FALSE;\n                }\n                else\n                {\n                    if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n                        return FALSE;\n                }\n            }\n            else\n            {\n                if (!gMain.inBattle)\n                    return FALSE;\n                if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)\n                    return FALSE;\n            }\n            break;\n    }\n\n    return TRUE;\n}\n\nstatic u16 GetDeoxysStat(struct Pokemon *mon, s32 statId)\n{\n    s32 ivVal, evVal;\n    u16 statValue = 0;\n    u8 nature;\n    u8 forme;\n    u8 ivCalcMode = gSaveBlock1Ptr->keyFlags.ivCalcMode;\n    u8 evCalcMode = gSaveBlock1Ptr->keyFlags.evCalcMode;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK_IN_BATTLE || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)\n    {\n        return 0;\n    }\n    else\n    {\n        forme = GetMonData(mon, MON_DATA_FORME, NULL);\n        ivVal = GetMonData(mon, MON_DATA_HP_IV + statId, NULL);\n        evVal = GetMonData(mon, MON_DATA_HP_EV + statId, NULL);\n        if(!FlagGet(FLAG_SYS_IS_LINKING) || !(gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER))\n        {   // Deoxys can't enter Battle Tower anyway, but checked just in case.\n            if(ivCalcMode == IV_CALC_PERFECT)\n                ivVal = 31;\n            if(ivCalcMode == IV_CALC_ZERO)\n                ivVal = 0;\n            if(evCalcMode == EV_CALC_ZERO)\n                evVal = 0;\n        }\n        statValue = ((sDeoxysBaseStats[forme][statId] * 2 + ivVal + evVal / 4) * mon->level) / 100 + 5;\n        nature = GetNature(mon);\n        statValue = ModifyStatByNature(nature, statValue, (u8)statId);\n    }\n    return statValue;\n}\n\nvoid SetDeoxysStats(void)\n{\n    s32 i, value;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        struct Pokemon *mon = &gPlayerParty[i];\n\n        if (GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)\n            continue;\n        value = GetMonData(mon, MON_DATA_ATK, NULL);\n        SetMonData(mon, MON_DATA_ATK, &value);\n        value = GetMonData(mon, MON_DATA_DEF, NULL);\n        SetMonData(mon, MON_DATA_DEF, &value);\n        value = GetMonData(mon, MON_DATA_SPEED, NULL);\n        SetMonData(mon, MON_DATA_SPEED, &value);\n        value = GetMonData(mon, MON_DATA_SPATK, NULL);\n        SetMonData(mon, MON_DATA_SPATK, &value);\n        value = GetMonData(mon, MON_DATA_SPDEF, NULL);\n        SetMonData(mon, MON_DATA_SPDEF, &value);\n    }\n}\n\nu16 GetUnionRoomTrainerPic(void)\n{\n    u8 linkId = GetMultiplayerId() ^ 1;\n\n    u32 arrId = gLinkPlayers[linkId].trainerId % NUM_UNION_ROOM_CLASSES;\n    arrId |= gLinkPlayers[linkId].gender * NUM_UNION_ROOM_CLASSES;\n    return FacilityClassToPicIndex(gUnionRoomFacilityClasses[arrId]);\n}\n\nu16 GetUnionRoomTrainerClass(void)\n{\n    u8 linkId = GetMultiplayerId() ^ 1;\n\n    u32 arrId = gLinkPlayers[linkId].trainerId % NUM_UNION_ROOM_CLASSES;\n    arrId |= gLinkPlayers[linkId].gender * NUM_UNION_ROOM_CLASSES;\n    return gFacilityClassToTrainerClass[gUnionRoomFacilityClasses[arrId]];\n}\n\nvoid CreateEnemyEventMon(void)\n{\n    s32 species = gSpecialVar_0x8004;\n    s32 level = gSpecialVar_0x8005;\n    s32 itemId = gSpecialVar_0x8006;\n\n    ZeroEnemyPartyMons();\n    CreateEventMon(&gEnemyParty[0], species, level, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0);\n    if (itemId)\n    {\n        u8 heldItem[2];\n        \n        heldItem[0] = itemId;\n        heldItem[1] = itemId >> 8;\n        SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem);\n    }\n}\n\nvoid HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality)\n{\n    u8 getFlagCaseId = (caseId == FLAG_SET_SEEN) ? FLAG_GET_SEEN : FLAG_GET_CAUGHT;\n    \n    if (!GetSetPokedexFlag(nationalNum, getFlagCaseId))\n    {\n        GetSetPokedexFlag(nationalNum, caseId);\n        if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_UNOWN)\n            gSaveBlock2Ptr->pokedex.unownPersonality = personality;\n        if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_SPINDA)\n            gSaveBlock2Ptr->pokedex.spindaPersonality = personality;\n    }\n}\n\nbool8 CheckBattleTypeGhost(struct Pokemon *mon, u8 battlerId)\n{\n    u8 nickname[POKEMON_NAME_LENGTH + 1];\n\n    if (gBattleTypeFlags & BATTLE_TYPE_GHOST && GetBattlerSide(battlerId) != B_SIDE_PLAYER)\n    {\n        GetMonData(mon, MON_DATA_NICKNAME, nickname);\n        StringGet_Nickname(nickname);\n        if (!StringCompare(nickname, gText_Ghost))\n            return TRUE;\n    }\n    return FALSE;\n}\n\n#define ALLOC_FAIL_BUFFER (1 << 0)\n#define ALLOC_FAIL_STRUCT (1 << 1)\n#define GFX_MANAGER_ACTIVE 0xA3 // Arbitrary value\n\nstatic void InitMonSpritesGfx_Mode1(struct MonSpritesGfxManager *structPtr, u8 battlePosition)\n{\n    u16 i = 0, j = 0;\n\n    if (battlePosition >= MAX_BATTLERS_COUNT)\n    {\n        for (i = 0; i < (s8)structPtr->numSprites; ++i)\n        {\n            structPtr->templates[i] = gSpriteTemplates_Battlers[i];\n            for (j = 0; j < structPtr->numFrames; ++j)\n                structPtr->frameImages[i * structPtr->numFrames + j].data = &structPtr->spritePointers[i][j * MON_PIC_SIZE];\n            structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->numFrames];\n        }\n    }\n    else\n    {\n        const struct SpriteTemplate *template = &gSpriteTemplates_Battlers[battlePosition];\n        \n        structPtr->templates[0] = *template;\n        for (j = 0; j < structPtr->numFrames; ++j)\n                structPtr->frameImages[j].data = &structPtr->spritePointers[0][j * MON_PIC_SIZE];\n        structPtr->templates[0].images = structPtr->frameImages;\n    }\n}\n\n// not used\nstatic void InitMonSpritesGfx_Mode0(struct MonSpritesGfxManager *structPtr)\n{\n    u16 i, j;\n\n    for (i = 0; i < (s8)structPtr->numSprites; ++i)\n    {\n        structPtr->templates[i] = sSpriteTemplate_64x64;\n        for (j = 0; j < structPtr->numFrames; ++j)\n            structPtr->frameImages[i * structPtr->numSprites + j].data = &structPtr->spritePointers[i][j * MON_PIC_SIZE];\n        structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->numSprites]; // should be numFrames logically\n        structPtr->templates[i].anims = gAnims_MonPic;\n        structPtr->templates[i].paletteTag = i;\n    }\n}\n\nstruct MonSpritesGfxManager *CreateMonSpritesGfxManager(u8 battlePosition, u8 mode)\n{\n    s32 size;\n    u8 i, failureFlags = 0;\n\n    if (sMonSpritesGfxManager != NULL)\n    {\n        if (sMonSpritesGfxManager->active == GFX_MANAGER_ACTIVE)\n            return NULL;\n        memset(sMonSpritesGfxManager, 0, sizeof(*sMonSpritesGfxManager));\n        sMonSpritesGfxManager = NULL;\n    }\n    sMonSpritesGfxManager = AllocZeroed(sizeof(*sMonSpritesGfxManager));\n    if (sMonSpritesGfxManager == NULL)\n        return NULL;\n\n    switch (mode)\n    {\n    case 1:\n        if (battlePosition == MAX_BATTLERS_COUNT)\n        {\n            sMonSpritesGfxManager->numSprites = MAX_BATTLERS_COUNT;\n            sMonSpritesGfxManager->battlePosition = MAX_BATTLERS_COUNT;\n        }\n        else\n        {\n            if (battlePosition > MAX_BATTLERS_COUNT)\n                battlePosition = 0;\n            sMonSpritesGfxManager->numSprites = 1;\n            sMonSpritesGfxManager->battlePosition = 1;\n        }\n        sMonSpritesGfxManager->numFrames = MAX_MON_PIC_FRAMES;\n        sMonSpritesGfxManager->mode = 1;\n        break;\n    case 0:\n    default:\n        if (!battlePosition)\n            battlePosition = 1;\n        if (battlePosition > 8)\n            battlePosition = 8;\n        sMonSpritesGfxManager->numSprites = (battlePosition << 16) >> 16;\n        sMonSpritesGfxManager->battlePosition = battlePosition;\n        sMonSpritesGfxManager->numFrames = 4;\n        sMonSpritesGfxManager->mode = 0;\n        break;\n    }\n\n    // Set up sprite / sprite pointer buffers\n    size = sMonSpritesGfxManager->numFrames * MON_PIC_SIZE;\n    sMonSpritesGfxManager->dataSize = size;\n    sMonSpritesGfxManager->spriteBuffer = AllocZeroed(sMonSpritesGfxManager->numSprites * size);\n    sMonSpritesGfxManager->spritePointers = AllocZeroed(sMonSpritesGfxManager->numSprites * 32); // ? Only * 4 is necessary, perhaps they were thinking bits.\n    if (sMonSpritesGfxManager->spriteBuffer == NULL ||  sMonSpritesGfxManager->spritePointers == NULL)\n    {\n        failureFlags |= ALLOC_FAIL_BUFFER;\n    }\n    else\n    {\n        do\n        {\n            for (i = 0; i < (s8)sMonSpritesGfxManager->numSprites; ++i)\n                sMonSpritesGfxManager->spritePointers[i] = &sMonSpritesGfxManager->spriteBuffer[sMonSpritesGfxManager->dataSize * i];\n        } while (0);\n    }\n\n    // Set up sprite structs\n    sMonSpritesGfxManager->templates = AllocZeroed(sizeof(struct SpriteTemplate) * sMonSpritesGfxManager->numSprites);\n    sMonSpritesGfxManager->frameImages = AllocZeroed(sMonSpritesGfxManager->numSprites * sizeof(struct SpriteFrameImage) * sMonSpritesGfxManager->numFrames);\n    if (sMonSpritesGfxManager->templates == NULL || sMonSpritesGfxManager->frameImages == NULL)\n    {\n        failureFlags |= ALLOC_FAIL_STRUCT;\n    }\n    else\n    {\n        for (i = 0; i < sMonSpritesGfxManager->numFrames * sMonSpritesGfxManager->numSprites; i++)\n                sMonSpritesGfxManager->frameImages[i].size = MON_PIC_SIZE;\n        switch (sMonSpritesGfxManager->mode)\n        {\n        case 1:\n            InitMonSpritesGfx_Mode1(sMonSpritesGfxManager, battlePosition);\n            break;\n        case 0:\n        default:\n            InitMonSpritesGfx_Mode0(sMonSpritesGfxManager);\n            break;\n        }\n    }\n\n    // If either of the allocations failed free their respective members\n    if (failureFlags & ALLOC_FAIL_STRUCT)\n    {\n        TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->frameImages);\n        TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->templates);\n    }\n    if (failureFlags & ALLOC_FAIL_BUFFER)\n    {\n        TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->spritePointers);\n        TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->spriteBuffer);\n    }\n\n    if (failureFlags)\n    {\n        // Clear, something failed to allocate\n        memset(sMonSpritesGfxManager, 0, sizeof(*sMonSpritesGfxManager));\n        FREE_AND_SET_NULL(sMonSpritesGfxManager);\n    }\n    else\n    {\n        sMonSpritesGfxManager->active = GFX_MANAGER_ACTIVE;\n    }\n    return sMonSpritesGfxManager;\n}\n\nvoid DestroyMonSpritesGfxManager(void)\n{\n    if (sMonSpritesGfxManager != NULL)\n    {\n        if (sMonSpritesGfxManager->active != GFX_MANAGER_ACTIVE)\n        {\n            memset(sMonSpritesGfxManager, 0, sizeof(*sMonSpritesGfxManager));\n            sMonSpritesGfxManager = NULL;\n        }\n        else\n        {\n            TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->frameImages);\n            TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->templates);\n            TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->spritePointers);                    \n            TRY_FREE_AND_SET_NULL(sMonSpritesGfxManager->spriteBuffer);\n            memset(sMonSpritesGfxManager, 0, sizeof(*sMonSpritesGfxManager));\n            FREE_AND_SET_NULL(sMonSpritesGfxManager);\n        }\n\n    }\n}\n\nu8 *MonSpritesGfxManager_GetSpritePtr(u8 spriteNum)\n{\n    if (sMonSpritesGfxManager->active != GFX_MANAGER_ACTIVE)\n    {\n        return NULL;\n    }\n    else\n    {\n        if (spriteNum >= (s8)sMonSpritesGfxManager->numSprites)\n            spriteNum = 0;\n        return sMonSpritesGfxManager->spritePointers[spriteNum];\n    }\n}\n\nvoid SetFirstDeoxysForm(void)\n{\n    #define SPECIES_DEOXYS 410\n    u32 i;\n    u8 forme;\n    for(i = 0; i < 6; i++)\n    {\n        if(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_DEOXYS)\n        {\n            forme = GetMonData(&gPlayerParty[i], MON_DATA_FORME, NULL);\n            if(forme == 3)\n            {\n                forme = 0;\n            }\n            else\n            {\n                forme += 1;\n            }\n            SetMonData(&gPlayerParty[i], MON_DATA_FORME, &forme);\n            break;\n        }\n    }\n}\n\nstatic bool32 ShouldSkipFriendshipChange(void)\n{\n    if (gMain.inBattle && gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER))\n        return TRUE;\n    /*if (!gMain.inBattle && (InBattlePike() || InBattlePyramid()))\n        return TRUE;*/\n    return FALSE;\n}\n"
  },
  {
    "path": "src/pokemon_icon.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"mail_data.h\"\n#include \"pokemon_icon.h\"\n#include \"graphics.h\"\n\n#define POKE_ICON_BASE_PAL_TAG 56000\n\nstruct MonIconSpriteTemplate\n{\n    const struct OamData * oam;\n    const u8 *image;\n    const union AnimCmd *const * anims;\n    const union AffineAnimCmd *const * affineAnims;\n    SpriteCallback callback;\n    u16 paletteTag;\n};\n\nstatic u8 CreateMonIconSprite(const struct MonIconSpriteTemplate * template, s16 x, s16 y, u8 subpriority);\nstatic void DestroyMonIconInternal(struct Sprite *sprite);\n\nconst u16 gMonIconPalettes[][16] = {\n    INCBIN_U16(\"graphics/pokemon/icon_palettes/icon_palette_0.gbapal\"),\n    INCBIN_U16(\"graphics/pokemon/icon_palettes/icon_palette_1.gbapal\"),\n    INCBIN_U16(\"graphics/pokemon/icon_palettes/icon_palette_2.gbapal\")\n};\n\nconst u8 *const gMonIconTable[] = {\n    [SPECIES_NONE]        = gMonIcon_QuestionMark,\n    [SPECIES_BULBASAUR]   = gMonIcon_Bulbasaur,\n    [SPECIES_IVYSAUR]     = gMonIcon_Ivysaur,\n    [SPECIES_VENUSAUR]    = gMonIcon_Venusaur,\n    [SPECIES_CHARMANDER]  = gMonIcon_Charmander,\n    [SPECIES_CHARMELEON]  = gMonIcon_Charmeleon,\n    [SPECIES_CHARIZARD]   = gMonIcon_Charizard,\n    [SPECIES_SQUIRTLE]    = gMonIcon_Squirtle,\n    [SPECIES_WARTORTLE]   = gMonIcon_Wartortle,\n    [SPECIES_BLASTOISE]   = gMonIcon_Blastoise,\n    [SPECIES_CATERPIE]    = gMonIcon_Caterpie,\n    [SPECIES_METAPOD]     = gMonIcon_Metapod,\n    [SPECIES_BUTTERFREE]  = gMonIcon_Butterfree,\n    [SPECIES_WEEDLE]      = gMonIcon_Weedle,\n    [SPECIES_KAKUNA]      = gMonIcon_Kakuna,\n    [SPECIES_BEEDRILL]    = gMonIcon_Beedrill,\n    [SPECIES_PIDGEY]      = gMonIcon_Pidgey,\n    [SPECIES_PIDGEOTTO]   = gMonIcon_Pidgeotto,\n    [SPECIES_PIDGEOT]     = gMonIcon_Pidgeot,\n    [SPECIES_RATTATA]     = gMonIcon_Rattata,\n    [SPECIES_RATICATE]    = gMonIcon_Raticate,\n    [SPECIES_SPEAROW]     = gMonIcon_Spearow,\n    [SPECIES_FEAROW]      = gMonIcon_Fearow,\n    [SPECIES_EKANS]       = gMonIcon_Ekans,\n    [SPECIES_ARBOK]       = gMonIcon_Arbok,\n    [SPECIES_PIKACHU]     = gMonIcon_Pikachu,\n    [SPECIES_RAICHU]      = gMonIcon_Raichu,\n    [SPECIES_SANDSHREW]   = gMonIcon_Sandshrew,\n    [SPECIES_SANDSLASH]   = gMonIcon_Sandslash,\n    [SPECIES_NIDORAN_F]   = gMonIcon_NidoranF,\n    [SPECIES_NIDORINA]    = gMonIcon_Nidorina,\n    [SPECIES_NIDOQUEEN]   = gMonIcon_Nidoqueen,\n    [SPECIES_NIDORAN_M]   = gMonIcon_NidoranM,\n    [SPECIES_NIDORINO]    = gMonIcon_Nidorino,\n    [SPECIES_NIDOKING]    = gMonIcon_Nidoking,\n    [SPECIES_CLEFAIRY]    = gMonIcon_Clefairy,\n    [SPECIES_CLEFABLE]    = gMonIcon_Clefable,\n    [SPECIES_VULPIX]      = gMonIcon_Vulpix,\n    [SPECIES_NINETALES]   = gMonIcon_Ninetales,\n    [SPECIES_JIGGLYPUFF]  = gMonIcon_Jigglypuff,\n    [SPECIES_WIGGLYTUFF]  = gMonIcon_Wigglytuff,\n    [SPECIES_ZUBAT]       = gMonIcon_Zubat,\n    [SPECIES_GOLBAT]      = gMonIcon_Golbat,\n    [SPECIES_ODDISH]      = gMonIcon_Oddish,\n    [SPECIES_GLOOM]       = gMonIcon_Gloom,\n    [SPECIES_VILEPLUME]   = gMonIcon_Vileplume,\n    [SPECIES_PARAS]       = gMonIcon_Paras,\n    [SPECIES_PARASECT]    = gMonIcon_Parasect,\n    [SPECIES_VENONAT]     = gMonIcon_Venonat,\n    [SPECIES_VENOMOTH]    = gMonIcon_Venomoth,\n    [SPECIES_DIGLETT]     = gMonIcon_Diglett,\n    [SPECIES_DUGTRIO]     = gMonIcon_Dugtrio,\n    [SPECIES_MEOWTH]      = gMonIcon_Meowth,\n    [SPECIES_PERSIAN]     = gMonIcon_Persian,\n    [SPECIES_PSYDUCK]     = gMonIcon_Psyduck,\n    [SPECIES_GOLDUCK]     = gMonIcon_Golduck,\n    [SPECIES_MANKEY]      = gMonIcon_Mankey,\n    [SPECIES_PRIMEAPE]    = gMonIcon_Primeape,\n    [SPECIES_GROWLITHE]   = gMonIcon_Growlithe,\n    [SPECIES_ARCANINE]    = gMonIcon_Arcanine,\n    [SPECIES_POLIWAG]     = gMonIcon_Poliwag,\n    [SPECIES_POLIWHIRL]   = gMonIcon_Poliwhirl,\n    [SPECIES_POLIWRATH]   = gMonIcon_Poliwrath,\n    [SPECIES_ABRA]        = gMonIcon_Abra,\n    [SPECIES_KADABRA]     = gMonIcon_Kadabra,\n    [SPECIES_ALAKAZAM]    = gMonIcon_Alakazam,\n    [SPECIES_MACHOP]      = gMonIcon_Machop,\n    [SPECIES_MACHOKE]     = gMonIcon_Machoke,\n    [SPECIES_MACHAMP]     = gMonIcon_Machamp,\n    [SPECIES_BELLSPROUT]  = gMonIcon_Bellsprout,\n    [SPECIES_WEEPINBELL]  = gMonIcon_Weepinbell,\n    [SPECIES_VICTREEBEL]  = gMonIcon_Victreebel,\n    [SPECIES_TENTACOOL]   = gMonIcon_Tentacool,\n    [SPECIES_TENTACRUEL]  = gMonIcon_Tentacruel,\n    [SPECIES_GEODUDE]     = gMonIcon_Geodude,\n    [SPECIES_GRAVELER]    = gMonIcon_Graveler,\n    [SPECIES_GOLEM]       = gMonIcon_Golem,\n    [SPECIES_PONYTA]      = gMonIcon_Ponyta,\n    [SPECIES_RAPIDASH]    = gMonIcon_Rapidash,\n    [SPECIES_SLOWPOKE]    = gMonIcon_Slowpoke,\n    [SPECIES_SLOWBRO]     = gMonIcon_Slowbro,\n    [SPECIES_MAGNEMITE]   = gMonIcon_Magnemite,\n    [SPECIES_MAGNETON]    = gMonIcon_Magneton,\n    [SPECIES_FARFETCHD]   = gMonIcon_Farfetchd,\n    [SPECIES_DODUO]       = gMonIcon_Doduo,\n    [SPECIES_DODRIO]      = gMonIcon_Dodrio,\n    [SPECIES_SEEL]        = gMonIcon_Seel,\n    [SPECIES_DEWGONG]     = gMonIcon_Dewgong,\n    [SPECIES_GRIMER]      = gMonIcon_Grimer,\n    [SPECIES_MUK]         = gMonIcon_Muk,\n    [SPECIES_SHELLDER]    = gMonIcon_Shellder,\n    [SPECIES_CLOYSTER]    = gMonIcon_Cloyster,\n    [SPECIES_GASTLY]      = gMonIcon_Gastly,\n    [SPECIES_HAUNTER]     = gMonIcon_Haunter,\n    [SPECIES_GENGAR]      = gMonIcon_Gengar,\n    [SPECIES_ONIX]        = gMonIcon_Onix,\n    [SPECIES_DROWZEE]     = gMonIcon_Drowzee,\n    [SPECIES_HYPNO]       = gMonIcon_Hypno,\n    [SPECIES_KRABBY]      = gMonIcon_Krabby,\n    [SPECIES_KINGLER]     = gMonIcon_Kingler,\n    [SPECIES_VOLTORB]     = gMonIcon_Voltorb,\n    [SPECIES_ELECTRODE]   = gMonIcon_Electrode,\n    [SPECIES_EXEGGCUTE]   = gMonIcon_Exeggcute,\n    [SPECIES_EXEGGUTOR]   = gMonIcon_Exeggutor,\n    [SPECIES_CUBONE]      = gMonIcon_Cubone,\n    [SPECIES_MAROWAK]     = gMonIcon_Marowak,\n    [SPECIES_HITMONLEE]   = gMonIcon_Hitmonlee,\n    [SPECIES_HITMONCHAN]  = gMonIcon_Hitmonchan,\n    [SPECIES_LICKITUNG]   = gMonIcon_Lickitung,\n    [SPECIES_KOFFING]     = gMonIcon_Koffing,\n    [SPECIES_WEEZING]     = gMonIcon_Weezing,\n    [SPECIES_RHYHORN]     = gMonIcon_Rhyhorn,\n    [SPECIES_RHYDON]      = gMonIcon_Rhydon,\n    [SPECIES_CHANSEY]     = gMonIcon_Chansey,\n    [SPECIES_TANGELA]     = gMonIcon_Tangela,\n    [SPECIES_KANGASKHAN]  = gMonIcon_Kangaskhan,\n    [SPECIES_HORSEA]      = gMonIcon_Horsea,\n    [SPECIES_SEADRA]      = gMonIcon_Seadra,\n    [SPECIES_GOLDEEN]     = gMonIcon_Goldeen,\n    [SPECIES_SEAKING]     = gMonIcon_Seaking,\n    [SPECIES_STARYU]      = gMonIcon_Staryu,\n    [SPECIES_STARMIE]     = gMonIcon_Starmie,\n    [SPECIES_MR_MIME]     = gMonIcon_Mrmime,\n    [SPECIES_SCYTHER]     = gMonIcon_Scyther,\n    [SPECIES_JYNX]        = gMonIcon_Jynx,\n    [SPECIES_ELECTABUZZ]  = gMonIcon_Electabuzz,\n    [SPECIES_MAGMAR]      = gMonIcon_Magmar,\n    [SPECIES_PINSIR]      = gMonIcon_Pinsir,\n    [SPECIES_TAUROS]      = gMonIcon_Tauros,\n    [SPECIES_MAGIKARP]    = gMonIcon_Magikarp,\n    [SPECIES_GYARADOS]    = gMonIcon_Gyarados,\n    [SPECIES_LAPRAS]      = gMonIcon_Lapras,\n    [SPECIES_DITTO]       = gMonIcon_Ditto,\n    [SPECIES_EEVEE]       = gMonIcon_Eevee,\n    [SPECIES_VAPOREON]    = gMonIcon_Vaporeon,\n    [SPECIES_JOLTEON]     = gMonIcon_Jolteon,\n    [SPECIES_FLAREON]     = gMonIcon_Flareon,\n    [SPECIES_PORYGON]     = gMonIcon_Porygon,\n    [SPECIES_OMANYTE]     = gMonIcon_Omanyte,\n    [SPECIES_OMASTAR]     = gMonIcon_Omastar,\n    [SPECIES_KABUTO]      = gMonIcon_Kabuto,\n    [SPECIES_KABUTOPS]    = gMonIcon_Kabutops,\n    [SPECIES_AERODACTYL]  = gMonIcon_Aerodactyl,\n    [SPECIES_SNORLAX]     = gMonIcon_Snorlax,\n    [SPECIES_ARTICUNO]    = gMonIcon_Articuno,\n    [SPECIES_ZAPDOS]      = gMonIcon_Zapdos,\n    [SPECIES_MOLTRES]     = gMonIcon_Moltres,\n    [SPECIES_DRATINI]     = gMonIcon_Dratini,\n    [SPECIES_DRAGONAIR]   = gMonIcon_Dragonair,\n    [SPECIES_DRAGONITE]   = gMonIcon_Dragonite,\n    [SPECIES_MEWTWO]      = gMonIcon_Mewtwo,\n    [SPECIES_MEW]         = gMonIcon_Mew,\n    [SPECIES_CHIKORITA]   = gMonIcon_Chikorita,\n    [SPECIES_BAYLEEF]     = gMonIcon_Bayleef,\n    [SPECIES_MEGANIUM]    = gMonIcon_Meganium,\n    [SPECIES_CYNDAQUIL]   = gMonIcon_Cyndaquil,\n    [SPECIES_QUILAVA]     = gMonIcon_Quilava,\n    [SPECIES_TYPHLOSION]  = gMonIcon_Typhlosion,\n    [SPECIES_TOTODILE]    = gMonIcon_Totodile,\n    [SPECIES_CROCONAW]    = gMonIcon_Croconaw,\n    [SPECIES_FERALIGATR]  = gMonIcon_Feraligatr,\n    [SPECIES_SENTRET]     = gMonIcon_Sentret,\n    [SPECIES_FURRET]      = gMonIcon_Furret,\n    [SPECIES_HOOTHOOT]    = gMonIcon_Hoothoot,\n    [SPECIES_NOCTOWL]     = gMonIcon_Noctowl,\n    [SPECIES_LEDYBA]      = gMonIcon_Ledyba,\n    [SPECIES_LEDIAN]      = gMonIcon_Ledian,\n    [SPECIES_SPINARAK]    = gMonIcon_Spinarak,\n    [SPECIES_ARIADOS]     = gMonIcon_Ariados,\n    [SPECIES_CROBAT]      = gMonIcon_Crobat,\n    [SPECIES_CHINCHOU]    = gMonIcon_Chinchou,\n    [SPECIES_LANTURN]     = gMonIcon_Lanturn,\n    [SPECIES_PICHU]       = gMonIcon_Pichu,\n    [SPECIES_CLEFFA]      = gMonIcon_Cleffa,\n    [SPECIES_IGGLYBUFF]   = gMonIcon_Igglybuff,\n    [SPECIES_TOGEPI]      = gMonIcon_Togepi,\n    [SPECIES_TOGETIC]     = gMonIcon_Togetic,\n    [SPECIES_NATU]        = gMonIcon_Natu,\n    [SPECIES_XATU]        = gMonIcon_Xatu,\n    [SPECIES_MAREEP]      = gMonIcon_Mareep,\n    [SPECIES_FLAAFFY]     = gMonIcon_Flaaffy,\n    [SPECIES_AMPHAROS]    = gMonIcon_Ampharos,\n    [SPECIES_BELLOSSOM]   = gMonIcon_Bellossom,\n    [SPECIES_MARILL]      = gMonIcon_Marill,\n    [SPECIES_AZUMARILL]   = gMonIcon_Azumarill,\n    [SPECIES_SUDOWOODO]   = gMonIcon_Sudowoodo,\n    [SPECIES_POLITOED]    = gMonIcon_Politoed,\n    [SPECIES_HOPPIP]      = gMonIcon_Hoppip,\n    [SPECIES_SKIPLOOM]    = gMonIcon_Skiploom,\n    [SPECIES_JUMPLUFF]    = gMonIcon_Jumpluff,\n    [SPECIES_AIPOM]       = gMonIcon_Aipom,\n    [SPECIES_SUNKERN]     = gMonIcon_Sunkern,\n    [SPECIES_SUNFLORA]    = gMonIcon_Sunflora,\n    [SPECIES_YANMA]       = gMonIcon_Yanma,\n    [SPECIES_WOOPER]      = gMonIcon_Wooper,\n    [SPECIES_QUAGSIRE]    = gMonIcon_Quagsire,\n    [SPECIES_ESPEON]      = gMonIcon_Espeon,\n    [SPECIES_UMBREON]     = gMonIcon_Umbreon,\n    [SPECIES_MURKROW]     = gMonIcon_Murkrow,\n    [SPECIES_SLOWKING]    = gMonIcon_Slowking,\n    [SPECIES_MISDREAVUS]  = gMonIcon_Misdreavus,\n    [SPECIES_UNOWN]       = gMonIcon_UnownA,\n    [SPECIES_WOBBUFFET]   = gMonIcon_Wobbuffet,\n    [SPECIES_GIRAFARIG]   = gMonIcon_Girafarig,\n    [SPECIES_PINECO]      = gMonIcon_Pineco,\n    [SPECIES_FORRETRESS]  = gMonIcon_Forretress,\n    [SPECIES_DUNSPARCE]   = gMonIcon_Dunsparce,\n    [SPECIES_GLIGAR]      = gMonIcon_Gligar,\n    [SPECIES_STEELIX]     = gMonIcon_Steelix,\n    [SPECIES_SNUBBULL]    = gMonIcon_Snubbull,\n    [SPECIES_GRANBULL]    = gMonIcon_Granbull,\n    [SPECIES_QWILFISH]    = gMonIcon_Qwilfish,\n    [SPECIES_SCIZOR]      = gMonIcon_Scizor,\n    [SPECIES_SHUCKLE]     = gMonIcon_Shuckle,\n    [SPECIES_HERACROSS]   = gMonIcon_Heracross,\n    [SPECIES_SNEASEL]     = gMonIcon_Sneasel,\n    [SPECIES_TEDDIURSA]   = gMonIcon_Teddiursa,\n    [SPECIES_URSARING]    = gMonIcon_Ursaring,\n    [SPECIES_SLUGMA]      = gMonIcon_Slugma,\n    [SPECIES_MAGCARGO]    = gMonIcon_Magcargo,\n    [SPECIES_SWINUB]      = gMonIcon_Swinub,\n    [SPECIES_PILOSWINE]   = gMonIcon_Piloswine,\n    [SPECIES_CORSOLA]     = gMonIcon_Corsola,\n    [SPECIES_REMORAID]    = gMonIcon_Remoraid,\n    [SPECIES_OCTILLERY]   = gMonIcon_Octillery,\n    [SPECIES_DELIBIRD]    = gMonIcon_Delibird,\n    [SPECIES_MANTINE]     = gMonIcon_Mantine,\n    [SPECIES_SKARMORY]    = gMonIcon_Skarmory,\n    [SPECIES_HOUNDOUR]    = gMonIcon_Houndour,\n    [SPECIES_HOUNDOOM]    = gMonIcon_Houndoom,\n    [SPECIES_KINGDRA]     = gMonIcon_Kingdra,\n    [SPECIES_PHANPY]      = gMonIcon_Phanpy,\n    [SPECIES_DONPHAN]     = gMonIcon_Donphan,\n    [SPECIES_PORYGON2]    = gMonIcon_Porygon2,\n    [SPECIES_STANTLER]    = gMonIcon_Stantler,\n    [SPECIES_SMEARGLE]    = gMonIcon_Smeargle,\n    [SPECIES_TYROGUE]     = gMonIcon_Tyrogue,\n    [SPECIES_HITMONTOP]   = gMonIcon_Hitmontop,\n    [SPECIES_SMOOCHUM]    = gMonIcon_Smoochum,\n    [SPECIES_ELEKID]      = gMonIcon_Elekid,\n    [SPECIES_MAGBY]       = gMonIcon_Magby,\n    [SPECIES_MILTANK]     = gMonIcon_Miltank,\n    [SPECIES_BLISSEY]     = gMonIcon_Blissey,\n    [SPECIES_RAIKOU]      = gMonIcon_Raikou,\n    [SPECIES_ENTEI]       = gMonIcon_Entei,\n    [SPECIES_SUICUNE]     = gMonIcon_Suicune,\n    [SPECIES_LARVITAR]    = gMonIcon_Larvitar,\n    [SPECIES_PUPITAR]     = gMonIcon_Pupitar,\n    [SPECIES_TYRANITAR]   = gMonIcon_Tyranitar,\n    [SPECIES_LUGIA]       = gMonIcon_Lugia,\n    [SPECIES_HO_OH]       = gMonIcon_HoOh,\n    [SPECIES_CELEBI]      = gMonIcon_Celebi,\n    [SPECIES_OLD_UNOWN_B] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_C] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_D] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_E] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_F] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_G] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_H] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_I] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_J] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_K] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_L] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_M] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_N] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_O] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_P] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_Q] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_R] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_S] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_T] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_U] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_V] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_W] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_X] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_Y] = gMonIcon_QuestionMark,\n    [SPECIES_OLD_UNOWN_Z] = gMonIcon_QuestionMark,\n    [SPECIES_TREECKO]     = gMonIcon_Treecko,\n    [SPECIES_GROVYLE]     = gMonIcon_Grovyle,\n    [SPECIES_SCEPTILE]    = gMonIcon_Sceptile,\n    [SPECIES_TORCHIC]     = gMonIcon_Torchic,\n    [SPECIES_COMBUSKEN]   = gMonIcon_Combusken,\n    [SPECIES_BLAZIKEN]    = gMonIcon_Blaziken,\n    [SPECIES_MUDKIP]      = gMonIcon_Mudkip,\n    [SPECIES_MARSHTOMP]   = gMonIcon_Marshtomp,\n    [SPECIES_SWAMPERT]    = gMonIcon_Swampert,\n    [SPECIES_POOCHYENA]   = gMonIcon_Poochyena,\n    [SPECIES_MIGHTYENA]   = gMonIcon_Mightyena,\n    [SPECIES_ZIGZAGOON]   = gMonIcon_Zigzagoon,\n    [SPECIES_LINOONE]     = gMonIcon_Linoone,\n    [SPECIES_WURMPLE]     = gMonIcon_Wurmple,\n    [SPECIES_SILCOON]     = gMonIcon_Silcoon,\n    [SPECIES_BEAUTIFLY]   = gMonIcon_Beautifly,\n    [SPECIES_CASCOON]     = gMonIcon_Cascoon,\n    [SPECIES_DUSTOX]      = gMonIcon_Dustox,\n    [SPECIES_LOTAD]       = gMonIcon_Lotad,\n    [SPECIES_LOMBRE]      = gMonIcon_Lombre,\n    [SPECIES_LUDICOLO]    = gMonIcon_Ludicolo,\n    [SPECIES_SEEDOT]      = gMonIcon_Seedot,\n    [SPECIES_NUZLEAF]     = gMonIcon_Nuzleaf,\n    [SPECIES_SHIFTRY]     = gMonIcon_Shiftry,\n    [SPECIES_NINCADA]     = gMonIcon_Nincada,\n    [SPECIES_NINJASK]     = gMonIcon_Ninjask,\n    [SPECIES_SHEDINJA]    = gMonIcon_Shedinja,\n    [SPECIES_TAILLOW]     = gMonIcon_Taillow,\n    [SPECIES_SWELLOW]     = gMonIcon_Swellow,\n    [SPECIES_SHROOMISH]   = gMonIcon_Shroomish,\n    [SPECIES_BRELOOM]     = gMonIcon_Breloom,\n    [SPECIES_SPINDA]      = gMonIcon_Spinda,\n    [SPECIES_WINGULL]     = gMonIcon_Wingull,\n    [SPECIES_PELIPPER]    = gMonIcon_Pelipper,\n    [SPECIES_SURSKIT]     = gMonIcon_Surskit,\n    [SPECIES_MASQUERAIN]  = gMonIcon_Masquerain,\n    [SPECIES_WAILMER]     = gMonIcon_Wailmer,\n    [SPECIES_WAILORD]     = gMonIcon_Wailord,\n    [SPECIES_SKITTY]      = gMonIcon_Skitty,\n    [SPECIES_DELCATTY]    = gMonIcon_Delcatty,\n    [SPECIES_KECLEON]     = gMonIcon_Kecleon,\n    [SPECIES_BALTOY]      = gMonIcon_Baltoy,\n    [SPECIES_CLAYDOL]     = gMonIcon_Claydol,\n    [SPECIES_NOSEPASS]    = gMonIcon_Nosepass,\n    [SPECIES_TORKOAL]     = gMonIcon_Torkoal,\n    [SPECIES_SABLEYE]     = gMonIcon_Sableye,\n    [SPECIES_BARBOACH]    = gMonIcon_Barboach,\n    [SPECIES_WHISCASH]    = gMonIcon_Whiscash,\n    [SPECIES_LUVDISC]     = gMonIcon_Luvdisc,\n    [SPECIES_CORPHISH]    = gMonIcon_Corphish,\n    [SPECIES_CRAWDAUNT]   = gMonIcon_Crawdaunt,\n    [SPECIES_FEEBAS]      = gMonIcon_Feebas,\n    [SPECIES_MILOTIC]     = gMonIcon_Milotic,\n    [SPECIES_CARVANHA]    = gMonIcon_Carvanha,\n    [SPECIES_SHARPEDO]    = gMonIcon_Sharpedo,\n    [SPECIES_TRAPINCH]    = gMonIcon_Trapinch,\n    [SPECIES_VIBRAVA]     = gMonIcon_Vibrava,\n    [SPECIES_FLYGON]      = gMonIcon_Flygon,\n    [SPECIES_MAKUHITA]    = gMonIcon_Makuhita,\n    [SPECIES_HARIYAMA]    = gMonIcon_Hariyama,\n    [SPECIES_ELECTRIKE]   = gMonIcon_Electrike,\n    [SPECIES_MANECTRIC]   = gMonIcon_Manectric,\n    [SPECIES_NUMEL]       = gMonIcon_Numel,\n    [SPECIES_CAMERUPT]    = gMonIcon_Camerupt,\n    [SPECIES_SPHEAL]      = gMonIcon_Spheal,\n    [SPECIES_SEALEO]      = gMonIcon_Sealeo,\n    [SPECIES_WALREIN]     = gMonIcon_Walrein,\n    [SPECIES_CACNEA]      = gMonIcon_Cacnea,\n    [SPECIES_CACTURNE]    = gMonIcon_Cacturne,\n    [SPECIES_SNORUNT]     = gMonIcon_Snorunt,\n    [SPECIES_GLALIE]      = gMonIcon_Glalie,\n    [SPECIES_LUNATONE]    = gMonIcon_Lunatone,\n    [SPECIES_SOLROCK]     = gMonIcon_Solrock,\n    [SPECIES_AZURILL]     = gMonIcon_Azurill,\n    [SPECIES_SPOINK]      = gMonIcon_Spoink,\n    [SPECIES_GRUMPIG]     = gMonIcon_Grumpig,\n    [SPECIES_PLUSLE]      = gMonIcon_Plusle,\n    [SPECIES_MINUN]       = gMonIcon_Minun,\n    [SPECIES_MAWILE]      = gMonIcon_Mawile,\n    [SPECIES_MEDITITE]    = gMonIcon_Meditite,\n    [SPECIES_MEDICHAM]    = gMonIcon_Medicham,\n    [SPECIES_SWABLU]      = gMonIcon_Swablu,\n    [SPECIES_ALTARIA]     = gMonIcon_Altaria,\n    [SPECIES_WYNAUT]      = gMonIcon_Wynaut,\n    [SPECIES_DUSKULL]     = gMonIcon_Duskull,\n    [SPECIES_DUSCLOPS]    = gMonIcon_Dusclops,\n    [SPECIES_ROSELIA]     = gMonIcon_Roselia,\n    [SPECIES_SLAKOTH]     = gMonIcon_Slakoth,\n    [SPECIES_VIGOROTH]    = gMonIcon_Vigoroth,\n    [SPECIES_SLAKING]     = gMonIcon_Slaking,\n    [SPECIES_GULPIN]      = gMonIcon_Gulpin,\n    [SPECIES_SWALOT]      = gMonIcon_Swalot,\n    [SPECIES_TROPIUS]     = gMonIcon_Tropius,\n    [SPECIES_WHISMUR]     = gMonIcon_Whismur,\n    [SPECIES_LOUDRED]     = gMonIcon_Loudred,\n    [SPECIES_EXPLOUD]     = gMonIcon_Exploud,\n    [SPECIES_CLAMPERL]    = gMonIcon_Clamperl,\n    [SPECIES_HUNTAIL]     = gMonIcon_Huntail,\n    [SPECIES_GOREBYSS]    = gMonIcon_Gorebyss,\n    [SPECIES_ABSOL]       = gMonIcon_Absol,\n    [SPECIES_SHUPPET]     = gMonIcon_Shuppet,\n    [SPECIES_BANETTE]     = gMonIcon_Banette,\n    [SPECIES_SEVIPER]     = gMonIcon_Seviper,\n    [SPECIES_ZANGOOSE]    = gMonIcon_Zangoose,\n    [SPECIES_RELICANTH]   = gMonIcon_Relicanth,\n    [SPECIES_ARON]        = gMonIcon_Aron,\n    [SPECIES_LAIRON]      = gMonIcon_Lairon,\n    [SPECIES_AGGRON]      = gMonIcon_Aggron,\n    [SPECIES_CASTFORM]    = gMonIcon_Castform,\n    [SPECIES_VOLBEAT]     = gMonIcon_Volbeat,\n    [SPECIES_ILLUMISE]    = gMonIcon_Illumise,\n    [SPECIES_LILEEP]      = gMonIcon_Lileep,\n    [SPECIES_CRADILY]     = gMonIcon_Cradily,\n    [SPECIES_ANORITH]     = gMonIcon_Anorith,\n    [SPECIES_ARMALDO]     = gMonIcon_Armaldo,\n    [SPECIES_RALTS]       = gMonIcon_Ralts,\n    [SPECIES_KIRLIA]      = gMonIcon_Kirlia,\n    [SPECIES_GARDEVOIR]   = gMonIcon_Gardevoir,\n    [SPECIES_BAGON]       = gMonIcon_Bagon,\n    [SPECIES_SHELGON]     = gMonIcon_Shelgon,\n    [SPECIES_SALAMENCE]   = gMonIcon_Salamence,\n    [SPECIES_BELDUM]      = gMonIcon_Beldum,\n    [SPECIES_METANG]      = gMonIcon_Metang,\n    [SPECIES_METAGROSS]   = gMonIcon_Metagross,\n    [SPECIES_REGIROCK]    = gMonIcon_Regirock,\n    [SPECIES_REGICE]      = gMonIcon_Regice,\n    [SPECIES_REGISTEEL]   = gMonIcon_Registeel,\n    [SPECIES_KYOGRE]      = gMonIcon_Kyogre,\n    [SPECIES_GROUDON]     = gMonIcon_Groudon,\n    [SPECIES_RAYQUAZA]    = gMonIcon_Rayquaza,\n    [SPECIES_LATIAS]      = gMonIcon_Latias,\n    [SPECIES_LATIOS]      = gMonIcon_Latios,\n    [SPECIES_JIRACHI]     = gMonIcon_Jirachi,\n    [SPECIES_DEOXYS]      = gMonIcon_Deoxys,\n    [SPECIES_CHIMECHO]    = gMonIcon_Chimecho,\n    [SPECIES_EGG]         = gMonIcon_Egg,\n    [SPECIES_UNOWN_B]     = gMonIcon_UnownB,\n    [SPECIES_UNOWN_C]     = gMonIcon_UnownC,\n    [SPECIES_UNOWN_D]     = gMonIcon_UnownD,\n    [SPECIES_UNOWN_E]     = gMonIcon_UnownE,\n    [SPECIES_UNOWN_F]     = gMonIcon_UnownF,\n    [SPECIES_UNOWN_G]     = gMonIcon_UnownG,\n    [SPECIES_UNOWN_H]     = gMonIcon_UnownH,\n    [SPECIES_UNOWN_I]     = gMonIcon_UnownI,\n    [SPECIES_UNOWN_J]     = gMonIcon_UnownJ,\n    [SPECIES_UNOWN_K]     = gMonIcon_UnownK,\n    [SPECIES_UNOWN_L]     = gMonIcon_UnownL,\n    [SPECIES_UNOWN_M]     = gMonIcon_UnownM,\n    [SPECIES_UNOWN_N]     = gMonIcon_UnownN,\n    [SPECIES_UNOWN_O]     = gMonIcon_UnownO,\n    [SPECIES_UNOWN_P]     = gMonIcon_UnownP,\n    [SPECIES_UNOWN_Q]     = gMonIcon_UnownQ,\n    [SPECIES_UNOWN_R]     = gMonIcon_UnownR,\n    [SPECIES_UNOWN_S]     = gMonIcon_UnownS,\n    [SPECIES_UNOWN_T]     = gMonIcon_UnownT,\n    [SPECIES_UNOWN_U]     = gMonIcon_UnownU,\n    [SPECIES_UNOWN_V]     = gMonIcon_UnownV,\n    [SPECIES_UNOWN_W]     = gMonIcon_UnownW,\n    [SPECIES_UNOWN_X]     = gMonIcon_UnownX,\n    [SPECIES_UNOWN_Y]     = gMonIcon_UnownY,\n    [SPECIES_UNOWN_Z]     = gMonIcon_UnownZ,\n    [SPECIES_UNOWN_EMARK] = gMonIcon_UnownExclamationMark,\n    [SPECIES_UNOWN_QMARK] = gMonIcon_UnownQuestionMark\n};\n\nconst u8 gMonIconPaletteIndices[] = {\n    [SPECIES_NONE]        = 0,\n    [SPECIES_BULBASAUR]   = 1,\n    [SPECIES_IVYSAUR]     = 1,\n    [SPECIES_VENUSAUR]    = 1,\n    [SPECIES_CHARMANDER]  = 0,\n    [SPECIES_CHARMELEON]  = 0,\n    [SPECIES_CHARIZARD]   = 0,\n    [SPECIES_SQUIRTLE]    = 0,\n    [SPECIES_WARTORTLE]   = 2,\n    [SPECIES_BLASTOISE]   = 2,\n    [SPECIES_CATERPIE]    = 1,\n    [SPECIES_METAPOD]     = 1,\n    [SPECIES_BUTTERFREE]  = 0,\n    [SPECIES_WEEDLE]      = 1,\n    [SPECIES_KAKUNA]      = 2,\n    [SPECIES_BEEDRILL]    = 2,\n    [SPECIES_PIDGEY]      = 0,\n    [SPECIES_PIDGEOTTO]   = 0,\n    [SPECIES_PIDGEOT]     = 0,\n    [SPECIES_RATTATA]     = 2,\n    [SPECIES_RATICATE]    = 1,\n    [SPECIES_SPEAROW]     = 0,\n    [SPECIES_FEAROW]      = 0,\n    [SPECIES_EKANS]       = 2,\n    [SPECIES_ARBOK]       = 2,\n    [SPECIES_PIKACHU]     = 2,\n    [SPECIES_RAICHU]      = 0,\n    [SPECIES_SANDSHREW]   = 2,\n    [SPECIES_SANDSLASH]   = 2,\n    [SPECIES_NIDORAN_F]   = 2,\n    [SPECIES_NIDORINA]    = 2,\n    [SPECIES_NIDOQUEEN]   = 2,\n    [SPECIES_NIDORAN_M]   = 2,\n    [SPECIES_NIDORINO]    = 2,\n    [SPECIES_NIDOKING]    = 2,\n    [SPECIES_CLEFAIRY]    = 0,\n    [SPECIES_CLEFABLE]    = 0,\n    [SPECIES_VULPIX]      = 2,\n    [SPECIES_NINETALES]   = 1,\n    [SPECIES_JIGGLYPUFF]  = 0,\n    [SPECIES_WIGGLYTUFF]  = 0,\n    [SPECIES_ZUBAT]       = 2,\n    [SPECIES_GOLBAT]      = 2,\n    [SPECIES_ODDISH]      = 1,\n    [SPECIES_GLOOM]       = 0,\n    [SPECIES_VILEPLUME]   = 0,\n    [SPECIES_PARAS]       = 0,\n    [SPECIES_PARASECT]    = 0,\n    [SPECIES_VENONAT]     = 0,\n    [SPECIES_VENOMOTH]    = 2,\n    [SPECIES_DIGLETT]     = 2,\n    [SPECIES_DUGTRIO]     = 2,\n    [SPECIES_MEOWTH]      = 1,\n    [SPECIES_PERSIAN]     = 1,\n    [SPECIES_PSYDUCK]     = 1,\n    [SPECIES_GOLDUCK]     = 2,\n    [SPECIES_MANKEY]      = 1,\n    [SPECIES_PRIMEAPE]    = 2,\n    [SPECIES_GROWLITHE]   = 0,\n    [SPECIES_ARCANINE]    = 0,\n    [SPECIES_POLIWAG]     = 0,\n    [SPECIES_POLIWHIRL]   = 0,\n    [SPECIES_POLIWRATH]   = 0,\n    [SPECIES_ABRA]        = 2,\n    [SPECIES_KADABRA]     = 2,\n    [SPECIES_ALAKAZAM]    = 2,\n    [SPECIES_MACHOP]      = 0,\n    [SPECIES_MACHOKE]     = 2,\n    [SPECIES_MACHAMP]     = 0,\n    [SPECIES_BELLSPROUT]  = 1,\n    [SPECIES_WEEPINBELL]  = 1,\n    [SPECIES_VICTREEBEL]  = 1,\n    [SPECIES_TENTACOOL]   = 2,\n    [SPECIES_TENTACRUEL]  = 2,\n    [SPECIES_GEODUDE]     = 1,\n    [SPECIES_GRAVELER]    = 1,\n    [SPECIES_GOLEM]       = 1,\n    [SPECIES_PONYTA]      = 0,\n    [SPECIES_RAPIDASH]    = 0,\n    [SPECIES_SLOWPOKE]    = 0,\n    [SPECIES_SLOWBRO]     = 0,\n    [SPECIES_MAGNEMITE]   = 0,\n    [SPECIES_MAGNETON]    = 0,\n    [SPECIES_FARFETCHD]   = 1,\n    [SPECIES_DODUO]       = 2,\n    [SPECIES_DODRIO]      = 2,\n    [SPECIES_SEEL]        = 2,\n    [SPECIES_DEWGONG]     = 2,\n    [SPECIES_GRIMER]      = 2,\n    [SPECIES_MUK]         = 2,\n    [SPECIES_SHELLDER]    = 2,\n    [SPECIES_CLOYSTER]    = 2,\n    [SPECIES_GASTLY]      = 2,\n    [SPECIES_HAUNTER]     = 2,\n    [SPECIES_GENGAR]      = 2,\n    [SPECIES_ONIX]        = 2,\n    [SPECIES_DROWZEE]     = 2,\n    [SPECIES_HYPNO]       = 1,\n    [SPECIES_KRABBY]      = 2,\n    [SPECIES_KINGLER]     = 2,\n    [SPECIES_VOLTORB]     = 0,\n    [SPECIES_ELECTRODE]   = 0,\n    [SPECIES_EXEGGCUTE]   = 0,\n    [SPECIES_EXEGGUTOR]   = 1,\n    [SPECIES_CUBONE]      = 1,\n    [SPECIES_MAROWAK]     = 1,\n    [SPECIES_HITMONLEE]   = 2,\n    [SPECIES_HITMONCHAN]  = 2,\n    [SPECIES_LICKITUNG]   = 1,\n    [SPECIES_KOFFING]     = 2,\n    [SPECIES_WEEZING]     = 2,\n    [SPECIES_RHYHORN]     = 1,\n    [SPECIES_RHYDON]      = 1,\n    [SPECIES_CHANSEY]     = 0,\n    [SPECIES_TANGELA]     = 0,\n    [SPECIES_KANGASKHAN]  = 1,\n    [SPECIES_HORSEA]      = 0,\n    [SPECIES_SEADRA]      = 0,\n    [SPECIES_GOLDEEN]     = 0,\n    [SPECIES_SEAKING]     = 0,\n    [SPECIES_STARYU]      = 2,\n    [SPECIES_STARMIE]     = 2,\n    [SPECIES_MR_MIME]     = 0,\n    [SPECIES_SCYTHER]     = 1,\n    [SPECIES_JYNX]        = 2,\n    [SPECIES_ELECTABUZZ]  = 1,\n    [SPECIES_MAGMAR]      = 0,\n    [SPECIES_PINSIR]      = 2,\n    [SPECIES_TAUROS]      = 2,\n    [SPECIES_MAGIKARP]    = 0,\n    [SPECIES_GYARADOS]    = 0,\n    [SPECIES_LAPRAS]      = 2,\n    [SPECIES_DITTO]       = 2,\n    [SPECIES_EEVEE]       = 2,\n    [SPECIES_VAPOREON]    = 0,\n    [SPECIES_JOLTEON]     = 0,\n    [SPECIES_FLAREON]     = 0,\n    [SPECIES_PORYGON]     = 0,\n    [SPECIES_OMANYTE]     = 0,\n    [SPECIES_OMASTAR]     = 0,\n    [SPECIES_KABUTO]      = 2,\n    [SPECIES_KABUTOPS]    = 2,\n    [SPECIES_AERODACTYL]  = 0,\n    [SPECIES_SNORLAX]     = 1,\n    [SPECIES_ARTICUNO]    = 0,\n    [SPECIES_ZAPDOS]      = 0,\n    [SPECIES_MOLTRES]     = 0,\n    [SPECIES_DRATINI]     = 0,\n    [SPECIES_DRAGONAIR]   = 0,\n    [SPECIES_DRAGONITE]   = 2,\n    [SPECIES_MEWTWO]      = 2,\n    [SPECIES_MEW]         = 0,\n    [SPECIES_CHIKORITA]   = 1,\n    [SPECIES_BAYLEEF]     = 1,\n    [SPECIES_MEGANIUM]    = 1,\n    [SPECIES_CYNDAQUIL]   = 1,\n    [SPECIES_QUILAVA]     = 1,\n    [SPECIES_TYPHLOSION]  = 1,\n    [SPECIES_TOTODILE]    = 2,\n    [SPECIES_CROCONAW]    = 2,\n    [SPECIES_FERALIGATR]  = 2,\n    [SPECIES_SENTRET]     = 2,\n    [SPECIES_FURRET]      = 2,\n    [SPECIES_HOOTHOOT]    = 2,\n    [SPECIES_NOCTOWL]     = 2,\n    [SPECIES_LEDYBA]      = 0,\n    [SPECIES_LEDIAN]      = 0,\n    [SPECIES_SPINARAK]    = 1,\n    [SPECIES_ARIADOS]     = 0,\n    [SPECIES_CROBAT]      = 2,\n    [SPECIES_CHINCHOU]    = 2,\n    [SPECIES_LANTURN]     = 0,\n    [SPECIES_PICHU]       = 0,\n    [SPECIES_CLEFFA]      = 0,\n    [SPECIES_IGGLYBUFF]   = 1,\n    [SPECIES_TOGEPI]      = 2,\n    [SPECIES_TOGETIC]     = 2,\n    [SPECIES_NATU]        = 0,\n    [SPECIES_XATU]        = 0,\n    [SPECIES_MAREEP]      = 2,\n    [SPECIES_FLAAFFY]     = 0,\n    [SPECIES_AMPHAROS]    = 0,\n    [SPECIES_BELLOSSOM]   = 1,\n    [SPECIES_MARILL]      = 2,\n    [SPECIES_AZUMARILL]   = 2,\n    [SPECIES_SUDOWOODO]   = 1,\n    [SPECIES_POLITOED]    = 1,\n    [SPECIES_HOPPIP]      = 1,\n    [SPECIES_SKIPLOOM]    = 1,\n    [SPECIES_JUMPLUFF]    = 2,\n    [SPECIES_AIPOM]       = 2,\n    [SPECIES_SUNKERN]     = 1,\n    [SPECIES_SUNFLORA]    = 1,\n    [SPECIES_YANMA]       = 1,\n    [SPECIES_WOOPER]      = 0,\n    [SPECIES_QUAGSIRE]    = 0,\n    [SPECIES_ESPEON]      = 2,\n    [SPECIES_UMBREON]     = 2,\n    [SPECIES_MURKROW]     = 2,\n    [SPECIES_SLOWKING]    = 0,\n    [SPECIES_MISDREAVUS]  = 0,\n    [SPECIES_UNOWN]       = 0,\n    [SPECIES_WOBBUFFET]   = 0,\n    [SPECIES_GIRAFARIG]   = 1,\n    [SPECIES_PINECO]      = 0,\n    [SPECIES_FORRETRESS]  = 2,\n    [SPECIES_DUNSPARCE]   = 2,\n    [SPECIES_GLIGAR]      = 2,\n    [SPECIES_STEELIX]     = 0,\n    [SPECIES_SNUBBULL]    = 0,\n    [SPECIES_GRANBULL]    = 2,\n    [SPECIES_QWILFISH]    = 0,\n    [SPECIES_SCIZOR]      = 0,\n    [SPECIES_SHUCKLE]     = 1,\n    [SPECIES_HERACROSS]   = 2,\n    [SPECIES_SNEASEL]     = 0,\n    [SPECIES_TEDDIURSA]   = 0,\n    [SPECIES_URSARING]    = 2,\n    [SPECIES_SLUGMA]      = 0,\n    [SPECIES_MAGCARGO]    = 0,\n    [SPECIES_SWINUB]      = 2,\n    [SPECIES_PILOSWINE]   = 2,\n    [SPECIES_CORSOLA]     = 0,\n    [SPECIES_REMORAID]    = 0,\n    [SPECIES_OCTILLERY]   = 0,\n    [SPECIES_DELIBIRD]    = 0,\n    [SPECIES_MANTINE]     = 2,\n    [SPECIES_SKARMORY]    = 0,\n    [SPECIES_HOUNDOUR]    = 0,\n    [SPECIES_HOUNDOOM]    = 0,\n    [SPECIES_KINGDRA]     = 0,\n    [SPECIES_PHANPY]      = 0,\n    [SPECIES_DONPHAN]     = 0,\n    [SPECIES_PORYGON2]    = 0,\n    [SPECIES_STANTLER]    = 2,\n    [SPECIES_SMEARGLE]    = 1,\n    [SPECIES_TYROGUE]     = 2,\n    [SPECIES_HITMONTOP]   = 2,\n    [SPECIES_SMOOCHUM]    = 1,\n    [SPECIES_ELEKID]      = 1,\n    [SPECIES_MAGBY]       = 1,\n    [SPECIES_MILTANK]     = 1,\n    [SPECIES_BLISSEY]     = 1,\n    [SPECIES_RAIKOU]      = 0,\n    [SPECIES_ENTEI]       = 2,\n    [SPECIES_SUICUNE]     = 0,\n    [SPECIES_LARVITAR]    = 1,\n    [SPECIES_PUPITAR]     = 0,\n    [SPECIES_TYRANITAR]   = 1,\n    [SPECIES_LUGIA]       = 0,\n    [SPECIES_HO_OH]       = 1,\n    [SPECIES_CELEBI]      = 1,\n    [SPECIES_OLD_UNOWN_B] = 0,\n    [SPECIES_OLD_UNOWN_C] = 0,\n    [SPECIES_OLD_UNOWN_D] = 0,\n    [SPECIES_OLD_UNOWN_E] = 0,\n    [SPECIES_OLD_UNOWN_F] = 0,\n    [SPECIES_OLD_UNOWN_G] = 0,\n    [SPECIES_OLD_UNOWN_H] = 0,\n    [SPECIES_OLD_UNOWN_I] = 0,\n    [SPECIES_OLD_UNOWN_J] = 0,\n    [SPECIES_OLD_UNOWN_K] = 0,\n    [SPECIES_OLD_UNOWN_L] = 0,\n    [SPECIES_OLD_UNOWN_M] = 0,\n    [SPECIES_OLD_UNOWN_N] = 0,\n    [SPECIES_OLD_UNOWN_O] = 0,\n    [SPECIES_OLD_UNOWN_P] = 0,\n    [SPECIES_OLD_UNOWN_Q] = 0,\n    [SPECIES_OLD_UNOWN_R] = 0,\n    [SPECIES_OLD_UNOWN_S] = 0,\n    [SPECIES_OLD_UNOWN_T] = 0,\n    [SPECIES_OLD_UNOWN_U] = 0,\n    [SPECIES_OLD_UNOWN_V] = 0,\n    [SPECIES_OLD_UNOWN_W] = 0,\n    [SPECIES_OLD_UNOWN_X] = 0,\n    [SPECIES_OLD_UNOWN_Y] = 0,\n    [SPECIES_OLD_UNOWN_Z] = 0,\n    [SPECIES_TREECKO]     = 1,\n    [SPECIES_GROVYLE]     = 0,\n    [SPECIES_SCEPTILE]    = 1,\n    [SPECIES_TORCHIC]     = 0,\n    [SPECIES_COMBUSKEN]   = 0,\n    [SPECIES_BLAZIKEN]    = 0,\n    [SPECIES_MUDKIP]      = 0,\n    [SPECIES_MARSHTOMP]   = 0,\n    [SPECIES_SWAMPERT]    = 0,\n    [SPECIES_POOCHYENA]   = 2,\n    [SPECIES_MIGHTYENA]   = 2,\n    [SPECIES_ZIGZAGOON]   = 2,\n    [SPECIES_LINOONE]     = 2,\n    [SPECIES_WURMPLE]     = 0,\n    [SPECIES_SILCOON]     = 2,\n    [SPECIES_BEAUTIFLY]   = 0,\n    [SPECIES_CASCOON]     = 2,\n    [SPECIES_DUSTOX]      = 1,\n    [SPECIES_LOTAD]       = 1,\n    [SPECIES_LOMBRE]      = 1,\n    [SPECIES_LUDICOLO]    = 1,\n    [SPECIES_SEEDOT]      = 1,\n    [SPECIES_NUZLEAF]     = 1,\n    [SPECIES_SHIFTRY]     = 0,\n    [SPECIES_NINCADA]     = 1,\n    [SPECIES_NINJASK]     = 1,\n    [SPECIES_SHEDINJA]    = 1,\n    [SPECIES_TAILLOW]     = 2,\n    [SPECIES_SWELLOW]     = 2,\n    [SPECIES_SHROOMISH]   = 1,\n    [SPECIES_BRELOOM]     = 1,\n    [SPECIES_SPINDA]      = 1,\n    [SPECIES_WINGULL]     = 0,\n    [SPECIES_PELIPPER]    = 0,\n    [SPECIES_SURSKIT]     = 2,\n    [SPECIES_MASQUERAIN]  = 0,\n    [SPECIES_WAILMER]     = 2,\n    [SPECIES_WAILORD]     = 0,\n    [SPECIES_SKITTY]      = 0,\n    [SPECIES_DELCATTY]    = 2,\n    [SPECIES_KECLEON]     = 1,\n    [SPECIES_BALTOY]      = 1,\n    [SPECIES_CLAYDOL]     = 0,\n    [SPECIES_NOSEPASS]    = 0,\n    [SPECIES_TORKOAL]     = 1,\n    [SPECIES_SABLEYE]     = 2,\n    [SPECIES_BARBOACH]    = 0,\n    [SPECIES_WHISCASH]    = 0,\n    [SPECIES_LUVDISC]     = 0,\n    [SPECIES_CORPHISH]    = 0,\n    [SPECIES_CRAWDAUNT]   = 0,\n    [SPECIES_FEEBAS]      = 2,\n    [SPECIES_MILOTIC]     = 0,\n    [SPECIES_CARVANHA]    = 0,\n    [SPECIES_SHARPEDO]    = 0,\n    [SPECIES_TRAPINCH]    = 1,\n    [SPECIES_VIBRAVA]     = 1,\n    [SPECIES_FLYGON]      = 1,\n    [SPECIES_MAKUHITA]    = 2,\n    [SPECIES_HARIYAMA]    = 1,\n    [SPECIES_ELECTRIKE]   = 1,\n    [SPECIES_MANECTRIC]   = 0,\n    [SPECIES_NUMEL]       = 1,\n    [SPECIES_CAMERUPT]    = 0,\n    [SPECIES_SPHEAL]      = 2,\n    [SPECIES_SEALEO]      = 2,\n    [SPECIES_WALREIN]     = 0,\n    [SPECIES_CACNEA]      = 1,\n    [SPECIES_CACTURNE]    = 1,\n    [SPECIES_SNORUNT]     = 2,\n    [SPECIES_GLALIE]      = 0,\n    [SPECIES_LUNATONE]    = 1,\n    [SPECIES_SOLROCK]     = 0,\n    [SPECIES_AZURILL]     = 2,\n    [SPECIES_SPOINK]      = 0,\n    [SPECIES_GRUMPIG]     = 2,\n    [SPECIES_PLUSLE]      = 0,\n    [SPECIES_MINUN]       = 0,\n    [SPECIES_MAWILE]      = 2,\n    [SPECIES_MEDITITE]    = 0,\n    [SPECIES_MEDICHAM]    = 0,\n    [SPECIES_SWABLU]      = 0,\n    [SPECIES_ALTARIA]     = 0,\n    [SPECIES_WYNAUT]      = 0,\n    [SPECIES_DUSKULL]     = 0,\n    [SPECIES_DUSCLOPS]    = 0,\n    [SPECIES_ROSELIA]     = 0,\n    [SPECIES_SLAKOTH]     = 2,\n    [SPECIES_VIGOROTH]    = 2,\n    [SPECIES_SLAKING]     = 1,\n    [SPECIES_GULPIN]      = 1,\n    [SPECIES_SWALOT]      = 2,\n    [SPECIES_TROPIUS]     = 1,\n    [SPECIES_WHISMUR]     = 0,\n    [SPECIES_LOUDRED]     = 2,\n    [SPECIES_EXPLOUD]     = 2,\n    [SPECIES_CLAMPERL]    = 0,\n    [SPECIES_HUNTAIL]     = 0,\n    [SPECIES_GOREBYSS]    = 0,\n    [SPECIES_ABSOL]       = 0,\n    [SPECIES_SHUPPET]     = 0,\n    [SPECIES_BANETTE]     = 0,\n    [SPECIES_SEVIPER]     = 2,\n    [SPECIES_ZANGOOSE]    = 0,\n    [SPECIES_RELICANTH]   = 1,\n    [SPECIES_ARON]        = 2,\n    [SPECIES_LAIRON]      = 2,\n    [SPECIES_AGGRON]      = 2,\n    [SPECIES_CASTFORM]    = 0,\n    [SPECIES_VOLBEAT]     = 0,\n    [SPECIES_ILLUMISE]    = 2,\n    [SPECIES_LILEEP]      = 2,\n    [SPECIES_CRADILY]     = 0,\n    [SPECIES_ANORITH]     = 0,\n    [SPECIES_ARMALDO]     = 0,\n    [SPECIES_RALTS]       = 1,\n    [SPECIES_KIRLIA]      = 1,\n    [SPECIES_GARDEVOIR]   = 1,\n    [SPECIES_BAGON]       = 2,\n    [SPECIES_SHELGON]     = 2,\n    [SPECIES_SALAMENCE]   = 0,\n    [SPECIES_BELDUM]      = 0,\n    [SPECIES_METANG]      = 0,\n    [SPECIES_METAGROSS]   = 0,\n    [SPECIES_REGIROCK]    = 2,\n    [SPECIES_REGICE]      = 2,\n    [SPECIES_REGISTEEL]   = 2,\n    [SPECIES_KYOGRE]      = 2,\n    [SPECIES_GROUDON]     = 0,\n    [SPECIES_RAYQUAZA]    = 1,\n    [SPECIES_LATIAS]      = 0,\n    [SPECIES_LATIOS]      = 2,\n    [SPECIES_JIRACHI]     = 0,\n    [SPECIES_DEOXYS]      = 0,\n    [SPECIES_CHIMECHO]    = 0,\n    [SPECIES_EGG]         = 1,\n    [SPECIES_UNOWN_B]     = 0,\n    [SPECIES_UNOWN_C]     = 0,\n    [SPECIES_UNOWN_D]     = 0,\n    [SPECIES_UNOWN_E]     = 0,\n    [SPECIES_UNOWN_F]     = 0,\n    [SPECIES_UNOWN_G]     = 0,\n    [SPECIES_UNOWN_H]     = 0,\n    [SPECIES_UNOWN_I]     = 0,\n    [SPECIES_UNOWN_J]     = 0,\n    [SPECIES_UNOWN_K]     = 0,\n    [SPECIES_UNOWN_L]     = 0,\n    [SPECIES_UNOWN_M]     = 0,\n    [SPECIES_UNOWN_N]     = 0,\n    [SPECIES_UNOWN_O]     = 0,\n    [SPECIES_UNOWN_P]     = 0,\n    [SPECIES_UNOWN_Q]     = 0,\n    [SPECIES_UNOWN_R]     = 0,\n    [SPECIES_UNOWN_S]     = 0,\n    [SPECIES_UNOWN_T]     = 0,\n    [SPECIES_UNOWN_U]     = 0,\n    [SPECIES_UNOWN_V]     = 0,\n    [SPECIES_UNOWN_W]     = 0,\n    [SPECIES_UNOWN_X]     = 0,\n    [SPECIES_UNOWN_Y]     = 0,\n    [SPECIES_UNOWN_Z]     = 0,\n    [SPECIES_UNOWN_EMARK] = 0,\n    [SPECIES_UNOWN_QMARK] = 0\n};\n\nconst struct SpritePalette gMonIconPaletteTable[] = {\n    { gMonIconPalettes[0], POKE_ICON_BASE_PAL_TAG + 0 },\n    { gMonIconPalettes[1], POKE_ICON_BASE_PAL_TAG + 1 },\n    { gMonIconPalettes[2], POKE_ICON_BASE_PAL_TAG + 2 },\n    // The following three point outside the gMonIconPalettes array\n    // and are therefore invalid. Fortunately, they are never used.\n    { gMonIconPalettes[3], POKE_ICON_BASE_PAL_TAG + 3 },\n    { gMonIconPalettes[4], POKE_ICON_BASE_PAL_TAG + 4 },\n    { gMonIconPalettes[5], POKE_ICON_BASE_PAL_TAG + 5 }\n};\n\nstatic const struct OamData sMonIconOamData = {\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x32),\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sMonIconAnim_Fast[] = {\n    ANIMCMD_FRAME(0,  6),\n    ANIMCMD_FRAME(1,  6),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sMonIconAnim_MediumFast[] = {\n    ANIMCMD_FRAME(0,  8),\n    ANIMCMD_FRAME(1,  8),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sMonIconAnim_MediumSlow[] = {\n    ANIMCMD_FRAME(0, 14),\n    ANIMCMD_FRAME(1, 14),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sMonIconAnim_Slow[] = {\n    ANIMCMD_FRAME(0, 22),\n    ANIMCMD_FRAME(1, 22),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sMonIconAnim_Still[] = {\n    ANIMCMD_FRAME(0, 29),\n    ANIMCMD_FRAME(0, 29),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sMonIconAnims[] = {\n    sMonIconAnim_Fast,\n    sMonIconAnim_MediumFast,\n    sMonIconAnim_MediumSlow,\n    sMonIconAnim_Slow,\n    sMonIconAnim_Still\n};\n\nstatic const union AffineAnimCmd sMonIconAffineAnim_0[] = {\n    AFFINEANIMCMD_FRAME(0, 0, 0, 10),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sMonIconAffineAnim_1[] = {\n    AFFINEANIMCMD_FRAME(-2, -2, 0, 122),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sMonIconAffineAnims[] = {\n    sMonIconAffineAnim_0,\n    sMonIconAffineAnim_1\n};\n\nstatic const u16 sSpriteImageSizes[][4] = {\n    [ST_OAM_SQUARE] = {\n        [ST_OAM_SIZE_0] = 0x020,\n        [ST_OAM_SIZE_1] = 0x080,\n        [ST_OAM_SIZE_2] = 0x200,\n        [ST_OAM_SIZE_3] = 0x800,\n    },\n    [ST_OAM_H_RECTANGLE] = {\n        [ST_OAM_SIZE_0] = 0x040,\n        [ST_OAM_SIZE_1] = 0x080,\n        [ST_OAM_SIZE_2] = 0x100,\n        [ST_OAM_SIZE_3] = 0x400,\n    },\n    [ST_OAM_V_RECTANGLE] = {\n        [ST_OAM_SIZE_0] = 0x040,\n        [ST_OAM_SIZE_1] = 0x080,\n        [ST_OAM_SIZE_2] = 0x100,\n        [ST_OAM_SIZE_3] = 0x400,\n    },\n};\n\nu8 CreateMonIcon(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subpriority, u32 personality, bool32 extra)\n{\n    u8 spriteId;\n    struct MonIconSpriteTemplate iconTemplate =\n        {\n            .oam = &sMonIconOamData,\n            .image = GetMonIconPtr(species, personality, extra),\n            .anims = sMonIconAnims,\n            .affineAnims = sMonIconAffineAnims,\n            .callback = callback,\n            .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species],\n        };\n\n    if (species > NUM_SPECIES)\n        iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG;\n\n    spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority);\n\n    UpdateMonIconFrame(&gSprites[spriteId]);\n\n    return spriteId;\n}\n\nu8 CreateMonIcon_HandleDeoxys(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subpriority, bool32 extra)\n{\n    u8 spriteId;\n    struct MonIconSpriteTemplate iconTemplate =\n        {\n            .oam = &sMonIconOamData,\n            .image = NULL,\n            .anims = sMonIconAnims,\n            .affineAnims = sMonIconAffineAnims,\n            .callback = callback,\n            .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species],\n        };\n\n    iconTemplate.image = GetMonIconTiles(species, extra);\n    spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority);\n\n    UpdateMonIconFrame(&gSprites[spriteId]);\n\n    return spriteId;\n}\n\nu16 GetIconSpecies(u16 species, u32 personality)\n{\n    u16 result;\n\n    if (species == SPECIES_UNOWN)\n    {\n        u16 letter = GetUnownLetterByPersonality(personality);\n        if (letter == 0)\n            letter = SPECIES_UNOWN;\n        else\n            letter += (SPECIES_UNOWN_B - 1);\n        result = letter;\n    }\n    else if(species == SPECIES_DEOXYS)\n    {\n        switch(personality) //pid was hijacked to hold Deoxys forms\n        {   //setting result to arbitrarily high numbers\n            //picked highest ones to not interfere with\n            //Pokemon expansion.\n            case 1: //Attack Forme\n                result = 65531;\n                break;\n            case 2:\n                result = 65532;\n                break;\n            case 3:\n                result = 65533;\n                break;\n            default: //Normal Forme\n                result = 65530;\n        }\n    }\n    else if(species >= 65530 && species <= 65533)\n    {\n        result = species;\n    }\n    else\n    {\n        if (species > NUM_SPECIES)\n            result = SPECIES_NONE;\n        else\n            result = species;\n    }\n\n    return result;\n}\n\nu16 GetUnownLetterByPersonality(u32 personality)\n{\n    if (!personality)\n        return 0;\n    else\n        return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C;\n}\n\nu16 MailSpeciesToIconSpecies(u16 species)\n{\n    u16 value;\n\n    if (MailSpeciesToSpecies(species, &value) == SPECIES_UNOWN)\n    {\n        if (value == 0)\n            value += SPECIES_UNOWN;\n        else\n            value += (SPECIES_UNOWN_B - 1);\n        return value;\n    }\n    else\n    {\n        if (species > (SPECIES_UNOWN_B - 1))\n            species = SPECIES_NONE;\n        return GetIconSpecies(species, 0);\n    }\n}\n\nconst u8 *GetMonIconTiles(u16 species, bool32 extra)\n{\n    const u8 *iconSprite = gMonIconTable[species];\n    if(species >= 65530 && species <= 65533)\n    {\n        iconSprite = (const u8*)gMonIconTable[SPECIES_DEOXYS];\n    }\n    if (extra == TRUE && (species >= 65530 && species <= 65533))\n    {\n        //iconSprite = (const u8*)(0x400 + (u32)iconSprite); // use the specific Deoxys form icon (Speed in this case)\n        switch(species)\n        {   //Normal Forme is already loaded and overwritten here\n            case 65531: //Attack Forme\n                iconSprite = (const u8*)(0x400 + (u32)iconSprite);\n                break;\n            case 65532: //Defense Forme\n                iconSprite = (const u8*)((0x400 * 2) + (u32)iconSprite);\n                break;\n            case 65533: //Speed Forme\n                iconSprite = (const u8*)((0x400 * 3) + (u32)iconSprite);\n                break;\n        }\n    }\n    return iconSprite;\n}\n\nconst u8 *GetMonIconPtr(u16 species, u32 personality, bool32 extra)\n{\n    return GetMonIconTiles(GetIconSpecies(species, personality), extra);\n}\n\nvoid DestroyMonIcon(struct Sprite *sprite)\n{\n    DestroyMonIconInternal(sprite);\n}\n\nvoid LoadMonIconPalettes(void)\n{\n    u32 i;\n    for (i = 0; i < ARRAY_COUNT(gMonIconPaletteTable); i++)\n        LoadSpritePalette(&gMonIconPaletteTable[i]);\n}\n\nvoid SafeLoadMonIconPalette(u16 species)\n{\n    u8 palIndex;\n    if (species > NUM_SPECIES)\n        species = SPECIES_NONE;\n    palIndex = gMonIconPaletteIndices[species];\n    if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF)\n        LoadSpritePalette(&gMonIconPaletteTable[palIndex]);\n}\n\nvoid LoadMonIconPalette(u16 species)\n{\n    u8 palIndex;\n    palIndex = gMonIconPaletteIndices[species];\n    if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF)\n        LoadSpritePalette(&gMonIconPaletteTable[palIndex]);\n}\n\nvoid FreeMonIconPalettes(void)\n{\n    u32 i;\n    for (i = 0; i < ARRAY_COUNT(gMonIconPaletteTable); i++)\n        FreeSpritePaletteByTag(gMonIconPaletteTable[i].tag);\n}\n\nvoid SafeFreeMonIconPalette(u16 species)\n{\n    u8 palIndex;\n    if (species > NUM_SPECIES)\n        species = SPECIES_NONE;\n    palIndex = gMonIconPaletteIndices[species];\n    FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag);\n}\n\nvoid FreeMonIconPalette(u16 species)\n{\n    u8 palIndex;\n    palIndex = gMonIconPaletteIndices[species];\n    FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag);\n}\n\nvoid SpriteCB_MonIcon(struct Sprite *sprite)\n{\n    UpdateMonIconFrame(sprite);\n}\n\nvoid LoadMonIconPalettesAt(u16 offset)\n{\n    int i;\n    if (offset <= BG_PLTT_ID(16 - ARRAY_COUNT(gMonIconPaletteTable)))\n    {\n        for (i = 0; i < (int)ARRAY_COUNT(gMonIconPaletteTable); i++)\n        {\n            LoadPalette(gMonIconPaletteTable[i].data, offset, PLTT_SIZE_4BPP);\n            offset += 16;\n        }\n    }\n}\n\nconst u16 *GetValidMonIconPalettePtr(u16 species)\n{\n    if (species > NUM_SPECIES)\n        species = SPECIES_NONE;\n    return gMonIconPaletteTable[gMonIconPaletteIndices[species]].data;\n}\n\nu8 GetValidMonIconPalIndex(u16 species)\n{\n    if (species > NUM_SPECIES)\n        species = SPECIES_NONE;\n    return gMonIconPaletteIndices[species];\n}\n\nu8 GetMonIconPaletteIndexFromSpecies(u16 species)\n{\n    return gMonIconPaletteIndices[species];\n}\n\nu8 UpdateMonIconFrame(struct Sprite *sprite)\n{\n    u8 result = 0;\n\n    if (sprite->animDelayCounter == 0)\n    {\n        s16 frame = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue;\n\n        switch (frame)\n        {\n        case -1:\n            break;\n        case -2:\n            sprite->animCmdIndex = 0;\n            break;\n        default:\n            RequestSpriteCopy(\n                // pointer arithmetic is needed to get the correct pointer to perform the sprite copy on.\n                // because sprite->images is a struct def, it has to be casted to (u8 *) before any\n                // arithmetic can be performed.\n                (u8 *)sprite->images + (sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame),\n                (u8 *)(OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP),\n                sSpriteImageSizes[sprite->oam.shape][sprite->oam.size]);\n            sprite->animDelayCounter = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration & 0xFF;\n            sprite->animCmdIndex++;\n            result = sprite->animCmdIndex;\n            break;\n        }\n    }\n    else\n    {\n        sprite->animDelayCounter--;\n    }\n    return result;\n}\n\nstatic u8 CreateMonIconSprite(const struct MonIconSpriteTemplate * iconTemplate, s16 x, s16 y, u8 subpriority)\n{\n    u8 spriteId;\n\n    struct SpriteFrameImage image = { NULL, sSpriteImageSizes[iconTemplate->oam->shape][iconTemplate->oam->size] };\n\n    struct SpriteTemplate spriteTemplate =\n    {\n        .tileTag = TAG_NONE,\n        .paletteTag = iconTemplate->paletteTag,\n        .oam = iconTemplate->oam,\n        .anims = iconTemplate->anims,\n        .images = &image,\n        .affineAnims = iconTemplate->affineAnims,\n        .callback = iconTemplate->callback,\n    };\n\n    spriteId = CreateSprite(&spriteTemplate, x, y, subpriority);\n    gSprites[spriteId].animPaused = TRUE;\n    gSprites[spriteId].animBeginning = FALSE;\n    gSprites[spriteId].images = (const struct SpriteFrameImage *)iconTemplate->image;\n    return spriteId;\n}\n\nstatic void DestroyMonIconInternal(struct Sprite *sprite)\n{\n    struct SpriteFrameImage image = { NULL, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] };\n    sprite->images = &image;\n    DestroySprite(sprite);\n}\n\nvoid SetPartyHPBarSprite(struct Sprite *sprite, u8 animNum)\n{\n    sprite->animNum = animNum;\n    sprite->animDelayCounter = 0;\n    sprite->animCmdIndex = 0;\n}\n"
  },
  {
    "path": "src/pokemon_jump.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_anim.h\"\n#include \"decompress.h\"\n#include \"digit_obj_util.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"event_data.h\"\n#include \"item.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"menu.h\"\n#include \"minigame_countdown.h\"\n#include \"new_menu_helpers.h\"\n#include \"pokemon_jump.h\"\n#include \"random.h\"\n#include \"save.h\"\n#include \"script.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"text_window.h\"\n#include \"trig.h\"\n#include \"constants/items.h\"\n#include \"constants/songs.h\"\n\n#define MAX_JUMP_SCORE 99990\n#define MAX_JUMPS 9999\n\n#define JUMP_PEAK (-30)\n\nenum {\n    BG_INTERFACE,\n    BG_BONUSES,\n    BG_VENUSAUR,\n    BG_SCENERY,\n};\n\n// IDs for persistent windows\nenum {\n    WIN_POINTS,\n    WIN_TIMES,\n    NUM_WINDOWS\n};\n\nenum {\n    PACKET_MON_INFO = 1,\n    PACKET_UNUSED,\n    PACKET_LEADER_STATE,\n    PACKET_MEMBER_STATE,\n};\n\nenum {\n    JUMP_TYPE_NORMAL,\n    JUMP_TYPE_FAST,\n    JUMP_TYPE_SLOW,\n};\n\nenum {\n    FUNC_GAME_INTRO,\n    FUNC_WAIT_ROUND,\n    FUNC_GAME_ROUND,\n    FUNC_GAME_OVER,\n    FUNC_ASK_PLAY_AGAIN,\n    FUNC_RESET_GAME,\n    FUNC_EXIT,\n    FUNC_GIVE_PRIZE,\n    FUNC_SAVE,\n    FUNC_NONE\n};\n\nenum {\n    GFXFUNC_LOAD,\n    GFXFUNC_SHOW_NAMES,\n    GFXFUNC_SHOW_NAMES_HIGHLIGHT,\n    GFXFUNC_ERASE_NAMES,\n    GFXFUNC_MSG_PLAY_AGAIN,\n    GFXFUNC_MSG_SAVING,\n    GFXFUNC_ERASE_MSG,\n    GFXFUNC_MSG_PLAYER_DROPPED,\n    GFXFUNC_MSG_COMM_STANDBY,\n    GFXFUNC_COUNTDOWN,\n};\n\nenum {\n    VINE_HIGHEST,\n    VINE_DOWNSWING_HIGHER,\n    VINE_DOWNSWING_HIGH,\n    VINE_DOWNSWING_LOW,\n    VINE_DOWNSWING_LOWER,\n    VINE_LOWEST,\n    VINE_UPSWING_LOWER,\n    VINE_UPSWING_LOW,\n    VINE_UPSWING_HIGH,\n    VINE_UPSWING_HIGHER,\n    NUM_VINESTATES\n};\n\n// Used to compare limits for vineStateTimer\n// The upper 8 bits of vineStateTimer are the vine state,\n// the lower 8 bits are a timer to the next state.\n// When the timer is incremented above 255, it increments\n// the vine state and the timer is reset.\n#define VINE_STATE_TIMER(vineState)(((vineState) << 8) | 0xFF)\n\nenum {\n    MONSTATE_NORMAL, // Pokémon is either on the ground or in the middle of a jump\n    MONSTATE_JUMP,   // Pokémon has begun a jump\n    MONSTATE_HIT,    // Pokémon got hit by the vine\n};\n\nenum {\n    JUMPSTATE_NONE,\n    JUMPSTATE_SUCCESS, // Cleared vine\n    JUMPSTATE_FAILURE, // Hit vine\n};\n\n#define PLAY_AGAIN_NO  1\n#define PLAY_AGAIN_YES 2\n\n#define TAG_MON1 0\n#define TAG_MON2 1 // MON2-5 used implicitly by adding multiplayer id to tag\n#define TAG_MON3 2\n#define TAG_MON4 3\n#define TAG_MON5 4\n\n#define GFXTAG_VINE1     5\n#define GFXTAG_VINE2     6\n#define GFXTAG_VINE3     7\n#define GFXTAG_VINE4     8\n#define GFXTAG_COUNTDOWN 9\n#define GFXTAG_STAR      10\n\n#define PALTAG_1         5\n#define PALTAG_2         6\n#define PALTAG_COUNTDOWN 7\n\n#define TAG_DIGITS 800\n\n#define VINE_SPRITES_PER_SIDE 4 // Vine rope is divided into 8 sprites, 4 per side copied and flipped horizontally\n\n// Used by SetLinkTimeInterval to get a bit mask for capping\n// a timer that controls how frequently link data is sent.\n#define LINK_INTERVAL_NONE   0\n#define LINK_INTERVAL_SHORT  3 // 3 frame interval\n#define LINK_INTERVAL_MEDIUM 4 // 7 frame interval\n#define LINK_INTERVAL_LONG   5 // 15 frame interval\n\n#define LINK_TIMER_STOPPED 0x1111\n\nstruct PokemonJump_MonInfo\n{\n    u16 species;\n    u32 otId;\n    u32 personality;\n};\n\nstruct PokemonJump_Player\n{\n    int jumpOffset;\n    int jumpOffsetIdx;\n    u32 unused;\n    u16 monJumpType;\n    u16 jumpTimeStart;\n    u16 monState;\n    u16 prevMonState;\n    int jumpState;\n    bool32 funcFinished;\n    u8 name[11];\n};\n\nstruct PokemonJumpGfx\n{\n    bool32 funcFinished;\n    u16 mainState;\n    u8 taskId;\n    u8 unused1[3];\n    u8 resetVineState;\n    u8 resetVineTimer;\n    u8 vineState;\n    u8 msgWindowState;\n    u8 vinePalNumDownswing;\n    u8 vinePalNumUpswing;\n    u16 unused2;\n    u16 msgWindowId;\n    u16 fanfare;\n    u32 bonusTimer;\n    u16 nameWindowIds[MAX_RFU_PLAYERS];\n    u8 itemName[64];\n    u8 itemQuantityStr[64];\n    u8 prizeMsg[256];\n    u16 tilemapBuffer[0x4000]; // Bug: way larger than it should be\n    struct Sprite *monSprites[MAX_RFU_PLAYERS];\n    struct Sprite *starSprites[MAX_RFU_PLAYERS];\n    struct Sprite *vineSprites[VINE_SPRITES_PER_SIDE * 2];\n    u8 unused3[12];\n    u8 monSpriteSubpriorities[MAX_RFU_PLAYERS];\n};\n\nstruct PokemonJump_CommData\n{\n    u8 funcId;\n    u8 receivedBonusFlags;\n    u16 data; // Multi-use\n    u16 jumpsInRow;\n    u32 jumpScore;\n};\n\nstruct PokemonJump\n{\n    MainCallback exitCallback;\n    u8 taskId;\n    u8 numPlayers;\n    u8 multiplayerId;\n    u8 startDelayTimer;\n    u16 mainState;\n    u16 helperState;\n    u16 excellentsInRow;\n    u16 excellentsInRowRecord;\n    bool32 gameOver;\n    u32 vineState;\n    u32 prevVineState;\n    int vineSpeed;\n    u32 vineSpeedAccel;\n    u32 rngSeed;\n    u32 nextVineSpeed;\n    int linkTimer;\n    u32 linkTimerLimit;\n    u16 vineStateTimer;\n    bool16 ignoreJumpInput;\n    u16 unused1;\n    u16 unused2; // Set to 0, never read\n    u16 timer;\n    u16 prizeItemId;\n    u16 prizeItemQuantity;\n    u16 playAgainComm;\n    u8 unused3; // Set to 0, never read\n    u8 playAgainState;\n    bool8 allowVineUpdates;\n    bool8 isLeader;\n    bool8 funcActive;\n    bool8 allPlayersReady;\n    u16 vineTimer;\n    u8 nextFuncId;\n    bool8 showBonus;\n    u16 vineSpeedDelay;\n    u8 vineBaseSpeedIdx;\n    u8 vineSpeedStage;\n    int numPlayersAtPeak;\n    bool32 initScoreUpdate;\n    bool32 updateScore;\n    bool32 unused4; // Set to TRUE, never read\n    bool32 giveBonus;\n    bool32 skipJumpUpdate;\n    bool32 atMaxSpeedStage;\n    struct PokemonJump_CommData comm;\n    bool8 atJumpPeak[MAX_RFU_PLAYERS];\n    bool8 atJumpPeak2[MAX_RFU_PLAYERS];\n    bool8 atJumpPeak3[MAX_RFU_PLAYERS];\n    u8 memberFuncIds[MAX_RFU_PLAYERS];\n    u16 playAgainStates[MAX_RFU_PLAYERS];\n    u16 jumpTimeStarts[MAX_RFU_PLAYERS];\n    struct PokemonJumpGfx jumpGfx;\n    struct PokemonJump_MonInfo monInfo[MAX_RFU_PLAYERS];\n    struct PokemonJump_Player players[MAX_RFU_PLAYERS];\n    struct PokemonJump_Player *player;\n};\n\nstatic void Task_StaticCountdown(u8 taskId);\nstatic void Task_StaticCountdown_Init(u8 taskId);\nstatic void Task_StaticCountdown_Free(u8 taskId);\nstatic void Task_StaticCountdown_Start(u8 taskId);\nstatic void Task_StaticCountdown_Run(u8 taskId);\nstatic void InitGame(struct PokemonJump *);\nstatic void ResetForNewGame(struct PokemonJump *);\nstatic void InitPlayerAndJumpTypes(void);\nstatic void ResetPlayersForNewGame(void);\nstatic s16 GetPokemonJumpSpeciesIdx(u16 species);\nstatic void InitJumpMonInfo(struct PokemonJump_MonInfo *monInfo, struct Pokemon *mon);\nstatic void CB2_PokemonJump(void);\nstatic void Task_StartPokemonJump(u8 taskId);\nstatic void Task_PokemonJump_Leader(u8 taskId);\nstatic void SendLinkData_Leader(void);\nstatic void Task_PokemonJump_Member(u8 taskId);\nstatic void SendLinkData_Member(void);\nstatic bool32 GameIntro_Leader(void);\nstatic bool32 WaitRound_Leader(void);\nstatic bool32 GameRound_Leader(void);\nstatic bool32 GameOver_Leader(void);\nstatic bool32 GameOver_Member(void);\nstatic bool32 AskPlayAgain_Leader(void);\nstatic bool32 AskPlayAgain_Member(void);\nstatic bool32 ResetGame_Leader(void);\nstatic bool32 ResetGame_Member(void);\nstatic bool32 ExitGame(void);\nstatic bool32 GivePrize_Leader(void);\nstatic bool32 GivePrize_Member(void);\nstatic bool32 SavePokeJump(void);\nstatic bool32 DoGameIntro(void);\nstatic bool32 HandleSwingRound(void);\nstatic bool32 DoVineHitEffect(void);\nstatic bool32 GameIntro_Member(void);\nstatic bool32 WaitRound_Member(void);\nstatic bool32 GameRound_Member(void);\nstatic bool32 TryGivePrize(void);\nstatic bool32 DoPlayAgainPrompt(void);\nstatic bool32 ClosePokeJumpLink(void);\nstatic bool32 CloseMessageAndResetScore(void);\nstatic void Task_CommunicateMonInfo(u8 taskId);\nstatic void SetTaskWithPokeJumpStruct(TaskFunc func, u8 taskPriority);\nstatic void InitVineState(void);\nstatic void ResetVineState(void);\nstatic void UpdateVineState(void);\nstatic int GetVineSpeed(void);\nstatic void UpdateVineSpeed(void);\nstatic int PokeJumpRandom(void);\nstatic void ResetVineAfterHit(void);\nstatic void ResetPlayersJumpStates(void);\nstatic void ResetPlayersMonState(void);\nstatic bool32 IsPlayersMonState(u16);\nstatic void SetMonStateJump(void);\nstatic void UpdateGame(void);\nstatic void TryUpdateVineSwing(void);\nstatic void DisallowVineUpdates(void);\nstatic void AllowVineUpdates(void);\nstatic void HandleMonState(void);\nstatic void UpdateJump(int);\nstatic void TryUpdateScore(void);\nstatic bool32 UpdateVineHitStates(void);\nstatic bool32 AllPlayersJumpedOrHit(void);\nstatic bool32 DidAllPlayersClearVine(void);\nstatic bool32 ShouldPlayAgain(void);\nstatic void AddJumpScore(int);\nstatic int GetPlayersAtJumpPeak(void);\nstatic bool32 AreLinkQueuesEmpty(void);\nstatic int GetNumPlayersForBonus(u8 *);\nstatic void ClearUnreadField(void);\nstatic int GetScoreBonus(int);\nstatic void TryUpdateExcellentsRecord(u16);\nstatic bool32 HasEnoughScoreForPrize(void);\nstatic u16 GetPrizeData(void);\nstatic void UnpackPrizeData(u16, u16 *, u16 *);\nstatic u16 GetPrizeItemId(void);\nstatic u16 GetPrizeQuantity(void);\nstatic u16 GetQuantityLimitedByBag(u16 item, u16 quantity);\nstatic void SetUpPokeJumpGfxFunc(void (*func)(void));\nstatic void Task_RunPokeJumpGfxFunc(u8 taskId);\nstatic void LoadPokeJumpGfx(void);\nstatic void PrintPlayerNamesNoHighlight(void);\nstatic void PrintPlayerNamesWithHighlight(void);\nstatic void ErasePlayerNames(void);\nstatic void Msg_WantToPlayAgain(void);\nstatic void Msg_SavingDontTurnOff(void);\nstatic void EraseMessage(void);\nstatic void Msg_SomeoneDroppedOut(void);\nstatic void Msg_CommunicationStandby(void);\nstatic void DoPokeJumpCountdown(void);\nstatic u32 AddMessageWindow(u32 left, u32 top, u32 width, u32 height);\nstatic void CreatePokeJumpYesNoMenu(u16 left, u16 top, u8 cursorPos);\nstatic void PrintScoreSuffixes(void);\nstatic void CreateJumpMonSprites(void);\nstatic void InitDigitPrinters(void);\nstatic void AddPlayerNameWindows(void);\nstatic void PrintPokeJumpPlayerNames(bool32);\nstatic void DrawPlayerNameWindows(void);\nstatic void ShowBonus(u8);\nstatic void Task_UpdateBonus(u8 taskId);\nstatic void InitPokeJumpGfx(struct PokemonJumpGfx *);\nstatic void SpriteCB_Star(struct Sprite *sprite);\nstatic void SpriteCB_MonHitShake(struct Sprite *sprite);\nstatic void SpriteCB_MonHitFlash(struct Sprite *sprite);\nstatic void SpriteCB_MonIntroBounce(struct Sprite *sprite);\nstatic void Task_ShowPokemonJumpRecords(u8 taskId);\nstatic void TruncateToFirstWordOnly(u8 *str);\nstatic void PrintRecordsText(u16 windowId);\nstatic void UpdateVineSwing(int id);\nstatic void StartPokeJumpGfx(struct PokemonJumpGfx *);\nstatic void FreeWindowsAndDigitObj(void);\nstatic void SetUpPokeJumpGfxFuncById(int);\nstatic bool32 IsPokeJumpGfxFuncFinished(void);\nstatic void SetUpResetVineGfx(void);\nstatic bool32 ResetVineGfx(void);\nstatic void PrintPrizeMessage(u16, u16);\nstatic void PrintPrizeFilledBagMessage(u16);\nstatic void PrintNoRoomForPrizeMessage(u16);\nstatic bool32 DoPrizeMessageAndFanfare(void);\nstatic void ClearMessageWindow(void);\nstatic void SetMonSpriteY(u32 , s16);\nstatic void StartMonHitShake(u8);\nstatic bool32 RemoveMessageWindow(void);\nstatic void PrintScore(int);\nstatic s8 HandlePlayAgainInput(void);\nstatic int DoSameJumpTimeBonus(u8);\nstatic void PrintJumpsInRow(u16);\nstatic void StartMonHitFlash(u8);\nstatic int IsMonHitShakeActive(int);\nstatic void StopMonHitFlash(void);\nstatic void ResetMonSpriteSubpriorities(void);\nstatic void StartMonIntroBounce(int);\nstatic int IsMonIntroBounceActive(void);\nstatic void SendPacket_MonInfo(struct PokemonJump_MonInfo *);\nstatic bool32 RecvPacket_MonInfo(int multiplayerId, struct PokemonJump_MonInfo *);\nstatic void SendPacket_LeaderState(struct PokemonJump_Player *, struct PokemonJump_CommData *);\nstatic bool32 RecvPacket_LeaderState(struct PokemonJump_Player *, struct PokemonJump_CommData *);\nstatic void SendPacket_MemberState(struct PokemonJump_Player *, u8, u16);\nstatic bool32 RecvPacket_MemberStateToLeader(struct PokemonJump_Player *, int, u8 *, u16 *);\nstatic bool32 RecvPacket_MemberStateToMember(struct PokemonJump_Player *, int);\nstatic bool32 TryUpdateRecords(u32, u16, u16);\nstatic void IncrementGamesWithMaxPlayers(void);\nstatic void LoadSpriteSheetsAndPalettes(struct PokemonJumpGfx *);\nstatic void CreateVineSprites(struct PokemonJumpGfx *);\nstatic void StartPokeJumpCountdown(struct PokemonJumpGfx *);\nstatic bool32 IsPokeJumpCountdownRunning(void);\nstatic void UpdateVineAnim(struct PokemonJumpGfx *, int);\nstatic void DoStarAnim(struct PokemonJumpGfx *, int);\nstatic void CreateJumpMonSprite(struct PokemonJumpGfx *, struct PokemonJump_MonInfo *,s16, s16, u8);\nstatic void CreateStarSprite(struct PokemonJumpGfx *,s16, s16, u8);\nstatic void Gfx_StartMonHitShake(struct PokemonJumpGfx *, int);\nstatic void Gfx_StartMonHitFlash(struct PokemonJumpGfx *, int);\nstatic bool32 Gfx_IsMonHitShakeActive(struct PokemonJumpGfx *, int);\nstatic void Gfx_StopMonHitFlash(struct PokemonJumpGfx *);\nstatic void Gfx_ResetMonSpriteSubpriorities(struct PokemonJumpGfx *);\nstatic void Gfx_StartMonIntroBounce(struct PokemonJumpGfx *, int);\nstatic bool32 Gfx_IsMonIntroBounceActive(struct PokemonJumpGfx *);\n\nEWRAM_DATA static struct PokemonJump *sPokemonJump = NULL;\nEWRAM_DATA static struct PokemonJumpGfx *sPokemonJumpGfx = NULL;\n\n// Unused static version of the wireless minigame countdown\n\n#define TAG_STATIC_COUNTDOWN 0x2000\n\nenum {\n    STATE_IDLE = 1,\n    STATE_START,\n    STATE_RUN,\n    STATE_END,\n};\n\nenum {\n    FUNC_INIT,\n    FUNC_FREE,\n    FUNC_START,\n    FUNC_RUN,\n};\n\nenum {\n    ANIM_THREE,\n    ANIM_TWO,\n    ANIM_ONE,\n    ANIM_START_LEFT,\n    ANIM_START_MID,\n    ANIM_START_RIGHT,\n};\n\nstatic const u16 s321Start_Static_Pal[] = INCBIN_U16(\"graphics/link/321start.gbapal\");\nstatic const u32 s321Start_Static_Gfx[] = INCBIN_U32(\"graphics/link/321start.4bpp.lz\");\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_321Start_Static[] = {\n    {s321Start_Static_Gfx, 0xC00, TAG_STATIC_COUNTDOWN},\n    {}\n};\n\nstatic const struct SpritePalette sSpritePalette_321Start_Static[] = {\n    {s321Start_Static_Pal, TAG_STATIC_COUNTDOWN},\n    {}\n};\n\nstatic const union AnimCmd sAnim_StaticCountdown_Three[] = {\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_StaticCountdown_Two[] = {\n    ANIMCMD_FRAME(16, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_StaticCountdown_One[] = {\n    ANIMCMD_FRAME(32, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_StaticCountdown_StartLeft[] = {\n    ANIMCMD_FRAME(64, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_StaticCountdown_StartMid[] = {\n    ANIMCMD_FRAME(48, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_StaticCountdown_StartRight[] = {\n    ANIMCMD_FRAME(80, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_StaticCountdown[] = {\n    [ANIM_THREE]       = sAnim_StaticCountdown_Three,\n    [ANIM_TWO]         = sAnim_StaticCountdown_Two,\n    [ANIM_ONE]         = sAnim_StaticCountdown_One,\n    [ANIM_START_LEFT]  = sAnim_StaticCountdown_StartLeft,\n    [ANIM_START_MID]   = sAnim_StaticCountdown_StartMid,\n    [ANIM_START_RIGHT] = sAnim_StaticCountdown_StartRight\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_StaticCountdown[] = {\n    {\n        .tileTag = TAG_STATIC_COUNTDOWN,\n        .paletteTag = TAG_STATIC_COUNTDOWN,\n        .oam = &gOamData_AffineOff_ObjNormal_32x32,\n        .anims = sAnims_StaticCountdown,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    },\n};\n\nstatic const TaskFunc sStaticCountdownFuncs[][4] =\n{\n    {\n        [FUNC_INIT]  = Task_StaticCountdown_Init,\n        [FUNC_FREE]  = Task_StaticCountdown_Free,\n        [FUNC_START] = Task_StaticCountdown_Start,\n        [FUNC_RUN]   = Task_StaticCountdown_Run\n    },\n};\n\n#define tState            data[0]\n#define tFuncSetId        data[1] // These 4 data elements are indexes into\n#define tSpriteTemplateId data[2] // arrays that only have 1 element with\n#define tSpriteSheetId    data[3] // data. As such their only legal value\n#define tSpritePalId      data[4] // is 0. Unclear why they were used.\n#define tInterval         data[5]\n#define tPriority         data[6]\n#define tSubpriority      data[7]\n#define tNumSprites       data[8]\n#define tX                data[9]\n#define tY                data[10]\n#define tPrevTime         data[10] // Re-used\n#define tTimer            data[11]\n#define tLinkTimer        data[12]\n// 13-15 hold sprite ids\n// tSpriteIds(0) is used for the number sprites, and the leftmost part of 'Start'\n// tSpriteIds(1) is used for the middle part of 'Start'\n// tSpriteIds(2) is used for for the rightmost part of 'Start'\n#define tSpriteIds(i)     data[13 + i]\n\n#define sInterval       data[1] // Never read\n#define sAnimNum        data[2]\n#define sTaskId         data[3]\n#define sId             data[4] // Never read\n#define sNumberSpriteId data[5] // Never read\n\n// Unused\nstatic u8 CreateStaticCountdownTask(u8 funcSetId, u8 taskPriority)\n{\n    u8 taskId = CreateTask(Task_StaticCountdown, taskPriority);\n    struct Task *task = &gTasks[taskId];\n\n    task->tState = STATE_IDLE;\n    task->tFuncSetId = funcSetId;\n    sStaticCountdownFuncs[funcSetId][FUNC_INIT](taskId);\n    return taskId;\n}\n\n// Unused\nstatic bool32 StartStaticCountdown(void)\n{\n    u8 taskId = FindTaskIdByFunc(Task_StaticCountdown);\n    if (taskId == TASK_NONE)\n        return FALSE;\n\n    gTasks[taskId].tState = STATE_START;\n    return TRUE;\n}\n\n// Unused\nstatic bool32 IsStaticCountdownRunning(void)\n{\n    return FuncIsActiveTask(Task_StaticCountdown);\n}\n\nstatic void Task_StaticCountdown(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    switch (tState)\n    {\n    // STATE_IDLE does nothing; wait until started\n    case STATE_START:\n        sStaticCountdownFuncs[tFuncSetId][FUNC_START](taskId);\n        tState = STATE_RUN;\n        break;\n    case STATE_RUN:\n        sStaticCountdownFuncs[tFuncSetId][FUNC_RUN](taskId);\n        break;\n    case STATE_END:\n        sStaticCountdownFuncs[tFuncSetId][FUNC_FREE](taskId);\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void StaticCountdown_CreateSprites(u8 taskId, s16 *data)\n{\n    u8 i;\n    struct Sprite *sprite;\n\n    LoadCompressedSpriteSheet(&sSpriteSheet_321Start_Static[tSpriteSheetId]);\n    LoadSpritePalette(&sSpritePalette_321Start_Static[tSpritePalId]);\n    for (i = 0; i < tNumSprites; i++)\n        tSpriteIds(i) = CreateSprite(&sSpriteTemplate_StaticCountdown[tSpriteTemplateId], tX, tY, tSubpriority);\n    for (i = 0; i < tNumSprites; i++)\n    {\n        sprite = &gSprites[tSpriteIds(i)];\n        sprite->oam.priority = tPriority;\n        sprite->invisible = TRUE;\n        sprite->sInterval = tInterval;\n        sprite->sTaskId = taskId;\n        sprite->sId = i;\n        sprite->sNumberSpriteId = tSpriteIds(0);\n    }\n}\n\nstatic void Task_StaticCountdown_Init(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    tSpriteTemplateId = 0;\n    tSpriteSheetId = 0;\n    tSpritePalId = 0;\n    tInterval = 60;\n    tPriority = 0;\n    tSubpriority = 0;\n    tNumSprites = 3;\n    tX = 120;\n    tY = 88;\n    StaticCountdown_CreateSprites(taskId, data);\n\n    StartSpriteAnim(&gSprites[tSpriteIds(1)], ANIM_START_MID);\n    gSprites[tSpriteIds(1)].x2 = -32;\n\n    StartSpriteAnim(&gSprites[tSpriteIds(2)], ANIM_START_RIGHT);\n    gSprites[tSpriteIds(2)].x2 = 32;\n}\n\nstatic void Task_StaticCountdown_Free(u8 taskId)\n{\n    u8 i = 0;\n    s16 *data = gTasks[taskId].data;\n\n    for (i = 0; i < tNumSprites; i++)\n        DestroySprite(&gSprites[tSpriteIds(i)]);\n    FreeSpriteTilesByTag(sSpriteSheet_321Start_Static[tSpriteSheetId].tag);\n    FreeSpritePaletteByTag(sSpritePalette_321Start_Static[tSpritePalId].tag);\n}\n\nstatic void SpriteCB_StaticCountdown(struct Sprite *sprite)\n{\n    s16 *data = gTasks[sprite->sTaskId].data;\n\n    if (tTimer % tInterval != 0)\n        return;\n    if (tTimer == tPrevTime)\n        return;\n\n    tPrevTime = tTimer;\n    switch (sprite->sAnimNum)\n    {\n    case ANIM_THREE:\n        sprite->invisible = FALSE;\n    case ANIM_TWO:\n    case ANIM_ONE:\n        // Set sprite to a number\n        PlaySE(SE_BALL_BOUNCE_1);\n        StartSpriteAnim(sprite, sprite->sAnimNum);\n        break;\n    case ANIM_START_LEFT:\n        // Set sprite to 'Start'\n        PlaySE(SE_PIN);\n        StartSpriteAnim(sprite, sprite->sAnimNum);\n        gSprites[tSpriteIds(1)].invisible = FALSE;\n        gSprites[tSpriteIds(2)].invisible = FALSE;\n        break;\n    case ANIM_START_LEFT + 1: // End\n        // Hide countdown\n        sprite->invisible = TRUE;\n        gSprites[tSpriteIds(1)].invisible = TRUE;\n        gSprites[tSpriteIds(2)].invisible = TRUE;\n        tState = STATE_END;\n        return;\n    }\n    sprite->sAnimNum++;\n}\n\nstatic void Task_StaticCountdown_Start(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    PlaySE(SE_BALL_BOUNCE_1);\n    gSprites[tSpriteIds(0)].callback = SpriteCB_StaticCountdown;\n    gSprites[tSpriteIds(0)].invisible = FALSE;\n    gTasks[taskId].tState = STATE_RUN;\n}\n\n// Increment timer for progressing the countdown.\n// If the player is the link leader, increment a\n// separate timer and send it to group members for\n// them to read and use.\nstatic void Task_StaticCountdown_Run(u8 taskId)\n{\n    u16 packet[RFU_PACKET_SIZE];\n    s16 *data = gTasks[taskId].data;\n\n    if (gReceivedRemoteLinkPlayers)\n    {\n        // Read link timer\n        if (gRecvCmds[0][1] == LINKCMD_COUNTDOWN)\n            tTimer = gRecvCmds[0][2];\n\n        if (GetMultiplayerId() == 0)\n        {\n            // Player is link leader.\n            // Send timer to group members\n            tLinkTimer++;\n            memset(packet, 0, sizeof(packet));\n            packet[0] = LINKCMD_COUNTDOWN;\n            packet[1] = tLinkTimer;\n            Rfu_SendPacket(packet);\n        }\n    }\n    else\n    {\n        // Local, just increment own timer\n        tTimer++;\n    }\n}\n\n#undef tState\n#undef tFuncSetId\n#undef tSpriteTemplateId\n#undef tSpriteSheetId\n#undef tSpritePalId\n#undef tInterval\n#undef tPriority\n#undef tSubpriority\n#undef tNumSprites\n#undef tX\n#undef tY\n#undef tPrevTime\n#undef tTimer\n#undef tLinkTimer\n#undef tSpriteIds\n#undef sInterval\n#undef sAnimNum\n#undef sTaskId\n#undef sId\n#undef sNumberSpriteId\n\n/*\n    According to the clerk, the Pokémon allowed in\n    Pokémon Jump are all <= 28 inches, and do not\n    only swim, burrow, or fly.\n*/\nstatic const struct PokemonJumpMons\n{\n    u16 species;\n    u16 jumpType;\n} sPokeJumpMons[] =\n{\n    { .species = SPECIES_BULBASAUR,  .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_CHARMANDER, .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_SQUIRTLE,   .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_CATERPIE,   .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_METAPOD,    .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_WEEDLE,     .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_KAKUNA,     .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_RATTATA,    .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_RATICATE,   .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_PIKACHU,    .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_SANDSHREW,  .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_NIDORAN_F,  .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_NIDORAN_M,  .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_CLEFAIRY,   .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_VULPIX,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_JIGGLYPUFF, .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_ODDISH,     .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_PARAS,      .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_MEOWTH,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_PSYDUCK,    .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_MANKEY,     .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_GROWLITHE,  .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_POLIWAG,    .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_BELLSPROUT, .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_SHELLDER,   .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_KRABBY,     .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_EXEGGCUTE,  .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_CUBONE,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_DITTO,      .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_EEVEE,      .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_OMANYTE,    .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_KABUTO,     .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_CHIKORITA,  .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_CYNDAQUIL,  .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_TOTODILE,   .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_SPINARAK,   .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_PICHU,      .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_CLEFFA,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_IGGLYBUFF,  .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_TOGEPI,     .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_MAREEP,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_BELLOSSOM,  .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_MARILL,     .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_SUNKERN,    .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_WOOPER,     .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_PINECO,     .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_SNUBBULL,   .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_SHUCKLE,    .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_TEDDIURSA,  .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_SLUGMA,     .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_SWINUB,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_HOUNDOUR,   .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_PHANPY,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_PORYGON2,   .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_TYROGUE,    .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_SMOOCHUM,   .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_ELEKID,     .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_MAGBY,      .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_LARVITAR,   .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_TREECKO,    .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_TORCHIC,    .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_MUDKIP,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_MARSHTOMP,  .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_POOCHYENA,  .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_ZIGZAGOON,  .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_LINOONE,    .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_WURMPLE,    .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_SILCOON,    .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_CASCOON,    .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_LOTAD,      .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_SEEDOT,     .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_RALTS,      .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_KIRLIA,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_SURSKIT,    .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_SHROOMISH,  .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_NINCADA,    .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_WHISMUR,    .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_AZURILL,    .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_SKITTY,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_SABLEYE,    .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_MAWILE,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_ARON,       .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_MEDITITE,   .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_ELECTRIKE,  .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_PLUSLE,     .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_MINUN,      .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_VOLBEAT,    .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_ILLUMISE,   .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_ROSELIA,    .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_GULPIN,     .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_NUMEL,      .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_TORKOAL,    .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_SPOINK,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_TRAPINCH,   .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_CACNEA,     .jumpType = JUMP_TYPE_SLOW },\n    { .species = SPECIES_ANORITH,    .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_WYNAUT,     .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_SNORUNT,    .jumpType = JUMP_TYPE_NORMAL },\n    { .species = SPECIES_CLAMPERL,   .jumpType = JUMP_TYPE_FAST },\n    { .species = SPECIES_BAGON,      .jumpType = JUMP_TYPE_FAST },\n};\n\nvoid StartPokemonJump(u16 partyId, MainCallback exitCallback)\n{\n    u8 taskId;\n\n    if (gReceivedRemoteLinkPlayers)\n    {\n        sPokemonJump = Alloc(sizeof(*sPokemonJump));\n        if (sPokemonJump)\n        {\n            ResetTasks();\n            taskId = CreateTask(Task_StartPokemonJump, 1);\n            sPokemonJump->mainState = 0;\n            sPokemonJump->exitCallback = exitCallback;\n            sPokemonJump->taskId = taskId;\n            sPokemonJump->multiplayerId = GetMultiplayerId();\n            InitJumpMonInfo(&sPokemonJump->monInfo[sPokemonJump->multiplayerId], &gPlayerParty[partyId]);\n            InitGame(sPokemonJump);\n            SetWordTaskArg(taskId, 2, (uintptr_t)sPokemonJump);\n            SetMainCallback2(CB2_PokemonJump);\n            return;\n        }\n    }\n\n    // Exit - Players not connected, or alloc failed\n    SetMainCallback2(exitCallback);\n}\n\nstatic void FreePokemonJump(void)\n{\n    FreeWindowsAndDigitObj();\n    Free(sPokemonJump);\n}\n\nstatic void InitGame(struct PokemonJump *jump)\n{\n    jump->numPlayers = GetLinkPlayerCount();\n    jump->comm.funcId = FUNC_RESET_GAME;\n    jump->comm.data = 0;\n    InitPlayerAndJumpTypes();\n    ResetForNewGame(jump);\n    if (jump->numPlayers == MAX_RFU_PLAYERS)\n        IncrementGamesWithMaxPlayers();\n}\n\nstatic void ResetForNewGame(struct PokemonJump *jump)\n{\n    int i;\n\n    jump->vineState = VINE_UPSWING_LOWER;\n    jump->prevVineState = VINE_UPSWING_LOWER;\n    jump->vineTimer = 0;\n    jump->vineSpeed = 0;\n    jump->updateScore = FALSE;\n    jump->isLeader = GetMultiplayerId() == 0;\n    jump->mainState = 0;\n    jump->helperState = 0;\n    jump->excellentsInRow = 0;\n    jump->excellentsInRowRecord = 0;\n    jump->initScoreUpdate = FALSE;\n    jump->unused2 = 0;\n    jump->unused3 = 0;\n    jump->numPlayersAtPeak = 0;\n    jump->allowVineUpdates = FALSE;\n    jump->allPlayersReady = FALSE;\n    jump->funcActive = TRUE;\n    jump->comm.jumpScore = 0;\n    jump->comm.receivedBonusFlags = 0;\n    jump->comm.jumpsInRow = 0;\n    jump->unused4 = TRUE;\n    jump->showBonus = FALSE;\n    jump->skipJumpUpdate = FALSE;\n    jump->giveBonus = FALSE;\n    jump->linkTimer = 0;\n    jump->linkTimerLimit = 0;\n    ResetPlayersForNewGame();\n    ResetPlayersJumpStates();\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        jump->atJumpPeak[i] = FALSE;\n        jump->jumpTimeStarts[i] = 0;\n    }\n}\n\nstatic void InitPlayerAndJumpTypes(void)\n{\n    int i, index;\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        index = GetPokemonJumpSpeciesIdx(sPokemonJump->monInfo[i].species);\n        sPokemonJump->players[i].monJumpType = sPokeJumpMons[index].jumpType;\n    }\n\n    sPokemonJump->player = &sPokemonJump->players[sPokemonJump->multiplayerId];\n}\n\nstatic void ResetPlayersForNewGame(void)\n{\n    int i;\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        sPokemonJump->players[i].jumpTimeStart = 0;\n        sPokemonJump->players[i].monState = MONSTATE_NORMAL;\n        sPokemonJump->players[i].prevMonState = MONSTATE_NORMAL;\n        sPokemonJump->players[i].jumpOffset = 0;\n        sPokemonJump->players[i].jumpOffsetIdx = INT_MAX;\n        sPokemonJump->players[i].jumpState = JUMPSTATE_NONE;\n        sPokemonJump->memberFuncIds[i] = FUNC_NONE;\n    }\n}\n\nstatic s16 GetPokemonJumpSpeciesIdx(u16 species)\n{\n    u32 i;\n    for (i = 0; i < ARRAY_COUNT(sPokeJumpMons); i++)\n    {\n        if (sPokeJumpMons[i].species == species)\n            return i;\n    }\n\n    return -1; // species isnt allowed\n}\n\nstatic void InitJumpMonInfo(struct PokemonJump_MonInfo *monInfo, struct Pokemon *mon)\n{\n    monInfo->species = GetMonData(mon, MON_DATA_SPECIES);\n    monInfo->otId = GetMonData(mon, MON_DATA_OT_ID);\n    monInfo->personality = GetMonData(mon, MON_DATA_PERSONALITY);\n}\n\nstatic void VBlankCB_PokemonJump(void)\n{\n    TransferPlttBuffer();\n    LoadOam();\n    ProcessSpriteCopyRequests();\n}\n\nstatic void CB2_PokemonJump(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void SetPokeJumpTask(TaskFunc func)\n{\n    sPokemonJump->taskId = CreateTask(func, 1);\n    sPokemonJump->mainState = 0;\n}\n\nstatic void Task_StartPokemonJump(u8 taskId)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        SetTaskWithPokeJumpStruct(Task_CommunicateMonInfo, 5);\n        FadeOutMapMusic(4);\n        sPokemonJump->mainState++;\n        break;\n    case 1:\n        if (!FuncIsActiveTask(Task_CommunicateMonInfo))\n        {\n            StartPokeJumpGfx(&sPokemonJump->jumpGfx);\n            LoadWirelessStatusIndicatorSpriteGfx();\n            CreateWirelessStatusIndicatorSprite(0, 0);\n            sPokemonJump->mainState++;\n        }\n        break;\n    case 2:\n        if (!IsPokeJumpGfxFuncFinished() && IsNotWaitingForBGMStop() == TRUE)\n        {\n            FadeOutAndPlayNewMapMusic(MUS_POKE_JUMP, 8);\n            sPokemonJump->mainState++;\n        }\n        break;\n    case 3:\n        if (IsLinkTaskFinished())\n        {\n            BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n            SetVBlankCallback(VBlankCB_PokemonJump);\n            sPokemonJump->mainState++;\n        }\n        break;\n    case 4:\n        UpdatePaletteFade();\n        if (!gPaletteFade.active)\n        {\n            sPokemonJump->startDelayTimer = 0;\n            sPokemonJump->mainState++;\n        }\n        break;\n    case 5:\n        sPokemonJump->startDelayTimer++;\n        if (sPokemonJump->startDelayTimer >= 20)\n        {\n            if (sPokemonJump->isLeader)\n                SetPokeJumpTask(Task_PokemonJump_Leader);\n            else\n                SetPokeJumpTask(Task_PokemonJump_Member);\n\n            InitVineState();\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void SetLinkTimeInterval(int intervalId)\n{\n    if (intervalId == LINK_INTERVAL_NONE)\n    {\n        // Link data is sent when timer reaches 0.\n        // Set timer to 1 and set limit to special\n        // 'stopped' value so timer won't change        \n        sPokemonJump->linkTimerLimit = LINK_TIMER_STOPPED;\n        sPokemonJump->linkTimer = 1;\n    }\n    else\n    {\n        sPokemonJump->linkTimerLimit = (1 << (intervalId - 1)) - 1;\n        sPokemonJump->linkTimer = 0;\n    }\n}\n\nstatic void SetFunc_Leader(u8 funcId)\n{\n    int i;\n\n    sPokemonJump->comm.funcId = funcId;\n    sPokemonJump->mainState = 0;\n    sPokemonJump->helperState = 0;\n    sPokemonJump->funcActive = TRUE;\n    sPokemonJump->allPlayersReady = FALSE;\n    for (i = 1; i < sPokemonJump->numPlayers; i++)\n        sPokemonJump->players[i].funcFinished = FALSE;\n}\n\nstatic void RecvLinkData_Leader(void)\n{\n    int i;\n    int numReady;\n    u16 monState;\n    u8 funcId;\n    u16 playAgainState;\n\n    for (i = 1, numReady = 0; i < sPokemonJump->numPlayers; i++)\n    {\n        monState = sPokemonJump->players[i].monState;\n        if (RecvPacket_MemberStateToLeader(&sPokemonJump->players[i], i, &funcId, &playAgainState))\n        {\n            sPokemonJump->playAgainStates[i] = playAgainState;\n            sPokemonJump->memberFuncIds[i] = funcId;\n            sPokemonJump->players[i].prevMonState = monState;\n        }\n\n        if (sPokemonJump->players[i].funcFinished && sPokemonJump->memberFuncIds[i] == sPokemonJump->comm.funcId)\n            numReady++;\n    }\n\n    if (numReady == sPokemonJump->numPlayers - 1)\n        sPokemonJump->allPlayersReady = TRUE;\n}\n\nstatic bool32 (* const sPokeJumpLeaderFuncs[])(void) =\n{\n    [FUNC_GAME_INTRO]     = GameIntro_Leader,\n    [FUNC_WAIT_ROUND]     = WaitRound_Leader,\n    [FUNC_GAME_ROUND]     = GameRound_Leader,\n    [FUNC_GAME_OVER]      = GameOver_Leader,\n    [FUNC_ASK_PLAY_AGAIN] = AskPlayAgain_Leader,\n    [FUNC_RESET_GAME]     = ResetGame_Leader,\n    [FUNC_EXIT]           = ExitGame,\n    [FUNC_GIVE_PRIZE]     = GivePrize_Leader,\n    [FUNC_SAVE]           = SavePokeJump,\n};\n\nstatic void Task_PokemonJump_Leader(u8 taskId)\n{\n    RecvLinkData_Leader();\n    TryUpdateScore();\n    if (!sPokemonJump->funcActive && sPokemonJump->allPlayersReady)\n    {\n        SetFunc_Leader(sPokemonJump->nextFuncId);\n        SetLinkTimeInterval(LINK_INTERVAL_SHORT);\n    }\n\n    if (sPokemonJump->funcActive == TRUE)\n    {\n        if (!sPokeJumpLeaderFuncs[sPokemonJump->comm.funcId]())\n        {\n            sPokemonJump->funcActive = FALSE;\n            sPokemonJump->players[sPokemonJump->multiplayerId].funcFinished = TRUE;\n        }\n    }\n\n    UpdateGame();\n    SendLinkData_Leader();\n}\n\nstatic void SendLinkData_Leader(void)\n{\n    if (!sPokemonJump->linkTimer)\n        SendPacket_LeaderState(sPokemonJump->players, &sPokemonJump->comm);\n\n    if (sPokemonJump->linkTimerLimit != LINK_TIMER_STOPPED)\n    {\n        sPokemonJump->linkTimer++;\n        sPokemonJump->linkTimer &= sPokemonJump->linkTimerLimit;\n    }\n}\n\nstatic void SetFunc_Member(u8 funcId)\n{\n    sPokemonJump->comm.funcId = funcId;\n    sPokemonJump->mainState = 0;\n    sPokemonJump->helperState = 0;\n    sPokemonJump->funcActive = TRUE;\n    sPokemonJump->players[sPokemonJump->multiplayerId].funcFinished = FALSE;\n}\n\nstatic void RecvLinkData_Member(void)\n{\n    int i;\n    u16 monState;\n    struct PokemonJump_CommData leaderData;\n\n    monState = sPokemonJump->players[0].monState;\n    if (RecvPacket_LeaderState(sPokemonJump->players, &leaderData))\n    {\n        if (sPokemonJump->players[sPokemonJump->multiplayerId].funcFinished == TRUE\n         && leaderData.funcId != sPokemonJump->comm.funcId)\n        {\n            SetFunc_Member(leaderData.funcId);\n        }\n\n        if (sPokemonJump->comm.jumpScore != leaderData.jumpScore)\n        {\n            sPokemonJump->comm.jumpScore = leaderData.jumpScore;\n            sPokemonJump->updateScore = TRUE;\n            sPokemonJump->comm.receivedBonusFlags = leaderData.receivedBonusFlags;\n            if (sPokemonJump->comm.receivedBonusFlags)\n                sPokemonJump->showBonus = TRUE;\n            else\n                sPokemonJump->showBonus = FALSE;\n        }\n\n        sPokemonJump->comm.data = leaderData.data;\n        sPokemonJump->comm.jumpsInRow = leaderData.jumpsInRow;\n        sPokemonJump->players[0].prevMonState = monState;\n    }\n\n    for (i = 1; i < sPokemonJump->numPlayers; i++)\n    {\n        if (i != sPokemonJump->multiplayerId)\n        {\n            monState = sPokemonJump->players[i].monState;\n            if (RecvPacket_MemberStateToMember(&sPokemonJump->players[i], i))\n                sPokemonJump->players[i].prevMonState = monState;\n        }\n    }\n}\n\nstatic bool32 (* const sPokeJumpMemberFuncs[])(void) =\n{\n    [FUNC_GAME_INTRO]     = GameIntro_Member,\n    [FUNC_WAIT_ROUND]     = WaitRound_Member,\n    [FUNC_GAME_ROUND]     = GameRound_Member,\n    [FUNC_GAME_OVER]      = GameOver_Member,\n    [FUNC_ASK_PLAY_AGAIN] = AskPlayAgain_Member,\n    [FUNC_RESET_GAME]     = ResetGame_Member,\n    [FUNC_EXIT]           = ExitGame,\n    [FUNC_GIVE_PRIZE]     = GivePrize_Member,\n    [FUNC_SAVE]           = SavePokeJump,\n};\n\nstatic void Task_PokemonJump_Member(u8 taskId)\n{\n    RecvLinkData_Member();\n    if (sPokemonJump->funcActive)\n    {\n        if (!sPokeJumpMemberFuncs[sPokemonJump->comm.funcId]())\n        {\n            sPokemonJump->funcActive = FALSE;\n            sPokemonJump->players[sPokemonJump->multiplayerId].funcFinished = TRUE;\n            SetLinkTimeInterval(LINK_INTERVAL_SHORT);\n        }\n    }\n\n    UpdateGame();\n    SendLinkData_Member();\n}\n\nstatic void SendLinkData_Member(void)\n{\n    if (!sPokemonJump->linkTimer)\n        SendPacket_MemberState(&sPokemonJump->players[sPokemonJump->multiplayerId], sPokemonJump->comm.funcId, sPokemonJump->playAgainComm);\n\n    if (sPokemonJump->linkTimerLimit != LINK_TIMER_STOPPED)\n    {\n        sPokemonJump->linkTimer++;\n        sPokemonJump->linkTimer &= sPokemonJump->linkTimerLimit;\n    }\n}\n\nstatic bool32 GameIntro_Leader(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        SetLinkTimeInterval(LINK_INTERVAL_SHORT);\n        sPokemonJump->mainState++;\n        // fall through\n    case 1:\n        if (!DoGameIntro())\n        {\n            sPokemonJump->comm.data = sPokemonJump->vineTimer;\n            sPokemonJump->nextFuncId = FUNC_WAIT_ROUND;\n            return FALSE;\n        }\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 GameIntro_Member(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        SetLinkTimeInterval(LINK_INTERVAL_NONE);\n        sPokemonJump->rngSeed = sPokemonJump->comm.data;\n        sPokemonJump->mainState++;\n        // fall through\n    case 1:\n        return DoGameIntro();\n    }\n\n    return TRUE;\n}\n\nstatic bool32 WaitRound_Leader(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        ResetPlayersJumpStates();\n        SetLinkTimeInterval(LINK_INTERVAL_LONG);\n        sPokemonJump->mainState++;\n        break;\n    case 1:\n        if (sPokemonJump->allPlayersReady)\n        {\n            sPokemonJump->nextFuncId = FUNC_GAME_ROUND;\n            return FALSE;\n        }\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 WaitRound_Member(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        ResetPlayersJumpStates();\n        SetLinkTimeInterval(LINK_INTERVAL_NONE);\n        sPokemonJump->vineTimer = sPokemonJump->comm.data;\n        sPokemonJump->mainState++;\n        // fall through\n    case 1:\n        if (AreLinkQueuesEmpty())\n            return FALSE;\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 GameRound_Leader(void)\n{\n    if (!HandleSwingRound())\n    {\n        sPokemonJump->comm.data = sPokemonJump->vineTimer;\n        sPokemonJump->nextFuncId = FUNC_WAIT_ROUND;\n    }\n    else if (UpdateVineHitStates())\n    {\n        return TRUE;\n    }\n    else\n    {\n        // Someone hit the vine\n        ResetVineAfterHit();\n        sPokemonJump->nextFuncId = FUNC_GAME_OVER;\n    }\n\n    return FALSE;\n}\n\nstatic bool32 GameRound_Member(void)\n{\n    if (!HandleSwingRound())\n        ;\n    else if (UpdateVineHitStates())\n        return TRUE;\n    else // Someone hit the vine\n        ResetVineAfterHit();\n\n    return FALSE;\n}\n\nstatic bool32 GameOver_Leader(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        UpdateVineHitStates();\n        if (AllPlayersJumpedOrHit())\n            sPokemonJump->mainState++;\n        break;\n    case 1:\n        if (!DoVineHitEffect())\n        {\n            if (HasEnoughScoreForPrize())\n            {\n                sPokemonJump->comm.data = GetPrizeData();\n                sPokemonJump->nextFuncId = FUNC_GIVE_PRIZE;\n            }\n            else if (sPokemonJump->comm.jumpsInRow >= 200)\n            {\n                sPokemonJump->comm.data = sPokemonJump->excellentsInRowRecord;\n                sPokemonJump->nextFuncId = FUNC_SAVE;\n            }\n            else\n            {\n                sPokemonJump->comm.data = sPokemonJump->excellentsInRowRecord;\n                sPokemonJump->nextFuncId = FUNC_ASK_PLAY_AGAIN;\n            }\n\n            sPokemonJump->mainState++;\n            return FALSE;\n        }\n        break;\n    case 2:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 GameOver_Member(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        if (!UpdateVineHitStates())\n            ResetVineAfterHit();\n        if (AllPlayersJumpedOrHit())\n            sPokemonJump->mainState++;\n        break;\n    case 1:\n        if (!DoVineHitEffect())\n        {\n            sPokemonJump->mainState++;\n            return FALSE;\n        }\n        break;\n    case 2:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 AskPlayAgain_Leader(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        SetLinkTimeInterval(LINK_INTERVAL_MEDIUM);\n        sPokemonJump->mainState++;\n        // fall through\n    case 1:\n        if (!DoPlayAgainPrompt())\n        {\n            TryUpdateRecords(sPokemonJump->comm.jumpScore, sPokemonJump->comm.jumpsInRow, sPokemonJump->comm.data);\n            sPokemonJump->mainState++;\n        }\n        break;\n    case 2:\n        if (sPokemonJump->allPlayersReady)\n        {\n            if (ShouldPlayAgain())\n                sPokemonJump->nextFuncId = FUNC_RESET_GAME;\n            else\n                sPokemonJump->nextFuncId = FUNC_EXIT;\n\n            sPokemonJump->mainState++;\n            return FALSE;\n        }\n        break;\n    case 3:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 AskPlayAgain_Member(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        SetLinkTimeInterval(LINK_INTERVAL_NONE);\n        sPokemonJump->mainState++;\n        // fall through\n    case 1:\n        if (!DoPlayAgainPrompt())\n        {\n            TryUpdateRecords(sPokemonJump->comm.jumpScore, sPokemonJump->comm.jumpsInRow, sPokemonJump->comm.data);\n            sPokemonJump->playAgainComm = sPokemonJump->playAgainState;\n            return FALSE;\n        }\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 ResetGame_Leader(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        if (!CloseMessageAndResetScore())\n            sPokemonJump->mainState++;\n        break;\n    case 1:\n        if (sPokemonJump->allPlayersReady)\n        {\n            ResetForNewGame(sPokemonJump);\n            sPokemonJump->rngSeed = Random();\n            sPokemonJump->comm.data = sPokemonJump->rngSeed;\n            sPokemonJump->nextFuncId = FUNC_GAME_INTRO;\n            return FALSE;\n        }\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 ResetGame_Member(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        if (!CloseMessageAndResetScore())\n        {\n            ResetForNewGame(sPokemonJump);\n            sPokemonJump->mainState++;\n            return FALSE;\n        }\n        break;\n    case 1:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 ExitGame(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        sPokemonJump->mainState = 1;\n        break;\n    case 1:\n        SetLinkTimeInterval(LINK_INTERVAL_NONE);\n        sPokemonJump->mainState++;\n        break;\n    case 2:\n        if (!ClosePokeJumpLink())\n        {\n            SetMainCallback2(sPokemonJump->exitCallback);\n            FreePokemonJump();\n        }\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 GivePrize_Leader(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        SetLinkTimeInterval(LINK_INTERVAL_MEDIUM);\n        sPokemonJump->mainState++;\n        break;\n    case 1:\n        if (!TryGivePrize())\n        {\n            sPokemonJump->comm.data = sPokemonJump->excellentsInRowRecord;\n            sPokemonJump->nextFuncId = FUNC_SAVE;\n            return FALSE;\n        }\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 GivePrize_Member(void)\n{\n    SetLinkTimeInterval(LINK_INTERVAL_NONE);\n    if (!TryGivePrize())\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic bool32 SavePokeJump(void)\n{\n    switch (sPokemonJump->mainState)\n    {\n    case 0:\n        TryUpdateRecords(sPokemonJump->comm.jumpScore, sPokemonJump->comm.jumpsInRow, sPokemonJump->comm.data);\n        SetUpPokeJumpGfxFuncById(GFXFUNC_MSG_SAVING);\n        sPokemonJump->mainState++;\n        break;\n    case 1:\n        if (!IsPokeJumpGfxFuncFinished())\n        {\n            SetLinkTimeInterval(LINK_INTERVAL_NONE);\n            sPokemonJump->mainState++;\n        }\n        break;\n    case 2:\n        if (AreLinkQueuesEmpty())\n        {\n            CreateTask(Task_LinkFullSave, 6);\n            sPokemonJump->mainState++;\n        }\n        break;\n    case 3:\n        if (!FuncIsActiveTask(Task_LinkFullSave))\n        {\n            ClearMessageWindow();\n            sPokemonJump->mainState++;\n        }\n        break;\n    case 4:\n        if (!RemoveMessageWindow())\n        {\n            sPokemonJump->nextFuncId = FUNC_ASK_PLAY_AGAIN;\n            return FALSE;\n        }\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DoGameIntro(void)\n{\n    switch (sPokemonJump->helperState)\n    {\n    case 0:\n        SetUpPokeJumpGfxFuncById(GFXFUNC_SHOW_NAMES_HIGHLIGHT);\n        ResetMonSpriteSubpriorities();\n        sPokemonJump->helperState++;\n        break;\n    case 1:\n        if (!IsPokeJumpGfxFuncFinished())\n        {\n            StartMonIntroBounce(sPokemonJump->multiplayerId);\n            sPokemonJump->timer = 0;\n            sPokemonJump->helperState++;\n        }\n        break;\n    case 2:\n        if (++sPokemonJump->timer > 120)\n        {\n            SetUpPokeJumpGfxFuncById(GFXFUNC_ERASE_NAMES);\n            sPokemonJump->helperState++;\n        }\n        break;\n    case 3:\n        if (IsPokeJumpGfxFuncFinished() != TRUE && IsMonIntroBounceActive() != TRUE)\n            sPokemonJump->helperState++;\n        break;\n    case 4:\n        SetUpPokeJumpGfxFuncById(GFXFUNC_COUNTDOWN);\n        sPokemonJump->helperState++;\n        break;\n    case 5:\n        if (!IsPokeJumpGfxFuncFinished())\n        {\n            DisallowVineUpdates();\n            SetUpResetVineGfx();\n            sPokemonJump->helperState++;\n        }\n        break;\n    case 6:\n        if (!ResetVineGfx())\n        {\n            AllowVineUpdates();\n            ResetVineState();\n            sPokemonJump->helperState++;\n            return FALSE;\n        }\n        break;\n    case 7:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\n// Update the vine and wait for player to input a jump\n// Returns false when vine reaches the 'hit' point, after\n// which input is ignored\nstatic bool32 HandleSwingRound(void)\n{\n    UpdateVineState();\n    if (sPokemonJump->ignoreJumpInput)\n    {\n        sPokemonJump->ignoreJumpInput = FALSE;\n        return FALSE;\n    }\n\n    switch (sPokemonJump->helperState)\n    {\n    case 0:\n        if (IsPlayersMonState(MONSTATE_NORMAL))\n            sPokemonJump->helperState++;\n        else\n            break;\n        // fall through\n    case 1:\n        if (JOY_NEW(A_BUTTON))\n        {\n            SetMonStateJump();\n            SetLinkTimeInterval(LINK_INTERVAL_SHORT);\n            sPokemonJump->helperState++;\n        }\n        break;\n    case 2:\n        if (IsPlayersMonState(MONSTATE_JUMP) == TRUE)\n            sPokemonJump->helperState++;\n        break;\n    case 3:\n        if (IsPlayersMonState(MONSTATE_NORMAL) == TRUE)\n            sPokemonJump->helperState = 0;\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DoVineHitEffect(void)\n{\n    int i;\n\n    switch (sPokemonJump->helperState)\n    {\n    case 0:\n        for (i = 0; i < sPokemonJump->numPlayers; i++)\n        {\n            if (IsMonHitShakeActive(i) == TRUE)\n                return TRUE;\n        }\n\n        sPokemonJump->helperState++;\n        break;\n    case 1:\n        for (i = 0; i < sPokemonJump->numPlayers; i++)\n        {\n            if (sPokemonJump->players[i].monState == MONSTATE_HIT)\n                StartMonHitFlash(i);\n        }\n\n        SetUpPokeJumpGfxFuncById(GFXFUNC_SHOW_NAMES);\n        sPokemonJump->timer = 0;\n        sPokemonJump->helperState++;\n        break;\n    case 2:\n        if (++sPokemonJump->timer > 100)\n        {\n            SetUpPokeJumpGfxFuncById(GFXFUNC_ERASE_NAMES);\n            sPokemonJump->timer = 0;\n            sPokemonJump->helperState++;\n        }\n        break;\n    case 3:\n        if (!IsPokeJumpGfxFuncFinished())\n        {\n            StopMonHitFlash();\n            sPokemonJump->comm.receivedBonusFlags = 0;\n            ResetPlayersMonState();\n            sPokemonJump->helperState++;\n            return FALSE;\n        }\n        break;\n    case 4:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 TryGivePrize(void)\n{\n    switch (sPokemonJump->helperState)\n    {\n    case 0:\n        UnpackPrizeData(sPokemonJump->comm.data, &sPokemonJump->prizeItemId, &sPokemonJump->prizeItemQuantity);\n        PrintPrizeMessage(sPokemonJump->prizeItemId, sPokemonJump->prizeItemQuantity);\n        sPokemonJump->helperState++;\n        break;\n    case 1:\n    case 4:\n        if (!DoPrizeMessageAndFanfare())\n        {\n            sPokemonJump->timer = 0;\n            sPokemonJump->helperState++;\n        }\n        break;\n    case 2:\n    case 5:\n        // Wait to continue after message\n        sPokemonJump->timer++;\n        if (JOY_NEW(A_BUTTON | B_BUTTON) || sPokemonJump->timer > 180)\n        {\n            ClearMessageWindow();\n            sPokemonJump->helperState++;\n        }\n        break;\n    case 3:\n        if (!RemoveMessageWindow())\n        {\n            sPokemonJump->prizeItemQuantity = GetQuantityLimitedByBag(sPokemonJump->prizeItemId, sPokemonJump->prizeItemQuantity);\n            if (sPokemonJump->prizeItemQuantity && AddBagItem(sPokemonJump->prizeItemId, sPokemonJump->prizeItemQuantity))\n            {\n                if (!CheckBagHasSpace(sPokemonJump->prizeItemId, 1))\n                {\n                    // An item was given successfully, but no room for any more.\n                    // It's possible the full prize quantity had to be limited\n                    PrintPrizeFilledBagMessage(sPokemonJump->prizeItemId);\n                    sPokemonJump->helperState = 4; // Do message\n                }\n                else\n                {\n                    sPokemonJump->helperState = 6; // Exit\n                    break;\n                }\n            }\n            else\n            {\n                PrintNoRoomForPrizeMessage(sPokemonJump->prizeItemId);\n                sPokemonJump->helperState = 4; // Do message\n            }\n        }\n        break;\n    case 6:\n        if (!RemoveMessageWindow())\n            return FALSE;\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DoPlayAgainPrompt(void)\n{\n    s8 input;\n\n    switch (sPokemonJump->helperState)\n    {\n    case 0:\n        SetUpPokeJumpGfxFuncById(GFXFUNC_MSG_PLAY_AGAIN);\n        sPokemonJump->helperState++;\n        break;\n    case 1:\n        if (!IsPokeJumpGfxFuncFinished())\n            sPokemonJump->helperState++;\n        break;\n    case 2:\n        input = HandlePlayAgainInput();\n        switch (input)\n        {\n        case MENU_B_PRESSED:\n        case 1: // No\n            sPokemonJump->playAgainState = PLAY_AGAIN_NO;\n            SetUpPokeJumpGfxFuncById(GFXFUNC_ERASE_MSG);\n            sPokemonJump->helperState++;\n            break;\n        case 0: // Yes\n            sPokemonJump->playAgainState = PLAY_AGAIN_YES;\n            SetUpPokeJumpGfxFuncById(GFXFUNC_ERASE_MSG);\n            sPokemonJump->helperState++;\n            break;\n        }\n        break;\n    case 3:\n        if (!IsPokeJumpGfxFuncFinished())\n            sPokemonJump->helperState++;\n        break;\n    case 4:\n        SetUpPokeJumpGfxFuncById(GFXFUNC_MSG_COMM_STANDBY);\n        sPokemonJump->helperState++;\n        break;\n    case 5:\n        if (!IsPokeJumpGfxFuncFinished())\n        {\n            sPokemonJump->helperState++;\n            return FALSE;\n        }\n        break;\n    case 6:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 ClosePokeJumpLink(void)\n{\n    switch (sPokemonJump->helperState)\n    {\n    case 0:\n        ClearMessageWindow();\n        sPokemonJump->helperState++;\n        break;\n    case 1:\n        if (!RemoveMessageWindow())\n        {\n            SetUpPokeJumpGfxFuncById(GFXFUNC_MSG_PLAYER_DROPPED);\n            sPokemonJump->helperState++;\n        }\n        break;\n    case 2:\n        if (!IsPokeJumpGfxFuncFinished())\n        {\n            sPokemonJump->timer = 0;\n            sPokemonJump->helperState++;\n        }\n        break;\n    case 3:\n        if (++sPokemonJump->timer > 120)\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);\n            sPokemonJump->helperState++;\n        }\n        break;\n    case 4:\n        if (!gPaletteFade.active)\n        {\n            SetCloseLinkCallback();\n            sPokemonJump->helperState++;\n        }\n        break;\n    case 5:\n        if (!gReceivedRemoteLinkPlayers)\n            return FALSE;\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 CloseMessageAndResetScore(void)\n{\n    switch (sPokemonJump->helperState)\n    {\n    case 0:\n        ClearMessageWindow();\n        PrintScore(0);\n        sPokemonJump->helperState++;\n        break;\n    case 1:\n        if (!RemoveMessageWindow())\n        {\n            sPokemonJump->helperState++;\n            return FALSE;\n        }\n        break;\n    case 2:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\n#define tState data[0]\n#define tNumReceived data[1]\n#define tReceivedPacket(playerId) data[(playerId) + 2]\n#define DATAIDX_GAME_STRUCT 14\n\nstatic void Task_CommunicateMonInfo(u8 taskId)\n{\n    int i;\n    s16 *data = gTasks[taskId].data;\n    struct PokemonJump *jump = (struct PokemonJump *)GetWordTaskArg(taskId, DATAIDX_GAME_STRUCT);\n\n    switch (tState)\n    {\n    case 0:\n        for (i = 0; i < MAX_RFU_PLAYERS; i++)\n            tReceivedPacket(i) = FALSE;\n\n        tState++;\n        // fall through\n    case 1:\n        SendPacket_MonInfo(&jump->monInfo[jump->multiplayerId]);\n        for (i = 0; i < MAX_RFU_PLAYERS; i++)\n        {\n            if (!tReceivedPacket(i) && RecvPacket_MonInfo(i, &jump->monInfo[i]))\n            {\n                StringCopy(jump->players[i].name, gLinkPlayers[i].name);\n                tReceivedPacket(i) = TRUE;\n                tNumReceived++;\n                if (tNumReceived == jump->numPlayers)\n                {\n                    InitPlayerAndJumpTypes();\n                    DestroyTask(taskId);\n                    break;\n                }\n            }\n        }\n        break;\n    }\n}\n\nstatic void SetTaskWithPokeJumpStruct(TaskFunc func, u8 taskPriority)\n{\n    u8 taskId = CreateTask(func, taskPriority);\n    SetWordTaskArg(taskId, DATAIDX_GAME_STRUCT, (uintptr_t)sPokemonJump);\n}\n\n#undef tState\n#undef tNumReceived\n#undef tReceivedPacket\n#undef DATAIDX_GAME_STRUCT\n\nstatic void InitVineState(void)\n{\n    sPokemonJump->vineTimer = 0;\n    sPokemonJump->vineState = VINE_UPSWING_LOWER;\n    sPokemonJump->vineStateTimer = 0;\n    sPokemonJump->vineSpeed = 0;\n    sPokemonJump->ignoreJumpInput = FALSE;\n    sPokemonJump->gameOver = FALSE;\n}\n\nstatic void ResetVineState(void)\n{\n    sPokemonJump->vineTimer = 0;\n    sPokemonJump->vineStateTimer = VINE_STATE_TIMER(VINE_UPSWING_LOWER);\n    sPokemonJump->vineState = VINE_UPSWING_LOW;\n    sPokemonJump->ignoreJumpInput = FALSE;\n    sPokemonJump->gameOver = FALSE;\n    sPokemonJump->vineSpeedStage = 0;\n    sPokemonJump->vineBaseSpeedIdx = 0;\n    sPokemonJump->vineSpeedAccel = 0;\n    sPokemonJump->vineSpeedDelay = 0;\n    sPokemonJump->atMaxSpeedStage = FALSE;\n    UpdateVineSpeed();\n}\n\nstatic void UpdateVineState(void)\n{\n    if (sPokemonJump->allowVineUpdates)\n    {\n        sPokemonJump->vineTimer++;\n        sPokemonJump->vineStateTimer += GetVineSpeed();\n        if (sPokemonJump->vineStateTimer >= VINE_STATE_TIMER(NUM_VINESTATES - 1))\n            sPokemonJump->vineStateTimer -= VINE_STATE_TIMER(NUM_VINESTATES - 1);\n\n        sPokemonJump->prevVineState = sPokemonJump->vineState;\n        sPokemonJump->vineState = sPokemonJump->vineStateTimer >> 8;\n\n         // If beginning upswing\n        if (sPokemonJump->vineState > VINE_UPSWING_LOWER && sPokemonJump->prevVineState < VINE_UPSWING_LOW)\n        {\n            sPokemonJump->ignoreJumpInput++;\n            UpdateVineSpeed();\n        }\n    }\n}\n\nstatic int GetVineSpeed(void)\n{\n    int speed;\n\n    if (sPokemonJump->gameOver)\n        return 0;\n\n    speed = sPokemonJump->vineSpeed;\n    if (sPokemonJump->vineStateTimer <= VINE_STATE_TIMER(VINE_LOWEST))\n    {\n        // If at or below lowest, then vine is in downswing\n        // Increase speed in downswing\n        sPokemonJump->vineSpeedAccel += 80;\n        speed += sPokemonJump->vineSpeedAccel / 256;\n    }\n\n    return speed;\n}\n\nstatic const u16 sVineBaseSpeeds[] = {26, 31, 36, 41, 46, 51, 56, 61};\nstatic const u16 sVineSpeedDelays[] = {0, 1, 1, 2};\n\nstatic void UpdateVineSpeed(void)\n{\n    int baseSpeed;\n\n    sPokemonJump->vineSpeedAccel = 0;\n    if (sPokemonJump->vineSpeedDelay)\n    {\n        sPokemonJump->vineSpeedDelay--;\n        if (sPokemonJump->atMaxSpeedStage)\n        {\n            if (PokeJumpRandom() % 4)\n            {\n                sPokemonJump->vineSpeed = sPokemonJump->nextVineSpeed;\n            }\n            else\n            {\n                if (sPokemonJump->nextVineSpeed > 54)\n                    sPokemonJump->vineSpeed = 30;\n                else\n                    sPokemonJump->vineSpeed = 82;\n            }\n        }\n    }\n    else\n    {\n        if (!(sPokemonJump->vineBaseSpeedIdx & ARRAY_COUNT(sVineBaseSpeeds)))\n        {\n            sPokemonJump->nextVineSpeed = sVineBaseSpeeds[sPokemonJump->vineBaseSpeedIdx] + (sPokemonJump->vineSpeedStage * 7);\n            sPokemonJump->vineSpeedDelay = sVineSpeedDelays[PokeJumpRandom() % ARRAY_COUNT(sVineSpeedDelays)] + 2;\n            sPokemonJump->vineBaseSpeedIdx++;\n        }\n        else\n        {\n            if (sPokemonJump->vineBaseSpeedIdx == ARRAY_COUNT(sVineBaseSpeeds))\n            {\n                if (sPokemonJump->vineSpeedStage < 3)\n                    sPokemonJump->vineSpeedStage++;\n                else\n                    sPokemonJump->atMaxSpeedStage = TRUE;\n            }\n\n            baseSpeed = sVineBaseSpeeds[15 - sPokemonJump->vineBaseSpeedIdx];\n            sPokemonJump->nextVineSpeed = baseSpeed + (sPokemonJump->vineSpeedStage * 7);\n            if (++sPokemonJump->vineBaseSpeedIdx > 15)\n            {\n                if (PokeJumpRandom() % 4 == 0)\n                    sPokemonJump->nextVineSpeed -= 5;\n\n                sPokemonJump->vineBaseSpeedIdx = 0;\n            }\n        }\n\n        sPokemonJump->vineSpeed = sPokemonJump->nextVineSpeed;\n    }\n}\n\nstatic int PokeJumpRandom(void)\n{\n    sPokemonJump->rngSeed = ISO_RANDOMIZE1(sPokemonJump->rngSeed);\n    return sPokemonJump->rngSeed >> 16;\n}\n\nstatic void ResetVineAfterHit(void)\n{\n    sPokemonJump->gameOver = TRUE;\n    sPokemonJump->vineState = VINE_UPSWING_LOWER;\n    sPokemonJump->vineStateTimer = VINE_STATE_TIMER(VINE_LOWEST);\n    AllowVineUpdates();\n}\n\nstatic int IsGameOver(void)\n{\n    return sPokemonJump->gameOver;\n}\n\nstatic void ResetPlayersJumpStates(void)\n{\n    int i;\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n        sPokemonJump->players[i].jumpState = JUMPSTATE_NONE;\n}\n\nstatic void ResetPlayersMonState(void)\n{\n    sPokemonJump->player->monState = MONSTATE_NORMAL;\n    sPokemonJump->player->prevMonState = MONSTATE_NORMAL;\n}\n\nstatic bool32 IsPlayersMonState(u16 monState)\n{\n    if (sPokemonJump->players[sPokemonJump->multiplayerId].monState == monState)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void SetMonStateJump(void)\n{\n    sPokemonJump->player->jumpTimeStart = sPokemonJump->vineTimer;\n    sPokemonJump->player->prevMonState = sPokemonJump->player->monState;\n    sPokemonJump->player->monState = MONSTATE_JUMP;\n}\n\nstatic void SetMonStateHit(void)\n{\n    sPokemonJump->player->prevMonState = sPokemonJump->player->monState;\n    sPokemonJump->player->monState = MONSTATE_HIT;\n    sPokemonJump->player->jumpTimeStart = sPokemonJump->vineTimer;\n    sPokemonJump->player->jumpState = JUMPSTATE_FAILURE;\n}\n\nstatic void SetMonStateNormal(void)\n{\n    sPokemonJump->player->prevMonState = sPokemonJump->player->monState;\n    sPokemonJump->player->monState = MONSTATE_NORMAL;\n}\n\nstatic const u16 sSoundEffects[MAX_RFU_PLAYERS - 1] = {SE_RS_SHOP, SE_SHINY, SE_M_MORNING_SUN, SE_POKE_JUMP_SUCCESS};\n\nstatic void UpdateGame(void)\n{\n    if (sPokemonJump->updateScore)\n    {\n        PrintScore(sPokemonJump->comm.jumpScore);\n        sPokemonJump->updateScore = FALSE;\n        if (sPokemonJump->showBonus)\n        {\n            int numPlayers = DoSameJumpTimeBonus(sPokemonJump->comm.receivedBonusFlags);\n            PlaySE(sSoundEffects[numPlayers - 2]);\n            sPokemonJump->showBonus = FALSE;\n        }\n    }\n\n    PrintJumpsInRow(sPokemonJump->comm.jumpsInRow);\n    HandleMonState();\n    TryUpdateVineSwing();\n}\n\nstatic void TryUpdateVineSwing(void)\n{\n    if (sPokemonJump->allowVineUpdates)\n        UpdateVineSwing(sPokemonJump->vineState);\n}\n\nstatic void DisallowVineUpdates(void)\n{\n    sPokemonJump->allowVineUpdates = FALSE;\n}\n\nstatic void AllowVineUpdates(void)\n{\n    sPokemonJump->allowVineUpdates = TRUE;\n}\n\n#define F_SE_JUMP (1 << 0)\n#define F_SE_FAIL (1 << 1)\n\nstatic void HandleMonState(void)\n{\n    int i;\n    int soundFlags = 0;\n    int numPlayers = sPokemonJump->numPlayers;\n\n    for (i = 0; i < numPlayers; i++)\n    {\n        switch (sPokemonJump->players[i].monState)\n        {\n        case MONSTATE_NORMAL:\n            SetMonSpriteY(i, 0);\n            break;\n        case MONSTATE_JUMP:\n            if (sPokemonJump->players[i].prevMonState != MONSTATE_JUMP || sPokemonJump->players[i].jumpTimeStart != sPokemonJump->jumpTimeStarts[i])\n            {\n                // This is a new jump, play SE and init fields for jump handling\n                if (i == sPokemonJump->multiplayerId)\n                    sPokemonJump->players[i].prevMonState = MONSTATE_JUMP;\n\n                soundFlags |= F_SE_JUMP;\n                sPokemonJump->players[i].jumpOffsetIdx = INT_MAX;\n                sPokemonJump->jumpTimeStarts[i] = sPokemonJump->players[i].jumpTimeStart;\n            }\n\n            UpdateJump(i);\n            break;\n        case MONSTATE_HIT:\n            if (sPokemonJump->players[i].prevMonState != MONSTATE_HIT)\n            {\n                if (i == sPokemonJump->multiplayerId)\n                    sPokemonJump->players[i].prevMonState = MONSTATE_HIT;\n\n                soundFlags |= F_SE_FAIL;\n                StartMonHitShake(i);\n            }\n            break;\n        }\n    }\n\n    if (soundFlags & F_SE_FAIL)\n        PlaySE(SE_POKE_JUMP_FAILURE);\n    else if (soundFlags & F_SE_JUMP)\n        PlaySE(SE_LEDGE);\n}\n\nstatic const s8 sJumpOffsets[][48] =\n{\n    [JUMP_TYPE_NORMAL] = { -3,  -6,  -8, -10, -13, -15, -17, -19,\n                          -21, -23, -25, -27, -28, -29,\n                          JUMP_PEAK, JUMP_PEAK, JUMP_PEAK,\n                          -28, -27, -26, -25, -23, -22, -20, -18,\n                          -17, -15, -13, -11,  -8,  -6,  -4,  -1},\n\n    [JUMP_TYPE_FAST]  = { -3,  -6,  -9, -11, -14, -16, -18, -20,\n                         -22, -24, -26, -28, -29,\n                         JUMP_PEAK, JUMP_PEAK,\n                         -28, -26, -24, -22, -20, -18, -16, -14,\n                         -11, -9,  -6,  -4,  -1},\n\n    [JUMP_TYPE_SLOW]  = { -3,  -6,  -9, -11, -13, -15, -17, -19,\n                         -21, -23, -25, -27, -28, -29,\n                         JUMP_PEAK, JUMP_PEAK, JUMP_PEAK, JUMP_PEAK,\n                         -29, -29, -28, -28, -27, -27, -26, -25,\n                         -24, -22, -20, -18, -16, -14, -12, -11,\n                          -9,  -6,  -4,  -1},\n};\n\nstatic void UpdateJump(int multiplayerId)\n{\n    int jumpOffsetIdx;\n    int jumpOffset;\n    struct PokemonJump_Player *player;\n\n    if (sPokemonJump->skipJumpUpdate) // Always false\n        return;\n\n    player = &sPokemonJump->players[multiplayerId];\n    if (player->jumpOffsetIdx != INT_MAX)\n    {\n        player->jumpOffsetIdx++;\n        jumpOffsetIdx = player->jumpOffsetIdx;\n    }\n    else\n    {\n        jumpOffsetIdx = sPokemonJump->vineTimer - player->jumpTimeStart;\n        if (jumpOffsetIdx >= 65000)\n        {\n            jumpOffsetIdx -= 65000;\n            jumpOffsetIdx += sPokemonJump->vineTimer;\n        }\n\n        player->jumpOffsetIdx = jumpOffsetIdx;\n    }\n\n    if (jumpOffsetIdx < 4)\n        return;\n\n    jumpOffsetIdx -= 4;\n    if (jumpOffsetIdx < (int)ARRAY_COUNT(sJumpOffsets[0]))\n        jumpOffset = sJumpOffsets[player->monJumpType][jumpOffsetIdx];\n    else\n        jumpOffset = 0;\n\n    SetMonSpriteY(multiplayerId, jumpOffset);\n    if (jumpOffset == 0 && multiplayerId == sPokemonJump->multiplayerId)\n        SetMonStateNormal();\n\n    player->jumpOffset = jumpOffset;\n}\n\nstatic void TryUpdateScore(void)\n{\n    if (sPokemonJump->vineState == VINE_UPSWING_HIGH && sPokemonJump->prevVineState == VINE_UPSWING_LOW)\n    {\n        // Vine has passed through the point where it\n        // would hit the players, allow score to update\n\n        if (!sPokemonJump->initScoreUpdate)\n        {\n            ClearUnreadField();\n            sPokemonJump->numPlayersAtPeak = 0;\n            sPokemonJump->initScoreUpdate = TRUE;\n            sPokemonJump->comm.receivedBonusFlags = 0;\n        }\n        else\n        {\n            if (sPokemonJump->numPlayersAtPeak == MAX_RFU_PLAYERS)\n            {\n                // An 'excellent' is the max 5 players all jumping synchronously\n                sPokemonJump->excellentsInRow++;\n                TryUpdateExcellentsRecord(sPokemonJump->excellentsInRow);\n            }\n            else\n            {\n                sPokemonJump->excellentsInRow = 0;\n            }\n\n            if (sPokemonJump->numPlayersAtPeak > 1)\n            {\n                sPokemonJump->giveBonus = TRUE;\n                // Unclear why atJumpPeak needed to be copied over twice\n                memcpy(sPokemonJump->atJumpPeak3, sPokemonJump->atJumpPeak2, sizeof(u8) * MAX_RFU_PLAYERS);\n            }\n\n            ClearUnreadField();\n            sPokemonJump->numPlayersAtPeak = 0;\n            sPokemonJump->initScoreUpdate = TRUE;\n            sPokemonJump->comm.receivedBonusFlags = 0;\n            if (sPokemonJump->comm.jumpsInRow < MAX_JUMPS)\n                sPokemonJump->comm.jumpsInRow++;\n\n            AddJumpScore(10);\n            SetLinkTimeInterval(LINK_INTERVAL_SHORT);\n        }\n    }\n\n    if (sPokemonJump->giveBonus && (DidAllPlayersClearVine() == TRUE || sPokemonJump->vineState == VINE_HIGHEST))\n    {\n        int numPlayers = GetNumPlayersForBonus(sPokemonJump->atJumpPeak3);\n        AddJumpScore(GetScoreBonus(numPlayers));\n        SetLinkTimeInterval(LINK_INTERVAL_SHORT);\n        sPokemonJump->giveBonus = FALSE;\n    }\n\n    if (sPokemonJump->initScoreUpdate)\n    {\n        int numAtPeak = GetPlayersAtJumpPeak();\n        if (numAtPeak > sPokemonJump->numPlayersAtPeak)\n        {\n            sPokemonJump->numPlayersAtPeak = numAtPeak;\n            memcpy(sPokemonJump->atJumpPeak2, sPokemonJump->atJumpPeak, sizeof(u8) * MAX_RFU_PLAYERS);\n        }\n    }\n}\n\n// Returns FALSE if any player was hit by vine\nstatic bool32 UpdateVineHitStates(void)\n{\n    int i;\n\n    if (sPokemonJump->vineState == VINE_UPSWING_LOWER && sPokemonJump->player->jumpOffset == 0)\n    {\n        // Vine is in position to hit the player and jump offset is 0.\n        // Unless the player had just jumped and has been forced to the ground\n        // by someone else getting hit, the player has been hit\n        if (sPokemonJump->player->prevMonState == MONSTATE_JUMP && IsGameOver() == TRUE)\n        {\n            sPokemonJump->player->jumpState = JUMPSTATE_SUCCESS;\n        }\n        else\n        {\n            // Hit vine\n            SetMonStateHit();\n            SetLinkTimeInterval(LINK_INTERVAL_SHORT);\n        }\n    }\n\n    if (sPokemonJump->vineState == VINE_UPSWING_LOW\n     && sPokemonJump->prevVineState == VINE_UPSWING_LOWER\n     && sPokemonJump->player->monState != MONSTATE_HIT)\n    {\n        sPokemonJump->player->jumpState = JUMPSTATE_SUCCESS;\n        SetLinkTimeInterval(LINK_INTERVAL_SHORT);\n    }\n\n    for (i = 0; i < sPokemonJump->numPlayers; i++)\n    {\n        if (sPokemonJump->players[i].monState == MONSTATE_HIT)\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\n// Has everyone either jumped or been hit by the vine\nstatic bool32 AllPlayersJumpedOrHit(void)\n{\n    int i;\n    int numPlayers = sPokemonJump->numPlayers;\n    int numJumpedOrHit = 0;\n    for (i = 0; i < numPlayers; i++)\n    {\n        if (sPokemonJump->players[i].jumpState != JUMPSTATE_NONE)\n            numJumpedOrHit++;\n    }\n\n    return numJumpedOrHit == numPlayers;\n}\n\nstatic bool32 DidAllPlayersClearVine(void)\n{\n    int i;\n    for (i = 0; i < sPokemonJump->numPlayers; i++)\n    {\n        if (sPokemonJump->players[i].jumpState != JUMPSTATE_SUCCESS)\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 ShouldPlayAgain(void)\n{\n    int i;\n\n    if (sPokemonJump->playAgainState == PLAY_AGAIN_NO)\n        return FALSE;\n\n    for (i = 1; i < sPokemonJump->numPlayers; i++)\n    {\n        if (sPokemonJump->playAgainStates[i] == PLAY_AGAIN_NO)\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic void AddJumpScore(int score)\n{\n    sPokemonJump->comm.jumpScore += score;\n    sPokemonJump->updateScore = TRUE;\n    if (sPokemonJump->comm.jumpScore >= MAX_JUMP_SCORE)\n        sPokemonJump->comm.jumpScore = MAX_JUMP_SCORE;\n}\n\nstatic int GetPlayersAtJumpPeak(void)\n{\n    int i;\n    int numAtPeak = 0;\n    int numPlayers = sPokemonJump->numPlayers;\n\n    for (i = 0; i < numPlayers; i++)\n    {\n        if (sPokemonJump->players[i].jumpOffset == JUMP_PEAK)\n        {\n            sPokemonJump->atJumpPeak[i] = TRUE;\n            numAtPeak++;\n        }\n        else\n        {\n            sPokemonJump->atJumpPeak[i] = FALSE;\n        }\n    }\n\n    return numAtPeak;\n}\n\nstatic bool32 AreLinkQueuesEmpty(void)\n{\n    return !gRfu.recvQueue.count && !gRfu.sendQueue.count;\n}\n\nstatic int GetNumPlayersForBonus(u8 *arg0)\n{\n    int i = 0;\n    int flags = 0;\n    int count = 0;\n\n    for (; i < MAX_RFU_PLAYERS; i++)\n    {\n        if (arg0[i])\n        {\n            flags |= 1 << i;\n            count++;\n        }\n    }\n\n    sPokemonJump->comm.receivedBonusFlags = flags;\n    if (flags)\n        sPokemonJump->showBonus = TRUE;\n\n    return count;\n}\n\nstatic void ClearUnreadField(void)\n{\n    sPokemonJump->unused3 = 0;\n}\n\n// Bonuses given depend on the number of\n// players that jumped at the same time\nstatic const int sScoreBonuses[MAX_RFU_PLAYERS + 1] = {0, 0, 50, 100, 200, 500};\n\nstatic int GetScoreBonus(int numPlayers)\n{\n    return sScoreBonuses[numPlayers];\n}\n\nstatic void TryUpdateExcellentsRecord(u16 excellentsInRow)\n{\n    if (excellentsInRow > sPokemonJump->excellentsInRowRecord)\n        sPokemonJump->excellentsInRowRecord = excellentsInRow;\n}\n\nstatic const u16 sPrizeItems[] = {\n    ITEM_LEPPA_BERRY,\n    ITEM_LUM_BERRY,\n    ITEM_SITRUS_BERRY,\n    ITEM_FIGY_BERRY,\n    ITEM_WIKI_BERRY,\n    ITEM_MAGO_BERRY,\n    ITEM_AGUAV_BERRY,\n    ITEM_IAPAPA_BERRY\n};\n\nstruct {\n    u32 score;\n    u32 quantity;\n} static const sPrizeQuantityData[] =\n{\n    { .score =  5000, .quantity = 1},\n    { .score =  8000, .quantity = 2},\n    { .score = 12000, .quantity = 3},\n    { .score = 16000, .quantity = 4},\n    { .score = 20000, .quantity = 5},\n};\n\nstatic bool32 HasEnoughScoreForPrize(void)\n{\n    if (sPokemonJump->comm.jumpScore >= sPrizeQuantityData[0].score)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic u16 GetPrizeData(void)\n{\n    u16 itemId = GetPrizeItemId();\n    u16 quantity = GetPrizeQuantity();\n    return (quantity << 12) | (itemId & 0xFFF);\n}\n\nstatic void UnpackPrizeData(u16 data, u16 *itemId, u16 *quantity)\n{\n    *quantity = data >> 12;\n    *itemId = data & 0xFFF;\n}\n\nstatic u16 GetPrizeItemId(void)\n{\n    u16 index = Random() % ARRAY_COUNT(sPrizeItems);\n    return sPrizeItems[index];\n}\n\nstatic u16 GetPrizeQuantity(void)\n{\n    u32 quantity, i;\n\n    quantity = 0;\n    for (i = 0; i < ARRAY_COUNT(sPrizeQuantityData); i++)\n    {\n        if (sPokemonJump->comm.jumpScore >= sPrizeQuantityData[i].score)\n            quantity = sPrizeQuantityData[i].quantity;\n        else\n            break;\n    }\n\n    return quantity;\n}\n\nstatic u16 GetQuantityLimitedByBag(u16 item, u16 quantity)\n{\n    while (quantity && !CheckBagHasSpace(item, quantity))\n        quantity--;\n\n    return quantity;\n}\n\nstatic u16 GetNumPokeJumpPlayers(void)\n{\n    return GetLinkPlayerCount();\n}\n\nstatic u16 GetPokeJumpMultiplayerId(void)\n{\n    return sPokemonJump->multiplayerId;\n}\n\nstatic struct PokemonJump_MonInfo *GetMonInfoByMultiplayerId(u8 multiplayerId)\n{\n    return &sPokemonJump->monInfo[multiplayerId];\n}\n\nstatic u8 *GetPokeJumpPlayerName(u8 multiplayerId)\n{\n    return sPokemonJump->players[multiplayerId].name;\n}\n\nbool32 IsSpeciesAllowedInPokemonJump(u16 species)\n{\n    return GetPokemonJumpSpeciesIdx(species) > -1;\n}\n\nvoid IsPokemonJumpSpeciesInParty(void)\n{\n    int i;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES))\n        {\n            u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG);\n            if (IsSpeciesAllowedInPokemonJump(species))\n            {\n                gSpecialVar_Result = TRUE;\n                return;\n            }\n        }\n    }\n\n    gSpecialVar_Result = FALSE;\n}\n\nstruct MonInfoPacket\n{\n    u8 id;\n    u16 species;\n    u32 personality;\n    u32 otId;\n};\n\nstatic void SendPacket_MonInfo(struct PokemonJump_MonInfo *monInfo)\n{\n    struct MonInfoPacket packet;\n    packet.id = PACKET_MON_INFO;\n    packet.species = monInfo->species;\n    packet.otId = monInfo->otId;\n    packet.personality = monInfo->personality;\n    Rfu_SendPacket(&packet);\n}\n\nstatic bool32 RecvPacket_MonInfo(int multiplayerId, struct PokemonJump_MonInfo *monInfo)\n{\n    struct MonInfoPacket packet;\n\n    if ((gRecvCmds[multiplayerId][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)\n        return FALSE;\n\n    memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet));\n    if (packet.id == PACKET_MON_INFO)\n    {\n        monInfo->species = packet.species;\n        monInfo->otId = packet.otId;\n        monInfo->personality = packet.personality;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstruct UnusedPacket\n{\n    u8 id;\n    u32 data;\n    u32 filler;\n};\n\n// Data packet that's never sent\n// No function to read it either\nstatic void SendPacket_Unused(u32 data)\n{\n    struct UnusedPacket packet;\n    packet.id = PACKET_UNUSED;\n    packet.data = data;\n    Rfu_SendPacket(&packet);\n}\n\nstruct LeaderStatePacket\n{\n    u8 id;\n    u8 funcId;\n    u8 monState;\n    u8 receivedBonusFlags:5; // 1 bit for each player (MAX_RFU_PLAYERS)\n    u8 jumpState:3;\n    u16 jumpTimeStart;\n    u16 vineTimer;\n    u32 jumpsInRow:15;\n    u32 jumpScore:17;\n};\n\nstatic void SendPacket_LeaderState(struct PokemonJump_Player *player, struct PokemonJump_CommData *comm)\n{\n    struct LeaderStatePacket packet;\n    packet.id = PACKET_LEADER_STATE;\n    packet.jumpScore = comm->jumpScore;\n    packet.receivedBonusFlags = comm->receivedBonusFlags;\n    packet.funcId = comm->funcId;\n    packet.vineTimer = comm->data;\n    packet.jumpsInRow = comm->jumpsInRow;\n    packet.monState = player->monState;\n    packet.jumpState = player->jumpState;\n    packet.jumpTimeStart = player->jumpTimeStart;\n    Rfu_SendPacket(&packet);\n}\n\n// Used by group members to read the state of the group leader\nstatic bool32 RecvPacket_LeaderState(struct PokemonJump_Player *player, struct PokemonJump_CommData *comm)\n{\n    struct LeaderStatePacket packet;\n\n    if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)\n        return FALSE;\n\n    memcpy(&packet, &gRecvCmds[0][1], sizeof(packet));\n    if (packet.id != PACKET_LEADER_STATE)\n        return FALSE;\n\n    comm->jumpScore = packet.jumpScore;\n    comm->receivedBonusFlags = packet.receivedBonusFlags;\n    comm->funcId = packet.funcId;\n    comm->data = packet.vineTimer;\n    comm->jumpsInRow = packet.jumpsInRow;\n    player->monState = packet.monState;\n    player->jumpState = packet.jumpState;\n    player->jumpTimeStart = packet.jumpTimeStart;\n    return TRUE;\n}\n\nstruct MemberStatePacket\n{\n    u8 id;\n    u8 monState;\n    u8 jumpState;\n    bool8 funcFinished;\n    u16 jumpTimeStart;\n    u8 funcId;\n    u16 playAgainState;\n};\n\nstatic void SendPacket_MemberState(struct PokemonJump_Player *player, u8 funcId, u16 playAgainState)\n{\n    struct MemberStatePacket packet;\n    packet.id = PACKET_MEMBER_STATE;\n    packet.monState = player->monState;\n    packet.jumpState = player->jumpState;\n    packet.funcFinished = player->funcFinished;\n    packet.jumpTimeStart = player->jumpTimeStart;\n    packet.funcId = funcId;\n    packet.playAgainState = playAgainState;\n    Rfu_SendPacket(&packet);\n}\n\n// Used by the group leader to read the state of group members\nstatic bool32 RecvPacket_MemberStateToLeader(struct PokemonJump_Player *player, int multiplayerId, u8 *funcId, u16 *playAgainState)\n{\n    struct MemberStatePacket packet;\n\n    if ((gRecvCmds[multiplayerId][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)\n        return FALSE;\n\n    memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet));\n    if (packet.id != PACKET_MEMBER_STATE)\n        return FALSE;\n\n    player->monState = packet.monState;\n    player->jumpState = packet.jumpState;\n    player->funcFinished = packet.funcFinished;\n    player->jumpTimeStart = packet.jumpTimeStart;\n    *funcId = packet.funcId;\n    *playAgainState = packet.playAgainState;\n    return TRUE;\n}\n\n// Used by group members to read the state of other group members\nstatic bool32 RecvPacket_MemberStateToMember(struct PokemonJump_Player *player, int multiplayerId)\n{\n    struct MemberStatePacket packet;\n\n    if ((gRecvCmds[multiplayerId][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)\n        return FALSE;\n\n    memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet));\n    if (packet.id != PACKET_MEMBER_STATE)\n        return FALSE;\n\n    player->monState = packet.monState;\n    player->jumpState = packet.jumpState;\n    player->funcFinished = packet.funcFinished;\n    player->jumpTimeStart = packet.jumpTimeStart;\n    return TRUE;\n}\n\nstatic void StartPokeJumpGfx(struct PokemonJumpGfx *jumpGfx)\n{\n    u8 taskId;\n\n    sPokemonJumpGfx = jumpGfx;\n    InitPokeJumpGfx(sPokemonJumpGfx);\n    taskId = CreateTask(Task_RunPokeJumpGfxFunc, 3);\n    sPokemonJumpGfx->taskId = taskId;\n    SetWordTaskArg(sPokemonJumpGfx->taskId, 2, (uintptr_t)sPokemonJumpGfx);\n    SetUpPokeJumpGfxFunc(LoadPokeJumpGfx);\n}\n\nstatic void FreeWindowsAndDigitObj(void)\n{\n    FreeAllWindowBuffers();\n    DigitObjUtil_Free();\n}\n\nstatic void InitPokeJumpGfx(struct PokemonJumpGfx *jumpGfx)\n{\n    jumpGfx->mainState = 0;\n    jumpGfx->funcFinished = FALSE;\n    jumpGfx->msgWindowId = WINDOW_NONE;\n}\n\nstatic const u16 sInterface_Pal[] = INCBIN_U16(\"graphics/pokemon_jump/interface.gbapal\");\n\nstatic const u16 sBg_Pal[] = INCBIN_U16(\"graphics/pokemon_jump/bg.gbapal\");\nstatic const u32 sBg_Gfx[] = INCBIN_U32(\"graphics/pokemon_jump/bg.4bpp.lz\");\nstatic const u32 sBg_Tilemap[] = INCBIN_U32(\"graphics/pokemon_jump/bg.bin.lz\");\n\nstatic const u16 sVenusaur_Pal[] = INCBIN_U16(\"graphics/pokemon_jump/venusaur.gbapal\");\nstatic const u32 sVenusaur_Gfx[] = INCBIN_U32(\"graphics/pokemon_jump/venusaur.4bpp.lz\");\nstatic const u32 sVenusaur_Tilemap[] = INCBIN_U32(\"graphics/pokemon_jump/venusaur.bin.lz\");\n\nstatic const u16 sBonuses_Pal[] = INCBIN_U16(\"graphics/pokemon_jump/bonuses.gbapal\");\nstatic const u32 sBonuses_Gfx[] = INCBIN_U32(\"graphics/pokemon_jump/bonuses.4bpp.lz\");\nstatic const u32 sBonuses_Tilemap[] = INCBIN_U32(\"graphics/pokemon_jump/bonuses.bin.lz\");\n\nstatic const struct BgTemplate sBgTemplates[] =\n{\n    {\n        .bg = BG_INTERFACE,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 27,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0\n    },\n    {\n        .bg = BG_VENUSAUR,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 30,\n        .screenSize = 2,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0\n    },\n    {\n        .bg = BG_BONUSES,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 12,\n        .screenSize = 3,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0\n    },\n    {\n        .bg = BG_SCENERY,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0\n    },\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] =\n{\n    [WIN_POINTS] = {\n        .bg = BG_INTERFACE,\n        .tilemapLeft = 19,\n        .tilemapTop = 0,\n        .width = 6,\n        .height = 2,\n        .paletteNum = 2,\n        .baseBlock = 0x13,\n    },\n    [WIN_TIMES] = {\n        .bg = BG_INTERFACE,\n        .tilemapLeft = 8,\n        .tilemapTop = 0,\n        .width = 6,\n        .height = 2,\n        .paletteNum = 2,\n        .baseBlock = 0x1F,\n    },\n    DUMMY_WIN_TEMPLATE,\n};\n\nstruct\n{\n    int id;\n    void (*func)(void);\n} static const sPokeJumpGfxFuncs[] =\n{\n    {GFXFUNC_LOAD,                 LoadPokeJumpGfx}, // Element not used, LoadPokeJumpGfx is passed directly to SetUpPokeJumpGfxFunc\n    {GFXFUNC_SHOW_NAMES,           PrintPlayerNamesNoHighlight},\n    {GFXFUNC_SHOW_NAMES_HIGHLIGHT, PrintPlayerNamesWithHighlight},\n    {GFXFUNC_ERASE_NAMES,          ErasePlayerNames},\n    {GFXFUNC_MSG_PLAY_AGAIN,       Msg_WantToPlayAgain},\n    {GFXFUNC_MSG_SAVING,           Msg_SavingDontTurnOff},\n    {GFXFUNC_ERASE_MSG,            EraseMessage},\n    {GFXFUNC_MSG_PLAYER_DROPPED,   Msg_SomeoneDroppedOut},\n    {GFXFUNC_COUNTDOWN,            DoPokeJumpCountdown},\n    {GFXFUNC_MSG_COMM_STANDBY,     Msg_CommunicationStandby},\n};\n\nstatic void SetUpPokeJumpGfxFuncById(int id)\n{\n    int i;\n\n    for (i = 0; i < ARRAY_COUNT(sPokeJumpGfxFuncs); i++)\n    {\n        if (sPokeJumpGfxFuncs[i].id == id)\n            SetUpPokeJumpGfxFunc(sPokeJumpGfxFuncs[i].func);\n    }\n}\n\nstatic bool32 IsPokeJumpGfxFuncFinished(void)\n{\n    return (sPokemonJumpGfx->funcFinished != TRUE);\n}\n\nstatic void SetUpPokeJumpGfxFunc(void (*func)(void))\n{\n    SetWordTaskArg(sPokemonJumpGfx->taskId, 0, (uintptr_t)func);\n    sPokemonJumpGfx->mainState = 0;\n    sPokemonJumpGfx->funcFinished = FALSE;\n}\n\nstatic void Task_RunPokeJumpGfxFunc(u8 taskId)\n{\n    if (!sPokemonJumpGfx->funcFinished)\n    {\n        // Read the function set in the data by SetUpPokeJumpGfxFunc\n        void (*func)(void) = (void *)(GetWordTaskArg(taskId, 0));\n\n        func();\n    }\n}\n\nstatic void LoadPokeJumpGfx(void)\n{\n    switch (sPokemonJumpGfx->mainState)\n    {\n    case 0:\n        ResetBgsAndClearDma3BusyFlags(FALSE);\n        InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));\n        InitWindows(sWindowTemplates);\n        ResetBgPositions();\n        ResetTempTileDataBuffers();\n        LoadSpriteSheetsAndPalettes(sPokemonJumpGfx);\n        InitDigitPrinters();\n        LoadPalette(sBg_Pal, BG_PLTT_ID(0), sizeof(sBg_Pal));\n        DecompressAndCopyTileDataToVram(BG_SCENERY, sBg_Gfx, 0, 0, 0);\n        DecompressAndCopyTileDataToVram(BG_SCENERY, sBg_Tilemap, 0, 0, 1);\n        LoadPalette(sVenusaur_Pal, BG_PLTT_ID(3), sizeof(sVenusaur_Pal));\n        DecompressAndCopyTileDataToVram(BG_VENUSAUR, sVenusaur_Gfx, 0, 0, 0);\n        DecompressAndCopyTileDataToVram(BG_VENUSAUR, sVenusaur_Tilemap, 0, 0, 1);\n        LoadPalette(sBonuses_Pal, BG_PLTT_ID(1), sizeof(sBonuses_Pal));\n        DecompressAndCopyTileDataToVram(BG_BONUSES, sBonuses_Gfx, 0, 0, 0);\n        DecompressAndCopyTileDataToVram(BG_BONUSES, sBonuses_Tilemap, 0, 0, 1);\n        LoadPalette(sInterface_Pal, BG_PLTT_ID(2), sizeof(sInterface_Pal));\n        SetBgTilemapBuffer(BG_INTERFACE, sPokemonJumpGfx->tilemapBuffer);\n        FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 0x20, 0x20);\n        PrintScoreSuffixes();\n        PrintScore(0);\n        LoadStdWindowGfxOnBg(0, 1, BG_PLTT_ID(14));\n        LoadUserWindowGfx2(0, 0x00A, BG_PLTT_ID(13));\n        CopyBgTilemapBufferToVram(BG_INTERFACE);\n        CopyBgTilemapBufferToVram(BG_VENUSAUR);\n        CopyBgTilemapBufferToVram(BG_BONUSES);\n        sPokemonJumpGfx->mainState++;\n        break;\n    case 1:\n        if (!FreeTempTileDataBuffersIfPossible())\n        {\n            CreateJumpMonSprites();\n            CreateVineSprites(sPokemonJumpGfx);\n            UpdateVineAnim(sPokemonJumpGfx, VINE_UPSWING_LOWER);\n            ShowBg(BG_SCENERY);\n            ShowBg(BG_INTERFACE);\n            ShowBg(BG_VENUSAUR);\n            HideBg(BG_BONUSES);\n            sPokemonJumpGfx->mainState++;\n        }\n        break;\n    case 2:\n        sPokemonJumpGfx->funcFinished = TRUE;\n        break;\n    }\n}\n\nstatic void PrintPlayerNamesNoHighlight(void)\n{\n    switch (sPokemonJumpGfx->mainState)\n    {\n    case 0:\n        AddPlayerNameWindows();\n        sPokemonJumpGfx->mainState++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PrintPokeJumpPlayerNames(FALSE);\n            sPokemonJumpGfx->mainState++;\n        }\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            DrawPlayerNameWindows();\n            sPokemonJumpGfx->mainState++;\n        }\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            sPokemonJumpGfx->funcFinished = TRUE;\n        break;\n    }\n}\n\nstatic void PrintPlayerNamesWithHighlight(void)\n{\n    switch (sPokemonJumpGfx->mainState)\n    {\n    case 0:\n        AddPlayerNameWindows();\n        sPokemonJumpGfx->mainState++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PrintPokeJumpPlayerNames(TRUE);\n            sPokemonJumpGfx->mainState++;\n        }\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            DrawPlayerNameWindows();\n            sPokemonJumpGfx->mainState++;\n        }\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            sPokemonJumpGfx->funcFinished = TRUE;\n        break;\n    }\n}\n\nstatic void ErasePlayerNames(void)\n{\n    int i, numPlayers;\n\n    numPlayers = GetNumPokeJumpPlayers();\n    switch (sPokemonJumpGfx->mainState)\n    {\n    case 0:\n        for (i = 0; i < numPlayers; i++)\n            ClearWindowTilemap(sPokemonJumpGfx->nameWindowIds[i]);\n\n        CopyBgTilemapBufferToVram(BG_INTERFACE);\n        sPokemonJumpGfx->mainState++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            for (i = 0; i < numPlayers; i++)\n                RemoveWindow(sPokemonJumpGfx->nameWindowIds[i]);\n\n            sPokemonJumpGfx->funcFinished = TRUE;\n        }\n        break;\n    }\n}\n\nstatic void Msg_WantToPlayAgain(void)\n{\n    switch (sPokemonJumpGfx->mainState)\n    {\n    case 0:\n        sPokemonJumpGfx->msgWindowId = AddMessageWindow(1, 8, 20, 2);\n        AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, gText_WantToPlayAgain2, 0, 2, TEXT_SKIP_DRAW, NULL);\n        CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX);\n        sPokemonJumpGfx->mainState++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PutWindowTilemap(sPokemonJumpGfx->msgWindowId);\n            DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14);\n            CreatePokeJumpYesNoMenu(23, 7, 0);\n            CopyBgTilemapBufferToVram(BG_INTERFACE);\n            sPokemonJumpGfx->mainState++;\n        }\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            sPokemonJumpGfx->funcFinished = TRUE;\n        break;\n    }\n}\n\nstatic void Msg_SavingDontTurnOff(void)\n{\n    switch (sPokemonJumpGfx->mainState)\n    {\n    case 0:\n        sPokemonJumpGfx->msgWindowId = AddMessageWindow(2, 7, 26, 4);\n        AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, gText_SavingDontTurnOffPower, 0, 2, TEXT_SKIP_DRAW, NULL);\n        CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX);\n        sPokemonJumpGfx->mainState++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PutWindowTilemap(sPokemonJumpGfx->msgWindowId);\n            DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14);\n            CopyBgTilemapBufferToVram(BG_INTERFACE);\n            sPokemonJumpGfx->mainState++;\n        }\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            sPokemonJumpGfx->funcFinished = TRUE;\n        break;\n    }\n}\n\nstatic void EraseMessage(void)\n{\n    switch (sPokemonJumpGfx->mainState)\n    {\n    case 0:\n        ClearMessageWindow();\n        DestroyYesNoMenu();\n        CopyBgTilemapBufferToVram(BG_INTERFACE);\n        sPokemonJumpGfx->mainState++;\n        break;\n    case 1:\n        if (!RemoveMessageWindow() && !IsDma3ManagerBusyWithBgCopy())\n            sPokemonJumpGfx->funcFinished = TRUE;\n        break;\n    }\n}\n\nstatic void Msg_SomeoneDroppedOut(void)\n{\n    switch (sPokemonJumpGfx->mainState)\n    {\n    case 0:\n        sPokemonJumpGfx->msgWindowId = AddMessageWindow(2, 8, 22, 4);\n        AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, gText_SomeoneDroppedOut2, 0, 2, TEXT_SKIP_DRAW, NULL);\n        CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX);\n        sPokemonJumpGfx->mainState++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PutWindowTilemap(sPokemonJumpGfx->msgWindowId);\n            DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14);\n            CopyBgTilemapBufferToVram(BG_INTERFACE);\n            sPokemonJumpGfx->mainState++;\n        }\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            sPokemonJumpGfx->funcFinished = TRUE;\n        break;\n    }\n}\n\nstatic void Msg_CommunicationStandby(void)\n{\n    switch (sPokemonJumpGfx->mainState)\n    {\n    case 0:\n        sPokemonJumpGfx->msgWindowId = AddMessageWindow(7, 10, 16, 2);\n        AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, gText_CommunicationStandby4, 0, 2, TEXT_SKIP_DRAW, NULL);\n        CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX);\n        sPokemonJumpGfx->mainState++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PutWindowTilemap(sPokemonJumpGfx->msgWindowId);\n            DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14);\n            CopyBgTilemapBufferToVram(BG_INTERFACE);\n            sPokemonJumpGfx->mainState++;\n        }\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            sPokemonJumpGfx->funcFinished = TRUE;\n        break;\n    }\n}\n\nstatic void DoPokeJumpCountdown(void)\n{\n    switch (sPokemonJumpGfx->mainState)\n    {\n    case 0:\n        StartPokeJumpCountdown(sPokemonJumpGfx);\n        sPokemonJumpGfx->mainState++;\n        break;\n    case 1:\n        if (!IsPokeJumpCountdownRunning())\n            sPokemonJumpGfx->funcFinished = TRUE;\n        break;\n    }\n}\n\nstatic void SetUpResetVineGfx(void)\n{\n    sPokemonJumpGfx->resetVineState = 0;\n    sPokemonJumpGfx->resetVineTimer = 0;\n    sPokemonJumpGfx->vineState = VINE_UPSWING_LOWER;\n    UpdateVineSwing(sPokemonJumpGfx->vineState);\n}\n\nstatic bool32 ResetVineGfx(void)\n{\n    switch (sPokemonJumpGfx->resetVineState)\n    {\n    case 0:\n        sPokemonJumpGfx->resetVineTimer++;\n        if (sPokemonJumpGfx->resetVineTimer > 10)\n        {\n            sPokemonJumpGfx->resetVineTimer = 0;\n            sPokemonJumpGfx->vineState++;\n            if (sPokemonJumpGfx->vineState >= NUM_VINESTATES)\n            {\n                sPokemonJumpGfx->vineState = VINE_HIGHEST;\n                sPokemonJumpGfx->resetVineState++;\n            }\n        }\n        UpdateVineSwing(sPokemonJumpGfx->vineState);\n        if (sPokemonJumpGfx->vineState != VINE_UPSWING_LOW)\n            break;\n    case 1:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic const u8 sPluralTxt[] = _(\"IES\");\n\nstatic void PrintPrizeMessage(u16 itemId, u16 quantity)\n{\n    CopyItemName(itemId, sPokemonJumpGfx->itemName);\n    ConvertIntToDecimalStringN(sPokemonJumpGfx->itemQuantityStr, quantity, STR_CONV_MODE_LEFT_ALIGN, 1);\n    if (itemId >= FIRST_BERRY_INDEX && itemId < LAST_BERRY_INDEX)\n    {\n        if (quantity > 1)\n        {\n            int endi = StringLength(sPokemonJumpGfx->itemName);\n            if (endi != 0)\n            {\n                endi--;\n                endi[sPokemonJumpGfx->itemName] = EOS;\n                StringAppend(sPokemonJumpGfx->itemName, sPluralTxt);\n            }\n        }\n    }\n    DynamicPlaceholderTextUtil_Reset();\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPokemonJumpGfx->itemName);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sPokemonJumpGfx->itemQuantityStr);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(sPokemonJumpGfx->prizeMsg, gText_AwesomeWonF701F700);\n    sPokemonJumpGfx->msgWindowId = AddMessageWindow(4, 8, 22, 4);\n    AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, sPokemonJumpGfx->prizeMsg, 0, 2, TEXT_SKIP_DRAW, NULL);\n    CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX);\n    sPokemonJumpGfx->fanfare = MUS_LEVEL_UP;\n    sPokemonJumpGfx->msgWindowState = 0;\n}\n\nstatic void PrintPrizeFilledBagMessage(u16 itemId)\n{\n    CopyItemName(itemId, sPokemonJumpGfx->itemName);\n    DynamicPlaceholderTextUtil_Reset();\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPokemonJumpGfx->itemName);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(sPokemonJumpGfx->prizeMsg, gText_FilledStorageSpace2);\n    sPokemonJumpGfx->msgWindowId = AddMessageWindow(4, 8, 22, 4);\n    AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, sPokemonJumpGfx->prizeMsg, 0, 2, TEXT_SKIP_DRAW, NULL);\n    CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX);\n    sPokemonJumpGfx->fanfare = MUS_DUMMY;\n    sPokemonJumpGfx->msgWindowState = 0;\n}\n\nstatic void PrintNoRoomForPrizeMessage(u16 itemId)\n{\n    CopyItemName(itemId, sPokemonJumpGfx->itemName);\n    DynamicPlaceholderTextUtil_Reset();\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPokemonJumpGfx->itemName);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(sPokemonJumpGfx->prizeMsg, gText_CantHoldMore);\n    sPokemonJumpGfx->msgWindowId = AddMessageWindow(4, 9, 22, 2);\n    AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, FONT_NORMAL, sPokemonJumpGfx->prizeMsg, 0, 2, TEXT_SKIP_DRAW, NULL);\n    CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_GFX);\n    sPokemonJumpGfx->fanfare = MUS_DUMMY;\n    sPokemonJumpGfx->msgWindowState = 0;\n}\n\nstatic bool32 DoPrizeMessageAndFanfare(void)\n{\n    switch (sPokemonJumpGfx->msgWindowState)\n    {\n    case 0:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PutWindowTilemap(sPokemonJumpGfx->msgWindowId);\n            DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14);\n            CopyBgTilemapBufferToVram(BG_INTERFACE);\n            sPokemonJumpGfx->msgWindowState++;\n        }\n        break;\n    case 1:\n        if (IsDma3ManagerBusyWithBgCopy())\n            break;\n        if (sPokemonJumpGfx->fanfare == MUS_DUMMY)\n        {\n            sPokemonJumpGfx->msgWindowState += 2;\n            return FALSE;\n        }\n        PlayFanfare(sPokemonJumpGfx->fanfare);\n        sPokemonJumpGfx->msgWindowState++;\n    case 2:\n        if (!IsFanfareTaskInactive())\n            break;\n        sPokemonJumpGfx->msgWindowState++;\n    case 3:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic void ClearMessageWindow(void)\n{\n    if (sPokemonJumpGfx->msgWindowId != WINDOW_NONE)\n    {\n        rbox_fill_rectangle(sPokemonJumpGfx->msgWindowId);\n        CopyWindowToVram(sPokemonJumpGfx->msgWindowId, COPYWIN_MAP);\n        sPokemonJumpGfx->msgWindowState = 0;\n    }\n}\n\nstatic bool32 RemoveMessageWindow(void)\n{\n    if (sPokemonJumpGfx->msgWindowId == WINDOW_NONE)\n        return FALSE;\n\n    switch (sPokemonJumpGfx->msgWindowState)\n    {\n    case 0:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            RemoveWindow(sPokemonJumpGfx->msgWindowId);\n            sPokemonJumpGfx->msgWindowId = WINDOW_NONE;\n            sPokemonJumpGfx->msgWindowState++;\n        }\n        else\n            break;\n    case 1:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic s8 HandlePlayAgainInput(void)\n{\n    return Menu_ProcessInputNoWrapClearOnChoose();\n}\n\nstatic u32 AddMessageWindow(u32 left, u32 top, u32 width, u32 height)\n{\n    u32 windowId;\n    struct WindowTemplate window;\n\n    window.bg = BG_INTERFACE;\n    window.tilemapLeft = left;\n    window.tilemapTop = top;\n    window.width = width;\n    window.height = height;\n    window.paletteNum = 15;\n    window.baseBlock = 0x43;\n\n    windowId = AddWindow(&window);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    return windowId;\n}\n\nstatic void CreatePokeJumpYesNoMenu(u16 left, u16 top, u8 cursorPos)\n{\n    struct WindowTemplate window;\n    u8 a = cursorPos;\n\n    window.bg = BG_INTERFACE;\n    window.tilemapLeft = left;\n    window.tilemapTop = top;\n    window.width = 6;\n    window.height = 4;\n    window.paletteNum = 2;\n    window.baseBlock = 0x2B;\n\n    CreateYesNoMenu(&window, FONT_NORMAL, 0, 2, 0x00a, 13, a);\n}\n\n// \"Points\" for jump score and \"times\" for number of jumps in a row\nstatic void PrintScoreSuffixes(void)\n{\n    u8 color[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY};\n\n    PutWindowTilemap(WIN_POINTS);\n    PutWindowTilemap(WIN_TIMES);\n    FillWindowPixelBuffer(WIN_POINTS, PIXEL_FILL(0));\n    FillWindowPixelBuffer(WIN_TIMES, PIXEL_FILL(0));\n    AddTextPrinterParameterized3(WIN_POINTS, FONT_SMALL, 0, 2, color, 0, gText_SpacePoints2);\n    AddTextPrinterParameterized3(WIN_TIMES, FONT_SMALL, 0, 2, color, 0, gText_SpaceTimes3);\n}\n\n// The venusaurs in the background are actually an empty 256x512 bg with 3 pairs of venusaurs on it.\n// The below array is used to get values for where to set the bg Y to show the corresponding\n// venusaur pair in their state of swinging the vine rope\n// NEUTRAL/DOWN/UP refers to which direction the Venusaur is facing as it swings the vine\nenum {\n    VENUSAUR_NEUTRAL,\n    VENUSAUR_DOWN,\n    VENUSAUR_UP,\n};\n\nstatic const u8 sVenusaurStates[] = {\n    [VINE_HIGHEST]          = VENUSAUR_UP,\n    [VINE_DOWNSWING_HIGHER] = VENUSAUR_UP,\n    [VINE_DOWNSWING_HIGH]   = VENUSAUR_NEUTRAL,\n    [VINE_DOWNSWING_LOW]    = VENUSAUR_NEUTRAL,\n    [VINE_DOWNSWING_LOWER]  = VENUSAUR_DOWN,\n    [VINE_LOWEST]           = VENUSAUR_DOWN,\n    [VINE_UPSWING_LOWER]    = VENUSAUR_DOWN,\n    [VINE_UPSWING_LOW]      = VENUSAUR_NEUTRAL,\n    [VINE_UPSWING_HIGH]     = VENUSAUR_NEUTRAL,\n    [VINE_UPSWING_HIGHER]   = VENUSAUR_UP,\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_Digits = {gMinigameDigits_Gfx, 0, TAG_DIGITS};\nstatic const struct SpritePalette sSpritePalette_Digits = {gMinigameDigits_Pal, TAG_DIGITS};\n\nstatic const u16 sPlayerNameWindowCoords_2Players[] = {\n     6, 8,\n    16, 8\n};\nstatic const u16 sPlayerNameWindowCoords_3Players[] = {\n     6, 8,\n    11, 6,\n    16, 8\n};\nstatic const u16 sPlayerNameWindowCoords_4Players[] = {\n     2, 6,\n     6, 8,\n    16, 8,\n    20, 6\n};\nstatic const u16 sPlayerNameWindowCoords_5Players[] = {\n     2, 6,\n     6, 8,\n    11, 6,\n    16, 8,\n    20, 6\n};\n\nstatic const u16 *const sPlayerNameWindowCoords[MAX_RFU_PLAYERS - 1] =\n{\n    sPlayerNameWindowCoords_2Players,\n    sPlayerNameWindowCoords_3Players,\n    sPlayerNameWindowCoords_4Players,\n    sPlayerNameWindowCoords_5Players,\n};\n\nstatic const s16 sMonXCoords_2Players[] = {88, 152};\nstatic const s16 sMonXCoords_3Players[] = {88, 120, 152};\nstatic const s16 sMonXCoords_4Players[] = {56, 88, 152, 184};\nstatic const s16 sMonXCoords_5Players[] = {56, 88, 120, 152, 184};\n\nstatic const s16 *const sMonXCoords[MAX_RFU_PLAYERS - 1] =\n{\n    sMonXCoords_2Players,\n    sMonXCoords_3Players,\n    sMonXCoords_4Players,\n    sMonXCoords_5Players,\n};\n\nstatic void CreateJumpMonSprites(void)\n{\n    int i, y, playersCount = GetNumPokeJumpPlayers();\n    const s16 *xCoords = sMonXCoords[playersCount - 2];\n\n    for (i = 0; i < playersCount; i++)\n    {\n        struct PokemonJump_MonInfo *info = GetMonInfoByMultiplayerId(i);\n\n        y = gMonFrontPicCoords[info->species].y_offset;\n        CreateJumpMonSprite(sPokemonJumpGfx, info, *xCoords, y + 112, i);\n        CreateStarSprite(sPokemonJumpGfx, *xCoords, 112, i);\n        xCoords++;\n    }\n}\n\nstatic void SetMonSpriteY(u32 id, s16 y)\n{\n    sPokemonJumpGfx->monSprites[id]->y2 = y;\n}\n\nstatic void UpdateVineSwing(int vineState)\n{\n    UpdateVineAnim(sPokemonJumpGfx, vineState);\n    ChangeBgY(BG_VENUSAUR, (sVenusaurStates[vineState] * 5) << 13, BG_COORD_SET);\n}\n\nstatic int DoSameJumpTimeBonus(u8 flags)\n{\n    int i, numPlayers;\n\n    for (i = 0, numPlayers = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        if (flags & 1)\n        {\n            // Player was part of a synchronous jump\n            // Give a bonus to them\n            DoStarAnim(sPokemonJumpGfx, i);\n            numPlayers++;\n        }\n        flags >>= 1;\n    }\n\n    ShowBonus(numPlayers - 2);\n    return numPlayers;\n}\n\nstatic void InitDigitPrinters(void)\n{\n    struct DigitObjUtilTemplate template = {\n        .shape = SPRITE_SHAPE(8x8),\n        .size = SPRITE_SIZE(8x8),\n        .strConvMode = 0,\n        .priority = 1,\n        .oamCount = 5,\n        .xDelta = 8,\n        .x = 108,\n        .y = 6,\n        .spriteSheet = {.compressed = &sSpriteSheet_Digits},\n        .spritePal = &sSpritePalette_Digits,\n    };\n\n    DigitObjUtil_Init(NUM_WINDOWS);\n    DigitObjUtil_CreatePrinter(WIN_POINTS, 0, &template);\n\n    template.oamCount = 4;\n    template.x = 30;\n    template.y = 6;\n    DigitObjUtil_CreatePrinter(WIN_TIMES, 0, &template);\n}\n\nstatic void PrintScore(int num)\n{\n    DigitObjUtil_PrintNumOn(WIN_POINTS, num);\n}\n\nstatic void PrintJumpsInRow(u16 num)\n{\n    DigitObjUtil_PrintNumOn(WIN_TIMES, num);\n}\n\nstatic void StartMonHitShake(u8 multiplayerId)\n{\n    Gfx_StartMonHitShake(sPokemonJumpGfx, multiplayerId);\n}\n\nstatic void StartMonHitFlash(u8 multiplayerId)\n{\n    Gfx_StartMonHitFlash(sPokemonJumpGfx, multiplayerId);\n}\n\nstatic int IsMonHitShakeActive(int multiplayerId)\n{\n    return Gfx_IsMonHitShakeActive(sPokemonJumpGfx, multiplayerId);\n}\n\nstatic void StopMonHitFlash(void)\n{\n    Gfx_StopMonHitFlash(sPokemonJumpGfx);\n}\n\nstatic void ResetMonSpriteSubpriorities(void)\n{\n    Gfx_ResetMonSpriteSubpriorities(sPokemonJumpGfx);\n}\n\nstatic void StartMonIntroBounce(int multiplayerId)\n{\n    Gfx_StartMonIntroBounce(sPokemonJumpGfx, multiplayerId);\n}\n\nstatic int IsMonIntroBounceActive(void)\n{\n    return Gfx_IsMonIntroBounceActive(sPokemonJumpGfx);\n}\n\nstatic void AddPlayerNameWindows(void)\n{\n    struct WindowTemplate window;\n    int i, playersCount = GetNumPokeJumpPlayers();\n    const u16 *winCoords = sPlayerNameWindowCoords[playersCount - 2];\n\n    window.bg = BG_INTERFACE;\n    window.width = 8;\n    window.height = 2;\n    window.paletteNum = 2;\n    window.baseBlock = 0x2B;\n\n    for (i = 0; i < playersCount; i++)\n    {\n        window.tilemapLeft = winCoords[0];\n        window.tilemapTop = winCoords[1];\n        sPokemonJumpGfx->nameWindowIds[i] = AddWindow(&window);\n        ClearWindowTilemap(sPokemonJumpGfx->nameWindowIds[i]);\n        window.baseBlock += 0x10;\n        winCoords += 2;\n    }\n\n    CopyBgTilemapBufferToVram(BG_INTERFACE);\n}\n\nstatic void PrintPokeJumpPlayerName(int multiplayerId, u8 bgColor, u8 fgColor, u8 shadow)\n{\n    u32 x;\n    u8 colors[3] = {bgColor, fgColor, shadow};\n\n    FillWindowPixelBuffer(sPokemonJumpGfx->nameWindowIds[multiplayerId], PIXEL_FILL(0));\n    x = 64 - GetStringWidth(FONT_SMALL, GetPokeJumpPlayerName(multiplayerId), -1);\n    x /= 2;\n    AddTextPrinterParameterized3(sPokemonJumpGfx->nameWindowIds[multiplayerId], FONT_SMALL, x, 2, colors, TEXT_SKIP_DRAW, GetPokeJumpPlayerName(multiplayerId));\n    CopyWindowToVram(sPokemonJumpGfx->nameWindowIds[multiplayerId], COPYWIN_GFX);\n}\n\nstatic void PrintPokeJumpPlayerNames(bool32 highlightSelf)\n{\n    int i, multiplayerId, playersCount = GetNumPokeJumpPlayers();\n\n    if (!highlightSelf)\n    {\n        for (i = 0; i < playersCount; i++)\n            PrintPokeJumpPlayerName(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY);\n    }\n    else\n    {\n        // Highlight own name\n        multiplayerId = GetPokeJumpMultiplayerId();\n        for (i = 0; i < playersCount; i++)\n        {\n            if (multiplayerId != i)\n                PrintPokeJumpPlayerName(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY);\n            else\n                PrintPokeJumpPlayerName(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED);\n        }\n    }\n}\n\nstatic void DrawPlayerNameWindows(void)\n{\n    int i, playersCount = GetNumPokeJumpPlayers();\n\n    for (i = 0; i < playersCount; i++)\n        PutWindowTilemap(sPokemonJumpGfx->nameWindowIds[i]);\n    CopyBgTilemapBufferToVram(BG_INTERFACE);\n}\n\nstatic void ShowBonus(u8 bonusId)\n{\n    sPokemonJumpGfx->bonusTimer = 0;\n    ChangeBgX(BG_BONUSES, (bonusId / 2) * 256 * 256, BG_COORD_SET);\n    ChangeBgY(BG_BONUSES, (((bonusId % 2) * 256) - 40) * 256, BG_COORD_SET);\n    ShowBg(BG_BONUSES);\n    CreateTask(Task_UpdateBonus, 4);\n}\n\nstatic bool32 UpdateBonus(void)\n{\n    if (sPokemonJumpGfx->bonusTimer >= 32)\n    {\n        return FALSE;\n    }\n    else\n    {\n        ChangeBgY(BG_BONUSES, 128, BG_COORD_ADD);\n        if (++sPokemonJumpGfx->bonusTimer >= 32)\n            HideBg(BG_BONUSES);\n        return TRUE;\n    }\n}\n\nstatic void Task_UpdateBonus(u8 taskId)\n{\n    if (!UpdateBonus())\n        DestroyTask(taskId);\n}\n\nstatic const u16 sPokeJumpPal1[] = INCBIN_U16(\"graphics/pokemon_jump/pal1.gbapal\");\nstatic const u16 sPokeJumpPal2[] = INCBIN_U16(\"graphics/pokemon_jump/pal2.gbapal\");\n\nstatic const u32 sVine1_Gfx[] = INCBIN_U32(\"graphics/pokemon_jump/vine1.4bpp.lz\");\nstatic const u32 sVine2_Gfx[] = INCBIN_U32(\"graphics/pokemon_jump/vine2.4bpp.lz\");\nstatic const u32 sVine3_Gfx[] = INCBIN_U32(\"graphics/pokemon_jump/vine3.4bpp.lz\");\nstatic const u32 sVine4_Gfx[] = INCBIN_U32(\"graphics/pokemon_jump/vine4.4bpp.lz\");\n\nstatic const u32 sStar_Gfx[] = INCBIN_U32(\"graphics/pokemon_jump/star.4bpp.lz\");\n\nstatic const struct CompressedSpriteSheet sCompressedSpriteSheets[] =\n{\n    {sVine1_Gfx, 0x600, GFXTAG_VINE1},\n    {sVine2_Gfx, 0xC00, GFXTAG_VINE2},\n    {sVine3_Gfx, 0x600, GFXTAG_VINE3},\n    {sVine4_Gfx, 0x600, GFXTAG_VINE4},\n    {sStar_Gfx,  0x200, GFXTAG_STAR},\n};\n\nstatic const struct SpritePalette sSpritePalettes[] =\n{\n    {sPokeJumpPal1, PALTAG_1},\n    {sPokeJumpPal2, PALTAG_2},\n};\n\nstatic const struct OamData sOamData_JumpMon;\nstatic const struct SpriteTemplate sSpriteTemplate_Vine1;\nstatic const struct SpriteTemplate sSpriteTemplate_Vine2;\nstatic const struct SpriteTemplate sSpriteTemplate_Vine3;\nstatic const struct SpriteTemplate sSpriteTemplate_Vine4;\n\nstatic const struct SpriteTemplate sSpriteTemplate_JumpMon =\n{\n    .tileTag = TAG_MON1,\n    .paletteTag = TAG_MON1,\n    .oam = &sOamData_JumpMon,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const s16 sVineYCoords[VINE_SPRITES_PER_SIDE][NUM_VINESTATES] =\n{\n    {96, 96, 96, 114, 120, 120, 120, 114, 96, 96},\n    {70, 80, 96, 114, 120, 128, 120, 114, 96, 80},\n    {50, 72, 96, 114, 128, 136, 128, 114, 96, 72},\n    {42, 72, 96, 114, 128, 136, 128, 114, 96, 72},\n};\n\nstatic const s16 sVineXCoords[VINE_SPRITES_PER_SIDE * 2] = {16, 40, 72, 104, 136, 168, 200, 224};\n\nstatic const struct SpriteTemplate *const sSpriteTemplates_Vine[VINE_SPRITES_PER_SIDE] =\n{\n    &sSpriteTemplate_Vine1,\n    &sSpriteTemplate_Vine2,\n    &sSpriteTemplate_Vine3,\n    &sSpriteTemplate_Vine4,\n};\n\nstatic const struct OamData sOamData_JumpMon =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const struct OamData sOamData_Vine16x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x32),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const struct OamData sOamData_Vine32x32 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x32),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const struct OamData sOamData_Vine32x16 =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const union AnimCmd sAnims_Vine_Highest[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnims_Vine_Higher[] =\n{\n    ANIMCMD_FRAME(8, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnims_Vine_High[] =\n{\n    ANIMCMD_FRAME(16, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnims_Vine_Low[] =\n{\n    ANIMCMD_FRAME(24, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnims_Vine_Lower[] =\n{\n    ANIMCMD_FRAME(32, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnims_Vine_Lowest[] =\n{\n    ANIMCMD_FRAME(40, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnims_VineTall_Highest[] =\n{\n    ANIMCMD_FRAME(0, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnims_VineTall_Higher[] =\n{\n    ANIMCMD_FRAME(16, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnims_VineTall_High[] =\n{\n    ANIMCMD_FRAME(32, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnims_VineTall_Low[] =\n{\n    ANIMCMD_FRAME(48, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnims_VineTall_Lower[] =\n{\n    ANIMCMD_FRAME(64, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnims_VineTall_Lowest[] =\n{\n    ANIMCMD_FRAME(80, 1),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_Vine[] =\n{\n    sAnims_Vine_Highest,\n    sAnims_Vine_Higher,\n    sAnims_Vine_High,\n    sAnims_Vine_Low,\n    sAnims_Vine_Lower,\n    sAnims_Vine_Lowest\n};\n\n// Vine 2 needs its own set of anims because the graphic is twice as large\nstatic const union AnimCmd *const sAnims_VineTall[] =\n{\n    sAnims_VineTall_Highest,\n    sAnims_VineTall_Higher,\n    sAnims_VineTall_High,\n    sAnims_VineTall_Low,\n    sAnims_VineTall_Lower,\n    sAnims_VineTall_Lowest\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Vine1 =\n{\n    .tileTag = GFXTAG_VINE1,\n    .paletteTag = PALTAG_1,\n    .oam = &sOamData_Vine16x32,\n    .anims = sAnims_Vine,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Vine2 =\n{\n    .tileTag = GFXTAG_VINE2,\n    .paletteTag = PALTAG_1,\n    .oam = &sOamData_Vine32x32,\n    .anims = sAnims_VineTall,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Vine3 =\n{\n    .tileTag = GFXTAG_VINE3,\n    .paletteTag = PALTAG_1,\n    .oam = &sOamData_Vine32x16,\n    .anims = sAnims_Vine,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Vine4 =\n{\n    .tileTag = GFXTAG_VINE4,\n    .paletteTag = PALTAG_1,\n    .oam = &sOamData_Vine32x16,\n    .anims = sAnims_Vine,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const struct OamData sOamData_Star =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const union AnimCmd sAnim_Star_Still[] =\n{\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Star_Spinning[] =\n{\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_FRAME(4, 4),\n    ANIMCMD_FRAME(8, 4),\n    ANIMCMD_FRAME(12, 4),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_Star[] =\n{\n    sAnim_Star_Still,\n    sAnim_Star_Spinning\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Star =\n{\n    .tileTag = GFXTAG_STAR,\n    .paletteTag = PALTAG_1,\n    .oam = &sOamData_Star,\n    .anims = sAnims_Star,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic void LoadSpriteSheetsAndPalettes(struct PokemonJumpGfx *jumpGfx)\n{\n    int i;\n\n    for (i = 0; i < ARRAY_COUNT(sCompressedSpriteSheets); i++)\n        LoadCompressedSpriteSheet(&sCompressedSpriteSheets[i]);\n\n    for (i = 0; i < ARRAY_COUNT(sSpritePalettes); i++)\n        LoadSpritePalette(&sSpritePalettes[i]);\n\n    jumpGfx->vinePalNumDownswing = IndexOfSpritePaletteTag(PALTAG_1);\n    jumpGfx->vinePalNumUpswing = IndexOfSpritePaletteTag(PALTAG_2);\n}\n\nstatic void ResetPokeJumpSpriteData(struct Sprite *sprite)\n{\n    int i;\n    for (i = 0; i < (int)ARRAY_COUNT(sprite->data); i++)\n        sprite->data[i] = 0;\n}\n\nstatic void CreateJumpMonSprite(struct PokemonJumpGfx *jumpGfx, struct PokemonJump_MonInfo *monInfo, s16 x, s16 y, u8 multiplayerId)\n{\n    struct SpriteTemplate spriteTemplate;\n    struct SpriteSheet spriteSheet;\n    struct CompressedSpritePalette spritePalette;\n    u8 *buffer;\n    u8 *unusedBuffer;\n    u8 subpriority;\n    u8 spriteId;\n\n    spriteTemplate = sSpriteTemplate_JumpMon;\n    buffer = Alloc(0x2000);\n    unusedBuffer = Alloc(MON_PIC_SIZE);\n    if (multiplayerId == GetPokeJumpMultiplayerId())\n        subpriority = 3;\n    else\n        subpriority = multiplayerId + 4;\n\n    if (buffer && unusedBuffer)\n    {\n        HandleLoadSpecialPokePic(\n            &gMonFrontPicTable[monInfo->species],\n            buffer,\n            monInfo->species,\n            monInfo->personality);\n\n        spriteSheet.data = buffer;\n        spriteSheet.tag = multiplayerId;\n        spriteSheet.size = MON_PIC_SIZE;\n        LoadSpriteSheet(&spriteSheet);\n\n        spritePalette.data = GetMonSpritePalFromSpeciesAndPersonality(monInfo->species, monInfo->otId, monInfo->personality);\n        spritePalette.tag = multiplayerId;\n        LoadCompressedSpritePalette(&spritePalette);\n\n        Free(buffer);\n        Free(unusedBuffer);\n\n        spriteTemplate.tileTag += multiplayerId;\n        spriteTemplate.paletteTag += multiplayerId;\n        spriteId = CreateSprite(&spriteTemplate, x, y, subpriority);\n        if (spriteId != MAX_SPRITES)\n        {\n            jumpGfx->monSprites[multiplayerId] = &gSprites[spriteId];\n            jumpGfx->monSpriteSubpriorities[multiplayerId] = subpriority;\n            return;\n        }\n    }\n\n    jumpGfx->monSprites[multiplayerId] = NULL;\n}\n\n#define sState data[0]\n#define sTimer data[1]\n#define sOffset data[7] // Never read\n\nstatic void DoStarAnim(struct PokemonJumpGfx *jumpGfx, int multiplayerId)\n{\n    ResetPokeJumpSpriteData(jumpGfx->starSprites[multiplayerId]);\n    jumpGfx->starSprites[multiplayerId]->sOffset = jumpGfx->monSprites[multiplayerId] - gSprites;\n    jumpGfx->starSprites[multiplayerId]->invisible = FALSE;\n    jumpGfx->starSprites[multiplayerId]->y = 96;\n    jumpGfx->starSprites[multiplayerId]->callback = SpriteCB_Star;\n    StartSpriteAnim(jumpGfx->starSprites[multiplayerId], 1);\n}\n\nstatic void SpriteCB_Star(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        if (sprite->animEnded)\n        {\n            sprite->invisible = TRUE;\n            sprite->callback = SpriteCallbackDummy;\n        }\n        break;\n    case 1:\n        sprite->y--;\n        sprite->sTimer++;\n        if (sprite->y <= 72)\n        {\n            sprite->y = 72;\n            sprite->sState++;\n        }\n        break;\n    case 2:\n        if (++sprite->sTimer >= 48)\n        {\n            sprite->invisible = TRUE;\n            sprite->callback = SpriteCallbackDummy;\n        }\n        break;\n    }\n}\n\n#undef sState\n#undef sTimer\n#undef sOffset\n\nstatic void Gfx_StartMonHitShake(struct PokemonJumpGfx *jumpGfx, int multiplayerId)\n{\n    jumpGfx->monSprites[multiplayerId]->callback = SpriteCB_MonHitShake;\n    jumpGfx->monSprites[multiplayerId]->y2 = 0;\n    ResetPokeJumpSpriteData(jumpGfx->monSprites[multiplayerId]);\n}\n\nstatic bool32 Gfx_IsMonHitShakeActive(struct PokemonJumpGfx *jumpGfx, int multiplayerId)\n{\n    return jumpGfx->monSprites[multiplayerId]->callback == SpriteCB_MonHitShake;\n}\n\n#define sTimer     data[1]\n#define sNumShakes data[2]\n\nstatic void SpriteCB_MonHitShake(struct Sprite *sprite)\n{\n    if (++sprite->sTimer > 1)\n    {\n        if (++sprite->sNumShakes & 1)\n            sprite->y2 = 2;\n        else\n            sprite->y2 = -2;\n\n        sprite->sTimer = 0;\n    }\n\n    if (sprite->sNumShakes > 12)\n    {\n        sprite->y2 = 0;\n        sprite->callback = SpriteCallbackDummy;\n    }\n}\n\n#undef sTimer\n#undef sNumShakes\n\nstatic void Gfx_StartMonHitFlash(struct PokemonJumpGfx *jumpGfx, int multiplayerId)\n{\n    ResetPokeJumpSpriteData(jumpGfx->monSprites[multiplayerId]);\n    jumpGfx->monSprites[multiplayerId]->callback = SpriteCB_MonHitFlash;\n}\n\nstatic void Gfx_StopMonHitFlash(struct PokemonJumpGfx *jumpGfx)\n{\n    int i;\n    u16 numPlayers = GetNumPokeJumpPlayers();\n    for (i = 0; i < numPlayers; i++)\n    {\n        if (jumpGfx->monSprites[i]->callback == SpriteCB_MonHitFlash)\n        {\n            jumpGfx->monSprites[i]->invisible = FALSE;\n            jumpGfx->monSprites[i]->callback = SpriteCallbackDummy;\n            jumpGfx->monSprites[i]->subpriority = 10;\n        }\n    }\n}\n\n#define sTimer data[0]\n\nstatic void SpriteCB_MonHitFlash(struct Sprite *sprite)\n{\n    if (++sprite->sTimer > 3)\n    {\n        sprite->sTimer = 0;\n        sprite->invisible ^= 1;\n    }\n}\n\n#undef sTimer\n\nstatic void Gfx_ResetMonSpriteSubpriorities(struct PokemonJumpGfx *jumpGfx)\n{\n    int i;\n    u16 numPlayers = GetNumPokeJumpPlayers();\n    for (i = 0; i < numPlayers; i++)\n        jumpGfx->monSprites[i]->subpriority = jumpGfx->monSpriteSubpriorities[i];\n}\n\nstatic void Gfx_StartMonIntroBounce(struct PokemonJumpGfx *jumpGfx, int multiplayerId)\n{\n    ResetPokeJumpSpriteData(jumpGfx->monSprites[multiplayerId]);\n    jumpGfx->monSprites[multiplayerId]->callback = SpriteCB_MonIntroBounce;\n}\n\nstatic bool32 Gfx_IsMonIntroBounceActive(struct PokemonJumpGfx *jumpGfx)\n{\n    int i;\n    u16 numPlayers = GetNumPokeJumpPlayers();\n    for (i = 0; i < numPlayers; i++)\n    {\n        if (jumpGfx->monSprites[i]->callback == SpriteCB_MonIntroBounce)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\n#define sState   data[0]\n#define sHopPos  data[1]\n#define sNumHops data[2]\n\nstatic void SpriteCB_MonIntroBounce(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        PlaySE(SE_BIKE_HOP);\n        sprite->sHopPos = 0;\n        sprite->sState++;\n        // fall through\n    case 1:\n        sprite->sHopPos += 4;\n        if (sprite->sHopPos > 127)\n            sprite->sHopPos = 0;\n\n        sprite->y2 = -(gSineTable[sprite->sHopPos] >> 3);\n        if (sprite->sHopPos == 0)\n        {\n            if (++sprite->sNumHops < 2)\n                sprite->sState = 0;\n            else\n                sprite->callback = SpriteCallbackDummy;\n        }\n        break;\n    }\n}\n\n#undef sState\n#undef sHopPos\n#undef sNumHops\n\nstatic void CreateStarSprite(struct PokemonJumpGfx *jumpGfx, s16 x, s16 y, u8 multiplayerId)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_Star, x, y, 1);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].invisible = TRUE;\n        jumpGfx->starSprites[multiplayerId] = &gSprites[spriteId];\n    }\n}\n\nstatic void CreateVineSprites(struct PokemonJumpGfx *jumpGfx)\n{\n    int i;\n    int count;\n    u8 spriteId;\n\n    count = 0;\n    for (i = 0; i < VINE_SPRITES_PER_SIDE; i++)\n    {\n        spriteId = CreateSprite(sSpriteTemplates_Vine[i], sVineXCoords[count], sVineYCoords[i][0], 2);\n        jumpGfx->vineSprites[count] = &gSprites[spriteId];\n        count++;\n    }\n\n    for (i = VINE_SPRITES_PER_SIDE - 1; i >= 0; i--)\n    {\n        spriteId = CreateSprite(sSpriteTemplates_Vine[i], sVineXCoords[count], sVineYCoords[i][0], 2);\n        jumpGfx->vineSprites[count] = &gSprites[spriteId];\n        jumpGfx->vineSprites[count]->hFlip = TRUE;\n        count++;\n    }\n}\n\nstatic void UpdateVineAnim(struct PokemonJumpGfx *jumpGfx, int vineState)\n{\n    int i, count, palNum;\n    int priority;\n\n    if (vineState > VINE_LOWEST)\n    {\n        // animNums for vine on upswing are same as\n        // on downswing but in reverse\n        vineState = NUM_VINESTATES - vineState;\n        priority = 3; // Set vine behind Pokémon\n        palNum = jumpGfx->vinePalNumUpswing;\n    }\n    else\n    {\n        priority = 2; // Set vine in front of Pokémon\n        palNum = jumpGfx->vinePalNumDownswing;\n    }\n\n    count = 0;\n    for (i = 0; i < VINE_SPRITES_PER_SIDE; i++)\n    {\n        jumpGfx->vineSprites[count]->y = sVineYCoords[i][vineState];\n        jumpGfx->vineSprites[count]->oam.priority = priority;\n        jumpGfx->vineSprites[count]->oam.paletteNum = palNum;\n        StartSpriteAnim(jumpGfx->vineSprites[count], vineState);\n        count++;\n    }\n\n    for (i = VINE_SPRITES_PER_SIDE - 1; i >= 0; i--)\n    {\n        jumpGfx->vineSprites[count]->y = sVineYCoords[i][vineState];\n        jumpGfx->vineSprites[count]->oam.priority = priority;\n        jumpGfx->vineSprites[count]->oam.paletteNum = palNum;\n        StartSpriteAnim(jumpGfx->vineSprites[count], vineState);\n        count++;\n    }\n}\n\nstatic void StartPokeJumpCountdown(struct PokemonJumpGfx *jumpGfx)\n{\n    StartMinigameCountdown(GFXTAG_COUNTDOWN, PALTAG_COUNTDOWN, 120, 80, 0);\n    Gfx_ResetMonSpriteSubpriorities(jumpGfx);\n}\n\nstatic bool32 IsPokeJumpCountdownRunning(void)\n{\n    return IsMinigameCountdownRunning();\n}\n\nstatic struct PokemonJumpRecords *GetPokeJumpRecords(void)\n{\n    return &gSaveBlock2Ptr->pokeJump;\n}\n\nvoid ResetPokemonJumpRecords(void)\n{\n    struct PokemonJumpRecords *records = GetPokeJumpRecords();\n    records->jumpsInRow = 0;\n    records->bestJumpScore = 0;\n    records->excellentsInRow = 0;\n    records->gamesWithMaxPlayers = 0;\n    records->unused2 = 0;\n    records->unused1 = 0;\n}\n\nstatic bool32 TryUpdateRecords(u32 jumpScore, u16 jumpsInRow, u16 excellentsInRow)\n{\n    struct PokemonJumpRecords *records = GetPokeJumpRecords();\n    bool32 newRecord = FALSE;\n\n    if (records->bestJumpScore < jumpScore && jumpScore <= MAX_JUMP_SCORE)\n        records->bestJumpScore = jumpScore, newRecord = TRUE;\n    if (records->jumpsInRow < jumpsInRow && jumpsInRow <= MAX_JUMPS)\n        records->jumpsInRow = jumpsInRow, newRecord = TRUE;\n    if (records->excellentsInRow < excellentsInRow && excellentsInRow <= MAX_JUMPS)\n        records->excellentsInRow = excellentsInRow, newRecord = TRUE;\n\n    return newRecord;\n}\n\nstatic void IncrementGamesWithMaxPlayers(void)\n{\n    struct PokemonJumpRecords *records = GetPokeJumpRecords();\n    if (records->gamesWithMaxPlayers < 9999)\n        records->gamesWithMaxPlayers++;\n}\n\nvoid ShowPokemonJumpRecords(void)\n{\n    u8 taskId = CreateTask(Task_ShowPokemonJumpRecords, 0);\n    Task_ShowPokemonJumpRecords(taskId);\n}\n\nstatic const struct WindowTemplate sWindowTemplate_Records =\n{\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 1,\n    .width = 28,\n    .height = 9,\n    .paletteNum = 15,\n    .baseBlock = 0x1,\n};\n\nstatic const u8 *const sRecordsTexts[] = {gText_JumpsInARow, gText_BestScore2, gText_ExcellentsInARow};\n\n#define tState data[0]\n#define tWindowId data[1]\n\nstatic void Task_ShowPokemonJumpRecords(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    switch (tState)\n    {\n    case 0:\n        tWindowId = AddWindow(&sWindowTemplate_Records);\n        PrintRecordsText(tWindowId);\n        CopyWindowToVram(tWindowId, COPYWIN_FULL);\n        tState++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            tState++;\n        break;\n    case 2:\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n        {\n            rbox_fill_rectangle(tWindowId);\n            CopyWindowToVram(tWindowId, COPYWIN_MAP);\n            tState++;\n        }\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            RemoveWindow(tWindowId);\n            DestroyTask(taskId);\n            ScriptContext_Enable();\n        }\n        break;\n    }\n}\n\n#undef tState\n#undef tWindowId\n\nstatic void PrintRecordsText(u16 windowId)\n{\n    int i, x;\n    int recordNums[3];\n    struct PokemonJumpRecords *records = GetPokeJumpRecords();\n    u8 strbuf[8];\n    recordNums[0] = records->jumpsInRow;\n    recordNums[1] = records->bestJumpScore;\n    recordNums[2] = records->excellentsInRow;\n\n    LoadStdWindowGfx(windowId, 0x21D, BG_PLTT_ID(13));\n    DrawTextBorderOuter(windowId, 0x21D, 13);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    AddTextPrinterParameterized5(windowId, FONT_NORMAL, gText_PkmnJumpRecords, 0, 0, TEXT_SKIP_DRAW, NULL, 1, 0);\n    for (i = 0; i < ARRAY_COUNT(sRecordsTexts); i++)\n    {\n        AddTextPrinterParameterized5(windowId, FONT_NORMAL, sRecordsTexts[i], 0, 20 + (i * 14), TEXT_SKIP_DRAW, NULL, 1, 0);\n        ConvertIntToDecimalStringN(strbuf, recordNums[i], STR_CONV_MODE_LEFT_ALIGN, 5);\n        TruncateToFirstWordOnly(strbuf);\n        x = 0xDE - GetStringWidth(FONT_NORMAL, strbuf, 0);\n        AddTextPrinterParameterized5(windowId, FONT_NORMAL, strbuf, x, 20 + (i * 14), TEXT_SKIP_DRAW, NULL, 0, 0);\n    }\n    PutWindowTilemap(windowId);\n}\n\nstatic void TruncateToFirstWordOnly(u8 *str)\n{\n    for (;*str != EOS; str++)\n    {\n        if (*str == CHAR_SPACE)\n        {\n            *str = EOS;\n            break;\n        }\n    }\n}\n"
  },
  {
    "path": "src/pokemon_size_record.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"event_data.h\"\n#include \"pokedex.h\"\n#include \"text.h\"\n#include \"strings.h\"\n\n#define DEFAULT_MAX_SIZE 0 // was 0x8100 in Ruby/Sapphire, 0x8000 in Emerald\n\nstruct UnknownStruct\n{\n    u16 unk0;\n    u8 unk2;\n    u16 unk4;\n};\n\nstatic const struct UnknownStruct sBigMonSizeTable[] =\n{\n    {  290,   1,      0 },\n    {  300,   1,     10 },\n    {  400,   2,    110 },\n    {  500,   4,    310 },\n    {  600,  20,    710 },\n    {  700,  50,   2710 },\n    {  800, 100,   7710 },\n    {  900, 150,  17710 },\n    { 1000, 150,  32710 },\n    { 1100, 100,  47710 },\n    { 1200,  50,  57710 },\n    { 1300,  20,  62710 },\n    { 1400,   5,  64710 },\n    { 1500,   2,  65210 },\n    { 1600,   1,  65410 },\n    { 1700,   1,  65510 },\n};\n\nstatic const u8 sGiftRibbonsMonDataIds[] =\n{\n    MON_DATA_MARINE_RIBBON, MON_DATA_LAND_RIBBON, MON_DATA_SKY_RIBBON,\n    MON_DATA_COUNTRY_RIBBON, MON_DATA_NATIONAL_RIBBON, MON_DATA_EARTH_RIBBON,\n    MON_DATA_WORLD_RIBBON\n};\n\n#define CM_PER_INCH 2.54\n\nstatic u32 GetMonSizeHash(struct Pokemon * pkmn)\n{\n    u16 personality = GetMonData(pkmn, MON_DATA_PERSONALITY);\n    u16 hpIV = GetMonData(pkmn, MON_DATA_HP_IV) & 0xF;\n    u16 attackIV = GetMonData(pkmn, MON_DATA_ATK_IV) & 0xF;\n    u16 defenseIV = GetMonData(pkmn, MON_DATA_DEF_IV) & 0xF;\n    u16 speedIV = GetMonData(pkmn, MON_DATA_SPEED_IV) & 0xF;\n    u16 spAtkIV = GetMonData(pkmn, MON_DATA_SPATK_IV) & 0xF;\n    u16 spDefIV = GetMonData(pkmn, MON_DATA_SPDEF_IV) & 0xF;\n    u32 hibyte = ((attackIV ^ defenseIV) * hpIV) ^ (personality & 0xFF);\n    u32 lobyte = ((spAtkIV ^ spDefIV) * speedIV) ^ (personality >> 8);\n\n    return (hibyte << 8) + lobyte;\n}\n\nstatic u8 TranslateBigMonSizeTableIndex(u16 a)\n{\n    u32 i;\n\n    for (i = 1; i < 15; i++)\n    {\n        if (a < sBigMonSizeTable[i].unk4)\n            return i - 1;\n    }\n    return i;\n}\n\nstatic u32 GetMonSize(u16 species, u16 b)\n{\n    u64 unk2;\n    u64 unk4;\n    u64 unk0;\n    u32 height;\n    u32 var;\n\n    height = GetPokedexHeightWeight(SpeciesToNationalPokedexNum(species), 0);\n    var = TranslateBigMonSizeTableIndex(b);\n    unk0 = sBigMonSizeTable[var].unk0;\n    unk2 = sBigMonSizeTable[var].unk2;\n    unk4 = sBigMonSizeTable[var].unk4;\n    unk0 += (b - unk4) / unk2;\n    return height * unk0 / 10;\n}\n\nstatic void FormatMonSizeRecord(u8 *string, u32 size)\n{\n#ifdef UNITS_IMPERIAL\n    //Convert size from centimeters to inches\n    //In the Hoenn games, this conversion was performed using floating point values\n    size = size * 100 / 254;\n#endif\n\n    string = ConvertIntToDecimalStringN(string, size / 10, STR_CONV_MODE_LEFT_ALIGN, 8);\n    string = StringAppend(string, gText_DecimalPoint);\n    ConvertIntToDecimalStringN(string, size % 10, STR_CONV_MODE_LEFT_ALIGN, 1);\n}\n\nstatic u8 CompareMonSize(u16 species, u16 *sizeRecord)\n{\n    if (gSpecialVar_Result >= PARTY_SIZE)\n    {\n        return 0;\n    }\n    else\n    {\n        struct Pokemon * pkmn = &gPlayerParty[gSpecialVar_Result];\n\n        if (GetMonData(pkmn, MON_DATA_IS_EGG) == TRUE || GetMonData(pkmn, MON_DATA_SPECIES) != species)\n        {\n            return 1;\n        }\n        else\n        {\n            u32 oldSize;\n            u32 newSize;\n            u16 sizeParams;\n\n            *(&sizeParams) = GetMonSizeHash(pkmn);\n            newSize = GetMonSize(species, sizeParams);\n            oldSize = GetMonSize(species, *sizeRecord);\n            FormatMonSizeRecord(gStringVar3, oldSize);\n            FormatMonSizeRecord(gStringVar2, newSize);\n            if (newSize == oldSize)\n            {\n                return 4;\n            }\n            else if (newSize < oldSize)\n            {\n                return 2;\n            }\n            else\n            {\n                *sizeRecord = sizeParams;\n                return 3;\n            }\n        }\n    }\n}\n\n// Stores species name in gStringVar1, trainer's name in gStringVar2, and size in gStringVar3\nstatic void GetMonSizeRecordInfo(u16 species, u16 *sizeRecord)\n{\n    u32 size = GetMonSize(species, *sizeRecord);\n\n    FormatMonSizeRecord(gStringVar3, size);\n    StringCopy(gStringVar1, gSpeciesNames[species]);\n}\n\nvoid InitHeracrossSizeRecord(void)\n{\n    VarSet(VAR_HERACROSS_SIZE_RECORD, DEFAULT_MAX_SIZE);\n}\n\nvoid GetHeracrossSizeRecordInfo(void)\n{\n    u16 *sizeRecord = GetVarPointer(VAR_HERACROSS_SIZE_RECORD);\n\n    GetMonSizeRecordInfo(SPECIES_HERACROSS, sizeRecord);\n}\n\nvoid CompareHeracrossSize(void)\n{\n    u16 *sizeRecord = GetVarPointer(VAR_HERACROSS_SIZE_RECORD);\n\n    gSpecialVar_Result = CompareMonSize(SPECIES_HERACROSS, sizeRecord);\n}\n\nvoid InitMagikarpSizeRecord(void)\n{\n    VarSet(VAR_MAGIKARP_SIZE_RECORD, DEFAULT_MAX_SIZE);\n}\n\nvoid GetMagikarpSizeRecordInfo(void)\n{\n    u16 *sizeRecord = GetVarPointer(VAR_MAGIKARP_SIZE_RECORD);\n\n    GetMonSizeRecordInfo(SPECIES_MAGIKARP, sizeRecord);\n}\n\nvoid CompareMagikarpSize(void)\n{\n    u16 *sizeRecord = GetVarPointer(VAR_MAGIKARP_SIZE_RECORD);\n\n    gSpecialVar_Result = CompareMonSize(SPECIES_MAGIKARP, sizeRecord);\n}\n\nvoid GiveGiftRibbonToParty(u8 index, u8 ribbonId)\n{\n    s32 i;\n    bool32 gotRibbon = FALSE;\n    u8 data = 1;\n    u8 array[8];\n    memcpy(array, sGiftRibbonsMonDataIds, sizeof(sGiftRibbonsMonDataIds));\n\n    if (index < 11 && ribbonId < 65)\n    {\n        gSaveBlock1Ptr->giftRibbons[index] = ribbonId;\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            struct Pokemon * mon = &gPlayerParty[i];\n\n            if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(mon, MON_DATA_SANITY_IS_EGG))\n            {\n                SetMonData(mon, array[index], &data);\n                gotRibbon = TRUE;\n            }\n        }\n        if (gotRibbon)\n            FlagSet(FLAG_SYS_RIBBON_GET);\n    }\n}\n"
  },
  {
    "path": "src/pokemon_special_anim.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"party_menu.h\"\n#include \"pokemon_special_anim_internal.h\"\n#include \"item_use.h\"\n#include \"task.h\"\n#include \"constants/songs.h\"\n#include \"constants/items.h\"\n\n// Functions related to the special anims Pokemon\n// make when using an item on them in the field.\n\nstatic EWRAM_DATA bool32 sCancelDisabled = FALSE;\nstatic EWRAM_DATA u8 sPSATaskId = 0;\nstatic EWRAM_DATA struct PokemonSpecialAnim * sPSAWork = NULL;\n\nstatic struct PokemonSpecialAnim * AllocPSA(u8 slotId, u16 itemId, MainCallback callback);\nstatic void SetUpUseItemAnim_Normal(struct PokemonSpecialAnim * ptr);\nstatic void SetUpUseItemAnim_ForgetMoveAndLearnTMorHM(struct PokemonSpecialAnim * ptr);\nstatic void SetUpUseItemAnim_CantEvolve(struct PokemonSpecialAnim * ptr);\nstatic void Task_UseItem_Normal(u8 taskId);\nstatic void Task_ForgetMove(u8 taskId);\nstatic void Task_EvoStone_CantEvolve(u8 taskId);\nstatic void Task_UseTM_NoForget(u8 taskId);\nstatic void Task_MachineSet(u8 taskId);\nstatic void Task_CleanUp(u8 taskId);\nstatic u8 GetClosenessFromFriendship(u16 friendship);\nstatic u16 GetAnimTypeByItemId(u16 itemId);\n\nvoid StartUseItemAnim_Normal(u8 slotId, u16 itemId, MainCallback callback)\n{\n    struct PokemonSpecialAnim * ptr = AllocPSA(slotId, itemId, callback);\n    if (ptr == NULL)\n        SetMainCallback2(callback);\n    else\n        SetUpUseItemAnim_Normal(ptr);\n}\n\nvoid StartUseItemAnim_ForgetMoveAndLearnTMorHM(u8 slotId, u16 itemId, u16 moveId, MainCallback callback)\n{\n    struct PokemonSpecialAnim * ptr = AllocPSA(slotId, itemId, callback);\n    if (ptr == NULL)\n        SetMainCallback2(callback);\n    else\n    {\n        StringCopy(ptr->nameOfMoveForgotten, gMoveNames[moveId]);\n        SetUpUseItemAnim_ForgetMoveAndLearnTMorHM(ptr);\n    }\n}\n\nvoid StartUseItemAnim_CantEvolve(u8 slotId, u16 itemId, MainCallback callback)\n{\n    struct PokemonSpecialAnim * ptr = AllocPSA(slotId, itemId, callback);\n    if (ptr == NULL)\n        SetMainCallback2(callback);\n    else\n        SetUpUseItemAnim_CantEvolve(ptr);\n}\n\nstatic struct PokemonSpecialAnim * AllocPSA(u8 slotId, u16 itemId, MainCallback callback)\n{\n    struct PokemonSpecialAnim * ptr;\n    struct Pokemon * pokemon;\n    u16 moveId;\n\n    if (!gMain.inBattle)\n        ResetTasks();\n    ResetSpriteData();\n    FreeAllSpritePalettes();\n    ptr = Alloc(sizeof(struct PokemonSpecialAnim));\n    if (ptr == NULL)\n    {\n        SetMainCallback2(callback);\n        return NULL;\n    }\n    pokemon = &gPlayerParty[slotId];\n    ptr->state = 0;\n    ptr->savedCallback = callback;\n    ptr->species = GetMonData(pokemon, MON_DATA_SPECIES);\n    ptr->closeness = GetClosenessFromFriendship(GetMonData(pokemon, MON_DATA_FRIENDSHIP));\n    ptr->personality = GetMonData(pokemon, MON_DATA_PERSONALITY);\n    ptr->slotId = slotId;\n    ptr->itemId = itemId;\n    ptr->animType = GetAnimTypeByItemId(itemId);\n    ptr->pokemon = *pokemon;\n    ptr->field_00a4 = 0;\n    GetMonData(pokemon, MON_DATA_NICKNAME, ptr->nickname);\n    if (ptr->animType == 4)\n    {\n        moveId = ItemIdToBattleMoveId(itemId);\n        StringCopy(ptr->nameOfMoveToTeach, gMoveNames[moveId]);\n    }\n    return ptr;\n}\n\nstatic void VBlankCB_PSA(void)\n{\n    TransferPlttBuffer();\n    LoadOam();\n    ProcessSpriteCopyRequests();\n}\n\nstatic void CB2_PSA(void)\n{\n    RunTextPrinters();\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void SetUseItemAnimCallback(u8 taskId, TaskFunc func)\n{\n    struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);\n    ptr->state = 0;\n    gTasks[taskId].func = func;\n}\n\nstatic void SetUpUseItemAnim_Normal(struct PokemonSpecialAnim * ptr)\n{\n    u8 taskId;\n    switch (ptr->animType)\n    {\n    case 0:\n    case 1:\n    case 3:\n        taskId = CreateTask(Task_UseItem_Normal, 0);\n        break;\n    case 4:\n        taskId = CreateTask(Task_UseTM_NoForget, 0);\n        break;\n    default:\n        SetMainCallback2(ptr->savedCallback);\n        Free(ptr);\n        return;\n    }\n    ptr->cancelDisabled = FALSE;\n    SetWordTaskArg(taskId, 0, (uintptr_t)ptr);\n    SetMainCallback2(CB2_PSA);\n    sPSATaskId = taskId;\n}\n\nstatic void SetUpUseItemAnim_ForgetMoveAndLearnTMorHM(struct PokemonSpecialAnim * ptr)\n{\n    u8 taskId = CreateTask(Task_ForgetMove, 0);\n    SetWordTaskArg(taskId, 0, (uintptr_t)ptr);\n    SetMainCallback2(CB2_PSA);\n    sPSATaskId = taskId;\n    ptr->cancelDisabled = FALSE;\n}\n\nstatic void SetUpUseItemAnim_CantEvolve(struct PokemonSpecialAnim * ptr)\n{\n    u8 taskId = CreateTask(Task_EvoStone_CantEvolve, 0);\n    SetWordTaskArg(taskId, 0, (uintptr_t)ptr);\n    SetMainCallback2(CB2_PSA);\n    sPSATaskId = taskId;\n}\n\nstatic void Task_UseItem_Normal(u8 taskId)\n{\n    struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);\n    if (!ptr->cancelDisabled && JOY_HELD(A_BUTTON | B_BUTTON))\n    {\n        PSA_UseItem_CleanUpForCancel();\n        SetUseItemAnimCallback(taskId, Task_CleanUp);\n        return;\n    }\n\n    switch (ptr->state)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType);\n        PSA_CreateMonSpriteAtCloseness(0);\n        ptr->state++;\n        break;\n    case 1:\n        if (!PokemonSpecialAnimSceneInitIsNotFinished())\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n            ptr->state++;\n            SetVBlankCallback(VBlankCB_PSA);\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            ptr->state++;\n        }\n        break;\n    case 3:\n        PSA_SetUpZoomAnim(ptr->closeness);\n        ptr->state++;\n        break;\n    case 4:\n        if (!PSA_IsZoomTaskActive())\n        {\n            ptr->delayTimer = 0;\n            ptr->state++;\n        }\n        break;\n    case 5:\n        if (!PSA_LevelUpVerticalSpritesTaskIsRunning())\n        {\n            ptr->state++;\n        }\n        break;\n    case 6:\n        PSA_SetUpItemUseOnMonAnim(ptr->itemId, ptr->closeness, TRUE);\n        ptr->state++;\n        break;\n    case 7:\n        if (!PSA_IsItemUseOnMonAnimActive())\n        {\n            ptr->cancelDisabled = TRUE;\n            if (ptr->closeness == 3)\n            {\n                PlayCry_Normal(ptr->species, 0);\n            }\n            PSA_ShowMessageWindow();\n            ptr->state++;\n        }\n        break;\n    case 8:\n        PSA_PrintMessage(PSA_TEXT_ITEM_USED);\n        ptr->state++;\n        break;\n    case 9:\n        if (!PSA_IsMessagePrintTaskActive())\n        {\n            ptr->state++;\n        }\n        break;\n    case 10:\n        PSA_SetUpZoomAnim(0);\n        ptr->state++;\n        break;\n    case 11:\n        if (!PSA_IsZoomTaskActive())\n        {\n            ptr->cancelDisabled = TRUE;\n            ptr->state++;\n        }\n        break;\n    case 12:\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n        {\n            if (CheckIfItemIsTMHMOrEvolutionStone(ptr->itemId) != 2) // evo stone\n            {\n                BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);\n                ptr->state++;\n            }\n            else\n            {\n                ptr->state += 2;\n            }\n        }\n        break;\n    case 13:\n        if (!gPaletteFade.active)\n        {\n            ptr->state++;\n        }\n        break;\n    case 14:\n        SetMainCallback2(ptr->savedCallback);\n        PSA_FreeWindowBuffers();\n        Free(ptr);\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void Task_ForgetMove(u8 taskId)\n{\n    struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);\n    u8 r4;\n\n    switch (ptr->state)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType);\n        PSA_CreateMonSpriteAtCloseness(3);\n        ptr->state++;\n        break;\n    case 1:\n        if (!PokemonSpecialAnimSceneInitIsNotFinished())\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n            ptr->state++;\n            SetVBlankCallback(VBlankCB_PSA);\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            ptr->delayTimer = 0;\n            ptr->state++;\n        }\n        break;\n    case 3:\n        ptr->delayTimer++;\n        if (ptr->delayTimer > 30)\n        {\n            PSA_ShowMessageWindow();\n            ptr->state++;\n        }\n        break;\n    case 4:\n        PSA_PrintMessage(PSA_TEXT_FORGET_1);\n        ptr->state++;\n        break;\n    case 5:\n        if (!PSA_IsMessagePrintTaskActive())\n        {\n            ptr->delayTimer = 0;\n            ptr->state++;\n        }\n        break;\n    case 6:\n        ptr->delayTimer++;\n        if (ptr->delayTimer > 30)\n        {\n            PSA_PrintMessage(PSA_TEXT_FORGET_2_AND);\n            ptr->state++;\n        }\n        break;\n    case 7:\n        if (!PSA_IsMessagePrintTaskActive())\n        {\n            ptr->delayTimer = 0;\n            ptr->state++;\n        }\n        break;\n    case 8:\n        ptr->delayTimer++;\n        if (ptr->delayTimer > 30)\n        {\n            PlaySE(SE_M_SPIT_UP);\n            PSA_PrintMessage(PSA_TEXT_FORGET_POOF);\n            PSA_DarkenMonSprite();\n            ptr->state++;\n        }\n        break;\n    case 9:\n        r4 = PSA_RunPoofAnim();\n        if (!(r4 | PSA_IsMessagePrintTaskActive()))\n        {\n            PSA_AfterPoof_ClearMessageWindow();\n            ptr->state++;\n        }\n        break;\n    case 10:\n        PSA_PrintMessage(PSA_TEXT_FORGET_FORGOT);\n        ptr->state++;\n        break;\n    case 11:\n        if (!PSA_IsMessagePrintTaskActive())\n        {\n            PSA_PrintMessage(PSA_TEXT_FORGET_AND);\n            ptr->state++;\n        }\n        break;\n    case 12:\n        if (!PSA_IsMessagePrintTaskActive())\n        {\n            PSA_HideMessageWindow();\n            ptr->state++;\n        }\n        break;\n    case 13:\n        SetUseItemAnimCallback(taskId, Task_MachineSet);\n        break;\n    }\n}\n\nstatic void Task_EvoStone_CantEvolve(u8 taskId)\n{\n    struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);\n\n    if (!ptr->cancelDisabled && JOY_HELD(B_BUTTON))\n    {\n        SetUseItemAnimCallback(taskId, Task_CleanUp);\n        return;\n    }\n\n    switch (ptr->state)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType);\n        PSA_CreateMonSpriteAtCloseness(0);\n        ptr->state++;\n        break;\n    case 1:\n        if (!PokemonSpecialAnimSceneInitIsNotFinished())\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n            ptr->state++;\n            SetVBlankCallback(VBlankCB_PSA);\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            ptr->state++;\n        }\n        break;\n    case 3:\n        PSA_SetUpZoomAnim(ptr->closeness);\n        ptr->state++;\n        break;\n    case 4:\n        PSA_SetUpItemUseOnMonAnim(ptr->itemId, ptr->closeness, FALSE);\n        ptr->state++;\n        break;\n    case 5:\n        if (!PSA_IsItemUseOnMonAnimActive())\n        {\n            PSA_ShowMessageWindow();\n            ptr->state++;\n        }\n        break;\n    case 6:\n        PSA_PrintMessage(PSA_TEXT_HUH);\n        ptr->state++;\n        break;\n    case 7:\n        if (!PSA_IsMessagePrintTaskActive())\n        {\n            ptr->cancelDisabled = TRUE;\n            ptr->state++;\n        }\n        break;\n    case 8:\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);\n            ptr->state++;\n        }\n        break;\n    case 9:\n        if (!gPaletteFade.active)\n        {\n            SetMainCallback2(ptr->savedCallback);\n            PSA_FreeWindowBuffers();\n            Free(ptr);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void Task_UseTM_NoForget(u8 taskId)\n{\n    struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);\n\n    if (JOY_NEW(B_BUTTON))\n    {\n        SetUseItemAnimCallback(taskId, Task_CleanUp);\n        return;\n    }\n\n    switch (ptr->state)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType);\n        PSA_CreateMonSpriteAtCloseness(3);\n        ptr->state++;\n        break;\n    case 1:\n        if (!PokemonSpecialAnimSceneInitIsNotFinished())\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n            ptr->state++;\n            SetVBlankCallback(VBlankCB_PSA);\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            ptr->delayTimer = 0;\n            ptr->state++;\n        }\n        break;\n    case 3:\n        ptr->delayTimer++;\n        if (ptr->delayTimer > 20)\n        {\n            SetUseItemAnimCallback(taskId, Task_MachineSet);\n        }\n        break;\n    }\n}\n\nstatic void Task_MachineSet(u8 taskId)\n{\n    struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);\n\n    if (!ptr->cancelDisabled && JOY_NEW(B_BUTTON))\n    {\n        PSA_UseTM_CleanUpForCancel();\n        SetUseItemAnimCallback(taskId, Task_CleanUp);\n        return;\n    }\n\n    switch (ptr->state)\n    {\n    case 0:\n        CreateItemIconSpriteAtMaxCloseness(ptr->itemId);\n        ptr->delayTimer = 0;\n        ptr->state++;\n        break;\n    case 1:\n        PSA_ShowMessageWindow();\n        PSA_PrintMessage(PSA_TEXT_MACHINE_SET);\n        ptr->state++;\n        break;\n    case 2:\n        if (!PSA_IsMessagePrintTaskActive())\n        {\n            PSA_HideMessageWindow();\n            ptr->state++;\n        }\n        break;\n    case 3:\n        PSA_UseTM_SetUpMachineSetWobble();\n        ptr->state++;\n        break;\n    case 4:\n        if (!PSA_UseTM_RunMachineSetWobble())\n        {\n            ptr->state++;\n        }\n        break;\n    case 5:\n        PSA_UseTM_SetUpZoomOutAnim();\n        ptr->state++;\n        break;\n    case 6:\n        if (!PSA_UseTM_RunZoomOutAnim())\n        {\n            ptr->delayTimer = 0;\n            ptr->state++;\n        }\n        break;\n    case 7:\n        ptr->delayTimer++;\n        if (ptr->delayTimer > 30)\n        {\n            PSA_ShowMessageWindow();\n            PSA_PrintMessage(PSA_TEXT_LEARNED_MOVE);\n            ptr->state++;\n        }\n        break;\n    case 8:\n        if (!PSA_IsMessagePrintTaskActive())\n        {\n            PlayFanfare(MUS_LEVEL_UP);\n            ptr->cancelDisabled = TRUE;\n            ptr->state++;\n        }\n        break;\n    case 9:\n        if (IsFanfareTaskInactive())\n        {\n            SetUseItemAnimCallback(taskId, Task_CleanUp);\n        }\n        break;\n    }\n}\n\nstatic void Task_CleanUp(u8 taskId)\n{\n    struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);\n\n    switch (ptr->state)\n    {\n    case 0:\n        SetVBlankCallback(VBlankCB_PSA);\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        ptr->state++;\n        break;\n    case 1:\n        if (!gPaletteFade.active && (ptr->field_00a4 != 1 || IsCryFinished()))\n        {\n            sCancelDisabled = ptr->cancelDisabled;\n            SetMainCallback2(ptr->savedCallback);\n            DestroyTask(taskId);\n            PSA_FreeWindowBuffers();\n            Free(ptr);\n        }\n        break;\n    }\n}\n\nstatic const struct {\n    u16 itemId;\n    u16 animType;\n} sItemAnimMap[2] = {\n    {ITEM_RARE_CANDY, 0},\n    {ITEM_POTION,     1}\n};\n\nstatic u16 GetAnimTypeByItemId(u16 itemId)\n{\n    int i;\n\n    for (i = 0; i < ARRAY_COUNT(sItemAnimMap); i++)\n    {\n        if (sItemAnimMap[i].itemId == itemId)\n            return sItemAnimMap[i].animType;\n    }\n\n    if (itemId >= ITEM_TM01 && itemId <= ITEM_HM08)\n    {\n        return 4;\n    }\n\n    return 0;\n}\n\nstatic u8 GetClosenessFromFriendship(u16 friendship)\n{\n    if (friendship <= 100)\n        return 0;\n    else if (friendship <= 150)\n        return 1;\n    else if (friendship <= 200)\n        return 2;\n    else\n        return 3;\n}\n\nstruct PokemonSpecialAnim * GetPSAStruct(void)\n{\n    return (void *)GetWordTaskArg(sPSATaskId, 0);\n}\n\nstruct Pokemon * PSA_GetPokemon(void)\n{\n    sPSAWork = GetPSAStruct();\n    return &sPSAWork->pokemon;\n}\n\nstruct PokemonSpecialAnimScene * PSA_GetSceneWork(void)\n{\n    return &GetPSAStruct()->sceneResources;\n}\n\nu16 PSA_GetItemId(void)\n{\n    return GetPSAStruct()->itemId;\n}\n\nu8 *PSA_GetNameOfMoveForgotten(void)\n{\n    return GetPSAStruct()->nameOfMoveForgotten;\n}\n\nu8 *PSA_GetNameOfMoveToTeach(void)\n{\n    return GetPSAStruct()->nameOfMoveToTeach;\n}\n\nu8 *PSA_CopyMonNickname(u8 *dest)\n{\n    return StringCopy(dest, GetPSAStruct()->nickname);\n}\n\nu8 *PSA_GetMonNickname(void)\n{\n    return GetPSAStruct()->nickname;\n}\n\nu8 PSA_GetAnimType(void)\n{\n    return GetPSAStruct()->animType;\n}\n\nu16 PSA_GetMonSpecies(void)\n{\n    return GetPSAStruct()->species;\n}\n\nu32 PSA_GetMonPersonality(void)\n{\n    return GetPSAStruct()->personality;\n}\n\nvoid GetMonLevelUpWindowStats(struct Pokemon * pokemon, u16 *data)\n{\n    data[0] = GetMonData(pokemon, MON_DATA_MAX_HP);\n    data[1] = GetMonData(pokemon, MON_DATA_ATK);\n    data[2] = GetMonData(pokemon, MON_DATA_DEF);\n    data[3] = GetMonData(pokemon, MON_DATA_SPEED);\n    data[4] = GetMonData(pokemon, MON_DATA_SPATK);\n    data[5] = GetMonData(pokemon, MON_DATA_SPDEF);\n}\n\nbool32 PSA_IsCancelDisabled(void)\n{\n    return sCancelDisabled;\n}\n"
  },
  {
    "path": "src/pokemon_special_anim_scene.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"decompress.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"item.h\"\n#include \"item_menu_icons.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"pokemon_special_anim_internal.h\"\n#include \"random.h\"\n#include \"strings.h\"\n#include \"text_window.h\"\n#include \"trig.h\"\n#include \"constants/songs.h\"\n\nstatic void LoadBgGfxByAnimType(u16 animType);\nstatic void Task_ZoomAnim(u8 taskId);\nstatic void SetSpriteWithCloseness(struct Sprite *sprite, u8 closeness);\nstatic bool8 IsZoomSpriteCBActive(struct Sprite *sprite);\nstatic void MonSpriteZoom_UpdateYPos(struct Sprite *sprite, u8 closeness);\nstatic void ItemSpriteZoom_UpdateYPos(struct Sprite *sprite, u8 closeness);\nstatic void StartMonWiggleAnim(struct PokemonSpecialAnimScene * scene, u8 frameLen, u8 niter, u8 amplitude);\nstatic void StopMonWiggleAnim(struct PokemonSpecialAnimScene * scene);\nstatic void SpriteCallback_MonSpriteWiggle(struct Sprite *sprite);\nstatic void LoadMonSpriteGraphics(u16 *tilees, u16 *palette);\nstatic struct Sprite *PSA_CreateItemIconObject(u16 itemId);\nstatic u16 GetBlendColorByItemId(u16 itemId);\nstatic void Task_ItemUseOnMonAnim(u8 taskId);\nstatic void CreateSprites_UseItem_OutwardSpiralDots(u8 taskId, s16 *data, struct Sprite *sprite);\nstatic void SpriteCB_OutwardSpiralDots(struct Sprite *sprite);\nstatic void InitItemIconSpriteState(struct PokemonSpecialAnimScene * scene, struct Sprite *sprite, u8 closeness);\nstatic void MachineSetWobbleInit(void);\nstatic void MachineSetWobble_SetCB(struct Sprite *sprite);\nstatic bool8 MachineSetWobbleCBIsRunning(void);\nstatic void SpriteCB_MachineSetWobble(struct Sprite *sprite);\nstatic void StartZoomOutAnimForUseTM(u8 closeness);\nstatic void CreateStarSprites(struct PokemonSpecialAnimScene * scene);\nstatic bool8 AnyStarSpritesActive(void);\nstatic void SpriteCB_Star(struct Sprite *sprite);\nstatic void PSAScene_SeedRandomInTask(struct PokemonSpecialAnimScene * scene);\nstatic void StopMakingOutwardSpiralDots(void);\nstatic void Task_UseItem_OutwardSpiralDots(u8 taskId);\nstatic u16 PSAScene_RandomFromTask(u8 taskId);\nstatic void SpriteCallback_UseItem_OutwardSpiralDots(struct Sprite *sprite);\nstatic void LoadOutwardSpiralDotsGfx(void);\nstatic bool32 IsOutwardSpiralDotsTaskRunning(void);\nstatic void Task_LevelUpVerticalSprites(u8 taskId);\nstatic void CreateLevelUpVerticalSprite(u8 taskId, s16 *data);\nstatic void SpriteCB_LevelUpVertical(struct Sprite *sprite);\n\nstatic const u16 sBg_Pal[] = INCBIN_U16(\"graphics/pokemon_special_anim/bg.gbapal\");\nstatic const u16 sBg_TmHm_Pal[] = INCBIN_U16(\"graphics/pokemon_special_anim/bg_tm_hm.gbapal\");\nstatic const u32 sBg_Gfx[] = INCBIN_U32(\"graphics/pokemon_special_anim/bg.4bpp.lz\");\nstatic const u32 sBg_Tilemap[] = INCBIN_U32(\"graphics/pokemon_special_anim/bg.bin.lz\");\nstatic const u16 sLevelUp_Pal[] = INCBIN_U16(\"graphics/pokemon_special_anim/level_up.gbapal\");\nstatic const u32 sLevelUp_Gfx[] = INCBIN_U32(\"graphics/pokemon_special_anim/level_up.4bpp.lz\");\nstatic const u16 sStar_Pal[] = INCBIN_U16(\"graphics/pokemon_special_anim/star.gbapal\");\nstatic const u32 sStar_Gfx[] = INCBIN_U32(\"graphics/pokemon_special_anim/star.4bpp.lz\");\nstatic const u16 sOutwardSpiralDots_Pal[] = INCBIN_U16(\"graphics/pokemon_special_anim/outward_spiral_dots.gbapal\");\nstatic const u32 sOutwardSpiralDots_Gfx[] = INCBIN_U32(\"graphics/pokemon_special_anim/outward_spiral_dots.4bpp.lz\");\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x001\n    }, {\n        .bg = 3,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 28,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 15,\n        .width = 28,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x00a\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const u8 *const s1_2_and_Poof_textPtrs[] = {\n    gText_Counting_1,\n    gText_Counting_2And,\n    gText_Poof,\n};\n\nstatic const u16 sUnusedArray[] = {\n    0, 16, 68\n};\n\nstatic const u16 sAffineScales[] = {\n    0x100,\n    0x155,\n    0x1AA,\n    0x200\n};\n\nstatic const s8 sStarCoordOffsets[][2] = {\n    {-8,  -8},\n    { 6, -13},\n    { 8,  -8}\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_Star = {\n    sStar_Gfx,\n    0x80,\n    2\n};\n\nstatic const struct SpritePalette sSpritePalette_Star = {\n    sStar_Pal,\n    2\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_UseItem_OutwardSpiralDots = {\n    sOutwardSpiralDots_Gfx,\n    0x60,\n    5\n};\n\nstatic const struct SpritePalette sSpritePalette_UseItem_OutwardSpiralDots = {\n    sOutwardSpiralDots_Pal,\n    5\n};\n\nstatic const struct OamData sOamData_MonSprite = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_DOUBLE,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\n\nstatic const union AffineAnimCmd sAffineAnim_Zoom_0[] = {\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Zoom_1[] = {\n    AFFINEANIMCMD_FRAME(0x155, 0x155, 0, 0),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Zoom_2[] = {\n    AFFINEANIMCMD_FRAME(0x1AA, 0x1AA, 0, 0),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Zoom_3[] = {\n    AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sAffineAnimTable_Zoom[] = {\n    sAffineAnim_Zoom_0,\n    sAffineAnim_Zoom_1,\n    sAffineAnim_Zoom_2,\n    sAffineAnim_Zoom_3\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_MonSprite = {\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &sOamData_MonSprite,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnimTable_Zoom,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ItemZoom_0[] = {\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),\n    AFFINEANIMCMD_FRAME(-28, -28, 0, 8),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ItemZoom_1[] = {\n    AFFINEANIMCMD_FRAME(0x155, 0x155, 0, 0),\n    AFFINEANIMCMD_FRAME(-37, -37, 0, 8),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ItemZoom_2[] = {\n    AFFINEANIMCMD_FRAME(0x1AA, 0x1AA, 0, 0),\n    AFFINEANIMCMD_FRAME(-47, -47, 0, 8),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ItemZoom_3[] = {\n    AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),\n    AFFINEANIMCMD_FRAME(-56, -56, 0, 8),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sAffineAnimTable_ItemZoom[] = {\n    sAffineAnim_ItemZoom_0,\n    sAffineAnim_ItemZoom_1,\n    sAffineAnim_ItemZoom_2,\n    sAffineAnim_ItemZoom_3\n};\n\nstatic const struct OamData sOamData_LevelUpVertical = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x16),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_LevelUpVertical[] = {\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnimTable_LevelUpVertical[] = {\n    sAnim_LevelUpVertical\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_LevelUpVertical = {\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &sOamData_LevelUpVertical,\n    .anims = sAnimTable_LevelUpVertical,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_LevelUpVertical\n};\n\nstatic const struct OamData sOamData_Star = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Star = {\n    .tileTag = 2,\n    .paletteTag = 2,\n    .oam = &sOamData_Star,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_Star\n};\n\nstatic const struct OamData sOamData_UseItem_OutwardSpiralDots = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0x000,\n    .priority = 0,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_UseItem_OutwardSpiralDots_0[] = {\n    ANIMCMD_FRAME(0, 16),\n    ANIMCMD_FRAME(1,  8),\n    ANIMCMD_FRAME(2,  4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_UseItem_OutwardSpiralDots_1[] = {\n    ANIMCMD_FRAME(1, 4),\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnimTable_UseItem_OutwardSpiralDots[] = {\n    sAnim_UseItem_OutwardSpiralDots_0,\n    sAnim_UseItem_OutwardSpiralDots_1\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_UseItem_OutwardSpiralDots = {\n    .tileTag = 5,\n    .paletteTag = 5,\n    .oam = &sOamData_UseItem_OutwardSpiralDots,\n    .anims = sAnimTable_UseItem_OutwardSpiralDots,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallback_UseItem_OutwardSpiralDots\n};\n\nvoid InitPokemonSpecialAnimScene(struct PokemonSpecialAnimScene * buffer, u16 animType)\n{\n    FreeAllWindowBuffers();\n    ResetTempTileDataBuffers();\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));\n    InitWindows(sWindowTemplates);\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n    SetBgTilemapBuffer(0, buffer->field_0914);\n    SetBgTilemapBuffer(3, buffer->field_1914);\n    RequestDma3Fill(0, (void *)BG_VRAM, 0x20, DMA3_32BIT);\n    FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 32, 32);\n    LoadBgGfxByAnimType(animType);\n    FillWindowPixelBuffer(0, PIXEL_FILL(0));\n    LoadUserWindowGfx(0, 0x000, BG_PLTT_ID(14));\n    CopyWindowToVram(0, COPYWIN_FULL);\n    ShowBg(0);\n    ShowBg(3);\n    HideBg(1);\n    HideBg(2);\n    CopyBgTilemapBufferToVram(0);\n    CopyBgTilemapBufferToVram(3);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n}\n\nbool8 PokemonSpecialAnimSceneInitIsNotFinished(void)\n{\n    if (!FreeTempTileDataBuffersIfPossible())\n        return IsDma3ManagerBusyWithBgCopy();\n    else\n        return TRUE;\n}\n\nvoid PSA_FreeWindowBuffers(void)\n{\n    FreeAllWindowBuffers();\n}\n\nvoid PSA_ShowMessageWindow(void)\n{\n    PutWindowTilemap(0);\n    FillWindowPixelBuffer(0, PIXEL_FILL(1));\n    DrawTextBorderOuter(0, 0x001, 14);\n    CopyWindowToVram(0, COPYWIN_FULL);\n}\n\nvoid PSA_HideMessageWindow(void)\n{\n    ClearWindowTilemap(0);\n    ClearStdWindowAndFrameToTransparent(0, FALSE);\n    CopyWindowToVram(0, COPYWIN_MAP);\n}\n\nvoid PSA_PrintMessage(u8 messageId)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    u16 itemId = PSA_GetItemId();\n    u16 strWidth = 0;\n    u8 textSpeed = GetTextSpeedSetting();\n    struct Pokemon * pokemon = PSA_GetPokemon();\n    u16 level;\n    u8 *str;\n\n    switch (messageId)\n    {\n    case 0: // Item was used on Mon\n        str = StringCopy(scene->textBuf, ItemId_GetName(itemId));\n        str = StringCopy(str, gText_WasUsedOn);\n        GetMonData(pokemon, MON_DATA_NICKNAME, str);\n        StringAppend(scene->textBuf, gText_Period);\n        break;\n    case 1: // Mon's level was elevated to level\n        level = GetMonData(pokemon, MON_DATA_LEVEL);\n        GetMonData(pokemon, MON_DATA_NICKNAME, scene->textBuf);\n        str = StringAppend(scene->textBuf, gText_LevelRoseTo);\n        if (level < MAX_LEVEL)\n            level++;\n        str = ConvertIntToDecimalStringN(str, level, STR_CONV_MODE_LEFT_ALIGN, level < MAX_LEVEL ? 2 : 3);\n        StringAppend(str, gText_Period2);\n        break;\n    case 9: // Mon learned move\n        DynamicPlaceholderTextUtil_Reset();\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, PSA_GetMonNickname());\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, PSA_GetNameOfMoveToTeach());\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(scene->textBuf, gText_MonLearnedTMHM);\n        break;\n    case 4:\n        strWidth += GetStringWidth(FONT_NORMAL, gText_Counting_2And, -1);\n        // fallthrough\n    case 3:\n        strWidth += GetStringWidth(FONT_NORMAL, gText_Counting_1, -1);\n        // fallthrough\n    case 2: // 1\n        StringCopy(scene->textBuf, s1_2_and_Poof_textPtrs[messageId - 2]);\n        textSpeed = 1;\n        break;\n    case 5:\n        DynamicPlaceholderTextUtil_Reset();\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, PSA_GetMonNickname());\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, PSA_GetNameOfMoveForgotten());\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(scene->textBuf, gText_MonForgotMove);\n        break;\n    case 6:\n        StringCopy(scene->textBuf, gText_And);\n        break;\n    case 7:\n        StringCopy(scene->textBuf, gText_MachineSet);\n        break;\n    case 8:\n        StringCopy(scene->textBuf, gText_Huh);\n        break;\n    default:\n        return;\n    }\n\n    AddTextPrinterParameterized5(0, FONT_NORMAL, scene->textBuf, strWidth, 0, textSpeed, NULL, 0, 4);\n}\n\nvoid PSA_AfterPoof_ClearMessageWindow(void)\n{\n    FillWindowPixelBuffer(0, PIXEL_FILL(1));\n    CopyWindowToVram(0, COPYWIN_GFX);\n}\n\nbool8 PSA_IsMessagePrintTaskActive(void)\n{\n    return IsTextPrinterActive(0);\n}\n\nvoid PSA_DarkenMonSprite(void)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    scene->state = 0;\n    BlendPalettes((0x10000 << IndexOfSpritePaletteTag(0)) | 4, 16, RGB_BLACK);\n    CreateStarSprites(scene);\n}\n\nbool8 PSA_RunPoofAnim(void)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n\n    switch (scene->state)\n    {\n    case 0:\n        if (!AnyStarSpritesActive())\n        {\n            BeginNormalPaletteFade((0x10000 << IndexOfSpritePaletteTag(0)) | 4, -1, 16, 0, RGB_BLACK);\n            scene->state++;\n        }\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n            return FALSE;\n        break;\n    }\n    return TRUE;\n}\n\nvoid PSA_UseTM_SetUpZoomOutAnim(void)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    scene->state = 0;\n}\n\nvoid PSA_UseTM_CleanUpForCancel(void)\n{\n    StopMakingOutwardSpiralDots();\n    ResetPaletteFadeControl();\n}\n\nbool8 PSA_UseTM_RunZoomOutAnim(void)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    switch (scene->state)\n    {\n    case 0:\n        StartZoomOutAnimForUseTM(0);\n        scene->state++;\n        break;\n    case 1:\n        if (!PSA_IsZoomTaskActive())\n        {\n            scene->field_0004 = 0;\n            scene->state++;\n        }\n        break;\n    case 2:\n        scene->field_0004++;\n        if (scene->field_0004 > 20)\n            scene->state++;\n        break;\n    case 3:\n        StartMonWiggleAnim(scene, 1, 0, 1);\n        scene->field_0004 = 0;\n        scene->state++;\n        break;\n    case 4:\n        scene->field_0004++;\n        if (scene->field_0004 > 0)\n        {\n            scene->field_0004 = 0;\n            PlaySE(SE_M_MEGA_KICK);\n            BeginNormalPaletteFade(0x00000001, 2, 0, 12, RGB(8, 13, 31));\n            PSAScene_SeedRandomInTask(scene);\n            scene->state++;\n        }\n        break;\n    case 5:\n        scene->field_0004++;\n        if (scene->field_0004 > 70)\n        {\n            StopMonWiggleAnim(scene);\n            BeginNormalPaletteFade(0x00000001, 6, 12, 0, RGB(8, 13, 31));\n            scene->field_0004 = 0;\n            scene->state++;\n        }\n        break;\n    case 6:\n        scene->field_0004++;\n        if (!IsOutwardSpiralDotsTaskRunning() && scene->field_0004 > 40)\n        {\n            scene->field_0004 = 0;\n            scene->state++;\n        }\n        break;\n    case 7:\n        scene->field_0004++;\n        if (scene->field_0004 > 20)\n        {\n            scene->state++;\n        }\n        break;\n    case 8:\n        PlaySE(SE_EXP_MAX);\n        DestroySprite(scene->itemIconSprite);\n        scene->state++;\n        break;\n    default:\n        return FALSE;\n    }\n    return TRUE;\n}\n\nvoid PSA_UseTM_SetUpMachineSetWobble(void)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    scene->state = 0;\n}\n\nbool8 PSA_UseTM_RunMachineSetWobble(void)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n\n    switch (scene->state)\n    {\n    case 0:\n        MachineSetWobbleInit();\n        PlaySE(SE_SWITCH);\n        scene->state++;\n        break;\n    case 1:\n        return MachineSetWobbleCBIsRunning();\n    }\n    return TRUE;\n}\n\n// There may once have been plans to put the battle level up\n// anim in with using Rare Candy, but they were scrapped\n// at a later stage of development\n\n// Unused\nvoid PSA_CreateLevelUpVerticalSpritesTask(void)\n{\n    CreateLevelUpVerticalSpritesTask(120, 56, 4, 4, 2, 0);\n}\n\nbool8 PSA_LevelUpVerticalSpritesTaskIsRunning(void)\n{\n    return LevelUpVerticalSpritesTaskIsRunning();\n}\n\n// Unused\nvoid PSA_DrawLevelUpWindowPg1(u16 *statsBefore, u16 *statsAfter)\n{\n    DrawTextBorderOuter(1, 0x001, 14);\n    DrawLevelUpWindowPg1(1, statsBefore, statsAfter, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY);\n    PutWindowTilemap(1);\n    CopyWindowToVram(1, COPYWIN_FULL);\n}\n\n// Unused\nvoid PSA_DrawLevelUpWindowPg2(u16 *currStats)\n{\n    DrawLevelUpWindowPg2(1, currStats, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY);\n    CopyWindowToVram(1, COPYWIN_GFX);\n}\n\n// Unused\nbool8 PSA_IsCopyingLevelUpWindowToVram(void)\n{\n    return IsDma3ManagerBusyWithBgCopy();\n}\n\nstatic void LoadBgGfxByAnimType(u16 animType)\n{\n    CopyToBgTilemapBuffer(3, sBg_Tilemap, 0, 0x000);\n    DecompressAndCopyTileDataToVram(3, sBg_Gfx, 0, 0x000, 0);\n    if (animType != 4)\n        LoadPalette(sBg_Pal, BG_PLTT_ID(0), sizeof(sBg_Pal));\n    else\n        LoadPalette(sBg_TmHm_Pal, BG_PLTT_ID(0), sizeof(sBg_TmHm_Pal));\n}\n\nvoid PSA_CreateMonSpriteAtCloseness(u8 closeness)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    struct Pokemon * pokemon = PSA_GetPokemon();\n    u16 species = GetMonData(pokemon, MON_DATA_SPECIES);\n    u32 personality = GetMonData(pokemon, MON_DATA_PERSONALITY);\n    u8 r1 = Menu2_GetMonSpriteAnchorCoord(species, personality, 2);\n    void *r6;\n    void *r9;\n    void *r4;\n    u8 spriteId;\n\n    if(species == SPECIES_DEOXYS)\n    {\n        switch(GetMonData(pokemon, MON_DATA_FORME))\n        {\n            case 1: //Attack Forme\n                species = 65531;\n                break;\n            case 2: //Defense Forme\n                species = 65532;\n                break;\n            case 3: //Speed Forme\n                species = 65533;\n                break;\n            default: //Normal Forme\n                species = 65530;\n                break;\n        }\n    }\n\n    if (r1 != 0xFF)\n    {\n        scene->monSpriteY1 = 0x48;\n        scene->monSpriteY2 = r1 + 0x30;\n    }\n    else\n    {\n        scene->monSpriteY1 = 0x48;\n        scene->monSpriteY2 = 0x60;\n    }\n\n    r6 = Alloc(0x2000);\n    r9 = Alloc(0x2000);\n    r4 = Alloc(0x100);\n    if (r6 != NULL && r9 != NULL && r4 != NULL)\n    {\n        HandleLoadSpecialPokePic(&gMonFrontPicTable[species], r6, species, personality);\n        LZ77UnCompWram(GetMonFrontSpritePal(pokemon), r4);\n        LoadMonSpriteGraphics(r6, r4);\n        spriteId = CreateSprite(&sSpriteTemplate_MonSprite, 120, scene->monSpriteY1, 4);\n        if (spriteId != MAX_SPRITES)\n        {\n            scene->monSprite = &gSprites[spriteId];\n            MonSpriteZoom_UpdateYPos(scene->monSprite, closeness);\n        }\n        else\n            scene->monSprite = NULL;\n        scene->lastCloseness = closeness;\n    }\n    if (r6 != NULL) Free(r6);\n    if (r9 != NULL) Free(r9);\n    if (r4 != NULL) Free(r4);\n}\n\n#define tState          data[0]\n#define tCurrCloseness  data[1]\n#define tFinalCloseness data[2]\n#define tDeltaCloseness data[3]\n#define tTimer          data[4]\n#define tDelay          data[5]\n#define tOff_MonSprite  6\n#define tHasItemSprite  data[8]\n#define tOff_ItemSprite 9\n\nvoid PSA_SetUpZoomAnim(u8 closeness)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    u8 taskId;\n    if (closeness != scene->lastCloseness)\n    {\n        taskId = CreateTask(Task_ZoomAnim, 4);\n        SetWordTaskArg(taskId, tOff_MonSprite, (uintptr_t)scene->monSprite);\n        gTasks[taskId].tCurrCloseness = scene->lastCloseness;\n        gTasks[taskId].tFinalCloseness = closeness;\n        gTasks[taskId].tDelay = 6;\n        if (closeness > scene->lastCloseness)\n            gTasks[taskId].tDeltaCloseness = 1;\n        else\n            gTasks[taskId].tDeltaCloseness = -1;\n    }\n}\n\nbool8 PSA_IsZoomTaskActive(void)\n{\n    return FuncIsActiveTask(Task_ZoomAnim);\n}\n\nstatic void Task_ZoomAnim(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    struct Sprite *sprite = (void *)GetWordTaskArg(taskId, tOff_MonSprite);\n    switch (tState)\n    {\n    case 0:\n        SetSpriteWithCloseness(sprite, tCurrCloseness);\n        if (tHasItemSprite)\n            SetSpriteWithCloseness((void *)GetWordTaskArg(taskId, tOff_ItemSprite), tCurrCloseness);\n        tCurrCloseness += tDeltaCloseness;\n        tState++;\n        break;\n    case 1:\n        if (!IsZoomSpriteCBActive(sprite))\n        {\n            PlaySE(SE_BALL_TRAY_EXIT);\n            MonSpriteZoom_UpdateYPos(sprite, tCurrCloseness);\n            if (tHasItemSprite)\n                ItemSpriteZoom_UpdateYPos((void *)GetWordTaskArg(taskId, tOff_ItemSprite), tCurrCloseness);\n            if (tCurrCloseness == tFinalCloseness)\n            {\n                PSA_GetSceneWork()->lastCloseness = tFinalCloseness;\n                DestroyTask(taskId);\n            }\n            else\n            {\n                tTimer = 0;\n                tState = 2;\n            }\n        }\n        break;\n    case 2:\n        tTimer++;\n        if (tTimer > tDelay)\n            tState = 0;\n        break;\n    }\n}\n\nstatic void SetSpriteWithCloseness(struct Sprite *sprite, u8 closeness)\n{\n    sprite->data[0] = 0;\n    sprite->data[1] = 0;\n    sprite->data[2] = closeness;\n}\n\nstatic bool8 IsZoomSpriteCBActive(struct Sprite *sprite)\n{\n    return sprite->callback != SpriteCallbackDummy;\n}\n\nstatic s16 GetSpriteOffsetByScale(s16 pos, u8 closeness)\n{\n    return (pos * sAffineScales[closeness]) >> 8;\n}\n\n// FIXME: better math\nstatic u16 GetYPosByScale(u16 pos)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    s32 v = ((((((scene->monSpriteY2 - scene->monSpriteY1) << 16) >> 8) / 256 * (pos - 256)) << 8) >> 16);\n    return v += scene->monSpriteY1;\n}\n\nstatic void MonSpriteZoom_UpdateYPos(struct Sprite *sprite, u8 closeness)\n{\n    if (closeness > 3)\n        closeness = 3;\n    PSA_GetSceneWork(); // return value not used\n    StartSpriteAffineAnim(sprite, closeness);\n    sprite->y = GetYPosByScale(sAffineScales[closeness]);\n}\n\nstatic void ItemSpriteZoom_UpdateYPos(struct Sprite *sprite, u8 closeness)\n{\n    MonSpriteZoom_UpdateYPos(sprite, closeness);\n    sprite->x2 = GetSpriteOffsetByScale(sprite->data[6] - 32, closeness);\n    sprite->y2 = GetSpriteOffsetByScale(sprite->data[7] - 32, closeness);\n}\n\nstatic void StartMonWiggleAnim(struct PokemonSpecialAnimScene * scene, u8 frameLen, u8 niter, u8 amplitude)\n{\n    // frameLen: frame duration\n    // niter = 0: iterate ad infinitum\n    scene->monSprite->data[0] = frameLen;\n    scene->monSprite->data[1] = niter;\n    scene->monSprite->data[2] = amplitude;\n    scene->monSprite->callback = SpriteCallback_MonSpriteWiggle;\n}\n\nstatic void StopMonWiggleAnim(struct PokemonSpecialAnimScene * scene)\n{\n    scene->monSprite->x2 = 0;\n    scene->monSprite->callback = SpriteCallbackDummy;\n}\n\nstatic void SpriteCallback_MonSpriteWiggle(struct Sprite *sprite)\n{\n    sprite->data[7]++;\n    if (sprite->data[7] > sprite->data[0])\n    {\n        sprite->data[7] = 0;\n        sprite->data[6]++;\n        if (sprite->data[1] != 0 && sprite->data[6] >= sprite->data[1])\n        {\n            sprite->x2 = 0;\n            sprite->callback = SpriteCallbackDummy;\n        }\n        else if (sprite->data[6] & 1)\n            sprite->x2 = sprite->data[2];\n        else\n            sprite->x2 = -sprite->data[2];\n    }\n}\n\nstatic void LoadMonSpriteGraphics(u16 *tiles, u16 *palette)\n{\n    struct SpriteSheet spriteSheet;\n    struct SpritePalette spritePalette;\n\n    spriteSheet.data = tiles;\n    spriteSheet.size = 0x800;\n    spriteSheet.tag = 0;\n    spritePalette.data = palette;\n    spritePalette.tag = 0;\n    LoadSpriteSheet(&spriteSheet);\n    LoadSpritePalette(&spritePalette);\n}\n\n#undef tOff_ItemSprite\n#undef tHasItemSprite\n#undef tOff_MonSprite\n#undef tDelay\n#undef tTimer\n#undef tDeltaCloseness\n#undef tFinalCloseness\n#undef tCurrCloseness\n#undef tState\n\n#define tState           data[0]\n#define tTimer           data[1]\n#define tCloseness       data[2]\n#define tYpos            data[3]\n#define tOff_ItemSprite  4\n#define tData6           data[6]\n#define tData7           data[7]\n#define tActiveSprCt     data[8]\n#define tBlendColor      data[9]\n#define tTimerReset      data[10]\n#define tSuppressDots    data[11]\n\nvoid PSA_SetUpItemUseOnMonAnim(u16 itemId, u8 closeness, bool32 a2)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    u8 taskId;\n    scene->itemIconSprite = PSA_CreateItemIconObject(itemId);\n    if (scene->itemIconSprite != NULL)\n    {\n        InitItemIconSpriteState(scene, scene->itemIconSprite, closeness);\n        StartSpriteAffineAnim(scene->itemIconSprite, closeness);\n        scene->itemIconSprite->invisible = TRUE;\n        taskId = CreateTask(Task_ItemUseOnMonAnim, 2);\n        SetWordTaskArg(taskId, tOff_ItemSprite, (uintptr_t)scene->itemIconSprite);\n        gTasks[taskId].tCloseness = closeness;\n        gTasks[taskId].tYpos = GetYPosByScale(sAffineScales[closeness]);\n        gTasks[taskId].tData6 = a2;\n        gTasks[taskId].tBlendColor = GetBlendColorByItemId(itemId);\n    }\n}\n\nstatic u16 GetBlendColorByItemId(u16 itemId)\n{\n    return RGB_WHITE;\n}\n\nvoid CreateItemIconSpriteAtMaxCloseness(u16 itemId)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    scene->itemIconSprite = PSA_CreateItemIconObject(itemId);\n    if (scene->itemIconSprite != NULL)\n    {\n        StartSpriteAffineAnim(scene->itemIconSprite, 3);\n        InitItemIconSpriteState(scene, scene->itemIconSprite, 3);\n    }\n}\n\nstatic struct Sprite *PSA_CreateItemIconObject(u16 itemId)\n{\n    u8 spriteId;\n    struct Sprite *sprite;\n    spriteId = AddItemIconObject(1, 1, itemId);\n    if (spriteId == MAX_SPRITES)\n        return NULL;\n    gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;\n    gSprites[spriteId].oam.priority = 1;\n    gSprites[spriteId].subpriority = 1;\n    gSprites[spriteId].affineAnims = sAffineAnimTable_Zoom;\n    gSprites[spriteId].callback = SpriteCallbackDummy;\n    InitSpriteAffineAnim(&gSprites[spriteId]);\n    return &gSprites[spriteId];\n}\n\nbool8 PSA_IsItemUseOnMonAnimActive(void)\n{\n    return FuncIsActiveTask(Task_ItemUseOnMonAnim);\n}\n\nstatic void Task_ItemUseOnMonAnim(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    struct Sprite *sprite = (void *)GetWordTaskArg(taskId, tOff_ItemSprite);\n    switch (tState)\n    {\n    case 0:\n        tTimer++;\n        if (tTimer > 20)\n        {\n            tTimer = 0;\n            PlaySE(SE_M_SWAGGER2);\n            sprite->invisible = FALSE;\n            if (!tSuppressDots)\n                LoadOutwardSpiralDotsGfx();\n            tState = 1;\n        }\n        break;\n    case 1:\n        tTimer++;\n        if (tTimer > 30)\n        {\n            tTimer = 0;\n            sprite->affineAnims = sAffineAnimTable_ItemZoom;\n            StartSpriteAffineAnim(sprite, tCloseness);\n            BeginNormalPaletteFade(0x10000 << IndexOfSpritePaletteTag(1), -2, 0, 12, tBlendColor);\n            tState = 2;\n            PlaySE(SE_M_MILK_DRINK);\n        }\n        break;\n    case 2:\n        if (sprite->affineAnimEnded)\n        {\n            sprite->invisible = TRUE;\n            tTimerReset = 20;\n            tState = 3;\n        }\n        break;\n    case 3:\n        tTimer++;\n        if (tTimer > tTimerReset)\n        {\n            tTimer = 0;\n            if (!tSuppressDots)\n                CreateSprites_UseItem_OutwardSpiralDots(taskId, data, sprite);\n            if (tData7 == 0)\n                PlaySE(SE_M_REVERSAL);\n            tData7++;\n            if (tData7 > 2)\n                tState = 4;\n            else\n                tTimerReset = 8;\n        }\n        break;\n    case 4:\n        if (tActiveSprCt == 0)\n        {\n            if (tData6)\n                DestroySprite(sprite);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void CreateSprites_UseItem_OutwardSpiralDots(u8 taskId, s16 *data, struct Sprite *sprite)\n{\n    int x = sprite->x + sprite->x2 - 4;\n    int y = sprite->y + sprite->y2 - 4;\n    u8 spriteId;\n    int i;\n    BlendPalettes(0x10000 << IndexOfSpritePaletteTag(5), 16, tBlendColor);\n    for (i = 0; i < 15; i++)\n    {\n        spriteId = CreateSprite(&sSpriteTemplate_UseItem_OutwardSpiralDots, x, y, 0);\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].data[1] = i << 4;\n            gSprites[spriteId].data[7] = taskId;\n            gSprites[spriteId].callback = SpriteCB_OutwardSpiralDots;\n            StartSpriteAnim(&gSprites[spriteId], 1);\n            tActiveSprCt++;\n        }\n    }\n}\n\nstatic void SpriteCB_OutwardSpiralDots(struct Sprite *sprite)\n{\n    s16 *data = sprite->data;\n    if (data[0] < 16)\n    {\n        data[0]++;\n        data[1] += 7;\n        data[1] &= 0xFF;\n        data[2] += 4;\n        sprite->x2 = (data[2] * gSineTable[data[1] + 0x40]) >> 8;\n        sprite->y2 = (data[2] * gSineTable[data[1]])        >> 8;\n    }\n    else\n    {\n        gTasks[data[7]].tActiveSprCt--;\n        DestroySprite(sprite);\n    }\n}\n\nvoid PSA_UseItem_CleanUpForCancel(void)\n{\n    u8 taskId = FindTaskIdByFunc(Task_ItemUseOnMonAnim);\n    if (taskId != 0xFF)\n    {\n        gTasks[taskId].tSuppressDots = TRUE;\n    }\n}\n\nstatic void InitItemIconSpriteState(struct PokemonSpecialAnimScene * scene, struct Sprite *sprite, u8 closeness)\n{\n    u16 species, x, y;\n    u32 personality;\n    if (closeness == 3)\n    {\n        sprite->x = 120;\n        sprite->y = scene->monSpriteY2;\n    }\n    else\n    {\n        sprite->x = 120;\n        sprite->y = scene->monSpriteY1;\n    }\n    sprite->x += 4;\n    sprite->y += 4;\n    species = PSA_GetMonSpecies();\n    personality = PSA_GetMonPersonality();\n    switch (PSA_GetAnimType())\n    {\n        case 4:\n        {\n            x = Menu2_GetMonSpriteAnchorCoord(species, personality, 0);\n            y = Menu2_GetMonSpriteAnchorCoord(species, personality, 1);\n            if (x == 0xFF)\n                x = 0;\n            if (y == 0xFF)\n                y = 0;\n            sprite->data[6] = x;\n            sprite->data[7] = y;\n            break;\n        }\n        default:\n        {\n            x = Menu2_GetMonSpriteAnchorCoord(species, personality, 3);\n            y = Menu2_GetMonSpriteAnchorCoord(species, personality, 4);\n            if (x == 0xFF)\n                x = 0;\n            if (y == 0xFF)\n                y = 0;\n            sprite->data[6] = x;\n            sprite->data[7] = y;\n            break;\n        }\n    }\n    ItemSpriteZoom_UpdateYPos(sprite, closeness);\n}\n\n#undef tSuppressDots\n#undef tTimerReset\n#undef tBlendColor\n#undef tActiveSprCt\n#undef tData7\n#undef tData6\n#undef tOff_ItemSprite\n#undef tYpos\n#undef tCloseness\n#undef tTimer\n#undef tState\n\nstatic void MachineSetWobbleInit(void)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    MachineSetWobble_SetCB(scene->monSprite);\n    MachineSetWobble_SetCB(scene->itemIconSprite);\n}\n\nstatic void MachineSetWobble_SetCB(struct Sprite *sprite)\n{\n    sprite->data[0] = 0;\n    sprite->data[1] = 0;\n    sprite->callback = SpriteCB_MachineSetWobble;\n}\n\nstatic bool8 MachineSetWobbleCBIsRunning(void)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    return scene->monSprite->callback != SpriteCallbackDummy;\n}\n\nstatic void SpriteCB_MachineSetWobble(struct Sprite *sprite)\n{\n    switch (sprite->data[0])\n    {\n    case 0:\n        sprite->x += 3;\n        sprite->data[0]++;\n        break;\n    case 1:\n        sprite->data[1]++;\n        if (sprite->data[1] > 30)\n        {\n            sprite->x -= 3;\n            sprite->callback = SpriteCallbackDummy;\n        }\n        break;\n    }\n}\n\n// Redefined from above\n#define tState          data[0]\n#define tCurrCloseness  data[1]\n#define tFinalCloseness data[2]\n#define tDeltaCloseness data[3]\n#define tTimer          data[4]\n#define tDelay          data[5]\n#define tOff_MonSprite  6\n#define tHasItemSprite  data[8]\n#define tOff_ItemSprite 9\n\nstatic void StartZoomOutAnimForUseTM(u8 closeness)\n{\n    struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();\n    u8 taskId;\n    if (closeness != scene->lastCloseness)\n    {\n        taskId = CreateTask(Task_ZoomAnim, 1);\n        SetWordTaskArg(taskId, tOff_MonSprite, (uintptr_t)scene->monSprite);\n        SetWordTaskArg(taskId, tOff_ItemSprite, (uintptr_t)scene->itemIconSprite);\n        gTasks[taskId].tCurrCloseness = scene->lastCloseness;\n        gTasks[taskId].tFinalCloseness = closeness;\n        gTasks[taskId].tHasItemSprite = 1;\n        gTasks[taskId].tDelay = 6;\n        if (closeness > scene->lastCloseness)\n            gTasks[taskId].tDeltaCloseness = 1;\n        else\n            gTasks[taskId].tDeltaCloseness = -1;\n    }\n}\n\n#undef tOff_ItemSprite\n#undef tHasItemSprite\n#undef tOff_MonSprite\n#undef tDelay\n#undef tTimer\n#undef tDeltaCloseness\n#undef tFinalCloseness\n#undef tCurrCloseness\n#undef tState\n\nstatic void CreateStarSprites(struct PokemonSpecialAnimScene * scene)\n{\n    int i;\n    u8 spriteId;\n    u16 species;\n    u32 personality;\n    LoadCompressedSpriteSheet(&sSpriteSheet_Star);\n    LoadSpritePalette(&sSpritePalette_Star);\n    scene->field_0002 = 0;\n    for (i = 0; i < 3; i++)\n    {\n        spriteId = CreateSprite(&sSpriteTemplate_Star, 120 + sStarCoordOffsets[i][0],  scene->monSpriteY2 + sStarCoordOffsets[i][1], 2);\n        if (spriteId != MAX_SPRITES)\n        {\n            species = PSA_GetMonSpecies();\n            personality = PSA_GetMonPersonality();\n            gSprites[spriteId].data[3] = sStarCoordOffsets[i][0] * 8;\n            gSprites[spriteId].data[4] = sStarCoordOffsets[i][1] * 8;\n            gSprites[spriteId].x += GetSpriteOffsetByScale(Menu2_GetMonSpriteAnchorCoordMinusx20(species, personality, 0), 3);\n            gSprites[spriteId].y += GetSpriteOffsetByScale(Menu2_GetMonSpriteAnchorCoordMinusx20(species, personality, 1), 3);\n            scene->field_0002++;\n        }\n    }\n}\n\nstatic u8 AnyStarSpritesActive(void)\n{\n    return PSA_GetSceneWork()->field_0002;\n}\n\nstatic void SpriteCB_Star(struct Sprite *sprite)\n{\n    sprite->data[0]++;\n    if (sprite->data[0] < 10)\n    {\n        sprite->data[1] += sprite->data[3];\n        sprite->data[2] += sprite->data[4];\n        sprite->x2 = sprite->data[1] >> 4;\n        sprite->y2 = sprite->data[2] >> 4;\n    }\n    else\n    {\n        PSA_GetSceneWork()->field_0002--;\n        DestroySprite(sprite);\n    }\n}\n\n// ========================================================\n\n#define tState        data[0]\n#define tTimer        data[1]\n#define tActiveSprCt  data[2]\n#define tOff_RngState 3\n#define tAngle        data[5]\n#define tMadeSprCt    data[6]\n\n#define tsRadius   data[0]\n#define tsSpeed    data[1]\n#define tsXinit    data[2]\n#define tsYinit    data[3]\n#define tsXorig    data[4]\n#define tsYorig    data[5]\n#define tsTaskId   data[6]\n\nstatic void PSAScene_SeedRandomInTask(struct PokemonSpecialAnimScene * scene)\n{\n    u8 taskId;\n    LoadOutwardSpiralDotsGfx();\n    taskId = CreateTask(Task_UseItem_OutwardSpiralDots, 1);\n    SetWordTaskArg(taskId, tOff_RngState, 2022069025);\n    gTasks[taskId].tAngle = 0xE0;\n}\n\nstatic void StopMakingOutwardSpiralDots(void)\n{\n    u8 taskId = FindTaskIdByFunc(Task_UseItem_OutwardSpiralDots);\n    if (taskId != 0xFF)\n        gTasks[taskId].tState = 1;\n}\n\nstatic void Task_UseItem_OutwardSpiralDots(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    switch (tState)\n    {\n    case 0:\n        if (tTimer == 0)\n        {\n            u32 spriteId, x, y, x2, y2, ampl;\n            struct Sprite *sprite = PSA_GetSceneWork()->itemIconSprite;\n            x = sprite->x + sprite->x2;\n            y = sprite->y + sprite->y2;\n            ampl = (PSAScene_RandomFromTask(taskId) % 21) + 70;\n            x2 = x + ((u32)(gSineTable[tAngle + 0x40] * ampl) >> 8);\n            y2 = y + ((u32)(gSineTable[tAngle       ] * ampl) >> 8);\n            tAngle += 0x4C;\n            tAngle &= 0xFF;\n            spriteId = CreateSprite(&sSpriteTemplate_UseItem_OutwardSpiralDots, x2, y2, 0);\n            if (spriteId != MAX_SPRITES)\n            {\n                gSprites[spriteId].tsRadius = 0;\n                gSprites[spriteId].tsSpeed = (PSAScene_RandomFromTask(taskId) & 1) + 6;\n                gSprites[spriteId].tsXinit = x2;\n                gSprites[spriteId].tsYinit = y2;\n                gSprites[spriteId].tsXorig = x;\n                gSprites[spriteId].tsYorig = y;\n                gSprites[spriteId].tsTaskId = taskId;\n                tActiveSprCt++;\n            }\n            tMadeSprCt++;\n            if (tMadeSprCt > 47)\n                tState++;\n        }\n        else\n            tTimer--;\n        break;\n    case 1:\n        if (tActiveSprCt == 0)\n            DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic u16 PSAScene_RandomFromTask(u8 taskId)\n{\n    u32 state = GetWordTaskArg(taskId, tOff_RngState);\n    state = ISO_RANDOMIZE1(state);\n    SetWordTaskArg(taskId, tOff_RngState, state);\n    return state >> 16;\n}\n\nstatic void SpriteCallback_UseItem_OutwardSpiralDots(struct Sprite *sprite)\n{\n    int x;\n    int y;\n    sprite->tsRadius += sprite->tsSpeed;\n    if (sprite->tsRadius > 255)\n    {\n        gTasks[sprite->tsTaskId].tActiveSprCt--;\n        DestroySprite(sprite);\n    }\n    else\n    {\n        x = (sprite->tsXorig - sprite->tsXinit) * sprite->tsRadius;\n        y = (sprite->tsYorig - sprite->tsYinit) * sprite->tsRadius;\n        sprite->x = (x >> 8) + sprite->tsXinit;\n        sprite->y = (y >> 8) + sprite->tsYinit;\n    }\n}\n\nstatic void LoadOutwardSpiralDotsGfx(void)\n{\n    LoadCompressedSpriteSheet(&sSpriteSheet_UseItem_OutwardSpiralDots);\n    LoadSpritePalette(&sSpritePalette_UseItem_OutwardSpiralDots);\n}\n\nstatic bool32 IsOutwardSpiralDotsTaskRunning(void)\n{\n    return FuncIsActiveTask(Task_UseItem_OutwardSpiralDots);\n}\n\n#undef tsTaskId\n#undef tsYorig\n#undef tsXorig\n#undef tsYinit\n#undef tsXinit\n#undef tsSpeed\n#undef tsRadius\n\n#undef tMadeSprCt\n#undef tAngle\n#undef tOff_RngState\n#undef tActiveSprCt\n#undef tTimer\n#undef tState\n\n// ========================================================\n\n#define tState       data[0]\n#define tActiveSprCt data[1]\n#define tMadeSprCt   data[2]\n#define tTimer       data[3]\n#define tXpos        data[4]\n#define tYpos        data[5]\n#define tTileTag     data[6]\n#define tPaletteTag  data[7]\n#define tPriority    data[8]\n#define tSubpriority data[9]\n\n#define tsYsubpixel data[1]\n#define tsSpeed     data[2]\n#define tsTaskId    data[7]\n\nvoid CreateLevelUpVerticalSpritesTask(u16 x, u16 y, u16 tileTag, u16 paletteTag, u16 priority, u16 subpriority)\n{\n    static struct CompressedSpriteSheet spriteSheet;\n    static struct SpritePalette spritePalette;\n    u8 taskId;\n    spriteSheet.tag = tileTag;\n    spriteSheet.data = sLevelUp_Gfx;\n    spriteSheet.size = sLevelUp_Gfx[0] >> 8;\n    spritePalette.data = sLevelUp_Pal;\n    spritePalette.tag = paletteTag;\n    LoadCompressedSpriteSheet(&spriteSheet);\n    LoadSpritePalette(&spritePalette);\n    taskId = CreateTask(Task_LevelUpVerticalSprites, 0);\n    gTasks[taskId].tXpos = x - 32;\n    gTasks[taskId].tYpos = y + 32;\n    gTasks[taskId].tTileTag = tileTag;\n    gTasks[taskId].tPaletteTag = paletteTag;\n    gTasks[taskId].tPriority = priority;\n    gTasks[taskId].tSubpriority = subpriority;\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_NONE  | BLDCNT_TGT2_ALL);\n    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 6));\n}\n\nbool8 LevelUpVerticalSpritesTaskIsRunning(void)\n{\n    return FuncIsActiveTask(Task_LevelUpVerticalSprites);\n}\n\nstatic void Task_LevelUpVerticalSprites(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    switch (tState)\n    {\n    case 0:\n        if (tTimer == 0)\n        {\n            tTimer++;\n            CreateLevelUpVerticalSprite(taskId, data);\n            if (tMadeSprCt > 17)\n                tState++;\n        }\n        else\n        {\n            tTimer++;\n            if (tTimer == 2)\n                tTimer = 0;\n        }\n        break;\n    case 1:\n        if (tActiveSprCt == 0)\n        {\n            FreeSpriteTilesByTag(tTileTag);\n            FreeSpritePaletteByTag(tPaletteTag);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void CreateLevelUpVerticalSprite(u8 taskId, s16 *data)\n{\n    u8 spriteId;\n    struct SpriteTemplate template = sSpriteTemplate_LevelUpVertical;\n    template.tileTag = tTileTag;\n    template.paletteTag = tPaletteTag;\n    tMadeSprCt++;\n    spriteId = CreateSprite(&template, ((tMadeSprCt * 219) & 0x3F) + tXpos, tYpos, tSubpriority);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].oam.priority = tPriority;\n        gSprites[spriteId].tsYsubpixel = 0;\n        gSprites[spriteId].tsSpeed = (ISO_RANDOMIZE1(tMadeSprCt) & 0x3F) + 0x20;\n        gSprites[spriteId].tsTaskId = taskId;\n        tActiveSprCt++;\n    }\n}\n\nstatic void SpriteCB_LevelUpVertical(struct Sprite *sprite)\n{\n    sprite->tsYsubpixel -= sprite->tsSpeed;\n    sprite->y2 = sprite->tsYsubpixel >> 4;\n    if (sprite->y2 < -0x40)\n    {\n        gTasks[sprite->tsTaskId].tActiveSprCt--;\n        DestroySprite(sprite);\n    }\n}\n\n#undef tsTaskId\n#undef tsSpeed\n#undef tsYsubpixel\n\n#undef tSubpriority\n#undef tPriority\n#undef tPaletteTag\n#undef tTileTag\n#undef tYpos\n#undef tXpos\n#undef tTimer\n#undef tMadeSprCt\n#undef tActiveSprCt\n#undef tState\n\n// ========================================================\n\nstatic const u8 *const sLevelUpWindowStatNames[] = {\n    gText_LevelUp_MaxHP,\n    gText_LevelUp_Attack,\n    gText_LevelUp_Defense,\n    gText_LevelUp_SpAtk,\n    gText_LevelUp_SpDef,\n    gText_LevelUp_Speed\n};\n\nvoid DrawLevelUpWindowPg1(u16 windowId, u16 *beforeStats, u16 *afterStats, u8 bgColor, u8 fgColor, u8 shadowColor)\n{\n    s16 diffStats[6];\n    u8 textbuf[12];\n    u8 textColor[3];\n    u32 i;\n    u8 x;\n\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(bgColor));\n\n    diffStats[0] = afterStats[0] - beforeStats[0];\n    diffStats[1] = afterStats[1] - beforeStats[1];\n    diffStats[2] = afterStats[2] - beforeStats[2];\n    diffStats[3] = afterStats[4] - beforeStats[4];\n    diffStats[4] = afterStats[5] - beforeStats[5];\n    diffStats[5] = afterStats[3] - beforeStats[3];\n\n    textColor[0] = bgColor;\n    textColor[1] = fgColor;\n    textColor[2] = shadowColor;\n\n    for (i = 0; i < 6; i++)\n    {\n        AddTextPrinterParameterized3(windowId, FONT_NORMAL, 0, i * 15, textColor, TEXT_SKIP_DRAW, sLevelUpWindowStatNames[i]);\n        StringCopy(textbuf, diffStats[i] >= 0 ? gText_LevelUp_Plus : gText_LevelUp_Minus);\n        AddTextPrinterParameterized3(windowId, FONT_NORMAL, 56, i * 15, textColor, TEXT_SKIP_DRAW, textbuf);\n        textbuf[0] = CHAR_SPACE;\n        x = abs(diffStats[i]) < 10 ? 12 : 6;\n        ConvertIntToDecimalStringN(textbuf + 1, abs(diffStats[i]), STR_CONV_MODE_LEFT_ALIGN, 2);\n        AddTextPrinterParameterized3(windowId, FONT_NORMAL, x + 56, i * 15, textColor, TEXT_SKIP_DRAW, textbuf);\n    }\n}\n\nvoid DrawLevelUpWindowPg2(u16 windowId, u16 *currStats, u8 bgColor, u8 fgColor, u8 shadowColor)\n{\n    s16 statsRearrange[6];\n    u8 textbuf[12];\n    u8 textColor[3];\n    u32 i;\n    u8 ndigits;\n    u16 x;\n\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(bgColor));\n\n    statsRearrange[0] = currStats[0];\n    statsRearrange[1] = currStats[1];\n    statsRearrange[2] = currStats[2];\n    statsRearrange[3] = currStats[4];\n    statsRearrange[4] = currStats[5];\n    statsRearrange[5] = currStats[3];\n\n    textColor[0] = bgColor;\n    textColor[1] = fgColor;\n    textColor[2] = shadowColor;\n\n    for (i = 0; i < 6; i++)\n    {\n        if (statsRearrange[i] >= 100)\n            ndigits = 3;\n        else if (statsRearrange[i] >= 10)\n            ndigits = 2;\n        else\n            ndigits = 1;\n        ConvertIntToDecimalStringN(textbuf, statsRearrange[i], STR_CONV_MODE_LEFT_ALIGN, ndigits);\n        x = 6 * (4 - ndigits);\n        AddTextPrinterParameterized3(windowId, FONT_NORMAL, 0, i * 15, textColor, TEXT_SKIP_DRAW, sLevelUpWindowStatNames[i]);\n        AddTextPrinterParameterized3(windowId, FONT_NORMAL, 56 + x, i * 15, textColor, TEXT_SKIP_DRAW, textbuf);\n    }\n}\n"
  },
  {
    "path": "src/pokemon_storage_system.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"pokemon_storage_system_internal.h\"\n\nvoid BackupPokemonStorage(struct PokemonStorage * dest)\n{\n    *dest = *gPokemonStoragePtr;\n}\n\nvoid RestorePokemonStorage(struct PokemonStorage * src)\n{\n    *gPokemonStoragePtr = *src;\n}\n\n// Functions here are general utility functions.\nu8 StorageGetCurrentBox(void)\n{\n    return gPokemonStoragePtr->currentBox;\n}\n\nvoid SetCurrentBox(u8 boxId)\n{\n    if (boxId < TOTAL_BOXES_COUNT)\n        gPokemonStoragePtr->currentBox = boxId;\n}\n\nu32 GetBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request)\n{\n    if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)\n        return GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request);\n    else\n        return 0;\n}\n\nvoid SetBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, const void *value)\n{\n    if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)\n        SetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request, value);\n}\n\nu32 GetCurrentBoxMonData(u8 boxPosition, s32 request)\n{\n    return GetBoxMonDataAt(gPokemonStoragePtr->currentBox, boxPosition, request);\n}\n\nvoid SetCurrentBoxMonData(u8 boxPosition, s32 request, const void *value)\n{\n    SetBoxMonDataAt(gPokemonStoragePtr->currentBox, boxPosition, request, value);\n}\n\nvoid GetBoxMonNickAt(u8 boxId, u8 boxPosition, u8 *dst)\n{\n    if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)\n        GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_NICKNAME, dst);\n    else\n        *dst = EOS;\n}\n\nvoid SetBoxMonNickAt(u8 boxId, u8 boxPosition, const u8 *nick)\n{\n    if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)\n        SetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_NICKNAME, nick);\n}\n\nu32 GetAndCopyBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, void *dst)\n{\n    if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)\n        return GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request, dst);\n    else\n        return 0;\n}\n\nvoid SetBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon * src)\n{\n    if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)\n        gPokemonStoragePtr->boxes[boxId][boxPosition] = *src;\n}\n\nvoid CopyBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon * dst)\n{\n    if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)\n        *dst = gPokemonStoragePtr->boxes[boxId][boxPosition];\n}\n\nvoid CreateBoxMonAt(u8 boxId, u8 boxPosition, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 personality, u8 otIDType, u32 otID)\n{\n    if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)\n    {\n        CreateBoxMon(&gPokemonStoragePtr->boxes[boxId][boxPosition],\n                     species,\n                     level,\n                     fixedIV,\n                     hasFixedPersonality, personality,\n                     otIDType, otID);\n    }\n}\n\nvoid ZeroBoxMonAt(u8 boxId, u8 boxPosition)\n{\n    if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)\n        ZeroBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition]);\n}\n\nvoid BoxMonAtToMon(u8 boxId, u8 boxPosition, struct Pokemon * dst)\n{\n    if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)\n    {\n        BoxMonToMon(&gPokemonStoragePtr->boxes[boxId][boxPosition], dst);\n        PopulateBoxHpAndStatusToPartyMon(dst);\n    }\n}\n\nstruct BoxPokemon * GetBoxedMonPtr(u8 boxId, u8 boxPosition)\n{\n    if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)\n        return &gPokemonStoragePtr->boxes[boxId][boxPosition];\n    else\n        return NULL;\n}\n\nu8 *GetBoxNamePtr(u8 boxId)\n{\n    if (boxId < TOTAL_BOXES_COUNT)\n        return gPokemonStoragePtr->boxNames[boxId];\n    else\n        return NULL;\n}\n\nu8 GetBoxWallpaper(u8 boxId)\n{\n    if (boxId < TOTAL_BOXES_COUNT)\n        return gPokemonStoragePtr->boxWallpapers[boxId];\n    else\n        return 0;\n}\n\nvoid SetBoxWallpaper(u8 boxId, u8 wallpaperId)\n{\n    if (boxId < TOTAL_BOXES_COUNT && wallpaperId < WALLPAPER_COUNT)\n        gPokemonStoragePtr->boxWallpapers[boxId] = wallpaperId;\n}\n\ns16 SeekToNextMonInBox(struct BoxPokemon * boxMons, s8 curIndex, u8 maxIndex, u8 flags)\n{\n    // flags:\n    // bit 0: Allow eggs\n    // bit 1: Search backwards\n    s32 i;\n    s16 adder;\n    if (flags == 0 || flags == 1)\n        adder = 1;\n    else\n        adder = -1;\n\n    if (flags == 1 || flags == 3)\n    {\n        for (i = curIndex + adder; i >= 0 && i <= maxIndex; i += adder)\n        {\n            if (GetBoxMonData(&boxMons[i], MON_DATA_SPECIES) != SPECIES_NONE)\n                return i;\n        }\n    }\n    else\n    {\n        for (i = curIndex + adder; i >= 0 && i <= maxIndex; i += adder)\n        {\n            if (GetBoxMonData(&boxMons[i], MON_DATA_SPECIES) != SPECIES_NONE\n                && !GetBoxMonData(&boxMons[i], MON_DATA_IS_EGG))\n                return i;\n        }\n    }\n\n    return -1;\n}\n"
  },
  {
    "path": "src/pokemon_storage_system_data.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"item.h\"\n#include \"mail_data.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"party_menu.h\"\n#include \"pokemon_storage_system_internal.h\"\n#include \"pokemon_summary_screen.h\"\n#include \"strings.h\"\n#include \"constants/items.h\"\n#include \"constants/moves.h\"\n#include \"constants/songs.h\"\n#include \"constants/party_menu.h\"\n\nstatic EWRAM_DATA struct Pokemon sMonBeingCarried = {};\nstatic EWRAM_DATA s8 sCursorArea = 0;\nstatic EWRAM_DATA s8 sCursorPosition = 0;\nstatic EWRAM_DATA bool8 sIsMonBeingMoved = FALSE;\nstatic EWRAM_DATA u8 sMovingMonOrigBoxId = 0;\nstatic EWRAM_DATA u8 sMovingMonOrigBoxPos = 0;\nstatic EWRAM_DATA bool8 sInMultiMoveMode = FALSE;\nstatic EWRAM_DATA u8 sSavedCursorPosition = 0;\n\nstatic void DoCursorNewPosUpdate(void);\nstatic bool8 MonPlaceChange_Grab(void);\nstatic bool8 MonPlaceChange_Place(void);\nstatic bool8 MonPlaceChange_Shift(void);\nstatic bool8 MonPlaceChange_DoMoveCursorDown(void);\nstatic bool8 MonPlaceChange_DoMoveCursorUp(void);\nstatic bool8 MonPlaceChange_MoveCursorDown(void);\nstatic bool8 MonPlaceChange_MoveCursorUp(void);\nstatic void MoveMon(void);\nstatic void PlaceMon(void);\nstatic void SetMovedMonData(u8 boxId, u8 cursorPos);\nstatic void SetPlacedMonData(u8 boxId, u8 cursorPos);\nstatic void PurgeMonOrBoxMon(u8 boxId, u8 cursorPos);\nstatic void SetShiftedMonData(u8 boxId, u8 cursorPos);\nstatic void TrySetDisplayMonData(void);\nstatic void SetDisplayMonData(void *pokemon, u8 mode);\nstatic void ReshowDisplayMon(void);\nstatic u8 HandleInput_InBox_Normal(void);\nstatic u8 HandleInput_InBox_GrabbingMultiple(void);\nstatic u8 HandleInput_InBox_MovingMultiple(void);\nstatic void AddBoxMenu(void);\nstatic bool8 SetSelectionMenuTexts(void);\nstatic bool8 SetMenuTextsForMon(void);\nstatic bool8 SetMenuTextsForItem(void);\nstatic void CreateCursorSprites(void);\nstatic void ToggleCursorMultiMoveMode(void);\n\nstatic const u16 sPokeStorageMisc1Pal[] = INCBIN_U16(\"graphics/pokemon_storage/misc1.gbapal\");\nstatic const u16 sHandCursorTiles[] = INCBIN_U16(\"graphics/pokemon_storage/cursor.4bpp\");\nstatic const u16 sHandCursorShadowTiles[] = INCBIN_U16(\"graphics/pokemon_storage/cursor_shadow.4bpp\");\n\n// Modes for selecting and moving Pokémon in the box. Multiple Pokémon can be\n// selected by pressing the Select button to change the cursor, then holding\n// down the A button while moving the cursor around. This is\n// MOVE_MODE_MULTIPLE_SELECTING. After releasing the A button, those Pokémon\n// will be picked up and can be moved around as a single unit. This is\n// MOVE_MODE_MULTIPLE_MOVING.\nenum\n{\n    MOVE_MODE_NORMAL,\n    MOVE_MODE_MULTIPLE_SELECTING,\n    MOVE_MODE_MULTIPLE_MOVING,\n};\n\nextern void CopyBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon * dst);\n\nvoid StoreHPAndStatusInBoxMon(struct Pokemon *mon)\n{\n    u16 currentHP;\n    u32 statusField;\n    u8 actualStatus;\n    u8 boxStatusCondition = 0;\n\n    currentHP = GetMonData(mon, MON_DATA_HP);\n    if(gSaveBlock1Ptr->keyFlags.noPMC == 1)\n    {   //save status and HP to boxmon if noPMC\n        actualStatus = GetMonAilment(mon);\n        statusField = GetMonData(mon, MON_DATA_STATUS);\n        switch(actualStatus)\n        {\n            case AILMENT_SLP:\n                boxStatusCondition = statusField & STATUS1_SLEEP; //0b0XXX where X is the sleep turns\n                break;\n            case AILMENT_PSN:\n                boxStatusCondition = 8; //0b1000\n                break;\n            case AILMENT_BRN:\n                boxStatusCondition = 9; //0b1001\n                break;\n            case AILMENT_FRZ:\n                boxStatusCondition = 10; //0b1010\n                break;\n            case AILMENT_PRZ:\n                boxStatusCondition = 11; //0b1011\n                break;\n            case AILMENT_FNT:\n                boxStatusCondition = 0; //No status condition; fainted\n                break;\n        }\n        currentHP = GetMonData(mon, MON_DATA_HP);\n        if(currentHP > 714)\n        {\n            currentHP = 714; //Highest legal HP value\n        }\n        SetMonData(mon, MON_DATA_BOX_HP, &currentHP);\n        SetMonData(mon, MON_DATA_BOX_STATUS, &boxStatusCondition);\n    }\n    else if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n    {   //keep fainted when deposited in Nuzlocke Mode\n        if(currentHP == 0)\n        {\n            SetMonData(mon, MON_DATA_BOX_HP, &currentHP);\n        }\n        else\n        {\n            if(currentHP > 714)\n            {\n                currentHP = 714; //Highest legal HP value\n            }\n            currentHP = GetMonData(mon, MON_DATA_MAX_HP);\n            SetMonData(mon, MON_DATA_BOX_HP, &currentHP);\n        }\n        boxStatusCondition = 0;\n        SetMonData(mon, MON_DATA_BOX_STATUS, &boxStatusCondition);\n    }\n    else\n    {   //neither key active, store max HP and 0 status\n        currentHP = GetMonData(mon, MON_DATA_MAX_HP);\n        boxStatusCondition = 0;\n        SetMonData(mon, MON_DATA_BOX_HP, &currentHP);\n        SetMonData(mon, MON_DATA_BOX_STATUS, &boxStatusCondition);\n    }\n}\n\nvoid PopulateBoxHpAndStatusToPartyMon(struct Pokemon *mon)\n{\n    u16 currentHP;\n    u32 statusField;\n    u8 boxStatus;\n\n    currentHP = GetMonData(mon, MON_DATA_BOX_HP);\n    boxStatus = GetMonData(mon, MON_DATA_BOX_STATUS);\n\n    if(gSaveBlock1Ptr->keyFlags.noPMC == 1)\n    {   //PC no longer heals mons in noPMC\n        currentHP = GetMonData(mon, MON_DATA_BOX_HP);\n        SetMonData(mon, MON_DATA_HP, &currentHP);\n        statusField = 0;\n\n        if(boxStatus < 8) //Sleep\n        {\n            statusField = boxStatus; //preserves sleep turns?\n        }\n        else\n        {\n            switch(boxStatus)\n            {\n                case 8: //PSN\n                    statusField = STATUS1_POISON;\n                    break;\n                case 9: //BRN\n                    statusField = STATUS1_BURN;\n                    break;\n                case 10: //FRZ\n                    statusField = STATUS1_FREEZE;\n                    break;\n                case 11: //PRZ\n                    statusField = STATUS1_PARALYSIS;\n                    break;\n                default: //FNT, none, or invalid\n                    statusField = 0;\n                    break;\n            }\n        }\n        SetMonData(mon, MON_DATA_STATUS, &statusField);\n    }\n    else if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n    {   //keep fainted when withdrawn in Nuzlocke Mode\n        if(currentHP == 0)\n        {\n            SetMonData(mon, MON_DATA_HP, &currentHP);\n        }\n        else\n        {\n            currentHP = GetMonData(mon, MON_DATA_MAX_HP);\n            SetMonData(mon, MON_DATA_HP, &currentHP);\n        }\n        statusField = 0;\n        SetMonData(mon, MON_DATA_STATUS, &statusField);\n    }\n    else\n    {   //neither key active, populate max HP and 0 status\n        currentHP = GetMonData(mon, MON_DATA_MAX_HP);\n        statusField = 0;\n        SetMonData(mon, MON_DATA_HP, &currentHP);\n        SetMonData(mon, MON_DATA_STATUS, &statusField);\n    }\n}\n\nu16 GetFirstAliveBoxMon(void)\n{\n    u32 i;\n    u32 j;\n\n    for (i = 0; i < TOTAL_BOXES_COUNT; i++)\n    {\n        for (j = 0; j < IN_BOX_COUNT; j++)\n        {\n            if (GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SPECIES) != SPECIES_NONE &&\n            !GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_IS_EGG))\n            {\n                if(GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_BOX_HP) != 0)\n                    return (i * IN_BOX_COUNT) + j;\n            }\n        }\n    }\n    return IN_BOX_COUNT * TOTAL_BOXES_COUNT; // none found\n}\n\nvoid SwapFirstAliveBoxPokemon(void)\n{\n    u16 position = GetFirstAliveBoxMon();\n    if (position != IN_BOX_COUNT * TOTAL_BOXES_COUNT)\n    {\n        struct BoxPokemon tempMon;\n        u16 boxNum = position / IN_BOX_COUNT;\n        u16 boxIndex = position - (boxNum * IN_BOX_COUNT);\n\n        CopyBoxMonAt(boxNum, boxIndex, &tempMon); //backing up first alive box mon\n        StoreHPAndStatusInBoxMon(&gPlayerParty[0]); //storing box info in party mon\n        SetBoxMonAt(boxNum, boxIndex, &gPlayerParty[0].box); //copying first Pokemon to box\n        ZeroMonData(&gPlayerParty[0]); //purging first party slot\n        BoxMonToMon(&tempMon, &gPlayerParty[0]); //copying saved box mon to first spot in party\n        PopulateBoxHpAndStatusToPartyMon(&gPlayerParty[0]); //getting box stuff to party stuff in saved box mon\n    }\n}\n\nu16 GetDeoxysSpeciesFromForme(u32 forme)\n{\n    switch(forme)\n    {\n        case 1: // Attack Forme\n            return 65531;\n        case 2: // Defense Forme\n            return 65532;\n        case 3: // Speed Forme\n            return 65533;\n        default: // Normal Forme\n            return 65530;\n    }\n}\n\nvoid InitCursor(void)\n{\n    if (gStorage->boxOption != OPTION_DEPOSIT)\n        sCursorArea = CURSOR_AREA_IN_BOX;\n    else\n        sCursorArea = CURSOR_AREA_IN_PARTY;\n\n    sCursorPosition = 0;\n    sIsMonBeingMoved = FALSE;\n    sMovingMonOrigBoxId = 0;\n    sMovingMonOrigBoxPos = 0;\n    sInMultiMoveMode = FALSE;\n    ClearSavedCursorPos();\n    CreateCursorSprites();\n    gStorage->cursorPrevPartyPos = 1;\n    gStorage->inBoxMovingMode = MOVE_MODE_NORMAL;\n    TrySetDisplayMonData();\n}\n\nvoid InitCursorOnReopen(void)\n{\n    CreateCursorSprites();\n    ReshowDisplayMon();\n    gStorage->cursorPrevPartyPos = 1;\n    gStorage->inBoxMovingMode = MOVE_MODE_NORMAL;\n    if (sIsMonBeingMoved)\n    {\n        gStorage->movingMon = sMonBeingCarried;\n        CreateMovingMonIcon();\n    }\n}\n\nstatic void GetCursorCoordsByPos(u8 cursorArea, u8 cursorPosition, u16 *x, u16 *y)\n{\n    switch (cursorArea)\n    {\n    case CURSOR_AREA_IN_BOX:\n        *x = (cursorPosition % IN_BOX_COLUMNS) * 24 + 100;\n        *y = (cursorPosition / IN_BOX_COLUMNS) * 24 +  32;\n        break;\n    case CURSOR_AREA_IN_PARTY:\n        if (cursorPosition == 0)\n        {\n            *x = 104;\n            *y = 52;\n        }\n        else if (cursorPosition == PARTY_SIZE)\n        {\n            *x = 152;\n            *y = 132;\n        }\n        else\n        {\n            *x = 152;\n            *y = (cursorPosition - 1) * 24 + 4;\n        }\n        break;\n    case CURSOR_AREA_BOX_TITLE:\n        *x = 162;\n        *y = 12;\n        break;\n    case CURSOR_AREA_BUTTONS:\n        *y = sIsMonBeingMoved ? 8 : 14;\n        *x = cursorPosition * 88 + 120;\n        break;\n    case 4:\n        *x = 160;\n        *y = 96;\n        break;\n    }\n}\n\nstatic u16 GetSpeciesAtCursorPosition(void)\n{\n    switch (sCursorArea)\n    {\n    case CURSOR_AREA_IN_PARTY:\n        return GetMonData(&gPlayerParty[sCursorPosition], MON_DATA_SPECIES);\n    case CURSOR_AREA_IN_BOX:\n        return GetCurrentBoxMonData(sCursorPosition, MON_DATA_SPECIES);\n    default:\n        return SPECIES_NONE;\n    }\n}\n\nbool8 UpdateCursorPos(void)\n{\n    s16 tmp;\n\n    if (gStorage->cursorMoveSteps == 0)\n    {\n        if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n            return FALSE;\n        else\n            return IsItemIconAnimActive();\n    }\n    else if (--gStorage->cursorMoveSteps != 0)\n    {\n        // Update position toward target\n        gStorage->cursorNewX += gStorage->cursorSpeedX;\n        gStorage->cursorNewY += gStorage->cursorSpeedY;\n        gStorage->cursorSprite->x = gStorage->cursorNewX >> 8;\n        gStorage->cursorSprite->y = gStorage->cursorNewY >> 8;\n\n        // Limit cursor on right\n        if (gStorage->cursorSprite->x > DISPLAY_WIDTH + 16)\n        {\n            tmp = gStorage->cursorSprite->x - (DISPLAY_WIDTH + 16);\n            gStorage->cursorSprite->x = tmp + 64;\n        }\n\n        // Limit cursor on left\n        if (gStorage->cursorSprite->x < 64)\n        {\n            tmp = 64 - gStorage->cursorSprite->x;\n            gStorage->cursorSprite->x = DISPLAY_WIDTH + 16 - tmp;\n        }\n\n        // Limit cursor on bottom\n        if (gStorage->cursorSprite->y > DISPLAY_HEIGHT + 16)\n        {\n            tmp = gStorage->cursorSprite->y - (DISPLAY_HEIGHT + 16);\n            gStorage->cursorSprite->y = tmp - 16;\n        }\n\n        // Limit cursor on top\n        if (gStorage->cursorSprite->y < -16)\n        {\n            tmp = -16 - gStorage->cursorSprite->y;\n            gStorage->cursorSprite->y = DISPLAY_HEIGHT + 16 - tmp;\n        }\n\n        // Cursor flips vertically when moving on/off the top buttons\n        if (gStorage->cursorFlipTimer && --gStorage->cursorFlipTimer == 0)\n            gStorage->cursorSprite->vFlip = (gStorage->cursorSprite->vFlip == FALSE);\n    }\n    else\n    {\n        // Time is up for cursor movement, make sure it's exactly at target\n        gStorage->cursorSprite->x = gStorage->cursorTargetX;\n        gStorage->cursorSprite->y = gStorage->cursorTargetY;\n        DoCursorNewPosUpdate();\n    }\n\n    return TRUE;\n}\n\nstatic void InitNewCursorPos(u8 newCursorArea, u8 newCursorPosition)\n{\n    u16 x, y;\n\n    GetCursorCoordsByPos(newCursorArea, newCursorPosition, &x, &y);\n    gStorage->newCursorArea = newCursorArea;\n    gStorage->newCursorPosition = newCursorPosition;\n    gStorage->cursorTargetX = x;\n    gStorage->cursorTargetY = y;\n}\n\nstatic void InitCursorMove(void)\n{\n    int yDistance, xDistance;\n\n    if (gStorage->cursorVerticalWrap != 0 || gStorage->cursorHorizontalWrap != 0)\n        gStorage->cursorMoveSteps = 12;\n    else\n        gStorage->cursorMoveSteps = 6;\n\n    if (gStorage->cursorFlipTimer)\n        gStorage->cursorFlipTimer = gStorage->cursorMoveSteps / 2;\n\n    switch (gStorage->cursorVerticalWrap)\n    {\n    default:\n        yDistance = gStorage->cursorTargetY - gStorage->cursorSprite->y;\n        break;\n    case -1:\n        yDistance = gStorage->cursorTargetY - 192 - gStorage->cursorSprite->y;\n        break;\n    case 1:\n        yDistance = gStorage->cursorTargetY + 192 - gStorage->cursorSprite->y;\n        break;\n    }\n\n    switch (gStorage->cursorHorizontalWrap)\n    {\n    default:\n        xDistance = gStorage->cursorTargetX - gStorage->cursorSprite->x;\n        break;\n    case -1:\n        xDistance = gStorage->cursorTargetX - 192 - gStorage->cursorSprite->x;\n        break;\n    case 1:\n        xDistance = gStorage->cursorTargetX + 192 - gStorage->cursorSprite->x;\n        break;\n    }\n\n    yDistance <<= 8;\n    xDistance <<= 8;\n    gStorage->cursorSpeedX = xDistance / gStorage->cursorMoveSteps;\n    gStorage->cursorSpeedY = yDistance / gStorage->cursorMoveSteps;\n    gStorage->cursorNewX = gStorage->cursorSprite->x << 8;\n    gStorage->cursorNewY = gStorage->cursorSprite->y << 8;\n}\n\nstatic void SetCursorPosition(u8 newCursorArea, u8 newCursorPosition)\n{\n    InitNewCursorPos(newCursorArea, newCursorPosition);\n    InitCursorMove();\n    if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n    {\n        if (gStorage->inBoxMovingMode == MOVE_MODE_NORMAL && !sIsMonBeingMoved)\n            StartSpriteAnim(gStorage->cursorSprite, 1);\n    }\n    else\n    {\n        if (!IsActiveItemMoving())\n            StartSpriteAnim(gStorage->cursorSprite, 1);\n    }\n\n    if (gStorage->boxOption == OPTION_MOVE_ITEMS)\n    {\n        if (sCursorArea == CURSOR_AREA_IN_BOX)\n            TryHideItemIconAtPos(CURSOR_AREA_IN_BOX, sCursorPosition);\n        else if (sCursorArea == CURSOR_AREA_IN_PARTY)\n            TryHideItemIconAtPos(CURSOR_AREA_IN_PARTY, sCursorPosition);\n\n        if (newCursorArea == CURSOR_AREA_IN_BOX)\n            TryLoadItemIconAtPos(newCursorArea, newCursorPosition);\n        else if (newCursorArea == CURSOR_AREA_IN_PARTY)\n            TryLoadItemIconAtPos(newCursorArea, newCursorPosition);\n    }\n\n    if (newCursorArea == CURSOR_AREA_IN_PARTY && sCursorArea != CURSOR_AREA_IN_PARTY)\n    {\n        gStorage->cursorPrevPartyPos = 1;\n        gStorage->cursorShadowSprite->invisible = TRUE;\n    }\n\n    switch (newCursorArea)\n    {\n    case CURSOR_AREA_IN_PARTY:\n    case CURSOR_AREA_BOX_TITLE:\n    case CURSOR_AREA_BUTTONS:\n        gStorage->cursorSprite->oam.priority = 1;\n        gStorage->cursorShadowSprite->invisible = TRUE;\n        gStorage->cursorShadowSprite->oam.priority = 1;\n        break;\n    case CURSOR_AREA_IN_BOX:\n        if (gStorage->inBoxMovingMode != MOVE_MODE_NORMAL)\n        {\n            gStorage->cursorSprite->oam.priority = 0;\n            gStorage->cursorShadowSprite->invisible = TRUE;\n        }\n        else\n        {\n            gStorage->cursorSprite->oam.priority = 2;\n            if (sCursorArea == CURSOR_AREA_IN_BOX && sIsMonBeingMoved)\n                SetMovingMonPriority(2);\n        }\n        break;\n    }\n}\n\nstatic void DoCursorNewPosUpdate(void)\n{\n    sCursorArea = gStorage->newCursorArea;\n    sCursorPosition = gStorage->newCursorPosition;\n    if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n    {\n        if (gStorage->inBoxMovingMode == MOVE_MODE_NORMAL && !sIsMonBeingMoved)\n            StartSpriteAnim(gStorage->cursorSprite, 1);\n    }\n    else if (!IsActiveItemMoving())\n        StartSpriteAnim(gStorage->cursorSprite, 1);\n\n    TrySetDisplayMonData();\n    switch (sCursorArea)\n    {\n    case CURSOR_AREA_BUTTONS:\n        SetMovingMonPriority(1);\n        break;\n    case CURSOR_AREA_BOX_TITLE:\n        AnimateBoxScrollArrows(TRUE);\n        break;\n    case CURSOR_AREA_IN_PARTY:\n        gStorage->cursorShadowSprite->subpriority = 13;\n        SetMovingMonPriority(1);\n        break;\n    case CURSOR_AREA_IN_BOX:\n        if (gStorage->inBoxMovingMode == MOVE_MODE_NORMAL)\n        {\n            gStorage->cursorSprite->oam.priority = 1;\n            gStorage->cursorShadowSprite->oam.priority = 2;\n            gStorage->cursorShadowSprite->subpriority = 21;\n            gStorage->cursorShadowSprite->invisible = FALSE;\n            SetMovingMonPriority(2);\n        }\n        break;\n    }\n}\n\nvoid SetCursorInParty(void)\n{\n    u8 partyCount;\n\n    if (!sIsMonBeingMoved)\n        partyCount = 0;\n    else\n    {\n        partyCount = CalculatePlayerPartyCount();\n        if (partyCount >= PARTY_SIZE)\n            partyCount = PARTY_SIZE - 1;\n    }\n    if (gStorage->cursorSprite->vFlip)\n        gStorage->cursorFlipTimer = 1;\n    SetCursorPosition(CURSOR_AREA_IN_PARTY, partyCount);\n}\n\nvoid SetCursorBoxPosition(u8 cursorBoxPosition)\n{\n    SetCursorPosition(CURSOR_AREA_IN_BOX, cursorBoxPosition);\n}\n\nvoid ClearSavedCursorPos(void)\n{\n    sSavedCursorPosition = 0;\n}\n\nvoid SaveCursorPos(void)\n{\n    sSavedCursorPosition = sCursorPosition;\n}\n\nu8 GetSavedCursorPos(void)\n{\n    return sSavedCursorPosition;\n}\n\nvoid InitMonPlaceChange(u8 type)\n{\n    static bool8 (*const placeChangeFuncs[])(void) = {\n        [CHANGE_GRAB]  = MonPlaceChange_Grab,\n        [CHANGE_PLACE] = MonPlaceChange_Place,\n        [CHANGE_SHIFT] = MonPlaceChange_Shift,\n    };\n\n    gStorage->monPlaceChangeFunc = placeChangeFuncs[type];\n    gStorage->monPlaceChangeState = 0;\n}\n\nvoid InitMultiMonPlaceChange(bool8 moveCursorUp)\n{\n    if (!moveCursorUp)\n        gStorage->monPlaceChangeFunc = MonPlaceChange_DoMoveCursorDown;\n    else\n        gStorage->monPlaceChangeFunc = MonPlaceChange_DoMoveCursorUp;\n\n    gStorage->monPlaceChangeState = 0;\n}\n\nbool8 DoMonPlaceChange(void)\n{\n    return gStorage->monPlaceChangeFunc();\n}\n\nstatic bool8 MonPlaceChange_Grab(void)\n{\n    switch (gStorage->monPlaceChangeState)\n    {\n    case 0:\n        if (sIsMonBeingMoved)\n            return FALSE;\n        StartSpriteAnim(gStorage->cursorSprite, 2);\n        gStorage->monPlaceChangeState++;\n        break;\n    case 1:\n        if (!MonPlaceChange_MoveCursorDown())\n        {\n            StartSpriteAnim(gStorage->cursorSprite, 3);\n            MoveMon();\n            gStorage->monPlaceChangeState++;\n        }\n        break;\n    case 2:\n        if (!MonPlaceChange_MoveCursorUp())\n            gStorage->monPlaceChangeState++;\n        break;\n    case 3:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 MonPlaceChange_Place(void)\n{\n    switch (gStorage->monPlaceChangeState)\n    {\n    case 0:\n        if (!MonPlaceChange_MoveCursorDown())\n        {\n            StartSpriteAnim(gStorage->cursorSprite, 2);\n            PlaceMon();\n            gStorage->monPlaceChangeState++;\n        }\n        break;\n    case 1:\n        if (!MonPlaceChange_MoveCursorUp())\n        {\n            StartSpriteAnim(gStorage->cursorSprite, 0);\n            gStorage->monPlaceChangeState++;\n        }\n        break;\n    case 2:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 MonPlaceChange_Shift(void)\n{\n    switch (gStorage->monPlaceChangeState)\n    {\n    case 0:\n        switch (sCursorArea)\n        {\n        case CURSOR_AREA_IN_PARTY:\n            gStorage->shiftBoxId = TOTAL_BOXES_COUNT;\n            break;\n        case CURSOR_AREA_IN_BOX:\n            gStorage->shiftBoxId = StorageGetCurrentBox();\n            break;\n        default:\n            return FALSE;\n        }\n        StartSpriteAnim(gStorage->cursorSprite, 2);\n        SetShiftMonSpritePtr(gStorage->shiftBoxId, sCursorPosition);\n        gStorage->monPlaceChangeState++;\n        break;\n    case 1:\n        if (!ShiftMons())\n        {\n            StartSpriteAnim(gStorage->cursorSprite, 3);\n            SetShiftedMonData(gStorage->shiftBoxId, sCursorPosition);\n            gStorage->monPlaceChangeState++;\n        }\n        break;\n    case 2:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 MonPlaceChange_DoMoveCursorDown(void)\n{\n    return MonPlaceChange_MoveCursorDown();\n}\n\nstatic bool8 MonPlaceChange_DoMoveCursorUp(void)\n{\n    return MonPlaceChange_MoveCursorUp();\n}\n\nstatic bool8 MonPlaceChange_MoveCursorDown(void)\n{\n    switch (gStorage->cursorSprite->y2)\n    {\n    default:\n        gStorage->cursorSprite->y2++;\n        break;\n    case 0:\n        gStorage->cursorSprite->y2++;\n        break;\n    case 8: // Cursor has reached bottom\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 MonPlaceChange_MoveCursorUp(void)\n{\n    switch (gStorage->cursorSprite->y2)\n    {\n    case 0: // Cursor has reached top\n        return FALSE;\n    default:\n        gStorage->cursorSprite->y2--;\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic void MoveMon(void)\n{\n    switch (sCursorArea)\n    {\n    case CURSOR_AREA_IN_PARTY:\n        SetMovedMonData(TOTAL_BOXES_COUNT, sCursorPosition);\n        SetMovingMonSprite(MODE_PARTY, sCursorPosition);\n        break;\n    case CURSOR_AREA_IN_BOX:\n        if (gStorage->inBoxMovingMode == MOVE_MODE_NORMAL)\n        {\n            SetMovedMonData(StorageGetCurrentBox(), sCursorPosition);\n            SetMovingMonSprite(MODE_BOX, sCursorPosition);\n        }\n        break;\n    default:\n        return;\n    }\n\n    sIsMonBeingMoved = TRUE;\n}\n\nstatic void PlaceMon(void)\n{\n    u8 boxId;\n\n    switch (sCursorArea)\n    {\n    case CURSOR_AREA_IN_PARTY:\n        SetPlacedMonData(TOTAL_BOXES_COUNT, sCursorPosition);\n        SetPlacedMonSprite(TOTAL_BOXES_COUNT, sCursorPosition);\n        break;\n    case CURSOR_AREA_IN_BOX:\n        boxId = StorageGetCurrentBox();\n        SetPlacedMonData(boxId, sCursorPosition);\n        SetPlacedMonSprite(boxId, sCursorPosition);\n        break;\n    default:\n        return;\n    }\n\n    sIsMonBeingMoved = FALSE;\n}\n\nvoid DoTrySetDisplayMonData(void)\n{\n    TrySetDisplayMonData();\n}\n\nstatic void SetMovedMonData(u8 boxId, u8 position)\n{\n    if (boxId == TOTAL_BOXES_COUNT)\n    {\n        StoreHPAndStatusInBoxMon(&gPlayerParty[sCursorPosition]);\n        gStorage->movingMon = gPlayerParty[sCursorPosition];\n    }\n    else\n    {\n        BoxMonAtToMon(boxId, position, &gStorage->movingMon);\n        PopulateBoxHpAndStatusToPartyMon(&gStorage->movingMon);\n    }\n\n    PurgeMonOrBoxMon(boxId, position);\n    sMovingMonOrigBoxId = boxId;\n    sMovingMonOrigBoxPos = position;\n}\n\nstatic void SetPlacedMonData(u8 boxId, u8 position)\n{\n    if (boxId == TOTAL_BOXES_COUNT)\n    {\n        PopulateBoxHpAndStatusToPartyMon(&gStorage->movingMon); // issue is here\n        gPlayerParty[position] = gStorage->movingMon;\n    }\n    else\n    {\n        if(gSaveBlock1Ptr->keyFlags.noPMC != 1)\n            BoxMonRestorePP(&gStorage->movingMon.box);\n        StoreHPAndStatusInBoxMon(&gStorage->movingMon);\n        SetBoxMonAt(boxId, position, &gStorage->movingMon.box);\n    }\n}\n\nstatic void PurgeMonOrBoxMon(u8 boxId, u8 position)\n{\n    if (boxId == TOTAL_BOXES_COUNT)\n        ZeroMonData(&gPlayerParty[position]);\n    else\n        ZeroBoxMonAt(boxId, position);\n}\n\nstatic void SetShiftedMonData(u8 boxId, u8 position)\n{\n    if (boxId == TOTAL_BOXES_COUNT)\n    {\n        StoreHPAndStatusInBoxMon(&gPlayerParty[position]);\n        gStorage->tempMon = gPlayerParty[position];\n    }\n    else\n    {\n        BoxMonAtToMon(boxId, position, &gStorage->tempMon);\n    }\n\n    SetPlacedMonData(boxId, position);\n    gStorage->movingMon = gStorage->tempMon;\n    SetDisplayMonData(&gStorage->movingMon, MODE_PARTY);\n    sMovingMonOrigBoxId = boxId;\n    sMovingMonOrigBoxPos = position;\n}\n\nbool8 TryStorePartyMonInBox(u8 boxId)\n{\n    s16 boxPosition = GetFirstFreeBoxSpot(boxId);\n    if (boxPosition == -1)\n        return FALSE;\n\n    if (sIsMonBeingMoved)\n    {\n        SetPlacedMonData(boxId, boxPosition);\n        DestroyMovingMonIcon();\n        sIsMonBeingMoved = FALSE;\n    }\n    else\n    {\n        SetMovedMonData(TOTAL_BOXES_COUNT, sCursorPosition);\n        SetPlacedMonData(boxId, boxPosition);\n        DestroyPartyMonIcon(sCursorPosition);\n    }\n\n    if (boxId == StorageGetCurrentBox())\n        CreateBoxMonIconAtPos(boxPosition);\n\n    StartSpriteAnim(gStorage->cursorSprite, 1);\n    return TRUE;\n}\n\nvoid ResetSelectionAfterDeposit(void)\n{\n    StartSpriteAnim(gStorage->cursorSprite, 0);\n    TrySetDisplayMonData();\n}\n\nvoid InitReleaseMon(void)\n{\n    u8 mode;\n\n    if (sIsMonBeingMoved)\n        mode = MODE_MOVE;\n    else if (sCursorArea == CURSOR_AREA_IN_PARTY)\n        mode = MODE_PARTY;\n    else\n        mode = MODE_BOX;\n\n    DoReleaseMonAnim(mode, sCursorPosition);\n    StringCopy(gStorage->releaseMonName, gStorage->displayMonNickname);\n}\n\nbool8 TryHideReleaseMon(void)\n{\n    if (!TryHideReleaseMonSprite())\n    {\n        StartSpriteAnim(gStorage->cursorSprite, 0);\n        return FALSE;\n    }\n    else\n        return TRUE;\n}\n\nvoid ReleaseMon(void)\n{\n    u8 boxId;\n\n    DestroyReleaseMonIcon();\n    if (sIsMonBeingMoved)\n        sIsMonBeingMoved = FALSE;\n    else\n    {\n        if (sCursorArea == CURSOR_AREA_IN_PARTY)\n            boxId = TOTAL_BOXES_COUNT;\n        else\n            boxId = StorageGetCurrentBox();\n\n        PurgeMonOrBoxMon(boxId, sCursorPosition);\n    }\n    TrySetDisplayMonData();\n}\n\nvoid TrySetCursorFistAnim(void)\n{\n    if (sIsMonBeingMoved)\n        StartSpriteAnim(gStorage->cursorSprite, 3);\n}\n\nvoid InitCanReleaseMonVars(void)\n{\n    u16 knownMoveFlags;\n    if (sIsMonBeingMoved)\n    {\n        gStorage->tempMon = gStorage->movingMon;\n        gStorage->releaseBoxId = -1;\n        gStorage->releaseBoxPos = -1;\n    }\n    else\n    {\n        if (sCursorArea == CURSOR_AREA_IN_PARTY)\n        {\n            gStorage->tempMon = gPlayerParty[sCursorPosition];\n            gStorage->releaseBoxId = TOTAL_BOXES_COUNT;\n        }\n        else\n        {\n            BoxMonAtToMon(StorageGetCurrentBox(), sCursorPosition, &gStorage->tempMon);\n            gStorage->releaseBoxId = StorageGetCurrentBox();\n        }\n        gStorage->releaseBoxPos = sCursorPosition;\n    }\n\n    gStorage->isSurfMon = FALSE;\n    gStorage->isDiveMon = FALSE;\n    gStorage->restrictedMoveList[0] = MOVE_SURF;\n    gStorage->restrictedMoveList[1] = MOVE_DIVE;\n    gStorage->restrictedMoveList[2] = MOVES_COUNT;\n    knownMoveFlags = GetMonData(&gStorage->tempMon, MON_DATA_KNOWN_MOVES, (u8 *)gStorage->restrictedMoveList);\n    gStorage->isSurfMon = knownMoveFlags & 1;\n    gStorage->isDiveMon = (knownMoveFlags >> 1) & 1;\n    if (gStorage->isSurfMon || gStorage->isDiveMon)\n        gStorage->releaseMonStatusResolved = FALSE;\n    else\n    {\n        gStorage->releaseMonStatusResolved = TRUE;\n        gStorage->releaseMonStatus = RELEASE_MON_ALLOWED;\n    }\n\n    gStorage->releaseCheckState = 0;\n}\n\ns8 RunCanReleaseMon(void)\n{\n    u16 i;\n    u16 knownMoveFlags;\n\n    if (gStorage->releaseMonStatusResolved)\n        return gStorage->releaseMonStatus;\n\n    switch (gStorage->releaseCheckState)\n    {\n    case 0:\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (gStorage->releaseBoxId != TOTAL_BOXES_COUNT || gStorage->releaseBoxPos != i)\n            {\n                knownMoveFlags = GetMonData(&gPlayerParty[i], MON_DATA_KNOWN_MOVES, (u8 *)gStorage->restrictedMoveList);\n                if (knownMoveFlags & 1)\n                    gStorage->isSurfMon = FALSE;\n                if (knownMoveFlags & 2)\n                    gStorage->isDiveMon = FALSE;\n            }\n        }\n        if (!(gStorage->isSurfMon || gStorage->isDiveMon))\n        {\n            gStorage->releaseMonStatusResolved = TRUE;\n            gStorage->releaseMonStatus = RELEASE_MON_ALLOWED;\n        }\n        else\n        {\n            gStorage->releaseCheckBoxId = 0;\n            gStorage->releaseCheckBoxPos = 0;\n            gStorage->releaseCheckState++;\n        }\n        break;\n    case 1:\n        // for some reason, check only 5 mons in box each time this function is called\n        for (i = 0; i < 5; i++)\n        {\n            knownMoveFlags = GetAndCopyBoxMonDataAt(gStorage->releaseCheckBoxId, gStorage->releaseCheckBoxPos, MON_DATA_KNOWN_MOVES, (u8 *)gStorage->restrictedMoveList);\n            if (knownMoveFlags != 0\n                && !(gStorage->releaseBoxId == gStorage->releaseCheckBoxId && gStorage->releaseBoxPos == gStorage->releaseCheckBoxPos))\n            {\n                if (knownMoveFlags & 1)\n                    gStorage->isSurfMon = FALSE;\n                if (knownMoveFlags & 2)\n                    gStorage->isDiveMon = FALSE;\n            }\n            if (++gStorage->releaseCheckBoxPos >= IN_BOX_COUNT)\n            {\n                gStorage->releaseCheckBoxPos = 0;\n                if (++gStorage->releaseCheckBoxId >= TOTAL_BOXES_COUNT)\n                {\n                    gStorage->releaseMonStatusResolved = TRUE;\n                    gStorage->releaseMonStatus = RELEASE_MON_NOT_ALLOWED;\n                    break;\n                }\n            }\n        }\n        if (!(gStorage->isSurfMon || gStorage->isDiveMon))\n        {\n            gStorage->releaseMonStatusResolved = TRUE;\n            gStorage->releaseMonStatus = RELEASE_MON_ALLOWED;\n        }\n        break;\n    }\n\n    return RELEASE_MON_UNDETERMINED;\n}\n\nvoid SaveMovingMon(void)\n{\n    if (sIsMonBeingMoved)\n        sMonBeingCarried = gStorage->movingMon;\n}\n\nvoid LoadSavedMovingMon(void)\n{\n    if (sIsMonBeingMoved)\n    {\n        if (sMovingMonOrigBoxId == TOTAL_BOXES_COUNT)\n            gStorage->movingMon = sMonBeingCarried;\n        else\n            gStorage->movingMon.box = sMonBeingCarried.box;\n    }\n}\n\nvoid InitSummaryScreenData(void)\n{\n    if (sIsMonBeingMoved)\n    {\n        SaveMovingMon();\n        gStorage->summaryMonPtr.mon = &sMonBeingCarried;\n        gStorage->summaryCursorPos = 0;\n        gStorage->summaryLastIndex = 0;\n        gStorage->summaryScreenMode = PSS_MODE_NORMAL;\n    }\n    else if (sCursorArea == CURSOR_AREA_IN_PARTY)\n    {\n        gStorage->summaryMonPtr.mon = gPlayerParty;\n        gStorage->summaryCursorPos = sCursorPosition;\n        gStorage->summaryLastIndex = CountPartyMons() - 1;\n        gStorage->summaryScreenMode = PSS_MODE_NORMAL;\n    }\n    else\n    {\n        gStorage->summaryMonPtr.box = GetBoxedMonPtr(StorageGetCurrentBox(), 0);\n        gStorage->summaryCursorPos = sCursorPosition;\n        gStorage->summaryLastIndex = IN_BOX_COUNT - 1;\n        gStorage->summaryScreenMode = PSS_MODE_BOX;\n    }\n}\n\nvoid SetSelectionAfterSummaryScreen(void)\n{\n    if (sIsMonBeingMoved)\n        LoadSavedMovingMon();\n    else\n        sCursorPosition = GetLastViewedMonIndex();\n}\n\ns16 CompactPartySlots(void)\n{\n    s16 retVal = -1;\n    u16 i, last;\n\n    for (i = 0, last = 0; i < PARTY_SIZE; i++)\n    {\n        u16 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES);\n        if (species != SPECIES_NONE)\n        {\n            if (i != last)\n                gPlayerParty[last] = gPlayerParty[i];\n            last++;\n        }\n        else if (retVal == -1)\n            retVal = i;\n    }\n    for (; last < PARTY_SIZE; last++)\n        ZeroMonData(gPlayerParty + last);\n\n    return retVal;\n}\n\nvoid SetMonMarkings(u8 markings)\n{\n    gStorage->displayMonMarkings = markings;\n    if (sIsMonBeingMoved)\n        SetMonData(&gStorage->movingMon, MON_DATA_MARKINGS, &markings);\n    else\n    {\n        if (sCursorArea == CURSOR_AREA_IN_PARTY)\n            SetMonData(gPlayerParty + sCursorPosition, MON_DATA_MARKINGS, &markings);\n        if (sCursorArea == CURSOR_AREA_IN_BOX)\n            SetCurrentBoxMonData(sCursorPosition, MON_DATA_MARKINGS, &markings);\n    }\n}\n\nbool8 CanMovePartyMon(void)\n{\n    if (sCursorArea == CURSOR_AREA_IN_PARTY && !sIsMonBeingMoved && CountPartyAliveNonEggMonsExcept(sCursorPosition) == 0)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 CanShiftMon(void)\n{\n    if (sIsMonBeingMoved)\n    {\n        if (sCursorArea == CURSOR_AREA_IN_PARTY && CountPartyAliveNonEggMonsExcept(sCursorPosition) == 0)\n        {\n            if (gStorage->displayMonIsEgg || GetMonData(&gStorage->movingMon, MON_DATA_HP) == 0)\n                return FALSE;\n        }\n        return TRUE;\n    }\n    return FALSE;\n}\n\nbool8 IsMonBeingMoved(void)\n{\n    return sIsMonBeingMoved;\n}\n\nbool8 IsCursorOnBoxTitle(void)\n{\n    return (sCursorArea == CURSOR_AREA_BOX_TITLE);\n}\n\nbool8 IsCursorOnCloseBox(void)\n{\n    return (sCursorArea == CURSOR_AREA_BUTTONS && sCursorPosition == 1);\n}\n\nbool8 IsCursorInBox(void)\n{\n    return (sCursorArea == CURSOR_AREA_IN_BOX);\n}\n\nstatic void TrySetDisplayMonData(void)\n{\n    gStorage->setMosaic = (sIsMonBeingMoved == FALSE);\n    if (!sIsMonBeingMoved)\n    {\n        switch (sCursorArea)\n        {\n        case CURSOR_AREA_IN_PARTY:\n            if (sCursorPosition < PARTY_SIZE)\n            {\n                SetDisplayMonData(&gPlayerParty[sCursorPosition], MODE_PARTY);\n                break;\n            }\n            // fallthrough\n        case CURSOR_AREA_BUTTONS:\n        case CURSOR_AREA_BOX_TITLE:\n            SetDisplayMonData(NULL, MODE_MOVE);\n            break;\n        case CURSOR_AREA_IN_BOX:\n            SetDisplayMonData(GetBoxedMonPtr(StorageGetCurrentBox(), sCursorPosition), MODE_BOX);\n            break;\n        }\n    }\n}\n\nstatic void ReshowDisplayMon(void)\n{\n    if (sIsMonBeingMoved)\n        SetDisplayMonData(&sMonBeingCarried, MODE_PARTY);\n    else\n        TrySetDisplayMonData();\n}\n\n#define displayMonNicknameText        displayMonTexts[0]\n#define displayMonSpeciesNameText     displayMonTexts[1]\n#define displayMonGenderAndLevelText  displayMonTexts[2]\n#define displayMonItemNameText        displayMonTexts[3]\n\nstatic void SetDisplayMonData(void *pokemon, u8 mode)\n{\n    u8 *txtPtr;\n    u16 gender;\n    bool8 sanityIsBagEgg;\n\n    gStorage->displayMonItemId = ITEM_NONE;\n    gender = MON_MALE;\n    sanityIsBagEgg = FALSE;\n    if (mode == MODE_PARTY)\n    {\n        struct Pokemon *mon = (struct Pokemon *)pokemon;\n\n        gStorage->displayMonSpecies = GetMonData(mon, MON_DATA_SPECIES_OR_EGG);\n        if (gStorage->displayMonSpecies != SPECIES_NONE)\n        {\n            sanityIsBagEgg = GetMonData(mon, MON_DATA_SANITY_IS_BAD_EGG);\n            if (sanityIsBagEgg)\n                gStorage->displayMonIsEgg = TRUE;\n            else\n                gStorage->displayMonIsEgg = GetMonData(mon, MON_DATA_IS_EGG);\n\n            GetMonData(mon, MON_DATA_NICKNAME, gStorage->displayMonNickname);\n            StringGet_Nickname(gStorage->displayMonNickname);\n            gStorage->displayMonLevel = GetMonData(mon, MON_DATA_LEVEL);\n            gStorage->displayMonMarkings = GetMonData(mon, MON_DATA_MARKINGS);\n            if(gStorage->displayMonSpecies == SPECIES_DEOXYS)\n                gStorage->displayMonSpecies = GetDeoxysSpeciesFromForme(GetMonData(mon, MON_DATA_FORME));\n            gStorage->displayMonPersonality = GetMonData(mon, MON_DATA_PERSONALITY);\n            gStorage->displayMonPalette = GetMonFrontSpritePal(mon);\n            gender = GetMonGender(mon);\n            gStorage->displayMonItemId = GetMonData(mon, MON_DATA_HELD_ITEM);\n        }\n    }\n    else if (mode == MODE_BOX)\n    {\n        struct BoxPokemon *boxMon = (struct BoxPokemon *)pokemon;\n\n        gStorage->displayMonSpecies = GetBoxMonData(pokemon, MON_DATA_SPECIES_OR_EGG);\n        if (gStorage->displayMonSpecies != SPECIES_NONE)\n        {\n            u32 otId = GetBoxMonData(boxMon, MON_DATA_OT_ID);\n            sanityIsBagEgg = GetBoxMonData(boxMon, MON_DATA_SANITY_IS_BAD_EGG);\n            if (sanityIsBagEgg)\n                gStorage->displayMonIsEgg = TRUE;\n            else\n                gStorage->displayMonIsEgg = GetBoxMonData(boxMon, MON_DATA_IS_EGG);\n\n            GetBoxMonData(boxMon, MON_DATA_NICKNAME, gStorage->displayMonNickname);\n            StringGet_Nickname(gStorage->displayMonNickname);\n            gStorage->displayMonLevel = GetLevelFromBoxMonExp(boxMon);\n            gStorage->displayMonMarkings = GetBoxMonData(boxMon, MON_DATA_MARKINGS);\n            if(gStorage->displayMonSpecies == SPECIES_DEOXYS)\n                gStorage->displayMonSpecies = GetDeoxysSpeciesFromForme(GetBoxMonData(boxMon, MON_DATA_FORME));\n            gStorage->displayMonPersonality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY);\n            gStorage->displayMonPalette = GetMonSpritePalFromSpeciesAndPersonality(gStorage->displayMonSpecies, otId, gStorage->displayMonPersonality);\n            gender = GetGenderFromSpeciesAndPersonality(gStorage->displayMonSpecies, gStorage->displayMonPersonality);\n            gStorage->displayMonItemId = GetBoxMonData(boxMon, MON_DATA_HELD_ITEM);\n        }\n    }\n    else\n    {\n        gStorage->displayMonSpecies = SPECIES_NONE;\n        gStorage->displayMonItemId = ITEM_NONE;\n    }\n\n    if (gStorage->displayMonSpecies == SPECIES_NONE)\n    {\n        StringFill(gStorage->displayMonNickname, CHAR_SPACE, 5);\n        StringFill(gStorage->displayMonNicknameText, CHAR_SPACE, 8);\n        StringFill(gStorage->displayMonSpeciesNameText, CHAR_SPACE, 8);\n        StringFill(gStorage->displayMonGenderAndLevelText, CHAR_SPACE, 8);\n        StringFill(gStorage->displayMonItemNameText, CHAR_SPACE, 8);\n    }\n    else if (gStorage->displayMonIsEgg)\n    {\n        if (sanityIsBagEgg)\n            StringCopyPadded(gStorage->displayMonNicknameText, gStorage->displayMonNickname, CHAR_SPACE, 5);\n        else\n            StringCopyPadded(gStorage->displayMonNicknameText, gText_EggNickname, CHAR_SPACE, 8);\n\n        StringFill(gStorage->displayMonSpeciesNameText, CHAR_SPACE, 8);\n        StringFill(gStorage->displayMonGenderAndLevelText, CHAR_SPACE, 8);\n        StringFill(gStorage->displayMonItemNameText, CHAR_SPACE, 8);\n    }\n    else\n    {\n        if (gStorage->displayMonSpecies == SPECIES_NIDORAN_F || gStorage->displayMonSpecies == SPECIES_NIDORAN_M)\n            gender = MON_GENDERLESS;\n\n        // Buffer nickname\n        StringCopyPadded(gStorage->displayMonNicknameText, gStorage->displayMonNickname, CHAR_SPACE, 5);\n\n        // Buffer species name\n        txtPtr = gStorage->displayMonSpeciesNameText;\n        *(txtPtr)++ = CHAR_SLASH;\n        if(gStorage->displayMonSpecies >= 65530 && gStorage->displayMonSpecies <= 65533)\n            StringCopyPadded(txtPtr, gSpeciesNames[SPECIES_DEOXYS], CHAR_SPACE, 5);\n        else\n            StringCopyPadded(txtPtr, gSpeciesNames[gStorage->displayMonSpecies], CHAR_SPACE, 5);\n\n        // Buffer gender and level\n        txtPtr = gStorage->displayMonGenderAndLevelText;\n        *(txtPtr)++ = EXT_CTRL_CODE_BEGIN;\n        *(txtPtr)++ = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;\n        switch (gender)\n        {\n        case MON_MALE:\n            *(txtPtr)++ = TEXT_COLOR_RED;\n            *(txtPtr)++ = TEXT_COLOR_WHITE;\n            *(txtPtr)++ = TEXT_COLOR_LIGHT_RED;\n            *(txtPtr)++ = CHAR_MALE;\n            break;\n        case MON_FEMALE:\n            *(txtPtr)++ = TEXT_COLOR_GREEN;\n            *(txtPtr)++ = TEXT_COLOR_WHITE;\n            *(txtPtr)++ = TEXT_COLOR_LIGHT_GREEN;\n            *(txtPtr)++ = CHAR_FEMALE;\n            break;\n        default:\n            *(txtPtr)++ = TEXT_COLOR_DARK_GRAY;\n            *(txtPtr)++ = TEXT_COLOR_WHITE;\n            *(txtPtr)++ = TEXT_COLOR_LIGHT_GRAY;\n            *(txtPtr)++ = CHAR_SPACE;\n            break;\n        }\n\n        *(txtPtr++) = EXT_CTRL_CODE_BEGIN;\n        *(txtPtr++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;\n        *(txtPtr++) = TEXT_COLOR_DARK_GRAY;\n        *(txtPtr++) = TEXT_COLOR_WHITE;\n        *(txtPtr++) = TEXT_COLOR_LIGHT_GRAY;\n        *(txtPtr++) = CHAR_SPACE;\n        *(txtPtr++) = CHAR_EXTRA_SYMBOL;\n        *(txtPtr++) = CHAR_LV_2;\n\n        txtPtr = ConvertIntToDecimalStringN(txtPtr, gStorage->displayMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3);\n        txtPtr[0] = CHAR_SPACE;\n        txtPtr[1] = EOS;\n\n        // Buffer item name\n        if (gStorage->displayMonItemId != ITEM_NONE)\n            StringCopyPadded(gStorage->displayMonItemNameText, ItemId_GetName(gStorage->displayMonItemId), CHAR_SPACE, 8);\n        else\n            StringFill(gStorage->displayMonItemNameText, CHAR_SPACE, 8);\n    }\n}\n\n#undef displayMonNicknameText\n#undef displayMonSpeciesNameText\n#undef displayMonGenderAndLevelText\n#undef displayMonItemNameText\n\nstatic u8 HandleInput_InBox(void)\n{\n    switch (gStorage->inBoxMovingMode)\n    {\n    case MOVE_MODE_NORMAL:\n    default:\n        return HandleInput_InBox_Normal();\n    case MOVE_MODE_MULTIPLE_SELECTING:\n        return HandleInput_InBox_GrabbingMultiple();\n    case MOVE_MODE_MULTIPLE_MOVING:\n        return HandleInput_InBox_MovingMultiple();\n    }\n}\n\nstatic u8 HandleInput_InBox_Normal(void)\n{\n    u8 input;\n    s8 cursorArea;\n    s8 cursorPosition;\n\n    do\n    {\n        cursorArea = sCursorArea;\n        cursorPosition = sCursorPosition;\n        gStorage->cursorVerticalWrap = 0;\n        gStorage->cursorHorizontalWrap = 0;\n        gStorage->cursorFlipTimer = 0;\n        if (JOY_REPT(DPAD_UP))\n        {\n            input = INPUT_MOVE_CURSOR;\n            if (sCursorPosition >= IN_BOX_COLUMNS)\n                cursorPosition -= IN_BOX_COLUMNS;\n            else\n            {\n                cursorArea = CURSOR_AREA_BOX_TITLE;\n                cursorPosition = 0;\n            }\n            break;\n        }\n        else if (JOY_REPT(DPAD_DOWN))\n        {\n            input = INPUT_MOVE_CURSOR;\n            cursorPosition += IN_BOX_COLUMNS;\n            if (cursorPosition >= IN_BOX_COUNT)\n            {\n                cursorArea = CURSOR_AREA_BUTTONS;\n                cursorPosition -= IN_BOX_COUNT;\n                cursorPosition /= 3;\n                gStorage->cursorVerticalWrap = 1;\n                gStorage->cursorFlipTimer = 1;\n            }\n            break;\n        }\n        else if (JOY_REPT(DPAD_LEFT))\n        {\n            input = INPUT_MOVE_CURSOR;\n            if (sCursorPosition % IN_BOX_COLUMNS != 0)\n                cursorPosition--;\n            else\n            {\n                gStorage->cursorHorizontalWrap = -1;\n                cursorPosition += (IN_BOX_COLUMNS - 1);\n            }\n            break;\n        }\n        else if (JOY_REPT(DPAD_RIGHT))\n        {\n            input = INPUT_MOVE_CURSOR;\n            if ((sCursorPosition + 1) % IN_BOX_COLUMNS != 0)\n                cursorPosition++;\n            else\n            {\n                gStorage->cursorHorizontalWrap = 1;\n                cursorPosition -= (IN_BOX_COLUMNS - 1);\n            }\n            break;\n        }\n        else if (JOY_NEW(START_BUTTON))\n        {\n            input = INPUT_MOVE_CURSOR;\n            cursorArea = CURSOR_AREA_BOX_TITLE;\n            cursorPosition = 0;\n            break;\n        }\n\n        if ((JOY_NEW(A_BUTTON)) && SetSelectionMenuTexts())\n        {\n            if (!sInMultiMoveMode)\n                return INPUT_IN_MENU;\n\n            if (gStorage->boxOption != OPTION_MOVE_MONS || sIsMonBeingMoved == TRUE)\n            {\n                switch (GetMenuItemTextId(0))\n                {\n                case MENU_TEXT_STORE:\n                    return INPUT_DEPOSIT;\n                case MENU_TEXT_WITHDRAW:\n                    return INPUT_WITHDRAW;\n                case MENU_TEXT_MOVE:\n                    return INPUT_MOVE_MON;\n                case MENU_TEXT_SHIFT:\n                    return INPUT_SHIFT_MON;\n                case MENU_TEXT_PLACE:\n                    return INPUT_PLACE_MON;\n                case MENU_TEXT_TAKE:\n                    return INPUT_TAKE_ITEM;\n                case MENU_TEXT_GIVE:\n                    return INPUT_GIVE_ITEM;\n                case MENU_TEXT_SWITCH:\n                    return INPUT_SWITCH_ITEMS;\n                }\n            }\n            else\n            {\n                gStorage->inBoxMovingMode = MOVE_MODE_MULTIPLE_SELECTING;\n                return INPUT_MULTIMOVE_START;\n            }\n        }\n\n        if (JOY_NEW(B_BUTTON))\n            return INPUT_PRESSED_B;\n\n        if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)\n        {\n            if (JOY_HELD(L_BUTTON))\n                return INPUT_SCROLL_LEFT;\n            if (JOY_HELD(R_BUTTON))\n                return INPUT_SCROLL_RIGHT;\n        }\n\n        if (JOY_NEW(SELECT_BUTTON))\n        {\n            ToggleCursorMultiMoveMode();\n            return INPUT_NONE;\n        }\n\n        input = INPUT_NONE;\n\n    } while (FALSE);\n\n    if (input != INPUT_NONE)\n        SetCursorPosition(cursorArea, cursorPosition);\n\n    return input;\n}\n\nstatic u8 HandleInput_InBox_GrabbingMultiple(void)\n{\n    if (JOY_HELD(A_BUTTON))\n    {\n        if (JOY_REPT(DPAD_UP))\n        {\n            if (sCursorPosition / IN_BOX_COLUMNS != 0)\n            {\n                SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition - IN_BOX_COLUMNS);\n                return INPUT_MULTIMOVE_CHANGE_SELECTION;\n            }\n            else\n                return INPUT_MULTIMOVE_UNABLE;\n        }\n        else if (JOY_REPT(DPAD_DOWN))\n        {\n            if (sCursorPosition + IN_BOX_COLUMNS < IN_BOX_COUNT)\n            {\n                SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition + IN_BOX_COLUMNS);\n                return INPUT_MULTIMOVE_CHANGE_SELECTION;\n            }\n            else\n                return INPUT_MULTIMOVE_UNABLE;\n        }\n        else if (JOY_REPT(DPAD_LEFT))\n        {\n            if (sCursorPosition % IN_BOX_COLUMNS != 0)\n            {\n                SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition - 1);\n                return INPUT_MULTIMOVE_CHANGE_SELECTION;\n            }\n            else\n                return INPUT_MULTIMOVE_UNABLE;\n        }\n        else if (JOY_REPT(DPAD_RIGHT))\n        {\n            if ((sCursorPosition + 1) % IN_BOX_COLUMNS != 0)\n            {\n                SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition + 1);\n                return INPUT_MULTIMOVE_CHANGE_SELECTION;\n            }\n            else\n                return INPUT_MULTIMOVE_UNABLE;\n        }\n        else\n            return INPUT_NONE;\n    }\n    else\n    {\n        if (MultiMove_GetOriginPosition() == sCursorPosition)\n        {\n            gStorage->inBoxMovingMode = MOVE_MODE_NORMAL;\n            gStorage->cursorShadowSprite->invisible = FALSE;\n            return INPUT_MULTIMOVE_SINGLE;\n        }\n        else\n        {\n            sIsMonBeingMoved = (gStorage->displayMonSpecies != SPECIES_NONE);\n            gStorage->inBoxMovingMode = MOVE_MODE_MULTIPLE_MOVING;\n            sMovingMonOrigBoxId = StorageGetCurrentBox();\n            return INPUT_MULTIMOVE_GRAB_SELECTION;\n        }\n    }\n}\n\nstatic u8 HandleInput_InBox_MovingMultiple(void)\n{\n    if (JOY_REPT(DPAD_UP))\n    {\n        if (MultiMove_TryMoveGroup(0))\n        {\n            SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition - IN_BOX_COLUMNS);\n            return INPUT_MULTIMOVE_MOVE_MONS;\n        }\n        else\n            return INPUT_MULTIMOVE_UNABLE;\n    }\n    else if (JOY_REPT(DPAD_DOWN))\n    {\n        if (MultiMove_TryMoveGroup(1))\n        {\n            SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition + IN_BOX_COLUMNS);\n            return INPUT_MULTIMOVE_MOVE_MONS;\n        }\n        else\n            return INPUT_MULTIMOVE_UNABLE;\n    }\n    else if (JOY_REPT(DPAD_LEFT))\n    {\n        if (MultiMove_TryMoveGroup(2))\n        {\n            SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition - 1);\n            return INPUT_MULTIMOVE_MOVE_MONS;\n        }\n        else\n            return INPUT_SCROLL_LEFT;\n    }\n    else if (JOY_REPT(DPAD_RIGHT))\n    {\n        if (MultiMove_TryMoveGroup(3))\n        {\n            SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition + 1);\n            return INPUT_MULTIMOVE_MOVE_MONS;\n        }\n        else\n            return INPUT_SCROLL_RIGHT;\n    }\n    else if (JOY_NEW(A_BUTTON))\n    {\n        if (MultiMove_CanPlaceSelection())\n        {\n            sIsMonBeingMoved = FALSE;\n            gStorage->inBoxMovingMode = MOVE_MODE_NORMAL;\n            return INPUT_MULTIMOVE_PLACE_MONS;\n        }\n        else\n            return INPUT_MULTIMOVE_UNABLE;\n    }\n    else if (JOY_NEW(B_BUTTON))\n        return INPUT_MULTIMOVE_UNABLE;\n\n    else\n    {\n        if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)\n        {\n            if (JOY_HELD(L_BUTTON))\n                return INPUT_SCROLL_LEFT;\n            if (JOY_HELD(R_BUTTON))\n                return INPUT_SCROLL_RIGHT;\n        }\n\n        return INPUT_NONE;\n    }\n}\n\nstatic u8 HandleInput_InParty(void)\n{\n    u8 input;\n    bool8 gotoBox;\n    s8 cursorArea;\n    s8 cursorPosition;\n\n    do\n    {\n        cursorArea = sCursorArea;\n        cursorPosition = sCursorPosition;\n        gStorage->cursorHorizontalWrap = 0;\n        gStorage->cursorVerticalWrap = 0;\n        gStorage->cursorFlipTimer = 0;\n        gotoBox = FALSE;\n        input = INPUT_NONE;\n\n        if (JOY_REPT(DPAD_UP))\n        {\n            if (--cursorPosition < 0)\n                cursorPosition = PARTY_SIZE;\n            if (cursorPosition != sCursorPosition)\n                input = INPUT_MOVE_CURSOR;\n            break;\n        }\n        else if (JOY_REPT(DPAD_DOWN))\n        {\n            if (++cursorPosition > PARTY_SIZE)\n                cursorPosition = 0;\n            if (cursorPosition != sCursorPosition)\n                input = INPUT_MOVE_CURSOR;\n            break;\n        }\n        else if (JOY_REPT(DPAD_LEFT) && sCursorPosition != 0)\n        {\n            input = INPUT_MOVE_CURSOR;\n            gStorage->cursorPrevPartyPos = sCursorPosition;\n            cursorPosition = 0;\n            break;\n        }\n        else if (JOY_REPT(DPAD_RIGHT))\n        {\n            if (sCursorPosition == 0)\n            {\n                input = INPUT_MOVE_CURSOR;\n                cursorPosition = gStorage->cursorPrevPartyPos;\n            }\n            else\n            {\n                input = INPUT_HIDE_PARTY;\n                cursorArea = CURSOR_AREA_IN_BOX;\n                cursorPosition = 0;\n            }\n            break;\n        }\n\n        if (JOY_NEW(A_BUTTON))\n        {\n            if (sCursorPosition == PARTY_SIZE)\n            {\n                if (gStorage->boxOption == OPTION_DEPOSIT)\n                    return INPUT_CLOSE_BOX;\n\n                gotoBox = TRUE;\n            }\n            else if (SetSelectionMenuTexts())\n            {\n                if (!sInMultiMoveMode)\n                    return INPUT_IN_MENU;\n\n                switch (GetMenuItemTextId(0))\n                {\n                case MENU_TEXT_STORE:\n                    return INPUT_DEPOSIT;\n                case MENU_TEXT_WITHDRAW:\n                    return INPUT_WITHDRAW;\n                case MENU_TEXT_MOVE:\n                    return INPUT_MOVE_MON;\n                case MENU_TEXT_SHIFT:\n                    return INPUT_SHIFT_MON;\n                case MENU_TEXT_PLACE:\n                    return INPUT_PLACE_MON;\n                case MENU_TEXT_TAKE:\n                    return INPUT_TAKE_ITEM;\n                case MENU_TEXT_GIVE:\n                    return INPUT_GIVE_ITEM;\n                case MENU_TEXT_SWITCH:\n                    return INPUT_SWITCH_ITEMS;\n                }\n            }\n        }\n\n        if (JOY_NEW(B_BUTTON))\n        {\n            if (gStorage->boxOption == OPTION_DEPOSIT)\n                return INPUT_PRESSED_B;\n\n            gotoBox = TRUE;\n        }\n\n        if (gotoBox)\n        {\n            input = INPUT_HIDE_PARTY;\n            cursorArea = CURSOR_AREA_IN_BOX;\n            cursorPosition = 0;\n        }\n        else if (JOY_NEW(SELECT_BUTTON))\n        {\n            ToggleCursorMultiMoveMode();\n            return INPUT_NONE;\n        }\n\n    } while (FALSE);\n\n    if (input != INPUT_NONE && input != INPUT_HIDE_PARTY)\n        SetCursorPosition(cursorArea, cursorPosition);\n\n    return input;\n}\n\nstatic u8 HandleInput_BoxTitle(void)\n{\n    u8 input;\n    s8 cursorArea;\n    s8 cursorPosition;\n\n    do\n    {\n        gStorage->cursorHorizontalWrap = 0;\n        gStorage->cursorVerticalWrap = 0;\n        gStorage->cursorFlipTimer = 0;\n\n        if (JOY_REPT(DPAD_UP))\n        {\n            input = INPUT_MOVE_CURSOR;\n            cursorArea = CURSOR_AREA_BUTTONS;\n            cursorPosition = 0;\n            gStorage->cursorFlipTimer = 1;\n            break;\n        }\n        else if (JOY_REPT(DPAD_DOWN))\n        {\n            input = INPUT_MOVE_CURSOR;\n            cursorArea = CURSOR_AREA_IN_BOX;\n            cursorPosition = 2;\n            break;\n        }\n\n        if (JOY_HELD(DPAD_LEFT))\n            return INPUT_SCROLL_LEFT;\n        if (JOY_HELD(DPAD_RIGHT))\n            return INPUT_SCROLL_RIGHT;\n\n        if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)\n        {\n            if (JOY_HELD(L_BUTTON))\n                return INPUT_SCROLL_LEFT;\n            if (JOY_HELD(R_BUTTON))\n                return INPUT_SCROLL_RIGHT;\n        }\n\n        if (JOY_NEW(A_BUTTON))\n        {\n            AnimateBoxScrollArrows(FALSE);\n            AddBoxMenu();\n            return INPUT_BOX_OPTIONS;\n        }\n\n        if (JOY_NEW(B_BUTTON))\n            return INPUT_PRESSED_B;\n\n        if (JOY_NEW(SELECT_BUTTON))\n        {\n            ToggleCursorMultiMoveMode();\n            return INPUT_NONE;\n        }\n\n        input = INPUT_NONE;\n\n    } while (FALSE);\n\n    if (input != INPUT_NONE)\n    {\n        if (cursorArea != CURSOR_AREA_BOX_TITLE)\n            AnimateBoxScrollArrows(FALSE);\n        SetCursorPosition(cursorArea, cursorPosition);\n    }\n\n    return input;\n}\n\nstatic u8 HandleInput_OnButtons(void)\n{\n    u8 input;\n    s8 cursorArea;\n    s8 cursorPosition;\n    s8 prevPos;\n\n    do\n    {\n        cursorArea = sCursorArea;\n        cursorPosition = sCursorPosition;\n        gStorage->cursorHorizontalWrap = 0;\n        gStorage->cursorVerticalWrap = 0;\n        gStorage->cursorFlipTimer = 0;\n\n        if (JOY_REPT(DPAD_UP))\n        {\n            input = INPUT_MOVE_CURSOR;\n            cursorArea = CURSOR_AREA_IN_BOX;\n            gStorage->cursorVerticalWrap = -1;\n            if (sCursorPosition == 0)\n                cursorPosition = IN_BOX_COUNT - 1 - 5;\n            else\n                cursorPosition = IN_BOX_COUNT - 1;\n            gStorage->cursorFlipTimer = 1;\n            break;\n        }\n        else if (JOY_REPT(DPAD_DOWN | START_BUTTON))\n        {\n            input = INPUT_MOVE_CURSOR;\n            cursorArea = CURSOR_AREA_BOX_TITLE;\n            cursorPosition = 0;\n            gStorage->cursorFlipTimer = 1;\n            break;\n        }\n\n        if (JOY_REPT(DPAD_LEFT))\n        {\n            input = INPUT_MOVE_CURSOR;\n            if (--cursorPosition < 0)\n                cursorPosition = 1;\n            break;\n        }\n        else if (JOY_REPT(DPAD_RIGHT))\n        {\n            input = INPUT_MOVE_CURSOR;\n            if (++cursorPosition > 1)\n                cursorPosition = 0;\n            break;\n        }\n\n        if (JOY_NEW(A_BUTTON))\n            return cursorPosition == 0 ? INPUT_SHOW_PARTY : INPUT_CLOSE_BOX;\n\n        if (JOY_NEW(B_BUTTON))\n            return INPUT_PRESSED_B;\n\n        if (JOY_NEW(SELECT_BUTTON))\n        {\n            ToggleCursorMultiMoveMode();\n            return INPUT_NONE;\n        }\n\n        input = INPUT_NONE;\n    } while (FALSE);\n\n    if (input != INPUT_NONE)\n        SetCursorPosition(cursorArea, cursorPosition);\n\n    return input;\n}\n\nu8 HandleInput(void)\n{\n    struct\n    {\n        u8 (*func)(void);\n        s8 area;\n    }\n    static const inputFuncs[] = {\n        {HandleInput_InBox,     CURSOR_AREA_IN_BOX},\n        {HandleInput_InParty,   CURSOR_AREA_IN_PARTY},\n        {HandleInput_BoxTitle,  CURSOR_AREA_BOX_TITLE},\n        {HandleInput_OnButtons, CURSOR_AREA_BUTTONS},\n        {NULL, 0},\n    };\n\n    u16 i = 0;\n    while (inputFuncs[i].func != NULL)\n    {\n        if (inputFuncs[i].area == sCursorArea)\n            return inputFuncs[i].func();\n        i++;\n    }\n\n    return INPUT_NONE;\n}\n\nstatic void AddBoxMenu(void)\n{\n    InitMenu();\n    SetMenuText(MENU_TEXT_JUMP);\n    SetMenuText(MENU_TEXT_WALLPAPER);\n    SetMenuText(MENU_TEXT_NAME);\n    SetMenuText(MENU_TEXT_CANCEL);\n}\n\nstatic bool8 SetSelectionMenuTexts(void)\n{\n    InitMenu();\n    if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n        return SetMenuTextsForMon();\n    else\n        return SetMenuTextsForItem();\n}\n\nstatic bool8 SetMenuTextsForMon(void)\n{\n    u16 species = GetSpeciesAtCursorPosition();\n\n    switch (gStorage->boxOption)\n    {\n    case OPTION_DEPOSIT:\n        if (species != SPECIES_NONE)\n            SetMenuText(MENU_TEXT_STORE);\n        else\n            return FALSE;\n        break;\n    case OPTION_WITHDRAW:\n        if (species != SPECIES_NONE)\n            SetMenuText(MENU_TEXT_WITHDRAW);\n        else\n            return FALSE;\n        break;\n    case OPTION_MOVE_MONS:\n        if (sIsMonBeingMoved)\n        {\n            if (species != SPECIES_NONE)\n                SetMenuText(MENU_TEXT_SHIFT);\n            else\n                SetMenuText(MENU_TEXT_PLACE);\n        }\n        else\n        {\n            if (species != SPECIES_NONE)\n                SetMenuText(MENU_TEXT_MOVE);\n            else\n                return FALSE;\n        }\n        break;\n    case OPTION_MOVE_ITEMS:\n    default:\n        return FALSE;\n    }\n\n    SetMenuText(MENU_TEXT_SUMMARY);\n    if (gStorage->boxOption == OPTION_MOVE_MONS)\n    {\n        if (!sCursorArea)\n            SetMenuText(MENU_TEXT_WITHDRAW);\n        else\n            SetMenuText(MENU_TEXT_STORE);\n    }\n\n    SetMenuText(MENU_TEXT_MARK);\n    SetMenuText(MENU_TEXT_RELEASE);\n    SetMenuText(MENU_TEXT_CANCEL);\n    return TRUE;\n}\n\nstatic bool8 SetMenuTextsForItem(void)\n{\n    if (gStorage->displayMonSpecies == SPECIES_EGG)\n        return FALSE;\n\n    if (!IsActiveItemMoving())\n    {\n        if (gStorage->displayMonItemId == ITEM_NONE)\n        {\n            if (gStorage->displayMonSpecies == SPECIES_NONE)\n                return FALSE;\n\n            SetMenuText(MENU_TEXT_GIVE2);\n        }\n        else\n        {\n            if (!ItemIsMail(gStorage->displayMonItemId))\n            {\n                SetMenuText(MENU_TEXT_TAKE);\n                SetMenuText(MENU_TEXT_BAG);\n            }\n            SetMenuText(MENU_TEXT_INFO);\n        }\n    }\n    else\n    {\n        if (gStorage->displayMonItemId == ITEM_NONE)\n        {\n            if (gStorage->displayMonSpecies == SPECIES_NONE)\n                return FALSE;\n\n            SetMenuText(MENU_TEXT_GIVE);\n        }\n        else\n        {\n            if (ItemIsMail(gStorage->displayMonItemId) == TRUE)\n                return FALSE;\n\n            SetMenuText(MENU_TEXT_SWITCH);\n        }\n    }\n\n    SetMenuText(MENU_TEXT_CANCEL);\n    return TRUE;\n}\n\nstatic void SpriteCB_CursorShadow(struct Sprite *sprite)\n{\n    sprite->x = gStorage->cursorSprite->x;\n    sprite->y = gStorage->cursorSprite->y + 20;\n}\n\nstatic void CreateCursorSprites(void)\n{\n    u16 x, y;\n    u8 spriteId;\n    u8 priority, subpriority;\n    struct SpriteSheet spriteSheets[] = {\n        {sHandCursorTiles, 0x800, GFXTAG_CURSOR},\n        {sHandCursorShadowTiles, 0x80, GFXTAG_CURSOR_SHADOW},\n        {}\n    };\n\n    struct SpritePalette spritePalettes[] = {\n        {sPokeStorageMisc1Pal, PALTAG_MISC_1},\n        {}\n    };\n\n    static const struct OamData sOamData_Cursor = {\n        .shape = SPRITE_SHAPE(32x32),\n        .size = SPRITE_SIZE(32x32),\n        .priority = 1,\n    };\n    static const struct OamData sOamData_CursorShadow = {\n        .shape = SPRITE_SHAPE(16x16),\n        .size = SPRITE_SIZE(16x16),\n        .priority = 1,\n    };\n\n    static const union AnimCmd sAnim_Cursor_Bouncing[] = {\n        ANIMCMD_FRAME(0, 30),\n        ANIMCMD_FRAME(16, 30),\n        ANIMCMD_JUMP(0)\n    };\n    static const union AnimCmd sAnim_Cursor_Still[] = {\n        ANIMCMD_FRAME(0, 5),\n        ANIMCMD_END\n    };\n    static const union AnimCmd sAnim_Cursor_Open[] = {\n        ANIMCMD_FRAME(32, 5),\n        ANIMCMD_END\n    };\n    static const union AnimCmd sAnim_Cursor_Fist[] = {\n        ANIMCMD_FRAME(48, 5),\n        ANIMCMD_END\n    };\n\n    static const union AnimCmd *const sAnims_Cursor[] = {\n        [CURSOR_ANIM_BOUNCE] = sAnim_Cursor_Bouncing,\n        [CURSOR_ANIM_STILL]  = sAnim_Cursor_Still,\n        [CURSOR_ANIM_OPEN]   = sAnim_Cursor_Open,\n        [CURSOR_ANIM_FIST]   = sAnim_Cursor_Fist,\n    };\n\n    static const struct SpriteTemplate sSpriteTemplate_Cursor = {\n        .tileTag = GFXTAG_CURSOR,\n        .paletteTag = PALTAG_MISC_2,\n        .oam = &sOamData_Cursor,\n        .anims = sAnims_Cursor,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy,\n    };\n\n    static const struct SpriteTemplate sSpriteTemplate_CursorShadow = {\n        .tileTag = GFXTAG_CURSOR_SHADOW,\n        .paletteTag = PALTAG_MISC_2,\n        .oam = &sOamData_CursorShadow,\n        .anims = gDummySpriteAnimTable,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_CursorShadow,\n    };\n\n    LoadSpriteSheets(spriteSheets);\n    LoadSpritePalettes(spritePalettes);\n    gStorage->cursorPalNums[0] = IndexOfSpritePaletteTag(PALTAG_MISC_2);\n    gStorage->cursorPalNums[1] = IndexOfSpritePaletteTag(PALTAG_MISC_1);\n\n    GetCursorCoordsByPos(sCursorArea, sCursorPosition, &x, &y);\n    spriteId = CreateSprite(&sSpriteTemplate_Cursor, x, y, 6);\n    if (spriteId != MAX_SPRITES)\n    {\n        gStorage->cursorSprite = &gSprites[spriteId];\n        gStorage->cursorSprite->oam.paletteNum = gStorage->cursorPalNums[sInMultiMoveMode];\n        gStorage->cursorSprite->oam.priority = 1;\n        if (sIsMonBeingMoved)\n            StartSpriteAnim(gStorage->cursorSprite, 3);\n    }\n    else\n        gStorage->cursorSprite = NULL;\n\n\n    if (sCursorArea == CURSOR_AREA_IN_PARTY)\n    {\n        subpriority = 13;\n        priority = 1;\n    }\n    else\n    {\n        subpriority = 21;\n        priority = 2;\n    }\n\n    spriteId = CreateSprite(&sSpriteTemplate_CursorShadow, 0, 0, subpriority);\n    if (spriteId != MAX_SPRITES)\n    {\n        gStorage->cursorShadowSprite = &gSprites[spriteId];\n        gStorage->cursorShadowSprite->oam.priority = priority;\n        if (sCursorArea)\n            gStorage->cursorShadowSprite->invisible = 1;\n    }\n    else\n        gStorage->cursorShadowSprite = NULL;\n}\n\nstatic void ToggleCursorMultiMoveMode(void)\n{\n    sInMultiMoveMode = !sInMultiMoveMode;\n    gStorage->cursorSprite->oam.paletteNum = gStorage->cursorPalNums[sInMultiMoveMode];\n}\n\nu8 GetBoxCursorPosition(void)\n{\n    return sCursorPosition;\n}\n\nvoid GetCursorBoxColumnAndRow(u8 *column, u8 *row)\n{\n    if (sCursorArea == CURSOR_AREA_IN_BOX)\n    {\n        *column = sCursorPosition % IN_BOX_COLUMNS;\n        *row = sCursorPosition / IN_BOX_COLUMNS;\n    }\n    else\n    {\n        *column = 0;\n        *row = 0;\n    }\n}\n\nvoid StartCursorAnim(u8 animNum)\n{\n    StartSpriteAnim(gStorage->cursorSprite, animNum);\n}\n\nu8 GetMovingMonOriginalBoxId(void)\n{\n    return sMovingMonOrigBoxId;\n}\n\nvoid SetCursorPriorityTo1(void)\n{\n    gStorage->cursorSprite->oam.priority = 1;\n}\n\nvoid TryHideItemAtCursor(void)\n{\n    if (sCursorArea == CURSOR_AREA_IN_BOX)\n        TryHideItemIconAtPos(CURSOR_AREA_IN_BOX, sCursorPosition);\n}\n\nvoid TryShowItemAtCursor(void)\n{\n    if (sCursorArea == CURSOR_AREA_IN_BOX)\n        TryLoadItemIconAtPos(CURSOR_AREA_IN_BOX, sCursorPosition);\n}\n\nstatic const u8 *const sMenuTexts[] = {\n    [MENU_TEXT_CANCEL]     = gPCText_Cancel,\n    [MENU_TEXT_STORE]      = gPCText_Store,\n    [MENU_TEXT_WITHDRAW]   = gPCText_Withdraw,\n    [MENU_TEXT_MOVE]       = gPCText_Move,\n    [MENU_TEXT_SHIFT]      = gPCText_Shift,\n    [MENU_TEXT_PLACE]      = gPCText_Place,\n    [MENU_TEXT_SUMMARY]    = gPCText_Summary,\n    [MENU_TEXT_RELEASE]    = gPCText_Release,\n    [MENU_TEXT_MARK]       = gPCText_Mark,\n    [MENU_TEXT_JUMP]       = gPCText_Jump,\n    [MENU_TEXT_WALLPAPER]  = gPCText_Wallpaper,\n    [MENU_TEXT_NAME]       = gPCText_Name,\n    [MENU_TEXT_TAKE]       = gPCText_Take,\n    [MENU_TEXT_GIVE]       = gPCText_Give,\n    [MENU_TEXT_GIVE2]      = gPCText_Give,\n    [MENU_TEXT_SWITCH]     = gPCText_Switch,\n    [MENU_TEXT_BAG]        = gPCText_Bag,\n    [MENU_TEXT_INFO]       = gPCText_Info,\n    [MENU_TEXT_SCENERY_1]  = gPCText_Scenery1,\n    [MENU_TEXT_SCENERY_2]  = gPCText_Scenery2,\n    [MENU_TEXT_SCENERY_3]  = gPCText_Scenery3,\n    [MENU_TEXT_ETCETERA]   = gPCText_Etcetera,\n    [MENU_TEXT_FOREST]     = gPCText_Forest,\n    [MENU_TEXT_CITY]       = gPCText_City,\n    [MENU_TEXT_DESERT]     = gPCText_Desert,\n    [MENU_TEXT_SAVANNA]    = gPCText_Savanna,\n    [MENU_TEXT_CRAG]       = gPCText_Crag,\n    [MENU_TEXT_VOLCANO]    = gPCText_Volcano,\n    [MENU_TEXT_SNOW]       = gPCText_Snow,\n    [MENU_TEXT_CAVE]       = gPCText_Cave,\n    [MENU_TEXT_BEACH]      = gPCText_Beach,\n    [MENU_TEXT_SEAFLOOR]   = gPCText_Seafloor,\n    [MENU_TEXT_RIVER]      = gPCText_River,\n    [MENU_TEXT_SKY]        = gPCText_Sky,\n    [MENU_TEXT_POLKADOT]   = gPCText_PolkaDot,\n    [MENU_TEXT_POKECENTER] = gPCText_Pokecenter,\n    [MENU_TEXT_MACHINE]    = gPCText_Machine,\n    [MENU_TEXT_SIMPLE]     = gPCText_Simple,\n};\n\nvoid InitMenu(void)\n{\n    gStorage->menuItemsCount = 0;\n    gStorage->menuWidth = 0;\n    gStorage->menuWindow.bg = 0;\n    gStorage->menuWindow.paletteNum = 15;\n    gStorage->menuWindow.baseBlock = 92;\n}\n\nvoid SetMenuText(u8 textId)\n{\n    if (gStorage->menuItemsCount < ARRAY_COUNT(gStorage->menuItems))\n    {\n        u8 len;\n        struct StorageMenu *menu = &gStorage->menuItems[gStorage->menuItemsCount];\n\n        menu->text = sMenuTexts[textId];\n        menu->textId = textId;\n        len = StringLength(menu->text);\n        if (len > gStorage->menuWidth)\n            gStorage->menuWidth = len;\n\n        gStorage->menuItemsCount++;\n    }\n}\n\ns8 GetMenuItemTextId(u8 menuIndex)\n{\n    if (menuIndex >= gStorage->menuItemsCount)\n        return MENU_B_PRESSED;\n    else\n        return gStorage->menuItems[menuIndex].textId;\n}\n\nvoid AddMenu(void)\n{\n    gStorage->menuWindow.width = gStorage->menuWidth + 2;\n    gStorage->menuWindow.height = 2 * gStorage->menuItemsCount;\n    gStorage->menuWindow.tilemapLeft = 29 - gStorage->menuWindow.width;\n    gStorage->menuWindow.tilemapTop = 15 - gStorage->menuWindow.height;\n    gStorage->menuWindowId = AddWindow(&gStorage->menuWindow);\n    ClearWindowTilemap(gStorage->menuWindowId);\n    DrawStdFrameWithCustomTileAndPalette(gStorage->menuWindowId, FALSE, 11, 14);\n    PrintTextArray(gStorage->menuWindowId, FONT_NORMAL_COPY_1, 8, 2, 16, gStorage->menuItemsCount, (void *)gStorage->menuItems);\n    Menu_InitCursor(gStorage->menuWindowId, FONT_NORMAL_COPY_1, 0, 2, 16, gStorage->menuItemsCount, 0);\n    ScheduleBgCopyTilemapToVram(0);\n    gStorage->menuUnusedField = 0;\n}\n\nbool8 IsMenuLoading(void)\n{\n    // Possibly stubbed out debug code?\n    return FALSE;\n}\n\ns16 HandleMenuInput(void)\n{\n    s32 input = MENU_NOTHING_CHOSEN;\n\n    do\n    {\n        if (JOY_NEW(A_BUTTON))\n        {\n            input = Menu_GetCursorPos();\n            break;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            input = MENU_B_PRESSED;\n        }\n\n        if (JOY_NEW(DPAD_UP))\n        {\n            PlaySE(SE_SELECT);\n            Menu_MoveCursor(-1);\n        }\n        else if (JOY_NEW(DPAD_DOWN))\n        {\n            PlaySE(SE_SELECT);\n            Menu_MoveCursor(1);\n        }\n    } while (FALSE);\n\n    if (input != MENU_NOTHING_CHOSEN)\n        RemoveMenu();\n\n    if (input >= 0)\n        input = gStorage->menuItems[input].textId;\n\n    return input;\n}\n\nvoid RemoveMenu(void)\n{\n    ClearStdWindowAndFrameToTransparent(gStorage->menuWindowId, TRUE);\n    RemoveWindow(gStorage->menuWindowId);\n}\n"
  },
  {
    "path": "src/pokemon_storage_system_graphics.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"event_data.h\"\n#include \"graphics.h\"\n#include \"new_menu_helpers.h\"\n#include \"pokemon_icon.h\"\n#include \"pokemon_storage_system_internal.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"trig.h\"\n\nstatic void SpriteCB_BoxMonIconScrollOut(struct Sprite *sprite);\nstatic void SetBoxSpeciesAndPersonalities(u8 boxId);\nstatic void MovePartySpriteToNextSlot(struct Sprite *sprite, u16 idx);\nstatic void SpriteCB_MovePartySpriteToNextSlot(struct Sprite *sprite);\nstatic void DestroyBoxMonIcon(struct Sprite *sprite);\nstatic void SpriteCB_HeldMon(struct Sprite *sprite);\nstatic void Task_InitBox(u8 taskId);\nstatic s8 DetermineBoxScrollDirection(u8 boxId);\nstatic void LoadWallpaperGfx(u8 wallpaperId, s8 direction);\nstatic bool32 WaitForWallpaperGfxLoad(void);\nstatic void DrawWallpaper(void *unused, const void *tilemap, s8 direction, u8 offset);\nstatic void TrimOldWallpaper(void *buffer);\nstatic void InitBoxTitle(u8 wallpaperId);\nstatic void CreateIncomingBoxTitle(u8 wallpaperId, s8 direction);\nstatic void SpriteCB_IncomingBoxTitle(struct Sprite *sprite);\nstatic void SpriteCB_OutgoingBoxTitle(struct Sprite *sprite);\nstatic s16 GetBoxTitleBaseX(const u8 *boxName);\nstatic void CycleBoxTitleSprites(void);\nstatic void CycleBoxTitleColor(void);\nstatic void CreateBoxScrollArrows(void);\nstatic void StartBoxScrollArrowsSlide(s8 direction);\nstatic void StopBoxScrollArrowsSlide(void);\nstatic void SpriteCB_BoxScrollArrow(struct Sprite *sprite);\n\nstatic const struct OamData sOamData_MonIcon;\n\nstatic const struct SpriteTemplate sSpriteTemplate_MonIcon = {\n    .tileTag = GFXTAG_MON_ICON,\n    .paletteTag = PALTAG_MON_ICON_0,\n    .oam = &sOamData_MonIcon,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_MonIcon = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x32),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0x000,\n    .priority = 0,\n    .paletteNum = 0\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ReleaseMon_Release[] = {\n    AFFINEANIMCMD_FRAME(-2, -2, 0, 120),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ReleaseMon_ComeBack[] = {\n    AFFINEANIMCMD_FRAME(16, 16, 0,  0),\n    AFFINEANIMCMD_FRAME(16, 16, 0, 15),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_ReleaseMon[] = {\n    [RELEASE_ANIM_RELEASE]   = sAffineAnim_ReleaseMon_Release,\n    [RELEASE_ANIM_COME_BACK] = sAffineAnim_ReleaseMon_ComeBack,\n};\n\nstatic const u16 sWallpaperPalettes_Forest[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/forest/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Forest[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/forest/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Forest[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/forest/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_City[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/city/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_City[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/city/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_City[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/city/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Desert[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/desert/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Desert[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/desert/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Desert[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/desert/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Savanna[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/savanna/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Savanna[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/savanna/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Savanna[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/savanna/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Crag[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/crag/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Crag[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/crag/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Crag[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/crag/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Volcano[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/volcano/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Volcano[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/volcano/tiles.4bpp.lz\");\nstatic const u8 sUnusedSpace1[4] = {};\nstatic const u32 sWallpaperTilemap_Volcano[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/volcano/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Snow[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/snow/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Snow[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/snow/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Snow[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/snow/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Cave[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/cave/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Cave[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/cave/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Cave[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/cave/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Beach[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/beach/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Beach[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/beach/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Beach[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/beach/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Seafloor[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/seafloor/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Seafloor[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/seafloor/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Seafloor[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/seafloor/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_River[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/river/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_River[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/river/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_River[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/river/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Sky[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/sky/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Sky[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/sky/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Sky[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/sky/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Stars[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/stars/tiles.gbapal\");\nstatic const u8 sUnusedSpace2[32] = {};\nstatic const u32 sWallpaperTiles_Stars[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/stars/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Stars[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/stars/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Pokecenter[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/pokecenter/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Pokecenter[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/pokecenter/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Pokecenter[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/pokecenter/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Tiles[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/tiles/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Tiles[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/tiles/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Tiles[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/tiles/tilemap.bin.lz\");\n\nstatic const u16 sWallpaperPalettes_Simple[][16] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/simple/tiles.gbapal\");\nstatic const u32 sWallpaperTiles_Simple[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/simple/tiles.4bpp.lz\");\nstatic const u32 sWallpaperTilemap_Simple[] = INCBIN_U32(\"graphics/pokemon_storage/wallpapers/simple/tilemap.bin.lz\");\n\n// Unused\nstatic const u16 sWallpaperTilemap_Unused[] = INCBIN_U16(\"graphics/pokemon_storage/wallpapers/unused.bin\");\n\n// Shadow color, text color\nstatic const u16 sBoxTitleColors[][2] = {\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE},\n    {RGB( 7,  7,  7), RGB_WHITE}\n};\n\nstatic const struct Wallpaper sWallpapers[] = {\n    {sWallpaperTiles_Forest,     sWallpaperTilemap_Forest,     *sWallpaperPalettes_Forest    },\n    {sWallpaperTiles_City,       sWallpaperTilemap_City,       *sWallpaperPalettes_City      },\n    {sWallpaperTiles_Desert,     sWallpaperTilemap_Desert,     *sWallpaperPalettes_Desert    },\n    {sWallpaperTiles_Savanna,    sWallpaperTilemap_Savanna,    *sWallpaperPalettes_Savanna   },\n    {sWallpaperTiles_Crag,       sWallpaperTilemap_Crag,       *sWallpaperPalettes_Crag      },\n    {sWallpaperTiles_Volcano,    sWallpaperTilemap_Volcano,    *sWallpaperPalettes_Volcano   },\n    {sWallpaperTiles_Snow,       sWallpaperTilemap_Snow,       *sWallpaperPalettes_Snow      },\n    {sWallpaperTiles_Cave,       sWallpaperTilemap_Cave,       *sWallpaperPalettes_Cave      },\n    {sWallpaperTiles_Beach,      sWallpaperTilemap_Beach,      *sWallpaperPalettes_Beach     },\n    {sWallpaperTiles_Seafloor,   sWallpaperTilemap_Seafloor,   *sWallpaperPalettes_Seafloor  },\n    {sWallpaperTiles_River,      sWallpaperTilemap_River,      *sWallpaperPalettes_River     },\n    {sWallpaperTiles_Sky,        sWallpaperTilemap_Sky,        *sWallpaperPalettes_Sky       },\n    {sWallpaperTiles_Stars,      sWallpaperTilemap_Stars,      *sWallpaperPalettes_Stars     },\n    {sWallpaperTiles_Pokecenter, sWallpaperTilemap_Pokecenter, *sWallpaperPalettes_Pokecenter},\n    {sWallpaperTiles_Tiles,      sWallpaperTilemap_Tiles,      *sWallpaperPalettes_Tiles     },\n    {sWallpaperTiles_Simple,     sWallpaperTilemap_Simple,     *sWallpaperPalettes_Simple    },\n};\n\nstatic const u16 sBoxScrollArrow_Gfx[] = INCBIN_U16(\"graphics/pokemon_storage/box_scroll_arrow.4bpp\");\n\nstatic const u16 sUnusedColor = RGB(26, 29, 8);\n\nstatic const struct SpriteSheet sSpriteSheet_BoxScrollArrow = {\n    sBoxScrollArrow_Gfx, 0x0080, GFXTAG_BOX_SCROLL_ARROW\n};\n\nstatic const struct OamData sOamData_BoxTitle = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x16),\n    .tileNum = 0,\n    .priority = 2,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_BoxTitle_Left[] = {\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_BoxTitle_Right[] = {\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_BoxTitle[] = {\n    sAnim_BoxTitle_Left,\n    sAnim_BoxTitle_Right,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_BoxTitle = {\n    .tileTag = GFXTAG_BOX_TITLE,\n    .paletteTag = PALTAG_BOX_TITLE,\n    .oam = &sOamData_BoxTitle,\n    .anims = sAnims_BoxTitle,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_BoxScrollArrow = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x16),\n    .tileNum = 0x000,\n    .priority = 2,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_BoxScrollArrow_Left[] = {\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_BoxScrollArrow_Right[] = {\n    ANIMCMD_FRAME(2, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_BoxScrollArrow[] = {\n    sAnim_BoxScrollArrow_Left,\n    sAnim_BoxScrollArrow_Right,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_BoxScrollArrow = {\n    .tileTag = GFXTAG_BOX_SCROLL_ARROW,\n    .paletteTag = PALTAG_MISC_2,\n    .oam = &sOamData_BoxScrollArrow,\n    .anims = sAnims_BoxScrollArrow,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_BoxScrollArrow,\n};\n\nvoid InitMonIconFields(void)\n{\n    u16 i;\n\n    LoadMonIconPalettes();\n    for (i = 0; i < MAX_MON_ICONS; i++)\n        gStorage->numIconsPerSpecies[i] = 0;\n    for (i = 0; i < MAX_MON_ICONS; i++)\n        gStorage->iconSpeciesList[i] = SPECIES_NONE;\n    for (i = 0; i < PARTY_SIZE; i++)\n        gStorage->partySprites[i] = NULL;\n    for (i = 0; i < IN_BOX_COUNT; i++)\n        gStorage->boxMonsSprites[i] = NULL;\n\n    gStorage->movingMonSprite = NULL;\n    gStorage->unusedField1 = 0;\n}\n\nstatic u8 GetMonIconPriorityByCursorArea(void)\n{\n    return (IsCursorInBox() ? 2 : 1);\n}\n\nvoid CreateMovingMonIcon(void)\n{\n    u32 personality = GetMonData(&gStorage->movingMon, MON_DATA_PERSONALITY);\n    u16 species = GetMonData(&gStorage->movingMon, MON_DATA_SPECIES_OR_EGG);\n    u8 priority = GetMonIconPriorityByCursorArea();\n\n    gStorage->movingMonSprite = CreateMonIconSprite(species, personality, 0, 0, priority, 7);\n    gStorage->movingMonSprite->callback = SpriteCB_HeldMon;\n}\n\nstatic void InitBoxMonSprites(u8 boxId)\n{\n    u8 boxPosition;\n    u16 i, j, count;\n    u16 species;\n    u32 personality;\n\n    count = 0;\n    boxPosition = 0;\n    for (i = 0; i < IN_BOX_ROWS; i++)\n    {\n        for (j = 0; j < IN_BOX_COLUMNS; j++)\n        {\n            species = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES_OR_EGG);\n            if (species != SPECIES_NONE)\n            {\n                personality = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY);\n                if(species == SPECIES_DEOXYS)\n                    species = GetDeoxysSpeciesFromForme(GetBoxMonDataAt(boxId, boxPosition, MON_DATA_FORME));\n                gStorage->boxMonsSprites[count] = CreateMonIconSprite(species, personality, 8 * (3 * j) + 100, 8 * (3 * i) + 44, 2, 19 - j);\n            }\n            else\n                gStorage->boxMonsSprites[count] = NULL;\n\n            boxPosition++;\n            count++;\n        }\n    }\n\n    if (gStorage->boxOption == OPTION_MOVE_ITEMS)\n    {\n        for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++)\n        {\n            if (GetBoxMonDataAt(boxId, boxPosition, MON_DATA_HELD_ITEM) == 0)\n                gStorage->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND;\n        }\n    }\n}\n\nvoid CreateBoxMonIconAtPos(u8 boxPosition)\n{\n    u16 species = GetCurrentBoxMonData(boxPosition, MON_DATA_SPECIES_OR_EGG);\n\n    if (species != SPECIES_NONE)\n    {\n        s16 x = 8 * (3 * (boxPosition % IN_BOX_COLUMNS)) + 100;\n        s16 y = 8 * (3 * (boxPosition / IN_BOX_COLUMNS)) + 44;\n        u32 personality = GetCurrentBoxMonData(boxPosition, MON_DATA_PERSONALITY);\n\n        if(species == SPECIES_DEOXYS)\n            species = GetDeoxysSpeciesFromForme(GetCurrentBoxMonData(boxPosition, MON_DATA_FORME));\n\n        gStorage->boxMonsSprites[boxPosition] = CreateMonIconSprite(species, personality, x, y, 2, 19 - (boxPosition % IN_BOX_COLUMNS));\n        if (gStorage->boxOption == OPTION_MOVE_ITEMS)\n            gStorage->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND;\n    }\n}\n\n#define sDistance data[1]\n#define sSpeed    data[2]\n#define sDestX    data[3]\n#define sDelay    data[4]\n#define sPosX     data[5]\n\nstatic void StartBoxMonIconsScrollOut(s16 speed)\n{\n    u16 i;\n\n    for (i = 0; i < IN_BOX_COUNT; i++)\n    {\n        if (gStorage->boxMonsSprites[i] != NULL)\n        {\n            gStorage->boxMonsSprites[i]->sSpeed = speed;\n            gStorage->boxMonsSprites[i]->sDelay = 1;\n            gStorage->boxMonsSprites[i]->callback = SpriteCB_BoxMonIconScrollOut;\n        }\n    }\n}\n\nstatic void SpriteCB_BoxMonIconScrollIn(struct Sprite *sprite)\n{\n    if (sprite->sDistance != 0)\n    {\n        sprite->sDistance--;\n        sprite->x += sprite->sSpeed;\n    }\n    else\n    {\n        gStorage->iconScrollNumIncoming--;\n        sprite->x = sprite->sDestX;\n        sprite->callback = SpriteCallbackDummy;\n    }\n}\n\nstatic void SpriteCB_BoxMonIconScrollOut(struct Sprite *sprite)\n{\n    if (sprite->sDelay != 0)\n        sprite->sDelay--;\n    else\n    {\n        sprite->x += sprite->sSpeed;\n        sprite->sPosX = sprite->x + sprite->x2;\n\n        // Check if mon icon has scrolled out of view of the box area\n        if (sprite->sPosX <= 68 || sprite->sPosX >= 252)\n            sprite->callback = SpriteCallbackDummy;\n    }\n}\n\nstatic void DestroyAllIconsInColumn(u8 column)\n{\n    u16 row;\n    u8 boxPosition = column;\n\n    for (row = 0; row < IN_BOX_ROWS; row++)\n    {\n        if (gStorage->boxMonsSprites[boxPosition] != NULL)\n        {\n            DestroyBoxMonIcon(gStorage->boxMonsSprites[boxPosition]);\n            gStorage->boxMonsSprites[boxPosition] = NULL;\n        }\n        boxPosition += IN_BOX_COLUMNS;\n    }\n}\n\nstatic u8 CreateBoxMonIconsInColumn(u8 column, u16 distance, s16 speed)\n{\n    s32 i;\n    u16 y = 44;\n    s16 xDest = 8 * (3 * column) + 100;\n    u16 x = xDest - ((distance + 1) * speed);\n    u8 subpriority = 19 - column;\n    u8 count = 0;\n    u8 boxPosition = column;\n    u16 species;\n\n    if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n    {\n        for (i = 0; i < IN_BOX_ROWS; i++)\n        {\n            if (gStorage->boxSpecies[boxPosition] != SPECIES_NONE)\n            {\n                species = gStorage->boxSpecies[boxPosition];\n                if(species == SPECIES_DEOXYS)\n                    species = GetDeoxysSpeciesFromForme(GetCurrentBoxMonData(boxPosition, MON_DATA_FORME));\n                gStorage->boxMonsSprites[boxPosition] = CreateMonIconSprite(species,\n                                                                            gStorage->boxPersonalities[boxPosition],\n                                                                            x, y, 2, subpriority);\n                if (gStorage->boxMonsSprites[boxPosition] != NULL)\n                {\n                    gStorage->boxMonsSprites[boxPosition]->sDistance = distance;\n                    gStorage->boxMonsSprites[boxPosition]->sSpeed = speed;\n                    gStorage->boxMonsSprites[boxPosition]->sDestX = xDest;\n                    gStorage->boxMonsSprites[boxPosition]->callback = SpriteCB_BoxMonIconScrollIn;\n                    count++;\n                }\n            }\n            boxPosition += IN_BOX_COLUMNS;\n            y += 24;\n        }\n    }\n    else\n    {\n        for (i = 0; i < IN_BOX_ROWS; i++)\n        {\n            if (gStorage->boxSpecies[boxPosition] != SPECIES_NONE)\n            {\n                species = gStorage->boxSpecies[boxPosition];\n                if(species == SPECIES_DEOXYS)\n                    species = GetDeoxysSpeciesFromForme(GetCurrentBoxMonData(boxPosition, MON_DATA_FORME));\n                gStorage->boxMonsSprites[boxPosition] = CreateMonIconSprite(species,\n                                                                            gStorage->boxPersonalities[boxPosition],\n                                                                            x, y, 2, subpriority);\n                if (gStorage->boxMonsSprites[boxPosition] != NULL)\n                {\n                    gStorage->boxMonsSprites[boxPosition]->sDistance = distance;\n                    gStorage->boxMonsSprites[boxPosition]->sSpeed = speed;\n                    gStorage->boxMonsSprites[boxPosition]->sDestX = xDest;\n                    gStorage->boxMonsSprites[boxPosition]->callback = SpriteCB_BoxMonIconScrollIn;\n                    if (GetBoxMonDataAt(gStorage->incomingBoxId, boxPosition, MON_DATA_HELD_ITEM) == 0)\n                        gStorage->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND;\n                    count++;\n                }\n            }\n            boxPosition += IN_BOX_COLUMNS;\n            y += 24;\n        }\n    }\n\n    return count;\n}\n\n#undef sDistance\n#undef sSpeed\n#undef sDestX\n#undef sDelay\n#undef sPosX\n\nstatic void InitBoxMonIconScroll(u8 boxId, s8 direction)\n{\n    gStorage->iconScrollState = 0;\n    gStorage->iconScrollToBoxId = boxId;\n    gStorage->iconScrollDirection = direction;\n    gStorage->iconScrollDistance = 32;\n    gStorage->iconScrollSpeed = -(6 * direction);\n    gStorage->iconScrollNumIncoming = 0;\n    SetBoxSpeciesAndPersonalities(boxId);\n    if (direction > 0)\n        gStorage->iconScrollCurColumn = 0;\n    else\n        gStorage->iconScrollCurColumn = IN_BOX_COLUMNS - 1;\n\n    gStorage->iconScrollPos = (24 * gStorage->iconScrollCurColumn) + 100;\n    StartBoxMonIconsScrollOut(gStorage->iconScrollSpeed);\n}\n\nstatic bool8 UpdateBoxMonIconScroll(void)\n{\n    if (gStorage->iconScrollDistance != 0)\n        gStorage->iconScrollDistance--;\n\n    switch (gStorage->iconScrollState)\n    {\n    case 0:\n        gStorage->iconScrollPos += gStorage->iconScrollSpeed;\n        if (gStorage->iconScrollPos <= 64 || gStorage->iconScrollPos >= 252)\n        {\n            // A column of icons has gone offscreen, destroy them\n            DestroyAllIconsInColumn(gStorage->iconScrollCurColumn);\n            gStorage->iconScrollPos += gStorage->iconScrollDirection * 24;\n            gStorage->iconScrollState++;\n        }\n        break;\n    case 1:\n        // Create the new incoming column of icons\n        gStorage->iconScrollPos += gStorage->iconScrollSpeed;\n        gStorage->iconScrollNumIncoming += CreateBoxMonIconsInColumn(gStorage->iconScrollCurColumn, gStorage->iconScrollDistance, gStorage->iconScrollSpeed);\n        if ((gStorage->iconScrollDirection > 0 && gStorage->iconScrollCurColumn == IN_BOX_COLUMNS - 1)\n            || (gStorage->iconScrollDirection < 0 && gStorage->iconScrollCurColumn == 0))\n        {\n            // Scroll has reached final column\n            gStorage->iconScrollState++;\n        }\n        else\n        {\n            // Continue scrolling\n            gStorage->iconScrollCurColumn += gStorage->iconScrollDirection;\n            gStorage->iconScrollState = 0;\n        }\n        break;\n    case 2:\n        // Wait to make sure all icons have arrived\n        if (gStorage->iconScrollNumIncoming == 0)\n        {\n            gStorage->iconScrollDistance++;\n            return FALSE;\n        }\n        break;\n    default:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic void SetBoxSpeciesAndPersonalities(u8 boxId)\n{\n    s32 i, j, boxPosition;\n\n    boxPosition = 0;\n    for (i = 0; i < IN_BOX_ROWS; i++)\n    {\n        for (j = 0; j < IN_BOX_COLUMNS; j++)\n        {\n            gStorage->boxSpecies[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES_OR_EGG);\n            if (gStorage->boxSpecies[boxPosition] != SPECIES_NONE)\n            {\n                if(gStorage->boxSpecies[boxPosition] == SPECIES_DEOXYS)\n                {\n                    gStorage->boxSpecies[boxPosition] = GetDeoxysSpeciesFromForme(GetBoxMonDataAt(boxId, boxPosition, MON_DATA_FORME));\n                }\n                gStorage->boxPersonalities[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY);\n            }\n            boxPosition++;\n        }\n    }\n\n    gStorage->incomingBoxId = boxId;\n}\n\nvoid DestroyBoxMonIconAtPosition(u8 boxPosition)\n{\n    if (gStorage->boxMonsSprites[boxPosition] != NULL)\n    {\n        DestroyBoxMonIcon(gStorage->boxMonsSprites[boxPosition]);\n        gStorage->boxMonsSprites[boxPosition] = NULL;\n    }\n}\n\nvoid SetBoxMonIconObjMode(u8 boxPosition, u8 objMode)\n{\n    if (gStorage->boxMonsSprites[boxPosition] != NULL)\n    {\n        gStorage->boxMonsSprites[boxPosition]->oam.objMode = objMode;\n    }\n}\n\nvoid CreatePartyMonsSprites(bool8 visible)\n{\n    u16 i, count;\n    u16 species = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES_OR_EGG);\n    u32 personality = GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY);\n\n    if(species == SPECIES_DEOXYS)\n        species = GetDeoxysSpeciesFromForme(GetMonData(&gPlayerParty[0], MON_DATA_FORME));\n\n    gStorage->partySprites[0] = CreateMonIconSprite(species, personality, 104, 64, 1, 12);\n    count = 1;\n    for (i = 1; i < PARTY_SIZE; i++)\n    {\n        species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG);\n        if(species == SPECIES_DEOXYS)\n            species = GetDeoxysSpeciesFromForme(GetMonData(&gPlayerParty[i], MON_DATA_FORME));\n        if (species != SPECIES_NONE)\n        {\n            personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);\n            gStorage->partySprites[i] = CreateMonIconSprite(species, personality, 152,  8 * (3 * (i - 1)) + 16, 1, 12);\n            count++;\n        }\n        else\n            gStorage->partySprites[i] = NULL;\n    }\n\n    if (!visible)\n    {\n        for (i = 0; i < count; i++)\n        {\n            gStorage->partySprites[i]->y -= 160;\n            gStorage->partySprites[i]->invisible = TRUE;\n        }\n    }\n\n    if (gStorage->boxOption == OPTION_MOVE_ITEMS)\n    {\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (gStorage->partySprites[i] != NULL && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == 0)\n                gStorage->partySprites[i]->oam.objMode = ST_OAM_OBJ_BLEND;\n        }\n    }\n}\n\nvoid CompactPartySprites(void)\n{\n    u16 i, targetPartyId;\n\n    gStorage->numPartySpritesToCompact = 0;\n    for (i = 0, targetPartyId = 0; i < PARTY_SIZE; i++)\n    {\n        if (gStorage->partySprites[i] != NULL)\n        {\n            if (i != targetPartyId)\n            {\n                MovePartySpriteToNextSlot(gStorage->partySprites[i], targetPartyId);\n                gStorage->partySprites[i] = NULL;\n                gStorage->numPartySpritesToCompact++;\n            }\n            targetPartyId++;\n        }\n    }\n}\n\nu8 GetNumPartySpritesCompacting(void)\n{\n    return gStorage->numPartySpritesToCompact;\n}\n\n#define sPartyId   data[1]\n#define sMonX      data[2]\n#define sMonY      data[3]\n#define sSpeedX    data[4]\n#define sSpeedY    data[5]\n#define sMoveSteps data[6]\n\nstatic void MovePartySpriteToNextSlot(struct Sprite *sprite, u16 partyId)\n{\n    s16 x, y;\n\n    sprite->sPartyId = partyId;\n    if (partyId == 0)\n        x = 104, y = 64;\n    else\n        x = 152, y = 8 * (3 * (partyId - 1)) + 16;\n\n    sprite->sMonX = (u16)(sprite->x) * 8;\n    sprite->sMonY = (u16)(sprite->y) * 8;\n    sprite->sSpeedX = ((x * 8) - sprite->sMonX) / 8;\n    sprite->sSpeedY = ((y * 8) - sprite->sMonY) / 8;\n    sprite->sMoveSteps = 8;\n    sprite->callback = SpriteCB_MovePartySpriteToNextSlot;\n}\n\nstatic void SpriteCB_MovePartySpriteToNextSlot(struct Sprite *sprite)\n{\n    if (sprite->sMoveSteps != 0)\n    {\n        s16 x = sprite->sMonX += sprite->sSpeedX;\n        s16 y = sprite->sMonY += sprite->sSpeedY;\n        sprite->x = x / 8u;\n        sprite->y = y / 8u;\n        sprite->sMoveSteps--;\n    }\n    else\n    {\n        if (sprite->sPartyId == 0)\n        {\n            sprite->x = 104;\n            sprite->y = 64;\n        }\n        else\n        {\n            sprite->x = 152;\n            sprite->y = 8 * (3 * (sprite->sPartyId - 1)) + 16;\n        }\n        sprite->callback = SpriteCallbackDummy;\n        gStorage->partySprites[sprite->sPartyId] = sprite;\n        gStorage->numPartySpritesToCompact--;\n    }\n}\n\n#undef sPartyId\n#undef sMonX\n#undef sMonY\n#undef sSpeedX\n#undef sSpeedY\n#undef sMoveSteps\n\nvoid DestroyMovingMonIcon(void)\n{\n    if (gStorage->movingMonSprite != NULL)\n    {\n        DestroyBoxMonIcon(gStorage->movingMonSprite);\n        gStorage->movingMonSprite = NULL;\n    }\n}\n\nvoid MovePartySprites(s16 yDelta)\n{\n    u16 i, posY;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (gStorage->partySprites[i] != NULL)\n        {\n            gStorage->partySprites[i]->y += yDelta;\n            posY = gStorage->partySprites[i]->y + gStorage->partySprites[i]->y2 + gStorage->partySprites[i]->centerToCornerVecY;\n            posY += 16;\n            if (posY > 192)\n                gStorage->partySprites[i]->invisible = TRUE;\n            else\n                gStorage->partySprites[i]->invisible = FALSE;\n        }\n    }\n}\n\nvoid DestroyPartyMonIcon(u8 partyId)\n{\n    if (gStorage->partySprites[partyId] != NULL)\n    {\n        DestroyBoxMonIcon(gStorage->partySprites[partyId]);\n        gStorage->partySprites[partyId] = NULL;\n    }\n}\n\nvoid DestroyAllPartyMonIcons(void)\n{\n    u16 i;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (gStorage->partySprites[i] != NULL)\n        {\n            DestroyBoxMonIcon(gStorage->partySprites[i]);\n            gStorage->partySprites[i] = NULL;\n        }\n    }\n}\n\nvoid SetPartyMonIconObjMode(u8 partyId, u8 objMode)\n{\n    if (gStorage->partySprites[partyId] != NULL)\n        gStorage->partySprites[partyId]->oam.objMode = objMode;\n}\n\nvoid SetMovingMonSprite(u8 mode, u8 id)\n{\n    if (mode == MODE_PARTY)\n    {\n        gStorage->movingMonSprite = gStorage->partySprites[id];\n        gStorage->partySprites[id] = NULL;\n    }\n    else if (mode == MODE_BOX)\n    {\n        gStorage->movingMonSprite = gStorage->boxMonsSprites[id];\n        gStorage->boxMonsSprites[id] = NULL;\n    }\n    else\n        return;\n\n    gStorage->movingMonSprite->callback = SpriteCB_HeldMon;\n    gStorage->movingMonSprite->oam.priority = GetMonIconPriorityByCursorArea();\n    gStorage->movingMonSprite->subpriority = 7;\n}\n\nvoid SetPlacedMonSprite(u8 boxId, u8 position)\n{\n    if (boxId == TOTAL_BOXES_COUNT) // party mon\n    {\n        gStorage->partySprites[position] = gStorage->movingMonSprite;\n        gStorage->partySprites[position]->oam.priority = 1;\n        gStorage->partySprites[position]->subpriority = 12;\n    }\n    else\n    {\n        gStorage->boxMonsSprites[position] = gStorage->movingMonSprite;\n        gStorage->boxMonsSprites[position]->oam.priority = 2;\n        gStorage->boxMonsSprites[position]->subpriority = 19 - (position % IN_BOX_COLUMNS);\n    }\n    gStorage->movingMonSprite->callback = SpriteCallbackDummy;\n    gStorage->movingMonSprite = NULL;\n}\n\nvoid SetShiftMonSpritePtr(u8 boxId, u8 position)\n{\n    if (boxId == TOTAL_BOXES_COUNT) // party mon\n        gStorage->shiftMonSpritePtr = &gStorage->partySprites[position];\n    else\n        gStorage->shiftMonSpritePtr = &gStorage->boxMonsSprites[position];\n\n    gStorage->movingMonSprite->callback = SpriteCallbackDummy;\n    gStorage->shiftTimer = 0;\n}\n\nbool8 ShiftMons(void)\n{\n    if (gStorage->shiftTimer == 16)\n        return FALSE;\n\n    gStorage->shiftTimer++;\n    if (gStorage->shiftTimer & 1)\n    {\n        (*gStorage->shiftMonSpritePtr)->y--;\n        gStorage->movingMonSprite->y++;\n    }\n\n    (*gStorage->shiftMonSpritePtr)->x2 = gSineTable[gStorage->shiftTimer * 8] / 16;\n    gStorage->movingMonSprite->x2 = -(gSineTable[gStorage->shiftTimer * 8] / 16);\n    if (gStorage->shiftTimer == 8)\n    {\n        gStorage->movingMonSprite->oam.priority = (*gStorage->shiftMonSpritePtr)->oam.priority;\n        gStorage->movingMonSprite->subpriority = (*gStorage->shiftMonSpritePtr)->subpriority;\n        (*gStorage->shiftMonSpritePtr)->oam.priority = GetMonIconPriorityByCursorArea();\n        (*gStorage->shiftMonSpritePtr)->subpriority = 7;\n    }\n\n    if (gStorage->shiftTimer == 16)\n    {\n        struct Sprite *sprite = gStorage->movingMonSprite;\n        gStorage->movingMonSprite = (*gStorage->shiftMonSpritePtr);\n        *gStorage->shiftMonSpritePtr = sprite;\n\n        gStorage->movingMonSprite->callback = SpriteCB_HeldMon;\n        (*gStorage->shiftMonSpritePtr)->callback = SpriteCallbackDummy;\n    }\n\n    return TRUE;\n}\n\nvoid DoReleaseMonAnim(u8 mode, u8 position)\n{\n    switch (mode)\n    {\n    case MODE_PARTY:\n        gStorage->releaseMonSpritePtr = &gStorage->partySprites[position];\n        break;\n    case MODE_BOX:\n        gStorage->releaseMonSpritePtr = &gStorage->boxMonsSprites[position];\n        break;\n    case MODE_MOVE:\n        gStorage->releaseMonSpritePtr = &gStorage->movingMonSprite;\n        break;\n    default:\n        return;\n    }\n\n    if (*gStorage->releaseMonSpritePtr != NULL)\n    {\n        InitSpriteAffineAnim(*gStorage->releaseMonSpritePtr);\n        (*gStorage->releaseMonSpritePtr)->oam.affineMode = ST_OAM_AFFINE_NORMAL;\n        (*gStorage->releaseMonSpritePtr)->affineAnims = sAffineAnims_ReleaseMon;\n        StartSpriteAffineAnim(*gStorage->releaseMonSpritePtr, RELEASE_ANIM_RELEASE);\n    }\n}\n\nbool8 TryHideReleaseMonSprite(void)\n{\n    if (*gStorage->releaseMonSpritePtr == NULL || (*gStorage->releaseMonSpritePtr)->invisible)\n        return FALSE;\n\n    if ((*gStorage->releaseMonSpritePtr)->affineAnimEnded)\n        (*gStorage->releaseMonSpritePtr)->invisible = TRUE;\n\n    return TRUE;\n}\n\nvoid DestroyReleaseMonIcon(void)\n{\n    if (*gStorage->releaseMonSpritePtr != NULL)\n    {\n        FreeOamMatrix((*gStorage->releaseMonSpritePtr)->oam.matrixNum);\n        DestroyBoxMonIcon(*gStorage->releaseMonSpritePtr);\n        *gStorage->releaseMonSpritePtr = NULL;\n    }\n}\n\nvoid DoReleaseMonComeBackAnim(void)\n{\n    if (*gStorage->releaseMonSpritePtr != NULL)\n    {\n        (*gStorage->releaseMonSpritePtr)->invisible = FALSE;\n        StartSpriteAffineAnim(*gStorage->releaseMonSpritePtr, RELEASE_ANIM_COME_BACK);\n    }\n}\n\nbool8 ResetReleaseMonSpritePtr(void)\n{\n    if (gStorage->releaseMonSpritePtr == NULL)\n        return FALSE;\n\n    if ((*gStorage->releaseMonSpritePtr)->affineAnimEnded)\n        gStorage->releaseMonSpritePtr = NULL;\n\n    return TRUE;\n}\n\nvoid SetMovingMonPriority(u8 priority)\n{\n    gStorage->movingMonSprite->oam.priority = priority;\n}\n\nstatic void SpriteCB_HeldMon(struct Sprite *sprite)\n{\n    sprite->x = gStorage->cursorSprite->x;\n    sprite->y = gStorage->cursorSprite->y + gStorage->cursorSprite->y2 + 4;\n}\n\nstatic u16 TryLoadMonIconTiles(u16 species)\n{\n    u16 i, offset;\n\n    // Find the currently-allocated slot\n    for (i = 0; i < MAX_MON_ICONS; i++)\n    {\n        if (gStorage->iconSpeciesList[i] == species)\n            break;\n    }\n\n    if (i == MAX_MON_ICONS)\n    {\n        // Find the first empty slot\n        for (i = 0; i < MAX_MON_ICONS; i++)\n        {\n            if (gStorage->iconSpeciesList[i] == SPECIES_NONE)\n                break;\n        }\n        if (i == MAX_MON_ICONS)\n            return 0xFFFF;\n    }\n\n    gStorage->iconSpeciesList[i] = species;\n    gStorage->numIconsPerSpecies[i]++;\n    offset = 16 * i;\n    CpuCopy32(GetMonIconTiles(species, TRUE), (void *)(OBJ_VRAM0) + offset * 32, 0x200);\n\n    return offset;\n}\n\nstatic void RemoveSpeciesFromIconList(u16 species)\n{\n    u16 i;\n\n    for (i = 0; i < MAX_MON_ICONS; i++)\n    {\n        if (gStorage->iconSpeciesList[i] == species)\n        {\n            if (--gStorage->numIconsPerSpecies[i] == 0)\n                gStorage->iconSpeciesList[i] = SPECIES_NONE;\n            break;\n        }\n    }\n}\n\nstruct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 oamPriority, u8 subpriority)\n{\n    u16 tileNum;\n    u8 spriteId;\n    struct SpriteTemplate template = sSpriteTemplate_MonIcon;\n\n    species = GetIconSpecies(species, personality);\n    template.paletteTag = PALTAG_MON_ICON_0 + gMonIconPaletteIndices[species];\n    if(species >= 65530 && species <= 65533)\n    {\n        template.paletteTag = 0xDAC0 + gMonIconPaletteIndices[SPECIES_DEOXYS];\n    }\n    tileNum = TryLoadMonIconTiles(species);\n    if (tileNum == 0xFFFF)\n        return NULL;\n\n    spriteId = CreateSprite(&template, x, y, subpriority);\n    if (spriteId == MAX_SPRITES)\n    {\n        RemoveSpeciesFromIconList(species);\n        return NULL;\n    }\n\n    gSprites[spriteId].oam.tileNum = tileNum;\n    gSprites[spriteId].oam.priority = oamPriority;\n    gSprites[spriteId].data[0] = species;\n    return &gSprites[spriteId];\n}\n\nstatic void DestroyBoxMonIcon(struct Sprite *sprite)\n{\n    RemoveSpeciesFromIconList(sprite->data[0]);\n    DestroySprite(sprite);\n}\n\n#define tState  data[0]\n#define tDmaIdx data[1]\n#define tBoxId  data[2]\n\nvoid CreateInitBoxTask(u8 boxId)\n{\n    u8 taskId = CreateTask(Task_InitBox, 2);\n\n    gTasks[taskId].tBoxId = boxId;\n}\n\nbool8 IsInitBoxActive(void)\n{\n    return FuncIsActiveTask(Task_InitBox);\n}\n\nstatic void Task_InitBox(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->tState)\n    {\n    case 0:\n        gStorage->wallpaperOffset = 0;\n        gStorage->bg2_X = 0;\n        task->tDmaIdx = RequestDma3Fill(0, gStorage->wallpaperBgTilemapBuffer, sizeof(gStorage->wallpaperBgTilemapBuffer), DMA3_32BIT);\n        break;\n    case 1:\n        if (WaitDma3Request(task->tDmaIdx) == -1)\n            return;\n\n        SetBgTilemapBuffer(2, gStorage->wallpaperBgTilemapBuffer);\n        ShowBg(2);\n        break;\n    case 2:\n        LoadWallpaperGfx(task->tBoxId, 0);\n        break;\n    case 3:\n        if (!WaitForWallpaperGfxLoad())\n            return;\n\n        InitBoxTitle(task->tBoxId);\n        CreateBoxScrollArrows();\n        InitBoxMonSprites(task->tBoxId);\n        SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(27) | BGCNT_TXT512x256);\n        break;\n    case 4:\n        DestroyTask(taskId);\n        break;\n    default:\n        task->tState = 0;\n        return;\n    }\n\n    task->tState++;\n}\n\n#undef tState\n#undef tDmaIdx\n#undef tBoxId\n\nvoid SetUpScrollToBox(u8 boxId)\n{\n    s8 direction = DetermineBoxScrollDirection(boxId);\n\n    gStorage->scrollSpeed = (direction > 0) ? 6 : -6;\n    gStorage->scrollUnused1 = (direction > 0) ? 1 : 2;\n    gStorage->scrollTimer = 32;\n    gStorage->scrollToBoxIdUnused = boxId;\n    gStorage->scrollUnused2 = (direction <= 0) ? 5 : 0;\n    gStorage->scrollDirectionUnused = direction;\n    gStorage->scrollUnused3 = (direction > 0) ? 264 : 56;\n    gStorage->scrollUnused4 = (direction <= 0) ? 5 : 0;\n    gStorage->scrollUnused5 = 0;\n    gStorage->scrollUnused6 = 2;\n    gStorage->scrollToBoxId = boxId;\n    gStorage->scrollDirection = direction;\n    gStorage->scrollState = 0;\n}\n\nbool8 ScrollToBox(void)\n{\n    bool8 isStillScrolling;\n\n    switch (gStorage->scrollState)\n    {\n    case 0:\n        LoadWallpaperGfx(gStorage->scrollToBoxId, gStorage->scrollDirection);\n        gStorage->scrollState++;\n    case 1:\n        if (!WaitForWallpaperGfxLoad())\n            return TRUE;\n\n        InitBoxMonIconScroll(gStorage->scrollToBoxId, gStorage->scrollDirection);\n        CreateIncomingBoxTitle(gStorage->scrollToBoxId, gStorage->scrollDirection);\n        StartBoxScrollArrowsSlide(gStorage->scrollDirection);\n        break;\n    case 2:\n        isStillScrolling = UpdateBoxMonIconScroll();\n        if (gStorage->scrollTimer != 0)\n        {\n            gStorage->bg2_X += gStorage->scrollSpeed;\n            if (--gStorage->scrollTimer != 0)\n                return TRUE;\n            CycleBoxTitleSprites();\n            StopBoxScrollArrowsSlide();\n        }\n        return isStillScrolling;\n    }\n\n    gStorage->scrollState++;\n    return TRUE;\n}\n\nstatic s8 DetermineBoxScrollDirection(u8 boxId)\n{\n    u8 i;\n    u8 currentBox = StorageGetCurrentBox();\n\n    for (i = 0; currentBox != boxId; i++)\n    {\n        currentBox++;\n        if (currentBox >= TOTAL_BOXES_COUNT)\n            currentBox = 0;\n    }\n\n    return (i < TOTAL_BOXES_COUNT / 2) ? 1 : -1;\n}\n\nvoid SetWallpaperForCurrentBox(u8 wallpaperId)\n{\n    SetBoxWallpaper(StorageGetCurrentBox(), wallpaperId);\n    gStorage->wallpaperChangeState = 0;\n}\n\nbool8 DoWallpaperGfxChange(void)\n{\n    switch (gStorage->wallpaperChangeState)\n    {\n    case 0:\n        BeginNormalPaletteFade(gStorage->wallpaperPalBits, 1, 0, 16, RGB_WHITEALPHA);\n        gStorage->wallpaperChangeState++;\n        break;\n    case 1:\n        if (!UpdatePaletteFade())\n        {\n            u8 curBox = StorageGetCurrentBox();\n            LoadWallpaperGfx(curBox, 0);\n            gStorage->wallpaperChangeState++;\n        }\n        break;\n    case 2:\n        if (WaitForWallpaperGfxLoad() == TRUE)\n        {\n            CycleBoxTitleColor();\n            BeginNormalPaletteFade(gStorage->wallpaperPalBits, 1, 16, 0, RGB_WHITEALPHA);\n            gStorage->wallpaperChangeState++;\n        }\n        break;\n    case 3:\n        if (!UpdatePaletteFade())\n            gStorage->wallpaperChangeState++;\n        break;\n    case 4:\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic void LoadWallpaperGfx(u8 boxId, s8 direction)\n{\n    u8 wallpaperId;\n    const struct Wallpaper *wallpaper;\n\n    gStorage->wallpaperLoadState = 0;\n    gStorage->wallpaperLoadBoxId = boxId;\n    gStorage->wallpaperLoadDir = direction;\n    if (gStorage->wallpaperLoadDir != 0)\n    {\n        gStorage->wallpaperOffset = !gStorage->wallpaperOffset;\n        TrimOldWallpaper(gStorage->wallpaperBgTilemapBuffer);\n    }\n\n    wallpaperId = GetBoxWallpaper(gStorage->wallpaperLoadBoxId);\n    wallpaper = &sWallpapers[wallpaperId];\n    LZ77UnCompWram(wallpaper->tileMap, gStorage->wallpaperTilemap);\n    DrawWallpaper(gStorage->wallpaperBgTilemapBuffer, gStorage->wallpaperTilemap, gStorage->wallpaperLoadDir, gStorage->wallpaperOffset);\n\n    if (gStorage->wallpaperLoadDir != 0)\n        LoadPalette(wallpaper->palettes, BG_PLTT_ID(4) + BG_PLTT_ID(gStorage->wallpaperOffset * 2), 2 * PLTT_SIZE_4BPP);\n    else\n        CpuCopy16(wallpaper->palettes, &gPlttBufferUnfaded[BG_PLTT_ID(4) + BG_PLTT_ID(gStorage->wallpaperOffset * 2)], 2 * PLTT_SIZE_4BPP);\n\n    DecompressAndLoadBgGfxUsingHeap(2, wallpaper->tiles, 0, 256 * gStorage->wallpaperOffset, 0);\n\n    CopyBgTilemapBufferToVram(2);\n}\n\nstatic bool32 WaitForWallpaperGfxLoad(void)\n{\n    if (IsDma3ManagerBusyWithBgCopy() == TRUE)\n        return FALSE;\n\n    return TRUE;\n}\n\nstatic void DrawWallpaper(void *unused, const void *tilemap, s8 direction, u8 offset)\n{\n    s16 paletteNum = (offset * 2) + 3;\n    s16 x = ((gStorage->bg2_X / 8 + 10) + (direction * 24)) & 0x3F;\n\n    CopyRectToBgTilemapBufferRect(2, tilemap, 0, 0, 20, 18, x, 2, 20, 18, 17, offset << 8, paletteNum);\n\n    if (direction == 0)\n        return;\n    else if (direction > 0)\n        x *= 1, x += 20; // x * 1 is needed to match\n    else\n        x -= 4;\n\n    FillBgTilemapBufferRect(2, 0, x, 2, 4, 18, 17);\n}\n\nstatic void TrimOldWallpaper(void *tilemapBuffer)\n{\n    u16 i;\n    u16 *dest = tilemapBuffer;\n    s16 right = ((gStorage->bg2_X / 8 + 10) + 20) & 0x3F;\n\n    if (right < 32)\n        dest += right + 0x260;\n    else\n        dest += right + 0x640;\n\n    for (i = 0; i < 44; i++)\n    {\n        *dest++ = 0;\n        right = (right + 1) & 0x3F;\n        if (right == 0)\n            dest -= 0x420;\n        if (right == 32)\n            dest += 0x3e0;\n    }\n}\n\nstatic void InitBoxTitle(u8 boxId)\n{\n    u8 tagIndex;\n    s16 x;\n    u16 i;\n\n    struct SpriteSheet spriteSheet = {gStorage->boxTitleTiles, 0x200, GFXTAG_BOX_TITLE};\n    struct SpritePalette palettes[] = {\n        {gStorage->boxTitlePal, PALTAG_BOX_TITLE},\n        {}\n    };\n\n    u16 wallpaperId = GetBoxWallpaper(boxId);\n\n    gStorage->boxTitlePal[14] = sBoxTitleColors[wallpaperId][0];\n    gStorage->boxTitlePal[15] = sBoxTitleColors[wallpaperId][1];\n    LoadSpritePalettes(palettes);\n    gStorage->wallpaperPalBits = 0x3F0;\n\n    tagIndex = IndexOfSpritePaletteTag(PALTAG_BOX_TITLE);\n    gStorage->boxTitlePalOffset = OBJ_PLTT_ID(tagIndex) + 14;\n    gStorage->wallpaperPalBits |= (1 << 16) << tagIndex;\n\n    tagIndex = IndexOfSpritePaletteTag(PALTAG_BOX_TITLE);\n    gStorage->boxTitleAltPalOffset = OBJ_PLTT_ID(tagIndex) + 14;\n    gStorage->wallpaperPalBits |= (1 << 16) << tagIndex;\n\n    StringCopyPadded(gStorage->boxTitleText, GetBoxNamePtr(boxId), 0, 8);\n    DrawTextWindowAndBufferTiles(gStorage->boxTitleText, gStorage->boxTitleTiles, 0, 0, gStorage->boxTitleUnused, 2);\n    LoadSpriteSheet(&spriteSheet);\n    x = GetBoxTitleBaseX(GetBoxNamePtr(boxId));\n\n    for (i = 0; i < 2; i++)\n    {\n        u8 spriteId = CreateSprite(&sSpriteTemplate_BoxTitle, x + i * 32, 28, 24);\n        gStorage->curBoxTitleSprites[i] = &gSprites[spriteId];\n        StartSpriteAnim(gStorage->curBoxTitleSprites[i], i);\n    }\n    gStorage->boxTitleCycleId = 0;\n}\n\nstatic void CreateIncomingBoxTitle(u8 boxId, s8 direction)\n{\n    u16 palOffset;\n    s16 x, adjustedX;\n    u16 i;\n    struct SpriteSheet spriteSheet = {gStorage->boxTitleTiles, 0x200, GFXTAG_BOX_TITLE};\n    struct SpriteTemplate template = sSpriteTemplate_BoxTitle;\n\n    gStorage->boxTitleCycleId = !gStorage->boxTitleCycleId;\n    if (gStorage->boxTitleCycleId == 0)\n    {\n        spriteSheet.tag = GFXTAG_BOX_TITLE;\n        palOffset = gStorage->boxTitlePalOffset;\n    }\n    else\n    {\n        spriteSheet.tag = GFXTAG_BOX_TITLE_ALT;\n        palOffset = gStorage->boxTitlePalOffset;\n        template.tileTag = GFXTAG_BOX_TITLE_ALT;\n        template.paletteTag = PALTAG_BOX_TITLE;\n    }\n\n    StringCopyPadded(gStorage->boxTitleText, GetBoxNamePtr(boxId), 0, BOX_NAME_LENGTH);\n    DrawTextWindowAndBufferTiles(gStorage->boxTitleText, gStorage->boxTitleTiles, 0, 0, gStorage->boxTitleUnused, 2);\n    LoadSpriteSheet(&spriteSheet);\n    LoadPalette(sBoxTitleColors[GetBoxWallpaper(boxId)], palOffset, sizeof(sBoxTitleColors[0]));\n    x = GetBoxTitleBaseX(GetBoxNamePtr(boxId));\n    adjustedX = x;\n    adjustedX += direction * 192;\n\n    // Title is split across two sprites\n    for (i = 0; i < 2; i++)\n    {\n        u8 spriteId = CreateSprite(&template, i * 32 + adjustedX, 28, 24);\n\n        gStorage->nextBoxTitleSprites[i] = &gSprites[spriteId];\n        gStorage->nextBoxTitleSprites[i]->data[0] = (-direction) * 6;\n        gStorage->nextBoxTitleSprites[i]->data[1] = i * 32 + x;\n        gStorage->nextBoxTitleSprites[i]->data[2] = 0;\n        gStorage->nextBoxTitleSprites[i]->callback = SpriteCB_IncomingBoxTitle;\n        StartSpriteAnim(gStorage->nextBoxTitleSprites[i], i);\n\n        gStorage->curBoxTitleSprites[i]->data[0] = (-direction) * 6;\n        gStorage->curBoxTitleSprites[i]->data[1] = 1;\n        gStorage->curBoxTitleSprites[i]->callback = SpriteCB_OutgoingBoxTitle;\n    }\n}\n\nstatic void CycleBoxTitleSprites(void)\n{\n    if (gStorage->boxTitleCycleId == 0)\n        FreeSpriteTilesByTag(GFXTAG_BOX_TITLE_ALT);\n    else\n        FreeSpriteTilesByTag(GFXTAG_BOX_TITLE);\n\n    gStorage->curBoxTitleSprites[0] = gStorage->nextBoxTitleSprites[0];\n    gStorage->curBoxTitleSprites[1] = gStorage->nextBoxTitleSprites[1];\n}\n\nstatic void SpriteCB_IncomingBoxTitle(struct Sprite *sprite)\n{\n    if (sprite->data[2] != 0)\n        sprite->data[2]--;\n    else if ((sprite->x += sprite->data[0]) == sprite->data[1])\n        sprite->callback = SpriteCallbackDummy;\n}\n\nstatic void SpriteCB_OutgoingBoxTitle(struct Sprite *sprite)\n{\n    if (sprite->data[1] != 0)\n        sprite->data[1]--;\n    else\n    {\n        sprite->x += sprite->data[0];\n        sprite->data[2] = sprite->x + sprite->x2;\n        if (sprite->data[2] < 0x40 || sprite->data[2] > 0x100)\n            DestroySprite(sprite);\n    }\n}\n\nstatic void CycleBoxTitleColor(void)\n{\n    u8 boxId = StorageGetCurrentBox();\n    u8 wallpaperId = GetBoxWallpaper(boxId);\n    if (gStorage->boxTitleCycleId == 0)\n        CpuCopy16(sBoxTitleColors[wallpaperId], &gPlttBufferUnfaded[gStorage->boxTitlePalOffset], PLTT_SIZEOF(2));\n    else\n        CpuCopy16(sBoxTitleColors[wallpaperId], &gPlttBufferUnfaded[gStorage->boxTitleAltPalOffset], PLTT_SIZEOF(2));\n}\n\nstatic s16 GetBoxTitleBaseX(const u8 *string)\n{\n    return DISPLAY_WIDTH - 64 - GetStringWidth(FONT_NORMAL_COPY_1, string, 0) / 2;\n}\n\n// Sprite data for box scroll arrows\n#define sState data[0]\n#define sTimer data[1]\n#define sSpeed data[3]\n\nstatic void CreateBoxScrollArrows(void)\n{\n    u16 i;\n\n    LoadSpriteSheet(&sSpriteSheet_BoxScrollArrow);\n    for (i = 0; i < 2; i++)\n    {\n        u8 spriteId = CreateSprite(&sSpriteTemplate_BoxScrollArrow, 92 + i * 136, 28, 22);\n        if (spriteId != MAX_SPRITES)\n        {\n            struct Sprite *sprite = &gSprites[spriteId];\n            StartSpriteAnim(sprite, i);\n            sprite->sSpeed = (i == 0) ? -1 : 1;\n            gStorage->arrowSprites[i] = sprite;\n        }\n    }\n    if (IsCursorOnBoxTitle())\n        AnimateBoxScrollArrows(TRUE);\n}\n\n// Slide box scroll arrows horizontally for box change\nstatic void StartBoxScrollArrowsSlide(s8 direction)\n{\n    u16 i;\n\n    for (i = 0; i < 2; i++)\n    {\n        gStorage->arrowSprites[i]->x2 = 0;\n        gStorage->arrowSprites[i]->sState = 2;\n    }\n    if (direction < 0)\n    {\n        gStorage->arrowSprites[0]->sTimer = 29;\n        gStorage->arrowSprites[1]->sTimer = 5;\n        gStorage->arrowSprites[0]->data[2] = 72;\n        gStorage->arrowSprites[1]->data[2] = 72;\n    }\n    else\n    {\n        gStorage->arrowSprites[0]->sTimer = 5;\n        gStorage->arrowSprites[1]->sTimer = 29;\n        gStorage->arrowSprites[0]->data[2] = DISPLAY_WIDTH + 8;\n        gStorage->arrowSprites[1]->data[2] = DISPLAY_WIDTH + 8;\n    }\n    gStorage->arrowSprites[0]->data[7] = 0;\n    gStorage->arrowSprites[1]->data[7] = 1;\n}\n\n// New box's scroll arrows have entered, stop sliding and set their position\nstatic void StopBoxScrollArrowsSlide(void)\n{\n    u16 i;\n\n    for (i = 0; i < 2; i++)\n    {\n        gStorage->arrowSprites[i]->x = 136 * i + 92;\n        gStorage->arrowSprites[i]->x2 = 0;\n        gStorage->arrowSprites[i]->invisible = FALSE;\n    }\n    AnimateBoxScrollArrows(TRUE);\n}\n\n// Bounce scroll arrows while title is selected\nvoid AnimateBoxScrollArrows(bool8 animate)\n{\n    u16 i;\n\n    if (animate)\n    {\n        // Start arrows moving\n        for (i = 0; i < 2; i++)\n        {\n            gStorage->arrowSprites[i]->sState = 1;\n            gStorage->arrowSprites[i]->sTimer = 0;\n            gStorage->arrowSprites[i]->data[2] = 0;\n            gStorage->arrowSprites[i]->data[4] = 0;\n        }\n    }\n    else\n    {\n        // Stop arrows moving\n        for (i = 0; i < 2; i++)\n            gStorage->arrowSprites[i]->sState = 0;\n    }\n}\n\nstatic void SpriteCB_BoxScrollArrow(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        sprite->x2 = 0;\n        break;\n    case 1:\n        if (++sprite->sTimer > 3)\n        {\n            sprite->sTimer = 0;\n            sprite->x2 += sprite->sSpeed;\n            if (++sprite->data[2] > 5)\n            {\n                sprite->data[2] = 0;\n                sprite->x2 = 0;\n            }\n        }\n        break;\n    case 2:\n        sprite->sState = 3;\n        break;\n    case 3:\n        sprite->x -= gStorage->scrollSpeed;\n        if (sprite->x <= 72 || sprite->x >= DISPLAY_WIDTH + 8)\n            sprite->invisible = TRUE;\n        if (--sprite->sTimer == 0)\n        {\n            sprite->x = sprite->data[2];\n            sprite->invisible = FALSE;\n            sprite->sState = 4;\n        }\n        break;\n    case 4:\n        sprite->x -= gStorage->scrollSpeed;\n        break;\n    }\n}\n\n#undef sState\n#undef sTimer\n#undef sSpeed\n\n// Arrows for Deposit/Jump Box selection\nstruct Sprite *CreateChooseBoxArrows(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_BoxScrollArrow, x, y, subpriority);\n    if (spriteId == MAX_SPRITES)\n        return NULL;\n\n    animId %= 2;\n    StartSpriteAnim(&gSprites[spriteId], animId);\n    gSprites[spriteId].oam.priority = priority;\n    gSprites[spriteId].callback = SpriteCallbackDummy;\n    return &gSprites[spriteId];\n}\n"
  },
  {
    "path": "src/pokemon_storage_system_menu.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"event_data.h\"\n#include \"field_fadetransition.h\"\n#include \"field_weather.h\"\n#include \"help_system.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"pokemon_storage_system_internal.h\"\n#include \"script.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"constants/songs.h\"\n#include \"constants/field_weather.h\"\n#include \"constants/help_system.h\"\n\nstatic EWRAM_DATA u8 sPreviousBoxOption = 0;\nstatic EWRAM_DATA struct ChooseBoxMenu *sChooseBoxMenu = NULL;\n\nstatic void CreatePCMainMenu(u8 whichMenu, s16 *windowIdPtr);\nstatic void ChooseBoxMenu_CreateSprites(u8 curBox);\nstatic void ChooseBoxMenu_DestroySprites(void);\nstatic void ChooseBoxMenu_MoveRight(void);\nstatic void ChooseBoxMenu_MoveLeft(void);\nstatic void ChooseBoxMenu_PrintBoxNameAndCount(void);\nstatic void ChooseBoxMenu_PrintTextToSprite(const u8 *a0, u16 x, u16 y);\nstatic void SpriteCB_ChooseBoxArrow(struct Sprite *sprite);\n\nstatic const u16 sChooseBoxMenu_Pal[];\nstatic const u8 sChooseBoxMenuCenter_Gfx[];\nstatic const u8 sChooseBoxMenuCorners_Gfx[];\n\nstruct {\n    const u8 *text;\n    const u8 *desc;\n} static const sMainMenuTexts[OPTIONS_COUNT] = {\n    [OPTION_WITHDRAW]   = {gText_WithdrawPokemon, gText_WithdrawMonDescription},\n    [OPTION_DEPOSIT]    = {gText_DepositPokemon,  gText_DepositMonDescription},\n    [OPTION_MOVE_MONS]  = {gText_MovePokemon,     gText_MoveMonDescription},\n    [OPTION_MOVE_ITEMS] = {gText_MoveItems,       gText_MoveItemsDescription},\n    [OPTION_EXIT]       = {gText_SeeYa,           gText_SeeYaDescription}\n};\n\nvoid DrawTextWindowAndBufferTiles(const u8 *string, void *dst, u8 zero1, u8 zero2, u8 *unused, s32 bytesToBuffer)\n{\n    s32 i, tileBytesToBuffer, remainingBytes;\n    u16 windowId;\n    u8 txtColor[3];\n    u8 *tileData1, *tileData2;\n    struct WindowTemplate winTemplate = {0};\n\n    winTemplate.width = 24;\n    winTemplate.height = 2;\n    windowId = AddWindow(&winTemplate);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(zero2));\n    tileData1 = (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA);\n    tileData2 = (winTemplate.width * TILE_SIZE_4BPP) + tileData1;\n\n    if (!zero1)\n        txtColor[0] = TEXT_COLOR_TRANSPARENT;\n    else\n        txtColor[0] = zero2;\n    txtColor[1] = TEXT_DYNAMIC_COLOR_6;\n    txtColor[2] = TEXT_DYNAMIC_COLOR_5;\n    AddTextPrinterParameterized4(windowId, FONT_NORMAL_COPY_1, 0, 2, 0, 0, txtColor, -1, string);\n\n    tileBytesToBuffer = bytesToBuffer;\n    if (tileBytesToBuffer > 6)\n        tileBytesToBuffer = 6;\n    remainingBytes = bytesToBuffer - 6;\n    if (tileBytesToBuffer > 0)\n    {\n        for (i = tileBytesToBuffer; i != 0; i--)\n        {\n            CpuCopy16(tileData1, dst, 0x80);\n            CpuCopy16(tileData2, dst + 0x80, 0x80);\n            tileData1 += 0x80;\n            tileData2 += 0x80;\n            dst += 0x100;\n        }\n    }\n\n    // Never used. bytesToBuffer is always passed <= 6, so remainingBytes is always <= 0 here\n    if (remainingBytes > 0)\n        CpuFill16((zero2 << 4) | zero2, dst, (u32)(remainingBytes) * 0x100);\n\n    RemoveWindow(windowId);\n}\n\nstatic void PrintStringToBufferCopyNow(const u8 *string, void *dst, u16 offset, u8 bgColor, u8 fgColor, u8 shadowColor, u8 *unused)\n{\n    u32 var;\n    u8 windowId;\n    u8 txtColor[3];\n    u8 *tileData1, *tileData2;\n    struct WindowTemplate winTemplate = {0};\n\n    winTemplate.width = StringLength_Multibyte(string);\n    winTemplate.height = 2;\n    var = winTemplate.width * 32;\n    windowId = AddWindow(&winTemplate);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(bgColor));\n    tileData1 = (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA);\n    tileData2 = (winTemplate.width * 32) + tileData1;\n    txtColor[0] = bgColor;\n    txtColor[1] = fgColor;\n    txtColor[2] = shadowColor;\n    AddTextPrinterParameterized4(windowId, FONT_NORMAL_COPY_1, 0, 2, 0, 0, txtColor, -1, string);\n    CpuCopy16(tileData1, dst, var);\n    CpuCopy16(tileData2, dst + offset, var);\n    RemoveWindow(windowId);\n}\n\nstatic u8 CountMonsInBox(u8 boxId)\n{\n    u16 i, count;\n\n    for (i = 0, count = 0; i < IN_BOX_COUNT; i++)\n    {\n        if (GetBoxMonDataAt(boxId, i, MON_DATA_SPECIES) != SPECIES_NONE)\n            count++;\n    }\n\n    return count;\n}\n\ns16 GetFirstFreeBoxSpot(u8 boxId)\n{\n    u32 i;\n\n    for (i = 0; i < IN_BOX_COUNT; i++)\n    {\n        if (GetBoxMonDataAt(boxId, i, MON_DATA_SPECIES) == SPECIES_NONE)\n            return i;\n    }\n\n    return -1; // all spots are taken\n}\n\nu8 CountPartyNonEggMons(void)\n{\n    u16 i, count;\n\n    for (i = 0, count = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE\n                && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))\n            count++;\n    }\n\n    return count;\n}\n\nu8 CountPartyAliveNonEggMonsExcept(u8 slotToIgnore)\n{\n    u16 i, count;\n\n    for (i = 0, count = 0; i < PARTY_SIZE; i++)\n    {\n        if (i != slotToIgnore\n                && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE\n                && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)\n                && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0)\n            count++;\n    }\n\n    return count;\n}\n\nu16 CountPartyAliveNonEggMons_IgnoreVar0x8004Slot(void)\n{\n    return CountPartyAliveNonEggMonsExcept(gSpecialVar_0x8004);\n}\n\nu8 CountPartyMons(void)\n{\n    u16 i, count;\n\n    for (i = 0, count = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE)\n            count++;\n    }\n\n    return count;\n}\n\nstatic u8 *StringCopyAndFillWithSpaces(u8 *dst, const u8 *src, u16 n)\n{\n    u8 *str;\n\n    for (str = StringCopy(dst, src); str < dst + n; str++)\n        *str = CHAR_SPACE;\n\n    *str = EOS;\n    return str;\n}\n\n// Unused\nstatic void UnusedWriteRectCpu(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width)\n{\n    u32 i;\n\n    dest_width *= 2;\n    dest += dest_top * 0x20 + dest_left;\n    src += src_top * src_width + src_left;\n    for (i = 0; i < dest_height; i++)\n    {\n        CpuCopy16(src, dest, dest_width);\n        dest += 0x20;\n        src += src_width;\n    }\n}\n\n// Unused\nstatic void UnusedWriteRectDma(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height)\n{\n    u32 i;\n\n    dest += dest_top * 0x20 + dest_left;\n    width *= 2;\n    for (i = 0; i < height; dest += 0x20, i++)\n        Dma3FillLarge16_(0, dest, width);\n}\n\nenum {\n    STATE_LOAD,\n    STATE_FADE_IN,\n    STATE_HANDLE_INPUT,\n    STATE_ERROR_MSG,\n    STATE_ENTER_PC,\n};\n\n#define tState          data[0]\n#define tSelectedOption data[1]\n#define tInput          data[2]\n#define tNextOption     data[3]\n#define tWindowId       data[15]\n\nstatic void Task_PCMainMenu(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    switch (task->tState)\n    {\n    case STATE_LOAD:\n        SetHelpContext(HELPCONTEXT_BILLS_PC);\n        CreatePCMainMenu(task->tSelectedOption, &task->tWindowId);\n        LoadStdWindowFrameGfx();\n        DrawDialogueFrame(0, FALSE);\n        FillWindowPixelBuffer(0, PIXEL_FILL(1));\n        AddTextPrinterParameterized2(0, FONT_NORMAL, sMainMenuTexts[task->tSelectedOption].desc, TEXT_SKIP_DRAW, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n        CopyWindowToVram(0, COPYWIN_FULL);\n        CopyWindowToVram(task->tWindowId, COPYWIN_FULL);\n        task->tState++;\n        break;\n    case STATE_FADE_IN:\n        if (IsWeatherNotFadingIn())\n            task->tState++;\n\n        break;\n    case STATE_HANDLE_INPUT:\n        task->tInput = Menu_ProcessInput();\n        switch(task->tInput)\n        {\n        case MENU_NOTHING_CHOSEN:\n            task->tNextOption = task->tSelectedOption;\n            if (JOY_NEW(DPAD_UP) && --task->tNextOption < 0)\n                task->tNextOption = OPTIONS_COUNT - 1;\n            if (JOY_NEW(DPAD_DOWN) && ++task->tNextOption > OPTIONS_COUNT - 1)\n                task->tNextOption = 0;\n\n            if (task->tSelectedOption != task->tNextOption)\n            {\n                task->tSelectedOption = task->tNextOption;\n                FillWindowPixelBuffer(0, PIXEL_FILL(1));\n                AddTextPrinterParameterized2(0, FONT_NORMAL, sMainMenuTexts[task->tSelectedOption].desc, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n            }\n            break;\n        case MENU_B_PRESSED:\n        case OPTION_EXIT:\n            ClearStdWindowAndFrame(0, TRUE);\n            ClearStdWindowAndFrame(task->tWindowId, TRUE);\n            UnlockPlayerFieldControls();\n            ScriptContext_Enable();\n            DestroyTask(taskId);\n            break;\n        default:\n            if (task->tInput == OPTION_WITHDRAW && CountPartyMons() == PARTY_SIZE)\n            {\n                // Can't withdraw\n                FillWindowPixelBuffer(0, PIXEL_FILL(1));\n                AddTextPrinterParameterized2(0, FONT_NORMAL, gText_PartyFull, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n                task->tState = STATE_ERROR_MSG;\n            }\n            else if (task->tInput == OPTION_DEPOSIT && CountPartyMons() == 1)\n            {\n                // Can't deposit\n                FillWindowPixelBuffer(0, PIXEL_FILL(1));\n                AddTextPrinterParameterized2(0, FONT_NORMAL, gText_JustOnePkmn, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n                task->tState = STATE_ERROR_MSG;\n            }\n            else\n            {\n                // Enter PC\n                FadeScreen(FADE_TO_BLACK, 0);\n                task->tState = STATE_ENTER_PC;\n            }\n            break;\n        }\n        break;\n    case STATE_ERROR_MSG:\n        // Printed \"can't do PC option message\"\n        // Wait for new input after message\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n        {\n            FillWindowPixelBuffer(0, PIXEL_FILL(1));\n            AddTextPrinterParameterized2(0, FONT_NORMAL, sMainMenuTexts[task->tSelectedOption].desc, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n            task->tState = STATE_HANDLE_INPUT;\n        }\n        else if (JOY_NEW(DPAD_UP))\n        {\n            if (--task->tSelectedOption < 0)\n                task->tSelectedOption = 4;\n            Menu_MoveCursor(-1);\n            task->tSelectedOption = Menu_GetCursorPos();\n            FillWindowPixelBuffer(0, PIXEL_FILL(1));\n            AddTextPrinterParameterized2(0, FONT_NORMAL, sMainMenuTexts[task->tSelectedOption].desc, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n            task->tState = STATE_HANDLE_INPUT;\n        }\n        else if (JOY_NEW(DPAD_DOWN))\n        {\n            if (++task->tSelectedOption > 3)\n                task->tSelectedOption = 0;\n            Menu_MoveCursor(1);\n            task->tSelectedOption = Menu_GetCursorPos();\n            FillWindowPixelBuffer(0, PIXEL_FILL(1));\n            AddTextPrinterParameterized2(0, FONT_NORMAL, sMainMenuTexts[task->tSelectedOption].desc, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n            task->tState = STATE_HANDLE_INPUT;\n        }\n        break;\n    case STATE_ENTER_PC:\n        if (!gPaletteFade.active)\n        {\n            CleanupOverworldWindowsAndTilemaps();\n            EnterPokeStorage(task->tInput);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nvoid ShowPokemonStorageSystemPC(void)\n{\n    u8 taskId = CreateTask(Task_PCMainMenu, 80);\n    gTasks[taskId].tState = STATE_LOAD;\n    gTasks[taskId].tSelectedOption = 0;\n    LockPlayerFieldControls();\n}\n\nstatic void FieldTask_ReturnToPcMenu(void)\n{\n    u8 taskId;\n    MainCallback vblankCb = gMain.vblankCallback;\n\n    SetVBlankCallback(NULL);\n    taskId = CreateTask(Task_PCMainMenu, 80);\n    gTasks[taskId].tState = STATE_LOAD;\n    gTasks[taskId].tSelectedOption = sPreviousBoxOption;\n    Task_PCMainMenu(taskId);\n    SetVBlankCallback(vblankCb);\n    FadeInFromBlack();\n}\n\nstatic const struct WindowTemplate sWindowTemplate_MainMenu = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 1,\n    .width = 17,\n    .height = 10,\n    .paletteNum = 15,\n    .baseBlock = 0x001\n};\n\nstatic void CreatePCMainMenu(u8 whichMenu, s16 *windowIdPtr)\n{\n    s16 windowId = AddWindow(&sWindowTemplate_MainMenu);\n\n    DrawStdWindowFrame(windowId, FALSE);\n    PrintTextArray(windowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, 16, ARRAY_COUNT(sMainMenuTexts), (void *)sMainMenuTexts);\n    Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 16, ARRAY_COUNT(sMainMenuTexts), whichMenu);\n    *windowIdPtr = windowId;\n}\n\nvoid CB2_ExitPokeStorage(void)\n{\n    sPreviousBoxOption = GetCurrentBoxOption();\n    gFieldCallback = FieldTask_ReturnToPcMenu;\n    SetMainCallback2(CB2_ReturnToField);\n}\n\nvoid ResetPokemonStorageSystem(void)\n{\n    u16 boxId, boxPosition;\n\n    SetCurrentBox(0);\n    for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++)\n    {\n        for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++)\n            ZeroBoxMonAt(boxId, boxPosition);\n    }\n    for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++)\n    {\n        u8 *dest = StringCopy(GetBoxNamePtr(boxId), gText_Box);\n        ConvertIntToDecimalStringN(dest, boxId + 1, STR_CONV_MODE_LEFT_ALIGN, 2);\n    }\n\n    for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++)\n        SetBoxWallpaper(boxId, boxId % (MAX_DEFAULT_WALLPAPER + 1));\n}\n\nvoid LoadChooseBoxMenuGfx(struct ChooseBoxMenu *menu, u16 tileTag, u16 palTag, u8 subpriority, bool32 loadPal)\n{\n    struct SpritePalette palette = {\n        sChooseBoxMenu_Pal, palTag\n    };\n    struct SpriteSheet sheets[] = {\n        {sChooseBoxMenuCenter_Gfx, 0x800, tileTag},\n        {sChooseBoxMenuCorners_Gfx,  0x180, tileTag + 1},\n        {}\n    };\n\n    if (loadPal) // Always false\n        LoadSpritePalette(&palette);\n\n    LoadSpriteSheets(sheets);\n    sChooseBoxMenu = menu;\n    menu->tileTag = tileTag;\n    menu->paletteTag = palTag;\n    menu->subpriority = subpriority;\n    menu->loadedPalette = loadPal;\n}\n\nvoid FreeBoxSelectionPopupSpriteGfx(void)\n{\n    if (sChooseBoxMenu->loadedPalette)\n        FreeSpritePaletteByTag(sChooseBoxMenu->paletteTag);\n    FreeSpriteTilesByTag(sChooseBoxMenu->tileTag);\n    FreeSpriteTilesByTag(sChooseBoxMenu->tileTag + 1);\n}\n\nvoid CreateChooseBoxMenuSprites(u8 curBox)\n{\n    ChooseBoxMenu_CreateSprites(curBox);\n}\n\nvoid DestroyChooseBoxMenuSprites(void)\n{\n    ChooseBoxMenu_DestroySprites();\n}\n\nu8 HandleBoxChooseSelectionInput(void)\n{\n    if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        return BOXID_CANCELED;\n    }\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        return sChooseBoxMenu->curBox;\n    }\n    if (JOY_NEW(DPAD_LEFT))\n    {\n        PlaySE(SE_SELECT);\n        ChooseBoxMenu_MoveLeft();\n    }\n    else if (JOY_NEW(DPAD_RIGHT))\n    {\n        PlaySE(SE_SELECT);\n        ChooseBoxMenu_MoveRight();\n    }\n    return BOXID_NONE_CHOSEN;\n}\n\nstatic const union AnimCmd sAnim_ChooseBoxMenu_TopLeft[] = {\n    ANIMCMD_FRAME( 0, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_ChooseBoxMenu_BottomLeft[] = {\n    ANIMCMD_FRAME( 4, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_ChooseBoxMenu_TopRight[] = {\n    ANIMCMD_FRAME( 6, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_ChooseBoxMenu_BottomRight[] = {\n    ANIMCMD_FRAME(10, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_ChooseBoxMenu[] = {\n    sAnim_ChooseBoxMenu_TopLeft,\n    sAnim_ChooseBoxMenu_BottomLeft,\n    sAnim_ChooseBoxMenu_TopRight,\n    sAnim_ChooseBoxMenu_BottomRight,\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ChooseBoxMenu[] = {\n    AFFINEANIMCMD_FRAME(224, 224, 0, 0),\n    AFFINEANIMCMD_END\n};\n\n// Unused\nstatic const union AffineAnimCmd *const sAffineAnims_ChooseBoxMenu[] = {\n    sAffineAnim_ChooseBoxMenu\n};\n\nstatic void ChooseBoxMenu_CreateSprites(u8 curBox)\n{\n    u32 i;\n    u8 spriteId;\n    struct SpriteTemplate template;\n    struct OamData oamData = {};\n    oamData.size = SPRITE_SIZE(64x64);\n    oamData.paletteNum = 1;\n    template = (struct SpriteTemplate){\n        0, 0, &oamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy\n    };\n    {\n    const u8 sText_OutOf30[] = _(\"/30\");\n\n    sChooseBoxMenu->curBox = curBox;\n    template.tileTag = sChooseBoxMenu->tileTag;\n    template.paletteTag = sChooseBoxMenu->paletteTag;\n\n    spriteId = CreateSprite(&template, 160, 96, 0);\n    sChooseBoxMenu->menuSprite = gSprites + spriteId;\n\n    oamData.shape = SPRITE_SHAPE(8x32);\n    oamData.size = SPRITE_SIZE(8x32);\n    template.tileTag = sChooseBoxMenu->tileTag + 1;\n    template.anims = sAnims_ChooseBoxMenu;\n    for (i = 0; i < ARRAY_COUNT(sChooseBoxMenu->menuCornerSprites); i++)\n    {\n        // corner sprites are created in order of top left, bottom left, top right, bottom right\n        u16 animNum;\n        spriteId = CreateSprite(&template, 124, 80, sChooseBoxMenu->subpriority); // place at top left\n        sChooseBoxMenu->menuCornerSprites[i] = &gSprites[spriteId];\n        animNum = 0;\n        if (i & 2)\n        {\n            sChooseBoxMenu->menuCornerSprites[i]->x = 196; // move to bottom\n            animNum = 2;\n        }\n        if (i & 1)\n        {\n            sChooseBoxMenu->menuCornerSprites[i]->y = 112; // move to right\n            sChooseBoxMenu->menuCornerSprites[i]->oam.size = SPRITE_SIZE(8x16);\n            animNum++;\n        }\n        StartSpriteAnim(sChooseBoxMenu->menuCornerSprites[i], animNum);\n    }\n    for (i = 0; i < ARRAY_COUNT(sChooseBoxMenu->arrowSprites); i++)\n    {\n        sChooseBoxMenu->arrowSprites[i] = CreateChooseBoxArrows(72 * i + 124, 88, i, 0, sChooseBoxMenu->subpriority);\n        if (sChooseBoxMenu->arrowSprites[i])\n        {\n            sChooseBoxMenu->arrowSprites[i]->data[0] = (i == 0 ? -1 : 1);\n            sChooseBoxMenu->arrowSprites[i]->callback = SpriteCB_ChooseBoxArrow;\n        }\n    }\n    ChooseBoxMenu_PrintBoxNameAndCount();\n    ChooseBoxMenu_PrintTextToSprite(sText_OutOf30, 5, 3);\n    }\n}\n\nstatic void ChooseBoxMenu_DestroySprites(void)\n{\n    u32 i;\n    if (sChooseBoxMenu->menuSprite)\n    {\n        DestroySprite(sChooseBoxMenu->menuSprite);\n        sChooseBoxMenu->menuSprite = NULL;\n    }\n    for (i = 0; i < ARRAY_COUNT(sChooseBoxMenu->menuCornerSprites); i++)\n    {\n        if (sChooseBoxMenu->menuCornerSprites[i])\n        {\n            DestroySprite(sChooseBoxMenu->menuCornerSprites[i]);\n            sChooseBoxMenu->menuCornerSprites[i] = NULL;\n        }\n    }\n    for (i = 0; i < ARRAY_COUNT(sChooseBoxMenu->arrowSprites); i++)\n    {\n        if (sChooseBoxMenu->arrowSprites[i])\n            DestroySprite(sChooseBoxMenu->arrowSprites[i]);\n    }\n}\n\nstatic void ChooseBoxMenu_MoveRight(void)\n{\n    if (++sChooseBoxMenu->curBox >= TOTAL_BOXES_COUNT)\n        sChooseBoxMenu->curBox = 0;\n    ChooseBoxMenu_PrintBoxNameAndCount();\n}\n\nstatic void ChooseBoxMenu_MoveLeft(void)\n{\n    sChooseBoxMenu->curBox = (sChooseBoxMenu->curBox == 0 ? TOTAL_BOXES_COUNT - 1 : sChooseBoxMenu->curBox - 1);\n    ChooseBoxMenu_PrintBoxNameAndCount();\n}\n\nstatic void ChooseBoxMenu_PrintBoxNameAndCount(void)\n{\n    u8 numMonInBox = CountMonsInBox(sChooseBoxMenu->curBox);\n    u8 *boxName = StringCopy(sChooseBoxMenu->strbuf, GetBoxNamePtr(sChooseBoxMenu->curBox));\n\n    while (boxName < sChooseBoxMenu->strbuf + BOX_NAME_LENGTH)\n        *boxName++ = CHAR_SPACE;\n    *boxName = EOS;\n\n    ChooseBoxMenu_PrintTextToSprite(sChooseBoxMenu->strbuf, 0, 1);\n\n    ConvertIntToDecimalStringN(sChooseBoxMenu->strbuf, numMonInBox, STR_CONV_MODE_RIGHT_ALIGN, 2);\n\n    ChooseBoxMenu_PrintTextToSprite(sChooseBoxMenu->strbuf, 3, 3);\n}\n\nstatic void ChooseBoxMenu_PrintTextToSprite(const u8 *str, u16 x, u16 y)\n{\n    void *dst = (void *)(OBJ_VRAM0 + GetSpriteTileStartByTag(sChooseBoxMenu->tileTag) * 32 + 256 * y + 32 * x);\n    PrintStringToBufferCopyNow(str, dst, 0x100, TEXT_COLOR_RED, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5, sChooseBoxMenu->buffer);\n}\n\nstatic void SpriteCB_ChooseBoxArrow(struct Sprite *sprite)\n{\n    if (++sprite->data[1] > 3)\n    {\n        sprite->data[1] = 0;\n        sprite->x2 += sprite->data[0];\n        if (++sprite->data[2] > 5)\n        {\n            sprite->data[2] = 0;\n            sprite->x2 = 0;\n        }\n    }\n}\n\n// Unused, since LoadChooseBoxMenuGfx is always called with `loadPal` as false\nstatic const u16 sChooseBoxMenu_Pal[] = INCBIN_U16(\"graphics/pokemon_storage/unused_choose_box_menu.gbapal\");\n\nstatic const u8 sChooseBoxMenuCenter_Gfx[] = INCBIN_U8(\"graphics/pokemon_storage/choose_box_menu_center.4bpp\");\nstatic const u8 sChooseBoxMenuCorners_Gfx[] = INCBIN_U8(\"graphics/pokemon_storage/choose_box_menu_corners.4bpp\");\n"
  },
  {
    "path": "src/pokemon_storage_system_misc.c",
    "content": "#include <stdlib.h> // to declare abs\n#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"item.h\"\n#include \"item_menu_icons.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"pokemon_icon.h\"\n#include \"pokemon_storage_system_internal.h\"\n#include \"text_window.h\"\n#include \"trig.h\"\n#include \"constants/items.h\"\n\nstatic EWRAM_DATA struct\n{\n    u8 funcId;\n    u8 state;\n    u8 fromColumn;\n    u8 fromRow;\n    u8 toColumn;\n    u8 toRow;\n    u8 cursorColumn;\n    u8 cursorRow;\n    u8 minColumn;\n    u8 minRow;\n    u8 columnsTotal;\n    u8 rowsTotal;\n    u16 bgX;\n    u16 bgY;\n    u16 bgMoveSteps;\n    struct BoxPokemon boxMons[IN_BOX_COUNT];\n} *sMultiMove = NULL;\n\nstatic bool8 MultiMove_Function_Start(void);\nstatic bool8 MultiMove_Function_Single(void);\nstatic bool8 MultiMove_Function_ChangeSelection(void);\nstatic bool8 MultiMove_Function_GrabSelection(void);\nstatic bool8 MultiMove_Function_MoveMons(void);\nstatic bool8 MultiMove_Function_PlaceMons(void);\nstatic void MultiMove_UpdateSelectedIcons(void);\nstatic void MultiMove_SelectColumn(u8 column, u8 minRow, u8 maxRow);\nstatic void MultiMove_SelectRow(u8 row, u8 minColumn, u8 maxColumn);\nstatic void MultiMove_DeselectColumn(u8 arg0, u8 minRow, u8 maxRow);\nstatic void MultiMove_DeselectRow(u8 row, u8 minColumn, u8 maxColumn);\nstatic void MultiMove_SetIconToBg(u8 x, u8 y);\nstatic void MultiMove_ClearIconFromBg(u8 x, u8 y);\nstatic void MultiMove_InitBg(u16 bgX, u16 bgY, u16 duration);\nstatic u8 MultiMove_UpdateBg(void);\nstatic void MultiMove_GetMonsFromSelection(void);\nstatic void MultiMove_RemoveMonsFromBox(void);\nstatic void MultiMove_CreatePlacedMonIcons(void);\nstatic void MultiMove_SetPlacedMonData(void);\nstatic void MultiMove_ResetBg(void);\n\nstatic const struct WindowTemplate sWindowTemplate_MultiMove = {\n    .bg = 0,\n    .tilemapLeft = 10,\n    .tilemapTop = 3,\n    .width = 20,\n    .height = 18,\n    .paletteNum = 9,\n    .baseBlock = 0x00a\n};\n\nbool8 MultiMove_Init(void)\n{\n    sMultiMove = Alloc(sizeof(*sMultiMove));\n    if (sMultiMove != NULL)\n    {\n        gStorage->multiMoveWindowId = AddWindow8Bit(&sWindowTemplate_MultiMove);\n        if (gStorage->multiMoveWindowId != WINDOW_NONE)\n        {\n            FillWindowPixelBuffer(gStorage->multiMoveWindowId, PIXEL_FILL(0));\n            return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nvoid MultiMove_Free(void)\n{\n    if (sMultiMove != NULL)\n        Free(sMultiMove);\n}\n\nvoid MultiMove_SetFunction(u8 funcId)\n{\n    sMultiMove->funcId = funcId;\n    sMultiMove->state = 0;\n}\n\nbool8 MultiMove_RunFunction(void)\n{\n    switch (sMultiMove->funcId)\n    {\n    case MULTIMOVE_START:\n        return MultiMove_Function_Start();\n    case MULTIMOVE_SINGLE:\n        return MultiMove_Function_Single();\n    case MULTIMOVE_CHANGE_SELECTION:\n        return MultiMove_Function_ChangeSelection();\n    case MULTIMOVE_GRAB_SELECTION:\n        return MultiMove_Function_GrabSelection();\n    case MULTIMOVE_MOVE_MONS:\n        return MultiMove_Function_MoveMons();\n    case MULTIMOVE_PLACE_MONS:\n        return MultiMove_Function_PlaceMons();\n    }\n\n    return FALSE;\n}\n\nstatic bool8 MultiMove_Function_Start(void)\n{\n    switch (sMultiMove->state)\n    {\n    case 0:\n        HideBg(0);\n        LoadMonIconPalettesAt(BG_PLTT_ID(8));\n        sMultiMove->state++;\n        break;\n    case 1:\n        GetCursorBoxColumnAndRow(&sMultiMove->fromColumn, &sMultiMove->fromRow);\n        sMultiMove->toColumn = sMultiMove->fromColumn;\n        sMultiMove->toRow = sMultiMove->fromRow;\n        ChangeBgX(0, -1024, BG_COORD_SET);\n        ChangeBgY(0, -1024, BG_COORD_SET);\n        FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);\n        FillWindowPixelBuffer8Bit(gStorage->multiMoveWindowId, PIXEL_FILL(0));\n        MultiMove_SetIconToBg(sMultiMove->fromColumn, sMultiMove->fromRow);\n        SetBgAttribute(0, BG_ATTR_PALETTEMODE, 1);\n        PutWindowTilemap(gStorage->multiMoveWindowId);\n        CopyWindowToVram8Bit(gStorage->multiMoveWindowId, COPYWIN_FULL);\n        BlendPalettes(0x3F00, 8, RGB_WHITE);\n        StartCursorAnim(CURSOR_ANIM_OPEN);\n        SetGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR);\n        sMultiMove->state++;\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            ShowBg(0);\n            return FALSE;\n        }\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 MultiMove_Function_Single(void)\n{\n    switch (sMultiMove->state)\n    {\n    case 0:\n        HideBg(0);\n        sMultiMove->state++;\n        break;\n    case 1:\n        MultiMove_ResetBg();\n        StartCursorAnim(CURSOR_ANIM_BOUNCE);\n        sMultiMove->state++;\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            SetCursorPriorityTo1();\n            LoadPalette(GetTextWindowPalette(3), BG_PLTT_ID(13), PLTT_SIZE_4BPP);\n            ShowBg(0);\n            return FALSE;\n        }\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 MultiMove_Function_ChangeSelection(void)\n{\n    switch (sMultiMove->state)\n    {\n    case 0:\n        if (!UpdateCursorPos())\n        {\n            GetCursorBoxColumnAndRow(&sMultiMove->cursorColumn, &sMultiMove->cursorRow);\n            MultiMove_UpdateSelectedIcons();\n            sMultiMove->toColumn = sMultiMove->cursorColumn;\n            sMultiMove->toRow = sMultiMove->cursorRow;\n            CopyWindowToVram8Bit(gStorage->multiMoveWindowId, COPYWIN_GFX);\n            sMultiMove->state++;\n        }\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool8 MultiMove_Function_GrabSelection(void)\n{\n    u8 movingBg, movingMon;\n\n    switch (sMultiMove->state)\n    {\n    case 0:\n        MultiMove_GetMonsFromSelection();\n        MultiMove_RemoveMonsFromBox();\n        InitMultiMonPlaceChange(FALSE);\n        sMultiMove->state++;\n        break;\n    case 1:\n        if (!DoMonPlaceChange())\n        {\n            StartCursorAnim(CURSOR_ANIM_FIST);\n            MultiMove_InitBg(0, 256, 8);\n            InitMultiMonPlaceChange(TRUE);\n            sMultiMove->state++;\n        }\n        break;\n    case 2:\n        movingBg = MultiMove_UpdateBg();\n        movingMon = DoMonPlaceChange();\n        if (!movingBg && !movingMon)\n            return FALSE;\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 MultiMove_Function_MoveMons(void)\n{\n    u8 movingCursor = UpdateCursorPos();\n    u8 movingBg = MultiMove_UpdateBg();\n\n    if (!movingCursor && !movingBg)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic bool8 MultiMove_Function_PlaceMons(void)\n{\n    switch (sMultiMove->state)\n    {\n    case 0:\n        MultiMove_SetPlacedMonData();\n        MultiMove_InitBg(0, -256, 8);\n        InitMultiMonPlaceChange(FALSE);\n        sMultiMove->state++;\n        break;\n    case 1:\n        if (!DoMonPlaceChange() && !MultiMove_UpdateBg())\n        {\n            MultiMove_CreatePlacedMonIcons();\n            StartCursorAnim(CURSOR_ANIM_OPEN);\n            InitMultiMonPlaceChange(TRUE);\n            HideBg(0);\n            sMultiMove->state++;\n        }\n        break;\n    case 2:\n        if (!DoMonPlaceChange())\n        {\n            StartCursorAnim(CURSOR_ANIM_BOUNCE);\n            MultiMove_ResetBg();\n            sMultiMove->state++;\n        }\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            LoadPalette(GetTextWindowPalette(3), BG_PLTT_ID(13), PLTT_SIZE_4BPP);\n            SetCursorPriorityTo1();\n            ShowBg(0);\n            return FALSE;\n        }\n        break;\n    }\n\n    return TRUE;\n}\n\nbool8 MultiMove_TryMoveGroup(u8 dir)\n{\n    switch (dir)\n    {\n    case 0: // up\n        if (sMultiMove->minRow == 0)\n            return FALSE;\n        sMultiMove->minRow--;\n        MultiMove_InitBg(0, 1024, 6);\n        break;\n    case 1: // down\n        if (sMultiMove->minRow + sMultiMove->rowsTotal >= 5)\n            return FALSE;\n        sMultiMove->minRow++;\n        MultiMove_InitBg(0, -1024, 6);\n        break;\n    case 2: // left\n        if (sMultiMove->minColumn == 0)\n            return FALSE;\n        sMultiMove->minColumn--;\n        MultiMove_InitBg(1024, 0, 6);\n        break;\n    case 3: // right\n        if (sMultiMove->minColumn + sMultiMove->columnsTotal > 5)\n            return FALSE;\n        sMultiMove->minColumn++;\n        MultiMove_InitBg(-1024, 0, 6);\n        break;\n    }\n\n    return TRUE;\n}\n\nstatic void MultiMove_UpdateSelectedIcons(void)\n{\n    s16 columnChange = (abs(sMultiMove->fromColumn - sMultiMove->cursorColumn)) - (abs(sMultiMove->fromColumn - sMultiMove->toColumn));\n    s16 rowChange = (abs(sMultiMove->fromRow - sMultiMove->cursorRow)) - (abs(sMultiMove->fromRow - sMultiMove->toRow));\n\n    if (columnChange > 0)\n        MultiMove_SelectColumn(sMultiMove->cursorColumn, sMultiMove->fromRow, sMultiMove->toRow);\n\n    if (columnChange < 0)\n    {\n        MultiMove_DeselectColumn(sMultiMove->toColumn, sMultiMove->fromRow, sMultiMove->toRow);\n        MultiMove_SelectColumn(sMultiMove->cursorColumn, sMultiMove->fromRow, sMultiMove->toRow);\n    }\n\n    if (rowChange > 0)\n        MultiMove_SelectRow(sMultiMove->cursorRow, sMultiMove->fromColumn, sMultiMove->toColumn);\n\n    if (rowChange < 0)\n    {\n        MultiMove_DeselectRow(sMultiMove->toRow, sMultiMove->fromColumn, sMultiMove->toColumn);\n        MultiMove_SelectRow(sMultiMove->cursorRow, sMultiMove->fromColumn, sMultiMove->toColumn);\n    }\n}\n\nstatic void MultiMove_SelectColumn(u8 column, u8 minRow, u8 maxRow)\n{\n    u8 tmp = minRow;\n\n    if (minRow > maxRow)\n    {\n        minRow = maxRow;\n        maxRow = tmp;\n    }\n\n    while (minRow <= maxRow)\n        MultiMove_SetIconToBg(column, minRow++);\n}\n\nstatic void MultiMove_SelectRow(u8 row, u8 minColumn, u8 maxColumn)\n{\n    u8 tmp = minColumn;\n\n    if (minColumn > maxColumn)\n    {\n        minColumn = maxColumn;\n        maxColumn = tmp;\n    }\n\n    while (minColumn <= maxColumn)\n        MultiMove_SetIconToBg(minColumn++, row);\n}\n\nstatic void MultiMove_DeselectColumn(u8 column, u8 minRow, u8 maxRow)\n{\n    u8 tmp = minRow;\n\n    if (minRow > maxRow)\n    {\n        minRow = maxRow;\n        maxRow = tmp;\n    }\n\n    while (minRow <= maxRow)\n        MultiMove_ClearIconFromBg(column, minRow++);\n}\n\nstatic void MultiMove_DeselectRow(u8 row, u8 minColumn, u8 maxColumn)\n{\n    u8 tmp = minColumn;\n\n    if (minColumn > maxColumn)\n    {\n        minColumn = maxColumn;\n        maxColumn = tmp;\n    }\n\n    while (minColumn <= maxColumn)\n        MultiMove_ClearIconFromBg(minColumn++, row);\n}\n\nstatic void MultiMove_SetIconToBg(u8 x, u8 y)\n{\n    u8 position = x + (IN_BOX_COLUMNS * y);\n    u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES_OR_EGG);\n    u32 personality = GetCurrentBoxMonData(position, MON_DATA_PERSONALITY);\n\n    if(species == SPECIES_DEOXYS)\n        species = GetDeoxysSpeciesFromForme(GetCurrentBoxMonData(position, MON_DATA_FORME));\n\n    if (species != SPECIES_NONE)\n    {\n        const u8 *iconGfx = GetMonIconPtr(species, personality, 1);\n        u8 palNum = GetValidMonIconPalIndex(species) + 8;\n        BlitBitmapRectToWindow4BitTo8Bit(gStorage->multiMoveWindowId, iconGfx, 0, 0, 32, 32, 24 * x, 24 * y, 32, 32, palNum);\n    }\n}\n\nstatic void MultiMove_ClearIconFromBg(u8 x, u8 y)\n{\n    u8 position = x + (IN_BOX_COLUMNS * y);\n    u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES_OR_EGG);\n\n    if (species != SPECIES_NONE)\n        FillWindowPixelRect8Bit(gStorage->multiMoveWindowId, PIXEL_FILL(0), 24 * x, 24 * y, 32, 32);\n}\n\nstatic void MultiMove_InitBg(u16 bgX, u16 bgY, u16 duration)\n{\n    sMultiMove->bgX = bgX;\n    sMultiMove->bgY = bgY;\n    sMultiMove->bgMoveSteps = duration;\n}\n\nstatic u8 MultiMove_UpdateBg(void)\n{\n    if (sMultiMove->bgMoveSteps != 0)\n    {\n        ChangeBgX(0, sMultiMove->bgX, BG_COORD_ADD);\n        ChangeBgY(0, sMultiMove->bgY, BG_COORD_ADD);\n        sMultiMove->bgMoveSteps--;\n    }\n\n    return sMultiMove->bgMoveSteps;\n}\n\nstatic void MultiMove_GetMonsFromSelection(void)\n{\n    s32 i, j;\n    s32 columnCount, rowCount;\n    u8 boxId;\n    u8 monArrayId;\n\n    sMultiMove->minColumn = min(sMultiMove->fromColumn, sMultiMove->toColumn);\n    sMultiMove->minRow = min(sMultiMove->fromRow, sMultiMove->toRow);\n    sMultiMove->columnsTotal = abs(sMultiMove->fromColumn - sMultiMove->toColumn) + 1;\n    sMultiMove->rowsTotal = abs(sMultiMove->fromRow - sMultiMove->toRow) + 1;\n    boxId = StorageGetCurrentBox();\n    monArrayId = 0;\n    columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal;\n    rowCount = sMultiMove->minRow + sMultiMove->rowsTotal;\n    for (i = sMultiMove->minRow; i < rowCount; i++)\n    {\n        u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn;\n        for (j = sMultiMove->minColumn; j < columnCount; j++)\n        {\n            struct BoxPokemon *boxMon = GetBoxedMonPtr(boxId, boxPosition);\n            // UB: possible null dereference\n#ifdef UBFIX\n            if (boxMon != NULL)\n                sMultiMove->boxMons[monArrayId] = *boxMon;\n#else\n            sMultiMove->boxMons[monArrayId] = *boxMon;\n#endif\n            monArrayId++;\n            boxPosition++;\n        }\n    }\n}\n\nstatic void MultiMove_RemoveMonsFromBox(void)\n{\n    s32 i, j;\n    s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal;\n    s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal;\n    u8 boxId = StorageGetCurrentBox();\n\n    for (i = sMultiMove->minRow; i < rowCount; i++)\n    {\n        u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn;\n        for (j = sMultiMove->minColumn; j < columnCount; j++)\n        {\n            DestroyBoxMonIconAtPosition(boxPosition);\n            ZeroBoxMonAt(boxId, boxPosition);\n            boxPosition++;\n        }\n    }\n}\n\nstatic void MultiMove_CreatePlacedMonIcons(void)\n{\n    s32 i, j;\n    s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal;\n    s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal;\n    u8 monArrayId = 0;\n\n    for (i = sMultiMove->minRow; i < rowCount; i++)\n    {\n        u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn;\n        for (j = sMultiMove->minColumn; j < columnCount; j++)\n        {\n            if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES))\n                CreateBoxMonIconAtPos(boxPosition);\n            monArrayId++;\n            boxPosition++;\n        }\n    }\n}\n\nstatic void MultiMove_SetPlacedMonData(void)\n{\n    s32 i, j;\n    s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal;\n    s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal;\n    u8 boxId = StorageGetCurrentBox();\n    u8 monArrayId = 0;\n\n    for (i = sMultiMove->minRow; i < rowCount; i++)\n    {\n        u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn;\n        for (j = sMultiMove->minColumn; j < columnCount; j++)\n        {\n            if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES))\n                SetBoxMonAt(boxId, boxPosition, &sMultiMove->boxMons[monArrayId]);\n            boxPosition++;\n            monArrayId++;\n        }\n    }\n}\n\nstatic void MultiMove_ResetBg(void)\n{\n    ChangeBgX(0, 0, BG_COORD_SET);\n    ChangeBgY(0, 0, BG_COORD_SET);\n    SetBgAttribute(0, BG_ATTR_PALETTEMODE, 0);\n    ClearGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR);\n    FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);\n    CopyBgTilemapBufferToVram(0);\n}\n\nu8 MultiMove_GetOriginPosition(void)\n{\n    return (IN_BOX_COLUMNS * sMultiMove->fromRow) + sMultiMove->fromColumn;\n}\n\nbool8 MultiMove_CanPlaceSelection(void)\n{\n    s32 i, j;\n    s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal;\n    s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal;\n    u8 monArrayId = 0;\n\n    for (i = sMultiMove->minRow; i < rowCount; i++)\n    {\n        u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn;\n        for (j = sMultiMove->minColumn; j < columnCount; j++)\n        {\n            if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)\n                && GetCurrentBoxMonData(boxPosition, MON_DATA_SANITY_HAS_SPECIES))\n                return FALSE;\n\n            monArrayId++;\n            boxPosition++;\n        }\n    }\n\n    return TRUE;\n}\n\n// IDs for the item icon sprite callbacks\nenum {\n    ITEM_CB_WAIT_ANIM,\n    ITEM_CB_TO_HAND,\n    ITEM_CB_TO_MON,\n    ITEM_CB_SWAP_TO_HAND,\n    ITEM_CB_SWAP_TO_MON,\n    ITEM_CB_UNUSED_1,\n    ITEM_CB_UNUSED_2,\n    ITEM_CB_HIDE_PARTY,\n};\n\nstatic u8 GetNewItemIconIdx(void);\nstatic bool32 IsItemIconAtPosition(u8 cursorArea, u8 cursorPos);\nstatic u8 GetItemIconIdxByPosition(u8 cursorArea, u8 cursorPos);\nstatic void SetItemIconPosition(u8 id, u8 cursorArea, u8 cursorPos);\nstatic void LoadItemIconGfx(u8 id, const u32 * tiles, const u32 * pal);\nstatic void SetItemIconAffineAnim(u8 id, u8 affineAnimNo);\nstatic void SetItemIconCallback(u8 id, u8 command, u8 cursorArea, u8 cursorPos);\nstatic void SetItemIconActive(u8 id, bool8 show);\nstatic const u32 *GetItemIconPic(u16 itemId);\nstatic const u32 *GetItemIconPalette(u16 itemId);\nstatic void DrawItemInfoWindow(u32 x);\nstatic void SpriteCB_ItemIcon_WaitAnim(struct Sprite *sprite);\nstatic void SpriteCB_ItemIcon_ToHand(struct Sprite *sprite);\nstatic void SpriteCB_ItemIcon_SetPosToCursor(struct Sprite *sprite);\nstatic void SpriteCB_ItemIcon_ToMon(struct Sprite *sprite);\nstatic void SpriteCB_ItemIcon_SwapToHand(struct Sprite *sprite);\nstatic void SpriteCB_ItemIcon_SwapToMon(struct Sprite *sprite);\nstatic void SpriteCB_ItemIcon_HideParty(struct Sprite *sprite);\n\nstatic const u32 sItemInfoFrame_Gfx[] = INCBIN_U32(\"graphics/pokemon_storage/item_info_frame.4bpp\");\n\nstatic const struct OamData sOamData_ItemIcon = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x32),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x32),\n    .tileNum = 0x000,\n    .priority = 1,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ItemIcon_Small[] = {\n    AFFINEANIMCMD_FRAME(128, 128, 0, 0),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ItemIcon_Appear[] = {\n    AFFINEANIMCMD_FRAME(88, 88, 0, 0),\n    AFFINEANIMCMD_FRAME(5, 5, 0, 8),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ItemIcon_Disappear[] = {\n    AFFINEANIMCMD_FRAME(128, 128, 0, 0),\n    AFFINEANIMCMD_FRAME(-5, -5, 0, 8),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ItemIcon_PickUp[] = {\n    AFFINEANIMCMD_FRAME(128, 128, 0, 0),\n    AFFINEANIMCMD_FRAME(10, 10, 0, 12),\n    AFFINEANIMCMD_FRAME(256, 256, 0, 0),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ItemIcon_PutDown[] = {\n    AFFINEANIMCMD_FRAME(256, 256, 0, 0),\n    AFFINEANIMCMD_FRAME(-10, -10, 0, 12),\n    AFFINEANIMCMD_FRAME(128, 128, 0, 0),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ItemIcon_PutAway[] = {\n    AFFINEANIMCMD_FRAME(256, 256, 0, 0),\n    AFFINEANIMCMD_FRAME(-5, -5, 0, 16),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_ItemIcon_Large[] = {\n    AFFINEANIMCMD_FRAME(256, 256, 0, 0),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_ItemIcon[] = {\n    [ITEM_ANIM_NONE]      = sAffineAnim_ItemIcon_Small,\n    [ITEM_ANIM_APPEAR]    = sAffineAnim_ItemIcon_Appear,\n    [ITEM_ANIM_DISAPPEAR] = sAffineAnim_ItemIcon_Disappear,\n    [ITEM_ANIM_PICK_UP]   = sAffineAnim_ItemIcon_PickUp,\n    [ITEM_ANIM_PUT_DOWN]  = sAffineAnim_ItemIcon_PutDown,\n    [ITEM_ANIM_PUT_AWAY]  = sAffineAnim_ItemIcon_PutAway,\n    [ITEM_ANIM_LARGE]     = sAffineAnim_ItemIcon_Large,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_ItemIcon = {\n    .tileTag = GFXTAG_ITEM_ICON_0,\n    .paletteTag = PALTAG_ITEM_ICON_0,\n    .oam = &sOamData_ItemIcon,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = sAffineAnims_ItemIcon,\n    .callback = SpriteCallbackDummy,\n};\n\nvoid CreateItemIconSprites(void)\n{\n    s32 i;\n    u8 spriteId;\n    struct CompressedSpriteSheet spriteSheet;\n    struct SpriteTemplate spriteTemplate;\n    static u32 sItemIconGfxBuffer[0x61];\n\n    if (gStorage->boxOption == OPTION_MOVE_ITEMS)\n    {\n        spriteSheet.data = sItemIconGfxBuffer;\n        spriteSheet.size = 0x200;\n        spriteTemplate = sSpriteTemplate_ItemIcon;\n\n        for (i = 0; i < MAX_ITEM_ICONS; i++)\n        {\n            spriteSheet.tag = GFXTAG_ITEM_ICON_0 + i;\n            LoadCompressedSpriteSheet(&spriteSheet);\n            gStorage->itemIcons[i].tiles = GetSpriteTileStartByTag(spriteSheet.tag) * TILE_SIZE_4BPP + (void *)(OBJ_VRAM0);\n            gStorage->itemIcons[i].palIndex = AllocSpritePalette(PALTAG_ITEM_ICON_0 + i);\n            gStorage->itemIcons[i].palIndex = OBJ_PLTT_ID(gStorage->itemIcons[i].palIndex);\n            spriteTemplate.tileTag = GFXTAG_ITEM_ICON_0 + i;\n            spriteTemplate.paletteTag = PALTAG_ITEM_ICON_0 + i;\n            spriteId = CreateSprite(&spriteTemplate, 0, 0, 11);\n            gStorage->itemIcons[i].sprite = &gSprites[spriteId];\n            gStorage->itemIcons[i].sprite->invisible = TRUE;\n            gStorage->itemIcons[i].active = FALSE;\n        }\n    }\n    gStorage->movingItemId = ITEM_NONE;\n}\n\nvoid TryLoadItemIconAtPos(u8 cursorArea, u8 cursorPos)\n{\n    u16 heldItem;\n\n    if ((gStorage->boxOption != OPTION_MOVE_ITEMS) || IsItemIconAtPosition(cursorArea, cursorPos))\n        return;\n\n    switch (cursorArea)\n    {\n    case CURSOR_AREA_IN_BOX:\n        if (!GetCurrentBoxMonData(cursorPos, MON_DATA_SANITY_HAS_SPECIES))\n            return;\n        heldItem = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM);\n        break;\n    case CURSOR_AREA_IN_PARTY:\n        if (!GetMonData(&gPlayerParty[cursorPos], MON_DATA_SANITY_HAS_SPECIES))\n            return;\n        heldItem = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM);\n        break;\n    default:\n        return;\n    }\n\n    if (heldItem != ITEM_NONE)\n    {\n        const u32 *tiles = GetItemIconPic(heldItem);\n        const u32 *pal = GetItemIconPalette(heldItem);\n        u8 id = GetNewItemIconIdx();\n\n        SetItemIconPosition(id, cursorArea, cursorPos);\n        LoadItemIconGfx(id, tiles, pal);\n        SetItemIconAffineAnim(id, ITEM_ANIM_APPEAR);\n        SetItemIconActive(id, TRUE);\n    }\n}\n\nvoid TryHideItemIconAtPos(u8 cursorArea, u8 cursorPos)\n{\n    u8 id;\n\n    if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n        return;\n\n    id = GetItemIconIdxByPosition(cursorArea, cursorPos);\n    SetItemIconAffineAnim(id, ITEM_ANIM_DISAPPEAR);\n    SetItemIconCallback(id, ITEM_CB_WAIT_ANIM, cursorArea, cursorPos);\n}\n\nvoid Item_FromMonToMoving(u8 cursorArea, u8 cursorPos)\n{\n    u8 id;\n    u16 item;\n\n    if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n        return;\n\n    id = GetItemIconIdxByPosition(cursorArea, cursorPos);\n    item = 0;\n    SetItemIconAffineAnim(id, ITEM_ANIM_PICK_UP);\n    SetItemIconCallback(id, ITEM_CB_TO_HAND, cursorArea, cursorPos);\n    SetItemIconPosition(id, CURSOR_AREA_IN_HAND, 0);\n    if (cursorArea  == CURSOR_AREA_IN_BOX)\n    {\n        SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &item);\n        SetBoxMonIconObjMode(cursorPos, ST_OAM_OBJ_BLEND);\n    }\n    else\n    {\n        SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &item);\n        SetPartyMonIconObjMode(cursorPos, ST_OAM_OBJ_BLEND);\n    }\n\n    gStorage->movingItemId = gStorage->displayMonItemId;\n}\n\nvoid InitItemIconInCursor(u16 item)\n{\n    const u32 *tiles = GetItemIconPic(item);\n    const u32 *pal = GetItemIconPalette(item);\n    u8 id = GetNewItemIconIdx();\n\n    LoadItemIconGfx(id, tiles, pal);\n    SetItemIconAffineAnim(id, ITEM_ANIM_LARGE);\n    SetItemIconCallback(id, ITEM_CB_TO_HAND, 0, 0);\n    SetItemIconPosition(id, CURSOR_AREA_IN_HAND, 0);\n    SetItemIconActive(id, TRUE);\n    gStorage->movingItemId = item;\n}\n\nvoid Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos)\n{\n    u8 id;\n    u16 item;\n\n    if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n        return;\n\n    id = GetItemIconIdxByPosition(cursorArea, cursorPos);\n    SetItemIconAffineAnim(id, ITEM_ANIM_PICK_UP);\n    SetItemIconCallback(id, ITEM_CB_SWAP_TO_HAND, CURSOR_AREA_IN_HAND, 0);\n    if (cursorArea == CURSOR_AREA_IN_BOX)\n    {\n        item = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM);\n        SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &gStorage->movingItemId);\n        gStorage->movingItemId = item;\n    }\n    else\n    {\n        item = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM);\n        SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &gStorage->movingItemId);\n        gStorage->movingItemId = item;\n    }\n\n    id = GetItemIconIdxByPosition(2, 0);\n    SetItemIconAffineAnim(id, ITEM_ANIM_PUT_DOWN);\n    SetItemIconCallback(id, ITEM_CB_SWAP_TO_MON, cursorArea, cursorPos);\n}\n\nvoid Item_GiveMovingToMon(u8 cursorArea, u8 cursorPos)\n{\n    u8 id;\n\n    if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n        return;\n\n    id = GetItemIconIdxByPosition(2, 0);\n    SetItemIconAffineAnim(id, ITEM_ANIM_PUT_DOWN);\n    SetItemIconCallback(id, ITEM_CB_TO_MON, cursorArea, cursorPos);\n    if (cursorArea == CURSOR_AREA_IN_BOX)\n    {\n        SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &gStorage->movingItemId);\n        SetBoxMonIconObjMode(cursorPos, ST_OAM_OBJ_NORMAL);\n    }\n    else\n    {\n        SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &gStorage->movingItemId);\n        SetPartyMonIconObjMode(cursorPos, ST_OAM_OBJ_NORMAL);\n    }\n}\n\nvoid Item_TakeMons(u8 cursorArea, u8 cursorPos)\n{\n    u8 id;\n    u16 item;\n\n    if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n        return;\n\n    item = ITEM_NONE;\n    id = GetItemIconIdxByPosition(cursorArea, cursorPos);\n    SetItemIconAffineAnim(id, ITEM_ANIM_DISAPPEAR);\n    SetItemIconCallback(id, ITEM_CB_WAIT_ANIM, cursorArea, cursorPos);\n    if (cursorArea  == CURSOR_AREA_IN_BOX)\n    {\n        SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &item);\n        SetBoxMonIconObjMode(cursorPos, ST_OAM_OBJ_BLEND);\n    }\n    else\n    {\n        SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &item);\n        SetPartyMonIconObjMode(cursorPos, ST_OAM_OBJ_BLEND);\n    }\n}\n\nvoid MoveItemFromCursorToBag(void)\n{\n    if (gStorage->boxOption == OPTION_MOVE_ITEMS)\n    {\n        u8 id = GetItemIconIdxByPosition(CURSOR_AREA_IN_HAND, 0);\n        SetItemIconAffineAnim(id, ITEM_ANIM_PUT_AWAY);\n        SetItemIconCallback(id, ITEM_CB_WAIT_ANIM, 2, 0);\n    }\n}\n\n// The party menu is being closed, if the cursor is on\n// a Pokémon that has a held item make sure it slides\n// up along with the closing menu.\nvoid MoveHeldItemWithPartyMenu(void)\n{\n    s32 i;\n\n    if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n        return;\n\n    for (i = 0; i < MAX_ITEM_ICONS; i++)\n    {\n        if (gStorage->itemIcons[i].active && gStorage->itemIcons[i].cursorArea == CURSOR_AREA_IN_PARTY)\n            SetItemIconCallback(i, ITEM_CB_HIDE_PARTY, 2, 0);\n    }\n}\n\nbool8 IsItemIconAnimActive(void)\n{\n    s32 i;\n\n    for (i = 0; i < MAX_ITEM_ICONS; i++)\n    {\n        if (gStorage->itemIcons[i].active)\n        {\n            if (!gStorage->itemIcons[i].sprite->affineAnimEnded && gStorage->itemIcons[i].sprite->affineAnimBeginning)\n                return TRUE;\n            if (gStorage->itemIcons[i].sprite->callback != SpriteCallbackDummy && gStorage->itemIcons[i].sprite->callback != SpriteCB_ItemIcon_SetPosToCursor)\n                return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nbool8 IsActiveItemMoving(void)\n{\n    s32 i;\n\n    if (gStorage->boxOption == OPTION_MOVE_ITEMS)\n    {\n        for (i = 0; i < MAX_ITEM_ICONS; i++)\n        {\n            if (gStorage->itemIcons[i].active && gStorage->itemIcons[i].cursorArea == CURSOR_AREA_BOX_TITLE)\n                return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nconst u8 *GetMovingItemName(void)\n{\n    return ItemId_GetName(gStorage->movingItemId);\n}\n\nu16 GetMovingItem(void)\n{\n    return gStorage->movingItemId;\n}\n\nstatic u8 GetNewItemIconIdx(void)\n{\n    u8 i;\n\n    for (i = 0; i < MAX_ITEM_ICONS; i++)\n    {\n        if (!gStorage->itemIcons[i].active)\n        {\n            gStorage->itemIcons[i].active = TRUE;\n            return i;\n        }\n    }\n\n    return MAX_ITEM_ICONS;\n}\n\nstatic bool32 IsItemIconAtPosition(u8 cursorArea, u8 cursorPos)\n{\n    s32 i;\n\n    for (i = 0; i < MAX_ITEM_ICONS; i++)\n    {\n        if (gStorage->itemIcons[i].active\n            && gStorage->itemIcons[i].cursorArea == cursorArea\n            && gStorage->itemIcons[i].cursorPos == cursorPos)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic u8 GetItemIconIdxByPosition(u8 cursorArea, u8 cursorPos)\n{\n    u8 i;\n\n    for (i = 0; i < MAX_ITEM_ICONS; i++)\n    {\n        if (gStorage->itemIcons[i].active\n            && gStorage->itemIcons[i].cursorArea == cursorArea\n            && gStorage->itemIcons[i].cursorPos == cursorPos)\n            return i;\n    }\n\n    return MAX_ITEM_ICONS;\n}\n\nstatic u8 GetItemIconIdxBySprite(struct Sprite *sprite)\n{\n    u8 i;\n\n    for (i = 0; i < MAX_ITEM_ICONS; i++)\n    {\n        if (gStorage->itemIcons[i].active\n            && gStorage->itemIcons[i].sprite == sprite)\n            return i;\n    }\n\n    return MAX_ITEM_ICONS;\n}\n\nstatic void SetItemIconPosition(u8 id, u8 cursorArea, u8 cursorPos)\n{\n    u8 row, column;\n\n    if (id >= MAX_ITEM_ICONS)\n        return;\n\n    switch (cursorArea)\n    {\n    case CURSOR_AREA_IN_BOX:\n        row = cursorPos % IN_BOX_COLUMNS;\n        column = cursorPos / IN_BOX_COLUMNS;\n        gStorage->itemIcons[id].sprite->x = (24 * row) + 112;\n        gStorage->itemIcons[id].sprite->y = (24 * column) + 56;\n        gStorage->itemIcons[id].sprite->oam.priority = 2;\n        break;\n    case CURSOR_AREA_IN_PARTY:\n        if (cursorPos == 0)\n        {\n            gStorage->itemIcons[id].sprite->x = 116;\n            gStorage->itemIcons[id].sprite->y = 76;\n        }\n        else\n        {\n            gStorage->itemIcons[id].sprite->x = 164;\n            gStorage->itemIcons[id].sprite->y = 24 * (cursorPos - 1) + 28;\n        }\n        gStorage->itemIcons[id].sprite->oam.priority = 1;\n        break;\n    }\n\n    gStorage->itemIcons[id].cursorArea = cursorArea;\n    gStorage->itemIcons[id].cursorPos = cursorPos;\n}\n\nstatic void LoadItemIconGfx(u8 id, const u32 *itemTiles, const u32 *itemPal)\n{\n    s32 i;\n\n    if (id >= MAX_ITEM_ICONS)\n        return;\n\n    CpuFastFill(0, gStorage->itemIconBuffer, 0x200);\n    LZ77UnCompWram(itemTiles, gStorage->tileBuffer);\n    for (i = 0; i < 3; i++)\n        CpuFastCopy(gStorage->tileBuffer + (i * 0x60), gStorage->itemIconBuffer + (i * 0x80), 0x60);\n\n    CpuFastCopy(gStorage->itemIconBuffer, gStorage->itemIcons[id].tiles, 0x200);\n    LZ77UnCompWram(itemPal, gStorage->itemIconBuffer);\n    LoadPalette(gStorage->itemIconBuffer, gStorage->itemIcons[id].palIndex, PLTT_SIZE_4BPP);\n}\n\nstatic void SetItemIconAffineAnim(u8 id, u8 animNum)\n{\n    if (id >= MAX_ITEM_ICONS)\n        return;\n\n    StartSpriteAffineAnim(gStorage->itemIcons[id].sprite, animNum);\n}\n\n#define sItemIconId data[0]\n#define sState      data[0]\n#define sCursorArea data[6]\n#define sCursorPos  data[7]\n\nstatic void SetItemIconCallback(u8 id, u8 callbackId, u8 cursorArea, u8 cursorPos)\n{\n    if (id >= MAX_ITEM_ICONS)\n        return;\n\n    switch (callbackId)\n    {\n    case ITEM_CB_WAIT_ANIM:\n        gStorage->itemIcons[id].sprite->sItemIconId = id;\n        gStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_WaitAnim;\n        break;\n    case ITEM_CB_TO_HAND:\n        gStorage->itemIcons[id].sprite->sState = 0;\n        gStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_ToHand;\n        break;\n    case ITEM_CB_TO_MON:\n        gStorage->itemIcons[id].sprite->sState = 0;\n        gStorage->itemIcons[id].sprite->sCursorArea = cursorArea;\n        gStorage->itemIcons[id].sprite->sCursorPos = cursorPos;\n        gStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_ToMon;\n        break;\n    case ITEM_CB_SWAP_TO_HAND:\n        gStorage->itemIcons[id].sprite->sState = 0;\n        gStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_SwapToHand;\n        gStorage->itemIcons[id].sprite->sCursorArea = cursorArea;\n        gStorage->itemIcons[id].sprite->sCursorPos = cursorPos;\n        break;\n    case ITEM_CB_SWAP_TO_MON:\n        gStorage->itemIcons[id].sprite->sState = 0;\n        gStorage->itemIcons[id].sprite->sCursorArea = cursorArea;\n        gStorage->itemIcons[id].sprite->sCursorPos = cursorPos;\n        gStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_SwapToMon;\n        break;\n    case ITEM_CB_HIDE_PARTY:\n        // If cursor is on a Pokémon with a held item and\n        // the player closes the party menu, have the held\n        // item follow the Pokémon as the menu slides out\n        gStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_HideParty;\n        break;\n    }\n}\n\nstatic void SetItemIconActive(u8 id, bool8 show)\n{\n    if (id >= MAX_ITEM_ICONS)\n        return;\n\n    gStorage->itemIcons[id].active = show;\n    gStorage->itemIcons[id].sprite->invisible = (show == FALSE);\n}\n\nstatic const u32 *GetItemIconPic(u16 itemId)\n{\n    return GetItemIconGfxPtr(itemId, ITEMICON_TILES);\n}\n\nstatic const u32 *GetItemIconPalette(u16 itemId)\n{\n    return GetItemIconGfxPtr(itemId, ITEMICON_PAL);\n}\n\nvoid PrintItemDescription(void)\n{\n    const u8 *description;\n\n    if (IsActiveItemMoving())\n        description = ItemId_GetDescription(gStorage->movingItemId);\n    else\n        description = ItemId_GetDescription(gStorage->displayMonItemId);\n\n    FillWindowPixelBuffer(2, PIXEL_FILL(1));\n    AddTextPrinterParameterized5(2, FONT_NORMAL, description, 2, 0, 0, NULL, 0, 0);\n}\n\nvoid InitItemInfoWindow(void)\n{\n    gStorage->itemInfoWindowOffset = 25;\n    LoadBgTiles(0, sItemInfoFrame_Gfx, 0x80, 0x1A4);\n    DrawItemInfoWindow(0);\n}\n\nbool8 UpdateItemInfoWindowSlideIn(void)\n{\n    s32 i, pos;\n\n    if (gStorage->itemInfoWindowOffset == 0)\n        return FALSE;\n\n    gStorage->itemInfoWindowOffset--;\n    pos = 25 - gStorage->itemInfoWindowOffset;\n    for (i = 0; i < pos; i++)\n        WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + gStorage->itemInfoWindowOffset + i, i, 12, 1, 8, 15, 25);\n\n    DrawItemInfoWindow(pos);\n    return (gStorage->itemInfoWindowOffset != 0);\n}\n\nbool8 UpdateItemInfoWindowSlideOut(void)\n{\n    s32 i, pos;\n\n    if (gStorage->itemInfoWindowOffset == 25)\n        return FALSE;\n\n    if (gStorage->itemInfoWindowOffset == 0)\n        FillBgTilemapBufferRect(0, 0, 25, 11, 1, 10, 17);\n\n    gStorage->itemInfoWindowOffset++;\n    pos = 25 - gStorage->itemInfoWindowOffset;\n    for (i = 0; i < pos; i++)\n        WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + gStorage->itemInfoWindowOffset + i, i, 12, 1, 8, 15, 25);\n\n    DrawItemInfoWindow(pos);\n\n    FillBgTilemapBufferRect(0, 0, pos, 11, 1, 10, 17);\n    return (gStorage->itemInfoWindowOffset != 25);\n}\n\nstatic void DrawItemInfoWindow(u32 x)\n{\n    if (x != 0)\n    {\n        FillBgTilemapBufferRect(0, 0x1A4, 0, 0xB, x, 1, 15);\n        FillBgTilemapBufferRect(0, 0x9A4, 0, 0x14, x, 1, 15);\n    }\n    FillBgTilemapBufferRect(0, 0x1A5, x, 0xC, 1, 8, 15);\n    FillBgTilemapBufferRect(0, 0x1A6, x, 0xB, 1, 1, 15);\n    FillBgTilemapBufferRect(0, 0x1A7, x, 0x14, 1, 1, 15);\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nstatic void SpriteCB_ItemIcon_WaitAnim(struct Sprite *sprite)\n{\n    if (sprite->affineAnimEnded)\n    {\n        SetItemIconActive(sprite->sItemIconId, FALSE);\n        sprite->callback = SpriteCallbackDummy;\n    }\n}\n\nstatic void SpriteCB_ItemIcon_ToHand(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        sprite->data[1] = sprite->x << 4;\n        sprite->data[2] = sprite->y << 4;\n        sprite->data[3] = 10;\n        sprite->data[4] = 21;\n        sprite->data[5] = 0;\n        sprite->sState++;\n    case 1:\n        sprite->data[1] -= sprite->data[3];\n        sprite->data[2] -= sprite->data[4];\n        sprite->x = sprite->data[1] >> 4;\n        sprite->y = sprite->data[2] >> 4;\n        if (++sprite->data[5] > 11)\n            sprite->callback = SpriteCB_ItemIcon_SetPosToCursor;\n        break;\n    }\n}\n\nstatic void SpriteCB_ItemIcon_SetPosToCursor(struct Sprite *sprite)\n{\n    sprite->x = gStorage->cursorSprite->x + 4;\n    sprite->y = gStorage->cursorSprite->y + gStorage->cursorSprite->y2 + 8;\n    sprite->oam.priority = gStorage->cursorSprite->oam.priority;\n}\n\nstatic void SpriteCB_ItemIcon_ToMon(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        sprite->data[1] = sprite->x << 4;\n        sprite->data[2] = sprite->y << 4;\n        sprite->data[3] = 10;\n        sprite->data[4] = 21;\n        sprite->data[5] = 0;\n        sprite->sState++;\n    case 1:\n        sprite->data[1] += sprite->data[3];\n        sprite->data[2] += sprite->data[4];\n        sprite->x = sprite->data[1] >> 4;\n        sprite->y = sprite->data[2] >> 4;\n        if (++sprite->data[5] > 11)\n        {\n            SetItemIconPosition(GetItemIconIdxBySprite(sprite), sprite->sCursorArea, sprite->sCursorPos);\n            sprite->callback = SpriteCallbackDummy;\n        }\n        break;\n    }\n}\n\nstatic void SpriteCB_ItemIcon_SwapToHand(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        sprite->data[1] = sprite->x << 4;\n        sprite->data[2] = sprite->y << 4;\n        sprite->data[3] = 10;\n        sprite->data[4] = 21;\n        sprite->data[5] = 0;\n        sprite->sState++;\n    case 1:\n        sprite->data[1] -= sprite->data[3];\n        sprite->data[2] -= sprite->data[4];\n        sprite->x = sprite->data[1] >> 4;\n        sprite->y = sprite->data[2] >> 4;\n        sprite->x2 = gSineTable[sprite->data[5] * 8] >> 4;\n        if (++sprite->data[5] > 11)\n        {\n            SetItemIconPosition(GetItemIconIdxBySprite(sprite), sprite->sCursorArea, sprite->sCursorPos);\n            sprite->x2 = 0;\n            sprite->callback = SpriteCB_ItemIcon_SetPosToCursor;\n        }\n        break;\n    }\n}\n\nstatic void SpriteCB_ItemIcon_SwapToMon(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        sprite->data[1] = sprite->x << 4;\n        sprite->data[2] = sprite->y << 4;\n        sprite->data[3] = 10;\n        sprite->data[4] = 21;\n        sprite->data[5] = 0;\n        sprite->sState++;\n    case 1:\n        sprite->data[1] += sprite->data[3];\n        sprite->data[2] += sprite->data[4];\n        sprite->x = sprite->data[1] >> 4;\n        sprite->y = sprite->data[2] >> 4;\n        sprite->x2 = -(gSineTable[sprite->data[5] * 8] >> 4);\n        if (++sprite->data[5] > 11)\n        {\n            SetItemIconPosition(GetItemIconIdxBySprite(sprite), sprite->sCursorArea, sprite->sCursorPos);\n            sprite->callback = SpriteCallbackDummy;\n            sprite->x2 = 0;\n        }\n        break;\n    }\n}\n\nstatic void SpriteCB_ItemIcon_HideParty(struct Sprite *sprite)\n{\n    sprite->y -= 8;\n    if (sprite->y + sprite->y2 < -16)\n    {\n        sprite->callback = SpriteCallbackDummy;\n        SetItemIconActive(GetItemIconIdxBySprite(sprite), FALSE);\n    }\n}\n\n#undef sState\n#undef sItemIconId\n#undef sCursorArea\n#undef sCursorPos\n\n//  Some data transfer utility that goes functionally unused.\n//  It gets initialized with UnkUtil_Init, and run every vblank in Pokémon\n//  Storage with UnkUtil_Run, but neither of the Add functions are ever used,\n//  so UnkUtil_Run performs no actions.\n\nstatic EWRAM_DATA struct UnkUtil *sUnkUtil = NULL;\n\nstatic void UnkUtil_CpuRun(struct UnkUtilData *unkStruct);\nstatic void UnkUtil_DmaRun(struct UnkUtilData *unkStruct);\n\nvoid UnkUtil_Init(struct UnkUtil *util, struct UnkUtilData *data, u32 max)\n{\n    sUnkUtil = util;\n    util->data = data;\n    util->max = max;\n    util->numActive = 0;\n}\n\nvoid UnkUtil_Run(void)\n{\n    u16 i;\n    if (sUnkUtil->numActive)\n    {\n        for (i = 0; i < sUnkUtil->numActive; i++)\n        {\n            struct UnkUtilData *data = &sUnkUtil->data[i];\n            data->func(data);\n        }\n        sUnkUtil->numActive = 0;\n    }\n}\n\n// Unused\nstatic bool8 UnkUtil_CpuAdd(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height, u16 unkArg)\n{\n    struct UnkUtilData *data;\n\n    if (sUnkUtil->numActive >= sUnkUtil->max)\n        return FALSE;\n\n    data = &sUnkUtil->data[sUnkUtil->numActive++];\n    data->size = width * 2;\n    data->dest = dest + 2 * (dTop * 32 + dLeft);\n    data->src = src + 2 * (sTop * unkArg + sLeft);\n    data->height = height;\n    data->unk = unkArg;\n    data->func = UnkUtil_CpuRun;\n    return TRUE;\n}\n\n// Functionally unused\nstatic void UnkUtil_CpuRun(struct UnkUtilData *data)\n{\n    u16 i;\n\n    for (i = 0; i < data->height; i++)\n    {\n        CpuCopy16(data->src, data->dest, data->size);\n        data->dest += 64;\n        data->src += (data->unk * 2);\n    }\n}\n\n// Unused\nstatic bool8 UnkUtil_DmaAdd(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height)\n{\n    struct UnkUtilData *data;\n\n    if (sUnkUtil->numActive >= sUnkUtil->max)\n        return FALSE;\n\n    data = &sUnkUtil->data[sUnkUtil->numActive++];\n    data->size = width * 2;\n    data->dest = dest + ((dTop * 32) + dLeft) * 2;\n    data->height = height;\n    data->func = UnkUtil_DmaRun;\n    return TRUE;\n}\n\n// Functionally unused\nstatic void UnkUtil_DmaRun(struct UnkUtilData *data)\n{\n    u16 i;\n\n    for (i = 0; i < data->height; i++)\n    {\n        Dma3FillLarge_(0, data->dest, data->size, 16);\n        data->dest += 64;\n    }\n}\n"
  },
  {
    "path": "src/pokemon_storage_system_tasks.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"data.h\"\n#include \"decompress.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"event_data.h\"\n#include \"graphics.h\"\n#include \"help_system.h\"\n#include \"item.h\"\n#include \"item_menu.h\"\n#include \"mail_data.h\"\n#include \"menu.h\"\n#include \"naming_screen.h\"\n#include \"new_menu_helpers.h\"\n#include \"pc_screen_effect.h\"\n#include \"pokemon_icon.h\"\n#include \"pokemon_storage_system_internal.h\"\n#include \"pokemon_summary_screen.h\"\n#include \"quest_log.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"text_window.h\"\n#include \"tilemap_util.h\"\n#include \"trig.h\"\n#include \"constants/items.h\"\n#include \"constants/help_system.h\"\n#include \"constants/songs.h\"\n\nEWRAM_DATA struct PokemonStorageSystemData *gStorage = NULL;\nstatic EWRAM_DATA bool8 sInPartyMenu = 0;\nstatic EWRAM_DATA u8 sCurrentBoxOption = 0;\nstatic EWRAM_DATA u8 sDepositBoxId = 0;\nstatic EWRAM_DATA u8 sWhichToReshow = 0;\nstatic EWRAM_DATA u8 sLastUsedBox = 0;\nstatic EWRAM_DATA u16 sMovingItemId = ITEM_NONE;\n\nstatic void Task_InitPokeStorage(u8 taskId);\nstatic void Task_ShowPokeStorage(u8 taskId);\nstatic void Task_ReshowPokeStorage(u8 taskId);\nstatic void Task_PokeStorageMain(u8 taskId);\nstatic void Task_ShowPartyPokemon(u8 taskId);\nstatic void Task_HidePartyPokemon(u8 taskId);\nstatic void Task_OnSelectedMon(u8 taskId);\nstatic void Task_MoveMon(u8 taskId);\nstatic void Task_PlaceMon(u8 taskId);\nstatic void Task_ShiftMon(u8 taskId);\nstatic void Task_WithdrawMon(u8 taskId);\nstatic void Task_DepositMenu(u8 taskId);\nstatic void Task_ReleaseMon(u8 taskId);\nstatic void Task_ShowMarkMenu(u8 taskId);\nstatic void Task_TakeItemForMoving(u8 taskId);\nstatic void Task_GiveMovingItemToMon(u8 taskId);\nstatic void Task_ItemToBag(u8 taskId);\nstatic void Task_SwitchSelectedItem(u8 taskId);\nstatic void Task_ShowItemInfo(u8 taskId);\nstatic void Task_HandleMovingMonFromParty(u8 taskId);\nstatic void Task_PrintCantStoreMail(u8 taskId);\nstatic void Task_HandleBoxOptions(u8 taskId);\nstatic void Task_HandleWallpapers(u8 taskId);\nstatic void Task_JumpBox(u8 taskId);\nstatic void Task_NameBox(u8 taskId);\nstatic void Task_ShowMonSummary(u8 taskId);\nstatic void Task_GiveItemFromBag(u8 taskId);\nstatic void Task_OnCloseBoxPressed(u8 taskId);\nstatic void Task_OnBPressed(u8 taskId);\nstatic void Task_ChangeScreen(u8 taskId);\nstatic void GiveChosenBagItem(void);\nstatic void FreePokeStorageData(void);\nstatic void SetScrollingBackground(void);\nstatic void ScrollBackground(void);\nstatic void LoadPokeStorageMenuGfx(void);\nstatic bool8 InitPokeStorageWindows(void);\nstatic void LoadsMiscSpritePalette(void);\nstatic void InitPalettesAndSprites(void);\nstatic void CreateMarkingComboSprite(void);\nstatic void CreateWaveformSprites(void);\nstatic void RefreshDisplayMonData(void);\nstatic void StartDisplayMonMosaic(void);\nstatic void SpriteCB_DisplayMonMosaic(struct Sprite *sprite);\nstatic bool8 IsDisplayMonMosaicActive(void);\nstatic void CreateDisplayMonSprite(void);\nstatic void LoadDisplayMonGfx(u16 species, u32 personality);\nstatic void PrintDisplayMonInfo(void);\nstatic void UpdateWaveformAnimation(void);\nstatic void InitSupplementalTilemaps(void);\nstatic void SetUpHidePartyMenu(void);\nstatic bool8 HidePartyMenu(void);\nstatic void UpdateCloseBoxButtonTilemap(bool8 normal);\nstatic void StartFlashingCloseBoxButton(void);\nstatic void StopFlashingCloseBoxButton(void);\nstatic void UpdateCloseBoxButtonFlash(void);\nstatic void SetPartySlotTilemaps(void);\nstatic void SetPartySlotTilemap(u8 pos, bool8 isPartyMon);\nstatic void UpdatePartySlotColors(void);\nstatic void SetUpDoShowPartyMenu(void);\nstatic bool8 DoShowPartyMenu(void);\nstatic void InitPokeStorageBg0(void);\nstatic void PrintStorageMessage(u8 textId);\nstatic void ShowYesNoWindow(s8 cursorPos);\nstatic void ClearBottomWindow(void);\nstatic void AddWallpaperSetsMenu(void);\nstatic void AddWallpapersMenu(u8 wallpaperSet);\nstatic void InitCursorItemIcon(void);\nstatic void SetPokeStorageQuestLogEvent(u8 species);\nstatic void UpdateBoxToSendMons(void);\n\nenum {\n    TILEMAP_PKMN_DATA, // The \"Pkmn Data\" text at the top of the display\n    TILEMAP_PARTY_MENU,\n    TILEMAP_CLOSE_BUTTON,\n    TILEMAP_COUNT\n};\n\nenum\n{\n    SCREEN_CHANGE_EXIT_BOX,\n    SCREEN_CHANGE_SUMMARY_SCREEN,\n    SCREEN_CHANGE_NAME_BOX,\n    SCREEN_CHANGE_ITEM_FROM_BAG,\n};\n\nenum\n{\n    MSG_EXIT_BOX,\n    MSG_WHAT_YOU_DO,\n    MSG_PICK_A_THEME,\n    MSG_PICK_A_WALLPAPER,\n    MSG_IS_SELECTED,\n    MSG_JUMP_TO_WHICH_BOX,\n    MSG_DEPOSIT_IN_WHICH_BOX,\n    MSG_WAS_DEPOSITED,\n    MSG_BOX_IS_FULL,\n    MSG_RELEASE_POKE,\n    MSG_WAS_RELEASED,\n    MSG_BYE_BYE,\n    MSG_MARK_POKE,\n    MSG_LAST_POKE,\n    MSG_PARTY_FULL,\n    MSG_HOLDING_POKE,\n    MSG_WHICH_ONE_WILL_TAKE,\n    MSG_CANT_RELEASE_EGG,\n    MSG_CONTINUE_BOX,\n    MSG_CAME_BACK,\n    MSG_WORRIED,\n    MSG_SURPRISE,\n    MSG_PLEASE_REMOVE_MAIL,\n    MSG_IS_SELECTED2,\n    MSG_GIVE_TO_MON,\n    MSG_PLACED_IN_BAG,\n    MSG_BAG_FULL,\n    MSG_PUT_IN_BAG,\n    MSG_ITEM_IS_HELD,\n    MSG_CHANGED_TO_ITEM,\n    MSG_CANT_STORE_MAIL,\n};\n\nenum\n{\n    MSG_FMT_NONE,\n    MSG_FMT_MON_NAME_1,\n    MSG_FMT_MON_NAME_2,\n    MSG_FMT_MON_NAME_3,\n    MSG_FMT_RELEASE_MON_1,\n    MSG_FMT_RELEASE_MON_2,\n    MSG_FMT_RELEASE_MON_3,\n    MSG_FMT_ITEM_NAME,\n};\n\nstatic const u32 sScrollingBg_Gfx[]     = INCBIN_U32(\"graphics/pokemon_storage/scrolling_bg.4bpp.lz\");\nstatic const u32 sScrollingBg_Tilemap[] = INCBIN_U32(\"graphics/pokemon_storage/scrolling_bg.bin.lz\");\n\n// Unused\nstatic const u16 sMenu_Pal[] = INCBIN_U16(\"graphics/pokemon_storage/menu.gbapal\");\n\nstatic const u32 sMenu_Tilemap[]             = INCBIN_U32(\"graphics/pokemon_storage/menu.bin.lz\");\nstatic const u16 sPkmnData_Tilemap[]         = INCBIN_U16(\"graphics/pokemon_storage/pkmn_data.bin\");\nstatic const u16 sScrollingBg_Pal[]          = INCBIN_U16(\"graphics/pokemon_storage/scrolling_bg.gbapal\");\nstatic const u16 sScrollingBgMoveItems_Pal[] = INCBIN_U16(\"graphics/pokemon_storage/scrolling_bg_move_items.gbapal\");\nstatic const u16 sCloseBoxButton_Tilemap[]   = INCBIN_U16(\"graphics/pokemon_storage/close_box_button.bin\");\nstatic const u16 sPartySlotFilled_Tilemap[]  = INCBIN_U16(\"graphics/pokemon_storage/party_slot_filled.bin\");\nstatic const u16 sPartySlotEmpty_Tilemap[]   = INCBIN_U16(\"graphics/pokemon_storage/party_slot_empty.bin\");\nstatic const u16 sPokeStorageMisc2Pal[]      = INCBIN_U16(\"graphics/pokemon_storage/misc2.gbapal\");\nstatic const u16 sWaveform_Gfx[]             = INCBIN_U16(\"graphics/pokemon_storage/waveform.4bpp\");\n\n// Unused\nstatic const u16 sUnused_Pal[] = INCBIN_U16(\"graphics/pokemon_storage/unused.gbapal\");\n\nstatic const u16 sItemInfoFrame_Pal[] = INCBIN_U16(\"graphics/pokemon_storage/item_info_frame.gbapal\");\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 1,\n        .tilemapLeft = 0,\n        .tilemapTop = 11,\n        .width = 9,\n        .height = 7,\n        .paletteNum = 3,\n        .baseBlock = 0x0c0\n    }, {\n        .bg = 0,\n        .tilemapLeft = 11,\n        .tilemapTop = 17,\n        .width = 18,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x014\n    }, {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 12,\n        .width = 25,\n        .height = 8,\n        .paletteNum = 15,\n        .baseBlock = 0x014\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x100\n    }, {\n        .bg = 2,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 27,\n        .screenSize = 1,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000\n    }, {\n        .bg = 3,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct SpritePalette sMiscSpritePalette = {\n    sPokeStorageMisc2Pal, PALTAG_MISC_2\n};\n\nstatic const struct SpriteSheet sWaveformSpriteSheet = {\n    sWaveform_Gfx, 0x01C0, GFXTAG_WAVEFORM\n};\n\nstatic const struct OamData sOamData_DisplayMon;\n\nstatic const struct SpriteTemplate sSpriteTemplate_DisplayMon = {\n    .tileTag = GFXTAG_DISPLAY_MON,\n    .paletteTag = PALTAG_DISPLAY_MON,\n    .oam = &sOamData_DisplayMon,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct StorageMessage sMessages[] = {\n    [MSG_EXIT_BOX]             = {gText_ExitFromBox,             MSG_FMT_NONE},\n    [MSG_WHAT_YOU_DO]          = {gText_WhatDoYouWantToDo,       MSG_FMT_NONE},\n    [MSG_PICK_A_THEME]         = {gText_PleasePickATheme,        MSG_FMT_NONE},\n    [MSG_PICK_A_WALLPAPER]     = {gText_PickTheWallpaper,        MSG_FMT_NONE},\n    [MSG_IS_SELECTED]          = {gText_PkmnIsSelected,          MSG_FMT_MON_NAME_1},\n    [MSG_JUMP_TO_WHICH_BOX]    = {gText_JumpToWhichBox,          MSG_FMT_NONE},\n    [MSG_DEPOSIT_IN_WHICH_BOX] = {gText_DepositInWhichBox,       MSG_FMT_NONE},\n    [MSG_WAS_DEPOSITED]        = {gText_PkmnWasDeposited,        MSG_FMT_MON_NAME_1},\n    [MSG_BOX_IS_FULL]          = {gText_BoxIsFull2,              MSG_FMT_NONE},\n    [MSG_RELEASE_POKE]         = {gText_ReleaseThisPokemon,      MSG_FMT_NONE},\n    [MSG_WAS_RELEASED]         = {gText_PkmnWasReleased,         MSG_FMT_RELEASE_MON_1},\n    [MSG_BYE_BYE]              = {gText_ByeByePkmn,              MSG_FMT_RELEASE_MON_3},\n    [MSG_MARK_POKE]            = {gText_MarkYourPkmn,            MSG_FMT_NONE},\n    [MSG_LAST_POKE]            = {gText_ThatsYourLastPkmn,       MSG_FMT_NONE},\n    [MSG_PARTY_FULL]           = {gText_YourPartysFull,          MSG_FMT_NONE},\n    [MSG_HOLDING_POKE]         = {gText_YoureHoldingAPkmn,       MSG_FMT_NONE},\n    [MSG_WHICH_ONE_WILL_TAKE]  = {gText_WhichOneWillYouTake,     MSG_FMT_NONE},\n    [MSG_CANT_RELEASE_EGG]     = {gText_YouCantReleaseAnEgg,     MSG_FMT_NONE},\n    [MSG_CONTINUE_BOX]         = {gText_ContinueBoxOperations,   MSG_FMT_NONE},\n    [MSG_CAME_BACK]            = {gText_PkmnCameBack,            MSG_FMT_MON_NAME_1},\n    [MSG_WORRIED]              = {gText_WasItWorriedAboutYou,    MSG_FMT_NONE},\n    [MSG_SURPRISE]             = {gText_FourEllipsesExclamation, MSG_FMT_NONE},\n    [MSG_PLEASE_REMOVE_MAIL]   = {gText_PleaseRemoveTheMail,     MSG_FMT_NONE},\n    [MSG_IS_SELECTED2]         = {gText_PkmnIsSelected,          MSG_FMT_ITEM_NAME},\n    [MSG_GIVE_TO_MON]          = {gText_GiveToAPkmn,             MSG_FMT_NONE},\n    [MSG_PLACED_IN_BAG]        = {gText_PlacedItemInBag,         MSG_FMT_ITEM_NAME},\n    [MSG_BAG_FULL]             = {gText_BagIsFull2,              MSG_FMT_NONE},\n    [MSG_PUT_IN_BAG]           = {gText_PutItemInBag,            MSG_FMT_NONE},\n    [MSG_ITEM_IS_HELD]         = {gText_ItemIsNowHeld,           MSG_FMT_ITEM_NAME},\n    [MSG_CHANGED_TO_ITEM]      = {gText_ChangedToNewItem,        MSG_FMT_ITEM_NAME},\n    [MSG_CANT_STORE_MAIL]      = {gText_MailCantBeStored,        MSG_FMT_NONE},\n};\n\nstatic const struct WindowTemplate sYesNoWindowTemplate = {\n    .bg = 0,\n    .tilemapLeft = 24,\n    .tilemapTop = 11,\n    .width = 5,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x05c\n};\n\nstatic const struct OamData sOamData_DisplayMon = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x64),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x64),\n    .tileNum = 0x000,\n    .priority = 0,\n    .paletteNum = 0\n};\n\n// Waveform\n\nstatic const struct OamData sOamData_Waveform = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x8),\n    .tileNum = 0x000,\n    .priority = 0,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sAnim_Waveform_LeftOff[] = {\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Waveform_LeftOn[] = {\n    ANIMCMD_FRAME(2, 8),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(6, 8),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_Waveform_RightOff[] = {\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Waveform_RightOn[] = {\n    ANIMCMD_FRAME(10, 8),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(12, 8),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_Waveform[] = {\n    sAnim_Waveform_LeftOff,\n    sAnim_Waveform_LeftOn,\n    sAnim_Waveform_RightOff,\n    sAnim_Waveform_RightOn\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Waveform = {\n    .tileTag = GFXTAG_WAVEFORM,\n    .paletteTag = PALTAG_MISC_2,\n    .oam = &sOamData_Waveform,\n    .anims = sAnims_Waveform,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic void VBlankCB_PokeStorage(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    UnkUtil_Run();\n    TransferPlttBuffer();\n    SetGpuReg(REG_OFFSET_BG2HOFS, gStorage->bg2_X);\n}\n\nstatic void CB2_PokeStorage(void)\n{\n    RunTasks();\n    DoScheduledBgTilemapCopiesToVram();\n    ScrollBackground();\n    UpdateCloseBoxButtonFlash();\n    AnimateSprites();\n    BuildOamBuffer();\n}\n\nvoid EnterPokeStorage(u8 boxOption)\n{\n    ResetTasks();\n    sCurrentBoxOption = boxOption;\n    gStorage = Alloc(sizeof(struct PokemonStorageSystemData));\n    if (gStorage == NULL)\n        SetMainCallback2(CB2_ExitPokeStorage);\n    else\n    {\n        gStorage->boxOption = boxOption;\n        gStorage->isReopening = FALSE;\n        sMovingItemId = 0;\n        gStorage->state = 0;\n        gStorage->taskId = CreateTask(Task_InitPokeStorage, 3);\n        SetHelpContext(HELPCONTEXT_BILLS_PC);\n        sLastUsedBox = StorageGetCurrentBox();\n        SetMainCallback2(CB2_PokeStorage);\n    }\n}\n\nvoid CB2_ReturnToPokeStorage(void)\n{\n    ResetTasks();\n    gStorage = Alloc(sizeof(struct PokemonStorageSystemData));\n    if (gStorage == NULL)\n        SetMainCallback2(CB2_ExitPokeStorage);\n    else\n    {\n        gStorage->boxOption = sCurrentBoxOption;\n        gStorage->isReopening = TRUE;\n        gStorage->state = 0;\n        gStorage->taskId = CreateTask(Task_InitPokeStorage, 3);\n        SetHelpContext(HELPCONTEXT_BILLS_PC);\n        SetMainCallback2(CB2_PokeStorage);\n    }\n}\n\nstatic void ResetAllBgCoords(void)\n{\n    SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG2HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG3HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG3VOFS, 0);\n}\n\nstatic void ResetForPokeStorage(void)\n{\n    ResetPaletteFade();\n    ResetSpriteData();\n    FreeSpriteTileRanges();\n    FreeAllSpritePalettes();\n    ClearDma3Requests();\n    gReservedSpriteTileCount = 0x280;\n    UnkUtil_Init(&gStorage->unkUtil, gStorage->unkUtilData, ARRAY_COUNT(gStorage->unkUtilData));\n    gKeyRepeatStartDelay = 20;\n    ClearScheduledBgCopiesToVram();\n    TilemapUtil_Init(TILEMAP_COUNT);\n    TilemapUtil_SetTilemap(TILEMAP_PKMN_DATA, 1, sPkmnData_Tilemap, 8, 4);\n    TilemapUtil_SetPos(TILEMAP_PKMN_DATA, 1, 0);\n    gStorage->closeBoxFlashing = FALSE;\n}\n\nstatic void InitStartingPosData(void)\n{\n    ClearSavedCursorPos();\n    sInPartyMenu = gStorage->boxOption == OPTION_DEPOSIT;\n    sDepositBoxId = 0;\n}\n\nstatic void SetMonIconTransparency(void)\n{\n    if (gStorage->boxOption == OPTION_MOVE_ITEMS)\n    {\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL);\n        SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(7, 11));\n    }\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP);\n}\n\nstatic void SetPokeStorageTask(TaskFunc newFunc)\n{\n    gTasks[gStorage->taskId].func = newFunc;\n    gStorage->state = 0;\n}\n\nstatic void Task_InitPokeStorage(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        SetVBlankCallback(NULL);\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        ResetForPokeStorage();\n        if (gStorage->isReopening)\n        {\n            switch (sWhichToReshow)\n            {\n            case SCREEN_CHANGE_NAME_BOX - 1:\n                LoadSavedMovingMon();\n                break;\n            case SCREEN_CHANGE_SUMMARY_SCREEN - 1:\n                SetSelectionAfterSummaryScreen();\n                break;\n            case SCREEN_CHANGE_ITEM_FROM_BAG - 1:\n                GiveChosenBagItem();\n                break;\n            }\n        }\n        LoadPokeStorageMenuGfx();\n        LoadsMiscSpritePalette();\n        break;\n    case 1:\n        if (!InitPokeStorageWindows())\n        {\n            SetPokeStorageTask(Task_ChangeScreen);\n            return;\n        }\n        break;\n    case 2:\n        PutWindowTilemap(0);\n        ClearWindowTilemap(1);\n        CpuFill32(0, (void *)VRAM, 0x200);\n        LoadUserWindowGfx(1, 0xB, BG_PLTT_ID(14));\n        break;\n    case 3:\n        ResetAllBgCoords();\n        if (!gStorage->isReopening)\n            InitStartingPosData();\n        break;\n    case 4:\n        InitMonIconFields();\n        if (!gStorage->isReopening)\n            InitCursor();\n        else\n            InitCursorOnReopen();\n        break;\n    case 5:\n        if (!MultiMove_Init())\n        {\n            SetPokeStorageTask(Task_ChangeScreen);\n            return;\n        }\n        else\n        {\n            SetScrollingBackground();\n            InitPokeStorageBg0();\n        }\n        break;\n    case 6:\n        InitPalettesAndSprites();\n        break;\n    case 7:\n        InitSupplementalTilemaps();\n        break;\n    case 8:\n        CreateInitBoxTask(StorageGetCurrentBox());\n        break;\n    case 9:\n        if (IsInitBoxActive())\n            return;\n\n        if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n        {\n            gStorage->markMenu.baseTileTag = GFXTAG_MARKING_MENU;\n            gStorage->markMenu.basePaletteTag = PALTAG_MARKING_MENU;\n            InitMonMarkingsMenu(&gStorage->markMenu);\n            BufferMonMarkingsMenuTiles();\n        }\n        else\n        {\n            CreateItemIconSprites();\n            InitCursorItemIcon();\n        }\n        break;\n    case 10:\n        SetMonIconTransparency();\n        if (!gStorage->isReopening)\n        {\n            BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n            SetPokeStorageTask(Task_ShowPokeStorage);\n        }\n        else\n        {\n            BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n            SetPokeStorageTask(Task_ReshowPokeStorage);\n        }\n        SetVBlankCallback(VBlankCB_PokeStorage);\n        return;\n    default:\n        return;\n    }\n\n    gStorage->state++;\n}\n\nstatic void Task_ShowPokeStorage(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        PlaySE(SE_PC_LOGIN);\n        BeginPCScreenEffect_TurnOn(20, 0, 1);\n        gStorage->state++;\n        break;\n    case 1:\n        if (!IsPCScreenEffectRunning_TurnOn())\n            SetPokeStorageTask(Task_PokeStorageMain);\n        break;\n    }\n}\n\nstatic void Task_ReshowPokeStorage(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 0x10, 0, RGB_BLACK);\n        gStorage->state++;\n        break;\n    case 1:\n        if (!UpdatePaletteFade())\n            SetPokeStorageTask(Task_PokeStorageMain);\n        break;\n    }\n}\n\nstatic void Task_PokeStorageMain(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        switch (HandleInput())\n        {\n        case INPUT_MOVE_CURSOR:\n            PlaySE(SE_SELECT);\n            gStorage->state = 1;\n            break;\n        case INPUT_SHOW_PARTY:\n            if (gStorage->boxOption != OPTION_MOVE_MONS && gStorage->boxOption != OPTION_MOVE_ITEMS)\n            {\n                PrintStorageMessage(MSG_WHICH_ONE_WILL_TAKE);\n                gStorage->state = 3;\n            }\n            else\n            {\n                ClearSavedCursorPos();\n                SetPokeStorageTask(Task_ShowPartyPokemon);\n            }\n            break;\n        case INPUT_HIDE_PARTY:\n            if (gStorage->boxOption == OPTION_MOVE_MONS)\n            {\n                if (IsMonBeingMoved() && ItemIsMail(gStorage->displayMonItemId))\n                    gStorage->state = 5;\n                else\n                    SetPokeStorageTask(Task_HidePartyPokemon);\n            }\n            else if (gStorage->boxOption == OPTION_MOVE_ITEMS)\n                SetPokeStorageTask(Task_HidePartyPokemon);\n            break;\n        case INPUT_CLOSE_BOX:\n            SetPokeStorageTask(Task_OnCloseBoxPressed);\n            break;\n        case INPUT_PRESSED_B:\n            SetPokeStorageTask(Task_OnBPressed);\n            break;\n        case INPUT_BOX_OPTIONS:\n            PlaySE(SE_SELECT);\n            SetPokeStorageTask(Task_HandleBoxOptions);\n            break;\n        case INPUT_IN_MENU:\n            SetPokeStorageTask(Task_OnSelectedMon);\n            break;\n        case INPUT_SCROLL_RIGHT:\n            PlaySE(SE_SELECT);\n            gStorage->newCurrBoxId = StorageGetCurrentBox() + 1;\n            if (gStorage->newCurrBoxId >= TOTAL_BOXES_COUNT)\n                gStorage->newCurrBoxId = 0;\n            if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n            {\n                SetUpScrollToBox(gStorage->newCurrBoxId);\n                gStorage->state = 2;\n            }\n            else\n            {\n                TryHideItemAtCursor();\n                gStorage->state = 10;\n            }\n            break;\n        case INPUT_SCROLL_LEFT:\n            PlaySE(SE_SELECT);\n            gStorage->newCurrBoxId = StorageGetCurrentBox() - 1;\n            if (gStorage->newCurrBoxId < 0)\n                gStorage->newCurrBoxId = TOTAL_BOXES_COUNT - 1;\n            if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n            {\n                SetUpScrollToBox(gStorage->newCurrBoxId);\n                gStorage->state = 2;\n            }\n            else\n            {\n                TryHideItemAtCursor();\n                gStorage->state = 10;\n            }\n            break;\n        case INPUT_DEPOSIT:\n            if (!CanMovePartyMon())\n            {\n                if (ItemIsMail(gStorage->displayMonItemId))\n                    gStorage->state = 5;\n                else\n                {\n                    PlaySE(SE_SELECT);\n                    SetPokeStorageTask(Task_DepositMenu);\n                }\n            }\n            else\n                gStorage->state = 4;\n            break;\n        case INPUT_MOVE_MON:\n            if (CanMovePartyMon())\n                gStorage->state = 4;\n\n            else\n            {\n                PlaySE(SE_SELECT);\n                SetPokeStorageTask(Task_MoveMon);\n            }\n            break;\n        case INPUT_SHIFT_MON:\n            if (!CanShiftMon())\n                gStorage->state = 4;\n            else\n            {\n                PlaySE(SE_SELECT);\n                SetPokeStorageTask(Task_ShiftMon);\n            }\n            break;\n        case INPUT_WITHDRAW:\n            PlaySE(SE_SELECT);\n            SetPokeStorageTask(Task_WithdrawMon);\n            break;\n        case INPUT_PLACE_MON:\n            PlaySE(SE_SELECT);\n            SetPokeStorageTask(Task_PlaceMon);\n            break;\n        case INPUT_TAKE_ITEM:\n            PlaySE(SE_SELECT);\n            SetPokeStorageTask(Task_TakeItemForMoving);\n            break;\n        case INPUT_GIVE_ITEM:\n            PlaySE(SE_SELECT);\n            SetPokeStorageTask(Task_GiveMovingItemToMon);\n            break;\n        case INPUT_SWITCH_ITEMS:\n            PlaySE(SE_SELECT);\n            SetPokeStorageTask(Task_SwitchSelectedItem);\n            break;\n        case INPUT_MULTIMOVE_START:\n            PlaySE(SE_SELECT);\n            MultiMove_SetFunction(MULTIMOVE_START);\n            gStorage->state = 7;\n            break;\n        case INPUT_MULTIMOVE_SINGLE:\n            MultiMove_SetFunction(MULTIMOVE_SINGLE);\n            gStorage->state = 8;\n            break;\n        case INPUT_MULTIMOVE_CHANGE_SELECTION:\n            PlaySE(SE_SELECT);\n            MultiMove_SetFunction(MULTIMOVE_CHANGE_SELECTION);\n            gStorage->state = 9;\n            break;\n        case INPUT_MULTIMOVE_GRAB_SELECTION:\n            MultiMove_SetFunction(MULTIMOVE_GRAB_SELECTION);\n            gStorage->state = 7;\n            break;\n        case INPUT_MULTIMOVE_MOVE_MONS:\n            PlaySE(SE_SELECT);\n            MultiMove_SetFunction(MULTIMOVE_MOVE_MONS);\n            gStorage->state = 9;\n            break;\n        case INPUT_MULTIMOVE_PLACE_MONS:\n            PlaySE(SE_SELECT);\n            SetPokeStorageQuestLogEvent(3);\n            MultiMove_SetFunction(MULTIMOVE_PLACE_MONS);\n            gStorage->state = 7;\n            break;\n        case INPUT_MULTIMOVE_UNABLE:\n            PlaySE(SE_FAILURE);\n            break;\n        }\n        break;\n    case 1:\n        if (!UpdateCursorPos())\n        {\n            if (IsCursorOnCloseBox())\n                StartFlashingCloseBoxButton();\n            else\n                StopFlashingCloseBoxButton();\n\n            if (gStorage->setMosaic)\n                StartDisplayMonMosaic();\n            gStorage->state = 0;\n        }\n        break;\n    case 2:\n        if (!ScrollToBox())\n        {\n            SetCurrentBox(gStorage->newCurrBoxId);\n            if (!sInPartyMenu && !IsMonBeingMoved())\n            {\n                DoTrySetDisplayMonData();\n                StartDisplayMonMosaic();\n            }\n\n            if (gStorage->boxOption == OPTION_MOVE_ITEMS)\n            {\n                TryShowItemAtCursor();\n                gStorage->state = 11;\n            }\n            else\n                gStorage->state = 0;\n        }\n        break;\n    case 3:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            gStorage->state = 0;\n        }\n        break;\n    case 4:\n        PlaySE(SE_FAILURE);\n        PrintStorageMessage(MSG_LAST_POKE);\n        gStorage->state = 6;\n        break;\n    case 5:\n        PlaySE(SE_FAILURE);\n        PrintStorageMessage(MSG_PLEASE_REMOVE_MAIL);\n        gStorage->state = 6;\n        break;\n    case 6:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    case 7:\n        if (!MultiMove_RunFunction())\n            gStorage->state = 0;\n        break;\n    case 8:\n        if (!MultiMove_RunFunction())\n            SetPokeStorageTask(Task_MoveMon);\n        break;\n    case 9:\n        if (!MultiMove_RunFunction())\n        {\n            if (gStorage->setMosaic)\n                StartDisplayMonMosaic();\n            gStorage->state = 0;\n        }\n        break;\n    case 10:\n        if (!IsItemIconAnimActive())\n        {\n            SetUpScrollToBox(gStorage->newCurrBoxId);\n            gStorage->state = 2;\n        }\n        break;\n    case 11:\n        if (!IsItemIconAnimActive())\n            gStorage->state = 0;\n        break;\n    }\n}\n\nstatic void Task_ShowPartyPokemon(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        SetUpDoShowPartyMenu();\n        gStorage->state++;\n        break;\n    case 1:\n        if (!DoShowPartyMenu())\n            SetPokeStorageTask(Task_PokeStorageMain);\n        break;\n    }\n}\n\nstatic void Task_HidePartyPokemon(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        PlaySE(SE_SELECT);\n        SetUpHidePartyMenu();\n        gStorage->state++;\n        break;\n    case 1:\n        if (!HidePartyMenu())\n        {\n            SetCursorBoxPosition(GetSavedCursorPos());\n            gStorage->state++;\n        }\n        break;\n    case 2:\n        if (!UpdateCursorPos())\n        {\n            if (gStorage->setMosaic)\n                StartDisplayMonMosaic();\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    }\n}\n\nstatic void Task_OnSelectedMon(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        if (!IsDisplayMonMosaicActive())\n        {\n            PlaySE(SE_SELECT);\n            if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n                PrintStorageMessage(MSG_IS_SELECTED);\n            else if (IsActiveItemMoving() || gStorage->displayMonItemId != 0)\n                PrintStorageMessage(MSG_IS_SELECTED2);\n            else\n                PrintStorageMessage(MSG_GIVE_TO_MON);\n\n            AddMenu();\n            gStorage->state = 1;\n        }\n        break;\n    case 1:\n        if (!IsMenuLoading())\n            gStorage->state = 2;\n        break;\n    case 2:\n        switch (HandleMenuInput())\n        {\n        case MENU_B_PRESSED:\n        case MENU_TEXT_CANCEL:\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n            break;\n        case MENU_TEXT_MOVE:\n            if (CanMovePartyMon())\n                gStorage->state = 3;\n            else\n            {\n                PlaySE(SE_SELECT);\n                ClearBottomWindow();\n                SetPokeStorageTask(Task_MoveMon);\n            }\n            break;\n        case MENU_TEXT_PLACE:\n            PlaySE(SE_SELECT);\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PlaceMon);\n            break;\n        case MENU_TEXT_SHIFT:\n            if (!CanShiftMon())\n                gStorage->state = 3;\n            else\n            {\n                PlaySE(SE_SELECT);\n                ClearBottomWindow();\n                SetPokeStorageTask(Task_ShiftMon);\n            }\n            break;\n        case MENU_TEXT_WITHDRAW:\n            PlaySE(SE_SELECT);\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_WithdrawMon);\n            break;\n        case MENU_TEXT_STORE:\n            if (CanMovePartyMon())\n                gStorage->state = 3;\n            else if (ItemIsMail(gStorage->displayMonItemId))\n                gStorage->state = 4;\n            else\n            {\n                PlaySE(SE_SELECT);\n                ClearBottomWindow();\n                SetPokeStorageTask(Task_DepositMenu);\n            }\n            break;\n        case MENU_TEXT_RELEASE:\n            if (CanMovePartyMon())\n                gStorage->state = 3;\n            else if (gStorage->displayMonIsEgg)\n                gStorage->state = 5;\n            else if (ItemIsMail(gStorage->displayMonItemId))\n                gStorage->state = 4;\n            else\n            {\n                PlaySE(SE_SELECT);\n                SetPokeStorageTask(Task_ReleaseMon);\n            }\n            break;\n        case MENU_TEXT_SUMMARY:\n            PlaySE(SE_SELECT);\n            SetPokeStorageTask(Task_ShowMonSummary);\n            break;\n        case MENU_TEXT_MARK:\n            PlaySE(SE_SELECT);\n            SetPokeStorageTask(Task_ShowMarkMenu);\n            break;\n        case MENU_TEXT_TAKE:\n            PlaySE(SE_SELECT);\n            SetPokeStorageTask(Task_TakeItemForMoving);\n            break;\n        case MENU_TEXT_GIVE:\n            PlaySE(SE_SELECT);\n            SetPokeStorageTask(Task_GiveMovingItemToMon);\n            break;\n        case MENU_TEXT_BAG:\n            SetPokeStorageTask(Task_ItemToBag);\n            break;\n        case MENU_TEXT_SWITCH:\n            SetPokeStorageTask(Task_SwitchSelectedItem);\n            break;\n        case MENU_TEXT_GIVE2:\n            SetPokeStorageTask(Task_GiveItemFromBag);\n            break;\n        case MENU_TEXT_INFO:\n            SetPokeStorageTask(Task_ShowItemInfo);\n            break;\n        }\n        break;\n    case 3:\n        PlaySE(SE_FAILURE);\n        PrintStorageMessage(MSG_LAST_POKE);\n        gStorage->state = 6;\n        break;\n    case 5:\n        PlaySE(SE_FAILURE);\n        PrintStorageMessage(MSG_CANT_RELEASE_EGG);\n        gStorage->state = 6;\n        break;\n    case 4:\n        PlaySE(SE_FAILURE);\n        PrintStorageMessage(MSG_PLEASE_REMOVE_MAIL);\n        gStorage->state = 6;\n        break;\n    case 6:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    }\n}\n\nstatic void Task_MoveMon(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        InitMonPlaceChange(CHANGE_GRAB);\n        gStorage->state++;\n        break;\n    case 1:\n        if (!DoMonPlaceChange())\n        {\n            if (sInPartyMenu)\n                SetPokeStorageTask(Task_HandleMovingMonFromParty);\n            else\n                SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    }\n}\n\nstatic void Task_PlaceMon(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        SetPokeStorageQuestLogEvent(1);\n        InitMonPlaceChange(CHANGE_PLACE);\n        gStorage->state++;\n        break;\n    case 1:\n        if (!DoMonPlaceChange())\n        {\n            if (sInPartyMenu)\n                SetPokeStorageTask(Task_HandleMovingMonFromParty);\n            else\n                SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    }\n}\n\nstatic void Task_ShiftMon(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        SetPokeStorageQuestLogEvent(0);\n        InitMonPlaceChange(CHANGE_SHIFT);\n        gStorage->state++;\n        break;\n    case 1:\n        if (!DoMonPlaceChange())\n        {\n            StartDisplayMonMosaic();\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    }\n}\n\nstatic void Task_WithdrawMon(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        if (CalculatePlayerPartyCount() == PARTY_SIZE)\n        {\n            PrintStorageMessage(MSG_PARTY_FULL);\n            gStorage->state = 1;\n        }\n        else\n        {\n            SaveCursorPos();\n            InitMonPlaceChange(CHANGE_GRAB);\n            gStorage->state = 2;\n        }\n        break;\n    case 1:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    case 2:\n        if (!DoMonPlaceChange())\n        {\n            SetMovingMonPriority(1);\n            SetUpDoShowPartyMenu();\n            gStorage->state++;\n        }\n        break;\n    case 3:\n        if (!DoShowPartyMenu())\n        {\n            SetPokeStorageQuestLogEvent(1);\n            InitMonPlaceChange(CHANGE_PLACE);\n            gStorage->state++;\n        }\n        break;\n    case 4:\n        if (!DoMonPlaceChange())\n        {\n            UpdatePartySlotColors();\n            gStorage->state++;\n        }\n        break;\n    case 5:\n        SetPokeStorageTask(Task_HidePartyPokemon);\n        break;\n    }\n}\n\nstatic void Task_DepositMenu(u8 taskId)\n{\n    u8 boxId;\n\n    switch (gStorage->state)\n    {\n    case 0:\n        PrintStorageMessage(MSG_DEPOSIT_IN_WHICH_BOX);\n        LoadChooseBoxMenuGfx(&gStorage->chooseBoxMenu, GFXTAG_CHOOSE_BOX_MENU_CENTER, PALTAG_MISC_1, 3, FALSE);\n        CreateChooseBoxMenuSprites(sDepositBoxId);\n        gStorage->state++;\n        break;\n    case 1:\n        boxId = HandleBoxChooseSelectionInput();\n        switch (boxId)\n        {\n        case BOXID_NONE_CHOSEN:\n            break;\n        case BOXID_CANCELED:\n            ClearBottomWindow();\n            DestroyChooseBoxMenuSprites();\n            FreeBoxSelectionPopupSpriteGfx();\n            SetPokeStorageTask(Task_PokeStorageMain);\n            break;\n        default:\n            if (TryStorePartyMonInBox(boxId))\n            {\n                sDepositBoxId = boxId;\n                SetPokeStorageQuestLogEvent(2);\n                ClearBottomWindow();\n                DestroyChooseBoxMenuSprites();\n                FreeBoxSelectionPopupSpriteGfx();\n                gStorage->state = 2;\n            }\n            else\n            {\n                PrintStorageMessage(MSG_BOX_IS_FULL);\n                gStorage->state = 4;\n            }\n            break;\n        }\n        break;\n    case 2:\n        CompactPartySlots();\n        CompactPartySprites();\n        gStorage->state++;\n        break;\n    case 3:\n        if (GetNumPartySpritesCompacting() == 0)\n        {\n            ResetSelectionAfterDeposit();\n            StartDisplayMonMosaic();\n            UpdatePartySlotColors();\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    case 4:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            PrintStorageMessage(MSG_DEPOSIT_IN_WHICH_BOX);\n            gStorage->state = 1;\n        }\n        break;\n    }\n}\n\nstatic void Task_ReleaseMon(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        PrintStorageMessage(MSG_RELEASE_POKE);\n        ShowYesNoWindow(1);\n        gStorage->state++;\n        // fallthrough\n    case 1:\n        switch (Menu_ProcessInputNoWrapClearOnChoose())\n        {\n        case MENU_B_PRESSED:\n        case 1:\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n            break;\n        case 0:\n            ClearBottomWindow();\n            InitCanReleaseMonVars();\n            InitReleaseMon();\n            gStorage->state++;\n            break;\n        }\n        break;\n    case 2:\n        RunCanReleaseMon();\n        if (!TryHideReleaseMon())\n        {\n            while (TRUE)\n            {\n                // keep checking until status is no longer RELEASE_MON_UNDETERMINED\n                s8 canReleaseStatus = RunCanReleaseMon();\n                if (canReleaseStatus == RELEASE_MON_ALLOWED)\n                {\n                    gStorage->state++;\n                    break;\n                }\n                else if (canReleaseStatus == RELEASE_MON_NOT_ALLOWED)\n                {\n                    gStorage->state = 8; // Can't release the mon.\n                    break;\n                }\n            }\n        }\n        break;\n    case 3:\n        ReleaseMon();\n        RefreshDisplayMonData();\n        PrintStorageMessage(MSG_WAS_RELEASED);\n        gStorage->state++;\n        break;\n    case 4:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            PrintStorageMessage(MSG_BYE_BYE);\n            gStorage->state++;\n        }\n        break;\n    case 5:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            if (sInPartyMenu)\n            {\n                CompactPartySlots();\n                CompactPartySprites();\n                gStorage->state++;\n            }\n            else\n                gStorage->state = 7;\n        }\n        break;\n    case 6:\n        if (GetNumPartySpritesCompacting() == 0)\n        {\n            DoTrySetDisplayMonData();\n            StartDisplayMonMosaic();\n            UpdatePartySlotColors();\n            gStorage->state++;\n        }\n        break;\n    case 7:\n        SetPokeStorageTask(Task_PokeStorageMain);\n        break;\n    case 8:\n        // Start \"can't release\" sequence\n        PrintStorageMessage(MSG_WAS_RELEASED);\n        gStorage->state++;\n        break;\n    case 9:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            PrintStorageMessage(MSG_SURPRISE);\n            gStorage->state++;\n        }\n        break;\n    case 10:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            DoReleaseMonComeBackAnim();\n            gStorage->state++;\n        }\n        break;\n    case 11:\n        if (!ResetReleaseMonSpritePtr())\n        {\n            TrySetCursorFistAnim();\n            PrintStorageMessage(MSG_CAME_BACK);\n            gStorage->state++;\n        }\n        break;\n    case 12:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            PrintStorageMessage(MSG_WORRIED);\n            gStorage->state++;\n        }\n        break;\n    case 13:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    }\n}\n\nstatic void Task_ShowMarkMenu(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        PrintStorageMessage(MSG_MARK_POKE);\n        gStorage->markMenu.markings = gStorage->displayMonMarkings;\n        OpenMonMarkingsMenu(gStorage->displayMonMarkings, 176, 16);\n        gStorage->state++;\n        break;\n    case 1:\n        if (!HandleMonMarkingsMenuInput())\n        {\n            FreeMonMarkingsMenu();\n            ClearBottomWindow();\n            SetMonMarkings(gStorage->markMenu.markings);\n            RefreshDisplayMonData();\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    }\n}\n\nstatic void Task_TakeItemForMoving(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        if (!ItemIsMail(gStorage->displayMonItemId))\n        {\n            ClearBottomWindow();\n            gStorage->state++;\n        }\n        else\n            SetPokeStorageTask(Task_PrintCantStoreMail);\n        break;\n    case 1:\n        StartCursorAnim(CURSOR_ANIM_OPEN);\n        Item_FromMonToMoving(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());\n        gStorage->state++;\n        break;\n    case 2:\n        if (!IsItemIconAnimActive())\n        {\n            StartCursorAnim(CURSOR_ANIM_FIST);\n            ClearBottomWindow();\n            DoTrySetDisplayMonData();\n            PrintDisplayMonInfo();\n            gStorage->state++;\n        }\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            SetPokeStorageTask(Task_PokeStorageMain);\n        break;\n    }\n}\n\nstatic void Task_GiveMovingItemToMon(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        ClearBottomWindow();\n        gStorage->state++;\n        break;\n    case 1:\n        StartCursorAnim(CURSOR_ANIM_OPEN);\n        Item_GiveMovingToMon(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());\n        gStorage->state++;\n        break;\n    case 2:\n        if (!IsItemIconAnimActive())\n        {\n            StartCursorAnim(CURSOR_ANIM_BOUNCE);\n            DoTrySetDisplayMonData();\n            PrintDisplayMonInfo();\n            PrintStorageMessage(MSG_ITEM_IS_HELD);\n            gStorage->state++;\n        }\n        break;\n    case 3:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            gStorage->state++;\n        }\n        break;\n    case 4:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            SetPokeStorageTask(Task_PokeStorageMain);\n        break;\n    }\n}\n\nstatic void Task_ItemToBag(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        if (!AddBagItem(gStorage->displayMonItemId, 1))\n        {\n            PlaySE(SE_FAILURE);\n            PrintStorageMessage(MSG_BAG_FULL);\n            gStorage->state = 3;\n        }\n        else\n        {\n            PlaySE(SE_SELECT);\n            Item_TakeMons(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());\n            gStorage->state = 1;\n        }\n        break;\n    case 1:\n        if (!IsItemIconAnimActive())\n        {\n            PrintStorageMessage(MSG_PLACED_IN_BAG);\n            gStorage->state = 2;\n        }\n        break;\n    case 2:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            DoTrySetDisplayMonData();\n            PrintDisplayMonInfo();\n            gStorage->state = 4;\n        }\n        break;\n    case 4:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            SetPokeStorageTask(Task_PokeStorageMain);\n        break;\n    case 3:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    }\n}\n\nstatic void Task_SwitchSelectedItem(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        if (!ItemIsMail(gStorage->displayMonItemId))\n        {\n            ClearBottomWindow();\n            gStorage->state++;\n        }\n        else\n            SetPokeStorageTask(Task_PrintCantStoreMail);\n        break;\n    case 1:\n        StartCursorAnim(CURSOR_ANIM_OPEN);\n        Item_SwitchMonsWithMoving(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());\n        gStorage->state++;\n        break;\n    case 2:\n        if (!IsItemIconAnimActive())\n        {\n            StartCursorAnim(CURSOR_ANIM_FIST);\n            DoTrySetDisplayMonData();\n            PrintDisplayMonInfo();\n            PrintStorageMessage(MSG_CHANGED_TO_ITEM);\n            gStorage->state++;\n        }\n        break;\n    case 3:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            gStorage->state++;\n        }\n        break;\n    case 4:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            SetPokeStorageTask(Task_PokeStorageMain);\n        break;\n    }\n}\n\nstatic void Task_ShowItemInfo(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        ClearBottomWindow();\n        gStorage->state++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PlaySE(SE_WIN_OPEN);\n            PrintItemDescription();\n            InitItemInfoWindow();\n            gStorage->state++;\n        }\n        break;\n    case 2:\n        if (!UpdateItemInfoWindowSlideIn())\n            gStorage->state++;\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            gStorage->state++;\n        break;\n    case 4:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            PlaySE(SE_WIN_OPEN);\n            gStorage->state++;\n        }\n        break;\n    case 5:\n        if (!UpdateItemInfoWindowSlideOut())\n            gStorage->state++;\n        break;\n    case 6:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            SetPokeStorageTask(Task_PokeStorageMain);\n        break;\n    }\n}\n\nstatic void Task_CloseBoxWhileHoldingItem(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        PlaySE(SE_SELECT);\n        PrintStorageMessage(MSG_PUT_IN_BAG);\n        ShowYesNoWindow(0);\n        gStorage->state = 1;\n        break;\n    case 1:\n        switch (Menu_ProcessInputNoWrapClearOnChoose())\n        {\n        case MENU_B_PRESSED:\n        case 1:\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n            break;\n        case 0:\n            if (AddBagItem(gStorage->movingItemId, 1) == TRUE)\n            {\n                ClearBottomWindow();\n                gStorage->state = 3;\n            }\n            else\n            {\n                PrintStorageMessage(MSG_BAG_FULL);\n                gStorage->state = 2;\n            }\n            break;\n        }\n        break;\n    case 2:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            gStorage->state = 5;\n        }\n        break;\n    case 3:\n        MoveItemFromCursorToBag();\n        gStorage->state = 4;\n        break;\n    case 4:\n        if (!IsItemIconAnimActive())\n        {\n            StartCursorAnim(CURSOR_ANIM_BOUNCE);\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    case 5:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            SetPokeStorageTask(Task_PokeStorageMain);\n        break;\n    }\n}\n\nstatic void Task_HandleMovingMonFromParty(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        CompactPartySlots();\n        CompactPartySprites();\n        gStorage->state++;\n        break;\n    case 1:\n        if (GetNumPartySpritesCompacting() == 0)\n        {\n            UpdatePartySlotColors();\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    }\n}\n\nstatic void Task_PrintCantStoreMail(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        PrintStorageMessage(MSG_CANT_STORE_MAIL);\n        gStorage->state++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            gStorage->state++;\n        break;\n    case 2:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            gStorage->state++;\n        }\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            SetPokeStorageTask(Task_PokeStorageMain);\n        break;\n    }\n}\n\nstatic void Task_HandleBoxOptions(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        PrintStorageMessage(MSG_WHAT_YOU_DO);\n        AddMenu();\n        gStorage->state++;\n        break;\n    case 1:\n        if (IsMenuLoading())\n            return;\n        gStorage->state++;\n    case 2:\n        switch (HandleMenuInput())\n        {\n        case MENU_B_PRESSED:\n        case MENU_TEXT_CANCEL:\n            AnimateBoxScrollArrows(TRUE);\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n            break;\n        case MENU_TEXT_NAME:\n            PlaySE(SE_SELECT);\n            SetPokeStorageTask(Task_NameBox);\n            break;\n        case MENU_TEXT_WALLPAPER:\n            PlaySE(SE_SELECT);\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_HandleWallpapers);\n            break;\n        case MENU_TEXT_JUMP:\n            PlaySE(SE_SELECT);\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_JumpBox);\n            break;\n        }\n        break;\n    }\n}\n\nstatic void Task_HandleWallpapers(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        AddWallpaperSetsMenu();\n        PrintStorageMessage(MSG_PICK_A_THEME);\n        gStorage->state++;\n        break;\n    case 1:\n        if (!IsMenuLoading())\n            gStorage->state++;\n        break;\n    case 2:\n        gStorage->wallpaperSetId = HandleMenuInput();\n        switch (gStorage->wallpaperSetId)\n        {\n        case MENU_B_PRESSED:\n            AnimateBoxScrollArrows(TRUE);\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n            break;\n        case MENU_TEXT_SCENERY_1:\n        case MENU_TEXT_SCENERY_2:\n        case MENU_TEXT_SCENERY_3:\n        case MENU_TEXT_ETCETERA:\n            PlaySE(SE_SELECT);\n            RemoveMenu();\n            gStorage->wallpaperSetId -= MENU_TEXT_SCENERY_1;\n            gStorage->state++;\n            break;\n        }\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            AddWallpapersMenu(gStorage->wallpaperSetId);\n            PrintStorageMessage(MSG_PICK_A_WALLPAPER);\n            gStorage->state++;\n        }\n        break;\n    case 4:\n        gStorage->wallpaperId = HandleMenuInput();\n        switch (gStorage->wallpaperId)\n        {\n        case MENU_NOTHING_CHOSEN:\n            break;\n        case MENU_B_PRESSED:\n            ClearBottomWindow();\n            gStorage->state = 0;\n            break;\n        default:\n            PlaySE(SE_SELECT);\n            ClearBottomWindow();\n            gStorage->wallpaperId -= MENU_TEXT_FOREST;\n            SetWallpaperForCurrentBox(gStorage->wallpaperId);\n            gStorage->state++;\n            break;\n        }\n        break;\n    case 5:\n        if (!DoWallpaperGfxChange())\n        {\n            AnimateBoxScrollArrows(TRUE);\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    }\n}\n\nstatic void Task_JumpBox(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        PrintStorageMessage(MSG_JUMP_TO_WHICH_BOX);\n        LoadChooseBoxMenuGfx(&gStorage->chooseBoxMenu, GFXTAG_CHOOSE_BOX_MENU_CENTER, PALTAG_MISC_1, 3, FALSE);\n        CreateChooseBoxMenuSprites(StorageGetCurrentBox());\n        gStorage->state++;\n        break;\n    case 1:\n        gStorage->newCurrBoxId = HandleBoxChooseSelectionInput();\n        switch (gStorage->newCurrBoxId)\n        {\n        case BOXID_NONE_CHOSEN:\n            break;\n        default:\n            ClearBottomWindow();\n            DestroyChooseBoxMenuSprites();\n            FreeBoxSelectionPopupSpriteGfx();\n            if (gStorage->newCurrBoxId == BOXID_CANCELED || gStorage->newCurrBoxId == StorageGetCurrentBox())\n            {\n                AnimateBoxScrollArrows(TRUE);\n                SetPokeStorageTask(Task_PokeStorageMain);\n            }\n            else\n                gStorage->state++;\n            break;\n        }\n        break;\n    case 2:\n        SetUpScrollToBox(gStorage->newCurrBoxId);\n        gStorage->state++;\n        break;\n    case 3:\n        if (!ScrollToBox())\n        {\n            SetCurrentBox(gStorage->newCurrBoxId);\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    }\n}\n\nstatic void Task_NameBox(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        SaveMovingMon();\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        gStorage->state++;\n        break;\n    case 1:\n        if (!UpdatePaletteFade())\n        {\n            sWhichToReshow = SCREEN_CHANGE_NAME_BOX - 1;\n            gStorage->screenChangeType = SCREEN_CHANGE_NAME_BOX;\n            SetPokeStorageTask(Task_ChangeScreen);\n        }\n        break;\n    }\n}\n\nstatic void Task_ShowMonSummary(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        InitSummaryScreenData();\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        gStorage->state++;\n        break;\n    case 1:\n        if (!UpdatePaletteFade())\n        {\n            sWhichToReshow = SCREEN_CHANGE_SUMMARY_SCREEN - 1;\n            gStorage->screenChangeType = SCREEN_CHANGE_SUMMARY_SCREEN;\n            SetPokeStorageTask(Task_ChangeScreen);\n        }\n        break;\n    }\n}\n\nstatic void Task_GiveItemFromBag(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        gStorage->state++;\n        break;\n    case 1:\n        if (!UpdatePaletteFade())\n        {\n            sWhichToReshow = SCREEN_CHANGE_ITEM_FROM_BAG - 1;\n            gStorage->screenChangeType = SCREEN_CHANGE_ITEM_FROM_BAG;\n            SetPokeStorageTask(Task_ChangeScreen);\n        }\n        break;\n    }\n}\n\nstatic void Task_OnCloseBoxPressed(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        if (IsMonBeingMoved())\n        {\n            PlaySE(SE_FAILURE);\n            PrintStorageMessage(MSG_HOLDING_POKE);\n            gStorage->state = 1;\n        }\n        else if (IsActiveItemMoving())\n            SetPokeStorageTask(Task_CloseBoxWhileHoldingItem);\n        else\n        {\n            PlaySE(SE_SELECT);\n            PrintStorageMessage(MSG_EXIT_BOX);\n            ShowYesNoWindow(0);\n            gStorage->state = 2;\n        }\n        break;\n    case 1:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    case 2:\n        switch (Menu_ProcessInputNoWrapClearOnChoose())\n        {\n        case MENU_B_PRESSED:\n        case 1:\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n            break;\n        case 0:\n            PlaySE(SE_PC_OFF);\n            ClearBottomWindow();\n            gStorage->state++;\n            break;\n        }\n        break;\n    case 3:\n        BeginPCScreenEffect_TurnOff(20, 0, 1);\n        gStorage->state++;\n        break;\n    case 4:\n        if (!IsPCScreenEffectRunning_TurnOff())\n        {\n            UpdateBoxToSendMons();\n            gPlayerPartyCount = CalculatePlayerPartyCount();\n            gStorage->screenChangeType = SCREEN_CHANGE_EXIT_BOX;\n            SetPokeStorageTask(Task_ChangeScreen);\n        }\n        break;\n    }\n}\n\nstatic void Task_OnBPressed(u8 taskId)\n{\n    switch (gStorage->state)\n    {\n    case 0:\n        if (IsMonBeingMoved())\n        {\n            PlaySE(SE_FAILURE);\n            PrintStorageMessage(MSG_HOLDING_POKE);\n            gStorage->state = 1;\n        }\n        else if (IsActiveItemMoving())\n            SetPokeStorageTask(Task_CloseBoxWhileHoldingItem);\n        else\n        {\n            PlaySE(SE_SELECT);\n            PrintStorageMessage(MSG_CONTINUE_BOX);\n            ShowYesNoWindow(0);\n            gStorage->state = 2;\n        }\n        break;\n    case 1:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n        {\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n        }\n        break;\n    case 2:\n        switch (Menu_ProcessInputNoWrapClearOnChoose())\n        {\n        case 0:\n            ClearBottomWindow();\n            SetPokeStorageTask(Task_PokeStorageMain);\n            break;\n        case 1:\n        case MENU_B_PRESSED:\n            PlaySE(SE_PC_OFF);\n            ClearBottomWindow();\n            gStorage->state++;\n            break;\n        }\n        break;\n    case 3:\n        BeginPCScreenEffect_TurnOff(20, 0, 0);\n        gStorage->state++;\n        break;\n    case 4:\n        if (!IsPCScreenEffectRunning_TurnOff())\n        {\n            UpdateBoxToSendMons();\n            gPlayerPartyCount = CalculatePlayerPartyCount();\n            gStorage->screenChangeType = SCREEN_CHANGE_EXIT_BOX;\n            SetPokeStorageTask(Task_ChangeScreen);\n        }\n        break;\n    }\n}\n\nstatic void Task_ChangeScreen(u8 taskId)\n{\n    struct Pokemon *party;\n    u8 mode, cursorPos, lastIndex;\n    u8 screenChangeType = gStorage->screenChangeType;\n\n    if (gStorage->boxOption == OPTION_MOVE_ITEMS && IsActiveItemMoving() == TRUE)\n        sMovingItemId = GetMovingItem();\n    else\n        sMovingItemId = ITEM_NONE;\n\n    switch (screenChangeType)\n    {\n    case SCREEN_CHANGE_EXIT_BOX:\n    default:\n        FreePokeStorageData();\n        SetMainCallback2(CB2_ExitPokeStorage);\n        break;\n    case SCREEN_CHANGE_SUMMARY_SCREEN:\n        party = gStorage->summaryMonPtr.mon;\n        cursorPos = gStorage->summaryCursorPos;\n        lastIndex = gStorage->summaryLastIndex;\n        mode = gStorage->summaryScreenMode;\n        FreePokeStorageData();\n        ShowPokemonSummaryScreen(party, cursorPos, lastIndex, CB2_ReturnToPokeStorage, mode);\n        break;\n    case SCREEN_CHANGE_NAME_BOX:\n        FreePokeStorageData();\n        DoNamingScreen(NAMING_SCREEN_BOX, GetBoxNamePtr(StorageGetCurrentBox()), 0, 0, 0, CB2_ReturnToPokeStorage);\n        break;\n    case SCREEN_CHANGE_ITEM_FROM_BAG:\n        FreePokeStorageData();\n        GoToBagMenu(ITEMMENULOCATION_PCBOX, OPEN_BAG_ITEMS, CB2_ReturnToPokeStorage);\n        break;\n    }\n\n    DestroyTask(taskId);\n}\n\nstatic void GiveChosenBagItem(void)\n{\n    u16 item = gSpecialVar_ItemId;\n\n    if (item != ITEM_NONE)\n    {\n        u8 id = GetBoxCursorPosition();\n\n        if (sInPartyMenu)\n            SetMonData(&gPlayerParty[id], MON_DATA_HELD_ITEM, &item);\n        else\n            SetCurrentBoxMonData(id, MON_DATA_HELD_ITEM, &item);\n\n        RemoveBagItem(item, 1);\n    }\n}\n\nstatic void FreePokeStorageData(void)\n{\n    TilemapUtil_Free();\n    MultiMove_Free();\n    FREE_AND_SET_NULL(gStorage);\n    FreeAllWindowBuffers();\n}\n\nstatic void SetScrollingBackground(void)\n{\n    SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31));\n    DecompressAndLoadBgGfxUsingHeap(3, sScrollingBg_Gfx, 0, 0, 0);\n    LZ77UnCompVram(sScrollingBg_Tilemap, (void *)BG_SCREEN_ADDR(31));\n}\n\nstatic void ScrollBackground(void)\n{\n    ChangeBgX(3, 128, 1);\n    ChangeBgY(3, 128, 2);\n}\n\nstatic void LoadPokeStorageMenuGfx(void)\n{\n    InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));\n    DecompressAndLoadBgGfxUsingHeap(1, gPokeStorageMenu_Gfx, 0, 0, 0);\n    LZ77UnCompWram(sMenu_Tilemap, gStorage->menuTilemapBuffer);\n    SetBgTilemapBuffer(1, gStorage->menuTilemapBuffer);\n    ShowBg(1);\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nstatic bool8 InitPokeStorageWindows(void)\n{\n    if (!InitWindows(sWindowTemplates))\n        return FALSE;\n\n    DeactivateAllTextPrinters();\n    return TRUE;\n}\n\nstatic void LoadsMiscSpritePalette(void)\n{\n    LoadSpritePalette(&sMiscSpritePalette);\n}\n\nstatic void InitPalettesAndSprites(void)\n{\n    LoadPalette(gPokeStorageInterface_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n    LoadPalette(gPokeStorageInterface_NoDisplayMon_Pal, BG_PLTT_ID(2), PLTT_SIZE_4BPP);\n    LoadPalette(sItemInfoFrame_Pal, BG_PLTT_ID(15), sizeof(sItemInfoFrame_Pal));\n    if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n        LoadPalette(sScrollingBg_Pal, BG_PLTT_ID(3), sizeof(sScrollingBg_Pal));\n    else\n        LoadPalette(sScrollingBgMoveItems_Pal, BG_PLTT_ID(3), sizeof(sScrollingBgMoveItems_Pal));\n\n    SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_16COLOR | BGCNT_SCREENBASE(30));\n    CreateDisplayMonSprite();\n    CreateMarkingComboSprite();\n    CreateWaveformSprites();\n    RefreshDisplayMonData();\n}\n\nstatic void CreateMarkingComboSprite(void)\n{\n    gStorage->markingComboSprite = CreateMonMarkingComboSprite(GFXTAG_MARKING_COMBO, PALTAG_MARKING_COMBO, NULL);\n    gStorage->markingComboSprite->oam.priority = 1;\n    gStorage->markingComboSprite->subpriority = 1;\n    gStorage->markingComboSprite->x = 40;\n    gStorage->markingComboSprite->y = 150;\n    gStorage->markingComboTilesPtr = (void *)OBJ_VRAM0 + 32 * GetSpriteTileStartByTag(GFXTAG_MARKING_COMBO);\n}\n\nstatic void CreateWaveformSprites(void)\n{\n    u16 i;\n    struct SpriteSheet sheet = sWaveformSpriteSheet;\n\n    LoadSpriteSheet(&sheet);\n    for (i = 0; i < 2; i++)\n    {\n        u8 spriteId = CreateSprite(&sSpriteTemplate_Waveform, i * 63 + 8, 9, 2);\n        gStorage->waveformSprites[i] = &gSprites[spriteId];\n    }\n}\n\nstatic void RefreshDisplayMonData(void)\n{\n    LoadDisplayMonGfx(gStorage->displayMonSpecies, gStorage->displayMonPersonality);\n    PrintDisplayMonInfo();\n    UpdateWaveformAnimation();\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nstatic void StartDisplayMonMosaic(void)\n{\n    RefreshDisplayMonData();\n    if (gStorage->displayMonSprite)\n    {\n        gStorage->displayMonSprite->oam.mosaic = TRUE;\n        gStorage->displayMonSprite->data[0] = 10;\n        gStorage->displayMonSprite->data[1] = 1;\n        gStorage->displayMonSprite->callback = SpriteCB_DisplayMonMosaic;\n        SetGpuReg(REG_OFFSET_MOSAIC, (gStorage->displayMonSprite->data[0] << 12) | (gStorage->displayMonSprite->data[0] << 8));\n    }\n}\n\nstatic u8 IsDisplayMonMosaicActive(void)\n{\n    return gStorage->displayMonSprite->oam.mosaic;\n}\n\nstatic void SpriteCB_DisplayMonMosaic(struct Sprite *sprite)\n{\n    sprite->data[0] -= sprite->data[1];\n    if (sprite->data[0] < 0)\n        sprite->data[0] = 0;\n    SetGpuReg(REG_OFFSET_MOSAIC, (sprite->data[0] << 12) | (sprite->data[0] << 8));\n    if (sprite->data[0] == 0)\n    {\n        sprite->oam.mosaic = FALSE;\n        sprite->callback = SpriteCallbackDummy;\n    }\n}\n\nstatic void CreateDisplayMonSprite(void)\n{\n    u16 i;\n    u16 tileStart;\n    u8 palSlot;\n    u8 spriteId;\n    struct SpriteSheet sheet = {gStorage->tileBuffer, MON_PIC_SIZE, GFXTAG_DISPLAY_MON};\n    struct SpritePalette palette = {gStorage->displayMonPalBuffer, PALTAG_DISPLAY_MON};\n    struct SpriteTemplate template = sSpriteTemplate_DisplayMon;\n\n    for (i = 0; i < MON_PIC_SIZE; i++)\n        gStorage->tileBuffer[i] = 0;\n    for (i = 0; i < 0x10; i++)\n        gStorage->displayMonPalBuffer[i] = 0;\n\n    gStorage->displayMonSprite = NULL;\n\n    do\n    {\n        tileStart = LoadSpriteSheet(&sheet);\n        if (tileStart == 0)\n            break;\n\n        palSlot = LoadSpritePalette(&palette);\n        if (palSlot == 0xFF)\n            break;\n\n        spriteId = CreateSprite(&template, 40, 48, 0);\n        if (spriteId == MAX_SPRITES)\n            break;\n\n        gStorage->displayMonSprite = &gSprites[spriteId];\n        gStorage->displayMonPalOffset = OBJ_PLTT_ID(palSlot);\n        gStorage->displayMonTilePtr = (void *)OBJ_VRAM0 + tileStart * 32;\n    } while (FALSE);\n\n    if (gStorage->displayMonSprite == NULL)\n    {\n        FreeSpriteTilesByTag(GFXTAG_DISPLAY_MON);\n        FreeSpritePaletteByTag(PALTAG_DISPLAY_MON);\n    }\n}\n\nstatic void LoadDisplayMonGfx(u16 species, u32 personality)\n{\n    if (gStorage->displayMonSprite == NULL)\n        return;\n\n    if (species != SPECIES_NONE)\n    {\n        HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gStorage->tileBuffer, species, personality);\n        LZ77UnCompWram(gStorage->displayMonPalette, gStorage->displayMonPalBuffer);\n        CpuCopy32(gStorage->tileBuffer, gStorage->displayMonTilePtr, 0x800);\n        LoadPalette(gStorage->displayMonPalBuffer, gStorage->displayMonPalOffset, PLTT_SIZE_4BPP);\n        gStorage->displayMonSprite->invisible = FALSE;\n    }\n    else\n        gStorage->displayMonSprite->invisible = TRUE;\n}\n\nstatic void PrintDisplayMonInfo(void)\n{\n    u16 i;\n    u16 y;\n    FillWindowPixelBuffer(0, PIXEL_FILL(1));\n    if (gStorage->boxOption != OPTION_MOVE_ITEMS)\n    {\n        for (i = 0, y = 0; i < 3; i++, y += 14)\n            AddTextPrinterParameterized(0, FONT_NORMAL, gStorage->displayMonTexts[i], i == 2 ? 10 : 6, y, TEXT_SKIP_DRAW, NULL);\n\n        AddTextPrinterParameterized(0, FONT_SMALL, gStorage->displayMonTexts[3], 6, y + 2, TEXT_SKIP_DRAW, NULL);\n    }\n    else\n    {\n        AddTextPrinterParameterized(0, FONT_SMALL, gStorage->displayMonTexts[3], 6, 0, TEXT_SKIP_DRAW, NULL);\n        for (i = 0, y = 15; i < 3; i++, y += 14)\n            AddTextPrinterParameterized(0, FONT_NORMAL, gStorage->displayMonTexts[i], i == 2 ? 10 : 6, y, TEXT_SKIP_DRAW, NULL);\n    }\n\n    CopyWindowToVram(0, COPYWIN_GFX);\n    if (gStorage->displayMonSpecies != SPECIES_NONE)\n    {\n        UpdateMonMarkingTiles(gStorage->displayMonMarkings, gStorage->markingComboTilesPtr);\n        gStorage->markingComboSprite->invisible = FALSE;\n    }\n    else\n        gStorage->markingComboSprite->invisible = TRUE;\n}\n\nstatic void UpdateWaveformAnimation(void)\n{\n    u16 i;\n\n    if (gStorage->displayMonSpecies != SPECIES_NONE)\n    {\n        TilemapUtil_SetRect(TILEMAP_PKMN_DATA, 0, 0, 8, 2);\n        for (i = 0; i < 2; i++)\n            StartSpriteAnimIfDifferent(gStorage->waveformSprites[i], i * 2 + 1);\n    }\n    else\n    {\n        TilemapUtil_SetRect(TILEMAP_PKMN_DATA, 0, 2, 8, 2);\n        for (i = 0; i < 2; i++)\n            StartSpriteAnim(gStorage->waveformSprites[i], i * 2);\n    }\n\n    TilemapUtil_Update(TILEMAP_PKMN_DATA);\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nstatic void InitSupplementalTilemaps(void)\n{\n    LZ77UnCompWram(gPokeStoragePartyMenu_Tilemap, gStorage->partyMenuTilemapBuffer);\n    LoadPalette(gPokeStoragePartyMenu_Pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP);\n    TilemapUtil_SetTilemap(TILEMAP_PARTY_MENU, 1, gStorage->partyMenuTilemapBuffer, 12, 22);\n    TilemapUtil_SetTilemap(TILEMAP_CLOSE_BUTTON, 1, sCloseBoxButton_Tilemap, 9, 4);\n    TilemapUtil_SetPos(TILEMAP_PARTY_MENU, 10, 0);\n    TilemapUtil_SetPos(TILEMAP_CLOSE_BUTTON, 21, 0);\n    SetPartySlotTilemaps();\n    if (sInPartyMenu)\n    {\n        UpdateCloseBoxButtonTilemap(TRUE);\n        CreatePartyMonsSprites(TRUE);\n        TilemapUtil_Update(TILEMAP_CLOSE_BUTTON);\n        TilemapUtil_Update(TILEMAP_PARTY_MENU);\n    }\n    else\n    {\n        TilemapUtil_SetRect(TILEMAP_PARTY_MENU, 0, 20, 12, 2);\n        UpdateCloseBoxButtonTilemap(TRUE);\n        TilemapUtil_Update(TILEMAP_PARTY_MENU);\n        TilemapUtil_Update(TILEMAP_CLOSE_BUTTON);\n    }\n\n    ScheduleBgCopyTilemapToVram(1);\n    gStorage->closeBoxFlashing = FALSE;\n}\n\nstatic void SetUpShowPartyMenu(void)\n{\n    gStorage->partyMenuUnused1 = 20;\n    gStorage->partyMenuY = 2;\n    gStorage->partyMenuMoveTimer = 0;\n    CreatePartyMonsSprites(FALSE);\n}\n\nstatic bool8 ShowPartyMenu(void)\n{\n    if (gStorage->partyMenuMoveTimer == 20)\n        return FALSE;\n\n    gStorage->partyMenuUnused1--;\n    gStorage->partyMenuY++;\n    TilemapUtil_Move(TILEMAP_PARTY_MENU, 3, 1);\n    TilemapUtil_Update(TILEMAP_PARTY_MENU);\n    ScheduleBgCopyTilemapToVram(1);\n    MovePartySprites(8);\n    if (++gStorage->partyMenuMoveTimer == 20)\n    {\n        sInPartyMenu = TRUE;\n        return FALSE;\n    }\n    else\n        return TRUE;\n}\n\nstatic void SetUpHidePartyMenu(void)\n{\n    gStorage->partyMenuUnused1 = 0;\n    gStorage->partyMenuY = 22;\n    gStorage->partyMenuMoveTimer = 0;\n    if (gStorage->boxOption == OPTION_MOVE_ITEMS)\n        MoveHeldItemWithPartyMenu();\n}\n\nstatic bool8 HidePartyMenu(void)\n{\n    if (gStorage->partyMenuMoveTimer != 20)\n    {\n        gStorage->partyMenuUnused1++;\n        gStorage->partyMenuY--;\n        TilemapUtil_Move(TILEMAP_PARTY_MENU, 3, -1);\n        TilemapUtil_Update(TILEMAP_PARTY_MENU);\n        FillBgTilemapBufferRect_Palette0(1, 0x100, 10, gStorage->partyMenuY, 12, 1);\n        MovePartySprites(-8);\n        if (++gStorage->partyMenuMoveTimer != 20)\n        {\n            ScheduleBgCopyTilemapToVram(1);\n            return TRUE;\n        }\n        else\n        {\n            sInPartyMenu = FALSE;\n            DestroyAllPartyMonIcons();\n            CompactPartySlots();\n            TilemapUtil_SetRect(TILEMAP_CLOSE_BUTTON, 0, 0, 9, 2);\n            TilemapUtil_Update(TILEMAP_CLOSE_BUTTON);\n            ScheduleBgCopyTilemapToVram(1);\n            return FALSE;\n        }\n    }\n\n    return FALSE;\n}\n\nstatic void UpdateCloseBoxButtonTilemap(bool8 normal)\n{\n    if (normal)\n        TilemapUtil_SetRect(TILEMAP_CLOSE_BUTTON, 0, 0, 9, 2);\n    else\n        TilemapUtil_SetRect(TILEMAP_CLOSE_BUTTON, 0, 2, 9, 2);\n\n    TilemapUtil_Update(TILEMAP_CLOSE_BUTTON);\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nstatic void StartFlashingCloseBoxButton(void)\n{\n    gStorage->closeBoxFlashing = TRUE;\n    gStorage->closeBoxFlashTimer = 30;\n    gStorage->closeBoxFlashState = TRUE;\n}\n\nstatic void StopFlashingCloseBoxButton(void)\n{\n    if (gStorage->closeBoxFlashing)\n    {\n        gStorage->closeBoxFlashing = FALSE;\n        UpdateCloseBoxButtonTilemap(TRUE);\n    }\n}\n\nstatic void UpdateCloseBoxButtonFlash(void)\n{\n    if (gStorage->closeBoxFlashing && ++gStorage->closeBoxFlashTimer > 30)\n    {\n        gStorage->closeBoxFlashTimer = 0;\n        gStorage->closeBoxFlashState = (gStorage->closeBoxFlashState == FALSE);\n        UpdateCloseBoxButtonTilemap(gStorage->closeBoxFlashState);\n    }\n}\n\nstatic void SetPartySlotTilemaps(void)\n{\n    u8 i;\n\n    // Skips first party slot, it should always be drawn\n    // as if it has a Pokémon in it\n    for (i = 1; i < PARTY_SIZE; i++)\n    {\n        s32 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES);\n        SetPartySlotTilemap(i, (species != SPECIES_NONE));\n    }\n}\n\nstatic void SetPartySlotTilemap(u8 pos, bool8 isFilled)\n{\n    u16 i, j, index;\n    const u16 *tilemap;\n\n    if (isFilled)\n        tilemap = sPartySlotFilled_Tilemap;\n    else\n        tilemap = sPartySlotEmpty_Tilemap;\n\n    index = 3 * (3 * (pos - 1) + 1);\n    index *= 4;\n    index += 7;\n    for (i = 0; i < 3; i++)\n    {\n        for (j = 0; j < 4; j++)\n            gStorage->partyMenuTilemapBuffer[index + j] = tilemap[j];\n\n        tilemap += 4;\n        index += 12;\n    }\n}\n\nstatic void UpdatePartySlotColors(void)\n{\n    SetPartySlotTilemaps();\n    TilemapUtil_SetRect(TILEMAP_PARTY_MENU, 0, 0, 12, 22);\n    TilemapUtil_Update(TILEMAP_PARTY_MENU);\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nstatic void SetUpDoShowPartyMenu(void)\n{\n    gStorage->showPartyMenuState = 0;\n    PlaySE(SE_WIN_OPEN);\n    SetUpShowPartyMenu();\n}\n\nstatic bool8 DoShowPartyMenu(void)\n{\n    switch (gStorage->showPartyMenuState)\n    {\n    case 0:\n        if (!ShowPartyMenu())\n        {\n            SetCursorInParty();\n            gStorage->showPartyMenuState++;\n        }\n        break;\n    case 1:\n        if (!UpdateCursorPos())\n        {\n            if (gStorage->setMosaic)\n                StartDisplayMonMosaic();\n            gStorage->showPartyMenuState++;\n        }\n        break;\n    case 2:\n        return FALSE;\n    }\n    return TRUE;\n}\n\nstatic void InitPokeStorageBg0(void)\n{\n    SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(29));\n    LoadStdWindowGfx(1, 2, BG_PLTT_ID(13));\n    FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17);\n    CopyBgTilemapBufferToVram(0);\n}\n\nstatic void PrintStorageMessage(u8 id)\n{\n    u8 *txtPtr;\n\n    DynamicPlaceholderTextUtil_Reset();\n    switch (sMessages[id].format)\n    {\n    case MSG_FMT_NONE:\n        break;\n    case MSG_FMT_MON_NAME_1:\n    case MSG_FMT_MON_NAME_2:\n    case MSG_FMT_MON_NAME_3:\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStorage->displayMonNickname);\n        break;\n    case MSG_FMT_RELEASE_MON_1:\n    case MSG_FMT_RELEASE_MON_2:\n    case MSG_FMT_RELEASE_MON_3:\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStorage->releaseMonName);\n        break;\n    case MSG_FMT_ITEM_NAME:\n        if (IsActiveItemMoving())\n            txtPtr = StringCopy(gStorage->itemName, GetMovingItemName());\n        else\n            txtPtr = StringCopy(gStorage->itemName, gStorage->displayMonTexts[3]);\n\n        while (*(txtPtr - 1) == CHAR_SPACE)\n            txtPtr--;\n\n        *txtPtr = EOS;\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStorage->itemName);\n        break;\n    }\n\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStorage->actionText, sMessages[id].text);\n    FillWindowPixelBuffer(1, PIXEL_FILL(1));\n    AddTextPrinterParameterized(1, FONT_NORMAL_COPY_1, gStorage->actionText, 0, 2, TEXT_SKIP_DRAW, NULL);\n    DrawTextBorderOuter(1, 2, 13);\n    PutWindowTilemap(1);\n    CopyWindowToVram(1, COPYWIN_GFX);\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nstatic void ShowYesNoWindow(s8 cursorPos)\n{\n    CreateYesNoMenu(&sYesNoWindowTemplate, FONT_NORMAL_COPY_1, 0, 2, 11, 14, 1);\n    Menu_MoveCursorNoWrapAround(cursorPos);\n}\n\nstatic void ClearBottomWindow(void)\n{\n    ClearStdWindowAndFrameToTransparent(1, FALSE);\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nstatic void AddWallpaperSetsMenu(void)\n{\n    InitMenu();\n    SetMenuText(MENU_TEXT_SCENERY_1);\n    SetMenuText(MENU_TEXT_SCENERY_2);\n    SetMenuText(MENU_TEXT_SCENERY_3);\n    SetMenuText(MENU_TEXT_ETCETERA);\n    AddMenu();\n}\n\nstatic void AddWallpapersMenu(u8 wallpaperSet)\n{\n    InitMenu();\n    switch (wallpaperSet)\n    {\n    case 0: // SCENERY_1\n        SetMenuText(MENU_TEXT_FOREST);\n        SetMenuText(MENU_TEXT_CITY);\n        SetMenuText(MENU_TEXT_DESERT);\n        SetMenuText(MENU_TEXT_SAVANNA);\n        break;\n    case 1: // SCENERY_2\n        SetMenuText(MENU_TEXT_CRAG);\n        SetMenuText(MENU_TEXT_VOLCANO);\n        SetMenuText(MENU_TEXT_SNOW);\n        SetMenuText(MENU_TEXT_CAVE);\n        break;\n    case 2: // SCENERY_3\n        SetMenuText(MENU_TEXT_BEACH);\n        SetMenuText(MENU_TEXT_SEAFLOOR);\n        SetMenuText(MENU_TEXT_RIVER);\n        SetMenuText(MENU_TEXT_SKY);\n        break;\n    case 3: // ETCETERA\n        SetMenuText(MENU_TEXT_POLKADOT);\n        SetMenuText(MENU_TEXT_POKECENTER);\n        SetMenuText(MENU_TEXT_MACHINE);\n        SetMenuText(MENU_TEXT_SIMPLE);\n        break;\n    }\n    AddMenu();\n}\n\nu8 GetCurrentBoxOption(void)\n{\n    return sCurrentBoxOption;\n}\n\nstatic void InitCursorItemIcon(void)\n{\n    if (!IsCursorOnBoxTitle())\n    {\n        if (sInPartyMenu)\n            TryLoadItemIconAtPos(CURSOR_AREA_IN_PARTY, GetBoxCursorPosition());\n        else\n            TryLoadItemIconAtPos(CURSOR_AREA_IN_BOX, GetBoxCursorPosition());\n    }\n\n    if (sMovingItemId != ITEM_NONE)\n    {\n        InitItemIconInCursor(sMovingItemId);\n        StartCursorAnim(CURSOR_ANIM_FIST);\n    }\n}\n\nstatic void SetPokeStorageQuestLogEvent(u8 action)\n{\n    u16 event;\n    struct QuestLogEvent_MovedBoxMon *questLogData;\n    u8 box1 = GetMovingMonOriginalBoxId();\n    u16 species1 = gStorage->displayMonSpecies;\n    u16 species2;\n    u8 box2;\n    if (sInPartyMenu)\n    {\n        box2 = TOTAL_BOXES_COUNT;\n        species2 = GetMonData(&gPlayerParty[GetBoxCursorPosition()], MON_DATA_SPECIES_OR_EGG);\n    }\n    else\n    {\n        box2 = StorageGetCurrentBox();\n        species2 = GetCurrentBoxMonData(GetBoxCursorPosition(), MON_DATA_SPECIES_OR_EGG);\n    }\n    questLogData = &gStorage->questLogData;\n\n    switch (action)\n    {\n    default:\n        return;\n    case 0:\n        if (sInPartyMenu)\n        {\n            if (box1 == TOTAL_BOXES_COUNT)\n                return;\n            else\n                event = QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON;\n        }\n        else\n        {\n            if (box1 == TOTAL_BOXES_COUNT)\n                // Should upmerge but doesn't\n                event = QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON;\n            else\n                event = box1 != box2 ? QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES : QL_EVENT_SWITCHED_MONS_WITHIN_BOX;\n        }\n        questLogData->species1 = species1;\n        questLogData->species2 = species2;\n        questLogData->box1 = box1;\n        questLogData->box2 = box2;\n        break;\n    case 1:\n        questLogData->species1 = species1;\n        questLogData->species2 = SPECIES_NONE;\n        questLogData->box1 = box1;\n        questLogData->box2 = 0xFF;\n        if (sInPartyMenu)\n        {\n            if (box1 == TOTAL_BOXES_COUNT)\n                return;\n            else\n                event = QL_EVENT_WITHDREW_MON_PC;\n        }\n        else\n        {\n            if (box1 == TOTAL_BOXES_COUNT)\n            {\n                event = QL_EVENT_DEPOSITED_MON_PC;\n                questLogData->box1 = box2;\n            }\n            else if (box1 != box2)\n            {\n                event = QL_EVENT_MOVED_MON_BETWEEN_BOXES;\n                questLogData->box2 = box2;\n            }\n            else\n                event = QL_EVENT_MOVED_MON_WITHIN_BOX;\n        }\n        break;\n    case 2:\n        event = QL_EVENT_DEPOSITED_MON_PC;\n        questLogData->species1 = species1;\n        questLogData->species2 = SPECIES_NONE;\n        questLogData->box1 = sDepositBoxId;\n        questLogData->box2 = 0xFF;\n        break;\n    case 3:\n        event = QL_EVENT_SWITCHED_MULTIPLE_MONS;\n        questLogData->species1 = SPECIES_NONE;\n        questLogData->species2 = SPECIES_NONE;\n        questLogData->box1 = box1;\n        questLogData->box2 = box2;\n        break;\n    }\n    SetQuestLogEvent(event, (const u16 *)questLogData);\n}\n\nstatic void UpdateBoxToSendMons(void)\n{\n    if (sLastUsedBox != StorageGetCurrentBox())\n    {\n        FlagClear(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE);\n        VarSet(VAR_PC_BOX_TO_SEND_MON, StorageGetCurrentBox());\n    }\n}\n"
  },
  {
    "path": "src/pokemon_summary_screen.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"pokemon.h\"\n#include \"pokemon_summary_screen.h\"\n#include \"help_system.h\"\n#include \"task.h\"\n#include \"menu_helpers.h\"\n#include \"link.h\"\n#include \"overworld.h\"\n#include \"constants/songs.h\"\n#include \"strings.h\"\n#include \"new_menu_helpers.h\"\n#include \"menu.h\"\n#include \"constants/items.h\"\n#include \"data.h\"\n#include \"item.h\"\n#include \"constants/party_menu.h\"\n#include \"trade.h\"\n#include \"battle_main.h\"\n#include \"scanline_effect.h\"\n#include \"constants/moves.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"constants/region_map_sections.h\"\n#include \"region_map.h\"\n#include \"field_specials.h\"\n#include \"party_menu.h\"\n#include \"constants/battle.h\"\n#include \"event_data.h\"\n#include \"trainer_pokemon_sprites.h\"\n#include \"battle_anim.h\"\n#include \"pokeball.h\"\n#include \"pokemon_icon.h\"\n#include \"battle_interface.h\"\n#include \"mon_markings.h\"\n#include \"pokemon_storage_system.h\"\n#include \"orre_met_location_strings.h\"\n#include \"constants/maps.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/sound.h\"\n#include \"constants/weather.h\"\n#include \"field_weather.h\"\n#include \"battle_setup.h\"\n\n// needs conflicting header to match (curIndex is s8 in the function, but has to be defined as u8 here)\nextern s16 SeekToNextMonInBox(struct BoxPokemon * boxMons, u8 curIndex, u8 maxIndex, u8 flags);\nextern u8* DetermineOrreMetLocation(struct Pokemon *);\nextern u8 *WriteOrreMapName(u8 *dst0, u8 *string, u16 fill);\nextern const u16 gNaturePowerMoves[];\n\nstatic void BufferSelectedMonData(struct Pokemon * mon);\nstatic void CB2_SetUpPSS(void);\nstatic void PokeSum_TryPlayMonCry(void);\nstatic void PokeSum_RemoveWindows(u8 curPageIndex);\nstatic void Task_PokeSum_FlipPages(u8 taskId);\nstatic void Task_FlipPages_FromInfo(u8 taskId);\nstatic void Task_PokeSum_SwitchDisplayedPokemon(u8 taskId);\nstatic void PokeSum_SeekToNextMon(u8 taskId, s8 direction);\nstatic void Task_DestroyResourcesOnExit(u8 taskId);\nstatic void PokeSum_HideSpritesBeforePageFlip(void);\nstatic void PokeSum_ShowSpritesBeforePageFlip(void);\nstatic void PokeSum_UpdateWin1ActiveFlag(u8 curPageIndex);\nstatic void PokeSum_AddWindows(u8 curPageIndex);\nstatic void PokeSum_PrintPageHeaderText(u8 curPageIndex);\nstatic void PokeSum_InitBgCoordsBeforePageFlips(void);\nstatic u8 PokeSum_IsPageFlipFinished(u8);\nstatic void PokeSum_SetHelpContext(void);\nstatic void Task_HandleInput_SelectMove(u8 id);\nstatic void PokeSum_CopyNewBgTilemapBeforePageFlip_2(void);\nstatic void PokeSum_CopyNewBgTilemapBeforePageFlip(void);\nstatic void PokeSum_DrawPageProgressTiles(void);\nstatic void PokeSum_PrintRightPaneText(void);\nstatic void PokeSum_PrintBottomPaneText(void);\nstatic void PokeSum_PrintAbilityDataOrMoveTypes(void);\nstatic void PokeSum_PrintMonTypeIcons(void);\nstatic void PokeSum_PrintPageName(const u8 * str);\nstatic void PokeSum_PrintControlsString(const u8 * str);\nstatic void PrintMonLevelNickOnWindow2(const u8 * str);\nstatic void PokeSum_UpdateBgPriorityForPageFlip(u8 setBg0Priority, u8 keepBg1Bg2PriorityOrder);\nstatic void ShowOrHideHpBarObjs(u8 invisible);\nstatic void ShowOrHideExpBarObjs(u8 invisible);\nstatic void PokeSum_ShowOrHideMonPicSprite(u8 invisible);\nstatic void PokeSum_ShowOrHideMonMarkingsSprite(u8 invisible);\nstatic void ShowOrHideBallIconObj(u8 invisible);\nstatic void ShowOrHideStatusIcon(u8 invisible);\nstatic void HideShowPokerusIcon(u8 invisible);\nstatic void HideShowShinyStar(u8 invisible);\nstatic void ShoworHideMoveSelectionCursor(u8 invisible);\nstatic void PokeSum_ShowOrHideMonIconSprite(u8 invisible);\nstatic void PokeSum_Setup_ResetCallbacks(void);\nstatic void PokeSum_Setup_InitGpu(void);\nstatic void PokeSum_Setup_SpritesReset(void);\nstatic u8 PokeSum_HandleLoadBgGfx(void);\nstatic u8 PokeSum_HandleCreateSprites(void);\nstatic void PokeSum_CreateWindows(void);\nstatic u8 PokeSum_Setup_BufferStrings(void);\nstatic void CommitStaticWindowTilemaps(void);\nstatic void PokeSum_Setup_SetVBlankCallback(void);\nstatic void PokeSum_FinishSetup(void);\nstatic void BufferMonInfo(void);\nstatic void BufferMonSkills(void);\nstatic void BufferMonMoves(void);\nstatic u8 StatusToAilment(u32 status);\nstatic void BufferMonMoveI(u32);\nstatic u16 GetMonMoveBySlotId(struct Pokemon * mon, u8 moveSlot);\nstatic u16 GetMonPpByMoveSlot(struct Pokemon * mon, u8 moveSlot);\nstatic void CreateShinyStarObj(u16, u16);\nstatic void CreatePokerusIconObj(u16, u16);\nstatic void PokeSum_CreateMonMarkingsSprite(void);\nstatic void CreateMoveSelectionCursorObjs(u16, u16);\nstatic void CreateMonStatusIconObj(u16, u16);\nstatic void CreateHpBarObjs(u16, u16);\nstatic void CreateExpBarObjs(u16, u16);\nstatic void CreateBallIconObj(void);\nstatic void PokeSum_CreateMonIconSprite(void);\nstatic void PokeSum_CreateMonPicSprite(void);\nstatic void Task_InputHandler_SelectOrForgetMove(u8 taskId);\nstatic void CB2_RunPokemonSummaryScreen(void);\nstatic void PrintInfoPage(void);\nstatic void PrintSkillsPage(void);\nstatic void PrintMovesPage(void);\nstatic void PokeSum_PrintMoveName(u8 i);\nstatic void PokeSum_PrintTrainerMemo(void);\nstatic void PokeSum_PrintExpPoints_NextLv(void);\nstatic void PokeSum_PrintSelectedMoveStats(void);\nstatic void PokeSum_PrintTrainerMemo_Mon(void);\nstatic void PokeSum_PrintTrainerMemo_Egg(void);\nstatic bool32 MapSecIsInKantoOrSevii(u8 mapSec);\nstatic bool32 IsMultiBattlePartner(void);\nstatic bool32 PokeSum_IsMonBoldOrGentle(u8 nature);\nstatic void PokeSum_PrintTrainerMemo_Mon_NotHeldByOT(void);\nstatic bool32 CurrentMonIsFromGBA(void);\nstatic u8 PokeSum_BufferOtName_IsEqualToCurrentOwner(struct Pokemon * mon);\nstatic void PokeSum_PrintAbilityNameAndDesc(void);\nstatic void PokeSum_DrawMoveTypeIcons(void);\nstatic void PokeSum_DestroySprites(void);\nstatic void PokeSum_FlipPages_HandleBgHofs(void);\nstatic void SwapMonMoveSlots(void);\nstatic void SwapBoxMonMoveSlots(void);\nstatic void UpdateCurrentMonBufferFromPartyOrBox(struct Pokemon * mon);\nstatic void PokeSum_SetMonPicSpriteCallback(u16 spriteId);\nstatic void SpriteCB_MoveSelectionCursor(struct Sprite *sprite);\nstatic void UpdateMonStatusIconObj(void);\nstatic void UpdateHpBarObjs(void);\nstatic void UpdateExpBarObjs(void);\nstatic void ShowPokerusIconObjIfHasOrHadPokerus(void);\nstatic void ShowShinyStarObjIfMonShiny(void);\nstatic void PokeSum_DestroyMonMarkingsSprite(void);\nstatic void PokeSum_UpdateMonMarkingsAnim(void);\nstatic s8 SeekToNextMonInSingleParty(s8 direction);\nstatic s8 SeekToNextMonInMultiParty(s8 direction);\nstatic bool8 IsMonFromOrre(void);\n\nstruct PokemonSummaryScreenData\n{\n    u16 bg1TilemapBuffer[0x800];\n    u16 bg2TilemapBuffer[0x800];\n    u16 bg3TilemapBuffer[0x800];\n    u8 ALIGNED(4) windowIds[7];\n\n    u8 ALIGNED(4) unk3008;\n    u8 ALIGNED(4) ballIconSpriteId;\n    u8 ALIGNED(4) monPicSpriteId;\n    u8 ALIGNED(4) monIconSpriteId;\n\n    u8 ALIGNED(4) inputHandlerTaskId;\n    u8 ALIGNED(4) inhibitPageFlipInput;\n\n    u8 ALIGNED(4) numMonPicBounces;\n\n    bool32 isEnemyParty; /* 0x3024 */\n\n    struct PokeSummary\n    {\n        u8 ALIGNED(4) speciesNameStrBuf[POKEMON_NAME_LENGTH];\n        u8 ALIGNED(4) nicknameStrBuf[POKEMON_NAME_LENGTH + 1];\n        u8 ALIGNED(4) otNameStrBuf[12];\n        u8 ALIGNED(4) otNameStrBufs[2][12];\n\n        u8 ALIGNED(4) dexNumStrBuf[5];\n        u8 ALIGNED(4) unk306C[7];\n        u8 ALIGNED(4) itemNameStrBuf[ITEM_NAME_LENGTH + 1];\n\n        u8 ALIGNED(4) genderSymbolStrBuf[3];\n        u8 ALIGNED(4) levelStrBuf[7];\n        u8 ALIGNED(4) curHpStrBuf[9];\n        u8 ALIGNED(4) statValueStrBufs[5][5];\n\n        u8 ALIGNED(4) moveCurPpStrBufs[5][11];\n        u8 ALIGNED(4) moveMaxPpStrBufs[5][11];\n        u8 ALIGNED(4) moveNameStrBufs[5][MOVE_NAME_LENGTH + 1];\n        u8 ALIGNED(4) movePowerStrBufs[5][5];\n        u8 ALIGNED(4) moveAccuracyStrBufs[5][5];\n\n        u8 ALIGNED(4) expPointsStrBuf[9];\n        u8 ALIGNED(4) expToNextLevelStrBuf[9];\n\n        u8 ALIGNED(4) abilityNameStrBuf[13];\n        u8 ALIGNED(4) abilityDescStrBuf[52];\n    } summary;\n\n    u8 ALIGNED(4) isEgg; /* 0x3200 */\n    u8 ALIGNED(4) isBadEgg; /* 0x3204 */\n\n    u8 ALIGNED(4) mode; /* 0x3208 */\n    u8 ALIGNED(4) unk320C; /* 0x320C */\n    u8 ALIGNED(4) lastIndex; /* 0x3210 */\n    u8 ALIGNED(4) curPageIndex; /* 0x3214 */\n    u8 ALIGNED(4) unk3218; /* 0x3218 */\n    u8 ALIGNED(4) isBoxMon; /* 0x321C */\n    u8 ALIGNED(4) monTypes[2]; /* 0x3220 */\n\n    u8 ALIGNED(4) pageFlipDirection; /* 0x3224 */\n    u8 ALIGNED(4) unk3228; /* 0x3228 */\n    u8 ALIGNED(4) unk322C; /* 0x322C */\n    u8 ALIGNED(4) unk3230; /* 0x3230 */\n\n    u8 ALIGNED(4) lockMovesFlag; /* 0x3234 */\n\n    u8 ALIGNED(4) whichBgLayerToTranslate; /* 0x3238 */\n    u8 ALIGNED(4) skillsPageBgNum; /* 0x323C */\n    u8 ALIGNED(4) infoAndMovesPageBgNum; /* 0x3240 */\n    u8 ALIGNED(4) flippingPages; /* 0x3244 */\n    u8 ALIGNED(4) unk3248; /* 0x3248 */\n    s16 ALIGNED(4) flipPagesBgHofs; /* 0x324C */\n\n    u16 moveTypes[5]; /* 0x3250 */\n    u16 moveIds[5]; /* 0x325A */\n    u8 ALIGNED(4) numMoves; /* 0x3264 */\n    u8 ALIGNED(4) isSwappingMoves; /* 0x3268 */\n\n    u8 ALIGNED(4) curMonStatusAilment; /* 0x326C */\n\n    u8 ALIGNED(4) state3270; /* 0x3270 */\n    u8 ALIGNED(4) summarySetupStep; /* 0x3274 */\n    u8 ALIGNED(4) loadBgGfxStep; /* 0x3278 */\n    u8 ALIGNED(4) spriteCreationStep; /* 0x327C */\n    u8 ALIGNED(4) bufferStringsStep; /* 0x3280 */\n    u8 ALIGNED(4) state3284; /* 0x3284 */\n    u8 ALIGNED(4) selectMoveInputHandlerState; /* 0x3288 */\n    u8 ALIGNED(4) switchMonTaskState; /* 0x328C */\n\n    struct Pokemon currentMon; /* 0x3290 */\n\n    union\n    {\n        struct Pokemon * mons;\n        struct BoxPokemon * boxMons;\n    } monList;\n\n    MainCallback savedCallback;\n    struct Sprite *markingSprite;\n\n    u8 ALIGNED(4) lastPageFlipDirection; /* 0x3300 */\n    u8 ALIGNED(4) unk3304; /* 0x3304 */\n};\n\nstruct Struct203B144\n{\n    u16 unk00;\n    u16 curHpStr;\n    u16 atkStr;\n    u16 defStr;\n    u16 spAStr;\n    u16 spDStr;\n    u16 speStr;\n    u16 expStr;\n    u16 toNextLevel;\n\n    u16 curPp[5];\n    u16 maxPp[5];\n\n    u16 unk26;\n};\n\nstruct ExpBarObjs\n{\n    struct Sprite *sprites[11]; /* 0x00 */\n    u16 xpos[11]; /* 0x2c */\n    u16 tileTag; /* 0x42 */\n    u16 palTag; /* 0x44 */\n};\n\nstruct HpBarObjs\n{\n    struct Sprite *sprites[10]; /* 0x00 */\n    u16 xpos[10]; /* 0x28 */\n    u16 tileTag; /* 0x3c */\n    u16 palTag; /* 0x3e */\n};\n\nstruct MonPicBounceState\n{\n    u8 ALIGNED(4) animFrame; /* 0x00 */\n    u8 ALIGNED(4) initDelay; /* 0x04 */\n    u8 ALIGNED(4) vigor; /* 0x08 */\n};\n\nstruct MoveSelectionCursor\n{\n    struct Sprite *sprite; /* 0x00 */\n    u16 whichSprite; /* 0x04 */\n    u16 tileTag; /* 0x06 */\n    u16 palTag; /* 0x08 */\n};\n\nstruct MonStatusIconObj\n{\n    struct Sprite *sprite; /* 0x00 */\n    u16 tileTag; /* 0x04 */\n    u16 palTag; /* 0x06 */\n};\n\nstruct PokerusIconObj\n{\n    struct Sprite *sprite; /* 0x00 */\n    u16 tileTag; /* 0x04 */\n    u16 palTag; /* 0x06 */\n};\n\nstruct ShinyStarObjData\n{\n    struct Sprite *sprite; /* 0x00 */\n    u16 tileTag; /* 0x04 */\n    u16 palTag; /* 0x06 */\n};\n\nstatic EWRAM_DATA struct PokemonSummaryScreenData * sMonSummaryScreen = NULL;\nstatic EWRAM_DATA struct Struct203B144 * sMonSkillsPrinterXpos = NULL;\nstatic EWRAM_DATA struct MoveSelectionCursor * sMoveSelectionCursorObjs[4] = {};\nstatic EWRAM_DATA struct MonStatusIconObj * sStatusIcon = NULL;\nstatic EWRAM_DATA struct HpBarObjs * sHpBarObjs = NULL;\nstatic EWRAM_DATA struct ExpBarObjs * sExpBarObjs = NULL;\nstatic EWRAM_DATA struct PokerusIconObj * sPokerusIconObj = NULL;\nstatic EWRAM_DATA struct ShinyStarObjData * sShinyStarObjData = NULL;\nstatic EWRAM_DATA u8 sLastViewedMonIndex = 0;\nstatic EWRAM_DATA u8 sMoveSelectionCursorPos = 0;\nstatic EWRAM_DATA u8 sMoveSwapCursorPos = 0;\nstatic EWRAM_DATA struct MonPicBounceState * sMonPicBounceState = NULL;\n\nextern const u32 gSummaryScreen_PageSkills_Tilemap[];\nextern const u32 gSummaryScreen_PageMoves_Tilemap[];\nextern const u32 gSummaryScreen_PageInfo_Tilemap[];\nextern const u32 gSummaryScreen_PageMovesInfo_Tilemap[];\nextern const u32 gSummaryScreen_PageEgg_Tilemap[];\nextern const u16 gSummaryScreen_Bg_Pal[];\nextern const u32 gSummaryScreen_Bg_Gfx[];\nextern const u16 gSummaryScreen_HpExpBar_Pal[];\nextern const u32 gSummaryScreen_StatusAilmentIcon_Gfx[];\nextern const u16 gSummaryScreen_StatusAilmentIcon_Pal[];\nextern const u32 gSummaryScreen_HpBar_Gfx[];\nextern const u32 gSummaryScreen_ExpBar_Gfx[];\n\nstatic const u32 sTextHeaderPalette[] = INCBIN_U32(\"graphics/summary_screen/text_header.gbapal\");\nstatic const u16 sMonMarkingSpritePalette[] = INCBIN_U16(\"graphics/summary_screen/marking.gbapal\");\nstatic const u32 sTextMovesPalette[] = INCBIN_U32(\"graphics/summary_screen/text_moves.gbapal\");\nstatic const u16 sMoveSelectionCursorPals[] = INCBIN_U16(\"graphics/summary_screen/move_selection_cursor.gbapal\");\nstatic const u32 sMoveSelectionCursorTiles_Left[] = INCBIN_U32(\"graphics/summary_screen/move_selection_cursor_left.4bpp.lz\");\nstatic const u32 sMoveSelectionCursorTiles_Right[] = INCBIN_U32(\"graphics/summary_screen/move_selection_cursor_right.4bpp.lz\");\n\nstatic const struct OamData sMoveSelectionCursorOamData =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(64x32),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(64x32),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sMoveSelectionCursorOamAnim_Red[] = \n{\n    ANIMCMD_FRAME(0, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sMoveSelectionCursorOamAnim_Blue[] = \n{\n    ANIMCMD_FRAME(0x20, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd * const sMoveSelectionCursorOamAnimTable[] =\n{\n    sMoveSelectionCursorOamAnim_Red,\n    sMoveSelectionCursorOamAnim_Blue\n};\n\nstatic const struct OamData sStatusAilmentIconOamData = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(32x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(32x8),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sStatusAilmentIconAnim_PSN[] = \n{\n    ANIMCMD_FRAME(0, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sStatusAilmentIconAnim_PRZ[] = \n{\n    ANIMCMD_FRAME(4, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sStatusAilmentIconAnim_SLP[] = \n{\n    ANIMCMD_FRAME(8, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sStatusAilmentIconAnim_FRZ[] = \n{\n    ANIMCMD_FRAME(12, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sStatusAilmentIconAnim_BRN[] = \n{\n    ANIMCMD_FRAME(16, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sStatusAilmentIconAnim_PKRS[] = \n{\n    ANIMCMD_FRAME(20, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sStatusAilmentIconAnim_FNT[] = \n{\n    ANIMCMD_FRAME(24, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sStatusAilmentIconAnim_Blank[] = \n{\n    ANIMCMD_FRAME(28, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd * const sStatusAilmentIconAnimTable[] =\n{\n    sStatusAilmentIconAnim_PSN,\n    sStatusAilmentIconAnim_PRZ,\n    sStatusAilmentIconAnim_SLP,\n    sStatusAilmentIconAnim_FRZ,\n    sStatusAilmentIconAnim_BRN,\n    sStatusAilmentIconAnim_PKRS,\n    sStatusAilmentIconAnim_FNT,\n    sStatusAilmentIconAnim_Blank\n};\n\nstatic const struct OamData sHpOrExpBarOamData = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sHpOrExpAnim_0[] = \n{\n    ANIMCMD_FRAME(0, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sHpOrExpAnim_1[] = \n{\n    ANIMCMD_FRAME(1, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sHpOrExpAnim_2[] = \n{\n    ANIMCMD_FRAME(2, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sHpOrExpAnim_3[] = \n{\n    ANIMCMD_FRAME(3, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sHpOrExpAnim_4[] = \n{\n    ANIMCMD_FRAME(4, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sHpOrExpAnim_5[] = \n{\n    ANIMCMD_FRAME(5, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sHpOrExpAnim_6[] = \n{\n    ANIMCMD_FRAME(6, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sHpOrExpAnim_7[] = \n{\n    ANIMCMD_FRAME(7, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sHpOrExpAnim_8[] = \n{\n    ANIMCMD_FRAME(8, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sHpOrExpAnim_9[] = \n{\n    ANIMCMD_FRAME(9, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sHpOrExpAnim_10[] = \n{\n    ANIMCMD_FRAME(10, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd sHpOrExpAnim_11[] = \n{\n    ANIMCMD_FRAME(11, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd * const sHpOrExpBarAnimTable[] =\n{\n    sHpOrExpAnim_0,\n    sHpOrExpAnim_1,\n    sHpOrExpAnim_2,\n    sHpOrExpAnim_3,\n    sHpOrExpAnim_4,\n    sHpOrExpAnim_5,\n    sHpOrExpAnim_6,\n    sHpOrExpAnim_7,\n    sHpOrExpAnim_8,\n    sHpOrExpAnim_9,\n    sHpOrExpAnim_10,\n    sHpOrExpAnim_11\n};\n\nstatic const u16 sPokeSummary_HpBarPalYellow[] = INCBIN_U16(\"graphics/summary_screen/hp_bar_yellow.gbapal\");\nstatic const u16 sPokeSummary_HpBarPalRed[] = INCBIN_U16(\"graphics/summary_screen/hp_bar_red.gbapal\");\n\nstatic const struct OamData sPokerusIconObjOamData = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sPokerusIconObjAnim0[] = \n{\n    ANIMCMD_FRAME(0, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd * const sPokerusIconObjAnimTable[] =\n{\n    sPokerusIconObjAnim0\n};\n\nstatic const u16 sPokerusIconObjPal[] = INCBIN_U16(\"graphics/summary_screen/pokerus_cured.gbapal\");\nstatic const u32 sPokerusIconObjTiles[] = INCBIN_U32(\"graphics/summary_screen/pokerus_cured.4bpp.lz\");\n\nstatic const struct OamData sStarObjOamData =\n{\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(8x8),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(8x8),\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sStarObjAnim0[] = \n{\n    ANIMCMD_FRAME(1, 20),\n    ANIMCMD_JUMP(0),\n};\n\nstatic const union AnimCmd * const sStarObjAnimTable[] =\n{\n    sStarObjAnim0\n};\n\nstatic const u16 sStarObjPal[] = INCBIN_U16( \"graphics/summary_screen/shiny_star.gbapal\");\nstatic const u32 sStarObjTiles[] = INCBIN_U32( \"graphics/summary_screen/shiny_star.4bpp.lz\");\nstatic const u32 sBgTilemap_MovesInfoPage[] = INCBIN_U32( \"graphics/summary_screen/moves_info_page.bin.lz\");\nstatic const u32 sBgTilemap_MovesPage[] = INCBIN_U32( \"graphics/summary_screen/moves_page.bin.lz\");\n\n#include \"data/text/nature_names.h\"\n\nstatic const u8 *const sEggHatchTimeTexts[] = {\n    gText_PokeSum_EggHatch_LongTime,\n    gText_PokeSum_EggHatch_SomeTime,\n    gText_PokeSum_EggHatch_Soon, \n    gText_PokeSum_EggHatch_AlmostReady\n};\n\nstatic const u8 *const sEggOriginTexts[] = {\n    gText_PokeSum_EggOrigin_DayCare,      \n    gText_PokeSum_EggOrigin_Trade,\n    gText_PokeSum_EggOrigin_TravelingMan, \n    gText_PokeSum_EggOrigin_Trade,\n    gText_PokeSum_EggOrigin_NicePlace,\n    gText_PokeSum_EggOrigin_Spa,\n    gText_PokeSum_EggOrigin_Trade\n};\n\nstatic const u8 sPrintMoveTextColors[][3] = {\n    {0, 7, 8},\n    {0, 1, 2},\n    {0, 3, 4},\n    {0, 5, 6}\n};\n\nstatic const struct BgTemplate sBgTempaltes[] = \n{\n\t {\n\t \t.bg = 0,\n\t \t.charBaseIndex = 0,\n\t \t.mapBaseIndex = 14,\n\t \t.screenSize = 1,\n\t \t.paletteMode = 0,\n\t \t.priority = 0,\n\t \t.baseTile = 0x0000\n\t },\n\t {\n\t \t.bg = 2,\n\t \t.charBaseIndex = 2,\n\t \t.mapBaseIndex = 10,\n\t \t.screenSize = 1,\n\t \t.paletteMode = 0,\n\t \t.priority = 1,\n\t \t.baseTile = 0x0000\n\t },\n\t {\n\t \t.bg = 3,\n\t \t.charBaseIndex = 2,\n\t \t.mapBaseIndex = 9,\n\t \t.screenSize = 0,\n\t \t.paletteMode = 0,\n\t \t.priority = 3,\n\t \t.baseTile = 0x0000\n\t },\n\t {\n\t \t.bg = 1,\n\t \t.charBaseIndex = 2,\n\t \t.mapBaseIndex = 12,\n\t \t.screenSize = 1,\n\t \t.paletteMode = 0,\n\t \t.priority = 2,\n\t \t.baseTile = 0x0000\n\t }\n};\n\n#define POKESUM_WIN_PAGE_NAME        0\n#define POKESUM_WIN_CONTROLS         1\n#define POKESUM_WIN_LVL_NICK         2\n#define POKESUM_WIN_RIGHT_PANE       3\n#define POKESUM_WIN_TRAINER_MEMO     4\n\n#define POKESUM_WIN_INFO_3           3\n#define POKESUM_WIN_INFO_4           4\n#define POKESUM_WIN_INFO_5           5\n#define POKESUM_WIN_INFO_6           6\n\n#define POKESUM_WIN_SKILLS_3         3\n#define POKESUM_WIN_SKILLS_4         4\n#define POKESUM_WIN_SKILLS_5         5\n#define POKESUM_WIN_SKILLS_6         6\n\n#define POKESUM_WIN_MOVES_3          3\n#define POKESUM_WIN_MOVES_4          4\n#define POKESUM_WIN_MOVES_5          5\n#define POKESUM_WIN_MOVES_6          6\n\nstatic const struct WindowTemplate sWindowTemplates_Permanent_Bg1[] =\n{\n    [POKESUM_WIN_PAGE_NAME] = {\n        .bg = 1,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 13,\n        .height = 2,\n        .paletteNum = 7,\n        .baseBlock = 0x0258\n    },\n    [POKESUM_WIN_CONTROLS] = {\n        .bg = 1,\n        .tilemapLeft = 19,\n        .tilemapTop = 0,\n        .width = 11,\n        .height = 2,\n        .paletteNum = 7,\n        .baseBlock = 0x0272\n    },\n    [POKESUM_WIN_LVL_NICK] = {\n        .bg = 1,\n        .tilemapLeft = 0,\n        .tilemapTop = 2,\n        .width = 15,\n        .height = 2,\n        .paletteNum = 7,\n        .baseBlock = 0x0288\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates_Permanent_Bg2[] = \n{\n    {\n        .bg = 2,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 13,\n        .height = 2,\n        .paletteNum = 7,\n        .baseBlock = 0x0258\n    },\n    {\n        .bg = 2,\n        .tilemapLeft = 19,\n        .tilemapTop = 0,\n        .width = 11,\n        .height = 2,\n        .paletteNum = 7,\n        .baseBlock = 0x0272\n    },\n    {\n        .bg = 2,\n        .tilemapLeft = 0,\n        .tilemapTop = 2,\n        .width = 15,\n        .height = 2,\n        .paletteNum = 7,\n        .baseBlock = 0x0288\n    },\n};\n\nstatic const struct WindowTemplate sWindowTemplates_Info[] = \n{\n    [POKESUM_WIN_INFO_3 - 3] = {\n        .bg = 0,\n        .tilemapLeft = 15,\n        .tilemapTop = 2,\n        .width = 15,\n        .height = 12,\n        .paletteNum = 6,\n        .baseBlock = 0x0001\n    },\n    [POKESUM_WIN_INFO_4 - 3] = {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 14,\n        .width = 28,\n        .height = 6,\n        .paletteNum = 6,\n        .baseBlock = 0x00b5\n    },\n    [POKESUM_WIN_INFO_5 - 3] = {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 0,\n        .height = 0,\n        .paletteNum = 0,\n        .baseBlock = 0x0000\n    },\n    [POKESUM_WIN_INFO_6 - 3] = {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 0,\n        .height = 0,\n        .paletteNum = 0,\n        .baseBlock = 0x0000\n    },\n};\n\nstatic const struct WindowTemplate sWindowTemplates_Skills[] = \n{\n    [POKESUM_WIN_SKILLS_3 - 3] = {\n        .bg = 0,\n        .tilemapLeft = 20,\n        .tilemapTop = 2,\n        .width = 10,\n        .height = 14,\n        .paletteNum = 6,\n        .baseBlock = 0x0001\n    },\n    [POKESUM_WIN_SKILLS_4 - 3] = {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 12,\n        .width = 14,\n        .height = 4,\n        .paletteNum = 6,\n        .baseBlock = 0x008d\n    },\n    [POKESUM_WIN_SKILLS_5 - 3] = {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 16,\n        .width = 29,\n        .height = 4,\n        .paletteNum = 6,\n        .baseBlock = 0x00c5\n    },\n    [POKESUM_WIN_SKILLS_6 - 3] = {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 0,\n        .height = 0,\n        .paletteNum = 0,\n        .baseBlock = 0x0000\n    },\n};\n\nstatic const struct WindowTemplate sWindowTemplates_Moves[] = \n{\n    [POKESUM_WIN_MOVES_3 - 3] = {\n        .bg = 0,\n        .tilemapLeft = 20,\n        .tilemapTop = 2,\n        .width = 10,\n        .height = 18,\n        .paletteNum = 8,\n        .baseBlock = 0x0001\n    },\n    [POKESUM_WIN_MOVES_4 - 3] = {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 7,\n        .width = 15,\n        .height = 13,\n        .paletteNum = 6,\n        .baseBlock = 0x00b5\n    },\n    [POKESUM_WIN_MOVES_5 - 3] = {\n        .bg = 0,\n        .tilemapLeft = 15,\n        .tilemapTop = 2,\n        .width = 5,\n        .height = 18,\n        .paletteNum = 6,\n        .baseBlock = 0x0178\n    },\n    [POKESUM_WIN_MOVES_6 - 3] = {\n        .bg = 0,\n        .tilemapLeft = 6,\n        .tilemapTop = 4,\n        .width = 9,\n        .height = 2,\n        .paletteNum = 6,\n        .baseBlock = 0x01d2\n    },\n};\n\nstatic const struct WindowTemplate sWindowTemplates_Dummy[] = \n{\n    {\n        .bg = 255,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 0,\n        .height = 0,\n        .paletteNum = 0,\n        .baseBlock = 0x0000\n    },\n};\n\n\nstatic const u8 sLevelNickTextColors[][3] =\n{\n    {0, 14, 10},\n    {0, 1, 2},\n    {0, 9, 8},\n    {0, 5, 4},\n    {0, 2, 3},\n    {0, 11, 10},\n};\n\nstatic const u8 ALIGNED(4) sMultiBattlePartyOrder[] =\n{\n    0, 2, 3, 1, 4, 5\n};\n\nstatic const s8 sMonPicBounceYDelta_Under60[] =\n{\n    -1, 0, 1\n};\n\nstatic const s8 sMonPicBounceYDelta_60to80[] =\n{\n    -2, -1, 0, 1, 2\n};\n\nstatic const s8 sMonPicBounceYDelta_80to99[] =\n{\n    -3, -2, -1, 0, 1, 2, 3\n};\n\nstatic const s8 sMonPicBounceYDelta_Full[] =\n{\n    -5, -3, -1, 0, 1, 3, 5\n};\n\nstatic const s8 sEggPicShakeXDelta_ItWillTakeSomeTime[] =\n{\n    1, 1, 0, -1, -1, 0, -1, -1, 0, 1, 1\n};\n\nstatic const s8 sEggPicShakeXDelta_OccasionallyMoves[] =\n{\n    2, 1, 0, -1, -2, 0, -2, -1, 0, 1, 2\n};\n\nstatic const s8 sEggPicShakeXDelta_AlmostReadyToHatch[] =\n{\n    2, 1, 1, 0, -1, -1, -2, 0, -2, -1, -1, 0, 1, 1, 2\n};\n\nstatic const u16 * const sHpBarPals[] =\n{\n    gSummaryScreen_HpExpBar_Pal,\n    sPokeSummary_HpBarPalYellow,\n    sPokeSummary_HpBarPalRed,\n};\n\n\n#define FREE_AND_SET_NULL_IF_SET(ptr) \\\n{                                     \\\n    if (ptr != NULL)                  \\\n    {                                 \\\n        free(ptr);                    \\\n        (ptr) = NULL;                 \\\n    }                                 \\\n}\n\nvoid ShowPokemonSummaryScreen(struct Pokemon * party, u8 cursorPos, u8 lastIdx, MainCallback savedCallback, u8 mode)\n{\n    sMonSummaryScreen = AllocZeroed(sizeof(struct PokemonSummaryScreenData));\n    sMonSkillsPrinterXpos = AllocZeroed(sizeof(struct Struct203B144));\n\n    if (sMonSummaryScreen == NULL)\n    {\n        SetMainCallback2(savedCallback);\n        return;\n    }\n\n    sLastViewedMonIndex = cursorPos;\n\n    sMoveSelectionCursorPos = 0;\n    sMoveSwapCursorPos = 0;\n    sMonSummaryScreen->savedCallback = savedCallback;\n    sMonSummaryScreen->monList.mons = party;\n\n    if (party == gEnemyParty)\n        sMonSummaryScreen->isEnemyParty = TRUE;\n    else\n        sMonSummaryScreen->isEnemyParty = FALSE;\n\n    sMonSummaryScreen->lastIndex = lastIdx;\n    sMonSummaryScreen->mode = mode;\n\n    switch (sMonSummaryScreen->mode)\n    {\n    case PSS_MODE_NORMAL:\n    default:\n        SetHelpContext(HELPCONTEXT_POKEMON_INFO);\n        sMonSummaryScreen->curPageIndex = PSS_PAGE_INFO;\n        sMonSummaryScreen->isBoxMon = FALSE;\n        sMonSummaryScreen->lockMovesFlag = FALSE;\n        break;\n    case PSS_MODE_BOX:\n        SetHelpContext(HELPCONTEXT_POKEMON_INFO);\n        sMonSummaryScreen->curPageIndex = PSS_PAGE_INFO;\n        sMonSummaryScreen->isBoxMon = TRUE;\n        sMonSummaryScreen->lockMovesFlag = FALSE;\n        break;\n    case PSS_MODE_SELECT_MOVE:\n    case PSS_MODE_FORGET_MOVE:\n        SetHelpContext(HELPCONTEXT_POKEMON_MOVES);\n        sMonSummaryScreen->curPageIndex = PSS_PAGE_MOVES_INFO;\n        sMonSummaryScreen->isBoxMon = FALSE;\n        sMonSummaryScreen->lockMovesFlag = TRUE;\n        break;\n    }\n\n    sMonSummaryScreen->state3270 = 0;\n    sMonSummaryScreen->summarySetupStep = 0;\n    sMonSummaryScreen->loadBgGfxStep = 0;\n    sMonSummaryScreen->spriteCreationStep = 0;\n\n    sMonSummaryScreen->whichBgLayerToTranslate = 0;\n    sMonSummaryScreen->skillsPageBgNum = 2;\n    sMonSummaryScreen->infoAndMovesPageBgNum = 1;\n    sMonSummaryScreen->flippingPages = FALSE;\n\n    sMonSummaryScreen->unk3228 = 0;\n    sMonSummaryScreen->unk322C = 1;\n\n    BufferSelectedMonData(&sMonSummaryScreen->currentMon);\n    sMonSummaryScreen->isEgg = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_IS_EGG);\n    sMonSummaryScreen->isBadEgg = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SANITY_IS_BAD_EGG);\n\n    if (sMonSummaryScreen->isBadEgg == TRUE)\n        sMonSummaryScreen->isEgg = TRUE;\n\n    sMonSummaryScreen->lastPageFlipDirection = 0xff;\n    SetMainCallback2(CB2_SetUpPSS);\n}\n\nvoid ShowSelectMovePokemonSummaryScreen(struct Pokemon * party, u8 cursorPos, u8 lastIdx, MainCallback savedCallback, u16 a4)\n{\n    ShowPokemonSummaryScreen(party, cursorPos, lastIdx, savedCallback, PSS_MODE_SELECT_MOVE);\n    sMonSummaryScreen->moveIds[4] = a4;\n}\n\nstatic u8 PageFlipInputIsDisabled(u8 direction)\n{\n    if (sMonSummaryScreen->inhibitPageFlipInput == TRUE && sMonSummaryScreen->pageFlipDirection != direction)\n        return TRUE;\n\n    return FALSE;\n}\n\nbool32 IsPageFlipInput(u8 direction)\n{\n    if (sMonSummaryScreen->isEgg)\n        return FALSE;\n\n    if (sMonSummaryScreen->lastPageFlipDirection != 0xff && sMonSummaryScreen->lastPageFlipDirection == direction)\n    {\n        sMonSummaryScreen->lastPageFlipDirection = 0xff;\n        return TRUE;\n    }\n\n    if (PageFlipInputIsDisabled(direction))\n        return FALSE;\n\n    switch (direction)\n    {\n    case 1:\n        if (JOY_NEW(DPAD_RIGHT))\n            return TRUE;\n\n        if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR && JOY_NEW(R_BUTTON))\n            return TRUE;\n\n        break;\n    case 0:\n        if (JOY_NEW(DPAD_LEFT))\n            return TRUE;\n\n        if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR && JOY_NEW(L_BUTTON))\n            return TRUE;\n\n        break;\n    }\n\n    return FALSE;\n}\n\nstatic void Task_InputHandler_Info(u8 taskId)\n{\n    switch (sMonSummaryScreen->state3270) {\n    case PSS_STATE3270_FADEIN:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0);\n        sMonSummaryScreen->state3270 = PSS_STATE3270_PLAYCRY;\n        break;\n    case PSS_STATE3270_PLAYCRY:\n        if (!gPaletteFade.active)\n        {\n            PokeSum_TryPlayMonCry();\n            sMonSummaryScreen->state3270 = PSS_STATE3270_HANDLEINPUT;\n            return;\n        }\n\n        sMonSummaryScreen->state3270 = PSS_STATE3270_PLAYCRY;\n        break;\n    case PSS_STATE3270_HANDLEINPUT:\n        if (IsActiveOverworldLinkBusy() == TRUE)\n            return;\n        else if (IsLinkRecvQueueAtOverworldMax() == TRUE)\n            return;\n        else if (FuncIsActiveTask(Task_PokeSum_SwitchDisplayedPokemon))\n            return;\n\n        if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)\n        {\n            if (IsPageFlipInput(1) == TRUE)\n            {\n                if (FuncIsActiveTask(Task_PokeSum_FlipPages))\n                {\n                    sMonSummaryScreen->lastPageFlipDirection = 1;\n                    return;\n                }\n                else if (sMonSummaryScreen->curPageIndex < PSS_PAGE_MOVES)\n                {\n                    PlaySE(SE_SELECT);\n                    HideBg(0);\n                    sMonSummaryScreen->pageFlipDirection = 1;\n                    PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex);\n                    sMonSummaryScreen->curPageIndex++;\n                    sMonSummaryScreen->state3270 = PSS_STATE3270_FLIPPAGES;\n                }\n                return;\n            }\n            else if (IsPageFlipInput(0) == TRUE)\n            {\n                if (FuncIsActiveTask(Task_PokeSum_FlipPages))\n                {\n                    sMonSummaryScreen->lastPageFlipDirection = 0;\n                    return;\n                }\n                else if (sMonSummaryScreen->curPageIndex > PSS_PAGE_INFO)\n                {\n                    PlaySE(SE_SELECT);\n                    HideBg(0);\n                    sMonSummaryScreen->pageFlipDirection = 0;\n                    PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex);\n                    sMonSummaryScreen->curPageIndex--;\n                    sMonSummaryScreen->state3270 = PSS_STATE3270_FLIPPAGES;\n                }\n                return;\n            }\n        }\n\n        if ((!FuncIsActiveTask(Task_PokeSum_FlipPages)) || FuncIsActiveTask(Task_PokeSum_SwitchDisplayedPokemon))\n        {\n            if (JOY_NEW(DPAD_UP))\n            {\n                PokeSum_SeekToNextMon(taskId, -1);\n                return;\n            }\n            else if (JOY_NEW(DPAD_DOWN))\n            {\n                PokeSum_SeekToNextMon(taskId, 1);\n                return;\n            }\n            else if (JOY_NEW(A_BUTTON))\n            {\n                if (sMonSummaryScreen->curPageIndex == PSS_PAGE_INFO)\n                {\n                    PlaySE(SE_SELECT);\n                    sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_FADEOUT;\n                }\n                else if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES)\n                {\n                    PlaySE(SE_SELECT);\n                    sMonSummaryScreen->pageFlipDirection = 1;\n                    PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex);\n                    sMonSummaryScreen->curPageIndex++;\n                    sMonSummaryScreen->state3270 = PSS_STATE3270_FLIPPAGES;\n                }\n                return;\n            }\n            else if (JOY_NEW(B_BUTTON))\n            {\n                sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_FADEOUT;\n            }\n        }\n        break;\n    case PSS_STATE3270_FLIPPAGES:\n        if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)\n        {\n            CreateTask(Task_PokeSum_FlipPages, 0);\n            sMonSummaryScreen->state3270 = PSS_STATE3270_HANDLEINPUT;\n        }\n        else\n        {\n            gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_FlipPages_FromInfo;\n            sMonSummaryScreen->state3270 = PSS_STATE3270_HANDLEINPUT;\n        }\n        break;\n    case PSS_STATE3270_ATEXIT_FADEOUT:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0);\n        sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_WAITLINKDELAY;\n        break;\n    case PSS_STATE3270_ATEXIT_WAITLINKDELAY:\n        if (Overworld_LinkRecvQueueLengthMoreThan2() == TRUE)\n            return;\n        else if (IsLinkRecvQueueAtOverworldMax() == TRUE)\n            return;\n\n        sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_WAITFADE;\n        break;\n    default:\n        if (!gPaletteFade.active)\n            Task_DestroyResourcesOnExit(taskId);\n\n        break;\n    }\n}\n\nstatic void Task_PokeSum_FlipPages(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    switch (data[0])\n    {\n    case 0:\n        PokeSum_HideSpritesBeforePageFlip();\n        PokeSum_ShowSpritesBeforePageFlip();\n        sMonSummaryScreen->lockMovesFlag = TRUE;\n        sMonSummaryScreen->inhibitPageFlipInput = TRUE;\n        PokeSum_UpdateWin1ActiveFlag(sMonSummaryScreen->curPageIndex);\n        PokeSum_AddWindows(sMonSummaryScreen->curPageIndex);\n        break;\n    case 1:\n        if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)\n        {\n            if (!(sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES && sMonSummaryScreen->pageFlipDirection == 0))\n            {\n                FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);\n                CopyBgTilemapBufferToVram(0);\n            }\n        }\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 2);\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 15, 2);\n        FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 2);\n        FillBgTilemapBufferRect_Palette0(2, 0, 0, 2, 15, 2);\n        break;\n    case 2:\n        PokeSum_CopyNewBgTilemapBeforePageFlip_2();\n        PokeSum_CopyNewBgTilemapBeforePageFlip();\n        PokeSum_DrawPageProgressTiles();\n        PokeSum_PrintPageHeaderText(sMonSummaryScreen->curPageIndex);\n        break;\n    case 3:\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2);\n        break;\n    case 4:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            CopyBgTilemapBufferToVram(3);\n            CopyBgTilemapBufferToVram(2);\n            CopyBgTilemapBufferToVram(1);\n        }\n        else\n            return;\n\n        break;\n    case 5:\n        PokeSum_InitBgCoordsBeforePageFlips();\n        sMonSummaryScreen->flippingPages = TRUE;\n        break;\n    case 6:\n        if (!PokeSum_IsPageFlipFinished(sMonSummaryScreen->pageFlipDirection))\n            return;\n\n        break;\n    case 7:\n        PokeSum_PrintRightPaneText();\n        if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)\n            PokeSum_PrintBottomPaneText();\n\n        PokeSum_PrintAbilityDataOrMoveTypes();\n        PokeSum_PrintMonTypeIcons();\n        break;\n    case 8:\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);\n        break;\n    case 9:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            CopyBgTilemapBufferToVram(0);\n            ShowBg(0);\n        }\n        else\n            return;\n\n        break;\n    default:\n        PokeSum_SetHelpContext();\n\n        if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)\n            gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_HandleInput_SelectMove;\n\n        DestroyTask(taskId);\n        data[0] = 0;\n        sMonSummaryScreen->lockMovesFlag = FALSE;\n        sMonSummaryScreen->inhibitPageFlipInput = FALSE;\n        return;\n    }\n\n    data[0]++;\n}\n\nstatic void Task_FlipPages_FromInfo(u8 taskId)\n{\n    switch (sMonSummaryScreen->state3284)\n    {\n    case 0:\n        sMonSummaryScreen->lockMovesFlag = TRUE;\n        sMonSummaryScreen->inhibitPageFlipInput = TRUE;\n        PokeSum_AddWindows(sMonSummaryScreen->curPageIndex);\n        break;\n    case 1:\n        if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)\n        {\n            if (!(sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES && sMonSummaryScreen->pageFlipDirection == 0))\n            {\n                FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);\n                CopyBgTilemapBufferToVram(0);\n            }\n        }\n\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 2);\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 15, 2);\n        FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 2);\n        FillBgTilemapBufferRect_Palette0(2, 0, 0, 2, 15, 2);\n        break;\n    case 2:\n        PokeSum_HideSpritesBeforePageFlip();\n        PokeSum_UpdateWin1ActiveFlag(sMonSummaryScreen->curPageIndex);\n        PokeSum_CopyNewBgTilemapBeforePageFlip();\n        PokeSum_DrawPageProgressTiles();\n        PokeSum_CopyNewBgTilemapBeforePageFlip_2();\n        break;\n    case 3:\n        PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves);\n        if (!(gMain.inBattle || gReceivedRemoteLinkPlayers))\n            PokeSum_PrintControlsString(gText_PokeSum_Controls_PickSwitch);\n        else\n            PokeSum_PrintControlsString(gText_PokeSum_Controls_Pick);\n\n        break;\n    case 4:\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2);\n        break;\n    case 5:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            CopyBgTilemapBufferToVram(2);\n            CopyBgTilemapBufferToVram(1);\n            CopyBgTilemapBufferToVram(3);\n        }\n        else\n            return;\n\n        break;\n    case 6:\n        PokeSum_PrintRightPaneText();\n        PokeSum_PrintAbilityDataOrMoveTypes();\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);\n        break;\n    case 7:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            CopyBgTilemapBufferToVram(0);\n            PokeSum_InitBgCoordsBeforePageFlips();\n            sMonSummaryScreen->flippingPages = TRUE;\n        }\n        else\n            return;\n\n        break;\n    case 8:\n        if (!PokeSum_IsPageFlipFinished(sMonSummaryScreen->pageFlipDirection))\n            return;\n\n        PokeSum_PrintBottomPaneText();\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);\n        break;\n    case 9:\n        PokeSum_PrintMonTypeIcons();\n        PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);\n        break;\n    case 10:\n        PokeSum_ShowSpritesBeforePageFlip();\n        CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2);\n        break;\n    case 11:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            CopyBgTilemapBufferToVram(0);\n            CopyBgTilemapBufferToVram(2);\n            CopyBgTilemapBufferToVram(1);\n        }\n        else\n            return;\n\n        break;\n    default:\n        PokeSum_SetHelpContext();\n        gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_HandleInput_SelectMove;\n        sMonSummaryScreen->state3284 = 0;\n        sMonSummaryScreen->lockMovesFlag = FALSE;\n        sMonSummaryScreen->inhibitPageFlipInput = FALSE;\n        return;\n    }\n\n    sMonSummaryScreen->state3284++;\n    return;\n}\n\nstatic void Task_BackOutOfSelectMove(u8 taskId)\n{\n    switch (sMonSummaryScreen->state3284)\n    {\n    case 0:\n        sMonSummaryScreen->lockMovesFlag = TRUE;\n        sMonSummaryScreen->inhibitPageFlipInput = TRUE;\n        PokeSum_AddWindows(sMonSummaryScreen->curPageIndex);\n        break;\n    case 1:\n        if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO) {\n            if (!(sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES && sMonSummaryScreen->pageFlipDirection == 0))\n            {\n                FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);\n                CopyBgTilemapBufferToVram(0);\n            }\n        }\n\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 2);\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 15, 2);\n        FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 2);\n        FillBgTilemapBufferRect_Palette0(2, 0, 0, 2, 15, 2);\n        break;\n    case 2:\n        PokeSum_CopyNewBgTilemapBeforePageFlip_2();\n        break;\n    case 3:\n        PokeSum_PrintRightPaneText();\n        PokeSum_PrintBottomPaneText();\n        PokeSum_PrintAbilityDataOrMoveTypes();\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);\n        CopyBgTilemapBufferToVram(0);\n        break;\n    case 4:\n        PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves);\n        PokeSum_PrintControlsString(gText_PokeSum_Controls_PageDetail);\n        break;\n    case 5:\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        break;\n    case 6:\n        PokeSum_InitBgCoordsBeforePageFlips();\n        sMonSummaryScreen->flippingPages = TRUE;\n        PokeSum_HideSpritesBeforePageFlip();\n        PokeSum_UpdateWin1ActiveFlag(sMonSummaryScreen->curPageIndex);\n        PokeSum_PrintMonTypeIcons();\n        break;\n    case 7:\n        break;\n    case 8:\n        if (PokeSum_IsPageFlipFinished(sMonSummaryScreen->pageFlipDirection) == 0)\n            return;\n\n        PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);\n        break;\n    case 9:\n        CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2);\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        break;\n    case 10:\n        PokeSum_CopyNewBgTilemapBeforePageFlip();\n        PokeSum_DrawPageProgressTiles();\n        CopyBgTilemapBufferToVram(3);\n        PokeSum_ShowSpritesBeforePageFlip();\n        break;\n    default:\n        PokeSum_SetHelpContext();\n        gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_InputHandler_Info;\n        sMonSummaryScreen->state3284 = 0;\n        sMonSummaryScreen->lockMovesFlag = FALSE;\n        sMonSummaryScreen->inhibitPageFlipInput = FALSE;\n        return;\n    }\n\n    sMonSummaryScreen->state3284++;\n    return;\n}\n\nstatic void PokeSum_SetHpExpBarCoordsFullRight(void)\n{\n    u32 i;\n    for (i = 0; i < 11; i++)\n    {\n        sExpBarObjs->xpos[i] = (8 * i) + 396;\n        sExpBarObjs->sprites[i]->x = sExpBarObjs->xpos[i];\n        if (i >= 9)\n            continue;\n\n        sHpBarObjs->xpos[i] = (8 * i) + 412;\n        sHpBarObjs->sprites[i]->x = sHpBarObjs->xpos[i];\n    }\n}\n\nstatic void PokeSum_SetHpExpBarCoordsFullLeft(void)\n{\n    u32 i;\n    for (i = 0; i < 11; i++)\n    {\n        sExpBarObjs->xpos[i] = (8 * i) + 156;\n        sExpBarObjs->sprites[i]->x = sExpBarObjs->xpos[i];\n        if (i >= 9)\n            continue;\n        sHpBarObjs->xpos[i] = (8 * i) + 172;\n        sHpBarObjs->sprites[i]->x = sHpBarObjs->xpos[i];\n    }\n}\n\nstatic void PokeSum_InitBgCoordsBeforePageFlips(void)\n{\n    s8 pageDelta = 1;\n\n    if (sMonSummaryScreen->pageFlipDirection == 1)\n        pageDelta = -1;\n\n    if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)\n    {\n        sMonSummaryScreen->flipPagesBgHofs = 240;\n        return;\n    }\n\n    if ((sMonSummaryScreen->curPageIndex + pageDelta) == PSS_PAGE_MOVES_INFO)\n    {\n        PokeSum_UpdateBgPriorityForPageFlip(0, 0);\n        sMonSummaryScreen->flipPagesBgHofs = 0;\n        SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG2HOFS, 0);\n        return;\n    }\n\n    if (sMonSummaryScreen->pageFlipDirection == 1)\n    {\n        sMonSummaryScreen->flipPagesBgHofs = 0;\n        SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG2HOFS, 0);\n        PokeSum_UpdateBgPriorityForPageFlip(1, 1);\n    }\n    else\n    {\n        u32 bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3;\n        u32 bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3;\n        sMonSummaryScreen->flipPagesBgHofs = 240;\n\n        if (bg1Priority > bg2Priority)\n            SetGpuReg(REG_OFFSET_BG1HOFS, 240);\n        else\n            SetGpuReg(REG_OFFSET_BG2HOFS, 240);\n\n        SetGpuReg(REG_OFFSET_BG0HOFS, 240);\n        PokeSum_UpdateBgPriorityForPageFlip(1, 0);\n    }\n\n    if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS)\n    {\n        if (sMonSummaryScreen->pageFlipDirection == 1)\n            PokeSum_SetHpExpBarCoordsFullLeft();\n        else\n            PokeSum_SetHpExpBarCoordsFullRight();\n    }\n    else if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES)\n        PokeSum_SetHpExpBarCoordsFullLeft();\n\n}\n\nstatic void PokeSum_HideSpritesBeforePageFlip(void)\n{\n    u8 newPage;\n\n    if (sMonSummaryScreen->pageFlipDirection == 1)\n        newPage = sMonSummaryScreen->curPageIndex - 1;\n    else\n        newPage = sMonSummaryScreen->curPageIndex + 1;\n\n    switch (newPage)\n    {\n    case PSS_PAGE_INFO:\n        break;\n    case PSS_PAGE_SKILLS:\n        ShowOrHideHpBarObjs(TRUE);\n        ShowOrHideExpBarObjs(TRUE);\n        break;\n    case PSS_PAGE_MOVES:\n        if (sMonSummaryScreen->pageFlipDirection == 1)\n        {\n            PokeSum_ShowOrHideMonPicSprite(TRUE);\n            PokeSum_ShowOrHideMonMarkingsSprite(TRUE);\n            ShowOrHideBallIconObj(TRUE);\n            ShowOrHideStatusIcon(TRUE);\n            HideShowPokerusIcon(TRUE);\n            HideShowShinyStar(TRUE);\n        }\n\n        break;\n    case PSS_PAGE_MOVES_INFO:\n        ShoworHideMoveSelectionCursor(TRUE);\n        PokeSum_ShowOrHideMonIconSprite(TRUE);\n        ShowOrHideStatusIcon(TRUE);\n        HideShowPokerusIcon(TRUE);\n        HideShowShinyStar(TRUE);\n        break;\n    }\n}\n\nstatic void PokeSum_ShowSpritesBeforePageFlip(void)\n{\n    u8 newPage;\n\n    if (sMonSummaryScreen->pageFlipDirection == 1)\n        newPage = sMonSummaryScreen->curPageIndex - 1;\n    else\n        newPage = sMonSummaryScreen->curPageIndex + 1;\n\n    switch (newPage)\n    {\n    case PSS_PAGE_INFO:\n        ShowOrHideHpBarObjs(FALSE);\n        ShowOrHideExpBarObjs(FALSE);\n        break;\n    case PSS_PAGE_SKILLS:\n        break;\n    case PSS_PAGE_MOVES:\n        if (sMonSummaryScreen->pageFlipDirection == 0)\n        {\n            ShowOrHideHpBarObjs(FALSE);\n            ShowOrHideExpBarObjs(FALSE);\n        }\n        else\n        {\n            ShoworHideMoveSelectionCursor(FALSE);\n            HideShowPokerusIcon(FALSE);\n            PokeSum_ShowOrHideMonIconSprite(FALSE);\n            HideShowShinyStar(FALSE);\n        }\n\n        break;\n    case PSS_PAGE_MOVES_INFO:\n        PokeSum_ShowOrHideMonPicSprite(FALSE);\n        PokeSum_ShowOrHideMonMarkingsSprite(FALSE);\n        ShowOrHideStatusIcon(FALSE);\n        ShowOrHideBallIconObj(FALSE);\n        HideShowPokerusIcon(FALSE);\n        HideShowShinyStar(FALSE);\n        break;\n    }\n}\n\nstatic u8 PokeSum_IsPageFlipFinished(u8 a0)\n{\n    s8 pageDelta = 1;\n\n    if (sMonSummaryScreen->pageFlipDirection == 1)\n        pageDelta = -1;\n\n    if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)\n        if (sMonSummaryScreen->flipPagesBgHofs <= 0)\n        {\n            sMonSummaryScreen->flipPagesBgHofs = 0;\n            sMonSummaryScreen->whichBgLayerToTranslate ^= 1;\n            PokeSum_UpdateBgPriorityForPageFlip(0, 0);\n            sMonSummaryScreen->flippingPages = FALSE;\n            return TRUE;\n        }\n\n    if ((sMonSummaryScreen->curPageIndex + pageDelta) == PSS_PAGE_MOVES_INFO)\n        if (sMonSummaryScreen->flipPagesBgHofs >= 240)\n        {\n            sMonSummaryScreen->flipPagesBgHofs = 240;\n            sMonSummaryScreen->whichBgLayerToTranslate ^= 1;\n            sMonSummaryScreen->flippingPages = FALSE;\n            return TRUE;\n        }\n\n    if (sMonSummaryScreen->pageFlipDirection == 1)\n    {\n        if (sMonSummaryScreen->flipPagesBgHofs >= 240)\n        {\n            sMonSummaryScreen->flipPagesBgHofs = 240;\n            sMonSummaryScreen->whichBgLayerToTranslate ^= 1;\n            PokeSum_UpdateBgPriorityForPageFlip(0, 0);\n            sMonSummaryScreen->flippingPages = FALSE;\n            return TRUE;\n        }\n    }\n    else if (sMonSummaryScreen->flipPagesBgHofs <= 0)\n    {\n        sMonSummaryScreen->whichBgLayerToTranslate ^= 1;\n        sMonSummaryScreen->flipPagesBgHofs = 0;\n        sMonSummaryScreen->flippingPages = FALSE;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic void PokeSum_UpdateBgPriorityForPageFlip(u8 setBg0Priority, u8 keepBg1Bg2PriorityOrder)\n{\n    u32 i;\n    u32 bg0Priority;\n    u32 bg1Priority;\n    u32 bg2Priority;\n\n    bg0Priority = GetGpuReg(REG_OFFSET_BG0CNT) & 3;\n    bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3;\n    bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3;\n\n    if (sMonSummaryScreen->pageFlipDirection == 1)\n    {\n        if (setBg0Priority == 0)\n        {\n            bg0Priority = 0;\n\n            if (keepBg1Bg2PriorityOrder == 0)\n            {\n                if (bg1Priority > bg2Priority)\n                    bg1Priority = 1, bg2Priority = 2;\n                else\n                    bg1Priority = 2, bg2Priority = 1;\n            }\n            else\n            {\n                if (bg1Priority > bg2Priority)\n                    bg1Priority = 2, bg2Priority = 1;\n                else\n                    bg1Priority = 1, bg2Priority = 2;\n            }\n        }\n        if (setBg0Priority == 1)\n        {\n            bg0Priority = 1;\n\n            if (keepBg1Bg2PriorityOrder == 0)\n            {\n                if (bg1Priority > bg2Priority)\n                    bg1Priority = 0, bg2Priority = 2;\n                else\n                    bg1Priority = 2, bg2Priority = 0;\n            }\n            else\n            {\n                if (bg1Priority > bg2Priority)\n                    bg1Priority = 2, bg2Priority = 0;\n                else\n                    bg1Priority = 0, bg2Priority = 2;\n            }\n        }\n    }\n\n    if (sMonSummaryScreen->pageFlipDirection == 0)\n    {\n        bg0Priority = 0;\n        if (bg1Priority > bg2Priority)\n            bg1Priority = 1, bg2Priority = 2;\n        else\n            bg1Priority = 2, bg2Priority = 1;\n    }\n\n    for (i = 0; i < 11; i++)\n    {\n        if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS && sMonSummaryScreen->pageFlipDirection == 1)\n            sExpBarObjs->sprites[i]->oam.priority = bg0Priority;\n        else\n            sExpBarObjs->sprites[i]->oam.priority = bg1Priority;\n\n        if (i >= 9)\n            continue;\n\n        if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS && sMonSummaryScreen->pageFlipDirection == 1)\n            sHpBarObjs->sprites[i]->oam.priority = bg0Priority;\n        else\n            sHpBarObjs->sprites[i]->oam.priority = bg1Priority;\n    }\n\n    SetGpuReg(REG_OFFSET_BG0CNT, (GetGpuReg(REG_OFFSET_BG0CNT) & (u16)~3) | bg0Priority);\n    SetGpuReg(REG_OFFSET_BG1CNT, (GetGpuReg(REG_OFFSET_BG1CNT) & (u16)~3) | bg1Priority);\n    SetGpuReg(REG_OFFSET_BG2CNT, (GetGpuReg(REG_OFFSET_BG2CNT) & (u16)~3) | bg2Priority);\n}\n\nstatic void PokeSum_CopyNewBgTilemapBeforePageFlip_2(void)\n{\n    u8 newPage;\n\n    if (sMonSummaryScreen->pageFlipDirection == 1)\n        newPage = sMonSummaryScreen->curPageIndex - 1;\n    else\n        newPage = sMonSummaryScreen->curPageIndex + 1;\n\n    switch (newPage)\n    {\n    case PSS_PAGE_INFO:\n        CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0);\n        break;\n    case PSS_PAGE_SKILLS:\n        if (sMonSummaryScreen->pageFlipDirection == 1)\n            CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageMoves_Tilemap, 0, 0);\n        else\n            CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageInfo_Tilemap, 0, 0);\n\n        break;\n    case PSS_PAGE_MOVES:\n        if (sMonSummaryScreen->pageFlipDirection == 1)\n            CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageMovesInfo_Tilemap, 0, 0);\n        else\n            CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0);\n\n        break;\n    case PSS_PAGE_MOVES_INFO:\n        CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageMoves_Tilemap, 0, 0);\n        break;\n    }\n}\n\nstatic void PokeSum_CopyNewBgTilemapBeforePageFlip(void)\n{\n    u8 newPage;\n\n    if (sMonSummaryScreen->pageFlipDirection == 1)\n        newPage = sMonSummaryScreen->curPageIndex - 1;\n    else\n        newPage = sMonSummaryScreen->curPageIndex + 1;\n\n    switch (newPage)\n    {\n    case PSS_PAGE_INFO:\n        CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0);\n        break;\n    case PSS_PAGE_SKILLS:\n        break;\n    case PSS_PAGE_MOVES:\n        if (sMonSummaryScreen->pageFlipDirection == 1)\n            CopyToBgTilemapBuffer(3, sBgTilemap_MovesPage, 0, 0);\n        else\n            CopyToBgTilemapBuffer(3, sBgTilemap_MovesInfoPage, 0, 0);\n\n        break;\n    case PSS_PAGE_MOVES_INFO:\n        CopyToBgTilemapBuffer(3, sBgTilemap_MovesInfoPage, 0, 0);\n        break;\n    }\n}\n\nstatic void CB2_SetUpPSS(void)\n{\n    switch (sMonSummaryScreen->summarySetupStep)\n    {\n    case 0:\n        PokeSum_Setup_ResetCallbacks();\n        break;\n    case 1:\n        PokeSum_Setup_InitGpu();\n        break;\n    case 2:\n        PokeSum_Setup_SpritesReset();\n        break;\n    case 3:\n        if (!PokeSum_HandleLoadBgGfx())\n            return;\n        break;\n    case 4:\n        if (!PokeSum_HandleCreateSprites())\n            return;\n        break;\n    case 5:\n        PokeSum_CreateWindows();\n        break;\n    case 6:\n        if (!PokeSum_Setup_BufferStrings())\n            return;\n        break;\n    case 7:\n        PokeSum_PrintRightPaneText();\n        break;\n    case 8:\n        PokeSum_PrintBottomPaneText();\n        break;\n    case 9:\n        PokeSum_PrintAbilityDataOrMoveTypes();\n        PokeSum_PrintMonTypeIcons();\n        break;\n    case 10:\n        if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE || sMonSummaryScreen->mode == PSS_MODE_FORGET_MOVE)\n            CopyToBgTilemapBuffer(3, sBgTilemap_MovesPage, 0, 0);\n        else\n            CopyToBgTilemapBuffer(3, sBgTilemap_MovesInfoPage, 0, 0);\n\n        PokeSum_DrawPageProgressTiles();\n        break;\n    case 11:\n        if (sMonSummaryScreen->isEgg)\n            CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageEgg_Tilemap, 0, 0);\n        else\n        {\n            if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE || sMonSummaryScreen->mode == PSS_MODE_FORGET_MOVE)\n            {\n                CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageMoves_Tilemap, 0, 0);\n                CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageMovesInfo_Tilemap, 0, 0);\n            }\n            else\n            {\n                CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageInfo_Tilemap, 0, 0);\n                CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0);\n            }\n        }\n\n        break;\n    case 12:\n        BlendPalettes(0xffffffff, 16, 0);\n        PokeSum_PrintPageHeaderText(sMonSummaryScreen->curPageIndex);\n        CommitStaticWindowTilemaps();\n        break;\n    case 13:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);\n        break;\n    case 14:\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(3);\n        break;\n    case 15:\n        if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE || sMonSummaryScreen->mode == PSS_MODE_FORGET_MOVE)\n        {\n            PokeSum_ShowOrHideMonIconSprite(FALSE);\n            ShoworHideMoveSelectionCursor(FALSE);\n        }\n        else\n        {\n            PokeSum_ShowOrHideMonPicSprite(FALSE);\n            PokeSum_ShowOrHideMonMarkingsSprite(FALSE);\n            ShowOrHideBallIconObj(FALSE);\n            ShowOrHideHpBarObjs(FALSE);\n            ShowOrHideExpBarObjs(FALSE);\n        }\n\n        ShowOrHideStatusIcon(FALSE);\n        HideShowPokerusIcon(FALSE);\n        HideShowShinyStar(FALSE);\n        break;\n    default:\n        PokeSum_Setup_SetVBlankCallback();\n        PokeSum_FinishSetup();\n        return;\n    }\n\n    sMonSummaryScreen->summarySetupStep++;\n}\n\nstatic u8 PokeSum_HandleLoadBgGfx(void)\n{\n    switch (sMonSummaryScreen->loadBgGfxStep)\n    {\n    case 0:\n        LoadPalette(gSummaryScreen_Bg_Pal, BG_PLTT_ID(0), 5 * PLTT_SIZE_4BPP);\n        if (IsMonShiny(&sMonSummaryScreen->currentMon) == TRUE && !sMonSummaryScreen->isEgg)\n        {\n            LoadPalette(&gSummaryScreen_Bg_Pal[16 * 6], BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n            LoadPalette(&gSummaryScreen_Bg_Pal[16 * 5], BG_PLTT_ID(1), PLTT_SIZE_4BPP);\n        }\n        else\n        {\n            LoadPalette(&gSummaryScreen_Bg_Pal[16 * 0], BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n            LoadPalette(&gSummaryScreen_Bg_Pal[16 * 1], BG_PLTT_ID(1), PLTT_SIZE_4BPP);\n        }\n\n        break;\n    case 1:\n        ListMenuLoadStdPalAt(BG_PLTT_ID(6), 1);\n        LoadPalette(sTextHeaderPalette, BG_PLTT_ID(7), PLTT_SIZE_4BPP);\n        break;\n    case 2:\n        ResetTempTileDataBuffers();\n        break;\n    case 3:\n        DecompressAndCopyTileDataToVram(2, gSummaryScreen_Bg_Gfx, 0, 0, 0);\n        break;\n    case 4:\n        if (FreeTempTileDataBuffersIfPossible() == TRUE)\n            return FALSE;\n        break;\n\n    case 5:\n    case 6:\n        break;\n\n    default:\n        LoadPalette(sTextMovesPalette, BG_PLTT_ID(8), PLTT_SIZE_4BPP);\n        return TRUE;\n    }\n\n    sMonSummaryScreen->loadBgGfxStep++;\n    return FALSE;\n}\n\nstatic u8 PokeSum_Setup_BufferStrings(void)\n{\n    switch (sMonSummaryScreen->bufferStringsStep)\n    {\n    case 0:\n        BufferMonInfo();\n        if (sMonSummaryScreen->isEgg)\n        {\n            sMonSummaryScreen->bufferStringsStep = 0;\n            return TRUE;\n        }\n\n        break;\n    case 1:\n        if (sMonSummaryScreen->isEgg == 0)\n            BufferMonSkills();\n        break;\n    case 2:\n        if (sMonSummaryScreen->isEgg == 0)\n            BufferMonMoves();\n        break;\n    default:\n        sMonSummaryScreen->bufferStringsStep = 0;\n        return TRUE;\n    }\n\n    sMonSummaryScreen->bufferStringsStep++;\n    return FALSE;\n}\n\nstatic void BufferMonInfo(void)\n{\n    u8 tempStr[20];\n    u16 dexNum;\n    u16 gender;\n    u16 heldItem;\n    u32 otId;\n\n    dexNum = SpeciesToPokedexNum(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES));\n    if (dexNum == 0xffff)\n        StringCopy(sMonSummaryScreen->summary.dexNumStrBuf, gText_PokeSum_DexNoUnknown);\n    else\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.dexNumStrBuf, dexNum, STR_CONV_MODE_LEADING_ZEROS, 3);\n\n    sMonSkillsPrinterXpos->unk00 = 0;\n\n    if (!sMonSummaryScreen->isEgg)\n    {\n        dexNum = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES);\n        bufferspeciesname(sMonSummaryScreen->summary.speciesNameStrBuf, dexNum);\n    }\n    else\n    {\n        GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_NICKNAME, sMonSummaryScreen->summary.speciesNameStrBuf);\n        return;\n    }\n\n    sMonSummaryScreen->monTypes[0] = gSpeciesInfo[dexNum].types[0];\n    sMonSummaryScreen->monTypes[1] = gSpeciesInfo[dexNum].types[1];\n\n    GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_NICKNAME, tempStr);\n    StringCopyN_Multibyte(sMonSummaryScreen->summary.nicknameStrBuf, tempStr, POKEMON_NAME_LENGTH);\n    StringGet_Nickname(sMonSummaryScreen->summary.nicknameStrBuf);\n\n    gender = GetMonGender(&sMonSummaryScreen->currentMon);\n    dexNum = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG);\n\n    if (gender == MON_FEMALE)\n        StringCopy(sMonSummaryScreen->summary.genderSymbolStrBuf, gText_FemaleSymbol);\n    else if (gender == MON_MALE)\n        StringCopy(sMonSummaryScreen->summary.genderSymbolStrBuf, gText_MaleSymbol);\n    else\n        StringCopy(sMonSummaryScreen->summary.genderSymbolStrBuf, gString_Dummy);\n\n    if (dexNum == SPECIES_NIDORAN_M || dexNum == SPECIES_NIDORAN_F)\n        if (StringCompare(sMonSummaryScreen->summary.nicknameStrBuf, gSpeciesNames[dexNum]) == 0)\n            StringCopy(sMonSummaryScreen->summary.genderSymbolStrBuf, gString_Dummy);\n\n    GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_NAME, tempStr);\n    StringCopyN_Multibyte(sMonSummaryScreen->summary.otNameStrBuf, tempStr, PLAYER_NAME_LENGTH);\n\n    ConvertInternationalString(sMonSummaryScreen->summary.otNameStrBuf, GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_LANGUAGE));\n\n    otId = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_ID) & 0xffff;\n    ConvertIntToDecimalStringN(sMonSummaryScreen->summary.unk306C, otId, STR_CONV_MODE_LEADING_ZEROS, 5);\n\n    ConvertIntToDecimalStringN(tempStr, GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_LEVEL), STR_CONV_MODE_LEFT_ALIGN, 3);\n    StringCopy(sMonSummaryScreen->summary.levelStrBuf, gText_Lv);\n    StringAppendN(sMonSummaryScreen->summary.levelStrBuf, tempStr, 4);\n\n    heldItem = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HELD_ITEM);\n\n    if (heldItem == ITEM_NONE)\n        StringCopy(sMonSummaryScreen->summary.itemNameStrBuf, gText_PokeSum_Item_None);\n    else\n        CopyItemName(heldItem, sMonSummaryScreen->summary.itemNameStrBuf);\n}\n\n#define GetNumberRightAlign63(x) (63 - StringLength((x)) * 6)\n#define GetNumberRightAlign27(x) (27 - StringLength((x)) * 6)\n\nstatic void BufferMonSkills(void)\n{\n    u8 tempStr[20];\n    u8 level;\n    u16 type;\n    u16 species;\n    u16 hp;\n    u16 statValue;\n    u32 exp;\n    u32 expToNextLevel;\n    u8 plusStat = 0; //0 = none; 1 = Atk; 2 = Def; 3 = Speed; 4 = SpA; 5 = SpD\n    u8 minusStat = 0;\n    u8 nature = GetNature(&sMonSummaryScreen->currentMon);\n\n    switch(nature)\n    {\n        case NATURE_LONELY:\n        case NATURE_BRAVE:\n        case NATURE_ADAMANT:\n        case NATURE_NAUGHTY:\n            plusStat = 1; //Atk\n            break;\n        case NATURE_BOLD:\n        case NATURE_RELAXED:\n        case NATURE_IMPISH:\n        case NATURE_LAX:\n            plusStat = 2; //Def\n            break;\n        case NATURE_TIMID:\n        case NATURE_HASTY:\n        case NATURE_JOLLY:\n        case NATURE_NAIVE:\n            plusStat = 3; //Speed\n            break;\n        case NATURE_MODEST:\n        case NATURE_MILD:\n        case NATURE_QUIET:\n        case NATURE_RASH:\n            plusStat = 4; //SpA\n            break;\n        case NATURE_CALM:\n        case NATURE_GENTLE:\n        case NATURE_SASSY:\n        case NATURE_CAREFUL:\n            plusStat = 5; //SpD\n            break;\n        default:\n            break;\n    }\n\n    switch(nature)\n    {\n        case NATURE_BOLD:\n        case NATURE_TIMID:\n        case NATURE_MODEST:\n        case NATURE_CALM:\n            minusStat = 1; //Atk\n            break;\n        case NATURE_LONELY:\n        case NATURE_HASTY:\n        case NATURE_MILD:\n        case NATURE_GENTLE:\n            minusStat = 2; //Def\n            break;\n        case NATURE_BRAVE:\n        case NATURE_RELAXED:\n        case NATURE_QUIET:\n        case NATURE_SASSY:\n            minusStat = 3; //Speed\n            break;\n        case NATURE_ADAMANT:\n        case NATURE_IMPISH:\n        case NATURE_JOLLY:\n        case NATURE_CAREFUL:\n            minusStat = 4; //SpA\n            break;\n        case NATURE_NAUGHTY:\n        case NATURE_LAX:\n        case NATURE_NAIVE:\n        case NATURE_RASH:\n            minusStat = 5; //SpD\n            break;\n        default:\n            break;\n    }\n\n    hp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP);\n    ConvertIntToDecimalStringN(sMonSummaryScreen->summary.curHpStrBuf, hp, STR_CONV_MODE_LEFT_ALIGN, 3);\n    StringAppend(sMonSummaryScreen->summary.curHpStrBuf, gText_Slash);\n\n    hp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MAX_HP);\n    ConvertIntToDecimalStringN(tempStr, hp, STR_CONV_MODE_LEFT_ALIGN, 3);\n    StringAppend(sMonSummaryScreen->summary.curHpStrBuf, tempStr);\n\n    sMonSkillsPrinterXpos->curHpStr = GetNumberRightAlign63(sMonSummaryScreen->summary.curHpStrBuf);\n\n    if (sMonSummaryScreen->savedCallback == CB2_ReturnToTradeMenuFromSummary && sMonSummaryScreen->isEnemyParty == TRUE)\n    {\n        statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_ATK2);\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4);\n        if(plusStat == 1)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK][0] = 0x79;\n        if(minusStat == 1)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK][0] = 0x7A;\n        if(plusStat != 1 && minusStat != 1)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK][0] = 0x78;\n        sMonSkillsPrinterXpos->atkStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK]);\n\n        statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_DEF2);\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4);\n        if(plusStat == 2)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF][0] = 0x79;\n        if(minusStat == 2)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF][0] = 0x7A;\n        if(plusStat != 2 && minusStat != 2)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF][0] = 0x78;\n        sMonSkillsPrinterXpos->defStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF]);\n\n        statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPATK2);\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4);\n        if(plusStat == 4)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA][0] = 0x79;\n        if(minusStat == 4)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA][0] = 0x7A;\n        if(plusStat != 4 && minusStat != 4)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA][0] = 0x78;\n        sMonSkillsPrinterXpos->spAStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA]);\n\n        statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPDEF2);\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4);\n        if(plusStat == 5)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD][0] = 0x79;\n        if(minusStat == 5)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD][0] = 0x7A;\n        if(plusStat != 5 && minusStat != 5)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD][0] = 0x78;\n        sMonSkillsPrinterXpos->spDStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD]);\n\n        statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPEED2);\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4);\n        if(plusStat == 3)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE][0] = 0x79;\n        if(minusStat == 3)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE][0] = 0x7A;\n        if(plusStat != 3 && minusStat != 3)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE][0] = 0x78;\n        sMonSkillsPrinterXpos->speStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE]);\n    }\n    else\n    {\n        statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_ATK);\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4);\n        if(plusStat == 1)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK][0] = 0x79;\n        if(minusStat == 1)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK][0] = 0x7A;\n        if(plusStat != 1 && minusStat != 1)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK][0] = 0x78;\n        sMonSkillsPrinterXpos->atkStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK]);\n\n        statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_DEF);\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4);\n        if(plusStat == 2)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF][0] = 0x79;\n        if(minusStat == 2)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF][0] = 0x7A;\n        if(plusStat != 2 && minusStat != 2)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF][0] = 0x78;\n        sMonSkillsPrinterXpos->defStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF]);\n\n        statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPATK);\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4);\n        if(plusStat == 4)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA][0] = 0x79;\n        if(minusStat == 4)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA][0] = 0x7A;\n        if(plusStat != 4 && minusStat != 4)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA][0] = 0x78;\n        sMonSkillsPrinterXpos->spAStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA]);\n\n        statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPDEF);\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4);\n        if(plusStat == 5)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD][0] = 0x79;\n        if(minusStat == 5)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD][0] = 0x7A;\n        if(plusStat != 5 && minusStat != 5)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD][0] = 0x78;\n        sMonSkillsPrinterXpos->spDStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD]);\n\n        statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPEED);\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE], statValue, STR_CONV_MODE_RIGHT_ALIGN, 4);\n        if(plusStat == 3)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE][0] = 0x79;\n        if(minusStat == 3)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE][0] = 0x7A;\n        if(plusStat != 3 && minusStat != 3)\n            sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE][0] = 0x78;\n        sMonSkillsPrinterXpos->speStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE]);\n    }\n\n    exp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_EXP);\n    ConvertIntToDecimalStringN(sMonSummaryScreen->summary.expPointsStrBuf, exp, STR_CONV_MODE_LEFT_ALIGN, 7);\n    sMonSkillsPrinterXpos->expStr = GetNumberRightAlign63(sMonSummaryScreen->summary.expPointsStrBuf);\n\n    level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_LEVEL);\n    expToNextLevel = 0;\n    if (level < 100)\n    {\n        species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES);\n        expToNextLevel = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - exp;\n    }\n\n    ConvertIntToDecimalStringN(sMonSummaryScreen->summary.expToNextLevelStrBuf, expToNextLevel, STR_CONV_MODE_LEFT_ALIGN, 7);\n    sMonSkillsPrinterXpos->toNextLevel = GetNumberRightAlign63(sMonSummaryScreen->summary.expToNextLevelStrBuf);\n\n    type = GetAbilityBySpecies(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES), GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_ABILITY_NUM));\n    StringCopy(sMonSummaryScreen->summary.abilityNameStrBuf, gAbilityNames[type]);\n    StringCopy(sMonSummaryScreen->summary.abilityDescStrBuf, gAbilityDescriptionPointers[type]);\n\n    sMonSummaryScreen->curMonStatusAilment = StatusToAilment(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_STATUS));\n    if (sMonSummaryScreen->curMonStatusAilment == AILMENT_NONE)\n        if (CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0))\n            sMonSummaryScreen->curMonStatusAilment = AILMENT_PKRS;\n}\n\nstatic void BufferMonMoves(void)\n{\n    u32 i;\n\n    for (i = 0; i < 4; i++)\n        BufferMonMoveI(i);\n\n    if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE)\n        BufferMonMoveI(4);\n}\n\n#define GetRightAlignXpos_NDigits(a, b) ((6 * (a)) - StringLength((b)) * 6)\n\nstatic void BufferMonMoveI(u32 i)\n{\n    u32 type;\n    u32 terrainType;\n    u32 monFriendship = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_FRIENDSHIP);\n    s32 power;\n    u32 accuracy;\n\n    if (i < 4)\n        sMonSummaryScreen->moveIds[i] = GetMonMoveBySlotId(&sMonSummaryScreen->currentMon, i);\n    \n    if (sMonSummaryScreen->moveIds[i] == 0)\n    {\n        StringCopy(sMonSummaryScreen->summary.moveNameStrBufs[i], gText_PokeSum_OneHyphen);\n        StringCopy(sMonSummaryScreen->summary.moveCurPpStrBufs[i], gText_PokeSum_TwoHyphens);\n        StringCopy(sMonSummaryScreen->summary.movePowerStrBufs[i], gText_ThreeHyphens);\n        StringCopy(sMonSummaryScreen->summary.moveAccuracyStrBufs[i], gText_ThreeHyphens);\n        sMonSkillsPrinterXpos->curPp[i] = 0xff;\n        sMonSkillsPrinterXpos->maxPp[i] = 0xff;\n        return;\n    }\n\n    accuracy = gBattleMoves[sMonSummaryScreen->moveIds[i]].accuracy;\n\n    switch(sMonSummaryScreen->moveIds[i])\n    {\n        case MOVE_HIDDEN_POWER:\n        {\n            u8 powerBits = ((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP_IV) & 2) >> 1)\n                         | ((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_ATK_IV) & 2) << 0)\n                         | ((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_DEF_IV) & 2) << 1)\n                         | ((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPEED_IV) & 2) << 2)\n                         | ((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPATK_IV) & 2) << 3)\n                         | ((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPDEF_IV) & 2) << 4);\n            \n            power = (40 * powerBits) / 63 + 30;\n            type = GetHiddenPowerType(&sMonSummaryScreen->currentMon);\n            break;\n        }\n        case MOVE_RETURN:\n        {\n            type = TYPE_NORMAL;\n            power = (10 * monFriendship / 25);\n            if(power == 0)\n                power = 1;\n            break;\n        }\n        case MOVE_FRUSTRATION:\n        {\n            type = TYPE_NORMAL;\n            power = (10 * (MAX_FRIENDSHIP - monFriendship) / 25);\n            if(power == 0)\n                power = 1;\n            break;\n        }\n        case MOVE_WEATHER_BALL:\n        {\n            type = GetWeatherBallType();\n            if(type == TYPE_NORMAL)\n                power = 50;\n            else\n                power = 100;\n            break;\n        }\n        case MOVE_NATURE_POWER:\\\\\n        {\n            if (gMain.inBattle)\n                terrainType = gBattleTerrain;\n            else\n                terrainType = BattleSetup_GetTerrainId();\n            type = gBattleMoves[gNaturePowerMoves[terrainType]].type;\n            power = gBattleMoves[gNaturePowerMoves[terrainType]].power;\n            accuracy = gBattleMoves[gNaturePowerMoves[terrainType]].accuracy;\n            break;\n        }\n        default:\n        {\n            type = gBattleMoves[sMonSummaryScreen->moveIds[i]].type;\n            power = gBattleMoves[sMonSummaryScreen->moveIds[i]].power;\n            break;\n        }\n    }\n    sMonSummaryScreen->numMoves++;\n    sMonSummaryScreen->moveTypes[i] = type;\n    StringCopy(sMonSummaryScreen->summary.moveNameStrBufs[i], gMoveNames[sMonSummaryScreen->moveIds[i]]);\n\n    if (i >= 4 && sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE)\n    {\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveCurPpStrBufs[i],\n                                   gBattleMoves[sMonSummaryScreen->moveIds[i]].pp, STR_CONV_MODE_LEFT_ALIGN, 3);\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveMaxPpStrBufs[i],\n                                   gBattleMoves[sMonSummaryScreen->moveIds[i]].pp, STR_CONV_MODE_LEFT_ALIGN, 3);\n    }\n    else\n    {\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveCurPpStrBufs[i],\n                                   GetMonPpByMoveSlot(&sMonSummaryScreen->currentMon, i), STR_CONV_MODE_LEFT_ALIGN, 3);\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveMaxPpStrBufs[i],\n                                   CalculatePPWithBonus(sMonSummaryScreen->moveIds[i], GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_PP_BONUSES), i),\n                                   STR_CONV_MODE_LEFT_ALIGN, 3);\n    }\n\n    sMonSkillsPrinterXpos->curPp[i] = GetRightAlignXpos_NDigits(2, sMonSummaryScreen->summary.moveCurPpStrBufs[i]);\n    sMonSkillsPrinterXpos->maxPp[i] = GetRightAlignXpos_NDigits(2, sMonSummaryScreen->summary.moveMaxPpStrBufs[i]);\n\n    if (power <= 1 && sMonSummaryScreen->moveIds[i] != MOVE_RETURN && sMonSummaryScreen->moveIds[i] != MOVE_FRUSTRATION)\n        StringCopy(sMonSummaryScreen->summary.movePowerStrBufs[i], gText_ThreeHyphens);\n    else\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.movePowerStrBufs[i], power, STR_CONV_MODE_RIGHT_ALIGN, 3);\n\n    if (accuracy == 0)\n        StringCopy(sMonSummaryScreen->summary.moveAccuracyStrBufs[i], gText_ThreeHyphens);\n    else\n        ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveAccuracyStrBufs[i], accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3);\n}\n\nstatic u8 PokeSum_HandleCreateSprites(void)\n{\n    switch (sMonSummaryScreen->spriteCreationStep)\n    {\n    case 0:\n        CreateShinyStarObj(TAG_PSS_UNK_A0, TAG_PSS_UNK_A0);\n        break;\n    case 1:\n        CreatePokerusIconObj(TAG_PSS_UNK_96, TAG_PSS_UNK_96);\n        break;\n    case 2:\n        PokeSum_CreateMonMarkingsSprite();\n        break;\n    case 3:\n        CreateMoveSelectionCursorObjs(TAG_PSS_UNK_64, TAG_PSS_UNK_64);\n        break;\n    case 4:\n        CreateMonStatusIconObj(TAG_PSS_UNK_6E, TAG_PSS_UNK_6E);\n        break;\n    case 5:\n        CreateHpBarObjs(TAG_PSS_UNK_78, TAG_PSS_UNK_78);\n        break;\n    case 6:\n        CreateExpBarObjs(TAG_PSS_UNK_82, TAG_PSS_UNK_82);\n        break;\n    case 7:\n        CreateBallIconObj();\n        break;\n    case 8:\n        PokeSum_CreateMonIconSprite();\n        break;\n    default:\n        PokeSum_CreateMonPicSprite();\n        return TRUE;\n    }\n\n    sMonSummaryScreen->spriteCreationStep++;\n    return FALSE;\n}\n\nstatic void PokeSum_Setup_SpritesReset(void)\n{\n    ResetSpriteData();\n    ResetPaletteFade();\n    FreeAllSpritePalettes();\n    ScanlineEffect_Stop();\n}\n\nstatic void PokeSum_Setup_InitGpu(void)\n{\n    DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);\n    DmaClear32(3, (void *)OAM, OAM_SIZE);\n    DmaClear16(3, (void *)PLTT, PLTT_SIZE);\n\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n\n    ResetBgsAndClearDma3BusyFlags(0);\n    InitBgsFromTemplates(0, sBgTempaltes, NELEMS(sBgTempaltes));\n\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n\n    DeactivateAllTextPrinters();\n\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN1_ON);\n\n    PokeSum_UpdateWin1ActiveFlag(sMonSummaryScreen->curPageIndex);\n\n    SetGpuReg(REG_OFFSET_WININ, (WININ_WIN0_OBJ | WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3) << 8);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3);\n    SetGpuReg(REG_OFFSET_WIN1V, 32 << 8 | 135);\n    SetGpuReg(REG_OFFSET_WIN1H, 2 << 8 | 240);\n\n    SetBgTilemapBuffer(1, sMonSummaryScreen->bg1TilemapBuffer);\n    SetBgTilemapBuffer(2, sMonSummaryScreen->bg2TilemapBuffer);\n    SetBgTilemapBuffer(3, sMonSummaryScreen->bg3TilemapBuffer);\n\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n    ShowBg(3);\n}\n\nstatic void PokeSum_FinishSetup(void)\n{\n    if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE || sMonSummaryScreen->mode == PSS_MODE_FORGET_MOVE)\n        sMonSummaryScreen->inputHandlerTaskId = CreateTask(Task_InputHandler_SelectOrForgetMove, 0);\n    else\n        sMonSummaryScreen->inputHandlerTaskId = CreateTask(Task_InputHandler_Info, 0);\n\n    SetMainCallback2(CB2_RunPokemonSummaryScreen);\n}\n\nstatic void PokeSum_PrintPageName(const u8 * str)\n{\n    FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 0);\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], FONT_NORMAL, 4, 1, sLevelNickTextColors[1], 0, str);\n    PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME]);\n}\n\nstatic void PokeSum_PrintControlsString(const u8 * str)\n{\n    u8 v0;\n    s32 width;\n    u8 r1;\n\n    FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 0);\n    width = GetStringWidth(FONT_SMALL, str, 0);\n    r1 = sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS];\n    AddTextPrinterParameterized3(r1, FONT_SMALL, 0x54 - width, 0, sLevelNickTextColors[1], 0, str);\n    PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS]);\n}\n\nstatic void PrintMonLevelNickOnWindow2(const u8 * str)\n{\n    FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 0);\n\n    if (!sMonSummaryScreen->isEgg)\n    {\n        if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)\n            AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2, 4, 2, sLevelNickTextColors[1], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.levelStrBuf);\n\n        AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], FONT_NORMAL, 40, 2, sLevelNickTextColors[1], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.nicknameStrBuf);\n\n        if (GetMonGender(&sMonSummaryScreen->currentMon) == MON_FEMALE)\n            AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], FONT_NORMAL, 105, 2, sLevelNickTextColors[3], 0, sMonSummaryScreen->summary.genderSymbolStrBuf);\n        else\n            AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], FONT_NORMAL, 105, 2, sLevelNickTextColors[2], 0, sMonSummaryScreen->summary.genderSymbolStrBuf);\n    }\n\n    PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK]);\n}\n\nstatic void PokeSum_PrintRightPaneText(void)\n{\n    FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 0);\n\n    switch (sMonSummaryScreen->curPageIndex)\n    {\n    case PSS_PAGE_INFO:\n        PrintInfoPage();\n        break;\n    case PSS_PAGE_SKILLS:\n        PrintSkillsPage();\n        break;\n    case PSS_PAGE_MOVES:\n    case PSS_PAGE_MOVES_INFO:\n        PrintMovesPage();\n        break;\n    }\n\n    PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE]);\n}\n\nstatic void PrintInfoPage(void)\n{\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 47, 19, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.speciesNameStrBuf);\n\n    if (!sMonSummaryScreen->isEgg)\n    {\n        AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 47 + sMonSkillsPrinterXpos->unk00, 5, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.dexNumStrBuf);\n        AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 47, 49, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.otNameStrBuf);\n        AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 47, 64, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.unk306C);\n        AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 47, 79, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.itemNameStrBuf);\n    }\n    else\n    {\n        u8 eggCycles;\n        u8 hatchMsgIndex;\n\n        eggCycles = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_FRIENDSHIP);\n\n        if (eggCycles <= 5)\n            hatchMsgIndex = 3;\n        else if (eggCycles <= 10)\n            hatchMsgIndex = 2;\n        else if (eggCycles <= 40)\n            hatchMsgIndex = 1;\n        else\n            hatchMsgIndex = 0;\n\n        if (sMonSummaryScreen->isBadEgg)\n            hatchMsgIndex = 0;\n\n        AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 7, 45, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sEggHatchTimeTexts[hatchMsgIndex]);\n    }\n}\n\nstatic void PrintSkillsPage(void)\n{\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 14 + sMonSkillsPrinterXpos->curHpStr, 4, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.curHpStrBuf);\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 44 + sMonSkillsPrinterXpos->atkStr, 22, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK]);\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 44 + sMonSkillsPrinterXpos->defStr, 35, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF]);\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 44 + sMonSkillsPrinterXpos->spAStr, 48, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA]);\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 44 + sMonSkillsPrinterXpos->spDStr, 61, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD]);\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 44 + sMonSkillsPrinterXpos->speStr, 74, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE]);\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 15 + sMonSkillsPrinterXpos->expStr, 87, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.expPointsStrBuf);\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 15 + sMonSkillsPrinterXpos->toNextLevel, 100, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.expToNextLevelStrBuf);\n}\n\n#define GetMoveNamePrinterYpos(x) ((x) * 28 + 5)\n#define GetMovePpPrinterYpos(x) ((x) * 28 + 16)\n\nstatic void PrintMovesPage(void)\n{\n    u32 i;\n\n    for (i = 0; i < 4; i++)\n        PokeSum_PrintMoveName(i);\n\n    if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)\n    {\n        if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE)\n            PokeSum_PrintMoveName(4);\n        else\n            AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL,\n                                         3, GetMoveNamePrinterYpos(4),\n                                         sPrintMoveTextColors[0], TEXT_SKIP_DRAW, gFameCheckerText_Cancel);\n    }\n}\n\nstatic void PokeSum_PrintMoveName(u8 i)\n{\n    u8 colorIdx = 0;\n    u8 curPP = GetMonPpByMoveSlot(&sMonSummaryScreen->currentMon, i);\n    u16 move = sMonSummaryScreen->moveIds[i];\n    u8 ppBonuses = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_PP_BONUSES);\n    u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i);\n\n    if (i == 4)\n        curPP = maxPP;\n\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 3, GetMoveNamePrinterYpos(i), sPrintMoveTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveNameStrBufs[i]);\n\n    if (sMonSummaryScreen->moveIds[i] == 0 || (curPP == maxPP))\n      colorIdx = 0;\n    else if (curPP == 0)\n      colorIdx = 3;\n    else if (maxPP == 3)\n    {\n        if (curPP == 2)\n          colorIdx = 2;\n        else if (curPP == 1)\n          colorIdx = 1;\n    }\n    else if (maxPP == 2)\n    {\n        if (curPP == 1)\n          colorIdx = 1;\n    }\n    else\n    {\n        if (curPP <= (maxPP / 4))\n          colorIdx = 2;\n        else if (curPP <= (maxPP / 2))\n          colorIdx = 1;\n    }\n\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 36, GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW,\n        gText_PokeSum_PP);\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 46 + sMonSkillsPrinterXpos->curPp[i], GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveCurPpStrBufs[i]);\n\n    if (sMonSummaryScreen->moveIds[i] != MOVE_NONE)\n    {\n        AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 58, GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, gText_Slash);\n        AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 64 + sMonSkillsPrinterXpos->maxPp[i], GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveMaxPpStrBufs[i]);\n    }\n}\n\nstatic void PokeSum_PrintBottomPaneText(void)\n{\n    FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 0);\n\n    switch (sMonSummaryScreen->curPageIndex)\n    {\n    case PSS_PAGE_INFO:\n        PokeSum_PrintTrainerMemo();\n        break;\n    case PSS_PAGE_SKILLS:\n        PokeSum_PrintExpPoints_NextLv();\n        break;\n    case PSS_PAGE_MOVES_INFO:\n        PokeSum_PrintSelectedMoveStats();\n        break;\n    case PSS_PAGE_MOVES:\n        break;\n    }\n\n    PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO]);\n}\n\nstatic void PokeSum_PrintTrainerMemo(void)\n{\n    if (!sMonSummaryScreen->isEgg)\n        PokeSum_PrintTrainerMemo_Mon();\n    else\n        PokeSum_PrintTrainerMemo_Egg();\n}\n\nstatic void PokeSum_PrintTrainerMemo_Mon_HeldByOT(void)\n{\n    u8 nature;\n    u8 level;\n    u8 metLocation;\n    u8 levelStr[5];\n    u8 mapNameStr[32];\n    u8 natureMetOrHatchedAtLevelStr[152];\n\n    DynamicPlaceholderTextUtil_Reset();\n    nature = GetNature(&sMonSummaryScreen->currentMon);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gNatureNamePointers[nature]);\n    level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL);\n\n    if (level == 0)\n        level = 5;\n\n    ConvertIntToDecimalStringN(levelStr, level, STR_CONV_MODE_LEFT_ALIGN, 3);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, levelStr);\n\n    metLocation = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LOCATION);\n\n    if (MapSecIsInKantoOrSevii(metLocation) == TRUE)\n    {\n        GetMapNameGeneric_(mapNameStr, metLocation);\n        if(metLocation == MAPSEC_BATTLE_FRONTIER)   //remove if Battle Frontier ever happens\n        {\n            StringCopy(mapNameStr, gText_BattleTower);\n        }\n    }\n    else\n    {\n        if (sMonSummaryScreen->isEnemyParty == TRUE || IsMultiBattlePartner() == TRUE)\n            StringCopy(mapNameStr, gText_Somewhere);\n        else\n            StringCopy(mapNameStr, gText_PokeSum_ATrade);\n    }\n\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, mapNameStr);\n\n    // These pairs of strings are bytewise identical to each other in English,\n    // but Japanese uses different grammar for Bold and Gentle natures.\n    if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL) == 0) // Hatched\n    {\n        if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MODERN_FATEFUL_ENCOUNTER) == TRUE)\n        {\n            if (PokeSum_IsMonBoldOrGentle(nature))\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterHatched_BoldGentleGrammar);\n            else\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterHatched);\n        }\n        else\n        {\n            if (PokeSum_IsMonBoldOrGentle(nature))\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_Hatched_BoldGentleGrammar);\n            else\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_Hatched);\n        }\n    }\n    else\n    {\n        if (metLocation == METLOC_FATEFUL_ENCOUNTER)\n        {\n            if (PokeSum_IsMonBoldOrGentle(nature))\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar);\n            else\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet);\n        }\n        else\n        {\n            if (PokeSum_IsMonBoldOrGentle(nature))\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_Met_BoldGentleGrammar);\n            else\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_Met);\n        }\n    }\n\n    AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, natureMetOrHatchedAtLevelStr);\n}\n\nstatic void PokeSum_PrintTrainerMemo_Mon_NotHeldByOT(void) //if different OT\n{\n    u8 nature;\n    u8 level;\n    u8 metLocation;\n    u8 levelStr[5];\n    u8 mapNameStr[32];\n    u8 natureMetOrHatchedAtLevelStr[152];\n    u8 *orreMetLocationString;\n    u8 playerOTNameStr[152];\n    u8 tempStr[20];\n\n    DynamicPlaceholderTextUtil_Reset();\n    nature = GetNature(&sMonSummaryScreen->currentMon);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gNatureNamePointers[nature]);\n\n    level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL);\n\n    if (level == 0)\n        level = 5;\n\n    ConvertIntToDecimalStringN(levelStr, level, STR_CONV_MODE_LEFT_ALIGN, 3);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, levelStr);\n\n    metLocation = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LOCATION);\n\n    if (!MapSecIsInKantoOrSevii(metLocation) || !CurrentMonIsFromGBA())\n    {\n        if (IsMultiBattlePartner() == TRUE)\n        {\n            PokeSum_PrintTrainerMemo_Mon_HeldByOT();\n            return;\n        }\n\n        if (metLocation == METLOC_FATEFUL_ENCOUNTER)\n        {\n            if (PokeSum_IsMonBoldOrGentle(nature))\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar);\n            else\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet);\n        }\n        else\n        {\n            if (PokeSum_IsMonBoldOrGentle(nature))\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_MetInATrade_BoldGentleGrammar);\n            else\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_MetInATrade);\n        }\n\n        AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, natureMetOrHatchedAtLevelStr);\n        return;\n    }\n\n    if (MapSecIsInKantoOrSevii(metLocation) == TRUE && !IsMonFromOrre())\n    {\n        GetMapNameGeneric_(mapNameStr, metLocation);\n    }\n    else if (IsMonFromOrre())\n    {\n        orreMetLocationString = DetermineOrreMetLocation(&sMonSummaryScreen->currentMon);\n        WriteOrreMapName(mapNameStr, orreMetLocationString, 0);\n    }\n    else\n        StringCopy(mapNameStr, gText_PokeSum_ATrade);\n\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, mapNameStr);\n\n    // These pairs of strings are bytewise identical to each other in English,\n    // but Japanese uses different grammar for Bold and Gentle natures.\n    if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL) == 0) // hatched from an EGG\n    {\n        if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MODERN_FATEFUL_ENCOUNTER) == TRUE)\n        {\n            if (PokeSum_IsMonBoldOrGentle(nature))\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyFatefulEncounterHatched_BoldGentleGrammar);\n            else\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyFatefulEncounterHatched);\n        }\n        else\n        {\n            if (PokeSum_IsMonBoldOrGentle(nature))\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyMet_BoldGentleGrammar);\n            else\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyMet);\n        }\n    }\n    else\n    {\n        if (metLocation == METLOC_FATEFUL_ENCOUNTER)\n        {\n            if (PokeSum_IsMonBoldOrGentle(nature))\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar);\n            else\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet);\n        }\n        else\n        {\n            if(IsMonFromOrre() && (metLocation == 254 || metLocation == 0))\n            {\n                GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_NAME, tempStr);\n                DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, tempStr);\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(playerOTNameStr, gSummaryMetLocationTextOrreEeveelutionsDuking);\n                DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, playerOTNameStr);\n            }\n            else\n            {\n                if (PokeSum_IsMonBoldOrGentle(nature))\n                    DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyMet_BoldGentleGrammar);\n                else\n                    DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyMet);\n            }\n        }\n    }\n\n    AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, natureMetOrHatchedAtLevelStr);\n}\n\nstatic bool8 IsMonFromOrre(void)\n{\n    u8 version = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_GAME);\n    if(version == VERSION_GAMECUBE)\n        return TRUE;\n    return FALSE;\n}\n\nstatic void PokeSum_PrintTrainerMemo_Mon(void)\n{\n    // Pokemon from Orre are always considered outsiders by the summary screen\n    if (PokeSum_BufferOtName_IsEqualToCurrentOwner(&sMonSummaryScreen->currentMon) == TRUE && !IsMonFromOrre())\n        PokeSum_PrintTrainerMemo_Mon_HeldByOT();\n    else\n        PokeSum_PrintTrainerMemo_Mon_NotHeldByOT();\n}\n\nstatic bool32 IsEggFromBoxRS(void)\n{\n    u16 species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES);\n    u8 OtName[12];\n\n    GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_NAME, OtName);\n\n\n    switch (species)\n    {\n        case SPECIES_SWABLU:\n        case SPECIES_ZIGZAGOON:\n        case SPECIES_SKITTY:\n        case SPECIES_PICHU:\n        {\n            if(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_GENDER) == 1)\n                if((GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_ID) & 0xFFFF) == 0)\n                    if(!StringCompareWithoutExtCtrlCodes(gText_Azusa, OtName))\n                        return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nstatic void PokeSum_PrintTrainerMemo_Egg(void)\n{\n    u8 metLocation;\n    u8 version;\n    u8 chosenStrIndex = 0;\n\n    metLocation = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LOCATION);\n\n    if (sMonSummaryScreen->monList.mons != gEnemyParty)\n    {\n        if (metLocation == METLOC_FATEFUL_ENCOUNTER || GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MODERN_FATEFUL_ENCOUNTER) == TRUE)\n            chosenStrIndex = 4;\n        else\n        {\n            version = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_GAME);\n\n            if (version != VERSION_LEAF_GREEN && version != VERSION_FIRE_RED)\n                chosenStrIndex = 1;\n            else if (metLocation == METLOC_SPECIAL_EGG)\n                chosenStrIndex = 2;\n\n            if (chosenStrIndex == 0 || chosenStrIndex == 2)\n                if (PokeSum_BufferOtName_IsEqualToCurrentOwner(&sMonSummaryScreen->currentMon) == FALSE)\n                    chosenStrIndex++;\n        }\n    }\n    else\n    {\n        if (metLocation == METLOC_FATEFUL_ENCOUNTER || GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MODERN_FATEFUL_ENCOUNTER) == TRUE)\n            chosenStrIndex = 4;\n        else\n        {\n            version = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_GAME);\n\n            if (version != VERSION_LEAF_GREEN && version != VERSION_FIRE_RED)\n            {\n                if (metLocation == METLOC_SPECIAL_EGG)\n                    chosenStrIndex = 5;\n            }\n            else if (metLocation == METLOC_SPECIAL_EGG)\n                chosenStrIndex = 2;\n\n            if (PokeSum_BufferOtName_IsEqualToCurrentOwner(&sMonSummaryScreen->currentMon) == FALSE)\n                chosenStrIndex++;\n        }\n    }\n\n    if (sMonSummaryScreen->isBadEgg)\n        chosenStrIndex = 0;\n\n    if(IsEggFromBoxRS())\n        AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, gText_PeculiarEggPokemonBox);\n    else\n        AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sEggOriginTexts[chosenStrIndex]);\n}\n\nstatic void PokeSum_PrintExpPoints_NextLv(void)\n{\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,\n                                 26, 7,\n                                 sLevelNickTextColors[0], TEXT_SKIP_DRAW,\n                                 gText_PokeSum_ExpPoints);\n\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,\n                                 26, 20,\n                                 sLevelNickTextColors[0], TEXT_SKIP_DRAW,\n                                 gText_PokeSum_NextLv);\n}\n\nstatic void PokeSum_PrintSelectedMoveStats(void)\n{\n    if (sMoveSelectionCursorPos < 5)\n    {\n        if (sMonSummaryScreen->mode != PSS_MODE_SELECT_MOVE && sMoveSelectionCursorPos == 4)\n            return;\n\n        AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,\n                                     57, 1,\n                                     sLevelNickTextColors[0], TEXT_SKIP_DRAW,\n                                     sMonSummaryScreen->summary.movePowerStrBufs[sMoveSelectionCursorPos]);\n\n        AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,\n                                     57, 15,\n                                     sLevelNickTextColors[0], TEXT_SKIP_DRAW,\n                                     sMonSummaryScreen->summary.moveAccuracyStrBufs[sMoveSelectionCursorPos]);\n\n        AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,\n                                     7, 42,\n                                     0, 0,\n                                     sLevelNickTextColors[0], TEXT_SKIP_DRAW,\n                                     gMoveDescriptionPointers[sMonSummaryScreen->moveIds[sMoveSelectionCursorPos] - 1]);\n    }\n}\n\nstatic void PokeSum_PrintAbilityDataOrMoveTypes(void)\n{\n    switch (sMonSummaryScreen->curPageIndex)\n    {\n    case PSS_PAGE_INFO:\n        break;\n    case PSS_PAGE_SKILLS:\n        PokeSum_PrintAbilityNameAndDesc();\n        break;\n    case PSS_PAGE_MOVES:\n    case PSS_PAGE_MOVES_INFO:\n        PokeSum_DrawMoveTypeIcons();\n        break;\n    }\n\n    PutWindowTilemap(sMonSummaryScreen->windowIds[5]);\n}\n\nstatic void PokeSum_PrintAbilityNameAndDesc(void)\n{\n    FillWindowPixelBuffer(sMonSummaryScreen->windowIds[5], 0);\n\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[5], FONT_NORMAL,\n                                 66, 1, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.abilityNameStrBuf);\n\n    AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[5], FONT_NORMAL,\n                                 2, 15, sLevelNickTextColors[0], TEXT_SKIP_DRAW,\n                                 sMonSummaryScreen->summary.abilityDescStrBuf);\n\n}\n\nstatic void PokeSum_DrawMoveTypeIcons(void)\n{\n    u32 i;\n\n    FillWindowPixelBuffer(sMonSummaryScreen->windowIds[5], 0);\n\n    for (i = 0; i < 4; i++)\n    {\n        if (sMonSummaryScreen->moveIds[i] == MOVE_NONE)\n            continue;\n\n        BlitMenuInfoIcon(sMonSummaryScreen->windowIds[5], sMonSummaryScreen->moveTypes[i] + 1, 3, GetMoveNamePrinterYpos(i));\n    }\n\n    if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE)\n        BlitMenuInfoIcon(sMonSummaryScreen->windowIds[5], sMonSummaryScreen->moveTypes[4] + 1, 3, GetMoveNamePrinterYpos(4));\n}\n\nstatic void PokeSum_PrintPageHeaderText(u8 curPageIndex)\n{\n    switch (curPageIndex)\n    {\n    case PSS_PAGE_INFO:\n        PokeSum_PrintPageName(gText_PokeSum_PageName_PokemonInfo);\n        if (!sMonSummaryScreen->isEgg)\n            PokeSum_PrintControlsString(gText_PokeSum_Controls_PageCancel);\n        else\n            PokeSum_PrintControlsString(gText_PokeSum_Controls_Cancel);\n\n        PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);\n        break;\n    case PSS_PAGE_SKILLS:\n        PokeSum_PrintPageName(gText_PokeSum_PageName_PokemonSkills);\n        PokeSum_PrintControlsString(gText_PokeSum_Controls_Page);\n        PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);\n        break;\n    case PSS_PAGE_MOVES:\n        PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves);\n        PokeSum_PrintControlsString(gText_PokeSum_Controls_PageDetail);\n        PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);\n        break;\n    case PSS_PAGE_MOVES_INFO:\n        PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves);\n        if (!gMain.inBattle)\n            PokeSum_PrintControlsString(gText_PokeSum_Controls_PickSwitch);\n        else\n            PokeSum_PrintControlsString(gText_PokeSum_Controls_Pick);\n        PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);\n        break;\n    case PSS_PAGE_MOVE_DELETER:\n        PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves);\n        PokeSum_PrintControlsString(gText_PokeSum_Controls_PickDelete);\n        PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);\n        break;\n    default:\n        break;\n    }\n}\n\nstatic void CommitStaticWindowTilemaps(void)\n{\n    PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME]);\n    PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS]);\n    PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK]);\n}\n\nstatic void Task_DestroyResourcesOnExit(u8 taskId)\n{\n    PokeSum_DestroySprites();\n    FreeAllSpritePalettes();\n\n    if (IsCryPlayingOrClearCrySongs() == TRUE)\n        StopCryAndClearCrySongs();\n\n    PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex);\n    FreeAllWindowBuffers();\n    DestroyTask(taskId);\n    SetMainCallback2(sMonSummaryScreen->savedCallback);\n\n    sLastViewedMonIndex = GetLastViewedMonIndex();\n\n    FREE_AND_SET_NULL_IF_SET(sMonSummaryScreen);\n    FREE_AND_SET_NULL_IF_SET(sMonSkillsPrinterXpos);\n}\n\nstatic void CB2_RunPokemonSummaryScreen(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void PokeSum_FlipPages_SlideHpExpBarsOut(void)\n{\n    u32 i;\n\n    for (i = 0; i < 11; i++)\n    {\n        if (sExpBarObjs->xpos[i] < 240)\n        {\n            sExpBarObjs->xpos[i] += 60;\n            sExpBarObjs->sprites[i]->x = sExpBarObjs->xpos[i] + 60;\n        }\n\n        if (i >= 9)\n            continue;\n\n        if (sHpBarObjs->xpos[i] < 240)\n        {\n            sHpBarObjs->xpos[i] += 60;\n            sHpBarObjs->sprites[i]->x = sHpBarObjs->xpos[i] + 60;\n        }\n    }\n}\n\nstatic void PokeSum_FlipPages_SlideHpExpBarsIn(void)\n{\n    u32 i;\n\n    for (i = 0; i < 11; i++)\n    {\n        if (sExpBarObjs->xpos[i] > 156 + (8 * i))\n        {\n            sExpBarObjs->xpos[i] -= 60;\n\n            if (sExpBarObjs->xpos[i] < 156 + (8 * i))\n                sExpBarObjs->xpos[i] = 156 + (8 * i);\n\n            sExpBarObjs->sprites[i]->x = sExpBarObjs->xpos[i];\n        }\n\n        if (i >= 9)\n            continue;\n\n        if (sHpBarObjs->xpos[i] > 172 + (8 * i))\n        {\n            sHpBarObjs->xpos[i] -= 60;\n\n            if (sHpBarObjs->xpos[i] < 172 + (8 * i))\n                sHpBarObjs->xpos[i] = 172 + (8 * i);\n\n            sHpBarObjs->sprites[i]->x = sHpBarObjs->xpos[i];\n        }\n    }\n}\n\nstatic void PokeSum_FlipPages_SlideLayerLeft(void)\n{\n    if (sMonSummaryScreen->flipPagesBgHofs < 240)\n    {\n        sMonSummaryScreen->flipPagesBgHofs += 60;\n        if (sMonSummaryScreen->flipPagesBgHofs > 240)\n            sMonSummaryScreen->flipPagesBgHofs = 240;\n\n        if (sMonSummaryScreen->whichBgLayerToTranslate == 0)\n            SetGpuReg(REG_OFFSET_BG2HOFS, -sMonSummaryScreen->flipPagesBgHofs);\n        else\n            SetGpuReg(REG_OFFSET_BG1HOFS, -sMonSummaryScreen->flipPagesBgHofs);\n    }\n}\n\nstatic void PokeSum_FlipPages_SlideLayeRight(void)\n{\n    if (sMonSummaryScreen->flipPagesBgHofs >= 60)\n    {\n        sMonSummaryScreen->flipPagesBgHofs -= 60;\n        if (sMonSummaryScreen->flipPagesBgHofs < 0)\n            sMonSummaryScreen->flipPagesBgHofs = 0;\n\n        if (sMonSummaryScreen->whichBgLayerToTranslate == 0)\n            SetGpuReg(REG_OFFSET_BG1HOFS, -sMonSummaryScreen->flipPagesBgHofs);\n        else\n            SetGpuReg(REG_OFFSET_BG2HOFS, -sMonSummaryScreen->flipPagesBgHofs);\n\n        if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)\n            SetGpuReg(REG_OFFSET_BG0HOFS, -sMonSummaryScreen->flipPagesBgHofs);\n    }\n}\n\nstatic void PokeSum_FlipPages_HandleBgHofs(void)\n{\n    if (sMonSummaryScreen->pageFlipDirection == 1) // Right\n    {\n        if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)\n            PokeSum_FlipPages_SlideLayerLeft();\n        else\n            PokeSum_FlipPages_SlideLayeRight();\n    }\n    else\n    {\n        if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES)\n            PokeSum_FlipPages_SlideLayeRight();\n        else\n            PokeSum_FlipPages_SlideLayerLeft();\n    }\n}\n\nstatic void PokeSum_FlipPages_HandleHpExpBarSprites(void)\n{\n    if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS\n        && sMonSummaryScreen->pageFlipDirection == 0)\n        PokeSum_FlipPages_SlideHpExpBarsIn();\n\n    if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES\n        && sMonSummaryScreen->pageFlipDirection == 1)\n        PokeSum_FlipPages_SlideHpExpBarsOut();\n}\n\nstatic void VBlankCB_PokemonSummaryScreen(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n\n    if (sMonSummaryScreen->flippingPages == FALSE)\n        return;\n\n    PokeSum_FlipPages_HandleBgHofs();\n    PokeSum_FlipPages_HandleHpExpBarSprites();\n}\n\nstatic void PokeSum_Setup_ResetCallbacks(void)\n{\n    SetVBlankCallback(NULL);\n    SetHBlankCallback(NULL);\n}\n\nstatic void PokeSum_Setup_SetVBlankCallback(void)\n{\n    SetVBlankCallback(VBlankCB_PokemonSummaryScreen);\n}\n\nstatic void PokeSum_CreateWindows(void)\n{\n    u32 i;\n\n    InitWindows(sWindowTemplates_Dummy);\n\n    for (i = 0; i < 3; i++)\n        sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg1[i]);\n\n    for (i = 0; i < 4; i++)\n        switch (sMonSummaryScreen->curPageIndex)\n        {\n        case PSS_PAGE_INFO:\n            sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Info[i]);\n            break;\n        case PSS_PAGE_SKILLS:\n            sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Skills[i]);\n            break;\n        case PSS_PAGE_MOVES:\n        case PSS_PAGE_MOVES_INFO:\n            sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Moves[i]);\n            break;\n        default:\n            break;\n        }\n}\n\nstatic void PokeSum_AddWindows(u8 curPageIndex)\n{\n    u32 i;\n    u32 bgPriority1 = GetGpuReg(REG_OFFSET_BG1CNT) & 3;\n    u32 bgPriority2 = GetGpuReg(REG_OFFSET_BG2CNT) & 3;\n\n    for (i = 0; i < 7; i++)\n        sMonSummaryScreen->windowIds[i] = 0xff;\n\n    if ((sMonSummaryScreen->pageFlipDirection == 1 && sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)\n        || (sMonSummaryScreen->pageFlipDirection == 0 && sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES))\n    {\n        if (bgPriority2 > bgPriority1)\n            for (i = 0; i < 3; i++)\n                sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg2[i]);\n        else\n            for (i = 0; i < 3; i++)\n                sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg1[i]);\n    }\n    else\n    {\n        if (bgPriority2 > bgPriority1)\n            for (i = 0; i < 3; i++)\n                sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg1[i]);\n        else\n            for (i = 0; i < 3; i++)\n                sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg2[i]);\n    }\n\n    for (i = 0; i < 4; i++)\n        switch (curPageIndex)\n        {\n        case PSS_PAGE_INFO:\n            sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Info[i]);\n            break;\n        case PSS_PAGE_SKILLS:\n        default:\n            sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Skills[i]);\n            break;\n        case PSS_PAGE_MOVES:\n        case PSS_PAGE_MOVES_INFO:\n            sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Moves[i]);\n            break;\n        }\n}\n\nstatic void PokeSum_RemoveWindows(u8 curPageIndex)\n{\n    u32 i;\n\n    for (i = 0; i < 7; i++)\n        RemoveWindow(sMonSummaryScreen->windowIds[i]);\n\n}\n\nstatic void PokeSum_SetHelpContext(void)\n{\n    switch (sMonSummaryScreen->curPageIndex)\n    {\n    case PSS_PAGE_INFO:\n        SetHelpContext(HELPCONTEXT_POKEMON_INFO);\n        break;\n    case PSS_PAGE_SKILLS:\n        SetHelpContext(HELPCONTEXT_POKEMON_SKILLS);\n        break;\n    case PSS_PAGE_MOVES:\n    case PSS_PAGE_MOVES_INFO:\n        SetHelpContext(HELPCONTEXT_POKEMON_MOVES);\n        break;\n    }\n}\n\nstatic u8 PokeSum_BufferOtName_IsEqualToCurrentOwner(struct Pokemon * mon)\n{\n    u32 i;\n    u8 multiplayerId;\n    u32 trainerId = 0;\n\n    if (sMonSummaryScreen->monList.mons == gEnemyParty)\n    {\n        multiplayerId = GetMultiplayerId() ^ 1;\n        trainerId = gLinkPlayers[multiplayerId].trainerId & 0xffff;\n        StringCopy(sMonSummaryScreen->summary.otNameStrBufs[0], gLinkPlayers[multiplayerId].name);\n    }\n    else\n    {\n        trainerId = GetPlayerTrainerId() & 0xffff;\n        StringCopy(sMonSummaryScreen->summary.otNameStrBufs[0], gSaveBlock2Ptr->playerName);\n    }\n\n    if (trainerId != (GetMonData(mon, MON_DATA_OT_ID) & 0xffff))\n        return FALSE;\n\n    GetMonData(mon, MON_DATA_OT_NAME, sMonSummaryScreen->summary.otNameStrBufs[1]);\n\n    if (!StringCompareWithoutExtCtrlCodes(sMonSummaryScreen->summary.otNameStrBufs[0], sMonSummaryScreen->summary.otNameStrBufs[1]))\n        return TRUE;\n    else\n        return FALSE;\n\n    return TRUE;\n}\n\n#define PAGE_PROGRESS_BASE_TILE_NUM (345)\n\nstatic void PokeSum_DrawPageProgressTiles(void)\n{\n    switch (sMonSummaryScreen->curPageIndex)\n    {\n    case PSS_PAGE_INFO:\n        if (!sMonSummaryScreen->isEgg)\n        {\n            FillBgTilemapBufferRect(3, 17 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 33 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 16 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 32 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 18 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 34 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 1, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 20 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 0, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 36 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 1, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 18 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 0, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 34 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 1, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 21 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 0, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 37 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 1, 1, 1, 0);\n        }\n        else\n        {\n            FillBgTilemapBufferRect(3, 17 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 33 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 48 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 64 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0);\n            FillBgTilemapBufferRect(3,  2 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 4, 2, 0);\n        }\n        break;\n    case PSS_PAGE_SKILLS:\n        FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0);\n        FillBgTilemapBufferRect(3,  1 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 17 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 33 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 1, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 16 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 32 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 1, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 18 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 34 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 1, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 21 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 37 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 1, 1, 1, 0);\n        break;\n    case PSS_PAGE_MOVES:\n        FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0);\n        FillBgTilemapBufferRect(3,  1 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 1, 1, 1, 0);\n        FillBgTilemapBufferRect(3,  1 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 1, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 17 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 33 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 1, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 48 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 64 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 1, 1, 1, 0);\n        break;\n    case PSS_PAGE_MOVES_INFO:\n        if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE)\n        {\n            FillBgTilemapBufferRect(3,  1 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 4, 1, 0);\n            FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 4, 1, 0);\n        }\n        else\n        {\n            FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0);\n            FillBgTilemapBufferRect(3,  1 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 1, 1, 1, 0);\n            FillBgTilemapBufferRect(3,  1 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 0, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 1, 1, 1, 0);\n        }\n        FillBgTilemapBufferRect(3, 50 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 66 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 1, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 48 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 0, 1, 1, 0);\n        FillBgTilemapBufferRect(3, 64 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 1, 1, 1, 0);\n        break;\n    }\n}\n\nstatic void PokeSum_PrintMonTypeIcons(void)\n{\n    switch (sMonSummaryScreen->curPageIndex)\n    {\n    case PSS_PAGE_INFO:\n        if (!sMonSummaryScreen->isEgg)\n        {\n            BlitMenuInfoIcon(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], sMonSummaryScreen->monTypes[0] + 1, 47, 35);\n\n            if (sMonSummaryScreen->monTypes[0] != sMonSummaryScreen->monTypes[1])\n                BlitMenuInfoIcon(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], sMonSummaryScreen->monTypes[1] + 1, 83, 35);\n        }\n        break;\n    case PSS_PAGE_SKILLS:\n        break;\n    case PSS_PAGE_MOVES:\n        break;\n    case PSS_PAGE_MOVES_INFO:\n        FillWindowPixelBuffer(sMonSummaryScreen->windowIds[6], 0);\n        BlitMenuInfoIcon(sMonSummaryScreen->windowIds[6], sMonSummaryScreen->monTypes[0] + 1, 0, 3);\n\n        if (sMonSummaryScreen->monTypes[0] != sMonSummaryScreen->monTypes[1])\n            BlitMenuInfoIcon(sMonSummaryScreen->windowIds[6], sMonSummaryScreen->monTypes[1] + 1, 36, 3);\n\n        PutWindowTilemap(sMonSummaryScreen->windowIds[6]);\n        break;\n    }\n}\n\nu8 GetLastViewedMonIndex(void)\n{\n    return sLastViewedMonIndex;\n}\n\nu8 GetMoveSlotToReplace(void)\n{\n    return sMoveSwapCursorPos;\n}\n\nvoid SetPokemonSummaryScreenMode(u8 mode)\n{\n    sMonSummaryScreen->mode = mode;\n}\n\nstatic bool32 IsMultiBattlePartner(void)\n{\n    if (!IsUpdateLinkStateCBActive()\n        && IsMultiBattle() == TRUE\n        && gReceivedRemoteLinkPlayers == 1\n        && (sLastViewedMonIndex >= 4 || sLastViewedMonIndex == 1))\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic void BufferSelectedMonData(struct Pokemon * mon)\n{\n    if (!sMonSummaryScreen->isBoxMon)\n    {\n        struct Pokemon * partyMons = sMonSummaryScreen->monList.mons;\n        *mon = partyMons[GetLastViewedMonIndex()];\n    }\n    else\n    {\n        struct BoxPokemon * boxMons = sMonSummaryScreen->monList.boxMons;\n        BoxMonToMon(&boxMons[GetLastViewedMonIndex()], mon);\n        PopulateBoxHpAndStatusToPartyMon(mon);\n    }\n}\n\nstatic u16 GetMonMoveBySlotId(struct Pokemon * mon, u8 moveSlot)\n{\n    u16 move;\n\n    switch (moveSlot)\n    {\n    case 0:\n        move = GetMonData(mon, MON_DATA_MOVE1);\n        break;\n    case 1:\n        move = GetMonData(mon, MON_DATA_MOVE2);\n        break;\n    case 2:\n        move = GetMonData(mon, MON_DATA_MOVE3);\n        break;\n    default:\n        move = GetMonData(mon, MON_DATA_MOVE4);\n    }\n\n    return move;\n}\n\nstatic u16 GetMonPpByMoveSlot(struct Pokemon * mon, u8 moveSlot)\n{\n    u16 pp;\n\n    switch (moveSlot)\n    {\n    case 0:\n        pp = GetMonData(mon, MON_DATA_PP1);\n        break;\n    case 1:\n        pp = GetMonData(mon, MON_DATA_PP2);\n        break;\n    case 2:\n        pp = GetMonData(mon, MON_DATA_PP3);\n        break;\n    default:\n        pp = GetMonData(mon, MON_DATA_PP4);\n    }\n    return pp;\n}\n\nstatic u8 StatusToAilment(u32 status)\n{\n    if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP) == 0)\n        return AILMENT_FNT;\n\n    if ((status & STATUS1_PSN_ANY) != 0)\n        return AILMENT_PSN;\n\n    if ((status & STATUS1_PARALYSIS) != 0)\n        return AILMENT_PRZ;\n\n    if ((status & STATUS1_SLEEP) != 0)\n        return AILMENT_SLP;\n\n    if ((status & STATUS1_FREEZE) != 0)\n        return AILMENT_FRZ;\n\n    if ((status & STATUS1_BURN) != 0)\n        return AILMENT_BRN;\n\n    if (CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0))\n        return AILMENT_PKRS;\n\n    return AILMENT_NONE;\n}\n\nstatic void Task_HandleInput_SelectMove(u8 taskId)\n{\n    u32 i;\n\n    switch (sMonSummaryScreen->selectMoveInputHandlerState)\n    {\n    case 0:\n        if (IsActiveOverworldLinkBusy() == TRUE || IsLinkRecvQueueAtOverworldMax() == TRUE)\n            return;\n\n        if (JOY_NEW(DPAD_UP))\n        {\n            if (sMoveSelectionCursorPos > 0)\n            {\n                sMonSummaryScreen->selectMoveInputHandlerState = 2;\n                PlaySE(SE_SELECT);\n\n                for (i = sMoveSelectionCursorPos; i > 0; i--)\n                    if (sMonSummaryScreen->moveIds[i - 1] != 0)\n                    {\n                        PlaySE(SE_SELECT);\n                        sMoveSelectionCursorPos = i - 1;\n                        return;\n                    }\n            }\n            else\n            {\n                sMoveSelectionCursorPos = 4;\n                sMonSummaryScreen->selectMoveInputHandlerState = 2;\n                PlaySE(SE_SELECT);\n\n                if (sMonSummaryScreen->isSwappingMoves == TRUE)\n                    for (i = sMoveSelectionCursorPos; i > 0; i--)\n                        if (sMonSummaryScreen->moveIds[i - 1] != 0)\n                        {\n                            PlaySE(SE_SELECT);\n                            sMoveSelectionCursorPos = i - 1;\n                            return;\n                        }\n            }\n        }\n        else if (JOY_NEW(DPAD_DOWN))\n        {\n            if (sMoveSelectionCursorPos < 4)\n            {\n                u8 v0 = 4;\n\n                sMonSummaryScreen->selectMoveInputHandlerState = 2;\n\n                if (sMonSummaryScreen->isSwappingMoves == TRUE)\n                {\n                    if (sMoveSelectionCursorPos == 5 - 2)\n                    {\n                        sMoveSelectionCursorPos = 0;\n                        sMonSummaryScreen->selectMoveInputHandlerState = 2;\n                        PlaySE(SE_SELECT);\n                        return;\n                    }\n                    v0--;\n                }\n\n                for (i = sMoveSelectionCursorPos; i < v0; i++)\n                    if (sMonSummaryScreen->moveIds[i + 1] != 0)\n                    {\n                        PlaySE(SE_SELECT);\n                        sMoveSelectionCursorPos = i + 1;\n                        return;\n                    }\n\n                if (!sMonSummaryScreen->isSwappingMoves)\n                {\n                    PlaySE(SE_SELECT);\n                    sMoveSelectionCursorPos = i;\n                }\n                else\n                {\n                    PlaySE(SE_SELECT);\n                    sMoveSelectionCursorPos = 0;\n                }\n\n                return;\n            }\n            else if (sMoveSelectionCursorPos == 4)\n            {\n                sMoveSelectionCursorPos = 0;\n                sMonSummaryScreen->selectMoveInputHandlerState = 2;\n                PlaySE(SE_SELECT);\n                return;\n            }\n        }\n        else if (JOY_NEW(A_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            if (sMoveSelectionCursorPos == 4)\n            {\n                sMoveSelectionCursorPos = 0;\n                sMoveSwapCursorPos = 0;\n                sMonSummaryScreen->isSwappingMoves = FALSE;\n                ShoworHideMoveSelectionCursor(TRUE);\n                sMonSummaryScreen->pageFlipDirection = 0;\n                PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex);\n                sMonSummaryScreen->curPageIndex--;\n                sMonSummaryScreen->selectMoveInputHandlerState = 1;\n                return;\n            }\n\n            if (sMonSummaryScreen->isSwappingMoves != TRUE)\n            {\n                if (sMonSummaryScreen->isEnemyParty == FALSE\n                    && gMain.inBattle == 0\n                    && gReceivedRemoteLinkPlayers == 0)\n                {\n                    sMoveSwapCursorPos = sMoveSelectionCursorPos;\n                    sMonSummaryScreen->isSwappingMoves = TRUE;\n                }\n                return;\n            }\n            else\n            {\n                sMonSummaryScreen->isSwappingMoves = FALSE;\n\n                if (sMoveSelectionCursorPos == sMoveSwapCursorPos)\n                    return;\n\n                if (sMonSummaryScreen->isBoxMon == 0)\n                    SwapMonMoveSlots();\n                else\n                    SwapBoxMonMoveSlots();\n\n                UpdateCurrentMonBufferFromPartyOrBox(&sMonSummaryScreen->currentMon);\n                BufferMonMoves();\n                sMonSummaryScreen->selectMoveInputHandlerState = 2;\n                return;\n            }\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            if (sMonSummaryScreen->isSwappingMoves == TRUE)\n            {\n                sMoveSwapCursorPos = sMoveSelectionCursorPos;\n                sMonSummaryScreen->isSwappingMoves = FALSE;\n                return;\n            }\n\n            if (sMoveSelectionCursorPos == 4)\n            {\n                sMoveSelectionCursorPos = 0;\n                sMoveSwapCursorPos = 0;\n            }\n\n            ShoworHideMoveSelectionCursor(TRUE);\n            sMonSummaryScreen->pageFlipDirection = 0;\n            PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex);\n            sMonSummaryScreen->curPageIndex--;\n            sMonSummaryScreen->selectMoveInputHandlerState = 1;\n        }\n        break;\n    case 1:\n        gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_BackOutOfSelectMove;\n        sMonSummaryScreen->selectMoveInputHandlerState = 0;\n        break;\n    case 2:\n        PokeSum_PrintRightPaneText();\n        PokeSum_PrintBottomPaneText();\n        PokeSum_PrintAbilityDataOrMoveTypes();\n        sMonSummaryScreen->selectMoveInputHandlerState = 3;\n        break;\n    case 3:\n        if (IsActiveOverworldLinkBusy() == TRUE || IsLinkRecvQueueAtOverworldMax() == TRUE)\n            return;\n\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(3);\n        sMonSummaryScreen->selectMoveInputHandlerState = 0;\n        break;\n    default:\n        break;\n    }\n}\n\nstatic void SwapMonMoveSlots(void)\n{\n    struct Pokemon * partyMons;\n    struct Pokemon * mon;\n\n    u16 move1, move2;\n    u8 pp1, pp2;\n    u8 allMovesPPBonuses;\n    u8 move1ppBonus, move2ppBonus;\n\n    partyMons = sMonSummaryScreen->monList.mons;\n    mon = &partyMons[GetLastViewedMonIndex()];\n\n    move1 = GetMonData(mon, MON_DATA_MOVE1 + sMoveSelectionCursorPos);\n    move2 = GetMonData(mon, MON_DATA_MOVE1 + sMoveSwapCursorPos);\n\n    pp1 = GetMonData(mon, MON_DATA_PP1 + sMoveSelectionCursorPos);\n    pp2 = GetMonData(mon, MON_DATA_PP1 + sMoveSwapCursorPos);\n\n    allMovesPPBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);\n\n    move1ppBonus = (allMovesPPBonuses & gPPUpGetMask[sMoveSelectionCursorPos]) >> (sMoveSelectionCursorPos * 2);\n    move2ppBonus = (allMovesPPBonuses & gPPUpGetMask[sMoveSwapCursorPos]) >> (sMoveSwapCursorPos * 2);\n\n    allMovesPPBonuses &= ~gPPUpGetMask[sMoveSelectionCursorPos];\n    allMovesPPBonuses &= ~gPPUpGetMask[sMoveSwapCursorPos];\n    allMovesPPBonuses |= (move1ppBonus << (sMoveSwapCursorPos * 2)) + (move2ppBonus << (sMoveSelectionCursorPos * 2));\n\n    SetMonData(mon, MON_DATA_MOVE1 + sMoveSelectionCursorPos, (u8 *)&move2);\n    SetMonData(mon, MON_DATA_MOVE1 + sMoveSwapCursorPos, (u8 *)&move1);\n    SetMonData(mon, MON_DATA_PP1 + sMoveSelectionCursorPos, &pp2);\n    SetMonData(mon, MON_DATA_PP1 + sMoveSwapCursorPos, &pp1);\n    SetMonData(mon, MON_DATA_PP_BONUSES, &allMovesPPBonuses);\n}\n\nstatic void SwapBoxMonMoveSlots(void)\n{\n    struct BoxPokemon * boxMons;\n    struct BoxPokemon * boxMon;\n\n    u16 move1, move2;\n    u8 pp1, pp2;\n    u8 allMovesPPBonuses;\n    u8 move1ppBonus, move2ppBonus;\n\n    boxMons = sMonSummaryScreen->monList.boxMons;\n    boxMon = &boxMons[GetLastViewedMonIndex()];\n\n    move1 = GetBoxMonData(boxMon, MON_DATA_MOVE1 + sMoveSelectionCursorPos);\n    move2 = GetBoxMonData(boxMon, MON_DATA_MOVE1 + sMoveSwapCursorPos);\n\n    pp1 = GetBoxMonData(boxMon, MON_DATA_PP1 + sMoveSelectionCursorPos);\n    pp2 = GetBoxMonData(boxMon, MON_DATA_PP1 + sMoveSwapCursorPos);\n\n    allMovesPPBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES);\n\n    move1ppBonus = (allMovesPPBonuses & gPPUpGetMask[sMoveSelectionCursorPos]) >> (sMoveSelectionCursorPos * 2);\n    move2ppBonus = (allMovesPPBonuses & gPPUpGetMask[sMoveSwapCursorPos]) >> (sMoveSwapCursorPos * 2);\n\n    allMovesPPBonuses &= ~gPPUpGetMask[sMoveSelectionCursorPos];\n    allMovesPPBonuses &= ~gPPUpGetMask[sMoveSwapCursorPos];\n    allMovesPPBonuses |= (move1ppBonus << (sMoveSwapCursorPos * 2)) + (move2ppBonus << (sMoveSelectionCursorPos * 2));\n\n    SetBoxMonData(boxMon, MON_DATA_MOVE1 + sMoveSelectionCursorPos, (u8 *)&move2);\n    SetBoxMonData(boxMon, MON_DATA_MOVE1 + sMoveSwapCursorPos, (u8 *)&move1);\n    SetBoxMonData(boxMon, MON_DATA_PP1 + sMoveSelectionCursorPos, &pp2);\n    SetBoxMonData(boxMon, MON_DATA_PP1 + sMoveSwapCursorPos, &pp1);\n    SetBoxMonData(boxMon, MON_DATA_PP_BONUSES, &allMovesPPBonuses);\n}\n\nstatic void UpdateCurrentMonBufferFromPartyOrBox(struct Pokemon * mon)\n{\n    if (!sMonSummaryScreen->isBoxMon)\n    {\n        struct Pokemon * partyMons;\n        partyMons = sMonSummaryScreen->monList.mons;\n        *mon = partyMons[GetLastViewedMonIndex()];\n    }\n    else\n    {\n        struct BoxPokemon * boxMons;\n        boxMons = sMonSummaryScreen->monList.boxMons;\n        BoxMonToMon(&boxMons[GetLastViewedMonIndex()], mon);\n        PopulateBoxHpAndStatusToPartyMon(mon);\n    }\n}\n\nstatic u8 PokeSum_CanForgetSelectedMove(void)\n{\n    u16 move;\n\n    move = GetMonMoveBySlotId(&sMonSummaryScreen->currentMon, sMoveSelectionCursorPos);\n\n    if(IsMoveHm(move) && (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TWO_ISLAND_HOUSE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TWO_ISLAND_HOUSE)))\n    {   //in Move Reminder's house\n        if(VarGet(VAR_TEMP_0)) //currently in Move Reminder's script\n            return TRUE; //able to overwrite HMs\n    }\n\n    if (IsMoveHm(move) == TRUE && sMonSummaryScreen->mode != PSS_MODE_FORGET_MOVE)\n        return FALSE;\n\n    return TRUE;\n}\n\nstatic void Task_InputHandler_SelectOrForgetMove(u8 taskId)\n{\n    u32 i;\n\n    switch (sMonSummaryScreen->selectMoveInputHandlerState)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0);\n        sMonSummaryScreen->selectMoveInputHandlerState++;\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n        {\n            PokeSum_TryPlayMonCry();\n            sMonSummaryScreen->selectMoveInputHandlerState++;\n        }\n        break;\n    case 2:\n        if (JOY_NEW(DPAD_UP))\n        {\n            if (sMoveSelectionCursorPos > 0)\n            {\n                sMonSummaryScreen->selectMoveInputHandlerState = 3;\n                PlaySE(SE_SELECT);\n                for (i = sMoveSelectionCursorPos; i > 0; i--)\n                    if (sMonSummaryScreen->moveIds[i - 1] != 0)\n                    {\n                        PlaySE(SE_SELECT);\n                        sMoveSelectionCursorPos = i - 1;\n                        return;\n                    }\n            }\n            else\n            {\n                sMoveSelectionCursorPos = 4;\n                sMonSummaryScreen->selectMoveInputHandlerState = 3;\n                PlaySE(SE_SELECT);\n                return;\n            }\n        }\n        else if (JOY_NEW(DPAD_DOWN))\n        {\n            if (sMoveSelectionCursorPos < 4)\n            {\n                u8 v0 = 4;\n\n                sMonSummaryScreen->selectMoveInputHandlerState = 3;\n\n                if (sMonSummaryScreen->isSwappingMoves == TRUE)\n                    v0--;\n\n                for (i = sMoveSelectionCursorPos; i < v0; i++)\n                    if (sMonSummaryScreen->moveIds[i + 1] != 0)\n                    {\n                        PlaySE(SE_SELECT);\n                        sMoveSelectionCursorPos = i + 1;\n                        return;\n                    }\n\n                if (!sMonSummaryScreen->isSwappingMoves)\n                {\n                    PlaySE(SE_SELECT);\n                    sMoveSelectionCursorPos = i;\n                }\n\n                return;\n            }\n            else if (sMoveSelectionCursorPos == 4)\n            {\n                sMoveSelectionCursorPos = 0;\n                sMonSummaryScreen->selectMoveInputHandlerState = 3;\n                PlaySE(SE_SELECT);\n                return;\n            }\n        }\n        else if (JOY_NEW(A_BUTTON))\n        {\n            if (PokeSum_CanForgetSelectedMove() == TRUE || sMoveSelectionCursorPos == 4)\n            {\n                PlaySE(SE_SELECT);\n                sMoveSwapCursorPos = sMoveSelectionCursorPos;\n                gSpecialVar_0x8005 = sMoveSwapCursorPos;\n                sMonSummaryScreen->selectMoveInputHandlerState = 6;\n            }\n            else\n            {\n                PlaySE(SE_FAILURE);\n                sMonSummaryScreen->selectMoveInputHandlerState = 5;\n            }\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            sMoveSwapCursorPos = 4;\n            gSpecialVar_0x8005 = (u16)sMoveSwapCursorPos;\n            sMonSummaryScreen->selectMoveInputHandlerState = 6;\n        }\n        break;\n    case 3:\n        PokeSum_PrintRightPaneText();\n        PokeSum_PrintBottomPaneText();\n        PokeSum_PrintAbilityDataOrMoveTypes();\n        sMonSummaryScreen->selectMoveInputHandlerState = 4;\n        break;\n    case 4:\n        if (IsActiveOverworldLinkBusy() == TRUE || IsLinkRecvQueueAtOverworldMax() == TRUE)\n            return;\n\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(3);\n        sMonSummaryScreen->selectMoveInputHandlerState = 2;\n        break;\n    case 5:\n        FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 0);\n        AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,\n                                     7, 42,\n                                     0, 0,\n                                     sLevelNickTextColors[0], TEXT_SKIP_DRAW,\n                                     gText_PokeSum_HmMovesCantBeForgotten);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(3);\n        sMonSummaryScreen->selectMoveInputHandlerState = 2;\n        break;\n    case 6:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0);\n        sMonSummaryScreen->selectMoveInputHandlerState++;\n        break;\n    default:\n        if (!gPaletteFade.active)\n            Task_DestroyResourcesOnExit(taskId);\n        break;\n    }\n}\n\nstatic void SpriteCB_PokeSum_MonPicSprite(struct Sprite *sprite)\n{\n    if (sMonSummaryScreen->numMonPicBounces >= 2)\n        return;\n\n    if (sMonPicBounceState->initDelay++ >= 2)\n    {\n        u8 arrayLen;\n\n        switch (sMonPicBounceState->vigor)\n        {\n        case 0:\n            sprite->y += sMonPicBounceYDelta_Under60[sMonPicBounceState->animFrame++];\n            arrayLen = NELEMS(sMonPicBounceYDelta_Under60);\n            break;\n        case 1:\n            sprite->y += sMonPicBounceYDelta_60to80[sMonPicBounceState->animFrame++];\n            arrayLen = NELEMS(sMonPicBounceYDelta_60to80);\n            break;\n        case 2:\n            sprite->y += sMonPicBounceYDelta_80to99[sMonPicBounceState->animFrame++];\n            arrayLen = NELEMS(sMonPicBounceYDelta_80to99);\n            break;\n        case 3:\n        default:\n            sprite->y += sMonPicBounceYDelta_Full[sMonPicBounceState->animFrame++];\n            arrayLen = NELEMS(sMonPicBounceYDelta_Full);\n            break;\n        }\n\n        if (sMonPicBounceState->animFrame >= arrayLen)\n        {\n            sMonPicBounceState->animFrame = 0;\n            sMonSummaryScreen->numMonPicBounces++;\n        }\n\n        sMonPicBounceState->initDelay = 0;\n    }\n}\n\nstatic void SpriteCB_PokeSum_EggPicShake(struct Sprite *sprite)\n{\n    if (sMonSummaryScreen->numMonPicBounces >= 2)\n        return;\n\n    switch (sMonPicBounceState->vigor)\n    {\n    case 0:\n    default:\n        if (sMonPicBounceState->initDelay++ >= 120)\n        {\n            sprite->x += sEggPicShakeXDelta_ItWillTakeSomeTime[sMonPicBounceState->animFrame];\n            if (++sMonPicBounceState->animFrame >= NELEMS(sEggPicShakeXDelta_ItWillTakeSomeTime))\n            {\n                sMonPicBounceState->animFrame = 0;\n                sMonPicBounceState->initDelay = 0;\n                sMonSummaryScreen->numMonPicBounces++;\n            }\n        }\n        break;\n    case 1:\n        if (sMonPicBounceState->initDelay++ >= 90)\n        {\n            sprite->x += sEggPicShakeXDelta_OccasionallyMoves[sMonPicBounceState->animFrame];\n            if (++sMonPicBounceState->animFrame >= NELEMS(sEggPicShakeXDelta_OccasionallyMoves))\n            {\n                sMonPicBounceState->animFrame = 0;\n                sMonPicBounceState->initDelay = 0;\n                sMonSummaryScreen->numMonPicBounces++;\n            }\n        }\n        break;\n    case 2:\n        if (sMonPicBounceState->initDelay++ >= 60)\n        {\n            sprite->x += sEggPicShakeXDelta_AlmostReadyToHatch[sMonPicBounceState->animFrame];\n            if (++sMonPicBounceState->animFrame >= NELEMS(sEggPicShakeXDelta_AlmostReadyToHatch))\n            {\n                sMonPicBounceState->animFrame = 0;\n                sMonPicBounceState->initDelay = 0;\n                sMonSummaryScreen->numMonPicBounces++;\n            }\n        }\n        break;\n    }\n}\n\nstatic void SpriteCB_MonPicDummy(struct Sprite *sprite)\n{\n}\n\nstatic void PokeSum_CreateMonPicSprite(void)\n{\n    u16 spriteId;\n    u16 species;\n    u32 personality;\n    u32 trainerId;\n\n    sMonPicBounceState = AllocZeroed(sizeof(struct MonPicBounceState));\n\n    species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG);\n    personality = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_PERSONALITY);\n    if(species == SPECIES_DEOXYS)\n    {\n        switch(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_FORME))\n        {\n            case 1: //Attack Forme\n                species = 65531;\n                break;\n            case 2:\n                species = 65532;\n                break;\n            case 3:\n                species = 65533;\n                break;\n            default:\n                species = 65530;\n                break;\n        }\n    }\n    trainerId = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_ID);\n\n    if (sMonSummaryScreen->savedCallback == CB2_ReturnToTradeMenuFromSummary)\n    {\n        if (sMonSummaryScreen->isEnemyParty == TRUE)\n            spriteId = CreateMonPicSprite(species, trainerId, personality, TRUE, 60, 65, 12, 0xffff, TRUE);\n        else\n            spriteId = CreateMonPicSprite_HandleDeoxys(species, trainerId, personality, TRUE, 60, 65, 12, 0xffff);\n    }\n    else\n    {\n        if (ShouldIgnoreDeoxysForm(DEOXYS_CHECK_TRADE_MAIN, sLastViewedMonIndex))\n            spriteId = CreateMonPicSprite(species, trainerId, personality, TRUE, 60, 65, 12, 0xffff, TRUE);\n        else\n            spriteId = CreateMonPicSprite_HandleDeoxys(species, trainerId, personality, TRUE, 60, 65, 12, 0xffff);\n    }\n\n    FreeSpriteOamMatrix(&gSprites[spriteId]);\n\n    if (!IsMonSpriteNotFlipped(species))\n        gSprites[spriteId].hFlip = TRUE;\n    else\n        gSprites[spriteId].hFlip = FALSE;\n\n    sMonSummaryScreen->monPicSpriteId = spriteId;\n\n    PokeSum_ShowOrHideMonPicSprite(TRUE);\n    PokeSum_SetMonPicSpriteCallback(spriteId);\n}\n\nstatic void PokeSum_SetMonPicSpriteCallback(u16 spriteId)\n{\n    u16 curHp;\n    u16 maxHp;\n\n    sMonSummaryScreen->numMonPicBounces = 0;\n\n    if (sMonSummaryScreen->isEgg == TRUE)\n    {\n        u8 friendship = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_FRIENDSHIP);\n\n        if (friendship <= 5)\n            sMonPicBounceState->vigor = 2;\n        else\n        {\n            if (friendship <= 10)\n                sMonPicBounceState->vigor = 1;\n            else if (friendship <= 40)\n                sMonPicBounceState->vigor = 0;\n        }\n\n        gSprites[spriteId].callback = SpriteCB_PokeSum_EggPicShake;\n        return;\n    }\n\n    if (sMonSummaryScreen->curMonStatusAilment != AILMENT_NONE && sMonSummaryScreen->curMonStatusAilment != AILMENT_PKRS)\n    {\n        if (sMonSummaryScreen->curMonStatusAilment == AILMENT_FNT)\n            return;\n\n        gSprites[spriteId].callback = SpriteCB_MonPicDummy;\n        return;\n    }\n\n    curHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP);\n    maxHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MAX_HP);\n\n    if (curHp == maxHp)\n        sMonPicBounceState->vigor = 3;\n    else if (maxHp * 0.8 <= curHp)\n        sMonPicBounceState->vigor = 2;\n    else if (maxHp * 0.6 <= curHp)\n        sMonPicBounceState->vigor = 1;\n    else\n        sMonPicBounceState->vigor = 0;\n\n    gSprites[spriteId].callback = SpriteCB_PokeSum_MonPicSprite;\n}\n\nstatic void PokeSum_ShowOrHideMonPicSprite(u8 invisible)\n{\n    gSprites[sMonSummaryScreen->monPicSpriteId].invisible = invisible;\n}\n\nstatic void PokeSum_DestroyMonPicSprite(void)\n{\n    FreeAndDestroyMonPicSprite(sMonSummaryScreen->monPicSpriteId);\n    FREE_AND_SET_NULL(sMonPicBounceState);\n}\n\nstatic void CreateBallIconObj(void)\n{\n    u16 ballItemId;\n    u8 ballId;\n\n    if (!sMonSummaryScreen->isEgg)\n        ballItemId = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_POKEBALL);\n    else\n        ballItemId = 0;\n\n    ballId = ItemIdToBallId(ballItemId);\n    LoadBallGfx(ballId);\n\n    sMonSummaryScreen->ballIconSpriteId = CreateSprite(&gBallSpriteTemplates[ballId], 106, 88, 0);\n    gSprites[sMonSummaryScreen->ballIconSpriteId].callback = SpriteCallbackDummy;\n    gSprites[sMonSummaryScreen->ballIconSpriteId].oam.priority = 0;\n\n    ShowOrHideBallIconObj(TRUE);\n}\n\nstatic void ShowOrHideBallIconObj(u8 invisible)\n{\n    gSprites[sMonSummaryScreen->ballIconSpriteId].invisible = invisible;\n}\n\nstatic void DestroyBallIconObj(void)\n{\n    // Redundant, as DestroySpriteAndFreeResources could've been used.\n    DestroySpriteAndFreeResources_Ball(&gSprites[sMonSummaryScreen->ballIconSpriteId]);\n}\n\nstatic void PokeSum_CreateMonIconSprite(void)\n{\n    u16 species;\n    u32 personality;\n\n    species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG);\n    personality = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_PERSONALITY);\n    if(species == SPECIES_DEOXYS)\n    {\n        switch(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_FORME))\n        {\n            case 1: //Attack Forme\n                species = 65531;\n                break;\n            case 2:\n                species = 65532;\n                break;\n            case 3:\n                species = 65533;\n                break;\n            default:\n                species = 65530;\n                break;\n        }\n    }\n\n    \n\n    SafeLoadMonIconPalette(species);\n\n    if (sMonSummaryScreen->savedCallback == CB2_ReturnToTradeMenuFromSummary)\n    {\n        if (sMonSummaryScreen->isEnemyParty == TRUE)\n            sMonSummaryScreen->monIconSpriteId = CreateMonIcon(species, SpriteCallbackDummy, 24, 32, 0, personality, 0);\n        else\n            sMonSummaryScreen->monIconSpriteId = CreateMonIcon(species, SpriteCallbackDummy, 24, 32, 0, personality, 1);\n    }\n    else\n    {\n        if (ShouldIgnoreDeoxysForm(DEOXYS_CHECK_TRADE_MAIN, sLastViewedMonIndex))\n            sMonSummaryScreen->monIconSpriteId = CreateMonIcon(species, SpriteCallbackDummy, 24, 32, 0, personality, 0);\n        else\n            sMonSummaryScreen->monIconSpriteId = CreateMonIcon(species, SpriteCallbackDummy, 24, 32, 0, personality, 1);\n    }\n\n    if (!IsMonSpriteNotFlipped(species))\n        gSprites[sMonSummaryScreen->monIconSpriteId].hFlip = TRUE;\n    else\n        gSprites[sMonSummaryScreen->monIconSpriteId].hFlip = FALSE;\n\n    PokeSum_ShowOrHideMonIconSprite(TRUE);\n}\n\nstatic void PokeSum_ShowOrHideMonIconSprite(bool8 invisible)\n{\n    gSprites[sMonSummaryScreen->monIconSpriteId].invisible = invisible;\n}\n\nstatic void PokeSum_DestroyMonIconSprite(void)\n{\n    u16 species;\n    species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG);\n    SafeFreeMonIconPalette(species);\n    DestroyMonIcon(&gSprites[sMonSummaryScreen->monIconSpriteId]);\n}\n\nstatic void CreateMoveSelectionCursorObjs(u16 tileTag, u16 palTag)\n{\n    u32 i;\n    u8 spriteId;\n    void *gfxBufferPtrs[2];\n    gfxBufferPtrs[0] = AllocZeroed(0x20 * 64);\n    gfxBufferPtrs[1] = AllocZeroed(0x20 * 64);\n\n    sMoveSelectionCursorObjs[0] = AllocZeroed(sizeof(struct MoveSelectionCursor));\n    sMoveSelectionCursorObjs[1] = AllocZeroed(sizeof(struct MoveSelectionCursor));\n    sMoveSelectionCursorObjs[2] = AllocZeroed(sizeof(struct MoveSelectionCursor));\n    sMoveSelectionCursorObjs[3] = AllocZeroed(sizeof(struct MoveSelectionCursor));\n\n    LZ77UnCompWram(sMoveSelectionCursorTiles_Left, gfxBufferPtrs[0]);\n    LZ77UnCompWram(sMoveSelectionCursorTiles_Right, gfxBufferPtrs[1]);\n\n    for (i = 0; i < 4; i++)\n    {\n        struct SpriteSheet sheet = {\n            .data = gfxBufferPtrs[i % 2],\n            .size = 0x20 * 64,\n            .tag = tileTag + i\n        };\n\n        struct SpritePalette palette = {.data = sMoveSelectionCursorPals, .tag = palTag};\n        struct SpriteTemplate template = {\n            .tileTag = tileTag + i,\n            .paletteTag = palTag,\n            .oam = &sMoveSelectionCursorOamData,\n            .anims = sMoveSelectionCursorOamAnimTable,\n            .images = NULL,\n            .affineAnims = gDummySpriteAffineAnimTable,\n            .callback = SpriteCB_MoveSelectionCursor,\n        };\n\n        LoadSpriteSheet(&sheet);\n        LoadSpritePalette(&palette);\n\n        spriteId = CreateSprite(&template, 64 * (i % 2) + 152, sMoveSelectionCursorPos * 28 + 34, i % 2);\n        sMoveSelectionCursorObjs[i]->sprite = &gSprites[spriteId];\n        sMoveSelectionCursorObjs[i]->whichSprite = i;\n        sMoveSelectionCursorObjs[i]->tileTag = tileTag + i;\n        sMoveSelectionCursorObjs[i]->palTag = palTag;\n        sMoveSelectionCursorObjs[i]->sprite->subpriority = i;\n\n        if (i > 1)\n            StartSpriteAnim(sMoveSelectionCursorObjs[i]->sprite, 1);\n    }\n\n    ShoworHideMoveSelectionCursor(TRUE);\n\n    FREE_AND_SET_NULL_IF_SET(gfxBufferPtrs[0]);\n    FREE_AND_SET_NULL_IF_SET(gfxBufferPtrs[1]);\n}\n\nstatic void ShoworHideMoveSelectionCursor(bool8 invisible)\n{\n    u32 i;\n    for (i = 0; i < 4; i++)\n        sMoveSelectionCursorObjs[i]->sprite->invisible = invisible;\n}\n\nstatic void SpriteCB_MoveSelectionCursor(struct Sprite *sprite)\n{\n    u32 i;\n\n    for (i = 0; i < 4; i++)\n    {\n        if (sMonSummaryScreen->isSwappingMoves == TRUE && i > 1)\n            continue;\n\n        sMoveSelectionCursorObjs[i]->sprite->y = sMoveSelectionCursorPos * 28 + 34;\n    }\n\n    if (sMonSummaryScreen->isSwappingMoves != TRUE)\n    {\n        if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)\n        {\n            sMoveSelectionCursorObjs[0]->sprite->invisible = FALSE;\n            sMoveSelectionCursorObjs[1]->sprite->invisible = FALSE;\n        }\n        return;\n    }\n\n    for (i = 0; i < 2; i++)\n    {\n        sprite = sMoveSelectionCursorObjs[i]->sprite;\n        sprite->data[0]++;\n\n        if (sprite->invisible)\n        {\n            if (sprite->data[0] > 60)\n            {\n                sprite->invisible = FALSE;\n                sprite->data[0] = 0;\n            }\n        }\n        else if (sprite->data[0] > 60)\n        {\n            sprite->invisible = TRUE;\n            sprite->data[0] = 0;\n        }\n    }\n}\n\nstatic void DestroyMoveSelectionCursorObjs(void)\n{\n    u32 i;\n\n    for (i = 0; i < 4; i++)\n    {\n        if (sMoveSelectionCursorObjs[i]->sprite != NULL)\n            DestroySpriteAndFreeResources(sMoveSelectionCursorObjs[i]->sprite);\n\n        FREE_AND_SET_NULL_IF_SET(sMoveSelectionCursorObjs[i]);\n    }\n}\n\nstatic void CreateMonStatusIconObj(u16 tileTag, u16 palTag)\n{\n    u16 spriteId;\n    void *gfxBufferPtr;\n\n    sStatusIcon = AllocZeroed(sizeof(struct MonStatusIconObj));\n    gfxBufferPtr = AllocZeroed(0x20 * 32);\n\n    LZ77UnCompWram(gSummaryScreen_StatusAilmentIcon_Gfx, gfxBufferPtr);\n\n    if (sStatusIcon != NULL)\n    {\n        struct SpriteSheet sheet = {\n            .data = gfxBufferPtr,\n            .size = 0x20 * 32,\n            .tag = tileTag\n        };\n\n        struct SpritePalette palette = {.data = gSummaryScreen_StatusAilmentIcon_Pal, .tag = palTag};\n        struct SpriteTemplate template = {\n            .tileTag = tileTag,\n            .paletteTag = palTag,\n            .oam = &sStatusAilmentIconOamData,\n            .anims = sStatusAilmentIconAnimTable,\n            .images = NULL,\n            .affineAnims = gDummySpriteAffineAnimTable,\n            .callback = SpriteCallbackDummy,\n        };\n\n        LoadSpriteSheet(&sheet);\n        LoadSpritePalette(&palette);\n\n        spriteId = CreateSprite(&template, 0, 0, 0);\n        sStatusIcon->sprite = &gSprites[spriteId];\n        sStatusIcon->tileTag = tileTag;\n        sStatusIcon->palTag = palTag;\n    }\n\n    ShowOrHideStatusIcon(TRUE);\n    UpdateMonStatusIconObj();\n    FREE_AND_SET_NULL_IF_SET(gfxBufferPtr);\n}\n\nstatic void DestroyMonStatusIconObj(void)\n{\n    if (sStatusIcon->sprite != NULL)\n        DestroySpriteAndFreeResources(sStatusIcon->sprite);\n\n    FREE_AND_SET_NULL_IF_SET(sStatusIcon);\n}\n\nstatic void UpdateMonStatusIconObj(void)\n{\n    sMonSummaryScreen->curMonStatusAilment = StatusToAilment(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_STATUS));\n\n    if (sMonSummaryScreen->curMonStatusAilment == AILMENT_NONE)\n    {\n        ShowOrHideStatusIcon(TRUE);\n        return;\n    }\n\n    StartSpriteAnim(sStatusIcon->sprite, sMonSummaryScreen->curMonStatusAilment - 1);\n    ShowOrHideStatusIcon(FALSE);\n}\n\nstatic void ShowOrHideStatusIcon(u8 invisible)\n{\n    if (sMonSummaryScreen->curMonStatusAilment == AILMENT_NONE || sMonSummaryScreen->isEgg)\n        sStatusIcon->sprite->invisible = TRUE;\n    else\n        sStatusIcon->sprite->invisible = invisible;\n\n    if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)\n    {\n        if (sStatusIcon->sprite->y != 45)\n        {\n            sStatusIcon->sprite->x = 16;\n            sStatusIcon->sprite->y = 45;\n            return;\n        }\n    }\n    else if (sStatusIcon->sprite->y != 38)\n    {\n        sStatusIcon->sprite->x = 16;\n        sStatusIcon->sprite->y = 38;\n        return;\n    }\n}\n\nstatic void CreateHpBarObjs(u16 tileTag, u16 palTag)\n{\n    u32 i;\n    u8 spriteId;\n    void *gfxBufferPtr;\n    u32 curHp;\n    u32 maxHp;\n    u8 hpBarPalTagOffset = 0;\n\n    sHpBarObjs = AllocZeroed(sizeof(struct HpBarObjs));\n    gfxBufferPtr = AllocZeroed(0x20 * 12);\n    LZ77UnCompWram(gSummaryScreen_HpBar_Gfx, gfxBufferPtr);\n\n    curHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP);\n    maxHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MAX_HP);\n\n    if (maxHp / 4 > curHp)\n        hpBarPalTagOffset = 2;\n    else if (maxHp / 2 > curHp)\n        hpBarPalTagOffset = 1;\n\n    if (gfxBufferPtr != NULL)\n    {\n        struct SpriteSheet sheet = {\n            .data = gfxBufferPtr,\n            .size = 0x20 * 12,\n            .tag = tileTag\n        };\n\n        struct SpritePalette palette1 = {.data = sHpBarPals[0], .tag = palTag};\n        struct SpritePalette palette2 = {.data = sHpBarPals[1], .tag = palTag + 1};\n        struct SpritePalette palette3 = {.data = sHpBarPals[2], .tag = palTag + 2};\n\n        LoadSpriteSheet(&sheet);\n        LoadSpritePalette(&palette1);\n        LoadSpritePalette(&palette2);\n        LoadSpritePalette(&palette3);\n    }\n\n    for (i = 0; i < 9; i++)\n    {\n        struct SpriteTemplate template = {\n            .tileTag = tileTag,\n            .paletteTag = palTag + hpBarPalTagOffset,\n            .oam = &sHpOrExpBarOamData,\n            .anims = sHpOrExpBarAnimTable,\n            .images = NULL,\n            .affineAnims = gDummySpriteAffineAnimTable,\n            .callback = SpriteCallbackDummy,\n        };\n\n        sHpBarObjs->xpos[i] = i * 8 + 172;\n        spriteId = CreateSprite(&template, sHpBarObjs->xpos[i], 36, 0);\n        sHpBarObjs->sprites[i] = &gSprites[spriteId];\n        sHpBarObjs->sprites[i]->invisible = FALSE;\n        sHpBarObjs->sprites[i]->oam.priority = 2;\n        sHpBarObjs->tileTag = tileTag;\n        sHpBarObjs->palTag = palTag;\n        StartSpriteAnim(sHpBarObjs->sprites[i], 8);\n    }\n\n    UpdateHpBarObjs();\n    ShowOrHideHpBarObjs(TRUE);\n\n    FREE_AND_SET_NULL_IF_SET(gfxBufferPtr);\n}\n\nstatic void UpdateHpBarObjs(void)\n{\n    u8 numWholeHpBarTiles = 0;\n    u32 i;\n    u8 animNum;\n    u8 two = 2;\n    u8 hpBarPalOffset = 0;\n    u32 curHp;\n    u32 maxHp;\n    s64 pointsPerTile;\n    s64 totalPoints;\n\n    if (sMonSummaryScreen->isEgg)\n        return;\n\n    curHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP);\n    maxHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MAX_HP);\n\n    if (maxHp / 5 >= curHp)\n        hpBarPalOffset = 2;\n    else if (maxHp / 2 >= curHp)\n        hpBarPalOffset = 1;\n\n    switch (GetHPBarLevel(curHp, maxHp))\n    {\n    case 3:\n    default:\n        hpBarPalOffset = 0;\n        break;\n    case 2:\n        hpBarPalOffset = 1;\n        break;\n    case 1:\n        hpBarPalOffset = 2;\n        break;\n    }\n\n    for (i = 0; i < 9; i++)\n        sHpBarObjs->sprites[i]->oam.paletteNum = IndexOfSpritePaletteTag(TAG_PSS_UNK_78) + hpBarPalOffset;\n\n    if (curHp == maxHp)\n        for (i = two; i < 8; i++)\n            StartSpriteAnim(sHpBarObjs->sprites[i], 8);\n\n    else\n    {\n        pointsPerTile = (maxHp << 2) / 6;\n        totalPoints = (curHp << 2);\n\n        while (TRUE)\n        {\n            if (totalPoints <= pointsPerTile)\n                break;\n            totalPoints -= pointsPerTile;\n            numWholeHpBarTiles++;\n        }\n\n        numWholeHpBarTiles += two;\n\n        for (i = two; i < numWholeHpBarTiles; i++)\n            StartSpriteAnim(sHpBarObjs->sprites[i], 8);\n\n        animNum = (totalPoints * 6) / pointsPerTile;\n        StartSpriteAnim(sHpBarObjs->sprites[numWholeHpBarTiles], animNum);\n\n        for (i = numWholeHpBarTiles + 1; i < 8; i++)\n            StartSpriteAnim(sHpBarObjs->sprites[i], 0);\n    }\n\n    StartSpriteAnim(sHpBarObjs->sprites[0], 9);\n    StartSpriteAnim(sHpBarObjs->sprites[1], 10);\n    StartSpriteAnim(sHpBarObjs->sprites[8], 11);\n}\n\nstatic void DestroyHpBarObjs(void)\n{\n    u32 i;\n\n    for (i = 0; i < 9; i++)\n        if (sHpBarObjs->sprites[i] != NULL)\n            DestroySpriteAndFreeResources(sHpBarObjs->sprites[i]);\n\n    FREE_AND_SET_NULL_IF_SET(sHpBarObjs);\n}\n\nstatic void ShowOrHideHpBarObjs(u8 invisible)\n{\n    u32 i;\n\n    for (i = 0; i < 9; i++)\n        sHpBarObjs->sprites[i]->invisible = invisible;\n}\n\nstatic void CreateExpBarObjs(u16 tileTag, u16 palTag)\n{\n    u32 i;\n    u8 spriteId;\n    void *gfxBufferPtr;\n\n    sExpBarObjs = AllocZeroed(sizeof(struct ExpBarObjs));\n    gfxBufferPtr = AllocZeroed(0x20 * 12);\n\n    LZ77UnCompWram(gSummaryScreen_ExpBar_Gfx, gfxBufferPtr);\n    if (gfxBufferPtr != NULL)\n    {\n        struct SpriteSheet sheet = {\n            .data = gfxBufferPtr,\n            .size = 0x20 * 12,\n            .tag = tileTag\n        };\n\n        struct SpritePalette palette = {.data = gSummaryScreen_HpExpBar_Pal, .tag = palTag};\n        LoadSpriteSheet(&sheet);\n        LoadSpritePalette(&palette);\n    }\n\n    for (i = 0; i < 11; i++)\n    {\n        struct SpriteTemplate template = {\n            .tileTag = tileTag,\n            .paletteTag = palTag,\n            .oam = &sHpOrExpBarOamData,\n            .anims = sHpOrExpBarAnimTable,\n            .images = NULL,\n            .affineAnims = gDummySpriteAffineAnimTable,\n            .callback = SpriteCallbackDummy,\n        };\n\n        sExpBarObjs->xpos[i] = i * 8 + 156;\n        spriteId = CreateSprite(&template, sExpBarObjs->xpos[i], 132, 0);\n        sExpBarObjs->sprites[i] = &gSprites[spriteId];\n        sExpBarObjs->sprites[i]->oam.priority = 2;\n        sExpBarObjs->tileTag = tileTag;\n        sExpBarObjs->palTag = palTag;\n    }\n\n    UpdateExpBarObjs();\n    ShowOrHideExpBarObjs(TRUE);\n\n    FREE_AND_SET_NULL_IF_SET(gfxBufferPtr);\n}\n\nstatic void UpdateExpBarObjs(void)\n{\n    u8 numWholeExpBarTiles = 0;\n    u32 i;\n    u8 level;\n    u32 exp;\n    u32 totalExpToNextLevel;\n    u32 curExpToNextLevel;\n    u16 species;\n    s64 pointsPerTile;\n    s64 totalPoints;\n    u8 animNum;\n    u8 two = 2;\n\n    if (sMonSummaryScreen->isEgg)\n        return;\n\n    exp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_EXP);\n    level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_LEVEL);\n    species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES);\n\n    if (level < 100)\n    {\n        totalExpToNextLevel = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - gExperienceTables[gSpeciesInfo[species].growthRate][level];\n        curExpToNextLevel = exp - gExperienceTables[gSpeciesInfo[species].growthRate][level];\n        pointsPerTile = ((totalExpToNextLevel << 2) / 8);\n        totalPoints = (curExpToNextLevel << 2);\n\n        while (TRUE)\n        {\n            if (totalPoints <= pointsPerTile)\n                break;\n            totalPoints -= pointsPerTile;\n            numWholeExpBarTiles++;\n        }\n\n        numWholeExpBarTiles += two;\n\n        for (i = two; i < numWholeExpBarTiles; i++)\n            StartSpriteAnim(sExpBarObjs->sprites[i], 8);\n\n        if (numWholeExpBarTiles >= 10)\n        {\n            if (totalExpToNextLevel == curExpToNextLevel)\n                return;\n            else\n                StartSpriteAnim(sExpBarObjs->sprites[9], 7);\n        }\n\n        animNum = (totalPoints * 8) / pointsPerTile;\n        StartSpriteAnim(sExpBarObjs->sprites[numWholeExpBarTiles], animNum);\n\n        for (i = numWholeExpBarTiles + 1; i < 10; i++)\n            StartSpriteAnim(sExpBarObjs->sprites[i], 0);\n    }\n    else\n        for (i = two; i < 10; i++)\n            StartSpriteAnim(sExpBarObjs->sprites[i], 0);\n\n    StartSpriteAnim(sExpBarObjs->sprites[0], 9);\n    StartSpriteAnim(sExpBarObjs->sprites[1], 10);\n    StartSpriteAnim(sExpBarObjs->sprites[10], 11);\n}\n\nstatic void DestroyExpBarObjs(void)\n{\n    u32 i;\n\n    for (i = 0; i < 11; i++)\n        if (sExpBarObjs->sprites[i] != NULL)\n            DestroySpriteAndFreeResources(sExpBarObjs->sprites[i]);\n\n    FREE_AND_SET_NULL_IF_SET(sExpBarObjs);\n}\n\nstatic void ShowOrHideExpBarObjs(u8 invisible)\n{\n    u32 i;\n\n    for (i = 0; i < 11; i++)\n        sExpBarObjs->sprites[i]->invisible = invisible;\n}\n\nstatic void CreatePokerusIconObj(u16 tileTag, u16 palTag)\n{\n    u16 spriteId;\n    void *gfxBufferPtr;\n\n    sPokerusIconObj = AllocZeroed(sizeof(struct PokerusIconObj));\n    gfxBufferPtr = AllocZeroed(0x20 * 1);\n\n    LZ77UnCompWram(sPokerusIconObjTiles, gfxBufferPtr);\n\n    if (sPokerusIconObj != NULL)\n    {\n        struct SpriteSheet sheet = {\n            .data = gfxBufferPtr,\n            .size = 0x20 * 1,\n            .tag = tileTag\n        };\n\n        struct SpritePalette palette = {.data = sPokerusIconObjPal, .tag = palTag};\n        struct SpriteTemplate template = {\n            .tileTag = tileTag,\n            .paletteTag = palTag,\n            .oam = &sPokerusIconObjOamData,\n            .anims = sPokerusIconObjAnimTable,\n            .images = NULL,\n            .affineAnims = gDummySpriteAffineAnimTable,\n            .callback = SpriteCallbackDummy,\n        };\n\n        LoadSpriteSheet(&sheet);\n        LoadSpritePalette(&palette);\n\n        spriteId = CreateSprite(&template, 114, 92, 0);\n        sPokerusIconObj->sprite = &gSprites[spriteId];\n        sPokerusIconObj->tileTag = tileTag;\n        sPokerusIconObj->palTag = palTag;\n    }\n\n    HideShowPokerusIcon(TRUE);\n    ShowPokerusIconObjIfHasOrHadPokerus();\n\n    FREE_AND_SET_NULL_IF_SET(gfxBufferPtr);\n}\n\nstatic void DestroyPokerusIconObj(void)\n{\n    if (sPokerusIconObj->sprite != NULL)\n        DestroySpriteAndFreeResources(sPokerusIconObj->sprite);\n\n    FREE_AND_SET_NULL_IF_SET(sPokerusIconObj);\n}\n\nstatic void ShowPokerusIconObjIfHasOrHadPokerus(void)\n{\n    if (!CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0)\n        && CheckPartyHasHadPokerus(&sMonSummaryScreen->currentMon, 0))\n        HideShowPokerusIcon(FALSE);\n    else\n        HideShowPokerusIcon(TRUE);\n}\n\nstatic void HideShowPokerusIcon(bool8 invisible)\n{\n    if (!CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0)\n        && CheckPartyHasHadPokerus(&sMonSummaryScreen->currentMon, 0))\n    {\n        sPokerusIconObj->sprite->invisible = invisible;\n        return;\n    }\n    else\n        sPokerusIconObj->sprite->invisible = TRUE;\n\n    if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)\n    {\n        sPokerusIconObj->sprite->invisible = TRUE;\n        sPokerusIconObj->sprite->x = 16;\n        sPokerusIconObj->sprite->y = 44;\n    }\n    else\n    {\n        sPokerusIconObj->sprite->x = 114;\n        sPokerusIconObj->sprite->y = 92;\n    }\n}\n\nstatic void CreateShinyStarObj(u16 tileTag, u16 palTag)\n{\n    u16 spriteId;\n    void *gfxBufferPtr;\n\n    sShinyStarObjData = AllocZeroed(sizeof(struct ShinyStarObjData));\n    gfxBufferPtr = AllocZeroed(0x20 * 2);\n\n    LZ77UnCompWram(sStarObjTiles, gfxBufferPtr);\n\n    if (sShinyStarObjData != NULL)\n    {\n        struct SpriteSheet sheet = {\n            .data = gfxBufferPtr,\n            .size = 0x20 * 2,\n            .tag = tileTag\n        };\n\n        struct SpritePalette palette = {.data = sStarObjPal, .tag = palTag};\n        struct SpriteTemplate template = {\n            .tileTag = tileTag,\n            .paletteTag = palTag,\n            .oam = &sStarObjOamData,\n            .anims = sStarObjAnimTable,\n            .images = NULL,\n            .affineAnims = gDummySpriteAffineAnimTable,\n            .callback = SpriteCallbackDummy,\n        };\n\n        LoadSpriteSheet(&sheet);\n        LoadSpritePalette(&palette);\n        spriteId = CreateSprite(&template, 106, 40, 0);\n        sShinyStarObjData->sprite = &gSprites[spriteId];\n        sShinyStarObjData->tileTag = tileTag;\n        sShinyStarObjData->palTag = palTag;\n    }\n\n    HideShowShinyStar(TRUE);\n    ShowShinyStarObjIfMonShiny();\n\n    FREE_AND_SET_NULL_IF_SET(gfxBufferPtr);\n}\n\nstatic void DestroyShinyStarObj(void)\n{\n    if (sShinyStarObjData->sprite != NULL)\n        DestroySpriteAndFreeResources(sShinyStarObjData->sprite);\n\n    FREE_AND_SET_NULL_IF_SET(sShinyStarObjData);\n}\n\nstatic void HideShowShinyStar(bool8 invisible)\n{\n    if (IsMonShiny(&sMonSummaryScreen->currentMon) == TRUE\n        && !sMonSummaryScreen->isEgg)\n        sShinyStarObjData->sprite->invisible = invisible;\n    else\n        sShinyStarObjData->sprite->invisible = TRUE;\n\n    if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)\n    {\n        sShinyStarObjData->sprite->x = 8;\n        sShinyStarObjData->sprite->y = 24;\n    }\n    else\n    {\n        sShinyStarObjData->sprite->x = 106;\n        sShinyStarObjData->sprite->y = 40;\n    }\n}\n\nstatic void ShowShinyStarObjIfMonShiny(void)\n{\n    if (IsMonShiny(&sMonSummaryScreen->currentMon) == TRUE && !sMonSummaryScreen->isEgg)\n        HideShowShinyStar(FALSE);\n    else\n        HideShowShinyStar(TRUE);\n}\n\nstatic void PokeSum_DestroySprites(void)\n{\n    DestroyMoveSelectionCursorObjs();\n    DestroyHpBarObjs();\n    DestroyExpBarObjs();\n    PokeSum_DestroyMonPicSprite();\n    PokeSum_DestroyMonIconSprite();\n    DestroyBallIconObj();\n    PokeSum_DestroyMonMarkingsSprite();\n    DestroyMonStatusIconObj();\n    DestroyPokerusIconObj();\n    DestroyShinyStarObj();\n    ResetSpriteData();\n}\n\nstatic void PokeSum_CreateSprites(void)\n{\n    CreateBallIconObj();\n    ShowOrHideBallIconObj(FALSE);\n    PokeSum_CreateMonIconSprite();\n    PokeSum_CreateMonPicSprite();\n    PokeSum_ShowOrHideMonPicSprite(FALSE);\n    UpdateHpBarObjs();\n    UpdateExpBarObjs();\n    PokeSum_UpdateMonMarkingsAnim();\n    UpdateMonStatusIconObj();\n    ShowPokerusIconObjIfHasOrHadPokerus();\n    ShowShinyStarObjIfMonShiny();\n}\n\nstatic void PokeSum_CreateMonMarkingsSprite(void)\n{\n    u32 markings = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MARKINGS);\n\n    DestroySpriteAndFreeResources(sMonSummaryScreen->markingSprite);\n    sMonSummaryScreen->markingSprite = CreateMonMarkingAllCombosSprite(TAG_PSS_UNK_8C, TAG_PSS_UNK_8C, sMonMarkingSpritePalette);\n\n    if (sMonSummaryScreen->markingSprite != NULL)\n    {\n        StartSpriteAnim(sMonSummaryScreen->markingSprite, markings);\n        sMonSummaryScreen->markingSprite->x = 20;\n        sMonSummaryScreen->markingSprite->y = 91;\n    }\n\n    PokeSum_ShowOrHideMonMarkingsSprite(TRUE);\n}\n\nstatic void PokeSum_DestroyMonMarkingsSprite(void)\n{\n    DestroySpriteAndFreeResources(sMonSummaryScreen->markingSprite);\n}\n\nstatic void PokeSum_ShowOrHideMonMarkingsSprite(u8 invisible)\n{\n    u32 markings = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MARKINGS);\n\n    if (markings == 0)\n        sMonSummaryScreen->markingSprite->invisible = TRUE;\n    else\n        sMonSummaryScreen->markingSprite->invisible = invisible;\n}\n\nstatic void PokeSum_UpdateMonMarkingsAnim(void)\n{\n    u32 markings = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MARKINGS);\n\n    StartSpriteAnim(sMonSummaryScreen->markingSprite, markings);\n    PokeSum_ShowOrHideMonMarkingsSprite(FALSE);\n}\n\nstatic void PokeSum_SeekToNextMon(u8 taskId, s8 direction)\n{\n    s8 scrollResult = -1;\n\n    if (sMonSummaryScreen->isBoxMon == TRUE)\n    {\n        if (sMonSummaryScreen->curPageIndex != PSS_PAGE_INFO)\n        {\n            if (direction == 1)\n                direction = 0;\n            else\n                direction = 2;\n        }\n        else\n        {\n            // Allow Eggs\n            if (direction == 1)\n                direction = 1;\n            else\n                direction = 3;\n        }\n\n        scrollResult = SeekToNextMonInBox(sMonSummaryScreen->monList.boxMons, GetLastViewedMonIndex(), sMonSummaryScreen->lastIndex, (u8)direction);\n    }\n    else\n    {\n        if (IsUpdateLinkStateCBActive() == FALSE\n            && gReceivedRemoteLinkPlayers == 1\n            && IsMultiBattle() == TRUE)\n            scrollResult = SeekToNextMonInMultiParty(direction);\n        else\n            scrollResult = SeekToNextMonInSingleParty(direction);\n    }\n\n    if (scrollResult == -1)\n        return;\n\n    sLastViewedMonIndex = scrollResult;\n    CreateTask(Task_PokeSum_SwitchDisplayedPokemon, 0);\n    sMonSummaryScreen->switchMonTaskState = 0;\n}\n\nstatic s8 SeekToNextMonInSingleParty(s8 delta)\n{\n    struct Pokemon * mon = sMonSummaryScreen->monList.mons;\n    u8 index = sLastViewedMonIndex;\n    u8 numMons = sMonSummaryScreen->lastIndex + 1;\n    delta += numMons;\n\n    index = (index + delta) % numMons;\n\n    // skip over any Eggs unless on the Info Page\n    if (sMonSummaryScreen->curPageIndex != PSS_PAGE_INFO)\n        while (GetMonData(&mon[index], MON_DATA_IS_EGG))\n            index = (index + delta) % numMons;\n\n    // to avoid \"scrolling\" to the same Pokemon\n    if (index == sLastViewedMonIndex)\n        return -1;\n    else\n        return index;\n}\n\nstatic u8 PokeSum_CanSeekToMon(struct Pokemon * partyMons)\n{\n    if (GetMonData(partyMons, MON_DATA_SPECIES) != SPECIES_NONE && (sMonSummaryScreen->curPageIndex != PSS_PAGE_INFO || !GetMonData(partyMons, MON_DATA_IS_EGG)))\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic s8 SeekToMonInMultiParty_SeekForward(u8 startingIdx)\n{\n    while (TRUE)\n    {\n        startingIdx++;\n\n        if (startingIdx == 6)\n            return -1;\n        if (PokeSum_CanSeekToMon(&gPlayerParty[sMultiBattlePartyOrder[startingIdx]]) == TRUE)\n            break;\n    }\n\n    return (s8)sMultiBattlePartyOrder[startingIdx];\n}\n\nstatic s8 SeekToMonInMultiParty_SeekBack(u8 startingIdx)\n{\n    while (1)\n    {\n        if (startingIdx == 0)\n            return -1;\n\n        startingIdx--;\n\n        if (PokeSum_CanSeekToMon(&gPlayerParty[sMultiBattlePartyOrder[startingIdx]]) == TRUE)\n            break;\n    }\n\n    return (s8)(sMultiBattlePartyOrder[startingIdx]);\n}\n\nstatic s8 SeekToNextMonInMultiParty(s8 direction)\n{\n    u8 foundPartyIdx = 0;\n    u32 i;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n        if (sMultiBattlePartyOrder[i] == GetLastViewedMonIndex())\n        {\n            foundPartyIdx = i;\n            break;\n        }\n\n    if ((direction == -1 && foundPartyIdx == 0)\n        || (direction == 1 && foundPartyIdx == 5))\n        return -1;\n\n    if (direction == 1)\n        return SeekToMonInMultiParty_SeekForward(foundPartyIdx);\n    else\n        return SeekToMonInMultiParty_SeekBack(foundPartyIdx);\n}\n\nstatic void Task_PokeSum_SwitchDisplayedPokemon(u8 taskId)\n{\n    switch (sMonSummaryScreen->switchMonTaskState)\n    {\n    case 0:\n        StopCryAndClearCrySongs();\n        sMoveSelectionCursorPos = 0;\n        sMoveSwapCursorPos = 0;\n        sMonSummaryScreen->switchMonTaskState++;\n        break;\n    case 1:\n        PokeSum_DestroyMonPicSprite();\n        PokeSum_DestroyMonIconSprite();\n        DestroyBallIconObj();\n        sMonSummaryScreen->switchMonTaskState++;\n        break;\n    case 2:\n        BufferSelectedMonData(&sMonSummaryScreen->currentMon);\n\n        sMonSummaryScreen->isEgg = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_IS_EGG);\n        sMonSummaryScreen->isBadEgg = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SANITY_IS_BAD_EGG);\n\n        if (sMonSummaryScreen->isBadEgg == TRUE)\n            sMonSummaryScreen->isEgg = TRUE;\n\n        sMonSummaryScreen->switchMonTaskState++;\n        break;\n    case 3:\n        FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);\n\n        if (IsMonShiny(&sMonSummaryScreen->currentMon) == TRUE && !sMonSummaryScreen->isEgg)\n        {\n            LoadPalette(&gSummaryScreen_Bg_Pal[16 * 6], BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n            LoadPalette(&gSummaryScreen_Bg_Pal[16 * 5], BG_PLTT_ID(1), PLTT_SIZE_4BPP);\n        }\n        else\n        {\n            LoadPalette(&gSummaryScreen_Bg_Pal[16 * 0], BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n            LoadPalette(&gSummaryScreen_Bg_Pal[16 * 1], BG_PLTT_ID(1), PLTT_SIZE_4BPP);\n        }\n\n        sMonSummaryScreen->switchMonTaskState++;\n        break;\n    case 4:\n        if (sMonSummaryScreen->curPageIndex == PSS_PAGE_INFO)\n        {\n            if (sMonSummaryScreen->isEgg)\n            {\n                CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageEgg_Tilemap, 0, 0);\n                CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0);\n            }\n            else\n            {\n                CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageInfo_Tilemap, 0, 0);\n                CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0);\n            }\n        }\n        sMonSummaryScreen->switchMonTaskState++;\n        break;\n    case 5:\n        BufferMonInfo();\n        sMonSummaryScreen->switchMonTaskState++;\n        break;\n    case 6:\n        if (!sMonSummaryScreen->isEgg)\n            BufferMonSkills();\n\n        sMonSummaryScreen->switchMonTaskState++;\n        break;\n    case 7:\n        if (!sMonSummaryScreen->isEgg)\n            BufferMonMoves();\n\n        sMonSummaryScreen->switchMonTaskState++;\n        break;\n    case 8:\n        PokeSum_PrintRightPaneText();\n        PokeSum_PrintBottomPaneText();\n        PokeSum_PrintAbilityDataOrMoveTypes();\n        sMonSummaryScreen->switchMonTaskState++;\n        break;\n    case 9:\n        PokeSum_PrintMonTypeIcons();\n        PokeSum_DrawPageProgressTiles();\n        PokeSum_PrintPageHeaderText(sMonSummaryScreen->curPageIndex);\n        sMonSummaryScreen->switchMonTaskState++;\n        break;\n    case 10:\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);\n        CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(2);\n        CopyBgTilemapBufferToVram(3);\n        sMonSummaryScreen->switchMonTaskState++;\n        break;\n    case 11:\n        if (!Overworld_LinkRecvQueueLengthMoreThan2() && !IsLinkRecvQueueAtOverworldMax())\n        {\n            PokeSum_CreateSprites();\n            PokeSum_TryPlayMonCry();\n            sMonSummaryScreen->switchMonTaskState++;\n        }\n        break;\n    default:\n        sMonSummaryScreen->switchMonTaskState = 0;\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void PokeSum_UpdateWin1ActiveFlag(u8 curPageIndex)\n{\n    ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);\n\n    switch (curPageIndex)\n    {\n    case PSS_PAGE_INFO:\n    case PSS_PAGE_SKILLS:\n    case PSS_PAGE_MOVES:\n        SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) | DISPCNT_WIN1_ON);\n        break;\n    default:\n        break;\n    }\n}\n\nstatic void PokeSum_TryPlayMonCry(void)\n{\n    if (!GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_IS_EGG))\n    {\n        if (ShouldPlayNormalMonCry(&sMonSummaryScreen->currentMon) == TRUE)\n            PlayCry_ByMode(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG), 0, CRY_MODE_NORMAL);\n        else\n            PlayCry_ByMode(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG), 0, CRY_MODE_WEAK);\n    }\n}\n\nstatic bool32 PokeSum_IsMonBoldOrGentle(u8 nature)\n{\n    if (nature == NATURE_BOLD || nature == NATURE_GENTLE)\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic bool32 CurrentMonIsFromGBA(void)\n{\n    u8 version = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_GAME);\n\n    if (version == VERSION_LEAF_GREEN\n        || version == VERSION_FIRE_RED\n        || version == VERSION_RUBY\n        || version == VERSION_SAPPHIRE\n        || version == VERSION_EMERALD\n        || version == VERSION_GAMECUBE)\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic bool32 MapSecIsInKantoOrSevii(u8 mapSec)\n{\n    if (mapSec < MAPSEC_NONE)\n        return TRUE;\n    if (IsMonFromOrre())\n        return TRUE;\n    return FALSE;\n}\n\n// Unused\nstatic void ShowPokemonSummaryScreen_NullParty(void)\n{\n    ShowPokemonSummaryScreen(NULL, 0, 0, CB2_ReturnToField, PSS_MODE_NORMAL);\n}\n\nu8 GetHiddenPowerType(struct Pokemon * mon)\n{\n    u8 typeBits  = ((GetMonData(mon, MON_DATA_HP_IV) & 1) << 0)\n                    | ((GetMonData(mon, MON_DATA_ATK_IV) & 1) << 1)\n                    | ((GetMonData(mon, MON_DATA_DEF_IV) & 1) << 2)\n                    | ((GetMonData(mon, MON_DATA_SPEED_IV) & 1) << 3)\n                    | ((GetMonData(mon, MON_DATA_SPATK_IV) & 1) << 4)\n                    | ((GetMonData(mon, MON_DATA_SPDEF_IV) & 1) << 5);\n\n    u8 type = (15 * typeBits) / 63 + 1;\n    if (type >= TYPE_MYSTERY)\n        type++;\n    type |= 0xC0;\n    return(type & 0x3F);\n}\n\nu8 GetWeatherBallType(void)\n{\n    if (gMain.inBattle)\n    {\n        if (gBattleWeather & B_WEATHER_RAIN)\n            return TYPE_WATER;\n        else if (gBattleWeather & B_WEATHER_SANDSTORM)\n            return TYPE_ROCK;\n        else if (gBattleWeather & B_WEATHER_SUN)\n            return TYPE_FIRE;\n        else if (gBattleWeather & B_WEATHER_HAIL)\n            return TYPE_ICE;\n        else\n            return TYPE_NORMAL;\n    }\n    else\n    {\n        switch (gWeatherPtr->currWeather)\n        {\n        case WEATHER_RAIN:\n        case WEATHER_RAIN_THUNDERSTORM:\n        case WEATHER_DOWNPOUR:\n            return TYPE_WATER;\n        case WEATHER_SANDSTORM:\n            return TYPE_ROCK;\n        case WEATHER_DROUGHT:\n            return TYPE_FIRE;\n        //case WEATHER_SNOW:\n        //    return TYPE_ICE;\n        default:\n            return TYPE_NORMAL;\n        }\n    }\n}\n"
  },
  {
    "path": "src/post_battle_event_funcs.c",
    "content": "#include \"global.h\"\n#include \"script_pokemon_util.h\"\n#include \"event_data.h\"\n#include \"credits.h\"\n#include \"overworld.h\"\n#include \"hall_of_fame.h\"\n#include \"load_save.h\"\n#include \"constants/heal_locations.h\"\n\nbool8 EnterHallOfFame(void)\n{\n    bool8 ribbonState;\n    bool8 *r7;\n    int i;\n    bool8 gaveAtLeastOneRibbon;\n    HealPlayerParty();\n    if (FlagGet(FLAG_SYS_GAME_CLEAR) == TRUE)\n    {\n        gHasHallOfFameRecords = TRUE;\n    }\n    else\n    {\n        gHasHallOfFameRecords = FALSE;\n        FlagSet(FLAG_SYS_GAME_CLEAR);\n    }\n    if (GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME) == 0)\n    {\n        SetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME, (gSaveBlock2Ptr->playTimeHours << 16) | (gSaveBlock2Ptr->playTimeMinutes << 8) | gSaveBlock2Ptr->playTimeSeconds);\n    }\n    SetContinueGameWarpStatus();\n    SetContinueGameWarpToHealLocation(SPAWN_PALLET_TOWN);\n    gaveAtLeastOneRibbon = FALSE;\n    for (i = 0, r7 = &ribbonState; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_EGG))\n        {\n            if (!GetMonData(&gPlayerParty[i], MON_DATA_CHAMPION_RIBBON))\n            {\n                *r7 = TRUE;\n                SetMonData(&gPlayerParty[i], MON_DATA_CHAMPION_RIBBON, &ribbonState);\n                gaveAtLeastOneRibbon = TRUE;\n            }\n        }\n    }\n    if (gaveAtLeastOneRibbon == TRUE)\n    {\n        IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS);\n        FlagSet(FLAG_SYS_RIBBON_GET);\n    }\n    SetMainCallback2(CB2_DoHallOfFameScreen);\n    return FALSE;\n}\n\nbool8 SetCB2WhiteOut(void)\n{\n    SetMainCallback2(CB2_WhiteOut);\n    return FALSE;\n}\n"
  },
  {
    "path": "src/prof_pc.c",
    "content": "#include \"global.h\"\n#include \"event_data.h\"\n#include \"pokedex.h\"\n#include \"field_message_box.h\"\n\nextern const u8 PokedexRating_Text_LessThan10[];\nextern const u8 PokedexRating_Text_LessThan20[];\nextern const u8 PokedexRating_Text_LessThan30[];\nextern const u8 PokedexRating_Text_LessThan40[];\nextern const u8 PokedexRating_Text_LessThan50[];\nextern const u8 PokedexRating_Text_LessThan60[];\nextern const u8 PokedexRating_Text_LessThan70[];\nextern const u8 PokedexRating_Text_LessThan80[];\nextern const u8 PokedexRating_Text_LessThan90[];\nextern const u8 PokedexRating_Text_LessThan100[];\nextern const u8 PokedexRating_Text_LessThan110[];\nextern const u8 PokedexRating_Text_LessThan120[];\nextern const u8 PokedexRating_Text_LessThan130[];\nextern const u8 PokedexRating_Text_LessThan140[];\nextern const u8 PokedexRating_Text_LessThan150[];\nextern const u8 PokedexRating_Text_Complete[];\n\nu16 GetPokedexCount(void)\n{\n    if (gSpecialVar_0x8004 == 0)\n    {\n        gSpecialVar_0x8005 = GetKantoPokedexCount(0);\n        gSpecialVar_0x8006 = GetKantoPokedexCount(1);\n    }\n    else\n    {\n        gSpecialVar_0x8005 = GetNationalPokedexCount(0);\n        gSpecialVar_0x8006 = GetNationalPokedexCount(1);\n    }\n    return IsNationalPokedexEnabled();\n}\n\nstatic const u8 *GetProfOaksRatingMessageByCount(u16 count)\n{\n    gSpecialVar_Result = FALSE;\n\n    if (count < 10)\n        return PokedexRating_Text_LessThan10;\n\n    if (count < 20)\n        return PokedexRating_Text_LessThan20;\n\n    if (count < 30)\n        return PokedexRating_Text_LessThan30;\n\n    if (count < 40)\n        return PokedexRating_Text_LessThan40;\n\n    if (count < 50)\n        return PokedexRating_Text_LessThan50;\n\n    if (count < 60)\n        return PokedexRating_Text_LessThan60;\n\n    if (count < 70)\n        return PokedexRating_Text_LessThan70;\n\n    if (count < 80)\n        return PokedexRating_Text_LessThan80;\n\n    if (count < 90)\n        return PokedexRating_Text_LessThan90;\n\n    if (count < 100)\n        return PokedexRating_Text_LessThan100;\n\n    if (count < 110)\n        return PokedexRating_Text_LessThan110;\n\n    if (count < 120)\n        return PokedexRating_Text_LessThan120;\n\n    if (count < 130)\n        return PokedexRating_Text_LessThan130;\n\n    if (count < 140)\n        return PokedexRating_Text_LessThan140;\n\n    if (count < 150)\n        return PokedexRating_Text_LessThan150;\n\n    if (count == KANTO_DEX_COUNT - 1)\n    {\n        // Mew doesn't count for completing the pokedex\n        if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_MEW), 1))\n            return PokedexRating_Text_LessThan150;\n\n        gSpecialVar_Result = TRUE;\n        return PokedexRating_Text_Complete;\n    }\n\n    if (count == KANTO_DEX_COUNT)\n    {\n        gSpecialVar_Result = TRUE;\n        return PokedexRating_Text_Complete;\n    }\n\n    return PokedexRating_Text_LessThan10;\n}\n\nvoid GetProfOaksRatingMessage(void)\n{\n    ShowFieldMessage(GetProfOaksRatingMessageByCount(gSpecialVar_0x8004));\n}\n"
  },
  {
    "path": "src/quest_log.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"menu.h\"\n#include \"menu_helpers.h\"\n#include \"text_window.h\"\n#include \"event_data.h\"\n#include \"script.h\"\n#include \"overworld.h\"\n#include \"field_fadetransition.h\"\n#include \"field_weather.h\"\n#include \"event_object_movement.h\"\n#include \"event_object_lock.h\"\n#include \"field_player_avatar.h\"\n#include \"item.h\"\n#include \"region_map.h\"\n#include \"map_name_popup.h\"\n#include \"wild_encounter.h\"\n#include \"help_system.h\"\n#include \"pokemon_storage_system.h\"\n#include \"save.h\"\n#include \"quest_log_objects.h\"\n#include \"quest_log_player.h\"\n#include \"quest_log.h\"\n#include \"new_menu_helpers.h\"\n#include \"strings.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/layouts.h\"\n#include \"constants/maps.h\"\n#include \"constants/quest_log.h\"\n#include \"constants/field_weather.h\"\n#include \"constants/event_object_movement.h\"\n\nenum {\n    WIN_TOP_BAR,      // Contains the \"Previously on...\" text\n    WIN_BOTTOM_BAR,   // Empty, only briefly visible at the end or when the description window isn't covering it.\n    WIN_DESCRIPTION,\n    WIN_COUNT\n};\n\n#define DESC_WIN_WIDTH (DISPLAY_WIDTH / 8)\n#define DESC_WIN_HEIGHT 6\n#define DESC_WIN_SIZE (DESC_WIN_WIDTH * DESC_WIN_HEIGHT * TILE_SIZE_4BPP)\n\n// sQuestLogActionRecordBuffer should be large enough to fill a scene's script with the maximum number of actions\n#define SCRIPT_BUFFER_SIZE (sizeof(gSaveBlock1Ptr->questLog[0].script) / sizeof(struct QuestLogAction))\n\nenum {\n    END_MODE_NONE,\n    END_MODE_FINISH,\n    END_MODE_SCENE,\n};\n\nstruct PlaybackControl\n{\n    u8 state:4;\n    u8 playingEvent:2;\n    u8 endMode:2;\n    u8 cursor;\n    u8 timer;\n    u8 overlapTimer;\n};\n\nstruct FlagOrVarRecord\n{\n    u16 idx:15;\n    u16 isFlag:1;\n    u16 value;\n};\n\nu8 gQuestLogPlaybackState;\nu16 sMaxActionsInScene;\nstruct FieldInput gQuestLogFieldInput;\nstruct QuestLogAction * sCurSceneActions;\n\nstatic struct FlagOrVarRecord * sFlagOrVarRecords;\nstatic u16 sNumFlagsOrVars;\n\nstatic EWRAM_DATA u8 sCurrentSceneNum = 0;\nstatic EWRAM_DATA u8 sNumScenes = 0;\nEWRAM_DATA u8 gQuestLogState = 0;\nstatic EWRAM_DATA u16 sRecordSequenceStartIdx = 0;\nstatic EWRAM_DATA u8 sWindowIds[WIN_COUNT] = {0};\nEWRAM_DATA u16 *gQuestLogDefeatedWildMonRecord = NULL;\nEWRAM_DATA u16 *gQuestLogRecordingPointer = NULL;\nstatic EWRAM_DATA u16 *sEventData[32] = {NULL};\nstatic EWRAM_DATA void (* sQuestLogCB)(void) = NULL;\nstatic EWRAM_DATA u16 *sPalettesBackup = NULL;\nstatic EWRAM_DATA struct PlaybackControl sPlaybackControl = {0};\nstatic EWRAM_DATA struct QuestLogAction sQuestLogActionRecordBuffer[SCRIPT_BUFFER_SIZE] = {0};\nEWRAM_DATA u16 gQuestLogCurActionIdx = 0;\nstatic EWRAM_DATA u8 sMovementScripts[OBJECT_EVENT_TEMPLATES_COUNT][2] = {{0}};\nstatic EWRAM_DATA u16 sNextActionDelay = 0;\nstatic EWRAM_DATA u16 sLastQuestLogCursor = 0;\nstatic EWRAM_DATA u16 sFlagOrVarPlayhead = 0;\n\nstatic void QLogCB_Recording(void);\nstatic void QLogCB_Playback(void);\nstatic void SetPlayerInitialCoordsAtScene(u8);\nstatic void SetNPCInitialCoordsAtScene(u8);\nstatic void RecordSceneEnd(void);\nstatic void BackUpTrainerRematches(void);\nstatic void BackUpMapLayout(void);\nstatic void SetGameStateAtScene(u8);\nstatic u8 TryRecordActionSequence(struct QuestLogAction *);\nstatic void Task_BeginQuestLogPlayback(u8);\nstatic void QL_LoadObjectsAndTemplates(u8);\nstatic void QLPlayback_InitOverworldState(void);\nstatic void SetPokemonCounts(void);\nstatic u16 QuestLog_GetPartyCount(void);\nstatic u16 QuestLog_GetBoxMonCount(void);\nstatic void RestoreTrainerRematches(void);\nstatic void ReadQuestLogScriptFromSav1(u8, struct QuestLogAction *);\nstatic void DoSceneEndTransition(s8 delay);\nstatic void DoSkipToEndTransition(s8 delay);\nstatic void QuestLog_AdvancePlayhead(void);\nstatic void QuestLog_StartFinalScene(void);\nstatic void Task_AvoidDisplay(u8);\nstatic void QuestLog_PlayCurrentEvent(void);\nstatic void HandleShowQuestLogMessage(void);\nstatic u8 GetQuestLogTextDisplayDuration(void);\nstatic void DrawSceneDescription(void);\nstatic void CopyDescriptionWindowTiles(u8);\nstatic void QuestLog_CloseTextWindow(void);\nstatic void QuestLog_WaitFadeAndCancelPlayback(void);\nstatic bool8 FieldCB2_FinalScene(void);\nstatic void Task_FinalScene_WaitFade(u8);\nstatic void Task_QuestLogScene_SavedGame(u8);\nstatic void Task_WaitAtEndOfQuestLog(u8);\nstatic void Task_EndQuestLog(u8);\nstatic bool8 RestoreScreenAfterPlayback(u8);\nstatic void QL_SlightlyDarkenSomePals(void);\nstatic void TogglePlaybackStateForOverworldLock(u8);\nstatic void ResetActions(u8, struct QuestLogAction *, u16);\nstatic bool8 RecordHeadAtEndOfEntryOrScriptContext2Enabled(void);\nstatic bool8 RecordHeadAtEndOfEntry(void);\nstatic bool8 InQuestLogDisabledLocation(void);\nstatic bool8 TrySetLinkQuestLogEvent(u16, const u16 *);\nstatic bool8 TrySetTrainerBattleQuestLogEvent(u16, const u16 *);\n\nstatic const struct WindowTemplate sWindowTemplates[WIN_COUNT] = {\n    [WIN_TOP_BAR] = {\n        .bg = 0,\n        .tilemapLeft = 0, \n        .tilemapTop = 0,\n        .width = 30,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x0e9\n    },\n    [WIN_BOTTOM_BAR] = {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 18,\n        .width = 30,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x0ad\n    },\n    [WIN_DESCRIPTION] = {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 14,\n        .width = DESC_WIN_WIDTH,\n        .height = DESC_WIN_HEIGHT,\n        .paletteNum = 15,\n        .baseBlock = 0x14c\n    }\n};\n\nstatic const u8 sTextColors[3] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_3};\n\nstatic const u16 sDescriptionWindow_Gfx[] = INCBIN_U16(\"graphics/quest_log/description_window.4bpp\");\n\nstatic const u8 sQuestLogTextLineYCoords[] = {17, 10, 3};\n\nvoid QL_AddASLROffset(void *oldSaveBlockPtr)\n{\n    // For some reason the caller passes the original pointer and the\n    // amount the save moved is recalculated, instead of just passing\n    // the offset to begin with.\n    ptrdiff_t offset = (void *)gSaveBlock1Ptr - oldSaveBlockPtr;\n    if (gQuestLogDefeatedWildMonRecord)\n        gQuestLogDefeatedWildMonRecord = (void *)gQuestLogDefeatedWildMonRecord + offset;\n\n    if (gQuestLogState == 0)\n        return;\n\n    if (gQuestLogRecordingPointer)\n        gQuestLogRecordingPointer = (void *)gQuestLogRecordingPointer + offset;\n\n    if (gQuestLogState == QL_STATE_PLAYBACK)\n    {\n        int i;\n        for (i = 0; i < (int)ARRAY_COUNT(sEventData); i++)\n            if (sEventData[i])\n                sEventData[i] = (void *)sEventData[i] + offset;\n    }\n}\n\nvoid ResetQuestLog(void)\n{\n    memset(gSaveBlock1Ptr->questLog, 0, sizeof(gSaveBlock1Ptr->questLog));\n    sCurrentSceneNum = 0;\n    gQuestLogState = 0;\n    sQuestLogCB = NULL;\n    gQuestLogRecordingPointer = NULL;\n    gQuestLogDefeatedWildMonRecord = NULL;\n    QL_ResetEventStates();\n    ResetDeferredLinkEvent();\n}\n\nstatic void ClearSavedScene(u8 sceneNum)\n{\n    memset(&gSaveBlock1Ptr->questLog[sceneNum], 0, sizeof(gSaveBlock1Ptr->questLog[sceneNum]));\n    gQuestLogDefeatedWildMonRecord = NULL;\n}\n\nvoid QL_ResetDefeatedWildMonRecord(void)\n{\n    gQuestLogDefeatedWildMonRecord = NULL;\n}\n\nvoid RunQuestLogCB(void)\n{\n    if (sQuestLogCB != NULL)\n        sQuestLogCB();\n}\n\nbool8 QL_IsRoomToSaveEvent(const void * cursor, size_t size)\n{\n    const void *start = gSaveBlock1Ptr->questLog[sCurrentSceneNum].script;\n    const void *end = gSaveBlock1Ptr->questLog[sCurrentSceneNum].end;\n    end -= size;\n    if (cursor < start || cursor > end)\n        return FALSE;\n    return TRUE;\n}\n\n// Identical to QL_IsRoomToSaveEvent\nbool8 QL_IsRoomToSaveAction(const void * cursor, size_t size)\n{\n    const void *start = gSaveBlock1Ptr->questLog[sCurrentSceneNum].script;\n    const void *end = gSaveBlock1Ptr->questLog[sCurrentSceneNum].end;\n    end -= size;\n    if (cursor < start || cursor > end)\n        return FALSE;\n    return TRUE;\n}\n\nstatic void SetQuestLogState(u8 state)\n{\n    gQuestLogState = state;\n    if (state == QL_STATE_RECORDING)\n        sQuestLogCB = QLogCB_Recording;\n    else\n        sQuestLogCB = QLogCB_Playback;\n}\n\nstatic void QLogCB_Recording(void)\n{\n    if (TryRecordActionSequence(sQuestLogActionRecordBuffer) != 1)\n    {\n        gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n        RecordSceneEnd();\n        gQuestLogState = 0;\n        sQuestLogCB = NULL;\n    }\n}\n\nstatic void QLogCB_Playback(void)\n{\n    if (sPlaybackControl.state == 2)\n        sPlaybackControl.state = 0;\n\n    if (sPlaybackControl.endMode == END_MODE_NONE)\n    {\n        if (gQuestLogPlaybackState != QL_PLAYBACK_STATE_STOPPED \n         || sPlaybackControl.state == 1 \n         || (sPlaybackControl.cursor < ARRAY_COUNT(sEventData) \n          && sEventData[sPlaybackControl.cursor] != NULL))\n            QuestLog_PlayCurrentEvent();\n        else\n        {\n            sPlaybackControl.endMode = END_MODE_SCENE;\n            LockPlayerFieldControls();\n            DoSceneEndTransition(0);\n        }\n    }\n}\n\nvoid GetQuestLogState(void)\n{\n    gSpecialVar_Result = gQuestLogState;\n}\n\nu8 GetQuestLogStartType(void)\n{\n    return gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType;\n}\n\nvoid QL_StartRecordingAction(u16 eventId)\n{\n    if (eventId == QL_EVENT_DEPARTED && gMapHeader.mapLayoutId == LAYOUT_PALLET_TOWN && VarGet(VAR_MAP_SCENE_PALLET_TOWN_OAK) == 3)\n        return; //Don't record departing from Oak's Lab if Master Trainer speech is pending.\n\n    if (sCurrentSceneNum >= QUEST_LOG_SCENE_COUNT)\n        sCurrentSceneNum = 0;\n\n    ClearSavedScene(sCurrentSceneNum);\n    QL_ResetRepeatEventTracker();\n    gQuestLogRecordingPointer = gSaveBlock1Ptr->questLog[sCurrentSceneNum].script;\n    if (IS_LINK_QL_EVENT(eventId) || eventId == QL_EVENT_DEPARTED)\n        gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType = QL_START_WARP;\n    else\n        gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType = QL_START_NORMAL;\n    SetPokemonCounts();\n    SetPlayerInitialCoordsAtScene(sCurrentSceneNum);\n    SetNPCInitialCoordsAtScene(sCurrentSceneNum);\n    BackUpTrainerRematches();\n    BackUpMapLayout();\n    SetGameStateAtScene(sCurrentSceneNum);\n    sRecordSequenceStartIdx = 0;\n    ResetActions(QL_PLAYBACK_STATE_RECORDING, sQuestLogActionRecordBuffer, sizeof(sQuestLogActionRecordBuffer));\n    TryRecordActionSequence(sQuestLogActionRecordBuffer);\n    SetQuestLogState(QL_STATE_RECORDING);\n}\n\nstatic void SetPlayerInitialCoordsAtScene(u8 sceneNum)\n{\n    struct QuestLogScene * questLog = &gSaveBlock1Ptr->questLog[sceneNum];\n    questLog->mapGroup = gSaveBlock1Ptr->location.mapGroup;\n    questLog->mapNum = gSaveBlock1Ptr->location.mapNum;\n    questLog->warpId = gSaveBlock1Ptr->location.warpId;\n    questLog->x = gSaveBlock1Ptr->pos.x;\n    questLog->y = gSaveBlock1Ptr->pos.y;\n}\n\nstatic void SetNPCInitialCoordsAtScene(u8 sceneNum)\n{\n    struct QuestLogScene * questLog = &gSaveBlock1Ptr->questLog[sceneNum];\n    u32 i;\n\n    QL_RecordObjects(questLog);\n\n    for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++)\n    {\n        if (gSaveBlock1Ptr->objectEventTemplates[i].x < 0)\n        {\n            questLog->objectEventTemplates[i].x = -1 * gSaveBlock1Ptr->objectEventTemplates[i].x;\n            questLog->objectEventTemplates[i].negx = TRUE;\n        }\n        else\n        {\n            questLog->objectEventTemplates[i].x = (u8)gSaveBlock1Ptr->objectEventTemplates[i].x;\n            questLog->objectEventTemplates[i].negx = FALSE;\n        }\n        if (gSaveBlock1Ptr->objectEventTemplates[i].y < 0)\n        {\n            questLog->objectEventTemplates[i].y = (-gSaveBlock1Ptr->objectEventTemplates[i].y << 24) >> 24;\n            questLog->objectEventTemplates[i].negy = TRUE;\n        }\n        else\n        {\n            questLog->objectEventTemplates[i].y = (u8)gSaveBlock1Ptr->objectEventTemplates[i].y;\n            questLog->objectEventTemplates[i].negy = FALSE;\n        }\n        questLog->objectEventTemplates[i].elevation = gSaveBlock1Ptr->objectEventTemplates[i].objUnion.normal.elevation;\n        questLog->objectEventTemplates[i].movementType = gSaveBlock1Ptr->objectEventTemplates[i].objUnion.normal.movementType;\n    }\n}\n\nstatic void SetGameStateAtScene(u8 sceneNum)\n{\n    struct QuestLogScene * questLog = &gSaveBlock1Ptr->questLog[sceneNum];\n\n    CpuCopy16(gSaveBlock1Ptr->flags, questLog->flags, sizeof(gSaveBlock1Ptr->flags));\n    CpuCopy16(gSaveBlock1Ptr->vars, questLog->vars, sizeof(gSaveBlock1Ptr->vars));\n}\n\nstatic void BackUpTrainerRematches(void)\n{\n    u16 i, j;\n    u16 vars[4];\n\n    // Save the contents of gSaveBlock1Ptr->trainerRematches to the 4 saveblock\n    // vars starting at VAR_QLBAK_TRAINER_REMATCHES. The rematch array is 100 bytes\n    // long, but each byte is only ever 0 or 1 to indicate that a rematch is available.\n    // They're compressed into single bits across 4 u16 save vars, which is only enough\n    // to save 64 elements of gSaveBlock1Ptr->trainerRematches. 64 however is the maximum\n    // that could ever be used, as its the maximum number of NPCs per map (OBJECT_EVENT_TEMPLATES_COUNT).\n    for (i = 0; i < ARRAY_COUNT(vars); i++)\n    {\n        vars[i] = 0;\n\n        // 16 bits per var\n        for (j = 0; j < 16; j++)\n        {\n            if (gSaveBlock1Ptr->trainerRematches[16 * i + j])\n                vars[i] += (1 << j);\n        }\n        VarSet(VAR_QLBAK_TRAINER_REMATCHES + i, vars[i]);\n    }\n}\n\nstatic void BackUpMapLayout(void)\n{\n    VarSet(VAR_QLBAK_MAP_LAYOUT, gSaveBlock1Ptr->mapLayoutId);\n}\n\nstatic void RecordSceneEnd(void)\n{\n    QL_RecordAction_SceneEnd(gQuestLogRecordingPointer);\n    if (++sCurrentSceneNum >= QUEST_LOG_SCENE_COUNT)\n        sCurrentSceneNum = 0;\n}\n\nstatic bool8 TryRecordActionSequence(struct QuestLogAction * actions)\n{\n    u32 i;\n\n    for (i = sRecordSequenceStartIdx; i < gQuestLogCurActionIdx; i++)\n    {\n        if (gQuestLogRecordingPointer == NULL)\n            return FALSE;\n        switch (actions[i].type)\n        {\n        case QL_ACTION_MOVEMENT:\n        case QL_ACTION_GFX_CHANGE:\n            gQuestLogRecordingPointer = QL_RecordAction_MovementOrGfxChange(gQuestLogRecordingPointer, &actions[i]);\n            break;\n        default:\n            gQuestLogRecordingPointer = QL_RecordAction_Input(gQuestLogRecordingPointer, &actions[i]);\n            break;\n        }\n        if (gQuestLogRecordingPointer == NULL)\n        {\n            gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n            return FALSE;\n        }\n    }\n\n    if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_STOPPED)\n    {\n        gQuestLogRecordingPointer = QL_RecordAction_SceneEnd(gQuestLogRecordingPointer);\n        return FALSE;\n    }\n    sRecordSequenceStartIdx = gQuestLogCurActionIdx;\n    return TRUE;\n}\n\nvoid TryStartQuestLogPlayback(u8 taskId)\n{\n    u32 i;\n\n    QL_EnableRecordingSteps();\n    sNumScenes = 0;\n    for (i = 0; i < QUEST_LOG_SCENE_COUNT; i++)\n    {\n        if (gSaveBlock1Ptr->questLog[i].startType != 0)\n            sNumScenes++;\n    }\n\n    if (sNumScenes != 0)\n    {\n        gHelpSystemEnabled = FALSE;\n        Task_BeginQuestLogPlayback(taskId);\n        DestroyTask(taskId);\n    }\n    else\n    {\n        SetMainCallback2(CB2_ContinueSavedGame);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_BeginQuestLogPlayback(u8 taskId)\n{\n    gSaveBlock1Ptr->location.mapGroup = MAP_GROUP(ROUTE1);\n    gSaveBlock1Ptr->location.mapNum =  MAP_NUM(ROUTE1);\n    gSaveBlock1Ptr->location.warpId = WARP_ID_NONE;\n    sCurrentSceneNum = 0;\n    gDisableMapMusicChangeOnMapLoad = 1;\n    DisableWildEncounters(TRUE);\n    QLPlayback_InitOverworldState();\n}\n\nvoid QL_InitSceneObjectsAndActions(void)\n{\n    ReadQuestLogScriptFromSav1(sCurrentSceneNum, sQuestLogActionRecordBuffer);\n    QL_ResetRepeatEventTracker();\n    ResetActions(QL_PLAYBACK_STATE_RUNNING, sQuestLogActionRecordBuffer, sizeof(sQuestLogActionRecordBuffer));\n    QL_LoadObjectsAndTemplates(sCurrentSceneNum);\n}\n\nstatic bool8 FieldCB2_QuestLogStartPlaybackWithWarpExit(void)\n{\n    LoadPalette(GetTextWindowPalette(4), BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n    SetQuestLogState(QL_STATE_PLAYBACK);\n    FieldCB_DefaultWarpExit();\n    sPlaybackControl = (struct PlaybackControl){};\n    sPlaybackControl.state = 2;\n    return 1;\n}\n\nstatic bool8 FieldCB2_QuestLogStartPlaybackStandingInPlace(void)\n{\n    LoadPalette(GetTextWindowPalette(4), BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n    SetQuestLogState(QL_STATE_PLAYBACK);\n    FieldCB_WarpExitFadeFromBlack();\n    sPlaybackControl = (struct PlaybackControl){};\n    sPlaybackControl.state = 2;\n    return 1;\n}\n\nvoid DrawPreviouslyOnQuestHeader(u8 sceneNum)\n{\n    u32 i;\n\n    for (i = 0; i < WIN_COUNT; i++)\n    {\n        sWindowIds[i] = AddWindow(&sWindowTemplates[i]);\n        FillWindowPixelRect(sWindowIds[i], 15, 0, 0, sWindowTemplates[i].width * 8, sWindowTemplates[i].height * 8);\n    }\n\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_PreviouslyOnYourQuest);\n\n    // Scene numbers count from 4 to 0, 0 being where the player saved\n    if (sceneNum != 0)\n    {\n        ConvertIntToDecimalStringN(gStringVar1, sceneNum, STR_CONV_MODE_LEFT_ALIGN, 1);\n        StringAppend(gStringVar4, gStringVar1);\n    }\n\n    AddTextPrinterParameterized4(sWindowIds[WIN_TOP_BAR], FONT_NORMAL, 2, 2, 1, 2, sTextColors, 0, gStringVar4);\n    PutWindowTilemap(sWindowIds[WIN_TOP_BAR]);\n    PutWindowTilemap(sWindowIds[WIN_BOTTOM_BAR]);\n    CopyWindowToVram(sWindowIds[WIN_TOP_BAR], COPYWIN_GFX);\n    CopyWindowToVram(sWindowIds[WIN_DESCRIPTION], COPYWIN_GFX);\n    CopyWindowToVram(sWindowIds[WIN_BOTTOM_BAR], COPYWIN_FULL);\n}\n\nvoid CommitQuestLogWindow1(void)\n{\n    PutWindowTilemap(sWindowIds[WIN_BOTTOM_BAR]);\n    CopyWindowToVram(sWindowIds[WIN_BOTTOM_BAR], COPYWIN_MAP);\n}\n\nstatic void QL_LoadObjectsAndTemplates(u8 sceneNum)\n{\n    struct QuestLogScene *questLog = &gSaveBlock1Ptr->questLog[sceneNum];\n    u32 i;\n    \n    for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++)\n    {\n        if (questLog->objectEventTemplates[i].negx)\n            gSaveBlock1Ptr->objectEventTemplates[i].x = -questLog->objectEventTemplates[i].x;\n        else\n            gSaveBlock1Ptr->objectEventTemplates[i].x = questLog->objectEventTemplates[i].x;\n        if (questLog->objectEventTemplates[i].negy)\n            gSaveBlock1Ptr->objectEventTemplates[i].y = -(u8)questLog->objectEventTemplates[i].y;\n        else\n            gSaveBlock1Ptr->objectEventTemplates[i].y = questLog->objectEventTemplates[i].y;\n        gSaveBlock1Ptr->objectEventTemplates[i].objUnion.normal.elevation = questLog->objectEventTemplates[i].elevation;\n        gSaveBlock1Ptr->objectEventTemplates[i].objUnion.normal.movementType = questLog->objectEventTemplates[i].movementType;\n    }\n\n    QL_LoadObjects(questLog, gSaveBlock1Ptr->objectEventTemplates);\n}\n\nstatic void QLPlayback_SetInitialPlayerPosition(u8 sceneNum, bool8 isWarp)\n{\n    if (!isWarp)\n    {\n        gSaveBlock1Ptr->location.mapGroup = gSaveBlock1Ptr->questLog[sceneNum].mapGroup;\n        gSaveBlock1Ptr->location.mapNum = gSaveBlock1Ptr->questLog[sceneNum].mapNum;\n        gSaveBlock1Ptr->location.warpId = gSaveBlock1Ptr->questLog[sceneNum].warpId;\n        gSaveBlock1Ptr->pos.x = gSaveBlock1Ptr->questLog[sceneNum].x;\n        gSaveBlock1Ptr->pos.y = gSaveBlock1Ptr->questLog[sceneNum].y;\n    }\n    else\n    {\n        struct WarpData warp;\n        warp.mapGroup = gSaveBlock1Ptr->questLog[sceneNum].mapGroup;\n        warp.mapNum = gSaveBlock1Ptr->questLog[sceneNum].mapNum;\n        warp.warpId = gSaveBlock1Ptr->questLog[sceneNum].warpId;\n        warp.x = gSaveBlock1Ptr->questLog[sceneNum].x;\n        warp.y = gSaveBlock1Ptr->questLog[sceneNum].y;\n        Overworld_SetWarpDestinationFromWarp(&warp);\n    }\n}\n\nstatic void QLPlayback_InitOverworldState(void)\n{\n    gQuestLogState = QL_STATE_PLAYBACK;\n    ResetSpecialVars();\n    ClearBag();\n    ClearPCItemSlots();\n    if (GetQuestLogStartType() == QL_START_NORMAL)\n    {\n        QLPlayback_SetInitialPlayerPosition(sCurrentSceneNum, FALSE);\n        gFieldCallback2 = FieldCB2_QuestLogStartPlaybackStandingInPlace;\n        SetMainCallback2(CB2_SetUpOverworldForQLPlayback);\n    }\n    else\n    {\n        QLPlayback_SetInitialPlayerPosition(sCurrentSceneNum, TRUE);\n        WarpIntoMap();\n        gFieldCallback2 = FieldCB2_QuestLogStartPlaybackWithWarpExit;\n        SetMainCallback2(CB2_SetUpOverworldForQLPlaybackWithWarpExit);\n    }\n}\n\nvoid QL_CopySaveState(void)\n{\n    struct QuestLogScene * questLog = &gSaveBlock1Ptr->questLog[sCurrentSceneNum];\n\n    CpuCopy16(questLog->flags, gSaveBlock1Ptr->flags, sizeof(gSaveBlock1Ptr->flags));\n    CpuCopy16(questLog->vars, gSaveBlock1Ptr->vars, sizeof(gSaveBlock1Ptr->vars));\n    RestoreTrainerRematches();\n}\n\n// The number of bits allocated to store the number of pokemon in the PC\n#define NUM_PC_COUNT_BITS  12\n\nvoid QL_ResetPartyAndPC(void)\n{\n    struct {\n        struct Pokemon mon;\n        u16 partyCount;\n        u16 boxMonCount;\n    } *prev = AllocZeroed(sizeof(*prev));\n    u16 packedCounts, i, count, j;\n\n    CreateMon(&prev->mon, SPECIES_RATTATA, 1, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0);\n    packedCounts = VarGet(VAR_QUEST_LOG_MON_COUNTS);\n    prev->partyCount = packedCounts >> NUM_PC_COUNT_BITS;\n    prev->boxMonCount = packedCounts % (1 << NUM_PC_COUNT_BITS);\n\n    count = QuestLog_GetPartyCount();\n    if (count > prev->partyCount)\n    {\n        for (i = 0; i < count - prev->partyCount; i++)\n            ZeroMonData(&gPlayerParty[PARTY_SIZE - 1 - i]);\n    }\n    else if (count < prev->partyCount)\n    {\n        // Clear 5 slots in the PC?\n        for (i = 0; i < PARTY_SIZE - 1; i++)\n            ZeroBoxMonAt(0, i);\n\n        // Replace the additional slots with placeholder Pokémon.\n        for (i = count; i < prev->partyCount; i++)\n            CopyMon(&gPlayerParty[i], &prev->mon, sizeof(struct Pokemon));\n    }\n\n    count = QuestLog_GetBoxMonCount();\n    if (count > prev->boxMonCount)\n    {\n        for (i = 0; i < TOTAL_BOXES_COUNT; i++)\n        {\n            for (j = 0; j < IN_BOX_COUNT; j++)\n            {\n                if (GetBoxMonDataAt(i, j, MON_DATA_SANITY_HAS_SPECIES))\n                {\n                    ZeroBoxMonAt(i, j);\n                    if (--count == prev->boxMonCount)\n                        break;\n                }\n            }\n            if (count == prev->boxMonCount)\n                break;\n        }\n    }\n    else if (count < prev->boxMonCount)\n    {\n        for (i = 0; i < TOTAL_BOXES_COUNT; i++)\n        {\n            for (j = 0; j < IN_BOX_COUNT; j++)\n            {\n                struct BoxPokemon * boxMon = GetBoxedMonPtr(i, j);\n                if (!GetBoxMonData(boxMon, MON_DATA_SANITY_HAS_SPECIES))\n                {\n                    // Replace the additional slots with placeholder Pokémon.\n                    CopyMon(boxMon, &prev->mon.box, sizeof(struct BoxPokemon));\n                    if (++count == prev->boxMonCount)\n                        break;\n                }\n            }\n            if (count == prev->boxMonCount)\n                break;\n        }\n    }\n    Free(prev);\n}\n\nstatic void SetPokemonCounts(void)\n{\n    u16 partyCount = QuestLog_GetPartyCount();\n    u16 boxesCount = QuestLog_GetBoxMonCount();\n    VarSet(VAR_QUEST_LOG_MON_COUNTS, (partyCount << NUM_PC_COUNT_BITS) + boxesCount);\n}\n\nstatic u16 QuestLog_GetPartyCount(void)\n{\n    u16 count = 0;\n    u32 i;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES))\n            count++;\n    }\n\n    return count;\n}\n\nstatic u16 QuestLog_GetBoxMonCount(void)\n{\n    u16 count = 0;\n    u16 i, j;\n\n    for (i = 0; i < TOTAL_BOXES_COUNT; i++)\n    {\n        for (j = 0; j < IN_BOX_COUNT; j++)\n        {\n            if (GetBoxMonDataAt(i, j, MON_DATA_SANITY_HAS_SPECIES))\n                count++;\n        }\n    }\n\n    return count;\n}\n\n// Inverse of BackUpTrainerRematches\nstatic void RestoreTrainerRematches(void)\n{\n    u16 i, j;\n    u16 vars[4];\n\n    for (i = 0; i < ARRAY_COUNT(vars); i++)\n    {\n        vars[i] = VarGet(VAR_QLBAK_TRAINER_REMATCHES + i);\n\n        // 16 bits per var\n        for (j = 0; j < 16; j++)\n        {\n            if (vars[i] & 1)\n                gSaveBlock1Ptr->trainerRematches[16 * i + j] = 30;\n            else\n                gSaveBlock1Ptr->trainerRematches[16 * i + j] = 0;\n            vars[i] >>= 1;\n        }\n    }\n}\n\n// Inverse of BackUpMapLayout\nvoid QL_RestoreMapLayoutId(void)\n{\n    gSaveBlock1Ptr->mapLayoutId = VarGet(VAR_QLBAK_MAP_LAYOUT);\n    if (gSaveBlock1Ptr->mapLayoutId == 0)\n    {\n        struct MapHeader header = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum);\n        gSaveBlock1Ptr->mapLayoutId = header.mapLayoutId;\n    }\n}\n\nstatic void ReadQuestLogScriptFromSav1(u8 sceneNum, struct QuestLogAction * actions)\n{\n    u32 i;\n    u16 *script;\n    u16 actionNum = 0;\n    u16 eventNum = 0;\n\n    memset(actions, 0, ARRAY_COUNT(sEventData) * sizeof(struct QuestLogAction));\n    for (i = 0; i < ARRAY_COUNT(sEventData); i++)\n        sEventData[i] = NULL;\n\n    script = gSaveBlock1Ptr->questLog[sceneNum].script;\n    for (i = 0; i < ARRAY_COUNT(sEventData); i++)\n    {\n        switch (script[0] & QL_CMD_EVENT_MASK)\n        {\n        case QL_EVENT_INPUT:\n            script = QL_LoadAction_Input(script, &actions[actionNum]);\n            actionNum++;\n            break;\n        case QL_EVENT_GFX_CHANGE:\n        case QL_EVENT_MOVEMENT:\n            script = QL_LoadAction_MovementOrGfxChange(script, &actions[actionNum]);\n            actionNum++;\n            break;\n        case QL_EVENT_SCENE_END:\n            script = QL_LoadAction_SceneEnd(script, &actions[actionNum]);\n            actionNum++;\n            break;\n        case QL_EVENT_WAIT:\n            script = QL_LoadAction_Wait(script, &actions[actionNum]);\n            actionNum++;\n            break;\n        default: // Normal event\n            script = QL_SkipCommand(script, &sEventData[eventNum]);\n            if (eventNum == 0)\n                QL_UpdateLastDepartedLocation(sEventData[0]);\n            eventNum++;\n            break;\n        }\n        if (script == NULL)\n            break;\n    }\n}\n\nstatic void DoSceneEndTransition(s8 delay)\n{\n    FadeScreen(FADE_TO_BLACK, delay);\n    sQuestLogCB = QuestLog_AdvancePlayhead;\n}\n\nstatic void QuestLog_AdvancePlayhead(void)\n{\n    if (gPaletteFade.active)\n        return;\n\n    LockPlayerFieldControls();\n    if (++sCurrentSceneNum < QUEST_LOG_SCENE_COUNT && gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType != 0)\n    {\n        sNumScenes--;\n        QLPlayback_InitOverworldState();\n    }\n    else\n    {\n        gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n        QuestLog_StartFinalScene();\n    }\n}\n\nstatic void QuestLog_StartFinalScene(void)\n{\n    u32 i;\n    u8 KeyVersionBackup = gSaveBlock1Ptr->keyFlags.version;\n    u8 KeyDifficultyBackup = gSaveBlock1Ptr->keyFlags.difficulty;\n    u8 KeyNuzlockeBackup = gSaveBlock1Ptr->keyFlags.nuzlocke;\n    u8 KeyIvCalcBackup = gSaveBlock1Ptr->keyFlags.ivCalcMode;\n    u8 KeyEvCalcBackup = gSaveBlock1Ptr->keyFlags.evCalcMode;\n    u8 ChangedCalcBackup = gSaveBlock1Ptr->keyFlags.changedCalcMode;\n    u8 noPMCBackup = gSaveBlock1Ptr->keyFlags.noPMC;\n    u8 expModBackup = gSaveBlock1Ptr->keyFlags.expMod;\n    ResetSpecialVars();\n    Save_ResetSaveCounters();\n    LoadGameSave(SAVE_NORMAL);\n    gSaveBlock1Ptr->keyFlags.version = KeyVersionBackup;\n    gSaveBlock1Ptr->keyFlags.difficulty = KeyDifficultyBackup;\n    gSaveBlock1Ptr->keyFlags.nuzlocke = KeyNuzlockeBackup;\n    gSaveBlock1Ptr->keyFlags.ivCalcMode = KeyIvCalcBackup;\n    gSaveBlock1Ptr->keyFlags.evCalcMode = KeyEvCalcBackup;\n    gSaveBlock1Ptr->keyFlags.noPMC = noPMCBackup;\n    gSaveBlock1Ptr->keyFlags.expMod = expModBackup;\n    gSaveBlock1Ptr->keyFlags.changedCalcMode = 0;\n    //recalculate party stats for IV and EV keys if they were changed\n    if(ChangedCalcBackup == 1)\n    {\n        for (i = 0; i < gPlayerPartyCount; i++)\n        {\n            CalculateMonStats(&gPlayerParty[i], FALSE);\n        }\n    }\n    SetMainCallback2(CB2_EnterFieldFromQuestLog);\n    gFieldCallback2 = FieldCB2_FinalScene;\n    FreeAllWindowBuffers();\n    gQuestLogState = QL_STATE_PLAYBACK_LAST;\n    sQuestLogCB = NULL;\n}\n\nvoid QuestLog_AdvancePlayhead_(void)\n{\n    QuestLog_AdvancePlayhead();\n}\n\n#define tTimer data[0]\n#define tState data[1]\n#define DATA_IDX_CALLBACK 14 // data[14] and data[15]\n\n// This is used to avoid recording or displaying certain windows or images, like a shop menu.\n// During playback it returns TRUE (meaning the action should be avoided) and calls the\n// provided callback, which would be used to e.g. destroy any resources that were set up to do\n// whatever is being avoided. In all cases the provided callback will be QL_DestroyAbortedDisplay.\n// If we are not currently in playback return FALSE (meaning allow the action to occur) and\n// stop recording (if we are currently).\nbool8 QL_AvoidDisplay(void (*callback)(void))\n{\n    u8 taskId;\n\n    switch (gQuestLogState)\n    {\n    case QL_STATE_RECORDING:\n        QuestLog_CutRecording();\n        break;\n    case QL_STATE_PLAYBACK:\n        gQuestLogPlaybackState = QL_PLAYBACK_STATE_ACTION_END;\n        taskId = CreateTask(Task_AvoidDisplay, 80);\n        gTasks[taskId].tTimer = 0;\n        gTasks[taskId].tState = 0;\n        SetWordTaskArg(taskId, DATA_IDX_CALLBACK, (uintptr_t)callback);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void Task_AvoidDisplay(u8 taskId)\n{\n    void (*routine)(void);\n    s16 *data = gTasks[taskId].data;\n\n    switch (tState)\n    {\n    case 0:\n        // Instead of displaying anything, wait and then end the scene.\n        if (++tTimer == 127)\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0);\n            sPlaybackControl.endMode = END_MODE_SCENE;\n            tState++;\n        }\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n        {\n            gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n            \n            // Call the provided function (if any). In practice this is always QL_DestroyAbortedDisplay\n            routine = (void (*)(void)) GetWordTaskArg(taskId, DATA_IDX_CALLBACK);\n            if (routine != NULL)\n                routine();\n\n            DestroyTask(taskId);\n            sQuestLogCB = QuestLog_AdvancePlayhead;\n        }\n        break;\n    }\n}\n\n#undef tTimer\n#undef tState\n\nstatic void QuestLog_PlayCurrentEvent(void)\n{\n    if (sPlaybackControl.state == 1)\n    {\n        if (--sPlaybackControl.timer != 0)\n            return;\n        sPlaybackControl.state = 0;\n        sPlaybackControl.playingEvent = TRUE;\n        TogglePlaybackStateForOverworldLock(2);\n    }\n\n    if (sPlaybackControl.playingEvent == TRUE)\n    {\n        if (++sPlaybackControl.overlapTimer > 15)\n        {\n            QuestLog_CloseTextWindow();\n            sPlaybackControl.playingEvent = FALSE;\n            sPlaybackControl.overlapTimer = 0;\n        }\n    }\n    if (sPlaybackControl.cursor < ARRAY_COUNT(sEventData))\n    {\n        if (QL_TryRepeatEvent(sEventData[sPlaybackControl.cursor]) == TRUE)\n            HandleShowQuestLogMessage();\n        else if (QL_LoadEvent(sEventData[sPlaybackControl.cursor]) == TRUE)\n            HandleShowQuestLogMessage();\n    }\n}\n\nstatic void HandleShowQuestLogMessage(void)\n{\n    if (sPlaybackControl.state == 0)\n    {\n        sPlaybackControl.state = 1;\n        sPlaybackControl.playingEvent = FALSE;\n        sPlaybackControl.overlapTimer = 0;\n        sPlaybackControl.timer = GetQuestLogTextDisplayDuration();\n        if (gQuestLogRepeatEventTracker.counter == 0)\n            sPlaybackControl.cursor++;\n        if (sPlaybackControl.cursor > ARRAY_COUNT(sEventData))\n            return;\n        DrawSceneDescription();\n    }\n    TogglePlaybackStateForOverworldLock(1); // lock\n}\n\nstatic u8 GetQuestLogTextDisplayDuration(void)\n{\n    u32 i;\n    u16 count = 0;\n\n    for (i = 0; i < 0x400 && gStringVar4[i] != EOS; i++)\n    {\n        if (gStringVar4[i] != CHAR_NEWLINE)\n            count++;\n    }\n\n    if (count < 20)\n        return 0x5F;\n    if (count < 36)\n        return 0x7F;\n    if (count < 46)\n        return 0xBF;\n    return 0xFF;\n}\n\nbool8 QL_IsTrainerSightDisabled(void)\n{\n    if (gQuestLogState != QL_STATE_PLAYBACK)\n        return FALSE;\n    if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_STOPPED || sPlaybackControl.state == 1 || sPlaybackControl.state == 2)\n        return TRUE;\n    return FALSE;\n}\n\nvoid QL_HandleInput(void)\n{\n    // Ignore input if we're currently ending a scene/playback\n    if (sPlaybackControl.endMode != END_MODE_NONE)\n        return;\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        // Pressed A, skip to next scene\n        sPlaybackControl.endMode = END_MODE_SCENE;\n        gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n        DoSceneEndTransition(-3);\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        // Pressed B, end playback\n        sPlaybackControl.endMode = END_MODE_FINISH;\n        gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n        DoSkipToEndTransition(-3);\n    }\n}\n\nbool8 QuestLogScenePlaybackIsEnding(void)\n{\n    if (sPlaybackControl.endMode != END_MODE_NONE)\n        return TRUE;\n    return FALSE;\n}\n\nvoid QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(void)\n{\n    if (gQuestLogState == QL_STATE_PLAYBACK)\n        DrawPreviouslyOnQuestHeader(sNumScenes);\n}\n\nstatic void DrawSceneDescription(void)\n{\n    u32 i;\n    u8 numLines = 0;\n\n    for (i = 0; i < 0x100 && gStringVar4[i] != EOS; i++)\n    {\n        if (gStringVar4[i] == CHAR_NEWLINE)\n            numLines++;\n    }\n\n    PutWindowTilemap(sWindowIds[WIN_DESCRIPTION]);\n    CopyDescriptionWindowTiles(sWindowIds[WIN_DESCRIPTION]);\n    AddTextPrinterParameterized4(sWindowIds[WIN_DESCRIPTION], FONT_NORMAL, 2, sQuestLogTextLineYCoords[numLines], 1, 0, sTextColors, 0, gStringVar4);\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nstatic void CopyDescriptionWindowTiles(u8 windowId)\n{\n    const u16 *src = sDescriptionWindow_Gfx;\n    u16 *buffer = Alloc(DESC_WIN_SIZE);\n    u8 i, j, y;\n\n    if (buffer)\n    {\n        for (i = 0; i < DESC_WIN_HEIGHT; i++)\n        {\n            switch (i)\n            {\n            default:\n                // Middle tile\n                y = 1;\n                break;\n            case 0:\n                // Top edge tile\n                y = 0;\n                break;\n            case DESC_WIN_HEIGHT - 1:\n                // Bottom edge tile\n                y = 2;\n                break;\n            }\n\n            for (j = 0; j < DESC_WIN_WIDTH; j++)\n                CpuCopy32(src + 16 * y, buffer + 16 * (2 * (15 * i) + j), TILE_SIZE_4BPP);\n        }\n\n        CopyToWindowPixelBuffer(windowId, (const u8 *)buffer, DESC_WIN_SIZE, 0);\n        Free(buffer);\n    }\n}\n\nstatic void QuestLog_CloseTextWindow(void)\n{\n    ClearWindowTilemap(sWindowIds[WIN_DESCRIPTION]);\n    FillWindowPixelRect(sWindowIds[WIN_DESCRIPTION], 15, 0, 0, 0xf0, 0x30);\n    CopyWindowToVram(sWindowIds[WIN_DESCRIPTION], COPYWIN_GFX);\n    PutWindowTilemap(sWindowIds[WIN_BOTTOM_BAR]);\n    CopyWindowToVram(sWindowIds[WIN_BOTTOM_BAR], COPYWIN_MAP);\n}\n\nstatic void DoSkipToEndTransition(s8 delay)\n{\n    FadeScreen(FADE_TO_BLACK, delay);\n    sQuestLogCB = QuestLog_WaitFadeAndCancelPlayback;\n}\n\nstatic void QuestLog_WaitFadeAndCancelPlayback(void)\n{\n    if (!gPaletteFade.active)\n    {\n        LockPlayerFieldControls();\n        for (sCurrentSceneNum = sCurrentSceneNum; sCurrentSceneNum < QUEST_LOG_SCENE_COUNT; sCurrentSceneNum++)\n        {\n            if (gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType == 0)\n                break;\n            ReadQuestLogScriptFromSav1(sCurrentSceneNum, sQuestLogActionRecordBuffer);\n        }\n        gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n        QuestLog_StartFinalScene();\n    }\n}\n\nvoid QuestLog_InitPalettesBackup(void)\n{\n    if (gQuestLogState == QL_STATE_PLAYBACK_LAST)\n        sPalettesBackup = AllocZeroed(PLTT_SIZE);\n}\n\nvoid QuestLog_BackUpPalette(u16 offset, u16 size)\n{\n    CpuCopy16(&gPlttBufferUnfaded[offset], &sPalettesBackup[offset], PLTT_SIZEOF(size));\n}\n\nstatic bool8 FieldCB2_FinalScene(void)\n{\n    LoadPalette(GetTextWindowPalette(4), BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n    DrawPreviouslyOnQuestHeader(0);\n    FieldCB_WarpExitFadeFromBlack();\n    CreateTask(Task_FinalScene_WaitFade, 0xFF);\n    return TRUE;\n}\n\nstatic void Task_FinalScene_WaitFade(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (ArePlayerFieldControlsLocked() != TRUE)\n    {\n        FreezeObjectEvents();\n        HandleEnforcedLookDirectionOnPlayerStopMoving();\n        StopPlayerAvatar();\n        LockPlayerFieldControls();\n        task->func = Task_QuestLogScene_SavedGame;\n    }\n}\n\nstatic void Task_QuestLogScene_SavedGame(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (!gPaletteFade.active)\n    {\n        if (sPlaybackControl.endMode != END_MODE_FINISH)\n        {\n            GetMapNameGeneric(gStringVar1, gMapHeader.regionMapSectionId);\n            if(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(RS_BATTLE_TOWER) && (gSaveBlock1Ptr->location.mapNum >= MAP_NUM(RS_BATTLE_TOWER)\n        && gSaveBlock1Ptr->location.mapNum <= MAP_NUM(RS_BATTLE_TOWER_BATTLE_ROOM)))\n            {\n                StringCopy(gStringVar1, gText_BattleTower);\n            }\n            StringExpandPlaceholders(gStringVar4, gText_QuestLog_SavedGameAtLocation);\n            DrawSceneDescription();\n        }\n        task->data[0] = 0;\n        task->data[1] = 0;\n        task->func = Task_WaitAtEndOfQuestLog;\n        FreezeObjectEvents();\n        LockPlayerFieldControls();\n    }\n}\n\n#define tTimer data[0]\n\nstatic void Task_WaitAtEndOfQuestLog(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    if (JOY_NEW(A_BUTTON | B_BUTTON) || task->tTimer >= 127 || sPlaybackControl.endMode == END_MODE_FINISH)\n    {\n        QuestLog_CloseTextWindow();\n        task->tTimer = 0;\n        task->func = Task_EndQuestLog;\n        gQuestLogState = 0;\n    }\n    else\n        task->tTimer++;\n}\n\n#undef tTimer\n\nextern const u8 NationalDexAideEvent[];\n\n#define tState data[0]\n#define tTimer data[1]\n\nstatic void Task_EndQuestLog(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u32 i;\n\n    switch (tState)\n    {\n    case 0:\n        gDisableMapMusicChangeOnMapLoad = 0;\n        Overworld_PlaySpecialMapMusic();\n        QL_SlightlyDarkenSomePals();\n        FillWindowPixelRect(sWindowIds[WIN_TOP_BAR],\n                            0xF, 0, 0,\n                            sWindowTemplates[WIN_TOP_BAR].width * 8,\n                            sWindowTemplates[WIN_TOP_BAR].height * 8);\n        tState++;\n        break;\n    case 1:\n        if (RestoreScreenAfterPlayback(taskId))\n        {\n            for (i = 0; i < WIN_COUNT; i++)\n            {\n                ClearWindowTilemap(sWindowIds[i]);\n                CopyWindowToVram(sWindowIds[i], COPYWIN_MAP);\n                RemoveWindow(sWindowIds[i]);\n            }\n            tTimer = 0;\n            tState++;\n        }\n        break;\n    case 2:\n        if (tTimer < 32)\n            tTimer++;\n        else\n            tState++;\n        break;\n    default:\n        if (sPlaybackControl.endMode == END_MODE_FINISH)\n            ShowMapNamePopup(TRUE);\n        CpuCopy16(sPalettesBackup, gPlttBufferUnfaded, PLTT_SIZE);\n        Free(sPalettesBackup);\n        sPlaybackControl = (struct PlaybackControl){};\n        ClearPlayerHeldMovementAndUnfreezeObjectEvents();\n        UnlockPlayerFieldControls();\n        gTextFlags.autoScroll = FALSE;\n        gGlobalFieldTintMode = QL_TINT_NONE;\n        DisableWildEncounters(FALSE);\n        gHelpSystemEnabled = TRUE;\n        DestroyTask(taskId);\n        if(CheckNationalDexEligibilityOnSaveLoad() && DoCoordsMatchPMCExitMat() && FlagGet(FLAG_SYS_RECEIVED_EXTENDED_DEX))\n        {\n            DismissMapNamePopup();\n            ScriptContext_SetupScript(NationalDexAideEvent);\n        }\n        break;\n    }\n}\n\n#undef tState\n#undef tTimer\n\n#define tTimer data[1]\n\n// Scroll the top and bottom windows offscreen and restore the screen tint to the original color.\nstatic bool8 RestoreScreenAfterPlayback(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (tTimer > 15)\n        return TRUE;\n\n    CopyPaletteInvertedTint(&gPlttBufferUnfaded[BG_PLTT_ID(0) + 1], &gPlttBufferFaded[BG_PLTT_ID(0) + 1], 0xDF, 15 - tTimer);\n    CopyPaletteInvertedTint(&gPlttBufferUnfaded[OBJ_PLTT_ID(0)], &gPlttBufferFaded[OBJ_PLTT_ID(0)], 0x100, 15 - tTimer);\n    FillWindowPixelRect(sWindowIds[WIN_TOP_BAR],\n                        0x00, 0,\n                        sWindowTemplates[WIN_TOP_BAR].height * 8 - 1 - tTimer,\n                        sWindowTemplates[WIN_TOP_BAR].width * 8, 1);\n    FillWindowPixelRect(sWindowIds[WIN_BOTTOM_BAR],\n                        0x00, 0,\n                        data[1],\n                        sWindowTemplates[WIN_BOTTOM_BAR].width * 8, 1);\n    CopyWindowToVram(sWindowIds[WIN_TOP_BAR], COPYWIN_GFX);\n    CopyWindowToVram(sWindowIds[WIN_BOTTOM_BAR], COPYWIN_GFX);\n    tTimer++;\n    return FALSE;\n}\n\nstatic void QL_SlightlyDarkenSomePals(void)\n{\n    u16 *buffer = Alloc(PLTT_SIZE);\n    CpuCopy16(sPalettesBackup, buffer, PLTT_SIZE);\n    SlightlyDarkenPalsInWeather(sPalettesBackup, sPalettesBackup, 13 * 16);\n    SlightlyDarkenPalsInWeather(&sPalettesBackup[OBJ_PLTT_ID(1)], &sPalettesBackup[OBJ_PLTT_ID(1)], 1 * 16);\n    SlightlyDarkenPalsInWeather(&sPalettesBackup[OBJ_PLTT_ID(6)], &sPalettesBackup[OBJ_PLTT_ID(6)], 4 * 16);\n    SlightlyDarkenPalsInWeather(&sPalettesBackup[OBJ_PLTT_ID(11)], &sPalettesBackup[OBJ_PLTT_ID(11)], 5 * 16);\n    CpuCopy16(sPalettesBackup, gPlttBufferUnfaded, PLTT_SIZE);\n    CpuCopy16(buffer, sPalettesBackup, PLTT_SIZE);\n    Free(buffer);\n}\n\nvoid QL_FinishRecordingScene(void)\n{\n    if (gQuestLogState == QL_STATE_RECORDING)\n    {\n        TryRecordActionSequence(sQuestLogActionRecordBuffer);\n        RecordSceneEnd();\n        gQuestLogState = 0;\n        sQuestLogCB = NULL;\n        gQuestLogDefeatedWildMonRecord = NULL;\n        gQuestLogRecordingPointer = NULL;\n        gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n    }\n}\n\nvoid QuestLog_CutRecording(void)\n{\n    if (gQuestLogPlaybackState != QL_PLAYBACK_STATE_STOPPED && gQuestLogState == QL_STATE_RECORDING)\n    {\n        TryRecordActionSequence(sQuestLogActionRecordBuffer);\n        QL_RecordWait(1);\n        RecordSceneEnd();\n        gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n        gQuestLogState = 0;\n        sQuestLogCB = NULL;\n    }\n    gQuestLogDefeatedWildMonRecord = NULL;\n    gQuestLogRecordingPointer = NULL;\n}\n\nstatic void SortQuestLogInSav1(void)\n{\n    struct QuestLogScene * buffer = AllocZeroed(sizeof(gSaveBlock1Ptr->questLog));\n    u32 i;\n    u8 sceneNum = sCurrentSceneNum;\n    u8 count = 0;\n    for (i = 0; i < QUEST_LOG_SCENE_COUNT; i++)\n    {\n        if (sceneNum >= QUEST_LOG_SCENE_COUNT)\n            sceneNum = 0;\n        if (gSaveBlock1Ptr->questLog[sceneNum].startType != 0)\n        {\n            buffer[count] = gSaveBlock1Ptr->questLog[sceneNum];\n            count++;\n        }\n        sceneNum++;\n    }\n    sCurrentSceneNum = count % QUEST_LOG_SCENE_COUNT;\n    CpuCopy16(buffer, gSaveBlock1Ptr->questLog, sizeof(gSaveBlock1Ptr->questLog));\n    Free(buffer);\n}\n\nvoid SaveQuestLogData(void)\n{\n    if (MenuHelpers_IsLinkActive() != TRUE)\n    {\n        QuestLog_CutRecording();\n        SortQuestLogInSav1();\n    }\n}\n\nvoid QL_UpdateObject(struct Sprite *sprite)\n{\n    struct ObjectEvent *objectEvent = &gObjectEvents[sprite->data[0]];\n    if (objectEvent->localId == OBJ_EVENT_ID_PLAYER)\n    {\n        if (sMovementScripts[0][0] != MOVEMENT_ACTION_NONE)\n        {\n            ObjectEventSetHeldMovement(objectEvent, sMovementScripts[0][0]);\n            sMovementScripts[0][0] = MOVEMENT_ACTION_NONE;\n        }\n        if (sMovementScripts[0][1] != QL_PLAYER_GFX_NONE)\n        {\n            QuestLogUpdatePlayerSprite(sMovementScripts[0][1]);\n            sMovementScripts[0][1] = QL_PLAYER_GFX_NONE;\n        }\n        QL_UpdateObjectEventCurrentMovement(objectEvent, sprite);\n    }\n    else\n    {\n        if (sMovementScripts[objectEvent->localId][0] != MOVEMENT_ACTION_NONE)\n        {\n            ObjectEventSetHeldMovement(objectEvent, sMovementScripts[objectEvent->localId][0]);\n            sMovementScripts[objectEvent->localId][0] = MOVEMENT_ACTION_NONE;\n        }\n        QL_UpdateObjectEventCurrentMovement(objectEvent, sprite);\n    }\n}\n\nvoid QuestLogRecordNPCStep(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId)\n{\n    if (!RecordHeadAtEndOfEntryOrScriptContext2Enabled())\n    {\n        sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay;\n        sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_MOVEMENT;\n        sCurSceneActions[gQuestLogCurActionIdx].data.a.localId = localId;\n        sCurSceneActions[gQuestLogCurActionIdx].data.a.mapNum = mapNum;\n        sCurSceneActions[gQuestLogCurActionIdx].data.a.mapGroup = mapGroup;\n        sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = movementActionId;\n        gQuestLogCurActionIdx++;\n        sNextActionDelay = 0;\n    }\n}\n\nvoid QuestLogRecordNPCStepWithDuration(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId, u8 duration)\n{\n    if (!RecordHeadAtEndOfEntry())\n    {\n        sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay;\n        sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_MOVEMENT;\n        sCurSceneActions[gQuestLogCurActionIdx].data.a.localId = localId;\n        sCurSceneActions[gQuestLogCurActionIdx].data.a.mapNum = mapNum;\n        sCurSceneActions[gQuestLogCurActionIdx].data.a.mapGroup = mapGroup;\n        sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = movementActionId;\n        gQuestLogCurActionIdx++;\n        sNextActionDelay = duration;\n    }\n}\n\nvoid QuestLogRecordPlayerStep(u8 movementActionId)\n{\n    if (!RecordHeadAtEndOfEntryOrScriptContext2Enabled())\n    {\n        if (movementActionId != sCurSceneActions[sLastQuestLogCursor].data.a.movementActionId || movementActionId > MOVEMENT_ACTION_FACE_RIGHT)\n        {\n            sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay;\n            sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_MOVEMENT;\n            sCurSceneActions[gQuestLogCurActionIdx].data.a.localId = 0;\n            sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = movementActionId;\n            sLastQuestLogCursor = gQuestLogCurActionIdx;\n            gQuestLogCurActionIdx++;\n            sNextActionDelay = 0;\n        }\n    }\n}\n\nvoid QuestLogRecordPlayerStepWithDuration(u8 movementActionId, u8 duration)\n{\n    if (!RecordHeadAtEndOfEntry())\n    {\n        sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay;\n        sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_MOVEMENT;\n        sCurSceneActions[gQuestLogCurActionIdx].data.a.localId = 0;\n        sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = movementActionId;\n        sLastQuestLogCursor = gQuestLogCurActionIdx;\n        gQuestLogCurActionIdx++;\n        sNextActionDelay = duration;\n    }\n}\n\nvoid QuestLogRecordPlayerAvatarGfxTransition(u8 gfxState)\n{\n    if (!RecordHeadAtEndOfEntry())\n    {\n        sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay;\n        sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_GFX_CHANGE;\n        sCurSceneActions[gQuestLogCurActionIdx].data.b.localId = 0;\n        sCurSceneActions[gQuestLogCurActionIdx].data.b.gfxState = gfxState;\n        gQuestLogCurActionIdx++;\n        sNextActionDelay = 0;\n    }\n}\n\nvoid QuestLogRecordPlayerAvatarGfxTransitionWithDuration(u8 gfxState, u8 duration)\n{\n    if (!RecordHeadAtEndOfEntry())\n    {\n        sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay;\n        sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_GFX_CHANGE;\n        sCurSceneActions[gQuestLogCurActionIdx].data.b.localId = 0;\n        sCurSceneActions[gQuestLogCurActionIdx].data.b.gfxState = gfxState;\n        gQuestLogCurActionIdx++;\n        sNextActionDelay = duration;\n    }\n}\n\nvoid QL_RecordFieldInput(struct FieldInput * fieldInput)\n{\n    if (gQuestLogCurActionIdx < sMaxActionsInScene)\n    {\n        // Retain only the following fields:\n        // - pressedAButton\n        // - checkStandardWildEncounter\n        // - heldDirection\n        // - heldDirection2\n        // - tookStep\n        // - pressedBButton\n        // - dpadDirection\n        u32 data = *(u32 *)fieldInput & 0x00FF00F3;\n        sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay;\n        sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_INPUT;\n        sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[0] = data;\n        sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[1] = data >> 8; // always 0\n        sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[2] = data >> 16;\n        sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[3] = data >> 24; // always 0\n        gQuestLogCurActionIdx++;\n        if (ArePlayerFieldControlsLocked())\n            sNextActionDelay = 1;\n        else\n            sNextActionDelay = 0;\n    }\n}\n\nstatic void TogglePlaybackStateForOverworldLock(u8 a0)\n{\n    switch (a0)\n    {\n    case 1:\n        if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RUNNING)\n            gQuestLogPlaybackState = QL_PLAYBACK_STATE_ACTION_END; // Message visible, overworld locked\n        break;\n    case 2:\n        if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_ACTION_END)\n            gQuestLogPlaybackState = QL_PLAYBACK_STATE_RUNNING; // Overworld unlocked\n        break;\n    }\n}\n\nvoid QuestLog_OnEscalatorWarp(u8 direction)\n{\n    u8 state = QL_GetPlaybackState();\n\n    switch (direction)\n    {\n    case QL_ESCALATOR_OUT: // warp out\n        if (state == QL_PLAYBACK_STATE_RUNNING)\n            gQuestLogPlaybackState = QL_PLAYBACK_STATE_ACTION_END;\n        else if (state == QL_PLAYBACK_STATE_RECORDING)\n        {\n            sCurSceneActions[gQuestLogCurActionIdx].duration = sNextActionDelay;\n            sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_EMPTY;\n            gQuestLogCurActionIdx++;\n            sNextActionDelay = 0;\n            gQuestLogPlaybackState = QL_PLAYBACK_STATE_RECORDING_NO_DELAY;\n        }\n        break;\n    case QL_ESCALATOR_IN: // warp in\n        if (state == QL_PLAYBACK_STATE_RUNNING)\n            gQuestLogPlaybackState = QL_PLAYBACK_STATE_RUNNING;\n        else if (state == QL_PLAYBACK_STATE_RECORDING)\n            gQuestLogPlaybackState = QL_PLAYBACK_STATE_RECORDING;\n        break;\n    }\n}\n\nstatic void ResetActions(u8 kind, struct QuestLogAction *actions, u16 size)\n{\n    int i;\n\n    switch (kind)\n    {\n    default:\n        gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n        break;\n    case QL_PLAYBACK_STATE_RUNNING:\n        sCurSceneActions = actions;\n        sMaxActionsInScene = size / sizeof(*sCurSceneActions);\n        for (i = 0; i < (s32)ARRAY_COUNT(sMovementScripts); i++)\n        {\n            sMovementScripts[i][0] |= MOVEMENT_ACTION_NONE;\n            sMovementScripts[i][1] |= QL_PLAYER_GFX_NONE;\n        }\n        gQuestLogCurActionIdx = 0;\n        sLastQuestLogCursor = 0;\n        gQuestLogFieldInput = (struct FieldInput){};\n        sNextActionDelay = sCurSceneActions[gQuestLogCurActionIdx].duration;\n        sMovementScripts[0][0] = sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId;\n        sMovementScripts[0][1] = QL_PLAYER_GFX_NONE;\n        gQuestLogPlaybackState = QL_PLAYBACK_STATE_RUNNING;\n        break;\n    case QL_PLAYBACK_STATE_RECORDING:\n        sCurSceneActions = actions;\n        sMaxActionsInScene = size / sizeof(*sCurSceneActions);\n        for (i = 0; i < sMaxActionsInScene; i++)\n        {\n            sCurSceneActions[i] = (struct QuestLogAction){\n                .duration = 0xFFFF,\n                .type = QL_ACTION_SCENE_END\n            };\n        }\n        gQuestLogCurActionIdx = 0;\n        sNextActionDelay = 0;\n        sCurSceneActions[gQuestLogCurActionIdx].duration = 0;\n        sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_MOVEMENT;\n        sCurSceneActions[gQuestLogCurActionIdx].data.a.localId = 0;\n        switch (GetPlayerFacingDirection())\n        {\n        case DIR_NONE:\n        case DIR_SOUTH:\n            sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = MOVEMENT_ACTION_FACE_DOWN;\n            break;\n        case DIR_EAST:\n            sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = MOVEMENT_ACTION_FACE_RIGHT;\n            break;\n        case DIR_NORTH:\n            sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = MOVEMENT_ACTION_FACE_UP;\n            break;\n        case DIR_WEST:\n            sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId = MOVEMENT_ACTION_FACE_LEFT;\n            break;\n        }\n        sLastQuestLogCursor = 0;\n        gQuestLogCurActionIdx++;\n        sCurSceneActions[gQuestLogCurActionIdx].duration = 0;\n        sCurSceneActions[gQuestLogCurActionIdx].type = QL_ACTION_INPUT;\n        sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[0] = 0;\n        sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[1] = 0;\n        sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[2] = 0;\n        sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[3] = 0;\n        gQuestLogCurActionIdx++;\n        gQuestLogPlaybackState = QL_PLAYBACK_STATE_RECORDING;\n        break;\n    }\n}\n\nvoid QL_TryRunActions(void)\n{\n    switch (gQuestLogPlaybackState)\n    {\n    case QL_PLAYBACK_STATE_STOPPED:\n    case QL_PLAYBACK_STATE_ACTION_END:\n    case QL_PLAYBACK_STATE_RECORDING_NO_DELAY:\n        break;\n    case QL_PLAYBACK_STATE_RUNNING:\n        if (!RecordHeadAtEndOfEntryOrScriptContext2Enabled())\n        {\n            if (sNextActionDelay != 0)\n            {\n                sNextActionDelay--;\n            }\n            else\n            {\n                do\n                {\n                    switch (sCurSceneActions[gQuestLogCurActionIdx].type)\n                    {\n                    case QL_ACTION_MOVEMENT:\n                        // NPC movement action\n                        sMovementScripts[sCurSceneActions[gQuestLogCurActionIdx].data.a.localId][0] = sCurSceneActions[gQuestLogCurActionIdx].data.a.movementActionId;\n                        break;\n                    case QL_ACTION_GFX_CHANGE:\n                        // State transition\n                        sMovementScripts[sCurSceneActions[gQuestLogCurActionIdx].data.b.localId][1] = sCurSceneActions[gQuestLogCurActionIdx].data.b.gfxState;\n                        break;\n                    case QL_ACTION_INPUT:\n                        // Player input\n                        *(u32 *)&gQuestLogFieldInput = ((sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[3] << 24)\n                                                      | (sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[2] << 16)\n                                                      | (sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[1] << 8)\n                                                      | (sCurSceneActions[gQuestLogCurActionIdx].data.fieldInput[0] << 0));\n                        break;\n                    case QL_ACTION_EMPTY:\n                        // End\n                        gQuestLogPlaybackState = QL_PLAYBACK_STATE_ACTION_END;\n                        break;\n                    case QL_ACTION_WAIT:\n                        // Nothing. The wait action uses sNextActionDelay to add a pause to playback.\n                        // When the counter is finished and this is reached there's nothing else that needs to be done.\n                        break;\n                    case QL_ACTION_SCENE_END:\n                        gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n                        break;\n                    }\n\n                    if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_STOPPED)\n                        break;\n                    if (++gQuestLogCurActionIdx >= sMaxActionsInScene)\n                    {\n                        gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n                        break;\n                    }\n                    sNextActionDelay = sCurSceneActions[gQuestLogCurActionIdx].duration;\n\n                } while (gQuestLogPlaybackState != QL_PLAYBACK_STATE_ACTION_END && (sNextActionDelay == 0 || sNextActionDelay == 0xFFFF));\n            }\n        }\n        else if (gQuestLogCurActionIdx >= sMaxActionsInScene)\n        {\n            gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n        }\n        break;\n    case QL_PLAYBACK_STATE_RECORDING:\n        if (ArePlayerFieldControlsLocked() != TRUE)\n        {\n            sNextActionDelay++;\n            if (gQuestLogCurActionIdx >= sMaxActionsInScene)\n                gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n        }\n        break;\n    }\n}\n\nvoid QL_AfterRecordFishActionSuccessful(void)\n{\n    sNextActionDelay++;\n}\n\nu8 QL_GetPlaybackState(void)\n{\n    switch (gQuestLogPlaybackState)\n    {\n    case QL_PLAYBACK_STATE_STOPPED:\n    default:\n        return QL_PLAYBACK_STATE_STOPPED;\n\n    case QL_PLAYBACK_STATE_RUNNING:\n    case QL_PLAYBACK_STATE_ACTION_END:\n        return QL_PLAYBACK_STATE_RUNNING;\n\n    case QL_PLAYBACK_STATE_RECORDING:\n    case QL_PLAYBACK_STATE_RECORDING_NO_DELAY:\n        return QL_PLAYBACK_STATE_RECORDING;\n    }\n}\n\nstatic bool8 RecordHeadAtEndOfEntryOrScriptContext2Enabled(void)\n{\n    if (gQuestLogCurActionIdx >= sMaxActionsInScene || ArePlayerFieldControlsLocked() == TRUE)\n        return TRUE;\n    return FALSE;\n}\n\nstatic bool8 RecordHeadAtEndOfEntry(void)\n{\n    if (gQuestLogCurActionIdx >= sMaxActionsInScene)\n        return TRUE;\n    return FALSE;\n}\n\nstatic const struct FlagOrVarRecord sDummyFlagOrVarRecord = {\n    .idx = 0,\n    .isFlag = FALSE,\n    .value = 0x7FFF\n};\n\nvoid *QuestLogGetFlagOrVarPtr(bool8 isFlag, u16 idx)\n{\n    void *response;\n    if (gQuestLogCurActionIdx == 0)\n        return NULL;\n    if (gQuestLogCurActionIdx >= sMaxActionsInScene)\n        return NULL;\n    if (sFlagOrVarPlayhead >= sNumFlagsOrVars)\n        return NULL;\n    if (sFlagOrVarRecords[sFlagOrVarPlayhead].idx == idx && sFlagOrVarRecords[sFlagOrVarPlayhead].isFlag == isFlag)\n    {\n        response = &sFlagOrVarRecords[sFlagOrVarPlayhead].value;\n        sFlagOrVarPlayhead++;\n    }\n    else\n        response = NULL;\n    return response;\n}\n\nvoid QuestLogSetFlagOrVar(bool8 isFlag, u16 idx, u16 value)\n{\n    if (gQuestLogCurActionIdx == 0)\n        return;\n    if (gQuestLogCurActionIdx >= sMaxActionsInScene)\n        return;\n    if (sFlagOrVarPlayhead >= sNumFlagsOrVars)\n        return;\n    sFlagOrVarRecords[sFlagOrVarPlayhead].idx = idx;\n    sFlagOrVarRecords[sFlagOrVarPlayhead].isFlag = isFlag;\n    sFlagOrVarRecords[sFlagOrVarPlayhead].value = value;\n    sFlagOrVarPlayhead++;\n}\n\n// Unused\nstatic void QuestLogResetFlagsOrVars(u8 state, struct FlagOrVarRecord * records, u16 size)\n{\n    s32 i;\n\n    if (state == 0 || state > QL_STATE_PLAYBACK)\n    {\n        gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;\n    }\n    else\n    {\n        sFlagOrVarRecords = records;\n        sNumFlagsOrVars = size / 4;\n        sFlagOrVarPlayhead = 0;\n        if (state == QL_STATE_PLAYBACK)\n        {\n            for (i = 0; i < sMaxActionsInScene; i++)\n                sFlagOrVarRecords[i] = sDummyFlagOrVarRecord;\n        }\n    }\n}\n"
  },
  {
    "path": "src/quest_log_battle.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"battle_anim.h\"\n#include \"event_data.h\"\n#include \"link.h\"\n#include \"overworld.h\"\n#include \"quest_log.h\"\n#include \"constants/trainers.h\"\n\nstatic void GetLinkMultiBattlePlayerIndexes(s32 *, s32 *);\n\nvoid TrySetQuestLogBattleEvent(void)\n{\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_POKEDUDE)) && (gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT))\n    {\n        // Why allocate both of these? Only one will ever be used at a time\n        struct QuestLogEvent_TrainerBattle * trainerData = Alloc(sizeof(*trainerData));\n        struct QuestLogEvent_WildBattle * wildData = Alloc(sizeof(*wildData));\n        u16 eventId;\n        u16 playerEndingHP;\n        u16 playerMaxHP;\n\n        if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n        {\n            switch (sTrainers[gTrainerBattleOpponent_A].trainerClass)\n            {\n            case TRAINER_CLASS_LEADER:\n                eventId = QL_EVENT_DEFEATED_GYM_LEADER;\n                break;\n            case TRAINER_CLASS_CHAMPION:\n                eventId = QL_EVENT_DEFEATED_CHAMPION;\n                break;\n            case TRAINER_CLASS_ELITE_FOUR:\n                eventId = QL_EVENT_DEFEATED_E4_MEMBER;\n                break;\n            default:\n                eventId = QL_EVENT_DEFEATED_TRAINER;\n                break;\n            }\n            trainerData->trainerId = gTrainerBattleOpponent_A;\n            if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n            {\n                trainerData->speciesOpponent = gBattleResults.lastOpponentSpecies;\n                \n                // Decide which of the pokemon on the player's side to mention as the victor\n                if (GetBattlerSide(gBattleStruct->lastAttackerToFaintOpponent) == B_SIDE_PLAYER)\n                    trainerData->speciesPlayer = gBattleMons[gBattleStruct->lastAttackerToFaintOpponent].species;\n                else if (gBattleMons[GetBattlerAtPosition(0)].hp != 0)\n                    trainerData->speciesPlayer = gBattleMons[GetBattlerAtPosition(0)].species;\n                else\n                    trainerData->speciesPlayer = gBattleMons[GetBattlerAtPosition(2)].species;\n\n                playerEndingHP = gBattleMons[GetBattlerAtPosition(0)].hp + gBattleMons[GetBattlerAtPosition(2)].hp;\n                playerMaxHP = gBattleMons[GetBattlerAtPosition(0)].maxHP + gBattleMons[GetBattlerAtPosition(2)].maxHP;\n            }\n            else\n            {\n                trainerData->speciesOpponent = gBattleResults.lastOpponentSpecies;\n                trainerData->speciesPlayer = gBattleMons[GetBattlerAtPosition(0)].species;\n                playerEndingHP = gBattleMons[GetBattlerAtPosition(0)].hp;\n                playerMaxHP = gBattleMons[GetBattlerAtPosition(0)].maxHP;\n            }\n            trainerData->mapSec = GetCurrentRegionMapSectionId();\n\n            // Calculate fractional HP loss (determines flavor text, e.g. \"handily\" vs \"somehow\" defeated trainer)\n            trainerData->hpFractionId = 0;\n            if (playerEndingHP < playerMaxHP / 3 * 2)\n                trainerData->hpFractionId++;\n            if (playerEndingHP < playerMaxHP / 3)\n                trainerData->hpFractionId++;\n\n            SetQuestLogEvent(eventId, (const u16 *)trainerData);\n        }\n        else\n        {\n            if (gBattleOutcome == B_OUTCOME_WON)\n            {\n                wildData->defeatedSpecies = GetMonData(gEnemyParty, MON_DATA_SPECIES);\n                wildData->caughtSpecies = SPECIES_NONE;\n            }\n            else // gBattleOutcome == B_OUTCOME_CAUGHT\n            {\n                wildData->defeatedSpecies = SPECIES_NONE;\n                wildData->caughtSpecies = GetMonData(gEnemyParty, MON_DATA_SPECIES);\n            }\n            wildData->mapSec = GetCurrentRegionMapSectionId();\n            SetQuestLogEvent(QL_EVENT_DEFEATED_WILD_MON, (const u16 *)wildData);\n        }\n        Free(trainerData);\n        Free(wildData);\n    }\n}\n\nvoid TrySetQuestLogLinkBattleEvent(void)\n{\n    s32 partnerIdx;\n    s32 opponentIdxs[2];\n    u16 eventId;\n    s32 i;\n    bool32 inUnionRoom;\n\n    if (gBattleTypeFlags & BATTLE_TYPE_LINK)\n    {\n        struct QuestLogEvent_LinkBattle * data = Alloc(sizeof(*data));\n        data->outcome = gBattleOutcome - 1; // 0 = won, 1 = lost, 2 = drew\n        if (gBattleTypeFlags & BATTLE_TYPE_MULTI)\n        {\n            eventId = QL_EVENT_LINK_BATTLED_MULTI;\n            GetLinkMultiBattlePlayerIndexes(&partnerIdx, opponentIdxs);\n            for (i = 0; i < PLAYER_NAME_LENGTH; i++)\n            {\n                data->playerNames[0][i] = gLinkPlayers[partnerIdx].name[i];\n                data->playerNames[1][i] = gLinkPlayers[opponentIdxs[0]].name[i];\n                data->playerNames[2][i] = gLinkPlayers[opponentIdxs[1]].name[i];\n            }\n        }\n        else\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n                eventId = QL_EVENT_LINK_BATTLED_DOUBLE;\n            else\n            {\n                inUnionRoom = InUnionRoom();\n                eventId = QL_EVENT_LINK_BATTLED_SINGLE;\n                \n                if (inUnionRoom == TRUE)\n                    eventId = QL_EVENT_LINK_BATTLED_UNION;\n            }\n\n            for (i = 0; i < PLAYER_NAME_LENGTH; i++)\n                data->playerNames[0][i] = gLinkPlayers[gBattleStruct->multiplayerId ^ 1].name[i];\n        }\n        SetQuestLogEvent(eventId, (const u16 *)data);\n        Free(data);\n    }\n}\n\nstatic void GetLinkMultiBattlePlayerIndexes(s32 * partnerIdx, s32 * opponentIdxs)\n{\n    s32 i;\n    s32 numOpponentsFound = 0;\n    u8 partnerId = gLinkPlayers[gBattleStruct->multiplayerId].id ^ 2;\n    for (i = 0; i < MAX_BATTLERS_COUNT; i++)\n    {\n        if (partnerId == gLinkPlayers[i].id)\n            *partnerIdx = i;\n        else if (i != gBattleStruct->multiplayerId)\n            opponentIdxs[numOpponentsFound++] = i;\n    }\n}\n"
  },
  {
    "path": "src/quest_log_events.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"data.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"event_data.h\"\n#include \"event_scripts.h\"\n#include \"menu_helpers.h\"\n#include \"item.h\"\n#include \"link.h\"\n#include \"quest_log.h\"\n#include \"party_menu.h\"\n#include \"pokemon_storage_system.h\"\n#include \"region_map.h\"\n#include \"strings.h\"\n#include \"constants/maps.h\"\n#include \"constants/trainers.h\"\n#include \"constants/items.h\"\n#include \"constants/region_map_sections.h\"\n\nenum {\n    STEP_RECORDING_MODE_ENABLED,\n    STEP_RECORDING_MODE_DISABLED,\n    STEP_RECORDING_MODE_DISABLED_UNTIL_DEPART,\n};\n\nstruct DeferredLinkEvent\n{\n    u16 id;\n    u16 ALIGNED(4) data[14];\n};\n\n#define CMD_HEADER_SIZE 4\n#define MAX_CMD_REPEAT  4\n\nstatic EWRAM_DATA struct DeferredLinkEvent sDeferredEvent = {0};\nEWRAM_DATA struct QuestLogRepeatEventTracker gQuestLogRepeatEventTracker = {0};\nstatic EWRAM_DATA u8 sStepRecordingMode = 0;\nstatic EWRAM_DATA bool8 sNewlyEnteredMap = FALSE;\nstatic EWRAM_DATA u8 sLastDepartedLocation = 0;\nstatic EWRAM_DATA bool8 sPlayedTheSlots = FALSE;\n\nstatic bool8 InQuestLogDisabledLocation(void);\nstatic bool8 ShouldRegisterEvent_HandlePartyActions(u16, const u16 *);\nstatic bool8 ShouldRegisterEvent_HandleBeatStoryTrainer(u16, const u16 *);\nstatic u16 *ShouldRegisterEvent(u16, const u16 *);\nstatic bool8 TryDeferLinkEvent(u16, const u16 *);\nstatic bool8 TryDeferTrainerBattleEvent(u16, const u16 *);\nstatic bool8 IsEventWithSpecialEncounterSpecies(u16, const u16 *);\nstatic void UpdateRepeatEventCounter(u16);\nstatic u16 *QL_RecordAction_Wait(u16 *, u16);\nstatic u16 *RecordEvent_SwitchedPartyOrder(u16 *, const struct QuestLogEvent_SwitchedPartyOrder *);\nstatic u16 *RecordEvent_UsedItem(u16 *, const struct QuestLogEvent_Item *);\nstatic u16 *RecordEvent_GaveHeldItemFromPartyMenu(u16 *, const struct QuestLogEvent_Item *);\nstatic u16 *RecordEvent_GaveHeldItemFromBagMenu(u16 *, const struct QuestLogEvent_Item *);\nstatic u16 *RecordEvent_GaveHeldItemFromPC(u16 *, const struct QuestLogEvent_Item *);\nstatic u16 *RecordEvent_TookHeldItem(u16 *, const struct QuestLogEvent_Item *);\nstatic u16 *RecordEvent_SwappedHeldItemFromBag(u16 *, const struct QuestLogEvent_SwappedHeldItem *);\nstatic u16 *RecordEvent_SwappedHeldItemFromPC(u16 *, const struct QuestLogEvent_SwappedHeldItem *);\nstatic u16 *RecordEvent_UsedPkmnCenter(u16 *, const u16 *);\nstatic u16 *RecordEvent_LinkTraded(u16 *, const struct QuestLogEvent_Traded *);\nstatic u16 *RecordEvent_LinkBattledSingle(u16 *, const struct QuestLogEvent_LinkBattle *);\nstatic u16 *RecordEvent_LinkBattledDouble(u16 *, const struct QuestLogEvent_LinkBattle *);\nstatic u16 *RecordEvent_LinkBattledMulti(u16 *, const struct QuestLogEvent_LinkBattle *);\nstatic u16 *RecordEvent_UsedUnionRoom(u16 *, const u16 *);\nstatic u16 *RecordEvent_UsedUnionRoomChat(u16 *, const u16 *);\nstatic u16 *RecordEvent_LinkTradedUnionRoom(u16 *, const struct QuestLogEvent_Traded *);\nstatic u16 *RecordEvent_LinkBattledUnionRoom(u16 *, const struct QuestLogEvent_LinkBattle *);\nstatic u16 *RecordEvent_SwitchedMonsBetweenBoxes(u16 *, const struct QuestLogEvent_MovedBoxMon *);\nstatic u16 *RecordEvent_SwitchedMonsWithinBox(u16 *, const u16 *);\nstatic u16 *RecordEvent_SwitchedPartyMonForPCMon(u16 *, const u16 *);\nstatic u16 *RecordEvent_MovedMonBetweenBoxes(u16 *, const u16 *);\nstatic u16 *RecordEvent_MovedMonWithinBox(u16 *, const u16 *);\nstatic u16 *RecordEvent_WithdrewMonFromPC(u16 *, const u16 *);\nstatic u16 *RecordEvent_DepositedMonInPC(u16 *, const u16 *);\nstatic u16 *RecordEvent_SwitchedMultipleMons(u16 *, const u16 *);\nstatic u16 *RecordEvent_DepositedItemInPC(u16 *, const struct QuestLogEvent_Item *);\nstatic u16 *RecordEvent_WithdrewItemFromPC(u16 *, const struct QuestLogEvent_Item *);\nstatic u16 *RecordEvent_DefeatedGymLeader(u16 *, const struct QuestLogEvent_TrainerBattle *);\nstatic u16 *RecordEvent_DefeatedWildMon(u16 *, const struct QuestLogEvent_WildBattle *);\nstatic u16 *RecordEvent_DefeatedEliteFourMember(u16 *, const struct QuestLogEvent_TrainerBattle *);\nstatic u16 *RecordEvent_DefeatedChampion(u16 *, const struct QuestLogEvent_TrainerBattle *);\nstatic u16 *RecordEvent_DefeatedNormalTrainer(u16 *, const struct QuestLogEvent_TrainerBattle *);\nstatic u16 *RecordEvent_DepartedLocation(u16 *, const struct QuestLogEvent_Departed *);\nstatic u16 *RecordEvent_UsedFieldMove(u16 *, const struct QuestLogEvent_FieldMove *);\nstatic u16 *RecordEvent_BoughtItem(u16 *, const struct QuestLogEvent_Shop *);\nstatic u16 *RecordEvent_SoldItem(u16 *, const struct QuestLogEvent_Shop *);\nstatic u16 *RecordEvent_ObtainedStoryItem(u16 *, const struct QuestLogEvent_StoryItem *);\nstatic u16 *RecordEvent_ArrivedInLocation(u16 *, const u16 *);\nstatic const u16 *LoadEvent_SwitchedPartyOrder(const u16 *);\nstatic const u16 *LoadEvent_UsedItem(const u16 *);\nstatic const u16 *LoadEvent_GaveHeldItemFromPartyMenu(const u16 *);\nstatic const u16 *LoadEvent_GaveHeldItemFromBagMenu(const u16 *);\nstatic const u16 *LoadEvent_GaveHeldItemFromPC(const u16 *);\nstatic const u16 *LoadEvent_TookHeldItem(const u16 *);\nstatic const u16 *LoadEvent_SwappedHeldItem(const u16 *);\nstatic const u16 *LoadEvent_SwappedHeldItemFromPC(const u16 *);\nstatic const u16 *LoadEvent_UsedPkmnCenter(const u16 *);\nstatic const u16 *LoadEvent_LinkTraded(const u16 *);\nstatic const u16 *LoadEvent_LinkBattledSingle(const u16 *);\nstatic const u16 *LoadEvent_LinkBattledDouble(const u16 *);\nstatic const u16 *LoadEvent_LinkBattledMulti(const u16 *);\nstatic const u16 *LoadEvent_UsedUnionRoom(const u16 *);\nstatic const u16 *LoadEvent_UsedUnionRoomChat(const u16 *);\nstatic const u16 *LoadEvent_LinkTradedUnionRoom(const u16 *);\nstatic const u16 *LoadEvent_LinkBattledUnionRoom(const u16 *);\nstatic const u16 *LoadEvent_SwitchedMonsBetweenBoxes(const u16 *);\nstatic const u16 *LoadEvent_SwitchedMonsWithinBox(const u16 *);\nstatic const u16 *LoadEvent_SwitchedPartyMonForPCMon(const u16 *);\nstatic const u16 *LoadEvent_MovedMonBetweenBoxes(const u16 *);\nstatic const u16 *LoadEvent_MovedMonWithinBox(const u16 *);\nstatic const u16 *LoadEvent_WithdrewMonFromPC(const u16 *);\nstatic const u16 *LoadEvent_DepositedMonInPC(const u16 *);\nstatic const u16 *LoadEvent_SwitchedMultipleMons(const u16 *);\nstatic const u16 *LoadEvent_DepositedItemInPC(const u16 *);\nstatic const u16 *LoadEvent_WithdrewItemFromPC(const u16 *);\nstatic const u16 *LoadEvent_DefeatedGymLeader(const u16 *);\nstatic const u16 *LoadEvent_DefeatedWildMon(const u16 *);\nstatic const u16 *LoadEvent_DefeatedEliteFourMember(const u16 *);\nstatic const u16 *LoadEvent_DefeatedChampion(const u16 *);\nstatic const u16 *LoadEvent_DefeatedTrainer(const u16 *);\nstatic const u16 *LoadEvent_DepartedLocation(const u16 *);\nstatic const u16 *LoadEvent_UsedFieldMove(const u16 *);\nstatic const u16 *LoadEvent_BoughtItem(const u16 *);\nstatic const u16 *LoadEvent_SoldItem(const u16 *);\nstatic const u16 *LoadEvent_ObtainedStoryItem(const u16 *);\nstatic const u16 *LoadEvent_ArrivedInLocation(const u16 *);\nstatic bool8 IsSpeciesFromSpecialEncounter(u16);\nstatic bool8 ShouldRegisterEvent_HandleDeparted(u16, const u16 *);\nstatic bool8 ShouldRegisterEvent_DepartedGameCorner(u16, const u16 *);\nstatic void TranslateLinkPartnersName(u8 *);\n\ntypedef u16 *(*RecordEventFunc)(u16 *, const u16 *);\n\nstatic const RecordEventFunc sRecordEventFuncs[] = {\n    [QL_EVENT_INPUT]                         = NULL,\n    [QL_EVENT_GFX_CHANGE]                    = NULL,\n    [QL_EVENT_MOVEMENT]                      = NULL,\n    [QL_EVENT_SWITCHED_PARTY_ORDER]          = (RecordEventFunc) RecordEvent_SwitchedPartyOrder,\n    [QL_EVENT_USED_ITEM]                     = (RecordEventFunc) RecordEvent_UsedItem,\n    [QL_EVENT_GAVE_HELD_ITEM]                = (RecordEventFunc) RecordEvent_GaveHeldItemFromPartyMenu,\n    [QL_EVENT_GAVE_HELD_ITEM_BAG]            = (RecordEventFunc) RecordEvent_GaveHeldItemFromBagMenu,\n    [QL_EVENT_GAVE_HELD_ITEM_PC]             = (RecordEventFunc) RecordEvent_GaveHeldItemFromPC,\n    [QL_EVENT_TOOK_HELD_ITEM]                = (RecordEventFunc) RecordEvent_TookHeldItem,\n    [QL_EVENT_SWAPPED_HELD_ITEM]             = (RecordEventFunc) RecordEvent_SwappedHeldItemFromBag,\n    [QL_EVENT_SWAPPED_HELD_ITEM_PC]          = (RecordEventFunc) RecordEvent_SwappedHeldItemFromPC,\n    [QL_EVENT_USED_PKMN_CENTER]              = (RecordEventFunc) RecordEvent_UsedPkmnCenter,\n    [QL_EVENT_LINK_TRADED]                   = (RecordEventFunc) RecordEvent_LinkTraded,\n    [QL_EVENT_LINK_BATTLED_SINGLE]           = (RecordEventFunc) RecordEvent_LinkBattledSingle,\n    [QL_EVENT_LINK_BATTLED_DOUBLE]           = (RecordEventFunc) RecordEvent_LinkBattledDouble,\n    [QL_EVENT_LINK_BATTLED_MULTI]            = (RecordEventFunc) RecordEvent_LinkBattledMulti,\n    [QL_EVENT_USED_UNION_ROOM]               = (RecordEventFunc) RecordEvent_UsedUnionRoom,\n    [QL_EVENT_USED_UNION_ROOM_CHAT]          = (RecordEventFunc) RecordEvent_UsedUnionRoomChat,\n    [QL_EVENT_LINK_TRADED_UNION]             = (RecordEventFunc) RecordEvent_LinkTradedUnionRoom,\n    [QL_EVENT_LINK_BATTLED_UNION]            = (RecordEventFunc) RecordEvent_LinkBattledUnionRoom,\n    [QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES]   = (RecordEventFunc) RecordEvent_SwitchedMonsBetweenBoxes,\n    [QL_EVENT_SWITCHED_MONS_WITHIN_BOX]      = (RecordEventFunc) RecordEvent_SwitchedMonsWithinBox,\n    [QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON] = (RecordEventFunc) RecordEvent_SwitchedPartyMonForPCMon,\n    [QL_EVENT_MOVED_MON_BETWEEN_BOXES]       = (RecordEventFunc) RecordEvent_MovedMonBetweenBoxes,\n    [QL_EVENT_MOVED_MON_WITHIN_BOX]          = (RecordEventFunc) RecordEvent_MovedMonWithinBox,\n    [QL_EVENT_WITHDREW_MON_PC]               = (RecordEventFunc) RecordEvent_WithdrewMonFromPC,\n    [QL_EVENT_DEPOSITED_MON_PC]              = (RecordEventFunc) RecordEvent_DepositedMonInPC,\n    [QL_EVENT_SWITCHED_MULTIPLE_MONS]        = (RecordEventFunc) RecordEvent_SwitchedMultipleMons,\n    [QL_EVENT_DEPOSITED_ITEM_PC]             = (RecordEventFunc) RecordEvent_DepositedItemInPC,\n    [QL_EVENT_WITHDREW_ITEM_PC]              = (RecordEventFunc) RecordEvent_WithdrewItemFromPC,\n    [QL_EVENT_DEFEATED_GYM_LEADER]           = (RecordEventFunc) RecordEvent_DefeatedGymLeader,\n    [QL_EVENT_DEFEATED_WILD_MON]             = (RecordEventFunc) RecordEvent_DefeatedWildMon,\n    [QL_EVENT_DEFEATED_E4_MEMBER]            = (RecordEventFunc) RecordEvent_DefeatedEliteFourMember,\n    [QL_EVENT_DEFEATED_CHAMPION]             = (RecordEventFunc) RecordEvent_DefeatedChampion,\n    [QL_EVENT_DEFEATED_TRAINER]              = (RecordEventFunc) RecordEvent_DefeatedNormalTrainer,\n    [QL_EVENT_DEPARTED]                      = (RecordEventFunc) RecordEvent_DepartedLocation,\n    [QL_EVENT_USED_FIELD_MOVE]               = (RecordEventFunc) RecordEvent_UsedFieldMove,\n    [QL_EVENT_BOUGHT_ITEM]                   = (RecordEventFunc) RecordEvent_BoughtItem,\n    [QL_EVENT_SOLD_ITEM]                     = (RecordEventFunc) RecordEvent_SoldItem,\n    [QL_EVENT_SCENE_END]                     = NULL,\n    [QL_EVENT_OBTAINED_STORY_ITEM]           = (RecordEventFunc) RecordEvent_ObtainedStoryItem,\n    [QL_EVENT_WAIT]                          = NULL,\n    [QL_EVENT_ARRIVED]                       = (RecordEventFunc) RecordEvent_ArrivedInLocation\n};\n\nstatic const u16 *(*const sLoadEventFuncs[])(const u16 *) = {\n    [QL_EVENT_INPUT]                         = NULL,\n    [QL_EVENT_GFX_CHANGE]                    = NULL,\n    [QL_EVENT_MOVEMENT]                      = NULL,\n    [QL_EVENT_SWITCHED_PARTY_ORDER]          = LoadEvent_SwitchedPartyOrder,\n    [QL_EVENT_USED_ITEM]                     = LoadEvent_UsedItem,\n    [QL_EVENT_GAVE_HELD_ITEM]                = LoadEvent_GaveHeldItemFromPartyMenu,\n    [QL_EVENT_GAVE_HELD_ITEM_BAG]            = LoadEvent_GaveHeldItemFromBagMenu,\n    [QL_EVENT_GAVE_HELD_ITEM_PC]             = LoadEvent_GaveHeldItemFromPC,\n    [QL_EVENT_TOOK_HELD_ITEM]                = LoadEvent_TookHeldItem,\n    [QL_EVENT_SWAPPED_HELD_ITEM]             = LoadEvent_SwappedHeldItem,\n    [QL_EVENT_SWAPPED_HELD_ITEM_PC]          = LoadEvent_SwappedHeldItemFromPC,\n    [QL_EVENT_USED_PKMN_CENTER]              = LoadEvent_UsedPkmnCenter,\n    [QL_EVENT_LINK_TRADED]                   = LoadEvent_LinkTraded,\n    [QL_EVENT_LINK_BATTLED_SINGLE]           = LoadEvent_LinkBattledSingle,\n    [QL_EVENT_LINK_BATTLED_DOUBLE]           = LoadEvent_LinkBattledDouble,\n    [QL_EVENT_LINK_BATTLED_MULTI]            = LoadEvent_LinkBattledMulti,\n    [QL_EVENT_USED_UNION_ROOM]               = LoadEvent_UsedUnionRoom,\n    [QL_EVENT_USED_UNION_ROOM_CHAT]          = LoadEvent_UsedUnionRoomChat,\n    [QL_EVENT_LINK_TRADED_UNION]             = LoadEvent_LinkTradedUnionRoom,\n    [QL_EVENT_LINK_BATTLED_UNION]            = LoadEvent_LinkBattledUnionRoom,\n    [QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES]   = LoadEvent_SwitchedMonsBetweenBoxes,\n    [QL_EVENT_SWITCHED_MONS_WITHIN_BOX]      = LoadEvent_SwitchedMonsWithinBox,\n    [QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON] = LoadEvent_SwitchedPartyMonForPCMon,\n    [QL_EVENT_MOVED_MON_BETWEEN_BOXES]       = LoadEvent_MovedMonBetweenBoxes,\n    [QL_EVENT_MOVED_MON_WITHIN_BOX]          = LoadEvent_MovedMonWithinBox,\n    [QL_EVENT_WITHDREW_MON_PC]               = LoadEvent_WithdrewMonFromPC,\n    [QL_EVENT_DEPOSITED_MON_PC]              = LoadEvent_DepositedMonInPC,\n    [QL_EVENT_SWITCHED_MULTIPLE_MONS]        = LoadEvent_SwitchedMultipleMons,\n    [QL_EVENT_DEPOSITED_ITEM_PC]             = LoadEvent_DepositedItemInPC,\n    [QL_EVENT_WITHDREW_ITEM_PC]              = LoadEvent_WithdrewItemFromPC,\n    [QL_EVENT_DEFEATED_GYM_LEADER]           = LoadEvent_DefeatedGymLeader,\n    [QL_EVENT_DEFEATED_WILD_MON]             = LoadEvent_DefeatedWildMon,\n    [QL_EVENT_DEFEATED_E4_MEMBER]            = LoadEvent_DefeatedEliteFourMember,\n    [QL_EVENT_DEFEATED_CHAMPION]             = LoadEvent_DefeatedChampion,\n    [QL_EVENT_DEFEATED_TRAINER]              = LoadEvent_DefeatedTrainer,\n    [QL_EVENT_DEPARTED]                      = LoadEvent_DepartedLocation,\n    [QL_EVENT_USED_FIELD_MOVE]               = LoadEvent_UsedFieldMove,\n    [QL_EVENT_BOUGHT_ITEM]                   = LoadEvent_BoughtItem,\n    [QL_EVENT_SOLD_ITEM]                     = LoadEvent_SoldItem,\n    [QL_EVENT_SCENE_END]                     = NULL,\n    [QL_EVENT_OBTAINED_STORY_ITEM]           = LoadEvent_ObtainedStoryItem,\n    [QL_EVENT_WAIT]                          = NULL,\n    [QL_EVENT_ARRIVED]                       = LoadEvent_ArrivedInLocation\n};\n\nstatic const u8 sQuestLogEventCmdSizes[] = {\n    [QL_EVENT_INPUT]                         = 8,\n    [QL_EVENT_GFX_CHANGE]                    = 8,\n    [QL_EVENT_MOVEMENT]                      = 8,\n    [QL_EVENT_SWITCHED_PARTY_ORDER]          = CMD_HEADER_SIZE + 4,\n    [QL_EVENT_USED_ITEM]                     = CMD_HEADER_SIZE + 6,\n    [QL_EVENT_GAVE_HELD_ITEM]                = CMD_HEADER_SIZE + 4,\n    [QL_EVENT_GAVE_HELD_ITEM_BAG]            = CMD_HEADER_SIZE + 4,\n    [QL_EVENT_GAVE_HELD_ITEM_PC]             = CMD_HEADER_SIZE + 4,\n    [QL_EVENT_TOOK_HELD_ITEM]                = CMD_HEADER_SIZE + 4,\n    [QL_EVENT_SWAPPED_HELD_ITEM]             = CMD_HEADER_SIZE + 6,\n    [QL_EVENT_SWAPPED_HELD_ITEM_PC]          = CMD_HEADER_SIZE + 6,\n    [QL_EVENT_USED_PKMN_CENTER]              = CMD_HEADER_SIZE + 0,\n    [QL_EVENT_LINK_TRADED]                   = CMD_HEADER_SIZE + 12,\n    [QL_EVENT_LINK_BATTLED_SINGLE]           = CMD_HEADER_SIZE + 8,\n    [QL_EVENT_LINK_BATTLED_DOUBLE]           = CMD_HEADER_SIZE + 8,\n    [QL_EVENT_LINK_BATTLED_MULTI]            = CMD_HEADER_SIZE + 22,\n    [QL_EVENT_USED_UNION_ROOM]               = CMD_HEADER_SIZE + 0,\n    [QL_EVENT_USED_UNION_ROOM_CHAT]          = CMD_HEADER_SIZE + 0,\n    [QL_EVENT_LINK_TRADED_UNION]             = CMD_HEADER_SIZE + 12,\n    [QL_EVENT_LINK_BATTLED_UNION]            = CMD_HEADER_SIZE + 8,\n    [QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES]   = CMD_HEADER_SIZE + 6,\n    [QL_EVENT_SWITCHED_MONS_WITHIN_BOX]      = CMD_HEADER_SIZE + 6,\n    [QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON] = CMD_HEADER_SIZE + 6,\n    [QL_EVENT_MOVED_MON_BETWEEN_BOXES]       = CMD_HEADER_SIZE + 4,\n    [QL_EVENT_MOVED_MON_WITHIN_BOX]          = CMD_HEADER_SIZE + 4,\n    [QL_EVENT_WITHDREW_MON_PC]               = CMD_HEADER_SIZE + 4,\n    [QL_EVENT_DEPOSITED_MON_PC]              = CMD_HEADER_SIZE + 4,\n    [QL_EVENT_SWITCHED_MULTIPLE_MONS]        = CMD_HEADER_SIZE + 2,\n    [QL_EVENT_DEPOSITED_ITEM_PC]             = CMD_HEADER_SIZE + 2,\n    [QL_EVENT_WITHDREW_ITEM_PC]              = CMD_HEADER_SIZE + 2,\n    [QL_EVENT_DEFEATED_GYM_LEADER]           = CMD_HEADER_SIZE + 8,\n    [QL_EVENT_DEFEATED_WILD_MON]             = CMD_HEADER_SIZE + 8,\n    [QL_EVENT_DEFEATED_E4_MEMBER]            = CMD_HEADER_SIZE + 8,\n    [QL_EVENT_DEFEATED_CHAMPION]             = CMD_HEADER_SIZE + 6,\n    [QL_EVENT_DEFEATED_TRAINER]              = CMD_HEADER_SIZE + 8,\n    [QL_EVENT_DEPARTED]                      = CMD_HEADER_SIZE + 2,\n    [QL_EVENT_USED_FIELD_MOVE]               = CMD_HEADER_SIZE + 4,\n    [QL_EVENT_BOUGHT_ITEM]                   = CMD_HEADER_SIZE + 10,\n    [QL_EVENT_SOLD_ITEM]                     = CMD_HEADER_SIZE + 10,\n    [QL_EVENT_SCENE_END]                     = 2,\n    [QL_EVENT_OBTAINED_STORY_ITEM]           = CMD_HEADER_SIZE + 4,\n    [QL_EVENT_WAIT]                          = 4,\n    [QL_EVENT_ARRIVED]                       = CMD_HEADER_SIZE + 2\n};\n\nstatic const u8 *const sDefeatedOpponentFlavorTexts[] = {\n    gText_QuestLog_Handily,\n    gText_QuestLog_Tenaciously,\n    gText_QuestLog_Somehow\n};\n\nstatic const u8 *const sDefeatedChampionFlavorTexts[] = {\n    gText_QuestLog_Coolly,\n    gText_QuestLog_Somehow,\n    gText_QuestLog_Barely\n};\n\nstatic const u8 *const sBattleOutcomeTexts[] = {\n    [B_OUTCOME_WON - 1]  = gText_QuestLog_Win,\n    [B_OUTCOME_LOST - 1] = gText_QuestLog_Loss,\n    [B_OUTCOME_DREW - 1] = gText_QuestLog_Draw,\n};\n\nstatic const u8 *const sLocationNameTexts[] =\n{\n    [QL_LOCATION_HOME]               = gText_QuestLog_Home,\n    [QL_LOCATION_OAKS_LAB]           = gText_QuestLog_OakResearchLab,\n    [QL_LOCATION_VIRIDIAN_GYM]       = gText_QuestLog_Gym,\n    [QL_LOCATION_LEAGUE_GATE_1]      = gText_QuestLog_PokemonLeagueGate,\n    [QL_LOCATION_LEAGUE_GATE_2]      = gText_QuestLog_PokemonLeagueGate,\n    [QL_LOCATION_VIRIDIAN_FOREST_1]  = gText_QuestLog_ViridianForest,\n    [QL_LOCATION_VIRIDIAN_FOREST_2]  = gText_QuestLog_ViridianForest,\n    [QL_LOCATION_PEWTER_MUSEUM]      = gText_QuestLog_PewterMuseumOfScience,\n    [QL_LOCATION_PEWTER_GYM]         = gText_QuestLog_Gym,\n    [QL_LOCATION_MT_MOON_1]          = gText_QuestLog_MtMoon,\n    [QL_LOCATION_MT_MOON_2]          = gText_QuestLog_MtMoon,\n    [QL_LOCATION_CERULEAN_GYM]       = gText_QuestLog_Gym,\n    [QL_LOCATION_BIKE_SHOP]          = gText_QuestLog_BikeShop,\n    [QL_LOCATION_BILLS_HOUSE]        = gText_QuestLog_BillsHouse,\n    [QL_LOCATION_DAY_CARE]           = gText_QuestLog_DayCare,\n    [QL_LOCATION_UNDERGROUND_PATH_1] = gText_QuestLog_UndergroundPath,\n    [QL_LOCATION_UNDERGROUND_PATH_2] = gText_QuestLog_UndergroundPath,\n    [QL_LOCATION_PKMN_FAN_CLUB]      = gText_QuestLog_PokemonFanClub,\n    [QL_LOCATION_VERMILION_GYM]      = gText_QuestLog_Gym,\n    [QL_LOCATION_SS_ANNE]            = gText_QuestLog_SSAnne,\n    [QL_LOCATION_DIGLETTS_CAVE_1]    = gText_QuestLog_DiglettsCave,\n    [QL_LOCATION_DIGLETTS_CAVE_2]    = gText_QuestLog_DiglettsCave,\n    [QL_LOCATION_ROCK_TUNNEL_1]      = gText_QuestLog_RockTunnel,\n    [QL_LOCATION_ROCK_TUNNEL_2]      = gText_QuestLog_RockTunnel,\n    [QL_LOCATION_POWER_PLANT]        = gText_QuestLog_PowerPlant,\n    [QL_LOCATION_PKMN_TOWER]         = gText_QuestLog_PokemonTower,\n    [QL_LOCATION_VOLUNTEER_HOUSE]    = gText_QuestLog_VolunteerHouse,\n    [QL_LOCATION_NAME_RATERS_HOUSE]  = gText_QuestLog_NameRatersHouse,\n    [QL_LOCATION_UNDERGROUND_PATH_3] = gText_QuestLog_UndergroundPath,\n    [QL_LOCATION_UNDERGROUND_PATH_4] = gText_QuestLog_UndergroundPath,\n    [QL_LOCATION_CELADON_DEPT_STORE] = gText_QuestLog_CeladonDeptStore,\n    [QL_LOCATION_CELADON_MANSION]    = gText_QuestLog_CeladonMansion,\n    [QL_LOCATION_GAME_CORNER]        = gText_QuestLog_RocketGameCorner,\n    [QL_LOCATION_CELADON_GYM]        = gText_QuestLog_Gym,\n    [QL_LOCATION_CELADON_RESTAURANT] = gText_QuestLog_Restaurant,\n    [QL_LOCATION_ROCKET_HIDEOUT]     = gText_QuestLog_RocketHideout,\n    [QL_LOCATION_SAFARI_ZONE]        = gText_QuestLog_SafariZone,\n    [QL_LOCATION_FUCHSIA_GYM]        = gText_QuestLog_Gym,\n    [QL_LOCATION_WARDENS_HOME]       = gText_QuestLog_WardensHome,\n    [QL_LOCATION_FIGHTING_DOJO]      = gText_QuestLog_FightingDojo,\n    [QL_LOCATION_SAFFRON_GYM]        = gText_QuestLog_Gym,\n    [QL_LOCATION_SILPH_CO]           = gText_QuestLog_SilphCo,\n    [QL_LOCATION_SEAFOAM_ISLANDS_1]  = gText_QuestLog_SeafoamIslands,\n    [QL_LOCATION_SEAFOAM_ISLANDS_2]  = gText_QuestLog_SeafoamIslands,\n    [QL_LOCATION_PKMN_MANSION]       = gText_QuestLog_PokemonMansion,\n    [QL_LOCATION_CINNABAR_GYM]       = gText_QuestLog_Gym,\n    [QL_LOCATION_CINNABAR_LAB]       = gText_QuestLog_PokemonResearchLab,\n    [QL_LOCATION_VICTORY_ROAD_1]     = gText_QuestLog_VictoryRoad,\n    [QL_LOCATION_VICTORY_ROAD_2]     = gText_QuestLog_VictoryRoad,\n    [QL_LOCATION_PKMN_LEAGUE]        = gText_QuestLog_PokemonLeague,\n    [QL_LOCATION_CERULEAN_CAVE]      = gText_QuestLog_CeruleanCave\n};\n\nstatic const u8 *const sDepartedLocationTexts[] =\n{\n    [QL_DEPARTED_TOWN_BUILDING]   = gText_QuestLog_DepartedPlaceInTownForNextDestination,\n    [QL_DEPARTED_MUSEUM]          = gText_QuestLog_LeftTownsLocationForNextDestination,\n    [QL_DEPARTED_GAME_CORNER]     = gText_QuestLog_PlayedGamesAtGameCorner,\n    [QL_DEPARTED_HOME]            = gText_QuestLog_RestedAtHome,\n    [QL_DEPARTED_OAKS_LAB]        = gText_QuestLog_LeftOaksLab,\n    [QL_DEPARTED_GYM]             = gText_QuestLog_GymWasFullOfToughTrainers,\n    [QL_DEPARTED_SAFARI_ZONE]     = gText_QuestLog_HadGreatTimeInSafariZone,\n    [QL_DEPARTED_CAVE]            = gText_QuestLog_ManagedToGetOutOfLocation,\n    [QL_DEPARTED_MISC_BUILDING_1] = gText_QuestLog_DepartedTheLocationForNextDestination,\n    [QL_DEPARTED_MISC_BUILDING_2] = gText_QuestLog_DepartedFromLocationToNextDestination\n};\n\nstatic const u8 sLocationToDepartedTextId[] =\n{\n    [QL_LOCATION_HOME]               = QL_DEPARTED_HOME,\n    [QL_LOCATION_OAKS_LAB]           = QL_DEPARTED_OAKS_LAB,\n    [QL_LOCATION_VIRIDIAN_GYM]       = QL_DEPARTED_GYM,\n    [QL_LOCATION_LEAGUE_GATE_1]      = QL_DEPARTED_MISC_BUILDING_1,\n    [QL_LOCATION_LEAGUE_GATE_2]      = QL_DEPARTED_MISC_BUILDING_1,\n    [QL_LOCATION_VIRIDIAN_FOREST_1]  = QL_DEPARTED_CAVE,\n    [QL_LOCATION_VIRIDIAN_FOREST_2]  = QL_DEPARTED_CAVE,\n    [QL_LOCATION_PEWTER_MUSEUM]      = QL_DEPARTED_MUSEUM,\n    [QL_LOCATION_PEWTER_GYM]         = QL_DEPARTED_GYM,\n    [QL_LOCATION_MT_MOON_1]          = QL_DEPARTED_CAVE,\n    [QL_LOCATION_MT_MOON_2]          = QL_DEPARTED_CAVE,\n    [QL_LOCATION_CERULEAN_GYM]       = QL_DEPARTED_GYM,\n    [QL_LOCATION_BIKE_SHOP]          = QL_DEPARTED_TOWN_BUILDING,\n    [QL_LOCATION_BILLS_HOUSE]        = QL_DEPARTED_TOWN_BUILDING,\n    [QL_LOCATION_DAY_CARE]           = QL_DEPARTED_TOWN_BUILDING,\n    [QL_LOCATION_UNDERGROUND_PATH_1] = QL_DEPARTED_MISC_BUILDING_1,\n    [QL_LOCATION_UNDERGROUND_PATH_2] = QL_DEPARTED_MISC_BUILDING_1,\n    [QL_LOCATION_PKMN_FAN_CLUB]      = QL_DEPARTED_TOWN_BUILDING,\n    [QL_LOCATION_VERMILION_GYM]      = QL_DEPARTED_GYM,\n    [QL_LOCATION_SS_ANNE]            = QL_DEPARTED_MISC_BUILDING_1,\n    [QL_LOCATION_DIGLETTS_CAVE_1]    = QL_DEPARTED_CAVE,\n    [QL_LOCATION_DIGLETTS_CAVE_2]    = QL_DEPARTED_CAVE,\n    [QL_LOCATION_ROCK_TUNNEL_1]      = QL_DEPARTED_CAVE,\n    [QL_LOCATION_ROCK_TUNNEL_2]      = QL_DEPARTED_CAVE,\n    [QL_LOCATION_POWER_PLANT]        = QL_DEPARTED_MISC_BUILDING_1,\n    [QL_LOCATION_PKMN_TOWER]         = QL_DEPARTED_MISC_BUILDING_1,\n    [QL_LOCATION_VOLUNTEER_HOUSE]    = QL_DEPARTED_TOWN_BUILDING,\n    [QL_LOCATION_NAME_RATERS_HOUSE]  = QL_DEPARTED_TOWN_BUILDING,\n    [QL_LOCATION_UNDERGROUND_PATH_3] = QL_DEPARTED_MISC_BUILDING_1,\n    [QL_LOCATION_UNDERGROUND_PATH_4] = QL_DEPARTED_MISC_BUILDING_1,\n    [QL_LOCATION_CELADON_DEPT_STORE] = QL_DEPARTED_TOWN_BUILDING,\n    [QL_LOCATION_CELADON_MANSION]    = QL_DEPARTED_TOWN_BUILDING,\n    [QL_LOCATION_GAME_CORNER]        = QL_DEPARTED_GAME_CORNER,\n    [QL_LOCATION_CELADON_GYM]        = QL_DEPARTED_GYM,\n    [QL_LOCATION_CELADON_RESTAURANT] = QL_DEPARTED_TOWN_BUILDING,\n    [QL_LOCATION_ROCKET_HIDEOUT]     = QL_DEPARTED_MISC_BUILDING_1,\n    [QL_LOCATION_SAFARI_ZONE]        = QL_DEPARTED_SAFARI_ZONE,\n    [QL_LOCATION_FUCHSIA_GYM]        = QL_DEPARTED_GYM,\n    [QL_LOCATION_WARDENS_HOME]       = QL_DEPARTED_TOWN_BUILDING,\n    [QL_LOCATION_FIGHTING_DOJO]      = QL_DEPARTED_TOWN_BUILDING,\n    [QL_LOCATION_SAFFRON_GYM]        = QL_DEPARTED_GYM,\n    [QL_LOCATION_SILPH_CO]           = QL_DEPARTED_MISC_BUILDING_2,\n    [QL_LOCATION_SEAFOAM_ISLANDS_1]  = QL_DEPARTED_CAVE,\n    [QL_LOCATION_SEAFOAM_ISLANDS_2]  = QL_DEPARTED_CAVE,\n    [QL_LOCATION_PKMN_MANSION]       = QL_DEPARTED_MISC_BUILDING_2,\n    [QL_LOCATION_CINNABAR_GYM]       = QL_DEPARTED_GYM,\n    [QL_LOCATION_CINNABAR_LAB]       = QL_DEPARTED_TOWN_BUILDING,\n    [QL_LOCATION_VICTORY_ROAD_1]     = QL_DEPARTED_CAVE,\n    [QL_LOCATION_VICTORY_ROAD_2]     = QL_DEPARTED_CAVE,\n    [QL_LOCATION_PKMN_LEAGUE]        = QL_DEPARTED_MISC_BUILDING_1,\n    [QL_LOCATION_CERULEAN_CAVE]      = QL_DEPARTED_CAVE\n};\n\nstatic const u8 sGymCityMapSecs[NUM_BADGES] = {\n    MAPSEC_PEWTER_CITY,\n    MAPSEC_CERULEAN_CITY,\n    MAPSEC_VERMILION_CITY,\n    MAPSEC_CELADON_CITY,\n    MAPSEC_FUCHSIA_CITY,\n    MAPSEC_SAFFRON_CITY,\n    MAPSEC_CINNABAR_ISLAND,\n    MAPSEC_VIRIDIAN_CITY,\n};\n\nstatic const u8 *const sUsedFieldMoveTexts[] =\n{\n    [FIELD_MOVE_FLASH]       = gText_QuestLog_UsedFlash,\n    [FIELD_MOVE_CUT]         = gText_QuestLog_UsedCut,\n    [FIELD_MOVE_FLY]         = gText_QuestLog_UsedFly,\n    [FIELD_MOVE_STRENGTH]    = gText_QuestLog_UsedStrength,\n    [FIELD_MOVE_SURF]        = gText_QuestLog_UsedSurf,\n    [FIELD_MOVE_ROCK_SMASH]  = gText_QuestLog_UsedRockSmash,\n    [FIELD_MOVE_WATERFALL]   = gText_QuestLog_UsedWaterfall,\n    [FIELD_MOVE_TELEPORT]    = gText_QuestLog_UsedTeleportToLocation,\n    [FIELD_MOVE_DIG]         = gText_QuestLog_UsedDigInLocation,\n    [FIELD_MOVE_MILK_DRINK]  = gText_QuestLog_UsedMilkDrink,\n    [FIELD_MOVE_SOFT_BOILED] = gText_QuestLog_UsedSoftboiled,\n    [FIELD_MOVE_SWEET_SCENT] = gText_QuestLog_UsedSweetScent\n};\n\nstatic const u16 sWorldMapFlags[] =\n{\n    FLAG_WORLD_MAP_VIRIDIAN_CITY,\n    FLAG_WORLD_MAP_PEWTER_CITY,\n    FLAG_WORLD_MAP_CERULEAN_CITY,\n    FLAG_WORLD_MAP_LAVENDER_TOWN,\n    FLAG_WORLD_MAP_VERMILION_CITY,\n    FLAG_WORLD_MAP_CELADON_CITY,\n    FLAG_WORLD_MAP_FUCHSIA_CITY,\n    FLAG_WORLD_MAP_CINNABAR_ISLAND,\n    FLAG_WORLD_MAP_INDIGO_PLATEAU_EXTERIOR,\n    FLAG_WORLD_MAP_SAFFRON_CITY,\n    FLAG_WORLD_MAP_ONE_ISLAND,\n    FLAG_WORLD_MAP_TWO_ISLAND,\n    FLAG_WORLD_MAP_THREE_ISLAND,\n    FLAG_WORLD_MAP_FOUR_ISLAND,\n    FLAG_WORLD_MAP_FIVE_ISLAND,\n    FLAG_WORLD_MAP_SEVEN_ISLAND,\n    FLAG_WORLD_MAP_SIX_ISLAND\n};\n\nvoid SetQuestLogEvent(u16 eventId, const u16 * data)\n{\n    u16 *r1;\n\n    if (eventId == QL_EVENT_DEPARTED && sStepRecordingMode == STEP_RECORDING_MODE_DISABLED_UNTIL_DEPART)\n    {\n        QL_EnableRecordingSteps();\n        return;\n    }\n    QL_EnableRecordingSteps();\n\n    if (gQuestLogState == QL_STATE_PLAYBACK)\n        return;\n\n    if (!IS_VALID_QL_EVENT(eventId))\n        return;\n\n    // Certain locations like Trainer Tower do not allow Quest Log events to be recorded\n    if (InQuestLogDisabledLocation() == TRUE)\n        return;\n\n    if (TryDeferLinkEvent(eventId, data) == TRUE)\n        return;\n\n    // Link events handled above. If we're in an active link, don't record any other events.\n    if (MenuHelpers_IsLinkActive() == TRUE || InUnionRoom() == TRUE)\n        return;\n\n    if (TryDeferTrainerBattleEvent(eventId, data) == TRUE)\n        return;\n\n    // Wild battles with static encounter species (Snorlax, Mewtwo, etc.) are not recorded.\n    if (IsEventWithSpecialEncounterSpecies(eventId, data) == TRUE)\n        return;\n\n    // If player departed Game Corner without using the slots, don't record it\n    if (ShouldRegisterEvent_DepartedGameCorner(eventId, data) == FALSE)\n        return;\n\n    if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_STOPPED)\n    {\n        if (ShouldRegisterEvent_HandlePartyActions(eventId, data) == TRUE)\n            return;\n\n        if (eventId != QL_EVENT_DEFEATED_WILD_MON || gQuestLogDefeatedWildMonRecord == NULL)\n        {\n            if (ShouldRegisterEvent_HandleDeparted(eventId, data) == FALSE)\n                return;\n            QL_StartRecordingAction(eventId);\n        }\n    }\n    else if (eventId == QL_EVENT_OBTAINED_STORY_ITEM)\n        return;\n\n    UpdateRepeatEventCounter(eventId);\n    if (eventId == QL_EVENT_DEFEATED_WILD_MON)\n    {\n        if (gQuestLogDefeatedWildMonRecord == NULL)\n        {\n            gQuestLogDefeatedWildMonRecord = gQuestLogRecordingPointer;\n            r1 = sRecordEventFuncs[eventId](gQuestLogDefeatedWildMonRecord, data);\n        }\n        else\n        {\n            sRecordEventFuncs[eventId](gQuestLogDefeatedWildMonRecord, data);\n            return;\n        }\n    }\n    else\n    {\n        gQuestLogDefeatedWildMonRecord = NULL;\n        r1 = sRecordEventFuncs[eventId](gQuestLogRecordingPointer, data);\n    }\n\n    if (r1 == NULL)\n    {\n        QL_FinishRecordingScene();\n        r1 = ShouldRegisterEvent(eventId, data);\n        if (!r1)\n            return;\n    }\n\n    gQuestLogRecordingPointer = r1;\n    if (sStepRecordingMode == STEP_RECORDING_MODE_ENABLED)\n        return;\n    QL_FinishRecordingScene();\n}\n\nstatic bool8 InQuestLogDisabledLocation(void)\n{\n    // In Trainer Tower\n    if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_1F)\n        && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_1F)\n         || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_2F)\n         || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_3F)\n         || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_4F)\n         || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_5F)\n         || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_6F)\n         || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_7F)\n         || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_8F)\n         || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ROOF)\n         || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_LOBBY)\n         || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ELEVATOR)))\n        return TRUE;\n\n    // In pokemon trainer fan club\n    if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB)\n      && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB))\n        return TRUE;\n\n    // In E-Reader house\n    if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_HOUSE_ROOM1) &&\n        (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_HOUSE_ROOM1)\n      || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_HOUSE_ROOM2)))\n        return TRUE;\n\n    // In elevator\n    if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROCKET_HIDEOUT_ELEVATOR))\n     || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SILPH_CO_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SILPH_CO_ELEVATOR))\n     || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ELEVATOR))\n     || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR)))\n        return TRUE;\n\n    return FALSE;\n}\n\nbool8 QuestLog_ShouldEndSceneOnMapChange(void)\n{\n    if (InQuestLogDisabledLocation() != TRUE)\n        return FALSE;\n\n    if (gQuestLogState == QL_STATE_PLAYBACK)\n        return TRUE;\n\n    if (gQuestLogState == QL_STATE_RECORDING)\n        QuestLog_CutRecording();\n\n    return FALSE;\n}\n\nstatic bool8 ShouldRegisterEvent_HandlePartyActions(u16 eventId, const u16 * data)\n{\n    if (eventId == QL_EVENT_USED_FIELD_MOVE || eventId == QL_EVENT_USED_PKMN_CENTER)\n        return TRUE;\n\n    if (!FlagGet(FLAG_SYS_GAME_CLEAR))\n    {\n        if (eventId == QL_EVENT_SWITCHED_PARTY_ORDER\n         || eventId == QL_EVENT_DEFEATED_WILD_MON\n         || ShouldRegisterEvent_HandleBeatStoryTrainer(eventId, data) == TRUE)\n            return TRUE;\n    }\n\n    if (!FlagGet(FLAG_SYS_CAN_LINK_WITH_RS))\n    {\n        if (eventId == QL_EVENT_USED_ITEM\n         || eventId == QL_EVENT_GAVE_HELD_ITEM\n         || eventId == QL_EVENT_GAVE_HELD_ITEM_BAG\n         || eventId == QL_EVENT_GAVE_HELD_ITEM_PC\n         || eventId == QL_EVENT_TOOK_HELD_ITEM\n         || eventId == QL_EVENT_SWAPPED_HELD_ITEM\n         || eventId == QL_EVENT_SWAPPED_HELD_ITEM_PC\n         || eventId == QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON\n         || eventId == QL_EVENT_WITHDREW_MON_PC\n         || eventId == QL_EVENT_DEPOSITED_MON_PC)\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 ShouldRegisterEvent_HandleBeatStoryTrainer(u16 eventId, const u16 * genericData)\n{\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    if (eventId == QL_EVENT_DEFEATED_TRAINER)\n    {\n        const struct QuestLogEvent_TrainerBattle * data = (struct QuestLogEvent_TrainerBattle *)genericData;\n        u8 trainerClass = sTrainers[data->trainerId].trainerClass;\n        if (trainerClass == TRAINER_CLASS_RIVAL_EARLY\n         || trainerClass == TRAINER_CLASS_RIVAL_LATE\n         || trainerClass == TRAINER_CLASS_CHAMPION\n         || trainerClass == TRAINER_CLASS_BOSS)\n            return FALSE;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid QL_EnableRecordingSteps(void)\n{\n    sStepRecordingMode = STEP_RECORDING_MODE_ENABLED;\n}\n\nstatic u16 *ShouldRegisterEvent(u16 eventId, const u16 * data)\n{\n    if (ShouldRegisterEvent_HandlePartyActions(eventId, data) == TRUE)\n        return NULL;\n\n    if (ShouldRegisterEvent_HandleDeparted(eventId, data) == FALSE)\n        return NULL;\n\n    QL_StartRecordingAction(eventId);\n    UpdateRepeatEventCounter(eventId);\n\n    if (eventId == QL_EVENT_DEFEATED_WILD_MON)\n        gQuestLogDefeatedWildMonRecord = gQuestLogRecordingPointer;\n    else\n        gQuestLogDefeatedWildMonRecord = NULL;\n\n    return sRecordEventFuncs[eventId](gQuestLogRecordingPointer, data);\n}\n\nstatic bool8 TryDeferLinkEvent(u16 eventId, const u16 * data)\n{\n    if (!IS_LINK_QL_EVENT(eventId))\n        return FALSE;\n\n    ResetDeferredLinkEvent();\n    sDeferredEvent.id = eventId;\n\n    // These two events have no data, so no need to copy\n    if (eventId != QL_EVENT_USED_UNION_ROOM && eventId != QL_EVENT_USED_UNION_ROOM_CHAT)\n    {\n        if (eventId == QL_EVENT_LINK_TRADED || eventId == QL_EVENT_LINK_TRADED_UNION)\n            memcpy(sDeferredEvent.data, data, sizeof(struct QuestLogEvent_Traded));\n        else\n            memcpy(sDeferredEvent.data, data, sizeof(struct QuestLogEvent_LinkBattle));\n    }\n    return TRUE;\n}\n\nvoid ResetDeferredLinkEvent(void)\n{\n    sDeferredEvent = (struct DeferredLinkEvent){};\n}\n\nvoid QuestLog_StartRecordingInputsAfterDeferredEvent(void)\n{\n    if (sDeferredEvent.id != 0)\n    {\n        u16 *resp;\n        sLastDepartedLocation = 0;\n        QL_StartRecordingAction(sDeferredEvent.id);\n        resp = sRecordEventFuncs[sDeferredEvent.id](gQuestLogRecordingPointer, sDeferredEvent.data);\n        gQuestLogRecordingPointer = resp;\n        ResetDeferredLinkEvent();\n    }\n}\n\nstatic bool8 TryDeferTrainerBattleEvent(u16 eventId, const u16 * data)\n{\n    if (eventId != QL_EVENT_DEFEATED_TRAINER\n     && eventId != QL_EVENT_DEFEATED_GYM_LEADER\n     && eventId != QL_EVENT_DEFEATED_E4_MEMBER\n     && eventId != QL_EVENT_DEFEATED_CHAMPION)\n        return FALSE;\n\n    ResetDeferredLinkEvent();\n    if (gQuestLogPlaybackState != QL_PLAYBACK_STATE_STOPPED || FlagGet(FLAG_SYS_GAME_CLEAR) || ShouldRegisterEvent_HandleBeatStoryTrainer(eventId, data) != TRUE)\n    {\n        sDeferredEvent.id = eventId;\n        memcpy(sDeferredEvent.data, data, sizeof(struct QuestLogEvent_TrainerBattle));\n    }\n    return TRUE;\n}\n\nvoid QuestLogEvents_HandleEndTrainerBattle(void)\n{\n    if (sDeferredEvent.id != 0)\n    {\n        u16 *resp;\n        if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_STOPPED)\n        {\n            sLastDepartedLocation = 0;\n            QL_StartRecordingAction(sDeferredEvent.id);\n        }\n        UpdateRepeatEventCounter(sDeferredEvent.id);\n        resp = sRecordEventFuncs[sDeferredEvent.id](gQuestLogRecordingPointer, sDeferredEvent.data);\n        gQuestLogRecordingPointer = resp;\n        QL_RecordWait(1);\n        ResetDeferredLinkEvent();\n        QL_FinishRecordingScene();\n    }\n}\n\nvoid QL_RecordWait(u16 duration)\n{\n    gQuestLogRecordingPointer = QL_RecordAction_Wait(gQuestLogRecordingPointer, duration);\n    gQuestLogCurActionIdx++;\n}\n\nstatic bool8 IsEventWithSpecialEncounterSpecies(u16 eventId, const u16 * genericData)\n{\n    const struct QuestLogEvent_WildBattle * data;\n\n    if (eventId != QL_EVENT_DEFEATED_WILD_MON)\n        return FALSE;\n\n    data = (struct QuestLogEvent_WildBattle *)genericData;\n\n    if (IsSpeciesFromSpecialEncounter(data->defeatedSpecies) == TRUE)\n        return TRUE;\n\n    if (IsSpeciesFromSpecialEncounter(data->caughtSpecies) == TRUE)\n        return TRUE;\n\n    return FALSE;\n}\n\nu16 *QL_SkipCommand(u16 *curPtr, u16 **prevPtr_p)\n{\n    u16 eventId = curPtr[0] & QL_CMD_EVENT_MASK;\n    u16 count = curPtr[0] >> QL_CMD_COUNT_SHIFT;\n\n    if (eventId == QL_EVENT_DEFEATED_CHAMPION)\n        count = 0;\n\n    if (!IS_VALID_QL_EVENT(eventId))\n        return NULL;\n\n    *prevPtr_p = curPtr;\n    return sQuestLogEventCmdSizes[eventId] + (sQuestLogEventCmdSizes[eventId] - CMD_HEADER_SIZE) * count + (void *)curPtr;\n}\n\nvoid QL_UpdateLastDepartedLocation(const u16 *a0)\n{\n    const u8 *r2 = (const u8 *)(a0 + 2);\n    if ((a0[0] & QL_CMD_EVENT_MASK) != QL_EVENT_DEPARTED)\n        sLastDepartedLocation = 0;\n    else\n        sLastDepartedLocation = r2[1] + 1;\n}\n\nbool8 QL_LoadEvent(const u16 *eventData)\n{\n    const u16 *r0 = eventData;\n\n    if (eventData == NULL)\n        return FALSE;\n    if (r0[1] > gQuestLogCurActionIdx)\n        return FALSE;\n\n    sLoadEventFuncs[(r0[0] & QL_CMD_EVENT_MASK)](eventData);\n    gQuestLogRepeatEventTracker.id = r0[0];\n    gQuestLogRepeatEventTracker.numRepeats = (r0[0] & QL_CMD_COUNT_MASK) >> QL_CMD_COUNT_SHIFT;\n    if (gQuestLogRepeatEventTracker.numRepeats != 0)\n        gQuestLogRepeatEventTracker.counter = 1;\n    return TRUE;\n}\n\nbool8 QL_TryRepeatEvent(const u16 *eventData)\n{\n    // This is the first for a new event, do nothing. Counter may be changed later by QL_LoadEvent.\n    if (gQuestLogRepeatEventTracker.counter == 0)\n        return FALSE;\n\n    // Repeat event\n    sLoadEventFuncs[gQuestLogRepeatEventTracker.id](eventData);\n    if (++gQuestLogRepeatEventTracker.counter > gQuestLogRepeatEventTracker.numRepeats)\n        QL_ResetRepeatEventTracker();\n    return TRUE;\n}\n\nvoid QL_ResetRepeatEventTracker(void)\n{\n    gQuestLogRepeatEventTracker = (struct QuestLogRepeatEventTracker){};\n}\n\nstatic void UpdateRepeatEventCounter(u16 eventId)\n{\n    if (gQuestLogRepeatEventTracker.id != (u8)eventId || gQuestLogRepeatEventTracker.counter != gQuestLogCurActionIdx)\n    {\n        gQuestLogRepeatEventTracker.id = eventId;\n        gQuestLogRepeatEventTracker.numRepeats = 0;\n        gQuestLogRepeatEventTracker.counter = gQuestLogCurActionIdx;\n    }\n    // Allow 1 over the max. It will be recorded temporarily, ultimately replacing the oldest record.\n    else if (gQuestLogRepeatEventTracker.numRepeats < MAX_CMD_REPEAT + 1)\n    {\n        gQuestLogRepeatEventTracker.numRepeats++;\n    }\n}\n\nvoid QL_ResetEventStates(void)\n{\n    sNewlyEnteredMap = FALSE;\n    sLastDepartedLocation = 0;\n    sPlayedTheSlots = FALSE;\n}\n\nu16 *QL_RecordAction_SceneEnd(u16 *a0)\n{\n    if (!QL_IsRoomToSaveAction(a0, sQuestLogEventCmdSizes[QL_EVENT_SCENE_END]))\n        return NULL;\n    a0[0] = QL_EVENT_SCENE_END;\n    return a0 + 1;\n}\n\nu16 *QL_LoadAction_SceneEnd(u16 *a0, struct QuestLogAction * a1)\n{\n    if (!QL_IsRoomToSaveAction(a0, sQuestLogEventCmdSizes[QL_EVENT_SCENE_END]))\n        return NULL;\n    a1->type = QL_ACTION_SCENE_END;\n    a1->duration = 0;\n    a1->data.raw[0] = 0;\n    a1->data.raw[1] = 0;\n    a1->data.raw[2] = 0;\n    a1->data.raw[3] = 0;\n    return a0 + 1;\n}\n\nstatic u16 *QL_RecordAction_Wait(u16 *a0, u16 duration)\n{\n    if (!QL_IsRoomToSaveAction(a0, sQuestLogEventCmdSizes[QL_EVENT_WAIT]))\n        return NULL;\n    a0[0] = QL_EVENT_WAIT;\n    a0[1] = duration;\n    return a0 + 2;\n}\n\nu16 *QL_LoadAction_Wait(u16 *a0, struct QuestLogAction * a1)\n{\n    if (!QL_IsRoomToSaveAction(a0, sQuestLogEventCmdSizes[QL_EVENT_WAIT]))\n        return NULL;\n    a1->type = QL_ACTION_WAIT;\n    a1->duration = a0[1];\n    a1->data.raw[0] = 0;\n    a1->data.raw[1] = 0;\n    a1->data.raw[2] = 0;\n    a1->data.raw[3] = 0;\n    return a0 + 2;\n}\n\nu16 *QL_RecordAction_Input(u16 *script, struct QuestLogAction * a1)\n{\n    u8 *r6 = (u8 *)script + 4;\n\n    if (!QL_IsRoomToSaveAction(script, sQuestLogEventCmdSizes[QL_EVENT_INPUT]))\n        return NULL;\n    script[0] = QL_EVENT_INPUT;\n    script[1] = a1->duration;\n    r6[0] = a1->data.raw[0];\n    r6[1] = a1->data.raw[1];\n    r6[2] = a1->data.raw[2];\n    r6[3] = a1->data.raw[3];\n    return (u16 *)(r6 + 4);\n}\n\nu16 *QL_LoadAction_Input(u16 *a0, struct QuestLogAction * a1)\n{\n    u8 *r6 = (u8 *)a0 + 4;\n\n    if (!QL_IsRoomToSaveAction(a0, sQuestLogEventCmdSizes[QL_EVENT_INPUT]))\n        return NULL;\n    a1->type = QL_ACTION_INPUT;\n    a1->duration = a0[1];\n    a1->data.raw[0] = r6[0];\n    a1->data.raw[1] = r6[1];\n    a1->data.raw[2] = r6[2];\n    a1->data.raw[3] = r6[3];\n    return (u16 *)(r6 + 4);\n}\n\nu16 *QL_RecordAction_MovementOrGfxChange(u16 *script, struct QuestLogAction * a1)\n{\n    u16 *r4 = script;\n    u8 *r6 = (u8 *)script + 4;\n\n    if (!QL_IsRoomToSaveAction(r4, sQuestLogEventCmdSizes[QL_EVENT_MOVEMENT]))\n        return NULL;\n    if (a1->type == QL_ACTION_MOVEMENT)\n        r4[0] = QL_EVENT_MOVEMENT;\n    else\n        r4[0] = QL_EVENT_GFX_CHANGE;\n    r4[1] = a1->duration;\n    r6[0] = a1->data.raw[0];\n    r6[1] = a1->data.raw[1];\n    r6[2] = a1->data.raw[2];\n    r6[3] = a1->data.raw[3];\n    return (u16 *)(r6 + 4);\n}\n\nu16 *QL_LoadAction_MovementOrGfxChange(u16 *a0, struct QuestLogAction * a1)\n{\n    u16 *r5 = a0;\n    u8 *r6 = (u8 *)a0 + 4;\n\n    if (!QL_IsRoomToSaveAction(r5, sQuestLogEventCmdSizes[QL_EVENT_MOVEMENT]))\n        return NULL;\n    if (r5[0] == QL_EVENT_MOVEMENT)\n        a1->type = QL_ACTION_MOVEMENT;\n    else\n        a1->type = QL_ACTION_GFX_CHANGE;\n    a1->duration = r5[1];\n    a1->data.raw[0] = r6[0];\n    a1->data.raw[1] = r6[1];\n    a1->data.raw[2] = r6[2];\n    a1->data.raw[3] = r6[3];\n    return (u16 *)(r6 + 4);\n}\n\nstatic u16 *RecordEventHeader(u16 eventId, u16 *dest)\n{\n    u8 cmdSize;\n    u16 *record;\n    u8 i;\n    u8 count;\n\n    if (gQuestLogRepeatEventTracker.numRepeats == 0)\n        cmdSize = sQuestLogEventCmdSizes[eventId];\n    else\n        cmdSize = sQuestLogEventCmdSizes[eventId] - CMD_HEADER_SIZE; // First will already have the header\n\n    if (!QL_IsRoomToSaveEvent(dest, cmdSize))\n        return NULL;\n\n    record = (void *)dest;\n\n    if (gQuestLogRepeatEventTracker.numRepeats != 0)\n        record = (void *)record - (gQuestLogRepeatEventTracker.numRepeats * cmdSize + CMD_HEADER_SIZE);\n\n    if (gQuestLogRepeatEventTracker.numRepeats == MAX_CMD_REPEAT + 1)\n    {\n        // Shift back one, replacing oldest\n        for (i = 0; i < MAX_CMD_REPEAT; i++)\n        {\n            memcpy(\n                (void *)record + ((i + 0) * cmdSize + CMD_HEADER_SIZE),\n                (void *)record + ((i + 1) * cmdSize + CMD_HEADER_SIZE),\n                cmdSize\n            );\n        }\n        count = MAX_CMD_REPEAT;\n    }\n    else\n        count = gQuestLogRepeatEventTracker.numRepeats;\n\n    // Set header data (CMD_HEADER_SIZE)\n    record[0] = eventId + (count << QL_CMD_COUNT_SHIFT);\n    record[1] = gQuestLogCurActionIdx;\n\n    // Move past header and event data\n    record = (void *)record + (count * cmdSize + CMD_HEADER_SIZE);\n    return record;\n}\n\nstatic const u16 *LoadEvent(u16 eventId, const u16 *eventData)\n{\n    eventData = (const void *)eventData + (gQuestLogRepeatEventTracker.counter * (sQuestLogEventCmdSizes[eventId] - CMD_HEADER_SIZE) + CMD_HEADER_SIZE);\n    return eventData;\n}\n\nstatic void QuestLog_GetSpeciesName(u16 species, u8 *dest, u8 stringVarId)\n{\n    if (dest != NULL)\n    {\n        if (species != SPECIES_EGG)\n            bufferspeciesname(dest, species);\n        else\n            StringCopy(dest, gText_EggNickname);\n    }\n    else\n    {\n        if (species != SPECIES_EGG)\n            DynamicPlaceholderTextUtil_SetPlaceholderPtr(stringVarId, gSpeciesNames[species]);\n        else\n            DynamicPlaceholderTextUtil_SetPlaceholderPtr(stringVarId, gText_EggNickname);\n    }\n}\n\nstatic u16 *RecordEvent_SwitchedPartyOrder(u16 *dest, const struct QuestLogEvent_SwitchedPartyOrder * data)\n{\n    u16 *r2 = RecordEventHeader(QL_EVENT_SWITCHED_PARTY_ORDER, dest);\n    if (r2 == NULL)\n        return NULL;\n\n    r2[0] = data->species1;\n    r2[1] = data->species2;\n    return r2 + 2;\n}\n\nstatic const u16 *LoadEvent_SwitchedPartyOrder(const u16 *eventData)\n{\n    const u16 *r4 = LoadEvent(QL_EVENT_SWITCHED_PARTY_ORDER, eventData);\n    QuestLog_GetSpeciesName(r4[0], gStringVar1, 0);\n    QuestLog_GetSpeciesName(r4[1], gStringVar2, 0);\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchMon1WithMon2);\n    return r4 + 2;\n}\n\n#define rItemId    record[0]\n#define rSpecies   record[1]\n#define rItemParam record[2]\n\nstatic u16 *RecordEvent_UsedItem(u16 *dest, const struct QuestLogEvent_Item * data)\n{\n    u16 *record = RecordEventHeader(QL_EVENT_USED_ITEM, dest);\n    if (record == NULL)\n        return NULL;\n\n    rItemId = data->itemId;\n    rSpecies = data->species;\n    rItemParam = data->itemParam;\n\n    if (data->itemId == ITEM_ESCAPE_ROPE)\n        sStepRecordingMode = STEP_RECORDING_MODE_DISABLED_UNTIL_DEPART;\n\n    return record + 3;\n}\n\nstatic const u16 *LoadEvent_UsedItem(const u16 *eventData)\n{\n    const u16 *record = LoadEvent(QL_EVENT_USED_ITEM, eventData);\n\n    switch (ItemId_GetPocket(rItemId))\n    {\n    case POCKET_ITEMS:\n    case POCKET_POKE_BALLS:\n    case POCKET_BERRY_POUCH:\n    case POCKET_MEDICINE:\n    case POCKET_HELD_ITEMS:\n        StringCopy(gStringVar1, ItemId_GetName(rItemId));\n        if (rItemId == ITEM_ESCAPE_ROPE)\n        {\n            GetMapNameGeneric(gStringVar2, (u8)rItemParam);\n            StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedEscapeRope);\n        }\n        else if (rSpecies != 0xFFFF)\n        {\n            QuestLog_GetSpeciesName(rSpecies, gStringVar2, 0);\n            StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedItemOnMonAtThisLocation);\n        }\n        else\n        {\n            StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedTheItem);\n        }\n        break;\n    case POCKET_KEY_ITEMS:\n        StringCopy(gStringVar1, ItemId_GetName(rItemId));\n        StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedTheKeyItem);\n        break;\n    case POCKET_TM_CASE:\n        QuestLog_GetSpeciesName(rSpecies, gStringVar1, 0);\n        StringCopy(gStringVar2, gMoveNames[ItemIdToBattleMoveId(rItemId)]);\n        if (rItemParam != 0xFFFF)\n        {\n            StringCopy(gStringVar3, gMoveNames[rItemParam]);\n            if (rItemId >= ITEM_HM01)\n                StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonReplacedMoveWithHM);\n            else\n                StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonReplacedMoveWithTM);\n        }\n        else\n        {\n            if (rItemId >= ITEM_HM01)\n                StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonLearnedMoveFromHM);\n            else\n                StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonLearnedMoveFromTM);\n        }\n        break;\n    }\n    return record + 3;\n}\n\nstatic u16 *RecordEvent_GiveTakeHeldItem(u16 eventId, u16 *dest, const struct QuestLogEvent_Item * data)\n{\n    u16 *record = RecordEventHeader(eventId, dest);\n    if (record == NULL)\n        return NULL;\n\n    rItemId = data->itemId;\n    rSpecies = data->species;\n    return record + 2;\n}\n\nstatic u16 *RecordEvent_GaveHeldItemFromPartyMenu(u16 *dest, const struct QuestLogEvent_Item * data)\n{\n    return RecordEvent_GiveTakeHeldItem(QL_EVENT_GAVE_HELD_ITEM, dest, data);\n}\n\nstatic const u16 *LoadEvent_GaveHeldItemFromPartyMenu(const u16 * eventData)\n{\n    const u16 *record = LoadEvent(QL_EVENT_GAVE_HELD_ITEM, eventData);\n    QuestLog_GetSpeciesName(rSpecies, gStringVar1, 0);\n    StringCopy(gStringVar2, ItemId_GetName(rItemId));\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItem);\n    return record + 2;\n}\n\nstatic u16 *RecordEvent_GaveHeldItemFromBagMenu(u16 *dest, const struct QuestLogEvent_Item * data)\n{\n    return RecordEvent_GiveTakeHeldItem(QL_EVENT_GAVE_HELD_ITEM_BAG, dest, data);\n}\n\nstatic const u16 *LoadEvent_GaveHeldItemFromBagMenu(const u16 *eventData)\n{\n    const u16 *record = LoadEvent(QL_EVENT_GAVE_HELD_ITEM_BAG, eventData);\n    QuestLog_GetSpeciesName(rSpecies, gStringVar1, 0);\n    StringCopy(gStringVar2, ItemId_GetName(rItemId));\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItem2);\n    return record + 2;\n}\n\nstatic u16 *RecordEvent_GaveHeldItemFromPC(u16 *dest, const struct QuestLogEvent_Item * data)\n{\n    return RecordEvent_GiveTakeHeldItem(QL_EVENT_GAVE_HELD_ITEM_PC, dest, data);\n}\n\nstatic const u16 *LoadEvent_GaveHeldItemFromPC(const u16 *eventData)\n{\n    const u16 *record = LoadEvent(QL_EVENT_GAVE_HELD_ITEM_PC, eventData);\n\n    QuestLog_GetSpeciesName(rSpecies, gStringVar2, 0);\n    StringCopy(gStringVar1, ItemId_GetName(rItemId));\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItemFromPC);\n    return record + 2;\n}\n\nstatic u16 *RecordEvent_TookHeldItem(u16 *dest, const struct QuestLogEvent_Item * data)\n{\n    return RecordEvent_GiveTakeHeldItem(QL_EVENT_TOOK_HELD_ITEM, dest, data);\n}\n\nstatic const u16 *LoadEvent_TookHeldItem(const u16 *eventData)\n{\n    const u16 *record = LoadEvent(QL_EVENT_TOOK_HELD_ITEM, eventData);\n\n    QuestLog_GetSpeciesName(rSpecies, gStringVar1, 0);\n    StringCopy(gStringVar2, ItemId_GetName(rItemId));\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_TookHeldItemFromMon);\n    return record + 2;\n}\n\n#undef rItemId\n#undef rSpecies\n#undef rItemParam\n\n#define rTakenItemId record[0]\n#define rGivenItemId record[1]\n#define rSpecies     record[2]\n\nstatic u16 *RecordEvent_SwappedHeldItem(u16 eventId, u16 *dest, const struct QuestLogEvent_SwappedHeldItem * data)\n{\n    u16 *record = RecordEventHeader(eventId, dest);\n    if (record == NULL)\n        return NULL;\n\n    rTakenItemId = data->takenItemId;\n    rGivenItemId = data->givenItemId;\n    rSpecies = data->species;\n    return record + 3;\n}\n\nstatic u16 *RecordEvent_SwappedHeldItemFromBag(u16 *dest, const struct QuestLogEvent_SwappedHeldItem * data)\n{\n    return RecordEvent_SwappedHeldItem(QL_EVENT_SWAPPED_HELD_ITEM, dest, data);\n}\n\nstatic const u16 *LoadEvent_SwappedHeldItem(const u16 *eventData)\n{\n    const u16 *record = LoadEvent(QL_EVENT_SWAPPED_HELD_ITEM, eventData);\n    QuestLog_GetSpeciesName(rSpecies, gStringVar1, 0);\n    StringCopy(gStringVar2, ItemId_GetName(rTakenItemId));\n    StringCopy(gStringVar3, ItemId_GetName(rGivenItemId));\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwappedHeldItemsOnMon);\n    return record + 3;\n}\n\nstatic u16 *RecordEvent_SwappedHeldItemFromPC(u16 *dest, const struct QuestLogEvent_SwappedHeldItem * data)\n{\n    return RecordEvent_SwappedHeldItem(QL_EVENT_SWAPPED_HELD_ITEM_PC, dest, data);\n}\n\nstatic const u16 *LoadEvent_SwappedHeldItemFromPC(const u16 *eventData)\n{\n    const u16 *record = LoadEvent(QL_EVENT_SWAPPED_HELD_ITEM_PC, eventData);\n    QuestLog_GetSpeciesName(rSpecies, gStringVar2, 0);\n    StringCopy(gStringVar3, ItemId_GetName(rTakenItemId));\n    StringCopy(gStringVar1, ItemId_GetName(rGivenItemId));\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwappedHeldItemFromPC);\n    return record + 3;\n}\n\n#undef rTakenItemId\n#undef rGivenItemId\n#undef rSpecies\n\n// data argument will be a null pointer, no information needed for this event\nstatic u16 *RecordEvent_UsedPkmnCenter(u16 *dest, const u16 * data)\n{\n    u16 *record = dest;\n    if (gQuestLogRepeatEventTracker.id == QL_EVENT_USED_PKMN_CENTER && gQuestLogRepeatEventTracker.numRepeats != 0)\n        return record;\n\n    if (!QL_IsRoomToSaveEvent(dest, sQuestLogEventCmdSizes[QL_EVENT_USED_PKMN_CENTER]))\n        return NULL;\n\n    record[0] = QL_EVENT_USED_PKMN_CENTER;\n    record[1] = gQuestLogCurActionIdx;\n    return record + 2;\n}\n\nstatic const u16 *LoadEvent_UsedPkmnCenter(const u16 *eventData)\n{\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonsWereFullyRestoredAtCenter);\n    return eventData + 2;\n}\n\nstatic u16 *RecordEvent_LinkTraded(u16 *dest, const struct QuestLogEvent_Traded * data)\n{\n    u16 *nameDest = dest + 4;\n\n    dest[0] = QL_EVENT_LINK_TRADED;\n    dest[1] = gQuestLogCurActionIdx;\n    dest[2] = data->speciesSent;\n    dest[3] = data->speciesReceived;\n    memcpy(nameDest, data->partnerName, PLAYER_NAME_LENGTH);\n    return nameDest + 4;\n}\n\nstatic const u16 *LoadEvent_LinkTraded(const u16 *eventData)\n{\n    const u16 *name = eventData + 4;\n\n    memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1);\n    memcpy(gStringVar1, name, PLAYER_NAME_LENGTH);\n\n    TranslateLinkPartnersName(gStringVar1);\n    QuestLog_GetSpeciesName(eventData[3], gStringVar2, 0); // Mon received\n    QuestLog_GetSpeciesName(eventData[2], gStringVar3, 0); // Mon sent\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_TradedMon1ForPersonsMon2);\n    return name + 4;\n}\n\n#define rOutcome      record[0]\n#define rBattler1Name record[1]\n#define rBattler2Name record[1 + PLAYER_NAME_LENGTH]\n#define rBattler3Name record[1 + PLAYER_NAME_LENGTH * 2]\n\nstatic u16 *RecordEvent_LinkBattledSingle(u16 *dest, const struct QuestLogEvent_LinkBattle * data)\n{\n    u8 * record;\n\n    dest[0] = QL_EVENT_LINK_BATTLED_SINGLE;\n    dest[1] = gQuestLogCurActionIdx;\n    record = (u8 *)(dest + 2);\n\n    rOutcome = data->outcome;\n    memcpy(&rBattler1Name, data->playerNames[0], PLAYER_NAME_LENGTH);\n    return (u16 *)(record + 1 + PLAYER_NAME_LENGTH);\n}\n\nstatic const u16 *LoadEvent_LinkBattledSingle(const u16 *eventData)\n{\n    const u8 * record = (const u8 *)(eventData + 2);\n    DynamicPlaceholderTextUtil_Reset();\n\n    memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1);\n    memcpy(gStringVar1, &rBattler1Name, PLAYER_NAME_LENGTH);\n    TranslateLinkPartnersName(gStringVar1);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sBattleOutcomeTexts[rOutcome]);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SingleBattleWithPersonResultedInOutcome);\n    return (const u16 *)(record + 1 + PLAYER_NAME_LENGTH);\n}\n\nstatic u16 *RecordEvent_LinkBattledDouble(u16 *dest, const struct QuestLogEvent_LinkBattle * data)\n{\n    u8 * record;\n\n    dest[0] = QL_EVENT_LINK_BATTLED_DOUBLE;\n    dest[1] = gQuestLogCurActionIdx;\n    record = (u8 *)(dest + 2);\n\n    rOutcome = data->outcome;\n    memcpy(&rBattler1Name, data->playerNames[0], PLAYER_NAME_LENGTH);\n    return (u16 *)(record + 1 + PLAYER_NAME_LENGTH);\n}\n\nstatic const u16 *LoadEvent_LinkBattledDouble(const u16 *eventData)\n{\n    const u8 * record = (const u8 *)(eventData + 2);\n    DynamicPlaceholderTextUtil_Reset();\n\n    memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1);\n    memcpy(gStringVar1, &rBattler1Name, PLAYER_NAME_LENGTH);\n    TranslateLinkPartnersName(gStringVar1);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sBattleOutcomeTexts[rOutcome]);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DoubleBattleWithPersonResultedInOutcome);\n    return (const u16 *)(record + 1 + PLAYER_NAME_LENGTH);\n}\n\nstatic u16 *RecordEvent_LinkBattledMulti(u16 *dest, const struct QuestLogEvent_LinkBattle * data)\n{\n    u8 * record;\n\n    dest[0] = QL_EVENT_LINK_BATTLED_MULTI;\n    dest[1] = gQuestLogCurActionIdx;\n    record = (u8 *)(dest + 2);\n\n    rOutcome = data->outcome;\n    memcpy(&rBattler1Name, data->playerNames[0], PLAYER_NAME_LENGTH);\n    memcpy(&rBattler2Name, data->playerNames[1], PLAYER_NAME_LENGTH);\n    memcpy(&rBattler3Name, data->playerNames[2], PLAYER_NAME_LENGTH);\n    return (u16 *)(record + 1 + PLAYER_NAME_LENGTH * 3);\n}\n\nstatic const u16 *LoadEvent_LinkBattledMulti(const u16 *eventData)\n{\n    const u8 * record = (const u8 *)(eventData + 2);\n    DynamicPlaceholderTextUtil_Reset();\n\n    memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1);\n    memset(gStringVar2, EOS, PLAYER_NAME_LENGTH + 1);\n    memset(gStringVar3, EOS, PLAYER_NAME_LENGTH + 1);\n    StringCopy_PlayerName(gStringVar1, &rBattler1Name);\n    StringCopy_PlayerName(gStringVar2, &rBattler2Name);\n    StringCopy_PlayerName(gStringVar3, &rBattler3Name);\n    TranslateLinkPartnersName(gStringVar1);\n    TranslateLinkPartnersName(gStringVar2);\n    TranslateLinkPartnersName(gStringVar3);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1); // partner\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); // opponent 1\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3); // opponent 2\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sBattleOutcomeTexts[rOutcome]);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MultiBattleWithPeopleResultedInOutcome);\n    return (const u16 *)(record + 1 + PLAYER_NAME_LENGTH * 3);\n}\n\n// data argument will be a null pointer, no information needed for this event\nstatic u16 *RecordEvent_UsedUnionRoom(u16 *dest, const u16 * data)\n{\n    dest[0] = QL_EVENT_USED_UNION_ROOM;\n    dest[1] = gQuestLogCurActionIdx;\n    return dest + 2;\n}\n\nstatic const u16 *LoadEvent_UsedUnionRoom(const u16 *eventData)\n{\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_MingledInUnionRoom);\n    return eventData + 2;\n}\n\n// data argument will be a null pointer, no information needed for this event\nstatic u16 *RecordEvent_UsedUnionRoomChat(u16 *dest, const u16 * data)\n{\n    dest[0] = QL_EVENT_USED_UNION_ROOM_CHAT;\n    dest[1] = gQuestLogCurActionIdx;\n    return dest + 2;\n}\n\nstatic const u16 *LoadEvent_UsedUnionRoomChat(const u16 *eventData)\n{\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_ChattedWithManyTrainers);\n    return eventData + 2;\n}\n\nstatic u16 *RecordEvent_LinkTradedUnionRoom(u16 *dest, const struct QuestLogEvent_Traded * data)\n{\n    u8 *name = (u8 *)(dest + 4);\n    dest[0] = QL_EVENT_LINK_TRADED_UNION;\n    dest[1] = gQuestLogCurActionIdx;\n    dest[2] = data->speciesSent;\n    dest[3] = data->speciesReceived;\n    memcpy(name, &data->partnerName, PLAYER_NAME_LENGTH);\n    return (u16 *)(name + 8);\n}\n\nstatic const u16 *LoadEvent_LinkTradedUnionRoom(const u16 *a0)\n{\n    const u8 *r6 = (const u8 *)(a0 + 4);\n    memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1);\n    memcpy(gStringVar1, r6, PLAYER_NAME_LENGTH);\n    TranslateLinkPartnersName(gStringVar1);\n    QuestLog_GetSpeciesName(a0[3], gStringVar2, 0);\n    QuestLog_GetSpeciesName(a0[2], gStringVar3, 0);\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_TradedMon1ForTrainersMon2);\n    return (const u16 *)(r6 + 8);\n}\n\nstatic u16 *RecordEvent_LinkBattledUnionRoom(u16 *dest, const struct QuestLogEvent_LinkBattle * data)\n{\n    dest[0] = QL_EVENT_LINK_BATTLED_UNION;\n    dest[1] = gQuestLogCurActionIdx;\n    *(u8 *)&dest[2] = data->outcome;\n    memcpy((u8 *)dest + 5, &data->playerNames[0], PLAYER_NAME_LENGTH);\n    return dest + 6;\n}\n\nstatic const u16 *LoadEvent_LinkBattledUnionRoom(const u16 *eventData)\n{\n    const u8 * record = (const u8 *)(eventData + 2);\n\n    memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1);\n    memcpy(gStringVar1, &rBattler1Name, PLAYER_NAME_LENGTH);\n    TranslateLinkPartnersName(gStringVar1);\n    StringCopy(gStringVar2, sBattleOutcomeTexts[rOutcome]);\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_BattledTrainerEndedInOutcome);\n    return (const u16 *)(record + 1 + PLAYER_NAME_LENGTH);\n}\n\n#undef rOutcome\n#undef rBattler1Name\n#undef rBattler2Name\n#undef rBattler3Name\n\n#define rSpecies1 record[0]\n#define rSpecies2 record[1]\n#define rBox1     (*((u8*)&record[2] + 0)) // 1st byte of record[2]\n#define rBox2     (*((u8*)&record[2] + 1)) // 2nd byte of record[2]\n\nstatic u16 *RecordEvent_SwitchedMonsBetweenBoxes(u16 *dest, const struct QuestLogEvent_MovedBoxMon * data)\n{\n    u16 * record = RecordEventHeader(QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES, dest);\n    if (record == NULL)\n        return NULL;\n    rSpecies1 = data->species1;\n    rSpecies2 = data->species2;\n    rBox1 = data->box1;\n    rBox2 = data->box2;\n    return record + 3;\n}\n\nstatic const u16 *LoadEvent_SwitchedMonsBetweenBoxes(const u16 *eventData)\n{\n    const u8 *boxIdxs;\n    const u16 * r0 = LoadEvent(QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES, eventData);\n    boxIdxs = (const u8 *)r0 + 4;\n    DynamicPlaceholderTextUtil_Reset();\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));\n    QuestLog_GetSpeciesName(r0[0], NULL, 1);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1]));\n    QuestLog_GetSpeciesName(r0[1], NULL, 3);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMonsBetweenBoxes);\n    return r0 + 3;\n}\n\nstatic u16 *RecordEvent_SwitchedMonsWithinBox(u16 *dest, const u16 *eventData)\n{\n    dest = RecordEventHeader(QL_EVENT_SWITCHED_MONS_WITHIN_BOX, dest);\n    if (dest == NULL)\n        return NULL;\n    dest[0] = eventData[0];\n    dest[1] = eventData[1];\n    *((u8 *)dest + 4) = *((const u8 *)eventData + 4);\n    return dest + 3;\n}\n\nstatic const u16 *LoadEvent_SwitchedMonsWithinBox(const u16 *eventData)\n{\n    const u8 *boxIdxs;\n    eventData = LoadEvent(QL_EVENT_SWITCHED_MONS_WITHIN_BOX, eventData);\n    boxIdxs = (const u8 *)eventData + 4;\n    DynamicPlaceholderTextUtil_Reset();\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));\n    QuestLog_GetSpeciesName(eventData[0], NULL, 1);\n    QuestLog_GetSpeciesName(eventData[1], NULL, 2);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMonsWithinBox);\n    return eventData + 3;\n}\n\nstatic u16 *RecordEvent_SwitchedPartyMonForPCMon(u16 *dest, const u16 *eventData)\n{\n    u16 *r2;\n    u16 *ret;\n    r2 = RecordEventHeader(QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON, dest);\n    if (r2 == NULL)\n        return NULL;\n    ret = r2 + 2;\n    if (*((const u8 *)eventData + 4) == TOTAL_BOXES_COUNT)\n    {\n        r2[0] = eventData[1];\n        r2[1] = eventData[0];\n        *((u8 *)r2 + 4) = *((const u8 *)eventData + 5);\n    }\n    else\n    {\n        r2[0] = eventData[0];\n        r2[1] = eventData[1];\n        *((u8 *)r2 + 4) = *((const u8 *)eventData + 4);\n    }\n    return ret + 1;\n}\n\nstatic const u16 *LoadEvent_SwitchedPartyMonForPCMon(const u16 *eventData)\n{\n    const u8 *boxIdxs;\n    eventData = LoadEvent(QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON, eventData);\n    boxIdxs = (const u8 *)eventData + 4;\n    DynamicPlaceholderTextUtil_Reset();\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));\n    QuestLog_GetSpeciesName(eventData[0], NULL, 1);\n    QuestLog_GetSpeciesName(eventData[1], NULL, 2);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedPartyMonForPCMon);\n    return eventData + 3;\n}\n\nstatic u16 *RecordEvent_MovedMonBetweenBoxes(u16 *dest, const u16 *eventData)\n{\n    u16 *r2;\n    u16 *ret;\n    r2 = RecordEventHeader(QL_EVENT_MOVED_MON_BETWEEN_BOXES, dest);\n    if (r2 == NULL)\n        return NULL;\n    r2[0] = eventData[0];\n    ret = r2 + 1;\n    *((u8 *)ret + 0) = *((const u8 *)eventData + 4);\n    *((u8 *)ret + 1) = *((const u8 *)eventData + 5);\n    return ret + 1;\n}\n\nstatic const u16 *LoadEvent_MovedMonBetweenBoxes(const u16 *eventData)\n{\n    const u8 *boxIdxs;\n    eventData = LoadEvent(QL_EVENT_MOVED_MON_BETWEEN_BOXES, eventData);\n    boxIdxs = (const u8 *)eventData + 2;\n    DynamicPlaceholderTextUtil_Reset();\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));\n    QuestLog_GetSpeciesName(eventData[0], NULL, 1);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1]));\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MovedMonToNewBox);\n    return (const u16 *)boxIdxs + 1;\n}\n\nstatic u16 *RecordEvent_MovedMonWithinBox(u16 *dest, const u16 *eventData)\n{\n    u16 *r2;\n    r2 = RecordEventHeader(QL_EVENT_MOVED_MON_WITHIN_BOX, dest);\n    if (r2 == NULL)\n        return NULL;\n    r2[0] = eventData[0];\n    *((u8 *)r2 + 2) = *((const u8 *)eventData + 4);\n    return r2 + 2;\n}\n\nstatic const u16 *LoadEvent_MovedMonWithinBox(const u16 *eventData)\n{\n    const u8 *boxIdxs;\n    eventData = LoadEvent(QL_EVENT_MOVED_MON_WITHIN_BOX, eventData);\n    boxIdxs = (const u8 *)eventData + 2;\n    DynamicPlaceholderTextUtil_Reset();\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));\n    QuestLog_GetSpeciesName(eventData[0], NULL, 1);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MovedMonWithinBox);\n    return (const u16 *)boxIdxs + 1;\n}\n\nstatic u16 *RecordEvent_WithdrewMonFromPC(u16 *dest, const u16 *eventData)\n{\n    u16 *r2;\n    r2 = RecordEventHeader(QL_EVENT_WITHDREW_MON_PC, dest);\n    if (r2 == NULL)\n        return NULL;\n    r2[0] = eventData[0];\n    *((u8 *)r2 + 2) = *((const u8 *)eventData + 4);\n    return r2 + 2;\n}\n\nstatic const u16 *LoadEvent_WithdrewMonFromPC(const u16 *eventData)\n{\n    const u8 *boxIdxs;\n    eventData = LoadEvent(QL_EVENT_WITHDREW_MON_PC, eventData);\n    boxIdxs = (const u8 *)eventData + 2;\n    DynamicPlaceholderTextUtil_Reset();\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));\n    QuestLog_GetSpeciesName(eventData[0], NULL, 1);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_WithdrewMonFromPC);\n    return (const u16 *)boxIdxs + 1;\n}\n\nstatic u16 *RecordEvent_DepositedMonInPC(u16 *dest, const u16 *eventData)\n{\n    u16 *r2;\n    r2 = RecordEventHeader(QL_EVENT_DEPOSITED_MON_PC, dest);\n    if (r2 == NULL)\n        return NULL;\n    r2[0] = eventData[0];\n    *((u8 *)r2 + 2) = *((const u8 *)eventData + 4);\n    return r2 + 2;\n}\n\nstatic const u16 *LoadEvent_DepositedMonInPC(const u16 *eventData)\n{\n    const u8 *boxIdxs;\n    eventData = LoadEvent(QL_EVENT_DEPOSITED_MON_PC, eventData);\n    boxIdxs = (const u8 *)eventData + 2;\n    DynamicPlaceholderTextUtil_Reset();\n    QuestLog_GetSpeciesName(eventData[0], NULL, 0);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(boxIdxs[0]));\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DepositedMonInPC);\n    return (const u16 *)boxIdxs + 1;\n}\n\nstatic u16 *RecordEvent_SwitchedMultipleMons(u16 *dest, const u16 *eventData)\n{\n    u16 *r2;\n    r2 = RecordEventHeader(QL_EVENT_SWITCHED_MULTIPLE_MONS, dest);\n    if (r2 == NULL)\n        return NULL;\n    *((u8 *)r2 + 0) = *((const u8 *)eventData + 4);\n    *((u8 *)r2 + 1) = *((const u8 *)eventData + 5);\n    return r2 + 1;\n}\n\nstatic const u16 *LoadEvent_SwitchedMultipleMons(const u16 *eventData)\n{\n    const u16 *r4 = LoadEvent(QL_EVENT_SWITCHED_MULTIPLE_MONS, eventData);\n    DynamicPlaceholderTextUtil_Reset();\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(*((const u8 *)r4 + 0)));\n    if (*((const u8 *)r4 + 0) == *((const u8 *)r4 + 1))\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gText_QuestLog_ADifferentSpot);\n    else\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(*((const u8 *)r4 + 1)));\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMultipleMons);\n    return r4 + 1;\n}\n\n#undef rSpecies1\n#undef rSpecies2\n#undef rBox1\n#undef rBox2\n\n#define rItemId record[0]\n\nstatic u16 *RecordEvent_DepositedItemInPC(u16 *dest, const struct QuestLogEvent_Item * data)\n{\n    u16 * record = RecordEventHeader(QL_EVENT_DEPOSITED_ITEM_PC, dest);\n    if (record == NULL)\n        return NULL;\n    rItemId = data->itemId;\n    return record + 1;\n}\n\nstatic const u16 *LoadEvent_DepositedItemInPC(const u16 *eventData)\n{\n    const u16 *record = LoadEvent(QL_EVENT_DEPOSITED_ITEM_PC, eventData);\n    CopyItemName(rItemId, gStringVar1);\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_StoredItemInPC);\n    return record + 1;\n}\n\nstatic u16 *RecordEvent_WithdrewItemFromPC(u16 *dest, const struct QuestLogEvent_Item * data)\n{\n    u16 * record = RecordEventHeader(QL_EVENT_WITHDREW_ITEM_PC, dest);\n    if (record == NULL)\n        return NULL;\n    rItemId = data->itemId;\n    return record + 1;\n}\n\nstatic const u16 *LoadEvent_WithdrewItemFromPC(const u16 *eventData)\n{\n    const u16 *record = LoadEvent(QL_EVENT_WITHDREW_ITEM_PC, eventData);\n    CopyItemName(rItemId, gStringVar1);\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_WithdrewItemFromPC);\n    return record + 1;\n}\n\n#undef rItemId\n\n#define rSpeciesOpponent record[0]\n#define rSpeciesPlayer   record[1]\n#define rTrainerId       record[2]\n#define rMapSec          (*((u8*)&record[3] + 0)) // 1st byte of record[3]\n#define rHpFractionId    (*((u8*)&record[3] + 1)) // 2nd byte of record[3]\n\nstatic u16 *RecordEvent_DefeatedTrainer(u16 eventId, u16 *dest, const struct QuestLogEvent_TrainerBattle * data)\n{\n    u16 * record = RecordEventHeader(eventId, dest);\n    if (record == NULL)\n        return NULL;\n    rSpeciesOpponent = data->speciesOpponent;\n    rSpeciesPlayer = data->speciesPlayer;\n    rTrainerId = data->trainerId;\n    rMapSec = data->mapSec;\n    rHpFractionId = data->hpFractionId;\n    return record + 4;\n}\n\nstatic u16 *RecordEvent_DefeatedGymLeader(u16 *dest, const struct QuestLogEvent_TrainerBattle * data)\n{\n    sStepRecordingMode = STEP_RECORDING_MODE_DISABLED;\n    return RecordEvent_DefeatedTrainer(QL_EVENT_DEFEATED_GYM_LEADER, dest, data);\n}\n\nstatic const u16 *LoadEvent_DefeatedGymLeader(const u16 *eventData)\n{\n    const u8 *r6;\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    eventData = LoadEvent(QL_EVENT_DEFEATED_GYM_LEADER, eventData);\n    r6 = (const u8 *)eventData + 6;\n    DynamicPlaceholderTextUtil_Reset();\n    GetMapNameGeneric(gStringVar1, r6[0]);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sTrainers[eventData[2]].trainerName);\n    QuestLog_GetSpeciesName(eventData[0], 0, 2);\n    QuestLog_GetSpeciesName(eventData[1], 0, 3);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sDefeatedOpponentFlavorTexts[r6[1]]);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnGymLeadersMonWithMonAndWon);\n    return eventData + 4;\n}\n\nstatic u16 *RecordEvent_DefeatedWildMon(u16 *dest, const struct QuestLogEvent_WildBattle * data)\n{\n    u16 *body = dest;\n    u8 *footer = (u8 *)dest + sizeof(struct QuestLogEvent_WildBattle);\n    if (!QL_IsRoomToSaveEvent(body, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_WILD_MON]))\n        return NULL;\n    if (footer[0] == 0 && footer[1] == 0)\n    {\n        body[0] = QL_EVENT_DEFEATED_WILD_MON;\n        body[1] = gQuestLogCurActionIdx;\n    }\n    if (data->defeatedSpecies != SPECIES_NONE)\n        body[2] = data->defeatedSpecies;\n    if (data->caughtSpecies != SPECIES_NONE)\n        body[3] = data->caughtSpecies;\n    if (data->defeatedSpecies != SPECIES_NONE && footer[0] != 0xFF)\n        footer[0]++;\n    if (data->caughtSpecies != SPECIES_NONE && footer[1] != 0xFF)\n        footer[1]++;\n    footer[2] = data->mapSec;\n    return (u16 *)(footer + 4);\n}\n\nstatic const u16 *LoadEvent_DefeatedWildMon(const u16 *a0)\n{\n    const u8 *data;\n    if (!QL_IsRoomToSaveEvent(a0, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_WILD_MON]))\n        return NULL;\n\n    data = (const u8 *)a0 + 8;\n    DynamicPlaceholderTextUtil_Reset();\n    GetMapNameGeneric(gStringVar1, data[2]);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);\n    QuestLog_GetSpeciesName(a0[2], NULL, 1);\n    ConvertIntToDecimalStringN(gStringVar2, data[0], STR_CONV_MODE_LEFT_ALIGN, 3);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);\n    QuestLog_GetSpeciesName(a0[3], NULL, 3);\n    ConvertIntToDecimalStringN(gStringVar3, data[1], STR_CONV_MODE_LEFT_ALIGN, 3);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar3);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, gSaveBlock2Ptr->playerName);\n    if (data[0] == 0)\n    {\n        if (data[1] == 1)\n            DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_CaughtWildMon);\n        else\n            DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_CaughtWildMons);\n    }\n    else if (data[1] == 0)\n    {\n        if (data[0] == 1)\n            DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMon);\n        else\n            DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMons);\n    }\n    else if (data[0] == 1)\n    {\n        if (data[1] == 1)\n            DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonAndCaughtWildMon);\n        else\n            DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonAndCaughtWildMons);\n    }\n    else\n    {\n        if (data[1] == 1)\n            DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonsAndCaughtWildMon);\n        else\n            DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonsAndCaughtWildMons);\n    }\n    return (const u16 *)(data + 4);\n}\n\nstatic bool8 IsSpeciesFromSpecialEncounter(u16 species)\n{\n    switch (species)\n    {\n    case SPECIES_SNORLAX:\n    case SPECIES_ARTICUNO:\n    case SPECIES_ZAPDOS:\n    case SPECIES_MOLTRES:\n    case SPECIES_MEWTWO:\n    case SPECIES_MEW:\n    case SPECIES_LUGIA:\n    case SPECIES_HO_OH:\n    case SPECIES_LATIAS:\n    case SPECIES_LATIOS:\n    case SPECIES_DEOXYS:\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic u16 *RecordEvent_DefeatedEliteFourMember(u16 *dest, const struct QuestLogEvent_TrainerBattle * data)\n{\n    sStepRecordingMode = STEP_RECORDING_MODE_DISABLED;\n    return RecordEvent_DefeatedTrainer(QL_EVENT_DEFEATED_E4_MEMBER, dest, data);\n}\n\nstatic const u16 *LoadEvent_DefeatedEliteFourMember(const u16 *eventData)\n{\n    const u8 *r5;\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    eventData = LoadEvent(QL_EVENT_DEFEATED_E4_MEMBER, eventData);\n    r5 = (const u8 *)eventData + 6;\n    DynamicPlaceholderTextUtil_Reset();\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sTrainers[eventData[2]].trainerName);\n    QuestLog_GetSpeciesName(eventData[0], NULL, 1);\n    QuestLog_GetSpeciesName(eventData[1], NULL, 2);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, sDefeatedOpponentFlavorTexts[r5[1]]);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnEliteFoursMonWithMonAndWon);\n    return eventData + 4;\n}\n\nstatic u16 *RecordEvent_DefeatedChampion(u16 *dest, const struct QuestLogEvent_TrainerBattle * data)\n{\n    if (!QL_IsRoomToSaveEvent(dest, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_CHAMPION]))\n        return NULL;\n    dest[0] = QL_EVENT_DEFEATED_CHAMPION | (2 << QL_CMD_COUNT_SHIFT); // Event will run two additional times, for each state in LoadEvent_DefeatedChampion\n    dest[1] = gQuestLogCurActionIdx;\n    dest[2] = data->speciesOpponent;\n    dest[3] = data->speciesPlayer;\n    *((u8 *)dest + 8) = data->hpFractionId;\n    sStepRecordingMode = STEP_RECORDING_MODE_DISABLED;\n    return dest + 5;\n}\n\nstatic const u16 *LoadEvent_DefeatedChampion(const u16 *a0)\n{\n    const u8 *r5;\n    if (!QL_IsRoomToSaveEvent(a0, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_CHAMPION]))\n        return NULL;\n\n    r5 = (const u8 *)a0 + 8;\n    DynamicPlaceholderTextUtil_Reset();\n\n    switch (gQuestLogRepeatEventTracker.counter)\n    {\n    case 0:\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gSaveBlock1Ptr->rivalName);\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_PlayerBattledChampionRival);\n        break;\n    case 1:\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock1Ptr->rivalName);\n        QuestLog_GetSpeciesName(a0[2], NULL, 1);\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gSaveBlock2Ptr->playerName);\n        QuestLog_GetSpeciesName(a0[3], NULL, 3);\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_PlayerSentOutMon1RivalSentOutMon2);\n        break;\n    case 2:\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sDefeatedChampionFlavorTexts[r5[0]]);\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_WonTheMatchAsAResult);\n        break;\n    }\n    return (const u16 *)(r5 + 2);\n}\n\nstatic u16 *RecordEvent_DefeatedNormalTrainer(u16 *dest, const struct QuestLogEvent_TrainerBattle * data)\n{\n    sStepRecordingMode = STEP_RECORDING_MODE_DISABLED;\n    return RecordEvent_DefeatedTrainer(QL_EVENT_DEFEATED_TRAINER, dest, data);\n}\n\nstatic const u16 *LoadEvent_DefeatedTrainer(const u16 *eventData)\n{\n    const u16 *r5 = LoadEvent(QL_EVENT_DEFEATED_TRAINER, eventData);\n    const u8 *r6 = (const u8 *)r5 + 6;\n    struct Trainer* sTrainers;\n\n    if(FlagGet(FLAG_MASTER_TRAINER_BATTLE))\n        sTrainers = (struct Trainer*)gMasterTrainers;\n    else\n        sTrainers = (struct Trainer*)gTrainers;\n\n    DynamicPlaceholderTextUtil_Reset();\n    GetMapNameGeneric(gStringVar1, r6[0]);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);\n\n    if (sTrainers[r5[2]].trainerClass == TRAINER_CLASS_RIVAL_EARLY\n     || sTrainers[r5[2]].trainerClass == TRAINER_CLASS_RIVAL_LATE\n     || sTrainers[r5[2]].trainerClass == TRAINER_CLASS_CHAMPION)\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetExpandedPlaceholder(PLACEHOLDER_ID_RIVAL));\n    else\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sTrainers[r5[2]].trainerName);\n\n    QuestLog_GetSpeciesName(r5[0], NULL, 2);\n    QuestLog_GetSpeciesName(r5[1], NULL, 3);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sDefeatedOpponentFlavorTexts[r6[1]]);\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnTrainersMonWithMonAndWon);\n    return (const u16 *)(r6 + 2);\n}\n\n#undef rSpeciesOpponent\n#undef rSpeciesPlayer\n#undef rTrainerId\n#undef rMapSec\n#undef rHpFractionId\n\n#define rMapSec     record[0]\n#define rLocationId record[1]\n\nstatic u16 *RecordEvent_DepartedLocation(u16 *dest, const struct QuestLogEvent_Departed * data)\n{\n    u8 *record = (u8 *)RecordEventHeader(QL_EVENT_DEPARTED, dest);\n    if (record == NULL)\n        return NULL;\n\n    rMapSec = data->mapSec;\n    rLocationId = data->locationId;\n    if (rLocationId == QL_LOCATION_SAFARI_ZONE)\n        sStepRecordingMode = STEP_RECORDING_MODE_DISABLED;\n\n    return (u16 *)(record + 2);\n}\n\nstatic const u16 *LoadEvent_DepartedLocation(const u16 *eventData)\n{\n    u8 i, locationId;\n    const u8 *record = (const u8 *)LoadEvent(QL_EVENT_DEPARTED, eventData);\n\n    locationId = rLocationId;\n    GetMapNameGeneric(gStringVar1, rMapSec);\n    StringCopy(gStringVar2, sLocationNameTexts[locationId]);\n    if (sLocationToDepartedTextId[locationId] == QL_DEPARTED_GYM)\n    {\n        for (i = 0; i < NUM_BADGES; i++)\n        {\n            if (rMapSec != sGymCityMapSecs[i])\n                continue;\n            if (FlagGet(FLAG_BADGE01_GET + i) == TRUE)\n                StringExpandPlaceholders(gStringVar4, gText_QuestLog_DepartedGym);\n            else\n                StringExpandPlaceholders(gStringVar4, gText_QuestLog_GymWasFullOfToughTrainers);\n            break;\n        }\n        if (i == NUM_BADGES)\n            StringExpandPlaceholders(gStringVar4, sDepartedLocationTexts[sLocationToDepartedTextId[locationId]]);\n    }\n    else\n        StringExpandPlaceholders(gStringVar4, sDepartedLocationTexts[sLocationToDepartedTextId[locationId]]);\n\n    return (const u16 *)(record + 2);\n}\n\n#undef rMapSec\n#undef rLocationId\n\nvoid SetQLPlayedTheSlots(void)\n{\n    sPlayedTheSlots = TRUE;\n}\n\nstatic bool8 ShouldRegisterEvent_HandleDeparted(u16 eventId, const u16 * genericData)\n{\n    const struct QuestLogEvent_Departed * data;\n\n    if (eventId != QL_EVENT_DEPARTED)\n    {\n        sLastDepartedLocation = 0;\n        return TRUE;\n    }\n\n    data = (struct QuestLogEvent_Departed *)genericData;\n\n    if (sLastDepartedLocation == data->locationId + 1)\n        return FALSE;\n    sLastDepartedLocation = data->locationId + 1;\n    return TRUE;\n}\n\nstatic bool8 ShouldRegisterEvent_DepartedGameCorner(u16 eventId, const u16 * genericData)\n{\n    const struct QuestLogEvent_Departed * data;\n\n    if (eventId != QL_EVENT_DEPARTED)\n        return TRUE;\n\n    data = (struct QuestLogEvent_Departed *)genericData;\n\n    if (data->locationId == QL_LOCATION_GAME_CORNER && !sPlayedTheSlots)\n        return FALSE;\n\n    sPlayedTheSlots = FALSE;\n    return TRUE;\n}\n\nstatic u16 *RecordEvent_UsedFieldMove(u16 *dest, const struct QuestLogEvent_FieldMove * data)\n{\n    u8 *record;\n    dest = RecordEventHeader(QL_EVENT_USED_FIELD_MOVE, dest);\n    if (dest == NULL)\n        return NULL;\n    dest[0] = data->species;\n    record = (u8 *)dest + 2;\n    record[0] = data->fieldMove;\n    record[1] = data->mapSec;\n    if (record[0] == FIELD_MOVE_TELEPORT || record[0] == FIELD_MOVE_DIG)\n        sStepRecordingMode = STEP_RECORDING_MODE_DISABLED_UNTIL_DEPART;\n    else\n        sStepRecordingMode = STEP_RECORDING_MODE_DISABLED;\n    return (u16 *)(record + 2);\n}\n\nstatic const u16 *LoadEvent_UsedFieldMove(const u16 *eventData)\n{\n    const u16 *r4 = LoadEvent(QL_EVENT_USED_FIELD_MOVE, eventData);\n    const u8 *r5 = (const u8 *)r4 + 2;\n    QuestLog_GetSpeciesName(r4[0], gStringVar1, 0);\n    if (r5[1] != 0xFF)\n        GetMapNameGeneric(gStringVar2, r5[1]);\n\n    // If used Teleport, get name of destination\n    if (r5[0] == FIELD_MOVE_TELEPORT)\n    {\n        if (r5[1] == MAPSEC_PALLET_TOWN)\n            StringCopy(gStringVar3, gText_QuestLog_Home);\n        else\n            StringCopy(gStringVar3, gText_PokemonCenter);\n    }\n\n    StringExpandPlaceholders(gStringVar4, sUsedFieldMoveTexts[r5[0]]);\n    return (const u16 *)(r5 + 2);\n}\n\nstatic u16 *RecordEvent_BoughtItem(u16 *dest, const struct QuestLogEvent_Shop * data)\n{\n    dest = RecordEventHeader(QL_EVENT_BOUGHT_ITEM, dest);\n    if (dest == NULL)\n        return NULL;\n    dest[0] = data->lastItemId;\n    dest[1] = data->itemQuantity;\n    dest[2] = data->totalMoney >> 16;\n    dest[3] = data->totalMoney;\n    *((u8 *)dest + 8) = data->mapSec;\n    *((u8 *)dest + 9) = TRUE; // data->hasMultipleTransactions ignored for some reason. It's assumed true if quantity >= 2\n    return dest + 5;\n}\n\nstatic const u16 *LoadEvent_BoughtItem(const u16 *eventData)\n{\n    const u16 *r4 = LoadEvent(QL_EVENT_BOUGHT_ITEM, eventData);\n    const u8 *r7 = (const u8 *)r4 + 8;\n    u32 r6 = (r4[2] << 16) + r4[3];\n    DynamicPlaceholderTextUtil_Reset();\n    GetMapNameGeneric(gStringVar1, r7[0]);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r4[0]));\n    if (r4[1] < 2)\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_BoughtItem);\n    else\n    {\n        ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6);\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_BoughtItemsIncludingItem);\n    }\n    return (const u16 *)(r7 + 2);\n}\n\nstatic u16 *RecordEvent_SoldItem(u16 *dest, const struct QuestLogEvent_Shop * data)\n{\n    dest = RecordEventHeader(QL_EVENT_SOLD_ITEM, dest);\n    if (dest == NULL)\n        return NULL;\n    dest[0] = data->lastItemId;\n    dest[1] = data->itemQuantity;\n    dest[2] = data->totalMoney >> 16;\n    dest[3] = data->totalMoney;\n    *((u8 *)dest + 8) = data->mapSec;\n    *((u8 *)dest + 9) = data->hasMultipleTransactions;\n    return dest + 5;\n}\n\nstatic const u16 *LoadEvent_SoldItem(const u16 *eventData)\n{\n    const u16 *r5 = LoadEvent(QL_EVENT_SOLD_ITEM, eventData);\n    const u8 *r7 = (const u8 *) r5 + 8;\n    u32 r6 = (r5[2] << 16) + r5[3];\n    DynamicPlaceholderTextUtil_Reset();\n    GetMapNameGeneric(gStringVar1, r7[0]);\n    if (r7[1] == 0) {\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1);\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, ItemId_GetName(r5[0]));\n        if (r5[1] == 1)\n            DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gText_QuestLog_JustOne);\n        else\n        {\n            ConvertIntToDecimalStringN(gStringVar2, r5[1], STR_CONV_MODE_LEFT_ALIGN, 3);\n            DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar2);\n            DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar3, gText_QuestLog_Num);\n            DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3);\n        }\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SoldNumOfItem);\n    }\n    else\n    {\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r5[0]));\n        ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6);\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SoldItemsIncludingItem);\n    }\n    return (const u16 *)(r7 + 2);\n}\n\nstatic u16 *RecordEvent_ObtainedStoryItem(u16 *dest, const struct QuestLogEvent_StoryItem * data)\n{\n    dest = RecordEventHeader(QL_EVENT_OBTAINED_STORY_ITEM, dest);\n    if (dest == NULL)\n        return NULL;\n    dest[0] = data->itemId;\n    *((u8 *)dest + 2) = data->mapSec;\n    return dest + 2;\n}\n\nstatic const u16 *LoadEvent_ObtainedStoryItem(const u16 *eventData)\n{\n    const u16 *r4 = LoadEvent(QL_EVENT_OBTAINED_STORY_ITEM, eventData);\n    const u8 *r5 = (const u8 *)r4 + 2;\n    GetMapNameGeneric(gStringVar1, r5[0]);\n    StringCopy(gStringVar2, ItemId_GetName(r4[0]));\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_ObtainedItemInLocation);\n    return (const u16 *)(r5 + 2);\n}\n\nvoid QuestLog_RecordEnteredMap(u16 worldMapFlag)\n{\n    s32 i;\n\n    if (QL_IS_PLAYBACK_STATE)\n        return;\n\n    for (i = 0; i < (int)ARRAY_COUNT(sWorldMapFlags); i++)\n    {\n        if (worldMapFlag == sWorldMapFlags[i])\n        {\n            if (!FlagGet(worldMapFlag))\n            {\n                sNewlyEnteredMap = TRUE;\n                break;\n            }\n            else\n            {\n                sNewlyEnteredMap += 0;\n                sNewlyEnteredMap = FALSE;\n                break;\n            }\n        }\n    }\n}\n\nvoid SetQuestLogEvent_Arrived(void)\n{\n    if (!QL_IS_PLAYBACK_STATE)\n    {\n        if (sNewlyEnteredMap)\n        {\n            u16 mapSec = gMapHeader.regionMapSectionId;\n            SetQuestLogEvent(QL_EVENT_ARRIVED, &mapSec);\n            sNewlyEnteredMap = FALSE;\n        }\n    }\n}\n\nstatic u16 *RecordEvent_ArrivedInLocation(u16 *dest, const u16 * data)\n{\n    dest = RecordEventHeader(QL_EVENT_ARRIVED, dest);\n    if (dest == NULL)\n        return NULL;\n    dest[0] = data[0];\n    return dest + 1;\n}\n\nstatic const u16 *LoadEvent_ArrivedInLocation(const u16 *eventData)\n{\n    const u16 *r4 = LoadEvent(QL_EVENT_ARRIVED, eventData);\n    GetMapNameGeneric(gStringVar1, (u8)r4[0]);\n    StringExpandPlaceholders(gStringVar4, gText_QuestLog_ArrivedInLocation);\n    return r4 + 1;\n}\n\nstatic void TranslateLinkPartnersName(u8 *dest)\n{\n    s32 i;\n    if (*dest++ == EXT_CTRL_CODE_BEGIN && *dest++ == EXT_CTRL_CODE_JPN)\n    {\n        for (i = 0; i < 5; i++)\n        {\n            if (*dest == EXT_CTRL_CODE_BEGIN)\n                break;\n            dest++;\n        }\n        *dest++ = EXT_CTRL_CODE_BEGIN;\n        *dest++ = EXT_CTRL_CODE_ENG;\n        *dest++ = EOS;\n    }\n}\n"
  },
  {
    "path": "src/quest_log_objects.c",
    "content": "#include \"global.h\"\n#include \"quest_log.h\"\n#include \"fieldmap.h\"\n#include \"field_player_avatar.h\"\n#include \"metatile_behavior.h\"\n\nvoid QL_RecordObjects(struct QuestLogScene * questLog)\n{\n    u32 i;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        questLog->objectEvents[i].active                         = gObjectEvents[i].active;\n        questLog->objectEvents[i].triggerGroundEffectsOnStop     = gObjectEvents[i].triggerGroundEffectsOnStop;\n        questLog->objectEvents[i].disableCoveringGroundEffects   = gObjectEvents[i].disableCoveringGroundEffects;\n        questLog->objectEvents[i].landingJump                    = gObjectEvents[i].landingJump;\n        questLog->objectEvents[i].frozen                         = gObjectEvents[i].frozen;\n        questLog->objectEvents[i].facingDirectionLocked          = gObjectEvents[i].facingDirectionLocked;\n        questLog->objectEvents[i].disableAnim                    = gObjectEvents[i].disableAnim;\n        questLog->objectEvents[i].enableAnim                     = gObjectEvents[i].enableAnim;\n        questLog->objectEvents[i].inanimate                      = gObjectEvents[i].inanimate;\n        questLog->objectEvents[i].invisible                      = gObjectEvents[i].invisible;\n        questLog->objectEvents[i].offScreen                      = gObjectEvents[i].offScreen;\n        questLog->objectEvents[i].trackedByCamera                = gObjectEvents[i].trackedByCamera;\n        questLog->objectEvents[i].isPlayer                       = gObjectEvents[i].isPlayer;\n        questLog->objectEvents[i].spriteAnimPausedBackup         = gObjectEvents[i].spriteAnimPausedBackup;\n        questLog->objectEvents[i].spriteAffineAnimPausedBackup   = gObjectEvents[i].spriteAffineAnimPausedBackup;\n        questLog->objectEvents[i].disableJumpLandingGroundEffect = gObjectEvents[i].disableJumpLandingGroundEffect;\n        questLog->objectEvents[i].fixedPriority                  = gObjectEvents[i].fixedPriority;\n        questLog->objectEvents[i].facingDirection                = gObjectEvents[i].facingDirection;\n        questLog->objectEvents[i].currentElevation               = gObjectEvents[i].currentElevation;\n        questLog->objectEvents[i].previousElevation              = gObjectEvents[i].previousElevation;\n        questLog->objectEvents[i].graphicsId                     = gObjectEvents[i].graphicsId;\n        questLog->objectEvents[i].movementType                   = gObjectEvents[i].movementType;\n        questLog->objectEvents[i].trainerType                    = gObjectEvents[i].trainerType;\n        questLog->objectEvents[i].localId                        = gObjectEvents[i].localId;\n        questLog->objectEvents[i].mapNum                         = gObjectEvents[i].mapNum;\n        questLog->objectEvents[i].mapGroup                       = gObjectEvents[i].mapGroup;\n        questLog->objectEvents[i].x                              = gObjectEvents[i].currentCoords.x;\n        questLog->objectEvents[i].y                              = gObjectEvents[i].currentCoords.y;\n        questLog->objectEvents[i].trainerRange_berryTreeId       = gObjectEvents[i].trainerRange_berryTreeId;\n        questLog->objectEvents[i].previousMetatileBehavior       = gObjectEvents[i].previousMetatileBehavior;\n        questLog->objectEvents[i].directionSequenceIndex         = gObjectEvents[i].directionSequenceIndex;\n        questLog->objectEvents[i].animId                         = gObjectEvents[i].playerCopyableMovement;\n    }\n}\n\nvoid QL_LoadObjects(const struct QuestLogScene * questLog, const struct ObjectEventTemplate * templates)\n{\n    u32 i, j;\n    const struct QuestLogObjectEvent * questLogObjectEvents = questLog->objectEvents;\n\n    CpuFill16(0, gObjectEvents, sizeof(gObjectEvents));\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        gObjectEvents[i].active                         = questLogObjectEvents[i].active;\n        gObjectEvents[i].triggerGroundEffectsOnStop     = questLogObjectEvents[i].triggerGroundEffectsOnStop;\n        gObjectEvents[i].disableCoveringGroundEffects   = questLogObjectEvents[i].disableCoveringGroundEffects;\n        gObjectEvents[i].landingJump                    = questLogObjectEvents[i].landingJump;\n        gObjectEvents[i].frozen                         = questLogObjectEvents[i].frozen;\n        gObjectEvents[i].facingDirectionLocked          = questLogObjectEvents[i].facingDirectionLocked;\n        gObjectEvents[i].disableAnim                    = questLogObjectEvents[i].disableAnim;\n        gObjectEvents[i].enableAnim                     = questLogObjectEvents[i].enableAnim;\n        gObjectEvents[i].inanimate                      = questLogObjectEvents[i].inanimate;\n        gObjectEvents[i].invisible                      = questLogObjectEvents[i].invisible;\n        gObjectEvents[i].offScreen                      = questLogObjectEvents[i].offScreen;\n        gObjectEvents[i].trackedByCamera                = questLogObjectEvents[i].trackedByCamera;\n        gObjectEvents[i].isPlayer                       = questLogObjectEvents[i].isPlayer;\n        gObjectEvents[i].spriteAnimPausedBackup         = questLogObjectEvents[i].spriteAnimPausedBackup;\n        gObjectEvents[i].spriteAffineAnimPausedBackup   = questLogObjectEvents[i].spriteAffineAnimPausedBackup;\n        gObjectEvents[i].disableJumpLandingGroundEffect = questLogObjectEvents[i].disableJumpLandingGroundEffect;\n        gObjectEvents[i].fixedPriority                  = questLogObjectEvents[i].fixedPriority;\n        gObjectEvents[i].facingDirection                = questLogObjectEvents[i].facingDirection;\n        gObjectEvents[i].currentElevation               = questLogObjectEvents[i].currentElevation;\n        gObjectEvents[i].previousElevation              = questLogObjectEvents[i].previousElevation;\n        gObjectEvents[i].graphicsId                     = questLogObjectEvents[i].graphicsId;\n        gObjectEvents[i].movementType                   = questLogObjectEvents[i].movementType;\n        gObjectEvents[i].trainerType                    = questLogObjectEvents[i].trainerType;\n        gObjectEvents[i].localId                        = questLogObjectEvents[i].localId;\n        gObjectEvents[i].mapNum                         = questLogObjectEvents[i].mapNum;\n        gObjectEvents[i].mapGroup                       = questLogObjectEvents[i].mapGroup;\n        gObjectEvents[i].currentCoords.x                = questLogObjectEvents[i].x;\n        gObjectEvents[i].currentCoords.y                = questLogObjectEvents[i].y;\n        gObjectEvents[i].trainerRange_berryTreeId       = questLogObjectEvents[i].trainerRange_berryTreeId;\n        gObjectEvents[i].previousMetatileBehavior       = questLogObjectEvents[i].previousMetatileBehavior;\n        gObjectEvents[i].directionSequenceIndex         = questLogObjectEvents[i].directionSequenceIndex;\n        gObjectEvents[i].playerCopyableMovement         = questLogObjectEvents[i].animId;\n\n        for (j = 0; j < OBJECT_EVENT_TEMPLATES_COUNT; j++)\n        {\n            if (gObjectEvents[i].localId == templates[j].localId)\n            {\n                gObjectEvents[i].initialCoords.x = templates[j].x + MAP_OFFSET;\n                gObjectEvents[i].initialCoords.y = templates[j].y + MAP_OFFSET;\n                gObjectEvents[i].rangeX = templates[j].objUnion.normal.movementRangeX;\n                gObjectEvents[i].rangeY = templates[j].objUnion.normal.movementRangeY;\n            }\n        }\n\n        gObjectEvents[i].currentMetatileBehavior = MapGridGetMetatileBehaviorAt(gObjectEvents[i].currentCoords.x, gObjectEvents[i].currentCoords.y);\n        if (gObjectEvents[i].previousMetatileBehavior == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x), (s16)(gObjectEvents[i].currentCoords.y)))\n        {\n            gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x;\n            gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y;\n        }\n        else if (gObjectEvents[i].previousMetatileBehavior == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x - 1), (s16)(gObjectEvents[i].currentCoords.y)))\n        {\n            gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x - 1;\n            gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y;\n        }\n        else if (gObjectEvents[i].previousMetatileBehavior == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x + 1), (s16)(gObjectEvents[i].currentCoords.y)))\n        {\n            gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x + 1;\n            gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y;\n        }\n        else if (gObjectEvents[i].previousMetatileBehavior == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x), (s16)(gObjectEvents[i].currentCoords.y - 1)))\n        {\n            gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x;\n            gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y - 1;\n        }\n        else if (gObjectEvents[i].previousMetatileBehavior == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x), (s16)(gObjectEvents[i].currentCoords.y + 1)))\n        {\n            gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x;\n            gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y + 1;\n        }\n    }\n\n    CpuCopy16(gObjectEvents, gSaveBlock1Ptr->objectEvents, sizeof(gObjectEvents));\n}\n\nvoid QL_TryStopSurfing(void)\n{\n    if (gQuestLogState == QL_STATE_PLAYBACK)\n    {\n        s16 x, y;\n\n        PlayerGetDestCoords(&x, &y);\n        if (!MetatileBehavior_IsSurfable(MapGridGetMetatileBehaviorAt(x, y)) && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))\n        {\n            struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n            SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);\n            DestroySprite(&gSprites[objectEvent->fieldEffectSpriteId]);\n        }\n    }\n}\n"
  },
  {
    "path": "src/quest_log_player.c",
    "content": "#include \"global.h\"\n#include \"bike.h\"\n#include \"script.h\"\n#include \"task.h\"\n#include \"field_player_avatar.h\"\n#include \"event_object_movement.h\"\n#include \"field_effect.h\"\n#include \"field_effect_helpers.h\"\n#include \"quest_log.h\"\n#include \"quest_log_player.h\"\n\nstatic void QL_GfxTransition_Normal(void);\nstatic void QL_GfxTransition_Bike(void);\nstatic void QL_GfxTransition_Fish(void);\nstatic void Task_QLFishMovement(u8 taskId);\nstatic void QL_GfxTransition_StartSurf(void);\nstatic void QL_GfxTransition_VSSeeker(void);\nstatic void Task_QLVSSeekerMovement(u8 taskId);\nstatic void QL_GfxTransition_StopSurfSouth(void);\nstatic void QL_GfxTransition_StopSurfNorth(void);\nstatic void QL_GfxTransition_StopSurfWest(void);\nstatic void QL_GfxTransition_StopSurfEast(void);\nstatic void QL_SetObjectGraphicsId(struct ObjectEvent *object, u8 graphicsId);\n\nstatic void (*const sQLGfxTransitions[])(void) = {\n    [QL_PLAYER_GFX_NORMAL]      = QL_GfxTransition_Normal,\n    [QL_PLAYER_GFX_BIKE]        = QL_GfxTransition_Bike,\n    [QL_PLAYER_GFX_FISH]        = QL_GfxTransition_Fish,\n    [QL_PLAYER_GFX_SURF]        = QL_GfxTransition_StartSurf,\n    [QL_PLAYER_GFX_STOP_SURF_S] = QL_GfxTransition_StopSurfSouth,\n    [QL_PLAYER_GFX_STOP_SURF_N] = QL_GfxTransition_StopSurfNorth,\n    [QL_PLAYER_GFX_STOP_SURF_W] = QL_GfxTransition_StopSurfWest,\n    [QL_PLAYER_GFX_STOP_SURF_E] = QL_GfxTransition_StopSurfEast,\n    [QL_PLAYER_GFX_VSSEEKER]    = QL_GfxTransition_VSSeeker\n};\n\nvoid QuestLogUpdatePlayerSprite(u8 state)\n{\n    if (state < NELEMS(sQLGfxTransitions))\n        sQLGfxTransitions[state]();\n}\n\nbool32 QuestLogTryRecordPlayerAvatarGfxTransition(u8 state)\n{\n    if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RECORDING)\n    {\n        QuestLogRecordPlayerAvatarGfxTransition(state);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid QuestLogCallUpdatePlayerSprite(u8 state)\n{\n    return QuestLogUpdatePlayerSprite(state);\n}\n\nstatic void QL_GfxTransition_Normal(void)\n{\n    struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL));\n    ObjectEventTurn(objectEvent, objectEvent->movementDirection);\n    SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT);\n}\n\nstatic void QL_GfxTransition_Bike(void)\n{\n    struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_BIKE));\n    ObjectEventTurn(objectEvent, objectEvent->movementDirection);\n    SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_MACH_BIKE);\n    BikeClearState(0, 0);\n}\n\nstatic void QL_GfxTransition_Fish(void)\n{\n    struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    struct Sprite *sprite = &gSprites[objectEvent->spriteId];\n\n    if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RUNNING || gQuestLogPlaybackState == QL_PLAYBACK_STATE_ACTION_END)\n    {\n        u8 taskId;\n        LockPlayerFieldControls();\n        gPlayerAvatar.preventStep = TRUE;\n        taskId = CreateTask(Task_QLFishMovement, 0xFF);\n        gTasks[taskId].data[0] = 0;\n    }\n    else\n    {\n        QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_FISH));\n        StartSpriteAnim(sprite, GetFishingDirectionAnimNum(objectEvent->facingDirection));\n    }\n}\n\nstatic void Task_QLFishMovement(u8 taskId)\n{\n    struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    struct Sprite *sprite = &gSprites[objectEvent->spriteId];\n\n    switch (gTasks[taskId].data[0])\n    {\n        case 0:\n            ObjectEventClearHeldMovementIfActive(objectEvent);\n            objectEvent->enableAnim = TRUE;\n            QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_FISH));\n            StartSpriteAnim(sprite, GetFishingDirectionAnimNum(objectEvent->facingDirection));\n            gTasks[taskId].data[0]++;\n            gTasks[taskId].data[1] = 0;\n            break;\n        case 1:\n            AlignFishingAnimationFrames(sprite);\n            if (gTasks[taskId].data[1] < 60)\n                gTasks[taskId].data[1]++;\n            else\n                gTasks[taskId].data[0]++;\n            break;\n        case 2:\n            StartSpriteAnim(sprite, GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection()));\n            gTasks[taskId].data[0]++;\n            break;\n        case 3:\n            AlignFishingAnimationFrames(sprite);\n            if (sprite->animEnded)\n            {\n                if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING))\n                    QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL));\n                else\n                    QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE));\n                ObjectEventTurn(objectEvent, objectEvent->movementDirection);\n                sprite->x2 = 0;\n                sprite->y2 = 0;\n                UnlockPlayerFieldControls();\n                DestroyTask(taskId);\n            }\n            break;\n    }\n}\n\nstatic void QL_GfxTransition_StartSurf(void)\n{\n    struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    u8 fieldEffectId;\n\n    if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING))\n    {\n        QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE));\n        ObjectEventTurn(objectEvent, objectEvent->movementDirection);\n        SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING);\n        gFieldEffectArguments[0] = objectEvent->currentCoords.x;\n        gFieldEffectArguments[1] = objectEvent->currentCoords.y;\n        gFieldEffectArguments[2] = gPlayerAvatar.objectEventId;\n        fieldEffectId = FieldEffectStart(FLDEFF_SURF_BLOB);\n        objectEvent->fieldEffectSpriteId = fieldEffectId;\n        SetSurfBlob_BobState(fieldEffectId, BOB_PLAYER_AND_MON);\n    }\n}\n\nstatic void QL_GfxTransition_VSSeeker(void)\n{\n    FieldEffectStart(FLDEFF_USE_VS_SEEKER);\n    CreateTask(Task_QLVSSeekerMovement, 0x00);\n}\n\nstatic void Task_QLVSSeekerMovement(u8 taskId)\n{\n    if (!FieldEffectActiveListContains(FLDEFF_USE_VS_SEEKER))\n    {\n        UnfreezeObjectEvents();\n        UnlockPlayerFieldControls();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void QL_SetObjectGraphicsId(struct ObjectEvent * object, u8 graphicsId)\n{\n    ObjectEventSetGraphicsId(object, graphicsId);\n}\n\nstatic void QL_GfxTransition_StopSurfSouth(void)\n{\n    CreateStopSurfingTask_NoMusicChange(DIR_SOUTH);\n}\n\nstatic void QL_GfxTransition_StopSurfNorth(void)\n{\n    CreateStopSurfingTask_NoMusicChange(DIR_NORTH);\n}\n\nstatic void QL_GfxTransition_StopSurfWest(void)\n{\n    CreateStopSurfingTask_NoMusicChange(DIR_WEST);\n}\n\nstatic void QL_GfxTransition_StopSurfEast(void)\n{\n    CreateStopSurfingTask_NoMusicChange(DIR_EAST);\n}\n"
  },
  {
    "path": "src/random.c",
    "content": "#include \"global.h\"\n#include \"random.h\"\n\n// The number 1103515245 comes from the example implementation\n// of rand and srand in the ISO C standard.\n\nu32 gRngValue;\nu32 gRng2Value;\n\nu16 Random(void)\n{\n    gRngValue = ISO_RANDOMIZE1(gRngValue);\n    return gRngValue >> 16;\n}\n\nvoid SeedRng(u16 seed)\n{\n    gRngValue = seed;\n}\n\nvoid SeedRng2(u16 seed)\n{\n    gRng2Value = seed;\n}\n\nu16 Random2(void)\n{\n    gRng2Value = 1103515245 * gRng2Value + 24691;\n    return gRng2Value >> 16;\n}"
  },
  {
    "path": "src/region_map.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"scanline_effect.h\"\n#include \"task.h\"\n#include \"m4a.h\"\n#include \"overworld.h\"\n#include \"event_data.h\"\n#include \"region_map.h\"\n#include \"party_menu.h\"\n#include \"field_effect.h\"\n#include \"new_menu_helpers.h\"\n#include \"menu.h\"\n#include \"strings.h\"\n#include \"map_preview_screen.h\"\n#include \"constants/songs.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/heal_locations.h\"\n#include \"constants/maps.h\"\n\n#define MAP_WIDTH 22\n#define MAP_HEIGHT 15\n\n#define CANCEL_BUTTON_X 21\n#define CANCEL_BUTTON_Y 13\n\n#define SWITCH_BUTTON_X 21\n#define SWITCH_BUTTON_Y 11\n\nenum {\n    REGIONMAP_KANTO,\n    REGIONMAP_SEVII123,\n    REGIONMAP_SEVII45,\n    REGIONMAP_SEVII67,\n    REGIONMAP_HOENN,\n    REGIONMAP_COUNT\n};\n\nenum {\n    MAPSECTYPE_NONE,\n    MAPSECTYPE_ROUTE,\n    MAPSECTYPE_VISITED,\n    MAPSECTYPE_NOT_VISITED,\n    MAPSECTYPE_UNKNOWN, // Checked but never used\n};\n\nenum {\n    LAYER_MAP,\n    LAYER_DUNGEON,\n    LAYER_COUNT\n};\n\nenum {\n    WIN_MAP_NAME,\n    WIN_DUNGEON_NAME,\n    WIN_MAP_PREVIEW,\n    WIN_TOPBAR_LEFT,\n    WIN_TOPBAR_RIGHT,\n};\n\n#define CLEAR_NAME 2\n\nenum {\n    MAP_INPUT_NONE,\n    MAP_INPUT_MOVE_START,\n    MAP_INPUT_MOVE_CONT,\n    MAP_INPUT_MOVE_END,\n    MAP_INPUT_A_BUTTON,\n    MAP_INPUT_SWITCH,\n    MAP_INPUT_CANCEL\n};\n\nenum {\n    MAPPERM_HAS_SWITCH_BUTTON,\n    MAPPERM_HAS_MAP_PREVIEW,\n    MAPPERM_HAS_OPEN_ANIM,\n    MAPPERM_HAS_FLY_DESTINATIONS,\n    MAPPERM_COUNT\n};\n\nenum {\n    MAPEDGE_TOP_LEFT,\n    MAPEDGE_MID_LEFT,\n    MAPEDGE_BOT_LEFT,\n    MAPEDGE_TOP_RIGHT,\n    MAPEDGE_MID_RIGHT,\n    MAPEDGE_BOT_RIGHT,\n};\n\n#define FREE_IF_NOT_NULL(ptr) ({ \\\n    if (ptr) {                   \\\n        FREE_AND_SET_NULL(ptr);  \\\n    }                            \\\n})\n\nstruct RegionMap\n{\n    u8 mapName[19];\n    u8 dungeonName[19];\n    u16 layouts[REGIONMAP_COUNT + 1][600];\n    // Inefficiency: these should be u8 or have half the elements each\n    u16 bgTilemapBuffers[3][BG_SCREEN_SIZE];\n    u8 type; // REGIONMAP_TYPE_*\n    bool8 permissions[MAPPERM_COUNT];\n    u8 selectedRegion; // REGIONMAP_KANTO, REGIONMAP_SEVII*\n    u8 playersRegion;\n    u8 ALIGNED(4) mainState;\n    u8 ALIGNED(4) openState;\n    u8 ALIGNED(4) loadGfxState;\n    u16 dungeonWinLeft;   // Used by a field that's never read\n    u16 dungeonWinTop;    // Never read\n    u16 dungeonWinRight;  // Never read\n    u16 dungeonWinBottom; // Never read\n    u8 filler[6]; \n    TaskFunc mainTask;\n    MainCallback savedCallback;\n}; // size = 0x47C0\n\nstruct GpuWindowParams\n{\n    u16 left;\n    u16 top;\n    u16 right;\n    u16 bottom;\n};\n\nstruct SwitchMapMenuCursorSubsprite\n{\n    u8 tiles[0x400];\n    struct Sprite *sprite;\n    u16 tileTag;\n    u16 palTag;\n    s16 x;\n};\n\nstruct SwitchMapMenu\n{\n    u8 switchMapTiles[0x1000];\n    u16 switchMapTilemap[600];\n    struct SwitchMapMenuCursorSubsprite cursorSubsprite[2];\n    u8 mainState;\n    u8 cursorLoadState;\n    u8 currentSelection;\n    u8 chosenRegion;\n    u8 maxSelection;\n    u8 alpha;\n    u16 yOffset;\n    TaskFunc exitTask;\n    struct GpuWindowParams highlight;\n    u16 blendY;\n}; // size = 0x1CE0\n\nstruct DungeonMapInfo\n{\n    u16 id;\n    const u8 *name;\n    const u8 *desc;\n};\n\nstruct DungeonMapPreview\n{\n    u16 tiles[7200];\n    u16 tilemap[640];\n    const struct MapPreviewScreen * mapPreviewInfo;\n    TaskFunc savedTask;\n    u8 mainState;\n    u8 drawState;\n    u8 loadState;\n    u8 updateCounter;\n    u8 timer;\n    u16 palette[0x30];\n    u8 filler[0x60];\n    u16 red;\n    u16 green;\n    u16 blue;\n    u16 blendY;\n    u16 left;\n    u16 top;\n    u16 right;\n    u16 bottom;\n    u16 leftIncrement;\n    u16 topIncrement;\n    u16 rightIncrement;\n    u16 bottomIncrement;\n}; // size = 0x3E28\n\nstruct MapEdge\n{\n    u16 tiles[0x200];\n    struct Sprite *sprite;\n    s16 x;\n    s16 y;\n    u16 tileTag;\n    u16 palTag;\n};\n\nstruct MapOpenCloseAnim\n{\n    struct MapEdge * mapEdges[6];\n    u16 tiles[0x400];\n    u16 tilemap[600];\n    TaskFunc exitTask;\n    u8 openState;\n    u8 loadGfxState;\n    u8 moveState;\n    u8 closeState;\n    u8 blendY;\n}; // size = 0xCD4\n\nstruct MapCursor\n{\n    s16 x;\n    s16 y;\n    u16 spriteX;\n    u16 spriteY;\n    s16 horizontalMove;\n    s16 verticalMove;\n    u16 moveCounter;\n    u8 snapId;\n    u8 (*inputHandler)(void);\n    u16 selectedMapsec;\n    u16 selectedMapsecType;\n    u16 selectedDungeonType;\n    struct Sprite *sprite;\n    u16 tileTag;\n    u16 palTag;\n    u16 tiles[0x80];\n}; // size = 0x124\n\nstruct PlayerIcon\n{\n    s16 x;\n    s16 y;\n    struct Sprite *sprite;\n    u16 tileTag;\n    u16 palTag;\n    u16 tiles[0x40];\n}; // size = 0x8C\n\nstruct MapIconSprite\n{\n    u32 unused;\n    u8 region;\n    struct Sprite *sprite;\n    u16 tileTag;\n    u16 palTag;\n};\n\nstruct MapIcons\n{\n    u8 dungeonIconTiles[0x40];\n    u8 flyIconTiles[0x100];\n    struct MapIconSprite dungeonIcons[25];\n    struct MapIconSprite flyIcons[25];\n    u8 region; // Never read\n    u8 unused_1[2];\n    u8 state;\n    u32 unused_2;\n    TaskFunc exitTask;\n}; // size = 0x46C\n\nstruct RegionMapGpuRegs\n{\n    u16 bldcnt;\n    u16 bldy;\n    u16 bldalpha;\n    u16 winin;\n    u16 winout;\n    u16 win0h;\n    u16 win1h;\n    u16 win0v;\n    u16 win1v;\n};\n\nstruct FlyMap\n{\n    u8 state;\n    u8 unused; // Never read\n    bool8 selectedDestination;\n};\n\nstatic EWRAM_DATA struct RegionMap * sRegionMap = NULL;\nstatic EWRAM_DATA struct SwitchMapMenu * sSwitchMapMenu = NULL;\nstatic EWRAM_DATA struct DungeonMapPreview * sDungeonMapPreview = NULL;\nstatic EWRAM_DATA struct MapOpenCloseAnim * sMapOpenCloseAnim = NULL;\nstatic EWRAM_DATA struct MapCursor * sMapCursor = NULL;\nstatic EWRAM_DATA struct PlayerIcon * sPlayerIcon = NULL;\nstatic EWRAM_DATA struct MapIcons * sMapIcons = NULL;\nstatic EWRAM_DATA struct RegionMapGpuRegs * sRegionMapGpuRegs[3] = {};\nstatic EWRAM_DATA struct FlyMap * sFlyMap = NULL;\n\nstatic void InitRegionMapType(void);\nstatic void CB2_OpenRegionMap(void);\nstatic bool8 LoadRegionMapGfx(void);\nstatic void CreateMainMapTask(void);\nstatic void Task_RegionMap(u8);\nstatic void SaveMainMapTask(u8);\nstatic void FreeRegionMap(u8);\nstatic void CB2_RegionMap(void);\nstatic void NullVBlankHBlankCallbacks(void);\nstatic void SetRegionMapVBlankCB(void);\nstatic void InitRegionMapBgs(void);\nstatic void SetBgTilemapBuffers(void);\nstatic void ResetOamForRegionMap(void);\nstatic void SetBg0andBg3Hidden(bool8);\nstatic void UpdateMapsecNameBox(void);\nstatic void DisplayCurrentMapName(void);\nstatic void DrawDungeonNameBox(void);\nstatic void DisplayCurrentDungeonName(void);\nstatic void BufferRegionMapBg(u8, u16 *);\nstatic bool8 GetRegionMapPermission(u8);\nstatic u8 GetSelectedRegionMap(void);\nstatic void InitSwitchMapMenu(u8, u8, TaskFunc);\nstatic void Task_SwitchMapMenu(u8);\nstatic void FreeSwitchMapMenu(u8);\nstatic bool8 BrightenScreenForSwitchMapMenu(void);\nstatic void LoadSwitchMapTilemap(u8, u16 *);\nstatic void SetGpuRegsToDimScreen(void);\nstatic bool8 DimScreenForSwitchMapMenu(void);\nstatic bool8 HandleSwitchMapInput(void);\nstatic bool8 CreateSwitchMapCursor(void);\nstatic void CreateSwitchMapCursorSubsprite(u8, u16, u16);\nstatic void CreateSwitchMapCursorSubsprite_(u8, u16, u16);\nstatic void FreeSwitchMapCursor(void);\nstatic void InitDungeonMapPreview(u8, u8, TaskFunc);\nstatic void Task_DungeonMapPreview(u8);\nstatic void Task_DrawDungeonMapPreviewFlavorText(u8);\nstatic void FreeDungeonMapPreview(u8);\nstatic void InitScreenForDungeonMapPreview(void);\nstatic void CopyMapPreviewTilemapToBgTilemapBuffer(u8, const u16 *);\nstatic bool8 UpdateDungeonMapPreview(bool8);\nstatic void InitMapOpenAnim(u8, TaskFunc);\nstatic void InitScreenForMapOpenAnim(void);\nstatic void Task_MapOpenAnim(u8);\nstatic void FreeMapOpenCloseAnim(void);\nstatic void FreeMapEdgeSprites(void);\nstatic bool8 MoveMapEdgesOutward(void);\nstatic void SetGpuWindowDimsToMapEdges(void);\nstatic void DoMapCloseAnim(u8);\nstatic void Task_MapCloseAnim(u8);\nstatic bool8 MoveMapEdgesInward(void);\nstatic void CreateMapCursor(u16, u16);\nstatic void CreateMapCursorSprite(void);\nstatic void SetMapCursorInvisibility(bool8);\nstatic void ResetCursorSnap(void);\nstatic void FreeMapCursor(void);\nstatic u8 HandleRegionMapInput(void);\nstatic u8 MoveMapCursor(void);\nstatic u8 GetRegionMapInput(void);\nstatic void SnapToIconOrButton(void);\nstatic u16 GetMapCursorX(void);\nstatic u16 GetMapCursorY(void);\nstatic u16 GetMapsecUnderCursor(void);\nstatic u16 GetDungeonMapsecUnderCursor(void);\nstatic u8 GetMapsecType(u8);\nstatic u8 GetDungeonMapsecType(u8);\nstatic u8 GetSelectedMapsecType(u8);\nstatic void GetPlayerPositionOnRegionMap_HandleOverrides(void);\nstatic u8 GetSelectedMapSection(u8, u8, s16, s16);\nstatic void CreatePlayerIcon(u16, u16);\nstatic void CreatePlayerIconSprite(void);\nstatic void SetPlayerIconInvisibility(bool8);\nstatic void FreePlayerIcon(void);\nstatic u16 GetPlayerIconX(void);\nstatic u16 GetPlayerIconY(void);\nstatic void InitMapIcons(u8, u8, TaskFunc);\nstatic void LoadMapIcons(u8);\nstatic void FinishMapIconLoad(u8);\nstatic void CreateFlyIcons(void);\nstatic void CreateDungeonIcons(void);\nstatic void SetFlyIconInvisibility(u8, u8, bool8);\nstatic void SetDungeonIconInvisibility(u8, u8, bool8);\nstatic void FreeMapIcons(void);\nstatic bool8 SaveRegionMapGpuRegs(u8);\nstatic bool8 SetRegionMapGpuRegs(u8);\nstatic void ResetGpuRegs(void);\nstatic void SetBldCnt(u8, u16, u16);\nstatic void SetBldY(u16);\nstatic void SetBldAlpha(u16, u16);\nstatic void SetWinIn(u16, u16);\nstatic void SetWinOut(u16);\nstatic void SetDispCnt(u8, bool8);\nstatic void SetGpuWindowDims(u8, const struct GpuWindowParams *);\nstatic void FreeAndResetGpuRegs(void);\nstatic void PrintTopBarTextLeft(const u8 *);\nstatic void PrintTopBarTextRight(const u8 *);\nstatic void ClearOrDrawTopBar(bool8);\nstatic void Task_FlyMap(u8);\nstatic void InitFlyMap(void);\nstatic void FreeFlyMap(u8);\nstatic void SetFlyWarpDestination(u16);\n\n#include \"data/region_map/region_map_entry_strings.h\"\n\nstatic const u16 sTopBar_Pal[] = INCBIN_U16(\"graphics/region_map/top_bar.gbapal\"); // Palette for the top bar and dynamic text color\nstatic const u16 sMapCursor_Pal[] = INCBIN_U16(\"graphics/region_map/cursor.gbapal\");\nstatic const u16 sPlayerIcon_RedPal[] = INCBIN_U16(\"graphics/region_map/player_icon_red.gbapal\");\nstatic const u16 sPlayerIcon_LeafPal[] = INCBIN_U16(\"graphics/region_map/player_icon_leaf.gbapal\");\nstatic const u16 sMiscIcon_Pal[] = INCBIN_U16(\"graphics/region_map/misc_icon.gbapal\"); // For dungeon and fly icons\nstatic const u16 sRegionMap_Pal[] = INCBIN_U16(\"graphics/region_map/region_map.gbapal\");\nstatic const u16 sUnusedPalette[] = { RGB(0, 0, 31), RGB(0, 12, 31), RGB_WHITE, RGB_WHITE };\nstatic const u16 sSwitchMapCursor_Pal[] = INCBIN_U16(\"graphics/region_map/switch_map_cursor.gbapal\");\nstatic const u16 sMapEdge_Pal[] = INCBIN_U16(\"graphics/region_map/map_edge.gbapal\");\nstatic const u32 sSwitchMapCursorLeft_Gfx[] = INCBIN_U32(\"graphics/region_map/switch_map_cursor_left.4bpp.lz\");\nstatic const u32 sSwitchMapCursorRight_Gfx[] = INCBIN_U32(\"graphics/region_map/switch_map_cursor_right.4bpp.lz\");\nstatic const u32 sMapCursor_Gfx[] = INCBIN_U32(\"graphics/region_map/cursor.4bpp.lz\");\nstatic const u32 sPlayerIcon_Red[] = INCBIN_U32(\"graphics/region_map/player_icon_red.4bpp.lz\");\nstatic const u32 sPlayerIcon_Leaf[] = INCBIN_U32(\"graphics/region_map/player_icon_leaf.4bpp.lz\");\nstatic const u32 sRegionMap_Gfx[] = INCBIN_U32(\"graphics/region_map/region_map.4bpp.lz\");\nstatic const u32 sMapEdge_Gfx[] = INCBIN_U32(\"graphics/region_map/map_edge.4bpp.lz\");\nstatic const u32 sSwitchMapMenu_Gfx[] = INCBIN_U32(\"graphics/region_map/switch_map_menu.4bpp.lz\");\nstatic const u32 sKanto_Tilemap[] = INCBIN_U32(\"graphics/region_map/kanto.bin.lz\");\nstatic const u32 sSevii123_Tilemap[] = INCBIN_U32(\"graphics/region_map/sevii_123.bin.lz\");\nstatic const u32 sSevii45_Tilemap[] = INCBIN_U32(\"graphics/region_map/sevii_45.bin.lz\");\nstatic const u32 sSevii67_Tilemap[] = INCBIN_U32(\"graphics/region_map/sevii_67.bin.lz\");\nstatic const u32 sMapEdge_Tilemap[] = INCBIN_U32(\"graphics/region_map/map_edge.bin.lz\");\nstatic const u32 sSwitchMap_KantoSeviiAll_Tilemap[] = INCBIN_U32(\"graphics/region_map/switch_map_kanto_sevii_all.bin.lz\");\nstatic const u32 sSwitchMap_KantoSevii123_Tilemap[] = INCBIN_U32(\"graphics/region_map/switch_map_kanto_sevii_123.bin.lz\");\nstatic const u32 sSwitchMap_KantoSeviiAll2_Tilemap[] = INCBIN_U32(\"graphics/region_map/switch_map_kanto_sevii_all2.bin.lz\");\nstatic const u32 sMapEdge_TopLeft[] = INCBIN_U32(\"graphics/region_map/map_edge_top_left.4bpp.lz\");\nstatic const u32 sMapEdge_TopRight[] = INCBIN_U32(\"graphics/region_map/map_edge_top_right.4bpp.lz\");\nstatic const u32 sMapEdge_MidLeft[] = INCBIN_U32(\"graphics/region_map/map_edge_mid_left.4bpp.lz\");\nstatic const u32 sMapEdge_MidRight[] = INCBIN_U32(\"graphics/region_map/map_edge_mid_right.4bpp.lz\");\nstatic const u32 sMapEdge_BottomLeft[] = INCBIN_U32(\"graphics/region_map/map_edge_bottom_left.4bpp.lz\");\nstatic const u32 sMapEdge_BottomRight[] = INCBIN_U32(\"graphics/region_map/map_edge_bottom_right.4bpp.lz\");\nstatic const u32 sDungeonIcon[] = INCBIN_U32(\"graphics/region_map/dungeon_icon.4bpp.lz\");\nstatic const u32 sFlyIcon[] = INCBIN_U32(\"graphics/region_map/fly_icon.4bpp.lz\");\nstatic const u32 sBackground_Gfx[] = INCBIN_U32(\"graphics/region_map/background.4bpp.lz\");\nstatic const u32 sBackground_Tilemap[] = INCBIN_U32(\"graphics/region_map/background.bin.lz\");\nstatic const u32 sHoennRegionMap_Gfx[] = INCBIN_U32(\"graphics/region_map/region_map_hoenn.8bpp.lz\");\nstatic const u16 sHoennRegionMap_Pal[] = INCBIN_U16(\"graphics/region_map/region_map_hoenn.gbapal\");\nstatic const u32 sHoenn_Tilemap[] = INCBIN_U32(\"graphics/region_map/hoenn.bin.lz\");\n\nstatic const struct BgTemplate sHoennRegionMapBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 28,\n        .screenSize = 2,\n        .paletteMode = 1,\n        .priority = 2,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 15,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 23,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    }, {\n        .bg = 3,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct BgTemplate sRegionMapBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 15,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 23,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    }, {\n        .bg = 3,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct WindowTemplate sRegionMapWindowTemplates[] = {\n    [WIN_MAP_NAME] = \n    {\n        .bg = 3,\n        .tilemapLeft = 3,\n        .tilemapTop = 2,\n        .width = 15,\n        .height = 2,\n        .paletteNum = 12,\n        .baseBlock = 0x001\n    }, \n    [WIN_DUNGEON_NAME] =\n    {\n        .bg = 3,\n        .tilemapLeft = 3,\n        .tilemapTop = 4,\n        .width = 15,\n        .height = 2,\n        .paletteNum = 12,\n        .baseBlock = 0x01f\n    }, \n    [WIN_MAP_PREVIEW] =\n    {\n        .bg = 3,\n        .tilemapLeft = 3,\n        .tilemapTop = 6,\n        .width = 25,\n        .height = 11,\n        .paletteNum = 12,\n        .baseBlock = 0x03d\n    },\n    [WIN_TOPBAR_LEFT] =\n    {\n        .bg = 3,\n        .tilemapLeft = 18,\n        .tilemapTop = 0,\n        .width = 5,\n        .height = 2,\n        .paletteNum = 12,\n        .baseBlock = 0x150\n    }, \n    [WIN_TOPBAR_RIGHT] =\n    {\n        .bg = 3,\n        .tilemapLeft = 24,\n        .tilemapTop = 0,\n        .width = 5,\n        .height = 2,\n        .paletteNum = 12,\n        .baseBlock = 0x15a\n    }, DUMMY_WIN_TEMPLATE\n};\n\nALIGNED(4) const u8 sTextColor_White[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE,       TEXT_COLOR_DARK_GRAY};\nALIGNED(4) const u8 sTextColor_Green[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GREEN, TEXT_COLOR_DARK_GRAY};\nALIGNED(4) const u8 sTextColor_Red[]   = {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_1,   TEXT_COLOR_DARK_GRAY};\n\nstatic const u8 *const sTextColorTable[] = {\n    [MAPSECTYPE_VISITED - 2]     = sTextColor_Green,\n    [MAPSECTYPE_NOT_VISITED - 2] = sTextColor_Red\n};\n\nstatic const u8 sSeviiMapsecs[3][30] = {\n    [REGIONMAP_SEVII123 - 1] =\n    {\n        MAPSEC_ONE_ISLAND,\n        MAPSEC_TWO_ISLAND,\n        MAPSEC_THREE_ISLAND,\n        MAPSEC_KINDLE_ROAD,\n        MAPSEC_TREASURE_BEACH,\n        MAPSEC_CAPE_BRINK,\n        MAPSEC_BOND_BRIDGE,\n        MAPSEC_THREE_ISLE_PORT,\n        MAPSEC_MT_EMBER,\n        MAPSEC_BERRY_FOREST,\n        MAPSEC_THREE_ISLE_PATH,\n        MAPSEC_EMBER_SPA,\n        MAPSEC_NONE\n    }, \n    [REGIONMAP_SEVII45 - 1] =\n    {\n        MAPSEC_FOUR_ISLAND,\n        MAPSEC_FIVE_ISLAND,\n        MAPSEC_SEVII_ISLE_6,\n        MAPSEC_SEVII_ISLE_7,\n        MAPSEC_SEVII_ISLE_8,\n        MAPSEC_SEVII_ISLE_9,\n        MAPSEC_RESORT_GORGEOUS,\n        MAPSEC_WATER_LABYRINTH,\n        MAPSEC_FIVE_ISLE_MEADOW,\n        MAPSEC_MEMORIAL_PILLAR,\n        MAPSEC_NAVEL_ROCK,\n        MAPSEC_ICEFALL_CAVE,\n        MAPSEC_ROCKET_WAREHOUSE,\n        MAPSEC_LOST_CAVE,\n        MAPSEC_NONE\n    }, \n    [REGIONMAP_SEVII67 - 1] = \n    {\n        MAPSEC_SEVEN_ISLAND,\n        MAPSEC_SIX_ISLAND,\n        MAPSEC_OUTCAST_ISLAND,\n        MAPSEC_GREEN_PATH,\n        MAPSEC_WATER_PATH,\n        MAPSEC_RUIN_VALLEY,\n        MAPSEC_TRAINER_TOWER,\n        MAPSEC_CANYON_ENTRANCE,\n        MAPSEC_SEVAULT_CANYON,\n        MAPSEC_TANOBY_RUINS,\n        MAPSEC_SEVII_ISLE_22,\n        MAPSEC_SEVII_ISLE_23,\n        MAPSEC_SEVII_ISLE_24,\n        MAPSEC_TRAINER_TOWER_2,\n        MAPSEC_DOTTED_HOLE,\n        MAPSEC_PATTERN_BUSH,\n        MAPSEC_ALTERING_CAVE,\n        MAPSEC_TANOBY_CHAMBERS,\n        MAPSEC_TANOBY_KEY,\n        MAPSEC_BIRTH_ISLAND,\n        MAPSEC_MONEAN_CHAMBER,\n        MAPSEC_LIPTOO_CHAMBER,\n        MAPSEC_WEEPTH_CHAMBER,\n        MAPSEC_DILFORD_CHAMBER,\n        MAPSEC_SCUFIB_CHAMBER,\n        MAPSEC_RIXY_CHAMBER,\n        MAPSEC_VIAPOIS_CHAMBER,\n        MAPSEC_NONE\n    }\n};\n\nALIGNED(4) static const bool8 sRegionMapPermissions[REGIONMAP_TYPE_COUNT][MAPPERM_COUNT] = {\n    [REGIONMAP_TYPE_NORMAL] = \n    {\n        [MAPPERM_HAS_SWITCH_BUTTON]    = TRUE, \n        [MAPPERM_HAS_MAP_PREVIEW]      = TRUE, \n        [MAPPERM_HAS_OPEN_ANIM]        = TRUE, \n        [MAPPERM_HAS_FLY_DESTINATIONS] = FALSE\n    },\n    [REGIONMAP_TYPE_WALL] = \n    {\n        [MAPPERM_HAS_SWITCH_BUTTON]    = FALSE, \n        [MAPPERM_HAS_MAP_PREVIEW]      = FALSE, \n        [MAPPERM_HAS_OPEN_ANIM]        = FALSE, \n        [MAPPERM_HAS_FLY_DESTINATIONS] = FALSE\n    },\n    [REGIONMAP_TYPE_FLY] = \n    {\n        [MAPPERM_HAS_SWITCH_BUTTON]    = FALSE, \n        [MAPPERM_HAS_MAP_PREVIEW]      = FALSE, \n        [MAPPERM_HAS_OPEN_ANIM]        = FALSE, \n        [MAPPERM_HAS_FLY_DESTINATIONS] = TRUE \n    },\n    [REGIONMAP_TYPE_HOENN] = \n    {\n        [MAPPERM_HAS_SWITCH_BUTTON]    = FALSE, \n        [MAPPERM_HAS_MAP_PREVIEW]      = FALSE, \n        [MAPPERM_HAS_OPEN_ANIM]        = FALSE, \n        [MAPPERM_HAS_FLY_DESTINATIONS] = FALSE\n    },\n};\n\nstatic const struct GpuWindowParams sMapsecNameWindowDims[3] = {\n    [WIN_MAP_NAME]     = {.left = 24, .top = 16, .right = 144, .bottom = 32},\n    [WIN_DUNGEON_NAME] = {.left = 24, .top = 32, .right = 144, .bottom = 48},\n    [CLEAR_NAME]       = {.left =  0, .top =  0, .right =   0, .bottom =  0}\n};\n\nstatic const struct OamData sOamData_SwitchMapCursor = {\n    .shape = SPRITE_SHAPE(32x32),\n    .size = SPRITE_SIZE(32x32)\n};\n\nstatic const union AnimCmd sAnim_SwitchMapCursor[] = {\n    ANIMCMD_FRAME(0, 20),\n    ANIMCMD_FRAME(16, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_SwitchMapCursor[] = {\n    sAnim_SwitchMapCursor\n};\n\nstatic const struct DungeonMapInfo sDungeonInfo[] = {\n    {\n        .id = MAPSEC_VIRIDIAN_FOREST,\n        .name = sMapsecName_VIRIDIANFOREST,\n        .desc = gText_RegionMap_AreaDesc_ViridianForest\n    }, {\n        .id = MAPSEC_MT_MOON,\n        .name = sMapsecName_MTMOON,\n        .desc = gText_RegionMap_AreaDesc_MtMoon\n    }, {\n        .id = MAPSEC_DIGLETTS_CAVE,\n        .name = sMapsecName_DIGLETTSCAVE,\n        .desc = gText_RegionMap_AreaDesc_DiglettsCave\n    }, {\n        .id = MAPSEC_KANTO_VICTORY_ROAD,\n        .name = sMapsecName_VICTORYROAD,\n        .desc = gText_RegionMap_AreaDesc_VictoryRoad\n    }, {\n        .id = MAPSEC_POKEMON_MANSION,\n        .name = sMapsecName_POKMONMANSION,\n        .desc = gText_RegionMap_AreaDesc_PokemonMansion\n    }, {\n        .id = MAPSEC_KANTO_SAFARI_ZONE,\n        .name = sMapsecName_SAFARIZONE,\n        .desc = gText_RegionMap_AreaDesc_SafariZone\n    }, {\n        .id = MAPSEC_ROCK_TUNNEL,\n        .name = sMapsecName_ROCKTUNNEL,\n        .desc = gText_RegionMap_AreaDesc_RockTunnel\n    }, {\n        .id = MAPSEC_SEAFOAM_ISLANDS,\n        .name = sMapsecName_SEAFOAMISLANDS,\n        .desc = gText_RegionMap_AreaDesc_SeafoamIslands\n    }, {\n        .id = MAPSEC_POKEMON_TOWER,\n        .name = sMapsecName_POKMONTOWER,\n        .desc = gText_RegionMap_AreaDesc_PokemonTower\n    }, {\n        .id = MAPSEC_CERULEAN_CAVE,\n        .name = sMapsecName_CERULEANCAVE,\n        .desc = gText_RegionMap_AreaDesc_CeruleanCave\n    }, {\n        .id = MAPSEC_POWER_PLANT,\n        .name = sMapsecName_POWERPLANT,\n        .desc = gText_RegionMap_AreaDesc_PowerPlant\n    }, {\n        .id = MAPSEC_MT_EMBER,\n        .name = sMapsecName_MTEMBER,\n        .desc = gText_RegionMap_AreaDesc_MtEmber\n    }, {\n        .id = MAPSEC_BERRY_FOREST,\n        .name = sMapsecName_BERRYFOREST,\n        .desc = gText_RegionMap_AreaDesc_BerryForest\n    }, {\n        .id = MAPSEC_ICEFALL_CAVE,\n        .name = sMapsecName_ICEFALLCAVE,\n        .desc = gText_RegionMap_AreaDesc_IcefallCave\n    }, {\n        .id = MAPSEC_LOST_CAVE,\n        .name = sMapsecName_LOSTCAVE,\n        .desc = gText_RegionMap_AreaDesc_LostCave\n    }, {\n        .id = MAPSEC_TANOBY_CHAMBERS,\n        .name = sMapsecName_TANOBYCHAMBERS,\n        .desc = gText_RegionMap_AreaDesc_TanobyRuins\n    }, {\n        .id = MAPSEC_ALTERING_CAVE,\n        .name = sMapsecName_ALTERINGCAVE,\n        .desc = gText_RegionMap_AreaDesc_AlteringCave\n    }, {\n        .id = MAPSEC_PATTERN_BUSH,\n        .name = sMapsecName_PATTERNBUSH,\n        .desc = gText_RegionMap_AreaDesc_PatternBush\n    }, {\n        .id = MAPSEC_DOTTED_HOLE,\n        .name = sMapsecName_DOTTEDHOLE,\n        .desc = gText_RegionMap_AreaDesc_DottedHole\n    }\n};\n\nstatic const struct OamData sOamData_MapEdge = {\n    .shape = SPRITE_SHAPE(32x64),\n    .size = SPRITE_SIZE(32x64)\n};\n\nstatic const union AnimCmd sAnim_MapEdge[] = {\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_MapEdge[] = {\n    sAnim_MapEdge\n};\n\nstatic const struct GpuWindowParams sMapWindowDim = {\n    .left = 24, \n    .top = 16, \n    .right = 216, \n    .bottom = 160\n};\n\nstatic const struct OamData sOamData_MapCursor = {\n    .shape = SPRITE_SHAPE(16x16),\n    .size = SPRITE_SIZE(16x16),\n    .priority = 2\n};\n\nstatic const union AnimCmd sAnim_MapCursor[] = {\n    ANIMCMD_FRAME(0, 20),\n    ANIMCMD_FRAME(4, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_MapCursor[] = {\n    sAnim_MapCursor\n};\n\nstatic const struct OamData sOamData_PlayerIcon = {\n    .shape = SPRITE_SHAPE(16x16),\n    .size = SPRITE_SIZE(16x16),\n    .priority = 2\n};\n\nstatic const union AnimCmd sAnim_PlayerIcon[] = {\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_PlayerIcon[] = {\n    sAnim_PlayerIcon\n};\n\nstatic const struct OamData sOamData_FlyIcon = {\n    .shape = SPRITE_SHAPE(16x16),\n    .size = SPRITE_SIZE(16x16),\n    .priority = 2\n};\n\nstatic const struct OamData sOamData_DungeonIcon = {\n    .shape = SPRITE_SHAPE(8x8),\n    .size = SPRITE_SIZE(8x8),\n    .priority = 2\n};\n\nstatic const union AnimCmd sAnim_FlyIcon[] = {\n    ANIMCMD_FRAME(0, 30),\n    ANIMCMD_FRAME(4, 60),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_DungeonIconVisited[] = {\n    ANIMCMD_FRAME(1, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnim_DungeonIconNotVisited[] = {\n    ANIMCMD_FRAME(0, 20),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnims_FlyIcon[] = {\n    sAnim_FlyIcon\n};\n\nstatic const union AnimCmd *const sAnims_DungeonIcon[] = {\n    sAnim_DungeonIconVisited,\n    sAnim_DungeonIconNotVisited\n};\n\nstatic const u16 sWinFlags[] = {\n    DISPCNT_WIN0_ON,\n    DISPCNT_WIN1_ON\n};\n\nstatic const u8 sWinRegs[][2] = {\n    {REG_OFFSET_WIN0V, REG_OFFSET_WIN0H},\n    {REG_OFFSET_WIN1V, REG_OFFSET_WIN1H}\n};\n\nstatic const u8 sTextColors[] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY};\n\n#include \"data/region_map/region_map_entries.h\"\n#include \"data/region_map/region_map_layout_kanto.h\"\n#include \"data/region_map/region_map_layout_sevii_123.h\"\n#include \"data/region_map/region_map_layout_sevii_45.h\"\n#include \"data/region_map/region_map_layout_sevii_67.h\"\n\nstatic const u8 sMapFlyDestinations[][3] = {\n    [MAPSEC_PALLET_TOWN         ] = {MAP(PALLET_TOWN),                           SPAWN_PALLET_TOWN},\n    [MAPSEC_VIRIDIAN_CITY       ] = {MAP(VIRIDIAN_CITY),                         SPAWN_VIRIDIAN_CITY},\n    [MAPSEC_PEWTER_CITY         ] = {MAP(PEWTER_CITY),                           SPAWN_PEWTER_CITY},\n    [MAPSEC_CERULEAN_CITY       ] = {MAP(CERULEAN_CITY),                         SPAWN_CERULEAN_CITY},\n    [MAPSEC_LAVENDER_TOWN       ] = {MAP(LAVENDER_TOWN),                         SPAWN_LAVENDER_TOWN},\n    [MAPSEC_VERMILION_CITY      ] = {MAP(VERMILION_CITY),                        SPAWN_VERMILION_CITY},\n    [MAPSEC_CELADON_CITY        ] = {MAP(CELADON_CITY),                          SPAWN_CELADON_CITY},\n    [MAPSEC_FUCHSIA_CITY        ] = {MAP(FUCHSIA_CITY),                          SPAWN_FUCHSIA_CITY},\n    [MAPSEC_CINNABAR_ISLAND     ] = {MAP(CINNABAR_ISLAND),                       SPAWN_CINNABAR_ISLAND},\n    [MAPSEC_INDIGO_PLATEAU      ] = {MAP(INDIGO_PLATEAU_EXTERIOR),               SPAWN_INDIGO_PLATEAU},\n    [MAPSEC_SAFFRON_CITY        ] = {MAP(SAFFRON_CITY),                          SPAWN_SAFFRON_CITY},\n    [MAPSEC_ROUTE_4_POKECENTER  ] = {MAP(ROUTE4),                                SPAWN_ROUTE4},\n    [MAPSEC_ROUTE_10_POKECENTER ] = {MAP(ROUTE10),                               SPAWN_ROUTE10},\n    [MAPSEC_ROUTE_1             ] = {MAP(ROUTE1),                                0},\n    [MAPSEC_ROUTE_2             ] = {MAP(ROUTE2),                                0},\n    [MAPSEC_ROUTE_3             ] = {MAP(ROUTE3),                                0},\n    [MAPSEC_ROUTE_4             ] = {MAP(ROUTE4),                                0},\n    [MAPSEC_ROUTE_5             ] = {MAP(ROUTE5),                                0},\n    [MAPSEC_ROUTE_6             ] = {MAP(ROUTE6),                                0},\n    [MAPSEC_ROUTE_7             ] = {MAP(ROUTE7),                                0},\n    [MAPSEC_ROUTE_8             ] = {MAP(ROUTE8),                                0},\n    [MAPSEC_ROUTE_9             ] = {MAP(ROUTE9),                                0},\n    [MAPSEC_ROUTE_10            ] = {MAP(ROUTE10),                               0},\n    [MAPSEC_ROUTE_11            ] = {MAP(ROUTE11),                               0},\n    [MAPSEC_ROUTE_12            ] = {MAP(ROUTE12),                               0},\n    [MAPSEC_ROUTE_13            ] = {MAP(ROUTE13),                               0},\n    [MAPSEC_ROUTE_14            ] = {MAP(ROUTE14),                               0},\n    [MAPSEC_ROUTE_15            ] = {MAP(ROUTE15),                               0},\n    [MAPSEC_ROUTE_16            ] = {MAP(ROUTE16),                               0},\n    [MAPSEC_ROUTE_17            ] = {MAP(ROUTE17),                               0},\n    [MAPSEC_ROUTE_18            ] = {MAP(ROUTE18),                               0},\n    [MAPSEC_ROUTE_19            ] = {MAP(ROUTE19),                               0},\n    [MAPSEC_ROUTE_20            ] = {MAP(ROUTE20),                               0},\n    [MAPSEC_ROUTE_21            ] = {MAP(ROUTE21_NORTH),                         0},\n    [MAPSEC_ROUTE_22            ] = {MAP(ROUTE22),                               0},\n    [MAPSEC_ROUTE_23            ] = {MAP(ROUTE23),                               0},\n    [MAPSEC_ROUTE_24            ] = {MAP(ROUTE24),                               0},\n    [MAPSEC_ROUTE_25            ] = {MAP(ROUTE25),                               0},\n    [MAPSEC_VIRIDIAN_FOREST     ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_MT_MOON             ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_S_S_ANNE            ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_UNDERGROUND_PATH    ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_UNDERGROUND_PATH_2  ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_DIGLETTS_CAVE       ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_KANTO_VICTORY_ROAD  ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_ROCKET_HIDEOUT      ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_SILPH_CO            ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_POKEMON_MANSION     ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_KANTO_SAFARI_ZONE   ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_POKEMON_LEAGUE      ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_ROCK_TUNNEL         ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_SEAFOAM_ISLANDS     ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_POKEMON_TOWER       ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_CERULEAN_CAVE       ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_POWER_PLANT         ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_ONE_ISLAND          ] = {MAP(ONE_ISLAND),                            SPAWN_ONE_ISLAND},\n    [MAPSEC_TWO_ISLAND          ] = {MAP(TWO_ISLAND),                            SPAWN_TWO_ISLAND},\n    [MAPSEC_THREE_ISLAND        ] = {MAP(THREE_ISLAND),                          SPAWN_THREE_ISLAND},\n    [MAPSEC_FOUR_ISLAND         ] = {MAP(FOUR_ISLAND),                           SPAWN_FOUR_ISLAND},\n    [MAPSEC_FIVE_ISLAND         ] = {MAP(FIVE_ISLAND),                           SPAWN_FIVE_ISLAND},\n    [MAPSEC_SEVEN_ISLAND        ] = {MAP(SEVEN_ISLAND),                          SPAWN_SEVEN_ISLAND},\n    [MAPSEC_SIX_ISLAND          ] = {MAP(SIX_ISLAND),                            SPAWN_SIX_ISLAND},\n    [MAPSEC_KINDLE_ROAD         ] = {MAP(ONE_ISLAND_KINDLE_ROAD),                0},\n    [MAPSEC_TREASURE_BEACH      ] = {MAP(ONE_ISLAND_TREASURE_BEACH),             0},\n    [MAPSEC_CAPE_BRINK          ] = {MAP(TWO_ISLAND_CAPE_BRINK),                 0},\n    [MAPSEC_BOND_BRIDGE         ] = {MAP(THREE_ISLAND_BOND_BRIDGE),              0},\n    [MAPSEC_THREE_ISLE_PORT     ] = {MAP(THREE_ISLAND_PORT),                     0},\n    [MAPSEC_SEVII_ISLE_6        ] = {MAP(PROTOTYPE_SEVII_ISLE_6),                0},\n    [MAPSEC_SEVII_ISLE_7        ] = {MAP(PROTOTYPE_SEVII_ISLE_7),                0},\n    [MAPSEC_SEVII_ISLE_8        ] = {MAP(PROTOTYPE_SEVII_ISLE_8),                0},\n    [MAPSEC_SEVII_ISLE_9        ] = {MAP(PROTOTYPE_SEVII_ISLE_9),                0},\n    [MAPSEC_RESORT_GORGEOUS     ] = {MAP(FIVE_ISLAND_RESORT_GORGEOUS),           0},\n    [MAPSEC_WATER_LABYRINTH     ] = {MAP(FIVE_ISLAND_WATER_LABYRINTH),           0},\n    [MAPSEC_FIVE_ISLE_MEADOW    ] = {MAP(FIVE_ISLAND_MEADOW),                    0},\n    [MAPSEC_MEMORIAL_PILLAR     ] = {MAP(FIVE_ISLAND_MEMORIAL_PILLAR),           0},\n    [MAPSEC_OUTCAST_ISLAND      ] = {MAP(SIX_ISLAND_OUTCAST_ISLAND),             0},\n    [MAPSEC_GREEN_PATH          ] = {MAP(SIX_ISLAND_GREEN_PATH),                 0},\n    [MAPSEC_WATER_PATH          ] = {MAP(SIX_ISLAND_WATER_PATH),                 0},\n    [MAPSEC_RUIN_VALLEY         ] = {MAP(SIX_ISLAND_RUIN_VALLEY),                0},\n    [MAPSEC_TRAINER_TOWER       ] = {MAP(SEVEN_ISLAND_TRAINER_TOWER),            0},\n    [MAPSEC_CANYON_ENTRANCE     ] = {MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE),  0},\n    [MAPSEC_SEVAULT_CANYON      ] = {MAP(SEVEN_ISLAND_SEVAULT_CANYON),           0},\n    [MAPSEC_TANOBY_RUINS        ] = {MAP(SEVEN_ISLAND_TANOBY_RUINS),             0},\n    [MAPSEC_SEVII_ISLE_22       ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_SEVII_ISLE_23       ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_SEVII_ISLE_24       ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_NAVEL_ROCK          ] = {MAP(NAVEL_ROCK_EXTERIOR),                   0},\n    [MAPSEC_MT_EMBER            ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_BERRY_FOREST        ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_ICEFALL_CAVE        ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_ROCKET_WAREHOUSE    ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_TRAINER_TOWER_2     ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_DOTTED_HOLE         ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_LOST_CAVE           ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_PATTERN_BUSH        ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_ALTERING_CAVE       ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_TANOBY_CHAMBERS     ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_THREE_ISLE_PATH     ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_TANOBY_KEY          ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_BIRTH_ISLAND        ] = {MAP(BIRTH_ISLAND_EXTERIOR),                 0},\n    [MAPSEC_MONEAN_CHAMBER      ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_LIPTOO_CHAMBER      ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_WEEPTH_CHAMBER      ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_DILFORD_CHAMBER     ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_SCUFIB_CHAMBER      ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_RIXY_CHAMBER        ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_VIAPOIS_CHAMBER     ] = {MAP(PALLET_TOWN),                           0},\n    [MAPSEC_EMBER_SPA           ] = {MAP(PALLET_TOWN),                           0},\n};\n\nstatic void RegionMap_DarkenPalette(u16 *pal, u16 size, u16 tint)\n{\n    int i;\n    int r, g, b;\n\n    for (i = 0; i < size; i++)\n    {\n        r = (*pal) & 0x1F;\n        g = ((*pal) >> 5) & 0x1F;\n        b = ((*pal) >> 10) & 0x1F;\n\n        r = (((r << 8) / 100) * tint) >> 8;\n        g = (((g << 8) / 100) * tint) >> 8;\n        b = (((b << 8) / 100) * tint) >> 8;\n\n        *pal = RGB2(r, g, b);\n        pal++;\n    }\n}\n\nstatic void TintMapEdgesPalette(void)\n{\n    u16 mapEdgesPal[16];\n    CpuCopy16(&sRegionMap_Pal[0x20], mapEdgesPal, sizeof(mapEdgesPal));\n    RegionMap_DarkenPalette(mapEdgesPal, NELEMS(mapEdgesPal), 95);\n    LoadPalette(mapEdgesPal, BG_PLTT_ID(2), sizeof(mapEdgesPal));\n    LoadPalette(&sRegionMap_Pal[0x2F], BG_PLTT_ID(2) + 15, PLTT_SIZEOF(1));\n}\n\nstatic void InitRegionMap(u8 type)\n{\n    sRegionMap = AllocZeroed(sizeof(struct RegionMap));\n    if (sRegionMap == NULL)\n    {\n        SetMainCallback2(CB2_ReturnToField);\n    }\n    else\n    {\n        gExitStairsMovementDisabled = TRUE;\n        sRegionMap->type = type;\n        sRegionMap->mainState = 0;\n        sRegionMap->openState = 0;\n        sRegionMap->loadGfxState = 0;\n        InitRegionMapType();\n        SetMainCallback2(CB2_OpenRegionMap);\n    }\n}\n\nvoid InitRegionMapWithExitCB(u8 type, MainCallback cb)\n{\n    sRegionMap = AllocZeroed(sizeof(struct RegionMap));\n    if (sRegionMap == NULL)\n    {\n        SetMainCallback2(CB2_ReturnToField);\n    }\n    else\n    {\n        gExitStairsMovementDisabled = TRUE;\n        sRegionMap->type = type;\n        sRegionMap->mainState = 0;\n        sRegionMap->openState = 0;\n        sRegionMap->loadGfxState = 0;\n        sRegionMap->savedCallback = cb;\n        InitRegionMapType();\n        SetMainCallback2(CB2_OpenRegionMap);\n    }\n}\n\nstatic void InitRegionMapType(void)\n{\n    u32 i;\n    u32 j;\n    u8 region;\n\n    switch (sRegionMap->type)\n    {\n    default:\n    case REGIONMAP_TYPE_NORMAL:\n    case REGIONMAP_TYPE_WALL:\n        sRegionMap->mainTask = Task_RegionMap;\n        break;\n    case REGIONMAP_TYPE_FLY:\n        sRegionMap->mainTask = Task_FlyMap;\n        break;\n    }\n    for (i = 0; i < MAPPERM_COUNT; i++)\n    {\n        sRegionMap->permissions[i] = sRegionMapPermissions[sRegionMap->type][i];\n    }\n    if (!FlagGet(FLAG_SYS_SEVII_MAP_123))\n        sRegionMap->permissions[MAPPERM_HAS_SWITCH_BUTTON] = FALSE;\n    region = REGIONMAP_KANTO;\n    j = REGIONMAP_KANTO;\n    if (gMapHeader.regionMapSectionId >= MAPSECS_SEVII_123 && gMapHeader.regionMapSectionId != MAPSEC_FARAWAY_ISLAND)\n    {\n        // Mapsec is in Sevii Islands, determine which map to use\n        while (region == REGIONMAP_KANTO)\n        {\n            for (i = 0; sSeviiMapsecs[j][i] != MAPSEC_NONE; i++)\n            {\n                if (gMapHeader.regionMapSectionId == sSeviiMapsecs[j][i])\n                {\n                    region = j + 1;\n                    break;\n                }\n            }\n            j++;\n        }\n    }\n    if(gMapHeader.regionMapSectionId == MAPSEC_UNDERWATER_124)\n    {\n        region = REGIONMAP_SEVII123;\n    }\n    if(gMapHeader.regionMapSectionId <= MAPSEC_SKY_PILLAR && gMapHeader.regionMapSectionId != MAPSEC_UNDERWATER_124 && gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER && gMapHeader.regionMapSectionId != MAPSEC_ARTISAN_CAVE && gMapHeader.regionMapSectionId != MAPSEC_SOUTHERN_ISLAND)\n    {\n        region = REGIONMAP_HOENN;\n    }\n    if(gMapHeader.regionMapSectionId == MAPSEC_BATTLE_FRONTIER || gMapHeader.regionMapSectionId == MAPSEC_ARTISAN_CAVE || gMapHeader.regionMapSectionId == MAPSEC_SOUTHERN_ISLAND)\n    {\n        region = REGIONMAP_KANTO;\n    }\n    sRegionMap->selectedRegion = region;\n    sRegionMap->playersRegion = region;\n}\n\nstatic void CB2_OpenRegionMap(void)\n{\n    switch (sRegionMap->openState)\n    {\n    case 0:\n        NullVBlankHBlankCallbacks();\n        break;\n    case 1:\n        InitRegionMapBgs();\n        break;\n    case 2:\n        ResetOamForRegionMap();\n        break;\n    case 3:\n        if (!LoadRegionMapGfx())\n            return;\n        break;\n    case 4:\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20);\n        CopyBgTilemapBufferToVram(1);\n        break;\n    case 5:\n        BufferRegionMapBg(0, sRegionMap->layouts[sRegionMap->selectedRegion]);\n        CopyBgTilemapBufferToVram(0);\n        if (sRegionMap->type != REGIONMAP_TYPE_NORMAL)\n        {\n            BufferRegionMapBg(1, sRegionMap->layouts[REGIONMAP_COUNT]);\n            CopyBgTilemapBufferToVram(1);\n        }\n        break;\n    case 6:\n        DisplayCurrentMapName();\n        PutWindowTilemap(WIN_MAP_NAME);\n        break;\n    case 7:\n        DisplayCurrentDungeonName();\n        PutWindowTilemap(WIN_DUNGEON_NAME);\n        break;\n    case 8:\n        if (GetRegionMapPermission(MAPPERM_HAS_OPEN_ANIM) == TRUE)\n            SetBg0andBg3Hidden(TRUE);\n        break;\n    default:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        CreateMainMapTask();\n        SetRegionMapVBlankCB();\n        break;\n    }\n    sRegionMap->openState++;\n}\n\nstatic bool8 LoadRegionMapGfx(void)\n{\n    switch (sRegionMap->loadGfxState)\n    {\n    case 0:\n        LoadPalette(sTopBar_Pal, BG_PLTT_ID(12), sizeof(sTopBar_Pal));\n        break;\n    case 1:\n        if(gMapHeader.regionMapSectionId <= MAPSEC_SKY_PILLAR && gMapHeader.regionMapSectionId != MAPSEC_UNDERWATER_124 && gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER && gMapHeader.regionMapSectionId != MAPSEC_ARTISAN_CAVE && gMapHeader.regionMapSectionId != MAPSEC_SOUTHERN_ISLAND)\n            LoadPalette(sHoennRegionMap_Pal, 0x70, 0x60);\n        else\n            LoadPalette(sRegionMap_Pal, 0, sizeof(sRegionMap_Pal));\n        TintMapEdgesPalette();\n        if (sRegionMap->type != REGIONMAP_TYPE_NORMAL)\n        {\n            LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(0), sizeof(sTopBar_Pal[15]));\n            LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(1), sizeof(sTopBar_Pal[15]));\n            LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(2), sizeof(sTopBar_Pal[15]));\n            LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(3), sizeof(sTopBar_Pal[15]));\n            LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(4), sizeof(sTopBar_Pal[15]));\n        }\n        break;\n    case 2:\n        ResetTempTileDataBuffers();\n        break;\n    case 3:\n        if(gMapHeader.regionMapSectionId <= MAPSEC_SKY_PILLAR && gMapHeader.regionMapSectionId != MAPSEC_UNDERWATER_124 && gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER && gMapHeader.regionMapSectionId != MAPSEC_ARTISAN_CAVE && gMapHeader.regionMapSectionId != MAPSEC_SOUTHERN_ISLAND)\n            DecompressAndCopyTileDataToVram(0, sHoennRegionMap_Gfx, 0, 0, 0);\n        else\n            DecompressAndCopyTileDataToVram(0, sRegionMap_Gfx, 0, 0, 0);\n        if (sRegionMap->type != REGIONMAP_TYPE_NORMAL)\n            DecompressAndCopyTileDataToVram(1, sBackground_Gfx, 0, 0, 0);\n        break;\n    case 4:\n        if (FreeTempTileDataBuffersIfPossible() == TRUE)\n            return FALSE;\n        break;\n    case 5:\n        if(gMapHeader.regionMapSectionId <= MAPSEC_SKY_PILLAR && gMapHeader.regionMapSectionId != MAPSEC_UNDERWATER_124 && gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER && gMapHeader.regionMapSectionId != MAPSEC_ARTISAN_CAVE && gMapHeader.regionMapSectionId != MAPSEC_SOUTHERN_ISLAND)\n            LZ77UnCompWram(sHoenn_Tilemap, sRegionMap->layouts[REGIONMAP_HOENN]);\n        else\n            LZ77UnCompWram(sKanto_Tilemap, sRegionMap->layouts[REGIONMAP_KANTO]);\n        break;\n    case 6:\n        LZ77UnCompWram(sSevii123_Tilemap, sRegionMap->layouts[REGIONMAP_SEVII123]);\n        break;\n    case 7:\n        LZ77UnCompWram(sSevii45_Tilemap, sRegionMap->layouts[REGIONMAP_SEVII45]);\n        break;\n    case 8:\n        LZ77UnCompWram(sSevii67_Tilemap, sRegionMap->layouts[REGIONMAP_SEVII67]);\n        break;\n    default:\n        LZ77UnCompWram(sBackground_Tilemap, sRegionMap->layouts[REGIONMAP_COUNT]);\n        return TRUE;\n    }\n    sRegionMap->loadGfxState++;\n    return FALSE;\n}\n\nstatic void CreateMainMapTask(void)\n{\n    CreateTask(sRegionMap->mainTask, 0);\n    SetMainCallback2(CB2_RegionMap);\n}\n\nstatic bool32 SelectedMapsecSEEnabled(void)\n{\n    if (GetSelectedMapSection(GetSelectedRegionMap(), LAYER_MAP, GetMapCursorY(), GetMapCursorX()) == MAPSEC_ROUTE_4_POKECENTER)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic void PlaySEForSelectedMapsec(void)\n{\n    if (SelectedMapsecSEEnabled())\n    {\n        if ((GetSelectedMapsecType(LAYER_MAP) != MAPSECTYPE_ROUTE && GetSelectedMapsecType(LAYER_MAP) != MAPSECTYPE_NONE) \n         || (GetSelectedMapsecType(LAYER_DUNGEON) != MAPSECTYPE_ROUTE && GetSelectedMapsecType(LAYER_DUNGEON) != MAPSECTYPE_NONE))\n            PlaySE(SE_DEX_SCROLL);\n        if (GetMapCursorX() == SWITCH_BUTTON_X && GetMapCursorY() == SWITCH_BUTTON_Y && GetRegionMapPermission(MAPPERM_HAS_SWITCH_BUTTON) == TRUE)\n            PlaySE(SE_M_SPIT_UP);\n        else if (GetMapCursorX() == CANCEL_BUTTON_X && GetMapCursorY() == CANCEL_BUTTON_Y)\n            PlaySE(SE_M_SPIT_UP);\n    }\n}\n\nstatic void Task_RegionMap(u8 taskId)\n{\n    switch (sRegionMap->mainState)\n    {\n    case 0:\n        InitMapIcons(GetSelectedRegionMap(), taskId, sRegionMap->mainTask);\n        CreateMapCursor(0, 0);\n        CreatePlayerIcon(1, 1);\n        sRegionMap->mainState++;\n        break;\n    case 1:\n        if (sRegionMap->permissions[MAPPERM_HAS_OPEN_ANIM] == TRUE)\n        {\n            InitMapOpenAnim(taskId, sRegionMap->mainTask);\n        }\n        else\n        {\n            ShowBg(0);\n            ShowBg(3);\n            ShowBg(1);\n            PrintTopBarTextLeft(gText_RegionMap_DPadMove);\n            PrintTopBarTextRight(gText_RegionMap_Space);\n            ClearOrDrawTopBar(FALSE);\n            SetPlayerIconInvisibility(FALSE);\n            SetMapCursorInvisibility(FALSE);\n            SetFlyIconInvisibility(GetSelectedRegionMap(), NELEMS(sMapIcons->flyIcons), FALSE);\n            SetDungeonIconInvisibility(GetSelectedRegionMap(), NELEMS(sMapIcons->dungeonIcons), FALSE);\n        }\n        sRegionMap->mainState++;\n        break;\n    case 2:\n        if (!gPaletteFade.active && !IsDma3ManagerBusyWithBgCopy())\n        {\n            DisplayCurrentMapName();\n            PutWindowTilemap(WIN_MAP_NAME);\n            DisplayCurrentDungeonName();\n            PutWindowTilemap(WIN_DUNGEON_NAME);\n            sRegionMap->mainState++;\n        }\n        break;\n    case 3:\n        switch (GetRegionMapInput())\n        {\n        case MAP_INPUT_MOVE_START:\n            ResetCursorSnap();\n            break;\n        case MAP_INPUT_MOVE_CONT:\n            break;\n        case MAP_INPUT_MOVE_END:\n            DisplayCurrentMapName();\n            DisplayCurrentDungeonName();\n            DrawDungeonNameBox();\n            PlaySEForSelectedMapsec();\n            if (GetDungeonMapsecUnderCursor() != MAPSEC_NONE)\n            {\n                if (GetRegionMapPermission(MAPPERM_HAS_MAP_PREVIEW) == TRUE)\n                {\n                    if (GetSelectedMapsecType(LAYER_DUNGEON) == MAPSECTYPE_VISITED)\n                    {\n                        PrintTopBarTextRight(gText_RegionMap_AButtonGuide);\n                    }\n                    else\n                    {\n                        PrintTopBarTextRight(gText_RegionMap_Space);\n                    }\n                }\n            }\n            else\n            {\n                if (GetMapCursorX() == SWITCH_BUTTON_X && GetMapCursorY() == SWITCH_BUTTON_Y && GetRegionMapPermission(MAPPERM_HAS_SWITCH_BUTTON) == TRUE)\n                {\n                    PrintTopBarTextRight(gText_RegionMap_AButtonSwitch);\n                }\n                else if (GetMapCursorX() == CANCEL_BUTTON_X && GetMapCursorY() == CANCEL_BUTTON_Y)\n                {\n                    PrintTopBarTextRight(gText_RegionMap_AButtonCancel);\n                }\n                else\n                {\n                    PrintTopBarTextRight(gText_RegionMap_Space);\n                }\n            }\n            break;\n        case MAP_INPUT_A_BUTTON:\n            if (GetSelectedMapsecType(LAYER_DUNGEON) == MAPSECTYPE_VISITED && sRegionMap->permissions[MAPPERM_HAS_MAP_PREVIEW] == TRUE)\n                InitDungeonMapPreview(0, taskId, SaveMainMapTask);\n            break;\n        case MAP_INPUT_SWITCH:\n            InitSwitchMapMenu(sRegionMap->selectedRegion, taskId, SaveMainMapTask);\n            break;\n        case MAP_INPUT_CANCEL:\n            sRegionMap->mainState++;\n            break;\n        }\n        break;\n    case 4:\n        if (GetRegionMapPermission(MAPPERM_HAS_OPEN_ANIM) == TRUE)\n        {\n            DoMapCloseAnim(taskId);\n            // FIXME: goto required to match\n            // sRegionMap->mainState++;\n            goto INCREMENT_MAIN_STATE_AND_BREAK;\n        }\n        else\n        {\n            sRegionMap->mainState++;\n        }\n        break;\n    case 5:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n    INCREMENT_MAIN_STATE_AND_BREAK:\n        sRegionMap->mainState++;\n        break;\n    default:\n        if (!gPaletteFade.active)\n        {\n            FreeRegionMap(taskId);\n        }\n        break;\n    }\n}\n\n// Unused\nstatic void SetMainMapTask(TaskFunc taskFunc)\n{\n    sRegionMap->mainTask = taskFunc;\n}\n\nstatic TaskFunc GetMainMapTask(void)\n{\n    return sRegionMap->mainTask;\n}\n\nstatic void SaveMainMapTask(u8 taskId)\n{\n    gTasks[taskId].func = sRegionMap->mainTask;\n}\n\nstatic void FreeRegionMap(u8 taskId)\n{\n    if (GetRegionMapPermission(MAPPERM_HAS_OPEN_ANIM) == TRUE)\n        FreeMapOpenCloseAnim();\n    FreeMapIcons();\n    FreeMapCursor();\n    FreePlayerIcon();\n    FreeAndResetGpuRegs();\n    DestroyTask(taskId);\n    FreeAllWindowBuffers();\n    if (sRegionMap->savedCallback == NULL)\n        SetMainCallback2(gMain.savedCallback);\n    else\n        SetMainCallback2(sRegionMap->savedCallback);\n    FREE_IF_NOT_NULL(sRegionMap);\n}\n\nstatic void FreeRegionMapForFlyMap(void)\n{\n    FREE_IF_NOT_NULL(sRegionMap);\n}\n\nstatic void CB2_RegionMap(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB_RegionMap(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void NullVBlankHBlankCallbacks(void)\n{\n    SetVBlankCallback(NULL);\n    SetHBlankCallback(NULL);\n}\n\nstatic void SetRegionMapVBlankCB(void)\n{\n    SetVBlankCallback(VBlankCB_RegionMap);\n}\n\nstatic void InitRegionMapBgs(void)\n{\n    DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000);\n    DmaFill32Defvars(3, 0, (void *)OAM, OAM_SIZE);\n    DmaFill16Defvars(3, 0, (void *)PLTT, PLTT_SIZE);\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    if(gMapHeader.regionMapSectionId <= MAPSEC_SKY_PILLAR && gMapHeader.regionMapSectionId != MAPSEC_UNDERWATER_124 && gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER && gMapHeader.regionMapSectionId != MAPSEC_ARTISAN_CAVE && gMapHeader.regionMapSectionId != MAPSEC_SOUTHERN_ISLAND)\n        InitBgsFromTemplates(0, sHoennRegionMapBgTemplates, NELEMS(sHoennRegionMapBgTemplates));\n    else\n        InitBgsFromTemplates(0, sRegionMapBgTemplates, NELEMS(sRegionMapBgTemplates));\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n    InitWindows(sRegionMapWindowTemplates);\n    DeactivateAllTextPrinters();\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);\n    SetBgTilemapBuffers();\n    UpdateMapsecNameBox();\n}\n\nstatic void SetBgTilemapBuffers(void)\n{\n    SetBgTilemapBuffer(0, sRegionMap->bgTilemapBuffers[0]);\n    SetBgTilemapBuffer(1, sRegionMap->bgTilemapBuffers[1]);\n    SetBgTilemapBuffer(2, sRegionMap->bgTilemapBuffers[2]);\n}\n\nstatic void ResetOamForRegionMap(void)\n{\n    ResetSpriteData();\n    ResetPaletteFade();\n    FreeAllSpritePalettes();\n    ResetTasks();\n    ScanlineEffect_Stop();\n}\n\nstatic void SetBg0andBg3Hidden(bool8 hide)\n{\n    switch (hide)\n    {\n    case FALSE:\n        ShowBg(0);\n        ShowBg(3);\n        break;\n    case TRUE:\n        HideBg(0);\n        HideBg(3);\n        break;\n    }\n}\n\nstatic void UpdateMapsecNameBox(void)\n{\n    ResetGpuRegs();\n    SetBldCnt(0, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_OBJ, BLDCNT_EFFECT_DARKEN);\n    SetBldY(BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2);\n    SetWinIn(\n        (WININ_WIN0_BG0 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR),\n        (WININ_WIN1_BG0 | WININ_WIN1_BG3 | WININ_WIN1_OBJ | WININ_WIN1_CLR) >> 8);\n    SetWinOut(WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ);\n    SetGpuWindowDims(0, &sMapsecNameWindowDims[WIN_MAP_NAME]);\n    SetGpuWindowDims(1, &sMapsecNameWindowDims[WIN_DUNGEON_NAME]);\n    SetDispCnt(0, FALSE);\n    if (GetDungeonMapsecUnderCursor() != MAPSEC_NONE)\n        SetDispCnt(1, FALSE);\n}\n\nstatic void DisplayCurrentMapName(void)\n{\n    ClearWindowTilemap(WIN_MAP_NAME);\n    FillWindowPixelBuffer(WIN_MAP_NAME, PIXEL_FILL(0));\n    if (GetMapsecUnderCursor() == MAPSEC_NONE)\n    {\n        SetGpuWindowDims(0, &sMapsecNameWindowDims[CLEAR_NAME]);\n    }\n    else\n    {\n        GetMapName(sRegionMap->mapName, GetMapsecUnderCursor(), 0);\n        AddTextPrinterParameterized3(WIN_MAP_NAME, FONT_NORMAL, 2, 2, sTextColor_White, 0, sRegionMap->mapName);\n        PutWindowTilemap(WIN_MAP_NAME);\n        CopyWindowToVram(WIN_MAP_NAME, COPYWIN_GFX);\n        SetGpuWindowDims(0, &sMapsecNameWindowDims[WIN_MAP_NAME]);\n    }\n}\n\nstatic void DrawDungeonNameBox(void)\n{\n    SetGpuWindowDims(1, &sMapsecNameWindowDims[WIN_DUNGEON_NAME]);\n}\n\nstatic void DisplayCurrentDungeonName(void)\n{\n    u16 mapsecId;\n    u16 descOffset;\n    sRegionMap->dungeonWinTop = FALSE;\n    sRegionMap->dungeonWinRight = 24;\n    sRegionMap->dungeonWinBottom = 32;\n    SetDispCnt(1, TRUE);\n    ClearWindowTilemap(WIN_DUNGEON_NAME);\n    mapsecId = GetDungeonMapsecUnderCursor();\n    if (mapsecId != MAPSEC_NONE)\n    {\n         descOffset = mapsecId;\n         SetDispCnt(WIN_DUNGEON_NAME, FALSE);\n         sRegionMap->dungeonWinTop = TRUE;\n         sRegionMap->dungeonWinLeft = StringLength(sMapNames[descOffset]);\n         sRegionMap->dungeonWinRight = sRegionMap->dungeonWinLeft * 10 + 50;\n         sRegionMap->dungeonWinBottom = 48;\n         FillWindowPixelBuffer(WIN_DUNGEON_NAME, PIXEL_FILL(0));\n         StringCopy(sRegionMap->dungeonName, sMapNames[descOffset]);\n         AddTextPrinterParameterized3(WIN_DUNGEON_NAME, FONT_NORMAL, 12, 2, sTextColorTable[GetSelectedMapsecType(LAYER_DUNGEON) - 2], 0, sRegionMap->dungeonName);\n         PutWindowTilemap(WIN_DUNGEON_NAME);\n         CopyWindowToVram(WIN_DUNGEON_NAME, COPYWIN_FULL);\n    }\n}\n\nstatic void ClearMapsecNameText(void)\n{\n    FillWindowPixelBuffer(WIN_MAP_NAME, PIXEL_FILL(0));\n    CopyWindowToVram(WIN_MAP_NAME, COPYWIN_FULL);\n    FillWindowPixelBuffer(WIN_DUNGEON_NAME, PIXEL_FILL(0));\n    CopyWindowToVram(WIN_DUNGEON_NAME, COPYWIN_FULL);\n}\n\nstatic void BufferRegionMapBg(u8 bg, u16 *map)\n{\n    s32 i;\n    s32 j;\n    u8 whichMap;\n    u16 *buffer = sRegionMap->bgTilemapBuffers[bg];\n    for (i = 0; i < 20; i++)\n    {\n        for (j = 0; j < 32; j++)\n        {\n            if (j < 30)\n                buffer[32 * i + j] = map[30 * i + j];\n            else\n                buffer[32 * i + j] = map[0];\n        }\n    }\n    if (sRegionMap->permissions[MAPPERM_HAS_SWITCH_BUTTON] == TRUE)\n    {\n        WriteSequenceToBgTilemapBuffer(0, 0x0F0, 0x18, 14, 3, 1, 0x3, 0x001);\n        WriteSequenceToBgTilemapBuffer(0, 0x100, 0x18, 15, 3, 1, 0x3, 0x001);\n        WriteSequenceToBgTilemapBuffer(0, 0x110, 0x18, 16, 3, 1, 0x3, 0x001);\n    }\n    if (sSwitchMapMenu != NULL)\n        whichMap = sSwitchMapMenu->currentSelection;\n    else\n        whichMap = sRegionMap->selectedRegion;\n    if (whichMap == REGIONMAP_SEVII45 && !FlagGet(FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR))\n        FillBgTilemapBufferRect_Palette0(0, 0x003, 13, 11, 3, 2);\n    if (whichMap == REGIONMAP_SEVII67 && !FlagGet(FLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIOR))\n        FillBgTilemapBufferRect_Palette0(0, 0x003, 21, 16, 3, 3);\n}\n\nstatic bool8 GetRegionMapPermission(u8 attr)\n{\n    return sRegionMap->permissions[attr];\n}\n\nstatic u8 GetSelectedRegionMap(void)\n{\n    return sRegionMap->selectedRegion;\n}\n\nstatic u8 GetRegionMapPlayerIsOn(void)\n{\n    return sRegionMap->playersRegion;\n}\n\nstatic void SetSelectedRegionMap(u8 region)\n{\n    sRegionMap->selectedRegion = region;\n}\n\n// Unused\nstatic void SetRegionMapPlayerIsOn(u8 region)\n{\n    sRegionMap->playersRegion = region;\n}\n\nstatic void InitSwitchMapMenu(u8 whichMap, u8 taskId, TaskFunc taskFunc)\n{\n    sSwitchMapMenu = AllocZeroed(sizeof(struct SwitchMapMenu));\n    if (FlagGet(FLAG_SYS_SEVII_MAP_4567))\n        sSwitchMapMenu->maxSelection = 3;\n    else if (FlagGet(FLAG_SYS_SEVII_MAP_123))\n        sSwitchMapMenu->maxSelection = 1;\n    else\n        sSwitchMapMenu->maxSelection = 0;\n    sSwitchMapMenu->cursorSubsprite[0].x = 88;\n    sSwitchMapMenu->cursorSubsprite[1].x = 152;\n\n    switch (sSwitchMapMenu->maxSelection)\n    {\n    case 1:\n        LZ77UnCompWram(sSwitchMap_KantoSevii123_Tilemap, sSwitchMapMenu->switchMapTilemap);\n        sSwitchMapMenu->yOffset = 6;\n        break;\n    case 2: // never reached\n        LZ77UnCompWram(sSwitchMap_KantoSeviiAll2_Tilemap, sSwitchMapMenu->switchMapTilemap);\n        sSwitchMapMenu->yOffset = 4;\n        break;\n    case 3:\n    default:\n        sSwitchMapMenu->yOffset = 3;\n        LZ77UnCompWram(sSwitchMap_KantoSeviiAll_Tilemap, sSwitchMapMenu->switchMapTilemap);\n        break;\n    }\n    LZ77UnCompWram(sSwitchMapMenu_Gfx, sSwitchMapMenu->switchMapTiles);\n    sSwitchMapMenu->mainState = 0;\n    sSwitchMapMenu->currentSelection = whichMap;\n    sSwitchMapMenu->exitTask = taskFunc;\n    sSwitchMapMenu->chosenRegion = GetRegionMapPlayerIsOn();\n    SaveRegionMapGpuRegs(0);\n    PrintTopBarTextRight(gText_RegionMap_AButtonOK);\n    gTasks[taskId].func = Task_SwitchMapMenu;\n}\n\nstatic void ResetGpuRegsForSwitchMapMenu(void)\n{\n    ResetGpuRegs();\n    SetBldCnt((BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ) >> 8, BLDCNT_TGT1_BG2, BLDCNT_EFFECT_BLEND);\n    SetBldAlpha(16 - sSwitchMapMenu->alpha, sSwitchMapMenu->alpha);\n}\n\nstatic bool8 FadeSwitchMapMenuIn(void)\n{\n    if (sSwitchMapMenu->alpha < 16)\n    {\n        SetBldAlpha(16 - sSwitchMapMenu->alpha, sSwitchMapMenu->alpha);\n        sSwitchMapMenu->alpha += 2;\n        return FALSE;\n    }\n    else\n    {\n        return TRUE;\n    }\n}\n\nstatic bool8 FadeSwitchMapMenuOut(void)\n{\n    if (sSwitchMapMenu->alpha >= 2)\n    {\n        sSwitchMapMenu->alpha -= 2;\n        SetBldAlpha(16 - sSwitchMapMenu->alpha, sSwitchMapMenu->alpha);\n        return FALSE;\n    }\n    else\n    {\n        return TRUE;\n    }\n}\n\nstatic void Task_SwitchMapMenu(u8 taskId)\n{\n    switch (sSwitchMapMenu->mainState)\n    {\n    case 0:\n        NullVBlankHBlankCallbacks();\n        PrintTopBarTextLeft(gText_RegionMap_UpDownPick);\n        sSwitchMapMenu->mainState++;\n        break;\n    case 1:\n        LoadBgTiles(2, sSwitchMapMenu->switchMapTiles, sizeof(sSwitchMapMenu->switchMapTiles), 0);\n        sSwitchMapMenu->mainState++;\n        break;\n    case 2:\n        LoadSwitchMapTilemap(2, sSwitchMapMenu->switchMapTilemap);\n        CopyBgTilemapBufferToVram(2);\n        sSwitchMapMenu->mainState++;\n        break;\n    case 3:\n        ClearMapsecNameText();\n        sSwitchMapMenu->mainState++;\n        break;\n    case 4:\n        ResetGpuRegsForSwitchMapMenu();\n        ShowBg(2);\n        sSwitchMapMenu->mainState++;\n        break;\n    case 5:\n        SetRegionMapVBlankCB();\n        sSwitchMapMenu->mainState++;\n        break;\n    case 6:\n        if (FadeSwitchMapMenuIn() == TRUE)\n        {\n            SetGpuRegsToDimScreen();\n            sSwitchMapMenu->mainState++;\n        }\n        break;\n    case 7:\n        if (DimScreenForSwitchMapMenu() == TRUE)\n        {\n            sSwitchMapMenu->mainState++;\n        }\n        break;\n    case 8:\n        if (CreateSwitchMapCursor() == TRUE)\n        {\n            sSwitchMapMenu->mainState++;\n        }\n        break;\n    case 9:\n        if (HandleSwitchMapInput() == TRUE)\n        {\n            SetSelectedRegionMap(sSwitchMapMenu->currentSelection);\n            if (GetRegionMapPlayerIsOn() == sSwitchMapMenu->currentSelection)\n            {\n                SetPlayerIconInvisibility(FALSE);\n                SetFlyIconInvisibility(sSwitchMapMenu->currentSelection, NELEMS(sMapIcons->flyIcons), FALSE);\n                SetDungeonIconInvisibility(sSwitchMapMenu->currentSelection, NELEMS(sMapIcons->dungeonIcons), FALSE);\n            }\n            sSwitchMapMenu->mainState++;\n        }\n        break;\n    case 10:\n        if (BrightenScreenForSwitchMapMenu() == TRUE)\n        {\n            FreeSwitchMapCursor();\n            ResetGpuRegsForSwitchMapMenu();\n            sSwitchMapMenu->mainState++;\n        }\n        break;\n    case 11:\n        if (FadeSwitchMapMenuOut() == TRUE)\n        {\n            sSwitchMapMenu->mainState++;\n        }\n        break;\n    case 12:\n        SetMapCursorInvisibility(FALSE);\n        sSwitchMapMenu->mainState++;\n        break;\n    default:\n        FreeSwitchMapMenu(taskId);\n        break;\n    }\n}\n\nstatic void FreeSwitchMapMenu(u8 taskId)\n{\n    gTasks[taskId].func = sSwitchMapMenu->exitTask;\n    HideBg(2);\n    PrintTopBarTextLeft(gText_RegionMap_DPadMove);\n    PrintTopBarTextRight(gText_RegionMap_AButtonSwitch);\n    UpdateMapsecNameBox();\n    DrawDungeonNameBox();\n    SetGpuWindowDims(0, &sMapsecNameWindowDims[CLEAR_NAME]);\n    FREE_IF_NOT_NULL(sSwitchMapMenu);\n}\n\nstatic bool8 BrightenScreenForSwitchMapMenu(void)\n{\n    if (sSwitchMapMenu->blendY != 0)\n    {\n        sSwitchMapMenu->blendY--;\n        SetGpuReg(REG_OFFSET_BLDY, sSwitchMapMenu->blendY);\n        return FALSE;\n    }\n    else\n    {\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        return TRUE;\n    }\n}\n\nstatic void LoadSwitchMapTilemap(u8 bg, u16 *map)\n{\n    s32 i;\n    s32 j;\n    u16 *buffer = sRegionMap->bgTilemapBuffers[bg];\n    for (i = 0; i < 20; i++)\n    {\n        for (j = 0; j < 32; j++)\n        {\n            if (j < 30)\n                buffer[32 * i + j] = map[30 * i + j];\n            else\n                buffer[32 * i + j] = map[0];\n        }\n    }\n}\n\nstatic void SetGpuRegsToDimScreen(void)\n{\n    struct GpuWindowParams data;\n    data.left = sSwitchMapMenu->highlight.left = 72;\n    data.top = sSwitchMapMenu->highlight.top = 8 * (sSwitchMapMenu->yOffset + 4 * sSwitchMapMenu->currentSelection);\n    data.right = sSwitchMapMenu->highlight.right = 168;\n    data.bottom = sSwitchMapMenu->highlight.bottom = sSwitchMapMenu->highlight.top + 32;\n    ResetGpuRegs();\n    SetBldCnt(0, (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_OBJ), BLDCNT_EFFECT_DARKEN);\n    SetWinIn((WININ_WIN0_BG_ALL | WININ_WIN0_OBJ), (WININ_WIN1_BG0 | WININ_WIN1_BG2 | WININ_WIN1_OBJ) >> 8);\n    SetWinOut(WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n    SetDispCnt(1, FALSE);\n    SetGpuWindowDims(1, &data);\n}\n\nstatic bool8 DimScreenForSwitchMapMenu(void)\n{\n    if (sSwitchMapMenu->blendY < 6)\n    {\n        sSwitchMapMenu->blendY++;\n        SetBldY(sSwitchMapMenu->blendY);\n        return FALSE;\n    }\n    else\n    {\n        return TRUE;\n    }\n}\n\nstatic bool8 HandleSwitchMapInput(void)\n{\n    bool8 changedSelection = FALSE;\n    struct GpuWindowParams data;\n    data.left = sSwitchMapMenu->highlight.left = 72;\n    data.top = sSwitchMapMenu->highlight.top = 8 * (sSwitchMapMenu->yOffset + 4 * sSwitchMapMenu->currentSelection);\n    data.right = sSwitchMapMenu->highlight.right = 168;\n    data.bottom = sSwitchMapMenu->highlight.bottom = sSwitchMapMenu->highlight.top + 32;\n    if (JOY_NEW(DPAD_UP) && sSwitchMapMenu->currentSelection != 0)\n    {\n        PlaySE(SE_BAG_CURSOR);\n        sSwitchMapMenu->currentSelection--;\n        changedSelection = TRUE;\n    }\n    if (JOY_NEW(DPAD_DOWN) && sSwitchMapMenu->currentSelection < sSwitchMapMenu->maxSelection)\n    {\n        PlaySE(SE_BAG_CURSOR);\n        sSwitchMapMenu->currentSelection++;\n        changedSelection = TRUE;\n    }\n    if (JOY_NEW(A_BUTTON) && sSwitchMapMenu->blendY == 6)\n    {\n        PlaySE(SE_M_SWIFT);\n        sSwitchMapMenu->chosenRegion = sSwitchMapMenu->currentSelection;\n        return TRUE;\n    }\n    if (JOY_NEW(B_BUTTON))\n    {\n        sSwitchMapMenu->currentSelection = sSwitchMapMenu->chosenRegion;\n        BufferRegionMapBg(0, sRegionMap->layouts[sSwitchMapMenu->currentSelection]);\n        CopyBgTilemapBufferToVram(0);\n        SetFlyIconInvisibility(0xFF, NELEMS(sMapIcons->flyIcons), TRUE);\n        SetDungeonIconInvisibility(0xFF, NELEMS(sMapIcons->dungeonIcons), TRUE);\n        return TRUE;\n    }\n    if (changedSelection)\n    {\n        BufferRegionMapBg(0, sRegionMap->layouts[sSwitchMapMenu->currentSelection]);\n        PrintTopBarTextRight(gText_RegionMap_AButtonOK);\n        CopyBgTilemapBufferToVram(0);\n        CopyBgTilemapBufferToVram(3);\n        SetFlyIconInvisibility(0xFF, NELEMS(sMapIcons->flyIcons), TRUE);\n        SetDungeonIconInvisibility(0xFF, NELEMS(sMapIcons->dungeonIcons), TRUE);\n        SetFlyIconInvisibility(sSwitchMapMenu->currentSelection, NELEMS(sMapIcons->flyIcons), FALSE);\n        SetDungeonIconInvisibility(sSwitchMapMenu->currentSelection, NELEMS(sMapIcons->dungeonIcons), FALSE);\n    }\n    if (sSwitchMapMenu->currentSelection != GetRegionMapPlayerIsOn())\n        SetPlayerIconInvisibility(TRUE);\n    else\n        SetPlayerIconInvisibility(FALSE);\n    SetGpuWindowDims(1, &data);\n    return FALSE;\n}\n\nstatic void SpriteCB_SwitchMapCursor(struct Sprite *sprite)\n{\n    sprite->y = sSwitchMapMenu->highlight.top + 16;\n}\n\nstatic bool8 CreateSwitchMapCursor(void)\n{\n    switch (sSwitchMapMenu->cursorLoadState)\n    {\n    case 0:\n        LZ77UnCompWram(sSwitchMapCursorLeft_Gfx, sSwitchMapMenu->cursorSubsprite[0].tiles);\n        break;\n    case 1:\n        LZ77UnCompWram(sSwitchMapCursorRight_Gfx, sSwitchMapMenu->cursorSubsprite[1].tiles);\n        break;\n    case 2:\n        CreateSwitchMapCursorSubsprite(0, 2, 2);\n        CreateSwitchMapCursorSubsprite(1, 3, 3);\n        break;\n    default:\n        return TRUE;\n    }\n    sSwitchMapMenu->cursorLoadState++;\n    return FALSE;\n}\n\nstatic void CreateSwitchMapCursorSubsprite(u8 whichSprite, u16 tileTag, u16 palTag)\n{\n    CreateSwitchMapCursorSubsprite_(whichSprite, tileTag, palTag);\n}\n\nstatic void CreateSwitchMapCursorSubsprite_(u8 whichSprite, u16 tileTag, u16 palTag)\n{\n    u8 spriteId;\n\n    struct SpriteSheet spriteSheet = {\n        .data = sSwitchMapMenu->cursorSubsprite[whichSprite].tiles,\n        .size = sizeof(sSwitchMapMenu->cursorSubsprite[whichSprite].tiles),\n        .tag = tileTag\n    };\n    struct SpritePalette spritePalette = {\n        .data = sSwitchMapCursor_Pal,\n        .tag = palTag\n    };\n    struct SpriteTemplate template = {\n        .tileTag = tileTag,\n        .paletteTag = palTag,\n        .oam = &sOamData_SwitchMapCursor,\n        .anims = sAnims_SwitchMapCursor,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_SwitchMapCursor\n    };\n\n    sSwitchMapMenu->cursorSubsprite[whichSprite].tileTag = tileTag;\n    sSwitchMapMenu->cursorSubsprite[whichSprite].palTag = palTag;\n\n    LoadSpriteSheet(&spriteSheet);\n    LoadSpritePalette(&spritePalette);\n\n    spriteId = CreateSprite(&template, sSwitchMapMenu->cursorSubsprite[whichSprite].x, 8 * (sSwitchMapMenu->yOffset + 4 * sSwitchMapMenu->currentSelection), 0);\n    sSwitchMapMenu->cursorSubsprite[whichSprite].sprite = &gSprites[spriteId];\n    gSprites[spriteId].invisible = FALSE;\n}\n\nstatic void FreeSwitchMapCursor(void)\n{\n    u32 i;\n    for (i = 0; i < NELEMS(sSwitchMapMenu->cursorSubsprite); i++)\n    {\n        if (sSwitchMapMenu->cursorSubsprite[i].sprite != NULL)\n        {\n            DestroySprite(sSwitchMapMenu->cursorSubsprite[i].sprite);\n            FreeSpriteTilesByTag(sSwitchMapMenu->cursorSubsprite[i].tileTag);\n            FreeSpritePaletteByTag(sSwitchMapMenu->cursorSubsprite[i].palTag);\n        }\n    }\n}\n\nstatic const u8 *GetDungeonFlavorText(u16 mapsec)\n{\n    u32 i;\n    for (i = 0; i < NELEMS(sDungeonInfo); i++)\n    {\n        if (sDungeonInfo[i].id == mapsec)\n            return sDungeonInfo[i].desc;\n    }\n    return gText_RegionMap_NoData;\n}\n\nstatic const u8 *GetDungeonName(u16 mapsec)\n{\n    u32 i;\n    for (i = 0; i < NELEMS(sDungeonInfo); i++)\n    {\n        if (sDungeonInfo[i].id == mapsec)\n            return sDungeonInfo[i].name;\n    }\n    return gText_RegionMap_NoData;\n}\n\nstatic void InitDungeonMapPreview(u8 unused, u8 taskId, TaskFunc taskFunc)\n{\n    u8 mapsec;\n    sDungeonMapPreview = AllocZeroed(sizeof(struct DungeonMapPreview));\n    mapsec = GetDungeonMapsecUnderCursor();\n    if (mapsec == MAPSEC_TANOBY_CHAMBERS)\n        mapsec = MAPSEC_MONEAN_CHAMBER;\n    sDungeonMapPreview->mapPreviewInfo = GetDungeonMapPreviewScreenInfo(mapsec);\n    if (sDungeonMapPreview->mapPreviewInfo == NULL)\n        sDungeonMapPreview->mapPreviewInfo = GetDungeonMapPreviewScreenInfo(MAPSEC_ROCK_TUNNEL);\n    sDungeonMapPreview->mainState = 0;\n    sDungeonMapPreview->loadState = 0;\n    sDungeonMapPreview->savedTask = taskFunc;\n    sDungeonMapPreview->blendY = 0;\n    SaveRegionMapGpuRegs(0);\n    ResetGpuRegs();\n    ClearMapsecNameText();\n    gTasks[taskId].func = Task_DungeonMapPreview;\n}\n\nstatic bool8 LoadMapPreviewGfx(void)\n{\n    switch (sDungeonMapPreview->loadState)\n    {\n    case 0:\n        LZ77UnCompWram(sDungeonMapPreview->mapPreviewInfo->tilesptr, sDungeonMapPreview->tiles);\n        break;\n    case 1:\n        LZ77UnCompWram(sDungeonMapPreview->mapPreviewInfo->tilemapptr, sDungeonMapPreview->tilemap);\n        break;\n    case 2:\n        LoadBgTiles(2, sDungeonMapPreview->tiles, sizeof(sDungeonMapPreview->tiles), 0);\n        break;\n    case 3:\n        LoadPalette(sDungeonMapPreview->mapPreviewInfo->palptr, BG_PLTT_ID(13), 3 * PLTT_SIZE_4BPP);\n        break;\n    default:\n        return TRUE;\n    }\n    sDungeonMapPreview->loadState++;\n    return FALSE;\n}\n\nstatic void Task_DungeonMapPreview(u8 taskId)\n{\n    switch (sDungeonMapPreview->mainState)\n    {\n    case 0:\n        NullVBlankHBlankCallbacks();\n        sDungeonMapPreview->mainState++;\n        break;\n    case 1:\n        if (LoadMapPreviewGfx() == TRUE)\n            sDungeonMapPreview->mainState++;\n        break;\n    case 2:\n        InitScreenForDungeonMapPreview();\n        PrintTopBarTextRight(gText_RegionMap_AButtonCancel2);\n        sDungeonMapPreview->mainState++;\n        break;\n    case 3:\n        CopyMapPreviewTilemapToBgTilemapBuffer(2, sDungeonMapPreview->tilemap);\n        CopyBgTilemapBufferToVram(2);\n        sDungeonMapPreview->mainState++;\n        break;\n    case 4:\n        ShowBg(2);\n        sDungeonMapPreview->mainState++;\n        break;\n    case 5:\n        SetRegionMapVBlankCB();\n        sDungeonMapPreview->mainState++;\n        break;\n    case 6:\n        if (UpdateDungeonMapPreview(FALSE) == TRUE)\n            sDungeonMapPreview->mainState++;\n        break;\n    case 7:\n        gTasks[taskId].func = Task_DrawDungeonMapPreviewFlavorText;\n        break;\n    case 8:\n        if (UpdateDungeonMapPreview(TRUE) == TRUE)\n        {\n            sDungeonMapPreview->mainState++;\n        }\n        break;\n    case 9:\n        FreeDungeonMapPreview(taskId);\n        sDungeonMapPreview->mainState++;\n        break;\n    }\n}\n\n// Tints the dungeon preview image in the background and overlays the name and description of the dungeon\nstatic void Task_DrawDungeonMapPreviewFlavorText(u8 taskId)\n{\n    switch (sDungeonMapPreview->drawState)\n    {\n    case 0:\n        sDungeonMapPreview->red = 0x0133;\n        sDungeonMapPreview->green = 0x0100;\n        sDungeonMapPreview->blue = 0x00F0;\n        sDungeonMapPreview->drawState++;\n        break;\n    case 1:\n        // Delay\n        if (sDungeonMapPreview->timer++ > 40)\n        {\n            sDungeonMapPreview->timer = 0;\n            sDungeonMapPreview->drawState++;\n        }\n        break;\n    case 2:\n        FillWindowPixelBuffer(WIN_MAP_PREVIEW, PIXEL_FILL(0));\n        CopyWindowToVram(WIN_MAP_PREVIEW, COPYWIN_FULL);\n        PutWindowTilemap(WIN_MAP_PREVIEW);\n        sDungeonMapPreview->drawState++;\n        break;\n    case 3:\n        // Draw text\n        if (sDungeonMapPreview->timer > 25)\n        {\n            AddTextPrinterParameterized3(WIN_MAP_PREVIEW, FONT_NORMAL, 4, 0, sTextColor_Green, -1, GetDungeonName(GetDungeonMapsecUnderCursor()));\n            AddTextPrinterParameterized3(WIN_MAP_PREVIEW, FONT_NORMAL, 2, 14, sTextColor_White, -1, GetDungeonFlavorText(GetDungeonMapsecUnderCursor()));\n            CopyWindowToVram(WIN_MAP_PREVIEW, COPYWIN_FULL);\n            sDungeonMapPreview->drawState++;\n        }\n        // Tint image\n        else if (sDungeonMapPreview->timer > 20)\n        {\n            sDungeonMapPreview->red -= 6;\n            sDungeonMapPreview->green -= 5;\n            sDungeonMapPreview->blue -= 5;\n            CpuCopy16(sDungeonMapPreview->mapPreviewInfo->palptr, sDungeonMapPreview->palette, 0x60);\n            TintPalette_CustomTone(sDungeonMapPreview->palette, 48, sDungeonMapPreview->red, sDungeonMapPreview->green, sDungeonMapPreview->blue);\n            LoadPalette(sDungeonMapPreview->palette, BG_PLTT_ID(13), sizeof(sDungeonMapPreview->palette));\n        }\n        sDungeonMapPreview->timer++;\n        break;\n    case 4:\n        if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON))\n        {\n            FillWindowPixelBuffer(WIN_MAP_PREVIEW, PIXEL_FILL(0));\n            CopyWindowToVram(WIN_MAP_PREVIEW, COPYWIN_FULL);\n            sDungeonMapPreview->mainState++;\n            sDungeonMapPreview->drawState++;\n        }\n        break;\n    default:\n        gTasks[taskId].func = Task_DungeonMapPreview;\n        break;\n    }\n}\n\nstatic void FreeDungeonMapPreview(u8 taskId)\n{\n    gTasks[taskId].func = sDungeonMapPreview->savedTask;\n    HideBg(2);\n    SetRegionMapGpuRegs(0);\n    DisplayCurrentMapName();\n    DisplayCurrentDungeonName();\n    UpdateMapsecNameBox();\n    DrawDungeonNameBox();\n    PrintTopBarTextRight(gText_RegionMap_AButtonGuide);\n    FREE_IF_NOT_NULL(sDungeonMapPreview);\n}\n\nstatic void CopyMapPreviewTilemapToBgTilemapBuffer(u8 bgId, const u16 * tilemap)\n{\n    CopyToBgTilemapBufferRect(2, tilemap, 0, 0, 32, 20);\n}\n\nstatic void InitScreenForDungeonMapPreview(void)\n{\n    u16 x;\n    u16 y;\n    ResetGpuRegs();\n    SetBldCnt(0, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_OBJ, BLDCNT_EFFECT_DARKEN);\n    SetBldY(sDungeonMapPreview->blendY);\n    SetWinIn(0, (WININ_WIN1_BG0 | WININ_WIN1_BG2 | WININ_WIN1_BG3) >> 8);\n    SetWinOut(WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n    SetDispCnt(1, FALSE);\n    x = GetMapCursorX();\n    y = GetMapCursorY();\n    sDungeonMapPreview->left = 8 * x + 32;\n    sDungeonMapPreview->top = 8 * y + 24;\n    sDungeonMapPreview->right = sDungeonMapPreview->left + 8;\n    sDungeonMapPreview->bottom = sDungeonMapPreview->top + 8;\n    sDungeonMapPreview->leftIncrement = (16 - sDungeonMapPreview->left) / 8;\n    sDungeonMapPreview->topIncrement = (32 - sDungeonMapPreview->top) / 8;\n    sDungeonMapPreview->rightIncrement = (224 - sDungeonMapPreview->right) / 8;\n    sDungeonMapPreview->bottomIncrement = (136 - sDungeonMapPreview->bottom) / 8;\n}\n\nstatic bool8 UpdateDungeonMapPreview(bool8 closing)\n{\n    struct GpuWindowParams data;\n\n    if (!closing)\n    {\n        if (sDungeonMapPreview->updateCounter < 8)\n        {\n            sDungeonMapPreview->left += sDungeonMapPreview->leftIncrement;\n            sDungeonMapPreview->top += sDungeonMapPreview->topIncrement;\n            sDungeonMapPreview->right += sDungeonMapPreview->rightIncrement;\n            sDungeonMapPreview->bottom += sDungeonMapPreview->bottomIncrement;\n            sDungeonMapPreview->updateCounter++;\n            if (sDungeonMapPreview->blendY < 6)\n                sDungeonMapPreview->blendY++;\n        }\n        else\n        {\n            return TRUE;\n        }\n    }\n    else\n    {\n        if (sDungeonMapPreview->updateCounter == 0)\n        {\n            return TRUE;\n        }\n        else\n        {\n            sDungeonMapPreview->left -= sDungeonMapPreview->leftIncrement;\n            sDungeonMapPreview->top -= sDungeonMapPreview->topIncrement;\n            sDungeonMapPreview->right -= sDungeonMapPreview->rightIncrement;\n            sDungeonMapPreview->bottom -= sDungeonMapPreview->bottomIncrement;\n            sDungeonMapPreview->updateCounter--;\n            if (sDungeonMapPreview->blendY > 0)\n                sDungeonMapPreview->blendY--;\n        }\n    }\n    data.left = sDungeonMapPreview->left;\n    data.top = sDungeonMapPreview->top;\n    data.right = sDungeonMapPreview->right;\n    data.bottom = sDungeonMapPreview->bottom;\n    SetGpuWindowDims(1, &data);\n    SetBldY(sDungeonMapPreview->blendY);\n    return FALSE;\n}\n\nstatic void SpriteCB_MapEdge(struct Sprite *sprite)\n{\n}\n\nstatic void CreateMapEdgeSprite(u8 mapEdgeNum, u8 tileTag, u8 palTag)\n{\n    u8 spriteId;\n    struct SpriteSheet spriteSheet = {\n        .data = sMapOpenCloseAnim->mapEdges[mapEdgeNum],\n        .size = 0x400,\n        .tag = tileTag\n    };\n    struct SpritePalette spritePalette = {\n        .data = sMapEdge_Pal,\n        .tag = palTag\n    };\n    struct SpriteTemplate template = {\n        .tileTag = tileTag,\n        .paletteTag = palTag,\n        .oam = &sOamData_MapEdge,\n        .anims = sAnims_MapEdge,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_MapEdge\n    };\n\n    sMapOpenCloseAnim->mapEdges[mapEdgeNum]->tileTag = tileTag;\n    sMapOpenCloseAnim->mapEdges[mapEdgeNum]->palTag = palTag;\n    LoadSpriteSheet(&spriteSheet);\n    LoadSpritePalette(&spritePalette);\n    spriteId = CreateSprite(&template, sMapOpenCloseAnim->mapEdges[mapEdgeNum]->x, sMapOpenCloseAnim->mapEdges[mapEdgeNum]->y, 0);\n    sMapOpenCloseAnim->mapEdges[mapEdgeNum]->sprite = &gSprites[spriteId];\n    gSprites[spriteId].invisible = TRUE;\n}\n\nstatic void InitMapOpenAnim(u8 taskId, TaskFunc taskFunc)\n{\n    u32 i;\n\n    sMapOpenCloseAnim = AllocZeroed(sizeof(struct MapOpenCloseAnim));\n    for (i = 0; i < NELEMS(sMapOpenCloseAnim->mapEdges); i++)\n    {\n        sMapOpenCloseAnim->mapEdges[i] = AllocZeroed(sizeof(struct MapEdge));\n        sMapOpenCloseAnim->mapEdges[i]->x = 32 * (i / 3) + 104;\n        sMapOpenCloseAnim->mapEdges[i]->y = 64 * (i % 3) + 40;\n    }\n    SaveRegionMapGpuRegs(0);\n    ResetGpuRegs();\n    InitScreenForMapOpenAnim();\n    SetBg0andBg3Hidden(TRUE);\n    sMapOpenCloseAnim->exitTask = taskFunc;\n    gTasks[taskId].func = Task_MapOpenAnim;\n}\n\nstatic void SetMapEdgeInvisibility(u8 mapEdgeNum, bool8 invisible)\n{\n    u32 i;\n    if (mapEdgeNum == NELEMS(sMapOpenCloseAnim->mapEdges))\n    {\n        for (i = 0; i < NELEMS(sMapOpenCloseAnim->mapEdges); i++)\n        {\n            sMapOpenCloseAnim->mapEdges[i]->sprite->invisible = invisible;\n        }\n    }\n    else\n    {\n        sMapOpenCloseAnim->mapEdges[mapEdgeNum]->sprite->invisible = invisible;\n    }\n}\n\nstatic bool8 LoadMapEdgeGfx(void)\n{\n    switch (sMapOpenCloseAnim->loadGfxState)\n    {\n    case 0:\n        LZ77UnCompWram(sMapEdge_TopLeft, sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->tiles);\n        CreateMapEdgeSprite(MAPEDGE_TOP_LEFT, 4, 4);\n        break;\n    case 1:\n        LZ77UnCompWram(sMapEdge_MidLeft, sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->tiles);\n        CreateMapEdgeSprite(MAPEDGE_MID_LEFT, 5, 5);\n        break;\n    case 2:\n        LZ77UnCompWram(sMapEdge_BottomLeft, sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->tiles);\n        CreateMapEdgeSprite(MAPEDGE_BOT_LEFT, 6, 6);\n        break;\n    case 3:\n        LZ77UnCompWram(sMapEdge_TopRight, sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->tiles);\n        CreateMapEdgeSprite(MAPEDGE_TOP_RIGHT, 7, 7);\n        break;\n    case 4:\n        LZ77UnCompWram(sMapEdge_MidRight, sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->tiles);\n        CreateMapEdgeSprite(MAPEDGE_MID_RIGHT, 8, 8);\n        break;\n    case 5:\n        LZ77UnCompWram(sMapEdge_BottomRight, sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->tiles);\n        CreateMapEdgeSprite(MAPEDGE_BOT_RIGHT, 9, 9);\n        break;\n    case 6:\n        LZ77UnCompWram(sMapEdge_Gfx, sMapOpenCloseAnim->tiles);\n        break;\n    case 7:\n        LZ77UnCompWram(sMapEdge_Tilemap, sMapOpenCloseAnim->tilemap);\n        break;\n    case 8:\n        LoadBgTiles(1, sMapOpenCloseAnim->tiles, BG_SCREEN_SIZE, 0);\n        break;\n    default:\n        return TRUE;\n    }\n    sMapOpenCloseAnim->loadGfxState++;\n    return FALSE;\n}\n\nstatic void InitScreenForMapOpenAnim(void)\n{\n    struct GpuWindowParams data;\n    data.left = sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->x + 8;\n    data.top = 16;\n    data.right = sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->x - 8;\n    data.bottom = 160;\n    SetBldCnt(0, BLDCNT_TGT1_BG1, BLDCNT_EFFECT_NONE);\n    SetWinIn((WININ_WIN0_BG1 | WININ_WIN0_OBJ), 0);\n    SetWinOut(WINOUT_WIN01_OBJ);\n    SetGpuWindowDims(0, &data);\n    SetDispCnt(0, FALSE);\n}\n\nstatic void SetGpuRegsToFadeMapToWhite(void)\n{\n    struct GpuWindowParams data = sMapWindowDim;\n    ResetGpuRegs();\n    SetBldCnt(BLDCNT_TGT2_BG1 >> 8, (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_BD), BLDCNT_EFFECT_LIGHTEN);\n    SetBldY(sMapOpenCloseAnim->blendY);\n    SetWinIn((WININ_WIN0_ALL & ~WININ_WIN0_BG3), 0);\n    SetWinOut(WINOUT_WIN01_BG1 | WINOUT_WIN01_OBJ);\n    SetGpuWindowDims(0, &data);\n    SetDispCnt(0, FALSE);\n}\n\nstatic void FinishMapOpenAnim(u8 taskId)\n{\n    gTasks[taskId].func = sMapOpenCloseAnim->exitTask;\n}\n\nstatic void FreeMapOpenCloseAnim(void)\n{\n    u32 i;\n    FreeMapEdgeSprites();\n    for (i = 0; i < NELEMS(sMapOpenCloseAnim->mapEdges); i++)\n    {\n        FREE_IF_NOT_NULL(sMapOpenCloseAnim->mapEdges[i]);\n    }\n    FREE_IF_NOT_NULL(sMapOpenCloseAnim);\n}\n\nstatic void FreeMapEdgeSprites(void)\n{\n    u32 i;\n    for (i = 0; i < NELEMS(sMapOpenCloseAnim->mapEdges); i++)\n    {\n        sMapOpenCloseAnim->mapEdges[i]->x = sMapOpenCloseAnim->mapEdges[i]->sprite->x;\n        sMapOpenCloseAnim->mapEdges[i]->y = sMapOpenCloseAnim->mapEdges[i]->sprite->y;\n        if (sMapOpenCloseAnim->mapEdges[i]->sprite != NULL)\n        {\n            DestroySprite(sMapOpenCloseAnim->mapEdges[i]->sprite);\n            FreeSpriteTilesByTag(sMapOpenCloseAnim->mapEdges[i]->tileTag);\n            FreeSpritePaletteByTag(sMapOpenCloseAnim->mapEdges[i]->palTag);\n        }\n    }\n}\n\nstatic void Task_MapOpenAnim(u8 taskId)\n{\n    switch (sMapOpenCloseAnim->openState)\n    {\n    case 0:\n        NullVBlankHBlankCallbacks();\n        sMapOpenCloseAnim->openState++;\n        break;\n    case 1:\n        if (LoadMapEdgeGfx() == TRUE)\n            sMapOpenCloseAnim->openState++;\n        break;\n    case 2:\n        CopyToBgTilemapBufferRect(1, sMapOpenCloseAnim->tilemap, 0, 0, 30, 20);\n        sMapOpenCloseAnim->openState++;\n        break;\n    case 3:\n        CopyBgTilemapBufferToVram(1);\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        SetRegionMapVBlankCB();\n        sMapOpenCloseAnim->openState++;\n        break;\n    case 4:\n        ShowBg(0);\n        ShowBg(3);\n        ShowBg(1);\n        SetMapEdgeInvisibility(NELEMS(sMapOpenCloseAnim->mapEdges), FALSE);\n        SetGpuWindowDimsToMapEdges();\n        sMapOpenCloseAnim->openState++;\n        break;\n    case 5:\n        if (!gPaletteFade.active)\n        {\n            sMapOpenCloseAnim->openState++;\n            PlaySE(SE_CARD_OPEN);\n        }\n        break;\n    case 6:\n        if (MoveMapEdgesOutward() == TRUE)\n            sMapOpenCloseAnim->openState++;\n        break;\n    case 7:\n        SetPlayerIconInvisibility(FALSE);\n        SetMapCursorInvisibility(FALSE);\n        sMapOpenCloseAnim->openState++;\n        break;\n    case 8:\n        sMapOpenCloseAnim->blendY = 15;\n        SetGpuRegsToFadeMapToWhite();\n        SetBg0andBg3Hidden(FALSE);\n        SetFlyIconInvisibility(GetSelectedRegionMap(), NELEMS(sMapIcons->flyIcons), FALSE);\n        SetDungeonIconInvisibility(GetSelectedRegionMap(), NELEMS(sMapIcons->dungeonIcons), FALSE);\n        sMapOpenCloseAnim->openState++;\n        break;\n    case 9:\n        PrintTopBarTextLeft(gText_RegionMap_DPadMove);\n        if (GetSelectedMapsecType(LAYER_DUNGEON) != MAPSECTYPE_VISITED)\n            PrintTopBarTextRight(gText_RegionMap_Space);\n        else\n            PrintTopBarTextRight(gText_RegionMap_AButtonGuide);\n        ClearOrDrawTopBar(FALSE);\n        sMapOpenCloseAnim->openState++;\n        break;\n    case 10:\n        LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(0), sizeof(sTopBar_Pal[15]));\n        LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(1), sizeof(sTopBar_Pal[15]));\n        LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(2), sizeof(sTopBar_Pal[15]));\n        LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(3), sizeof(sTopBar_Pal[15]));\n        LoadPalette(&sTopBar_Pal[15], BG_PLTT_ID(4), sizeof(sTopBar_Pal[15]));\n        sMapOpenCloseAnim->openState++;\n        break;\n    case 11:\n        FillBgTilemapBufferRect(1, 0x002, 0, 1, 1, 1, 2);\n        FillBgTilemapBufferRect(1, 0x003, 1, 1, 1, 1, 2);\n        FillBgTilemapBufferRect(1, 0x03E, 28, 1, 1, 1, 2);\n        FillBgTilemapBufferRect(1, 0x03F, 29, 1, 1, 1, 2);\n        FillBgTilemapBufferRect(1, 0x03D, 2, 1, 26, 1, 2);\n        CopyBgTilemapBufferToVram(1);\n        m4aSongNumStop(SE_CARD_OPEN);\n        PlaySE(SE_ROTATING_GATE);\n        sMapOpenCloseAnim->openState++;\n        break;\n    case 12:\n        if (sMapOpenCloseAnim->blendY == 2)\n        {\n            SetMapEdgeInvisibility(NELEMS(sMapOpenCloseAnim->mapEdges), TRUE);\n            sMapOpenCloseAnim->openState++;\n            SetBldY(0);\n        }\n        else\n        {\n            sMapOpenCloseAnim->blendY--;\n            SetBldY(sMapOpenCloseAnim->blendY);\n        }\n        break;\n    case 13:\n        SetRegionMapGpuRegs(0);\n        DisplayCurrentDungeonName();\n        sMapOpenCloseAnim->openState++;\n        break;\n    default:\n        FreeMapEdgeSprites();\n        FinishMapOpenAnim(taskId);\n        break;\n    }\n}\n\nstatic bool8 MoveMapEdgesOutward(void)\n{\n    SetGpuWindowDimsToMapEdges();\n    if (sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x == 0)\n    {\n        return TRUE;\n    }\n    else if (sMapOpenCloseAnim->moveState > 17)\n    {\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x -= 1;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x -= 1;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x -= 1;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x += 1;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x += 1;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x += 1;\n    }\n    else if (sMapOpenCloseAnim->moveState > 14)\n    {\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x -= 2;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x -= 2;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x -= 2;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x += 2;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x += 2;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x += 2;\n    }\n    else if (sMapOpenCloseAnim->moveState > 10)\n    {\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x -= 3;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x -= 3;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x -= 3;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x += 3;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x += 3;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x += 3;\n    }\n    else if (sMapOpenCloseAnim->moveState > 6)\n    {\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x -= 5;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x -= 5;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x -= 5;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x += 5;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x += 5;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x += 5;\n    }\n    else\n    {\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x -= 8;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x -= 8;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x -= 8;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x += 8;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x += 8;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x += 8;\n    }\n    sMapOpenCloseAnim->moveState++;\n    return FALSE;\n}\n\nstatic void SetGpuWindowDimsToMapEdges(void)\n{\n    struct GpuWindowParams data;\n    data.left = sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x;\n    data.top = 16;\n    data.right = sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x;\n    data.bottom = 160;\n    SetGpuWindowDims(0, &data);\n}\n\nstatic void InitScreenForMapCloseAnim(void)\n{\n    struct GpuWindowParams data;\n    data.left = sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->x + 16;\n    data.top = 16;\n    data.right = sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->x - 16;\n    data.bottom = 160;\n    SetBldCnt(0, BLDCNT_TGT1_BG1, BLDCNT_EFFECT_NONE);\n    SetWinIn((WININ_WIN0_BG1 | WININ_WIN0_OBJ), 0);\n    SetWinOut(WINOUT_WIN01_OBJ);\n    SetGpuWindowDims(0, &data);\n    SetDispCnt(0, FALSE);\n}\n\nstatic void DoMapCloseAnim(u8 taskId)\n{\n    gTasks[taskId].func = Task_MapCloseAnim;\n}\n\nstatic void CreateMapEdgeSprites(void)\n{\n    CreateMapEdgeSprite(0, 4, 4);\n    CreateMapEdgeSprite(1, 5, 5);\n    CreateMapEdgeSprite(2, 6, 6);\n    CreateMapEdgeSprite(3, 7, 7);\n    CreateMapEdgeSprite(4, 8, 8);\n    CreateMapEdgeSprite(5, 9, 9);\n}\n\nstatic void Task_MapCloseAnim(u8 taskId)\n{\n    switch (sMapOpenCloseAnim->closeState)\n    {\n    case 0:\n        ClearOrDrawTopBar(TRUE);\n        CopyWindowToVram(WIN_TOPBAR_LEFT, COPYWIN_FULL);\n        CopyWindowToVram(WIN_TOPBAR_RIGHT, COPYWIN_FULL);\n        sMapOpenCloseAnim->closeState++;\n        break;\n    case 1:\n        CreateMapEdgeSprites();\n        sMapOpenCloseAnim->closeState++;\n        break;\n    case 2:\n        LoadPalette(sRegionMap_Pal, BG_PLTT_ID(0), sizeof(sRegionMap_Pal));\n        sMapOpenCloseAnim->closeState++;\n        break;\n    case 3:\n        SetMapEdgeInvisibility(NELEMS(sMapOpenCloseAnim->mapEdges), FALSE);\n        SetPlayerIconInvisibility(TRUE);\n        SetMapCursorInvisibility(TRUE);\n        SetDungeonIconInvisibility(0xFF, NELEMS(sMapIcons->dungeonIcons), TRUE);\n        SetFlyIconInvisibility(0xFF, NELEMS(sMapIcons->flyIcons), TRUE);\n        sMapOpenCloseAnim->moveState = 0;\n        sMapOpenCloseAnim->blendY = 0;\n        sMapOpenCloseAnim->closeState++;\n        break;\n    case 4:\n        SetGpuRegsToFadeMapToWhite();\n        sMapOpenCloseAnim->closeState++;\n        break;\n    case 5:\n        if (sMapOpenCloseAnim->blendY == 15)\n        {\n            SetBldY(sMapOpenCloseAnim->blendY);\n            sMapOpenCloseAnim->closeState++;\n        }\n        else\n        {\n            sMapOpenCloseAnim->blendY++;\n            SetBldY(sMapOpenCloseAnim->blendY);\n        }\n        break;\n    case 6:\n        InitScreenForMapCloseAnim();\n        SetGpuWindowDimsToMapEdges();\n        PlaySE(SE_CARD_FLIPPING);\n        sMapOpenCloseAnim->closeState++;\n        break;\n    case 7:\n        if (MoveMapEdgesInward() == TRUE)\n            sMapOpenCloseAnim->closeState++;\n        break;\n    default:\n        gTasks[taskId].func = sMapOpenCloseAnim->exitTask;\n        break;\n    }\n}\n\n\nstatic bool8 MoveMapEdgesInward(void)\n{\n    SetGpuWindowDimsToMapEdges();\n    if (sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x == 104)\n    {\n        return TRUE;\n    }\n    else if (sMapOpenCloseAnim->moveState > 17)\n    {\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x += 1;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x += 1;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x += 1;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x -= 1;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x -= 1;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x -= 1;\n    }\n    else if (sMapOpenCloseAnim->moveState > 14)\n    {\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x += 2;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x += 2;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x += 2;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x -= 2;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x -= 2;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x -= 2;\n    }\n    else if (sMapOpenCloseAnim->moveState > 10)\n    {\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x += 3;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x += 3;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x += 3;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x -= 3;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x -= 3;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x -= 3;\n    }\n    else if (sMapOpenCloseAnim->moveState > 6)\n    {\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x += 5;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x += 5;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x += 5;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x -= 5;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x -= 5;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x -= 5;\n    }\n    else\n    {\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_LEFT]->sprite->x += 8;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_LEFT]->sprite->x += 8;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_LEFT]->sprite->x += 8;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_TOP_RIGHT]->sprite->x -= 8;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_MID_RIGHT]->sprite->x -= 8;\n        sMapOpenCloseAnim->mapEdges[MAPEDGE_BOT_RIGHT]->sprite->x -= 8;\n    }\n    sMapOpenCloseAnim->moveState++;\n    return FALSE;\n}\n\nstatic void SpriteCB_MapCursor(struct Sprite *sprite)\n{\n    if (sMapCursor->moveCounter != 0)\n    {\n        sprite->x += sMapCursor->horizontalMove;\n        sprite->y += sMapCursor->verticalMove;\n        sMapCursor->moveCounter--;\n    }\n    else\n    {\n        sMapCursor->sprite->x = 8 * sMapCursor->x + 36;\n        sMapCursor->sprite->y = 8 * sMapCursor->y + 36;\n    }\n}\n\nstatic void CreateMapCursor(u16 tileTag, u16 palTag)\n{\n    sMapCursor = AllocZeroed(sizeof(struct MapCursor));\n    LZ77UnCompWram(sMapCursor_Gfx, sMapCursor->tiles);\n    sMapCursor->tileTag = tileTag;\n    sMapCursor->palTag = palTag;\n    GetPlayerPositionOnRegionMap_HandleOverrides();\n    sMapCursor->spriteX = 8 * sMapCursor->x + 36;\n    sMapCursor->spriteY = 8 * sMapCursor->y + 36;\n    sMapCursor->inputHandler = HandleRegionMapInput;\n    sMapCursor->selectedMapsecType = GetMapsecType(sMapCursor->selectedMapsec);\n    sMapCursor->selectedDungeonType = GetDungeonMapsecType(GetSelectedMapSection(GetSelectedRegionMap(), LAYER_DUNGEON, sMapCursor->y, sMapCursor->x));\n    CreateMapCursorSprite();\n}\n\nstatic void CreateMapCursorSprite(void)\n{\n    u8 spriteId;\n    struct SpriteSheet spriteSheet = {\n        .data = sMapCursor->tiles,\n        .size = sizeof(sMapCursor->tiles),\n        .tag = sMapCursor->tileTag\n    };\n    struct SpritePalette spritePalette = {\n        .data = sMapCursor_Pal,\n        .tag = sMapCursor->palTag\n    };\n    struct SpriteTemplate template = {\n        .tileTag = sMapCursor->tileTag,\n        .paletteTag = sMapCursor->palTag,\n        .oam = &sOamData_MapCursor,\n        .anims = sAnims_MapCursor,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCB_MapCursor\n    };\n\n    LoadSpriteSheet(&spriteSheet);\n    LoadSpritePalette(&spritePalette);\n    spriteId = CreateSprite(&template, sMapCursor->spriteX, sMapCursor->spriteY, 0);\n    sMapCursor->sprite = &gSprites[spriteId];\n    SetMapCursorInvisibility(TRUE);\n}\n\nstatic void SetMapCursorInvisibility(bool8 invisibile)\n{\n    sMapCursor->sprite->invisible = invisibile;\n}\n\nstatic void ResetCursorSnap(void)\n{\n    sMapCursor->snapId = 0;\n}\n\nstatic void FreeMapCursor(void)\n{\n    if (sMapCursor->sprite != NULL)\n    {\n        DestroySprite(sMapCursor->sprite);\n        FreeSpriteTilesByTag(sMapCursor->tileTag);\n        FreeSpritePaletteByTag(sMapCursor->palTag);\n    }\n    FREE_IF_NOT_NULL(sMapCursor);\n}\n\nstatic u8 HandleRegionMapInput(void)\n{\n    u8 input = MAP_INPUT_NONE;\n    sMapCursor->horizontalMove = 0;\n    sMapCursor->verticalMove = 0;\n\n    if (JOY_HELD(DPAD_UP))\n    {\n        if (sMapCursor->y > 0)\n        {\n            sMapCursor->verticalMove = -2;\n            input = MAP_INPUT_MOVE_START;\n        }\n    }\n    if (JOY_HELD(DPAD_DOWN))\n    {\n        if (sMapCursor->y < MAP_HEIGHT - 1)\n        {\n            sMapCursor->verticalMove = 2;\n            input = MAP_INPUT_MOVE_START;\n        }\n    }\n    if (JOY_HELD(DPAD_RIGHT))\n    {\n        if (sMapCursor->x < MAP_WIDTH - 1)\n        {\n            sMapCursor->horizontalMove = 2;\n            input = MAP_INPUT_MOVE_START;\n        }\n    }\n    if (JOY_HELD(DPAD_LEFT))\n    {\n        if (sMapCursor->x > 0)\n        {\n            sMapCursor->horizontalMove = -2;\n            input = MAP_INPUT_MOVE_START;\n        }\n    }\n    if (JOY_NEW(A_BUTTON))\n    {\n        input = MAP_INPUT_A_BUTTON;\n        if (sMapCursor->x == CANCEL_BUTTON_X \n         && sMapCursor->y == CANCEL_BUTTON_Y)\n        {\n            PlaySE(SE_M_HYPER_BEAM2);\n            input = MAP_INPUT_CANCEL;\n        }\n        if (sMapCursor->x == SWITCH_BUTTON_X \n         && sMapCursor->y == SWITCH_BUTTON_Y \n         && GetRegionMapPermission(MAPPERM_HAS_SWITCH_BUTTON) == TRUE)\n        {\n            PlaySE(SE_M_HYPER_BEAM2);\n            input = MAP_INPUT_SWITCH;\n        }\n    }\n    else if (!JOY_NEW(B_BUTTON))\n    {\n        if (JOY_REPT(START_BUTTON))\n        {\n            SnapToIconOrButton();\n            sMapCursor->selectedMapsec = GetSelectedMapSection(GetSelectedRegionMap(), LAYER_MAP, sMapCursor->y, sMapCursor->x);\n            sMapCursor->selectedMapsecType = GetMapsecType(sMapCursor->selectedMapsec);\n            sMapCursor->selectedDungeonType = GetDungeonMapsecType(GetSelectedMapSection(GetSelectedRegionMap(), LAYER_DUNGEON, sMapCursor->y, sMapCursor->x));\n            return MAP_INPUT_MOVE_END;\n        }\n        else if (JOY_NEW(SELECT_BUTTON) && sRegionMap->savedCallback == CB2_ReturnToField)\n        {\n            input = MAP_INPUT_CANCEL;\n        }\n    }\n    else\n    {\n        input = MAP_INPUT_CANCEL;\n    }\n    if (input == MAP_INPUT_MOVE_START)\n    {\n        sMapCursor->moveCounter = 4;\n        sMapCursor->inputHandler = MoveMapCursor;\n    }\n    return input;\n}\n\nstatic u8 MoveMapCursor(void)\n{\n    if (sMapCursor->moveCounter != 0)\n        return MAP_INPUT_MOVE_CONT;\n    if (sMapCursor->horizontalMove > 0)\n        sMapCursor->x++;\n    if (sMapCursor->horizontalMove < 0)\n        sMapCursor->x--;\n    if (sMapCursor->verticalMove > 0)\n        sMapCursor->y++;\n    if (sMapCursor->verticalMove < 0)\n        sMapCursor->y--;\n    sMapCursor->selectedMapsec = GetSelectedMapSection(GetSelectedRegionMap(), LAYER_MAP, sMapCursor->y, sMapCursor->x);\n    sMapCursor->selectedMapsecType = GetMapsecType(sMapCursor->selectedMapsec);\n    sMapCursor->selectedDungeonType = GetDungeonMapsecType(GetSelectedMapSection(GetSelectedRegionMap(), LAYER_DUNGEON, sMapCursor->y, sMapCursor->x));\n    sMapCursor->inputHandler = HandleRegionMapInput;\n    return MAP_INPUT_MOVE_END;\n}\n\nstatic u8 GetRegionMapInput(void)\n{\n    return sMapCursor->inputHandler();\n}\n\n// Pressing Start on the map snaps the cursor to the Buttons / Player Icon\n// Pressing repeatedly cycles between them\nstatic void SnapToIconOrButton(void)\n{\n    if (GetRegionMapPermission(MAPPERM_HAS_SWITCH_BUTTON) == TRUE)\n    {\n        sMapCursor->snapId++;\n        sMapCursor->snapId %= 3;\n        if (sMapCursor->snapId == 0 && GetSelectedRegionMap() != GetRegionMapPlayerIsOn())\n        {\n            // Player icon not present on this map, skip it\n            sMapCursor->snapId++;\n        }\n        switch (sMapCursor->snapId)\n        {\n        case 0:\n        default:\n            sMapCursor->x = GetPlayerIconX();\n            sMapCursor->y = GetPlayerIconY();\n            break;\n        case 1:\n            sMapCursor->x = SWITCH_BUTTON_X;\n            sMapCursor->y = SWITCH_BUTTON_Y;\n            break;\n        case 2:\n            sMapCursor->y = CANCEL_BUTTON_Y;\n            sMapCursor->x = CANCEL_BUTTON_X;\n            break;\n        }\n    }\n    else\n    {\n        sMapCursor->snapId++;\n        sMapCursor->snapId %= 2;\n        switch (sMapCursor->snapId)\n        {\n        case 0:\n        default:\n            sMapCursor->x = GetPlayerIconX();\n            sMapCursor->y = GetPlayerIconY();\n            break;\n        case 1:\n            sMapCursor->y = CANCEL_BUTTON_Y;\n            sMapCursor->x = CANCEL_BUTTON_X;\n            break;\n        }\n    }\n    sMapCursor->sprite->x = 8 * sMapCursor->x + 36;\n    sMapCursor->sprite->y = 8 * sMapCursor->y + 36;\n    sMapCursor->selectedMapsec = GetSelectedMapSection(GetSelectedRegionMap(), LAYER_MAP, sMapCursor->y, sMapCursor->x);\n}\n\nstatic u16 GetMapCursorX(void)\n{\n    return sMapCursor->x;\n}\n\nstatic u16 GetMapCursorY(void)\n{\n    return sMapCursor->y;\n}\n\nstatic u16 GetMapsecUnderCursor(void)\n{\n    u8 mapsec;\n    if (sMapCursor->y < 0\n     || sMapCursor->y >= MAP_HEIGHT\n     || sMapCursor->x < 0\n     || sMapCursor->x >= MAP_WIDTH)\n        return MAPSEC_NONE;\n\n    mapsec = GetSelectedMapSection(GetSelectedRegionMap(), LAYER_MAP, sMapCursor->y, sMapCursor->x);\n    if ((mapsec == MAPSEC_NAVEL_ROCK || mapsec == MAPSEC_BIRTH_ISLAND) && !FlagGet(FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR))\n        mapsec = MAPSEC_NONE;\n    return mapsec;\n}\n\nstatic u16 GetDungeonMapsecUnderCursor(void)\n{\n    u8 mapsec;\n    if (sMapCursor->y < 0\n     || sMapCursor->y >= MAP_HEIGHT\n     || sMapCursor->x < 0\n     || sMapCursor->x >= MAP_WIDTH)\n        return MAPSEC_NONE;\n\n    mapsec = GetSelectedMapSection(GetSelectedRegionMap(), LAYER_DUNGEON, sMapCursor->y, sMapCursor->x);\n    if (mapsec == MAPSEC_CERULEAN_CAVE && !FlagGet(FLAG_SYS_CAN_LINK_WITH_RS))\n        mapsec = MAPSEC_NONE;\n    return mapsec;\n}\n\nstatic u8 GetMapsecType(u8 mapsec)\n{\n    switch (mapsec)\n    {\n    case MAPSEC_PALLET_TOWN:\n        return FlagGet(FLAG_WORLD_MAP_PALLET_TOWN) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_VIRIDIAN_CITY:\n        return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_PEWTER_CITY:\n        return FlagGet(FLAG_WORLD_MAP_PEWTER_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_CERULEAN_CITY:\n        return FlagGet(FLAG_WORLD_MAP_CERULEAN_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_LAVENDER_TOWN:\n        return FlagGet(FLAG_WORLD_MAP_LAVENDER_TOWN) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_VERMILION_CITY:\n        return FlagGet(FLAG_WORLD_MAP_VERMILION_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_CELADON_CITY:\n        return FlagGet(FLAG_WORLD_MAP_CELADON_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_FUCHSIA_CITY:\n        return FlagGet(FLAG_WORLD_MAP_FUCHSIA_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_CINNABAR_ISLAND:\n        return FlagGet(FLAG_WORLD_MAP_CINNABAR_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_INDIGO_PLATEAU:\n        return FlagGet(FLAG_WORLD_MAP_INDIGO_PLATEAU_EXTERIOR) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_SAFFRON_CITY:\n        return FlagGet(FLAG_WORLD_MAP_SAFFRON_CITY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_ONE_ISLAND:\n        return FlagGet(FLAG_WORLD_MAP_ONE_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_TWO_ISLAND:\n        return FlagGet(FLAG_WORLD_MAP_TWO_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_THREE_ISLAND:\n        return FlagGet(FLAG_WORLD_MAP_THREE_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_FOUR_ISLAND:\n        return FlagGet(FLAG_WORLD_MAP_FOUR_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_FIVE_ISLAND:\n        return FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_SEVEN_ISLAND:\n        return FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_SIX_ISLAND:\n        return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_ROUTE_4_POKECENTER:\n        if (!GetRegionMapPermission(MAPPERM_HAS_FLY_DESTINATIONS))\n            return MAPSECTYPE_NONE;\n        return FlagGet(FLAG_WORLD_MAP_ROUTE4_POKEMON_CENTER_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_ROUTE_10_POKECENTER:\n        return FlagGet(FLAG_WORLD_MAP_ROUTE10_POKEMON_CENTER_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_NONE:\n        return MAPSECTYPE_NONE;\n    default:\n        return MAPSECTYPE_ROUTE;\n    }\n}\n\nstatic u8 GetDungeonMapsecType(u8 mapsec)\n{\n    switch (mapsec)\n    {\n    case MAPSEC_NONE:\n        return MAPSECTYPE_NONE;\n    case MAPSEC_VIRIDIAN_FOREST:\n        return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_MT_MOON:\n        return FlagGet(FLAG_WORLD_MAP_MT_MOON_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_S_S_ANNE:\n        return FlagGet(FLAG_WORLD_MAP_SSANNE_EXTERIOR) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_UNDERGROUND_PATH:\n        return FlagGet(FLAG_WORLD_MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_UNDERGROUND_PATH_2:\n        return FlagGet(FLAG_WORLD_MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_DIGLETTS_CAVE:\n        return FlagGet(FLAG_WORLD_MAP_DIGLETTS_CAVE_B1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_KANTO_VICTORY_ROAD:\n        return FlagGet(FLAG_WORLD_MAP_VICTORY_ROAD_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_ROCKET_HIDEOUT:\n        return FlagGet(FLAG_WORLD_MAP_ROCKET_HIDEOUT_B1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_SILPH_CO:\n        return FlagGet(FLAG_WORLD_MAP_SILPH_CO_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_POKEMON_MANSION:\n        return FlagGet(FLAG_WORLD_MAP_POKEMON_MANSION_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_KANTO_SAFARI_ZONE:\n        return FlagGet(FLAG_WORLD_MAP_SAFARI_ZONE_CENTER) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_POKEMON_LEAGUE:\n        return FlagGet(FLAG_WORLD_MAP_POKEMON_LEAGUE_LORELEIS_ROOM) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_ROCK_TUNNEL:\n        return FlagGet(FLAG_WORLD_MAP_ROCK_TUNNEL_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_SEAFOAM_ISLANDS:\n        return FlagGet(FLAG_WORLD_MAP_SEAFOAM_ISLANDS_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_POKEMON_TOWER:\n        return FlagGet(FLAG_WORLD_MAP_POKEMON_TOWER_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_CERULEAN_CAVE:\n        return FlagGet(FLAG_WORLD_MAP_CERULEAN_CAVE_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_POWER_PLANT:\n        return FlagGet(FLAG_WORLD_MAP_POWER_PLANT) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_NAVEL_ROCK:\n        return FlagGet(FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_MT_EMBER:\n        return FlagGet(FLAG_WORLD_MAP_MT_EMBER_EXTERIOR) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_BERRY_FOREST:\n        return FlagGet(FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_ICEFALL_CAVE:\n        return FlagGet(FLAG_WORLD_MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_ROCKET_WAREHOUSE:\n        return FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND_ROCKET_WAREHOUSE) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_TRAINER_TOWER_2:\n        return FlagGet(FLAG_WORLD_MAP_TRAINER_TOWER_LOBBY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_DOTTED_HOLE:\n        return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND_DOTTED_HOLE_1F) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_LOST_CAVE:\n        return FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_PATTERN_BUSH:\n        return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND_PATTERN_BUSH) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_ALTERING_CAVE:\n        return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND_ALTERING_CAVE) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_TANOBY_CHAMBERS:\n        return FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_THREE_ISLE_PATH:\n        return FlagGet(FLAG_WORLD_MAP_THREE_ISLAND_DUNSPARCE_TUNNEL) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_TANOBY_KEY:\n        return FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    case MAPSEC_BIRTH_ISLAND:\n        return FlagGet(FLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIOR) ? MAPSECTYPE_VISITED : MAPSECTYPE_NOT_VISITED;\n    default:\n        return MAPSECTYPE_ROUTE;\n    }\n}\n\nstatic u8 GetSelectedMapsecType(u8 layer)\n{\n    switch (layer)\n    {\n    default:\n        return sMapCursor->selectedMapsecType;\n    case LAYER_MAP:\n        return sMapCursor->selectedMapsecType;\n    case LAYER_DUNGEON:\n        return sMapCursor->selectedDungeonType;\n    }\n}\n\nstatic u16 GetPlayerCurrentMapSectionId(void)\n{\n    return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->regionMapSectionId;\n}\n\nstatic void GetPlayerPositionOnRegionMap(void)\n{\n    u16 width;\n    u32 divisor;\n    u16 height;\n    u16 x;\n    u16 y;\n\n    const struct MapHeader * mapHeader;\n    struct WarpData * warp;\n\n    switch (GetMapTypeByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum))\n    {\n    default:\n    case MAP_TYPE_TOWN:\n    case MAP_TYPE_CITY:\n    case MAP_TYPE_ROUTE:\n    case MAP_TYPE_UNDERWATER:\n    case MAP_TYPE_OCEAN_ROUTE:\n        sMapCursor->selectedMapsec = gMapHeader.regionMapSectionId;\n        width = gMapHeader.mapLayout->width;\n        height = gMapHeader.mapLayout->height;\n        x = gSaveBlock1Ptr->pos.x;\n        y = gSaveBlock1Ptr->pos.y;\n        break;\n    case MAP_TYPE_UNDERGROUND:\n    case MAP_TYPE_UNKNOWN:\n        mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->escapeWarp.mapGroup, gSaveBlock1Ptr->escapeWarp.mapNum);\n        sMapCursor->selectedMapsec = mapHeader->regionMapSectionId;\n        width = mapHeader->mapLayout->width;\n        height = mapHeader->mapLayout->height;\n        x = gSaveBlock1Ptr->escapeWarp.x;\n        y = gSaveBlock1Ptr->escapeWarp.y;\n        break;\n    case MAP_TYPE_SECRET_BASE:\n        mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->dynamicWarp.mapGroup, gSaveBlock1Ptr->dynamicWarp.mapNum);\n        sMapCursor->selectedMapsec = mapHeader->regionMapSectionId;\n        width = mapHeader->mapLayout->width;\n        height = mapHeader->mapLayout->height;\n        x = gSaveBlock1Ptr->dynamicWarp.x;\n        y = gSaveBlock1Ptr->dynamicWarp.y;\n        break;\n    case MAP_TYPE_INDOOR:\n        if ((sMapCursor->selectedMapsec = gMapHeader.regionMapSectionId) != MAPSEC_SPECIAL_AREA)\n        {\n            warp = &gSaveBlock1Ptr->escapeWarp;\n            mapHeader = Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum);\n        }\n        else\n        {\n            warp = &gSaveBlock1Ptr->dynamicWarp;\n            mapHeader = Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum);\n            sMapCursor->selectedMapsec = mapHeader->regionMapSectionId;\n        }\n        width = mapHeader->mapLayout->width;\n        height = mapHeader->mapLayout->height;\n        x = warp->x;\n        y = warp->y;\n        break;\n    }\n\n    sMapCursor->selectedMapsec;\n    divisor = width / sMapSectionDimensions[sMapCursor->selectedMapsec][0];\n    if (divisor == 0)\n        divisor = 1;\n    x /= divisor;\n    if (x >= sMapSectionDimensions[sMapCursor->selectedMapsec][0])\n        x = sMapSectionDimensions[sMapCursor->selectedMapsec][0] - 1;\n    divisor = height / sMapSectionDimensions[sMapCursor->selectedMapsec][1];\n    if (divisor == 0)\n        divisor = 1;\n    y /= divisor;\n    if (y >= sMapSectionDimensions[sMapCursor->selectedMapsec][1])\n        y = sMapSectionDimensions[sMapCursor->selectedMapsec][1] - 1;\n    sMapCursor->x = x + sMapSectionTopLeftCorners[sMapCursor->selectedMapsec][0];\n    sMapCursor->y = y + sMapSectionTopLeftCorners[sMapCursor->selectedMapsec][1];\n}\n\nstatic void GetPlayerPositionOnRegionMap_HandleOverrides(void)\n{\n    switch (GetPlayerCurrentMapSectionId())\n    {\n    case MAPSEC_KANTO_SAFARI_ZONE:\n        sMapCursor->x = 12;\n        sMapCursor->y = 12;\n        break;\n    case MAPSEC_SILPH_CO:\n        sMapCursor->x = 14;\n        sMapCursor->y = 6;\n        break;\n    case MAPSEC_POKEMON_MANSION:\n        sMapCursor->x = 4;\n        sMapCursor->y = 14;\n        break;\n    case MAPSEC_POKEMON_TOWER:\n        sMapCursor->x = 18;\n        sMapCursor->y = 6;\n        break;\n    case MAPSEC_POWER_PLANT:\n        sMapCursor->x = 18;\n        sMapCursor->y = 4;\n        break;\n    case MAPSEC_S_S_ANNE:\n        sMapCursor->x = 14;\n        sMapCursor->y = 9;\n        break;\n    case MAPSEC_POKEMON_LEAGUE:\n        sMapCursor->x = 2;\n        sMapCursor->y = 3;\n        break;\n    case MAPSEC_ROCKET_HIDEOUT:\n        sMapCursor->x = 11;\n        sMapCursor->y = 6;\n        break;\n    case MAPSEC_UNDERGROUND_PATH:\n        sMapCursor->x = 14;\n        sMapCursor->y = 7;\n        if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(UNDERGROUND_PATH_NORTH_ENTRANCE))\n        {\n            sMapCursor->x = 14; // optimized out but required to match\n            sMapCursor->y = 5;\n        }\n        break;\n    case MAPSEC_UNDERGROUND_PATH_2:\n        sMapCursor->x = 12;\n        sMapCursor->y = 6;\n        if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(UNDERGROUND_PATH_EAST_ENTRANCE))\n        {\n            sMapCursor->x = 15;\n            sMapCursor->y = 6; // optimized out but required to match\n        }\n        break;\n    case MAPSEC_BIRTH_ISLAND:\n        sMapCursor->x = 18;\n        sMapCursor->y = 13;\n        break;\n    case MAPSEC_NAVEL_ROCK:\n        sMapCursor->x = 10;\n        sMapCursor->y = 8;\n        break;\n    case MAPSEC_TRAINER_TOWER_2:\n        sMapCursor->x = 5;\n        sMapCursor->y = 6;\n        break;\n    case MAPSEC_MT_EMBER:\n        sMapCursor->x = 2;\n        sMapCursor->y = 3;\n        break;\n    case MAPSEC_BERRY_FOREST:\n        sMapCursor->x = 14;\n        sMapCursor->y = 12;\n        break;\n    case MAPSEC_PATTERN_BUSH:\n        sMapCursor->x = 17;\n        sMapCursor->y = 3;\n        break;\n    case MAPSEC_ROCKET_WAREHOUSE:\n        sMapCursor->x = 17;\n        sMapCursor->y = 11;\n        break;\n    case MAPSEC_DILFORD_CHAMBER:\n    case MAPSEC_LIPTOO_CHAMBER:\n    case MAPSEC_MONEAN_CHAMBER:\n    case MAPSEC_RIXY_CHAMBER:\n    case MAPSEC_SCUFIB_CHAMBER:\n    case MAPSEC_TANOBY_CHAMBERS:\n    case MAPSEC_VIAPOIS_CHAMBER:\n    case MAPSEC_WEEPTH_CHAMBER:\n        sMapCursor->x = 9;\n        sMapCursor->y = 12;\n        break;\n    case MAPSEC_DOTTED_HOLE:\n        sMapCursor->x = 16;\n        sMapCursor->y = 8;\n        break;\n    case MAPSEC_VIRIDIAN_FOREST:\n        sMapCursor->x = 4;\n        sMapCursor->y = 6;\n        break;\n    case MAPSEC_ROUTE_2:\n        if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN))\n        {\n            sMapCursor->x = 4;\n            sMapCursor->y = 7;\n        }\n        else if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(CERULEAN_CITY))\n        {\n            sMapCursor->x = 4;\n            sMapCursor->y = 5;\n        }\n        else\n        {\n            GetPlayerPositionOnRegionMap();\n        }\n        break;\n    case MAPSEC_ROUTE_21:\n        if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE21_NORTH))\n        {\n            sMapCursor->x = 4;\n            sMapCursor->y = 12;\n        }\n        else if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE21_SOUTH))\n        {\n            sMapCursor->x = 4;\n            sMapCursor->y = 13;\n        }\n        break;\n    case MAPSEC_ROUTE_5:\n        if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(VIRIDIAN_CITY))\n        {\n            sMapCursor->x = 14;\n            sMapCursor->y = 5;\n        }\n        else\n        {\n            GetPlayerPositionOnRegionMap();\n        }\n        break;\n    case MAPSEC_ROUTE_6:\n        if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN))\n        {\n            sMapCursor->x = 14;\n            sMapCursor->y = 7;\n        }\n        else\n        {\n            GetPlayerPositionOnRegionMap();\n        }\n        break;\n    case MAPSEC_ROUTE_7:\n        if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN))\n        {\n            sMapCursor->x = 13;\n            sMapCursor->y = 6;\n        }\n        else\n        {\n            GetPlayerPositionOnRegionMap();\n        }\n        break;\n    case MAPSEC_ROUTE_8:\n        if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN))\n        {\n            sMapCursor->x = 15;\n            sMapCursor->y = 6;\n        }\n        else\n        {\n            GetPlayerPositionOnRegionMap();\n        }\n        break;\n    case MAPSEC_FARAWAY_ISLAND:\n    case MAPSEC_ARTISAN_CAVE:\n    case MAPSEC_BATTLE_FRONTIER:\n    case MAPSEC_SOUTHERN_ISLAND:\n        sMapCursor->x = 0;\n        sMapCursor->y = 17;\n        break;\n    default:\n        GetPlayerPositionOnRegionMap();\n        break;\n    }\n    sMapCursor->selectedMapsec = GetSelectedMapSection(GetSelectedRegionMap(), LAYER_MAP, sMapCursor->y, sMapCursor->x);\n}\n\nstatic u8 GetSelectedMapSection(u8 whichMap, u8 layer, s16 y, s16 x)\n{\n    switch (whichMap)\n    {\n    case REGIONMAP_KANTO:\n        return sRegionMapSections_Kanto[layer][y][x];\n    case REGIONMAP_SEVII123:\n        return sRegionMapSections_Sevii123[layer][y][x];\n    case REGIONMAP_SEVII45:\n        return sRegionMapSections_Sevii45[layer][y][x];\n    case REGIONMAP_SEVII67:\n        return sRegionMapSections_Sevii67[layer][y][x];\n    default:\n        return MAPSEC_NONE;\n    }\n}\n\nstatic void CreatePlayerIcon(u16 tileTag, u16 palTag)\n{\n    sPlayerIcon = AllocZeroed(sizeof(struct PlayerIcon));\n    if (gSaveBlock2Ptr->playerGender == FEMALE)\n        LZ77UnCompWram(sPlayerIcon_Leaf, sPlayerIcon->tiles);\n    else\n        LZ77UnCompWram(sPlayerIcon_Red, sPlayerIcon->tiles);\n    sPlayerIcon->tileTag = tileTag;\n    sPlayerIcon->palTag = palTag;\n    sPlayerIcon->x = GetMapCursorX();\n    sPlayerIcon->y = GetMapCursorY();\n    if(gMapHeader.regionMapSectionId == MAPSEC_FARAWAY_ISLAND || gMapHeader.regionMapSectionId == MAPSEC_ARTISAN_CAVE || gMapHeader.regionMapSectionId == MAPSEC_BATTLE_FRONTIER || gMapHeader.regionMapSectionId == MAPSEC_SOUTHERN_ISLAND)\n    {\n        sMapCursor->x = 0;\n        sMapCursor->y = 0;\n    }\n    CreatePlayerIconSprite();\n}\n\nstatic void CreatePlayerIconSprite(void)\n{\n    u8 spriteId;\n    struct SpriteSheet spriteSheet = {\n        .data = sPlayerIcon->tiles,\n        .size = sizeof(sPlayerIcon->tiles),\n        .tag = sPlayerIcon->tileTag\n    };\n    struct SpritePalette spritePalette = {\n        .data = sPlayerIcon_RedPal,\n        .tag = sPlayerIcon->palTag\n    };\n    struct SpriteTemplate template = {\n        .tileTag = sPlayerIcon->tileTag,\n        .paletteTag = sPlayerIcon->palTag,\n        .oam = &sOamData_PlayerIcon,\n        .anims = sAnims_PlayerIcon,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    };\n\n    if (gSaveBlock2Ptr->playerGender == FEMALE)\n        spritePalette.data = sPlayerIcon_LeafPal;\n\n    LoadSpriteSheet(&spriteSheet);\n    LoadSpritePalette(&spritePalette);\n    spriteId = CreateSprite(&template, 8 * sPlayerIcon->x + 36, 8 * sPlayerIcon->y + 36, 2);\n    sPlayerIcon->sprite = &gSprites[spriteId];\n    SetPlayerIconInvisibility(TRUE);\n}\n\nstatic void SetPlayerIconInvisibility(bool8 invisible)\n{\n    sPlayerIcon->sprite->invisible = invisible;\n}\n\nstatic void FreePlayerIcon(void)\n{\n    if (sPlayerIcon->sprite != NULL)\n    {\n        DestroySprite(sPlayerIcon->sprite);\n        FreeSpriteTilesByTag(sPlayerIcon->tileTag);\n        FreeSpritePaletteByTag(sPlayerIcon->palTag);\n    }\n    FREE_IF_NOT_NULL(sPlayerIcon);\n}\n\nstatic u16 GetPlayerIconX(void)\n{\n    return sPlayerIcon->x;\n}\n\nstatic u16 GetPlayerIconY(void)\n{\n    return sPlayerIcon->y;\n}\n\nstatic void InitMapIcons(u8 whichMap, u8 taskId, TaskFunc taskFunc)\n{\n    sMapIcons = AllocZeroed(sizeof(struct MapIcons));\n    sMapIcons->exitTask = taskFunc;\n    sMapIcons->region = whichMap;\n    LZ77UnCompWram(sDungeonIcon, sMapIcons->dungeonIconTiles);\n    LZ77UnCompWram(sFlyIcon, sMapIcons->flyIconTiles);\n    gTasks[taskId].func = LoadMapIcons;\n}\n\nstatic void LoadMapIcons(u8 taskId)\n{\n    switch (sMapIcons->state)\n    {\n    case 0:\n        NullVBlankHBlankCallbacks();\n        sMapIcons->state++;\n        break;\n    case 1:\n        CreateDungeonIcons();\n        sMapIcons->state++;\n        break;\n    case 2:\n        CreateFlyIcons();\n        sMapIcons->state++;\n        break;\n    case 3:\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        sMapIcons->state++;\n        break;\n    case 4:\n        SetRegionMapVBlankCB();\n        sMapIcons->state++;\n        break;\n    default:\n        SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) | DISPCNT_OBJ_ON);\n        FinishMapIconLoad(taskId);\n        break;\n    }\n}\n\nstatic void FinishMapIconLoad(u8 taskId)\n{\n    gTasks[taskId].func = sMapIcons->exitTask;\n}\n\nstatic void CreateFlyIconSprite(u8 whichMap, u8 numIcons, u16 x, u16 y, u8 tileTag, u8 palTag)\n{\n    u8 spriteId;\n    struct SpriteSheet spriteSheet = {\n        .data = sMapIcons->flyIconTiles,\n        .size = sizeof(sMapIcons->flyIconTiles),\n        .tag = tileTag\n    };\n    struct SpritePalette spritePalette = {\n        .data = sMiscIcon_Pal,\n        .tag = palTag\n    };\n    struct SpriteTemplate template = {\n        .tileTag = tileTag,\n        .paletteTag = palTag,\n        .oam = &sOamData_FlyIcon,\n        .anims = sAnims_FlyIcon,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    };\n\n    LoadSpriteSheet(&spriteSheet);\n    LoadSpritePalette(&spritePalette);\n    spriteId = CreateSprite(&template, 8 * x + 36, 8 * y + 36, 1);\n    sMapIcons->flyIcons[numIcons].sprite = &gSprites[spriteId];\n    gSprites[spriteId].invisible = TRUE;\n    sMapIcons->flyIcons[numIcons].region = whichMap;\n}\n\nstatic void CreateDungeonIconSprite(u8 whichMap, u8 numIcons, u16 x, u16 y, u8 tileTag, u8 palTag)\n{\n    u8 spriteId;\n    u8 mapsec;\n    s16 offset = 0;\n    struct SpriteSheet spriteSheet = {\n        .data = sMapIcons->dungeonIconTiles,\n        .size = sizeof(sMapIcons->dungeonIconTiles),\n        .tag = tileTag\n    };\n    struct SpritePalette spritePalette = {\n        .data = sMiscIcon_Pal,\n        .tag = palTag\n    };\n    struct SpriteTemplate template = {\n        .tileTag = tileTag,\n        .paletteTag = palTag,\n        .oam = &sOamData_DungeonIcon,\n        .anims = sAnims_DungeonIcon,\n        .images = NULL,\n        .affineAnims = gDummySpriteAffineAnimTable,\n        .callback = SpriteCallbackDummy\n    };\n\n    LoadSpriteSheet(&spriteSheet);\n    LoadSpritePalette(&spritePalette);\n    mapsec = GetSelectedMapSection(whichMap, LAYER_MAP, y, x);\n\n    // If mapsec has a town, push dungeon icon to bottom right corner\n    if ((GetMapsecType(mapsec) == MAPSECTYPE_VISITED || GetMapsecType(mapsec) == MAPSECTYPE_NOT_VISITED) && mapsec != MAPSEC_ROUTE_10_POKECENTER)\n        offset = 2;\n\n    spriteId = CreateSprite(&template, 8 * x + 36 + offset, 8 * y + 36 + offset, 3);\n    sMapIcons->dungeonIcons[numIcons].sprite = &gSprites[spriteId];\n    gSprites[spriteId].invisible = TRUE;\n    sMapIcons->dungeonIcons[numIcons].region = whichMap;\n}\n\nstatic void CreateFlyIcons(void)\n{\n    u16 i, y, x;\n    u8 numIcons = 0;\n    if (GetRegionMapPermission(MAPPERM_HAS_FLY_DESTINATIONS))\n    {\n        for (i = 0; i < REGIONMAP_COUNT; i++)\n        {\n            for (y = 0; y < MAP_HEIGHT; y++)\n            {\n                for (x = 0; x < MAP_WIDTH; x++)\n                {\n                    if (GetMapsecType(GetSelectedMapSection(i, LAYER_MAP, y, x)) == MAPSECTYPE_VISITED)\n                    {\n                        CreateFlyIconSprite(i, numIcons, x, y, numIcons + 10, 10);\n                        numIcons++;\n                    }\n                }\n            }\n        }\n    }\n}\n\nstatic void CreateDungeonIcons(void)\n{\n    u16 i, y, x;\n    u8 numIcons = 0;\n    u8 mapsec;\n    for (i = 0; i < REGIONMAP_COUNT; i++)\n    {\n        for (y = 0; y < MAP_HEIGHT; y++)\n        {\n            for (x = 0; x < MAP_WIDTH; x++)\n            {\n                mapsec = GetSelectedMapSection(i, LAYER_DUNGEON, y, x);\n                if (mapsec == MAPSEC_NONE)\n                    continue;\n                if (mapsec == MAPSEC_CERULEAN_CAVE && !FlagGet(FLAG_SYS_CAN_LINK_WITH_RS))\n                    continue;\n                CreateDungeonIconSprite(i, numIcons, x, y, numIcons + 35, 10);\n                if (GetDungeonMapsecType(mapsec) != 2)\n                {\n                    StartSpriteAnim(sMapIcons->dungeonIcons[numIcons].sprite, 1);\n                }\n                numIcons++;\n            }\n        }\n    }\n}\n\nstatic void SetFlyIconInvisibility(u8 whichMap, u8 iconNum, bool8 invisible)\n{\n    u32 i;\n    if (iconNum == NELEMS(sMapIcons->flyIcons))\n    {\n        // Set for all fly icons\n        for (i = 0; i < NELEMS(sMapIcons->flyIcons); i++)\n        {\n            if (sMapIcons->flyIcons[i].region == whichMap || whichMap == 0xFF)\n                sMapIcons->flyIcons[i].sprite->invisible = invisible;\n        }\n    }\n    else\n    {\n        if (sMapIcons->flyIcons[iconNum].region == whichMap)\n            sMapIcons->flyIcons[iconNum].sprite->invisible = invisible;\n    }\n}\n\nstatic void SetDungeonIconInvisibility(u8 whichMap, u8 iconNum, bool8 invisible)\n{\n    u32 i;\n    if (iconNum == NELEMS(sMapIcons->dungeonIcons))\n    {\n        // Set for all dungeon icons\n        for (i = 0; i < NELEMS(sMapIcons->dungeonIcons); i++)\n        {\n            if (sMapIcons->dungeonIcons[i].region == whichMap || whichMap == 0xFF)\n                sMapIcons->dungeonIcons[i].sprite->invisible = invisible;\n        }\n    }\n    else\n    {\n        if (sMapIcons->dungeonIcons[iconNum].region != whichMap)\n            sMapIcons->dungeonIcons[iconNum].sprite->invisible = invisible;\n    }\n}\n\nstatic void FreeMapIcons(void)\n{\n    u32 i;\n    for (i = 0; i < NELEMS(sMapIcons->flyIcons); i++)\n    {\n        if (sMapIcons->flyIcons[i].sprite != NULL)\n        {\n            DestroySprite(sMapIcons->flyIcons[i].sprite);\n            FreeSpriteTilesByTag(sMapIcons->flyIcons[i].tileTag);\n            FreeSpritePaletteByTag(sMapIcons->flyIcons[i].palTag);\n        }\n    }\n    for (i = 0; i < NELEMS(sMapIcons->dungeonIcons); i++)\n    {\n        if (sMapIcons->dungeonIcons[i].sprite != NULL)\n        {\n            DestroySprite(sMapIcons->dungeonIcons[i].sprite);\n            FreeSpriteTilesByTag(sMapIcons->dungeonIcons[i].tileTag);\n            FreeSpritePaletteByTag(sMapIcons->dungeonIcons[i].palTag);\n        }\n    }\n    FREE_IF_NOT_NULL(sMapIcons);\n}\n\nstatic bool8 SaveRegionMapGpuRegs(u8 idx)\n{\n    if (sRegionMapGpuRegs[idx] != NULL)\n        return FALSE;\n    sRegionMapGpuRegs[idx] = AllocZeroed(sizeof(struct RegionMapGpuRegs));\n    sRegionMapGpuRegs[idx]->bldcnt = GetGpuReg(REG_OFFSET_BLDCNT);\n    sRegionMapGpuRegs[idx]->bldy = GetGpuReg(REG_OFFSET_BLDY);\n    sRegionMapGpuRegs[idx]->bldalpha = GetGpuReg(REG_OFFSET_BLDALPHA);\n    sRegionMapGpuRegs[idx]->winin = GetGpuReg(REG_OFFSET_WININ);\n    sRegionMapGpuRegs[idx]->winout = GetGpuReg(REG_OFFSET_WINOUT);\n    sRegionMapGpuRegs[idx]->win0h = GetGpuReg(REG_OFFSET_WIN0H);\n    sRegionMapGpuRegs[idx]->win1h = GetGpuReg(REG_OFFSET_WIN1H);\n    sRegionMapGpuRegs[idx]->win0v = GetGpuReg(REG_OFFSET_WIN0V);\n    sRegionMapGpuRegs[idx]->win1v = GetGpuReg(REG_OFFSET_WIN1V);\n    return TRUE;\n}\n\nstatic bool8 SetRegionMapGpuRegs(u8 idx)\n{\n    if (sRegionMapGpuRegs[idx] == NULL)\n        return FALSE;\n    SetGpuReg(REG_OFFSET_BLDCNT, sRegionMapGpuRegs[idx]->bldcnt);\n    SetGpuReg(REG_OFFSET_BLDY, sRegionMapGpuRegs[idx]->bldy);\n    SetGpuReg(REG_OFFSET_BLDALPHA, sRegionMapGpuRegs[idx]->bldalpha);\n    SetGpuReg(REG_OFFSET_WININ, sRegionMapGpuRegs[idx]->winin);\n    SetGpuReg(REG_OFFSET_WINOUT, sRegionMapGpuRegs[idx]->winout);\n    SetGpuReg(REG_OFFSET_WIN0H, sRegionMapGpuRegs[idx]->win0h);\n    SetGpuReg(REG_OFFSET_WIN1H, sRegionMapGpuRegs[idx]->win1h);\n    SetGpuReg(REG_OFFSET_WIN0V, sRegionMapGpuRegs[idx]->win0v);\n    SetGpuReg(REG_OFFSET_WIN1V, sRegionMapGpuRegs[idx]->win1v);\n    FREE_IF_NOT_NULL(sRegionMapGpuRegs[idx]);\n    return TRUE;\n}\n\nstatic void FreeRegionMapGpuRegs(void)\n{\n    u32 i;\n    for (i = 0; i < NELEMS(sRegionMapGpuRegs); i++)\n        FREE_IF_NOT_NULL(sRegionMapGpuRegs[i]);\n}\n\nstatic void ResetGpuRegs(void)\n{\n    struct GpuWindowParams data = {};\n    SetBldCnt(0, 0, BLDCNT_EFFECT_NONE);\n    SetBldY(0);\n    SetGpuWindowDims(0, &data);\n    SetGpuWindowDims(1, &data);\n    SetWinIn(0, 0);\n    SetDispCnt(0, TRUE);\n    SetDispCnt(1, TRUE);\n}\n\nstatic void SetBldCnt(u8 tgt2, u16 tgt1, u16 effect)\n{\n    u16 regval = tgt2 << 8;\n    regval |= tgt1;\n    regval |= effect;\n    SetGpuReg(REG_OFFSET_BLDCNT, regval);\n}\n\nstatic void SetBldY(u16 tgt)\n{\n    SetGpuReg(REG_OFFSET_BLDY, tgt);\n}\n\nstatic void SetBldAlpha(u16 tgt2, u16 tgt1)\n{\n    u16 regval = tgt2 << 8;\n    regval |= tgt1;\n    SetGpuReg(REG_OFFSET_BLDALPHA, regval);\n}\n\nstatic void SetWinIn(u16 b, u16 a)\n{\n    u16 regval = a << 8;\n    regval |= b;\n    SetGpuReg(REG_OFFSET_WININ, regval);\n}\n\nstatic void SetWinOut(u16 regval)\n{\n    SetGpuReg(REG_OFFSET_WINOUT, regval);\n}\n\nstatic void SetDispCnt(u8 idx, bool8 clear)\n{\n    u16 data[sizeof(sWinFlags) / 2];\n    memcpy(data, sWinFlags, sizeof(sWinFlags));\n    switch (clear)\n    {\n    case FALSE:\n        SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) | data[idx]);\n        break;\n    case TRUE:\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, data[idx]);\n        break;\n    }\n}\n\nstatic void SetGpuWindowDims(u8 winIdx, const struct GpuWindowParams *data)\n{\n    SetGpuReg(sWinRegs[winIdx][0], WIN_RANGE(data->top, data->bottom));\n    SetGpuReg(sWinRegs[winIdx][1], WIN_RANGE(data->left, data->right));\n}\n\nstatic void FreeAndResetGpuRegs(void)\n{\n    FreeRegionMapGpuRegs();\n    ResetGpuRegs();\n}\n\nstatic bool32 IsCeladonDeptStoreMapsec(u16 mapsec)\n{\n    if (sRegionMap != NULL)\n        return FALSE;\n    if (mapsec != MAPSEC_CELADON_CITY)\n        return FALSE;\n    if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_1F))\n        return FALSE;\n    if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_1F)\n     && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_2F)\n     && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_3F)\n     && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_4F)\n     && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_5F)\n     && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_ROOF)\n     && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR))\n        return FALSE;\n    return TRUE;\n}\n\nu8 *GetMapName(u8 *dst0, u16 mapsec, u16 fill)\n{\n    u8 *dst;\n    u32 i;\n    u16 idx;\n    if ((idx = mapsec) < MAPSEC_NONE )\n    {\n        if (IsCeladonDeptStoreMapsec(mapsec) == TRUE)\n            dst = StringCopy(dst0, sMapsecName_CELADONDEPT);\n        else\n            dst = StringCopy(dst0, sMapNames[idx]);\n    }\n    else\n    {\n        if (fill == 0)\n            fill = 18;\n        return StringFill(dst0, CHAR_SPACE, fill);\n    }\n    if (fill != 0)\n    {\n        for (i = dst - dst0; i < fill; i++)\n            *dst++ = CHAR_SPACE;\n        *dst = EOS;\n    }\n    return dst;\n}\n\nu8 *GetMapNameGeneric(u8 *dest, u16 mapsec)\n{\n    return GetMapName(dest, mapsec, 0);\n}\n\n// Unclear why this function is used over GetMapNameGeneric\nu8 *GetMapNameGeneric_(u8 *dest, u16 mapsec)\n{\n    return GetMapNameGeneric(dest, mapsec);\n}\n\nstatic void PrintTopBarTextLeft(const u8 *str)\n{\n    if (sRegionMap->permissions[MAPPERM_HAS_OPEN_ANIM] == TRUE)\n        FillWindowPixelBuffer(WIN_TOPBAR_LEFT, PIXEL_FILL(0));\n    else\n        FillWindowPixelBuffer(WIN_TOPBAR_LEFT, PIXEL_FILL(15));\n    AddTextPrinterParameterized3(WIN_TOPBAR_LEFT, FONT_SMALL, 0, 0, sTextColors, 0, str);\n    CopyWindowToVram(WIN_TOPBAR_LEFT, COPYWIN_GFX);\n}\n\nstatic void PrintTopBarTextRight(const u8 *str)\n{\n    if (sRegionMap->permissions[MAPPERM_HAS_OPEN_ANIM] == TRUE)\n        FillWindowPixelBuffer(WIN_TOPBAR_RIGHT, PIXEL_FILL(0));\n    else\n        FillWindowPixelBuffer(WIN_TOPBAR_RIGHT, PIXEL_FILL(15));\n    AddTextPrinterParameterized3(WIN_TOPBAR_RIGHT, FONT_SMALL, 0, 0, sTextColors, 0, str);\n    CopyWindowToVram(WIN_TOPBAR_RIGHT, COPYWIN_FULL);\n}\n\nstatic void ClearOrDrawTopBar(bool8 clear)\n{\n    if (!clear)\n    {\n        PutWindowTilemap(WIN_TOPBAR_LEFT);\n        PutWindowTilemap(WIN_TOPBAR_RIGHT);\n    }\n    else\n    {\n        ClearWindowTilemap(WIN_TOPBAR_LEFT);\n        ClearWindowTilemap(WIN_TOPBAR_RIGHT);\n    }\n}\n\nvoid CB2_OpenFlyMap(void)\n{\n    InitFlyMap();\n    InitRegionMap(REGIONMAP_TYPE_FLY);\n}\n\nstatic void Task_FlyMap(u8 taskId)\n{\n    switch (sFlyMap->state)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        InitMapIcons(GetSelectedRegionMap(), taskId, GetMainMapTask());\n        CreateMapCursor(0, 0);\n        CreatePlayerIcon(1, 1);\n        SetMapCursorInvisibility(FALSE);\n        SetPlayerIconInvisibility(FALSE);\n        sFlyMap->state++;\n        break;\n    case 1:\n        if (GetRegionMapPermission(MAPPERM_HAS_OPEN_ANIM) == TRUE)\n        {\n            InitMapOpenAnim(taskId, GetMainMapTask());\n        }\n        else\n        {\n            ShowBg(0);\n            ShowBg(3);\n            ShowBg(1);\n            PrintTopBarTextLeft(gText_RegionMap_DPadMove);\n            SetFlyIconInvisibility(GetSelectedRegionMap(), NELEMS(sMapIcons->flyIcons), FALSE);\n            SetDungeonIconInvisibility(GetSelectedRegionMap(), NELEMS(sMapIcons->dungeonIcons), FALSE);\n        }\n        sFlyMap->state++;\n        break;\n    case 2:\n        PrintTopBarTextRight(gText_RegionMap_AButtonOK);\n        ClearOrDrawTopBar(FALSE);\n        sFlyMap->state++;\n        break;\n    case 3:\n        if (!gPaletteFade.active)\n        {\n            DisplayCurrentMapName();\n            PutWindowTilemap(WIN_MAP_NAME);\n            DisplayCurrentDungeonName();\n            PutWindowTilemap(WIN_DUNGEON_NAME);\n            sFlyMap->state++;\n        }\n        break;\n    case 4:\n        switch (GetRegionMapInput())\n        {\n        case MAP_INPUT_MOVE_START:\n        case MAP_INPUT_MOVE_CONT:\n            break;\n        case MAP_INPUT_CANCEL:\n            sFlyMap->state = 6;\n            break;\n        case MAP_INPUT_MOVE_END:\n            if (GetSelectedMapsecType(LAYER_MAP) == MAPSECTYPE_VISITED)\n                PlaySE(SE_DEX_PAGE);\n            else\n                PlaySEForSelectedMapsec();\n            ResetCursorSnap();\n            DisplayCurrentMapName();\n            DisplayCurrentDungeonName();\n            DrawDungeonNameBox();\n            if (GetMapCursorX() == CANCEL_BUTTON_X && GetMapCursorY() == CANCEL_BUTTON_Y)\n            {\n                PlaySE(SE_M_SPIT_UP);\n                PrintTopBarTextRight(gText_RegionMap_AButtonCancel);\n            }\n            else if (GetSelectedMapsecType(LAYER_MAP) == MAPSECTYPE_VISITED || GetSelectedMapsecType(LAYER_MAP) == MAPSECTYPE_UNKNOWN)\n            {\n                PrintTopBarTextRight(gText_RegionMap_AButtonOK);\n            }\n            else\n            {\n                PrintTopBarTextRight(gText_RegionMap_Space);\n            }\n            break;\n        case MAP_INPUT_A_BUTTON:\n            if ((GetSelectedMapsecType(LAYER_MAP) == MAPSECTYPE_VISITED || GetSelectedMapsecType(LAYER_MAP) == MAPSECTYPE_UNKNOWN) && GetRegionMapPermission(MAPPERM_HAS_FLY_DESTINATIONS) == TRUE)\n            {\n                switch (GetMapTypeByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum))\n                {\n                case MAP_TYPE_UNDERGROUND:\n                case MAP_TYPE_INDOOR:\n                    sFlyMap->selectedDestination = FALSE;\n                    sFlyMap->state++;\n                    break;\n                default:\n                    PlaySE(SE_USE_ITEM);\n                    sFlyMap->selectedDestination = TRUE;\n                    sFlyMap->state++;\n                    break;\n                }\n            }\n            break;\n        case MAP_INPUT_SWITCH:\n            InitSwitchMapMenu(GetSelectedRegionMap(), taskId, SaveMainMapTask);\n            break;\n        }\n        break;\n    case 5:\n        if (GetRegionMapPermission(MAPPERM_HAS_OPEN_ANIM) == TRUE)\n            DoMapCloseAnim(taskId);\n        sFlyMap->state++;\n        break;\n    case 6:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sFlyMap->state++;\n        break;\n    default:\n        if (!gPaletteFade.active)\n        {\n            if (sFlyMap->selectedDestination == TRUE)\n                SetFlyWarpDestination(GetMapsecUnderCursor());\n            FreeFlyMap(taskId);\n        }\n        break;\n    }\n}\n\nstatic void InitFlyMap(void)\n{\n    sFlyMap = AllocZeroed(sizeof(struct FlyMap));\n    sFlyMap->state = 0;\n    sFlyMap->unused = 0;\n}\n\nstatic void FreeFlyMap(u8 taskId)\n{\n    if (GetRegionMapPermission(MAPPERM_HAS_OPEN_ANIM) == TRUE)\n        FreeMapOpenCloseAnim();\n    FreeMapIcons();\n    FreeMapCursor();\n    FreePlayerIcon();\n    FreeAndResetGpuRegs();\n    FreeRegionMapForFlyMap();\n    DestroyTask(taskId);\n    FreeAllWindowBuffers();\n    if (sFlyMap->selectedDestination == TRUE)\n        SetMainCallback2(CB2_ReturnToField);\n    else\n        SetMainCallback2(CB2_ReturnToPartyMenuFromFlyMap);\n    FREE_IF_NOT_NULL(sFlyMap);\n}\n\nstatic void SetFlyWarpDestination(u16 mapsec)\n{\n    u16 idx = mapsec;\n    if (sMapFlyDestinations[idx][2])\n    {\n        SetWarpDestinationToHealLocation(sMapFlyDestinations[idx][2]);\n        SetUsedFlyQuestLogEvent(sMapFlyDestinations[idx]);\n    }\n    else\n    {\n        SetWarpDestinationToMapWarp(sMapFlyDestinations[idx][0], sMapFlyDestinations[idx][1], -1);\n    }\n    ReturnToFieldFromFlyMapSelect();\n}\n"
  },
  {
    "path": "src/renewable_hidden_items.c",
    "content": "#include \"global.h\"\n#include \"event_data.h\"\n#include \"random.h\"\n#include \"constants/maps.h\"\n\n#define MAX_HIDDEN_ITEMS_PER_GROUP 8\n\nstruct RenewableHiddenItemData\n{\n    s8 mapGroup;\n    s8 mapNum;\n    u8 filler[2];\n    u8 rare[MAX_HIDDEN_ITEMS_PER_GROUP];     // 10%\n    u8 uncommon[MAX_HIDDEN_ITEMS_PER_GROUP]; // 30%\n    u8 common[MAX_HIDDEN_ITEMS_PER_GROUP];   // 60%\n};\n\nstatic void SampleRenewableItemFlags(void);\n\n#define HIDDEN_ID(flag)(flag - FLAG_HIDDEN_ITEMS_START)\n#define NO_ITEM 0xFF\n\nstatic const struct RenewableHiddenItemData sRenewableHiddenItems[] = {\n    {\n        .mapGroup = MAP_GROUP(ROUTE20),\n        .mapNum = MAP_NUM(ROUTE20),\n        .rare = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ROUTE20_STARDUST),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(ROUTE21_NORTH),\n        .mapNum = MAP_NUM(ROUTE21_NORTH),\n        .rare = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ROUTE21_NORTH_PEARL),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL),\n        .mapNum = MAP_NUM(UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL),\n        .rare = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ETHER),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_POTION),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ANTIDOTE),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_PARALYZE_HEAL),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_AWAKENING),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_BURN_HEAL),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL_ICE_HEAL),\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(UNDERGROUND_PATH_EAST_WEST_TUNNEL),\n        .mapNum = MAP_NUM(UNDERGROUND_PATH_EAST_WEST_TUNNEL),\n        .rare = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ETHER),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_POTION),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ANTIDOTE),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_PARALYZE_HEAL),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_AWAKENING),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_BURN_HEAL),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_UNDERGROUND_PATH_EAST_WEST_TUNNEL_ICE_HEAL),\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS),\n        .rare = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_4),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_2),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TANOBY_RUINS_HEART_SCALE_3),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(MT_MOON_B1F),\n        .mapNum = MAP_NUM(MT_MOON_B1F),\n        .rare = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_2),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_3),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM_2),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_BIG_MUSHROOM_3),\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_2),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_MT_MOON_B1F_TINY_MUSHROOM_3),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(THREE_ISLAND_BERRY_FOREST),\n        .mapNum = MAP_NUM(THREE_ISLAND_BERRY_FOREST),\n        .rare = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_KELPSY_BERRY), // Changed from Bluk\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_HONDEW_BERRY), // Changed from Wepear\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_SITRUS_BERRY), // Changed from Oran\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_RAWST_BERRY), // Changed from Cheri (which was already in the table)\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_TAMATO_BERRY), // Changed from Aspear\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PERSIM_BERRY),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_GREPA_BERRY), // Changed from Pinap\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_LUM_BERRY),\n        },\n        .uncommon = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_KELPSY_BERRY), // Changed from Bluk\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_HONDEW_BERRY), // Changed from Wepear\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ORAN_BERRY),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHERI_BERRY),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_ASPEAR_BERRY),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PERSIM_BERRY),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_GREPA_BERRY), // Changed from Pinap\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_TAMATO_BERRY), // New\n        },\n        .common = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_POMEG_BERRY), // Changed from Razz\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_QUALOT_BERRY), // Changed from Nanab\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_CHESTO_BERRY),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_PECHA_BERRY),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_GREPA_BERRY), // Changed from Rawst\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_TAMATO_BERRY), // New\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_KELPSY_BERRY), // New\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BERRY_FOREST_HONDEW_BERRY), // New\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(ONE_ISLAND_TREASURE_BEACH),\n        .mapNum = MAP_NUM(ONE_ISLAND_TREASURE_BEACH),\n        .rare = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL_2),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STAR_PIECE),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_BIG_PEARL),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STARDUST),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_STARDUST_2),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_PEARL),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_PEARL_2),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL_2),\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_ONE_ISLAND_TREASURE_BEACH_ULTRA_BALL_2),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(THREE_ISLAND_BOND_BRIDGE),\n        .mapNum = MAP_NUM(THREE_ISLAND_BOND_BRIDGE),\n        .rare = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_PEARL),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_THREE_ISLAND_BOND_BRIDGE_STARDUST),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(FOUR_ISLAND),\n        .mapNum = MAP_NUM(FOUR_ISLAND),\n        .rare = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_FOUR_ISLAND_PEARL),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_FOUR_ISLAND_ULTRA_BALL),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_MEMORIAL_PILLAR),\n        .mapNum = MAP_NUM(FIVE_ISLAND_MEMORIAL_PILLAR),\n        .rare = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_FIVE_ISLAND_MEMORIAL_PILLAR_BIG_PEARL),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS),\n        .mapNum = MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS),\n        .rare = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_NEST_BALL),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STAR_PIECE),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STARDUST),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_FIVE_ISLAND_RESORT_GORGEOUS_STARDUST_2),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_OUTCAST_ISLAND),\n        .mapNum = MAP_NUM(SIX_ISLAND_OUTCAST_ISLAND),\n        .rare = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_SIX_ISLAND_OUTCAST_ISLAND_STAR_PIECE),\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_SIX_ISLAND_OUTCAST_ISLAND_NET_BALL),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(SIX_ISLAND_GREEN_PATH),\n        .mapNum = MAP_NUM(SIX_ISLAND_GREEN_PATH),\n        .rare = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_SIX_ISLAND_GREEN_PATH_ULTRA_BALL),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n    {\n        .mapGroup = MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER),\n        .mapNum = MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER),\n        .rare = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_BIG_PEARL),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .uncommon = {\n            HIDDEN_ID(FLAG_HIDDEN_ITEM_SEVEN_ISLAND_TRAINER_TOWER_PEARL),\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        },\n        .common = {\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM,\n            NO_ITEM\n        }\n    },\n};\n\nvoid SetAllRenewableItemFlags(void)\n{\n    u8 i, j;\n\n    for (i = 0; i < ARRAY_COUNT(sRenewableHiddenItems); i++)\n    {\n        const u8 * rare = sRenewableHiddenItems[i].rare;\n        const u8 * uncommon = sRenewableHiddenItems[i].uncommon;\n        const u8 * common = sRenewableHiddenItems[i].common;\n        for (j = 0; j < MAX_HIDDEN_ITEMS_PER_GROUP; j++)\n        {\n            if (rare[j] != NO_ITEM)\n                FlagSet(FLAG_HIDDEN_ITEMS_START + rare[j]);\n            if (uncommon[j] != NO_ITEM)\n                FlagSet(FLAG_HIDDEN_ITEMS_START + uncommon[j]);\n            if (common[j] != NO_ITEM)\n                FlagSet(FLAG_HIDDEN_ITEMS_START + common[j]);\n        }\n    }\n}\n\nvoid IncrementRenewableHiddenItemStepCounter(void)\n{\n    u16 var = VarGet(VAR_RENEWABLE_ITEM_STEP_COUNTER);\n    if (var < 1500)\n    {\n        VarSet(VAR_RENEWABLE_ITEM_STEP_COUNTER, var + 1);\n    }\n}\n\nvoid TryRegenerateRenewableHiddenItems(void)\n{\n    u32 i;\n    u8 found_map = 0xFF;\n    for (i = 0; i < ARRAY_COUNT(sRenewableHiddenItems); i++)\n    {\n        if (sRenewableHiddenItems[i].mapGroup == gSaveBlock1Ptr->location.mapGroup\n         && sRenewableHiddenItems[i].mapNum == gSaveBlock1Ptr->location.mapNum)\n            found_map = i;\n    }\n\n    if (found_map == 0xFF)\n        return;\n    if (VarGet(VAR_RENEWABLE_ITEM_STEP_COUNTER) >= 1500)\n    {\n        VarSet(VAR_RENEWABLE_ITEM_STEP_COUNTER, 0);\n        SetAllRenewableItemFlags();\n        SampleRenewableItemFlags();\n    }\n}\n\nstatic void SampleRenewableItemFlags(void)\n{\n    u8 i, j;\n    const u8 * flags;\n    u16 rval;\n\n    for (i = 0; i < ARRAY_COUNT(sRenewableHiddenItems); i++)\n    {\n        rval = Random() % 100;\n        if (rval >= 90)\n            flags = sRenewableHiddenItems[i].rare;\n        else if (rval >= 60)\n            flags = sRenewableHiddenItems[i].uncommon;\n        else\n            flags = sRenewableHiddenItems[i].common;\n        for (j = 0; j < MAX_HIDDEN_ITEMS_PER_GROUP; j++)\n        {\n            if (flags[j] != NO_ITEM)\n                FlagClear(FLAG_HIDDEN_ITEMS_START + flags[j]);\n        }\n    }\n}\n"
  },
  {
    "path": "src/reset_save_heap.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"m4a.h\"\n#include \"load_save.h\"\n#include \"save.h\"\n#include \"new_game.h\"\n#include \"overworld.h\"\n\nvoid ReloadSave(void)\n{\n    u16 imeBackup = REG_IME;\n    \n    REG_IME = 0;\n    RegisterRamReset(RESET_EWRAM);\n    ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK);\n    REG_IME = imeBackup;\n    gMain.inBattle = FALSE;\n    SetSaveBlocksPointers();\n    ResetMenuAndMonGlobals();\n    Save_ResetSaveCounters();\n    LoadGameSave(SAVE_NORMAL);\n    if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_INVALID)\n        Sav2_ClearSetDefault();\n    SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);\n    InitHeap(gHeap, HEAP_SIZE);\n    SetMainCallback2(CB2_ContinueSavedGame);\n}\n"
  },
  {
    "path": "src/reshow_battle_screen.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"link.h\"\n#include \"data.h\"\n#include \"scanline_effect.h\"\n#include \"help_system.h\"\n#include \"battle.h\"\n#include \"battle_interface.h\"\n#include \"battle_anim.h\"\n#include \"battle_controllers.h\"\n\nstatic void CB2_ReshowBattleScreenAfterMenu(void);\nstatic void ReshowBattleScreen_TurnOnDisplay(void);\nstatic bool8 LoadBattlerSpriteGfx(u8 battlerId);\nstatic void CreateBattlerSprite(u8 battlerId);\nstatic void CreateHealthboxSprite(u8 battlerId);\n\nvoid ReshowBattleScreenDummy(void)\n{\n}\n\nvoid ReshowBattleScreenAfterMenu(void)\n{\n    gPaletteFade.bufferTransferDisabled = 1;\n    SetHBlankCallback(NULL);\n    SetGpuReg(REG_OFFSET_MOSAIC, 0);\n    gBattleScripting.reshowMainState = 0;\n    gBattleScripting.reshowHelperState = 0;\n    if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))\n    {\n        if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)\n        {\n            if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)\n                SetHelpContext(HELPCONTEXT_TRAINER_BATTLE_DOUBLE);\n            else\n                SetHelpContext(HELPCONTEXT_TRAINER_BATTLE_SINGLE);\n        }\n        else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)\n        {\n            SetHelpContext(HELPCONTEXT_SAFARI_BATTLE);\n        }\n        else\n        {\n            SetHelpContext(HELPCONTEXT_WILD_BATTLE);\n        }\n    }\n    SetMainCallback2(CB2_ReshowBattleScreenAfterMenu);\n}\n\nstatic void CB2_ReshowBattleScreenAfterMenu(void)\n{\n    u8 opponentBattler;\n    u16 species;\n\n    switch (gBattleScripting.reshowMainState)\n    {\n    case 0:\n        ResetSpriteData();\n        break;\n    case 1:\n        SetVBlankCallback(NULL);\n        ScanlineEffect_Clear();\n        BattleInitBgsAndWindows();\n        SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);\n        SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);\n        ShowBg(0);\n        ShowBg(1);\n        ShowBg(2);\n        ShowBg(3);\n        ResetPaletteFade();\n        gBattle_BG0_X = 0;\n        gBattle_BG0_Y = 0;\n        gBattle_BG1_X = 0;\n        gBattle_BG1_Y = 0;\n        gBattle_BG2_X = 0;\n        gBattle_BG2_Y = 0;\n        gBattle_BG3_X = 0;\n        gBattle_BG3_Y = 0;\n        break;\n    case 2:\n        CpuFastFill(0, (void *)VRAM, VRAM_SIZE);\n        break;\n    case 3:\n        LoadBattleTextboxAndBackground();\n        break;\n    case 4:\n        FreeAllSpritePalettes();\n        gReservedSpritePaletteCount = 4;\n        break;\n    case 5:\n        ClearSpritesHealthboxAnimData();\n        break;\n    case 6:\n        if (BattleLoadAllHealthBoxesGfx(gBattleScripting.reshowHelperState))\n        {\n            gBattleScripting.reshowHelperState = 0;\n        }\n        else\n        {\n            ++gBattleScripting.reshowHelperState;\n            --gBattleScripting.reshowMainState;\n        }\n        break;\n    case 7:\n        if (!LoadBattlerSpriteGfx(0))\n            --gBattleScripting.reshowMainState;\n        break;\n    case 8:\n        if (!LoadBattlerSpriteGfx(1))\n            --gBattleScripting.reshowMainState;\n        break;\n    case 9:\n        if (!LoadBattlerSpriteGfx(2))\n            --gBattleScripting.reshowMainState;\n        break;\n    case 10:\n        if (!LoadBattlerSpriteGfx(3))\n            --gBattleScripting.reshowMainState;\n        break;\n    case 11:\n        CreateBattlerSprite(0);\n        break;\n    case 12:\n        CreateBattlerSprite(1);\n        break;\n    case 13:\n        CreateBattlerSprite(2);\n        break;\n    case 14:\n        CreateBattlerSprite(3);\n        break;\n    case 15:\n        CreateHealthboxSprite(0);\n        break;\n    case 16:\n        CreateHealthboxSprite(1);\n        break;\n    case 17:\n        CreateHealthboxSprite(2);\n        break;\n    case 18:\n        CreateHealthboxSprite(3);\n        break;\n    case 19:\n        LoadAndCreateEnemyShadowSprites();\n        opponentBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);\n        species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBattler]], MON_DATA_SPECIES);\n        SetBattlerShadowSpriteCallback(opponentBattler, species);\n        if (IsDoubleBattle())\n        {\n            opponentBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);\n            species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBattler]], MON_DATA_SPECIES);\n            SetBattlerShadowSpriteCallback(opponentBattler, species);\n        }\n        ActionSelectionCreateCursorAt(gActionSelectionCursor[gBattlerInMenuId], 0);\n        if (gWirelessCommType && gReceivedRemoteLinkPlayers)\n        {\n            LoadWirelessStatusIndicatorSpriteGfx();\n            CreateWirelessStatusIndicatorSprite(0, 0);\n        }\n        break;\n    case 20:\n        SetVBlankCallback(VBlankCB_Battle);\n        ReshowBattleScreen_TurnOnDisplay();\n        BeginHardwarePaletteFade(0xFF, 0, 0x10, 0, 1);\n        gPaletteFade.bufferTransferDisabled = 0;\n        SetMainCallback2(BattleMainCB2);\n        BattleInterfaceSetWindowPals();\n        break;\n    default:\n        break;\n    }\n    ++gBattleScripting.reshowMainState;\n}\n\nstatic void ReshowBattleScreen_TurnOnDisplay(void)\n{\n    EnableInterrupts(INTR_FLAG_VBLANK);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    SetGpuReg(REG_OFFSET_WININ, 0x3F);\n    SetGpuReg(REG_OFFSET_WINOUT, 0x3F);\n    SetGpuReg(REG_OFFSET_WIN0H, 0);\n    SetGpuReg(REG_OFFSET_WIN0V, 0);\n    SetGpuReg(REG_OFFSET_WIN1H, 0);\n    SetGpuReg(REG_OFFSET_WIN1V, 0);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_OBJWIN_ON);\n}\n\nstatic bool8 LoadBattlerSpriteGfx(u8 battler)\n{\n    if (battler < gBattlersCount)\n    {\n        if (GetBattlerSide(battler) != B_SIDE_PLAYER)\n        {\n            if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags))\n                DecompressGhostFrontPic(&gEnemyParty[gBattlerPartyIndexes[battler]], battler);\n            else if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)\n                BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler);\n            else\n                BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE);\n        }\n        else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler.\n            DecompressTrainerBackPalette(gSaveBlock2Ptr->playerGender, battler);\n        else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler.\n            DecompressTrainerBackPalette(TRAINER_BACK_PIC_OLD_MAN, battler);\n        else if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)\n            BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler);\n        else\n            BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE);\n        gBattleScripting.reshowHelperState = 0;\n    }\n    return TRUE;\n}\n\nstatic void CreateBattlerSprite(u8 battler)\n{\n    if (battler < gBattlersCount)\n    {\n        u8 posY;\n\n        if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags))\n            posY = GetGhostSpriteDefault_Y(battler);\n        else if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)\n            posY = GetSubstituteSpriteDefault_Y(battler);\n        else\n            posY = GetBattlerSpriteDefault_Y(battler);\n        if (GetBattlerSide(battler) != B_SIDE_PLAYER)\n        {\n            if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)\n                return;\n            SetMultiuseSpriteTemplateToPokemon(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler));\n            gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), posY, GetBattlerSpriteSubpriority(battler));\n            gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;\n            gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;\n            gSprites[gBattlerSpriteIds[battler]].data[0] = battler;\n            gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES);\n            StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]);\n        }\n        else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT)\n        {\n            SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(B_POSITION_PLAYER_LEFT));\n            gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50,\n                                                      (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].size) * 4 + 80,\n                                                      GetBattlerSpriteSubpriority(0));\n            gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;\n            gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;\n            gSprites[gBattlerSpriteIds[battler]].data[0] = battler;\n        }\n        else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT)\n        {\n            SetMultiuseSpriteTemplateToTrainerBack(5, GetBattlerPosition(0));\n            gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50,\n                                                      (8 - gTrainerBackPicCoords[5].size) * 4 + 80,\n                                                      GetBattlerSpriteSubpriority(0));\n            gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;\n            gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;\n            gSprites[gBattlerSpriteIds[battler]].data[0] = battler;\n        }\n        else if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)\n        {\n            return;\n        }\n        else\n        {\n            SetMultiuseSpriteTemplateToPokemon(GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler));\n            gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), posY, GetBattlerSpriteSubpriority(battler));\n            gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;\n            gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;\n            gSprites[gBattlerSpriteIds[battler]].data[0] = battler;\n            gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES);\n            StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]);\n        }\n        gSprites[gBattlerSpriteIds[battler]].invisible = gBattleSpritesDataPtr->battlerData[battler].invisible;\n    }\n}\n\nstatic void CreateHealthboxSprite(u8 battler)\n{\n    if (battler < gBattlersCount)\n    {\n        u8 healthboxSpriteId;\n\n        if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT)\n            healthboxSpriteId = CreateSafariPlayerHealthboxSprites();\n        else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT)\n            return;\n        else\n            healthboxSpriteId = CreateBattlerHealthboxSprites(battler);\n        gHealthboxSpriteIds[battler] = healthboxSpriteId;\n        InitBattlerHealthboxCoords(battler);\n        SetHealthboxSpriteVisible(healthboxSpriteId);\n        if (GetBattlerSide(battler) != B_SIDE_PLAYER)\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gEnemyParty[gBattlerPartyIndexes[battler]], HEALTHBOX_ALL);\n        else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[gBattlerPartyIndexes[battler]], HEALTHBOX_SAFARI_ALL_TEXT);\n        else\n            UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[gBattlerPartyIndexes[battler]], HEALTHBOX_ALL);\n        if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT)\n            DummyBattleInterfaceFunc(gHealthboxSpriteIds[battler], TRUE);\n        else\n            DummyBattleInterfaceFunc(gHealthboxSpriteIds[battler], FALSE);\n        if (GetBattlerSide(battler) != B_SIDE_PLAYER)\n        {\n            if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)\n                SetHealthboxSpriteInvisible(healthboxSpriteId);\n        }\n        else if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)\n        {    \n            SetHealthboxSpriteInvisible(healthboxSpriteId);\n        }\n    }\n}\n"
  },
  {
    "path": "src/roamer.c",
    "content": "#include \"global.h\"\n#include \"event_data.h\"\n#include \"random.h\"\n#include \"overworld.h\"\n#include \"field_specials.h\"\n#include \"constants/flags.h\"\n#include \"constants/species.h\"\n#include \"constants/maps.h\"\n#include \"constants/region_map_sections.h\"\n\n// Despite having a variable to track it, the roamer is\n// hard-coded to only ever be in map group 3\n#define ROAMER_MAP_GROUP 3\n\nenum\n{\n    MAP_GRP, // map group\n    MAP_NUM, // map number\n};\n\n#define ROAMER (&gSaveBlock1Ptr->roamer)\nEWRAM_DATA u8 sLocationHistory[3][2] = {};\nEWRAM_DATA u8 sRoamerLocation[2] = {};\n\n#define ___ MAP_NUM(UNDEFINED) // For empty spots in the location table\n\n// Note: There are two potential softlocks that can occur with this table if its maps are\n//       changed in particular ways. They can be avoided by ensuring the following:\n//       - There must be at least 2 location sets that start with a different map,\n//         i.e. every location set cannot start with the same map. This is because of\n//         the while loop in RoamerMoveToOtherLocationSet.\n//       - Each location set must have at least 3 unique maps. This is because of\n//         the while loop in RoamerMove. In this loop the first map in the set is\n//         ignored, and an additional map is ignored if the roamer was there recently.\n//       - Additionally, while not a softlock, it's worth noting that if for any\n//         map in the location table there is not a location set that starts with\n//         that map then the roamer will be significantly less likely to move away\n//         from that map when it lands there.\nstatic const u8 sRoamerLocations[][7] = {\n    {MAP_NUM(ROUTE1), MAP_NUM(ROUTE2), MAP_NUM(ROUTE21_NORTH), MAP_NUM(ROUTE22), ___, ___, ___},\n    {MAP_NUM(ROUTE2), MAP_NUM(ROUTE1), MAP_NUM(ROUTE3), MAP_NUM(ROUTE22), ___, ___, ___},\n    {MAP_NUM(ROUTE3), MAP_NUM(ROUTE2), MAP_NUM(ROUTE4), ___, ___, ___, ___},\n    {MAP_NUM(ROUTE4), MAP_NUM(ROUTE3), MAP_NUM(ROUTE5), MAP_NUM(ROUTE9), MAP_NUM(ROUTE24), ___, ___},\n    {MAP_NUM(ROUTE5), MAP_NUM(ROUTE4), MAP_NUM(ROUTE6), MAP_NUM(ROUTE7), MAP_NUM(ROUTE8), MAP_NUM(ROUTE9), MAP_NUM(ROUTE24)},\n    {MAP_NUM(ROUTE6), MAP_NUM(ROUTE5), MAP_NUM(ROUTE7), MAP_NUM(ROUTE8), MAP_NUM(ROUTE11), ___, ___},\n    {MAP_NUM(ROUTE7), MAP_NUM(ROUTE5), MAP_NUM(ROUTE6), MAP_NUM(ROUTE8), MAP_NUM(ROUTE16), ___, ___},\n    {MAP_NUM(ROUTE8), MAP_NUM(ROUTE5), MAP_NUM(ROUTE6), MAP_NUM(ROUTE7), MAP_NUM(ROUTE10), MAP_NUM(ROUTE12), ___},\n    {MAP_NUM(ROUTE9), MAP_NUM(ROUTE4), MAP_NUM(ROUTE5), MAP_NUM(ROUTE10), MAP_NUM(ROUTE24), ___, ___},\n    {MAP_NUM(ROUTE10), MAP_NUM(ROUTE8), MAP_NUM(ROUTE9), MAP_NUM(ROUTE12), ___, ___, ___},\n    {MAP_NUM(ROUTE11), MAP_NUM(ROUTE6), MAP_NUM(ROUTE12), ___, ___, ___, ___},\n    {MAP_NUM(ROUTE12), MAP_NUM(ROUTE10), MAP_NUM(ROUTE11), MAP_NUM(ROUTE13), ___, ___, ___},\n    {MAP_NUM(ROUTE13), MAP_NUM(ROUTE12), MAP_NUM(ROUTE14), ___, ___, ___, ___},\n    {MAP_NUM(ROUTE14), MAP_NUM(ROUTE13), MAP_NUM(ROUTE15), ___, ___, ___, ___},\n    {MAP_NUM(ROUTE15), MAP_NUM(ROUTE14), MAP_NUM(ROUTE18), MAP_NUM(ROUTE19), ___, ___, ___},\n    {MAP_NUM(ROUTE16), MAP_NUM(ROUTE7), MAP_NUM(ROUTE17), ___, ___, ___, ___},\n    {MAP_NUM(ROUTE17), MAP_NUM(ROUTE16), MAP_NUM(ROUTE18), ___, ___, ___, ___},\n    {MAP_NUM(ROUTE18), MAP_NUM(ROUTE15), MAP_NUM(ROUTE17), MAP_NUM(ROUTE19), ___, ___, ___},\n    {MAP_NUM(ROUTE19), MAP_NUM(ROUTE15), MAP_NUM(ROUTE18), MAP_NUM(ROUTE20), ___, ___, ___},\n    {MAP_NUM(ROUTE20), MAP_NUM(ROUTE19), MAP_NUM(ROUTE21_NORTH), ___, ___, ___, ___},\n    {MAP_NUM(ROUTE21_NORTH), MAP_NUM(ROUTE1), MAP_NUM(ROUTE20), ___, ___, ___, ___},\n    {MAP_NUM(ROUTE22), MAP_NUM(ROUTE1), MAP_NUM(ROUTE2), MAP_NUM(ROUTE23), ___, ___, ___},\n    {MAP_NUM(ROUTE23), MAP_NUM(ROUTE22), MAP_NUM(ROUTE2), ___, ___, ___, ___},\n    {MAP_NUM(ROUTE24), MAP_NUM(ROUTE4), MAP_NUM(ROUTE5), MAP_NUM(ROUTE9), ___, ___, ___},\n    {MAP_NUM(ROUTE25), MAP_NUM(ROUTE24), MAP_NUM(ROUTE9), ___, ___, ___, ___},\n    {___, ___, ___, ___, ___, ___, ___}\n};\n\n#undef ___\n#define NUM_LOCATION_SETS (ARRAY_COUNT(sRoamerLocations) - 1)\n#define NUM_LOCATIONS_PER_SET (ARRAY_COUNT(sRoamerLocations[0]))\n\nvoid ClearRoamerData(void)\n{\n    u32 i;\n    *ROAMER = (struct Roamer){};\n    sRoamerLocation[MAP_GRP] = 0;\n    sRoamerLocation[MAP_NUM] = 0;\n    for (i = 0; i < ARRAY_COUNT(sLocationHistory); i++)\n    {\n        sLocationHistory[i][MAP_GRP] = 0;\n        sLocationHistory[i][MAP_NUM] = 0;\n    }\n}\n\nu16 GetRoamerSpecies(void)\n{\n    u16 species = SPECIES_NONE;\n    u16 starter = GetStarterSpecies();\n\n    switch(starter)\n    {\n        case SPECIES_SQUIRTLE:\n            if(!FlagGet(FLAG_CAUGHT_RAIKOU))\n            {\n                species = SPECIES_RAIKOU;\n            }\n            else if(!FlagGet(FLAG_CAUGHT_ENTEI))\n            {\n                species = SPECIES_ENTEI;\n            }\n            else\n            {\n                species = SPECIES_SUICUNE;\n            }\n            break;\n        case SPECIES_BULBASAUR:\n            if(!FlagGet(FLAG_CAUGHT_ENTEI))\n            {\n                species = SPECIES_ENTEI;\n            }\n            else if(!FlagGet(FLAG_CAUGHT_SUICUNE))\n            {\n                species = SPECIES_SUICUNE;\n            }\n            else\n            {\n                species = SPECIES_RAIKOU;\n            }\n            break;\n        case SPECIES_CHARMANDER:\n            if(!FlagGet(FLAG_CAUGHT_SUICUNE))\n            {\n                species = SPECIES_SUICUNE;\n            }\n            else if(!FlagGet(FLAG_CAUGHT_RAIKOU))\n            {\n                species = SPECIES_RAIKOU;\n            }\n            else\n            {\n                species = SPECIES_ENTEI;\n            }\n            break;\n    }\n    return species;\n}\n\nvoid CreateInitialRoamerMon(void)\n{\n    struct Pokemon * mon = &gEnemyParty[0];\n    u16 species = GetRoamerSpecies();\n    CreateMon(mon, species, 50, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0);\n    ROAMER->species = species;\n    ROAMER->level = 50;\n    ROAMER->status = 0;\n    ROAMER->active = TRUE;\n    ROAMER->ivs = GetMonData(mon, MON_DATA_IVS);\n    ROAMER->personality = GetMonData(mon, MON_DATA_PERSONALITY);\n    ROAMER->hp = GetMonData(mon, MON_DATA_MAX_HP);\n    ROAMER->cool = GetMonData(mon, MON_DATA_COOL);\n    ROAMER->beauty = GetMonData(mon, MON_DATA_BEAUTY);\n    ROAMER->cute = GetMonData(mon, MON_DATA_CUTE);\n    ROAMER->smart = GetMonData(mon, MON_DATA_SMART);\n    ROAMER->tough = GetMonData(mon, MON_DATA_TOUGH);\n    sRoamerLocation[MAP_GRP] = ROAMER_MAP_GROUP;\n    sRoamerLocation[MAP_NUM] = sRoamerLocations[Random() % NUM_LOCATION_SETS][0];\n}\n\nvoid InitRoamer(void)\n{\n    if (ROAMER->active)\n        return;\n    if(FlagGet(FLAG_CAUGHT_RAIKOU) && FlagGet(FLAG_CAUGHT_ENTEI) && FlagGet(FLAG_CAUGHT_SUICUNE))\n        return;\n    ClearRoamerData();\n    CreateInitialRoamerMon();\n}\n\nvoid UpdateLocationHistoryForRoamer(void)\n{\n    sLocationHistory[2][MAP_GRP] = sLocationHistory[1][MAP_GRP];\n    sLocationHistory[2][MAP_NUM] = sLocationHistory[1][MAP_NUM];\n\n    sLocationHistory[1][MAP_GRP] = sLocationHistory[0][MAP_GRP];\n    sLocationHistory[1][MAP_NUM] = sLocationHistory[0][MAP_NUM];\n\n    sLocationHistory[0][MAP_GRP] = gSaveBlock1Ptr->location.mapGroup;\n    sLocationHistory[0][MAP_NUM] = gSaveBlock1Ptr->location.mapNum;\n}\n\nvoid RoamerMoveToOtherLocationSet(void)\n{\n    u8 mapNum = 0;\n\n    if (!ROAMER->active)\n        return;\n\n    sRoamerLocation[MAP_GRP] = ROAMER_MAP_GROUP;\n\n    // Choose a location set that starts with a map\n    // different from the roamer's current map\n    while (1)\n    {\n        mapNum = sRoamerLocations[Random() % NUM_LOCATION_SETS][0];\n        if (sRoamerLocation[MAP_NUM] != mapNum)\n        {\n            sRoamerLocation[MAP_NUM] = mapNum;\n            return;\n        }\n    }\n}\n\nvoid RoamerMove(void)\n{\n    u8 locSet = 0;\n\n    if ((Random() % 16) == 0)\n    {\n        RoamerMoveToOtherLocationSet();\n    }\n    else\n    {\n        if (!ROAMER->active)\n            return;\n\n        while (locSet < NUM_LOCATION_SETS)\n        {\n            // Find the location set that starts with the roamer's current map\n            if (sRoamerLocation[MAP_NUM] == sRoamerLocations[locSet][0])\n            {\n                u8 mapNum;\n                while (1)\n                {\n                    // Choose a new map (excluding the first) within this set\n                    // Also exclude a map if the roamer was there 2 moves ago\n                    mapNum = sRoamerLocations[locSet][(Random() % (NUM_LOCATIONS_PER_SET - 1)) + 1];\n                    if (!(sLocationHistory[2][MAP_GRP] == ROAMER_MAP_GROUP\n                       && sLocationHistory[2][MAP_NUM] == mapNum)\n                       && mapNum != MAP_NUM(UNDEFINED))\n                        break;\n                }\n                sRoamerLocation[MAP_NUM] = mapNum;\n                return;\n            }\n            locSet++;\n        }\n    }\n}\n\nbool8 IsRoamerAt(u8 mapGroup, u8 mapNum)\n{\n    if (ROAMER->active && mapGroup == sRoamerLocation[MAP_GRP] && mapNum == sRoamerLocation[MAP_NUM])\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid CreateRoamerMonInstance(void)\n{\n    u32 status;\n    struct Pokemon *mon = &gEnemyParty[0];\n    ZeroEnemyPartyMons();\n    CreateMonWithIVsPersonality(mon, ROAMER->species, ROAMER->level, ROAMER->ivs, ROAMER->personality);\n// The roamer's status field is u8, but SetMonData expects status to be u32, so will set the roamer's status\n// using the status field and the following 3 bytes (cool, beauty, and cute).\n#ifdef BUGFIX\n    status = ROAMER->status;\n    SetMonData(mon, MON_DATA_STATUS, &status);\n#else\n    SetMonData(mon, MON_DATA_STATUS, &ROAMER->status);\n#endif\n    SetMonData(mon, MON_DATA_HP, &ROAMER->hp);\n    SetMonData(mon, MON_DATA_COOL, &ROAMER->cool);\n    SetMonData(mon, MON_DATA_BEAUTY, &ROAMER->beauty);\n    SetMonData(mon, MON_DATA_CUTE, &ROAMER->cute);\n    SetMonData(mon, MON_DATA_SMART, &ROAMER->smart);\n    SetMonData(mon, MON_DATA_TOUGH, &ROAMER->tough);\n}\n\nbool8 TryStartRoamerEncounter(void)\n{\n    if (IsRoamerAt(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum) == TRUE && (Random() % 4) == 0)\n    {\n        CreateRoamerMonInstance();\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\nvoid UpdateRoamerHPStatus(struct Pokemon *mon)\n{\n    ROAMER->hp = GetMonData(mon, MON_DATA_HP);\n    ROAMER->status = GetMonData(mon, MON_DATA_STATUS);\n\n    RoamerMoveToOtherLocationSet();\n}\n\nvoid SetRoamerInactive(void)\n{\n    ROAMER->active = FALSE;\n}\n\nvoid GetRoamerLocation(u8 *mapGroup, u8 *mapNum)\n{\n    *mapGroup = sRoamerLocation[MAP_GRP];\n    *mapNum = sRoamerLocation[MAP_NUM];\n}\n\nu16 GetRoamerLocationMapSectionId(void)\n{\n    if (!ROAMER->active)\n        return MAPSEC_NONE;\n    return Overworld_GetMapHeaderByGroupAndId(sRoamerLocation[MAP_GRP], sRoamerLocation[MAP_NUM])->regionMapSectionId;\n}\n"
  },
  {
    "path": "src/rom_header.s",
    "content": "@ Note: ROM header data is empty space here.\n@       It's populated by gbafix using data provided in the Makefile. \n\n\t.global Start\nStart:\n\tb start_vector\n\n\t.global RomHeaderNintendoLogo\nRomHeaderNintendoLogo:\n\t.space 156\n\nRomHeaderGameTitle:\n\t.space 12\n\n\t.global RomHeaderGameCode\nRomHeaderGameCode:\n\t.space 4\n\nRomHeaderMakerCode:\n\t.space 2\n\nRomHeaderMagic:\n\t.byte 0\n\nRomHeaderMainUnitCode:\n\t.byte 0\n\nRomHeaderDeviceType:\n\t.byte 0\n\nRomHeaderReserved1:\n\t.space 7\n\n\t.global RomHeaderSoftwareVersion\nRomHeaderSoftwareVersion:\n\t.byte 0\n\nRomHeaderChecksum:\n\t.byte 0\n\nRomHeaderReserved2:\n\t.space 2\n\n\t.word 0\n\n\t.global GPIOPortData\nGPIOPortData:\n\t.hword 0\n\n\t.global GPIOPortDirection\nGPIOPortDirection:\n\t.hword 0\n\n\t.global GPIOPortReadEnable\nGPIOPortReadEnable:\n\t.hword 0\n\n\t.space 6\n\n\t.4byte 0xFFFFFFFF\n\t.4byte 0xFFFFFFFF\n\t.4byte 0xFFFFFFFF\n\t.4byte 0xFFFFFFFF\n\t.4byte 0xFFFFFFFF\n\t.4byte 0xFFFFFFFF\n\t.4byte 0xFFFFFFFF\n\t.4byte 0xFFFFFFFF\n\t.4byte 0xFFFFFFFF\n\t.4byte 0xFFFFFFFF\n\t.4byte 0xFFFFFFFF\n\t.4byte 0xFFFFFFFF\n"
  },
  {
    "path": "src/rom_header_gf.c",
    "content": "#include \"global.h\"\n#include \"data.h\"\n#include \"pokemon_icon.h\"\n#include \"decoration.h\"\n#include \"battle_main.h\"\n#include \"item.h\"\n#include \"pokeball.h\"\n#include \"pokedex.h\"\n\nstruct GFRomHeader\n{\n    u32 version;\n    u32 language;\n    u8 gameName[32];\n    const struct CompressedSpriteSheet * monFrontPics;\n    const struct CompressedSpriteSheet * monBackPics;\n    const struct CompressedSpritePalette * monNormalPalettes;\n    const struct CompressedSpritePalette * monShinyPalettes;\n    const u8 *const * monIcons;\n    const u8 * monIconPaletteIds;\n    const struct SpritePalette * monIconPalettes;\n    const u8 (* monSpeciesNames)[];\n    const u8 (* moveNames)[];\n    const struct Decoration * decorations;\n    u32 flagsOffset;\n    u32 varsOffset;\n    u32 pokedexOffset;\n    u32 seen1Offset;\n    u32 seen2Offset;\n    u32 pokedexVar;\n    u32 pokedexFlag;\n    u32 mysteryGiftFlag;\n    u32 pokedexCount;\n    u8 playerNameLength;\n    u8 unk2;\n    u8 pokemonNameLength1;\n    u8 pokemonNameLength2;\n    u8 unk5;\n    u8 unk6;\n    u8 unk7;\n    u8 unk8;\n    u8 unk9;\n    u8 unk10;\n    u8 unk11;\n    u8 unk12;\n    u8 unk13;\n    u8 unk14;\n    u8 unk15;\n    u8 unk16;\n    u8 unk17;\n    u32 saveBlock2Size;\n    u32 saveBlock1Size;\n    u32 partyCountOffset;\n    u32 partyOffset;\n    u32 warpFlagsOffset;\n    u32 trainerIdOffset;\n    u32 playerNameOffset;\n    u32 playerGenderOffset;\n    u32 unkFlagOffset;\n    u32 unkFlagOffset2;\n    u32 externalEventFlagsOffset;\n    u32 externalEventDataOffset;\n    u32 unk18;\n    const struct SpeciesInfo * speciesInfo;\n    const u8 (* abilityNames)[];\n    const u8 *const * abilityDescriptions;\n    const struct Item * items;\n    const struct BattleMove * moves;\n    const struct CompressedSpriteSheet * ballGfx;\n    const struct CompressedSpritePalette * ballPalettes;\n    u32 gcnLinkFlagsOffset;\n    u32 gameClearFlag;\n    u32 ribbonFlag;\n    u8 bagCountItems;\n    u8 bagCountKeyItems;\n    u8 bagCountPokeballs;\n    u8 bagCountTMHMs;\n    u8 bagCountBerries;\n    u8 pcItemsCount;\n    u32 pcItemsOffset;\n    u32 giftRibbonsOffset;\n    u32 enigmaBerryOffset;\n    u32 enigmaBerrySize;\n    const u8 * moveDescriptions;\n    u32 unk20;\n};\n\n// This seems to need to be in the text section for some reason.\n// To avoid a changed section attributes warning it's put in a special .text.consts section.\n__attribute__((section(\".text.consts\")))\nstatic const struct GFRomHeader sGFRomHeader = {\n    .version = GAME_VERSION,\n    .language = GAME_LANGUAGE,\n#ifdef FIRERED\n    .gameName = \"pokemon red version\",\n#else\n    .gameName = \"pokemon green version\",\n#endif\n    .monFrontPics = gMonFrontPicTable,\n    .monBackPics = gMonBackPicTable,\n    .monNormalPalettes = gMonPaletteTable,\n    .monShinyPalettes = gMonShinyPaletteTable,\n    .monIcons = gMonIconTable,\n    .monIconPaletteIds = gMonIconPaletteIndices,\n    .monIconPalettes = gMonIconPaletteTable,\n    .monSpeciesNames = gSpeciesNames,\n    .moveNames = gMoveNames,\n    .decorations = gDecorations,\n    .flagsOffset = offsetof(struct SaveBlock1, flags),\n    .varsOffset = offsetof(struct SaveBlock1, vars),\n    .pokedexOffset = offsetof(struct SaveBlock2, pokedex),\n    .seen1Offset = offsetof(struct SaveBlock1, seen1),\n    .seen2Offset = offsetof(struct SaveBlock1, seen2),\n    .pokedexVar = VAR_0x403C - VARS_START,\n    .pokedexFlag = FLAG_0x838,\n    .mysteryGiftFlag = FLAG_SYS_MYSTERY_GIFT_ENABLED,\n    .pokedexCount = NATIONAL_DEX_COUNT,\n    .playerNameLength = PLAYER_NAME_LENGTH,\n    .unk2 = 10,\n    .pokemonNameLength1 = POKEMON_NAME_LENGTH,\n    .pokemonNameLength2 = POKEMON_NAME_LENGTH,\n    // Two of the below 12s are likely move/ability name length, given their presence in this header\n    .unk5 = 12,\n    .unk6 = 12,\n    .unk7 = 6,\n    .unk8 = 12,\n    .unk9 = 6,\n    .unk10 = 16,\n    .unk11 = 18,\n    .unk12 = 12,\n    .unk13 = 15,\n    .unk14 = 11,\n    .unk15 = 1,\n    .unk16 = 8,\n    .unk17 = 12,\n    .saveBlock2Size = sizeof(struct SaveBlock2),\n    .saveBlock1Size = sizeof(struct SaveBlock1),\n    .partyCountOffset = offsetof(struct SaveBlock1, playerPartyCount),\n    .partyOffset = offsetof(struct SaveBlock1, playerParty),\n    .warpFlagsOffset = offsetof(struct SaveBlock2, specialSaveWarpFlags),\n    .trainerIdOffset = offsetof(struct SaveBlock2, playerTrainerId),\n    .playerNameOffset = offsetof(struct SaveBlock2, playerName),\n    .playerGenderOffset = offsetof(struct SaveBlock2, playerGender),\n    .unkFlagOffset = offsetof(struct SaveBlock2, unkFlag2),\n    .unkFlagOffset2 = offsetof(struct SaveBlock2, unkFlag2),\n    .externalEventFlagsOffset = offsetof(struct SaveBlock1, externalEventFlags),\n    .externalEventDataOffset = offsetof(struct SaveBlock1, externalEventData),\n    .unk18 = 0x00000000,\n    .speciesInfo = gSpeciesInfo,\n    .abilityNames = gAbilityNames,\n    .abilityDescriptions = gAbilityDescriptionPointers,\n    .items = gItems,\n    .moves = gBattleMoves,\n    .ballGfx = gBallSpriteSheets,\n    .ballPalettes = gBallSpritePalettes,\n    .gcnLinkFlagsOffset = offsetof(struct SaveBlock2, gcnLinkFlags),\n    .gameClearFlag = FLAG_SYS_GAME_CLEAR,\n    .ribbonFlag = FLAG_SYS_RIBBON_GET,\n    .bagCountItems = BAG_ITEMS_COUNT,\n    .bagCountKeyItems = BAG_KEYITEMS_COUNT,\n    .bagCountPokeballs = BAG_POKEBALLS_COUNT,\n    .bagCountTMHMs = BAG_TMHM_COUNT,\n    .bagCountBerries = BAG_BERRIES_COUNT,\n    .pcItemsCount = PC_ITEMS_COUNT,\n    .pcItemsOffset = offsetof(struct SaveBlock1, pcItems),\n    .giftRibbonsOffset = offsetof(struct SaveBlock1, giftRibbons),\n    .enigmaBerryOffset = offsetof(struct SaveBlock1, enigmaBerry),\n    .enigmaBerrySize = sizeof(struct EnigmaBerry),\n    .moveDescriptions = NULL,\n    .unk20 = 0xFFFFFFFF, // 0x00000000 in Emerald\n};\n"
  },
  {
    "path": "src/safari_zone.c",
    "content": "#include \"global.h\"\n#include \"battle.h\"\n#include \"battle_setup.h\"\n#include \"event_scripts.h\"\n#include \"overworld.h\"\n#include \"pokedex.h\"\n#include \"script.h\"\n#include \"event_data.h\"\n#include \"field_screen_effect.h\"\n#include \"constants/map_types.h\"\n\nEWRAM_DATA u8 gNumSafariBalls = 0;\nEWRAM_DATA u16 gSafariZoneStepCounter = 0;\n\nbool32 GetSafariZoneFlag(void)\n{\n    return FlagGet(FLAG_SYS_SAFARI_MODE);\n}\n\nvoid SetSafariZoneFlag(void)\n{\n    FlagSet(FLAG_SYS_SAFARI_MODE);\n}\n\nvoid ResetSafariZoneFlag(void)\n{\n    FlagClear(FLAG_SYS_SAFARI_MODE);\n}\n\nvoid EnterSafariMode(void)\n{\n    IncrementGameStat(GAME_STAT_ENTERED_SAFARI_ZONE);\n    SetSafariZoneFlag();\n    gNumSafariBalls = 30;\n    gSafariZoneStepCounter = 600;\n}\n\nvoid ExitSafariMode(void)\n{\n    ResetSafariZoneFlag();\n    gNumSafariBalls = 0;\n    gSafariZoneStepCounter = 0;\n}\n\nbool8 SafariZoneTakeStep(void)\n{\n    if (GetSafariZoneFlag() == FALSE)\n        return FALSE;\n    if (gMapHeader.mapType == MAP_TYPE_INDOOR)\n        return FALSE;\n    gSafariZoneStepCounter--;\n    if (gSafariZoneStepCounter == 0)\n    {\n        ScriptContext_SetupScript(SafariZone_EventScript_TimesUp);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid SafariZoneRetirePrompt(void)\n{\n    ScriptContext_SetupScript(SafariZone_EventScript_RetirePrompt);\n}\n\nvoid CB2_EndSafariBattle(void)\n{\n    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n    {   \n        if(!IsWildMonNuzlockeDupe(GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)))\n        {\n            NuzlockeFlagSet(GetCurrentRegionMapSectionId());\n        }\n    }\n    if (gNumSafariBalls != 0)\n    {\n        SetMainCallback2(CB2_ReturnToField);\n    }\n    else if (gBattleOutcome == B_OUTCOME_NO_SAFARI_BALLS)\n    {\n        RunScriptImmediately(SafariZone_EventScript_OutOfBallsMidBattle);\n        WarpIntoMap();\n        gFieldCallback = FieldCB_SafariZoneRanOutOfBalls;\n        SetMainCallback2(CB2_LoadMap);\n    }\n    else if (gBattleOutcome == B_OUTCOME_CAUGHT)\n    {\n        ScriptContext_SetupScript(SafariZone_EventScript_OutOfBalls);\n        ScriptContext_Stop();\n        SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n    }\n}\n\nvoid SafariZoneRefillSteps(void)\n{\n    gSafariZoneStepCounter = 600;\n}\n\nvoid SafariZoneCheckSteps(void)\n{\n    gSpecialVar_Result = gSafariZoneStepCounter;\n}\n"
  },
  {
    "path": "src/save.c",
    "content": "#include \"global.h\"\n#include \"save.h\"\n#include \"decompress.h\"\n#include \"overworld.h\"\n#include \"load_save.h\"\n#include \"task.h\"\n#include \"link.h\"\n#include \"save_failed_screen.h\"\n#include \"fieldmap.h\"\n#include \"pokemon_storage_system.h\"\n#include \"gba/flash_internal.h\"\n\nstatic u8 HandleWriteSector(u16 sectorId, const struct SaveSectorLocation *locations);\nstatic u8 TryWriteSector(u8 sectorNum, u8 *data);\nstatic u8 HandleReplaceSector(u16 sectorId, const struct SaveSectorLocation *locations);\nstatic u8 CopySaveSlotData(u16 sectorId, const struct SaveSectorLocation *locations);\nstatic u8 GetSaveValidStatus(const struct SaveSectorLocation *locations);\nstatic u8 ReadFlashSector(u8 sectorId, struct SaveSector *sector);\nstatic u16 CalculateChecksum(void *data, u16 size);\n\n/*\n * Sector Layout:\n *\n * Sectors 0 - 13:      Save Slot 1\n * Sectors 14 - 27:     Save Slot 2\n * Sectors 28 - 29:     Hall of Fame\n * Sectors 30 - 31:     Trainer Tower\n *\n * There are two save slots for saving the player's game data. We alternate between\n * them each time the game is saved, so that if the current save slot is corrupt,\n * we can load the previous one. We also rotate the sectors in each save slot\n * so that the same data is not always being written to the same sector. This\n * might be done to reduce wear on the flash memory, but I'm not sure, since all\n * 14 sectors get written anyway.\n *\n * See SECTOR_ID_* constants in save.h\n */\n\n// (u8 *)structure was removed from the first statement of the macro in Emerald\n// and Fire Red/Leaf Green. This is because malloc is used to allocate addresses\n// so storing the raw addresses should not be done in the offsets information.\n#define SAVEBLOCK_CHUNK(structure, chunkNum)                                   \\\n{                                                                              \\\n    chunkNum * SECTOR_DATA_SIZE,                                               \\\n    sizeof(structure) >= chunkNum * SECTOR_DATA_SIZE ?                         \\\n    min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) : 0 \\\n}\n\nstruct\n{\n    u16 offset;\n    u16 size;\n} static const sSaveSlotLayout[NUM_SECTORS_PER_SLOT] =\n{\n    SAVEBLOCK_CHUNK(struct SaveBlock2, 0), // SECTOR_ID_SAVEBLOCK2\n\n    SAVEBLOCK_CHUNK(struct SaveBlock1, 0), // SECTOR_ID_SAVEBLOCK1_START\n    SAVEBLOCK_CHUNK(struct SaveBlock1, 1),\n    SAVEBLOCK_CHUNK(struct SaveBlock1, 2),\n    SAVEBLOCK_CHUNK(struct SaveBlock1, 3), // SECTOR_ID_SAVEBLOCK1_END\n\n    SAVEBLOCK_CHUNK(struct PokemonStorage, 0), // SECTOR_ID_PKMN_STORAGE_START\n    SAVEBLOCK_CHUNK(struct PokemonStorage, 1),\n    SAVEBLOCK_CHUNK(struct PokemonStorage, 2),\n    SAVEBLOCK_CHUNK(struct PokemonStorage, 3),\n    SAVEBLOCK_CHUNK(struct PokemonStorage, 4),\n    SAVEBLOCK_CHUNK(struct PokemonStorage, 5),\n    SAVEBLOCK_CHUNK(struct PokemonStorage, 6),\n    SAVEBLOCK_CHUNK(struct PokemonStorage, 7),\n    SAVEBLOCK_CHUNK(struct PokemonStorage, 8), // SECTOR_ID_PKMN_STORAGE_END\n};\n\n// These will produce an error if a save struct is larger than the space\n// alloted for it in the flash.\nSTATIC_ASSERT(sizeof(struct SaveBlock2) <= SECTOR_DATA_SIZE, SaveBlock2FreeSpace);\nSTATIC_ASSERT(sizeof(struct SaveBlock1) <= SECTOR_DATA_SIZE * (SECTOR_ID_SAVEBLOCK1_END - SECTOR_ID_SAVEBLOCK1_START + 1), SaveBlock1FreeSpace);\nSTATIC_ASSERT(sizeof(struct PokemonStorage) <= SECTOR_DATA_SIZE * (SECTOR_ID_PKMN_STORAGE_END - SECTOR_ID_PKMN_STORAGE_START + 1), PokemonStorageFreeSpace);\n\n// Sector num to begin writing save data. Sectors are rotated each time the game is saved. (possibly to avoid wear on flash memory?)\nu16 gLastWrittenSector;\nu32 gLastSaveCounter;\nu16 gLastKnownGoodSector;\nu32 gDamagedSaveSectors;\nu32 gSaveCounter;\nstruct SaveSector *gSaveDataBufferPtr; // the pointer is in fast IWRAM but points to the slower EWRAM.\nu16 gIncrementalSectorId;\nu16 gSaveUnusedVar;\nu16 gSaveFileStatus;\nvoid (*gGameContinueCallback)(void);\nstruct SaveSectorLocation gRamSaveSectorLocations[NUM_SECTORS_PER_SLOT];\nu16 gSaveAttemptStatus;\n\nEWRAM_DATA struct SaveSector gSaveDataBuffer = {0};\nEWRAM_DATA u32 gSaveUnusedVar2 = 0;\n\nvoid ClearSaveData(void)\n{\n    u32 i;\n\n    for (i = 0; i < SECTORS_COUNT; i++)\n        EraseFlashSector(i);\n}\n\nvoid Save_ResetSaveCounters(void)\n{\n    gSaveCounter = 0;\n    gLastWrittenSector = 0;\n    gDamagedSaveSectors = 0;\n}\n\nstatic bool32 SetDamagedSectorBits(u8 op, u8 sectorNum)\n{\n    bool32 retVal = FALSE;\n\n    switch (op)\n    {\n    case ENABLE:\n        gDamagedSaveSectors |= (1 << sectorNum);\n        break;\n    case DISABLE:\n        gDamagedSaveSectors &= ~(1 << sectorNum);\n        break;\n    case CHECK: // unused\n        if (gDamagedSaveSectors & (1 << sectorNum))\n            retVal = TRUE;\n        break;\n    }\n\n    return retVal;\n}\n\nstatic u8 WriteSaveSectorOrSlot(u16 sectorId, const struct SaveSectorLocation *locations)\n{\n    u32 status;\n    u32 i;\n\n    gSaveDataBufferPtr = &gSaveDataBuffer;\n\n    if (sectorId != FULL_SAVE_SLOT)  // write single sector\n        status = HandleWriteSector(sectorId, locations);\n\n    else  // write all sectors\n    {\n        gLastKnownGoodSector = gLastWrittenSector; // backup the current written sector before attempting to write.\n        gLastSaveCounter = gSaveCounter;\n        gLastWrittenSector++;\n        gLastWrittenSector %= NUM_SECTORS_PER_SLOT; // array count save sector locations\n        gSaveCounter++;\n        status = SAVE_STATUS_OK;\n\n        for (i = 0; i < NUM_SECTORS_PER_SLOT; i++)\n            HandleWriteSector(i, locations);\n\n        // Check for any bad sectors\n        if (gDamagedSaveSectors != 0) // skip the damaged sector.\n        {\n            status = SAVE_STATUS_ERROR;\n            gLastWrittenSector = gLastKnownGoodSector;\n            gSaveCounter = gLastSaveCounter;\n        }\n    }\n\n    return status;\n}\n\nstatic u8 HandleWriteSector(u16 sectorId, const struct SaveSectorLocation *locations)\n{\n    u32 i;\n    u16 sectorNum;\n    u8 *data;\n    u16 size;\n\n    sectorNum = gLastWrittenSector + sectorId;\n    sectorNum %= NUM_SECTORS_PER_SLOT;\n    sectorNum += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS);\n\n    data = locations[sectorId].data;\n    size = locations[sectorId].size;\n\n    // clear buffer\n    for (i = 0; i < SECTOR_SIZE; i++)\n        ((char *)gSaveDataBufferPtr)[i] = 0;\n\n    // fill buffer with save data\n    gSaveDataBufferPtr->id = sectorId;\n    gSaveDataBufferPtr->signature = SECTOR_SIGNATURE;\n    gSaveDataBufferPtr->counter = gSaveCounter;\n\n    for (i = 0; i < size; i++)\n        gSaveDataBufferPtr->data[i] = data[i];\n\n    gSaveDataBufferPtr->checksum = CalculateChecksum(data, size);\n    return TryWriteSector(sectorNum, gSaveDataBufferPtr->data);\n}\n\nstatic u8 HandleWriteSectorNBytes(u8 sectorId, u8 *data, u16 size)\n{\n    u32 i;\n    struct SaveSector *sector = &gSaveDataBuffer;\n\n    for (i = 0; i < SECTOR_SIZE; i++)\n        ((char *)sector)[i] = 0;\n\n    sector->signature = SECTOR_SIGNATURE;\n\n    for (i = 0; i < size; i++)\n        sector->data[i] = data[i];\n\n    sector->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used.\n    return TryWriteSector(sectorId, sector->data);\n}\n\nstatic u8 TryWriteSector(u8 sectorNum, u8 *data)\n{\n    if (ProgramFlashSectorAndVerify(sectorNum, data)) // is damaged?\n    {\n        SetDamagedSectorBits(ENABLE, sectorNum); // set damaged sector bits.\n        return SAVE_STATUS_ERROR;\n    }\n    else\n    {\n        SetDamagedSectorBits(DISABLE, sectorNum); // unset damaged sector bits. it's safe now.\n        return SAVE_STATUS_OK;\n    }\n}\n\nstatic u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectorLocation *locations)\n{\n    gSaveDataBufferPtr = &gSaveDataBuffer;\n    gLastKnownGoodSector = gLastWrittenSector;\n    gLastSaveCounter = gSaveCounter;\n    gLastWrittenSector++;\n    gLastWrittenSector %= NUM_SECTORS_PER_SLOT;\n    gSaveCounter++;\n    gIncrementalSectorId = 0;\n    gDamagedSaveSectors = 0;\n    return 0;\n}\n\nstatic u32 RestoreSaveBackupVars(const struct SaveSectorLocation *locations)\n{\n    gSaveDataBufferPtr = &gSaveDataBuffer;\n    gLastKnownGoodSector = gLastWrittenSector;\n    gLastSaveCounter = gSaveCounter;\n    gIncrementalSectorId = 0;\n    gDamagedSaveSectors = 0;\n    return 0;\n}\n\nstatic u8 HandleWriteIncrementalSector(u16 numSectors, const struct SaveSectorLocation *locations)\n{\n    u8 status;\n\n    if (gIncrementalSectorId < numSectors - 1)\n    {\n        status = SAVE_STATUS_OK;\n        HandleWriteSector(gIncrementalSectorId, locations);\n        gIncrementalSectorId++;\n        if (gDamagedSaveSectors)\n        {\n            status = SAVE_STATUS_ERROR;\n            gLastWrittenSector = gLastKnownGoodSector;\n            gSaveCounter = gLastSaveCounter;\n        }\n    }\n    else\n        status = SAVE_STATUS_ERROR;\n\n    return status;\n}\n\nstatic u8 HandleReplaceSectorAndVerify(u16 sectorId, const struct SaveSectorLocation *locations)\n{\n    u8 status = SAVE_STATUS_OK;\n\n    HandleReplaceSector(sectorId - 1, locations);\n\n    if (gDamagedSaveSectors)\n    {\n        status = SAVE_STATUS_ERROR;\n        gLastWrittenSector = gLastKnownGoodSector;\n        gSaveCounter = gLastSaveCounter;\n    }\n    return status;\n}\n\nstatic u8 HandleReplaceSector(u16 sectorId, const struct SaveSectorLocation *locations)\n{\n    u32 i;\n    u16 sectorNum;\n    u8 *data;\n    u16 size;\n    u8 status;\n\n    sectorNum = gLastWrittenSector + sectorId;\n    sectorNum %= NUM_SECTORS_PER_SLOT;\n    sectorNum += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS);\n\n    data = locations[sectorId].data;\n    size = locations[sectorId].size;\n\n    // clear buffer\n    for (i = 0; i < SECTOR_SIZE; i++)\n        ((char *)gSaveDataBufferPtr)[i] = 0;\n\n    // fill buffer with save data\n    gSaveDataBufferPtr->id = sectorId;\n    gSaveDataBufferPtr->signature = SECTOR_SIGNATURE;\n    gSaveDataBufferPtr->counter = gSaveCounter;\n    for (i = 0; i < size; i++)\n        gSaveDataBufferPtr->data[i] = data[i];\n\n    gSaveDataBufferPtr->checksum = CalculateChecksum(data, size);\n\n    // erase old save data\n    EraseFlashSector(sectorNum);\n\n    status = SAVE_STATUS_OK;\n\n    // write new save data, excluding the signature and counter fields\n    for (i = 0; i < SECTOR_SIGNATURE_OFFSET; i++)\n    {\n        if (ProgramFlashByte(sectorNum, i, gSaveDataBufferPtr->data[i]))\n        {\n            status = SAVE_STATUS_ERROR;\n            break;\n        }\n    }\n\n    if (status == SAVE_STATUS_ERROR)\n    {\n        SetDamagedSectorBits(ENABLE, sectorNum);\n        return SAVE_STATUS_ERROR;\n    }\n    else\n    {\n        status = SAVE_STATUS_OK;\n\n        // write signature (skipping the first byte) and counter fields\n        // the first signature byte skipped is instead written in WriteSectorSignatureByte\n        for (i = 0; i < SECTOR_SIZE - (SECTOR_SIGNATURE_OFFSET + 1); i++)\n        {\n            if (ProgramFlashByte(sectorNum, SECTOR_SIGNATURE_OFFSET + 1 + i, ((u8 *)gSaveDataBufferPtr)[SECTOR_SIGNATURE_OFFSET + 1 + i]))\n            {\n                status = SAVE_STATUS_ERROR;\n                break;\n            }\n        }\n\n        if (status == SAVE_STATUS_ERROR)\n        {\n            SetDamagedSectorBits(ENABLE, sectorNum);\n            return SAVE_STATUS_ERROR;\n        }\n        else\n        {\n            SetDamagedSectorBits(DISABLE, sectorNum);\n            return SAVE_STATUS_OK;\n        }\n    }\n}\n\nstatic u8 CopySectorSignatureByte(u16 sectorId, const struct SaveSectorLocation *locations)\n{\n    u16 sector;\n\n    sector = gLastWrittenSector + sectorId - 1;\n    sector %= NUM_SECTORS_PER_SLOT;\n    sector += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS);\n\n    if (ProgramFlashByte(sector, SECTOR_SIGNATURE_OFFSET, ((u8 *)gSaveDataBufferPtr)[SECTOR_SIGNATURE_OFFSET]))\n    {\n        // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.\n        SetDamagedSectorBits(ENABLE, sector);\n        gLastWrittenSector = gLastKnownGoodSector;\n        gSaveCounter = gLastSaveCounter;\n        return SAVE_STATUS_ERROR;\n    }\n    else\n    {\n        SetDamagedSectorBits(DISABLE, sector);\n        return SAVE_STATUS_OK;\n    }\n}\n\nstatic u8 WriteSectorSignatureByte(u16 sectorId, const struct SaveSectorLocation *locations)\n{\n    u16 sector;\n\n    sector = gLastWrittenSector + sectorId - 1;\n    sector %= NUM_SECTORS_PER_SLOT;\n    sector += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS);\n\n    // write only the first byte of the signature, which was skipped in HandleReplaceSector\n    if (ProgramFlashByte(sector, SECTOR_SIGNATURE_OFFSET, SECTOR_SIGNATURE & 0xFF))\n    {\n        // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.\n        SetDamagedSectorBits(ENABLE, sector);\n        gLastWrittenSector = gLastKnownGoodSector;\n        gSaveCounter = gLastSaveCounter;\n        return SAVE_STATUS_ERROR;\n    }\n    else\n    {\n        SetDamagedSectorBits(DISABLE, sector);\n        return SAVE_STATUS_OK;\n    }\n}\n\nstatic u8 TryLoadSaveSlot(u16 sectorId, const struct SaveSectorLocation *locations)\n{\n    u8 status;\n    gSaveDataBufferPtr = &gSaveDataBuffer;\n    if (sectorId != FULL_SAVE_SLOT)\n        status = SAVE_STATUS_ERROR;\n\n    else\n    {\n        status = GetSaveValidStatus(locations);\n        CopySaveSlotData(FULL_SAVE_SLOT, locations);\n    }\n\n    return status;\n}\n\n// sectorId is unused. All sectors in the save slot are read and copied.\nstatic u8 CopySaveSlotData(u16 sectorId, const struct SaveSectorLocation *locations)\n{\n    u32 i;\n    u16 checksum;\n    u16 sector = NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS);\n    u16 id;\n\n    for (i = 0; i < NUM_SECTORS_PER_SLOT; i++)\n    {\n        ReadFlashSector(i + sector, gSaveDataBufferPtr);\n        id = gSaveDataBufferPtr->id;\n        if (id == 0)\n            gLastWrittenSector = i;\n\n        checksum = CalculateChecksum(gSaveDataBufferPtr->data, locations[id].size);\n        if (gSaveDataBufferPtr->signature == SECTOR_SIGNATURE && gSaveDataBufferPtr->checksum == checksum)\n        {\n            u32 j;\n            for (j = 0; j < locations[id].size; j++)\n                locations[id].data[j] = gSaveDataBufferPtr->data[j];\n        }\n    }\n\n    return SAVE_STATUS_OK;\n}\n\nstatic u8 GetSaveValidStatus(const struct SaveSectorLocation *locations)\n{\n    u16 sector;\n    bool8 signatureValid;\n    u16 checksum;\n    u32 slot1saveCounter = 0;\n    u32 slot2saveCounter = 0;\n    u8 slot1Status;\n    u8 slot2Status;\n    u32 validSectors;\n    const u32 ALL_SECTORS = (1 << NUM_SECTORS_PER_SLOT) - 1;  // bitmask of all saveblock sectors\n\n    // check save slot 1.\n    validSectors = 0;\n    signatureValid = FALSE;\n    for (sector = 0; sector < NUM_SECTORS_PER_SLOT; sector++)\n    {\n        ReadFlashSector(sector, gSaveDataBufferPtr);\n        if (gSaveDataBufferPtr->signature == SECTOR_SIGNATURE)\n        {\n            signatureValid = TRUE;\n            checksum = CalculateChecksum(gSaveDataBufferPtr->data, locations[gSaveDataBufferPtr->id].size);\n            if (gSaveDataBufferPtr->checksum == checksum)\n            {\n                slot1saveCounter = gSaveDataBufferPtr->counter;\n                validSectors |= 1 << gSaveDataBufferPtr->id;\n            }\n        }\n    }\n\n    if (signatureValid)\n    {\n        if (validSectors == ALL_SECTORS)\n            slot1Status = SAVE_STATUS_OK;\n        else\n            slot1Status = SAVE_STATUS_ERROR;\n    }\n    else\n        slot1Status = SAVE_STATUS_EMPTY;\n\n    // check save slot 2.\n    validSectors = 0;\n    signatureValid = FALSE;\n    for (sector = 0; sector < NUM_SECTORS_PER_SLOT; sector++)\n    {\n        ReadFlashSector(NUM_SECTORS_PER_SLOT + sector, gSaveDataBufferPtr);\n        if (gSaveDataBufferPtr->signature == SECTOR_SIGNATURE)\n        {\n            signatureValid = TRUE;\n            checksum = CalculateChecksum(gSaveDataBufferPtr->data, locations[gSaveDataBufferPtr->id].size);\n            if (gSaveDataBufferPtr->checksum == checksum)\n            {\n                slot2saveCounter = gSaveDataBufferPtr->counter;\n                validSectors |= 1 << gSaveDataBufferPtr->id;\n            }\n        }\n    }\n\n    if (signatureValid)\n    {\n        if (validSectors == ALL_SECTORS)\n            slot2Status = SAVE_STATUS_OK;\n        else\n            slot2Status = SAVE_STATUS_ERROR;\n    }\n    else\n        slot2Status = SAVE_STATUS_EMPTY;\n\n    if (slot1Status == SAVE_STATUS_OK && slot2Status == SAVE_STATUS_OK)\n    {\n        // Choose counter of the most recent save file\n        if ((slot1saveCounter == -1 && slot2saveCounter == 0) || (slot1saveCounter == 0 && slot2saveCounter == -1))\n        {\n            if ((unsigned)(slot1saveCounter + 1) < (unsigned)(slot2saveCounter + 1))\n                gSaveCounter = slot2saveCounter;\n            else\n                gSaveCounter = slot1saveCounter;\n        }\n        else\n        {\n            if (slot1saveCounter < slot2saveCounter)\n                gSaveCounter = slot2saveCounter;\n            else\n                gSaveCounter = slot1saveCounter;\n        }\n        return SAVE_STATUS_OK;\n    }\n\n    if (slot1Status == SAVE_STATUS_OK)\n    {\n        gSaveCounter = slot1saveCounter;\n        if (slot2Status == SAVE_STATUS_ERROR)\n            return SAVE_STATUS_ERROR;\n        else\n            return SAVE_STATUS_OK;\n    }\n\n    if (slot2Status == SAVE_STATUS_OK)\n    {\n        gSaveCounter = slot2saveCounter;\n        if (slot1Status == SAVE_STATUS_ERROR)\n            return SAVE_STATUS_ERROR;\n        else\n            return SAVE_STATUS_OK;\n    }\n\n    if (slot1Status == SAVE_STATUS_EMPTY && slot2Status == SAVE_STATUS_EMPTY)\n    {\n        gSaveCounter = 0;\n        gLastWrittenSector = 0;\n        return SAVE_STATUS_EMPTY;\n    }\n\n    gSaveCounter = 0;\n    gLastWrittenSector = 0;\n    return SAVE_STATUS_INVALID;\n}\n\nstatic u8 TryLoadSaveSector(u8 sectorId, u8 *data, u16 size)\n{\n    u32 i;\n    struct SaveSector *sector = &gSaveDataBuffer;\n\n    ReadFlashSector(sectorId, sector);\n    if (sector->signature == SECTOR_SIGNATURE)\n    {\n        u16 checksum = CalculateChecksum(sector->data, size);\n        if (sector->id == checksum)\n        {\n            for (i = 0; i < size; i++)\n                data[i] = sector->data[i];\n\n            return SAVE_STATUS_OK;\n        }\n        else\n            return SAVE_STATUS_INVALID;\n\n    }\n    else\n        return SAVE_STATUS_EMPTY;\n}\n\nstatic u8 ReadFlashSector(u8 sectorId, struct SaveSector *sector)\n{\n    ReadFlash(sectorId, 0, sector->data, SECTOR_SIZE);\n    return 1;\n}\n\nstatic u16 CalculateChecksum(void *data, u16 size)\n{\n    u32 i;\n    u32 checksum = 0;\n\n    for (i = 0; i < (size / 4); i++)\n    {\n        // checksum += *(u32 *)data++;\n        // For compatibility with modern gcc, these statements were separated.\n        checksum += *(u32 *)data;\n        data += 4;\n    }\n\n    return ((checksum >> 16) + checksum);\n}\n\nstatic void UpdateSaveAddresses(void)\n{\n    int i = 0;\n\n    gRamSaveSectorLocations[i].data = (void *)(gSaveBlock2Ptr) + sSaveSlotLayout[i].offset;\n    gRamSaveSectorLocations[i].size = sSaveSlotLayout[i].size;\n\n    for (i = SECTOR_ID_SAVEBLOCK1_START; i <= SECTOR_ID_SAVEBLOCK1_END; i++)\n    {\n        gRamSaveSectorLocations[i].data = (void *)(gSaveBlock1Ptr) + sSaveSlotLayout[i].offset;\n        gRamSaveSectorLocations[i].size = sSaveSlotLayout[i].size;\n    }\n\n    for (/*i = SECTOR_ID_PKMN_STORAGE_START*/; i <= SECTOR_ID_PKMN_STORAGE_END; i++) // do not initialize here to ensure matching\n    {\n        gRamSaveSectorLocations[i].data = (void *)(gPokemonStoragePtr) + sSaveSlotLayout[i].offset;\n        gRamSaveSectorLocations[i].size = sSaveSlotLayout[i].size;\n    }\n}\n\nu8 HandleSavingData(u8 saveType)\n{\n    u32 i;\n    u32 *backupPtr = gMain.vblankCounter1;\n    u8 *tempAddr;\n\n    gMain.vblankCounter1 = NULL;\n    UpdateSaveAddresses();\n    switch (saveType)\n    {\n    case SAVE_HALL_OF_FAME_ERASE_BEFORE: // Unused\n        for (i = SECTOR_ID_HOF_1; i < SECTORS_COUNT; i++)\n            EraseFlashSector(i);\n        // fallthrough\n    case SAVE_HALL_OF_FAME:\n        if (GetGameStat(GAME_STAT_ENTERED_HOF) < 999)\n            IncrementGameStat(GAME_STAT_ENTERED_HOF);\n        tempAddr = gDecompressionBuffer;\n        HandleWriteSectorNBytes(SECTOR_ID_HOF_1, tempAddr, SECTOR_DATA_SIZE);\n        HandleWriteSectorNBytes(SECTOR_ID_HOF_2, tempAddr + SECTOR_DATA_SIZE, SECTOR_DATA_SIZE);\n        // fallthrough\n    case SAVE_NORMAL:\n    default:\n        SaveSerializedGame();\n        WriteSaveSectorOrSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations);\n        break;\n    case SAVE_LINK:\n        SaveSerializedGame();\n        // only SaveBlock2 and SaveBlock1 (ignores storage in PC)\n        for(i = SECTOR_ID_SAVEBLOCK2; i <= SECTOR_ID_SAVEBLOCK1_END; i++)\n            WriteSaveSectorOrSlot(i, gRamSaveSectorLocations);\n        break;\n    case SAVE_EREADER: // unused\n        SaveSerializedGame();\n        // only SaveBlock2\n        WriteSaveSectorOrSlot(SECTOR_ID_SAVEBLOCK2, gRamSaveSectorLocations);\n        break;\n    case SAVE_OVERWRITE_DIFFERENT_FILE:\n        for (i = SECTOR_ID_HOF_1; i < SECTORS_COUNT; i++)\n            EraseFlashSector(i);\n        SaveSerializedGame();\n        WriteSaveSectorOrSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations);\n        break;\n    }\n    gMain.vblankCounter1 = backupPtr;\n    return 0;\n}\n\nu8 TrySavingData(u8 saveType)\n{\n    if (gFlashMemoryPresent != TRUE)\n    {\n        gSaveAttemptStatus = SAVE_STATUS_ERROR;\n        return SAVE_STATUS_ERROR;\n    }\n\n    HandleSavingData(saveType);\n    if (!gDamagedSaveSectors)\n    {\n        gSaveAttemptStatus = SAVE_STATUS_OK;\n        return SAVE_STATUS_OK;\n    }\n    else\n    {\n        DoSaveFailedScreen(saveType);\n        gSaveAttemptStatus = SAVE_STATUS_ERROR;\n        return SAVE_STATUS_ERROR;\n    }\n}\n\nbool8 LinkFullSave_Init(void)\n{\n    if (gFlashMemoryPresent != TRUE)\n        return TRUE;\n\n    UpdateSaveAddresses();\n    SaveSerializedGame();\n    RestoreSaveBackupVarsAndIncrement(gRamSaveSectorLocations);\n    return FALSE;\n}\n\nbool8 LinkFullSave_WriteSector(void) \n{\n    u8 status = HandleWriteIncrementalSector(NUM_SECTORS_PER_SLOT, gRamSaveSectorLocations);\n    if (gDamagedSaveSectors)\n        DoSaveFailedScreen(SAVE_NORMAL);\n\n    if (status == SAVE_STATUS_ERROR)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 LinkFullSave_ReplaceLastSector(void)\n{\n    HandleReplaceSectorAndVerify(NUM_SECTORS_PER_SLOT, gRamSaveSectorLocations);\n    if (gDamagedSaveSectors)\n        DoSaveFailedScreen(SAVE_NORMAL);\n\n    return FALSE;\n}\n\nbool8 LinkFullSave_SetLastSectorSignature(void)\n{\n    CopySectorSignatureByte(NUM_SECTORS_PER_SLOT, gRamSaveSectorLocations);\n    if (gDamagedSaveSectors)\n        DoSaveFailedScreen(SAVE_NORMAL);\n\n    return FALSE;\n}\n\nbool8 WriteSaveBlock2(void)\n{\n    if (gFlashMemoryPresent != TRUE)\n        return TRUE;\n\n    UpdateSaveAddresses();\n    SaveSerializedGame();\n    RestoreSaveBackupVars(gRamSaveSectorLocations);\n\n    // Because RestoreSaveBackupVars is called immediately prior,\n    // gIncrementalSectorId will always be 0 (SECTOR_ID_SAVEBLOCK2) at this point,\n    // so this function only saves the first sector (SECTOR_ID_SAVEBLOCK2)\n    HandleReplaceSectorAndVerify(gIncrementalSectorId + 1, gRamSaveSectorLocations);\n    return FALSE;\n}\n\n// Used in conjunction with WriteSaveBlock2 to write both for certain link saves.\n// This is called repeatedly in a task, writing one sector of SaveBlock1 each time it is called.\n// Returns TRUE when all sectors of SaveBlock1 have been written.\nbool8 WriteSaveBlock1Sector(void)\n{\n    u8 finished = FALSE;\n    u16 sectorId = ++gIncrementalSectorId;\n    if (sectorId <= SECTOR_ID_SAVEBLOCK1_END)\n    {\n        HandleReplaceSectorAndVerify(gIncrementalSectorId + 1, gRamSaveSectorLocations);\n        WriteSectorSignatureByte(sectorId, gRamSaveSectorLocations);\n    }\n    else\n    {\n        WriteSectorSignatureByte(sectorId, gRamSaveSectorLocations);\n        finished = TRUE;\n    }\n    if (gDamagedSaveSectors)\n        DoSaveFailedScreen(SAVE_LINK);\n\n    return finished;\n}\n\nu8 LoadGameSave(u8 saveType)\n{\n    u8 result;\n\n    if (gFlashMemoryPresent != TRUE)\n    {\n        gSaveFileStatus = SAVE_STATUS_NO_FLASH;\n        return SAVE_STATUS_ERROR;\n    }\n\n    UpdateSaveAddresses();\n    switch (saveType)\n    {\n    case SAVE_NORMAL:\n    default:\n        result = TryLoadSaveSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations);\n        LoadSerializedGame();\n        gSaveFileStatus = result;\n        gGameContinueCallback = NULL;\n        break;\n    case SAVE_HALL_OF_FAME:\n        result = TryLoadSaveSector(SECTOR_ID_HOF_1, gDecompressionBuffer, SECTOR_DATA_SIZE);\n        if (result == SAVE_STATUS_OK)\n            result = TryLoadSaveSector(SECTOR_ID_HOF_2, gDecompressionBuffer + SECTOR_DATA_SIZE, SECTOR_DATA_SIZE);\n        break;\n    }\n\n    return result;\n}\n\nu32 TryReadSpecialSaveSector(u8 sectorId, u8 *dst)\n{\n    s32 i;\n    s32 size;\n    u8 *savData;\n\n    if (sectorId != SECTOR_ID_TRAINER_TOWER_1 && sectorId != SECTOR_ID_TRAINER_TOWER_2)\n        return SAVE_STATUS_ERROR;\n\n    ReadFlash(sectorId, 0, (u8 *)&gSaveDataBuffer, SECTOR_SIZE);\n    if (*(u32 *)(&gSaveDataBuffer.data[0]) != SPECIAL_SECTOR_SENTINEL)\n        return SAVE_STATUS_ERROR;\n\n    // copies whole save sector except the counter field\n    i = 0;\n    size = SECTOR_COUNTER_OFFSET - 1;\n    savData = &gSaveDataBuffer.data[4]; // to skip past SPECIAL_SECTOR_SENTINEL\n    for (; i <= size; i++)\n        dst[i] = savData[i];\n\n    return SAVE_STATUS_OK;\n}\n\nu32 TryWriteSpecialSaveSector(u8 sector, u8 *src)\n{\n    s32 i;\n    s32 size;\n    u8 *savData;\n    void *savDataBuffer;\n\n    if (sector != SECTOR_ID_TRAINER_TOWER_1 && sector != SECTOR_ID_TRAINER_TOWER_2)\n        return SAVE_STATUS_ERROR;\n\n    savDataBuffer = &gSaveDataBuffer;\n    *(u32 *)(savDataBuffer) = SPECIAL_SECTOR_SENTINEL;\n\n    // copies whole save sector except the counter field\n    i = 0;\n    size = SECTOR_COUNTER_OFFSET - 1;\n    savData = &gSaveDataBuffer.data[4]; // to skip past SPECIAL_SECTOR_SENTINEL\n    for (; i <= size; i++)\n        savData[i] = src[i];\n\n    if (ProgramFlashSectorAndVerify(sector, savDataBuffer) != 0)\n        return SAVE_STATUS_ERROR;\n\n    return SAVE_STATUS_OK;\n}\n\nvoid Task_LinkFullSave(u8 taskId)\n{\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        gSoftResetDisabled = TRUE;\n        gTasks[taskId].data[0] = 1;\n        break;\n    case 1:\n        SetLinkStandbyCallback();\n        gTasks[taskId].data[0] = 2;\n        break;\n    case 2:\n        if (IsLinkTaskFinished())\n        {\n            SaveMapView();\n            gTasks[taskId].data[0] = 3;\n        }\n        break;\n    case 3:\n        SetContinueGameWarpStatusToDynamicWarp();\n        LinkFullSave_Init();\n        gTasks[taskId].data[0] = 4;\n        break;\n    case 4:\n        if (++gTasks[taskId].data[1] == 5)\n        {\n            gTasks[taskId].data[1] = 0;\n            gTasks[taskId].data[0] = 5;\n        }\n        break;\n    case 5:\n        if (LinkFullSave_WriteSector())\n            gTasks[taskId].data[0] = 6;\n        else\n            gTasks[taskId].data[0] = 4;\n        break;\n    case 6:\n        LinkFullSave_ReplaceLastSector();\n        gTasks[taskId].data[0] = 7;\n        break;\n    case 7:\n        ClearContinueGameWarpStatus2();\n        SetLinkStandbyCallback();\n        gTasks[taskId].data[0] = 8;\n        break;\n    case 8:\n        if (IsLinkTaskFinished())\n        {\n            LinkFullSave_SetLastSectorSignature();\n            gTasks[taskId].data[0] = 9;\n        }\n        break;\n    case 9:\n        SetLinkStandbyCallback();\n        gTasks[taskId].data[0] = 10;\n        break;\n    case 10:\n        if (IsLinkTaskFinished())\n            gTasks[taskId].data[0]++;\n        break;\n    case 11:\n        if (++gTasks[taskId].data[1] > 5)\n        {\n            gSoftResetDisabled = FALSE;\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n"
  },
  {
    "path": "src/save_failed_screen.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"gba/flash_internal.h\"\n#include \"help_system.h\"\n#include \"m4a.h\"\n#include \"save.h\"\n#include \"strings.h\"\n\nbool32 sIsInSaveFailedScreen;\n\nstatic EWRAM_DATA u16 sSaveType = SAVE_NORMAL;\nstatic EWRAM_DATA u16 sUnused = 0;\nstatic EWRAM_DATA u8 sSaveFailedScreenState = 0;\n\nstatic void BlankPalettes(void);\nstatic void UpdateMapBufferWithText(void);\nstatic void ClearMapBuffer(void);\nstatic void PrintTextOnSaveFailedScreen(const u8 *a0);\nstatic bool32 TryWipeDamagedSectors(void);\nstatic bool32 WipeDamagedSectors(u32 damagedSectors);\n\nstatic const u16 sSaveFailedScreenPals[] = INCBIN_U16(\"graphics/interface/save_failed_screen.gbapal\");\n\nvoid SetNotInSaveFailedScreen(void)\n{\n    sIsInSaveFailedScreen = FALSE;\n}\n\nvoid DoSaveFailedScreen(u8 saveType)\n{\n    sSaveType = saveType;\n    sIsInSaveFailedScreen = TRUE;\n}\n\nbool32 RunSaveFailedScreen(void)\n{\n    switch (sSaveFailedScreenState)\n    {\n    case 0:\n        if (!sIsInSaveFailedScreen)\n            return FALSE;\n        m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 128);\n        SaveCallbacks();\n        sSaveFailedScreenState = 1;\n        break;\n    case 1:\n        SaveMapTiles();\n        SaveMapGPURegs();\n        SaveMapTextColors();\n        BlankPalettes();\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        sSaveFailedScreenState = 2;\n        break;\n    case 2:\n        RequestDma3Fill(0, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT);\n        RequestDma3Copy(sSaveFailedScreenPals, (void *)PLTT, 0x20, DMA3_16BIT);\n        sSaveFailedScreenState = 3;\n        break;\n    case 3:\n        ClearMapBuffer();\n        PrintTextOnSaveFailedScreen(gText_SaveFailedCheckingBackup);\n        UpdateMapBufferWithText();\n        sSaveFailedScreenState = 4;\n        break;\n    case 4:\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n        SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n        SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(31));\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON);\n        sSaveFailedScreenState = 5;\n        break;\n    case 5:\n        if (TryWipeDamagedSectors() == TRUE)\n        {\n            gSaveAttemptStatus = SAVE_STATUS_OK;\n            PrintTextOnSaveFailedScreen(gText_SaveCompletePressA);\n        }\n        else\n        {\n            gSaveAttemptStatus = SAVE_STATUS_ERROR;\n            PrintTextOnSaveFailedScreen(gText_BackupMemoryDamaged);\n        }\n        sSaveFailedScreenState = 6;\n        break;\n    case 6:\n        if (JOY_NEW(A_BUTTON))\n            sSaveFailedScreenState = 7;\n        break;\n    case 7:\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        RestoreMapTiles();\n        BlankPalettes();\n        sSaveFailedScreenState = 8;\n        break;\n    case 8:\n        m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256);\n        RestoreMapTextColors();\n        RestoreGPURegs();\n        RestoreCallbacks();\n        sIsInSaveFailedScreen = FALSE;\n        sSaveFailedScreenState = 0;\n        break;\n    }\n    return TRUE;\n}\n\nstatic void BlankPalettes(void)\n{\n    int i;\n    for (i = 0; i < BG_PLTT_SIZE; i += sizeof(u16))\n    {\n        *((u16 *)(BG_PLTT + i)) = RGB_BLACK;\n        *((u16 *)(OBJ_PLTT + i)) = RGB_BLACK;\n    }\n}\n\nstatic void RequestDmaCopyFromScreenBuffer(void)\n{\n    RequestDma3Copy(gDecompressionBuffer + 0x3800, (void *)BG_SCREEN_ADDR(31), 0x500, DMA3_16BIT);\n}\n\nstatic void RequestDmaCopyFromCharBuffer(void)\n{\n    RequestDma3Copy(gDecompressionBuffer + 0x020, (void *)BG_CHAR_ADDR(3) + 0x20, 0x2300, DMA3_16BIT);\n}\n\nstatic void FillBgMapBufferRect(u16 baseBlock, u8 left, u8 top, u8 width, u8 height, u16 blockOffset)\n{\n    u16 i, j;\n\n    for (i = top; i < top + height; i++)\n    {\n        for (j = left; j < left + width; j++)\n        {\n            *((u16 *)(gDecompressionBuffer + 0x3800 + 64 * i + 2 * j)) = baseBlock;\n            baseBlock += blockOffset;\n        }\n    }\n    RequestDmaCopyFromScreenBuffer();\n}\n\nstatic void UpdateMapBufferWithText(void)\n{\n    FillBgMapBufferRect(0x001, 1, 5, 28, 10, 0x001);\n}\n\nstatic void ClearMapBuffer(void)\n{\n    FillBgMapBufferRect(0x000, 0, 0, 30, 20, 0x000);\n}\n\nstatic void PrintTextOnSaveFailedScreen(const u8 *str)\n{\n    GenerateFontHalfRowLookupTable(TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n    CpuFill16(PIXEL_FILL(1) | (PIXEL_FILL(1) << 8), gDecompressionBuffer + 0x20, 0x2300);\n    HelpSystemRenderText(2, gDecompressionBuffer + 0x20, str, 2, 2, 28, 10);\n    RequestDmaCopyFromCharBuffer();\n}\n\nstatic bool32 TryWipeDamagedSectors(void)\n{\n    int i = 0;\n    for (i = 0; gDamagedSaveSectors != 0 && i < 3; i++)\n    {\n        if (WipeDamagedSectors(gDamagedSaveSectors))\n            return FALSE;\n        HandleSavingData(sSaveType);\n    }\n    if (gDamagedSaveSectors != 0)\n        return FALSE;\n    return TRUE;\n}\n\nstatic bool16 VerifySectorWipe(u32 sector)\n{\n    u16 sector0 = sector;\n    u32 i;\n    u32 *saveDataBuffer = (void *)&gSaveDataBuffer;\n    ReadFlash(sector0, 0, saveDataBuffer, 0x1000);\n    for (i = 0; i < 0x1000 / sizeof(u32); i++, saveDataBuffer++)\n    {\n        if (*saveDataBuffer != 0)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool32 WipeSector(u32 sector)\n{\n    bool32 result;\n    u16 i, j;\n\n    i = 0;\n    while (i < 130)\n    {\n        for (j = 0; j < 0x1000; j++)\n        {\n            ProgramFlashByte(sector, j, 0);\n        }\n        result = VerifySectorWipe(sector);\n        i++;\n        if (!result)\n            break;\n    }\n\n    return result;\n}\n\nstatic bool32 WipeDamagedSectors(u32 damagedSectors)\n{\n    int i;\n    for (i = 0; i < 32; i++)\n    {\n        if (damagedSectors & (1 << i))\n        {\n            if (!WipeSector(i))\n            {\n                damagedSectors &= ~(1 << i);\n            }\n        }\n    }\n    if (damagedSectors == 0)\n        return FALSE;\n    else\n        return TRUE;\n}\n"
  },
  {
    "path": "src/save_location.c",
    "content": "#include \"event_data.h\"\n#include \"global.h\"\n#include \"save_location.h\"\n#include \"constants/maps.h\"\n#include \"constants/vars.h\"\n\nstatic bool32 IsCurMapInLocationList(const u16 *list)\n{\n    s32 i;\n    u16 locSum = (gSaveBlock1Ptr->location.mapGroup << 8) + (gSaveBlock1Ptr->location.mapNum);\n\n    for (i = 0; list[i] != MAP_UNDEFINED; i++)\n    {\n        if (list[i] == locSum)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic const u16 sSaveLocationPokeCenterList[] = \n{\n    MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F, MAP_VIRIDIAN_CITY_POKEMON_CENTER_2F,\n    MAP_PEWTER_CITY_POKEMON_CENTER_1F, MAP_PEWTER_CITY_POKEMON_CENTER_2F,\n    MAP_CERULEAN_CITY_POKEMON_CENTER_1F, MAP_CERULEAN_CITY_POKEMON_CENTER_2F,\n    MAP_LAVENDER_TOWN_POKEMON_CENTER_1F, MAP_LAVENDER_TOWN_POKEMON_CENTER_2F,\n    MAP_VERMILION_CITY_POKEMON_CENTER_1F, MAP_VERMILION_CITY_POKEMON_CENTER_2F,\n    MAP_CELADON_CITY_POKEMON_CENTER_1F, MAP_CELADON_CITY_POKEMON_CENTER_2F,\n    MAP_FUCHSIA_CITY_POKEMON_CENTER_1F, MAP_FUCHSIA_CITY_POKEMON_CENTER_2F,\n    MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F, MAP_CINNABAR_ISLAND_POKEMON_CENTER_2F,\n    MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F, MAP_INDIGO_PLATEAU_POKEMON_CENTER_2F,\n    MAP_SAFFRON_CITY_POKEMON_CENTER_1F, MAP_SAFFRON_CITY_POKEMON_CENTER_2F,\n    MAP_ROUTE4_POKEMON_CENTER_1F, MAP_ROUTE4_POKEMON_CENTER_2F,\n    MAP_ROUTE10_POKEMON_CENTER_1F, MAP_ROUTE10_POKEMON_CENTER_2F,\n    MAP_ONE_ISLAND_POKEMON_CENTER_1F, MAP_ONE_ISLAND_POKEMON_CENTER_2F,\n    MAP_TWO_ISLAND_POKEMON_CENTER_1F, MAP_TWO_ISLAND_POKEMON_CENTER_2F,\n    MAP_THREE_ISLAND_POKEMON_CENTER_1F, MAP_THREE_ISLAND_POKEMON_CENTER_2F,\n    MAP_FOUR_ISLAND_POKEMON_CENTER_1F, MAP_FOUR_ISLAND_POKEMON_CENTER_2F,\n    MAP_FIVE_ISLAND_POKEMON_CENTER_1F, MAP_FIVE_ISLAND_POKEMON_CENTER_2F,\n    MAP_SEVEN_ISLAND_POKEMON_CENTER_1F, MAP_SEVEN_ISLAND_POKEMON_CENTER_2F, \n    MAP_SIX_ISLAND_POKEMON_CENTER_1F, MAP_SIX_ISLAND_POKEMON_CENTER_2F,\n    MAP_BATTLE_COLOSSEUM_2P, \n    MAP_TRADE_CENTER,\n    MAP_BATTLE_COLOSSEUM_4P, \n    MAP_UNION_ROOM,\n    MAP_UNDEFINED,\n};\n\nbool32 IsCurMapPokeCenter(void)\n{\n    return IsCurMapInLocationList(sSaveLocationPokeCenterList);\n}\n\nstatic const u16 sSaveLocationReloadLocList[] = { MAP_UNDEFINED };\n\nstatic bool32 IsCurMapReloadLocation(void)\n{\n    return IsCurMapInLocationList(sSaveLocationReloadLocList);\n}\n\n// Nulled out list. Unknown what this would have been.\nstatic const u16 sEmptyMapList[] = { MAP_UNDEFINED };\n\nstatic bool32 IsCurMapInEmptyList(void)\n{\n    return IsCurMapInLocationList(sEmptyMapList);\n}\n\nstatic void TrySetPokeCenterWarpStatus(void)\n{\n    if (IsCurMapPokeCenter() == FALSE)\n        gSaveBlock2Ptr->specialSaveWarpFlags &= ~(POKECENTER_SAVEWARP);\n    else\n        gSaveBlock2Ptr->specialSaveWarpFlags |= POKECENTER_SAVEWARP;\n}\n\nstatic void TrySetReloadWarpStatus(void)\n{\n    if (!IsCurMapReloadLocation())\n        gSaveBlock2Ptr->specialSaveWarpFlags &= ~(LOBBY_SAVEWARP);\n    else\n        gSaveBlock2Ptr->specialSaveWarpFlags |= LOBBY_SAVEWARP;\n}\n\n// Unknown save warp flag. Never set because map list is empty.\nstatic void TrySetUnknownWarpStatus(void)\n{\n    if (!IsCurMapInEmptyList())\n        gSaveBlock2Ptr->specialSaveWarpFlags &= ~(UNK_SPECIAL_SAVE_WARP_FLAG_3);\n    else\n        gSaveBlock2Ptr->specialSaveWarpFlags |= UNK_SPECIAL_SAVE_WARP_FLAG_3;\n}\n\nvoid TrySetMapSaveWarpStatus(void)\n{\n    TrySetPokeCenterWarpStatus();\n    TrySetReloadWarpStatus();\n    TrySetUnknownWarpStatus();\n}\n\nvoid SetUnlockedPokedexFlags(void)\n{\n    // National Dex enable stuff minus the actual flag\n    u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);\n    gSaveBlock2Ptr->pokedex.nationalMagic = 0xB9;\n    *nationalDexVar = 0x6258;\n\n    gSaveBlock2Ptr->gcnLinkFlags |= (1 << 0);\n    gSaveBlock2Ptr->gcnLinkFlags |= (1 << 4);\n    gSaveBlock2Ptr->gcnLinkFlags |= (1 << 5);\n\n    //Allows for trading with all\n    SetPostgameFlags();\n}\n\nvoid SetPostgameFlags(void)\n{\n    gSaveBlock2Ptr->specialSaveWarpFlags |= CHAMPION_SAVEWARP;\n    gSaveBlock2Ptr->gcnLinkFlags |= (1 << 1);\n    gSaveBlock2Ptr->gcnLinkFlags |= (1 << 2);\n    gSaveBlock2Ptr->gcnLinkFlags |= (1 << 3);\n    gSaveBlock2Ptr->gcnLinkFlags |= (1 << 15);\n}\n"
  },
  {
    "path": "src/save_menu_util.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"event_data.h\"\n#include \"pokedex.h\"\n#include \"region_map.h\"\n#include \"save_menu_util.h\"\n#include \"strings.h\"\n#include \"constants/flags.h\"\n#include \"constants/maps.h\"\n#include \"constants/map_groups.h\"\n#include \"constants/map_types.h\"\n#include \"constants/region_map_sections.h\"\n\nvoid SaveStatToString(u8 gameStatId, u8 *dest0, u8 color)\n{\n    int nBadges;\n    int flagId;\n\n    u8 *dest = dest0;\n    *dest++ = EXT_CTRL_CODE_BEGIN;\n    *dest++ = EXT_CTRL_CODE_COLOR;\n    *dest++ = color;\n    *dest++ = EXT_CTRL_CODE_BEGIN;\n    *dest++ = EXT_CTRL_CODE_SHADOW;\n    *dest++ = color + 1;\n    switch (gameStatId)\n    {\n    case SAVE_STAT_NAME:\n        dest = StringCopy(dest, gSaveBlock2Ptr->playerName);\n        break;\n    case SAVE_STAT_POKEDEX:\n        if (IsNationalPokedexEnabled())\n            dest = ConvertIntToDecimalStringN(dest, GetNationalPokedexCount(1), STR_CONV_MODE_LEFT_ALIGN, 3);\n        else\n            dest = ConvertIntToDecimalStringN(dest, GetKantoPokedexCount(1), STR_CONV_MODE_LEFT_ALIGN, 3);\n        break;\n    case SAVE_STAT_TIME:\n        dest = ConvertIntToDecimalStringN(dest, gSaveBlock2Ptr->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);\n        *dest++ = CHAR_COLON;\n        dest = ConvertIntToDecimalStringN(dest, gSaveBlock2Ptr->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);\n        break;\n    case SAVE_STAT_TIME_HR_RT_ALIGN:\n        dest = ConvertIntToDecimalStringN(dest, gSaveBlock2Ptr->playTimeHours, STR_CONV_MODE_RIGHT_ALIGN, 3);\n        *dest++ = CHAR_COLON;\n        dest = ConvertIntToDecimalStringN(dest, gSaveBlock2Ptr->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);\n        break;\n    case SAVE_STAT_LOCATION:\n        GetMapNameGeneric(dest, gMapHeader.regionMapSectionId);\n        if(gMapHeader.mapType == MAP_TYPE_UNDERWATER)\n        {\n            GetMapNameGeneric(dest, MAPSEC_UNDERWATER_124);\n        }\n        else if(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(RS_BATTLE_TOWER) && (gSaveBlock1Ptr->location.mapNum >= MAP_NUM(RS_BATTLE_TOWER)\n        && gSaveBlock1Ptr->location.mapNum <= MAP_NUM(RS_BATTLE_TOWER_BATTLE_ROOM))) //overwrite Battle Frontier name\n        {\n            dest = StringCopy(dest, gText_BattleTower);\n        }\n        break;\n    case SAVE_STAT_BADGES:\n        for (flagId = FLAG_BADGE01_GET, nBadges = 0; flagId < FLAG_BADGE01_GET + 8; flagId++)\n        {\n            if (FlagGet(flagId))\n                nBadges++;\n        }\n        *dest++ = nBadges + CHAR_0;\n        *dest++ = 10; // 'こ'\n        *dest++ = EOS;\n        break;\n    }\n}\n\n"
  },
  {
    "path": "src/scanline_effect.c",
    "content": "#include \"global.h\"\n#include \"task.h\"\n#include \"trig.h\"\n#include \"scanline_effect.h\"\n\nextern u16 gBattle_BG0_X;\nextern u16 gBattle_BG0_Y;\nextern u16 gBattle_BG1_X;\nextern u16 gBattle_BG1_Y;\nextern u16 gBattle_BG2_X;\nextern u16 gBattle_BG2_Y;\nextern u16 gBattle_BG3_X;\nextern u16 gBattle_BG3_Y;\n\nstatic void CopyValue16Bit(void);\nstatic void CopyValue32Bit(void);\n\n// EWRAM vars\n\n// Per-scanline register values.\n// This is double buffered so that it can be safely written to at any time\n// without overwriting the buffer that the DMA is currently reading\nEWRAM_DATA u16 gScanlineEffectRegBuffers[2][0x3C0] = {0};\n\nEWRAM_DATA struct ScanlineEffect gScanlineEffect = {0};\nEWRAM_DATA static bool8 sShouldStopWaveTask = FALSE;\n\nvoid ScanlineEffect_Stop(void)\n{\n    gScanlineEffect.state = 0;\n    DmaStop(0);\n    if (gScanlineEffect.waveTaskId != 0xFF)\n    {\n        DestroyTask(gScanlineEffect.waveTaskId);\n        gScanlineEffect.waveTaskId = 0xFF;\n    }\n}\n\nvoid ScanlineEffect_Clear(void)\n{\n    CpuFill16(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers));\n    gScanlineEffect.dmaSrcBuffers[0] = NULL;\n    gScanlineEffect.dmaSrcBuffers[1] = NULL;\n    gScanlineEffect.dmaDest = NULL;\n    gScanlineEffect.dmaControl = 0;\n    gScanlineEffect.srcBuffer = 0;\n    gScanlineEffect.state = 0;\n    gScanlineEffect.unused16 = 0;\n    gScanlineEffect.unused17 = 0;\n    gScanlineEffect.waveTaskId = 0xFF;\n}\n\nvoid ScanlineEffect_SetParams(struct ScanlineEffectParams params)\n{\n    if (params.dmaControl == SCANLINE_EFFECT_DMACNT_16BIT)  // 16-bit\n    {\n        // Set the DMA src to the value for the second scanline because the\n        // first DMA transfer occurs in HBlank *after* the first scanline is drawn\n        gScanlineEffect.dmaSrcBuffers[0] = (u16 *)gScanlineEffectRegBuffers[0] + 1;\n        gScanlineEffect.dmaSrcBuffers[1] = (u16 *)gScanlineEffectRegBuffers[1] + 1;\n        gScanlineEffect.setFirstScanlineReg = CopyValue16Bit;\n    }\n    else  // assume 32-bit\n    {\n        // Set the DMA src to the value for the second scanline because the\n        // first DMA transfer occurs in HBlank *after* the first scanline is drawn\n        gScanlineEffect.dmaSrcBuffers[0] = (u32 *)gScanlineEffectRegBuffers[0] + 1;\n        gScanlineEffect.dmaSrcBuffers[1] = (u32 *)gScanlineEffectRegBuffers[1] + 1;\n        gScanlineEffect.setFirstScanlineReg = CopyValue32Bit;\n    }\n\n    gScanlineEffect.dmaControl = params.dmaControl;\n    gScanlineEffect.dmaDest    = params.dmaDest;\n    gScanlineEffect.state      = params.initState;\n    gScanlineEffect.unused16   = params.unused9;\n    gScanlineEffect.unused17   = params.unused9;\n}\n\nvoid ScanlineEffect_InitHBlankDmaTransfer(void)\n{\n    if (gScanlineEffect.state == 0)\n    {\n        return;\n    }\n    else if (gScanlineEffect.state == 3)\n    {\n        gScanlineEffect.state = 0;\n        DmaStop(0);\n        sShouldStopWaveTask = TRUE;\n    }\n    else\n    {\n        DmaStop(0);\n        // Set DMA to copy to dest register on each HBlank for the next frame.\n        // The HBlank DMA transfers do not occurr during VBlank, so the transfer\n        // will begin on the HBlank after the first scanline\n        DmaSet(0, gScanlineEffect.dmaSrcBuffers[gScanlineEffect.srcBuffer], gScanlineEffect.dmaDest, gScanlineEffect.dmaControl);\n        // Manually set the reg for the first scanline\n        gScanlineEffect.setFirstScanlineReg();\n        // Swap current buffer\n        gScanlineEffect.srcBuffer ^= 1;\n    }\n}\n\n// These two functions are used to copy the register for the first scanline,\n// depending whether it is a 16-bit register or a 32-bit register.\n\nstatic void CopyValue16Bit(void)\n{\n    u16 *dest = (u16 *)gScanlineEffect.dmaDest;\n    u16 *src = (u16 *)&gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer];\n\n    *dest = *src;\n}\n\nstatic void CopyValue32Bit(void)\n{\n    u32 *dest = (u32 *)gScanlineEffect.dmaDest;\n    u32 *src = (u32 *)&gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer];\n\n    *dest = *src;\n}\n\n#define tStartLine            data[0]\n#define tEndLine              data[1]\n#define tWaveLength           data[2]\n#define tSrcBufferOffset      data[3]\n#define tFramesUntilMove      data[4]\n#define tDelayInterval        data[5]\n#define tRegOffset            data[6]\n#define tApplyBattleBgOffsets data[7]\n\nstatic void TaskFunc_UpdateWavePerFrame(u8 taskId)\n{\n    int value = 0;\n    int i;\n    int offset;\n\n    if (sShouldStopWaveTask)\n    {\n        DestroyTask(taskId);\n        gScanlineEffect.waveTaskId = 0xFF;\n    }\n    else\n    {\n        if (gTasks[taskId].tApplyBattleBgOffsets)\n        {\n            switch (gTasks[taskId].tRegOffset)\n            {\n            case SCANLINE_EFFECT_REG_BG0HOFS:\n                value = gBattle_BG0_X;\n                break;\n            case SCANLINE_EFFECT_REG_BG0VOFS:\n                value = gBattle_BG0_Y;\n                break;\n            case SCANLINE_EFFECT_REG_BG1HOFS:\n                value = gBattle_BG1_X;\n                break;\n            case SCANLINE_EFFECT_REG_BG1VOFS:\n                value = gBattle_BG1_Y;\n                break;\n            case SCANLINE_EFFECT_REG_BG2HOFS:\n                value = gBattle_BG2_X;\n                break;\n            case SCANLINE_EFFECT_REG_BG2VOFS:\n                value = gBattle_BG2_Y;\n                break;\n            case SCANLINE_EFFECT_REG_BG3HOFS:\n                value = gBattle_BG3_X;\n                break;\n            case SCANLINE_EFFECT_REG_BG3VOFS:\n                value = gBattle_BG3_Y;\n                break;\n            }\n        }\n        if (gTasks[taskId].tFramesUntilMove != 0)\n        {\n            gTasks[taskId].tFramesUntilMove--;\n            offset = gTasks[taskId].tSrcBufferOffset + 320;\n            for (i = gTasks[taskId].tStartLine; i < gTasks[taskId].tEndLine; i++)\n            {\n                gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gScanlineEffectRegBuffers[0][offset] + value;\n                offset++;\n            }\n        }\n        else\n        {\n            gTasks[taskId].tFramesUntilMove = gTasks[taskId].tDelayInterval;\n            offset = gTasks[taskId].tSrcBufferOffset + 320;\n            for (i = gTasks[taskId].tStartLine; i < gTasks[taskId].tEndLine; i++)\n            {\n                gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gScanlineEffectRegBuffers[0][offset] + value;\n                offset++;\n            }\n\n            // increment src buffer offset\n            gTasks[taskId].tSrcBufferOffset++;\n            if (gTasks[taskId].tSrcBufferOffset == gTasks[taskId].tWaveLength)\n                gTasks[taskId].tSrcBufferOffset = 0;\n        }\n    }\n}\n\nstatic void GenerateWave(u16 *buffer, u8 frequency, u8 amplitude, u8 unused)\n{\n    u16 i = 0;\n    u8 theta = 0;\n\n    while (i < 256)\n    {\n        buffer[i] = (gSineTable[theta] * amplitude) / 256;\n        theta += frequency;\n        i++;\n    }\n}\n\n// Initializes a background \"wave\" effect that affects scanlines startLine (inclusive) to endLine (exclusive).\n// 'frequency' and 'amplitude' control the frequency and amplitude of the wave.\n// 'delayInterval' controls how fast the wave travels up the screen. The wave will shift upwards one scanline every 'delayInterval'+1 frames.\n// 'regOffset' is the offset of the video register to modify.\nu8 ScanlineEffect_InitWave(u8 startLine, u8 endLine, u8 frequency, u8 amplitude, u8 delayInterval, u8 regOffset, bool8 applyBattleBgOffsets)\n{\n    int i;\n    int offset;\n    struct ScanlineEffectParams params;\n    u8 taskId;\n\n    ScanlineEffect_Clear();\n\n    params.dmaDest = (void *)(REG_ADDR_BG0HOFS + regOffset);\n    params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;\n    params.initState = 1;\n    params.unused9 = 0;\n    ScanlineEffect_SetParams(params);\n\n    taskId = CreateTask(TaskFunc_UpdateWavePerFrame, 0);\n\n    gTasks[taskId].tStartLine            = startLine;\n    gTasks[taskId].tEndLine              = endLine;\n    gTasks[taskId].tWaveLength           = 256 / frequency;\n    gTasks[taskId].tSrcBufferOffset      = 0;\n    gTasks[taskId].tFramesUntilMove      = delayInterval;\n    gTasks[taskId].tDelayInterval        = delayInterval;\n    gTasks[taskId].tRegOffset            = regOffset;\n    gTasks[taskId].tApplyBattleBgOffsets = applyBattleBgOffsets;\n\n    gScanlineEffect.waveTaskId = taskId;\n    sShouldStopWaveTask = FALSE;\n\n    GenerateWave(&gScanlineEffectRegBuffers[0][320], frequency, amplitude, endLine - startLine);\n\n    offset = 320;\n    for (i = startLine; i < endLine; i++)\n    {\n        gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[0][offset];\n        gScanlineEffectRegBuffers[1][i] = gScanlineEffectRegBuffers[0][offset];\n        offset++;\n    }\n\n    return taskId;\n}\n"
  },
  {
    "path": "src/scrcmd.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"script.h\"\n#include \"mystery_event_script.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"random.h\"\n#include \"item.h\"\n#include \"overworld.h\"\n#include \"field_screen_effect.h\"\n#include \"quest_log.h\"\n#include \"map_preview_screen.h\"\n#include \"fieldmap.h\"\n#include \"field_weather.h\"\n#include \"field_tasks.h\"\n#include \"field_fadetransition.h\"\n#include \"field_player_avatar.h\"\n#include \"script_movement.h\"\n#include \"event_object_movement.h\"\n#include \"event_object_lock.h\"\n#include \"field_message_box.h\"\n#include \"new_menu_helpers.h\"\n#include \"script_menu.h\"\n#include \"data.h\"\n#include \"field_specials.h\"\n#include \"constants/items.h\"\n#include \"script_pokemon_util.h\"\n#include \"palette.h\"\n#include \"pokemon_storage_system.h\"\n#include \"party_menu.h\"\n#include \"money.h\"\n#include \"coins.h\"\n#include \"battle_setup.h\"\n#include \"shop.h\"\n#include \"slot_machine.h\"\n#include \"field_effect.h\"\n#include \"fieldmap.h\"\n#include \"field_door.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/maps.h\"\n#include \"constants/sound.h\"\n\nextern u16 (*const gSpecials[])(void);\nextern u16 (*const gSpecialsEnd[])(void);\nextern const u8 *const gStdScripts[];\nextern const u8 *const gStdScriptsEnd[];\n\nstatic bool8 ScriptContext_NextCommandEndsScript(struct ScriptContext * ctx);\nstatic u8 ScriptContext_GetQuestLogInput(struct ScriptContext * ctx);\n\nstatic EWRAM_DATA ptrdiff_t sAddressOffset = 0; // For relative addressing in vgoto etc., used by saved scripts (e.g. Mystery Event)\nstatic EWRAM_DATA u8 sQuestLogWaitButtonPressTimer = 0;\nstatic EWRAM_DATA u16 sPauseCounter = 0;\nstatic EWRAM_DATA u16 sMovingNpcId = 0;\nstatic EWRAM_DATA u16 sMovingNpcMapGroup = 0;\nstatic EWRAM_DATA u16 sMovingNpcMapNum = 0;\nstatic EWRAM_DATA u16 sFieldEffectScriptId = 0;\n\nstruct ScriptContext * sQuestLogScriptContextPtr;\nu8 gSelectedObjectEvent;\n\n// This is defined in here so the optimizer can't see its value when compiling\n// script.c.\nvoid *const gNullScriptPtr = NULL;\n\nstatic const u8 sScriptConditionTable[6][3] =\n{\n//  <  =  >\n    1, 0, 0, // <\n    0, 1, 0, // =\n    0, 0, 1, // >\n    1, 1, 0, // <=\n    0, 1, 1, // >=\n    1, 0, 1, // !=\n};\n\nbool8 ScrCmd_nop(struct ScriptContext * ctx)\n{\n    return FALSE;\n}\n\nbool8 ScrCmd_nop1(struct ScriptContext * ctx)\n{\n    return FALSE;\n}\n\nbool8 ScrCmd_end(struct ScriptContext * ctx)\n{\n    StopScript(ctx);\n    return FALSE;\n}\n\nbool8 ScrCmd_gotonative(struct ScriptContext * ctx)\n{\n    bool8 (*func)(void) = (bool8 (*)(void))ScriptReadWord(ctx);\n    SetupNativeScript(ctx, func);\n    return TRUE;\n}\n\nbool8 ScrCmd_special(struct ScriptContext * ctx)\n{\n    u16 (*const *specialPtr)(void) = &gSpecials[ScriptReadHalfword(ctx)];\n    if (specialPtr < gSpecialsEnd)\n        (*specialPtr)();\n    else\n        AGB_ASSERT_EX(0, ABSPATH(\"scrcmd.c\"), 241);\n    return FALSE;\n}\n\nbool8 ScrCmd_specialvar(struct ScriptContext * ctx)\n{\n    u16 * varPtr = GetVarPointer(ScriptReadHalfword(ctx));\n    u16 (*const *specialPtr)(void) = &gSpecials[ScriptReadHalfword(ctx)];\n    if (specialPtr < gSpecialsEnd)\n        *varPtr = (*specialPtr)();\n    else\n        AGB_ASSERT_EX(0, ABSPATH(\"scrcmd.c\"), 263);\n    return FALSE;\n}\n\nbool8 ScrCmd_callnative(struct ScriptContext * ctx)\n{\n    void (*func )(void) = ((void (*)(void))ScriptReadWord(ctx));\n    func();\n    return FALSE;\n}\n\nbool8 ScrCmd_waitstate(struct ScriptContext * ctx)\n{\n    ScriptContext_Stop();\n    return TRUE;\n}\n\nbool8 ScrCmd_goto(struct ScriptContext * ctx)\n{\n    const u8 * scrptr = (const u8 *)ScriptReadWord(ctx);\n    ScriptJump(ctx, scrptr);\n    return FALSE;\n}\n\nbool8 ScrCmd_return(struct ScriptContext * ctx)\n{\n    ScriptReturn(ctx);\n    return FALSE;\n}\n\nbool8 ScrCmd_call(struct ScriptContext * ctx)\n{\n    const u8 * scrptr = (const u8 *)ScriptReadWord(ctx);\n    ScriptCall(ctx, scrptr);\n    return FALSE;\n}\n\nbool8 ScrCmd_goto_if(struct ScriptContext * ctx)\n{\n    u8 condition = ScriptReadByte(ctx);\n    const u8 * scrptr = (const u8 *)ScriptReadWord(ctx);\n    if (sScriptConditionTable[condition][ctx->comparisonResult] == 1)\n        ScriptJump(ctx, scrptr);\n    return FALSE;\n}\n\nbool8 ScrCmd_call_if(struct ScriptContext * ctx)\n{\n    u8 condition = ScriptReadByte(ctx);\n    const u8 * scrptr = (const u8 *)ScriptReadWord(ctx);\n    if (sScriptConditionTable[condition][ctx->comparisonResult] == 1)\n        ScriptCall(ctx, scrptr);\n    return FALSE;\n}\n\nbool8 ScrCmd_setvaddress(struct ScriptContext * ctx)\n{\n    u32 addr1 = (u32)ctx->scriptPtr - 1;\n    u32 addr2 = ScriptReadWord(ctx);\n\n    sAddressOffset = addr2 - addr1;\n    return FALSE;\n}\n\nbool8 ScrCmd_vgoto(struct ScriptContext * ctx)\n{\n    const u8 * scrptr = (const u8 *)ScriptReadWord(ctx);\n    ScriptJump(ctx, scrptr - sAddressOffset);\n    return FALSE;\n}\n\nbool8 ScrCmd_vcall(struct ScriptContext * ctx)\n{\n    const u8 * scrptr = (const u8 *)ScriptReadWord(ctx);\n    ScriptCall(ctx, scrptr - sAddressOffset);\n    return FALSE;\n}\n\nbool8 ScrCmd_vgoto_if(struct ScriptContext * ctx)\n{\n    u8 condition = ScriptReadByte(ctx);\n    const u8 * scrptr = (const u8 *)ScriptReadWord(ctx) - sAddressOffset;\n    if (sScriptConditionTable[condition][ctx->comparisonResult] == 1)\n        ScriptJump(ctx, scrptr);\n    return FALSE;\n}\n\nbool8 ScrCmd_vcall_if(struct ScriptContext * ctx)\n{\n    u8 condition = ScriptReadByte(ctx);\n    const u8 * scrptr = (const u8 *)ScriptReadWord(ctx) - sAddressOffset;\n    if (sScriptConditionTable[condition][ctx->comparisonResult] == 1)\n        ScriptCall(ctx, scrptr);\n    return FALSE;\n}\n\nbool8 ScrCmd_gotostd(struct ScriptContext * ctx)\n{\n    u8 stdIdx = ScriptReadByte(ctx);\n    const u8 *const * script = &gStdScripts[stdIdx];\n    if (script < gStdScriptsEnd)\n        ScriptJump(ctx, *script);\n    return FALSE;\n}\n\nbool8 ScrCmd_callstd(struct ScriptContext * ctx)\n{\n    u8 stdIdx = ScriptReadByte(ctx);\n    const u8 *const * script = &gStdScripts[stdIdx];\n    if (script < gStdScriptsEnd)\n        ScriptCall(ctx, *script);\n    return FALSE;\n}\n\nbool8 ScrCmd_gotostd_if(struct ScriptContext * ctx)\n{\n    u8 condition = ScriptReadByte(ctx);\n    u8 stdIdx = ScriptReadByte(ctx);\n    if (sScriptConditionTable[condition][ctx->comparisonResult] == 1)\n    {\n        const u8 *const * script = gStdScripts + stdIdx;\n        if (script < gStdScriptsEnd)\n            ScriptJump(ctx, *script);\n    }\n    return FALSE;\n}\n\nbool8 ScrCmd_callstd_if(struct ScriptContext * ctx)\n{\n    u8 condition = ScriptReadByte(ctx);\n    u8 stdIdx = ScriptReadByte(ctx);\n    if (sScriptConditionTable[condition][ctx->comparisonResult] == 1)\n    {\n        const u8 *const * script = gStdScripts + stdIdx;\n        if (script < gStdScriptsEnd)\n            ScriptCall(ctx, *script);\n    }\n    return FALSE;\n}\n\nbool8 ScrCmd_returnram(struct ScriptContext * ctx)\n{\n    ScriptJump(ctx, gRamScriptRetAddr);\n    return FALSE;\n}\n\nbool8 ScrCmd_endram(struct ScriptContext * ctx)\n{\n    ClearRamScript();\n    StopScript(ctx);\n    return TRUE;\n}\n\nbool8 ScrCmd_setmysteryeventstatus(struct ScriptContext * ctx)\n{\n    SetMysteryEventScriptStatus(ScriptReadByte(ctx));\n    return FALSE;\n}\n\nbool8 ScrCmd_trywondercardscript(struct ScriptContext * ctx)\n{\n    const u8 * script = GetSavedRamScriptIfValid();\n    if (script != NULL)\n    {\n        gRamScriptRetAddr = ctx->scriptPtr;\n        ScriptJump(ctx, script);\n    }\n    return FALSE;\n}\n\nbool8 ScrCmd_loadword(struct ScriptContext * ctx)\n{\n    u8 index = ScriptReadByte(ctx);\n    ctx->data[index] = ScriptReadWord(ctx);\n    return FALSE;\n}\n\nbool8 ScrCmd_loadbytefromptr(struct ScriptContext * ctx)\n{\n    u8 index = ScriptReadByte(ctx);\n    ctx->data[index] = *(const u8 *)ScriptReadWord(ctx);\n    return FALSE;\n}\n\nbool8 ScrCmd_setptr(struct ScriptContext * ctx)\n{\n    u8 value = ScriptReadByte(ctx);\n    *(u8 *)ScriptReadWord(ctx) = value;\n    return FALSE;\n}\n\nbool8 ScrCmd_loadbyte(struct ScriptContext * ctx)\n{\n    u8 index = ScriptReadByte(ctx);\n    ctx->data[index] = ScriptReadByte(ctx);\n    return FALSE;\n}\n\nbool8 ScrCmd_setptrbyte(struct ScriptContext * ctx)\n{\n    u8 index = ScriptReadByte(ctx);\n    *(u8 *)ScriptReadWord(ctx) = ctx->data[index];\n    return FALSE;\n}\n\nbool8 ScrCmd_copylocal(struct ScriptContext * ctx)\n{\n    u8 destIndex = ScriptReadByte(ctx);\n    u8 srcIndex = ScriptReadByte(ctx);\n    ctx->data[destIndex] = ctx->data[srcIndex];\n    return FALSE;\n}\n\nbool8 ScrCmd_copybyte(struct ScriptContext * ctx)\n{\n    u8 * dest = (u8 *)ScriptReadWord(ctx);\n    *dest = *(const u8 *)ScriptReadWord(ctx);\n    return FALSE;\n}\n\nbool8 ScrCmd_setvar(struct ScriptContext * ctx)\n{\n    u16 * varPtr = GetVarPointer(ScriptReadHalfword(ctx));\n    *varPtr = ScriptReadHalfword(ctx);\n    return FALSE;\n}\n\nbool8 ScrCmd_copyvar(struct ScriptContext * ctx)\n{\n    u16 * destPtr = GetVarPointer(ScriptReadHalfword(ctx));\n    u16 * srcPtr = GetVarPointer(ScriptReadHalfword(ctx));\n    *destPtr = *srcPtr;\n    return FALSE;\n}\n\nbool8 ScrCmd_setorcopyvar(struct ScriptContext * ctx)\n{\n    u16 * destPtr = GetVarPointer(ScriptReadHalfword(ctx));\n    *destPtr = VarGet(ScriptReadHalfword(ctx));\n    return FALSE;\n}\n\nstatic u8 Compare(u16 a, u16 b)\n{\n    if (a < b)\n        return 0;\n    else if (a == b)\n        return 1;\n    else\n        return 2;\n}\n\nbool8 ScrCmd_compare_local_to_local(struct ScriptContext * ctx)\n{\n    const u8 value1 = ctx->data[ScriptReadByte(ctx)];\n    const u8 value2 = ctx->data[ScriptReadByte(ctx)];\n\n    ctx->comparisonResult = Compare(value1, value2);\n    return FALSE;\n}\n\nbool8 ScrCmd_compare_local_to_value(struct ScriptContext * ctx)\n{\n    const u8 value1 = ctx->data[ScriptReadByte(ctx)];\n    const u8 value2 = ScriptReadByte(ctx);\n\n    ctx->comparisonResult = Compare(value1, value2);\n    return FALSE;\n}\n\nbool8 ScrCmd_compare_local_to_ptr(struct ScriptContext * ctx)\n{\n    const u8 value1 = ctx->data[ScriptReadByte(ctx)];\n    const u8 value2 = *(const u8 *)ScriptReadWord(ctx);\n\n    ctx->comparisonResult = Compare(value1, value2);\n    return FALSE;\n}\n\nbool8 ScrCmd_compare_ptr_to_local(struct ScriptContext * ctx)\n{\n    const u8 value1 = *(const u8 *)ScriptReadWord(ctx);\n    const u8 value2 = ctx->data[ScriptReadByte(ctx)];\n\n    ctx->comparisonResult = Compare(value1, value2);\n    return FALSE;\n}\n\nbool8 ScrCmd_compare_ptr_to_value(struct ScriptContext * ctx)\n{\n    const u8 value1 = *(const u8 *)ScriptReadWord(ctx);\n    const u8 value2 = ScriptReadByte(ctx);\n\n    ctx->comparisonResult = Compare(value1, value2);\n    return FALSE;\n}\n\nbool8 ScrCmd_compare_ptr_to_ptr(struct ScriptContext * ctx)\n{\n    const u8 value1 = *(const u8 *)ScriptReadWord(ctx);\n    const u8 value2 = *(const u8 *)ScriptReadWord(ctx);\n\n    ctx->comparisonResult = Compare(value1, value2);\n    return FALSE;\n}\n\nbool8 ScrCmd_compare_var_to_value(struct ScriptContext * ctx)\n{\n    const u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx));\n    const u16 value2 = ScriptReadHalfword(ctx);\n\n    ctx->comparisonResult = Compare(value1, value2);\n    return FALSE;\n}\n\nbool8 ScrCmd_compare_var_to_var(struct ScriptContext * ctx)\n{\n    const u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx));\n    const u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx));\n\n    ctx->comparisonResult = Compare(*ptr1, *ptr2);\n    return FALSE;\n}\n\n// Note: addvar doesn't support adding from a variable in vanilla.\nbool8 ScrCmd_addvar(struct ScriptContext * ctx)\n{\n    u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));\n    *ptr += ScriptReadHalfword(ctx);\n    return FALSE;\n}\n\nbool8 ScrCmd_subvar(struct ScriptContext * ctx)\n{\n    u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));\n    *ptr -= VarGet(ScriptReadHalfword(ctx));\n    return FALSE;\n}\n\nbool8 ScrCmd_random(struct ScriptContext * ctx)\n{\n    u16 max = VarGet(ScriptReadHalfword(ctx));\n\n    gSpecialVar_Result = Random() % max;\n    return FALSE;\n}\n\nbool8 ScrCmd_additem(struct ScriptContext * ctx)\n{\n    u16 itemId = VarGet(ScriptReadHalfword(ctx));\n    u32 quantity = VarGet(ScriptReadHalfword(ctx));\n\n    gSpecialVar_Result = AddBagItem(itemId, (u8)quantity);\n    TrySetObtainedItemQuestLogEvent(itemId);\n    return FALSE;\n}\n\nbool8 ScrCmd_removeitem(struct ScriptContext * ctx)\n{\n    u16 itemId = VarGet(ScriptReadHalfword(ctx));\n    u32 quantity = VarGet(ScriptReadHalfword(ctx));\n\n    gSpecialVar_Result = RemoveBagItem(itemId, (u8)quantity);\n    return FALSE;\n}\n\nbool8 ScrCmd_checkitemspace(struct ScriptContext * ctx)\n{\n    u16 itemId = VarGet(ScriptReadHalfword(ctx));\n    u32 quantity = VarGet(ScriptReadHalfword(ctx));\n\n    gSpecialVar_Result = CheckBagHasSpace(itemId, (u8)quantity);\n    return FALSE;\n}\n\nbool8 ScrCmd_checkitem(struct ScriptContext * ctx)\n{\n    u16 itemId = VarGet(ScriptReadHalfword(ctx));\n    u32 quantity = VarGet(ScriptReadHalfword(ctx));\n\n    gSpecialVar_Result = CheckBagHasItem(itemId, (u8)quantity);\n    return FALSE;\n}\n\nbool8 ScrCmd_checkitemtype(struct ScriptContext * ctx)\n{\n    u16 itemId = VarGet(ScriptReadHalfword(ctx));\n\n    gSpecialVar_Result = GetPocketByItemId(itemId);\n    return FALSE;\n}\n\nbool8 ScrCmd_addpcitem(struct ScriptContext * ctx)\n{\n    u16 itemId = VarGet(ScriptReadHalfword(ctx));\n    u16 quantity = VarGet(ScriptReadHalfword(ctx));\n\n    gSpecialVar_Result = AddPCItem(itemId, quantity);\n    return FALSE;\n}\n\nbool8 ScrCmd_checkpcitem(struct ScriptContext * ctx)\n{\n    u16 itemId = VarGet(ScriptReadHalfword(ctx));\n    u16 quantity = VarGet(ScriptReadHalfword(ctx));\n\n    gSpecialVar_Result = CheckPCHasItem(itemId, quantity);\n    return FALSE;\n}\n\nbool8 ScrCmd_adddecoration(struct ScriptContext * ctx)\n{\n    u32 decorId = VarGet(ScriptReadHalfword(ctx));\n\n//    gSpecialVar_Result = DecorationAdd(decorId);\n    return FALSE;\n}\n\nbool8 ScrCmd_removedecoration(struct ScriptContext * ctx)\n{\n    u32 decorId = VarGet(ScriptReadHalfword(ctx));\n\n//    gSpecialVar_Result = DecorationRemove(decorId);\n    return FALSE;\n}\n\nbool8 ScrCmd_checkdecorspace(struct ScriptContext * ctx)\n{\n    u32 decorId = VarGet(ScriptReadHalfword(ctx));\n\n//    gSpecialVar_Result = DecorationCheckSpace(decorId);\n    return FALSE;\n}\n\nbool8 ScrCmd_checkdecor(struct ScriptContext * ctx)\n{\n    u32 decorId = VarGet(ScriptReadHalfword(ctx));\n\n//    gSpecialVar_Result = CheckHasDecoration(decorId);\n    return FALSE;\n}\n\nbool8 ScrCmd_setflag(struct ScriptContext * ctx)\n{\n    FlagSet(ScriptReadHalfword(ctx));\n    return FALSE;\n}\n\nbool8 ScrCmd_clearflag(struct ScriptContext * ctx)\n{\n    FlagClear(ScriptReadHalfword(ctx));\n    return FALSE;\n}\n\nbool8 ScrCmd_checkflag(struct ScriptContext * ctx)\n{\n    ctx->comparisonResult = FlagGet(ScriptReadHalfword(ctx));\n    return FALSE;\n}\n\nbool8 ScrCmd_incrementgamestat(struct ScriptContext * ctx)\n{\n    IncrementGameStat(ScriptReadByte(ctx));\n    return FALSE;\n}\n\nbool8 ScrCmd_comparestat(struct ScriptContext * ctx)\n{\n    u8 statIdx = ScriptReadByte(ctx);\n    u32 value = ScriptReadWord(ctx);\n    u32 statValue = GetGameStat(statIdx);\n\n    if (statValue < value)\n        ctx ->comparisonResult = 0;\n    else if (statValue == value)\n        ctx->comparisonResult = 1;\n    else\n        ctx->comparisonResult = 2;\n    return FALSE;\n}\n\nbool8 ScrCmd_setworldmapflag(struct ScriptContext * ctx)\n{\n    u16 value = ScriptReadHalfword(ctx);\n    QuestLog_RecordEnteredMap(value);\n    MapPreview_SetFlag(value);\n    return FALSE;\n}\n\nbool8 ScrCmd_animateflash(struct ScriptContext * ctx)\n{\n    AnimateFlash(ScriptReadByte(ctx));\n    ScriptContext_Stop();\n    return TRUE;\n}\n\nbool8 ScrCmd_setflashlevel(struct ScriptContext * ctx)\n{\n    SetFlashLevel(VarGet(ScriptReadHalfword(ctx)));\n    return FALSE;\n}\n\nstatic bool8 IsPaletteNotActive(void)\n{\n    if (!gPaletteFade.active)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 ScrCmd_fadescreen(struct ScriptContext * ctx)\n{\n    FadeScreen(ScriptReadByte(ctx), 0);\n    SetupNativeScript(ctx, IsPaletteNotActive);\n    return TRUE;\n}\n\nbool8 ScrCmd_fadescreenspeed(struct ScriptContext * ctx)\n{\n    u8 mode = ScriptReadByte(ctx);\n    u8 speed = ScriptReadByte(ctx);\n\n    FadeScreen(mode, speed);\n    SetupNativeScript(ctx, IsPaletteNotActive);\n    return TRUE;\n}\n\nstatic bool8 RunPauseTimer(void)\n{\n    if (--sPauseCounter == 0)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 ScrCmd_delay(struct ScriptContext * ctx)\n{\n    sPauseCounter = ScriptReadHalfword(ctx);\n    SetupNativeScript(ctx, RunPauseTimer);\n    return TRUE;\n}\n\nbool8 ScrCmd_initclock(struct ScriptContext * ctx)\n{\n//    u8 hour = VarGet(ScriptReadHalfword(ctx));\n//    u8 minute = VarGet(ScriptReadHalfword(ctx));\n//\n//    RtcInitLocalTimeOffset(hour, minute);\n    return FALSE;\n}\n\nbool8 ScrCmd_dotimebasedevents(struct ScriptContext * ctx)\n{\n//    DoTimeBasedEvents();\n    return FALSE;\n}\n\nbool8 ScrCmd_gettime(struct ScriptContext * ctx)\n{\n//    RtcCalcLocalTime();\n//    gSpecialVar_0x8000 = gLocalTime.hours;\n//    gSpecialVar_0x8001 = gLocalTime.minutes;\n//    gSpecialVar_0x8002 = gLocalTime.seconds;\n    gSpecialVar_0x8000 = 0;\n    gSpecialVar_0x8001 = 0;\n    gSpecialVar_0x8002 = 0;\n    return FALSE;\n}\n\nbool8 ScrCmd_setweather(struct ScriptContext * ctx)\n{\n    u16 weather = VarGet(ScriptReadHalfword(ctx));\n\n    SetSavedWeather(weather);\n    return FALSE;\n}\n\nbool8 ScrCmd_resetweather(struct ScriptContext * ctx)\n{\n    SetSavedWeatherFromCurrMapHeader();\n    return FALSE;\n}\n\nbool8 ScrCmd_doweather(struct ScriptContext * ctx)\n{\n    DoCurrentWeather();\n    return FALSE;\n}\n\nbool8 ScrCmd_setstepcallback(struct ScriptContext * ctx)\n{\n    ActivatePerStepCallback(ScriptReadByte(ctx));\n    return FALSE;\n}\n\nbool8 ScrCmd_setmaplayoutindex(struct ScriptContext * ctx)\n{\n    u16 value = VarGet(ScriptReadHalfword(ctx));\n\n    SetCurrentMapLayout(value);\n    return FALSE;\n}\n\nbool8 ScrCmd_warp(struct ScriptContext * ctx)\n{\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u8 warpId = ScriptReadByte(ctx);\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    SetWarpDestination(mapGroup, mapNum, warpId, x, y);\n    DoWarp();\n    ResetInitialPlayerAvatarState();\n    return TRUE;\n}\n\nbool8 ScrCmd_warpsilent(struct ScriptContext * ctx)\n{\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u8 warpId = ScriptReadByte(ctx);\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    SetWarpDestination(mapGroup, mapNum, warpId, x, y);\n    DoDiveWarp();\n    ResetInitialPlayerAvatarState();\n    return TRUE;\n}\n\nbool8 ScrCmd_warpdoor(struct ScriptContext * ctx)\n{\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u8 warpId = ScriptReadByte(ctx);\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    SetWarpDestination(mapGroup, mapNum, warpId, x, y);\n    DoDoorWarp();\n    ResetInitialPlayerAvatarState();\n    return TRUE;\n}\n\nbool8 ScrCmd_warphole(struct ScriptContext * ctx)\n{\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u16 x;\n    u16 y;\n\n    PlayerGetDestCoords(&x, &y);\n    if (mapGroup == MAP_GROUP(UNDEFINED) && mapNum == MAP_NUM(UNDEFINED))\n        SetWarpDestinationToFixedHoleWarp(x - MAP_OFFSET, y - MAP_OFFSET);\n    else\n        SetWarpDestination(mapGroup, mapNum, WARP_ID_NONE, x - MAP_OFFSET, y - MAP_OFFSET);\n    DoFallWarp();\n    ResetInitialPlayerAvatarState();\n    return TRUE;\n}\n\nbool8 ScrCmd_warpteleport(struct ScriptContext * ctx)\n{\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u8 warpId = ScriptReadByte(ctx);\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    SetWarpDestination(mapGroup, mapNum, warpId, x, y);\n    DoTeleportWarp();\n    ResetInitialPlayerAvatarState();\n    return TRUE;\n}\n\nbool8 ScrCmd_warpspinenter(struct ScriptContext * ctx)\n{\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u8 warpId = ScriptReadByte(ctx);\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    SetWarpDestination(mapGroup, mapNum, warpId, x, y);\n    SavePlayerFacingDirectionForTeleport(GetPlayerFacingDirection());\n    DoTeleport2Warp();\n    ResetInitialPlayerAvatarState();\n    return TRUE;\n}\n\nbool8 ScrCmd_setwarp(struct ScriptContext * ctx)\n{\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u8 warpId = ScriptReadByte(ctx);\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    SetWarpDestination(mapGroup, mapNum, warpId, x, y);\n    return FALSE;\n}\n\nbool8 ScrCmd_setdynamicwarp(struct ScriptContext * ctx)\n{\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u8 warpId = ScriptReadByte(ctx);\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    SetDynamicWarpWithCoords(0, mapGroup, mapNum, warpId, x, y);\n    return FALSE;\n}\n\nbool8 ScrCmd_setdivewarp(struct ScriptContext * ctx)\n{\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u8 warpId = ScriptReadByte(ctx);\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    SetFixedDiveWarp(mapGroup, mapNum, warpId, x, y);\n    return FALSE;\n}\n\nbool8 ScrCmd_setholewarp(struct ScriptContext * ctx)\n{\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u8 warpId = ScriptReadByte(ctx);\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    SetFixedHoleWarp(mapGroup, mapNum, warpId, x, y);\n    return FALSE;\n}\n\nbool8 ScrCmd_setescapewarp(struct ScriptContext * ctx)\n{\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u8 warpId = ScriptReadByte(ctx);\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    SetEscapeWarp(mapGroup, mapNum, warpId, x, y);\n    return FALSE;\n}\n\nbool8 ScrCmd_getplayerxy(struct ScriptContext * ctx)\n{\n    u16 *pX = GetVarPointer(ScriptReadHalfword(ctx));\n    u16 *pY = GetVarPointer(ScriptReadHalfword(ctx));\n\n    *pX = gSaveBlock1Ptr->pos.x;\n    *pY = gSaveBlock1Ptr->pos.y;\n    return FALSE;\n}\n\nbool8 ScrCmd_getpartysize(struct ScriptContext * ctx)\n{\n    gSpecialVar_Result = CalculatePlayerPartyCount();\n    return FALSE;\n}\n\nbool8 ScrCmd_playse(struct ScriptContext * ctx)\n{\n    PlaySE(ScriptReadHalfword(ctx));\n    return FALSE;\n}\n\nstatic bool8 WaitForSoundEffectFinish(void)\n{\n    if (!IsSEPlaying())\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 ScrCmd_waitse(struct ScriptContext * ctx)\n{\n    SetupNativeScript(ctx, WaitForSoundEffectFinish);\n    return TRUE;\n}\n\nbool8 ScrCmd_playfanfare(struct ScriptContext * ctx)\n{\n    PlayFanfare(ScriptReadHalfword(ctx));\n    return FALSE;\n}\n\nstatic bool8 WaitForFanfareFinish(void)\n{\n    return IsFanfareTaskInactive();\n}\n\nbool8 ScrCmd_waitfanfare(struct ScriptContext * ctx)\n{\n    SetupNativeScript(ctx, WaitForFanfareFinish);\n    return TRUE;\n}\n\nbool8 ScrCmd_playbgm(struct ScriptContext * ctx)\n{\n    u16 songId = ScriptReadHalfword(ctx);\n    bool8 save = ScriptReadByte(ctx);\n\n    if (QL_IS_PLAYBACK_STATE)\n        return FALSE;\n    if (save == TRUE)\n        Overworld_SetSavedMusic(songId);\n    PlayNewMapMusic(songId);\n    return FALSE;\n}\n\nbool8 ScrCmd_savebgm(struct ScriptContext * ctx)\n{\n    Overworld_SetSavedMusic(ScriptReadHalfword(ctx));\n    return FALSE;\n}\n\nbool8 ScrCmd_fadedefaultbgm(struct ScriptContext * ctx)\n{\n    if (QL_IS_PLAYBACK_STATE)\n        return FALSE;\n    Overworld_ChangeMusicToDefault();\n    return FALSE;\n}\n\nbool8 ScrCmd_fadenewbgm(struct ScriptContext * ctx)\n{\n    u16 music = ScriptReadHalfword(ctx);\n    if (QL_IS_PLAYBACK_STATE)\n        return FALSE;\n    Overworld_ChangeMusicTo(music);\n    return FALSE;\n}\n\nbool8 ScrCmd_fadeoutbgm(struct ScriptContext * ctx)\n{\n    u8 speed = ScriptReadByte(ctx);\n\n    if (QL_IS_PLAYBACK_STATE)\n        return FALSE;\n    if (speed != 0)\n        FadeOutBGMTemporarily(4 * speed);\n    else\n        FadeOutBGMTemporarily(4);\n    SetupNativeScript(ctx, IsBGMPausedOrStopped);\n    return TRUE;\n}\n\nbool8 ScrCmd_fadeinbgm(struct ScriptContext * ctx)\n{\n    u8 speed = ScriptReadByte(ctx);\n\n    if (QL_IS_PLAYBACK_STATE)\n        return FALSE;\n    if (speed != 0)\n        FadeInBGM(4 * speed);\n    else\n        FadeInBGM(4);\n    return FALSE;\n}\n\nbool8 ScrCmd_applymovement(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n    const void *movementScript = (const void *)ScriptReadWord(ctx);\n\n    ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript);\n    sMovingNpcId = localId;\n    return FALSE;\n}\n\nbool8 ScrCmd_applymovementat(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n    const void *movementScript = (const void *)ScriptReadWord(ctx);\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n\n    ScriptMovement_StartObjectMovementScript(localId, mapNum, mapGroup, movementScript);\n    sMovingNpcId = localId;\n    return FALSE;\n}\n\nstatic bool8 WaitForMovementFinish(void)\n{\n    return ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapNum, sMovingNpcMapGroup);\n}\n\nbool8 ScrCmd_waitmovement(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n\n    if (localId != 0)\n        sMovingNpcId = localId;\n    sMovingNpcMapGroup = gSaveBlock1Ptr->location.mapGroup;\n    sMovingNpcMapNum = gSaveBlock1Ptr->location.mapNum;\n    SetupNativeScript(ctx, WaitForMovementFinish);\n    return TRUE;\n}\n\nbool8 ScrCmd_waitmovementat(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n    u8 mapBank;\n    u8 mapId;\n\n    if (localId != 0)\n        sMovingNpcId = localId;\n    mapBank = ScriptReadByte(ctx);\n    mapId = ScriptReadByte(ctx);\n    sMovingNpcMapGroup = mapBank;\n    sMovingNpcMapNum = mapId;\n    SetupNativeScript(ctx, WaitForMovementFinish);\n    return TRUE;\n}\n\nbool8 ScrCmd_removeobject(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n\n    RemoveObjectEventByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);\n    return FALSE;\n}\n\nbool8 ScrCmd_removeobjectat(struct ScriptContext * ctx)\n{\n    u16 objectId = VarGet(ScriptReadHalfword(ctx));\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n\n    RemoveObjectEventByLocalIdAndMap(objectId, mapNum, mapGroup);\n    return FALSE;\n}\n\nbool8 ScrCmd_addobject(struct ScriptContext * ctx)\n{\n    u16 objectId = VarGet(ScriptReadHalfword(ctx));\n\n    TrySpawnObjectEvent(objectId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);\n    return FALSE;\n}\n\nbool8 ScrCmd_addobjectat(struct ScriptContext * ctx)\n{\n    u16 objectId = VarGet(ScriptReadHalfword(ctx));\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n\n    TrySpawnObjectEvent(objectId, mapNum, mapGroup);\n    return FALSE;\n}\n\nbool8 ScrCmd_setobjectxy(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    TryMoveObjectEventToMapCoords(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, x, y);\n    return FALSE;\n}\n\nbool8 ScrCmd_setobjectxyperm(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    SetObjEventTemplateCoords(localId, x, y);\n    return FALSE;\n}\n\nbool8 ScrCmd_copyobjectxytoperm(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n\n    TryOverrideObjectEventTemplateCoords(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);\n    return FALSE;\n}\n\nbool8 ScrCmd_showobjectat(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n\n    SetObjectInvisibility(localId, mapNum, mapGroup, FALSE);\n    return FALSE;\n}\n\nbool8 ScrCmd_hideobjectat(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n\n    SetObjectInvisibility(localId, mapNum, mapGroup, TRUE);\n    return FALSE;\n}\n\nbool8 ScrCmd_setobjectsubpriority(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n    u8 priority = ScriptReadByte(ctx);\n\n    SetObjectSubpriority(localId, mapNum, mapGroup, priority + 83);\n    return FALSE;\n}\n\nbool8 ScrCmd_resetobjectsubpriority(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n    u8 mapGroup = ScriptReadByte(ctx);\n    u8 mapNum = ScriptReadByte(ctx);\n\n    ResetObjectSubpriority(localId, mapNum, mapGroup);\n    return FALSE;\n}\n\nbool8 ScrCmd_faceplayer(struct ScriptContext * ctx)\n{\n    if (gObjectEvents[gSelectedObjectEvent].active)\n    {\n        ObjectEventFaceOppositeDirection(&gObjectEvents[gSelectedObjectEvent],\n                                         GetPlayerFacingDirection());\n    }\n    return FALSE;\n}\n\nbool8 ScrCmd_turnobject(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n    u8 direction = ScriptReadByte(ctx);\n\n    ObjectEventTurnByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, direction);\n    return FALSE;\n}\n\nbool8 ScrCmd_setobjectmovementtype(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n    u8 movementType = ScriptReadByte(ctx);\n\n    SetObjEventTemplateMovementType(localId, movementType);\n    return FALSE;\n}\n\nbool8 ScrCmd_createvobject(struct ScriptContext * ctx)\n{\n    u8 graphicsId = ScriptReadByte(ctx);\n    u8 virtualObjId = ScriptReadByte(ctx);\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u32 y = VarGet(ScriptReadHalfword(ctx));\n    u8 elevation = ScriptReadByte(ctx);\n    u8 direction = ScriptReadByte(ctx);\n\n    CreateVirtualObject(graphicsId, virtualObjId, x, y, elevation, direction);\n    return FALSE;\n}\n\nbool8 ScrCmd_turnvobject(struct ScriptContext * ctx)\n{\n    u8 virtualObjId = ScriptReadByte(ctx);\n    u8 direction = ScriptReadByte(ctx);\n\n    TurnVirtualObject(virtualObjId, direction);\n    return FALSE;\n}\n\n// lockall freezes all object events except the player immediately.\n// The player is frozen after waiting for their current movement to finish.\nbool8 ScrCmd_lockall(struct ScriptContext * ctx)\n{\n    if (IsUpdateLinkStateCBActive())\n    {\n        return FALSE;\n    }\n    else\n    {\n        FreezeObjects_WaitForPlayer();\n        SetupNativeScript(ctx, IsFreezePlayerFinished);\n        return TRUE;\n    }\n}\n\nbool8 ScrCmd_lock(struct ScriptContext * ctx)\n{\n    if (IsUpdateLinkStateCBActive())\n    {\n        return FALSE;\n    }\n    else\n    {\n        if (gObjectEvents[gSelectedObjectEvent].active)\n        {\n            FreezeObjects_WaitForPlayerAndSelected();\n            SetupNativeScript(ctx, IsFreezeSelectedObjectAndPlayerFinished);\n        }\n        else\n        {\n            FreezeObjects_WaitForPlayer();\n            SetupNativeScript(ctx, IsFreezePlayerFinished);\n        }\n        return TRUE;\n    }\n}\n\nbool8 ScrCmd_releaseall(struct ScriptContext * ctx)\n{\n    u8 playerObjectId;\n\n    HideFieldMessageBox();\n    playerObjectId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0);\n    ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]);\n    ScriptMovement_UnfreezeObjectEvents();\n    UnfreezeObjectEvents();\n    return FALSE;\n}\n\nbool8 ScrCmd_release(struct ScriptContext * ctx)\n{\n    u8 playerObjectId;\n\n    HideFieldMessageBox();\n    if (gObjectEvents[gSelectedObjectEvent].active)\n        ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSelectedObjectEvent]);\n    playerObjectId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0);\n    ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]);\n    ScriptMovement_UnfreezeObjectEvents();\n    UnfreezeObjectEvents();\n    return FALSE;\n}\n\nbool8 ScrCmd_textcolor(struct ScriptContext * ctx)\n{\n    gSpecialVar_PrevTextColor = gSpecialVar_TextColor;\n    gSpecialVar_TextColor = ScriptReadByte(ctx);\n    return FALSE;\n}\n\nbool8 ScrCmd_message(struct ScriptContext * ctx)\n{\n    const u8 *msg = (const u8 *)ScriptReadWord(ctx);\n\n    if (msg == NULL)\n        msg = (const u8 *)ctx->data[0];\n    ShowFieldMessage(msg);\n    return FALSE;\n}\n\nbool8 ScrCmd_loadhelp(struct ScriptContext * ctx)\n{\n    const u8 *msg = (const u8 *)ScriptReadWord(ctx);\n\n    if (msg == NULL)\n        msg = (const u8 *)ctx->data[0];\n    DrawHelpMessageWindowWithText(msg);\n    CopyWindowToVram(GetStartMenuWindowId(), COPYWIN_MAP);\n    return FALSE;\n}\n\nbool8 ScrCmd_unloadhelp(struct ScriptContext * ctx)\n{\n    DestroyHelpMessageWindow_();\n    return FALSE;\n}\n\nbool8 ScrCmd_messageautoscroll(struct ScriptContext * ctx)\n{\n    const u8 *msg = (const u8 *)ScriptReadWord(ctx);\n\n    if (msg == NULL)\n        msg = (const u8 *)ctx->data[0];\n    ShowFieldAutoScrollMessage(msg);\n    return FALSE;\n}\n\nbool8 ScrCmd_waitmessage(struct ScriptContext * ctx)\n{\n    SetupNativeScript(ctx, IsFieldMessageBoxHidden);\n    return TRUE;\n}\n\nbool8 ScrCmd_closemessage(struct ScriptContext * ctx)\n{\n    HideFieldMessageBox();\n    return FALSE;\n}\n\nstatic bool8 WaitForAorBPress(void)\n{\n    if (JOY_NEW(A_BUTTON))\n        return TRUE;\n    if (JOY_NEW(B_BUTTON))\n        return TRUE;\n\n    if (ScriptContext_NextCommandEndsScript(sQuestLogScriptContextPtr) == TRUE)\n    {\n        u8 qlogInput = ScriptContext_GetQuestLogInput(sQuestLogScriptContextPtr);\n        RegisterQuestLogInput(qlogInput);\n        if (qlogInput != QL_INPUT_OFF)\n        {\n            if (gQuestLogState != QL_STATE_PLAYBACK)\n            {\n                ClearMsgBoxCancelableState();\n                if (qlogInput != QL_INPUT_A && qlogInput != QL_INPUT_B)\n                    SetQuestLogInputIsDpadFlag();\n                else\n                {\n                    ClearQuestLogInput();\n                    ClearQuestLogInputIsDpadFlag();\n                }\n                return TRUE;\n            }\n        }\n    }\n    if (QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING || gQuestLogState == QL_STATE_PLAYBACK)\n    {\n        if (sQuestLogWaitButtonPressTimer == 120)\n            return TRUE;\n        else\n            sQuestLogWaitButtonPressTimer++;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 ScriptContext_NextCommandEndsScript(struct ScriptContext * ctx)\n{\n    const u8 * script = ctx->scriptPtr;\n    u8 nextCmd = *script;\n    if (nextCmd == 3) // return\n    {\n        script = ctx->stack[ctx->stackDepth - 1];\n        nextCmd = *script;\n    }\n    if (nextCmd < 0x6B || nextCmd > 0x6C) // releaseall or release\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic u8 ScriptContext_GetQuestLogInput(struct ScriptContext * ctx)\n{\n    if (JOY_HELD(DPAD_UP) && gSpecialVar_Facing != DIR_NORTH)\n        return QL_INPUT_UP;\n\n    if (JOY_HELD(DPAD_DOWN) && gSpecialVar_Facing != DIR_SOUTH)\n        return QL_INPUT_DOWN;\n\n    if (JOY_HELD(DPAD_LEFT) && gSpecialVar_Facing != DIR_WEST)\n        return QL_INPUT_LEFT;\n\n    if (JOY_HELD(DPAD_RIGHT) && gSpecialVar_Facing != DIR_EAST)\n        return QL_INPUT_RIGHT;\n\n    if (JOY_NEW(L_BUTTON))\n        return QL_INPUT_L;\n\n    if (JOY_HELD(R_BUTTON))\n        return QL_INPUT_R;\n\n    if (JOY_HELD(START_BUTTON))\n        return QL_INPUT_START;\n\n    if (JOY_HELD(SELECT_BUTTON))\n        return QL_INPUT_SELECT;\n\n    if (JOY_NEW(A_BUTTON))\n        return QL_INPUT_A;\n\n    if (JOY_NEW(B_BUTTON))\n        return QL_INPUT_B;\n\n    return QL_INPUT_OFF;\n}\n\nbool8 ScrCmd_waitbuttonpress(struct ScriptContext * ctx)\n{\n    sQuestLogScriptContextPtr = ctx;\n\n    if (QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING || gQuestLogState == QL_STATE_PLAYBACK)\n        sQuestLogWaitButtonPressTimer = 0;\n    SetupNativeScript(ctx, WaitForAorBPress);\n    return TRUE;\n}\n\nbool8 ScrCmd_yesnobox(struct ScriptContext * ctx)\n{\n    u8 left = ScriptReadByte(ctx);\n    u8 top = ScriptReadByte(ctx);\n\n    if (ScriptMenu_YesNo(left, top) == TRUE)\n    {\n        ScriptContext_Stop();\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nbool8 ScrCmd_multichoice(struct ScriptContext * ctx)\n{\n    u8 left = ScriptReadByte(ctx);\n    u8 top = ScriptReadByte(ctx);\n    u8 multichoiceId = ScriptReadByte(ctx);\n    bool8 ignoreBPress = ScriptReadByte(ctx);\n\n    if (ScriptMenu_Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE)\n    {\n        ScriptContext_Stop();\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nbool8 ScrCmd_multichoicedefault(struct ScriptContext * ctx)\n{\n    u8 left = ScriptReadByte(ctx);\n    u8 top = ScriptReadByte(ctx);\n    u8 multichoiceId = ScriptReadByte(ctx);\n    u8 defaultChoice = ScriptReadByte(ctx);\n    bool8 ignoreBPress = ScriptReadByte(ctx);\n\n    if (ScriptMenu_MultichoiceWithDefault(left, top, multichoiceId, ignoreBPress, defaultChoice) == TRUE)\n    {\n        ScriptContext_Stop();\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nbool8 ScrCmd_drawbox(struct ScriptContext * ctx)\n{\n    /*u8 left = ScriptReadByte(ctx);\n    u8 top = ScriptReadByte(ctx);\n    u8 right = ScriptReadByte(ctx);\n    u8 bottom = ScriptReadByte(ctx);\n\n    MenuDrawTextWindow(left, top, right, bottom);*/\n    return FALSE;\n}\n\nbool8 ScrCmd_multichoicegrid(struct ScriptContext * ctx)\n{\n    u8 left = ScriptReadByte(ctx);\n    u8 top = ScriptReadByte(ctx);\n    u8 multichoiceId = ScriptReadByte(ctx);\n    u8 numColumns = ScriptReadByte(ctx);\n    bool8 ignoreBPress = ScriptReadByte(ctx);\n\n    if (ScriptMenu_MultichoiceGrid(left, top, multichoiceId, ignoreBPress, numColumns) == TRUE)\n    {\n        ScriptContext_Stop();\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nbool8 ScrCmd_erasebox(struct ScriptContext * ctx)\n{\n    u8 left = ScriptReadByte(ctx);\n    u8 top = ScriptReadByte(ctx);\n    u8 right = ScriptReadByte(ctx);\n    u8 bottom = ScriptReadByte(ctx);\n\n    // Menu_EraseWindowRect(left, top, right, bottom);\n    return FALSE;\n}\n\nbool8 ScrCmd_drawboxtext(struct ScriptContext * ctx)\n{\n//    u8 left = ScriptReadByte(ctx);\n//    u8 top = ScriptReadByte(ctx);\n//    u8 multichoiceId = ScriptReadByte(ctx);\n//    bool8 ignoreBPress = ScriptReadByte(ctx);\n\n    /*if (Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE)\n    {\n        ScriptContext_Stop();\n        return TRUE;\n    }*/\n    return FALSE;\n}\n\nbool8 ScrCmd_showmonpic(struct ScriptContext * ctx)\n{\n    u16 species = VarGet(ScriptReadHalfword(ctx));\n    u8 x = ScriptReadByte(ctx);\n    u8 y = ScriptReadByte(ctx);\n\n    ScriptMenu_ShowPokemonPic(species, x, y);\n    PlayCry_Script(species, CRY_MODE_NORMAL);\n    return FALSE;\n}\n\nbool8 ScrCmd_hidemonpic(struct ScriptContext * ctx)\n{\n    // The hide function returns a pointer to a function\n    // that returns true once the pic is hidden\n    bool8 (*func)(void) = ScriptMenu_HidePokemonPic();\n\n    if (func == NULL)\n        return FALSE;\n    SetupNativeScript(ctx, func);\n    return TRUE;\n}\n\nbool8 ScrCmd_showcontestpainting(struct ScriptContext * ctx)\n{\n    u8 contestWinnerId = ScriptReadByte(ctx);\n    /*\n    // Artist's painting is temporary and already has its data loaded\n    if (contestWinnerId != CONTEST_WINNER_ARTIST)\n        SetContestWinnerForPainting(contestWinnerId);\n\n    ShowContestPainting();\n    ScriptContext_Stop()\n    return TRUE;\n    */\n    return FALSE;\n}\n\nbool8 ScrCmd_braillemessage(struct ScriptContext * ctx)\n{\n    u8 *msg = (u8 *)ScriptReadWord(ctx);\n    if (msg == NULL)\n        msg = (u8 *)ctx->data[0];\n\n    LoadStdWindowFrameGfx();\n    DrawDialogueFrame(0, 1);\n    AddTextPrinterParameterized(0, FONT_BRAILLE, msg, 0, 1, 0, NULL);\n    return FALSE;\n}\n\nbool8 ScrCmd_getbraillestringwidth(struct ScriptContext * ctx)\n{\n    u8 *msg = (u8 *)ScriptReadWord(ctx);\n    if (msg == NULL)\n        msg = (u8 *)ctx->data[0];\n\n    gSpecialVar_0x8004 = GetStringWidth(FONT_BRAILLE, msg, -1);\n    return FALSE;\n}\n\nbool8 ScrCmd_vmessage(struct ScriptContext * ctx)\n{\n    u32 msg = ScriptReadWord(ctx);\n\n    ShowFieldMessage((u8 *)(msg - sAddressOffset));\n    return FALSE;\n}\n\nu8 *const sScriptStringVars[] =\n{\n    gStringVar1,\n    gStringVar2,\n    gStringVar3,\n};\n\nbool8 ScrCmd_bufferspeciesname(struct ScriptContext * ctx)\n{\n    u8 stringVarIndex = ScriptReadByte(ctx);\n    u16 species = VarGet(ScriptReadHalfword(ctx));\n\n    StringCopy(sScriptStringVars[stringVarIndex], gSpeciesNames[species]);\n    return FALSE;\n}\n\nbool8 ScrCmd_bufferleadmonspeciesname(struct ScriptContext * ctx)\n{\n    u8 stringVarIndex = ScriptReadByte(ctx);\n\n    u8 *dest = sScriptStringVars[stringVarIndex];\n    u8 partyIndex = GetLeadMonIndex();\n    u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL);\n    StringCopy(dest, gSpeciesNames[species]);\n    return FALSE;\n}\n\nbool8 ScrCmd_bufferpartymonnick(struct ScriptContext * ctx)\n{\n    u8 stringVarIndex = ScriptReadByte(ctx);\n    u16 partyIndex = VarGet(ScriptReadHalfword(ctx));\n\n    GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, sScriptStringVars[stringVarIndex]);\n    StringGet_Nickname(sScriptStringVars[stringVarIndex]);\n    return FALSE;\n}\n\nbool8 ScrCmd_bufferitemname(struct ScriptContext * ctx)\n{\n    u8 stringVarIndex = ScriptReadByte(ctx);\n    u16 itemId = VarGet(ScriptReadHalfword(ctx));\n\n    CopyItemName(itemId, sScriptStringVars[stringVarIndex]);\n    return FALSE;\n}\n\nstatic const u8 sText_S[] = _(\"S\");\nstatic const u8 sText_IES[] = _(\"IES\");\n\nbool8 ScrCmd_bufferitemnameplural(struct ScriptContext * ctx)\n{\n    u8 stringVarIndex = ScriptReadByte(ctx);\n    u16 itemId = VarGet(ScriptReadHalfword(ctx));\n    u16 quantity = VarGet(ScriptReadHalfword(ctx));\n\n    CopyItemName(itemId, sScriptStringVars[stringVarIndex]);\n    if (itemId == ITEM_POKE_BALL && quantity >= 2)\n        StringAppend(sScriptStringVars[stringVarIndex], sText_S);\n    else if (itemId >= FIRST_BERRY_INDEX && itemId < LAST_BERRY_INDEX && quantity >= 2)\n    {\n        u16 strlength = StringLength(sScriptStringVars[stringVarIndex]);\n        if (strlength != 0)\n        {\n            u8 * endptr = sScriptStringVars[stringVarIndex] + strlength;\n            endptr[-1] = EOS;\n            StringAppend(sScriptStringVars[stringVarIndex], sText_IES);\n        }\n    }\n\n    return FALSE;\n}\n\nbool8 ScrCmd_bufferdecorationname(struct ScriptContext * ctx)\n{\n    u8 stringVarIndex = ScriptReadByte(ctx);\n    u16 decorId = VarGet(ScriptReadHalfword(ctx));\n\n//    StringCopy(sScriptStringVars[stringVarIndex], gDecorations[decorId].name);\n    return FALSE;\n}\n\nbool8 ScrCmd_buffermovename(struct ScriptContext * ctx)\n{\n    u8 stringVarIndex = ScriptReadByte(ctx);\n    u16 moveId = VarGet(ScriptReadHalfword(ctx));\n\n    StringCopy(sScriptStringVars[stringVarIndex], gMoveNames[moveId]);\n    return FALSE;\n}\n\nbool8 ScrCmd_buffernumberstring(struct ScriptContext * ctx)\n{\n    u8 stringVarIndex = ScriptReadByte(ctx);\n    u16 num = VarGet(ScriptReadHalfword(ctx));\n    u8 numDigits = CountDigits(num);\n\n    ConvertIntToDecimalStringN(sScriptStringVars[stringVarIndex], num, STR_CONV_MODE_LEFT_ALIGN, numDigits);\n    return FALSE;\n}\n\nbool8 ScrCmd_bufferstdstring(struct ScriptContext * ctx)\n{\n    u8 stringVarIndex = ScriptReadByte(ctx);\n    u16 index = VarGet(ScriptReadHalfword(ctx));\n\n    StringCopy(sScriptStringVars[stringVarIndex], gStdStringPtrs[index]);\n    return FALSE;\n}\n\nbool8 ScrCmd_bufferstring(struct ScriptContext * ctx)\n{\n    u8 stringVarIndex = ScriptReadByte(ctx);\n    const u8 *text = (u8 *)ScriptReadWord(ctx);\n\n    StringCopy(sScriptStringVars[stringVarIndex], text);\n    return FALSE;\n}\n\nbool8 ScrCmd_vbuffermessage(struct ScriptContext * ctx)\n{\n    const u8 *ptr = (u8 *)(ScriptReadWord(ctx) - sAddressOffset);\n\n    StringExpandPlaceholders(gStringVar4, ptr);\n    return FALSE;\n}\n\nbool8 ScrCmd_vbufferstring(struct ScriptContext * ctx)\n{\n    u8 stringVarIndex = ScriptReadByte(ctx);\n    u32 addr = ScriptReadWord(ctx);\n\n    const u8 *src = (u8 *)(addr - sAddressOffset);\n    u8 *dest = sScriptStringVars[stringVarIndex];\n    StringCopy(dest, src);\n    return FALSE;\n}\n\nbool8 ScrCmd_bufferboxname(struct ScriptContext * ctx)\n{\n    u8 stringVarIndex = ScriptReadByte(ctx);\n    u16 boxId = VarGet(ScriptReadHalfword(ctx));\n\n    StringCopy(sScriptStringVars[stringVarIndex], GetBoxNamePtr(boxId));\n    return FALSE;\n}\n\nbool8 ScrCmd_givemon(struct ScriptContext * ctx)\n{\n    u16 species = VarGet(ScriptReadHalfword(ctx));\n    u8 level = ScriptReadByte(ctx);\n    u16 item = VarGet(ScriptReadHalfword(ctx));\n    u32 unkParam1 = ScriptReadWord(ctx);\n    u32 unkParam2 = ScriptReadWord(ctx);\n    u8 unkParam3 = ScriptReadByte(ctx);\n\n    gSpecialVar_Result = ScriptGiveMon(species, level, item, unkParam1, unkParam2, unkParam3);\n    return FALSE;\n}\n\nbool8 ScrCmd_giveegg(struct ScriptContext * ctx)\n{\n    u16 species = VarGet(ScriptReadHalfword(ctx));\n\n    gSpecialVar_Result = ScriptGiveEgg(species);\n    return FALSE;\n}\n\nbool8 ScrCmd_setmonmove(struct ScriptContext * ctx)\n{\n    u8 partyIndex = ScriptReadByte(ctx);\n    u8 slot = ScriptReadByte(ctx);\n    u16 move = ScriptReadHalfword(ctx);\n\n    ScriptSetMonMoveSlot(partyIndex, move, slot);\n    return FALSE;\n}\n\nbool8 ScrCmd_checkpartymove(struct ScriptContext * ctx)\n{\n    u32 i;\n    u16 moveId = ScriptReadHalfword(ctx);\n\n    gSpecialVar_Result = PARTY_SIZE;\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL);\n        if (!species)\n            break;\n        if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && MonKnowsMove(&gPlayerParty[i], moveId) == TRUE)\n        {\n            gSpecialVar_Result = i;\n            gSpecialVar_0x8004 = species;\n            break;\n        }\n    }\n    return FALSE;\n}\n\nbool8 ScrCmd_addmoney(struct ScriptContext * ctx)\n{\n    u32 amount = ScriptReadWord(ctx);\n    u8 ignore = ScriptReadByte(ctx);\n\n    if (!ignore)\n        AddMoney(&gSaveBlock1Ptr->money, amount);\n    return FALSE;\n}\n\nbool8 ScrCmd_removemoney(struct ScriptContext * ctx)\n{\n    u32 amount = ScriptReadWord(ctx);\n    u8 ignore = ScriptReadByte(ctx);\n\n    if (!ignore)\n        RemoveMoney(&gSaveBlock1Ptr->money, amount);\n    return FALSE;\n}\n\nbool8 ScrCmd_checkmoney(struct ScriptContext * ctx)\n{\n    u32 amount = ScriptReadWord(ctx);\n    u8 ignore = ScriptReadByte(ctx);\n\n    if (!ignore)\n        gSpecialVar_Result = IsEnoughMoney(&gSaveBlock1Ptr->money, amount);\n    return FALSE;\n}\n\nbool8 ScrCmd_showmoneybox(struct ScriptContext * ctx)\n{\n    u8 x = ScriptReadByte(ctx);\n    u8 y = ScriptReadByte(ctx);\n    u8 ignore = ScriptReadByte(ctx);\n\n    if (!ignore && QL_AvoidDisplay(QL_DestroyAbortedDisplay) != TRUE)\n        DrawMoneyBox(GetMoney(&gSaveBlock1Ptr->money), x, y);\n    return FALSE;\n}\n\nbool8 ScrCmd_hidemoneybox(struct ScriptContext * ctx)\n{\n    /*u8 x = ScriptReadByte(ctx);\n    u8 y = ScriptReadByte(ctx);*/\n\n    HideMoneyBox();\n    return FALSE;\n}\n\nbool8 ScrCmd_updatemoneybox(struct ScriptContext * ctx)\n{\n    u8 x = ScriptReadByte(ctx);\n    u8 y = ScriptReadByte(ctx);\n    u8 ignore = ScriptReadByte(ctx);\n\n    if (!ignore)\n        ChangeAmountInMoneyBox(GetMoney(&gSaveBlock1Ptr->money));\n    return FALSE;\n}\n\nbool8 ScrCmd_showcoinsbox(struct ScriptContext * ctx)\n{\n    u8 x = ScriptReadByte(ctx);\n    u8 y = ScriptReadByte(ctx);\n\n    if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) != TRUE)\n        ShowCoinsWindow(GetCoins(), x, y);\n    return FALSE;\n}\n\nbool8 ScrCmd_hidecoinsbox(struct ScriptContext * ctx)\n{\n    u8 x = ScriptReadByte(ctx);\n    u8 y = ScriptReadByte(ctx);\n\n    HideCoinsWindow();\n    return FALSE;\n}\n\nbool8 ScrCmd_updatecoinsbox(struct ScriptContext * ctx)\n{\n    u8 x = ScriptReadByte(ctx);\n    u8 y = ScriptReadByte(ctx);\n\n    PrintCoinsString(GetCoins());\n    return FALSE;\n}\n\nbool8 ScrCmd_trainerbattle(struct ScriptContext * ctx)\n{\n    ctx->scriptPtr = BattleSetup_ConfigureTrainerBattle(ctx->scriptPtr);\n    return FALSE;\n}\n\nbool8 ScrCmd_dotrainerbattle(struct ScriptContext * ctx)\n{\n    StartTrainerBattle();\n    return TRUE;\n}\n\nbool8 ScrCmd_gotopostbattlescript(struct ScriptContext * ctx)\n{\n    ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle();\n    return FALSE;\n}\n\nbool8 ScrCmd_gotobeatenscript(struct ScriptContext * ctx)\n{\n    ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript();\n    return FALSE;\n}\n\nbool8 ScrCmd_checktrainerflag(struct ScriptContext * ctx)\n{\n    u16 index = VarGet(ScriptReadHalfword(ctx));\n\n    ctx->comparisonResult = HasTrainerBeenFought(index);\n    return FALSE;\n}\n\nbool8 ScrCmd_settrainerflag(struct ScriptContext * ctx)\n{\n    u16 index = VarGet(ScriptReadHalfword(ctx));\n\n    SetTrainerFlag(index);\n    return FALSE;\n}\n\nbool8 ScrCmd_cleartrainerflag(struct ScriptContext * ctx)\n{\n    u16 index = VarGet(ScriptReadHalfword(ctx));\n\n    ClearTrainerFlag(index);\n    return FALSE;\n}\n\nbool8 ScrCmd_setwildbattle(struct ScriptContext * ctx)\n{\n    u16 species = ScriptReadHalfword(ctx);\n    u8 level = ScriptReadByte(ctx);\n    u16 item = ScriptReadHalfword(ctx);\n\n    CreateScriptedWildMon(species, level, item);\n    return FALSE;\n}\n\nbool8 ScrCmd_dowildbattle(struct ScriptContext * ctx)\n{\n    StartScriptedWildBattle();\n    ScriptContext_Stop();\n    return TRUE;\n}\n\nbool8 ScrCmd_pokemart(struct ScriptContext * ctx)\n{\n    const void *ptr = (void *)ScriptReadWord(ctx);\n\n    CreatePokemartMenu(ptr);\n    ScriptContext_Stop();\n    return TRUE;\n}\n\nbool8 ScrCmd_pokemartdecoration(struct ScriptContext * ctx)\n{\n    const void *ptr = (void *)ScriptReadWord(ctx);\n\n    CreateDecorationShop1Menu(ptr);\n    ScriptContext_Stop();\n    return TRUE;\n}\n\n// Changes clerk dialogue slightly from above. See MART_TYPE_DECOR2\nbool8 ScrCmd_pokemartdecoration2(struct ScriptContext * ctx)\n{\n    const void *ptr = (void *)ScriptReadWord(ctx);\n\n    CreateDecorationShop2Menu(ptr);\n    ScriptContext_Stop();\n    return TRUE;\n}\n\nbool8 ScrCmd_playslotmachine(struct ScriptContext * ctx)\n{\n    u8 slotMachineIndex = VarGet(ScriptReadHalfword(ctx));\n\n    PlaySlotMachine(slotMachineIndex, CB2_ReturnToFieldContinueScriptPlayMapMusic);\n    ScriptContext_Stop();\n    return TRUE;\n}\n\nbool8 ScrCmd_setberrytree(struct ScriptContext * ctx)\n{\n//    u8 treeId = ScriptReadByte(ctx);\n//    u8 berry = ScriptReadByte(ctx);\n//    u8 growthStage = ScriptReadByte(ctx);\n//\n//    if (berry == 0)\n//        PlantBerryTree(treeId, berry, growthStage, FALSE);\n//    else\n//        PlantBerryTree(treeId, berry, growthStage, FALSE);\n    return FALSE;\n}\n\nbool8 ScrCmd_getpokenewsactive(struct ScriptContext * ctx)\n{\n//    u16 value = VarGet(ScriptReadHalfword(ctx));\n//\n//    gSpecialVar_Result = GetPriceReduction(value);\n    return FALSE;\n}\n\nbool8 ScrCmd_choosecontestmon(struct ScriptContext * ctx)\n{\n//    ChooseContestMon();\n    ScriptContext_Stop();\n    return TRUE;\n}\n\n\nbool8 ScrCmd_startcontest(struct ScriptContext * ctx)\n{\n//    StartContest();\n//    ScriptContext_Stop();\n//    return TRUE;\n    return FALSE;\n}\n\nbool8 ScrCmd_showcontestresults(struct ScriptContext * ctx)\n{\n//    ShowContestResults();\n//    ScriptContext_Stop();\n//    return TRUE;\n    return FALSE;\n}\n\nbool8 ScrCmd_contestlinktransfer(struct ScriptContext * ctx)\n{\n//    ContestLinkTransfer(gSpecialVar_ContestCategory);\n//    ScriptContext_Stop();\n//    return TRUE;\n    return FALSE;\n}\n\nbool8 ScrCmd_dofieldeffect(struct ScriptContext * ctx)\n{\n    u16 effectId = VarGet(ScriptReadHalfword(ctx));\n\n    sFieldEffectScriptId = effectId;\n    FieldEffectStart(sFieldEffectScriptId);\n    return FALSE;\n}\n\nbool8 ScrCmd_setfieldeffectargument(struct ScriptContext * ctx)\n{\n    u8 argNum = ScriptReadByte(ctx);\n\n    gFieldEffectArguments[argNum] = (s16)VarGet(ScriptReadHalfword(ctx));\n    return FALSE;\n}\n\nstatic bool8 WaitForFieldEffectFinish(void)\n{\n    if (!FieldEffectActiveListContains(sFieldEffectScriptId))\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 ScrCmd_waitfieldeffect(struct ScriptContext * ctx)\n{\n    sFieldEffectScriptId = VarGet(ScriptReadHalfword(ctx));\n    SetupNativeScript(ctx, WaitForFieldEffectFinish);\n    return TRUE;\n}\n\nbool8 ScrCmd_setrespawn(struct ScriptContext * ctx)\n{\n    u16 healLocationId = VarGet(ScriptReadHalfword(ctx));\n\n    SetLastHealLocationWarp(healLocationId);\n    return FALSE;\n}\n\nbool8 ScrCmd_checkplayergender(struct ScriptContext * ctx)\n{\n    gSpecialVar_Result = gSaveBlock2Ptr->playerGender;\n    return FALSE;\n}\n\nbool8 ScrCmd_playmoncry(struct ScriptContext * ctx)\n{\n    u16 species = VarGet(ScriptReadHalfword(ctx));\n    u16 mode = VarGet(ScriptReadHalfword(ctx));\n\n    PlayCry_Script(species, mode);\n    return FALSE;\n}\n\nbool8 ScrCmd_waitmoncry(struct ScriptContext * ctx)\n{\n    SetupNativeScript(ctx, IsCryFinished);\n    return TRUE;\n}\n\nbool8 ScrCmd_setmetatile(struct ScriptContext * ctx)\n{\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n    u16 metatileId = VarGet(ScriptReadHalfword(ctx));\n    bool16 isImpassable = VarGet(ScriptReadHalfword(ctx));\n\n    x += MAP_OFFSET;\n    y += MAP_OFFSET;\n    if (!isImpassable)\n        MapGridSetMetatileIdAt(x, y, metatileId);\n    else\n        MapGridSetMetatileIdAt(x, y, metatileId | MAPGRID_COLLISION_MASK);\n    return FALSE;\n}\n\nbool8 ScrCmd_opendoor(struct ScriptContext * ctx)\n{\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    x += MAP_OFFSET;\n    y += MAP_OFFSET;\n    PlaySE(GetDoorSoundEffect(x, y));\n    FieldAnimateDoorOpen(x, y);\n    return FALSE;\n}\n\nbool8 ScrCmd_closedoor(struct ScriptContext * ctx)\n{\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    x += MAP_OFFSET;\n    y += MAP_OFFSET;\n    FieldAnimateDoorClose(x, y);\n    return FALSE;\n}\n\nstatic bool8 IsDoorAnimationStopped(void)\n{\n    if (!FieldIsDoorAnimationRunning())\n        return TRUE;\n    else\n        return FALSE;\n}\n\nbool8 ScrCmd_waitdooranim(struct ScriptContext * ctx)\n{\n    SetupNativeScript(ctx, IsDoorAnimationStopped);\n    return TRUE;\n}\n\nbool8 ScrCmd_setdooropen(struct ScriptContext * ctx)\n{\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    x += MAP_OFFSET;\n    y += MAP_OFFSET;\n    FieldSetDoorOpened(x, y);\n    return FALSE;\n}\n\nbool8 ScrCmd_setdoorclosed(struct ScriptContext * ctx)\n{\n    u16 x = VarGet(ScriptReadHalfword(ctx));\n    u16 y = VarGet(ScriptReadHalfword(ctx));\n\n    x += MAP_OFFSET;\n    y += MAP_OFFSET;\n    FieldSetDoorClosed(x, y);\n    return FALSE;\n}\n\nbool8 ScrCmd_addelevmenuitem(struct ScriptContext * ctx)\n{\n//    u8 v3 = ScriptReadByte(ctx);\n//    u16 v5 = VarGet(ScriptReadHalfword(ctx));\n//    u16 v7 = VarGet(ScriptReadHalfword(ctx));\n//    u16 v9 = VarGet(ScriptReadHalfword(ctx));\n\n    //ScriptAddElevatorMenuItem(v3, v5, v7, v9);\n    return FALSE;\n}\n\nbool8 ScrCmd_showelevmenu(struct ScriptContext * ctx)\n{\n    /*ScriptShowElevatorMenu();\n    ScriptContext_Stop();\n    return TRUE;*/\n    return FALSE;\n}\n\nbool8 ScrCmd_checkcoins(struct ScriptContext * ctx)\n{\n    u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));\n    *ptr = GetCoins();\n    return FALSE;\n}\n\nbool8 ScrCmd_addcoins(struct ScriptContext * ctx)\n{\n    u16 coins = VarGet(ScriptReadHalfword(ctx));\n\n    if (AddCoins(coins) == TRUE)\n        gSpecialVar_Result = FALSE;\n    else\n        gSpecialVar_Result = TRUE;\n    return FALSE;\n}\n\nbool8 ScrCmd_removecoins(struct ScriptContext * ctx)\n{\n    u16 coins = VarGet(ScriptReadHalfword(ctx));\n\n    if (RemoveCoins(coins) == TRUE)\n        gSpecialVar_Result = FALSE;\n    else\n        gSpecialVar_Result = TRUE;\n    return FALSE;\n}\n\nbool8 ScrCmd_signmsg(struct ScriptContext * ctx)\n{\n    MsgSetSignpost();\n    return FALSE;\n}\n\nbool8 ScrCmd_normalmsg(struct ScriptContext * ctx)\n{\n    MsgSetNotSignpost();\n    return FALSE;\n}\n\n// This command will set a Pokémon's modernFatefulEncounter bit; there is no similar command to clear it.\nbool8 ScrCmd_setmonmodernfatefulencounter(struct ScriptContext * ctx)\n{\n    bool8 isModernFatefulEncounter = TRUE;\n    u16 partyIndex = VarGet(ScriptReadHalfword(ctx));\n\n    SetMonData(&gPlayerParty[partyIndex], MON_DATA_MODERN_FATEFUL_ENCOUNTER, &isModernFatefulEncounter);\n    return FALSE;\n}\n\nbool8 ScrCmd_checkmonmodernfatefulencounter(struct ScriptContext * ctx)\n{\n    u16 partyIndex = VarGet(ScriptReadHalfword(ctx));\n\n    gSpecialVar_Result = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MODERN_FATEFUL_ENCOUNTER, NULL);\n    return FALSE;\n}\n\nbool8 ScrCmd_setmonmetlocation(struct ScriptContext * ctx)\n{\n    u16 partyIndex = VarGet(ScriptReadHalfword(ctx));\n    u8 location = ScriptReadByte(ctx);\n\n    if (partyIndex < PARTY_SIZE)\n        SetMonData(&gPlayerParty[partyIndex], MON_DATA_MET_LOCATION, &location);\n    return FALSE;\n}\n\nbool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx)\n{\n    u8 mode = ScriptReadByte(ctx);\n\n    switch (mode)\n    {\n        case FADE_TO_BLACK:\n        case FADE_TO_WHITE:   \n        default:\n            CpuCopy32(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_SIZE);\n            FadeScreen(mode, 0);\n            break;\n        case FADE_FROM_BLACK:\n        case FADE_FROM_WHITE:\n            CpuCopy32(gPaletteDecompressionBuffer, gPlttBufferUnfaded, PLTT_SIZE);\n            FadeScreen(mode, 0);\n            break;\n    }\n\n    SetupNativeScript(ctx, IsPaletteNotActive);\n    return TRUE;\n}\n\nbool8 ScrCmd_setobjectmovementtypeinstant(struct ScriptContext *ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n    u8 movementType = ScriptReadByte(ctx);\n\n    SetObjectMovementType(localId, movementType);\n    return FALSE;\n}\n\nbool8 ScrCmd_resetobjectmovementtype(struct ScriptContext * ctx)\n{\n    u16 localId = VarGet(ScriptReadHalfword(ctx));\n\n    ResetObjEventTemplateMovementType(localId);\n    return FALSE;\n}"
  },
  {
    "path": "src/script.c",
    "content": "#include \"global.h\"\n#include \"item.h\"\n#include \"field_effect_helpers.h\"\n#include \"field_specials.h\"\n#include \"event_object_movement.h\"\n#include \"item.h\"\n#include \"overworld.h\"\n#include \"pokedex.h\"\n#include \"random.h\"\n#include \"script.h\"\n#include \"sound.h\"\n#include \"strings.h\"\n#include \"string_util.h\"\n#include \"event_data.h\"\n#include \"party_menu.h\"\n#include \"pokemon_storage_system.h\"\n#include \"quest_log.h\"\n#include \"script_pokemon_util.h\"\n#include \"constants/items.h\"\n#include \"constants/map_scripts.h\"\n#include \"constants/moves.h\"\n#include \"constants/region_map_sections.h\"\n#include \"mystery_gift.h\"\n#include \"constants/maps.h\"\n#include \"constants/map_scripts.h\"\n\nextern void ResetContextNpcTextColor(void); // field_specials\nextern u16 CalcCRC16WithTable(u8 *data, int length); // util\n\n#define RAM_SCRIPT_MAGIC 51\n\nenum {\n    SCRIPT_MODE_STOPPED,\n    SCRIPT_MODE_BYTECODE,\n    SCRIPT_MODE_NATIVE,\n};\n\nenum {\n    CONTEXT_RUNNING,\n    CONTEXT_WAITING,\n    CONTEXT_SHUTDOWN,\n};\n\nEWRAM_DATA u8 gWalkAwayFromSignInhibitTimer = 0;\nEWRAM_DATA const u8 *gRamScriptRetAddr = NULL;\n\nstatic u8 sGlobalScriptContextStatus;\nstatic u32 sUnusedVariable1;\nstatic struct ScriptContext sGlobalScriptContext;\nstatic u32 sUnusedVariable2;\nstatic struct ScriptContext sImmediateScriptContext;\nstatic bool8 sLockFieldControls;\nstatic u8 sMsgBoxWalkawayDisabled;\nstatic u8 sMsgBoxIsCancelable;\nstatic u8 sQuestLogInput;\nstatic u8 sQuestLogInputIsDpad;\nstatic u8 sMsgIsSignpost;\n\nextern ScrCmdFunc gScriptCmdTable[];\nextern ScrCmdFunc gScriptCmdTableEnd[];\nextern void *gNullScriptPtr;\n\nvoid InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd)\n{\n    s32 i;\n\n    ctx->mode = SCRIPT_MODE_STOPPED;\n    ctx->scriptPtr = NULL;\n    ctx->stackDepth = 0;\n    ctx->nativePtr = NULL;\n    ctx->cmdTable = cmdTable;\n    ctx->cmdTableEnd = cmdTableEnd;\n\n    for (i = 0; i < (int)ARRAY_COUNT(ctx->data); i++)\n        ctx->data[i] = 0;\n\n    for (i = 0; i < (int)ARRAY_COUNT(ctx->stack); i++)\n        ctx->stack[i] = 0;\n}\n\nu8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr)\n{\n    ctx->scriptPtr = ptr;\n    ctx->mode = SCRIPT_MODE_BYTECODE;\n    return 1;\n}\n\nvoid SetupNativeScript(struct ScriptContext *ctx, bool8 (*ptr)(void))\n{\n    ctx->mode = SCRIPT_MODE_NATIVE;\n    ctx->nativePtr = ptr;\n}\n\nvoid StopScript(struct ScriptContext *ctx)\n{\n    ctx->mode = SCRIPT_MODE_STOPPED;\n    ctx->scriptPtr = NULL;\n}\n\nbool8 RunScriptCommand(struct ScriptContext *ctx)\n{\n    // FRLG disabled this check, where-as it is present\n    // in Ruby/Sapphire and Emerald. Why did the programmers\n    // bother to remove a redundant check when it still\n    // exists in Emerald?\n    //if (ctx->mode == SCRIPT_MODE_STOPPED)\n    //    return FALSE;\n\n    switch (ctx->mode)\n    {\n    case SCRIPT_MODE_STOPPED:\n        return FALSE;\n    case SCRIPT_MODE_NATIVE:\n        // Try to call a function in C\n        // Continue to bytecode if no function or it returns TRUE\n        if (ctx->nativePtr)\n        {\n            if (ctx->nativePtr() == TRUE)\n                ctx->mode = SCRIPT_MODE_BYTECODE;\n            return TRUE;\n        }\n        ctx->mode = SCRIPT_MODE_BYTECODE;\n        // fallthrough\n    case SCRIPT_MODE_BYTECODE:\n        while (1)\n        {\n            u8 cmdCode;\n            ScrCmdFunc *cmdFunc;\n\n            if (ctx->scriptPtr == NULL)\n            {\n                ctx->mode = SCRIPT_MODE_STOPPED;\n                return FALSE;\n            }\n\n            if (ctx->scriptPtr == gNullScriptPtr)\n            {\n                while (1)\n                    asm(\"svc 2\"); // HALT\n            }\n\n            cmdCode = *(ctx->scriptPtr);\n            ctx->scriptPtr++;\n            cmdFunc = &ctx->cmdTable[cmdCode];\n\n            if (cmdFunc >= ctx->cmdTableEnd)\n            {\n                ctx->mode = SCRIPT_MODE_STOPPED;\n                return FALSE;\n            }\n\n            if ((*cmdFunc)(ctx) == TRUE)\n                return TRUE;\n        }\n    }\n\n    return TRUE;\n}\n\nstatic u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr)\n{\n    if (ctx->stackDepth + 1 >= (int)ARRAY_COUNT(ctx->stack))\n    {\n        return 1;\n    }\n    else\n    {\n        ctx->stack[ctx->stackDepth] = ptr;\n        ctx->stackDepth++;\n        return 0;\n    }\n}\n\nstatic const u8 *ScriptPop(struct ScriptContext *ctx)\n{\n    if (ctx->stackDepth == 0)\n        return NULL;\n\n    ctx->stackDepth--;\n    return ctx->stack[ctx->stackDepth];\n}\n\nvoid ScriptJump(struct ScriptContext *ctx, const u8 *ptr)\n{\n    ctx->scriptPtr = ptr;\n}\n\nvoid ScriptCall(struct ScriptContext *ctx, const u8 *ptr)\n{\n    ScriptPush(ctx, ctx->scriptPtr);\n    ctx->scriptPtr = ptr;\n}\n\nvoid ScriptReturn(struct ScriptContext *ctx)\n{\n    ctx->scriptPtr = ScriptPop(ctx);\n}\n\nu16 ScriptReadHalfword(struct ScriptContext *ctx)\n{\n    u16 value = *(ctx->scriptPtr++);\n    value |= *(ctx->scriptPtr++) << 8;\n    return value;\n}\n\nu32 ScriptReadWord(struct ScriptContext *ctx)\n{\n    u32 value0 = *(ctx->scriptPtr++);\n    u32 value1 = *(ctx->scriptPtr++);\n    u32 value2 = *(ctx->scriptPtr++);\n    u32 value3 = *(ctx->scriptPtr++);\n    return (((((value3 << 8) + value2) << 8) + value1) << 8) + value0;\n}\n\nvoid LockPlayerFieldControls(void)\n{\n    sLockFieldControls = TRUE;\n}\n\nvoid UnlockPlayerFieldControls(void)\n{\n    sLockFieldControls = FALSE;\n}\n\nbool8 ArePlayerFieldControlsLocked(void)\n{\n    return sLockFieldControls;\n}\n\nvoid SetQuestLogInputIsDpadFlag(void)\n{\n    sQuestLogInputIsDpad = TRUE;\n}\n\nvoid ClearQuestLogInputIsDpadFlag(void)\n{\n    sQuestLogInputIsDpad = FALSE;\n}\n\nbool8 IsQuestLogInputDpad(void)\n{\n    if(sQuestLogInputIsDpad == TRUE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid RegisterQuestLogInput(u8 var)\n{\n    sQuestLogInput = var;\n}\n\nvoid ClearQuestLogInput(void)\n{\n    sQuestLogInput = 0;\n}\n\nu8 GetRegisteredQuestLogInput(void)\n{\n    return sQuestLogInput;\n}\n\nvoid DisableMsgBoxWalkaway(void)\n{\n    sMsgBoxWalkawayDisabled = TRUE;\n}\n\nvoid EnableMsgBoxWalkaway(void)\n{\n    sMsgBoxWalkawayDisabled = FALSE;\n}\n\nbool8 IsMsgBoxWalkawayDisabled(void)\n{\n    return sMsgBoxWalkawayDisabled;\n}\n\nvoid SetWalkingIntoSignVars(void)\n{\n    gWalkAwayFromSignInhibitTimer = 6;\n    sMsgBoxIsCancelable = TRUE;\n}\n\nvoid ClearMsgBoxCancelableState(void)\n{\n    sMsgBoxIsCancelable = FALSE;\n}\n\nbool8 CanWalkAwayToCancelMsgBox(void)\n{\n    if(sMsgBoxIsCancelable == TRUE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid MsgSetSignpost(void)\n{\n    sMsgIsSignpost = TRUE;\n}\n\nvoid MsgSetNotSignpost(void)\n{\n    sMsgIsSignpost = FALSE;\n}\n\nbool8 IsMsgSignpost(void)\n{\n    if(sMsgIsSignpost == TRUE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid ResetFacingNpcOrSignpostVars(void)\n{\n    ResetContextNpcTextColor();\n    MsgSetNotSignpost();\n}\n\n// The ScriptContext_* functions work with the primary script context,\n// which yields control back to native code should the script make a wait call.\n\n// Checks if the global script context is able to be run right now.\nbool8 ScriptContext_IsEnabled(void)\n{\n    if (sGlobalScriptContextStatus == CONTEXT_RUNNING)\n        return TRUE;\n    else\n        return FALSE;\n}\n\n// Re-initializes the global script context to zero.\nvoid ScriptContext_Init(void)\n{\n    InitScriptContext(&sGlobalScriptContext, gScriptCmdTable, gScriptCmdTableEnd);\n    sGlobalScriptContextStatus = CONTEXT_SHUTDOWN;\n}\n\n// Runs the script until the script makes a wait* call, then returns true if \n// there's more script to run, or false if the script has hit the end. \n// This function also returns false if the context is finished \n// or waiting (after a call to _Stop)\nbool8 ScriptContext_RunScript(void)\n{\n    if (sGlobalScriptContextStatus == CONTEXT_SHUTDOWN)\n        return FALSE;\n\n    if (sGlobalScriptContextStatus == CONTEXT_WAITING)\n        return FALSE;\n\n    LockPlayerFieldControls();\n\n    if (!RunScriptCommand(&sGlobalScriptContext))\n    {\n        sGlobalScriptContextStatus = CONTEXT_SHUTDOWN;\n        UnlockPlayerFieldControls();\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\n// Sets up a new script in the global context and enables the context\nvoid ScriptContext_SetupScript(const u8 *ptr)\n{\n    ClearMsgBoxCancelableState();\n    EnableMsgBoxWalkaway();\n    ClearQuestLogInputIsDpadFlag();\n\n    InitScriptContext(&sGlobalScriptContext, gScriptCmdTable, gScriptCmdTableEnd);\n    SetupBytecodeScript(&sGlobalScriptContext, ptr);\n    LockPlayerFieldControls();\n    sGlobalScriptContextStatus = CONTEXT_RUNNING;\n}\n\n// Puts the script into waiting mode; usually called from a wait* script command.\nvoid ScriptContext_Stop(void)\n{\n    sGlobalScriptContextStatus = CONTEXT_WAITING;\n}\n\n// Puts the script into running mode.\nvoid ScriptContext_Enable(void)\n{\n    sGlobalScriptContextStatus = CONTEXT_RUNNING;\n    LockPlayerFieldControls();\n}\n\n// Sets up and runs a script in its own context immediately. The script will be\n// finished when this function returns. Used mainly by all of the map header\n// scripts (except the frame table scripts).\nvoid RunScriptImmediately(const u8 *ptr)\n{\n    InitScriptContext(&sImmediateScriptContext, &gScriptCmdTable, &gScriptCmdTableEnd);\n    SetupBytecodeScript(&sImmediateScriptContext, ptr);\n    while (RunScriptCommand(&sImmediateScriptContext) == TRUE);\n}\n\nstatic u8 *MapHeaderGetScriptTable(u8 tag)\n{\n    const u8 *mapScripts = gMapHeader.mapScripts;\n\n    if (mapScripts == NULL)\n        return NULL;\n\n    while (1)\n    {\n        if (*mapScripts == 0)\n            return NULL;\n        if (*mapScripts == tag)\n        {\n            mapScripts++;\n            return T2_READ_PTR(mapScripts);\n        }\n        mapScripts += 5;\n    }\n}\n\nstatic void MapHeaderRunScriptType(u8 tag)\n{\n    u8 *ptr = MapHeaderGetScriptTable(tag);\n    if (ptr != NULL)\n        RunScriptImmediately(ptr);\n}\n\nstatic u8 *MapHeaderCheckScriptTable(u8 tag)\n{\n    u8 *ptr = MapHeaderGetScriptTable(tag);\n\n    if (ptr == NULL)\n        return NULL;\n\n    while (1)\n    {\n        u16 varIndex1;\n        u16 varIndex2;\n\n        // Read first var (or .2byte terminal value)\n        varIndex1 = T1_READ_16(ptr);\n        if (!varIndex1)\n            return NULL; // Reached end of table\n        ptr += 2;\n\n        // Read second var\n        varIndex2 = T1_READ_16(ptr);\n        ptr += 2;\n\n        // Run map script if vars are equal\n        if (VarGet(varIndex1) == VarGet(varIndex2))\n            return T2_READ_PTR(ptr);\n        ptr += 4;\n    }\n}\n\nvoid RunOnLoadMapScript(void)\n{\n    MapHeaderRunScriptType(MAP_SCRIPT_ON_LOAD);\n}\n\nvoid RunOnTransitionMapScript(void)\n{\n    MapHeaderRunScriptType(MAP_SCRIPT_ON_TRANSITION);\n}\n\nvoid RunOnResumeMapScript(void)\n{\n    FlagClear(FLAG_SYS_ON_RESUME);\n    MapHeaderRunScriptType(MAP_SCRIPT_ON_RESUME);\n}\n\nvoid RunOnReturnToFieldMapScript(void)\n{\n    MapHeaderRunScriptType(MAP_SCRIPT_ON_RETURN_TO_FIELD);\n}\n\nvoid RunOnDiveWarpMapScript(void)\n{\n    MapHeaderRunScriptType(MAP_SCRIPT_ON_DIVE_WARP);\n}\n\nbool8 TryRunOnFrameMapScript(void)\n{\n    u8 *ptr;\n\n    if (gQuestLogState == QL_STATE_PLAYBACK_LAST)\n        return FALSE;\n\n    ptr = MapHeaderCheckScriptTable(MAP_SCRIPT_ON_FRAME_TABLE);\n\n    if (!ptr)\n        return FALSE;\n\n    ScriptContext_SetupScript(ptr);\n    return TRUE;\n}\n\nvoid TryRunOnWarpIntoMapScript(void)\n{\n    u8 *ptr = MapHeaderCheckScriptTable(MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE);\n    if (ptr)\n        RunScriptImmediately(ptr);\n}\n\nu32 CalculateRamScriptChecksum(void)\n{\n    return CalcCRC16WithTable((u8 *)(&gSaveBlock1Ptr->ramScript.data), sizeof(gSaveBlock1Ptr->ramScript.data));\n}\n\nvoid ClearRamScript(void)\n{\n    CpuFill32(0, &gSaveBlock1Ptr->ramScript, sizeof(struct RamScript));\n}\n\nbool8 InitRamScript(u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 objectId)\n{\n    struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data;\n\n    ClearRamScript();\n\n    if (scriptSize > sizeof(scriptData->script))\n        return FALSE;\n\n    scriptData->magic = RAM_SCRIPT_MAGIC;\n    scriptData->mapGroup = mapGroup;\n    scriptData->mapNum = mapNum;\n    scriptData->objectId = objectId;\n    memcpy(scriptData->script, script, scriptSize);\n    gSaveBlock1Ptr->ramScript.checksum = CalculateRamScriptChecksum();\n    return TRUE;\n}\n\nconst u8 *GetRamScript(u8 objectId, const u8 *script)\n{\n    struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data;\n    gRamScriptRetAddr = NULL;\n    if (scriptData->magic != RAM_SCRIPT_MAGIC)\n        return script;\n    if (scriptData->mapGroup != gSaveBlock1Ptr->location.mapGroup)\n        return script;\n    if (scriptData->mapNum != gSaveBlock1Ptr->location.mapNum)\n        return script;\n    if (scriptData->objectId != objectId)\n        return script;\n    if (CalculateRamScriptChecksum() != gSaveBlock1Ptr->ramScript.checksum)\n    {\n        ClearRamScript();\n        return script;\n    }\n    else\n    {\n        gRamScriptRetAddr = script;\n        return scriptData->script;\n    }\n}\n\nbool32 ValidateRamScript(void)\n{\n    struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data;\n    if (scriptData->magic != RAM_SCRIPT_MAGIC)\n        return FALSE;\n    if (scriptData->mapGroup != MAP_GROUP(UNDEFINED))\n        return FALSE;\n    if (scriptData->mapNum != MAP_NUM(UNDEFINED))\n        return FALSE;\n    if (scriptData->objectId != 0xFF)\n        return FALSE;\n    if (CalculateRamScriptChecksum() != gSaveBlock1Ptr->ramScript.checksum)\n        return FALSE;\n    return TRUE;\n}\n\nu8 *GetSavedRamScriptIfValid(void)\n{\n    struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data;\n    if (!ValidateSavedWonderCard())\n        return NULL;\n    if (scriptData->magic != RAM_SCRIPT_MAGIC)\n        return NULL;\n    if (scriptData->mapGroup != MAP_GROUP(UNDEFINED))\n        return NULL;\n    if (scriptData->mapNum != MAP_NUM(UNDEFINED))\n        return NULL;\n    if (scriptData->objectId != 0xFF)\n        return NULL;\n    if (CalculateRamScriptChecksum() != gSaveBlock1Ptr->ramScript.checksum)\n    {\n        ClearRamScript();\n        return NULL;\n    }\n    else\n    {\n        return scriptData->script;\n    }\n}\n\nvoid InitRamScript_NoObjectEvent(u8 *script, u16 scriptSize)\n{\n    if (scriptSize > sizeof(gSaveBlock1Ptr->ramScript.data.script))\n        scriptSize = sizeof(gSaveBlock1Ptr->ramScript.data.script);\n    InitRamScript(script, scriptSize, MAP_GROUP(UNDEFINED), MAP_NUM(UNDEFINED), 0xFF);\n}\n\nvoid GetStartingLevelOfRoute5DaycareMon(void)\n{\n    ConvertIntToDecimalStringN(gStringVar3, GetLevelFromBoxMonExp(&gSaveBlock1Ptr->route5DayCareMon.mon), STR_CONV_MODE_LEFT_ALIGN, 2);\n}\n\nvoid CheckCurrentMasterTitle(void)\n{\n    gSpecialVar_Result = gSaveBlock1Ptr->masterTrainerTitle;\n}\n\nvoid SetCurrentMasterTitle(void)\n{\n    gSaveBlock1Ptr->masterTrainerTitle = gSpecialVar_Result;\n}\n\nvoid CheckHasAnyMasterTitle(void)\n{\n    u32 i;\n    bool8 flag = TRUE;\n\n    if(gSaveBlock1Ptr->masterTrainerTitle != 0)\n    {\n        gSpecialVar_Result = TRUE;\n        return;\n    }\n\n    for(i = 1; i < 152; i++) //flags start at 1, which is SPECIES_BULBASAUR\n    {\n        flag = CheckMasterTrainerFlag(i);\n        if(flag)\n        {\n            gSpecialVar_Result = TRUE;\n            return;\n        }\n    }\n    gSpecialVar_Result = FALSE;\n}\n\nvoid CheckAllMasterTrainerFlags(void)\n{\n    u32 i;\n    bool8 flag = TRUE;\n\n    for(i = 1; i < 152; i++) //flags start at 1, which is SPECIES_BULBASAUR\n    {\n        flag = CheckMasterTrainerFlag(i);\n        if(!flag)\n        {\n            gSpecialVar_Result = FALSE;\n            return;\n        }\n    }\n    gSpecialVar_Result = TRUE;\n}\n\nvoid ShouldChangeMasterTrainerMovementType(void)\n{\n    gSpecialVar_Result = CheckMasterTrainerFlag(gSpecialVar_0x8009);\n}\n\nvoid ClearAllButFirstPokemon(void)\n{\n    u32 i;\n    for (i = 1; i < PARTY_SIZE; i++)\n        ZeroMonData(&gPlayerParty[i]);\n}\n\nvoid CheckSlot1EVTotal(void)\n{\n    u8 evs[NUM_STATS];\n    u16 totalEVs = 0;\n    u32 i;\n\n    for (i = 0; i < NUM_STATS; i++)\n    {\n        evs[i] = GetMonData(&gPlayerParty[0], MON_DATA_HP_EV + i, NULL);\n        totalEVs += evs[i];\n    }\n\n    if(totalEVs >= 100)\n        gSpecialVar_Result = TRUE;\n    else\n        gSpecialVar_Result = FALSE;\n}\n\nvoid CheckMasterPokemonInSlot1(void)\n{\n    if(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES_OR_EGG, NULL) == gSpecialVar_0x8009)\n        gSpecialVar_Result = TRUE;\n    else\n        gSpecialVar_Result = FALSE;\n\n    //loading a or an into STR_VAR_3 for certain Pokemon...\n    switch(gSpecialVar_0x8009)\n    {\n        case SPECIES_IVYSAUR:\n        case SPECIES_ODDISH:\n        case SPECIES_ARCANINE:\n        case SPECIES_EXEGGCUTE:\n        case SPECIES_EXEGGUTOR:\n        case SPECIES_EEVEE:\n            StringCopy(gStringVar3, gText_An);\n            break;\n        default:\n            StringCopy(gStringVar3, gText_A);\n            break;\n    }\n}\n\nvoid ShouldSpawnSoftlockClerk(void)\n{\n    gSpecialVar_Result = CheckAssetsForSoftlock();\n}\n\nvoid HideWarpArrowSprite(void)\n{\n    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];\n    SetSpriteInvisible(playerObjEvent->warpArrowSpriteId);\n}\n\nvoid CoordsOfPMCExitWarpTo80068007(void)\n{\n    switch(gMapHeader.regionMapSectionId)\n    {\n        case MAPSEC_INDIGO_PLATEAU:\n            gSpecialVar_0x8006 = 11;\n            gSpecialVar_0x8007 = 16;\n            return;\n        case MAPSEC_ONE_ISLAND:\n            gSpecialVar_0x8006 = 9;\n            gSpecialVar_0x8007 = 9;\n            return;\n        default:\n            gSpecialVar_0x8006 = 7;\n            gSpecialVar_0x8007 = 8;\n            return;\n    }\n}\n\nvoid HasNationalMonToVarResult(void)\n{\n    gSpecialVar_Result = HasNationalMon();\n}\n\nvoid TeachTrappedTentacoolSurf(void)\n{\n    u32 i;\n    u32 move = MOVE_SURF;\n    u32 pp = 15;\n    if(gSpecialVar_0x8007 == 0) //party\n    {\n        i = CalculatePlayerPartyCount() - 1;\n        SetMonData(&gPlayerParty[i], MON_DATA_MOVE4, &move);\n        SetMonData(&gPlayerParty[i], MON_DATA_PP1 + 3, &pp);\n        return;\n    }\n    else //box\n    {\n        SetBoxMonDataAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, MON_DATA_MOVE4, &move);\n        SetBoxMonDataAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, MON_DATA_PP1 + 3, &pp);\n        return;\n    }\n}\n\nvoid CheckPlayerTrappedOnCinnabar(void)\n{\n    bool32 hasHM03 = CheckBagHasItem(ITEM_HM03, 1);\n    u32 i, j;\n\n    for (i = 0; i < PARTY_SIZE; i++) {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE) {\n            break;\n        } else {\n            struct Pokemon* partyMon = &gPlayerParty[i];\n            if (!GetMonData(partyMon, MON_DATA_IS_EGG) && MonKnowsMove(partyMon, MOVE_SURF)) {\n                gSpecialVar_Result = 0;\n                return;\n            }\n            if (hasHM03 && CanMonLearnTMHM(partyMon, ITEM_HM03 - ITEM_TM01_FOCUS_PUNCH)) {\n                gSpecialVar_Result = 0;\n                return;\n            }\n        }\n    }\n\n    for (i = 0; i < TOTAL_BOXES_COUNT; i++) {\n        for (j = 0; j < IN_BOX_COUNT; j++) {\n            if (GetBoxMonDataAt(i, j, MON_DATA_SPECIES) == SPECIES_NONE) {\n                continue;\n            } else {\n                struct Pokemon tempMon;\n                BoxMonToMon(GetBoxedMonPtr(i, j), &tempMon);\n                if (!GetMonData(&tempMon, MON_DATA_IS_EGG) && MonKnowsMove(&tempMon, MOVE_SURF)) {\n                    gSpecialVar_Result = 0;\n                    return;\n                }\n                if (hasHM03 && CanMonLearnTMHM(&tempMon, ITEM_HM03 - ITEM_TM01_FOCUS_PUNCH)) {\n                    gSpecialVar_Result = 0;\n                    return;\n                }\n            }\n        }\n    }\n\n    if(hasHM03)\n        gSpecialVar_Result = 1;\n    else\n        gSpecialVar_Result = 2; // need to teach Tentacool Surf\n}\n\nvoid CheckNuzlockeMode(void)\n{\n    gSpecialVar_Result = gSaveBlock1Ptr->keyFlags.nuzlocke;\n}\n\nvoid CheckNoFreeHealsMode(void)\n{\n    gSpecialVar_Result = gSaveBlock1Ptr->keyFlags.noPMC;\n}\n\n#define SET_SPEAROW_STATE 0\n#define SET_TOLD_FAMECHECKER 1\n#define SET_VISITOR_STATE 2\n#define SET_LEVEL_GROWTH 3\n#define CHECK_SPEAROW_STATE 4\n#define CHECK_TOLD_FAMECHECKER 5\n#define CHECK_VISITOR_STATE 6\n#define CHECK_LEVEL_GROWTH 7\n#define SET_BOXES_MOVED 8\n#define CHECK_BOXES_MOVED 9\n#define CHECK_ANY_VISITORS 10\n#define CHECK_ALL_TOLD 11\n#define CREATE_VISITOR_STRING 12\n\nstruct BattleHouse\n{\n    u16 spearowState:1;     //whether Spearow is gone. 0 for no, 1 for yes\n    u16 toldBrock:1;\n    u16 toldMisty:1;\n    u16 toldLtSurge:1;\n    u16 toldErika:1;\n    u16 toldKoga:1;\n    u16 toldSabrina:1;\n    u16 toldBlaine:1;       // ^^ filled out Fame Checker and told lady for person\n    // 1 byte\n    u16 boxesMoved:1;       // controls setting the layout. Happens when Spearow returns for the first time.\n    u16 visitorBrock:1;\n    u16 visitorMisty:1;\n    u16 visitorLtSurge:1;\n    u16 visitorErika:1;\n    u16 visitorKoga:1;\n    u16 visitorSabrina:1;\n    u16 visitorBlaine:1;    // ^^ visitors currently in house\n    // 1 byte, overflows into next scripting var\n    u16 spawnFails:3;       // after a Gym Leader fails to visit 6 times, this starts forcing visits\n    u16 levelGrowth:5;      // adds levels to rematch Pokemon up to level 80. Maxes at +12.\n    // 1 byte\n    u16 steps:8;            // used to bring back Spearow and bring in visitors\n};\n\nstatic bool8 AllPossibleGymLeadersPresent(void)\n{\n    struct BattleHouse* BattleHouseVar;\n    u16 *varPtr = GetVarPointer(VAR_BATTLE_HOUSE);\n    (void*) BattleHouseVar = varPtr;\n\n    if(BattleHouseVar->toldBrock && !BattleHouseVar->visitorBrock)\n    {\n        return FALSE;\n    }\n    if(BattleHouseVar->toldMisty && !BattleHouseVar->visitorMisty)\n    {\n        return FALSE;\n    }\n    if(BattleHouseVar->toldLtSurge && !BattleHouseVar->visitorLtSurge)\n    {\n        return FALSE;\n    }\n    if(BattleHouseVar->toldErika && !BattleHouseVar->visitorErika)\n    {\n        return FALSE;\n    }\n    if(BattleHouseVar->toldKoga && !BattleHouseVar->visitorKoga)\n    {\n        return FALSE;\n    }\n    if(BattleHouseVar->toldSabrina && !BattleHouseVar->visitorSabrina)\n    {\n        return FALSE;\n    }\n    if(BattleHouseVar->toldBlaine && !BattleHouseVar->visitorBlaine)\n    {\n        return FALSE;\n    }\n    return TRUE;\n}\n\nu8 ReturnBattleHouseLevel(void)\n{\n    struct BattleHouse* BattleHouseVar;\n    u16 *varPtr = GetVarPointer(VAR_BATTLE_HOUSE);\n    u8 levelGrowth;\n    (void*) BattleHouseVar = varPtr;\n\n    levelGrowth = BattleHouseVar->levelGrowth;\n\n    return levelGrowth;\n}\n\nvoid UpdateBattleHouseStepCounter(void)\n{\n    struct BattleHouse* BattleHouseVar;\n    u16 *varPtr = GetVarPointer(VAR_BATTLE_HOUSE);\n    u8 chanceOfVisit = 46;\n    (void*) BattleHouseVar = varPtr;\n\n    if(VarGet(VAR_BATTLE_HOUSE) && gMapHeader.regionMapSectionId != MAPSEC_SEVEN_ISLAND)\n    {\n        if(BattleHouseVar->steps != 255)\n            BattleHouseVar->steps++;\n        else\n        {\n            BattleHouseVar->steps++;\n            if(BattleHouseVar->spearowState && !BattleHouseVar->boxesMoved)\n            {   //Spearow left for the first time, bring it back, open basement, force first leader visit\n                BattleHouseVar->spearowState = 0;\n                BattleHouseVar->boxesMoved = 1;\n                if(BattleHouseVar->toldBrock)\n                    BattleHouseVar->visitorBrock = 1;\n                if(BattleHouseVar->toldMisty)\n                    BattleHouseVar->visitorMisty = 1;\n                if(BattleHouseVar->toldLtSurge)\n                    BattleHouseVar->visitorLtSurge = 1;\n                if(BattleHouseVar->toldErika)\n                    BattleHouseVar->visitorErika = 1;\n                if(BattleHouseVar->toldKoga)\n                    BattleHouseVar->visitorKoga = 1;\n                if(BattleHouseVar->toldSabrina)\n                    BattleHouseVar->visitorSabrina = 1;\n                if(BattleHouseVar->toldBlaine)\n                    BattleHouseVar->visitorBlaine = 1;\n                return;\n            }\n            if(BattleHouseVar->spearowState)\n            {   //Spearow left, check if it returns\n                if(Random() % 2 == 0) //50% chance\n                {\n                    BattleHouseVar->spearowState = 0;\n                }\n                return; //no new visitors while Spearow is out\n            }\n            if(!AllPossibleGymLeadersPresent() && (BattleHouseVar->spawnFails == 6 || Random() % 256 < chanceOfVisit))\n            {   //Gym Leader visiting, ~18% chance; will start forcing visits after 6 misses\n                u8 counter = 0;\n                do{\n                    u8 leader = Random() % 7;\n                    switch(leader)\n                    {\n                        case 0:\n                            if(BattleHouseVar->toldBrock && !BattleHouseVar->visitorBrock)\n                            {\n                                BattleHouseVar->visitorBrock = 1;\n                                BattleHouseVar->spawnFails = 0;\n                                return;\n                            }\n                            break;\n                        case 1:\n                            if(BattleHouseVar->toldMisty && !BattleHouseVar->visitorMisty)\n                            {\n                                BattleHouseVar->visitorMisty = 1;\n                                BattleHouseVar->spawnFails = 0;\n                                return;\n                            }\n                            break;\n                        case 2:\n                            if(BattleHouseVar->toldLtSurge && !BattleHouseVar->visitorLtSurge)\n                            {\n                                BattleHouseVar->visitorLtSurge = 1;\n                                BattleHouseVar->spawnFails = 0;\n                                return;\n                            }\n                            break;\n                        case 3:\n                            if(BattleHouseVar->toldErika && !BattleHouseVar->visitorErika)\n                            {\n                                BattleHouseVar->visitorErika = 1;\n                                BattleHouseVar->spawnFails = 0;\n                                return;\n                            }\n                            break;\n                        case 4:\n                            if(BattleHouseVar->toldKoga && !BattleHouseVar->visitorKoga)\n                            {\n                                BattleHouseVar->visitorKoga = 1;\n                                BattleHouseVar->spawnFails = 0;\n                                return;\n                            }\n                            break;\n                        case 5:\n                            if(BattleHouseVar->toldSabrina && !BattleHouseVar->visitorSabrina)\n                            {\n                                BattleHouseVar->visitorSabrina = 1;\n                                BattleHouseVar->spawnFails = 0;\n                                return;\n                            }\n                            break;\n                        case 6:\n                            if(BattleHouseVar->toldBlaine && !BattleHouseVar->visitorBlaine)\n                            {\n                                BattleHouseVar->visitorBlaine = 1;\n                                BattleHouseVar->spawnFails = 0;\n                                return;\n                            }\n                            break;\n                    }\n                    counter++;\n                }while(counter < 3 || BattleHouseVar->spawnFails >= 6); //rerolls up to 3 times if doesn't hit; forces a spawn if failed 6 times\n                if(counter == 3) //failed 3 rerolls, increment spawnFails\n                    if(BattleHouseVar->spawnFails != 7 && !AllPossibleGymLeadersPresent())\n                        BattleHouseVar->spawnFails++;\n            }\n            else\n            {\n                if(BattleHouseVar->spawnFails != 7 && !AllPossibleGymLeadersPresent())\n                    BattleHouseVar->spawnFails++;\n            }\n        }\n    }\n}\n\nvoid UseBattleHouseVar(void)\n{\n    u8 type = gSpecialVar_0x8003;\n    u8 argument = gSpecialVar_0x8004;\n    struct BattleHouse* BattleHouseVar;\n    u16 *varPtr = GetVarPointer(VAR_BATTLE_HOUSE);\n    u8 totalCount = 0;\n    u8 runningCount = 0;\n    (void*) BattleHouseVar = varPtr;\n\n    switch(type)\n    {\n        case SET_SPEAROW_STATE:\n            BattleHouseVar->spearowState ^= 1; //toggle state\n            break;\n        case SET_TOLD_FAMECHECKER:\n            switch(argument)\n            {\n                case FAMECHECKER_BROCK:\n                    BattleHouseVar->toldBrock = 1;\n                    break;\n                case FAMECHECKER_MISTY:\n                    BattleHouseVar->toldMisty = 1;\n                    break;\n                case FAMECHECKER_LTSURGE:\n                    BattleHouseVar->toldLtSurge = 1;\n                    break;\n                case FAMECHECKER_ERIKA:\n                    BattleHouseVar->toldErika = 1;\n                    break;\n                case FAMECHECKER_KOGA:\n                    BattleHouseVar->toldKoga = 1;\n                    break;\n                case FAMECHECKER_SABRINA:\n                    BattleHouseVar->toldSabrina = 1;\n                    break;\n                case FAMECHECKER_BLAINE:\n                    BattleHouseVar->toldBlaine = 1;\n                    break;\n            }\n            break;\n        case SET_VISITOR_STATE:\n            switch(argument)\n            {\n                case FAMECHECKER_BROCK:\n                    BattleHouseVar->visitorBrock ^= 1; //toggle state\n                    break;\n                case FAMECHECKER_MISTY:\n                    BattleHouseVar->visitorMisty ^= 1;\n                    break;\n                case FAMECHECKER_LTSURGE:\n                    BattleHouseVar->visitorLtSurge ^= 1;\n                    break;\n                case FAMECHECKER_ERIKA:\n                    BattleHouseVar->visitorErika ^= 1;\n                    break;\n                case FAMECHECKER_KOGA:\n                    BattleHouseVar->visitorKoga ^= 1;\n                    break;\n                case FAMECHECKER_SABRINA:\n                    BattleHouseVar->visitorSabrina ^= 1;\n                    break;\n                case FAMECHECKER_BLAINE:\n                    BattleHouseVar->visitorBlaine ^= 1;\n                    break;\n            }\n            break;\n        case SET_LEVEL_GROWTH:\n            if(BattleHouseVar->levelGrowth < 12)\n                BattleHouseVar->levelGrowth++;\n            break;\n        case CHECK_SPEAROW_STATE:\n            gSpecialVar_Result = BattleHouseVar->spearowState;\n            break;\n        case CHECK_TOLD_FAMECHECKER:\n            switch(argument)\n            {\n                case FAMECHECKER_BROCK:\n                    gSpecialVar_Result = BattleHouseVar->toldBrock;\n                    break;\n                case FAMECHECKER_MISTY:\n                    gSpecialVar_Result = BattleHouseVar->toldMisty;\n                    break;\n                case FAMECHECKER_LTSURGE:\n                    gSpecialVar_Result = BattleHouseVar->toldLtSurge;\n                    break;\n                case FAMECHECKER_ERIKA:\n                    gSpecialVar_Result = BattleHouseVar->toldErika;\n                    break;\n                case FAMECHECKER_KOGA:\n                    gSpecialVar_Result = BattleHouseVar->toldKoga;\n                    break;\n                case FAMECHECKER_SABRINA:\n                    gSpecialVar_Result = BattleHouseVar->toldSabrina;\n                    break;\n                case FAMECHECKER_BLAINE:\n                    gSpecialVar_Result = BattleHouseVar->toldBlaine;\n                    break;\n            }\n            break;\n        case CHECK_VISITOR_STATE:\n            switch(argument)\n            {\n                case FAMECHECKER_BROCK:\n                    gSpecialVar_Result = BattleHouseVar->visitorBrock;\n                    break;\n                case FAMECHECKER_MISTY:\n                    gSpecialVar_Result = BattleHouseVar->visitorMisty;\n                    break;\n                case FAMECHECKER_LTSURGE:\n                    gSpecialVar_Result = BattleHouseVar->visitorLtSurge;\n                    break;\n                case FAMECHECKER_ERIKA:\n                    gSpecialVar_Result = BattleHouseVar->visitorErika;\n                    break;\n                case FAMECHECKER_KOGA:\n                    gSpecialVar_Result = BattleHouseVar->visitorKoga;\n                    break;\n                case FAMECHECKER_SABRINA:\n                    gSpecialVar_Result = BattleHouseVar->visitorSabrina;\n                    break;\n                case FAMECHECKER_BLAINE:\n                    gSpecialVar_Result = BattleHouseVar->visitorBlaine;\n                    break;\n            }\n            break;\n        case CHECK_LEVEL_GROWTH:\n            if(BattleHouseVar->levelGrowth > 12)\n                gSpecialVar_Result = 12;\n            else \n                gSpecialVar_Result = BattleHouseVar->levelGrowth;\n            break;\n        case SET_BOXES_MOVED:\n            BattleHouseVar->boxesMoved = 1;\n            break;\n        case CHECK_BOXES_MOVED:\n            gSpecialVar_Result = BattleHouseVar->boxesMoved;\n            break;\n        case CHECK_ANY_VISITORS:\n            gSpecialVar_Result = 0;\n            if(BattleHouseVar->visitorBrock)\n            {\n                gSpecialVar_Result++;\n                StringCopy(gStringVar1, gText_Brock);\n            }\n            if(BattleHouseVar->visitorMisty)\n            {\n                gSpecialVar_Result++;\n                StringCopy(gStringVar1, gText_Misty);\n            }\n            if(BattleHouseVar->visitorLtSurge)\n            {\n                gSpecialVar_Result++;\n                StringCopy(gStringVar1, gText_LtSurge);\n            }\n            if(BattleHouseVar->visitorErika)\n            {\n                gSpecialVar_Result++;\n                StringCopy(gStringVar1, gText_Erika);\n            }\n            if(BattleHouseVar->visitorKoga)\n            {\n                gSpecialVar_Result++;\n                StringCopy(gStringVar1, gText_Koga);\n            }\n            if(BattleHouseVar->visitorSabrina)\n            {\n                gSpecialVar_Result++;\n                StringCopy(gStringVar1, gText_Sabrina);\n            }\n            if(BattleHouseVar->visitorBlaine)\n            {\n                gSpecialVar_Result++;\n                StringCopy(gStringVar1, gText_Blaine);\n            }\n            break;\n        case CHECK_ALL_TOLD:\n            gSpecialVar_Result = 0;\n            if(BattleHouseVar->toldBrock)\n                gSpecialVar_Result++;\n            if(BattleHouseVar->toldMisty)\n                gSpecialVar_Result++;\n            if(BattleHouseVar->toldLtSurge)\n                gSpecialVar_Result++;\n            if(BattleHouseVar->toldErika)\n                gSpecialVar_Result++;\n            if(BattleHouseVar->toldKoga)\n                gSpecialVar_Result++;\n            if(BattleHouseVar->toldSabrina)\n                gSpecialVar_Result++;\n            if(BattleHouseVar->toldBlaine)\n                gSpecialVar_Result++;\n            break;\n        case CREATE_VISITOR_STRING: //used for mailbox outside\n            if(BattleHouseVar->visitorBrock)\n                totalCount++;\n            if(BattleHouseVar->visitorMisty)\n                totalCount++;\n            if(BattleHouseVar->visitorLtSurge)\n                totalCount++;\n            if(BattleHouseVar->visitorErika)\n                totalCount++;\n            if(BattleHouseVar->visitorKoga)\n                totalCount++;\n            if(BattleHouseVar->visitorSabrina)\n                totalCount++;\n            if(BattleHouseVar->visitorBlaine)\n                totalCount++;\n            StringCopy(gStringVar1, gExpandedPlaceholder_Empty);\n            gSpecialVar_Result = 0;\n            if(BattleHouseVar->visitorBrock)\n            {\n                gSpecialVar_Result++;\n                runningCount++;\n                StringAppend(gStringVar1, gText_Brock);\n                if(totalCount != runningCount && totalCount != 2)\n                {\n                    StringAppend(gStringVar1, gText_CommaSpace);\n                    if(runningCount == (totalCount - 1))\n                    {\n                        StringAppend(gStringVar1, gText_AndSpace);\n                    }\n                }\n                if(totalCount == 2 && runningCount != 2)\n                {\n                    StringAppend(gStringVar1, gText_RegionMap_Space);\n                    StringAppend(gStringVar1, gText_AndSpace);\n                }\n            }\n            if(BattleHouseVar->visitorMisty)\n            {\n                gSpecialVar_Result++;\n                runningCount++;\n                StringAppend(gStringVar1, gText_Misty);\n                if(totalCount != runningCount && totalCount != 2)\n                {\n                    StringAppend(gStringVar1, gText_CommaSpace);\n                    if(runningCount == (totalCount - 1))\n                    {\n                        StringAppend(gStringVar1, gText_AndSpace);\n                    }\n                }\n                if(totalCount == 2 && runningCount != 2)\n                {\n                    StringAppend(gStringVar1, gText_RegionMap_Space);\n                    StringAppend(gStringVar1, gText_AndSpace);\n                }\n            }\n            if(BattleHouseVar->visitorLtSurge)\n            {\n                gSpecialVar_Result++;\n                runningCount++;\n                StringAppend(gStringVar1, gText_LtSurge);\n                if(totalCount != runningCount && totalCount != 2)\n                {\n                    StringAppend(gStringVar1, gText_CommaSpace);\n                    if(runningCount == (totalCount - 1))\n                    {\n                        StringAppend(gStringVar1, gText_AndSpace);\n                    }\n                }\n                if(totalCount == 2 && runningCount != 2)\n                {\n                    StringAppend(gStringVar1, gText_RegionMap_Space);\n                    StringAppend(gStringVar1, gText_AndSpace);\n                }\n            }\n            if(BattleHouseVar->visitorErika)\n            {\n                gSpecialVar_Result++;\n                runningCount++;\n                StringAppend(gStringVar1, gText_Erika);\n                if(totalCount != runningCount && totalCount != 2)\n                {\n                    StringAppend(gStringVar1, gText_CommaSpace);\n                    if(runningCount == (totalCount - 1))\n                    {\n                        StringAppend(gStringVar1, gText_AndSpace);\n                    }\n                }\n                if(totalCount == 2 && runningCount != 2)\n                {\n                    StringAppend(gStringVar1, gText_RegionMap_Space);\n                    StringAppend(gStringVar1, gText_AndSpace);\n                }\n            }\n            if(BattleHouseVar->visitorKoga)\n            {\n                runningCount++;\n                if(gSpecialVar_Result == 4 && totalCount != runningCount)\n                {\n                    StringAppend(gStringVar1, gText_NewLine);\n                    gSpecialVar_Result = 0;\n                }\n                gSpecialVar_Result++;\n                StringAppend(gStringVar1, gText_Koga);\n                if(totalCount != runningCount && totalCount != 2)\n                {\n                    StringAppend(gStringVar1, gText_CommaSpace);\n                    if(runningCount == (totalCount - 1))\n                    {\n                        StringAppend(gStringVar1, gText_AndSpace);\n                    }\n                }\n                if(totalCount == 2 && runningCount != 2)\n                {\n                    StringAppend(gStringVar1, gText_RegionMap_Space);\n                    StringAppend(gStringVar1, gText_AndSpace);\n                }\n            }\n            if(BattleHouseVar->visitorSabrina)\n            {\n                runningCount++;\n                if(gSpecialVar_Result == 4)\n                {\n                    StringAppend(gStringVar1, gText_NewLine);\n                    gSpecialVar_Result = 0;\n                }\n                gSpecialVar_Result++;\n                StringAppend(gStringVar1, gText_Sabrina);\n                if(totalCount != runningCount && totalCount != 2)\n                {\n                    StringAppend(gStringVar1, gText_CommaSpace);\n                    if(runningCount == (totalCount - 1))\n                    {\n                        StringAppend(gStringVar1, gText_AndSpace);\n                    }\n                }\n                if(totalCount == 2 && runningCount != 2)\n                {\n                    StringAppend(gStringVar1, gText_RegionMap_Space);\n                    StringAppend(gStringVar1, gText_AndSpace);\n                }\n            }\n            if(BattleHouseVar->visitorBlaine)\n            {\n                runningCount++;\n                if(gSpecialVar_Result == 4)\n                {\n                    StringAppend(gStringVar1, gText_NewLine);\n                    gSpecialVar_Result = 0;\n                }\n                gSpecialVar_Result++;\n                StringAppend(gStringVar1, gText_Blaine);\n            }\n            break;\n\n    }\n}\n\n#undef SET_SPEAROW_STATE\n#undef SET_TOLD_FAMECHECKER\n#undef SET_VISITOR_STATE\n#undef SET_LEVEL_GROWTH\n#undef CHECK_SPEAROW_STATE\n#undef CHECK_TOLD_FAMECHECKER\n#undef CHECK_VISITOR_STATE\n#undef CHECK_LEVEL_GROWTH\n#undef SET_BOXES_MOVED\n#undef CHECK_BOXES_MOVED\n#undef CHECK_ANY_VISITORS\n#undef CHECK_ALL_TOLD\n#undef CREATE_VISITOR_STRING\n\nvoid HandleUseExpiredRepel(void)\n{\n    VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(VarGet(VAR_LAST_REPEL_USED)));\n}\n\nvoid DetermineCeruleanCaveLayout(void)\n{\n    u32 trainerId = GetPlayerTrainerId();\n    u8 result = trainerId % 3;\n    gSpecialVar_Result = result;\n}\n\nvoid CheckTrainerCardStars(void)\n{\n    u8 stars = 0;\n\n    if(FlagGet(FLAG_SYS_GAME_CLEAR))\n    {\n        stars++;\n    }\n    if(HasAllKantoMonsNew())\n    {\n        stars++;\n    }\n    if(HasAllMonsNew())\n    {\n        stars++;\n    }\n    if((gSaveBlock2Ptr->berryPick.berriesPicked >= 200 && gSaveBlock2Ptr->pokeJump.jumpsInRow >= 200) || gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak > 49)\n    {\n        stars++;\n    }\n    gSpecialVar_Result = stars;\n}\n\n#define HAS_TICKETS 16\n#define NEEDS_SHOW_EON 17\n#define NEEDS_SHOW_AURORA 18\n#define NEEDS_SHOW_MYSTIC 19\n#define NEEDS_SHOW_OLD_SEA_MAP 20\n#define HAS_NO_TICKETS 21\n\nvoid CheckEventTickets(void)\n{\n    bool8 haveEonTicket     = CheckBagHasItem(ITEM_EON_TICKET, 1);\n    bool8 haveAuroraTicket  = CheckBagHasItem(ITEM_AURORA_TICKET, 1);\n    bool8 haveMysticTicket  = CheckBagHasItem(ITEM_MYSTIC_TICKET, 1);\n    bool8 haveOldSeaMap     = CheckBagHasItem(ITEM_OLD_SEA_MAP, 1);\n\n    bool8 shownEonTicket    = FlagGet(FLAG_SHOWN_EON_TICKET);\n    bool8 shownAuroraTicket = FlagGet(FLAG_SHOWN_AURORA_TICKET);\n    bool8 shownMysticTicket = FlagGet(FLAG_SHOWN_MYSTIC_TICKET);\n    bool8 shownOldSeaMap    = FlagGet(FLAG_SHOWN_OLD_SEA_MAP);\n\n    u8 multichoiceCase = 0;\n\n    if(gSpecialVar_Result == 0) //checking for showing tickets for the first time\n    {\n        if(shownEonTicket && shownAuroraTicket && shownMysticTicket && shownOldSeaMap)\n        {\n            gSpecialVar_Result = HAS_TICKETS;\n            return;\n        }\n        if(haveEonTicket && !shownEonTicket)\n        {\n            gSpecialVar_Result = NEEDS_SHOW_EON;\n            return;\n        }\n        if(haveAuroraTicket && !shownAuroraTicket)\n        {\n            gSpecialVar_Result = NEEDS_SHOW_AURORA;\n            return;\n        }\n        if(haveMysticTicket && !shownMysticTicket)\n        {\n            gSpecialVar_Result = NEEDS_SHOW_MYSTIC;\n            return;\n        }\n        if(haveOldSeaMap && !shownOldSeaMap)\n        {\n            gSpecialVar_Result = NEEDS_SHOW_OLD_SEA_MAP;\n            return;\n        }\n        if(shownEonTicket || shownAuroraTicket || shownMysticTicket || shownOldSeaMap)\n        {\n            gSpecialVar_Result = HAS_TICKETS;\n            return;\n        }\n        gSpecialVar_Result = HAS_NO_TICKETS;\n        return;\n    }\n    if(gSpecialVar_Result == 1) //checking which multichoice combo to display\n    {\n        if(haveEonTicket && shownEonTicket)\n        {\n            multichoiceCase |= 1 << 3; //setting Eon bit\n        }\n        if(haveAuroraTicket && shownAuroraTicket)\n        {\n            multichoiceCase |= 1 << 2; //setting Aurora bit\n        }\n        if(haveMysticTicket && shownMysticTicket)\n        {\n            multichoiceCase |= 1 << 1; //setting Mystic bit\n        }\n        if(haveOldSeaMap && shownOldSeaMap)\n        {\n            multichoiceCase |= 1 << 0; //setting Old Sea Map bit\n        }\n        gSpecialVar_Result = multichoiceCase;\n        return;\n    }\n    return;\n}\n\n#undef HAS_TICKETS\n#undef NEEDS_SHOW_EON\n#undef NEEDS_SHOW_AURORA\n#undef NEEDS_SHOW_MYSTIC\n#undef NEEDS_SHOW_OLD_SEA_MAP\n#undef HAS_NO_TICKETS\n\nvoid RecalculatePartyStats(void)\n{\n    u32 i;\n    for (i = 0; i < gPlayerPartyCount; i++)\n    {\n        CalculateMonStats(&gPlayerParty[i], FALSE);\n    }\n}\n\nvoid ResetTintFilter(void)\n{\n    u8 val = 0;\n    gGlobalFieldTintMode = 0;\n    SetInitialPlayerAvatarStateWithDirection(DIR_NORTH);\n    StopMapMusic();\n    DoMapLoadLoop(&val);\n}\n\nvoid SetLastViewedPokedexEntry(void)\n{\n    gSaveBlock1Ptr->lastViewedPokedexEntry = GetStarterSpecies();\n}\n\nvoid TurnOffNuzlockeMode(void)\n{\n    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n    {\n        gSaveBlock1Ptr->keyFlags.nuzlocke = 0;\n    }\n}\n\nvoid TurnOffNoPMC(void)\n{\n    if(gSaveBlock1Ptr->keyFlags.noPMC == 1)\n    {\n        gSaveBlock1Ptr->keyFlags.noPMC = 0;\n    }\n}\n\nvoid SetNoPMCTest(void)\n{\n    u8 noPMC = gSaveBlock1Ptr->keyFlags.noPMC;\n\n    switch(noPMC)\n    {\n        case 0:\n        default:\n            gSaveBlock1Ptr->keyFlags.noPMC = 1;\n            return;\n        case 1:\n            gSaveBlock1Ptr->keyFlags.noPMC = 0;\n            return;\n    }\n}\n\nvoid IsVersionFireRedToVarResult(void)\n{\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n        gSpecialVar_Result = TRUE;\n    else\n        gSpecialVar_Result = FALSE;\n}\n\nvoid IsChallengeModeToVarResult(void)\n{\n    u8 difficulty = gSaveBlock1Ptr->keyFlags.difficulty;\n    if(difficulty == DIFFICULTY_CHALLENGE)\n    {\n        gSpecialVar_Result = TRUE;\n    }\n    else\n    {\n        gSpecialVar_Result = FALSE;\n    }\n}\n\nvoid FillBagsTest(void)\n{\n    u32 i;\n    //pokeballs\n    for(i = 1; i < 13; i++)\n    {\n        AddBagItem(i, 999);\n    }\n\n    //regular items starting with Potion\n    for(i = 13; i < 52; i++)\n    {\n        AddBagItem(i, 999);\n    }\n\n    //regular items starting with HP UP, skipping ??????????s\n    for(i = 63; i < 87; i++)\n    {\n        if(i == 72 || i == 82) //skipping random ??????????s\n        {\n            continue;\n        }\n        AddBagItem(i, 999);\n    }\n\n    //regular items starting with Sun Stone, skipping ??????????s\n    for(i = 93; i < 99; i++)\n    {\n        AddBagItem(i, 999);\n    }\n\n    //regular items starting with TinyMushroom, skipping ??????????s\n    for(i = 103; i < 112; i++)\n    {\n        if(i == 105) //skipping random ??????????\n        {\n            continue;\n        }\n        AddBagItem(i, 999);\n    }\n\n    //regular items starting with Orange Mail\n    for(i = 121; i < 133; i++)\n    {\n        AddBagItem(i, 999);\n    }\n\n    //hold items starting with Brightpowder\n    for(i = 179; i < 226; i++)\n    {\n        AddBagItem(i, 999);\n    }\n\n    //Contest Scarves (skipping a bunch of ??????????s)\n    for(i = 254; i < 259; i++)\n    {\n        AddBagItem(i, 999);\n    }\n\n    //RSE key items that get used in FRLG, starting with Coin Case\n    for(i = 260; i < 266; i++)\n    {\n        AddBagItem(i, 1);\n    }\n\n    //FRLG key items starting with Oak's Parcel\n    for(i = 349; i < 375; i++)\n    {\n        AddBagItem(i, 1);\n    }\n\n    //berries\n    for(i = 133; i < 176; i++)\n    {\n        AddBagItem(i, 999);\n    }\n\n    //TMs and HMs\n    for(i = 289; i < 347; i++)\n    {\n        AddBagItem(i, 999);\n    }\n\n    //Old Sea Map\n    AddBagItem(376, 1);\n\n    //Link Bracelet\n    AddBagItem(112, 1);\n}\n"
  },
  {
    "path": "src/script_menu.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"menu.h\"\n#include \"task.h\"\n#include \"script_menu.h\"\n#include \"quest_log.h\"\n#include \"new_menu_helpers.h\"\n#include \"event_data.h\"\n#include \"script.h\"\n#include \"strings.h\"\n#include \"field_effect.h\"\n#include \"event_scripts.h\"\n#include \"constants/songs.h\"\n#include \"constants/seagallop.h\"\n#include \"constants/menu.h\"\n\n#define GFXTAG_FOSSIL 7000\n\n#define MULTICHOICE(name) {.list = name, .count = ARRAY_COUNT(name)}\n\nstruct MultichoiceListStruct\n{\n    const struct MenuAction * list;\n    u8 count;\n};\n\nstatic EWRAM_DATA u8 sDelay = 0;\n\nstatic void DrawVerticalMultichoiceMenu(u8 left, u8 top, u8 mcId, u8 ignoreBpress, u8 initPos);\nstatic u8 GetMCWindowHeight(u8 count);\nstatic void CreateMCMenuInputHandlerTask(u8 ignoreBpress, u8 count, u8 windowId, u8 mcId);\nstatic void Task_MultichoiceMenu_HandleInput(u8 taskId);\nstatic void MultiChoicePrintHelpDescription(u8 mcId);\nstatic void Task_YesNoMenu_HandleInput(u8 taskId);\nstatic void Hask_MultichoiceGridMenu_HandleInput(u8 taskId);\nstatic void CreatePCMenuWindow(void);\nstatic bool8 PicboxWait(void);\nstatic void DestroyScriptMenuWindow(u8 windowId);\nstatic u8 CreateWindowFromRect(u8 left, u8 top, u8 width, u8 height);\n\n\nstatic const struct MenuAction sMultichoiceList_YesNo[] = {\n    { gText_Yes },\n    { gText_No }\n};\n\nstatic const struct MenuAction sMultichoiceList_TrainerCardIconTint[] = {\n    { gText_Normal },\n    { gText_Black },\n    { gText_Pink },\n    { gText_Sepia }\n};\n\nstatic const struct MenuAction sMultichoiceList_HOF_Quit[] = {\n    { gText_HallOfFame },\n    { gText_Quit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Eggs_Quit[] = {\n    { gText_Eggs },\n    { gText_Quit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Victories_Quit[] = {\n    { gText_Victories },\n    { gText_Quit }\n};\n\nstatic const struct MenuAction sMultichoiceList_HOF_Eggs_Quit[] = {\n    { gText_HallOfFame },\n    { gText_Eggs },\n    { gText_Quit }\n};\n\nstatic const struct MenuAction sMultichoiceList_HOF_Victories_Quit[] = {\n    { gText_HallOfFame },\n    { gText_Victories },\n    { gText_Quit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Eggs_Victories_Quit[] = {\n    { gText_Eggs },\n    { gText_Victories },\n    { gText_Quit }\n};\n\nstatic const struct MenuAction sMultichoiceList_HOF_Eggs_Victories_Quit[] = {\n    { gText_HallOfFame },\n    { gText_Eggs },\n    { gText_Victories },\n    { gText_Quit }\n};\n\nstatic const struct MenuAction sMultichoiceList_TrainerSchoolWhiteboard[] = {\n    { gText_Slp },\n    { gText_Psn },\n    { gText_Par },\n    { gText_Brn },\n    { gText_Frz },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_YesNoInfo[] = {\n    { gText_Yes },\n    { gText_No },\n    { gText_Info }\n};\n\nstatic const struct MenuAction sMultichoiceList_SingleDoubleMultiInfoExit[] = {\n    { gText_SingleBattle },\n    { gText_DoubleBattle },\n    { gText_MultiBattle },\n    { gText_Info },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_YesNoInfo2[] = {\n    { gText_Yes },\n    { gText_No },\n    { gText_Info }\n};\n\nstatic const struct MenuAction sMultichoiceList_ChallengeInfoExit[] = {\n    { gText_MakeAChallenge },\n    { gText_Info_2 },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_RooftopB1F[] = {\n    { gText_Rooftop },\n    { gText_B1F },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Helix[] = {\n    { gText_HelixFossil },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Dome[] = {\n    { gText_DomeFossil },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Amber[] = {\n    { gText_OldAmber },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_HelixAmber[] = {\n    { gText_HelixFossil },\n    { gText_OldAmber },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_DomeAmber[] = {\n    { gText_DomeFossil },\n    { gText_OldAmber },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_HelixDome[] = {\n    { gText_HelixFossil },\n    { gText_DomeFossil },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_HelixDomeAmber[] = {\n    { gText_HelixFossil },\n    { gText_DomeFossil },\n    { gText_OldAmber },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_CeladonVendingMachine[] = {\n    { gText_FreshWater_200 },\n    { gText_SodaPop_300 },\n    { gText_Lemonade_350 },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_GameCornerTMPrizes[] = {\n    { gText_Tm13_4000Coins },\n    { gText_Tm23_3500Coins },\n    { gText_Tm24_4000Coins },\n    { gText_Tm30_4500Coins },\n    { gText_Tm35_4000Coins },\n    { gText_NoThanks_2 }\n};\n\nstatic const struct MenuAction sMultichoiceList_GameCornerBattleItemPrizes[] = {\n    { gText_SmokeBall_800Coins },\n    { gText_MiracleSeed_1000Coins },\n    { gText_Charcoal_1000Coins },\n    { gText_MysticWater_1000Coins },\n    { gText_YellowFlute_1600Coins },\n    { gText_NoThanks_2 }\n};\n\nstatic const struct MenuAction sMultichoiceList_GameCornerCoinPurchaseCounter[] = {\n    { gText_50Coins_1000 },\n    { gText_500Coins_10000 },\n    { gText_1000Coins_20000 },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Excellent_NotSoBad[] = {\n    { gText_Excellent },\n    { gText_NotSoBad }\n};\n\nstatic const struct MenuAction sMultichoiceList_RightLeft[] = {\n    { gText_Right },\n    { gText_Left }\n};\n\nstatic const struct MenuAction sMultichoiceList_DeptStoreElevator[] = {\n    { gText_5F_2 },\n    { gText_4F_2 },\n    { gText_3F_2 },\n    { gText_2F_2 },\n    { gText_1F_2 },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_ThirstyGirlFreshWater[] = {\n    { gText_FreshWater },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_ThirstyGirlSodaPop[] = {\n    { gText_SodaPop },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_ThirstyGirlFreshWaterSodaPop[] = {\n    { gText_FreshWater },\n    { gText_SodaPop },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_ThirstyGirlLemonade[] = {\n    { gText_Lemonade },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_ThirstyGirlFreshWaterLemonade[] = {\n    { gText_FreshWater },\n    { gText_Lemonade },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_ThirstyGirlSodaPopLemonade[] = {\n    { gText_SodaPop },\n    { gText_Lemonade },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_ThirstyGirlFreshWaterSodaPopLemonade[] = {\n    { gText_FreshWater },\n    { gText_SodaPop },\n    { gText_Lemonade },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Unref_Shards_0[] = {\n    { gText_GreenShard },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Unref_Shards_1[] = {\n    { gText_RedShard },\n    { gText_GreenShard },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Unref_Shards_2[] = {\n    { gText_YellowShard },\n    { gText_GreenShard },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Unref_Shards_3[] = {\n    { gText_RedShard },\n    { gText_YellowShard },\n    { gText_GreenShard },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Unref_Shards_4[] = {\n    { gText_BlueShard },\n    { gText_GreenShard },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Unref_Shards_5[] = {\n    { gText_RedShard },\n    { gText_BlueShard },\n    { gText_GreenShard },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Unref_Shards_6[] = {\n    { gText_YellowShard },\n    { gText_BlueShard },\n    { gText_GreenShard },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Unref_Shards_7[] = {\n    { gText_RedShard },\n    { gText_YellowShard },\n    { gText_BlueShard },\n    { gText_GreenShard },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Eeveelutions[] = {\n    { gText_Eevee },\n    { gText_Flareon },\n    { gText_Jolteon },\n    { gText_Vaporeon },\n    { gText_QuitLooking }\n};\n\nstatic const struct MenuAction sMultichoiceList_BikeShop[] = {\n    { gText_Bicycle_Price },\n    { gText_NoThanks }\n};\n\nstatic const struct MenuAction sMultichoiceList_GameCornerPokemonPrizes_FR[] = {\n    { gText_Abra_180Coins },\n    { gText_Clefairy_500Coins },\n    { gText_Dratini_2800Coins },\n    { gText_Scyther_5500Coins },\n    { gText_Porygon_9999Coins },\n    { gText_NoThanks_2 }\n};\n\nstatic const struct MenuAction sMultichoiceList_GameCornerPokemonPrizes_LG[] = {\n    { gText_Abra_120Coins },\n    { gText_Clefairy_750Coins },\n    { gText_Pinsir_2500Coins },\n    { gText_Dratini_4600Coins },\n    { gText_Porygon_6500Coins },\n    { gText_NoThanks_2 }\n};\n\nstatic const struct MenuAction sMultichoiceList_TradeCenter_Colosseum[] = {\n    { gText_TradeCenter },\n    { gText_Colosseum },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Link_Wireless[] = {\n    { gText_GameLinkCable },\n    { gText_Wireless },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_RocketHideoutElevator[] = {\n    { gText_B1F },\n    { gText_B2F },\n    { gText_B4F },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_LinkedDirectUnion[] = {\n    { gText_LinkedGamePlay },\n    { gText_DirectCorner },\n    { gText_UnionRoom },\n    { gOtherText_Quit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Island23[] = {\n    { gText_TwoIsland },\n    { gText_ThreeIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Island13[] = {\n    { gText_OneIsland },\n    { gText_ThreeIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Island12[] = {\n    { gText_OneIsland },\n    { gText_TwoIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_TradeColosseumCrush[] = {\n    { gText_TradeCenter },\n    { gText_Colosseum_2 },\n    { gText_BerryCrush },\n    { gOtherText_Exit }\n};\n\nextern const u8 gText_BlueFlute_Ash[];\nextern const u8 gText_YellowFlute_Ash[];\nextern const u8 gText_RedFlute_Ash[];\nextern const u8 gText_WhiteFlute_Ash[];\nextern const u8 gText_BlackFlute_Ash[];\n\n\nstatic const struct MenuAction sMultichoiceList_GlassWorkshopVendor[] = {\n    { gText_BlueFlute_Ash },\n    { gText_YellowFlute_Ash },\n    { gText_RedFlute_Ash },\n    { gText_WhiteFlute_Ash },\n    { gText_BlackFlute_Ash },\n    { gText_SmallExit }\n};\n\nstatic const struct MenuAction sMultichoiceList_TradeColosseum_2[] = {\n    { gText_TradeCenter },\n    { gText_Colosseum_2 },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_PokejumpDodrio[] = {\n    { gText_PokemonJump },\n    { gText_DodrioBerryPicking },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Mushrooms[] = {\n    { gText_2Tinymushrooms },\n    { gText_1BigMushroom }\n};\n\nstatic const struct MenuAction sMultichoiceList_TradeColosseumBlankCrush[] = {\n    { gText_TradeCenter },\n    { gText_Colosseum_2 },\n    { gText_RecordCorner },\n    { gText_BerryCrush },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_TradeColosseumBlank[] = {\n    { gText_TradeCenter },\n    { gText_Colosseum_2 },\n    { gText_RecordCorner },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Faraway[] = {\n    { gText_FarawayIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Navel[] = {\n    { gText_NavelRock },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_NavelFaraway[] = {\n    { gText_NavelRock },\n    { gText_FarawayIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Seagallop123[] = {\n    { gText_OneIsland },\n    { gText_TwoIsland },\n    { gText_ThreeIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SeagallopV23[] = {\n    { gText_Vermilion },\n    { gText_TwoIsland },\n    { gText_ThreeIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SeagallopV13[] = {\n    { gText_Vermilion },\n    { gText_OneIsland },\n    { gText_ThreeIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SeagallopV12[] = {\n    { gText_Vermilion },\n    { gText_OneIsland },\n    { gText_TwoIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SeagallopVermilion[] = {\n    { gText_Vermilion },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_JoinOrLead[] = {\n    { gText_JoinGroup },\n    { gText_BecomeLeader },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_TrainerTowerMode[] = {\n    { gOtherText_Single },\n    { gOtherText_Double },\n    { gOtherText_Knockout },\n    { gOtherText_Mixed },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SeviiOther[] = {\n    { gText_SeviiIslands },\n    { gText_Other },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SeviiBattleTower[] = {\n    { gText_SeviiIslands },\n    { gText_BattleTower },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SeviiBattleTowerOther[] = {\n    { gText_SeviiIslands },\n    { gText_BattleTower },\n    { gText_Other },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Birth[] = {\n    { gText_BirthIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_BirthFaraway[] = {\n    { gText_BirthIsland },\n    { gText_FarawayIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_BirthNavel[] = {\n    { gText_BirthIsland },\n    { gText_NavelRock },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_BattleTowerLevels[] = {\n    { gText_Lv50 },\n    { gText_Lv100 },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_BirthNavelFaraway[] = {\n    { gText_BirthIsland },\n    { gText_NavelRock },\n    { gText_FarawayIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_Southern[] = {\n    { gText_SouthernIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SouthernFaraway[] = {\n    { gText_SouthernIsland },\n    { gText_FarawayIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SouthernNavel[] = {\n    { gText_SouthernIsland },\n    { gText_NavelRock },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SouthernNavelFaraway[] = {\n    { gText_SouthernIsland },\n    { gText_NavelRock },\n    { gText_FarawayIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SouthernBirth[] = {\n    { gText_SouthernIsland },\n    { gText_BirthIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SouthernBirthFaraway[] = {\n    { gText_SouthernIsland },\n    { gText_BirthIsland },\n    { gText_FarawayIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SouthernBirthNavel[] = {\n    { gText_SouthernIsland },\n    { gText_BirthIsland },\n    { gText_NavelRock },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_SouthernBirthNavelFaraway[] = {\n    { gText_SouthernIsland },\n    { gText_BirthIsland },\n    { gText_NavelRock },\n    { gText_FarawayIsland },\n    { gOtherText_Exit }\n};\n\nstatic const struct MenuAction sMultichoiceList_MasterYoungster[] = {\n    { gText_WhoAreThey },\n    { gText_HowDoIBattleThem },\n    { gText_AboutTitles },\n    { gText_Nothing }\n};\n\nstatic const struct MenuAction sMultichoiceList_Exit[] = {\n    { gOtherText_Exit }\n};\n\nstatic const struct MultichoiceListStruct sMultichoiceLists[] = {\n    [MULTICHOICE_YES_NO]                                     = MULTICHOICE(sMultichoiceList_YesNo),\n    [MULTICHOICE_EEVEELUTIONS]                               = MULTICHOICE(sMultichoiceList_Eeveelutions),\n    [MULTICHOICE_TRAINER_CARD_ICON_TINT]                     = MULTICHOICE(sMultichoiceList_TrainerCardIconTint),\n    [MULTICHOICE_HOF_QUIT]                                   = MULTICHOICE(sMultichoiceList_HOF_Quit),\n    [MULTICHOICE_EGGS_QUIT]                                  = MULTICHOICE(sMultichoiceList_Eggs_Quit),\n    [MULTICHOICE_VICTORIES_QUIT]                             = MULTICHOICE(sMultichoiceList_Victories_Quit),\n    [MULTICHOICE_HOF_EGGS_QUIT]                              = MULTICHOICE(sMultichoiceList_HOF_Eggs_Quit),\n    [MULTICHOICE_HOF_VICTORIES_QUIT]                         = MULTICHOICE(sMultichoiceList_HOF_Victories_Quit),\n    [MULTICHOICE_EGGS_VICTORIES_QUIT]                        = MULTICHOICE(sMultichoiceList_Eggs_Victories_Quit),\n    [MULTICHOICE_HOF_EGGS_VICTORIES_QUIT]                    = MULTICHOICE(sMultichoiceList_HOF_Eggs_Victories_Quit),\n    [MULTICHOICE_EXIT]                                       = MULTICHOICE(sMultichoiceList_Exit),\n    [MULTICHOICE_EXIT_2]                                     = MULTICHOICE(sMultichoiceList_Exit),\n    [MULTICHOICE_EXIT_3]                                     = MULTICHOICE(sMultichoiceList_Exit),\n    [MULTICHOICE_BIKE_SHOP]                                  = MULTICHOICE(sMultichoiceList_BikeShop),\n    [MULTICHOICE_GAME_CORNER_POKEMON_PRIZES_FR]              = MULTICHOICE(sMultichoiceList_GameCornerPokemonPrizes_FR),\n    [MULTICHOICE_TRAINER_SCHOOL_WHITEBOARD]                  = MULTICHOICE(sMultichoiceList_TrainerSchoolWhiteboard),\n    [MULTICHOICE_YES_NO_INFO]                                = MULTICHOICE(sMultichoiceList_YesNoInfo),\n    [MULTICHOICE_SINGLE_DOUBLE_MULTI_INFO_EXIT]              = MULTICHOICE(sMultichoiceList_SingleDoubleMultiInfoExit),\n    [MULTICHOICE_YES_NO_INFO_2]                              = MULTICHOICE(sMultichoiceList_YesNoInfo2),\n    [MULTICHOICE_CHALLENGE_INFO_EXIT]                        = MULTICHOICE(sMultichoiceList_ChallengeInfoExit),\n    [MULTICHOICE_ROOFTOP_B1F]                                = MULTICHOICE(sMultichoiceList_RooftopB1F),\n    [MULTICHOICE_HELIX]                                      = MULTICHOICE(sMultichoiceList_Helix),\n    [MULTICHOICE_DOME]                                       = MULTICHOICE(sMultichoiceList_Dome),\n    [MULTICHOICE_AMBER]                                      = MULTICHOICE(sMultichoiceList_Amber),\n    [MULTICHOICE_HELIX_AMBER]                                = MULTICHOICE(sMultichoiceList_HelixAmber),\n    [MULTICHOICE_DOME_AMBER]                                 = MULTICHOICE(sMultichoiceList_DomeAmber),\n    [MULTICHOICE_CELADON_VENDING_MACHINE]                    = MULTICHOICE(sMultichoiceList_CeladonVendingMachine),\n    [MULTICHOICE_GAME_CORNER_COIN_PURCHASE_COUNTER]          = MULTICHOICE(sMultichoiceList_GameCornerCoinPurchaseCounter),\n    [MULTICHOICE_EXCELLENT_NOT_SO_BAD]                       = MULTICHOICE(sMultichoiceList_Excellent_NotSoBad),\n    [MULTICHOICE_RIGHT_LEFT]                                 = MULTICHOICE(sMultichoiceList_RightLeft),\n    [MULTICHOICE_GAME_CORNER_TMPRIZES]                       = MULTICHOICE(sMultichoiceList_GameCornerTMPrizes),\n    [MULTICHOICE_DEPT_STORE_ELEVATOR]                        = MULTICHOICE(sMultichoiceList_DeptStoreElevator),\n    [MULTICHOICE_THIRSTY_GIRL_FRESH_WATER]                   = MULTICHOICE(sMultichoiceList_ThirstyGirlFreshWater),\n    [MULTICHOICE_THIRSTY_GIRL_SODA_POP]                      = MULTICHOICE(sMultichoiceList_ThirstyGirlSodaPop),\n    [MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_SODA_POP]          = MULTICHOICE(sMultichoiceList_ThirstyGirlFreshWaterSodaPop),\n    [MULTICHOICE_THIRSTY_GIRL_LEMONADE]                      = MULTICHOICE(sMultichoiceList_ThirstyGirlLemonade),\n    [MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_LEMONADE]          = MULTICHOICE(sMultichoiceList_ThirstyGirlFreshWaterLemonade),\n    [MULTICHOICE_THIRSTY_GIRL_SODA_POP_LEMONADE]             = MULTICHOICE(sMultichoiceList_ThirstyGirlSodaPopLemonade),\n    [MULTICHOICE_THIRSTY_GIRL_FRESH_WATER_SODA_POP_LEMONADE] = MULTICHOICE(sMultichoiceList_ThirstyGirlFreshWaterSodaPopLemonade),\n    [MULTICHOICE_TRADE_CENTER_COLOSSEUM]                     = MULTICHOICE(sMultichoiceList_TradeCenter_Colosseum),\n    [MULTICHOICE_LINK_WIRELESS]                              = MULTICHOICE(sMultichoiceList_Link_Wireless),\n    [MULTICHOICE_GAME_CORNER_BATTLE_ITEM_PRIZES]             = MULTICHOICE(sMultichoiceList_GameCornerBattleItemPrizes),\n    [MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR]                    = MULTICHOICE(sMultichoiceList_RocketHideoutElevator),\n    [MULTICHOICE_LINKED_DIRECT_UNION]                        = MULTICHOICE(sMultichoiceList_LinkedDirectUnion),\n    [MULTICHOICE_ISLAND_23]                                  = MULTICHOICE(sMultichoiceList_Island23),\n    [MULTICHOICE_ISLAND_13]                                  = MULTICHOICE(sMultichoiceList_Island13),\n    [MULTICHOICE_ISLAND_12]                                  = MULTICHOICE(sMultichoiceList_Island12),\n    [MULTICHOICE_TRADE_COLOSSEUM_CRUSH]                      = MULTICHOICE(sMultichoiceList_TradeColosseumCrush),\n    [MULTICHOICE_GLASS_WORKSHOP_VENDOR]                      = MULTICHOICE(sMultichoiceList_GlassWorkshopVendor),\n    [MULTICHOICE_POKEJUMP_DODRIO]                            = MULTICHOICE(sMultichoiceList_PokejumpDodrio),\n    [MULTICHOICE_TRADE_COLOSSEUM_2]                          = MULTICHOICE(sMultichoiceList_TradeColosseum_2),\n    [MULTICHOICE_MUSHROOMS]                                  = MULTICHOICE(sMultichoiceList_Mushrooms),\n    [MULTICHOICE_TRADE_COLOSSEUM_BLANK_CRUSH]                = MULTICHOICE(sMultichoiceList_TradeColosseumBlankCrush),\n    [MULTICHOICE_TRADE_COLOSSEUM_BLANK]                      = MULTICHOICE(sMultichoiceList_TradeColosseumBlank),\n    [MULTICHOICE_FARAWAY]                                    = MULTICHOICE(sMultichoiceList_Faraway),\n    [MULTICHOICE_NAVEL]                                      = MULTICHOICE(sMultichoiceList_Navel),\n    [MULTICHOICE_NAVEL_FARAWAY]                              = MULTICHOICE(sMultichoiceList_NavelFaraway),\n    [MULTICHOICE_SEAGALLOP_123]                              = MULTICHOICE(sMultichoiceList_Seagallop123),\n    [MULTICHOICE_SEAGALLOP_V23]                              = MULTICHOICE(sMultichoiceList_SeagallopV23),\n    [MULTICHOICE_SEAGALLOP_V13]                              = MULTICHOICE(sMultichoiceList_SeagallopV13),\n    [MULTICHOICE_SEAGALLOP_V12]                              = MULTICHOICE(sMultichoiceList_SeagallopV12),\n    [MULTICHOICE_SEAGALLOP_VERMILION]                        = MULTICHOICE(sMultichoiceList_SeagallopVermilion),\n    [MULTICHOICE_GAME_CORNER_POKEMON_PRIZES_LG]              = MULTICHOICE(sMultichoiceList_GameCornerPokemonPrizes_LG),\n    [MULTICHOICE_JOIN_OR_LEAD]                               = MULTICHOICE(sMultichoiceList_JoinOrLead),\n    [MULTICHOICE_TRAINER_TOWER_MODE]                         = MULTICHOICE(sMultichoiceList_TrainerTowerMode),\n\t[MULTICHOICE_BATTLE_TOWER_LEVELS]                        = MULTICHOICE(sMultichoiceList_BattleTowerLevels),\n\t[MULTICHOICE_HELIX_DOME]                                 = MULTICHOICE(sMultichoiceList_HelixDome),\n\t[MULTICHOICE_HELIX_DOME_AMBER]                           = MULTICHOICE(sMultichoiceList_HelixDomeAmber),\n\t[MULTICHOICE_SEVII_OTHER]                                = MULTICHOICE(sMultichoiceList_SeviiOther),\n\t[MULTICHOICE_SEVII_BATTLE_TOWER]                         = MULTICHOICE(sMultichoiceList_SeviiBattleTower),\n\t[MULTICHOICE_SEVII_BATTLE_TOWER_OTHER]                   = MULTICHOICE(sMultichoiceList_SeviiBattleTowerOther),\n\t[MULTICHOICE_BIRTH]                                      = MULTICHOICE(sMultichoiceList_Birth),\n\t[MULTICHOICE_BIRTH_FARAWAY]                              = MULTICHOICE(sMultichoiceList_BirthFaraway),\n\t[MULTICHOICE_BIRTH_NAVEL]                                = MULTICHOICE(sMultichoiceList_BirthNavel),\n\t[MULTICHOICE_BIRTH_NAVEL_FARAWAY]                        = MULTICHOICE(sMultichoiceList_BirthNavelFaraway),\n\t[MULTICHOICE_SOUTHERN]                                   = MULTICHOICE(sMultichoiceList_Southern),\n\t[MULTICHOICE_SOUTHERN_FARAWAY]                           = MULTICHOICE(sMultichoiceList_SouthernFaraway),\n\t[MULTICHOICE_SOUTHERN_NAVEL]                             = MULTICHOICE(sMultichoiceList_SouthernNavel),\n\t[MULTICHOICE_SOUTHERN_NAVEL_FARAWAY]                     = MULTICHOICE(sMultichoiceList_SouthernNavelFaraway),\n\t[MULTICHOICE_SOUTHERN_BIRTH]                             = MULTICHOICE(sMultichoiceList_SouthernBirth),\n\t[MULTICHOICE_SOUTHERN_BIRTH_FARAWAY]                     = MULTICHOICE(sMultichoiceList_SouthernBirthFaraway),\n\t[MULTICHOICE_SOUTHERN_BIRTH_NAVEL]                       = MULTICHOICE(sMultichoiceList_SouthernBirthNavel),\n\t[MULTICHOICE_SOUTHERN_BIRTH_NAVEL_FARAWAY]               = MULTICHOICE(sMultichoiceList_SouthernBirthNavelFaraway),\n\t[MULTICHOICE_MASTER_YOUNGSTER]                           = MULTICHOICE(sMultichoiceList_MasterYoungster),\n};\n\n// From Cool to Berries goes unused\nconst u8 *const gStdStringPtrs[] = {\n    [STDSTRING_COOL]             = gText_Cool,\n    [STDSTRING_BEAUTY]           = gText_Beauty,\n    [STDSTRING_CUTE]             = gText_Cute,\n    [STDSTRING_SMART]            = gText_Smart,\n    [STDSTRING_TOUGH]            = gText_Tough,\n    [STDSTRING_COOL2]            = gText_Cool_2,\n    [STDSTRING_BEAUTY2]          = gText_Beauty_2,\n    [STDSTRING_CUTE2]            = gText_Cute_2,\n    [STDSTRING_SMART2]           = gText_Smart_2,\n    [STDSTRING_TOUGH2]           = gText_Tough_2,\n    [STDSTRING_ITEMS]            = gText_Items,\n    [STDSTRING_KEY_ITEMS]        = gText_KeyItems,\n    [STDSTRING_POKEBALLS]        = gText_PokeBalls,\n    [STDSTRING_TMHMS]            = gText_TMsAndHMs,\n    [STDSTRING_BERRIES]          = gText_Berries,\n    [STDSTRING_BOULDER_BADGE]    = gText_Boulderbadge,\n    [STDSTRING_CASCADE_BADGE]    = gText_Cascadebadge,\n    [STDSTRING_THUNDER_BADGE]    = gText_Thunderbadge,\n    [STDSTRING_RAINBOW_BADGE]    = gText_Rainbowbadge,\n    [STDSTRING_SOUL_BADGE]       = gText_Soulbadge,\n    [STDSTRING_MARSH_BADGE]      = gText_Marshbadge,\n    [STDSTRING_VOLCANO_BADGE]    = gText_Volcanobadge,\n    [STDSTRING_EARTH_BADGE]      = gText_Earthbadge,\n    [STDSTRING_COINS]            = gText_Coins_2,\n    [STDSTRING_ITEMS_POCKET]     = gText_ItemsPocket,\n    [STDSTRING_KEY_ITEMS_POCKET] = gText_KeyItemsPocket,\n    [STDSTRING_POKEBALLS_POCKET] = gText_PokeBallsPocket,\n    [STDSTRING_TM_CASE]          = gText_TmCase,\n    [STDSTRING_BERRY_POUCH]      = gText_BerryPouch_2,\n    [STDSTRING_MEDICINE_POCKET]  = gText_MedicinePocket,\n    [STDSTRING_HELD_ITEMS_POCKET] = gText_HeldItemsPocket\n};\n\nstatic const u8 *const sDescriptionPtrs_CableClub_TradeBattleCancel[] = {\n    CableClub_Text_TradeMonsUsingLinkCable,\n    CableClub_Text_BattleUsingLinkCable,\n    CableClub_Text_CancelSelectedItem\n};\n\nstatic const u8 *const sDescriptionPtrs_WirelessCenter_TradeBattleCrushCancel[] = {\n    CableClub_Text_YouMayTradeHere,\n    CableClub_Text_YouMayBattleHere,\n    CableClub_Text_CanMakeBerryPowder,\n    CableClub_Text_CancelSelectedItem\n};\n\nstatic const u8 *const sDescriptionPtrs_WirelessCenter_TradeBattleCancel[] = {\n    CableClub_Text_YouMayTradeHere,\n    CableClub_Text_YouMayBattleHere,\n    CableClub_Text_CancelSelectedItem\n};\n\nstatic const union AnimCmd sMuseumFossilAnim0[] = {\n    ANIMCMD_FRAME(0, 10),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sMuseumFossilAnimCmdTable[] = {\n    sMuseumFossilAnim0\n};\n\nstatic const struct OamData sMuseumFossilOamData = {\n    .shape = SPRITE_SHAPE(64x64),\n    .size = SPRITE_SIZE(64x64)\n};\n\nstatic const struct SpriteTemplate sMuseumFossilSprTemplate = {\n    .tileTag = GFXTAG_FOSSIL,\n    .paletteTag = TAG_NONE,\n    .oam = &sMuseumFossilOamData,\n    .anims = sMuseumFossilAnimCmdTable,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const u16 sMuseumAerodactylSprTiles[] = INCBIN_U16(\"graphics/script_menu/aerodactyl_fossil.4bpp\");\nstatic const u16 sMuseumAerodactylSprPalette[] = INCBIN_U16(\"graphics/script_menu/aerodactyl_fossil.gbapal\");\nstatic const u16 sMuseumKabutopsSprTiles[] = INCBIN_U16(\"graphics/script_menu/kabutops_fossil.4bpp\");\nstatic const u16 sMuseumKabutopsSprPalette[] = INCBIN_U16(\"graphics/script_menu/kabutops_fossil.gbapal\");\n\nstatic const struct SpriteSheet sMuseumKabutopsSprSheets[] = {\n    {sMuseumKabutopsSprTiles, sizeof(sMuseumKabutopsSprTiles), GFXTAG_FOSSIL},\n    {}\n};\n\nstatic const struct SpriteSheet sMuseumAerodactylSprSheets[] = {\n    {sMuseumAerodactylSprTiles, sizeof(sMuseumAerodactylSprTiles), GFXTAG_FOSSIL},\n    {}\n};\n\n\nstatic const u8 *const sSeagallopDestStrings[] = {\n    [SEAGALLOP_VERMILION_CITY] = gText_Vermilion,\n    [SEAGALLOP_ONE_ISLAND]     = gText_OneIsland,\n    [SEAGALLOP_TWO_ISLAND]     = gText_TwoIsland,\n    [SEAGALLOP_THREE_ISLAND]   = gText_ThreeIsland,\n    [SEAGALLOP_FOUR_ISLAND]    = gText_FourIsland,\n    [SEAGALLOP_FIVE_ISLAND]    = gText_FiveIsland,\n    [SEAGALLOP_SIX_ISLAND]     = gText_SixIsland,\n    [SEAGALLOP_SEVEN_ISLAND]   = gText_SevenIsland,\n};\n\nstatic u16 GetStringTilesWide(const u8 *str)\n{\n    return (GetStringWidth(FONT_NORMAL_COPY_1, str, 0) + 7) / 8;\n}\n\nstatic u8 GetMenuWidthFromList(const struct MenuAction * items, u8 count)\n{\n    u32 i;\n    u8 width = GetStringTilesWide(items[0].text);\n    u8 tmp;\n\n    for (i = 1; i < count; i++)\n    {\n        tmp = GetStringTilesWide(items[i].text);\n        if (width < tmp)\n            width = tmp;\n    }\n    return width;\n}\n\nbool8 ScriptMenu_Multichoice(u8 left, u8 top, u8 mcId, u8 ignoreBpress)\n{\n    if (FuncIsActiveTask(Task_MultichoiceMenu_HandleInput) == TRUE)\n        return FALSE;\n    gSpecialVar_Result = SCR_MENU_UNSET;\n    DrawVerticalMultichoiceMenu(left, top, mcId, ignoreBpress, 0);\n    return TRUE;\n}\n\nbool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 mcId, u8 ignoreBpress, u8 cursorPos)\n{\n    if (FuncIsActiveTask(Task_MultichoiceMenu_HandleInput) == TRUE)\n        return FALSE;\n    gSpecialVar_Result = SCR_MENU_UNSET;\n    DrawVerticalMultichoiceMenu(left, top, mcId, ignoreBpress, cursorPos);\n    return TRUE;\n}\n\nstatic void DrawVerticalMultichoiceMenu(u8 left, u8 top, u8 mcId, u8 ignoreBpress, u8 initPos)\n{\n    s32 i;\n    s32 strWidth;\n    s32 tmp;\n    u8 width;\n    u8 height;\n    u8 count;\n    u8 windowId;\n    const struct MenuAction * list;\n\n    if ((ignoreBpress & 2) || QL_AvoidDisplay(QL_DestroyAbortedDisplay) != TRUE)\n    {\n        ignoreBpress &= 1;\n        count = sMultichoiceLists[mcId].count;\n        list = sMultichoiceLists[mcId].list;\n        strWidth = 0;\n        for (i = 0; i < count; i++)\n        {\n            tmp = GetStringWidth(FONT_NORMAL, list[i].text, 0);\n            if (tmp > strWidth)\n                strWidth = tmp;\n        }\n        width = (strWidth + 9) / 8 + 1;\n        if (left + width > 28)\n            left = 28 - width;\n        height = GetMCWindowHeight(count);\n        windowId = CreateWindowFromRect(left, top, width, height);\n        SetStdWindowBorderStyle(windowId, FALSE);\n        if (mcId == MULTICHOICE_GAME_CORNER_TMPRIZES\n         || mcId == MULTICHOICE_BIKE_SHOP\n         || mcId == MULTICHOICE_GAME_CORNER_BATTLE_ITEM_PRIZES)\n            MultichoiceList_PrintItems(windowId, FONT_NORMAL, 8, 2, 14, count, list, 0, 2);\n        else\n            MultichoiceList_PrintItems(windowId, FONT_NORMAL, 8, 2, 14, count, list, 0, 2);\n        Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 14, count, initPos);\n        CreateMCMenuInputHandlerTask(ignoreBpress, count, windowId, mcId);\n        ScheduleBgCopyTilemapToVram(0);\n    }\n}\n\nstatic u8 GetMCWindowHeight(u8 count)\n{\n    switch (count)\n    {\n    case 0:\n        return 1;\n    case 1:\n        return 2;\n    case 2:\n        return 4;\n    case 3:\n        return 6;\n    case 4:\n        return 7;\n    case 5:\n        return 9;\n    case 6:\n        return 11;\n    case 7:\n        return 13;\n    case 8:\n        return 14;\n    default:\n        return 1;\n    }\n}\n\n#define tTimer         data[2]\n#define tIgnoreBPress  data[4]\n#define tWrapAround    data[5]\n#define tWindowId      data[6]\n#define tMultichoiceId data[7]\n\nstatic void CreateMCMenuInputHandlerTask(u8 ignoreBpress, u8 count, u8 windowId, u8 mcId)\n{\n    u8 taskId;\n    if (mcId == MULTICHOICE_TRADE_CENTER_COLOSSEUM\n     || mcId == MULTICHOICE_TRADE_COLOSSEUM_CRUSH\n     || mcId == MULTICHOICE_TRADE_COLOSSEUM_2)\n        sDelay = 12;\n    else\n        sDelay = 0;\n\n    taskId = CreateTask(Task_MultichoiceMenu_HandleInput, 80);\n    gTasks[taskId].tIgnoreBPress = ignoreBpress;\n    if (count > 3)\n        gTasks[taskId].tWrapAround = TRUE;\n    else\n        gTasks[taskId].tWrapAround = FALSE;\n    gTasks[taskId].tWindowId = windowId;\n    gTasks[taskId].tMultichoiceId = mcId;\n    MultiChoicePrintHelpDescription(mcId);\n}\n\nstatic void Task_MultichoiceMenu_HandleInput(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    s8 input;\n    if (!gPaletteFade.active)\n    {\n        if (sDelay != 0)\n            sDelay--;\n        else\n        {\n            if (tWrapAround == FALSE)\n                input = Menu_ProcessInputNoWrapAround();\n            else\n                input = Menu_ProcessInput();\n            if (JOY_NEW(DPAD_UP | DPAD_DOWN))\n                MultiChoicePrintHelpDescription(tMultichoiceId);\n            switch (input)\n            {\n            case MENU_NOTHING_CHOSEN:\n                return;\n            case MENU_B_PRESSED:\n                if (tIgnoreBPress)\n                    return;\n                PlaySE(SE_SELECT);\n                gSpecialVar_Result = SCR_MENU_CANCEL;\n                break;\n            default:\n                gSpecialVar_Result = input;\n                break;\n            }\n            DestroyScriptMenuWindow(tWindowId);\n            DestroyTask(taskId);\n            ScriptContext_Enable();\n        }\n    }\n}\n\nstatic void MultiChoicePrintHelpDescription(u8 mcId)\n{\n    switch (mcId)\n    {\n    case MULTICHOICE_TRADE_CENTER_COLOSSEUM:\n        FillWindowPixelBuffer(0, PIXEL_FILL(1));\n        AddTextPrinterParameterized2(0, FONT_NORMAL, sDescriptionPtrs_CableClub_TradeBattleCancel[Menu_GetCursorPos()], 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n        break;\n    case MULTICHOICE_TRADE_COLOSSEUM_CRUSH:\n        FillWindowPixelBuffer(0, PIXEL_FILL(1));\n        AddTextPrinterParameterized2(0, FONT_NORMAL, sDescriptionPtrs_WirelessCenter_TradeBattleCrushCancel[Menu_GetCursorPos()], 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n        break;\n    case MULTICHOICE_TRADE_COLOSSEUM_2:\n        FillWindowPixelBuffer(0, PIXEL_FILL(1));\n        AddTextPrinterParameterized2(0, FONT_NORMAL, sDescriptionPtrs_WirelessCenter_TradeBattleCancel[Menu_GetCursorPos()], 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n        break;\n    }\n}\n\nbool8 ScriptMenu_YesNo(u8 unused, u8 stuff)\n{\n    if (FuncIsActiveTask(Task_YesNoMenu_HandleInput) == TRUE)\n        return FALSE;\n    gSpecialVar_Result = SCR_MENU_UNSET;\n\n    if (QL_AvoidDisplay(QL_DestroyAbortedDisplay))\n        return TRUE;\n\n    DisplayYesNoMenuDefaultYes();\n    CreateTask(Task_YesNoMenu_HandleInput, 80);\n    return TRUE;\n}\n\n// Unused\nstatic bool8 IsScriptActive(void)\n{\n    if (gSpecialVar_Result == SCR_MENU_UNSET)\n        return FALSE;\n    else\n        return TRUE;\n}\n\nstatic void Task_YesNoMenu_HandleInput(u8 taskId)\n{\n    s8 input;\n    if (gTasks[taskId].tTimer < 5)\n    {\n        gTasks[taskId].tTimer++;\n    }\n    else\n    {\n        input = Menu_ProcessInputNoWrapClearOnChoose();\n        switch (input)\n        {\n        case MENU_NOTHING_CHOSEN:\n            return;\n        case MENU_B_PRESSED:\n        case 1: // NO\n            PlaySE(SE_SELECT);\n            gSpecialVar_Result = FALSE;\n            break;\n        case 0: // YES\n            gSpecialVar_Result = TRUE;\n            break;\n        }\n        DestroyTask(taskId);\n        ScriptContext_Enable();\n    }\n}\n\nbool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, bool8 ignoreBpress, u8 columnCount)\n{\n    const struct MenuAction * list;\n    u8 count;\n    u8 width;\n    u8 rowCount;\n    u8 taskId;\n    if (FuncIsActiveTask(Hask_MultichoiceGridMenu_HandleInput) == TRUE)\n        return FALSE;\n    gSpecialVar_Result = SCR_MENU_UNSET;\n\n    if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)\n        return TRUE;\n\n    list = sMultichoiceLists[multichoiceId].list;\n    count = sMultichoiceLists[multichoiceId].count;\n    width = GetMenuWidthFromList(list, count) + 1;\n    rowCount = count / columnCount;\n    taskId = CreateTask(Hask_MultichoiceGridMenu_HandleInput, 80);\n    gTasks[taskId].tIgnoreBPress = ignoreBpress;\n    gTasks[taskId].tWindowId = CreateWindowFromRect(left, top, width * columnCount, rowCount * 2);\n    SetStdWindowBorderStyle(gTasks[taskId].tWindowId, FALSE);\n    MultichoiceGrid_PrintItems(gTasks[taskId].tWindowId, FONT_NORMAL_COPY_1, width * 8, 16, columnCount, rowCount, list);\n    MultichoiceGrid_InitCursor(gTasks[taskId].tWindowId, FONT_NORMAL_COPY_1, 0, 1, width * 8, columnCount, rowCount, 0);\n    ScheduleBgCopyTilemapToVram(0);\n\n    return TRUE;\n}\n\nstatic void Hask_MultichoiceGridMenu_HandleInput(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    s8 input = Menu_ProcessInputGridLayout();\n    switch (input)\n    {\n    case MENU_NOTHING_CHOSEN:\n        return;\n    case MENU_B_PRESSED:\n        if (tIgnoreBPress)\n            return;\n        PlaySE(SE_SELECT);\n        gSpecialVar_Result = SCR_MENU_CANCEL;\n        break;\n    default:\n        gSpecialVar_Result = input;\n        break;\n    }\n    DestroyScriptMenuWindow(tWindowId);\n    DestroyTask(taskId);\n    ScriptContext_Enable();\n}\n\n#undef tIgnoreBPress\n#undef tWrapAround\n#undef tWindowId\n#undef tMultichoiceId\n\n#define tState        data[0]\n#define tSpecies      data[1]\n#define tSpriteId     data[2]\n#define tWindowId     data[5]\n\nbool8 CreatePCMenu(void)\n{\n    if (FuncIsActiveTask(Task_MultichoiceMenu_HandleInput) == TRUE)\n        return FALSE;\n    gSpecialVar_Result = SCR_MENU_UNSET;\n    CreatePCMenuWindow();\n    return TRUE;\n}\n\nstatic void CreatePCMenuWindow(void)\n{\n    u8 cursorWidth = GetMenuCursorDimensionByFont(FONT_NORMAL, 0);\n    u8 height = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT);\n    u8 windowWidth;\n    u8 numItems;\n    u8 windowId;\n    switch (GetStringTilesWide(gText_SPc))\n    {\n    default:\n        if (FlagGet(FLAG_SYS_POKEDEX_GET))\n            windowWidth = 14;\n        else\n            windowWidth = 13;\n        break;\n    case 9:\n    case 10:\n        windowWidth = 14;\n        break;\n    }\n    if (FlagGet(FLAG_SYS_GAME_CLEAR))\n    {\n        numItems = 5;\n        windowId = CreateWindowFromRect(0, 0, windowWidth, 10);\n        SetStdWindowBorderStyle(windowId, FALSE);\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_ProfOakSPc, cursorWidth, 34, TEXT_SKIP_DRAW, NULL);\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_HallOfFame_2, cursorWidth, 50, TEXT_SKIP_DRAW, NULL);\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_LogOff, cursorWidth, 66, TEXT_SKIP_DRAW, NULL);\n    }\n    else\n    {\n        if (FlagGet(FLAG_SYS_POKEDEX_GET))\n            numItems = 4;\n        else\n            numItems = 3;\n        windowId = CreateWindowFromRect(0, 0, windowWidth, numItems * 2);\n        SetStdWindowBorderStyle(windowId, FALSE);\n        if (FlagGet(FLAG_SYS_POKEDEX_GET))\n            AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_ProfOakSPc, cursorWidth, 34, TEXT_SKIP_DRAW, NULL);\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_LogOff, cursorWidth, 2 + 16 * (numItems - 1), TEXT_SKIP_DRAW, NULL);\n    }\n    if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC))\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_BillSPc, cursorWidth, 2 , TEXT_SKIP_DRAW, NULL);\n    else\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_SomeoneSPc, cursorWidth, 2 , TEXT_SKIP_DRAW, NULL);\n    StringExpandPlaceholders(gStringVar4, gText_SPc);\n    Menu_PrintFormatIntlPlayerName(windowId, gStringVar4, cursorWidth, 18);\n    Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 16, numItems, 0);\n    CreateMCMenuInputHandlerTask(FALSE, numItems, windowId, MULTICHOICE_NONE);\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nvoid ScriptMenu_DisplayPCStartupPrompt(void)\n{\n    LoadMessageBoxAndFrameGfx(0, TRUE);\n    AddTextPrinterParameterized2(0, FONT_NORMAL, Text_AccessWhichPC, 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n}\n\nstatic void Task_ScriptShowMonPic(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->tState)\n    {\n    case 0:\n        task->tState++;\n        break;\n    case 1:\n        break;\n    case 2:\n        FreeResourcesAndDestroySprite(&gSprites[task->tSpriteId], task->tSpriteId);\n        task->tState++;\n        break;\n    case 3:\n        DestroyScriptMenuWindow(task->tWindowId);\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nbool8 ScriptMenu_ShowPokemonPic(u16 species, u8 x, u8 y)\n{\n    u8 spriteId;\n    u8 taskId;\n    if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)\n        return TRUE;\n    if (FindTaskIdByFunc(Task_ScriptShowMonPic) != TASK_NONE)\n        return FALSE;\n    spriteId = CreateMonSprite_PicBox(species, 8 * x + 40, 8 * y + 40, FALSE);\n    taskId = CreateTask(Task_ScriptShowMonPic, 80);\n    gTasks[taskId].tWindowId = CreateWindowFromRect(x, y, 8, 8);\n    gTasks[taskId].tState = 0;\n    gTasks[taskId].tSpecies = species;\n    gTasks[taskId].tSpriteId = spriteId;\n    gSprites[spriteId].callback = SpriteCallbackDummy;\n    gSprites[spriteId].oam.priority = 0;\n    SetStdWindowBorderStyle(gTasks[taskId].tWindowId, TRUE);\n    ScheduleBgCopyTilemapToVram(0);\n    return TRUE;\n}\n\nbool8 (*ScriptMenu_HidePokemonPic(void))(void)\n{\n    u8 taskId = FindTaskIdByFunc(Task_ScriptShowMonPic);\n    if (taskId == TASK_NONE)\n        return NULL;\n    gTasks[taskId].tState++;\n    return PicboxWait;\n}\n\nstatic bool8 PicboxWait(void)\n{\n    if (FindTaskIdByFunc(Task_ScriptShowMonPic) == TASK_NONE)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid PicboxCancel(void)\n{\n    u8 taskId = FindTaskIdByFunc(Task_ScriptShowMonPic);\n    struct Task *task;\n    if (taskId != TASK_NONE)\n    {\n        task = &gTasks[taskId];\n        switch (task->tState)\n        {\n        case 0:\n        case 1:\n        case 2:\n            FreeResourcesAndDestroySprite(&gSprites[task->tSpriteId], task->tSpriteId);\n            DestroyScriptMenuWindow(task->tWindowId);\n            DestroyTask(taskId);\n            break;\n        case 3:\n            DestroyScriptMenuWindow(task->tWindowId);\n            DestroyTask(taskId);\n            break;\n        }\n    }\n}\n\nvoid Task_WaitMuseumFossilPic(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    switch (task->tState)\n    {\n    case 0:\n        task->tState++;\n        break;\n    case 1:\n        break;\n    case 2:\n        DestroySprite(&gSprites[task->tSpriteId]);\n        FreeSpriteTilesByTag(GFXTAG_FOSSIL);\n        task->tState++;\n        break;\n    case 3:\n        DestroyScriptMenuWindow(task->tWindowId);\n        DestroyTask(taskId);\n        break;\n    }\n}\n\n#define FOSSIL_PIC_PAL_NUM  13\n\nbool8 OpenMuseumFossilPic(void)\n{\n    u8 spriteId;\n    u8 taskId;\n    if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)\n        return TRUE;\n    if (FindTaskIdByFunc(Task_WaitMuseumFossilPic) != TASK_NONE)\n        return FALSE;\n    if (gSpecialVar_0x8004 == SPECIES_KABUTOPS)\n    {\n        LoadSpriteSheets(sMuseumKabutopsSprSheets);\n        LoadPalette(sMuseumKabutopsSprPalette, OBJ_PLTT_ID(FOSSIL_PIC_PAL_NUM), sizeof(sMuseumKabutopsSprPalette));\n    }\n    else if (gSpecialVar_0x8004 == SPECIES_AERODACTYL)\n    {\n        LoadSpriteSheets(sMuseumAerodactylSprSheets);\n        LoadPalette(sMuseumAerodactylSprPalette, OBJ_PLTT_ID(FOSSIL_PIC_PAL_NUM), sizeof(sMuseumAerodactylSprPalette));\n    }\n    else\n    {\n        return FALSE;\n    }\n    spriteId = CreateSprite(&sMuseumFossilSprTemplate, gSpecialVar_0x8005 * 8 + 40, gSpecialVar_0x8006 * 8 + 40, 0);\n    gSprites[spriteId].oam.paletteNum = FOSSIL_PIC_PAL_NUM;\n    taskId = CreateTask(Task_WaitMuseumFossilPic, 80);\n    gTasks[taskId].tWindowId = CreateWindowFromRect(gSpecialVar_0x8005, gSpecialVar_0x8006, 8, 8);\n    gTasks[taskId].tState = 0;\n    gTasks[taskId].tSpriteId = spriteId;\n    SetStdWindowBorderStyle(gTasks[taskId].tWindowId, TRUE);\n    ScheduleBgCopyTilemapToVram(0);\n    return TRUE;\n}\n\nbool8 CloseMuseumFossilPic(void)\n{\n    u8 taskId = FindTaskIdByFunc(Task_WaitMuseumFossilPic);\n    if (taskId == TASK_NONE)\n        return FALSE;\n    gTasks[taskId].tState++;\n    return TRUE;\n}\n\nstatic u8 CreateWindowFromRect(u8 left, u8 top, u8 width, u8 height)\n{\n    struct WindowTemplate template = SetWindowTemplateFields(0, left + 1, top + 1, width, height, 15, 0x038);\n    u8 windowId = AddWindow(&template);\n    PutWindowTilemap(windowId);\n    return windowId;\n}\n\nstatic void DestroyScriptMenuWindow(u8 windowId)\n{\n    ClearWindowTilemap(windowId);\n    ClearStdWindowAndFrameToTransparent(windowId, TRUE);\n    RemoveWindow(windowId);\n}\n\nvoid QL_DestroyAbortedDisplay(void)\n{\n    u8 taskId;\n    s16 *data;\n    ScriptContext_SetupScript(EventScript_ReleaseEnd);\n\n    taskId = FindTaskIdByFunc(Task_ScriptShowMonPic);\n    if (taskId != TASK_NONE)\n    {\n        data = gTasks[taskId].data;\n        if (tState < 2)\n            FreeResourcesAndDestroySprite(&gSprites[tSpriteId], tSpriteId);\n    }\n\n    taskId = FindTaskIdByFunc(Task_WaitMuseumFossilPic);\n    if (taskId != TASK_NONE)\n    {\n        data = gTasks[taskId].data;\n        if (tState < 2)\n        {\n            DestroySprite(&gSprites[tSpriteId]);\n            FreeSpriteTilesByTag(GFXTAG_FOSSIL);\n        }\n    }\n}\n\nvoid DrawSeagallopDestinationMenu(void)\n{\n    // 8004 = Starting location\n    // 8005 = Page (0: Verm, One, Two, Three, Four, Other, Exit; 1: Four, Five, Six, Seven, Other, Exit)\n    u8 destinationId;\n    u8 top;\n    u8 numItems;\n    u8 cursorWidth;\n    u8 fontHeight;\n    u8 windowId;\n    u32 i;\n    gSpecialVar_Result = SCR_MENU_UNSET;\n\n    if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)\n        return;\n\n    if (gSpecialVar_0x8005 == 1)\n    {\n        if (gSpecialVar_0x8004 < SEAGALLOP_FIVE_ISLAND)\n            destinationId = SEAGALLOP_FIVE_ISLAND;\n        else\n            destinationId = SEAGALLOP_FOUR_ISLAND;\n        numItems = 5;\n        top = 2;\n    }\n    else\n    {\n        destinationId = SEAGALLOP_VERMILION_CITY;\n        numItems = 6;\n        top = 0;\n    }\n    cursorWidth = GetMenuCursorDimensionByFont(FONT_NORMAL, 0);\n    fontHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT);\n    windowId = CreateWindowFromRect(17, top, 11, numItems * 2);\n    SetStdWindowBorderStyle(windowId, FALSE);\n    \n    // -2 excludes \"Other\" and \"Exit\", appended after the loop\n    for (i = 0; i < numItems - 2; i++)\n    {\n        if (destinationId != gSpecialVar_0x8004)\n            AddTextPrinterParameterized(windowId, FONT_NORMAL, sSeagallopDestStrings[destinationId], cursorWidth, i * 16 + 2, TEXT_SKIP_DRAW, NULL);\n        else\n            i--;\n        destinationId++;\n\n        // Wrap around\n        if (destinationId == SEAGALLOP_SEVEN_ISLAND + 1)\n            destinationId = SEAGALLOP_VERMILION_CITY;\n    }\n    AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_Other, cursorWidth, i * 16 + 2, TEXT_SKIP_DRAW, NULL);\n    i++;\n    AddTextPrinterParameterized(windowId, FONT_NORMAL, gOtherText_Exit, cursorWidth, i * 16 + 2, TEXT_SKIP_DRAW, NULL);\n    Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 16, numItems, 0);\n    CreateMCMenuInputHandlerTask(FALSE, numItems, windowId, MULTICHOICE_NONE);\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nu16 GetSelectedSeagallopDestination(void)\n{\n    // 8004 = Starting location\n    // 8005 = Page (0: Verm, One, Two, Three, Four, Other, Exit; 1: Four, Five, Six, Seven, Other, Exit)\n    if (gSpecialVar_Result == SCR_MENU_CANCEL)\n        return SCR_MENU_CANCEL;\n    if (gSpecialVar_0x8005 == 1)\n    {\n        if (gSpecialVar_Result == 3)\n        {\n            return SEAGALLOP_MORE;\n        }\n        else if (gSpecialVar_Result == 4)\n        {\n            return SCR_MENU_CANCEL;\n        }\n        else if (gSpecialVar_Result == 0)\n        {\n            if (gSpecialVar_0x8004 > SEAGALLOP_FOUR_ISLAND)\n                return SEAGALLOP_FOUR_ISLAND;\n            else\n                return SEAGALLOP_FIVE_ISLAND;\n        }\n        else if (gSpecialVar_Result == 1)\n        {\n            if (gSpecialVar_0x8004 > SEAGALLOP_FIVE_ISLAND)\n                return SEAGALLOP_FIVE_ISLAND;\n            else\n                return SEAGALLOP_SIX_ISLAND;\n        }\n        else if (gSpecialVar_Result == 2)\n        {\n            if (gSpecialVar_0x8004 > SEAGALLOP_SIX_ISLAND)\n                return SEAGALLOP_SIX_ISLAND;\n            else\n                return SEAGALLOP_SEVEN_ISLAND;\n        }\n    }\n    else\n    {\n        if (gSpecialVar_Result == 4)\n            return SEAGALLOP_MORE;\n        else if (gSpecialVar_Result == 5)\n            return SCR_MENU_CANCEL;\n        else if (gSpecialVar_Result >= gSpecialVar_0x8004)\n            return gSpecialVar_Result + 1;\n        else\n            return gSpecialVar_Result;\n    }\n    return SEAGALLOP_VERMILION_CITY;\n}\n"
  },
  {
    "path": "src/script_movement.c",
    "content": "#include \"global.h\"\n#include \"task.h\"\n#include \"util.h\"\n#include \"event_object_movement.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/event_object_movement.h\"\n\nstatic EWRAM_DATA const u8 (*sMovementScripts[OBJECT_EVENTS_COUNT]) = {};\n\nstatic void ScriptMovement_StartMoveObjects(u8 priority);\nstatic u8 GetMoveObjectsTaskId(void);\nstatic u8 ScriptMovement_TryAddNewMovement(u8 taskId, u8 objEventId, const u8 *movementScript);\nstatic u8 GetMovementScriptIdFromObjectEventId(u8 taskId, u8 objEventId);\nstatic bool8 IsMovementScriptFinished(u8 taskId, u8 moveScrId);\nstatic void ScriptMovement_MoveObjects(u8 taskId);\nstatic void ScriptMovement_AddNewMovement(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript);\nstatic void ScriptMovement_UnfreezeActiveObjects(u8 taskId);\nstatic void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript);\n\nbool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript)\n{\n    u8 objEventId;\n    if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objEventId))\n        return TRUE;\n\n    if (!FuncIsActiveTask(ScriptMovement_MoveObjects))\n        ScriptMovement_StartMoveObjects(50);\n    return ScriptMovement_TryAddNewMovement(GetMoveObjectsTaskId(), objEventId, movementScript);\n}\n\nbool8 ScriptMovement_IsObjectMovementFinished(u8 localId, u8 mapNum, u8 mapGroup)\n{\n    u8 objEventId;\n    u8 taskId;\n    u8 moveScrId;\n    if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objEventId))\n        return TRUE;\n    taskId = GetMoveObjectsTaskId();\n    moveScrId = GetMovementScriptIdFromObjectEventId(taskId, objEventId);\n    if (moveScrId == OBJECT_EVENTS_COUNT)\n        return TRUE;\n    return IsMovementScriptFinished(taskId, moveScrId);\n}\n\nvoid ScriptMovement_UnfreezeObjectEvents(void)\n{\n    u8 taskId = GetMoveObjectsTaskId();\n    if (taskId != TAIL_SENTINEL)\n    {\n        ScriptMovement_UnfreezeActiveObjects(taskId);\n        DestroyTask(taskId);\n    }\n}\n\nvoid ScriptMovement_StartMoveObjects(u8 priority)\n{\n    u32 i;\n    u8 taskId = CreateTask(ScriptMovement_MoveObjects, priority);\n    for (i = 1; i < NUM_TASK_DATA; i++)\n    {\n        gTasks[taskId].data[i] = -1;\n    }\n}\n\nu8 GetMoveObjectsTaskId(void)\n{\n    return FindTaskIdByFunc(ScriptMovement_MoveObjects);\n}\n\nbool8 ScriptMovement_TryAddNewMovement(u8 taskId, u8 objEventId, const u8 *movementScript)\n{\n    u8 moveScrId;\n\n    moveScrId = GetMovementScriptIdFromObjectEventId(taskId, objEventId);\n    if (moveScrId != OBJECT_EVENTS_COUNT)\n    {\n        if (IsMovementScriptFinished(taskId, moveScrId) == FALSE)\n        {\n            return TRUE;\n        }\n        else\n        {\n            ScriptMovement_AddNewMovement(taskId, moveScrId, objEventId, movementScript);\n            return FALSE;\n        }\n    }\n    moveScrId = GetMovementScriptIdFromObjectEventId(taskId, OBJ_EVENT_ID_PLAYER);\n    if (moveScrId == OBJECT_EVENTS_COUNT)\n    {\n        return TRUE;\n    }\n    else\n    {\n        ScriptMovement_AddNewMovement(taskId, moveScrId, objEventId, movementScript);\n        return FALSE;\n    }\n}\n\nu8 GetMovementScriptIdFromObjectEventId(u8 taskId, u8 objEventId)\n{\n    u32 i;\n    u8 *moveScriptId = (u8 *)&gTasks[taskId].data[1];\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++, moveScriptId++)\n    {\n        if (*moveScriptId == objEventId)\n            return i;\n    }\n    return OBJECT_EVENTS_COUNT;\n}\n\nvoid LoadObjectEventIdPtrFromMovementScript(u8 taskId, u8 moveScrId, u8 **pObjEventId)\n{\n    u32 i;\n\n    *pObjEventId = (u8 *)&gTasks[taskId].data[1];\n    for (i = 0; i < moveScrId; i++, (*pObjEventId)++)\n        ;\n}\n\nvoid SetObjectEventIdAtMovementScript(u8 taskId, u8 moveScrId, u8 objEventId)\n{\n    u8 *ptr;\n\n    LoadObjectEventIdPtrFromMovementScript(taskId, moveScrId, &ptr);\n    *ptr = objEventId;\n}\n\nvoid LoadObjectEventIdFromMovementScript(u8 taskId, u8 moveScrId, u8 *objEventId)\n{\n    u8 *ptr;\n\n    LoadObjectEventIdPtrFromMovementScript(taskId, moveScrId, &ptr);\n    *objEventId = *ptr;\n}\n\n\nstatic void ClearMovementScriptFinished(u8 taskId, u8 moveScrId)\n{\n    u16 mask = ~gBitTable[moveScrId];\n\n    gTasks[taskId].data[0] &= mask;\n}\n\nstatic void SetMovementScriptFinished(u8 taskId, u8 moveScrId)\n{\n    gTasks[taskId].data[0] |= gBitTable[moveScrId];\n}\n\nstatic bool8 IsMovementScriptFinished(u8 taskId, u8 moveScrId)\n{\n    u16 moveScriptFinished = (u16)gTasks[taskId].data[0] & gBitTable[moveScrId];\n\n    if (moveScriptFinished != 0)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void SetMovementScript(u8 moveScrId, const u8 *movementScript)\n{\n    sMovementScripts[moveScrId] = movementScript;\n}\n\nstatic const u8 *GetMovementScript(u8 moveScrId)\n{\n    return sMovementScripts[moveScrId];\n}\n\nstatic void ScriptMovement_AddNewMovement(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript)\n{\n    ClearMovementScriptFinished(taskId, moveScrId);\n    SetMovementScript(moveScrId, movementScript);\n    SetObjectEventIdAtMovementScript(taskId, moveScrId, objEventId);\n}\n\nstatic void ScriptMovement_UnfreezeActiveObjects(u8 taskId)\n{\n    u8 *pObjEventId;\n    u32 i;\n\n    pObjEventId = (u8 *)&gTasks[taskId].data[1];\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++, pObjEventId++)\n    {\n        if (*pObjEventId != 0xFF)\n            UnfreezeObjectEvent(&gObjectEvents[*pObjEventId]);\n    }\n}\n\nstatic void ScriptMovement_MoveObjects(u8 taskId)\n{\n    u32 i;\n    u8 objEventId;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        LoadObjectEventIdFromMovementScript(taskId, i, &objEventId);\n        if (objEventId != 0xFF)\n            ScriptMovement_TakeStep(taskId, i, objEventId, GetMovementScript(i));\n    }\n}\n\nstatic void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript)\n{\n    u8 nextMoveActionId;\n\n    if (IsMovementScriptFinished(taskId, moveScrId) == TRUE)\n        return;\n    if (ObjectEventIsHeldMovementActive(&gObjectEvents[objEventId])\n        && !ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objEventId]))\n        return;\n\n    nextMoveActionId = *movementScript;\n    if (nextMoveActionId == MOVEMENT_ACTION_STEP_END)\n    {\n        SetMovementScriptFinished(taskId, moveScrId);\n        FreezeObjectEvent(&gObjectEvents[objEventId]);\n    }\n    else\n    {\n        if (!ObjectEventSetHeldMovement(&gObjectEvents[objEventId], nextMoveActionId))\n        {\n            movementScript++;\n            SetMovementScript(moveScrId, movementScript);\n        }\n    }\n}\n"
  },
  {
    "path": "src/script_pokemon_util.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle_setup.h\"\n#include \"berry.h\"\n#include \"daycare.h\"\n#include \"event_data.h\"\n#include \"load_save.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"pokedex.h\"\n#include \"script_pokemon_util.h\"\n#include \"constants/items.h\"\n#include \"constants/maps.h\"\n#include \"constants/species.h\"\n#include \"constants/pokemon.h\"\n#include \"constants/region_map_sections.h\"\n\nstatic void CB2_ReturnFromChooseHalfParty(void);\nstatic void CB2_ReturnFromChooseBattleTowerParty(void);\n\n #define IN_OAKS_LAB \\\n    (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PROFESSOR_OAKS_LAB) \\\n  && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PROFESSOR_OAKS_LAB))    \\\n\nvoid HealPlayerParty(void)\n{\n    u8 i, j;\n    u8 ppBonuses;\n    u8 arg[4];\n\n    if(gSaveBlock1Ptr->keyFlags.noPMC == 0 && gSaveBlock1Ptr->keyFlags.nuzlocke == 0)\n    {\n        HealPlayerPartyOak();\n        return;\n    }\n\n    if(gSaveBlock1Ptr->keyFlags.noPMC == 1 && !FlagGet(FLAG_SYS_IS_LINKING))\n    {   //do nothing if noPMC on and not linking\n        return;\n    }\n    // restore HP.\n    for(i = 0; i < gPlayerPartyCount; i++)\n    {\n        u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);\n        arg[0] = maxHP;\n        arg[1] = maxHP >> 8;\n        if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n        {\n            if(GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0 && !FlagGet(FLAG_SYS_IS_LINKING)) //don't heal fainted Pokemon in Nuzlocke except when linking\n                SetMonData(&gPlayerParty[i], MON_DATA_HP, arg);\n        }\n        ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES);\n\n        if(GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0 && gSaveBlock1Ptr->keyFlags.nuzlocke == 1 && !FlagGet(FLAG_SYS_IS_LINKING)) //don't heal fainted Pokemon in Nuzlocke except when linking\n        {\n            // restore PP.\n            for(j = 0; j < MAX_MON_MOVES; j++)\n            {\n                arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j);\n                SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg);\n            }\n        }\n\n        // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData.\n        arg[0] = 0;\n        arg[1] = 0;\n        arg[2] = 0;\n        arg[3] = 0;\n        SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg);\n    }\n}\n\nvoid HealPlayerPartyOak(void)\n{\n    u8 i, j;\n    u8 ppBonuses;\n    u8 arg[4];\n\n    // restore HP.\n    for(i = 0; i < gPlayerPartyCount; i++)\n    {\n        u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);\n        arg[0] = maxHP;\n        arg[1] = maxHP >> 8;\n        SetMonData(&gPlayerParty[i], MON_DATA_HP, arg);\n        ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES);\n\n        // restore PP.\n        for(j = 0; j < MAX_MON_MOVES; j++)\n        {\n            arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j);\n            SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg);\n        }\n\n        // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData.\n        arg[0] = 0;\n        arg[1] = 0;\n        arg[2] = 0;\n        arg[3] = 0;\n        SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg);\n    }\n}\n\nu8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 unused3)\n{\n    u16 nationalDexNum;\n    int sentToPc;\n    u8 heldItem[2];\n    struct Pokemon *mon = AllocZeroed(sizeof(struct Pokemon));\n    u16 zeroHP = 0;\n    u32 wasFirstCatch = 0;\n\n    CreateMon(mon, species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0);\n    heldItem[0] = item;\n    heldItem[1] = item >> 8;\n    SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);\n    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 && !IN_OAKS_LAB) //if this is Oak's Lab, don't set Nuzlocke flags\n    {\n        if(NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == TRUE) //already caught something here, faint mon\n        {\n            SetMonData(mon, MON_DATA_HP, &zeroHP);\n        }\n        if(!IsWildMonNuzlockeDupe(species))\n        {\n            NuzlockeFlagSet(GetCurrentRegionMapSectionId());\n            wasFirstCatch = 1;\n        }\n    }\n    CalculateMonStats(mon, FALSE);\n    sentToPc = GiveMonToPlayer(mon);\n    nationalDexNum = SpeciesToNationalPokedexNum(species);\n\n    switch(sentToPc)\n    {\n    case MON_GIVEN_TO_PARTY:\n    case MON_GIVEN_TO_PC:\n        GetSetPokedexFlag(nationalDexNum, FLAG_SET_SEEN);\n        GetSetPokedexFlag(nationalDexNum, FLAG_SET_CAUGHT);\n        if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n        {\n            if(wasFirstCatch)\n            {   //if first catch in area, set dupe flag for this species.\n                SetNuzlockeDupeFlags(SpeciesToNationalPokedexNum(species));\n            }\n        }\n        break;\n    }\n\n    Free(mon);\n    return sentToPc;\n}\n\nu8 ScriptGiveEgg(u16 species)\n{\n    struct Pokemon *mon = AllocZeroed(sizeof(struct Pokemon));\n    bool8 isEgg;\n    bool8 sentToPc;\n\n    CreateEgg(mon, species, TRUE);\n    isEgg = TRUE;\n    SetMonData(mon, MON_DATA_IS_EGG, &isEgg);\n\n    sentToPc = GiveMonToPlayer(mon);\n    Free(mon);\n    return sentToPc;\n}\n\nvoid HasEnoughMonsForDoubleBattle(void)\n{\n    switch (GetMonsStateToDoubles())\n    {\n    case PLAYER_HAS_TWO_USABLE_MONS:\n        gSpecialVar_Result = PLAYER_HAS_TWO_USABLE_MONS;\n        break;\n    case PLAYER_HAS_ONE_MON:\n        gSpecialVar_Result = PLAYER_HAS_ONE_MON;\n        break;\n    case PLAYER_HAS_ONE_USABLE_MON:\n        gSpecialVar_Result = PLAYER_HAS_ONE_USABLE_MON;\n        break;\n    }\n}\n\nstatic bool8 CheckPartyMonHasHeldItem(u16 item)\n{\n    int i;\n\n    for(i = 0; i < PARTY_SIZE; i++)\n    {\n        u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG);\n        if (species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == item)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nbool8 DoesPartyHaveEnigmaBerry(void)\n{\n    bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY);\n    if (hasItem == TRUE)\n        GetBerryNameByBerryType(ItemIdToBerryType(ITEM_ENIGMA_BERRY), gStringVar1);\n\n    return hasItem;\n}\n\nvoid CreateScriptedWildMon(u16 species, u8 level, u16 item)\n{\n    u8 heldItem[2];\n    u8 version = VERSION_EMERALD;\n\n    ZeroEnemyPartyMons();\n    CreateMon(&gEnemyParty[0], species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0);\n    if (item)\n    {\n        heldItem[0] = item;\n        heldItem[1] = item >> 8;\n        SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem);\n    }\n    if(species == SPECIES_SUDOWOODO && level == 40 && gMapHeader.regionMapSectionId == MAPSEC_BATTLE_FRONTIER)\n    {\n        SetMonData(&gEnemyParty[0], MON_DATA_MET_GAME, &version);\n    }\n}\n\nvoid ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot)\n{\n    if (monIndex > PARTY_SIZE)\n        monIndex = gPlayerPartyCount - 1;\n\n    SetMonMoveSlot(&gPlayerParty[monIndex], move, slot);\n}\n\n// Note: When control returns to the event script, gSpecialVar_Result will be\n// TRUE if the party selection was successful.\nvoid ChooseHalfPartyForBattle(void)\n{\n    gMain.savedCallback = CB2_ReturnFromChooseHalfParty;\n//    VarSet(VAR_FRONTIER_FACILITY, FACILITY_MULTI_OR_EREADER);\n    InitChooseMonsForBattle(CHOOSE_MONS_FOR_CABLE_CLUB_BATTLE);\n}\n\nstatic void CB2_ReturnFromChooseHalfParty(void)\n{\n    switch (gSelectedOrderFromParty[0])\n    {\n    case 0:\n        gSpecialVar_Result = FALSE;\n        break;\n    default:\n        gSpecialVar_Result = TRUE;\n        break;\n    }\n\n    SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n}\n\nvoid ChooseBattleTowerPlayerParty(void)\n{\n    gMain.savedCallback = CB2_ReturnFromChooseBattleTowerParty;\n    InitChooseMonsForBattle(CHOOSE_MONS_FOR_BATTLE_TOWER);\n}\n\nstatic void CB2_ReturnFromChooseBattleTowerParty(void)\n{\n    switch (gSelectedOrderFromParty[0])\n    {\n    case 0:\n        LoadPlayerParty();\n        gSpecialVar_Result = FALSE;\n        break;\n    default:\n        ReducePlayerPartyToThree();\n        gSpecialVar_Result = TRUE;\n        break;\n    }\n\n    SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n}\n\nvoid ReducePlayerPartyToThree(void)\n{\n    struct Pokemon * party = AllocZeroed(3 * sizeof(struct Pokemon));\n    int i;\n\n    // copy the selected pokemon according to the order.\n    for (i = 0; i < 3; i++)\n        if (gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop\n            party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal\n\n    CpuFill32(0, gPlayerParty, sizeof gPlayerParty);\n\n    // overwrite the first 3 with the order copied to.\n    for (i = 0; i < 3; i++)\n        gPlayerParty[i] = party[i];\n\n    CalculatePlayerPartyCount();\n    Free(party);\n}\n"
  },
  {
    "path": "src/seagallop.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"scanline_effect.h\"\n#include \"trainer_pokemon_sprites.h\"\n#include \"text_window.h\"\n#include \"task.h\"\n#include \"help_system.h\"\n#include \"overworld.h\"\n#include \"event_data.h\"\n#include \"field_fadetransition.h\"\n#include \"field_weather.h\"\n#include \"constants/songs.h\"\n#include \"constants/maps.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/seagallop.h\"\n\n#define TILESTAG_FERRY 3000\n#define TILESTAG_WAKE  4000\n\n#define PALTAG_FERRY_WAKE 3000\n\nstatic EWRAM_DATA void *sBg3TilemapBuffer = NULL;\n\nstatic void CB2_SetUpSeagallopScene(void);\nstatic void VBlankCB_SeaGallop(void);\nstatic void MainCB2_SeaGallop(void);\nstatic void Task_Seagallop_0(u8 taskId);\nstatic void Task_Seagallop_1(u8 taskId);\nstatic void Task_Seagallop_2(u8 taskId);\nstatic void Task_Seagallop_3(void);\nstatic void ResetGPU(void);\nstatic void ResetAllAssets(void);\nstatic void SetDispcnt(void);\nstatic void ResetBGPos(void);\nstatic void LoadFerrySpriteResources(void);\nstatic void FreeFerrySpriteResources(void);\nstatic void CreateFerrySprite(void);\nstatic void SpriteCB_Ferry(struct Sprite *sprite);\nstatic void CreateWakeSprite(s16 x);\nstatic void SpriteCB_Wake(struct Sprite *sprite);\nstatic bool8 GetDirectionOfTravel(void);\n\nstatic const u16 sWaterTiles[] = INCBIN_U16(\"graphics/seagallop/water.4bpp\");\nstatic const u16 sWaterPal[] = INCBIN_U16(\"graphics/seagallop/water.gbapal\");\nstatic const u16 sWaterTilemap_WB[] = INCBIN_U16(\"graphics/seagallop/wb_tilemap.bin\");\nstatic const u16 sWaterTilemap_EB[] = INCBIN_U16(\"graphics/seagallop/eb_tilemap.bin\");\nstatic const u16 sFerrySpriteTiles[] = INCBIN_U16(\"graphics/seagallop/ferry_sprite.4bpp\");\nstatic const u16 sFerryAndWakePal[] = INCBIN_U16(\"graphics/seagallop/ferry_and_wake.gbapal\");\nstatic const u16 sWakeSpriteTiles[] = INCBIN_U16(\"graphics/seagallop/wake.4bpp\");\n\nstatic const struct BgTemplate sBGTemplates[] = {\n    {\n        .bg = 3,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }\n};\n\nstatic const s8 sSeag[][4] = {\n                                   // Map                     X     Y\n    [SEAGALLOP_VERMILION_CITY]  = {MAP(VERMILION_CITY),      0x17, 0x20},\n    [SEAGALLOP_ONE_ISLAND]      = {MAP(ONE_ISLAND_HARBOR),   0x08, 0x05},\n    [SEAGALLOP_TWO_ISLAND]      = {MAP(TWO_ISLAND_HARBOR),   0x08, 0x05},\n    [SEAGALLOP_THREE_ISLAND]    = {MAP(THREE_ISLAND_HARBOR), 0x08, 0x05},\n    [SEAGALLOP_FOUR_ISLAND]     = {MAP(FOUR_ISLAND_HARBOR),  0x08, 0x05},\n    [SEAGALLOP_FIVE_ISLAND]     = {MAP(FIVE_ISLAND_HARBOR),  0x08, 0x05},\n    [SEAGALLOP_SIX_ISLAND]      = {MAP(SIX_ISLAND_HARBOR),   0x08, 0x05},\n    [SEAGALLOP_SEVEN_ISLAND]    = {MAP(SEVEN_ISLAND_HARBOR), 0x08, 0x05},\n    [SEAGALLOP_CINNABAR_ISLAND] = {MAP(CINNABAR_ISLAND),     0x15, 0x07},\n    [SEAGALLOP_NAVEL_ROCK]      = {MAP(NAVEL_ROCK_HARBOR),   0x08, 0x05},\n    [SEAGALLOP_BIRTH_ISLAND]    = {MAP(BIRTH_ISLAND_HARBOR), 0x08, 0x05},\n    [SEAGALLOP_FARAWAY_ISLAND]  = {MAP(FARAWAY_ISLAND_EXTERIOR), 13, 38},\n    [SEAGALLOP_BATTLE_TOWER]    = {MAP(RS_BATTLE_TOWER),     19, 24},\n    [SEAGALLOP_SOUTHERN_ISLAND] = {MAP(SOUTHERN_ISLAND_EXTERIOR), 13, 22}\n};\n\n// Bitpacked array.  In the commented section, right-most bit is the\n// flag for traveling from (row port) to Vermilion City, and so on.\n// Flags follow these enums:\n\nenum TravelDirections\n{\n    DIRN_WESTBOUND = 0,\n    DIRN_EASTBOUND = 1\n};\n\nstatic const u16 sTravelDirectionMatrix[] = {\n    [SEAGALLOP_VERMILION_CITY]  = 0x6fe, // 11011111110\n    [SEAGALLOP_ONE_ISLAND]      = 0x6fc, // 11011111100\n    [SEAGALLOP_TWO_ISLAND]      = 0x6f8, // 11011111000\n    [SEAGALLOP_THREE_ISLAND]    = 0x6f0, // 11011110000\n    [SEAGALLOP_FOUR_ISLAND]     = 0x6e0, // 11011100000\n    [SEAGALLOP_FIVE_ISLAND]     = 0x4c0, // 10011000000\n    [SEAGALLOP_SIX_ISLAND]      = 0x400, // 10000000000\n    [SEAGALLOP_SEVEN_ISLAND]    = 0x440, // 10001000000\n    [SEAGALLOP_CINNABAR_ISLAND] = 0x7ff, // 11111111111\n    [SEAGALLOP_NAVEL_ROCK]      = 0x6e0, // 11011100000\n    [SEAGALLOP_BIRTH_ISLAND]    = 0x000  // 00000000000\n};\n\nstatic const union AnimCmd sSpriteAnims_Ferry_WB[] = {\n    ANIMCMD_FRAME(0, 10),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnims_Ferry_EB[] = {\n    ANIMCMD_FRAME(0, 10, .hFlip = TRUE),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_Ferry[] = {\n    sSpriteAnims_Ferry_WB,\n    sSpriteAnims_Ferry_EB\n};\n\nstatic const struct OamData sOamData_Ferry = {\n    .size = 3\n};\n\nstatic const struct SpriteTemplate sFerrySpriteTemplate = {\n    TILESTAG_FERRY,\n    PALTAG_FERRY_WAKE,\n    &sOamData_Ferry,\n    sSpriteAnimTable_Ferry,\n    NULL,\n    gDummySpriteAffineAnimTable,\n    SpriteCB_Ferry\n};\n\nstatic const struct SpriteSheet sFerryAndWakeSpriteSheets[] = {\n    {(const void *)sWakeSpriteTiles,  sizeof(sWakeSpriteTiles),  TILESTAG_WAKE},\n    {(const void *)sFerrySpriteTiles, sizeof(sFerrySpriteTiles), TILESTAG_FERRY},\n    {}\n};\n\nstatic const struct SpritePalette sFerryAndWakeSpritePalettes[] = {\n    {sFerryAndWakePal, PALTAG_FERRY_WAKE},\n    {}\n};\n\nstatic const union AnimCmd sSpriteAnims_Wake_WB[] = {\n    ANIMCMD_FRAME(0x00, 0x14),\n    ANIMCMD_FRAME(0x10, 0x14),\n    ANIMCMD_FRAME(0x20, 0x0f),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd sSpriteAnims_Wake_EB[] = {\n    ANIMCMD_FRAME(0x00, 0x14, .hFlip = TRUE),\n    ANIMCMD_FRAME(0x10, 0x14, .hFlip = TRUE),\n    ANIMCMD_FRAME(0x20, 0x0f, .hFlip = TRUE),\n    ANIMCMD_END,\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_Wake[] = {\n    sSpriteAnims_Wake_WB,\n    sSpriteAnims_Wake_EB\n};\n\nstatic const struct OamData sOamData_Wake = {\n    .size = 2\n};\n\nstatic const struct SpriteTemplate sWakeSpriteTemplate = {\n    TILESTAG_WAKE,\n    PALTAG_FERRY_WAKE,\n    &sOamData_Wake,\n    sSpriteAnimTable_Wake,\n    NULL,\n    gDummySpriteAffineAnimTable,\n    SpriteCB_Wake\n};\n\nvoid DoSeagallopFerryScene(void)\n{\n    SetVBlankCallback(NULL);\n    HelpSystem_Disable();\n    SetMainCallback2(CB2_SetUpSeagallopScene);\n}\n\nstatic void CB2_SetUpSeagallopScene(void)\n{\n    void ** ptr;\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankCallback(NULL); // redundant since the setup routine already did this\n        ResetGPU();\n        gMain.state++;\n        break;\n    case 1:\n        ResetAllAssets();\n        gMain.state++;\n        break;\n    case 2:\n        ptr = &sBg3TilemapBuffer;\n        *ptr = AllocZeroed(0x800);\n        ResetBgsAndClearDma3BusyFlags(0);\n        InitBgsFromTemplates(0, sBGTemplates, NELEMS(sBGTemplates));\n        SetBgTilemapBuffer(3, *ptr);\n        ResetBGPos();\n        gMain.state++;\n        break;\n    case 3:\n        LoadBgTiles(3, sWaterTiles, sizeof(sWaterTiles), 0);\n        if (GetDirectionOfTravel() == DIRN_EASTBOUND)\n            CopyToBgTilemapBufferRect(3, sWaterTilemap_EB, 0, 0, 32, 32);\n        else\n            CopyToBgTilemapBufferRect(3, sWaterTilemap_WB, 0, 0, 32, 32);\n        LoadPalette(sWaterPal, BG_PLTT_ID(4), sizeof(sWaterPal));\n        LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n        gMain.state++;\n        break;\n    case 4:\n        if (IsDma3ManagerBusyWithBgCopy() != DIRN_EASTBOUND)\n        {\n            ShowBg(0);\n            ShowBg(3);\n            CopyBgTilemapBufferToVram(3);\n            gMain.state++;\n        }\n        break;\n    case 5:\n        LoadFerrySpriteResources();\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        gMain.state++;\n        break;\n    case 6:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        gMain.state++;\n        break;\n    case 7:\n        SetDispcnt();\n        SetVBlankCallback(VBlankCB_SeaGallop);\n        PlaySE(SE_SHIP);\n        CreateFerrySprite();\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        SetGpuReg(REG_OFFSET_WININ, 0x3F);\n        SetGpuReg(REG_OFFSET_WINOUT, 0x00);\n        SetGpuReg(REG_OFFSET_WIN0H, 0x00F0);\n        SetGpuReg(REG_OFFSET_WIN0V, 0x1888);\n        CreateTask(Task_Seagallop_0, 8);\n        SetMainCallback2(MainCB2_SeaGallop);\n        gMain.state = 0;\n        break;\n    }\n}\n\nstatic void VBlankCB_SeaGallop(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void MainCB2_SeaGallop(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void Task_Seagallop_0(u8 taskId)\n{\n    gTasks[taskId].func = Task_Seagallop_1;\n}\n\nstatic void ScrollBG(void)\n{\n    if (GetDirectionOfTravel() == DIRN_EASTBOUND)\n    {\n        ChangeBgX(3, 0x600, 1);\n    }\n    else\n    {\n        ChangeBgX(3, 0x600, 2);\n    }\n}\n\nstatic void Task_Seagallop_1(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n\n    ScrollBG();\n    if (++task->data[1] == 140)\n    {\n        Overworld_FadeOutMapMusic();\n        WarpFadeOutScreen();\n        task->func = Task_Seagallop_2;\n    }\n}\n\nstatic void Task_Seagallop_2(u8 taskId)\n{\n    ScrollBG();\n    if (BGMusicStopped() && !gPaletteFade.active)\n    {\n        Task_Seagallop_3();\n        HelpSystem_Enable();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_Seagallop_3(void)\n{\n    const s8 * warpInfo;\n\n    if (gSpecialVar_0x8006 >= NELEMS(sSeag))\n        gSpecialVar_0x8006 = 0;\n\n    warpInfo = sSeag[gSpecialVar_0x8006];\n    SetWarpDestination(warpInfo[0], warpInfo[1], -1, warpInfo[2], warpInfo[3]);\n    PlayRainStoppingSoundEffect();\n    PlaySE(SE_EXIT);\n    gFieldCallback = FieldCB_DefaultWarpExit;\n    WarpIntoMap();\n    SetMainCallback2(CB2_LoadMap);\n    ResetInitialPlayerAvatarState();\n    FreeFerrySpriteResources();\n    Free(sBg3TilemapBuffer);\n    FreeAllWindowBuffers();\n}\n\nstatic void ResetGPU(void)\n{\n    void *dest = (void *) VRAM;\n    DmaClearLarge16(3, dest, VRAM_SIZE, 0x1000);\n\n    DmaClear32(3, (void *)OAM, OAM_SIZE);\n    DmaClear16(3, (void *)PLTT, PLTT_SIZE);\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    SetGpuReg(REG_OFFSET_BG0CNT, 0);\n    SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1CNT, 0);\n    SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG2CNT, 0);\n    SetGpuReg(REG_OFFSET_BG2HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG3CNT, 0);\n    SetGpuReg(REG_OFFSET_BG3HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG3VOFS, 0);\n    SetGpuReg(REG_OFFSET_WIN0H, 0);\n    SetGpuReg(REG_OFFSET_WIN0V, 0);\n    SetGpuReg(REG_OFFSET_WININ, 0);\n    SetGpuReg(REG_OFFSET_WINOUT, 0);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n}\n\nstatic void ResetAllAssets(void)\n{\n    ScanlineEffect_Stop();\n    ResetTasks();\n    ResetSpriteData();\n    ResetAllPicSprites();\n    ResetPaletteFade();\n    FreeAllSpritePalettes();\n}\n\nstatic void SetDispcnt(void)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON);\n}\n\nstatic void ResetBGPos(void)\n{\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n}\n\nstatic void LoadFerrySpriteResources(void)\n{\n    LoadSpriteSheets(sFerryAndWakeSpriteSheets);\n    LoadSpritePalettes(sFerryAndWakeSpritePalettes);\n}\n\nstatic void FreeFerrySpriteResources(void)\n{\n    FreeSpriteTilesByTag(TILESTAG_FERRY);\n    FreeSpriteTilesByTag(TILESTAG_WAKE);\n    FreeSpritePaletteByTag(PALTAG_FERRY_WAKE);\n}\n\nstatic void CreateFerrySprite(void)\n{\n    u8 spriteId = CreateSprite(&sFerrySpriteTemplate, 0, 92, 0);\n    gSprites[spriteId].data[0] = 48;\n    if (GetDirectionOfTravel() == DIRN_EASTBOUND)\n    {\n        StartSpriteAnim(&gSprites[spriteId], 1);\n    }\n    else\n    {\n        gSprites[spriteId].x = 240;\n        gSprites[spriteId].data[0] *= -1;\n    }\n}\n\nstatic void SpriteCB_Ferry(struct Sprite *sprite)\n{\n    sprite->data[1] += sprite->data[0];\n    sprite->x2 = sprite->data[1] >> 4;\n    if (sprite->data[2] % 5 == 0)\n    {\n        CreateWakeSprite(sprite->x + sprite->x2);\n    }\n    sprite->data[2]++;\n    if ((u16)(300 + sprite->x2) > 600)\n    {\n        DestroySprite(sprite);\n    }\n}\n\nstatic void CreateWakeSprite(s16 x)\n{\n    u8 spriteId = CreateSprite(&sWakeSpriteTemplate, x, 92, 8);\n    if (spriteId != MAX_SPRITES)\n    {\n        if (GetDirectionOfTravel() == DIRN_EASTBOUND)\n        {\n            StartSpriteAnim(&gSprites[spriteId], 1);\n        }\n    }\n}\n\nstatic void SpriteCB_Wake(struct Sprite *sprite)\n{\n    if (sprite->animEnded)\n    {\n        DestroySprite(sprite);\n    }\n}\n\nstatic bool8 GetDirectionOfTravel(void)\n{\n    if (gSpecialVar_0x8004 >= NELEMS(sTravelDirectionMatrix))\n    {\n        return DIRN_EASTBOUND;\n    }\n    return (sTravelDirectionMatrix[gSpecialVar_0x8004] >> gSpecialVar_0x8006) & 1;\n}\n\n// For \"All aboard SEAGALLOP HI-SPEED ##\" text\nu8 GetSeagallopNumber(void)\n{\n    u16 originId, destId;\n\n    originId = gSpecialVar_0x8004;\n    destId = gSpecialVar_0x8006;\n\n    if (originId == SEAGALLOP_CINNABAR_ISLAND || destId == SEAGALLOP_CINNABAR_ISLAND)\n        return 1;\n\n    if (gMapHeader.regionMapSectionId == MAPSEC_FARAWAY_ISLAND)\n        return 14;\n\n    if (gMapHeader.regionMapSectionId == MAPSEC_BATTLE_FRONTIER || gMapHeader.regionMapSectionId == MAPSEC_SOUTHERN_ISLAND)\n        return 13;\n\n    if (originId == SEAGALLOP_VERMILION_CITY || destId == SEAGALLOP_VERMILION_CITY)\n        return 7;\n\n    if (originId == SEAGALLOP_NAVEL_ROCK || destId == SEAGALLOP_NAVEL_ROCK)\n        return 10;\n\n    if (originId == SEAGALLOP_BIRTH_ISLAND || destId == SEAGALLOP_BIRTH_ISLAND)\n        return 12;\n\n    if ((originId == SEAGALLOP_ONE_ISLAND \n      || originId == SEAGALLOP_TWO_ISLAND \n      || originId == SEAGALLOP_THREE_ISLAND) \n      && (destId == SEAGALLOP_ONE_ISLAND \n       || destId == SEAGALLOP_TWO_ISLAND \n       || destId == SEAGALLOP_THREE_ISLAND))\n        return 2;\n\n    if ((originId == SEAGALLOP_FOUR_ISLAND \n      || originId == SEAGALLOP_FIVE_ISLAND) \n      && (destId == SEAGALLOP_FOUR_ISLAND \n       || destId == SEAGALLOP_FIVE_ISLAND))\n        return 3;\n\n    if ((originId == SEAGALLOP_SIX_ISLAND \n      || originId == SEAGALLOP_SEVEN_ISLAND) \n      && (destId == SEAGALLOP_SIX_ISLAND \n       || destId == SEAGALLOP_SEVEN_ISLAND))\n        return 5;\n\n    return 6;\n}\n\nbool8 IsPlayerLeftOfVermilionSailor(void)\n{\n    if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(VERMILION_CITY) \n       && gSaveBlock1Ptr->location.mapNum == MAP_NUM(VERMILION_CITY) \n       && gSaveBlock1Ptr->pos.x < 24)\n        return TRUE;\n\n    return FALSE;\n}\n"
  },
  {
    "path": "src/shop.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"shop.h\"\n#include \"menu.h\"\n#include \"data.h\"\n#include \"graphics.h\"\n#include \"strings.h\"\n#include \"list_menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"party_menu.h\"\n#include \"field_specials.h\"\n#include \"field_weather.h\"\n#include \"task.h\"\n#include \"item.h\"\n#include \"item_menu.h\"\n#include \"overworld.h\"\n#include \"field_fadetransition.h\"\n#include \"scanline_effect.h\"\n#include \"item_menu_icons.h\"\n#include \"decompress.h\"\n#include \"menu_indicators.h\"\n#include \"field_player_avatar.h\"\n#include \"fieldmap.h\"\n#include \"event_object_movement.h\"\n#include \"money.h\"\n#include \"quest_log.h\"\n#include \"script.h\"\n#include \"strings.h\"\n#include \"constants/songs.h\"\n#include \"constants/items.h\"\n#include \"constants/game_stat.h\"\n#include \"constants/field_weather.h\"\n#include \"constants/region_map_sections.h\"\n\n#define tItemCount data[1]\n#define tItemId data[5]\n#define tListTaskId data[7]\n\n// mart types\nenum\n{\n    MART_TYPE_REGULAR = 0,\n    MART_TYPE_TMHM,\n    MART_TYPE_DECOR,\n    MART_TYPE_DECOR2,\n};\n\n// shop view window NPC info enum\nenum\n{\n    OBJECT_EVENT_ID,\n    X_COORD,\n    Y_COORD,\n    ANIM_NUM\n};\n\nstruct ShopData\n{\n    /*0x00*/ void (*callback)(void);\n    /*0x04*/ const u16 *itemList;\n    /*0x08*/ u32 itemPrice;\n    /*0x0C*/ u16 selectedRow;\n    /*0x0E*/ u16 scrollOffset;\n    /*0x10*/ u16 itemCount;\n    /*0x12*/ u16 itemsShowed;\n    /*0x14*/ u16 maxQuantity;\n    /*0x16*/ u16 martType:4;    // 0x1 if tm list\n             u16 fontId:5;\n             u16 itemSlot:2;\n             u16 unk16_11:5;\n    /*0x18*/ u16 unk18;\n};\n\nstatic EWRAM_DATA s16 sViewportObjectEvents[OBJECT_EVENTS_COUNT][4] = {0};\nstatic EWRAM_DATA struct ShopData sShopData = {0};\nstatic EWRAM_DATA u8 sShopMenuWindowId = 0;\nEWRAM_DATA u16 (*gShopTilemapBuffer1)[0x400] = {0};\nEWRAM_DATA u16 (*gShopTilemapBuffer2)[0x400] = {0};\nEWRAM_DATA u16 (*gShopTilemapBuffer3)[0x400] = {0};\nEWRAM_DATA u16 (*gShopTilemapBuffer4)[0x400] = {0};\nEWRAM_DATA struct ListMenuItem *sShopMenuListMenu = {0};\nstatic EWRAM_DATA u8 (*sShopMenuItemStrings)[13] = {0};\nEWRAM_DATA struct QuestLogEvent_Shop sHistory[2] = {0};\n\n//Function Declarations\nstatic u8 CreateShopMenu(u8 martType);\nstatic u8 GetMartTypeFromItemList(u32 a0);\nstatic void SetShopItemsForSale(const u16 *items);\nstatic void SetShopMenuCallback(MainCallback callback);\nstatic void Task_ShopMenu(u8 taskId);\nstatic void Task_HandleShopMenuBuy(u8 taskId);\nstatic void Task_HandleShopMenuSell(u8 taskId);\nstatic void CB2_GoToSellMenu(void);\nstatic void Task_HandleShopMenuQuit(u8 taskId);\nstatic void ClearShopMenuWindow(void);\nstatic void Task_GoToBuyOrSellMenu(u8 taskId);\nstatic void MapPostLoadHook_ReturnToShopMenu(void);\nstatic void Task_ReturnToShopMenu(u8 taskId);\nstatic void ShowShopMenuAfterExitingBuyOrSellMenu(u8 taskId);\nstatic void CB2_BuyMenu(void);\nstatic void VBlankCB_BuyMenu(void);\nstatic void CB2_InitBuyMenu(void);\nstatic bool8 InitShopData(void);\nstatic void BuyMenuInitBgs(void);\nstatic void BuyMenuDecompressBgGraphics(void);\nstatic void RecolorItemDescriptionBox(bool32 a0);\nstatic void BuyMenuDrawGraphics(void);\nstatic bool8 BuyMenuBuildListMenuTemplate(void);\nstatic void PokeMartWriteNameAndIdAt(struct ListMenuItem *list, u16 index, u8 *dst);\nstatic void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, struct ListMenu *list);\nstatic void BuyMenuPrintPriceInList(u8 windowId, u32 itemId, u8 y);\nstatic void LoadTmHmNameInMart(s32 item);\nstatic void BuyMenuPrintCursor(u8 listTaskId, u8 a1);\nstatic void BuyMenuPrintCursorAtYPosition(u8 y, u8 a1);\nstatic void BuyMenuFreeMemory(void);\nstatic void SetShopExitCallback(void);\nstatic void BuyMenuAddScrollIndicatorArrows(void);\nstatic void BuyQuantityAddScrollIndicatorArrows(void);\nstatic void BuyMenuRemoveScrollIndicatorArrows(void);\nstatic void BuyMenuDrawMapView(void);\nstatic void BuyMenuDrawMapBg(void);\nstatic void BuyMenuDrawMapMetatile(s16 x, s16 y, const u16 *src, u8 metatileLayerType);\nstatic void BuyMenuDrawMapMetatileLayer(u16 *dest, s16 offset1, s16 offset2, const u16 *src);\nstatic void BuyMenuCollectObjectEventData(void);\nstatic void BuyMenuDrawObjectEvents(void);\nstatic void BuyMenuCopyTilemapData(void);\nstatic void BuyMenuPrintItemQuantityAndPrice(u8 taskId);\nstatic void Task_BuyMenu(u8 taskId);\nstatic void Task_BuyHowManyDialogueInit(u8 taskId);\nstatic void Task_BuyHowManyDialogueHandleInput(u8 taskId);\nstatic void CreateBuyMenuConfirmPurchaseWindow(u8 taskId);\nstatic void BuyMenuTryMakePurchase(u8 taskId);\nstatic void BuyMenuSubtractMoney(u8 taskId);\nstatic void Task_ReturnToItemListAfterItemPurchase(u8 taskId);\nstatic void BuyMenuReturnToItemList(u8 taskId);\nstatic void ExitBuyMenu(u8 taskId);\nstatic void Task_ExitBuyMenu(u8 taskId);\nstatic void DebugFunc_PrintPurchaseDetails(u8 taskId);\nstatic void DebugFunc_PrintShopMenuHistoryBeforeClearMaybe(void);\nstatic void RecordTransactionForQuestLog(void);\n\nstatic const struct MenuAction sShopMenuActions_BuySellQuit[] =\n{\n    {gText_ShopBuy, {.void_u8 = Task_HandleShopMenuBuy}},\n    {gText_ShopSell, {.void_u8 = Task_HandleShopMenuSell}},\n    {gText_ShopQuit, {.void_u8 = Task_HandleShopMenuQuit}}\n};\n\nstatic const struct YesNoFuncTable sShopMenuActions_BuyQuit[] =\n{\n    BuyMenuTryMakePurchase,\n    BuyMenuReturnToItemList\n};\n\nstatic const struct WindowTemplate sShopMenuWindowTemplate =\n{\n    .bg = 0,\n    .tilemapLeft = 2,\n    .tilemapTop = 1,\n    .width = 12,\n    .height = 6,\n    .paletteNum = 15,\n    .baseBlock = 8\n};\n\nstatic const struct BgTemplate sShopBuyMenuBgTemplates[4] =\n{\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0\n    },\n    {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0\n    },\n    {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0\n    },\n    {\n        .bg = 3,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 28,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0\n    }\n};\n\n// Functions\nstatic u8 CreateShopMenu(u8 martType)\n{\n    sShopData.martType = GetMartTypeFromItemList(martType);\n    sShopData.selectedRow = 0;\n    if (ContextNpcGetTextColor() == NPC_TEXT_COLOR_MALE)\n        sShopData.fontId = FONT_MALE;\n    else\n        sShopData.fontId = FONT_FEMALE;\n\n    sShopMenuWindowId = AddWindow(&sShopMenuWindowTemplate);\n    SetStdWindowBorderStyle(sShopMenuWindowId, 0);\n    PrintTextArray(sShopMenuWindowId, FONT_NORMAL, GetMenuCursorDimensionByFont(FONT_NORMAL, 0), 2, 16, 3, sShopMenuActions_BuySellQuit);\n    Menu_InitCursor(sShopMenuWindowId, FONT_NORMAL, 0, 2, 16, 3, 0);\n    PutWindowTilemap(sShopMenuWindowId);\n    CopyWindowToVram(sShopMenuWindowId, COPYWIN_MAP);\n    return CreateTask(Task_ShopMenu, 8);\n}\n\nstatic u8 GetMartTypeFromItemList(u32 martType)\n{\n    u32 i;\n\n    if (martType != MART_TYPE_REGULAR)\n        return martType;\n\n    for (i = 0; i < sShopData.itemCount && sShopData.itemList[i] != 0; i++)\n    {\n        if (ItemId_GetPocket(sShopData.itemList[i]) == POCKET_TM_CASE)\n            return MART_TYPE_TMHM;\n    }\n    return MART_TYPE_REGULAR;\n}\n\nstatic void SetShopItemsForSale(const u16 *items)\n{\n    sShopData.itemList = items;\n    sShopData.itemCount = 0;\n    if (sShopData.itemList[0] == 0)\n        return;\n\n    while (sShopData.itemList[sShopData.itemCount])\n    {\n        ++sShopData.itemCount;\n    }\n}\n\nstatic void SetShopMenuCallback(void (*callback)(void))\n{\n    sShopData.callback = callback;\n}\n\nstatic void Task_ShopMenu(u8 taskId)\n{\n    s8 input = Menu_ProcessInputNoWrapAround();\n\n    switch (input)\n    {\n    case MENU_NOTHING_CHOSEN:\n        break;\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        Task_HandleShopMenuQuit(taskId);\n        break;\n    default:\n        sShopMenuActions_BuySellQuit[Menu_GetCursorPos()].func.void_u8(taskId);\n        break;\n    }\n}\n\nstatic void Task_HandleShopMenuBuy(u8 taskId)\n{\n    SetWordTaskArg(taskId, 0xE, (u32)CB2_InitBuyMenu);\n    FadeScreen(FADE_TO_BLACK, 0);\n    gTasks[taskId].func = Task_GoToBuyOrSellMenu;\n}\n\nstatic void Task_HandleShopMenuSell(u8 taskId)\n{\n    SetWordTaskArg(taskId, 0xE, (u32)CB2_GoToSellMenu);\n    FadeScreen(FADE_TO_BLACK, 0);\n    gTasks[taskId].func = Task_GoToBuyOrSellMenu;\n}\n\nstatic void CB2_GoToSellMenu(void)\n{\n    GoToBagMenu(ITEMMENULOCATION_SHOP, OPEN_BAG_LAST, CB2_ReturnToField);\n    gFieldCallback = MapPostLoadHook_ReturnToShopMenu;\n}\n\nstatic void Task_HandleShopMenuQuit(u8 taskId)\n{\n    ClearShopMenuWindow();\n    RecordTransactionForQuestLog();\n    DestroyTask(taskId);\n    if (sShopData.callback != NULL)\n        sShopData.callback();\n}\n\nstatic void ClearShopMenuWindow(void)\n{\n    ClearStdWindowAndFrameToTransparent(sShopMenuWindowId, 2);\n    RemoveWindow(sShopMenuWindowId);\n}\n\nstatic void Task_GoToBuyOrSellMenu(u8 taskId)\n{\n    if (gPaletteFade.active)\n        return;\n\n    SetMainCallback2((void *)GetWordTaskArg(taskId, 0xE));\n    FreeAllWindowBuffers();\n    DestroyTask(taskId);\n}\n\nstatic void MapPostLoadHook_ReturnToShopMenu(void)\n{\n    FadeInFromBlack();\n    CreateTask(Task_ReturnToShopMenu, 8);\n}\n\nstatic void Task_ReturnToShopMenu(u8 taskId)\n{\n    if (IsWeatherNotFadingIn() != TRUE)\n        return;\n    if(gMapHeader.regionMapSectionId == MAPSEC_SILPH_CO)\n        DisplayItemMessageOnField(taskId, GetMartFontId(), gText_DevonSpyShop, ShowShopMenuAfterExitingBuyOrSellMenu);\n    else if(gMapHeader.regionMapSectionId == MAPSEC_TRAINER_TOWER_2)\n        DisplayItemMessageOnField(taskId, GetMartFontId(), gText_AnythingElseICanHelpF, ShowShopMenuAfterExitingBuyOrSellMenu);\n    else\n        DisplayItemMessageOnField(taskId, GetMartFontId(), gText_AnythingElseICanHelp, ShowShopMenuAfterExitingBuyOrSellMenu);\n}\n\nstatic void ShowShopMenuAfterExitingBuyOrSellMenu(u8 taskId)\n{\n    CreateShopMenu(sShopData.martType);\n    DestroyTask(taskId);\n}\n\nstatic void CB2_BuyMenu(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n    DoScheduledBgTilemapCopiesToVram();\n}\n\nstatic void VBlankCB_BuyMenu(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void CB2_InitBuyMenu(void)\n{\n    u8 taskId;\n\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankHBlankCallbacksToNull();\n        CpuFastFill(0, (void *)OAM, 0x400);\n        ScanlineEffect_Stop();\n        ResetTempTileDataBuffers();\n        FreeAllSpritePalettes();\n        ResetPaletteFade();\n        ResetSpriteData();\n        ResetTasks();\n        ClearScheduledBgCopiesToVram();\n        ResetItemMenuIconState();\n        if (!(InitShopData()) || !(BuyMenuBuildListMenuTemplate()))\n            return;\n        BuyMenuInitBgs();\n        FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);\n        FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 0x20, 0x20);\n        FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 0x20, 0x20);\n        FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 0x20, 0x20);\n        BuyMenuInitWindows(sShopData.martType);\n        BuyMenuDecompressBgGraphics();\n        gMain.state++;\n        break;\n    case 1:\n        if (FreeTempTileDataBuffersIfPossible())\n            return;\n        gMain.state++;\n        break;\n    default:\n        sShopData.selectedRow = 0;\n        sShopData.scrollOffset = 0;\n        BuyMenuDrawGraphics();\n        BuyMenuAddScrollIndicatorArrows();\n        taskId = CreateTask(Task_BuyMenu, 8);\n        gTasks[taskId].tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);\n        BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);\n        SetVBlankCallback(VBlankCB_BuyMenu);\n        SetMainCallback2(CB2_BuyMenu);\n        break;\n    }\n}\n\nstatic bool8 InitShopData(void)\n{\n    gShopTilemapBuffer1 = Alloc(sizeof(*gShopTilemapBuffer1));\n    if (gShopTilemapBuffer1 == NULL)\n    {\n        BuyMenuFreeMemory();\n        SetShopExitCallback();\n        return FALSE;\n    }\n\n    gShopTilemapBuffer2 = Alloc(sizeof(*gShopTilemapBuffer2));\n    if (gShopTilemapBuffer2 == NULL)\n    {\n        BuyMenuFreeMemory();\n        SetShopExitCallback();\n        return FALSE;\n    }\n\n    gShopTilemapBuffer3 = Alloc(sizeof(*gShopTilemapBuffer3));\n    if (gShopTilemapBuffer3 == NULL)\n    {\n        BuyMenuFreeMemory();\n        SetShopExitCallback();\n        return FALSE;\n    }\n\n    gShopTilemapBuffer4 = Alloc(sizeof(*gShopTilemapBuffer4));\n    if (gShopTilemapBuffer4 == NULL)\n    {\n        BuyMenuFreeMemory();\n        SetShopExitCallback();\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic void BuyMenuInitBgs(void)\n{\n    ResetBgsAndClearDma3BusyFlags(0);\n    InitBgsFromTemplates(0, sShopBuyMenuBgTemplates, NELEMS(sShopBuyMenuBgTemplates));\n    SetBgTilemapBuffer(1, gShopTilemapBuffer2);\n    SetBgTilemapBuffer(2, gShopTilemapBuffer4);\n    SetBgTilemapBuffer(3, gShopTilemapBuffer3);\n    SetGpuReg(REG_OFFSET_BG0HOFS, DISPCNT_MODE_0);\n    SetGpuReg(REG_OFFSET_BG0VOFS, DISPCNT_MODE_0);\n    SetGpuReg(REG_OFFSET_BG1HOFS, DISPCNT_MODE_0);\n    SetGpuReg(REG_OFFSET_BG1VOFS, DISPCNT_MODE_0);\n    SetGpuReg(REG_OFFSET_BG2HOFS, DISPCNT_MODE_0);\n    SetGpuReg(REG_OFFSET_BG2VOFS, DISPCNT_MODE_0);\n    SetGpuReg(REG_OFFSET_BG3HOFS, DISPCNT_MODE_0);\n    SetGpuReg(REG_OFFSET_BG3VOFS, DISPCNT_MODE_0);\n    SetGpuReg(REG_OFFSET_BLDCNT, DISPCNT_MODE_0);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n    ShowBg(3);\n}\n\nstatic void BuyMenuDecompressBgGraphics(void)\n{\n    u16 *pal;\n\n    DecompressAndCopyTileDataToVram(1, gBuyMenuFrame_Gfx, 0x480, 0x3DC, 0);\n    if ((sShopData.martType) != MART_TYPE_TMHM)\n        LZDecompressWram(gBuyMenuFrame_Tilemap, gShopTilemapBuffer1);\n    else\n        LZDecompressWram(gBuyMenuFrame_TmHmTilemap, gShopTilemapBuffer1);\n\n    pal = Alloc(2 * PLTT_SIZE_4BPP);\n    LZDecompressWram(gBuyMenuFrame_Pal, pal);\n    LoadPalette(&pal[0 * 16], BG_PLTT_ID(11), PLTT_SIZE_4BPP);\n    LoadPalette(&pal[1 * 16], BG_PLTT_ID(6), PLTT_SIZE_4BPP);\n    Free(pal);\n}\n\nstatic void RecolorItemDescriptionBox(bool32 a0)\n{\n    u8 paletteNum;\n\n    if (a0 == FALSE)\n        paletteNum = 0xB;\n    else\n        paletteNum = 0x6;\n\n    if ((sShopData.martType) != MART_TYPE_TMHM)\n        SetBgTilemapPalette(1, 0, 14, 30, 6, paletteNum);\n    else\n        SetBgTilemapPalette(1, 0, 12, 30, 8, paletteNum);\n\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nstatic void BuyMenuDrawGraphics(void)\n{\n    BuyMenuDrawMapView();\n    BuyMenuCopyTilemapData();\n    BuyMenuDrawMoneyBox();\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(1);\n    ScheduleBgCopyTilemapToVram(2);\n    ScheduleBgCopyTilemapToVram(3);\n}\n\nbool8 BuyMenuBuildListMenuTemplate(void)\n{\n    u16 i, v;\n\n    sShopMenuListMenu = Alloc((sShopData.itemCount + 1) * sizeof(*sShopMenuListMenu));\n    if (sShopMenuListMenu == NULL\n     || (sShopMenuItemStrings = Alloc((sShopData.itemCount + 1) * sizeof(*sShopMenuItemStrings))) == NULL)\n    {\n        BuyMenuFreeMemory();\n        SetShopExitCallback();\n        return FALSE;\n    }\n\n    for (i = 0; i < sShopData.itemCount; i++)\n    {\n        PokeMartWriteNameAndIdAt(&sShopMenuListMenu[i], sShopData.itemList[i], sShopMenuItemStrings[i]);\n    }\n    StringCopy(sShopMenuItemStrings[i], gFameCheckerText_Cancel);\n    sShopMenuListMenu[i].label = sShopMenuItemStrings[i];\n    sShopMenuListMenu[i].index = -2;\n    gMultiuseListMenuTemplate.items = sShopMenuListMenu;\n    gMultiuseListMenuTemplate.totalItems = sShopData.itemCount + 1;\n    gMultiuseListMenuTemplate.windowId = 4;\n    gMultiuseListMenuTemplate.header_X = 0;\n    gMultiuseListMenuTemplate.item_X = 9;\n    gMultiuseListMenuTemplate.cursor_X = 1;\n    gMultiuseListMenuTemplate.lettersSpacing = 0;\n    gMultiuseListMenuTemplate.itemVerticalPadding = 2;\n    gMultiuseListMenuTemplate.upText_Y = 2;\n    gMultiuseListMenuTemplate.fontId = 2;\n    gMultiuseListMenuTemplate.fillValue = 0;\n    gMultiuseListMenuTemplate.cursorPal = GetFontAttribute(FONT_NORMAL, FONTATTR_COLOR_FOREGROUND);\n    gMultiuseListMenuTemplate.cursorShadowPal = GetFontAttribute(FONT_NORMAL, FONTATTR_COLOR_SHADOW);\n    gMultiuseListMenuTemplate.moveCursorFunc = BuyMenuPrintItemDescriptionAndShowItemIcon;\n    gMultiuseListMenuTemplate.itemPrintFunc = BuyMenuPrintPriceInList;\n    gMultiuseListMenuTemplate.scrollMultiple = 0;\n    gMultiuseListMenuTemplate.cursorKind = 0;\n\n    if (sShopData.martType == MART_TYPE_TMHM)\n        v = 5;\n    else\n        v = 6;\n\n    if ((sShopData.itemCount + 1) > v)\n        gMultiuseListMenuTemplate.maxShowed = v;\n    else\n        gMultiuseListMenuTemplate.maxShowed = sShopData.itemCount + 1;\n\n    sShopData.itemsShowed = gMultiuseListMenuTemplate.maxShowed;\n    return TRUE;\n}\n\nstatic void PokeMartWriteNameAndIdAt(struct ListMenuItem *list, u16 index, u8 *dst)\n{\n    CopyItemName(index, dst);\n    list->label = dst;\n    list->index = index;\n}\n\nstatic void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, struct ListMenu *list)\n{\n    const u8 *description;\n\n    if (onInit != TRUE)\n        PlaySE(SE_SELECT);\n\n    if (item != INDEX_CANCEL)\n        description = ItemId_GetDescription(item);\n    else\n        description = gText_QuitShopping;\n\n    FillWindowPixelBuffer(5, PIXEL_FILL(0));\n    if (sShopData.martType != MART_TYPE_TMHM)\n    {\n        DestroyItemMenuIcon(sShopData.itemSlot ^ 1);\n        if (item != INDEX_CANCEL)\n            CreateItemMenuIcon(item, sShopData.itemSlot);\n        else\n            CreateItemMenuIcon(ITEMS_COUNT, sShopData.itemSlot);\n\n        sShopData.itemSlot ^= 1;\n        BuyMenuPrint(5, FONT_NORMAL, description, 0, 3, 2, 1, 0, 0);\n    }\n    else //TM Mart\n    {\n        FillWindowPixelBuffer(6, PIXEL_FILL(0));\n        LoadTmHmNameInMart(item);\n        BuyMenuPrint(5, FONT_NORMAL, description, 2, 3, 1, 0, 0, 0);\n    }\n}\n\nstatic void BuyMenuPrintPriceInList(u8 windowId, u32 item, u8 y)\n{\n    s32 x;\n    u8 *loc;\n\n    if (item != INDEX_CANCEL)\n    {\n        ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(item), 0, 5);\n        x = 5 - StringLength(gStringVar1);\n        loc = gStringVar4;\n        while (x-- != 0)\n            *loc++ = 0;\n        StringExpandPlaceholders(loc, gText_PokedollarVar1);\n        BuyMenuPrint(windowId, FONT_SMALL, gStringVar4, 0x67, y, 0, 0, TEXT_SKIP_DRAW, 1);\n    }\n}\n\nstatic void LoadTmHmNameInMart(s32 item)\n{\n    if (item != INDEX_CANCEL)\n    {\n        ConvertIntToDecimalStringN(gStringVar1, item - ITEM_DEVON_SCOPE, 2, 2);\n        StringCopy(gStringVar4, gText_NumberClear01);\n        StringAppend(gStringVar4, gStringVar1);\n        BuyMenuPrint(6, FONT_SMALL, gStringVar4, 0, 0, 0, 0, TEXT_SKIP_DRAW, 1);\n        StringCopy(gStringVar4, gMoveNames[ItemIdToBattleMoveId(item)]);\n        BuyMenuPrint(6, FONT_NORMAL, gStringVar4, 0, 0x10, 0, 0, 0, 1);\n    }\n    else\n    {\n        BuyMenuPrint(6, FONT_SMALL, gText_ThreeHyphens, 0, 0, 0, 0, TEXT_SKIP_DRAW, 1);\n        BuyMenuPrint(6, FONT_NORMAL, gText_SevenHyphens, 0, 0x10, 0, 0, 0, 1);\n    }\n}\n\nu8 GetMartFontId(void)\n{\n    return sShopData.fontId;\n}\n\nstatic void BuyMenuPrintCursor(u8 listTaskId, u8 a1)\n{\n    BuyMenuPrintCursorAtYPosition(ListMenuGetYCoordForPrintingArrowCursor(listTaskId), a1);\n}\n\nstatic void BuyMenuPrintCursorAtYPosition(u8 y, u8 a1)\n{\n    if (a1 == 0xFF)\n    {\n        FillWindowPixelRect(4, 0, 1, y, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_WIDTH), GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT));\n        CopyWindowToVram(4, COPYWIN_GFX);\n    }\n    else\n    {\n        BuyMenuPrint(4, FONT_NORMAL, gText_SelectorArrow2, 1, y, 0, 0, 0, a1);\n    }\n}\n\nstatic void BuyMenuFreeMemory(void)\n{\n    if (gShopTilemapBuffer1 != NULL)\n        Free(gShopTilemapBuffer1);\n\n    if (gShopTilemapBuffer2 != NULL)\n        Free(gShopTilemapBuffer2);\n\n    if (gShopTilemapBuffer3 != NULL)\n        Free(gShopTilemapBuffer3);\n\n    if (gShopTilemapBuffer4 != NULL)\n        Free(gShopTilemapBuffer4);\n\n    if (sShopMenuListMenu != NULL)\n        Free(sShopMenuListMenu);\n\n    if (sShopMenuItemStrings != NULL)\n        Free(sShopMenuItemStrings);\n\n    FreeAllWindowBuffers();\n}\n\nstatic void SetShopExitCallback(void)\n{\n    gFieldCallback = MapPostLoadHook_ReturnToShopMenu;\n    SetMainCallback2(CB2_ReturnToField);\n}\n\n\nstatic void BuyMenuAddScrollIndicatorArrows(void)\n{\n    if (sShopData.martType != MART_TYPE_TMHM)\n    {\n        sShopData.unk16_11 = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 160, 8, 104,\n            (sShopData.itemCount - sShopData.itemsShowed) + 1, 110, 110, &sShopData.scrollOffset);\n    }\n    else\n    {\n        sShopData.unk16_11 = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 160, 8, 88,\n            (sShopData.itemCount - sShopData.itemsShowed) + 1, 110, 110, &sShopData.scrollOffset);\n    }\n}\n\nstatic void BuyQuantityAddScrollIndicatorArrows(void)\n{\n    sShopData.unk18 = 1;\n    sShopData.unk16_11 = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0x98, 0x48, 0x68, 2, 0x6E, 0x6E, &sShopData.unk18);\n}\n\nstatic void BuyMenuRemoveScrollIndicatorArrows(void)\n{\n    if ((sShopData.unk16_11) == 0x1F)\n        return;\n\n    RemoveScrollIndicatorArrowPair(sShopData.unk16_11);\n    sShopData.unk16_11 = 0x1F;\n}\n\nstatic void BuyMenuDrawMapView(void)\n{\n    BuyMenuCollectObjectEventData();\n    BuyMenuDrawObjectEvents();\n    BuyMenuDrawMapBg();\n}\n\nstatic void BuyMenuDrawMapBg(void)\n{\n    s16 i, j, x, y;\n    const struct MapLayout *mapLayout;\n    u16 metatile;\n    u8 metatileLayerType;\n\n    mapLayout = gMapHeader.mapLayout;\n    GetXYCoordsOneStepInFrontOfPlayer(&x, &y);\n    x -= 2;\n    y -= 3;\n\n    for (j = 0; j < 10; j++)\n    {\n        for (i = 0; i < 5; i++)\n        {\n            metatile = MapGridGetMetatileIdAt(x + i, y + j);\n            metatileLayerType = MapGridGetMetatileLayerTypeAt(x + i, y + j);\n\n            if (metatile < NUM_METATILES_IN_PRIMARY)\n                BuyMenuDrawMapMetatile(i, j, mapLayout->primaryTileset->metatiles + metatile * 8, metatileLayerType);\n            else\n                BuyMenuDrawMapMetatile(i, j, mapLayout->secondaryTileset->metatiles + ((metatile - NUM_METATILES_IN_PRIMARY) * 8), metatileLayerType);\n        }\n    }\n}\n\nstatic void BuyMenuDrawMapMetatile(s16 x, s16 y, const u16 *src, u8 metatileLayerType)\n{\n    u16 offset1 = x * 2;\n    u16 offset2 = y * 64 + 64;\n\n    switch (metatileLayerType)\n    {\n    case METATILE_LAYER_TYPE_NORMAL:\n        BuyMenuDrawMapMetatileLayer(*gShopTilemapBuffer4, offset1, offset2, src);\n        BuyMenuDrawMapMetatileLayer(*gShopTilemapBuffer2, offset1, offset2, src + 4);\n        break;\n    case METATILE_LAYER_TYPE_COVERED:\n        BuyMenuDrawMapMetatileLayer(*gShopTilemapBuffer3, offset1, offset2, src);\n        BuyMenuDrawMapMetatileLayer(*gShopTilemapBuffer4, offset1, offset2, src + 4);\n        break;\n    case METATILE_LAYER_TYPE_SPLIT:\n        BuyMenuDrawMapMetatileLayer(*gShopTilemapBuffer3, offset1, offset2, src);\n        BuyMenuDrawMapMetatileLayer(*gShopTilemapBuffer2, offset1, offset2, src + 4);\n        break;\n    }\n}\n\nstatic void BuyMenuDrawMapMetatileLayer(u16 *dest, s16 offset1, s16 offset2, const u16 *src)\n{\n    dest[offset1 + offset2] = src[0]; // top left\n    dest[offset1 + offset2 + 1] = src[1]; // top right\n    dest[offset1 + offset2 + 32] = src[2]; // bottom left\n    dest[offset1 + offset2 + 33] = src[3]; // bottom right\n}\n\nstatic void BuyMenuCollectObjectEventData(void)\n{\n    s16 facingX, facingY;\n    u8 x, y, elevation;\n    u8 num = 0;\n\n    GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY);\n    elevation = PlayerGetElevation();\n\n    for (y = 0; y < OBJECT_EVENTS_COUNT; y++)\n        sViewportObjectEvents[y][OBJECT_EVENT_ID] = OBJECT_EVENTS_COUNT;\n\n    for (y = 0; y < 5; y++)\n    {\n        for (x = 0; x < 7; x++)\n        {\n            u8 eventObjId = GetObjectEventIdByPosition(facingX - 3 + x, facingY - 2 + y, elevation);\n            if (eventObjId != OBJECT_EVENTS_COUNT)\n            {\n                sViewportObjectEvents[num][OBJECT_EVENT_ID] = eventObjId;\n                sViewportObjectEvents[num][X_COORD] = x;\n                sViewportObjectEvents[num][Y_COORD] = y;\n\n                switch (gObjectEvents[eventObjId].facingDirection)\n                {\n                    case DIR_SOUTH:\n                        sViewportObjectEvents[num][ANIM_NUM] = 0;\n                        break;\n                    case DIR_NORTH:\n                        sViewportObjectEvents[num][ANIM_NUM] = 1;\n                        break;\n                    case DIR_WEST:\n                        sViewportObjectEvents[num][ANIM_NUM] = 2;\n                        break;\n                    case DIR_EAST:\n                    default:\n                        sViewportObjectEvents[num][ANIM_NUM] = 3;\n                        break;\n                }\n                num++;\n            }\n        }\n    }\n}\n\nstatic void BuyMenuDrawObjectEvents(void)\n{\n    u8 i, spriteId;\n    const struct ObjectEventGraphicsInfo *graphicsInfo;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (sViewportObjectEvents[i][OBJECT_EVENT_ID] == OBJECT_EVENTS_COUNT)\n            continue;\n\n        graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[sViewportObjectEvents[i][OBJECT_EVENT_ID]].graphicsId);\n        spriteId = CreateObjectGraphicsSprite(\n            gObjectEvents[sViewportObjectEvents[i][OBJECT_EVENT_ID]].graphicsId,\n            SpriteCallbackDummy,\n            (u16)sViewportObjectEvents[i][X_COORD] * 16 - 8,\n            (u16)sViewportObjectEvents[i][Y_COORD] * 16 + 48 - graphicsInfo->height / 2,\n            2);\n        StartSpriteAnim(&gSprites[spriteId], sViewportObjectEvents[i][ANIM_NUM]);\n    }\n}\n\nstatic void BuyMenuCopyTilemapData(void)\n{\n    s32 i;\n    u16 *dst = *gShopTilemapBuffer2;\n    u16 *src = *gShopTilemapBuffer1;\n\n    for (i = 0; i < 0x400; i++)\n    {\n        if (src[i] == 0)\n            continue;\n        dst[i] = src[i] + 0xb3dc;\n    }\n}\n\nstatic void BuyMenuPrintItemQuantityAndPrice(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    FillWindowPixelBuffer(3, PIXEL_FILL(1));\n    PrintMoneyAmount(3, 0x36, 0xA, sShopData.itemPrice, TEXT_SKIP_DRAW);\n    ConvertIntToDecimalStringN(gStringVar1, tItemCount, STR_CONV_MODE_LEADING_ZEROS, 2);\n    StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n    BuyMenuPrint(3, FONT_SMALL, gStringVar4, 2, 0xA, 0, 0, 0, 1);\n}\n\nstatic void Task_BuyMenu(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (!gPaletteFade.active)\n    {\n        s32 itemId = ListMenu_ProcessInput(tListTaskId);\n        ListMenuGetScrollAndRow(tListTaskId, &sShopData.scrollOffset, &sShopData.selectedRow);\n        switch (itemId)\n        {\n        case LIST_NOTHING_CHOSEN:\n            break;\n        case LIST_CANCEL:\n            PlaySE(SE_SELECT);\n            ExitBuyMenu(taskId);\n            break;\n        default:\n            PlaySE(SE_SELECT);\n            tItemId = itemId;\n            ClearWindowTilemap(5);\n            BuyMenuRemoveScrollIndicatorArrows();\n            BuyMenuPrintCursor(tListTaskId, 2);\n            RecolorItemDescriptionBox(1);\n            sShopData.itemPrice = ItemId_GetPrice(itemId);\n            if (!IsEnoughMoney(&gSaveBlock1Ptr->money, sShopData.itemPrice))\n            {\n                BuyMenuDisplayMessage(taskId, gText_YouDontHaveMoney, BuyMenuReturnToItemList);\n            }\n            else if (ItemId_GetPocket(itemId) == POCKET_TM_CASE && CheckBagHasItem(itemId, 1))\n            {\n               BuyMenuDisplayMessage(taskId, gText_YouAlreadyHaveThisTM, BuyMenuReturnToItemList);\n            }\n            else\n            {\n                CopyItemName(itemId, gStringVar1);\n                if(itemId >= ITEM_TM01 && itemId <= ITEM_HM08) //if TM, skip to confirm without choosing quantity\n                {\n                    sShopData.itemPrice = ItemId_GetPrice(itemId);\n                    tItemCount = 1;\n                    PlaySE(SE_SELECT);\n                    PutWindowTilemap(4);\n                    CopyItemName(tItemId, gStringVar1);\n                    ConvertIntToDecimalStringN(gStringVar2, 1, STR_CONV_MODE_LEFT_ALIGN, 2);\n                    ConvertIntToDecimalStringN(gStringVar3, sShopData.itemPrice, STR_CONV_MODE_LEFT_ALIGN, 8);\n                    BuyMenuDisplayMessage(taskId, gText_Var1AndYouWantedVar2, CreateBuyMenuConfirmPurchaseWindow);\n                }\n                else\n                    BuyMenuDisplayMessage(taskId, gText_Var1CertainlyHowMany, Task_BuyHowManyDialogueInit);\n            }\n            break;\n        }\n    }\n}\n\nstatic void Task_BuyHowManyDialogueInit(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u16 quantityInBag = BagGetQuantityByItemId(tItemId);\n    u16 maxQuantity;\n\n    BuyMenuQuantityBoxThinBorder(1, 0);\n    ConvertIntToDecimalStringN(gStringVar1, quantityInBag, STR_CONV_MODE_RIGHT_ALIGN, 3);\n    StringExpandPlaceholders(gStringVar4, gText_InBagVar1);\n    BuyMenuPrint(1, FONT_NORMAL, gStringVar4, 0, 2, 0, 0, 0, 1);\n    tItemCount = 1;\n    BuyMenuQuantityBoxNormalBorder(3, 0);\n    BuyMenuPrintItemQuantityAndPrice(taskId);\n    ScheduleBgCopyTilemapToVram(0);\n    maxQuantity = GetMoney(&gSaveBlock1Ptr->money) / ItemId_GetPrice(tItemId);\n    if (maxQuantity > 99)\n        sShopData.maxQuantity = 99;\n    else\n        sShopData.maxQuantity = (u8)maxQuantity;\n\n    if (maxQuantity != 1)\n        BuyQuantityAddScrollIndicatorArrows();\n\n    gTasks[taskId].func = Task_BuyHowManyDialogueHandleInput;\n}\n\nstatic void Task_BuyHowManyDialogueHandleInput(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (AdjustQuantityAccordingToDPadInput(&tItemCount, sShopData.maxQuantity) == TRUE)\n    {\n        sShopData.itemPrice = ItemId_GetPrice(tItemId) * tItemCount;\n        BuyMenuPrintItemQuantityAndPrice(taskId);\n    }\n    else\n    {\n        if (JOY_NEW(A_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            BuyMenuRemoveScrollIndicatorArrows();\n            ClearStdWindowAndFrameToTransparent(3, FALSE);\n            ClearStdWindowAndFrameToTransparent(1, FALSE);\n            ClearWindowTilemap(3);\n            ClearWindowTilemap(1);\n            PutWindowTilemap(4);\n            CopyItemName(tItemId, gStringVar1);\n            ConvertIntToDecimalStringN(gStringVar2, tItemCount, STR_CONV_MODE_LEFT_ALIGN, 2);\n            ConvertIntToDecimalStringN(gStringVar3, sShopData.itemPrice, STR_CONV_MODE_LEFT_ALIGN, 8);\n            BuyMenuDisplayMessage(taskId, gText_Var1AndYouWantedVar2, CreateBuyMenuConfirmPurchaseWindow);\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            BuyMenuRemoveScrollIndicatorArrows();\n            ClearStdWindowAndFrameToTransparent(3, FALSE);\n            ClearStdWindowAndFrameToTransparent(1, FALSE);\n            ClearWindowTilemap(3);\n            ClearWindowTilemap(1);\n            BuyMenuReturnToItemList(taskId);\n        }\n    }\n}\n\nstatic void CreateBuyMenuConfirmPurchaseWindow(u8 taskId)\n{\n    BuyMenuConfirmPurchase(taskId, sShopMenuActions_BuyQuit);\n}\n\nstatic void BuyMenuTryMakePurchase(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    PutWindowTilemap(4);\n    if (AddBagItem(tItemId, tItemCount) == TRUE)\n    {\n        BuyMenuDisplayMessage(taskId, gText_HereYouGoThankYou, BuyMenuSubtractMoney);\n        DebugFunc_PrintPurchaseDetails(taskId);\n        RecordItemTransaction(tItemId, tItemCount, QL_EVENT_BOUGHT_ITEM - QL_EVENT_USED_POKEMART);\n    }\n    else\n    {\n        BuyMenuDisplayMessage(taskId, gText_NoMoreRoomForThis, BuyMenuReturnToItemList);\n    }\n}\n\nstatic void BuyMenuSubtractMoney(u8 taskId)\n{\n    IncrementGameStat(GAME_STAT_SHOPPED);\n    RemoveMoney(&gSaveBlock1Ptr->money, sShopData.itemPrice);\n    PlaySE(SE_SHOP);\n    PrintMoneyAmountInMoneyBox(0, GetMoney(&gSaveBlock1Ptr->money), 0);\n    gTasks[taskId].func = Task_ReturnToItemListAfterItemPurchase;\n}\n\nstatic void Task_ReturnToItemListAfterItemPurchase(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        if ((ItemId_GetPocket(tItemId) == POCKET_POKE_BALLS) && tItemCount > 9 && AddBagItem(ITEM_PREMIER_BALL, tItemCount / 10) == TRUE)\n        {\n            if (tItemCount > 19)\n            {\n                BuyMenuDisplayMessage(taskId, gText_ThrowInPremierBalls, BuyMenuReturnToItemList);\n            }\n            else\n            {\n                BuyMenuDisplayMessage(taskId, gText_ThrowInPremierBall, BuyMenuReturnToItemList);\n            }\n        }\n        else\n        {\n            BuyMenuReturnToItemList(taskId);\n        }\n    }\n}\n\nstatic void BuyMenuReturnToItemList(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    ClearDialogWindowAndFrameToTransparent(2, FALSE);\n    BuyMenuPrintCursor(tListTaskId, 1);\n    RecolorItemDescriptionBox(0);\n    PutWindowTilemap(4);\n    PutWindowTilemap(5);\n    if (sShopData.martType == MART_TYPE_TMHM)\n        PutWindowTilemap(6);\n\n    ScheduleBgCopyTilemapToVram(0);\n    BuyMenuAddScrollIndicatorArrows();\n    gTasks[taskId].func = Task_BuyMenu;\n}\n\nstatic void ExitBuyMenu(u8 taskId)\n{\n    gFieldCallback = MapPostLoadHook_ReturnToShopMenu;\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n    gTasks[taskId].func = Task_ExitBuyMenu;\n}\n\nstatic void Task_ExitBuyMenu(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (!gPaletteFade.active)\n    {\n        DestroyListMenuTask(tListTaskId, NULL, NULL);\n        BuyMenuFreeMemory();\n        SetMainCallback2(CB2_ReturnToField);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void DebugFunc_PrintPurchaseDetails(u8 taskId)\n{\n}\n\nstatic void DebugFunc_PrintShopMenuHistoryBeforeClearMaybe(void)\n{\n}\n\n// Records a transaction during a single shopping session.\n// This is for the Quest Log to save information about the player's purchases/sales when they finish.\nvoid RecordItemTransaction(u16 itemId, u16 quantity, u8 logEventId)\n{\n    struct QuestLogEvent_Shop *history;\n\n    // There should only be a single entry for buying/selling respectively,\n    // so if one has already been created then get it first.\n    if (sHistory[0].logEventId == logEventId)\n    {\n        history = &sHistory[0];\n    }\n    else if (sHistory[1].logEventId == logEventId)\n    {\n        history = &sHistory[1];\n    }\n    else\n    {\n        // First transaction of this type, save it in an empty slot\n        if (sHistory[0].logEventId == 0)\n            history = &sHistory[0];\n        else\n            history = &sHistory[1];\n        history->logEventId = logEventId;\n    }\n\n    // Set flag if this isn't the first time we've bought/sold in this session\n    if (history->lastItemId != ITEM_NONE)\n        history->hasMultipleTransactions = TRUE;\n\n    history->lastItemId = itemId;\n\n    // Add to number of items bought/sold\n    if (history->itemQuantity < 999)\n    {\n        history->itemQuantity += quantity;\n        if (history->itemQuantity > 999)\n            history->itemQuantity = 999;\n    }\n\n    // Add to amount of money spent buying or earned selling\n    if (history->totalMoney < 999999)\n    {\n        // logEventId will either be 1 (bought) or 2 (sold)\n        // so for buying it will add the full price and selling will add half price\n        history->totalMoney += (ItemId_GetPrice(itemId) >> (logEventId - 1)) * quantity;\n        if (history->totalMoney > 999999)\n            history->totalMoney = 999999;\n    }\n}\n\n// Will record QL_EVENT_BOUGHT_ITEM and/or QL_EVENT_SOLD_ITEM, or nothing.\nstatic void RecordTransactionForQuestLog(void)\n{\n    u16 eventId = sHistory[0].logEventId;\n    if (eventId != 0)\n        SetQuestLogEvent(eventId + QL_EVENT_USED_POKEMART, (const u16 *)&sHistory[0]);\n\n    eventId = sHistory[1].logEventId;\n    if (eventId != 0)\n        SetQuestLogEvent(eventId + QL_EVENT_USED_POKEMART, (const u16 *)&sHistory[1]);\n}\n\nvoid CreatePokemartMenu(const u16 *itemsForSale)\n{\n    SetShopItemsForSale(itemsForSale);\n    CreateShopMenu(MART_TYPE_REGULAR);\n    SetShopMenuCallback(ScriptContext_Enable);\n    DebugFunc_PrintShopMenuHistoryBeforeClearMaybe();\n    memset(&sHistory, 0, sizeof(sHistory));\n    sHistory[0].mapSec = gMapHeader.regionMapSectionId;\n    sHistory[1].mapSec = gMapHeader.regionMapSectionId;\n}\n\nvoid CreateDecorationShop1Menu(const u16 *itemsForSale)\n{\n    SetShopItemsForSale(itemsForSale);\n    CreateShopMenu(MART_TYPE_DECOR);\n    SetShopMenuCallback(ScriptContext_Enable);\n}\n\nvoid CreateDecorationShop2Menu(const u16 *itemsForSale)\n{\n    SetShopItemsForSale(itemsForSale);\n    CreateShopMenu(MART_TYPE_DECOR2);\n    SetShopMenuCallback(ScriptContext_Enable);\n}\n\n"
  },
  {
    "path": "src/slot_machine.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"task.h\"\n#include \"coins.h\"\n#include \"quest_log.h\"\n#include \"overworld.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"text_window.h\"\n#include \"random.h\"\n#include \"trig.h\"\n#include \"strings.h\"\n#include \"constants/songs.h\"\n\n#define NUM_REELS 3\n#define REEL_LENGTH 21 // Total number of icons per reel\n\n// Only 4 icons are actually visible per reel at a single\n// time, with 1 on deck. Only 3 visible when not spinning.\n#define REEL_LOAD_LENGTH 5\n\n// 3 horizontal, 2 diagonal\n#define NUM_MATCH_LINES 5\n\n#define NUM_BUTTON_TILES 4\n#define NUM_DIGIT_SPRITES 4\n\nenum {\n    PALSLOT_LINE_NORMAL = 4, // Loaded as part of sBg_Pal\n    PALSLOT_LINE_BET,\n    PALSLOT_LINE_MATCH,\n};\n\nenum {\n    GFXTAG_REEL_ICONS,\n    GFXTAG_CLEFAIRY,\n    GFXTAG_DIGITS,\n};\n\nenum {\n    PALTAG_REEL_ICONS_0,\n    PALTAG_REEL_ICONS_1,\n    PALTAG_REEL_ICONS_2,\n    PALTAG_REEL_ICONS_3,\n    PALTAG_REEL_ICONS_4,\n    PALTAG_CLEFAIRY,\n    PALTAG_DIGITS,\n};\n\nenum {\n    ICON_7,\n    ICON_ROCKET,\n    ICON_PIKACHU,\n    ICON_PSYDUCK,   // Psyduck in FR, Slowpoke in LG\n    ICON_CHERRIES,\n    ICON_MAGNEMITE, // Magnemite in FR, Voltorb in LG\n    ICON_SHELLDER,  // Shellder in FR, Staryu in LG\n};\n\nenum {\n    PAYOUT_NONE,\n    PAYOUT_CHERRIES2,\n    PAYOUT_CHERRIES3,\n    PAYOUT_MAGSHELL,\n    PAYOUT_PIKAPSY,\n    PAYOUT_ROCKET,\n    PAYOUT_7,\n    NUM_PAYOUT_TYPES\n};\n\nenum {\n    ROWATTR_COL1POS,\n    ROWATTR_COL2POS,\n    ROWATTR_COL3POS,\n    ROWATTR_MINBET,\n};\n\nenum {\n    SLOTTASK_GFX_INIT,\n    SLOTTASK_FADEOUT_EXIT,\n    SLOTTASK_UPDATE_LINE_LIGHTS,\n    SLOTTASK_CLEFAIRY_BOUNCE,\n    SLOTTASK_ANIM_WIN,\n    SLOTTASK_END_ANIM_WIN,\n    SLOTTASK_ANIM_LOSE,\n    SLOTTASK_ANIM_BETTING,\n    SLOTTASK_SHOW_AMOUNTS,\n    SLOTTASK_MSG_NO_COINS,\n    SLOTTASK_ASK_QUIT,\n    SLOTTASK_DESTROY_YESNO,\n    SLOTTASK_PRESS_BUTTON,\n    SLOTTASK_RELEASE_BUTTONS,\n    SLOTTASK_SHOWHELP,\n    SLOTTASK_HIDEHELP,\n};\n\nstruct SlotMachineState\n{\n    MainCallback savedCallback;\n    u16 machineIdx;\n    u16 currentReel;\n    u16 machineBias;\n    u16 slotRewardClass;\n    u16 biasCooldown;\n    u16 bet;\n    u8 taskId;\n    u8 spinReelsTaskId;\n    bool32 reelIsSpinning[NUM_REELS];\n    s16 reelPositions[NUM_REELS];\n    s16 reelSubpixel[NUM_REELS];\n    s16 destReelPos[NUM_REELS];\n    s16 reelStopOrder[NUM_REELS];\n    u32 reel2BiasInPlay;\n    bool32 winFlags[NUM_MATCH_LINES];\n    u16 payout;\n};\n\nstruct SlotMachineGfxManager\n{\n    u32 field_00[NUM_REELS]; // Never read\n    struct Sprite *reelIconSprites[NUM_REELS][REEL_LOAD_LENGTH];\n    struct Sprite *creditDigitSprites[NUM_DIGIT_SPRITES];\n    struct Sprite *payoutDigitSprites[NUM_DIGIT_SPRITES];\n    struct Sprite *clefairySprites[2];\n    vu16 * reelIconAffineParamPtr;\n};\n\nstruct SlotMachineSetupTaskDataSub_0000\n{\n    u16 funcno;\n    u8 state;\n    bool8 active;\n};\n\nstruct SlotMachineSetupTaskData\n{\n    struct SlotMachineSetupTaskDataSub_0000 tasks[8];\n    u8 reelButtonToPress;\n    // align 2\n    s32 bg1X;\n    bool32 yesNoMenuActive;\n    u16 buttonPressedTiles[NUM_REELS][NUM_BUTTON_TILES];\n    u16 buttonReleasedTiles[NUM_REELS][NUM_BUTTON_TILES];\n    u8 unusedBuffer[BG_SCREEN_SIZE];\n    u8 bg0TilemapBuffer[BG_SCREEN_SIZE];\n    u8 bg1TilemapBuffer[BG_SCREEN_SIZE];\n    u8 bg2TilemapBuffer[BG_SCREEN_SIZE];\n    u8 bg3TilemapBuffer[BG_SCREEN_SIZE];\n}; // size: 285C\n\nstruct LineStateTileIdxList\n{\n    const u16 * tiles;\n    u32 count;\n};\n\nstatic EWRAM_DATA struct SlotMachineState * sSlotMachineState = NULL;\nstatic EWRAM_DATA struct SlotMachineGfxManager * sSlotMachineGfxManager = NULL;\n\nstatic void InitSlotMachineState(struct SlotMachineState * ptr);\nstatic void CB2_InitSlotMachine(void);\nstatic void CleanSupSlotMachineState(void);\nstatic void CB2_RunSlotMachine(void);\nstatic void MainTask_SlotsGameLoop(u8 taskId);\nstatic void MainTask_NoCoinsGameOver(u8 taskId);\nstatic void MainTask_ShowHelp(u8 taskId);\nstatic void MainTask_ConfirmExitGame(u8 taskId);\nstatic void MainTask_DarnNoPayout(u8 taskId);\nstatic void MainTask_WinHandlePayout(u8 taskId);\nstatic void MainTask_ExitSlots(u8 taskId);\nstatic void SetMainTask(TaskFunc taskFunc);\nstatic void Task_SpinReels(u8 taskId);\nstatic void StartReels(void);\nstatic void StopCurrentReel(u16 whichReel, u16 whichReel2);\nstatic bool32 IsReelSpinning(u16);\nstatic void StopReel1(u16 whichReel);\nstatic void StopReel2(u16 whichReel);\nstatic void StopReel3(u16 whichReel);\nstatic bool32 TwoReelBiasCheck(s32 reel0id, s32 reel0pos, s32 reel1id, s32 reel1pos, s32 icon);\nstatic bool32 OneReelBiasCheck(s32, s32, s32);\nstatic bool32 TestReelIconAttribute(s32 attr, s32 icon);\nstatic void CalcSlotBias(void);\nstatic void ResetMachineBias(void);\nstatic u16 CalcPayout(void);\nstatic void InitGfxManager(struct SlotMachineGfxManager * manager);\nstatic void UpdateReelIconSprites(const s16 *, const s16 *);\nstatic bool32 CreateSlotMachine(void);\nstatic void DestroySlotMachine(void);\nstatic struct SlotMachineSetupTaskData * GetSlotMachineSetupTaskDataPtr(void);\nstatic void Task_SlotMachine(u8 taskId);\nstatic void SetSlotMachineSetupTask(u16 funcno, u8 taskId);\nstatic bool32 IsSlotMachineSetupTaskActive(u8 taskId);\nstatic bool8 SlotsTask_GraphicsInit(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_FadeOut(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_UpdateLineStates(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_ClefairyUpdateOnReelsStart(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_StartClefairyDanceAndWinningLineFlash(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_StopWinningLineFlashTask(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_ClefairyFainted(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_ClefairyNeutral(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_UpdateCoinsDisplay(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_MessageOutOfCoins(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_AskQuitPlaying(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_DestroyYesNoMenu(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_PressReelButton(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_ReleaseReelButtons(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_ShowHelp(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic bool8 SlotsTask_HideHelp(u8 *state, struct SlotMachineSetupTaskData * ptr);\nstatic void Slot_PrintOnWindow0(const u8 * str);\nstatic void Slot_ClearWindow0(void);\nstatic void SetLineStatesByBet(u16 * bgTilemapBuffer);\nstatic void SetLineState(u16 * bgTilemapBuffer, u16 lineId, u16 paletteNo);\nstatic void Task_FlashWinningLine(u8 taskId);\nstatic void SignalStopWinningLineFlashTask(void);\nstatic void Slot_CreateYesNoMenu(u8 cursorPos);\nstatic void Slot_DestroyYesNoMenu(void);\nstatic void InitReelButtonTileMem(void);\nstatic void SetReelButtonPressed(u8 reel);\nstatic void ReleaseReelButtons(void);\nstatic void PressReelButton(u8 reel, u8 taskId);\n\nstatic const u8 sSecondReelBiasCheckIndices[][2] = {\n    {0x00, 0x03},\n    {0x00, 0x06},\n    {0x03, 0x06},\n\n    {0x01, 0x04},\n    {0x01, 0x07},\n    {0x04, 0x07},\n\n    {0x02, 0x05},\n    {0x02, 0x08},\n    {0x05, 0x08},\n\n    {0x00, 0x04},\n    {0x00, 0x08},\n    {0x04, 0x08},\n\n    {0x02, 0x04},\n    {0x02, 0x06},\n    {0x04, 0x06}\n};\n\nstatic const u8 sThirdReelBiasCheckIndices[NUM_MATCH_LINES][3] = {\n    {0x00, 0x03, 0x06}, // top row\n    {0x01, 0x04, 0x07}, // middle row\n    {0x02, 0x05, 0x08}, // bottom row\n    {0x00, 0x04, 0x08}, // tl-br\n    {0x02, 0x04, 0x06}  // bl-tr\n};\n\nstatic const u8 sRowAttributes[NUM_MATCH_LINES][4] = {\n    {0x00, 0x04, 0x08, 0x03}, // tl-br\n    {0x00, 0x03, 0x06, 0x02}, // top row\n    {0x01, 0x04, 0x07, 0x01}, // middle row\n    {0x02, 0x05, 0x08, 0x02}, // bottom row\n    {0x02, 0x04, 0x06, 0x03}  // bl-tr\n};\n\nstatic const u16 sReelBiasChances[][NUM_PAYOUT_TYPES] = {\n    {\n        [PAYOUT_NONE]      = 0x1fa1,\n        [PAYOUT_CHERRIES2] = 0x2eab,\n        [PAYOUT_CHERRIES3] = 0x3630,\n        [PAYOUT_MAGSHELL]  = 0x39f3,\n        [PAYOUT_PIKAPSY]   = 0x3bd4,\n        [PAYOUT_ROCKET]    = 0x3bfc,\n        [PAYOUT_7]         = 0x0049,\n    },\n    {\n        [PAYOUT_NONE]      = 0x1f97,\n        [PAYOUT_CHERRIES2] = 0x2ea2,\n        [PAYOUT_CHERRIES3] = 0x3627,\n        [PAYOUT_MAGSHELL]  = 0x39e9,\n        [PAYOUT_PIKAPSY]   = 0x3bca,\n        [PAYOUT_ROCKET]    = 0x3bf8,\n        [PAYOUT_7]         = 0x0049,\n    },\n    {\n        [PAYOUT_NONE]      = 0x1f91,\n        [PAYOUT_CHERRIES2] = 0x2e9b,\n        [PAYOUT_CHERRIES3] = 0x3620,\n        [PAYOUT_MAGSHELL]  = 0x39e3,\n        [PAYOUT_PIKAPSY]   = 0x3bc4,\n        [PAYOUT_ROCKET]    = 0x3bf4,\n        [PAYOUT_7]         = 0x0049,\n    },\n    {\n        [PAYOUT_NONE]      = 0x1f87,\n        [PAYOUT_CHERRIES2] = 0x2e92,\n        [PAYOUT_CHERRIES3] = 0x3617,\n        [PAYOUT_MAGSHELL]  = 0x39d9,\n        [PAYOUT_PIKAPSY]   = 0x3bba,\n        [PAYOUT_ROCKET]    = 0x3bef,\n        [PAYOUT_7]         = 0x0050,\n    },\n    {\n        [PAYOUT_NONE]      = 0x1f7f,\n        [PAYOUT_CHERRIES2] = 0x2e89,\n        [PAYOUT_CHERRIES3] = 0x360e,\n        [PAYOUT_MAGSHELL]  = 0x39d1,\n        [PAYOUT_PIKAPSY]   = 0x3bb2,\n        [PAYOUT_ROCKET]    = 0x3bea,\n        [PAYOUT_7]         = 0x0050,\n    },\n    {\n        [PAYOUT_NONE]      = 0x1fc9,\n        [PAYOUT_CHERRIES2] = 0x2efc,\n        [PAYOUT_CHERRIES3] = 0x3696,\n        [PAYOUT_MAGSHELL]  = 0x3a63,\n        [PAYOUT_PIKAPSY]   = 0x3c49,\n        [PAYOUT_ROCKET]    = 0x3c8b,\n        [PAYOUT_7]         = 0x0073,\n    },\n};\n\nstatic const u8 sReelIconAnimByReelAndPos[NUM_REELS][REEL_LENGTH] = {\n    {\n        ICON_7,\n        ICON_PSYDUCK,\n        ICON_CHERRIES,\n        ICON_ROCKET,\n        ICON_PIKACHU,\n        ICON_SHELLDER,\n        ICON_PIKACHU,\n        ICON_MAGNEMITE,\n        ICON_7,\n        ICON_SHELLDER,\n        ICON_PSYDUCK,\n        ICON_ROCKET,\n        ICON_CHERRIES,\n        ICON_PIKACHU,\n        ICON_SHELLDER,\n        ICON_7,\n        ICON_MAGNEMITE,\n        ICON_PIKACHU,\n        ICON_ROCKET,\n        ICON_SHELLDER,\n        ICON_PIKACHU\n    }, {\n        ICON_7,\n        ICON_MAGNEMITE,\n        ICON_CHERRIES,\n        ICON_PSYDUCK,\n        ICON_ROCKET,\n        ICON_MAGNEMITE,\n        ICON_CHERRIES,\n        ICON_PSYDUCK,\n        ICON_PIKACHU,\n        ICON_MAGNEMITE,\n        ICON_CHERRIES,\n        ICON_PSYDUCK,\n        ICON_7,\n        ICON_MAGNEMITE,\n        ICON_CHERRIES,\n        ICON_ROCKET,\n        ICON_PSYDUCK,\n        ICON_SHELLDER,\n        ICON_MAGNEMITE,\n        ICON_PSYDUCK,\n        ICON_CHERRIES\n    }, {\n        ICON_7,\n        ICON_PSYDUCK,\n        ICON_SHELLDER,\n        ICON_MAGNEMITE,\n        ICON_PIKACHU,\n        ICON_PSYDUCK,\n        ICON_SHELLDER,\n        ICON_MAGNEMITE,\n        ICON_PIKACHU,\n        ICON_PSYDUCK,\n        ICON_MAGNEMITE,\n        ICON_SHELLDER,\n        ICON_PIKACHU,\n        ICON_PSYDUCK,\n        ICON_MAGNEMITE,\n        ICON_SHELLDER,\n        ICON_PIKACHU,\n        ICON_PSYDUCK,\n        ICON_MAGNEMITE,\n        ICON_SHELLDER,\n        ICON_ROCKET\n    },\n};\n\nstatic const u16 sPayoutTable[] = {\n    [PAYOUT_NONE]      =   0,\n    [PAYOUT_CHERRIES2] =   2,\n    [PAYOUT_CHERRIES3] =   6,\n    [PAYOUT_MAGSHELL]  =   8,\n    [PAYOUT_PIKAPSY]   =  15,\n    [PAYOUT_ROCKET]    = 100,\n    [PAYOUT_7]         = 300\n};\n\nstatic const u16 sReelIcons_Pal_FR[][16] = INCBIN_U16(\"graphics/slot_machine/firered/reel_icons.gbapal\");\nstatic const u32 sReelIcons_Tiles_FR[]   = INCBIN_U32(\"graphics/slot_machine/firered/reel_icons.4bpp.lz\");\nstatic const u16 sClefairy_Pal_FR[]      = INCBIN_U16(\"graphics/slot_machine/firered/clefairy.gbapal\");\nstatic const u32 sClefairy_Tiles_FR[]    = INCBIN_U32(\"graphics/slot_machine/firered/clefairy.4bpp.lz\");\nstatic const u16 sReelIcons_Pal_LG[][16] = INCBIN_U16(\"graphics/slot_machine/leafgreen/reel_icons.gbapal\");\nstatic const u32 sReelIcons_Tiles_LG[]   = INCBIN_U32(\"graphics/slot_machine/leafgreen/reel_icons.4bpp.lz\");\nstatic const u16 sClefairy_Pal_LG[]      = INCBIN_U16(\"graphics/slot_machine/leafgreen/clefairy.gbapal\");\nstatic const u32 sClefairy_Tiles_LG[]    = INCBIN_U32(\"graphics/slot_machine/leafgreen/clefairy.4bpp.lz\");\nstatic const u16 sDigits_Pal[]        = INCBIN_U16(\"graphics/slot_machine/digits.gbapal\");\nstatic const u32 sDigits_Tiles[]      = INCBIN_U32(\"graphics/slot_machine/digits.4bpp.lz\");\n\nstatic const struct CompressedSpriteSheet sSpriteSheets_FR[] = {\n    {.data = sReelIcons_Tiles_FR, .size = 0xe00, .tag = GFXTAG_REEL_ICONS},\n    {.data = sClefairy_Tiles_FR,  .size = 0xc00, .tag = GFXTAG_CLEFAIRY},\n    {.data = sDigits_Tiles,    .size = 0x280, .tag = GFXTAG_DIGITS},\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheets_LG[] = {\n    {.data = sReelIcons_Tiles_LG, .size = 0xe00, .tag = GFXTAG_REEL_ICONS},\n    {.data = sClefairy_Tiles_LG,  .size = 0xc00, .tag = GFXTAG_CLEFAIRY},\n    {.data = sDigits_Tiles,    .size = 0x280, .tag = GFXTAG_DIGITS},\n};\n\nstatic const struct SpritePalette sSpritePalettes_FR[] = {\n    {.data = sReelIcons_Pal_FR[0], .tag = PALTAG_REEL_ICONS_0},\n    {.data = sReelIcons_Pal_FR[1], .tag = PALTAG_REEL_ICONS_1},\n    {.data = sReelIcons_Pal_FR[2], .tag = PALTAG_REEL_ICONS_2},\n    {.data = sReelIcons_Pal_FR[3], .tag = PALTAG_REEL_ICONS_3},\n    {.data = sReelIcons_Pal_FR[4], .tag = PALTAG_REEL_ICONS_4},\n    {.data = sClefairy_Pal_FR,     .tag = PALTAG_CLEFAIRY},\n    {.data = sDigits_Pal,       .tag = PALTAG_DIGITS},\n    {}\n};\n\nstatic const struct SpritePalette sSpritePalettes_LG[] = {\n    {.data = sReelIcons_Pal_LG[0], .tag = PALTAG_REEL_ICONS_0},\n    {.data = sReelIcons_Pal_LG[1], .tag = PALTAG_REEL_ICONS_1},\n    {.data = sReelIcons_Pal_LG[2], .tag = PALTAG_REEL_ICONS_2},\n    {.data = sReelIcons_Pal_LG[3], .tag = PALTAG_REEL_ICONS_3},\n    {.data = sReelIcons_Pal_LG[4], .tag = PALTAG_REEL_ICONS_4},\n    {.data = sClefairy_Pal_LG,     .tag = PALTAG_CLEFAIRY},\n    {.data = sDigits_Pal,       .tag = PALTAG_DIGITS},\n    {}\n};\n\n\nstatic const u16 sReelIconPaletteTags_FR[] = {\n    [ICON_7]         = PALTAG_REEL_ICONS_2,\n    [ICON_ROCKET]    = PALTAG_REEL_ICONS_2,\n    [ICON_PIKACHU]   = PALTAG_REEL_ICONS_0,\n    [ICON_PSYDUCK]   = PALTAG_REEL_ICONS_0,\n    [ICON_CHERRIES]  = PALTAG_REEL_ICONS_2,\n    [ICON_MAGNEMITE] = PALTAG_REEL_ICONS_4,\n    [ICON_SHELLDER]  = PALTAG_REEL_ICONS_3,\n};\n\nstatic const u16 sReelIconPaletteTags_LG[] = {\n    [ICON_7]         = PALTAG_REEL_ICONS_2,\n    [ICON_ROCKET]    = PALTAG_REEL_ICONS_2,\n    [ICON_PIKACHU]   = PALTAG_REEL_ICONS_0,\n    [ICON_PSYDUCK]   = PALTAG_REEL_ICONS_3,\n    [ICON_CHERRIES]  = PALTAG_REEL_ICONS_2,\n    [ICON_MAGNEMITE] = PALTAG_REEL_ICONS_1,\n    [ICON_SHELLDER]  = PALTAG_REEL_ICONS_1,\n};\n\nstatic const u16 sReelIconAffineParams[] = {\n    0x0120, 0x011f, 0x011e, 0x011d, 0x011c, 0x011b, 0x011a, 0x0119, 0x0118, 0x0117, 0x0116, 0x0115, 0x0114, 0x0113, 0x0112, 0x0111,\n    0x0110, 0x010f, 0x010e, 0x010d, 0x010c, 0x010b, 0x010a, 0x0109, 0x0108, 0x0107, 0x0106, 0x0105, 0x0104, 0x0103, 0x0102, 0x0101,\n    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,\n    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,\n    0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a, 0x010b, 0x010c, 0x010d, 0x010e, 0x010f, 0x0110,\n    0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x0119, 0x011a, 0x011b, 0x011c, 0x011d, 0x011e, 0x011f, 0x0120\n};\n\nstatic const u8 sReelIconBldY[] = {\n    0x10, 0x10, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0c, 0x0b, 0x0a, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06, 0x05, 0x04, 0x04, 0x03, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f\n};\n\nstatic const struct OamData sOamData_ReelIcons = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = ST_OAM_SQUARE,\n    .x = 0,\n    .matrixNum = 0,\n    .size = ST_OAM_SIZE_2,\n    .tileNum = 0,\n    .priority = 3,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const union AnimCmd sAnimCmd_ReelIcon_7[] = {\n    ANIMCMD_FRAME(0x00, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_ReelIcon_Rocket[] = {\n    ANIMCMD_FRAME(0x10, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_ReelIcon_Pikachu[] = {\n    ANIMCMD_FRAME(0x20, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_ReelIcon_Psyduck[] = {\n    ANIMCMD_FRAME(0x30, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_ReelIcon_Cherries[] = {\n    ANIMCMD_FRAME(0x40, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_ReelIcon_Magnemite[] = {\n    ANIMCMD_FRAME(0x50, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_ReelIcon_Shellder[] = {\n    ANIMCMD_FRAME(0x60, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_ReelIcon_Pikachu_2[] = {\n    ANIMCMD_FRAME(0x20, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_ReelIcon_Psyduck_2[] = {\n    ANIMCMD_FRAME(0x30, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_ReelIcon_Cherries_2[] = {\n    ANIMCMD_FRAME(0x40, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_ReelIcon_Magnemite_2[] = {\n    ANIMCMD_FRAME(0x50, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_ReelIcon_Shellder_2[] = {\n    ANIMCMD_FRAME(0x60, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnimTable_ReelIcons[] = {\n    [ICON_7]         = sAnimCmd_ReelIcon_7,\n    [ICON_ROCKET]    = sAnimCmd_ReelIcon_Rocket,\n    [ICON_PIKACHU]   = sAnimCmd_ReelIcon_Pikachu,\n    [ICON_PSYDUCK]   = sAnimCmd_ReelIcon_Psyduck,\n    [ICON_CHERRIES]  = sAnimCmd_ReelIcon_Cherries,\n    [ICON_MAGNEMITE] = sAnimCmd_ReelIcon_Magnemite,\n    [ICON_SHELLDER]  = sAnimCmd_ReelIcon_Shellder,\n    sAnimCmd_ReelIcon_Pikachu_2,\n    sAnimCmd_ReelIcon_Psyduck_2,\n    sAnimCmd_ReelIcon_Cherries_2,\n    sAnimCmd_ReelIcon_Magnemite_2,\n    sAnimCmd_ReelIcon_Shellder_2\n};\n\nstatic const union AffineAnimCmd sAffineAnimCmd_ReelIcons_Unused[] = {\n    AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 1),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sAffineAnimTable_ReelIcons_Unused[] = {\n    sAffineAnimCmd_ReelIcons_Unused\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_ReelIcons = {\n    .tileTag = GFXTAG_REEL_ICONS,\n    .paletteTag = PALTAG_REEL_ICONS_0,\n    .oam = &sOamData_ReelIcons,\n    .anims = sAnimTable_ReelIcons,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_Digits = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = ST_OAM_V_RECTANGLE,\n    .x = 0,\n    .matrixNum = 0,\n    .size = ST_OAM_SIZE_0,\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const union AnimCmd sSpriteAnim_Digit0[] = {\n    ANIMCMD_FRAME(0x00, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_Digit1[] = {\n    ANIMCMD_FRAME(0x02, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_Digit2[] = {\n    ANIMCMD_FRAME(0x04, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_Digit3[] = {\n    ANIMCMD_FRAME(0x06, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_Digit4[] = {\n    ANIMCMD_FRAME(0x08, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_Digit5[] = {\n    ANIMCMD_FRAME(0x0a, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_Digit6[] = {\n    ANIMCMD_FRAME(0x0c, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_Digit7[] = {\n    ANIMCMD_FRAME(0x0e, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_Digit8[] = {\n    ANIMCMD_FRAME(0x10, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_Digit9[] = {\n    ANIMCMD_FRAME(0x12, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnimTable_Digits[] = {\n    sSpriteAnim_Digit0,\n    sSpriteAnim_Digit1,\n    sSpriteAnim_Digit2,\n    sSpriteAnim_Digit3,\n    sSpriteAnim_Digit4,\n    sSpriteAnim_Digit5,\n    sSpriteAnim_Digit6,\n    sSpriteAnim_Digit7,\n    sSpriteAnim_Digit8,\n    sSpriteAnim_Digit9\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Digits = {\n    .tileTag = GFXTAG_DIGITS,\n    .paletteTag = PALTAG_DIGITS,\n    .oam = &sOamData_Digits,\n    .anims = sAnimTable_Digits,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_Clefairy = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = ST_OAM_SQUARE,\n    .x = 0,\n    .matrixNum = 0,\n    .size = ST_OAM_SIZE_2,\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 0,\n    .affineParam = 0\n};\n\nstatic const union AnimCmd sAnimCmd_Clefairy_Neutral[] = {\n    ANIMCMD_FRAME(0, 4),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_Clefairy_Spinning[] = {\n    ANIMCMD_FRAME( 0, 24),\n    ANIMCMD_FRAME(16, 24),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnimCmd_Clefairy_Payout[] = {\n    ANIMCMD_FRAME(32, 28),\n    ANIMCMD_FRAME(48, 28),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd sAnimCmd_Clefairy_Lose[] = {\n    ANIMCMD_FRAME(64, 12),\n    ANIMCMD_FRAME(80, 12),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sAnimTable_Clefairy[] = {\n    sAnimCmd_Clefairy_Neutral,\n    sAnimCmd_Clefairy_Spinning,\n    sAnimCmd_Clefairy_Payout,\n    sAnimCmd_Clefairy_Lose\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Clefairy = {\n    .tileTag = GFXTAG_CLEFAIRY,\n    .paletteTag = PALTAG_CLEFAIRY,\n    .oam = &sOamData_Clefairy,\n    .anims = sAnimTable_Clefairy,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nbool8 (*const sSlotMachineSetupTasks[])(u8 *, struct SlotMachineSetupTaskData *) = {\n    [SLOTTASK_GFX_INIT] = SlotsTask_GraphicsInit,\n    [SLOTTASK_FADEOUT_EXIT] = SlotsTask_FadeOut,\n    [SLOTTASK_UPDATE_LINE_LIGHTS] = SlotsTask_UpdateLineStates,\n    [SLOTTASK_CLEFAIRY_BOUNCE] = SlotsTask_ClefairyUpdateOnReelsStart,\n    [SLOTTASK_ANIM_WIN] = SlotsTask_StartClefairyDanceAndWinningLineFlash,\n    [SLOTTASK_END_ANIM_WIN] = SlotsTask_StopWinningLineFlashTask,\n    [SLOTTASK_ANIM_LOSE] = SlotsTask_ClefairyFainted,\n    [SLOTTASK_ANIM_BETTING] = SlotsTask_ClefairyNeutral,\n    [SLOTTASK_SHOW_AMOUNTS] = SlotsTask_UpdateCoinsDisplay,\n    [SLOTTASK_MSG_NO_COINS] = SlotsTask_MessageOutOfCoins,\n    [SLOTTASK_ASK_QUIT] = SlotsTask_AskQuitPlaying,\n    [SLOTTASK_DESTROY_YESNO] = SlotsTask_DestroyYesNoMenu,\n    [SLOTTASK_PRESS_BUTTON] = SlotsTask_PressReelButton,\n    [SLOTTASK_RELEASE_BUTTONS] = SlotsTask_ReleaseReelButtons,\n    [SLOTTASK_SHOWHELP] = SlotsTask_ShowHelp,\n    [SLOTTASK_HIDEHELP] = SlotsTask_HideHelp\n};\n\nstatic const u16 sBg_Pal_FR[][16]             = INCBIN_U16(\"graphics/slot_machine/firered/bg.gbapal\");\nstatic const u32 sBg_Tiles_FR[]               = INCBIN_U32(\"graphics/slot_machine/firered/bg.4bpp.lz\");\nstatic const u32 sBg_Tilemap_FR[]             = INCBIN_U32(\"graphics/slot_machine/firered/bg.bin.lz\");\nstatic const u16 sBgPal_MatchLines_FR[]       = INCBIN_U16(\"graphics/slot_machine/firered/match_lines.gbapal\");\nstatic const u16 sBgPal_PayoutLight_FR[][16]  = INCBIN_U16(\"graphics/slot_machine/firered/payout_lights.gbapal\");\nstatic const u32 sButtonPressed_Tiles_FR[]    = INCBIN_U32(\"graphics/slot_machine/firered/button_pressed.4bpp.lz\");\nstatic const u16 sCombosWindow_Pal_FR[]       = INCBIN_U16(\"graphics/slot_machine/firered/combos_window.gbapal\");\nstatic const u32 sCombosWindow_Tiles_FR[]     = INCBIN_U32(\"graphics/slot_machine/firered/combos_window.4bpp.lz\");\nstatic const u32 sCombosWindow_Tilemap_FR[]   = INCBIN_U32(\"graphics/slot_machine/firered/combos_window.bin.lz\");\nstatic const u16 sBg_Pal_LG[][16]             = INCBIN_U16(\"graphics/slot_machine/leafgreen/bg.gbapal\");\nstatic const u32 sBg_Tiles_LG[]               = INCBIN_U32(\"graphics/slot_machine/leafgreen/bg.4bpp.lz\");\nstatic const u32 sBg_Tilemap_LG[]             = INCBIN_U32(\"graphics/slot_machine/leafgreen/bg.bin.lz\");\nstatic const u16 sBgPal_MatchLines_LG[]       = INCBIN_U16(\"graphics/slot_machine/leafgreen/match_lines.gbapal\");\nstatic const u16 sBgPal_PayoutLight_LG[][16]  = INCBIN_U16(\"graphics/slot_machine/leafgreen/payout_lights.gbapal\");\nstatic const u32 sButtonPressed_Tiles_LG[]    = INCBIN_U32(\"graphics/slot_machine/leafgreen/button_pressed.4bpp.lz\");\nstatic const u16 sCombosWindow_Pal_LG[]       = INCBIN_U16(\"graphics/slot_machine/leafgreen/combos_window.gbapal\");\nstatic const u32 sCombosWindow_Tiles_LG[]     = INCBIN_U32(\"graphics/slot_machine/leafgreen/combos_window.4bpp.lz\");\nstatic const u32 sCombosWindow_Tilemap_LG[]   = INCBIN_U32(\"graphics/slot_machine/leafgreen/combos_window.bin.lz\");\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 3,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 28,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 5,\n        .tilemapTop = 15,\n        .width = 20,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x04f\n    }, {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 0,\n        .width = 30,\n        .height = 2,\n        .paletteNum = 14,\n        .baseBlock = 0x013\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const u16 sLineTiles_TLBR[] = {\n    0x00a4, 0x00a5, 0x00a6, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00e7, 0x012c, 0x014c, 0x0191, 0x01b1, 0x01f6, 0x0216, 0x0217, 0x0218, 0x0219, 0x0237, 0x0238, 0x0239\n};\n\nstatic const u16 sLineTiles_TopRow[] = {\n    0x00e4, 0x00e5, 0x00e6, 0x00f7, 0x00f8, 0x00f9, 0x0104, 0x0105, 0x0106, 0x0107, 0x010c, 0x0111, 0x0116, 0x0117, 0x0118, 0x0119, 0x0124, 0x0125, 0x0126, 0x0137, 0x0138, 0x0139\n};\n\nstatic const u16 sLineTiles_MiddleRow[] = {\n    0x0144, 0x0145, 0x0146, 0x0157, 0x0158, 0x0159, 0x0164, 0x0165, 0x0166, 0x0167, 0x016c, 0x0171, 0x0176, 0x0177, 0x0178, 0x0179, 0x0184, 0x0185, 0x0186, 0x0197, 0x0198, 0x0199\n};\n\nstatic const u16 sLineTiles_BottomRow[] = {\n    0x01a4, 0x01a5, 0x01a6, 0x01b7, 0x01b8, 0x01b9, 0x01c4, 0x01c5, 0x01c6, 0x01c7, 0x01cc, 0x01d1, 0x01d6, 0x01d7, 0x01d8, 0x01d9, 0x01e4, 0x01e5, 0x01e6, 0x01f7, 0x01f8, 0x01f9\n};\n\nstatic const u16 sLineTiles_BLTR[] = {\n    0x0204, 0x0205, 0x0206, 0x0224, 0x0225, 0x0226, 0x01e7, 0x0207, 0x018c, 0x01ac, 0x0131, 0x0151, 0x00d6, 0x00f6, 0x00b7, 0x00b8, 0x00b9, 0x00d7, 0x00d8, 0x00d9\n};\n\nstatic const struct LineStateTileIdxList sLineStateTileIdxs[NUM_MATCH_LINES] = {\n    { sLineTiles_TLBR, ARRAY_COUNT(sLineTiles_TLBR) },\n    { sLineTiles_TopRow, ARRAY_COUNT(sLineTiles_TopRow) },\n    { sLineTiles_MiddleRow, ARRAY_COUNT(sLineTiles_MiddleRow) },\n    { sLineTiles_BottomRow, ARRAY_COUNT(sLineTiles_BottomRow) },\n    { sLineTiles_BLTR, ARRAY_COUNT(sLineTiles_BLTR) }\n};\n\nstatic const u8 sWinningLineFlashPalIdxs[2] = {2, 4};\n\nstatic const struct WindowTemplate sYesNoWindowTemplate = {\n    .bg = 0,\n    .tilemapLeft = 19,\n    .tilemapTop = 9,\n    .width = 6,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x9F\n};\n\nstatic const u16 sReelButtonMapTileIdxs[NUM_REELS][NUM_BUTTON_TILES] = {\n    {0x0229, 0x022a, 0x0249, 0x024a},\n    {0x022e, 0x022f, 0x024e, 0x024f},\n    {0x0233, 0x0234, 0x0253, 0x0254}\n};\n\nvoid PlaySlotMachine(u16 machineIdx, MainCallback savedCallback)\n{\n    ResetTasks();\n    sSlotMachineState = Alloc(sizeof(*sSlotMachineState));\n    if (sSlotMachineState == NULL)\n        SetMainCallback2(savedCallback);\n    else\n    {\n        if (machineIdx >= ARRAY_COUNT(sReelBiasChances))\n            machineIdx = 0;\n        sSlotMachineState->machineIdx = machineIdx;\n        sSlotMachineState->savedCallback = savedCallback;\n        InitSlotMachineState(sSlotMachineState);\n        SetMainCallback2(CB2_InitSlotMachine);\n    }\n}\n\nstatic void InitSlotMachineState(struct SlotMachineState * ptr)\n{\n    s32 i;\n\n    ptr->currentReel = 0;\n    ptr->bet = 0;\n    ptr->payout = 0;\n    // for whatever reason, the loop does not use the ptr param\n    for (i = 0; i < NUM_REELS; i++)\n    {\n        sSlotMachineState->reelIsSpinning[i] = FALSE;\n        sSlotMachineState->reelPositions[i] = 0;\n        sSlotMachineState->reelSubpixel[i] = 0;\n        sSlotMachineState->destReelPos[i] = REEL_LENGTH;\n    }\n}\n\nstatic void CB2_InitSlotMachine(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n\n    switch (gMain.state)\n    {\n    case 0:\n        if (CreateSlotMachine())\n        {\n            SetMainCallback2(sSlotMachineState->savedCallback);\n            CleanSupSlotMachineState();\n        }\n        else\n        {\n            SetSlotMachineSetupTask(SLOTTASK_GFX_INIT, 0);\n            gMain.state++;\n        }\n        break;\n    case 1:\n        if (!IsSlotMachineSetupTaskActive(0))\n        {\n            sSlotMachineState->taskId = CreateTask(MainTask_SlotsGameLoop, 0);\n            sSlotMachineState->spinReelsTaskId = CreateTask(Task_SpinReels, 1);\n            SetMainCallback2(CB2_RunSlotMachine);\n        }\n        break;\n    }\n}\n\nstatic void CleanSupSlotMachineState(void)\n{\n    DestroySlotMachine();\n    if (sSlotMachineState != NULL)\n    {\n        Free(sSlotMachineState);\n        sSlotMachineState = NULL;\n    }\n}\n\nstatic void CB2_RunSlotMachine(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void MainTask_SlotsGameLoop(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    switch (data[0])\n    {\n    case 0:\n        // Betting Phase\n        if (GetCoins() == 0)\n        {\n            SetMainTask(MainTask_NoCoinsGameOver);\n        }\n        else if (JOY_NEW(DPAD_DOWN))\n        {\n            sSlotMachineState->bet++;\n            RemoveCoins(1);\n            PlaySE(SE_RS_SHOP);\n            SetSlotMachineSetupTask(SLOTTASK_SHOW_AMOUNTS, 0);\n            SetSlotMachineSetupTask(SLOTTASK_UPDATE_LINE_LIGHTS, 1);\n            data[0] = 1;\n        }\n        else if (JOY_NEW(R_BUTTON))\n        {\n            s32 toAdd = 3 - sSlotMachineState->bet;\n            if (GetCoins() >= toAdd)\n            {\n                sSlotMachineState->bet = 3;\n                RemoveCoins(toAdd);\n            }\n            else\n            {\n                sSlotMachineState->bet += GetCoins();\n                SetCoins(0);\n            }\n            PlaySE(SE_RS_SHOP);\n            SetSlotMachineSetupTask(SLOTTASK_SHOW_AMOUNTS, 0);\n            SetSlotMachineSetupTask(SLOTTASK_UPDATE_LINE_LIGHTS, 1);\n            data[0] = 1;\n        }\n        else if (JOY_NEW(A_BUTTON) && sSlotMachineState->bet != 0)\n        {\n            data[0] = 2;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            SetMainTask(MainTask_ConfirmExitGame);\n        }\n        else if (JOY_NEW(DPAD_RIGHT))\n        {\n            SetMainTask(MainTask_ShowHelp);\n        }\n        break;\n    case 1:\n        if (!IsSlotMachineSetupTaskActive(0) && !IsSlotMachineSetupTaskActive(1))\n        {\n            if (sSlotMachineState->bet == 3 || GetCoins() == 0)\n                data[0] = 2;\n            else\n                data[0] = 0;\n        }\n        break;\n    case 2:\n        SetQLPlayedTheSlots();\n        CalcSlotBias();\n        StartReels();\n        sSlotMachineState->currentReel = 0;\n        SetSlotMachineSetupTask(SLOTTASK_CLEFAIRY_BOUNCE, 0);\n        data[0] = 3;\n        break;\n    case 3:\n        if (!IsSlotMachineSetupTaskActive(0))\n        {\n            if (JOY_NEW(A_BUTTON))\n            {\n                PlaySE(SE_CONTEST_PLACE);\n                StopCurrentReel(sSlotMachineState->currentReel, sSlotMachineState->currentReel);\n                PressReelButton(sSlotMachineState->currentReel, 0);\n                data[0] = 4;\n            }\n        }\n        break;\n    case 4:\n        if (IsReelSpinning(sSlotMachineState->currentReel) == 0 && !IsSlotMachineSetupTaskActive(0))\n        {\n            sSlotMachineState->currentReel++;\n            if (sSlotMachineState->currentReel >= NUM_REELS)\n            {\n                sSlotMachineState->slotRewardClass = CalcPayout();\n                sSlotMachineState->bet = 0;\n                sSlotMachineState->currentReel = 0;\n                if (sSlotMachineState->slotRewardClass == PAYOUT_NONE)\n                    SetMainTask(MainTask_DarnNoPayout);\n                else\n                {\n                    if (sSlotMachineState->slotRewardClass == PAYOUT_7)\n                        IncrementGameStat(GAME_STAT_SLOT_JACKPOTS);\n                    ResetMachineBias();\n                    SetMainTask(MainTask_WinHandlePayout);\n                }\n            }\n            else\n                data[0] = 3;\n        }\n        break;\n    }\n}\n\nstatic void MainTask_NoCoinsGameOver(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    switch (data[0])\n    {\n    case 0:\n        SetSlotMachineSetupTask(SLOTTASK_MSG_NO_COINS, 0);\n        data[0]++;\n        break;\n    case 1:\n        if (!IsSlotMachineSetupTaskActive(0))\n            data[0]++;\n        break;\n    case 2:\n        if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))\n            SetMainTask(MainTask_ExitSlots);\n        break;\n    }\n}\n\nstatic void MainTask_ShowHelp(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    switch (data[0])\n    {\n    case 0:\n        SetSlotMachineSetupTask(SLOTTASK_SHOWHELP, 0);\n        data[0]++;\n        break;\n    case 1:\n        if (!IsSlotMachineSetupTaskActive(0))\n            data[0]++;\n        break;\n    case 2:\n        if (JOY_NEW(DPAD_LEFT))\n        {\n            SetSlotMachineSetupTask(SLOTTASK_HIDEHELP, 0);\n            data[0]++;\n        }\n        break;\n    case 3:\n        if (!IsSlotMachineSetupTaskActive(0))\n            SetMainTask(MainTask_SlotsGameLoop);\n        break;\n    }\n}\n\nstatic void MainTask_ConfirmExitGame(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    switch (data[0])\n    {\n    case 0:\n        SetSlotMachineSetupTask(SLOTTASK_ASK_QUIT, 0);\n        data[0]++;\n        break;\n    case 1:\n        if (!IsSlotMachineSetupTaskActive(0))\n            data[0]++;\n        break;\n    case 2:\n        switch (Menu_ProcessInputNoWrapClearOnChoose())\n        {\n        case 0:\n            AddCoins(sSlotMachineState->bet);\n            SetSlotMachineSetupTask(SLOTTASK_SHOW_AMOUNTS, 0);\n            data[0] = 3;\n            break;\n        case 1:\n        case -1:\n            SetSlotMachineSetupTask(SLOTTASK_DESTROY_YESNO, 0);\n            data[0] = 4;\n            break;\n        }\n        break;\n    case 3:\n        if (!IsSlotMachineSetupTaskActive(0))\n            SetMainTask(MainTask_ExitSlots);\n        break;\n    case 4:\n        if (!IsSlotMachineSetupTaskActive(0))\n            SetMainTask(MainTask_SlotsGameLoop);\n        break;\n    }\n}\n\nstatic void MainTask_DarnNoPayout(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    switch (data[0])\n    {\n    case 0:\n        SetSlotMachineSetupTask(SLOTTASK_ANIM_LOSE, 0);\n        data[1] = 0;\n        data[0]++;\n        break;\n    case 1:\n        data[1]++;\n        if (data[1] > 60)\n        {\n            SetSlotMachineSetupTask(SLOTTASK_ANIM_BETTING, 0);\n            SetSlotMachineSetupTask(SLOTTASK_UPDATE_LINE_LIGHTS, 1);\n            SetSlotMachineSetupTask(SLOTTASK_RELEASE_BUTTONS, 2);\n            data[0]++;\n        }\n        break;\n    case 2:\n        if (!IsSlotMachineSetupTaskActive(0) && !IsSlotMachineSetupTaskActive(1) && !IsSlotMachineSetupTaskActive(2))\n            SetMainTask(MainTask_SlotsGameLoop);\n        break;\n    }\n}\n\nstatic void MainTask_WinHandlePayout(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    switch (data[0])\n    {\n    case 0:\n        if (sSlotMachineState->slotRewardClass == PAYOUT_ROCKET || sSlotMachineState->slotRewardClass == PAYOUT_7)\n            PlayFanfare(MUS_SLOTS_JACKPOT);\n        else\n            PlayFanfare(MUS_SLOTS_WIN);\n        SetSlotMachineSetupTask(SLOTTASK_SHOW_AMOUNTS, 0);\n        SetSlotMachineSetupTask(SLOTTASK_ANIM_WIN, 1);\n        data[1] = 8;\n        data[0]++;\n        break;\n    case 1:\n        data[1]++;\n        if (data[1] > 120)\n        {\n            data[1] = 8;\n            if (JOY_HELD(A_BUTTON))\n                data[1] = 2;\n            data[0]++;\n        }\n        break;\n    case 2:\n        if (!IsSlotMachineSetupTaskActive(0))\n        {\n            if (IsFanfareTaskInactive() && JOY_NEW(START_BUTTON))\n            {\n                AddCoins(sSlotMachineState->payout);\n                sSlotMachineState->payout = 0;\n            }\n            else\n            {\n                data[1]--;\n                if (data[1] == 0)\n                {\n                    if (IsFanfareTaskInactive())\n                        PlaySE(SE_PIN);\n                    if (sSlotMachineState->payout != 0)\n                    {\n                        AddCoins(1);\n                        sSlotMachineState->payout--;\n                    }\n                    data[1] = 8;\n                    if (JOY_HELD(A_BUTTON))\n                        data[1] = 2;\n                }\n            }\n            SetSlotMachineSetupTask(SLOTTASK_SHOW_AMOUNTS, 0);\n            if (sSlotMachineState->payout == 0)\n                data[0]++;\n        }\n        break;\n    case 3:\n        if (IsFanfareTaskInactive() && !IsSlotMachineSetupTaskActive(0))\n        {\n            SetSlotMachineSetupTask(SLOTTASK_END_ANIM_WIN, 0);\n            data[0]++;\n        }\n        break;\n    case 4:\n        if (!IsSlotMachineSetupTaskActive(0))\n        {\n            SetSlotMachineSetupTask(SLOTTASK_UPDATE_LINE_LIGHTS, 0);\n            SetSlotMachineSetupTask(SLOTTASK_RELEASE_BUTTONS, 1);\n            data[0]++;\n        }\n        break;\n    case 5:\n        if (!IsSlotMachineSetupTaskActive(0) && !IsSlotMachineSetupTaskActive(1))\n            SetMainTask(MainTask_SlotsGameLoop);\n        break;\n    }\n}\n\nstatic void MainTask_ExitSlots(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    switch (data[0])\n    {\n    case 0:\n        SetSlotMachineSetupTask(SLOTTASK_FADEOUT_EXIT, 0);\n        data[0]++;\n        break;\n    case 1:\n        if (!IsSlotMachineSetupTaskActive(0))\n        {\n            SetMainCallback2(sSlotMachineState->savedCallback);\n            CleanSupSlotMachineState();\n        }\n        break;\n    }\n}\n\nstatic void SetMainTask(TaskFunc taskFunc)\n{\n    gTasks[sSlotMachineState->taskId].func = taskFunc;\n    gTasks[sSlotMachineState->taskId].data[0] = 0;\n}\n\nstatic void Task_SpinReels(u8 taskId)\n{\n    // taskId is never used\n\n    s32 i;\n\n    for (i = 0; i < NUM_REELS; i++)\n    {\n        if (sSlotMachineState->reelIsSpinning[i] || sSlotMachineState->reelSubpixel[i] != 0)\n        {\n            if (sSlotMachineState->reelSubpixel[i] != 0 || sSlotMachineState->reelPositions[i] != sSlotMachineState->destReelPos[i])\n            {\n                sSlotMachineState->reelSubpixel[i]++;\n                if (sSlotMachineState->reelSubpixel[i] > 2)\n                {\n                    sSlotMachineState->reelSubpixel[i] = 0;\n                    sSlotMachineState->reelPositions[i]--;\n                    if (sSlotMachineState->reelPositions[i] < 0)\n                        sSlotMachineState->reelPositions[i] = REEL_LENGTH - 1;\n                }\n                if (sSlotMachineState->reelPositions[i] != sSlotMachineState->destReelPos[i])\n                    continue;\n            }\n            sSlotMachineState->destReelPos[i] = REEL_LENGTH;\n            sSlotMachineState->reelIsSpinning[i] = FALSE;\n        }\n    }\n    UpdateReelIconSprites(sSlotMachineState->reelPositions, sSlotMachineState->reelSubpixel);\n}\n\nstatic void StartReels(void)\n{\n    s32 i;\n\n    for (i = 0; i < NUM_REELS; i++)\n        sSlotMachineState->reelIsSpinning[i] = TRUE;\n}\n\nstatic void StopCurrentReel(u16 whichReel, u16 whichReel2)\n{\n    switch (whichReel2)\n    {\n    case 0:\n        StopReel1(whichReel);\n        break;\n    case 1:\n        StopReel2(whichReel);\n        break;\n    case 2:\n        StopReel3(whichReel);\n        break;\n    }\n}\n\nstatic bool32 IsReelSpinning(u16 whichReel)\n{\n    return sSlotMachineState->reelIsSpinning[whichReel];\n}\n\nstatic s16 GetNextReelPosition(u16 whichReel)\n{\n    s16 position = sSlotMachineState->reelPositions[whichReel];\n    if (sSlotMachineState->reelSubpixel[whichReel] != 0)\n    {\n        position--;\n        if (position < 0)\n            position = REEL_LENGTH - 1;\n    }\n    return position;\n}\n\nstatic void StopReel1(u16 whichReel)\n{\n    s32 i, j;\n    s16 destPos;\n    u8 posToSample[5];\n    s16 nextPos = GetNextReelPosition(whichReel);\n    s32 numPosToSample = 0;\n\n    if (sSlotMachineState->machineBias == 0 && whichReel == 0)\n    {\n        for (i = 0; i < 5; i++)\n        {\n            for (j = 0, destPos = nextPos - i + 1; j < 3; j++, destPos++)\n            {\n                if (destPos >= REEL_LENGTH)\n                    destPos = 0;\n                if (TestReelIconAttribute(1, sReelIconAnimByReelAndPos[whichReel][destPos]))\n                    break;\n            }\n            if (j == 3)\n            {\n                posToSample[numPosToSample] = i;\n                numPosToSample++;\n            }\n        }\n    }\n    else if (sSlotMachineState->machineBias != 1 || whichReel == 0)\n    {\n        for (i = 0, destPos = nextPos + 1; i < 3; i++, destPos++)\n        {\n            if (destPos >= REEL_LENGTH)\n                destPos = 0;\n            if (TestReelIconAttribute(sSlotMachineState->machineBias, sReelIconAnimByReelAndPos[whichReel][destPos]))\n            {\n                posToSample[0] = 0;\n                numPosToSample = 1;\n                break;\n            }\n        }\n        for (i = 0, destPos = nextPos; i < 4; i++, destPos--)\n        {\n            if (destPos < 0)\n                destPos = REEL_LENGTH - 1;\n            if (TestReelIconAttribute(sSlotMachineState->machineBias, sReelIconAnimByReelAndPos[whichReel][destPos]))\n            {\n                posToSample[numPosToSample] = i + 1;\n                numPosToSample++;\n            }\n        }\n    }\n    if (numPosToSample == 0)\n    {\n        destPos = Random() % 5;\n    }\n    else\n    {\n        destPos = posToSample[Random() % numPosToSample];\n    }\n    destPos = nextPos - destPos;\n    if (destPos < 0)\n        destPos += REEL_LENGTH;\n    sSlotMachineState->reelStopOrder[0] = whichReel;\n    sSlotMachineState->destReelPos[whichReel] = destPos;\n}\n\nstatic void StopReel2(u16 whichReel)\n{\n    s16 pos, firstStoppedReelPos, firstStoppedReelId, nextPos;\n    s32 i;\n    s32 numPossiblePositions;\n    u8 possiblePositions[5];\n\n    firstStoppedReelId = sSlotMachineState->reelStopOrder[0];\n    firstStoppedReelPos = sSlotMachineState->reelPositions[firstStoppedReelId] + 1;\n    if (firstStoppedReelPos >= REEL_LENGTH)\n        firstStoppedReelPos = 0;\n    nextPos = GetNextReelPosition(whichReel);\n    pos = nextPos + 1;\n    if (pos >= REEL_LENGTH)\n        pos = 0;\n    numPossiblePositions = 0;\n    for (i = 0; i < 5; i++)\n    {\n        if (TwoReelBiasCheck(firstStoppedReelId, firstStoppedReelPos, whichReel, pos, sSlotMachineState->machineBias))\n        {\n            possiblePositions[numPossiblePositions] = i;\n            numPossiblePositions++;\n        }\n        pos--;\n        if (pos < 0)\n            pos = REEL_LENGTH - 1;\n    }\n    if (numPossiblePositions == 0)\n    {\n        sSlotMachineState->reel2BiasInPlay = 0;\n        if (sSlotMachineState->machineBias == PAYOUT_ROCKET || sSlotMachineState->machineBias == PAYOUT_7)\n            pos = 4;\n        else\n            pos = 0;\n    }\n    else\n    {\n        sSlotMachineState->reel2BiasInPlay = 1;\n        pos = possiblePositions[0];\n    }\n    pos = nextPos - pos;\n    if (pos < 0)\n        pos += REEL_LENGTH;\n    sSlotMachineState->reelStopOrder[1] = whichReel;\n    sSlotMachineState->destReelPos[whichReel] = pos;\n}\n\nstatic void StopReel3(u16 whichReel)\n{\n    s32 i;\n    s32 numPossiblePositions;\n    s32 nextPos;\n    s32 testPos;\n    s32 pos;\n    u8 possiblePositions[5];\n\n    nextPos = GetNextReelPosition(whichReel);\n    testPos = nextPos;\n    numPossiblePositions = 0;\n    for (i = 0; i < 5; i++)\n    {\n        if (OneReelBiasCheck(whichReel, testPos, sSlotMachineState->machineBias))\n        {\n            possiblePositions[numPossiblePositions] = i;\n            numPossiblePositions++;\n        }\n        testPos--;\n        if (testPos < 0)\n            testPos = 20;\n    }\n    if (numPossiblePositions == 0)\n    {\n        if (sSlotMachineState->machineBias == PAYOUT_ROCKET || sSlotMachineState->machineBias == PAYOUT_7)\n            pos = 4;\n        else\n            pos = 0;\n    }\n    else\n        pos = possiblePositions[0];\n    pos = nextPos - pos;\n    if (pos < 0)\n        pos += REEL_LENGTH;\n    sSlotMachineState->destReelPos[whichReel] = pos;\n}\n\nstatic bool32 TwoReelBiasCheck(s32 reel0id, s32 reel0pos, s32 reel1id, s32 reel1pos, s32 icon)\n{\n    s32 i;\n    u8 icons[9] = {};\n\n    for (i = 0; i < 9; i++)\n        icons[i] = 7;\n\n    for (i = 0; i < 3; i++)\n    {\n        icons[3 * reel0id + i] = sReelIconAnimByReelAndPos[reel0id][reel0pos];\n        icons[3 * reel1id + i] = sReelIconAnimByReelAndPos[reel1id][reel1pos];\n        reel0pos++;\n        if (reel0pos >= REEL_LENGTH)\n            reel0pos = 0;\n        reel1pos++;\n        if (reel1pos >= REEL_LENGTH)\n            reel1pos = 0;\n    }\n\n    switch (icon)\n    {\n    case 0:\n        for (i = 0; i < 3; i++)\n        {\n            if (TestReelIconAttribute(1, icons[i]))\n                return FALSE;\n        }\n        for (i = 0; i < 15; i++)\n        {\n            if (icons[sSecondReelBiasCheckIndices[i][0]] == icons[sSecondReelBiasCheckIndices[i][1]])\n                return TRUE;\n        }\n        return FALSE;\n    case 1:\n        if (reel0id == 0 || reel1id == 0)\n        {\n            if (reel0id == 1 || reel1id == 1)\n            {\n                for (i = 0; i < 15; i += 3)\n                {\n                    if (icons[sSecondReelBiasCheckIndices[i][0]] == icons[sSecondReelBiasCheckIndices[i][1]])\n                        return FALSE;\n                }\n            }\n            for (i = 0; i < 3; i++)\n            {\n                if (TestReelIconAttribute(icon, icons[i]))\n                    return TRUE;\n            }\n            return FALSE;\n        }\n        else\n            return TRUE;\n    case 2:\n        if (reel0id == 2 || reel1id == 2)\n        {\n            for (i = 0; i < 9; i++)\n            {\n                if (TestReelIconAttribute(icon, icons[i]))\n                    return TRUE;\n            }\n            return FALSE; // wrong level\n        }\n    }\n    for (i = 0; i < 15; i++)\n    {\n        if (icons[sSecondReelBiasCheckIndices[i][0]] == icons[sSecondReelBiasCheckIndices[i][1]] && TestReelIconAttribute(icon, icons[sSecondReelBiasCheckIndices[i][0]]))\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool32 OneReelBiasCheck(s32 reelId, s32 reelPos, s32 biasIcon)\n{\n    u8 icons[9];\n    s32 secondStoppedPos, firstStoppedPos;\n    s32 i;\n\n    firstStoppedPos++; firstStoppedPos--;\n    firstStoppedPos = sSlotMachineState->reelPositions[sSlotMachineState->reelStopOrder[0]] + 1;\n    secondStoppedPos = sSlotMachineState->reelPositions[sSlotMachineState->reelStopOrder[1]] + 1;\n    reelPos++;\n    if (firstStoppedPos >= REEL_LENGTH)\n        firstStoppedPos = 0;\n    if (secondStoppedPos >= REEL_LENGTH)\n        secondStoppedPos = 0;\n    if (reelPos >= REEL_LENGTH)\n        reelPos = 0;\n    for (i = 0; i < 3; i++)\n    {\n        icons[sSlotMachineState->reelStopOrder[0] * 3 + i] = sReelIconAnimByReelAndPos[sSlotMachineState->reelStopOrder[0]][firstStoppedPos];\n        icons[sSlotMachineState->reelStopOrder[1] * 3 + i] = sReelIconAnimByReelAndPos[sSlotMachineState->reelStopOrder[1]][secondStoppedPos];\n        icons[reelId * 3 + i] = sReelIconAnimByReelAndPos[reelId][reelPos];\n        if (++firstStoppedPos >= REEL_LENGTH)\n            firstStoppedPos = 0;\n        if (++secondStoppedPos >= REEL_LENGTH)\n            secondStoppedPos = 0;\n        if (++reelPos >= REEL_LENGTH)\n            reelPos = 0;\n    }\n    switch (biasIcon)\n    {\n    case PAYOUT_NONE:\n        for (i = 0; i < 3; i++)\n        {\n            if (TestReelIconAttribute(1, icons[i]))\n                return FALSE;\n        }\n        for (i = 0; i < NUM_MATCH_LINES; i++)\n        {\n            if (icons[sThirdReelBiasCheckIndices[i][0]] == icons[sThirdReelBiasCheckIndices[i][1]] && icons[sThirdReelBiasCheckIndices[i][0]] == icons[sThirdReelBiasCheckIndices[i][2]])\n                return FALSE;\n        }\n        return TRUE;\n    case PAYOUT_CHERRIES2:\n        for (i = 0; i < NUM_MATCH_LINES; i++)\n        {\n            if (icons[sThirdReelBiasCheckIndices[i][0]] == icons[sThirdReelBiasCheckIndices[i][1]] && TestReelIconAttribute(biasIcon, icons[sThirdReelBiasCheckIndices[i][0]]))\n                return FALSE;\n        }\n        for (i = 0; i < 3; i++)\n        {\n            if (TestReelIconAttribute(biasIcon, icons[i]))\n                return TRUE;\n        }\n        return FALSE;\n    case PAYOUT_CHERRIES3:\n        for (i = 0; i < NUM_MATCH_LINES; i++)\n        {\n            if (icons[sThirdReelBiasCheckIndices[i][0]] == icons[sThirdReelBiasCheckIndices[i][1]] && TestReelIconAttribute(biasIcon, icons[sThirdReelBiasCheckIndices[i][0]]))\n                return TRUE;\n        }\n        return FALSE;\n    }\n    for (i = 0; i < NUM_MATCH_LINES; i++)\n    {\n        if (icons[sThirdReelBiasCheckIndices[i][0]] == icons[sThirdReelBiasCheckIndices[i][1]] && icons[sThirdReelBiasCheckIndices[i][0]] == icons[sThirdReelBiasCheckIndices[i][2]] && TestReelIconAttribute(biasIcon, icons[sThirdReelBiasCheckIndices[i][0]]))\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool32 TestReelIconAttribute(s32 attr, s32 icon)\n{\n    switch (attr)\n    {\n    case PAYOUT_NONE:\n        return icon ^ 4 ? TRUE : FALSE;\n    case PAYOUT_CHERRIES2:\n    case PAYOUT_CHERRIES3:\n        return icon == ICON_CHERRIES ? TRUE : FALSE;\n    case PAYOUT_MAGSHELL:\n        return icon == ICON_MAGNEMITE || icon == ICON_SHELLDER ? TRUE : FALSE;\n    case PAYOUT_PIKAPSY:\n        return icon == ICON_PIKACHU || icon == ICON_PSYDUCK ? TRUE : FALSE;\n    case PAYOUT_ROCKET:\n        return icon == ICON_ROCKET ? TRUE : FALSE;\n    case PAYOUT_7:\n        return icon == ICON_7 ? TRUE : FALSE;\n    default:\n        return FALSE;\n    }\n}\n\nstatic u8 ReelIconToPayoutRank(s32 iconId)\n{\n    switch (iconId)\n    {\n    default:\n    case ICON_CHERRIES:\n        return PAYOUT_CHERRIES2;\n    case ICON_MAGNEMITE:\n    case ICON_SHELLDER:\n        return PAYOUT_MAGSHELL;\n    case ICON_PIKACHU:\n    case ICON_PSYDUCK:\n        return PAYOUT_PIKAPSY;\n    case ICON_ROCKET:\n        return PAYOUT_ROCKET;\n    case ICON_7:\n        return PAYOUT_7;\n    }\n}\n\nstatic void CalcSlotBias(void)\n{\n    u16 rval = Random() / 4;\n    s32 i;\n    const u16 * biasChances = sReelBiasChances[sSlotMachineState->machineIdx];\n    for (i = 0; i < NUM_PAYOUT_TYPES - 1; i++)\n    {\n        if (rval < biasChances[i])\n            break;\n    }\n    if (sSlotMachineState->machineBias < PAYOUT_ROCKET)\n    {\n        if (sSlotMachineState->biasCooldown == 0)\n        {\n            if ((Random() & 0x3FFF) < biasChances[PAYOUT_7])\n                sSlotMachineState->biasCooldown = (Random() & 1) ? 5 : 60;\n        }\n        if (sSlotMachineState->biasCooldown != 0)\n        {\n            if (i == 0 && (Random() & 0x3FFF) < (int)(0.7 * 0x3FFF)) // 70%\n                sSlotMachineState->biasCooldown = (Random() & 1) ? 5 : 60;\n            sSlotMachineState->biasCooldown--;\n        }\n        sSlotMachineState->machineBias = i;\n    }\n}\n\nstatic void ResetMachineBias(void)\n{\n    sSlotMachineState->machineBias = 0;\n}\n\nstatic u16 CalcPayout(void)\n{\n    u8 visibleIcons[9] = {};\n    s32 i;\n    s32 reel1pos, reel2pos, reel3pos;\n    s32 bestMatch;\n\n    for (i = 0; i < NUM_MATCH_LINES; i++)\n        sSlotMachineState->winFlags[i] = FALSE;\n\n    bestMatch = 0;\n    reel1pos = sSlotMachineState->reelPositions[0];\n    reel2pos = sSlotMachineState->reelPositions[1];\n    reel3pos = sSlotMachineState->reelPositions[2];\n\n    for (i = 0; i < 3; i++)\n    {\n        reel1pos++;\n        if (reel1pos >= REEL_LENGTH)\n            reel1pos = 0;\n        reel2pos++;\n        if (reel2pos >= REEL_LENGTH)\n            reel2pos = 0;\n        reel3pos++;\n        if (reel3pos >= REEL_LENGTH)\n            reel3pos = 0;\n        visibleIcons[0 * 3 + i] = sReelIconAnimByReelAndPos[0][reel1pos];\n        visibleIcons[1 * 3 + i] = sReelIconAnimByReelAndPos[1][reel2pos];\n        visibleIcons[2 * 3 + i] = sReelIconAnimByReelAndPos[2][reel3pos];\n    }\n    sSlotMachineState->payout = 0;\n    for (i = 0; i < NUM_MATCH_LINES; i++)\n    {\n        if (sSlotMachineState->bet >= sRowAttributes[i][ROWATTR_MINBET])\n        {\n            int curMatch;\n            if (TestReelIconAttribute(1, visibleIcons[sRowAttributes[i][ROWATTR_COL1POS]]))\n                curMatch = TestReelIconAttribute(2, visibleIcons[sRowAttributes[i][ROWATTR_COL2POS]]) ? 2 : 1;\n            else if (visibleIcons[sRowAttributes[i][ROWATTR_COL1POS]] == visibleIcons[sRowAttributes[i][ROWATTR_COL2POS]] && visibleIcons[sRowAttributes[i][ROWATTR_COL1POS]] == visibleIcons[sRowAttributes[i][ROWATTR_COL3POS]])\n                curMatch = ReelIconToPayoutRank(visibleIcons[sRowAttributes[i][ROWATTR_COL1POS]]);\n            else\n                curMatch = 0;\n            if (curMatch != 0)\n            {\n                sSlotMachineState->winFlags[i] = TRUE;\n                sSlotMachineState->payout += sPayoutTable[curMatch];\n            }\n            if (curMatch > bestMatch)\n                bestMatch = curMatch;\n        }\n    }\n    return bestMatch;\n}\n\nstatic u16 GetPayout(void)\n{\n    return sSlotMachineState->payout;\n}\n\nstatic u8 GetPlayerBet(void)\n{\n    return sSlotMachineState->bet;\n}\n\nstatic bool32 GetWinFlagByLine(int lineId)\n{\n    return sSlotMachineState->winFlags[lineId];\n}\n\nstatic bool32 LoadSpriteGraphicsAndAllocateManager(void)\n{\n    s32 i;\n\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        for (i = 0; i < ARRAY_COUNT(sSpriteSheets_FR); i++)\n            LoadCompressedSpriteSheet(&sSpriteSheets_FR[i]);\n        LoadSpritePalettes(sSpritePalettes_FR);\n    }\n    else\n    {\n        for (i = 0; i < ARRAY_COUNT(sSpriteSheets_LG); i++)\n            LoadCompressedSpriteSheet(&sSpriteSheets_LG[i]);\n        LoadSpritePalettes(sSpritePalettes_LG);\n    }\n    sSlotMachineGfxManager = Alloc(sizeof(*sSlotMachineGfxManager));\n    if (sSlotMachineGfxManager == NULL)\n        return FALSE;\n    InitGfxManager(sSlotMachineGfxManager);\n    return TRUE;\n}\n\nstatic void DestroyGfxManager(void)\n{\n    if (sSlotMachineGfxManager != NULL)\n    {\n        Free(sSlotMachineGfxManager);\n        sSlotMachineGfxManager = NULL;\n    }\n}\n\nstatic void InitGfxManager(struct SlotMachineGfxManager * manager)\n{\n    s32 i, j;\n\n    for (i = 0; i < NUM_REELS; i++)\n    {\n        manager->field_00[i] = 0;\n        for (j = 0; j < REEL_LOAD_LENGTH; j++)\n            manager->reelIconSprites[i][j] = NULL;\n    }\n}\n\nstatic void CreateReelIconSprites(void)\n{\n    struct Sprite *sprite;\n    s32 i, j;\n    s32 spriteId;\n    s32 animId;\n    for (i = 0; i < NUM_REELS; i++)\n    {\n        for (j = 0; j < REEL_LOAD_LENGTH; j++)\n        {\n            spriteId = CreateSprite(&sSpriteTemplate_ReelIcons, 80 + 40 * i, 44 + 24 * j, 2);\n            animId =  sReelIconAnimByReelAndPos[i][j];\n            sprite = &gSprites[spriteId];\n            StartSpriteAnim(sprite, animId);\n            if(gSaveBlock1Ptr->keyFlags.version == 0)\n            {\n                sprite->oam.paletteNum = IndexOfSpritePaletteTag(sReelIconPaletteTags_FR[animId]);\n            }\n            else\n            {\n                sprite->oam.paletteNum = IndexOfSpritePaletteTag(sReelIconPaletteTags_LG[animId]);\n            }\n            sprite->data[0] = i;\n            sprite->data[1] = j;\n            sprite->data[2] = j;\n            sprite->data[3] = 0;\n            sprite->oam.matrixNum = 0;\n            sSlotMachineGfxManager->reelIconSprites[i][j] = sprite;\n            sSlotMachineGfxManager->reelIconAffineParamPtr = (vu16 *)(OAM + 0 * sizeof(struct OamData) + offsetof(struct OamData, affineParam));\n        }\n    }\n}\n\nstatic void UpdateReelIconSprites(const s16 * reelPosPtr, const s16 * yposPtr)\n{\n    s32 i, j;\n    s32 reelPos, ypos;\n\n    for (i = 0; i < NUM_REELS; i++)\n    {\n        reelPos = *reelPosPtr;\n        ypos = *yposPtr * 8;\n        for (j = 0; j < REEL_LOAD_LENGTH; j++)\n        {\n            sSlotMachineGfxManager->reelIconSprites[i][j]->y2 = ypos;\n            {\n                s32 animId = sReelIconAnimByReelAndPos[i][reelPos];\n                struct Sprite *sprite = sSlotMachineGfxManager->reelIconSprites[i][j];\n                StartSpriteAnim(sprite, animId);\n            }\n            {\n                s32 animId = sReelIconAnimByReelAndPos[i][reelPos];\n                struct Sprite *sprite = sSlotMachineGfxManager->reelIconSprites[i][j];\n                StartSpriteAnim(sprite, animId);\n            }\n            if(gSaveBlock1Ptr->keyFlags.version == 0)\n            {\n                sSlotMachineGfxManager->reelIconSprites[i][j]->oam.paletteNum = IndexOfSpritePaletteTag(sReelIconPaletteTags_FR[sReelIconAnimByReelAndPos[i][reelPos]]);\n            }\n            else\n            {\n                sSlotMachineGfxManager->reelIconSprites[i][j]->oam.paletteNum = IndexOfSpritePaletteTag(sReelIconPaletteTags_LG[sReelIconAnimByReelAndPos[i][reelPos]]);\n            }\n            reelPos++;\n            if (reelPos >= REEL_LENGTH)\n                reelPos = 0;\n        }\n        reelPosPtr++;\n        yposPtr++;\n    }\n}\n\nstatic void HBlankCB_SlotMachine(void)\n{\n    s32 vcount = REG_VCOUNT - 0x2B;\n    if (vcount < 0x54u)\n    {\n        *sSlotMachineGfxManager->reelIconAffineParamPtr = sReelIconAffineParams[vcount];\n        REG_BLDY = sReelIconBldY[vcount];\n    }\n    else\n    {\n        *sSlotMachineGfxManager->reelIconAffineParamPtr = 0x100;\n        REG_BLDY = 0;\n    }\n}\n\nstatic void CreateScoreDigitSprites(void)\n{\n    s32 i;\n    s32 spriteId;\n\n    for (i = 0; i < NUM_DIGIT_SPRITES; i++)\n    {\n        spriteId = CreateSprite(&sSpriteTemplate_Digits, 85 + 7 * i, 30, 0);\n        sSlotMachineGfxManager->creditDigitSprites[i] = &gSprites[spriteId];\n        spriteId = CreateSprite(&sSpriteTemplate_Digits, 133 + 7 * i, 30, 0);\n        sSlotMachineGfxManager->payoutDigitSprites[i] = &gSprites[spriteId];\n    }\n}\n\nstatic void UpdateCoinsDisplay(void)\n{\n    s32 coins = GetCoins();\n    s32 payout = GetPayout();\n    s32 i;\n    s32 divisor = 1000;\n    s32 quotient;\n\n    for (i = 0; i < NUM_DIGIT_SPRITES; i++)\n    {\n        quotient = coins / divisor;\n        StartSpriteAnim(sSlotMachineGfxManager->creditDigitSprites[i], quotient);\n        coins -= quotient * divisor;\n        quotient = payout / divisor;\n        StartSpriteAnim(sSlotMachineGfxManager->payoutDigitSprites[i], quotient);\n        payout -= quotient * divisor;\n        divisor /= 10;\n    }\n}\n\nstatic void CreateClefairySprites(void)\n{\n    s32 spriteId = CreateSprite(&sSpriteTemplate_Clefairy, 16, 136, 1);\n    sSlotMachineGfxManager->clefairySprites[0] = &gSprites[spriteId];\n    spriteId = CreateSprite(&sSpriteTemplate_Clefairy, DISPLAY_WIDTH - 16, 136, 1);\n    sSlotMachineGfxManager->clefairySprites[1] = &gSprites[spriteId];\n    sSlotMachineGfxManager->clefairySprites[1]->hFlip = TRUE;\n}\n\nstatic void SetClefairySpriteAnim(u8 animId)\n{\n    s32 i;\n    for (i = 0; i < (int)ARRAY_COUNT(sSlotMachineGfxManager->clefairySprites); i++)\n        StartSpriteAnim(sSlotMachineGfxManager->clefairySprites[i], animId);\n}\n\nstatic bool32 CreateSlotMachine(void)\n{\n    s32 i;\n\n    struct SlotMachineSetupTaskData * ptr = Alloc(sizeof(struct SlotMachineSetupTaskData));\n    if (ptr == NULL)\n        return FALSE;\n    for (i = 0; i < (int)ARRAY_COUNT(ptr->tasks); i++)\n        ptr->tasks[i].active = 0;\n    ptr->yesNoMenuActive = FALSE;\n    SetWordTaskArg(CreateTask(Task_SlotMachine, 2), 0, (uintptr_t)ptr);\n    return FALSE;\n}\n\nstatic void DestroySlotMachine(void)\n{\n    if (FuncIsActiveTask(Task_SlotMachine))\n    {\n        Free(GetSlotMachineSetupTaskDataPtr());\n        DestroyTask(FindTaskIdByFunc(Task_SlotMachine));\n    }\n    DestroyGfxManager();\n    FreeAllWindowBuffers();\n}\n\nstatic void Task_SlotMachine(u8 taskId)\n{\n    struct SlotMachineSetupTaskData * ptr = (void *)GetWordTaskArg(taskId, 0);\n    s32 i;\n\n    for (i = 0; i < (int)ARRAY_COUNT(ptr->tasks); i++)\n    {\n        if (ptr->tasks[i].active)\n            ptr->tasks[i].active = sSlotMachineSetupTasks[ptr->tasks[i].funcno](&ptr->tasks[i].state, ptr);\n    }\n}\n\nstatic void VBlankCB_SlotMachine(void)\n{\n    TransferPlttBuffer();\n    LoadOam();\n    ProcessSpriteCopyRequests();\n}\n\nstatic struct SlotMachineSetupTaskData * GetSlotMachineSetupTaskDataPtr(void)\n{\n    return (void *)GetWordTaskArg(FindTaskIdByFunc(Task_SlotMachine), 0);\n}\n\nstatic void SetSlotMachineSetupTask(u16 funcno, u8 taskId)\n{\n    struct SlotMachineSetupTaskData * ptr = GetSlotMachineSetupTaskDataPtr();\n    ptr->tasks[taskId].funcno = funcno;\n    ptr->tasks[taskId].state = 0;\n    ptr->tasks[taskId].active = sSlotMachineSetupTasks[funcno](&ptr->tasks[taskId].state, ptr);\n}\n\nstatic bool32 IsSlotMachineSetupTaskActive(u8 taskId)\n{\n    return GetSlotMachineSetupTaskDataPtr()->tasks[taskId].active;\n}\n\nstatic inline void SetBackdropColor(u16 color, u16 *pal)\n{\n    *pal = color;\n    SetBackdropFromPalette(pal);\n}\n\nstatic bool8 SlotsTask_GraphicsInit(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    u16 pal[2];\n    u8 textColor[3];\n    u32 x;\n\n    switch (*state)\n    {\n    case 0:\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        (*state)++;\n        break;\n    case 1:\n        SetVBlankCallback(NULL);\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        RequestDma3Fill(0, (void *)OAM, OAM_SIZE, DMA3_32BIT);\n        RequestDma3Fill(0, (void *)VRAM, 0x20, DMA3_32BIT);\n        RequestDma3Fill(0, (void *)(VRAM + 0xC000), 0x20, DMA3_32BIT);\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        ResetBgPositions();\n        ResetBgsAndClearDma3BusyFlags(FALSE);\n        InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));\n        InitWindows(sWindowTemplates);\n\n        SetBgTilemapBuffer(3, ptr->bg3TilemapBuffer);\n        FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32);\n        CopyBgTilemapBufferToVram(3);\n\n        ResetTempTileDataBuffers();\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n        {\n            DecompressAndCopyTileDataToVram(2, sBg_Tiles_FR, 0, 0x00, 0);\n            DecompressAndCopyTileDataToVram(2, sButtonPressed_Tiles_FR, 0, 0xC0, 0);\n        }\n        else\n        {\n            DecompressAndCopyTileDataToVram(2, sBg_Tiles_LG, 0, 0x00, 0);\n            DecompressAndCopyTileDataToVram(2, sButtonPressed_Tiles_LG, 0, 0xC0, 0);\n        }\n        SetBgTilemapBuffer(2, ptr->bg2TilemapBuffer);\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n            CopyToBgTilemapBuffer(2, sBg_Tilemap_FR, 0, 0x00);\n        else\n            CopyToBgTilemapBuffer(2, sBg_Tilemap_LG, 0, 0x00);\n        CopyBgTilemapBufferToVram(2);\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n        {\n            LoadPalette(sBg_Pal_FR, BG_PLTT_ID(0), sizeof(sBg_Pal_FR));\n            LoadPalette(sBgPal_MatchLines_FR, BG_PLTT_ID(PALSLOT_LINE_BET), sizeof(sBgPal_MatchLines_FR));\n            LoadPalette(sCombosWindow_Pal_FR, BG_PLTT_ID(7), sizeof(sCombosWindow_Pal_FR));\n        }\n        else\n        {\n            LoadPalette(sBg_Pal_LG, BG_PLTT_ID(0), sizeof(sBg_Pal_LG));\n            LoadPalette(sBgPal_MatchLines_LG, BG_PLTT_ID(PALSLOT_LINE_BET), sizeof(sBgPal_MatchLines_LG));\n            LoadPalette(sCombosWindow_Pal_LG, BG_PLTT_ID(7), sizeof(sCombosWindow_Pal_LG));\n        }\n        SetBackdropColor(RGB(30, 30, 31), pal);\n        LoadUserWindowGfx2(0, 0x00A, BG_PLTT_ID(13));\n        LoadStdWindowGfxOnBg(0, 0x001, BG_PLTT_ID(15));\n\n        SetBgTilemapBuffer(0, ptr->bg0TilemapBuffer);\n        FillBgTilemapBufferRect_Palette0(0, 0, 0, 2, 32, 30);\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n        {\n            DecompressAndCopyTileDataToVram(1, sCombosWindow_Tiles_FR, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(1, sCombosWindow_Tilemap_FR, 0, 0, 1);\n        }\n        else\n        {\n            DecompressAndCopyTileDataToVram(1, sCombosWindow_Tiles_LG, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(1, sCombosWindow_Tilemap_LG, 0, 0, 1);\n        }\n        CopyBgTilemapBufferToVram(1);\n\n        LoadPalette(GetTextWindowPalette(2), BG_PLTT_ID(14), PLTT_SIZE_4BPP);\n        FillWindowPixelBuffer(1, 0xFF);\n        PutWindowTilemap(1);\n\n        x = DISPLAY_WIDTH - 4 - GetStringWidth(FONT_SMALL, gString_SlotMachineControls, 0);\n        textColor[0] = TEXT_DYNAMIC_COLOR_6;\n        textColor[1] = TEXT_COLOR_WHITE;\n        textColor[2] = TEXT_COLOR_DARK_GRAY;\n        AddTextPrinterParameterized3(1, FONT_SMALL, x, 0, textColor, 0, gString_SlotMachineControls);\n        CopyBgTilemapBufferToVram(0);\n\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | 0x20 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN);\n        LoadSpriteGraphicsAndAllocateManager();\n        CreateReelIconSprites();\n        CreateScoreDigitSprites();\n        CreateClefairySprites();\n        UpdateCoinsDisplay();\n        BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK);\n        SetVBlankCallback(VBlankCB_SlotMachine);\n        SetHBlankCallback(HBlankCB_SlotMachine);\n        (*state)++;\n        break;\n    case 2:\n        if (!FreeTempTileDataBuffersIfPossible())\n        {\n            ShowBg(0);\n            ShowBg(3);\n            ShowBg(2);\n            HideBg(1);\n            InitReelButtonTileMem();\n            BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK);\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n            EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK);\n            (*state)++;\n        }\n        break;\n    case 3:\n        UpdatePaletteFade();\n        if (!gPaletteFade.active)\n            return FALSE;\n        break;\n    }\n    return TRUE;\n}\n\nstatic bool8 SlotsTask_FadeOut(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    switch (*state)\n    {\n    case 0:\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, 0);\n        (*state)++;\n        break;\n    case 1:\n        if (!gPaletteFade.active)\n            return FALSE;\n        break;\n    }\n    return TRUE;\n}\n\nstatic bool8 SlotsTask_UpdateLineStates(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    switch (*state)\n    {\n    case 0:\n        SetLineStatesByBet(GetBgTilemapBuffer(2));\n        CopyBgTilemapBufferToVram(2);\n        (*state)++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            return FALSE;\n        break;\n    }\n    return TRUE;\n}\n\nstatic bool8 SlotsTask_ClefairyUpdateOnReelsStart(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    SetClefairySpriteAnim(1);\n    return FALSE;\n}\n\nstatic bool8 SlotsTask_StartClefairyDanceAndWinningLineFlash(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    SetClefairySpriteAnim(2);\n    CreateTask(Task_FlashWinningLine, 3);\n    return FALSE;\n}\n\nstatic bool8 SlotsTask_StopWinningLineFlashTask(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    switch (*state)\n    {\n    case 0:\n        SignalStopWinningLineFlashTask();\n        (*state)++;\n        break;\n    case 1:\n        if (!FuncIsActiveTask(Task_FlashWinningLine))\n        {\n            SetClefairySpriteAnim(0);\n            return FALSE;\n        }\n        break;\n    }\n    return TRUE;\n}\n\nstatic bool8 SlotsTask_ClefairyFainted(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    SetClefairySpriteAnim(3);\n    return FALSE;\n}\n\nstatic bool8 SlotsTask_ClefairyNeutral(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    SetClefairySpriteAnim(0);\n    return FALSE;\n}\n\nstatic bool8 SlotsTask_UpdateCoinsDisplay(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    UpdateCoinsDisplay();\n    return FALSE;\n}\n\nstatic bool8 SlotsTask_MessageOutOfCoins(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    switch (*state)\n    {\n    case 0:\n        Slot_PrintOnWindow0(gString_OutOfCoins);\n        CopyWindowToVram(0, COPYWIN_FULL);\n        (*state)++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            return FALSE;\n        break;\n    }\n    return TRUE;\n}\n\nstatic bool8 SlotsTask_AskQuitPlaying(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    switch (*state)\n    {\n    case 0:\n        Slot_PrintOnWindow0(gString_QuitPlaying);\n        Slot_CreateYesNoMenu(0);\n        CopyWindowToVram(0, COPYWIN_FULL);\n        (*state)++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            return FALSE;\n        break;\n    }\n    return TRUE;\n}\n\nstatic bool8 SlotsTask_DestroyYesNoMenu(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    switch (*state)\n    {\n    case 0:\n        Slot_ClearWindow0();\n        Slot_DestroyYesNoMenu();\n        CopyWindowToVram(0, COPYWIN_FULL);\n        (*state)++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            return FALSE;\n        break;\n    }\n    return TRUE;\n}\n\nstatic bool8 SlotsTask_PressReelButton(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    switch (*state)\n    {\n    case 0:\n        SetReelButtonPressed(ptr->reelButtonToPress);\n        CopyBgTilemapBufferToVram(2);\n        (*state)++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            return FALSE;\n        break;\n    }\n    return TRUE;\n}\n\nstatic bool8 SlotsTask_ReleaseReelButtons(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    switch (*state)\n    {\n    case 0:\n        ReleaseReelButtons();\n        CopyBgTilemapBufferToVram(2);\n        (*state)++;\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            return FALSE;\n        break;\n    }\n    return TRUE;\n}\n\nstatic bool8 SlotsTask_ShowHelp(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    switch (*state)\n    {\n    case 0:\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR);\n        SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0,   0));\n        SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0, 160));\n        ShowBg(1);\n        PlaySE(SE_WIN_OPEN);\n        ptr->bg1X = 0;\n        (*state)++;\n        break;\n    case 1:\n        ptr->bg1X += 16;\n        if (ptr->bg1X >= 256)\n        {\n            ptr->bg1X = 256;\n            (*state)++;\n        }\n        ChangeBgX(1, 256 * (256 - ptr->bg1X), 0);\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, ptr->bg1X));\n        break;\n    case 2:\n        return FALSE;\n    }\n    return TRUE;\n}\n\nstatic bool8 SlotsTask_HideHelp(u8 * state, struct SlotMachineSetupTaskData * ptr)\n{\n    switch (*state)\n    {\n    case 0:\n        PlaySE(SE_WIN_OPEN);\n        (*state)++;\n        // fallthrough\n    case 1:\n        ptr->bg1X -= 16;\n        if (ptr->bg1X <= 0)\n        {\n            ptr->bg1X = 0;\n            (*state)++;\n        }\n        ChangeBgX(1, 256 * (256 - ptr->bg1X), 0);\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, ptr->bg1X));\n        break;\n    case 2:\n        HideBg(1);\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        (*state)++;\n        break;\n    case 3:\n        return FALSE;\n    }\n    return TRUE;\n}\n\nstatic void Slot_PrintOnWindow0(const u8 * str)\n{\n    FillWindowPixelBuffer(0, PIXEL_FILL(1));\n    PutWindowTilemap(0);\n    DrawTextBorderOuter(0, 0x001, 15);\n    AddTextPrinterParameterized5(0, FONT_NORMAL, str, 1, 2, TEXT_SKIP_DRAW, NULL, 1, 2);\n}\n\nstatic void Slot_ClearWindow0(void)\n{\n    rbox_fill_rectangle(0);\n}\n\nstatic void SetLineStatesByBet(u16 * bgTilemapBuffer)\n{\n    switch (GetPlayerBet())\n    {\n    case 0:\n        SetLineState(bgTilemapBuffer, 0, PALSLOT_LINE_NORMAL);\n        SetLineState(bgTilemapBuffer, 1, PALSLOT_LINE_NORMAL);\n        SetLineState(bgTilemapBuffer, 2, PALSLOT_LINE_NORMAL);\n        SetLineState(bgTilemapBuffer, 3, PALSLOT_LINE_NORMAL);\n        SetLineState(bgTilemapBuffer, 4, PALSLOT_LINE_NORMAL);\n        break;\n    case 3:\n        SetLineState(bgTilemapBuffer, 0, PALSLOT_LINE_BET);\n        SetLineState(bgTilemapBuffer, 4, PALSLOT_LINE_BET);\n    case 2:\n        SetLineState(bgTilemapBuffer, 1, PALSLOT_LINE_BET);\n        SetLineState(bgTilemapBuffer, 3, PALSLOT_LINE_BET);\n    case 1:\n        SetLineState(bgTilemapBuffer, 2, PALSLOT_LINE_BET);\n        break;\n    }\n}\n\nstatic void SetLineState(u16 * bgTilemapBuffer, u16 whichLine, u16 paletteNum)\n{\n    s32 i;\n    const u16 * tileIdxs = sLineStateTileIdxs[whichLine].tiles;\n    u16 palMask = (paletteNum & 0xF) << 12;\n\n    for (i = 0; i < sLineStateTileIdxs[whichLine].count; i++)\n    {\n        bgTilemapBuffer[*tileIdxs] &= 0x0FFF;\n        bgTilemapBuffer[*tileIdxs] |= palMask;\n        tileIdxs++;\n    }\n}\n\nstatic void Task_FlashWinningLine(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    s32 i;\n\n    switch (data[0])\n    {\n    case 0:\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n            LoadPalette(sBgPal_MatchLines_FR, BG_PLTT_ID(PALSLOT_LINE_MATCH), sizeof(sBgPal_MatchLines_FR));\n        else\n            LoadPalette(sBgPal_MatchLines_LG, BG_PLTT_ID(PALSLOT_LINE_MATCH), sizeof(sBgPal_MatchLines_LG));\n        for (i = 0; i < NUM_MATCH_LINES; i++)\n        {\n            if (GetWinFlagByLine(i))\n                SetLineState(GetBgTilemapBuffer(2), i, PALSLOT_LINE_MATCH);\n        }\n        CopyBgTilemapBufferToVram(2);\n        data[0]++;\n        break;\n    case 1:\n        if (data[1] == 0)\n        {\n            u16 y = gSineTable[data[2]] >> 7;\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n            LoadPalette(&sBgPal_PayoutLight_FR[y], BG_PLTT_ID(1), sizeof(sBgPal_PayoutLight_FR[0]));\n        else\n            LoadPalette(&sBgPal_PayoutLight_LG[y], BG_PLTT_ID(1), sizeof(sBgPal_PayoutLight_LG[0]));\n            data[2] += 32;\n            data[2] &= 0x7F;\n            data[1] = 8;\n        }\n        else\n            data[1]--;\n\n        if (data[3] == 0)\n        {\n            data[4] += 8;\n            data[4] &= 0x7F;\n            data[5] = gSineTable[data[4]] >> 5;\n            BlendPalettes(1 << PALSLOT_LINE_MATCH, data[5], RGB_BLACK);\n        }\n        else\n        {\n            data[4]++;\n            if (data[4] > 1)\n            {\n                data[4] = 0;\n                data[5]++;\n                data[5] &= 1;\n                BlendPalettes(1 << PALSLOT_LINE_MATCH, data[5] * 8, RGB_BLACK);\n            }\n        }\n\n        for (i = 0; i < ARRAY_COUNT(sWinningLineFlashPalIdxs); i++)\n            gPlttBufferFaded[sWinningLineFlashPalIdxs[i] + BG_PLTT_ID(PALSLOT_LINE_MATCH)] = gPlttBufferUnfaded[sWinningLineFlashPalIdxs[i] + BG_PLTT_ID(PALSLOT_LINE_MATCH)];\n        break;\n    case 2:\n        // Restore match lines to normal color \n        for (i = 0; i < NUM_MATCH_LINES; i++)\n        {\n            if (GetWinFlagByLine(i))\n                SetLineState(GetBgTilemapBuffer(2), i, PALSLOT_LINE_NORMAL);\n        }\n        \n        // Restore payout lights to normal color\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n            LoadPalette(&sBg_Pal_FR[1], BG_PLTT_ID(1), sizeof(sBg_Pal_FR[1]));\n        else\n            LoadPalette(&sBg_Pal_LG[1], BG_PLTT_ID(1), sizeof(sBg_Pal_LG[1]));\n\n        CopyBgTilemapBufferToVram(2);\n        data[0]++;\n        break;\n    case 3:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void SignalStopWinningLineFlashTask(void)\n{\n    gTasks[FindTaskIdByFunc(Task_FlashWinningLine)].data[0] = 2;\n}\n\nstatic void Slot_CreateYesNoMenu(u8 cursorPos)\n{\n    CreateYesNoMenu(&sYesNoWindowTemplate, FONT_NORMAL, 0, 2, 10, 13, cursorPos);\n    Menu_MoveCursorNoWrapAround(cursorPos);\n    GetSlotMachineSetupTaskDataPtr()->yesNoMenuActive = TRUE;\n}\n\nstatic void Slot_DestroyYesNoMenu(void)\n{\n    struct SlotMachineSetupTaskData * data = GetSlotMachineSetupTaskDataPtr();\n    if (data->yesNoMenuActive)\n    {\n        DestroyYesNoMenu();\n        data->yesNoMenuActive = FALSE;\n    }\n}\n\nstatic void InitReelButtonTileMem(void)\n{\n    s32 i, j;\n    struct SlotMachineSetupTaskData * data = GetSlotMachineSetupTaskDataPtr();\n    u16 * buffer = GetBgTilemapBuffer(2);\n\n    for (i = 0; i < NUM_REELS; i++)\n    {\n        for (j = 0; j < NUM_BUTTON_TILES; j++)\n        {\n            u16 idx = sReelButtonMapTileIdxs[i][j];\n            data->buttonReleasedTiles[i][j] = buffer[idx];\n            data->buttonPressedTiles[i][j] = j + 0xC0;\n        }\n    }\n}\n\nstatic void SetReelButtonPressed(u8 reel)\n{\n    if (reel < NUM_REELS)\n    {\n        s32 i;\n        struct SlotMachineSetupTaskData * data = GetSlotMachineSetupTaskDataPtr();\n        u16 * buffer = GetBgTilemapBuffer(2);\n        for (i = 0; i < NUM_BUTTON_TILES; i++)\n        {\n            u16 idx = sReelButtonMapTileIdxs[reel][i];\n            buffer[idx] = data->buttonPressedTiles[reel][i];\n        }\n    }\n}\n\nstatic void ReleaseReelButtons(void)\n{\n    s32 i, j;\n    struct SlotMachineSetupTaskData * data = GetSlotMachineSetupTaskDataPtr();\n    u16 * buffer = GetBgTilemapBuffer(2);\n\n    for (i = 0; i < NUM_REELS; i++)\n    {\n        for (j = 0; j < NUM_BUTTON_TILES; j++)\n        {\n            u16 idx = sReelButtonMapTileIdxs[i][j];\n            buffer[idx] = data->buttonReleasedTiles[i][j];\n        }\n    }\n}\n\nstatic void PressReelButton(u8 reel, u8 taskId)\n{\n    GetSlotMachineSetupTaskDataPtr()->reelButtonToPress = reel;\n    SetSlotMachineSetupTask(SLOTTASK_PRESS_BUTTON, taskId);\n}\n"
  },
  {
    "path": "src/sound.c",
    "content": "#include \"global.h\"\n#include \"gba/m4a_internal.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"quest_log.h\"\n#include \"m4a.h\"\n#include \"constants/songs.h\"\n#include \"constants/sound.h\"\n#include \"task.h\"\n\nstruct Fanfare\n{\n    u16 songNum;\n    u16 duration;\n};\n\n// TODO: what are these\nextern u8 gDisableMapMusicChangeOnMapLoad;\nextern u8 gDisableHelpSystemVolumeReduce;\n\n// ewram\nEWRAM_DATA struct MusicPlayerInfo* gMPlay_PokemonCry = NULL;\nEWRAM_DATA u8 gPokemonCryBGMDuckingCounter = 0;\n\n// iwram bss\nstatic u16 sCurrentMapMusic;\nstatic u16 sNextMapMusic;\nstatic u8 sMapMusicState;\nstatic u8 sMapMusicFadeInSpeed;\nstatic u16 sFanfareCounter;\n\n// iwram common\nbool8 gDisableMusic;\n\nextern u32 gBattleTypeFlags;\nextern struct MusicPlayerInfo gMPlayInfo_BGM;\nextern struct MusicPlayerInfo gMPlayInfo_SE1;\nextern struct MusicPlayerInfo gMPlayInfo_SE2;\nextern struct MusicPlayerInfo gMPlayInfo_SE3;\nextern struct ToneData gCryTable[];\nextern struct ToneData gCryTable_Reverse[];\n\nextern u16 SpeciesToCryId(u16);\n\nstatic void Task_Fanfare(u8 taskId);\nstatic void CreateFanfareTask(void);\nstatic void Task_DuckBGMForPokemonCry(u8 taskId);\nstatic void RestoreBGMVolumeAfterPokemonCry(void);\n\nstatic const struct Fanfare sFanfares[] = {\n    [FANFARE_LEVEL_UP]      = { MUS_LEVEL_UP,         80 },\n    [FANFARE_OBTAIN_ITEM]   = { MUS_OBTAIN_ITEM,     160 },\n    [FANFARE_EVOLVED]       = { MUS_EVOLVED,         220 },\n    [FANFARE_OBTAIN_TMHM]   = { MUS_OBTAIN_TMHM,     220 },\n    [FANFARE_HEAL]          = { MUS_RS_HEAL,         160 },\n    [FANFARE_OBTAIN_BADGE]  = { MUS_OBTAIN_BADGE,    340 },\n    [FANFARE_MOVE_DELETED]  = { MUS_MOVE_DELETED,    180 },\n    [FANFARE_OBTAIN_BERRY]  = { MUS_OBTAIN_BERRY,    120 },\n    [FANFARE_SLOTS_JACKPOT] = { MUS_SLOTS_JACKPOT,   250 },\n    [FANFARE_SLOTS_WIN]     = { MUS_SLOTS_WIN,       150 },\n    [FANFARE_TOO_BAD]       = { MUS_TOO_BAD,         160 },\n    [FANFARE_POKE_FLUTE]    = { MUS_POKE_FLUTE,      450 },\n    [FANFARE_KEY_ITEM]      = { MUS_OBTAIN_KEY_ITEM, 170 },\n    [FANFARE_DEX_EVAL]      = { MUS_DEX_RATING,      196 }\n};\n\nvoid InitMapMusic(void)\n{\n    gDisableMusic = FALSE;\n    ResetMapMusic();\n}\n\nvoid MapMusicMain(void)\n{\n    switch (sMapMusicState)\n    {\n    case 0:\n        break;\n    case 1:\n        sMapMusicState = 2;\n        PlayBGM(sCurrentMapMusic);\n        break;\n    case 2:\n    case 3:\n    case 4:\n        break;\n    case 5:\n        if (IsBGMStopped())\n        {\n            sNextMapMusic = 0;\n            sMapMusicState = 0;\n        }\n        break;\n    case 6:\n        if (IsBGMStopped() && IsFanfareTaskInactive())\n        {\n            sCurrentMapMusic = sNextMapMusic;\n            sNextMapMusic = 0;\n            sMapMusicState = 2;\n            PlayBGM(sCurrentMapMusic);\n        }\n        break;\n    case 7:\n        if (IsBGMStopped() && IsFanfareTaskInactive())\n        {\n            FadeInNewBGM(sNextMapMusic, sMapMusicFadeInSpeed);\n            sCurrentMapMusic = sNextMapMusic;\n            sNextMapMusic = 0;\n            sMapMusicState = 2;\n            sMapMusicFadeInSpeed = 0;\n        }\n        break;\n    }\n}\n\nvoid ResetMapMusic(void)\n{\n    sCurrentMapMusic = 0;\n    sNextMapMusic = 0;\n    sMapMusicState = 0;\n    sMapMusicFadeInSpeed = 0;\n}\n\nu16 GetCurrentMapMusic(void)\n{\n    return sCurrentMapMusic;\n}\n\nvoid PlayNewMapMusic(u16 songNum)\n{\n    sCurrentMapMusic = songNum;\n    sNextMapMusic = 0;\n    sMapMusicState = 1;\n}\n\nvoid StopMapMusic(void)\n{\n    sCurrentMapMusic = 0;\n    sNextMapMusic = 0;\n    sMapMusicState = 1;\n}\n\nvoid FadeOutMapMusic(u8 speed)\n{\n    if (IsNotWaitingForBGMStop())\n        FadeOutBGM(speed);\n    sCurrentMapMusic = 0;\n    sNextMapMusic = 0;\n    sMapMusicState = 5;\n}\n\nvoid FadeOutAndPlayNewMapMusic(u16 songNum, u8 speed)\n{\n    FadeOutMapMusic(speed);\n    sCurrentMapMusic = 0;\n    sNextMapMusic = songNum;\n    sMapMusicState = 6;\n}\n\nvoid FadeOutAndFadeInNewMapMusic(u16 songNum, u8 fadeOutSpeed, u8 fadeInSpeed)\n{\n    FadeOutMapMusic(fadeOutSpeed);\n    sCurrentMapMusic = 0;\n    sNextMapMusic = songNum;\n    sMapMusicState = 7;\n    sMapMusicFadeInSpeed = fadeInSpeed;\n}\n\n// Unused\nstatic void FadeInNewMapMusic(u16 songNum, u8 speed)\n{\n    FadeInNewBGM(songNum, speed);\n    sCurrentMapMusic = songNum;\n    sNextMapMusic = 0;\n    sMapMusicState = 2;\n    sMapMusicFadeInSpeed = 0;\n}\n\nbool8 IsNotWaitingForBGMStop(void)\n{\n    if (sMapMusicState == 6)\n        return FALSE;\n    if (sMapMusicState == 5)\n        return FALSE;\n    if (sMapMusicState == 7)\n        return FALSE;\n    return TRUE;\n}\n\nvoid PlayFanfareByFanfareNum(u8 fanfareNum)\n{\n    u16 songNum;\n    if(gQuestLogState == QL_STATE_PLAYBACK)\n    {\n        sFanfareCounter = 0xFF;\n    }\n    else\n    {\n        m4aMPlayStop(&gMPlayInfo_BGM);\n        songNum = sFanfares[fanfareNum].songNum;\n        sFanfareCounter = sFanfares[fanfareNum].duration;\n        m4aSongNumStart(songNum);\n    }\n}\n\nbool8 WaitFanfare(bool8 stop)\n{\n    if (sFanfareCounter)\n    {\n        sFanfareCounter--;\n        return FALSE;\n    }\n    else\n    {\n        if (!stop)\n            m4aMPlayContinue(&gMPlayInfo_BGM);\n        else\n            m4aSongNumStart(MUS_DUMMY);\n\n        return TRUE;\n    }\n}\n\n// Unused\nvoid StopFanfareByFanfareNum(u8 fanfareNum)\n{\n    m4aSongNumStop(sFanfares[fanfareNum].songNum);\n}\n\nvoid PlayFanfare(u16 songNum)\n{\n    s32 i;\n    for (i = 0; (u32)i < ARRAY_COUNT(sFanfares); i++)\n    {\n        if (sFanfares[i].songNum == songNum)\n        {\n            PlayFanfareByFanfareNum(i);\n            CreateFanfareTask();\n            return;\n        }\n    }\n\n    // songNum is not in sFanfares\n    // Play first fanfare in table instead\n    PlayFanfareByFanfareNum(0);\n    CreateFanfareTask();\n}\n\nbool8 IsFanfareTaskInactive(void)\n{\n    if (FuncIsActiveTask(Task_Fanfare) == TRUE)\n        return FALSE;\n    return TRUE;\n}\n\nstatic void Task_Fanfare(u8 taskId)\n{\n    if (sFanfareCounter)\n    {\n        sFanfareCounter--;\n    }\n    else\n    {\n        m4aMPlayContinue(&gMPlayInfo_BGM);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void CreateFanfareTask(void)\n{\n    if (FuncIsActiveTask(Task_Fanfare) != TRUE)\n        CreateTask(Task_Fanfare, 80);\n}\n\nvoid FadeInNewBGM(u16 songNum, u8 speed)\n{\n    if (gDisableMusic)\n        songNum = 0;\n    if (songNum == MUS_NONE)\n        songNum = 0;\n    m4aSongNumStart(songNum);\n    m4aMPlayImmInit(&gMPlayInfo_BGM);\n    m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0);\n    m4aSongNumStop(songNum);\n    m4aMPlayFadeIn(&gMPlayInfo_BGM, speed);\n}\n\nvoid FadeOutBGMTemporarily(u8 speed)\n{\n    m4aMPlayFadeOutTemporarily(&gMPlayInfo_BGM, speed);\n}\n\nbool8 IsBGMPausedOrStopped(void)\n{\n    if (gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_PAUSE)\n        return TRUE;\n    if (!(gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_TRACK))\n        return TRUE;\n    return FALSE;\n}\n\nvoid FadeInBGM(u8 speed)\n{\n    m4aMPlayFadeIn(&gMPlayInfo_BGM, speed);\n}\n\nvoid FadeOutBGM(u8 speed)\n{\n    m4aMPlayFadeOut(&gMPlayInfo_BGM, speed);\n}\n\nbool8 IsBGMStopped(void)\n{\n    if (!(gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_TRACK))\n        return TRUE;\n    return FALSE;\n}\n\nvoid PlayCry_Normal(u16 species, s8 pan)\n{\n    m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 85);\n    PlayCryInternal(species, pan, CRY_VOLUME, CRY_PRIORITY_NORMAL, CRY_MODE_NORMAL);\n    gPokemonCryBGMDuckingCounter = 2;\n    RestoreBGMVolumeAfterPokemonCry();\n}\n\nvoid PlayCry_NormalNoDucking(u16 species, s8 pan, s8 volume, u8 priority)\n{\n    PlayCryInternal(species, pan, volume, priority, CRY_MODE_NORMAL);\n}\n\n// Assuming it's not CRY_MODE_DOUBLES, this is equivalent to PlayCry_Normal except it allows other modes.\nvoid PlayCry_ByMode(u16 species, s8 pan, u8 mode)\n{\n    if (mode == CRY_MODE_DOUBLES)\n    {\n        PlayCryInternal(species, pan, CRY_VOLUME, CRY_PRIORITY_NORMAL, mode);\n    }\n    else\n    {\n        m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 85);\n        PlayCryInternal(species, pan, CRY_VOLUME, CRY_PRIORITY_NORMAL, mode);\n        gPokemonCryBGMDuckingCounter = 2;\n        RestoreBGMVolumeAfterPokemonCry();\n    }\n}\n\n// Used when releasing multiple Pokémon at once in battle.\nvoid PlayCry_ReleaseDouble(u16 species, s8 pan, u8 mode)\n{\n    if (mode == CRY_MODE_DOUBLES)\n    {\n        PlayCryInternal(species, pan, CRY_VOLUME, CRY_PRIORITY_NORMAL, mode);\n    }\n    else\n    {\n        if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))\n            m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 85);\n        PlayCryInternal(species, pan, CRY_VOLUME, CRY_PRIORITY_NORMAL, mode);\n    }\n}\n\nvoid PlayCry_Script(u16 species, u8 mode)\n{\n    if (!QL_IS_PLAYBACK_STATE) // This check is exclusive to FR/LG\n    {\n        m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 85);\n        PlayCryInternal(species, 0, CRY_VOLUME, CRY_PRIORITY_NORMAL, mode);\n    }\n    gPokemonCryBGMDuckingCounter = 2;\n    RestoreBGMVolumeAfterPokemonCry();\n}\n\nvoid PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode)\n{\n    bool32 reverse;\n    u32 release;\n    u32 length;\n    u32 pitch;\n    u32 chorus;\n    u32 index;\n    u8 table;\n\n    species--;\n    \n    // Set default values\n    // May be overridden depending on mode.\n    length = 140;\n    reverse = FALSE;\n    release = 0;\n    pitch = 15360;\n    chorus = 0;\n\n    switch (mode)\n    {\n    case CRY_MODE_NORMAL:\n        break;\n    case CRY_MODE_DOUBLES:\n        length = 20;\n        release = 225;\n        break;\n    case CRY_MODE_ENCOUNTER:\n        release = 225;\n        pitch = 15600;\n        chorus = 20;\n        volume = 90;\n        break;\n    case CRY_MODE_HIGH_PITCH:\n        length = 50;\n        release = 200;\n        pitch = 15800;\n        chorus = 20;\n        volume = 90;\n        break;\n    case CRY_MODE_ECHO_START:\n        length = 25;\n        reverse = TRUE;\n        release = 100;\n        pitch = 15600;\n        chorus = 192;\n        volume = 90;\n        break;\n    case CRY_MODE_FAINT:\n        release = 200;\n        pitch = 14440;\n        break;\n    case CRY_MODE_ECHO_END:\n        release = 220;\n        pitch = 15555;\n        chorus = 192;\n        volume = 90; // FR/LG changed this from 70 to 90\n        break;\n    case CRY_MODE_ROAR_1:\n        length = 10;\n        release = 100;\n        pitch = 14848;\n        break;\n    case CRY_MODE_ROAR_2:\n        length = 60;\n        release = 225;\n        pitch = 15616;\n        break;\n    case CRY_MODE_GROWL_1:\n        length = 15;\n        reverse = TRUE;\n        release = 125;\n        pitch = 15200;\n        break;\n    case CRY_MODE_GROWL_2:\n        length = 100;\n        release = 225;\n        pitch = 15200;\n        break;\n    case CRY_MODE_WEAK_DOUBLES:\n        length = 20;\n        release = 225;\n        // fallthrough\n    case CRY_MODE_WEAK:\n        pitch = 15000;\n        break;\n    }\n\n    SetPokemonCryVolume(volume);\n    SetPokemonCryPanpot(pan);\n    SetPokemonCryPitch(pitch);\n    SetPokemonCryLength(length);\n    SetPokemonCryProgress(0);\n    SetPokemonCryRelease(release);\n    SetPokemonCryChorus(chorus);\n    SetPokemonCryPriority(priority);\n\n    // This is a fancy way to get a cry of a pokemon.\n    // It creates 4 sets of 128 mini cry tables.\n    // If you wish to expand pokemon, you need to\n    // append new cases to the switch.\n    species = SpeciesToCryId(species);\n    index = species % 128;\n    table = species / 128;\n\n    #define GET_CRY(speciesIndex, tableId, reversed) \\\n        ((reversed) ? &gCryTable_Reverse[(128 * (tableId)) + (speciesIndex)] : &gCryTable[(128 * (tableId)) + (speciesIndex)])\n\n    switch (table)\n    {\n    case 0:\n        gMPlay_PokemonCry = SetPokemonCryTone(GET_CRY(index, 0, reverse));\n        break;\n    case 1:\n        gMPlay_PokemonCry = SetPokemonCryTone(GET_CRY(index, 1, reverse));\n        break;\n    case 2:\n        gMPlay_PokemonCry = SetPokemonCryTone(GET_CRY(index, 2, reverse));\n        break;\n    case 3:\n        gMPlay_PokemonCry = SetPokemonCryTone(GET_CRY(index, 3, reverse));\n        break;\n    }\n\n    #undef GET_CRY\n}\n\nbool8 IsCryFinished(void)\n{\n    if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) == TRUE)\n    {\n        return FALSE;\n    }\n    else\n    {\n        ClearPokemonCrySongs();\n        return TRUE;\n    }\n}\n\nvoid StopCryAndClearCrySongs(void)\n{\n    m4aMPlayStop(gMPlay_PokemonCry);\n    ClearPokemonCrySongs();\n}\n\nvoid StopCry(void)\n{\n    m4aMPlayStop(gMPlay_PokemonCry);\n}\n\nbool8 IsCryPlayingOrClearCrySongs(void)\n{\n    if (IsPokemonCryPlaying(gMPlay_PokemonCry))\n    {\n        return TRUE;\n    }\n    else\n    {\n        ClearPokemonCrySongs();\n        return FALSE;\n    }\n}\n\nbool8 IsCryPlaying(void)\n{\n    if (IsPokemonCryPlaying(gMPlay_PokemonCry))\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void Task_DuckBGMForPokemonCry(u8 taskId)\n{\n    if (gPokemonCryBGMDuckingCounter)\n    {\n        gPokemonCryBGMDuckingCounter--;\n        return;\n    }\n\n    if (!IsPokemonCryPlaying(gMPlay_PokemonCry))\n    {\n        m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void RestoreBGMVolumeAfterPokemonCry(void)\n{\n    if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) != TRUE)\n        CreateTask(Task_DuckBGMForPokemonCry, 80);\n}\n\nvoid PlayBGM(u16 songNum)\n{\n    if (gDisableMusic)\n        songNum = 0;\n    if (songNum == MUS_NONE)\n        songNum = 0;\n    m4aSongNumStart(songNum);\n}\n\nvoid PlaySE(u16 songNum)\n{\n    if (gDisableMapMusicChangeOnMapLoad == 0 && gQuestLogState != QL_STATE_PLAYBACK)\n        m4aSongNumStart(songNum);\n}\n\nvoid PlaySE12WithPanning(u16 songNum, s8 pan)\n{\n    m4aSongNumStart(songNum);\n    m4aMPlayImmInit(&gMPlayInfo_SE1);\n    m4aMPlayImmInit(&gMPlayInfo_SE2);\n    m4aMPlayPanpotControl(&gMPlayInfo_SE1, TRACKS_ALL, pan);\n    m4aMPlayPanpotControl(&gMPlayInfo_SE2, TRACKS_ALL, pan);\n}\n\nvoid PlaySE1WithPanning(u16 songNum, s8 pan)\n{\n    m4aSongNumStart(songNum);\n    m4aMPlayImmInit(&gMPlayInfo_SE1);\n    m4aMPlayPanpotControl(&gMPlayInfo_SE1, TRACKS_ALL, pan);\n}\n\nvoid PlaySE2WithPanning(u16 songNum, s8 pan)\n{\n    m4aSongNumStart(songNum);\n    m4aMPlayImmInit(&gMPlayInfo_SE2);\n    m4aMPlayPanpotControl(&gMPlayInfo_SE2, TRACKS_ALL, pan);\n}\n\nvoid SE12PanpotControl(s8 pan)\n{\n    m4aMPlayPanpotControl(&gMPlayInfo_SE1, TRACKS_ALL, pan);\n    m4aMPlayPanpotControl(&gMPlayInfo_SE2, TRACKS_ALL, pan);\n}\n\nbool8 IsSEPlaying(void)\n{\n    if ((gMPlayInfo_SE1.status & MUSICPLAYER_STATUS_PAUSE) && (gMPlayInfo_SE2.status & MUSICPLAYER_STATUS_PAUSE))\n        return FALSE;\n    if (!(gMPlayInfo_SE1.status & MUSICPLAYER_STATUS_TRACK) && !(gMPlayInfo_SE2.status & MUSICPLAYER_STATUS_TRACK))\n        return FALSE;\n    return TRUE;\n}\n\nbool8 IsBGMPlaying(void)\n{\n    if (gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_PAUSE)\n        return FALSE;\n    if (!(gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_TRACK))\n        return FALSE;\n    return TRUE;\n}\n\nbool8 IsSpecialSEPlaying(void)\n{\n    if (gMPlayInfo_SE3.status & MUSICPLAYER_STATUS_PAUSE)\n        return FALSE;\n    if (!(gMPlayInfo_SE3.status & MUSICPLAYER_STATUS_TRACK))\n        return FALSE;\n    return TRUE;\n}\n\nvoid SetBGMVolume_SuppressHelpSystemReduction(u16 volume)\n{\n    gDisableHelpSystemVolumeReduce = TRUE;\n    m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, volume);\n}\n\nvoid BGMVolumeMax_EnableHelpSystemReduction(void)\n{\n    gDisableHelpSystemVolumeReduce = FALSE;\n    m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256);\n}\n"
  },
  {
    "path": "src/special_field_anim.c",
    "content": "#include \"global.h\"\n#include \"event_data.h\"\n#include \"task.h\"\n#include \"field_player_avatar.h\"\n#include \"fieldmap.h\"\n#include \"field_camera.h\"\n#include \"constants/metatile_labels.h\"\n\nstatic EWRAM_DATA u8 sEscalatorTaskId = 0;\n\nstatic void SetEscalatorMetatile(u8 taskId, const s16 *metatileIds, u16 metatileMasks);\nstatic void Task_DrawEscalator(u8 taskId);\nstatic void Task_DrawTeleporterHousing(u8 taskId);\nstatic void Task_DrawTeleporterCable(u8 taskId);\n\n#define ESCALATOR_STAGES     3\n#define LAST_ESCALATOR_STAGE (ESCALATOR_STAGES - 1)\n\nstatic const u16 sEscalatorMetatiles_BottomNextRail[ESCALATOR_STAGES] = \n{\n    METATILE_PokemonCenter_Escalator_BottomNextRail_Transition2, \n    METATILE_PokemonCenter_Escalator_BottomNextRail_Transition1, \n    METATILE_PokemonCenter_Escalator_BottomNextRail_Normal\n};\n\nstatic const u16 sEscalatorMetatiles_BottomRail[ESCALATOR_STAGES] = \n{\n    METATILE_PokemonCenter_Escalator_BottomRail_Transition2, \n    METATILE_PokemonCenter_Escalator_BottomRail_Transition1, \n    METATILE_PokemonCenter_Escalator_BottomRail_Normal\n};\n\nstatic const u16 sEscalatorMetatiles_BottomNext[ESCALATOR_STAGES] = \n{\n    METATILE_PokemonCenter_Escalator_BottomNext_Transition2, \n    METATILE_PokemonCenter_Escalator_BottomNext_Transition1, \n    METATILE_PokemonCenter_Escalator_BottomNext_Normal\n};\n\nstatic const u16 sEscalatorMetatiles_Bottom[ESCALATOR_STAGES] = \n{\n    METATILE_PokemonCenter_Escalator_Bottom_Transition2, \n    METATILE_PokemonCenter_Escalator_Bottom_Transition1, \n    METATILE_PokemonCenter_Escalator_Bottom_Normal\n};\n\nstatic const u16 sEscalatorMetatiles_TopNext[ESCALATOR_STAGES] = \n{\n    METATILE_PokemonCenter_Escalator_TopNext_Normal, \n    METATILE_PokemonCenter_Escalator_TopNext_Transition1, \n    METATILE_PokemonCenter_Escalator_TopNext_Transition2\n};\n\nstatic const u16 sEscalatorMetatiles_Top[ESCALATOR_STAGES] = \n{\n    METATILE_PokemonCenter_Escalator_Top_Normal, \n    METATILE_PokemonCenter_Escalator_Top_Transition1, \n    METATILE_PokemonCenter_Escalator_Top_Transition2\n};\n\nstatic const u16 sEscalatorMetatiles_TopNextRail[ESCALATOR_STAGES] = \n{\n    METATILE_PokemonCenter_Escalator_TopNextRail_Normal, \n    METATILE_PokemonCenter_Escalator_TopNextRail_Transition1, \n    METATILE_PokemonCenter_Escalator_TopNextRail_Transition2\n};\n\n#define tState            data[0]\n#define tTransitionStage  data[1]\n#define tGoingUp          data[2]\n#define tDrawingEscalator data[3]\n#define tPlayerX          data[4]\n#define tPlayerY          data[5]\n\nstatic void SetEscalatorMetatile(u8 taskId, const s16 *metatileIds, u16 metatileMasks)\n{\n    s16 x, y, transitionStage;\n    s16 i, j;\n    \n    x = gTasks[taskId].tPlayerX - 1;\n    y = gTasks[taskId].tPlayerY - 1;\n    transitionStage = gTasks[taskId].tTransitionStage;\n    \n    // Check all the escalator sections and only progress the selected one to the next stage\n    if (!gTasks[taskId].tGoingUp)\n    {\n        for (i = 0; i < 3; i++)\n        {\n            for (j = 0; j < 3; j++)\n            {\n                s32 id = MapGridGetMetatileIdAt(x + j, y + i);\n                \n                if (metatileIds[transitionStage] == (s16)id)\n                {\n                    if (transitionStage != LAST_ESCALATOR_STAGE)\n                        MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[transitionStage + 1]);\n                    else\n                        MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[0]);\n                }\n            }\n        }\n    }\n    else\n    {\n        for (i = 0; i < 3; i++)\n        {\n            for (j = 0; j < 3; j++)\n            {\n                s32 id = MapGridGetMetatileIdAt(x + j, y + i);\n\n                if (metatileIds[LAST_ESCALATOR_STAGE - transitionStage] == (s16)id)\n                {\n                    if (transitionStage != LAST_ESCALATOR_STAGE)\n                        MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[1 - transitionStage]);\n                    else\n                        MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[LAST_ESCALATOR_STAGE]);\n                }\n            }\n        }\n    }\n}\n\nstatic void Task_DrawEscalator(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u16 state;\n    \n    tDrawingEscalator = TRUE;\n\n    // Set tile for each section of the escalator in sequence for current transition stage\n    switch (tState)\n    {\n    case 0:\n        SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomNextRail, 0);\n        break;\n    case 1:\n        SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomRail, 0);\n        break;\n    case 2:\n        SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomNext, MAPGRID_COLLISION_MASK);\n        break;\n    case 3:\n        SetEscalatorMetatile(taskId, sEscalatorMetatiles_Bottom, 0);\n        break;\n    case 4:\n        SetEscalatorMetatile(taskId, sEscalatorMetatiles_TopNext, MAPGRID_COLLISION_MASK);\n        break;\n    case 5:\n        SetEscalatorMetatile(taskId, sEscalatorMetatiles_Top, 0);\n        break;\n    case 6:\n        SetEscalatorMetatile(taskId, sEscalatorMetatiles_TopNextRail, 0);\n    default:\n        break;\n    }\n    \n    tState = (tState + 1) & 7;\n    state = tState & 7;\n\n    // If all sections of the escalator have been set, draw map and progress to next stage\n    if (state == 0)\n    {\n        DrawWholeMapView();\n        tTransitionStage = (tTransitionStage + 1) % ESCALATOR_STAGES;\n        tDrawingEscalator = FALSE;\n    }\n}\n\nstatic u8 CreateEscalatorTask(bool16 goingUp)\n{\n    u8 taskId;\n    s16 *data;\n\n    taskId = CreateTask(Task_DrawEscalator, 0);\n    data = gTasks[taskId].data;\n    PlayerGetDestCoords(&tPlayerX, &tPlayerY);\n    tState = 0;\n    tTransitionStage = 0;\n    tGoingUp = goingUp;\n    Task_DrawEscalator(taskId);\n    return taskId;\n}\n\nvoid StartEscalator(bool8 goingUp)\n{\n    u8 taskId;\n    \n    taskId = CreateEscalatorTask(goingUp);\n    sEscalatorTaskId = taskId;\n}\n\nvoid StopEscalator(void)\n{\n    DestroyTask(sEscalatorTaskId);\n}\n\nbool8 IsEscalatorMoving(void)\n{    \n    if (gTasks[sEscalatorTaskId].tDrawingEscalator == FALSE)\n    {\n        if (gTasks[sEscalatorTaskId].tTransitionStage != LAST_ESCALATOR_STAGE)\n            return TRUE;\n        return FALSE;\n    }\n    else\n    {\n        return TRUE;\n    }\n}\n\n#undef tState\n#undef tTransitionStage\n#undef tGoingUp\n#undef tDrawingEscalator\n#undef tPlayerX\n#undef tPlayerY\n\n#define tTimer data[0]\n#define tState data[1]\n#define tX     data[2]\n#define tY     data[3]\n\nvoid AnimateTeleporterHousing(void)\n{\n    u8 taskId;\n    s16 *data;\n    \n    taskId = CreateTask(Task_DrawTeleporterHousing, 0);\n    gTasks[taskId].tTimer = 0;\n    gTasks[taskId].tState = 0;\n    data = gTasks[taskId].data;\n    PlayerGetDestCoords(&tX, &tY);\n\n    // Set the coords of whichever teleporter is being animated\n    // 0 for the right teleporter, 1 for the left teleporter\n    if (gSpecialVar_0x8004 == 0)\n    {\n        gTasks[taskId].tX += 6;\n        gTasks[taskId].tY -= 5;\n    }\n    else\n    {\n        gTasks[taskId].tX -= 1;\n        gTasks[taskId].tY -= 5;\n    }    \n}\n\nstatic void Task_DrawTeleporterHousing(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    \n    if (tTimer == 0)\n    {\n        // Alternate the teleporter light / brightness of the teleporter door\n        if ((tState & 1) == 0)\n        {\n            MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Yellow | MAPGRID_COLLISION_MASK);\n            MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door_HalfGlowing | MAPGRID_COLLISION_MASK);\n        }\n        else\n        {\n            MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Red | MAPGRID_COLLISION_MASK);\n            MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door_FullGlowing | MAPGRID_COLLISION_MASK);\n        }\n        CurrentMapDrawMetatileAt(tX, tY);\n        CurrentMapDrawMetatileAt(tX, tY + 2);\n    }\n    \n    tTimer++;\n    if (tTimer != 16)\n        return;\n    \n    tTimer = 0;\n    tState++;\n    if (tState != 13)\n        return;\n    \n    MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Green | MAPGRID_COLLISION_MASK);\n    MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door | MAPGRID_COLLISION_MASK);\n    CurrentMapDrawMetatileAt(tX, tY);\n    CurrentMapDrawMetatileAt(tX, tY + 2);\n    DestroyTask(taskId);\n}\n\nvoid AnimateTeleporterCable(void)\n{\n    u8 taskId;\n    s16 *data;\n    \n    taskId = CreateTask(Task_DrawTeleporterCable, 0);\n    gTasks[taskId].tTimer = 0;\n    gTasks[taskId].tState = 0;\n    data = gTasks[taskId].data;\n    PlayerGetDestCoords(&tX, &tY);\n    gTasks[taskId].tX += 4;\n    gTasks[taskId].tY -= 5;\n}\n\nstatic void Task_DrawTeleporterCable(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    \n    if (tTimer == 0)\n    {\n        if (tState != 0)\n        {\n            // Set default cable tiles to clear the ball\n            MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Cable_Top | MAPGRID_COLLISION_MASK);\n            MapGridSetMetatileIdAt(tX, tY + 1, METATILE_SeaCottage_Teleporter_Cable_Bottom | MAPGRID_COLLISION_MASK);\n            CurrentMapDrawMetatileAt(tX, tY);\n            CurrentMapDrawMetatileAt(tX, tY + 1);\n\n            // End after drawing 4 times (length of the cable)\n            if (tState == 4)\n            {\n                DestroyTask(taskId);\n                return;\n            }\n            \n            tX--;\n        }\n\n        // Draw the cable ball\n        MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_CableBall_Top | MAPGRID_COLLISION_MASK);\n        MapGridSetMetatileIdAt(tX, tY + 1, METATILE_SeaCottage_Teleporter_CableBall_Bottom | MAPGRID_COLLISION_MASK);\n        CurrentMapDrawMetatileAt(tX, tY);\n        CurrentMapDrawMetatileAt(tX, tY + 1);\n    }\n    \n    tTimer++;\n    if (tTimer == 4)\n    {\n        tTimer = 0;\n        tState++;\n    }\n}\n\n#undef tTimer\n#undef tState\n#undef tX\n#undef tY\n"
  },
  {
    "path": "src/sprite.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n\n#define MAX_SPRITE_COPY_REQUESTS 64\n\n#define OAM_MATRIX_COUNT 32\n\n#define sAnchorX data[6]\n#define sAnchorY data[7]\n\n#define SET_SPRITE_TILE_RANGE(index, start, count) \\\n{                                                  \\\n    sSpriteTileRanges[index * 2] = start;          \\\n    (sSpriteTileRanges + 1)[index * 2] = count;    \\\n}\n\n#define ALLOC_SPRITE_TILE(n)                              \\\n{                                                         \\\n    sSpriteTileAllocBitmap[(n) >> 3] |= (1 << ((n) & 7)); \\\n}\n\n#define FREE_SPRITE_TILE(n)                                \\\n{                                                          \\\n    sSpriteTileAllocBitmap[(n) >> 3] &= ~(1 << ((n) & 7)); \\\n}\n\n#define SPRITE_TILE_IS_ALLOCATED(n) ((sSpriteTileAllocBitmap[(n) >> 3] >> ((n) & 7)) & 1)\n\n\nstruct SpriteCopyRequest\n{\n    const u8 *src;\n    u8 *dest;\n    u16 size;\n};\n\nstruct OamDimensions\n{\n    s8 width;\n    s8 height;\n};\n\nstatic void SortSprites(u32 *spritePriorities, s32 n);\nstatic u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);\nstatic void ResetOamMatrices(void);\nstatic void ResetSprite(struct Sprite *sprite);\ns16 AllocSpriteTiles(u16 tileCount);\nstatic void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images);\nstatic void ResetAllSprites(void);\nstatic void BeginAnim(struct Sprite *sprite);\nstatic void ContinueAnim(struct Sprite *sprite);\nstatic void AnimCmd_frame(struct Sprite *sprite);\nstatic void AnimCmd_end(struct Sprite *sprite);\nstatic void AnimCmd_jump(struct Sprite *sprite);\nstatic void AnimCmd_loop(struct Sprite *sprite);\nstatic void BeginAnimLoop(struct Sprite *sprite);\nstatic void ContinueAnimLoop(struct Sprite *sprite);\nstatic void JumpToTopOfAnimLoop(struct Sprite *sprite);\nstatic void BeginAffineAnim(struct Sprite *sprite);\nstatic void ContinueAffineAnim(struct Sprite *sprite);\nstatic void AffineAnimDelay(u8 matrixNum, struct Sprite *sprite);\nstatic void AffineAnimCmd_loop(u8 matrixNum, struct Sprite *sprite);\nstatic void BeginAffineAnimLoop(u8 matrixNum, struct Sprite *sprite);\nstatic void ContinueAffineAnimLoop(u8 matrixNum, struct Sprite *sprite);\nstatic void JumpToTopOfAffineAnimLoop(u8 matrixNum, struct Sprite *sprite);\nstatic void AffineAnimCmd_jump(u8 matrixNum, struct Sprite *sprite);\nstatic void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite);\nstatic void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite);\nstatic void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix);\nstatic u8 GetSpriteMatrixNum(struct Sprite *sprite);\nstatic void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip);\nstatic void AffineAnimStateRestartAnim(u8 matrixNum);\nstatic void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum);\nstatic void AffineAnimStateReset(u8 matrixNum);\nstatic void ApplyAffineAnimFrameAbsolute(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd);\nstatic void DecrementAnimDelayCounter(struct Sprite *sprite);\nstatic bool8 DecrementAffineAnimDelayCounter(struct Sprite *sprite, u8 matrixNum);\nstatic void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd);\nstatic s16 ConvertScaleParam(s16 scale);\nstatic void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd);\nstatic void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd);\nstatic u8 IndexOfSpriteTileTag(u16 tag);\nstatic void AllocSpriteTileRange(u16 tag, u16 start, u16 count);\nstatic void DoLoadSpritePalette(const u16 *src, u16 paletteOffset);\nstatic void UpdateSpriteMatrixAnchorPos(struct Sprite* sprite, s32 a1, s32 a2);\n\ntypedef void (*AnimFunc)(struct Sprite *);\ntypedef void (*AnimCmdFunc)(struct Sprite *);\ntypedef void (*AffineAnimCmdFunc)(u8 matrixNum, struct Sprite *);\n\n#define DUMMY_OAM_DATA        \\\n{                             \\\n    160, /* Y (off-screen) */ \\\n    ST_OAM_AFFINE_OFF,        \\\n    ST_OAM_OBJ_NORMAL,        \\\n    FALSE,                    \\\n    ST_OAM_4BPP,              \\\n    ST_OAM_SQUARE,            \\\n    304, /* X */              \\\n    0,                        \\\n    ST_OAM_SIZE_0,            \\\n    0x000,                    \\\n    3, /* lowest priority */  \\\n    0x0,                      \\\n    0                         \\\n}\n\n#define ANIM_END        0xFFFF\n#define AFFINE_ANIM_END 0x7FFF\n\n// forward declarations\nconst union AnimCmd * const gDummySpriteAnimTable[];\nconst union AffineAnimCmd * const gDummySpriteAffineAnimTable[];\nconst struct SpriteTemplate gDummySpriteTemplate;\n\nstatic const u8 sCenterToCornerVecTable[3][4][2] =\n{\n    {   // square\n        {  -4,  -4 },\n        {  -8,  -8 },\n        { -16, -16 },\n        { -32, -32 },\n    },\n    {   // horizontal rectangle\n        {  -8,  -4 },\n        { -16,  -4 },\n        { -16,  -8 },\n        { -32, -16 },\n    },\n    {   // vertical rectangle\n        {  -4,  -8 },\n        {  -4, -16 },\n        {  -8, -16 },\n        { -16, -32 },\n    },\n};\n\nstatic const struct Sprite sDummySprite =\n{\n    .oam = DUMMY_OAM_DATA,\n    .anims = gDummySpriteAnimTable,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .template = &gDummySpriteTemplate,\n    .callback = SpriteCallbackDummy,\n    .x = DISPLAY_WIDTH + 64,\n    .y = DISPLAY_HEIGHT,\n    .subpriority = 0xFF\n};\n\nconst struct OamData gDummyOamData = DUMMY_OAM_DATA;\n\nstatic const union AnimCmd sDummyAnim = { ANIM_END };\n\nconst union AnimCmd * const gDummySpriteAnimTable[] = { &sDummyAnim };\n\nstatic const union AffineAnimCmd sDummyAffineAnim = { AFFINE_ANIM_END };\n\nconst union AffineAnimCmd * const gDummySpriteAffineAnimTable[] = { &sDummyAffineAnim };\n\nconst struct SpriteTemplate gDummySpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = TAG_NONE,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const AnimFunc sAnimFuncs[] =\n{\n    ContinueAnim,\n    BeginAnim,\n};\n\nstatic const AnimFunc sAffineAnimFuncs[] =\n{\n    ContinueAffineAnim,\n    BeginAffineAnim,\n};\n\nstatic const AnimCmdFunc sAnimCmdFuncs[] =\n{\n    AnimCmd_loop,\n    AnimCmd_jump,\n    AnimCmd_end,\n    AnimCmd_frame,\n};\n\nstatic const AffineAnimCmdFunc sAffineAnimCmdFuncs[] =\n{\n    AffineAnimCmd_loop,\n    AffineAnimCmd_jump,\n    AffineAnimCmd_end,\n    AffineAnimCmd_frame,\n};\n\nstatic const s32 sOamDimensionsCopy[3][4][2] =\n{\n    [ST_OAM_SQUARE] = {\n        [ST_OAM_SIZE_0] = { 8,  8}, // SPRITE_SIZE_8x8\n        [ST_OAM_SIZE_1] = {16, 16}, // SPRITE_SIZE_16x16\n        [ST_OAM_SIZE_2] = {32, 32}, // SPRITE_SIZE_32x32\n        [ST_OAM_SIZE_3] = {64, 64}, // SPRITE_SIZE_64x64\n    },\n    [ST_OAM_H_RECTANGLE] = {\n        [ST_OAM_SIZE_0] = {16,  8}, // SPRITE_SIZE_16x8\n        [ST_OAM_SIZE_1] = {32,  8}, // SPRITE_SIZE_32x8\n        [ST_OAM_SIZE_2] = {32, 16}, // SPRITE_SIZE_32x16\n        [ST_OAM_SIZE_3] = {64, 32}, // SPRITE_SIZE_64x32\n    },\n    [ST_OAM_V_RECTANGLE] = {\n        [ST_OAM_SIZE_0] = { 8, 16}, // SPRITE_SIZE_8x16\n        [ST_OAM_SIZE_1] = { 8, 32}, // SPRITE_SIZE_8x32\n        [ST_OAM_SIZE_2] = {16, 32}, // SPRITE_SIZE_16x32\n        [ST_OAM_SIZE_3] = {32, 64}, // SPRITE_SIZE_32x64\n    },\n};\n\nstatic const struct OamDimensions sOamDimensions[3][4] =\n{\n    [ST_OAM_SQUARE] = {\n        [ST_OAM_SIZE_0] = { 8,  8}, // SPRITE_SIZE_8x8\n        [ST_OAM_SIZE_1] = {16, 16}, // SPRITE_SIZE_16x16\n        [ST_OAM_SIZE_2] = {32, 32}, // SPRITE_SIZE_32x32\n        [ST_OAM_SIZE_3] = {64, 64}, // SPRITE_SIZE_64x64\n    },\n    [ST_OAM_H_RECTANGLE] = {\n        [ST_OAM_SIZE_0] = {16,  8}, // SPRITE_SIZE_16x8\n        [ST_OAM_SIZE_1] = {32,  8}, // SPRITE_SIZE_32x8\n        [ST_OAM_SIZE_2] = {32, 16}, // SPRITE_SIZE_32x16\n        [ST_OAM_SIZE_3] = {64, 32}, // SPRITE_SIZE_64x32\n    },\n    [ST_OAM_V_RECTANGLE] = {\n        [ST_OAM_SIZE_0] = { 8, 16}, // SPRITE_SIZE_8x16\n        [ST_OAM_SIZE_1] = { 8, 32}, // SPRITE_SIZE_8x32\n        [ST_OAM_SIZE_2] = {16, 32}, // SPRITE_SIZE_16x32\n        [ST_OAM_SIZE_3] = {32, 64}, // SPRITE_SIZE_32x64\n    },\n};\n\nstatic u16 sSpriteTileRangeTags[MAX_SPRITES];\nstatic u16 sSpriteTileRanges[MAX_SPRITES * 2];\nstatic struct AffineAnimState sAffineAnimStates[OAM_MATRIX_COUNT];\nstatic u16 sSpritePaletteTags[16];\n\nu32 gOamMatrixAllocBitmap;\nu8 gReservedSpritePaletteCount;\n\nEWRAM_DATA struct Sprite gSprites[MAX_SPRITES + 1] = {0};\nEWRAM_DATA u8 sSpriteOrder[MAX_SPRITES] = {0};\nEWRAM_DATA bool8 sShouldProcessSpriteCopyRequests = 0;\nEWRAM_DATA u8 sSpriteCopyRequestCount = 0;\nEWRAM_DATA struct SpriteCopyRequest sSpriteCopyRequests[MAX_SPRITES] = {0};\nEWRAM_DATA u8 gOamLimit = 0;\nstatic EWRAM_DATA u8 gOamDummyIndex = 0;\nEWRAM_DATA u16 gReservedSpriteTileCount = 0;\nEWRAM_DATA u8 sSpriteTileAllocBitmap[128] = {0};\nEWRAM_DATA s16 gSpriteCoordOffsetX = 0;\nEWRAM_DATA s16 gSpriteCoordOffsetY = 0;\nEWRAM_DATA struct OamMatrix gOamMatrices[OAM_MATRIX_COUNT] = {0};\nEWRAM_DATA bool8 gAffineAnimsDisabled = 0;\n\nvoid ResetSpriteData(void)\n{\n    ResetOamRange(0, 128);\n    gOamDummyIndex = 0;\n    ResetAllSprites();\n    ClearSpriteCopyRequests();\n    ResetAffineAnimData();\n    FreeSpriteTileRanges();\n    gOamLimit = 64;\n    gReservedSpriteTileCount = 0;\n    AllocSpriteTiles(0);\n    gSpriteCoordOffsetX = 0;\n    gSpriteCoordOffsetY = 0;\n}\n\nvoid AnimateSprites(void)\n{\n    u32 i;\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        struct Sprite *sprite = &gSprites[i];\n\n        if (sprite->inUse)\n        {\n            sprite->callback(sprite);\n\n            if (sprite->inUse)\n                AnimateSprite(sprite);\n        }\n    }\n}\n\nvoid BuildOamBuffer(void)\n{\n    bool32 oamLoadDisabled;\n    u32 i, stride;\n    u32 oamIndex;\n\n    // All attributes which affect sorting packed into a single u32:\n    // { priority:2, subpriority:8, y:9, :5, index:8 }.\n    // Index has its own byte even though it only needs 6 bits so that\n    // we can load it with a ldrb instead of having to mask out the\n    // bottom 6 bits.\n    u32 spritePriorities[MAX_SPRITES];\n    s32 toSort = 0;\n    u32 skippedSprites[MAX_SPRITES];\n    u32 skippedSpritesN = 0;\n    u32 matrices = 0;\n\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        // Reuse existing sSpriteOrder because we expect the order to be\n        // relatively stable between frames.\n        u32 index = sSpriteOrder[i];\n        struct Sprite *sprite = &gSprites[index];\n        s32 y;\n        if (!sprite->inUse || sprite->invisible)\n        {\n            skippedSprites[skippedSpritesN++] = index;\n            continue;\n        }\n\n        if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)\n            matrices |= 1 << sprite->oam.matrixNum;\n\n        if (sprite->coordOffsetEnabled)\n        {\n            sprite->oam.x = sprite->x + sprite->x2 + sprite->centerToCornerVecX + gSpriteCoordOffsetX;\n            sprite->oam.y = sprite->y + sprite->y2 + sprite->centerToCornerVecY + gSpriteCoordOffsetY;\n        }\n        else\n        {\n            sprite->oam.x = sprite->x + sprite->x2 + sprite->centerToCornerVecX;\n            sprite->oam.y = sprite->y + sprite->y2 + sprite->centerToCornerVecY;\n        }\n\n        y = sprite->oam.y;\n        if (y >= DISPLAY_HEIGHT)\n        {\n            y -= 256;\n        }\n        else if (sprite->oam.affineMode == ST_OAM_AFFINE_DOUBLE\n              && sprite->oam.size == ST_OAM_SIZE_3)\n        {\n            u32 shape = sprite->oam.shape;\n            if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE)\n            {\n                if (y > 128)\n                    y -= 256;\n            }\n        }\n\n        // y in [-128...159], so (159 - y) in [0..287].\n        spritePriorities[toSort++]\n            = (sprite->oam.priority << 30)\n            | (sprite->subpriority << 22)\n            | (((159 - y) & 0x1FF) << 13)\n            | (index << 0);\n    }\n\n    SortSprites(spritePriorities, toSort);\n\n    for (i = 0; i < toSort; i++)\n        sSpriteOrder[i] = spritePriorities[i] & 0xFF;\n    for (i = 0; i < skippedSpritesN; i++)\n        sSpriteOrder[toSort + i] = skippedSprites[i];\n\n    oamLoadDisabled = gMain.oamLoadDisabled;\n    gMain.oamLoadDisabled = TRUE;\n\n    for (i = 0, oamIndex = 0; i < toSort; i++)\n    {\n        if (AddSpriteToOamBuffer(&gSprites[spritePriorities[i] & 0xFF], &oamIndex))\n            break;\n    }\n\n    for (i = oamIndex; i < gOamDummyIndex; i++)\n        gMain.oamBuffer[i] = gDummyOamData;\n    gOamDummyIndex = oamIndex;\n\n    for (i = 0; matrices != 0; i++, matrices >>= 1)\n    {\n        if (matrices & 1)\n        {\n            u32 base = 4 * i;\n            gMain.oamBuffer[base + 0].affineParam = gOamMatrices[i].a;\n            gMain.oamBuffer[base + 1].affineParam = gOamMatrices[i].b;\n            gMain.oamBuffer[base + 2].affineParam = gOamMatrices[i].c;\n            gMain.oamBuffer[base + 3].affineParam = gOamMatrices[i].d;\n        }\n    }\n\n    gMain.oamLoadDisabled = oamLoadDisabled;\n    sShouldProcessSpriteCopyRequests = TRUE;\n}\n\nvoid CopyMatricesToOamBuffer(void)\n{\n    u32 i;\n    for (i = 0; i < OAM_MATRIX_COUNT; i++)\n    {\n        u32 base = 4 * i;\n        gMain.oamBuffer[base + 0].affineParam = gOamMatrices[i].a;\n        gMain.oamBuffer[base + 1].affineParam = gOamMatrices[i].b;\n        gMain.oamBuffer[base + 2].affineParam = gOamMatrices[i].c;\n        gMain.oamBuffer[base + 3].affineParam = gOamMatrices[i].d;\n    }\n}\n\nstatic inline void InsertionSort(u32 *spritePriorities, s32 n)\n{\n    s32 i = 1;\n    while (i < n)\n    {\n        u32 x = spritePriorities[i];\n        s32 j = i - 1;\n        while (j >= 0 && spritePriorities[j] > x)\n        {\n            spritePriorities[j + 1] = spritePriorities[j];\n            j--;\n        }\n        spritePriorities[j + 1] = x;\n        i++;\n    }\n}\n\nstatic void SortSprites(u32 *spritePriorities, s32 n)\n{\n    InsertionSort(spritePriorities, n);\n}\n\nu8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority)\n{\n    u32 i;\n\n    for (i = 0; i < MAX_SPRITES; i++)\n        if (!gSprites[i].inUse)\n            return CreateSpriteAt(i, template, x, y, subpriority);\n\n    return MAX_SPRITES;\n}\n\nu8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority)\n{\n    s32 i;\n\n    for (i = MAX_SPRITES - 1; i > -1; i--)\n        if (!gSprites[i].inUse)\n            return CreateSpriteAt(i, template, x, y, subpriority);\n\n    return MAX_SPRITES;\n}\n\nu8 CreateInvisibleSprite(void (*callback)(struct Sprite *))\n{\n    u8 index = CreateSprite(&gDummySpriteTemplate, 0, 0, 31);\n\n    if (index == MAX_SPRITES)\n    {\n        return MAX_SPRITES;\n    }\n    else\n    {\n        gSprites[index].invisible = TRUE;\n        gSprites[index].callback = callback;\n        return index;\n    }\n}\n\nu8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority)\n{\n    struct Sprite *sprite = &gSprites[index];\n\n    ResetSprite(sprite);\n\n    sprite->inUse = TRUE;\n    sprite->animBeginning = TRUE;\n    sprite->affineAnimBeginning = TRUE;\n    sprite->usingSheet = TRUE;\n\n    sprite->subpriority = subpriority;\n    sprite->oam = *template->oam;\n    sprite->anims = template->anims;\n    sprite->affineAnims = template->affineAnims;\n    sprite->template = template;\n    sprite->callback = template->callback;\n    sprite->x = x;\n    sprite->y = y;\n\n    CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);\n\n    if (template->tileTag == TAG_NONE)\n    {\n        s16 tileNum;\n        sprite->images = template->images;\n        tileNum = AllocSpriteTiles((u8)(sprite->images->size / TILE_SIZE_4BPP));\n        if (tileNum == -1)\n        {\n            ResetSprite(sprite);\n            return MAX_SPRITES;\n        }\n        sprite->oam.tileNum = tileNum;\n        sprite->usingSheet = FALSE;\n        sprite->sheetTileStart = 0;\n    }\n    else\n    {\n        sprite->sheetTileStart = GetSpriteTileStartByTag(template->tileTag);\n        SetSpriteSheetFrameTileNum(sprite);\n    }\n\n    if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)\n        InitSpriteAffineAnim(sprite);\n\n    if (template->paletteTag != TAG_NONE)\n        sprite->oam.paletteNum = IndexOfSpritePaletteTag(template->paletteTag);\n\n    return index;\n}\n\nu8 CreateSpriteAndAnimate(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority)\n{\n    u32 i;\n\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        struct Sprite *sprite = &gSprites[i];\n\n        if (!gSprites[i].inUse)\n        {\n            u8 index = CreateSpriteAt(i, template, x, y, subpriority);\n\n            if (index == MAX_SPRITES)\n                return MAX_SPRITES;\n\n            gSprites[i].callback(sprite);\n\n            if (gSprites[i].inUse)\n                AnimateSprite(sprite);\n\n            return index;\n        }\n    }\n\n    return MAX_SPRITES;\n}\n\nvoid DestroySprite(struct Sprite *sprite)\n{\n    if (sprite->inUse)\n    {\n        if (!sprite->usingSheet)\n        {\n            u32 i;\n            u16 tileEnd = (sprite->images->size / TILE_SIZE_4BPP) + sprite->oam.tileNum;\n            for (i = sprite->oam.tileNum; i < tileEnd; i++)\n                FREE_SPRITE_TILE(i);\n        }\n        ResetSprite(sprite);\n    }\n}\n\nvoid ResetOamRange(u8 a, u8 b)\n{\n    u32 i;\n\n    for (i = a; i < b; i++)\n    {\n        struct OamData *oamBuffer = gMain.oamBuffer;\n        oamBuffer[i] = *(struct OamData *)&gDummyOamData;\n    }\n}\n\nvoid LoadOam(void)\n{\n    if (!gMain.oamLoadDisabled)\n        CpuCopy32(gMain.oamBuffer, (void *)OAM, sizeof(gMain.oamBuffer));\n}\n\nvoid ClearSpriteCopyRequests(void)\n{\n    u32 i;\n\n    sShouldProcessSpriteCopyRequests = FALSE;\n    sSpriteCopyRequestCount = 0;\n\n    for (i = 0; i < MAX_SPRITE_COPY_REQUESTS; i++)\n    {\n        sSpriteCopyRequests[i].src = 0;\n        sSpriteCopyRequests[i].dest = 0;\n        sSpriteCopyRequests[i].size = 0;\n    }\n}\n\nvoid ResetOamMatrices(void)\n{\n    u32 i;\n    for (i = 0; i < OAM_MATRIX_COUNT; i++)\n    {\n        // set to identity matrix\n        gOamMatrices[i].a = 0x0100;\n        gOamMatrices[i].b = 0x0000;\n        gOamMatrices[i].c = 0x0000;\n        gOamMatrices[i].d = 0x0100;\n    }\n}\n\nvoid SetOamMatrix(u8 matrixNum, u16 a, u16 b, u16 c, u16 d)\n{\n    gOamMatrices[matrixNum].a = a;\n    gOamMatrices[matrixNum].b = b;\n    gOamMatrices[matrixNum].c = c;\n    gOamMatrices[matrixNum].d = d;\n}\n\nvoid ResetSprite(struct Sprite *sprite)\n{\n    *sprite = sDummySprite;\n}\n\nvoid CalcCenterToCornerVec(struct Sprite *sprite, u8 shape, u8 size, u8 affineMode)\n{\n    u8 x = sCenterToCornerVecTable[shape][size][0];\n    u8 y = sCenterToCornerVecTable[shape][size][1];\n\n    if (affineMode & ST_OAM_AFFINE_DOUBLE_MASK)\n    {\n        x *= 2;\n        y *= 2;\n    }\n\n    sprite->centerToCornerVecX = x;\n    sprite->centerToCornerVecY = y;\n}\n\ns16 AllocSpriteTiles(u16 tileCount)\n{\n    u32 i;\n    s16 start;\n    u16 numTilesFound;\n\n    if (tileCount == 0)\n    {\n        // Free all unreserved tiles if the tile count is 0.\n        for (i = gReservedSpriteTileCount; i < TOTAL_OBJ_TILE_COUNT; i++)\n            FREE_SPRITE_TILE(i);\n\n        return 0;\n    }\n\n    i = gReservedSpriteTileCount;\n\n    for (;;)\n    {\n        while (SPRITE_TILE_IS_ALLOCATED(i))\n        {\n            i++;\n\n            if (i == TOTAL_OBJ_TILE_COUNT)\n                return -1;\n        }\n\n        start = i;\n        numTilesFound = 1;\n\n        while (numTilesFound != tileCount)\n        {\n            i++;\n\n            if (i == TOTAL_OBJ_TILE_COUNT)\n                return -1;\n\n            if (!SPRITE_TILE_IS_ALLOCATED(i))\n                numTilesFound++;\n            else\n                break;\n        }\n\n        if (numTilesFound == tileCount)\n            break;\n    }\n\n    for (i = start; i < tileCount + start; i++)\n        ALLOC_SPRITE_TILE(i);\n\n    return start;\n}\n\nu8 SpriteTileAllocBitmapOp(u16 bit, u8 op)\n{\n    u8 index = bit / 8;\n    u8 shift = bit % 8;\n    u8 val = bit % 8;\n    u8 retVal = 0;\n\n    if (op == 0) // clear\n    {\n        val = ~(1 << val);\n        sSpriteTileAllocBitmap[index] &= val;\n    }\n    else if (op == 1) // set\n    {\n        val = (1 << val);\n        sSpriteTileAllocBitmap[index] |= val;\n    }\n    else // check\n    {\n        retVal = 1 << shift;\n        retVal &= sSpriteTileAllocBitmap[index];\n    }\n\n    return retVal;\n}\n\nvoid FreeSpriteTilesIfNotUsingSheet(struct Sprite *sprite)\n{\n    if (!sprite->usingSheet)\n    {\n        int i;\n        int end = (sprite->images[0].size / TILE_SIZE_4BPP) + sprite->oam.tileNum;\n\n        for (i = sprite->oam.tileNum; i < end; i++)\n            FREE_SPRITE_TILE(i);\n    }\n}\n\nvoid SpriteCallbackDummy(struct Sprite *sprite)\n{\n}\n\nvoid ProcessSpriteCopyRequests(void)\n{\n    if (sShouldProcessSpriteCopyRequests)\n    {\n        u8 i = 0;\n\n        while (sSpriteCopyRequestCount > 0)\n        {\n            CpuCopy16(sSpriteCopyRequests[i].src, sSpriteCopyRequests[i].dest, sSpriteCopyRequests[i].size);\n            sSpriteCopyRequestCount--;\n            i++;\n        }\n\n        sShouldProcessSpriteCopyRequests = FALSE;\n    }\n}\n\nvoid RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images)\n{\n    if (sSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS)\n    {\n        sSpriteCopyRequests[sSpriteCopyRequestCount].src = images[index].data;\n        sSpriteCopyRequests[sSpriteCopyRequestCount].dest = (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileNum;\n        sSpriteCopyRequests[sSpriteCopyRequestCount].size = images[index].size;\n        sSpriteCopyRequestCount++;\n    }\n}\n\nvoid RequestSpriteCopy(const u8 *src, u8 *dest, u16 size)\n{\n    if (sSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS)\n    {\n        sSpriteCopyRequests[sSpriteCopyRequestCount].src = src;\n        sSpriteCopyRequests[sSpriteCopyRequestCount].dest = dest;\n        sSpriteCopyRequests[sSpriteCopyRequestCount].size = size;\n        sSpriteCopyRequestCount++;\n    }\n}\n\nvoid CopyFromSprites(u8 *dest)\n{\n    u32 i;\n    u8 *src = (u8 *)gSprites;\n    for (i = 0; i < sizeof(struct Sprite) * MAX_SPRITES; i++)\n    {\n        *dest = *src;\n        dest++;\n        src++;\n    }\n}\n\nvoid CopyToSprites(u8 *src)\n{\n    u32 i;\n    u8 *dest = (u8 *)gSprites;\n    for (i = 0; i < sizeof(struct Sprite) * MAX_SPRITES; i++)\n    {\n        *dest = *src;\n        src++;\n        dest++;\n    }\n}\n\nvoid ResetAllSprites(void)\n{\n    u32 i;\n\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        ResetSprite(&gSprites[i]);\n        sSpriteOrder[i] = i;\n    }\n\n    ResetSprite(&gSprites[i]);\n}\n\nvoid FreeSpriteTiles(struct Sprite *sprite)\n{\n    if (sprite->template->tileTag != TAG_NONE)\n        FreeSpriteTilesByTag(sprite->template->tileTag);\n}\n\nvoid FreeSpritePalette(struct Sprite *sprite)\n{\n    FreeSpritePaletteByTag(sprite->template->paletteTag);\n}\n\nvoid FreeSpriteOamMatrix(struct Sprite *sprite)\n{\n    if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)\n    {\n        FreeOamMatrix(sprite->oam.matrixNum);\n        sprite->oam.affineMode = ST_OAM_AFFINE_OFF;\n    }\n}\n\nvoid DestroySpriteAndFreeResources(struct Sprite *sprite)\n{\n    FreeSpriteTiles(sprite);\n    FreeSpritePalette(sprite);\n    FreeSpriteOamMatrix(sprite);\n    DestroySprite(sprite);\n}\n\nvoid AnimateSprite(struct Sprite *sprite)\n{\n    sAnimFuncs[sprite->animBeginning](sprite);\n\n    if (!gAffineAnimsDisabled)\n        sAffineAnimFuncs[sprite->affineAnimBeginning](sprite);\n}\n\nvoid BeginAnim(struct Sprite *sprite)\n{\n    s16 imageValue;\n    u8 duration;\n    u8 hFlip;\n    u8 vFlip;\n\n    sprite->animCmdIndex = 0;\n    sprite->animEnded = FALSE;\n    sprite->animLoopCounter = 0;\n    imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue;\n\n    if (imageValue != -1)\n    {\n        sprite->animBeginning = FALSE;\n        duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration;\n        hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip;\n        vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip;\n\n        if (duration)\n            duration--;\n\n        sprite->animDelayCounter = duration;\n\n        if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK))\n            SetSpriteOamFlipBits(sprite, hFlip, vFlip);\n\n        if (sprite->usingSheet)\n            sprite->oam.tileNum = sprite->sheetTileStart + imageValue;\n        else\n            RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images);\n    }\n}\n\nvoid ContinueAnim(struct Sprite *sprite)\n{\n    if (sprite->animDelayCounter)\n    {\n        u8 hFlip;\n        u8 vFlip;\n        DecrementAnimDelayCounter(sprite);\n        hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip;\n        vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip;\n        if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK))\n            SetSpriteOamFlipBits(sprite, hFlip, vFlip);\n    }\n    else if (!sprite->animPaused)\n    {\n        s16 type;\n        s16 funcIndex;\n        sprite->animCmdIndex++;\n        type = sprite->anims[sprite->animNum][sprite->animCmdIndex].type;\n        funcIndex = 3;\n        if (type < 0)\n            funcIndex = type + 3;\n        sAnimCmdFuncs[funcIndex](sprite);\n    }\n}\n\nvoid AnimCmd_frame(struct Sprite *sprite)\n{\n    s16 imageValue;\n    u8 duration;\n    u8 hFlip;\n    u8 vFlip;\n\n    imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue;\n    duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration;\n    hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip;\n    vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip;\n\n    if (duration)\n        duration--;\n\n    sprite->animDelayCounter = duration;\n\n    if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK))\n        SetSpriteOamFlipBits(sprite, hFlip, vFlip);\n\n    if (sprite->usingSheet)\n        sprite->oam.tileNum = sprite->sheetTileStart + imageValue;\n    else\n        RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images);\n}\n\nvoid AnimCmd_end(struct Sprite *sprite)\n{\n    sprite->animCmdIndex--;\n    sprite->animEnded = TRUE;\n}\n\nvoid AnimCmd_jump(struct Sprite *sprite)\n{\n    s16 imageValue;\n    u8 duration;\n    u8 hFlip;\n    u8 vFlip;\n\n    sprite->animCmdIndex = sprite->anims[sprite->animNum][sprite->animCmdIndex].jump.target;\n\n    imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue;\n    duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration;\n    hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip;\n    vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip;\n\n    if (duration)\n        duration--;\n\n    sprite->animDelayCounter = duration;\n\n    if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK))\n        SetSpriteOamFlipBits(sprite, hFlip, vFlip);\n\n    if (sprite->usingSheet)\n        sprite->oam.tileNum = sprite->sheetTileStart + imageValue;\n    else\n        RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images);\n}\n\nvoid AnimCmd_loop(struct Sprite *sprite)\n{\n    if (sprite->animLoopCounter)\n        ContinueAnimLoop(sprite);\n    else\n        BeginAnimLoop(sprite);\n}\n\nvoid BeginAnimLoop(struct Sprite *sprite)\n{\n    sprite->animLoopCounter = sprite->anims[sprite->animNum][sprite->animCmdIndex].loop.count;\n    JumpToTopOfAnimLoop(sprite);\n    ContinueAnim(sprite);\n}\n\nvoid ContinueAnimLoop(struct Sprite *sprite)\n{\n    sprite->animLoopCounter--;\n    JumpToTopOfAnimLoop(sprite);\n    ContinueAnim(sprite);\n}\n\nvoid JumpToTopOfAnimLoop(struct Sprite *sprite)\n{\n    if (sprite->animLoopCounter)\n    {\n        sprite->animCmdIndex--;\n\n        while (sprite->anims[sprite->animNum][sprite->animCmdIndex - 1].type != -3)\n        {\n            if (sprite->animCmdIndex == 0)\n                break;\n            sprite->animCmdIndex--;\n        }\n\n        sprite->animCmdIndex--;\n    }\n}\n\nvoid BeginAffineAnim(struct Sprite *sprite)\n{\n    if ((sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) && sprite->affineAnims[0][0].type != 32767)\n    {\n        struct AffineAnimFrameCmd frameCmd;\n        u8 matrixNum = GetSpriteMatrixNum(sprite);\n        AffineAnimStateRestartAnim(matrixNum);\n        GetAffineAnimFrame(matrixNum, sprite, &frameCmd);\n        sprite->affineAnimBeginning = FALSE;\n        sprite->affineAnimEnded = FALSE;\n        ApplyAffineAnimFrame(matrixNum, &frameCmd);\n        sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration;\n        if (sprite->anchored)\n            UpdateSpriteMatrixAnchorPos(sprite, sprite->sAnchorX, sprite->sAnchorY);\n    }\n}\n\nvoid ContinueAffineAnim(struct Sprite *sprite)\n{\n    if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)\n    {\n        u8 matrixNum = GetSpriteMatrixNum(sprite);\n\n        if (sAffineAnimStates[matrixNum].delayCounter)\n            AffineAnimDelay(matrixNum, sprite);\n        else if (sprite->affineAnimPaused)\n            return;\n        else\n        {\n            s16 type;\n            s16 funcIndex;\n            sAffineAnimStates[matrixNum].animCmdIndex++;\n            type = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].type;\n            funcIndex = 3;\n            if (type >= 32765)\n                funcIndex = type - 32765;\n            sAffineAnimCmdFuncs[funcIndex](matrixNum, sprite);\n        }\n        if (sprite->anchored)\n            UpdateSpriteMatrixAnchorPos(sprite, sprite->sAnchorX, sprite->sAnchorY);\n    }\n}\n\nvoid AffineAnimDelay(u8 matrixNum, struct Sprite *sprite)\n{\n    if (!DecrementAffineAnimDelayCounter(sprite, matrixNum))\n    {\n        struct AffineAnimFrameCmd frameCmd;\n        GetAffineAnimFrame(matrixNum, sprite, &frameCmd);\n        ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &frameCmd);\n    }\n}\n\nvoid AffineAnimCmd_loop(u8 matrixNum, struct Sprite *sprite)\n{\n    if (sAffineAnimStates[matrixNum].loopCounter)\n        ContinueAffineAnimLoop(matrixNum, sprite);\n    else\n        BeginAffineAnimLoop(matrixNum, sprite);\n}\n\nvoid BeginAffineAnimLoop(u8 matrixNum, struct Sprite *sprite)\n{\n    sAffineAnimStates[matrixNum].loopCounter = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].loop.count;\n    JumpToTopOfAffineAnimLoop(matrixNum, sprite);\n    ContinueAffineAnim(sprite);\n}\n\nvoid ContinueAffineAnimLoop(u8 matrixNum, struct Sprite *sprite)\n{\n    sAffineAnimStates[matrixNum].loopCounter--;\n    JumpToTopOfAffineAnimLoop(matrixNum, sprite);\n    ContinueAffineAnim(sprite);\n}\n\nvoid JumpToTopOfAffineAnimLoop(u8 matrixNum, struct Sprite *sprite)\n{\n    if (sAffineAnimStates[matrixNum].loopCounter)\n    {\n        sAffineAnimStates[matrixNum].animCmdIndex--;\n\n        while (sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex - 1].type != 32765)\n        {\n            if (sAffineAnimStates[matrixNum].animCmdIndex == 0)\n                break;\n            sAffineAnimStates[matrixNum].animCmdIndex--;\n        }\n\n        sAffineAnimStates[matrixNum].animCmdIndex--;\n    }\n}\n\nvoid AffineAnimCmd_jump(u8 matrixNum, struct Sprite *sprite)\n{\n    struct AffineAnimFrameCmd frameCmd;\n    sAffineAnimStates[matrixNum].animCmdIndex = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].jump.target;\n    GetAffineAnimFrame(matrixNum, sprite, &frameCmd);\n    ApplyAffineAnimFrame(matrixNum, &frameCmd);\n    sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration;\n}\n\nvoid AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite)\n{\n    struct AffineAnimFrameCmd dummyFrameCmd = {0};\n    sprite->affineAnimEnded = TRUE;\n    sAffineAnimStates[matrixNum].animCmdIndex--;\n    ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &dummyFrameCmd);\n}\n\nvoid AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite)\n{\n    struct AffineAnimFrameCmd frameCmd;\n    GetAffineAnimFrame(matrixNum, sprite, &frameCmd);\n    ApplyAffineAnimFrame(matrixNum, &frameCmd);\n    sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration;\n}\n\nvoid CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix)\n{\n    gOamMatrices[destMatrixIndex].a = srcMatrix->a;\n    gOamMatrices[destMatrixIndex].b = srcMatrix->b;\n    gOamMatrices[destMatrixIndex].c = srcMatrix->c;\n    gOamMatrices[destMatrixIndex].d = srcMatrix->d;\n}\n\nu8 GetSpriteMatrixNum(struct Sprite *sprite)\n{\n    u8 matrixNum = 0;\n    if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)\n        matrixNum = sprite->oam.matrixNum;\n    return matrixNum;\n}\n\nvoid SetSpriteMatrixAnchor(struct Sprite* sprite, s16 x, s16 y)\n{\n    sprite->sAnchorX = x;\n    sprite->sAnchorY = y;\n    sprite->anchored = TRUE;\n}\n\nstatic s32 GetAnchorCoord(s32 baseDim, s32 xformed, s32 modifier)\n{\n    s32 subResult, shiftResult;\n\n    subResult = xformed - baseDim;\n    if (subResult < 0)\n        shiftResult = -(subResult) >> 9;\n    else\n        shiftResult = -(subResult >> 9);\n    return modifier - ((u32)(modifier * xformed) / (u32)(baseDim) + shiftResult);\n}\n\nstatic void UpdateSpriteMatrixAnchorPos(struct Sprite *sprite, s32 x, s32 y)\n{\n    s32 dim, baseDim, xFormed;\n\n    u32 matrixNum = sprite->oam.matrixNum;\n    if (x != NO_ANCHOR)\n    {\n        dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][0];\n        baseDim = dim << 8;\n        xFormed = (dim << 16) / gOamMatrices[matrixNum].a;\n        sprite->x2 = GetAnchorCoord(baseDim, xFormed, x);\n    }\n    if (y != NO_ANCHOR)\n    {\n        dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][1];\n        baseDim = dim << 8;\n        xFormed = (dim << 16) / gOamMatrices[matrixNum].d;\n        sprite->y2 = GetAnchorCoord(baseDim, xFormed, y);\n    }\n}\n\nvoid SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip)\n{\n    sprite->oam.matrixNum &= 0x7;\n    sprite->oam.matrixNum |= (((hFlip ^ sprite->hFlip) & 1) << 3);\n    sprite->oam.matrixNum |= (((vFlip ^ sprite->vFlip) & 1) << 4);\n}\n\nvoid AffineAnimStateRestartAnim(u8 matrixNum)\n{\n    sAffineAnimStates[matrixNum].animCmdIndex = 0;\n    sAffineAnimStates[matrixNum].delayCounter = 0;\n    sAffineAnimStates[matrixNum].loopCounter = 0;\n}\n\nvoid AffineAnimStateStartAnim(u8 matrixNum, u8 animNum)\n{\n    sAffineAnimStates[matrixNum].animNum = animNum;\n    sAffineAnimStates[matrixNum].animCmdIndex = 0;\n    sAffineAnimStates[matrixNum].delayCounter = 0;\n    sAffineAnimStates[matrixNum].loopCounter = 0;\n    sAffineAnimStates[matrixNum].xScale = 0x0100;\n    sAffineAnimStates[matrixNum].yScale = 0x0100;\n    sAffineAnimStates[matrixNum].rotation = 0;\n}\n\nvoid AffineAnimStateReset(u8 matrixNum)\n{\n    sAffineAnimStates[matrixNum].animNum = 0;\n    sAffineAnimStates[matrixNum].animCmdIndex = 0;\n    sAffineAnimStates[matrixNum].delayCounter = 0;\n    sAffineAnimStates[matrixNum].loopCounter = 0;\n    sAffineAnimStates[matrixNum].xScale = 0x0100;\n    sAffineAnimStates[matrixNum].yScale = 0x0100;\n    sAffineAnimStates[matrixNum].rotation = 0;\n}\n\nvoid ApplyAffineAnimFrameAbsolute(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd)\n{\n    sAffineAnimStates[matrixNum].xScale = frameCmd->xScale;\n    sAffineAnimStates[matrixNum].yScale = frameCmd->yScale;\n    sAffineAnimStates[matrixNum].rotation = frameCmd->rotation << 8;\n}\n\nvoid DecrementAnimDelayCounter(struct Sprite *sprite)\n{\n    if (!sprite->animPaused)\n        sprite->animDelayCounter--;\n}\n\nbool8 DecrementAffineAnimDelayCounter(struct Sprite *sprite, u8 matrixNum)\n{\n    if (!sprite->affineAnimPaused)\n        --sAffineAnimStates[matrixNum].delayCounter;\n    return sprite->affineAnimPaused;\n}\n\nvoid ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd)\n{\n    struct ObjAffineSrcData srcData;\n    struct OamMatrix matrix;\n    sAffineAnimStates[matrixNum].xScale += frameCmd->xScale;\n    sAffineAnimStates[matrixNum].yScale += frameCmd->yScale;\n    sAffineAnimStates[matrixNum].rotation = (sAffineAnimStates[matrixNum].rotation + (frameCmd->rotation << 8)) & ~0xFF;\n    srcData.xScale = ConvertScaleParam(sAffineAnimStates[matrixNum].xScale);\n    srcData.yScale = ConvertScaleParam(sAffineAnimStates[matrixNum].yScale);\n    srcData.rotation = sAffineAnimStates[matrixNum].rotation;\n    ObjAffineSet(&srcData, &matrix, 1, 2);\n    CopyOamMatrix(matrixNum, &matrix);\n}\n\ns16 ConvertScaleParam(s16 scale)\n{\n    s32 val = 0x10000;\n    return SAFE_DIV(val, scale);\n}\n\nvoid GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd)\n{\n    frameCmd->xScale = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.xScale;\n    frameCmd->yScale = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.yScale;\n    frameCmd->rotation = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.rotation;\n    frameCmd->duration = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.duration;\n}\n\nvoid ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd)\n{\n    struct AffineAnimFrameCmd dummyFrameCmd = {0};\n\n    if (frameCmd->duration)\n    {\n        frameCmd->duration--;\n        ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, frameCmd);\n    }\n    else\n    {\n        ApplyAffineAnimFrameAbsolute(matrixNum, frameCmd);\n        ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &dummyFrameCmd);\n    }\n}\n\nvoid StartSpriteAnim(struct Sprite *sprite, u8 animNum)\n{\n    sprite->animNum = animNum;\n    sprite->animBeginning = TRUE;\n    sprite->animEnded = FALSE;\n}\n\nvoid StartSpriteAnimIfDifferent(struct Sprite *sprite, u8 animNum)\n{\n    if (sprite->animNum != animNum)\n        StartSpriteAnim(sprite, animNum);\n}\n\nvoid SeekSpriteAnim(struct Sprite *sprite, u8 animCmdIndex)\n{\n    u8 temp = sprite->animPaused;\n    sprite->animCmdIndex = animCmdIndex - 1;\n    sprite->animDelayCounter = 0;\n    sprite->animBeginning = FALSE;\n    sprite->animEnded = FALSE;\n    sprite->animPaused = FALSE;\n    ContinueAnim(sprite);\n    if (sprite->animDelayCounter)\n        sprite->animDelayCounter++;\n    sprite->animPaused = temp;\n}\n\nvoid StartSpriteAffineAnim(struct Sprite *sprite, u8 animNum)\n{\n    u8 matrixNum = GetSpriteMatrixNum(sprite);\n    AffineAnimStateStartAnim(matrixNum, animNum);\n    sprite->affineAnimBeginning = TRUE;\n    sprite->affineAnimEnded = FALSE;\n}\n\nvoid StartSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum)\n{\n    u8 matrixNum = GetSpriteMatrixNum(sprite);\n    if (sAffineAnimStates[matrixNum].animNum != animNum)\n        StartSpriteAffineAnim(sprite, animNum);\n}\n\nvoid ChangeSpriteAffineAnim(struct Sprite *sprite, u8 animNum)\n{\n    u8 matrixNum = GetSpriteMatrixNum(sprite);\n    sAffineAnimStates[matrixNum].animNum = animNum;\n    sprite->affineAnimBeginning = TRUE;\n    sprite->affineAnimEnded = FALSE;\n}\n\nvoid ChangeSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum)\n{\n    u8 matrixNum = GetSpriteMatrixNum(sprite);\n    if (sAffineAnimStates[matrixNum].animNum != animNum)\n        ChangeSpriteAffineAnim(sprite, animNum);\n}\n\nvoid SetSpriteSheetFrameTileNum(struct Sprite *sprite)\n{\n    if (sprite->usingSheet)\n    {\n        s16 tileOffset = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue;\n        if (tileOffset < 0)\n            tileOffset = 0;\n        sprite->oam.tileNum = sprite->sheetTileStart + tileOffset;\n    }\n}\n\nvoid ResetAffineAnimData(void)\n{\n    u32 i;\n\n    gAffineAnimsDisabled = 0;\n    gOamMatrixAllocBitmap = 0;\n\n    ResetOamMatrices();\n\n    for (i = 0; i < OAM_MATRIX_COUNT; i++)\n        AffineAnimStateReset(i);\n}\n\nu8 AllocOamMatrix(void)\n{\n    u8 i = 0;\n    u32 bit = 1;\n    u32 bitmap = gOamMatrixAllocBitmap;\n\n    while (i < OAM_MATRIX_COUNT)\n    {\n        if (!(bitmap & bit))\n        {\n            gOamMatrixAllocBitmap |= bit;\n            return i;\n        }\n\n        i++;\n        bit <<= 1;\n    }\n\n    return 0xFF;\n}\n\nvoid FreeOamMatrix(u8 matrixNum)\n{\n    u8 i = 0;\n    u32 bit = 1;\n\n    while (i < matrixNum)\n    {\n        i++;\n        bit <<= 1;\n    }\n\n    gOamMatrixAllocBitmap &= ~bit;\n    SetOamMatrix(matrixNum, 0x100, 0, 0, 0x100);\n}\n\nvoid InitSpriteAffineAnim(struct Sprite *sprite)\n{\n    u8 matrixNum = AllocOamMatrix();\n    if (matrixNum != 0xFF)\n    {\n        CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);\n        sprite->oam.matrixNum = matrixNum;\n        sprite->affineAnimBeginning = TRUE;\n        AffineAnimStateReset(matrixNum);\n    }\n}\n\nvoid SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation)\n{\n    struct ObjAffineSrcData srcData;\n    struct OamMatrix matrix;\n    srcData.xScale = ConvertScaleParam(xScale);\n    srcData.yScale = ConvertScaleParam(yScale);\n    srcData.rotation = rotation;\n    ObjAffineSet(&srcData, &matrix, 1, 2);\n    CopyOamMatrix(matrixNum, &matrix);\n}\n\nu16 LoadSpriteSheet(const struct SpriteSheet *sheet)\n{\n    s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP);\n\n    if (tileStart < 0)\n    {\n        return 0;\n    }\n    else\n    {\n        AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP);\n        CpuCopy16(sheet->data, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size);\n        return (u16)tileStart;\n    }\n}\n\nvoid LoadSpriteSheets(const struct SpriteSheet *sheets)\n{\n    u32 i;\n    for (i = 0; sheets[i].data != NULL; i++)\n        LoadSpriteSheet(&sheets[i]);\n}\n\nvoid FreeSpriteTilesByTag(u16 tag)\n{\n    u8 index = IndexOfSpriteTileTag(tag);\n    if (index != 0xFF)\n    {\n        u32 i;\n        u16 *rangeStarts;\n        u16 *rangeCounts;\n        u16 start;\n        u16 count;\n        rangeStarts = sSpriteTileRanges;\n        start = rangeStarts[index * 2];\n        rangeCounts = sSpriteTileRanges + 1;\n        count = rangeCounts[index * 2];\n\n        for (i = start; i < start + count; i++)\n            FREE_SPRITE_TILE(i);\n\n        sSpriteTileRangeTags[index] = TAG_NONE;\n    }\n}\n\nvoid FreeSpriteTileRanges(void)\n{\n    u32 i;\n\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        sSpriteTileRangeTags[i] = TAG_NONE;\n        SET_SPRITE_TILE_RANGE(i, 0, 0);\n    }\n}\n\nu16 GetSpriteTileStartByTag(u16 tag)\n{\n    u8 index = IndexOfSpriteTileTag(tag);\n    if (index == 0xFF)\n        return TAG_NONE;\n    return sSpriteTileRanges[index * 2];\n}\n\nu8 IndexOfSpriteTileTag(u16 tag)\n{\n    u32 i;\n\n    for (i = 0; i < MAX_SPRITES; i++)\n        if (sSpriteTileRangeTags[i] == tag)\n            return i;\n\n    return 0xFF;\n}\n\nu16 GetSpriteTileTagByTileStart(u16 start)\n{\n    u32 i;\n\n    for (i = 0; i < MAX_SPRITES; i++)\n    {\n        if (sSpriteTileRangeTags[i] != TAG_NONE && sSpriteTileRanges[i * 2] == start)\n            return sSpriteTileRangeTags[i];\n    }\n\n    return TAG_NONE;\n}\n\nvoid AllocSpriteTileRange(u16 tag, u16 start, u16 count)\n{\n    u8 freeIndex = IndexOfSpriteTileTag(TAG_NONE);\n    sSpriteTileRangeTags[freeIndex] = tag;\n    SET_SPRITE_TILE_RANGE(freeIndex, start, count);\n}\n\nvoid FreeAllSpritePalettes(void)\n{\n    u32 i;\n    gReservedSpritePaletteCount = 0;\n    for (i = 0; i < ARRAY_COUNT(sSpritePaletteTags); i++)\n        sSpritePaletteTags[i] = TAG_NONE;\n}\n\nu8 LoadSpritePalette(const struct SpritePalette *palette)\n{\n    u8 index = IndexOfSpritePaletteTag(palette->tag);\n\n    if (index != 0xFF)\n        return index;\n\n    index = IndexOfSpritePaletteTag(TAG_NONE);\n\n    if (index == 0xFF)\n    {\n        return 0xFF;\n    }\n    else\n    {\n        sSpritePaletteTags[index] = palette->tag;\n        DoLoadSpritePalette(palette->data, PLTT_ID(index));\n        return index;\n    }\n}\n\nvoid LoadSpritePalettes(const struct SpritePalette *palettes)\n{\n    u32 i;\n    for (i = 0; palettes[i].data != NULL; i++)\n        if (LoadSpritePalette(&palettes[i]) == 0xFF)\n            break;\n}\n\nstatic void DoLoadSpritePalette(const u16 *src, u16 paletteOffset)\n{\n    LoadPalette(src, paletteOffset + OBJ_PLTT_OFFSET, PLTT_SIZE_4BPP);\n}\n\nu8 AllocSpritePalette(u16 tag)\n{\n    u8 index = IndexOfSpritePaletteTag(TAG_NONE);\n    if (index == 0xFF)\n    {\n        return 0xFF;\n    }\n    else\n    {\n        sSpritePaletteTags[index] = tag;\n        return index;\n    }\n}\n\nu8 IndexOfSpritePaletteTag(u16 tag)\n{\n    u32 i;\n    for (i = gReservedSpritePaletteCount; i < 16; i++)\n        if (sSpritePaletteTags[i] == tag)\n            return i;\n\n    return 0xFF;\n}\n\nu16 GetSpritePaletteTagByPaletteNum(u8 paletteNum)\n{\n    return sSpritePaletteTags[paletteNum];\n}\n\nvoid FreeSpritePaletteByTag(u16 tag)\n{\n    u8 index = IndexOfSpritePaletteTag(tag);\n    if (index != 0xFF)\n        sSpritePaletteTags[index] = TAG_NONE;\n}\n\nvoid SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables)\n{\n    sprite->subspriteTables = subspriteTables;\n    sprite->subspriteTableNum = 0;\n    sprite->subspriteMode = SUBSPRITES_ON;\n}\n\nbool8 AddSpriteToOamBuffer(struct Sprite *sprite, u32 *oamIndex)\n{\n    if (*oamIndex >= gOamLimit)\n        return 1;\n\n    if (!sprite->subspriteTables || sprite->subspriteMode == SUBSPRITES_OFF)\n    {\n        gMain.oamBuffer[*oamIndex] = sprite->oam;\n        (*oamIndex)++;\n        return 0;\n    }\n    else\n    {\n        return AddSubspritesToOamBuffer(sprite, &gMain.oamBuffer[*oamIndex], oamIndex);\n    }\n}\n\nbool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u32 *oamIndex)\n{\n    const struct SubspriteTable *subspriteTable;\n    struct OamData *oam;\n\n    if (*oamIndex >= gOamLimit)\n        return 1;\n\n    subspriteTable = &sprite->subspriteTables[sprite->subspriteTableNum];\n    oam = &sprite->oam;\n\n    if (!subspriteTable || !subspriteTable->subsprites)\n    {\n        *destOam = *oam;\n        (*oamIndex)++;\n        return 0;\n    }\n    else\n    {\n        u16 tileNum;\n        u16 baseX;\n        u16 baseY;\n        u8 subspriteCount;\n        u8 hFlip;\n        u8 vFlip;\n        u32 i;\n\n        tileNum = oam->tileNum;\n        subspriteCount = subspriteTable->subspriteCount;\n        hFlip = ((s32)oam->matrixNum >> 3) & 1;\n        vFlip = ((s32)oam->matrixNum >> 4) & 1;\n        baseX = oam->x - sprite->centerToCornerVecX;\n        baseY = oam->y - sprite->centerToCornerVecY;\n\n        for (i = 0; i < subspriteCount; i++, (*oamIndex)++)\n        {\n            u16 x;\n            u16 y;\n\n            if (*oamIndex >= gOamLimit)\n                return 1;\n\n            x = subspriteTable->subsprites[i].x;\n            y = subspriteTable->subsprites[i].y;\n\n            if (hFlip)\n            {\n                s8 width = sOamDimensions[subspriteTable->subsprites[i].shape][subspriteTable->subsprites[i].size].width;\n                s16 right = x;\n                right += width;\n                x = right;\n                x = ~x + 1;\n            }\n\n            if (vFlip)\n            {\n                s8 height = sOamDimensions[subspriteTable->subsprites[i].shape][subspriteTable->subsprites[i].size].height;\n                s16 bottom = y;\n                bottom += height;\n                y = bottom;\n                y = ~y + 1;\n            }\n\n            destOam[i] = *oam;\n            destOam[i].shape = subspriteTable->subsprites[i].shape;\n            destOam[i].size = subspriteTable->subsprites[i].size;\n            destOam[i].x = (s16)baseX + (s16)x;\n            destOam[i].y = baseY + y;\n            destOam[i].tileNum = tileNum + subspriteTable->subsprites[i].tileOffset;\n\n            if (sprite->subspriteMode != SUBSPRITES_IGNORE_PRIORITY)\n                destOam[i].priority = subspriteTable->subsprites[i].priority;\n        }\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/ss_anne.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"event_object_movement.h\"\n#include \"script.h\"\n#include \"constants/songs.h\"\n\n// Tasks governing the ship's departure after you've gotten HM01 CUT\n\n#define SPRITE_TAG_WAKE  4000\n#define SPRITE_TAG_SMOKE 4001\n\nstatic void Task_SSAnneInit(u8 taskId);\nstatic void Task_SSAnneRun(u8 taskId);\nstatic void Task_SSAnneFinish(u8 taskId);\nstatic void CreateWakeBehindBoat(void);\nstatic void WakeSpriteCallback(struct Sprite *sprite);\nstatic void CreateSmokeSprite(void);\nstatic void SmokeSpriteCallback(struct Sprite *sprite);\n\nstatic const u16 sWakeTiles[] = INCBIN_U16(\"graphics/ss_anne/wake.4bpp\");\nstatic const u16 sSmokeTiles[] = INCBIN_U16(\"graphics/ss_anne/smoke.4bpp\");\n\nstatic const struct SpriteSheet sSpriteSheets[] = {\n    {(const void *)sWakeTiles, sizeof(sWakeTiles), SPRITE_TAG_WAKE},\n    {(const void *)sSmokeTiles, sizeof(sSmokeTiles), SPRITE_TAG_SMOKE},\n    {0}\n};\n\nstatic const union AnimCmd sWakeAnim[] = {\n    ANIMCMD_FRAME(0, 12),\n    ANIMCMD_FRAME(8, 12),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sWakeAnimTable[] = {\n    sWakeAnim\n};\n\nstatic const struct OamData sWakeOamData = {\n    .shape = ST_OAM_V_RECTANGLE,\n    .size = 2\n};\n\nstatic const struct SpriteTemplate sWakeSpriteTemplate = {\n    SPRITE_TAG_WAKE,\n    0xFFFF,\n    &sWakeOamData,\n    sWakeAnimTable,\n    NULL,\n    gDummySpriteAffineAnimTable,\n    WakeSpriteCallback\n};\n\nstatic const union AnimCmd sSmokeAnim[] = {\n    ANIMCMD_FRAME( 0, 10),\n    ANIMCMD_FRAME( 4, 20),\n    ANIMCMD_FRAME( 8, 20),\n    ANIMCMD_FRAME(12, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSmokeAnimTable[] = {\n    sSmokeAnim\n};\n\nstatic const struct OamData sSmokeOamData = {\n    .shape = ST_OAM_SQUARE,\n    .size = 1\n};\n\nstatic const struct SpriteTemplate sSmokeSpriteTemplate = {\n    SPRITE_TAG_SMOKE,\n    0xFFFF,\n    &sSmokeOamData,\n    sSmokeAnimTable,\n    NULL,\n    gDummySpriteAffineAnimTable,\n    SmokeSpriteCallback\n};\n\nvoid DoSSAnneDepartureCutscene(void)\n{\n    u8 taskId;\n\n    PlaySE(SE_SS_ANNE_HORN);\n    taskId = CreateTask(Task_SSAnneInit, 8);\n    gTasks[taskId].data[0] = 50;\n}\n\nstatic void Task_SSAnneInit(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (--data[0] == 0)\n    {\n        LoadSpriteSheets(sSpriteSheets);\n        CreateWakeBehindBoat();\n        gTasks[taskId].func = Task_SSAnneRun;\n    }\n}\n\nstatic void Task_SSAnneRun(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    u8 objectEventId;\n    struct ObjectEvent * boatObject;\n    s16 x;\n\n    data[1]++;\n    data[2]++;\n    if (data[1] == 70)\n    {\n        data[1] = 0;\n        CreateSmokeSprite();\n    }\n    TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId);\n    boatObject = &gObjectEvents[objectEventId];\n    if (gSprites[boatObject->spriteId].x + gSprites[boatObject->spriteId].x2 < -120)\n    {\n        PlaySE(SE_SS_ANNE_HORN);\n        gTasks[taskId].func = Task_SSAnneFinish;\n    }\n    else\n    {\n        x = data[2] / 5;\n        gSprites[boatObject->spriteId].x2 = -x;\n    }\n}\n\nstatic void Task_SSAnneFinish(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (++data[3] == 40)\n    {\n        FreeSpriteTilesByTag(SPRITE_TAG_WAKE);\n        FreeSpriteTilesByTag(SPRITE_TAG_SMOKE);\n        DestroyTask(taskId);\n        ScriptContext_Enable();\n    }\n}\n\nstatic void CreateWakeBehindBoat(void)\n{\n    u8 objectEventId;\n    struct ObjectEvent * boatObject;\n    u16 x;\n    u8 spriteId;\n\n    TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId);\n    boatObject = &gObjectEvents[objectEventId];\n    x = gSprites[boatObject->spriteId].x + gSprites[boatObject->spriteId].x2 + 80;\n    spriteId = CreateSprite(&sWakeSpriteTemplate, x, 109, 0xFF);\n    gSprites[spriteId].oam.priority = 2;\n    gSprites[spriteId].oam.paletteNum = 10;\n}\n\nstatic void WakeSpriteCallback(struct Sprite *sprite)\n{\n    u8 objectEventId;\n    struct ObjectEvent * boatObject;\n    u16 x;\n\n    TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId);\n    boatObject = &gObjectEvents[objectEventId];\n    x = gSprites[boatObject->spriteId].x + gSprites[boatObject->spriteId].x2 + 80;\n    sprite->x = x;\n    if (sprite->data[0] / 6 < 22)\n        sprite->data[0]++;\n    sprite->x2 = sprite->data[0] / 6;\n    if (sprite->x + sprite->x2 < -18)\n        DestroySprite(sprite);\n}\n\nstatic void CreateSmokeSprite(void)\n{\n    u8 objectEventId;\n    struct ObjectEvent * boatObject;\n    u16 x;\n    u8 spriteId;\n\n    TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId);\n    boatObject = &gObjectEvents[objectEventId];\n    x = gSprites[boatObject->spriteId].x + gSprites[boatObject->spriteId].x2 + 49;\n    if ((s16)x >= -32)\n    {\n        spriteId = CreateSprite(&sSmokeSpriteTemplate, x, 78, 8);\n        if (spriteId != MAX_SPRITES)\n            gSprites[spriteId].oam.paletteNum = 10;\n    }\n}\n\nstatic void SmokeSpriteCallback(struct Sprite *sprite)\n{\n    sprite->data[0]++;\n    sprite->x2 = sprite->data[0] / 4;\n    if (sprite->animEnded)\n        DestroySprite(sprite);\n}\n"
  },
  {
    "path": "src/start_menu.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"scanline_effect.h\"\n#include \"overworld.h\"\n#include \"link.h\"\n#include \"pokedex.h\"\n#include \"item_menu.h\"\n#include \"party_menu.h\"\n#include \"save.h\"\n#include \"link_rfu.h\"\n#include \"help_message.h\"\n#include \"event_data.h\"\n#include \"fieldmap.h\"\n#include \"safari_zone.h\"\n#include \"start_menu.h\"\n#include \"menu.h\"\n#include \"load_save.h\"\n#include \"strings.h\"\n#include \"menu_helpers.h\"\n#include \"text_window.h\"\n#include \"field_fadetransition.h\"\n#include \"field_player_avatar.h\"\n#include \"new_menu_helpers.h\"\n#include \"event_object_movement.h\"\n#include \"event_object_lock.h\"\n#include \"script.h\"\n#include \"quest_log.h\"\n#include \"new_game.h\"\n#include \"event_scripts.h\"\n#include \"field_weather.h\"\n#include \"field_specials.h\"\n#include \"pokedex_screen.h\"\n#include \"trainer_card.h\"\n#include \"option_menu.h\"\n#include \"save_menu_util.h\"\n#include \"help_system.h\"\n#include \"constants/songs.h\"\n#include \"constants/field_weather.h\"\n\nenum StartMenuOption\n{\n    STARTMENU_POKEDEX = 0,\n    STARTMENU_POKEMON,\n    STARTMENU_BAG,\n    STARTMENU_PLAYER,\n    STARTMENU_SAVE,\n    STARTMENU_OPTION,\n    STARTMENU_EXIT,\n    STARTMENU_RETIRE,\n    STARTMENU_PLAYER2,\n    MAX_STARTMENU_ITEMS\n};\n\nenum SaveCBReturn\n{\n    SAVECB_RETURN_CONTINUE = 0,\n    SAVECB_RETURN_OKAY,\n    SAVECB_RETURN_CANCEL,\n    SAVECB_RETURN_ERROR\n};\n\nstatic EWRAM_DATA bool8 (*sStartMenuCallback)(void) = NULL;\nstatic EWRAM_DATA u8 sStartMenuCursorPos = 0;\nstatic EWRAM_DATA u8 sNumStartMenuItems = 0;\nstatic EWRAM_DATA u8 sStartMenuOrder[MAX_STARTMENU_ITEMS] = {};\nstatic EWRAM_DATA s8 sDrawStartMenuState[2] = {};\nstatic EWRAM_DATA u8 sSafariZoneStatsWindowId = 0;\nstatic ALIGNED(4) EWRAM_DATA u8 sSaveStatsWindowId = 0;\n\nstatic u8 (*sSaveDialogCB)(void);\nstatic u8 sSaveDialogDelay;\nstatic bool8 sSaveDialogIsPrinting;\n\nstatic void SetUpStartMenu_Link(void);\nstatic void SetUpStartMenu_UnionRoom(void);\nstatic void SetUpStartMenu_SafariZone(void);\nstatic void SetUpStartMenu_NormalField(void);\nstatic bool8 StartCB_HandleInput(void);\nstatic void StartMenu_FadeScreenIfLeavingOverworld(void);\nstatic bool8 StartMenuPokedexSanityCheck(void);\nstatic bool8 StartMenuPokedexCallback(void);\nstatic bool8 StartMenuPokemonCallback(void);\nstatic bool8 StartMenuBagCallback(void);\nstatic bool8 StartMenuPlayerCallback(void);\nstatic bool8 StartMenuSaveCallback(void);\nstatic bool8 StartMenuOptionCallback(void);\nstatic bool8 StartMenuExitCallback(void);\nstatic bool8 StartMenuSafariZoneRetireCallback(void);\nstatic bool8 StartMenuLinkPlayerCallback(void);\nstatic bool8 StartCB_Save1(void);\nstatic bool8 StartCB_Save2(void);\nstatic void StartMenu_PrepareForSave(void);\nstatic u8 RunSaveDialogCB(void);\nstatic void task50_save_game(u8 taskId);\nstatic u8 SaveDialogCB_PrintAskSaveText(void);\nstatic u8 SaveDialogCB_AskSavePrintYesNoMenu(void);\nstatic u8 SaveDialogCB_AskSaveHandleInput(void);\nstatic u8 SaveDialogCB_PrintAskOverwriteText(void);\nstatic u8 SaveDialogCB_AskOverwritePrintYesNoMenu(void);\nstatic u8 SaveDialogCB_AskReplacePreviousFilePrintYesNoMenu(void);\nstatic u8 SaveDialogCB_AskOverwriteOrReplacePreviousFileHandleInput(void);\nstatic u8 SaveDialogCB_PrintSavingDontTurnOffPower(void);\nstatic u8 SaveDialogCB_DoSave(void);\nstatic u8 SaveDialogCB_PrintSaveResult(void);\nstatic u8 SaveDialogCB_WaitPrintSuccessAndPlaySE(void);\nstatic u8 SaveDialogCB_ReturnSuccess(void);\nstatic u8 SaveDialogCB_WaitPrintErrorAndPlaySE(void);\nstatic u8 SaveDialogCB_ReturnError(void);\nstatic void CB2_WhileSavingAfterLinkBattle(void);\nstatic void task50_after_link_battle_save(u8 taskId);\nstatic void PrintSaveStats(void);\nstatic void CloseSaveStatsWindow(void);\nstatic void CloseStartMenu(void);\n\nstatic const struct MenuAction sStartMenuActionTable[] = {\n    { gText_MenuPokedex, {.u8_void = StartMenuPokedexCallback} },\n    { gText_MenuPokemon, {.u8_void = StartMenuPokemonCallback} },\n    { gText_MenuBag, {.u8_void = StartMenuBagCallback} },\n    { gText_MenuPlayer, {.u8_void = StartMenuPlayerCallback} },\n    { gText_MenuSave, {.u8_void = StartMenuSaveCallback} },\n    { gText_MenuOption, {.u8_void = StartMenuOptionCallback} },\n    { gText_MenuExit, {.u8_void = StartMenuExitCallback} },\n    { gText_MenuRetire, {.u8_void = StartMenuSafariZoneRetireCallback} },\n    { gText_MenuPlayer, {.u8_void = StartMenuLinkPlayerCallback} }\n};\n\nstatic const struct WindowTemplate sSafariZoneStatsWindowTemplate = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 1,\n    .width = 10,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x008\n};\n\nstatic const u8 *const sStartMenuDescPointers[] = {\n    gStartMenuDesc_Pokedex,\n    gStartMenuDesc_Pokemon,\n    gStartMenuDesc_Bag,\n    gStartMenuDesc_Player,\n    gStartMenuDesc_Save,\n    gStartMenuDesc_Option,\n    gStartMenuDesc_Exit,\n    gStartMenuDesc_Retire,\n    gStartMenuDesc_Player\n};\n\nstatic const struct BgTemplate sBGTemplates_AfterLinkSaveMessage[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates_AfterLinkSaveMessage[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x198\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sSaveStatsWindowTemplate = {\n    .bg = 0,\n    .tilemapLeft = 1,\n    .tilemapTop = 1,\n    .width = 14,\n    .height = 9,\n    .paletteNum = 13,\n    .baseBlock = 0x008\n};\n\nstatic ALIGNED(2) const u8 sTextColor_StatName[] = { 1, 2, 3 };\nstatic ALIGNED(2) const u8 sTextColor_StatValue[] = { 1, 4, 5 };\nstatic ALIGNED(2) const u8 sTextColor_LocationHeader[] = { 1, 6, 7 };\n\n// Unused\nstatic void SetHasPokedexAndPokemon(void)\n{\n    FlagSet(FLAG_SYS_POKEDEX_GET);\n    FlagSet(FLAG_SYS_POKEMON_GET);\n}\n\nstatic void SetUpStartMenu(void)\n{\n    sNumStartMenuItems = 0;\n    if (IsUpdateLinkStateCBActive() == TRUE)\n        SetUpStartMenu_Link();\n    else if (InUnionRoom() == TRUE)\n        SetUpStartMenu_UnionRoom();\n    else if (GetSafariZoneFlag() == TRUE)\n        SetUpStartMenu_SafariZone();\n    else\n        SetUpStartMenu_NormalField();\n}\n\nstatic void AppendToStartMenuItems(u8 newEntry)\n{\n    AppendToList(sStartMenuOrder, &sNumStartMenuItems, newEntry);\n}\n\nstatic void SetUpStartMenu_NormalField(void)\n{\n    if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE)\n        AppendToStartMenuItems(STARTMENU_POKEDEX);\n    if (FlagGet(FLAG_SYS_POKEMON_GET) == TRUE)\n        AppendToStartMenuItems(STARTMENU_POKEMON);\n    AppendToStartMenuItems(STARTMENU_BAG);\n    AppendToStartMenuItems(STARTMENU_PLAYER);\n    AppendToStartMenuItems(STARTMENU_SAVE);\n    AppendToStartMenuItems(STARTMENU_OPTION);\n    AppendToStartMenuItems(STARTMENU_EXIT);\n}\n\nstatic void SetUpStartMenu_SafariZone(void)\n{\n    AppendToStartMenuItems(STARTMENU_RETIRE);\n    AppendToStartMenuItems(STARTMENU_POKEDEX);\n    AppendToStartMenuItems(STARTMENU_POKEMON);\n    AppendToStartMenuItems(STARTMENU_BAG);\n    AppendToStartMenuItems(STARTMENU_PLAYER);\n    AppendToStartMenuItems(STARTMENU_OPTION);\n    AppendToStartMenuItems(STARTMENU_EXIT);\n}\n\nstatic void SetUpStartMenu_Link(void)\n{\n    AppendToStartMenuItems(STARTMENU_POKEMON);\n    AppendToStartMenuItems(STARTMENU_BAG);\n    AppendToStartMenuItems(STARTMENU_PLAYER2);\n    AppendToStartMenuItems(STARTMENU_OPTION);\n    AppendToStartMenuItems(STARTMENU_EXIT);\n}\n\nstatic void SetUpStartMenu_UnionRoom(void)\n{\n    AppendToStartMenuItems(STARTMENU_POKEMON);\n    AppendToStartMenuItems(STARTMENU_BAG);\n    AppendToStartMenuItems(STARTMENU_PLAYER);\n    AppendToStartMenuItems(STARTMENU_OPTION);\n    AppendToStartMenuItems(STARTMENU_EXIT);\n}\n\nstatic void DrawSafariZoneStatsWindow(void)\n{\n    sSafariZoneStatsWindowId = AddWindow(&sSafariZoneStatsWindowTemplate);\n    PutWindowTilemap(sSafariZoneStatsWindowId);\n    DrawStdWindowFrame(sSafariZoneStatsWindowId, FALSE);\n    ConvertIntToDecimalStringN(gStringVar1, gSafariZoneStepCounter, STR_CONV_MODE_RIGHT_ALIGN, 3);\n    ConvertIntToDecimalStringN(gStringVar2, 600, STR_CONV_MODE_RIGHT_ALIGN, 3);\n    ConvertIntToDecimalStringN(gStringVar3, gNumSafariBalls, STR_CONV_MODE_RIGHT_ALIGN, 2);\n    StringExpandPlaceholders(gStringVar4, gText_MenuSafariStats);\n    AddTextPrinterParameterized(sSafariZoneStatsWindowId, FONT_NORMAL, gStringVar4, 4, 3, 0xFF, NULL);\n    CopyWindowToVram(sSafariZoneStatsWindowId, COPYWIN_GFX);\n}\n\nstatic void DestroySafariZoneStatsWindow(void)\n{\n    if (GetSafariZoneFlag())\n    {\n        ClearStdWindowAndFrameToTransparent(sSafariZoneStatsWindowId, FALSE);\n        CopyWindowToVram(sSafariZoneStatsWindowId, COPYWIN_GFX);\n        RemoveWindow(sSafariZoneStatsWindowId);\n    }\n}\n\nstatic s8 PrintStartMenuItems(s8 *cursor_p, u8 nitems)\n{\n    s16 i = *cursor_p;\n    do\n    {\n        if (sStartMenuOrder[i] == STARTMENU_PLAYER || sStartMenuOrder[i] == STARTMENU_PLAYER2)\n        {\n            Menu_PrintFormatIntlPlayerName(GetStartMenuWindowId(), sStartMenuActionTable[sStartMenuOrder[i]].text, 8, i * 15);\n        }\n        else\n        {\n            StringExpandPlaceholders(gStringVar4, sStartMenuActionTable[sStartMenuOrder[i]].text);\n            AddTextPrinterParameterized(GetStartMenuWindowId(), FONT_NORMAL, gStringVar4, 8, i * 15, 0xFF, NULL);\n        }\n        i++;\n        if (i >= sNumStartMenuItems)\n        {\n            *cursor_p = i;\n            return TRUE;\n        }\n    } while (--nitems);\n    *cursor_p = i;\n    return FALSE;\n}\n\nstatic s8 DoDrawStartMenu(void)\n{\n    switch (sDrawStartMenuState[0])\n    {\n    case 0:\n        sDrawStartMenuState[0]++;\n        break;\n    case 1:\n        SetUpStartMenu();\n        sDrawStartMenuState[0]++;\n        break;\n    case 2:\n        LoadStdWindowFrameGfx();\n        DrawStdWindowFrame(CreateStartMenuWindow(sNumStartMenuItems), FALSE);\n        sDrawStartMenuState[0]++;\n        break;\n    case 3:\n        if (GetSafariZoneFlag())\n            DrawSafariZoneStatsWindow();\n        sDrawStartMenuState[0]++;\n        break;\n    case 4:\n        if (PrintStartMenuItems(&sDrawStartMenuState[1], 2) == TRUE)\n            sDrawStartMenuState[0]++;\n        break;\n    case 5:\n        sStartMenuCursorPos = Menu_InitCursor(GetStartMenuWindowId(), FONT_NORMAL, 0, 0, 15, sNumStartMenuItems, sStartMenuCursorPos);\n        if (!MenuHelpers_IsLinkActive() && InUnionRoom() != TRUE && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_HELP)\n        {\n            DrawHelpMessageWindowWithText(sStartMenuDescPointers[sStartMenuOrder[sStartMenuCursorPos]]);\n        }\n        CopyWindowToVram(GetStartMenuWindowId(), COPYWIN_MAP);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void DrawStartMenuInOneGo(void)\n{\n    sDrawStartMenuState[0] = 0;\n    sDrawStartMenuState[1] = 0;\n    while (!DoDrawStartMenu())\n        ;\n}\n\nstatic void task50_startmenu(u8 taskId)\n{\n    if (DoDrawStartMenu() == TRUE)\n        SwitchTaskToFollowupFunc(taskId);\n}\n\nstatic void OpenStartMenuWithFollowupFunc(TaskFunc func)\n{\n    u8 taskId;\n    sDrawStartMenuState[0] = 0;\n    sDrawStartMenuState[1] = 0;\n    taskId = CreateTask(task50_startmenu, 80);\n    SetTaskFuncWithFollowupFunc(taskId, task50_startmenu, func);\n}\n\nstatic bool8 FieldCB2_DrawStartMenu(void)\n{\n    if (!DoDrawStartMenu())\n        return FALSE;\n    FadeTransition_FadeInOnReturnToStartMenu();\n    return TRUE;\n}\n\nvoid SetUpReturnToStartMenu(void)\n{\n    sDrawStartMenuState[0] = 0;\n    sDrawStartMenuState[1] = 0;\n    gFieldCallback2 = FieldCB2_DrawStartMenu;\n}\n\nvoid Task_StartMenuHandleInput(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    switch (data[0])\n    {\n    case 0:\n        if (InUnionRoom() == TRUE)\n            SetUsingUnionRoomStartMenu();\n        sStartMenuCallback = StartCB_HandleInput;\n        data[0]++;\n        break;\n    case 1:\n        if (sStartMenuCallback() == TRUE)\n            DestroyTask(taskId);\n        break;\n    }\n}\n\nvoid ShowStartMenu(void)\n{\n    if (!IsUpdateLinkStateCBActive())\n    {\n        FreezeObjectEvents();\n        HandleEnforcedLookDirectionOnPlayerStopMoving();\n        StopPlayerAvatar();\n    }\n    OpenStartMenuWithFollowupFunc(Task_StartMenuHandleInput);\n    LockPlayerFieldControls();\n}\n\nstatic bool8 StartCB_HandleInput(void)\n{\n    if (JOY_NEW(DPAD_UP))\n    {\n        PlaySE(SE_SELECT);\n        sStartMenuCursorPos = Menu_MoveCursor(-1);\n        if (!MenuHelpers_IsLinkActive() && InUnionRoom() != TRUE && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_HELP)\n        {\n            PrintTextOnHelpMessageWindow(sStartMenuDescPointers[sStartMenuOrder[sStartMenuCursorPos]], 2);\n        }\n    }\n    if (JOY_NEW(DPAD_DOWN))\n    {\n        PlaySE(SE_SELECT);\n        sStartMenuCursorPos = Menu_MoveCursor(+1);\n        if (!MenuHelpers_IsLinkActive() && InUnionRoom() != TRUE && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_HELP)\n        {\n            PrintTextOnHelpMessageWindow(sStartMenuDescPointers[sStartMenuOrder[sStartMenuCursorPos]], 2);\n        }\n    }\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        if (!StartMenuPokedexSanityCheck())\n            return FALSE;\n        sStartMenuCallback = sStartMenuActionTable[sStartMenuOrder[sStartMenuCursorPos]].func.u8_void;\n        StartMenu_FadeScreenIfLeavingOverworld();\n        return FALSE;\n    }\n    if (JOY_NEW(B_BUTTON | START_BUTTON))\n    {\n        DestroySafariZoneStatsWindow();\n        DestroyHelpMessageWindow_();\n        CloseStartMenu();\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void StartMenu_FadeScreenIfLeavingOverworld(void)\n{\n    if (sStartMenuCallback != StartMenuSaveCallback\n     && sStartMenuCallback != StartMenuExitCallback\n     && sStartMenuCallback != StartMenuSafariZoneRetireCallback)\n    {\n        StopPokemonLeagueLightingEffectTask();\n        FadeScreen(FADE_TO_BLACK, 0);\n    }\n}\n\nstatic bool8 StartMenuPokedexSanityCheck(void)\n{\n    if (sStartMenuActionTable[sStartMenuOrder[sStartMenuCursorPos]].func.u8_void == StartMenuPokedexCallback && GetNationalPokedexCount(0) == 0)\n        return FALSE;\n    return TRUE;\n}\n\nstatic bool8 StartMenuPokedexCallback(void)\n{\n    if (!gPaletteFade.active)\n    {\n        IncrementGameStat(GAME_STAT_CHECKED_POKEDEX);\n        PlayRainStoppingSoundEffect();\n        DestroySafariZoneStatsWindow();\n        CleanupOverworldWindowsAndTilemaps();\n        SetMainCallback2(CB2_OpenPokedexFromStartMenu);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 StartMenuPokemonCallback(void)\n{\n    if (!gPaletteFade.active)\n    {\n        PlayRainStoppingSoundEffect();\n        DestroySafariZoneStatsWindow();\n        CleanupOverworldWindowsAndTilemaps();\n        SetMainCallback2(CB2_PartyMenuFromStartMenu);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 StartMenuBagCallback(void)\n{\n    if (!gPaletteFade.active)\n    {\n        PlayRainStoppingSoundEffect();\n        DestroySafariZoneStatsWindow();\n        CleanupOverworldWindowsAndTilemaps();\n        SetMainCallback2(CB2_BagMenuFromStartMenu);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 StartMenuPlayerCallback(void)\n{\n    if (!gPaletteFade.active)\n    {\n        PlayRainStoppingSoundEffect();\n        DestroySafariZoneStatsWindow();\n        CleanupOverworldWindowsAndTilemaps();\n        ShowPlayerTrainerCard(CB2_ReturnToFieldWithOpenMenu);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 StartMenuSaveCallback(void)\n{\n    sStartMenuCallback = StartCB_Save1;\n    return FALSE;\n}\n\nstatic bool8 StartMenuOptionCallback(void)\n{\n    if (!gPaletteFade.active)\n    {\n        PlayRainStoppingSoundEffect();\n        DestroySafariZoneStatsWindow();\n        CleanupOverworldWindowsAndTilemaps();\n        SetMainCallback2(CB2_OptionsMenuFromStartMenu);\n        gMain.savedCallback = CB2_ReturnToFieldWithOpenMenu;\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 StartMenuExitCallback(void)\n{\n    DestroySafariZoneStatsWindow();\n    DestroyHelpMessageWindow_();\n    CloseStartMenu();\n    return TRUE;\n}\n\nstatic bool8 StartMenuSafariZoneRetireCallback(void)\n{\n    DestroySafariZoneStatsWindow();\n    DestroyHelpMessageWindow_();\n    CloseStartMenu();\n    SafariZoneRetirePrompt();\n    return TRUE;\n}\n\n\nstatic bool8 StartMenuLinkPlayerCallback(void)\n{\n    if (!gPaletteFade.active)\n    {\n        PlayRainStoppingSoundEffect();\n        CleanupOverworldWindowsAndTilemaps();\n        ShowTrainerCardInLink(gLocalLinkPlayerId, CB2_ReturnToFieldWithOpenMenu);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 StartCB_Save1(void)\n{\n    BackupHelpContext();\n    SetHelpContext(HELPCONTEXT_SAVE);\n    StartMenu_PrepareForSave();\n    sStartMenuCallback = StartCB_Save2;\n    return FALSE;\n}\n\nstatic bool8 StartCB_Save2(void)\n{\n    switch (RunSaveDialogCB())\n    {\n    case SAVECB_RETURN_CONTINUE:\n        break;\n    case SAVECB_RETURN_OKAY:\n        ClearDialogWindowAndFrameToTransparent(0, TRUE);\n        ClearPlayerHeldMovementAndUnfreezeObjectEvents();\n        UnlockPlayerFieldControls();\n        RestoreHelpContext();\n        return TRUE;\n    case SAVECB_RETURN_CANCEL:\n        ClearDialogWindowAndFrameToTransparent(0, FALSE);\n        DrawStartMenuInOneGo();\n        RestoreHelpContext();\n        sStartMenuCallback = StartCB_HandleInput;\n        break;\n    case SAVECB_RETURN_ERROR:\n        ClearDialogWindowAndFrameToTransparent(0, TRUE);\n        ClearPlayerHeldMovementAndUnfreezeObjectEvents();\n        UnlockPlayerFieldControls();\n        RestoreHelpContext();\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic void StartMenu_PrepareForSave(void)\n{\n    SaveMapView();\n    sSaveDialogCB = SaveDialogCB_PrintAskSaveText;\n    sSaveDialogIsPrinting = FALSE;\n}\n\nstatic u8 RunSaveDialogCB(void)\n{\n    if (RunTextPrinters_CheckPrinter0Active() == TRUE)\n        return 0;\n    sSaveDialogIsPrinting = FALSE;\n    return sSaveDialogCB();\n}\n\nvoid Field_AskSaveTheGame(void)\n{\n    BackupHelpContext();\n    SetHelpContext(HELPCONTEXT_SAVE);\n    StartMenu_PrepareForSave();\n    CreateTask(task50_save_game, 80);\n}\n\nstatic void PrintSaveTextWithFollowupFunc(const u8 *str, bool8 (*saveDialogCB)(void))\n{\n    StringExpandPlaceholders(gStringVar4, str);\n    LoadMessageBoxAndFrameGfx(0, TRUE);\n    AddTextPrinterForMessage(TRUE);\n    sSaveDialogIsPrinting = TRUE;\n    sSaveDialogCB = saveDialogCB;\n}\n\nstatic void task50_save_game(u8 taskId)\n{\n    switch (RunSaveDialogCB())\n    {\n    case 0:\n        return;\n    case 2:\n    case 3:\n        gSpecialVar_Result = FALSE;\n        break;\n    case 1:\n        gSpecialVar_Result = TRUE;\n        break;\n    }\n    DestroyTask(taskId);\n    ScriptContext_Enable();\n    RestoreHelpContext();\n}\n\nstatic void CloseSaveMessageWindow(void)\n{\n    ClearDialogWindowAndFrame(0, TRUE);\n}\n\nstatic void CloseSaveStatsWindow_(void)\n{\n    CloseSaveStatsWindow();\n}\n\nstatic void SetSaveDialogDelayTo60Frames(void)\n{\n    sSaveDialogDelay = 60;\n}\n\nstatic bool8 SaveDialog_Wait60FramesOrAButtonHeld(void)\n{\n    sSaveDialogDelay--;\n    if (JOY_HELD(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        return TRUE;\n    }\n    else if (sSaveDialogDelay == 0)\n    {\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nstatic bool8 SaveDialog_Wait60FramesThenCheckAButtonHeld(void)\n{\n    if (sSaveDialogDelay == 0)\n    {\n        if (JOY_HELD(A_BUTTON))\n        {\n            return TRUE;\n        }\n        else\n        {\n            return FALSE;\n        }\n    }\n    else\n    {\n        sSaveDialogDelay--;\n        return FALSE;\n    }\n}\n\nstatic u8 SaveDialogCB_PrintAskSaveText(void)\n{\n    ClearStdWindowAndFrame(GetStartMenuWindowId(), FALSE);\n    RemoveStartMenuWindow();\n    DestroyHelpMessageWindow(0);\n    PrintSaveStats();\n    PrintSaveTextWithFollowupFunc(gText_WouldYouLikeToSaveTheGame, SaveDialogCB_AskSavePrintYesNoMenu);\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_AskSavePrintYesNoMenu(void)\n{\n    DisplayYesNoMenuDefaultYes();\n    sSaveDialogCB = SaveDialogCB_AskSaveHandleInput;\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_AskSaveHandleInput(void)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0:\n        if ((gSaveFileStatus != SAVE_STATUS_EMPTY && gSaveFileStatus != SAVE_STATUS_INVALID) || !gDifferentSaveFile)\n            sSaveDialogCB = SaveDialogCB_PrintAskOverwriteText;\n        else\n            sSaveDialogCB = SaveDialogCB_PrintSavingDontTurnOffPower;\n        break;\n    case 1:\n    case -1:\n        CloseSaveStatsWindow_();\n        CloseSaveMessageWindow();\n        return SAVECB_RETURN_CANCEL;\n    }\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_PrintAskOverwriteText(void)\n{\n    if (gDifferentSaveFile == TRUE)\n        PrintSaveTextWithFollowupFunc(gText_DifferentGameFile, SaveDialogCB_AskReplacePreviousFilePrintYesNoMenu);\n    else\n        PrintSaveTextWithFollowupFunc(gText_AlreadySaveFile_WouldLikeToOverwrite, SaveDialogCB_AskOverwritePrintYesNoMenu);\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_AskOverwritePrintYesNoMenu(void)\n{\n    DisplayYesNoMenuDefaultYes();\n    sSaveDialogCB = SaveDialogCB_AskOverwriteOrReplacePreviousFileHandleInput;\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_AskReplacePreviousFilePrintYesNoMenu(void)\n{\n    DisplayYesNoMenuDefaultNo();\n    sSaveDialogCB = SaveDialogCB_AskOverwriteOrReplacePreviousFileHandleInput;\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_AskOverwriteOrReplacePreviousFileHandleInput(void)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0:\n        sSaveDialogCB = SaveDialogCB_PrintSavingDontTurnOffPower;\n        break;\n    case 1:\n    case -1:\n        CloseSaveStatsWindow_();\n        CloseSaveMessageWindow();\n        return SAVECB_RETURN_CANCEL;\n    }\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_PrintSavingDontTurnOffPower(void)\n{\n    SaveQuestLogData();\n    PrintSaveTextWithFollowupFunc(gText_SavingDontTurnOffThePower, SaveDialogCB_DoSave);\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_DoSave(void)\n{\n    IncrementGameStat(GAME_STAT_SAVED_GAME);\n    if (gDifferentSaveFile == TRUE)\n    {\n        TrySavingData(SAVE_OVERWRITE_DIFFERENT_FILE);\n        gDifferentSaveFile = FALSE;\n    }\n    else\n    {\n        TrySavingData(SAVE_NORMAL);\n    }\n    sSaveDialogCB = SaveDialogCB_PrintSaveResult;\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_PrintSaveResult(void)\n{\n    if (gSaveAttemptStatus == SAVE_STATUS_OK)\n        PrintSaveTextWithFollowupFunc(gText_PlayerSavedTheGame, SaveDialogCB_WaitPrintSuccessAndPlaySE);\n    else\n        PrintSaveTextWithFollowupFunc(gText_SaveError_PleaseExchangeBackupMemory, SaveDialogCB_WaitPrintErrorAndPlaySE);\n    SetSaveDialogDelayTo60Frames();\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_WaitPrintSuccessAndPlaySE(void)\n{\n    if (!RunTextPrinters_CheckPrinter0Active())\n    {\n        PlaySE(SE_SAVE);\n        sSaveDialogCB = SaveDialogCB_ReturnSuccess;\n    }\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_ReturnSuccess(void)\n{\n    if (!IsSEPlaying() && SaveDialog_Wait60FramesOrAButtonHeld())\n    {\n        CloseSaveStatsWindow_();\n        return SAVECB_RETURN_OKAY;\n    }\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_WaitPrintErrorAndPlaySE(void)\n{\n    if (!RunTextPrinters_CheckPrinter0Active())\n    {\n        PlaySE(SE_BOO);\n        sSaveDialogCB = SaveDialogCB_ReturnError;\n    }\n    return SAVECB_RETURN_CONTINUE;\n}\n\nstatic u8 SaveDialogCB_ReturnError(void)\n{\n    if (!SaveDialog_Wait60FramesThenCheckAButtonHeld())\n        return SAVECB_RETURN_CONTINUE;\n    CloseSaveStatsWindow_();\n    return SAVECB_RETURN_ERROR;\n}\n\nstatic void VBlankCB_WhileSavingAfterLinkBattle(void)\n{\n    TransferPlttBuffer();\n}\n\nbool32 DoSetUpSaveAfterLinkBattle(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        SetVBlankCallback(NULL);\n        ScanlineEffect_Stop();\n        DmaFill16Defvars(3, 0, (void *)PLTT, PLTT_SIZE);\n        DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000);\n        break;\n    case 1:\n        ResetSpriteData();\n        ResetTasks();\n        ResetPaletteFade();\n        ScanlineEffect_Clear();\n        break;\n    case 2:\n        ResetBgsAndClearDma3BusyFlags(FALSE);\n        InitBgsFromTemplates(0, sBGTemplates_AfterLinkSaveMessage, NELEMS(sBGTemplates_AfterLinkSaveMessage));\n        InitWindows(sWindowTemplates_AfterLinkSaveMessage);\n        LoadStdWindowGfx(0, 0x008, BG_PLTT_ID(15));\n        break;\n    case 3:\n        ShowBg(0);\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        SetVBlankCallback(VBlankCB_WhileSavingAfterLinkBattle);\n        EnableInterrupts(INTR_FLAG_VBLANK);\n        break;\n    case 4:\n        return TRUE;\n    }\n    (*state)++;\n    return FALSE;\n}\n\nvoid CB2_SetUpSaveAfterLinkBattle(void)\n{\n    if (DoSetUpSaveAfterLinkBattle(&gMain.state))\n    {\n        CreateTask(task50_after_link_battle_save, 80);\n        SetMainCallback2(CB2_WhileSavingAfterLinkBattle);\n    }\n}\n\nstatic void CB2_WhileSavingAfterLinkBattle(void)\n{\n    RunTasks();\n    UpdatePaletteFade();\n}\n\nstatic void task50_after_link_battle_save(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!gPaletteFade.active)\n    {\n        switch (data[0])\n        {\n        case 0:\n            FillWindowPixelBuffer(0, PIXEL_FILL(1));\n            AddTextPrinterParameterized2(0, FONT_NORMAL, gText_SavingDontTurnOffThePower2, 0xFF, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY);\n            DrawTextBorderOuter(0, 0x008, 15);\n            PutWindowTilemap(0);\n            CopyWindowToVram(0, COPYWIN_FULL);\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n            if (gWirelessCommType != 0 && InUnionRoom())\n                data[0] = 5;\n            else\n                data[0] = 1;\n            break;\n        case 1:\n            SetContinueGameWarpStatusToDynamicWarp();\n            WriteSaveBlock2();\n            data[0] = 2;\n            break;\n        case 2:\n            if (WriteSaveBlock1Sector())\n            {\n                ClearContinueGameWarpStatus2();\n                data[0] = 3;\n            }\n            break;\n        case 3:\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            data[0] = 4;\n            break;\n        case 4:\n            FreeAllWindowBuffers();\n            SetMainCallback2(gMain.savedCallback);\n            DestroyTask(taskId);\n            break;\n        case 5:\n            CreateTask(Task_LinkFullSave, 5);\n            data[0] = 6;\n            break;\n        case 6:\n            if (!FuncIsActiveTask(Task_LinkFullSave))\n                data[0] = 3;\n            break;\n        }\n    }\n}\n\nstatic void PrintSaveStats(void)\n{\n    u8 y;\n    u8 x;\n    sSaveStatsWindowId = AddWindow(&sSaveStatsWindowTemplate);\n    LoadStdWindowGfx(sSaveStatsWindowId, 0x21D, BG_PLTT_ID(13));\n    DrawStdFrameWithCustomTileAndPalette(sSaveStatsWindowId, FALSE, 0x21D, 13);\n    SaveStatToString(SAVE_STAT_LOCATION, gStringVar4, 8);\n    x = (u32)(112 - GetStringWidth(FONT_NORMAL, gStringVar4, -1)) / 2;\n    AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_NORMAL, x, 0, sTextColor_LocationHeader, -1, gStringVar4);\n    x = (u32)(112 - GetStringWidth(FONT_NORMAL, gStringVar4, -1)) / 2;\n    AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 2, 14, sTextColor_StatName, -1, gSaveStatName_Player);\n    SaveStatToString(SAVE_STAT_NAME, gStringVar4, 2);\n    Menu_PrintFormatIntlPlayerName(sSaveStatsWindowId, gStringVar4, 60, 14);\n    AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 2, 28, sTextColor_StatName, -1, gSaveStatName_Badges);\n    SaveStatToString(SAVE_STAT_BADGES, gStringVar4, 2);\n    AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 60, 28, sTextColor_StatValue, -1, gStringVar4);\n    y = 42;\n    if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE)\n    {\n        AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 2, 42, sTextColor_StatName, -1, gSaveStatName_Pokedex);\n        SaveStatToString(SAVE_STAT_POKEDEX, gStringVar4, 2);\n        AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 60, 42, sTextColor_StatValue, -1, gStringVar4);\n        y = 56;\n    }\n    AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 2, y, sTextColor_StatName, -1, gSaveStatName_Time);\n    SaveStatToString(SAVE_STAT_TIME, gStringVar4, 2);\n    AddTextPrinterParameterized3(sSaveStatsWindowId, FONT_SMALL, 60, y, sTextColor_StatValue, -1, gStringVar4);\n    CopyWindowToVram(sSaveStatsWindowId, COPYWIN_GFX);\n}\n\nstatic void CloseSaveStatsWindow(void)\n{\n    ClearStdWindowAndFrame(sSaveStatsWindowId, FALSE);\n    RemoveWindow(sSaveStatsWindowId);\n}\n\nstatic void CloseStartMenu(void)\n{\n    PlaySE(SE_SELECT);\n    ClearStdWindowAndFrame(GetStartMenuWindowId(), TRUE);\n    RemoveStartMenuWindow();\n    ClearPlayerHeldMovementAndUnfreezeObjectEvents();\n    UnlockPlayerFieldControls();\n}\n\nvoid AppendToList(u8 *list, u8 *cursor, u8 newEntry)\n{\n    list[*cursor] = newEntry;\n    (*cursor)++;\n}\n"
  },
  {
    "path": "src/string_util.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n\nEWRAM_DATA u8 gStringVar1[32] = {};\nEWRAM_DATA u8 gStringVar2[20] = {};\nEWRAM_DATA u8 gStringVar3[20] = {};\nEWRAM_DATA u8 gStringVar4[1000] = {};\nEWRAM_DATA u8 gUnknownStringVar[16] = {0};\n\nstatic const u8 sDigits[] = __(\"0123456789ABCDEF\");\n\nstatic const s32 sPowersOfTen[] =\n{\n             1,\n            10,\n           100,\n          1000,\n         10000,\n        100000,\n       1000000,\n      10000000,\n     100000000,\n    1000000000,\n};\n\nextern u8 gExpandedPlaceholder_Empty[];\nextern u8 gExpandedPlaceholder_Kun[];\nextern u8 gExpandedPlaceholder_Chan[];\nextern u8 gExpandedPlaceholder_Sapphire[];\nextern u8 gExpandedPlaceholder_Ruby[];\nextern u8 gExpandedPlaceholder_Aqua[];\nextern u8 gExpandedPlaceholder_Magma[];\nextern u8 gExpandedPlaceholder_Archie[];\nextern u8 gExpandedPlaceholder_Maxie[];\nextern u8 gExpandedPlaceholder_Kyogre[];\nextern u8 gExpandedPlaceholder_Groudon[];\nextern u8 gExpandedPlaceholder_Red[];\nextern u8 gExpandedPlaceholder_Green[];\n\nu8 *StringCopy_Nickname(u8 *dest, const u8 *src)\n{\n    u32 i;\n    u32 limit = POKEMON_NAME_LENGTH;\n\n    for (i = 0; i < limit; i++)\n    {\n        dest[i] = src[i];\n\n        if (dest[i] == EOS)\n            return &dest[i];\n    }\n\n    dest[i] = EOS;\n    return &dest[i];\n}\n\nu8 *StringGet_Nickname(u8 *str)\n{\n    u32 i;\n    u32 limit = POKEMON_NAME_LENGTH;\n\n    for (i = 0; i < limit; i++)\n        if (str[i] == EOS)\n            return &str[i];\n\n    str[i] = EOS;\n    return &str[i];\n}\n\nu8 *StringCopy_PlayerName(u8 *dest, const u8 *src)\n{\n    s32 i;\n    s32 limit = PLAYER_NAME_LENGTH;\n\n    for (i = 0; i < limit; i++)\n    {\n        dest[i] = src[i];\n\n        if (dest[i] == EOS)\n            return &dest[i];\n    }\n\n    dest[i] = EOS;\n    return &dest[i];\n}\n\nu8 *StringCopy(u8 *dest, const u8 *src)\n{\n    while (*src != EOS)\n    {\n        *dest = *src;\n        dest++;\n        src++;\n    }\n\n    *dest = EOS;\n    return dest;\n}\n\nu8 *StringAppend(u8 *dest, const u8 *src)\n{\n    while (*dest != EOS)\n        dest++;\n\n    return StringCopy(dest, src);\n}\n\nu8 *StringCopyN(u8 *dest, const u8 *src, u8 n)\n{\n    u32 i;\n\n    for (i = 0; i < n; i++)\n        dest[i] = src[i];\n\n    return &dest[n];\n}\n\nu8 *StringAppendN(u8 *dest, const u8 *src, u8 n)\n{\n    while (*dest != EOS)\n        dest++;\n\n    return StringCopyN(dest, src, n);\n}\n\nu16 StringLength(const u8 *str)\n{\n    u16 length = 0;\n\n    while (str[length] != EOS)\n        length++;\n\n    return length;\n}\n\ns32 StringCompare(const u8 *str1, const u8 *str2)\n{\n    while (*str1 == *str2)\n    {\n        if (*str1 == EOS)\n            return 0;\n        str1++;\n        str2++;\n    }\n\n    return *str1 - *str2;\n}\n\ns32 StringCompareN(const u8 *str1, const u8 *str2, u32 n)\n{\n    while (*str1 == *str2)\n    {\n        if (*str1 == EOS)\n            return 0;\n        str1++;\n        str2++;\n        if (--n == 0)\n            return 0;\n    }\n\n    return *str1 - *str2;\n}\n\nu8 *ConvertIntToDecimalStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n)\n{\n    enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state;\n    s32 powerOfTen;\n    s32 largestPowerOfTen = sPowersOfTen[n - 1];\n\n    state = WAITING_FOR_NONZERO_DIGIT;\n\n    if (mode == STR_CONV_MODE_RIGHT_ALIGN)\n        state = WRITING_SPACES;\n\n    if (mode == STR_CONV_MODE_LEADING_ZEROS)\n        state = WRITING_DIGITS;\n\n    for (powerOfTen = largestPowerOfTen; powerOfTen > 0; powerOfTen /= 10)\n    {\n        u8 *out;\n        u8 c;\n        u16 digit = value / powerOfTen;\n        s32 temp = value - (powerOfTen * digit);\n\n        if (state == WRITING_DIGITS)\n        {\n            out = dest++;\n\n            if (digit <= 9)\n                c = sDigits[digit];\n            else\n                c = CHAR_QUESTION_MARK;\n\n            *out = c;\n        }\n        else if (digit != 0 || powerOfTen == 1)\n        {\n            state = WRITING_DIGITS;\n            out = dest++;\n\n            if (digit <= 9)\n                c = sDigits[digit];\n            else\n                c = CHAR_QUESTION_MARK;\n\n            *out = c;\n        }\n        else if (state == WRITING_SPACES)\n        {\n            *dest++ = CHAR_SPACE;\n        }\n\n        value = temp;\n    }\n\n    *dest = EOS;\n    return dest;\n}\n\nu8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n)\n{\n    enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state;\n    u32 i;\n    s32 powerOfSixteen;\n    s32 largestPowerOfSixteen = 1;\n\n    for (i = 1; i < n; i++)\n        largestPowerOfSixteen *= 16;\n\n    state = WAITING_FOR_NONZERO_DIGIT;\n\n    if (mode == STR_CONV_MODE_RIGHT_ALIGN)\n        state = WRITING_SPACES;\n\n    if (mode == STR_CONV_MODE_LEADING_ZEROS)\n        state = WRITING_DIGITS;\n\n    for (powerOfSixteen = largestPowerOfSixteen; powerOfSixteen > 0; powerOfSixteen /= 16)\n    {\n        u8 *out;\n        u8 c;\n        u32 digit = value / powerOfSixteen;\n        s32 temp = value % powerOfSixteen;\n\n        if (state == WRITING_DIGITS)\n        {\n            out = dest++;\n\n            if (digit <= 0xF)\n                c = sDigits[digit];\n            else\n                c = CHAR_QUESTION_MARK;\n\n            *out = c;\n        }\n        else if (digit != 0 || powerOfSixteen == 1)\n        {\n            state = WRITING_DIGITS;\n            out = dest++;\n\n            if (digit <= 0xF)\n                c = sDigits[digit];\n            else\n                c = CHAR_QUESTION_MARK;\n\n            *out = c;\n        }\n        else if (state == WRITING_SPACES)\n        {\n            *dest++ = CHAR_SPACE;\n        }\n\n        value = temp;\n    }\n\n    *dest = EOS;\n    return dest;\n}\n\nu8 *StringExpandPlaceholders(u8 *dest, const u8 *src)\n{\n    for (;;)\n    {\n        u8 c = *src++;\n        u8 placeholderId;\n        u8 *expandedString;\n\n        switch (c)\n        {\n            case PLACEHOLDER_BEGIN:\n                placeholderId = *src++;\n                expandedString = GetExpandedPlaceholder(placeholderId);\n                dest = StringExpandPlaceholders(dest, expandedString);\n                break;\n            case EXT_CTRL_CODE_BEGIN:\n                *dest++ = c;\n                c = *src++;\n                *dest++ = c;\n\n                switch (c)\n                {\n                    case 0x07:\n                    case 0x09:\n                    case 0x0F:\n                    case 0x15:\n                    case 0x16:\n                    case 0x17:\n                    case 0x18:\n                        break;\n                    case 0x04:\n                        *dest++ = *src++;\n                    case 0x0B:\n                        *dest++ = *src++;\n                    default:\n                        *dest++ = *src++;\n                }\n                break;\n            case EOS:\n                *dest = EOS;\n                return dest;\n            case 0xFA:\n            case 0xFB:\n            case 0xFE:\n            default:\n                *dest++ = c;\n        }\n    }\n}\n\nu8 *StringBraille(u8 *dest, const u8 *src)\n{\n    u8 setBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF };\n    u8 gotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF };\n\n    dest = StringCopy(dest, setBrailleFont);\n\n    for (;;)\n    {\n        u8 c = *src++;\n\n        switch (c)\n        {\n            case EOS:\n                *dest = c;\n                return dest;\n            case 0xFE:\n                dest = StringCopy(dest, gotoLine2);\n                break;\n            default:\n                *dest++ = c;\n                *dest++ = c + 0x40;\n                break;\n        }\n    }\n}\n\nstatic u8 *ExpandPlaceholder_UnknownStringVar(void)\n{\n    return gUnknownStringVar;\n}\n\nstatic u8 *ExpandPlaceholder_PlayerName(void)\n{\n    return gSaveBlock2Ptr->playerName;\n}\n\nstatic u8 *ExpandPlaceholder_StringVar1(void)\n{\n    return gStringVar1;\n}\n\nstatic u8 *ExpandPlaceholder_StringVar2(void)\n{\n    return gStringVar2;\n}\n\nstatic u8 *ExpandPlaceholder_StringVar3(void)\n{\n    return gStringVar3;\n}\n\nstatic u8 *ExpandPlaceholder_KunChan(void)\n{\n    if (gSaveBlock2Ptr->playerGender == MALE)\n        return gExpandedPlaceholder_Kun;\n    else\n        return gExpandedPlaceholder_Chan;\n}\n\nstatic u8 *ExpandPlaceholder_RivalName(void)\n{\n    if (gSaveBlock1Ptr->rivalName[0] == EOS)\n    {\n        if (gSaveBlock2Ptr->playerGender == MALE)\n            return gExpandedPlaceholder_Green;\n        else\n            return gExpandedPlaceholder_Red;\n    }\n    else\n    {\n        return gSaveBlock1Ptr->rivalName;\n    }\n}\n\nstatic u8 *ExpandPlaceholder_Version(void)\n{\n    return gExpandedPlaceholder_Ruby;\n}\n\nstatic u8 *ExpandPlaceholder_Magma(void)\n{\n    return gExpandedPlaceholder_Magma;\n}\n\nstatic u8 *ExpandPlaceholder_Aqua(void)\n{\n    return gExpandedPlaceholder_Aqua;\n}\n\nstatic u8 *ExpandPlaceholder_Maxie(void)\n{\n    return gExpandedPlaceholder_Maxie;\n}\n\nstatic u8 *ExpandPlaceholder_Archie(void)\n{\n    return gExpandedPlaceholder_Archie;\n}\n\nstatic u8 *ExpandPlaceholder_Groudon(void)\n{\n    return gExpandedPlaceholder_Groudon;\n}\n\nstatic u8 *ExpandPlaceholder_Kyogre(void)\n{\n    return gExpandedPlaceholder_Kyogre;\n}\n\nu8 *GetExpandedPlaceholder(u32 id)\n{\n    typedef u8 *(*ExpandPlaceholderFunc)(void);\n\n    static const ExpandPlaceholderFunc funcs[] =\n    {\n        [PLACEHOLDER_ID_UNKNOWN]      = ExpandPlaceholder_UnknownStringVar,\n        [PLACEHOLDER_ID_PLAYER]       = ExpandPlaceholder_PlayerName,\n        [PLACEHOLDER_ID_STRING_VAR_1] = ExpandPlaceholder_StringVar1,\n        [PLACEHOLDER_ID_STRING_VAR_2] = ExpandPlaceholder_StringVar2,\n        [PLACEHOLDER_ID_STRING_VAR_3] = ExpandPlaceholder_StringVar3,\n        [PLACEHOLDER_ID_KUN]          = ExpandPlaceholder_KunChan,\n        [PLACEHOLDER_ID_RIVAL]        = ExpandPlaceholder_RivalName,\n        [PLACEHOLDER_ID_VERSION]      = ExpandPlaceholder_Version,\n        [PLACEHOLDER_ID_MAGMA]        = ExpandPlaceholder_Magma,\n        [PLACEHOLDER_ID_AQUA]         = ExpandPlaceholder_Aqua,\n        [PLACEHOLDER_ID_MAXIE]        = ExpandPlaceholder_Maxie,\n        [PLACEHOLDER_ID_ARCHIE]       = ExpandPlaceholder_Archie,\n        [PLACEHOLDER_ID_GROUDON]      = ExpandPlaceholder_Groudon,\n        [PLACEHOLDER_ID_KYOGRE]       = ExpandPlaceholder_Kyogre,\n    };\n\n    if (id >= NELEMS(funcs))\n        return gExpandedPlaceholder_Empty;\n    else\n        return funcs[id]();\n}\n\nu8 *StringFill(u8 *dest, u8 c, u16 n)\n{\n    u32 i;\n\n    for (i = 0; i < n; i++)\n        *dest++ = c;\n\n    *dest = EOS;\n    return dest;\n}\n\nu8 *StringCopyPadded(u8 *dest, const u8 *src, u8 c, u16 n)\n{\n    while (*src != EOS)\n    {\n        *dest++ = *src++;\n\n        if (n)\n            n--;\n    }\n\n    n--;\n\n    while (n != (u16)-1)\n    {\n        *dest++ = c;\n        n--;\n    }\n\n    *dest = EOS;\n    return dest;\n}\n\nu8 *StringFillWithTerminator(u8 *dest, u16 n)\n{\n    return StringFill(dest, EOS, n);\n}\n\nu8 *StringCopyN_Multibyte(u8 *dest, const u8 *src, u32 n)\n{\n    u32 i;\n\n    for (i = n - 1; i != -1u; i--)\n    {\n        if (*src == EOS)\n        {\n            break;\n        }\n        else\n        {\n            *dest++ = *src++;\n            if (*(src - 1) == 0xF9)\n                *dest++ = *src++;\n        }\n    }\n\n    *dest = EOS;\n    return dest;\n}\n\nu32 StringLength_Multibyte(const u8 *str)\n{\n    u32 length = 0;\n\n    while (*str != EOS)\n    {\n        if (*str == 0xF9)\n            str++;\n        str++;\n        length++;\n    }\n\n    return length;\n}\n\nu8 *WriteColorChangeControlCode(u8 *dest, u32 colorType, u8 color)\n{\n    *dest = 0xFC;\n    dest++;\n\n    switch (colorType)\n    {\n    case 0:\n        *dest = 1;\n        dest++;\n        break;\n    case 1:\n        *dest = 3;\n        dest++;\n        break;\n    case 2:\n        *dest = 2;\n        dest++;\n        break;\n    }\n\n    *dest = color;\n    dest++;\n    *dest = EOS;\n    return dest;\n}\n\nu8 GetExtCtrlCodeLength(u8 code)\n{\n    static const u8 lengths[] =\n    {\n        1,\n        2,\n        2,\n        2,\n        4,\n        2,\n        2,\n        1,\n        2,\n        1,\n        1,\n        3,\n        2,\n        2,\n        2,\n        1,\n        3,\n        2,\n        2,\n        2,\n        2,\n        1,\n        1,\n        1,\n        1,\n    };\n\n    u8 length = 0;\n    if (code < NELEMS(lengths))\n        length = lengths[code];\n    return length;\n}\n\nstatic const u8 *SkipExtCtrlCode(const u8 *s)\n{\n    while (*s == 0xFC)\n    {\n        s++;\n        s += GetExtCtrlCodeLength(*s);\n    }\n\n    return s;\n}\n\ns32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2)\n{\n    s32 retVal = 0;\n\n    while (1)\n    {\n        str1 = SkipExtCtrlCode(str1);\n        str2 = SkipExtCtrlCode(str2);\n\n        if (*str1 > *str2)\n            break;\n\n        if (*str1 < *str2)\n        {\n            retVal = -1;\n            if (*str2 == 0xFF)\n                retVal = 1;\n        }\n\n        if (*str1 == 0xFF)\n            return retVal;\n\n        str1++;\n        str2++;\n    }\n\n    retVal = 1;\n\n    if (*str1 == 0xFF)\n        retVal = -1;\n\n    return retVal;\n}\n\nvoid ConvertInternationalString(u8 *s, u8 language)\n{\n    if (language == LANGUAGE_JAPANESE)\n    {\n        u32 i;\n\n        StripExtCtrlCodes(s);\n        i = StringLength(s);\n        s[i++] = 0xFC;\n        s[i++] = 22;\n        s[i++] = 0xFF;\n\n        i--;\n\n        while (i != (u32)-1)\n        {\n            s[i + 2] = s[i];\n            i--;\n        }\n\n        s[0] = 0xFC;\n        s[1] = 21;\n    }\n}\n\nvoid StripExtCtrlCodes(u8 *str)\n{\n    u16 srcIndex = 0;\n    u16 destIndex = 0;\n    while (str[srcIndex] != 0xFF)\n    {\n        if (str[srcIndex] == 0xFC)\n        {\n            srcIndex++;\n            srcIndex += GetExtCtrlCodeLength(str[srcIndex]);\n        }\n        else\n        {\n            str[destIndex++] = str[srcIndex++];\n        }\n    }\n    str[destIndex] = 0xFF;\n}\n"
  },
  {
    "path": "src/strings.c",
    "content": "#include \"global.h\"\n#include \"strings.h\"\n\nconst u8 gExpandedPlaceholder_Empty[] = _(\"\");\nconst u8 gExpandedPlaceholder_Kun[] = _(\"\");\nconst u8 gExpandedPlaceholder_Chan[] = _(\"\");\nconst u8 gExpandedPlaceholder_Sapphire[] = _(\"SAPPHIRE\");\nconst u8 gExpandedPlaceholder_Ruby[] = _(\"RUBY\");\nconst u8 gExpandedPlaceholder_Aqua[] = _(\"AQUA\");\nconst u8 gExpandedPlaceholder_Magma[] = _(\"MAGMA\");\nconst u8 gExpandedPlaceholder_Archie[] = _(\"ARCHIE\");\nconst u8 gExpandedPlaceholder_Maxie[] = _(\"MAXIE\");\nconst u8 gExpandedPlaceholder_Kyogre[] = _(\"KYOGRE\");\nconst u8 gExpandedPlaceholder_Groudon[] = _(\"GROUDON\");\nconst u8 gExpandedPlaceholder_Red[] = _(\"RED\");\nconst u8 gExpandedPlaceholder_Green[] = _(\"GREEN\");\nconst u8 gText_EggNickname[] = _(\"EGG\");\nconst u8 gText_MenuPokemon[] = _(\"POKéMON\");\nconst u8 gText_NewGame[] = _(\"NEW GAME\");\nconst u8 gText_Continue[] = _(\"CONTINUE\");\nconst u8 gUnusedText_MysteryGift[] = _(\"MYSTERY GIFT\");\nconst u8 gText_MysteryGift[] = _(\"MYSTERY GIFT\");\nconst u8 gText_WirelessNotConnected[] = _(\"The Wireless Adapter is not\\nconnected.\");\nconst u8 gText_MysteryGiftCantUse[] = _(\"MYSTERY GIFT can't be used while\\nthe Wireless Adapter is attached.\");\nconst u8 gText_SaveFileCorrupted[] = _(\"The save file is corrupted.\\pThe previous save file will be\\nloaded.\");\nconst u8 gText_SaveFileHasBeenDeleted[] = _(\"The save file has been\\ndeleted...\");\nconst u8 gText_1MSubCircuitBoardNotInstalled[] = _(\"The 1M sub-circuit board is\\nnot installed.\");\nconst u8 gText_MainMenuTime[] = _(\"TIME\");\nconst u8 gText_Controls[] = _(\"CONTROLS\");\nALIGNED(4) const u8 gText_ABUTTONNext[] = _(\"{A_BUTTON}NEXT\");\nALIGNED(4) const u8 gText_ABUTTONNext_BBUTTONBack[] = _(\"{A_BUTTON}NEXT {B_BUTTON}BACK\");\nALIGNED(4) const u8 gText_UPDOWNPick_ABUTTONNext_BBUTTONBack[] = _(\"{DPAD_UPDOWN}PICK {A_BUTTON}NEXT {B_BUTTON}CANCEL\");\nALIGNED(4) const u8 gText_UPDOWNPick_ABUTTONBBUTTONCancel[] = _(\"{DPAD_UPDOWN}PICK {A_BUTTON}{B_BUTTON}CANCEL\");\nALIGNED(4) const u8 gText_ABUTTONExit[] = _(\"{A_BUTTON}EXIT\");\nconst u8 gText_Boy[] = _(\"BOY\");\nconst u8 gText_Girl[] = _(\"GIRL\");\nconst u8 gText_PokedexTableOfContents[] = _(\"POKéDEX   TABLE OF CONTENTS\");\nconst u8 gText_PickOK[] = _(\"{SELECT_BUTTON}LAST VIEWED {DPAD_UPDOWN}PICK {A_BUTTON}OK\");\nconst u8 gText_Seen[] = _(\"Seen:\");\nconst u8 gText_Owned[] = _(\"Owned:\");\nconst u8 gText_Kanto[] = _(\"KANTO\");\nconst u8 gText_National[] = _(\"NATIONAL\");\nconst u8 gText_PokemonHabitats[] = _(\"{COLOR DYNAMIC_COLOR6}{SHADOW DYNAMIC_COLOR5}POKéMON HABITATS\");\nconst u8 gText_DexCategory_GrasslandPkmn[] = _(\"Grassland POKéMON\");\nconst u8 gText_DexCategory_ForestPkmn[] = _(\"Forest POKéMON\");\nconst u8 gText_DexCategory_WatersEdgePkmn[] = _(\"Water's-edge POKéMON\");\nconst u8 gText_DexCategory_SeaPkmn[] = _(\"Sea POKéMON\");\nconst u8 gText_DexCategory_CavePkmn[] = _(\"Cave POKéMON\");\nconst u8 gText_DexCategory_MountainPkmn[] = _(\"Mountain POKéMON\");\nconst u8 gText_DexCategory_RoughTerrainPkmn[] = _(\"Rough-terrain POKéMON\");\nconst u8 gText_DexCategory_UrbanPkmn[] = _(\"Urban POKéMON\");\nconst u8 gText_DexCategory_RarePkmn[] = _(\"Rare POKéMON\");\nconst u8 gText_Search[] = _(\"{COLOR DYNAMIC_COLOR6}{SHADOW DYNAMIC_COLOR5}SEARCH\");\nconst u8 gText_NumericalMode[] = _(\"NUMERICAL MODE\");\nconst u8 gText_AToZMode[] = _(\"A TO Z MODE\");\nconst u8 gText_PokedexOther[] = _(\"{COLOR DYNAMIC_COLOR6}{SHADOW DYNAMIC_COLOR5}OTHER\");\nconst u8 gText_ClosePokedex[] = _(\"CLOSE POKéDEX\");\nconst u8 gText_TypeMode[] = _(\"TYPE MODE\");\nconst u8 gText_LightestMode[] = _(\"LIGHTEST MODE\");\nconst u8 gText_SmallestMode[] = _(\"SMALLEST MODE\");\nconst u8 gText_PokemonList[] = _(\"{COLOR DYNAMIC_COLOR6}{SHADOW DYNAMIC_COLOR5}POKéMON LIST\");\nconst u8 gText_NumericalModeKanto[] = _(\"NUMERICAL MODE: KANTO\");\nconst u8 gText_NumericalModeNational[] = _(\"NUMERICAL MODE: NATIONAL\");\nconst u8 gText_PokemonListNoColor[] = _(\"POKéMON LIST\");\nconst u8 gText_SearchNoColor[] = _(\"SEARCH\");\nconst u8 gText_PickOKExit[] = _(\"{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}CANCEL\");\nconst u8 gText_5Dashes[] = _(\"-----\");\nconst u8 gText_PickFlipPageCheckCancel[] = _(\"{DPAD_LEFTRIGHT}PICK{PLUS}FLIP PAGE {A_BUTTON}CHECK {B_BUTTON}CANCEL\");\nconst u8 gText_PokedexPokemon[] = _(\" POKéMON\");\nconst u8 gText_HT[] = _(\"HT\");\nconst u8 gText_WT[] = _(\"WT\");\nconst u8 gText_PokedexQuotationMark[] = _(\"”\"); // Unused\nconst u8 gText_Lbs[] = _(\"lbs.\");\nconst u8 gText_Cry[] = _(\"{START_BUTTON}CRY\");\nconst u8 gText_NextDataCancel[] = _(\"{A_BUTTON}NEXT DATA {B_BUTTON}CANCEL\");\nconst u8 gText_Next[] = _(\"{A_BUTTON}NEXT\");\nconst u8 gText_CancelPreviousData[] = _(\"{A_BUTTON}CANCEL {B_BUTTON}PREVIOUS DATA\");\nconst u8 gText_Area[] = _(\"AREA\");\nconst u8 gText_Size[] = _(\"SIZE\");\nconst u8 gText_AreaUnknown[] = _(\"AREA UNKNOWN\");\nconst u8 gText_PokedexNo[] = _(\"{NO}\");\nconst u8 gText_Page[] = _(\"PAGE\");\nALIGNED(4) const u8 gText_WelcomeToHOF[] = _(\"Welcome to the HALL OF FAME!\");\nALIGNED(4) const u8 gText_HOFCorrupted[] = _(\"The HALL OF FAME data is\\ncorrupted.\");\nconst u8 gText_HOFNumber[] = _(\"HALL OF FAME No. {STR_VAR_1}\");\nconst u8 gText_LeagueChamp[] = _(\"LEAGUE CHAMPION!\\nCONGRATULATIONS!\");\nALIGNED(4) const u8 gText_Number[] = _(\"No. \");\nALIGNED(4) const u8 gText_Level[] = _(\"Lv. \");\nALIGNED(4) const u8 gText_Name[] = _(\"NAME\");\nALIGNED(4) const u8 gText_IDNumber[] = _(\"IDNo.\");\nconst u8 gText_SaveError_PleaseExchangeBackupMemory[] = _(\"Save error.\\pPlease exchange the\\nbackup memory.\");\nconst u8 gSaveStatName_Player[] = _(\"PLAYER\");\nconst u8 gSaveStatName_Badges[] = _(\"BADGES\");\nconst u8 gSaveStatName_Pokedex[] = _(\"POKéDEX\");\nconst u8 gSaveStatName_Time[] = _(\"TIME\");\nconst u8 gOtherText_Use[] = _(\"USE\");\nconst u8 gOtherText_Toss[] = _(\"TOSS\");\nconst u8 gOtherText_Register[] = _(\"REGISTER\");\nconst u8 gOtherText_Give[] = _(\"GIVE\");\nconst u8 gOtherText_Walk[] = _(\"WALK\");\nconst u8 gFameCheckerText_Cancel[] = _(\"CANCEL\");\nconst u8 gOtherText_Exit[] = _(\"EXIT\");\nconst u8 gString_Dummy[] = _(\"\");\nconst u8 gText_Item[] = _(\"ITEM\");\nconst u8 gText_Mail[] = _(\"MAIL\");\nconst u8 gText_Take[] = _(\"TAKE\");\nconst u8 gText_Store[] = _(\"STORE\");\nconst u8 gOtherText_Check[] = _(\"CHECK\");\nconst u8 gText_PokeSum_Item_None[] = _(\"NONE\");\nconst u8 gOtherText_Open[] = _(\"OPEN\");\nconst u8 gOtherText_Deselect[] = _(\"DESELECT\");\nconst u8 gText_PokeSum_DexNoUnknown[] = _(\"???\");\nconst u8 gText_FiveMarks[] = _(\"?????\");\nconst u8 gText_Slash[] = _(\"/\");\nconst u8 gText_PokeSum_OneHyphen[] = _(\"-\");\nconst u8 gText_PokeSum_TwoHyphens[] = _(\"--\");\nconst u8 gText_ThreeHyphens[] = _(\"---\");\nconst u8 gText_SevenHyphens[] = _(\"-------\");\nconst u8 gText_MaleSymbol[] = _(\"♂\");\nconst u8 gText_FemaleSymbol[] = _(\"♀\");\nconst u8 gText_Lv[] = _(\"{LV_2}\");\nconst u8 gText_NumberClear01[] = _(\"{NO}{CLEAR 0x01}\");\nconst u8 gText_Plus[] = _(\"{PLUS}\");\nconst u8 gText_Escape3[] = _(\"{ESCAPE 0x03}\"); // Unused, RIGHT_ARROW in pokeemerald\nconst u8 gText_IDNumber2[] = _(\"{ID}{NO}\");\nconst u8 gText_PokeSum_PP[] = _(\"{PP}\");\nconst u8 gText_SelectorArrow2[] = _(\"▶\");\nconst u8 gText_YesNo[] = _(\"YES\\nNO\");\nconst u8 gText_GoBackToThePreviousMenu[] = _(\"Go back to the\\nprevious menu.\");\nconst u8 gText_WhatWouldYouLikeToDo[] = _(\"What would you like to do?\");\nconst u8 gText_MenuPokedex[] = _(\"POKéDEX\");\nconst u8 gText_MenuBag[] = _(\"BAG\");\nconst u8 gText_MenuPlayer[] = _(\"{PLAYER}\");\nconst u8 gText_MenuSave[] = _(\"SAVE\");\nconst u8 gText_MenuOption[] = _(\"OPTION\");\nconst u8 gText_MenuExit[] = _(\"EXIT\");\nconst u8 gText_MenuRetire[] = _(\"RETIRE\");\nconst u8 gText_MenuSafariStats[] = _(\"{STR_VAR_1}/{STR_VAR_2}\\nBALLS  {STR_VAR_3}\");\nconst u8 gText_TimesStrVar1[] = _(\"×{STR_VAR_1}\");\nconst u8 gText_Berry[] = _(\" BERRY\");\nconst u8 gText_Coins[] = _(\"{STR_VAR_1} COINS\");\nconst u8 gText_Items2[] = _(\"ITEMS\");\nconst u8 gText_PokeBalls2[] = _(\"POKé BALLS\");\nconst u8 gText_KeyItems2[] = _(\"KEY ITEMS\");\nconst u8 gText_DepositItem[] = _(\"DEPOSIT ITEM\");\nconst u8 gText_CloseBag[] = _(\"CLOSE BAG\");\nconst u8 gText_Var1IsSelected[] = _(\"{STR_VAR_1} is\\nselected.\");\nconst u8 gText_CantWriteMailHere[] = _(\"You can't write\\nMAIL here.\");\nconst u8 gText_ThereIsNoPokemon[] = _(\"There is no\\nPOKéMON.\");\nconst u8 gOtherText_WhereShouldTheStrVar1BePlaced[] = _(\"Where should the {STR_VAR_1}\\nbe placed?\");\nconst u8 gText_ItemCantBeHeld[] = _(\"The {STR_VAR_1} can't be held.\");\nconst u8 gText_TheStrVar1CantBeHeldHere[] = _(\"The {STR_VAR_1} can't be held\\nhere.\");\nconst u8 gText_DepositHowManyStrVars1[] = _(\"Deposit how many\\n{STR_VAR_1}(s)?\");\nconst u8 gText_DepositedStrVar2StrVar1s[] = _(\"Deposited {STR_VAR_2}\\n{STR_VAR_1}(s).\");\nconst u8 gText_NoRoomToStoreItems[] = _(\"There's no room to\\nstore items.\");\nconst u8 gText_TossOutHowManyStrVar1s[] = _(\"Toss out how many\\n{STR_VAR_1}(s)?\");\nconst u8 gText_ThrewAwayStrVar2StrVar1s[] = _(\"Threw away {STR_VAR_2}\\n{STR_VAR_1}(s).\");\nconst u8 gText_ThrowAwayStrVar2OfThisItemQM[] = _(\"Throw away {STR_VAR_2} of\\nthis item?\");\nconst u8 gText_OakForbidsUseOfItemHere[] = _(\"OAK: {PLAYER}!\\nThis isn't the time to use that!{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_CantDismountBike[] = _(\"You can't dismount your BIKE here.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_ItemfinderResponding[] = _(\"Huh?\\nThe ITEMFINDER's responding!\\pThere's an item buried around here!{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_ItemfinderShakingWildly[] = _(\"Oh!\\nThe ITEMFINDER's shaking wildly!\\pThere's an item buried underfoot!\\p‥ ‥ ‥ ‥ ‥ ‥{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_NopeTheresNoResponse[] = _(\"‥ ‥ ‥ ‥Nope!\\nThere's no response.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_CoinCase[] = _(\"Your COINS:\\n{STR_VAR_1}{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PlayerUsedVar2[] = _(\"{PLAYER} used the\\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_RepelEffectsLingered[] = _(\"But the effects of a REPEL\\nlingered from earlier.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_UsedVar2WildLured[] = _(\"{PLAYER} used the\\n{STR_VAR_2}.\\pWild POKéMON will be lured.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_UsedVar2WildRepelled[] = _(\"{PLAYER} used the\\n{STR_VAR_2}.\\pWild POKéMON will be repelled.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_BoxFull[] = _(\"The BOX is full.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PowderQty[] = _(\"POWDER QUANTITY: {STR_VAR_1}{PAUSE_UNTIL_PRESS}\");\nconst u8 gOtherText_Powder[] = _(\"POWDER\");\nconst u8 gText_PlayedPokeFluteCatchy[] = _(\"Played the POKé FLUTE.\\pNow, that's a catchy tune!{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PlayedPokeFlute[] = _(\"Played the POKé FLUTE.\");\nconst u8 gText_PokeFluteAwakenedMon[] = _(\"The POKé FLUTE awakened sleeping\\nPOKéMON.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_TMCase[] = _(\"TM CASE\");\nconst u8 gText_Close[] = _(\"CLOSE\");\nconst u8 gText_TMCaseWillBePutAway[] = _(\"The TM CASE will be\\nput away.\");\nconst u8 gText_FontSmall[] = _(\"{FONT_SMALL}\");\nconst u8 gText_FontNormal[] = _(\"{FONT_NORMAL}\");\nconst u8 gText_EmptySpace[] = _(\"  \");\nconst u8 gText_BerryPouch[] = _(\"BERRY POUCH\");\nconst u8 gText_TheBerryPouchWillBePutAway[] = _(\"The BERRY POUCH will be\\nput away.\");\nconst u8 gText_ShopBuy[] = _(\"BUY\");\nconst u8 gText_ShopSell[] = _(\"SELL\");\nconst u8 gText_ShopQuit[] = _(\"SEE YA!\");\nconst u8 gText_InBagVar1[] = _(\"IN BAG:{FONT_SMALL} {STR_VAR_1}\");\nconst u8 gText_QuitShopping[] = _(\"Quit shopping.\");\nconst u8 gText_Var1CertainlyHowMany[] = _(\"{STR_VAR_1}? Certainly.\\nHow many would you like?\");\nconst u8 gText_Var1AndYouWantedVar2[] = _(\"{STR_VAR_1}, and you want {STR_VAR_2}.\\nThat will be ¥{STR_VAR_3}. Okay?\");\nconst u8 gText_HereYouGoThankYou[] = _(\"Here you are!\\nThank you!\");\nconst u8 gText_YouDontHaveMoney[] = _(\"You don't have enough money.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_NoMoreRoomForThis[] = _(\"You have no more room for this\\nitem.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_AnythingElseICanHelp[] = _(\"{COLOR BLUE}Is there anything else I can do?\");\nconst u8 gText_OhNoICantBuyThat[] = _(\"{STR_VAR_1}? Oh, no.\\nI can't buy that.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_HowManyWouldYouLikeToSell[] = _(\"{STR_VAR_1}?\\nHow many would you like to sell?\");\nconst u8 gText_ICanPayThisMuch_WouldThatBeOkay[] = _(\"I can pay ¥{STR_VAR_3}.\\nWould that be okay?\");\nconst u8 gText_TurnedOverItemsWorthYen[] = _(\"Turned over the {STR_VAR_1}シSス\\nworth ¥{STR_VAR_3}.\");\nconst u8 gText_PokedollarVar1[] = _(\"¥{STR_VAR_1}\");\nconst u8 gText_Shift[] = _(\"SHIFT\");\nconst u8 gText_SendOut[] = _(\"SEND OUT\");\nconst u8 gText_Switch2[] = _(\"SWITCH\");\nconst u8 gText_Summary5[] = _(\"SUMMARY\");\nconst u8 gText_Enter[] = _(\"ENTER\");\nconst u8 gText_NoEntry[] = _(\"NO ENTRY\");\nconst u8 gText_Take2[] = _(\"TAKE\");\nconst u8 gText_Read2[] = _(\"READ\");\nconst u8 gText_Trade4[] = _(\"TRADE\");\nconst u8 gText_ItemEffect_HP[] = _(\"HP\");\nconst u8 gText_ItemEffect_SpAtk[] = _(\"SP. ATK\");\nconst u8 gText_ItemEffect_SpDef[] = _(\"SP. DEF\");\nconst u8 gText_PartyMenu_OK[] = _(\"OK\");\nconst u8 gText_Empty[] = _(\"\");\nconst u8 gText_PauseUntilPress[] = _(\"{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_WontHaveEffect[] = _(\"It won't have any effect.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_CantBeUsedOnPkmn[] = _(\"This can't be used on\\nthat POKéMON.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnCantSwitchOut[] = _(\"{STR_VAR_1} can't be switched\\nout!{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnAlreadyInBattle[] = _(\"{STR_VAR_1} is already\\nin battle!{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnAlreadySelected[] = _(\"{STR_VAR_1} has already been\\nselected.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnHasNoEnergy[] = _(\"{STR_VAR_1} has no energy\\nleft to battle!{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_CantSwitchWithAlly[] = _(\"You can't switch {STR_VAR_1}'s\\nPOKéMON with one of yours!{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_EggCantBattle[] = _(\"An EGG can't battle!{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_CantUseUntilNewBadge[] = _(\"This can't be used until a new\\nBADGE is obtained.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_CantUseUntilNewHM[] = _(\"This can't be used until a new\\nHM item is obtained.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_NoMoreThanThreeMayEnter[] = _(\"No more than three POKéMON\\nmay enter.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_NoMoreThanTwoMayEnter[] = _(\"No more than two POKéMON\\nmay enter.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_SendMailToPC[] = _(\"Send the removed MAIL to\\nyour PC?\");\nconst u8 gText_MailSentToPC[] = _(\"The MAIL was sent to your PC.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PCMailboxFull[] = _(\"Your PC's MAILBOX is full.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_MailMessageWillBeLost[] = _(\"If the MAIL is removed, the\\nmessage will be lost. Okay?\");\nconst u8 gText_RemoveMailBeforeItem[] = _(\"MAIL must be removed before\\nholding an item.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnWasGivenItem[] = _(\"{STR_VAR_1} was given the\\n{STR_VAR_2} to hold.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnAlreadyHoldingItemSwitch[] = _(\"{STR_VAR_1} is already holding\\none {STR_VAR_2}.\\pWould you like to switch the\\ntwo items?\");\nconst u8 gText_PkmnNotHolding[] = _(\"{STR_VAR_1} isn't holding\\nanything.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_ReceivedItemFromPkmn[] = _(\"Received the {STR_VAR_2}\\nfrom {STR_VAR_1}.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_MailTakenFromPkmn[] = _(\"MAIL was taken from the\\nPOKéMON.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_SwitchedPkmnItem[] = _(\"The {STR_VAR_2} was taken and\\nreplaced with the {STR_VAR_1}.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnHoldingItemCantHoldMail[] = _(\"This POKéMON is holding an\\nitem. It cannot hold MAIL.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_MailTransferredFromMailbox[] = _(\"MAIL was transferred from\\nthe MAILBOX.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_BagFullCouldNotRemoveItem[] = _(\"The {STR_VAR_1} is full. The POKéMON's\\nitem could not be removed.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnLearnedMove3[] = _(\"{STR_VAR_1} learned\\n{STR_VAR_2}!\");\nconst u8 gText_PkmnCantLearnMove[] = _(\"{STR_VAR_1} and {STR_VAR_2}\\nare not compatible.\\p{STR_VAR_2} can't be\\nlearned.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnNeedsToReplaceMove[] = _(\"{STR_VAR_1} wants to learn the\\nmove {STR_VAR_2}.\\pHowever, {STR_VAR_1} already\\nknows four moves.\\pShould a move be deleted and\\nreplaced with {STR_VAR_2}?\");\nconst u8 gText_StopLearningMove2[] = _(\"Stop trying to teach\\n{STR_VAR_2}?\");\nconst u8 gText_MoveNotLearned[] = _(\"{STR_VAR_1} did not learn the\\nmove {STR_VAR_2}.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_WhichMoveToForget[] = _(\"Which move should be forgotten?{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_12PoofForgotMove[] = _(\"1, {PAUSE 0x0F}2, and{PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}{PLAY_SE SE_BALL_BOUNCE_1}Poof!\\p{STR_VAR_1} forgot how to\\nuse {STR_VAR_2}.\\pAnd...{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnAlreadyKnows[] = _(\"{STR_VAR_1} already knows\\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnHPRestoredByVar2[] = _(\"{STR_VAR_1}'s HP was restored\\nby {STR_VAR_2} point(s).{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnCuredOfPoison[] = _(\"{STR_VAR_1} was cured of its\\npoisoning.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnCuredOfParalysis[] = _(\"{STR_VAR_1} was cured of\\nparalysis.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnWokeUp2[] = _(\"{STR_VAR_1} woke up.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnBurnHealed[] = _(\"{STR_VAR_1}'s burn was healed.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnThawedOut[] = _(\"{STR_VAR_1} was thawed out.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PPWasRestored[] = _(\"PP was restored.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnBecameHealthy[] = _(\"{STR_VAR_1} became healthy.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_MovesPPIncreased[] = _(\"{STR_VAR_1}'s PP increased.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnElevatedToLvVar2[] = _(\"{STR_VAR_1} was elevated to\\nLv. {STR_VAR_2}.\");\nconst u8 gText_PkmnBaseVar2StatIncreased[] = _(\"{STR_VAR_1}'s base {STR_VAR_2}\\nstat was raised.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnSnappedOutOfConfusion[] = _(\"{STR_VAR_1} snapped out of its\\nconfusion.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnGotOverInfatuation[] = _(\"{STR_VAR_1} got over its\\ninfatuation.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_OnlyPkmnForBattle[] = _(\"That's your only\\nPOKéMON for battle.\");\nALIGNED(4) const u8 gText_PkmnCantBeTradedNow[] = _(\"That POKéMON can't be traded\\nnow.\");\nALIGNED(4) const u8 gText_EggCantBeTradedNow[] = _(\"An EGG can't be traded now.\");\nALIGNED(4) const u8 gText_OtherTrainersPkmnCantBeTraded[] = _(\"The other TRAINER's POKéMON\\ncan't be traded now.\");\nALIGNED(4) const u8 gText_OtherTrainerCantAcceptPkmn[] = _(\"The other TRAINER can't accept\\nthat POKéMON now.\");\nALIGNED(4) const u8 gText_CantTradeWithTrainer[] = _(\"You can't trade with that\\nTRAINER now.\");\nALIGNED(4) const u8 gText_NotPkmnOtherTrainerWants[] = _(\"That isn't the type of POKéMON\\nthat the other TRAINER wants.\");\nALIGNED(4) const u8 gText_ThatIsntAnEgg[] = _(\"That isn't an EGG.\");\nconst u8 gText_ChoosePokemon[] = _(\"Choose a POKéMON.\");\nconst u8 gText_MoveToWhere[] = _(\"Move to where?\");\nconst u8 gText_TeachWhichPokemon[] = _(\"Teach which POKéMON?\");\nconst u8 gText_UseOnWhichPokemon[] = _(\"Use on which POKéMON?\");\nconst u8 gText_GiveToWhichPokemon[] = _(\"Give to which POKéMON?\");\nconst u8 gText_DoWhatWithPokemon[] = _(\"Do what with this {PKMN}?\");\nconst u8 gText_NothingToCut[] = _(\"There's nothing to CUT.\");\nconst u8 gText_CantSurfHere[] = _(\"No SURFING here!\");\nconst u8 gText_AlreadySurfing[] = _(\"You're already SURFING.\");\nconst u8 gText_CantUseHere[] = _(\"Can't use that here.\");\nconst u8 gText_RestoreWhichMove[] = _(\"Restore which move?\");\nconst u8 gText_BoostPp[] = _(\"Boost PP of which?\");\nconst u8 gText_DoWhatWithItem[] = _(\"Do what with an item?\");\nconst u8 gText_NoPokemonForBattle[] = _(\"No battling this way!\");\nconst u8 gText_ChoosePokemon2[] = _(\"Choose a POKéMON.\");\nconst u8 gText_NotEnoughHp[] = _(\"Not enough HP‥\");\nconst u8 gText_ThreePkmnAreNeeded[] = _(\"Three {PKMN} are needed.\");\nconst u8 gText_PokemonCantBeSame[] = _(\"{PKMN} can't be the same.\");\nconst u8 gText_NoIdenticalHoldItems[] = _(\"No same hold items!\");\nconst u8 gText_CurrentIsTooFast[] = _(\"The current is much too fast!\");\nconst u8 gText_DoWhatWithMail[] = _(\"Do what with the MAIL?\");\nconst u8 gText_ChoosePokemonCancel[] = _(\"Choose POKéMON or CANCEL.\");\nconst u8 gText_ChoosePokemonConfirm[] = _(\"Choose POKéMON and confirm.\");\nconst u8 gText_TwoPokemonAreNeeded[] = _(\"Two POKéMON are needed.\");\nconst u8 gText_EnjoyCycling[] = _(\"Let's enjoy cycling!\");\nconst u8 gText_InUseAlready_PM[] = _(\"This is in use already.\");\nconst u8 gText_NoUse[] = _(\"No use.\");\nconst u8 gText_Able[] = _(\"ABLE\");\nconst u8 gText_First_PM[] = _(\"FIRST\");\nconst u8 gText_Second_PM[] = _(\"SECOND\");\nconst u8 gText_Third_PM[] = _(\"THIRD\");\nconst u8 gText_Able2[] = _(\"ABLE\");\nconst u8 gText_NotAble[] = _(\"NOT ABLE\");\nconst u8 gText_Able3[] = _(\"ABLE!\");\nconst u8 gText_NotAble2[] = _(\"NOT ABLE!\");\nconst u8 gText_Learned[] = _(\"LEARNED\");\nconst u8 gText_OakImportantToGetToKnowPokemonThroughly[] = _(\"OAK: It's important to get to know\\nyour POKéMON thoroughly.\\p\");\nconst u8 gText_OakThisIsListOfPokemon[] = _(\"This is a list of your POKéMON,\\n{PLAYER}.\\pOpen this to check the skills\\nand moves of your POKéMON.\\pYou also choose POKéMON here if\\nyou want to use an item on one.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_CutATreeOrGrass[] = _(\"Cut a tree or grass.\");\nconst u8 gText_FlyToAKnownTown[] = _(\"Fly to a known town.\");\nconst u8 gText_TravelOnWater[] = _(\"Travel on water.\");\nconst u8 gText_MoveHeavyBoulders[] = _(\"Move heavy boulders.\");\nconst u8 gText_LightUpDarkness[] = _(\"Light up darkness.\");\nconst u8 gText_ShatterACrackedRock[] = _(\"Shatter a cracked rock.\");\nconst u8 gText_ClimbAWaterfall[] = _(\"Climb a waterfall.\");\nconst u8 gText_EscapeFromHere[] = _(\"Escape from here.\");\nconst u8 gText_LureWildPokemon[] = _(\"Lure wild POKéMON.\");\nconst u8 gText_ShareHp[] = _(\"Share HP.\");\nconst u8 gText_ReturnToAHealingSpot[] = _(\"Return to a healing spot.\");\nconst u8 gText_DiveUnderwater[] = _(\"Dive underwater.\");\nconst u8 gText_EscapeFromHereAndReturnTo[] = _(\"Want to escape from here and return\\nto {STR_VAR_1}?\");\nconst u8 gText_ReturnToHealingSpot[] = _(\"Want to return to the healing spot\\nused last in {STR_VAR_1}?\");\nconst u8 gText_ItemEffect_Attack[] = _(\"ATTACK\");\nconst u8 gText_ItemEffect_Defense[] = _(\"DEFENSE\");\nconst u8 gText_ItemEffect_Speed[] = _(\"SPEED\");\nconst u8 gText_PkmnCantParticipate[] = _(\"That POKéMON can't participate.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_CancelParticipation[] = _(\"Cancel participation?\");\nconst u8 gText_Empty12[] = _(\"\");\nconst u8 gText_CancelBattle[] = _(\"Cancel the battle?\");\nconst u8 gText_TurnOff[] = _(\"TURN OFF\");\nconst u8 gText_ItemStorage[] = _(\"ITEM STORAGE\");\nconst u8 gText_Mailbox[] = _(\"MAILBOX\");\nconst u8 gText_DepositItem2[] = _(\"DEPOSIT ITEM\");\nconst u8 gText_WithdrawItem2[] = _(\"WITHDRAW ITEM\");\nconst u8 gText_StoreItemsInThePC[] = _(\"Store items in the PC.\");\nconst u8 gText_TakeOutItemsFromThePC[] = _(\"Take out items from the PC.\");\nconst u8 gText_ThereAreNoItems[] = _(\"There are no items.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_NoMoreRoomInBag[] = _(\"There is no more\\nroom in the BAG.\");\nconst u8 gText_WithdrawHowMany[] = _(\"Withdraw how many\\n{STR_VAR_1}(s)?\");\nconst u8 gText_WithdrewQuantItem[] = _(\"Withdrew {STR_VAR_2}\\n{STR_VAR_1}(s).\");\nconst u8 gOtherText_Read[] = _(\"READ\");\nconst u8 gOtherText_MoveToBag[] = _(\"MOVE TO BAG\");\nconst u8 gOtherText_Give2[] = _(\"GIVE\");\nconst u8 gText_TheresNoMailHere[] = _(\"There's no MAIL here.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_WhatWouldYouLikeToDoWithPlayersMail[] = _(\"What would you like to do with\\n{STR_VAR_1}'s MAIL?\");\nconst u8 gText_MessageWillBeLost[] = _(\"The message will be lost.\\nIs that okay?\");\nconst u8 gText_BagIsFull[] = _(\"The BAG is full.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_MailReturnedToBagMessageErased[] = _(\"The MAIL was returned to the BAG\\nwith its message erased.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_WithdrawItem[] = _(\"WITHDRAW\\nITEM\");\nconst u8 gText_Withdraw[] = _(\"WITHDRAW\");\nconst u8 gText_ReturnToPC[] = _(\"Return to the PC.\");\nconst u8 gText_LtSurge[] = _(\"LT. SURGE\");\nconst u8 gText_Koga[] = _(\"KOGA\");\nconst u8 gText_Info[] = _(\"INFO\");\nconst u8 gText_Eggs[] = _(\"EGGS\");\nconst u8 gText_HallOfFame[] = _(\"HALL OF FAME\");\nconst u8 gText_Victories[] = _(\"VICTORIES\");\nconst u8 gText_Quit[] = _(\"QUIT\");\nconst u8 gText_Psn[] = _(\"PSN\");\nconst u8 gText_Par[] = _(\"PAR\");\nconst u8 gText_Slp[] = _(\"SLP\");\nconst u8 gText_Brn[] = _(\"BRN\");\nconst u8 gText_Frz[] = _(\"FRZ\");\nconst u8 gText_Toxic[] = _(\"TOXIC\");\nconst u8 gText_OK[] = _(\"OK\");\nconst u8 gOtherText_Quit[] = _(\"QUIT\");\nconst u8 gText_Yes[] = _(\"YES\");\nconst u8 gText_No[] = _(\"NO\");\nconst u8 gText_SingleBattle[] = _(\"SINGLE BATTLE\");\nconst u8 gText_DoubleBattle[] = _(\"DOUBLE BATTLE\");\nconst u8 gText_MultiBattle[] = _(\"MULTI BATTLE\");\nconst u8 gText_MakeAChallenge[] = _(\"CHALLENGE\");\nconst u8 gText_Lv50[] = _(\"LV. 50\");\nconst u8 gText_Lv100[] = _(\"OPEN LEVEL\");\nconst u8 gText_OpenLv[] = _(\"OPEN LV.\");\nconst u8 gText_Info_2[] = _(\"INFO\");\nconst u8 gOtherText_BattleTowerResults[] = _(\"{PLAYER}'s BATTLE TOWER RESULTS\");\nconst u8 gOtherText_Current[] = _(\"CURRENT\");\nconst u8 gOtherText_Prev[] = _(\"PREV.\");\nconst u8 gOtherText_Record[] = _(\"RECORD\");\nconst u8 gOtherText_WinStreak[] = _(\"WIN STREAK: {STR_VAR_1}\");\nconst u8 gText_FreshWater_200[] = _(\"FRESH WATER{CLEAR_TO 0x57}{FONT_SMALL}¥200\");\nconst u8 gText_SodaPop_300[] = _(\"SODA POP{CLEAR_TO 0x57}{FONT_SMALL}¥300\");\nconst u8 gText_Lemonade_350[] = _(\"LEMONADE{CLEAR_TO 0x57}{FONT_SMALL}¥350\");\nconst u8 gText_50Coins_1000[] = _(\"{FONT_SMALL}  50 COINS{CLEAR_TO 0x45}¥1,000\");\nconst u8 gText_500Coins_10000[] = _(\"{FONT_SMALL} 500 COINS{CLEAR_TO 0x40}¥10,000\");\nconst u8 gText_1000Coins_20000[] = _(\"{FONT_SMALL}1000 COINS{CLEAR_TO 0x40}¥20,000\");\nconst u8 gText_Excellent[] = _(\"Excellent\");\nconst u8 gText_NotSoBad[] = _(\"Not so bad\");\nconst u8 gText_RedShard[] = _(\"RED SHARD\");\nconst u8 gText_YellowShard[] = _(\"YELLOW SHARD\");\nconst u8 gText_BlueShard[] = _(\"BLUE SHARD\");\nconst u8 gText_GreenShard[] = _(\"GREEN SHARD\");\nconst u8 gText_Right[] = _(\"Right\");\nconst u8 gText_Left[] = _(\"Left\");\nconst u8 gText_Tm13_4000Coins[] = _(\"TM13{CLEAR_TO 0x48}{FONT_SMALL}4,000 COINS\");\nconst u8 gText_Tm23_3500Coins[] = _(\"TM23{CLEAR_TO 0x48}{FONT_SMALL}3,500 COINS\");\nconst u8 gText_Tm24_4000Coins[] = _(\"TM24{CLEAR_TO 0x48}{FONT_SMALL}4,000 COINS\");\nconst u8 gText_Tm30_4500Coins[] = _(\"TM30{CLEAR_TO 0x48}{FONT_SMALL}4,500 COINS\");\nconst u8 gText_Tm35_4000Coins[] = _(\"TM35{CLEAR_TO 0x48}{FONT_SMALL}4,000 COINS\");\nconst u8 gText_1F_2[] = _(\"1F\");\nconst u8 gText_2F_2[] = _(\"2F\");\nconst u8 gText_3F_2[] = _(\"3F\");\nconst u8 gText_4F_2[] = _(\"4F\");\nconst u8 gText_5F_2[] = _(\"5F\");\nconst u8 gText_Cool[] = _(\"COOL\");\nconst u8 gText_Beauty[] = _(\"BEAUTY\");\nconst u8 gText_Cute[] = _(\"CUTE\");\nconst u8 gText_Smart[] = _(\"SMART\");\nconst u8 gText_Tough[] = _(\"TOUGH\");\nconst u8 gText_Normal[] = _(\"NORMAL\");\nconst u8 gText_Black[] = _(\"BLACK\");\nconst u8 gText_Pink[] = _(\"PINK\");\nconst u8 gText_Sepia[] = _(\"SEPIA\");\nconst u8 gText_Cool_2[] = _(\"COOL\");\nconst u8 gText_Beauty_2[] = _(\"BEAUTY\");\nconst u8 gText_Cute_2[] = _(\"CUTE\");\nconst u8 gText_Smart_2[] = _(\"SMART\");\nconst u8 gText_Tough_2[] = _(\"TOUGH\");\nconst u8 gText_Items[] = _(\"ITEMS\");\nconst u8 gText_KeyItems[] = _(\"KEY ITEMS\");\nconst u8 gText_PokeBalls[] = _(\"POKé BALLS\");\nconst u8 gText_TMsAndHMs[] = _(\"TMs & HMs\");\nconst u8 gText_Berries[] = _(\"BERRIES\");\nconst u8 gText_Boulderbadge[] = _(\"BOULDERBADGE\");\nconst u8 gText_Cascadebadge[] = _(\"CASCADEBADGE\");\nconst u8 gText_Thunderbadge[] = _(\"THUNDERBADGE\");\nconst u8 gText_Rainbowbadge[] = _(\"RAINBOWBADGE\");\nconst u8 gText_Soulbadge[] = _(\"SOULBADGE\");\nconst u8 gText_Marshbadge[] = _(\"MARSHBADGE\");\nconst u8 gText_Volcanobadge[] = _(\"VOLCANOBADGE\");\nconst u8 gText_Earthbadge[] = _(\"EARTHBADGE\");\nconst u8 gText_SomeoneSPc[] = _(\"SOMEONE'S PC\");\nconst u8 gText_BillSPc[] = _(\"BILL'S PC\");\nconst u8 gText_SPc[] = _(\"{PLAYER}'s PC\");\nconst u8 gText_HallOfFame_2[] = _(\"HALL OF FAME\");\nconst u8 gText_LogOff[] = _(\"LOG OFF\");\nconst u8 gText_ProfOakSPc[] = _(\"PROF. OAK's PC\");\nconst u8 gText_Eevee[] = _(\"EEVEE\");\nconst u8 gText_Flareon[] = _(\"FLAREON\");\nconst u8 gText_Jolteon[] = _(\"JOLTEON\");\nconst u8 gText_Vaporeon[] = _(\"VAPOREON\");\nconst u8 gText_QuitLooking[] = _(\"Quit looking.\");\nconst u8 gText_FreshWater[] = _(\"FRESH WATER\");\nconst u8 gText_SodaPop[] = _(\"SODA POP\");\nconst u8 gText_Lemonade[] = _(\"LEMONADE\");\nconst u8 gText_Coins_2[] = _(\"COINS\");\nconst u8 gText_Bicycle_Price[] = _(\"BICYCLE{CLEAR_TO 0x49}{FONT_SMALL}¥1,000,000\");\nconst u8 gText_NoThanks[] = _(\"NO THANKS\");\nconst u8 gText_Abra_180Coins[] = _(\"ABRA{CLEAR_TO 0x55}{FONT_SMALL} 180 COINS\");\nconst u8 gText_Clefairy_500Coins[] = _(\"CLEFAIRY{CLEAR_TO 0x55}{FONT_SMALL} 500 COINS\");\nconst u8 gText_Dratini_2800Coins[] = _(\"DRATINI{CLEAR_TO 0x4B}{FONT_SMALL} 2,800 COINS\");\nconst u8 gText_Scyther_5500Coins[] = _(\"SCYTHER{CLEAR_TO 0x4B}{FONT_SMALL} 5,500 COINS\");\nconst u8 gText_Porygon_9999Coins[] = _(\"PORYGON{CLEAR_TO 0x4B}{FONT_SMALL} 9,999 COINS\");\nconst u8 gText_Abra_120Coins[] = _(\"ABRA{CLEAR_TO 0x55}{FONT_SMALL} 120 COINS\");\nconst u8 gText_Clefairy_750Coins[] = _(\"CLEFAIRY{CLEAR_TO 0x55}{FONT_SMALL} 750 COINS\");\nconst u8 gText_Pinsir_2500Coins[] = _(\"PINSIR{CLEAR_TO 0x4B}{FONT_SMALL} 2,500 COINS\");\nconst u8 gText_Dratini_4600Coins[] = _(\"DRATINI{CLEAR_TO 0x4B}{FONT_SMALL} 4,600 COINS\");\nconst u8 gText_Porygon_6500Coins[] = _(\"PORYGON{CLEAR_TO 0x4B}{FONT_SMALL} 6,500 COINS\");\nconst u8 gText_NoThanks_2[] = _(\"NO THANKS\");\nconst u8 gText_HelixFossil[] = _(\"HELIX FOSSIL\");\nconst u8 gText_DomeFossil[] = _(\"DOME FOSSIL\");\nconst u8 gText_OldAmber[] = _(\"OLD AMBER\");\nconst u8 gText_TradeCenter[] = _(\"TRADE CENTER\");\nconst u8 gText_Colosseum[] = _(\"COLOSSEUM\");\nconst u8 gText_GameLinkCable[] = _(\"Game Link cable\");\nconst u8 gText_Wireless[] = _(\"Wireless\");\nconst u8 gText_ItemsPocket[] = _(\"ITEMS POCKET\");\nconst u8 gText_KeyItemsPocket[] = _(\"KEY ITEMS POCKET\");\nconst u8 gText_PokeBallsPocket[] = _(\"POKé BALLS POCKET\");\nconst u8 gText_TmCase[] = _(\"TM CASE\");\nconst u8 gText_BerryPouch_2[] = _(\"BERRY POUCH\");\nconst u8 gText_Other[] = _(\"OTHER\");\nconst u8 gText_OneIsland[] = _(\"ONE ISLAND\");\nconst u8 gText_TwoIsland[] = _(\"TWO ISLAND\");\nconst u8 gText_ThreeIsland[] = _(\"THREE ISLAND\");\nconst u8 gText_FourIsland[] = _(\"FOUR ISLAND\");\nconst u8 gText_FiveIsland[] = _(\"FIVE ISLAND\");\nconst u8 gText_SixIsland[] = _(\"SIX ISLAND\");\nconst u8 gText_SevenIsland[] = _(\"SEVEN ISLAND\");\nconst u8 gText_Vermilion[] = _(\"VERMILION\");\nconst u8 gText_Colosseum_2[] = _(\"COLOSSEUM\");\nconst u8 gText_BerryCrush[] = _(\"BERRY CRUSH\");\nconst u8 gText_RecordCorner[] = _(\"\"); // Dummied\nconst u8 gText_PokemonJump[] = _(\"POKéMON JUMP\");\nconst u8 gText_DodrioBerryPicking[] = _(\"DODRIO BERRY-PICKING\");\nconst u8 gText_2Tinymushrooms[] = _(\"2 TINYMUSHROOMS\");\nconst u8 gText_1BigMushroom[] = _(\"1 BIG MUSHROOM\");\nconst u8 gText_SeviiIslands[] = _(\"SEVII ISLANDS\");\nconst u8 gText_NavelRock[] = _(\"NAVEL ROCK\");\nconst u8 gText_FarawayIsland[] = _(\"FARAWAY ISLAND\");\nconst u8 gText_BirthIsland[] = _(\"BIRTH ISLAND\");\nconst u8 gText_SouthernIsland[] = _(\"SOUTHERN ISLAND\");\nconst u8 gText_MiracleSeed_1000Coins[] = _(\"MIRACLE SEED{CLEAR_TO 0x50}{FONT_SMALL}1,000 COINS\");\nconst u8 gText_Charcoal_1000Coins[] = _(\"CHARCOAL{CLEAR_TO 0x50}{FONT_SMALL}1,000 COINS\");\nconst u8 gText_MysticWater_1000Coins[] = _(\"MYSTIC WATER{CLEAR_TO 0x50}{FONT_SMALL}1,000 COINS\");\nconst u8 gText_YellowFlute_1600Coins[] = _(\"YELLOW FLUTE{CLEAR_TO 0x50}{FONT_SMALL}1,600 COINS\");\nconst u8 gText_SmokeBall_800Coins[] = _(\"SMOKE BALL{CLEAR_TO 0x5A}{FONT_SMALL}800 COINS\");\nconst u8 gText_BecomeLeader[] = _(\"BECOME LEADER\");\nconst u8 gText_JoinGroup[] = _(\"JOIN GROUP\");\nconst u8 gOtherText_Single[] = _(\"SINGLE\");\nconst u8 gOtherText_Double[] = _(\"DOUBLE\");\nconst u8 gOtherText_Knockout[] = _(\"KNOCKOUT\");\nconst u8 gOtherText_Mixed[] = _(\"MIXED\");\nconst u8 gText_DecimalPoint[] = _(\".\");\nconst u8 gText_BigGuy[] = _(\"Big guy\");\nconst u8 gText_BigGirl[] = _(\"Big girl\");\nconst u8 gText_Son[] = _(\"son\");\nconst u8 gText_Daughter[] = _(\"daughter\");\nconst u8 gText_BoulderBadge[] = _(\"BOULDERBADGE\");\nconst u8 gText_CascadeBadge[] = _(\"CASCADEBADGE\");\nconst u8 gText_ThunderBadge[] = _(\"THUNDERBADGE\");\nconst u8 gText_RainbowBadge[] = _(\"RAINBOWBADGE\");\nconst u8 gText_SoulBadge[] = _(\"SOULBADGE\");\nconst u8 gText_MarshBadge[] = _(\"MARSHBADGE\");\nconst u8 gText_VolcanoBadge[] = _(\"VOLCANOBADGE\");\nconst u8 gText_EarthBadge[] = _(\"EARTHBADGE\");\nconst u8 gText_1F[] = _(\"1F\");\nconst u8 gText_2F[] = _(\"2F\");\nconst u8 gText_3F[] = _(\"3F\");\nconst u8 gText_4F[] = _(\"4F\");\nconst u8 gText_5F[] = _(\"5F\");\nconst u8 gText_6F[] = _(\"6F\");\nconst u8 gText_7F[] = _(\"7F\");\nconst u8 gText_8F[] = _(\"8F\");\nconst u8 gText_9F[] = _(\"9F\");\nconst u8 gText_10F[] = _(\"10F\");\nconst u8 gText_11F[] = _(\"11F\");\nconst u8 gText_B1F[] = _(\"B1F\");\nconst u8 gText_B2F[] = _(\"B2F\");\nconst u8 gText_B3F[] = _(\"B3F\");\nconst u8 gText_B4F[] = _(\"B4F\");\nconst u8 gText_Rooftop[] = _(\"ROOFTOP\");\nconst u8 gText_NowOn[] = _(\"Now on:\");\nconst u8 gText_LinkedGamePlay[] = _(\"LINKED GAME PLAY\");\nconst u8 gText_DirectCorner[] = _(\"DIRECT CORNER\");\nconst u8 gText_UnionRoom[] = _(\"UNION ROOM\");\nconst u8 gText_Energypowder_50[] = _(\"ENERGYPOWDER{CLEAR_TO 0x74}{FONT_SMALL}50\");\nconst u8 gText_EnergyRoot_80[] = _(\"ENERGY ROOT{CLEAR_TO 0x74}{FONT_SMALL}80\");\nconst u8 gText_HealPowder_50[] = _(\"HEAL POWDER{CLEAR_TO 0x74}{FONT_SMALL}50\");\nconst u8 gText_RevivalHerb_300[] = _(\"REVIVAL HERB{CLEAR_TO 0x6F}{FONT_SMALL}300\");\nconst u8 gText_Protein_1000[] = _(\"PROTEIN{CLEAR_TO 0x65}{FONT_SMALL}1,000\");\nconst u8 gText_Iron_1000[] = _(\"IRON{CLEAR_TO 0x65}{FONT_SMALL}1,000\");\nconst u8 gText_Carbos_1000[] = _(\"CARBOS{CLEAR_TO 0x65}{FONT_SMALL}1,000\");\nconst u8 gText_Calcium_1000[] = _(\"CALCIUM{CLEAR_TO 0x65}{FONT_SMALL}1,000\");\nconst u8 gText_Zinc_1000[] = _(\"ZINC{CLEAR_TO 0x65}{FONT_SMALL}1,000\");\nconst u8 gText_HpUp_1000[] = _(\"HP UP{CLEAR_TO 0x65}{FONT_SMALL}1,000\");\nconst u8 gText_PpUp_3000[] = _(\"PP UP{CLEAR_TO 0x65}{FONT_SMALL}3,000\");\nconst u8 gString_BattleRecords_PlayersBattleResults[] = _(\"{PLAYER}'s BATTLE RESULTS\");\nconst u8 gString_BattleRecords_TotalRecord[] = _(\"TOTAL RECORD W:{STR_VAR_1} L:{STR_VAR_2} D:{STR_VAR_3}\");\nconst u8 gString_BattleRecords_ColumnHeaders[] = _(\"WIN{CLEAR_TO 0x30}LOSE{CLEAR_TO 0x60}DRAW\");\nconst u8 gString_BattleRecords_7Dashes[] = _(\"-------\");\nconst u8 gString_BattleRecords_4Dashes[] = _(\"----\");\nconst u8 gFameCheckerText_FameCheckerWillBeClosed[] = _(\"The FAME CHECKER will be closed.\");\nconst u8 gFameCheckerText_ClearTextbox[] = _(\"\\n                              \");\nconst u8 gText_ExitUnused[] = _(\"やめる\");\nconst u8 gText_ExitFromBox[] = _(\"Exit from the BOX.\");\nconst u8 gText_WhatDoYouWantToDo[] = _(\"What do you want to do?\");\nconst u8 gText_PleasePickATheme[] = _(\"Please pick a theme.\");\nconst u8 gText_PickTheWallpaper[] = _(\"Pick the wallpaper.\");\nconst u8 gText_PkmnIsSelected[] = _(\"{DYNAMIC 0x00} is selected.\");\nconst u8 gText_JumpToWhichBox[] = _(\"Jump to which BOX?\");\nconst u8 gText_DepositInWhichBox[] = _(\"Deposit in which BOX?\");\nconst u8 gText_PkmnWasDeposited[] = _(\"{DYNAMIC 0x00} was deposited.\");\nconst u8 gText_BoxIsFull2[] = _(\"The BOX is full.\");\nconst u8 gText_ReleaseThisPokemon[] = _(\"Release this POKéMON?\");\nconst u8 gText_PkmnWasReleased[] = _(\"{DYNAMIC 0x00} was released.\");\nconst u8 gText_ByeByePkmn[] = _(\"Bye-bye, {DYNAMIC 0x00}!\");\nconst u8 gText_MarkYourPkmn[] = _(\"Mark your POKéMON.\");\nconst u8 gText_ThatsYourLastPkmn[] = _(\"That's your last POKéMON!\");\nconst u8 gText_YourPartysFull[] = _(\"Your party's full!\");\nconst u8 gText_YoureHoldingAPkmn[] = _(\"You're holding a POKéMON!\");\nconst u8 gText_WhichOneWillYouTake[] = _(\"Which one will you take?\");\nconst u8 gText_YouCantReleaseAnEgg[] = _(\"You can't release an EGG.\");\nconst u8 gText_ContinueBoxOperations[] = _(\"Continue BOX operations?\");\nconst u8 gText_PkmnCameBack[] = _(\"{DYNAMIC 0x00} came back!\");\nconst u8 gText_WasItWorriedAboutYou[] = _(\"Was it worried about you?\");\nconst u8 gText_FourEllipsesExclamation[] = _(\"‥ ‥ ‥ ‥ ‥!\");\nconst u8 gText_PleaseRemoveTheMail[] = _(\"Please remove the MAIL.\");\nconst u8 gText_GiveToAPkmn[] = _(\"GIVE to a POKéMON?\");\nconst u8 gText_PlacedItemInBag[] = _(\"Placed item in the BAG.\");\nconst u8 gText_BagIsFull2[] = _(\"The BAG is full.\");\nconst u8 gText_PutItemInBag[] = _(\"Put this item in the BAG?\");\nconst u8 gText_ItemIsNowHeld[] = _(\"{DYNAMIC 0x00} is now held.\");\nconst u8 gText_ChangedToNewItem[] = _(\"Changed to {DYNAMIC 0x00}.\");\nconst u8 gText_MailCantBeStored[] = _(\"MAIL can't be stored!\");\nconst u8 gPCText_Cancel[] = _(\"CANCEL\");\nconst u8 gPCText_Store[] = _(\"STORE\");\nconst u8 gPCText_Withdraw[] = _(\"WITHDRAW\");\nconst u8 gPCText_Shift[] = _(\"SHIFT\");\nconst u8 gPCText_Move[] = _(\"MOVE\");\nconst u8 gPCText_Place[] = _(\"PLACE\");\nconst u8 gPCText_Summary[] = _(\"SUMMARY\");\nconst u8 gPCText_Release[] = _(\"RELEASE\");\nconst u8 gPCText_Mark[] = _(\"MARK\");\nconst u8 gPCText_Name[] = _(\"NAME\");\nconst u8 gPCText_Jump[] = _(\"JUMP\");\nconst u8 gPCText_Wallpaper[] = _(\"WALLPAPER\");\nconst u8 gPCText_Take[] = _(\"TAKE\");\nconst u8 gPCText_Give[] = _(\"GIVE\");\nconst u8 gPCText_Switch[] = _(\"SWITCH\");\nconst u8 gPCText_Bag[] = _(\"BAG\");\nconst u8 gPCText_Info[] = _(\"INFO\");\nconst u8 gPCText_Scenery1[] = _(\"SCENERY 1\");\nconst u8 gPCText_Scenery2[] = _(\"SCENERY 2\");\nconst u8 gPCText_Scenery3[] = _(\"SCENERY 3\");\nconst u8 gPCText_Etcetera[] = _(\"ETCETERA\");\nconst u8 gPCText_Forest[] = _(\"FOREST\");\nconst u8 gPCText_City[] = _(\"CITY\");\nconst u8 gPCText_Desert[] = _(\"DESERT\");\nconst u8 gPCText_Savanna[] = _(\"SAVANNA\");\nconst u8 gPCText_Crag[] = _(\"CRAG\");\nconst u8 gPCText_Volcano[] = _(\"VOLCANO\");\nconst u8 gPCText_Snow[] = _(\"SNOW\");\nconst u8 gPCText_Cave[] = _(\"CAVE\");\nconst u8 gPCText_Beach[] = _(\"BEACH\");\nconst u8 gPCText_Seafloor[] = _(\"SEAFLOOR\");\nconst u8 gPCText_River[] = _(\"RIVER\");\nconst u8 gPCText_Sky[] = _(\"SKY\");\nconst u8 gPCText_PolkaDot[] = _(\"STARS\");\nconst u8 gPCText_Pokecenter[] = _(\"POKéCENTER\");\nconst u8 gPCText_Machine[] = _(\"TILES\");\nconst u8 gPCText_Simple[] = _(\"SIMPLE\");\nconst u8 gText_WithdrawPokemon[] = _(\"WITHDRAW POKéMON\");\nconst u8 gText_DepositPokemon[] = _(\"DEPOSIT POKéMON\");\nconst u8 gText_MovePokemon[] = _(\"MOVE POKéMON\");\nconst u8 gText_MoveItems[] = _(\"MOVE ITEMS\");\nconst u8 gText_SeeYa[] = _(\"SEE YA!\");\nconst u8 gText_WithdrawMonDescription[] = _(\"You can withdraw a POKéMON if you\\nhave any in a BOX.\");\nconst u8 gText_DepositMonDescription[] = _(\"You can deposit your party\\nPOKéMON in any BOX.\");\nconst u8 gText_MoveMonDescription[] = _(\"You can move POKéMON that are\\nstored in any BOX.\");\nconst u8 gText_MoveItemsDescription[] = _(\"You can move items held by any\\nPOKéMON in a BOX or your party.\");\nconst u8 gText_SeeYaDescription[] = _(\"See you later!\");\nconst u8 gText_JustOnePkmn[] = _(\"Can't deposit the last POKéMON!\");\nconst u8 gText_PartyFull[] = _(\"Can't take any more POKéMON.\");\nconst u8 gText_Box[] = _(\"BOX\");\nconst u8 gText_CombineFourWordsOrPhrases[] = _(\"Combine four words or phrases\");\nconst u8 gText_AndMakeYourProfile[] = _(\"and make your profile.\");\nconst u8 gText_MakeMessageSixPhrases[] = _(\"Make a message of six phrases.\");\nconst u8 gText_MaxTwoTwelveLetterPhrases[] = _(\"Max two 12-letter phrases/line.\");\nconst u8 gText_FindWordsThatDescribeYour[] = _(\"Find words that describe your\");\nconst u8 gText_FeelingsRightNow[] = _(\"feelings right now.\");\nconst u8 gText_CombineNineWordsOrPhrases[] = _(\"Combine nine words or phrases\");\nconst u8 gText_AndMakeAMessage[] = _(\"and make a message.\");\nconst u8 gText_ChangeJustOneWordOrPhrase[] = _(\"Change just one word or phrase\");\nconst u8 gText_AndImproveTheBardsSong[] = _(\"and improve the BARD's song.\");\nconst u8 gText_AndFillOutTheQuestionnaire[] = _(\"and fill out the questionnaire.\");\nconst u8 gText_YourProfile[] = _(\"Your profile\");\nconst u8 gText_YourFeelingAtTheBattlesStart[] = _(\"Your feeling at the battle's start\");\nconst u8 gText_WhatYouSayIfYouWin[] = _(\"What you say if you win a battle\");\nconst u8 gText_WhatYouSayIfYouLose[] = _(\"What you say if you lose a battle\");\nconst u8 gText_TheAnswer[] = _(\"The answer\");\nconst u8 gText_TheMailMessage[] = _(\"The MAIL message\");\nconst u8 gText_TheNewSong[] = _(\"The new song\");\nconst u8 gText_CombineTwoWordsOrPhrases[] = _(\"Combine two words or phrases\");\nconst u8 gText_AndMakeATrendySaying[] = _(\"and make a trendy saying.\");\nconst u8 gText_TheTrendySaying[] = _(\"The trendy saying\");\nconst u8 gText_IsAsShownOkay[] = _(\"is as shown. Okay?\");\nconst u8 gText_AllTextBeingEditedWill[] = _(\"All the text being edited will\");\nconst u8 gText_BeDeletedThatOkay[] = _(\"be deleted. Is that okay?\");\nconst u8 gText_QuitEditing[] = _(\"Quit editing?\");\nconst u8 gText_StopGivingPkmnMail[] = _(\"Stop giving the POKéMON MAIL?\");\nconst u8 gText_Profile[] = _(\"PROFILE\");\nconst u8 gText_AtTheBattlesStart[] = _(\"At the battle's start:\");\nconst u8 gText_UponWinningABattle[] = _(\"Upon winning a battle:\");\nconst u8 gText_UponLosingABattle[] = _(\"Upon losing a battle:\");\nconst u8 gText_TheBardsSong[] = _(\"The BARD's Song\");\nconst u8 gText_WhatsHipAndHappening[] = _(\"What's hip and happening?\");\nconst u8 gText_Interview[] = _(\"Interview\");\nconst u8 gText_Questionnaire[] = _(\"QUESTIONNAIRE\");\nconst u8 gText_PokemonCenter[] = _(\"POKéMON CENTER\");\nconst u8 gText_SaveFailedCheckingBackup[] = _(\"Save failed.\\nChecking the backup memory‥\\nPlease wait.\\n“Time required:\\nabout 1 minute”\");\nconst u8 gText_BackupMemoryDamaged[] = _(\"The backup memory is damaged or\\nthe game's battery has run dry.\\nThe game can be played, but its\\nprogress cannot be saved.\\n“Please press the A Button.”\");\nconst u8 gText_SaveCompletePressA[] = _(\"Save completed.\\n“Please press the A Button.”\");\nconst u8 gText_YourName[] = _(\"YOUR NAME?\");\nconst u8 gText_BoxName[] = _(\"BOX NAME?\");\nconst u8 gText_PkmnsNickname[] = _(\"'s nickname?\");\nconst u8 gText_RivalsName[] = _(\"RIVAL's NAME?\");\nconst u8 gText_MoveOkBack[] = _(\"{DPAD_ANY}MOVE {A_BUTTON}OK {B_BUTTON}BACK\");\nconst u8 gText_AlphabetUpperLower[] = _(\"\");\nconst u8 gText_RegionMap_Space[] = _(\" \");\nconst u8 gText_RegionMap_AButtonGuide[] = _(\"{A_BUTTON}GUIDE\");\nconst u8 gText_RegionMap_AButtonCancel[] = _(\"{A_BUTTON}CANCEL\");\nconst u8 gText_RegionMap_AButtonCancel2[] = _(\"{A_BUTTON}CANCEL\");\nconst u8 gText_RegionMap_AButtonSwitch[] = _(\"{A_BUTTON}SWITCH\");\nconst u8 gText_RegionMap_AButtonOK[] = _(\"{A_BUTTON}OK\");\nconst u8 gText_RegionMap_DPadMove[] = _(\"{DPAD_ANY}MOVE\");\nconst u8 gText_RegionMap_UpDownPick[] = _(\"{DPAD_UPDOWN}PICK\");\nconst u8 gText_RegionMap_NoData[] = _(\"No data\");\nconst u8 gText_RegionMap_AreaDesc_ViridianForest[] = _(\"A deep and sprawling forest that\\nextends around VIRIDIAN CITY.\\nA natural maze, many people\\nbecome lost inside.\");\nconst u8 gText_RegionMap_AreaDesc_MtMoon[] = _(\"A mystical mountain that is known\\nfor its frequent meteor falls.\\nThe shards of stars that fall\\nhere are known as MOON STONES.\");\nconst u8 gText_RegionMap_AreaDesc_DiglettsCave[] = _(\"A seemingly plain tunnel that was\\ndug by wild DIGLETT.\\nIt is famous for connecting\\nROUTES 2 and 11.\");\nconst u8 gText_RegionMap_AreaDesc_VictoryRoad[] = _(\"A tunnel situated on ROUTE 23.\\nIt earned its name because it\\nmust be traveled by all TRAINERS\\naiming for the top.\");\nconst u8 gText_RegionMap_AreaDesc_PokemonMansion[] = _(\"A decrepit, burned-down mansion\\non CINNABAR ISLAND.\\nIt got its name because a famous\\nPOKéMON researcher lived there.\");\nconst u8 gText_RegionMap_AreaDesc_SafariZone[] = _(\"An amusement park outside FUCHSIA\\nCITY where many rare POKéMON can\\nbe observed in the wild.\\nCatch them in a popular game!\");\nconst u8 gText_RegionMap_AreaDesc_RockTunnel[] = _(\"A naturally formed underground\\ntunnel. Because it has not been\\ndeveloped, it is inky dark inside.\\nA light is needed to get through.\");\nconst u8 gText_RegionMap_AreaDesc_SeafoamIslands[] = _(\"A pair of islands that is situated\\non ROUTE 20.\\nThe two islands are shaped the\\nsame, as if they were twins.\");\nconst u8 gText_RegionMap_AreaDesc_PokemonTower[] = _(\"A tower that houses the graves of\\ncountless POKéMON.\\nMany people visit it daily to pay\\ntheir respects to the fallen.\");\nconst u8 gText_RegionMap_AreaDesc_CeruleanCave[] = _(\"A mysterious cave that is filled\\nwith terribly tough POKéMON.\\nIt is so dangerous, the POKéMON\\nLEAGUE is in charge of it.\");\nconst u8 gText_RegionMap_AreaDesc_PowerPlant[] = _(\"A power plant that was abandoned\\nyears ago, though some of the\\nmachines still work. It is infested\\nwith electric POKéMON.\");\nconst u8 gText_RegionMap_AreaDesc_MtEmber[] = _(\"Supposedly an inactive volcano.\\nHowever, there are persistent\\nreports that the peak blazes\\nwith fire at night.\");\nconst u8 gText_RegionMap_AreaDesc_BerryForest[] = _(\"A forest on a small islet off the\\ncoast of THREE ISLAND. BERRIES\\ngrow wildly in profusion, quickly\\nreplenishing those that fall off.\");\nconst u8 gText_RegionMap_AreaDesc_IcefallCave[] = _(\"A cave which is covered by water\\nand ice on FOUR ISLAND.\\nIt seems like the end of the cave\\nis connected to the ocean.\");\nconst u8 gText_RegionMap_AreaDesc_LostCave[] = _(\"A bewildering cave off the coast\\nof RESORT GORGEOUS.\\nSome curious thrill seekers have\\nnever emerged from it.\");\nconst u8 gText_RegionMap_AreaDesc_TanobyRuins[] = _(\"An ancient ruin that is rumored to\\nbe home to a peculiar POKéMON.\\nHowever, so far, the POKéMON\\nremains an unconfirmed rumor.\");\nconst u8 gText_RegionMap_AreaDesc_AlteringCave[] = _(\"This island has been known by this\\nname since the distant past.\\nNo one today knows where it got\\nthis name, however.\");\nconst u8 gText_RegionMap_AreaDesc_PatternBush[] = _(\"A lush and bush-like area. \\nIn it are patterns where no grass\\ngrows. Some study it in the belief\\nthat a secret is concealed.\");\nconst u8 gText_RegionMap_AreaDesc_DottedHole[] = _(\"A mysterious, just-discovered\\nruin from an ancient time.\\nIt got its name from the six dots\\non its door.\");\nconst u8 gText_PokeSum_MetInATrade[] = _(\"{DYNAMIC 0x00} nature.\\nMet in a trade.\");\nconst u8 gText_PokeSum_MetInATrade_BoldGentleGrammar[] = _(\"{DYNAMIC 0x00} nature.\\nMet in a trade.\");\nconst u8 gText_PokeSum_FatefulEncounterMet[] = _(\"{DYNAMIC 0x00} nature.\\nMet in a fateful encounter when\\nat {LV_2} {DYNAMIC 0x01}.\");\nconst u8 gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar[] = _(\"{DYNAMIC 0x00} nature.\\nMet in a fateful encounter when\\nat {LV_2} {DYNAMIC 0x01}.\");\nconst u8 gText_PokeSum_Met[] = _(\"{DYNAMIC 0x00} nature.\\nMet in {DYNAMIC 0x02} at {LV_2} {DYNAMIC 0x01}.\");\nconst u8 gText_PokeSum_Met_BoldGentleGrammar[] = _(\"{DYNAMIC 0x00} nature.\\nMet in {DYNAMIC 0x02} at {LV_2} {DYNAMIC 0x01}.\");\nconst u8 gText_PokeSum_ApparentlyMet[] = _(\"{DYNAMIC 0x00} nature.\\nApparently met in {DYNAMIC 0x02}\\nat {LV_2} {DYNAMIC 0x01}.\");\nconst u8 gText_PokeSum_ApparentlyMet_BoldGentleGrammar[] = _(\"{DYNAMIC 0x00} nature.\\nApparently met in {DYNAMIC 0x02}\\nat {LV_2} {DYNAMIC 0x01}.\");\nconst u8 gText_PokeSum_Hatched[] = _(\"{DYNAMIC 0x00} nature.\\nHatched: {DYNAMIC 0x02}\\nat {LV_2} {DYNAMIC 0x01}.\");\nconst u8 gText_PokeSum_Hatched_BoldGentleGrammar[] = _(\"{DYNAMIC 0x00} nature.\\nHatched: {DYNAMIC 0x02}\\nat {LV_2} {DYNAMIC 0x01}.\");\nconst u8 gText_PokeSum_JP_ApparentlyHatched[] = _(\"{DYNAMIC 0x00}なせいかく {LV_2}{DYNAMIC 0x01}のとき\\n{DYNAMIC 0x02}で かえった ようだ\");\nconst u8 gText_PokeSum_JP_ApparentlyHatched_BoldGentleGrammar[] = _(\"{DYNAMIC 0x00}せいかく {LV_2}{DYNAMIC 0x01}のとき\\n{DYNAMIC 0x02}で かえった ようだ\");\nconst u8 gText_PokeSum_FatefulEncounterHatched[] = _(\"{DYNAMIC 0x00} nature. Met in a fateful\\nencounter (hatched: {DYNAMIC 0x02}\\nat {LV_2} {DYNAMIC 0x01}).\");\nconst u8 gText_PokeSum_FatefulEncounterHatched_BoldGentleGrammar[] = _(\"{DYNAMIC 0x00} nature. Met in a fateful\\nencounter (hatched: {DYNAMIC 0x02}\\nat {LV_2} {DYNAMIC 0x01}).\");\nconst u8 gText_PokeSum_ApparentlyFatefulEncounterHatched[] = _(\"{DYNAMIC 0x00} nature. Apparently met in\\na fateful encounter (hatched:\\n{DYNAMIC 0x02} at {LV_2} {DYNAMIC 0x01}).\");\nconst u8 gText_PokeSum_ApparentlyFatefulEncounterHatched_BoldGentleGrammar[] = _(\"{DYNAMIC 0x00} nature. Apparently met in\\na fateful encounter (hatched:\\n{DYNAMIC 0x02} at {LV_2} {DYNAMIC 0x01}).\");\nconst u8 gText_PokeSum_EggOrigin_DayCare[] = _(\"An odd POKéMON EGG found by the\\nDAY-CARE couple.\");\nconst u8 gText_PokeSum_EggOrigin_TravelingMan[] = _(\"An odd POKéMON EGG obtained from\\nthe traveling man.\");\nconst u8 gText_PokeSum_EggOrigin_NicePlace[] = _(\"A wondrously peculiar POKéMON EGG\\nobtained at a nice place.\");\nconst u8 gText_PokeSum_EggOrigin_Spa[] = _(\"An odd POKéMON EGG obtained from\\nan old woman at the SPA.\");\nconst u8 gText_PokeSum_EggOrigin_Trade[] = _(\"A peculiar POKéMON EGG obtained\\nin a trade.\");\nconst u8 gText_PokeSum_EggHatch_LongTime[] = _(\"It looks like this\\nEGG will take a\\nlong time to hatch.\");\nconst u8 gText_PokeSum_EggHatch_SomeTime[] = _(\"What will hatch\\nfrom this? It will\\ntake some time.\");\nconst u8 gText_PokeSum_EggHatch_Soon[] = _(\"It occasionally\\nmoves. It should\\nhatch soon.\");\nconst u8 gText_PokeSum_EggHatch_AlmostReady[] = _(\"It's making sounds.\\nIt's almost ready\\nto hatch!\");\nconst u8 gText_PokeSum_ATrade[] = _(\"a trade\");\nconst u8 gText_Somewhere[] = _(\"Somewhere\");\nconst u8 gText_PokeSum_PageName_PokemonInfo[] = _(\"POKéMON INFO\");\nconst u8 gText_PokeSum_PageName_PokemonSkills[] = _(\"POKéMON SKILLS\");\nconst u8 gText_PokeSum_PageName_KnownMoves[] = _(\"KNOWN MOVES\");\nconst u8 gText_PokeSum_NoData[] = _(\"No data\");\nconst u8 gText_PokeSum_ExpPoints[] = _(\"EXP. POINTS\");\nconst u8 gText_PokeSum_NextLv[] = _(\"NEXT LV.\");\nconst u8 gText_PokeSum_Controls_PageCancel[] = _(\"{DPAD_RIGHT}PAGE {A_BUTTON}CANCEL\");\nconst u8 gText_PokeSum_Controls_Cancel[] = _(\"{A_BUTTON}CANCEL\");\nconst u8 gText_PokeSum_Controls_Page[] = _(\"{DPAD_LEFTRIGHT}PAGE\");\nconst u8 gText_PokeSum_Controls_PageDetail[] = _(\"{DPAD_LEFT}PAGE {A_BUTTON}DETAIL\");\nconst u8 gText_PokeSum_Controls_PickSwitch[] = _(\"{DPAD_UPDOWN}PICK {A_BUTTON}SWITCH\");\nconst u8 gText_PokeSum_Controls_Pick[] = _(\"{DPAD_UPDOWN}PICK\");\nconst u8 gText_PokeSum_Controls_PickDelete[] = _(\"{DPAD_UPDOWN}PICK {A_BUTTON}DELETE\");\nconst u8 gText_PokeSum_HmMovesCantBeForgotten[] = _(\"HM moves can't be\\nforgotten now.\");\nconst u8 gText_TrainerCardName[] = _(\"NAME: \");\nconst u8 gText_TrainerCardIDNo[] = _(\"IDNo.\");\nconst u8 gText_TrainerCardMoney[] = _(\"MONEY\");\nconst u8 gText_TrainerCardYen[] = _(\"¥\");\nconst u8 gText_TrainerCardPokedex[] = _(\"POKéDEX\");\nconst u8 gText_TrainerCardNull[] = _(\"\");\nconst u8 gText_Colon2[] = _(\":\");\nconst u8 gText_TrainerCardTime[] = _(\"TIME\");\nconst u8 gText_Var1sTrainerCard[] = _(\"'s TRAINER CARD\");\nconst u8 gText_HallOfFameDebut[] = _(\"HALL OF FAME DEBUT  \");\nconst u8 gText_LinkBattles[] = _(\"LINK BATTLES\");\nconst u8 gText_LinkCableBattles[] = _(\"LINK CABLE BATTLES\");\nconst u8 gText_WinLossRatio[] = _(\"W:{CLEAR_TO 0x30}L:\");\nconst u8 gText_PokemonTrades[] = _(\"POKéMON TRADES\");\nconst u8 gText_UnionRoomTradesBattles[] = _(\"UNION TRADES & BATTLES\");\nconst u8 gText_BerryCrushes[] = _(\"BERRY CRUSH\");\nconst u8 gText_WaitingTrainerFinishReading[] = _(\"Waiting for the other TRAINER to\\nfinish reading your TRAINER CARD.\");\nconst u8 gText_Option[] = _(\"OPTION\");\nconst u8 gText_TextSpeed[] = _(\"TEXT SPEED\");\nconst u8 gText_BattleScene[] = _(\"BATTLE SCENE\");\nconst u8 gText_BattleStyle[] = _(\"BATTLE STYLE\");\nconst u8 gText_Sound[] = _(\"SOUND\");\nconst u8 gText_ButtonMode[] = _(\"BUTTON MODE\");\nconst u8 gText_Frame[] = _(\"FRAME\");\nconst u8 gText_OptionMenuCancel[] = _(\"CANCEL\");\nconst u8 gText_OptionMenuSaveAndExit[]= _(\"SAVE AND EXIT\");\nconst u8 gText_OptionMenuBattleAnimSpeed[] = _(\"BATTLE ANIM SPEED\");\nconst u8 gText_BattleTransitions[] = _(\"BATTLE TRANSITIONS\");\nconst u8 gText_BattleIntroAnimation[] = _(\"BATTLE INTRO ANIM\");\nconst u8 gText_MoveAnims[] = _(\"MOVE ANIMATIONS\");\nconst u8 gText_HpBarAnimSpeed[] = _(\"HP BAR ANIM SPEED\");\nconst u8 gText_ExpBarAnimSpeed[] = _(\"EXP. BAR ANIM SPEED\");\nconst u8 gText_Back[] = _(\"BACK\");\nconst u8 gText_Advanced[] = _(\"ADVANCED KEYS\");\nconst u8 gText_TextSpeedSlow[] = _(\"SLOW\");\nconst u8 gText_TextSpeedMid[] = _(\"MID\");\nconst u8 gText_TextSpeedFast[] = _(\"FAST\");\nconst u8 gText_TextSpeedFaster[] = _(\"FASTER\");\nconst u8 gText_BattleScenePressA[] = _(\"PRESS {FONT_A_BUTTON}\");\nconst u8 gText_BattleSceneOn[] = _(\"ON\");\nconst u8 gText_BattleSceneOff[] = _(\"OFF\");\nconst u8 gText_BattleStylePredict[] = _(\"PREDICT\");\nconst u8 gText_BattleStyleShift[] = _(\"SWITCH\");\nconst u8 gText_BattleStyleSet[] = _(\"SET\");\nconst u8 gText_SoundMono[] = _(\"MONO\");\nconst u8 gText_SoundStereo[] = _(\"STEREO\");\nconst u8 gText_ButtonTypeHelp[] = _(\"HELP\");\nconst u8 gText_ButtonTypeLEqualsA[] = _(\"L=A\");\nconst u8 gText_ButtonTypeLR[] = _(\"LR\");\nconst u8 gText_FrameType[] = _(\"TYPE\");\nconst u8 gText_PickSwitchCancelA[] = _(\"{A_BUTTON}GO {L_BUTTON}HELP{CLEAR 13}{DPAD_UPDOWN}PICK {DPAD_LEFTRIGHT}SWITCH{CLEAR 13}{B_BUTTON}SAVE & EXIT\");\nconst u8 gText_PickSwitchCancel[] = _(\"{L_BUTTON}HELP{CLEAR 13}{DPAD_UPDOWN}PICK {DPAD_LEFTRIGHT}SWITCH{CLEAR 13}{B_BUTTON}SAVE & EXIT\");\nconst u8 gText_PickSwitchExit[] = _(\"{L_BUTTON}HELP{CLEAR 13}{DPAD_UPDOWN}PICK {DPAD_LEFTRIGHT}SWITCH {A_BUTTON}{B_BUTTON}SAVE & EXIT\");\nconst u8 gText_PickSwitchBack[] = _(\"{L_BUTTON}HELP{CLEAR 13}{DPAD_UPDOWN}PICK {DPAD_LEFTRIGHT}SWITCH{CLEAR 40}{A_BUTTON}{B_BUTTON}BACK\");\nconst u8 gText_SavingDontTurnOffThePower2[] = _(\"SAVING…\\nDON'T TURN OFF THE POWER.\");\nconst u8 gText_TextSpeedInstant[] = _(\"INSTANT\");\n\n// Start menu option descriptions\nconst u8 gStartMenuDesc_Pokedex[] = _(\"A device that records POKéMON secrets\\nupon meeting or catching them.\");\nconst u8 gStartMenuDesc_Pokemon[] = _(\"Check and organize POKéMON that are\\ntraveling with you in your party.\");\nconst u8 gStartMenuDesc_Bag[] = _(\"Equipped with pockets for storing items\\nyou bought, received, or found.\");\nconst u8 gStartMenuDesc_Player[] = _(\"Check your money and other game data.\");\nconst u8 gStartMenuDesc_Save[] = _(\"Save your game with a complete record\\nof your progress to take a break.\");\nconst u8 gStartMenuDesc_Option[] = _(\"Adjust various game settings such as text\\nspeed, game rules, etc.\");\nconst u8 gStartMenuDesc_Exit[] = _(\"Close this MENU window.\");\nconst u8 gStartMenuDesc_Retire[] = _(\"Retire from the SAFARI GAME and return to\\nthe registration counter.\");\n\n#include \"data/text/quest_log.h\"\n\nconst u8 gText_WasUsedOn[] = _(\" was used on\\n\");\nconst u8 gText_Period[] = _(\".\");\nconst u8 gText_LevelRoseTo[] = _(\"'s level rose to\\n\");\nconst u8 gText_Period2[] = _(\".\");\nconst u8 gText_LevelUp_MaxHP[] = _(\"{FONT_SMALL}MAX.{FONT_NORMAL} HP\");\nconst u8 gText_LevelUp_Attack[] = _(\"ATTACK\");\nconst u8 gText_LevelUp_Defense[] = _(\"DEFENSE\");\nconst u8 gText_LevelUp_Speed[] = _(\"SPEED\");\nconst u8 gText_LevelUp_SpAtk[] = _(\"SP. ATK\");\nconst u8 gText_LevelUp_SpDef[] = _(\"SP. DEF\");\nconst u8 gText_LevelUp_Plus[] = _(\"{FONT_SMALL}{PLUS}{FONT_NORMAL}\");\nconst u8 gText_LevelUp_Minus[] = _(\"{FONT_SMALL}-{FONT_NORMAL}\");\nconst u8 gText_Counting_1[] = _(\"1, \");\nconst u8 gText_Counting_2And[] = _(\"2, and ‥ ‥ ‥ \");\nconst u8 gText_Poof[] = _(\"Poof!\\p\");\nconst u8 gText_MonForgotMove[] = _(\"{DYNAMIC 0x00} forgot\\n{DYNAMIC 0x01}.\\p\");\nconst u8 gText_And[] = _(\"And‥\\p\");\nconst u8 gText_MachineSet[] = _(\"Machine set!\\p\");\nconst u8 gText_Huh[] = _(\"Huh?\");\nconst u8 gText_MonLearnedTMHM[] = _(\"{DYNAMIC 0x00} learned\\n{DYNAMIC 0x01}!\");\nconst u8 gText_Upper[] = _(\"UPPER\");\nconst u8 gText_Lower[] = _(\"lower\");\nconst u8 gText_Others[] = _(\"OTHERS\");\nconst u8 gText_Symbols[] = _(\"SYMBOLS\");\nconst u8 gText_Register2[] = _(\"REGISTER\");\nconst u8 gText_Exit[] = _(\"EXIT\");\nconst u8 gText_QuitChatting[] = _(\"Quit chatting?\");\nconst u8 gText_RegisterTextWhere[] = _(\"Register text where?\");\nconst u8 gText_RegisterTextHere[] = _(\"Register text here?\");\nconst u8 gText_InputText[] = _(\"Input text.\");\nconst u8 gText_F700JoinedChat[] = _(\"{DYNAMIC 0x00} joined the chat!\");\nconst u8 gText_F700LeftChat[] = _(\"{DYNAMIC 0x00} left the chat.\");\nconst u8 gText_ExitingTheChat[] = _(\"Exiting the chat‥\");\nconst u8 gText_LeaderHasLeftEndingChat[] = _(\"The LEADER, {DYNAMIC 0x00}, has\\nleft, ending the chat.\");\nconst u8 gText_RegisteredTextChanged_OKtoSave[] = _(\"The registered text has been changed.\\nIs it okay to save the game?\");\nconst u8 gText_RegisteredTextChanged_AlreadySavedFile[] = _(\"There is already a saved file.\\nIs it okay to overwrite it?\");\nconst u8 gText_RegisteredTextChanged_SavingDontTurnOff[] = _(\"SAVING‥\\nDON'T TURN OFF THE POWER.\");\nconst u8 gText_RegisteredTextChanged_SavedTheGame[] = _(\"{DYNAMIC 0x00} saved the game.\");\nconst u8 gText_IfLeaderLeavesChatWillEnd[] = _(\"If the LEADER leaves, the chat\\nwill end. Is that okay?\");\nconst u8 gText_Hello[] = _(\"HELLO\");\nconst u8 gText_Pokemon2[] = _(\"POKéMON\");\nconst u8 gText_Trade[] = _(\"TRADE\");\nconst u8 gText_Battle[] = _(\"BATTLE\");\nconst u8 gText_Lets[] = _(\"LET'S\");\nconst u8 gText_Ok[] = _(\"OK!\");\nconst u8 gText_Sorry[] = _(\"SORRY\");\nconst u8 gText_YaySmileEmoji[] = _(\"YAY{EMOJI_BIGSMILE}\");\nconst u8 gText_ThankYou[] = _(\"THANK YOU\");\nconst u8 gText_ByeBye[] = _(\"BYE-BYE!\");\nconst u8 gText_PlayerScurriedToCenter[] = _(\"{PLAYER} scurried to a POKéMON CENTER,\\nprotecting the exhausted and fainted\\nPOKéMON from further harm‥\\p\");\nconst u8 gText_PlayerScurriedBackHome[] = _(\"{PLAYER} scurried back home, protecting\\nthe exhausted and fainted POKéMON from\\nfurther harm‥\\p\");\nconst u8 gText_Diploma_Player[] = _(\"PLAYER: {DYNAMIC 0x00}\");\nconst u8 gText_Diploma_ThisDocument[] = _(\"This document is issued in\\nrecognition of your magnificent\\nachievement - the completion of\\nthe {DYNAMIC 0x01} POKéDEX.\");\nconst u8 gText_Diploma_GameFreak[] = _(\"GAME FREAK\");\nconst u8 gText_Diploma_National[] = _(\"NATIONAL\");\nconst u8 gText_Diploma_Kanto[] = _(\"KANTO\");\nconst u8 gText_ClearAllSaveData[] = _(\"Clear all save data areas?\");\nconst u8 gText_ClearingData[] = _(\"Clearing data‥\\nPlease wait.\");\nconst u8 gText_Player[] = _(\"PLAYER\");\nconst u8 gText_Time[] = _(\"TIME\");\nconst u8 gText_Colon[] = _(\":\");\nconst u8 gText_Pokedex[] = _(\"POKéDEX\");\nconst u8 gTextJPDummy_Hiki[] = _(\"\");\nconst u8 gText_Badges[] = _(\"BADGES\");\nconst u8 gTextJPDummy_Ko[] = _(\"\");\nconst u8 gText_Register[] = _(\"REGISTER\");\nconst u8 gText_HatchedFromEgg[] = _(\"{STR_VAR_1} hatched from the EGG!\");\nconst u8 gText_NickHatchPrompt[] = _(\"Would you like to nickname the newly\\nhatched {STR_VAR_1}?\");\nconst u8 gString_OutOfCoins[] = _(\"You've run out of COINS.\\nGame over!\");\nconst u8 gString_QuitPlaying[] = _(\"Quit playing?\");\nconst u8 gString_SlotMachineControls[] = _(\"{DPAD_LEFTRIGHT}COMBOS {DPAD_DOWN}WAGER {A_BUTTON}STOP {B_BUTTON}EXIT\");\n\n#include \"data/text/teachy_tv.h\"\n\nconst u8 gString_Bill[] = _(\"BILL\");\nconst u8 gString_Someone[] = _(\"SOMEONE\");\nconst u8 gString_Help[] = _(\"HELP\");\nconst u8 gString_HelpSystem_ClearTo8[] = _(\"{CLEAR_TO 8}\");\nconst u8 gText_SpacePoints2[] = _(\" points\");\nconst u8 gText_SpaceTimes3[] = _(\" time(s)\");\nconst u8 gText_PkmnJumpRecords[] = _(\"POKéMON JUMP RECORDS\");\nconst u8 gText_JumpsInARow[] = _(\"Jumps in a row:\");\nconst u8 gText_BestScore2[] = _(\"Best score:\");\nconst u8 gText_ExcellentsInARow[] = _(\"EXCELLENTS in a row:\");\nconst u8 gText_AwesomeWonF701F700[] = _(\"Awesome score! You've\\nwon {DYNAMIC 01} {DYNAMIC 00}!\");\nconst u8 gText_FilledStorageSpace2[] = _(\"There's no room left now.\");\nconst u8 gText_CantHoldMore[] = _(\"You can't hold any more!\");\nconst u8 gText_WantToPlayAgain2[] = _(\"Want to play again?\");\nconst u8 gText_SomeoneDroppedOut2[] = _(\"Somebody dropped out.\\nThe link will be canceled.\");\nconst u8 gText_SavingDontTurnOffPower[] = _(\"SAVING…\\nDON'T TURN OFF THE POWER.\");\nconst u8 gText_CommunicationStandby4[] = _(\"Communication standby…\");\nconst u8 gText_SavingDontTurnOffPower2[] = _(\"SAVING...\\nDON'T TURN OFF THE POWER.\"); // Unused\nconst u8 gText_BerryPickingRecords[] = _(\"DODRIO BERRY-PICKING RECORDS\");\nconst u8 gText_BerriesPicked[] = _(\"BERRIES picked:\");\nconst u8 gText_BestScore[] = _(\"Best score:\");\nconst u8 gText_BerriesInRowFivePlayers[] = _(\"BERRIES picked in a row with\\nfive players:\");\nconst u8 gText_BerryPickingResults[] = _(\"Announcing BERRY-PICKING results!\");\nconst u8 gText_10P30P50P50P[] = _(\"10P     30P     50P     {EMOJI_MINUS}50P\");\nconst u8 gText_AnnouncingRankings[] = _(\"Announcing rankings!\");\nconst u8 gText_AnnouncingPrizes[] = _(\"Announcing prizes!\");\nconst u8 gText_1Colon[] = _(\"1:\");\nconst u8 gText_2Colon[] = _(\"2:\");\nconst u8 gText_3Colon[] = _(\"3:\");\nconst u8 gText_4Colon[] = _(\"4:\");\nconst u8 gText_5Colon[] = _(\"5:\");\nconst u8 gText_FirstPlacePrize[] = _(\"The first-place winner gets\\nthis {DYNAMIC 00}!\");\nconst u8 gText_CantHoldAnyMore[] = _(\"You can't hold any more...\");\nconst u8 gText_FilledStorageSpace[] = _(\"It filled its storage space.\");\nconst u8 gText_WantToPlayAgain[] = _(\"Want to play again?\");\nconst u8 gText_SomeoneDroppedOut[] = _(\"Somebody dropped out.\\nThe link will be canceled.\");\nconst u8 gText_SpacePoints[] = _(\" points\");\nconst u8 gText_CommunicationStandby3[] = _(\"Communication standby…\");\nALIGNED(4) const u8 gText_BerryCrush_AreYouReady[] = _(\"Are you ready to BERRY-CRUSH?\\nPlease pick a BERRY for use.\\p\");\nALIGNED(4) const u8 gText_BerryCrush_WaitForOthersToChooseBerry[] = _(\"Please wait while each member\\nchooses a BERRY.\");\nALIGNED(4) const u8 gText_BerryCrush_GainedXUnitsOfPowder[] = _(\"{PAUSE_MUSIC}{PLAY_BGM MUS_LEVEL_UP}You ended up with {STR_VAR_1} units of\\nsilky-smooth BERRY POWDER.{RESUME_MUSIC}\\pYour total amount of BERRY POWDER\\nis {STR_VAR_2}.\\p\");\nALIGNED(4) const u8 gText_BerryCrush_RecordingGameResults[] = _(\"Recording your game results in the\\nsave file.\\nPlease wait.\");\nALIGNED(4) const u8 gText_BerryCrush_WantToPlayAgain[] = _(\"Want to play BERRY CRUSH again?\");\nALIGNED(4) const u8 gText_BerryCrush_NoBerries[] = _(\"You have no BERRIES.\\nThe game will be canceled.\");\nALIGNED(4) const u8 gText_BerryCrush_MemberDroppedOut[] = _(\"A member dropped out.\\nThe game will be canceled.\");\nALIGNED(4) const u8 gText_BerryCrush_TimeUp[] = _(\"Time's up.\\pGood BERRY POWDER could not be\\nmade…\\p\");\nALIGNED(4) const u8 gText_BerryCrush_CommunicationStandby[] = _(\"Communication standby…\");\nALIGNED(4) const u8 gText_1_ClrBluShdwLtBlu_Dynamic0[] = _(\"1. {COLOR BLUE}{SHADOW LIGHT_BLUE}{DYNAMIC 0x00}\");\nconst u8 gText_1_Dynamic0[] = _(\"1. {DYNAMIC 0x00}\");\nALIGNED(4) const u8 gText_SpaceTimes2[] = _(\" times\");\nALIGNED(4) const u8 gText_XDotY[] = _(\"{STR_VAR_1}.{STR_VAR_2}\");\nALIGNED(4) const u8 gText_StrVar1Berry[] = _(\"{STR_VAR_1} BERRY\");\nALIGNED(4) const u8 gText_TimeColon[] = _(\"Time:\");\nALIGNED(4) const u8 gText_PressingSpeed[] = _(\"Pressing Speed:\");\nconst u8 gText_Silkiness[] = _(\"Silkiness:\");\nALIGNED(4) const u8 gText_StrVar1[] = _(\"{STR_VAR_1}\");\nALIGNED(4) const u8 gText_SpaceMin[] = _(\"min.\");\nALIGNED(4) const u8 gText_XDotY2[] = _(\"{STR_VAR_1}.{STR_VAR_2}\");\nALIGNED(4) const u8 gText_SpaceSec[] = _(\"sec.\");\nALIGNED(4) const u8 gText_XDotY3[] = _(\"{STR_VAR_1}.{STR_VAR_2}\");\nALIGNED(4) const u8 gText_TimesPerSec[] = _(\"Times/sec.\");\nALIGNED(4) const u8 gText_Var1Percent[] = _(\"{STR_VAR_1}%\");\nALIGNED(4) const u8 gText_PressesRankings[] = _(\"No. of Presses Rankings\");\nALIGNED(4) const u8 gText_CrushingResults[] = _(\"Crushing Results\");\nALIGNED(4) const u8 gText_NeatnessRankings[] = _(\"Neatness Rankings\");\nALIGNED(4) const u8 gText_CooperativeRankings[] = _(\"Cooperative Rankings\");\nALIGNED(4) const u8 gText_PressingPowerRankings[] = _(\"Pressing-Power Rankings\");\nconst u8 gText_BerryCrush2[] = _(\"BERRY CRUSH\");\nconst u8 gText_PressingSpeedRankings[] = _(\"Pressing-Speed Rankings\");\nconst u8 gText_Var1Players[] = _(\"{STR_VAR_1} PLAYERS\");\nALIGNED(4) const u8 gText_Ghost[] = _(\"GHOST\");\nconst u8 gText_PokemonOnHook[] = _(\"A POKéMON's on the hook!{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_NotEvenANibble[] = _(\"Not even a nibble‥{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_ItGotAway[] = _(\"It got away‥{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_Rooftop2[] = _(\"ROOFTOP\");\nALIGNED(4) const u8 gString_PokemonFireRed_Staff[] = _(\"Pokémon FireRed Version\\nStaff\");\nALIGNED(4) const u8 gString_PokemonLeafGreen_Staff[] = _(\"Pokémon LeafGreen Version\\nStaff\");\nALIGNED(4) const u8 gCreditsString_Director[] = _(\"\\n\\nDirector\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Junichi_Masuda[] = _(\"\\n\\n\\nJunichi Masuda\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Art_Director_Battle_Director[] = _(\"\\nArt Director\\n\\nBattle Director\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Ken_Sugimori_Shigeki_Morimoto[] = _(\"\\n\\nKen Sugimori\\n\\nShigeki Morimoto\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Program_Leader_Planning_Leader_Graphic_Design_Leader[] = _(\"Program Leader\\n\\nPlanning Leader\\n\\nGraphic Design Leader\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Tetsuya_Watanabe_Koji_Nishino_Takao_Unno[] = _(\"\\nTetsuya Watanabe\\n\\nKoji Nishino\\n\\nTakao Unno\\n\");\nALIGNED(4) const u8 gCreditsString_Programmers[] = _(\"Programmers\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Hiroyuki_Nakamura_Masao_Taya_Satoshi_Nohara_Miyuki_Iwasawa_Daisuke_Goto[] = _(\"\\nHiroyuki Nakamura\\nMasao Taya\\nSatoshi Nohara\\nMiyuki Iwasawa\\nDaisuke Goto\\n\");\nALIGNED(4) const u8 gCreditsString_System_Programmers[] = _(\"System Programmers\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Tetsuya_Watanabe_Akito_Mori_Hisashi_Sogabe_Sousuke_Tamada[] = _(\"\\nTetsuya Watanabe\\nAkito Mori\\nHisashi Sogabe\\nSousuke Tamada\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Graphic_Designers[] = _(\"Graphic Designers\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Takao_Unno_Asuka_Iwashita_Kanako_Eo_Hiroki_Fuchino[] = _(\"\\nTakao Unno\\nAsuka Iwashita\\nKanako Eo\\nHiroki Fuchino\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Graphic_Designers_2[] = _(\"\\nGraphic Designers\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Ken_Sugimori_Hironobu_Yoshida[] = _(\"\\n\\nKen Sugimori\\nHironobu Yoshida\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Music_Composition[] = _(\"\\nMusic Composition\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Go_Ichinose_Junichi_Masuda[] = _(\"\\n\\nGo Ichinose\\nJunichi Masuda\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Sound_Effects[] = _(\"\\n\\nSound Effects\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Go_Ichinose[] = _(\"\\n\\n\\nGo Ichinose\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Game_Designers[] = _(\"\\nGame Designers\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Junichi_Masuda_Koji_Nishino_Tetsuji_Ohta[] = _(\"\\n\\nJunichi Masuda\\nKoji Nishino\\nTetsuji Ohta\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Game_Designers_2[] = _(\"\\nGame Designers\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Hitomi_Sato_Shigeru_Ohmori_Tadashi_Takahashi[] = _(\"\\n\\nHitomi Sato\\nShigeru Ohmori\\nTadashi Takahashi\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Game_Scenario[] = _(\"\\nGame Scenario\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Hitomi_Sato_Satoshi_Tajiri[] = _(\"\\n\\nHitomi Sato\\nSatoshi Tajiri\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Script_Designer_Map_Designer[] = _(\"\\nScript Designer\\n\\nMap Designer\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Satoshi_Nohara_Shigeru_Ohmori[] = _(\"\\n\\nSatoshi Nohara\\n\\nShigeru Ohmori\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Parametric_Designers[] = _(\"\\nParametric Designers\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Koji_Nishino_Tetsuji_Ohta_Shigeki_Morimoto[] = _(\"\\n\\nKoji Nishino\\nTetsuji Ohta\\nShigeki Morimoto\\n\\n\");\nALIGNED(4) const u8 gCreditsString_POKeDEX_Text[] = _(\"\\n\\nPOKéDEX Text\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Kenji_Matsushima[] = _(\"\\n\\n\\nKenji Matsushima\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_POKeMON_Designers[] = _(\"POKéMON Designers\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Ken_Sugimori_Motofumi_Fujiwara_Shigeki_Morimoto_Hironobu_Yoshida[] = _(\"\\nKen Sugimori\\nMotofumi Fujiwara\\nShigeki Morimoto\\nHironobu Yoshida\\n\\n\");\nALIGNED(4) const u8 gCreditsString_POKeMON_Designers_2[] = _(\"POKéMON Designers\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Satoshi_Ohta_Asuka_Iwashita_Takao_Unno_Kanako_Eo_Aimi_Tomita[] = _(\"\\nSatoshi Ohta\\nAsuka Iwashita\\nTakao Unno\\nKanako Eo\\nAimi Tomita\\n\");\nALIGNED(4) const u8 gCreditsString_POKeMON_Designers_3[] = _(\"POKéMON Designers\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Atsuko_Nishida_Muneo_Saito_Rena_Yoshikawa_Jun_Okutani[] = _(\"\\nAtsuko Nishida\\nMuneo Saito\\nRena Yoshikawa\\nJun Okutani\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Supporting_Programmers[] = _(\"Supporting Programmers\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Teruyuki_Yoshioka_Takao_Nakano_Satoshi_Mitsuhara_Daisuke_Hoshino[] = _(\"\\nTeruyuki Yoshioka\\nTakao Nakano\\n\\nSatoshi Mitsuhara\\nDaisuke Hoshino\\n\");\nALIGNED(4) const u8 gCreditsString_NCL_Product_Testing[] = _(\"\\n\\nNCL Product Testing\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_NCL_Super_Mario_Club[] = _(\"\\n\\n\\nNCL Super Mario Club\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Special_Thanks[] = _(\"Special Thanks\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Hiro_Nakamura_Hiroyuki_Uesugi_Teruki_Murakawa_Kazuya_Suyama[] = _(\"\\nHiro Nakamura\\nHiroyuki Uesugi\\nTeruki Murakawa\\n\\nKazuya Suyama\\n\");\nALIGNED(4) const u8 gCreditsString_Special_Thanks_2[] = _(\"Special Thanks\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Kenji_Tominaga_Kenjiro_Ito_Tomotaka_Komura_Michiko_Takizawa[] = _(\"\\nKenji Tominaga\\n\\nKenjiro Ito\\nTomotaka Komura\\nMichiko Takizawa\\n\");\nALIGNED(4) const u8 gCreditsString_Special_Thanks_3[] = _(\"Special Thanks\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Makiko_Takada_Mikiko_Ohashi_Shusaku_Egami_Takanao_Kondo_Rui_Kawaguchi[] = _(\"\\nMakiko Takada\\nMikiko Ohashi\\nShusaku Egami\\nTakanao Kondo\\nRui Kawaguchi\\n\");\nALIGNED(4) const u8 gCreditsString_Braille_Code_Check[] = _(\"\\n\\nBraille Code Check\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Japan_Braille_Library[] = _(\"\\n\\n\\nJapan Braille Library\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Information_Supervisors[] = _(\"Information Supervisors\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Hiroki_Enomoto_Kazuyuki_Terada_Yuri_Sakurai_Yumi_Funasaka_Naoko_Yanase[] = _(\"\\nHiroki Enomoto\\nKazuyuki Terada\\nYuri Sakurai\\nYumi Funasaka\\nNaoko Yanase\\n\");\nALIGNED(4) const u8 gCreditsString_Coordinators[] = _(\"Coordinators\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Azusa_Tajima_Akira_Kinashi_Kazuki_Yoshihara_Retsuji_Nomoto[] = _(\"\\nAzusa Tajima\\nAkira Kinashi\\nKazuki Yoshihara\\n\\nRetsuji Nomoto\\n\");\nALIGNED(4) const u8 gCreditsString_Task_Managers[] = _(\"\\nTask Managers\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Hitoshi_Yamagami_Gakuji_Nomoto[] = _(\"\\n\\nHitoshi Yamagami\\nGakuji Nomoto\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Producers[] = _(\"\\nProducers\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Hiroyuki_Jinnai_Takehiro_Izushi_Hiroaki_Tsuru[] = _(\"\\n\\nHiroyuki Jinnai\\nTakehiro Izushi\\nHiroaki Tsuru\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Executive_Director[] = _(\"\\n\\nExecutive Director\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Satoshi_Tajiri[] = _(\"\\n\\n\\nSatoshi Tajiri\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Executive_Producer[] = _(\"\\n\\nExecutive Producer\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Satoru_Iwata[] = _(\"\\n\\n\\nSatoru Iwata\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Executive_Producer_2[] = _(\"\\n\\nExecutive Producer\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Tsunekaz_Ishihara[] = _(\"\\n\\n\\nTsunekaz Ishihara\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_English_Version_Coordinators[] = _(\"\\nEnglish Version Coordinators\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Hiro_Nakamura_Seth_McMahill[] = _(\"\\n\\nHiro Nakamura\\nSeth McMahill\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Translator_Text_Editor[] = _(\"\\nTranslator\\n\\nText Editor\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Nob_Ogasawara_Teresa_Lillygren[] = _(\"\\n\\nNob Ogasawara\\n\\nTeresa Lillygren\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Programmers_2[] = _(\"Programmers\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Yuichiro_Ito_Akira_Kinashi[] = _(\"\\nTeruki Murakawa\\nSouichi Yamamoto\\nYuichiro Ito\\nAkira Kinashi\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Environment_Tool_Programmers[] = _(\"\\nEnvironment & Tool Programmers\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Kimiko_Nakamichi[] = _(\"\\n\\nTeruki Murakawa\\nSouichi Yamamoto\\nKimiko Nakamichi\\n\\n\");\nALIGNED(4) const u8 gCreditsString_NOA_Product_Testing[] = _(\"NOA Product Testing\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Thomas_Hertzog_Kathy_Huguenard_Mika_Kurosawa[] = _(\"\\nThomas Hertzog\\nKathy Huguenard\\nMika Kurosawa\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Braille_Code_Check_2[] = _(\"Braille Code Check\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_National_Federation_of_the_Blind_Patricia_A_Maurer_Japan_Braille_Library_European_Blind_Union[] = _(\"\\nNational Federation\\n{CLEAR_TO 0x13}of the Blind\\nPatricia A. Maurer\\nJapan Braille Library\\nEuropean Blind Union\\n\");\nALIGNED(4) const u8 gCreditsString_Braille_Code_Check_3[] = _(\"\\nBraille Code Check\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_National_Information_Library_Service_Margaret_Campion[] = _(\"\\n\\nNational Information Library\\n{CLEAR_TO 0x2D}Service\\nMargaret Campion\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Special_Thanks_4[] = _(\"Special Thanks\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Takehiro_Izushi_Motoyasu_Tojima_Hitoshi_Yamagami_Hiroyuki_Uesugi[] = _(\"\\nTakehiro Izushi\\nMotoyasu Tojima\\nHitoshi Yamagami\\nHiroyuki Uesugi\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Special_Thanks_5[] = _(\"Special Thanks\\n\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Nicola_Pratt_Barlow_Shellie_Dow_Anthony_Howitt_Naoko_Saeki_Kyoko_Onishi[] = _(\"\\nNicola Pratt-Barlow\\nShellie Dow\\nAnthony Howitt\\nNaoko Saeki\\nKyoko Onishi\\n\");\nALIGNED(4) const u8 gCreditsString_Braille_Code_Check_4[] = _(\"\\nBraille Code Check\\n\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_The_Royal_New_Zealand_Foundation_of_the_Blind_Greg_Moran[] = _(\"\\n\\nThe Royal New Zealand\\nFoundation of the Blind\\nGreg Moran\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Graphic_Designer[] = _(\"\\n\\nGraphic Designer\\n\\n\\n\\n\");\nALIGNED(4) const u8 gCreditsString_Akira_Kinashi[] = _(\"\\n\\n\\nAkira Kinashi\\n\\n\\n\");\nconst u8 gJPText_MysteryGift[] = _(\"\");\nconst u8 gJPText_DecideStop[] = _(\"\");\nconst u8 gJPText_ReceiveMysteryGiftWithEReader[] = _(\"\");\nconst u8 gJPText_SelectConnectFromEReaderMenu[] = _(\"\");\nconst u8 gJPText_SelectConnectWithGBA[] = _(\"\");\nconst u8 gJPText_LinkIsIncorrect[] = _(\"\");\nconst u8 gJPText_CardReadingHasBeenHalted[] = _(\"\");\nconst u8 gJPText_Connecting[] = _(\"\");\nconst u8 gJPText_ConnectionErrorCheckLink[] = _(\"\");\nconst u8 gJPText_ConnectionErrorTryAgain[] = _(\"\");\nconst u8 gJPText_AllowEReaderToLoadCard[] = _(\"\");\nconst u8 gJPText_ConnectionComplete[] = _(\"\");\nconst u8 gJPText_NewTrainerHasComeToSevii[] = _(\"\");\nconst u8 gJPText_PleaseWaitAMoment[] = _(\"\");\nconst u8 gJPText_WriteErrorUnableToSaveData[] = _(\"\");\nconst u8 gText_CommErrorCheckConnections[] = _(\"Communication error…\\nPlease check all connections,\\nthen turn the power OFF and ON.\");\nconst u8 gText_CommErrorEllipsis[] = _(\"Communication error…\");\nconst u8 gText_MoveCloserToLinkPartner[] = _(\"Move closer to your link partner(s).\\nAvoid obstacles between partners.\");\nconst u8 gText_ABtnRegistrationCounter[] = _(\"A Button: Registration Counter\");\nconst u8 gText_ABtnTitleScreen[] = _(\"A Button: Title Screen\");\nconst u8 gText_NumPlayerLink[] = _(\"{STR_VAR_1}P LINK\");\nconst u8 gText_BronzeCard[] = _(\"BRONZE\");\nconst u8 gText_CopperCard[] = _(\"COPPER\");\nconst u8 gText_SilverCard[] = _(\"SILVER\");\nconst u8 gText_GoldCard[] = _(\"GOLD\");\nconst u8 gText_HelpSystemControls_A_Next[] = _(\"{A_BUTTON}NEXT\");\nconst u8 gText_HelpSystemControls_PickOkEnd[] = _(\"{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}END\");\nconst u8 gText_HelpSystemControls_AorBtoCancel[] = _(\"{A_BUTTON}{B_BUTTON}CANCEL\");\nconst u8 gText_HelpSystemControls_PickOkCancel[] = _(\"{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}CANCEL\");\nconst u8 gEasyChatGroupName_Pokemon[] = _(\"POKéMON\");\nconst u8 gEasyChatGroupName_Trainer[] = _(\"TRAINER\");\nconst u8 gEasyChatGroupName_Status[] = _(\"STATUS\");\nconst u8 gEasyChatGroupName_Battle[] = _(\"BATTLE\");\nconst u8 gEasyChatGroupName_Greetings[] = _(\"GREETINGS\");\nconst u8 gEasyChatGroupName_People[] = _(\"PEOPLE\");\nconst u8 gEasyChatGroupName_Voices[] = _(\"VOICES\");\nconst u8 gEasyChatGroupName_Speech[] = _(\"SPEECH\");\nconst u8 gEasyChatGroupName_Endings[] = _(\"ENDINGS\");\nconst u8 gEasyChatGroupName_Feelings[] = _(\"FEELINGS\");\nconst u8 gEasyChatGroupName_Conditions[] = _(\"CONDITIONS\");\nconst u8 gEasyChatGroupName_Actions[] = _(\"ACTIONS\");\nconst u8 gEasyChatGroupName_Lifestyle[] = _(\"LIFESTYLE\");\nconst u8 gEasyChatGroupName_Hobbies[] = _(\"HOBBIES\");\nconst u8 gEasyChatGroupName_Time[] = _(\"TIME\");\nconst u8 gEasyChatGroupName_Misc[] = _(\"MISC.\");\nconst u8 gEasyChatGroupName_Adjectives[] = _(\"ADJECTIVES\");\nconst u8 gEasyChatGroupName_Events[] = _(\"EVENTS\");\nconst u8 gEasyChatGroupName_Move1[] = _(\"MOVE 1\");\nconst u8 gEasyChatGroupName_Move2[] = _(\"MOVE 2\");\nconst u8 gEasyChatGroupName_TrendySaying[] = _(\"TRENDY SAYING\");\nconst u8 gEasyChatGroupName_Pokemon2[] = _(\"POKéMON2\");\nconst u8 gText_ThreeQuestionMarks[] = _(\"???\");\nconst u8 gText_UnusedEmpty[] = _(\"\");\nconst u8 gText_UnusedLv[] = _(\"Lv\");\nconst u8 gText_UnusedDashes[] = _(\"---\");\nconst u8 gText_4Qmark[] = _(\"????\");\nconst u8 gText_UnusedEmpty2[] = _(\"\");\nconst u8 gText_IsThisTradeOkay[] = _(\"Is this trade okay?\");\nconst u8 gTradeText_Cancel[] = _(\"CANCEL\");\nconst u8 gTradeText_ChooseAPokemon[] = _(\"Choose a POKéMON.\");\nconst u8 gTradeText_Summary[] = _(\"SUMMARY\");\nconst u8 gTradeText_Trade[] = _(\"TRADE\");\nconst u8 gText_CancelTrade[] = _(\"Cancel trade?\");\nconst u8 gTradeText_PressBButtonToExit[] = _(\"Press the B Button to exit.\");\nconst u8 gText_TradeAction_Summary[] = _(\"SUMMARY\");\nconst u8 gText_TradeAction_Trade[] = _(\"TRADE\");\nconst u8 gText_Trade_CommunicationStandby[] = _(\"{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}Communication standby…\\nPlease wait.\");\nconst u8 gText_TradeHasBeenCanceled[] = _(\"{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}The trade has been canceled.\");\nconst u8 gText_Trade_OnlyPkmnForBattle[] = _(\"{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}That's your only POKéMON\\nfor battle.\");\nconst u8 gText_WaitingForFriendToFinish[] = _(\"{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}Waiting for your friend\\nto finish…\");\nconst u8 gText_FriendWantsToTrade[] = _(\"Your friend wants\\nto trade POKéMON.\");\nconst u8 gText_XWillBeSentToY[] = _(\"{STR_VAR_2} will be\\nsent to {STR_VAR_1}.\");\nconst u8 gText_ByeByeVar1[] = _(\"Bye-bye, {STR_VAR_2}!\");\nconst u8 gText_XSentOverY[] = _(\"{STR_VAR_1} sent over {STR_VAR_3}.\");\nconst u8 gText_TakeGoodCareOfX[] = _(\"Take good care of {STR_VAR_3}!\");\nconst u8 gText_From[] = _(\"From \");\nconst u8 gText_Empty1[] = _(\"\");\nconst u8 gText_Empty2[] = _(\"\");\nconst u8 gText_Empty3[] = _(\"\");\nconst u8 gText_Empty4[] = _(\"\");\nconst u8 gText_Empty5[] = _(\"\");\nconst u8 gText_Empty6[] = _(\"\");\nconst u8 gText_Empty7[] = _(\"\");\nconst u8 gText_Empty8[] = _(\"\");\nconst u8 gText_Empty9[] = _(\"\");\nconst u8 gText_Empty10[] = _(\"\");\nconst u8 gText_Empty11[] = _(\"\");\nconst u8 gText_WirelessCommunicationStatus[] = _(\"Wireless Communication Status\");\nconst u8 gText_PeopleTrading[] = _(\"People trading:\");\nconst u8 gText_PeopleBattling[] = _(\"People battling:\");\nconst u8 gText_PeopleInUnionRoom[] = _(\"People in the UNION ROOM:\");\nconst u8 gText_PeopleCommunicating[] = _(\"People communicating:\");\nconst u8 gText_Dynamic0Players[] = _(\"{DYNAMIC 0x00} players\");\nconst u8 gText_Dynamic1Players[] = _(\"{DYNAMIC 0x01} player\"); // Typo? This is \"players\" in Emerald\nconst u8 gText_Dynamic2Players[] = _(\"{DYNAMIC 0x02} players\");\nconst u8 gText_Dynamic3Players[] = _(\"{DYNAMIC 0x03} players\");\nconst u8 gText_BButtonCancel[] = _(\"{B_BUTTON}CANCEL\");\nconst u8 gText_CommunicationStandby5[] = _(\"Communication standby…\");\nconst u8 gDaycareText_GetAlongVeryWell[] = _(\"The two seem to get along\\nvery well.\");\nconst u8 gDaycareText_GetAlong[] = _(\"The two seem to get along.\");\nconst u8 gDaycareText_DontLikeOther[] = _(\"The two don't seem to like\\neach other much.\");\nconst u8 gDaycareText_PlayOther[] = _(\"The two prefer to play with other\\nPOKéMON than each other.\");\nconst u8 gText_TeachWhichMoveToMon[] = _(\"Teach which move to {STR_VAR_1}?\");\nconst u8 gText_TeachMoveQues[] = _(\"Teach {STR_VAR_2}?\");\nconst u8 gText_MonLearnedMove[] = _(\"{STR_VAR_1} learned\\n{STR_VAR_2}.\");\nconst u8 gText_MonIsTryingToLearnMove[] = _(\"{STR_VAR_1} is trying to learn\\n{STR_VAR_2}.\\pBut {STR_VAR_1} can't learn more\\nthan four moves.\\pDelete an older move to make\\nroom for {STR_VAR_2}?\");\nconst u8 gText_StopLearningMove[] = _(\"Stop learning {STR_VAR_2}?\");\nconst u8 gText_1_2_and_Poof[] = _(\"{PAUSE 0x20}1, {PAUSE 0x0F}2, and {PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}{PLAY_SE SE_BALL_BOUNCE_1}Poof!\\p\");\nconst u8 gText_MonForgotOldMoveAndMonLearnedNewMove[] = _(\"{STR_VAR_1} forgot {STR_VAR_3}.\\pAnd‥\\p{STR_VAR_1}\\nlearned {STR_VAR_2}.\");\nconst u8 gText_GiveUpTryingToTeachNewMove[] = _(\"Give up trying to teach a new\\nmove to {STR_VAR_1}?\");\nconst u8 gText_WhichMoveShouldBeForgotten[] = _(\"Which move should be forgotten?\\p\");\nconst u8 gText_TenDashes[] = _(\"----------\");\nconst u8 gText_CommStandbyAwaitingOtherPlayer[] = _(\"Communication standby‥\\nAwaiting another player to choose.\");\nconst u8 gText_BattleWasRefused[] = _(\"The battle was refused.{PAUSE 0x3C}\");\nconst u8 gText_RefusedBattle[] = _(\"Refused the battle.{PAUSE 0x3C}\");\nconst u8 gFameCheckerText_MainScreenUI[] = _(\"{START_BUTTON}PICK {DPAD_UPDOWN}SELECT {A_BUTTON}OK\");\nconst u8 gFameCheckerText_PickScreenUI[] = _(\"{START_BUTTON}PICK {DPAD_UPDOWN}SELECT {B_BUTTON}CANCEL\");\nconst u8 gFameCheckerText_FlavorTextUI[] = _(\"{DPAD_ANY}PICK {A_BUTTON}READ {B_BUTTON}CANCEL\");\nconst u8 gFameCheckerOakName[] = _(\"OAK\");\nconst u8 gFameCheckerDaisyName[] = _(\"DAISY\");\nconst u8 gFameCheckerBillName[] = _(\"BILL\");\nconst u8 gFameCheckerMrFujiName[] = _(\"FUJI\");\nconst u8 gText_VarietyOfEventsImportedWireless[] = _(\"A variety of events will be imported\\nover Wireless Communication.\");\nconst u8 gText_WonderCardsInPossession[] = _(\"Read the WONDER CARDS in your\\npossession.\");\nconst u8 gText_ReadNewsThatArrived[] = _(\"Read the NEWS that arrived.\");\nconst u8 gText_ReturnToTitle[] = _(\"Return to the title screen.\");\nconst u8 gText_DontHaveCardNewOneInput[] = _(\"You don't have a WONDER CARD,\\nso a new CARD will be input.\");\nconst u8 gText_DontHaveNewsNewOneInput[] = _(\"You don't have any WONDER NEWS,\\nso new NEWS will be input.\");\nconst u8 gText_WhereShouldCardBeAccessed[] = _(\"Where should the WONDER CARD\\nbe accessed?\");\nconst u8 gText_WhereShouldNewsBeAccessed[] = _(\"Where should the WONDER NEWS\\nbe accessed?\");\nconst u8 gText_LinkStandyBButtonCancel[] = _(\"Link standby...\\n... ... B Button: Cancel\");\nconst u8 gText_Communicating[] = _(\"Communicating…\");\nconst u8 gText_CommunicationCompleted[] = _(\"Communication completed.\");\nconst u8 gText_CommunicationError[] = _(\"Communication error.\");\nconst u8 gText_CommunicationCanceled[] = _(\"Communication has been canceled.\");\nconst u8 gText_ThrowAwayWonderCard[] = _(\"Throw away the WONDER CARD\\nand input a new CARD?\");\nconst u8 gText_HaventReceivedCardsGift[] = _(\"You haven't received the CARD's gift\\nyet. Input a new CARD anyway?\");\nconst u8 gText_WonderCardReceivedFrom[] = _(\"A WONDER CARD has been received\\nfrom {STR_VAR_1}.\");\nconst u8 gText_WonderNewsReceivedFrom[] = _(\"A WONDER NEWS item has been\\nreceived from {STR_VAR_1}.\");\nconst u8 gText_WonderCardReceived[] = _(\"A new WONDER CARD has been\\nreceived.\");\nconst u8 gText_WonderNewsReceived[] = _(\"A new WONDER NEWS item has been\\nreceived.\");\nconst u8 gText_NewStampReceived[] = _(\"A new STAMP has been received.\");\nconst u8 gText_NewTrainerReceived[] = _(\"A new TRAINER has arrived.\");\nconst u8 gText_AlreadyHadCard[] = _(\"You already had that\\nWONDER CARD.\");\nconst u8 gText_AlreadyHadNews[] = _(\"You already had that\\nWONDER NEWS item.\");\nconst u8 gText_AlreadyHadStamp[] = _(\"You already had that\\nSTAMP.\");\nconst u8 gText_NoMoreRoomForStamps[] = _(\"There's no more room for adding\\nSTAMPS.\");\nconst u8 gText_RecordUploadedViaWireless[] = _(\"Your record has been uploaded via\\nWIRELESS COMMUNICATION.\");\nconst u8 gText_CantAcceptCardFromTrainer[] = _(\"You can't accept a WONDER CARD\\nfrom this TRAINER.\");\nconst u8 gText_CantAcceptNewsFromTrainer[] = _(\"You can't accept WONDER NEWS\\nfrom this TRAINER.\");\nconst u8 gText_NothingSentOver[] = _(\"Nothing was sent over…\");\nconst u8 gText_WhatToDoWithCards[] = _(\"What would you like to do\\nwith the WONDER CARDS?\");\nconst u8 gText_WhatToDoWithNews[] = _(\"What would you like to do\\nwith the WONDER NEWS?\");\nconst u8 gText_SendingWonderCard[] = _(\"Sending your WONDER CARD…\");\nconst u8 gText_SendingWonderNews[] = _(\"Sending your WONDER NEWS item…\");\nconst u8 gText_WonderCardSentTo[] = _(\"Your WONDER CARD has been sent\\nto {STR_VAR_1}.\");\nconst u8 gText_WonderNewsSentTo[] = _(\"Your WONDER NEWS item has been\\nsent to {STR_VAR_1}.\");\nconst u8 gText_StampSentTo[] = _(\"A STAMP has been sent to {STR_VAR_1}.\");\nconst u8 gText_GiftSentTo[] = _(\"A GIFT has been sent to {STR_VAR_1}.\");\nconst u8 gText_OtherTrainerHasCard[] = _(\"The other TRAINER has the same\\nWONDER CARD already.\");\nconst u8 gText_OtherTrainerHasNews[] = _(\"The other TRAINER has the same\\nWONDER NEWS already.\");\nconst u8 gText_OtherTrainerHasStamp[] = _(\"The other TRAINER has the same\\nSTAMP already.\");\nconst u8 gText_OtherTrainerCanceled[] = _(\"The other TRAINER canceled\\ncommunication.\");\nconst u8 gText_CantSendGiftToTrainer[] = _(\"You can't send a MYSTERY GIFT to\\nthis TRAINER.\");\nconst u8 gText_IfThrowAwayCardEventWontHappen[] = _(\"If you throw away the CARD,\\nits event won't happen. Okay?\");\nconst u8 gText_OkayToDiscardNews[] = _(\"Is it okay to discard this\\nNEWS item?\");\nconst u8 gText_HaventReceivedGiftOkayToDiscard[] = _(\"You haven't received the\\nGIFT. Is it okay to discard?\");\nconst u8 gText_DataWillBeSaved[] = _(\"Data will be saved.\\nPlease wait.\");\nconst u8 gText_SaveCompletedPressA[] = _(\"Save completed.\\nPlease press the A Button.\");\nconst u8 gText_WonderCardThrownAway[] = _(\"The WONDER CARD was thrown away.\");\nconst u8 gText_WonderNewsThrownAway[] = _(\"The WONDER NEWS was thrown away.\");\nconst u8 gText_MysteryGift2[] = _(\"MYSTERY GIFT\");\nconst u8 gText_PickOKCancel[] = _(\"{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}EXIT\");\nconst u8 gText_WonderCards[] = _(\"WONDER CARDS\");\nconst u8 gText_WonderNews[] = _(\"WONDER NEWS\");\nconst u8 gText_WirelessCommunication[] = _(\"WIRELESS COMMUNICATION\");\nconst u8 gText_Friend2[] = _(\"FRIEND\");\nconst u8 gText_Exit3[] = _(\"EXIT\");\nconst u8 gText_Receive[] = _(\"RECEIVE\");\nconst u8 gText_Send[] = _(\"SEND\");\nconst u8 gText_Toss[] = _(\"TOSS\");\nconst u8 gText_DelAllCancelOk[] = _(\"DEL. ALL{CLEAR_TO 0x57}CANCEL{CLEAR_TO 0xA4}OK\");\n\nconst u8 gSummaryMetLocationTextOrreEeveelutionsDuking[] = _(\"{DYNAMIC 0x00} nature.\\nApparently {DYNAMIC 0x02}at {LV_2} {DYNAMIC 0x01}.\");\nconst u8 gText_YouAlreadyHaveThisTM[] = _(\"You already have this TM.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_ThrowInPremierBall[] = _(\"I'll throw in a PREMIER BALL, too.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_ThrowInPremierBalls[] = _(\"I'll throw in some Premier Balls, too.{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnFriendlyBaseVar2Fell[] = _(\"{STR_VAR_1} turned friendly.\\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnAdoresBaseVar2Fell[] = _(\"{STR_VAR_1} adores you!\\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_PkmnFriendlyBaseVar2CantFall[] = _(\"{STR_VAR_1} turned friendly.\\nThe base {STR_VAR_2} can't fall!{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_HeldItems[] = _(\"HELD ITEMS\");\nconst u8 gText_Medicine[] = _(\"MEDICINE\");\nconst u8 gText_HeldItemsPocket[] = _(\"HELD ITEMS POCKET\");\nconst u8 gText_MedicinePocket[] = _(\"MEDICINE POCKET\");\n\nconst u8 gText_Version[] = _(\"VERSION\");\nconst u8 gText_FireredVersion[] = _(\"FIRERED VERSION\");\nconst u8 gText_LeafgreenVersion[] = _(\"LEAFGREEN VERSION\");\nconst u8 gText_Difficulty[] = _(\"DIFFICULTY\");\nconst u8 gText_EasyDifficulty[] = _(\"EASY MODE\");\nconst u8 gText_NormalDifficulty[] = _(\"NORMAL MODE\");\nconst u8 gText_ChallengeDifficulty[] = _(\"CHALLENGE MODE\");\nconst u8 gText_Nuzlocke[] = _(\"NUZLOCKE\");\nconst u8 gText_Nuzlocke_On[] = _(\"ON\");\nconst u8 gText_Nuzlocke_Off[] = _(\"OFF\");\nconst u8 gText_IVCalc[] = _(\"IV CALCULATION\");\nconst u8 gText_IVCalcZero[] = _(\"ALL ZERO\");\nconst u8 gText_IVCalcStandard[] = _(\"STANDARD\");\nconst u8 gText_IVCalcPerfect[] = _(\"ALL PERFECT\");\nconst u8 gText_EVCalc[] = _(\"EV CALCULATION\");\nconst u8 gText_EVCalcZero[] = _(\"ALL ZERO\");\nconst u8 gText_EVCalcStandard[] = _(\"STANDARD\");\nconst u8 gText_NoPMC[] = _(\"NO FREE HEALS\");\nconst u8 gText_ExpMod[] = _(\"EXP. MODIFIER\");\nconst u8 gText_ExpModZero[] = _(\"0×\");\nconst u8 gText_ExpModHalf[] = _(\"1/2×\");\nconst u8 gText_ExpModNormal[] = _(\"1×\");\nconst u8 gText_ExpModTwice[] = _(\"2×\");\n\nconst u8 gText_KeySystemSettings[] = _(\"KEY SYSTEM SETTINGS\");\nconst u8 gText_HelpPickSwitchCancel[] = _(\"{L_BUTTON}KEY INFO {DPAD_UPDOWN}PICK {DPAD_LEFTRIGHT}SWITCH {A_BUTTON}{B_BUTTON}SAVE\");\nconst u8 gChooseVersionNewGame[] = _(\"Start NEW GAME on which version?\\nOther KEY SYSTEM SETTINGS can\\lbe set later from the main menu.\");\nconst u8 gFRLG_Multichoice[] = _(\"FIRERED\\nLEAFGREEN\");\n\nconst u8 gText_BlueFlute_Ash[] = _(\"{FONT_SMALL}BLUE FLUTE{CLEAR_TO 0x40} 250\");\nconst u8 gText_YellowFlute_Ash[] = _(\"{FONT_SMALL}YELLOW FLUTE{CLEAR_TO 0x40} 500\");\nconst u8 gText_RedFlute_Ash[] = _(\"{FONT_SMALL}RED FLUTE{CLEAR_TO 0x40} 500\");\nconst u8 gText_WhiteFlute_Ash[] = _(\"{FONT_SMALL}WHITE FLUTE{CLEAR_TO 0x40}1000\");\nconst u8 gText_BlackFlute_Ash[] = _(\"{FONT_SMALL}BLACK FLUTE{CLEAR_TO 0x40}1000\");\nconst u8 gText_AshQuantity[] = _(\"ASH QUANTITY: {STR_VAR_1}{PAUSE_UNTIL_PRESS}\");\nconst u8 gText_SmallExit[] = _(\"{FONT_SMALL}EXIT\");\n\nconst u8 gText_BattleTower[] = _(\"BATTLE TOWER\");\nconst u8 gText_BattleFactory[] = _(\"BATTLE FACTORY\");\nconst u8 gText_BattleArena[] = _(\"BATTLE ARENA\");\nconst u8 gText_BattleDome[] = _(\"BATTLE DOME\");\nconst u8 gText_BattlePike[] = _(\"BATTLE PIKE\");\nconst u8 gText_BattlePalace[] = _(\"BATTLE PALACE\");\nconst u8 gText_BattlePyramid[] = _(\"BATTLE PYRAMID\");\nconst u8 gText_DevonSpyShop[] = _(\"{COLOR RED}Hurry up, I'm missing the good stuff.\");\nconst u8 gText_AnythingElseICanHelpF[] = _(\"{COLOR RED}Is there anything else I can do?\");\n\nconst u8 gText_Brock[] = _(\"BROCK\");\nconst u8 gText_Misty[] = _(\"MISTY\");\nconst u8 gText_Erika[] = _(\"ERIKA\");\nconst u8 gText_Sabrina[] = _(\"SABRINA\");\nconst u8 gText_Blaine[] = _(\"BLAINE\");\nconst u8 gText_CommaSpace[] = _(\", \");\nconst u8 gText_NewLine[] = _(\"\\n\");\nconst u8 gText_AndSpace[] = _(\"and \");\nconst u8 gText_SwapToKanto[] = _(\"{START_BUTTON}KANTO MODE\");\nconst u8 gText_SwapToExtended[] = _(\"{START_BUTTON}EXTENDED MODE\");\nconst u8 gText_Extended[] = _(\"EXTENDED\");\nconst u8 gText_NumericalModeExtended[] = _(\"NUMERICAL MODE: EXTENDED\");\n\nconst u8 gText_An[] = _(\"an\");\nconst u8 gText_A[] = _(\"a\");\n\nconst u8 gText_WhoAreThey[] = _(\"Who are they?\");\nconst u8 gText_HowDoIBattleThem[] = _(\"How do I battle them?\");\nconst u8 gText_AboutTitles[] = _(\"About titles\");\nconst u8 gText_Nothing[] = _(\"Exit\");\n"
  },
  {
    "path": "src/task.c",
    "content": "#include \"global.h\"\n#include \"task.h\"\n\n#define HEAD_SENTINEL 0xFE\n#define TAIL_SENTINEL 0xFF\n\nstruct Task gTasks[NUM_TASKS];\n\nstatic void InsertTask(u8 newTaskId);\nstatic u8 FindFirstActiveTask();\n\nvoid ResetTasks(void)\n{\n    u32 i;\n\n    for (i = 0; i < NUM_TASKS; i++)\n    {\n        gTasks[i].isActive = FALSE;\n        gTasks[i].func = TaskDummy;\n        gTasks[i].prev = i;\n        gTasks[i].next = i + 1;\n        gTasks[i].priority = -1;\n        memset(gTasks[i].data, 0, sizeof(gTasks[i].data));\n    }\n\n    gTasks[0].prev = HEAD_SENTINEL;\n    gTasks[NUM_TASKS - 1].next = TAIL_SENTINEL;\n}\n\nu8 CreateTask(TaskFunc func, u8 priority)\n{\n    u32 i;\n\n    for (i = 0; i < NUM_TASKS; i++)\n    {\n        if (!gTasks[i].isActive)\n        {\n            gTasks[i].func = func;\n            gTasks[i].priority = priority;\n            InsertTask(i);\n            memset(gTasks[i].data, 0, sizeof(gTasks[i].data));\n            gTasks[i].isActive = TRUE;\n            return i;\n        }\n    }\n\n    return 0;\n}\n\nstatic void InsertTask(u8 newTaskId)\n{\n    u8 taskId = FindFirstActiveTask();\n\n    if (taskId == NUM_TASKS)\n    {\n        // The new task is the only task.\n        gTasks[newTaskId].prev = HEAD_SENTINEL;\n        gTasks[newTaskId].next = TAIL_SENTINEL;\n        return;\n    }\n\n    while (1)\n    {\n        if (gTasks[newTaskId].priority < gTasks[taskId].priority)\n        {\n            // We've found a task with a higher priority value,\n            // so we insert the new task before it.\n            gTasks[newTaskId].prev = gTasks[taskId].prev;\n            gTasks[newTaskId].next = taskId;\n            if (gTasks[taskId].prev != HEAD_SENTINEL)\n                gTasks[gTasks[taskId].prev].next = newTaskId;\n            gTasks[taskId].prev = newTaskId;\n            return;\n        }\n        if (gTasks[taskId].next == TAIL_SENTINEL)\n        {\n            // We've reached the end.\n            gTasks[newTaskId].prev = taskId;\n            gTasks[newTaskId].next = gTasks[taskId].next;\n            gTasks[taskId].next = newTaskId;\n            return;\n        }\n        taskId = gTasks[taskId].next;\n    }\n}\n\nvoid DestroyTask(u8 taskId)\n{\n    if (gTasks[taskId].isActive)\n    {\n        gTasks[taskId].isActive = FALSE;\n\n        if (gTasks[taskId].prev == HEAD_SENTINEL)\n        {\n            if (gTasks[taskId].next != TAIL_SENTINEL)\n                gTasks[gTasks[taskId].next].prev = HEAD_SENTINEL;\n        }\n        else\n        {\n            if (gTasks[taskId].next == TAIL_SENTINEL)\n            {\n                gTasks[gTasks[taskId].prev].next = TAIL_SENTINEL;\n            }\n            else\n            {\n                gTasks[gTasks[taskId].prev].next = gTasks[taskId].next;\n                gTasks[gTasks[taskId].next].prev = gTasks[taskId].prev;\n            }\n        }\n    }\n}\n\nvoid RunTasks(void)\n{\n    u8 taskId = FindFirstActiveTask();\n\n    if (taskId != NUM_TASKS)\n    {\n        do\n        {\n            gTasks[taskId].func(taskId);\n            taskId = gTasks[taskId].next;\n        } while (taskId != TAIL_SENTINEL);\n    }\n}\n\nstatic u8 FindFirstActiveTask()\n{\n    u8 taskId;\n\n    for (taskId = 0; taskId < NUM_TASKS; taskId++)\n        if (gTasks[taskId].isActive == TRUE && gTasks[taskId].prev == HEAD_SENTINEL)\n            break;\n\n    return taskId;\n}\n\nvoid TaskDummy(u8 taskId)\n{\n}\n\nvoid SetTaskFuncWithFollowupFunc(u8 taskId, TaskFunc func, TaskFunc followupFunc)\n{\n    u8 followupFuncIndex = NUM_TASK_DATA - 2; // Should be const.\n\n    gTasks[taskId].data[followupFuncIndex] = (s16)((u32)followupFunc);\n    gTasks[taskId].data[followupFuncIndex + 1] = (s16)((u32)followupFunc >> 16); // Store followupFunc as two half-words in the data array.\n    gTasks[taskId].func = func;\n}\n\nvoid SwitchTaskToFollowupFunc(u8 taskId)\n{\n    u8 followupFuncIndex = NUM_TASK_DATA - 2; // Should be const.\n\n    gTasks[taskId].func = (TaskFunc)((u16)(gTasks[taskId].data[followupFuncIndex]) | (gTasks[taskId].data[followupFuncIndex + 1] << 16));\n}\n\nbool8 FuncIsActiveTask(TaskFunc func)\n{\n    u32 i;\n\n    for (i = 0; i < NUM_TASKS; i++)\n        if (gTasks[i].isActive == TRUE && gTasks[i].func == func)\n            return TRUE;\n\n    return FALSE;\n}\n\nu8 FindTaskIdByFunc(TaskFunc func)\n{\n    s32 i;\n\n    for (i = 0; i < NUM_TASKS; i++)\n        if (gTasks[i].isActive == TRUE && gTasks[i].func == func)\n            return (u8)i;\n\n    return -1;\n}\n\nu8 GetTaskCount(void)\n{\n    u32 i;\n    u8 count = 0;\n\n    for (i = 0; i < NUM_TASKS; i++)\n        if (gTasks[i].isActive == TRUE)\n            count++;\n\n    return count;\n}\n\nvoid SetWordTaskArg(u8 taskId, u8 dataElem, unsigned long value)\n{\n    if (dataElem <= 14)\n    {\n        gTasks[taskId].data[dataElem] = value;\n        gTasks[taskId].data[dataElem + 1] = value >> 16;\n    }\n}\n\nu32 GetWordTaskArg(u8 taskId, u8 dataElem)\n{\n    if (dataElem <= 14)\n        return (u16)gTasks[taskId].data[dataElem] | (gTasks[taskId].data[dataElem + 1] << 16);\n    else\n        return 0;\n}\n"
  },
  {
    "path": "src/teachy_tv.c",
    "content": "#include \"task.h\"\n#include \"gflib.h\"\n#include \"menu_helpers.h\"\n#include \"new_menu_helpers.h\"\n#include \"scanline_effect.h\"\n#include \"decompress.h\"\n#include \"list_menu.h\"\n#include \"item_menu.h\"\n#include \"item.h\"\n#include \"menu_indicators.h\"\n#include \"event_object_movement.h\"\n#include \"random.h\"\n#include \"constants/songs.h\"\n#include \"constants/items.h\"\n#include \"event_data.h\"\n#include \"load_save.h\"\n#include \"battle_transition.h\"\n#include \"battle_main.h\"\n#include \"battle.h\"\n#include \"battle_controllers.h\"\n#include \"global.fieldmap.h\"\n#include \"teachy_tv.h\"\n#include \"help_system.h\"\n#include \"overworld.h\"\n#include \"graphics.h\"\n#include \"fieldmap.h\"\n#include \"strings.h\"\n#include \"constants/field_effects.h\"\n#include \"constants/event_objects.h\"\n\nstruct TeachyTvCtrlBlk\n{\n    MainCallback callback;\n    u8 mode;\n    u8 whichScript;\n    u16 scrollOffset;\n    u16 selectedRow;\n};\n\nstruct TeachyTvBuf\n{\n    MainCallback savedCallback;\n    u16 screenTilemap[BG_SCREEN_SIZE];\n    u16 buffer2[BG_SCREEN_SIZE];\n    u16 buffer3[BG_SCREEN_SIZE];\n    u16 titleTilemap[BG_SCREEN_SIZE];\n    u8 grassAnimCounterLo;\n    u8 grassAnimCounterHi;\n    u8 grassAnimDisabled;\n    u8 scrollIndicatorArrowPairId;\n};\n\nstatic EWRAM_DATA struct TeachyTvCtrlBlk sStaticResources = {0};\nstatic EWRAM_DATA struct TeachyTvBuf * sResources = NULL;\n\nstatic void TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos(u8 taskId);\nstatic void TTVcmd_ClearBg2TeachyTvGraphic(u8 taskId);\nstatic void TTVcmd_NpcMoveAndSetupTextPrinter(u8 taskId);\nstatic void TTVcmd_IdleIfTextPrinterIsActive(u8 taskId);\nstatic void TTVcmd_TextPrinterSwitchStringByOptionChosen(u8 taskId);\nstatic void TTVcmd_TextPrinterSwitchStringByOptionChosen2(u8 taskId);\nstatic void TTVcmd_IdleIfTextPrinterIsActive2(u8 taskId);\nstatic void TTVcmd_EraseTextWindowIfKeyPressed(u8 taskId);\nstatic void TTVcmd_StartAnimNpcWalkIntoGrass(u8 taskId);\nstatic void TTVcmd_DudeMoveUp(u8 taskId);\nstatic void TTVcmd_DudeMoveRight(u8 taskId);\nstatic void TTVcmd_DudeTurnLeft(u8 taskId);\nstatic void TTVcmd_DudeMoveLeft(u8 taskId);\nstatic void TTVcmd_RenderAndRemoveBg1EndGraphic(u8 taskId);\nstatic void TTVcmd_TaskBattleOrFadeByOptionChosen(u8 taskId);\nstatic void TeachyTvCallback(void);\nstatic void TeachyTvMainCallback(void);\nstatic void TeachyTvVblankHandler(void);\nstatic void TeachyTvCreateAndRenderRbox(void);\nstatic void TeachyTvInitIo(void);\nstatic u8 TeachyTvSetupObjEventAndOam(void);\nstatic void TeachyTvSetupPostBattleWindowAndObj(u8);\nstatic u8 TeachyTvSetupWindow(void);\nstatic void TeachyTvSetupScrollIndicatorArrowPair(void);\nstatic void TeachyTvSetWindowRegs(void);\nstatic void TeachyTvSetupBg(void);\nstatic void TeachyTvLoadGraphic(void);\nstatic void TeachyTvPostBattleFadeControl(u8);\nstatic void TeachyTvOptionListController(u8);\nstatic void TeachyTvAudioByInput(s32, bool8, struct ListMenu *);\nstatic void TeachyTvQuitFadeControlAndTaskDel(u8 taskId);\nstatic void TeachyTvRenderMsgAndSwitchClusterFuncs(u8 taskId);\nstatic void TeachyTvClearBg1EndGraphicText(void);\nstatic void TTVcmd_End(u8 taskId);\nstatic void TeachyTvSetupBagItemsByOptionChosen(void);\nstatic void TeachyTvPrepBattle(u8 taskId);\nstatic void TeachyTvGrassAnimationMain(u8 taskId, s16 x, s16 y, u8 subpriority, bool8 mode);\nstatic void TeachyTvLoadBg3Map(u16 *);\nstatic u8 TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj(s16 x, s16 y);\nstatic void TeachyTvGrassAnimationObjCallback(struct Sprite *sprite);\nstatic void TeachyTvRestorePlayerPartyCallback(void);\nstatic void TeachyTvPreBattleAnimAndSetBattleCallback(u8 taskId);\nstatic void TeachyTvLoadMapTilesetToBuffer(const struct Tileset *ts, u8 *dstBuffer, u16 size);\nstatic void TeachyTvPushBackNewMapPalIndexArrayEntry(const struct MapLayout *mStruct, u16 *buf1, u8 *palIndexArray, u16 mapEntry, u16 offset);\nstatic void TeachyTvComputeMapTilesFromTilesetAndMetaTiles(const u16 *metaTilesArray, u8 *blockBuf, u8 *tileset);\nstatic void TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(u8 *blockBuf, u8 *tileset, u8 metaTile);\nstatic u16 TeachyTvComputePalIndexArrayEntryByMetaTile(u8 *palIndexArrayBuf, u16 metaTile);\nstatic void TeachyTvLoadMapPalette(const struct MapLayout * mStruct, const u8 *palIndexArray);\n\nstatic const struct BgTemplate sBgTemplates[] = \n{\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000,\n    },\n    {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000,\n    },\n    {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000,\n    },\n    {\n        .bg = 3,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 28,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000,\n    },\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = \n{\n    {\n        .bg = 1,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 3,\n        .baseBlock = 0x0EA,\n    },\n    {\n        .bg = 0,\n        .tilemapLeft = 4,\n        .tilemapTop = 1,\n        .width = 22,\n        .height = 12,\n        .paletteNum = 3,\n        .baseBlock = 0x152,\n    },\n    DUMMY_WIN_TEMPLATE,\n};\n\nstatic const struct ListMenuItem sListMenuItems[] = \n{\n    {\n        .label = gTeachyTvString_TeachBattle,\n        .index = TTVSCR_BATTLE\n    },\n    {\n        .label = gTeachyTvString_StatusProblems,\n        .index = TTVSCR_STATUS\n    },\n    {\n        .label = gTeachyTvString_TypeMatchups,\n        .index = TTVSCR_MATCHUPS\n    },\n    {\n        .label = gTeachyTvString_CatchPkmn,\n        .index = TTVSCR_CATCHING\n    },\n    {\n        .label = gTeachyTvString_AboutTMs,\n        .index = TTVSCR_TMS\n    },\n    {\n        .label = gTeachyTvString_RegisterItem,\n        .index = TTVSCR_REGISTER\n    },\n\n    {\n        .label = gTeachyTvString_Cancel,\n        .index = -2\n    },\n};\n\nstatic const struct ListMenuItem sListMenuItems_NoTMCase[] = \n{\n    {\n        .label = gTeachyTvString_TeachBattle,\n        .index = TTVSCR_BATTLE\n    },\n    {\n        .label = gTeachyTvString_StatusProblems,\n        .index = TTVSCR_STATUS\n    },\n    {\n        .label = gTeachyTvString_TypeMatchups,\n        .index = TTVSCR_MATCHUPS\n    },\n    {\n        .label = gTeachyTvString_CatchPkmn,\n        .index = TTVSCR_CATCHING\n    },\n    {\n        .label = gTeachyTvString_Cancel,\n        .index = -2\n    },\n};\n\nstatic const struct ListMenuTemplate sListMenuTemplate = \n{\n    .items = sListMenuItems,\n    .moveCursorFunc = NULL,\n    .itemPrintFunc = NULL,\n    .totalItems = 7,\n    .maxShowed = 6,\n    .windowId = 0,\n    .header_X = 0,\n    .item_X = 8,\n    .cursor_X = 0,\n    .upText_Y = 6,\n    .cursorPal = 0x1,\n    .fillValue = 0x0,\n    .cursorShadowPal = 0x2,\n    .lettersSpacing = 0x0,\n    .itemVerticalPadding = 0x0,\n    .scrollMultiple = 0x1,\n    .fontId = FONT_NORMAL,\n    .cursorKind = 0x0,\n};\n\nstatic const struct ScrollArrowsTemplate sScrollIndicatorArrowPair = \n{\n    .firstArrowType = 0x2,\n    .firstX = 0x78,\n    .firstY = 0xC,\n    .secondArrowType = 0x3,\n    .secondX = 0x78,\n    .secondY = 0x64,\n    .fullyUpThreshold = 0,\n    .fullyDownThreshold = 1,\n    .tileTag = 0x800,\n    .palTag = 0x800,\n    .palNum = 0x0,\n};\n\nstatic const u8 sWhereToReturnToFromBattle[] = \n{\n    12,\n    12,\n    12,\n    12,\n     9,\n     9\n};\n\nstatic void (* const sBattleScript[])(u8) = \n{\n    TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos,\n    TTVcmd_ClearBg2TeachyTvGraphic,\n    TTVcmd_NpcMoveAndSetupTextPrinter,\n    TTVcmd_IdleIfTextPrinterIsActive,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_TextPrinterSwitchStringByOptionChosen,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_EraseTextWindowIfKeyPressed,\n    TTVcmd_StartAnimNpcWalkIntoGrass,\n    TTVcmd_DudeMoveUp,\n    TTVcmd_DudeMoveRight,\n    TTVcmd_TaskBattleOrFadeByOptionChosen,\n    TTVcmd_TextPrinterSwitchStringByOptionChosen2,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_EraseTextWindowIfKeyPressed,\n    TTVcmd_DudeTurnLeft,\n    TTVcmd_DudeMoveLeft,\n    TTVcmd_RenderAndRemoveBg1EndGraphic,\n    TTVcmd_End,\n};\n\nstatic void (* const sStatusScript[])(u8) = \n{\n    TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos,\n    TTVcmd_ClearBg2TeachyTvGraphic,\n    TTVcmd_NpcMoveAndSetupTextPrinter,\n    TTVcmd_IdleIfTextPrinterIsActive,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_TextPrinterSwitchStringByOptionChosen,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_EraseTextWindowIfKeyPressed,\n    TTVcmd_StartAnimNpcWalkIntoGrass,\n    TTVcmd_DudeMoveUp,\n    TTVcmd_DudeMoveRight,\n    TTVcmd_TaskBattleOrFadeByOptionChosen,\n    TTVcmd_TextPrinterSwitchStringByOptionChosen2,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_EraseTextWindowIfKeyPressed,\n    TTVcmd_DudeTurnLeft,\n    TTVcmd_DudeMoveLeft,\n    TTVcmd_RenderAndRemoveBg1EndGraphic,\n    TTVcmd_End,\n};\n\nstatic void (* const sMatchupsScript[])(u8) = \n{\n    TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos,\n    TTVcmd_ClearBg2TeachyTvGraphic,\n    TTVcmd_NpcMoveAndSetupTextPrinter,\n    TTVcmd_IdleIfTextPrinterIsActive,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_TextPrinterSwitchStringByOptionChosen,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_EraseTextWindowIfKeyPressed,\n    TTVcmd_StartAnimNpcWalkIntoGrass,\n    TTVcmd_DudeMoveUp,\n    TTVcmd_DudeMoveRight,\n    TTVcmd_TaskBattleOrFadeByOptionChosen,\n    TTVcmd_TextPrinterSwitchStringByOptionChosen2,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_EraseTextWindowIfKeyPressed,\n    TTVcmd_DudeTurnLeft,\n    TTVcmd_DudeMoveLeft,\n    TTVcmd_RenderAndRemoveBg1EndGraphic,\n    TTVcmd_End,\n};\n\nstatic void (* const sCatchingScript[])(u8) = \n{\n    TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos,\n    TTVcmd_ClearBg2TeachyTvGraphic,\n    TTVcmd_NpcMoveAndSetupTextPrinter,\n    TTVcmd_IdleIfTextPrinterIsActive,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_TextPrinterSwitchStringByOptionChosen,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_EraseTextWindowIfKeyPressed,\n    TTVcmd_StartAnimNpcWalkIntoGrass,\n    TTVcmd_DudeMoveUp,\n    TTVcmd_DudeMoveRight,\n    TTVcmd_TaskBattleOrFadeByOptionChosen,\n    TTVcmd_TextPrinterSwitchStringByOptionChosen2,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_EraseTextWindowIfKeyPressed,\n    TTVcmd_DudeTurnLeft,\n    TTVcmd_DudeMoveLeft,\n    TTVcmd_RenderAndRemoveBg1EndGraphic,\n    TTVcmd_End,\n};\n\nstatic void (* const sTMsScript[])(u8) = \n{\n    TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos,\n    TTVcmd_ClearBg2TeachyTvGraphic,\n    TTVcmd_NpcMoveAndSetupTextPrinter,\n    TTVcmd_IdleIfTextPrinterIsActive,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_TextPrinterSwitchStringByOptionChosen,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_EraseTextWindowIfKeyPressed,\n    TTVcmd_TaskBattleOrFadeByOptionChosen,\n    TTVcmd_TextPrinterSwitchStringByOptionChosen2,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_EraseTextWindowIfKeyPressed,\n    TTVcmd_DudeTurnLeft,\n    TTVcmd_DudeMoveLeft,\n    TTVcmd_RenderAndRemoveBg1EndGraphic,\n    TTVcmd_End,\n};\n\nstatic void (* const sRegisterKeyItemScript[])(u8) = \n{\n    TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos,\n    TTVcmd_ClearBg2TeachyTvGraphic,\n    TTVcmd_NpcMoveAndSetupTextPrinter,\n    TTVcmd_IdleIfTextPrinterIsActive,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_TextPrinterSwitchStringByOptionChosen,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_EraseTextWindowIfKeyPressed,\n    TTVcmd_TaskBattleOrFadeByOptionChosen,\n    TTVcmd_TextPrinterSwitchStringByOptionChosen2,\n    TTVcmd_IdleIfTextPrinterIsActive2,\n    TTVcmd_EraseTextWindowIfKeyPressed,\n    TTVcmd_DudeTurnLeft,\n    TTVcmd_DudeMoveLeft,\n    TTVcmd_RenderAndRemoveBg1EndGraphic,\n    TTVcmd_End,\n};\n\nstatic void TeachyTvCallback(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    DoScheduledBgTilemapCopiesToVram();\n    UpdatePaletteFade();\n}\n\nstatic void TeachyTvVblankHandler(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid InitTeachyTvController(u8 mode, MainCallback cb)\n{\n    sStaticResources.mode = mode;\n    sStaticResources.callback = cb;\n    if (mode == 0)\n    {\n        sStaticResources.scrollOffset = 0;\n        sStaticResources.selectedRow = 0;\n        sStaticResources.whichScript = TTVSCR_BATTLE;\n    }\n    if (mode == 1)\n    {\n        sStaticResources.mode = 0;\n    }\n    SetMainCallback2(TeachyTvMainCallback);\n}\n\nvoid CB2_ReturnToTeachyTV(void)\n{\n    if (sStaticResources.mode == 1)\n        InitTeachyTvController(1, sStaticResources.callback);\n    else\n        InitTeachyTvController(2, sStaticResources.callback);\n}\n\nvoid SetTeachyTvControllerModeToResume(void)\n{\n    sStaticResources.mode = 1;\n}\n\nstatic void TeachyTvMainCallback(void)\n{\n    u8 taskId;\n    struct Task *taskAddr;\n\n    switch (gMain.state)\n    {\n    case 0:\n        sResources = AllocZeroed(sizeof(struct TeachyTvBuf));\n        sResources->savedCallback = NULL;\n        sResources->grassAnimDisabled = 0;\n        sResources->scrollIndicatorArrowPairId = 0xFF;\n        SetVBlankHBlankCallbacksToNull();\n        ClearScheduledBgCopiesToVram();\n        ScanlineEffect_Stop();\n        FreeAllSpritePalettes();\n        ResetPaletteFade();\n        ResetSpriteData();\n        ResetTasks();\n        TeachyTvSetupBg();\n        TeachyTvLoadGraphic();\n        ++gMain.state;\n        break;\n    case 1:\n        if (FreeTempTileDataBuffersIfPossible() == TRUE)\n            return;\n        TeachyTvCreateAndRenderRbox();\n        TeachyTvInitIo();\n        if (sStaticResources.mode == 2)\n        {\n            taskId = CreateTask(TeachyTvPostBattleFadeControl, 0);\n            gTasks[taskId].data[1] = TeachyTvSetupObjEventAndOam();\n            TeachyTvSetupPostBattleWindowAndObj(taskId);\n        }\n        else\n        {\n            taskId = CreateTask(TeachyTvOptionListController, 0);\n            gTasks[taskId].data[0] = TeachyTvSetupWindow();\n            gTasks[taskId].data[1] = TeachyTvSetupObjEventAndOam();\n            TeachyTvSetupScrollIndicatorArrowPair();\n            PlayNewMapMusic(MUS_TEACHY_TV_MENU);\n            TeachyTvSetWindowRegs();\n        }\n        ScheduleBgCopyTilemapToVram(0);\n        ScheduleBgCopyTilemapToVram(1);\n        ScheduleBgCopyTilemapToVram(2);\n        ScheduleBgCopyTilemapToVram(3);\n        SetHelpContextDontCheckBattle(HELPCONTEXT_BAG);\n        BlendPalettes(PALETTES_ALL, 0x10, 0);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, 0);\n        SetVBlankCallback(TeachyTvVblankHandler);\n        SetMainCallback2(TeachyTvCallback);\n        break;\n    }\n}\n\nstatic void TeachyTvSetupBg(void)\n{\n    ResetAllBgsCoordinatesAndBgCntRegs();\n    ResetBgsAndClearDma3BusyFlags(0);\n    InitBgsFromTemplates(0, sBgTemplates, 4);\n    SetBgTilemapBuffer(1, sResources->screenTilemap);\n    SetBgTilemapBuffer(2, sResources->buffer2);\n    SetBgTilemapBuffer(3, sResources->buffer3);\n    SetGpuReg(REG_OFFSET_DISPCNT, 0x3040);\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n    ShowBg(3);\n    ChangeBgX(3, 0x1000, 2);\n    ChangeBgY(3, 0x2800, 1);\n    sResources->grassAnimCounterLo = 0;\n    sResources->grassAnimCounterHi = 3;\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n}\n\nstatic void TeachyTvLoadGraphic(void)\n{\n    u16 src = RGB_BLACK;\n    ResetTempTileDataBuffers();\n    DecompressAndCopyTileDataToVram(1, gTeachyTv_Gfx, 0, 0, 0);\n    LZDecompressWram(gTeachyTvScreen_Tilemap, sResources->screenTilemap);\n    LZDecompressWram(gTeachyTvTitle_Tilemap, sResources->titleTilemap);\n    LoadCompressedPalette(gTeachyTv_Pal, BG_PLTT_ID(0), 4 * PLTT_SIZE_4BPP);\n    LoadPalette(&src, BG_PLTT_ID(0), sizeof(src));\n    LoadSpritePalette(&gSpritePalette_GeneralFieldEffect1);\n    TeachyTvLoadBg3Map(sResources->buffer3);\n}\n\nstatic void TeachyTvCreateAndRenderRbox(void)\n{\n    InitWindows(sWindowTemplates);\n    DeactivateAllTextPrinters();\n    FillWindowPixelBuffer(0, 0xCC);\n    PutWindowTilemap(0);\n    PutWindowTilemap(1);\n    CopyWindowToVram(0, COPYWIN_GFX);\n}\n\nstatic u8 TeachyTvSetupWindow(void)\n{\n    gMultiuseListMenuTemplate = sListMenuTemplate;\n    gMultiuseListMenuTemplate.windowId = 1;\n    gMultiuseListMenuTemplate.moveCursorFunc = TeachyTvAudioByInput;\n    if (!CheckBagHasItem(ITEM_TM_CASE, 1))\n    {\n        gMultiuseListMenuTemplate.items = sListMenuItems_NoTMCase;\n        gMultiuseListMenuTemplate.totalItems = 5;\n        gMultiuseListMenuTemplate.maxShowed = 5;\n        gMultiuseListMenuTemplate.upText_Y = (gMultiuseListMenuTemplate.upText_Y + 8) & 0xF;\n    }\n    return ListMenuInit(\n               &gMultiuseListMenuTemplate,\n               sStaticResources.scrollOffset,\n               sStaticResources.selectedRow\n    );\n}\n\nstatic void TeachyTvSetupScrollIndicatorArrowPair(void)\n{\n    if (!CheckBagHasItem(ITEM_TM_CASE, 1))\n    {\n        struct TeachyTvBuf * temp = sResources;\n        temp->scrollIndicatorArrowPairId = 0xFF;\n    }\n    else\n    {\n        sResources->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPair(&sScrollIndicatorArrowPair, &(sStaticResources.scrollOffset));\n    }\n}\n\nstatic void TeachyTvRemoveScrollIndicatorArrowPair(void)\n{\n    if (sResources->scrollIndicatorArrowPairId != 0xFF)\n    {\n        RemoveScrollIndicatorArrowPair(sResources->scrollIndicatorArrowPairId);\n        sResources->scrollIndicatorArrowPairId = 0xFF;\n    }\n}\n\nstatic void TeachyTvAudioByInput(s32 notUsed, bool8 play, struct ListMenu *notUsedAlt)\n{\n    if (play != TRUE)\n        PlaySE(SE_SELECT);\n}\n\nstatic void TeachyTvInitIo(void)\n{\n    SetGpuReg(REG_OFFSET_WININ, 0x3F);\n    SetGpuReg(REG_OFFSET_WINOUT, 0x1F);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0xCC);\n    SetGpuReg(REG_OFFSET_BLDY, 0x5);\n}\n\nstatic u8 TeachyTvSetupObjEventAndOam(void)\n{\n    u8 objId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_TEACHY_TV_HOST, SpriteCallbackDummy, 0, 0, 8);\n    gSprites[objId].oam.priority = 2;\n    gSprites[objId].invisible = 1;\n    return objId;\n}\n\nstatic void TeachyTvSetSpriteCoordsAndSwitchFrame(u8 objId, u16 x, u16 y, u8 frame)\n{\n    gSprites[objId].x2 = x;\n    gSprites[objId].y2 = y;\n    gSprites[objId].invisible = 0;\n    StartSpriteAnim(&gSprites[objId], frame);\n}\n\nstatic void TeachyTvSetWindowRegs(void)\n{\n    SetGpuReg(REG_OFFSET_WIN0V, 0xC64);\n    SetGpuReg(REG_OFFSET_WIN0H, 0x1CD4);\n}\n\nstatic void TeachyTvClearWindowRegs(void)\n{\n    SetGpuReg(REG_OFFSET_WIN0V, 0x0);\n    SetGpuReg(REG_OFFSET_WIN0H, 0x0);\n}\n\nstatic void TeachyTvBg2AnimController(void)\n{\n    u16 * tilemapBuffer = GetBgTilemapBuffer(2);\n    u8 i, j;\n    for (i = 1; i < 13; i++)\n    {\n        for (j = 2; j < 28; j++)\n        {\n            tilemapBuffer[32 * i + j] = ((Random() & 3) << 10) + 0x301F;\n        }\n    }\n    ScheduleBgCopyTilemapToVram(2);\n}\n\nstatic void TeachyTvSetupPostBattleWindowAndObj(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    struct Sprite *objAddr = &gSprites[data[1]];\n\n    ClearWindowTilemap(1);\n    TeachyTvClearWindowRegs();\n    switch (sStaticResources.whichScript)\n    {\n    case TTVSCR_BATTLE:\n    case TTVSCR_STATUS:\n    case TTVSCR_MATCHUPS:\n    case TTVSCR_CATCHING:\n        TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 0x78, 0x38, 0);\n        ChangeBgX(3, 0x3000, 1);\n        ChangeBgY(3, 0x3000, 2);\n        sResources->grassAnimCounterLo += 3;\n        sResources->grassAnimCounterHi -= 3;\n        break;\n    case TTVSCR_TMS:\n    case TTVSCR_REGISTER:\n        TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 0x78, 0x38, 0);\n        break;\n    }\n\n    data[4] = 0;\n    data[5] = 0;\n    TeachyTvGrassAnimationMain(taskId, objAddr->x2, objAddr->y2, 0, 1);\n}\n\nstatic void TeachyTvInitTextPrinter(const u8 *text)\n{\n    gTextFlags.autoScroll = 0;\n    AddTextPrinterParameterized2(0, FONT_MALE, text, GetTextSpeedSetting(), 0, 1, 0xC, 2);\n}\n\nstatic void TeachyTvFree(void)\n{\n    Free(sResources);\n    sResources = NULL;\n    FreeAllWindowBuffers();\n}\n\nstatic void TeachyTvQuitBeginFade(u8 taskId)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, 0);\n    gTasks[taskId].func = TeachyTvQuitFadeControlAndTaskDel;\n}\n\nstatic void TeachyTvQuitFadeControlAndTaskDel(u8 taskId)\n{\n    if (!(gPaletteFade.active))\n    {\n        if (sResources->savedCallback != NULL)\n        {\n            SetMainCallback2(sResources->savedCallback);\n        }\n        else\n        {\n            Overworld_PlaySpecialMapMusic();\n            SetMainCallback2(sStaticResources.callback);\n        }\n        TeachyTvFree();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void TeachyTvOptionListController(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    s32 input;\n\n    TeachyTvBg2AnimController();\n    if (!gPaletteFade.active)\n    {\n        input = ListMenu_ProcessInput(data[0]);\n        ListMenuGetScrollAndRow(data[0], &sStaticResources.scrollOffset, &sStaticResources.selectedRow);\n        if ((JOY_NEW(SELECT_BUTTON) && sStaticResources.callback != CB2_BagMenuFromStartMenu))\n        {\n            PlaySE(SE_SELECT);\n            TeachyTvQuitBeginFade(taskId);\n        }\n        else\n        {\n            switch (input)\n            {\n            case -1:\n                break;\n            case -2:\n                PlaySE(SE_SELECT);\n                TeachyTvQuitBeginFade(taskId);\n                break;\n            default:\n                PlaySE(SE_SELECT);\n                sStaticResources.whichScript = input;\n                DestroyListMenuTask(data[0], &sStaticResources.scrollOffset, &sStaticResources.selectedRow);\n                TeachyTvClearWindowRegs();\n                ClearWindowTilemap(1);\n                ScheduleBgCopyTilemapToVram(0);\n                TeachyTvRemoveScrollIndicatorArrowPair();\n                data[3] = 0;\n                data[2] = 0;\n                gTasks[taskId].func = TeachyTvRenderMsgAndSwitchClusterFuncs;\n                break;\n            }\n        }\n    }\n}\n\nstatic void TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    TeachyTvBg2AnimController();\n    if (++data[2] > 63)\n    {\n        CopyToBgTilemapBufferRect_ChangePalette(2, sResources->titleTilemap, 0, 0, 0x20, 0x20, 0x11);\n        TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 8, 0x38, 7);\n        ScheduleBgCopyTilemapToVram(2);\n        data[2] = 0;\n        ++data[3];\n        PlayNewMapMusic(MUS_FOLLOW_ME);\n    }\n}\n\nstatic void TTVcmd_ClearBg2TeachyTvGraphic(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (++data[2] == 134)\n    {\n        FillBgTilemapBufferRect_Palette0(2, 0, 2, 1, 0x1A, 0xC);\n        ScheduleBgCopyTilemapToVram(2);\n        data[2] = 0;\n        ++data[3];\n    }\n}\n\nstatic void TTVcmd_NpcMoveAndSetupTextPrinter(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    struct Sprite *spriteAddr = &gSprites[data[1]];\n    if (data[2] != 35)\n        ++data[2];\n    else {\n        if (spriteAddr->x2 == 0x78)\n        {\n            StartSpriteAnim(&gSprites[data[1]], 0);\n            TeachyTvInitTextPrinter(gTeachyTvText_PokedudeSaysHello);\n            data[2] = 0;\n            ++data[3];\n        }\n        else\n            ++spriteAddr->x2;\n    }   \n}\n\nstatic void TTVcmd_IdleIfTextPrinterIsActive(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!RunTextPrinters_CheckActive(0))\n        ++data[3];\n}\n\nstatic void TeachyTvRenderMsgAndSwitchClusterFuncs(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (JOY_NEW(B_BUTTON))\n    {\n        sResources->grassAnimDisabled = 1;\n        TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 0, 0, 0);\n        FillWindowPixelBuffer(0, 0xCC);\n        CopyWindowToVram(0, COPYWIN_GFX);\n        TeachyTvClearBg1EndGraphicText();\n        data[2] = 0;\n        data[3] = 0;\n        gTasks[taskId].func = TTVcmd_End;\n    }\n    else\n    {\n        static void (* const * const array[])(u8) =\n        {\n            sBattleScript,\n            sStatusScript,\n            sMatchupsScript,\n            sCatchingScript,\n            sTMsScript,\n            sRegisterKeyItemScript,\n        };\n        void (*const *cluster)(u8) = array[sStaticResources.whichScript];\n        cluster[data[3]](taskId);\n    }\n}\n\nstatic void TTVcmd_TextPrinterSwitchStringByOptionChosen(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    static const u8 *const texts[] = {\n        gTeachyTvText_BattleScript1,\n        gTeachyTvText_StatusScript1,\n        gTeachyTvText_MatchupsScript1,\n        gTeachyTvText_CatchingScript1,\n        gTeachyTvText_TMsScript1,\n        gTeachyTvText_RegisterScript1,\n    };\n    TeachyTvInitTextPrinter(texts[sStaticResources.whichScript]);\n    ++data[3];\n}\n\nstatic void TTVcmd_TextPrinterSwitchStringByOptionChosen2(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    static const u8 *const texts[] =\n    {\n        gTeachyTvText_BattleScript2,\n        gTeachyTvText_StatusScript2,\n        gTeachyTvText_MatchupsScript2,\n        gTeachyTvText_CatchingScript2,\n        gTeachyTvText_TMsScript2,\n        gTeachyTvText_RegisterScript2,\n    };\n    TeachyTvInitTextPrinter(texts[sStaticResources.whichScript]);\n    ++data[3];\n}\n\nstatic const u16 sBg1EndGraphic[] = \n{\n    0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8,\n    0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8,\n};\n\nstatic const struct Subsprite sSubspriteArray[] = \n{\n    {\n        .x = -0x8,\n        .y = -0x8,\n        .shape = 0x1,\n        .size = 0x0,\n        .tileOffset = 0x0,\n        .priority = 0x3,\n    },\n    {\n        .x = -0x8,\n        .y = 0x0,\n        .shape = 0x1,\n        .size = 0x0,\n        .tileOffset = 0x2,\n        .priority = 0x2,\n    },\n};\n\nstatic const struct SubspriteTable sSubspriteTableArray[] = \n{\n    {\n        .subspriteCount = 0,\n        .subsprites = NULL,\n    },\n    {\n        .subspriteCount = 2,\n        .subsprites = sSubspriteArray,\n    },\n};\n\nstatic const u8 sGrassAnimArray[] = \n{\n    0, 0, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 0, 0,\n    0, 0, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 0, 0,\n    0, 0, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 0, 0,\n    0, 0, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 0, 0,\n    0, 0, 1, 1, 1, 1, 1, 1,\n    1, 1, 1, 1, 1, 1, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0,\n    1, 1, 1, 1, 1, 1, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0,\n    1, 1, 1, 1, 1, 1, 0, 0,\n};\n\nstatic void TTVcmd_IdleIfTextPrinterIsActive2(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!RunTextPrinters_CheckActive(0))\n        ++data[3];\n}\n\nstatic void TTVcmd_EraseTextWindowIfKeyPressed(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (JOY_NEW(A_BUTTON | B_BUTTON))\n    {\n        FillWindowPixelBuffer(0, 0xCC);\n        CopyWindowToVram(0, COPYWIN_GFX);\n        ++data[3];\n    }\n}\n\nstatic void TTVcmd_StartAnimNpcWalkIntoGrass(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    StartSpriteAnim(&gSprites[data[1]], 5);\n    data[2] = 0;\n    data[4] = 0;\n    data[5] = 1;\n    ++data[3];\n}\n\nstatic void TTVcmd_DudeMoveUp(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    struct Sprite *obj = &gSprites[data[1]];\n    ChangeBgY(3, 0x100, 2);\n    if (!(++data[2] & 0xF))\n    {\n        --sResources->grassAnimCounterHi;\n        TeachyTvGrassAnimationMain(taskId, obj->x2, obj->y2, 0, 0);\n    }\n    if (data[2] == 48)\n    {\n        data[2] = 0;\n        data[4] = -1;\n        data[5] = 0;\n        StartSpriteAnim(obj, 7);\n        ++data[3];\n    }\n}\n\nstatic void TTVcmd_DudeMoveRight(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    struct Sprite *obj = &gSprites[data[1]];\n    ChangeBgX(3, 0x100, 1);\n    if (!(++data[2] & 0xF))\n        ++sResources->grassAnimCounterLo;\n    if (!((data[2] + 8) & 0xF))\n        TeachyTvGrassAnimationMain(taskId, obj->x2 + 8, obj->y2, 0, 0);\n    if (data[2] == 0x30)\n    {\n        data[2] = 0;\n        data[4] = 0;\n        data[5] = 0;\n        StartSpriteAnim(obj, 3);\n        ++data[3];\n    }\n}\n\nstatic void TTVcmd_DudeTurnLeft(u8 taskId)\n{\n\n    s16 *data = gTasks[taskId].data;\n    struct Sprite *objAddr = &gSprites[data[1]];\n    StartSpriteAnim(objAddr, 6);\n    ++data[3];\n    data[4] = 0;\n    data[5] = 0;\n    TeachyTvGrassAnimationMain(taskId, objAddr->x2, objAddr->y2, 0, 0);\n}\n\nstatic void TTVcmd_DudeMoveLeft(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    struct Sprite *objAddr = &gSprites[data[1]];\n\n    if (!(objAddr->x2 & 0xF))\n        TeachyTvGrassAnimationMain(taskId, objAddr->x2 - 8, objAddr->y2, 0, 0);\n    if (objAddr->x2 == 8)\n        ++data[3];\n    else\n        --objAddr->x2;\n}\n\nstatic void TTVcmd_RenderAndRemoveBg1EndGraphic(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!data[2])\n    {\n        CopyToBgTilemapBufferRect_ChangePalette(1, sBg1EndGraphic, 20, 10, 8, 2, 0x11);\n        ScheduleBgCopyTilemapToVram(1);\n    }\n    if (++data[2] > 126)\n    {\n        TeachyTvClearBg1EndGraphicText();\n        data[2] = 0;\n        ++data[3];\n    }\n}\n\nstatic void TeachyTvClearBg1EndGraphicText(void)\n{\n    FillBgTilemapBufferRect_Palette0(1, 0, 20, 10, 8, 2);\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nstatic void TTVcmd_End(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (data[2] == 0)\n        PlayNewMapMusic(MUS_TEACHY_TV_MENU);\n    TeachyTvBg2AnimController();\n    if (++data[2] > 63)\n    {\n        data[2] = 0;\n        data[3] = 0;\n        data[0] = TeachyTvSetupWindow();\n        gTasks[taskId].func = TeachyTvOptionListController;\n        PutWindowTilemap(0);\n        TeachyTvSetupScrollIndicatorArrowPair();\n        TeachyTvSetWindowRegs();\n        ScheduleBgCopyTilemapToVram(0);\n        ChangeBgX(3, 0x0, 0);\n        ChangeBgY(3, 0x0, 0);\n        ChangeBgX(3, 0x1000, 2);\n        ChangeBgY(3, 0x2800, 1);\n        sResources->grassAnimCounterLo = 0;\n        sResources->grassAnimCounterHi = 3;\n        sResources->grassAnimDisabled = 0;\n    }\n}\n\nstatic void TTVcmd_TaskBattleOrFadeByOptionChosen(u8 taskId)\n{\n    switch (sStaticResources.whichScript)\n    {\n    case TTVSCR_BATTLE:\n    case TTVSCR_STATUS:\n    case TTVSCR_MATCHUPS:\n    case TTVSCR_CATCHING:\n        TeachyTvPrepBattle(taskId);\n        break;\n    case TTVSCR_TMS:\n    case TTVSCR_REGISTER:\n        sResources->savedCallback = TeachyTvSetupBagItemsByOptionChosen;\n        TeachyTvQuitBeginFade(taskId);\n        break;\n    }\n}\n\nstatic void TeachyTvSetupBagItemsByOptionChosen(void)\n{\n    if (sStaticResources.whichScript == TTVSCR_TMS)\n        InitPokedudeBag(ITEMMENULOCATION_TTVSCR_TMS);\n    else\n        InitPokedudeBag(ITEMMENULOCATION_TTVSCR_REGISTER);\n}\n\nstatic void TeachyTvPostBattleFadeControl(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    if (!(gPaletteFade.active))\n    {\n        data[3] = sWhereToReturnToFromBattle[sStaticResources.whichScript];\n        gTasks[taskId].func = TeachyTvRenderMsgAndSwitchClusterFuncs;\n    }\n}\n\nstatic void TeachyTvGrassAnimationMain(u8 taskId, s16 x, s16 y, u8 subpriority, bool8 mode)\n{\n    struct Sprite *obj;\n    u8 spriteId;\n\n    if (sResources->grassAnimDisabled != 1 && TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj(x - 0x10, y))\n    {\n        spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_TALL_GRASS], 0, 0, subpriority);\n        obj = &gSprites[spriteId];\n        obj->x2 = x;\n        obj->y2 = y + 8;\n        obj->callback = TeachyTvGrassAnimationObjCallback;\n        obj->data[0] = taskId;\n        if (mode == 1)\n        {\n            SeekSpriteAnim(obj, 4);\n            obj->oam.priority = 2;\n        }\n        else\n        {\n            SetSubspriteTables(obj, sSubspriteTableArray);\n            obj->subspriteTableNum = 0;\n            obj->subspriteMode = 1;\n        }\n    }\n}\n\nstatic void TeachyTvGrassAnimationObjCallback(struct Sprite *sprite)\n{\n    s16 diff1, diff2;\n    s16 *data = gTasks[sprite->data[0]].data;\n    struct Sprite *objAddr = &gSprites[data[1]];\n\n    if (sResources->grassAnimDisabled == 1)\n        DestroySprite(sprite);\n    else\n    {\n        if (sprite->animCmdIndex == 0)\n            sprite->subspriteTableNum = 1;\n        else\n            sprite->subspriteTableNum = 0;\n        sprite->x2 += data[4];\n        sprite->y2 += data[5];\n        if (sprite->animEnded)\n        {\n            sprite->subpriority = 0;\n            diff1 = sprite->x2 - objAddr->x2;\n            diff2 = sprite->y2 - objAddr->y2;\n            if (diff1 <= -16 || diff1 >= 16 || diff2 <= -16 || diff2 >= 24)\n                DestroySprite(sprite);\n        }\n    }\n}\n\nstatic u8 TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj(s16 x, s16 y)\n{\n    const u8 * arr;\n    struct TeachyTvBuf *ptr;\n    int high, low;\n    if ((x < 0) || (y < 0))\n        return 0;\n    arr = sGrassAnimArray;\n    high = ((y >> 4) + sResources->grassAnimCounterHi) << 4;\n    low = ((x >> 4) + sResources->grassAnimCounterLo);\n    return arr[high+low];\n}\n\nstatic void TeachyTvPrepBattle(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    TeachyTvFree();\n    gSpecialVar_0x8004 = sStaticResources.whichScript;\n    gMain.savedCallback = TeachyTvRestorePlayerPartyCallback;\n    SavePlayerParty();\n    InitPokedudePartyAndOpponent();\n    PlayMapChosenOrBattleBGM(MUS_DUMMY);\n    if (sStaticResources.whichScript == TTVSCR_BATTLE)\n        data[6] = B_TRANSITION_WHITE_BARS_FADE;\n    else\n        data[6] = B_TRANSITION_SLICE;\n    data[7] = 0;\n    gTasks[taskId].func = TeachyTvPreBattleAnimAndSetBattleCallback;\n}\n\nstatic void TeachyTvPreBattleAnimAndSetBattleCallback(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    switch (data[7])\n    {\n    case 0:\n        BattleTransition_StartOnField(data[6]);\n        ++data[7];\n        break;\n    case 1:\n        if (IsBattleTransitionDone())\n        {\n            SetMainCallback2(CB2_InitBattle);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void TeachyTvRestorePlayerPartyCallback(void)\n{\n    LoadPlayerParty();\n    if (gBattleOutcome == B_OUTCOME_DREW)\n        SetTeachyTvControllerModeToResume();\n    else\n        PlayNewMapMusic(MUS_FOLLOW_ME);\n    CB2_ReturnToTeachyTV();\n}\n\nstatic void TeachyTvLoadBg3Map(u16 *buffer)\n{\n    u16 * bgTilesBuffer;\n    u8 * mapTilesRowBuffer;\n    u16 i, j, k;\n    u16 currentBlockIdx;\n    void *tilesetsBuffer;\n    void *palIndicesBuffer;\n    u16 numMapTilesRows = 0;\n    const struct MapLayout *layout = &Route1_Layout;\n    u16 * blockIndicesBuffer = AllocZeroed(0x800);\n    tilesetsBuffer = AllocZeroed(NUM_TILES_TOTAL * TILE_SIZE_4BPP);\n    palIndicesBuffer = Alloc(16);\n    memset(palIndicesBuffer, 0xFF, 16);\n\n    TeachyTvLoadMapTilesetToBuffer(layout->primaryTileset, tilesetsBuffer, NUM_TILES_IN_PRIMARY);\n    TeachyTvLoadMapTilesetToBuffer(layout->secondaryTileset, tilesetsBuffer + NUM_TILES_IN_PRIMARY * TILE_SIZE_4BPP, NUM_TILES_TOTAL - NUM_TILES_IN_PRIMARY);\n\n    for (i = 0; i < 9; i++)\n    {\n        for (j = 0; j < 16; j++)\n        {\n            currentBlockIdx = layout->map[8 + (i + 6) * layout->width + j] & 0x3FF;\n            for (k = 0; k < (i << 4) + j; k++)\n            {\n                if (blockIndicesBuffer[k] == 0)\n                    break;\n                if (blockIndicesBuffer[k] == currentBlockIdx)\n                    break;\n            }\n            if (blockIndicesBuffer[k] == 0)\n            {\n                blockIndicesBuffer[k] = currentBlockIdx;\n                numMapTilesRows++;\n            }\n            TeachyTvPushBackNewMapPalIndexArrayEntry(layout, &buffer[64 * i + 2 * j], palIndicesBuffer, currentBlockIdx, k);\n        }\n    }\n\n    bgTilesBuffer = Alloc(numMapTilesRows * 0x80);\n    mapTilesRowBuffer = Alloc(0x80);\n    for (i = 0; i < numMapTilesRows; i++)\n    {\n        memset(mapTilesRowBuffer, 0, 0x80);\n        if (blockIndicesBuffer[i] < NUM_METATILES_IN_PRIMARY)\n            TeachyTvComputeMapTilesFromTilesetAndMetaTiles((const void *)layout->primaryTileset->metatiles + blockIndicesBuffer[i] * 16, mapTilesRowBuffer, tilesetsBuffer);\n        else\n            TeachyTvComputeMapTilesFromTilesetAndMetaTiles((const void *)layout->secondaryTileset->metatiles + (blockIndicesBuffer[i] - NUM_METATILES_IN_PRIMARY) * 16, mapTilesRowBuffer, tilesetsBuffer);\n        CpuFastCopy(mapTilesRowBuffer, bgTilesBuffer + i * 0x40, 0x80);\n    }\n\n    LoadBgTiles(3, bgTilesBuffer, numMapTilesRows * 0x80, 0);\n    TeachyTvLoadMapPalette(layout, palIndicesBuffer);\n\n    Free(mapTilesRowBuffer);\n    Free(bgTilesBuffer);\n    Free(palIndicesBuffer);\n    Free(tilesetsBuffer);\n    Free(blockIndicesBuffer);\n}\n\nstatic void TeachyTvLoadMapTilesetToBuffer(const struct Tileset *ts, u8 *dstBuffer, u16 size)\n{\n    if (ts)\n    {\n        if (!ts->isCompressed)\n            CpuFastCopy(ts->tiles, dstBuffer, 0x20 * size);\n        else\n            LZDecompressWram(ts->tiles, dstBuffer);\n    }\n}\n\nstatic void TeachyTvPushBackNewMapPalIndexArrayEntry(const struct MapLayout *mStruct, u16 *buf1, u8 *palIndexArray, u16 mapEntry, u16 offset)\n{\n    const u16 * metaTileEntryAddr;\n    if (mapEntry < NUM_METATILES_IN_PRIMARY)\n        metaTileEntryAddr = &mStruct->primaryTileset->metatiles[8 * mapEntry];\n    else\n        metaTileEntryAddr = &mStruct->secondaryTileset->metatiles[8 * (mapEntry - NUM_METATILES_IN_PRIMARY)];\n    buf1[0] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[0]) << 12) + 4 * offset;\n    buf1[1] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[1]) << 12) + 4 * offset + 1;\n    buf1[32] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[2]) << 12) + 4 * offset + 2;\n    buf1[33] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[3]) << 12) + 4 * offset + 3;\n}\n\nstatic void TeachyTvComputeMapTilesFromTilesetAndMetaTiles(const u16 *metaTilesArray, u8 *blockBuf, u8 *tileset)\n{\n    TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf, &tileset[0x20 * (*metaTilesArray & 0x3FF)], (*metaTilesArray >> 10) & 3);\n    TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf, &tileset[0x20 * (metaTilesArray[4] & 0x3FF)], (metaTilesArray[4] >> 10) & 3);\n    TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf + 0x20, &tileset[0x20 * (metaTilesArray[1] & 0x3FF)], (metaTilesArray[1] >> 10) & 3);\n    TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf + 0x20, &tileset[0x20 * (metaTilesArray[5] & 0x3FF)], (metaTilesArray[5] >> 10) & 3);\n    TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf + 0x40, &tileset[0x20 * (metaTilesArray[2] & 0x3FF)], (metaTilesArray[2] >> 10) & 3);\n    TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf + 0x40, &tileset[0x20 * (metaTilesArray[6] & 0x3FF)], (metaTilesArray[6] >> 10) & 3);\n    blockBuf += 0x60;\n    TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf, &tileset[0x20 * (metaTilesArray[3] & 0x3FF)], (metaTilesArray[3] >> 10) & 3);\n    TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf, &tileset[0x20 * (metaTilesArray[7] & 0x3FF)], (metaTilesArray[7] >> 10) & 3);\n}\n\nstatic void TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(u8 *blockBuf, u8 *tileset, u8 metaTile)\n{\n    u8 i, j;\n    u8 * buffer = AllocZeroed(0x20);\n    u8 * src = AllocZeroed(0x20);\n    CpuFastCopy(tileset, buffer, 0x20);\n    if (metaTile & 1)\n    {\n        for (i = 0; i < 8; ++i)\n        {\n            for (j = 0; j < 4; ++j)\n            {\n                u32 offset = j - 3;\n                u8 value = buffer[(i << 2) - offset];\n                src[(i << 2) + j] = ((value & 0xF) << 4) + ((value & 0xF0) >> 4);\n            }\n        }\n        CpuFastCopy(src, buffer, 0x20);\n    }\n    if (metaTile & 2)\n    {\n        for (i = 0; i < 8; ++i)\n            memcpy(&src[4 * i], &buffer[4 * (7 - i)], 4);\n        CpuFastCopy(src, buffer, 0x20);\n    }\n    for (i = 0; i < 32; ++i)\n    {\n        if (buffer[i] & 0xF0)\n            blockBuf[i] = (blockBuf[i] & 0xF) + (buffer[i] & 0xF0);\n        if (buffer[i] & 0xF)\n            blockBuf[i] = (blockBuf[i] & 0xF0) + (buffer[i] & 0xF);\n    }\n    Free(src);\n    Free(buffer);\n}\n\nstatic u16 TeachyTvComputePalIndexArrayEntryByMetaTile(u8 *palIndexArrayBuf, u16 metaTile)\n{\n    u32 i;\n    int firstEntry;\n    int temp;\n    u32 pal = metaTile >> 12;\n    i = 0;\n    firstEntry = *palIndexArrayBuf;\n    if (firstEntry != pal)\n    {\n        if (firstEntry == 0xFF)\n        {\n            *palIndexArrayBuf = pal;\n        }\n        else\n        {\n            while (++i < 16)\n            {\n                temp = palIndexArrayBuf[i];\n                if (temp == pal)\n                    break;\n                if (temp == 0xFF)\n                {\n                    palIndexArrayBuf[i] = pal;\n                    break;\n                }\n            }\n        }\n    }\n    return (0xF - i);\n}\n\nstatic void TeachyTvLoadMapPalette(const struct MapLayout * mStruct, const u8 * palIndexArray)\n{\n    u32 i;\n    const struct Tileset * ts;\n    const u16 * dest;\n\n    for (i = 0; i < 16; i++)\n    {\n        if (palIndexArray[i] == 0xFF)\n            break;\n        if (palIndexArray[i] >= NUM_PALS_IN_PRIMARY)\n            dest = mStruct->secondaryTileset->palettes[palIndexArray[i]];\n        else\n            dest = mStruct->primaryTileset->palettes[palIndexArray[i]];\n        LoadPalette(dest, BG_PLTT_ID(15 - i), PLTT_SIZE_4BPP);\n    }\n}\n"
  },
  {
    "path": "src/text.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"m4a.h\"\n#include \"quest_log.h\"\n#include \"graphics.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"constants/songs.h\"\n\n#define TAG_CURSOR 0x8000\n\n#define CURSOR_DELAY 8\n\nextern const struct OamData gOamData_AffineOff_ObjNormal_16x16;\n\nstatic void DecompressGlyph_NormalCopy1(u16 glyphId, bool32 isJapanese);\nstatic void DecompressGlyph_NormalCopy2(u16 glyphId, bool32 isJapanese);\nstatic void DecompressGlyph_Male(u16 glyphId, bool32 isJapanese);\nstatic void DecompressGlyph_Bold(u16 glyphId);\nstatic s32 GetGlyphWidth_Small(u16 glyphId, bool32 isJapanese);\nstatic s32 GetGlyphWidth_NormalCopy1(u16 glyphId, bool32 isJapanese);\nstatic s32 GetGlyphWidth_Normal(u16 glyphId, bool32 isJapanese);\nstatic s32 GetGlyphWidth_NormalCopy2(u16 glyphId, bool32 isJapanese);\nstatic s32 GetGlyphWidth_Male(u16 glyphId, bool32 isJapanese);\nstatic s32 GetGlyphWidth_Female(u16 glyphId, bool32 isJapanese);\nstatic void SpriteCB_TextCursor(struct Sprite *sprite);\n\nTextFlags gTextFlags;\n\nstatic const u8 sDownArrowTiles[]         = INCBIN_U8(\"graphics/fonts/down_arrow.4bpp\");\nstatic const u8 sDarkDownArrowTiles[]     = INCBIN_U8(\"graphics/fonts/down_arrow_RS.4bpp\");\nstatic const u8 sTinyArrowTiles[]         = INCBIN_U8(\"graphics/fonts/down_arrow_2.4bpp\");\nstatic const u8 sTinyDarkDownArrowTiles[] = INCBIN_U8(\"graphics/fonts/down_arrow_RS_2.4bpp\");\nstatic const u8 sDoubleArrowTiles1[]       = INCBIN_U8(\"graphics/fonts/down_arrow_3.4bpp\");\nstatic const u8 sDoubleArrowTiles2[]       = INCBIN_U8(\"graphics/fonts/down_arrow_4.4bpp\");\n\nstatic const u8 sDownArrowYCoords[]           = { 0, 16, 32, 16 };\nstatic const u8 sWindowVerticalScrollSpeeds[] = {\n    [OPTIONS_TEXT_SPEED_SLOW] = 1,\n    [OPTIONS_TEXT_SPEED_MID] = 2,\n    [OPTIONS_TEXT_SPEED_FAST] = 4,\n    [OPTIONS_TEXT_SPEED_INSTANT] = 4,\n};\n\nstatic const struct GlyphWidthFunc sGlyphWidthFuncs[] = {\n    { FONT_SMALL,         GetGlyphWidth_Small },\n    { FONT_NORMAL_COPY_1, GetGlyphWidth_NormalCopy1 },\n    { FONT_NORMAL,        GetGlyphWidth_Normal },\n    { FONT_NORMAL_COPY_2, GetGlyphWidth_NormalCopy2 },\n    { FONT_MALE,          GetGlyphWidth_Male },\n    { FONT_FEMALE,        GetGlyphWidth_Female },\n    { FONT_BRAILLE,       GetGlyphWidth_Braille }\n};\n\nstatic const struct SpriteSheet sSpriteSheets_TextCursor[] =\n{\n    {sDoubleArrowTiles1, sizeof(sDoubleArrowTiles1), TAG_CURSOR},\n    {sDoubleArrowTiles2, sizeof(sDoubleArrowTiles2), TAG_CURSOR},\n    {NULL}\n};\n\nstatic const struct SpritePalette sSpritePalettes_TextCursor[] =\n{\n    {gStandardMenuPalette, TAG_CURSOR},\n    {NULL}\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_TextCursor =\n{\n    .tileTag = TAG_CURSOR,\n    .paletteTag = TAG_CURSOR,\n    .oam = &gOamData_AffineOff_ObjNormal_16x16,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_TextCursor,\n};\n\nstruct\n{\n    u16 tileOffset;\n    u8 width;\n    u8 height;\n} static const sKeypadIcons[] =\n{\n    [CHAR_A_BUTTON]       = {  0x0,  8, 12 },\n    [CHAR_B_BUTTON]       = {  0x1,  8, 12 },\n    [CHAR_L_BUTTON]       = {  0x2, 16, 12 },\n    [CHAR_R_BUTTON]       = {  0x4, 16, 12 },\n    [CHAR_START_BUTTON]   = {  0x6, 24, 12 },\n    [CHAR_SELECT_BUTTON]  = {  0x9, 24, 12 },\n    [CHAR_DPAD_UP]        = {  0xC,  8, 12 },\n    [CHAR_DPAD_DOWN]      = {  0xD,  8, 12 },\n    [CHAR_DPAD_LEFT]      = {  0xE,  8, 12 },\n    [CHAR_DPAD_RIGHT]     = {  0xF,  8, 12 },\n    [CHAR_DPAD_UPDOWN]    = { 0x20,  8, 12 },\n    [CHAR_DPAD_LEFTRIGHT] = { 0x21,  8, 12 },\n    [CHAR_DPAD_NONE]      = { 0x22,  8, 12 },\n};\n\nconst u8 gKeypadIconTiles[] = INCBIN_U8(\"graphics/fonts/keypad_icons.4bpp\");\n\nstatic const u16 sFontSmallLatinGlyphs[] = INCBIN_U16(\"graphics/fonts/latin_small.latfont\");\nstatic const u8 sFontSmallLatinGlyphWidths[] = \n{\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  4,  5,  4,  4,  5, \n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  4,  5,  4,  4,  5,  5,  5,  6,  5,  5,  5,  5,\n     5,  5,  8,  7,  8,  5,  5,  5,  5,  5,  8,  8,  7,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  8,\n     8,  8,  8,  8,  8,  8,  4,  7,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  4,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  8,  8,  8,  8,  5,\n     5,  5,  5,  5,  5,  5,  5,  7,  7,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  8,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  4,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  8,  5,  8,  5,  5,  5,  5,  5,  5,  5,  5,  5,  4,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  4,  5,  5,  5,\n     5,  4,  5,  5,  5,  5,  5,  5,  5,  5,  5,  4,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  8,  7,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n     5,  5,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  5\n};\nstatic const u16 sFontSmallJapaneseGlyphs[] = INCBIN_U16(\"graphics/fonts/japanese_small.fwjpnfont\");\n\nstatic const u16 sFontNormalCopy1LatinGlyphs[] = INCBIN_U16(\"graphics/fonts/latin_normal.latfont\");\nstatic const u8 sFontNormalCopy1LatinGlyphWidths[] =\n{\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  8,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  8,  6,  6,  6,  6,\n     6,  6,  9,  8,  8,  6,  6,  6,  6,  6, 10,  8,  5,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  8,\n     8,  8,  8,  8,  8,  4,  6,  8,  5,  5,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6, 12, 12, 12, 12,  6,\n     6,  6,  6,  6,  6,  6,  8,  8,  8,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  8,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  5,  6,  5,  6,  6,  6,  3,  3,  6,\n     6,  8,  5,  9,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  5,  6,  6,  4,  6,  5,\n     5,  6,  5,  6,  6,  6,  5,  5,  5,  6,  6,  6,  6,  6,\n     6,  8,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6, 12, 12, 12, 12,  8, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  6\n};\nstatic const u16 sFontTallJapaneseGlyphs[] = INCBIN_U16(\"graphics/fonts/japanese_tall.fwjpnfont\");\n\nstatic const u16 sFontNormalLatinGlyphs[] = INCBIN_U16(\"graphics/fonts/latin_normal.latfont\");\nstatic const u8 sFontNormalLatinGlyphWidths[] =\n{\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  8,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  8,  6,  6,  6,  6,\n     6,  6,  9,  8,  8,  6,  6,  6,  6,  6, 10,  8,  5,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  8,\n     8,  8,  8,  8,  8,  4,  6,  8,  5,  5,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6, 12, 12, 12, 12, 12, 10,\n     6,  6,  6,  6,  6,  6,  8,  8,  8,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  8,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  5,  6,  5,  6,  6,  6,  3,  3,  6,\n     6,  8,  5,  9,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  5,  6,  6,  4,  6,  5,\n     5,  6,  5,  6,  6,  6,  5,  5,  5,  6,  6,  6,  6,  6,\n     6,  8,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6, 12, 12, 12, 12,  8, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  6\n};\nstatic const u16 sFontNormalJapaneseGlyphs[] = INCBIN_U16(\"graphics/fonts/japanese_normal.fwjpnfont\");\nstatic const u8 sFontNormalJapaneseGlyphWidths[] =\n{\n     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10,  9,  8,  7,  8,  8,  8,  8,  8,\n     8,  8,  8,  5,  9, 10, 10, 10,  8, 10, 10, 10, 10,  8,\n     8,  8, 10, 10,  8,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  5,  6,  6,  2,  4,  6,\n     3,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  5,  6,  6,  6,  6,  6,  6,  0,  0,  0,  0,  0,\n     0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0\n};\n\nstatic const u16 sFontMaleLatinGlyphs[] = INCBIN_U16(\"graphics/fonts/latin_male.latfont\");\nstatic const u8 sFontMaleLatinGlyphWidths[] =\n{\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  8,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  8,  6,  6,  6,  6,\n     6,  6,  9,  8,  8,  6,  6,  6,  6,  6, 10,  8,  5,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  8,\n     8,  8,  8,  8,  8,  4,  6,  8,  5,  5,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6, 12, 12, 12, 12,  6,\n     6,  6,  6,  6,  6,  6,  8,  8,  8,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  8,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  5,  6,  5,  6,  6,  6,  3,  3,  6,\n     6,  8,  5,  9,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  5,  6,  6,  4,  6,  5,\n     5,  6,  5,  6,  6,  6,  5,  5,  5,  6,  6,  6,  6,  6,\n     6,  8,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6, 12, 12, 12, 12,  8, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  6\n};\nstatic const u16 sFontMaleJapaneseGlyphs[] = INCBIN_U16(\"graphics/fonts/japanese_male.fwjpnfont\");\nstatic const u8 sFontMaleJapaneseGlyphWidths[] = \n{\n     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10,  9,  8,  7,  8,  8,  8,  8,  8,\n     8,  8,  8,  5,  9, 10, 10, 10,  8, 10, 10, 10, 10,  8,\n     8,  8, 10, 10,  8,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  5,  6,  6,  2,  4,  6,\n     3,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  5,  6,  6,  6,  6,  6,  6,  0,  0,  0,  0,  0,\n     0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0\n};\n\nstatic const u16 sFontFemaleLatinGlyphs[] = INCBIN_U16(\"graphics/fonts/latin_female.latfont\");\nstatic const u8 sFontFemaleLatinGlyphWidths[] =\n{\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  8,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  8,  6,  6,  6,  6,\n     6,  6,  9,  8,  8,  6,  6,  6,  6,  6, 10,  8,  5,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  8,\n     8,  8,  8,  8,  8,  4,  6,  8,  5,  5,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6, 12, 12, 12, 12,  6,\n     6,  6,  6,  6,  6,  6,  8,  8,  8,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  8,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  5,  6,  5,  6,  6,  6,  3,  3,  6,\n     6,  8,  5,  9,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  5,  6,  6,  4,  6,  5,\n     5,  6,  5,  6,  6,  6,  5,  5,  5,  6,  6,  6,  6,  6,\n     6,  8,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6, 12, 12, 12, 12,  8, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n     8,  8,  8,  8,  8,  8,  8,  6\n};\nstatic const u16 sFontFemaleJapaneseGlyphs[] = INCBIN_U16(\"graphics/fonts/japanese_female.fwjpnfont\");\nstatic const u8 sFontFemaleJapaneseGlyphWidths[] =\n{\n     0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  9, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10,  9,  9,  9,  9,  9,  9,  9,  8, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10,  9,  8,  7,  8,  8,  8,  8,  8,\n     8,  8,  8,  5,  9, 10, 10, 10,  8, 10, 10, 10, 10,  8,\n     8,  8, 10, 10,  8,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  5,  6,  6,  2,  4,  6,\n     3,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  5,  6,  6,  6,  6,  6,  6,  0,  0,  0,  0,  0,\n     0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  0\n};\n\nstatic const u16 sFontBoldJapaneseGlyphs[] = INCBIN_U16(\"graphics/fonts/japanese_bold.fwjpnfont\");\n\nu16 FontFunc_Small(struct TextPrinter *textPrinter)\n{\n    struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;\n\n    if (subStruct->hasGlyphIdBeenSet == 0)\n    {\n        textPrinter->subUnion.sub.glyphId = FONT_SMALL;\n        subStruct->hasGlyphIdBeenSet = 1;\n    }\n    return RenderText(textPrinter);\n}\n\nu16 FontFunc_NormalCopy1(struct TextPrinter *textPrinter)\n{\n    struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;\n\n    if (subStruct->hasGlyphIdBeenSet == 0)\n    {\n        textPrinter->subUnion.sub.glyphId = FONT_NORMAL_COPY_1;\n        subStruct->hasGlyphIdBeenSet = 1;\n    }\n    return RenderText(textPrinter);\n}\n\nu16 FontFunc_Normal(struct TextPrinter *textPrinter)\n{\n    struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;\n\n    if (subStruct->hasGlyphIdBeenSet == 0)\n    {\n        textPrinter->subUnion.sub.glyphId = FONT_NORMAL;\n        subStruct->hasGlyphIdBeenSet = 1;\n    }\n    return RenderText(textPrinter);\n}\n\nu16 FontFunc_NormalCopy2(struct TextPrinter *textPrinter)\n{\n    struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;\n\n    if (subStruct->hasGlyphIdBeenSet == 0)\n    {\n        textPrinter->subUnion.sub.glyphId = FONT_NORMAL_COPY_2;\n        subStruct->hasGlyphIdBeenSet = 1;\n    }\n    return RenderText(textPrinter);\n}\n\nu16 FontFunc_Male(struct TextPrinter *textPrinter)\n{\n    struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;\n\n    if (subStruct->hasGlyphIdBeenSet == 0)\n    {\n        textPrinter->subUnion.sub.glyphId = FONT_MALE;\n        subStruct->hasGlyphIdBeenSet = 1;\n    }\n    return RenderText(textPrinter);\n}\n\nu16 FontFunc_Female(struct TextPrinter *textPrinter)\n{\n    struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;\n\n    if (subStruct->hasGlyphIdBeenSet == 0)\n    {\n        textPrinter->subUnion.sub.glyphId = FONT_FEMALE;\n        subStruct->hasGlyphIdBeenSet = 1;\n    }\n    return RenderText(textPrinter);\n}\n\nvoid TextPrinterInitDownArrowCounters(struct TextPrinter *textPrinter)\n{\n    struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;\n\n    if (gTextFlags.autoScroll == 1)\n        subStruct->autoScrollDelay = 0;\n    else\n    {\n        subStruct->downArrowYPosIdx = 0;\n        subStruct->downArrowDelay = 0;\n    }\n}\n\nvoid TextPrinterDrawDownArrow(struct TextPrinter *textPrinter)\n{\n    struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;\n    const u8 *arrowTiles;\n\n    if (gTextFlags.autoScroll == 0)\n    {\n        if (subStruct->downArrowDelay != 0)\n        {\n            subStruct->downArrowDelay = ((*(u32 *)&textPrinter->subUnion.sub) << 19 >> 27) - 1;    // convoluted way of getting field_1, necessary to match\n        }\n        else\n        {\n            FillWindowPixelRect(\n                textPrinter->printerTemplate.windowId,\n                textPrinter->printerTemplate.bgColor << 4 | textPrinter->printerTemplate.bgColor,\n                textPrinter->printerTemplate.currentX,\n                textPrinter->printerTemplate.currentY,\n                10,\n                12);\n\n            switch (gTextFlags.useAlternateDownArrow)\n            {\n                case 0:\n                default:\n                    arrowTiles = sDownArrowTiles;\n                    break;\n                case 1:\n                    arrowTiles = sDarkDownArrowTiles;\n                    break;\n            }\n\n            BlitBitmapRectToWindow(\n                textPrinter->printerTemplate.windowId,\n                arrowTiles,\n                sDownArrowYCoords[subStruct->downArrowYPosIdx],\n                0,\n                0x80,\n                0x10,\n                textPrinter->printerTemplate.currentX,\n                textPrinter->printerTemplate.currentY,\n                10,\n                12);\n            CopyWindowToVram(textPrinter->printerTemplate.windowId, 0x2);\n\n            subStruct->downArrowDelay = CURSOR_DELAY;\n            subStruct->downArrowYPosIdx = (*(u32 *)subStruct << 17 >> 30) + 1;\n        }\n    }\n}\n\nvoid TextPrinterClearDownArrow(struct TextPrinter *textPrinter)\n{\n    FillWindowPixelRect(\n        textPrinter->printerTemplate.windowId,\n        textPrinter->printerTemplate.bgColor << 4 | textPrinter->printerTemplate.bgColor,\n        textPrinter->printerTemplate.currentX,\n        textPrinter->printerTemplate.currentY,\n        10,\n        12);\n    CopyWindowToVram(textPrinter->printerTemplate.windowId, 0x2);\n}\n\nbool8 TextPrinterWaitAutoMode(struct TextPrinter *textPrinter)\n{\n    struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;\n    u8 delay = (gQuestLogState == QL_STATE_PLAYBACK) ? 50 : 120;\n\n    if (subStruct->autoScrollDelay == delay)\n    {\n        return TRUE;\n    }\n    else\n    {\n        subStruct->autoScrollDelay++;\n        return FALSE;\n    }\n}\n\nbool16 TextPrinterWaitWithDownArrow(struct TextPrinter *textPrinter)\n{\n    bool8 result = FALSE;\n    if (gTextFlags.autoScroll != 0)\n    {\n        result = TextPrinterWaitAutoMode(textPrinter);\n    }\n    else\n    {\n        TextPrinterDrawDownArrow(textPrinter);\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n        {\n            result = TRUE;\n            PlaySE(SE_SELECT);\n        }\n    }\n    return result;\n}\n\nbool16 TextPrinterWait(struct TextPrinter *textPrinter)\n{\n    bool16 result = FALSE;\n    if (gTextFlags.autoScroll != 0)\n    {\n        result = TextPrinterWaitAutoMode(textPrinter);\n    }\n    else\n    {\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n        {\n            result = TRUE;\n            PlaySE(SE_SELECT);\n        }\n    }\n    return result;\n}\n\nvoid DrawDownArrow(u8 windowId, u16 x, u16 y, u8 bgColor, bool8 drawArrow, u8 *counter, u8 *yCoordIndex)\n{\n    const u8 *arrowTiles;\n\n    if (*counter != 0)\n    {\n        --*counter;\n    }\n    else\n    {\n        FillWindowPixelRect(windowId, (bgColor << 4) | bgColor, x, y, 10, 12);\n        if (drawArrow == 0)\n        {\n            switch (gTextFlags.useAlternateDownArrow)\n            {\n                case 0:\n                default:\n                    arrowTiles = sDownArrowTiles;\n                    break;\n                case 1:\n                    arrowTiles = sDarkDownArrowTiles;\n                    break;\n            }\n\n            BlitBitmapRectToWindow(\n                windowId,\n                arrowTiles,\n                sDownArrowYCoords[*yCoordIndex & 3],\n                0,\n                0x80,\n                0x10,\n                x,\n                y,\n                10,\n                12);\n            CopyWindowToVram(windowId, 0x2);\n            *counter = CURSOR_DELAY;\n            ++*yCoordIndex;\n        }\n    }\n}\n\nu16 RenderText(struct TextPrinter *textPrinter)\n{\n    struct TextPrinterSubStruct *subStruct = &textPrinter->subUnion.sub;\n    u16 currChar;\n    s32 width;\n    s32 widthHelper;\n\n    switch (textPrinter->state)\n    {\n    case RENDER_STATE_HANDLE_CHAR:\n        if (JOY_HELD(A_BUTTON | B_BUTTON) && subStruct->hasPrintBeenSpedUp)\n            textPrinter->delayCounter = 0;\n\n        if (textPrinter->delayCounter && textPrinter->textSpeed)\n        {\n            textPrinter->delayCounter--;\n            if (gTextFlags.canABSpeedUpPrint && JOY_NEW(A_BUTTON | B_BUTTON))\n            {\n                subStruct->hasPrintBeenSpedUp = TRUE;\n                textPrinter->delayCounter = 0;\n            }\n            return RENDER_UPDATE;\n        }\n\n        if (gTextFlags.autoScroll)\n            textPrinter->delayCounter = 1;\n        else\n            textPrinter->delayCounter = textPrinter->textSpeed;\n\n        currChar = *textPrinter->printerTemplate.currentChar;\n        textPrinter->printerTemplate.currentChar++;\n\n        switch (currChar)\n        {\n        case CHAR_NEWLINE:\n            textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x;\n            textPrinter->printerTemplate.currentY += gFonts[textPrinter->printerTemplate.fontId].maxLetterHeight + textPrinter->printerTemplate.lineSpacing;\n            return RENDER_REPEAT;\n        case PLACEHOLDER_BEGIN:\n            textPrinter->printerTemplate.currentChar++;\n            return RENDER_REPEAT;\n        case EXT_CTRL_CODE_BEGIN:\n            currChar = *textPrinter->printerTemplate.currentChar;\n            textPrinter->printerTemplate.currentChar++;\n            switch (currChar)\n            {\n            case EXT_CTRL_CODE_COLOR:\n                textPrinter->printerTemplate.fgColor = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor);\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_HIGHLIGHT:\n                textPrinter->printerTemplate.bgColor = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor);\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_SHADOW:\n                textPrinter->printerTemplate.shadowColor = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor);\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW:\n                textPrinter->printerTemplate.fgColor = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                textPrinter->printerTemplate.bgColor = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                textPrinter->printerTemplate.shadowColor = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor);\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_PALETTE:\n                textPrinter->printerTemplate.currentChar++;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_FONT:\n                subStruct->glyphId = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_RESET_FONT:\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_PAUSE:\n                textPrinter->delayCounter = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                textPrinter->state = RENDER_STATE_PAUSE;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_PAUSE_UNTIL_PRESS:\n                textPrinter->state = RENDER_STATE_WAIT;\n                if (gTextFlags.autoScroll)\n                    subStruct->autoScrollDelay = 0;\n                return RENDER_UPDATE;\n            case EXT_CTRL_CODE_WAIT_SE:\n                textPrinter->state = RENDER_STATE_WAIT_SE;\n                return RENDER_UPDATE;\n            case EXT_CTRL_CODE_PLAY_BGM:\n                currChar = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                currChar |= *textPrinter->printerTemplate.currentChar << 8;\n                textPrinter->printerTemplate.currentChar++;\n                if (!QL_IS_PLAYBACK_STATE)\n                    PlayBGM(currChar);\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_PLAY_SE:\n                currChar = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                currChar |= (*textPrinter->printerTemplate.currentChar << 8);\n                textPrinter->printerTemplate.currentChar++;\n                PlaySE(currChar);\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_ESCAPE:\n                textPrinter->printerTemplate.currentChar++;\n                currChar = *textPrinter->printerTemplate.currentChar;\n                break;\n            case EXT_CTRL_CODE_SHIFT_RIGHT:\n                textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x + *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_SHIFT_DOWN:\n                textPrinter->printerTemplate.currentY = textPrinter->printerTemplate.y + *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_FILL_WINDOW:\n                FillWindowPixelBuffer(textPrinter->printerTemplate.windowId, PIXEL_FILL(textPrinter->printerTemplate.bgColor));\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_PAUSE_MUSIC:\n                m4aMPlayStop(&gMPlayInfo_BGM);\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_RESUME_MUSIC:\n                m4aMPlayContinue(&gMPlayInfo_BGM);\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_CLEAR:\n                width = *textPrinter->printerTemplate.currentChar;\n                textPrinter->printerTemplate.currentChar++;\n                if (width > 0)\n                {\n                    ClearTextSpan(textPrinter, width);\n                    textPrinter->printerTemplate.currentX += width;\n                    return RENDER_PRINT;\n                }\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_SKIP:\n                textPrinter->printerTemplate.currentX = *textPrinter->printerTemplate.currentChar + textPrinter->printerTemplate.x;\n                textPrinter->printerTemplate.currentChar++;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_CLEAR_TO:\n                {\n                    widthHelper = *textPrinter->printerTemplate.currentChar;\n                    widthHelper += textPrinter->printerTemplate.x;\n                    textPrinter->printerTemplate.currentChar++;\n                    width = widthHelper - textPrinter->printerTemplate.currentX;\n                    if (width > 0)\n                    {\n                        ClearTextSpan(textPrinter, width);\n                        textPrinter->printerTemplate.currentX += width;\n                        return RENDER_PRINT;\n                    }\n                }\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_MIN_LETTER_SPACING:\n                textPrinter->minLetterSpacing = *textPrinter->printerTemplate.currentChar++;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_JPN:\n                textPrinter->japanese = TRUE;\n                return RENDER_REPEAT;\n            case EXT_CTRL_CODE_ENG:\n                textPrinter->japanese = FALSE;\n                return RENDER_REPEAT;\n            }\n            break;\n        case CHAR_PROMPT_CLEAR:\n            textPrinter->state = RENDER_STATE_CLEAR;\n            TextPrinterInitDownArrowCounters(textPrinter);\n            return RENDER_UPDATE;\n        case CHAR_PROMPT_SCROLL:\n            textPrinter->state = RENDER_STATE_SCROLL_START;\n            TextPrinterInitDownArrowCounters(textPrinter);\n            return RENDER_UPDATE;\n        case CHAR_EXTRA_SYMBOL:\n            currChar = *textPrinter->printerTemplate.currentChar | 0x100;\n            textPrinter->printerTemplate.currentChar++;\n            break;\n        case CHAR_KEYPAD_ICON:\n            currChar = *textPrinter->printerTemplate.currentChar++;\n            gGlyphInfo.width = DrawKeypadIcon(textPrinter->printerTemplate.windowId, currChar, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY);\n            textPrinter->printerTemplate.currentX += gGlyphInfo.width + textPrinter->printerTemplate.letterSpacing;\n            return RENDER_PRINT;\n        case EOS:\n            return RENDER_FINISH;\n        }\n\n        switch (subStruct->glyphId)\n        {\n        case FONT_SMALL:\n            DecompressGlyph_Small(currChar, textPrinter->japanese);\n            break;\n        case FONT_NORMAL_COPY_1:\n            DecompressGlyph_NormalCopy1(currChar, textPrinter->japanese);\n            break;\n        case FONT_NORMAL:\n            DecompressGlyph_Normal(currChar, textPrinter->japanese);\n            break;\n        case FONT_NORMAL_COPY_2:\n            DecompressGlyph_NormalCopy2(currChar, textPrinter->japanese);\n            break;\n        case FONT_MALE:\n            DecompressGlyph_Male(currChar, textPrinter->japanese);\n            break;\n        case FONT_FEMALE:\n            DecompressGlyph_Female(currChar, textPrinter->japanese);\n            break;\n        }\n\n        CopyGlyphToWindow(textPrinter);\n\n        if (textPrinter->minLetterSpacing)\n        {\n            textPrinter->printerTemplate.currentX += gGlyphInfo.width;\n            width = textPrinter->minLetterSpacing - gGlyphInfo.width;\n            if (width > 0)\n            {\n                ClearTextSpan(textPrinter, width);\n                textPrinter->printerTemplate.currentX += width;\n            }\n        }\n        else\n        {\n            if (textPrinter->japanese)\n                textPrinter->printerTemplate.currentX += (gGlyphInfo.width + textPrinter->printerTemplate.letterSpacing);\n            else\n                textPrinter->printerTemplate.currentX += gGlyphInfo.width;\n        }\n        return RENDER_PRINT;\n    case RENDER_STATE_WAIT:\n        if (TextPrinterWait(textPrinter))\n            textPrinter->state = RENDER_STATE_HANDLE_CHAR;\n        return RENDER_UPDATE;\n    case RENDER_STATE_CLEAR:\n        if (TextPrinterWaitWithDownArrow(textPrinter))\n        {\n            FillWindowPixelBuffer(textPrinter->printerTemplate.windowId, PIXEL_FILL(textPrinter->printerTemplate.bgColor));\n            textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x;\n            textPrinter->printerTemplate.currentY = textPrinter->printerTemplate.y;\n            textPrinter->state = RENDER_STATE_HANDLE_CHAR;\n        }\n        return RENDER_UPDATE;\n    case RENDER_STATE_SCROLL_START:\n        if (TextPrinterWaitWithDownArrow(textPrinter))\n        {\n            TextPrinterClearDownArrow(textPrinter);\n            textPrinter->scrollDistance = gFonts[textPrinter->printerTemplate.fontId].maxLetterHeight + textPrinter->printerTemplate.lineSpacing;\n            textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x;\n            textPrinter->state = RENDER_STATE_SCROLL;\n        }\n        return RENDER_UPDATE;\n    case RENDER_STATE_SCROLL:\n        if (textPrinter->scrollDistance)\n        {\n    \n            if (textPrinter->scrollDistance < sWindowVerticalScrollSpeeds[gSaveBlock2Ptr->optionsTextSpeed])\n            {\n                ScrollWindow(textPrinter->printerTemplate.windowId, 0, textPrinter->scrollDistance, PIXEL_FILL(textPrinter->printerTemplate.bgColor));\n                textPrinter->scrollDistance = 0;\n            }\n            else\n            {\n                ScrollWindow(textPrinter->printerTemplate.windowId, 0, sWindowVerticalScrollSpeeds[gSaveBlock2Ptr->optionsTextSpeed], PIXEL_FILL(textPrinter->printerTemplate.bgColor));\n                textPrinter->scrollDistance -= sWindowVerticalScrollSpeeds[gSaveBlock2Ptr->optionsTextSpeed];\n            }\n            CopyWindowToVram(textPrinter->printerTemplate.windowId, COPYWIN_GFX);\n        }\n        else\n        {\n            textPrinter->state = RENDER_STATE_HANDLE_CHAR;\n        }\n        return RENDER_UPDATE;\n    case RENDER_STATE_WAIT_SE:\n        if (!IsSEPlaying())\n            textPrinter->state = RENDER_STATE_HANDLE_CHAR;\n        return RENDER_UPDATE;\n    case RENDER_STATE_PAUSE:\n        if (textPrinter->delayCounter != 0)\n            textPrinter->delayCounter--;\n        else\n            textPrinter->state = RENDER_STATE_HANDLE_CHAR;\n        return RENDER_UPDATE;\n    }\n\n    return RENDER_FINISH;\n}\n\n// Unused\nstatic s32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing)\n{\n    int i;\n    u8 width;\n    int temp;\n    int temp2;\n    u8 line;\n    int strPos;\n    u8 lineWidths[8];\n    const u8 *strLocal;\n\n    for (i = 0; i < (int)ARRAY_COUNT(lineWidths); i++)\n        lineWidths[i] = 0;\n\n    width = 0;\n    line = 0;\n    strLocal = str;\n    strPos = 0;\n\n    do\n    {\n        temp = strLocal[strPos++];\n        switch (temp)\n        {\n        case CHAR_NEWLINE:\n        case EOS:\n            lineWidths[line] = width;\n            width = 0;\n            line++;\n            break;\n        case EXT_CTRL_CODE_BEGIN:\n            temp2 = strLocal[strPos++];\n            switch (temp2)\n            {\n            case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW:\n                ++strPos;\n            case EXT_CTRL_CODE_PLAY_BGM:\n            case EXT_CTRL_CODE_PLAY_SE:\n                ++strPos;\n            case EXT_CTRL_CODE_COLOR:\n            case EXT_CTRL_CODE_HIGHLIGHT:\n            case EXT_CTRL_CODE_SHADOW:\n            case EXT_CTRL_CODE_PALETTE:\n            case EXT_CTRL_CODE_FONT:\n            case EXT_CTRL_CODE_PAUSE:\n            case EXT_CTRL_CODE_ESCAPE:\n            case EXT_CTRL_CODE_SHIFT_RIGHT:\n            case EXT_CTRL_CODE_SHIFT_DOWN:\n            case EXT_CTRL_CODE_CLEAR:\n            case EXT_CTRL_CODE_SKIP:\n            case EXT_CTRL_CODE_CLEAR_TO:\n            case EXT_CTRL_CODE_MIN_LETTER_SPACING:\n                ++strPos;\n                break;\n            case EXT_CTRL_CODE_RESET_FONT:\n            case EXT_CTRL_CODE_PAUSE_UNTIL_PRESS:\n            case EXT_CTRL_CODE_WAIT_SE:\n            case EXT_CTRL_CODE_FILL_WINDOW:\n            case EXT_CTRL_CODE_JPN:\n            case EXT_CTRL_CODE_ENG:\n            default:\n                break;\n            }\n            break;\n        case CHAR_DYNAMIC:\n        case PLACEHOLDER_BEGIN:\n            ++strPos;\n            break;\n        case CHAR_PROMPT_SCROLL:\n        case CHAR_PROMPT_CLEAR:\n            break;\n        case CHAR_KEYPAD_ICON:\n        case CHAR_EXTRA_SYMBOL:\n            ++strPos;\n        default:\n            ++width;\n            break;\n        }\n    } while (temp != EOS);\n\n    for (width = 0, strPos = 0; strPos < (int)ARRAY_COUNT(lineWidths); ++strPos)\n    {\n        if (width < lineWidths[strPos])\n            width = lineWidths[strPos];\n    }\n\n    return (u8)(GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH) + letterSpacing) * width;\n}\n\ns32 (*GetFontWidthFunc(u8 glyphId))(u16 _glyphId, bool32 _isJapanese)\n{\n    u32 i;\n\n    for (i = 0; i < ARRAY_COUNT(sGlyphWidthFuncs); ++i)\n    {\n        if (glyphId == sGlyphWidthFuncs[i].fontId)\n            return *sGlyphWidthFuncs[i].func;\n    }\n\n    return NULL;\n}\n\ns32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)\n{\n    bool8 isJapanese;\n    int minGlyphWidth;\n    s32 (*func)(u16 glyphId, bool32 isJapanese);\n    int localLetterSpacing;\n    u32 lineWidth;\n    const u8 *bufferPointer;\n    int glyphWidth;\n    u32 width;\n\n    isJapanese = FALSE;\n    minGlyphWidth = 0;\n\n    func = GetFontWidthFunc(fontId);\n    if (func == NULL)\n        return 0;\n\n    if (letterSpacing == -1)\n        localLetterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING);\n    else\n        localLetterSpacing = letterSpacing;\n\n    width = 0;\n    lineWidth = 0;\n    bufferPointer = NULL;\n\n    while (*str != EOS)\n    {\n        switch (*str)\n        {\n        case CHAR_NEWLINE:\n            if (lineWidth > width)\n                width = lineWidth;\n            lineWidth = 0;\n            break;\n        case PLACEHOLDER_BEGIN:\n            switch (*++str)\n            {\n                case PLACEHOLDER_ID_STRING_VAR_1:\n                    bufferPointer = gStringVar1;\n                    break;\n                case PLACEHOLDER_ID_STRING_VAR_2:\n                    bufferPointer = gStringVar2;\n                    break;\n                case PLACEHOLDER_ID_STRING_VAR_3:\n                    bufferPointer = gStringVar3;\n                    break;\n                default:\n                    return 0;\n            }\n        case CHAR_DYNAMIC:\n            if (bufferPointer == NULL)\n                bufferPointer = DynamicPlaceholderTextUtil_GetPlaceholderPtr(*++str);\n            while (*bufferPointer != EOS)\n            {\n                glyphWidth = func(*bufferPointer++, isJapanese);\n                if (minGlyphWidth > 0)\n                    lineWidth += minGlyphWidth > glyphWidth ? minGlyphWidth : glyphWidth;\n                else\n                    lineWidth += isJapanese ? glyphWidth + localLetterSpacing : glyphWidth;\n            }\n            bufferPointer = NULL;\n            break;\n        case CHAR_PROMPT_SCROLL:\n        case CHAR_PROMPT_CLEAR:\n            break;\n        case EXT_CTRL_CODE_BEGIN:\n            switch (*++str)\n            {\n            case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW:\n                ++str;\n            case EXT_CTRL_CODE_PLAY_BGM:\n            case EXT_CTRL_CODE_PLAY_SE:\n                ++str;\n            case EXT_CTRL_CODE_COLOR:\n            case EXT_CTRL_CODE_HIGHLIGHT:\n            case EXT_CTRL_CODE_SHADOW:\n            case EXT_CTRL_CODE_PALETTE:\n            case EXT_CTRL_CODE_PAUSE:\n            case EXT_CTRL_CODE_ESCAPE:\n            case EXT_CTRL_CODE_SHIFT_RIGHT:\n            case EXT_CTRL_CODE_SHIFT_DOWN:\n                ++str;\n            case EXT_CTRL_CODE_RESET_FONT:\n            case EXT_CTRL_CODE_PAUSE_UNTIL_PRESS:\n            case EXT_CTRL_CODE_WAIT_SE:\n            case EXT_CTRL_CODE_FILL_WINDOW:\n                break;\n            case EXT_CTRL_CODE_FONT:\n                func = GetFontWidthFunc(*++str);\n                if (func == NULL)\n                    return 0;\n                if (letterSpacing == -1)\n                    localLetterSpacing = GetFontAttribute(*str, FONTATTR_LETTER_SPACING);\n                break;\n            case EXT_CTRL_CODE_CLEAR:\n                glyphWidth = *++str;\n                lineWidth += glyphWidth;\n                break;\n            case EXT_CTRL_CODE_SKIP:\n                lineWidth = *++str;\n                break;\n            case EXT_CTRL_CODE_CLEAR_TO:\n                if (*++str > lineWidth)\n                    lineWidth = *str;\n                break;\n            case EXT_CTRL_CODE_MIN_LETTER_SPACING:\n                minGlyphWidth = *++str;\n                break;\n            case EXT_CTRL_CODE_JPN:\n                isJapanese = TRUE;\n                break;\n            case EXT_CTRL_CODE_ENG:\n                isJapanese = FALSE;\n            default:\n                break;\n            }\n            break;\n        case CHAR_KEYPAD_ICON:\n        case CHAR_EXTRA_SYMBOL:\n            if (*str == CHAR_EXTRA_SYMBOL)\n                glyphWidth = func(*++str | 0x100, isJapanese);\n            else\n                glyphWidth = GetKeypadIconWidth(*++str);\n\n            if (minGlyphWidth > 0)\n            {\n                if (glyphWidth < minGlyphWidth)\n                    glyphWidth = minGlyphWidth;\n            }\n            else if (isJapanese)\n            {\n                glyphWidth += localLetterSpacing;\n            }\n            lineWidth += glyphWidth;\n            break;\n        default:\n            glyphWidth = func(*str, isJapanese);\n            if (minGlyphWidth > 0)\n            {\n                if (glyphWidth < minGlyphWidth)\n                    glyphWidth = minGlyphWidth;\n                lineWidth += glyphWidth;\n            }\n            else\n            {\n                if (fontId != FONT_BRAILLE && isJapanese)\n                    glyphWidth += localLetterSpacing;\n                lineWidth += glyphWidth;\n            }\n            break;\n        }\n        ++str;\n    }\n\n    if (lineWidth > width)\n        return lineWidth;\n    return width;\n}\n\nu8 RenderTextHandleBold(u8 *pixels, u8 fontId, u8 *str, int a3, int a4, int a5, int a6, int a7)\n{\n    u8 shadowColor;\n    u8 *strLocal;\n    int strPos;\n    int temp;\n    int temp2;\n    u8 colorBackup[3];\n    u8 fgColor;\n    u8 bgColor;\n\n    SaveTextColors(&colorBackup[0], &colorBackup[1], &colorBackup[2]);\n\n    fgColor = 1;\n    bgColor = 0;\n    shadowColor = 3;\n\n    GenerateFontHalfRowLookupTable(TEXT_COLOR_WHITE, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY);\n    strLocal = str;\n    strPos = 0;\n\n    do\n    {\n        temp = strLocal[strPos++];\n        switch (temp)\n        {\n        case EXT_CTRL_CODE_BEGIN:\n            temp2 = strLocal[strPos++];\n            switch (temp2)\n            {\n            case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW:\n                fgColor = strLocal[strPos++];\n                bgColor = strLocal[strPos++];\n                shadowColor = strLocal[strPos++];\n                GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor);\n                continue;\n            case EXT_CTRL_CODE_COLOR:\n                fgColor = strLocal[strPos++];\n                GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor);\n                continue;\n            case EXT_CTRL_CODE_HIGHLIGHT:\n                bgColor = strLocal[strPos++];\n                GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor);\n                continue;\n            case EXT_CTRL_CODE_SHADOW:\n                shadowColor = strLocal[strPos++];\n                GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor);\n                continue;\n            case EXT_CTRL_CODE_FONT:\n                fontId = strLocal[strPos++];\n                break;\n            case EXT_CTRL_CODE_PLAY_BGM:\n            case EXT_CTRL_CODE_PLAY_SE:\n                ++strPos;\n            case EXT_CTRL_CODE_PALETTE:\n            case EXT_CTRL_CODE_PAUSE:\n            case EXT_CTRL_CODE_ESCAPE:\n            case EXT_CTRL_CODE_SHIFT_RIGHT:\n            case EXT_CTRL_CODE_SHIFT_DOWN:\n            case EXT_CTRL_CODE_CLEAR:\n            case EXT_CTRL_CODE_SKIP:\n            case EXT_CTRL_CODE_CLEAR_TO:\n            case EXT_CTRL_CODE_MIN_LETTER_SPACING:\n                ++strPos;\n                break;\n            case EXT_CTRL_CODE_RESET_FONT:\n            case EXT_CTRL_CODE_PAUSE_UNTIL_PRESS:\n            case EXT_CTRL_CODE_WAIT_SE:\n            case EXT_CTRL_CODE_FILL_WINDOW:\n            case EXT_CTRL_CODE_JPN:\n            case EXT_CTRL_CODE_ENG:\n            default:\n                continue;\n            }\n            break;\n        case CHAR_DYNAMIC:\n        case CHAR_KEYPAD_ICON:\n        case CHAR_EXTRA_SYMBOL:\n        case PLACEHOLDER_BEGIN:\n            ++strPos;\n            break;\n        case CHAR_PROMPT_SCROLL:\n        case CHAR_PROMPT_CLEAR:\n        case CHAR_NEWLINE:\n        case EOS:\n            break;\n        default:\n            DecompressGlyph_Bold(temp);\n            CpuCopy32(gGlyphInfo.pixels, pixels, 0x20);\n            CpuCopy32(gGlyphInfo.pixels + 0x40, pixels + 0x20, 0x20);\n            pixels += 0x40;\n            break;\n        }\n    }\n    while (temp != EOS);\n\n    RestoreTextColors(&colorBackup[0], &colorBackup[1], &colorBackup[2]);\n    return 1;\n}\n\n#define sDelay data[0]\n#define sState data[1]\n\nstatic void SpriteCB_TextCursor(struct Sprite *sprite)\n{\n    if (sprite->sDelay)\n    {\n        sprite->sDelay--;\n    }\n    else\n    {\n        sprite->sDelay = CURSOR_DELAY;\n        switch(sprite->sState)\n        {\n        case 0:\n            sprite->y2 = 0;\n            break;\n        case 1:\n            sprite->y2 = 1;\n            break;\n        case 2:\n            sprite->y2 = 2;\n            break;\n        case 3:\n            sprite->y2 = 1;\n            sprite->sState = 0;\n            return;\n        }\n        sprite->sState++;\n    }\n}\n\nu8 CreateTextCursorSprite(u8 sheetId, u16 x, u16 y, u8 priority, u8 subpriority)\n{\n    u8 spriteId;\n    LoadSpriteSheet(&sSpriteSheets_TextCursor[sheetId & 1]);\n    LoadSpritePalette(&sSpritePalettes_TextCursor[0]);\n    spriteId = CreateSprite(&sSpriteTemplate_TextCursor, x + 3, y + 4, subpriority);\n    gSprites[spriteId].oam.priority = (priority & 3);\n    gSprites[spriteId].oam.matrixNum = 0;\n    gSprites[spriteId].sDelay = CURSOR_DELAY;\n    return spriteId;\n}\n\nvoid DestroyTextCursorSprite(u8 spriteId)\n{\n    DestroySprite(&gSprites[spriteId]);\n    FreeSpriteTilesByTag(TAG_CURSOR);\n    FreeSpritePaletteByTag(TAG_CURSOR);\n}\n\n#undef sDelay\n#undef sState\n\nu8 DrawKeypadIcon(u8 windowId, u8 keypadIconId, u16 x, u16 y)\n{\n    BlitBitmapRectToWindow(\n        windowId,\n        gKeypadIconTiles + (sKeypadIcons[keypadIconId].tileOffset * 0x20),\n        0,\n        0,\n        0x80,\n        0x80,\n        x,\n        y,\n        sKeypadIcons[keypadIconId].width,\n        sKeypadIcons[keypadIconId].height);\n    return sKeypadIcons[keypadIconId].width;\n}\n\nu8 GetKeypadIconTileOffset(u8 keypadIconId)\n{\n    return sKeypadIcons[keypadIconId].tileOffset;\n}\n\nu8 GetKeypadIconWidth(u8 keypadIconId)\n{\n    return sKeypadIcons[keypadIconId].width;\n}\n\nu8 GetKeypadIconHeight(u8 keypadIconId)\n{\n    return sKeypadIcons[keypadIconId].height;\n}\n\nvoid DecompressGlyph_Small(u16 glyphId, bool32 isJapanese)\n{\n    const u16 *glyphs;\n\n    if (isJapanese == TRUE)\n    {\n        glyphs = sFontSmallJapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & 0xF));\n        DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n        DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40));\n        gGlyphInfo.width = 8;\n        gGlyphInfo.height = 12;\n    }\n    else\n    {\n        glyphs = sFontSmallLatinGlyphs + (0x10 * glyphId);\n        DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n        DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x40));\n        gGlyphInfo.width = sFontSmallLatinGlyphWidths[glyphId];\n        gGlyphInfo.height = 13;\n    }\n}\n\nstatic s32 GetGlyphWidth_Small(u16 glyphId, bool32 isJapanese)\n{\n    if (isJapanese == TRUE)\n        return 8;\n    else\n        return sFontSmallLatinGlyphWidths[glyphId];\n}\n\nstatic void DecompressGlyph_NormalCopy1(u16 glyphId, bool32 isJapanese)\n{\n    const u16 *glyphs;\n\n    if (isJapanese == TRUE)\n    {\n        // This font only differs from the Normal font in Japanese\n        int eff;\n        glyphs = sFontTallJapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & (eff = 0xF)));  // shh, no questions, only matching now\n        DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n        DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40));\n        gGlyphInfo.width = 8;\n        gGlyphInfo.height = 16;\n    }\n    else\n    {\n        glyphs = sFontNormalCopy1LatinGlyphs + (0x20 * glyphId);\n        DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n        DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20));\n        DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40));\n        DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60));\n        gGlyphInfo.width = sFontNormalCopy1LatinGlyphWidths[glyphId];\n        gGlyphInfo.height = 14;\n    }\n}\n\nstatic s32 GetGlyphWidth_NormalCopy1(u16 glyphId, bool32 isJapanese)\n{\n    if (isJapanese == TRUE)\n        return 8;\n    else\n        return sFontNormalCopy1LatinGlyphWidths[glyphId];\n}\n\nvoid DecompressGlyph_Normal(u16 glyphId, bool32 isJapanese)\n{\n    const u16 *glyphs;\n    int i;\n    u8 lastColor;\n\n    if (isJapanese == TRUE)\n    {\n        if (glyphId == 0)\n        {\n            lastColor = GetLastTextColor(2);\n\n            for(i = 0; i < 0x80; i++)\n            {\n                gGlyphInfo.pixels[i] = lastColor | lastColor << 4;\n                // Game Freak, please. writing the same values over and over...\n                gGlyphInfo.width = 10;\n                gGlyphInfo.height = 12;\n            }\n        }\n        else\n        {\n            glyphs = sFontNormalJapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7));\n            DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n            DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20));\n            DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40));\n            DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60));\n            gGlyphInfo.width = sFontNormalJapaneseGlyphWidths[glyphId];\n            gGlyphInfo.height = 12;\n        }\n    }\n    else\n    {\n        if (glyphId == 0)\n        {\n            lastColor = GetLastTextColor(2);\n\n            for(i = 0; i < 0x80; i++)\n            {\n                gGlyphInfo.pixels[i] = lastColor | lastColor << 4;\n                // but why\n                gGlyphInfo.width = sFontNormalLatinGlyphWidths[0];\n                gGlyphInfo.height = 14;\n            }\n        }\n        else\n        {\n            glyphs = sFontNormalLatinGlyphs + (0x20 * glyphId);\n            DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n            DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20));\n            DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40));\n            DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60));\n            gGlyphInfo.width = sFontNormalLatinGlyphWidths[glyphId];\n            gGlyphInfo.height = 14;\n        }\n    }\n}\n\nstatic s32 GetGlyphWidth_Normal(u16 glyphId, bool32 isJapanese)\n{\n    if (isJapanese == TRUE)\n    {\n        if (glyphId == 0)\n            return 10;\n\n        return sFontNormalJapaneseGlyphWidths[glyphId];\n    }\n    else\n    {\n        return sFontNormalLatinGlyphWidths[glyphId];\n    }\n}\n\nstatic void DecompressGlyph_NormalCopy2(u16 glyphId, bool32 isJapanese)\n{\n    const u16 *glyphs;\n    int i;\n    u8 lastColor;\n\n    if (isJapanese == TRUE)\n    {\n        if (glyphId == 0)\n        {\n            lastColor = GetLastTextColor(2);\n\n            for(i = 0; i < 0x80; i++)\n            {\n                gGlyphInfo.pixels[i] = lastColor | lastColor << 4;\n                // Game Freak, please. writing the same values over and over...\n                gGlyphInfo.width = 10;\n                gGlyphInfo.height = 12;\n            }\n        }\n        else\n        {\n            glyphs = sFontNormalJapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7));\n            DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n            DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20));\n            DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40));\n            DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60));\n            gGlyphInfo.width = 10;\n            gGlyphInfo.height = 12;\n        }\n    }\n    else\n        DecompressGlyph_Normal(glyphId, isJapanese);\n}\n\nstatic s32 GetGlyphWidth_NormalCopy2(u16 glyphId, bool32 isJapanese)\n{\n    if (isJapanese == TRUE)\n        return 10;\n    else\n        return sFontNormalLatinGlyphWidths[glyphId];\n}\n\nstatic void DecompressGlyph_Male(u16 glyphId, bool32 isJapanese)\n{\n    const u16 *glyphs;\n    int i;\n    u8 lastColor;\n\n    if (isJapanese == TRUE)\n    {\n        if (glyphId == 0)\n        {\n            lastColor = GetLastTextColor(2);\n\n            for(i = 0; i < 0x80; i++)\n            {\n                gGlyphInfo.pixels[i] = lastColor | lastColor << 4;\n                // Game Freak, please. writing the same values over and over...\n                gGlyphInfo.width = 10;\n                gGlyphInfo.height = 12;\n            }\n        }\n        else\n        {\n            glyphs = sFontMaleJapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7));\n            DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n            DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20));\n            DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40));\n            DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60));\n            gGlyphInfo.width = sFontMaleJapaneseGlyphWidths[glyphId];\n            gGlyphInfo.height = 12;\n        }\n    }\n    else\n    {\n        if (glyphId == 0)\n        {\n            lastColor = GetLastTextColor(2);\n\n            for(i = 0; i < 0x80; i++)\n            {\n                gGlyphInfo.pixels[i] = lastColor | lastColor << 4;\n                // but why\n                gGlyphInfo.width = sFontMaleLatinGlyphWidths[0];\n                gGlyphInfo.height = 14;\n            }\n        }\n        else\n        {\n            glyphs = sFontMaleLatinGlyphs + (0x20 * glyphId);\n            DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n            DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20));\n            DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40));\n            DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60));\n            gGlyphInfo.width = sFontMaleLatinGlyphWidths[glyphId];\n            gGlyphInfo.height = 14;\n        }\n    }\n}\n\nstatic s32 GetGlyphWidth_Male(u16 glyphId, bool32 isJapanese)\n{\n    if (isJapanese == TRUE)\n    {\n        if (glyphId == 0)\n            return 10;\n\n        return sFontMaleJapaneseGlyphWidths[glyphId];\n    }\n    else\n        return sFontMaleLatinGlyphWidths[glyphId];\n}\n\nvoid DecompressGlyph_Female(u16 glyphId, bool32 isJapanese)\n{\n    const u16 *glyphs;\n    int i;\n    u8 lastColor;\n\n    if (isJapanese == TRUE)\n    {\n        if (glyphId == 0)\n        {\n            lastColor = GetLastTextColor(2);\n\n            for(i = 0; i < 0x80; i++)\n            {\n                gGlyphInfo.pixels[i] = lastColor | lastColor << 4;\n                // Game Freak, please. writing the same values over and over...\n                gGlyphInfo.width = 10;\n                gGlyphInfo.height = 12;\n            }\n        }\n        else\n        {\n            glyphs = sFontFemaleJapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7));\n            DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n            DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20));\n            DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40));\n            DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60));\n            gGlyphInfo.width = sFontFemaleJapaneseGlyphWidths[glyphId];\n            gGlyphInfo.height = 12;\n        }\n    }\n    else\n    {\n        if (glyphId == 0)\n        {\n            lastColor = GetLastTextColor(2);\n\n            for(i = 0; i < 0x80; i++)\n            {\n                gGlyphInfo.pixels[i] = lastColor | lastColor << 4;\n                // but why\n                gGlyphInfo.width = sFontFemaleLatinGlyphWidths[0];\n                gGlyphInfo.height = 14;\n            }\n        }\n        else\n        {\n            glyphs = sFontFemaleLatinGlyphs + (0x20 * glyphId);\n            DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n            DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20));\n            DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40));\n            DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60));\n            gGlyphInfo.width = sFontFemaleLatinGlyphWidths[glyphId];\n            gGlyphInfo.height = 14;\n        }\n    }\n}\n\nstatic s32 GetGlyphWidth_Female(u16 glyphId, bool32 isJapanese)\n{\n    if (isJapanese == TRUE)\n    {\n        if (glyphId == 0)\n            return 10;\n        \n        return sFontFemaleJapaneseGlyphWidths[glyphId];\n    }\n    else\n        return sFontFemaleLatinGlyphWidths[glyphId];\n}\n\nstatic void DecompressGlyph_Bold(u16 glyphId)\n{\n    const u16 *glyphs = sFontBoldJapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & 0xF));\n    DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels);\n    DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40));\n    gGlyphInfo.width = 8;\n    gGlyphInfo.height = 12;\n}\n\nint GetStringCenterAlignXOffset(int fontId, const u8 *str, int totalWidth)\n{\n    return GetStringCenterAlignXOffsetWithLetterSpacing(fontId, str, totalWidth, 0);\n}\n\nint GetStringCenterAlignXOffsetWithLetterSpacing(int fontId, const u8 *str, int totalWidth, int letterSpacing)\n{\n    return GetStringWidthDifference(fontId, str, totalWidth, letterSpacing) / 2;\n}\n\nint GetStringWidthDifference(int fontId, const u8 *str, int totalWidth, int letterSpacing)\n{\n    int stringWidth = GetStringWidth(fontId, str, letterSpacing);\n    if (totalWidth > stringWidth)\n        return totalWidth - stringWidth;\n    else\n        return 0;\n}"
  },
  {
    "path": "src/text_printer.c",
    "content": "#include \"global.h\"\n#include \"window.h\"\n#include \"text.h\"\n\nstatic EWRAM_DATA struct TextPrinter sTempTextPrinter = {0};\nstatic EWRAM_DATA struct TextPrinter sTextPrinters[NUM_TEXT_PRINTERS] = {0};\n\nstatic u16 sFontHalfRowLookupTable[0x51];\nstatic u16 sLastTextBgColor;\nstatic u16 sLastTextFgColor;\nstatic u16 sLastTextShadowColor;\n\nconst struct FontInfo *gFonts;\nstruct GlyphInfo gGlyphInfo;\n\nstatic const u8 sFontHalfRowOffsets[] =\n{\n    0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,\n    0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09,\n    0x12, 0x13, 0x14, 0x12, 0x15, 0x16, 0x17, 0x15, 0x18, 0x19, 0x1A, 0x18, 0x12, 0x13, 0x14, 0x12,\n    0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,\n    0x1B, 0x1C, 0x1D, 0x1B, 0x1E, 0x1F, 0x20, 0x1E, 0x21, 0x22, 0x23, 0x21, 0x1B, 0x1C, 0x1D, 0x1B,\n    0x24, 0x25, 0x26, 0x24, 0x27, 0x28, 0x29, 0x27, 0x2A, 0x2B, 0x2C, 0x2A, 0x24, 0x25, 0x26, 0x24,\n    0x2D, 0x2E, 0x2F, 0x2D, 0x30, 0x31, 0x32, 0x30, 0x33, 0x34, 0x35, 0x33, 0x2D, 0x2E, 0x2F, 0x2D,\n    0x1B, 0x1C, 0x1D, 0x1B, 0x1E, 0x1F, 0x20, 0x1E, 0x21, 0x22, 0x23, 0x21, 0x1B, 0x1C, 0x1D, 0x1B,\n    0x36, 0x37, 0x38, 0x36, 0x39, 0x3A, 0x3B, 0x39, 0x3C, 0x3D, 0x3E, 0x3C, 0x36, 0x37, 0x38, 0x36,\n    0x3F, 0x40, 0x41, 0x3F, 0x42, 0x43, 0x44, 0x42, 0x45, 0x46, 0x47, 0x45, 0x3F, 0x40, 0x41, 0x3F,\n    0x48, 0x49, 0x4A, 0x48, 0x4B, 0x4C, 0x4D, 0x4B, 0x4E, 0x4F, 0x50, 0x4E, 0x48, 0x49, 0x4A, 0x48,\n    0x36, 0x37, 0x38, 0x36, 0x39, 0x3A, 0x3B, 0x39, 0x3C, 0x3D, 0x3E, 0x3C, 0x36, 0x37, 0x38, 0x36,\n    0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,\n    0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09,\n    0x12, 0x13, 0x14, 0x12, 0x15, 0x16, 0x17, 0x15, 0x18, 0x19, 0x1A, 0x18, 0x12, 0x13, 0x14, 0x12,\n    0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00\n};\n\nvoid SetFontsPointer(const struct FontInfo *fonts)\n{\n    gFonts = fonts;\n}\n\nvoid DeactivateAllTextPrinters (void)\n{\n    int printer;\n    for (printer = 0; printer < NUM_TEXT_PRINTERS; ++printer)\n        sTextPrinters[printer].active = 0;\n}\n\nu16 AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16))\n{\n    struct TextPrinterTemplate printerTemplate;\n\n    printerTemplate.currentChar = str;\n    printerTemplate.windowId = windowId;\n    printerTemplate.fontId = fontId;\n    printerTemplate.x = x;\n    printerTemplate.y = y;\n    printerTemplate.currentX = x;\n    printerTemplate.currentY = y;\n    printerTemplate.letterSpacing = gFonts[fontId].letterSpacing;\n    printerTemplate.lineSpacing = gFonts[fontId].lineSpacing;\n    printerTemplate.unk = gFonts[fontId].unk;\n    printerTemplate.fgColor = gFonts[fontId].fgColor;\n    printerTemplate.bgColor = gFonts[fontId].bgColor;\n    printerTemplate.shadowColor = gFonts[fontId].shadowColor;\n    return AddTextPrinter(&printerTemplate, speed, callback);\n}\n\nbool16 AddTextPrinter(struct TextPrinterTemplate *textSubPrinter, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16))\n{\n    int i;\n    u32 j;\n\n    if (!gFonts)\n        return FALSE;\n\n    sTempTextPrinter.active = TRUE;\n    sTempTextPrinter.state = RENDER_STATE_HANDLE_CHAR;\n    sTempTextPrinter.textSpeed = speed;\n    sTempTextPrinter.delayCounter = 0;\n    sTempTextPrinter.scrollDistance = 0;\n\n    for (i = 0; i < (int)ARRAY_COUNT(sTempTextPrinter.subUnion.fields); ++i)\n        sTempTextPrinter.subUnion.fields[i] = 0;\n\n    sTempTextPrinter.printerTemplate = *textSubPrinter;\n    sTempTextPrinter.callback = callback;\n    sTempTextPrinter.minLetterSpacing = 0;\n    sTempTextPrinter.japanese = 0;\n\n    GenerateFontHalfRowLookupTable(textSubPrinter->fgColor, textSubPrinter->bgColor, textSubPrinter->shadowColor);\n    if (speed != TEXT_SKIP_DRAW && speed != 0)\n    {\n        --sTempTextPrinter.textSpeed;\n        sTextPrinters[textSubPrinter->windowId] = sTempTextPrinter;\n    }\n    else\n    {\n        sTempTextPrinter.textSpeed = 0;\n        \n        // Render all text (up to limit) at once\n        for (j = 0; j < 0x400; ++j)\n        {\n            if (RenderFont(&sTempTextPrinter) == RENDER_FINISH)\n                break;\n        }\n\n        // All the text is rendered to the window but don't draw it yet.\n        if (speed != TEXT_SKIP_DRAW)\n          CopyWindowToVram(sTempTextPrinter.printerTemplate.windowId, COPYWIN_GFX);\n        sTextPrinters[textSubPrinter->windowId].active = FALSE;\n    }\n    return TRUE;\n}\n\nvoid RunTextPrinters(void)\n{\n    int i;\n\n    do\n    {\n        int numEmpty = 0;\n        for (i = 0; i < NUM_TEXT_PRINTERS; ++i)\n        {\n            if (sTextPrinters[i].active)\n            {\n                u16 renderCmd = RenderFont(&sTextPrinters[i]);\n                switch (renderCmd)\n                {\n                    case RENDER_PRINT:\n                        CopyWindowToVram(sTextPrinters[i].printerTemplate.windowId, COPYWIN_GFX);\n                        if (sTextPrinters[i].callback != 0)\n                            sTextPrinters[i].callback(&sTextPrinters[i].printerTemplate, renderCmd);\n                        break;\n                    case RENDER_UPDATE:\n                        if (sTextPrinters[i].callback != NULL)\n                            sTextPrinters[i].callback(&sTextPrinters[i].printerTemplate, renderCmd);\n                        return;\n                    case RENDER_FINISH:\n                        sTextPrinters[i].active = FALSE;\n                        return;\n                }\n            }\n            else\n            {\n                numEmpty++;\n            }\n        }\n        if(numEmpty == 0x20)\n            return;\n    }while(gSaveBlock2Ptr->optionsTextSpeed == OPTIONS_TEXT_SPEED_INSTANT);\n}\n\nbool16 IsTextPrinterActive(u8 id)\n{\n    return sTextPrinters[id].active;\n}\n\nu32 RenderFont(struct TextPrinter *textPrinter)\n{\n    u32 ret;\n    while (TRUE)\n    {\n        ret = gFonts[textPrinter->printerTemplate.fontId].fontFunction(textPrinter);\n        if (ret != 2)\n            return ret;\n    }\n}\n\nvoid GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor)\n{\n    int lutIndex;\n    int i, j, k, l;\n    const u32 colors[] = {bgColor, fgColor, shadowColor};\n\n    sLastTextBgColor = bgColor;\n    sLastTextFgColor = fgColor;\n    sLastTextShadowColor = shadowColor;\n\n    lutIndex = 0;\n\n    for (i = 0; i < 3; i++)\n        for (j = 0; j < 3; j++)\n            for (k = 0; k < 3; k++)\n                for (l = 0; l < 3; l++)\n                    sFontHalfRowLookupTable[lutIndex++] = (colors[l] << 12) | (colors[k] << 8) | (colors[j] << 4) | colors[i];\n}\n\nvoid SaveTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor)\n{\n    *bgColor = sLastTextBgColor;\n    *fgColor = sLastTextFgColor;\n    *shadowColor = sLastTextShadowColor;\n}\n\nvoid RestoreTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor)\n{\n    GenerateFontHalfRowLookupTable(*fgColor, *bgColor, *shadowColor);\n}\n\nvoid DecompressGlyphTile(const u16 *src, u16 *dest)\n{\n    int i;\n\n    for (i = 0; i < 16; i++)\n    {\n        int offsetIndex = (i << 31) ? (u8)*src++ : (*src >> 8);\n        dest[i] = sFontHalfRowLookupTable[sFontHalfRowOffsets[offsetIndex]];\n    }\n}\n\nu8 GetLastTextColor(u8 colorType)\n{\n    switch (colorType)\n    {\n        case 0:\n            return sLastTextFgColor;\n        case 2:\n            return sLastTextBgColor;\n        case 1:\n            return sLastTextShadowColor;\n        default:\n            return 0;\n    }\n}\n\n#define GLYPH_COPY(widthOffset, heightOffset, width, height, tilesDest, left, top, sizeX)                                                    \\\n{                                                                                                                                            \\\n    int xAdd, xpos, yAdd, ypos, toOrr, bits;                                                                                                 \\\n    u8 * src, * dst;                                                                                                                         \\\n    u32 _8pixbuf;                                                                                                                            \\\n                                                                                                                                             \\\n    src = gGlyphInfo.pixels + (heightOffset / 8 * 0x40) + (widthOffset / 8 * 0x20);                                                          \\\n    for (yAdd = 0, ypos = top + heightOffset; yAdd < height; yAdd++, ypos++)                                                                 \\\n    {                                                                                                                                        \\\n        _8pixbuf = *(u32 *)src;                                                                                                              \\\n        for (xAdd = 0, xpos = left + widthOffset; xAdd < width; xAdd++, xpos++)                                                              \\\n        {                                                                                                                                    \\\n            dst = (u8 *)((tilesDest) + ((xpos >> 1) & 3) + ((xpos >> 3) << 5) + (((ypos >> 3) * (sizeX)) << 5) + ((u32)(ypos << 29) >> 27)); \\\n            toOrr = (_8pixbuf >> (xAdd * 4)) & 0xF;                                                                                          \\\n            if (toOrr != 0)                                                                                                                  \\\n            {                                                                                                                                \\\n                bits = (xpos & 1) * 4;                                                                                                       \\\n                *dst = (toOrr << bits) | (*dst & (0xF0 >> bits));                                                                            \\\n            }                                                                                                                                \\\n        }                                                                                                                                    \\\n        src += 4;                                                                                                                            \\\n    }                                                                                                                                        \\\n}\n\nvoid CopyGlyphToWindow(struct TextPrinter *textPrinter)\n{\n    int glyphWidth, glyphHeight;\n    u8 sizeType;\n    \n    if (gWindows[textPrinter->printerTemplate.windowId].window.width * 8 - textPrinter->printerTemplate.currentX < gGlyphInfo.width)\n        glyphWidth = gWindows[textPrinter->printerTemplate.windowId].window.width * 8 - textPrinter->printerTemplate.currentX;\n    else\n        glyphWidth = gGlyphInfo.width;\n    if (gWindows[textPrinter->printerTemplate.windowId].window.height * 8 - textPrinter->printerTemplate.currentY < gGlyphInfo.height)\n        glyphHeight = gWindows[textPrinter->printerTemplate.windowId].window.height * 8 - textPrinter->printerTemplate.currentY;\n    else\n        glyphHeight = gGlyphInfo.height;\n\n    sizeType = 0;\n    if (glyphWidth > 8)\n        sizeType |= 1;\n    if (glyphHeight > 8)\n        sizeType |= 2;\n    \n    switch (sizeType)\n    {\n        case 0: // ≤ 8x8\n            GLYPH_COPY(0, 0, glyphWidth, glyphHeight, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3));\n            return;\n        case 1: // ≤ 16x8\n            GLYPH_COPY(0, 0, 8, glyphHeight, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3));\n            GLYPH_COPY(8, 0, glyphWidth - 8, glyphHeight, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3));\n            return;\n        case 2: // ≤ 8x16\n            GLYPH_COPY(0, 0, glyphWidth, 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3));\n            GLYPH_COPY(0, 8, glyphWidth, glyphHeight - 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3));\n            return;\n        case 3: // ≤ 16x16\n            GLYPH_COPY(0, 0, 8, 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3));\n            GLYPH_COPY(8, 0, glyphWidth - 8, 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3));\n            GLYPH_COPY(0, 8, 8, glyphHeight - 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3));\n            GLYPH_COPY(8, 8, glyphWidth - 8, glyphHeight - 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3));\n            return;\n    }\n}\n\n// Unused\nstatic void CopyGlyphToWindow_Parameterized(void *tileData, u16 currentX, u16 currentY, u16 width, u16 height)\n{\n    int glyphWidth, glyphHeight;\n    u8 sizeType;\n    u16 sizeX;\n    \n    if (width - currentX < gGlyphInfo.width)\n        glyphWidth = width - currentX;\n    else\n        glyphWidth = gGlyphInfo.width;\n    if (height - currentY < gGlyphInfo.height)\n        glyphHeight = height - currentY;\n    else\n        glyphHeight = gGlyphInfo.height;\n    \n    sizeType = 0;\n    sizeX  = (width + (width & 7)) >> 3;\n    if (glyphWidth > 8)\n        sizeType |= 1;\n    if (glyphHeight > 8)\n        sizeType |= 2;\n    \n    switch (sizeType)\n    {\n        case 0:\n            GLYPH_COPY(0, 0, glyphWidth, glyphHeight, tileData, currentX, currentY, sizeX);\n            return;\n        case 1:\n            GLYPH_COPY(0, 0, 8, glyphHeight, tileData, currentX, currentY, sizeX);\n            GLYPH_COPY(8, 0, glyphWidth - 8, glyphHeight, tileData, currentX, currentY, sizeX);\n            return;\n        case 2:\n            GLYPH_COPY(0, 0, glyphWidth, 8, tileData, currentX, currentY, sizeX);\n            GLYPH_COPY(0, 8, glyphWidth, glyphHeight - 8, tileData, currentX, currentY, sizeX);\n            return;\n        case 3:\n            GLYPH_COPY(0, 0, 8, 8, tileData, currentX, currentY, sizeX);\n            GLYPH_COPY(8, 0, glyphWidth - 8, 8, tileData, currentX, currentY, sizeX);\n            GLYPH_COPY(0, 8, 8, glyphHeight - 8, tileData, currentX, currentY, sizeX);\n            GLYPH_COPY(8, 8, glyphWidth - 8, glyphHeight - 8, tileData, currentX, currentY, sizeX);\n            return;\n    }\n}\n\nvoid ClearTextSpan(struct TextPrinter *textPrinter, u32 width)\n{\n}\n"
  },
  {
    "path": "src/text_window.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"text_window.h\"\n#include \"text_window_graphics.h\"\n#include \"help_message.h\"\n#include \"new_menu_helpers.h\"\n\nstatic void LoadUserWindowGfxByFrame(u8 windowId, u8 frameType, u16 destOffset, u8 palOffset);\n\n// Unused\n// Equivalent to LoadHelpMessageWindowGfx, but takes a bg id directly\nstatic void LoadHelpMessageWindowGfxOnBg(u8 bgId, u16 destOffset, u8 palOffset)\n{\n    LoadBgTiles(bgId, gHelpMessageWindow_Gfx, 0x280, destOffset);\n    LoadPalette(GetTextWindowPalette(2), palOffset, PLTT_SIZE_4BPP);\n}\n\n// Unused\n// Equivalent to LoadMenuMessageWindowGfx, but takes a bg id directly\nstatic void LoadMenuMessageWindowGfxOnBg(u8 bgId, u16 destOffset, u8 palOffset)\n{\n    LoadBgTiles(bgId, gMenuMessageWindow_Gfx, 0x280, destOffset);\n    LoadPalette(GetTextWindowPalette(0), palOffset, PLTT_SIZE_4BPP);\n}\n\n// Unused\n// Equivalent to LoadSignpostWindowGfx, but takes a bg id directly\nstatic void LoadSignpostWindowGfxOnBg(u8 bgId, u16 destOffset, u8 palOffset)\n{\n    LoadBgTiles(bgId, gSignpostWindow_Gfx, 0x260, destOffset);\n    LoadPalette(GetTextWindowPalette(1), palOffset, PLTT_SIZE_4BPP);\n}\n\n// Equivalent to LoadStdWindowGfx, but takes a bg id directly\nvoid LoadStdWindowGfxOnBg(u8 bgId, u16 destOffset, u8 palOffset)\n{\n    LoadBgTiles(bgId, gStdTextWindow_Gfx, 0x120, destOffset);\n    LoadPalette(GetTextWindowPalette(3), palOffset, PLTT_SIZE_4BPP);\n}\n\n// Unused\n// Equivalent to LoadQuestLogWindowTiles, but takes a bg id directly\nstatic void LoadQuestLogWindowTilesOnBg(u8 bgId, u16 destOffset)\n{\n    LoadBgTiles(bgId, gQuestLogWindow_Gfx, 0x280, destOffset);\n}\n\n// Unused\n// Equivalent to LoadUserWindowGfxByFrame, but takes a bg id directly\nstatic void LoadUserWindowGfxByFrameOnBg(u8 bgId, u8 frameType, u16 destOffset, u8 palOffset)\n{\n    LoadBgTiles(bgId, gUserFrames[frameType].tiles, 0x120, destOffset);\n    LoadPalette(gUserFrames[frameType].palette, palOffset, PLTT_SIZE_4BPP);\n}\n\n// Identical to LoadUserWindowGfx\nvoid LoadUserWindowGfx2(u8 windowId, u16 destOffset, u8 palOffset)\n{\n    LoadUserWindowGfxByFrame(windowId, gSaveBlock2Ptr->optionsWindowFrameType, destOffset, palOffset);\n}\n\nvoid LoadHelpMessageWindowGfx(u8 windowId, u16 destOffset, u8 palOffset)\n{\n    LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gHelpMessageWindow_Gfx, 0x280, destOffset);\n    LoadPalette(GetTextWindowPalette(2), palOffset, PLTT_SIZE_4BPP);\n}\n\nvoid LoadMenuMessageWindowGfx(u8 windowId, u16 destOffset, u8 palOffset)\n{\n    LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gMenuMessageWindow_Gfx, 0x280, destOffset);\n    LoadPalette(GetTextWindowPalette(0), palOffset, PLTT_SIZE_4BPP);\n}\n\nvoid LoadSignpostWindowGfx(u8 windowId, u16 destOffset, u8 palOffset)\n{\n    LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gSignpostWindow_Gfx, 0x260, destOffset);\n    LoadPalette(GetTextWindowPalette(1), palOffset, PLTT_SIZE_4BPP);\n}\n\nvoid LoadStdWindowGfx(u8 windowId, u16 destOffset, u8 palOffset)\n{\n    LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gStdTextWindow_Gfx, 0x120, destOffset);\n    LoadPalette(GetTextWindowPalette(3), palOffset, PLTT_SIZE_4BPP);\n}\n\nvoid LoadStdWindowTiles(u8 windowId, u16 destOffset)\n{\n    LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gStdTextWindow_Gfx, 0x120, destOffset);\n}\n\nvoid LoadQuestLogWindowTiles(u8 windowId, u16 destOffset)\n{\n    LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gQuestLogWindow_Gfx, 0x280, destOffset);\n}\n\nstatic void LoadUserWindowGfxByFrame(u8 windowId, u8 frameType, u16 destOffset, u8 palOffset)\n{\n    LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUserFrames[frameType].tiles, 0x120, destOffset);\n    LoadPalette(gUserFrames[frameType].palette, palOffset, PLTT_SIZE_4BPP);\n}\n\nvoid LoadUserWindowGfx(u8 windowId, u16 destOffset, u8 palOffset)\n{\n    LoadUserWindowGfxByFrame(windowId, gSaveBlock2Ptr->optionsWindowFrameType, destOffset, palOffset);\n}\n\nvoid DrawTextBorderOuter(u8 windowId, u16 tileNum, u8 palNum)\n{\n    u8 bgLayer = GetWindowAttribute(windowId, WINDOW_BG);\n    u16 tilemapLeft = GetWindowAttribute(windowId, WINDOW_TILEMAP_LEFT);\n    u16 tilemapTop = GetWindowAttribute(windowId, WINDOW_TILEMAP_TOP);\n    u16 width = GetWindowAttribute(windowId, WINDOW_WIDTH);\n    u16 height = GetWindowAttribute(windowId, WINDOW_HEIGHT);\n\n    FillBgTilemapBufferRect(bgLayer, tileNum + 0, tilemapLeft - 1,      tilemapTop - 1,         1,      1,      palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 1, tilemapLeft,          tilemapTop - 1,         width,  1,      palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 2, tilemapLeft + width,  tilemapTop - 1,         1,      1,      palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 3, tilemapLeft - 1,      tilemapTop,             1,      height, palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 5, tilemapLeft + width,  tilemapTop,             1,      height, palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 6, tilemapLeft - 1,      tilemapTop + height,    1,      1,      palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 7, tilemapLeft,          tilemapTop + height,    width,  1,      palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 8, tilemapLeft + width,  tilemapTop + height,    1,      1,      palNum);\n}\n\nvoid DrawTextBorderInner(u8 windowId, u16 tileNum, u8 palNum)\n{\n    u8 bgLayer = GetWindowAttribute(windowId, WINDOW_BG);\n    u16 tilemapLeft = GetWindowAttribute(windowId, WINDOW_TILEMAP_LEFT);\n    u16 tilemapTop = GetWindowAttribute(windowId, WINDOW_TILEMAP_TOP);\n    u16 width = GetWindowAttribute(windowId, WINDOW_WIDTH);\n    u16 height = GetWindowAttribute(windowId, WINDOW_HEIGHT);\n\n    FillBgTilemapBufferRect(bgLayer, tileNum + 0, tilemapLeft,              tilemapTop,                 1,          1,          palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 1, tilemapLeft + 1,          tilemapTop,                 width - 2,  1,          palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 2, tilemapLeft + width - 1,  tilemapTop,                 1,          1,          palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 3, tilemapLeft,              tilemapTop + 1,             1,          height - 2, palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 5, tilemapLeft + width - 1,  tilemapTop + 1,             1,          height - 2, palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 6, tilemapLeft,              tilemapTop + height - 1,    1,          1,          palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 7, tilemapLeft + 1,          tilemapTop + height - 1,    width -     2,  1,      palNum);\n    FillBgTilemapBufferRect(bgLayer, tileNum + 8, tilemapLeft + width - 1,  tilemapTop + height - 1,    1,          1,          palNum);\n}\n\nvoid rbox_fill_rectangle(u8 windowId)\n{\n    u8 bgLayer = GetWindowAttribute(windowId, WINDOW_BG);\n    u16 tilemapLeft = GetWindowAttribute(windowId, WINDOW_TILEMAP_LEFT);\n    u16 tilemapTop = GetWindowAttribute(windowId, WINDOW_TILEMAP_TOP);\n    u16 width = GetWindowAttribute(windowId, WINDOW_WIDTH);\n    u16 height = GetWindowAttribute(windowId, WINDOW_HEIGHT);\n\n    FillBgTilemapBufferRect(bgLayer, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, 17);\n}\n\nconst u16 *GetTextWindowPalette(u8 id)\n{\n    switch (id)\n    {\n    case 0:\n        id = 0;\n        break;\n    case 1:\n        id = 0x10;\n        break;\n    case 2:\n        id = 0x20;\n        break;\n    case 3:\n        id = 0x30;\n        break;\n    case 4:\n    default:\n        id = 0x40;\n        break;\n    }\n\n    return (const u16 *)(gTextWindowPalettes) + id;\n}\n"
  },
  {
    "path": "src/text_window_graphics.c",
    "content": "#include \"global.h\"\n#include \"text_window_graphics.h\"\n\nconst u16 gSignpostWindow_Gfx[] = INCBIN_U16(\"graphics/text_window/signpost.4bpp\");\n\nstatic const u16 sUserFrame_Type1_Gfx[] = INCBIN_U16(\"graphics/text_window/type1.4bpp\");\nstatic const u16 sUserFrame_Type2_Gfx[] = INCBIN_U16(\"graphics/text_window/type2.4bpp\");\nstatic const u16 sUserFrame_Empty1[16] = {0};\nstatic const u16 sUserFrame_Type3_Gfx[] = INCBIN_U16(\"graphics/text_window/type3.4bpp\");\nstatic const u16 sUserFrame_Type4_Gfx[] = INCBIN_U16(\"graphics/text_window/type4.4bpp\");\nstatic const u16 sUserFrame_Type5_Gfx[] = INCBIN_U16(\"graphics/text_window/type5.4bpp\");\nstatic const u16 sUserFrame_Type6_Gfx[] = INCBIN_U16(\"graphics/text_window/type6.4bpp\");\nstatic const u16 sUserFrame_Type7_Gfx[] = INCBIN_U16(\"graphics/text_window/type7.4bpp\");\nstatic const u16 sUserFrame_Type8_Gfx[] = INCBIN_U16(\"graphics/text_window/type8.4bpp\");\nstatic const u16 sUserFrame_Empty2[16] = {0};\nstatic const u16 sUserFrame_Type9_Gfx[] = INCBIN_U16(\"graphics/text_window/type9.4bpp\");\nstatic const u16 sUserFrame_Type10_Gfx[] = INCBIN_U16(\"graphics/text_window/type10.4bpp\");\nstatic const u16 sUserFrame_Type11_Gfx[]  = INCBIN_U16(\"graphics/text_window/frame11.4bpp\"); //RBY\nstatic const u16 sUserFrame_Empty3[16] = {0};\n\nstatic const u16 sUserFrame_Type1_Pal[] = INCBIN_U16(\"graphics/text_window/type1.gbapal\");\nstatic const u16 sUserFrame_Type2_Pal[] = INCBIN_U16(\"graphics/text_window/type2.gbapal\");\nstatic const u16 sUserFrame_Type3_Pal[] = INCBIN_U16(\"graphics/text_window/type3.gbapal\");\nstatic const u16 sUserFrame_Type4_Pal[] = INCBIN_U16(\"graphics/text_window/type4.gbapal\");\nstatic const u16 sUserFrame_Type5_Pal[] = INCBIN_U16(\"graphics/text_window/type5.gbapal\");\nstatic const u16 sUserFrame_Type6_Pal[] = INCBIN_U16(\"graphics/text_window/type6.gbapal\");\nstatic const u16 sUserFrame_Type7_Pal[] = INCBIN_U16(\"graphics/text_window/type7.gbapal\");\nstatic const u16 sUserFrame_Type8_Pal[] = INCBIN_U16(\"graphics/text_window/type8.gbapal\");\nstatic const u16 sUserFrame_Type9_Pal[] = INCBIN_U16(\"graphics/text_window/type9.gbapal\");\nstatic const u16 sUserFrame_Type10_Pal[] = INCBIN_U16(\"graphics/text_window/type10.gbapal\");\nstatic const u16 sUserFrame_Type11_Pal[] = INCBIN_U16(\"graphics/text_window/frame11.gbapal\"); //RBY\n\nconst u16 gStdTextWindow_Gfx[] = INCBIN_U16(\"graphics/text_window/std.4bpp\");\nconst u16 gQuestLogWindow_Gfx[] = INCBIN_U16(\"graphics/text_window/quest_log.4bpp\");\n\nconst u16 gTextWindowPalettes[][16] = {\n    INCBIN_U16(\"graphics/text_window/stdpal_0.gbapal\"),\n    INCBIN_U16(\"graphics/text_window/stdpal_1.gbapal\"),\n    INCBIN_U16(\"graphics/text_window/stdpal_2.gbapal\"),\n    INCBIN_U16(\"graphics/text_window/stdpal_3.gbapal\"),\n    INCBIN_U16(\"graphics/text_window/stdpal_4.gbapal\")\n};\n\nconst struct TextWindowGraphics gUserFrames[] = {\n    {sUserFrame_Type1_Gfx,  sUserFrame_Type1_Pal},\n    {sUserFrame_Type2_Gfx,  sUserFrame_Type2_Pal},\n    {sUserFrame_Type3_Gfx,  sUserFrame_Type3_Pal},\n    {sUserFrame_Type4_Gfx,  sUserFrame_Type4_Pal},\n    {sUserFrame_Type5_Gfx,  sUserFrame_Type5_Pal},\n    {sUserFrame_Type6_Gfx,  sUserFrame_Type6_Pal},\n    {sUserFrame_Type7_Gfx,  sUserFrame_Type7_Pal},\n    {sUserFrame_Type8_Gfx,  sUserFrame_Type8_Pal},\n    {sUserFrame_Type9_Gfx,  sUserFrame_Type9_Pal},\n    {sUserFrame_Type10_Gfx, sUserFrame_Type10_Pal},\n    {sUserFrame_Type11_Gfx, sUserFrame_Type11_Pal},\n};\n\nconst struct TextWindowGraphics *GetUserWindowGraphics(u8 idx)\n{\n    if (idx >= ARRAY_COUNT(gUserFrames))\n        return &gUserFrames[0];\n    else\n        return &gUserFrames[idx];\n}\n"
  },
  {
    "path": "src/tilemap_util.c",
    "content": "#include \"global.h\"\n#include \"bg.h\"\n#include \"tilemap_util.h\"\n#include \"malloc.h\"\n\n//  Handles 3 particular tilemaps (\"PKMN Data\" text, party menu, close box\n//  button) used for Pokémon Storage System in a somewhat unusual way.\n//  For example, while the cursor is on the Close Box button it flashes between\n//  two states alternately. Both these states are their own part of the same\n//  tilemap that's always present. The utility shifts the tilemap up and down\n//  to show/hide the states, and limits the view with a rectangle that only\n//  reveals one at a time.\n\nstruct TilemapUtil_RectData\n{\n    s16 x;\n    s16 y;\n    u16 width;\n    u16 height;\n    s16 destX;\n    s16 destY;\n};\n\nstruct TilemapUtil\n{\n    struct TilemapUtil_RectData prev; // Only read in unused function\n    struct TilemapUtil_RectData cur;\n    const void *savedTilemap; // Only written in unused function\n    const void *tilemap;\n    u16 altWidth; // Never read\n    u16 altHeight; // Never read\n    u16 width;\n    u16 height;\n    u16 rowSize; // Never read\n    u8 tileSize;\n    u8 bg;\n    bool8 active; // Only read in unused function\n};\n\nstatic EWRAM_DATA struct TilemapUtil *sTilemapUtil = NULL;\nstatic EWRAM_DATA u16 sNumTilemapUtilIds = 0;\n\nstatic void TilemapUtil_DrawPrev(u8 tilemapId);\nstatic void TilemapUtil_Draw(u8 tilemapId);\n\nstatic const struct {\n    u16 width;\n    u16 height;\n} sTilemapDimensions[2][4] = {\n    {\n        { 256,  256},\n        { 512,  256},\n        { 256,  512},\n        { 512,  512}\n    }, {\n        { 128,  128},\n        { 256,  256},\n        { 512,  512},\n        {1024, 1024}\n    }\n};\n\nvoid TilemapUtil_Init(u8 numTilemapIds)\n{\n    u16 i;\n    sTilemapUtil = Alloc(numTilemapIds * sizeof(struct TilemapUtil));\n    sNumTilemapUtilIds = sTilemapUtil == NULL ? 0 : numTilemapIds;\n    for (i = 0; i < sNumTilemapUtilIds; i++)\n    {\n        sTilemapUtil[i].savedTilemap = NULL;\n        sTilemapUtil[i].active = FALSE;\n    }\n}\n\nvoid TilemapUtil_Free(void)\n{\n    Free(sTilemapUtil);\n}\n\n// Unused\nvoid TilemapUtil_UpdateAll(void)\n{\n    int i;\n\n    for (i = 0; i < sNumTilemapUtilIds; i++)\n    {\n        if (sTilemapUtil[i].active == TRUE)\n            TilemapUtil_Update(i);\n    }\n}\n\nvoid TilemapUtil_SetTilemap(u8 tilemapId, u8 bg, const void *tilemap, u16 width, u16 height)\n{\n    u16 screenSize;\n    u16 bgType;\n\n    if (tilemapId < sNumTilemapUtilIds)\n    {\n        sTilemapUtil[tilemapId].savedTilemap = NULL;\n        sTilemapUtil[tilemapId].tilemap = tilemap;\n        sTilemapUtil[tilemapId].bg = bg;\n        sTilemapUtil[tilemapId].width = width;\n        sTilemapUtil[tilemapId].height = height;\n\n        screenSize = GetBgAttribute(bg, BG_ATTR_SCREENSIZE);\n        bgType = GetBgAttribute(bg, BG_ATTR_BGTYPE);\n        sTilemapUtil[tilemapId].altWidth = sTilemapDimensions[bgType][screenSize].width;\n        sTilemapUtil[tilemapId].altHeight = sTilemapDimensions[bgType][screenSize].height;\n        if (bgType != 0)\n            sTilemapUtil[tilemapId].tileSize = 1;\n        else\n            sTilemapUtil[tilemapId].tileSize = 2;\n        sTilemapUtil[tilemapId].rowSize = width * sTilemapUtil[tilemapId].tileSize;\n        sTilemapUtil[tilemapId].cur.width = width;\n        sTilemapUtil[tilemapId].cur.height = height;\n        sTilemapUtil[tilemapId].cur.x = 0;\n        sTilemapUtil[tilemapId].cur.y = 0;\n        sTilemapUtil[tilemapId].cur.destX = 0;\n        sTilemapUtil[tilemapId].cur.destY = 0;\n        sTilemapUtil[tilemapId].prev = sTilemapUtil[tilemapId].cur;\n        sTilemapUtil[tilemapId].active = TRUE;\n    }\n}\n\n// Unused\nvoid TilemapUtil_SetSavedMap(u8 tilemapId, const void *tilemap)\n{\n    if (tilemapId < sNumTilemapUtilIds)\n    {\n        sTilemapUtil[tilemapId].savedTilemap = tilemap;\n        sTilemapUtil[tilemapId].active = TRUE;\n    }\n}\n\nvoid TilemapUtil_SetPos(u8 tilemapId, u16 destX, u16 destY)\n{\n    if (tilemapId < sNumTilemapUtilIds)\n    {\n        sTilemapUtil[tilemapId].cur.destX = destX;\n        sTilemapUtil[tilemapId].cur.destY = destY;\n        sTilemapUtil[tilemapId].active = TRUE;\n    }\n}\n\nvoid TilemapUtil_SetRect(u8 tilemapId, u16 x, u16 y, u16 width, u16 height)\n{\n    if (tilemapId < sNumTilemapUtilIds)\n    {\n        sTilemapUtil[tilemapId].cur.x = x;\n        sTilemapUtil[tilemapId].cur.y = y;\n        sTilemapUtil[tilemapId].cur.width = width;\n        sTilemapUtil[tilemapId].cur.height = height;\n        sTilemapUtil[tilemapId].active = TRUE;\n    }\n}\n\nvoid TilemapUtil_Move(u8 tilemapId, u8 mode, s8 param)\n{\n    if (tilemapId < sNumTilemapUtilIds)\n    {\n        switch (mode)\n        {\n        case 0:\n            sTilemapUtil[tilemapId].cur.destX += param;\n            sTilemapUtil[tilemapId].cur.width -= param;\n            break;\n        case 1:\n            sTilemapUtil[tilemapId].cur.x += param;\n            sTilemapUtil[tilemapId].cur.width += param;\n            break;\n        case 2:\n            sTilemapUtil[tilemapId].cur.destY += param;\n            sTilemapUtil[tilemapId].cur.height -= param;\n            break;\n        case 3: // this is the only mode ever used\n            sTilemapUtil[tilemapId].cur.y -= param;\n            sTilemapUtil[tilemapId].cur.height += param;\n            break;\n        case 4:\n            sTilemapUtil[tilemapId].cur.destX += param;\n            break;\n        case 5:\n            sTilemapUtil[tilemapId].cur.destY += param;\n            break;\n        }\n        sTilemapUtil[tilemapId].active = TRUE;\n    }\n}\n\nvoid TilemapUtil_Update(u8 tilemapId)\n{\n    if (tilemapId < sNumTilemapUtilIds)\n    {\n        if (sTilemapUtil[tilemapId].savedTilemap != NULL) // Always false\n            TilemapUtil_DrawPrev(tilemapId);\n        TilemapUtil_Draw(tilemapId);\n        sTilemapUtil[tilemapId].prev = sTilemapUtil[tilemapId].cur;\n    }\n}\n\n// Never called, see TilemapUtil_Update\nstatic void TilemapUtil_DrawPrev(u8 tilemapId)\n{\n    int i;\n    int rowSize = sTilemapUtil[tilemapId].tileSize * sTilemapUtil[tilemapId].altWidth;\n    const void *tiles = sTilemapUtil[tilemapId].savedTilemap\n                        + rowSize * sTilemapUtil[tilemapId].prev.destY\n                        + sTilemapUtil[tilemapId].prev.destX * sTilemapUtil[tilemapId].tileSize;\n    for (i = 0; i < sTilemapUtil[tilemapId].prev.height; i++)\n    {\n        CopyToBgTilemapBufferRect(sTilemapUtil[tilemapId].bg,\n                                  tiles,\n                                  sTilemapUtil[tilemapId].prev.destX,\n                                  sTilemapUtil[tilemapId].prev.destY + i,\n                                  sTilemapUtil[tilemapId].prev.width,\n                                  1);\n        tiles += rowSize;\n    }\n}\n\nstatic void TilemapUtil_Draw(u8 tilemapId)\n{\n    int i;\n    int rowSize = sTilemapUtil[tilemapId].tileSize * sTilemapUtil[tilemapId].width;\n    const void *tiles = sTilemapUtil[tilemapId].tilemap\n                        + rowSize * sTilemapUtil[tilemapId].cur.y\n                        + sTilemapUtil[tilemapId].cur.x * sTilemapUtil[tilemapId].tileSize;\n    for (i = 0; i < sTilemapUtil[tilemapId].cur.height; i++)\n    {\n        CopyToBgTilemapBufferRect(sTilemapUtil[tilemapId].bg,\n                                  tiles,\n                                  sTilemapUtil[tilemapId].cur.destX,\n                                  sTilemapUtil[tilemapId].cur.destY + i,\n                                  sTilemapUtil[tilemapId].cur.width,\n                                  1);\n        tiles += rowSize;\n    }\n}\n"
  },
  {
    "path": "src/tileset_anims.c",
    "content": "#include \"global.h\"\n\nstatic EWRAM_DATA struct {\n    const u16 *src;\n    u16 *dest;\n    u16 size;\n} sTilesetDMA3TransferBuffer[20] = {0};\n\nstatic u8 sTilesetDMA3TransferBufferSize;\nstatic u16 sPrimaryTilesetAnimCounter;\nstatic u16 sPrimaryTilesetAnimCounterMax;\nstatic u16 sSecondaryTilesetAnimCounter;\nstatic u16 sSecondaryTilesetAnimCounterMax;\nstatic void (*sPrimaryTilesetAnimCallback)(u16);\nstatic void (*sSecondaryTilesetAnimCallback)(u16);\n\nstatic void _InitPrimaryTilesetAnimation(void);\nstatic void _InitSecondaryTilesetAnimation(void);\n\n// palette: general 00\nstatic const u16 sTilesetAnims_General_Flower_Frame0[] = INCBIN_U16(\"data/tilesets/primary/general/anim/flower/0.4bpp\");\nstatic const u16 sTilesetAnims_General_Flower_Frame1[] = INCBIN_U16(\"data/tilesets/primary/general/anim/flower/1.4bpp\");\nstatic const u16 sTilesetAnims_General_Flower_Frame2[] = INCBIN_U16(\"data/tilesets/primary/general/anim/flower/2.4bpp\");\nstatic const u16 sTilesetAnims_General_Flower_Frame3[] = INCBIN_U16(\"data/tilesets/primary/general/anim/flower/3.4bpp\");\nstatic const u16 sTilesetAnims_General_Flower_Frame4[] = INCBIN_U16(\"data/tilesets/primary/general/anim/flower/4.4bpp\");\n\nstatic const u16 *const sTilesetAnims_General_Flower[] = {\n    sTilesetAnims_General_Flower_Frame0,\n    sTilesetAnims_General_Flower_Frame1,\n    sTilesetAnims_General_Flower_Frame2,\n    sTilesetAnims_General_Flower_Frame3,\n    sTilesetAnims_General_Flower_Frame4\n};\n\n// palette: general 04\nstatic const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame0[] = INCBIN_U16(\"data/tilesets/primary/general/anim/water_current_landwatersedge/0.4bpp\");\nstatic const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame1[] = INCBIN_U16(\"data/tilesets/primary/general/anim/water_current_landwatersedge/1.4bpp\");\nstatic const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame2[] = INCBIN_U16(\"data/tilesets/primary/general/anim/water_current_landwatersedge/2.4bpp\");\nstatic const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame3[] = INCBIN_U16(\"data/tilesets/primary/general/anim/water_current_landwatersedge/3.4bpp\");\nstatic const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame4[] = INCBIN_U16(\"data/tilesets/primary/general/anim/water_current_landwatersedge/4.4bpp\");\nstatic const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame5[] = INCBIN_U16(\"data/tilesets/primary/general/anim/water_current_landwatersedge/5.4bpp\");\nstatic const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame6[] = INCBIN_U16(\"data/tilesets/primary/general/anim/water_current_landwatersedge/6.4bpp\");\nstatic const u16 sTilesetAnims_General_Water_Current_LandWatersEdge_Frame7[] = INCBIN_U16(\"data/tilesets/primary/general/anim/water_current_landwatersedge/7.4bpp\");\n\nstatic const u16 *const sTilesetAnims_General_Water_Current_LandWatersEdge[] = {\n    sTilesetAnims_General_Water_Current_LandWatersEdge_Frame0,\n    sTilesetAnims_General_Water_Current_LandWatersEdge_Frame1,\n    sTilesetAnims_General_Water_Current_LandWatersEdge_Frame2,\n    sTilesetAnims_General_Water_Current_LandWatersEdge_Frame3,\n    sTilesetAnims_General_Water_Current_LandWatersEdge_Frame4,\n    sTilesetAnims_General_Water_Current_LandWatersEdge_Frame5,\n    sTilesetAnims_General_Water_Current_LandWatersEdge_Frame6,\n    sTilesetAnims_General_Water_Current_LandWatersEdge_Frame7\n};\n\n// palette: general 04\nstatic const u16 sTilesetAnims_General_SandWatersEdge_Frame0[] = INCBIN_U16(\"data/tilesets/primary/general/anim/sandwatersedge/0.4bpp\");\nstatic const u16 sTilesetAnims_General_SandWatersEdge_Frame1[] = INCBIN_U16(\"data/tilesets/primary/general/anim/sandwatersedge/1.4bpp\");\nstatic const u16 sTilesetAnims_General_SandWatersEdge_Frame2[] = INCBIN_U16(\"data/tilesets/primary/general/anim/sandwatersedge/2.4bpp\");\nstatic const u16 sTilesetAnims_General_SandWatersEdge_Frame3[] = INCBIN_U16(\"data/tilesets/primary/general/anim/sandwatersedge/3.4bpp\");\nstatic const u16 sTilesetAnims_General_SandWatersEdge_Frame4[] = INCBIN_U16(\"data/tilesets/primary/general/anim/sandwatersedge/4.4bpp\");\nstatic const u16 sTilesetAnims_General_SandWatersEdge_Frame5[] = INCBIN_U16(\"data/tilesets/primary/general/anim/sandwatersedge/5.4bpp\");\nstatic const u16 sTilesetAnims_General_SandWatersEdge_Frame6[] = INCBIN_U16(\"data/tilesets/primary/general/anim/sandwatersedge/6.4bpp\");\nstatic const u16 sTilesetAnims_General_SandWatersEdge_Frame7[] = INCBIN_U16(\"data/tilesets/primary/general/anim/sandwatersedge/7.4bpp\");\n\nstatic const u16 *const sTilesetAnims_General_SandWatersEdge[] = {\n    sTilesetAnims_General_SandWatersEdge_Frame0,\n    sTilesetAnims_General_SandWatersEdge_Frame1,\n    sTilesetAnims_General_SandWatersEdge_Frame2,\n    sTilesetAnims_General_SandWatersEdge_Frame3,\n    sTilesetAnims_General_SandWatersEdge_Frame4,\n    sTilesetAnims_General_SandWatersEdge_Frame5,\n    sTilesetAnims_General_SandWatersEdge_Frame6,\n    sTilesetAnims_General_SandWatersEdge_Frame7\n};\n\n// palette: general 00\nstatic const u16 sTilesetAnims_CeladonCity_Fountain_Frame0[] = INCBIN_U16(\"data/tilesets/secondary/celadon_city/anim/fountain/0.4bpp\");\nstatic const u16 sTilesetAnims_CeladonCity_Fountain_Frame1[] = INCBIN_U16(\"data/tilesets/secondary/celadon_city/anim/fountain/1.4bpp\");\nstatic const u16 sTilesetAnims_CeladonCity_Fountain_Frame2[] = INCBIN_U16(\"data/tilesets/secondary/celadon_city/anim/fountain/2.4bpp\");\nstatic const u16 sTilesetAnims_CeladonCity_Fountain_Frame3[] = INCBIN_U16(\"data/tilesets/secondary/celadon_city/anim/fountain/3.4bpp\");\nstatic const u16 sTilesetAnims_CeladonCity_Fountain_Frame4[] = INCBIN_U16(\"data/tilesets/secondary/celadon_city/anim/fountain/4.4bpp\");\nstatic const u16 sTilesetAnims_CeladonCity_Fountain_Empty[16] = {};\n\nstatic const u16 *const sTilesetAnims_CeladonCity_Fountain[] = {\n    sTilesetAnims_CeladonCity_Fountain_Frame0,\n    sTilesetAnims_CeladonCity_Fountain_Frame1,\n    sTilesetAnims_CeladonCity_Fountain_Frame2,\n    sTilesetAnims_CeladonCity_Fountain_Frame3,\n    sTilesetAnims_CeladonCity_Fountain_Frame4\n};\n\nstatic const u16 sTilesetAnims_SilphCo_Fountain_Frame0[] = INCBIN_U16(\"data/tilesets/secondary/silph_co/anim/fountain/0.4bpp\");\nstatic const u16 sTilesetAnims_SilphCo_Fountain_Frame1[] = INCBIN_U16(\"data/tilesets/secondary/silph_co/anim/fountain/1.4bpp\");\nstatic const u16 sTilesetAnims_SilphCo_Fountain_Frame2[] = INCBIN_U16(\"data/tilesets/secondary/silph_co/anim/fountain/2.4bpp\");\nstatic const u16 sTilesetAnims_SilphCo_Fountain_Frame3[] = INCBIN_U16(\"data/tilesets/secondary/silph_co/anim/fountain/3.4bpp\");\nstatic const u16 sTilesetAnims_SilphCo_Fountain_Empty[16] = {};\n\nstatic const u16 *const sTilesetAnims_SilphCo_Fountain[] = {\n    sTilesetAnims_SilphCo_Fountain_Frame0,\n    sTilesetAnims_SilphCo_Fountain_Frame1,\n    sTilesetAnims_SilphCo_Fountain_Frame2,\n    sTilesetAnims_SilphCo_Fountain_Frame3\n};\n\nstatic const u16 sTilesetAnims_MtEmber_Steam_Frame0[] = INCBIN_U16(\"data/tilesets/secondary/mt_ember/anim/steam/0.4bpp\");\nstatic const u16 sTilesetAnims_MtEmber_Steam_Frame1[] = INCBIN_U16(\"data/tilesets/secondary/mt_ember/anim/steam/1.4bpp\");\nstatic const u16 sTilesetAnims_MtEmber_Steam_Frame2[] = INCBIN_U16(\"data/tilesets/secondary/mt_ember/anim/steam/2.4bpp\");\nstatic const u16 sTilesetAnims_MtEmber_Steam_Frame3[] = INCBIN_U16(\"data/tilesets/secondary/mt_ember/anim/steam/3.4bpp\");\n\nstatic const u16 *const sTilesetAnims_MtEmber_Steam[] = {\n    sTilesetAnims_MtEmber_Steam_Frame0,\n    sTilesetAnims_MtEmber_Steam_Frame1,\n    sTilesetAnims_MtEmber_Steam_Frame2,\n    sTilesetAnims_MtEmber_Steam_Frame3\n};\n\nstatic const u16 sTilesetAnims_VermilionGym_MotorizedDoor_Frame0[] = INCBIN_U16(\"data/tilesets/secondary/vermilion_gym/anim/motorizeddoor/0.4bpp\");\nstatic const u16 sTilesetAnims_VermilionGym_MotorizedDoor_Frame1[] = INCBIN_U16(\"data/tilesets/secondary/vermilion_gym/anim/motorizeddoor/1.4bpp\");\n\nstatic const u16 *const sTilesetAnims_VermilionGym_MotorizedDoor[] = {\n    sTilesetAnims_VermilionGym_MotorizedDoor_Frame0,\n    sTilesetAnims_VermilionGym_MotorizedDoor_Frame1\n};\n\nstatic const u16 sTilesetAnims_CeladonGym_Flowers_Frame0[] = INCBIN_U16(\"data/tilesets/secondary/celadon_gym/anim/flowers/0.4bpp\");\nstatic const u16 sTilesetAnims_CeladonGym_Flowers_Frame1[] = INCBIN_U16(\"data/tilesets/secondary/celadon_gym/anim/flowers/1.4bpp\");\nstatic const u16 sTilesetAnims_CeladonGym_Flowers_Frame2[] = INCBIN_U16(\"data/tilesets/secondary/celadon_gym/anim/flowers/2.4bpp\");\n\nstatic const u16 *const sTilesetAnims_CeladonGym_Flowers[] = {\n    sTilesetAnims_CeladonGym_Flowers_Frame0,\n    sTilesetAnims_CeladonGym_Flowers_Frame1,\n    sTilesetAnims_CeladonGym_Flowers_Frame2,\n    sTilesetAnims_CeladonGym_Flowers_Frame1\n};\n\nstatic const u16 gTilesetAnims_Underwater_Seaweed_Frame0[] = INCBIN_U16(\"data/tilesets/secondary/underwater/anim/seaweed/0.4bpp\");\nstatic const u16 gTilesetAnims_Underwater_Seaweed_Frame1[] = INCBIN_U16(\"data/tilesets/secondary/underwater/anim/seaweed/1.4bpp\");\nstatic const u16 gTilesetAnims_Underwater_Seaweed_Frame2[] = INCBIN_U16(\"data/tilesets/secondary/underwater/anim/seaweed/2.4bpp\");\nstatic const u16 gTilesetAnims_Underwater_Seaweed_Frame3[] = INCBIN_U16(\"data/tilesets/secondary/underwater/anim/seaweed/3.4bpp\");\n\nstatic const u16 *const gTilesetAnims_Underwater_Seaweed[] = {\n    gTilesetAnims_Underwater_Seaweed_Frame0,\n    gTilesetAnims_Underwater_Seaweed_Frame1,\n    gTilesetAnims_Underwater_Seaweed_Frame2,\n    gTilesetAnims_Underwater_Seaweed_Frame3\n};\n\nconst u16 gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame0[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/anim/flag/0.4bpp\");\nconst u16 gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame1[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/anim/flag/1.4bpp\");\nconst u16 gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame2[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/anim/flag/2.4bpp\");\nconst u16 gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame3[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/anim/flag/3.4bpp\");\n\nconst u16 *const gTilesetAnims_BattleFrontierOutsideWest_Flag[] = {\n    gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame0,\n    gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame1,\n    gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame2,\n    gTilesetAnims_BattleFrontierOutsideWest_Flag_Frame3\n};\n\nconst u16 gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame0[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/anim/flag/0.4bpp\");\nconst u16 gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame1[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/anim/flag/1.4bpp\");\nconst u16 gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame2[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/anim/flag/2.4bpp\");\nconst u16 gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame3[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/anim/flag/3.4bpp\");\n\nconst u16 *const gTilesetAnims_BattleFrontierOutsideEast_Flag[] = {\n    gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame0,\n    gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame1,\n    gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame2,\n    gTilesetAnims_BattleFrontierOutsideEast_Flag_Frame3\n};\n\nconst u16 gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame0[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/anim/flower/0.4bpp\");\nconst u16 gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame1[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/anim/flower/1.4bpp\");\nconst u16 gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame2[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsidewest/anim/flower/2.4bpp\");\n\nconst u16 *const gTilesetAnims_BattleFrontierOutsideWest_Flower[] = {\n    gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame0,\n    gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame1,\n    gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame0,\n    gTilesetAnims_BattleFrontierOutsideWest_Flower_Frame2\n};\n\nconst u16 gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame0[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/anim/flower/0.4bpp\");\nconst u16 gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame1[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/anim/flower/1.4bpp\");\nconst u16 gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame2[] = INCBIN_U16(\"data/tilesets/secondary/battlefrontieroutsideeast/anim/flower/2.4bpp\");\n\nconst u16 *const gTilesetAnims_BattleFrontierOutsideEast_Flower[] = {\n    gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame0,\n    gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame1,\n    gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame0,\n    gTilesetAnims_BattleFrontierOutsideEast_Flower_Frame2\n};\n\nstatic const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame0[] = INCBIN_U16(\"data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/0.4bpp\");\nstatic const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame1[] = INCBIN_U16(\"data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/1.4bpp\");\nstatic const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame2[] = INCBIN_U16(\"data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/2.4bpp\");\nstatic const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame3[] = INCBIN_U16(\"data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/3.4bpp\");\nstatic const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame4[] = INCBIN_U16(\"data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/4.4bpp\");\nstatic const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame5[] = INCBIN_U16(\"data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/5.4bpp\");\nstatic const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame6[] = INCBIN_U16(\"data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/6.4bpp\");\nstatic const u16 gTilesetAnims_Mossdeep_Tree_Base_Frame7[] = INCBIN_U16(\"data/tilesets/secondary/SeviiIslands5/anim/mossdeep_tree_base/7.4bpp\");\n\nstatic const u16 *const gTilesetAnims_Mossdeep_Tree_Base[] = {\n    gTilesetAnims_Mossdeep_Tree_Base_Frame0,\n    gTilesetAnims_Mossdeep_Tree_Base_Frame1,\n    gTilesetAnims_Mossdeep_Tree_Base_Frame2,\n    gTilesetAnims_Mossdeep_Tree_Base_Frame3,\n    gTilesetAnims_Mossdeep_Tree_Base_Frame4,\n    gTilesetAnims_Mossdeep_Tree_Base_Frame5,\n    gTilesetAnims_Mossdeep_Tree_Base_Frame6,\n    gTilesetAnims_Mossdeep_Tree_Base_Frame7\n};\n\nstatic void ResetTilesetAnimBuffer(void)\n{\n    sTilesetDMA3TransferBufferSize = 0;\n    CpuFill32(0, sTilesetDMA3TransferBuffer, sizeof sTilesetDMA3TransferBuffer);\n}\n\nstatic void AppendTilesetAnimToBuffer(const u16 *src, u16 *dest, u16 size)\n{\n    if (sTilesetDMA3TransferBufferSize < 20)\n    {\n        sTilesetDMA3TransferBuffer[sTilesetDMA3TransferBufferSize].src = src;\n        sTilesetDMA3TransferBuffer[sTilesetDMA3TransferBufferSize].dest = dest;\n        sTilesetDMA3TransferBuffer[sTilesetDMA3TransferBufferSize].size = size;\n        sTilesetDMA3TransferBufferSize++;\n    }\n}\n\nvoid TransferTilesetAnimsBuffer(void)\n{\n    int i;\n\n    for (i = 0; i < sTilesetDMA3TransferBufferSize; i++)\n        DmaCopy16(3, sTilesetDMA3TransferBuffer[i].src, sTilesetDMA3TransferBuffer[i].dest, sTilesetDMA3TransferBuffer[i].size);\n\n    sTilesetDMA3TransferBufferSize = 0;\n}\n\nvoid InitTilesetAnimations(void)\n{\n    ResetTilesetAnimBuffer();\n    _InitPrimaryTilesetAnimation();\n    _InitSecondaryTilesetAnimation();\n}\n\nvoid InitSecondaryTilesetAnimation(void)\n{\n    _InitSecondaryTilesetAnimation();\n}\n\nvoid UpdateTilesetAnimations(void)\n{\n    ResetTilesetAnimBuffer();\n    if (++sPrimaryTilesetAnimCounter >= sPrimaryTilesetAnimCounterMax)\n        sPrimaryTilesetAnimCounter = 0;\n    if (++sSecondaryTilesetAnimCounter >= sSecondaryTilesetAnimCounterMax)\n        sSecondaryTilesetAnimCounter = 0;\n\n    if (sPrimaryTilesetAnimCallback)\n        sPrimaryTilesetAnimCallback(sPrimaryTilesetAnimCounter);\n    if (sSecondaryTilesetAnimCallback)\n        sSecondaryTilesetAnimCallback(sSecondaryTilesetAnimCounter);\n}\n\nstatic void _InitPrimaryTilesetAnimation(void)\n{\n    sPrimaryTilesetAnimCounter = 0;\n    sPrimaryTilesetAnimCounterMax = 0;\n    sPrimaryTilesetAnimCallback = NULL;\n    if (gMapHeader.mapLayout->primaryTileset && gMapHeader.mapLayout->primaryTileset->callback)\n        gMapHeader.mapLayout->primaryTileset->callback();\n}\n\nstatic void _InitSecondaryTilesetAnimation(void)\n{\n    sSecondaryTilesetAnimCounter = 0;\n    sSecondaryTilesetAnimCounterMax = 0;\n    sSecondaryTilesetAnimCallback = NULL;\n    if (gMapHeader.mapLayout->secondaryTileset && gMapHeader.mapLayout->secondaryTileset->callback)\n        gMapHeader.mapLayout->secondaryTileset->callback();\n}\n\nstatic void QueueAnimTiles_General_Flower(u16 timer)\n{\n    AppendTilesetAnimToBuffer(sTilesetAnims_General_Flower[timer % ARRAY_COUNT(sTilesetAnims_General_Flower)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(508)), 4 * TILE_SIZE_4BPP);\n}\n\nstatic void QueueAnimTiles_General_Water_Current_LandWatersEdge(u16 timer)\n{\n    AppendTilesetAnimToBuffer(sTilesetAnims_General_Water_Current_LandWatersEdge[timer % ARRAY_COUNT(sTilesetAnims_General_Water_Current_LandWatersEdge)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(416)), 48 * TILE_SIZE_4BPP);\n    AppendTilesetAnimToBuffer(gTilesetAnims_Mossdeep_Tree_Base[timer % ARRAY_COUNT(gTilesetAnims_Mossdeep_Tree_Base)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(492)), 0x80);\n}\n\nstatic void QueueAnimTiles_General_SandWatersEdge(u16 timer)\n{\n    AppendTilesetAnimToBuffer(sTilesetAnims_General_SandWatersEdge[timer % ARRAY_COUNT(sTilesetAnims_General_SandWatersEdge)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(464)), 18 * TILE_SIZE_4BPP);\n}\n\nstatic void TilesetAnim_General(u16 timer)\n{\n    if (timer % 8 == 0)\n        QueueAnimTiles_General_SandWatersEdge(timer / 8);\n    if (timer % 16 == 1)\n        QueueAnimTiles_General_Water_Current_LandWatersEdge(timer / 16);\n    if (timer % 16 == 2)\n        QueueAnimTiles_General_Flower(timer / 16);\n}\n\nvoid InitTilesetAnim_General(void)\n{\n    sPrimaryTilesetAnimCounter = 0;\n    sPrimaryTilesetAnimCounterMax = 640;\n    sPrimaryTilesetAnimCallback = TilesetAnim_General;\n}\n\nstatic void QueueAnimTiles_CeladonCity_Fountain(u16 timer)\n{\n    AppendTilesetAnimToBuffer(sTilesetAnims_CeladonCity_Fountain[timer % ARRAY_COUNT(sTilesetAnims_CeladonCity_Fountain)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(744)), 8 * TILE_SIZE_4BPP);\n}\n\nstatic void TilesetAnim_CeladonCity(u16 timer)\n{\n    if (timer % 12 == 0)\n        QueueAnimTiles_CeladonCity_Fountain(timer / 12);\n}\n\nvoid InitTilesetAnim_CeladonCity(void)\n{\n    sSecondaryTilesetAnimCounter = 0;\n    sSecondaryTilesetAnimCounterMax = 120;\n    sSecondaryTilesetAnimCallback = TilesetAnim_CeladonCity;\n}\n\nstatic void QueueAnimTiles_SilphCo_Fountain(u16 timer)\n{\n    AppendTilesetAnimToBuffer(sTilesetAnims_SilphCo_Fountain[timer % ARRAY_COUNT(sTilesetAnims_SilphCo_Fountain)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(976)), 8 * TILE_SIZE_4BPP);\n}\n\nstatic void TilesetAnim_SilphCo(u16 timer)\n{\n    if (timer % 10 == 0)\n        QueueAnimTiles_SilphCo_Fountain(timer / 10);\n}\n\nvoid InitTilesetAnim_SilphCo(void)\n{\n    sSecondaryTilesetAnimCounter = 0;\n    sSecondaryTilesetAnimCounterMax = 160;\n    sSecondaryTilesetAnimCallback = TilesetAnim_SilphCo;\n}\n\nstatic void QueueAnimTiles_MtEmber_Steam(u16 timer)\n{\n    AppendTilesetAnimToBuffer(sTilesetAnims_MtEmber_Steam[timer % ARRAY_COUNT(sTilesetAnims_MtEmber_Steam)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(896)), 8 * TILE_SIZE_4BPP);\n}\n\nstatic void TilesetAnim_MtEmber(u16 timer)\n{\n    if (timer % 16 == 0)\n        QueueAnimTiles_MtEmber_Steam(timer / 16);\n}\n\nvoid InitTilesetAnim_MtEmber(void)\n{\n    sSecondaryTilesetAnimCounter = 0;\n    sSecondaryTilesetAnimCounterMax = 256;\n    sSecondaryTilesetAnimCallback = TilesetAnim_MtEmber;\n}\n\nstatic void QueueAnimTiles_VermilionGym_MotorizedDoor(u16 timer)\n{\n    u16 i = timer % ARRAY_COUNT(sTilesetAnims_VermilionGym_MotorizedDoor);\n\n    AppendTilesetAnimToBuffer(sTilesetAnims_VermilionGym_MotorizedDoor[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(880)), 7 * TILE_SIZE_4BPP);\n}\n\nstatic void TilesetAnim_VermilionGym(u16 timer)\n{\n    if (timer % 2 == 0)\n        QueueAnimTiles_VermilionGym_MotorizedDoor(timer / 2);\n}\n\nvoid InitTilesetAnim_VermilionGym(void)\n{\n    sSecondaryTilesetAnimCounter = 0;\n    sSecondaryTilesetAnimCounterMax = 240;\n    sSecondaryTilesetAnimCallback = TilesetAnim_VermilionGym;\n}\n\nstatic void QueueAnimTiles_CeladonGym_Flowers(u16 timer)\n{\n    u16 i = timer % ARRAY_COUNT(sTilesetAnims_CeladonGym_Flowers);\n    \n    AppendTilesetAnimToBuffer(sTilesetAnims_CeladonGym_Flowers[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(739)), 4 * TILE_SIZE_4BPP);\n}\n\nstatic void TilesetAnim_CeladonGym(u16 timer)\n{\n    if (timer % 16 == 0)\n        QueueAnimTiles_CeladonGym_Flowers(timer / 16);\n}\n\nvoid InitTilesetAnim_CeladonGym(void)\n{\n    sSecondaryTilesetAnimCounter = 0;\n    sSecondaryTilesetAnimCounterMax = 256;\n    sSecondaryTilesetAnimCallback = TilesetAnim_CeladonGym;\n}\n\nstatic void QueueAnimTiles_Underwater_Seaweed(u8 timer)\n{\n    u8 i = timer % 4;\n    AppendTilesetAnimToBuffer(gTilesetAnims_Underwater_Seaweed[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x2B5)), 0x80);\n}\n\nstatic void TilesetAnim_Underwater(u16 timer)\n{\n    if (timer % 16 == 0)\n        QueueAnimTiles_Underwater_Seaweed(timer >> 4);\n}\n\nvoid InitTilesetAnim_Underwater(void)\n{\n    sSecondaryTilesetAnimCounter = 0;\n    sSecondaryTilesetAnimCounterMax = 128;\n    sSecondaryTilesetAnimCallback = TilesetAnim_Underwater;\n}\n\nstatic void QueueAnimTiles_BattleFrontierOutsideWest_Flag(u16 timer)\n{\n    u16 i = timer % 4;\n    AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideWest_Flag[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x300)), 0xC0);\n}\n\nstatic void QueueAnimTiles_BattleFrontierOutsideEast_Flag(u16 timer)\n{\n    u16 i = timer % 4;\n    AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideEast_Flag[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x300)), 0xC0);\n}\n\nstatic void QueueAnimTiles_BattleFrontierOutsideWest_Flower(u16 timer)\n{\n    u16 i = timer % 4;\n    AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideWest_Flower[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x312)), 0x80);\n}\n\nstatic void QueueAnimTiles_BattleFrontierOutsideEast_Flower(u16 timer)\n{\n    u16 i = timer % 4;\n    AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideEast_Flower[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x312)), 0x80);\n}\n\nstatic void TilesetAnim_BattleFrontierOutsideWest(u16 timer)\n{\n    if (timer % 16 == 0)\n        QueueAnimTiles_BattleFrontierOutsideWest_Flower(timer >> 4);\n    if (timer % 8 == 0)\n        QueueAnimTiles_BattleFrontierOutsideWest_Flag(timer >> 3);\n}\n\nstatic void TilesetAnim_BattleFrontierOutsideEast(u16 timer)\n{\n    if (timer % 16 == 0)\n        QueueAnimTiles_BattleFrontierOutsideEast_Flower(timer >> 4);\n    if (timer % 8 == 0)\n        QueueAnimTiles_BattleFrontierOutsideEast_Flag(timer >> 3);\n}\n\nvoid InitTilesetAnim_BattleFrontierOutsideWest(void)\n{\n    sSecondaryTilesetAnimCounter = 0;\n    sSecondaryTilesetAnimCounterMax = 256;\n    sSecondaryTilesetAnimCallback = TilesetAnim_BattleFrontierOutsideWest;\n}\n\nvoid InitTilesetAnim_BattleFrontierOutsideEast(void)\n{\n    sSecondaryTilesetAnimCounter = 0;\n    sSecondaryTilesetAnimCounterMax = 256;\n    sSecondaryTilesetAnimCallback = TilesetAnim_BattleFrontierOutsideEast;\n}\n\nstatic void QueueAnimTiles_SeviiIslands67_Flower(u16 timer)\n{\n    u16 i = timer % 4;\n    AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideEast_Flower[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x377)), 0x80);\n}\n\nstatic void TilesetAnim_SeviiIslands67(u16 timer)\n{\n    if (timer % 16 == 0)\n        QueueAnimTiles_SeviiIslands67_Flower(timer >> 4);\n}\n\nvoid InitTilesetAnim_SeviiIslands67(void)\n{\n    sSecondaryTilesetAnimCounter = 0;\n    sSecondaryTilesetAnimCounterMax = 256;\n    sSecondaryTilesetAnimCallback = TilesetAnim_SeviiIslands67;\n}\n\nstatic void QueueAnimTiles_SeviiIslands5_ShortGrassFlower(u16 timer)\n{\n    AppendTilesetAnimToBuffer(sTilesetAnims_General_Flower[timer % NELEMS(sTilesetAnims_General_Flower)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x324)), 0x80);\n}\n\nstatic void TilesetAnim_SeviiIslands5(u16 timer)\n{\n    if (timer % 16 == 2)\n        QueueAnimTiles_SeviiIslands5_ShortGrassFlower(timer >> 4);\n}\n\nvoid InitTilesetAnim_SeviiIslands5(void)\n{\n    sSecondaryTilesetAnimCounter = sPrimaryTilesetAnimCounter;\n    sSecondaryTilesetAnimCounterMax = sPrimaryTilesetAnimCounterMax;\n    sSecondaryTilesetAnimCallback = TilesetAnim_SeviiIslands5;\n}"
  },
  {
    "path": "src/tilesets.c",
    "content": "#include \"global.h\"\n#include \"tilesets.h\"\n#include \"tileset_anims.h\"\n\n#include \"data/tilesets/graphics.h\"\n#include \"data/tilesets/metatiles.h\"\n#include \"data/tilesets/headers.h\"\n"
  },
  {
    "path": "src/title_screen.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"new_menu_helpers.h\"\n#include \"m4a.h\"\n#include \"scanline_effect.h\"\n#include \"graphics.h\"\n#include \"help_system.h\"\n#include \"intro.h\"\n#include \"load_save.h\"\n#include \"new_game.h\"\n#include \"random.h\"\n#include \"save.h\"\n#include \"main_menu.h\"\n#include \"clear_save_data_screen.h\"\n#include \"berry_fix_program.h\"\n#include \"decompress.h\"\n#include \"constants/songs.h\"\n\nenum TitleScreenScene\n{\n    TITLESCREENSCENE_INIT = 0,\n    TITLESCREENSCENE_FLASHSPRITE,\n    TITLESCREENSCENE_FADEIN,\n    TITLESCREENSCENE_RUN,\n    TITLESCREENSCENE_RESTART,\n    TITLESCREENSCENE_CRY\n};\n\nstatic EWRAM_DATA u8 sTitleScreenTimerTaskId = 0;\n\nstatic void ResetGpuRegs(void);\nstatic void CB2_TitleScreenRun(void);\nstatic void VBlankCB(void);\nstatic void Task_TitleScreenTimer(u8 taskId);\nstatic void Task_TitleScreenMain(u8 taskId);\nstatic void SetTitleScreenScene(s16 *data, u8 sceneNum);\nstatic void SetTitleScreenScene_Init(s16 *data);\nstatic void SetTitleScreenScene_FlashSprite(s16 *data);\nstatic void SetTitleScreenScene_FadeIn(s16 *data);\nstatic void SetTitleScreenScene_Run(s16 *data);\nstatic void SetGpuRegsForTitleScreenRun(void);\nstatic void SetTitleScreenScene_Restart(s16 *data);\nstatic void SetTitleScreenScene_Cry(s16 *data);\nstatic void Task_TitleScreen_SlideWin0(u8 taskId);\nstatic void Task_TitleScreen_BlinkPressStart(u8 taskId);\nstatic void SignalEndTitleScreenPaletteSomethingTask(void);\nstatic void UpdateScanlineEffectRegBuffer(s16 y);\nstatic void ScheduleStopScanlineEffect(void);\nstatic void LoadMainTitleScreenPalsAndResetBgs(void);\nstatic void CB2_FadeOutTransitionToSaveClearScreen(void);\nstatic void CB2_FadeOutTransitionToBerryFix(void);\nstatic void LoadSpriteGfxAndPals(void);\nstatic void SpriteCallback_TitleScreenFlameOrLeaf(struct Sprite *sprite);\nstatic void Task_FlameOrLeafSpawner(u8 taskId);\nstatic void TitleScreen_srand(u8 taskId, u8 field, u16 seed);\nstatic u16 TitleScreen_rand(u8 taskId, u8 field);\nstatic u32 CreateBlankSprite(void);\nstatic void SetPalOnOrCreateBlankSprite(bool32 hasCreatedBlankSprite);\nstatic u8 CreateSlashSprite(void);\nstatic void DeactivateSlashSprite(u8 spriteId);\nstatic bool32 IsSlashSpriteDeactivated(u8 spriteId);\nstatic void SpriteCallback_Slash(struct Sprite *sprite);\nstatic void sub_LG_8079844(void);\nstatic void CreateStreakSprites(void);\n\nstatic const u8 sBorderBgTiles[] = INCBIN_U8(\"graphics/title_screen/border_bg.4bpp.lz\");\n\nstatic const u8 sBorderBgMap_FR[] = INCBIN_U8(\"graphics/title_screen/firered/border_bg.bin.lz\");\nstatic const u8 sBorderBgMap_LG[] = INCBIN_U8(\"graphics/title_screen/leafgreen/border_bg.bin.lz\");\n\nstatic const u32 sSlash_Gfx[] = INCBIN_U32(\"graphics/title_screen/slash.4bpp.lz\");\n\n\nstatic const u16 sFlames_Pal[] = INCBIN_U16(\"graphics/title_screen/firered/flames.gbapal\");\nstatic const u32 sFlames_Gfx[] = INCBIN_U32(\"graphics/title_screen/firered/flames.4bpp.lz\");\nstatic const u32 sBlankFlames_Gfx[] = INCBIN_U32(\"graphics/title_screen/firered/blank_flames.4bpp.lz\");\n\nstatic const u16 sLeaves_Pal[] = INCBIN_U16(\"graphics/title_screen/leafgreen/leaves.gbapal\");\nstatic const u32 sLeaves_Gfx[] = INCBIN_U32(\"graphics/title_screen/leafgreen/leaves.4bpp.lz\");\nstatic const u32 sStreak_Gfx[] = INCBIN_U32(\"graphics/title_screen/leafgreen/streak.4bpp.lz\");\n\n\nstatic const struct OamData sOamData_FlameOrLeaf = {\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .shape = ST_OAM_SQUARE,\n    .size = ST_OAM_SIZE_1,\n    .tileNum = 0,\n    .priority = 3,\n    .paletteNum = 0\n};\n\nstatic const union AnimCmd sSpriteAnim_Flame[] = {\n    ANIMCMD_FRAME(0, 3),\n    ANIMCMD_FRAME(4, 6),\n    ANIMCMD_FRAME(8, 6),\n    ANIMCMD_FRAME(12, 6),\n    ANIMCMD_FRAME(16, 6),\n    ANIMCMD_FRAME(20, 6),\n    ANIMCMD_FRAME(24, 6),\n    ANIMCMD_FRAME(28, 6),\n    ANIMCMD_FRAME(32, 6),\n    ANIMCMD_FRAME(36, 6),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sSpriteAnim_Flame_Unused[] = {\n    ANIMCMD_FRAME(24, 6),\n    ANIMCMD_FRAME(28, 6),\n    ANIMCMD_FRAME(32, 6),\n    ANIMCMD_FRAME(36, 6),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnim_FlameOrLeaf_FR[] = {\n    sSpriteAnim_Flame,\n    sSpriteAnim_Flame_Unused,\n};\n\nstatic const union AnimCmd sSpriteAnim_Leaf[] = {\n    ANIMCMD_FRAME(0, 8),\n    ANIMCMD_FRAME(4, 8),\n    ANIMCMD_FRAME(8, 8),\n    ANIMCMD_FRAME(12, 8),\n    ANIMCMD_FRAME(16, 8),\n    ANIMCMD_FRAME(20, 8),\n    ANIMCMD_FRAME(24, 8),\n    ANIMCMD_FRAME(28, 8),\n    ANIMCMD_FRAME(32, 8),\n    ANIMCMD_FRAME(36, 8),\n    ANIMCMD_FRAME(40, 8),\n    ANIMCMD_JUMP(0)\n};\n\nstatic const union AnimCmd *const sSpriteAnim_FlameOrLeaf_LG[] = {\n    sSpriteAnim_Leaf\n};\n\nenum {\n    TILE_TAG_FLAME_OR_LEAF,\n    TILE_TAG_BLANK_OR_STREAK,\n    TILE_TAG_BLANK,\n    TILE_TAG_SLASH,\n};\n\nenum {\n    PAL_TAG_DEFAULT,\n    PAL_TAG_UNUSED,\n    PAL_TAG_SLASH,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_FlameOrLeaf_FR = {\n    .tileTag = TILE_TAG_FLAME_OR_LEAF,\n    .paletteTag = PAL_TAG_DEFAULT,\n    .oam = &sOamData_FlameOrLeaf,\n    .anims = sSpriteAnim_FlameOrLeaf_FR,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_FlameOrLeaf_LG = {\n    .tileTag = TILE_TAG_FLAME_OR_LEAF,\n    .paletteTag = PAL_TAG_DEFAULT,\n    .oam = &sOamData_FlameOrLeaf,\n    .anims = sSpriteAnim_FlameOrLeaf_LG,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_BlankFlame = {\n    .tileTag = TILE_TAG_BLANK_OR_STREAK,\n    .paletteTag = PAL_TAG_DEFAULT,\n    .oam = &sOamData_FlameOrLeaf,\n    .anims = sSpriteAnim_FlameOrLeaf_FR,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_Streak = {\n    .shape = SPRITE_SHAPE(32x16),\n    .size = SPRITE_SIZE(32x16),\n    .priority = 3\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Streak = {\n    .tileTag = TILE_TAG_BLANK_OR_STREAK,\n    .paletteTag = PAL_TAG_DEFAULT,\n    .oam = &sOamData_Streak,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_BlankSprite = {\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .shape = ST_OAM_V_RECTANGLE,\n    .size = ST_OAM_SIZE_3,\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_BlankSprite = {\n    .tileTag = TILE_TAG_BLANK,\n    .paletteTag = PAL_TAG_SLASH,\n    .oam = &sOamData_BlankSprite,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_SlashSprite = {\n    .objMode = ST_OAM_OBJ_WINDOW,\n    .shape = ST_OAM_SQUARE,\n    .size = ST_OAM_SIZE_3,\n    .tileNum = 0,\n    .priority = 0,\n    .paletteNum = 0\n};\n\nstatic const struct SpriteTemplate sSlashSpriteTemplate = {\n    .tileTag = TILE_TAG_SLASH,\n    .paletteTag = PAL_TAG_SLASH,\n    .oam = &sOamData_SlashSprite,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 1, // 8bpp\n        .priority = 0,\n        .baseTile = 0\n    }, {\n        .bg = 1,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0, // 4bpp\n        .priority = 1,\n        .baseTile = 0\n    }, {\n        .bg = 2,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0, // 4bpp\n        .priority = 2,\n        .baseTile = 0\n    }, {\n        .bg = 3,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 28,\n        .screenSize = 0,\n        .paletteMode = 0, // 4bpp\n        .priority = 3,\n        .baseTile = 0\n    }\n};\n\nstatic void (*const sSceneFuncs[])(s16 *data) = {\n    [TITLESCREENSCENE_INIT]        = SetTitleScreenScene_Init,\n    [TITLESCREENSCENE_FLASHSPRITE] = SetTitleScreenScene_FlashSprite,\n    [TITLESCREENSCENE_FADEIN]      = SetTitleScreenScene_FadeIn,\n    [TITLESCREENSCENE_RUN]         = SetTitleScreenScene_Run,\n    [TITLESCREENSCENE_RESTART]     = SetTitleScreenScene_Restart,\n    [TITLESCREENSCENE_CRY]         = SetTitleScreenScene_Cry\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheets_FR[] = {\n    {sFlames_Gfx,                    0x500, TILE_TAG_FLAME_OR_LEAF},\n    {sBlankFlames_Gfx,               0x500, TILE_TAG_BLANK_OR_STREAK},\n    {gTitleScreen_BlankSprite_Tiles, 0x400, TILE_TAG_BLANK},\n    {sSlash_Gfx,                     0x800, TILE_TAG_SLASH}\n};\n\nstatic const struct SpritePalette sSpritePals_FR[] = {\n    {sFlames_Pal,            PAL_TAG_DEFAULT},\n    {gTitleScreen_Slash_Pal_FR, PAL_TAG_SLASH},\n    {}\n};\n\nstatic const u8 sFlameXPositions[] = {\n    4, 16, 26, 32, 48, 200, 216, 224, 232, 60, 76, 92, 108, 128, 144, 0\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheets_LG[] = {\n    {sLeaves_Gfx,                    0x580, TILE_TAG_FLAME_OR_LEAF},\n    {sStreak_Gfx,                    0x100, TILE_TAG_BLANK_OR_STREAK},\n    {gTitleScreen_BlankSprite_Tiles, 0x400, TILE_TAG_BLANK},\n    {sSlash_Gfx,                     0x800, TILE_TAG_SLASH}\n};\n\nstatic const struct SpritePalette sSpritePals_LG[] = {\n    {sLeaves_Pal,            PAL_TAG_DEFAULT},\n    {gTitleScreen_Slash_Pal_LG, PAL_TAG_SLASH},\n    {}\n};\n\nstatic const u16 sStreakYPositions[] = {\n    40, 80, 110, 60, 90, 70, 100, 50\n};\n\nvoid CB2_InitTitleScreen(void)\n{\n    switch (gMain.state)\n    {\n    default:\n        gMain.state = 0;\n        // fallthrough\n    case 0:\n        SetVBlankCallback(NULL);\n        StartTimer1();\n        InitHeap(gHeap, HEAP_SIZE);\n        ResetTasks();\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        ResetPaletteFade();\n        ResetGpuRegs();\n        DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);\n        DmaFill32(3, 0, (void *)OAM, OAM_SIZE);\n        DmaFill16(3, 0, (void *)PLTT, PLTT_SIZE);\n        ResetBgsAndClearDma3BusyFlags(FALSE);\n        InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n        sTitleScreenTimerTaskId = TASK_NONE;\n        break;\n    case 1:\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n        {\n            LoadPalette(gGraphics_TitleScreen_GameTitleLogoPals_FR, BG_PLTT_ID(0), 13 * PLTT_SIZE_4BPP);\n            DecompressAndCopyTileDataToVram(0, gGraphics_TitleScreen_GameTitleLogoTiles_FR, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(0, gGraphics_TitleScreen_GameTitleLogoMap_FR, 0, 0, 1);\n            LoadPalette(gGraphics_TitleScreen_BoxArtMonPals_FR, BG_PLTT_ID(13), PLTT_SIZE_4BPP);\n            DecompressAndCopyTileDataToVram(1, gGraphics_TitleScreen_BoxArtMonTiles_FR, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(1, gGraphics_TitleScreen_BoxArtMonMap_FR, 0, 0, 1);\n            LoadPalette(gGraphics_TitleScreen_BackgroundPals_FR, BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n            DecompressAndCopyTileDataToVram(2, gGraphics_TitleScreen_CopyrightPressStartTiles, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(2, gGraphics_TitleScreen_CopyrightPressStartMap, 0, 0, 1);\n            LoadPalette(gGraphics_TitleScreen_BackgroundPals_FR, BG_PLTT_ID(14), PLTT_SIZE_4BPP);\n        }\n        else\n        {\n            LoadPalette(gGraphics_TitleScreen_GameTitleLogoPals_LG, BG_PLTT_ID(0), 13 * PLTT_SIZE_4BPP);\n            DecompressAndCopyTileDataToVram(0, gGraphics_TitleScreen_GameTitleLogoTiles_LG, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(0, gGraphics_TitleScreen_GameTitleLogoMap_LG, 0, 0, 1);\n            LoadPalette(gGraphics_TitleScreen_BoxArtMonPals_LG, BG_PLTT_ID(13), PLTT_SIZE_4BPP);\n            DecompressAndCopyTileDataToVram(1, gGraphics_TitleScreen_BoxArtMonTiles_LG, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(1, gGraphics_TitleScreen_BoxArtMonMap_LG, 0, 0, 1);\n            LoadPalette(gGraphics_TitleScreen_BackgroundPals_LG, BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n            DecompressAndCopyTileDataToVram(2, gGraphics_TitleScreen_CopyrightPressStartTiles, 0, 0, 0);\n            DecompressAndCopyTileDataToVram(2, gGraphics_TitleScreen_CopyrightPressStartMap, 0, 0, 1);\n            LoadPalette(gGraphics_TitleScreen_BackgroundPals_LG, BG_PLTT_ID(14), PLTT_SIZE_4BPP);\n        }\n        DecompressAndCopyTileDataToVram(3, sBorderBgTiles, 0, 0, 0);\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n            DecompressAndCopyTileDataToVram(3, sBorderBgMap_FR, 0, 0, 1);\n        else\n            DecompressAndCopyTileDataToVram(3, sBorderBgMap_LG, 0, 0, 1);\n        LoadSpriteGfxAndPals();\n        break;\n    case 2:\n        if (!FreeTempTileDataBuffersIfPossible())\n        {\n            BlendPalettes(PALETTES_BG, 16, RGB_BLACK);\n            CreateTask(Task_TitleScreenMain, 4);\n            sTitleScreenTimerTaskId = CreateTask(Task_TitleScreenTimer, 2);\n            SetVBlankCallback(VBlankCB);\n            SetMainCallback2(CB2_TitleScreenRun);\n            m4aSongNumStart(MUS_TITLE);\n        }\n        return;\n    }\n    gMain.state++;\n}\n\nstatic void ResetGpuRegs(void)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT,  0);\n    SetGpuReg(REG_OFFSET_BLDCNT,   0);\n    SetGpuReg(REG_OFFSET_BLDALPHA, 0);\n    SetGpuReg(REG_OFFSET_BLDY,     0);\n    SetGpuReg(REG_OFFSET_BG0HOFS,  0);\n    SetGpuReg(REG_OFFSET_BG0VOFS,  0);\n    SetGpuReg(REG_OFFSET_BG1HOFS,  0);\n    SetGpuReg(REG_OFFSET_BG1VOFS,  0);\n    SetGpuReg(REG_OFFSET_BG2HOFS,  0);\n    SetGpuReg(REG_OFFSET_BG2VOFS,  0);\n    SetGpuReg(REG_OFFSET_BG3HOFS,  0);\n    SetGpuReg(REG_OFFSET_BG3VOFS,  0);\n}\n\nstatic void CB2_TitleScreenRun(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n    ScanlineEffect_InitHBlankDmaTransfer();\n\n    if (sTitleScreenTimerTaskId != TASK_NONE)\n        gTasks[sTitleScreenTimerTaskId].data[0]++;\n}\n\nstatic void Task_TitleScreenTimer(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (data[0] >= 2700)\n    {\n        sTitleScreenTimerTaskId = TASK_NONE;\n        DestroyTask(taskId);\n    }\n}\n\n// task data for Task_TitleScreenMain and the scenes\n#define tSceneNum              data[0]\n#define tState                 data[1]\n#define tHasCreatedBlankSprite data[5]\n#define tSlashSpriteId         data[6]\n\nstatic void Task_TitleScreenMain(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (JOY_NEW(A_BUTTON | B_BUTTON | START_BUTTON)\n        && tSceneNum != TITLESCREENSCENE_RUN\n        && tSceneNum != TITLESCREENSCENE_RESTART\n        && tSceneNum != TITLESCREENSCENE_CRY)\n    {\n        ScheduleStopScanlineEffect();\n        LoadMainTitleScreenPalsAndResetBgs();\n        SetPalOnOrCreateBlankSprite(tHasCreatedBlankSprite);\n        SetTitleScreenScene(data, TITLESCREENSCENE_RUN);\n    }\n    else\n        sSceneFuncs[tSceneNum](data);\n}\n\nstatic void SetTitleScreenScene(s16 *data, u8 sceneNum)\n{\n    tState = 0;\n    tSceneNum = sceneNum;\n}\n\nstatic void SetTitleScreenScene_Init(s16 *data)\n{\n    struct ScanlineEffectParams params;\n\n    HideBg(0);\n    ShowBg(1);\n    ShowBg(2);\n    ShowBg(3);\n\n    params.dmaDest = (volatile void *)REG_ADDR_BLDY;\n    params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;\n    params.initState = 1;\n    params.unused9 = 0;\n\n    CpuFill16(0, gScanlineEffectRegBuffers[0], 0x140);\n    CpuFill16(0, gScanlineEffectRegBuffers[1], 0x140);\n\n    ScanlineEffect_SetParams(params);\n\n    SetTitleScreenScene(data, TITLESCREENSCENE_FLASHSPRITE);\n}\n\nstatic void SetTitleScreenScene_FlashSprite(s16 *data)\n{\n    switch (tState)\n    {\n    case 0:\n        SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_LIGHTEN);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        data[2] = 128;\n        UpdateScanlineEffectRegBuffer(data[2]);\n        tState++;\n        break;\n    case 1:\n        data[2] -= 4;\n        UpdateScanlineEffectRegBuffer(data[2]);\n        if (data[2] < 0)\n        {\n            gScanlineEffect.state = 3;\n            tState++;\n        }\n        break;\n    case 2:\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDY, 0);\n        SetTitleScreenScene(data, TITLESCREENSCENE_FADEIN);\n    }\n}\n\nstatic void SetTitleScreenScene_FadeIn(s16 *data)\n{\n    switch (tState)\n    {\n    case 0:\n        data[2] = 0;\n        tState++;\n        break;\n    case 1:\n        data[2]++;\n        if (data[2] > 10)\n        {\n            TintPalette_GrayScale2(&gPlttBufferUnfaded[BG_PLTT_ID(13)], 16);\n            BeginNormalPaletteFade(1 << 13, 9, 16, 0, RGB_BLACK);\n            tState++;\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            data[2] = 0;\n            tState++;\n        }\n        break;\n    case 3:\n        data[2]++;\n        if (data[2] > 36)\n        {\n            CreateTask(Task_TitleScreen_SlideWin0, 3);\n            BlendPalettesGradually(1 << 13, -4, 1, 16, RGB(30, 30, 31), 0, 0);\n            data[2] = 0;\n            tState++;\n        }\n        break;\n    case 4:\n        if (!IsBlendPalettesGraduallyTaskActive(0))\n        {\n            BlendPalettesGradually(1 << 13, -4, 15, 0, RGB(30, 30, 31), 0, 0);\n            tState++;\n        }\n        break;\n    case 5:\n        data[2]++;\n        if (data[2] > 20)\n        {\n            data[2] = 0;\n            BlendPalettesGradually(1 << 13, -4, 1, 16, RGB(30, 30, 31), 0, 0);\n            tState++;\n        }\n        break;\n    case 6:\n        if (!IsBlendPalettesGraduallyTaskActive(0))\n        {\n            BlendPalettesGradually(1 << 13, -4, 15, 0, RGB(30, 30, 31), 0, 0);\n            tState++;\n        }\n        break;\n    case 7:\n        data[2]++;\n        if (data[2] > 20)\n        {\n            data[2] = 0;\n            BlendPalettesGradually(1 << 13, -3, 0, 16, RGB(30, 30, 31), 0, 0);\n            tState++;\n        }\n        break;\n    case 8:\n        if (!IsBlendPalettesGraduallyTaskActive(0))\n        {\n            u32 palettes;\n            tHasCreatedBlankSprite = TRUE;\n            palettes = (PALETTES_BG & ~(1 << 13) & ~(1 << 14) & ~(1 << 15)) | (0x10000 << CreateBlankSprite());\n            BlendPalettes(palettes, 16, RGB(30, 30, 31));\n            BeginNormalPaletteFade(palettes, 1, 16, 0, RGB(30, 30, 31));\n            ShowBg(0);\n            if(gSaveBlock1Ptr->keyFlags.version == 0)\n                CpuCopy16(gGraphics_TitleScreen_BoxArtMonPals_FR, &gPlttBufferUnfaded[BG_PLTT_ID(13)], PLTT_SIZE_4BPP);\n            else\n                CpuCopy16(gGraphics_TitleScreen_BoxArtMonPals_LG, &gPlttBufferUnfaded[BG_PLTT_ID(13)], PLTT_SIZE_4BPP);\n            BlendPalettesGradually(1 << 13, 1, 15, 0, RGB(30, 30, 31), 0, 0);\n            tState++;\n        }\n        break;\n    case 9:\n        if (!IsBlendPalettesGraduallyTaskActive(0) && !gPaletteFade.active)\n        {\n            SetTitleScreenScene(data, TITLESCREENSCENE_RUN);\n        }\n        break;\n    }\n}\n\n#define KEYSTROKE_DELSAVE (B_BUTTON | SELECT_BUTTON | DPAD_UP)\n#define KEYSTROKE_BERRY_FIX (B_BUTTON | SELECT_BUTTON)\n\nstatic void SetTitleScreenScene_Run(s16 *data)\n{\n    switch (tState)\n    {\n    case 0:\n        SetHelpContext(HELPCONTEXT_TITLE_SCREEN);\n        CreateTask(Task_TitleScreen_BlinkPressStart, 0);\n\n        CreateTask(Task_FlameOrLeafSpawner, 5);\n        SetGpuRegsForTitleScreenRun();\n        tSlashSpriteId = CreateSlashSprite();\n        HelpSystem_Enable();\n        tState++;\n        // fallthrough\n    case 1:\n        if (JOY_HELD(KEYSTROKE_DELSAVE) == KEYSTROKE_DELSAVE)\n        {\n            DeactivateSlashSprite(tSlashSpriteId);\n            DestroyTask(FindTaskIdByFunc(Task_TitleScreenMain));\n            SetMainCallback2(CB2_FadeOutTransitionToSaveClearScreen);\n        }\n        else if (JOY_HELD(KEYSTROKE_BERRY_FIX) == KEYSTROKE_BERRY_FIX)\n        {\n            DeactivateSlashSprite(tSlashSpriteId);\n            DestroyTask(FindTaskIdByFunc(Task_TitleScreenMain));\n            SetMainCallback2(CB2_FadeOutTransitionToBerryFix);\n        }\n        else if (JOY_NEW(A_BUTTON | START_BUTTON))\n        {\n            SetTitleScreenScene(data, TITLESCREENSCENE_CRY);\n        }\n        else if (!FuncIsActiveTask(Task_TitleScreenTimer))\n        {\n            SetTitleScreenScene(data, TITLESCREENSCENE_RESTART);\n        }\n        break;\n    }\n}\n\nstatic void SetGpuRegsForTitleScreenRun(void)\n{\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WINOBJ_ALL);\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_LIGHTEN);\n    SetGpuReg(REG_OFFSET_BLDY, 13);\n}\n\nstatic void SetTitleScreenScene_Restart(s16 *data)\n{\n    switch (tState)\n    {\n    case 0:\n        DeactivateSlashSprite(tSlashSpriteId);\n        tState++;\n        break;\n    case 1:\n        if (!gPaletteFade.active && !IsSlashSpriteDeactivated(tSlashSpriteId))\n        {\n            FadeOutMapMusic(10);\n            BeginNormalPaletteFade(PALETTES_ALL, 3, 0, 0x10, RGB_BLACK);\n            SignalEndTitleScreenPaletteSomethingTask();\n            data[1]++;\n        }\n        break;\n    case 2:\n        if (IsNotWaitingForBGMStop() && !gPaletteFade.active)\n        {\n            DestroyTask(FindTaskIdByFunc(Task_TitleScreen_BlinkPressStart));\n            data[2] = 0;\n            tState++;\n        }\n        break;\n    case 3:\n        data[2]++;\n        if (data[2] >= 20)\n        {\n            DestroyTask(FindTaskIdByFunc(Task_TitleScreen_BlinkPressStart));\n            tState++;\n        }\n        break;\n    case 4:\n        HelpSystem_Disable();\n        DestroyTask(FindTaskIdByFunc(Task_TitleScreenMain));\n        SetMainCallback2(CB2_InitCopyrightScreenAfterTitleScreen);\n        break;\n    }\n}\n\nstatic void SetTitleScreenScene_Cry(s16 *data)\n{\n    switch (tState)\n    {\n    case 0:\n        if (!gPaletteFade.active)\n        {\n            if(gSaveBlock1Ptr->keyFlags.version == 0)\n                PlayCry_Normal(SPECIES_CHARIZARD, 0);\n            else\n                PlayCry_Normal(SPECIES_VENUSAUR, 0);\n            DeactivateSlashSprite(tSlashSpriteId);\n            data[2] = 0;\n            tState++;\n        }\n        break;\n    case 1:\n        if (data[2] < 90)\n            data[2]++;\n        else if (!IsSlashSpriteDeactivated(tSlashSpriteId))\n        {\n            BeginNormalPaletteFade((PALETTES_ALL & ~(1 << 0x1C) & ~(1 << 0x1D) & ~(1 << 0x1E) & ~(1 << 0x1F)), 0, 0, 16, RGB_WHITE);\n            SignalEndTitleScreenPaletteSomethingTask();\n            FadeOutBGM(4);\n            tState++;\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            u8 KeyVersionBackup = gSaveBlock1Ptr->keyFlags.version;\n            u8 KeyDifficultyBackup = gSaveBlock1Ptr->keyFlags.difficulty;\n            u8 KeyNuzlockeBackup = gSaveBlock1Ptr->keyFlags.nuzlocke;\n            u8 KeyIvCalcBackup = gSaveBlock1Ptr->keyFlags.ivCalcMode;\n            u8 KeyEvCalcBackup = gSaveBlock1Ptr->keyFlags.evCalcMode;\n            u8 ChangedCalcBackup = gSaveBlock1Ptr->keyFlags.changedCalcMode;\n            u8 noPMCBackup = gSaveBlock1Ptr->keyFlags.noPMC;\n            u8 expModBackup = gSaveBlock1Ptr->keyFlags.expMod;\n            SeedRngAndSetTrainerId();\n            SetSaveBlocksPointers();\n            ResetMenuAndMonGlobals();\n            Save_ResetSaveCounters();\n            LoadGameSave(SAVE_NORMAL);\n            if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_INVALID)\n                Sav2_ClearSetDefault();\n            gSaveBlock1Ptr->keyFlags.version = KeyVersionBackup;\n            gSaveBlock1Ptr->keyFlags.difficulty = KeyDifficultyBackup;\n            gSaveBlock1Ptr->keyFlags.nuzlocke = KeyNuzlockeBackup;\n            gSaveBlock1Ptr->keyFlags.ivCalcMode = KeyIvCalcBackup;\n            gSaveBlock1Ptr->keyFlags.evCalcMode = KeyEvCalcBackup;\n            gSaveBlock1Ptr->keyFlags.changedCalcMode = ChangedCalcBackup;\n            gSaveBlock1Ptr->keyFlags.noPMC = noPMCBackup;\n            gSaveBlock1Ptr->keyFlags.expMod = expModBackup;\n            SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);\n            InitHeap(gHeap, HEAP_SIZE);\n            SetMainCallback2(CB2_InitMainMenu);\n            DestroyTask(FindTaskIdByFunc(Task_TitleScreenMain));\n        }\n        break;\n    }\n}\n\n#undef tSceneNum\n#undef tState\n#undef tHasCreatedBlankSprite\n#undef tSlashSpriteId\n\nstatic void Task_TitleScreen_SlideWin0(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    switch (data[0])\n    {\n    case 0:\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL);\n        SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n        SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, DISPLAY_HEIGHT));\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0));\n        BlendPalettes(1 << 0xE, 0, RGB_BLACK);\n        data[0]++;\n        break;\n    case 1:\n        data[1] += 24 << 4;\n        data[2] = data[1] >> 4;\n        if (data[2] >= DISPLAY_WIDTH)\n        {\n            data[2] = DISPLAY_WIDTH;\n            data[0]++;\n        }\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, data[2]));\n        break;\n    case 2:\n        data[3]++;\n        if (data[3] >= 10)\n        {\n            data[3] = 0;\n            data[0]++;\n        }\n        break;\n    case 3:\n        SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(DISPLAY_WIDTH, DISPLAY_WIDTH));\n        ChangeBgX(2, -0xF000, 0);\n        BlendPalettes(1 << 0xF, 0, RGB_BLACK);\n        data[1] = 10 * 24 << 4;\n        data[0]++;\n        break;\n    case 4:\n        data[1] -= 24 << 4;\n        data[2] = data[1] >> 4;\n        if (data[2] <= 0)\n        {\n            data[2] = 0;\n            data[0]++;\n        }\n        ChangeBgX(2, -data[2] << 8, 0);\n        SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(data[2], DISPLAY_WIDTH));\n        break;\n    case 5:\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic void Task_TitleScreen_BlinkPressStart(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    s32 i;\n\n    if (data[15] && gPaletteFade.active)\n        data[14] = 1;\n    if (data[14] && !gPaletteFade.active)\n        DestroyTask(taskId);\n    else\n    {\n        if (!data[1])\n            data[2] = 60;\n        else\n            data[2] = 30;\n        data[0]++;\n        if (data[0] >= data[2])\n        {\n            data[0] = 0;\n            data[1] ^= 1;\n            if (data[1])\n            {\n                for (i = 0; i < 5; i++)\n                {\n                    if(gSaveBlock1Ptr->keyFlags.version == 0)\n                    {\n                        gPlttBufferUnfaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_FR[6];\n                        gPlttBufferFaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_FR[6];\n                    }\n                    else\n                    {\n                        gPlttBufferUnfaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_LG[6];\n                        gPlttBufferFaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_LG[6];\n                    }\n                }\n            }\n            else\n            {\n                for (i = 0; i < 5; i++)\n                {\n                    if(gSaveBlock1Ptr->keyFlags.version == 0)\n                    {\n                        gPlttBufferUnfaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_FR[1 + i];\n                        gPlttBufferFaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_FR[1 + i];\n                    }\n                    else\n                    {\n                        gPlttBufferUnfaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_LG[1 + i];\n                        gPlttBufferFaded[BG_PLTT_ID(15) + 1 + i] = gGraphics_TitleScreen_BackgroundPals_LG[1 + i];\n                    }\n                }\n            }\n            if (data[14])\n            {\n                BlendPalettes(0x00008000, gPaletteFade.y, gPaletteFade.blendColor);\n            }\n        }\n    }\n}\n\nstatic void SignalEndTitleScreenPaletteSomethingTask(void)\n{\n    u8 taskId = FindTaskIdByFunc(Task_TitleScreen_BlinkPressStart);\n    gTasks[taskId].data[15] = TRUE;\n}\n\nstatic void UpdateScanlineEffectRegBuffer(s16 y)\n{\n    s32 i;\n\n    if (y >= 0)\n        gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][y] = 16;\n\n    for (i = 0; i < 16; i++)\n    {\n        if (y + i >= 0)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][y + i] = 15 - i;\n\n        if (y - i >= 0)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][y - i] = 15 - i;\n\n    }\n\n    for (i = y + 16; i < 160; i++)\n    {\n        if (i >= 0)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = 0;\n    }\n\n    for (i = y - 16; i >= 0; i--)\n    {\n        if (i >= 0)\n            gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = 0;\n    }\n}\n\nstatic void ScheduleStopScanlineEffect(void)\n{\n    if (gScanlineEffect.state)\n        gScanlineEffect.state = 3;\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n}\n\nstatic void LoadMainTitleScreenPalsAndResetBgs(void)\n{\n    u8 taskId;\n\n    taskId = FindTaskIdByFunc(Task_TitleScreen_SlideWin0);\n    if (taskId != TASK_NONE)\n        DestroyTask(taskId);\n\n    DestroyBlendPalettesGraduallyTask();\n    ResetPaletteFadeControl();\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        LoadPalette(gGraphics_TitleScreen_GameTitleLogoPals_FR, BG_PLTT_ID(0), 13 * PLTT_SIZE_4BPP);\n        LoadPalette(gGraphics_TitleScreen_BoxArtMonPals_FR, BG_PLTT_ID(13), PLTT_SIZE_4BPP);\n        LoadPalette(gGraphics_TitleScreen_BackgroundPals_FR, BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n        LoadPalette(gGraphics_TitleScreen_BackgroundPals_FR, BG_PLTT_ID(14), PLTT_SIZE_4BPP);\n    }\n    else\n    {\n        LoadPalette(gGraphics_TitleScreen_GameTitleLogoPals_LG, BG_PLTT_ID(0), 13 * PLTT_SIZE_4BPP);\n        LoadPalette(gGraphics_TitleScreen_BoxArtMonPals_LG, BG_PLTT_ID(13), PLTT_SIZE_4BPP);\n        LoadPalette(gGraphics_TitleScreen_BackgroundPals_LG, BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n        LoadPalette(gGraphics_TitleScreen_BackgroundPals_LG, BG_PLTT_ID(14), PLTT_SIZE_4BPP);\n    }\n    ResetBgPositions();\n    ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON);\n    ShowBg(1);\n    ShowBg(2);\n    ShowBg(0);\n    ShowBg(3);\n}\n\nstatic void CB2_FadeOutTransitionToSaveClearScreen(void)\n{\n    if (!UpdatePaletteFade())\n        SetMainCallback2(CB2_SaveClearScreen_Init);\n}\n\nstatic void CB2_FadeOutTransitionToBerryFix(void)\n{\n    if (!UpdatePaletteFade())\n    {\n        m4aMPlayAllStop();\n        SetMainCallback2(CB2_InitBerryFixProgram);\n    }\n}\n\nstatic void LoadSpriteGfxAndPals(void)\n{\n    s32 i;\n\n    for (i = 0; i < NELEMS(sSpriteSheets_FR); i++)\n    {\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n            LoadCompressedSpriteSheet(&sSpriteSheets_FR[i]);\n        else\n            LoadCompressedSpriteSheet(&sSpriteSheets_LG[i]);\n    }\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n        LoadSpritePalettes(sSpritePals_FR);\n    else\n        LoadSpritePalettes(sSpritePals_LG);\n}\n\n#define sPosX      data[0]\n#define sSpeedX    data[1]\n#define sPosY      data[2]\n#define sSpeedY    data[3]\n\nstatic void SpriteCallback_TitleScreenFlameOrLeaf(struct Sprite *sprite)\n{\n    s16 *data = sprite->data;\n    sPosX -= sSpeedX;\n    sprite->x = sPosX >> 4;\n    if (sprite->x < -8)\n    {\n        DestroySprite(sprite);\n        return;\n    }\n    sPosY += sSpeedY;\n    sprite->y = sPosY >> 4;\n    if (sprite->y < 16 || sprite->y > 200)\n    {\n        DestroySprite(sprite);\n        return;\n    }\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        if (sprite->animEnded)\n        {\n            DestroySprite(sprite);\n            return;\n        }\n        if (data[7] != 0 && --data[7] == 0)\n        {\n            StartSpriteAnim(sprite, 0);\n            sprite->invisible = FALSE;\n        }\n    }\n    else\n    {\n        if (!data[5])\n        { // meaningless, since data[5] and data[6] are never used outside this block\n            s32 r2;\n            s32 r1;\n            data[6]++;\n            r2 = sSpeedX * data[6];\n            r1 = sSpeedY * data[6];\n            r2 = (r2 * r2) >> 4;\n            r1 = (r1 * r1) >> 4;\n            if (r2 + r1 >= 81 << 4)\n                data[5] = TRUE;\n        }\n    }\n}\n\nstatic bool32 CreateFlameOrLeafSprite(s32 x, s32 y, s32 xspeed, s32 yspeed, bool32 createFlame)\n{\n    u8 spriteId;\n\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        if (createFlame)\n            spriteId = CreateSprite(&sSpriteTemplate_FlameOrLeaf_FR, x, y, 0);\n        else\n            spriteId = CreateSprite(&sSpriteTemplate_BlankFlame, x, y, 0);\n\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].sPosX = x * 16;\n            gSprites[spriteId].sSpeedX = xspeed;\n            gSprites[spriteId].sPosY = y * 16;\n            gSprites[spriteId].sSpeedY = yspeed;\n            gSprites[spriteId].data[4] = 0;\n            gSprites[spriteId].data[5] = (xspeed * yspeed) % 16;\n            gSprites[spriteId].data[6] = createFlame;\n            gSprites[spriteId].callback = SpriteCallback_TitleScreenFlameOrLeaf;\n            return TRUE;\n        }\n        return FALSE;\n    }\n    else\n    {   //(s32 y0, s32 x1, s32 y1) original params, y0 = x, x1 = y, y1 = xspeed\n        u8 spriteId = CreateSprite(&sSpriteTemplate_FlameOrLeaf_LG, DISPLAY_WIDTH, x, 0);\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].sPosX = DISPLAY_WIDTH * 16;\n            gSprites[spriteId].sSpeedX = y;\n            gSprites[spriteId].sPosY = x * 16;\n            gSprites[spriteId].sSpeedY = xspeed;\n            gSprites[spriteId].callback = SpriteCallback_TitleScreenFlameOrLeaf;\n        }\n    }\n}\n\n#undef sPosX\n#undef sSpeedX\n#undef sPosY\n#undef sSpeedY\n\n#define tState       data[0]\n#define tTimer       data[1]\n#define tDelay       data[2]\n#define tOff_Seed       3   // data[3] and data[4]\n#define tOffsetX     data[5]\n\nstatic void Task_FlameOrLeafSpawner(u8 taskId)\n{\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        s16 *data = gTasks[taskId].data;\n        s32 x, y, xspeed, yspeed;\n        s32 i;\n\n        switch (tState)\n        {\n        case 0:\n            TitleScreen_srand(taskId, 3, 30840);\n            tState++;\n            break;\n        case 1:\n            tTimer++;\n            if (tTimer >= tDelay)\n            {\n                tTimer = 0;\n                TitleScreen_rand(taskId, 3);\n                tDelay = 18;\n                xspeed = (TitleScreen_rand(taskId, 3) % 4) - 2;\n                yspeed = (TitleScreen_rand(taskId, 3) % 8) - 16;\n                y = (TitleScreen_rand(taskId, 3) % 3) + 116;\n                x = TitleScreen_rand(taskId, 3) % DISPLAY_WIDTH;\n                CreateFlameOrLeafSprite(\n                    x,\n                    y,\n                    xspeed,\n                    yspeed,\n                    (TitleScreen_rand(taskId, 3) % 16) < 8 ? FALSE : TRUE\n                );\n                for (i = 0; i < 15; i++)\n                {\n                    CreateFlameOrLeafSprite(\n                        tOffsetX + sFlameXPositions[i],\n                        y,\n                        xspeed,\n                        yspeed,\n                        TRUE\n                    );\n                    xspeed = (TitleScreen_rand(taskId, 3) % 4) - 2;\n                    yspeed = (TitleScreen_rand(taskId, 3) % 8) - 16;\n                }\n                tOffsetX++;\n                if (tOffsetX > 3)\n                    tOffsetX = 0;\n            }\n        }\n    }\n    else\n    {\n        s16 *data = gTasks[taskId].data;\n        s32 rval;\n        s32 xspeed;\n        s32 yspeed;\n        s32 y;\n\n        switch (tState)\n        {\n        case 0:\n            CreateStreakSprites();\n            TitleScreen_srand(taskId, tOff_Seed, 30840);\n            tState++;\n            break;\n        case 1:\n            tTimer++;\n            if (tTimer >= tDelay)\n            {\n                tTimer = 0;\n                tDelay = (TitleScreen_rand(taskId, tOff_Seed) % 6) + 6;\n                rval = TitleScreen_rand(taskId, tOff_Seed) % 30;\n                xspeed = 16;\n                if (rval >= 6)\n                {\n                    xspeed = 48;\n                    if (rval < 12)\n                        xspeed = 24;\n                }\n                yspeed = (TitleScreen_rand(taskId, tOff_Seed) % 4) - 2;\n                y = (TitleScreen_rand(taskId, tOff_Seed) % 88) + 32;\n                CreateFlameOrLeafSprite(y, xspeed, yspeed, 0, FALSE);\n            }\n            break;\n        }\n    }\n}\n\n#undef sPosX\n#undef sSpeedX\n#undef sPosY\n#undef sSpeedY\n\nstatic void SpriteCallback_Streak(struct Sprite *sprite)\n{\n    sprite->x -= 7;\n    if (sprite->x < -16)\n    {\n        sprite->x = DISPLAY_WIDTH + 16;\n        sprite->data[7]++;\n        if (sprite->data[7] >= ARRAY_COUNT(sStreakYPositions))\n            sprite->data[7] = 0;\n        sprite->y = sStreakYPositions[sprite->data[7]];\n    }\n}\n\nstatic void CreateStreakSprites(void)\n{\n    int i;\n    u8 spriteId;\n    for (i = 0; i < 4; i++)\n    {\n        spriteId = CreateSprite(&sSpriteTemplate_Streak, DISPLAY_WIDTH + 16 + 40 * i, sStreakYPositions[i], 0xFF);\n        if (spriteId != MAX_SPRITES)\n        {\n            gSprites[spriteId].data[7] = i;\n            gSprites[spriteId].callback = SpriteCallback_Streak;\n        }\n    }\n}\n\nstatic void TitleScreen_srand(u8 taskId, u8 field, u16 seed)\n{\n    SetWordTaskArg(taskId, field, seed);\n}\n\nstatic u16 TitleScreen_rand(u8 taskId, u8 field)\n{\n    u32 rngval;\n\n    rngval = GetWordTaskArg(taskId, field);\n    rngval = ISO_RANDOMIZE1(rngval);\n    SetWordTaskArg(taskId, field, rngval);\n    return rngval >> 16;\n}\n\nstatic u32 CreateBlankSprite(void)\n{\n    CreateSprite(&sSpriteTemplate_BlankSprite, 24, 144, 0);\n    return IndexOfSpritePaletteTag(PAL_TAG_SLASH);\n}\n\nstatic void SetPalOnOrCreateBlankSprite(bool32 hasCreatedBlankSprite)\n{\n    u32 palIdx;\n\n    if (hasCreatedBlankSprite)\n    {\n        palIdx = IndexOfSpritePaletteTag(PAL_TAG_SLASH);\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n            LoadPalette(gTitleScreen_Slash_Pal_FR, OBJ_PLTT_ID(palIdx), PLTT_SIZE_4BPP);\n        else\n            LoadPalette(gTitleScreen_Slash_Pal_LG, OBJ_PLTT_ID(palIdx), PLTT_SIZE_4BPP);\n    }\n    else\n        CreateBlankSprite();\n}\n\n#define sState       data[0]\n#define sTimer       data[1]\n#define sDeactivate  data[2]\n\nstatic u8 CreateSlashSprite(void)\n{\n    u8 spriteId = CreateSprite(&sSlashSpriteTemplate, -32, 27, 1);\n    if (spriteId != MAX_SPRITES)\n    {\n        gSprites[spriteId].callback = SpriteCallback_Slash;\n        gSprites[spriteId].sTimer = 540;\n    }\n    return spriteId;\n}\n\nstatic void DeactivateSlashSprite(u8 spriteId)\n{\n    if (spriteId != MAX_SPRITES)\n        gSprites[spriteId].sDeactivate = TRUE;\n}\n\nstatic bool32 IsSlashSpriteDeactivated(u8 spriteId)\n{\n    if (spriteId != MAX_SPRITES)\n        return gSprites[spriteId].sState ^ 2 ? TRUE : FALSE;\n    else\n        return FALSE;\n}\n\nstatic void SpriteCallback_Slash(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        if (sprite->sDeactivate)\n        {\n            sprite->invisible = TRUE;\n            sprite->sState = 2;\n        }\n        sprite->sTimer--;\n        if (sprite->sTimer == 0)\n        {\n            sprite->invisible = FALSE;\n            sprite->sState = 1;\n        }\n        break;\n    case 1:\n        sprite->x += 9;\n        if (sprite->x == 67)\n            sprite->y -= 7;\n\n        if (sprite->x == 148)\n            sprite->y += 7;\n\n        if (sprite->x > DISPLAY_WIDTH + 32)\n        {\n            sprite->invisible = TRUE;\n            if (sprite->sDeactivate)\n                sprite->sState = 2;\n            else\n            {\n                sprite->x = -32;\n                sprite->sTimer = 540;\n                sprite->sState = 0;\n            }\n        }\n        break;\n    case 2:\n        break;\n    }\n}\n\n#undef sState\n#undef sTimer\n#undef sDeactivate\n"
  },
  {
    "path": "src/tm_case.c",
    "content": "#include \"global.h\"\n#include \"tm_case.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"graphics.h\"\n#include \"task.h\"\n#include \"text_window.h\"\n#include \"menu.h\"\n#include \"menu_helpers.h\"\n#include \"new_menu_helpers.h\"\n#include \"list_menu.h\"\n#include \"item.h\"\n#include \"item_menu.h\"\n#include \"link.h\"\n#include \"money.h\"\n#include \"shop.h\"\n#include \"teachy_tv.h\"\n#include \"pokemon_storage_system.h\"\n#include \"party_menu.h\"\n#include \"data.h\"\n#include \"scanline_effect.h\"\n#include \"strings.h\"\n#include \"menu_indicators.h\"\n#include \"constants/items.h\"\n#include \"constants/songs.h\"\n#include \"constants/quest_log.h\"\n#include \"event_data.h\"\n\n// Any item in the TM Case with nonzero importance is considered an HM\n#define IS_HM(itemId) (ItemId_GetImportance(itemId) != 0)\n\n#define TAG_SCROLL_ARROW 110\n\nenum {\n    WIN_LIST,\n    WIN_DESCRIPTION,\n    WIN_SELECTED_MSG,\n    WIN_TITLE,\n    WIN_MOVE_INFO_LABELS,\n    WIN_MOVE_INFO,\n    WIN_MESSAGE,\n    WIN_SELL_QUANTITY,\n    WIN_MONEY,\n};\n\n// Window IDs for the context menu that opens when a TM/HM is selected\nenum {\n    WIN_USE_GIVE_EXIT,\n    WIN_GIVE_EXIT,\n};\n\nextern void SetBagItemQuantity(u16 * ptr, u16 value);\n\n// IDs for the actions in the context menu\nenum {\n    ACTION_USE,\n    ACTION_GIVE,\n    ACTION_EXIT\n};\n\nenum {\n    COLOR_LIGHT,\n    COLOR_DARK,\n    COLOR_CURSOR_SELECTED,\n    COLOR_MOVE_INFO,\n    COLOR_CURSOR_ERASE = 0xFF\n};\n\n// Base position for TM/HM disc sprite\n#define DISC_BASE_X 41\n#define DISC_BASE_Y 46\n\n#define DISC_CASE_DISTANCE 20 // The total number of pixels a disc travels vertically in/out of the case\n#define DISC_Y_MOVE 10 // The number of pixels a disc travels vertically per movement step\n\n#define TAG_DISC 400\n\n#define DISC_HIDDEN 0xFF // When no TM/HM is selected, hide the disc sprite\n\nenum {\n    ANIM_TM,\n    ANIM_HM,\n};\n\n// The \"static\" resources are preserved even if the TM case is exited. This is\n// useful for when its left temporarily (e.g. going to the party menu to teach a TM)\n// but also to preserve the selected item when the TM case is fully closed.\nstatic EWRAM_DATA struct {\n    void (* exitCallback)(void);\n    u8 menuType;\n    bool8 allowSelectClose;\n    u8 unused;\n    u16 selectedRow;\n    u16 scrollOffset;\n} sTMCaseStaticResources = {};\n\n// The \"dynamic\" resources will be reset any time the TM case is exited, even temporarily.\nstatic EWRAM_DATA struct {\n    void (* nextScreenCallback)(void);\n    u8 discSpriteId;\n    u8 maxTMsShown;\n    u8 numTMs;\n    u8 contextMenuWindowId;\n    u8 scrollArrowsTaskId;\n    u16 currItem;\n    const u8 * menuActionIndices;\n    u8 numMenuActions;\n    s16 seqId;\n    u8 unused[8];\n} * sTMCaseDynamicResources = NULL;\n\n// Save the player's bag state when the Pokedude's bag is being shown\nstatic EWRAM_DATA struct {\n    struct ItemSlot bagPocket_TMHM[BAG_TMHM_COUNT];\n    struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT];\n    u16 selectedRow;\n    u16 scrollOffset;\n} * sPokedudeBagBackup = NULL;\n\nstatic EWRAM_DATA void *sTilemapBuffer = NULL;\nstatic EWRAM_DATA struct ListMenuItem * sListMenuItemsBuffer = NULL;\nstatic EWRAM_DATA u8 (* sListMenuStringsBuffer)[29] = NULL;\nstatic EWRAM_DATA u16 * sTMSpritePaletteBuffer = NULL;\n\nstatic void CB2_SetUpTMCaseUI_Blocking(void);\nstatic bool8 DoSetUpTMCaseUI(void);\nstatic void ResetBufferPointers_NoFree(void);\nstatic void LoadBGTemplates(void);\nstatic bool8 HandleLoadTMCaseGraphicsAndPalettes(void);\nstatic void CreateTMCaseListMenuBuffers(void);\nstatic void InitTMCaseListMenuItems(void);\nstatic void GetTMNumberAndMoveString(u8 * dest, u16 itemId);\nstatic void List_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list);\nstatic void List_ItemPrintFunc(u8 windowId, u32 itemId, u8 y);\nstatic void PrintDescription(s32 itemIndex);\nstatic void PrintMoveInfo(u16 itemId);\nstatic void PrintListCursorAtRow(u8 y, u8 colorIdx);\nstatic void CreateListScrollArrows(void);\nstatic void TMCaseSetup_GetTMCount(void);\nstatic void TMCaseSetup_InitListMenuPositions(void);\nstatic void TMCaseSetup_UpdateVisualMenuOffset(void);\nstatic void Task_FadeOutAndCloseTMCase(u8 taskId);\nstatic void Task_HandleListInput(u8 taskId);\nstatic void Task_SelectedTMHM_Field(u8 taskId);\nstatic void Task_ContextMenu_HandleInput(u8 taskId);\nstatic void Action_Use(u8 taskId);\nstatic void Action_Give(u8 taskId);\nstatic void PrintError_ThereIsNoPokemon(u8 taskId);\nstatic void PrintError_ItemCantBeHeld(u8 taskId);\nstatic void Task_WaitButtonAfterErrorPrint(u8 taskId);\nstatic void CloseMessageAndReturnToList(u8 taskId);\nstatic void Action_Exit(u8 taskId);\nstatic void Task_SelectedTMHM_GiveParty(u8 taskId);\nstatic void Task_SelectedTMHM_GivePC(u8 taskId);\nstatic void Task_SelectedTMHM_Sell(u8 taskId);\nstatic void Task_AskConfirmSaleWithAmount(u8 taskId);\nstatic void Task_PlaceYesNoBox(u8 taskId);\nstatic void Task_SaleOfTMsCanceled(u8 taskId);\nstatic void Task_InitQuantitySelectUI(u8 taskId);\nstatic void SellTM_PrintQuantityAndSalePrice(s16 quantity, s32 value);\nstatic void Task_QuantitySelect_HandleInput(u8 taskId);\nstatic void Task_PrintSaleConfirmedText(u8 taskId);\nstatic void Task_DoSaleOfTMs(u8 taskId);\nstatic void Task_AfterSale_ReturnToList(u8 taskId);\nstatic void Task_Pokedude_Start(u8 taskId);\nstatic void Task_Pokedude_Run(u8 taskId);\nstatic void InitWindowTemplatesAndPals(void);\nstatic void TMCase_Print(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx);\nstatic void TMCase_SetWindowBorder1(u8 windowId);\nstatic void TMCase_SetWindowBorder2(u8 windowId);\nstatic void PrintMessageWithFollowupTask(u8 taskId, u8 fontId, const u8 * str, TaskFunc func);\nstatic void PrintTitle(void);\nstatic void DrawMoveInfoLabels(void);\nstatic void PlaceHMTileInWindow(u8 windowId, u8 x, u8 y);\nstatic void PrintPlayersMoney(void);\nstatic void HandleCreateYesNoMenu(u8 taskId, const struct YesNoFuncTable * ptrs);\nstatic u8 AddContextMenu(u8 * windowId, u8 windowIndex);\nstatic void RemoveContextMenu(u8 * windowId);\nstatic u8 CreateDiscSprite(u16 itemId);\nstatic void SetDiscSpriteAnim(struct Sprite *sprite, u8 tmIdx);\nstatic void TintDiscpriteByType(u8 type);\nstatic void SetDiscSpritePosition(struct Sprite *sprite, u8 tmIdx);\nstatic void SwapDisc(u8 spriteId, u16 itemId);\nstatic void SpriteCB_SwapDisc(struct Sprite *sprite);\nstatic void LoadDiscTypePalettes(void);\nstatic void ClearTMHMSlots(void);\n\nstatic const struct BgTemplate sBGTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000\n    }\n};\n\n// The list of functions to run when a TM/HM is selected.\n// What happens when one is selected depends on how the player arrived at the TM case\nstatic void (*const sSelectTMActionTasks[])(u8 taskId) = {\n    [TMCASE_FIELD]      = Task_SelectedTMHM_Field,\n    [TMCASE_GIVE_PARTY] = Task_SelectedTMHM_GiveParty,\n    [TMCASE_SELL]       = Task_SelectedTMHM_Sell,\n    [TMCASE_GIVE_PC]    = Task_SelectedTMHM_GivePC\n};\n\nstatic const struct MenuAction sMenuActions[] = {\n    [ACTION_USE]  = {gOtherText_Use,  Action_Use },\n    [ACTION_EXIT] = {gOtherText_Exit, Action_Exit},\n};\n\nstatic const u8 sMenuActionIndices_Field[] = {ACTION_USE, ACTION_EXIT};\nstatic const u8 sMenuActionIndices_UnionRoom[] = {ACTION_EXIT};\n\nstatic const struct YesNoFuncTable sYesNoFuncTable = {Task_PrintSaleConfirmedText, Task_SaleOfTMsCanceled};\n\nstatic const u8 sText_ClearTo18[] = _(\"{CLEAR_TO 18}\");\nstatic const u8 sText_SingleSpace[] = _(\" \");\n\nstatic ALIGNED(4) const u16 sPal3Override[] = {RGB(8, 8, 8), RGB(30, 16, 6)};\n\nstatic const u8 sTextColors[][3] = {\n    [COLOR_LIGHT] = {0, 1, 2},\n    [COLOR_DARK] = {0, 2, 3},\n    [COLOR_CURSOR_SELECTED] = {0, 3, 6},\n    [COLOR_MOVE_INFO] = {0, 14, 10},\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    [WIN_LIST] = {\n        .bg = 0,\n        .tilemapLeft = 10,\n        .tilemapTop = 1,\n        .width = 19,\n        .height = 10,\n        .paletteNum = 15,\n        .baseBlock = 0x081\n    },\n    [WIN_DESCRIPTION] = {\n        .bg = 0,\n        .tilemapLeft = 12,\n        .tilemapTop = 12,\n        .width = 18,\n        .height = 8,\n        .paletteNum = 10,\n        .baseBlock = 0x13f\n    },\n    [WIN_SELECTED_MSG] = {\n        .bg = 1,\n        .tilemapLeft = 5,\n        .tilemapTop = 15,\n        .width = 15,\n        .height = 4,\n        .paletteNum = 13,\n        .baseBlock = 0x1f9\n    },\n    [WIN_TITLE] = {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 1,\n        .width = 10,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x235\n    },\n    [WIN_MOVE_INFO_LABELS] = {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 13,\n        .width = 5,\n        .height = 6,\n        .paletteNum = 12,\n        .baseBlock = 0x249\n    },\n    [WIN_MOVE_INFO] = {\n        .bg = 0,\n        .tilemapLeft = 7,\n        .tilemapTop = 13,\n        .width = 5,\n        .height = 6,\n        .paletteNum = 12,\n        .baseBlock = 0x267\n    },\n    [WIN_MESSAGE] = {\n        .bg = 1,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 11,\n        .baseBlock = 0x285\n    },\n    [WIN_SELL_QUANTITY] = {\n        .bg = 1,\n        .tilemapLeft = 17,\n        .tilemapTop = 9,\n        .width = 12,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x2ed\n    },\n    [WIN_MONEY] = {\n        .bg = 1,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 8,\n        .height = 3,\n        .paletteNum = 13,\n        .baseBlock = 0x31d\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sYesNoWindowTemplate = {\n    .bg = 1,\n    .tilemapLeft = 21,\n    .tilemapTop = 9,\n    .width = 6,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x335\n};\n\nstatic const struct WindowTemplate sWindowTemplates_ContextMenu[] = {\n    [WIN_USE_GIVE_EXIT] = {\n        .bg = 1,\n        .tilemapLeft = 22,\n        .tilemapTop = 15,\n        .width = 7,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x1cf\n    },\n    [WIN_GIVE_EXIT] = {\n        .bg = 1,\n        .tilemapLeft = 22,\n        .tilemapTop = 17,\n        .width = 7,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x1cf\n    },\n};\n\nstatic const struct OamData sTMSpriteOamData = {\n    .size = 2,\n    .priority = 2\n};\n\nstatic const union AnimCmd sAnim_TM[] = {\n    ANIMCMD_FRAME(0, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_HM[] = {\n    ANIMCMD_FRAME(16, 0),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_Disc[] = {\n    [ANIM_TM] = sAnim_TM,\n    [ANIM_HM] = sAnim_HM\n};\n\nstatic const struct CompressedSpriteSheet sSpriteSheet_Disc = {\n    .data = gTMCaseDisc_Gfx,\n    .size = 0x400,\n    .tag = TAG_DISC\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Disc = {\n    .tileTag = TAG_DISC,\n    .paletteTag = TAG_DISC,\n    .oam = &sTMSpriteOamData,\n    .anims = sAnims_Disc,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const u16 sTMSpritePaletteOffsetByType[NUMBER_OF_MON_TYPES] = {\n    [TYPE_NORMAL]   = 0x000,\n    [TYPE_FIRE]     = 0x010,\n    [TYPE_WATER]    = 0x020,\n    [TYPE_GRASS]    = 0x030,\n    [TYPE_ELECTRIC] = 0x040,\n    [TYPE_ROCK]     = 0x050,\n    [TYPE_GROUND]   = 0x060,\n    [TYPE_ICE]      = 0x070,\n    [TYPE_FLYING]   = 0x080,\n    [TYPE_FIGHTING] = 0x090,\n    [TYPE_GHOST]    = 0x0a0,\n    [TYPE_BUG]      = 0x0b0,\n    [TYPE_POISON]   = 0x0c0,\n    [TYPE_PSYCHIC]  = 0x0d0,\n    [TYPE_STEEL]    = 0x0e0,\n    [TYPE_DARK]     = 0x0f0,\n    [TYPE_DRAGON]   = 0x100\n};\n\nvoid InitTMCase(u8 type, void (* exitCallback)(void), bool8 allowSelectClose)\n{\n    ResetBufferPointers_NoFree();\n    sTMCaseDynamicResources = Alloc(sizeof(*sTMCaseDynamicResources));\n    sTMCaseDynamicResources->nextScreenCallback = NULL;\n    sTMCaseDynamicResources->scrollArrowsTaskId = TASK_NONE;\n    sTMCaseDynamicResources->contextMenuWindowId = WINDOW_NONE;\n    if (type != TMCASE_REOPENING)\n        sTMCaseStaticResources.menuType = type;\n    if (exitCallback != NULL)\n        sTMCaseStaticResources.exitCallback = exitCallback;\n    if (allowSelectClose != TMCASE_KEEP_PREV)\n        sTMCaseStaticResources.allowSelectClose = allowSelectClose;\n    gTextFlags.autoScroll = FALSE;\n    SetMainCallback2(CB2_SetUpTMCaseUI_Blocking);\n}\n\nstatic void CB2_Idle(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    DoScheduledBgTilemapCopiesToVram();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB_Idle(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void CB2_SetUpTMCaseUI_Blocking(void)\n{\n    while (1)\n    {\n        if (IsActiveOverworldLinkBusy() == TRUE)\n            break;\n        if (DoSetUpTMCaseUI() == TRUE)\n            break;\n        if (MenuHelpers_IsLinkActive() == TRUE)\n            break;\n    }\n}\n\n#define tListTaskId       data[0]\n#define tSelection        data[1]\n#define tQuantityOwned    data[2]\n#define tQuantitySelected data[8]\n\n#define tPokedudeState data[8] // Re-used\n#define tPokedudeTimer data[9]\n\nstatic bool8 DoSetUpTMCaseUI(void)\n{\n    u8 taskId;\n\n    switch (gMain.state)\n    {\n    case 0:\n        SetVBlankHBlankCallbacksToNull();\n        ClearScheduledBgCopiesToVram();\n        gMain.state++;\n        break;\n    case 1:\n        ScanlineEffect_Stop();\n        gMain.state++;\n        break;\n    case 2:\n        FreeAllSpritePalettes();\n        gMain.state++;\n        break;\n    case 3:\n        ResetPaletteFade();\n        gMain.state++;\n        break;\n    case 4:\n        ResetSpriteData();\n        gMain.state++;\n        break;\n    case 5:\n        ResetTasks();\n        gMain.state++;\n        break;\n    case 6:\n        LoadBGTemplates();\n        sTMCaseDynamicResources->seqId = 0;\n        gMain.state++;\n        break;\n    case 7:\n        InitWindowTemplatesAndPals();\n        gMain.state++;\n        break;\n    case 8:\n        if (HandleLoadTMCaseGraphicsAndPalettes())\n            gMain.state++;\n        break;\n    case 9:\n        SortPocketAndPlaceHMsFirst(&gBagPockets[POCKET_TM_CASE - 1]);\n        gMain.state++;\n        break;\n    case 10:\n        TMCaseSetup_GetTMCount();\n        TMCaseSetup_InitListMenuPositions();\n        TMCaseSetup_UpdateVisualMenuOffset();\n        gMain.state++;\n        break;\n    case 11:\n        DrawMoveInfoLabels();\n        gMain.state++;\n        break;\n    case 12:\n        CreateTMCaseListMenuBuffers();\n        InitTMCaseListMenuItems();\n        gMain.state++;\n        break;\n    case 13:\n        PrintTitle();\n        gMain.state++;\n        break;\n    case 14:\n        if (sTMCaseStaticResources.menuType == TMCASE_POKEDUDE)\n            taskId = CreateTask(Task_Pokedude_Start, 0);\n        else\n            taskId = CreateTask(Task_HandleListInput, 0);\n        gTasks[taskId].tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, sTMCaseStaticResources.scrollOffset, sTMCaseStaticResources.selectedRow);\n        gMain.state++;\n        break;\n    case 15:\n        CreateListScrollArrows();\n        gMain.state++;\n        break;\n    case 16:\n        sTMCaseDynamicResources->discSpriteId = CreateDiscSprite(BagGetItemIdByPocketPosition(POCKET_TM_CASE, sTMCaseStaticResources.scrollOffset + sTMCaseStaticResources.selectedRow));\n        gMain.state++;\n        break;\n    case 17:\n        BlendPalettes(PALETTES_ALL, 16, 0);\n        gMain.state++;\n        break;\n    case 18:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        gMain.state++;\n        break;\n    default:\n        SetVBlankCallback(VBlankCB_Idle);\n        SetMainCallback2(CB2_Idle);\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic void ResetBufferPointers_NoFree(void)\n{\n    sTMCaseDynamicResources = NULL;\n    sTilemapBuffer = NULL;\n    sListMenuItemsBuffer = NULL;\n    sListMenuStringsBuffer = NULL;\n    sTMSpritePaletteBuffer = NULL;\n}\n\nstatic void LoadBGTemplates(void)\n{\n    void ** ptr;\n    ResetAllBgsCoordinatesAndBgCntRegs();\n    ptr = &sTilemapBuffer;\n    *ptr = AllocZeroed(0x800);\n    ResetBgsAndClearDma3BusyFlags(0);\n    InitBgsFromTemplates(0, sBGTemplates, ARRAY_COUNT(sBGTemplates));\n    SetBgTilemapBuffer(2, *ptr);\n    ScheduleBgCopyTilemapToVram(1);\n    ScheduleBgCopyTilemapToVram(2);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n}\n\nstatic bool8 HandleLoadTMCaseGraphicsAndPalettes(void)\n{\n    switch (sTMCaseDynamicResources->seqId)\n    {\n    case 0:\n        ResetTempTileDataBuffers();\n        DecompressAndCopyTileDataToVram(1, gTMCase_Gfx, 0, 0, 0);\n        sTMCaseDynamicResources->seqId++;\n        break;\n    case 1:\n        if (FreeTempTileDataBuffersIfPossible() != TRUE)\n        {\n            LZDecompressWram(gTMCaseMenu_Tilemap, sTilemapBuffer);\n            sTMCaseDynamicResources->seqId++;\n        }\n        break;\n    case 2:\n        LZDecompressWram(gTMCase_Tilemap, GetBgTilemapBuffer(1));\n        sTMCaseDynamicResources->seqId++;\n        break;\n    case 3:\n        if (gSaveBlock2Ptr->playerGender == MALE)\n            LoadCompressedPalette(gTMCaseMenu_Male_Pal, BG_PLTT_ID(0), 4 * PLTT_SIZE_4BPP);\n        else\n            LoadCompressedPalette(gTMCaseMenu_Female_Pal, BG_PLTT_ID(0), 4 * PLTT_SIZE_4BPP);\n        sTMCaseDynamicResources->seqId++;\n        break;\n    case 4:\n        LoadCompressedSpriteSheet(&sSpriteSheet_Disc);\n        sTMCaseDynamicResources->seqId++;\n        break;\n    default:\n        LoadDiscTypePalettes();\n        sTMCaseDynamicResources->seqId = 0;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic void CreateTMCaseListMenuBuffers(void)\n{\n    struct BagPocket * pocket = &gBagPockets[POCKET_TM_CASE - 1];\n    sListMenuItemsBuffer = Alloc((pocket->capacity + 1) * sizeof(struct ListMenuItem));\n    sListMenuStringsBuffer = Alloc(sTMCaseDynamicResources->numTMs * 29);\n}\n\nstatic void InitTMCaseListMenuItems(void)\n{\n    struct BagPocket * pocket = &gBagPockets[POCKET_TM_CASE - 1];\n    u32 i;\n\n    for (i = 0; i < sTMCaseDynamicResources->numTMs; i++)\n    {\n        GetTMNumberAndMoveString(sListMenuStringsBuffer[i], pocket->itemSlots[i].itemId);\n        sListMenuItemsBuffer[i].label = sListMenuStringsBuffer[i];\n        sListMenuItemsBuffer[i].index = i;\n    }\n    sListMenuItemsBuffer[i].label = gText_Close;\n    sListMenuItemsBuffer[i].index = LIST_CANCEL;\n\n    gMultiuseListMenuTemplate.items = sListMenuItemsBuffer;\n    gMultiuseListMenuTemplate.totalItems = sTMCaseDynamicResources->numTMs + 1; // +1 for Cancel\n    gMultiuseListMenuTemplate.windowId = WIN_LIST;\n    gMultiuseListMenuTemplate.header_X = 0;\n    gMultiuseListMenuTemplate.item_X = 8;\n    gMultiuseListMenuTemplate.cursor_X = 0;\n    gMultiuseListMenuTemplate.lettersSpacing = 0;\n    gMultiuseListMenuTemplate.itemVerticalPadding = 2;\n    gMultiuseListMenuTemplate.upText_Y = 2;\n    gMultiuseListMenuTemplate.maxShowed = sTMCaseDynamicResources->maxTMsShown;\n    gMultiuseListMenuTemplate.fontId = FONT_NORMAL;\n    gMultiuseListMenuTemplate.cursorPal = 2;\n    gMultiuseListMenuTemplate.fillValue = 0;\n    gMultiuseListMenuTemplate.cursorShadowPal = 3;\n    gMultiuseListMenuTemplate.moveCursorFunc = List_MoveCursorFunc;\n    gMultiuseListMenuTemplate.itemPrintFunc = List_ItemPrintFunc;\n    gMultiuseListMenuTemplate.cursorKind = 0;\n    gMultiuseListMenuTemplate.scrollMultiple = LIST_MULTIPLE_SCROLL_DPAD;\n}\n\nstatic void GetTMNumberAndMoveString(u8 * dest, u16 itemId)\n{\n    StringCopy(gStringVar4, gText_FontSmall);\n    if (itemId >= ITEM_HM01)\n    {\n        StringAppend(gStringVar4, sText_ClearTo18);\n        StringAppend(gStringVar4, gText_NumberClear01);\n        ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_HM01 + 1, STR_CONV_MODE_LEADING_ZEROS, 1);\n        StringAppend(gStringVar4, gStringVar1);\n    }\n    else\n    {\n        StringAppend(gStringVar4, gText_NumberClear01);\n        ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_TM01 + 1, STR_CONV_MODE_LEADING_ZEROS, 2);\n        StringAppend(gStringVar4, gStringVar1);\n    }\n    StringAppend(gStringVar4, sText_SingleSpace);\n    StringAppend(gStringVar4, gText_FontNormal);\n    StringAppend(gStringVar4, gMoveNames[ItemIdToBattleMoveId(itemId)]);\n    StringCopy(dest, gStringVar4);\n}\n\nstatic void List_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)\n{\n    u16 itemId;\n\n    if (itemIndex == LIST_CANCEL)\n        itemId = ITEM_NONE;\n    else\n        itemId = BagGetItemIdByPocketPosition(POCKET_TM_CASE, itemIndex);\n\n    if (onInit != TRUE)\n    {\n        PlaySE(SE_SELECT);\n        SwapDisc(sTMCaseDynamicResources->discSpriteId, itemId);\n    }\n    PrintDescription(itemIndex);\n    PrintMoveInfo(itemId);\n}\n\nstatic void List_ItemPrintFunc(u8 windowId, u32 itemIndex, u8 y)\n{\n    if (itemIndex != LIST_CANCEL)\n    {\n        if (BagGetItemIdByPocketPosition(POCKET_TM_CASE, itemIndex) >= ITEM_HM01)\n        {\n            PlaceHMTileInWindow(windowId, 8, y);\n        }\n    }\n}\n\nstatic void PrintDescription(s32 itemIndex)\n{\n    const u8 * str;\n    if (itemIndex != LIST_CANCEL)\n        str = ItemId_GetDescription(BagGetItemIdByPocketPosition(POCKET_TM_CASE, itemIndex));\n    else\n        str = gText_TMCaseWillBePutAway;\n    FillWindowPixelBuffer(WIN_DESCRIPTION, 0);\n    TMCase_Print(WIN_DESCRIPTION, FONT_NORMAL, str, 2, 3, 1, 0, 0, COLOR_LIGHT);\n}\n\n// Darkens (or subsequently lightens) the blue bg tiles around the description window when a TM/HM is selected.\n// shade=0: lighten, shade=1: darken\nstatic void SetDescriptionWindowShade(s32 shade)\n{\n    SetBgTilemapPalette(2, 0, 12, 30, 8, 2 * shade + 1);\n    ScheduleBgCopyTilemapToVram(2);\n}\n\nstatic void PrintListCursor(u8 listTaskId, u8 colorIdx)\n{\n    PrintListCursorAtRow(ListMenuGetYCoordForPrintingArrowCursor(listTaskId), colorIdx);\n}\n\nstatic void PrintListCursorAtRow(u8 y, u8 colorIdx)\n{\n    if (colorIdx == COLOR_CURSOR_ERASE)\n    {\n        // Never used. Would erase cursor (but also a portion of the list text)\n        FillWindowPixelRect(WIN_LIST, 0, 0, y, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_WIDTH), GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT));\n        CopyWindowToVram(WIN_LIST, COPYWIN_GFX);\n    }\n    else\n    {\n        TMCase_Print(WIN_LIST, FONT_NORMAL, gText_SelectorArrow2, 0, y, 0, 0, 0, colorIdx);\n    }\n}\n\nstatic void CreateListScrollArrows(void)\n{\n    sTMCaseDynamicResources->scrollArrowsTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP,\n                                                                                           160, 8, 88,\n                                                                                           sTMCaseDynamicResources->numTMs - sTMCaseDynamicResources->maxTMsShown + 1,\n                                                                                           TAG_SCROLL_ARROW, TAG_SCROLL_ARROW,\n                                                                                           &sTMCaseStaticResources.scrollOffset);\n}\n\nstatic void CreateQuantityScrollArrows(void)\n{\n    sTMCaseDynamicResources->currItem = 1;\n    sTMCaseDynamicResources->scrollArrowsTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP,\n                                                                                           152, 72, 104,\n                                                                                           2,\n                                                                                           TAG_SCROLL_ARROW, TAG_SCROLL_ARROW,\n                                                                                           &sTMCaseDynamicResources->currItem);\n}\n\nstatic void RemoveScrollArrows(void)\n{\n    if (sTMCaseDynamicResources->scrollArrowsTaskId != TASK_NONE)\n    {\n        RemoveScrollIndicatorArrowPair(sTMCaseDynamicResources->scrollArrowsTaskId);\n        sTMCaseDynamicResources->scrollArrowsTaskId = TASK_NONE;\n    }\n}\n\nvoid ResetTMCaseCursorPos(void)\n{\n    sTMCaseStaticResources.selectedRow = 0;\n    sTMCaseStaticResources.scrollOffset = 0;\n}\n\nstatic void TMCaseSetup_GetTMCount(void)\n{\n    struct BagPocket * pocket = &gBagPockets[POCKET_TM_CASE - 1];\n    u32 i;\n\n    BagPocketCompaction(pocket->itemSlots, pocket->capacity);\n    sTMCaseDynamicResources->numTMs = 0;\n    for (i = 0; i < pocket->capacity; i++)\n    {\n        if (pocket->itemSlots[i].itemId == ITEM_NONE)\n            break;\n        sTMCaseDynamicResources->numTMs++;\n    }\n    sTMCaseDynamicResources->maxTMsShown = min(sTMCaseDynamicResources->numTMs + 1, 5);\n}\n\nstatic void TMCaseSetup_InitListMenuPositions(void)\n{\n    if (sTMCaseStaticResources.scrollOffset != 0)\n    {\n        if (sTMCaseStaticResources.scrollOffset + sTMCaseDynamicResources->maxTMsShown > sTMCaseDynamicResources->numTMs + 1)\n            sTMCaseStaticResources.scrollOffset = sTMCaseDynamicResources->numTMs + 1 - sTMCaseDynamicResources->maxTMsShown;\n    }\n    if (sTMCaseStaticResources.scrollOffset + sTMCaseStaticResources.selectedRow >= sTMCaseDynamicResources->numTMs + 1)\n    {\n        if (sTMCaseDynamicResources->numTMs + 1 < 2)\n            sTMCaseStaticResources.selectedRow = 0;\n        else\n            sTMCaseStaticResources.selectedRow = sTMCaseDynamicResources->numTMs;\n    }\n}\n\nstatic void TMCaseSetup_UpdateVisualMenuOffset(void)\n{\n    u32 i;\n    if (sTMCaseStaticResources.selectedRow > 3)\n    {\n        for (i = 0; i <= sTMCaseStaticResources.selectedRow - 3 && sTMCaseStaticResources.scrollOffset + sTMCaseDynamicResources->maxTMsShown != sTMCaseDynamicResources->numTMs + 1; i++)\n        {\n            do {} while (0);\n            sTMCaseStaticResources.selectedRow--;\n            sTMCaseStaticResources.scrollOffset++;\n        }\n    }\n}\n\nstatic void DestroyTMCaseBuffers(void)\n{\n    if (sTMCaseDynamicResources != NULL)\n        Free(sTMCaseDynamicResources);\n    if (sTilemapBuffer != NULL)\n        Free(sTilemapBuffer);\n    if (sListMenuItemsBuffer != NULL)\n        Free(sListMenuItemsBuffer);\n    if (sListMenuStringsBuffer != NULL)\n        Free(sListMenuStringsBuffer);\n    if (sTMSpritePaletteBuffer != NULL)\n        Free(sTMSpritePaletteBuffer);\n    FreeAllWindowBuffers();\n}\n\nstatic void Task_BeginFadeOutFromTMCase(u8 taskId)\n{\n    BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK);\n    gTasks[taskId].func = Task_FadeOutAndCloseTMCase;\n}\n\nstatic void Task_FadeOutAndCloseTMCase(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (!gPaletteFade.active)\n    {\n        DestroyListMenuTask(tListTaskId, &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);\n        if (sTMCaseDynamicResources->nextScreenCallback != NULL)\n            SetMainCallback2(sTMCaseDynamicResources->nextScreenCallback);\n        else\n            SetMainCallback2(sTMCaseStaticResources.exitCallback);\n        RemoveScrollArrows();\n        DestroyTMCaseBuffers();\n        DestroyTask(taskId);\n    }\n}\n\nstatic void Task_HandleListInput(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    s32 input;\n\n    if (!gPaletteFade.active)\n    {\n        if (IsActiveOverworldLinkBusy() != TRUE)\n        {\n            input = ListMenu_ProcessInput(tListTaskId);\n            ListMenuGetScrollAndRow(tListTaskId, &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);\n            if (JOY_NEW(SELECT_BUTTON) && sTMCaseStaticResources.allowSelectClose == TRUE)\n            {\n                PlaySE(SE_SELECT);\n                gSpecialVar_ItemId = ITEM_NONE;\n                Task_BeginFadeOutFromTMCase(taskId);\n            }\n            else\n            {\n                switch (input)\n                {\n                case LIST_NOTHING_CHOSEN:\n                    break;\n                case LIST_CANCEL:\n                    PlaySE(SE_SELECT);\n                    gSpecialVar_ItemId = ITEM_NONE;\n                    Task_BeginFadeOutFromTMCase(taskId);\n                    break;\n                default:\n                    PlaySE(SE_SELECT);\n                    SetDescriptionWindowShade(1);\n                    RemoveScrollArrows();\n                    PrintListCursor(tListTaskId, COLOR_CURSOR_SELECTED);\n                    tSelection = input;\n                    tQuantityOwned = BagGetQuantityByPocketPosition(POCKET_TM_CASE, input);\n                    gSpecialVar_ItemId = BagGetItemIdByPocketPosition(POCKET_TM_CASE, input);\n                    gTasks[taskId].func = sSelectTMActionTasks[sTMCaseStaticResources.menuType];\n                    break;\n                }\n            }\n        }\n    }\n}\n\nstatic void ReturnToList(u8 taskId)\n{\n    SetDescriptionWindowShade(0);\n    CreateListScrollArrows();\n    gTasks[taskId].func = Task_HandleListInput;\n}\n\n// When a TM/HM in the list is selected in the field, create a context\n// menu with a list of actions that can be taken.\nstatic void Task_SelectedTMHM_Field(u8 taskId)\n{\n    u8 * strbuf;\n    \n    // Create context window\n    TMCase_SetWindowBorder2(WIN_SELECTED_MSG);\n    if (!MenuHelpers_IsLinkActive() && InUnionRoom() != TRUE)\n    {\n        // Regular TM/HM context menu\n        AddContextMenu(&sTMCaseDynamicResources->contextMenuWindowId, WIN_USE_GIVE_EXIT);\n        sTMCaseDynamicResources->menuActionIndices = sMenuActionIndices_Field;\n        sTMCaseDynamicResources->numMenuActions = ARRAY_COUNT(sMenuActionIndices_Field);\n    }\n    else\n    {\n        // In Union Room, \"Use\" is removed from the context menu\n        AddContextMenu(&sTMCaseDynamicResources->contextMenuWindowId, WIN_GIVE_EXIT);\n        sTMCaseDynamicResources->menuActionIndices = sMenuActionIndices_UnionRoom;\n        sTMCaseDynamicResources->numMenuActions = ARRAY_COUNT(sMenuActionIndices_UnionRoom);\n    }\n\n    // Print context window actions\n    AddItemMenuActionTextPrinters(sTMCaseDynamicResources->contextMenuWindowId,\n                                  FONT_NORMAL,\n                                  GetMenuCursorDimensionByFont(FONT_NORMAL, 0),\n                                  2,\n                                  0,\n                                  GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2,\n                                  sTMCaseDynamicResources->numMenuActions,\n                                  sMenuActions,\n                                  sTMCaseDynamicResources->menuActionIndices);\n\n    Menu_InitCursor(sTMCaseDynamicResources->contextMenuWindowId, FONT_NORMAL, 0, 2, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, sTMCaseDynamicResources->numMenuActions, 0);\n    \n    // Print label text next to the context window\n    strbuf = Alloc(256);\n    GetTMNumberAndMoveString(strbuf, gSpecialVar_ItemId);\n    StringAppend(strbuf, gText_Var1IsSelected + 2); // +2 skips over the stringvar\n    TMCase_Print(WIN_SELECTED_MSG, FONT_NORMAL, strbuf, 0, 2, 1, 0, 0, COLOR_DARK);\n    Free(strbuf);\n    if (IS_HM(gSpecialVar_ItemId) && gSpecialVar_ItemId > ITEM_TM50)\n    {\n        PlaceHMTileInWindow(WIN_SELECTED_MSG, 0, 2);\n        CopyWindowToVram(WIN_SELECTED_MSG, COPYWIN_GFX);\n    }\n\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(1);\n    gTasks[taskId].func = Task_ContextMenu_HandleInput;\n}\n\nstatic void Task_ContextMenu_HandleInput(u8 taskId)\n{\n    s8 input;\n\n    if (IsActiveOverworldLinkBusy() != TRUE)\n    {\n        input = Menu_ProcessInputNoWrapAround();\n        switch (input)\n        {\n        case MENU_B_PRESSED:\n            // Run last action in list (Exit)\n            PlaySE(SE_SELECT);\n            sMenuActions[sTMCaseDynamicResources->menuActionIndices[sTMCaseDynamicResources->numMenuActions - 1]].func.void_u8(taskId);\n            break;\n        case MENU_NOTHING_CHOSEN:\n            break;\n        default:\n            PlaySE(SE_SELECT);\n            sMenuActions[sTMCaseDynamicResources->menuActionIndices[input]].func.void_u8(taskId);\n            break;\n        }\n    }\n}\n\nstatic void Action_Use(u8 taskId)\n{\n    RemoveContextMenu(&sTMCaseDynamicResources->contextMenuWindowId);\n    ClearStdWindowAndFrameToTransparent(WIN_SELECTED_MSG, FALSE);\n    ClearWindowTilemap(WIN_SELECTED_MSG);\n    PutWindowTilemap(WIN_LIST);\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(1);\n    if (CalculatePlayerPartyCount() == 0)\n    {\n        PrintError_ThereIsNoPokemon(taskId);\n    }\n    else\n    {\n        // Chose a TM/HM to use, exit TM case for party menu\n        gItemUseCB = ItemUseCB_TMHM;\n        sTMCaseDynamicResources->nextScreenCallback = CB2_ShowPartyMenuForItemUse;\n        Task_BeginFadeOutFromTMCase(taskId);\n    }\n}\n\nstatic void Action_Give(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n    u16 itemId = BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection);\n    RemoveContextMenu(&sTMCaseDynamicResources->contextMenuWindowId);\n    ClearStdWindowAndFrameToTransparent(WIN_SELECTED_MSG, FALSE);\n    ClearWindowTilemap(WIN_SELECTED_MSG);\n    PutWindowTilemap(WIN_DESCRIPTION);\n    PutWindowTilemap(WIN_MOVE_INFO_LABELS);\n    PutWindowTilemap(WIN_MOVE_INFO);\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(1);\n    if (!IS_HM(itemId))\n    {\n        if (CalculatePlayerPartyCount() == 0)\n        {\n            PrintError_ThereIsNoPokemon(taskId);\n        }\n        else\n        {\n            sTMCaseDynamicResources->nextScreenCallback = CB2_ChooseMonToGiveItem;\n            Task_BeginFadeOutFromTMCase(taskId);\n        }\n    }\n    else\n    {\n        PrintError_ItemCantBeHeld(taskId);\n    }\n}\n\nstatic void PrintError_ThereIsNoPokemon(u8 taskId)\n{\n    PrintMessageWithFollowupTask(taskId, FONT_NORMAL, gText_ThereIsNoPokemon, Task_WaitButtonAfterErrorPrint);\n}\n\nstatic void PrintError_ItemCantBeHeld(u8 taskId)\n{\n    CopyItemName(gSpecialVar_ItemId, gStringVar1);\n    StringExpandPlaceholders(gStringVar4, gText_ItemCantBeHeld);\n    PrintMessageWithFollowupTask(taskId, FONT_NORMAL, gStringVar4, Task_WaitButtonAfterErrorPrint);\n}\n\nstatic void Task_WaitButtonAfterErrorPrint(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        CloseMessageAndReturnToList(taskId);\n    }\n}\n\nstatic void CloseMessageAndReturnToList(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    DestroyListMenuTask(tListTaskId, &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);\n    tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, sTMCaseStaticResources.scrollOffset, sTMCaseStaticResources.selectedRow);\n    PrintListCursor(tListTaskId, COLOR_DARK);\n    ClearDialogWindowAndFrameToTransparent(WIN_MESSAGE, FALSE);\n    ClearWindowTilemap(WIN_MESSAGE);\n    PutWindowTilemap(WIN_DESCRIPTION);\n    PutWindowTilemap(WIN_MOVE_INFO_LABELS);\n    PutWindowTilemap(WIN_MOVE_INFO);\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(1);\n    ReturnToList(taskId);\n}\n\nstatic void Action_Exit(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    RemoveContextMenu(&sTMCaseDynamicResources->contextMenuWindowId);\n    ClearStdWindowAndFrameToTransparent(WIN_SELECTED_MSG, FALSE);\n    ClearWindowTilemap(WIN_SELECTED_MSG);\n    PutWindowTilemap(WIN_LIST);\n    PrintListCursor(tListTaskId, COLOR_DARK);\n    PutWindowTilemap(WIN_DESCRIPTION);\n    PutWindowTilemap(WIN_MOVE_INFO_LABELS);\n    PutWindowTilemap(WIN_MOVE_INFO);\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(1);\n    ReturnToList(taskId);\n}\n\nstatic void Task_SelectedTMHM_GiveParty(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (!IS_HM(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection)))\n    {\n        sTMCaseDynamicResources->nextScreenCallback = CB2_GiveHoldItem;\n        Task_BeginFadeOutFromTMCase(taskId);\n    }\n    else\n    {\n        // Can't hold \"important\" items (e.g. key items)\n        PrintError_ItemCantBeHeld(taskId);\n    }\n}\n\nstatic void Task_SelectedTMHM_GivePC(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (!IS_HM(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection)))\n    {\n        sTMCaseDynamicResources->nextScreenCallback = CB2_ReturnToPokeStorage;\n        Task_BeginFadeOutFromTMCase(taskId);\n    }\n    else\n    {\n        // Can't hold \"important\" items (e.g. key items)\n        PrintError_ItemCantBeHeld(taskId);\n    }\n}\n\nstatic void Task_SelectedTMHM_Sell(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if ((ItemId_GetPrice(gSpecialVar_ItemId) == 0) || ItemId_GetPocket(gSpecialVar_ItemId) == POCKET_TM_CASE)\n    {\n        // Can't sell TM/HMs with no price (by default this is just the HMs)\n        CopyItemName(gSpecialVar_ItemId, gStringVar1);\n        StringExpandPlaceholders(gStringVar4, gText_OhNoICantBuyThat);\n        PrintMessageWithFollowupTask(taskId, GetDialogBoxFontId(), gStringVar4, CloseMessageAndReturnToList);\n    }\n    else\n    {\n        tQuantitySelected = 1;\n        if (tQuantityOwned == 1)\n        {\n            PrintPlayersMoney();\n            Task_AskConfirmSaleWithAmount(taskId);\n        }\n        else\n        {\n            if (tQuantityOwned > 99)\n                tQuantityOwned = 99;\n            CopyItemName(gSpecialVar_ItemId, gStringVar1);\n            StringExpandPlaceholders(gStringVar4, gText_HowManyWouldYouLikeToSell);\n            PrintMessageWithFollowupTask(taskId, GetDialogBoxFontId(), gStringVar4, Task_InitQuantitySelectUI);\n        }\n    }\n}\n\nstatic void Task_AskConfirmSaleWithAmount(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    ConvertIntToDecimalStringN(gStringVar3, ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection)) / 2 * tQuantitySelected, STR_CONV_MODE_LEFT_ALIGN, 6);\n    StringExpandPlaceholders(gStringVar4, gText_ICanPayThisMuch_WouldThatBeOkay);\n    PrintMessageWithFollowupTask(taskId, GetDialogBoxFontId(), gStringVar4, Task_PlaceYesNoBox);\n}\n\nstatic void Task_PlaceYesNoBox(u8 taskId)\n{\n    HandleCreateYesNoMenu(taskId, &sYesNoFuncTable);\n}\n\nstatic void Task_SaleOfTMsCanceled(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    ClearStdWindowAndFrameToTransparent(WIN_MONEY, FALSE);\n    ClearDialogWindowAndFrameToTransparent(WIN_MESSAGE, FALSE);\n    PutWindowTilemap(WIN_LIST);\n    PutWindowTilemap(WIN_DESCRIPTION);\n    PutWindowTilemap(WIN_TITLE);\n    PutWindowTilemap(WIN_MOVE_INFO_LABELS);\n    PutWindowTilemap(WIN_MOVE_INFO);\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(1);\n    PrintListCursor(tListTaskId, COLOR_DARK);\n    ReturnToList(taskId);\n}\n\nstatic void Task_InitQuantitySelectUI(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    TMCase_SetWindowBorder1(WIN_SELL_QUANTITY);\n    ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 2);\n    StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n    TMCase_Print(WIN_SELL_QUANTITY, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0, COLOR_DARK);\n    SellTM_PrintQuantityAndSalePrice(1, ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection)) / 2 * tQuantitySelected);\n    PrintPlayersMoney();\n    CreateQuantityScrollArrows();\n    ScheduleBgCopyTilemapToVram(0);\n    ScheduleBgCopyTilemapToVram(1);\n    gTasks[taskId].func = Task_QuantitySelect_HandleInput;\n}\n\nstatic void SellTM_PrintQuantityAndSalePrice(s16 quantity, s32 amount)\n{\n    FillWindowPixelBuffer(WIN_SELL_QUANTITY, 0x11);\n    ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_LEADING_ZEROS, 2);\n    StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);\n    TMCase_Print(WIN_SELL_QUANTITY, FONT_SMALL, gStringVar4, 4, 10, 1, 0, 0, COLOR_DARK);\n    PrintMoneyAmount(WIN_SELL_QUANTITY, 0x38, 0x0A, amount, 0);\n}\n\nstatic void Task_QuantitySelect_HandleInput(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (AdjustQuantityAccordingToDPadInput(&tQuantitySelected, tQuantityOwned) == 1)\n    {\n        SellTM_PrintQuantityAndSalePrice(tQuantitySelected, ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection)) / 2 * tQuantitySelected);\n    }\n    else if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        ClearStdWindowAndFrameToTransparent(WIN_SELL_QUANTITY, FALSE);\n        ScheduleBgCopyTilemapToVram(0);\n        ScheduleBgCopyTilemapToVram(1);\n        RemoveScrollArrows();\n        Task_AskConfirmSaleWithAmount(taskId);\n    }\n    else if (JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        ClearStdWindowAndFrameToTransparent(WIN_SELL_QUANTITY, FALSE);\n        ClearStdWindowAndFrameToTransparent(WIN_MONEY, FALSE);\n        ClearDialogWindowAndFrameToTransparent(WIN_MESSAGE, FALSE);\n        PutWindowTilemap(WIN_TITLE);\n        PutWindowTilemap(WIN_LIST);\n        PutWindowTilemap(WIN_DESCRIPTION);\n        ScheduleBgCopyTilemapToVram(0);\n        ScheduleBgCopyTilemapToVram(1);\n        RemoveScrollArrows();\n        PrintListCursor(tListTaskId, COLOR_DARK);\n        ReturnToList(taskId);\n    }\n}\n\nstatic void Task_PrintSaleConfirmedText(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    PutWindowTilemap(WIN_LIST);\n    ScheduleBgCopyTilemapToVram(0);\n    CopyItemName(gSpecialVar_ItemId, gStringVar1);\n    ConvertIntToDecimalStringN(gStringVar3, ItemId_GetPrice(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection)) / 2 * tQuantitySelected, STR_CONV_MODE_LEFT_ALIGN, 6);\n    StringExpandPlaceholders(gStringVar4, gText_TurnedOverItemsWorthYen);\n    PrintMessageWithFollowupTask(taskId, FONT_NORMAL, gStringVar4, Task_DoSaleOfTMs);\n}\n\nstatic void Task_DoSaleOfTMs(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    PlaySE(SE_SHOP);\n    RemoveBagItem(gSpecialVar_ItemId, tQuantitySelected);\n    AddMoney(&gSaveBlock1Ptr->money, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * tQuantitySelected);\n    RecordItemTransaction(gSpecialVar_ItemId, tQuantitySelected, QL_EVENT_SOLD_ITEM - QL_EVENT_USED_POKEMART);\n    DestroyListMenuTask(tListTaskId, &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);\n    TMCaseSetup_GetTMCount();\n    TMCaseSetup_InitListMenuPositions();\n    InitTMCaseListMenuItems();\n    tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, sTMCaseStaticResources.scrollOffset, sTMCaseStaticResources.selectedRow);\n    PrintListCursor(tListTaskId, COLOR_CURSOR_SELECTED);\n    PrintMoneyAmountInMoneyBox(WIN_MONEY, GetMoney(&gSaveBlock1Ptr->money), 0);\n    gTasks[taskId].func = Task_AfterSale_ReturnToList;\n}\n\nstatic void Task_AfterSale_ReturnToList(u8 taskId)\n{\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        ClearStdWindowAndFrameToTransparent(WIN_MONEY, FALSE);\n        ClearDialogWindowAndFrameToTransparent(WIN_MESSAGE, FALSE);\n        PutWindowTilemap(WIN_DESCRIPTION);\n        PutWindowTilemap(WIN_TITLE);\n        PutWindowTilemap(WIN_MOVE_INFO_LABELS);\n        PutWindowTilemap(WIN_MOVE_INFO);\n        CloseMessageAndReturnToList(taskId);\n    }\n}\n\nstatic void ClearTMHMSlots(void)\n{\n    u32 i;\n\n    for (i = 0; i < BAG_TMHM_COUNT; i++)\n    {\n        gTmHmItemSlots[i].itemId = 0;\n        SetBagItemQuantity(&(gTmHmItemSlots[i].quantity), 0);\n    }\n}\n\nvoid Pokedude_InitTMCase(void)\n{\n    FlagSet(FLAG_DONT_ADD_TMS);\n    sPokedudeBagBackup = AllocZeroed(sizeof(*sPokedudeBagBackup));\n    memcpy(sPokedudeBagBackup->bagPocket_TMHM, gTmHmItemSlots, sizeof(gTmHmItemSlots));\n    memcpy(sPokedudeBagBackup->bagPocket_KeyItems, gKeyItemSlots, sizeof(gKeyItemSlots));\n    sPokedudeBagBackup->selectedRow = sTMCaseStaticResources.selectedRow;\n    sPokedudeBagBackup->scrollOffset = sTMCaseStaticResources.scrollOffset;\n    ClearTMHMSlots();\n    ClearItemSlots(gKeyItemSlots, BAG_KEYITEMS_COUNT);\n    ResetTMCaseCursorPos();\n    AddBagItem(ITEM_TM01, 1);\n    AddBagItem(ITEM_TM03, 1);\n    AddBagItem(ITEM_TM09, 1);\n    AddBagItem(ITEM_TM35, 1);\n    FlagClear(FLAG_DONT_ADD_TMS);\n    InitTMCase(TMCASE_POKEDUDE, CB2_ReturnToTeachyTV, 0);\n}\n\nstatic void Task_Pokedude_Start(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (!gPaletteFade.active)\n    {\n        tPokedudeState = 0;\n        tPokedudeTimer = 0;\n        gTasks[taskId].func = Task_Pokedude_Run;\n    }\n}\n\n#define POKEDUDE_INPUT_DELAY 101\n\nstatic void Task_Pokedude_Run(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (JOY_NEW(B_BUTTON))\n    {\n        if (tPokedudeState < 21)\n        {\n            tPokedudeState = 21;\n            SetTeachyTvControllerModeToResume();\n        }\n    }\n\n    switch (tPokedudeState)\n    {\n    case 0:\n        BeginNormalPaletteFade(0xFFFF8405, 4, 0, 6, 0);\n        SetDescriptionWindowShade(1);\n        tPokedudeState++;\n        break;\n    case 1:\n    case 11:\n        if (!gPaletteFade.active)\n        {\n            if (++tPokedudeTimer > POKEDUDE_INPUT_DELAY)\n            {\n                tPokedudeTimer = 0;\n                tPokedudeState++;\n            }\n        }\n        break;\n    case 2:\n    case 3:\n    case 4:\n    case 12:\n    case 13:\n    case 14:\n        if (tPokedudeTimer == 0)\n        {\n            gMain.newKeys = 0;\n            gMain.newAndRepeatedKeys = DPAD_DOWN;\n            ListMenu_ProcessInput(tListTaskId);\n        }\n        if (++tPokedudeTimer > POKEDUDE_INPUT_DELAY)\n        {\n            tPokedudeTimer = 0;\n            tPokedudeState++;\n        }\n        break;\n    case 5:\n    case 6:\n    case 7:\n    case 15:\n    case 16:\n    case 17:\n        if (tPokedudeTimer == 0)\n        {\n            gMain.newKeys = 0;\n            gMain.newAndRepeatedKeys = DPAD_UP;\n            ListMenu_ProcessInput(tListTaskId);\n        }\n        if (++tPokedudeTimer > POKEDUDE_INPUT_DELAY)\n        {\n            tPokedudeTimer = 0;\n            tPokedudeState++;\n        }\n        break;\n    case 8:\n        SetDescriptionWindowShade(1);\n        PrintMessageWithFollowupTask(taskId, FONT_MALE, gPokedudeText_TMTypes, NULL);\n        gTasks[taskId].func = Task_Pokedude_Run;\n        tPokedudeState++;\n        break;\n    case 9:\n    case 19:\n        RunTextPrinters();\n        if (!IsTextPrinterActive(WIN_MESSAGE))\n            tPokedudeState++;\n        break;\n    case 10:\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n        {\n            SetDescriptionWindowShade(0);\n            BeginNormalPaletteFade(0x00000400, 0, 6, 0, 0);\n            ClearDialogWindowAndFrameToTransparent(WIN_MESSAGE, FALSE);\n            ScheduleBgCopyTilemapToVram(1);\n            tPokedudeState++;\n        }\n        break;\n    case 18:\n        SetDescriptionWindowShade(1);\n        PrintMessageWithFollowupTask(taskId, FONT_MALE, gPokedudeText_ReadTMDescription, NULL);\n        gTasks[taskId].func = Task_Pokedude_Run; // this function\n        tPokedudeState++;\n        break;\n    case 20:\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n            tPokedudeState++;\n        break;\n    case 21:\n        if (!gPaletteFade.active)\n        {\n            // Restore the player's bag\n            memcpy(gTmHmItemSlots, sPokedudeBagBackup->bagPocket_TMHM, sizeof(gTmHmItemSlots));\n            memcpy(gKeyItemSlots, sPokedudeBagBackup->bagPocket_KeyItems, sizeof(gKeyItemSlots));\n            DestroyListMenuTask(tListTaskId, NULL, NULL);\n            sTMCaseStaticResources.selectedRow = sPokedudeBagBackup->selectedRow;\n            sTMCaseStaticResources.scrollOffset = sPokedudeBagBackup->scrollOffset;\n            Free(sPokedudeBagBackup);\n            CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE);\n            CB2_SetUpReshowBattleScreenAfterMenu();\n            BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, 0);\n            tPokedudeState++;\n        }\n        break;\n    default:\n        if (!gPaletteFade.active)\n        {\n            SetMainCallback2(sTMCaseStaticResources.exitCallback);\n            RemoveScrollArrows();\n            DestroyTMCaseBuffers();\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void InitWindowTemplatesAndPals(void)\n{\n    u32 i;\n\n    InitWindows(sWindowTemplates);\n    DeactivateAllTextPrinters();\n    LoadUserWindowGfx(0, 0x5B, BG_PLTT_ID(14));\n    LoadMenuMessageWindowGfx(0, 0x64, BG_PLTT_ID(11));\n    LoadStdWindowGfx(0, 0x78, BG_PLTT_ID(13));\n    LoadPalette(gStandardMenuPalette, BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n    LoadPalette(gStandardMenuPalette, BG_PLTT_ID(10), PLTT_SIZE_4BPP);\n    LoadPalette(sPal3Override, BG_PLTT_ID(15) + 6, sizeof(sPal3Override));\n    LoadPalette(sPal3Override, BG_PLTT_ID(13) + 6, sizeof(sPal3Override));\n    ListMenuLoadStdPalAt(BG_PLTT_ID(12), 1);\n    for (i = 0; i < ARRAY_COUNT(sWindowTemplates) - 1; i++)\n        FillWindowPixelBuffer(i, 0x00);\n    PutWindowTilemap(WIN_LIST);\n    PutWindowTilemap(WIN_DESCRIPTION);\n    PutWindowTilemap(WIN_TITLE);\n    PutWindowTilemap(WIN_MOVE_INFO_LABELS);\n    PutWindowTilemap(WIN_MOVE_INFO);\n    ScheduleBgCopyTilemapToVram(0);\n}\n\nstatic void TMCase_Print(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx)\n{\n    AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, sTextColors[colorIdx], speed, str);\n}\n\nstatic void TMCase_SetWindowBorder1(u8 windowId)\n{\n    DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, 0x5B, 14);\n}\n\nstatic void TMCase_SetWindowBorder2(u8 windowId)\n{\n    DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, 0x78, 13);\n}\n\nstatic void PrintMessageWithFollowupTask(u8 taskId, u8 fontId, const u8 * str, TaskFunc func)\n{\n    DisplayMessageAndContinueTask(taskId, WIN_MESSAGE, 0x64, 0x0B, fontId, GetTextSpeedSetting(), str, func);\n    ScheduleBgCopyTilemapToVram(1);\n}\n\nstatic void PrintTitle(void)\n{\n    u32 distance = 72 - GetStringWidth(FONT_NORMAL_COPY_1, gText_TMCase, 0);\n    AddTextPrinterParameterized3(WIN_TITLE, FONT_NORMAL_COPY_1, distance / 2, 1, sTextColors[COLOR_LIGHT], 0, gText_TMCase);\n}\n\nstatic void DrawMoveInfoLabels(void)\n{\n    BlitMenuInfoIcon(WIN_MOVE_INFO_LABELS, MENU_INFO_ICON_TYPE, 0, 0);\n    BlitMenuInfoIcon(WIN_MOVE_INFO_LABELS, MENU_INFO_ICON_POWER, 0, 12);\n    BlitMenuInfoIcon(WIN_MOVE_INFO_LABELS, MENU_INFO_ICON_ACCURACY, 0, 24);\n    BlitMenuInfoIcon(WIN_MOVE_INFO_LABELS, MENU_INFO_ICON_PP, 0, 36);\n    CopyWindowToVram(WIN_MOVE_INFO_LABELS, COPYWIN_GFX);\n}\n\nstatic void PrintMoveInfo(u16 itemId)\n{\n    u32 i;\n    u16 move;\n    const u8 * str;\n\n    FillWindowPixelRect(WIN_MOVE_INFO, 0, 0, 0, 40, 48);\n    if (itemId == ITEM_NONE)\n    {\n        for (i = 0; i < 4; i++)\n            TMCase_Print(WIN_MOVE_INFO, FONT_NORMAL_COPY_2, gText_ThreeHyphens, 7, 12 * i, 0, 0, TEXT_SKIP_DRAW, COLOR_MOVE_INFO);\n        CopyWindowToVram(WIN_MOVE_INFO, COPYWIN_GFX);\n    }\n    else\n    {\n        // Draw type icon\n        move = ItemIdToBattleMoveId(itemId);\n        BlitMenuInfoIcon(WIN_MOVE_INFO, gBattleMoves[move].type + 1, 0, 0);\n\n        // Print power\n        if (gBattleMoves[move].power < 2)\n            str = gText_ThreeHyphens;\n        else\n        {\n            ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].power, STR_CONV_MODE_RIGHT_ALIGN, 3);\n            str = gStringVar1;\n        }\n        TMCase_Print(WIN_MOVE_INFO, FONT_NORMAL_COPY_2, str, 7, 12, 0, 0, TEXT_SKIP_DRAW, COLOR_MOVE_INFO);\n\n        // Print accuracy\n        if (gBattleMoves[move].accuracy == 0)\n            str = gText_ThreeHyphens;\n        else\n        {\n            ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3);\n            str = gStringVar1;\n        }\n        TMCase_Print(WIN_MOVE_INFO, FONT_NORMAL_COPY_2, str, 7, 24, 0, 0, TEXT_SKIP_DRAW, COLOR_MOVE_INFO);\n\n        // Print PP\n        ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].pp, STR_CONV_MODE_RIGHT_ALIGN, 3);\n        TMCase_Print(WIN_MOVE_INFO, FONT_NORMAL_COPY_2, gStringVar1, 7, 36, 0, 0, TEXT_SKIP_DRAW, COLOR_MOVE_INFO);\n\n        CopyWindowToVram(WIN_MOVE_INFO, COPYWIN_GFX);\n    }\n}\n\nstatic void PlaceHMTileInWindow(u8 windowId, u8 x, u8 y)\n{\n    BlitBitmapToWindow(windowId, gTMCaseHM_Gfx, x, y, 16, 12);\n}\n\nstatic void PrintPlayersMoney(void)\n{\n    PrintMoneyAmountInMoneyBoxWithBorder(WIN_MONEY, 120, 13, GetMoney(&gSaveBlock1Ptr->money));\n}\n\nstatic void HandleCreateYesNoMenu(u8 taskId, const struct YesNoFuncTable *ptrs)\n{\n    CreateYesNoMenuWithCallbacks(taskId, &sYesNoWindowTemplate, FONT_NORMAL, 0, 2, 91, 14, ptrs);\n}\n\nstatic u8 AddContextMenu(u8 * windowId, u8 windowIndex)\n{\n    if (*windowId == WINDOW_NONE)\n    {\n        *windowId = AddWindow(&sWindowTemplates_ContextMenu[windowIndex]);\n        TMCase_SetWindowBorder1(*windowId);\n        ScheduleBgCopyTilemapToVram(0);\n    }\n    return *windowId;\n}\n\nstatic void RemoveContextMenu(u8 * windowId)\n{\n    ClearStdWindowAndFrameToTransparent(*windowId, FALSE);\n    ClearWindowTilemap(*windowId);\n    RemoveWindow(*windowId);\n    ScheduleBgCopyTilemapToVram(0);\n    *windowId = WINDOW_NONE;\n}\n\nstatic u8 CreateDiscSprite(u16 itemId)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_Disc, DISC_BASE_X, DISC_BASE_Y, 0);\n    u8 tmIdx;\n    if (itemId == ITEM_NONE)\n    {\n        SetDiscSpritePosition(&gSprites[spriteId], DISC_HIDDEN);\n        return spriteId;\n    }\n    else\n    {\n        tmIdx = itemId - ITEM_TM01;\n        SetDiscSpriteAnim(&gSprites[spriteId], tmIdx);\n        TintDiscpriteByType(gBattleMoves[ItemIdToBattleMoveId(itemId)].type);\n        SetDiscSpritePosition(&gSprites[spriteId], tmIdx);\n        return spriteId;\n    }\n}\n\nstatic void SetDiscSpriteAnim(struct Sprite *sprite, u8 tmIdx)\n{\n    if (tmIdx >= NUM_TECHNICAL_MACHINES)\n        StartSpriteAnim(sprite, ANIM_HM);\n    else\n        StartSpriteAnim(sprite, ANIM_TM);\n}\n\nstatic void TintDiscpriteByType(u8 type)\n{\n    u8 palOffset = PLTT_ID(IndexOfSpritePaletteTag(TAG_DISC));\n    LoadPalette(sTMSpritePaletteBuffer + sTMSpritePaletteOffsetByType[type], OBJ_PLTT_OFFSET + palOffset, PLTT_SIZE_4BPP);\n    if (sTMCaseStaticResources.menuType == TMCASE_POKEDUDE)\n        BlendPalettes(1 << (16 + palOffset), 4, RGB_BLACK);\n}\n\nstatic void SetDiscSpritePosition(struct Sprite *sprite, u8 tmIdx)\n{\n    s32 x, y;\n    if (tmIdx == DISC_HIDDEN)\n    {\n        x = 27;\n        y = 54;\n        sprite->y2 = DISC_CASE_DISTANCE;\n    }\n    else\n    {\n        if (tmIdx >= NUM_TECHNICAL_MACHINES)\n            tmIdx -= NUM_TECHNICAL_MACHINES;\n        else\n            tmIdx += NUM_HIDDEN_MACHINES;\n\n        x = DISC_BASE_X - Q_24_8_TO_INT(Q_24_8(14 * tmIdx) / (NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES));\n        y = DISC_BASE_Y + Q_24_8_TO_INT(Q_24_8(8 * tmIdx) / (NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES));\n    }\n    sprite->x = x;\n    sprite->y = y;\n}\n\n#define sItemId  data[0]\n#define sState   data[1]\n\nstatic void SwapDisc(u8 spriteId, u16 itemId)\n{\n    gSprites[spriteId].sItemId = itemId;\n    gSprites[spriteId].sState = 0;\n    gSprites[spriteId].callback = SpriteCB_SwapDisc;\n}\n\nstatic void SpriteCB_SwapDisc(struct Sprite *sprite)\n{\n    switch (sprite->sState)\n    {\n    case 0:\n        // Lower old disc back into case\n        if (sprite->y2 >= DISC_CASE_DISTANCE)\n        {\n            // Old disc is hidden, set up new disc\n            if (sprite->sItemId != ITEM_NONE)\n            {\n                sprite->sState++;\n                TintDiscpriteByType(gBattleMoves[ItemIdToBattleMoveId(sprite->sItemId)].type);\n                sprite->sItemId -= ITEM_TM01;\n                SetDiscSpriteAnim(sprite, sprite->sItemId);\n                SetDiscSpritePosition(sprite, sprite->sItemId);\n            }\n            else\n                sprite->callback = SpriteCallbackDummy;\n        }\n        else\n        {\n            sprite->y2 += DISC_Y_MOVE;\n        }\n        break;\n    case 1:\n        // Raise new disc out of case\n        if (sprite->y2 <= 0)\n            sprite->callback = SpriteCallbackDummy;\n        else\n            sprite->y2 -= DISC_Y_MOVE;\n    }\n}\n\n// - 1 excludes TYPE_MYSTERY\n#define NUM_DISC_COLORS ((NUMBER_OF_MON_TYPES - 1) * 16)\n\nstatic void LoadDiscTypePalettes(void)\n{\n    struct SpritePalette spritePalette;\n\n    sTMSpritePaletteBuffer = Alloc(NUM_DISC_COLORS * sizeof(u16));\n    LZDecompressWram(gTMCaseDiscTypes1_Pal, sTMSpritePaletteBuffer); // Decompress the first 16\n    LZDecompressWram(gTMCaseDiscTypes2_Pal, sTMSpritePaletteBuffer + 0x100); // Decompress the rest (Only 17 total, this is just Dragon type)\n    spritePalette.data = sTMSpritePaletteBuffer + NUM_DISC_COLORS;\n    spritePalette.tag = TAG_DISC;\n    LoadSpritePalette(&spritePalette);\n}\n"
  },
  {
    "path": "src/trade.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"decompress.h\"\n#include \"text_window.h\"\n#include \"pokemon_icon.h\"\n#include \"graphics.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"cable_club.h\"\n#include \"data.h\"\n#include \"strings.h\"\n#include \"menu.h\"\n#include \"overworld.h\"\n#include \"battle_anim.h\"\n#include \"party_menu.h\"\n#include \"daycare.h\"\n#include \"event_data.h\"\n#include \"battle_interface.h\"\n#include \"pokemon_summary_screen.h\"\n#include \"pokemon_storage_system.h\"\n#include \"new_menu_helpers.h\"\n#include \"trade_scene.h\"\n#include \"constants/songs.h\"\n#include \"constants/moves.h\"\n#include \"constants/trade.h\"\n\n// IDs for CallTradeMenuFunc\nenum {\n    CB_MAIN_MENU,\n    CB_SELECTED_MON,\n    CB_SHOW_MON_SUMMARY,\n    CB_CONFIRM_TRADE_PROMPT,\n    CB_CANCEL_TRADE_PROMPT,\n    CB_READY_WAIT, // Equivalent to CB_IDLE\n    CB_SET_SELECTED_MONS,\n    CB_PRINT_IS_THIS_OKAY,\n    CB_HANDLE_TRADE_CANCELED,\n    CB_FADE_TO_START_TRADE,\n    CB_WAIT_TO_START_TRADE,\n    CB_INIT_EXIT_CANCELED_TRADE,\n    CB_EXIT_CANCELED_TRADE,\n    CB_START_LINK_TRADE,\n    CB_INIT_CONFIRM_TRADE_PROMPT,\n    CB_UNUSED_CLOSE_MSG,\n    CB_WAIT_TO_START_RFU_TRADE,\n    CB_IDLE = 100,\n};\n\n// Indexes for sActionTexts\nenum {\n    TEXT_CANCEL,\n    TEXT_CHOOSE_MON,\n    TEXT_SUMMARY,\n    TEXT_TRADE,\n    TEXT_CANCEL_TRADE,\n    TEXT_PRESS_B_TO_EXIT,\n};\n\n// Indexes for sMessages\nenum {\n    MSG_STANDBY,\n    MSG_CANCELED,\n    MSG_ONLY_MON1,\n    MSG_ONLY_MON2,\n    MSG_WAITING_FOR_FRIEND,\n    MSG_FRIEND_WANTS_TO_TRADE,\n    MSG_MON_CANT_BE_TRADED,\n    MSG_EGG_CANT_BE_TRADED,\n    MSG_FRIENDS_MON_CANT_BE_TRADED,\n};\n\n// IDs for QueueAction\nenum {\n    QUEUE_SEND_DATA,\n    QUEUE_STANDBY,\n    QUEUE_ONLY_MON1,\n    QUEUE_ONLY_MON2,\n    QUEUE_UNUSED1, // Presumably intended for MSG_WAITING_FOR_FRIEND\n    QUEUE_UNUSED2, // Presumably intended for MSG_FRIEND_WANTS_TO_TRADE\n    QUEUE_MON_CANT_BE_TRADED,\n    QUEUE_EGG_CANT_BE_TRADED,\n    QUEUE_FRIENDS_MON_CANT_BE_TRADED,\n};\n\n#define QUEUE_DELAY_MSG   3\n#define QUEUE_DELAY_DATA  5\n\n#define GFXTAG_MENU_TEXT       200 // Used as a base tag in CB2_CreateTradeMenu and CB2_ReturnToTradeMenuFromSummary\n#define GFXTAG_CURSOR          300\n#define GFXTAG_LINK_MON_GLOW   5550\n#define GFXTAG_LINK_MON_SHADOW 5552\n#define GFXTAG_CABLE_END       5554\n#define GFXTAG_GBA_SCREEN      5556\n#define GFXTAG_POKEBALL        5557\n\n#define PALTAG_CURSOR    2345\n#define PALTAG_MENU_TEXT 4925\n#define PALTAG_LINK_MON  5551\n#define PALTAG_GBA       5555\n#define PALTAG_POKEBALL  5558\n\n// The following tags are offsets from GFXTAG_MENU_TEXT\n// They're looped over in CB2_CreateTradeMenu and CB2_ReturnToTradeMenuFromSummary\n// and used as indexes into sMenuTextTileBuffers\nenum {\n    GFXTAG_PLAYER_NAME_L,\n    GFXTAG_PLAYER_NAME_M,\n    GFXTAG_PLAYER_NAME_R,\n    GFXTAG_PARTNER_NAME_L,\n    GFXTAG_PARTNER_NAME_M,\n    GFXTAG_PARTNER_NAME_R,\n    GFXTAG_CANCEL_L,\n    GFXTAG_CANCEL_R,\n    GFXTAG_CHOOSE_PKMN_L,\n    GFXTAG_CHOOSE_PKMN_M,\n    GFXTAG_CHOOSE_PKMN_R,\n    GFXTAG_CHOOSE_PKMN_EMPTY_1, // 6 sprites to cover the full bottom bar, but only first 3 are needed\n    GFXTAG_CHOOSE_PKMN_EMPTY_2,\n    GFXTAG_CHOOSE_PKMN_EMPTY_3,\n    NUM_MENU_TEXT_SPRITES\n};\n#define NUM_PLAYER_NAME_SPRITES (1 + GFXTAG_PLAYER_NAME_R - GFXTAG_PLAYER_NAME_L)\n#define NUM_PARTNER_NAME_SPRITES (1 + GFXTAG_PARTNER_NAME_R - GFXTAG_PARTNER_NAME_L)\n#define NUM_CHOOSE_PKMN_SPRITES (1 + GFXTAG_CHOOSE_PKMN_EMPTY_3 - GFXTAG_CHOOSE_PKMN_L)\n\nenum {\n    CURSOR_ANIM_NORMAL,\n    CURSOR_ANIM_ON_CANCEL,\n};\n\n// Values for signaling to/from the link partner\nenum {\n    STATUS_NONE,\n    STATUS_READY,\n    STATUS_CANCEL,\n};\n\n// Checked to confirm DrawSelectedMonScreen has reached final state\n#define DRAW_SELECTED_FINISH 5\n\nstatic EWRAM_DATA u8 *sMenuTextTileBuffer = NULL;\nstatic EWRAM_DATA u8 *sMenuTextTileBuffers[NUM_MENU_TEXT_SPRITES] = {};\nEWRAM_DATA struct Mail gLinkPartnerMail[PARTY_SIZE] = {};\nEWRAM_DATA u8 gSelectedTradeMonPositions[2] = {0};\nstatic EWRAM_DATA struct {\n    u8 bg2hofs;\n    u8 bg3hofs;\n    u8 filler_2[38];\n    u8 partySpriteIds[2][PARTY_SIZE];\n    u8 cursorSpriteId;\n    u8 cursorPosition;\n    u8 partyCounts[2];\n    bool8 optionsActive[PARTY_SIZE * 2 + 1];\n    bool8 isLiveMon[2][PARTY_SIZE];\n    bool8 isEgg[2][PARTY_SIZE];\n    u8 hpBarLevels[2][PARTY_SIZE];\n    u8 bufferPartyState;\n    u8 filler_6A[5];\n    u8 callbackId;\n    u8 unk_70; // Never read\n    u16 bottomTextTileStart;\n    u8 drawSelectedMonState[2];\n    u8 selectedMonIdx[2];\n    u8 playerSelectStatus;\n    u8 partnerSelectStatus;\n    u8 playerConfirmStatus;\n    u8 partnerConfirmStatus;\n    u8 filler_7C[2];\n    u8 partnerCursorPosition;\n    u16 linkData[20];\n    u8 timer;\n    u8 giftRibbons[GIFT_RIBBONS_COUNT];\n    u8 filler_B4[0x81C];\n    struct {\n        bool8 active;\n        u16 delay;\n        u8 actionId;\n    } queuedActions[4];\n    u16 tilemapBuffer[BG_SCREEN_SIZE / 2];\n} * sTradeMenu = NULL;\n\nstatic void CB2_CreateTradeMenu(void);\nstatic void VBlankCB_TradeMenu(void);\nstatic void CB2_TradeMenu(void);\nstatic void LoadTradeBgGfx(u8 state);\nstatic void SetActiveMenuOptions(void);\nstatic u8 BufferTradeParties(void);\nstatic void CB1_UpdateLink(void);\nstatic void RunTradeMenuCallback(void);\nstatic void SetSelectedMon(u8 cursorPosition);\nstatic void DrawSelectedMonScreen(u8 side);\nstatic u8 GetMonNicknameWidth(u8 *str, u8 whichParty, u8 partyIdx);\nstatic void BufferMovesString(u8 *str, u8 whichParty, u8 partyIdx);\nstatic void PrintPartyNicknames(u8 side);\nstatic void PrintLevelAndGender(u8 whichParty, u8 monIdx, u8 x, u8 y, u8 winLeft, u8 winTop);\nstatic void PrintPartyLevelsAndGenders(u8 side);\nstatic void PrintTradePartnerPartyNicknames(void);\nstatic void RedrawPartyWindow(u8 whichParty);\nstatic void Task_DrawSelectionSummary(u8 taskId);\nstatic void Task_DrawSelectionTrade(u8 taskId);\nstatic void QueueAction(u16 delay, u8 actionId);\nstatic void DoQueuedActions(void);\nstatic void PrintTradeMessage(u8 strIdx);\nstatic bool8 LoadUISpriteGfx(void);\nstatic void DrawBottomRowText(const u8 *name, u8 *dest, u8 unused);\nstatic void ComputePartyTradeableFlags(u8 side);\nstatic void ComputePartyHPBarLevels(u8 side);\nstatic void SetTradePartyHPBarSprites(void);\nstatic void SaveTradeGiftRibbons(void);\nstatic u32 CanTradeSelectedMon(struct Pokemon * party, int partyCount, int cursorPos);\n\nstatic const size_t sSizesAndOffsets[] = {\n    sizeof(struct SaveBlock2),\n    sizeof(struct SaveBlock1),\n    sizeof(struct MapLayout),\n    0x530, // unk\n    0x34, // unk\n    sizeof(struct Mail),\n    sizeof(struct Pokemon),\n    0x528 // unk\n};\n\nstatic const u16 sTradeMovesBoxTilemap[] = INCBIN_U16(\"graphics/trade/moves_box_map.bin\");\nstatic const u16 sTradePartyBoxTilemap[] = INCBIN_U16(\"graphics/trade/party_box_map.bin\");\nstatic const u8 sTradeStripesBG2Tilemap[] = INCBIN_U8(\"graphics/trade/stripes_bg2_map.bin\");\nstatic const u8 sTradeStripesBG3Tilemap[] = INCBIN_U8(\"graphics/trade/stripes_bg3_map.bin\");\n\nstatic const struct OamData sOamData_MenuText = {\n    .shape = SPRITE_SHAPE(32x16),\n    .size = SPRITE_SIZE(32x16),\n    .priority = 1\n};\n\nstatic const struct OamData sOamData_Cursor = {\n    .shape = SPRITE_SHAPE(64x32),\n    .size = SPRITE_SIZE(64x32),\n    .priority = 1\n};\n\nstatic const union AnimCmd sAnim_Cursor_Normal[] = {\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Cursor_OnCancel[] = {\n    ANIMCMD_FRAME(32, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_Cursor[] = {\n    [CURSOR_ANIM_NORMAL]    = sAnim_Cursor_Normal,\n    [CURSOR_ANIM_ON_CANCEL] = sAnim_Cursor_OnCancel\n};\n\nstatic const struct SpriteSheet sCursor_SpriteSheet = {\n    .data = gTradeCursor_Gfx,\n    .size = 0x800,\n    .tag = GFXTAG_CURSOR\n};\n\nstatic const struct SpritePalette sCursor_SpritePalette = {\n    .data = gTradeCursor_Pal,\n    .tag = PALTAG_CURSOR\n};\n\n\nstatic const union AnimCmd sAnim_MenuText_0[] = {\n    ANIMCMD_FRAME(0, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_MenuText_1[] = {\n    ANIMCMD_FRAME(8, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_MenuText_2[] = {\n    ANIMCMD_FRAME(16, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_MenuText_3[] = {\n    ANIMCMD_FRAME(24, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_MenuText_4[] = {\n    ANIMCMD_FRAME(32, 5),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_MenuText_5[] = {\n    ANIMCMD_FRAME(40, 5),\n    ANIMCMD_END\n};\n\n// These anims are not used\nstatic const union AnimCmd *const sAnims_MenuText[] = {\n    sAnim_MenuText_0,\n    sAnim_MenuText_1,\n    sAnim_MenuText_2,\n    sAnim_MenuText_3,\n    sAnim_MenuText_4,\n    sAnim_MenuText_5,\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Cursor = {\n    .tileTag = GFXTAG_CURSOR,\n    .paletteTag = PALTAG_CURSOR,\n    .oam = &sOamData_Cursor,\n    .anims = sAnims_Cursor,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_MenuText = {\n    .tileTag = GFXTAG_MENU_TEXT,\n    .paletteTag = PALTAG_MENU_TEXT,\n    .oam = &sOamData_MenuText,\n    .anims = sAnims_MenuText,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const u16 sMenuText_Pal[] = INCBIN_U16(\"graphics/trade/text.gbapal\");\nstatic const struct SpritePalette sSpritePalette_MenuText = {\n    .data = sMenuText_Pal,\n    .tag = PALTAG_MENU_TEXT\n};\n\n#define DIR_UP    0\n#define DIR_DOWN  1\n#define DIR_LEFT  2\n#define DIR_RIGHT 3\n\n// This is used to determine the next mon to select when the D-Pad is\n// pressed in a given direction.\n// Note that the mons are laid out like this.\n// 0-5 are the player's party and 6-11 are the trading partner's party.\n// 12 is the cancel button.\n//  0  1  6  7\n//  2  3  8  9\n//  4  5 10 11\n//          12\n// 1st array is the current positions\n// 2nd array is directions of input\n// 3rd array is the next positions to go to (unoccupied spaces are skipped over)\nstatic const u8 sCursorMoveDestinations[(PARTY_SIZE * 2) + 1][4][PARTY_SIZE] = {\n    // Player's party\n    [0] = {\n        [DIR_UP]    = { 4,  2, 12, 12,  0,  0},\n        [DIR_DOWN]  = { 2,  4, 12, 12,  0,  0},\n        [DIR_LEFT]  = { 7,  6,  1,  0,  0,  0},\n        [DIR_RIGHT] = { 1,  6,  7,  0,  0,  0}\n    },\n    [1] = {\n        [DIR_UP]    = { 5,  3, 12, 12,  0,  0},\n        [DIR_DOWN]  = { 3,  5, 12, 12,  0,  0},\n        [DIR_LEFT]  = { 0,  7,  6,  1,  0,  0},\n        [DIR_RIGHT] = { 6,  7,  0,  1,  0,  0}\n    },\n    [2] = {\n        [DIR_UP]    = { 0,  0,  0,  0,  0,  0},\n        [DIR_DOWN]  = { 4,  0,  0,  0,  0,  0},\n        [DIR_LEFT]  = { 9,  8,  7,  6,  0,  0},\n        [DIR_RIGHT] = { 3,  1,  0,  0,  0,  0}\n    },\n    [3] = {\n        [DIR_UP]    = { 1,  1,  1,  1,  0,  0},\n        [DIR_DOWN]  = { 5,  1,  1,  1,  0,  0},\n        [DIR_LEFT]  = { 2,  9,  8,  7,  0,  0},\n        [DIR_RIGHT] = { 8,  9,  6,  6,  0,  0}\n    },\n    [4] = {\n        [DIR_UP]    = { 2,  2,  2,  2,  0,  0},\n        [DIR_DOWN]  = { 0,  0,  0,  0,  0,  0},\n        [DIR_LEFT]  = {11, 10,  9,  8,  7,  6},\n        [DIR_RIGHT] = { 5,  3,  1,  0,  0,  0}\n    },\n    [5] = {\n        [DIR_UP]    = { 3,  3,  3,  3,  0,  0},\n        [DIR_DOWN]  = { 1,  1,  1,  1,  0,  0},\n        [DIR_LEFT]  = { 4,  4,  4,  4,  0,  0},\n        [DIR_RIGHT] = {10,  8,  6,  0,  0,  0}\n    },\n    // Partner's party\n    [6] = {\n        [DIR_UP]    = {10,  8, 12,  0,  0,  0},\n        [DIR_DOWN]  = { 8, 10, 12,  0,  0,  0},\n        [DIR_LEFT]  = { 1,  0,  0,  0,  0,  0},\n        [DIR_RIGHT] = { 7,  0,  1,  0,  0,  0}\n    },\n    [7] = {\n        [DIR_UP]    = {12,  0,  0,  0,  0,  0},\n        [DIR_DOWN]  = { 9, 12,  0,  0,  0,  0},\n        [DIR_LEFT]  = { 6,  0,  0,  0,  0,  0},\n        [DIR_RIGHT] = { 0,  0,  0,  0,  0,  0}\n    },\n    [8] = {\n        [DIR_UP]    = { 6,  0,  0,  0,  0,  0},\n        [DIR_DOWN]  = {10,  6,  0,  0,  0,  0},\n        [DIR_LEFT]  = { 3,  2,  1,  0,  0,  0},\n        [DIR_RIGHT] = { 9,  7,  0,  0,  0,  0}\n    },\n    [9] = {\n        [DIR_UP]    = { 7,  0,  0,  0,  0,  0},\n        [DIR_DOWN]  = {11, 12,  0,  0,  0,  0},\n        [DIR_LEFT]  = { 8,  0,  0,  0,  0,  0},\n        [DIR_RIGHT] = { 2,  1,  0,  0,  0,  0}\n    },\n    [10] = {\n        [DIR_UP]    = { 8,  0,  0,  0,  0,  0},\n        [DIR_DOWN]  = { 6,  0,  0,  0,  0,  0},\n        [DIR_LEFT]  = { 5,  4,  3,  2,  1,  0},\n        [DIR_RIGHT] = {11,  9,  7,  0,  0,  0}\n    },\n    [11] = {\n        [DIR_UP]    = { 9,  0,  0,  0,  0,  0},\n        [DIR_DOWN]  = {12,  0,  0,  0,  0,  0},\n        [DIR_LEFT]  = {10,  0,  0,  0,  0,  0},\n        [DIR_RIGHT] = { 4,  2,  0,  0,  0,  0}\n    },\n    // Cancel\n    [12] = {\n        [DIR_UP]    = {11,  9,  7,  6,  0,  0},\n        [DIR_DOWN]  = { 7,  6,  0,  0,  0,  0},\n        [DIR_LEFT]  = {12,  0,  0,  0,  0,  0},\n        [DIR_RIGHT] = {12,  0,  0,  0,  0,  0}\n    }\n};\n\n#define COL0_X 1\n#define COL1_X 8\n#define COL2_X 16\n#define COL3_X 23\n#define ROW0_Y 5\n#define ROW1_Y 10\n#define ROW2_Y 15\n#define ROW3_Y 18\n\nstatic const u8 sTradeMonSpriteCoords[(PARTY_SIZE * 2) + 1][2] = {\n    [TRADE_PLAYER] =\n        {COL0_X, ROW0_Y},\n        {COL1_X, ROW0_Y},\n        {COL0_X, ROW1_Y},\n        {COL1_X, ROW1_Y},\n        {COL0_X, ROW2_Y},\n        {COL1_X, ROW2_Y},\n    [TRADE_PARTNER * PARTY_SIZE] =\n        {COL2_X, ROW0_Y},\n        {COL3_X, ROW0_Y},\n        {COL2_X, ROW1_Y},\n        {COL3_X, ROW1_Y},\n        {COL2_X, ROW2_Y},\n        {COL3_X, ROW2_Y},\n    // Cancel\n    {COL3_X, ROW3_Y},\n};\n\nstatic const u8 sTradeMonLevelCoords[PARTY_SIZE * 2][2] = {\n    [TRADE_PLAYER] =\n        { 5,  4},\n        {12,  4},\n        { 5,  9},\n        {12,  9},\n        { 5, 14},\n        {12, 14},\n    [TRADE_PARTNER * PARTY_SIZE] =\n        {20,  4},\n        {27,  4},\n        {20,  9},\n        {27,  9},\n        {20, 14},\n        {27, 14},\n};\n\nstatic const u8 sTradeMonBoxCoords[PARTY_SIZE * 2][2] = {\n    [TRADE_PLAYER] =\n        { 1,  3},\n        { 8,  3},\n        { 1,  8},\n        { 8,  8},\n        { 1, 13},\n        { 8, 13},\n    [TRADE_PARTNER * PARTY_SIZE] =\n        {16,  3},\n        {23,  3},\n        {16,  8},\n        {23,  8},\n        {16, 13},\n        {23, 13},\n};\n\n// x,y offset for player name, x/y offset for partner name\nstatic const u8 sPlayerNameCoords[][4] = {\n    {60, 9, 180, 9}, // Unused. For JP characters?\n    {48, 9, 168, 9},\n};\n\nstatic const u8 sUnusedCoords[][2] =\n{\n    { 0, 14},\n    {15, 29},\n    { 3,  5},\n    { 3,  7},\n    {18,  5},\n    {18,  7},\n    { 8,  7},\n    {22, 12},\n    { 8,  7},\n    {22, 12},\n    { 6,  7},\n    {24, 12},\n    { 6,  7},\n    {24, 12},\n    { 8,  7},\n    {22, 12},\n    { 7,  7},\n    {23, 12}\n};\n\nstatic const u8 sText_Dummy[] = _(\"\");\nstatic const u8 sText_ClrWhtHltTranspShdwDrkGry[] = _(\"{COLOR WHITE}{HIGHLIGHT TRANSPARENT}{SHADOW DARK_GRAY}\");\nconst u8 gText_MaleSymbol4[] = _(\"♂\");\nconst u8 gText_FemaleSymbol4[] = _(\"♀\");\nconst u8 gText_GenderlessSymbol[] = _(\"\");\nstatic const u8 sText_Dummy2[] = _(\"\");\nstatic const u8 sText_Newline[] = _(\"\\n\");\nstatic const u8 sText_Slash[] = _(\"/\");\n\nstatic const u8 *const sActionTexts[] = {\n    [TEXT_CANCEL]          = gTradeText_Cancel,\n    [TEXT_CHOOSE_MON]      = gTradeText_ChooseAPokemon,\n    [TEXT_SUMMARY]         = gTradeText_Summary, // Unused, sMenuAction_SummaryTrade is used instead\n    [TEXT_TRADE]           = gTradeText_Trade,   // Unused, sMenuAction_SummaryTrade is used instead\n    [TEXT_CANCEL_TRADE]    = gText_CancelTrade,\n    [TEXT_PRESS_B_TO_EXIT] = gTradeText_PressBButtonToExit // Unused\n};\n\nstatic const struct MenuAction sMenuAction_SummaryTrade[] = {\n    {gText_TradeAction_Summary, { .void_u8 = Task_DrawSelectionSummary }},\n    {gText_TradeAction_Trade, { .void_u8 = Task_DrawSelectionTrade }}\n};\n\nstatic const u8 *const sMessages[] = {\n    [MSG_STANDBY]                    = gText_Trade_CommunicationStandby,\n    [MSG_CANCELED]                   = gText_TradeHasBeenCanceled,\n    [MSG_ONLY_MON1]                  = gText_Trade_OnlyPkmnForBattle,\n    [MSG_ONLY_MON2]                  = gText_OnlyPkmnForBattle, // Same as above but without color formatting\n    [MSG_WAITING_FOR_FRIEND]         = gText_WaitingForFriendToFinish,\n    [MSG_FRIEND_WANTS_TO_TRADE]      = gText_FriendWantsToTrade,\n    [MSG_MON_CANT_BE_TRADED]         = gText_PkmnCantBeTradedNow, \n    [MSG_EGG_CANT_BE_TRADED]         = gText_EggCantBeTradedNow,\n    [MSG_FRIENDS_MON_CANT_BE_TRADED] = gText_OtherTrainersPkmnCantBeTraded\n};\n\nstatic const u8 sTextColor_PartyMonNickname[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY };\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 5,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 6,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000\n    }, {\n        .bg = 3,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 7,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 4,\n        .tilemapTop = 7,\n        .width = 22,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x01e\n    }, {\n        .bg = 0,\n        .tilemapLeft = 17,\n        .tilemapTop = 15,\n        .width = 12,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x076\n    }, {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 5,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x0a6\n    }, {\n        .bg = 0,\n        .tilemapLeft = 7,\n        .tilemapTop = 5,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x0b6\n    }, {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 10,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x0c6\n    }, {\n        .bg = 0,\n        .tilemapLeft = 7,\n        .tilemapTop = 10,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x0d6\n    }, {\n        .bg = 0,\n        .tilemapLeft = 0,\n        .tilemapTop = 15,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x0e6\n    }, {\n        .bg = 0,\n        .tilemapLeft = 7,\n        .tilemapTop = 15,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x0f6\n    }, {\n        .bg = 0,\n        .tilemapLeft = 15,\n        .tilemapTop = 5,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x106\n    }, {\n        .bg = 0,\n        .tilemapLeft = 22,\n        .tilemapTop = 5,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x116\n    }, {\n        .bg = 0,\n        .tilemapLeft = 15,\n        .tilemapTop = 10,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x126\n    }, {\n        .bg = 0,\n        .tilemapLeft = 22,\n        .tilemapTop = 10,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x136\n    }, {\n        .bg = 0,\n        .tilemapLeft = 15,\n        .tilemapTop = 15,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x146\n    }, {\n        .bg = 0,\n        .tilemapLeft = 22,\n        .tilemapTop = 15,\n        .width = 8,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x156\n    }, {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 5,\n        .width = 14,\n        .height = 2,\n        .paletteNum = 13,\n        .baseBlock = 0x166\n    }, {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 8,\n        .width = 11,\n        .height = 8,\n        .paletteNum = 15,\n        .baseBlock = 0x182\n    }, {\n        .bg = 0,\n        .tilemapLeft = 17,\n        .tilemapTop = 5,\n        .width = 14,\n        .height = 2,\n        .paletteNum = 15,\n        .baseBlock = 0x1da\n    }, {\n        .bg = 0,\n        .tilemapLeft = 18,\n        .tilemapTop = 8,\n        .width = 11,\n        .height = 8,\n        .paletteNum = 15,\n        .baseBlock = 0x1f6\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct WindowTemplate sWindowTemplate_YesNo = {\n    .bg = 0,\n    .tilemapLeft = 21,\n    .tilemapTop = 13,\n    .width = 6,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x24e\n};\n\nstatic const u8 sText_ShedinjaJP[] = _(\"ヌケニン\");\n\n// Position of level/gender when just the pokemon to trade are displayed\nstatic const u8 sSelectedMonLevelGenderCoords[][2] = {\n    [TRADE_PLAYER]  = { 4,  3},\n    [TRADE_PARTNER] = {19,  3}\n};\n\nstatic void InitTradeMenu(void)\n{\n    static u16 dummy;\n\n    ResetSpriteData();\n    FreeAllSpritePalettes();\n    ResetTasks();\n    ResetPaletteFade();\n\n    gPaletteFade.bufferTransferDisabled = TRUE;\n\n    SetVBlankCallback(VBlankCB_TradeMenu);\n    LoadPalette(gStandardMenuPalette, BG_PLTT_ID(15), PLTT_SIZEOF(10));\n    LoadPalette(gStandardMenuPalette, BG_PLTT_ID(13), PLTT_SIZEOF(10));\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));\n    SetBgTilemapBuffer(1, sTradeMenu->tilemapBuffer);\n\n    if (InitWindows(sWindowTemplates))\n    {\n        int i;\n        DeactivateAllTextPrinters();\n        dummy = 590; // ?\n        for (i = 0; i < ARRAY_COUNT(sWindowTemplates) - 1; i++)\n        {\n            ClearWindowTilemap(i);\n            FillWindowPixelBuffer(i, PIXEL_FILL(0));\n        }\n        FillBgTilemapBufferRect(0, 0, 0, 0, 30, 20, 15);\n        LoadStdWindowGfx(0, 0x014, BG_PLTT_ID(12));\n        LoadUserWindowGfx(2, 0x001, BG_PLTT_ID(14));\n        LoadMonIconPalettes();\n        sTradeMenu->bufferPartyState = 0;\n        sTradeMenu->callbackId = CB_MAIN_MENU;\n        sTradeMenu->unk_70 = 0;\n        sTradeMenu->drawSelectedMonState[TRADE_PLAYER] = 0;\n        sTradeMenu->drawSelectedMonState[TRADE_PARTNER] = 0;\n        sTradeMenu->playerConfirmStatus = STATUS_NONE;\n        sTradeMenu->partnerConfirmStatus = STATUS_NONE;\n        sTradeMenu->timer = 0;\n    }\n}\n\nvoid CB2_StartCreateTradeMenu(void)\n{\n    SetMainCallback2(CB2_CreateTradeMenu);\n}\n\nstatic void CB2_CreateTradeMenu(void)\n{\n    int i;\n    struct SpriteTemplate temp;\n    u8 id;\n    s32 width;\n    u32 xPos;\n    u8 *name;\n\n    switch (gMain.state)\n    {\n    case 0:\n        sTradeMenu = AllocZeroed(sizeof(*sTradeMenu));\n        InitTradeMenu();\n        sMenuTextTileBuffer = AllocZeroed(NUM_MENU_TEXT_SPRITES * 256);\n\n        for (i = 0; i < NUM_MENU_TEXT_SPRITES; i++)\n            sMenuTextTileBuffers[i] = &sMenuTextTileBuffer[i * 256];\n\n        gMain.state++;\n        break;\n    case 1:\n        gPaletteFade.bufferTransferDisabled = FALSE;\n\n        for (i = 0; i < PARTY_SIZE; i++)\n            CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0);\n\n        PrintTradeMessage(MSG_STANDBY);\n        ShowBg(0);\n\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            gLinkType = LINKTYPE_TRADE_CONNECTING;\n            sTradeMenu->timer = 0;\n\n            if (gWirelessCommType)\n            {\n                SetWirelessCommType1();\n                OpenLink();\n                CreateTask_RfuIdle();\n            }\n            else\n            {\n                OpenLink();\n                gMain.state++;\n            }\n            if (gWirelessCommType == 0)\n                CreateTask(Task_WaitForLinkPlayerConnection, 1);\n        }\n        else\n        {\n            gMain.state = 4;\n        }\n        break;\n    case 2:\n        sTradeMenu->timer++;\n        if (sTradeMenu->timer > 11)\n        {\n            sTradeMenu->timer = 0;\n            gMain.state++;\n        }\n        break;\n    case 3:\n        if (GetLinkPlayerCount_2() >= GetSavedPlayerCount())\n        {\n            if (IsLinkMaster())\n            {\n                if (++sTradeMenu->timer > 30)\n                {\n                    CheckShouldAdvanceLinkState();\n                    gMain.state++;\n                }\n            }\n            else\n            {\n                gMain.state++;\n            }\n        }\n        break;\n    case 4:\n        if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)\n        {\n            DestroyTask_RfuIdle();\n            CalculatePlayerPartyCount();\n            gMain.state++;\n            sTradeMenu->timer = 0;\n            if (gWirelessCommType)\n            {\n                Rfu_SetLinkRecovery(TRUE);\n                SetLinkStandbyCallback();\n            }\n        }\n        break;\n    case 5:\n        if (gWirelessCommType)\n        {\n            if (IsLinkRfuTaskFinished())\n            {\n                gMain.state++;\n                LoadWirelessStatusIndicatorSpriteGfx();\n                CreateWirelessStatusIndicatorSprite(0, 0);\n            }\n        }\n        else\n        {\n            gMain.state++;\n        }\n        break;\n    case 6:\n        if (BufferTradeParties())\n        {\n            SaveTradeGiftRibbons();\n            gMain.state++;\n        }\n        break;\n    case 7:\n        CalculateEnemyPartyCount();\n        SetGpuReg(REG_OFFSET_DISPCNT, 0);\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        sTradeMenu->partyCounts[TRADE_PLAYER] = gPlayerPartyCount;\n        sTradeMenu->partyCounts[TRADE_PARTNER] = gEnemyPartyCount;\n\n        for (i = 0; i < sTradeMenu->partyCounts[TRADE_PLAYER]; i++)\n        {\n            struct Pokemon * mon = &gPlayerParty[i];\n            sTradeMenu->partySpriteIds[TRADE_PLAYER][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES_OR_EGG),\n                                                                SpriteCB_MonIcon,\n                                                                (sTradeMonSpriteCoords[i][0] * 8) + 14,\n                                                                (sTradeMonSpriteCoords[i][1] * 8) - 12,\n                                                                1,\n                                                                GetMonData(mon, MON_DATA_PERSONALITY),\n                                                                TRUE);\n        }\n\n        for (i = 0; i < sTradeMenu->partyCounts[TRADE_PARTNER]; i++)\n        {\n            struct Pokemon * mon = &gEnemyParty[i];\n            sTradeMenu->partySpriteIds[TRADE_PARTNER][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL),\n                                                                SpriteCB_MonIcon,\n                                                                (sTradeMonSpriteCoords[i + PARTY_SIZE][0] * 8) + 14,\n                                                                (sTradeMonSpriteCoords[i + PARTY_SIZE][1] * 8) - 12,\n                                                                1,\n                                                                GetMonData(mon, MON_DATA_PERSONALITY),\n                                                                FALSE);\n        }\n        gMain.state++;\n        break;\n    case 8:\n        LoadHeldItemIcons();\n        DrawHeldItemIconsForTrade(sTradeMenu->partyCounts, sTradeMenu->partySpriteIds[0], TRADE_PLAYER);\n        gMain.state++;\n        break;\n    case 9:\n        DrawHeldItemIconsForTrade(sTradeMenu->partyCounts, sTradeMenu->partySpriteIds[0], TRADE_PARTNER);\n        gMain.state++;\n        break;\n    case 10:\n        DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMenuTextTileBuffers[GFXTAG_PLAYER_NAME_L], 0, 0, gDecompressionBuffer, 3);\n        id = GetMultiplayerId();\n        DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMenuTextTileBuffers[GFXTAG_PARTNER_NAME_L], 0, 0, gDecompressionBuffer, 3);\n        DrawTextWindowAndBufferTiles(sActionTexts[TEXT_CANCEL], sMenuTextTileBuffers[GFXTAG_CANCEL_L], 0, 0, gDecompressionBuffer, 2);\n        DrawBottomRowText(sActionTexts[TEXT_CHOOSE_MON], sMenuTextTileBuffers[GFXTAG_CHOOSE_PKMN_L], 24);\n        gMain.state++;\n        sTradeMenu->timer = 0;\n        break;\n    case 11:\n        if (LoadUISpriteGfx())\n            gMain.state++;\n        break;\n    case 12:\n        // Create player's name text sprites\n        name = gSaveBlock2Ptr->playerName;\n        width = GetStringWidth(FONT_NORMAL_COPY_1, name, 0);\n        xPos = (56 - width) / 2;\n        for (i = 0; i < NUM_PLAYER_NAME_SPRITES; i++)\n        {\n            temp = sSpriteTemplate_MenuText;\n            temp.tileTag += i + GFXTAG_PLAYER_NAME_L;\n            CreateSprite(&temp, xPos + sPlayerNameCoords[1][0] + (i * 32), sPlayerNameCoords[1][1], 1);\n        }\n\n        // Create partner's name text sprites\n        id = GetMultiplayerId();\n        name = gLinkPlayers[id ^ 1].name;\n        width = GetStringWidth(FONT_NORMAL_COPY_1, name, 0);\n        xPos = (56 - width) / 2;\n        for (i = 0; i < NUM_PARTNER_NAME_SPRITES; i++)\n        {\n            temp = sSpriteTemplate_MenuText;\n            temp.tileTag += i + GFXTAG_PARTNER_NAME_L;\n            CreateSprite(&temp, xPos + sPlayerNameCoords[1][2] + (i * 32), sPlayerNameCoords[1][3], 1);\n        }\n        gMain.state++;\n        break;\n    case 13:\n        // Create Cancel text sprites\n        temp = sSpriteTemplate_MenuText;\n        temp.tileTag += GFXTAG_CANCEL_L;\n        CreateSprite(&temp, 215, 151, 1);\n        temp = sSpriteTemplate_MenuText;\n        temp.tileTag += GFXTAG_CANCEL_R;\n        CreateSprite(&temp, 215 + 32, 151, 1);\n\n        // Create Choose a Pokémon text sprites (only 3 are needed, other 3 are empty)\n        for (i = 0; i < NUM_CHOOSE_PKMN_SPRITES; i++)\n        {\n            temp = sSpriteTemplate_MenuText;\n            temp.tileTag += i + GFXTAG_CHOOSE_PKMN_L;\n            CreateSprite(&temp, (i * 32) + 24, 150, 1);\n        }\n\n        sTradeMenu->cursorSpriteId = CreateSprite(&sSpriteTemplate_Cursor, sTradeMonSpriteCoords[0][0] * 8 + 32, sTradeMonSpriteCoords[0][1] * 8, 2);\n        sTradeMenu->cursorPosition = 0;\n        gMain.state++;\n        rbox_fill_rectangle(0);\n        break;\n    case 14:\n        ComputePartyTradeableFlags(TRADE_PLAYER);\n        PrintPartyNicknames(TRADE_PLAYER);\n        sTradeMenu->bg2hofs = 0;\n        sTradeMenu->bg3hofs = 0;\n        SetActiveMenuOptions();\n        gMain.state++;\n        PlayBGM(MUS_GAME_CORNER);\n        break;\n    case 15:\n        ComputePartyTradeableFlags(TRADE_PARTNER);\n        PrintPartyNicknames(TRADE_PARTNER);\n        gMain.state++;\n        // fallthrough\n    case 16:\n        LoadTradeBgGfx(0);\n        gMain.state++;\n        break;\n    case 17:\n        LoadTradeBgGfx(1);\n        gMain.state++;\n        break;\n    case 18:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        gMain.state++;\n        break;\n    case 19:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n        LoadTradeBgGfx(2);\n        gMain.state++;\n        break;\n    case 20:\n        ComputePartyHPBarLevels(TRADE_PLAYER);\n        gMain.state++;\n        break;\n    case 21:\n        ComputePartyHPBarLevels(TRADE_PARTNER);\n        SetTradePartyHPBarSprites();\n        gMain.state++;\n        break;\n    case 22:\n        if (!gPaletteFade.active)\n        {\n            gMain.callback1 = CB1_UpdateLink;\n            SetMainCallback2(CB2_TradeMenu);\n        }\n        break;\n    }\n\n    RunTextPrinters();\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nvoid CB2_ReturnToTradeMenuFromSummary(void)\n{\n    int i;\n    struct SpriteTemplate temp;\n    u8 id;\n    s32 width;\n    u32 xPos;\n    u8 *name;\n\n    switch (gMain.state)\n    {\n    case 0:\n        InitTradeMenu();\n        gMain.state++;\n        break;\n    case 1:\n        gMain.state++;\n        sTradeMenu->timer = 0;\n        break;\n    case 2:\n        gMain.state++;\n        break;\n    case 3:\n        gMain.state++;\n        break;\n    case 4:\n        CalculatePlayerPartyCount();\n        gMain.state++;\n        break;\n    case 5:\n        if (gWirelessCommType != 0)\n        {\n            LoadWirelessStatusIndicatorSpriteGfx();\n            CreateWirelessStatusIndicatorSprite(0, 0);\n        }\n        gMain.state++;\n        break;\n    case 6:\n        gMain.state++;\n        break;\n    case 7:\n        CalculateEnemyPartyCount();\n        sTradeMenu->partyCounts[TRADE_PLAYER] = gPlayerPartyCount;\n        sTradeMenu->partyCounts[TRADE_PARTNER] = gEnemyPartyCount;\n        ClearWindowTilemap(0);\n        PrintPartyNicknames(TRADE_PLAYER);\n        PrintPartyNicknames(TRADE_PARTNER);\n        for (i = 0; i < sTradeMenu->partyCounts[TRADE_PLAYER]; i++)\n        {\n            sTradeMenu->partySpriteIds[TRADE_PLAYER][i] = CreateMonIcon(\n                GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL),\n                SpriteCB_MonIcon,\n                sTradeMonSpriteCoords[i][0] * 8 + 14,\n                sTradeMonSpriteCoords[i][1] * 8 - 12,\n                1,\n                GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY),\n                TRUE\n            );\n        }\n        for (i = 0; i < sTradeMenu->partyCounts[TRADE_PARTNER]; i++)\n        {\n            sTradeMenu->partySpriteIds[TRADE_PARTNER][i] = CreateMonIcon(\n                GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG, NULL),\n                SpriteCB_MonIcon,\n                sTradeMonSpriteCoords[i + PARTY_SIZE][0] * 8 + 14,\n                sTradeMonSpriteCoords[i + PARTY_SIZE][1] * 8 - 12,\n                1,\n                GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY),\n                FALSE\n            );\n        }\n        gMain.state++;\n        break;\n    case 8:\n        LoadHeldItemIcons();\n        DrawHeldItemIconsForTrade(sTradeMenu->partyCounts, sTradeMenu->partySpriteIds[0], TRADE_PLAYER);\n        gMain.state++;\n        break;\n    case 9:\n        DrawHeldItemIconsForTrade(sTradeMenu->partyCounts, sTradeMenu->partySpriteIds[0], TRADE_PARTNER);\n        gMain.state++;\n        break;\n    case 10:\n        DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMenuTextTileBuffers[GFXTAG_PLAYER_NAME_L], 0, 0, gDecompressionBuffer, 3);\n        id = GetMultiplayerId();\n        DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMenuTextTileBuffers[GFXTAG_PARTNER_NAME_L], 0, 0, gDecompressionBuffer, 3);\n        DrawTextWindowAndBufferTiles(sActionTexts[TEXT_CANCEL], sMenuTextTileBuffers[GFXTAG_CANCEL_L], 0, 0, gDecompressionBuffer, 2);\n        DrawBottomRowText(sActionTexts[TEXT_CHOOSE_MON], sMenuTextTileBuffers[GFXTAG_CHOOSE_PKMN_L], 24);\n        gMain.state++;\n        sTradeMenu->timer = 0;\n        break;\n    case 11:\n        if (LoadUISpriteGfx())\n            gMain.state++;\n        break;\n    case 12:\n        // Create player's name text sprites\n        name = gSaveBlock2Ptr->playerName;\n        width = GetStringWidth(FONT_NORMAL_COPY_1, name, 0);\n        xPos = (56 - width) / 2;\n        for (i = 0; i < NUM_PLAYER_NAME_SPRITES; i++)\n        {\n            temp = sSpriteTemplate_MenuText;\n            temp.tileTag += i + GFXTAG_PLAYER_NAME_L;\n            CreateSprite(&temp, xPos + sPlayerNameCoords[1][0] + (i * 32), sPlayerNameCoords[1][1], 1);\n        }\n\n        // Create partner's name text sprites\n        id = GetMultiplayerId();\n        name = gLinkPlayers[id ^ 1].name;\n        width = GetStringWidth(FONT_NORMAL_COPY_1, name, 0);\n        xPos = (56 - width) / 2;\n        for (i = 0; i < NUM_PARTNER_NAME_SPRITES; i++)\n        {\n            temp = sSpriteTemplate_MenuText;\n            temp.tileTag += i + GFXTAG_PARTNER_NAME_L;\n            CreateSprite(&temp, xPos + sPlayerNameCoords[1][2] + (i * 32), sPlayerNameCoords[1][3], 1);\n        }\n        gMain.state++;\n        break;\n    case 13:\n        // Create Cancel text sprites\n        temp = sSpriteTemplate_MenuText;\n        temp.tileTag += GFXTAG_CANCEL_L;\n        CreateSprite(&temp, 215, 151, 1);\n        temp = sSpriteTemplate_MenuText;\n        temp.tileTag += GFXTAG_CANCEL_R;\n        CreateSprite(&temp, 215 + 32, 151, 1);\n\n        // Create Choose a Pokémon text sprites\n        for (i = 0; i < NUM_CHOOSE_PKMN_SPRITES; i++)\n        {\n            temp = sSpriteTemplate_MenuText;\n            temp.tileTag += i + GFXTAG_CHOOSE_PKMN_L;\n            CreateSprite(&temp, (i * 32) + 24, 150, 1);\n        }\n\n        if (sTradeMenu->cursorPosition < PARTY_SIZE)\n            sTradeMenu->cursorPosition = GetLastViewedMonIndex();\n        else\n            sTradeMenu->cursorPosition = GetLastViewedMonIndex() + PARTY_SIZE;\n\n        sTradeMenu->cursorSpriteId = CreateSprite(&sSpriteTemplate_Cursor,\n                                                  sTradeMonSpriteCoords[sTradeMenu->cursorPosition][0] * 8 + 32,\n                                                  sTradeMonSpriteCoords[sTradeMenu->cursorPosition][1] * 8, 2);\n        gMain.state = 16;\n        break;\n    case 16:\n        LoadTradeBgGfx(0);\n        gMain.state++;\n        break;\n    case 17:\n        LoadTradeBgGfx(1);\n        sTradeMenu->bg2hofs = 0;\n        sTradeMenu->bg3hofs = 0;\n        SetActiveMenuOptions();\n        gMain.state++;\n        break;\n    case 18:\n        gPaletteFade.bufferTransferDisabled = FALSE;\n        BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        gMain.state++;\n        break;\n    case 19:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);\n        LoadTradeBgGfx(2);\n        gMain.state++;\n        break;\n    case 20:\n        gMain.state++;\n        break;\n    case 21:\n        SetTradePartyHPBarSprites();\n        gMain.state++;\n        break;\n    case 22:\n        if (!gPaletteFade.active)\n            SetMainCallback2(CB2_TradeMenu);\n        break;\n    }\n\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void VBlankCB_TradeMenu(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void CB_FadeToStartTrade(void)\n{\n    if (++sTradeMenu->timer >= 16)\n    {\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sTradeMenu->callbackId = CB_WAIT_TO_START_TRADE;\n    }\n}\n\nstatic void CB_WaitToStartTrade(void)\n{\n    if (!gPaletteFade.active)\n    {\n        gSelectedTradeMonPositions[TRADE_PLAYER] = sTradeMenu->cursorPosition;\n        gSelectedTradeMonPositions[TRADE_PARTNER] = sTradeMenu->partnerCursorPosition;\n        if (gWirelessCommType != 0)\n        {\n            sTradeMenu->callbackId = CB_WAIT_TO_START_RFU_TRADE;\n        }\n        else\n        {\n            SetCloseLinkCallbackAndType(32);\n            sTradeMenu->callbackId = CB_START_LINK_TRADE;\n        }\n    }\n}\n\nstatic void CB_StartLinkTrade(void)\n{\n    gMain.savedCallback = CB2_StartCreateTradeMenu;\n    if (gWirelessCommType != 0)\n    {\n        // Wireless Link Trade\n        if (IsLinkRfuTaskFinished())\n        {\n            Free(sMenuTextTileBuffer);\n            FreeAllWindowBuffers();\n            Free(sTradeMenu);\n            gMain.callback1 = NULL;\n            DestroyWirelessStatusIndicatorSprite();\n            SetMainCallback2(CB2_LinkTrade);\n        }\n    }\n    else\n    {\n        // Cable Link Trade\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            Free(sMenuTextTileBuffer);\n            FreeAllWindowBuffers();\n            Free(sTradeMenu);\n            gMain.callback1 = NULL;\n            SetMainCallback2(CB2_LinkTrade);\n        }\n    }\n}\n\nstatic void CB2_TradeMenu(void)\n{\n    RunTradeMenuCallback();\n    DoQueuedActions();\n\n    // As long as drawSelectedMonState is 0, these do nothing\n    DrawSelectedMonScreen(TRADE_PLAYER);\n    DrawSelectedMonScreen(TRADE_PARTNER);\n\n    SetGpuReg(REG_OFFSET_BG2HOFS, sTradeMenu->bg2hofs++);\n    SetGpuReg(REG_OFFSET_BG3HOFS, sTradeMenu->bg3hofs--);\n    RunTextPrinters_CheckPrinter0Active();\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void LoadTradeBgGfx(u8 state)\n{\n    int i;\n\n    switch (state)\n    {\n    case 0:\n        LoadPalette(gTradeMenu_Pal, BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP);\n        LoadBgTiles(1, gTradeMenu_Gfx, 0x1280, 0);\n        CopyToBgTilemapBufferRect_ChangePalette(1, gTradeMenu_Tilemap, 0, 0, 32, 20, 0);\n        LoadBgTilemap(2, sTradeStripesBG2Tilemap, 0x800, 0);\n        break;\n    case 1:\n        LoadBgTilemap(3, sTradeStripesBG3Tilemap, 0x800, 0);\n        PrintPartyLevelsAndGenders(TRADE_PLAYER);\n        PrintPartyLevelsAndGenders(TRADE_PARTNER);\n        CopyBgTilemapBufferToVram(1);\n        break;\n    case 2:\n        for (i = 0; i < 4; i++)\n        {\n            // BG0 and BG1 coords only\n            SetGpuReg(REG_OFFSET_BG0HOFS + 2 * i, 0);\n        }\n        ShowBg(0);\n        ShowBg(1);\n        ShowBg(2);\n        ShowBg(3);\n        break;\n    }\n}\n\n// Determine (based on party counts) where the main menu cursor can go\nstatic void SetActiveMenuOptions(void)\n{\n    int i;\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (i < sTradeMenu->partyCounts[TRADE_PLAYER])\n        {\n            // Present player pokemon\n            gSprites[sTradeMenu->partySpriteIds[TRADE_PLAYER][i]].invisible = FALSE;\n            sTradeMenu->optionsActive[i] = TRUE;\n        }\n        else\n        {\n            // Absent player pokemon\n            sTradeMenu->optionsActive[i] = FALSE;\n        }\n\n        if (i < sTradeMenu->partyCounts[TRADE_PARTNER])\n        {\n            // Present partner pokemon\n            gSprites[sTradeMenu->partySpriteIds[TRADE_PARTNER][i]].invisible = FALSE;\n            sTradeMenu->optionsActive[i + PARTY_SIZE] = TRUE;\n        }\n        else\n        {\n            // Absent partner pokemon\n            sTradeMenu->optionsActive[i + PARTY_SIZE] = FALSE;\n        }\n    }\n\n    // Cancel is always active\n    sTradeMenu->optionsActive[PARTY_SIZE * 2] = TRUE;\n}\n\nstatic void Trade_Memcpy(void *dest, const void *src, size_t size)\n{\n    int i;\n    u8 *_dest = dest;\n    const u8 *_src = src;\n    for (i = 0; i < size; i++)\n        _dest[i] = _src[i];\n}\n\nstatic bool8 BufferTradeParties(void)\n{\n    u8 id = GetMultiplayerId();\n    int i;\n    struct Pokemon * mon;\n\n    switch (sTradeMenu->bufferPartyState)\n    {\n    case 0:\n        // The parties are sent in pairs rather than all at once\n        Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[0], 2 * sizeof(struct Pokemon));\n        sTradeMenu->bufferPartyState++;\n        sTradeMenu->timer = 0;\n        break;\n    case 1:\n        if (IsLinkTaskFinished())\n        {\n            if (GetBlockReceivedStatus() == 0)\n            {\n                sTradeMenu->bufferPartyState++;\n            }\n            else\n            {\n                ResetBlockReceivedFlags();\n                sTradeMenu->bufferPartyState++;\n            }\n        }\n        break;\n    case 3:\n        if (id == 0)\n            SendBlockRequest(BLOCK_REQ_SIZE_200);\n        sTradeMenu->bufferPartyState++;\n        break;\n    case 4:\n        if (GetBlockReceivedStatus() == 3)\n        {\n            Trade_Memcpy(&gEnemyParty[0], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon));\n            ResetBlockReceivedFlags();\n            sTradeMenu->bufferPartyState++;\n        }\n        break;\n    case 5:\n        Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[2], 2 * sizeof(struct Pokemon));\n        sTradeMenu->bufferPartyState++;\n        break;\n    case 7:\n        if (id == 0)\n            SendBlockRequest(BLOCK_REQ_SIZE_200);\n        sTradeMenu->bufferPartyState++;\n        break;\n    case 8:\n        if (GetBlockReceivedStatus() == 3)\n        {\n            Trade_Memcpy(&gEnemyParty[2], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon));\n            ResetBlockReceivedFlags();\n            sTradeMenu->bufferPartyState++;\n        }\n        break;\n    case 9:\n        Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[4], 2 * sizeof(struct Pokemon));\n        sTradeMenu->bufferPartyState++;\n        break;\n    case 11:\n        if (id == 0)\n            SendBlockRequest(BLOCK_REQ_SIZE_200);\n        sTradeMenu->bufferPartyState++;\n        break;\n    case 12:\n        if (GetBlockReceivedStatus() == 3)\n        {\n            Trade_Memcpy(&gEnemyParty[4], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon));\n            ResetBlockReceivedFlags();\n            sTradeMenu->bufferPartyState++;\n        }\n        break;\n    case 13:\n        Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, PARTY_SIZE * sizeof(struct Mail) + 4); // why the extra 4 bytes?\n        sTradeMenu->bufferPartyState++;\n        break;\n    case 15:\n        if (id == 0)\n            SendBlockRequest(BLOCK_REQ_SIZE_220);\n        sTradeMenu->bufferPartyState++;\n        break;\n    case 16:\n        if (GetBlockReceivedStatus() == 3)\n        {\n            Trade_Memcpy(gLinkPartnerMail, gBlockRecvBuffer[id ^ 1], PARTY_SIZE * sizeof(struct Mail));\n            ResetBlockReceivedFlags();\n            sTradeMenu->bufferPartyState++;\n        }\n        break;\n    case 17:\n        Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->giftRibbons, sizeof(sTradeMenu->giftRibbons));\n        sTradeMenu->bufferPartyState++;\n        break;\n    case 19:\n        if (id == 0)\n            SendBlockRequest(BLOCK_REQ_SIZE_40);\n        sTradeMenu->bufferPartyState++;\n        break;\n    case 20:\n        if (GetBlockReceivedStatus() == 3)\n        {\n            Trade_Memcpy(sTradeMenu->giftRibbons, gBlockRecvBuffer[id ^ 1], sizeof(sTradeMenu->giftRibbons));\n            ResetBlockReceivedFlags();\n            sTradeMenu->bufferPartyState++;\n        }\n        break;\n    case 21:\n        for (i = 0, mon = gEnemyParty; i < PARTY_SIZE; mon++, i++)\n        {\n            u8 name[POKEMON_NAME_LENGTH + 1];\n            u16 species = GetMonData(mon, MON_DATA_SPECIES);\n\n            if (species != SPECIES_NONE)\n            {\n                if (species == SPECIES_SHEDINJA && GetMonData(mon, MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE)\n                {\n                    GetMonData(mon, MON_DATA_NICKNAME, name);\n\n                    if (!StringCompareWithoutExtCtrlCodes(name, sText_ShedinjaJP))\n                        SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[SPECIES_SHEDINJA]);\n                }\n            }\n        }\n        return TRUE;\n    // Delay until next state\n    case 2:\n    case 6:\n    case 10:\n    case 14:\n    case 18:\n        sTradeMenu->timer++;\n        if (sTradeMenu->timer > 10)\n        {\n            sTradeMenu->timer = 0;\n            sTradeMenu->bufferPartyState++;\n        }\n        break;\n    }\n    return FALSE;\n}\n\nstatic void PrintIsThisTradeOkay(void)\n{\n    DrawBottomRowText(gText_IsThisTradeOkay, (u8 *)OBJ_VRAM0 + sTradeMenu->bottomTextTileStart * 32, 0x18);\n}\n\nstatic void Leader_ReadLinkBuffer(u8 mpId, u8 status)\n{\n    if (status & 1)\n    {\n        switch (gBlockRecvBuffer[0][0])\n        {\n        case LINKCMD_REQUEST_CANCEL:\n            sTradeMenu->playerSelectStatus = STATUS_CANCEL;\n            break;\n        case LINKCMD_READY_TO_TRADE:\n            sTradeMenu->playerSelectStatus = STATUS_READY;\n            break;\n        case LINKCMD_INIT_BLOCK:\n            sTradeMenu->playerConfirmStatus = STATUS_READY;\n            break;\n        case LINKCMD_READY_CANCEL_TRADE:\n            sTradeMenu->playerConfirmStatus = STATUS_CANCEL;\n            break;\n        }\n        ResetBlockReceivedFlag(0);\n    }\n\n    if (status & 2)\n    {\n        switch (gBlockRecvBuffer[1][0])\n        {\n        case LINKCMD_REQUEST_CANCEL:\n            sTradeMenu->partnerSelectStatus = STATUS_CANCEL;\n            break;\n        case LINKCMD_READY_TO_TRADE:\n            sTradeMenu->partnerCursorPosition = gBlockRecvBuffer[1][1] + PARTY_SIZE;\n            sTradeMenu->partnerSelectStatus = STATUS_READY;\n            break;\n        case LINKCMD_INIT_BLOCK:\n            sTradeMenu->partnerConfirmStatus = STATUS_READY;\n            break;\n        case LINKCMD_READY_CANCEL_TRADE:\n            sTradeMenu->partnerConfirmStatus = STATUS_CANCEL;\n            break;\n        }\n        ResetBlockReceivedFlag(1);\n    }\n}\n\nstatic void Follower_ReadLinkBuffer(u8 mpId, u8 status)\n{\n    if (status & 1)\n    {\n        switch (gBlockRecvBuffer[0][0])\n        {\n        case LINKCMD_BOTH_CANCEL_TRADE:\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            PrintTradeMessage(MSG_WAITING_FOR_FRIEND);\n            sTradeMenu->callbackId = CB_INIT_EXIT_CANCELED_TRADE;\n            break;\n        case LINKCMD_PARTNER_CANCEL_TRADE:\n            PrintTradeMessage(MSG_FRIEND_WANTS_TO_TRADE);\n            sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED;\n            break;\n        case LINKCMD_SET_MONS_TO_TRADE:\n            sTradeMenu->partnerCursorPosition = gBlockRecvBuffer[0][1] + PARTY_SIZE;\n            rbox_fill_rectangle(0);\n            SetSelectedMon(sTradeMenu->cursorPosition);\n            SetSelectedMon(sTradeMenu->partnerCursorPosition);\n            sTradeMenu->callbackId = CB_PRINT_IS_THIS_OKAY;\n            break;\n        case LINKCMD_START_TRADE:\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            sTradeMenu->callbackId = CB_WAIT_TO_START_TRADE;\n            break;\n        case LINKCMD_PLAYER_CANCEL_TRADE:\n            PrintTradeMessage(MSG_CANCELED);\n            sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED;\n        }\n        ResetBlockReceivedFlag(0);\n    }\n\n    if (status & 2)\n        ResetBlockReceivedFlag(1);\n}\n\n#define QueueLinkData(linkCmd, cursorPosition) \\\n{ \\\n    sTradeMenu->linkData[0] = (linkCmd); \\\n    sTradeMenu->linkData[1] = (cursorPosition); \\\n    QueueAction(QUEUE_DELAY_DATA, QUEUE_SEND_DATA); \\\n}\n\nstatic void Leader_HandleCommunication(void)\n{\n    if (sTradeMenu->playerSelectStatus != STATUS_NONE\n     && sTradeMenu->partnerSelectStatus != STATUS_NONE)\n    {\n        if (sTradeMenu->playerSelectStatus == STATUS_READY\n         && sTradeMenu->partnerSelectStatus == STATUS_READY)\n        {\n            // Both players have selected a pokemon to trade \n            sTradeMenu->callbackId = CB_SET_SELECTED_MONS;\n            QueueLinkData(LINKCMD_SET_MONS_TO_TRADE, sTradeMenu->cursorPosition);\n            sTradeMenu->playerSelectStatus = sTradeMenu->partnerSelectStatus = STATUS_NONE;\n        }\n        else if (sTradeMenu->playerSelectStatus == STATUS_READY\n              && sTradeMenu->partnerSelectStatus == STATUS_CANCEL)\n        {\n            // The player has selected a pokemon to trade,\n            // but the partner has selected Cancel\n            PrintTradeMessage(MSG_CANCELED);\n            QueueLinkData(LINKCMD_PARTNER_CANCEL_TRADE, 0);\n            sTradeMenu->playerConfirmStatus = sTradeMenu->partnerConfirmStatus = STATUS_NONE;\n            sTradeMenu->playerSelectStatus = sTradeMenu->partnerSelectStatus = STATUS_NONE;\n            sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED;\n        }\n        else if (sTradeMenu->playerSelectStatus == STATUS_CANCEL\n              && sTradeMenu->partnerSelectStatus == STATUS_READY)\n        {\n            // The partner has selected a pokemon to trade,\n            // but the player has selected cancel\n            PrintTradeMessage(MSG_FRIEND_WANTS_TO_TRADE);\n            QueueLinkData(LINKCMD_PLAYER_CANCEL_TRADE, 0);\n            sTradeMenu->playerConfirmStatus = sTradeMenu->partnerConfirmStatus = STATUS_NONE;\n            sTradeMenu->playerSelectStatus = sTradeMenu->partnerSelectStatus = STATUS_NONE;\n            sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED;\n        }\n        else if (sTradeMenu->playerSelectStatus == STATUS_CANCEL\n              && sTradeMenu->partnerSelectStatus == STATUS_CANCEL)\n        {\n            // Both players have selected Cancel\n            QueueLinkData(LINKCMD_BOTH_CANCEL_TRADE, 0);\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            sTradeMenu->playerSelectStatus = sTradeMenu->partnerSelectStatus = STATUS_NONE;\n            sTradeMenu->callbackId = CB_INIT_EXIT_CANCELED_TRADE;\n        }\n    }\n\n    if (sTradeMenu->playerConfirmStatus != STATUS_NONE\n     && sTradeMenu->partnerConfirmStatus != STATUS_NONE)\n    {\n        if (sTradeMenu->playerConfirmStatus == STATUS_READY\n         && sTradeMenu->partnerConfirmStatus == STATUS_READY)\n        {\n            // Both players have confirmed the trade\n            QueueLinkData(LINKCMD_START_TRADE, 0);\n            sTradeMenu->playerConfirmStatus = STATUS_NONE;\n            sTradeMenu->partnerConfirmStatus = STATUS_NONE;\n            sTradeMenu->callbackId = CB_FADE_TO_START_TRADE;\n        }\n\n        if (sTradeMenu->playerConfirmStatus == STATUS_CANCEL\n         || sTradeMenu->partnerConfirmStatus == STATUS_CANCEL)\n        {\n            // One of the players has decided not to confirm the trade,\n            // or the trade was not allowed.\n            PrintTradeMessage(MSG_CANCELED);\n            QueueLinkData(LINKCMD_PLAYER_CANCEL_TRADE, 0);\n            sTradeMenu->playerConfirmStatus = STATUS_NONE;\n            sTradeMenu->partnerConfirmStatus = STATUS_NONE;\n            sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED;\n        }\n    }\n}\n\nstatic void CB1_UpdateLink(void)\n{\n    u8 mpId = GetMultiplayerId();\n    u8 status;\n\n    if ((status = GetBlockReceivedStatus()))\n    {\n        if (mpId == 0)\n            Leader_ReadLinkBuffer(mpId, status);\n        else\n            Follower_ReadLinkBuffer(mpId, status);\n    }\n    if (mpId == 0)\n        Leader_HandleCommunication();\n}\n\nstatic u8 GetNewCursorPosition(u8 oldPosition, u8 direction)\n{\n    int i;\n    u8 newPosition = 0;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (sTradeMenu->optionsActive[sCursorMoveDestinations[oldPosition][direction][i]] == TRUE)\n        {\n            newPosition = sCursorMoveDestinations[oldPosition][direction][i];\n            break;\n        }\n    }\n\n    return newPosition;\n}\n\n\nstatic void TradeMenuMoveCursor(u8 *cursorPosition, u8 direction)\n{\n    u8 newPosition = GetNewCursorPosition(*cursorPosition, direction);\n\n    if (newPosition == PARTY_SIZE * 2) // CANCEL\n    {\n        StartSpriteAnim(&gSprites[sTradeMenu->cursorSpriteId], CURSOR_ANIM_ON_CANCEL);\n        gSprites[sTradeMenu->cursorSpriteId].x = DISPLAY_WIDTH - 16;\n        gSprites[sTradeMenu->cursorSpriteId].y = DISPLAY_HEIGHT;\n    }\n    else\n    {\n        StartSpriteAnim(&gSprites[sTradeMenu->cursorSpriteId], CURSOR_ANIM_NORMAL);\n        gSprites[sTradeMenu->cursorSpriteId].x = sTradeMonSpriteCoords[newPosition][0] * 8 + 32;\n        gSprites[sTradeMenu->cursorSpriteId].y = sTradeMonSpriteCoords[newPosition][1] * 8;\n    }\n\n    if (*cursorPosition != newPosition)\n        PlaySE(SE_SELECT);\n\n    *cursorPosition = newPosition;\n}\n\nstatic void SetReadyToTrade(void)\n{\n    PrintTradeMessage(MSG_STANDBY);\n    sTradeMenu->callbackId = CB_READY_WAIT;\n\n    if (GetMultiplayerId() == 1)\n    {\n        // Communicate to the link leader that we're ready to trade\n        sTradeMenu->linkData[0] = LINKCMD_READY_TO_TRADE;\n        sTradeMenu->linkData[1] = sTradeMenu->cursorPosition;\n        SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20);\n    }\n    else\n    {\n        // We are the link leader, no communication necessary\n        sTradeMenu->playerSelectStatus = STATUS_READY;\n    }\n}\n\nstatic void CB_ProcessMenuInput(void)\n{\n    int i;\n\n    if (JOY_REPT(DPAD_UP))\n        TradeMenuMoveCursor(&sTradeMenu->cursorPosition, DIR_UP);\n    else if (JOY_REPT(DPAD_DOWN))\n        TradeMenuMoveCursor(&sTradeMenu->cursorPosition, DIR_DOWN);\n    else if (JOY_REPT(DPAD_LEFT))\n        TradeMenuMoveCursor(&sTradeMenu->cursorPosition, DIR_LEFT);\n    else if (JOY_REPT(DPAD_RIGHT))\n        TradeMenuMoveCursor(&sTradeMenu->cursorPosition, DIR_RIGHT);\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n\n        if (sTradeMenu->cursorPosition < PARTY_SIZE)\n        {\n            // Selected pokemon in player's party\n            DrawTextBorderOuter(1, 1, 14);\n            FillWindowPixelBuffer(1, PIXEL_FILL(1));\n            PrintMenuTable(1, FONT_NORMAL_COPY_2, 16, ARRAY_COUNT(sMenuAction_SummaryTrade), sMenuAction_SummaryTrade);\n            Menu_InitCursor(1, FONT_NORMAL_COPY_2, 0, 0, 16, 2, 0);\n            PutWindowTilemap(1);\n            CopyWindowToVram(1, COPYWIN_FULL);\n            sTradeMenu->callbackId = CB_SELECTED_MON;\n        }\n        else if (sTradeMenu->cursorPosition < PARTY_SIZE * 2)\n        {\n            // Selected pokemon in partner's party\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            sTradeMenu->callbackId = CB_SHOW_MON_SUMMARY;\n        }\n        else if (sTradeMenu->cursorPosition == PARTY_SIZE * 2)\n        {\n            // Selected Cancel\n            CreateYesNoMenu(&sWindowTemplate_YesNo, FONT_NORMAL_COPY_2, 0, 2, 0x001, 14, 0);\n            sTradeMenu->callbackId = CB_CANCEL_TRADE_PROMPT;\n            DrawBottomRowText(sActionTexts[TEXT_CANCEL_TRADE], (void *)OBJ_VRAM0 + sTradeMenu->bottomTextTileStart * 32, 24);\n        }\n    }\n\n    // This option is unavailable in Emerald\n    if (JOY_NEW(R_BUTTON))\n    {\n        for (i = 0; i < 10; i++)\n            sTradeMenu->linkData[i] = i;\n        SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20);\n    }\n}\n\nstatic void RedrawChooseAPokemonWindow(void)\n{\n    PrintTradePartnerPartyNicknames();\n    sTradeMenu->callbackId = CB_MAIN_MENU;\n    gSprites[sTradeMenu->cursorSpriteId].invisible = FALSE;\n    DrawBottomRowText(sActionTexts[TEXT_CHOOSE_MON], (void *)OBJ_VRAM0 + sTradeMenu->bottomTextTileStart * 32, 24);\n}\n\nstatic void CB_ProcessSelectedMonInput(void)\n{\n    switch (Menu_ProcessInputNoWrapAround())\n    {\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        RedrawChooseAPokemonWindow();\n        break;\n    case MENU_NOTHING_CHOSEN:\n        break;\n    case 0: // Summary\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sTradeMenu->callbackId = CB_SHOW_MON_SUMMARY;\n        break;\n    case 1: // Trade\n        switch (CanTradeSelectedMon(gPlayerParty, gPlayerPartyCount, sTradeMenu->cursorPosition))\n        {\n        case CAN_TRADE_MON:\n            SetReadyToTrade();\n            gSprites[sTradeMenu->cursorSpriteId].invisible = TRUE;\n            break;\n        case CANT_TRADE_LAST_MON:\n            QueueAction(QUEUE_DELAY_MSG, QUEUE_ONLY_MON2);\n            sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED;\n            break;\n        case CANT_TRADE_NATIONAL:\n        case CANT_TRADE_INVALID_MON:\n            QueueAction(QUEUE_DELAY_MSG, QUEUE_MON_CANT_BE_TRADED);\n            sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED;\n            break;\n        case CANT_TRADE_EGG_YET:\n        case CANT_TRADE_PARTNER_EGG_YET:\n            QueueAction(QUEUE_DELAY_MSG, QUEUE_EGG_CANT_BE_TRADED);\n            sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED;\n            break;\n        }\n        break;\n    }\n}\n\nstatic void CB_ChooseMonAfterButtonPress(void)\n{\n    if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        RedrawChooseAPokemonWindow();\n    }\n}\n\nstatic void CB_ShowTradeMonSummaryScreen(void)\n{\n    if (!gPaletteFade.active)\n    {\n        if (sTradeMenu->cursorPosition < PARTY_SIZE)\n            ShowPokemonSummaryScreen(gPlayerParty, sTradeMenu->cursorPosition, sTradeMenu->partyCounts[0] - 1, CB2_ReturnToTradeMenuFromSummary, PSS_MODE_TRADE);\n        else\n            ShowPokemonSummaryScreen(gEnemyParty, sTradeMenu->cursorPosition - PARTY_SIZE, sTradeMenu->partyCounts[1] - 1, CB2_ReturnToTradeMenuFromSummary, PSS_MODE_TRADE);\n        FreeAllWindowBuffers();\n    }\n}\n\nstatic u8 CheckValidityOfTradeMons(u8 *aliveMons, u8 playerPartyCount, u8 cursorPos)\n{\n    s32 i;\n    u16 partnerSpecies;\n    u8 hasLiveMon = 0;\n\n    // Make sure mon to be traded isn't player's last alive mon\n    for (i = 0; i < playerPartyCount; i++)\n    {\n        if (cursorPos != i)\n            hasLiveMon += aliveMons[i];\n    }\n\n    // Partner cant trade illegitimate Deoxys or Mew\n    partnerSpecies = GetMonData(&gEnemyParty[sTradeMenu->partnerCursorPosition % PARTY_SIZE], MON_DATA_SPECIES);\n    if ((partnerSpecies == SPECIES_DEOXYS || partnerSpecies == SPECIES_MEW)\n        && !GetMonData(&gEnemyParty[sTradeMenu->partnerCursorPosition % PARTY_SIZE], MON_DATA_MODERN_FATEFUL_ENCOUNTER))\n        return PARTNER_MON_INVALID;\n\n    if (hasLiveMon != 0)\n        hasLiveMon = BOTH_MONS_VALID;\n\n    return hasLiveMon; // PLAYER_MON_INVALID or BOTH_MONS_VALID\n}\n\nstatic void CommunicateWhetherMonCanBeTraded(void)\n{\n    int i;\n    u8 aliveMons[PARTY_SIZE * 2];\n\n    for (i = 0; i < sTradeMenu->partyCounts[TRADE_PLAYER]; i++)\n        aliveMons[i] = sTradeMenu->isLiveMon[TRADE_PLAYER][i];\n\n    switch (CheckValidityOfTradeMons(aliveMons, sTradeMenu->partyCounts[0], sTradeMenu->cursorPosition))\n    {\n    case PLAYER_MON_INVALID:\n        QueueAction(QUEUE_DELAY_MSG, QUEUE_ONLY_MON2);\n        sTradeMenu->linkData[0] = LINKCMD_READY_CANCEL_TRADE;\n        QueueAction(180, QUEUE_SEND_DATA);\n        break;\n    case BOTH_MONS_VALID:\n        QueueAction(QUEUE_DELAY_MSG, QUEUE_STANDBY);\n        sTradeMenu->linkData[0] = LINKCMD_INIT_BLOCK;\n        if (IsLinkTaskFinished())\n            SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20);\n        break;\n    case PARTNER_MON_INVALID:\n        QueueAction(QUEUE_DELAY_MSG, QUEUE_FRIENDS_MON_CANT_BE_TRADED);\n        sTradeMenu->linkData[0] = LINKCMD_READY_CANCEL_TRADE;\n        QueueAction(180, QUEUE_SEND_DATA);\n        break;\n    default:\n        // Both pokemon are valid to trade\n        break;\n    }\n}\n\nstatic void CB_ProcessConfirmTradeInput(void)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0: // YES, Confirm selection\n        CommunicateWhetherMonCanBeTraded();\n        sTradeMenu->callbackId = CB_IDLE;\n        PutWindowTilemap(17);\n        break;\n    case 1: // NO, Cancel Trade\n    case MENU_B_PRESSED:\n        QueueAction(QUEUE_DELAY_MSG, QUEUE_STANDBY);\n        if (IsLinkTaskFinished())\n        {\n            sTradeMenu->linkData[0] = LINKCMD_READY_CANCEL_TRADE;\n            SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20);\n        }\n        sTradeMenu->callbackId = CB_IDLE;\n        PutWindowTilemap(17);\n        break;\n    }\n}\n\n// Only when choosing Yes to cancel, when No is chosen all are redrawn anyway\nstatic void RestoreNicknamesCoveredByYesNo(void)\n{\n    int i;\n\n    for (i = 0; i < sTradeMenu->partyCounts[1] - 4; i++)\n    {\n        PutWindowTilemap(i + PARTY_SIZE * 2);\n        CopyWindowToVram(i + PARTY_SIZE * 2, COPYWIN_MAP);\n    }\n}\n\nstatic void CB_ProcessCancelTradeInput(void)\n{\n    switch (Menu_ProcessInputNoWrapClearOnChoose())\n    {\n    case 0: // YES, Cancel\n        PrintTradeMessage(MSG_WAITING_FOR_FRIEND);\n        QueueLinkData(LINKCMD_REQUEST_CANCEL, 0);\n        gSprites[sTradeMenu->cursorSpriteId].invisible = TRUE;\n        sTradeMenu->callbackId = CB_IDLE;\n        RestoreNicknamesCoveredByYesNo();\n        break;\n    case 1: // NO, Continue\n    case MENU_B_PRESSED:\n        PlaySE(SE_SELECT);\n        RedrawChooseAPokemonWindow();\n        break;\n    }\n}\n\nstatic void CB_SetSelectedMons(void)\n{\n    if (GetMultiplayerId() == 0)\n    {\n        rbox_fill_rectangle(0);\n        SetSelectedMon(sTradeMenu->cursorPosition);\n        SetSelectedMon(sTradeMenu->partnerCursorPosition);\n    }\n    sTradeMenu->callbackId = CB_PRINT_IS_THIS_OKAY;\n}\n\nstatic void CB_PrintIsThisTradeOkay(void)\n{\n    if (sTradeMenu->drawSelectedMonState[TRADE_PLAYER] == DRAW_SELECTED_FINISH\n     && sTradeMenu->drawSelectedMonState[TRADE_PARTNER] == DRAW_SELECTED_FINISH)\n    {\n        PrintIsThisTradeOkay();\n        sTradeMenu->callbackId = CB_INIT_CONFIRM_TRADE_PROMPT;\n    }\n}\n\nstatic void CB_InitConfirmTradePrompt(void)\n{\n    sTradeMenu->timer++;\n    if (sTradeMenu->timer > 120)\n    {\n        CreateYesNoMenu(&sWindowTemplate_YesNo, FONT_NORMAL_COPY_2, 0, 2, 1, 14, 0);\n        sTradeMenu->timer = 0;\n        sTradeMenu->callbackId = CB_CONFIRM_TRADE_PROMPT;\n    }\n}\n\nstatic void CB_HandleTradeCanceled(void)\n{\n    int i;\n\n    if (JOY_NEW(A_BUTTON))\n    {\n        PlaySE(SE_SELECT);\n        rbox_fill_rectangle(0);\n        rbox_fill_rectangle(1);\n\n        for (i = 0; i < 4; i++)\n        {\n            FillWindowPixelBuffer(i + 14, PIXEL_FILL(0));\n            rbox_fill_rectangle(i + 14);\n        }\n\n        RedrawPartyWindow(TRADE_PLAYER);\n        RedrawPartyWindow(TRADE_PARTNER);\n        sTradeMenu->callbackId = CB_MAIN_MENU;\n        gSprites[sTradeMenu->cursorSpriteId].invisible = FALSE;\n    }\n}\n\nstatic void CB_InitExitCanceledTrade(void)\n{\n    if (!gPaletteFade.active)\n    {\n        if (gWirelessCommType)\n            SetLinkStandbyCallback();\n        else\n            SetCloseLinkCallbackAndType(12);\n\n        sTradeMenu->callbackId = CB_EXIT_CANCELED_TRADE;\n    }\n}\n\nstatic void CB_ExitCanceledTrade(void)\n{\n    if (gWirelessCommType)\n    {\n        if (IsLinkTaskFinished())\n        {\n            Free(sMenuTextTileBuffer);\n            Free(sTradeMenu);\n            FreeAllWindowBuffers();\n            DestroyWirelessStatusIndicatorSprite();\n            SetMainCallback2(CB2_ReturnToFieldFromMultiplayer);\n        }\n    }\n    else\n    {\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            Free(sMenuTextTileBuffer);\n            Free(sTradeMenu);\n            FreeAllWindowBuffers();\n            SetMainCallback2(CB2_ReturnToFieldFromMultiplayer);\n        }\n    }\n}\n\nstatic void CB_WaitToStartRfuTrade(void)\n{\n    if (!Rfu_SetLinkRecovery(FALSE))\n    {\n        SetLinkStandbyCallback();\n        sTradeMenu->callbackId = CB_START_LINK_TRADE;\n    }\n}\n\nstatic void RunTradeMenuCallback(void)\n{\n    switch (sTradeMenu->callbackId)\n    {\n    case CB_MAIN_MENU:\n        CB_ProcessMenuInput();\n        break;\n    case CB_SELECTED_MON:\n        CB_ProcessSelectedMonInput();\n        break;\n    case CB_SHOW_MON_SUMMARY:\n        CB_ShowTradeMonSummaryScreen();\n        break;\n    case CB_CONFIRM_TRADE_PROMPT:\n        CB_ProcessConfirmTradeInput();\n        break;\n    case CB_CANCEL_TRADE_PROMPT:\n        CB_ProcessCancelTradeInput();\n        break;\n    case CB_READY_WAIT:\n        // nop\n        break;\n    case CB_SET_SELECTED_MONS:\n        CB_SetSelectedMons();\n        break;\n    case CB_PRINT_IS_THIS_OKAY:\n        CB_PrintIsThisTradeOkay();\n        break;\n    case CB_HANDLE_TRADE_CANCELED:\n        CB_HandleTradeCanceled();\n        break;\n    case CB_FADE_TO_START_TRADE:\n        CB_FadeToStartTrade();\n        break;\n    case CB_WAIT_TO_START_TRADE:\n        CB_WaitToStartTrade();\n        break;\n    case CB_INIT_EXIT_CANCELED_TRADE:\n        CB_InitExitCanceledTrade();\n        break;\n    case CB_EXIT_CANCELED_TRADE:\n        CB_ExitCanceledTrade();\n        break;\n    case CB_START_LINK_TRADE:\n        CB_StartLinkTrade();\n        break;\n    case CB_INIT_CONFIRM_TRADE_PROMPT:\n        CB_InitConfirmTradePrompt();\n        break;\n    case CB_UNUSED_CLOSE_MSG:\n        CB_ChooseMonAfterButtonPress();\n        break;\n    case CB_WAIT_TO_START_RFU_TRADE:\n        CB_WaitToStartRfuTrade();\n        break;\n    }\n    // CB_IDLE is nop\n}\n\nstatic void SetSelectedMon(u8 cursorPosition)\n{\n    // cursorPosition 0-5 are the player's mons, 6-11 are the partner's\n    u8 whichParty = cursorPosition / PARTY_SIZE;\n\n    if (sTradeMenu->drawSelectedMonState[whichParty] == 0)\n    {\n        // Start the animation to display just the selected\n        // pokemon in the middle of the screen\n        sTradeMenu->drawSelectedMonState[whichParty] = 1;\n        sTradeMenu->selectedMonIdx[whichParty] = cursorPosition;\n    }\n}\n\nstatic void DrawSelectedMonScreen(u8 whichParty)\n{\n    s8 nameStringWidth;\n    u8 nickname[20];\n    u8 movesString[56];\n    u8 i;\n    u8 partyIdx;\n    u8 selectedMonParty;\n    u8 selectedMonIdx = sTradeMenu->selectedMonIdx[whichParty];\n\n    selectedMonParty = TRADE_PARTNER;\n    if (sTradeMenu->selectedMonIdx[whichParty] < PARTY_SIZE)\n        selectedMonParty = TRADE_PLAYER;\n    partyIdx = selectedMonIdx % PARTY_SIZE;\n    nameStringWidth = 0;\n\n    switch (sTradeMenu->drawSelectedMonState[whichParty])\n    {\n    default:\n        // Idle while state is 0, and once it reaches the final state (DRAW_SELECTED_FINISH)\n        break;\n    case 1:\n        // Erase the rest of the party\n        for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++)\n            gSprites[sTradeMenu->partySpriteIds[selectedMonParty][i]].invisible = TRUE;\n        for (i = 0; i < PARTY_SIZE; i++)\n            ClearWindowTilemap(i + (whichParty * PARTY_SIZE + 2));\n\n        // Re-display the selected pokemon\n        gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].invisible = FALSE;\n\n        // Move the selected pokemon to the center\n        gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].data[0] = 20;\n        gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].data[2] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0]\n                                                                                  + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14;\n        gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].data[4] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][1] * 8) - 12;\n        StoreSpriteCallbackInData6(&gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]], SpriteCB_MonIcon);\n        sTradeMenu->drawSelectedMonState[whichParty]++;\n        Trade_MoveSelectedMonToTarget(&gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]]);\n        \n        CopyToBgTilemapBufferRect_ChangePalette(1, sTradePartyBoxTilemap, whichParty * 15, 0, 15, 17, 0);\n        CopyBgTilemapBufferToVram(1);\n        CopyBgTilemapBufferToVram(0);\n\n        if (selectedMonParty == TRADE_PLAYER)\n            PrintTradePartnerPartyNicknames();\n        break;\n    case 2:\n        // Wait for the selected pokemon's sprite to move to the correct position\n        if (gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].callback == SpriteCB_MonIcon)\n            sTradeMenu->drawSelectedMonState[whichParty] = 3;\n        break;\n    case 3:\n        // Redisplay the bg box\n        CopyToBgTilemapBufferRect_ChangePalette(1, sTradeMovesBoxTilemap, selectedMonParty * 15, 0, 15, 17, 0);\n        CopyBgTilemapBufferToVram(1);\n\n        // Finalize the selected pokemon's position\n        gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].x = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0]\n                                                                            + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14;\n        gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].y = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][1] * 8) - 12;\n        gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].x2 = 0;\n        gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].y2 = 0;\n\n        // Print selected pokemon's name and moves\n        nameStringWidth = GetMonNicknameWidth(nickname, selectedMonParty, partyIdx);\n        AddTextPrinterParameterized3((whichParty * 2) + 14, FONT_SMALL, (80 - nameStringWidth) / 2, 4, sTextColor_PartyMonNickname, 0, nickname);\n        BufferMovesString(movesString, selectedMonParty, partyIdx);\n        AddTextPrinterParameterized4((whichParty * 2) + 15, FONT_NORMAL_COPY_1, 0, 0, 0, 0, sTextColor_PartyMonNickname, 0, movesString);\n        PutWindowTilemap((whichParty * 2) + 14);\n        CopyWindowToVram((whichParty * 2) + 14, COPYWIN_FULL);\n        PutWindowTilemap((whichParty * 2) + 15);\n        CopyWindowToVram((whichParty * 2) + 15, COPYWIN_FULL);\n\n        sTradeMenu->drawSelectedMonState[whichParty]++;\n        break;\n    case 4:\n        PrintLevelAndGender(whichParty, partyIdx,\n            sSelectedMonLevelGenderCoords[whichParty][0] + 4,\n            sSelectedMonLevelGenderCoords[whichParty][1] + 1,\n            sSelectedMonLevelGenderCoords[whichParty][0],\n            sSelectedMonLevelGenderCoords[whichParty][1]);\n        sTradeMenu->drawSelectedMonState[whichParty]++;\n        break;\n    }\n}\n\nstatic u8 GetMonNicknameWidth(u8 *dest, u8 whichParty, u8 partyIdx)\n{\n    u8 nickname[POKEMON_NAME_LENGTH];\n    if (whichParty == TRADE_PLAYER)\n        GetMonData(&gPlayerParty[partyIdx], MON_DATA_NICKNAME, nickname);\n    else\n        GetMonData(&gEnemyParty[partyIdx], MON_DATA_NICKNAME, nickname);\n    StringCopy_Nickname(dest, nickname);\n    return GetStringWidth(FONT_SMALL, dest, GetFontAttribute(FONT_SMALL, FONTATTR_LETTER_SPACING));\n}\n\nstatic void BufferMovesString(u8 *movesString, u8 whichParty, u8 partyIdx)\n{\n    u16 moves[MAX_MON_MOVES];\n    u32 i;\n\n    if (!sTradeMenu->isEgg[whichParty][partyIdx])\n    {\n        for (i = 0; i < MAX_MON_MOVES; i++)\n        {\n            if (whichParty == TRADE_PLAYER)\n                moves[i] = GetMonData(&gPlayerParty[partyIdx], i + MON_DATA_MOVE1, NULL);\n            else\n                moves[i] = GetMonData(&gEnemyParty[partyIdx], i + MON_DATA_MOVE1, NULL);\n        }\n\n        StringCopy(movesString, sText_Dummy);\n\n        for (i = 0; i < MAX_MON_MOVES; i++)\n        {\n            if (moves[i] != MOVE_NONE)\n                StringAppend(movesString, gMoveNames[moves[i]]);\n\n            StringAppend(movesString, sText_Newline);\n        }\n    }\n    else\n    {\n        StringCopy(movesString, sText_Dummy);\n        StringAppend(movesString, gText_4Qmark);\n    }\n}\n\nstatic void PrintPartyMonNickname(u8 whichParty, u8 windowId, const u8 *str)\n{\n    u8 xPos;\n    s8 speed;\n    windowId += (whichParty * PARTY_SIZE) + 2;\n    speed = 0;\n    xPos = (64u - GetStringWidth(FONT_SMALL, str, GetFontAttribute(FONT_SMALL, FONTATTR_LETTER_SPACING))) / 2;\n    AddTextPrinterParameterized3(windowId, FONT_SMALL, xPos, 4, sTextColor_PartyMonNickname, speed, str);\n    PutWindowTilemap(windowId);\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void PrintPartyNicknames(u8 whichParty)\n{\n    u8 buff[20];\n    u8 nickname[30];\n    struct Pokemon * party = (whichParty == TRADE_PLAYER) ? gPlayerParty : gEnemyParty;\n    u8 i;\n    for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++)\n    {\n        GetMonData(&party[i], MON_DATA_NICKNAME, buff);\n        StringCopy_Nickname(nickname, buff);\n        PrintPartyMonNickname(whichParty, i, nickname);\n    }\n}\n\nstatic void PrintLevelAndGender(u8 whichParty, u8 monIdx, u8 x, u8 y, u8 winLeft, u8 winTop)\n{\n    u8 level;\n    u32 symbolTile;\n    u8 gender;\n    u8 nickname[POKEMON_NAME_LENGTH];\n\n    CopyToBgTilemapBufferRect_ChangePalette(1, gTradeMenuMonBox_Tilemap, winLeft, winTop, 6, 3, 0);\n    CopyBgTilemapBufferToVram(1);\n\n    if (whichParty == TRADE_PLAYER)\n        level = GetMonData(&gPlayerParty[monIdx], MON_DATA_LEVEL, NULL);\n    else\n        level = GetMonData(&gEnemyParty[monIdx], MON_DATA_LEVEL, NULL);\n\n    if (!sTradeMenu->isEgg[whichParty][monIdx])\n    {\n        if (level / 10 != 0)\n            sTradeMenu->tilemapBuffer[x + (y * 32)] = (level / 10) + 0x60;\n\n        sTradeMenu->tilemapBuffer[x + (y * 32) + 1] = (level % 10) + 0x70;\n    }\n    else\n    {\n        sTradeMenu->tilemapBuffer[x + (y * 32) - 32] = sTradeMenu->tilemapBuffer[x + (y * 32) - 33];\n        sTradeMenu->tilemapBuffer[x + (y * 32) - 31] = sTradeMenu->tilemapBuffer[x + (y * 32) - 36] | 0x400;\n    }\n\n    if (sTradeMenu->isEgg[whichParty][monIdx])\n    {\n        symbolTile = 0x480;\n    }\n    else\n    {\n        if (whichParty == TRADE_PLAYER)\n        {\n            gender = GetMonGender(&gPlayerParty[monIdx]);\n            GetMonData(&gPlayerParty[monIdx], MON_DATA_NICKNAME, nickname);\n        }\n        else\n        {\n            gender = GetMonGender(&gEnemyParty[monIdx]);\n            GetMonData(&gEnemyParty[monIdx], MON_DATA_NICKNAME, nickname);\n        }\n\n        switch (gender)\n        {\n        case MON_MALE:\n            symbolTile = !NameHasGenderSymbol(nickname, MON_MALE) ? 0x84 : 0x83;\n            break;\n        case MON_FEMALE:\n            symbolTile = !NameHasGenderSymbol(nickname, MON_FEMALE) ? 0x85 : 0x83;\n            break;\n        default:\n            symbolTile = 0x83;\n            break;\n        }\n    }\n    sTradeMenu->tilemapBuffer[(y - 1) * 32 + x + 1] = symbolTile;\n}\n\nstatic void PrintPartyLevelsAndGenders(u8 whichParty)\n{\n    s32 i;\n    for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++)\n    {\n        s32 j = i + PARTY_SIZE * whichParty;\n        PrintLevelAndGender(\n            whichParty,\n            i,\n            sTradeMonLevelCoords[j][0],\n            sTradeMonLevelCoords[j][1],\n            sTradeMonBoxCoords[j][0],\n            sTradeMonBoxCoords[j][1]\n        );\n    }\n}\n\nstatic void ShowTradePartyMonIcons(u8 whichParty)\n{\n    int i;\n\n    for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++)\n    {\n        gSprites[sTradeMenu->partySpriteIds[whichParty][i]].invisible = FALSE;\n        gSprites[sTradeMenu->partySpriteIds[whichParty][i]].x = sTradeMonSpriteCoords[(whichParty * PARTY_SIZE) + i][0] * 8 + 14;\n        gSprites[sTradeMenu->partySpriteIds[whichParty][i]].y = sTradeMonSpriteCoords[(whichParty * PARTY_SIZE) + i][1] * 8 - 12;\n        gSprites[sTradeMenu->partySpriteIds[whichParty][i]].x2 = 0;\n        gSprites[sTradeMenu->partySpriteIds[whichParty][i]].y2 = 0;\n    }\n}\n\nstatic void PrintTradePartnerPartyNicknames(void)\n{\n    rbox_fill_rectangle(1);\n    PrintPartyNicknames(1);\n}\n\n// Returning to the party selection screen from the \"is this trade ok?\" screen\nstatic void RedrawPartyWindow(u8 whichParty)\n{\n    CopyToBgTilemapBufferRect_ChangePalette(1, sTradePartyBoxTilemap, 15 * whichParty, 0, 15, 17, 0);\n    CopyBgTilemapBufferToVram(1);\n    PrintPartyLevelsAndGenders(whichParty);\n    PrintPartyNicknames(whichParty);\n    ShowTradePartyMonIcons(whichParty);\n    DrawBottomRowText(sActionTexts[TEXT_CHOOSE_MON], (void *)OBJ_VRAM0 + 32 * sTradeMenu->bottomTextTileStart, 24);\n    sTradeMenu->drawSelectedMonState[whichParty] = 0;\n}\n\nstatic void Task_DrawSelectionSummary(u8 taskId)\n{\n    FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);\n    CopyBgTilemapBufferToVram(0);\n}\n\nstatic void Task_DrawSelectionTrade(u8 taskId)\n{\n    FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);\n    CopyBgTilemapBufferToVram(0);\n}\n\nstatic void QueueAction(u16 delay, u8 actionId)\n{\n    int i;\n    for (i = 0; i < (int)ARRAY_COUNT(sTradeMenu->queuedActions); i++)\n    {\n        // Find first available spot\n        if (!sTradeMenu->queuedActions[i].active)\n        {\n            sTradeMenu->queuedActions[i].delay = delay;\n            sTradeMenu->queuedActions[i].actionId = actionId;\n            sTradeMenu->queuedActions[i].active = TRUE;\n            break;\n        }\n    }\n}\n\nstatic void DoQueuedActions(void)\n{\n    int i;\n\n    for (i = 0; i < (int)ARRAY_COUNT(sTradeMenu->queuedActions); i++)\n    {\n        if (sTradeMenu->queuedActions[i].active)\n        {\n            if (sTradeMenu->queuedActions[i].delay != 0)\n            {\n                sTradeMenu->queuedActions[i].delay--;\n            }\n            else\n            {\n                switch (sTradeMenu->queuedActions[i].actionId)\n                {\n                case QUEUE_SEND_DATA:\n                    SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20);\n                    break;\n                case QUEUE_STANDBY:\n                    PrintTradeMessage(MSG_STANDBY);\n                    break;\n                case QUEUE_ONLY_MON1:\n                    PrintTradeMessage(MSG_ONLY_MON1);\n                    break;\n                case QUEUE_ONLY_MON2:\n                case QUEUE_UNUSED1:\n                case QUEUE_UNUSED2:\n                    PrintTradeMessage(MSG_ONLY_MON2);\n                    break;\n                case QUEUE_MON_CANT_BE_TRADED:\n                    PrintTradeMessage(MSG_MON_CANT_BE_TRADED);\n                    break;\n                case QUEUE_EGG_CANT_BE_TRADED:\n                    PrintTradeMessage(MSG_EGG_CANT_BE_TRADED);\n                    break;\n                case QUEUE_FRIENDS_MON_CANT_BE_TRADED:\n                    PrintTradeMessage(MSG_FRIENDS_MON_CANT_BE_TRADED);\n                    break;\n                }\n                sTradeMenu->queuedActions[i].active = FALSE;\n            }\n        }\n    }\n}\n\nstatic void PrintTradeMessage(u8 messageId)\n{\n    FillWindowPixelBuffer(0, PIXEL_FILL(1));\n    AddTextPrinterParameterized(0, FONT_NORMAL_COPY_2, sMessages[messageId], 0, 2, TEXT_SKIP_DRAW, NULL);\n    DrawTextBorderOuter(0, 0x014, 12);\n    PutWindowTilemap(0);\n    CopyWindowToVram(0, COPYWIN_FULL);\n}\n\nstatic bool8 LoadUISpriteGfx(void)\n{\n    struct SpriteSheet sheet;\n\n    if (sTradeMenu->timer < NUM_MENU_TEXT_SPRITES)\n    {\n        sheet.data = sMenuTextTileBuffers[sTradeMenu->timer];\n        sheet.size = 0x100;\n        sheet.tag = GFXTAG_MENU_TEXT + sTradeMenu->timer;\n    }\n\n    switch (sTradeMenu->timer)\n    {\n    case GFXTAG_PLAYER_NAME_L:\n    case GFXTAG_PLAYER_NAME_M:\n    case GFXTAG_PLAYER_NAME_R:\n    case GFXTAG_PARTNER_NAME_L:\n    case GFXTAG_PARTNER_NAME_M:\n    case GFXTAG_PARTNER_NAME_R:\n    case GFXTAG_CANCEL_L:\n    case GFXTAG_CANCEL_R:\n        LoadSpriteSheet(&sheet);\n        sTradeMenu->timer++;\n        break;\n    case GFXTAG_CHOOSE_PKMN_L:\n        sTradeMenu->bottomTextTileStart = LoadSpriteSheet(&sheet);\n        sTradeMenu->timer++;\n        break;\n    case GFXTAG_CHOOSE_PKMN_M:\n    case GFXTAG_CHOOSE_PKMN_R:\n    case GFXTAG_CHOOSE_PKMN_EMPTY_1:\n    case GFXTAG_CHOOSE_PKMN_EMPTY_2:\n    case GFXTAG_CHOOSE_PKMN_EMPTY_3:\n        LoadSpriteSheet(&sheet);\n        sTradeMenu->timer++;\n        break;\n    case NUM_MENU_TEXT_SPRITES:\n        LoadSpritePalette(&sSpritePalette_MenuText);\n        sTradeMenu->timer++;\n        break;\n    case NUM_MENU_TEXT_SPRITES + 1:\n        LoadSpritePalette(&sCursor_SpritePalette);\n        sTradeMenu->timer++;\n        break;\n    case NUM_MENU_TEXT_SPRITES + 2:\n        LoadSpriteSheet(&sCursor_SpriteSheet);\n        sTradeMenu->timer++;\n        break;\n    case NUM_MENU_TEXT_SPRITES + 3:\n        sTradeMenu->timer = 0;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic void DrawBottomRowText(const u8 *name, u8 *dest, u8 unused)\n{\n    DrawTextWindowAndBufferTiles(name, dest, 0, 0, gDecompressionBuffer, 6);\n}\n\nstatic void ComputePartyTradeableFlags(u8 whichParty)\n{\n    int i;\n\n    switch (whichParty)\n    {\n    case TRADE_PLAYER:\n        for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++)\n        {\n            if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) == TRUE)\n            {\n                sTradeMenu->isLiveMon[whichParty][i] = FALSE;\n                sTradeMenu->isEgg[whichParty][i] = TRUE;\n            }\n            else if (GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0)\n            {\n                sTradeMenu->isLiveMon[whichParty][i] = FALSE;\n                sTradeMenu->isEgg[whichParty][i] = FALSE;\n            }\n            else\n            {\n                sTradeMenu->isLiveMon[whichParty][i] = TRUE;\n                sTradeMenu->isEgg[whichParty][i] = FALSE;\n            }\n        }\n        break;\n    case TRADE_PARTNER:\n        for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++)\n        {\n            if (GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG) == TRUE)\n            {\n                sTradeMenu->isLiveMon[whichParty][i] = FALSE;\n                sTradeMenu->isEgg[whichParty][i] = TRUE;\n            }\n            else if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0)\n            {\n                sTradeMenu->isLiveMon[whichParty][i] = FALSE;\n                sTradeMenu->isEgg[whichParty][i] = FALSE;\n            }\n            else\n            {\n                sTradeMenu->isLiveMon[whichParty][i] = TRUE;\n                sTradeMenu->isEgg[whichParty][i] = FALSE;\n            }\n        }\n        break;\n    }\n}\n\nstatic void ComputePartyHPBarLevels(u8 whichParty)\n{\n    u16 i, curHp, maxHp;\n\n    switch (whichParty)\n    {\n    case TRADE_PLAYER:\n        for (i = 0; i < sTradeMenu->partyCounts[TRADE_PLAYER]; i++)\n        {\n            curHp = GetMonData(&gPlayerParty[i], MON_DATA_HP);\n            maxHp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);\n            sTradeMenu->hpBarLevels[TRADE_PLAYER][i] = GetHPBarLevel(curHp, maxHp);\n        }\n        break;\n    case TRADE_PARTNER:\n        for (i = 0; i < sTradeMenu->partyCounts[TRADE_PARTNER]; i++)\n        {\n            curHp = GetMonData(&gEnemyParty[i], MON_DATA_HP);\n            maxHp = GetMonData(&gEnemyParty[i], MON_DATA_MAX_HP);\n            sTradeMenu->hpBarLevels[TRADE_PARTNER][i] = GetHPBarLevel(curHp, maxHp);\n        }\n        break;\n    }\n}\n\nstatic void SetTradePartyHPBarSprites(void)\n{\n    int i, j;\n    for (i = 0; i < 2; i++)\n    {\n        for (j = 0; j < sTradeMenu->partyCounts[i]; j++)\n            SetPartyHPBarSprite(&gSprites[sTradeMenu->partySpriteIds[i][j]], 4 - sTradeMenu->hpBarLevels[i][j]);\n    }\n}\n\nstatic void SaveTradeGiftRibbons(void)\n{\n    int i;\n    for (i = 0; i < (int)ARRAY_COUNT(sTradeMenu->giftRibbons); i++)\n    {\n        if (gSaveBlock1Ptr->giftRibbons[i] == 0 && sTradeMenu->giftRibbons[i] != 0)\n            gSaveBlock1Ptr->giftRibbons[i] = sTradeMenu->giftRibbons[i];\n    }\n}\n\nstatic u32 CanTradeSelectedMon(struct Pokemon * playerParty, int partyCount, int monIdx)\n{\n    int i, numMonsLeft;\n    struct LinkPlayer * partner;\n    int species[PARTY_SIZE];\n    int species2[PARTY_SIZE];\n\n    for (i = 0; i < partyCount; i++)\n    {\n        species2[i] = GetMonData(&playerParty[i], MON_DATA_SPECIES_OR_EGG);\n        species[i] = GetMonData(&playerParty[i], MON_DATA_SPECIES);\n    }\n\n    // Prevents trading species higher than Gen 3's max\n    if (species2[monIdx] > SPECIES_EGG)\n        return CANT_TRADE_INVALID_MON;\n\n    partner = &gLinkPlayers[GetMultiplayerId() ^ 1];\n    if ((partner->version & 0xFF) != VERSION_RUBY &&\n        (partner->version & 0xFF) != VERSION_SAPPHIRE)\n    {\n        // Does partner not have National Dex\n        if (!(partner->progressFlagsCopy & 0xF))\n        {\n            if (species2[monIdx] == SPECIES_EGG)\n                return CANT_TRADE_PARTNER_EGG_YET;\n\n            if (species2[monIdx] > KANTO_SPECIES_END)\n                return CANT_TRADE_INVALID_MON;\n        }\n    }\n\n    if (species[monIdx] == SPECIES_DEOXYS || species[monIdx] == SPECIES_MEW)\n    {\n        if (!GetMonData(&playerParty[monIdx], MON_DATA_MODERN_FATEFUL_ENCOUNTER))\n            return CANT_TRADE_INVALID_MON;\n    }\n\n    // Make Eggs not count for numMonsLeft\n    for (i = 0; i < partyCount; i++)\n    {\n        if (species2[i] == SPECIES_EGG)\n            species2[i] = SPECIES_NONE;\n    }\n\n    // Count alive mons in party, excluding selected trade mon\n    for (numMonsLeft = 0, i = 0; i < partyCount; i++)\n    {\n        if (i != monIdx)\n            numMonsLeft += species2[i];\n    }\n\n    if (numMonsLeft != 0)\n        return CAN_TRADE_MON;\n    else\n        return CANT_TRADE_LAST_MON;\n}\n\ns32 GetGameProgressForLinkTrade(void)\n{\n    s32 versionId; // 0: FRLG, 1: RS, 2: Emerald (or anything else)\n    u16 version;\n\n    if (gReceivedRemoteLinkPlayers)\n    {\n        versionId = 0;\n        version = (gLinkPlayers[GetMultiplayerId() ^ 1].version & 0xFF);\n\n        if (version == VERSION_FIRE_RED || version == VERSION_LEAF_GREEN)\n            versionId = 0;\n        else if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)\n            versionId = 1;\n        else\n            versionId = 2;\n\n        // If trading with RSE, both players must have progessed the story enough\n        if (versionId > 0)\n        {\n            // Has player finished the Sevii Islands\n            if (gLinkPlayers[GetMultiplayerId()].progressFlagsCopy & 0xF0)\n            {\n                if (versionId == 2)\n                {\n                    // Is RSE partner champion\n                    if (gLinkPlayers[GetMultiplayerId() ^ 1].progressFlagsCopy & 0xF0)\n                        return TRADE_BOTH_PLAYERS_READY;\n                    else\n                        return TRADE_PARTNER_NOT_READY;\n                }\n            }\n            else\n            {\n                return TRADE_PLAYER_NOT_READY;\n            }\n        }\n    }\n    return TRADE_BOTH_PLAYERS_READY;\n}\n\nstatic bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isModernFatefulEncounter)\n{\n    if (species == SPECIES_DEOXYS || species == SPECIES_MEW)\n    {\n        if (!isModernFatefulEncounter)\n            return TRUE;\n    }\n    return FALSE;\n}\n\nint GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData player, struct RfuGameCompatibilityData partner, u16 playerSpecies2, u16 partnerSpecies, u8 requestedType, u16 playerSpecies, bool8 isModernFatefulEncounter)\n{\n    bool8 playerHasNationalDex = player.hasNationalDex;\n    bool8 playerCanLinkNationally = player.canLinkNationally;\n    bool8 partnerHasNationalDex = partner.hasNationalDex;\n    bool8 partnerCanLinkNationally = partner.canLinkNationally;\n    u8 partnerVersion = partner.version;\n    bool8 isNotFRLG;\n\n    if (partnerVersion == VERSION_FIRE_RED || partnerVersion == VERSION_LEAF_GREEN)\n        isNotFRLG = FALSE;\n    else\n        isNotFRLG = TRUE;\n\n    // If partner is not using FRLG, both players must have progressed the story\n    // to a certain point (becoming champion in RSE, finishing the Sevii islands in FRLG)\n    if (isNotFRLG)\n    {\n        if (!playerCanLinkNationally)\n            return UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_1;\n        else if (!partnerCanLinkNationally)\n            return UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_2;\n    }\n\n    // Cannot trade illegitimate Deoxys/Mew\n    if (IsDeoxysOrMewUntradable(playerSpecies, isModernFatefulEncounter))\n        return UR_TRADE_MSG_MON_CANT_BE_TRADED_2;\n\n    if (partnerSpecies == SPECIES_EGG)\n    {\n        // If partner is trading an Egg then the player must also be trading an Egg\n        if (playerSpecies2 != partnerSpecies)\n            return UR_TRADE_MSG_NOT_EGG;\n    }\n    else\n    {\n        // Player's Pokémon must be of the type the partner requested\n        if (gSpeciesInfo[playerSpecies2].types[0] != requestedType\n         && gSpeciesInfo[playerSpecies2].types[1] != requestedType)\n            return UR_TRADE_MSG_NOT_MON_PARTNER_WANTS;\n    }\n\n    // If the player is trading an Egg then the partner must also be trading an Egg\n    // 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.\n    if (playerSpecies2 == SPECIES_EGG && playerSpecies2 != partnerSpecies)\n        return UR_TRADE_MSG_MON_CANT_BE_TRADED_1;\n\n    // If the player doesn't have the National Dex then Eggs and non-Kanto Pokémon can't be traded\n    if (!playerHasNationalDex)\n    {\n        if (playerSpecies2 == SPECIES_EGG)\n            return UR_TRADE_MSG_EGG_CANT_BE_TRADED;\n\n        if (playerSpecies2 > KANTO_SPECIES_END)\n            return UR_TRADE_MSG_MON_CANT_BE_TRADED_2;\n\n        if (partnerSpecies > KANTO_SPECIES_END)\n            return UR_TRADE_MSG_PARTNERS_MON_CANT_BE_TRADED;\n    }\n\n    // If the partner doesn't have the National Dex then the player's offer has to be a Kanto Pokémon\n    if (!partnerHasNationalDex && playerSpecies2 > KANTO_SPECIES_END)\n        return UR_TRADE_MSG_PARTNER_CANT_ACCEPT_MON;\n\n    // Trade is allowed\n    return UR_TRADE_MSG_NONE;\n}\n\nint CanRegisterMonForTradingBoard(struct RfuGameCompatibilityData player, u16 species2, u16 species, bool8 isModernFatefulEncounter)\n{\n    bool8 hasNationalDex = player.hasNationalDex;\n\n    if (IsDeoxysOrMewUntradable(species, isModernFatefulEncounter))\n        return CANT_REGISTER_MON;\n\n    if (hasNationalDex)\n        return CAN_REGISTER_MON;\n\n    // Eggs can only be traded if the player has the National Dex\n    if (species2 == SPECIES_EGG)\n        return CANT_REGISTER_EGG;\n\n    if (species2 > KANTO_SPECIES_END && species2 != SPECIES_EGG)\n        return CANT_REGISTER_MON;\n\n    return CAN_REGISTER_MON;\n}\n"
  },
  {
    "path": "src/trade_scene.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"util.h\"\n#include \"decompress.h\"\n#include \"trade.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"mystery_gift.h\"\n#include \"graphics.h\"\n#include \"strings.h\"\n#include \"menu.h\"\n#include \"data.h\"\n#include \"battle.h\"\n#include \"battle_setup.h\"\n#include \"script.h\"\n#include \"event_data.h\"\n#include \"mail.h\"\n#include \"mail_data.h\"\n#include \"pokeball.h\"\n#include \"evolution_scene.h\"\n#include \"overworld.h\"\n#include \"field_fadetransition.h\"\n#include \"quest_log.h\"\n#include \"help_system.h\"\n#include \"new_menu_helpers.h\"\n#include \"pokedex.h\"\n#include \"save.h\"\n#include \"load_save.h\"\n#include \"random.h\"\n#include \"trade_scene.h\"\n#include \"constants/items.h\"\n#include \"constants/easy_chat.h\"\n#include \"constants/songs.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/moves.h\"\n\n// Values for signaling to/from the link partner\nenum {\n    STATUS_NONE,\n    STATUS_READY,\n    STATUS_CANCEL,\n};\n\nenum {\n    GFXTAG_LINK_MON_GLOW = 5550,\n    PALTAG_LINK_MON,\n    GFXTAG_LINK_MON_SHADOW,\n    TAG_UNUSED,\n    GFXTAG_CABLE_END,\n    PALTAG_GBA,\n    GFXTAG_GBA_SCREEN,\n    GFXTAG_POKEBALL,\n    PALTAG_POKEBALL,\n};\n\nstruct InGameTrade {\n    /*0x00*/ u8 nickname[POKEMON_NAME_LENGTH + 1];\n    /*0x0C*/ u16 species;\n    /*0x0E*/ u8 ivs[NUM_STATS];\n    /*0x14*/ u8 abilityNum;\n    /*0x18*/ u32 otId;\n    /*0x1C*/ u8 conditions[CONTEST_CATEGORIES_COUNT];\n    /*0x24*/ u32 personality;\n    /*0x28*/ u16 heldItem;\n    /*0x2A*/ u8 mailNum;\n    /*0x2B*/ u8 otName[11];\n    /*0x36*/ u8 otGender;\n    /*0x37*/ u8 sheen;\n    /*0x38*/ u16 requestedSpecies;\n};\n\nstruct {\n    /*0x00*/ struct Pokemon tempMon; // Used as a temp variable when swapping Pokémon\n    /*0x64*/ u32 timer;\n    /*0x68*/ u32 monPersonalities[2];\n    /*0x70*/ u8 filler_70[2];\n    /*0x72*/ u8 playerFinishStatus;\n    /*0x73*/ u8 partnerFinishStatus;\n    /*0x74*/ u16 linkData[10];\n    /*0x88*/ u8 linkTimeoutCheck1;\n    /*0x89*/ u8 linkTimeoutCheck2;\n    /*0x8A*/ u16 linkTimeoutTimer;\n    /*0x8C*/ u16 neverRead_8C;\n    /*0x8E*/ u8 monSpriteIds[2];\n    /*0x90*/ u8 connectionSpriteId1; // Multi-purpose sprite ids used during the transfer sequence\n    /*0x91*/ u8 connectionSpriteId2;\n    /*0x92*/ u8 cableEndSpriteId;\n    /*0x93*/ u8 scheduleLinkTransfer;\n    /*0x94*/ u16 state;\n    /*0x96*/ u8 filler_96[0xD2 - 0x96];\n    /*0xD2*/ u8 releasePokeballSpriteId;\n    /*0xD3*/ u8 bouncingPokeballSpriteId;\n    /*0xD4*/ u16 bg2texX;\n    /*0xD6*/ u16 bg2texY;\n    /*0xD8*/ u16 neverRead_D8;\n    /*0xDA*/ u16 neverRead_DA;\n    /*0xDC*/ u16 bg2srcX;\n    /*0xDE*/ u16 bg2srcY;\n    /*0xE0*/ s16 bg1vofs;\n    /*0xE2*/ s16 bg1hofs;\n    /*0xE4*/ s16 bg2vofs;\n    /*0xE6*/ s16 bg2hofs;\n    /*0xE8*/ u16 sXY;\n    /*0xEA*/ u16 bg2Zoom;\n    /*0xEC*/ u16 bg2alpha;\n    /*0xEE*/ bool8 isLinkTrade;\n    /*0xF0*/ u16 monSpecies[2];\n    /*0xF4*/ u16 cachedMapMusic;\n    /*0xF6*/ u8 unk_F6;\n    /*0xF8*/ struct QuestLogEvent_Traded questLogData;\n    /*0x104*/ u8 textColor[3];\n    /*0x107*/ u8 filler_107[1];\n    /*0x108*/ bool8 isCableTrade;\n    /*0x109*/ u8 win0left;\n    /*0x10A*/ u8 win0top;\n    /*0x10B*/ u8 win0right;\n    /*0x10C*/ u8 win0bottom;\n} static EWRAM_DATA * sTradeAnim = NULL;\n\nstatic void SpriteCB_LinkMonGlow(struct Sprite *sprite);\nstatic void SpriteCB_LinkMonGlowWireless(struct Sprite *sprite);\nstatic void SpriteCB_LinkMonShadow(struct Sprite *sprite);\nstatic void SpriteCB_CableEndSending(struct Sprite *sprite);\nstatic void SpriteCB_CableEndReceiving(struct Sprite *sprite);\nstatic void SpriteCB_GbaScreen(struct Sprite *sprite);\nstatic void TradeAnimInit_LoadGfx(void);\nstatic void CB2_InGameTrade(void);\nstatic void SetTradeSequenceBgGpuRegs(u8 idx);\nstatic void LoadTradeGbaSpriteGfx(void);\nstatic void TradeBufferOTnameAndNicknames(void);\nstatic u8 DoTradeAnim(void);\nstatic u8 DoTradeAnim_Cable(void);\nstatic u8 DoTradeAnim_Wireless(void);\nstatic void SpriteCB_BouncingPokeball(struct Sprite *sprite);\nstatic void SpriteCB_BouncingPokeballDepart(struct Sprite *sprite);\nstatic void SpriteCB_BouncingPokeballDepartEnd(struct Sprite *sprite);\nstatic void SpriteCB_BouncingPokeballArrive(struct Sprite *sprite);\nstatic void BufferInGameTradeMonName(void);\nstatic void GetInGameTradeMail(struct Mail * mail, const struct InGameTrade * inGameTrade);\nstatic void CB2_UpdateLinkTrade(void);\nstatic void CB2_WaitTradeComplete(void);\nstatic void CB2_SaveAndEndTrade(void);\nstatic void CB2_FreeTradeAnim(void);\nstatic void Task_InGameTrade(u8 taskId);\nstatic void CheckPartnersMonForRibbons(void);\nstatic void Task_AnimateWirelessSignal(u8 taskId);\nstatic void Task_OpenCenterWhiteColumn(u8 taskId);\nstatic void Task_CloseCenterWhiteColumn(u8 taskId);\n\nstatic const u16 sPokeball_Pal[]                    = INCBIN_U16(\"graphics/trade/pokeball.gbapal\");\nstatic const u8 sPokeball_Gfx[]                     = INCBIN_U8(\"graphics/trade/pokeball.4bpp\");\nstatic const u8 sPokeballSymbol_Gfx[]               = INCBIN_U8(\"graphics/trade/pokeball_symbol.8bpp\"); // Unused\nstatic const u16 sCableCloseup_Map[]                = INCBIN_U16(\"graphics/trade/cable_closeup_map.bin\");\nstatic const u16 sPokeballSymbol_Map[]              = INCBIN_U16(\"graphics/trade/pokeball_symbol_map.bin\");\nstatic const u16 sUnusedPal1[]                      = INCBIN_U16(\"graphics/trade/unused1.gbapal\");\nstatic const u16 sGba_Pal[]                         = INCBIN_U16(\"graphics/trade/gba.gbapal\");\nstatic const u16 sShadowPalette[]                   = INCBIN_U16(\"graphics/trade/shadow.gbapal\");\nstatic const u16 sBlackPalette[]                    = INCBIN_U16(\"graphics/trade/black.gbapal\");\nstatic const u16 sLinkMon_Pal[]                     = INCBIN_U16(\"graphics/trade/link_mon.gbapal\");\nstatic const u8 sLinkMonGlow_Gfx[]                  = INCBIN_U8(\"graphics/trade/link_mon_glow.4bpp\");\nstatic const u8 sLinkMonShadow_Gfx[]                = INCBIN_U8(\"graphics/trade/link_mon_shadow.4bpp\");\nstatic const u8 sCableEnd_Gfx[]                     = INCBIN_U8(\"graphics/trade/cable_end.4bpp\");\nstatic const u8 sGbaScreen_Gfx[]                    = INCBIN_U8(\"graphics/trade/gba_screen.4bpp\");\nconst u16 gTradeOrHatchMonShadowTilemap[]           = INCBIN_U16(\"graphics/trade/shadow_map.bin\");\nstatic const u8 sGbaAffine_Gfx[]                    = INCBIN_U8(\"graphics/trade/gba_affine.8bpp\");\nstatic const u8 sEmptyGfx[64]                       = {};\nstatic const u8 sGbaAffineMapCable[]                = INCBIN_U8(\"graphics/trade/gba_affine_map_cable.bin\");\nstatic const u8 sGbaAffineMapWireless[]             = INCBIN_U8(\"graphics/trade/gba_affine_map_wireless.bin\");\nstatic const u16 sGbaMapWireless[]                  = INCBIN_U16(\"graphics/trade/gba_map_wireless.bin\");\nstatic const u16 sGbaMapCable[]                     = INCBIN_U16(\"graphics/trade/gba_map_cable.bin\");\nstatic const u32 sWirelessCloseup_Map[]             = INCBIN_U32(\"graphics/trade/wireless_signal_closeup.bin.lz\");\nstatic const u16 sWirelessSignalAnimPals_Outbound[] = INCBIN_U16(\"graphics/trade/wireless_signal_send.gbapal\");\nstatic const u16 sWirelessSignalAnimPals_Inbound[]  = INCBIN_U16(\"graphics/trade/wireless_signal_receive.gbapal\");\nstatic const u16 sWirelessSignalAnimPals_Off[]      = INCBIN_U16(\"graphics/trade/black.gbapal\");\nstatic const u32 sWirelessSignal4bpp[]              = INCBIN_U32(\"graphics/trade/wireless_signal.4bpp.lz\");\nstatic const u32 sWirelessSignalTilemap[]           = INCBIN_U32(\"graphics/trade/wireless_signal.bin.lz\");\n\nstatic const struct OamData sOamData_Pokeball = {\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .shape = SPRITE_SHAPE(16x16),\n    .size = SPRITE_SIZE(16x16)\n};\n\nstatic const union AnimCmd sAnim_Pokeball_SpinOnce[] = {\n    ANIMCMD_FRAME( 0, 3),\n    ANIMCMD_FRAME( 4, 3),\n    ANIMCMD_FRAME( 8, 3),\n    ANIMCMD_FRAME(12, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(20, 3),\n    ANIMCMD_FRAME(24, 3),\n    ANIMCMD_FRAME(28, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(36, 3),\n    ANIMCMD_FRAME(40, 3),\n    ANIMCMD_FRAME(44, 3),\n    ANIMCMD_LOOP(1),\n    ANIMCMD_FRAME( 0, 3),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_Pokeball_SpinTwice[] = {\n    ANIMCMD_FRAME( 0, 3),\n    ANIMCMD_FRAME( 4, 3),\n    ANIMCMD_FRAME( 8, 3),\n    ANIMCMD_FRAME(12, 3),\n    ANIMCMD_FRAME(16, 3),\n    ANIMCMD_FRAME(20, 3),\n    ANIMCMD_FRAME(24, 3),\n    ANIMCMD_FRAME(28, 3),\n    ANIMCMD_FRAME(32, 3),\n    ANIMCMD_FRAME(36, 3),\n    ANIMCMD_FRAME(40, 3),\n    ANIMCMD_FRAME(44, 3),\n    ANIMCMD_LOOP(2),\n    ANIMCMD_FRAME( 0, 3),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_Pokeball[] = {\n    sAnim_Pokeball_SpinOnce,\n    sAnim_Pokeball_SpinTwice\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Pokeball_Normal[] = {\n    AFFINEANIMCMD_FRAME(0, 0, 0, 1),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Pokeball_Squish[] = {\n    AFFINEANIMCMD_FRAME(-8, 0, 0, 20),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd sAffineAnim_Pokeball_Unsquish[] = {\n    AFFINEANIMCMD_FRAME(96, 256, 0, 0),\n    AFFINEANIMCMD_FRAME(0, 0, 0, 5),\n    AFFINEANIMCMD_FRAME(8, 0, 0, 20),\n    AFFINEANIMCMD_END\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_Pokeball[] = {\n    sAffineAnim_Pokeball_Normal,\n    sAffineAnim_Pokeball_Squish,\n    sAffineAnim_Pokeball_Unsquish\n};\n\nstatic const struct SpriteSheet sPokeBallSpriteSheet = {\n    .data = sPokeball_Gfx,\n    .size = sizeof(sPokeball_Gfx),\n    .tag = GFXTAG_POKEBALL\n};\n\nstatic const struct SpritePalette sTradeBallSpritePal = {\n    .data = sPokeball_Pal,\n    .tag = PALTAG_POKEBALL\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Pokeball = {\n    .tileTag = GFXTAG_POKEBALL,\n    .paletteTag = PALTAG_POKEBALL,\n    .oam = &sOamData_Pokeball,\n    .anims = sAnims_Pokeball,\n    .affineAnims = sAffineAnims_Pokeball,\n    .callback = SpriteCB_BouncingPokeball\n};\n\nstatic const struct OamData sOamData_LinkMonGlow = {\n    .affineMode = ST_OAM_AFFINE_NORMAL,\n    .objMode = ST_OAM_OBJ_BLEND,\n    .shape = SPRITE_SHAPE(32x32),\n    .size = SPRITE_SIZE(32x32),\n    .priority = 1\n};\n\nstatic const union AnimCmd sAnim_LinkMonGlow[] = {\n    ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), // ? The graphic is a perfect circle, no need to flip\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_LinkMonGlow[] = {\n    sAnim_LinkMonGlow\n};\n\nstatic const union AffineAnimCmd sAffineAnim_LinkMonGlow[] = {\n    AFFINEANIMCMD_FRAME(-10, -10, 0, 5),\n    AFFINEANIMCMD_FRAME( 10,  10, 0, 5),\n    AFFINEANIMCMD_JUMP(0)\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_LinkMonGlow[] = {\n    sAffineAnim_LinkMonGlow\n};\n\nstatic const struct SpriteSheet sSpriteSheet_LinkMonGlow = {\n    .data = sLinkMonGlow_Gfx,\n    .size = sizeof(sLinkMonGlow_Gfx),\n    .tag = GFXTAG_LINK_MON_GLOW\n};\n\nstatic const struct SpritePalette sSpritePalette_LinkMon = {\n    .data = sLinkMon_Pal,\n    .tag = PALTAG_LINK_MON\n};\n\nstatic const struct SpritePalette sSpritePalette_Gba = {\n    .data = sGba_Pal,\n    .tag = PALTAG_GBA\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_LinkMonGlow = {\n    .tileTag = GFXTAG_LINK_MON_GLOW,\n    .paletteTag = PALTAG_LINK_MON,\n    .oam = &sOamData_LinkMonGlow,\n    .anims = sAnims_LinkMonGlow,\n    .affineAnims = sAffineAnims_LinkMonGlow,\n    .callback = SpriteCB_LinkMonGlow\n};\n\nstatic const struct OamData sOamData_LinkMonShadow = {\n    .shape = SPRITE_SHAPE(16x32),\n    .size = SPRITE_SIZE(16x32),\n    .priority = 1\n};\n\nstatic const union AnimCmd sAnim_LinkMonShadow_Big[] = {\n    ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_LinkMonShadow_Small[] = {\n    ANIMCMD_FRAME(8, 5, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_END\n};\n\nenum {\n    ANIM_LINKMON_BIG,\n    ANIM_LINKMON_SMALL,\n};\n\nstatic const union AnimCmd *const sAnims_LinkMonShadow[] = {\n    [ANIM_LINKMON_BIG]   = sAnim_LinkMonShadow_Big,\n    [ANIM_LINKMON_SMALL] = sAnim_LinkMonShadow_Small,\n};\n\nstatic const struct SpriteSheet sSpriteSheet_LinkMonShadow = {\n    .data = sLinkMonShadow_Gfx,\n    .size = 0x300,\n    .tag = GFXTAG_LINK_MON_SHADOW\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_LinkMonShadow = {\n    .tileTag = GFXTAG_LINK_MON_SHADOW,\n    .paletteTag = PALTAG_LINK_MON,\n    .oam = &sOamData_LinkMonShadow,\n    .anims = sAnims_LinkMonShadow,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_LinkMonShadow\n};\n\nstatic const struct OamData sOamData_CableEnd = {\n    .shape = SPRITE_SHAPE(16x32),\n    .size = SPRITE_SIZE(16x32),\n    .priority = 1\n};\n\nstatic const union AnimCmd sAnim_CableEnd[] = {\n    ANIMCMD_FRAME(0, 10),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_CableEnd[] = {\n    sAnim_CableEnd\n};\n\nstatic const struct SpriteSheet sSpriteSheet_CableEnd = {\n    .data = sCableEnd_Gfx,\n    .size = 0x100,\n    .tag = GFXTAG_CABLE_END\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_CableEnd = {\n    .tileTag = GFXTAG_CABLE_END,\n    .paletteTag = PALTAG_GBA,\n    .oam = &sOamData_CableEnd,\n    .anims = sAnims_CableEnd,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_CableEndSending\n};\n\nstatic const struct OamData sOamData_GbaScreen = {\n    .shape = SPRITE_SHAPE(64x32),\n    .size = SPRITE_SIZE(64x32),\n    .priority = 1\n};\n\nstatic const union AnimCmd sAnim_GbaScreen_Long[] = {\n    ANIMCMD_FRAME( 0, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME(32, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME(64, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME(96, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME(64, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME(32, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME( 0, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_LOOP(8),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_GbaScreen_Short[] = {\n    ANIMCMD_FRAME( 0, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME(32, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME(64, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME(96, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME(64, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME(32, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_FRAME( 0, 2, .hFlip = TRUE, .vFlip = TRUE),\n    ANIMCMD_LOOP(2),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sAnims_GbaScreen_Long[] = {\n    sAnim_GbaScreen_Long\n};\n\nstatic const union AnimCmd *const sAnims_GbaScreen_Short[] = {\n    sAnim_GbaScreen_Short\n};\n\nstatic const struct SpriteSheet sTradeGBAScreenSpriteSheet = {\n    .data = sGbaScreen_Gfx,\n    .size = sizeof(sGbaScreen_Gfx),\n    .tag = GFXTAG_GBA_SCREEN\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_GbaScreenFlash_Long = {\n    .tileTag = GFXTAG_GBA_SCREEN,\n    .paletteTag = PALTAG_GBA,\n    .oam = &sOamData_GbaScreen,\n    .anims = sAnims_GbaScreen_Long,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_GbaScreen\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_GbaScreenFlash_Short = {\n    .tileTag = GFXTAG_GBA_SCREEN,\n    .paletteTag = PALTAG_GBA,\n    .oam = &sOamData_GbaScreen,\n    .anims = sAnims_GbaScreen_Short,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_GbaScreen\n};\n\nstatic const u16 sLinkMonShadow_Pal[] = {\n    RGB(18, 24, 31),\n    RGB(18, 24, 31),\n    RGB(18, 24, 31),\n    RGB(31, 31, 31),\n    RGB(31, 31, 31),\n    RGB(31, 31, 31),\n    RGB(18, 24, 31),\n    RGB(18, 24, 31),\n    RGB(18, 24, 31),\n    RGB(31, 31, 31),\n    RGB(31, 31, 31),\n    RGB(31, 31, 31)\n};\n\nstatic const union AffineAnimCmd sAffineAnim_CrossingMonPic[] = {\n    AFFINEANIMCMD_FRAME(-0x100,  0x100, 0, 0),\n    AFFINEANIMCMD_JUMP(0)\n};\n\nstatic const union AffineAnimCmd *const sAffineAnims_CrossingMonPics[] = {\n    sAffineAnim_CrossingMonPic\n};\n\n#include \"data/ingame_trades.h\"\n\nstatic const struct WindowTemplate sTradeMessageWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 0,\n        .baseBlock = 0x040\n    }, DUMMY_WIN_TEMPLATE\n};\n\nconst struct WindowTemplate gTradeEvolutionSceneYesNoWindowTemplate = {\n    .bg = 0,\n    .tilemapLeft = 21,\n    .tilemapTop = 9,\n    .width = 6,\n    .height = 4,\n    .paletteNum = 15,\n    .baseBlock = 0x0bc\n};\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 5,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 18,\n        .screenSize = 1,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x000\n    }, {\n        .bg = 3,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 6,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x000\n    }\n};\n\nstatic const s8 sTradeBallVerticalVelocityTable[] = {\n     0,  0,  1,  0,\n     1,  0,  1,  1,\n     1,  1,  2,  2,\n     2,  2,  3,  3,\n     3,  3,  4,  4,\n     4,  4, -4, -4,\n    -4, -3, -3, -3,\n    -3, -2, -2, -2,\n    -2, -1, -1, -1,\n    -1,  0, -1,  0,\n    -1,  0,  0,  0,\n     0,  0,  1,  0,\n     1,  0,  1,  1,\n     1,  1,  2,  2,\n     2,  2,  3,  3,\n     3,  3,  4,  4,\n     4,  4, -4, -3,\n    -3, -2, -2, -1,\n    -1, -1,  0, -1,\n     0,  0,  0,  0,\n     0,  0,  1,  0,\n     1,  1,  1,  2,\n     2,  3,  3,  4,\n    -4, -3, -2, -1,\n    -1, -1,  0,  0,\n     0,  0,  1,  0,\n     1,  1,  2,  3\n};\n\nstatic const u8 sWirelessSignalAnimParams[][2] = {\n    {0,  1},\n    {1,  1},\n    {2,  1},\n    {3,  1},\n    {4,  1},\n    {5,  2},\n    {6,  2},\n    {7,  2},\n    {8,  2},\n    {9,  2},\n    {10, 3},\n    {11, 3},\n    {12, 3},\n    {13, 4},\n    {14, 5},\n    {15, 2},\n    {0,  1},\n    {1,  1},\n    {2,  1},\n    {3,  1},\n    {4,  1},\n    {5,  2},\n    {6,  2},\n    {7,  2},\n    {8,  2},\n    {9,  2},\n    {10, 3},\n    {11, 3},\n    {12, 3},\n    {13, 4},\n    {14, 5},\n    {16, 1},\n    {16, -1}\n};\n\nstatic void SpriteCB_LinkMonGlow(struct Sprite *sprite)\n{\n    if (++sprite->data[0] == 10)\n    {\n        PlaySE(SE_BALL);\n        sprite->data[0] = 0;\n    }\n}\n\nstatic void SpriteCB_LinkMonGlowWireless(struct Sprite *sprite)\n{\n    if (!sprite->invisible && ++sprite->data[0] == 10)\n    {\n        PlaySE(SE_M_SWAGGER2);\n        sprite->data[0] = 0;\n    }\n}\n\n// Palette flash for trade glow core\nstatic void SpriteCB_LinkMonShadow(struct Sprite *sprite)\n{\n    if (sprite->data[1] == 0)\n    {\n        if (++sprite->data[0] == 12)\n            sprite->data[0] = 0;\n        LoadPalette(&sLinkMonShadow_Pal[sprite->data[0]], OBJ_PLTT_ID2(sprite->oam.paletteNum) + 4, PLTT_SIZEOF(1));\n    }\n}\n\n// Move cable down offscreen\nstatic void SpriteCB_CableEndSending(struct Sprite *sprite)\n{\n    sprite->data[0]++;\n    sprite->y2++;\n\n    if (sprite->data[0] == 10)\n        DestroySprite(sprite);\n}\n\n// Move cable up onscreen\nstatic void SpriteCB_CableEndReceiving(struct Sprite *sprite)\n{\n    sprite->data[0]++;\n    sprite->y2--;\n\n    if (sprite->data[0] == 10)\n        DestroySprite(sprite);\n}\n\nstatic void SpriteCB_GbaScreen(struct Sprite *sprite)\n{\n    if (++sprite->data[0] == 15)\n    {\n        PlaySE(SE_M_MINIMIZE);\n        sprite->data[0] = 0;\n    }\n}\n\nstatic void SetTradeBGAffine(void)\n{\n    struct BgAffineDstData affine;\n    DoBgAffineSet(&affine, sTradeAnim->bg2texX * 0x100, sTradeAnim->bg2texY * 0x100, sTradeAnim->bg2srcX, sTradeAnim->bg2srcY, sTradeAnim->sXY, sTradeAnim->sXY, sTradeAnim->bg2alpha);\n    SetGpuReg(REG_OFFSET_BG2PA, affine.pa);\n    SetGpuReg(REG_OFFSET_BG2PB, affine.pb);\n    SetGpuReg(REG_OFFSET_BG2PC, affine.pc);\n    SetGpuReg(REG_OFFSET_BG2PD, affine.pd);\n    SetGpuReg(REG_OFFSET_BG2X, affine.dx);\n    SetGpuReg(REG_OFFSET_BG2Y, affine.dy);\n}\n\nstatic void SetTradeGpuRegs(void)\n{\n    u16 dispcnt;\n\n    SetGpuReg(REG_OFFSET_BG1VOFS, sTradeAnim->bg1vofs);\n    SetGpuReg(REG_OFFSET_BG1HOFS, sTradeAnim->bg1hofs);\n\n    dispcnt = GetGpuReg(REG_OFFSET_DISPCNT);\n    if ((dispcnt & 7) == DISPCNT_MODE_0)\n    {\n        SetGpuReg(REG_OFFSET_BG2VOFS, sTradeAnim->bg2vofs);\n        SetGpuReg(REG_OFFSET_BG2HOFS, sTradeAnim->bg2hofs);\n    }\n    else\n    {\n        SetTradeBGAffine();\n    }\n}\n\nstatic void VBlankCB_TradeAnim(void)\n{\n    SetTradeGpuRegs();\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nstatic void ClearLinkTimeoutTimer(void)\n{\n    sTradeAnim->linkTimeoutTimer = 0;\n    sTradeAnim->linkTimeoutCheck1 = 0;\n    sTradeAnim->linkTimeoutCheck2 = 0;\n}\n\nstatic void CheckLinkTimeout(void)\n{\n    if (sTradeAnim->linkTimeoutCheck1 == sTradeAnim->linkTimeoutCheck2)\n        sTradeAnim->linkTimeoutTimer++;\n    else\n        sTradeAnim->linkTimeoutTimer = 0;\n\n    if (sTradeAnim->linkTimeoutTimer > 300)\n    {\n        CloseLink();\n        SetMainCallback2(CB2_LinkError);\n        sTradeAnim->linkTimeoutTimer = 0;\n        sTradeAnim->linkTimeoutCheck2 = 0;\n        sTradeAnim->linkTimeoutCheck1 = 0;\n    }\n\n    sTradeAnim->linkTimeoutCheck2 = sTradeAnim->linkTimeoutCheck1;\n}\n\nstatic u32 TradeGetMultiplayerId(void)\n{\n    if (gReceivedRemoteLinkPlayers)\n        return GetMultiplayerId();\n    return 0;\n}\n\nstatic void LoadTradeMonPic(u8 whichParty, u8 state)\n{\n    int pos = 0;\n    struct Pokemon * mon = NULL;\n    u16 species;\n    u32 personality;\n\n    if (whichParty == TRADE_PLAYER)\n    {\n        mon = &gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]];\n        pos = B_POSITION_OPPONENT_LEFT;\n    }\n\n    if (whichParty == TRADE_PARTNER)\n    {\n        mon = &gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE];\n        pos = B_POSITION_OPPONENT_RIGHT;\n    }\n\n    switch (state)\n    {\n    case 0:\n        // Load graphics\n        species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG);\n        personality = GetMonData(mon, MON_DATA_PERSONALITY);\n\n        if (whichParty == TRADE_PLAYER)\n            HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);\n        else\n            HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[whichParty * 2 + 1], species, personality);\n\n        LoadCompressedSpritePalette(GetMonSpritePalStruct(mon));\n        sTradeAnim->monSpecies[whichParty] = species;\n        sTradeAnim->monPersonalities[whichParty] = personality;\n        break;\n    case 1:\n        // Create sprite\n        SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, pos);\n        sTradeAnim->monSpriteIds[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6);\n        gSprites[sTradeAnim->monSpriteIds[whichParty]].invisible = TRUE;\n        gSprites[sTradeAnim->monSpriteIds[whichParty]].callback = SpriteCallbackDummy;\n        break;\n    }\n}\n\nvoid CB2_LinkTrade(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            gLinkType = LINKTYPE_TRADE_DISCONNECTED;\n            CloseLink();\n        }\n        sTradeAnim = AllocZeroed(sizeof(*sTradeAnim));\n        AllocateMonSpritesGfx();\n        ResetTasks();\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        SetVBlankCallback(VBlankCB_TradeAnim);\n        TradeAnimInit_LoadGfx();\n        ClearLinkTimeoutTimer();\n        gMain.state++;\n        sTradeAnim->neverRead_8C = 0;\n        sTradeAnim->state = 0;\n        sTradeAnim->isLinkTrade = TRUE;\n        sTradeAnim->bg2texX = 64;\n        sTradeAnim->bg2texY = 64;\n        sTradeAnim->neverRead_D8 = 0;\n        sTradeAnim->neverRead_DA = 0;\n        sTradeAnim->bg2srcX = DISPLAY_WIDTH / 2;\n        sTradeAnim->bg2srcY = DISPLAY_HEIGHT / 2;\n        sTradeAnim->sXY = 256;\n        sTradeAnim->bg2alpha = 0;\n        break;\n    case 1:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            sTradeAnim->isCableTrade = TRUE;\n            OpenLink();\n            gMain.state++;\n            sTradeAnim->timer = 0;\n        }\n        else\n        {\n            gMain.state = 4;\n        }\n        break;\n    case 2:\n        if (++sTradeAnim->timer > 60)\n        {\n            sTradeAnim->timer = 0;\n            gMain.state++;\n        }\n        break;\n    case 3:\n        if (IsLinkMaster())\n        {\n            if (GetLinkPlayerCount_2() >= GetSavedPlayerCount())\n            {\n                if (++sTradeAnim->timer > 30)\n                {\n                    CheckShouldAdvanceLinkState();\n                    gMain.state++;\n                }\n            }\n            else\n            {\n                CheckLinkTimeout();\n            }\n        }\n        else\n        {\n            gMain.state++;\n        }\n        break;\n    case 4:\n        CheckLinkTimeout();\n        if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)\n            gMain.state++;\n        break;\n    case 5:\n        sTradeAnim->playerFinishStatus = 0;\n        sTradeAnim->partnerFinishStatus = 0;\n        sTradeAnim->scheduleLinkTransfer = 0;\n        LoadTradeMonPic(TRADE_PLAYER, 0);\n        gMain.state++;\n        break;\n    case 6:\n        LoadTradeMonPic(TRADE_PLAYER, 1);\n        gMain.state++;\n        break;\n    case 7:\n        LoadTradeMonPic(TRADE_PARTNER, 0);\n        gMain.state++;\n        break;\n    case 8:\n        LoadTradeMonPic(TRADE_PARTNER, 1);\n        LinkTradeDrawWindow();\n        gMain.state++;\n        break;\n    case 9:\n        LoadTradeGbaSpriteGfx();\n        LoadSpriteSheet(&sPokeBallSpriteSheet);\n        LoadSpritePalette(&sTradeBallSpritePal);\n        gMain.state++;\n        break;\n    case 10:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        ShowBg(0);\n        sTradeAnim->questLogData.speciesSent = GetMonData(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], MON_DATA_SPECIES_OR_EGG);\n        sTradeAnim->questLogData.speciesReceived = GetMonData(&gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE], MON_DATA_SPECIES_OR_EGG);\n        memcpy(sTradeAnim->questLogData.partnerName, gLinkPlayers[GetMultiplayerId() ^ 1].name, PLAYER_NAME_LENGTH);\n        gMain.state++;\n        break;\n    case 11:\n        InitTradeSequenceBgGpuRegs();\n        TradeBufferOTnameAndNicknames();\n        gMain.state++;\n        break;\n    case 12:\n        if (!gPaletteFade.active)\n        {\n            if (gWirelessCommType != 0)\n            {\n                LoadWirelessStatusIndicatorSpriteGfx();\n                CreateWirelessStatusIndicatorSprite(0, 0);\n            }\n            SetMainCallback2(CB2_UpdateLinkTrade);\n        }\n        break;\n    }\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nvoid InitTradeSequenceBgGpuRegs(void)\n{\n    SetTradeSequenceBgGpuRegs(5);\n    SetTradeSequenceBgGpuRegs(0);\n}\n\nvoid LinkTradeDrawWindow(void)\n{\n    FillWindowPixelBuffer(0, PIXEL_FILL(15));\n    PutWindowTilemap(0);\n    CopyWindowToVram(0, COPYWIN_FULL);\n}\n\nstatic void TradeAnimInit_LoadGfx(void)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE));\n    SetBgTilemapBuffer(1, Alloc(BG_SCREEN_SIZE));\n    SetBgTilemapBuffer(3, Alloc(BG_SCREEN_SIZE));\n    DeactivateAllTextPrinters();\n    // Doing the graphics load...\n    DecompressAndLoadBgGfxUsingHeap(0, gBattleInterface_Textbox_Gfx, 0, 0, 0);\n    LZDecompressWram(gBattleInterface_Textbox_Tilemap, gDecompressionBuffer);\n    CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0);\n    LoadCompressedPalette(gBattleInterface_Textbox_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n    InitWindows(sTradeMessageWindowTemplates);\n    // ... and doing the same load again\n    DecompressAndLoadBgGfxUsingHeap(0, gBattleInterface_Textbox_Gfx, 0, 0, 0);\n    LZDecompressWram(gBattleInterface_Textbox_Tilemap, gDecompressionBuffer);\n    CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0);\n    LoadCompressedPalette(gBattleInterface_Textbox_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n}\n\nstatic void CB2_InitInGameTrade(void)\n{\n    u8 otName[11];\n\n    switch (gMain.state)\n    {\n    case 0:\n        gSelectedTradeMonPositions[TRADE_PLAYER] = gSpecialVar_0x8005;\n        gSelectedTradeMonPositions[TRADE_PARTNER] = PARTY_SIZE;\n        StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName);\n        GetMonData(&gEnemyParty[0], MON_DATA_OT_NAME, otName);\n        StringCopy(gLinkPlayers[1].name, otName);\n        sTradeAnim = AllocZeroed(sizeof(*sTradeAnim));\n        AllocateMonSpritesGfx();\n        ResetTasks();\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        SetVBlankCallback(VBlankCB_TradeAnim);\n        TradeAnimInit_LoadGfx();\n        sTradeAnim->isLinkTrade = FALSE;\n        sTradeAnim->neverRead_8C = 0;\n        sTradeAnim->state = 0;\n        sTradeAnim->bg2texX = 64;\n        sTradeAnim->bg2texY = 64;\n        sTradeAnim->neverRead_D8 = 0;\n        sTradeAnim->neverRead_DA = 0;\n        sTradeAnim->bg2srcX = DISPLAY_WIDTH / 2;\n        sTradeAnim->bg2srcY = DISPLAY_HEIGHT / 2;\n        sTradeAnim->sXY = 256;\n        sTradeAnim->bg2alpha = 0;\n        sTradeAnim->timer = 0;\n        gMain.state = 5;\n        break;\n    case 5:\n        LoadTradeMonPic(TRADE_PLAYER, 0);\n        gMain.state++;\n        break;\n    case 6:\n        LoadTradeMonPic(TRADE_PLAYER, 1);\n        gMain.state++;\n        break;\n    case 7:\n        LoadTradeMonPic(TRADE_PARTNER, 0);\n        ShowBg(0);\n        gMain.state++;\n        break;\n    case 8:\n        LoadTradeMonPic(TRADE_PARTNER, 1);\n        FillWindowPixelBuffer(0, PIXEL_FILL(15));\n        PutWindowTilemap(0);\n        CopyWindowToVram(0, COPYWIN_FULL);\n        gMain.state++;\n        break;\n    case 9:\n        LoadTradeGbaSpriteGfx();\n        LoadSpriteSheet(&sPokeBallSpriteSheet);\n        LoadSpritePalette(&sTradeBallSpritePal);\n        gMain.state++;\n        break;\n    case 10:\n        ShowBg(0);\n        gMain.state++;\n        break;\n    case 11:\n        SetTradeSequenceBgGpuRegs(5);\n        SetTradeSequenceBgGpuRegs(0);\n        TradeBufferOTnameAndNicknames();\n        gMain.state++;\n        break;\n    case 12:\n        SetMainCallback2(CB2_InGameTrade);\n        break;\n    }\n\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void UpdatePokedexForReceivedMon(u8 partyIdx)\n{\n    struct Pokemon * mon = &gPlayerParty[partyIdx];\n\n    if (!GetMonData(mon, MON_DATA_IS_EGG))\n    {\n        u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);\n        u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);\n        species = SpeciesToNationalPokedexNum(species);\n        GetSetPokedexFlag(species, FLAG_SET_SEEN);\n        HandleSetPokedexFlag(species, FLAG_SET_CAUGHT, personality);\n    }\n}\n\nstatic void TryEnableNationalDexFromLinkPartner(void)\n{\n    u8 mpId = GetMultiplayerId();\n    // Originally in Ruby but commented out\n    /*if (gLinkPlayers[mpId ^ 1].lp_field_2 == 0x8000)\n        EnableNationalPokedex();*/\n}\n\nstatic void TradeMons(u8 playerPartyIdx, u8 partnerPartyIdx)\n{\n    u8 friendship;\n    u16 maxHP;\n\n    // Get whether the offered Pokemon have mail\n    struct Pokemon * playerMon = &gPlayerParty[playerPartyIdx];\n    u16 playerMail = GetMonData(playerMon, MON_DATA_MAIL);\n\n    struct Pokemon * partnerMon = &gEnemyParty[partnerPartyIdx];\n    u16 partnerMail = GetMonData(partnerMon, MON_DATA_MAIL);\n\n    // The mail attached to the sent Pokemon no longer exists in your file.\n    if (playerMail != MAIL_NONE)\n        ClearMailStruct(&gSaveBlock1Ptr->mail[playerMail]);\n\n    SWAP(*playerMon, *partnerMon, sTradeAnim->tempMon);\n\n    // By default, a Pokemon received from a trade will have 70 Friendship.\n    // Eggs use Friendship to track egg cycles, so don't set this on Eggs.\n    friendship = 70;\n    if (!GetMonData(playerMon, MON_DATA_IS_EGG))\n        SetMonData(playerMon, MON_DATA_FRIENDSHIP, &friendship);\n\n    // Associate your partner's mail with the Pokemon they sent over.\n    if (partnerMail != MAIL_NONE)\n        GiveMailToMon2(playerMon, &gLinkPartnerMail[partnerMail]);\n\n    UpdatePokedexForReceivedMon(playerPartyIdx);\n    if (gReceivedRemoteLinkPlayers)\n        TryEnableNationalDexFromLinkPartner();\n    \n    //fixing Pomeg glitched Pokemon coming in from partner\n    maxHP = GetMonData(playerMon, MON_DATA_MAX_HP);\n\n    if(GetMonData(playerMon, MON_DATA_HP) > maxHP)\n    {\n        SetMonData(playerMon, MON_DATA_HP, &maxHP);\n    }\n}\n\nstatic void HandleLinkDataSend(void)\n{\n    switch (sTradeAnim->scheduleLinkTransfer)\n    {\n    case 1:\n        if (IsLinkTaskFinished())\n        {\n            SendBlock(BitmaskAllOtherLinkPlayers(), sTradeAnim->linkData, sizeof(sTradeAnim->linkData));\n            sTradeAnim->scheduleLinkTransfer++;\n        }\n        // fallthrough\n    case 2:\n        sTradeAnim->scheduleLinkTransfer = 0;\n        break;\n    }\n}\n\nstatic void CB2_InGameTrade(void)\n{\n    DoTradeAnim();\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void SetTradeSequenceBgGpuRegs(u8 state)\n{\n    switch (state)\n    {\n    case 0:\n        sTradeAnim->bg2vofs = 0;\n        sTradeAnim->bg2hofs = 0xB4;\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON);\n        SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256);\n        LoadPalette(gTradeGba2_Pal, BG_PLTT_ID(1), 3 * PLTT_SIZE_4BPP);\n        DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(1), 0x1420, 0x1000);\n        DmaCopy16Defvars(3, gTradeOrHatchMonShadowTilemap, (void *)BG_SCREEN_ADDR(18), 0x1000);\n        break;\n    case 1:\n        sTradeAnim->bg1hofs = 0;\n        sTradeAnim->bg1vofs = 0x15C;\n        SetGpuReg(REG_OFFSET_BG1VOFS, 0x15C);\n        SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_TXT256x512);\n        SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT256x512);\n        if (sTradeAnim->isCableTrade)\n        {\n            DmaCopy16Defvars(3, sGbaMapCable, (void *)BG_SCREEN_ADDR(5), 0x1000);\n        }\n        else\n        {\n            DmaCopy16Defvars(3, sGbaMapWireless, (void *)BG_SCREEN_ADDR(5), 0x1000);\n        }\n        DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(0), 0x1420, 0x1000);\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON);\n        break;\n    case 2:\n        sTradeAnim->bg1vofs = 0;\n        sTradeAnim->bg1hofs = 0;\n        if (!sTradeAnim->isCableTrade)\n        {\n            SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON);\n            LZ77UnCompVram(sWirelessCloseup_Map, (void *)BG_SCREEN_ADDR(5));\n            BlendPalettes(0x000000008, 0x10, RGB_BLACK);\n        }\n        else\n        {\n            SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON);\n            DmaCopy16Defvars(3, sCableCloseup_Map, (void *)BG_SCREEN_ADDR(5), 0x800);\n            BlendPalettes(0x00000001, 0x10, RGB_BLACK);\n        }\n        break;\n    case 3:\n        LoadPalette(sWirelessSignalAnimPals_Off, BG_PLTT_ID(3), PLTT_SIZE_4BPP);\n        LZ77UnCompVram(sWirelessSignal4bpp, BG_CHAR_ADDR(1));\n        LZ77UnCompVram(sWirelessSignalTilemap, BG_SCREEN_ADDR(18));\n        sTradeAnim->bg2vofs = 0x50;\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON);\n        break;\n    case 4:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON);\n        SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18) | BGCNT_AFF128x128);\n        sTradeAnim->bg2texX = 0x40;\n        sTradeAnim->bg2texY = 0x5C;\n        sTradeAnim->sXY = 0x20;\n        sTradeAnim->bg2Zoom = 0x400;\n        sTradeAnim->bg2alpha = 0;\n        DmaCopyLarge16(3, sGbaAffine_Gfx, (void *)BG_CHAR_ADDR(1), 0x2840, 0x1000);\n        if (sTradeAnim->isCableTrade)\n        {\n            DmaCopy16Defvars(3, sGbaAffineMapCable, (void *)BG_SCREEN_ADDR(18), 0x100);\n        }\n        else\n        {\n            DmaCopy16Defvars(3, sGbaAffineMapWireless, (void *)BG_SCREEN_ADDR(18), 0x100);\n        }\n        break;\n    case 5:\n        sTradeAnim->bg1vofs = 0;\n        sTradeAnim->bg1hofs = 0;\n        break;\n    case 6:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON);\n        SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18) | BGCNT_TXT256x256);\n        sTradeAnim->bg2texX = 0x40;\n        sTradeAnim->bg2texY = 0x5C;\n        sTradeAnim->sXY = 0x100;\n        sTradeAnim->bg2Zoom = 0x80;\n        sTradeAnim->bg2srcX = 0x78;\n        sTradeAnim->bg2srcY = 0x50;\n        sTradeAnim->bg2alpha = 0;\n        DmaCopyLarge16(3, sGbaAffine_Gfx, BG_CHAR_ADDR(1), 0x2840, 0x1000);\n        if (sTradeAnim->isCableTrade)\n        {\n            DmaCopy16Defvars(3, sGbaAffineMapCable, (void *)BG_SCREEN_ADDR(18), 0x100);\n        }\n        else\n        {\n            DmaCopy16Defvars(3, sGbaAffineMapWireless, (void *)BG_SCREEN_ADDR(18), 0x100);\n        }\n        break;\n    case 7:\n        sTradeAnim->bg2vofs = 0;\n        sTradeAnim->bg2hofs = 0;\n        SetGpuReg(REG_OFFSET_BLDCNT, 0);\n        SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256);\n        LoadPalette(gTradeGba2_Pal, BG_PLTT_ID(1), 3 * PLTT_SIZE_4BPP);\n        DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(1), 0x1420, 0x1000);\n        DmaCopy16Defvars(3, gTradeOrHatchMonShadowTilemap, (void *)BG_SCREEN_ADDR(18), 0x1000);\n        break;\n    }\n}\n\nstatic void LoadTradeGbaSpriteGfx(void)\n{\n    LoadSpriteSheet(&sSpriteSheet_LinkMonGlow);\n    LoadSpriteSheet(&sSpriteSheet_LinkMonShadow);\n    LoadSpriteSheet(&sSpriteSheet_CableEnd);\n    LoadSpriteSheet(&sTradeGBAScreenSpriteSheet);\n    LoadSpritePalette(&sSpritePalette_LinkMon);\n    LoadSpritePalette(&sSpritePalette_Gba);\n}\n\nstatic void TradeBufferOTnameAndNicknames(void)\n{\n    u8 nickname[20];\n    u8 mpId;\n    const struct InGameTrade * inGameTrade;\n    if (sTradeAnim->isLinkTrade)\n    {\n        mpId = GetMultiplayerId();\n        StringCopy(gStringVar1, gLinkPlayers[mpId ^ 1].name);\n        GetMonData(&gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE], MON_DATA_NICKNAME, nickname);\n        StringCopy_Nickname(gStringVar3, nickname);\n        GetMonData(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], MON_DATA_NICKNAME, nickname);\n        StringCopy_Nickname(gStringVar2, nickname);\n    }\n    else\n    {\n        inGameTrade = &sInGameTrades[gSpecialVar_0x8004];\n        StringCopy(gStringVar1, inGameTrade->otName);\n        StringCopy_Nickname(gStringVar3, inGameTrade->nickname);\n        GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname);\n        StringCopy_Nickname(gStringVar2, nickname);\n    }\n}\n\n// returns TRUE if it finished a link trade, FALSE if it finished an in-game trade or if sequence is still going\nstatic bool8 DoTradeAnim(void)\n{\n    if (sTradeAnim->isCableTrade)\n        return DoTradeAnim_Cable();\n    else\n        return DoTradeAnim_Wireless();\n}\n\n// Below are the states for the main switch in DoTradeAnim_Cable and DoTradeAnim_Wireless\n// When DoTradeAnim_Wireless has a unique version of a state used by DoTradeAnim_Cable, it adds the below modifier\n#define STATE_WIRELESS 100\nenum {\n    STATE_START,\n    STATE_MON_SLIDE_IN,\n    // 2-9 unused\n    STATE_SEND_MSG = 10,\n    STATE_BYE_BYE,\n    STATE_POKEBALL_DEPART,\n    STATE_POKEBALL_DEPART_WAIT,\n    STATE_FADE_OUT_TO_GBA_SEND,\n    // 15-19 unused\n    STATE_WAIT_FADE_OUT_TO_GBA_SEND = 20,\n    STATE_FADE_IN_TO_GBA_SEND,\n    STATE_WAIT_FADE_IN_TO_GBA_SEND,\n    STATE_GBA_ZOOM_OUT,\n    STATE_GBA_FLASH_SEND,\n    STATE_GBA_STOP_FLASH_SEND,\n    STATE_PAN_AWAY_GBA,\n    STATE_CREATE_LINK_MON_LEAVING,\n    STATE_LINK_MON_TRAVEL_OUT,\n    STATE_FADE_OUT_TO_CROSSING,\n    STATE_WAIT_FADE_OUT_TO_CROSSING,\n    STATE_FADE_IN_TO_CROSSING,\n    STATE_WAIT_FADE_IN_TO_CROSSING,\n    STATE_CROSSING_LINK_MONS_ENTER,\n    STATE_CROSSING_BLEND_WHITE_1,\n    STATE_CROSSING_BLEND_WHITE_2,\n    STATE_CROSSING_BLEND_WHITE_3,\n    STATE_CROSSING_CREATE_MON_PICS,\n    STATE_CROSSING_MON_PICS_MOVE,\n    STATE_CROSSING_LINK_MONS_EXIT,\n    STATE_CREATE_LINK_MON_ARRIVING,\n    STATE_FADE_OUT_TO_GBA_RECV,\n    STATE_WAIT_FADE_OUT_TO_GBA_RECV,\n    STATE_LINK_MON_TRAVEL_IN,\n    STATE_PAN_TO_GBA,\n    STATE_DESTROY_LINK_MON,\n    STATE_LINK_MON_ARRIVED_DELAY,\n    STATE_MOVE_GBA_TO_CENTER,\n    STATE_GBA_FLASH_RECV,\n    STATE_UNUSED,\n    STATE_GBA_STOP_FLASH_RECV,\n    STATE_GBA_ZOOM_IN,\n    STATE_FADE_OUT_TO_NEW_MON,\n    // 53-59 unused\n    STATE_WAIT_FADE_OUT_TO_NEW_MON = 60,\n    STATE_FADE_IN_TO_NEW_MON,\n    STATE_WAIT_FADE_IN_TO_NEW_MON,\n    STATE_POKEBALL_ARRIVE,\n    STATE_FADE_POKEBALL_TO_NORMAL,\n    STATE_POKEBALL_ARRIVE_WAIT,\n    STATE_SHOW_NEW_MON,\n    STATE_NEW_MON_MSG,\n    STATE_TAKE_CARE_OF_MON,\n    STATE_AFTER_NEW_MON_DELAY,\n    STATE_CHECK_RIBBONS,\n    STATE_END_LINK_TRADE,\n    STATE_TRY_EVOLUTION,\n    STATE_FADE_OUT_END,\n    STATE_WAIT_FADE_OUT_END,\n    // Special states\n    STATE_GBA_FLASH_SEND_WIRELESS = STATE_GBA_FLASH_SEND + STATE_WIRELESS,\n    STATE_GBA_STOP_FLASH_SEND_WIRELESS,\n    STATE_WAIT_WIRELESS_SIGNAL_SEND,\n    STATE_PAN_TO_GBA_WIRELESS = STATE_PAN_TO_GBA + STATE_WIRELESS,\n    STATE_DESTROY_LINK_MON_WIRELESS,\n    STATE_WAIT_WIRELESS_SIGNAL_RECV,\n    STATE_DELAY_FOR_MON_ANIM = 167,\n    STATE_LINK_MON_TRAVEL_OFFSCREEN = 200,\n    STATE_WAIT_FOR_MON_CRY = 267,\n};\n\nstatic bool8 DoTradeAnim_Cable(void)\n{\n    u16 evoTarget;\n\n    switch (sTradeAnim->state)\n    {\n    case STATE_START:\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = FALSE;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x2 = -180;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 = gMonFrontPicCoords[sTradeAnim->monSpecies[TRADE_PLAYER]].y_offset;\n        sTradeAnim->state++;\n        sTradeAnim->cachedMapMusic = GetCurrentMapMusic();\n        PlayNewMapMusic(MUS_EVOLUTION);\n        break;\n    case STATE_MON_SLIDE_IN:\n        if (sTradeAnim->bg2hofs > 0)\n        {\n            // Sliding\n            gSprites[sTradeAnim->monSpriteIds[0]].x2 += 3;\n            sTradeAnim->bg2hofs -= 3;\n        }\n        else\n        {\n            // Pokémon has arrived onscreen\n            gSprites[sTradeAnim->monSpriteIds[0]].x2 = 0;\n            sTradeAnim->bg2hofs = 0;\n            sTradeAnim->state = STATE_SEND_MSG;\n        }\n        break;\n    case STATE_SEND_MSG:\n        StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY);\n        DrawTextOnTradeWindow(0, gStringVar4, 0);\n\n        if (sTradeAnim->monSpecies[TRADE_PLAYER] != SPECIES_EGG)\n            PlayCry_Normal(sTradeAnim->monSpecies[TRADE_PLAYER], 0);\n\n        sTradeAnim->state = STATE_BYE_BYE;\n        sTradeAnim->timer = 0;\n        break;\n    case STATE_BYE_BYE:\n        if (++sTradeAnim->timer == 80)\n        {\n            sTradeAnim->releasePokeballSpriteId = CreateTradePokeballSprite(sTradeAnim->monSpriteIds[TRADE_PLAYER], gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff);\n            sTradeAnim->state++;\n            StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1);\n            DrawTextOnTradeWindow(0, gStringVar4, 0);\n        }\n        break;\n    case STATE_POKEBALL_DEPART:\n        if (gSprites[sTradeAnim->releasePokeballSpriteId].callback == SpriteCallbackDummy)\n        {\n            sTradeAnim->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, 32, 0);\n            gSprites[sTradeAnim->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballDepart;\n            DestroySprite(&gSprites[sTradeAnim->releasePokeballSpriteId]);\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_POKEBALL_DEPART_WAIT:\n        // The game waits here for the sprite to finish its animation sequence.\n        break;\n    case STATE_FADE_OUT_TO_GBA_SEND:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_GBA_SEND;\n        break;\n    case STATE_WAIT_FADE_OUT_TO_GBA_SEND:\n        if (!gPaletteFade.active)\n        {\n            SetTradeSequenceBgGpuRegs(4);\n            FillWindowPixelBuffer(0, PIXEL_FILL(15));\n            CopyWindowToVram(0, COPYWIN_FULL);\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_FADE_IN_TO_GBA_SEND:\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n        sTradeAnim->state++;\n        break;\n    case STATE_WAIT_FADE_IN_TO_GBA_SEND:\n        if (!gPaletteFade.active)\n            sTradeAnim->state = STATE_GBA_ZOOM_OUT;\n        break;\n    case STATE_GBA_ZOOM_OUT:\n        if (sTradeAnim->bg2Zoom > 0x100)\n        {\n            sTradeAnim->bg2Zoom -= 0x34;\n        }\n        else\n        {\n            SetTradeSequenceBgGpuRegs(1);\n            sTradeAnim->bg2Zoom = 0x80;\n            sTradeAnim->state++;\n            sTradeAnim->timer = 0;\n        }\n        sTradeAnim->sXY = 0x8000 / sTradeAnim->bg2Zoom;\n        break;\n    case STATE_GBA_FLASH_SEND:\n        if (++sTradeAnim->timer > 20)\n        {\n            SetTradeBGAffine();\n            sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0);\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_GBA_STOP_FLASH_SEND:\n        if (gSprites[sTradeAnim->connectionSpriteId2].animEnded)\n        {\n            DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]);\n            SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND |\n                                         BLDCNT_TGT2_BG1 |\n                                         BLDCNT_TGT2_BG2);\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 4));\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_PAN_AWAY_GBA:\n        if (--sTradeAnim->bg1vofs == 316)\n            sTradeAnim->state++;\n\n        if (sTradeAnim->bg1vofs == 328)\n            sTradeAnim->cableEndSpriteId = CreateSprite(&sSpriteTemplate_CableEnd, 128, 65, 0);\n        break;\n    case STATE_CREATE_LINK_MON_LEAVING:\n        sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 128, 80, 3);\n        sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 128, 80, 0);\n        StartSpriteAnim(&gSprites[sTradeAnim->connectionSpriteId2], ANIM_LINKMON_SMALL);\n        sTradeAnim->state++;\n        break;\n    case STATE_LINK_MON_TRAVEL_OUT:\n        if ((sTradeAnim->bg1vofs -= 2) == 166)\n            sTradeAnim->state = STATE_LINK_MON_TRAVEL_OFFSCREEN;\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 |\n                                      DISPCNT_OBJ_1D_MAP |\n                                      DISPCNT_BG1_ON |\n                                      DISPCNT_OBJ_ON);\n        break;\n    case STATE_LINK_MON_TRAVEL_OFFSCREEN:\n        gSprites[sTradeAnim->connectionSpriteId1].y -= 2;\n        gSprites[sTradeAnim->connectionSpriteId2].y -= 2;\n        if (gSprites[sTradeAnim->connectionSpriteId1].y < -8)\n            sTradeAnim->state = STATE_FADE_OUT_TO_CROSSING;\n        break;\n    case STATE_FADE_OUT_TO_CROSSING:\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);\n        sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_CROSSING;\n        break;\n    case STATE_WAIT_FADE_OUT_TO_CROSSING:\n        if (!gPaletteFade.active)\n        {\n            DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]);\n            DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]);\n            SetTradeSequenceBgGpuRegs(2);\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_FADE_IN_TO_CROSSING:\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n        sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 111, 170, 0);\n        sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 129, -10, 0);\n        sTradeAnim->state++;\n        break;\n    case STATE_WAIT_FADE_IN_TO_CROSSING:\n        if (!gPaletteFade.active)\n        {\n            PlaySE(SE_WARP_OUT);\n            sTradeAnim->state++;\n        }\n        gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3;\n        gSprites[sTradeAnim->connectionSpriteId2].y2 += 3;\n        break;\n    case STATE_CROSSING_LINK_MONS_ENTER:\n        gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3;\n        gSprites[sTradeAnim->connectionSpriteId2].y2 += 3;\n        if (gSprites[sTradeAnim->connectionSpriteId1].y2 <= -90)\n        {\n            gSprites[sTradeAnim->connectionSpriteId1].data[1] = 1;\n            gSprites[sTradeAnim->connectionSpriteId2].data[1] = 1;\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_CROSSING_BLEND_WHITE_1:\n        BlendPalettes(0x1, 16, RGB_WHITEALPHA);\n        sTradeAnim->state++;\n        break;\n    case STATE_CROSSING_BLEND_WHITE_2:\n        BlendPalettes(0x1, 0, RGB_WHITEALPHA);\n        sTradeAnim->state++;\n        break;\n    case STATE_CROSSING_BLEND_WHITE_3:\n        BlendPalettes(0x1, 16, RGB_WHITEALPHA);\n        sTradeAnim->state++;\n        break;\n    case STATE_CROSSING_CREATE_MON_PICS:\n        if (!IsMonSpriteNotFlipped(sTradeAnim->monSpecies[TRADE_PLAYER]))\n        {\n            gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].affineAnims = sAffineAnims_CrossingMonPics;\n            gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE;\n            CalcCenterToCornerVec(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE);\n            StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], 0);\n        }\n        else\n        {\n            StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], 0);\n        }\n        StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]], 0);\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x = 60;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x = 180;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y = 192;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y = -32;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = FALSE;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].invisible = FALSE;\n        sTradeAnim->state++;\n        break;\n    case STATE_CROSSING_MON_PICS_MOVE:\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 -= 3;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y2 += 3;\n        if (gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 < -DISPLAY_HEIGHT\n         && gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 >= -DISPLAY_HEIGHT - 3)\n        {\n            PlaySE(SE_WARP_IN);\n        }\n        if (gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 < -222)\n        {\n            gSprites[sTradeAnim->connectionSpriteId1].data[1] = 0;\n            gSprites[sTradeAnim->connectionSpriteId2].data[1] = 0;\n            sTradeAnim->state++;\n            gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = TRUE;\n            gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].invisible = TRUE;\n            BlendPalettes(0x1, 0, RGB_WHITEALPHA);\n        }\n        break;\n    case STATE_CROSSING_LINK_MONS_EXIT:\n        gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3;\n        gSprites[sTradeAnim->connectionSpriteId2].y2 += 3;\n        if (gSprites[sTradeAnim->connectionSpriteId1].y2 <= -222)\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);\n            sTradeAnim->state++;\n            DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]);\n            DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]);\n        }\n        break;\n    case STATE_CREATE_LINK_MON_ARRIVING:\n        if (!gPaletteFade.active)\n        {\n            sTradeAnim->state++;\n            SetTradeSequenceBgGpuRegs(1);\n            sTradeAnim->bg1vofs = 166;\n            sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 128, -20, 3);\n            sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 128, -20, 0);\n            StartSpriteAnim(&gSprites[sTradeAnim->connectionSpriteId2], ANIM_LINKMON_SMALL);\n        }\n        break;\n    case STATE_FADE_OUT_TO_GBA_RECV:\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n        sTradeAnim->state++;\n        break;\n    case STATE_WAIT_FADE_OUT_TO_GBA_RECV:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |\n                                      DISPCNT_OBJ_1D_MAP |\n                                      DISPCNT_BG1_ON |\n                                      DISPCNT_OBJ_ON);\n        if (!gPaletteFade.active)\n            sTradeAnim->state++;\n        break;\n    case STATE_LINK_MON_TRAVEL_IN:\n        gSprites[sTradeAnim->connectionSpriteId1].y2 += 3;\n        gSprites[sTradeAnim->connectionSpriteId2].y2 += 3;\n        if (gSprites[sTradeAnim->connectionSpriteId1].y2 + gSprites[sTradeAnim->connectionSpriteId1].y == 64)\n            sTradeAnim->state++;\n        break;\n    case STATE_PAN_TO_GBA:\n        if ((sTradeAnim->bg1vofs += 2) > 316)\n        {\n            sTradeAnim->bg1vofs = 316;\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_DESTROY_LINK_MON:\n        DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]);\n        DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]);\n        sTradeAnim->state++;\n        sTradeAnim->timer = 0;\n        break;\n    case STATE_LINK_MON_ARRIVED_DELAY:\n        if (++sTradeAnim->timer == 10)\n            sTradeAnim->state++;\n        break;\n    case STATE_MOVE_GBA_TO_CENTER:\n        if (++sTradeAnim->bg1vofs > 348)\n        {\n            sTradeAnim->bg1vofs = 348;\n            sTradeAnim->state++;\n        }\n        if (sTradeAnim->bg1vofs == 328 && sTradeAnim->isCableTrade)\n        {\n            sTradeAnim->cableEndSpriteId = CreateSprite(&sSpriteTemplate_CableEnd, 128, 65, 0);\n            gSprites[sTradeAnim->cableEndSpriteId].callback = SpriteCB_CableEndReceiving;\n        }\n        break;\n    case STATE_GBA_FLASH_RECV:\n        sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0);\n        sTradeAnim->state = STATE_GBA_STOP_FLASH_RECV;\n        break;\n    case STATE_GBA_STOP_FLASH_RECV:\n        if (gSprites[sTradeAnim->connectionSpriteId2].animEnded)\n        {\n            DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]);\n            SetTradeSequenceBgGpuRegs(6);\n            sTradeAnim->state++;\n            PlaySE(SE_M_SAND_ATTACK);\n        }\n        break;\n    case STATE_GBA_ZOOM_IN:\n        if (sTradeAnim->bg2Zoom < 0x400)\n        {\n            sTradeAnim->bg2Zoom += 0x34;\n        }\n        else\n        {\n            sTradeAnim->bg2Zoom = 0x400;\n            sTradeAnim->state++;\n        }\n        sTradeAnim->sXY = 0x8000 / sTradeAnim->bg2Zoom;\n        break;\n    case STATE_FADE_OUT_TO_NEW_MON:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_NEW_MON;\n        break;\n\n    case STATE_WAIT_FADE_OUT_TO_NEW_MON:\n        if (!gPaletteFade.active)\n        {\n            SetTradeSequenceBgGpuRegs(5);\n            SetTradeSequenceBgGpuRegs(7);\n            gPaletteFade.bufferTransferDisabled = TRUE;\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_FADE_IN_TO_NEW_MON:\n        gPaletteFade.bufferTransferDisabled = FALSE;\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        sTradeAnim->state++;\n        break;\n    case STATE_WAIT_FADE_IN_TO_NEW_MON:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |\n                                      DISPCNT_OBJ_1D_MAP |\n                                      DISPCNT_BG2_ON |\n                                      DISPCNT_OBJ_ON);\n        if (!gPaletteFade.active)\n        {\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_POKEBALL_ARRIVE:\n        sTradeAnim->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, -8, 0);\n        gSprites[sTradeAnim->bouncingPokeballSpriteId].data[3] = 74;\n        gSprites[sTradeAnim->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballArrive;\n        StartSpriteAnim(&gSprites[sTradeAnim->bouncingPokeballSpriteId], 1);\n        StartSpriteAffineAnim(&gSprites[sTradeAnim->bouncingPokeballSpriteId], 2);\n        BlendPalettes(1 << (16 + gSprites[sTradeAnim->bouncingPokeballSpriteId].oam.paletteNum), 16, RGB_WHITEALPHA);\n        sTradeAnim->state++;\n        sTradeAnim->timer = 0;\n        break;\n    case STATE_FADE_POKEBALL_TO_NORMAL:\n        BeginNormalPaletteFade(1 << (16 + gSprites[sTradeAnim->bouncingPokeballSpriteId].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA);\n        sTradeAnim->state++;\n        break;\n    case STATE_POKEBALL_ARRIVE_WAIT:\n        if (gSprites[sTradeAnim->bouncingPokeballSpriteId].callback == SpriteCallbackDummy)\n        {\n            HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeAnim->monSpecies[TRADE_PARTNER]],\n                                      gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_RIGHT],\n                                      sTradeAnim->monSpecies[TRADE_PARTNER],\n                                      sTradeAnim->monPersonalities[TRADE_PARTNER]);\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_SHOW_NEW_MON:\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x = 120;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y = gMonFrontPicCoords[sTradeAnim->monSpecies[TRADE_PARTNER]].y_offset + 60;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x2 = 0;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y2 = 0;\n        StartSpriteAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]], 0);\n        CreatePokeballSpriteToReleaseMon(sTradeAnim->monSpriteIds[TRADE_PARTNER], gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF);\n        FreeSpriteOamMatrix(&gSprites[sTradeAnim->bouncingPokeballSpriteId]);\n        DestroySprite(&gSprites[sTradeAnim->bouncingPokeballSpriteId]);\n        sTradeAnim->state++;\n        break;\n    case STATE_NEW_MON_MSG:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |\n                                      DISPCNT_OBJ_1D_MAP |\n                                      DISPCNT_BG0_ON |\n                                      DISPCNT_BG2_ON |\n                                      DISPCNT_OBJ_ON);\n        StringExpandPlaceholders(gStringVar4, gText_XSentOverY);\n        DrawTextOnTradeWindow(0, gStringVar4, 0);\n        sTradeAnim->state = STATE_DELAY_FOR_MON_ANIM;\n        sTradeAnim->timer = 0;\n        break;\n    case STATE_DELAY_FOR_MON_ANIM:\n        if (++sTradeAnim->timer > 60)\n        {\n            if (sTradeAnim->monSpecies[TRADE_PARTNER] != SPECIES_EGG)\n                PlayCry_Normal(sTradeAnim->monSpecies[TRADE_PARTNER], 0);\n            sTradeAnim->state = STATE_WAIT_FOR_MON_CRY;\n            sTradeAnim->timer = 0;\n        }\n        break;\n    case STATE_WAIT_FOR_MON_CRY:\n        if (IsCryFinished())\n            sTradeAnim->state = STATE_TAKE_CARE_OF_MON;\n        break;\n    case STATE_TAKE_CARE_OF_MON:\n        if (++sTradeAnim->timer == 10)\n            PlayFanfare(MUS_EVOLVED);\n\n        if (sTradeAnim->timer == 250)\n        {\n            sTradeAnim->state++;\n            StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX);\n            DrawTextOnTradeWindow(0, gStringVar4, 0);\n            sTradeAnim->timer = 0;\n        }\n        break;\n    case STATE_AFTER_NEW_MON_DELAY:\n        if (++sTradeAnim->timer == 60)\n            sTradeAnim->state++;\n        break;\n    case STATE_CHECK_RIBBONS:\n        CheckPartnersMonForRibbons();\n        sTradeAnim->state++;\n        break;\n    case STATE_END_LINK_TRADE:\n        if (sTradeAnim->isLinkTrade)\n            return TRUE;\n        else if (JOY_NEW(A_BUTTON))\n            sTradeAnim->state++;\n        break;\n    case STATE_TRY_EVOLUTION: // Only if in-game trade, link trades use CB2_TryLinkTradeEvolution\n        TradeMons(gSpecialVar_0x8005, 0);\n        gCB2_AfterEvolution = CB2_InGameTrade;\n        evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE);\n        if (evoTarget != SPECIES_NONE)\n            TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeAnim->monSpriteIds[1], gSelectedTradeMonPositions[TRADE_PLAYER]);\n        sTradeAnim->state++;\n        break;\n    case STATE_FADE_OUT_END:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sTradeAnim->state++;\n        break;\n    case STATE_WAIT_FADE_OUT_END:\n        if (!gPaletteFade.active)\n        {\n            PlayNewMapMusic(sTradeAnim->cachedMapMusic);\n            if (sTradeAnim)\n            {\n                FreeAllWindowBuffers();\n                Free(GetBgTilemapBuffer(3));\n                Free(GetBgTilemapBuffer(1));\n                Free(GetBgTilemapBuffer(0));\n                FreeMonSpritesGfx();\n                FREE_AND_SET_NULL(sTradeAnim);\n            }\n            SetMainCallback2(CB2_ReturnToField);\n            BufferInGameTradeMonName();\n            HelpSystem_Enable();\n        }\n        break;\n    }\n    return FALSE;\n}\n\n// Task data for Task_AnimateWirelessSignal\n#define tIdx               data[0]\n#define tCounter           data[1]\n#define tSignalComingBack  data[2]\n\nstatic bool8 DoTradeAnim_Wireless(void)\n{\n    u16 evoTarget;\n\n    switch (sTradeAnim->state)\n    {\n    case STATE_START:\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = FALSE;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x2 = -180;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 = gMonFrontPicCoords[sTradeAnim->monSpecies[TRADE_PLAYER]].y_offset;\n        sTradeAnim->state++;\n        sTradeAnim->cachedMapMusic = GetCurrentMapMusic();\n        PlayNewMapMusic(MUS_EVOLUTION);\n        break;\n    case STATE_MON_SLIDE_IN:\n        if (sTradeAnim->bg2hofs > 0)\n        {\n            gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x2 += 3;\n            sTradeAnim->bg2hofs -= 3;\n        }\n        else\n        {\n            gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x2 = 0;\n            sTradeAnim->bg2hofs = 0;\n            sTradeAnim->state = STATE_SEND_MSG;\n        }\n        break;\n    case STATE_SEND_MSG:\n        StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY);\n        DrawTextOnTradeWindow(0, gStringVar4, 0);\n\n        if (sTradeAnim->monSpecies[TRADE_PLAYER] != SPECIES_EGG)\n            PlayCry_Normal(sTradeAnim->monSpecies[TRADE_PLAYER], 0);\n\n        sTradeAnim->state = STATE_BYE_BYE;\n        sTradeAnim->timer = 0;\n        break;\n    case STATE_BYE_BYE:\n        if (++sTradeAnim->timer == 80)\n        {\n            sTradeAnim->releasePokeballSpriteId = CreateTradePokeballSprite(sTradeAnim->monSpriteIds[TRADE_PLAYER], gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff);\n            sTradeAnim->state++;\n            StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1);\n            DrawTextOnTradeWindow(0, gStringVar4, 0);\n        }\n        break;\n    case STATE_POKEBALL_DEPART:\n        if (gSprites[sTradeAnim->releasePokeballSpriteId].callback == SpriteCallbackDummy)\n        {\n            sTradeAnim->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, 32, 0);\n            gSprites[sTradeAnim->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballDepart;\n            DestroySprite(&gSprites[sTradeAnim->releasePokeballSpriteId]);\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_POKEBALL_DEPART_WAIT:\n        // The game waits here for the sprite to finish its animation sequence.\n        break;\n    case STATE_FADE_OUT_TO_GBA_SEND:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_GBA_SEND;\n        break;\n    case STATE_WAIT_FADE_OUT_TO_GBA_SEND:\n        if (!gPaletteFade.active)\n        {\n            SetTradeSequenceBgGpuRegs(4);\n            FillWindowPixelBuffer(0, PIXEL_FILL(15));\n            CopyWindowToVram(0, COPYWIN_FULL);\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_FADE_IN_TO_GBA_SEND:\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n        sTradeAnim->state++;\n        break;\n    case STATE_WAIT_FADE_IN_TO_GBA_SEND:\n        if (!gPaletteFade.active)\n            sTradeAnim->state = STATE_GBA_ZOOM_OUT;\n        break;\n    case STATE_GBA_ZOOM_OUT:\n        if (sTradeAnim->bg2Zoom > 0x100)\n        {\n            sTradeAnim->bg2Zoom -= 0x34;\n        }\n        else\n        {\n            SetTradeSequenceBgGpuRegs(1);\n            sTradeAnim->bg2Zoom = 0x80;\n            sTradeAnim->state = STATE_GBA_FLASH_SEND_WIRELESS;\n            sTradeAnim->timer = 0;\n        }\n        sTradeAnim->sXY = 0x8000 / sTradeAnim->bg2Zoom;\n        break;\n    case STATE_GBA_FLASH_SEND_WIRELESS:\n        if (++sTradeAnim->timer > 20)\n        {\n            SetTradeSequenceBgGpuRegs(3);\n            sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Short, 120, 80, 0);\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_GBA_STOP_FLASH_SEND_WIRELESS:\n        if (gSprites[sTradeAnim->connectionSpriteId2].animEnded)\n        {\n            DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]);\n            SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 |\n                                         BLDCNT_TGT1_OBJ |\n                                         BLDCNT_EFFECT_BLEND |\n                                         BLDCNT_TGT2_BG2);\n            SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 4));\n            \n            // Start wireless signal effect\n            CreateTask(Task_AnimateWirelessSignal, 5);\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_WAIT_WIRELESS_SIGNAL_SEND:\n        if (!FuncIsActiveTask(Task_AnimateWirelessSignal))\n            sTradeAnim->state = STATE_PAN_AWAY_GBA;\n        break;\n    case STATE_PAN_AWAY_GBA:\n        if (--sTradeAnim->bg1vofs == 316)\n            sTradeAnim->state++;\n        break;\n    case STATE_CREATE_LINK_MON_LEAVING:\n        sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 120, 80, 3);\n        gSprites[sTradeAnim->connectionSpriteId1].callback = SpriteCB_LinkMonGlowWireless;\n        sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 120, 80, 0);\n        StartSpriteAnim(&gSprites[sTradeAnim->connectionSpriteId2], ANIM_LINKMON_SMALL);\n        sTradeAnim->state++;\n        break;\n    case STATE_LINK_MON_TRAVEL_OUT:\n        if ((sTradeAnim->bg1vofs -= 3) == 166)\n            sTradeAnim->state = STATE_LINK_MON_TRAVEL_OFFSCREEN;\n\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 |\n                                      DISPCNT_OBJ_1D_MAP |\n                                      DISPCNT_BG1_ON |\n                                      DISPCNT_OBJ_ON);\n        break;\n    case STATE_LINK_MON_TRAVEL_OFFSCREEN:\n        gSprites[sTradeAnim->connectionSpriteId1].y -= 2;\n        gSprites[sTradeAnim->connectionSpriteId2].y -= 2;\n        if (gSprites[sTradeAnim->connectionSpriteId1].y < -8)\n            sTradeAnim->state = STATE_FADE_OUT_TO_CROSSING;\n        break;\n    case STATE_FADE_OUT_TO_CROSSING:\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);\n        sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_CROSSING;\n        break;\n    case STATE_WAIT_FADE_OUT_TO_CROSSING:\n        if (!gPaletteFade.active)\n        {\n            DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]);\n            DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]);\n            SetTradeSequenceBgGpuRegs(2);\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_FADE_IN_TO_CROSSING:\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n        sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 111, 170, 0);\n        sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 129, -10, 0);\n        sTradeAnim->state++;\n        break;\n    case STATE_WAIT_FADE_IN_TO_CROSSING:\n        if (!gPaletteFade.active)\n        {\n            PlaySE(SE_WARP_OUT);\n            sTradeAnim->state++;\n        }\n        gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3;\n        gSprites[sTradeAnim->connectionSpriteId2].y2 += 3;\n        break;\n    case STATE_CROSSING_LINK_MONS_ENTER:\n        gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3;\n        gSprites[sTradeAnim->connectionSpriteId2].y2 += 3;\n        if (gSprites[sTradeAnim->connectionSpriteId1].y2 <= -90)\n        {\n            gSprites[sTradeAnim->connectionSpriteId1].data[1] = 1;\n            gSprites[sTradeAnim->connectionSpriteId2].data[1] = 1;\n            sTradeAnim->state++;\n            CreateTask(Task_OpenCenterWhiteColumn, 5);\n        }\n        break;\n    case STATE_CROSSING_BLEND_WHITE_1:\n        BlendPalettes(0x8, 16, RGB_WHITEALPHA);\n        sTradeAnim->state++;\n        break;\n    case STATE_CROSSING_BLEND_WHITE_2:\n        BlendPalettes(0x8, 16, RGB_WHITEALPHA);\n        sTradeAnim->state++;\n        break;\n    case STATE_CROSSING_BLEND_WHITE_3:\n        BlendPalettes(0x8, 16, RGB_WHITEALPHA);\n        sTradeAnim->state++;\n        break;\n    case STATE_CROSSING_CREATE_MON_PICS:\n        if (!IsMonSpriteNotFlipped(sTradeAnim->monSpecies[TRADE_PLAYER]))\n        {\n            gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].affineAnims = sAffineAnims_CrossingMonPics;\n            gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE;\n            CalcCenterToCornerVec(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE);\n            StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], 0);\n        }\n        else\n        {\n            StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], 0);\n        }\n        StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]], 0);\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x = 40;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x = 200;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y = 192;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y = -32;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = FALSE;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].invisible = FALSE;\n        sTradeAnim->state++;\n        break;\n    case STATE_CROSSING_MON_PICS_MOVE:\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 -= 3;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y2 += 3;\n        if (gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 < -DISPLAY_HEIGHT\n         && gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 >= -DISPLAY_HEIGHT - 3)\n        {\n            PlaySE(SE_WARP_IN);\n        }\n        if (gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 < -222)\n        {\n            gSprites[sTradeAnim->connectionSpriteId1].data[1] = 0;\n            gSprites[sTradeAnim->connectionSpriteId2].data[1] = 0;\n            sTradeAnim->state++;\n            gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = TRUE;\n            gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].invisible = TRUE;\n            CreateTask(Task_CloseCenterWhiteColumn, 5);\n        }\n        break;\n    case STATE_CROSSING_LINK_MONS_EXIT:\n        gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3;\n        gSprites[sTradeAnim->connectionSpriteId2].y2 += 3;\n        if (gSprites[sTradeAnim->connectionSpriteId1].y2 <= -222)\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);\n            sTradeAnim->state++;\n            DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]);\n            DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]);\n        }\n        break;\n    case STATE_CREATE_LINK_MON_ARRIVING:\n        if (!gPaletteFade.active)\n        {\n            sTradeAnim->state++;\n            SetTradeSequenceBgGpuRegs(1);\n            sTradeAnim->bg1vofs = 166;\n            SetTradeSequenceBgGpuRegs(3);\n            sTradeAnim->bg2vofs = 412;\n            sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 120, -20, 3);\n            gSprites[sTradeAnim->connectionSpriteId1].callback = SpriteCB_LinkMonGlowWireless;\n            sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 120, -20, 0);\n            StartSpriteAnim(&gSprites[sTradeAnim->connectionSpriteId2], 1);\n        }\n        break;\n    case STATE_FADE_OUT_TO_GBA_RECV:\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n        sTradeAnim->state++;\n        break;\n    case STATE_WAIT_FADE_OUT_TO_GBA_RECV:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |\n                                      DISPCNT_OBJ_1D_MAP |\n                                      DISPCNT_BG1_ON |\n                                      DISPCNT_OBJ_ON);\n        if (!gPaletteFade.active)\n            sTradeAnim->state++;\n        break;\n    case STATE_LINK_MON_TRAVEL_IN:\n        gSprites[sTradeAnim->connectionSpriteId1].y2 += 4;\n        gSprites[sTradeAnim->connectionSpriteId2].y2 += 4;\n        if (gSprites[sTradeAnim->connectionSpriteId1].y2 + gSprites[sTradeAnim->connectionSpriteId1].y == 64)\n        {\n            sTradeAnim->state = STATE_PAN_TO_GBA_WIRELESS;\n            sTradeAnim->timer = 0;\n        }\n        break;\n    case STATE_PAN_TO_GBA_WIRELESS:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |\n                                      DISPCNT_OBJ_1D_MAP |\n                                      DISPCNT_BG1_ON |\n                                      DISPCNT_BG2_ON |\n                                      DISPCNT_OBJ_ON);\n        sTradeAnim->bg1vofs += 3;\n        sTradeAnim->bg2vofs += 3;\n        if (++sTradeAnim->timer == 10)\n        {\n            u8 taskId = CreateTask(Task_AnimateWirelessSignal, 5);\n            gTasks[taskId].tSignalComingBack = TRUE;\n        }\n        if (sTradeAnim->bg1vofs > 316)\n        {\n            sTradeAnim->bg1vofs = 316;\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_DESTROY_LINK_MON_WIRELESS:\n        DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]);\n        DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]);\n        sTradeAnim->state++;\n        sTradeAnim->timer = 0;\n        break;\n    case STATE_WAIT_WIRELESS_SIGNAL_RECV:\n        if (!FuncIsActiveTask(Task_AnimateWirelessSignal))\n        {\n            sTradeAnim->state = STATE_LINK_MON_ARRIVED_DELAY;\n            sTradeAnim->timer = 0;\n        }\n        break;\n    case STATE_LINK_MON_ARRIVED_DELAY:\n        if (++sTradeAnim->timer == 10)\n            sTradeAnim->state++;\n        break;\n    case STATE_MOVE_GBA_TO_CENTER:\n        if (++sTradeAnim->bg1vofs > 348)\n        {\n            sTradeAnim->bg1vofs = 348;\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_GBA_FLASH_RECV:\n        sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0);\n        sTradeAnim->state = STATE_GBA_STOP_FLASH_RECV;\n        break;\n    case STATE_GBA_STOP_FLASH_RECV:\n        if (gSprites[sTradeAnim->connectionSpriteId2].animEnded)\n        {\n            DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]);\n            SetTradeSequenceBgGpuRegs(6);\n            sTradeAnim->state++;\n            PlaySE(SE_M_SAND_ATTACK);\n        }\n        break;\n    case STATE_GBA_ZOOM_IN:\n        if (sTradeAnim->bg2Zoom < 0x400)\n        {\n            sTradeAnim->bg2Zoom += 0x34;\n        }\n        else\n        {\n            sTradeAnim->bg2Zoom = 0x400;\n            sTradeAnim->state++;\n        }\n        sTradeAnim->sXY = 0x8000 / sTradeAnim->bg2Zoom;\n        break;\n    case STATE_FADE_OUT_TO_NEW_MON:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sTradeAnim->state = 60;\n        break;\n    case STATE_WAIT_FADE_OUT_TO_NEW_MON:\n        if (!gPaletteFade.active)\n        {\n            SetTradeSequenceBgGpuRegs(5);\n            SetTradeSequenceBgGpuRegs(7);\n            gPaletteFade.bufferTransferDisabled = TRUE;\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_FADE_IN_TO_NEW_MON:\n        gPaletteFade.bufferTransferDisabled = FALSE;\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        sTradeAnim->state++;\n        break;\n    case STATE_WAIT_FADE_IN_TO_NEW_MON:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |\n                                      DISPCNT_OBJ_1D_MAP |\n                                      DISPCNT_BG2_ON |\n                                      DISPCNT_OBJ_ON);\n        if (!gPaletteFade.active)\n            sTradeAnim->state++;\n        break;\n    case STATE_POKEBALL_ARRIVE:\n        sTradeAnim->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, -8, 0);\n        gSprites[sTradeAnim->bouncingPokeballSpriteId].data[3] = 74;\n        gSprites[sTradeAnim->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballArrive;\n        StartSpriteAnim(&gSprites[sTradeAnim->bouncingPokeballSpriteId], 1);\n        StartSpriteAffineAnim(&gSprites[sTradeAnim->bouncingPokeballSpriteId], 2);\n        BlendPalettes(1 << (16 + gSprites[sTradeAnim->bouncingPokeballSpriteId].oam.paletteNum), 16, RGB_WHITEALPHA);\n        sTradeAnim->state++;\n        sTradeAnim->timer = 0;\n        break;\n    case STATE_FADE_POKEBALL_TO_NORMAL:\n        BeginNormalPaletteFade(1 << (16 + gSprites[sTradeAnim->bouncingPokeballSpriteId].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA);\n        sTradeAnim->state++;\n        break;\n    case STATE_POKEBALL_ARRIVE_WAIT:\n        if (gSprites[sTradeAnim->bouncingPokeballSpriteId].callback == SpriteCallbackDummy)\n        {\n            HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeAnim->monSpecies[TRADE_PARTNER]],\n                                     gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_RIGHT],\n                                     sTradeAnim->monSpecies[TRADE_PARTNER],\n                                     sTradeAnim->monPersonalities[TRADE_PARTNER]);\n            sTradeAnim->state++;\n        }\n        break;\n    case STATE_SHOW_NEW_MON:\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x = 120;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y = gMonFrontPicCoords[sTradeAnim->monSpecies[TRADE_PARTNER]].y_offset + 60;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x2 = 0;\n        gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y2 = 0;\n        StartSpriteAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]], 0);\n        CreatePokeballSpriteToReleaseMon(sTradeAnim->monSpriteIds[TRADE_PARTNER], gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF);\n        FreeSpriteOamMatrix(&gSprites[sTradeAnim->bouncingPokeballSpriteId]);\n        DestroySprite(&gSprites[sTradeAnim->bouncingPokeballSpriteId]);\n        sTradeAnim->state++;\n        break;\n    case STATE_NEW_MON_MSG:\n        SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |\n                                      DISPCNT_OBJ_1D_MAP |\n                                      DISPCNT_BG0_ON |\n                                      DISPCNT_BG2_ON |\n                                      DISPCNT_OBJ_ON);\n        StringExpandPlaceholders(gStringVar4, gText_XSentOverY);\n        DrawTextOnTradeWindow(0, gStringVar4, 0);\n        sTradeAnim->state = STATE_DELAY_FOR_MON_ANIM;\n        sTradeAnim->timer = 0;\n        break;\n    case STATE_DELAY_FOR_MON_ANIM:\n        if (++sTradeAnim->timer > 60)\n        {\n            if (sTradeAnim->monSpecies[TRADE_PARTNER] != SPECIES_EGG)\n                PlayCry_Normal(sTradeAnim->monSpecies[TRADE_PARTNER], 0);\n            sTradeAnim->state = STATE_WAIT_FOR_MON_CRY;\n            sTradeAnim->timer = 0;\n        }\n        break;\n    case STATE_WAIT_FOR_MON_CRY:\n        if (IsCryFinished())\n            sTradeAnim->state = STATE_TAKE_CARE_OF_MON;\n        break;\n    case STATE_TAKE_CARE_OF_MON:\n        if (++sTradeAnim->timer == 10)\n            PlayFanfare(MUS_EVOLVED);\n\n        if (sTradeAnim->timer == 250)\n        {\n            sTradeAnim->state++;\n            StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX);\n            DrawTextOnTradeWindow(0, gStringVar4, 0);\n            sTradeAnim->timer = 0;\n        }\n        break;\n    case STATE_AFTER_NEW_MON_DELAY:\n        if (++sTradeAnim->timer == 60)\n            sTradeAnim->state++;\n        break;\n    case STATE_CHECK_RIBBONS:\n        CheckPartnersMonForRibbons();\n        sTradeAnim->state++;\n        break;\n    case STATE_END_LINK_TRADE:\n        if (sTradeAnim->isLinkTrade)\n            return TRUE;\n        else if (JOY_NEW(A_BUTTON))\n            sTradeAnim->state++;\n        break;\n    case STATE_TRY_EVOLUTION: // Only if in-game trade, link trades use CB2_TryLinkTradeEvolution\n        TradeMons(gSpecialVar_0x8005, 0);\n        gCB2_AfterEvolution = CB2_InGameTrade;\n        evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE);\n        if (evoTarget != SPECIES_NONE)\n            TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeAnim->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]);\n        sTradeAnim->state++;\n        break;\n    case STATE_FADE_OUT_END:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        sTradeAnim->state++;\n        break;\n    case STATE_WAIT_FADE_OUT_END:\n        if (!gPaletteFade.active)\n        {\n            PlayNewMapMusic(sTradeAnim->cachedMapMusic);\n            if (sTradeAnim)\n            {\n                FreeAllWindowBuffers();\n                Free(GetBgTilemapBuffer(3));\n                Free(GetBgTilemapBuffer(1));\n                Free(GetBgTilemapBuffer(0));\n                FreeMonSpritesGfx();\n                FREE_AND_SET_NULL(sTradeAnim);\n            }\n            SetMainCallback2(CB2_ReturnToField);\n            BufferInGameTradeMonName();\n            HelpSystem_Enable();\n        }\n        break;\n    }\n    return FALSE;\n}\n\n// Try to evolve a Pokémon received in a link trade\n// In-game trades resolve evolution during the trade sequence, in STATE_TRY_EVOLUTION\nstatic void CB2_TryLinkTradeEvolution(void)\n{\n    u16 evoSpecies;\n    switch (gMain.state)\n    {\n    case 0:\n        gMain.state = 4;\n        gSoftResetDisabled = TRUE;\n        break;\n    case 4:\n        gCB2_AfterEvolution = CB2_SaveAndEndTrade;\n        evoSpecies = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, 0);\n        if (evoSpecies != SPECIES_NONE)\n            TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoSpecies, sTradeAnim->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]);\n        else\n            SetMainCallback2(CB2_SaveAndEndTrade);\n        gSelectedTradeMonPositions[TRADE_PLAYER] = 0xFF;\n        break;\n    }\n    if (!HasLinkErrorOccurred())\n        RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void HandleLinkDataReceive(void)\n{\n    u8 recvStatus;\n    TradeGetMultiplayerId(); // no effect call, ret val ignored\n    recvStatus = GetBlockReceivedStatus();\n    if (recvStatus & (1 << 0))\n    {\n        if (gBlockRecvBuffer[0][0] == LINKCMD_CONFIRM_FINISH_TRADE)\n            SetMainCallback2(CB2_TryLinkTradeEvolution);\n        if (gBlockRecvBuffer[0][0] == LINKCMD_READY_FINISH_TRADE)\n            sTradeAnim->playerFinishStatus = STATUS_READY;\n        ResetBlockReceivedFlag(0);\n    }\n    if (recvStatus & (1 << 1))\n    {\n        if (gBlockRecvBuffer[1][0] == LINKCMD_READY_FINISH_TRADE)\n            sTradeAnim->partnerFinishStatus = STATUS_READY;\n        ResetBlockReceivedFlag(1);\n    }\n}\n\nstatic void SpriteCB_BouncingPokeball(struct Sprite *sprite)\n{\n    sprite->y += sprite->data[0] / 10;\n    sprite->data[5] += sprite->data[1];\n    sprite->x = sprite->data[5] / 10;\n    if (sprite->y > 76)\n    {\n        sprite->y = 76;\n        sprite->data[0] = -(sprite->data[0] * sprite->data[2]) / 100;\n        sprite->data[3]++;\n    }\n    if (sprite->x == 120)\n        sprite->data[1] = 0;\n    sprite->data[0] += sprite->data[4];\n    if (sprite->data[3] == 4)\n    {\n        sprite->data[7] = 1;\n        sprite->callback = SpriteCallbackDummy;\n    }\n}\n\nstatic void SpriteCB_BouncingPokeballDepart(struct Sprite *sprite)\n{\n    sprite->y2 += sTradeBallVerticalVelocityTable[sprite->data[0]];\n    if (sprite->data[0] == 22)\n        PlaySE(SE_BALL_BOUNCE_1);\n    if (++sprite->data[0] == 44)\n    {\n        PlaySE(SE_M_MEGA_KICK);\n        sprite->callback = SpriteCB_BouncingPokeballDepartEnd;\n        sprite->data[0] = 0;\n        BeginNormalPaletteFade(1 << (sprite->oam.paletteNum + 16), -1, 0, 16, RGB_WHITEALPHA);\n    }\n}\n\nstatic void SpriteCB_BouncingPokeballDepartEnd(struct Sprite *sprite)\n{\n    if (sprite->data[1] == 20)\n        StartSpriteAffineAnim(sprite, 1);\n    if (++sprite->data[1] > 20)\n    {\n        sprite->y2 -= sTradeBallVerticalVelocityTable[sprite->data[0]];\n        if (++sprite->data[0] == 23)\n        {\n            DestroySprite(sprite);\n            sTradeAnim->state = 14;\n        }\n    }\n}\n\nstatic void SpriteCB_BouncingPokeballArrive(struct Sprite *sprite)\n{\n    if (sprite->data[2] == 0)\n    {\n        sprite->y += 4;\n        if (sprite->y > sprite->data[3])\n        {\n            sprite->data[2]++;\n            sprite->data[0] = 22;\n            PlaySE(SE_BALL_BOUNCE_1);\n        }\n    }\n    else\n    {\n        if (sprite->data[0] == 66)\n            PlaySE(SE_BALL_BOUNCE_2);\n        if (sprite->data[0] == 92)\n            PlaySE(SE_BALL_BOUNCE_3);\n        if (sprite->data[0] == 107)\n            PlaySE(SE_BALL_BOUNCE_4);\n        sprite->y2 += sTradeBallVerticalVelocityTable[sprite->data[0]];\n        if (++sprite->data[0] == 108)\n            sprite->callback = SpriteCallbackDummy;\n    }\n}\n\nu16 GetInGameTradeSpeciesInfo(void)\n{\n    // Populates gStringVar1 with the name of the requested species and\n    // gStringVar2 with the name of the offered species.\n    // Returns the requested species.\n    const struct InGameTrade * inGameTrade = &sInGameTrades[gSpecialVar_0x8004];\n    if(gSpecialVar_0x8004 == INGAME_TRADE_LICKITUNG)\n    {\n        if(gSaveBlock1Ptr->keyFlags.version == 1)\n            StringCopy(gStringVar1, gSpeciesNames[SPECIES_SLOWBRO]);\n        else\n            StringCopy(gStringVar1, gSpeciesNames[SPECIES_GOLDUCK]);\n    }\n    else\n        StringCopy(gStringVar1, gSpeciesNames[inGameTrade->requestedSpecies]);\n    StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]);\n    return inGameTrade->requestedSpecies;\n}\n\nstatic void BufferInGameTradeMonName(void)\n{\n    // Populates gStringVar1 with the nickname of the sent Pokemon and\n    // gStringVar2 with the name of the offered species.\n    u8 nickname[30];\n    const struct InGameTrade * inGameTrade = &sInGameTrades[gSpecialVar_0x8004];\n    GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname);\n    StringCopy_Nickname(gStringVar1, nickname);\n    StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]);\n}\n\nstatic void CreateInGameTradePokemonInternal(u8 playerSlot, u8 inGameTradeIdx)\n{\n    const struct InGameTrade * inGameTrade = &sInGameTrades[inGameTradeIdx];\n    u8 level = GetMonData(&gPlayerParty[playerSlot], MON_DATA_LEVEL);\n    u16 hp = GetMonData(&gPlayerParty[playerSlot], MON_DATA_HP);\n    struct Mail mail;\n    u8 metLocation = METLOC_IN_GAME_TRADE;\n    struct Pokemon * tradeMon = &gEnemyParty[0];\n    u8 mailNum;\n    CreateMon(tradeMon, inGameTrade->species, level, USE_RANDOM_IVS, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId);\n    SetMonData(tradeMon, MON_DATA_HP_IV, &inGameTrade->ivs[0]);\n    SetMonData(tradeMon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]);\n    SetMonData(tradeMon, MON_DATA_DEF_IV, &inGameTrade->ivs[2]);\n    SetMonData(tradeMon, MON_DATA_SPEED_IV, &inGameTrade->ivs[3]);\n    SetMonData(tradeMon, MON_DATA_SPATK_IV, &inGameTrade->ivs[4]);\n    SetMonData(tradeMon, MON_DATA_SPDEF_IV, &inGameTrade->ivs[5]);\n    SetMonData(tradeMon, MON_DATA_NICKNAME, inGameTrade->nickname);\n    SetMonData(tradeMon, MON_DATA_OT_NAME, inGameTrade->otName);\n    SetMonData(tradeMon, MON_DATA_OT_GENDER, &inGameTrade->otGender);\n    SetMonData(tradeMon, MON_DATA_ABILITY_NUM, &inGameTrade->abilityNum);\n    SetMonData(tradeMon, MON_DATA_BEAUTY, &inGameTrade->conditions[1]);\n    SetMonData(tradeMon, MON_DATA_CUTE, &inGameTrade->conditions[2]);\n    SetMonData(tradeMon, MON_DATA_COOL, &inGameTrade->conditions[0]);\n    SetMonData(tradeMon, MON_DATA_SMART, &inGameTrade->conditions[3]);\n    SetMonData(tradeMon, MON_DATA_TOUGH, &inGameTrade->conditions[4]);\n    SetMonData(tradeMon, MON_DATA_SHEEN, &inGameTrade->sheen);\n    SetMonData(tradeMon, MON_DATA_MET_LOCATION, &metLocation);\n    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n    {\n        if(hp == 0)\n            SetMonData(tradeMon, MON_DATA_HP, &hp);\n        SetNuzlockeDupeFlags(inGameTrade->species);\n    }\n    mailNum = 0;\n    if (inGameTrade->heldItem != ITEM_NONE)\n    {\n        if (ItemIsMail(inGameTrade->heldItem))\n        {\n            GetInGameTradeMail(&mail, inGameTrade);\n            gLinkPartnerMail[0] = mail;\n            SetMonData(tradeMon, MON_DATA_MAIL, &mailNum);\n            SetMonData(tradeMon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem);\n        }\n        else\n        {\n            SetMonData(tradeMon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem);\n        }\n    }\n    CalculateMonStats(&gEnemyParty[0], FALSE);\n}\n\nstatic void GetInGameTradeMail(struct Mail * mail, const struct InGameTrade * inGameTrade)\n{\n    int i;\n    for (i = 0; i < MAIL_WORDS_COUNT; i++)\n        mail->words[i] = sInGameTradeMailMessages[inGameTrade->mailNum][i];\n    StringCopy(mail->playerName, inGameTrade->otName);\n    mail->trainerId[0] = inGameTrade->otId >> 24;\n    mail->trainerId[1] = inGameTrade->otId >> 16;\n    mail->trainerId[2] = inGameTrade->otId >> 8;\n    mail->trainerId[3] = inGameTrade->otId;\n    mail->species = inGameTrade->species;\n    mail->itemId = inGameTrade->heldItem;\n}\n\nu16 GetTradeSpecies(void)\n{\n    if (GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_IS_EGG))\n        return SPECIES_NONE;\n    else\n        return GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_SPECIES);\n}\n\nvoid CreateInGameTradePokemon(void)\n{\n    CreateInGameTradePokemonInternal(gSpecialVar_0x8005, gSpecialVar_0x8004);\n}\n\nstatic void CB2_UpdateLinkTrade(void)\n{\n    if (DoTradeAnim() == TRUE)\n    {\n        DestroySprite(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]]);\n        FreeSpriteOamMatrix(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]]);\n        TradeMons(gSelectedTradeMonPositions[TRADE_PLAYER], gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE);\n        sTradeAnim->linkData[0] = LINKCMD_READY_FINISH_TRADE;\n        sTradeAnim->scheduleLinkTransfer = 1;\n        SetMainCallback2(CB2_WaitTradeComplete);\n    }\n    HandleLinkDataSend();\n    HandleLinkDataReceive();\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void CB2_WaitTradeComplete(void)\n{\n    u8 mpId = TradeGetMultiplayerId();\n    HandleLinkDataReceive();\n    if (mpId == 0\n        && sTradeAnim->playerFinishStatus == STATUS_READY\n        && sTradeAnim->partnerFinishStatus == STATUS_READY)\n    {\n        sTradeAnim->linkData[0] = LINKCMD_CONFIRM_FINISH_TRADE;\n        SendBlock(BitmaskAllOtherLinkPlayers(), sTradeAnim->linkData, sizeof(sTradeAnim->linkData));\n        sTradeAnim->playerFinishStatus = STATUS_CANCEL;\n        sTradeAnim->partnerFinishStatus = STATUS_CANCEL;\n    }\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void CB2_SaveAndEndTrade(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        gMain.state++;\n        StringExpandPlaceholders(gStringVar4, gText_CommunicationStandby5);\n        DrawTextOnTradeWindow(0, gStringVar4, 0);\n        break;\n    case 1:\n        SetLinkStandbyCallback();\n        gMain.state = 100;\n        sTradeAnim->timer = 0;\n        break;\n    case 100:\n        if (++sTradeAnim->timer > 180)\n        {\n            gMain.state = 101;\n            sTradeAnim->timer = 0;\n        }\n        if (IsLinkTaskFinished())\n            gMain.state = 2;\n        break;\n    case 101:\n        if (IsLinkTaskFinished())\n            gMain.state = 2;\n        break;\n    case 2:\n        gMain.state = 50;\n        StringExpandPlaceholders(gStringVar4, gText_SavingDontTurnOffThePower2);\n        DrawTextOnTradeWindow(0, gStringVar4, 0);\n        break;\n    case 50:\n        if (InUnionRoom())\n        {\n            SetQuestLogEvent(QL_EVENT_LINK_TRADED_UNION, (void *)&sTradeAnim->questLogData);\n        }\n        else\n        {\n            SetQuestLogEvent(QL_EVENT_LINK_TRADED, (void *)&sTradeAnim->questLogData);\n            IncrementGameStat(GAME_STAT_POKEMON_TRADES);\n        }\n        if (gWirelessCommType)\n            MysteryGift_TryIncrementStat(CARD_STAT_NUM_TRADES, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);\n        SetContinueGameWarpStatusToDynamicWarp();\n        LinkFullSave_Init();\n        gMain.state++;\n        sTradeAnim->timer = 0;\n        break;\n    case 51:\n        if (++sTradeAnim->timer == 5)\n            gMain.state++;\n        break;\n    case 52:\n        if (LinkFullSave_WriteSector())\n        {\n            ClearContinueGameWarpStatus2();\n            gMain.state = 4;\n        }\n        else\n        {\n            // Save isn't finished, delay again\n            sTradeAnim->timer = 0;\n            gMain.state = 51;\n        }\n        break;\n    case 4:\n        LinkFullSave_ReplaceLastSector();\n        gMain.state = 40;\n        sTradeAnim->timer = 0;\n        break;\n    case 40:\n        if (++sTradeAnim->timer > 50)\n        {\n            if (GetMultiplayerId() == 0)\n                sTradeAnim->timer = Random() % 30;\n            else\n                sTradeAnim->timer = 0;\n            gMain.state = 41;\n        }\n        break;\n    case 41:\n        if (sTradeAnim->timer == 0)\n        {\n            SetLinkStandbyCallback();\n            gMain.state = 42;\n        }\n        else\n        {\n            sTradeAnim->timer--;\n        }\n        break;\n    case 42:\n        if (IsLinkTaskFinished())\n        {\n            LinkFullSave_SetLastSectorSignature();\n            gMain.state = 5;\n        }\n        break;\n    case 5:\n        if (++sTradeAnim->timer > 60)\n        {\n            gMain.state++;\n            SetLinkStandbyCallback();\n        }\n        break;\n    case 6:\n        if (IsLinkTaskFinished())\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            gMain.state ++;\n        }\n        break;\n    case 7:\n        if (!gPaletteFade.active)\n        {\n            FadeOutBGM(3);\n            gMain.state++;\n        }\n        break;\n    case 8:\n        if (IsBGMStopped() == TRUE)\n        {\n            if (gWirelessCommType && gMain.savedCallback == CB2_StartCreateTradeMenu)\n                SetLinkStandbyCallback();\n            else\n                SetCloseLinkCallback();\n            gMain.state++;\n        }\n        break;\n    case 9:\n        if (gWirelessCommType && gMain.savedCallback == CB2_StartCreateTradeMenu)\n        {\n            if (IsLinkRfuTaskFinished())\n            {\n                gSoftResetDisabled = FALSE;\n                SetMainCallback2(CB2_FreeTradeAnim);\n            }\n        }\n        else if (!gReceivedRemoteLinkPlayers)\n        {\n            gSoftResetDisabled = FALSE;\n            SetMainCallback2(CB2_FreeTradeAnim);\n        }\n        break;\n    }\n    if (!HasLinkErrorOccurred())\n    {\n        RunTasks();\n    }\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void CB2_FreeTradeAnim(void)\n{\n    if (!gPaletteFade.active)\n    {\n        FreeAllWindowBuffers();\n        Free(GetBgTilemapBuffer(3));\n        Free(GetBgTilemapBuffer(1));\n        Free(GetBgTilemapBuffer(0));\n        FreeMonSpritesGfx();\n        FREE_AND_SET_NULL(sTradeAnim);\n        if (gWirelessCommType != 0)\n            DestroyWirelessStatusIndicatorSprite();\n        SetMainCallback2(gMain.savedCallback);\n    }\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nvoid DoInGameTradeScene(void)\n{\n    LockPlayerFieldControls();\n    CreateTask(Task_InGameTrade, 10);\n    BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n    HelpSystem_Disable();\n}\n\nstatic void Task_InGameTrade(u8 taskId)\n{\n    if (!gPaletteFade.active)\n    {\n        SetMainCallback2(CB2_InitInGameTrade);\n        gFieldCallback = FieldCB_ContinueScriptHandleMusic;\n        DestroyTask(taskId);\n    }\n}\n\nstatic void CheckPartnersMonForRibbons(void)\n{\n    u8 numRibbons = 0;\n    u8 i;\n    for (i = 0; i < (MON_DATA_UNUSED_RIBBONS - MON_DATA_CHAMPION_RIBBON); i++)\n        numRibbons += GetMonData(&gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE], MON_DATA_CHAMPION_RIBBON + i);\n\n    if (numRibbons != 0)\n        FlagSet(FLAG_SYS_RIBBON_GET);\n}\n\nvoid LoadTradeAnimGfx(void)\n{\n    TradeAnimInit_LoadGfx();\n}\n\nvoid DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed)\n{\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(15));\n    sTradeAnim->textColor[0] = 15;\n    sTradeAnim->textColor[1] = 1;\n    sTradeAnim->textColor[2] = 6;\n    AddTextPrinterParameterized4(windowId, FONT_NORMAL, 0, 2, 0, 2, sTradeAnim->textColor, speed, str);\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic void Task_AnimateWirelessSignal(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u16 paletteIdx = 16 * sWirelessSignalAnimParams[tIdx][0];\n\n    if (!tSignalComingBack)\n    {\n        if (paletteIdx == 0x100)\n            LoadPalette(sWirelessSignalAnimPals_Off, BG_PLTT_ID(3), PLTT_SIZE_4BPP);\n        else\n            LoadPalette(&sWirelessSignalAnimPals_Outbound[paletteIdx], BG_PLTT_ID(3), PLTT_SIZE_4BPP);\n    }\n    else\n    {\n        if (paletteIdx == 0x100)\n            LoadPalette(sWirelessSignalAnimPals_Off, BG_PLTT_ID(3), PLTT_SIZE_4BPP);\n        else\n            LoadPalette(&sWirelessSignalAnimPals_Inbound[paletteIdx], BG_PLTT_ID(3), PLTT_SIZE_4BPP);\n    }\n\n    if (sWirelessSignalAnimParams[tIdx][0] == 0 && tCounter == 0)\n        PlaySE(SE_M_HEAL_BELL);\n\n    if (tCounter == sWirelessSignalAnimParams[tIdx][1])\n    {\n        tIdx++;\n        tCounter = 0;\n        if (sWirelessSignalAnimParams[tIdx][1] == 0xFF)\n            DestroyTask(taskId);\n    }\n    else\n    {\n        tCounter++;\n    }\n}\n\n#undef tIdx\n#undef tCounter\n#undef tSignalComingBack\n\nstatic void Task_OpenCenterWhiteColumn(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (data[0] == 0)\n    {\n        sTradeAnim->win0left = sTradeAnim->win0right = DISPLAY_WIDTH / 2;\n        sTradeAnim->win0top = 0;\n        sTradeAnim->win0bottom = DISPLAY_HEIGHT;\n        SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ);\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 |\n                                    WININ_WIN0_BG1 |\n                                    WININ_WIN0_OBJ);\n    }\n\n    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeAnim->win0left, sTradeAnim->win0right));\n    SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeAnim->win0top, sTradeAnim->win0bottom));\n\n    data[0]++;\n    sTradeAnim->win0left -= 5;\n    sTradeAnim->win0right += 5;\n\n    if (sTradeAnim->win0left < 80)\n        DestroyTask(taskId);\n}\n\nstatic void Task_CloseCenterWhiteColumn(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n\n    if (data[0] == 0)\n    {\n        sTradeAnim->win0left = 80;\n        sTradeAnim->win0right = DISPLAY_WIDTH - 80;\n        SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ);\n        SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 |\n                                    WININ_WIN0_BG1 |\n                                    WININ_WIN0_OBJ);\n    }\n\n    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeAnim->win0left, sTradeAnim->win0right));\n    SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeAnim->win0top, sTradeAnim->win0bottom));\n\n    if (sTradeAnim->win0left != DISPLAY_WIDTH / 2)\n    {\n        data[0]++;\n        sTradeAnim->win0left += 5;\n        sTradeAnim->win0right -= 5;\n\n        if (sTradeAnim->win0left > DISPLAY_WIDTH / 2 - 5)\n            BlendPalettes(0x8, 0, RGB_WHITEALPHA);\n    }\n    else\n    {\n        ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n        DestroyTask(taskId);\n    }\n}\n"
  },
  {
    "path": "src/trainer_card.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"scanline_effect.h\"\n#include \"task.h\"\n#include \"link.h\"\n#include \"overworld.h\"\n#include \"menu.h\"\n#include \"event_data.h\"\n#include \"easy_chat.h\"\n#include \"money.h\"\n#include \"strings.h\"\n#include \"trainer_card.h\"\n#include \"pokedex.h\"\n#include \"pokemon_icon.h\"\n#include \"graphics.h\"\n#include \"help_system.h\"\n#include \"trainer_pokemon_sprites.h\"\n#include \"new_menu_helpers.h\"\n#include \"constants/songs.h\"\n#include \"constants/game_stat.h\"\n#include \"constants/trainers.h\"\n\n// Trainer Card Strings\nenum\n{\n    TRAINER_CARD_STRING_NAME = 0,\n    TRAINER_CARD_STRING_HOF_TIME,\n    TRAINER_CARD_STRING_LINK_RECORD,\n    TRAINER_CARD_STRING_WIN_LOSS,\n    TRAINER_CARD_STRING_LINK_WINS,\n    TRAINER_CARD_STRING_LINK_LOSSES,\n    TRAINER_CARD_STRING_TRADES,\n    TRAINER_CARD_STRING_TRADE_COUNT,\n    TRAINER_CARD_STRING_BERRY_CRUSH,\n    TRAINER_CARD_STRING_BERRY_CRUSH_COUNT,\n    TRAINER_CARD_STRING_UNION_ROOM,\n    TRAINER_CARD_STRING_UNION_ROOM_NUM,\n    TRAINER_CARD_STRING_COUNT,\n};\n\nstruct TrainerCardData\n{\n    u8 mainState;\n    u8 printState;\n    u8 gfxLoadState;\n    u8 bgPalLoadState;\n    u8 flipDrawState;\n    bool8 isLink;\n    u8 timeColonBlinkTimer;\n    bool8 timeColonInvisible;\n    bool8 onBack;\n    bool8 allowDMACopy;\n    bool8 hasPokedex;\n    bool8 hasHofResult;\n    bool8 hasLinkResults;\n    bool8 hasBattleTowerWins;\n    bool8 var_E;\n    bool8 var_F;\n    bool8 hasTrades;\n    bool8 hasBadge[NUM_BADGES];\n    u8 easyChatProfile[TRAINER_CARD_PROFILE_LENGTH][13];\n    u8 strings[TRAINER_CARD_STRING_COUNT][70];\n    u8 var_395;\n    u16 monIconPals[16 * PARTY_SIZE];\n    s8 flipBlendY;\n    u8 cardType;\n    void (*callback2)(void);\n    struct TrainerCard trainerCard;\n    u16 frontTilemap[600];\n    u16 backTilemap[600];\n    u16 bgTilemap[600];\n    u8 badgeTiles[0x80 * NUM_BADGES];\n    u16 stickerTiles[0x100];\n    u16 cardTiles[0x1180];\n    u16 cardTilemapBuffer[0x1000];\n    u16 bgTilemapBuffer[0x1000];\n    u16 cardTop;\n    bool8 timeColonNeedDraw;\n    u8 language;\n}; /* size = 0x7BD0 */\n\n// RAM\nEWRAM_DATA struct TrainerCard gTrainerCards[4] = {0};\nEWRAM_DATA static struct TrainerCardData *sTrainerCardDataPtr = NULL;\n\n// Function Declaration\nstatic void VBlankCB_TrainerCard(void);\nstatic void HBlankCB_TrainerCard(void);\nstatic void CB2_TrainerCard(void);\nstatic void CloseTrainerCard(u8 taskId);\nstatic void Task_TrainerCard(u8 taskId);\nstatic bool8 LoadCardGfx(void);\nstatic void CB2_InitTrainerCard(void);\nstatic u32 GetCappedGameStat(u8 statId, u32 maxValue);\nstatic u8 GetTrainerStarCount(struct TrainerCard *trainerCard);\nstatic void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType);\nstatic void SetDataFromTrainerCard(void);\nstatic void HandleGpuRegs(void);\nstatic void UpdateCardFlipRegs(u16 cardTop);\nstatic void ResetGpuRegs(void);\nstatic void TrainerCardNull(void);\nstatic void DmaClearOam(void);\nstatic void DmaClearPltt(void);\nstatic void ResetBgRegs(void);\nstatic void InitBgsAndWindows(void);\nstatic void SetTrainerCardCB2(void);\nstatic void SetUpTrainerCardTask(void);\nstatic bool8 PrintAllOnCardFront(void);\nstatic bool8 PrintAllOnCardBack(void);\nstatic void BufferTextForCardBack(void);\nstatic void PrintNameOnCardFront(void);\nstatic void PrintIdOnCard(void);\nstatic void PrintMoneyOnCard(void);\nstatic u16 GetCaughtMonsCount(void);\nstatic void PrintPokedexOnCard(void);\nstatic void PrintTimeOnCard(void);\nstatic void PrintProfilePhraseOnCard(void);\nstatic void BufferNameForCardBack(void);\nstatic void PrintNameOnCardBack(void);\nstatic void BufferHofDebutTime(void);\nstatic void PrintHofDebutTimeOnCard(void);\nstatic void BufferLinkBattleResults(void);\nstatic void PrintLinkBattleResultsOnCard(void);\nstatic void BufferNumTrades(void);\nstatic void PrintTradesStringOnCard(void);\nstatic void BufferBerryCrushPoints(void);\nstatic void PrintBerryCrushStringOnCard(void);\nstatic void BufferUnionRoomStats(void);\nstatic void PrintUnionStringOnCard(void);\nstatic void PrintPokemonIconsOnCard(void);\nstatic void LoadMonIconGfx(void);\nstatic void PrintStickersOnCard(void);\nstatic void LoadStickerGfx(void);\nstatic void DrawTrainerCardWindow(u8 windowId);\nstatic bool8 SetTrainerCardBgsAndPals(void);\nstatic void DrawCardScreenBackground(const u16 *ptr);\nstatic void DrawCardFrontOrBack(const u16 *ptr);\nstatic void DrawStarsAndBadgesOnCard(void);\nstatic void DrawCardBackStats(void);\nstatic void BlinkTimeColon(void);\nstatic void FlipTrainerCard(void);\nstatic bool8 IsCardFlipTaskActive(void);\nstatic void Task_DoCardFlipTask(u8 taskId);\nstatic bool8 Task_BeginCardFlip(struct Task* task);\nstatic bool8 Task_AnimateCardFlipDown(struct Task* task);\nstatic bool8 Task_DrawFlippedCardSide(struct Task* task);\nstatic bool8 Task_SetCardFlipped(struct Task* task);\nstatic bool8 Task_AnimateCardFlipUp(struct Task* task);\nstatic bool8 Task_EndCardFlip(struct Task *task);\nstatic void InitTrainerCardData(void);\nstatic u8 GetCardType(void);\nstatic void CreateTrainerCardTrainerPic(void);\n\nstatic const u32 sTrainerCardStickers_Gfx[]           = INCBIN_U32(\"graphics/trainer_card/stickers.4bpp.lz\");\nstatic const u32 sHoennTrainerCardFront_Tilemap[]     = INCBIN_U32(\"graphics/trainer_card/rse/front.bin.lz\");\nstatic const u32 sKantoTrainerCardFront_Tilemap[]     = INCBIN_U32(\"graphics/trainer_card/front.bin.lz\");\nstatic const u32 sHoennTrainerCardBack_Tilemap[]      = INCBIN_U32(\"graphics/trainer_card/rse/back.bin.lz\");\nstatic const u32 sKantoTrainerCardBack_Tilemap[]      = INCBIN_U32(\"graphics/trainer_card/back.bin.lz\");\nstatic const u32 sHoennTrainerCardFrontLink_Tilemap[] = INCBIN_U32(\"graphics/trainer_card/rse/front_link.bin.lz\");\nstatic const u32 sKantoTrainerCardFrontLink_Tilemap[] = INCBIN_U32(\"graphics/trainer_card/front_link.bin.lz\");\nstatic const u32 sHoennTrainerCardBg_Tilemap[]        = INCBIN_U32(\"graphics/trainer_card/rse/bg.bin.lz\");\nstatic const u32 sKantoTrainerCardBg_Tilemap[]        = INCBIN_U32(\"graphics/trainer_card/bg.bin.lz\");\nstatic const u16 sUnused_Pal[]                        = INCBIN_U16(\"graphics/trainer_card/unused.gbapal\");\nstatic const u16 sHoennTrainerCardBronze_Pal[]        = INCBIN_U16(\"graphics/trainer_card/rse/bronze.gbapal\");\nstatic const u16 sKantoTrainerCardGreen_Pal[]         = INCBIN_U16(\"graphics/trainer_card/green.gbapal\");\nstatic const u16 sHoennTrainerCardCopper_Pal[]        = INCBIN_U16(\"graphics/trainer_card/rse/copper.gbapal\");\nstatic const u16 sKantoTrainerCardBronze_Pal[]        = INCBIN_U16(\"graphics/trainer_card/bronze.gbapal\");\nstatic const u16 sHoennTrainerCardSilver_Pal[]        = INCBIN_U16(\"graphics/trainer_card/rse/silver.gbapal\");\nstatic const u16 sKantoTrainerCardSilver_Pal[]        = INCBIN_U16(\"graphics/trainer_card/silver.gbapal\");\nstatic const u16 sHoennTrainerCardGold_Pal[]          = INCBIN_U16(\"graphics/trainer_card/rse/gold.gbapal\");\nstatic const u16 sKantoTrainerCardGold_Pal[]          = INCBIN_U16(\"graphics/trainer_card/gold.gbapal\");\nstatic const u16 sHoennTrainerCardFemaleBg_Pal[]      = INCBIN_U16(\"graphics/trainer_card/rse/female_bg.gbapal\");\nstatic const u16 sKantoTrainerCardFemaleBg_Pal[]      = INCBIN_U16(\"graphics/trainer_card/female_bg.gbapal\");\nstatic const u16 sHoennTrainerCardBadges_Pal[]        = INCBIN_U16(\"graphics/trainer_card/rse/badges.gbapal\");\nstatic const u16 sKantoTrainerCardBadges_Pal[]        = INCBIN_U16(\"graphics/trainer_card/badges.gbapal\");\nstatic const u16 sTrainerCardStar_Pal[]               = INCBIN_U16(\"graphics/trainer_card/star.gbapal\");\nstatic const u16 sTrainerCardStickerPal1[]            = INCBIN_U16(\"graphics/trainer_card/stickers1.gbapal\");\nstatic const u16 sTrainerCardStickerPal2[]            = INCBIN_U16(\"graphics/trainer_card/stickers2.gbapal\");\nstatic const u16 sTrainerCardStickerPal3[]            = INCBIN_U16(\"graphics/trainer_card/stickers3.gbapal\");\nstatic const u16 sTrainerCardStickerPal4[]            = INCBIN_U16(\"graphics/trainer_card/stickers4.gbapal\");\nstatic const u32 sHoennTrainerCardBadges_Gfx[]        = INCBIN_U32(\"graphics/trainer_card/rse/badges.4bpp.lz\");\nstatic const u32 sKantoTrainerCardBadges_Gfx[]        = INCBIN_U32(\"graphics/trainer_card/badges.4bpp.lz\");\n\nstatic const struct BgTemplate sTrainerCardBgTemplates[4] = \n{\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 27,\n        .screenSize = 2,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0\n    },\n    {\n        .bg = 1,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 29,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0\n    },\n    {\n        .bg = 2,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 30,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0\n    },\n    {\n        .bg = 3,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 192\n    }\n};\n\nstatic const struct WindowTemplate sTrainerCardWindowTemplates[4] =    \n{\n    {\n        .bg = 1,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 15,\n        .baseBlock = 0x241\n    },\n    {\n        .bg = 1,\n        .tilemapLeft = 1,\n        .tilemapTop = 1,\n        .width = 27,\n        .height = 18,\n        .paletteNum = 15,\n        .baseBlock = 0x1\n    },\n    {\n        .bg = 3,\n        .tilemapLeft = 19,\n        .tilemapTop = 5,\n        .width = 9,\n        .height = 10,\n        .paletteNum = 8,\n        .baseBlock = 0x150\n    },\n    DUMMY_WIN_TEMPLATE\n};\n\nstatic const u16 *const sHoennTrainerCardPals[] =\n{\n    gHoennTrainerCardGreen_Pal,  // Default (0 stars)\n    sHoennTrainerCardBronze_Pal, // 1 star\n    sHoennTrainerCardCopper_Pal, // 2 stars\n    sHoennTrainerCardSilver_Pal, // 3 stars\n    sHoennTrainerCardGold_Pal,   // 4 stars\n};\n\nstatic const u16 *const sKantoTrainerCardPals[] =\n{\n    gKantoTrainerCardBlue_Pal,   // Default (0 stars)\n    sKantoTrainerCardGreen_Pal,  // 1 star\n    sKantoTrainerCardBronze_Pal, // 2 stars\n    sKantoTrainerCardSilver_Pal, // 3 stars\n    sKantoTrainerCardGold_Pal,   // 4 stars\n};\n\nstatic const u8 sTrainerCardTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY};\nstatic const u8 sTrainerCardStatColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED};\nstatic const u8 sTimeColonInvisibleTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT};\nstatic const u8 sTrainerCardFontIds[] = {FONT_SMALL, FONT_NORMAL, FONT_SMALL};\n\nstatic const u8 sTrainerPicOffsets[2][GENDER_COUNT][2] = \n{\n    // Kanto\n    {\n        [MALE]   = {13, 4}, \n        [FEMALE] = {13, 4}\n    },\n    // Hoenn\n    {\n        [MALE]   = {1, 0}, \n        [FEMALE] = {1, 0}\n    }\n};\n\nstatic const u8 sTrainerPicFacilityClasses[][2] = \n{\n    [CARD_TYPE_FRLG] = \n    {\n        [MALE]   = FACILITY_CLASS_RED, \n        [FEMALE] = FACILITY_CLASS_LEAF\n    },\n    [CARD_TYPE_RSE] = \n    {\n        [MALE]   = FACILITY_CLASS_BRENDAN, \n        [FEMALE] = FACILITY_CLASS_MAY\n    },\n    [CARD_TYPE_EMERALD] = \n    {\n        [MALE]   = FACILITY_CLASS_EM_BRENDAN, \n        [FEMALE] = FACILITY_CLASS_EM_MAY\n    }\n};\n\nstatic const u8 sLinkTrainerPicFacilityClasses[GENDER_COUNT][NUM_LINK_TRAINER_CARD_CLASSES] = \n{\n    [MALE] = \n    {\n        FACILITY_CLASS_COOLTRAINER_M, \n        FACILITY_CLASS_BLACK_BELT, \n        FACILITY_CLASS_CAMPER, \n        FACILITY_CLASS_YOUNGSTER, \n        FACILITY_CLASS_PSYCHIC_M, \n        FACILITY_CLASS_BUG_CATCHER, \n        FACILITY_CLASS_TAMER, \n        FACILITY_CLASS_JUGGLER\n    },\n    [FEMALE] = \n    {\n        FACILITY_CLASS_COOLTRAINER_F,\n        FACILITY_CLASS_CHANNELER, \n        FACILITY_CLASS_PICNICKER, \n        FACILITY_CLASS_LASS, \n        FACILITY_CLASS_RS_PSYCHIC_F, \n        FACILITY_CLASS_BATTLE_GIRL, \n        FACILITY_CLASS_RS_PKMN_BREEDER_F, \n        FACILITY_CLASS_BEAUTY\n    }\n};\n\nstatic bool8 (*const sTrainerCardFlipTasks[])(struct Task *) = \n{\n    Task_BeginCardFlip,\n    Task_AnimateCardFlipDown,\n    Task_DrawFlippedCardSide,\n    Task_SetCardFlipped,\n    Task_AnimateCardFlipUp,\n    Task_EndCardFlip\n};\n\nstatic const u8 sTrainerCardFrontNameXPositions[] = {0x14, 0x10};\nstatic const u8 sTrainerCardFrontNameYPositions[] = {0x1D, 0x21};\nstatic const u8 sTrainerCardIdXPositions[] = {0x8E, 0x80};\nstatic const u8 sTrainerCardIdYPositions[] = {0xA, 0x9};\nstatic const u8 *const sTimeColonTextColors[] = {sTrainerCardTextColors, sTimeColonInvisibleTextColors};\nstatic const u8 sTrainerCardTimeHoursXPositions[] = {0x65, 0x55};\nstatic const u8 sTrainerCardTimeHoursYPositions[] = {0x77, 0x67};\nstatic const u8 sTrainerCardTimeMinutesXPositions[] = {0x7C, 0x6C};\nstatic const u8 sTrainerCardTimeMinutesYPositions[] = {0x58, 0x59};\nstatic const u8 sTrainerCardProfilePhraseXPositions[] = {0x73, 0x69};\nstatic const u8 sTrainerCardProfilePhraseYPositions[] = {0x82, 0x78};\nstatic const u8 sTrainerCardBackNameXPositions[] = {0x8A, 0xD8};\nstatic const u8 sTrainerCardBackNameYPositions[] = {0xB, 0xA};\nstatic const u8 sTrainerCardHofDebutXPositions[] = {0xA, 0x10, 0x0, 0x0};\nstatic const u8 *const sLinkTrainerCardRecordStrings[] = {gText_LinkBattles, gText_LinkCableBattles};\nstatic const u8 sPokemonIconPalSlots[] = {5, 6, 7, 8, 9, 10};\nstatic const u8 sPokemonIconXOffsets[] = {0, 4, 8, 12, 16, 20};\nstatic const u8 sStickerPalSlots[] = {11, 12, 13, 14};\nstatic const u8 sStarYOffsets[] = {7, 6, 0, 0};\n\nstatic const struct TrainerCard sLinkPlayerTrainerCardTemplate1 = \n{\n    .rse = {\n        .gender = MALE,\n        .stars = 4,\n        .hasPokedex = TRUE,\n        .caughtAllHoenn = TRUE,\n        .hasAllPaintings = TRUE,\n        .hofDebutHours = 999,\n        .hofDebutMinutes = 59,\n        .hofDebutSeconds = 59,\n        .caughtMonsCount = 200,\n        .trainerId = 0x6072,\n        .playTimeHours = 999,\n        .playTimeMinutes = 59,\n        .linkBattleWins = 5535,\n        .linkBattleLosses = 5535,\n        .battleTowerWins = 5535,\n        .battleTowerStraightWins = 5535,\n        .contestsWithFriends = 55555,\n        .pokeblocksWithFriends = 44444,\n        .pokemonTrades = 33333,\n        .money = 999999,\n        .easyChatProfile = {0, 0, 0, 0},\n        .playerName = _(\"あかみ どりお\")\n    },\n    .version = VERSION_FIRE_RED,\n    .hasAllFrontierSymbols = FALSE,\n    .berryCrushPoints = 5555,\n    .unionRoomNum = 8500,\n    .berriesPicked = 5456,\n    .jumpsInRow = 6300,\n    .shouldDrawStickers = TRUE,\n    .hasAllMons = TRUE,\n    .monIconTint = MON_ICON_TINT_PINK,\n    .facilityClass = 0,\n    .stickers = {1, 2, 3},\n    .monSpecies = {SPECIES_CHARIZARD, SPECIES_DIGLETT, SPECIES_NIDORINA, SPECIES_FEAROW, SPECIES_PARAS, SPECIES_SLOWBRO}\n};\n\nstatic const struct TrainerCard sLinkPlayerTrainerCardTemplate2 = \n{\n    .rse = {\n        .gender = FEMALE,\n        .stars = 2,\n        .hasPokedex = TRUE,\n        .caughtAllHoenn = TRUE,\n        .hasAllPaintings = TRUE,\n        .hofDebutHours = 999,\n        .hofDebutMinutes = 59,\n        .hofDebutSeconds = 59,\n        .caughtMonsCount = 200,\n        .trainerId = 0x6072,\n        .playTimeHours = 999,\n        .playTimeMinutes = 59,\n        .linkBattleWins = 5535,\n        .linkBattleLosses = 5535,\n        .battleTowerWins = 65535,\n        .battleTowerStraightWins = 65535,\n        .contestsWithFriends = 55555,\n        .pokeblocksWithFriends = 44444,\n        .pokemonTrades = 33333,\n        .money = 999999,\n        .easyChatProfile = {0, 0, 0, 0},\n        .playerName = _(\"るびさふぁこ！\")\n    },\n    .version = 0,\n    .hasAllFrontierSymbols = FALSE,\n    .berryCrushPoints = 555,\n    .unionRoomNum = 500,\n    .berriesPicked = 456,\n    .jumpsInRow = 300,\n    .shouldDrawStickers = TRUE,\n    .hasAllMons = TRUE,\n    .monIconTint = MON_ICON_TINT_PINK,\n    .facilityClass = 0,\n    .stickers = {1, 2, 3},\n    .monSpecies = {SPECIES_CHARIZARD, SPECIES_DIGLETT, SPECIES_NIDORINA, SPECIES_FEAROW, SPECIES_PARAS, SPECIES_SLOWBRO}\n};\n\n// Functions\nstatic void VBlankCB_TrainerCard(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n    BlinkTimeColon();\n    if (sTrainerCardDataPtr->allowDMACopy)\n        DmaCopy16(3, &gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 0x140);\n}\n\nstatic void HBlankCB_TrainerCard(void)\n{\n    u16 backup;\n    u16 bgVOffset;\n\n    backup = REG_IME;\n    REG_IME = 0;\n    bgVOffset = gScanlineEffectRegBuffers[1][REG_VCOUNT & 0xFF];\n    REG_BG0VOFS = bgVOffset;\n    REG_IME = backup;\n}\n\nstatic void CB2_TrainerCard(void)\n{\n    RunTasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void CloseTrainerCard(u8 taskId)\n{\n    SetMainCallback2(sTrainerCardDataPtr->callback2);\n    FreeAllWindowBuffers();\n    FREE_AND_SET_NULL(sTrainerCardDataPtr);\n    DestroyTask(taskId);\n}\n\n// States for Task_TrainerCard. Skips the initial states, which are done once in order\n#define STATE_HANDLE_INPUT_FRONT  10\n#define STATE_HANDLE_INPUT_BACK   11\n#define STATE_WAIT_FLIP_TO_BACK   12\n#define STATE_WAIT_FLIP_TO_FRONT  13\n#define STATE_CLOSE_CARD          14\n#define STATE_WAIT_LINK_PARTNER   15\n#define STATE_CLOSE_CARD_LINK     16\n\nstatic void Task_TrainerCard(u8 taskId)\n{\n    switch (sTrainerCardDataPtr->mainState)\n    {\n    // Draw card initially\n    case 0:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            FillWindowPixelBuffer(1, PIXEL_FILL(0));\n            sTrainerCardDataPtr->mainState++;\n        }\n        break;\n    case 1:\n        if (PrintAllOnCardFront())\n            sTrainerCardDataPtr->mainState++;\n        break;\n    case 2:\n        DrawTrainerCardWindow(1);\n        sTrainerCardDataPtr->mainState++;\n        break;\n    case 3:\n        FillWindowPixelBuffer(2, PIXEL_FILL(0));\n        CreateTrainerCardTrainerPic();\n        DrawTrainerCardWindow(2);\n        sTrainerCardDataPtr->mainState++;\n        break;\n    case 4:\n        DrawCardScreenBackground(sTrainerCardDataPtr->bgTilemap);\n        sTrainerCardDataPtr->mainState++;\n        break;\n    case 5:\n        DrawCardFrontOrBack(sTrainerCardDataPtr->frontTilemap);\n        sTrainerCardDataPtr->mainState++;\n        break;\n    case 6:\n        DrawStarsAndBadgesOnCard();\n        sTrainerCardDataPtr->mainState++;\n        break;\n    // Fade in\n    case 7:\n        if (gWirelessCommType == 1 && gReceivedRemoteLinkPlayers == TRUE)\n        {\n            LoadWirelessStatusIndicatorSpriteGfx();\n            CreateWirelessStatusIndicatorSprite(230, 150);\n        }\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        SetVBlankCallback(VBlankCB_TrainerCard);\n        sTrainerCardDataPtr->mainState++;\n        break;\n    case 8:\n        if (!UpdatePaletteFade() && !IsDma3ManagerBusyWithBgCopy())\n        {\n            PlaySE(SE_CARD_OPEN);\n            sTrainerCardDataPtr->mainState = STATE_HANDLE_INPUT_FRONT;\n        }\n        break;\n    case 9:\n        if (!IsSEPlaying())\n            sTrainerCardDataPtr->mainState++;\n        break;\n    case STATE_HANDLE_INPUT_FRONT:\n        // Blink the : in play time\n        if (!gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->timeColonNeedDraw)\n        {\n            PrintTimeOnCard();\n            DrawTrainerCardWindow(1);\n            sTrainerCardDataPtr->timeColonNeedDraw = FALSE;\n        }\n\n        if (JOY_NEW(A_BUTTON))\n        {\n            SetHelpContext(HELPCONTEXT_TRAINER_CARD_BACK);\n            FlipTrainerCard();\n            PlaySE(SE_CARD_FLIP);\n            sTrainerCardDataPtr->mainState = STATE_WAIT_FLIP_TO_BACK;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            if (gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->isLink && InUnionRoom() == TRUE)\n            {\n                sTrainerCardDataPtr->mainState = STATE_WAIT_LINK_PARTNER;\n            }\n            else\n            {\n                BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n                sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD;\n            }\n        }\n        break;\n    case STATE_WAIT_FLIP_TO_BACK:\n        if (IsCardFlipTaskActive() && Overworld_LinkRecvQueueLengthMoreThan2() != TRUE)\n        {\n            PlaySE(SE_CARD_OPEN);\n            sTrainerCardDataPtr->mainState = STATE_HANDLE_INPUT_BACK;\n        }\n        break;\n    case STATE_HANDLE_INPUT_BACK:\n        if (JOY_NEW(B_BUTTON))\n        {\n            if (gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->isLink && InUnionRoom() == TRUE)\n            {\n                sTrainerCardDataPtr->mainState = STATE_WAIT_LINK_PARTNER;\n            }\n            else if (gReceivedRemoteLinkPlayers)\n            {\n                BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n                sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD;\n            }\n            else\n            {\n                SetHelpContext(HELPCONTEXT_TRAINER_CARD_FRONT);\n                FlipTrainerCard();\n                sTrainerCardDataPtr->mainState = STATE_WAIT_FLIP_TO_FRONT;\n                PlaySE(SE_CARD_FLIP);\n            }\n        }\n        else if (JOY_NEW(A_BUTTON))\n        {\n           if (gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->isLink && InUnionRoom() == TRUE)\n           {\n               sTrainerCardDataPtr->mainState = STATE_WAIT_LINK_PARTNER;\n           }\n           else\n           {\n               BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n               sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD;\n           }\n        }\n        break;\n    case STATE_WAIT_LINK_PARTNER:\n        SetCloseLinkCallback();\n        DrawDialogueFrame(0, 1);\n        AddTextPrinterParameterized(0, FONT_NORMAL, gText_WaitingTrainerFinishReading, 0, 1, TEXT_SKIP_DRAW, 0);\n        CopyWindowToVram(0, COPYWIN_FULL);\n        sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD_LINK;\n        break;\n    case STATE_CLOSE_CARD_LINK:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n            sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD;\n        }\n        break;\n    case STATE_CLOSE_CARD:\n        if (!UpdatePaletteFade())\n            CloseTrainerCard(taskId);\n        break;\n    case STATE_WAIT_FLIP_TO_FRONT:\n        if (IsCardFlipTaskActive() && Overworld_LinkRecvQueueLengthMoreThan2() != TRUE)\n        {\n            sTrainerCardDataPtr->mainState = STATE_HANDLE_INPUT_FRONT;\n            PlaySE(SE_CARD_OPEN);\n        }\n        break;\n   }\n}\n\nstatic bool8 LoadCardGfx(void)\n{\n    switch (sTrainerCardDataPtr->gfxLoadState)\n    {\n    case 0:\n        if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE)\n            LZ77UnCompWram(sHoennTrainerCardBg_Tilemap, sTrainerCardDataPtr->bgTilemap);\n        else\n            LZ77UnCompWram(sKantoTrainerCardBg_Tilemap, sTrainerCardDataPtr->bgTilemap);\n        break;\n    case 1:\n        if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE)\n            LZ77UnCompWram(sHoennTrainerCardBack_Tilemap, sTrainerCardDataPtr->backTilemap);\n        else\n            LZ77UnCompWram(sKantoTrainerCardBack_Tilemap, sTrainerCardDataPtr->backTilemap);\n        break;\n    case 2:\n        if (!sTrainerCardDataPtr->isLink)\n        {\n            if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE)\n                LZ77UnCompWram(sHoennTrainerCardFront_Tilemap, sTrainerCardDataPtr->frontTilemap);\n            else\n                LZ77UnCompWram(sKantoTrainerCardFront_Tilemap, sTrainerCardDataPtr->frontTilemap);\n        }\n        else\n        {\n            if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE)\n                LZ77UnCompWram(sHoennTrainerCardFrontLink_Tilemap, sTrainerCardDataPtr->frontTilemap);\n            else\n                LZ77UnCompWram(sKantoTrainerCardFrontLink_Tilemap, sTrainerCardDataPtr->frontTilemap);\n        }\n        break;\n    case 3:\n        if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE)\n            LZ77UnCompWram(sHoennTrainerCardBadges_Gfx, sTrainerCardDataPtr->badgeTiles);\n        else\n            LZ77UnCompWram(sKantoTrainerCardBadges_Gfx, sTrainerCardDataPtr->badgeTiles);\n        break;\n    case 4:\n        if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE)\n            LZ77UnCompWram(gHoennTrainerCard_Gfx, &sTrainerCardDataPtr->cardTiles);\n        else\n            LZ77UnCompWram(gKantoTrainerCard_Gfx, &sTrainerCardDataPtr->cardTiles);\n        break;\n    case 5:\n        if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG)\n            LZ77UnCompWram(sTrainerCardStickers_Gfx, sTrainerCardDataPtr->stickerTiles);\n        break;\n    default:\n        sTrainerCardDataPtr->gfxLoadState = 0;\n        return TRUE;\n    }\n    sTrainerCardDataPtr->gfxLoadState++;\n    return FALSE;\n}\n\nstatic void CB2_InitTrainerCard(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        ResetGpuRegs();\n        SetUpTrainerCardTask();\n        gMain.state++;\n        break;\n    case 1:\n        TrainerCardNull();\n        gMain.state++;\n        break;\n    case 2:\n        DmaClearOam();\n        gMain.state++;\n        break;\n    case 3:\n        DmaClearPltt();\n        gMain.state++;\n        // fallthrough\n    case 4:\n        ResetBgRegs();\n        gMain.state++;\n        break;\n    case 5:\n        InitBgsAndWindows();\n        gMain.state++;\n        break;\n    case 6:\n        LoadStdWindowFrameGfx();\n        gMain.state++;\n        break;\n    case 7:\n        LoadMonIconGfx();\n        gMain.state++;\n        break;\n    case 8:\n        if (LoadCardGfx() == TRUE)\n            gMain.state++;\n        break;\n    case 9:\n        LoadStickerGfx();\n        gMain.state++;\n        break;\n    case 10:\n        HandleGpuRegs();\n        gMain.state++;\n        break;\n    case 11:\n        BufferTextForCardBack();\n        gMain.state++;\n        break;\n    case 12:\n        if (SetTrainerCardBgsAndPals() == TRUE)\n            gMain.state++;\n        break;\n    case 13:\n        gMain.state++;\n        break;\n    default:\n        SetTrainerCardCB2();\n        break;\n    }\n}\n\nstatic u32 GetCappedGameStat(u8 statId, u32 maxValue)\n{\n    u32 statValue = GetGameStat(statId);\n    return min(maxValue, statValue);\n}\n\nstatic u8 GetTrainerStarCount(struct TrainerCard *trainerCard)\n{\n    u8 stars = 0;\n\n    if (trainerCard->rse.hofDebutHours != 0 || trainerCard->rse.hofDebutMinutes != 0 || trainerCard->rse.hofDebutSeconds != 0)\n        stars++;\n\n    if (trainerCard->rse.caughtAllHoenn)\n        stars++;\n\n    if (trainerCard->rse.battleTowerStraightWins > 49)\n        stars++;\n\n    if (trainerCard->rse.hasAllPaintings)\n        stars++;\n\n    return stars;\n}\n\nstatic void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType)\n{\n    u32 playTime;\n    u32 i;\n\n    trainerCard->rse.gender = gSaveBlock2Ptr->playerGender;\n    trainerCard->rse.playTimeHours = gSaveBlock2Ptr->playTimeHours;\n    trainerCard->rse.playTimeMinutes = gSaveBlock2Ptr->playTimeMinutes;\n\n    playTime = GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME);\n    if (!GetGameStat(GAME_STAT_ENTERED_HOF))\n        playTime = 0;\n\n    trainerCard->rse.hofDebutHours = playTime >> 16;\n    trainerCard->rse.hofDebutMinutes = (playTime >> 8) & 0xFF;\n    trainerCard->rse.hofDebutSeconds = playTime & 0xFF;\n    if ((playTime >> 16) > 999)\n    {\n        trainerCard->rse.hofDebutHours = 999;\n        trainerCard->rse.hofDebutMinutes = 59;\n        trainerCard->rse.hofDebutSeconds = 59;\n    }\n\n    trainerCard->rse.hasPokedex = FlagGet(FLAG_SYS_POKEDEX_GET);\n    trainerCard->rse.caughtAllHoenn = HasAllHoennMons();\n    trainerCard->rse.caughtMonsCount = GetCaughtMonsCount();\n\n    trainerCard->rse.trainerId = (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0];\n\n    trainerCard->rse.linkBattleWins = GetCappedGameStat(GAME_STAT_LINK_BATTLE_WINS, 9999);\n    trainerCard->rse.linkBattleLosses = GetCappedGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 9999);\n    trainerCard->rse.pokemonTrades = GetCappedGameStat(GAME_STAT_POKEMON_TRADES, 0xFFFF);\n\n    trainerCard->rse.battleTowerWins = gSaveBlock2Ptr->battleTower.totalBattleTowerWins;\n    trainerCard->rse.battleTowerStraightWins = gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak;\n    trainerCard->rse.contestsWithFriends = 0;\n    trainerCard->rse.pokeblocksWithFriends = 0;\n\n    trainerCard->rse.hasAllPaintings = FALSE;\n\n    trainerCard->rse.money = GetMoney(&gSaveBlock1Ptr->money);\n\n    for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++)\n        trainerCard->rse.easyChatProfile[i] = gSaveBlock1Ptr->easyChatProfile[i];\n\n    StringCopy(trainerCard->rse.playerName, gSaveBlock2Ptr->playerName);\n\n    if (cardType == CARD_TYPE_FRLG)\n    {\n        trainerCard->rse.stars = GetTrainerStarCount(trainerCard);\n    }\n    else if (cardType >= CARD_TYPE_RSE)\n    {\n        trainerCard->rse.stars = 0;\n        if (trainerCard->rse.hofDebutHours != 0 || (trainerCard->rse.hofDebutMinutes != 0 || trainerCard->rse.hofDebutSeconds != 0))\n            trainerCard->rse.stars = cardType;\n\n        if (HasAllKantoMons())\n            trainerCard->rse.stars++;\n\n        if (HasAllMons())\n            trainerCard->rse.stars++;\n    }\n}\n\nvoid TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard *trainerCard)\n{\n    u8 id = 0;\n\n    trainerCard->version = GAME_VERSION;\n    SetPlayerCardData(trainerCard, CARD_TYPE_RSE);\n    if (GetCardType() != CARD_TYPE_FRLG)\n        return;\n\n    trainerCard->rse.stars = id;\n    if (trainerCard->rse.hofDebutHours != 0 || trainerCard->rse.hofDebutMinutes != 0 || trainerCard->rse.hofDebutSeconds != 0)\n        trainerCard->rse.stars = 1;\n\n    trainerCard->rse.caughtAllHoenn = HasAllKantoMons();\n    trainerCard->hasAllMons = HasAllMons();\n    trainerCard->berriesPicked = gSaveBlock2Ptr->berryPick.berriesPicked;\n    trainerCard->jumpsInRow = gSaveBlock2Ptr->pokeJump.jumpsInRow;\n\n    trainerCard->berryCrushPoints = GetCappedGameStat(GAME_STAT_BERRY_CRUSH_POINTS, 0xFFFF);\n    trainerCard->unionRoomNum = GetCappedGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES, 0xFFFF);\n    trainerCard->shouldDrawStickers = TRUE;\n\n    if (trainerCard->rse.caughtAllHoenn)\n        trainerCard->rse.stars++;\n\n    if (trainerCard->hasAllMons)\n        trainerCard->rse.stars++;\n\n    if ((trainerCard->berriesPicked >= 200 && trainerCard->jumpsInRow >= 200) || trainerCard->rse.battleTowerStraightWins > 49)\n        trainerCard->rse.stars++;\n\n    id = ((u16)trainerCard->rse.trainerId) % NUM_LINK_TRAINER_CARD_CLASSES;\n    if (trainerCard->rse.gender == FEMALE)\n        trainerCard->facilityClass = sLinkTrainerPicFacilityClasses[FEMALE][id];\n    else\n        trainerCard->facilityClass = sLinkTrainerPicFacilityClasses[MALE][id];\n\n    trainerCard->stickers[0] = VarGet(VAR_HOF_BRAG_STATE);\n    trainerCard->stickers[1] = VarGet(VAR_EGG_BRAG_STATE);\n    trainerCard->stickers[2] = VarGet(VAR_LINK_WIN_BRAG_STATE);\n\n    trainerCard->monIconTint = VarGet(VAR_TRAINER_CARD_MON_ICON_TINT_IDX);\n\n    trainerCard->monSpecies[0] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_1));\n    trainerCard->monSpecies[1] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_2));\n    trainerCard->monSpecies[2] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_3));\n    trainerCard->monSpecies[3] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_4));\n    trainerCard->monSpecies[4] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_5));\n    trainerCard->monSpecies[5] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_6));\n}\n\nstatic void SetDataFromTrainerCard(void)\n{\n    u32 badgeFlag;\n    u32 i;\n\n    sTrainerCardDataPtr->hasPokedex = FALSE;\n    sTrainerCardDataPtr->hasHofResult = FALSE;\n    sTrainerCardDataPtr->hasLinkResults = FALSE;\n    sTrainerCardDataPtr->hasBattleTowerWins = FALSE;\n    sTrainerCardDataPtr->var_E = FALSE;\n    sTrainerCardDataPtr->var_F = FALSE;\n    sTrainerCardDataPtr->hasTrades = FALSE;\n\n    memset(sTrainerCardDataPtr->hasBadge, FALSE, sizeof(sTrainerCardDataPtr->hasBadge));\n    if (sTrainerCardDataPtr->trainerCard.rse.hasPokedex)\n        sTrainerCardDataPtr->hasPokedex++;\n\n    if (sTrainerCardDataPtr->trainerCard.rse.hofDebutHours != 0\n     || sTrainerCardDataPtr->trainerCard.rse.hofDebutMinutes != 0\n     || sTrainerCardDataPtr->trainerCard.rse.hofDebutSeconds != 0)\n        sTrainerCardDataPtr->hasHofResult++;\n\n    if (sTrainerCardDataPtr->trainerCard.rse.linkBattleWins != 0 || sTrainerCardDataPtr->trainerCard.rse.linkBattleLosses != 0)\n        sTrainerCardDataPtr->hasLinkResults++;\n\n    if (sTrainerCardDataPtr->trainerCard.rse.pokemonTrades != 0)\n        sTrainerCardDataPtr->hasTrades++;\n\n    for (i = 0, badgeFlag = FLAG_BADGE01_GET; badgeFlag <= FLAG_BADGE08_GET; badgeFlag++, i++)\n    {\n        if (FlagGet(badgeFlag))\n            sTrainerCardDataPtr->hasBadge[i]++;\n    }\n}\n\nstatic void HandleGpuRegs(void)\n{\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n    ShowBg(3);\n    SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON);\n    SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_DARKEN);\n    SetGpuReg(REG_OFFSET_BLDY, 0);\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ);\n    SetGpuReg(REG_OFFSET_WIN0V, WININ_WIN0_CLR | WIN_RANGE(0, 0x80));\n    SetGpuReg(REG_OFFSET_WIN0H, WININ_WIN0_CLR | WININ_WIN0_OBJ |  WIN_RANGE(0, 0xC0));\n    if (gReceivedRemoteLinkPlayers)\n        EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);\n    else\n        EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK);\n}\n\n// Part of animating card flip\nstatic void UpdateCardFlipRegs(u16 cardTop)\n{\n    s8 blendY = (cardTop + 40) / 10;\n\n    if (blendY <= 4)\n        blendY = 0;\n\n    sTrainerCardDataPtr->flipBlendY = blendY;\n    SetGpuReg(REG_OFFSET_BLDY, sTrainerCardDataPtr->flipBlendY);\n    SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(sTrainerCardDataPtr->cardTop, 160 - sTrainerCardDataPtr->cardTop));\n}\n\nstatic void ResetGpuRegs(void)\n{\n    SetVBlankCallback(NULL);\n    SetHBlankCallback(NULL);\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n}\n\nstatic void TrainerCardNull(void)\n{\n}\n\nstatic void DmaClearOam(void)\n{\n    DmaClear32(3, (void *)OAM, OAM_SIZE);\n}\n\nstatic void DmaClearPltt(void)\n{\n    DmaClear16(3, (void *)PLTT, PLTT_SIZE);\n}\n\nstatic void ResetBgRegs(void)\n{\n    SetGpuReg(REG_OFFSET_BG0CNT, 0);\n    SetGpuReg(REG_OFFSET_BG1CNT, 0);\n    SetGpuReg(REG_OFFSET_BG2CNT, 0);\n    SetGpuReg(REG_OFFSET_BG3CNT, 0);\n    SetGpuReg(REG_OFFSET_BG0HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG0VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG1VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG2HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG2VOFS, 0);\n    SetGpuReg(REG_OFFSET_BG3HOFS, 0);\n    SetGpuReg(REG_OFFSET_BG3VOFS, 0);\n}\n\nstatic void InitBgsAndWindows(void)\n{\n    ResetSpriteData();\n    ResetPaletteFade();\n    ResetBgsAndClearDma3BusyFlags(0);\n    InitBgsFromTemplates(0, sTrainerCardBgTemplates, NELEMS(sTrainerCardBgTemplates));\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n    InitWindows(sTrainerCardWindowTemplates);\n    DeactivateAllTextPrinters();\n}\n\nstatic void SetTrainerCardCB2(void)\n{\n    SetMainCallback2(CB2_TrainerCard);\n    SetHelpContext(HELPCONTEXT_TRAINER_CARD_FRONT);\n}\n\nstatic void SetUpTrainerCardTask(void)\n{\n    ResetTasks();\n    ScanlineEffect_Stop();\n    CreateTask(Task_TrainerCard, 0);\n    InitTrainerCardData();\n    SetDataFromTrainerCard();\n}\n\nstatic bool8 PrintAllOnCardFront(void)\n{\n    switch (sTrainerCardDataPtr->printState)\n    {\n    case 0:\n        PrintNameOnCardFront();\n        break;\n    case 1:\n        PrintIdOnCard();\n        break;\n    case 2:\n        PrintMoneyOnCard();\n        break;\n    case 3:\n        PrintPokedexOnCard();\n        break;\n    case 4:\n        PrintTimeOnCard();\n        break;\n    case 5:\n        PrintProfilePhraseOnCard();\n        break;\n    default:\n        sTrainerCardDataPtr->printState = 0;\n        return TRUE;\n    }\n    sTrainerCardDataPtr->printState++;\n    return FALSE;\n}\n\nstatic bool8 PrintAllOnCardBack(void)\n{\n    switch (sTrainerCardDataPtr->printState)\n    {\n    case 0:\n        PrintNameOnCardBack();\n        break;\n    case 1:\n        PrintHofDebutTimeOnCard();\n        break;\n    case 2:\n        PrintLinkBattleResultsOnCard();\n        break;\n    case 3:\n        PrintTradesStringOnCard();\n        break;\n    case 4:\n        PrintBerryCrushStringOnCard();\n        break;\n    case 5:\n        PrintUnionStringOnCard();\n        break;\n    case 6:\n        PrintPokemonIconsOnCard();\n        break;\n    case 7:\n        PrintStickersOnCard();\n        break;\n    default:\n        sTrainerCardDataPtr->printState = 0;\n        return TRUE;\n    }\n    sTrainerCardDataPtr->printState++;\n    return FALSE;\n}\n\nstatic void BufferTextForCardBack(void)\n{\n    BufferNameForCardBack();\n    BufferHofDebutTime();\n    BufferLinkBattleResults();\n    BufferNumTrades();\n    BufferBerryCrushPoints();\n    BufferUnionRoomStats();\n}\n\nstatic void PrintNameOnCardFront(void)\n{\n    u8 buffer[2][32];\n    u8 *txtPtr;\n\n    txtPtr = StringCopy(buffer[0], gText_TrainerCardName);\n    txtPtr = buffer[1];\n    StringCopy(txtPtr, sTrainerCardDataPtr->trainerCard.rse.playerName);\n    ConvertInternationalString(txtPtr, sTrainerCardDataPtr->language);\n    StringAppend(buffer[0], txtPtr);\n    AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardFrontNameXPositions[sTrainerCardDataPtr->cardType], sTrainerCardFrontNameYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer[0]);\n}\n\nstatic void PrintIdOnCard(void)\n{\n    u8 buffer[32];\n    u8 *txtPtr;\n\n    txtPtr = StringCopy(buffer, gText_TrainerCardIDNo);\n    ConvertIntToDecimalStringN(txtPtr, sTrainerCardDataPtr->trainerCard.rse.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5);\n    AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardIdXPositions[sTrainerCardDataPtr->cardType], sTrainerCardIdYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer);\n}\n\nstatic void PrintMoneyOnCard(void)\n{\n    u8 buffer[10];\n    u8 *txtPtr;\n    u8 x;\n\n    txtPtr = StringCopy(buffer, gText_TrainerCardYen);\n    ConvertIntToDecimalStringN(txtPtr, sTrainerCardDataPtr->trainerCard.rse.money, STR_CONV_MODE_LEFT_ALIGN, 6);\n    if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)\n    {\n        x = -122 - 6 * StringLength(buffer);\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 56, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardMoney);\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 56, sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer);\n    }\n    else\n    {\n        x = 118 - 6 * StringLength(buffer);\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 57, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardMoney);\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 57, sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer);\n    }    \n}\n\nstatic u16 GetCaughtMonsCount(void)\n{\n    if (IsNationalPokedexEnabled())\n        return GetNationalPokedexCount(FLAG_GET_CAUGHT);\n    else\n        return GetKantoPokedexCount(FLAG_GET_CAUGHT);\n}\n\nstatic void PrintPokedexOnCard(void)\n{\n    u8 buffer[10];\n    u8 x;\n\n    if (FlagGet(FLAG_SYS_POKEDEX_GET))\n    {\n        ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.caughtMonsCount, 0, 3);\n        if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)\n        {\n            x = -120 - 6 * StringLength(buffer);\n            AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 72, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardPokedex);\n            AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 72, sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer);\n            AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 138, 72, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardNull);\n        }\n        else\n        {\n            x = 120 - 6 * StringLength(buffer);\n            AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 73, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardPokedex);\n            AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 73, sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer);\n            AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 138, 73, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardNull);\n        }\n    }\n}\n\nstatic void PrintTimeOnCard(void)\n{\n    u16 hours;\n    u16 minutes;\n    u8 buffer[6];\n\n    hours = gSaveBlock2Ptr->playTimeHours;\n    minutes = gSaveBlock2Ptr->playTimeMinutes;\n    if (sTrainerCardDataPtr->isLink)\n    {\n        hours = sTrainerCardDataPtr->trainerCard.rse.playTimeHours;\n        minutes = sTrainerCardDataPtr->trainerCard.rse.playTimeMinutes;\n    }\n\n    if (hours > 999)\n        hours = 999;\n\n    if (minutes > 59)\n        minutes = 59;\n\n    FillWindowPixelRect(1, PIXEL_FILL(0), sTrainerCardTimeHoursXPositions[sTrainerCardDataPtr->cardType], sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], 50, 12);\n    if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 88, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardTime);\n    else\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 89, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_TrainerCardTime);\n\n    ConvertIntToDecimalStringN(buffer, hours, STR_CONV_MODE_RIGHT_ALIGN, 3);\n    AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeHoursXPositions[sTrainerCardDataPtr->cardType],\n        sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer);\n    AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeHoursYPositions[sTrainerCardDataPtr->cardType],\n        sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sTimeColonTextColors[sTrainerCardDataPtr->timeColonInvisible], TEXT_SKIP_DRAW, gText_Colon2);\n\n    ConvertIntToDecimalStringN(buffer, minutes, STR_CONV_MODE_LEADING_ZEROS, 2);\n    AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeMinutesXPositions[sTrainerCardDataPtr->cardType], sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, buffer);\n}\n\nstatic void PrintProfilePhraseOnCard(void)\n{\n    if (sTrainerCardDataPtr->isLink)\n    {\n        AddTextPrinterParameterized3(1, FONT_NORMAL, 10, sTrainerCardProfilePhraseXPositions[sTrainerCardDataPtr->cardType],\n            sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->easyChatProfile[0]);\n\n        AddTextPrinterParameterized3(1, FONT_NORMAL, GetStringWidth(FONT_NORMAL, sTrainerCardDataPtr->easyChatProfile[0], 0) + 16, sTrainerCardProfilePhraseXPositions[sTrainerCardDataPtr->cardType],\n            sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->easyChatProfile[1]);\n\n        AddTextPrinterParameterized3(1, FONT_NORMAL, 10, sTrainerCardProfilePhraseYPositions[sTrainerCardDataPtr->cardType],\n            sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->easyChatProfile[2]);\n\n        AddTextPrinterParameterized3(1, FONT_NORMAL, GetStringWidth(FONT_NORMAL, sTrainerCardDataPtr->easyChatProfile[2], 0) + 16, sTrainerCardProfilePhraseYPositions[sTrainerCardDataPtr->cardType],\n            sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->easyChatProfile[3]);    \n    }\n}\n\nstatic void BufferNameForCardBack(void)\n{\n    StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], sTrainerCardDataPtr->trainerCard.rse.playerName);\n    ConvertInternationalString(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], sTrainerCardDataPtr->language);\n    if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE)\n    {\n        StringAppend(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], gText_Var1sTrainerCard);\n    }\n}\n\nstatic void PrintNameOnCardBack(void)\n{\n    u8 x;\n\n    if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG)\n    {\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardBackNameXPositions[sTrainerCardDataPtr->cardType],\n            sTrainerCardBackNameYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME]);\n    }\n    else\n    {    \n        x = sTrainerCardBackNameXPositions[sTrainerCardDataPtr->cardType] - GetStringWidth(sTrainerCardFontIds[1], sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], GetFontAttribute(sTrainerCardFontIds[1], FONTATTR_LETTER_SPACING));\n\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, sTrainerCardBackNameYPositions[sTrainerCardDataPtr->cardType],\n            sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME]);\n    }\n}\n\nstatic void BufferHofDebutTime(void)\n{\n    u8 buffer[10];\n    u8 *txtPtr;\n\n    if (sTrainerCardDataPtr->hasHofResult)\n    {\n        ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.hofDebutHours, STR_CONV_MODE_RIGHT_ALIGN, 3);\n        txtPtr = StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], buffer);\n        StringAppendN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], gText_Colon2, 2);\n        ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.hofDebutMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);\n        StringAppendN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], buffer, 3);\n        StringAppendN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], gText_Colon2, 2);\n        ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.hofDebutSeconds, STR_CONV_MODE_LEADING_ZEROS, 2);\n        StringAppendN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], buffer, 3);\n    }\n}\n\nstatic void PrintHofDebutTimeOnCard(void)\n{\n    if (sTrainerCardDataPtr->hasHofResult)\n    {\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 35, sTrainerCardTextColors, TEXT_SKIP_DRAW, gText_HallOfFameDebut);\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 164, 35, sTrainerCardStatColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME]);\n    }\n}\n\nstatic void BufferLinkBattleResults(void)\n{\n    u8 buffer[30];\n\n    if (sTrainerCardDataPtr->hasLinkResults)\n    {\n        StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_RECORD], sLinkTrainerCardRecordStrings[sTrainerCardDataPtr->cardType]);\n        StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_WIN_LOSS], gText_WinLossRatio);\n        ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.linkBattleWins, STR_CONV_MODE_RIGHT_ALIGN, 4);\n        StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_WINS], buffer);\n        ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.linkBattleLosses, STR_CONV_MODE_RIGHT_ALIGN, 4);\n        StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_LOSSES], buffer);\n    }\n}\n\nstatic void PrintLinkBattleResultsOnCard(void)\n{    \n    if (sTrainerCardDataPtr->hasLinkResults)\n    {\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 51, \n            sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_RECORD]);\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 130, 51, sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_WIN_LOSS]);\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 144, 51, sTrainerCardStatColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_WINS]);\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 192, 51, sTrainerCardStatColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_LOSSES]);\n    }\n}\n\nstatic void BufferNumTrades(void)\n{\n    if (sTrainerCardDataPtr->hasTrades)\n    {\n        StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADES], gText_PokemonTrades);\n        ConvertIntToDecimalStringN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADE_COUNT], sTrainerCardDataPtr->trainerCard.rse.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5);\n    }\n}\n\nstatic void PrintTradesStringOnCard(void)\n{\n    if (sTrainerCardDataPtr->hasTrades)\n    {\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 67, sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADES]);\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 67, sTrainerCardStatColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADE_COUNT]);\n    }\n}\n\nstatic void BufferBerryCrushPoints(void)\n{\n    if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)\n    {\n        StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH], gText_BerryCrushes);\n        ConvertIntToDecimalStringN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH_COUNT], sTrainerCardDataPtr->trainerCard.berryCrushPoints, STR_CONV_MODE_RIGHT_ALIGN, 5);\n    }\n}\n\nstatic void PrintBerryCrushStringOnCard(void)\n{\n    if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE && sTrainerCardDataPtr->trainerCard.berryCrushPoints)\n    {\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 99, sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH]);\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 99, sTrainerCardStatColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH_COUNT]);\n    }\n}\n\nstatic void BufferUnionRoomStats(void)\n{\n    if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)\n    {\n        StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM], gText_UnionRoomTradesBattles);\n        ConvertIntToDecimalStringN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM_NUM], sTrainerCardDataPtr->trainerCard.unionRoomNum, STR_CONV_MODE_RIGHT_ALIGN, 5);\n    }\n}\n\nstatic void PrintUnionStringOnCard(void)\n{\n    if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE && sTrainerCardDataPtr->trainerCard.unionRoomNum)\n    {\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 83, sTrainerCardTextColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM]);\n        AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 83, sTrainerCardStatColors, TEXT_SKIP_DRAW, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM_NUM]);\n    }\n}\n\nstatic void PrintPokemonIconsOnCard(void)\n{\n    u32 i;\n    u8 paletteSlots[PARTY_SIZE];\n    u8 xOffsets[PARTY_SIZE];\n\n    memcpy(paletteSlots, sPokemonIconPalSlots, sizeof(sPokemonIconPalSlots));\n    memcpy(xOffsets, sPokemonIconXOffsets, sizeof(sPokemonIconXOffsets));\n    if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)\n    {\n        for (i = 0; i < PARTY_SIZE; i++)\n        {\n            if (sTrainerCardDataPtr->trainerCard.monSpecies[i])\n            {\n                u8 monSpecies = GetMonIconPaletteIndexFromSpecies(sTrainerCardDataPtr->trainerCard.monSpecies[i]);\n                WriteSequenceToBgTilemapBuffer(3, 16 * i + 224, xOffsets[i] + 3, 15, 4, 4, paletteSlots[monSpecies], 1);\n            }\n        }\n    }\n}\n\nstatic void LoadMonIconGfx(void)\n{\n    u32 i;\n\n    CpuCopy16(gMonIconPalettes, sTrainerCardDataPtr->monIconPals, 2 * NELEMS(sTrainerCardDataPtr->monIconPals));\n    switch (sTrainerCardDataPtr->trainerCard.monIconTint)\n    {\n    case MON_ICON_TINT_NORMAL:\n        break;\n    case MON_ICON_TINT_BLACK:\n        TintPalette_CustomTone(sTrainerCardDataPtr->monIconPals, 96, 0, 0, 0);\n        break;\n    case MON_ICON_TINT_PINK:\n        TintPalette_CustomTone(sTrainerCardDataPtr->monIconPals, 96, 500, 330, 310);\n        break;\n    case MON_ICON_TINT_SEPIA:\n        TintPalette_SepiaTone(sTrainerCardDataPtr->monIconPals, 96);\n        break;\n    }\n\n    LoadPalette(sTrainerCardDataPtr->monIconPals, BG_PLTT_ID(5), sizeof(sTrainerCardDataPtr->monIconPals));\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        LoadBgTiles(3, GetMonIconTiles(sTrainerCardDataPtr->trainerCard.monSpecies[i], 0), 512, 16 * i + 32);\n    }\n}\n\nstatic void PrintStickersOnCard(void)\n{\n    u32 i;\n    u8 palSlots[4];\n\n    memcpy(palSlots, sStickerPalSlots, sizeof(sStickerPalSlots));\n    if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.shouldDrawStickers == TRUE)\n    {\n        for (i = 0; i < TRAINER_CARD_STICKER_TYPES; i++)\n        {\n            u8 sticker = sTrainerCardDataPtr->trainerCard.stickers[i];\n            if (sTrainerCardDataPtr->trainerCard.stickers[i])\n                WriteSequenceToBgTilemapBuffer(3, i * 4 + 320, i * 3 + 2, 2, 2, 2, palSlots[sticker - 1], 1);\n        }\n    }\n}\n\nstatic void LoadStickerGfx(void)\n{\n    LoadPalette(sTrainerCardStickerPal1, BG_PLTT_ID(11), sizeof(sTrainerCardStickerPal1));\n    LoadPalette(sTrainerCardStickerPal2, BG_PLTT_ID(12), sizeof(sTrainerCardStickerPal2));\n    LoadPalette(sTrainerCardStickerPal3, BG_PLTT_ID(13), sizeof(sTrainerCardStickerPal3));\n    LoadPalette(sTrainerCardStickerPal4, BG_PLTT_ID(14), sizeof(sTrainerCardStickerPal4));\n    LoadBgTiles(3, sTrainerCardDataPtr->stickerTiles, 1024, 128);\n}\n\nstatic void DrawTrainerCardWindow(u8 windowId)\n{\n    PutWindowTilemap(windowId);\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n}\n\nstatic bool8 SetTrainerCardBgsAndPals(void)\n{\n    switch (sTrainerCardDataPtr->bgPalLoadState)\n    {\n    case 0:\n        LoadBgTiles(3, sTrainerCardDataPtr->badgeTiles, NELEMS(sTrainerCardDataPtr->badgeTiles), 0);\n        break;\n    case 1:\n        LoadBgTiles(0, sTrainerCardDataPtr->cardTiles, 0x1800, 0);\n        break;\n    case 2:\n        if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE)\n            LoadPalette(sHoennTrainerCardPals[sTrainerCardDataPtr->trainerCard.rse.stars], BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP);\n        else\n            LoadPalette(sKantoTrainerCardPals[sTrainerCardDataPtr->trainerCard.rse.stars], BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP);\n        break;\n    case 3:\n        if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE)\n            LoadPalette(sHoennTrainerCardBadges_Pal, BG_PLTT_ID(3), sizeof(sHoennTrainerCardBadges_Pal));\n        else\n            LoadPalette(sKantoTrainerCardBadges_Pal, BG_PLTT_ID(3), sizeof(sKantoTrainerCardBadges_Pal));\n        break;\n    case 4:\n        if (sTrainerCardDataPtr->cardType >= CARD_TYPE_RSE && sTrainerCardDataPtr->trainerCard.rse.gender != MALE)\n            LoadPalette(sHoennTrainerCardFemaleBg_Pal, BG_PLTT_ID(1), sizeof(sHoennTrainerCardFemaleBg_Pal));\n        else if (sTrainerCardDataPtr->trainerCard.rse.gender != MALE)\n            LoadPalette(sKantoTrainerCardFemaleBg_Pal, BG_PLTT_ID(1), sizeof(sKantoTrainerCardFemaleBg_Pal));\n        break;\n    case 5:\n        LoadPalette(sTrainerCardStar_Pal, BG_PLTT_ID(4), sizeof(sTrainerCardStar_Pal));\n        break;\n    case 6:\n        SetBgTilemapBuffer(0, sTrainerCardDataPtr->cardTilemapBuffer);\n        SetBgTilemapBuffer(2, sTrainerCardDataPtr->bgTilemapBuffer);\n        break;\n    default:\n        FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);\n        FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 32);\n        FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32);\n        return TRUE;\n    }\n\n    sTrainerCardDataPtr->bgPalLoadState++;\n    return FALSE;\n}\n\nstatic void DrawCardScreenBackground(const u16 *ptr)\n{\n    s16 i, j;\n    u16 *dst = sTrainerCardDataPtr->bgTilemapBuffer;\n\n    for (i = 0; i < 20; i++)\n    {\n        for (j = 0; j < 32; j++)\n        {\n            if (j < 30)\n                dst[32 * i + j] = ptr[30 * i + j];\n            else\n                dst[32 * i + j] = ptr[0];\n        }\n    }\n\n    CopyBgTilemapBufferToVram(2);\n}\n\nstatic void DrawCardFrontOrBack(const u16 *ptr)\n{\n    s16 i, j;\n    u16 *dst = sTrainerCardDataPtr->cardTilemapBuffer;\n\n    for (i = 0; i < 20; i++)\n    {\n        for (j = 0; j < 32; j++)\n        {\n            if (j < 30)\n                dst[32 * i + j] = ptr[30 * i + j];\n            else\n                dst[32 * i + j] = ptr[0];\n        }\n    }\n\n    CopyBgTilemapBufferToVram(0);\n}\n\nstatic void DrawStarsAndBadgesOnCard(void)\n{\n    s16 i, x;\n    u16 tileNum = 192;\n    u8 palNum = 3;\n\n    FillBgTilemapBufferRect(3, 143, 15, sStarYOffsets[sTrainerCardDataPtr->cardType], sTrainerCardDataPtr->trainerCard.rse.stars, 1, 4);\n    if (!sTrainerCardDataPtr->isLink)\n    {\n        x = 4;\n        for (i = 0; i < NUM_BADGES; i++, tileNum += 2, x += 3)\n        {\n            if (sTrainerCardDataPtr->hasBadge[i])\n            {\n                FillBgTilemapBufferRect(3, tileNum, x, 16, 1, 1, palNum);\n                FillBgTilemapBufferRect(3, tileNum + 1, x + 1, 16, 1, 1, palNum);\n                FillBgTilemapBufferRect(3, tileNum + 16, x, 17, 1, 1, palNum);\n                FillBgTilemapBufferRect(3, tileNum + 17, x + 1, 17, 1, 1, palNum);\n            }\n        }\n    }\n\n    CopyBgTilemapBufferToVram(3);\n}\n\nstatic void DrawCardBackStats(void)\n{\n    if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)\n    {\n        if (sTrainerCardDataPtr->hasTrades)\n        {\n            FillBgTilemapBufferRect(3, 141, 26, 9, 1, 1, 1);\n            FillBgTilemapBufferRect(3, 157, 26, 10, 1, 1, 1);\n        }\n\n        if (sTrainerCardDataPtr->trainerCard.berryCrushPoints)\n        {\n            FillBgTilemapBufferRect(3, 141, 21, 13, 1, 1, 1);\n            FillBgTilemapBufferRect(3, 157, 21, 14, 1, 1, 1);\n        }\n\n        if (sTrainerCardDataPtr->trainerCard.unionRoomNum)\n        {\n            FillBgTilemapBufferRect(3, 141, 27, 11, 1, 1, 1);\n            FillBgTilemapBufferRect(3, 157, 27, 12, 1, 1, 1);\n        }\n    }\n    else\n    {\n        if (sTrainerCardDataPtr->hasTrades)\n        {\n            FillBgTilemapBufferRect(3, 141, 26, 9, 1, 1, 0);\n            FillBgTilemapBufferRect(3, 157, 26, 10, 1, 1, 0);\n        }\n    }\n\n    CopyBgTilemapBufferToVram(3);\n}\n\nstatic void BlinkTimeColon(void)\n{\n    if (++sTrainerCardDataPtr->timeColonBlinkTimer > 60)\n    {\n        sTrainerCardDataPtr->timeColonBlinkTimer = 0;\n        sTrainerCardDataPtr->timeColonInvisible ^= 1;\n        sTrainerCardDataPtr->timeColonNeedDraw = TRUE;\n    }\n}\n\nu8 GetTrainerCardStars(u8 cardId)\n{\n    return gTrainerCards[cardId].rse.stars;\n}\n\n#define tFlipState data[0]\n\nstatic void FlipTrainerCard(void)\n{\n    u8 taskId = CreateTask(Task_DoCardFlipTask, 0);\n    Task_DoCardFlipTask(taskId);\n    SetHBlankCallback(HBlankCB_TrainerCard);\n}\n\nstatic bool8 IsCardFlipTaskActive(void)\n{\n    if (FindTaskIdByFunc(Task_DoCardFlipTask) == 0xFF)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void Task_DoCardFlipTask(u8 taskId)\n{\n    while(sTrainerCardFlipTasks[gTasks[taskId].tFlipState](&gTasks[taskId]))\n        ;\n}\n\nstatic bool8 Task_BeginCardFlip(struct Task* task)\n{\n    u32 i;\n\n    HideBg(1);\n    HideBg(3);\n    ScanlineEffect_Stop();\n    ScanlineEffect_Clear();\n    for (i = 0; i < 160; i++)\n        gScanlineEffectRegBuffers[1][i] = 0;\n    task->tFlipState++;\n    return FALSE;\n}\n\nstatic bool8 Task_AnimateCardFlipDown(struct Task* task)\n{\n    u32 r4, r5, r10, r7, r6, var_24, r9, var;\n    s32 i;\n\n    sTrainerCardDataPtr->allowDMACopy = FALSE;\n    if (task->data[1] >= 77)\n        task->data[1] = 77;\n    else\n        task->data[1] += 7;\n\n    sTrainerCardDataPtr->cardTop = task->data[1];\n    UpdateCardFlipRegs(task->data[1]);\n\n    r7 = task->data[1];\n    r9 = 160 - r7;\n    r4 = r9 - r7;\n    r6 = -r7 << 16;\n    r5 = 0xA00000 / r4;\n    r5 += 0xFFFF0000;\n    var_24 = r6;\n    var_24 += r5 * r4;\n    r10 = r5 / r4;\n    r5 *= 2;\n\n    for (i = 0; i < r7; i++)\n    {\n        gScanlineEffectRegBuffers[0][i] = -i;\n    }\n\n    for (; i < (s16)r9; i++)\n    {\n        var = r6 >> 16;\n        r6 += r5;\n        r5 -= r10;\n        gScanlineEffectRegBuffers[0][i] = var;\n    }\n\n    var = var_24 >> 16;\n    for (; i < 160; i++)\n    {\n        gScanlineEffectRegBuffers[0][i] = var;\n    }\n\n    sTrainerCardDataPtr->allowDMACopy = TRUE;\n    if (task->data[1] >= 77)\n        task->tFlipState++;\n\n    return FALSE;\n}\n\nstatic bool8 Task_DrawFlippedCardSide(struct Task* task)\n{\n    sTrainerCardDataPtr->allowDMACopy = FALSE;\n    if (Overworld_LinkRecvQueueLengthMoreThan2() == TRUE)\n        return FALSE;\n\n    do\n    {\n        switch (sTrainerCardDataPtr->flipDrawState)\n        {\n        case 0:\n            FillWindowPixelBuffer(1, PIXEL_FILL(0));\n            FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32);\n            break;\n        case 1:\n            if (!sTrainerCardDataPtr->onBack)\n            {\n                if (!PrintAllOnCardBack())\n                    return FALSE;\n            }\n            else\n            {\n                if (!PrintAllOnCardFront())\n                    return FALSE;\n            }\n            break;\n        case 2:\n            if (!sTrainerCardDataPtr->onBack)\n                DrawCardFrontOrBack(sTrainerCardDataPtr->backTilemap);\n            else\n                DrawTrainerCardWindow(1);\n            break;\n        case 3:\n            if (!sTrainerCardDataPtr->onBack)\n                DrawCardBackStats();\n            else\n                FillWindowPixelBuffer(2, PIXEL_FILL(0));\n            break;\n        case 4:\n            if (sTrainerCardDataPtr->onBack)\n                CreateTrainerCardTrainerPic();\n            break;\n        default:\n            task->tFlipState++;\n            sTrainerCardDataPtr->allowDMACopy = TRUE;\n            sTrainerCardDataPtr->flipDrawState = 0;\n            return FALSE;\n        }\n        sTrainerCardDataPtr->flipDrawState++;\n    } while (!gReceivedRemoteLinkPlayers);\n\n    return FALSE;\n}\n\nstatic bool8 Task_SetCardFlipped(struct Task* task)\n{\n    sTrainerCardDataPtr->allowDMACopy = FALSE;\n\n    // If on back of card, draw front of card because its being flipped\n    if (sTrainerCardDataPtr->onBack)\n    {\n        DrawTrainerCardWindow(2);\n        DrawCardScreenBackground(sTrainerCardDataPtr->bgTilemap);\n        DrawCardFrontOrBack(sTrainerCardDataPtr->frontTilemap);\n        DrawStarsAndBadgesOnCard();\n    }\n\n    DrawTrainerCardWindow(1);\n    sTrainerCardDataPtr->onBack ^= 1;\n    task->tFlipState++;\n    sTrainerCardDataPtr->allowDMACopy = TRUE;\n    PlaySE(SE_CARD_FLIPPING);\n    return FALSE;\n}\n\nstatic bool8 Task_AnimateCardFlipUp(struct Task* task)\n{\n    u32 r4, r5, r10, r7, r6, var_24, r9, var;\n    s32 i;\n\n    sTrainerCardDataPtr->allowDMACopy = FALSE;\n    if (task->data[1] <= 5)\n        task->data[1] = 0;\n    else\n        task->data[1] -= 5;\n\n    sTrainerCardDataPtr->cardTop = task->data[1];\n    UpdateCardFlipRegs(task->data[1]);\n\n    r7 = task->data[1];\n    r9 = 160 - r7;\n    r4 = r9 - r7;\n    r6 = -r7 << 16;\n    r5 = 0xA00000 / r4;\n    r5 += 0xFFFF0000;\n    var_24 = r6;\n    var_24 += r5 * r4;\n    r10 = r5 / r4;\n    r5 /= 2;\n\n    for (i = 0; i < r7; i++)\n    {\n        gScanlineEffectRegBuffers[0][i] = -i;\n    }\n\n    for (; i < (s16)(r9); i++)\n    {\n        var = r6 >> 16;\n        r6 += r5;\n        r5 += r10;\n        gScanlineEffectRegBuffers[0][i] = var;\n    }\n\n    var = var_24 >> 16;\n    for (; i < 160; i++)\n    {\n        gScanlineEffectRegBuffers[0][i] = var;\n    }\n\n    sTrainerCardDataPtr->allowDMACopy = TRUE;\n    if (task->data[1] <= 0)\n        task->tFlipState++;\n\n    return FALSE;\n}\n\nstatic bool8 Task_EndCardFlip(struct Task *task)\n{\n    ShowBg(1);\n    ShowBg(3);\n    SetHBlankCallback(NULL);\n    DestroyTask(FindTaskIdByFunc(Task_DoCardFlipTask));\n    return FALSE;\n}\n\nvoid ShowPlayerTrainerCard(void (*callback)(void))\n{\n    sTrainerCardDataPtr = AllocZeroed(sizeof(*sTrainerCardDataPtr));\n    sTrainerCardDataPtr->callback2 = callback;\n    if (InUnionRoom() == TRUE)\n        sTrainerCardDataPtr->isLink = TRUE;\n    else\n        sTrainerCardDataPtr->isLink = FALSE;\n\n    sTrainerCardDataPtr->language = GAME_LANGUAGE;\n    TrainerCard_GenerateCardForLinkPlayer(&sTrainerCardDataPtr->trainerCard);\n    SetMainCallback2(CB2_InitTrainerCard);\n}\n\nvoid ShowTrainerCardInLink(u8 cardId, void (*callback)(void))\n{\n    sTrainerCardDataPtr = AllocZeroed(sizeof(*sTrainerCardDataPtr));\n    sTrainerCardDataPtr->callback2 = callback;\n    sTrainerCardDataPtr->isLink = TRUE;\n    sTrainerCardDataPtr->trainerCard = gTrainerCards[cardId];\n    sTrainerCardDataPtr->language = gLinkPlayers[cardId].language;\n    SetMainCallback2(CB2_InitTrainerCard);\n}\n\nstatic void InitTrainerCardData(void)\n{\n    u32 i;\n\n    sTrainerCardDataPtr->mainState = 0;\n    sTrainerCardDataPtr->timeColonBlinkTimer = gSaveBlock2Ptr->playTimeVBlanks;\n    sTrainerCardDataPtr->timeColonInvisible = FALSE;\n    sTrainerCardDataPtr->onBack = FALSE;\n    sTrainerCardDataPtr->flipBlendY = 0;\n    if (GetCardType() >= CARD_TYPE_RSE)\n        sTrainerCardDataPtr->cardType = CARD_TYPE_RSE;\n    else\n        sTrainerCardDataPtr->cardType = CARD_TYPE_FRLG;\n\n    for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++)\n        CopyEasyChatWord(sTrainerCardDataPtr->easyChatProfile[i], sTrainerCardDataPtr->trainerCard.rse.easyChatProfile[i]);\n}\n\nstatic u8 GetCardType(void)\n{\n    if (sTrainerCardDataPtr == NULL)\n    {\n        if (gGameVersion == VERSION_FIRE_RED || gGameVersion == VERSION_LEAF_GREEN)\n            return CARD_TYPE_FRLG;\n        else if (gGameVersion == VERSION_EMERALD)\n            return CARD_TYPE_EMERALD;\n        else\n            return CARD_TYPE_RSE;\n    }\n    else\n    {\n        if (sTrainerCardDataPtr->trainerCard.version == VERSION_FIRE_RED || sTrainerCardDataPtr->trainerCard.version == VERSION_LEAF_GREEN)\n            return CARD_TYPE_FRLG;\n        else if (sTrainerCardDataPtr->trainerCard.version == VERSION_EMERALD)\n            return CARD_TYPE_EMERALD;\n        else\n            return CARD_TYPE_RSE;\n    }\n}\n\nstatic void CreateTrainerCardTrainerPic(void)\n{\n    u8 facilityClass;\n    if (sTrainerCardDataPtr->trainerCard.version == VERSION_EMERALD)\n        facilityClass = sTrainerPicFacilityClasses[2][sTrainerCardDataPtr->trainerCard.rse.gender];\n    else\n        facilityClass = sTrainerPicFacilityClasses[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender];\n\n    if (InUnionRoom() == TRUE && gReceivedRemoteLinkPlayers == 1)\n    {\n        facilityClass = sTrainerCardDataPtr->trainerCard.facilityClass;\n        CreateTrainerCardTrainerPicSprite(FacilityClassToPicIndex(facilityClass), TRUE, sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][0],\n                    sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][1], 8, 2);\n    }\n    else\n    {\n        if (sTrainerCardDataPtr->cardType != CARD_TYPE_FRLG)\n        {\n            CreateTrainerCardTrainerPicSprite(FacilityClassToPicIndex(facilityClass), TRUE, sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][0],\n                    sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][1], 8, 2);\n        }\n        else\n        {\n            CreateTrainerCardTrainerPicSprite(PlayerGenderToFrontTrainerPicId(sTrainerCardDataPtr->trainerCard.rse.gender, TRUE), TRUE,\n                    sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][0],\n                    sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][1],\n                    8, 2);\n        }\n    }\n}\n\n// Unused\nstatic void Unref_InitTrainerCard(void (*callback)(void))\n{\n    ShowPlayerTrainerCard(callback);\n    SetMainCallback2(CB2_InitTrainerCard);\n}\n\n// Unused\nstatic void Unref_InitTrainerCardLink(void (*callback)(void))\n{\n    memcpy(gTrainerCards, &sLinkPlayerTrainerCardTemplate1, sizeof(sLinkPlayerTrainerCardTemplate1));\n    ShowTrainerCardInLink(CARD_TYPE_FRLG, callback);\n    SetMainCallback2(CB2_InitTrainerCard);\n}\n\n// Unused\nstatic void Unref_InitTrainerCardLink2(void (*callback)(void))\n{\n    memcpy(gTrainerCards, &sLinkPlayerTrainerCardTemplate2, sizeof(sLinkPlayerTrainerCardTemplate2));\n    ShowTrainerCardInLink(CARD_TYPE_FRLG, callback);\n    SetMainCallback2(CB2_InitTrainerCard);\n}\n"
  },
  {
    "path": "src/trainer_fan_club.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"event_data.h\"\n#include \"event_scripts.h\"\n#include \"random.h\"\n#include \"constants/trainer_fan_club.h\"\n\nstruct TrainerFanClub\n{\n    u8 timer:7;\n    u8 gotInitialFans:1;\n    u8 fanFlags;\n};\n\n#define TRAINER_FAN_CLUB ((struct TrainerFanClub *)GetVarPointer(VAR_FANCLUB_FAN_COUNTER))\n\n#define GET_TRAINER_FAN_CLUB_FLAG(flag) (fanClub->fanFlags >> (flag) & 1)\n#define SET_TRAINER_FAN_CLUB_FLAG(flag) (fanClub->fanFlags |= 1 << (flag))\n#define FLIP_TRAINER_FAN_CLUB_FLAG(flag)(fanClub->fanFlags ^= 1 << (flag))\n\nstatic void TryLoseFansFromPlayTimeAfterLinkBattle(struct TrainerFanClub *);\nstatic void UpdateTrainerFanClubGameClear(struct TrainerFanClub *);\nstatic u8 PlayerGainRandomTrainerFan(struct TrainerFanClub *);\nstatic u16 GetNumFansOfPlayerInTrainerFanClub(struct TrainerFanClub *);\nstatic void TryLoseFansFromPlayTime(struct TrainerFanClub *);\nstatic bool16 IsFanClubMemberFanOfPlayer(struct TrainerFanClub *);\nstatic void SetInitialFansOfPlayer(struct TrainerFanClub *);\nstatic void BufferFanClubTrainerName(struct LinkBattleRecords *, u8, u8);\nstatic void UpdateTrainerFansAfterLinkBattle(struct TrainerFanClub *);\nstatic bool8 DidPlayerGetFirstFans(struct TrainerFanClub * );\nstatic void SetPlayerGotFirstFans(struct TrainerFanClub *);\n\nvoid ResetTrainerFanClub(void)\n{\n    VarSet(VAR_FANCLUB_FAN_COUNTER, 0);\n    VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, 0);\n}\n\nvoid Script_TryLoseFansFromPlayTimeAfterLinkBattle(void)\n{\n    TryLoseFansFromPlayTimeAfterLinkBattle(TRAINER_FAN_CLUB);\n}\n\nstatic void TryLoseFansFromPlayTimeAfterLinkBattle(struct TrainerFanClub *fanClub)\n{\n    if (DidPlayerGetFirstFans(fanClub))\n    {\n        TryLoseFansFromPlayTime(fanClub);\n        VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, gSaveBlock2Ptr->playTimeHours);\n    }\n}\n\nvoid Script_UpdateTrainerFanClubGameClear(void)\n{\n    UpdateTrainerFanClubGameClear(TRAINER_FAN_CLUB);\n}\n\nstatic void UpdateTrainerFanClubGameClear(struct TrainerFanClub *fanClub)\n{\n    if (!fanClub->gotInitialFans)\n    {\n        SetPlayerGotFirstFans(fanClub);\n        SetInitialFansOfPlayer(fanClub);\n        VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, gSaveBlock2Ptr->playTimeHours);\n        FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_BLACKBELT);\n        FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_ROCKER);\n        FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_WOMAN);\n        FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_BEAUTY);\n        VarSet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 1);\n    }\n}\n\nALIGNED(4) const u8 sCounterIncrements[] = {2, 1, 2, 1};\n\nstatic u8 TryGainNewFanFromCounter(struct TrainerFanClub *fanClub, u8 a1)\n{\n    if (VarGet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) == 2)\n    {\n        if (fanClub->timer + sCounterIncrements[a1] >= 20)\n        {\n            if (GetNumFansOfPlayerInTrainerFanClub(fanClub) < 3)\n            {\n                PlayerGainRandomTrainerFan(fanClub);\n                fanClub->timer = 0;\n            }\n            else\n                fanClub->timer = 20;\n        }\n        else\n            fanClub->timer += sCounterIncrements[a1];\n    }\n\n    return fanClub->timer;\n}\n\n\nstatic u8 PlayerGainRandomTrainerFan(struct TrainerFanClub *fanClub)\n{\n    static const u8 sFanClubMemberIds[] = {\n            FANCLUB_MEMBER2,\n            FANCLUB_MEMBER4,\n            FANCLUB_MEMBER6,\n            FANCLUB_MEMBER1,\n            FANCLUB_MEMBER8,\n            FANCLUB_MEMBER7,\n            FANCLUB_MEMBER5,\n            FANCLUB_MEMBER3\n        };\n\n    u32 i;\n    u8 idx = 0;\n\n    for (i = 0; i < NUM_TRAINER_FAN_CLUB_MEMBERS; i++)\n    {\n        if (!(GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i])))\n        {\n            idx = i;\n            if (Random() % 2)\n            {\n                SET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i]);\n                return sFanClubMemberIds[i];\n            }\n        }\n    }\n\n    SET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx]);\n    return sFanClubMemberIds[idx];\n}\n\nstatic u8 PlayerLoseRandomTrainerFan(struct TrainerFanClub *fanClub)\n{\n    static const u8 sFanClubMemberIds[] =\n        {\n            FANCLUB_MEMBER6,\n            FANCLUB_MEMBER7,\n            FANCLUB_MEMBER4,\n            FANCLUB_MEMBER8,\n            FANCLUB_MEMBER5,\n            FANCLUB_MEMBER2,\n            FANCLUB_MEMBER1,\n            FANCLUB_MEMBER3\n        };\n\n    u32 i;\n    u8 idx = 0;\n\n    if (GetNumFansOfPlayerInTrainerFanClub(fanClub) == 1)\n        return 0;\n\n    for (i = 0; i < NUM_TRAINER_FAN_CLUB_MEMBERS; i++)\n    {\n        if (GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i]))\n        {\n            idx = i;\n            if (Random() % 2)\n            {\n                FLIP_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i]);\n                return sFanClubMemberIds[i];\n            }\n        }\n    }\n\n    if (GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx]))\n        FLIP_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx]);\n\n    return sFanClubMemberIds[idx];\n}\n\nu16 Script_GetNumFansOfPlayerInTrainerFanClub(void)\n{\n    return GetNumFansOfPlayerInTrainerFanClub(TRAINER_FAN_CLUB);\n}\n\nstatic u16 GetNumFansOfPlayerInTrainerFanClub(struct TrainerFanClub *fanClub)\n{\n    u8 count = 0;\n    u32 i;\n\n    for (i = 0; i < NUM_TRAINER_FAN_CLUB_MEMBERS; i++)\n    {\n        if (GET_TRAINER_FAN_CLUB_FLAG(i))\n            count++;\n    }\n\n    return count;\n}\n\nvoid Script_TryLoseFansFromPlayTime(void)\n{\n    TryLoseFansFromPlayTime(TRAINER_FAN_CLUB);\n}\n\nstatic void TryLoseFansFromPlayTime(struct TrainerFanClub *fanClub)\n{\n    u8 i = 0;\n    u16 timer;\n\n    if (gSaveBlock2Ptr->playTimeHours < 999)\n    {\n        while (1)\n        {\n            if (GetNumFansOfPlayerInTrainerFanClub(fanClub) < 5)\n            {\n                VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, gSaveBlock2Ptr->playTimeHours);\n                break;\n            }\n            if (i == NUM_TRAINER_FAN_CLUB_MEMBERS)\n                break;\n\n            timer = VarGet(VAR_FANCLUB_LOSE_FAN_TIMER);\n            if (gSaveBlock2Ptr->playTimeHours - timer < 12)\n                break;\n\n            PlayerLoseRandomTrainerFan(fanClub);\n            timer = VarGet(VAR_FANCLUB_LOSE_FAN_TIMER);\n            VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, timer + 12);\n            i++;\n        }\n    }\n}\n\nbool16 Script_IsFanClubMemberFanOfPlayer(void)\n{\n    return IsFanClubMemberFanOfPlayer(TRAINER_FAN_CLUB);\n}\n\nstatic bool16 IsFanClubMemberFanOfPlayer(struct TrainerFanClub *fanClub)\n{\n    return GET_TRAINER_FAN_CLUB_FLAG(gSpecialVar_0x8004);\n}\n\nstatic void SetInitialFansOfPlayer(struct TrainerFanClub *fanClub)\n{\n    SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER1);\n    SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER2);\n    SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER3);\n}\n\nvoid Script_BufferFanClubTrainerName(void)\n{\n    u8 whichLinkTrainer = 0;\n    u8 whichNPCTrainer = 0;\n\n    switch (gSpecialVar_0x8004)\n    {\n    case FANCLUB_MEMBER1:\n        whichNPCTrainer = 0;\n        whichLinkTrainer = 0;\n        break;\n    case FANCLUB_MEMBER2:\n    case FANCLUB_MEMBER3:\n    case FANCLUB_MEMBER4:\n    case FANCLUB_MEMBER8:\n        break;\n    case FANCLUB_MEMBER5:\n        whichNPCTrainer = 1;\n        whichLinkTrainer = 0;\n        break;\n    case FANCLUB_MEMBER6:\n        whichNPCTrainer = 0;\n        whichLinkTrainer = 1;\n        break;\n    case FANCLUB_MEMBER7:\n        whichNPCTrainer = 2;\n        whichLinkTrainer = 1;\n        break;\n    }\n    BufferFanClubTrainerName(&gSaveBlock2Ptr->linkBattleRecords, whichLinkTrainer, whichNPCTrainer);\n}\n\nstatic void BufferFanClubTrainerName(struct LinkBattleRecords *linkRecords, u8 whichLinkTrainer, u8 whichNPCTrainer)\n{\n    u8 *str;\n    const u8 *linkTrainerName = linkRecords->entries[whichLinkTrainer].name;\n    if (linkTrainerName[0] == EOS)\n    {\n        switch (whichNPCTrainer)\n        {\n        case 0:\n            StringCopy(gStringVar1, gSaveBlock1Ptr->rivalName);\n            break;\n        case 1:\n            StringCopy(gStringVar1, gText_LtSurge);\n            break;\n        case 2:\n            StringCopy(gStringVar1, gText_Koga);\n            break;\n        default:\n            StringCopy(gStringVar1, gSaveBlock1Ptr->rivalName);\n            break;\n        }\n    }\n    else\n    {\n        str = gStringVar1;\n        StringCopyN(str, linkTrainerName, PLAYER_NAME_LENGTH);\n        str[PLAYER_NAME_LENGTH] = EOS;\n        if (   str[0] == EXT_CTRL_CODE_BEGIN\n               && str[1] == EXT_CTRL_CODE_JPN)\n        {\n            str += 2;\n            while (*str != EOS)\n                str++;\n            *str++ = EXT_CTRL_CODE_BEGIN;\n            *str++ = EXT_CTRL_CODE_ENG;\n            *str++ = EOS;\n        }\n    }\n}\n\nvoid Special_UpdateTrainerFansAfterLinkBattle(void)\n{\n    UpdateTrainerFansAfterLinkBattle(TRAINER_FAN_CLUB);\n}\n\nstatic void UpdateTrainerFansAfterLinkBattle(struct TrainerFanClub *fanClub)\n{\n    if (VarGet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) == 2)\n    {\n        TryLoseFansFromPlayTimeAfterLinkBattle(fanClub);\n        if (gBattleOutcome == B_OUTCOME_WON)\n            PlayerGainRandomTrainerFan(fanClub);\n        else\n            PlayerLoseRandomTrainerFan(fanClub);\n    }\n}\n\nstatic bool8 DidPlayerGetFirstFans(struct TrainerFanClub *fanClub)\n{\n    return fanClub->gotInitialFans;\n}\n\nvoid Script_SetPlayerGotFirstFans(void)\n{\n    SetPlayerGotFirstFans(TRAINER_FAN_CLUB);\n}\n\nstatic void SetPlayerGotFirstFans(struct TrainerFanClub *fanClub)\n{\n    fanClub->gotInitialFans = TRUE;\n}\n\nu8 Script_TryGainNewFanFromCounter(void)\n{\n    return TryGainNewFanFromCounter(TRAINER_FAN_CLUB, gSpecialVar_0x8004);\n}\n"
  },
  {
    "path": "src/trainer_pokemon_sprites.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"data.h\"\n\nstruct PicData\n{\n    u8 *frames;\n    struct SpriteFrameImage *images;\n    u16 paletteTag;\n    u8 spriteId;\n    u8 active;\n};\n\n#define PICS_COUNT 8\n\nstatic EWRAM_DATA struct SpriteTemplate sCreatingSpriteTemplate = {};\nstatic EWRAM_DATA struct PicData sSpritePics[PICS_COUNT] = {};\n\nstatic const struct PicData sDummyPicData = {};\n\nstatic const struct OamData sOamData_Normal =\n{\n    .shape = SPRITE_SHAPE(64x64),\n    .size = SPRITE_SIZE(64x64)\n};\n\nvoid DummyPicSpriteCallback(struct Sprite *sprite)\n{\n\n}\n\nbool16 ResetAllPicSprites(void)\n{\n    int i;\n\n    for (i = 0; i < PICS_COUNT; i ++)\n        sSpritePics[i] = sDummyPicData;\n\n    return FALSE;\n}\n\nstatic bool16 DecompressPic(u16 species, u32 personality, bool8 isFrontPic, u8 *dest, bool8 isTrainer, bool8 ignoreDeoxys)\n{\n    if (!isTrainer)\n    {\n        if (isFrontPic)\n        {\n            if (!ignoreDeoxys)\n                LoadSpecialPokePic(&gMonFrontPicTable[species], dest, species, personality, isFrontPic);\n            else\n                LoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], dest, species, personality, isFrontPic);\n        }\n        else\n        {\n            if (!ignoreDeoxys)\n                LoadSpecialPokePic(&gMonBackPicTable[species], dest, species, personality, isFrontPic);\n            else\n                LoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], dest, species, personality, isFrontPic);\n        }\n    }\n    else\n    {\n        if (isFrontPic)\n            DecompressPicFromTable(&gTrainerFrontPicTable[species], dest, species);\n        else\n            DecompressPicFromTable(&gTrainerBackPicTable[species], dest, species);\n    }\n    return FALSE;\n}\n\nstatic bool16 DecompressPic_HandleDeoxys(u16 species, u32 personality, bool8 isFrontPic, u8 *dest, bool8 isTrainer)\n{\n    return DecompressPic(species, personality, isFrontPic, dest, isTrainer, FALSE);\n}\n\nvoid LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 paletteSlot, u16 paletteTag, bool8 isTrainer)\n{\n    if (!isTrainer)\n    {\n        if (paletteTag == TAG_NONE)\n        {\n            sCreatingSpriteTemplate.paletteTag = TAG_NONE;\n            LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality), OBJ_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP);\n        }\n        else\n        {\n            sCreatingSpriteTemplate.paletteTag = paletteTag;\n            LoadCompressedSpritePalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality));\n        }\n    }\n    else\n    {\n        if (paletteTag == TAG_NONE)\n        {\n            sCreatingSpriteTemplate.paletteTag = TAG_NONE;\n            LoadCompressedPalette(gTrainerFrontPicPaletteTable[species].data, OBJ_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP);\n        }\n        else\n        {\n            sCreatingSpriteTemplate.paletteTag = paletteTag;\n            LoadCompressedSpritePalette(&gTrainerFrontPicPaletteTable[species]);\n        }\n    }\n}\n\nvoid LoadPicPaletteBySlot(u16 species, u32 otId, u32 personality, u8 paletteSlot, bool8 isTrainer)\n{\n    if (!isTrainer)\n        LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality), BG_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP);\n    else\n        LoadCompressedPalette(gTrainerFrontPicPaletteTable[species].data, BG_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP);\n}\n\nvoid AssignSpriteAnimsTable(bool8 isTrainer)\n{\n    if (!isTrainer)\n        sCreatingSpriteTemplate.anims = gAnims_MonPic;\n    else\n        sCreatingSpriteTemplate.anims = gTrainerFrontAnimsPtrTable[0];\n}\n\nu16 CreatePicSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 isTrainer, bool8 ignoreDeoxys)\n{\n    u32 i;\n    u8 *framePics;\n    struct SpriteFrameImage *images;\n    int j;\n    u8 spriteId;\n\n    for (i = 0; i < PICS_COUNT; i ++)\n    {\n        if (!sSpritePics[i].active)\n            break;\n    }\n    if (i == PICS_COUNT)\n        return 0xFFFF;\n\n    framePics = Alloc(4 * 0x800);\n    if (!framePics)\n        return 0xFFFF;\n\n    images = Alloc(4 * sizeof(struct SpriteFrameImage));\n    if (!images)\n    {\n        Free(framePics);\n        return 0xFFFF;\n    }\n    if (DecompressPic(species, personality, isFrontPic, framePics, isTrainer, ignoreDeoxys))\n    {\n        // debug trap?\n        return 0xFFFF;\n    }\n    for (j = 0; j < 4; j ++)\n    {\n        images[j].data = framePics + 0x800 * j;\n        images[j].size = 0x800;\n    }\n    sCreatingSpriteTemplate.tileTag = TAG_NONE;\n    sCreatingSpriteTemplate.oam = &sOamData_Normal;\n    AssignSpriteAnimsTable(isTrainer);\n    sCreatingSpriteTemplate.images = images;\n    sCreatingSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable;\n    sCreatingSpriteTemplate.callback = DummyPicSpriteCallback;\n    LoadPicPaletteByTagOrSlot(species, otId, personality, paletteSlot, paletteTag, isTrainer);\n    spriteId = CreateSprite(&sCreatingSpriteTemplate, x, y, 0);\n    if (paletteTag == TAG_NONE)\n        gSprites[spriteId].oam.paletteNum = paletteSlot;\n    sSpritePics[i].frames = framePics;\n    sSpritePics[i].images = images;\n    sSpritePics[i].paletteTag = paletteTag;\n    sSpritePics[i].spriteId = spriteId;\n    sSpritePics[i].active = TRUE;\n    return spriteId;\n}\n\nu16 CreatePicSprite_HandleDeoxys(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 isTrainer)\n{\n    return CreatePicSprite(species, otId, personality, isFrontPic, x, y, paletteSlot, paletteTag, isTrainer, FALSE);\n}\n\nu16 FreeAndDestroyPicSpriteInternal(u16 spriteId)\n{\n    u32 i;\n    u8 *framePics;\n    struct SpriteFrameImage *images;\n\n    for (i = 0; i < PICS_COUNT; i ++)\n    {\n        if (sSpritePics[i].spriteId == spriteId)\n            break;\n    }\n    if (i == PICS_COUNT)\n        return 0xFFFF;\n\n    framePics = sSpritePics[i].frames;\n    images = sSpritePics[i].images;\n    if (sSpritePics[i].paletteTag != TAG_NONE)\n        FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum));\n    DestroySprite(&gSprites[spriteId]);\n    Free(framePics);\n    Free(images);\n    sSpritePics[i] = sDummyPicData;\n    return 0;\n}\n\nstatic u16 LoadPicSpriteInWindow(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId, bool8 isTrainer)\n{\n    if (DecompressPic_HandleDeoxys(species, personality, isFrontPic, (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA), FALSE))\n        return 0xFFFF;\n\n    LoadPicPaletteBySlot(species, otId, personality, paletteSlot, isTrainer);\n    return 0;\n}\n\nu16 CreateTrainerCardSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId, bool8 isTrainer)\n{\n    u8 *framePics;\n\n    framePics = Alloc(4 * 0x800);\n    if (framePics && !DecompressPic_HandleDeoxys(species, personality, isFrontPic, framePics, isTrainer))\n    {\n        BlitBitmapRectToWindow(windowId, framePics, 0, 0, 0x40, 0x40, destX, destY, 0x40, 0x40);\n        LoadPicPaletteBySlot(species, otId, personality, paletteSlot, isTrainer);\n        Free(framePics);\n        return 0;\n    }\n    return 0xFFFF;\n}\n\nu16 CreateMonPicSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 ignoreDeoxys)\n{\n    return CreatePicSprite(species, otId, personality, isFrontPic, x, y, paletteSlot, paletteTag, FALSE, ignoreDeoxys);\n}\n\nu16 CreateMonPicSprite_HandleDeoxys(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag)\n{\n    return CreateMonPicSprite(species, otId, personality, isFrontPic, x, y, paletteSlot, paletteTag, FALSE);\n}\n\nu16 FreeAndDestroyMonPicSprite(u16 spriteId)\n{\n    return FreeAndDestroyPicSpriteInternal(spriteId);\n}\n\nu16 LoadMonPicInWindow(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId)\n{\n    return CreateTrainerCardSprite(species, otId, personality, isFrontPic, 0, 0, paletteSlot, windowId, FALSE);\n}\n\nu16 CreateTrainerCardMonIconSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId)\n{\n    return CreateTrainerCardSprite(species, otId, personality, isFrontPic, destX, destY, paletteSlot, windowId, FALSE);\n}\n\nu16 CreateTrainerPicSprite(u16 species, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag)\n{\n    return CreatePicSprite_HandleDeoxys(species, 0, 0, isFrontPic, x, y, paletteSlot, paletteTag, TRUE);\n}\n\nu16 FreeAndDestroyTrainerPicSprite(u16 spriteId)\n{\n    return FreeAndDestroyPicSpriteInternal(spriteId);\n}\n\nu16 LoadTrainerPicInWindow(u16 species, bool8 isFrontPic, u8 paletteSlot, u8 windowId)\n{\n    return LoadPicSpriteInWindow(species, 0, 0, isFrontPic, paletteSlot, windowId, TRUE);\n}\n\nu16 CreateTrainerCardTrainerPicSprite(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId)\n{\n    return CreateTrainerCardSprite(species, 0, 0, isFrontPic, destX, destY, paletteSlot, windowId, TRUE);\n}\n\nu16 PlayerGenderToFrontTrainerPicId(u8 gender, bool8 getClass)\n{\n    if (getClass == TRUE)\n    {\n        if (gender != MALE)\n            return gFacilityClassToPicIndex[FACILITY_CLASS_LEAF];\n        else\n            return gFacilityClassToPicIndex[FACILITY_CLASS_RED];\n    }\n    return gender;\n}\n"
  },
  {
    "path": "src/trainer_see.c",
    "content": "#include \"global.h\"\n#include \"battle_setup.h\"\n#include \"event_object_movement.h\"\n#include \"field_effect.h\"\n#include \"field_player_avatar.h\"\n#include \"quest_log.h\"\n#include \"script.h\"\n#include \"task.h\"\n#include \"util.h\"\n#include \"constants/battle_setup.h\"\n#include \"constants/event_object_movement.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/trainer_types.h\"\n\ntypedef u8 (*TrainerApproachFunc)(struct ObjectEvent *, s16, s16, s16);\ntypedef bool8 (*TrainerSeeFunc)(u8, struct Task *, struct ObjectEvent *);\n\nstatic bool8 CheckTrainer(u8 trainerObjId);\nstatic u8 GetTrainerApproachDistance(struct ObjectEvent * trainerObj);\nstatic u8 GetTrainerApproachDistanceSouth(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y);\nstatic u8 GetTrainerApproachDistanceNorth(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y);\nstatic u8 GetTrainerApproachDistanceWest(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y);\nstatic u8 GetTrainerApproachDistanceEast(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y);\nstatic u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent * trainerObj, u8 approachDistance, u8 facingDirection);\nstatic void TrainerApproachPlayer(struct ObjectEvent * trainerObj, u8 approachDistance);\nstatic void Task_RunTrainerSeeFuncList(u8 taskId);\nstatic bool8 TrainerSeeFunc_Dummy(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_StartExclMark(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_WaitExclMark(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_TrainerApproach(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_PrepareToEngage(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_End(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_BeginRemoveDisguise(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_WaitRemoveDisguise(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_TrainerInAshFacesPlayer(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_BeginJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_WaitJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_EndJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_OffscreenAboveTrainerCreateCameraObj(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveUp(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveDown(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj);\nstatic void Task_DestroyTrainerApproachTask(u8 taskId);\nstatic void SpriteCB_TrainerIcons(struct Sprite *sprite);\nstatic void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum);\n\nstatic const u16 sGfx_Emoticons[] = INCBIN_U16(\"graphics/misc/emoticons.4bpp\");\n\n// u8 func(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y)\n// range is the maximum distance the trainer can see\n// x and y are the player's coordinates\n// Returns distance to walk if trainer has unobstructed view of player\n// Returns 0 if trainer can't see player\nstatic const TrainerApproachFunc sDirectionalApproachDistanceFuncs[] = {\n    GetTrainerApproachDistanceSouth,\n    GetTrainerApproachDistanceNorth,\n    GetTrainerApproachDistanceWest,\n    GetTrainerApproachDistanceEast\n};\n\n// bool8 func(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n// Returns TRUE to run the next func immediately\n// Returns FALSE to delay the next func to the next frame\nstatic const TrainerSeeFunc sTrainerSeeFuncList[] = {\n    TrainerSeeFunc_Dummy,\n    TrainerSeeFunc_StartExclMark,\n    TrainerSeeFunc_WaitExclMark,\n    TrainerSeeFunc_TrainerApproach,\n    TrainerSeeFunc_PrepareToEngage,\n    TrainerSeeFunc_End,\n    TrainerSeeFunc_BeginRemoveDisguise,\n    TrainerSeeFunc_WaitRemoveDisguise,\n    TrainerSeeFunc_TrainerInAshFacesPlayer,\n    TrainerSeeFunc_BeginJumpOutOfAsh,\n    TrainerSeeFunc_WaitJumpOutOfAsh,\n    TrainerSeeFunc_EndJumpOutOfAsh,\n    TrainerSeeFunc_OffscreenAboveTrainerCreateCameraObj,\n    TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveUp,\n    TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveDown\n};\n\nstatic const TrainerSeeFunc sTrainerSeeFuncList2[] = {\n    TrainerSeeFunc_TrainerInAshFacesPlayer,\n    TrainerSeeFunc_BeginJumpOutOfAsh,\n    TrainerSeeFunc_WaitJumpOutOfAsh,\n    TrainerSeeFunc_EndJumpOutOfAsh\n};\n\nbool8 CheckForTrainersWantingBattle(void)\n{\n    u32 i;\n    if (QL_IsTrainerSightDisabled() == TRUE)\n        return FALSE;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        if (gObjectEvents[i].active\n         && (gObjectEvents[i].trainerType == TRAINER_TYPE_NORMAL\n          || gObjectEvents[i].trainerType == TRAINER_TYPE_BURIED)\n         && CheckTrainer(i))\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 CheckTrainer(u8 trainerObjId)\n{\n    const u8 *script = GetObjectEventScriptPointerByObjectEventId(trainerObjId);\n    u8 approachDistance;\n    if (GetTrainerFlagFromScriptPointer(script))\n        return FALSE;\n    approachDistance = GetTrainerApproachDistance(&gObjectEvents[trainerObjId]);\n    if (approachDistance != 0)\n    {\n        if (script[1] == TRAINER_BATTLE_DOUBLE && GetMonsStateToDoubles())\n            return FALSE;\n        ConfigureAndSetUpOneTrainerBattle(trainerObjId, script);\n        TrainerApproachPlayer(&gObjectEvents[trainerObjId], approachDistance - 1);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nstatic u8 GetTrainerApproachDistance(struct ObjectEvent *trainerObj)\n{\n    s16 x, y;\n    u32 i;\n    u8 approachDistance;\n\n    PlayerGetDestCoords(&x, &y);\n    if (trainerObj->trainerType == TRAINER_TYPE_NORMAL)  // can only see in one direction\n    {\n        approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->facingDirection - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);\n        return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->facingDirection);\n    }\n    else // TRAINER_TYPE_SEE_ALL_DIRECTIONS, TRAINER_TYPE_BURIED\n    {\n        for (i = 0; i < 4; i++)\n        {\n            approachDistance = sDirectionalApproachDistanceFuncs[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);\n            if (CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, i + 1)) // directions are 1-4 instead of 0-3. south north west east\n                return approachDistance;\n        }\n    }\n\n    return 0;\n}\n\n// Returns how far south the player is from trainer. 0 if out of trainer's sight.\nstatic u8 GetTrainerApproachDistanceSouth(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y)\n{\n    if (trainerObj->currentCoords.x == x\n        && y > trainerObj->currentCoords.y\n        && y <= trainerObj->currentCoords.y + range)\n    {\n        if (range > 3 && GetFirstInactiveObjectEventId() == OBJECT_EVENTS_COUNT)\n            return 0;\n        return (y - trainerObj->currentCoords.y);\n    }\n    else\n        return 0;\n}\n\n// Returns how far north the player is from trainer. 0 if out of trainer's sight.\nstatic u8 GetTrainerApproachDistanceNorth(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y)\n{\n    if (trainerObj->currentCoords.x == x\n        && y < trainerObj->currentCoords.y\n        && y >= trainerObj->currentCoords.y - range)\n        return (trainerObj->currentCoords.y - y);\n    else\n        return 0;\n}\n\n// Returns how far west the player is from trainer. 0 if out of trainer's sight.\nstatic u8 GetTrainerApproachDistanceWest(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y)\n{\n    if (trainerObj->currentCoords.y == y\n        && x < trainerObj->currentCoords.x\n        && x >= trainerObj->currentCoords.x - range)\n        return (trainerObj->currentCoords.x - x);\n    else\n        return 0;\n}\n\n// Returns how far east the player is from trainer. 0 if out of trainer's sight.\nstatic u8 GetTrainerApproachDistanceEast(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y)\n{\n    if (trainerObj->currentCoords.y == y\n        && x > trainerObj->currentCoords.x\n        && x <= trainerObj->currentCoords.x + range)\n        return (x - trainerObj->currentCoords.x);\n    else\n        return 0;\n}\n\n#define COLLISION_MASK (~1)\n\nstatic u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 approachDistance, u8 direction)\n{\n    s16 x, y;\n    u8 unk19_temp;\n    u8 unk19b_temp;\n    u32 i;\n    u8 collision;\n\n    if (approachDistance == 0)\n        return 0;\n\n    x = trainerObj->currentCoords.x;\n    y = trainerObj->currentCoords.y;\n\n    for (i = 0; i <= approachDistance - 1; i++, MoveCoords(direction, &x, &y))\n    {\n        collision = GetCollisionFlagsAtCoords(trainerObj, x, y, direction);\n        if (collision != 0 && (collision & COLLISION_MASK))\n            return 0;\n    }\n\n    // preserve mapobj_unk_19 before clearing.\n    unk19_temp = trainerObj->rangeX;\n    unk19b_temp = trainerObj->rangeY;\n    trainerObj->rangeX = 0;\n    trainerObj->rangeY = 0;\n\n    collision = GetCollisionAtCoords(trainerObj, x, y, direction);\n\n    trainerObj->rangeX = unk19_temp;\n    trainerObj->rangeY = unk19b_temp;\n    if (collision == 4)\n        return approachDistance;\n\n    return 0;\n}\n\n#define tFuncId             data[0]\n#define tTrainerObjHi       data[1]\n#define tTrainerObjLo       data[2]\n#define tTrainerRange       data[3]\n#define tOutOfAshSpriteId   data[4]\n#define tData5              data[5]\n\n#define TaskGetTrainerObj(dest, task) do { \\\n    (dest) = (struct ObjectEvent *)(((task)->tTrainerObjHi << 16) | ((u16)(task)->tTrainerObjLo)); \\\n} while (0)\n\nstatic void TrainerApproachPlayer(struct ObjectEvent * trainerObj, u8 approachDistance)\n{\n    u8 taskId = CreateTask(Task_RunTrainerSeeFuncList, 80);\n    struct Task *task = &gTasks[taskId];\n    task->tTrainerObjHi = ((uintptr_t)trainerObj) >> 16;\n    task->tTrainerObjLo = (uintptr_t)trainerObj;\n    task->tTrainerRange = approachDistance;\n}\n\nstatic void StartTrainerApproachWithFollowupTask(TaskFunc taskFunc)\n{\n    u8 taskId = FindTaskIdByFunc(Task_RunTrainerSeeFuncList);\n    SetTaskFuncWithFollowupFunc(taskId, Task_RunTrainerSeeFuncList, taskFunc);\n    gTasks[taskId].tFuncId = 1;\n    Task_RunTrainerSeeFuncList(taskId);\n}\n\nstatic void Task_RunTrainerSeeFuncList(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    struct ObjectEvent * trainerObj;\n    TaskGetTrainerObj(trainerObj, task);\n\n    if (!trainerObj->active)\n    {\n        SwitchTaskToFollowupFunc(taskId);\n    }\n    else\n    {\n        while (sTrainerSeeFuncList[task->tFuncId](taskId, task, trainerObj))\n            ;\n    }\n}\n\n// TrainerSeeFuncs\n\nstatic bool8 TrainerSeeFunc_Dummy(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n{\n    return FALSE;\n}\n\nstatic bool8 TrainerSeeFunc_StartExclMark(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n{\n    u8 action;\n    // FRLG introduces trainers who can see the player from offscreen above.\n    // Handle this case here.\n    if (trainerObj->facingDirection == DIR_SOUTH && task->tTrainerRange > 2)\n    {\n        task->tFuncId = 12;\n    }\n    else\n    {\n        ObjectEventGetLocalIdAndMap(trainerObj, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);\n        FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON);\n        action = GetFaceDirectionMovementAction(trainerObj->facingDirection);\n        ObjectEventSetHeldMovement(trainerObj, action);\n        task->tFuncId++;\n    }\n    return TRUE;\n}\n\nstatic bool8 TrainerSeeFunc_WaitExclMark(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n{\n    if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON))\n    {\n        return FALSE;\n    }\n    else\n    {\n        task->tFuncId++;\n        if (trainerObj->movementType == MOVEMENT_TYPE_TREE_DISGUISE || trainerObj->movementType == MOVEMENT_TYPE_MOUNTAIN_DISGUISE)\n            task->tFuncId = 6;\n        if (trainerObj->movementType == MOVEMENT_TYPE_BURIED)\n            task->tFuncId = 8;\n        return TRUE;\n    }\n}\n\nstatic bool8 TrainerSeeFunc_TrainerApproach(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n{\n    if (!ObjectEventIsMovementOverridden(trainerObj) || ObjectEventClearHeldMovementIfFinished(trainerObj))\n    {\n        if (task->tTrainerRange)\n        {\n            ObjectEventSetHeldMovement(trainerObj, GetWalkNormalMovementAction(trainerObj->facingDirection));\n            task->tTrainerRange--;\n        }\n        else\n        {\n            ObjectEventSetHeldMovement(trainerObj, MOVEMENT_ACTION_FACE_PLAYER);\n            task->tFuncId++;\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 TrainerSeeFunc_PrepareToEngage(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n{\n    struct ObjectEvent *playerObj;\n\n    if (ObjectEventIsMovementOverridden(trainerObj) && !ObjectEventClearHeldMovementIfFinished(trainerObj))\n        return FALSE;\n\n    SetTrainerMovementType(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection));\n    OverrideMovementTypeForObjectEvent(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection));\n    OverrideTemplateCoordsForObjectEvent(trainerObj);\n\n    playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];\n    if (ObjectEventIsMovementOverridden(playerObj) && !ObjectEventClearHeldMovementIfFinished(playerObj))\n        return FALSE;\n\n    CancelPlayerForcedMovement();\n    // Uncomment to have player turn to face their opponent\n    // ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetFaceDirectionMovementAction(GetOppositeDirection(trainerObj->facingDirection)));\n    task->tFuncId++;\n    return FALSE;\n}\n\nstatic bool8 TrainerSeeFunc_End(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n{\n    struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];\n\n    if (!ObjectEventIsMovementOverridden(playerObj)\n        || ObjectEventClearHeldMovementIfFinished(playerObj))\n        SwitchTaskToFollowupFunc(taskId); // This ends the trainer walk routine.\n    return FALSE;\n}\n\n// Jumps here if disguised. Not used in FRLG.\nstatic bool8 TrainerSeeFunc_BeginRemoveDisguise(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n{\n    if (!ObjectEventIsMovementOverridden(trainerObj)\n     || ObjectEventClearHeldMovementIfFinished(trainerObj))\n    {\n        ObjectEventSetHeldMovement(trainerObj, MOVEMENT_ACTION_REVEAL_TRAINER);\n        task->tFuncId++;\n    }\n    return FALSE;\n}\n\nstatic bool8 TrainerSeeFunc_WaitRemoveDisguise(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n{\n    if (ObjectEventClearHeldMovementIfFinished(trainerObj))\n        task->tFuncId = 3;\n\n    return FALSE;\n}\n\n// Jump here if buried in ash. Not used in FRLG.\nstatic bool8 TrainerSeeFunc_TrainerInAshFacesPlayer(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n{\n    if (!ObjectEventIsMovementOverridden(trainerObj)\n        || ObjectEventClearHeldMovementIfFinished(trainerObj))\n    {\n        ObjectEventSetHeldMovement(trainerObj, MOVEMENT_ACTION_FACE_PLAYER);\n        task->tFuncId++;\n    }\n    return FALSE;\n}\n\nstatic bool8 TrainerSeeFunc_BeginJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n{\n    if (ObjectEventCheckHeldMovementStatus(trainerObj))\n    {\n        gFieldEffectArguments[0] = trainerObj->currentCoords.x;\n        gFieldEffectArguments[1] = trainerObj->currentCoords.y;\n        gFieldEffectArguments[2] = gSprites[trainerObj->spriteId].subpriority - 1;\n        gFieldEffectArguments[3] = 2;\n        task->tOutOfAshSpriteId = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);\n        task->tFuncId++;\n    }\n    return FALSE;\n}\n\nstatic bool8 TrainerSeeFunc_WaitJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n{\n    struct Sprite *sprite;\n\n    if (gSprites[task->tOutOfAshSpriteId].animCmdIndex == 2)\n    {\n        trainerObj->fixedPriority = FALSE;\n        trainerObj->triggerGroundEffectsOnMove = TRUE;\n\n        sprite = &gSprites[trainerObj->spriteId];\n        sprite->oam.priority = 2;\n        ObjectEventClearHeldMovementIfFinished(trainerObj);\n        ObjectEventSetHeldMovement(trainerObj, GetJumpInPlaceMovementAction(trainerObj->facingDirection));\n        task->tFuncId++;\n    }\n\n    return FALSE;\n}\n\nstatic bool8 TrainerSeeFunc_EndJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj)\n{\n    if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))\n        task->tFuncId = 3;\n\n    return FALSE;\n}\n\n// FRLG exclusive: Scroll the camera up to reveal an offscreen above trainer\nstatic bool8 TrainerSeeFunc_OffscreenAboveTrainerCreateCameraObj(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj)\n{\n    int specialObjectId;\n    task->tData5 = 0;\n    specialObjectId = SpawnSpecialObjectEventParameterized(OBJ_EVENT_GFX_YOUNGSTER, 7, OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->pos.x + 7, gSaveBlock1Ptr->pos.y + 7, 3);\n    gObjectEvents[specialObjectId].invisible = TRUE;\n    CameraObjectSetFollowedObjectId(gObjectEvents[specialObjectId].spriteId);\n    task->tFuncId++;\n    return FALSE;\n}\n\nstatic bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveUp(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj)\n{\n    u8 specialObjectId;\n    TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &specialObjectId);\n\n    if (ObjectEventIsMovementOverridden(&gObjectEvents[specialObjectId]) && !ObjectEventClearHeldMovementIfFinished(&gObjectEvents[specialObjectId]))\n        return FALSE;\n\n    if (task->tData5 != task->tTrainerRange - 1)\n    {\n        ObjectEventSetHeldMovement(&gObjectEvents[specialObjectId], GetWalkFastMovementAction(DIR_NORTH));\n        task->tData5++;\n    }\n    else\n    {\n        ObjectEventGetLocalIdAndMap(trainerObj, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);\n        FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON);\n        task->tData5 = 0;\n        task->tFuncId++;\n    }\n    return FALSE;\n}\n\nstatic bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveDown(u8 taskId, struct Task *task, struct ObjectEvent * trainerObj)\n{\n    u8 specialObjectId;\n    TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &specialObjectId);\n\n    if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON))\n        return FALSE;\n\n    if (ObjectEventIsMovementOverridden(&gObjectEvents[specialObjectId]) && !ObjectEventClearHeldMovementIfFinished(&gObjectEvents[specialObjectId]))\n        return FALSE;\n\n    if (task->tData5 != task->tTrainerRange - 1)\n    {\n        ObjectEventSetHeldMovement(&gObjectEvents[specialObjectId], GetWalkFastMovementAction(DIR_SOUTH));\n        task->tData5++;\n    }\n    else\n    {\n        CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId());\n        RemoveObjectEventByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);\n        task->tData5 = 0;\n        task->tFuncId = 2;\n    }\n    return FALSE;\n}\n\n#undef tData5\n#undef tOutOfAshSpriteId\n#undef tTrainerRange\n#undef tTrainerObjLo\n#undef tTrainerObjHi\n#undef tFuncId\n\nstatic void Task_RevealTrainer_RunTrainerSeeFuncList(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    struct ObjectEvent * trainerObj;\n\n    // another objEvent loaded into by loadword?\n    LoadWordFromTwoHalfwords((u16 *)&task->data[1], (uintptr_t *)&trainerObj);\n    if (!task->data[7])\n    {\n        ObjectEventClearHeldMovement(trainerObj);\n        task->data[7]++;\n    }\n    sTrainerSeeFuncList2[task->data[0]](taskId, task, trainerObj);\n    if (task->data[0] == 3 && !FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))\n    {\n        SetTrainerMovementType(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection));\n        OverrideMovementTypeForObjectEvent(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection));\n        DestroyTask(taskId);\n    }\n    else\n    {\n        trainerObj->heldMovementFinished = FALSE;\n    }\n}\n\nvoid MovementAction_RevealTrainer_RunTrainerSeeFuncList(struct ObjectEvent *var)\n{\n    StoreWordInTwoHalfwords((u16 *)&gTasks[CreateTask(Task_RevealTrainer_RunTrainerSeeFuncList, 0)].data[1], (u32)var);\n}\n\nvoid EndTrainerApproach(void)\n{\n    StartTrainerApproachWithFollowupTask(Task_DestroyTrainerApproachTask);\n}\n\nstatic void Task_DestroyTrainerApproachTask(u8 taskId)\n{\n    DestroyTask(taskId);\n    ScriptContext_Enable();\n}\n\n// Trainer See Excl Mark Field Effect\n\n#define sLocalId    data[0]\n#define sMapNum     data[1]\n#define sMapGroup   data[2]\n#define sData3      data[3]\n#define sData4      data[4]\n#define sFldEffId   data[7]\n\nstatic const struct OamData sOamData_Emoticons = {\n    .y = 0,\n    .affineMode = ST_OAM_AFFINE_OFF,\n    .objMode = ST_OAM_OBJ_NORMAL,\n    .mosaic = FALSE,\n    .bpp = ST_OAM_4BPP,\n    .shape = SPRITE_SHAPE(16x16),\n    .x = 0,\n    .matrixNum = 0,\n    .size = SPRITE_SIZE(16x16),\n    .tileNum = 0,\n    .priority = 1,\n    .paletteNum = 0,\n    .affineParam = 0,\n};\n\nstatic const struct SpriteFrameImage sSpriteImages_Emoticons[] = {\n    {sGfx_Emoticons + 0x000, 0x80},\n    {sGfx_Emoticons + 0x040, 0x80},\n    {sGfx_Emoticons + 0x080, 0x80},\n\n    {sGfx_Emoticons + 0x180, 0x80},\n    {sGfx_Emoticons + 0x1C0, 0x80},\n    {sGfx_Emoticons + 0x200, 0x80},\n\n    {sGfx_Emoticons + 0x0C0, 0x80},\n    {sGfx_Emoticons + 0x100, 0x80},\n    {sGfx_Emoticons + 0x140, 0x80},\n\n    {sGfx_Emoticons + 0x240, 0x80},\n    {sGfx_Emoticons + 0x280, 0x80},\n    {sGfx_Emoticons + 0x2C0, 0x80},\n\n    {sGfx_Emoticons + 0x300, 0x80},\n    {sGfx_Emoticons + 0x340, 0x80},\n    {sGfx_Emoticons + 0x380, 0x80},\n};\n\nstatic const union AnimCmd sAnimCmd_ExclamationMark1[] = {\n    ANIMCMD_FRAME( 0,  4),\n    ANIMCMD_FRAME( 1,  4),\n    ANIMCMD_FRAME( 2, 52),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_DoubleExclMark[] = {\n    ANIMCMD_FRAME( 6,  4),\n    ANIMCMD_FRAME( 7,  4),\n    ANIMCMD_FRAME( 8, 52),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_X[] = {\n    ANIMCMD_FRAME( 3,  4),\n    ANIMCMD_FRAME( 4,  4),\n    ANIMCMD_FRAME( 5, 52),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_SmileyFace[] = {\n    ANIMCMD_FRAME( 9,  4),\n    ANIMCMD_FRAME(10,  4),\n    ANIMCMD_FRAME(11, 52),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnimCmd_QuestionMark[] = {\n    ANIMCMD_FRAME(12,  4),\n    ANIMCMD_FRAME(13,  4),\n    ANIMCMD_FRAME(14, 52),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_Emoticons[] = {\n    sAnimCmd_ExclamationMark1,\n    sAnimCmd_DoubleExclMark,\n    sAnimCmd_X,\n    sAnimCmd_SmileyFace,\n    sAnimCmd_QuestionMark\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_Emoticons = {\n    .tileTag = 0xFFFF,\n    .paletteTag = 0xFFFF,\n    .oam = &sOamData_Emoticons,\n    .anims = sSpriteAnimTable_Emoticons,\n    .images = sSpriteImages_Emoticons,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_TrainerIcons\n};\n\nu8 FldEff_ExclamationMarkIcon1(void)\n{\n    u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x53);\n\n    if (spriteId != MAX_SPRITES)\n        SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 0);\n\n    return 0;\n}\n\nu8 FldEff_DoubleExclMarkIcon(void)\n{\n    u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52);\n\n    if (spriteId != MAX_SPRITES)\n        SetIconSpriteData(&gSprites[spriteId], FLDEFF_DOUBLE_EXCL_MARK_ICON, 1);\n\n    return 0;\n}\n\nu8 FldEff_XIcon(void)\n{\n    u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52);\n\n    if (spriteId != MAX_SPRITES)\n        SetIconSpriteData(&gSprites[spriteId], FLDEFF_X_ICON, 2);\n\n    return 0;\n}\n\nu8 FldEff_SmileyFaceIcon(void)\n{\n    u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52);\n\n    if (spriteId != MAX_SPRITES)\n        SetIconSpriteData(&gSprites[spriteId], FLDEFF_SMILEY_FACE_ICON, 3);\n\n    return 0;\n}\n\nu8 FldEff_QuestionMarkIcon(void)\n{\n    u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52);\n\n    if (spriteId != MAX_SPRITES)\n        SetIconSpriteData(&gSprites[spriteId], FLDEFF_QUESTION_MARK_ICON, 4);\n\n    return 0;\n}\n\nstatic void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum)\n{\n    sprite->oam.priority = 1;\n    sprite->coordOffsetEnabled = 1;\n\n    sprite->sLocalId = gFieldEffectArguments[0];\n    sprite->sMapNum = gFieldEffectArguments[1];\n    sprite->sMapGroup = gFieldEffectArguments[2];\n    sprite->sData3 = -5;\n    sprite->sFldEffId = fldEffId;\n\n    StartSpriteAnim(sprite, spriteAnimNum);\n}\n\nstatic void SpriteCB_TrainerIcons(struct Sprite *sprite)\n{\n    u8 objEventId;\n\n    if (TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objEventId)\n        || sprite->animEnded)\n    {\n        FieldEffectStop(sprite, sprite->sFldEffId);\n    }\n    else\n    {\n        struct Sprite *objEventSprite = &gSprites[gObjectEvents[objEventId].spriteId];\n        sprite->sData4 += sprite->sData3;\n        sprite->x = objEventSprite->x;\n        sprite->y = objEventSprite->y - 16;\n        sprite->x2 = objEventSprite->x2;\n        sprite->y2 = objEventSprite->y2 + sprite->sData4;\n        if (sprite->sData4)\n            sprite->sData3++;\n        else\n            sprite->sData3 = 0;\n    }\n}\n\n#undef sLocalId\n#undef sMapNum\n#undef sMapGroup\n#undef sData3\n#undef sData4\n#undef sFldEffId\n"
  },
  {
    "path": "src/trainer_tower.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"util.h\"\n#include \"event_data.h\"\n#include \"cereader_tool.h\"\n#include \"easy_chat.h\"\n#include \"battle_setup.h\"\n#include \"battle_transition.h\"\n#include \"battle.h\"\n#include \"battle_main.h\"\n#include \"overworld.h\"\n#include \"item.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"constants/items.h\"\n#include \"constants/songs.h\"\n#include \"constants/layouts.h\"\n#include \"constants/trainers.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/trainer_tower.h\"\n\n#define CURR_FLOOR sTrainerTowerState->data.floors[sTrainerTowerState->floorIdx]\n#define TRAINER_TOWER gSaveBlock1Ptr->trainerTower[gSaveBlock1Ptr->towerChallengeId]\n\nstruct TrainerTowerState\n{\n    /* 0x0000 */ u8 floorIdx;\n    /* 0x0004 */ struct EReaderTrainerTowerSet data;\n};\n\nstruct TrainerTowerOpponent\n{\n    /* 0x00 */ u8 name[11];\n    /* 0x0C */ u16 speechWin[6];\n    /* 0x18 */ u16 speechLose[6];\n    /* 0x24 */ u16 speechWin2[6];\n    /* 0x30 */ u16 speechLose2[6];\n    /* 0x3C */ u8 battleType;\n    /* 0x3D */ u8 facilityClass;\n    /* 0x3E */ u8 textColor;\n};\n\nstruct SinglesTrainerInfo\n{\n    u8 objGfx;\n    u8 facilityClass;\n    bool8 gender;\n};\n\nstruct DoublesTrainerInfo\n{\n    u8 objGfx1;\n    u8 objGfx2;\n    u8 facilityClass;\n    bool8 gender1;\n    bool8 gender2;\n};\n\nstruct TrainerEncounterMusicPairs\n{\n    u8 facilityClass;\n    u8 musicId;\n};\n\nstatic EWRAM_DATA struct TrainerTowerState * sTrainerTowerState = NULL;\nstatic EWRAM_DATA struct TrainerTowerOpponent * sTrainerTowerOpponent = NULL;\nstatic EWRAM_DATA u8 sUnused = 0;\n\nstatic void SetUpTrainerTowerDataStruct(void);\nstatic void FreeTrainerTowerDataStruct(void);\nstatic void InitTrainerTowerFloor(void);\nstatic void SetTrainerTowerNPCGraphics(void);\nstatic void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest);\nstatic void BufferTowerOpponentSpeech(void);\nstatic void TrainerTowerGetOpponentTextColor(u8 battleType, u8 facilityClass);\nstatic void DoTrainerTowerBattle(void);\nstatic void TrainerTowerGetChallengeType(void);\nstatic void TrainerTowerAddFloorCleared(void);\nstatic void GetFloorAlreadyCleared(void);\nstatic void StartTrainerTowerChallenge(void);\nstatic void GetOwnerState(void);\nstatic void GiveChallengePrize(void);\nstatic void CheckFinalTime(void);\nstatic void TrainerTowerResumeTimer(void);\nstatic void TrainerTowerSetPlayerLost(void);\nstatic void GetTrainerTowerChallengeStatus(void);\nstatic void GetCurrentTime(void);\nstatic void ShowResultsBoard(void);\nstatic void CloseResultsBoard(void);\nstatic void TrainerTowerGetDoublesEligiblity(void);\nstatic void TrainerTowerGetNumFloors(void);\nstatic void ShouldWarpToCounter(void);\nstatic void PlayTrainerTowerEncounterMusic(void);\nstatic void HasSpokenToOwner(void);\nstatic void BuildEnemyParty(void);\nstatic s32 GetPartyMaxLevel(void);\nstatic void ValidateOrResetCurTrainerTowerRecord(void);\nstatic u32 GetTrainerTowerRecordTime(u32 *);\nstatic void SetTrainerTowerRecordTime(u32 *, u32);\n\nextern const u8 gText_TimeBoard[];\nextern const u8 gText_XMinYZSec[];\nextern const u8 *const gTrainerTowerChallengeTypeTexts[];\n\nstatic const struct SinglesTrainerInfo sSingleBattleTrainerInfo[] = {\n    {OBJ_EVENT_GFX_AROMA_LADY,     FACILITY_CLASS_RS_AROMA_LADY,     FEMALE},\n    {OBJ_EVENT_GFX_RUIN_MANIAC,    FACILITY_CLASS_RS_RUIN_MANIAC,      MALE},\n    {OBJ_EVENT_GFX_TUBER_F,        FACILITY_CLASS_RS_TUBER_F,        FEMALE},\n    {OBJ_EVENT_GFX_TUBER_M_LAND,   FACILITY_CLASS_RS_TUBER_M,          MALE},\n    {OBJ_EVENT_GFX_COOLTRAINER_M,  FACILITY_CLASS_RS_COOLTRAINER_M,    MALE},\n    {OBJ_EVENT_GFX_COOLTRAINER_F,  FACILITY_CLASS_RS_COOLTRAINER_F,  FEMALE},\n    {OBJ_EVENT_GFX_SUPER_NERD,     FACILITY_CLASS_HEX_MANIAC,          MALE},\n    {OBJ_EVENT_GFX_WOMAN_2,        FACILITY_CLASS_RS_LADY,           FEMALE},\n    {OBJ_EVENT_GFX_BEAUTY,         FACILITY_CLASS_RS_BEAUTY,         FEMALE},\n    {OBJ_EVENT_GFX_BOY,            FACILITY_CLASS_RICH_BOY,            MALE},\n    {OBJ_EVENT_GFX_POKE_MANIAC,    FACILITY_CLASS_RS_POKEMANIAC,       MALE},\n    {OBJ_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_RS_SWIMMER_M,        MALE},\n    {OBJ_EVENT_GFX_BLACKBELT,      FACILITY_CLASS_RS_BLACK_BELT,       MALE},\n    {OBJ_EVENT_GFX_ROCKER,         FACILITY_CLASS_GUITARIST,           MALE},\n    {OBJ_EVENT_GFX_ROCKER,         FACILITY_CLASS_KINDLER,             MALE},\n    {OBJ_EVENT_GFX_CAMPER,         FACILITY_CLASS_RS_CAMPER,           MALE},\n    {OBJ_EVENT_GFX_SUPER_NERD,     FACILITY_CLASS_BUG_MANIAC,          MALE},\n    {OBJ_EVENT_GFX_PSYCHIC_M,      FACILITY_CLASS_RS_PSYCHIC_M,        MALE},\n    {OBJ_EVENT_GFX_PSYCHIC_F,      FACILITY_CLASS_RS_PSYCHIC_F,      FEMALE},\n    {OBJ_EVENT_GFX_GENTLEMAN,      FACILITY_CLASS_RS_GENTLEMAN,        MALE},\n    {OBJ_EVENT_GFX_BOY,            FACILITY_CLASS_SCHOOL_KID_M,        MALE},\n    {OBJ_EVENT_GFX_WOMAN_1,        FACILITY_CLASS_SCHOOL_KID_F,      FEMALE},\n    {OBJ_EVENT_GFX_BALDING_MAN,    FACILITY_CLASS_POKEFAN_M,           MALE},\n    {OBJ_EVENT_GFX_WOMAN_3,        FACILITY_CLASS_POKEFAN_F,         FEMALE},\n    {OBJ_EVENT_GFX_OLD_MAN_1,      FACILITY_CLASS_EXPERT_M,            MALE},\n    {OBJ_EVENT_GFX_OLD_WOMAN,      FACILITY_CLASS_EXPERT_F,          FEMALE},\n    {OBJ_EVENT_GFX_YOUNGSTER,      FACILITY_CLASS_RS_YOUNGSTER,        MALE},\n    {OBJ_EVENT_GFX_FISHER,         FACILITY_CLASS_RS_FISHERMAN,        MALE},\n    {OBJ_EVENT_GFX_COOLTRAINER_M,  FACILITY_CLASS_DRAGON_TAMER,        MALE},\n    {OBJ_EVENT_GFX_BIRD_KEEPER,    FACILITY_CLASS_RS_BIRD_KEEPER,      MALE},\n    {OBJ_EVENT_GFX_LITTLE_BOY,     FACILITY_CLASS_NINJA_BOY,           MALE},\n    {OBJ_EVENT_GFX_BATTLE_GIRL,    FACILITY_CLASS_BATTLE_GIRL,       FEMALE},\n    {OBJ_EVENT_GFX_BEAUTY,         FACILITY_CLASS_PARASOL_LADY,      FEMALE},\n    {OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_RS_SWIMMER_F,      FEMALE},\n    {OBJ_EVENT_GFX_PICNICKER,      FACILITY_CLASS_RS_PICNICKER,      FEMALE},\n    {OBJ_EVENT_GFX_SAILOR,         FACILITY_CLASS_RS_SAILOR,           MALE},\n    {OBJ_EVENT_GFX_FAT_MAN,        FACILITY_CLASS_COLLECTOR,           MALE},\n    {OBJ_EVENT_GFX_MAN,            FACILITY_CLASS_RS_PKMN_BREEDER_M,   MALE},\n    {OBJ_EVENT_GFX_POKEMON_BREEDER, FACILITY_CLASS_RS_PKMN_BREEDER_F, FEMALE},\n    {OBJ_EVENT_GFX_POKEMON_RANGER_M, FACILITY_CLASS_RS_PKMN_RANGER_M,    MALE},\n    {OBJ_EVENT_GFX_POKEMON_RANGER_F, FACILITY_CLASS_RS_PKMN_RANGER_F,  FEMALE},\n    {OBJ_EVENT_GFX_LASS,           FACILITY_CLASS_RS_LASS,           FEMALE},\n    {OBJ_EVENT_GFX_BUG_CATCHER,    FACILITY_CLASS_RS_BUG_CATCHER,      MALE},\n    {OBJ_EVENT_GFX_HIKER,          FACILITY_CLASS_RS_HIKER,            MALE},\n    {OBJ_EVENT_GFX_YOUNGSTER,      FACILITY_CLASS_YOUNGSTER,           MALE},\n    {OBJ_EVENT_GFX_BUG_CATCHER,    FACILITY_CLASS_BUG_CATCHER,         MALE},\n    {OBJ_EVENT_GFX_LASS,           FACILITY_CLASS_LASS,              FEMALE},\n    {OBJ_EVENT_GFX_SAILOR,         FACILITY_CLASS_SAILOR,              MALE},\n    {OBJ_EVENT_GFX_CAMPER,         FACILITY_CLASS_CAMPER,              MALE},\n    {OBJ_EVENT_GFX_PICNICKER,      FACILITY_CLASS_PICNICKER,         FEMALE},\n    {OBJ_EVENT_GFX_POKE_MANIAC,    FACILITY_CLASS_POKEMANIAC,          MALE},\n    {OBJ_EVENT_GFX_SUPER_NERD,     FACILITY_CLASS_SUPER_NERD,          MALE},\n    {OBJ_EVENT_GFX_HIKER,          FACILITY_CLASS_HIKER,               MALE},\n    {OBJ_EVENT_GFX_BIKER,          FACILITY_CLASS_BIKER,               MALE},\n    {OBJ_EVENT_GFX_BURGLAR,        FACILITY_CLASS_BURGLAR,             MALE},\n    {OBJ_EVENT_GFX_ENGINEER,       FACILITY_CLASS_ENGINEER,            MALE},\n    {OBJ_EVENT_GFX_FISHER,         FACILITY_CLASS_FISHERMAN,           MALE},\n    {OBJ_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_SWIMMER_M,           MALE},\n    {OBJ_EVENT_GFX_CUE_BALL,       FACILITY_CLASS_CUE_BALL,            MALE},\n    {OBJ_EVENT_GFX_OLD_MAN_1,      FACILITY_CLASS_GAMER,               MALE},\n    {OBJ_EVENT_GFX_BEAUTY,         FACILITY_CLASS_BEAUTY,            FEMALE},\n    {OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SWIMMER_F,         FEMALE},\n    {OBJ_EVENT_GFX_PSYCHIC_M,      FACILITY_CLASS_PSYCHIC_M,           MALE},\n    {OBJ_EVENT_GFX_ROCKER_2,         FACILITY_CLASS_ROCKER,            MALE},\n    {OBJ_EVENT_GFX_JUGGLER,        FACILITY_CLASS_JUGGLER,             MALE},\n    {OBJ_EVENT_GFX_TAMER,          FACILITY_CLASS_TAMER,               MALE},\n    {OBJ_EVENT_GFX_BIRD_KEEPER,    FACILITY_CLASS_BIRD_KEEPER,         MALE},\n    {OBJ_EVENT_GFX_BLACKBELT,      FACILITY_CLASS_BLACK_BELT,          MALE},\n    {OBJ_EVENT_GFX_SCIENTIST,      FACILITY_CLASS_SCIENTIST,           MALE},\n    {OBJ_EVENT_GFX_COOLTRAINER_M,  FACILITY_CLASS_COOLTRAINER_M,       MALE},\n    {OBJ_EVENT_GFX_COOLTRAINER_F,  FACILITY_CLASS_COOLTRAINER_F,     FEMALE},\n    {OBJ_EVENT_GFX_GENTLEMAN,      FACILITY_CLASS_GENTLEMAN,           MALE},\n    {OBJ_EVENT_GFX_CHANNELER,      FACILITY_CLASS_CHANNELER,         FEMALE},\n    {OBJ_EVENT_GFX_PSYCHIC_F,      FACILITY_CLASS_PSYCHIC_F,         FEMALE},\n    {OBJ_EVENT_GFX_BATTLE_GIRL,    FACILITY_CLASS_CRUSH_GIRL,        FEMALE},\n    {OBJ_EVENT_GFX_TUBER_F,        FACILITY_CLASS_TUBER,             FEMALE},\n    {OBJ_EVENT_GFX_POKEMON_BREEDER, FACILITY_CLASS_PKMN_BREEDER,      FEMALE},\n    {OBJ_EVENT_GFX_POKEMON_RANGER_M, FACILITY_CLASS_PKMN_RANGER_M,       MALE},\n    {OBJ_EVENT_GFX_POKEMON_RANGER_F, FACILITY_CLASS_PKMN_RANGER_F,     FEMALE},\n    {OBJ_EVENT_GFX_AROMA_LADY,     FACILITY_CLASS_AROMA_LADY,        FEMALE},\n    {OBJ_EVENT_GFX_RUIN_MANIAC,    FACILITY_CLASS_RUIN_MANIAC,         MALE},\n    {OBJ_EVENT_GFX_LADY,           FACILITY_CLASS_LADY,              FEMALE},\n    {OBJ_EVENT_GFX_PAINTER,        FACILITY_CLASS_PAINTER,           FEMALE}\n};\n\nstatic const struct DoublesTrainerInfo sDoubleBattleTrainerInfo[] = {\n    {OBJ_EVENT_GFX_BEAUTY,         OBJ_EVENT_GFX_WOMAN_1,        FACILITY_CLASS_SR_AND_JR,       FEMALE, FEMALE},\n    {OBJ_EVENT_GFX_LITTLE_GIRL,    OBJ_EVENT_GFX_LITTLE_GIRL,    FACILITY_CLASS_RS_TWINS,        FEMALE, FEMALE},\n    {OBJ_EVENT_GFX_BEAUTY,         OBJ_EVENT_GFX_MAN,            FACILITY_CLASS_RS_YOUNG_COUPLE, FEMALE,   MALE},\n    {OBJ_EVENT_GFX_OLD_MAN_1,      OBJ_EVENT_GFX_OLD_WOMAN,      FACILITY_CLASS_OLD_COUPLE,        MALE, FEMALE},\n    {OBJ_EVENT_GFX_TUBER_M_LAND,   OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_RS_SIS_AND_BRO,    MALE, FEMALE},\n    {OBJ_EVENT_GFX_LITTLE_GIRL,    OBJ_EVENT_GFX_LITTLE_GIRL,    FACILITY_CLASS_TWINS,           FEMALE, FEMALE},\n    {OBJ_EVENT_GFX_COOLTRAINER_M,  OBJ_EVENT_GFX_COOLTRAINER_F,  FACILITY_CLASS_COOL_COUPLE,       MALE, FEMALE},\n    {OBJ_EVENT_GFX_YOUNG_COUPLE_F, OBJ_EVENT_GFX_YOUNG_COUPLE_M, FACILITY_CLASS_YOUNG_COUPLE,    FEMALE,   MALE},\n    {OBJ_EVENT_GFX_BATTLE_GIRL,    OBJ_EVENT_GFX_BLACKBELT,      FACILITY_CLASS_CRUSH_KIN,       FEMALE,   MALE},\n    {OBJ_EVENT_GFX_SWIMMER_F_LAND, OBJ_EVENT_GFX_TUBER_M_LAND,   FACILITY_CLASS_SIS_AND_BRO,     FEMALE,   MALE}\n};\n\nstatic const struct TrainerEncounterMusicPairs sTrainerEncounterMusicLUT[105] = {\n    {FACILITY_CLASS_RS_AROMA_LADY,          TRAINER_ENCOUNTER_MUSIC_AQUA},\n    {FACILITY_CLASS_BOARDER_F,              TRAINER_ENCOUNTER_MUSIC_AQUA},\n    {FACILITY_CLASS_AQUA_GRUNT_F,           TRAINER_ENCOUNTER_MUSIC_AQUA},\n    {FACILITY_CLASS_GAMER,                  TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_RS_RUIN_MANIAC,         TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_RS_YOUNGSTER,           TRAINER_ENCOUNTER_MUSIC_INTENSE},\n    {FACILITY_CLASS_RS_YOUNG_COUPLE,        TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_RS_FISHERMAN,           TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_RUNNING_TRIATHLETE_F,   TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_RS_PKMN_RANGER_M,       TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_LEADER_BRAWLY,          TRAINER_ENCOUNTER_MUSIC_TWINS},\n    {FACILITY_CLASS_RS_SIS_AND_BRO,         TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_MAGMA_LEADER_MAXIE,     TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_POKEFAN_F,              TRAINER_ENCOUNTER_MUSIC_INTENSE},\n    {FACILITY_CLASS_RS_PKMN_RANGER_F,       TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_PSYCHIC_M,              TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_PICNICKER,              TRAINER_ENCOUNTER_MUSIC_COOL},\n    {FACILITY_CLASS_ELITE_FOUR_GLACIA,      TRAINER_ENCOUNTER_MUSIC_COOL},\n    {FACILITY_CLASS_RS_COOLTRAINER_F,       TRAINER_ENCOUNTER_MUSIC_COOL},\n    {FACILITY_CLASS_GUITARIST,              TRAINER_ENCOUNTER_MUSIC_INTENSE},\n    {FACILITY_CLASS_RS_BUG_CATCHER,         TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_PKMN_TRAINER_BRENDAN_3, TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_RUNNING_TRIATHLETE_M,   TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_CAMPER,                 TRAINER_ENCOUNTER_MUSIC_TWINS},\n    {FACILITY_CLASS_CYCLING_TRIATHLETE_F,   TRAINER_ENCOUNTER_MUSIC_TWINS},\n    {FACILITY_CLASS_RS_TUBER_F,             TRAINER_ENCOUNTER_MUSIC_INTERVIEWER},\n    {FACILITY_CLASS_BEAUTY,                 TRAINER_ENCOUNTER_MUSIC_HIKER},\n    {FACILITY_CLASS_INTERVIEWER,            TRAINER_ENCOUNTER_MUSIC_HIKER},\n    {FACILITY_CLASS_YOUNGSTER,              TRAINER_ENCOUNTER_MUSIC_RICH},\n    {FACILITY_CLASS_RS_PSYCHIC_F,           TRAINER_ENCOUNTER_MUSIC_RICH},\n    {FACILITY_CLASS_MAGMA_GRUNT_F,          TRAINER_ENCOUNTER_MUSIC_SWIMMER},\n    {FACILITY_CLASS_RS_SWIMMER_M,           TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_PKMN_TRAINER_MAY_3,     TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_RS_POKEMANIAC,          TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_SUPER_NERD,             TRAINER_ENCOUNTER_MUSIC_INTENSE},\n    {FACILITY_CLASS_ENGINEER,               TRAINER_ENCOUNTER_MUSIC_INTENSE},\n    {FACILITY_CLASS_MAGMA_ADMIN_F,          TRAINER_ENCOUNTER_MUSIC_INTENSE},\n    {FACILITY_CLASS_RS_BLACK_BELT,          TRAINER_ENCOUNTER_MUSIC_INTENSE},\n    {FACILITY_CLASS_LEADER_FLANNERY,        TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_RS_SAILOR,              TRAINER_ENCOUNTER_MUSIC_INTENSE},\n    {FACILITY_CLASS_SAILOR,                 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_BUG_MANIAC,             TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_PKMN_TRAINER_MAY,       TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_RS_CAMPER,              TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_KINDLER,                TRAINER_ENCOUNTER_MUSIC_HIKER},\n    {FACILITY_CLASS_BATTLE_GIRL,            TRAINER_ENCOUNTER_MUSIC_MAGMA},\n    {FACILITY_CLASS_COLLECTOR,              TRAINER_ENCOUNTER_MUSIC_MAGMA},\n    {FACILITY_CLASS_NINJA_BOY,              TRAINER_ENCOUNTER_MUSIC_MAGMA},\n    {FACILITY_CLASS_PKMN_TRAINER_BRENDAN_2, TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_PARASOL_LADY,           TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_AQUA_ADMIN_F,           TRAINER_ENCOUNTER_MUSIC_HIKER},\n    {FACILITY_CLASS_PKMN_TRAINER_BRENDAN,   TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_RS_SWIMMER_F,           TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_EXPERT_F,               TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_RICH_BOY,               TRAINER_ENCOUNTER_MUSIC_RICH},\n    {FACILITY_CLASS_HEX_MANIAC,             TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_RS_HIKER,               TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_RS_BEAUTY,              TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_SWIMMER_F,              TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_RS_LADY,                TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_CHAMPION_STEVEN,        TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_PKMN_TRAINER_MAY_2,     TRAINER_ENCOUNTER_MUSIC_GIRL},\n    {FACILITY_CLASS_CYCLING_TRIATHLETE_M,   TRAINER_ENCOUNTER_MUSIC_GIRL},\n    {FACILITY_CLASS_SWIMMER_M,              TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_DRAGON_TAMER,           TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_BIKER,                  TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_SWIMMING_TRIATHLETE_M,  TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_CUE_BALL,               TRAINER_ENCOUNTER_MUSIC_COOL},\n    {FACILITY_CLASS_RS_BIRD_KEEPER,         TRAINER_ENCOUNTER_MUSIC_COOL},\n    {FACILITY_CLASS_SWIMMING_TRIATHLETE_F,  TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_POKEMANIAC,             TRAINER_ENCOUNTER_MUSIC_GIRL},\n    {FACILITY_CLASS_RS_TWINS,               TRAINER_ENCOUNTER_MUSIC_GIRL},\n    {FACILITY_CLASS_LEADER_WATTSON,         TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_BUG_CATCHER,            TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_RS_PKMN_BREEDER_M,      TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_LEADER_WALLACE,         TRAINER_ENCOUNTER_MUSIC_AQUA},\n    {FACILITY_CLASS_LEADER_NORMAN,          TRAINER_ENCOUNTER_MUSIC_AQUA},\n    {FACILITY_CLASS_OLD_COUPLE,             TRAINER_ENCOUNTER_MUSIC_INTENSE},\n    {FACILITY_CLASS_RS_PSYCHIC_M,           TRAINER_ENCOUNTER_MUSIC_INTENSE},\n    {FACILITY_CLASS_LEADER_ROXANNE,         TRAINER_ENCOUNTER_MUSIC_TWINS},\n    {FACILITY_CLASS_ELITE_FOUR_DRAKE,       TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR},\n    {FACILITY_CLASS_RS_GENTLEMAN,           TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_RS_LASS,                TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS},\n    {FACILITY_CLASS_BURGLAR,                TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_PKMN_TRAINER_WALLY,     TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_SCHOOL_KID_M,           TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_LEADER_TATE_AND_LIZA,   TRAINER_ENCOUNTER_MUSIC_INTENSE},\n    {FACILITY_CLASS_POKEFAN_M,              TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_MAGMA_ADMIN_M,          TRAINER_ENCOUNTER_MUSIC_COOL},\n    {FACILITY_CLASS_EXPERT_M,               TRAINER_ENCOUNTER_MUSIC_COOL},\n    {FACILITY_CLASS_MAGMA_GRUNT_M,          TRAINER_ENCOUNTER_MUSIC_HIKER},\n    {FACILITY_CLASS_SR_AND_JR,              TRAINER_ENCOUNTER_MUSIC_HIKER},\n    {FACILITY_CLASS_LASS,                   TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_SCHOOL_KID_F,           TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_RS_COOLTRAINER_M,       TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_FISHERMAN,              TRAINER_ENCOUNTER_MUSIC_GIRL},\n    {FACILITY_CLASS_RS_TUBER_M,             TRAINER_ENCOUNTER_MUSIC_GIRL},\n    {FACILITY_CLASS_HIKER,                  TRAINER_ENCOUNTER_MUSIC_SWIMMER},\n    {FACILITY_CLASS_BOARDER_M,              TRAINER_ENCOUNTER_MUSIC_SWIMMER},\n    {FACILITY_CLASS_RS_PKMN_BREEDER_F,      TRAINER_ENCOUNTER_MUSIC_HIKER},\n    {FACILITY_CLASS_RS_PICNICKER,           TRAINER_ENCOUNTER_MUSIC_HIKER},\n    {FACILITY_CLASS_LEADER_WINONA,          TRAINER_ENCOUNTER_MUSIC_MALE},\n    {FACILITY_CLASS_ELITE_FOUR_SIDNEY,      TRAINER_ENCOUNTER_MUSIC_FEMALE},\n    {FACILITY_CLASS_AQUA_ADMIN_M,           TRAINER_ENCOUNTER_MUSIC_HIKER},\n    {FACILITY_CLASS_ELITE_FOUR_PHOEBE,      TRAINER_ENCOUNTER_MUSIC_MALE}\n};\n\nstatic const struct WindowTemplate sTimeBoardWindowTemplate[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 1,\n        .width = 27,\n        .height = 18,\n        .paletteNum = 15,\n        .baseBlock = 0x001\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const u32 sUnusedValue = 112;\n\nstatic const u8 sTextColors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY};\n\nstatic void (*const sTrainerTowerFunctions[])(void) = {\n    [TRAINER_TOWER_FUNC_INIT_FLOOR]             = InitTrainerTowerFloor,\n    [TRAINER_TOWER_FUNC_GET_SPEECH]             = BufferTowerOpponentSpeech,\n    [TRAINER_TOWER_FUNC_DO_BATTLE]              = DoTrainerTowerBattle,\n    [TRAINER_TOWER_FUNC_GET_CHALLENGE_TYPE]     = TrainerTowerGetChallengeType,\n    [TRAINER_TOWER_FUNC_CLEARED_FLOOR]          = TrainerTowerAddFloorCleared,\n    [TRAINER_TOWER_FUNC_GET_FLOOR_CLEARED]      = GetFloorAlreadyCleared,\n    [TRAINER_TOWER_FUNC_START_CHALLENGE]        = StartTrainerTowerChallenge,\n    [TRAINER_TOWER_FUNC_GET_OWNER_STATE]        = GetOwnerState,\n    [TRAINER_TOWER_FUNC_GIVE_PRIZE]             = GiveChallengePrize,\n    [TRAINER_TOWER_FUNC_CHECK_FINAL_TIME]       = CheckFinalTime,\n    [TRAINER_TOWER_FUNC_RESUME_TIMER]           = TrainerTowerResumeTimer,\n    [TRAINER_TOWER_FUNC_SET_LOST]               = TrainerTowerSetPlayerLost,\n    [TRAINER_TOWER_FUNC_GET_CHALLENGE_STATUS]   = GetTrainerTowerChallengeStatus,\n    [TRAINER_TOWER_FUNC_GET_TIME]               = GetCurrentTime,\n    [TRAINER_TOWER_FUNC_SHOW_RESULTS]           = ShowResultsBoard,\n    [TRAINER_TOWER_FUNC_CLOSE_RESULTS]          = CloseResultsBoard,\n    [TRAINER_TOWER_FUNC_CHECK_DOUBLES]          = TrainerTowerGetDoublesEligiblity,\n    [TRAINER_TOWER_FUNC_GET_NUM_FLOORS]         = TrainerTowerGetNumFloors,\n    [TRAINER_TOWER_FUNC_SHOULD_WARP_TO_COUNTER] = ShouldWarpToCounter,\n    [TRAINER_TOWER_FUNC_ENCOUNTER_MUSIC]        = PlayTrainerTowerEncounterMusic,\n    [TRAINER_TOWER_FUNC_GET_BEAT_CHALLENGE]     = HasSpokenToOwner\n};\n\n// - 1 excludes Mixed challenge, which just uses one of the 3 other types\nstatic const u16 sFloorLayouts[MAX_TRAINER_TOWER_FLOORS][NUM_TOWER_CHALLENGE_TYPES - 1] = {\n    {LAYOUT_TRAINER_TOWER_1F, LAYOUT_TRAINER_TOWER_1F_DOUBLES, LAYOUT_TRAINER_TOWER_1F_KNOCKOUT},\n    {LAYOUT_TRAINER_TOWER_2F, LAYOUT_TRAINER_TOWER_2F_DOUBLES, LAYOUT_TRAINER_TOWER_2F_KNOCKOUT},\n    {LAYOUT_TRAINER_TOWER_3F, LAYOUT_TRAINER_TOWER_3F_DOUBLES, LAYOUT_TRAINER_TOWER_3F_KNOCKOUT},\n    {LAYOUT_TRAINER_TOWER_4F, LAYOUT_TRAINER_TOWER_4F_DOUBLES, LAYOUT_TRAINER_TOWER_4F_KNOCKOUT},\n    {LAYOUT_TRAINER_TOWER_5F, LAYOUT_TRAINER_TOWER_5F_DOUBLES, LAYOUT_TRAINER_TOWER_5F_KNOCKOUT},\n    {LAYOUT_TRAINER_TOWER_6F, LAYOUT_TRAINER_TOWER_6F_DOUBLES, LAYOUT_TRAINER_TOWER_6F_KNOCKOUT},\n    {LAYOUT_TRAINER_TOWER_7F, LAYOUT_TRAINER_TOWER_7F_DOUBLES, LAYOUT_TRAINER_TOWER_7F_KNOCKOUT},\n    {LAYOUT_TRAINER_TOWER_8F, LAYOUT_TRAINER_TOWER_8F_DOUBLES, LAYOUT_TRAINER_TOWER_8F_KNOCKOUT}\n};\n\nstatic const u16 sPrizeList[] = {\n    ITEM_HP_UP,\n    ITEM_PROTEIN,\n    ITEM_IRON,\n    ITEM_CARBOS,\n    ITEM_CALCIUM,\n    ITEM_ZINC,\n    ITEM_BRIGHT_POWDER,\n    ITEM_WHITE_HERB,\n    ITEM_MENTAL_HERB,\n    ITEM_CHOICE_BAND,\n    ITEM_KINGS_ROCK,\n    ITEM_SCOPE_LENS,\n    ITEM_METAL_COAT,\n    ITEM_DRAGON_SCALE,\n    ITEM_UP_GRADE\n};\n\nstatic const u16 sTrainerTowerEncounterMusic[] = {\n    [TRAINER_ENCOUNTER_MUSIC_MALE]        = MUS_ENCOUNTER_BOY,\n    [TRAINER_ENCOUNTER_MUSIC_FEMALE]      = MUS_ENCOUNTER_GIRL,\n    [TRAINER_ENCOUNTER_MUSIC_GIRL]        = MUS_ENCOUNTER_GIRL,\n    [TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS]  = MUS_ENCOUNTER_ROCKET,\n    [TRAINER_ENCOUNTER_MUSIC_INTENSE]     = MUS_ENCOUNTER_BOY,\n    [TRAINER_ENCOUNTER_MUSIC_COOL]        = MUS_ENCOUNTER_BOY,\n    [TRAINER_ENCOUNTER_MUSIC_AQUA]        = MUS_ENCOUNTER_ROCKET,\n    [TRAINER_ENCOUNTER_MUSIC_MAGMA]       = MUS_ENCOUNTER_ROCKET,\n    [TRAINER_ENCOUNTER_MUSIC_SWIMMER]     = MUS_ENCOUNTER_BOY,\n    [TRAINER_ENCOUNTER_MUSIC_TWINS]       = MUS_ENCOUNTER_GIRL,\n    [TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR]  = MUS_ENCOUNTER_BOY,\n    [TRAINER_ENCOUNTER_MUSIC_HIKER]       = MUS_ENCOUNTER_BOY,\n    [TRAINER_ENCOUNTER_MUSIC_INTERVIEWER] = MUS_ENCOUNTER_BOY,\n    [TRAINER_ENCOUNTER_MUSIC_RICH]        = MUS_ENCOUNTER_BOY\n};\n\n// The trainer only uses two Pokemon from the encoded pool, based on the current floor\nstatic const u8 sSingleBattleChallengeMonIdxs[MAX_TRAINER_TOWER_FLOORS][2] = {\n    {0, 2},\n    {1, 3},\n    {2, 4},\n    {3, 5},\n    {4, 1},\n    {5, 2},\n    {0, 3},\n    {1, 4}\n};\n\n// Each trainer only uses one Pokemon from the encoded pool, based on the current floor\nstatic const u8 sDoubleBattleChallengeMonIdxs[MAX_TRAINER_TOWER_FLOORS][2] = {\n    {0, 1},\n    {1, 3},\n    {2, 0},\n    {3, 4},\n    {4, 2},\n    {5, 2},\n    {0, 3},\n    {1, 5}\n};\n\n// Each trainer only uses one Pokemon from the encoded pool, based on the current floor\nstatic const u8 sKnockoutChallengeMonIdxs[MAX_TRAINER_TOWER_FLOORS][3] = {\n    {0, 2, 4},\n    {1, 3, 5},\n    {2, 3, 1},\n    {3, 4, 0},\n    {4, 1, 2},\n    {5, 0, 3},\n    {0, 5, 2},\n    {1, 4, 5}\n};\n\nextern const struct EReaderTrainerTowerSetSubstruct gTrainerTowerLocalHeader;\nextern const struct TrainerTowerFloor *const gTrainerTowerFloors[][MAX_TRAINER_TOWER_FLOORS];\n\nvoid CallTrainerTowerFunc(void)\n{\n    SetUpTrainerTowerDataStruct();\n    sTrainerTowerFunctions[gSpecialVar_0x8004]();\n    FreeTrainerTowerDataStruct();\n}\n\nu8 GetTrainerTowerOpponentClass(void)\n{\n    return gFacilityClassToTrainerClass[sTrainerTowerOpponent->facilityClass];\n}\n\nvoid GetTrainerTowerOpponentName(u8 *dest)\n{\n    StringCopyN(dest, sTrainerTowerOpponent->name, 11);\n}\n\nu8 GetTrainerTowerTrainerFrontSpriteId(void)\n{\n    return gFacilityClassToPicIndex[sTrainerTowerOpponent->facilityClass];\n}\n\nvoid InitTrainerTowerBattleStruct(void)\n{\n    u16 trainerId;\n    int i;\n\n    SetUpTrainerTowerDataStruct();\n    sTrainerTowerOpponent = AllocZeroed(sizeof(*sTrainerTowerOpponent));\n    trainerId = VarGet(VAR_TEMP_1);\n    StringCopyN(sTrainerTowerOpponent->name, CURR_FLOOR.trainers[trainerId].name, 11);\n\n    for (i = 0; i < 6; i++)\n    {\n        sTrainerTowerOpponent->speechWin[i] = CURR_FLOOR.trainers[trainerId].speechWin[i];\n        sTrainerTowerOpponent->speechLose[i] = CURR_FLOOR.trainers[trainerId].speechLose[i];\n\n        if (CURR_FLOOR.challengeType == CHALLENGE_TYPE_DOUBLE)\n        {\n            sTrainerTowerOpponent->speechWin2[i] = CURR_FLOOR.trainers[trainerId + 1].speechWin[i];\n            sTrainerTowerOpponent->speechLose2[i] = CURR_FLOOR.trainers[trainerId + 1].speechLose[i];\n        }\n    }\n\n    sTrainerTowerOpponent->battleType = CURR_FLOOR.challengeType;\n    sTrainerTowerOpponent->facilityClass = CURR_FLOOR.trainers[trainerId].facilityClass;\n    sTrainerTowerOpponent->textColor = CURR_FLOOR.trainers[trainerId].textColor;\n    SetVBlankCounter1Ptr(&TRAINER_TOWER.timer);\n    FreeTrainerTowerDataStruct();\n}\n\nvoid FreeTrainerTowerBattleStruct(void)\n{\n    FREE_AND_SET_NULL(sTrainerTowerOpponent);\n}\n\nvoid GetTrainerTowerOpponentWinText(u8 *dest, u8 opponentIdx)\n{\n    VarSet(VAR_TEMP_3, opponentIdx);\n    TrainerTowerGetOpponentTextColor(sTrainerTowerOpponent->battleType, sTrainerTowerOpponent->facilityClass);\n    if (opponentIdx == 0)\n        TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechWin, dest);\n    else\n        TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechWin2, dest);\n}\n\nvoid GetTrainerTowerOpponentLoseText(u8 *dest, u8 opponentIdx)\n{\n    VarSet(VAR_TEMP_3, opponentIdx);\n    TrainerTowerGetOpponentTextColor(sTrainerTowerOpponent->battleType, sTrainerTowerOpponent->facilityClass);\n    if (opponentIdx == 0)\n        TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechLose, dest);\n    else\n        TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechLose2, dest);\n}\n\nstatic void SetUpTrainerTowerDataStruct(void)\n{\n    u32 challengeType = gSaveBlock1Ptr->towerChallengeId;\n    s32 i;\n    const struct TrainerTowerFloor *const * floors_p;\n\n    sTrainerTowerState = AllocZeroed(sizeof(*sTrainerTowerState));\n    sTrainerTowerState->floorIdx = gMapHeader.mapLayoutId - LAYOUT_TRAINER_TOWER_1F;\n    if (ReadTrainerTowerAndValidate() == TRUE)\n        CEReaderTool_LoadTrainerTower(&sTrainerTowerState->data);\n    else\n    {\n        struct TrainerTowerState * ttstate_p = sTrainerTowerState;\n        const struct EReaderTrainerTowerSetSubstruct * header_p = &gTrainerTowerLocalHeader;\n        memcpy(&ttstate_p->data, header_p, sizeof(struct EReaderTrainerTowerSetSubstruct));\n        floors_p = gTrainerTowerFloors[challengeType];\n        for (i = 0; i < MAX_TRAINER_TOWER_FLOORS; i++)\n        {\n            *(sTrainerTowerState->data.floors + i) = *(floors_p[i]); // manual pointer arithmetic needed to match\n        }\n        sTrainerTowerState->data.checksum = CalcByteArraySum((void *)sTrainerTowerState->data.floors, sizeof(sTrainerTowerState->data.floors));\n        ValidateOrResetCurTrainerTowerRecord();\n    }\n}\n\nstatic void FreeTrainerTowerDataStruct(void)\n{\n    FREE_AND_SET_NULL(sTrainerTowerState);\n}\n\nstatic void InitTrainerTowerFloor(void)\n{\n    if (gMapHeader.mapLayoutId - LAYOUT_TRAINER_TOWER_LOBBY > sTrainerTowerState->data.numFloors)\n    {\n        gSpecialVar_Result = 3; // Skip past usable challenge types\n        SetCurrentMapLayout(LAYOUT_TRAINER_TOWER_ROOF);\n    }\n    else\n    {\n        gSpecialVar_Result = CURR_FLOOR.challengeType;\n        SetCurrentMapLayout(sFloorLayouts[sTrainerTowerState->floorIdx][gSpecialVar_Result]);\n        SetTrainerTowerNPCGraphics();\n    }\n}\n\nstatic void SetTrainerTowerNPCGraphics(void)\n{\n    s32 i, j;\n    u8 trainerGfx1, trainerGfx2, facilityClass;\n    switch (CURR_FLOOR.challengeType)\n    {\n    case CHALLENGE_TYPE_SINGLE:\n        facilityClass = CURR_FLOOR.trainers[0].facilityClass;\n        for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++)\n        {\n            if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass)\n                break;\n        }\n\n        if (i != NELEMS(sSingleBattleTrainerInfo))\n            trainerGfx1 = sSingleBattleTrainerInfo[i].objGfx;\n        else\n            trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER;\n\n        VarSet(VAR_OBJ_GFX_ID_1, trainerGfx1);\n        break;\n    case CHALLENGE_TYPE_DOUBLE:\n        facilityClass = CURR_FLOOR.trainers[0].facilityClass;\n        for (i = 0; i < NELEMS(sDoubleBattleTrainerInfo); i++)\n        {\n            if (sDoubleBattleTrainerInfo[i].facilityClass == facilityClass)\n                break;\n        }\n        if (i != NELEMS(sDoubleBattleTrainerInfo))\n        {\n            trainerGfx1  = sDoubleBattleTrainerInfo[i].objGfx1;\n            trainerGfx2 = sDoubleBattleTrainerInfo[i].objGfx2;\n        }\n        else\n        {\n            trainerGfx1  = OBJ_EVENT_GFX_YOUNGSTER;\n            trainerGfx2 = OBJ_EVENT_GFX_YOUNGSTER;\n        }\n        VarSet(VAR_OBJ_GFX_ID_0, trainerGfx1);\n        VarSet(VAR_OBJ_GFX_ID_3, trainerGfx2);\n        break;\n    case CHALLENGE_TYPE_KNOCKOUT:\n        for (j = 0; j < MAX_TRAINERS_PER_FLOOR; j++)\n        {\n            facilityClass = CURR_FLOOR.trainers[j].facilityClass;\n            for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++)\n            {\n                if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass)\n                    break;\n            }\n\n            if (i != NELEMS(sSingleBattleTrainerInfo))\n                trainerGfx1 = sSingleBattleTrainerInfo[i].objGfx;\n            else\n                trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER;\n\n            switch (j)\n            {\n            case 0:\n                VarSet(VAR_OBJ_GFX_ID_2, trainerGfx1);\n                break;\n            case 1:\n                VarSet(VAR_OBJ_GFX_ID_0, trainerGfx1);\n                break;\n            case 2:\n                VarSet(VAR_OBJ_GFX_ID_1, trainerGfx1);\n                break;\n            }\n        }\n    }\n}\n\nstatic void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest)\n{\n    s32 i;\n    ConvertEasyChatWordsToString(dest, ecWords, 3, 2);\n    if ((unsigned)GetStringWidth(FONT_NORMAL, dest, -1) > 196)\n    {\n        // Has to be printed 2x3\n        ConvertEasyChatWordsToString(dest, ecWords, 2, 3);\n        // Skip line 1\n        i = 0;\n        while (dest[i++] != CHAR_NEWLINE)\n            ;\n        // Skip line 2\n        while (dest[i] != CHAR_NEWLINE)\n            i++;\n        // Replace \\n with \\l at the end of line 2\n        dest[i] = CHAR_PROMPT_SCROLL;\n    }\n}\n\nstatic void BufferTowerOpponentSpeech(void)\n{\n    u16 trainerId = gSpecialVar_0x8006;\n    u8 facilityClass;\n    u8 challengeType = CURR_FLOOR.challengeType;\n    \n    if (challengeType != CHALLENGE_TYPE_DOUBLE)\n        facilityClass = CURR_FLOOR.trainers[trainerId].facilityClass;\n    else\n        facilityClass = CURR_FLOOR.trainers[0].facilityClass;\n\n    switch (gSpecialVar_0x8005)\n    {\n    case TRAINER_TOWER_TEXT_INTRO:\n        TrainerTowerGetOpponentTextColor(challengeType, facilityClass);\n        TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechBefore, gStringVar4);\n        break;\n    case TRAINER_TOWER_TEXT_PLAYER_LOST:\n        TrainerTowerGetOpponentTextColor(challengeType, facilityClass);\n        TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechWin, gStringVar4);\n        break;\n    case TRAINER_TOWER_TEXT_PLAYER_WON:\n        TrainerTowerGetOpponentTextColor(challengeType, facilityClass);\n        TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechLose, gStringVar4);\n        break;\n    case TRAINER_TOWER_TEXT_AFTER:\n        TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechAfter, gStringVar4);\n        break;\n    }\n}\n\nstatic void TrainerTowerGetOpponentTextColor(u8 challengeType, u8 facilityClass)\n{\n    u16 gender = MALE;\n    int i;\n    switch (challengeType)\n    {\n    case CHALLENGE_TYPE_SINGLE:\n    case CHALLENGE_TYPE_KNOCKOUT:\n        for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++)\n        {\n            if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass)\n                break;\n        }\n        if (i != NELEMS(sSingleBattleTrainerInfo))\n            gender = sSingleBattleTrainerInfo[i].gender;\n        break;\n    case CHALLENGE_TYPE_DOUBLE:\n        for (i = 0; i < NELEMS(sDoubleBattleTrainerInfo); i++)\n        {\n            if (sDoubleBattleTrainerInfo[i].facilityClass == facilityClass)\n                break;\n        }\n        if (i != NELEMS(sDoubleBattleTrainerInfo))\n        {\n            if (VarGet(VAR_TEMP_3))\n                gender = sDoubleBattleTrainerInfo[i].gender2;\n            else\n                gender = sDoubleBattleTrainerInfo[i].gender1;\n        }\n        break;\n    }\n    gSpecialVar_PrevTextColor = gSpecialVar_TextColor;\n    gSpecialVar_TextColor = gender;\n}\n\nstatic void CB2_EndTrainerTowerBattle(void)\n{\n    SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n}\n\nstatic void Task_DoTrainerTowerBattle(u8 taskId)\n{\n    if (IsBattleTransitionDone() == TRUE)\n    {\n        gMain.savedCallback = CB2_EndTrainerTowerBattle;\n        CleanupOverworldWindowsAndTilemaps();\n        SetMainCallback2(CB2_InitBattle);\n        DestroyTask(taskId);\n    }\n}\n\nstatic void DoTrainerTowerBattle(void)\n{\n    gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_TRAINER_TOWER;\n\n    if (CURR_FLOOR.challengeType == CHALLENGE_TYPE_DOUBLE)\n        gBattleTypeFlags |= BATTLE_TYPE_DOUBLE;\n\n    gTrainerBattleOpponent_A = 0;\n    BuildEnemyParty();\n    CreateTask(Task_DoTrainerTowerBattle, 1);\n    PlayMapChosenOrBattleBGM(0);\n    BattleTransition_StartOnField(BattleSetup_GetBattleTowerBattleTransition());\n}\n\nstatic void TrainerTowerGetChallengeType(void)\n{\n    if (!gSpecialVar_0x8005)\n        gSpecialVar_Result = CURR_FLOOR.challengeType;\n}\n\nstatic void TrainerTowerAddFloorCleared(void)\n{\n    TRAINER_TOWER.floorsCleared++;\n}\n\n// So the player can safely go back through defeated floors to use the Poke Center (or exit challenge)\nstatic void GetFloorAlreadyCleared(void)\n{\n    u16 mapLayoutId = gMapHeader.mapLayoutId;\n    if (mapLayoutId - LAYOUT_TRAINER_TOWER_1F == TRAINER_TOWER.floorsCleared \n     && mapLayoutId - LAYOUT_TRAINER_TOWER_LOBBY <= CURR_FLOOR.floorIdx)\n        gSpecialVar_Result = FALSE;\n    else\n        gSpecialVar_Result = TRUE;\n}\n\nstatic void StartTrainerTowerChallenge(void)\n{\n    gSaveBlock1Ptr->towerChallengeId = gSpecialVar_0x8005;\n    if (gSaveBlock1Ptr->towerChallengeId >= NUM_TOWER_CHALLENGE_TYPES)\n        gSaveBlock1Ptr->towerChallengeId = 0;\n    ValidateOrResetCurTrainerTowerRecord();\n    if (!ReadTrainerTowerAndValidate())\n        TRAINER_TOWER.validated = TRUE;\n    else\n        TRAINER_TOWER.validated = FALSE;\n    TRAINER_TOWER.floorsCleared = 0;\n    SetVBlankCounter1Ptr(&TRAINER_TOWER.timer);\n    TRAINER_TOWER.timer = 0;\n    TRAINER_TOWER.spokeToOwner = FALSE;\n    TRAINER_TOWER.checkedFinalTime = FALSE;\n}\n\nstatic void GetOwnerState(void)\n{\n    DisableVBlankCounter1();\n    gSpecialVar_Result = 0;\n\n    if (TRAINER_TOWER.spokeToOwner)\n        gSpecialVar_Result++;\n    if (TRAINER_TOWER.receivedPrize && TRAINER_TOWER.checkedFinalTime)\n        gSpecialVar_Result++;\n\n    TRAINER_TOWER.spokeToOwner = TRUE;\n}\n\nstatic void GiveChallengePrize(void)\n{\n    u16 itemId = sPrizeList[sTrainerTowerState->data.floors->prize];\n\n    if (TRAINER_TOWER.receivedPrize)\n    {\n        gSpecialVar_Result = 2;\n    }\n    else if (AddBagItem(itemId, 1) == TRUE)\n    {\n        CopyItemName(itemId, gStringVar2);\n        TRAINER_TOWER.receivedPrize = TRUE;\n        gSpecialVar_Result = 0;\n    }\n    else\n    {\n        gSpecialVar_Result = 1;\n    }\n}\n\nstatic void CheckFinalTime(void)\n{\n    if (TRAINER_TOWER.checkedFinalTime)\n    {\n        gSpecialVar_Result = 2;\n    }\n    else if (GetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime) > TRAINER_TOWER.timer)\n    {\n        SetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime, TRAINER_TOWER.timer);\n        gSpecialVar_Result = 0;\n    }\n    else\n    {\n        gSpecialVar_Result = 1;\n    }\n\n    TRAINER_TOWER.checkedFinalTime = TRUE;\n}\n\nstatic void TrainerTowerResumeTimer(void)\n{\n    if (!TRAINER_TOWER.spokeToOwner)\n    {\n        if (TRAINER_TOWER.timer >= TRAINER_TOWER_MAX_TIME)\n            TRAINER_TOWER.timer = TRAINER_TOWER_MAX_TIME;\n        else\n            SetVBlankCounter1Ptr(&TRAINER_TOWER.timer);\n    }\n}\n\nstatic void TrainerTowerSetPlayerLost(void)\n{\n    TRAINER_TOWER.hasLost = TRUE;\n}\n\nstatic void GetTrainerTowerChallengeStatus(void)\n{\n    if (TRAINER_TOWER.hasLost)\n    {\n        TRAINER_TOWER.hasLost = FALSE;\n        gSpecialVar_Result = CHALLENGE_STATUS_LOST;\n    }\n    else if (TRAINER_TOWER.unkA_4)\n    {\n        TRAINER_TOWER.unkA_4 = FALSE;\n        gSpecialVar_Result = CHALLENGE_STATUS_UNK;\n    }\n    else\n    {\n        gSpecialVar_Result = CHALLENGE_STATUS_NORMAL;\n    }\n}\n\n#define PRINT_TOWER_TIME(src) ({                                                           \\\n    s32 minutes, seconds, centiseconds, frames;                                            \\\n                                                                                           \\\n    frames = (src);                                                                        \\\n                                                                                           \\\n    minutes = frames / (60 * 60);                                                          \\\n    frames %= (60 * 60);                                                                   \\\n    seconds = frames / 60;                                                                 \\\n    frames %= 60;                                                                          \\\n    centiseconds = frames * 168 / 100;                                                     \\\n                                                                                           \\\n    ConvertIntToDecimalStringN(gStringVar1, minutes, STR_CONV_MODE_RIGHT_ALIGN, 2);        \\\n    ConvertIntToDecimalStringN(gStringVar2, seconds, STR_CONV_MODE_RIGHT_ALIGN, 2);        \\\n    ConvertIntToDecimalStringN(gStringVar3, centiseconds, STR_CONV_MODE_LEADING_ZEROS, 2); \\\n})\n\nstatic void GetCurrentTime(void)\n{\n    if (TRAINER_TOWER.timer >= TRAINER_TOWER_MAX_TIME)\n    {\n        DisableVBlankCounter1();\n        TRAINER_TOWER.timer = TRAINER_TOWER_MAX_TIME;\n    }\n\n    PRINT_TOWER_TIME(TRAINER_TOWER.timer);\n}\n\nstatic void ShowResultsBoard(void)\n{\n    u8 windowId;\n    s32 i;\n\n    ValidateOrResetCurTrainerTowerRecord();\n    windowId = AddWindow(sTimeBoardWindowTemplate);\n    LoadStdWindowFrameGfx();\n    DrawStdWindowFrame(windowId, FALSE);\n    AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_TimeBoard, 74, 0, TEXT_SKIP_DRAW, NULL);\n\n    for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++)\n    {\n        PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime));\n\n        StringExpandPlaceholders(gStringVar4, gText_XMinYZSec);\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, gTrainerTowerChallengeTypeTexts[i - 1], 24, 36 + 20 * i, TEXT_SKIP_DRAW, NULL);\n        AddTextPrinterParameterized(windowId, FONT_NORMAL, gStringVar4, 96, 46 + 20 * i, TEXT_SKIP_DRAW, NULL);\n    }\n\n    PutWindowTilemap(windowId);\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n    VarSet(VAR_TEMP_1, windowId);\n}\n\nstatic void CloseResultsBoard(void)\n{\n    u8 windowId = VarGet(VAR_TEMP_1);\n    ClearStdWindowAndFrameToTransparent(windowId, TRUE);\n    RemoveWindow(windowId);\n}\n\nstatic void TrainerTowerGetDoublesEligiblity(void)\n{\n    gSpecialVar_Result = GetMonsStateToDoubles();\n}\n\n\nstatic void TrainerTowerGetNumFloors(void)\n{\n    if (sTrainerTowerState->data.numFloors != sTrainerTowerState->data.floors[0].floorIdx)\n    {\n        ConvertIntToDecimalStringN(gStringVar1, sTrainerTowerState->data.numFloors, STR_CONV_MODE_LEFT_ALIGN, 1);\n        gSpecialVar_Result = TRUE;\n    }\n    else\n    {\n        gSpecialVar_Result = FALSE;\n    }\n}\n\n// Dummied? equivalent to gSpecialVar_Result = FALSE\n// If it were to return TRUE the player would be warped back to the lobby\nstatic void ShouldWarpToCounter(void)\n{\n    if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_TOWER_LOBBY && VarGet(VAR_MAP_SCENE_TRAINER_TOWER) == 0)\n        gSpecialVar_Result = FALSE;\n    else\n        gSpecialVar_Result = FALSE;\n}\n\nstatic void PlayTrainerTowerEncounterMusic(void)\n{\n    s32 i;\n    u16 idx = VarGet(VAR_TEMP_1);\n    u8 facilityClass = CURR_FLOOR.trainers[idx].facilityClass;\n\n    for (i = 0; i < NELEMS(sTrainerEncounterMusicLUT); i++)\n    {\n        if (sTrainerEncounterMusicLUT[i].facilityClass == gFacilityClassToTrainerClass[facilityClass])\n            break;\n    }\n\n    if (i != NELEMS(sTrainerEncounterMusicLUT))\n    {\n        idx = sTrainerEncounterMusicLUT[i].musicId;\n    }\n    else\n    {\n        idx = 0;\n    }\n    PlayNewMapMusic(sTrainerTowerEncounterMusic[idx]);\n}\n\nstatic void HasSpokenToOwner(void)\n{\n    gSpecialVar_Result = TRAINER_TOWER.spokeToOwner;\n}\n\nstatic void BuildEnemyParty(void)\n{\n    u16 trainerIdx = VarGet(VAR_TEMP_1);\n    s32 level = GetPartyMaxLevel();\n    u8 floorIdx = TRAINER_TOWER.floorsCleared;\n    s32 i;\n    u8 monIdx;\n\n    ZeroEnemyPartyMons();\n\n    switch (CURR_FLOOR.challengeType)\n    {\n    case CHALLENGE_TYPE_SINGLE:\n    default:\n        for (i = 0; i < 2; i++)\n        {\n            monIdx = sSingleBattleChallengeMonIdxs[floorIdx][i];\n            CURR_FLOOR.trainers[trainerIdx].mons[monIdx].level = level;\n            CreateBattleTowerMon(&gEnemyParty[i], &CURR_FLOOR.trainers[trainerIdx].mons[monIdx]);\n        }\n        break;\n    case CHALLENGE_TYPE_DOUBLE:\n        monIdx = sDoubleBattleChallengeMonIdxs[floorIdx][0];\n        CURR_FLOOR.trainers[0].mons[monIdx].level = level;\n        CreateBattleTowerMon(&gEnemyParty[0], &CURR_FLOOR.trainers[0].mons[monIdx]);\n\n        monIdx = sDoubleBattleChallengeMonIdxs[floorIdx][1];\n        CURR_FLOOR.trainers[1].mons[monIdx].level = level;\n        CreateBattleTowerMon(&gEnemyParty[1], &CURR_FLOOR.trainers[1].mons[monIdx]);\n        break;\n    case CHALLENGE_TYPE_KNOCKOUT:\n        monIdx = sKnockoutChallengeMonIdxs[floorIdx][trainerIdx];\n        CURR_FLOOR.trainers[trainerIdx].mons[monIdx].level = level;\n        CreateBattleTowerMon(&gEnemyParty[0], &CURR_FLOOR.trainers[trainerIdx].mons[monIdx]);\n        break;\n    }\n}\n\nstatic s32 GetPartyMaxLevel(void)\n{\n    s32 topLevel = 0;\n    s32 i;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) != 0 && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_EGG)\n        {\n            s32 currLevel = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL, NULL);\n            if (currLevel > topLevel)\n                topLevel = currLevel;\n        }\n    }\n\n    return topLevel;\n}\n\nstatic void ValidateOrResetCurTrainerTowerRecord(void)\n{\n    if (TRAINER_TOWER.unk9 != sTrainerTowerState->data.id)\n    {\n        TRAINER_TOWER.unk9 = sTrainerTowerState->data.id;\n        SetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime, TRAINER_TOWER_MAX_TIME);\n        TRAINER_TOWER.receivedPrize = FALSE;\n    }\n}\n\nvoid PrintTrainerTowerRecords(void)\n{\n    s32 i;\n    u8 windowId = 0;\n\n    SetUpTrainerTowerDataStruct();\n    FillWindowPixelRect(0, PIXEL_FILL(0), 0, 0, 216, 144);\n    ValidateOrResetCurTrainerTowerRecord();\n    AddTextPrinterParameterized3(0, FONT_NORMAL, 0x4a, 0, sTextColors, 0, gText_TimeBoard);\n\n    for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++)\n    {\n        PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&gSaveBlock1Ptr->trainerTower[i].bestTime));\n        StringExpandPlaceholders(gStringVar4, gText_XMinYZSec);\n        AddTextPrinterParameterized3(windowId, FONT_NORMAL, 0x18, 0x24 + 0x14 * i, sTextColors, 0, gTrainerTowerChallengeTypeTexts[i]);\n        AddTextPrinterParameterized3(windowId, FONT_NORMAL, 0x60, 0x24 + 0x14 * i, sTextColors, 0, gStringVar4);\n    }\n\n    PutWindowTilemap(windowId);\n    CopyWindowToVram(windowId, COPYWIN_FULL);\n    FreeTrainerTowerDataStruct();\n}\n\nstatic u32 GetTrainerTowerRecordTime(u32 *counter)\n{\n    return *counter ^ gSaveBlock2Ptr->encryptionKey;\n}\n\nstatic void SetTrainerTowerRecordTime(u32 *counter, u32 value)\n{\n    *counter = value ^ gSaveBlock2Ptr->encryptionKey;\n}\n\nvoid ResetTrainerTowerResults(void)\n{\n    s32 i;\n\n    for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++)\n    {\n        SetTrainerTowerRecordTime(&gSaveBlock1Ptr->trainerTower[i].bestTime, TRAINER_TOWER_MAX_TIME);\n    }\n}\n"
  },
  {
    "path": "src/trainer_tower_sets.c",
    "content": "#include \"global.h\"\n#include \"cereader_tool.h\"\n#include \"trainer_tower.h\"\n#include \"text.h\"\n#include \"constants/easy_chat.h\"\n#include \"constants/items.h\"\n#include \"constants/moves.h\"\n#include \"constants/trainer_tower.h\"\n#include \"constants/trainers.h\"\n\n// Dummy strings must be declared explicitly for the sake of modern gcc\n#define DUMMY_TOWER_MON(iv) {.hpIV = iv, .attackIV = iv, .defenseIV = iv, .speedIV = iv, .spAttackIV = iv, .spDefenseIV = iv, .nickname = _(\"$$$$$$$$$$\")}\n#define DUMMY_TOWER_TEAM(iv) {.name = _(\"\"), .textColor = 1, .speechBefore = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechWin = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechLose = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .speechAfter = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, .mons = {DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv), DUMMY_TOWER_MON(iv)}}\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Single_4 = {\n\t.id = 1,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_SINGLE,\n\t.prize = TTPRIZE_WHITE_HERB,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"COLE\"),\n\t\t\t.facilityClass = FACILITY_CLASS_YOUNGSTER,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_AHAHA, EC_WORD_YOU_RE, EC_WORD_NOT, EC_WORD_GOING, EC_WORD_ANYWHERE, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_ALL_RIGHT, EC_WORD_EXCL, EC_WORD_BYE_BYE, EC_WORD_EXCL, 0xFFFF, 0xFFFF},\n\t\t\t.speechLose = {EC_WORD_HIYAH, EC_WORD_EXCL_EXCL, EC_WORD_DONE, EC_WORD_IN, EC_WORD_TOTALLY, EC_WORD_EXCL_EXCL},\n\t\t\t.speechAfter = {EC_WORD_TCH, EC_WORD_TCH, EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, 0xFFFF, 0xFFFF},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RATICATE,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_SHOCK_WAVE, MOVE_HYPER_FANG, MOVE_SCARY_FACE, MOVE_ENDEAVOR},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 200,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"RATICATE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGMAR,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_FIRE_PUNCH, MOVE_SUNNY_DAY, MOVE_SMOG, MOVE_STRENGTH},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 210,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x56, // MALE HASTY\n\t\t\t\t\t.nickname = _(\"MAGMAR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGCARGO,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_FLAMETHROWER, MOVE_AMNESIA, MOVE_BODY_SLAM, MOVE_HARDEN},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 200,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 200,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x02, // FEMALE BRAVE\n\t\t\t\t\t.nickname = _(\"MAGCARGO\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PRIMEAPE,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_OVERHEAT, MOVE_SEISMIC_TOSS, MOVE_SWAGGER, MOVE_KARATE_CHOP},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 210,\n\t\t\t\t\t.spAttackEV = 200,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x87, // MALE TIMID\n\t\t\t\t\t.nickname = _(\"PRIMEAPE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GOLBAT,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_GIGA_DRAIN, MOVE_CONFUSE_RAY, MOVE_SLUDGE_BOMB, MOVE_MEAN_LOOK},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 200,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 110,\n\t\t\t\t\t.spAttackEV = 200,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x81, // MALE NAUGHTY\n\t\t\t\t\t.nickname = _(\"GOLBAT\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SLOWBRO,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_SUNNY_DAY, MOVE_YAWN, MOVE_FLAMETHROWER, MOVE_CONFUSION},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 210,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x11, // FEMALE QUIET\n\t\t\t\t\t.nickname = _(\"SLOWBRO\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00016aab\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Single_7 = {\n\t.id = 2,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_SINGLE,\n\t.prize = TTPRIZE_DRAGON_SCALE,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"JAC\"),\n\t\t\t.facilityClass = FACILITY_CLASS_BURGLAR,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_A, EC_MOVE2(THIEF), EC_WORD_EXCL, EC_WORD_GIVE_ME, EC_WORD_SOMETHING},\n\t\t\t.speechWin = {EC_WORD_YOU_VE, EC_WORD_GOT, EC_WORD_NOTHING, EC_WORD_THAT, EC_WORD_I, EC_WORD_WANT},\n\t\t\t.speechLose = {EC_WORD_EEK, EC_WORD_EXCL_EXCL, EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_I, EC_WORD_SURRENDER},\n\t\t\t.speechAfter = {EC_WORD_I, EC_WORD_WILL, EC_WORD_STOP, EC_WORD_BEING, EC_WORD_A, EC_MOVE2(THIEF)},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MEOWTH,\n\t\t\t\t\t.heldItem = ITEM_LIECHI_BERRY,\n\t\t\t\t\t.moves = {MOVE_SWAGGER, MOVE_SUBSTITUTE, MOVE_FAKE_OUT, MOVE_SLASH},\n\t\t\t\t\t.hpEV = 200,\n\t\t\t\t\t.attackEV = 110,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 200,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 138 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8A, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"MEOWTH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FLAREON,\n\t\t\t\t\t.heldItem = ITEM_PETAYA_BERRY,\n\t\t\t\t\t.moves = {MOVE_FLAMETHROWER, MOVE_BITE, MOVE_SAND_ATTACK, MOVE_FIRE_SPIN},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 200,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"FLAREON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PORYGON,\n\t\t\t\t\t.heldItem = ITEM_PETAYA_BERRY,\n\t\t\t\t\t.moves = {MOVE_TRI_ATTACK, MOVE_RECYCLE, MOVE_PSYBEAM, MOVE_CONVERSION_2},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 210,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 200,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // GENDERLESS RELAXED\n\t\t\t\t\t.nickname = _(\"PORYGON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CHANSEY,\n\t\t\t\t\t.heldItem = ITEM_LUCKY_PUNCH,\n\t\t\t\t\t.moves = {MOVE_FLAMETHROWER, MOVE_LIGHT_SCREEN, MOVE_BODY_SLAM, MOVE_MINIMIZE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x10, // FEMALE MILD\n\t\t\t\t\t.nickname = _(\"CHANSEY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FARFETCHD,\n\t\t\t\t\t.heldItem = ITEM_STICK,\n\t\t\t\t\t.moves = {MOVE_KNOCK_OFF, MOVE_SWORDS_DANCE, MOVE_FLY, MOVE_SAND_ATTACK},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 110,\n\t\t\t\t\t.otId = 133 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x85, // MALE IMPISH\n\t\t\t\t\t.nickname = _(\"FARFETCH'D\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MR_MIME,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_SUBSTITUTE, MOVE_SHOCK_WAVE, MOVE_LIGHT_SCREEN, MOVE_BRICK_BREAK},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 130 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x82, // MALE BOLD\n\t\t\t\t\t.nickname = _(\"MR. MIME\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00016456\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Single_Unused = {\n\t.id = 3,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_SINGLE,\n\t.prize = TTPRIZE_IRON,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"MILY\"),\n\t\t\t.facilityClass = FACILITY_CLASS_PSYCHIC_F,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_LOOK, EC_WORD_AT, EC_WORD_MY, EC_WORD_POKEMON, EC_MOVE2(SUPERPOWER), EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_ISN_T, EC_WORD_IT, EC_WORD_INCREDIBLE, EC_WORD_QUES, EC_WORD_POKEMON, EC_WORD_POWER},\n\t\t\t.speechLose = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_AN, EC_WORD_AWFUL, EC_MOVE(NIGHTMARE), EC_WORD_ELLIPSIS_EXCL},\n\t\t\t.speechAfter = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_A, EC_WORD_DREAM, EC_WORD_NOTHING, EC_WORD_MORE},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CHANSEY,\n\t\t\t\t\t.heldItem = ITEM_ORAN_BERRY,\n\t\t\t\t\t.moves = {MOVE_LIGHT_SCREEN, MOVE_EGG_BOMB, MOVE_MINIMIZE, MOVE_SECRET_POWER},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x08, // FEMALE IMPISH\n\t\t\t\t\t.nickname = _(\"CHANSEY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CLEFABLE,\n\t\t\t\t\t.heldItem = ITEM_ORAN_BERRY,\n\t\t\t\t\t.moves = {MOVE_METRONOME, MOVE_REFLECT, MOVE_SING, MOVE_POUND},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 200,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"CLEFABLE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TOGETIC,\n\t\t\t\t\t.heldItem = ITEM_ORAN_BERRY,\n\t\t\t\t\t.moves = {MOVE_METRONOME, MOVE_REFLECT, MOVE_SWEET_KISS, MOVE_PECK},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"TOGETIC\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TOGETIC,\n\t\t\t\t\t.heldItem = ITEM_ORAN_BERRY,\n\t\t\t\t\t.moves = {MOVE_METRONOME, MOVE_HIDDEN_POWER, MOVE_ATTRACT, MOVE_LIGHT_SCREEN},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x20, // MALE RELAXED\n\t\t\t\t\t.nickname = _(\"TOGETIC\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CHANSEY,\n\t\t\t\t\t.heldItem = ITEM_ORAN_BERRY,\n\t\t\t\t\t.moves = {MOVE_FLAMETHROWER, MOVE_SOFT_BOILED, MOVE_LIGHT_SCREEN, MOVE_SECRET_POWER},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x05, // FEMALE BOLD\n\t\t\t\t\t.nickname = _(\"CHANSEY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CLEFABLE,\n\t\t\t\t\t.heldItem = ITEM_ORAN_BERRY,\n\t\t\t\t\t.moves = {MOVE_REFLECT, MOVE_FLAMETHROWER, MOVE_SING, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 200,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0xC0, // MALE QUIET\n\t\t\t\t\t.nickname = _(\"CLEFABLE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x000164ec\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Double_5 = {\n\t.id = 4,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_DOUBLE,\n\t.prize = TTPRIZE_CHOICE_BAND,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"JOS & ANNE\"),\n\t\t\t.facilityClass = FACILITY_CLASS_COOL_COUPLE,\n\t\t\t.textColor = 7,\n\t\t\t.speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_LOSE, EC_WORD_TO, EC_WORD_YOU, EC_WORD_HERE},\n\t\t\t.speechWin = {EC_WORD_VERY, EC_WORD_WELL, EC_WORD_DONE, EC_WORD_EXCL, EC_WORD_GOOD, EC_WORD_BATTLE},\n\t\t\t.speechLose = {EC_WORD_UNBELIEVABLE, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF},\n\t\t\t.speechAfter = {EC_WORD_I_AM, EC_WORD_DISAPPOINTED, EC_WORD_BUT, EC_WORD_YOU, EC_WORD_WIN, EC_WORD_ELLIPSIS},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RAPIDASH,\n\t\t\t\t\t.heldItem = ITEM_WHITE_HERB,\n\t\t\t\t\t.moves = {MOVE_BOUNCE, MOVE_OVERHEAT, MOVE_HYPNOSIS, MOVE_RETURN},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 110,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x10, // FEMALE MILD\n\t\t\t\t\t.nickname = _(\"RAPIDASH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NINETALES,\n\t\t\t\t\t.heldItem = ITEM_CHARCOAL,\n\t\t\t\t\t.moves = {MOVE_CONFUSE_RAY, MOVE_WILL_O_WISP, MOVE_HEAT_WAVE, MOVE_DIG},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 200,\n\t\t\t\t\t.spAttackEV = 200,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x15, // FEMALE GENTLE\n\t\t\t\t\t.nickname = _(\"NINETALES\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MISDREAVUS,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_GRUDGE, MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_THUNDERBOLT},\n\t\t\t\t\t.hpEV = 200,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 210,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // FEMALE TIMID\n\t\t\t\t\t.nickname = _(\"MISDREAVUS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ALAKAZAM,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_LIGHT_SCREEN, MOVE_RECOVER, MOVE_PSYCHIC, MOVE_THUNDER_PUNCH},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // FEMALE TIMID\n\t\t\t\t\t.nickname = _(\"ALAKAZAM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_BLISSEY,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_LIGHT_SCREEN, MOVE_ATTRACT, MOVE_RETURN, MOVE_PSYCHIC},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"BLISSEY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CROBAT,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_TOXIC, MOVE_FLY, MOVE_CONFUSE_RAY, MOVE_SHADOW_BALL},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 210,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x17, // FEMALE CAREFUL\n\t\t\t\t\t.nickname = _(\"CROBAT\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"JOS & ANNE\"),\n\t\t\t.facilityClass = FACILITY_CLASS_COOL_COUPLE,\n\t\t\t.textColor = 7,\n\t\t\t.speechBefore = {EC_WORD_HERE_GOES, EC_WORD_EXCL_EXCL, EC_WORD_GET, EC_WORD_READY, EC_WORD_TO, EC_WORD_LOSE},\n\t\t\t.speechWin = {EC_WORD_PERFECT, EC_WORD_EXCL, EC_WORD_WE, EC_WORD_GET, EC_WORD_THE, EC_WORD_WIN},\n\t\t\t.speechLose = {EC_WORD_LOST, EC_WORD_QUES_EXCL, EC_WORD_YOU, EC_WORD_MUST_BE, EC_WORD_JOKING, EC_WORD_EXCL},\n\t\t\t.speechAfter = {EC_WORD_HOW, EC_WORD_COULD, EC_WORD_I, EC_WORD_LOSE, EC_WORD_THIS, EC_WORD_QUES},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HOUNDOOM,\n\t\t\t\t\t.heldItem = ITEM_CHARCOAL,\n\t\t\t\t\t.moves = {MOVE_TAUNT, MOVE_FLAMETHROWER, MOVE_WILL_O_WISP, MOVE_CRUNCH},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x82, // MALE BOLD\n\t\t\t\t\t.nickname = _(\"HOUNDOOM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_AERODACTYL,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_ROAR, MOVE_FIRE_BLAST, MOVE_HYPER_BEAM, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x33, // MALE LONELY\n\t\t\t\t\t.nickname = _(\"AERODACTYL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ARCANINE,\n\t\t\t\t\t.heldItem = ITEM_CHARCOAL,\n\t\t\t\t\t.moves = {MOVE_HEAT_WAVE, MOVE_EXTREME_SPEED, MOVE_ROAR, MOVE_DIG},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 200,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x56, // MALE HASTY\n\t\t\t\t\t.nickname = _(\"ARCANINE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_WEEZING,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_EXPLOSION, MOVE_SMOKESCREEN, MOVE_SLUDGE_BOMB, MOVE_THUNDERBOLT},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 110,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8E, // MALE QUIET\n\t\t\t\t\t.nickname = _(\"WEEZING\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CHARIZARD,\n\t\t\t\t\t.heldItem = ITEM_WHITE_HERB,\n\t\t\t\t\t.moves = {MOVE_OVERHEAT, MOVE_OUTRAGE, MOVE_DRAGON_RAGE, MOVE_SMOKESCREEN},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 110,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x33, // MALE LONELY\n\t\t\t\t\t.nickname = _(\"CHARIZARD\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GENGAR,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_SHADOW_BALL, MOVE_THUNDERBOLT},\n\t\t\t\t\t.hpEV = 55,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x87, // MALE TIMID\n\t\t\t\t\t.nickname = _(\"GENGAR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00017908\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Double_6 = {\n\t.id = 5,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_DOUBLE,\n\t.prize = TTPRIZE_CALCIUM,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"EMY & ALEK\"),\n\t\t\t.facilityClass = FACILITY_CLASS_YOUNG_COUPLE,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_SO, EC_WORD_LOST, EC_WORD_IN, EC_WORD_LOVEY_DOVEY, EC_WORD_HAPPINESS},\n\t\t\t.speechWin = {EC_WORD_OH, EC_WORD_OH, EC_WORD_HE, EC_WORD_IS, EC_WORD_REALLY, EC_WORD_AWESOME},\n\t\t\t.speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL_EXCL, EC_WORD_YOU_RE, EC_WORD_NOT, EC_WORD_SERIOUS, EC_WORD_QUES},\n\t\t\t.speechAfter = {EC_WORD_WHO, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_QUES, 0xFFFF, 0xFFFF},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TAUROS,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_FLAMETHROWER, MOVE_REST, MOVE_SHOCK_WAVE, MOVE_DOUBLE_TEAM},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // MALE TIMID\n\t\t\t\t\t.nickname = _(\"TAUROS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_KANGASKHAN,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_FLAMETHROWER, MOVE_DIZZY_PUNCH, MOVE_REST, MOVE_FAKE_OUT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x02, // FEMALE BRAVE\n\t\t\t\t\t.nickname = _(\"KANGASKHAN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FEAROW,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_DRILL_PECK, MOVE_TRI_ATTACK, MOVE_DOUBLE_EDGE, MOVE_REST},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x94, // MALE CAREFUL\n\t\t\t\t\t.nickname = _(\"FEAROW\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TOGETIC,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_FLAMETHROWER, MOVE_LIGHT_SCREEN, MOVE_REST, MOVE_ANCIENT_POWER},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x24, // MALE HASTY\n\t\t\t\t\t.nickname = _(\"TOGETIC\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PIDGEOT,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_STEEL_WING, MOVE_FLY, MOVE_MIRROR_MOVE, MOVE_REST},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 110,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0D, // FEMALE JOLLY\n\t\t\t\t\t.nickname = _(\"PIDGEOT\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_URSARING,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_REST, MOVE_SNORE, MOVE_DIG, MOVE_SLASH},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8A, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"URSARING\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"EMY & ALEK\"),\n\t\t\t.facilityClass = FACILITY_CLASS_YOUNG_COUPLE,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_GIDDY, EC_WORD_WITH, EC_WORD_LOVEY_DOVEY, EC_WORD_JOY, EC_WORD_EXCL_EXCL},\n\t\t\t.speechWin = {EC_WORD_SIGH, EC_WORD_ELLIPSIS, EC_WORD_MY, EC_WORD_GIRL, EC_WORD_IS, EC_WORD_CUTE},\n\t\t\t.speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_BE, EC_WORD_SERIOUS},\n\t\t\t.speechAfter = {EC_WORD_WAIT, EC_WORD_ELLIPSIS, EC_WORD_WHO, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_QUES},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_LICKITUNG,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_FLAMETHROWER, MOVE_EARTHQUAKE, MOVE_REST, MOVE_SLEEP_TALK},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 55,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"LICKITUNG\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NOCTOWL,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_REFLECT, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0B, // FEMALE HASTY\n\t\t\t\t\t.nickname = _(\"NOCTOWL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FURRET,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_FLAMETHROWER, MOVE_AMNESIA, MOVE_SHOCK_WAVE, MOVE_SLASH},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0E, // FEMALE NAIVE\n\t\t\t\t\t.nickname = _(\"FURRET\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RATICATE,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_SUPER_FANG, MOVE_QUICK_ATTACK, MOVE_SWAGGER, MOVE_ENDEAVOR},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x8A, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"RATICATE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_WIGGLYTUFF,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_SUNNY_DAY, MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0B, // FEMALE HASTY\n\t\t\t\t\t.nickname = _(\"WIGGLYTUFF\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PORYGON2,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_CONVERSION_2, MOVE_TRI_ATTACK, MOVE_RECOVER},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // GENDERLESS TIMID\n\t\t\t\t\t.nickname = _(\"PORYGON2\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00015d3b\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Double_2 = {\n\t.id = 6,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_DOUBLE,\n\t.prize = TTPRIZE_HP_UP,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"JO & HALEY\"),\n\t\t\t.facilityClass = FACILITY_CLASS_CRUSH_KIN,\n\t\t\t.textColor = 5,\n\t\t\t.speechBefore = {EC_WORD_WE_RE, EC_WORD_USING, EC_WORD_THAT, EC_WORD_STRATEGY, EC_WORD_OKAY, EC_WORD_QUES},\n\t\t\t.speechWin = {EC_WORD_YAY, EC_WORD_WE, EC_WORD_WON, EC_WORD_EXCL, EC_WORD_SORRY, EC_WORD_EXCL},\n\t\t\t.speechLose = {EC_WORD_AWW, EC_WORD_EXCL, EC_WORD_THAT_WAS, EC_WORD_REALLY, EC_WORD_TERRIBLE, EC_WORD_EXCL},\n\t\t\t.speechAfter = {EC_WORD_ALL, EC_WORD_I, EC_WORD_DO, EC_WORD_IS, EC_WORD_LOSE, EC_WORD_ELLIPSIS},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SNEASEL,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 200,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 50,\n\t\t\t\t\t.speedEV = 210,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 50,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0D, // FEMALE JOLLY\n\t\t\t\t\t.nickname = _(\"SNEASEL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ALAKAZAM,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_FIRE_PUNCH, MOVE_RECOVER, MOVE_PSYCHIC, MOVE_SUNNY_DAY},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x05, // FEMALE BOLD\n\t\t\t\t\t.nickname = _(\"ALAKAZAM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HITMONTOP,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_MEGA_KICK, MOVE_ENDEAVOR, MOVE_DIG, MOVE_SUNNY_DAY},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 200,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x08, // MALE IMPISH\n\t\t\t\t\t.nickname = _(\"HITMONTOP\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GIRAFARIG,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_LIGHT_SCREEN, MOVE_SUNNY_DAY, MOVE_SHADOW_BALL, MOVE_PSYBEAM},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0A, // FEMALE TIMID\n\t\t\t\t\t.nickname = _(\"GIRAFARIG\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_XATU,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_SUNNY_DAY, MOVE_DRILL_PECK, MOVE_CONFUSE_RAY, MOVE_PSYCHIC},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x14, // FEMALE CALM\n\t\t\t\t\t.nickname = _(\"XATU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MR_MIME,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_REFLECT, MOVE_SUNNY_DAY, MOVE_PSYCHIC, MOVE_SHOCK_WAVE},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 200,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x05, // FEMALE BOLD\n\t\t\t\t\t.nickname = _(\"MR. MIME\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"JO & HALEY\"),\n\t\t\t.facilityClass = FACILITY_CLASS_CRUSH_KIN,\n\t\t\t.textColor = 5,\n\t\t\t.speechBefore = {EC_WORD_YOU, EC_WORD_YOU, EC_WORD_YOU, EC_WORD_BETTER, EC_WORD_NOT, EC_WORD_WIN},\n\t\t\t.speechWin = {EC_WORD_YOU_RE, EC_WORD_NOT, EC_WORD_JOKING, EC_WORD_QUES, EC_WORD_WE, EC_WORD_WON},\n\t\t\t.speechLose = {EC_WORD_WIMPY, EC_WORD_ELLIPSIS, EC_WORD_WE, EC_WORD_WERE, EC_WORD_WEAK, EC_WORD_ELLIPSIS},\n\t\t\t.speechAfter = {EC_WORD_HAHAHA, EC_WORD_ELLIPSIS, EC_WORD_WE_RE, EC_WORD_TOTALLY, EC_WORD_USELESS, EC_WORD_ELLIPSIS},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HYPNO,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_FIRE_PUNCH, MOVE_HYPNOSIS, MOVE_PSYCHIC, MOVE_NIGHTMARE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x87, // MALE TIMID\n\t\t\t\t\t.nickname = _(\"HYPNO\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HITMONCHAN,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_FIRE_PUNCH, MOVE_THUNDER_PUNCH, MOVE_ICE_PUNCH, MOVE_DETECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0F, // MALE MODEST\n\t\t\t\t\t.nickname = _(\"HITMONCHAN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MACHAMP,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_FLAMETHROWER, MOVE_BRICK_BREAK, MOVE_SCARY_FACE, MOVE_DIG},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x43, // MALE QUIET\n\t\t\t\t\t.nickname = _(\"MACHAMP\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HOUNDOOM,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_ROAR, MOVE_FLAMETHROWER, MOVE_BITE, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x87, // MALE TIMID\n\t\t\t\t\t.nickname = _(\"HOUNDOOM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PRIMEAPE,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_OVERHEAT, MOVE_SWAGGER, MOVE_SEISMIC_TOSS, MOVE_DOUBLE_TEAM},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 110,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8C, // MALE MODEST\n\t\t\t\t\t.nickname = _(\"PRIMEAPE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HERACROSS,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_MEGAHORN, MOVE_EARTHQUAKE, MOVE_COUNTER, MOVE_LEER},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 200,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x85, // MALE IMPISH\n\t\t\t\t\t.nickname = _(\"HERACROSS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x000160b1\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_1 = {\n\t.id = 7,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_KNOCKOUT,\n\t.prize = TTPRIZE_METAL_COAT,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"JORDY\"),\n\t\t\t.facilityClass = FACILITY_CLASS_BIKER,\n\t\t\t.textColor = 3,\n\t\t\t.speechBefore = {EC_WORD_DON_T, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_GIGGLE, EC_WORD_YOU, EC_WORD_PUSHOVER},\n\t\t\t.speechWin = {EC_WORD_WHAT, EC_WORD_A_LITTLE, EC_WORD_PUSHOVER, EC_WORD_YOU, EC_WORD_ARE, EC_WORD_EXCL},\n\t\t\t.speechLose = {EC_WORD_YOU, EC_WORD_WERE, EC_WORD_READY, EC_WORD_TO, EC_WORD_ROCK, EC_WORD_EXCL},\n\t\t\t.speechAfter = {EC_WORD_DARN, EC_WORD_EXCL, EC_WORD_I, EC_WORD_DON_T, EC_WORD_GET, EC_WORD_IT},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGBY,\n\t\t\t\t\t.heldItem = ITEM_LAX_INCENSE,\n\t\t\t\t\t.moves = {MOVE_SMOKESCREEN, MOVE_CONFUSE_RAY, MOVE_FLAMETHROWER, MOVE_SCREECH},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 30,\n\t\t\t\t\t.defenseEV = 30,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 210,\n\t\t\t\t\t.spDefenseEV = 30,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x43, // MALE QUIET\n\t\t\t\t\t.nickname = _(\"MAGBY\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CLEFFA,\n\t\t\t\t\t.heldItem = ITEM_LAX_INCENSE,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_CHARM, MOVE_SECRET_POWER, MOVE_FLASH},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 30,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 30,\n\t\t\t\t\t.spDefenseEV = 30,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0xCA, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"CLEFFA\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_IGGLYBUFF,\n\t\t\t\t\t.heldItem = ITEM_LAX_INCENSE,\n\t\t\t\t\t.moves = {MOVE_SING, MOVE_HIDDEN_POWER, MOVE_CHARM, MOVE_DOUBLE_TEAM},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 45,\n\t\t\t\t\t.speedEV = 210,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 45,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0xD2, // MALE TIMID\n\t\t\t\t\t.nickname = _(\"IGGLYBUFF\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SMOOCHUM,\n\t\t\t\t\t.heldItem = ITEM_LAX_INCENSE,\n\t\t\t\t\t.moves = {MOVE_FAKE_TEARS, MOVE_PSYCHIC, MOVE_MEAN_LOOK, MOVE_SING},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 45,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 210,\n\t\t\t\t\t.spDefenseEV = 45,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x11, // FEMALE QUIET\n\t\t\t\t\t.nickname = _(\"SMOOCHUM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TOGEPI,\n\t\t\t\t\t.heldItem = ITEM_LAX_INCENSE,\n\t\t\t\t\t.moves = {MOVE_SWEET_KISS, MOVE_YAWN, MOVE_ANCIENT_POWER, MOVE_DOUBLE_TEAM},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 45,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 45,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x34, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"TOGEPI\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PICHU,\n\t\t\t\t\t.heldItem = ITEM_LAX_INCENSE,\n\t\t\t\t\t.moves = {MOVE_THUNDER_WAVE, MOVE_SHOCK_WAVE, MOVE_SWEET_KISS, MOVE_FLASH},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 45,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 210,\n\t\t\t\t\t.spDefenseEV = 45,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8E, // MALE QUIET\n\t\t\t\t\t.nickname = _(\"PICHU\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"ERNEST\"),\n\t\t\t.facilityClass = FACILITY_CLASS_BIKER,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_IT_S, EC_WORD_SLEEP, EC_WORD_TIME, EC_WORD_FOR, EC_WORD_CHILDREN, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_NOT, EC_WORD_GUTSY, EC_WORD_ENOUGH, 0xFFFF, 0xFFFF, 0xFFFF},\n\t\t\t.speechLose = {EC_WORD_WHY, EC_WORD_DID, EC_WORD_YOU, EC_WORD_CRUSH, EC_WORD_ME, EC_WORD_QUES},\n\t\t\t.speechAfter = {EC_WORD_I_AM, EC_WORD_BEAT, EC_WORD_I, EC_WORD_NEED, EC_WORD_A, EC_WORD_NAP},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CLEFFA,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_SWEET_KISS, MOVE_FRUSTRATION, MOVE_SING, MOVE_ATTRACT},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 45,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 45,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0xCA, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"CLEFFA\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGBY,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_FRUSTRATION, MOVE_CONFUSE_RAY, MOVE_FLAMETHROWER, MOVE_TOXIC},\n\t\t\t\t\t.hpEV = 90,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 210,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x4D, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"MAGBY\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TOGEPI,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_FRUSTRATION, MOVE_DOUBLE_TEAM, MOVE_TOXIC, MOVE_SWEET_KISS},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 45,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 45,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x34, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"TOGEPI\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SMOOCHUM,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_MEAN_LOOK, MOVE_PERISH_SONG, MOVE_TOXIC, MOVE_FLASH},\n\t\t\t\t\t.hpEV = 90,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 210,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 210,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"SMOOCHUM\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_IGGLYBUFF,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_DOUBLE_TEAM, MOVE_SWEET_KISS, MOVE_SEISMIC_TOSS, MOVE_FLASH},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 45,\n\t\t\t\t\t.speedEV = 210,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 45,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // FEMALE TIMID\n\t\t\t\t\t.nickname = _(\"IGGLYBUFF\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PICHU,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_TAIL_WHIP, MOVE_FRUSTRATION, MOVE_ATTRACT, MOVE_THUNDER_WAVE},\n\t\t\t\t\t.hpEV = 90,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 210,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"PICHU\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"GABRIEL\"),\n\t\t\t.facilityClass = FACILITY_CLASS_CUE_BALL,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_YAHOO, EC_WORD_EXCL, EC_WORD_HERE_I_COME, EC_WORD_TO, EC_WORD_SWARM, EC_WORD_YOU},\n\t\t\t.speechWin = {EC_WORD_I_AM, EC_WORD_INVINCIBLE, EC_WORD_YOU, EC_WORD_GOT, EC_WORD_THAT, EC_WORD_QUES},\n\t\t\t.speechLose = {EC_WORD_WHAT, EC_WORD_WAS, EC_WORD_THAT, EC_WORD_QUES, 0xFFFF, 0xFFFF},\n\t\t\t.speechAfter = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_WIN, EC_WORD_NEXT, EC_WORD_TIME},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PICHU,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_THUNDER_WAVE, MOVE_FRUSTRATION, MOVE_THUNDERBOLT, MOVE_ATTRACT},\n\t\t\t\t\t.hpEV = 90,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 210,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x81, // MALE NAUGHTY\n\t\t\t\t\t.nickname = _(\"PICHU\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TOGEPI,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_FRUSTRATION, MOVE_TOXIC, MOVE_SUBSTITUTE},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 90,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x33, // MALE LONELY\n\t\t\t\t\t.nickname = _(\"TOGEPI\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CLEFFA,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_ENCORE, MOVE_TOXIC, MOVE_DOUBLE_TEAM, MOVE_FLASH},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 150,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 150,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0xCF, // MALE RELAXED\n\t\t\t\t\t.nickname = _(\"CLEFFA\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_IGGLYBUFF,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_SUBSTITUTE, MOVE_SING, MOVE_PERISH_SONG},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 210,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 90,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0xCF, // MALE RELAXED\n\t\t\t\t\t.nickname = _(\"IGGLYBUFF\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SMOOCHUM,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_SWEET_KISS, MOVE_PERISH_SONG, MOVE_TOXIC, MOVE_ATTRACT},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 200,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"SMOOCHUM\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGBY,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_LEER, MOVE_FRUSTRATION, MOVE_SUBSTITUTE, MOVE_FLAMETHROWER},\n\t\t\t\t\t.hpEV = 90,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 210,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x4D, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"MAGBY\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t},\n\t.checksum = 0x00017a4a\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_2 = {\n\t.id = 8,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_KNOCKOUT,\n\t.prize = TTPRIZE_UP_GRADE,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"MIKE\"),\n\t\t\t.facilityClass = FACILITY_CLASS_HIKER,\n\t\t\t.textColor = 5,\n\t\t\t.speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_FULL, EC_WORD_OF, EC_WORD_POWER},\n\t\t\t.speechWin = {EC_WORD_WHAT_S_UP_QUES, EC_WORD_WHERE, EC_WORD_IS, EC_WORD_YOUR, EC_WORD_POWER, EC_WORD_QUES},\n\t\t\t.speechLose = {EC_WORD_YOU, EC_WORD_GOT, EC_WORD_ME, EC_WORD_WITH, EC_WORD_YOUR, EC_MOVE2(FAKE_OUT)},\n\t\t\t.speechAfter = {EC_WORD_OH_YEAH, EC_WORD_EXCL, EC_WORD_THAT_S, EC_WORD_PRETTY, EC_WORD_EXCELLENT, EC_WORD_EXCL},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PINSIR,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_GUILLOTINE, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_REVENGE},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"PINSIR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CHARIZARD,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_DRAGON_CLAW, MOVE_METAL_CLAW, MOVE_AERIAL_ACE, MOVE_OUTRAGE},\n\t\t\t\t\t.hpEV = 200,\n\t\t\t\t\t.attackEV = 200,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 110,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x35, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"CHARIZARD\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RHYDON,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_MEGAHORN, MOVE_HORN_DRILL, MOVE_CRUSH_CLAW, MOVE_BRICK_BREAK},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x09, // FEMALE LAX\n\t\t\t\t\t.nickname = _(\"RHYDON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ARCANINE,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_EXTREME_SPEED, MOVE_IRON_TAIL, MOVE_AERIAL_ACE, MOVE_DIG},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 200,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 200,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x3F, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"ARCANINE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GOLEM,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_DOUBLE_EDGE, MOVE_ROLLOUT, MOVE_BRICK_BREAK, MOVE_DIG},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 210,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x02, // FEMALE BRAVE\n\t\t\t\t\t.nickname = _(\"GOLEM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HOUNDOOM,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_CRUNCH, MOVE_REVERSAL, MOVE_DOUBLE_EDGE, MOVE_COUNTER},\n\t\t\t\t\t.hpEV = 200,\n\t\t\t\t\t.attackEV = 110,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x08, // FEMALE IMPISH\n\t\t\t\t\t.nickname = _(\"HOUNDOOM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"REBECCA\"),\n\t\t\t.facilityClass = FACILITY_CLASS_CRUSH_GIRL,\n\t\t\t.textColor = 5,\n\t\t\t.speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_WORD_WIN, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF},\n\t\t\t.speechWin = {EC_WORD_IT_S, EC_WORD_TOO, EC_WORD_BAD, EC_WORD_BUT, EC_WORD_I_AM, EC_WORD_OVERWHELMING},\n\t\t\t.speechLose = {EC_WORD_ARRGH, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF},\n\t\t\t.speechAfter = {EC_WORD_YOU, EC_WORD_ANGER, EC_WORD_ME, EC_WORD_BUT, EC_WORD_YOU_RE, EC_WORD_TOUGH},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SANDSLASH,\n\t\t\t\t\t.heldItem = ITEM_SILK_SCARF,\n\t\t\t\t\t.moves = {MOVE_CRUSH_CLAW, MOVE_DIG, MOVE_DOUBLE_EDGE, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0D, // FEMALE JOLLY\n\t\t\t\t\t.nickname = _(\"SANDSLASH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_DRAGONAIR,\n\t\t\t\t\t.heldItem = ITEM_SILK_SCARF,\n\t\t\t\t\t.moves = {MOVE_OUTRAGE, MOVE_IRON_TAIL, MOVE_DOUBLE_EDGE, MOVE_SLAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x03, // FEMALE ADAMANT\n\t\t\t\t\t.nickname = _(\"DRAGONAIR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RAPIDASH,\n\t\t\t\t\t.heldItem = ITEM_SILK_SCARF,\n\t\t\t\t\t.moves = {MOVE_BOUNCE, MOVE_IRON_TAIL, MOVE_THRASH, MOVE_DOUBLE_EDGE},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x94, // MALE CAREFUL\n\t\t\t\t\t.nickname = _(\"RAPIDASH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FLAREON,\n\t\t\t\t\t.heldItem = ITEM_SILK_SCARF,\n\t\t\t\t\t.moves = {MOVE_IRON_TAIL, MOVE_FLAIL, MOVE_BITE, MOVE_DOUBLE_EDGE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x21, // MALE IMPISH\n\t\t\t\t\t.nickname = _(\"FLAREON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDOQUEEN,\n\t\t\t\t\t.heldItem = ITEM_SILK_SCARF,\n\t\t\t\t\t.moves = {MOVE_SUPERPOWER, MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_COUNTER},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x17, // FEMALE CAREFUL\n\t\t\t\t\t.nickname = _(\"NIDOQUEEN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PERSIAN,\n\t\t\t\t\t.heldItem = ITEM_SILK_SCARF,\n\t\t\t\t\t.moves = {MOVE_RETURN, MOVE_AERIAL_ACE, MOVE_IRON_TAIL, MOVE_DIG},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 200,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 200,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"PERSIAN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"NICOLAS\"),\n\t\t\t.facilityClass = FACILITY_CLASS_BLACK_BELT,\n\t\t\t.textColor = 5,\n\t\t\t.speechBefore = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_WHERE, EC_WORD_YOU, EC_WORD_STOP, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_TO, EC_WORD_EVER, EC_WORD_BEAT, EC_WORD_ME},\n\t\t\t.speechLose = {EC_WORD_WHY, EC_WORD_COULDN_T, EC_WORD_I, EC_WORD_BEAT, EC_WORD_YOU, EC_WORD_QUES},\n\t\t\t.speechAfter = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_TRAIN, EC_WORD_SOME, EC_WORD_MORE},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HITMONLEE,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_MEGA_KICK, MOVE_REVERSAL, MOVE_FOCUS_PUNCH, MOVE_BRICK_BREAK},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x08, // MALE IMPISH\n\t\t\t\t\t.nickname = _(\"HITMONLEE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SCYTHER,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_SLASH, MOVE_REVERSAL, MOVE_STEEL_WING, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x17, // FEMALE CAREFUL\n\t\t\t\t\t.nickname = _(\"SCYTHER\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGMAR,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_FIRE_PUNCH, MOVE_THUNDER_PUNCH, MOVE_BRICK_BREAK, MOVE_IRON_TAIL},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x53, // MALE IMPISH\n\t\t\t\t\t.nickname = _(\"MAGMAR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MACHAMP,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_DYNAMIC_PUNCH, MOVE_DIG, MOVE_CROSS_CHOP, MOVE_REVENGE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x3F, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"MACHAMP\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PRIMEAPE,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_THRASH, MOVE_CROSS_CHOP, MOVE_IRON_TAIL, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 110,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 200,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x08, // FEMALE IMPISH\n\t\t\t\t\t.nickname = _(\"PRIMEAPE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_POLIWRATH,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_BODY_SLAM, MOVE_DIG, MOVE_MEGA_KICK, MOVE_COUNTER},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0D, // FEMALE JOLLY\n\t\t\t\t\t.nickname = _(\"POLIWRATH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t},\n\t.checksum = 0x00016f05\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Single_5 = {\n\t.id = 9,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_SINGLE,\n\t.prize = TTPRIZE_HP_UP,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"JOEY\"),\n\t\t\t.facilityClass = FACILITY_CLASS_CAMPER,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_SCARY, EC_WORD_STRONG, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_WERE, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_TOO, EC_WORD_MUCH, EC_WORD_QUES},\n\t\t\t.speechLose = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_WAY, EC_WORD_TOO_STRONG, EC_WORD_EXCL},\n\t\t\t.speechAfter = {EC_WORD_THE, EC_WORD_WAY, EC_WORD_POKEMON, EC_WORD_MATCH_UP, EC_WORD_IS, EC_WORD_IMPORTANT},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MURKROW,\n\t\t\t\t\t.heldItem = ITEM_BLACK_GLASSES,\n\t\t\t\t\t.moves = {MOVE_FAINT_ATTACK, MOVE_AERIAL_ACE, MOVE_SHADOW_BALL, MOVE_CONFUSE_RAY},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x89, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"MURKROW\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TAUROS,\n\t\t\t\t\t.heldItem = ITEM_SILK_SCARF,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_BODY_SLAM, MOVE_ROCK_TOMB, MOVE_PURSUIT},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0C, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"TAUROS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SLOWBRO,\n\t\t\t\t\t.heldItem = ITEM_MYSTIC_WATER,\n\t\t\t\t\t.moves = {MOVE_AMNESIA, MOVE_PSYCHIC, MOVE_SURF, MOVE_ICE_BEAM},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x89, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"SLOWBRO\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ARBOK,\n\t\t\t\t\t.heldItem = ITEM_POISON_BARB,\n\t\t\t\t\t.moves = {MOVE_IRON_TAIL, MOVE_SLUDGE_BOMB, MOVE_ROCK_SLIDE, MOVE_TOXIC},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x89, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"ARBOK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDOKING,\n\t\t\t\t\t.heldItem = ITEM_SOFT_SAND,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_MEGAHORN, MOVE_SLUDGE_BOMB, MOVE_ROCK_SLIDE},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0C, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"NIDOKING\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RAPIDASH,\n\t\t\t\t\t.heldItem = ITEM_CHARCOAL,\n\t\t\t\t\t.moves = {MOVE_FLAMETHROWER, MOVE_BOUNCE, MOVE_QUICK_ATTACK, MOVE_DOUBLE_KICK},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x89, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"RAPIDASH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00016417\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Single_8 = {\n\t.id = 10,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_SINGLE,\n\t.prize = TTPRIZE_METAL_COAT,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"LILY\"),\n\t\t\t.facilityClass = FACILITY_CLASS_PKMN_BREEDER,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_I, EC_WORD_WANT, EC_WORD_SOMETHING, EC_WORD_IN, EC_MOVE(RETURN), EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_I, EC_WORD_BELIEVE, EC_WORD_IN, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_EXCL},\n\t\t\t.speechLose = {EC_WORD_I, EC_WORD_NEED, EC_WORD_SOMETHING, EC_WORD_IN, EC_MOVE(RETURN), EC_WORD_ELLIPSIS},\n\t\t\t.speechAfter = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_HAVE, EC_WORD_MY, EC_WORD_TRUST, EC_WORD_FOREVER},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CLEFAIRY,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_CHARM, MOVE_METRONOME, MOVE_RETURN, MOVE_REST},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"CLEFAIRY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TOGEPI,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_CHARM, MOVE_METRONOME, MOVE_RETURN, MOVE_REST},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"TOGEPI\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MEOWTH,\n\t\t\t\t\t.heldItem = ITEM_SILK_SCARF,\n\t\t\t\t\t.moves = {MOVE_CHARM, MOVE_ASSIST, MOVE_RETURN, MOVE_REST},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x89, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"MEOWTH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_JIGGLYPUFF,\n\t\t\t\t\t.heldItem = ITEM_SILK_SCARF,\n\t\t\t\t\t.moves = {MOVE_CHARM, MOVE_ROLLOUT, MOVE_RETURN, MOVE_REST},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"JIGGLYPUFF\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SNORLAX,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_CHARM, MOVE_ROLLOUT, MOVE_RETURN, MOVE_REST},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x25, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"SNORLAX\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SNUBBULL,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_CHARM, MOVE_LICK, MOVE_RETURN, MOVE_REST},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"SNUBBULL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00016cb7\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Single_2 = {\n\t.id = 11,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_SINGLE,\n\t.prize = TTPRIZE_UP_GRADE,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"BRANDON\"),\n\t\t\t.facilityClass = FACILITY_CLASS_BUG_CATCHER,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_POISON, EC_WORD_IS, EC_WORD_JUST, EC_WORD_SO, EC_WORD_AWFUL, EC_WORD_ISN_T_IT_QUES},\n\t\t\t.speechWin = {EC_WORD_SEE, EC_WORD_QUES, EC_WORD_ISN_T, EC_WORD_POISON, EC_WORD_TERRIBLE, EC_WORD_QUES},\n\t\t\t.speechLose = {EC_WORD_HUH_QUES, EC_WORD_OUR, EC_WORD_POISON, EC_WORD_DIDN_T, EC_WORD_WORK, EC_WORD_QUES},\n\t\t\t.speechAfter = {EC_WORD_POISON, EC_WORD_IS, EC_WORD_A, EC_WORD_TERRIBLE, EC_MOVE(TORMENT), EC_WORD_ISN_T_IT_QUES},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_BUTTERFREE,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_SILVER_WIND, MOVE_SLEEP_POWDER, MOVE_PSYCHIC, MOVE_SUPERSONIC},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8A, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"BUTTERFREE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_BEEDRILL,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_SLUDGE_BOMB, MOVE_TWINEEDLE, MOVE_DOUBLE_TEAM, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8A, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"BEEDRILL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PARASECT,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_GIGA_DRAIN, MOVE_LIGHT_SCREEN, MOVE_STUN_SPORE, MOVE_SLASH},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8A, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"PARASECT\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_YANMA,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_HYPNOSIS, MOVE_SONIC_BOOM, MOVE_QUICK_ATTACK, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x8A, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"YANMA\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SHUCKLE,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_TOXIC, MOVE_ROCK_TOMB, MOVE_PROTECT, MOVE_REST},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8A, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"SHUCKLE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FORRETRESS,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_TOXIC, MOVE_GIGA_DRAIN, MOVE_PROTECT, MOVE_SANDSTORM},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8A, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"FORRETRESS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00016e1f\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Double_3 = {\n\t.id = 12,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_DOUBLE,\n\t.prize = TTPRIZE_IRON,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"RIC & RENE\"),\n\t\t\t.facilityClass = FACILITY_CLASS_CRUSH_KIN,\n\t\t\t.textColor = 5,\n\t\t\t.speechBefore = {EC_WORD_MY, EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_IS, EC_WORD_REALLY, EC_WORD_AWESOME},\n\t\t\t.speechWin = {EC_WORD_MY, EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_IS, EC_WORD_TOO, EC_WORD_AWESOME},\n\t\t\t.speechLose = {EC_WORD_MY, EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_ISN_T, EC_WORD_AWESOME, EC_WORD_QUES},\n\t\t\t.speechAfter = {EC_WORD_BIG, EC_WORD_BROTHER, EC_WORD_FIGHT, EC_WORD_EXCL, 0xFFFF, 0xFFFF},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HITMONLEE,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_ROCK_TOMB, MOVE_HI_JUMP_KICK, MOVE_BULK_UP, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x02, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"HITMONLEE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RHYDON,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_MEGAHORN, MOVE_ROCK_BLAST, MOVE_BRICK_BREAK, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x7F, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"RHYDON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GOLEM,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_BRICK_BREAK, MOVE_ROCK_BLAST, MOVE_DIG, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x02, // FEMALE BRAVE\n\t\t\t\t\t.nickname = _(\"GOLEM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGMAR,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_FIRE_PUNCH, MOVE_BRICK_BREAK, MOVE_CONFUSE_RAY, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x4F, // MALE NAUGHTY\n\t\t\t\t\t.nickname = _(\"MAGMAR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HERACROSS,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_MEGAHORN, MOVE_BRICK_BREAK, MOVE_ROCK_TOMB, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x7F, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"HERACROSS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_POLIWRATH,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_FOCUS_PUNCH, MOVE_SURF, MOVE_BULK_UP, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x97, // MALE LONELY\n\t\t\t\t\t.nickname = _(\"POLIWRATH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"RIC & RENE\"),\n\t\t\t.facilityClass = FACILITY_CLASS_CRUSH_KIN,\n\t\t\t.textColor = 5,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_REALLY, EC_WORD_AWESOME, EC_WORD_EXCL, 0xFFFF, 0xFFFF},\n\t\t\t.speechWin = {EC_WORD_I_AM, EC_WORD_TOO, EC_WORD_AWESOME, EC_WORD_EXCL, 0xFFFF, 0xFFFF},\n\t\t\t.speechLose = {EC_WORD_HUH_QUES, 0xFFFF, EC_WORD_I_AM, EC_WORD_NOT_VERY, EC_WORD_AWESOME, EC_WORD_QUES},\n\t\t\t.speechAfter = {EC_WORD_I, EC_WORD_WILL, EC_WORD_DO, EC_WORD_MY, EC_WORD_BEST, EC_WORD_EXCL},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MACHAMP,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_CROSS_CHOP, MOVE_SEISMIC_TOSS, MOVE_ROCK_TOMB, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x4E, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"MACHAMP\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PINSIR,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SUBMISSION, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"PINSIR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAROWAK,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_BRICK_BREAK, MOVE_BONEMERANG, MOVE_AERIAL_ACE, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x03, // FEMALE ADAMANT\n\t\t\t\t\t.nickname = _(\"MAROWAK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HITMONCHAN,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_MACH_PUNCH, MOVE_THUNDER_PUNCH, MOVE_DOUBLE_TEAM, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x03, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"HITMONCHAN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ELECTABUZZ,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_THUNDER_PUNCH, MOVE_BRICK_BREAK, MOVE_THUNDER_WAVE, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x4F, // MALE NAUGHTY\n\t\t\t\t\t.nickname = _(\"ELECTABUZZ\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_POLIWRATH,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_FOCUS_PUNCH, MOVE_SURF, MOVE_BULK_UP, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x97, // MALE LONELY\n\t\t\t\t\t.nickname = _(\"POLIWRATH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x000166b4\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Double_1 = {\n\t.id = 13,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_DOUBLE,\n\t.prize = TTPRIZE_DRAGON_SCALE,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"JEN & KIRA\"),\n\t\t\t.facilityClass = FACILITY_CLASS_TWINS,\n\t\t\t.textColor = 5,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_TRY, EC_WORD_HARD, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_EHEHE, EC_WORD_YAY, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF},\n\t\t\t.speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF},\n\t\t\t.speechAfter = {EC_WORD_I, EC_WORD_WILL, EC_WORD_TRY, EC_WORD_TO, EC_WORD_GET, EC_WORD_BETTER},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_JOLTEON,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_QUICK_ATTACK, MOVE_THUNDERBOLT, MOVE_DOUBLE_KICK, MOVE_PIN_MISSILE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x29, // MALE MILD\n\t\t\t\t\t.nickname = _(\"JOLTEON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ESPEON,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_QUICK_ATTACK, MOVE_PSYCHIC, MOVE_SHADOW_BALL, MOVE_BITE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x29, // MALE MILD\n\t\t\t\t\t.nickname = _(\"ESPEON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FLAREON,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_QUICK_ATTACK, MOVE_FLAMETHROWER, MOVE_SHADOW_BALL, MOVE_IRON_TAIL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x33, // MALE LONELY\n\t\t\t\t\t.nickname = _(\"FLAREON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_VAPOREON,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_QUICK_ATTACK, MOVE_WATERFALL, MOVE_ICE_BEAM, MOVE_BITE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x10, // FEMALE MILD\n\t\t\t\t\t.nickname = _(\"VAPOREON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_EEVEE,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_QUICK_ATTACK, MOVE_DOUBLE_EDGE, MOVE_BITE, MOVE_IRON_TAIL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x10, // FEMALE MILD\n\t\t\t\t\t.nickname = _(\"EEVEE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_UMBREON,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_QUICK_ATTACK, MOVE_FAINT_ATTACK, MOVE_SHADOW_BALL, MOVE_IRON_TAIL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x10, // FEMALE MILD\n\t\t\t\t\t.nickname = _(\"UMBREON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"JEN & KIRA\"),\n\t\t\t.facilityClass = FACILITY_CLASS_TWINS,\n\t\t\t.textColor = 3,\n\t\t\t.speechBefore = {EC_WORD_LET_S, EC_WORD_TRY, EC_WORD_HARD, EC_WORD_EXCL, 0xFFFF, 0xFFFF},\n\t\t\t.speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF},\n\t\t\t.speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF},\n\t\t\t.speechAfter = {EC_WORD_WE, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_WORK, EC_WORD_BETTER, 0xFFFF},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_JOLTEON,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HELPING_HAND, MOVE_THUNDERBOLT},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 10 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // FEMALE TIMID\n\t\t\t\t\t.nickname = _(\"JOLTEON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ESPEON,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_LIGHT_SCREEN, MOVE_REFLECT, MOVE_HELPING_HAND, MOVE_PSYCHIC},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 10 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // FEMALE TIMID\n\t\t\t\t\t.nickname = _(\"ESPEON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FLAREON,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HELPING_HAND, MOVE_FLAMETHROWER},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 13 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0D, // FEMALE JOLLY\n\t\t\t\t\t.nickname = _(\"FLAREON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_VAPOREON,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HELPING_HAND, MOVE_SURF},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 35 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x23, // MALE TIMID\n\t\t\t\t\t.nickname = _(\"VAPOREON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_EEVEE,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HELPING_HAND, MOVE_DOUBLE_EDGE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 35 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x23, // MALE TIMID\n\t\t\t\t\t.nickname = _(\"EEVEE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_UMBREON,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HELPING_HAND, MOVE_FAINT_ATTACK},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 35 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x23, // MALE TIMID\n\t\t\t\t\t.nickname = _(\"UMBREON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00017fc2\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Double_4 = {\n\t.id = 14,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_DOUBLE,\n\t.prize = TTPRIZE_MENTAL_HERB,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"ISAC & MAG\"),\n\t\t\t.facilityClass = FACILITY_CLASS_COOL_COUPLE,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_OUR, EC_MOVE(EARTHQUAKE), EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_SHAKY},\n\t\t\t.speechWin = {EC_WORD_FEELING, EC_WORD_SHAKY, EC_WORD_HUH_QUES, 0xFFFF, 0xFFFF, 0xFFFF},\n\t\t\t.speechLose = {EC_WORD_I_AM, EC_WORD_ALL, EC_WORD_SHAKY, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF},\n\t\t\t.speechAfter = {EC_WORD_MY, EC_WORD_GIRL, EC_WORD_ISN_T, EC_WORD_SHAKY, EC_WORD_SHE_IS, EC_WORD_LOVEY_DOVEY},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDOKING,\n\t\t\t\t\t.heldItem = ITEM_SOFT_SAND,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_MEGAHORN, MOVE_SHADOW_BALL, MOVE_FIRE_BLAST},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x03, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"NIDOKING\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GLIGAR,\n\t\t\t\t\t.heldItem = ITEM_SOFT_SAND,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_QUICK_ATTACK, MOVE_AERIAL_ACE, MOVE_IRON_TAIL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"GLIGAR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_QUAGSIRE,\n\t\t\t\t\t.heldItem = ITEM_SOFT_SAND,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_SLUDGE_BOMB, MOVE_BLIZZARD, MOVE_BRICK_BREAK},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"QUAGSIRE\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PILOSWINE,\n\t\t\t\t\t.heldItem = ITEM_SOFT_SAND,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_BLIZZARD, MOVE_ANCIENT_POWER, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"PILOSWINE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GOLEM,\n\t\t\t\t\t.heldItem = ITEM_SOFT_SAND,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_ROCK_BLAST, MOVE_BRICK_BREAK, MOVE_EXPLOSION},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"GOLEM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_STEELIX,\n\t\t\t\t\t.heldItem = ITEM_SOFT_SAND,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_IRON_TAIL, MOVE_DRAGON_BREATH, MOVE_DOUBLE_EDGE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"STEELIX\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"ISAC & MAG\"),\n\t\t\t.facilityClass = FACILITY_CLASS_COOL_COUPLE,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_DOESN_T, EC_WORD_GET, EC_WORD_ALL, EC_WORD_SHAKY},\n\t\t\t.speechWin = {EC_WORD_SEE, EC_WORD_QUES, EC_WORD_I, EC_WORD_DIDN_T, EC_WORD_LIE, EC_WORD_EXCL},\n\t\t\t.speechLose = {EC_WORD_HUH_QUES, EC_WORD_YOU, EC_WORD_LEFT, EC_WORD_ME, EC_WORD_FEELING, EC_WORD_SHAKY},\n\t\t\t.speechAfter = {EC_WORD_I_AM, EC_WORD_LOVEY_DOVEY, EC_WORD_FOR, EC_WORD_HIM, EC_WORD_NOT, EC_WORD_SHAKY},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SKARMORY,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_SANDSTORM, MOVE_STEEL_WING, MOVE_AIR_CUTTER, MOVE_SPIKES},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0B, // FEMALE HASTY\n\t\t\t\t\t.nickname = _(\"SKARMORY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MANTINE,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_ICE_BEAM, MOVE_SURF, MOVE_CONFUSE_RAY, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0B, // FEMALE HASTY\n\t\t\t\t\t.nickname = _(\"MANTINE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_JUMPLUFF,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_TAIL_WHIP, MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0B, // FEMALE HASTY\n\t\t\t\t\t.nickname = _(\"JUMPLUFF\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GENGAR,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_THUNDERBOLT, MOVE_PSYCHIC},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0B, // FEMALE HASTY\n\t\t\t\t\t.nickname = _(\"GENGAR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CROBAT,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_GIGA_DRAIN, MOVE_POISON_FANG, MOVE_FLY, MOVE_STEEL_WING},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0B, // FEMALE HASTY\n\t\t\t\t\t.nickname = _(\"CROBAT\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_XATU,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_PSYCHIC, MOVE_CONFUSE_RAY, MOVE_AERIAL_ACE, MOVE_LIGHT_SCREEN},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0B, // FEMALE HASTY\n\t\t\t\t\t.nickname = _(\"XATU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00016bb0\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_8 = {\n\t.id = 15,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_KNOCKOUT,\n\t.prize = TTPRIZE_BRIGHT_POWDER,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"CHELSEA\"),\n\t\t\t.facilityClass = FACILITY_CLASS_PKMN_RANGER_F,\n\t\t\t.textColor = 7,\n\t\t\t.speechBefore = {EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD, EC_WORD_IS, EC_WORD_IMPORTANT, EC_WORD_ISN_T_IT_QUES},\n\t\t\t.speechWin = {EC_WORD_YOU, EC_WORD_TAKE, EC_WORD_THE, EC_WORD_LOSS, 0xFFFF, 0xFFFF},\n\t\t\t.speechLose = {EC_WORD_BE, EC_WORD_KIND, EC_WORD_TO, EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD},\n\t\t\t.speechAfter = {EC_WORD_DON_T, EC_WORD_EVER, EC_WORD_POISON, EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_VILEPLUME,\n\t\t\t\t\t.heldItem = ITEM_PETAYA_BERRY,\n\t\t\t\t\t.moves = {MOVE_INGRAIN, MOVE_GIGA_DRAIN, MOVE_SLUDGE_BOMB, MOVE_STUN_SPORE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x11, // FEMALE QUIET\n\t\t\t\t\t.nickname = _(\"VILEPLUME\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_STARMIE,\n\t\t\t\t\t.heldItem = ITEM_PETAYA_BERRY,\n\t\t\t\t\t.moves = {MOVE_PSYCHIC, MOVE_ICE_BEAM, MOVE_WATERFALL, MOVE_RECOVER},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x10, // GENDERLESS MILD\n\t\t\t\t\t.nickname = _(\"STARMIE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_URSARING,\n\t\t\t\t\t.heldItem = ITEM_LIECHI_BERRY,\n\t\t\t\t\t.moves = {MOVE_FAINT_ATTACK, MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_ROCK_TOMB},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x01, // FEMALE LONELY\n\t\t\t\t\t.nickname = _(\"URSARING\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NOCTOWL,\n\t\t\t\t\t.heldItem = ITEM_LIECHI_BERRY,\n\t\t\t\t\t.moves = {MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_FAINT_ATTACK, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x01, // FEMALE LONELY\n\t\t\t\t\t.nickname = _(\"NOCTOWL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NINETALES,\n\t\t\t\t\t.heldItem = ITEM_PETAYA_BERRY,\n\t\t\t\t\t.moves = {MOVE_GRUDGE, MOVE_OVERHEAT, MOVE_FAINT_ATTACK, MOVE_WILL_O_WISP},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x10, // FEMALE MILD\n\t\t\t\t\t.nickname = _(\"NINETALES\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_LEDIAN,\n\t\t\t\t\t.heldItem = ITEM_LIECHI_BERRY,\n\t\t\t\t\t.moves = {MOVE_SILVER_WIND, MOVE_SWIFT, MOVE_AERIAL_ACE, MOVE_TOXIC},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x01, // FEMALE LONELY\n\t\t\t\t\t.nickname = _(\"LEDIAN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"TRENTON\"),\n\t\t\t.facilityClass = FACILITY_CLASS_PKMN_RANGER_M,\n\t\t\t.textColor = 7,\n\t\t\t.speechBefore = {EC_WORD_I, EC_MOVE2(PROTECT), EC_WORD_THE, EC_WORD_GREAT, EC_WORD_GREEN, EC_WORD_WORLD},\n\t\t\t.speechWin = {EC_WORD_TAKE_THAT, EC_WORD_EXCL, EC_WORD_THE, EC_WORD_LOSS, EC_WORD_IS, EC_WORD_YOURS},\n\t\t\t.speechLose = {EC_MOVE2(PROTECT), EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD, 0xFFFF, 0xFFFF},\n\t\t\t.speechAfter = {EC_MOVE2(PROTECT), EC_WORD_AND, EC_WORD_RESUSCITATE, EC_WORD_THE, EC_WORD_GREEN, EC_WORD_WORLD},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GYARADOS,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_WATERFALL, MOVE_BLIZZARD, MOVE_HYPER_BEAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x88, // MALE HASTY\n\t\t\t\t\t.nickname = _(\"GYARADOS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_VICTREEBEL,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_GIGA_DRAIN, MOVE_SLUDGE_BOMB, MOVE_REFLECT, MOVE_ATTRACT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8E, // MALE QUIET\n\t\t\t\t\t.nickname = _(\"VICTREEBEL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_DONPHAN,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER, MOVE_IRON_TAIL, MOVE_DOUBLE_EDGE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x97, // MALE LONELY\n\t\t\t\t\t.nickname = _(\"DONPHAN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FEAROW,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_FAINT_ATTACK, MOVE_DRILL_PECK, MOVE_STEEL_WING, MOVE_DOUBLE_TEAM},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x97, // MALE LONELY\n\t\t\t\t\t.nickname = _(\"FEAROW\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ARCANINE,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_EXTREME_SPEED, MOVE_FIRE_BLAST, MOVE_CRUNCH, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x4F, // MALE NAUGHTY\n\t\t\t\t\t.nickname = _(\"ARCANINE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ARIADOS,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_PSYCHIC, MOVE_SLUDGE_BOMB, MOVE_SIGNAL_BEAM, MOVE_TOXIC},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x97, // MALE LONELY\n\t\t\t\t\t.nickname = _(\"ARIADOS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"ALBERT\"),\n\t\t\t.facilityClass = FACILITY_CLASS_COOLTRAINER_M,\n\t\t\t.textColor = 7,\n\t\t\t.speechBefore = {EC_WORD_LET_S, EC_WORD_HAVE, EC_WORD_AN, EC_WORD_EXCITING, EC_WORD_TIME, EC_WORD_HERE},\n\t\t\t.speechWin = {EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_TO, EC_WORD_MAKE, EC_WORD_THINGS, EC_WORD_EXCITING},\n\t\t\t.speechLose = {EC_WORD_YOU_RE, EC_WORD_STRONG, EC_WORD_THAT_WAS, EC_WORD_WILD, EC_WORD_AND, EC_WORD_EXCITING},\n\t\t\t.speechAfter = {EC_WORD_I_AM, EC_WORD_TIRED, EC_WORD_AFTER, EC_WORD_THAT, EC_WORD_EXCITING, EC_WORD_MATCH},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_KINGDRA,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_TWISTER, MOVE_OCTAZOOKA, MOVE_AURORA_BEAM, MOVE_RETURN},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x15, // FEMALE GENTLE\n\t\t\t\t\t.nickname = _(\"KINGDRA\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GOLEM,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_BRICK_BREAK, MOVE_DOUBLE_EDGE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x7F, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"GOLEM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_DRAGONITE,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDER, MOVE_FIRE_BLAST, MOVE_BLIZZARD, MOVE_DRAGON_CLAW},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x01, // FEMALE LONELY\n\t\t\t\t\t.nickname = _(\"DRAGONITE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TYRANITAR,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_CRUNCH, MOVE_THUNDER, MOVE_FIRE_BLAST},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x97, // MALE LONELY\n\t\t\t\t\t.nickname = _(\"TYRANITAR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_AMPHAROS,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_REFLECT, MOVE_THUNDER, MOVE_BRICK_BREAK, MOVE_RETURN},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x13, // FEMALE RASH\n\t\t\t\t\t.nickname = _(\"AMPHAROS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_VENUSAUR,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_GIGA_DRAIN, MOVE_LEECH_SEED, MOVE_TOXIC, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x2A, // MALE QUIET\n\t\t\t\t\t.nickname = _(\"VENUSAUR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t},\n\t.checksum = 0x0001844c\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_3 = {\n\t.id = 16,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_KNOCKOUT,\n\t.prize = TTPRIZE_CALCIUM,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"CAMRYN\"),\n\t\t\t.facilityClass = FACILITY_CLASS_PICNICKER,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_LET_S, EC_WORD_BATTLE, EC_WORD_I, EC_WORD_WON_T, EC_WORD_LOSE, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_I, EC_WORD_SAID, EC_WORD_THAT, EC_WORD_I, EC_WORD_WOULD, EC_WORD_WIN},\n\t\t\t.speechLose = {EC_WORD_OH_QUES, EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, EC_WORD_DID, EC_WORD_I, EC_WORD_LOSE, EC_WORD_QUES},\n\t\t\t.speechAfter = {EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MURKROW,\n\t\t\t\t\t.heldItem = ITEM_BLACK_GLASSES,\n\t\t\t\t\t.moves = {MOVE_AERIAL_ACE, MOVE_SHADOW_BALL, MOVE_FAINT_ATTACK, MOVE_CONFUSE_RAY},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x89, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"MURKROW\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RAPIDASH,\n\t\t\t\t\t.heldItem = ITEM_CHARCOAL,\n\t\t\t\t\t.moves = {MOVE_BOUNCE, MOVE_FLAMETHROWER, MOVE_QUICK_ATTACK, MOVE_DOUBLE_KICK},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"RAPIDASH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MILTANK,\n\t\t\t\t\t.heldItem = ITEM_SILK_SCARF,\n\t\t\t\t\t.moves = {MOVE_MILK_DRINK, MOVE_BRICK_BREAK, MOVE_BODY_SLAM, MOVE_SHADOW_BALL},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"MILTANK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GOLDUCK,\n\t\t\t\t\t.heldItem = ITEM_MYSTIC_WATER,\n\t\t\t\t\t.moves = {MOVE_HYDRO_PUMP, MOVE_ICE_BEAM, MOVE_CALM_MIND, MOVE_LIGHT_SCREEN},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x89, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"GOLDUCK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SANDSLASH,\n\t\t\t\t\t.heldItem = ITEM_SOFT_SAND,\n\t\t\t\t\t.moves = {MOVE_SANDSTORM, MOVE_AERIAL_ACE, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x89, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"SANDSLASH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDOQUEEN,\n\t\t\t\t\t.heldItem = ITEM_HARD_STONE,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_SUPERPOWER, MOVE_SLUDGE_BOMB, MOVE_ROCK_SLIDE},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"NIDOQUEEN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"NATALIA\"),\n\t\t\t.facilityClass = FACILITY_CLASS_AROMA_LADY,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_THIS, EC_MOVE(SWEET_SCENT), EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_IT, EC_WORD_QUES},\n\t\t\t.speechWin = {EC_WORD_WASN_T, EC_WORD_THAT, EC_WORD_NICE, EC_WORD_QUES, 0xFFFF, 0xFFFF},\n\t\t\t.speechLose = {EC_WORD_THAT, EC_WORD_WASN_T, EC_WORD_GOOD, EC_WORD_QUES, 0xFFFF, 0xFFFF},\n\t\t\t.speechAfter = {EC_WORD_I, EC_MOVE2(REFRESH), EC_WORD_THINGS, EC_WORD_WITH, EC_WORD_REFRESHING, EC_MOVE(AROMATHERAPY)},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_BELLOSSOM,\n\t\t\t\t\t.heldItem = ITEM_PERSIM_BERRY,\n\t\t\t\t\t.moves = {MOVE_SWEET_SCENT, MOVE_ATTRACT, MOVE_PETAL_DANCE, MOVE_FLAIL},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"BELLOSSOM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_VICTREEBEL,\n\t\t\t\t\t.heldItem = ITEM_MIRACLE_SEED,\n\t\t\t\t\t.moves = {MOVE_SWEET_SCENT, MOVE_ATTRACT, MOVE_GIGA_DRAIN, MOVE_SLUDGE_BOMB},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x89, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"VICTREEBEL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PARASECT,\n\t\t\t\t\t.heldItem = ITEM_MIRACLE_SEED,\n\t\t\t\t\t.moves = {MOVE_SWEET_SCENT, MOVE_ATTRACT, MOVE_GIGA_DRAIN, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x89, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"PARASECT\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_VILEPLUME,\n\t\t\t\t\t.heldItem = ITEM_PERSIM_BERRY,\n\t\t\t\t\t.moves = {MOVE_SWEET_SCENT, MOVE_ATTRACT, MOVE_PETAL_DANCE, MOVE_SLUDGE_BOMB},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"VILEPLUME\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_VENUSAUR,\n\t\t\t\t\t.heldItem = ITEM_PERSIM_BERRY,\n\t\t\t\t\t.moves = {MOVE_SWEET_SCENT, MOVE_ATTRACT, MOVE_PETAL_DANCE, MOVE_SLUDGE_BOMB},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"VENUSAUR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MEGANIUM,\n\t\t\t\t\t.heldItem = ITEM_MIRACLE_SEED,\n\t\t\t\t\t.moves = {MOVE_SWEET_SCENT, MOVE_ATTRACT, MOVE_GIGA_DRAIN, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x25, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"MEGANIUM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"KATHLEEN\"),\n\t\t\t.facilityClass = FACILITY_CLASS_COOLTRAINER_F,\n\t\t\t.textColor = 7,\n\t\t\t.speechBefore = {EC_WORD_TOO, EC_WORD_BAD, EC_WORD_IT_S, EC_WORD_OVER, EC_WORD_FOR, EC_WORD_YOU},\n\t\t\t.speechWin = {EC_WORD_SORRY, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF},\n\t\t\t.speechLose = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_HARD, EC_WORD_TO, EC_WORD_BELIEVE, EC_WORD_ELLIPSIS},\n\t\t\t.speechAfter = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_PURE_POWER, EC_WORD_THAT, EC_WORD_IS, EC_WORD_NATURAL},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAROWAK,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_BRICK_BREAK, MOVE_BONEMERANG, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x89, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"MAROWAK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_LAPRAS,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_BLIZZARD, MOVE_PSYCHIC, MOVE_THUNDER},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"LAPRAS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ARCANINE,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_EXTREME_SPEED, MOVE_FLAMETHROWER, MOVE_CRUNCH, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x57, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"ARCANINE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RAICHU,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_QUICK_ATTACK, MOVE_DOUBLE_TEAM, MOVE_IRON_TAIL},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x89, // MALE SERIOUS\n\t\t\t\t\t.nickname = _(\"RAICHU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TOGETIC,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_ANCIENT_POWER, MOVE_SWEET_KISS, MOVE_PSYCHIC, MOVE_MAGICAL_LEAF},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"TOGETIC\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SNORLAX,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_BODY_SLAM, MOVE_REST, MOVE_SNORE, MOVE_SHADOW_BALL},\n\t\t\t\t\t.hpEV = 84,\n\t\t\t\t\t.attackEV = 84,\n\t\t\t\t\t.defenseEV = 84,\n\t\t\t\t\t.speedEV = 84,\n\t\t\t\t\t.spAttackEV = 84,\n\t\t\t\t\t.spDefenseEV = 84,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0C, // FEMALE SERIOUS\n\t\t\t\t\t.nickname = _(\"SNORLAX\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t},\n\t.checksum = 0x0001738c\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Single_6 = {\n\t.id = 17,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_SINGLE,\n\t.prize = TTPRIZE_CARBOS,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"BRADEN\"),\n\t\t\t.facilityClass = FACILITY_CLASS_SWIMMER_M,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_PRETTY, EC_WORD_HAPPY, EC_WORD_WITH, EC_WORD_MY, EC_WORD_TOUGHNESS},\n\t\t\t.speechWin = {EC_WORD_WROOOAAR_EXCL, 0xFFFF, EC_WORD_SERIOUSLY, EC_WORD_I, EC_WORD_WON, EC_WORD_QUES},\n\t\t\t.speechLose = {EC_WORD_YOU, EC_WORD_SHOCKED, EC_WORD_ME, EC_WORD_OUT, EC_WORD_OF, EC_WORD_HAPPINESS},\n\t\t\t.speechAfter = {EC_WORD_NICE, EC_WORD_WORK, EC_WORD_YOU, EC_WORD_EXCL, EC_WORD_YOU_RE, EC_WORD_FABULOUS},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_VAPOREON,\n\t\t\t\t\t.heldItem = ITEM_CHERI_BERRY,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_SHADOW_BALL, MOVE_WISH},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 110,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 200,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x11, // FEMALE QUIET\n\t\t\t\t\t.nickname = _(\"VAPOREON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SLOWBRO,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_CONFUSION, MOVE_AMNESIA, MOVE_DISABLE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x91, // MALE CALM\n\t\t\t\t\t.nickname = _(\"SLOWBRO\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_POLITOED,\n\t\t\t\t\t.heldItem = ITEM_CHESTO_BERRY,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_HYPNOSIS, MOVE_SWAGGER},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 110,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x96, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"POLITOED\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TENTACRUEL,\n\t\t\t\t\t.heldItem = ITEM_POISON_BARB,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_SLUDGE_BOMB, MOVE_ICE_BEAM, MOVE_MIRROR_COAT},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 110,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 200,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x00, // FEMALE HARDY\n\t\t\t\t\t.nickname = _(\"TENTACRUEL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RATICATE,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_SUPER_FANG, MOVE_HYPER_FANG, MOVE_THUNDER_WAVE, MOVE_QUICK_ATTACK},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 200,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"RATICATE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_DUNSPARCE,\n\t\t\t\t\t.heldItem = ITEM_PERSIM_BERRY,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_YAWN},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x7F, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"DUNSPARCE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00016530\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Mixed_1 = {\n\t.id = 18,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_SINGLE,\n\t.prize = TTPRIZE_KINGS_ROCK,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"ALLYSON\"),\n\t\t\t.facilityClass = FACILITY_CLASS_COOLTRAINER_F,\n\t\t\t.textColor = 7,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_ABOUT, EC_WORD_TO, EC_WORD_LOSE, EC_WORD_TODAY},\n\t\t\t.speechWin = {EC_WORD_YES, EC_WORD_EXCL_EXCL, EC_WORD_I, EC_WORD_ADORE, EC_WORD_MYSELF, EC_WORD_TODAY},\n\t\t\t.speechLose = {EC_WORD_I_WAS, EC_WORD_CONFUSED, EC_WORD_ABOUT, EC_WORD_THINGS, EC_WORD_I, EC_WORD_THINK},\n\t\t\t.speechAfter = {EC_WORD_YOU_RE, EC_WORD_TOO, EC_WORD_STRONG, EC_WORD_TODAY, EC_WORD_THAT_S, EC_WORD_ALL},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_STARMIE,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_PSYCHIC, MOVE_THUNDER_WAVE, MOVE_RECOVER},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0F, // GENDERLESS MODEST\n\t\t\t\t\t.nickname = _(\"STARMIE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_BLASTOISE,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_HYDRO_PUMP, MOVE_ICE_BEAM, MOVE_EARTHQUAKE, MOVE_MIRROR_COAT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x32, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"BLASTOISE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_KINGDRA,\n\t\t\t\t\t.heldItem = ITEM_CHESTO_BERRY,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_DRAGON_BREATH, MOVE_REST},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8C, // MALE MODEST\n\t\t\t\t\t.nickname = _(\"KINGDRA\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_QUAGSIRE,\n\t\t\t\t\t.heldItem = ITEM_CHESTO_BERRY,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_ICE_BEAM, MOVE_REST},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 155,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"QUAGSIRE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_LAPRAS,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_PSYCHIC, MOVE_ATTRACT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"LAPRAS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_DRAGONITE,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_EARTHQUAKE, MOVE_LIGHT_SCREEN},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 155,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x96, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"DRAGONITE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00016e32\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Single_1 = {\n\t.id = 19,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_SINGLE,\n\t.prize = TTPRIZE_UP_GRADE,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"ALBERTO\"),\n\t\t\t.facilityClass = FACILITY_CLASS_SAILOR,\n\t\t\t.textColor = 5,\n\t\t\t.speechBefore = {EC_WORD_LET_S, EC_WORD_GET, EC_WORD_WITH, EC_WORD_IT, EC_WORD_RIGHT, EC_WORD_AWAY},\n\t\t\t.speechWin = {EC_WORD_YO, EC_WORD_EXCL_EXCL, EC_WORD_YOU, EC_WORD_GIVE_UP, EC_WORD_NOW, EC_WORD_EH_QUES},\n\t\t\t.speechLose = {EC_WORD_IT_S, EC_WORD_ALL, EC_WORD_OVER, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_SURRENDER},\n\t\t\t.speechAfter = {EC_WORD_OKAY, EC_WORD_I, EC_WORD_CONCEDE, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_LOST},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FERALIGATR,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_CRUNCH, MOVE_DRAGON_CLAW},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x32, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"FERALIGATR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_POLIWRATH,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_MEGA_KICK, MOVE_ROCK_TOMB},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x96, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"POLIWRATH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_KANGASKHAN,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_CRUSH_CLAW, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 130,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 125,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x03, // FEMALE ADAMANT\n\t\t\t\t\t.nickname = _(\"KANGASKHAN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MILTANK,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_SHADOW_BALL, MOVE_ROCK_TOMB, MOVE_MILK_DRINK},\n\t\t\t\t\t.hpEV = 155,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x03, // FEMALE ADAMANT\n\t\t\t\t\t.nickname = _(\"MILTANK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GOLDUCK,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_CROSS_CHOP, MOVE_SURF, MOVE_ICE_BEAM, MOVE_DISABLE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 210,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x96, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"GOLDUCK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GRANBULL,\n\t\t\t\t\t.heldItem = ITEM_LIECHI_BERRY,\n\t\t\t\t\t.moves = {MOVE_CRUNCH, MOVE_EARTHQUAKE, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 130,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 125,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0xCA, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"GRANBULL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00016890\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Mixed_5 = {\n\t.id = 20,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_DOUBLE,\n\t.prize = TTPRIZE_METAL_COAT,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"KAT & KIPP\"),\n\t\t\t.facilityClass = FACILITY_CLASS_SIS_AND_BRO,\n\t\t\t.textColor = 4,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_TRY, EC_WORD_MY, EC_WORD_BEST},\n\t\t\t.speechWin = {EC_WORD_WAY, EC_WORD_TO, EC_WORD_GO, EC_WORD_MY, EC_WORD_AWESOME, EC_WORD_BROTHER},\n\t\t\t.speechLose = {EC_WORD_SIGH, EC_WORD_ELLIPSIS, EC_WORD_THAT_S, EC_WORD_HOW, EC_WORD_IT, EC_WORD_GOES},\n\t\t\t.speechAfter = {EC_WORD_OKAY, EC_WORD_MY, EC_WORD_AWESOME, EC_WORD_BROTHER, EC_WORD_FIGHT, EC_WORD_FIGHT},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SNEASEL,\n\t\t\t\t\t.heldItem = ITEM_RAWST_BERRY,\n\t\t\t\t\t.moves = {MOVE_DIG, MOVE_TORMENT, MOVE_REFLECT, MOVE_TAUNT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0D, // FEMALE JOLLY\n\t\t\t\t\t.nickname = _(\"SNEASEL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_OMASTAR,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_DIVE, MOVE_LEER, MOVE_TICKLE, MOVE_SUPERSONIC},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x2D, // MALE CALM\n\t\t\t\t\t.nickname = _(\"OMASTAR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_DEWGONG,\n\t\t\t\t\t.heldItem = ITEM_PERSIM_BERRY,\n\t\t\t\t\t.moves = {MOVE_DIVE, MOVE_ENCORE, MOVE_GROWL, MOVE_SAFEGUARD},\n\t\t\t\t\t.hpEV = 200,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 210,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x14, // FEMALE CALM\n\t\t\t\t\t.nickname = _(\"DEWGONG\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_QUAGSIRE,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_DIVE, MOVE_YAWN, MOVE_AMNESIA, MOVE_SAFEGUARD},\n\t\t\t\t\t.hpEV = 200,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 110,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 200,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x91, // MALE CALM\n\t\t\t\t\t.nickname = _(\"QUAGSIRE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CORSOLA,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_DIG, MOVE_MIRROR_COAT, MOVE_RECOVER, MOVE_CONFUSE_RAY},\n\t\t\t\t\t.hpEV = 155,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x17, // FEMALE CAREFUL\n\t\t\t\t\t.nickname = _(\"CORSOLA\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SANDSLASH,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_DIG, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_SAND_ATTACK},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x94, // MALE CAREFUL\n\t\t\t\t\t.nickname = _(\"SANDSLASH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"KAT & KIPP\"),\n\t\t\t.facilityClass = FACILITY_CLASS_SIS_AND_BRO,\n\t\t\t.textColor = 4,\n\t\t\t.speechBefore = {EC_WORD_FUFUFU, EC_WORD_ELLIPSIS, EC_WORD_WE, EC_WORD_NEVER, EC_WORD_LOSE, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_FUFUFU, EC_WORD_ELLIPSIS, EC_WORD_WE_RE, EC_WORD_TOO_STRONG, EC_WORD_TO, EC_WORD_LOSE},\n\t\t\t.speechLose = {EC_WORD_WHAT, EC_WORD_HUH_QUES, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_JOKING, EC_WORD_QUES},\n\t\t\t.speechAfter = {EC_WORD_WAAAH, EC_WORD_WAAAH, EC_WORD_OH, EC_WORD_BIG, EC_WORD_SISTER, EC_WORD_EXCL},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FURRET,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_DIG, MOVE_AMNESIA, MOVE_DEFENSE_CURL, MOVE_FOLLOW_ME},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"FURRET\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_AZUMARILL,\n\t\t\t\t\t.heldItem = ITEM_WHITE_HERB,\n\t\t\t\t\t.moves = {MOVE_DIVE, MOVE_LIGHT_SCREEN, MOVE_TAIL_WHIP, MOVE_DEFENSE_CURL},\n\t\t\t\t\t.hpEV = 155,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x14, // FEMALE CALM\n\t\t\t\t\t.nickname = _(\"AZUMARILL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_KINGLER,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_DIVE, MOVE_HARDEN, MOVE_LEER, MOVE_AMNESIA},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x91, // MALE CALM\n\t\t\t\t\t.nickname = _(\"KINGLER\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CLOYSTER,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_DIVE, MOVE_WITHDRAW, MOVE_PROTECT, MOVE_SUPERSONIC},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x14, // FEMALE CALM\n\t\t\t\t\t.nickname = _(\"CLOYSTER\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_QUAGSIRE,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_DIG, MOVE_YAWN, MOVE_AMNESIA, MOVE_SAFEGUARD},\n\t\t\t\t\t.hpEV = 200,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 110,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 200,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x94, // MALE CAREFUL\n\t\t\t\t\t.nickname = _(\"QUAGSIRE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_KABUTOPS,\n\t\t\t\t\t.heldItem = ITEM_PECHA_BERRY,\n\t\t\t\t\t.moves = {MOVE_DIG, MOVE_SAND_ATTACK, MOVE_ENDURE, MOVE_CONFUSE_RAY},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x30, // MALE CAREFUL\n\t\t\t\t\t.nickname = _(\"KABUTOPS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00015d7c\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Double_8 = {\n\t.id = 21,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_DOUBLE,\n\t.prize = TTPRIZE_MENTAL_HERB,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"GEB&MEGAN\"),\n\t\t\t.facilityClass = FACILITY_CLASS_COOL_COUPLE,\n\t\t\t.textColor = 7,\n\t\t\t.speechBefore = {EC_WORD_YOU_RE, EC_WORD_OUR, EC_WORD_OPPONENT, EC_WORD_QUES, EC_WORD_PUSHOVER, EC_WORD_HAHAHA},\n\t\t\t.speechWin = {EC_WORD_HAHAHA, EC_WORD_SORRY, EC_WORD_MY, EC_WORD_FRIEND, EC_WORD_TOUGH, EC_WORD_LOSS},\n\t\t\t.speechLose = {EC_WORD_YOU_RE, EC_WORD_SERIOUS, EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_FRIEND, EC_WORD_QUES},\n\t\t\t.speechAfter = {EC_WORD_WON_T, EC_WORD_YOU, EC_WORD_GET, EC_WORD_LOST, EC_WORD_PLEASE, EC_WORD_QUES},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_POLITOED,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_HYPNOSIS, MOVE_PERISH_SONG, MOVE_SWAGGER},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x8C, // MALE MODEST\n\t\t\t\t\t.nickname = _(\"POLITOED\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GYARADOS,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_HYPER_BEAM, MOVE_DRAGON_DANCE, MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x96, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"GYARADOS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_LAPRAS,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_ICE_BEAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"LAPRAS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDOQUEEN,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_SUPERPOWER, MOVE_ROCK_SLIDE},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x00, // FEMALE HARDY\n\t\t\t\t\t.nickname = _(\"NIDOQUEEN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_JYNX,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_REFLECT, MOVE_LIGHT_SCREEN, MOVE_PSYCHIC},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x00, // FEMALE HARDY\n\t\t\t\t\t.nickname = _(\"JYNX\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GIRAFARIG,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_LIGHT_SCREEN, MOVE_CRUNCH, MOVE_PSYCHIC, MOVE_REFLECT},\n\t\t\t\t\t.hpEV = 210,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x8C, // MALE MODEST\n\t\t\t\t\t.nickname = _(\"GIRAFARIG\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"GEB&MEGAN\"),\n\t\t\t.facilityClass = FACILITY_CLASS_COOL_COUPLE,\n\t\t\t.textColor = 7,\n\t\t\t.speechBefore = {EC_WORD_YOU_RE, EC_WORD_OUR, EC_WORD_FOE, EC_WORD_QUES, EC_WORD_GIGGLE, EC_WORD_ELLIPSIS},\n\t\t\t.speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_SORRY, 0xFFFF},\n\t\t\t.speechLose = {EC_WORD_MY, EC_WORD_WORD, EC_WORD_THIS, EC_WORD_IS, EC_WORD_JUST, EC_WORD_INCREDIBLE},\n\t\t\t.speechAfter = {EC_WORD_WE, EC_WORD_NEED, EC_WORD_TO, EC_WORD_TRAIN, EC_WORD_SOME, EC_WORD_MORE},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAROWAK,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_AERIAL_ACE, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x94, // MALE CAREFUL\n\t\t\t\t\t.nickname = _(\"MAROWAK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_URSARING,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_AERIAL_ACE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"URSARING\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SLOWKING,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_PSYCHIC, MOVE_ICE_BEAM, MOVE_SHADOW_BALL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 110,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 200,\n\t\t\t\t\t.spDefenseEV = 200,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x11, // FEMALE QUIET\n\t\t\t\t\t.nickname = _(\"SLOWKING\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ALAKAZAM,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_PSYCHIC, MOVE_PROTECT, MOVE_LIGHT_SCREEN, MOVE_REFLECT},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 200,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x41, // MALE MODEST\n\t\t\t\t\t.nickname = _(\"ALAKAZAM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDOKING,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_MEGAHORN, MOVE_THUNDERBOLT, MOVE_ICE_BEAM},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x00, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"NIDOKING\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RHYDON,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_EARTHQUAKE, MOVE_PROTECT, MOVE_MEGAHORN, MOVE_ROCK_SLIDE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x93, // MALE SASSY\n\t\t\t\t\t.nickname = _(\"RHYDON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x000160f4\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Double_Unused1 = {\n\t.id = 22,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_DOUBLE,\n\t.prize = TTPRIZE_ZINC,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"LISA&LEAH\"),\n\t\t\t.facilityClass = FACILITY_CLASS_TWINS,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_ABSOLUTELY, EC_WORD_WE_RE, EC_WORD_GOING, EC_WORD_TO, EC_WORD_WIN, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_YEAH_YEAH, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF},\n\t\t\t.speechLose = {EC_WORD_AWW, EC_WORD_EXCL, EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF},\n\t\t\t.speechAfter = {EC_WORD_EXCUSE_ME, EC_WORD_BUT, EC_WORD_YOU_RE, EC_WORD_ALL, EC_WORD_TOO_STRONG, 0xFFFF},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_POLIWAG,\n\t\t\t\t\t.heldItem = ITEM_CHERI_BERRY,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_PROTECT, MOVE_TOXIC, MOVE_DOUBLE_TEAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x87, // MALE TIMID\n\t\t\t\t\t.nickname = _(\"POLIWAG\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SQUIRTLE,\n\t\t\t\t\t.heldItem = ITEM_MYSTIC_WATER,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_PROTECT, MOVE_TOXIC, MOVE_MIRROR_COAT},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x2D, // MALE CALM\n\t\t\t\t\t.nickname = _(\"SQUIRTLE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CHINCHOU,\n\t\t\t\t\t.heldItem = ITEM_MAGNET,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_THUNDER_WAVE, MOVE_CONFUSE_RAY, MOVE_THUNDERBOLT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"CHINCHOU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDORAN_F,\n\t\t\t\t\t.heldItem = ITEM_POISON_BARB,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_SLUDGE_BOMB, MOVE_CRUNCH, MOVE_DIG},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x00, // FEMALE HARDY\n\t\t\t\t\t.nickname = _(\"NIDORAN♀\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CLEFAIRY,\n\t\t\t\t\t.heldItem = ITEM_WHITE_HERB,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_SING, MOVE_MINIMIZE},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"CLEFAIRY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HORSEA,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_SMOKESCREEN, MOVE_ATTRACT, MOVE_DRAGON_RAGE},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x2D, // MALE CALM\n\t\t\t\t\t.nickname = _(\"HORSEA\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"LISA&LEAH\"),\n\t\t\t.facilityClass = FACILITY_CLASS_TWINS,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_CAN, EC_WORD_WE, EC_WORD_WIN, EC_WORD_QUES, EC_WORD_IT_S, EC_WORD_EXCITING},\n\t\t\t.speechWin = {EC_WORD_YEAH_YEAH, EC_WORD_EXCL_EXCL, EC_WORD_YOU, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_HAPPY},\n\t\t\t.speechLose = {EC_WORD_AWW, EC_WORD_EXCL, EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, 0xFFFF, 0xFFFF},\n\t\t\t.speechAfter = {EC_WORD_YOU, EC_WORD_SHOULD, EC_WORD_NOT, EC_MOVE2(BEAT_UP), EC_WORD_ON, EC_WORD_CHILDREN},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_WOOPER,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_YAWN, MOVE_FLASH},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x93, // MALE SASSY\n\t\t\t\t\t.nickname = _(\"WOOPER\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PSYDUCK,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_CROSS_CHOP, MOVE_HYPNOSIS, MOVE_DISABLE},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x96, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"PSYDUCK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SNUBBULL,\n\t\t\t\t\t.heldItem = ITEM_PECHA_BERRY,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_THUNDER_WAVE, MOVE_CRUNCH, MOVE_SHADOW_BALL},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x00, // FEMALE HARDY\n\t\t\t\t\t.nickname = _(\"SNUBBULL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_JIGGLYPUFF,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_THUNDER_WAVE, MOVE_SING, MOVE_DISABLE},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"JIGGLYPUFF\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDORAN_M,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_SLUDGE_BOMB, MOVE_HORN_DRILL, MOVE_DIG},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x00, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"NIDORAN♂\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TOTODILE,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_PROTECT, MOVE_TOXIC, MOVE_DOUBLE_TEAM},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x2D, // MALE CALM\n\t\t\t\t\t.nickname = _(\"TOTODILE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(15),\n\t},\n\t.checksum = 0x000197d4\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_7 = {\n\t.id = 23,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_KNOCKOUT,\n\t.prize = TTPRIZE_PROTEIN,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"PRISCILLA\"),\n\t\t\t.facilityClass = FACILITY_CLASS_TUBER,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_A_LITTLE, EC_WORD_POKEMON, EC_WORD_GIRL, EC_WORD_HERE_I_COME, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_WAAAH, EC_WORD_EXCL, EC_WORD_DID, EC_WORD_I, EC_WORD_WIN, EC_WORD_QUES},\n\t\t\t.speechLose = {EC_WORD_OH_DEAR, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_COULDN_T, EC_WORD_WIN, EC_WORD_ELLIPSIS},\n\t\t\t.speechAfter = {EC_WORD_YOU_RE, EC_WORD_A, EC_WORD_NICE, EC_WORD_TRAINER, EC_WORD_THANK_YOU, EC_WORD_EXCL},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GOLDEEN,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_MEGAHORN, MOVE_SUPERSONIC, MOVE_ICE_BEAM},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x96, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"GOLDEEN\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SEAKING,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_MEGAHORN, MOVE_HORN_DRILL, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x00, // FEMALE HARDY\n\t\t\t\t\t.nickname = _(\"SEAKING\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_LANTURN,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_ICE_BEAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 210,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8C, // MALE MODEST\n\t\t\t\t\t.nickname = _(\"LANTURN\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_LANTURN,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_HYDRO_PUMP, MOVE_THUNDER, MOVE_ICE_BEAM, MOVE_RAIN_DANCE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 210,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"LANTURN\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GOLDEEN,\n\t\t\t\t\t.heldItem = ITEM_APICOT_BERRY,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_DOUBLE_EDGE, MOVE_TOXIC, MOVE_PSYBEAM},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x00, // FEMALE HARDY\n\t\t\t\t\t.nickname = _(\"GOLDEEN\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SEAKING,\n\t\t\t\t\t.heldItem = ITEM_PETAYA_BERRY,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PSYBEAM},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x96, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"SEAKING\"),\n\t\t\t\t\t.friendship = 0\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"CHARLOTTE\"),\n\t\t\t.facilityClass = FACILITY_CLASS_LADY,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_HELLO, EC_WORD_THERE, EC_WORD_I_AM, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_LADY},\n\t\t\t.speechWin = {EC_WORD_OH, EC_WORD_MY, EC_WORD_MY, EC_WORD_ELLIPSIS, EC_WORD_I_AM, EC_WORD_SORRY},\n\t\t\t.speechLose = {EC_WORD_YOU_RE, EC_WORD_BETTER, EC_WORD_THAN, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_LADY},\n\t\t\t.speechAfter = {EC_WORD_HOHOHO, EC_WORD_THANK_YOU, EC_WORD_FOR, EC_WORD_AN, EC_WORD_AMUSING, EC_WORD_BATTLE},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_OCTILLERY,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_OCTAZOOKA, MOVE_ICE_BEAM, MOVE_PSYCHIC, MOVE_FLAMETHROWER},\n\t\t\t\t\t.hpEV = 55,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"OCTILLERY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_QWILFISH,\n\t\t\t\t\t.heldItem = ITEM_PERSIM_BERRY,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_TOXIC, MOVE_REVENGE, MOVE_DOUBLE_TEAM},\n\t\t\t\t\t.hpEV = 200,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 210,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x14, // FEMALE CALM\n\t\t\t\t\t.nickname = _(\"QWILFISH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_REMORAID,\n\t\t\t\t\t.heldItem = ITEM_PECHA_BERRY,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_PSYCHIC, MOVE_ICE_BEAM, MOVE_THUNDER_WAVE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x96, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"REMORAID\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_REMORAID,\n\t\t\t\t\t.heldItem = ITEM_WHITE_HERB,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_BLIZZARD, MOVE_FIRE_BLAST, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x00, // FEMALE HARDY\n\t\t\t\t\t.nickname = _(\"REMORAID\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_OCTILLERY,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_OCTAZOOKA, MOVE_SLUDGE_BOMB, MOVE_THUNDER_WAVE, MOVE_HYPER_BEAM},\n\t\t\t\t\t.hpEV = 155,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x93, // MALE SASSY\n\t\t\t\t\t.nickname = _(\"OCTILLERY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_QWILFISH,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_HYDRO_PUMP, MOVE_SLUDGE_BOMB, MOVE_SHADOW_BALL, MOVE_DESTINY_BOND},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 210,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x96, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"QWILFISH\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"SHANIA\"),\n\t\t\t.facilityClass = FACILITY_CLASS_SWIMMER_F,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_A, EC_WORD_POKEMON, EC_WORD_HEROINE, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM},\n\t\t\t.speechWin = {EC_WORD_AHAHA, EC_WORD_NO, EC_WORD_WAY, EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_SERIOUSLY},\n\t\t\t.speechLose = {EC_WORD_WHY, EC_WORD_QUES_EXCL, EC_WORD_YOU, EC_WORD_SHOULD, EC_WORD_NOT, EC_WORD_LIE},\n\t\t\t.speechAfter = {EC_WORD_NICE, EC_WORD_BATTLE, EC_WORD_THANKS, EC_WORD_FOR, EC_WORD_ENTERTAINING, EC_WORD_ME},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MANTINE,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_AERIAL_ACE, MOVE_ROCK_SLIDE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"MANTINE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGIKARP,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_SPLASH, MOVE_TACKLE, MOVE_NONE, MOVE_NONE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0D, // FEMALE JOLLY\n\t\t\t\t\t.nickname = _(\"MAGIKARP\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MANTINE,\n\t\t\t\t\t.heldItem = ITEM_MENTAL_HERB,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_CONFUSE_RAY, MOVE_ATTRACT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"MANTINE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GYARADOS,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_HYPER_BEAM, MOVE_THUNDER_WAVE, MOVE_EARTHQUAKE, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x03, // FEMALE ADAMANT\n\t\t\t\t\t.nickname = _(\"GYARADOS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGIKARP,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_FLAIL, MOVE_TACKLE, MOVE_NONE, MOVE_NONE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x94, // MALE CAREFUL\n\t\t\t\t\t.nickname = _(\"MAGIKARP\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GYARADOS,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_DOUBLE_EDGE, MOVE_THUNDER_WAVE, MOVE_EARTHQUAKE, MOVE_DRAGON_DANCE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"GYARADOS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t},\n\t.checksum = 0x0001521d\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_4 = {\n\t.id = 24,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_KNOCKOUT,\n\t.prize = TTPRIZE_DRAGON_SCALE,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"BRENNAN\"),\n\t\t\t.facilityClass = FACILITY_CLASS_SAILOR,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_TAKE, EC_WORD_THINGS, EC_WORD_EASY, EC_WORD_ELLIPSIS, EC_WORD_THAT_S, EC_WORD_IMPORTANT},\n\t\t\t.speechWin = {EC_WORD_YOU, EC_WORD_LOSE, EC_WORD_IF, EC_WORD_YOU, EC_WORD_GIVE_UP, EC_WORD_EXCL},\n\t\t\t.speechLose = {EC_WORD_OOPS, EC_WORD_YOU, EC_WORD_GOT, EC_WORD_AN, EC_WORD_EASY, EC_WORD_WIN},\n\t\t\t.speechAfter = {EC_WORD_I, EC_WORD_DON_T, EC_MOVE(GRUDGE), EC_WORD_YOU, EC_WORD_BUT, EC_WORD_ELLIPSIS},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_LAPRAS,\n\t\t\t\t\t.heldItem = ITEM_CHESTO_BERRY,\n\t\t\t\t\t.moves = {MOVE_HYDRO_PUMP, MOVE_PSYCHIC, MOVE_ATTRACT, MOVE_REST},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 15 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"LAPRAS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_KINGDRA,\n\t\t\t\t\t.heldItem = ITEM_CHESTO_BERRY,\n\t\t\t\t\t.moves = {MOVE_HYDRO_PUMP, MOVE_BLIZZARD, MOVE_DRAGON_BREATH, MOVE_REST},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8C, // MALE MODEST\n\t\t\t\t\t.nickname = _(\"KINGDRA\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MACHAMP,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_CROSS_CHOP, MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_HYPER_BEAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 130,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 125,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x4E, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"MACHAMP\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CHANSEY,\n\t\t\t\t\t.heldItem = ITEM_ORAN_BERRY,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_SOFT_BOILED, MOVE_MINIMIZE, MOVE_THUNDER_WAVE},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x05, // FEMALE BOLD\n\t\t\t\t\t.nickname = _(\"CHANSEY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TAUROS,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB, MOVE_SWAGGER},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x03, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"TAUROS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SNORLAX,\n\t\t\t\t\t.heldItem = ITEM_ORAN_BERRY,\n\t\t\t\t\t.moves = {MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_DOUBLE_TEAM, MOVE_REST},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x21, // MALE IMPISH\n\t\t\t\t\t.nickname = _(\"SNORLAX\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"KADEN\"),\n\t\t\t.facilityClass = FACILITY_CLASS_FISHERMAN,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_MY, EC_WORD_FISHING, EC_WORD_FASHION, EC_WORD_APPEAL, EC_WORD_IS, EC_WORD_FANTASTIC},\n\t\t\t.speechWin = {EC_WORD_MY, EC_WORD_FANTASTIC, EC_WORD_FASHION, EC_WORD_APPEAL, EC_WORD_WINS, EC_WORD_OUT},\n\t\t\t.speechLose = {EC_WORD_UH_OH, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_SEE, EC_WORD_I, EC_WORD_LOST},\n\t\t\t.speechAfter = {EC_WORD_FASHION, EC_WORD_APPEAL, EC_WORD_WON_T, EC_WORD_GET, EC_WORD_ME, EC_WORD_WINS},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CHINCHOU,\n\t\t\t\t\t.heldItem = ITEM_MAGNET,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_CONFUSE_RAY, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 100,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x00, // FEMALE HARDY\n\t\t\t\t\t.nickname = _(\"CHINCHOU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_DRATINI,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_THUNDER_WAVE, MOVE_DRAGON_BREATH, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x00, // FEMALE HARDY\n\t\t\t\t\t.nickname = _(\"DRATINI\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SLOWPOKE,\n\t\t\t\t\t.heldItem = ITEM_PECHA_BERRY,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_YAWN, MOVE_DISABLE, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x96, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"SLOWPOKE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGIKARP,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_SPLASH, MOVE_FLAIL, MOVE_TACKLE, MOVE_NONE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 23 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x17, // FEMALE CAREFUL\n\t\t\t\t\t.nickname = _(\"MAGIKARP\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_SEAKING,\n\t\t\t\t\t.heldItem = ITEM_CHERI_BERRY,\n\t\t\t\t\t.moves = {MOVE_HORN_DRILL, MOVE_MEGAHORN, MOVE_SUPERSONIC, MOVE_AGILITY},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 23 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x17, // FEMALE CAREFUL\n\t\t\t\t\t.nickname = _(\"SEAKING\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TENTACRUEL,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_MIRROR_COAT, MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_TOXIC},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x96, // MALE HARDY\n\t\t\t\t\t.nickname = _(\"TENTACRUEL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"EMANUEL\"),\n\t\t\t.facilityClass = FACILITY_CLASS_GENTLEMAN,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_HMM, EC_WORD_QUES, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_SKILLED, EC_WORD_QUES},\n\t\t\t.speechWin = {EC_WORD_I, EC_WORD_SEE, EC_WORD_I, EC_WORD_WASN_T, EC_WORD_RIGHT, EC_WORD_ELLIPSIS},\n\t\t\t.speechLose = {EC_WORD_YOU, EC_WORD_TRULY, EC_WORD_ARE, EC_WORD_A, EC_WORD_MASTER, EC_WORD_TRAINER},\n\t\t\t.speechAfter = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_THAT, EC_WORD_I_WAS, EC_WORD_YOUR, EC_WORD_OPPONENT},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_VAPOREON,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_ATTRACT, MOVE_BITE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x14, // FEMALE CALM\n\t\t\t\t\t.nickname = _(\"VAPOREON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ESPEON,\n\t\t\t\t\t.heldItem = ITEM_CHESTO_BERRY,\n\t\t\t\t\t.moves = {MOVE_PSYCHIC, MOVE_BITE, MOVE_REFLECT, MOVE_REST},\n\t\t\t\t\t.hpEV = 110,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 200,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"ESPEON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_BLISSEY,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_WATER_PULSE, MOVE_MINIMIZE, MOVE_THUNDER_WAVE, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x05, // FEMALE BOLD\n\t\t\t\t\t.nickname = _(\"BLISSEY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_STARMIE,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_ICE_BEAM, MOVE_RECOVER, MOVE_PSYCHIC},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 20 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x14, // GENDERLESS CALM\n\t\t\t\t\t.nickname = _(\"STARMIE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PERSIAN,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_SLASH, MOVE_SWAGGER, MOVE_PSYCH_UP, MOVE_FAKE_OUT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 130,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 125,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0D, // FEMALE JOLLY\n\t\t\t\t\t.nickname = _(\"PERSIAN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_AZUMARILL,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_SURF, MOVE_ENCORE, MOVE_ATTRACT, MOVE_DIG},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x00, // FEMALE HARDY\n\t\t\t\t\t.nickname = _(\"AZUMARILL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t},\n\t.checksum = 0x0001554b\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Single_3 = {\n\t.id = 25,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_SINGLE,\n\t.prize = TTPRIZE_METAL_COAT,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"JARRETT\"),\n\t\t\t.facilityClass = FACILITY_CLASS_JUGGLER,\n\t\t\t.textColor = 2,\n\t\t\t.speechBefore = {EC_WORD_LET_S, EC_WORD_HAVE, EC_WORD_AN, EC_MOVE2(EXPLOSION), EC_WORD_PARTY, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_CONGRATS, EC_WORD_FOR, EC_WORD_YOUR, EC_WORD_LOSS, EC_WORD_PARTY, EC_WORD_KID},\n\t\t\t.speechLose = {EC_WORD_NICE, EC_MOVE(SELF_DESTRUCT), EC_WORD_THERE, EC_WORD_EXCL, EC_WORD_YOU_RE, EC_WORD_PERFECT},\n\t\t\t.speechAfter = {EC_WORD_WANT, EC_WORD_TO, EC_WORD_PARTY, EC_WORD_SOME, EC_WORD_MORE, EC_WORD_QUES},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ELECTRODE,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_EXPLOSION, MOVE_LIGHT_SCREEN, MOVE_SCREECH, MOVE_THUNDERBOLT},\n\t\t\t\t\t.hpEV = 10,\n\t\t\t\t\t.attackEV = 150,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 150,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0D, // GENDERLESS JOLLY\n\t\t\t\t\t.nickname = _(\"ELECTRODE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_VOLTORB,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_EXPLOSION, MOVE_FLASH, MOVE_DOUBLE_TEAM, MOVE_THUNDER},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0D, // GENDERLESS JOLLY\n\t\t\t\t\t.nickname = _(\"VOLTORB\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_WEEZING,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_EXPLOSION, MOVE_SLUDGE_BOMB, MOVE_DESTINY_BOND, MOVE_THUNDERBOLT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 200,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"WEEZING\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GOLEM,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_EXPLOSION, MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 150,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x7F, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"GOLEM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_EXEGGCUTE,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_EXPLOSION, MOVE_STUN_SPORE, MOVE_HYPNOSIS, MOVE_GIGA_DRAIN},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"EXEGGCUTE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FORRETRESS,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_EXPLOSION, MOVE_GIGA_DRAIN, MOVE_DIG, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x84, // MALE RELAXED\n\t\t\t\t\t.nickname = _(\"FORRETRESS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00015b6a\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Mixed_3 = {\n\t.id = 26,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_SINGLE,\n\t.prize = TTPRIZE_DRAGON_SCALE,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"OWEN\"),\n\t\t\t.facilityClass = FACILITY_CLASS_SUPER_NERD,\n\t\t\t.textColor = 2,\n\t\t\t.speechBefore = {EC_WORD_HERE_IT_IS, EC_MOVE2(THUNDER_WAVE), EC_WORD_DON_T, EC_MOVE2(WRAP), EC_WORD_ME, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_ACCEPT, EC_WORD_MY, EC_MOVE2(PRESENT), EC_WORD_OF, EC_MOVE2(THUNDER_WAVE), EC_WORD_EXCL},\n\t\t\t.speechLose = {EC_MOVE2(WRAP), EC_MOVE(BIND), EC_WORD_ELECTRIC, EC_MOVE2(WHIRLWIND), EC_WORD_SPIRALING, EC_WORD_AROUND},\n\t\t\t.speechAfter = {EC_MOVE2(WHIRLWIND), EC_WORD_SPIRALING, 0xFFFF, 0xFFFF, EC_WORD_SPIRALING, EC_MOVE2(WHIRLWIND)},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGNETON,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_PROTECT, MOVE_ZAP_CANNON, MOVE_TOXIC, MOVE_SUPERSONIC},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 125,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 130,\n\t\t\t\t\t.otId = 10 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0A, // GENDERLESS TIMID\n\t\t\t\t\t.nickname = _(\"MAGNETON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PIKACHU,\n\t\t\t\t\t.heldItem = ITEM_LIGHT_BALL,\n\t\t\t\t\t.moves = {MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_DOUBLE_TEAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 150,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 105,\n\t\t\t\t\t.otId = 15 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"PIKACHU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_JOLTEON,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_DOUBLE_TEAM, MOVE_TOXIC},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x37, // MALE BOLD\n\t\t\t\t\t.nickname = _(\"JOLTEON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_BLISSEY,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDER_WAVE, MOVE_BLIZZARD, MOVE_WATER_PULSE, MOVE_REST},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x05, // FEMALE BOLD\n\t\t\t\t\t.nickname = _(\"BLISSEY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PORYGON2,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDER_WAVE, MOVE_ZAP_CANNON, MOVE_PSYCHIC, MOVE_RECOVER},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 125,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 130,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x05, // GENDERLESS BOLD\n\t\t\t\t\t.nickname = _(\"PORYGON2\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PORYGON,\n\t\t\t\t\t.heldItem = ITEM_LAX_INCENSE,\n\t\t\t\t\t.moves = {MOVE_THUNDER_WAVE, MOVE_ZAP_CANNON, MOVE_DOUBLE_TEAM, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 5 | (0 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x05, // GENDERLESS BOLD\n\t\t\t\t\t.nickname = _(\"PORYGON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x000160ec\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Mixed_2 = {\n\t.id = 27,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_SINGLE,\n\t.prize = TTPRIZE_PROTEIN,\n\t.trainers = {\n\t    {\n\t\t\t.name = _(\"LORENZO\"),\n\t\t\t.facilityClass = FACILITY_CLASS_PSYCHIC_M,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_THIS, EC_WORD_POWER, EC_WORD_IS, EC_WORD_NOW, EC_WORD_COMPLETE, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_NO, EC_WORD_KEEN_EYE, EC_WORD_CAN, EC_WORD_STOP, EC_WORD_MY, EC_WORD_POWER},\n\t\t\t.speechLose = {EC_WORD_HERE_IT_IS, EC_WORD_EXCL, EC_MOVE(KINESIS), EC_WORD_EXCL, EC_WORD_ELLIPSIS, EC_WORD_WHAT},\n\t\t\t.speechAfter = {EC_WORD_I, EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_THE, EC_MOVE(KINESIS), EC_WORD_HALL_OF_FAME},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MR_MIME,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_LIGHT_SCREEN, MOVE_REFLECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"MR. MIME\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HYPNO,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDER_PUNCH, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_PSYCHIC},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 200,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8C, // MALE MODEST\n\t\t\t\t\t.nickname = _(\"HYPNO\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ALAKAZAM,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_THUNDER_PUNCH, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_PSYCHIC},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 150,\n\t\t\t\t\t.spAttackEV = 155,\n\t\t\t\t\t.spDefenseEV = 50,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"ALAKAZAM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GENGAR,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_SHADOW_BALL, MOVE_HYPNOSIS, MOVE_TOXIC},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 200,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 55,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x88, // MALE HASTY\n\t\t\t\t\t.nickname = _(\"GENGAR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GIRAFARIG,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_CRUNCH, MOVE_BODY_SLAM, MOVE_REST},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 155,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x03, // FEMALE ADAMANT\n\t\t\t\t\t.nickname = _(\"GIRAFARIG\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_STARMIE,\n\t\t\t\t\t.heldItem = ITEM_APICOT_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_SURF, MOVE_RECOVER, MOVE_ICE_BEAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 55,\n\t\t\t\t\t.speedEV = 250,\n\t\t\t\t\t.spAttackEV = 150,\n\t\t\t\t\t.spDefenseEV = 55,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // GENDERLESS TIMID\n\t\t\t\t\t.nickname = _(\"STARMIE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x0001624b\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Double_Unused2 = {\n\t.id = 28,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_DOUBLE,\n\t.prize = TTPRIZE_SCOPE_LENS,\n\t.trainers = {\n\t\t{\n\t\t\t.name = _(\"NIA & CARL\"),\n\t\t\t.facilityClass = FACILITY_CLASS_COOL_COUPLE,\n\t\t\t.textColor = 4,\n\t\t\t.speechBefore = {EC_WORD_HERE_GOES, EC_WORD_MY, EC_WORD_DIGITAL, EC_WORD_ROMANTIC, EC_WORD_HERO, EC_WORD_STRATEGY},\n\t\t\t.speechWin = {EC_WORD_THAT_S, EC_WORD_THE, EC_WORD_DIGITAL, EC_WORD_HYPER, EC_WORD_MODE, EC_WORD_POWER},\n\t\t\t.speechLose = {EC_WORD_MY, EC_WORD_PERFECT, EC_WORD_STRATEGY, EC_WORD_WAS, EC_MOVE2(BEAT_UP), EC_WORD_QUES},\n\t\t\t.speechAfter = {EC_WORD_MY, EC_WORD_INVINCIBLE, EC_WORD_STRATEGY, EC_WORD_WAS, EC_WORD_DESTROYED, EC_WORD_ELLIPSIS},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MUK,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_SHADOW_BALL, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"MUK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GENGAR,\n\t\t\t\t\t.heldItem = ITEM_PETAYA_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_CONFUSE_RAY, MOVE_PSYCHIC, MOVE_EXPLOSION},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 155,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x15, // FEMALE GENTLE\n\t\t\t\t\t.nickname = _(\"GENGAR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ALAKAZAM,\n\t\t\t\t\t.heldItem = ITEM_GANLON_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDER_PUNCH, MOVE_PSYCHIC, MOVE_RECOVER, MOVE_REFLECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // FEMALE TIMID\n\t\t\t\t\t.nickname = _(\"ALAKAZAM\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_JOLTEON,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_FLAIL, MOVE_THUNDER_WAVE, MOVE_DOUBLE_TEAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 50,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 160,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x05, // FEMALE BOLD\n\t\t\t\t\t.nickname = _(\"JOLTEON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ELECTRODE,\n\t\t\t\t\t.heldItem = ITEM_LIECHI_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_EXPLOSION, MOVE_MIRROR_COAT, MOVE_LIGHT_SCREEN},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 55,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x14, // GENDERLESS CALM\n\t\t\t\t\t.nickname = _(\"ELECTRODE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RAICHU,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_COUNTER, MOVE_REVERSAL, MOVE_LIGHT_SCREEN},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 55,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x02, // FEMALE BRAVE\n\t\t\t\t\t.nickname = _(\"RAICHU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"NIA & CARL\"),\n\t\t\t.facilityClass = FACILITY_CLASS_COOL_COUPLE,\n\t\t\t.textColor = 4,\n\t\t\t.speechBefore = {EC_WORD_MASTER, EC_WORD_COMPLETE, EC_WORD_FASHION, EC_WORD_SYSTEM, EC_WORD_START, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_THAT_S_IT_EXCL, EC_WORD_THE, EC_WORD_POWER, EC_WORD_OF, EC_WORD_OUR, EC_WORD_SYSTEM},\n\t\t\t.speechLose = {EC_WORD_OKAY, EC_WORD_EXCL, EC_MOVE(THUNDERBOLT), EC_WORD_RUN_AWAY, EC_WORD_SYSTEM, EC_WORD_START},\n\t\t\t.speechAfter = {EC_WORD_GO, EC_WORD_ON, EC_WORD_PLEASE, EC_WORD_EXCL, EC_WORD_TCH, EC_WORD_ELLIPSIS},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_KANGASKHAN,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_SHADOW_BALL, MOVE_REVERSAL, MOVE_ENDURE, MOVE_FAKE_OUT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 105,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 150,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x03, // FEMALE ADAMANT\n\t\t\t\t\t.nickname = _(\"KANGASKHAN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TAUROS,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_DOUBLE_EDGE, MOVE_ROCK_TOMB, MOVE_SURF, MOVE_REST},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x03, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"TAUROS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MILTANK,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_BODY_SLAM, MOVE_SHADOW_BALL, MOVE_MILK_DRINK, MOVE_ROCK_TOMB},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 155,\n\t\t\t\t\t.defenseEV = 50,\n\t\t\t\t\t.speedEV = 250,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 55,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x03, // FEMALE ADAMANT\n\t\t\t\t\t.nickname = _(\"MILTANK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RHYDON,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_MEGAHORN, MOVE_HORN_DRILL, MOVE_ROCK_TOMB},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"RHYDON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_DRAGONITE,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_BLIZZARD, MOVE_SURF, MOVE_OUTRAGE, MOVE_FLAMETHROWER},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x91, // MALE CALM\n\t\t\t\t\t.nickname = _(\"DRAGONITE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_LAPRAS,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_BLIZZARD, MOVE_SURF, MOVE_HORN_DRILL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 31,\n\t\t\t\t\t.attackIV = 31,\n\t\t\t\t\t.defenseIV = 31,\n\t\t\t\t\t.speedIV = 31,\n\t\t\t\t\t.spAttackIV = 31,\n\t\t\t\t\t.spDefenseIV = 31,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x91, // MALE CALM\n\t\t\t\t\t.nickname = _(\"LAPRAS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00016360\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Double_7 = {\n\t.id = 29,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_DOUBLE,\n\t.prize = TTPRIZE_CARBOS,\n\t.trainers = {\n\t\t{\n\t\t\t.name = _(\"AXE & REN\"),\n\t\t\t.facilityClass = FACILITY_CLASS_SIS_AND_BRO,\n\t\t\t.textColor = 2,\n\t\t\t.speechBefore = {EC_WORD_IT_S, EC_WORD_GOING, EC_WORD_TO, EC_WORD_GET, EC_WORD_AWFULLY, EC_WORD_COLD},\n\t\t\t.speechWin = {EC_WORD_THAT_S, EC_WORD_THAT, EC_WORD_MAN, EC_WORD_I_AM, EC_WORD_COLD, EC_WORD_EXCL},\n\t\t\t.speechLose = {EC_WORD_I, EC_WORD_CAN_T_WIN, EC_WORD_IN, EC_WORD_THIS, EC_MOVE(SHEER_COLD), EC_WORD_ELLIPSIS},\n\t\t\t.speechAfter = {EC_WORD_THIS, EC_MOVE(SHEER_COLD), EC_WORD_HAS, EC_WORD_ME, EC_WORD_FEELING, EC_WORD_SHAKY},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_LANTURN,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_THUNDER, MOVE_ICE_BEAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // FEMALE TIMID\n\t\t\t\t\t.nickname = _(\"LANTURN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MANTINE,\n\t\t\t\t\t.heldItem = ITEM_PETAYA_BERRY,\n\t\t\t\t\t.moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_CONFUSE_RAY, MOVE_ICE_BEAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 155,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x14, // FEMALE CALM\n\t\t\t\t\t.nickname = _(\"MANTINE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_DEWGONG,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_SHEER_COLD, MOVE_BLIZZARD},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 55,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x11, // FEMALE QUIET\n\t\t\t\t\t.nickname = _(\"DEWGONG\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CLOYSTER,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_ICE_BEAM, MOVE_HYPER_BEAM},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x11, // FEMALE QUIET\n\t\t\t\t\t.nickname = _(\"CLOYSTER\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TENTACRUEL,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_GIGA_DRAIN, MOVE_SLUDGE_BOMB},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 55,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // FEMALE TIMID\n\t\t\t\t\t.nickname = _(\"TENTACRUEL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GYARADOS,\n\t\t\t\t\t.heldItem = ITEM_LIECHI_BERRY,\n\t\t\t\t\t.moves = {MOVE_RAIN_DANCE, MOVE_SURF, MOVE_DRAGON_DANCE, MOVE_RETURN},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x03, // FEMALE ADAMANT\n\t\t\t\t\t.nickname = _(\"GYARADOS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"AXE & REN\"),\n\t\t\t.facilityClass = FACILITY_CLASS_SIS_AND_BRO,\n\t\t\t.textColor = 2,\n\t\t\t.speechBefore = {EC_WORD_OUR, EC_WORD_SWIFT_SWIM, EC_WORD_LEFT, EC_WORD_ME, EC_WORD_FEELING, EC_WORD_COLD},\n\t\t\t.speechWin = {EC_WORD_I, EC_WORD_WON, EC_WORD_BUT, EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_HOT},\n\t\t\t.speechLose = {EC_WORD_I_AM, EC_WORD_HUNGRY, EC_WORD_FOR, EC_WORD_ANY, EC_WORD_HOT, EC_WORD_EATS},\n\t\t\t.speechAfter = {EC_WORD_SISTER, EC_WORD_I, EC_WORD_NEED, EC_WORD_SOMETHING, EC_WORD_HOT, EC_WORD_PLEASE},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ELECTABUZZ,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_THUNDER, MOVE_PSYCHIC, MOVE_CROSS_CHOP, MOVE_LIGHT_SCREEN},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 155,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x40, // MALE NAIVE\n\t\t\t\t\t.nickname = _(\"ELECTABUZZ\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGNETON,\n\t\t\t\t\t.heldItem = ITEM_PETAYA_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDER, MOVE_SONIC_BOOM, MOVE_METAL_SOUND, MOVE_REFLECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0A, // GENDERLESS TIMID\n\t\t\t\t\t.nickname = _(\"MAGNETON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PORYGON,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_THUNDER, MOVE_PSYCHIC, MOVE_BLIZZARD, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 255,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x11, // GENDERLESS QUIET\n\t\t\t\t\t.nickname = _(\"PORYGON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_DRAGONAIR,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_THUNDER, MOVE_SURF, MOVE_BLIZZARD, MOVE_OUTRAGE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 50,\n\t\t\t\t\t.speedEV = 155,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 50,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // FEMALE TIMID\n\t\t\t\t\t.nickname = _(\"DRAGONAIR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PERSIAN,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_THUNDER, MOVE_FAKE_OUT, MOVE_WATER_PULSE, MOVE_RETURN},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 155,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 200,\n\t\t\t\t\t.spAttackEV = 155,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0B, // FEMALE HASTY\n\t\t\t\t\t.nickname = _(\"PERSIAN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_STARMIE,\n\t\t\t\t\t.heldItem = ITEM_GANLON_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDER, MOVE_SURF, MOVE_RECOVER, MOVE_REFLECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 95,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 60,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x05, // GENDERLESS BOLD\n\t\t\t\t\t.nickname = _(\"STARMIE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00015272\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Double_Unused3 = {\n\t.id = 30,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_DOUBLE,\n\t.prize = TTPRIZE_ZINC,\n\t.trainers = {\n\t\t{\n\t\t\t.name = _(\"KATI & GEB\"),\n\t\t\t.facilityClass = FACILITY_CLASS_YOUNG_COUPLE,\n\t\t\t.textColor = 2,\n\t\t\t.speechBefore = {EC_WORD_WELCOME, EC_WORD_TO, EC_WORD_OUR, EC_WORD_LOVEY_DOVEY, EC_MOVE2(THUNDER_WAVE), EC_MOVE(SANDSTORM)},\n\t\t\t.speechWin = {EC_WORD_LALALA, EC_WORD_LALALA, EC_WORD_OUR, EC_WORD_LOVEY_DOVEY, EC_WORD_LALALA, EC_WORD_LIFE},\n\t\t\t.speechLose = {EC_WORD_I, EC_WORD_NEED, EC_WORD_TO, EC_WORD_LOSE, EC_WORD_MY, EC_MOVE2(FRUSTRATION)},\n\t\t\t.speechAfter = {EC_WORD_YOU_RE, EC_WORD_JUST, EC_WORD_A_LITTLE, EC_WORD_KID, EC_WORD_AHAHA, EC_WORD_EXCL},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FLAAFFY,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_THUNDERBOLT, MOVE_REFLECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x84, // MALE RELAXED\n\t\t\t\t\t.nickname = _(\"FLAAFFY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_QUAGSIRE,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_SURF, MOVE_AMNESIA, MOVE_BLIZZARD},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x93, // MALE SASSY\n\t\t\t\t\t.nickname = _(\"QUAGSIRE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PIKACHU,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_REVERSAL, MOVE_THUNDERBOLT, MOVE_IRON_TAIL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 155,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8A, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"PIKACHU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ELECTABUZZ,\n\t\t\t\t\t.heldItem = ITEM_LIECHI_BERRY,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_COUNTER, MOVE_ICE_PUNCH, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 150,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 105,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x46, // MALE CALM\n\t\t\t\t\t.nickname = _(\"ELECTABUZZ\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TOGETIC,\n\t\t\t\t\t.heldItem = ITEM_KINGS_ROCK,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_ANCIENT_POWER, MOVE_WATER_PULSE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x2D, // MALE CALM\n\t\t\t\t\t.nickname = _(\"TOGETIC\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GOLDUCK,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_SURF, MOVE_DIG, MOVE_CROSS_CHOP},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 155,\n\t\t\t\t\t.defenseEV = 50,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 50,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"GOLDUCK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"KATI & GEB\"),\n\t\t\t.facilityClass = FACILITY_CLASS_YOUNG_COUPLE,\n\t\t\t.textColor = 2,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_PLUS, EC_WORD_YOU_RE, EC_WORD_MINUS, EC_WORD_LOVEY_DOVEY, EC_WORD_MAGNET_PULL},\n\t\t\t.speechWin = {EC_WORD_DON_T, EC_WORD_STOP, EC_WORD_OUR, EC_WORD_LOVEY_DOVEY, EC_WORD_LOCOMOTIVE, EC_WORD_EXCL},\n\t\t\t.speechLose = {EC_WORD_HIS, EC_WORD_CRY, EC_WORD_HAS, EC_WORD_CUTE_CHARM, EC_WORD_TOO, EC_WORD_EXCL},\n\t\t\t.speechAfter = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_TIME, EC_WORD_TO, EC_WORD_TALK, EC_WORD_QUES},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PICHU,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_SWEET_KISS, MOVE_REVERSAL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x03, // FEMALE ADAMANT\n\t\t\t\t\t.nickname = _(\"PICHU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ELEKID,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_DOUBLE_TEAM, MOVE_FOCUS_PUNCH},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 130,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 125,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x02, // FEMALE BRAVE\n\t\t\t\t\t.nickname = _(\"ELEKID\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_TOGEPI,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_YAWN, MOVE_WATER_PULSE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"TOGEPI\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PSYDUCK,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_DIG, MOVE_DIVE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"PSYDUCK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAREEP,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_LIGHT_SCREEN, MOVE_THUNDERBOLT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"MAREEP\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_WOOPER,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_ATTRACT, MOVE_PROTECT, MOVE_SURF, MOVE_YAWN},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 10,\n\t\t\t\t\t.attackIV = 10,\n\t\t\t\t\t.defenseIV = 10,\n\t\t\t\t\t.speedIV = 10,\n\t\t\t\t\t.spAttackIV = 10,\n\t\t\t\t\t.spDefenseIV = 10,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"WOOPER\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tDUMMY_TOWER_TEAM(0),\n\t},\n\t.checksum = 0x00015966\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_6 = {\n\t.id = 31,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_KNOCKOUT,\n\t.prize = TTPRIZE_WHITE_HERB,\n\t.trainers = {\n\t\t{\n\t\t\t.name = _(\"BEN\"),\n\t\t\t.facilityClass = FACILITY_CLASS_ROCKER,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_LALALA, EC_WORD_LET_S, EC_MOVE(SING), EC_WORD_ABOUT, EC_WORD_ELECTRIC, EC_WORD_POWER},\n\t\t\t.speechWin = {EC_WORD_STATIC, EC_WORD_IS, EC_WORD_ELECTRIC, EC_WORD_YES, EC_WORD_IT, EC_WORD_IS},\n\t\t\t.speechLose = {EC_WORD_ELECTRIC, EC_WORD_ABOUT, EC_WORD_MY, EC_WORD_DIGITAL, EC_WORD_TELEVISION, EC_WORD_I_AM},\n\t\t\t.speechAfter = {EC_WORD_ELECTRIC, EC_WORD_EXCL, EC_WORD_IT_S, EC_WORD_A, EC_WORD_NATURAL, EC_WORD_POWER},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ELECTRODE,\n\t\t\t\t\t.heldItem = ITEM_LIECHI_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_MIRROR_COAT, MOVE_EXPLOSION, MOVE_THUNDER_WAVE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 55,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x14, // GENDERLESS CALM\n\t\t\t\t\t.nickname = _(\"ELECTRODE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_ELECTABUZZ,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_FIRE_PUNCH, MOVE_PSYCHIC, MOVE_ICE_PUNCH},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 155,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0F, // FEMALE MODEST\n\t\t\t\t\t.nickname = _(\"ELECTABUZZ\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_LANTURN,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_DOUBLE_EDGE, MOVE_ICE_BEAM, MOVE_HYDRO_PUMP},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 125,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 130,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8E, // MALE QUIET\n\t\t\t\t\t.nickname = _(\"LANTURN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAGNETON,\n\t\t\t\t\t.heldItem = ITEM_LIECHI_BERRY,\n\t\t\t\t\t.moves = {MOVE_ZAP_CANNON, MOVE_HYPER_BEAM, MOVE_LOCK_ON, MOVE_SUPERSONIC},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 55,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x14, // GENDERLESS CALM\n\t\t\t\t\t.nickname = _(\"MAGNETON\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RAICHU,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_DOUBLE_EDGE, MOVE_MEGA_KICK, MOVE_REVERSAL, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 80,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 75,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x8A, // MALE JOLLY\n\t\t\t\t\t.nickname = _(\"RAICHU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_AMPHAROS,\n\t\t\t\t\t.heldItem = ITEM_SHELL_BELL,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_MEGA_KICK, MOVE_COUNTER, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 200,\n\t\t\t\t\t.defenseEV = 150,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 10,\n\t\t\t\t\t.spDefenseEV = 150,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"AMPHAROS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"CAMDEN\"),\n\t\t\t.facilityClass = FACILITY_CLASS_ENGINEER,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_LALALA, EC_WORD_LET_S, EC_MOVE(SING), EC_WORD_ABOUT, EC_WORD_ELECTRIC, EC_WORD_POWER},\n\t\t\t.speechWin = {EC_WORD_A, EC_MOVE(THUNDERBOLT), EC_WORD_IS, EC_WORD_ELECTRIC, EC_WORD_TOO, EC_WORD_EXCL},\n\t\t\t.speechLose = {EC_WORD_ELECTRIC, EC_WORD_EXCL, EC_WORD_IT_S, EC_WORD_ABOUT, EC_WORD_WIRELESS, EC_WORD_LINK},\n\t\t\t.speechAfter = {EC_WORD_ELECTRIC, EC_WORD_EXCL, EC_WORD_IT_S, EC_WORD_A, EC_WORD_TREASURE, EC_WORD_EXCL},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GRANBULL,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_CRUNCH, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 55,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x02, // FEMALE BRAVE\n\t\t\t\t\t.nickname = _(\"GRANBULL\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PERSIAN,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_WATER_PULSE, MOVE_HYPNOSIS, MOVE_SLASH},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 55,\n\t\t\t\t\t.speedEV = 255,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"PERSIAN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_LICKITUNG,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_PROTECT, MOVE_SURF, MOVE_EARTHQUAKE, MOVE_SHADOW_BALL},\n\t\t\t\t\t.hpEV = 200,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 55,\n\t\t\t\t\t.spDefenseEV = 0,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x02, // FEMALE BRAVE\n\t\t\t\t\t.nickname = _(\"LICKITUNG\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RATICATE,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_HYPER_FANG, MOVE_SUPER_FANG, MOVE_REVERSAL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 50,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 105,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x94, // MALE CAREFUL\n\t\t\t\t\t.nickname = _(\"RATICATE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PRIMEAPE,\n\t\t\t\t\t.heldItem = ITEM_SCOPE_LENS,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_CROSS_CHOP, MOVE_EARTHQUAKE, MOVE_ROCK_TOMB},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 130,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 125,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x02, // FEMALE BRAVE\n\t\t\t\t\t.nickname = _(\"PRIMEAPE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_KANGASKHAN,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_SURF, MOVE_CRUSH_CLAW, MOVE_REST},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 100,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x11, // FEMALE QUIET\n\t\t\t\t\t.nickname = _(\"KANGASKHAN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"ZACKERY\"),\n\t\t\t.facilityClass = FACILITY_CLASS_SCIENTIST,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_LALALA, EC_WORD_LET_S, EC_MOVE(SING), EC_WORD_ABOUT, EC_WORD_ELECTRIC, EC_WORD_POWER},\n\t\t\t.speechWin = {EC_MOVE2(THUNDER_SHOCK), EC_WORD_IS, EC_WORD_ELECTRIC, EC_WORD_YOU, EC_WORD_KNOW, EC_WORD_QUES},\n\t\t\t.speechLose = {EC_WORD_ELECTRIC, EC_WORD_EXCL, EC_MOVE2(FLASH), EC_MOVE2(FLASH), EC_MOVE2(FLASH), EC_WORD_EXCL_EXCL},\n\t\t\t.speechAfter = {EC_WORD_ALL, EC_WORD_TOGETHER, EC_WORD_NOW, EC_WORD_EXCL, EC_MOVE(SPARK), EC_MOVE(SPARK)},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_WEEZING,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_SHADOW_BALL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 155,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x02, // FEMALE BRAVE\n\t\t\t\t\t.nickname = _(\"WEEZING\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MUK,\n\t\t\t\t\t.heldItem = ITEM_LEFTOVERS,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_GIGA_DRAIN, MOVE_CURSE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 150,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 105,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 1,\n\t\t\t\t\t.personality = 0x84, // MALE RELAXED\n\t\t\t\t\t.nickname = _(\"MUK\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_GENGAR,\n\t\t\t\t\t.heldItem = ITEM_PETAYA_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_WILL_O_WISP},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 250,\n\t\t\t\t\t.spAttackEV = 155,\n\t\t\t\t\t.spDefenseEV = 105,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // FEMALE TIMID\n\t\t\t\t\t.nickname = _(\"GENGAR\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MISDREAVUS,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_PSYCHIC, MOVE_GRUDGE, MOVE_CONFUSE_RAY, MOVE_DESTINY_BOND},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 0,\n\t\t\t\t\t.speedEV = 150,\n\t\t\t\t\t.spAttackEV = 105,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x0A, // FEMALE TIMID\n\t\t\t\t\t.nickname = _(\"MISDREAVUS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CROBAT,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_SLUDGE_BOMB, MOVE_CONFUSE_RAY, MOVE_GIGA_DRAIN, MOVE_TOXIC},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 110,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 200,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x87, // MALE TIMID\n\t\t\t\t\t.nickname = _(\"CROBAT\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_HAUNTER,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_DESTINY_BOND, MOVE_HYPNOSIS, MOVE_CONFUSE_RAY, MOVE_TOXIC},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 20,\n\t\t\t\t\t.attackIV = 20,\n\t\t\t\t\t.defenseIV = 20,\n\t\t\t\t\t.speedIV = 20,\n\t\t\t\t\t.spAttackIV = 20,\n\t\t\t\t\t.spDefenseIV = 20,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x91, // MALE CALM\n\t\t\t\t\t.nickname = _(\"HAUNTER\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t},\n\t.checksum = 0x00014f49\n};\n\nstatic const struct TrainerTowerFloor sTrainerTowerFloor_Knockout_5 = {\n\t.id = 32,\n\t.floorIdx = MAX_TRAINER_TOWER_FLOORS,\n\t.challengeType = CHALLENGE_TYPE_KNOCKOUT,\n\t.prize = TTPRIZE_UP_GRADE,\n\t.trainers = {\n\t\t{\n\t\t\t.name = _(\"MAURA\"),\n\t\t\t.facilityClass = FACILITY_CLASS_BEAUTY,\n\t\t\t.textColor = 2,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_GROUP, EC_WORD_LEADER, EC_WORD_EXCL, 0xFFFF},\n\t\t\t.speechWin = {EC_WORD_WHAT, EC_WORD_AM, EC_WORD_I, EC_WORD_LEADER, EC_WORD_OF, EC_WORD_QUES},\n\t\t\t.speechLose = {EC_WORD_I_AM, EC_WORD_NO, EC_WORD_LEADER, EC_WORD_IT_S, EC_WORD_A_LITTLE, EC_WORD_LIE},\n\t\t\t.speechAfter = {EC_WORD_HEY, EC_WORD_EXCL, EC_WORD_THE, EC_WORD_GROUND, EC_WORD_IS, EC_WORD_SLIMY},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PICHU,\n\t\t\t\t\t.heldItem = ITEM_FOCUS_BAND,\n\t\t\t\t\t.moves = {MOVE_THUNDER_SHOCK, MOVE_THUNDER_WAVE, MOVE_SWEET_KISS, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x05, // FEMALE BOLD\n\t\t\t\t\t.nickname = _(\"PICHU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_MAREEP,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_THUNDER_SHOCK, MOVE_CHARGE, MOVE_PROTECT, MOVE_RETURN},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"MAREEP\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_IGGLYBUFF,\n\t\t\t\t\t.heldItem = ITEM_QUICK_CLAW,\n\t\t\t\t\t.moves = {MOVE_SING, MOVE_SWEET_KISS, MOVE_PRESENT, MOVE_PROTECT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"IGGLYBUFF\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CLEFFA,\n\t\t\t\t\t.heldItem = ITEM_LAX_INCENSE,\n\t\t\t\t\t.moves = {MOVE_SING, MOVE_SWEET_KISS, MOVE_ENCORE, MOVE_METRONOME},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"CLEFFA\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDORAN_F,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_CRUNCH, MOVE_DIG, MOVE_FLATTER, MOVE_ATTRACT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"NIDORAN♀\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDORAN_M,\n\t\t\t\t\t.heldItem = ITEM_SITRUS_BERRY,\n\t\t\t\t\t.moves = {MOVE_HORN_DRILL, MOVE_SLUDGE_BOMB, MOVE_FLATTER, MOVE_ATTRACT},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 255,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 255,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // MALE RELAXED\n\t\t\t\t\t.nickname = _(\"NIDORAN♂\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"MIKAELA\"),\n\t\t\t.facilityClass = FACILITY_CLASS_LASS,\n\t\t\t.textColor = 1,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_REALLY, EC_WORD_THE, EC_WORD_NO_1, EC_WORD_TRAINER, EC_WORD_HERE},\n\t\t\t.speechWin = {EC_WORD_NEVER, EC_WORD_SAID, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_NO_1, EC_WORD_AT},\n\t\t\t.speechLose = {EC_WORD_NEXT, EC_WORD_TIME, EC_WORD_I, EC_WORD_WILL, EC_WORD_BE, EC_WORD_OVERWHELMING},\n\t\t\t.speechAfter = {EC_WORD_YOU, EC_MOVE2(SPIT_UP), EC_WORD_ME, EC_WORD_AS_IF, EC_WORD_I_AM, EC_WORD_NOTHING},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDORINO,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_SHOCK_WAVE, MOVE_HORN_DRILL, MOVE_ICE_BEAM, MOVE_IRON_TAIL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // MALE RELAXED\n\t\t\t\t\t.nickname = _(\"NIDORINO\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDORINA,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_SHOCK_WAVE, MOVE_CRUNCH, MOVE_BODY_SLAM, MOVE_COUNTER},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"NIDORINA\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_PIKACHU,\n\t\t\t\t\t.heldItem = ITEM_LIGHT_BALL,\n\t\t\t\t\t.moves = {MOVE_SHOCK_WAVE, MOVE_THUNDER_WAVE, MOVE_COUNTER, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 200,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 55,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x11, // FEMALE QUIET\n\t\t\t\t\t.nickname = _(\"PIKACHU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_FLAAFFY,\n\t\t\t\t\t.heldItem = ITEM_BRIGHT_POWDER,\n\t\t\t\t\t.moves = {MOVE_SHOCK_WAVE, MOVE_DOUBLE_TEAM, MOVE_SEISMIC_TOSS, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 150,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"FLAAFFY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_JIGGLYPUFF,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_SHOCK_WAVE, MOVE_SHADOW_BALL, MOVE_FOCUS_PUNCH, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 150,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 105,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x16, // FEMALE SASSY\n\t\t\t\t\t.nickname = _(\"JIGGLYPUFF\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CLEFAIRY,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_SHOCK_WAVE, MOVE_METEOR_MASH, MOVE_MOONLIGHT, MOVE_BODY_SLAM},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 155,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"CLEFAIRY\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t.name = _(\"FLINT\"),\n\t\t\t.facilityClass = FACILITY_CLASS_ENGINEER,\n\t\t\t.textColor = 4,\n\t\t\t.speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_MOVE2(MILK_DRINK), EC_WORD_WORLD, EC_WORD_LEADER, EC_WORD_EXCL},\n\t\t\t.speechWin = {EC_WORD_I_VE, EC_WORD_WON, EC_WORD_THIS, EC_MOVE2(MILK_DRINK), EC_WORD_MATCH, EC_WORD_EXCL},\n\t\t\t.speechLose = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_DRINK, EC_WORD_ANY, EC_WORD_MORE, EC_WORD_DRINKS},\n\t\t\t.speechAfter = {EC_WORD_WHOAH, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_DROOLING, EC_WORD_ALL, EC_WORD_OVER},\n\t\t\t.mons = {\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_WIGGLYTUFF,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_PSYCHIC, MOVE_WATER_PULSE, MOVE_FLAMETHROWER},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 0,\n\t\t\t\t\t.defenseEV = 155,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 255,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0xCF, // MALE RELAXED\n\t\t\t\t\t.nickname = _(\"WIGGLYTUFF\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_CLEFABLE,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_SOFT_BOILED, MOVE_METEOR_MASH, MOVE_DOUBLE_EDGE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 100,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 150,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0xCF, // MALE RELAXED\n\t\t\t\t\t.nickname = _(\"CLEFABLE\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDOQUEEN,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_CRUNCH, MOVE_SUPERPOWER, MOVE_SURF},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 200,\n\t\t\t\t\t.defenseEV = 110,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 100,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x07, // FEMALE RELAXED\n\t\t\t\t\t.nickname = _(\"NIDOQUEEN\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_NIDOKING,\n\t\t\t\t\t.heldItem = ITEM_CHOICE_BAND,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_HYPER_BEAM, MOVE_MEGAHORN, MOVE_SHADOW_BALL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 150,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 100,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x02, // MALE BRAVE\n\t\t\t\t\t.nickname = _(\"NIDOKING\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_RAICHU,\n\t\t\t\t\t.heldItem = ITEM_SALAC_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_REVERSAL, MOVE_IRON_TAIL, MOVE_DOUBLE_EDGE},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 155,\n\t\t\t\t\t.defenseEV = 150,\n\t\t\t\t\t.speedEV = 100,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 105,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"RAICHU\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t.species = SPECIES_AMPHAROS,\n\t\t\t\t\t.heldItem = ITEM_LUM_BERRY,\n\t\t\t\t\t.moves = {MOVE_THUNDERBOLT, MOVE_REST, MOVE_BODY_SLAM, MOVE_IRON_TAIL},\n\t\t\t\t\t.hpEV = 0,\n\t\t\t\t\t.attackEV = 255,\n\t\t\t\t\t.defenseEV = 150,\n\t\t\t\t\t.speedEV = 0,\n\t\t\t\t\t.spAttackEV = 0,\n\t\t\t\t\t.spDefenseEV = 105,\n\t\t\t\t\t.otId = 0 | (4096 << 16),\n\t\t\t\t\t.hpIV = 15,\n\t\t\t\t\t.attackIV = 15,\n\t\t\t\t\t.defenseIV = 15,\n\t\t\t\t\t.speedIV = 15,\n\t\t\t\t\t.spAttackIV = 15,\n\t\t\t\t\t.spDefenseIV = 15,\n\t\t\t\t\t.abilityNum = 0,\n\t\t\t\t\t.personality = 0x80, // MALE ADAMANT\n\t\t\t\t\t.nickname = _(\"AMPHAROS\"),\n\t\t\t\t\t.friendship = 255\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t},\n\t.checksum = 0x00016b80\n};\n\nconst struct EReaderTrainerTowerSetSubstruct gTrainerTowerLocalHeader = {\n    .numFloors = MAX_TRAINER_TOWER_FLOORS,\n    .id = 1\n};\n\nconst struct TrainerTowerFloor *const gTrainerTowerFloors[NUM_TOWER_CHALLENGE_TYPES][MAX_TRAINER_TOWER_FLOORS] = {\n    [CHALLENGE_TYPE_SINGLE] = {\n        &sTrainerTowerFloor_Single_1,\n        &sTrainerTowerFloor_Single_2,\n        &sTrainerTowerFloor_Single_3,\n        &sTrainerTowerFloor_Single_4,\n        &sTrainerTowerFloor_Single_5,\n        &sTrainerTowerFloor_Single_6,\n        &sTrainerTowerFloor_Single_7,\n        &sTrainerTowerFloor_Single_8\n    },\n    [CHALLENGE_TYPE_DOUBLE] = {\n        &sTrainerTowerFloor_Double_1,\n        &sTrainerTowerFloor_Double_2,\n        &sTrainerTowerFloor_Double_3,\n        &sTrainerTowerFloor_Double_4,\n        &sTrainerTowerFloor_Double_5,\n        &sTrainerTowerFloor_Double_6,\n        &sTrainerTowerFloor_Double_7,\n        &sTrainerTowerFloor_Double_8\n    },\n    [CHALLENGE_TYPE_KNOCKOUT] = {\n        &sTrainerTowerFloor_Knockout_1,\n        &sTrainerTowerFloor_Knockout_2,\n        &sTrainerTowerFloor_Knockout_3,\n        &sTrainerTowerFloor_Knockout_4,\n        &sTrainerTowerFloor_Knockout_5,\n        &sTrainerTowerFloor_Knockout_6,\n        &sTrainerTowerFloor_Knockout_7,\n        &sTrainerTowerFloor_Knockout_8\n    },\n    [CHALLENGE_TYPE_MIXED] = {\n        &sTrainerTowerFloor_Mixed_1,\n        &sTrainerTowerFloor_Mixed_2,\n        &sTrainerTowerFloor_Mixed_3,\n        &sTrainerTowerFloor_Double_8,\n        &sTrainerTowerFloor_Mixed_5,\n        &sTrainerTowerFloor_Knockout_8,\n        &sTrainerTowerFloor_Double_3,\n        &sTrainerTowerFloor_Knockout_2\n    }\n};\n"
  },
  {
    "path": "src/trig.c",
    "content": "#include \"global.h\"\n\n// Values of sin(x*(π/128)) as Q8.8 fixed-point numbers from x = 0 to x = 319\nconst s16 gSineTable[] =\n{\n    Q_8_8(0),           // sin(0*(π/128))\n    Q_8_8(0.0234375),   // sin(1*(π/128))\n    Q_8_8(0.046875),    // sin(2*(π/128))\n    Q_8_8(0.0703125),   // sin(3*(π/128))\n    Q_8_8(0.09765625),  // sin(4*(π/128))\n    Q_8_8(0.12109375),  // sin(5*(π/128))\n    Q_8_8(0.14453125),  // sin(6*(π/128))\n    Q_8_8(0.16796875),  // sin(7*(π/128))\n    Q_8_8(0.19140625),  // sin(8*(π/128))\n    Q_8_8(0.21875),     // sin(9*(π/128))\n    Q_8_8(0.2421875),   // sin(10*(π/128))\n    Q_8_8(0.265625),    // sin(11*(π/128))\n    Q_8_8(0.2890625),   // sin(12*(π/128))\n    Q_8_8(0.3125),      // sin(13*(π/128))\n    Q_8_8(0.3359375),   // sin(14*(π/128))\n    Q_8_8(0.359375),    // sin(15*(π/128))\n    Q_8_8(0.37890625),  // sin(16*(π/128))\n    Q_8_8(0.40234375),  // sin(17*(π/128))\n    Q_8_8(0.42578125),  // sin(18*(π/128))\n    Q_8_8(0.44921875),  // sin(19*(π/128))\n    Q_8_8(0.46875),     // sin(20*(π/128))\n    Q_8_8(0.4921875),   // sin(21*(π/128))\n    Q_8_8(0.51171875),  // sin(22*(π/128))\n    Q_8_8(0.53125),     // sin(23*(π/128))\n    Q_8_8(0.5546875),   // sin(24*(π/128))\n    Q_8_8(0.57421875),  // sin(25*(π/128))\n    Q_8_8(0.59375),     // sin(26*(π/128))\n    Q_8_8(0.61328125),  // sin(27*(π/128))\n    Q_8_8(0.6328125),   // sin(28*(π/128))\n    Q_8_8(0.65234375),  // sin(29*(π/128))\n    Q_8_8(0.66796875),  // sin(30*(π/128))\n    Q_8_8(0.6875),      // sin(31*(π/128))\n    Q_8_8(0.70703125),  // sin(32*(π/128))\n    Q_8_8(0.72265625),  // sin(33*(π/128))\n    Q_8_8(0.73828125),  // sin(34*(π/128))\n    Q_8_8(0.75390625),  // sin(35*(π/128))\n    Q_8_8(0.76953125),  // sin(36*(π/128))\n    Q_8_8(0.78515625),  // sin(37*(π/128))\n    Q_8_8(0.80078125),  // sin(38*(π/128))\n    Q_8_8(0.81640625),  // sin(39*(π/128))\n    Q_8_8(0.828125),    // sin(40*(π/128))\n    Q_8_8(0.84375),     // sin(41*(π/128))\n    Q_8_8(0.85546875),  // sin(42*(π/128))\n    Q_8_8(0.8671875),   // sin(43*(π/128))\n    Q_8_8(0.87890625),  // sin(44*(π/128))\n    Q_8_8(0.890625),    // sin(45*(π/128))\n    Q_8_8(0.90234375),  // sin(46*(π/128))\n    Q_8_8(0.9140625),   // sin(47*(π/128))\n    Q_8_8(0.921875),    // sin(48*(π/128))\n    Q_8_8(0.9296875),   // sin(49*(π/128))\n    Q_8_8(0.94140625),  // sin(50*(π/128))\n    Q_8_8(0.94921875),  // sin(51*(π/128))\n    Q_8_8(0.953125),    // sin(52*(π/128))\n    Q_8_8(0.9609375),   // sin(53*(π/128))\n    Q_8_8(0.96875),     // sin(54*(π/128))\n    Q_8_8(0.97265625),  // sin(55*(π/128))\n    Q_8_8(0.98046875),  // sin(56*(π/128))\n    Q_8_8(0.984375),    // sin(57*(π/128))\n    Q_8_8(0.98828125),  // sin(58*(π/128))\n    Q_8_8(0.9921875),   // sin(59*(π/128))\n    Q_8_8(0.9921875),   // sin(60*(π/128))\n    Q_8_8(0.99609375),  // sin(61*(π/128))\n    Q_8_8(0.99609375),  // sin(62*(π/128))\n    Q_8_8(0.99609375),  // sin(63*(π/128))\n    Q_8_8(1),           // sin(64*(π/128))\n    Q_8_8(0.99609375),  // sin(65*(π/128))\n    Q_8_8(0.99609375),  // sin(66*(π/128))\n    Q_8_8(0.99609375),  // sin(67*(π/128))\n    Q_8_8(0.9921875),   // sin(68*(π/128))\n    Q_8_8(0.9921875),   // sin(69*(π/128))\n    Q_8_8(0.98828125),  // sin(70*(π/128))\n    Q_8_8(0.984375),    // sin(71*(π/128))\n    Q_8_8(0.98046875),  // sin(72*(π/128))\n    Q_8_8(0.97265625),  // sin(73*(π/128))\n    Q_8_8(0.96875),     // sin(74*(π/128))\n    Q_8_8(0.9609375),   // sin(75*(π/128))\n    Q_8_8(0.953125),    // sin(76*(π/128))\n    Q_8_8(0.94921875),  // sin(77*(π/128))\n    Q_8_8(0.94140625),  // sin(78*(π/128))\n    Q_8_8(0.9296875),   // sin(79*(π/128))\n    Q_8_8(0.921875),    // sin(80*(π/128))\n    Q_8_8(0.9140625),   // sin(81*(π/128))\n    Q_8_8(0.90234375),  // sin(82*(π/128))\n    Q_8_8(0.890625),    // sin(83*(π/128))\n    Q_8_8(0.87890625),  // sin(84*(π/128))\n    Q_8_8(0.8671875),   // sin(85*(π/128))\n    Q_8_8(0.85546875),  // sin(86*(π/128))\n    Q_8_8(0.84375),     // sin(87*(π/128))\n    Q_8_8(0.828125),    // sin(88*(π/128))\n    Q_8_8(0.81640625),  // sin(89*(π/128))\n    Q_8_8(0.80078125),  // sin(90*(π/128))\n    Q_8_8(0.78515625),  // sin(91*(π/128))\n    Q_8_8(0.76953125),  // sin(92*(π/128))\n    Q_8_8(0.75390625),  // sin(93*(π/128))\n    Q_8_8(0.73828125),  // sin(94*(π/128))\n    Q_8_8(0.72265625),  // sin(95*(π/128))\n    Q_8_8(0.70703125),  // sin(96*(π/128))\n    Q_8_8(0.6875),      // sin(97*(π/128))\n    Q_8_8(0.66796875),  // sin(98*(π/128))\n    Q_8_8(0.65234375),  // sin(99*(π/128))\n    Q_8_8(0.6328125),   // sin(100*(π/128))\n    Q_8_8(0.61328125),  // sin(101*(π/128))\n    Q_8_8(0.59375),     // sin(102*(π/128))\n    Q_8_8(0.57421875),  // sin(103*(π/128))\n    Q_8_8(0.5546875),   // sin(104*(π/128))\n    Q_8_8(0.53125),     // sin(105*(π/128))\n    Q_8_8(0.51171875),  // sin(106*(π/128))\n    Q_8_8(0.4921875),   // sin(107*(π/128))\n    Q_8_8(0.46875),     // sin(108*(π/128))\n    Q_8_8(0.44921875),  // sin(109*(π/128))\n    Q_8_8(0.42578125),  // sin(110*(π/128))\n    Q_8_8(0.40234375),  // sin(111*(π/128))\n    Q_8_8(0.37890625),  // sin(112*(π/128))\n    Q_8_8(0.359375),    // sin(113*(π/128))\n    Q_8_8(0.3359375),   // sin(114*(π/128))\n    Q_8_8(0.3125),      // sin(115*(π/128))\n    Q_8_8(0.2890625),   // sin(116*(π/128))\n    Q_8_8(0.265625),    // sin(117*(π/128))\n    Q_8_8(0.2421875),   // sin(118*(π/128))\n    Q_8_8(0.21875),     // sin(119*(π/128))\n    Q_8_8(0.19140625),  // sin(120*(π/128))\n    Q_8_8(0.16796875),  // sin(121*(π/128))\n    Q_8_8(0.14453125),  // sin(122*(π/128))\n    Q_8_8(0.12109375),  // sin(123*(π/128))\n    Q_8_8(0.09765625),  // sin(124*(π/128))\n    Q_8_8(0.0703125),   // sin(125*(π/128))\n    Q_8_8(0.046875),    // sin(126*(π/128))\n    Q_8_8(0.0234375),   // sin(127*(π/128))\n    Q_8_8(0),           // sin(128*(π/128))\n    Q_8_8(-0.0234375),  // sin(129*(π/128))\n    Q_8_8(-0.046875),   // sin(130*(π/128))\n    Q_8_8(-0.0703125),  // sin(131*(π/128))\n    Q_8_8(-0.09765625), // sin(132*(π/128))\n    Q_8_8(-0.12109375), // sin(133*(π/128))\n    Q_8_8(-0.14453125), // sin(134*(π/128))\n    Q_8_8(-0.16796875), // sin(135*(π/128))\n    Q_8_8(-0.19140625), // sin(136*(π/128))\n    Q_8_8(-0.21875),    // sin(137*(π/128))\n    Q_8_8(-0.2421875),  // sin(138*(π/128))\n    Q_8_8(-0.265625),   // sin(139*(π/128))\n    Q_8_8(-0.2890625),  // sin(140*(π/128))\n    Q_8_8(-0.3125),     // sin(141*(π/128))\n    Q_8_8(-0.3359375),  // sin(142*(π/128))\n    Q_8_8(-0.359375),   // sin(143*(π/128))\n    Q_8_8(-0.37890625), // sin(144*(π/128))\n    Q_8_8(-0.40234375), // sin(145*(π/128))\n    Q_8_8(-0.42578125), // sin(146*(π/128))\n    Q_8_8(-0.44921875), // sin(147*(π/128))\n    Q_8_8(-0.46875),    // sin(148*(π/128))\n    Q_8_8(-0.4921875),  // sin(149*(π/128))\n    Q_8_8(-0.51171875), // sin(150*(π/128))\n    Q_8_8(-0.53125),    // sin(151*(π/128))\n    Q_8_8(-0.5546875),  // sin(152*(π/128))\n    Q_8_8(-0.57421875), // sin(153*(π/128))\n    Q_8_8(-0.59375),    // sin(154*(π/128))\n    Q_8_8(-0.61328125), // sin(155*(π/128))\n    Q_8_8(-0.6328125),  // sin(156*(π/128))\n    Q_8_8(-0.65234375), // sin(157*(π/128))\n    Q_8_8(-0.66796875), // sin(158*(π/128))\n    Q_8_8(-0.6875),     // sin(159*(π/128))\n    Q_8_8(-0.70703125), // sin(160*(π/128))\n    Q_8_8(-0.72265625), // sin(161*(π/128))\n    Q_8_8(-0.73828125), // sin(162*(π/128))\n    Q_8_8(-0.75390625), // sin(163*(π/128))\n    Q_8_8(-0.76953125), // sin(164*(π/128))\n    Q_8_8(-0.78515625), // sin(165*(π/128))\n    Q_8_8(-0.80078125), // sin(166*(π/128))\n    Q_8_8(-0.81640625), // sin(167*(π/128))\n    Q_8_8(-0.828125),   // sin(168*(π/128))\n    Q_8_8(-0.84375),    // sin(169*(π/128))\n    Q_8_8(-0.85546875), // sin(170*(π/128))\n    Q_8_8(-0.8671875),  // sin(171*(π/128))\n    Q_8_8(-0.87890625), // sin(172*(π/128))\n    Q_8_8(-0.890625),   // sin(173*(π/128))\n    Q_8_8(-0.90234375), // sin(174*(π/128))\n    Q_8_8(-0.9140625),  // sin(175*(π/128))\n    Q_8_8(-0.921875),   // sin(176*(π/128))\n    Q_8_8(-0.9296875),  // sin(177*(π/128))\n    Q_8_8(-0.94140625), // sin(178*(π/128))\n    Q_8_8(-0.94921875), // sin(179*(π/128))\n    Q_8_8(-0.953125),   // sin(180*(π/128))\n    Q_8_8(-0.9609375),  // sin(181*(π/128))\n    Q_8_8(-0.96875),    // sin(182*(π/128))\n    Q_8_8(-0.97265625), // sin(183*(π/128))\n    Q_8_8(-0.98046875), // sin(184*(π/128))\n    Q_8_8(-0.984375),   // sin(185*(π/128))\n    Q_8_8(-0.98828125), // sin(186*(π/128))\n    Q_8_8(-0.9921875),  // sin(187*(π/128))\n    Q_8_8(-0.9921875),  // sin(188*(π/128))\n    Q_8_8(-0.99609375), // sin(189*(π/128))\n    Q_8_8(-0.99609375), // sin(190*(π/128))\n    Q_8_8(-0.99609375), // sin(191*(π/128))\n    Q_8_8(-1),          // sin(192*(π/128))\n    Q_8_8(-0.99609375), // sin(193*(π/128))\n    Q_8_8(-0.99609375), // sin(194*(π/128))\n    Q_8_8(-0.99609375), // sin(195*(π/128))\n    Q_8_8(-0.9921875),  // sin(196*(π/128))\n    Q_8_8(-0.9921875),  // sin(197*(π/128))\n    Q_8_8(-0.98828125), // sin(198*(π/128))\n    Q_8_8(-0.984375),   // sin(199*(π/128))\n    Q_8_8(-0.98046875), // sin(200*(π/128))\n    Q_8_8(-0.97265625), // sin(201*(π/128))\n    Q_8_8(-0.96875),    // sin(202*(π/128))\n    Q_8_8(-0.9609375),  // sin(203*(π/128))\n    Q_8_8(-0.953125),   // sin(204*(π/128))\n    Q_8_8(-0.94921875), // sin(205*(π/128))\n    Q_8_8(-0.94140625), // sin(206*(π/128))\n    Q_8_8(-0.9296875),  // sin(207*(π/128))\n    Q_8_8(-0.921875),   // sin(208*(π/128))\n    Q_8_8(-0.9140625),  // sin(209*(π/128))\n    Q_8_8(-0.90234375), // sin(210*(π/128))\n    Q_8_8(-0.890625),   // sin(211*(π/128))\n    Q_8_8(-0.87890625), // sin(212*(π/128))\n    Q_8_8(-0.8671875),  // sin(213*(π/128))\n    Q_8_8(-0.85546875), // sin(214*(π/128))\n    Q_8_8(-0.84375),    // sin(215*(π/128))\n    Q_8_8(-0.828125),   // sin(216*(π/128))\n    Q_8_8(-0.81640625), // sin(217*(π/128))\n    Q_8_8(-0.80078125), // sin(218*(π/128))\n    Q_8_8(-0.78515625), // sin(219*(π/128))\n    Q_8_8(-0.76953125), // sin(220*(π/128))\n    Q_8_8(-0.75390625), // sin(221*(π/128))\n    Q_8_8(-0.73828125), // sin(222*(π/128))\n    Q_8_8(-0.72265625), // sin(223*(π/128))\n    Q_8_8(-0.70703125), // sin(224*(π/128))\n    Q_8_8(-0.6875),     // sin(225*(π/128))\n    Q_8_8(-0.66796875), // sin(226*(π/128))\n    Q_8_8(-0.65234375), // sin(227*(π/128))\n    Q_8_8(-0.6328125),  // sin(228*(π/128))\n    Q_8_8(-0.61328125), // sin(229*(π/128))\n    Q_8_8(-0.59375),    // sin(230*(π/128))\n    Q_8_8(-0.57421875), // sin(231*(π/128))\n    Q_8_8(-0.5546875),  // sin(232*(π/128))\n    Q_8_8(-0.53125),    // sin(233*(π/128))\n    Q_8_8(-0.51171875), // sin(234*(π/128))\n    Q_8_8(-0.4921875),  // sin(235*(π/128))\n    Q_8_8(-0.46875),    // sin(236*(π/128))\n    Q_8_8(-0.44921875), // sin(237*(π/128))\n    Q_8_8(-0.42578125), // sin(238*(π/128))\n    Q_8_8(-0.40234375), // sin(239*(π/128))\n    Q_8_8(-0.37890625), // sin(240*(π/128))\n    Q_8_8(-0.359375),   // sin(241*(π/128))\n    Q_8_8(-0.3359375),  // sin(242*(π/128))\n    Q_8_8(-0.3125),     // sin(243*(π/128))\n    Q_8_8(-0.2890625),  // sin(244*(π/128))\n    Q_8_8(-0.265625),   // sin(245*(π/128))\n    Q_8_8(-0.2421875),  // sin(246*(π/128))\n    Q_8_8(-0.21875),    // sin(247*(π/128))\n    Q_8_8(-0.19140625), // sin(248*(π/128))\n    Q_8_8(-0.16796875), // sin(249*(π/128))\n    Q_8_8(-0.14453125), // sin(250*(π/128))\n    Q_8_8(-0.12109375), // sin(251*(π/128))\n    Q_8_8(-0.09765625), // sin(252*(π/128))\n    Q_8_8(-0.0703125),  // sin(253*(π/128))\n    Q_8_8(-0.046875),   // sin(254*(π/128))\n    Q_8_8(-0.0234375),  // sin(255*(π/128))\n    Q_8_8(0),           // sin(256*(π/128))\n    Q_8_8(0.0234375),   // sin(257*(π/128))\n    Q_8_8(0.046875),    // sin(258*(π/128))\n    Q_8_8(0.0703125),   // sin(259*(π/128))\n    Q_8_8(0.09765625),  // sin(260*(π/128))\n    Q_8_8(0.12109375),  // sin(261*(π/128))\n    Q_8_8(0.14453125),  // sin(262*(π/128))\n    Q_8_8(0.16796875),  // sin(263*(π/128))\n    Q_8_8(0.19140625),  // sin(264*(π/128))\n    Q_8_8(0.21875),     // sin(265*(π/128))\n    Q_8_8(0.2421875),   // sin(266*(π/128))\n    Q_8_8(0.265625),    // sin(267*(π/128))\n    Q_8_8(0.2890625),   // sin(268*(π/128))\n    Q_8_8(0.3125),      // sin(269*(π/128))\n    Q_8_8(0.3359375),   // sin(270*(π/128))\n    Q_8_8(0.359375),    // sin(271*(π/128))\n    Q_8_8(0.37890625),  // sin(272*(π/128))\n    Q_8_8(0.40234375),  // sin(273*(π/128))\n    Q_8_8(0.42578125),  // sin(274*(π/128))\n    Q_8_8(0.44921875),  // sin(275*(π/128))\n    Q_8_8(0.46875),     // sin(276*(π/128))\n    Q_8_8(0.4921875),   // sin(277*(π/128))\n    Q_8_8(0.51171875),  // sin(278*(π/128))\n    Q_8_8(0.53125),     // sin(279*(π/128))\n    Q_8_8(0.5546875),   // sin(280*(π/128))\n    Q_8_8(0.57421875),  // sin(281*(π/128))\n    Q_8_8(0.59375),     // sin(282*(π/128))\n    Q_8_8(0.61328125),  // sin(283*(π/128))\n    Q_8_8(0.6328125),   // sin(284*(π/128))\n    Q_8_8(0.65234375),  // sin(285*(π/128))\n    Q_8_8(0.66796875),  // sin(286*(π/128))\n    Q_8_8(0.6875),      // sin(287*(π/128))\n    Q_8_8(0.70703125),  // sin(288*(π/128))\n    Q_8_8(0.72265625),  // sin(289*(π/128))\n    Q_8_8(0.73828125),  // sin(290*(π/128))\n    Q_8_8(0.75390625),  // sin(291*(π/128))\n    Q_8_8(0.76953125),  // sin(292*(π/128))\n    Q_8_8(0.78515625),  // sin(293*(π/128))\n    Q_8_8(0.80078125),  // sin(294*(π/128))\n    Q_8_8(0.81640625),  // sin(295*(π/128))\n    Q_8_8(0.828125),    // sin(296*(π/128))\n    Q_8_8(0.84375),     // sin(297*(π/128))\n    Q_8_8(0.85546875),  // sin(298*(π/128))\n    Q_8_8(0.8671875),   // sin(299*(π/128))\n    Q_8_8(0.87890625),  // sin(300*(π/128))\n    Q_8_8(0.890625),    // sin(301*(π/128))\n    Q_8_8(0.90234375),  // sin(302*(π/128))\n    Q_8_8(0.9140625),   // sin(303*(π/128))\n    Q_8_8(0.921875),    // sin(304*(π/128))\n    Q_8_8(0.9296875),   // sin(305*(π/128))\n    Q_8_8(0.94140625),  // sin(306*(π/128))\n    Q_8_8(0.94921875),  // sin(307*(π/128))\n    Q_8_8(0.953125),    // sin(308*(π/128))\n    Q_8_8(0.9609375),   // sin(309*(π/128))\n    Q_8_8(0.96875),     // sin(310*(π/128))\n    Q_8_8(0.97265625),  // sin(311*(π/128))\n    Q_8_8(0.98046875),  // sin(312*(π/128))\n    Q_8_8(0.984375),    // sin(313*(π/128))\n    Q_8_8(0.98828125),  // sin(314*(π/128))\n    Q_8_8(0.9921875),   // sin(315*(π/128))\n    Q_8_8(0.9921875),   // sin(316*(π/128))\n    Q_8_8(0.99609375),  // sin(317*(π/128))\n    Q_8_8(0.99609375),  // sin(318*(π/128))\n    Q_8_8(0.99609375),  // sin(319*(π/128))\n};\n\n// values of sin(x) as Q4.12 fixed-point numbers from x = 0° to x = 179°\nconst s16 gSineDegreeTable[] =\n{\n    Q_4_12(0),              // sin(0°)\n    Q_4_12(0.017333984375), // sin(1°)\n    Q_4_12(0.034912109375), // sin(2°)\n    Q_4_12(0.05224609375),  // sin(3°)\n    Q_4_12(0.06982421875),  // sin(4°)\n    Q_4_12(0.087158203125), // sin(5°)\n    Q_4_12(0.1044921875),   // sin(6°)\n    Q_4_12(0.121826171875), // sin(7°)\n    Q_4_12(0.13916015625),  // sin(8°)\n    Q_4_12(0.156494140625), // sin(9°)\n    Q_4_12(0.173583984375), // sin(10°)\n    Q_4_12(0.19091796875),  // sin(11°)\n    Q_4_12(0.2080078125),   // sin(12°)\n    Q_4_12(0.224853515625), // sin(13°)\n    Q_4_12(0.241943359375), // sin(14°)\n    Q_4_12(0.2587890625),   // sin(15°)\n    Q_4_12(0.275634765625), // sin(16°)\n    Q_4_12(0.29248046875),  // sin(17°)\n    Q_4_12(0.30908203125),  // sin(18°)\n    Q_4_12(0.32568359375),  // sin(19°)\n    Q_4_12(0.342041015625), // sin(20°)\n    Q_4_12(0.3583984375),   // sin(21°)\n    Q_4_12(0.37451171875),  // sin(22°)\n    Q_4_12(0.390625),       // sin(23°)\n    Q_4_12(0.40673828125),  // sin(24°)\n    Q_4_12(0.422607421875), // sin(25°)\n    Q_4_12(0.4384765625),   // sin(26°)\n    Q_4_12(0.4541015625),   // sin(27°)\n    Q_4_12(0.469482421875), // sin(28°)\n    Q_4_12(0.48486328125),  // sin(29°)\n    Q_4_12(0.5),            // sin(30°)\n    Q_4_12(0.51513671875),  // sin(31°)\n    Q_4_12(0.530029296875), // sin(32°)\n    Q_4_12(0.544677734375), // sin(33°)\n    Q_4_12(0.55908203125),  // sin(34°)\n    Q_4_12(0.573486328125), // sin(35°)\n    Q_4_12(0.587890625),    // sin(36°)\n    Q_4_12(0.601806640625), // sin(37°)\n    Q_4_12(0.61572265625),  // sin(38°)\n    Q_4_12(0.62939453125),  // sin(39°)\n    Q_4_12(0.642822265625), // sin(40°)\n    Q_4_12(0.656005859375), // sin(41°)\n    Q_4_12(0.669189453125), // sin(42°)\n    Q_4_12(0.681884765625), // sin(43°)\n    Q_4_12(0.694580078125), // sin(44°)\n    Q_4_12(0.70703125),     // sin(45°)\n    Q_4_12(0.71923828125),  // sin(46°)\n    Q_4_12(0.7314453125),   // sin(47°)\n    Q_4_12(0.7431640625),   // sin(48°)\n    Q_4_12(0.754638671875), // sin(49°)\n    Q_4_12(0.76611328125),  // sin(50°)\n    Q_4_12(0.777099609375), // sin(51°)\n    Q_4_12(0.7880859375),   // sin(52°)\n    Q_4_12(0.798583984375), // sin(53°)\n    Q_4_12(0.80908203125),  // sin(54°)\n    Q_4_12(0.819091796875), // sin(55°)\n    Q_4_12(0.8291015625),   // sin(56°)\n    Q_4_12(0.838623046875), // sin(57°)\n    Q_4_12(0.84814453125),  // sin(58°)\n    Q_4_12(0.857177734375), // sin(59°)\n    Q_4_12(0.865966796875), // sin(60°)\n    Q_4_12(0.87451171875),  // sin(61°)\n    Q_4_12(0.883056640625), // sin(62°)\n    Q_4_12(0.89111328125),  // sin(63°)\n    Q_4_12(0.898681640625), // sin(64°)\n    Q_4_12(0.90625),        // sin(65°)\n    Q_4_12(0.91357421875),  // sin(66°)\n    Q_4_12(0.92041015625),  // sin(67°)\n    Q_4_12(0.92724609375),  // sin(68°)\n    Q_4_12(0.93359375),     // sin(69°)\n    Q_4_12(0.939697265625), // sin(70°)\n    Q_4_12(0.945556640625), // sin(71°)\n    Q_4_12(0.951171875),    // sin(72°)\n    Q_4_12(0.956298828125), // sin(73°)\n    Q_4_12(0.961181640625), // sin(74°)\n    Q_4_12(0.9658203125),   // sin(75°)\n    Q_4_12(0.97021484375),  // sin(76°)\n    Q_4_12(0.974365234375), // sin(77°)\n    Q_4_12(0.97802734375),  // sin(78°)\n    Q_4_12(0.981689453125), // sin(79°)\n    Q_4_12(0.98486328125),  // sin(80°)\n    Q_4_12(0.98779296875),  // sin(81°)\n    Q_4_12(0.990234375),    // sin(82°)\n    Q_4_12(0.992431640625), // sin(83°)\n    Q_4_12(0.994384765625), // sin(84°)\n    Q_4_12(0.99609375),     // sin(85°)\n    Q_4_12(0.99755859375),  // sin(86°)\n    Q_4_12(0.99853515625),  // sin(87°)\n    Q_4_12(0.999267578125), // sin(88°)\n    Q_4_12(0.999755859375), // sin(89°)\n    Q_4_12(1),              // sin(90°)\n    Q_4_12(0.999755859375), // sin(91°)\n    Q_4_12(0.999267578125), // sin(92°)\n    Q_4_12(0.99853515625),  // sin(93°)\n    Q_4_12(0.99755859375),  // sin(94°)\n    Q_4_12(0.99609375),     // sin(95°)\n    Q_4_12(0.994384765625), // sin(96°)\n    Q_4_12(0.992431640625), // sin(97°)\n    Q_4_12(0.990234375),    // sin(98°)\n    Q_4_12(0.98779296875),  // sin(99°)\n    Q_4_12(0.98486328125),  // sin(100°)\n    Q_4_12(0.981689453125), // sin(101°)\n    Q_4_12(0.97802734375),  // sin(102°)\n    Q_4_12(0.974365234375), // sin(103°)\n    Q_4_12(0.97021484375),  // sin(104°)\n    Q_4_12(0.9658203125),   // sin(105°)\n    Q_4_12(0.961181640625), // sin(106°)\n    Q_4_12(0.956298828125), // sin(107°)\n    Q_4_12(0.951171875),    // sin(108°)\n    Q_4_12(0.945556640625), // sin(109°)\n    Q_4_12(0.939697265625), // sin(110°)\n    Q_4_12(0.93359375),     // sin(111°)\n    Q_4_12(0.92724609375),  // sin(112°)\n    Q_4_12(0.92041015625),  // sin(113°)\n    Q_4_12(0.91357421875),  // sin(114°)\n    Q_4_12(0.90625),        // sin(115°)\n    Q_4_12(0.898681640625), // sin(116°)\n    Q_4_12(0.89111328125),  // sin(117°)\n    Q_4_12(0.883056640625), // sin(118°)\n    Q_4_12(0.87451171875),  // sin(119°)\n    Q_4_12(0.865966796875), // sin(120°)\n    Q_4_12(0.857177734375), // sin(121°)\n    Q_4_12(0.84814453125),  // sin(122°)\n    Q_4_12(0.838623046875), // sin(123°)\n    Q_4_12(0.8291015625),   // sin(124°)\n    Q_4_12(0.819091796875), // sin(125°)\n    Q_4_12(0.80908203125),  // sin(126°)\n    Q_4_12(0.798583984375), // sin(127°)\n    Q_4_12(0.7880859375),   // sin(128°)\n    Q_4_12(0.777099609375), // sin(129°)\n    Q_4_12(0.76611328125),  // sin(130°)\n    Q_4_12(0.754638671875), // sin(131°)\n    Q_4_12(0.7431640625),   // sin(132°)\n    Q_4_12(0.7314453125),   // sin(133°)\n    Q_4_12(0.71923828125),  // sin(134°)\n    Q_4_12(0.70703125),     // sin(135°)\n    Q_4_12(0.694580078125), // sin(136°)\n    Q_4_12(0.681884765625), // sin(137°)\n    Q_4_12(0.669189453125), // sin(138°)\n    Q_4_12(0.656005859375), // sin(139°)\n    Q_4_12(0.642822265625), // sin(140°)\n    Q_4_12(0.62939453125),  // sin(141°)\n    Q_4_12(0.61572265625),  // sin(142°)\n    Q_4_12(0.601806640625), // sin(143°)\n    Q_4_12(0.587890625),    // sin(144°)\n    Q_4_12(0.573486328125), // sin(145°)\n    Q_4_12(0.55908203125),  // sin(146°)\n    Q_4_12(0.544677734375), // sin(147°)\n    Q_4_12(0.530029296875), // sin(148°)\n    Q_4_12(0.51513671875),  // sin(149°)\n    Q_4_12(0.5),            // sin(150°)\n    Q_4_12(0.48486328125),  // sin(151°)\n    Q_4_12(0.469482421875), // sin(152°)\n    Q_4_12(0.4541015625),   // sin(153°)\n    Q_4_12(0.4384765625),   // sin(154°)\n    Q_4_12(0.422607421875), // sin(155°)\n    Q_4_12(0.40673828125),  // sin(156°)\n    Q_4_12(0.390625),       // sin(157°)\n    Q_4_12(0.37451171875),  // sin(158°)\n    Q_4_12(0.3583984375),   // sin(159°)\n    Q_4_12(0.342041015625), // sin(160°)\n    Q_4_12(0.32568359375),  // sin(161°)\n    Q_4_12(0.30908203125),  // sin(162°)\n    Q_4_12(0.29248046875),  // sin(163°)\n    Q_4_12(0.275634765625), // sin(164°)\n    Q_4_12(0.2587890625),   // sin(165°)\n    Q_4_12(0.241943359375), // sin(166°)\n    Q_4_12(0.224853515625), // sin(167°)\n    Q_4_12(0.2080078125),   // sin(168°)\n    Q_4_12(0.19091796875),  // sin(169°)\n    Q_4_12(0.173583984375), // sin(170°)\n    Q_4_12(0.156494140625), // sin(171°)\n    Q_4_12(0.13916015625),  // sin(172°)\n    Q_4_12(0.121826171875), // sin(173°)\n    Q_4_12(0.1044921875),   // sin(174°)\n    Q_4_12(0.087158203125), // sin(175°)\n    Q_4_12(0.06982421875),  // sin(176°)\n    Q_4_12(0.05224609375),  // sin(177°)\n    Q_4_12(0.034912109375), // sin(178°)\n    Q_4_12(0.017333984375), // sin(179°)\n};\n\n// amplitude * sin(index*(π/128))\ns16 Sin(s16 index, s16 amplitude)\n{\n    return (amplitude * gSineTable[index]) >> 8;\n}\n\n// amplitude * cos(index*(π/128))\ns16 Cos(s16 index, s16 amplitude)\n{\n    return (amplitude * gSineTable[index + 64]) >> 8;\n}\n\n// angle in degrees\ns16 Sin2(u16 angle)\n{\n    s32 angleMod = angle % 180;\n    s32 negate = ((angle / 180) & 1);\n    s16 value = gSineDegreeTable[angleMod];\n\n    if (negate)\n        return -value;\n    else\n        return value;\n}\n\n// angle in degrees\ns16 Cos2(u16 angle)\n{\n    return Sin2(angle + 90);\n}\n"
  },
  {
    "path": "src/union_room.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"berry_crush.h\"\n#include \"cable_club.h\"\n#include \"data.h\"\n#include \"decompress.h\"\n#include \"dodrio_berry_picking.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"easy_chat.h\"\n#include \"event_data.h\"\n#include \"event_object_lock.h\"\n#include \"fieldmap.h\"\n#include \"field_control_avatar.h\"\n#include \"field_fadetransition.h\"\n#include \"field_player_avatar.h\"\n#include \"field_weather.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"list_menu.h\"\n#include \"load_save.h\"\n#include \"menu.h\"\n#include \"mystery_gift.h\"\n#include \"mystery_gift_menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"pokemon_jump.h\"\n#include \"quest_log.h\"\n#include \"random.h\"\n#include \"save_location.h\"\n#include \"script.h\"\n#include \"script_pokemon_util.h\"\n#include \"start_menu.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"trade.h\"\n#include \"trade_scene.h\"\n#include \"trainer_card.h\"\n#include \"union_room.h\"\n#include \"union_room_battle.h\"\n#include \"union_room_chat.h\"\n#include \"union_room_player_avatar.h\"\n#include \"union_room_message.h\"\n#include \"constants/songs.h\"\n#include \"constants/maps.h\"\n#include \"constants/cable_club.h\"\n#include \"constants/field_weather.h\"\n#include \"constants/trainer_card.h\"\n#include \"constants/union_room.h\"\n\n// States for Task_RunUnionRoom\nenum {\n    UR_STATE_INIT,\n    UR_STATE_INIT_OBJECTS,\n    UR_STATE_INIT_LINK,\n    UR_STATE_CHECK_SELECTING_MON,\n    UR_STATE_MAIN,\n    UR_STATE_DO_SOMETHING_PROMPT,\n    UR_STATE_HANDLE_DO_SOMETHING_PROMPT_INPUT,\n    UR_STATE_DO_SOMETHING_PROMPT_2,\n    UR_STATE_PRINT_MSG,\n    UR_STATE_HANDLE_ACTIVITY_REQUEST,\n    UR_STATE_DECLINE_ACTIVITY_REQUEST,\n    UR_STATE_PLAYER_CONTACTED_YOU,\n    UR_STATE_RECV_CONTACT_DATA,\n    UR_STATE_PRINT_START_ACTIVITY_MSG,\n    UR_STATE_START_ACTIVITY_LINK,\n    UR_STATE_START_ACTIVITY_WAIT_FOR_LINK,\n    UR_STATE_START_ACTIVITY_FREE_UROOM,\n    UR_STATE_START_ACTIVITY_FADE,\n    UR_STATE_START_ACTIVITY,\n    UR_STATE_RECV_JOIN_CHAT_REQUEST,\n    UR_STATE_TRY_ACCEPT_CHAT_REQUEST_DELAY,\n    UR_STATE_TRY_ACCEPT_CHAT_REQUEST,\n    UR_STATE_ACCEPT_CHAT_REQUEST,\n    UR_STATE_WAIT_FOR_START_MENU,\n    UR_STATE_INTERACT_WITH_PLAYER,\n    UR_STATE_TRY_COMMUNICATING,\n    UR_STATE_PRINT_AND_EXIT,\n    UR_STATE_SEND_ACTIVITY_REQUEST,\n    UR_STATE_TRAINER_APPEARS_BUSY,\n    UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST,\n    UR_STATE_CANCEL_ACTIVITY_LINK_ERROR,\n    UR_STATE_SEND_TRADE_REQUST,\n    UR_STATE_REQUEST_DECLINED,\n    UR_STATE_PRINT_CONTACT_MSG,\n    UR_STATE_HANDLE_CONTACT_DATA,\n    UR_STATE_RECV_ACTIVITY_REQUEST,\n    UR_STATE_CANCEL_REQUEST_PRINT_MSG,\n    UR_STATE_CANCEL_REQUEST_RESTART_LINK,\n    UR_STATE_COMMUNICATING_WAIT_FOR_DATA,\n    UR_STATE_WAIT_FOR_CONTACT_DATA,\n    UR_STATE_PRINT_CARD_INFO,\n    UR_STATE_WAIT_FINISH_READING_CARD,\n    UR_STATE_INTERACT_WITH_ATTENDANT,\n    UR_STATE_REGISTER_PROMPT,\n    UR_STATE_CANCEL_REGISTRATION_PROMPT,\n    UR_STATE_CHECK_TRADING_BOARD,\n    UR_STATE_TRADING_BOARD_LOAD,\n    UR_STATE_REGISTER_PROMPT_HANDLE_INPUT,\n    UR_STATE_TRADING_BOARD_HANDLE_INPUT,\n    UR_STATE_TRADE_PROMPT,\n    UR_STATE_TRADE_SELECT_MON,\n    UR_STATE_TRADE_OFFER_MON,\n    UR_STATE_REGISTER_REQUEST_TYPE,\n    UR_STATE_REGISTER_SELECT_MON_FADE,\n    UR_STATE_REGISTER_SELECT_MON,\n    UR_STATE_REGISTER_COMPLETE,\n    UR_STATE_CANCEL_REGISTRATION,\n};\n\n// States for sUnionRoomTrade.state\nenum {\n    URTRADE_STATE_NONE,\n    URTRADE_STATE_REGISTERING,\n    URTRADE_STATE_OFFERING,\n};\n\n// States for Task_TryBecomeLinkLeader\nenum {\n    LL_STATE_INIT,\n    LL_STATE_INIT2 = 3,\n    LL_STATE_GET_AWAITING_PLAYERS_TEXT,\n    LL_STATE_PRINT_AWAITING_PLAYERS,\n    LL_STATE_AWAIT_PLAYERS,\n    LL_STATE_ACCEPT_NEW_MEMBER_PROMPT,\n    LL_STATE_WAIT_DISCONNECT_CHILD = 9,\n    LL_STATE_MEMBER_LEFT,\n    LL_STATE_ACCEPT_NEW_MEMBER_PROMPT_HANDLE_INPUT,\n    LL_STATE_UPDATE_AFTER_JOIN_REQUEST,\n    LL_STATE_ACCEPTED_FINAL_MEMBER,\n    LL_STATE_WAIT_AND_CONFIRM_MEMBERS,\n    LL_STATE_MEMBERS_OK_PROMPT,\n    LL_STATE_MEMBERS_OK_PROMPT_HANDLE_INPUT,\n    LL_STATE_CONFIRMED_MEMBERS,\n    LL_STATE_FINAL_MEMBER_CHECK,\n    LL_STATE_CANCEL_PROMPT,\n    LL_STATE_CANCEL_PROMPT_HANDLE_INPUT,\n    LL_STATE_SHUTDOWN_AND_RETRY,\n    LL_STATE_RETRY,\n    LL_STATE_SHUTDOWN_AND_FAIL,\n    LL_STATE_FAILED,\n    LL_STATE_TRY_START_ACTIVITY = 26,\n    LL_STATE_MEMBER_DISCONNECTED = 29,\n    LL_STATE_CANCEL_WITH_MSG\n};\n\n// States for Task_TryJoinLinkGroup\nenum {\n    LG_STATE_INIT,\n    LG_STATE_CHOOSE_LEADER_MSG,\n    LG_STATE_INIT_WINDOWS,\n    LG_STATE_CHOOSE_LEADER_HANDLE_INPUT,\n    LG_STATE_ASK_JOIN_GROUP = 5,\n    LG_STATE_MAIN,\n    LG_STATE_ASK_LEAVE_GROUP,\n    LG_STATE_ASK_LEAVE_GROUP_HANDLE_INPUT,\n    LG_STATE_WAIT_LEAVE_GROUP,\n    LG_STATE_CANCEL_CHOOSE_LEADER,\n    LG_STATE_CANCELED,\n    LG_STATE_RFU_ERROR,\n    LG_STATE_RFU_ERROR_SHUTDOWN,\n    LG_STATE_DISCONNECTED,\n    LG_STATE_RETRY_CONNECTION,\n    LG_STATE_TRADE_NOT_READY = 18,\n    LG_STATE_TRADE_NOT_READY_RETRY,\n    LG_STATE_READY_START_ACTIVITY,\n    LG_STATE_START_ACTIVITY,\n    LG_STATE_SHUTDOWN = 23,\n};\n\n// Color types for PrintUnionRoomText\nenum {\n    UR_COLOR_DEFAULT,\n    UR_COLOR_RED,\n    UR_COLOR_GREEN,\n    UR_COLOR_WHITE,\n    UR_COLOR_CANCEL,\n    UR_COLOR_TRADE_BOARD_SELF,\n    UR_COLOR_TRADE_BOARD_OTHER,\n};\n\n// Return values for HandlePlayerListUpdate\nenum {\n    PLIST_NONE,\n    PLIST_NEW_PLAYER,\n    PLIST_RECENT_UPDATE,\n    PLIST_UNUSED,\n    PLIST_CONTACTED,\n};\n\nstatic EWRAM_DATA u8 sUnionRoomPlayerName[12] = {};\nstatic EWRAM_DATA u8 sPlayerCurrActivity = 0;\nstatic EWRAM_DATA u8 sPlayerActivityGroupSize = 0;\nstatic EWRAM_DATA union\n{\n    struct WirelessLink_Leader *leader;\n    struct WirelessLink_Group *group;\n    struct WirelessLink_URoom *uRoom;\n} sWirelessLinkMain = {};\nstatic EWRAM_DATA u32 sUnused = 0;\nEWRAM_DATA struct RfuGameCompatibilityData gRfuPartnerCompatibilityData = {};\nEWRAM_DATA u16 gUnionRoomOfferedSpecies = SPECIES_NONE;\nEWRAM_DATA u8 gUnionRoomRequestedMonType = TYPE_NORMAL;\nstatic EWRAM_DATA struct UnionRoomTrade sUnionRoomTrade = {};\n\nstatic struct WirelessLink_Leader * sLeader;\nstatic struct WirelessLink_Group * sGroup;\nstatic struct WirelessLink_URoom * sURoom;\n\nstatic void Task_TryBecomeLinkLeader(u8);\nstatic void Leader_DestroyResources(struct WirelessLink_Leader *);\nstatic bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader *, u32, u32);\nstatic void ItemPrintFunc_PossibleGroupMembers(u8, u32, u8);\nstatic u8 LeaderUpdateGroupMembership(struct RfuPlayerList *);\nstatic u8 LeaderPrunePlayerList(struct RfuPlayerList *);\nstatic void Task_TryJoinLinkGroup(u8);\nstatic u32 IsTryingToTradeAcrossVersionTooSoon(struct WirelessLink_Group *, s32);\nstatic void AskToJoinRfuGroup(struct WirelessLink_Group *, s32);\nstatic void Task_ListenToWireless(u8);\nstatic void ListMenuItemPrintFunc_UnionRoomGroups(u8, u32, u8);\nstatic u8 GetNewLeaderCandidate(void);\nstatic void CreateTask_RunScriptAndFadeToActivity(void);\nstatic void CreateTask_StartActivity(void);\nstatic void Task_SendMysteryGift(u8);\nstatic void Task_CardOrNewsWithFriend(u8);\nstatic void Task_CardOrNewsOverWireless(u8);\nstatic void Task_RunUnionRoom(u8);\nstatic u16 ReadAsU16(const u8 *);\nstatic void ReceiveUnionRoomActivityPacket(struct WirelessLink_URoom *);\nstatic bool32 HandleContactFromOtherPlayer(struct WirelessLink_URoom *);\nstatic void Task_InitUnionRoom(u8);\nstatic u8 HandlePlayerListUpdate(void);\nstatic u8 CreateTask_SearchForChildOrParent(struct RfuIncomingPlayerList *, struct RfuIncomingPlayerList *, u32);\nstatic bool32 HasWonderCardOrNewsByLinkGroup(struct RfuGameData *, s16);\nstatic u8 CreateTask_ListenForCompatiblePartners(struct RfuIncomingPlayerList *, u32);\nstatic u8 CreateTask_ListenForWonderDistributor(struct RfuIncomingPlayerList *, u32);\nstatic bool32 UR_PrintFieldMessage(const u8 *);\nstatic bool32 UR_RunTextPrinters(void);\nstatic bool8 PrintOnTextbox(u8 *, const u8 *);\nstatic s8 UnionRoomHandleYesNo(u8 *, bool32);\nstatic s32 ListMenuHandler_AllItemsAvailable(u8 *, u8 *, u8 *, const struct WindowTemplate *, const struct ListMenuTemplate *);\nstatic s32 TradeBoardMenuHandler(u8 *, u8 *, u8 *, u8 *, const struct WindowTemplate *, const struct ListMenuTemplate *, struct RfuPlayerList *);\nstatic void UR_ClearBg0(void);\nstatic void JoinGroup_EnableScriptContexts(void);\nstatic void PrintUnionRoomText(u8, u8, const u8 *, u8, u8, u8);\nstatic void ClearRfuPlayerList(struct RfuPlayer *, u8);\nstatic void ClearIncomingPlayerList(struct RfuIncomingPlayer *, u8);\nstatic bool8 ArePlayersDifferent(struct RfuPlayerData *, const struct RfuPlayerData *);\nstatic bool32 ArePlayerDataDifferent(struct RfuPlayerData *, struct RfuPlayerData *);\nstatic u32 GetNewIncomingPlayerId(struct RfuPlayer *, struct RfuIncomingPlayer *);\nstatic u8 TryAddIncomingPlayerToList(struct RfuPlayer *, struct RfuIncomingPlayer *, u8);\nstatic void PrintGroupMemberOnWindow(u8, u8, u8, struct RfuPlayer *, u8, u8);\nstatic void PrintGroupCandidateOnWindow(u8, u8, u8, struct RfuPlayer *, u8, u8);\nstatic bool32 IsPlayerFacingTradingBoard(void);\nstatic u32 GetResponseIdx_InviteToURoomActivity(s32);\nstatic u32 ConvPartnerUnameAndGetWhetherMetAlready(struct RfuPlayer *);\nstatic s32 UnionRoomGetPlayerInteractionResponse(struct RfuPlayerList *, u8, u8, u32);\nstatic void ItemPrintFunc_Unused(u8, u32, u8);\nstatic void TradeBoardListMenuItemPrintFunc(u8, u32, u8);\nstatic s32 GetIndexOfNthTradeBoardOffer(struct RfuPlayer *, s32);\nstatic s32 GetUnionRoomPlayerGender(s32, struct RfuPlayerList *);\nstatic s32 IsRequestedTradeInPlayerParty(u32, u32);\nstatic void GetURoomActivityRejectMsg(u8 *, s32, u32);\nstatic void GetURoomActivityStartMsg(u8 *, u8);\nstatic s32 GetChatLeaderActionRequestMessage(u8 *, u32, u16 *, struct WirelessLink_URoom *);\nstatic bool32 PollPartnerYesNoResponse(struct WirelessLink_URoom *);\nstatic bool32 HasAtLeastTwoMonsOfLevel30OrLower(void);\nstatic void ResetUnionRoomTrade(struct UnionRoomTrade *);\nstatic bool32 RegisterTradeMonAndGetIsEgg(u32, struct UnionRoomTrade *);\nstatic void RegisterTradeMon(u32, struct UnionRoomTrade *);\nstatic u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade *, u8);\nstatic void HandleCancelActivity(bool32);\nstatic void StartScriptInteraction(void);\nstatic u8 GetLinkPlayerInfoFlags(s32);\nstatic u8 GetActivePartnersInfo(struct WirelessLink_URoom *);\nstatic void ViewURoomPartnerTrainerCard(u8 *, struct WirelessLink_URoom *, bool8);\n\n#include \"data/union_room.h\"\n\n// These are functions in Emerald but inlined in FireRed\n\n#define CopyAndTranslatePlayerName(dest, player) ({ \\\n    StringCopy_PlayerName(dest, (player).rfu.name); \\\n    ConvertInternationalString(dest, (player).rfu.data.compatibility.language); \\\n})\n\n#define CopyAndTranslatePlayerName2(dest, player) ({ \\\n    StringCopy(dest, (player).rfu.name); \\\n    ConvertInternationalString(dest, (player).rfu.data.compatibility.language); \\\n})\n\n#define CopyTrainerCardData(dest, src, _version) ({ \\\n    (dest) = *((struct TrainerCard * )(src)); \\\n    (dest).version = _version; \\\n})\n\n#define GetStringRightAlignXOffset(_fontId, _string, _maxWidth) ({ \\\n    u16 strWidth = GetStringWidth(_fontId, _string, 0); \\\n    _maxWidth - strWidth; \\\n})\n\nstatic void PrintNumPlayersWaitingForMsg(u8 windowId, u8 capacityCode, u8 stringId)\n{\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    switch (capacityCode << 8)\n    {\n    case LINK_GROUP_CAPACITY(0, 2):\n        PrintUnionRoomText(windowId, FONT_NORMAL, gTexts_UR_PlayersNeededOrMode[0][stringId - 1], 0, 2, UR_COLOR_DEFAULT);\n        break;\n    case LINK_GROUP_CAPACITY(0, 4):\n        PrintUnionRoomText(windowId, FONT_NORMAL, gTexts_UR_PlayersNeededOrMode[1][stringId - 1], 0, 2, UR_COLOR_DEFAULT);\n        break;\n    case LINK_GROUP_CAPACITY(2, 5):\n        PrintUnionRoomText(windowId, FONT_NORMAL, gTexts_UR_PlayersNeededOrMode[2][stringId - 1], 0, 2, UR_COLOR_DEFAULT);\n        break;\n    case LINK_GROUP_CAPACITY(3, 5):\n        PrintUnionRoomText(windowId, FONT_NORMAL, gTexts_UR_PlayersNeededOrMode[3][stringId - 1], 0, 2, UR_COLOR_DEFAULT);\n        break;\n    }\n\n    CopyWindowToVram(windowId, COPYWIN_GFX);\n}\n\nstatic void PrintPlayerNameAndIdOnWindow(u8 windowId)\n{\n    u8 text[12];\n    u8 text2[12];\n\n    PrintUnionRoomText(windowId, FONT_NORMAL, gSaveBlock2Ptr->playerName, 0, 2, UR_COLOR_DEFAULT);\n    StringCopy(text2, gText_UR_ID);\n    ConvertIntToDecimalStringN(text, ReadAsU16(gSaveBlock2Ptr->playerTrainerId), STR_CONV_MODE_LEADING_ZEROS, 5);\n    StringAppend(text2, text);\n    PrintUnionRoomText(windowId, FONT_SMALL, text2, 0, 16, UR_COLOR_DEFAULT);\n}\n\nstatic void GetAwaitingCommunicationText(u8 *dst, u8 caseId)\n{\n    switch (caseId)\n    {\n    case ACTIVITY_BATTLE_SINGLE:\n    case ACTIVITY_BATTLE_DOUBLE:\n    case ACTIVITY_BATTLE_MULTI:\n    case ACTIVITY_TRADE:\n    case ACTIVITY_POKEMON_JUMP:\n    case ACTIVITY_BERRY_CRUSH:\n    case ACTIVITY_BERRY_PICK:\n    case ACTIVITY_WONDER_CARD:\n    case ACTIVITY_WONDER_NEWS:\n        // BUG: argument *dst isn't used, instead it always prints to gStringVar4\n        // not an issue in practice since Gamefreak never used any other arguments here besides gStringVar4\n    #ifndef BUGFIX\n        StringExpandPlaceholders(gStringVar4, gText_UR_AwaitingCommunication);\n    #else\n        StringExpandPlaceholders(dst, gText_UR_AwaitingCommunication);\n    #endif\n        break;\n    }\n}\n\nvoid TryBecomeLinkLeader(void)\n{\n    u8 taskId;\n    struct WirelessLink_Leader * data;\n\n    taskId = CreateTask(Task_TryBecomeLinkLeader, 0);\n    sWirelessLinkMain.leader = data = (void *)(gTasks[taskId].data);\n    sLeader = data;\n\n    data->state = LL_STATE_INIT;\n    data->textState = 0;\n    gSpecialVar_Result = LINKUP_ONGOING;\n}\n\nstatic void Task_TryBecomeLinkLeader(u8 taskId)\n{\n    u32 id, val;\n    struct WirelessLink_Leader * data = sWirelessLinkMain.leader;\n\n    switch (data->state)\n    {\n    case LL_STATE_INIT:\n        sPlayerCurrActivity = sLinkGroupToActivityAndCapacity[gSpecialVar_0x8004];\n        sPlayerActivityGroupSize = sLinkGroupToActivityAndCapacity[gSpecialVar_0x8004] >> 8;\n        SetHostRfuGameData(sPlayerCurrActivity, 0, 0);\n        SetWirelessCommType1();\n        OpenLink();\n        InitializeRfuLinkManager_LinkLeader(GROUP_MAX(sPlayerActivityGroupSize));\n        data->state = LL_STATE_INIT2;\n        break;\n    case LL_STATE_INIT2:\n        data->incomingPlayerList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer));\n        data->playerList = AllocZeroed(MAX_RFU_PLAYERS * sizeof(struct RfuPlayer));\n        data->playerListBackup = AllocZeroed(MAX_RFU_PLAYERS * sizeof(struct RfuPlayer));\n        ClearIncomingPlayerList(data->incomingPlayerList->players, RFU_CHILD_MAX);\n        ClearRfuPlayerList(data->playerList->players, MAX_RFU_PLAYERS);\n        CopyHostRfuGameDataAndUsername(&data->playerList->players[0].rfu.data, data->playerList->players[0].rfu.name);\n        data->playerList->players[0].timeoutCounter = 0;\n        data->playerList->players[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN;\n        data->playerList->players[0].useRedText = FALSE;\n        data->playerList->players[0].newPlayerCountdown = 0;\n        data->listenTaskId = CreateTask_ListenForCompatiblePartners(data->incomingPlayerList, 0xFF);\n        data->bButtonCancelWindowId = AddWindow(&sWindowTemplate_BButtonCancel);\n        data->listWindowId = AddWindow(&sWindowTemplate_List_PossibleGroupMembers);\n        data->nPlayerModeWindowId = AddWindow(&sWindowTemplate_NumPlayerMode);\n\n        FillWindowPixelBuffer(data->bButtonCancelWindowId, PIXEL_FILL(2));\n        PrintUnionRoomText(data->bButtonCancelWindowId, FONT_SMALL, gText_UR_BButtonCancel, 8, 2, UR_COLOR_CANCEL);\n        PutWindowTilemap(data->bButtonCancelWindowId);\n        CopyWindowToVram(data->bButtonCancelWindowId, COPYWIN_GFX);\n\n        DrawStdWindowFrame(data->listWindowId, FALSE);\n        gMultiuseListMenuTemplate = sListMenuTemplate_PossibleGroupMembers;\n        gMultiuseListMenuTemplate.windowId = data->listWindowId;\n        data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);\n\n        DrawStdWindowFrame(data->nPlayerModeWindowId, FALSE);\n        PutWindowTilemap(data->nPlayerModeWindowId);\n        CopyWindowToVram(data->nPlayerModeWindowId, COPYWIN_GFX);\n\n        CopyBgTilemapBufferToVram(0);\n        data->playerCount = 1;\n        data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT;\n        break;\n    case LL_STATE_GET_AWAITING_PLAYERS_TEXT:\n        StringCopy(gStringVar1, sLinkGroupActivityNameTexts[sPlayerCurrActivity]);\n        if (GROUP_MIN(sPlayerActivityGroupSize) != 0)\n        {\n            if (data->playerCount > GROUP_MIN(sPlayerActivityGroupSize) - 1 && GROUP_MAX(sPlayerActivityGroupSize) != 0)\n                StringExpandPlaceholders(gStringVar4, gText_UR_AwaitingLinkPressStart);\n            else\n                StringExpandPlaceholders(gStringVar4, gText_UR_AwaitingCommunication);\n        }\n        else\n        {\n            GetAwaitingCommunicationText(gStringVar4, sPlayerCurrActivity);\n        }\n\n        PrintNumPlayersWaitingForMsg(data->nPlayerModeWindowId, sPlayerActivityGroupSize, data->playerCount);\n        data->state = LL_STATE_PRINT_AWAITING_PLAYERS;\n        break;\n    case LL_STATE_PRINT_AWAITING_PLAYERS:\n        if (PrintOnTextbox(&data->textState, gStringVar4))\n            data->state = LL_STATE_AWAIT_PLAYERS;\n        break;\n    case LL_STATE_AWAIT_PLAYERS:\n        Leader_SetStateIfMemberListChanged(data, LL_STATE_ACCEPT_NEW_MEMBER_PROMPT, LL_STATE_MEMBER_LEFT);\n        if (JOY_NEW(B_BUTTON))\n        {\n            if (data->playerCount == 1)\n                data->state = LL_STATE_SHUTDOWN_AND_FAIL;\n            else if (GROUP_MIN2(sPlayerActivityGroupSize) != 0)\n                data->state = LL_STATE_CANCEL_WITH_MSG;\n            else\n                data->state = LL_STATE_CANCEL_PROMPT;\n        }\n        if (GROUP_MIN(sPlayerActivityGroupSize) != 0\n            && data->playerCount > GROUP_MIN(sPlayerActivityGroupSize) - 1\n            && GROUP_MAX(sPlayerActivityGroupSize) != 0\n            && IsRfuCommunicatingWithAllChildren()\n            && JOY_NEW(START_BUTTON))\n        {\n            data->state = LL_STATE_MEMBERS_OK_PROMPT;\n            LinkRfu_StopManagerAndFinalizeSlots();\n        }\n        if (data->state == LL_STATE_AWAIT_PLAYERS && RfuTryDisconnectLeavingChildren())\n        {\n            // At least 1 group member has left or is trying to leave\n            data->state = LL_STATE_WAIT_DISCONNECT_CHILD;\n        }\n        break;\n    case LL_STATE_WAIT_DISCONNECT_CHILD:\n        // Resume after ensuring all members trying to leave have left\n        if (!RfuTryDisconnectLeavingChildren())\n        {\n            data->state = LL_STATE_AWAIT_PLAYERS;\n            data->playerCount = LeaderPrunePlayerList(data->playerList);\n        }\n        break;\n    case LL_STATE_MEMBER_LEFT:\n        id = (GROUP_MAX(sPlayerCurrActivity) == 2) ? 1 : 0;\n        if (PrintOnTextbox(&data->textState, gTexts_UR_PlayerUnavailable[id]))\n        {\n            data->playerCount = LeaderPrunePlayerList(data->playerList);\n            RedrawListMenu(data->listTaskId);\n            data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT;\n        }\n        break;\n    case LL_STATE_MEMBER_DISCONNECTED:\n        id = (GROUP_MAX(sPlayerActivityGroupSize) == 2) ? 0 : 1;\n        if (PrintOnTextbox(&data->textState, gTexts_UR_PlayerUnavailable[id]))\n            data->state = LL_STATE_SHUTDOWN_AND_RETRY;\n        break;\n    case LL_STATE_ACCEPT_NEW_MEMBER_PROMPT:\n        if (PrintOnTextbox(&data->textState, gStringVar4))\n            data->state = LL_STATE_ACCEPT_NEW_MEMBER_PROMPT_HANDLE_INPUT;\n        break;\n    case LL_STATE_ACCEPT_NEW_MEMBER_PROMPT_HANDLE_INPUT:\n        switch (UnionRoomHandleYesNo(&data->textState, HasTrainerLeftPartnersList(\n            ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId),\n            data->playerList->players[data->playerCount].rfu.name)))\n        {\n        case 0: // YES\n            LoadWirelessStatusIndicatorSpriteGfx();\n            CreateWirelessStatusIndicatorSprite(0, 0);\n            data->joinRequestAnswer = RFU_STATUS_JOIN_GROUP_OK;\n            SendRfuStatusToPartner(data->joinRequestAnswer, ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name);\n            data->state = LL_STATE_UPDATE_AFTER_JOIN_REQUEST;\n            break;\n        case 1: // NO\n        case MENU_B_PRESSED:\n            data->joinRequestAnswer = RFU_STATUS_JOIN_GROUP_NO;\n            SendRfuStatusToPartner(data->joinRequestAnswer, ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name);\n            data->state = LL_STATE_UPDATE_AFTER_JOIN_REQUEST;\n            break;\n        case -3:\n            data->state = LL_STATE_WAIT_DISCONNECT_CHILD;\n            break;\n        }\n        break;\n    case LL_STATE_UPDATE_AFTER_JOIN_REQUEST:\n        val = WaitSendRfuStatusToPartner(ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name);\n        if (val == 1) // Send complete\n        {\n            if (data->joinRequestAnswer == RFU_STATUS_JOIN_GROUP_OK)\n            {\n                // Sent \"OK\"\n                data->playerList->players[data->playerCount].newPlayerCountdown = 0;\n                RedrawListMenu(data->listTaskId);\n                data->playerCount++;\n                if (data->playerCount == GROUP_MAX(sPlayerActivityGroupSize))\n                {\n                    if (GROUP_MIN2(sPlayerActivityGroupSize) != 0 || data->playerCount == RFU_CHILD_MAX)\n                    {\n                        data->state = LL_STATE_MEMBERS_OK_PROMPT;\n                    }\n                    else\n                    {\n                        CopyAndTranslatePlayerName(gStringVar1, data->playerList->players[data->playerCount - 1]);\n                        StringExpandPlaceholders(gStringVar4, gText_UR_AnOKWasSentToPlayer);\n                        data->state = LL_STATE_ACCEPTED_FINAL_MEMBER;\n                    }\n\n                    LinkRfu_StopManagerAndFinalizeSlots();\n                    PrintNumPlayersWaitingForMsg(data->nPlayerModeWindowId, sPlayerActivityGroupSize, data->playerCount);\n                }\n                else\n                {\n                    data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT;\n                }\n            }\n            else // Member disconnected\n            {\n                RequestDisconnectSlotByTrainerNameAndId(data->playerList->players[data->playerCount].rfu.name, ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId));\n                data->playerList->players[data->playerCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE;\n                LeaderPrunePlayerList(data->playerList);\n                RedrawListMenu(data->listTaskId);\n                data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT;\n            }\n\n            data->joinRequestAnswer = 0;\n        }\n        else if (val == 2)\n        {\n            // Disconnect\n            RfuSetStatus(RFU_STATUS_OK, 0);\n            data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT;\n        }\n        break;\n    case LL_STATE_ACCEPTED_FINAL_MEMBER:\n        if (PrintOnTextbox(&data->textState, gStringVar4))\n            data->state = LL_STATE_WAIT_AND_CONFIRM_MEMBERS;\n        break;\n    case LL_STATE_WAIT_AND_CONFIRM_MEMBERS:\n        if (++data->delayTimerAfterOk > 120)\n            data->state = LL_STATE_CONFIRMED_MEMBERS;\n        break;\n    case LL_STATE_MEMBERS_OK_PROMPT:\n        if (PrintOnTextbox(&data->textState, gText_UR_AreTheseMembersOK))\n            data->state = LL_STATE_MEMBERS_OK_PROMPT_HANDLE_INPUT;\n        break;\n    case LL_STATE_MEMBERS_OK_PROMPT_HANDLE_INPUT:\n        switch (UnionRoomHandleYesNo(&data->textState, FALSE))\n        {\n        case 0: // YES\n            data->state = LL_STATE_CONFIRMED_MEMBERS;\n            break;\n        case 1: // NO\n        case MENU_B_PRESSED:\n            if (GROUP_MIN2(sPlayerActivityGroupSize) != 0)\n                data->state = LL_STATE_CANCEL_WITH_MSG;\n            else\n                data->state = LL_STATE_CANCEL_PROMPT;\n            break;\n        }\n        break;\n    case LL_STATE_CANCEL_PROMPT:\n        if (PrintOnTextbox(&data->textState, gText_UR_CancelModeWithTheseMembers))\n            data->state = LL_STATE_CANCEL_PROMPT_HANDLE_INPUT;\n        break;\n    case LL_STATE_CANCEL_PROMPT_HANDLE_INPUT:\n        switch (UnionRoomHandleYesNo(&data->textState, FALSE))\n        {\n        case 0: // YES\n            data->state = LL_STATE_SHUTDOWN_AND_FAIL;\n            break;\n        case 1: // NO\n        case MENU_B_PRESSED:\n            if (GROUP_MIN2(sPlayerActivityGroupSize) != 0)\n                data->state = LL_STATE_MEMBERS_OK_PROMPT;\n            else if (data->playerCount == GROUP_MAX(sPlayerActivityGroupSize))\n                data->state = LL_STATE_MEMBERS_OK_PROMPT;\n            else\n                data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT;\n            break;\n        }\n        break;\n    case LL_STATE_CONFIRMED_MEMBERS:\n        if (!Leader_SetStateIfMemberListChanged(data, LL_STATE_ACCEPT_NEW_MEMBER_PROMPT, LL_STATE_SHUTDOWN_AND_FAIL))\n            data->state = LL_STATE_FINAL_MEMBER_CHECK;\n        break;\n    case LL_STATE_FINAL_MEMBER_CHECK:\n        if (LmanAcceptSlotFlagIsNotZero())\n        {\n            if (WaitRfuState(FALSE))\n            {\n                data->state = LL_STATE_TRY_START_ACTIVITY;\n            }\n        }\n        else\n        {\n            data->state = LL_STATE_MEMBER_DISCONNECTED;\n            data->textState = 0;\n        }\n        break;\n    case LL_STATE_CANCEL_WITH_MSG:\n        if (PrintOnTextbox(&data->textState, gText_UR_ModeWithTheseMembersWillBeCanceled))\n            data->state = LL_STATE_SHUTDOWN_AND_FAIL;\n        break;\n    case LL_STATE_SHUTDOWN_AND_RETRY:\n    case LL_STATE_SHUTDOWN_AND_FAIL:\n        // An error occurred. Please start over from the beginning.\n        DestroyWirelessStatusIndicatorSprite();\n        LinkRfu_Shutdown();\n        Leader_DestroyResources(data);\n        data->state++; // LL_STATE_RETRY or LL_STATE_FAILED\n        break;\n    case LL_STATE_FAILED:\n        ScriptContext_Enable();\n        DestroyTask(taskId);\n        gSpecialVar_Result = LINKUP_FAILED;\n        break;\n    case LL_STATE_RETRY:\n        ScriptContext_Enable();\n        DestroyTask(taskId);\n        gSpecialVar_Result = LINKUP_RETRY_ROLE_ASSIGN;\n        break;\n    case LL_STATE_TRY_START_ACTIVITY:\n        if (RfuHasErrored())\n        {\n            data->state = LL_STATE_MEMBER_DISCONNECTED;\n        }\n        else\n        {\n            if (gReceivedRemoteLinkPlayers)\n            {\n                UpdateGameData_GroupLockedIn(TRUE);\n                CreateTask_RunScriptAndFadeToActivity();\n                Leader_DestroyResources(data);\n                DestroyTask(taskId);\n            }\n        }\n        break;\n    }\n}\n\nstatic void Leader_DestroyResources(struct WirelessLink_Leader * data)\n{\n    ClearWindowTilemap(data->nPlayerModeWindowId);\n    ClearStdWindowAndFrame(data->nPlayerModeWindowId, FALSE);\n    DestroyListMenuTask(data->listTaskId, 0, 0);\n    ClearWindowTilemap(data->bButtonCancelWindowId);\n    ClearStdWindowAndFrame(data->listWindowId, FALSE);\n    CopyBgTilemapBufferToVram(0);\n    RemoveWindow(data->nPlayerModeWindowId);\n    RemoveWindow(data->listWindowId);\n    RemoveWindow(data->bButtonCancelWindowId);\n    DestroyTask(data->listenTaskId);\n\n    Free(data->playerListBackup);\n    Free(data->playerList);\n    Free(data->incomingPlayerList);\n}\n\nstatic void Leader_GetAcceptNewMemberPrompt(u8 *dst, u8 activity)\n{\n    switch (activity)\n    {\n    case ACTIVITY_BATTLE_SINGLE:\n    case ACTIVITY_BATTLE_DOUBLE:\n    case ACTIVITY_TRADE:\n        StringExpandPlaceholders(dst, gText_UR_PlayerContactedYouForXAccept);\n        break;\n    case ACTIVITY_WONDER_CARD:\n    case ACTIVITY_WONDER_NEWS:\n        StringExpandPlaceholders(dst, gText_UR_PlayerContactedYouShareX);\n        break;\n    case ACTIVITY_BATTLE_MULTI:\n    case ACTIVITY_POKEMON_JUMP:\n    case ACTIVITY_BERRY_CRUSH:\n    case ACTIVITY_BERRY_PICK:\n        StringExpandPlaceholders(dst, gText_UR_PlayerContactedYouAddToMembers);\n        break;\n    }\n}\n\nstatic void GetYouDeclinedTheOfferMessage(u8 *dst, u8 activity)\n{\n    switch (activity)\n    {\n    case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM:\n    case ACTIVITY_TRADE | IN_UNION_ROOM:\n        StringExpandPlaceholders(dst, gText_UR_OfferDeclined1);\n        break;\n    case ACTIVITY_CHAT | IN_UNION_ROOM:\n    case ACTIVITY_CARD | IN_UNION_ROOM:\n        StringExpandPlaceholders(dst, gText_UR_OfferDeclined2);\n        break;\n    }\n}\n\nstatic void GetYouAskedToJoinGroupPleaseWaitMessage(u8 *dst, u8 activity)\n{\n    switch (activity)\n    {\n    case ACTIVITY_BATTLE_SINGLE:\n    case ACTIVITY_BATTLE_DOUBLE:\n    case ACTIVITY_TRADE:\n    case ACTIVITY_WONDER_CARD:\n    case ACTIVITY_WONDER_NEWS:\n        StringExpandPlaceholders(dst, gText_UR_AwaitingPlayersResponse);\n        break;\n    case ACTIVITY_BATTLE_MULTI:\n    case ACTIVITY_POKEMON_JUMP:\n    case ACTIVITY_BERRY_CRUSH:\n    case ACTIVITY_BERRY_PICK:\n        StringExpandPlaceholders(dst, gText_UR_PlayerHasBeenAskedToRegisterYouPleaseWait);\n        break;\n    }\n}\n\nstatic void GetGroupLeaderSentAnOKMessage(u8 *dst, u8 caseId)\n{\n    switch (caseId)\n    {\n    case ACTIVITY_BATTLE_SINGLE:\n    case ACTIVITY_BATTLE_DOUBLE:\n    case ACTIVITY_TRADE:\n    case ACTIVITY_WONDER_CARD:\n    case ACTIVITY_WONDER_NEWS:\n        StringExpandPlaceholders(dst, gText_UR_PlayerSentBackOK);\n        break;\n    case ACTIVITY_BATTLE_MULTI:\n    case ACTIVITY_POKEMON_JUMP:\n    case ACTIVITY_BERRY_CRUSH:\n    case ACTIVITY_BERRY_PICK:\n        StringExpandPlaceholders(dst, gText_UR_PlayerOKdRegistration);\n        break;\n    }\n}\n\nstatic bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader * data, u32 joinedState, u32 droppedState)\n{\n    switch (LeaderUpdateGroupMembership(data->playerList))\n    {\n    case UNION_ROOM_SPAWN_IN:\n        PlaySE(SE_PC_LOGIN);\n        RedrawListMenu(data->listTaskId);\n        CopyAndTranslatePlayerName(gStringVar2, data->playerList->players[data->playerCount]);\n        Leader_GetAcceptNewMemberPrompt(gStringVar4, sPlayerCurrActivity);\n        data->state = joinedState;\n        break;\n    case UNION_ROOM_SPAWN_OUT:\n        RfuSetStatus(RFU_STATUS_OK, 0);\n        RedrawListMenu(data->listTaskId);\n        data->state = droppedState;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic void ItemPrintFunc_PossibleGroupMembers(u8 windowId, u32 id, u8 y)\n{\n    struct WirelessLink_Leader * data = sWirelessLinkMain.leader;\n    u8 colorIdx = UR_COLOR_DEFAULT;\n\n    switch (data->playerList->players[id].groupScheduledAnim)\n    {\n    case UNION_ROOM_SPAWN_IN:\n        if (data->playerList->players[id].newPlayerCountdown != 0)\n            colorIdx = UR_COLOR_GREEN;\n        break;\n    case UNION_ROOM_SPAWN_OUT:\n        colorIdx = UR_COLOR_RED;\n        break;\n    }\n\n    PrintGroupCandidateOnWindow(windowId, 0, y, &data->playerList->players[id], colorIdx, id);\n}\n\nstatic u8 LeaderUpdateGroupMembership(struct RfuPlayerList * list)\n{\n    struct WirelessLink_Leader * data = sWirelessLinkMain.leader;\n    u8 ret = UNION_ROOM_SPAWN_NONE;\n    u8 i;\n    s32 id;\n\n    for (i = 1; i < MAX_RFU_PLAYERS; i++)\n    {\n        u16 var = data->playerList->players[i].groupScheduledAnim;\n        if (var == UNION_ROOM_SPAWN_IN)\n        {\n            id = GetNewIncomingPlayerId(&data->playerList->players[i], data->incomingPlayerList->players);\n            if (id != 0xFF)\n            {\n                // New incoming player\n                data->playerList->players[i].rfu = data->incomingPlayerList->players[id].rfu;\n                data->playerList->players[i].timeoutCounter = 1;\n            }\n            else\n            {\n                // No new incoming player\n                data->playerList->players[i].groupScheduledAnim = UNION_ROOM_SPAWN_OUT;\n                ret = UNION_ROOM_SPAWN_OUT;\n            }\n        }\n    }\n\n    for (id = 0; id < RFU_CHILD_MAX; id++)\n        TryAddIncomingPlayerToList(data->playerList->players, &data->incomingPlayerList->players[id], MAX_RFU_PLAYERS);\n\n    if (ret != UNION_ROOM_SPAWN_OUT)\n    {\n        for (id = 0; id < MAX_RFU_PLAYERS; id++)\n        {\n            if (data->playerList->players[id].newPlayerCountdown != 0)\n                ret = UNION_ROOM_SPAWN_IN;\n        }\n    }\n\n    return ret;\n}\n\nstatic u8 LeaderPrunePlayerList(struct RfuPlayerList * list)\n{\n    struct WirelessLink_Leader * data = sWirelessLinkMain.leader;\n    u8 copiedCount;\n    s32 i;\n    u8 playerCount;\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n        data->playerListBackup->players[i] = data->playerList->players[i];\n\n    copiedCount = 0;\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        if (data->playerListBackup->players[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)\n        {\n            data->playerList->players[copiedCount] = data->playerListBackup->players[i];\n            copiedCount++;\n        }\n    }\n\n    playerCount = copiedCount;\n    for (; copiedCount < MAX_RFU_PLAYERS; copiedCount++)\n    {\n        data->playerList->players[copiedCount].rfu = sRfuPlayerData_Dummy;\n        data->playerList->players[copiedCount].timeoutCounter = 0;\n        data->playerList->players[copiedCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE;\n        data->playerList->players[copiedCount].useRedText = FALSE;\n        data->playerList->players[copiedCount].newPlayerCountdown = 0;\n    }\n\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n    {\n        if (data->playerList->players[i].groupScheduledAnim != UNION_ROOM_SPAWN_IN)\n            continue;\n        if (data->playerList->players[i].newPlayerCountdown != 64)\n            continue;\n\n        playerCount = i;\n        break;\n    }\n\n    return playerCount;\n}\n\nvoid TryJoinLinkGroup(void)\n{\n    u8 taskId;\n    struct WirelessLink_Group * data;\n\n    taskId = CreateTask(Task_TryJoinLinkGroup, 0);\n    sWirelessLinkMain.group = data = (void *)(gTasks[taskId].data);\n    sGroup = data;\n\n    data->state = LG_STATE_INIT;\n    data->textState = 0;\n    gSpecialVar_Result = LINKUP_ONGOING;\n}\n\nstatic void Task_TryJoinLinkGroup(u8 taskId)\n{\n    s32 id;\n    struct WirelessLink_Group * data = sWirelessLinkMain.group;\n\n    switch (data->state)\n    {\n    case LG_STATE_INIT:\n        SetHostRfuGameData(sLinkGroupToURoomActivity[gSpecialVar_0x8004], 0, 0);\n        sPlayerCurrActivity = sLinkGroupToURoomActivity[gSpecialVar_0x8004];\n        SetWirelessCommType1();\n        OpenLink();\n        InitializeRfuLinkManager_JoinGroup();\n        data->incomingPlayerList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer));\n        data->playerList = AllocZeroed(MAX_RFU_PLAYER_LIST_SIZE * sizeof(struct RfuPlayer));\n        data->state = LG_STATE_CHOOSE_LEADER_MSG;\n        break;\n    case LG_STATE_CHOOSE_LEADER_MSG:\n        if (PrintOnTextbox(&data->textState, gTexts_UR_ChooseTrainer[gSpecialVar_0x8004]))\n            data->state = LG_STATE_INIT_WINDOWS;\n        break;\n    case LG_STATE_INIT_WINDOWS:\n        ClearIncomingPlayerList(data->incomingPlayerList->players, RFU_CHILD_MAX);\n        ClearRfuPlayerList(data->playerList->players, MAX_RFU_PLAYER_LIST_SIZE);\n        data->listenTaskId = CreateTask_ListenForCompatiblePartners(data->incomingPlayerList, gSpecialVar_0x8004);\n        data->bButtonCancelWindowId = AddWindow(&sWindowTemplate_BButtonCancel);\n        data->listWindowId = AddWindow(&sWindowTemplate_GroupList);\n        data->playerNameAndIdWindowId = AddWindow(&sWindowTemplate_PlayerNameAndId);\n\n        FillWindowPixelBuffer(data->bButtonCancelWindowId, PIXEL_FILL(2));\n        PrintUnionRoomText(data->bButtonCancelWindowId, FONT_SMALL, gText_UR_ChooseJoinCancel, 8, 2, UR_COLOR_CANCEL);\n        PutWindowTilemap(data->bButtonCancelWindowId);\n        CopyWindowToVram(data->bButtonCancelWindowId, COPYWIN_GFX);\n\n        DrawStdWindowFrame(data->listWindowId, FALSE);\n        gMultiuseListMenuTemplate = sListMenuTemplate_UnionRoomGroups;\n        gMultiuseListMenuTemplate.windowId = data->listWindowId;\n        data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);\n\n        DrawStdWindowFrame(data->playerNameAndIdWindowId, FALSE);\n        PutWindowTilemap(data->playerNameAndIdWindowId);\n        PrintPlayerNameAndIdOnWindow(data->playerNameAndIdWindowId);\n        CopyWindowToVram(data->playerNameAndIdWindowId, COPYWIN_GFX);\n\n        CopyBgTilemapBufferToVram(0);\n        data->leaderId = 0;\n        data->state = LG_STATE_CHOOSE_LEADER_HANDLE_INPUT;\n        break;\n    case LG_STATE_CHOOSE_LEADER_HANDLE_INPUT:\n        id = GetNewLeaderCandidate();\n        switch (id)\n        {\n        case 1:\n            PlaySE(SE_PC_LOGIN);\n            RedrawListMenu(data->listTaskId);\n            break;\n        case 0:\n            id = ListMenu_ProcessInput(data->listTaskId);\n            if (JOY_NEW(A_BUTTON) && id != LIST_NOTHING_CHOSEN)\n            {\n                // this unused variable along with the assignment is needed to match\n                u32 activity = data->playerList->players[id].rfu.data.activity;\n\n                if (data->playerList->players[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->playerList->players[id].rfu.data.startedActivity)\n                {\n                    u32 readyStatus = IsTryingToTradeAcrossVersionTooSoon(data, id);\n                    if (readyStatus == UR_TRADE_READY)\n                    {\n                        // Trading is allowed, or not trading at all\n                        AskToJoinRfuGroup(data, id);\n                        data->state = LG_STATE_ASK_JOIN_GROUP;\n                        PlaySE(SE_POKENAV_ON);\n                    }\n                    else\n                    {\n                        // Postgame flags not both set\n                        StringCopy(gStringVar4, gTexts_UR_CantTransmitToTrainer[readyStatus - 1]);\n                        data->state = LG_STATE_TRADE_NOT_READY;\n                        PlaySE(SE_POKENAV_ON);\n                    }\n                }\n                else\n                {\n                    PlaySE(SE_WALL_HIT);\n                }\n            }\n            else if (JOY_NEW(B_BUTTON))\n            {\n                data->state = LG_STATE_CANCEL_CHOOSE_LEADER;\n            }\n            break;\n        default:\n            RedrawListMenu(data->listTaskId);\n            break;\n        }\n        break;\n    case LG_STATE_ASK_JOIN_GROUP:\n        GetYouAskedToJoinGroupPleaseWaitMessage(gStringVar4, sPlayerCurrActivity);\n        if (PrintOnTextbox(&data->textState, gStringVar4))\n        {\n            CopyAndTranslatePlayerName(gStringVar1, data->playerList->players[data->leaderId]);\n            data->state = LG_STATE_MAIN;\n        }\n        break;\n    case LG_STATE_MAIN:\n        if (gReceivedRemoteLinkPlayers)\n        {\n            sPlayerCurrActivity = data->playerList->players[data->leaderId].rfu.data.activity;\n            RfuSetStatus(RFU_STATUS_OK, 0);\n            switch (sPlayerCurrActivity)\n            {\n            case ACTIVITY_BATTLE_SINGLE:\n            case ACTIVITY_BATTLE_DOUBLE:\n            case ACTIVITY_BATTLE_MULTI:\n            case ACTIVITY_TRADE:\n            case ACTIVITY_CHAT:\n            case ACTIVITY_POKEMON_JUMP:\n            case ACTIVITY_BERRY_CRUSH:\n            case ACTIVITY_BERRY_PICK:\n            case ACTIVITY_SPIN_TRADE:\n            case ACTIVITY_ITEM_TRADE:\n            case ACTIVITY_WONDER_CARD:\n            case ACTIVITY_WONDER_NEWS:\n                data->state = LG_STATE_READY_START_ACTIVITY;\n                break;\n            }\n        }\n\n        switch (RfuGetStatus())\n        {\n        case RFU_STATUS_FATAL_ERROR:\n            data->state = LG_STATE_RFU_ERROR;\n            break;\n        case RFU_STATUS_CONNECTION_ERROR:\n        case RFU_STATUS_JOIN_GROUP_NO:\n        case RFU_STATUS_LEAVE_GROUP:\n            data->state = LG_STATE_DISCONNECTED;\n            break;\n        case RFU_STATUS_JOIN_GROUP_OK:\n            GetGroupLeaderSentAnOKMessage(gStringVar4, sPlayerCurrActivity);\n            if (PrintOnTextbox(&data->textState, gStringVar4))\n            {\n                RfuSetStatus(RFU_STATUS_WAIT_ACK_JOIN_GROUP, 0);\n                StringCopy(gStringVar1, sLinkGroupActivityNameTexts[sPlayerCurrActivity]);\n                StringExpandPlaceholders(gStringVar4, gText_UR_AwaitingOtherMembers);\n            }\n            break;\n        case RFU_STATUS_WAIT_ACK_JOIN_GROUP:\n            if (data->delayBeforePrint > 240)\n            {\n                if (PrintOnTextbox(&data->textState, gStringVar4))\n                {\n                    RfuSetStatus(RFU_STATUS_ACK_JOIN_GROUP, 0);\n                    data->delayBeforePrint = 0;\n                }\n            }\n            else\n            {\n                data->delayBeforePrint++;\n            }\n            break;\n        }\n\n        if (RfuGetStatus() == RFU_STATUS_OK && JOY_NEW(B_BUTTON))\n            data->state = LG_STATE_ASK_LEAVE_GROUP;\n        break;\n    case LG_STATE_ASK_LEAVE_GROUP:\n        if (PrintOnTextbox(&data->textState, gText_UR_QuitBeingMember))\n            data->state = LG_STATE_ASK_LEAVE_GROUP_HANDLE_INPUT;\n        break;\n    case LG_STATE_ASK_LEAVE_GROUP_HANDLE_INPUT:\n        switch (UnionRoomHandleYesNo(&data->textState, RfuGetStatus()))\n        {\n        case 0: // YES\n            SendLeaveGroupNotice();\n            data->state = LG_STATE_WAIT_LEAVE_GROUP;\n            RedrawListMenu(data->listTaskId);\n            break;\n        case 1: // NO\n        case MENU_B_PRESSED:\n            data->state = LG_STATE_ASK_JOIN_GROUP;\n            RedrawListMenu(data->listTaskId);\n            break;\n        case -3:\n            data->state = LG_STATE_MAIN;\n            RedrawListMenu(data->listTaskId);\n            break;\n        }\n        break;\n    case LG_STATE_WAIT_LEAVE_GROUP:\n        if (RfuGetStatus())\n            data->state = LG_STATE_MAIN;\n        break;\n    case LG_STATE_CANCEL_CHOOSE_LEADER: // next: LG_STATE_CANCELED\n    case LG_STATE_RFU_ERROR:            // next: LG_STATE_RFU_ERROR_SHUTDOWN\n    case LG_STATE_DISCONNECTED:         // next: LG_STATE_RETRY_CONNECTION\n    case LG_STATE_TRADE_NOT_READY:      // next: LG_STATE_TRADE_NOT_READY_RETRY\n    case LG_STATE_READY_START_ACTIVITY: // next: LG_STATE_START_ACTIVITY\n        ClearWindowTilemap(data->playerNameAndIdWindowId);\n        ClearStdWindowAndFrame(data->playerNameAndIdWindowId, FALSE);\n        DestroyListMenuTask(data->listTaskId, 0, 0);\n        ClearWindowTilemap(data->bButtonCancelWindowId);\n        ClearStdWindowAndFrame(data->listWindowId, FALSE);\n        CopyBgTilemapBufferToVram(0);\n        RemoveWindow(data->playerNameAndIdWindowId);\n        RemoveWindow(data->listWindowId);\n        RemoveWindow(data->bButtonCancelWindowId);\n        DestroyTask(data->listenTaskId);\n        Free(data->playerList);\n        Free(data->incomingPlayerList);\n        data->state++;\n        break;\n    case LG_STATE_RFU_ERROR_SHUTDOWN:\n        DestroyWirelessStatusIndicatorSprite();\n        if (PrintOnTextbox(&data->textState, gTexts_UR_PlayerDisconnected[RfuGetStatus()]))\n        {\n            gSpecialVar_Result = LINKUP_CONNECTION_ERROR;\n            data->state = LG_STATE_SHUTDOWN;\n        }\n        break;\n    case LG_STATE_CANCELED:\n        DestroyWirelessStatusIndicatorSprite();\n        gSpecialVar_Result = LINKUP_FAILED;\n        data->state = LG_STATE_SHUTDOWN;\n        break;\n    case LG_STATE_RETRY_CONNECTION:\n        // Failure from disconnection\n        // Happens if player or required member(s) leave group\n        // or if player is rejected from joining group\n        DestroyWirelessStatusIndicatorSprite();\n        if (PrintOnTextbox(&data->textState, gTexts_UR_PlayerDisconnected[RfuGetStatus()]))\n        {\n            gSpecialVar_Result = LINKUP_RETRY_ROLE_ASSIGN;\n            data->state = LG_STATE_SHUTDOWN;\n        }\n        break;\n    case LG_STATE_TRADE_NOT_READY_RETRY:\n        if (PrintOnTextbox(&data->textState, gStringVar4))\n        {\n            gSpecialVar_Result = LINKUP_RETRY_ROLE_ASSIGN;\n            data->state = LG_STATE_SHUTDOWN;\n        }\n        break;\n    case LG_STATE_SHUTDOWN:\n        DestroyTask(taskId);\n        JoinGroup_EnableScriptContexts();\n        LinkRfu_Shutdown();\n        break;\n    case LG_STATE_START_ACTIVITY:\n        CreateTask_RunScriptAndFadeToActivity();\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic u32 IsTryingToTradeAcrossVersionTooSoon(struct WirelessLink_Group * data, s32 id)\n{\n    struct RfuPlayer * partner = &data->playerList->players[id];\n\n    if (sPlayerCurrActivity == ACTIVITY_TRADE \n     && partner->rfu.data.compatibility.version != VERSION_FIRE_RED\n     && partner->rfu.data.compatibility.version != VERSION_LEAF_GREEN)\n    {\n        /* //This commented out should allow trading with RSE from the start\n        if (!(gSaveBlock2Ptr->specialSaveWarpFlags & CHAMPION_SAVEWARP))\n            return UR_TRADE_PLAYER_NOT_READY;\n        else if (partner->rfu.data.compatibility.canLinkNationally)\n            return UR_TRADE_READY;*/\n        return UR_TRADE_READY;\n    }\n    else\n    {\n        return UR_TRADE_READY;\n    }\n\n    return UR_TRADE_PARTNER_NOT_READY;\n}\n\nstatic void AskToJoinRfuGroup(struct WirelessLink_Group * data, s32 id)\n{\n    data->leaderId = id;\n    LoadWirelessStatusIndicatorSpriteGfx();\n    CreateWirelessStatusIndicatorSprite(0, 0);\n    RedrawListMenu(data->listTaskId);\n    CopyAndTranslatePlayerName(gStringVar1, data->playerList->players[data->leaderId]);\n    UpdateGameData_SetActivity(sLinkGroupToURoomActivity[gSpecialVar_0x8004], 0, TRUE);\n    CreateTask_RfuReconnectWithParent(data->playerList->players[data->leaderId].rfu.name, ReadAsU16(data->playerList->players[data->leaderId].rfu.data.compatibility.playerTrainerId));\n}\n\nu8 CreateTask_ListenToWireless(void)\n{\n    u8 taskId;\n    struct WirelessLink_Group * data;\n\n    taskId = CreateTask(Task_ListenToWireless, 0);\n    sWirelessLinkMain.group = data = (void *)(gTasks[taskId].data);\n\n    data->state = 0;\n    data->textState = 0;\n\n    sGroup = data;\n\n    return taskId;\n}\n\nstatic void Task_ListenToWireless(u8 taskId)\n{\n    struct WirelessLink_Group * data = sWirelessLinkMain.group;\n\n    switch (data->state)\n    {\n    case 0:\n        SetHostRfuGameData(ACTIVITY_NONE, 0, FALSE);\n        SetWirelessCommType1();\n        OpenLink();\n        InitializeRfuLinkManager_JoinGroup();\n        RfuSetIgnoreError(TRUE);\n        data->incomingPlayerList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer));\n        data->playerList = AllocZeroed(MAX_RFU_PLAYER_LIST_SIZE * sizeof(struct RfuPlayer));\n        data->state = 2;\n        break;\n    case 2:\n        ClearIncomingPlayerList(data->incomingPlayerList->players, RFU_CHILD_MAX);\n        ClearRfuPlayerList(data->playerList->players, MAX_RFU_PLAYER_LIST_SIZE);\n        data->listenTaskId = CreateTask_ListenForCompatiblePartners(data->incomingPlayerList, 0xFF);\n        data->leaderId = 0;\n        data->state = 3;\n        break;\n    case 3:\n        if (GetNewLeaderCandidate() == 1)\n            PlaySE(SE_PC_LOGIN);\n        if (gTasks[taskId].data[15] == 0xFF)\n            data->state = 10;\n        break;\n    case 10:\n        DestroyTask(data->listenTaskId);\n        Free(data->playerList);\n        Free(data->incomingPlayerList);\n        LinkRfu_Shutdown();\n        data->state++;\n        break;\n    case 11:\n        LinkRfu_Shutdown();\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nstatic bool32 IsPartnerActivityAcceptable(u32 activity, u32 group)\n{\n    if (group == 0xFF)\n        return TRUE;\n\n#ifdef UBFIX\n    if (group < ARRAY_COUNT(sAcceptedActivityIds))\n#else\n    if (group <= ARRAY_COUNT(sAcceptedActivityIds)) // UB: <= may access data outside the array\n#endif\n    {\n        const u8 *bytes = sAcceptedActivityIds[group];\n\n        while ((*(bytes) != 0xFF))\n        {\n            if ((*bytes) == activity)\n                return TRUE;\n            bytes++;\n        }\n    }\n\n    return FALSE;\n}\n\nstatic u8 GetGroupListTextColor(struct WirelessLink_Group * data, u32 id)\n{\n    if (data->playerList->players[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN)\n    {\n        if (data->playerList->players[id].rfu.data.startedActivity)\n            return UR_COLOR_WHITE;\n        else if (data->playerList->players[id].useRedText)\n            return UR_COLOR_RED;\n        else if (data->playerList->players[id].newPlayerCountdown != 0)\n            return UR_COLOR_GREEN;\n    }\n\n    return UR_COLOR_DEFAULT;\n}\n\nstatic void ListMenuItemPrintFunc_UnionRoomGroups(u8 windowId, u32 id, u8 y)\n{\n    struct WirelessLink_Group * data = sWirelessLinkMain.group;\n    u8 colorId = GetGroupListTextColor(data, id);\n\n    PrintGroupMemberOnWindow(windowId, 8, y, &data->playerList->players[id], colorId, id);\n}\n\nstatic u8 GetNewLeaderCandidate(void)\n{\n    struct WirelessLink_Group * data = sWirelessLinkMain.group;\n    u8 ret = 0;\n    u8 i;\n    s32 id;\n\n    for (i = 0; i < MAX_RFU_PLAYER_LIST_SIZE; i++)\n    {\n        if (data->playerList->players[i].groupScheduledAnim != UNION_ROOM_SPAWN_NONE)\n        {\n            id = GetNewIncomingPlayerId(&data->playerList->players[i], data->incomingPlayerList->players);\n            if (id != 0xFF)\n            {\n                if (data->playerList->players[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)\n                {\n                    if (ArePlayerDataDifferent(&data->playerList->players[i].rfu, &data->incomingPlayerList->players[id].rfu))\n                    {\n                        data->playerList->players[i].rfu = data->incomingPlayerList->players[id].rfu;\n                        data->playerList->players[i].newPlayerCountdown = 64;\n                        ret = 1;\n                    }\n                    else\n                    {\n                        if (data->playerList->players[i].newPlayerCountdown != 0)\n                        {\n                            data->playerList->players[i].newPlayerCountdown--;\n                            if (data->playerList->players[i].newPlayerCountdown == 0)\n                                ret = 2;\n                        }\n                    }\n                }\n                else\n                {\n                    data->playerList->players[i].groupScheduledAnim = UNION_ROOM_SPAWN_IN;\n                    data->playerList->players[i].newPlayerCountdown = 64;\n                    ret = 1;\n                }\n\n                data->playerList->players[i].timeoutCounter = 0;\n            }\n            else\n            {\n                if (data->playerList->players[i].groupScheduledAnim != UNION_ROOM_SPAWN_OUT)\n                {\n                    data->playerList->players[i].timeoutCounter++;\n                    if (data->playerList->players[i].timeoutCounter >= 300)\n                    {\n                        data->playerList->players[i].groupScheduledAnim = UNION_ROOM_SPAWN_OUT;\n                        ret = 2;\n                    }\n                }\n            }\n        }\n    }\n\n    for (id = 0; id < RFU_CHILD_MAX; id++)\n    {\n        if (TryAddIncomingPlayerToList(data->playerList->players, &data->incomingPlayerList->players[id], MAX_RFU_PLAYER_LIST_SIZE) != 0xFF)\n            ret = 1;\n    }\n\n    return ret;\n}\n\nstatic void Task_CreateTradeMenu(u8 taskId)\n{\n    CB2_StartCreateTradeMenu();\n    DestroyTask(taskId);\n}\n\nu8 CreateTask_CreateTradeMenu(void)\n{\n    return CreateTask(Task_CreateTradeMenu, 0);\n}\n\nstatic void Task_StartUnionRoomTrade(u8 taskId)\n{\n    u32 monId = GetPartyPositionOfRegisteredMon(&sUnionRoomTrade, GetMultiplayerId());\n\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        gTasks[taskId].data[0]++;\n        SendBlock(0, &gPlayerParty[monId], sizeof(struct Pokemon));\n        break;\n    case 1:\n        if (GetBlockReceivedStatus() == 3)\n        {\n            gEnemyParty[0] = *(struct Pokemon *)(gBlockRecvBuffer[GetMultiplayerId() ^ 1]);\n            IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES);\n            ResetBlockReceivedFlags();\n            gTasks[taskId].data[0]++;\n        }\n        break;\n    case 2:\n        memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, sizeof(struct Mail) * PARTY_SIZE + 4);\n        if (SendBlock(0, gBlockSendBuffer, sizeof(struct Mail) * PARTY_SIZE + 4))\n            gTasks[taskId].data[0]++;\n        break;\n    case 3:\n        if (GetBlockReceivedStatus() == 3)\n        {\n            memcpy(gLinkPartnerMail, gBlockRecvBuffer[GetMultiplayerId() ^ 1], sizeof(struct Mail) * PARTY_SIZE);\n            ResetBlockReceivedFlags();\n            gSelectedTradeMonPositions[TRADE_PLAYER] = monId;\n            gSelectedTradeMonPositions[TRADE_PARTNER] = PARTY_SIZE;\n            gMain.savedCallback = CB2_ReturnToField;\n            SetMainCallback2(CB2_LinkTrade);\n            ResetUnionRoomTrade(&sUnionRoomTrade);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void Task_ExchangeCards(u8 taskId)\n{\n    switch (gTasks[taskId].data[0])\n    {\n    case 0:\n        if (GetMultiplayerId() == 0)\n            SendBlockRequest(BLOCK_REQ_SIZE_100);\n        gTasks[taskId].data[0]++;\n        break;\n    case 1:\n        if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags())\n        {\n            s32 i;\n            u16 *recvBuff;\n\n            for (i = 0; i < GetLinkPlayerCount(); i++)\n            {\n                recvBuff = gBlockRecvBuffer[i];\n                CopyTrainerCardData(gTrainerCards[i], (struct TrainerCard *)recvBuff, gLinkPlayers[i].version);\n            }\n\n            if (GetLinkPlayerCount() == 2)\n            {\n                recvBuff = gBlockRecvBuffer[GetMultiplayerId() ^ 1];\n                MysteryGift_TryEnableStatsByFlagId(recvBuff[sizeof(struct TrainerCard) / 2]);\n            }\n            else\n            {\n                MysteryGift_DisableStats();\n            }\n\n            ResetBlockReceivedFlags();\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void CB2_ShowCard(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        CreateTask(Task_ExchangeCards, 5);\n        gMain.state++;\n        break;\n    case 1:\n        if (!FuncIsActiveTask(Task_ExchangeCards))\n            ShowTrainerCardInLink(GetMultiplayerId() ^ 1, CB2_ReturnToField);\n        break;\n    }\n\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n}\n\nvoid StartUnionRoomBattle(u16 battleFlags)\n{\n    HealPlayerParty();\n    SavePlayerParty();\n    LoadPlayerBag();\n    gLinkPlayers[0].linkType = LINKTYPE_BATTLE;\n    gLinkPlayers[GetMultiplayerId()].id = GetMultiplayerId();\n    gLinkPlayers[GetMultiplayerId() ^ 1].id = GetMultiplayerId() ^ 1;\n    gMain.savedCallback = CB2_ReturnFromCableClubBattle;\n    gBattleTypeFlags = battleFlags;\n    PlayBattleBGM();\n}\n\nstatic void WarpForWirelessMinigame(u16 linkService, u16 x, u16 y)\n{\n    VarSet(VAR_CABLE_CLUB_STATE, linkService);\n    SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE, x, y);\n    SetDynamicWarpWithCoords(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE, x, y);\n    WarpIntoMap();\n}\n\nstatic void WarpForCableClubActivity(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService)\n{\n    gSpecialVar_0x8004 = linkService;\n    VarSet(VAR_CABLE_CLUB_STATE, linkService);\n    gFieldLinkPlayerCount = GetLinkPlayerCount();\n    gLocalLinkPlayerId = GetMultiplayerId();\n    SetCableClubWarp();\n    SetWarpDestination(mapGroup, mapNum, WARP_ID_NONE, x, y);\n    WarpIntoMap();\n}\n\nstatic void CB2_TransitionToCableClub(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        CreateTask(Task_ExchangeCards, 5);\n        gMain.state++;\n        break;\n    case 1:\n        if (!FuncIsActiveTask(Task_ExchangeCards))\n            SetMainCallback2(CB2_ReturnToFieldCableClub);\n        break;\n    }\n\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n}\n\nstatic void CreateTrainerCardInBuffer(void *dest, bool32 setWonderCard)\n{\n    TrainerCard_GenerateCardForLinkPlayer((struct TrainerCard * )dest);\n    if (setWonderCard)\n        *((u16 *)(dest + sizeof(struct TrainerCard))) = GetWonderCardFlagId();\n    else\n        *((u16 *)(dest + sizeof(struct TrainerCard))) = 0;\n}\n\nstatic void Task_StartActivity(u8 taskId)\n{\n    MysteryGift_DisableStats();\n    switch (sPlayerCurrActivity)\n    {\n    case ACTIVITY_BATTLE_SINGLE:\n    case ACTIVITY_BATTLE_DOUBLE:\n    case ACTIVITY_BATTLE_MULTI:\n    case ACTIVITY_TRADE:\n    case ACTIVITY_POKEMON_JUMP:\n    case ACTIVITY_BERRY_CRUSH:\n    case ACTIVITY_BERRY_PICK:\n    case ACTIVITY_SPIN_TRADE:\n    case ACTIVITY_ITEM_TRADE:\n        SaveLinkTrainerNames();\n        break;\n    }\n\n    switch (sPlayerCurrActivity)\n    {\n    case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM:\n    case ACTIVITY_ACCEPT | IN_UNION_ROOM:\n        CleanupOverworldWindowsAndTilemaps();\n        gMain.savedCallback = CB2_UnionRoomBattle;\n        InitChooseMonsForBattle(CHOOSE_MONS_FOR_UNION_ROOM_BATTLE);\n        break;\n    case ACTIVITY_BATTLE_SINGLE:\n        CleanupOverworldWindowsAndTilemaps();\n        CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);\n        HealPlayerParty();\n        SavePlayerParty();\n        LoadPlayerBag();\n        WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE);\n        SetMainCallback2(CB2_TransitionToCableClub);\n        break;\n    case ACTIVITY_BATTLE_DOUBLE:\n        CleanupOverworldWindowsAndTilemaps();\n        HealPlayerParty();\n        SavePlayerParty();\n        LoadPlayerBag();\n        CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);\n        WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE);\n        SetMainCallback2(CB2_TransitionToCableClub);\n        break;\n    case ACTIVITY_BATTLE_MULTI:\n        CleanupOverworldWindowsAndTilemaps();\n        HealPlayerParty();\n        SavePlayerParty();\n        LoadPlayerBag();\n        CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);\n        WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE);\n        SetMainCallback2(CB2_TransitionToCableClub);\n        break;\n    case ACTIVITY_TRADE:\n        CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);\n        CleanupOverworldWindowsAndTilemaps();\n        WarpForCableClubActivity(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, USING_TRADE_CENTER);\n        SetMainCallback2(CB2_TransitionToCableClub);\n        break;\n    case ACTIVITY_TRADE | IN_UNION_ROOM:\n        CreateTask(Task_StartUnionRoomTrade, 0);\n        break;\n    case ACTIVITY_CHAT:\n    case ACTIVITY_CHAT | IN_UNION_ROOM:\n        if (GetMultiplayerId() == 0)\n        {\n            LinkRfu_CreateConnectionAsParent();\n        }\n        else\n        {\n            LinkRfu_StopManagerBeforeEnteringChat();\n            SetHostRfuGameData(ACTIVITY_CHAT | IN_UNION_ROOM, 0, TRUE);\n        }\n        EnterUnionRoomChat();\n        break;\n    case ACTIVITY_CARD:\n    case ACTIVITY_CARD | IN_UNION_ROOM:\n        CreateTrainerCardInBuffer(gBlockSendBuffer, FALSE);\n        SetMainCallback2(CB2_ShowCard);\n        break;\n    case ACTIVITY_POKEMON_JUMP:\n        WarpForWirelessMinigame(USING_MINIGAME, 5, 1);\n        StartPokemonJump(GetCursorSelectionMonId(), CB2_LoadMap);\n        break;\n    case ACTIVITY_BERRY_CRUSH:\n        WarpForWirelessMinigame(USING_BERRY_CRUSH, 9, 1);\n        StartBerryCrush(CB2_LoadMap);\n        break;\n    case ACTIVITY_BERRY_PICK:\n        WarpForWirelessMinigame(USING_MINIGAME, 5, 1);\n        StartDodrioBerryPicking(GetCursorSelectionMonId(), CB2_LoadMap);\n        break;\n    }\n\n    DestroyTask(taskId);\n    gSpecialVar_Result = LINKUP_SUCCESS;\n    UnlockPlayerFieldControls();\n}\n\nstatic void Task_RunScriptAndFadeToActivity(u8 taskId)\n{\n    s16 *data = gTasks[taskId].data;\n    u16 *sendBuff = (u16 *)(gBlockSendBuffer);\n\n    switch (data[0])\n    {\n    case 0:\n        gSpecialVar_Result = LINKUP_SUCCESS;\n        ScriptContext_Enable();\n        data[0]++;\n        break;\n    case 1:\n        if (!ScriptContext_IsEnabled())\n        {\n            FadeScreen(FADE_TO_BLACK, 0);\n            data[0]++;\n        }\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n        {\n            SetLinkStandbyCallback();\n            data[0]++;\n        }\n        break;\n    case 3:\n        if (IsLinkTaskFinished())\n        {\n            DestroyTask(taskId);\n            CreateTask_StartActivity();\n        }\n        break;\n    }\n}\n\nstatic void CreateTask_RunScriptAndFadeToActivity(void)\n{\n    CreateTask(Task_RunScriptAndFadeToActivity, 0);\n}\n\nstatic void CreateTask_StartActivity(void)\n{\n    u8 taskId = CreateTask(Task_StartActivity, 0);\n    gTasks[taskId].data[0] = 0;\n}\n\n// Sending Wonder Card/News\nvoid CreateTask_SendMysteryGift(u32 activity)\n{\n    u8 taskId;\n    struct WirelessLink_Leader * data;\n\n    taskId = CreateTask(Task_SendMysteryGift, 0);\n    sWirelessLinkMain.leader = data = (void *)(gTasks[taskId].data);\n\n    data->state = 0;\n    data->textState = 0;\n    data->activity = activity;\n    gSpecialVar_Result = LINKUP_ONGOING;\n}\n\nstatic void Task_SendMysteryGift(u8 taskId)\n{\n    struct WirelessLink_Leader * data = sWirelessLinkMain.leader;\n    struct WindowTemplate winTemplate;\n    s32 val;\n\n    switch (data->state)\n    {\n    case 0:\n        sPlayerCurrActivity = data->activity;\n        sPlayerActivityGroupSize = 2;\n        SetHostRfuGameData(data->activity, 0, FALSE);\n        SetHostRfuWonderFlags(FALSE, FALSE);\n        SetWirelessCommType1();\n        OpenLink();\n        InitializeRfuLinkManager_LinkLeader(2);\n        data->state = 1;\n        break;\n    case 1:\n        data->incomingPlayerList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer));\n        data->playerList = AllocZeroed(MAX_RFU_PLAYERS * sizeof(struct RfuPlayer));\n        data->playerListBackup = AllocZeroed(MAX_RFU_PLAYERS * sizeof(struct RfuPlayer));\n        ClearIncomingPlayerList(data->incomingPlayerList->players, RFU_CHILD_MAX);\n        ClearRfuPlayerList(data->playerList->players, MAX_RFU_PLAYERS);\n        CopyHostRfuGameDataAndUsername(&data->playerList->players[0].rfu.data, data->playerList->players[0].rfu.name);\n        data->playerList->players[0].timeoutCounter = 0;\n        data->playerList->players[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN;\n        data->playerList->players[0].useRedText = FALSE;\n        data->playerList->players[0].newPlayerCountdown = 0;\n        data->listenTaskId = CreateTask_ListenForCompatiblePartners(data->incomingPlayerList, 0xFF);\n\n        winTemplate = sWindowTemplate_List_PossibleGroupMembers;\n        winTemplate.baseBlock = GetMysteryGiftBaseBlock();\n        data->listWindowId = AddWindow(&winTemplate);\n        MG_DrawTextBorder(data->listWindowId);\n        gMultiuseListMenuTemplate = sListMenuTemplate_PossibleGroupMembers;\n        gMultiuseListMenuTemplate.windowId = data->listWindowId;\n        data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);\n\n        CopyBgTilemapBufferToVram(0);\n        data->playerCount = 1;\n        data->state = 2;\n        break;\n    case 2:\n        StringCopy(gStringVar1, sLinkGroupActivityNameTexts[sPlayerCurrActivity]);\n        GetAwaitingCommunicationText(gStringVar4, sPlayerCurrActivity);\n        data->state = 3;\n        break;\n    case 3:\n        AddTextPrinterToWindow1(gStringVar4);\n        data->state = 4;\n        break;\n    case 4:\n        Leader_SetStateIfMemberListChanged(data, 5, 6);\n        if (JOY_NEW(B_BUTTON))\n        {\n            data->state = 13;\n            DestroyWirelessStatusIndicatorSprite();\n        }\n        break;\n    case 6:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gText_UR_LinkWithFriendDropped))\n        {\n            data->playerCount = LeaderPrunePlayerList(data->playerList);\n            RedrawListMenu(data->listTaskId);\n            data->state = 2;\n        }\n        break;\n    case 5:\n        data->state = 7;\n        break;\n    case 7:\n        switch (DoMysteryGiftYesNo(&data->textState, &data->yesNoWindowId, FALSE, gStringVar4))\n        {\n        case 0:\n            LoadWirelessStatusIndicatorSpriteGfx();\n            CreateWirelessStatusIndicatorSprite(0, 0);\n            data->playerList->players[data->playerCount].newPlayerCountdown = 0;\n            RedrawListMenu(data->listTaskId);\n            data->joinRequestAnswer = RFU_STATUS_JOIN_GROUP_OK;\n            SendRfuStatusToPartner(data->joinRequestAnswer, ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name);\n            data->state = 8;\n            break;\n        case 1:\n        case MENU_B_PRESSED:\n            data->joinRequestAnswer = RFU_STATUS_JOIN_GROUP_NO;\n            SendRfuStatusToPartner(data->joinRequestAnswer, ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name);\n            data->state = 8;\n            break;\n        }\n        break;\n    case 8:\n        val = WaitSendRfuStatusToPartner(ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId), data->playerList->players[data->playerCount].rfu.name);\n        if (val == 1) // Send complete\n        {\n            if (data->joinRequestAnswer == RFU_STATUS_JOIN_GROUP_OK)\n            {\n                data->playerList->players[data->playerCount].newPlayerCountdown = 0;\n                RedrawListMenu(data->listTaskId);\n                data->playerCount++;\n                CopyAndTranslatePlayerName(gStringVar1, data->playerList->players[data->playerCount - 1]);\n                StringExpandPlaceholders(gStringVar4, gText_UR_AnOKWasSentToPlayer);\n                data->state = 9;\n                LinkRfu_StopManagerAndFinalizeSlots();\n            }\n            else\n            {\n                RequestDisconnectSlotByTrainerNameAndId(data->playerList->players[data->playerCount].rfu.name, ReadAsU16(data->playerList->players[data->playerCount].rfu.data.compatibility.playerTrainerId));\n                data->playerList->players[data->playerCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE;\n                LeaderPrunePlayerList(data->playerList);\n                RedrawListMenu(data->listTaskId);\n                data->state = 2;\n            }\n\n            data->joinRequestAnswer = 0;\n        }\n        else if (val == 2) // Member disconnected\n        {\n            RfuSetStatus(RFU_STATUS_OK, 0);\n            data->state = 2;\n        }\n        break;\n    case 9:\n        AddTextPrinterToWindow1(gStringVar4);\n        data->state = 10;\n        break;\n    case 10:\n        if (++data->delayTimerAfterOk > 120)\n            data->state = 11;\n        break;\n    case 11:\n        if (!Leader_SetStateIfMemberListChanged(data, 5, 6))\n            data->state = 12;\n        break;\n    case 12:\n        if (LmanAcceptSlotFlagIsNotZero())\n        {\n            WaitRfuState(FALSE);\n            data->state = 15;\n        }\n        else\n        {\n            data->state = 6;\n        }\n        break;\n    case 13:\n        DestroyWirelessStatusIndicatorSprite();\n        LinkRfu_Shutdown();\n        DestroyListMenuTask(data->listTaskId, 0, 0);\n        CopyBgTilemapBufferToVram(0);\n        RemoveWindow(data->listWindowId);\n        DestroyTask(data->listenTaskId);\n        Free(data->playerListBackup);\n        Free(data->playerList);\n        Free(data->incomingPlayerList);\n        data->state++;\n        break;\n    case 14:\n        // Please start over from the beginning.\n        if (PrintMysteryGiftMenuMessage(&data->textState, gText_UR_PleaseStartOver))\n        {\n            DestroyTask(taskId);\n            gSpecialVar_Result = LINKUP_FAILED;\n        }\n        break;\n    case 15:\n        if (RfuGetStatus() == RFU_STATUS_FATAL_ERROR || RfuGetStatus() == RFU_STATUS_CONNECTION_ERROR)\n        {\n            data->state = 13;\n        }\n        else if (gReceivedRemoteLinkPlayers)\n        {\n            UpdateGameData_GroupLockedIn(TRUE);\n            data->state++;\n        }\n        break;\n    case 16:\n        DestroyListMenuTask(data->listTaskId, 0, 0);\n        CopyBgTilemapBufferToVram(0);\n        RemoveWindow(data->listWindowId);\n        DestroyTask(data->listenTaskId);\n        Free(data->playerListBackup);\n        Free(data->playerList);\n        Free(data->incomingPlayerList);\n        SetLinkStandbyCallback();\n        data->state++;\n        break;\n    case 17:\n        if (IsLinkTaskFinished())\n            DestroyTask(taskId);\n        break;\n    }\n}\n\nvoid CreateTask_LinkMysteryGiftWithFriend(u32 activity)\n{\n    u8 taskId;\n    struct WirelessLink_Group * data;\n\n    taskId = CreateTask(Task_CardOrNewsWithFriend, 0);\n    sWirelessLinkMain.group = data = (void *)(gTasks[taskId].data);\n    sGroup = data;\n\n    data->state = 0;\n    data->textState = 0;\n    data->isWonderNews = activity - ACTIVITY_WONDER_CARD; // 0: Card; 1: News\n    gSpecialVar_Result = LINKUP_ONGOING;\n}\n\nstatic void Task_CardOrNewsWithFriend(u8 taskId)\n{\n    s32 id;\n    struct WindowTemplate listWinTemplate;\n    struct WirelessLink_Group * data = sWirelessLinkMain.group;\n\n    switch (data->state)\n    {\n    case 0:\n        SetHostRfuGameData(data->isWonderNews + ACTIVITY_WONDER_CARD, 0, FALSE);\n        SetWirelessCommType1();\n        OpenLink();\n        InitializeRfuLinkManager_JoinGroup();\n        data->incomingPlayerList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer));\n        data->playerList = AllocZeroed(MAX_RFU_PLAYER_LIST_SIZE * sizeof(struct RfuPlayer));\n        data->state = 1;\n        break;\n    case 1:\n        AddTextPrinterToWindow1(gText_UR_ChooseTrainer);\n        data->state = 2;\n        break;\n    case 2:\n        ClearIncomingPlayerList(data->incomingPlayerList->players, RFU_CHILD_MAX);\n        ClearRfuPlayerList(data->playerList->players, MAX_RFU_PLAYER_LIST_SIZE);\n        data->listenTaskId = CreateTask_ListenForCompatiblePartners(data->incomingPlayerList, data->isWonderNews + LINK_GROUP_WONDER_CARD);\n\n        listWinTemplate = sWindowTemplate_GroupList;\n        listWinTemplate.baseBlock = GetMysteryGiftBaseBlock();\n        data->listWindowId = AddWindow(&listWinTemplate);\n\n        data->playerNameAndIdWindowId = AddWindow(&sWindowTemplate_PlayerNameAndId);\n\n        MG_DrawTextBorder(data->listWindowId);\n        gMultiuseListMenuTemplate = sListMenuTemplate_UnionRoomGroups;\n        gMultiuseListMenuTemplate.windowId = data->listWindowId;\n        data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);\n\n        MG_DrawTextBorder(data->playerNameAndIdWindowId);\n        FillWindowPixelBuffer(data->playerNameAndIdWindowId, PIXEL_FILL(1));\n        PutWindowTilemap(data->playerNameAndIdWindowId);\n        PrintPlayerNameAndIdOnWindow(data->playerNameAndIdWindowId);\n        CopyWindowToVram(data->playerNameAndIdWindowId, COPYWIN_GFX);\n\n        CopyBgTilemapBufferToVram(0);\n        data->leaderId = 0;\n        data->state = 3;\n        break;\n    case 3:\n        id = GetNewLeaderCandidate();\n        switch (id)\n        {\n        case 1:\n            PlaySE(SE_PC_LOGIN);\n        default:\n            RedrawListMenu(data->listTaskId);\n            break;\n        case 0:\n            id = ListMenu_ProcessInput(data->listTaskId);\n            if (JOY_NEW(A_BUTTON) && id != LIST_NOTHING_CHOSEN)\n            {\n                // this unused variable along with the assignment is needed to match\n                u32 activity = data->playerList->players[id].rfu.data.activity;\n\n                if (data->playerList->players[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->playerList->players[id].rfu.data.startedActivity)\n                {\n                    data->leaderId = id;\n                    LoadWirelessStatusIndicatorSpriteGfx();\n                    CreateWirelessStatusIndicatorSprite(0, 0);\n                    RedrawListMenu(data->listTaskId);\n                    CopyAndTranslatePlayerName2(gStringVar1, data->playerList->players[data->leaderId]);\n                    CreateTask_RfuReconnectWithParent(data->playerList->players[data->leaderId].rfu.name, ReadAsU16(data->playerList->players[data->leaderId].rfu.data.compatibility.playerTrainerId));\n                    PlaySE(SE_POKENAV_ON);\n                    data->state = 4;\n                }\n                else\n                {\n                    PlaySE(SE_WALL_HIT);\n                }\n            }\n            else if (JOY_NEW(B_BUTTON))\n            {\n                data->state = 6;\n            }\n            break;\n        }\n        break;\n    case 4:\n        AddTextPrinterToWindow1(gText_UR_AwaitingPlayersResponse);\n        CopyAndTranslatePlayerName2(gStringVar1, data->playerList->players[data->leaderId]);\n        data->state = 5;\n        break;\n    case 5:\n        if (gReceivedRemoteLinkPlayers)\n        {\n            sPlayerCurrActivity = data->playerList->players[data->leaderId].rfu.data.activity;\n            data->state = 10;\n        }\n\n        switch (RfuGetStatus())\n        {\n        case RFU_STATUS_FATAL_ERROR:\n        case RFU_STATUS_CONNECTION_ERROR:\n        case RFU_STATUS_JOIN_GROUP_NO:\n            data->state = 8;\n            break;\n        case RFU_STATUS_JOIN_GROUP_OK:\n            AddTextPrinterToWindow1(gText_UR_PlayerSentBackOK);\n            RfuSetStatus(RFU_STATUS_OK, 0);\n            break;\n        }\n        break;\n    case 6:\n    case 8:\n    case 10:\n        DestroyListMenuTask(data->listTaskId, 0, 0);\n        CopyBgTilemapBufferToVram(0);\n        RemoveWindow(data->playerNameAndIdWindowId);\n        RemoveWindow(data->listWindowId);\n        DestroyTask(data->listenTaskId);\n        Free(data->playerList);\n        Free(data->incomingPlayerList);\n        data->state++;\n        break;\n    case 9:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gTexts_UR_LinkDropped[RfuGetStatus()]))\n        {\n            DestroyWirelessStatusIndicatorSprite();\n            DestroyTask(taskId);\n            LinkRfu_Shutdown();\n            gSpecialVar_Result = LINKUP_FAILED;\n        }\n        break;\n    case 7:\n        DestroyWirelessStatusIndicatorSprite();\n        AddTextPrinterToWindow1(gText_UR_PleaseStartOver);\n        DestroyTask(taskId);\n        LinkRfu_Shutdown();\n        gSpecialVar_Result = LINKUP_FAILED;\n        break;\n    case 11:\n        data->state++;\n        SetLinkStandbyCallback();\n        break;\n    case 12:\n        if (IsLinkTaskFinished())\n            DestroyTask(taskId);\n        break;\n    }\n}\n\nvoid CreateTask_LinkMysteryGiftOverWireless(u32 activity)\n{\n    u8 taskId;\n    struct WirelessLink_Group * data;\n\n    taskId = CreateTask(Task_CardOrNewsOverWireless, 0);\n    sWirelessLinkMain.group = data = (void *)(gTasks[taskId].data);\n    sGroup = data;\n\n    data->state = 0;\n    data->textState = 0;\n    data->isWonderNews = activity - ACTIVITY_WONDER_CARD; // 0: Card; 1: News\n    gSpecialVar_Result = LINKUP_ONGOING;\n}\n\nstatic void Task_CardOrNewsOverWireless(u8 taskId)\n{\n    s32 id;\n    struct WindowTemplate winTemplate;\n    struct WirelessLink_Group * data = sWirelessLinkMain.group;\n\n    switch (data->state)\n    {\n    case 0:\n        SetHostRfuGameData(ACTIVITY_NONE, 0, FALSE);\n        SetWirelessCommType1();\n        OpenLink();\n        InitializeRfuLinkManager_JoinGroup();\n        data->incomingPlayerList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer));\n        data->playerList = AllocZeroed(MAX_RFU_PLAYER_LIST_SIZE * sizeof(struct RfuPlayer));\n        data->state = 1;\n        break;\n    case 1:\n        AddTextPrinterToWindow1(gText_UR_SearchingForWirelessSystemWait);\n        data->state = 2;\n        break;\n    case 2:\n        ClearIncomingPlayerList(data->incomingPlayerList->players, RFU_CHILD_MAX);\n        ClearRfuPlayerList(data->playerList->players, MAX_RFU_PLAYER_LIST_SIZE);\n        data->listenTaskId = CreateTask_ListenForWonderDistributor(data->incomingPlayerList, data->isWonderNews + LINK_GROUP_WONDER_CARD);\n\n        if (data->showListMenu)\n        {\n            winTemplate = sWindowTemplate_GroupList;\n            winTemplate.baseBlock = GetMysteryGiftBaseBlock();\n            data->listWindowId = AddWindow(&winTemplate);\n\n            MG_DrawTextBorder(data->listWindowId);\n            gMultiuseListMenuTemplate = sListMenuTemplate_UnionRoomGroups;\n            gMultiuseListMenuTemplate.windowId = data->listWindowId;\n            data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);\n\n            CopyBgTilemapBufferToVram(0);\n        }\n\n        data->leaderId = 0;\n        data->state = 3;\n        break;\n    case 3:\n        id = GetNewLeaderCandidate();\n        switch (id)\n        {\n        case 1:\n            PlaySE(SE_PC_LOGIN);\n        default:\n            if (data->showListMenu)\n                RedrawListMenu(data->listTaskId);\n            break;\n        case 0:\n            if (data->showListMenu)\n                id = ListMenu_ProcessInput(data->listTaskId);\n            if (data->refreshTimer > 120)\n            {\n                if (data->playerList->players[0].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->playerList->players[0].rfu.data.startedActivity)\n                {\n                    if (HasWonderCardOrNewsByLinkGroup(&data->playerList->players[0].rfu.data, data->isWonderNews + LINK_GROUP_WONDER_CARD))\n                    {\n                        data->leaderId = 0;\n                        data->refreshTimer = 0;\n                        LoadWirelessStatusIndicatorSpriteGfx();\n                        CreateWirelessStatusIndicatorSprite(0, 0);\n                        CreateTask_RfuReconnectWithParent(data->playerList->players[0].rfu.name, ReadAsU16(data->playerList->players[0].rfu.data.compatibility.playerTrainerId));\n                        PlaySE(SE_POKENAV_ON);\n                        data->state = 4;\n                    }\n                    else\n                    {\n                        PlaySE(SE_BOO);\n                        data->state = 10;\n                    }\n                }\n            }\n            else if (JOY_NEW(B_BUTTON))\n            {\n                data->state = 6;\n                data->refreshTimer = 0;\n            }\n            data->refreshTimer++;\n            break;\n        }\n        break;\n    case 4:\n        AddTextPrinterToWindow1(gText_UR_AwaitingResponseFromWirelessSystem);\n        CopyAndTranslatePlayerName2(gStringVar1, data->playerList->players[data->leaderId]);\n        data->state = 5;\n        break;\n    case 5:\n        if (gReceivedRemoteLinkPlayers)\n        {\n            sPlayerCurrActivity = data->playerList->players[data->leaderId].rfu.data.activity;\n            data->state = 12;\n        }\n\n        switch (RfuGetStatus())\n        {\n        case RFU_STATUS_FATAL_ERROR:\n        case RFU_STATUS_CONNECTION_ERROR:\n        case RFU_STATUS_JOIN_GROUP_NO:\n            data->state = 8;\n            break;\n        case RFU_STATUS_JOIN_GROUP_OK:\n            AddTextPrinterToWindow1(gText_UR_WirelessLinkEstablished);\n            RfuSetStatus(RFU_STATUS_OK, 0);\n            break;\n        }\n        break;\n    case 6:\n    case 8:\n    case 10:\n    case 12:\n        if (data->showListMenu)\n        {\n            DestroyListMenuTask(data->listTaskId, 0, 0);\n            CopyBgTilemapBufferToVram(0);\n            RemoveWindow(data->listWindowId);\n        }\n        DestroyTask(data->listenTaskId);\n        Free(data->playerList);\n        Free(data->incomingPlayerList);\n        data->state++;\n        break;\n    case 9:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gText_UR_WirelessLinkDropped))\n        {\n            DestroyWirelessStatusIndicatorSprite();\n            DestroyTask(taskId);\n            LinkRfu_Shutdown();\n            gSpecialVar_Result = LINKUP_FAILED;\n        }\n        break;\n    case 7:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gText_UR_WirelessSearchCanceled))\n        {\n            DestroyWirelessStatusIndicatorSprite();\n            DestroyTask(taskId);\n            LinkRfu_Shutdown();\n            gSpecialVar_Result = LINKUP_FAILED;\n        }\n        break;\n    case 11:\n        if (PrintMysteryGiftMenuMessage(&data->textState, gTexts_UR_NoWonderShared[data->isWonderNews]))\n        {\n            DestroyWirelessStatusIndicatorSprite();\n            DestroyTask(taskId);\n            LinkRfu_Shutdown();\n            gSpecialVar_Result = 5;\n        }\n        break;\n    case 13:\n        data->state++;\n        SetLinkStandbyCallback();\n        break;\n    case 14:\n        if (IsLinkTaskFinished())\n            DestroyTask(taskId);\n        break;\n    }\n}\n\nvoid RunUnionRoom(void)\n{\n    struct WirelessLink_URoom * uroom;\n\n    ResetHostRfuGameData();\n    CreateTask(Task_RunUnionRoom, 10);\n\n    // dumb line needed to match\n    sWirelessLinkMain.uRoom = sWirelessLinkMain.uRoom;\n\n    uroom = AllocZeroed(sizeof(*sWirelessLinkMain.uRoom));\n    sWirelessLinkMain.uRoom = uroom;\n    sURoom = uroom;\n\n    uroom->state = UR_STATE_INIT;\n    uroom->textState = 0;\n    uroom->unknown = 0;\n    uroom->unreadPlayerId = 0;\n\n    gSpecialVar_Result = 0;\n    ListMenuLoadStdPalAt(BG_PLTT_ID(13), 1);\n}\n\nstatic u16 ReadAsU16(const u8 *ptr)\n{\n    return (ptr[1] << 8) | (ptr[0]);\n}\n\nstatic void ScheduleFieldMessageWithFollowupState(u32 nextState, const u8 *src)\n{\n    struct WirelessLink_URoom * uroom = sWirelessLinkMain.uRoom;\n\n    uroom->state = UR_STATE_PRINT_MSG;\n    uroom->stateAfterPrint = nextState;\n    if (src != gStringVar4)\n        StringExpandPlaceholders(gStringVar4, src);\n}\n\nstatic void ScheduleFieldMessageAndExit(const u8 *src)\n{\n    struct WirelessLink_URoom * uroom = sWirelessLinkMain.uRoom;\n\n    uroom->state = UR_STATE_PRINT_AND_EXIT;\n    if (src != gStringVar4)\n        StringExpandPlaceholders(gStringVar4, src);\n}\n\nstatic void CopyPlayerListToBuffer(struct WirelessLink_URoom * uroom)\n{\n    memcpy(&gDecompressionBuffer[sizeof(gDecompressionBuffer) - (MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer))],\n            uroom->playerList,\n            MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer));\n}\n\nstatic void CopyPlayerListFromBuffer(struct WirelessLink_URoom * uroom)\n{\n    memcpy(uroom->playerList,\n           &gDecompressionBuffer[sizeof(gDecompressionBuffer) - (MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer))],\n           MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer));\n}\n\nstatic void Task_RunUnionRoom(u8 taskId)\n{\n    u32 id = 0;\n    s32 input = 0;\n    s32 playerGender = MALE;\n    struct WirelessLink_URoom * uroom = sWirelessLinkMain.uRoom;\n    s16 *taskData = gTasks[taskId].data;\n\n    switch (uroom->state)\n    {\n    case UR_STATE_INIT:\n        uroom->incomingChildList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer));\n        uroom->incomingParentList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer));\n        uroom->playerList = AllocZeroed(MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer));\n        uroom->spawnPlayer = AllocZeroed(sizeof(struct RfuPlayer));\n        ClearRfuPlayerList(uroom->playerList->players, MAX_UNION_ROOM_LEADERS);\n        sPlayerCurrActivity = IN_UNION_ROOM;\n        uroom->searchTaskId = CreateTask_SearchForChildOrParent(uroom->incomingParentList, uroom->incomingChildList, LINK_GROUP_UNION_ROOM_RESUME);\n        InitUnionRoomPlayerObjects(uroom->objects);\n        MakeGroupAssemblyAreasPassable();\n        uroom->state = UR_STATE_INIT_OBJECTS;\n        break;\n    case UR_STATE_INIT_OBJECTS:\n        CreateUnionRoomPlayerSprites(uroom->spriteIds, taskData[0]);\n        if (++taskData[0] == MAX_UNION_ROOM_LEADERS)\n            uroom->state = UR_STATE_INIT_LINK;\n        break;\n    case UR_STATE_INIT_LINK:\n        SetHostRfuGameData(IN_UNION_ROOM, 0, FALSE);\n        SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);\n        SetWirelessCommType1();\n        OpenLink();\n        InitializeRfuLinkManager_EnterUnionRoom();\n        ClearRfuPlayerList(&uroom->spawnPlayer->players[0], 1);\n        ClearIncomingPlayerList(uroom->incomingChildList->players, RFU_CHILD_MAX);\n        ClearIncomingPlayerList(uroom->incomingParentList->players, RFU_CHILD_MAX);\n        gSpecialVar_Result = 0;\n        uroom->state = UR_STATE_CHECK_SELECTING_MON;\n        break;\n    case UR_STATE_CHECK_SELECTING_MON:\n        if ((GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_REGISTER\n          || GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_TRADE)\n            && sUnionRoomTrade.state != URTRADE_STATE_NONE)\n        {\n            id = GetCursorSelectionMonId();\n            switch (sUnionRoomTrade.state)\n            {\n            case URTRADE_STATE_REGISTERING:\n                UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);\n                if (id >= PARTY_SIZE)\n                {\n                    ResetUnionRoomTrade(&sUnionRoomTrade);\n                    SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0);\n                    ScheduleFieldMessageAndExit(gText_UR_RegistrationCanceled);\n                }\n                else if (!RegisterTradeMonAndGetIsEgg(GetCursorSelectionMonId(), &sUnionRoomTrade))\n                {\n                    ScheduleFieldMessageWithFollowupState(UR_STATE_REGISTER_REQUEST_TYPE, gText_UR_ChooseRequestedMonType);\n                }\n                else\n                {\n                    uroom->state = UR_STATE_REGISTER_COMPLETE;\n                }\n                break;\n            case URTRADE_STATE_OFFERING:\n                CopyPlayerListFromBuffer(uroom);\n                taskData[1] = sUnionRoomTrade.offerPlayerId;\n                if (id >= PARTY_SIZE)\n                {\n                    ScheduleFieldMessageAndExit(gText_UR_TradeCanceled);\n                }\n                else\n                {\n                    UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);\n                    sPlayerCurrActivity = ACTIVITY_TRADE | IN_UNION_ROOM;\n                    RegisterTradeMon(GetCursorSelectionMonId(), &sUnionRoomTrade);\n                    uroom->state = UR_STATE_TRADE_OFFER_MON;\n                }\n                break;\n            }\n            sUnionRoomTrade.state = URTRADE_STATE_NONE;\n        }\n        else\n        {\n            uroom->state = UR_STATE_MAIN;\n        }\n        break;\n    case UR_STATE_MAIN:\n        if (gSpecialVar_Result != 0)\n        {\n            if (gSpecialVar_Result == UR_INTERACT_ATTENDANT)\n            {\n                UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);\n                PlaySE(SE_PC_LOGIN);\n                StringCopy(gStringVar1, gSaveBlock2Ptr->playerName);\n                uroom->state = UR_STATE_INTERACT_WITH_ATTENDANT;\n                gSpecialVar_Result = 0;\n            }\n            else if (gSpecialVar_Result == UR_INTERACT_START_MENU)\n            {\n                UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);\n                uroom->state = UR_STATE_WAIT_FOR_START_MENU;\n                gSpecialVar_Result = 0;\n            }\n            else // UR_INTERACT_PLAYER_# (1-8)\n            {\n                taskData[0] = 0;\n                taskData[1] = gSpecialVar_Result - 1;\n                uroom->state = UR_STATE_INTERACT_WITH_PLAYER;\n                gSpecialVar_Result = 0;\n            }\n        }\n        else if (ArePlayerFieldControlsLocked() != TRUE)\n        {\n            if (JOY_NEW(A_BUTTON))\n            {\n                if (TryInteractWithUnionRoomMember(uroom->playerList, &taskData[0], &taskData[1], uroom->spriteIds))\n                {\n                    PlaySE(SE_SELECT);\n                    StartScriptInteraction();\n                    uroom->state = UR_STATE_INTERACT_WITH_PLAYER;\n                    break;\n                }\n                else if (IsPlayerFacingTradingBoard())\n                {\n                    UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);\n                    PlaySE(SE_PC_LOGIN);\n                    StartScriptInteraction();\n                    StringCopy(gStringVar1, gSaveBlock2Ptr->playerName);\n                    uroom->state = UR_STATE_CHECK_TRADING_BOARD;\n                    break;\n                }\n            }\n\n            switch (HandlePlayerListUpdate())\n            {\n            case PLIST_NEW_PLAYER:\n                PlaySE(SE_NOTE_C);\n            case PLIST_RECENT_UPDATE:\n                ScheduleUnionRoomPlayerRefresh(uroom);\n                break;\n            case PLIST_CONTACTED:\n                uroom->state = UR_STATE_PLAYER_CONTACTED_YOU;\n                StartScriptInteraction();\n                SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0);\n                UpdateGameData_SetActivity(ACTIVITY_NPCTALK | IN_UNION_ROOM, GetActivePartnersInfo(uroom), FALSE);\n                break;\n            }\n            HandleUnionRoomPlayerRefresh(uroom);\n        }\n        break;\n    case UR_STATE_WAIT_FOR_START_MENU:\n        if (!FuncIsActiveTask(Task_StartMenuHandleInput))\n        {\n            UpdateGameData_SetActivity(ACTIVITY_NONE | IN_UNION_ROOM, 0, FALSE);\n            uroom->state = UR_STATE_MAIN;\n        }\n        break;\n    case UR_STATE_INTERACT_WITH_PLAYER:\n        UR_RunTextPrinters();\n        playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList);\n        UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);\n        switch (UnionRoomGetPlayerInteractionResponse(uroom->playerList, taskData[0], taskData[1], playerGender))\n        {\n        case 0: // Player is or was just doing an activity\n            uroom->state = UR_STATE_PRINT_AND_EXIT;\n            break;\n        case 1: // Link communicating\n            TryConnectToUnionRoomParent(uroom->playerList->players[taskData[1]].rfu.name, &uroom->playerList->players[taskData[1]].rfu.data, sPlayerCurrActivity);\n            uroom->unreadPlayerId = id; // Should be just 0, but won't match any other way.\n            uroom->state = UR_STATE_TRY_COMMUNICATING;\n            break;\n        case 2: // Ask to join chat\n            ScheduleFieldMessageWithFollowupState(UR_STATE_RECV_JOIN_CHAT_REQUEST, gStringVar4);\n            break;\n        }\n        break;\n    case UR_STATE_TRY_COMMUNICATING:\n        UR_RunTextPrinters();\n        switch (RfuGetStatus())\n        {\n        case RFU_STATUS_NEW_CHILD_DETECTED:\n            HandleCancelActivity(TRUE);\n            uroom->state = UR_STATE_MAIN;\n            break;\n        case RFU_STATUS_FATAL_ERROR:\n        case RFU_STATUS_CONNECTION_ERROR:\n            if (IsUnionRoomListenTaskActive() == TRUE)\n                ScheduleFieldMessageAndExit(gText_UR_TrainerAppearsBusy);\n            else\n                ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_ACTIVITY_LINK_ERROR, gText_UR_TrainerAppearsBusy);\n\n            sPlayerCurrActivity = IN_UNION_ROOM;\n            break;\n        }\n\n        if (gReceivedRemoteLinkPlayers)\n        {\n            CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);\n            CreateTask(Task_ExchangeCards, 5);\n            uroom->state = UR_STATE_COMMUNICATING_WAIT_FOR_DATA;\n        }\n        break;\n    case UR_STATE_COMMUNICATING_WAIT_FOR_DATA:\n        if (!FuncIsActiveTask(Task_ExchangeCards))\n        {\n            if (sPlayerCurrActivity == (ACTIVITY_TRADE | IN_UNION_ROOM))\n                ScheduleFieldMessageWithFollowupState(UR_STATE_SEND_TRADE_REQUST, gText_UR_AwaitingPlayersResponseAboutTrade);\n            else\n                uroom->state = UR_STATE_DO_SOMETHING_PROMPT;\n        }\n        break;\n    case UR_STATE_CANCEL_ACTIVITY_LINK_ERROR:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            HandleCancelActivity(FALSE);\n            UpdateUnionRoomMemberFacing(taskData[0], taskData[1], uroom->playerList);\n            uroom->state = UR_STATE_INIT_LINK;\n        }\n        break;\n    case UR_STATE_DO_SOMETHING_PROMPT:\n        id = ConvPartnerUnameAndGetWhetherMetAlready(&uroom->playerList->players[taskData[1]]);\n        playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList);\n        ScheduleFieldMessageWithFollowupState(UR_STATE_HANDLE_DO_SOMETHING_PROMPT_INPUT, gTexts_UR_HiDoSomething[id][playerGender]);\n        break;\n    case UR_STATE_HANDLE_DO_SOMETHING_PROMPT_INPUT:\n        input = ListMenuHandler_AllItemsAvailable(&uroom->textState,\n                                                  &uroom->topListMenuWindowId,\n                                                  &uroom->topListMenuId,\n                                                  &sWindowTemplate_InviteToActivity,\n                                                  &sListMenuTemplate_InviteToActivity);\n        if (input != LIST_NOTHING_CHOSEN)\n        {\n            if (!gReceivedRemoteLinkPlayers)\n            {\n                uroom->state = UR_STATE_TRAINER_APPEARS_BUSY;\n            }\n            else\n            {\n                uroom->partnerYesNoResponse = 0;\n                playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList);\n                if (input == LIST_CANCEL || input == IN_UNION_ROOM)\n                {\n                    uroom->playerSendBuffer[0] = IN_UNION_ROOM;\n                    Rfu_SendPacket(uroom->playerSendBuffer);\n                    StringCopy(gStringVar4, gTexts_UR_IfYouWantToDoSomething[gLinkPlayers[0].gender]);\n                    uroom->state = UR_STATE_REQUEST_DECLINED;\n                }\n                else\n                {\n                    sPlayerCurrActivity = input;\n                    sPlayerActivityGroupSize = (u32)(input) >> 8; // Extract capacity from sInviteToActivityMenuItems\n                    if (sPlayerCurrActivity == (ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM) && !HasAtLeastTwoMonsOfLevel30OrLower())\n                    {\n                        ScheduleFieldMessageWithFollowupState(UR_STATE_DO_SOMETHING_PROMPT, gText_UR_NeedTwoMonsOfLevel30OrLower1);\n                    }\n                    else\n                    {\n                        uroom->playerSendBuffer[0] = sPlayerCurrActivity | IN_UNION_ROOM;\n                        Rfu_SendPacket(uroom->playerSendBuffer);\n                        uroom->state = UR_STATE_SEND_ACTIVITY_REQUEST;\n                    }\n                }\n            }\n        }\n        break;\n    case UR_STATE_TRAINER_APPEARS_BUSY:\n        StringCopy(gStringVar4, gText_UR_TrainerBattleBusy);\n        uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;\n        break;\n    case UR_STATE_SEND_ACTIVITY_REQUEST:\n        PollPartnerYesNoResponse(uroom);\n        playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList);\n        id = GetResponseIdx_InviteToURoomActivity(uroom->playerSendBuffer[0] & 0x3F);\n        if (PrintOnTextbox(&uroom->textState, gTexts_UR_WaitOrShowCard[playerGender][id]))\n        {\n            taskData[3] = 0;\n            uroom->state = UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST;\n        }\n        break;\n    case UR_STATE_REQUEST_DECLINED:\n        SetCloseLinkCallback();\n        uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;\n        break;\n    case UR_STATE_SEND_TRADE_REQUST:\n        uroom->playerSendBuffer[0] = ACTIVITY_TRADE | IN_UNION_ROOM;\n        uroom->playerSendBuffer[1] = sUnionRoomTrade.species;\n        uroom->playerSendBuffer[2] = sUnionRoomTrade.level;\n        Rfu_SendPacket(uroom->playerSendBuffer);\n        uroom->state = UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST;\n        break;\n    case UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            StringCopy(gStringVar4, gText_UR_TrainerBattleBusy);\n            uroom->state = UR_STATE_TRAINER_APPEARS_BUSY;\n        }\n        else\n        {\n            PollPartnerYesNoResponse(uroom);\n            if (uroom->partnerYesNoResponse == (ACTIVITY_ACCEPT | IN_UNION_ROOM))\n            {\n                if (sPlayerCurrActivity == ACTIVITY_CARD)\n                {\n                    ViewURoomPartnerTrainerCard(gStringVar4, uroom, MODE_CHILD);\n                    uroom->state = UR_STATE_PRINT_CARD_INFO;\n                }\n                else\n                {\n                    uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG;\n                }\n            }\n            else if (uroom->partnerYesNoResponse == (ACTIVITY_DECLINE | IN_UNION_ROOM))\n            {\n                uroom->state = UR_STATE_REQUEST_DECLINED;\n                GetURoomActivityRejectMsg(gStringVar4, sPlayerCurrActivity | IN_UNION_ROOM, gLinkPlayers[0].gender);\n                sPlayerCurrActivity = ACTIVITY_NONE;\n            }\n        }\n        break;\n    case UR_STATE_DO_SOMETHING_PROMPT_2:\n        id = ConvPartnerUnameAndGetWhetherMetAlready(&uroom->playerList->players[taskData[1]]);\n        playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList);\n        ScheduleFieldMessageWithFollowupState(UR_STATE_HANDLE_DO_SOMETHING_PROMPT_INPUT, gTexts_UR_HiDoSomething[id][playerGender]);\n        break;\n    case UR_STATE_PRINT_CARD_INFO:\n        if (PrintOnTextbox(&uroom->textState, gStringVar4))\n        {\n            uroom->state = UR_STATE_WAIT_FINISH_READING_CARD;\n            SetLinkStandbyCallback();\n            uroom->partnerYesNoResponse = 0;\n            uroom->recvActivityRequest[0] = 0;\n        }\n        break;\n    case UR_STATE_WAIT_FINISH_READING_CARD:\n        if (IsLinkTaskFinished())\n        {\n            if (GetMultiplayerId() == 0)\n            {\n                StringCopy(gStringVar1, gLinkPlayers[GetMultiplayerId() ^ 1].name);\n                id = PlayerHasMetTrainerBefore(gLinkPlayers[1].trainerId, gLinkPlayers[1].name);\n                StringExpandPlaceholders(gStringVar4, gTexts_UR_AwaitingResponse[id]);\n                uroom->state = UR_STATE_PRINT_CONTACT_MSG;\n            }\n            else\n            {\n                uroom->state = UR_STATE_DO_SOMETHING_PROMPT_2;\n            }\n        }\n        break;\n    case UR_STATE_RECV_JOIN_CHAT_REQUEST:\n        switch (UnionRoomHandleYesNo(&uroom->textState, FALSE))\n        {\n        case 0: // YES\n            CopyBgTilemapBufferToVram(0);\n            sPlayerCurrActivity = ACTIVITY_CHAT | IN_UNION_ROOM;\n            UpdateGameData_SetActivity(ACTIVITY_CHAT | IN_UNION_ROOM, 0, TRUE);\n            TryConnectToUnionRoomParent(uroom->playerList->players[taskData[1]].rfu.name, &uroom->playerList->players[taskData[1]].rfu.data, sPlayerCurrActivity);\n            uroom->unreadPlayerId = taskData[1];\n            uroom->state = UR_STATE_TRY_ACCEPT_CHAT_REQUEST_DELAY;\n            taskData[3] = 0;\n            break;\n        case 1: // NO\n        case MENU_B_PRESSED:\n            playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList);\n            ScheduleFieldMessageAndExit(gTexts_UR_DeclineChat[playerGender]);\n            break;\n        }\n        break;\n    case UR_STATE_TRY_ACCEPT_CHAT_REQUEST_DELAY:\n        if (++taskData[2] > 60)\n        {\n            uroom->state = UR_STATE_TRY_ACCEPT_CHAT_REQUEST;\n            taskData[2] = 0;\n        }\n        break;\n    case UR_STATE_TRY_ACCEPT_CHAT_REQUEST:\n        switch (RfuGetStatus())\n        {\n        case RFU_STATUS_NEW_CHILD_DETECTED:\n            HandleCancelActivity(TRUE);\n            uroom->state = UR_STATE_MAIN;\n            break;\n        case RFU_STATUS_FATAL_ERROR:\n        case RFU_STATUS_CONNECTION_ERROR:\n            playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList);\n            UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);\n            if (IsUnionRoomListenTaskActive() == TRUE)\n                ScheduleFieldMessageAndExit(gTexts_UR_ChatDeclined[playerGender]);\n            else\n                ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_ACTIVITY_LINK_ERROR, gTexts_UR_ChatDeclined[playerGender]);\n            break;\n        case RFU_STATUS_CHILD_SEND_COMPLETE:\n            uroom->state = UR_STATE_ACCEPT_CHAT_REQUEST;\n            break;\n        }\n        taskData[3]++;\n        break;\n    case UR_STATE_ACCEPT_CHAT_REQUEST:\n        if (RfuHasErrored())\n        {\n            playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->playerList);\n            UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);\n            if (IsUnionRoomListenTaskActive() == TRUE)\n                ScheduleFieldMessageAndExit(gTexts_UR_ChatDeclined[playerGender]);\n            else\n                ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_ACTIVITY_LINK_ERROR, gTexts_UR_ChatDeclined[playerGender]);\n        }\n        if (gReceivedRemoteLinkPlayers)\n            uroom->state = UR_STATE_START_ACTIVITY_FREE_UROOM;\n        break;\n    case UR_STATE_PLAYER_CONTACTED_YOU:\n        PlaySE(SE_DING_DONG);\n        StopUnionRoomLinkManager();\n        uroom->state = UR_STATE_RECV_CONTACT_DATA;\n        uroom->recvActivityRequest[0] = 0;\n        break;\n    case UR_STATE_RECV_CONTACT_DATA:\n        if (RfuHasErrored())\n        {\n            HandleCancelActivity(FALSE);\n            uroom->state = UR_STATE_INIT_LINK;\n        }\n        else if (gReceivedRemoteLinkPlayers)\n        {\n            CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);\n            CreateTask(Task_ExchangeCards, 5);\n            uroom->state = UR_STATE_WAIT_FOR_CONTACT_DATA;\n        }\n        break;\n    case UR_STATE_WAIT_FOR_CONTACT_DATA:\n        ReceiveUnionRoomActivityPacket(uroom);\n        if (!FuncIsActiveTask(Task_ExchangeCards))\n        {\n            uroom->state = UR_STATE_PRINT_CONTACT_MSG;\n            StringCopy(gStringVar1, gLinkPlayers[1].name);\n            id = PlayerHasMetTrainerBefore(gLinkPlayers[1].trainerId, gLinkPlayers[1].name);\n            StringExpandPlaceholders(gStringVar4, gTexts_UR_PlayerContactedYou[id]);\n        }\n        break;\n    case UR_STATE_PRINT_CONTACT_MSG:\n        ReceiveUnionRoomActivityPacket(uroom);\n        if (PrintOnTextbox(&uroom->textState, gStringVar4))\n            uroom->state = UR_STATE_HANDLE_CONTACT_DATA;\n        break;\n    case UR_STATE_HANDLE_CONTACT_DATA:\n        ReceiveUnionRoomActivityPacket(uroom);\n        if (HandleContactFromOtherPlayer(uroom) && JOY_NEW(B_BUTTON))\n        {\n            Rfu_DisconnectPlayerById(1);\n            StringCopy(gStringVar4, gText_UR_ChatEnded);\n            uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;\n        }\n        break;\n    case UR_STATE_RECV_ACTIVITY_REQUEST:\n        ScheduleFieldMessageWithFollowupState(UR_STATE_HANDLE_ACTIVITY_REQUEST, gStringVar4);\n        break;\n    case UR_STATE_HANDLE_ACTIVITY_REQUEST:\n        switch (UnionRoomHandleYesNo(&uroom->textState, FALSE))\n        {\n        case 0: // ACCEPT\n            uroom->playerSendBuffer[0] = ACTIVITY_ACCEPT | IN_UNION_ROOM;\n            if (sPlayerCurrActivity == (ACTIVITY_CHAT | IN_UNION_ROOM))\n                UpdateGameData_SetActivity(sPlayerCurrActivity | IN_UNION_ROOM, GetLinkPlayerInfoFlags(1), FALSE);\n            else\n                UpdateGameData_SetActivity(sPlayerCurrActivity | IN_UNION_ROOM, GetLinkPlayerInfoFlags(1), TRUE);\n\n            uroom->spawnPlayer->players[0].newPlayerCountdown = 0;\n            taskData[3] = 0;\n            if (sPlayerCurrActivity == (ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM))\n            {\n                if (!HasAtLeastTwoMonsOfLevel30OrLower())\n                {\n                    uroom->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM;\n                    Rfu_SendPacket(uroom->playerSendBuffer);\n                    uroom->state = UR_STATE_DECLINE_ACTIVITY_REQUEST;\n                    StringCopy(gStringVar4, gText_UR_NeedTwoMonsOfLevel30OrLower2);\n                }\n                else\n                {\n                    Rfu_SendPacket(uroom->playerSendBuffer);\n                    uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG;\n                }\n            }\n            else if (sPlayerCurrActivity == (ACTIVITY_CARD | IN_UNION_ROOM))\n            {\n                Rfu_SendPacket(uroom->playerSendBuffer);\n                ViewURoomPartnerTrainerCard(gStringVar4, uroom, MODE_PARENT);\n                uroom->state = UR_STATE_PRINT_CARD_INFO;\n            }\n            else\n            {\n                Rfu_SendPacket(uroom->playerSendBuffer);\n                uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG;\n            }\n            break;\n        case 1: // DECLINE\n        case MENU_B_PRESSED:\n            uroom->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM;\n            Rfu_SendPacket(uroom->playerSendBuffer);\n            uroom->state = UR_STATE_DECLINE_ACTIVITY_REQUEST;\n            GetYouDeclinedTheOfferMessage(gStringVar4, sPlayerCurrActivity);\n            break;\n        }\n        break;\n    case UR_STATE_DECLINE_ACTIVITY_REQUEST:\n        SetCloseLinkCallback();\n        uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;\n        break;\n    case UR_STATE_CANCEL_REQUEST_PRINT_MSG:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            sPlayerCurrActivity = IN_UNION_ROOM;\n            ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_REQUEST_RESTART_LINK, gStringVar4);\n            memset(uroom->playerSendBuffer, 0, sizeof(uroom->playerSendBuffer));\n            uroom->recvActivityRequest[0] = 0;\n            uroom->partnerYesNoResponse = 0;\n        }\n        break;\n    case UR_STATE_CANCEL_REQUEST_RESTART_LINK:\n        uroom->state = UR_STATE_INIT_LINK;\n        HandleCancelActivity(FALSE);\n        break;\n    case UR_STATE_PRINT_START_ACTIVITY_MSG:\n        GetURoomActivityStartMsg(gStringVar4, sPlayerCurrActivity | IN_UNION_ROOM);\n        ScheduleFieldMessageWithFollowupState(UR_STATE_START_ACTIVITY_LINK, gStringVar4);\n        break;\n    case UR_STATE_START_ACTIVITY_LINK:\n        SetLinkStandbyCallback();\n        uroom->state = UR_STATE_START_ACTIVITY_WAIT_FOR_LINK;\n        break;\n    case UR_STATE_START_ACTIVITY_WAIT_FOR_LINK:\n        if (IsLinkTaskFinished())\n            uroom->state = UR_STATE_START_ACTIVITY_FREE_UROOM;\n        break;\n    case UR_STATE_START_ACTIVITY_FREE_UROOM:\n        Free(uroom->spawnPlayer);\n        Free(uroom->playerList);\n        Free(uroom->incomingParentList);\n        Free(uroom->incomingChildList);\n        DestroyTask(uroom->searchTaskId);\n        DestroyUnionRoomPlayerSprites(uroom->spriteIds);\n        uroom->state = UR_STATE_START_ACTIVITY_FADE;\n        break;\n    case UR_STATE_START_ACTIVITY_FADE:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        uroom->state = UR_STATE_START_ACTIVITY;\n        break;\n    case UR_STATE_START_ACTIVITY:\n        if (!UpdatePaletteFade())\n        {\n            DestroyUnionRoomPlayerObjects();\n            DestroyTask(taskId);\n            Free(sWirelessLinkMain.uRoom);\n            CreateTask_StartActivity();\n        }\n        break;\n    case UR_STATE_INTERACT_WITH_ATTENDANT:\n        if (GetHostRfuGameData()->tradeSpecies == SPECIES_NONE)\n        {\n            uroom->state = UR_STATE_REGISTER_PROMPT;\n        }\n        else\n        {\n            if (GetHostRfuGameData()->tradeSpecies == SPECIES_EGG)\n            {\n                StringCopy(gStringVar4, gText_UR_CancelRegistrationOfEgg);\n            }\n            else\n            {\n                StringCopy(gStringVar1, gSpeciesNames[GetHostRfuGameData()->tradeSpecies]);\n                ConvertIntToDecimalStringN(gStringVar2, GetHostRfuGameData()->tradeLevel, STR_CONV_MODE_LEFT_ALIGN, 3);\n                StringExpandPlaceholders(gStringVar4, gText_UR_CancelRegistrationOfMon);\n            }\n            ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_REGISTRATION_PROMPT, gStringVar4);\n        }\n        break;\n    case UR_STATE_REGISTER_PROMPT:\n        if (PrintOnTextbox(&uroom->textState, gText_UR_RegisterMonAtTradingBoard))\n            uroom->state = UR_STATE_REGISTER_PROMPT_HANDLE_INPUT;\n        break;\n    case UR_STATE_REGISTER_PROMPT_HANDLE_INPUT:\n        input = ListMenuHandler_AllItemsAvailable(&uroom->textState,\n                                                 &uroom->tradeBoardMainWindowId,\n                                                 &uroom->tradeBoardHeaderWindowId,\n                                                 &sWindowTemplate_RegisterForTrade,\n                                                 &sListMenuTemplate_RegisterForTrade);\n        if (input != LIST_NOTHING_CHOSEN)\n        {\n            if (input == LIST_CANCEL || input == 3) // Exit\n            {\n                uroom->state = UR_STATE_MAIN;\n                HandleCancelActivity(TRUE);\n            }\n            else\n            {\n                switch (input)\n                {\n                case 1: // REGISTER\n                    ScheduleFieldMessageWithFollowupState(UR_STATE_REGISTER_SELECT_MON_FADE, gText_UR_WhichMonWillYouOffer);\n                    break;\n                case 2: // INFO\n                    ScheduleFieldMessageWithFollowupState(UR_STATE_REGISTER_PROMPT_HANDLE_INPUT, gText_UR_TradingBoardInfo);\n                    break;\n                }\n            }\n            DestroyHelpMessageWindow_();\n        }\n        break;\n    case UR_STATE_REGISTER_SELECT_MON_FADE:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        uroom->state = UR_STATE_REGISTER_SELECT_MON;\n        break;\n    case UR_STATE_REGISTER_SELECT_MON:\n        if (!gPaletteFade.active)\n        {\n            sUnionRoomTrade.state = URTRADE_STATE_REGISTERING;\n            gFieldCallback = FieldCB_ContinueScriptUnionRoom;\n            ChooseMonForTradingBoard(PARTY_MENU_TYPE_UNION_ROOM_REGISTER, CB2_ReturnToField);\n        }\n        break;\n    case UR_STATE_REGISTER_REQUEST_TYPE:\n        input = ListMenuHandler_AllItemsAvailable(&uroom->textState, &uroom->tradeBoardMainWindowId, &uroom->tradeBoardHeaderWindowId, &sWindowTemplate_TypeNames, &sListMenuTemplate_TypeNames);\n        if (input != LIST_NOTHING_CHOSEN)\n        {\n            switch (input)\n            {\n            case LIST_CANCEL:\n            case NUMBER_OF_MON_TYPES: // Exit\n                ResetUnionRoomTrade(&sUnionRoomTrade);\n                SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0);\n                ScheduleFieldMessageAndExit(gText_UR_RegistrationCanceled);\n                break;\n            default:\n                sUnionRoomTrade.type = input;\n                uroom->state = UR_STATE_REGISTER_COMPLETE;\n                break;\n            }\n        }\n        break;\n    case UR_STATE_REGISTER_COMPLETE:\n        SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);\n        ScheduleFieldMessageAndExit(gText_UR_RegistraionCompleted);\n        break;\n    case UR_STATE_CANCEL_REGISTRATION_PROMPT:\n        switch (UnionRoomHandleYesNo(&uroom->textState, FALSE))\n        {\n        case 0: // YES\n            uroom->state = UR_STATE_CANCEL_REGISTRATION;\n            break;\n        case 1: // NO\n        case MENU_B_PRESSED:\n            HandleCancelActivity(TRUE);\n            uroom->state = UR_STATE_MAIN;\n            break;\n        }\n        break;\n    case UR_STATE_CANCEL_REGISTRATION:\n        if (PrintOnTextbox(&uroom->textState, gText_UR_RegistrationCanceled2))\n        {\n            SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0);\n            ResetUnionRoomTrade(&sUnionRoomTrade);\n            HandleCancelActivity(TRUE);\n            uroom->state = UR_STATE_MAIN;\n        }\n        break;\n    case UR_STATE_CHECK_TRADING_BOARD:\n        if (PrintOnTextbox(&uroom->textState, gText_UR_XCheckedTradingBoard))\n            uroom->state = UR_STATE_TRADING_BOARD_LOAD;\n        break;\n    case UR_STATE_TRADING_BOARD_LOAD:\n        UR_ClearBg0();\n        uroom->state = UR_STATE_TRADING_BOARD_HANDLE_INPUT;\n        break;\n    case UR_STATE_TRADING_BOARD_HANDLE_INPUT:\n        input = TradeBoardMenuHandler(&uroom->textState,\n                                      &uroom->tradeBoardMainWindowId,\n                                      &uroom->tradeBoardListMenuId,\n                                      &uroom->tradeBoardHeaderWindowId,\n                                      &sWindowTemplate_TradingBoardMain,\n                                      &sListMenuTemplate_TradeBoard,\n                                      uroom->playerList);\n        if (input != LIST_NOTHING_CHOSEN)\n        {\n            switch (input)\n            {\n            case LIST_CANCEL:\n            case 8: // EXIT\n                HandleCancelActivity(TRUE);\n                DestroyHelpMessageWindow_();\n                uroom->state = UR_STATE_MAIN;\n                break;\n            default:\n                switch (IsRequestedTradeInPlayerParty(uroom->playerList->players[input].rfu.data.tradeType, uroom->playerList->players[input].rfu.data.tradeSpecies))\n                {\n                case UR_TRADE_MATCH:\n                    CopyAndTranslatePlayerName2(gStringVar1, uroom->playerList->players[input]);\n                    ScheduleFieldMessageWithFollowupState(UR_STATE_TRADE_PROMPT, gText_UR_AskTrainerToMakeTrade);\n                    taskData[1] = input;\n                    break;\n                case UR_TRADE_NOTYPE:\n                    CopyAndTranslatePlayerName2(gStringVar1, uroom->playerList->players[input]);\n                    StringCopy(gStringVar2, gTypeNames[uroom->playerList->players[input].rfu.data.tradeType]);\n                    ScheduleFieldMessageWithFollowupState(UR_STATE_TRADING_BOARD_LOAD, gText_UR_DontHaveTypeTrainerWants);\n                    break;\n                case UR_TRADE_NOEGG:\n                    CopyAndTranslatePlayerName2(gStringVar1, uroom->playerList->players[input]);\n                    StringCopy(gStringVar2, gTypeNames[uroom->playerList->players[input].rfu.data.tradeType]);\n                    ScheduleFieldMessageWithFollowupState(UR_STATE_TRADING_BOARD_LOAD, gText_UR_DontHaveEggTrainerWants);\n                    break;\n                }\n                break;\n            }\n        }\n        break;\n    case UR_STATE_TRADE_PROMPT:\n        switch (UnionRoomHandleYesNo(&uroom->textState, FALSE))\n        {\n        case 0: // YES\n            uroom->state = UR_STATE_TRADE_SELECT_MON;\n            break;\n        case MENU_B_PRESSED:\n        case 1: // NO\n            HandleCancelActivity(TRUE);\n            uroom->state = UR_STATE_MAIN;\n            break;\n        }\n        break;\n    case UR_STATE_TRADE_SELECT_MON:\n        if (PrintOnTextbox(&uroom->textState, gText_UR_WhichMonWillYouOffer))\n        {\n            sUnionRoomTrade.state = URTRADE_STATE_OFFERING;\n            memcpy(&gRfuPartnerCompatibilityData, &uroom->playerList->players[taskData[1]].rfu.data.compatibility, sizeof(gRfuPartnerCompatibilityData));\n            gUnionRoomRequestedMonType = uroom->playerList->players[taskData[1]].rfu.data.tradeType;\n            gUnionRoomOfferedSpecies = uroom->playerList->players[taskData[1]].rfu.data.tradeSpecies;\n            gFieldCallback = FieldCB_ContinueScriptUnionRoom;\n            ChooseMonForTradingBoard(PARTY_MENU_TYPE_UNION_ROOM_TRADE, CB2_ReturnToField);\n            CopyPlayerListToBuffer(uroom);\n            sUnionRoomTrade.offerPlayerId = taskData[1];\n        }\n        break;\n    case UR_STATE_TRADE_OFFER_MON:\n        sPlayerCurrActivity = ACTIVITY_TRADE | IN_UNION_ROOM;\n        TryConnectToUnionRoomParent(uroom->playerList->players[taskData[1]].rfu.name, &uroom->playerList->players[taskData[1]].rfu.data, ACTIVITY_TRADE | IN_UNION_ROOM);\n        CopyAndTranslatePlayerName2(gStringVar1, uroom->playerList->players[taskData[1]]);\n        UR_PrintFieldMessage(gTexts_UR_CommunicatingWait[2]);\n        uroom->state = UR_STATE_TRY_COMMUNICATING;\n        break;\n    case UR_STATE_PRINT_AND_EXIT:\n        if (PrintOnTextbox(&uroom->textState, gStringVar4))\n        {\n            HandleCancelActivity(TRUE);\n            UpdateUnionRoomMemberFacing(taskData[0], taskData[1], uroom->playerList);\n            uroom->state = UR_STATE_MAIN;\n        }\n        break;\n    case UR_STATE_PRINT_MSG:\n        if (PrintOnTextbox(&uroom->textState, gStringVar4))\n            uroom->state = uroom->stateAfterPrint;\n        break;\n    }\n}\n\nvoid SetUsingUnionRoomStartMenu(void)\n{\n    if (InUnionRoom() == TRUE)\n        gSpecialVar_Result = UR_INTERACT_START_MENU;\n}\n\nstatic void ReceiveUnionRoomActivityPacket(struct WirelessLink_URoom * uroom)\n{\n    if (gRecvCmds[1][1] != 0 && (gRecvCmds[1][0] & RFUCMD_MASK) == RFUCMD_SEND_PACKET)\n    {\n        uroom->recvActivityRequest[0] = gRecvCmds[1][1];\n        if (gRecvCmds[1][1] == (ACTIVITY_TRADE | IN_UNION_ROOM))\n        {\n            uroom->recvActivityRequest[1] = gRecvCmds[1][2];\n            uroom->recvActivityRequest[2] = gRecvCmds[1][3];\n        }\n    }\n}\n\nstatic bool32 HandleContactFromOtherPlayer(struct WirelessLink_URoom * uroom)\n{\n    if (uroom->recvActivityRequest[0] != 0)\n    {\n        s32 id = GetChatLeaderActionRequestMessage(gStringVar4, gLinkPlayers[1].gender, &uroom->recvActivityRequest[0], uroom);\n        if (id == 0) // Error\n        {\n            return TRUE;\n        }\n        else if (id == 1) // Recieve activity request\n        {\n            uroom->state = UR_STATE_RECV_ACTIVITY_REQUEST;\n            sPlayerCurrActivity = uroom->recvActivityRequest[0];\n            return FALSE;\n        }\n        else if (id == 2) // No activity\n        {\n            uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;\n            SetCloseLinkCallback();\n            return FALSE;\n        }\n    }\n\n    return TRUE;\n}\n\nvoid InitUnionRoom(void)\n{\n    struct WirelessLink_URoom * data;\n\n    sUnionRoomPlayerName[0] = EOS;\n    if (QL_IS_PLAYBACK_STATE)\n        return;\n    CreateTask(Task_InitUnionRoom, 0);\n    sWirelessLinkMain.uRoom = sWirelessLinkMain.uRoom; // Needed to match.\n    sWirelessLinkMain.uRoom = data = AllocZeroed(sizeof(struct WirelessLink_URoom));\n    sURoom = sWirelessLinkMain.uRoom;\n    data->state = 0;\n    data->textState = 0;\n    data->unknown = 0;\n    data->unreadPlayerId = 0;\n    sUnionRoomPlayerName[0] = EOS;\n}\n\nstatic void Task_InitUnionRoom(u8 taskId)\n{\n    s32 i;\n    u8 text[32];\n    struct WirelessLink_URoom * data = sWirelessLinkMain.uRoom;\n\n    switch (data->state)\n    {\n    case 0:\n        data->state = 1;\n        break;\n    case 1:\n        SetHostRfuGameData(ACTIVITY_SEARCH, 0, FALSE);\n        SetWirelessCommType1();\n        OpenLink();\n        InitializeRfuLinkManager_EnterUnionRoom();\n        RfuSetIgnoreError(TRUE);\n        data->state = 2;\n        break;\n    case 2:\n        data->incomingChildList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer));\n        ClearIncomingPlayerList(data->incomingChildList->players, RFU_CHILD_MAX);\n        data->incomingParentList = AllocZeroed(RFU_CHILD_MAX * sizeof(struct RfuIncomingPlayer));\n        ClearIncomingPlayerList(data->incomingParentList->players, RFU_CHILD_MAX);\n        data->playerList = AllocZeroed(MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer));\n        ClearRfuPlayerList(data->playerList->players, MAX_UNION_ROOM_LEADERS);\n        data->spawnPlayer = AllocZeroed(sizeof(struct RfuPlayer));\n        ClearRfuPlayerList(&data->spawnPlayer->players[0], 1);\n        data->searchTaskId = CreateTask_SearchForChildOrParent(data->incomingParentList, data->incomingChildList, LINK_GROUP_UNION_ROOM_INIT);\n        data->state = 3;\n        break;\n    case 3:\n        switch (HandlePlayerListUpdate())\n        {\n        case PLIST_NEW_PLAYER:\n        case PLIST_RECENT_UPDATE:\n            if (sUnionRoomPlayerName[0] == EOS)\n            {\n                for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)\n                {\n                    if (data->playerList->players[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)\n                    {\n                        CopyAndTranslatePlayerName2(text, data->playerList->players[i]);\n                        if (PlayerHasMetTrainerBefore(ReadAsU16(data->playerList->players[i].rfu.data.compatibility.playerTrainerId), text))\n                        {\n                            StringCopy(sUnionRoomPlayerName, text);\n                            break;\n                        }\n                    }\n                }\n            }\n            break;\n        case PLIST_UNUSED:\n            break;\n        }\n        break;\n    case 4:\n        Free(data->spawnPlayer);\n        Free(data->playerList);\n        Free(data->incomingParentList);\n        Free(data->incomingChildList);\n        DestroyTask(data->searchTaskId);\n        Free(sWirelessLinkMain.uRoom);\n        LinkRfu_Shutdown();\n        DestroyTask(taskId);\n        break;\n    }\n}\n\nbool16 BufferUnionRoomPlayerName(void)\n{\n    if (sUnionRoomPlayerName[0] != EOS)\n    {\n        StringCopy(gStringVar1, sUnionRoomPlayerName);\n        sUnionRoomPlayerName[0] = EOS;\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nstatic u8 HandlePlayerListUpdate(void)\n{\n    s32 i;\n    u8 j;\n    struct WirelessLink_URoom * data = sWirelessLinkMain.uRoom;\n    s32 retVal = PLIST_NONE;\n\n    // If someone new joined, register them in spawnPlayer\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (ArePlayersDifferent(&data->incomingParentList->players[i].rfu, &sRfuPlayerData_Dummy) == TRUE)\n        {\n            data->spawnPlayer->players[0].rfu = data->incomingParentList->players[i].rfu;\n            data->spawnPlayer->players[0].timeoutCounter = 0;\n            data->spawnPlayer->players[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN;\n            data->spawnPlayer->players[0].newPlayerCountdown = 1;\n            return PLIST_CONTACTED;\n        }\n    }\n\n    // Handle changes to existing player statuses\n    for (j = 0; j < MAX_UNION_ROOM_LEADERS; j++)\n    {\n        if (data->playerList->players[j].groupScheduledAnim != UNION_ROOM_SPAWN_NONE)\n        {\n            i = GetNewIncomingPlayerId(&data->playerList->players[j], &data->incomingChildList->players[0]);\n            if (i != 0xFF)\n            {\n                if (data->playerList->players[j].groupScheduledAnim == UNION_ROOM_SPAWN_IN)\n                {\n                    // New join in queue\n                    if (ArePlayerDataDifferent(&data->playerList->players[j].rfu, &data->incomingChildList->players[i].rfu))\n                    {\n                        // Just joined, copy their names\n                        data->playerList->players[j].rfu = data->incomingChildList->players[i].rfu;\n                        data->playerList->players[j].newPlayerCountdown = 64;\n                        retVal = PLIST_NEW_PLAYER;\n                    }\n                    else if (data->playerList->players[j].newPlayerCountdown != 0)\n                    {\n                        data->playerList->players[j].newPlayerCountdown--;\n                        if (data->playerList->players[j].newPlayerCountdown == 0)\n                            retVal = PLIST_RECENT_UPDATE;\n                    }\n                }\n                else\n                {\n                    // New join, queue them\n                    data->playerList->players[j].groupScheduledAnim = UNION_ROOM_SPAWN_IN;\n                    data->playerList->players[j].newPlayerCountdown = 0;\n                    retVal = 2;\n                }\n                data->playerList->players[j].timeoutCounter = 0;\n            }\n            else if (data->playerList->players[j].groupScheduledAnim != UNION_ROOM_SPAWN_OUT)\n            {\n                // Person may have disconnected. Give them 10 seconds.\n                data->playerList->players[j].timeoutCounter++;\n                if (data->playerList->players[j].timeoutCounter >= 600)\n                {\n                    data->playerList->players[j].groupScheduledAnim = UNION_ROOM_SPAWN_OUT;\n                    retVal = PLIST_RECENT_UPDATE;\n                }\n            }\n            else if (data->playerList->players[j].groupScheduledAnim == UNION_ROOM_SPAWN_OUT)\n            {\n                // Person dropped. Wait 15 seconds, then remove them.\n                data->playerList->players[j].timeoutCounter++;\n                if (data->playerList->players[j].timeoutCounter >= 900)\n                {\n                    ClearRfuPlayerList(&data->playerList->players[j], 1);\n                }\n            }\n        }\n    }\n\n    // Update the players list\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (TryAddIncomingPlayerToList(&data->playerList->players[0], &data->incomingChildList->players[i], MAX_UNION_ROOM_LEADERS) != 0xFF)\n            retVal = PLIST_NEW_PLAYER;\n    }\n\n    return retVal;\n}\n\nstatic void Task_SearchForChildOrParent(u8 taskId)\n{\n    s32 i, j;\n    struct RfuPlayerData rfu;\n    struct RfuIncomingPlayerList ** list = (void *) gTasks[taskId].data;\n    bool8 isParent;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        isParent = Rfu_GetCompatiblePlayerData(&rfu.data, rfu.name, i);\n        if (!IsPartnerActivityAcceptable(rfu.data.activity, gTasks[taskId].data[4]))\n            rfu = sRfuPlayerData_Dummy;\n        if (rfu.data.compatibility.language == LANGUAGE_JAPANESE)\n            rfu = sRfuPlayerData_Dummy;\n\n        if (!isParent)\n        {\n            for (j = 0; j < i; j++)\n            {\n                if (!ArePlayersDifferent(&list[1]->players[j].rfu, &rfu))\n                    rfu = sRfuPlayerData_Dummy;\n            }\n            list[1]->players[i].rfu = rfu;\n            list[1]->players[i].active = ArePlayersDifferent(&list[1]->players[i].rfu, &sRfuPlayerData_Dummy);\n        }\n        else\n        {\n            list[0]->players[i].rfu = rfu;\n            list[0]->players[i].active = ArePlayersDifferent(&list[0]->players[i].rfu, &sRfuPlayerData_Dummy);\n        }\n    }\n}\n\nstatic u8 CreateTask_SearchForChildOrParent(struct RfuIncomingPlayerList * parentList, struct RfuIncomingPlayerList * childList, u32 linkGroup)\n{\n    u8 taskId = CreateTask(Task_SearchForChildOrParent, 0);\n    struct RfuIncomingPlayerList ** data = (void *)gTasks[taskId].data;\n    data[0] = parentList;\n    data[1] = childList;\n    gTasks[taskId].data[4] = linkGroup;\n    return taskId;\n}\n\nstatic void Task_ListenForCompatiblePartners(u8 taskId)\n{\n    s32 i, j;\n    struct RfuIncomingPlayerList ** list = (void *) gTasks[taskId].data;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        Rfu_GetCompatiblePlayerData(&list[0]->players[i].rfu.data, list[0]->players[i].rfu.name, i);\n        if (!IsPartnerActivityAcceptable(list[0]->players[i].rfu.data.activity, gTasks[taskId].data[2]))\n            list[0]->players[i].rfu = sRfuPlayerData_Dummy;\n\n        for (j = 0; j < i; j++)\n        {\n            if (!ArePlayersDifferent(&list[0]->players[j].rfu, &list[0]->players[i].rfu))\n                list[0]->players[i].rfu = sRfuPlayerData_Dummy;\n        }\n        list[0]->players[i].active = ArePlayersDifferent(&list[0]->players[i].rfu, &sRfuPlayerData_Dummy);\n    }\n}\n\nstatic bool32 HasWonderCardOrNewsByLinkGroup(struct RfuGameData * data, s16 linkGroup)\n{\n    if (linkGroup == LINK_GROUP_WONDER_CARD)\n    {\n        if (!data->compatibility.hasCard)\n            return FALSE;\n        else\n            return TRUE;\n    }\n    else if (linkGroup == LINK_GROUP_WONDER_NEWS)\n    {\n        if (!data->compatibility.hasNews)\n            return FALSE;\n        else\n            return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nstatic void Task_ListenForWonderDistributor(u8 taskId)\n{\n    s32 i;\n    struct RfuIncomingPlayerList ** list = (void *) gTasks[taskId].data;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (Rfu_GetWonderDistributorPlayerData(&list[0]->players[i].rfu.data, list[0]->players[i].rfu.name, i))\n            HasWonderCardOrNewsByLinkGroup(&list[0]->players[i].rfu.data, gTasks[taskId].data[2]);\n\n        list[0]->players[i].active = ArePlayersDifferent(&list[0]->players[i].rfu, &sRfuPlayerData_Dummy);\n    }\n}\n\nstatic u8 CreateTask_ListenForCompatiblePartners(struct RfuIncomingPlayerList * main4, u32 linkGroup)\n{\n    u8 taskId = CreateTask(Task_ListenForCompatiblePartners, 0);\n    struct RfuIncomingPlayerList ** list = (void *) gTasks[taskId].data;\n    list[0] = main4;\n    gTasks[taskId].data[2] = linkGroup;\n    return taskId;\n}\n\nstatic u8 CreateTask_ListenForWonderDistributor(struct RfuIncomingPlayerList * main4, u32 linkGroup)\n{\n    u8 taskId = CreateTask(Task_ListenForWonderDistributor, 0);\n    struct RfuIncomingPlayerList ** list = (void *) gTasks[taskId].data;\n    list[0] = main4;\n    gTasks[taskId].data[2] = linkGroup;\n    return taskId;\n}\n\nstatic bool32 UR_PrintFieldMessage(const u8 *src)\n{\n    LoadStdWindowFrameGfx();\n    DrawDialogueFrame(0, 1);\n    StringExpandPlaceholders(gStringVar4, src);\n    AddTextPrinterWithCustomSpeedForMessage(FALSE, 1);\n    return FALSE;\n}\n\nstatic bool32 UR_RunTextPrinters(void)\n{\n    if (!RunTextPrinters_CheckPrinter0Active())\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic bool8 PrintOnTextbox(u8 *textState, const u8 *str)\n{\n    switch (*textState)\n    {\n    case 0:\n        LoadStdWindowFrameGfx();\n        DrawDialogueFrame(0, 1);\n        StringExpandPlaceholders(gStringVar4, str);\n        AddTextPrinterForMessage(TRUE);\n        (*textState)++;\n        break;\n    case 1:\n        if (!RunTextPrinters_CheckPrinter0Active())\n        {\n            *textState = 0;\n            return TRUE;\n        }\n        break;\n    }\n    return FALSE;\n}\n\nstatic s8 UnionRoomHandleYesNo(u8 *state, bool32 noDraw)\n{\n    s8 input;\n\n    switch (*state)\n    {\n    case 0:\n        if (noDraw)\n            return -3;\n        DisplayYesNoMenuDefaultYes();\n        (*state)++;\n        break;\n    case 1:\n        if (noDraw)\n        {\n            DestroyYesNoMenu();\n            *state = 0;\n            return -3;\n        }\n        input = Menu_ProcessInputNoWrapClearOnChoose();\n        if (input == MENU_B_PRESSED || input == 0 || input == 1)\n        {\n            *state = 0;\n            return input;\n        }\n        break;\n    }\n    return MENU_NOTHING_CHOSEN;\n}\n\nstatic u8 CreateTradeBoardWindow(const struct WindowTemplate * template)\n{\n    u8 windowId = AddWindow(template);\n    DrawStdWindowFrame(windowId, FALSE);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(15));\n    PrintUnionRoomText(windowId, FONT_SMALL, gText_UR_NameWantedOfferLv, 8, 1, UR_COLOR_TRADE_BOARD_OTHER);\n    PutWindowTilemap(windowId);\n    CopyWindowToVram(windowId, COPYWIN_GFX);\n    return windowId;\n}\n\nstatic void DeleteTradeBoardWindow(u8 windowId)\n{\n    ClearStdWindowAndFrame(windowId, TRUE);\n    RemoveWindow(windowId);\n}\n\nstatic s32 ListMenuHandler_AllItemsAvailable(u8 *state, u8 *windowId, u8 *listMenuId, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate)\n{\n    s32 input;\n\n    switch (*state)\n    {\n    case 0:\n        *windowId = AddWindow(winTemplate);\n        DrawStdWindowFrame(*windowId, FALSE);\n        gMultiuseListMenuTemplate = *menuTemplate;\n        gMultiuseListMenuTemplate.windowId = *windowId;\n        *listMenuId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);\n        CopyWindowToVram(*windowId, TRUE);\n        (*state)++;\n        break;\n    case 1:\n        input = ListMenu_ProcessInput(*listMenuId);\n        if (JOY_NEW(A_BUTTON))\n        {\n            DestroyListMenuTask(*listMenuId, NULL, NULL);\n            ClearStdWindowAndFrame(*windowId, TRUE);\n            RemoveWindow(*windowId);\n            *state = 0;\n            return input;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            DestroyListMenuTask(*listMenuId, NULL, NULL);\n            ClearStdWindowAndFrame(*windowId, TRUE);\n            RemoveWindow(*windowId);\n            *state = 0;\n            return LIST_CANCEL;\n        }\n        break;\n    }\n\n    return LIST_NOTHING_CHOSEN;\n}\n\nstatic s32 TradeBoardMenuHandler(u8 *state, u8 *mainWindowId, u8 *listMenuId, u8 *headerWindowId,\n                                 const struct WindowTemplate * winTemplate,\n                                 const struct ListMenuTemplate * menuTemplate,\n                                 struct RfuPlayerList * list)\n{\n    s32 input;\n    s32 idx;\n\n    switch (*state)\n    {\n    case 0:\n        *headerWindowId = CreateTradeBoardWindow(&sWindowTemplate_TradingBoardHeader);\n        *mainWindowId = AddWindow(winTemplate);\n        DrawStdWindowFrame(*mainWindowId, FALSE);\n        gMultiuseListMenuTemplate = *menuTemplate;\n        gMultiuseListMenuTemplate.windowId = *mainWindowId;\n        *listMenuId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 1);\n        CopyWindowToVram(*mainWindowId, TRUE);\n        (*state)++;\n        break;\n    case 1:\n        input = ListMenu_ProcessInput(*listMenuId);\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n        {\n            // Exit or B button\n            if (input == 8 || JOY_NEW(B_BUTTON))\n            {\n                DestroyListMenuTask(*listMenuId, NULL, NULL);\n                ClearStdWindowAndFrame(*mainWindowId, TRUE);\n                RemoveWindow(*mainWindowId);\n                DeleteTradeBoardWindow(*headerWindowId);\n                *state = 0;\n                return LIST_CANCEL;\n            }\n            else\n            {\n                idx = GetIndexOfNthTradeBoardOffer(list->players, input);\n                if (idx >= 0)\n                {\n                    DestroyListMenuTask(*listMenuId, NULL, NULL);\n                    ClearStdWindowAndFrame(*mainWindowId, TRUE);\n                    RemoveWindow(*mainWindowId);\n                    DeleteTradeBoardWindow(*headerWindowId);\n                    *state = 0;\n                    return idx;\n                }\n                else\n                {\n                    PlaySE(SE_WALL_HIT);\n                }\n            }\n        }\n        break;\n    }\n\n    return LIST_NOTHING_CHOSEN;\n}\n\nstatic void UR_ClearBg0(void)\n{\n    FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0);\n    CopyBgTilemapBufferToVram(0);\n}\n\nstatic void JoinGroup_EnableScriptContexts(void)\n{\n    FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0);\n    CopyBgTilemapBufferToVram(0);\n    ScriptContext_Enable();\n}\n\nstatic void PrintUnionRoomText(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx)\n{\n    struct TextPrinterTemplate printerTemplate;\n\n    printerTemplate.currentChar = str;\n    printerTemplate.windowId = windowId;\n    printerTemplate.fontId = fontId;\n    printerTemplate.x = x;\n    printerTemplate.y = y;\n    printerTemplate.currentX = x;\n    printerTemplate.currentY = y;\n    printerTemplate.unk = 0;\n\n    gTextFlags.useAlternateDownArrow = FALSE;\n    switch (colorIdx)\n    {\n    case UR_COLOR_DEFAULT:\n        printerTemplate.letterSpacing = 0;\n        printerTemplate.lineSpacing = 0;\n        printerTemplate.fgColor = TEXT_COLOR_DARK_GRAY;\n        printerTemplate.bgColor = TEXT_COLOR_WHITE;\n        printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GRAY;\n        break;\n    case UR_COLOR_RED:\n        printerTemplate.letterSpacing = 0;\n        printerTemplate.lineSpacing = 0;\n        printerTemplate.fgColor = TEXT_COLOR_RED;\n        printerTemplate.bgColor = TEXT_COLOR_WHITE;\n        printerTemplate.shadowColor = TEXT_COLOR_LIGHT_RED;\n        break;\n    case UR_COLOR_GREEN:\n        printerTemplate.letterSpacing = 0;\n        printerTemplate.lineSpacing = 0;\n        printerTemplate.fgColor = TEXT_COLOR_GREEN;\n        printerTemplate.bgColor = TEXT_COLOR_WHITE;\n        printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREEN;\n        break;\n    case UR_COLOR_WHITE:\n        printerTemplate.letterSpacing = 0;\n        printerTemplate.lineSpacing = 0;\n        printerTemplate.fgColor = TEXT_COLOR_WHITE;\n        printerTemplate.bgColor = TEXT_COLOR_WHITE;\n        printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GRAY;\n        break;\n    case UR_COLOR_CANCEL:\n        printerTemplate.letterSpacing = 0;\n        printerTemplate.lineSpacing = 0;\n        printerTemplate.fgColor = TEXT_COLOR_WHITE;\n        printerTemplate.bgColor = TEXT_COLOR_DARK_GRAY;\n        printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GRAY;\n        break;\n    case UR_COLOR_TRADE_BOARD_SELF:\n        printerTemplate.letterSpacing = 0;\n        printerTemplate.lineSpacing = 0;\n        printerTemplate.fgColor = TEXT_COLOR_LIGHT_GREEN;\n        printerTemplate.bgColor = TEXT_DYNAMIC_COLOR_6;\n        printerTemplate.shadowColor = TEXT_COLOR_LIGHT_BLUE;\n        break;\n    case UR_COLOR_TRADE_BOARD_OTHER:\n        printerTemplate.letterSpacing = 0;\n        printerTemplate.lineSpacing = 0;\n        printerTemplate.fgColor = TEXT_DYNAMIC_COLOR_5;\n        printerTemplate.bgColor = TEXT_DYNAMIC_COLOR_6;\n        printerTemplate.shadowColor = TEXT_COLOR_LIGHT_BLUE;\n        break;\n    }\n\n    AddTextPrinter(&printerTemplate, TEXT_SKIP_DRAW, NULL);\n}\n\nstatic void ClearRfuPlayerList(struct RfuPlayer * x20arr, u8 count)\n{\n    s32 i;\n\n    for (i = 0; i < count; i++)\n    {\n        x20arr[i].rfu = sRfuPlayerData_Dummy;\n        x20arr[i].timeoutCounter = 0xFF;\n        x20arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_NONE;\n        x20arr[i].useRedText = FALSE;\n        x20arr[i].newPlayerCountdown = 0;\n    }\n}\n\nstatic void ClearIncomingPlayerList(struct RfuIncomingPlayer * x1Carr, u8 count)\n{\n    s32 i;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        x1Carr[i].rfu = sRfuPlayerData_Dummy;\n        x1Carr[i].active = FALSE;\n    }\n}\n\n// Checks player name and trainer id, returns TRUE if they are not the same\nstatic bool8 ArePlayersDifferent(struct RfuPlayerData * player1, const struct RfuPlayerData * player2)\n{\n    s32 i;\n\n    for (i = 0; i < 2; i++)\n    {\n        if (player1->data.compatibility.playerTrainerId[i] != player2->data.compatibility.playerTrainerId[i])\n            return TRUE;\n    }\n\n    for (i = 0; i < RFU_USER_NAME_LENGTH; i++)\n    {\n        if (player1->name[i] != player2->name[i])\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool32 ArePlayerDataDifferent(struct RfuPlayerData * player1, struct RfuPlayerData * player2)\n{\n    s32 i;\n\n    if (player1->data.activity != player2->data.activity)\n        return TRUE;\n\n    if (player1->data.startedActivity != player2->data.startedActivity)\n        return TRUE;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (player1->data.partnerInfo[i] != player2->data.partnerInfo[i])\n            return TRUE;\n    }\n\n    if (player1->data.tradeSpecies != player2->data.tradeSpecies)\n        return TRUE;\n\n    if (player1->data.tradeType != player2->data.tradeType)\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic u32 GetNewIncomingPlayerId(struct RfuPlayer * player, struct RfuIncomingPlayer * incomingPlayer)\n{\n    u8 result = 0xFF;\n    s32 i;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (incomingPlayer[i].active && !ArePlayersDifferent(&player->rfu, &incomingPlayer[i].rfu))\n        {\n            result = i;\n            incomingPlayer[i].active = FALSE;\n        }\n    }\n\n    return result;\n}\n\nstatic u8 TryAddIncomingPlayerToList(struct RfuPlayer * players, struct RfuIncomingPlayer * incomingPlayer, u8 count)\n{\n    s32 i;\n\n    if (incomingPlayer->active)\n    {\n        for (i = 0; i < count; i++)\n        {\n            if (players[i].groupScheduledAnim == UNION_ROOM_SPAWN_NONE)\n            {\n                players[i].rfu = incomingPlayer->rfu;\n                players[i].timeoutCounter = 0;\n                players[i].groupScheduledAnim = UNION_ROOM_SPAWN_IN;\n                players[i].newPlayerCountdown = 0x40;\n                incomingPlayer->active = FALSE;\n                return i;\n            }\n        }\n    }\n\n    return 0xFF;\n}\n\nstatic void PrintGroupMemberOnWindow(u8 windowId, u8 x, u8 y, struct RfuPlayer * player, u8 colorIdx, u8 id)\n{\n    u8 activity;\n    u8 trainerId[6];\n    u8 uname[30];\n\n    ConvertIntToDecimalStringN(gStringVar4, id + 1, STR_CONV_MODE_LEADING_ZEROS, 2);\n    StringAppend(gStringVar4, gText_UR_Colon);\n    PrintUnionRoomText(windowId, FONT_SMALL, gStringVar4, x, y, UR_COLOR_DEFAULT);\n    x += 18;\n    activity = player->rfu.data.activity;\n    if (player->groupScheduledAnim == UNION_ROOM_SPAWN_IN && !(activity & IN_UNION_ROOM))\n    {\n        CopyAndTranslatePlayerName2(uname, *player);\n        PrintUnionRoomText(windowId, FONT_NORMAL, uname, x, y, colorIdx);\n        ConvertIntToDecimalStringN(trainerId, player->rfu.data.compatibility.playerTrainerId[0] | (player->rfu.data.compatibility.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);\n        StringCopy(gStringVar4, gText_UR_ID);\n        StringAppend(gStringVar4, trainerId);\n        x += 77;\n        PrintUnionRoomText(windowId, FONT_SMALL, gStringVar4, x, y, colorIdx);\n    }\n}\n\nstatic void PrintGroupCandidateOnWindow(u8 windowId, u8 x, u8 y, struct RfuPlayer * player, u8 colorIdx, u8 id)\n{\n    u8 id_str[6];\n    u8 uname[30];\n\n    if (player->groupScheduledAnim == UNION_ROOM_SPAWN_IN)\n    {\n        CopyAndTranslatePlayerName2(uname, *player);\n        PrintUnionRoomText(windowId, FONT_NORMAL, uname, x, y, colorIdx);\n        ConvertIntToDecimalStringN(id_str, player->rfu.data.compatibility.playerTrainerId[0] | (player->rfu.data.compatibility.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);\n        StringCopy(gStringVar4, gText_UR_ID);\n        StringAppend(gStringVar4, id_str);\n        x += 71;\n        PrintUnionRoomText(windowId, FONT_SMALL, gStringVar4, x, y, colorIdx);\n    }\n}\n\nstatic bool32 IsPlayerFacingTradingBoard(void)\n{\n    s16 x, y;\n    GetXYCoordsOneStepInFrontOfPlayer(&x, &y);\n\n    if (x != 2 + MAP_OFFSET)\n        return FALSE;\n\n    if (y != 1 + MAP_OFFSET)\n        return FALSE;\n\n    if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING)\n        return TRUE;\n\n    return FALSE;\n}\n\nstatic u32 GetResponseIdx_InviteToURoomActivity(s32 activity)\n{\n    switch (activity)\n    {\n    case ACTIVITY_CHAT:\n        return 1;\n    case ACTIVITY_TRADE:\n        return 2;\n    case ACTIVITY_CARD:\n        return 3;\n    case ACTIVITY_BATTLE_MULTI:\n    default:\n        return 0;\n    }\n}\n\nstatic u32 ConvPartnerUnameAndGetWhetherMetAlready(struct RfuPlayer * player)\n{\n    u8 name[30];\n    CopyAndTranslatePlayerName2(name, *player);\n    return PlayerHasMetTrainerBefore(ReadAsU16(player->rfu.data.compatibility.playerTrainerId), name);\n}\n\nstatic s32 UnionRoomGetPlayerInteractionResponse(struct RfuPlayerList * list, bool8 overrideGender, u8 playerIdx, u32 playerGender)\n{\n    bool32 metBefore;\n\n    struct RfuPlayer * player = &list->players[playerIdx];\n\n    if (!player->rfu.data.startedActivity && !overrideGender)\n    {\n        CopyAndTranslatePlayerName2(gStringVar1, *player);\n        metBefore = PlayerHasMetTrainerBefore(ReadAsU16(player->rfu.data.compatibility.playerTrainerId), gStringVar1);\n        if (player->rfu.data.activity == (ACTIVITY_CHAT | IN_UNION_ROOM))\n        {\n            StringExpandPlaceholders(gStringVar4, gTexts_UR_JoinChat[metBefore][playerGender]);\n            return 2;\n        }\n        else\n        {\n            UR_PrintFieldMessage(gTexts_UR_CommunicatingWait[metBefore]);\n            return 1;\n        }\n    }\n    else\n    {\n        CopyAndTranslatePlayerName2(gStringVar1, *player);\n        if (overrideGender)\n            playerGender = (player->rfu.data.compatibility.playerTrainerId[overrideGender + 1] >> 3) & 1;\n\n        switch (player->rfu.data.activity & 0x3F)\n        {\n        case ACTIVITY_BATTLE_SINGLE:\n            StringExpandPlaceholders(gStringVar4, gTexts_UR_BattleReaction[playerGender][Random() % 4]);\n            break;\n        case ACTIVITY_TRADE:\n            StringExpandPlaceholders(gStringVar4, gTexts_UR_TradeReaction[playerGender][Random() % 2]);\n            break;\n        case ACTIVITY_CHAT:\n            StringExpandPlaceholders(gStringVar4, gTexts_UR_ChatReaction[playerGender][Random() % 4]);\n            break;\n        case ACTIVITY_CARD:\n            StringExpandPlaceholders(gStringVar4, gTexts_UR_TrainerCardReaction[playerGender][Random() % 2]);\n            break;\n        default:\n            StringExpandPlaceholders(gStringVar4, gText_UR_TrainerAppearsBusy);\n            break;\n        }\n        return 0;\n    }\n}\n\nstatic void ItemPrintFunc_Unused(u8 windowId, u32 itemId, u8 y)\n{\n}\n\nstatic void TradeBoardPrintItemInfo(u8 windowId, u8 y, struct RfuGameData * data, const u8 * playerName, u8 colorIdx)\n{\n    u8 levelStr[4];\n    u16 species = data->tradeSpecies;\n    u8 type = data->tradeType;\n    u8 level = data->tradeLevel;\n\n    PrintUnionRoomText(windowId, FONT_NORMAL, playerName, 8, y, colorIdx);\n    if (species == SPECIES_EGG)\n    {\n        PrintUnionRoomText(windowId, FONT_NORMAL, gText_UR_EggTrade, 68, y, colorIdx);\n    }\n    else\n    {\n        BlitMenuInfoIcon(windowId, type + 1, 68, y);\n        PrintUnionRoomText(windowId, FONT_NORMAL, gSpeciesNames[species], 118, y, colorIdx);\n        ConvertIntToDecimalStringN(levelStr, level, STR_CONV_MODE_LEFT_ALIGN, 3);\n        PrintUnionRoomText(windowId, FONT_NORMAL, levelStr, GetStringRightAlignXOffset(2, levelStr, 218), y, colorIdx);\n    }\n}\n\nstatic void TradeBoardListMenuItemPrintFunc(u8 windowId, u32 itemId, u8 y)\n{\n    struct WirelessLink_Leader * leader = sWirelessLinkMain.leader;\n    struct RfuGameData * gameData;\n    s32 i, j;\n    u8 playerName[RFU_USER_NAME_LENGTH];\n\n    if (itemId == LIST_HEADER && y == sListMenuTemplate_TradeBoard.upText_Y)\n    {\n        gameData = GetHostRfuGameData();\n        if (gameData->tradeSpecies != SPECIES_NONE)\n            TradeBoardPrintItemInfo(windowId, y, gameData, gSaveBlock2Ptr->playerName, 5);\n    }\n    else\n    {\n        j = 0;\n        for (i = 0; i < MAX_UNION_ROOM_LEADERS; i++)\n        {\n            if (leader->playerList->players[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN && leader->playerList->players[i].rfu.data.tradeSpecies != SPECIES_NONE)\n                j++;\n\n            if (j == itemId + 1)\n            {\n                CopyAndTranslatePlayerName2(playerName, leader->playerList->players[i]);\n                TradeBoardPrintItemInfo(windowId, y, &leader->playerList->players[i].rfu.data, playerName, UR_COLOR_TRADE_BOARD_OTHER);\n                break;\n            }\n        }\n    }\n}\n\nstatic s32 GetIndexOfNthTradeBoardOffer(struct RfuPlayer * players, s32 n)\n{\n    s32 i;\n    s32 j = 0;\n\n    for (i = 0; i < MAX_UNION_ROOM_LEADERS; i++)\n    {\n        if (players[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN && players[i].rfu.data.tradeSpecies != SPECIES_NONE)\n            j++;\n\n        if (j == n + 1)\n            return i;\n    }\n\n    return -1;\n}\n\nstatic s32 GetUnionRoomPlayerGender(s32 playerIdx, struct RfuPlayerList * list)\n{\n    return list->players[playerIdx].rfu.data.playerGender;\n}\n\nstatic s32 IsRequestedTradeInPlayerParty(u32 type, u32 species)\n{\n    s32 i;\n\n    if (species == SPECIES_EGG)\n    {\n        for (i = 0; i < gPlayerPartyCount; i++)\n        {\n            species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG);\n            if (species == SPECIES_EGG)\n                return UR_TRADE_MATCH;\n        }\n        return UR_TRADE_NOEGG;\n    }\n    else\n    {\n        for (i = 0; i < gPlayerPartyCount; i++)\n        {\n            species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG);\n            if (gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type)\n                return UR_TRADE_MATCH;\n        }\n        return UR_TRADE_NOTYPE;\n    }\n}\n\nstatic void GetURoomActivityRejectMsg(u8 *dst, s32 activity, u32 playerGender)\n{\n    switch (activity)\n    {\n    case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM:\n        StringExpandPlaceholders(dst, gTexts_UR_BattleDeclined[playerGender]);\n        break;\n    case ACTIVITY_CHAT | IN_UNION_ROOM:\n        StringExpandPlaceholders(dst, gTexts_UR_ChatDeclined[playerGender]);\n        break;\n    case ACTIVITY_TRADE | IN_UNION_ROOM:\n        StringExpandPlaceholders(dst, gText_UR_TradeOfferRejected);\n        break;\n    case ACTIVITY_CARD | IN_UNION_ROOM:\n        StringExpandPlaceholders(dst, gTexts_UR_ShowTrainerCardDeclined[playerGender]);\n        break;\n    }\n}\n\nstatic void GetURoomActivityStartMsg(u8 *dst, u8 activity)\n{\n    u8 mpId = GetMultiplayerId();\n    u8 gender = gLinkPlayers[mpId ^ 1].gender;\n\n    switch (activity)\n    {\n    case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM:\n        StringCopy(dst, gTexts_UR_StartActivity[mpId][gender][0]);\n        break;\n    case ACTIVITY_TRADE | IN_UNION_ROOM:\n        StringCopy(dst, gTexts_UR_StartActivity[mpId][gender][2]);\n        break;\n    case ACTIVITY_CHAT | IN_UNION_ROOM:\n        StringCopy(dst, gTexts_UR_StartActivity[mpId][gender][1]);\n        break;\n    }\n}\n\nstatic s32 GetChatLeaderActionRequestMessage(u8 *dst, u32 gender, u16 *activityData, struct WirelessLink_URoom * uroom)\n{\n    s32 result = 0;\n    u16 species = SPECIES_NONE;\n    s32 i;\n\n    switch (activityData[0])\n    {\n    case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM:\n        StringExpandPlaceholders(dst, gText_UR_BattleChallenge);\n        result = 1;\n        break;\n    case ACTIVITY_CHAT | IN_UNION_ROOM:\n        StringExpandPlaceholders(dst, gText_UR_ChatInvitation);\n        result = 1;\n        break;\n    case ACTIVITY_TRADE | IN_UNION_ROOM:\n        ConvertIntToDecimalStringN(uroom->activityRequestStrbufs[0], sUnionRoomTrade.playerLevel, STR_CONV_MODE_LEFT_ALIGN, 3);\n        StringCopy(uroom->activityRequestStrbufs[1], gSpeciesNames[sUnionRoomTrade.playerSpecies]);\n        for (i = 0; i < RFU_CHILD_MAX; i++)\n        {\n            if (gRfuLinkStatus->partner[i].serialNo == RFU_SERIAL_GAME)\n            {\n                ConvertIntToDecimalStringN(uroom->activityRequestStrbufs[2], activityData[2], STR_CONV_MODE_LEFT_ALIGN, 3);\n                StringCopy(uroom->activityRequestStrbufs[3], gSpeciesNames[activityData[1]]);\n                species = activityData[1];\n                break;\n            }\n        }\n        if (species == SPECIES_EGG)\n        {\n            StringCopy(dst, gText_UR_OfferToTradeEgg);\n        }\n        else\n        {\n            for (i = 0; i < RFU_CHILD_MAX; i++)\n                DynamicPlaceholderTextUtil_SetPlaceholderPtr(i, uroom->activityRequestStrbufs[i]);\n            DynamicPlaceholderTextUtil_ExpandPlaceholders(dst, gText_UR_OfferToTradeMon);\n        }\n        result = 1;\n        break;\n    case ACTIVITY_CARD | IN_UNION_ROOM:\n        StringExpandPlaceholders(dst, gText_UR_ShowTrainerCard);\n        result = 1;\n        break;\n    case ACTIVITY_NONE | IN_UNION_ROOM:\n        StringExpandPlaceholders(dst, gText_UR_ChatDropped);\n        result = 2;\n        break;\n    }\n\n    return result;\n}\n\nstatic bool32 PollPartnerYesNoResponse(struct WirelessLink_URoom * uroom)\n{\n    if (gRecvCmds[0][1] != 0)\n    {\n        if (gRecvCmds[0][1] == (ACTIVITY_ACCEPT | IN_UNION_ROOM))\n        {\n            uroom->partnerYesNoResponse = ACTIVITY_ACCEPT | IN_UNION_ROOM;\n            return TRUE;\n        }\n        else if (gRecvCmds[0][1] == (ACTIVITY_DECLINE | IN_UNION_ROOM))\n        {\n            uroom->partnerYesNoResponse = ACTIVITY_DECLINE | IN_UNION_ROOM;\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nbool32 InUnionRoom(void)\n{\n    return    gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(UNION_ROOM)\n           && gSaveBlock1Ptr->location.mapNum == MAP_NUM(UNION_ROOM)\n           ? TRUE : FALSE;\n}\n\nstatic bool32 HasAtLeastTwoMonsOfLevel30OrLower(void)\n{\n    s32 i;\n    s32 count = 0;\n\n    for (i = 0; i < gPlayerPartyCount; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL) <= UNION_ROOM_MAX_LEVEL\n            && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG)\n            count++;\n    }\n\n    if (count > 1)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void ResetUnionRoomTrade(struct UnionRoomTrade * uroomTrade)\n{\n    uroomTrade->state = URTRADE_STATE_NONE;\n    uroomTrade->type = 0;\n    uroomTrade->playerPersonality = 0;\n    uroomTrade->playerSpecies = SPECIES_NONE;\n    uroomTrade->playerLevel = 0;\n    uroomTrade->species = SPECIES_NONE;\n    uroomTrade->level = 0;\n    uroomTrade->personality = 0;\n}\n\nvoid Script_ResetUnionRoomTrade(void)\n{\n    ResetUnionRoomTrade(&sUnionRoomTrade);\n}\n\nstatic bool32 RegisterTradeMonAndGetIsEgg(u32 monId, struct UnionRoomTrade * trade)\n{\n    trade->playerSpecies = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES_OR_EGG);\n    trade->playerLevel = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);\n    trade->playerPersonality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY);\n    if (trade->playerSpecies == SPECIES_EGG)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void RegisterTradeMon(u32 monId, struct UnionRoomTrade * trade)\n{\n    trade->species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES_OR_EGG);\n    trade->level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);\n    trade->personality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY);\n}\n\nstatic u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade * trade, u8 multiplayerId)\n{\n    u16 response = 0;\n    u16 species;\n    u32 personality;\n    u32 cur_personality;\n    u16 cur_species;\n    s32 i;\n\n    // player\n    if (multiplayerId == 0)\n    {\n        species = trade->playerSpecies;\n        personality = trade->playerPersonality;\n    }\n        // partner\n    else\n    {\n        species = trade->species;\n        personality = trade->personality;\n    }\n\n    for (i = 0; i < gPlayerPartyCount; i++)\n    {\n        cur_personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);\n        if (cur_personality != personality)\n            continue;\n        cur_species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG);\n        if (cur_species != species)\n            continue;\n        response = i;\n        break;\n    }\n\n    return response;\n}\n\nstatic void HandleCancelActivity(bool32 setData)\n{\n    UR_ClearBg0();\n    UnlockPlayerFieldControls();\n    UnionRoom_UnlockPlayerAndChatPartner();\n    sPlayerCurrActivity = 0;\n    if (setData)\n    {\n        SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);\n        UpdateGameData_SetActivity(IN_UNION_ROOM, 0, FALSE);\n    }\n}\n\nstatic void StartScriptInteraction(void)\n{\n    LockPlayerFieldControls();\n    FreezeObjects_WaitForPlayer();\n}\n\nstatic u8 GetLinkPlayerInfoFlags(s32 linkPlayer)\n{\n    u8 retval = 0x80;\n    retval |= gLinkPlayers[linkPlayer].gender << 3;\n    retval |= gLinkPlayers[linkPlayer].trainerId & 7;\n    return retval;\n}\n\nstatic u8 GetActivePartnersInfo(struct WirelessLink_URoom * uroom)\n{\n    u8 retVal = PINFO_ACTIVE_FLAG;\n    u8 i;\n\n    for (i = 0; i < RFU_CHILD_MAX; i++)\n    {\n        if (uroom->incomingParentList->players[i].active)\n        {\n            retVal |= uroom->incomingParentList->players[i].rfu.data.playerGender << PINFO_GENDER_SHIFT;\n            retVal |= uroom->incomingParentList->players[i].rfu.data.compatibility.playerTrainerId[0] & PINFO_TID_MASK;\n            break;\n        }\n    }\n\n    return retVal;\n}\n\nstatic void ViewURoomPartnerTrainerCard(u8 *unused, struct WirelessLink_URoom * uroom, bool8 isParent)\n{\n    struct TrainerCard * trainerCard = &gTrainerCards[GetMultiplayerId() ^ 1];\n    s32 i;\n    s32 n;\n\n    DynamicPlaceholderTextUtil_Reset();\n\n    StringCopy(uroom->trainerCardStrBuffer[0], gTrainerClassNames[GetUnionRoomTrainerClass()]);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, uroom->trainerCardStrBuffer[0]);\n\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, trainerCard->rse.playerName);\n\n    StringCopy(uroom->trainerCardColorStrBuffer, gTexts_UR_CardColor[trainerCard->rse.stars]);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, uroom->trainerCardColorStrBuffer);\n\n    ConvertIntToDecimalStringN(uroom->trainerCardStrBuffer[2], trainerCard->rse.caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, uroom->trainerCardStrBuffer[2]);\n\n    ConvertIntToDecimalStringN(uroom->trainerCardStrBuffer[3], trainerCard->rse.playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);\n    ConvertIntToDecimalStringN(uroom->trainerCardStrBuffer[4], trainerCard->rse.playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, uroom->trainerCardStrBuffer[3]);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, uroom->trainerCardStrBuffer[4]);\n\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->trainerCardMsgStrBuffer, gText_UR_TrainerCardInfoPage1);\n    StringCopy(gStringVar4, uroom->trainerCardMsgStrBuffer);\n\n    n = trainerCard->rse.linkBattleWins;\n    if (n > 9999)\n        n = 9999;\n    ConvertIntToDecimalStringN(uroom->trainerCardStrBuffer[0], n, STR_CONV_MODE_LEFT_ALIGN, 4);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, uroom->trainerCardStrBuffer[0]);\n\n    n = trainerCard->rse.linkBattleLosses;\n    if (n > 9999)\n        n = 9999;\n    ConvertIntToDecimalStringN(uroom->trainerCardStrBuffer[1], n, STR_CONV_MODE_LEFT_ALIGN, 4);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, uroom->trainerCardStrBuffer[1]);\n\n    ConvertIntToDecimalStringN(uroom->trainerCardStrBuffer[2], trainerCard->rse.pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5);\n    DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, uroom->trainerCardStrBuffer[2]);\n\n    for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++)\n    {\n        CopyEasyChatWord(uroom->trainerCardStrBuffer[i + 3], trainerCard->rse.easyChatProfile[i]);\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, uroom->trainerCardStrBuffer[i + 3]);\n    }\n\n    DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->trainerCardMsgStrBuffer, gText_UR_TrainerCardInfoPage2);\n    StringAppend(gStringVar4, uroom->trainerCardMsgStrBuffer);\n\n    if (isParent == TRUE)\n    {\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->trainerCardMsgStrBuffer, gText_UR_FinishedCheckingPlayersTrainerCard);\n        StringAppend(gStringVar4, uroom->trainerCardMsgStrBuffer);\n    }\n    else if (isParent == FALSE)\n    {\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->trainerCardMsgStrBuffer, gTexts_UR_GladToMeetYou[trainerCard->rse.gender]);\n        StringAppend(gStringVar4, uroom->trainerCardMsgStrBuffer);\n    }\n}\n\nvoid CableClub_OnResumeFunc(void)\n{\n    if(FlagGet(FLAG_SYS_ON_RESUME))\n        return;\n    FlagSet(FLAG_SYS_ON_RESUME);\n    if(!IsWirelessAdapterConnected())\n    {\n        FlagSet(FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER);\n        return;\n    }\n    InitUnionRoom();\n}\n"
  },
  {
    "path": "src/union_room_battle.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"battle.h\"\n#include \"link.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"overworld.h\"\n#include \"party_menu.h\"\n#include \"strings.h\"\n#include \"text_window.h\"\n#include \"union_room.h\"\n#include \"constants/union_room.h\"\n\nstruct UnionRoomBattleWork\n{\n    s16 textState;\n};\n\nstatic EWRAM_DATA struct UnionRoomBattleWork * sWork = NULL;\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 31\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 2,\n        .tilemapTop = 15,\n        .width = 26,\n        .height = 4,\n        .paletteNum = 14,\n        .baseBlock = 0x014\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const u8 sTextColors[] = {1, 2, 3};\n\nstatic void SetUpPartiesAndStartBattle(void)\n{\n    s32 i;\n    StartUnionRoomBattle(BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER);\n    for (i = 0; i < 2; i++)\n    {\n        gEnemyParty[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1];\n    }\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        ZeroMonData(&gPlayerParty[i]);\n    }\n    for (i = 0; i < 2; i++)\n    {\n        gPlayerParty[i] = gEnemyParty[i];\n    }\n    IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES);\n    CalculatePlayerPartyCount();\n    gTrainerBattleOpponent_A = TRAINER_UNION_ROOM;\n    SetMainCallback2(CB2_InitBattle);\n}\n\nstatic void UnionRoomBattle_CreateTextPrinter(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed)\n{\n    s32 letterSpacing = 1;\n    s32 lineSpacing = 1;\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(sTextColors[0]));\n    AddTextPrinterParameterized4(windowId, FONT_NORMAL_COPY_2, x, y, letterSpacing, lineSpacing, sTextColors, speed, str);\n}\n\nstatic bool32 UnionRoomBattle_PrintTextOnWindow0(s16 * state, const u8 * str, s32 speed)\n{\n    switch (*state)\n    {\n    case 0:\n        DrawTextBorderOuter(0, 0x001, 13);\n        UnionRoomBattle_CreateTextPrinter(0, str, 0, 2, speed);\n        PutWindowTilemap(0);\n        CopyWindowToVram(0, COPYWIN_FULL);\n        (*state)++;\n        break;\n    case 1:\n        if (!IsTextPrinterActive(0))\n        {\n            *state = 0;\n            return TRUE;\n        }\n        break;\n    }\n    return FALSE;\n}\n\nstatic void VBlankCB_UnionRoomBattle(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid CB2_UnionRoomBattle(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);\n        sWork = AllocZeroed(sizeof(struct UnionRoomBattleWork));\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        ResetTasks();\n        ResetBgsAndClearDma3BusyFlags(0);\n        InitBgsFromTemplates(0, sBgTemplates, 1);\n        ResetTempTileDataBuffers();\n        if (!InitWindows(sWindowTemplates))\n        {\n            return;\n        }\n        DeactivateAllTextPrinters();\n        ClearWindowTilemap(0);\n        FillWindowPixelBuffer(0, PIXEL_FILL(0));\n        FillWindowPixelBuffer(0, PIXEL_FILL(1));\n        FillBgTilemapBufferRect(0, 0, 0, 0, 30, 20, 15);\n        LoadStdWindowGfx(0, 1, BG_PLTT_ID(13));\n        Menu_LoadStdPal();\n        SetVBlankCallback(VBlankCB_UnionRoomBattle);\n        gMain.state++;\n        break;\n    case 1:\n        if (UnionRoomBattle_PrintTextOnWindow0(&sWork->textState, gText_CommStandbyAwaitingOtherPlayer, 0))\n        {\n            gMain.state++;\n        }\n        break;\n    case 2:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        ShowBg(0);\n        gMain.state++;\n        break;\n    case 3:\n        if (!UpdatePaletteFade())\n        {\n            memset(gBlockSendBuffer, 0, 0x20);\n            if (gSelectedOrderFromParty[0] == -gSelectedOrderFromParty[1])\n            {\n                gBlockSendBuffer[0] = ACTIVITY_DECLINE | 0x40;\n            }\n            else\n            {\n                gBlockSendBuffer[0] = ACTIVITY_ACCEPT | 0x40;\n            }\n            SendBlock(0, gBlockSendBuffer, 0x20);\n            gMain.state++;\n        }\n        break;\n    case 4:\n        if (GetBlockReceivedStatus() == 3)\n        {\n            if (gBlockRecvBuffer[0][0] == (ACTIVITY_ACCEPT | 0x40) && gBlockRecvBuffer[1][0] == (ACTIVITY_ACCEPT | 0x40))\n            {\n                BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n                gMain.state = 50;\n            }\n            else\n            {\n                SetCloseLinkCallback();\n                if (gBlockRecvBuffer[GetMultiplayerId()][0] == (ACTIVITY_DECLINE | 0x40))\n                {\n                    gMain.state = 6;\n                }\n                else\n                {\n                    gMain.state = 8;\n                }\n            }\n            ResetBlockReceivedFlags();\n        }\n        break;\n    case 50:\n        if (!UpdatePaletteFade())\n        {\n            SetLinkStandbyCallback();\n            gMain.state++;\n        }\n        break;\n    case 51:\n        if (IsLinkTaskFinished())\n        {\n            SetMainCallback2(SetUpPartiesAndStartBattle);\n        }\n        break;\n    case 6:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            gMain.state++;\n        }\n        break;\n    case 7:\n        if (UnionRoomBattle_PrintTextOnWindow0(&sWork->textState, gText_RefusedBattle, 1))\n        {\n            SetMainCallback2(CB2_ReturnToField);\n        }\n        break;\n    case 8:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            gMain.state++;\n        }\n        break;\n    case 9:\n        if (UnionRoomBattle_PrintTextOnWindow0(&sWork->textState, gText_BattleWasRefused, 1))\n        {\n            SetMainCallback2(CB2_ReturnToField);\n        }\n        break;\n    }\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n"
  },
  {
    "path": "src/union_room_chat.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"help_system.h\"\n#include \"link.h\"\n#include \"link_rfu.h\"\n#include \"load_save.h\"\n#include \"menu.h\"\n#include \"overworld.h\"\n#include \"quest_log.h\"\n#include \"save.h\"\n#include \"scanline_effect.h\"\n#include \"strings.h\"\n#include \"task.h\"\n#include \"union_room_chat.h\"\n#include \"union_room_chat_display.h\"\n#include \"keyboard_text.h\"\n#include \"constants/songs.h\"\n\n#define MESSAGE_BUFFER_NCHAR 15\n\n#define CHAT_MESSAGE_0 0\n#define CHAT_MESSAGE_CHAT 1\n#define CHAT_MESSAGE_JOIN 2\n#define CHAT_MESSAGE_LEAVE 3\n#define CHAT_MESSAGE_DROP 4\n#define CHAT_MESSAGE_DISBAND 5\n\n#define CHATENTRYROUTINE_JOIN 0\n#define CHATNETRYROUTINE_HANDLE_INPUT 1\n#define CHATENTRYROUTINE_SWITCH 2\n#define CHATENTRYROUTINE_ASKQUITCHATTING 3\n#define CHATENTRYROUTINE_SEND 4\n#define CHATENTRYROUTINE_REGISTER 5\n#define CHATENTRYROUTINE_EXITCHAT 6\n#define CHATENTRYROUTINE_DROP 7\n#define CHATENTRYROUTINE_DISBANDED 8\n#define CHATENTRYROUTINE_SAVEANDEXIT 9\n\n#define CHATEXIT_NONE 0\n#define CHATEXIT_LEADER_LAST 1\n#define CHATEXIT_DROPPED 2\n#define CHATEXIT_DISBANDED 3\n\nstruct UnionRoomChat\n{\n    u8 filler0[0x4];\n    u16 routineNo;\n    u16 routineState;\n    u8 filler8[0x2];\n    u16 exitDelayTimer;\n    u8 fillerC[0x1];\n    u8 linkPlayerCount;\n    u8 handleInputTask;\n    u8 receiveMessagesTask;\n    u8 currentPage;\n    u8 currentCol;\n    u8 currentRow;\n    u8 multiplayerId;\n    u8 lastBufferCursorPos;\n    u8 bufferCursorPos;\n    u8 receivedPlayerIndex;\n    u8 exitType;\n    bool8 changedRegisteredTexts;\n    u8 afterSaveTimer;\n    u8 messageEntryBuffer[2 * MESSAGE_BUFFER_NCHAR + 1];\n    u8 receivedMessage[0x40];\n    u8 hostName[0x40];\n    u8 registeredTexts[UNION_ROOM_KB_ROW_COUNT][21];\n    u8 filler18B[0x5];\n    u8 sendMessageBuffer[0x28];\n};\n\nstatic EWRAM_DATA struct UnionRoomChat * sWork = NULL;\n\nstatic void InitChatWork(struct UnionRoomChat * unionRoomChat);\nstatic void CB2_LoadInterface(void);\nstatic void VBlankCB_UnionRoomChatMain(void);\nstatic void CB2_UnionRoomChatMain(void);\nstatic void Task_HandlePlayerInput(u8 taskId);\nstatic void ChatEntryRoutine_Join(void);\nstatic void ChatEntryRoutine_HandleInput(void);\nstatic void ChatEntryRoutine_Switch(void);\nstatic void ChatEntryRoutine_AskQuitChatting(void);\nstatic void ChatEntryRoutine_ExitChat(void);\nstatic void ChatEntryRoutine_Drop(void);\nstatic void ChatEntryRoutine_Disbanded(void);\nstatic void ChatEntryRoutine_SendMessage(void);\nstatic void ChatEntryRoutine_Register(void);\nstatic void ChatEntryRoutine_SaveAndExit(void);\nstatic void GoToRoutine(u16 routineNo);\nstatic bool32 TypeChatMessage_HandleDPad(void);\nstatic void AppendCharacterToChatMessageBuffer(void);\nstatic void DeleteLastCharacterOfChatMessageBuffer(void);\nstatic void ToggleCaseOfLastCharacterInChatMessageBuffer(void);\nstatic bool32 ChatMsgHasAtLeastOneCharcter(void);\nstatic void RegisterTextAtRow(void);\nstatic void ResetMessageEntryBuffer(void);\nstatic void SaveRegisteredTextsToSB1(void);\nstatic u8 *GetEndOfUnk1A(void);\nstatic u8 *GetPtrToLastCharOfUnk1A(void);\nstatic void PrepareSendBuffer_Null(u8 *ptr);\nstatic void PrepareSendBuffer_Join(u8 *ptr);\nstatic void PrepareSendBuffer_Chat(u8 *ptr);\nstatic void PrepareSendBuffer_Leave(u8 *ptr);\nstatic void PrepareSendBuffer_Drop(u8 *ptr);\nstatic void PrepareSendBuffer_Disband(u8 *ptr);\nstatic void Task_ReceiveChatMessage(u8 taskId);\n\nstatic void (*const sChatEntryRoutines[])(void) = {\n    [CHATENTRYROUTINE_JOIN] = ChatEntryRoutine_Join,\n    [CHATNETRYROUTINE_HANDLE_INPUT] = ChatEntryRoutine_HandleInput,\n    [CHATENTRYROUTINE_SWITCH] = ChatEntryRoutine_Switch,\n    [CHATENTRYROUTINE_ASKQUITCHATTING] = ChatEntryRoutine_AskQuitChatting,\n    [CHATENTRYROUTINE_SEND] = ChatEntryRoutine_SendMessage,\n    [CHATENTRYROUTINE_REGISTER] = ChatEntryRoutine_Register,\n    [CHATENTRYROUTINE_EXITCHAT] = ChatEntryRoutine_ExitChat,\n    [CHATENTRYROUTINE_DROP] = ChatEntryRoutine_Drop,\n    [CHATENTRYROUTINE_DISBANDED] = ChatEntryRoutine_Disbanded,\n    [CHATENTRYROUTINE_SAVEANDEXIT] = ChatEntryRoutine_SaveAndExit\n};\n\nstatic const u8 sKeyboardPageMaxRow[] =\n{\n    [UNION_ROOM_KB_PAGE_UPPER] = 9,\n    [UNION_ROOM_KB_PAGE_LOWER] = 9,\n    [UNION_ROOM_KB_PAGE_EMOJI] = 9,\n    9\n};\n\nstatic const u8 sCaseToggleTable[256] = {\n    [CHAR_A] = CHAR_a,\n    [CHAR_B] = CHAR_b,\n    [CHAR_C] = CHAR_c,\n    [CHAR_D] = CHAR_d,\n    [CHAR_E] = CHAR_e,\n    [CHAR_F] = CHAR_f,\n    [CHAR_G] = CHAR_g,\n    [CHAR_H] = CHAR_h,\n    [CHAR_I] = CHAR_i,\n    [CHAR_J] = CHAR_j,\n    [CHAR_K] = CHAR_k,\n    [CHAR_L] = CHAR_l,\n    [CHAR_M] = CHAR_m,\n    [CHAR_N] = CHAR_n,\n    [CHAR_O] = CHAR_o,\n    [CHAR_P] = CHAR_p,\n    [CHAR_Q] = CHAR_q,\n    [CHAR_R] = CHAR_r,\n    [CHAR_S] = CHAR_s,\n    [CHAR_T] = CHAR_t,\n    [CHAR_U] = CHAR_u,\n    [CHAR_V] = CHAR_v,\n    [CHAR_W] = CHAR_w,\n    [CHAR_X] = CHAR_x,\n    [CHAR_Y] = CHAR_y,\n    [CHAR_Z] = CHAR_z,\n    [CHAR_a] = CHAR_A,\n    [CHAR_b] = CHAR_B,\n    [CHAR_c] = CHAR_C,\n    [CHAR_d] = CHAR_D,\n    [CHAR_e] = CHAR_E,\n    [CHAR_f] = CHAR_F,\n    [CHAR_g] = CHAR_G,\n    [CHAR_h] = CHAR_H,\n    [CHAR_i] = CHAR_I,\n    [CHAR_j] = CHAR_J,\n    [CHAR_k] = CHAR_K,\n    [CHAR_l] = CHAR_L,\n    [CHAR_m] = CHAR_M,\n    [CHAR_n] = CHAR_N,\n    [CHAR_o] = CHAR_O,\n    [CHAR_p] = CHAR_P,\n    [CHAR_q] = CHAR_Q,\n    [CHAR_r] = CHAR_R,\n    [CHAR_s] = CHAR_S,\n    [CHAR_t] = CHAR_T,\n    [CHAR_u] = CHAR_U,\n    [CHAR_v] = CHAR_V,\n    [CHAR_w] = CHAR_W,\n    [CHAR_x] = CHAR_X,\n    [CHAR_y] = CHAR_Y,\n    [CHAR_z] = CHAR_Z,\n    [CHAR_A_GRAVE] = CHAR_a_GRAVE,\n    [CHAR_A_ACUTE] = CHAR_a_ACUTE,\n    [CHAR_A_CIRCUMFLEX] = CHAR_a_CIRCUMFLEX,\n    [CHAR_A_DIAERESIS] = CHAR_a_DIAERESIS,\n    [CHAR_C_CEDILLA] = CHAR_c_CEDILLA,\n    [CHAR_E_GRAVE] = CHAR_e_GRAVE,\n    [CHAR_E_ACUTE] = CHAR_e_ACUTE,\n    [CHAR_E_CIRCUMFLEX] = CHAR_e_CIRCUMFLEX,\n    [CHAR_E_DIAERESIS] = CHAR_e_DIAERESIS,\n    [CHAR_I_GRAVE] = CHAR_i_GRAVE,\n    [CHAR_I_ACUTE] = CHAR_i_ACUTE,\n    [CHAR_I_CIRCUMFLEX] = CHAR_i_CIRCUMFLEX,\n    [CHAR_I_DIAERESIS] = CHAR_i_DIAERESIS,\n    [CHAR_O_GRAVE] = CHAR_o_GRAVE,\n    [CHAR_O_ACUTE] = CHAR_o_ACUTE,\n    [CHAR_O_CIRCUMFLEX] = CHAR_o_CIRCUMFLEX,\n    [CHAR_O_DIAERESIS] = CHAR_o_DIAERESIS,\n    [CHAR_OE] = CHAR_oe,\n    [CHAR_U_GRAVE] = CHAR_u_GRAVE,\n    [CHAR_U_ACUTE] = CHAR_u_ACUTE,\n    [CHAR_U_CIRCUMFLEX] = CHAR_u_CIRCUMFLEX,\n    [CHAR_U_DIAERESIS] = CHAR_u_DIAERESIS,\n    [CHAR_N_TILDE] = CHAR_n_TILDE,\n    [CHAR_ESZETT] = CHAR_ESZETT,\n    [CHAR_a_GRAVE] = CHAR_A_GRAVE,\n    [CHAR_a_ACUTE] = CHAR_A_ACUTE,\n    [CHAR_a_CIRCUMFLEX] = CHAR_A_CIRCUMFLEX,\n    [CHAR_a_DIAERESIS] = CHAR_A_DIAERESIS,\n    [CHAR_c_CEDILLA] = CHAR_C_CEDILLA,\n    [CHAR_e_GRAVE] = CHAR_E_GRAVE,\n    [CHAR_e_ACUTE] = CHAR_E_ACUTE,\n    [CHAR_e_CIRCUMFLEX] = CHAR_E_CIRCUMFLEX,\n    [CHAR_e_DIAERESIS] = CHAR_E_DIAERESIS,\n    [CHAR_i_GRAVE] = CHAR_I_GRAVE,\n    [CHAR_i_ACUTE] = CHAR_I_ACUTE,\n    [CHAR_i_CIRCUMFLEX] = CHAR_I_CIRCUMFLEX,\n    [CHAR_i_DIAERESIS] = CHAR_I_DIAERESIS,\n    [CHAR_o_GRAVE] = CHAR_O_GRAVE,\n    [CHAR_o_ACUTE] = CHAR_O_ACUTE,\n    [CHAR_o_CIRCUMFLEX] = CHAR_O_CIRCUMFLEX,\n    [CHAR_o_DIAERESIS] = CHAR_O_DIAERESIS,\n    [CHAR_oe] = CHAR_OE,\n    [CHAR_u_GRAVE] = CHAR_U_GRAVE,\n    [CHAR_u_ACUTE] = CHAR_U_ACUTE,\n    [CHAR_u_CIRCUMFLEX] = CHAR_U_CIRCUMFLEX,\n    [CHAR_u_DIAERESIS] = CHAR_U_DIAERESIS,\n    [CHAR_n_TILDE] = CHAR_N_TILDE,\n    [CHAR_0] = CHAR_0,\n    [CHAR_1] = CHAR_1,\n    [CHAR_2] = CHAR_2,\n    [CHAR_3] = CHAR_3,\n    [CHAR_4] = CHAR_4,\n    [CHAR_5] = CHAR_5,\n    [CHAR_6] = CHAR_6,\n    [CHAR_7] = CHAR_7,\n    [CHAR_8] = CHAR_8,\n    [CHAR_9] = CHAR_9,\n    [CHAR_PK] = CHAR_PK,\n    [CHAR_MN] = CHAR_MN,\n    [CHAR_PO] = CHAR_PO,\n    [CHAR_KE] = CHAR_KE,\n    [CHAR_SUPER_E]  = CHAR_SUPER_E,\n    [CHAR_SUPER_ER] = CHAR_SUPER_ER,\n    [CHAR_SUPER_RE] = CHAR_SUPER_RE,\n    [CHAR_PERIOD] = CHAR_PERIOD,\n    [CHAR_COMMA] = CHAR_COMMA,\n    [CHAR_COLON] = CHAR_COLON,\n    [CHAR_SEMICOLON] = CHAR_SEMICOLON,\n    [CHAR_EXCL_MARK] = CHAR_EXCL_MARK,\n    [CHAR_QUESTION_MARK] = CHAR_QUESTION_MARK,\n    [CHAR_HYPHEN] = CHAR_HYPHEN,\n    [CHAR_SLASH] = CHAR_SLASH,\n    [CHAR_ELLIPSIS] = CHAR_ELLIPSIS,\n    [CHAR_LEFT_PAREN] = CHAR_LEFT_PAREN,\n    [CHAR_RIGHT_PAREN] = CHAR_RIGHT_PAREN,\n    [CHAR_AMPERSAND] = CHAR_AMPERSAND,\n    [CHAR_DBL_QUOTE_LEFT] = CHAR_DBL_QUOTE_LEFT,\n    [CHAR_DBL_QUOTE_RIGHT] = CHAR_DBL_QUOTE_RIGHT,\n    [CHAR_SGL_QUOTE_LEFT] = CHAR_SGL_QUOTE_LEFT,\n    [CHAR_SGL_QUOTE_RIGHT] = CHAR_SGL_QUOTE_RIGHT,\n    [CHAR_MASCULINE_ORDINAL] = CHAR_MASCULINE_ORDINAL,\n    [CHAR_FEMININE_ORDINAL] = CHAR_FEMININE_ORDINAL,\n    [CHAR_BULLET] = CHAR_BULLET,\n    [CHAR_EQUALS] = CHAR_EQUALS,\n    [CHAR_MULT_SIGN] = CHAR_MULT_SIGN,\n    [CHAR_PERCENT] = CHAR_PERCENT,\n    [CHAR_LESS_THAN] = CHAR_LESS_THAN,\n    [CHAR_GREATER_THAN] = CHAR_GREATER_THAN,\n    [CHAR_MALE] = CHAR_MALE,\n    [CHAR_FEMALE] = CHAR_FEMALE,\n    [CHAR_CURRENCY] = CHAR_CURRENCY,\n    [CHAR_BLACK_TRIANGLE] = CHAR_BLACK_TRIANGLE,\n};\n\nconst u8 *const gUnionRoomKeyboardText[UNION_ROOM_KB_PAGE_COUNT][UNION_ROOM_KB_ROW_COUNT] = {\n    [UNION_ROOM_KB_PAGE_UPPER] = {\n        gText_UnionRoomChatKeyboard_ABCDE,\n        gText_UnionRoomChatKeyboard_FGHIJ,\n        gText_UnionRoomChatKeyboard_KLMNO,\n        gText_UnionRoomChatKeyboard_PQRST,\n        gText_UnionRoomChatKeyboard_UVWXY,\n        gText_UnionRoomChatKeyboard_Z,\n        gText_UnionRoomChatKeyboard_01234Upper,\n        gText_UnionRoomChatKeyboard_56789Upper,\n        gText_UnionRoomChatKeyboard_PunctuationUpper,\n        gText_UnionRoomChatKeyboard_SymbolsUpper\n    },\n    [UNION_ROOM_KB_PAGE_LOWER] = {\n        gText_UnionRoomChatKeyboard_abcde,\n        gText_UnionRoomChatKeyboard_fghij,\n        gText_UnionRoomChatKeyboard_klmno,\n        gText_UnionRoomChatKeyboard_pqrst,\n        gText_UnionRoomChatKeyboard_uvwxy,\n        gText_UnionRoomChatKeyboard_z,\n        gText_UnionRoomChatKeyboard_01234Lower,\n        gText_UnionRoomChatKeyboard_56789Lower,\n        gText_UnionRoomChatKeyboard_PunctuationLower,\n        gText_UnionRoomChatKeyboard_SymbolsLower\n    },\n    [UNION_ROOM_KB_PAGE_EMOJI] = {\n        gText_UnionRoomChatKeyboard_Emoji1,\n        gText_UnionRoomChatKeyboard_Emoji2,\n        gText_UnionRoomChatKeyboard_Emoji3,\n        gText_UnionRoomChatKeyboard_Emoji4,\n        gText_UnionRoomChatKeyboard_Emoji5,\n        gText_UnionRoomChatKeyboard_Emoji6,\n        gText_UnionRoomChatKeyboard_Emoji7,\n        gText_UnionRoomChatKeyboard_Emoji8,\n        gText_UnionRoomChatKeyboard_Emoji9,\n        gText_UnionRoomChatKeyboard_Emoji10\n    }\n};\n\nvoid EnterUnionRoomChat(void)\n{\n    sWork = Alloc(sizeof(struct UnionRoomChat));\n    InitChatWork(sWork);\n    gKeyRepeatStartDelay = 20;\n    HelpSystem_DisableToggleWithRButton();\n    SetVBlankCallback(NULL);\n    SetMainCallback2(CB2_LoadInterface);\n}\n\nstatic void InitChatWork(struct UnionRoomChat * unionRoomChat)\n{\n    int i;\n\n    unionRoomChat->routineNo = CHATENTRYROUTINE_JOIN;\n    unionRoomChat->routineState = 0;\n    unionRoomChat->currentPage = UNION_ROOM_KB_PAGE_UPPER;\n    unionRoomChat->currentCol = 0;\n    unionRoomChat->currentRow = 0;\n    unionRoomChat->lastBufferCursorPos = 0;\n    unionRoomChat->bufferCursorPos = 0;\n    unionRoomChat->receivedPlayerIndex = 0;\n    unionRoomChat->messageEntryBuffer[0] = EOS;\n    unionRoomChat->linkPlayerCount = GetLinkPlayerCount();\n    unionRoomChat->multiplayerId = GetMultiplayerId();\n    unionRoomChat->exitType = 0;\n    unionRoomChat->changedRegisteredTexts = FALSE;\n    PrepareSendBuffer_Null(unionRoomChat->sendMessageBuffer);\n    for (i = 0; i < UNION_ROOM_KB_ROW_COUNT; i++)\n        StringCopy(unionRoomChat->registeredTexts[i], gSaveBlock1Ptr->registeredTexts[i]);\n}\n\nstatic void FreeChatWork(void)\n{\n    DestroyTask(sWork->handleInputTask);\n    DestroyTask(sWork->receiveMessagesTask);\n    Free(sWork);\n}\n\nstatic void CB2_LoadInterface(void)\n{\n    switch (gMain.state)\n    {\n    case 0:\n        ResetTasks();\n        ResetSpriteData();\n        FreeAllSpritePalettes();\n        UnionRoomChat_TryAllocGraphicsWork();\n        gMain.state++;\n        break;\n    case 1:\n        UnionRoomChat_RunDisplaySubtasks();\n        if (!UnionRoomChat_RunDisplaySubtask0())\n        {\n            BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);\n            BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK);\n            SetVBlankCallback(VBlankCB_UnionRoomChatMain);\n            gMain.state++;\n        }\n        break;\n    case 2:\n        UpdatePaletteFade();\n        if (!gPaletteFade.active)\n        {\n            SetMainCallback2(CB2_UnionRoomChatMain);\n            SetQuestLogEvent(QL_EVENT_USED_UNION_ROOM_CHAT, NULL);\n            sWork->handleInputTask = CreateTask(Task_HandlePlayerInput, 8);\n            sWork->receiveMessagesTask = CreateTask(Task_ReceiveChatMessage, 7);\n            LoadWirelessStatusIndicatorSpriteGfx();\n            CreateWirelessStatusIndicatorSprite(232, 150);\n        }\n        break;\n    }\n}\n\nstatic void VBlankCB_UnionRoomChatMain(void)\n{\n    TransferPlttBuffer();\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    ScanlineEffect_InitHBlankDmaTransfer();\n}\n\nstatic void CB2_UnionRoomChatMain(void)\n{\n    RunTasks();\n    UnionRoomChat_RunDisplaySubtasks();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void Task_HandlePlayerInput(u8 taskId)\n{\n    switch (sWork->exitType)\n    {\n    case CHATEXIT_LEADER_LAST:\n        GoToRoutine(CHATENTRYROUTINE_EXITCHAT);\n        sWork->exitType = CHATEXIT_NONE;\n        break;\n    case CHATEXIT_DROPPED:\n        GoToRoutine(CHATENTRYROUTINE_DROP);\n        sWork->exitType = CHATEXIT_NONE;\n        break;\n    case CHATEXIT_DISBANDED:\n        GoToRoutine(CHATENTRYROUTINE_DISBANDED);\n        sWork->exitType = CHATEXIT_NONE;\n        break;\n    }\n\n    sChatEntryRoutines[sWork->routineNo]();\n}\n\nstatic void ChatEntryRoutine_Join(void)\n{\n    switch (sWork->routineState)\n    {\n    case 0:\n        PrepareSendBuffer_Join(sWork->sendMessageBuffer);\n        sWork->routineState++;\n        // fall through\n    case 1:\n        if (IsLinkTaskFinished() && !Rfu_IsPlayerExchangeActive())\n        {\n            if (SendBlock(0, sWork->sendMessageBuffer, sizeof(sWork->sendMessageBuffer)))\n                sWork->routineState++;\n        }\n        break;\n    case 2:\n        if (IsLinkTaskFinished())\n            GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT);\n        break;\n    }\n}\n\nstatic void ChatEntryRoutine_HandleInput(void)\n{\n    bool8 var0, var1;\n\n    switch (sWork->routineState)\n    {\n    case 0:\n        if (JOY_NEW(START_BUTTON))\n        {\n            if (sWork->bufferCursorPos)\n                GoToRoutine(CHATENTRYROUTINE_SEND);\n        }\n        else if (JOY_NEW(SELECT_BUTTON))\n        {\n            GoToRoutine(CHATENTRYROUTINE_SWITCH);\n        }\n        else if (JOY_REPT(B_BUTTON))\n        {\n            if (sWork->bufferCursorPos)\n            {\n                DeleteLastCharacterOfChatMessageBuffer();\n                UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTMSG, 0);\n                sWork->routineState = 1;\n            }\n            else\n            {\n                GoToRoutine(CHATENTRYROUTINE_ASKQUITCHATTING);\n            }\n        }\n        else if (JOY_NEW(A_BUTTON))\n        {\n            AppendCharacterToChatMessageBuffer();\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTMSG, 0);\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_CURSORBLINK, 1);\n            sWork->routineState = 1;\n        }\n        else if (JOY_NEW(R_BUTTON))\n        {\n            if (sWork->currentPage != UNION_ROOM_KB_PAGE_COUNT)\n            {\n                ToggleCaseOfLastCharacterInChatMessageBuffer();\n                UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTMSG, 0);\n                sWork->routineState = 1;\n            }\n            else\n            {\n                GoToRoutine(CHATENTRYROUTINE_REGISTER);\n            }\n        }\n        else if (TypeChatMessage_HandleDPad())\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_MOVEKBCURSOR, 0);\n            sWork->routineState = 1;\n        }\n        break;\n    case 1:\n        var0 = RunDisplaySubtask(0);\n        var1 = RunDisplaySubtask(1);\n        if (!var0 && !var1)\n            sWork->routineState = 0;\n        break;\n    }\n}\n\nstatic void ChatEntryRoutine_Switch(void)\n{\n    s16 input;\n    bool32 shouldSwitchPages;\n\n    switch (sWork->routineState)\n    {\n    case 0:\n        UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_SHOWKBSWAPMENU, 0);\n        sWork->routineState++;\n        break;\n    case 1:\n        if (!RunDisplaySubtask(0))\n            sWork->routineState++;\n        break;\n    case 2:\n        input = Menu_ProcessInput();\n        switch (input)\n        {\n        default:\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_HIDEKBSWAPMENU, 0);\n            shouldSwitchPages = TRUE;\n            if (sWork->currentPage == input || input > UNION_ROOM_KB_PAGE_COUNT)\n                shouldSwitchPages = FALSE;\n            break;\n        case MENU_NOTHING_CHOSEN:\n            if (JOY_NEW(SELECT_BUTTON))\n            {\n                PlaySE(SE_SELECT);\n                Menu_MoveCursor(1);\n            }\n            return;\n        case MENU_B_PRESSED:\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_HIDEKBSWAPMENU, 0);\n            sWork->routineState = 3;\n            return;\n        }\n\n        if (!shouldSwitchPages)\n        {\n            sWork->routineState = 3;\n            return;\n        }\n\n        sWork->currentCol = 0;\n        sWork->currentRow = 0;\n        UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_SWITCHPAGES, 1);\n        sWork->currentPage = input;\n        sWork->routineState = 4;\n        break;\n    case 3:\n        // Wait Return To Prev Page\n        if (!RunDisplaySubtask(0))\n            GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT);\n        break;\n    case 4:\n        // Wait Page Switch\n        if (!RunDisplaySubtask(0) && !RunDisplaySubtask(1))\n            GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT);\n        break;\n    }\n}\n\nstatic void ChatEntryRoutine_AskQuitChatting(void)\n{\n    s8 input;\n\n    switch (sWork->routineState)\n    {\n    case 0:\n        UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_SHOWQUITCHATTINGDIALOG, 0);\n        sWork->routineState = 1;\n        break;\n    case 1:\n        if (!RunDisplaySubtask(0))\n            sWork->routineState = 2;\n        break;\n    case 2:\n        input = UnionRoomChat_ProcessInput();\n        switch (input)\n        {\n        case -1:\n        case 1:\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0);\n            sWork->routineState = 3;\n            break;\n        case 0:\n            if (sWork->multiplayerId == 0)\n            {\n                PrepareSendBuffer_Disband(sWork->sendMessageBuffer);\n                UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0);\n                sWork->routineState = 9;\n            }\n            else\n            {\n                PrepareSendBuffer_Leave(sWork->sendMessageBuffer);\n                sWork->routineState = 4;\n            }\n            break;\n        }\n        break;\n    case 3:\n        if (!RunDisplaySubtask(0))\n            GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT);\n        break;\n    case 9:\n        if (!RunDisplaySubtask(0))\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_SHOWCONFIRMLEADERLEAVEDIALOG, 0);\n            sWork->routineState = 10;\n        }\n        break;\n    case 10:\n        if (!RunDisplaySubtask(0))\n            sWork->routineState = 8;\n        break;\n    case 8:\n        input = UnionRoomChat_ProcessInput();\n        switch (input)\n        {\n        case -1:\n        case 1:\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0);\n            sWork->routineState = 3;\n            break;\n        case 0:\n            Rfu_StopPartnerSearch();\n            PrepareSendBuffer_Disband(sWork->sendMessageBuffer);\n            sWork->routineState = 4;\n            break;\n        }\n        break;\n    case 4:\n        if (IsLinkTaskFinished() && !Rfu_IsPlayerExchangeActive() && SendBlock(0, sWork->sendMessageBuffer, sizeof(sWork->sendMessageBuffer)))\n        {\n            if (sWork->multiplayerId == 0)\n                sWork->routineState = 6;\n            else\n                sWork->routineState = 5;\n        }\n        break;\n    case 5:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            GoToRoutine(CHATENTRYROUTINE_SAVEANDEXIT);\n        }\n        break;\n    }\n}\n\nstatic void ChatEntryRoutine_ExitChat(void)\n{\n    switch (sWork->routineState)\n    {\n    case 0:\n        if (!FuncIsActiveTask(Task_ReceiveChatMessage))\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0);\n            sWork->routineState++;\n        }\n        break;\n    case 1:\n        if (!RunDisplaySubtask(0))\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTEXITINGCHAT, 0);\n            sWork->routineState++;\n        }\n        break;\n    case 2:\n        if (!RunDisplaySubtask(0))\n        {\n            PrepareSendBuffer_Drop(sWork->sendMessageBuffer);\n            sWork->routineState++;\n        }\n        break;\n    case 3:\n        if (IsLinkTaskFinished() && !Rfu_IsPlayerExchangeActive() && SendBlock(0, sWork->sendMessageBuffer, sizeof(sWork->sendMessageBuffer)))\n            sWork->routineState++;\n        break;\n    case 4:\n        if ((GetBlockReceivedStatus() & 1) && !Rfu_IsPlayerExchangeActive())\n            sWork->routineState++;\n        break;\n    case 5:\n        if (IsLinkTaskFinished() && !Rfu_IsPlayerExchangeActive())\n        {\n            SetCloseLinkCallback();\n            sWork->exitDelayTimer = 0;\n            sWork->routineState++;\n        }\n        break;\n    case 6:\n        if (sWork->exitDelayTimer < 150)\n            sWork->exitDelayTimer++;\n\n        if (!gReceivedRemoteLinkPlayers)\n            sWork->routineState++;\n        break;\n    case 7:\n        if (sWork->exitDelayTimer >= 150)\n            GoToRoutine(CHATENTRYROUTINE_SAVEANDEXIT);\n        else\n            sWork->exitDelayTimer++;\n        break;\n    }\n}\n\nstatic void ChatEntryRoutine_Drop(void)\n{\n    switch (sWork->routineState)\n    {\n    case 0:\n        if (!FuncIsActiveTask(Task_ReceiveChatMessage))\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0);\n            sWork->routineState++;\n        }\n        break;\n    case 1:\n        if (!RunDisplaySubtask(0) && IsLinkTaskFinished() && !Rfu_IsPlayerExchangeActive())\n        {\n            SetCloseLinkCallback();\n            sWork->exitDelayTimer = 0;\n            sWork->routineState++;\n        }\n        break;\n    case 2:\n        if (sWork->exitDelayTimer < 150)\n            sWork->exitDelayTimer++;\n\n        if (!gReceivedRemoteLinkPlayers)\n            sWork->routineState++;\n        break;\n    case 3:\n        if (sWork->exitDelayTimer >= 150)\n            GoToRoutine(CHATENTRYROUTINE_SAVEANDEXIT);\n        else\n            sWork->exitDelayTimer++;\n        break;\n    }\n}\n\nstatic void ChatEntryRoutine_Disbanded(void)\n{\n    switch (sWork->routineState)\n    {\n    case 0:\n        if (!FuncIsActiveTask(Task_ReceiveChatMessage))\n        {\n            if (sWork->multiplayerId)\n                UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0);\n\n            sWork->routineState++;\n        }\n        break;\n    case 1:\n        if (!RunDisplaySubtask(0))\n        {\n            if (sWork->multiplayerId != 0)\n                UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTLEADERLEFT, 0);\n\n            sWork->routineState++;\n        }\n        break;\n    case 2:\n        if (RunDisplaySubtask(0) != TRUE && IsLinkTaskFinished() && !Rfu_IsPlayerExchangeActive())\n        {\n            SetCloseLinkCallback();\n            sWork->exitDelayTimer = 0;\n            sWork->routineState++;\n        }\n        break;\n    case 3:\n        if (sWork->exitDelayTimer < 150)\n            sWork->exitDelayTimer++;\n\n        if (!gReceivedRemoteLinkPlayers)\n            sWork->routineState++;\n        break;\n    case 4:\n        if (sWork->exitDelayTimer >= 150)\n            GoToRoutine(CHATENTRYROUTINE_SAVEANDEXIT);\n        else\n            sWork->exitDelayTimer++;\n        break;\n    }\n}\n\nstatic void ChatEntryRoutine_SendMessage(void)\n{\n    switch (sWork->routineState)\n    {\n    case 0:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT);\n            break;\n        }\n\n        PrepareSendBuffer_Chat(sWork->sendMessageBuffer);\n        sWork->routineState++;\n        // fall through\n    case 1:\n        if (IsLinkTaskFinished() == TRUE && !Rfu_IsPlayerExchangeActive() && SendBlock(0, sWork->sendMessageBuffer, sizeof(sWork->sendMessageBuffer)))\n            sWork->routineState++;\n        break;\n    case 2:\n        ResetMessageEntryBuffer();\n        UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTMSG, 0);\n        sWork->routineState++;\n        break;\n    case 3:\n        if (!RunDisplaySubtask(0))\n            sWork->routineState++;\n        break;\n    case 4:\n        if (IsLinkTaskFinished())\n            GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT);\n        break;\n    }\n}\n\nstatic void ChatEntryRoutine_Register(void)\n{\n    switch (sWork->routineState)\n    {\n    case 0:\n        if (ChatMsgHasAtLeastOneCharcter())\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTREGISTERWHERE, 0);\n            sWork->routineState = 2;\n        }\n        else\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTINPUTTEXT, 0);\n            sWork->routineState = 5;\n        }\n        break;\n    case 1:\n        if (JOY_NEW(A_BUTTON))\n        {\n            RegisterTextAtRow();\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_RETURNTOKB, 0);\n            sWork->routineState = 3;\n        }\n        else if (JOY_NEW(B_BUTTON))\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_CANCELREGISTER, 0);\n            sWork->routineState = 4;\n        }\n        else if (TypeChatMessage_HandleDPad())\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_MOVEKBCURSOR, 0);\n            sWork->routineState = 2;\n        }\n        break;\n    case 2:\n        if (!RunDisplaySubtask(0))\n            sWork->routineState = 1;\n        break;\n    case 3:\n        if (!RunDisplaySubtask(0))\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_CANCELREGISTER, 0);\n            sWork->routineState = 4;\n        }\n        break;\n    case 4:\n        if (!RunDisplaySubtask(0))\n            GoToRoutine(CHATNETRYROUTINE_HANDLE_INPUT);\n        break;\n    case 5:\n        if (!RunDisplaySubtask(0))\n            sWork->routineState = 6;\n        break;\n    case 6:\n        if (JOY_NEW(A_BUTTON | B_BUTTON))\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0);\n            sWork->routineState = 4;\n        }\n        break;\n    }\n}\n\nstatic void ChatEntryRoutine_SaveAndExit(void)\n{\n    s8 input;\n\n    switch (sWork->routineState)\n    {\n    case 0:\n        if (!sWork->changedRegisteredTexts)\n        {\n            sWork->routineState = 12;\n        }\n        else\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0);\n            sWork->routineState = 1;\n        }\n        break;\n    case 1:\n        if (!RunDisplaySubtask(0))\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_ASKSAVE, 0);\n            sWork->routineState = 2;\n        }\n        break;\n    case 2:\n        input = UnionRoomChat_ProcessInput();\n        switch (input)\n        {\n        case -1:\n        case 1:\n            sWork->routineState = 12;\n            break;\n        case 0:\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0);\n            sWork->routineState = 3;\n            break;\n        }\n        break;\n    case 3:\n        if (!RunDisplaySubtask(0))\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_ASKOVERWRITESAVE, 0);\n            sWork->routineState = 4;\n        }\n        break;\n    case 4:\n        if (!RunDisplaySubtask(0))\n            sWork->routineState = 5;\n        break;\n    case 5:\n        input = UnionRoomChat_ProcessInput();\n        switch (input)\n        {\n        case -1:\n        case 1:\n            sWork->routineState = 12;\n            break;\n        case 0:\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, 0);\n            sWork->routineState = 6;\n            break;\n        }\n        break;\n    case 6:\n        if (!RunDisplaySubtask(0))\n        {\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTSAVING, 0);\n            SaveRegisteredTextsToSB1();\n            sWork->routineState = 7;\n        }\n        break;\n    case 7:\n        if (!RunDisplaySubtask(0))\n        {\n            SetContinueGameWarpStatusToDynamicWarp();\n            TrySavingData(SAVE_NORMAL);\n            sWork->routineState = 8;\n        }\n        break;\n    case 8:\n        UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_PRINTSAVEDTHEGAME, 0);\n        sWork->routineState = 9;\n        break;\n    case 9:\n        if (!RunDisplaySubtask(0))\n        {\n            PlaySE(SE_SAVE);\n            ClearContinueGameWarpStatus2();\n            sWork->routineState = 10;\n        }\n        break;\n    case 10:\n        sWork->afterSaveTimer = 0;\n        sWork->routineState = 11;\n        break;\n    case 11:\n        sWork->afterSaveTimer++;\n        if (sWork->afterSaveTimer > 120)\n            sWork->routineState = 12;\n        break;\n    case 12:\n        BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK);\n        sWork->routineState = 13;\n        break;\n    case 13:\n        if (!gPaletteFade.active)\n        {\n            HelpSystem_EnableToggleWithRButton();\n            UnionRoomChat_FreeGraphicsWork();\n            FreeChatWork();\n            SetMainCallback2(CB2_ReturnToField);\n        }\n        break;\n    }\n}\n\nstatic void GoToRoutine(u16 routineNo)\n{\n    sWork->routineNo = routineNo;\n    sWork->routineState = 0;\n}\n\nstatic bool32 TypeChatMessage_HandleDPad(void)\n{\n    do\n    {\n        if (JOY_REPT(DPAD_UP))\n        {\n            if (sWork->currentRow > 0)\n                sWork->currentRow--;\n            else\n                sWork->currentRow = sKeyboardPageMaxRow[sWork->currentPage];\n\n            break;\n        }\n        if (JOY_REPT(DPAD_DOWN))\n        {\n            if (sWork->currentRow < sKeyboardPageMaxRow[sWork->currentPage])\n            {\n                sWork->currentRow++;\n            }\n            else\n            {\n                sWork->currentRow = 0;\n            }\n\n            break;\n        }\n        if (sWork->currentPage != UNION_ROOM_KB_PAGE_COUNT)\n        {\n            if (JOY_REPT(DPAD_LEFT))\n            {\n                if (sWork->currentCol > 0)\n                    sWork->currentCol--;\n                else\n                    sWork->currentCol = 4;\n                break;\n            }\n            if (JOY_REPT(DPAD_RIGHT))\n            {\n                if (sWork->currentCol < 4)\n                    sWork->currentCol++;\n                else\n                    sWork->currentCol = 0;\n                break;\n            }\n        }\n\n        return FALSE;\n    } while (0);\n    return TRUE;\n}\n\nstatic void AppendCharacterToChatMessageBuffer(void)\n{\n    int i;\n    const u8 *charsStr;\n    int strLength;\n    u8 *str;\n    u8 buffer[21];\n\n    if (sWork->currentPage != UNION_ROOM_KB_PAGE_COUNT)\n    {\n        charsStr = gUnionRoomKeyboardText[sWork->currentPage][sWork->currentRow];\n        for (i = 0; i < sWork->currentCol; i++)\n        {\n            if (*charsStr == CHAR_EXTRA_SYMBOL)\n                charsStr++;\n            charsStr++;\n        }\n\n        strLength = 1;\n    }\n    else\n    {\n        u8 *tempStr = StringCopy(buffer, sWork->registeredTexts[sWork->currentRow]);\n        tempStr[0] = CHAR_SPACE;\n        tempStr[1] = EOS;\n        charsStr = buffer;\n        strLength = StringLength_Multibyte(buffer);\n    }\n\n    sWork->lastBufferCursorPos = sWork->bufferCursorPos;\n    if (!charsStr)\n        return;\n\n    str = GetEndOfUnk1A();\n    while (--strLength != -1 && sWork->bufferCursorPos < MESSAGE_BUFFER_NCHAR)\n    {\n        if (*charsStr == CHAR_EXTRA_SYMBOL)\n        {\n            *str = *charsStr;\n            charsStr++;\n            str++;\n        }\n\n        *str = *charsStr;\n        charsStr++;\n        str++;\n\n        sWork->bufferCursorPos++;\n    }\n\n    *str = EOS;\n}\n\nstatic void DeleteLastCharacterOfChatMessageBuffer(void)\n{\n    sWork->lastBufferCursorPos = sWork->bufferCursorPos;\n    if (sWork->bufferCursorPos)\n    {\n        u8 *str = GetPtrToLastCharOfUnk1A();\n        *str = EOS;\n        sWork->bufferCursorPos--;\n    }\n}\n\nstatic void ToggleCaseOfLastCharacterInChatMessageBuffer(void)\n{\n    u8 *str;\n    u8 character;\n\n    sWork->lastBufferCursorPos = sWork->bufferCursorPos - 1;\n    str = GetPtrToLastCharOfUnk1A();\n    if (*str != CHAR_EXTRA_SYMBOL)\n    {\n        character = sCaseToggleTable[*str];\n        if (character)\n            *str = character;\n    }\n}\n\nstatic bool32 ChatMsgHasAtLeastOneCharcter(void)\n{\n    if (sWork->bufferCursorPos)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void RegisterTextAtRow(void)\n{\n    u8 *src = UnionRoomChat_GetEndOfMessageEntryBuffer();\n    StringCopy(sWork->registeredTexts[sWork->currentRow], src);\n    sWork->changedRegisteredTexts = TRUE;\n}\n\nstatic void ResetMessageEntryBuffer(void)\n{\n    sWork->messageEntryBuffer[0] = EOS;\n    sWork->lastBufferCursorPos = MESSAGE_BUFFER_NCHAR;\n    sWork->bufferCursorPos = 0;\n}\n\nstatic void SaveRegisteredTextsToSB1(void)\n{\n    int i;\n    for (i = 0; i < UNION_ROOM_KB_ROW_COUNT; i++)\n        StringCopy(gSaveBlock1Ptr->registeredTexts[i], sWork->registeredTexts[i]);\n}\n\nu8 *UnionRoomChat_GetWorkRegisteredText(int arg0)\n{\n    return sWork->registeredTexts[arg0];\n}\n\nstatic u8 *GetEndOfUnk1A(void)\n{\n    u8 *str = sWork->messageEntryBuffer;\n    while (*str != EOS)\n        str++;\n\n    return str;\n}\n\nstatic u8 *GetPtrToLastCharOfUnk1A(void)\n{\n    u8 *str = sWork->messageEntryBuffer;\n    u8 *str2 = str;\n    while (*str != EOS)\n    {\n        str2 = str;\n        if (*str == CHAR_EXTRA_SYMBOL)\n            str++;\n        str++;\n    }\n\n    return str2;\n}\n\nstatic u16 GetNumCharsInMessageEntryBuffer(void)\n{\n    u8 *str;\n    u32 i, numChars, strLength;\n\n    strLength = StringLength_Multibyte(sWork->messageEntryBuffer);\n    str = sWork->messageEntryBuffer;\n    numChars = 0;\n    if (strLength > 10)\n    {\n        strLength -= 10;\n        for (i = 0; i < strLength; i++)\n        {\n            if (*str == CHAR_EXTRA_SYMBOL)\n                str++;\n\n            str++;\n            numChars++;\n        }\n    }\n\n    return numChars;\n}\n\nstatic void PrepareSendBuffer_Null(u8 *arg0)\n{\n    arg0[0] = CHAT_MESSAGE_0;\n}\n\nstatic void PrepareSendBuffer_Join(u8 *arg0)\n{\n    arg0[0] = CHAT_MESSAGE_JOIN;\n    StringCopy(&arg0[1], gSaveBlock2Ptr->playerName);\n    arg0[1 + (PLAYER_NAME_LENGTH + 1)] = sWork->multiplayerId;\n}\n\nstatic void PrepareSendBuffer_Chat(u8 *arg0)\n{\n    arg0[0] = CHAT_MESSAGE_CHAT;\n    StringCopy(&arg0[1], gSaveBlock2Ptr->playerName);\n    StringCopy(&arg0[1 + (PLAYER_NAME_LENGTH + 1)], sWork->messageEntryBuffer);\n}\n\nstatic void PrepareSendBuffer_Leave(u8 *arg0)\n{\n    arg0[0] = CHAT_MESSAGE_LEAVE;\n    StringCopy(&arg0[1], gSaveBlock2Ptr->playerName);\n    arg0[1 + (PLAYER_NAME_LENGTH + 1)] = sWork->multiplayerId;\n    RfuSetNormalDisconnectMode();\n}\n\nstatic void PrepareSendBuffer_Drop(u8 *arg0)\n{\n    arg0[0] = CHAT_MESSAGE_DROP;\n    StringCopy(&arg0[1], gSaveBlock2Ptr->playerName);\n    arg0[1 + (PLAYER_NAME_LENGTH + 1)] = sWork->multiplayerId;\n}\n\nstatic void PrepareSendBuffer_Disband(u8 *arg0)\n{\n    arg0[0] = CHAT_MESSAGE_DISBAND;\n    StringCopy(&arg0[1], gSaveBlock2Ptr->playerName);\n    arg0[1 + (PLAYER_NAME_LENGTH + 1)] = sWork->multiplayerId;\n}\n\nstatic bool32 ProcessReceivedChatMessage(u8 *dest, u8 *recvMessage)\n{\n    u8 *tempStr;\n    u8 cmd = *recvMessage;\n    u8 *name = recvMessage + 1;\n    recvMessage = name;\n    recvMessage += PLAYER_NAME_LENGTH + 1;\n\n    switch (cmd)\n    {\n    case CHAT_MESSAGE_JOIN:\n        if (sWork->multiplayerId != name[PLAYER_NAME_LENGTH + 1])\n        {\n            DynamicPlaceholderTextUtil_Reset();\n            DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, name);\n            DynamicPlaceholderTextUtil_ExpandPlaceholders(dest, gText_F700JoinedChat);\n            return TRUE;\n        }\n        break;\n    case CHAT_MESSAGE_CHAT:\n        tempStr = StringCopy(dest, name);\n        *(tempStr++) = EXT_CTRL_CODE_BEGIN;\n        *(tempStr++) = EXT_CTRL_CODE_CLEAR_TO;\n        *(tempStr++) = 42;\n        *(tempStr++) = CHAR_COLON;\n        StringCopy(tempStr, recvMessage);\n        return TRUE;\n    case CHAT_MESSAGE_DISBAND:\n        StringCopy(sWork->hostName, name);\n        // fall through\n    case CHAT_MESSAGE_LEAVE:\n        if (sWork->multiplayerId != *recvMessage)\n        {\n            DynamicPlaceholderTextUtil_Reset();\n            DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, name);\n            DynamicPlaceholderTextUtil_ExpandPlaceholders(dest, gText_F700LeftChat);\n            return TRUE;\n        }\n        break;\n    }\n\n    return FALSE;\n}\n\nu8 GetCurrentKeyboardPage(void)\n{\n    return sWork->currentPage;\n}\n\nvoid UnionRoomChat_GetCursorColAndRow(u8 *colp, u8 *rowp)\n{\n    *colp = sWork->currentCol;\n    *rowp = sWork->currentRow;\n}\n\nu8 *UnionRoomChat_GetMessageEntryBuffer(void)\n{\n    return sWork->messageEntryBuffer;\n}\n\nint UnionRoomChat_LenMessageEntryBuffer(void)\n{\n    u8 *str = UnionRoomChat_GetMessageEntryBuffer();\n    return StringLength_Multibyte(str);\n}\n\nvoid UnionRoomChat_GetBufferSelectionRegion(u32 *startp, u32 *diffp)\n{\n    int diff = sWork->bufferCursorPos - sWork->lastBufferCursorPos;\n    if (diff < 0)\n    {\n        diff *= -1;\n        *startp = sWork->bufferCursorPos;\n    }\n    else\n    {\n        *startp = sWork->lastBufferCursorPos;\n    }\n\n    *diffp = diff;\n}\n\nu8 *UnionRoomChat_GetEndOfMessageEntryBuffer(void)\n{\n    int i;\n    u16 numChars = GetNumCharsInMessageEntryBuffer();\n    u8 *str = sWork->messageEntryBuffer;\n    for (i = 0; i < numChars; i++)\n    {\n        if (*str == CHAR_EXTRA_SYMBOL)\n            str++;\n\n        str++;\n    }\n\n    return str;\n}\n\n// Useless overhead\nu16 UnionRoomChat_GetNumCharsInMessageEntryBuffer(void)\n{\n    u16 count;\n    u32 i;\n    u16 numChars = GetNumCharsInMessageEntryBuffer();\n    u8 *str = sWork->messageEntryBuffer;\n    for (count = 0, i = 0; i < numChars; count++, i++)\n    {\n        if (*str == CHAR_EXTRA_SYMBOL)\n            str++;\n\n        str++;\n    }\n\n    return count;\n}\n\nu8 *UnionRoomChat_GetLastReceivedMessage(void)\n{\n    return sWork->receivedMessage;\n}\n\nu16 UnionRoomChat_GetReceivedPlayerIndex(void)\n{\n    return sWork->receivedPlayerIndex;\n}\n\nint UnionRoomChat_GetMessageEntryCursorPosition(void)\n{\n    return sWork->bufferCursorPos;\n}\n\n// This probably does more in the Japanese titles.\nint UnionRoomChat_GetWhetherShouldShowCaseToggleIcon(void)\n{\n    u8 *str = GetPtrToLastCharOfUnk1A();\n    u32 character = *str;\n    if (character > 0xFF || sCaseToggleTable[character] == character || sCaseToggleTable[character] == 0)\n        return 3;\n    else\n        return 0;\n}\n\nu8 *UnionRoomChat_GetNameOfPlayerWhoDisbandedChat(void)\n{\n    return sWork->hostName;\n}\n\nvoid UnionRoomChat_InitializeRegisteredTexts(void)\n{\n    StringCopy(gSaveBlock1Ptr->registeredTexts[0], gText_Hello);\n    StringCopy(gSaveBlock1Ptr->registeredTexts[1], gText_Pokemon2);\n    StringCopy(gSaveBlock1Ptr->registeredTexts[2], gText_Trade);\n    StringCopy(gSaveBlock1Ptr->registeredTexts[3], gText_Battle);\n    StringCopy(gSaveBlock1Ptr->registeredTexts[4], gText_Lets);\n    StringCopy(gSaveBlock1Ptr->registeredTexts[5], gText_Ok);\n    StringCopy(gSaveBlock1Ptr->registeredTexts[6], gText_Sorry);\n    StringCopy(gSaveBlock1Ptr->registeredTexts[7], gText_YaySmileEmoji);\n    StringCopy(gSaveBlock1Ptr->registeredTexts[8], gText_ThankYou);\n    StringCopy(gSaveBlock1Ptr->registeredTexts[9], gText_ByeBye);\n}\n\n#define tState               data[0]\n#define tI                   data[1]\n#define tCurrLinkPlayer      data[2]\n#define tBlockReceivedStatus data[3]\n#define tLinkPlayerCount     data[4]\n#define tNextState           data[5]\n\nstatic void Task_ReceiveChatMessage(u8 taskId)\n{\n    u8 *buffer;\n    s16 *data = gTasks[taskId].data;\n\n    switch (tState)\n    {\n    case 0:\n        if (!gReceivedRemoteLinkPlayers)\n        {\n            DestroyTask(taskId);\n            return;\n        }\n\n        tState = 1;\n        // fall through\n    case 1:\n        tLinkPlayerCount = GetLinkPlayerCount();\n        if (sWork->linkPlayerCount != tLinkPlayerCount)\n        {\n            tState = 2;\n            sWork->linkPlayerCount = tLinkPlayerCount;\n            return;\n        }\n\n        tBlockReceivedStatus = GetBlockReceivedStatus();\n        if (!tBlockReceivedStatus && Rfu_IsPlayerExchangeActive())\n            return;\n\n        tI = 0;\n        tState = 3;\n        // fall through\n    case 3:\n        // Idle listen\n        for (; tI < 5 && ((tBlockReceivedStatus >> tI) & 1) == 0; tI++)\n            ;\n\n        if (tI == 5)\n        {\n            tState = 1;\n            return;\n        }\n\n        tCurrLinkPlayer = tI;\n        ResetBlockReceivedFlag(tCurrLinkPlayer);\n        buffer = (u8 *)gBlockRecvBuffer[tI];\n        switch (buffer[0])\n        {\n        default:\n        case CHAT_MESSAGE_CHAT: tNextState = 3; break;\n        case CHAT_MESSAGE_JOIN: tNextState = 3; break;\n        case CHAT_MESSAGE_LEAVE: tNextState = 4; break;\n        case CHAT_MESSAGE_DROP: tNextState = 5; break;\n        case CHAT_MESSAGE_DISBAND: tNextState = 6; break;\n        }\n\n        if (ProcessReceivedChatMessage(sWork->receivedMessage, (u8 *)gBlockRecvBuffer[tI]))\n        {\n            sWork->receivedPlayerIndex = tI;\n            UnionRoomChat_StartDisplaySubtask(CHATDISPLAYROUTINE_SCROLLCHAT, 2);\n            tState = 7;\n        }\n        else\n        {\n            tState = tNextState;\n        }\n\n        tI++;\n        break;\n    case 7:\n        if (!RunDisplaySubtask(2))\n            tState = tNextState;\n        break;\n    case 4:\n        // Someone is leaving\n        if (sWork->multiplayerId == 0 && tCurrLinkPlayer != 0)\n        {\n            // You're the leader, and the person who left is not you\n            if (GetLinkPlayerCount() == 2)\n            {\n                Rfu_StopPartnerSearch();\n                sWork->exitType = CHATEXIT_LEADER_LAST;\n                DestroyTask(taskId);\n                return;\n            }\n\n            Rfu_DisconnectPlayerById(tCurrLinkPlayer);\n        }\n\n        tState = 3;\n        break;\n    case 5:\n        // Person left\n        if (sWork->multiplayerId != 0)\n            sWork->exitType = CHATEXIT_DROPPED;\n\n        DestroyTask(taskId);\n        break;\n    case 6:\n        // The leader disbanded the chat\n        sWork->exitType = CHATEXIT_DISBANDED;\n        DestroyTask(taskId);\n        break;\n    case 2:\n        if (!Rfu_IsPlayerExchangeActive())\n        {\n            if (sWork->multiplayerId == 0)\n                SetUnionRoomChatPlayerData(sWork->linkPlayerCount);\n\n            tState = 1;\n        }\n        break;\n    }\n}\n\n#undef tNextState\n#undef tLinkPlayerCount\n#undef tBlockReceivedStatus\n#undef tCurrLinkPlayer\n#undef tI\n#undef tState\n"
  },
  {
    "path": "src/union_room_chat_display.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"graphics.h\"\n#include \"menu.h\"\n#include \"new_menu_helpers.h\"\n#include \"scanline_effect.h\"\n#include \"strings.h\"\n#include \"text_window.h\"\n#include \"union_room_chat.h\"\n#include \"union_room_chat_display.h\"\n#include \"union_room_chat_objects.h\"\n\n#define STDMESSAGE_QUIT_CHATTING 0\n#define STDMESSAGE_REGISTER_WHERE 1\n#define STDMESSAGE_REGISTER_HERE 2\n#define STDMESSAGE_INPUT_TEXT 3\n#define STDMESSAGE_EXITING_CHAT 4\n#define STDMESSAGE_LEADER_LEFT 5\n#define STDMESSAGE_ASK_SAVE 6\n#define STDMESSAGE_ASK_OVERWRITE 7\n#define STDMESSAGE_SAVING_NO_OFF 8\n#define STDMESSAGE_SAVED_THE_GAME 9\n#define STDMESSAGE_WARN_LEADER_LEAVE 10\n\nstruct UnionRoomChat2Subtask\n{\n    bool32 (*callback)(u8 *);\n    u8 active;\n    u8 state;\n};\n\nstruct UnionRoomChat2\n{\n    struct UnionRoomChat2Subtask subtasks[3];\n    u16 yesNoMenuWinId;\n    u16 curLine;\n    u16 scrollCount;\n    u16 messageWindowId;\n    s16 bg1hofs;\n    u8 expandedPlaceholdersBuffer[0x106];\n    u8 bg0Buffer[BG_SCREEN_SIZE];\n    u8 bg1Buffer[BG_SCREEN_SIZE];\n    u8 bg3Buffer[BG_SCREEN_SIZE];\n    u8 bg2Buffer[BG_SCREEN_SIZE];\n    u8 unk2128[0x20];\n    u8 unk2148[0x20];\n};\n\nstruct SubtaskInfo\n{\n    u16 idx;\n    bool32 (*callback)(u8 *);\n};\n\nstruct MessageWindowInfo\n{\n    const u8 *text;\n    bool8 boxType;\n    u8 x;\n    u8 y;\n    u8 letterSpacing;\n    u8 lineSpacing;\n    bool8 expandPlaceholders;\n    bool8 widerBox;\n};\n\nstatic EWRAM_DATA struct UnionRoomChat2 * sWork = NULL;\n\nstatic void InitWork(struct UnionRoomChat2 * ptr);\nstatic void UnionRoomChat_ResetDisplaySubtasks(void);\nstatic bool32 DisplaySubtask_LoadGfx(u8 *state);\nstatic bool32 DisplaySubtask_PrintWin3(u8 *state);\nstatic bool32 DisplaySubtask_HideWin3(u8 *state);\nstatic bool32 DisplaySubtask_SwitchPages(u8 *state);\nstatic bool32 DisplaySubtask_MoveSelectorCursorObj(u8 *state);\nstatic bool32 DisplaySubtask_ShowQuitChattingDialog(u8 *state);\nstatic bool32 DisplaySubtask_HideQuitChattingDialog(u8 *state);\nstatic bool32 DisplaySubtask_UpdateMessageBuffer(u8 *state);\nstatic bool32 DisplaySubtask_PrintRegisterWhere(u8 *state);\nstatic bool32 DisplaySubtask_CancelRegister(u8 *state);\nstatic bool32 DisplaySubtask_ReturnToKeyboard(u8 *state);\nstatic bool32 DisplaySubtask_ScrollChat(u8 *state);\nstatic bool32 DisplaySubtask_AnimateSelectorCursorBlink(u8 *state);\nstatic bool32 DisplaySubtask_PrintInputText(u8 *state);\nstatic bool32 DisplaySubtask_PrintExitingChat(u8 *state);\nstatic bool32 DisplaySubtask_PrintLeaderLeft(u8 *state);\nstatic bool32 DisplaySubtask_AskSave(u8 *state);\nstatic bool32 DisplaySubtask_AskOverwriteSave(u8 *state);\nstatic bool32 DisplaySubtask_PrintSavingDontTurnOffPower(u8 *state);\nstatic bool32 DisplaySubtask_PrintSavedTheGame(u8 *state);\nstatic bool32 DisplaySubtask_ShowConfirmLeaderLeaveDialog(u8 *state);\nstatic bool32 DisplaySubtaskDummy(u8 *state);\nstatic void PlaceYesNoMenuAt(u8 a0, u8 a1, u8 a2);\nstatic void HideYesNoMenuWindow(void);\nstatic void DestroyYesNoMenuWindow(void);\nstatic void PlaceStdMessageWindow(int id, u16 bg0vofs);\nstatic void HideStdMessageWindow(void);\nstatic void DestroyStdMessageWindow(void);\nstatic void FillWin1Rect(u16 x, u16 width, u8 fillValue);\nstatic void PrintOnWin1Parameterized(u16 x, u8 *str, u8 bgColor, u8 fgColor, u8 shadowColor);\nstatic void PrintCurrentKeyboardPage(void);\nstatic bool32 AnimateMoveBg1Right(void);\nstatic bool32 AnimateMoveBg1Left(void);\nstatic void PrintKeyboardSwapTextsOnWin3(void);\nstatic void ClearWin3(void);\nstatic void PrintTextOnWin0Colorized(u16 row, u8 *str, u8 colorIdx);\nstatic void ResetGpuBgState(void);\nstatic void SetBgTilemapWorkBuffers(void);\nstatic void ClearBg0(void);\nstatic void LoadUnionRoomChatPanelGfx(void);\nstatic void LoadLinkMiscMenuGfx(void);\nstatic void LoadBg1Pal8(void);\nstatic void LoadWin0(void);\nstatic void LoadWin2(void);\nstatic void LoadWin1(void);\nstatic void LoadWin3(void);\nstatic void InitScanlineEffect(void);\nstatic void FillScanlineEffectWithValue1col(s16 a0);\nstatic void FillScanlineEffectWithValue2col(s16 a0);\n\nstatic const u16 sUnionRoomChat_TextEntry_Pal[] = INCBIN_U16(\"graphics/union_room_chat/text_entry.gbapal\");\nstatic const u16 gUnionRoomChat_Unused_Pal[] = INCBIN_U16(\"graphics/union_room_chat/unused.gbapal\"); // Loaded, but nothing uses it\nstatic const u16 sUnionRoomChat_Messages_Pal[] = INCBIN_U16(\"graphics/union_room_chat/messages.gbapal\");\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 0,\n        .mapBaseIndex = 7,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x0000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 3,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x0000\n    }, {\n        .bg = 2,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 23,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 2,\n        .baseTile = 0x0000\n    }, {\n        .bg = 3,\n        .charBaseIndex = 1,\n        .mapBaseIndex = 15,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 3,\n        .baseTile = 0x0001\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 3,\n        .tilemapLeft = 8,\n        .tilemapTop = 1,\n        .width = 21,\n        .height = 19,\n        .paletteNum = 15,\n        .baseBlock = 0x001\n    }, {\n        .bg = 1,\n        .tilemapLeft = 9,\n        .tilemapTop = 18,\n        .width = 15,\n        .height = 2,\n        .paletteNum = 12,\n        .baseBlock = 0x07a\n    }, {\n        .bg = 1,\n        .tilemapLeft = 0,\n        .tilemapTop = 2,\n        .width = 6,\n        .height = 15,\n        .paletteNum = 7,\n        .baseBlock = 0x020\n    }, {\n        .bg = 0,\n        .tilemapLeft = 1,\n        .tilemapTop = 2,\n        .width = 7,\n        .height = 9,\n        .paletteNum = 14,\n        .baseBlock = 0x013\n    }, DUMMY_WIN_TEMPLATE\n};\n\nstatic const struct SubtaskInfo sSubtaskInfo[] = {\n    {CHATDISPLAYROUTINE_LOADGFX, DisplaySubtask_LoadGfx},\n    {CHATDISPLAYROUTINE_SHOWKBSWAPMENU, DisplaySubtask_PrintWin3},\n    {CHATDISPLAYROUTINE_HIDEKBSWAPMENU, DisplaySubtask_HideWin3},\n    {CHATDISPLAYROUTINE_SWITCHPAGES, DisplaySubtask_SwitchPages},\n    {CHATDISPLAYROUTINE_MOVEKBCURSOR, DisplaySubtask_MoveSelectorCursorObj},\n    {CHATDISPLAYROUTINE_SHOWQUITCHATTINGDIALOG, DisplaySubtask_ShowQuitChattingDialog},\n    {CHATDISPLAYROUTINE_DESTROYSTDMSGANDYESNO, DisplaySubtask_HideQuitChattingDialog},\n    {CHATDISPLAYROUTINE_PRINTMSG, DisplaySubtask_UpdateMessageBuffer},\n    {CHATDISPLAYROUTINE_PRINTREGISTERWHERE, DisplaySubtask_PrintRegisterWhere},\n    {CHATDISPLAYROUTINE_CANCELREGISTER, DisplaySubtask_CancelRegister},\n    {CHATDISPLAYROUTINE_RETURNTOKB, DisplaySubtask_ReturnToKeyboard},\n    {CHATDISPLAYROUTINE_SCROLLCHAT, DisplaySubtask_ScrollChat},\n    {CHATDISPLAYROUTINE_CURSORBLINK, DisplaySubtask_AnimateSelectorCursorBlink},\n    {CHATDISPLAYROUTINE_PRINTINPUTTEXT, DisplaySubtask_PrintInputText},\n    {CHATDISPLAYROUTINE_PRINTEXITINGCHAT, DisplaySubtask_PrintExitingChat},\n    {CHATDISPLAYROUTINE_PRINTLEADERLEFT, DisplaySubtask_PrintLeaderLeft},\n    {CHATDISPLAYROUTINE_ASKSAVE, DisplaySubtask_AskSave},\n    {CHATDISPLAYROUTINE_ASKOVERWRITESAVE, DisplaySubtask_AskOverwriteSave},\n    {CHATDISPLAYROUTINE_PRINTSAVING, DisplaySubtask_PrintSavingDontTurnOffPower},\n    {CHATDISPLAYROUTINE_PRINTSAVEDTHEGAME, DisplaySubtask_PrintSavedTheGame},\n    {CHATDISPLAYROUTINE_SHOWCONFIRMLEADERLEAVEDIALOG, DisplaySubtask_ShowConfirmLeaderLeaveDialog}\n};\n\nstatic const struct MessageWindowInfo sMessageWindowInfo[] = {\n\n    [STDMESSAGE_QUIT_CHATTING] = {\n        .text = gText_QuitChatting,\n        .boxType = 1,\n        .x = 0,\n        .y = 0,\n        .letterSpacing = 1,\n        .lineSpacing = 2, \n        .expandPlaceholders = FALSE,\n        .widerBox = FALSE\n    },\n    [STDMESSAGE_REGISTER_WHERE] = {\n        .text = gText_RegisterTextWhere,\n        .boxType = 1,\n        .x = 0,\n        .y = 0,\n        .letterSpacing = 1,\n        .lineSpacing = 2, \n        .expandPlaceholders = FALSE,\n        .widerBox = FALSE\n    },\n    [STDMESSAGE_REGISTER_HERE] = {\n        .text = gText_RegisterTextHere,\n        .boxType = 1,\n        .x = 0,\n        .y = 0,\n        .letterSpacing = 1,\n        .lineSpacing = 2, \n        .expandPlaceholders = FALSE,\n        .widerBox = FALSE\n    },\n    [STDMESSAGE_INPUT_TEXT] = {\n        .text = gText_InputText,\n        .boxType = 1,\n        .x = 0,\n        .y = 0,\n        .letterSpacing = 1,\n        .lineSpacing = 2, \n        .expandPlaceholders = FALSE,\n        .widerBox = FALSE\n    },\n    [STDMESSAGE_EXITING_CHAT] = {\n        .text = gText_ExitingTheChat,\n        .boxType = 2,\n        .x = 0,\n        .y = 0,\n        .letterSpacing = 1,\n        .lineSpacing = 2, \n        .expandPlaceholders = FALSE,\n        .widerBox = FALSE\n    },\n    [STDMESSAGE_LEADER_LEFT] = {\n        .text = gText_LeaderHasLeftEndingChat,\n        .boxType = 2,\n        .x = 0,\n        .y = 0,\n        .letterSpacing = 0,\n        .lineSpacing = 2, \n        .expandPlaceholders = TRUE,\n        .widerBox = FALSE\n    },\n    [STDMESSAGE_ASK_SAVE] = {\n        .text = gText_RegisteredTextChanged_OKtoSave,\n        .boxType = 2,\n        .x = 0,\n        .y = 0,\n        .letterSpacing = 1,\n        .lineSpacing = 2, \n        .expandPlaceholders = FALSE,\n        .widerBox = TRUE\n    },\n    [STDMESSAGE_ASK_OVERWRITE] = {\n        .text = gText_RegisteredTextChanged_AlreadySavedFile,\n        .boxType = 2,\n        .x = 0,\n        .y = 0,\n        .letterSpacing = 1,\n        .lineSpacing = 2, \n        .expandPlaceholders = FALSE,\n        .widerBox = TRUE\n    },\n    [STDMESSAGE_SAVING_NO_OFF] = {\n        .text = gText_RegisteredTextChanged_SavingDontTurnOff,\n        .boxType = 2,\n        .x = 0,\n        .y = 0,\n        .letterSpacing = 1,\n        .lineSpacing = 2, \n        .expandPlaceholders = FALSE,\n        .widerBox = TRUE\n    },\n    [STDMESSAGE_SAVED_THE_GAME] = {\n        .text = gText_RegisteredTextChanged_SavedTheGame,\n        .boxType = 2,\n        .x = 0,\n        .y = 0,\n        .letterSpacing = 1,\n        .lineSpacing = 2, \n        .expandPlaceholders = TRUE,\n        .widerBox = TRUE\n    },\n    [STDMESSAGE_WARN_LEADER_LEAVE] = {\n        .text = gText_IfLeaderLeavesChatWillEnd,\n        .boxType = 2,\n        .x = 0,\n        .y = 0,\n        .letterSpacing = 1,\n        .lineSpacing = 2, \n        .expandPlaceholders = FALSE,\n        .widerBox = TRUE\n    }\n};\n\nstatic const u8 gText_Ellipsis[] = _(\"…\");\n\nstatic const struct MenuAction sKeyboardSwapTexts[] = {\n    {gText_Upper},\n    {gText_Lower},\n    {gText_Symbols},\n    {gText_Register2},\n    {gText_Exit}\n};\n\nbool8 UnionRoomChat_TryAllocGraphicsWork(void)\n{\n    sWork = Alloc(sizeof(*sWork));\n    if (sWork && UnionRoomChat_TryAllocSpriteWork())\n    {\n        ResetBgsAndClearDma3BusyFlags(0);\n        InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));\n        InitWindows(sWindowTemplates);\n        ResetTempTileDataBuffers();\n        InitScanlineEffect();\n        InitWork(sWork);\n        UnionRoomChat_ResetDisplaySubtasks();\n        UnionRoomChat_StartDisplaySubtask(0, 0);\n        return TRUE;\n    }\n    else\n    {\n        return FALSE;\n    }\n}\n\nbool32 UnionRoomChat_RunDisplaySubtask0(void)\n{\n    return RunDisplaySubtask(0);\n}\n\nvoid UnionRoomChat_FreeGraphicsWork(void)\n{\n    UnionRoomChat_FreeSpriteWork();\n    if (sWork != NULL)\n        FREE_AND_SET_NULL(sWork);\n\n    FreeAllWindowBuffers();\n    gScanlineEffect.state = 3;\n}\n\nstatic void InitWork(struct UnionRoomChat2 *arg0)\n{\n    arg0->yesNoMenuWinId = 0xFF;\n    arg0->messageWindowId = 0xFF;\n    arg0->curLine = 0;\n}\n\nvoid UnionRoomChat_ResetDisplaySubtasks(void)\n{\n    int i;\n\n    if (sWork == NULL)\n        return;\n\n    for (i = 0; i < 3; i++)\n    {\n        sWork->subtasks[i].callback = DisplaySubtaskDummy;\n        sWork->subtasks[i].active = FALSE;\n        sWork->subtasks[i].state = 0;\n    }\n}\n\nvoid UnionRoomChat_RunDisplaySubtasks(void)\n{\n    int i;\n\n    if (sWork == NULL)\n        return;\n\n    for (i = 0; i < 3; i++)\n    {\n        if (sWork->subtasks[i].active)\n            sWork->subtasks[i].active = sWork->subtasks[i].callback(&sWork->subtasks[i].state);\n    }\n}\n\nvoid UnionRoomChat_StartDisplaySubtask(u16 arg0, u8 arg1)\n{\n    int i;\n\n    sWork->subtasks[arg1].callback = DisplaySubtaskDummy;\n    for (i = 0; i < NELEMS(sSubtaskInfo); i++)\n    {\n        if (sSubtaskInfo[i].idx == arg0)\n        {\n            sWork->subtasks[arg1].callback = sSubtaskInfo[i].callback;\n            sWork->subtasks[arg1].active = TRUE;\n            sWork->subtasks[arg1].state = 0;\n            break;\n        }\n    }\n}\n\nbool8 RunDisplaySubtask(u8 arg0)\n{\n    return sWork->subtasks[arg0].active;\n}\n\nstatic bool32 DisplaySubtask_LoadGfx(u8 *state)\n{\n    if (FreeTempTileDataBuffersIfPossible() == TRUE)\n        return TRUE;\n\n    switch (*state)\n    {\n    case 0:\n        ResetGpuBgState();\n        SetBgTilemapWorkBuffers();\n        break;\n    case 1:\n        ClearBg0();\n        break;\n    case 2:\n        LoadUnionRoomChatPanelGfx();\n        break;\n    case 3:\n        LoadLinkMiscMenuGfx();\n        break;\n    case 4:\n        LoadBg1Pal8();\n        break;\n    case 5:\n        LoadWin0();\n        LoadWin2();\n        LoadWin3();\n        LoadWin1();\n        break;\n    case 6:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            UnionRoomChat_CreateSelectorCursorObj();\n            UnionRoomChat_SpawnTextEntryPointerSprites();\n            CreatePageSwitchUISprites();\n        }\n        break;\n    default:\n        return FALSE;\n    }\n\n    (*state)++;\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_PrintWin3(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        PrintKeyboardSwapTextsOnWin3();\n        CopyWindowToVram(3, COPYWIN_FULL);\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    (*state)++;\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_HideWin3(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        ClearWin3();\n        CopyWindowToVram(3, COPYWIN_FULL);\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    (*state)++;\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_SwitchPages(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        UnionRoomChat_ToggleSelectorCursorObjVisibility(TRUE);\n        if (AnimateMoveBg1Right())\n            return TRUE;\n\n        PrintCurrentKeyboardPage();\n        CopyWindowToVram(2, COPYWIN_GFX);\n        break;\n    case 1:\n        if (IsDma3ManagerBusyWithBgCopy())\n            return TRUE;\n        break;\n    case 2:\n        if (AnimateMoveBg1Left())\n            return TRUE;\n\n        UnionRoomChat_MoveSelectorCursorObj();\n        UnionRoomChat_ToggleSelectorCursorObjVisibility(FALSE);\n        UpdateVisibleUnionRoomChatIcon();\n        return FALSE;\n    }\n\n    (*state)++;\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_MoveSelectorCursorObj(u8 *state)\n{\n    UnionRoomChat_MoveSelectorCursorObj();\n    return FALSE;\n}\n\nstatic bool32 DisplaySubtask_ShowQuitChattingDialog(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        PlaceStdMessageWindow(STDMESSAGE_QUIT_CHATTING, 0);\n        PlaceYesNoMenuAt(23, 11, 1);\n        CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL);\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    (*state)++;\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_HideQuitChattingDialog(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        HideStdMessageWindow();\n        HideYesNoMenuWindow();\n        CopyBgTilemapBufferToVram(0);\n        break;\n    case 1:\n        if (IsDma3ManagerBusyWithBgCopy())\n            return TRUE;\n\n        DestroyStdMessageWindow();\n        DestroyYesNoMenuWindow();\n        return FALSE;\n    }\n\n    (*state)++;\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_UpdateMessageBuffer(u8 *state)\n{\n    u32 start, length;\n    u8 *str;\n\n    switch (*state)\n    {\n    case 0:\n        UnionRoomChat_GetBufferSelectionRegion(&start, &length);\n        FillWin1Rect(start, length, PIXEL_FILL(0));\n        str = UnionRoomChat_GetMessageEntryBuffer();\n        PrintOnWin1Parameterized(0, str, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY);\n        CopyWindowToVram(1, COPYWIN_GFX);\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            UpdateVisibleUnionRoomChatIcon();\n            return FALSE;\n        }\n        return TRUE;\n    }\n\n    (*state)++;\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_PrintRegisterWhere(u8 *state)\n{\n    u16 var0;\n    u8 *str;\n    u16 length;\n\n    switch (*state)\n    {\n    case 0:\n        var0 = UnionRoomChat_GetNumCharsInMessageEntryBuffer();\n        str = UnionRoomChat_GetEndOfMessageEntryBuffer();\n        length = StringLength_Multibyte(str);\n        FillWin1Rect(var0, length, PIXEL_FILL(6));\n        PrintOnWin1Parameterized(var0, str, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED);\n        CopyWindowToVram(1, COPYWIN_GFX);\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            PlaceStdMessageWindow(STDMESSAGE_REGISTER_WHERE, 16);\n            CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL);\n        }\n        else\n        {\n            return TRUE;\n        }\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n            UnionRoomChat_UpdateObjPalCycle(1);\n        else\n            return TRUE;\n        break;\n    case 3:\n        return FALSE;\n    }\n\n    (*state)++;\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_CancelRegister(u8 *state)\n{\n    u16 x;\n    u8 *str;\n    u16 length;\n\n    switch (*state)\n    {\n    case 0:\n        x = UnionRoomChat_GetNumCharsInMessageEntryBuffer();\n        str = UnionRoomChat_GetEndOfMessageEntryBuffer();\n        length = StringLength_Multibyte(str);\n        FillWin1Rect(x, length, PIXEL_FILL(0));\n        PrintOnWin1Parameterized(x, str, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY);\n        CopyWindowToVram(1, COPYWIN_GFX);\n        break;\n    case 1:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            HideStdMessageWindow();\n            CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL);\n        }\n        else\n        {\n            return TRUE;\n        }\n        break;\n    case 2:\n        if (!IsDma3ManagerBusyWithBgCopy())\n        {\n            UnionRoomChat_UpdateObjPalCycle(0);\n            DestroyStdMessageWindow();\n        }\n        else\n        {\n            return TRUE;\n        }\n        break;\n    case 3:\n        return FALSE;\n    }\n\n    (*state)++;\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_ReturnToKeyboard(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        PrintCurrentKeyboardPage();\n        CopyWindowToVram(2, COPYWIN_GFX);\n        (*state)++;\n        break;\n    case 1:\n        if (IsDma3ManagerBusyWithBgCopy())\n            return TRUE;\n        else\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_ScrollChat(u8 *state)\n{\n    u16 row;\n    u8 *str;\n    u8 colorIdx;\n\n    switch (*state)\n    {\n    case 0:\n        row = sWork->curLine;\n        str = UnionRoomChat_GetLastReceivedMessage();\n        colorIdx = UnionRoomChat_GetReceivedPlayerIndex();\n        PrintTextOnWin0Colorized(row, str, colorIdx);\n        CopyWindowToVram(0, COPYWIN_GFX);\n        break;\n    case 1:\n        if (IsDma3ManagerBusyWithBgCopy())\n            return TRUE;\n\n        if (sWork->curLine < 9)\n        {\n            sWork->curLine++;\n            *state = 4;\n            return FALSE;\n        }\n        else\n        {\n            sWork->scrollCount = 0;\n            (*state)++;\n        }\n        // fall through\n    case 2:\n        ScrollWindow(0, 0, 5, PIXEL_FILL(1));\n        CopyWindowToVram(0, COPYWIN_GFX);\n        sWork->scrollCount++;\n        (*state)++;\n        // fall through\n    case 3:\n        if (IsDma3ManagerBusyWithBgCopy())\n            return TRUE;\n\n        if (sWork->scrollCount < 3)\n        {\n            (*state)--;\n            return TRUE;\n        }\n        break;\n    case 4:\n        return FALSE;\n    default:\n        return TRUE;\n    }\n\n    (*state)++;\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_AnimateSelectorCursorBlink(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        UnionRoomChat_SetSelectorCursorClosedImage();\n        (*state)++;\n        break;\n    case 1:\n        return UnionRoomChat_AnimateSelectorCursorReopen();\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_PrintInputText(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        PlaceStdMessageWindow(STDMESSAGE_INPUT_TEXT, 16);\n        CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL);\n        (*state)++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_PrintExitingChat(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        PlaceStdMessageWindow(STDMESSAGE_EXITING_CHAT, 0);\n        CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL);\n        (*state)++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_PrintLeaderLeft(u8 *state)\n{\n    u8 *str;\n\n    switch (*state)\n    {\n    case 0:\n        DynamicPlaceholderTextUtil_Reset();\n        str = UnionRoomChat_GetNameOfPlayerWhoDisbandedChat();\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, str);\n        PlaceStdMessageWindow(STDMESSAGE_LEADER_LEFT, 0);\n        CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL);\n        (*state)++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_AskSave(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        PlaceStdMessageWindow(STDMESSAGE_ASK_SAVE, 0);\n        PlaceYesNoMenuAt(23, 10, 1);\n        CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL);\n        (*state)++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_AskOverwriteSave(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        PlaceStdMessageWindow(STDMESSAGE_ASK_OVERWRITE, 0);\n        PlaceYesNoMenuAt(23, 10, 1);\n        CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL);\n        (*state)++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_PrintSavingDontTurnOffPower(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        PlaceStdMessageWindow(STDMESSAGE_SAVING_NO_OFF, 0);\n        CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL);\n        (*state)++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_PrintSavedTheGame(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        DynamicPlaceholderTextUtil_Reset();\n        DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);\n        PlaceStdMessageWindow(STDMESSAGE_SAVED_THE_GAME, 0);\n        CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL);\n        (*state)++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtask_ShowConfirmLeaderLeaveDialog(u8 *state)\n{\n    switch (*state)\n    {\n    case 0:\n        PlaceStdMessageWindow(STDMESSAGE_WARN_LEADER_LEAVE, 0);\n        PlaceYesNoMenuAt(23, 10, 1);\n        CopyWindowToVram(sWork->messageWindowId, COPYWIN_FULL);\n        (*state)++;\n        break;\n    case 1:\n        return IsDma3ManagerBusyWithBgCopy();\n    }\n\n    return TRUE;\n}\n\nstatic bool32 DisplaySubtaskDummy(u8 *arg0)\n{\n    return FALSE;\n}\n\nstatic void PlaceYesNoMenuAt(u8 left, u8 top, u8 initialCursorPos)\n{\n    struct WindowTemplate template;\n    template.bg = 0;\n    template.tilemapLeft = left;\n    template.tilemapTop = top;\n    template.width = 6;\n    template.height = 4;\n    template.paletteNum = 14;\n    template.baseBlock = 0x052;\n    sWork->yesNoMenuWinId = AddWindow(&template);\n    if (sWork->yesNoMenuWinId != 0xFF)\n    {\n        FillWindowPixelBuffer(sWork->yesNoMenuWinId, PIXEL_FILL(1));\n        PutWindowTilemap(sWork->yesNoMenuWinId);\n        AddTextPrinterParameterized(sWork->yesNoMenuWinId, FONT_NORMAL, gText_Yes, 8, 2, TEXT_SKIP_DRAW, NULL);\n        AddTextPrinterParameterized(sWork->yesNoMenuWinId, FONT_NORMAL, gText_No, 8, 16, TEXT_SKIP_DRAW, NULL);\n        DrawTextBorderOuter(sWork->yesNoMenuWinId, 1, 13);\n        Menu_InitCursor(sWork->yesNoMenuWinId, FONT_NORMAL, 0, 2, 14, 2, initialCursorPos);\n    }\n}\n\nstatic void HideYesNoMenuWindow(void)\n{\n    if (sWork->yesNoMenuWinId != 0xFF)\n    {\n        ClearStdWindowAndFrameToTransparent(sWork->yesNoMenuWinId, FALSE);\n        ClearWindowTilemap(sWork->yesNoMenuWinId);\n    }\n}\n\nstatic void DestroyYesNoMenuWindow(void)\n{\n    if (sWork->yesNoMenuWinId != 0xFF)\n    {\n        RemoveWindow(sWork->yesNoMenuWinId);\n        sWork->yesNoMenuWinId = 0xFF;\n    }\n}\n\ns8 UnionRoomChat_ProcessInput(void)\n{\n    return Menu_ProcessInput();\n}\n\nstatic void PlaceStdMessageWindow(int id, u16 bg0vofs)\n{\n    const u8 *str;\n    int windowId;\n    struct WindowTemplate template;\n    template.bg = 0;\n    template.tilemapLeft = 8;\n    template.tilemapTop = 16;\n    template.width = 21;\n    template.height = 4;\n    template.paletteNum = 14;\n    template.baseBlock = 0x06A;\n    if (sMessageWindowInfo[id].widerBox)\n    {\n        template.tilemapLeft -= 7;\n        template.width += 7;\n    }\n\n    sWork->messageWindowId = AddWindow(&template);\n    windowId = sWork->messageWindowId;\n    if (sWork->messageWindowId == 0xFF)\n        return;\n\n    if (sMessageWindowInfo[id].expandPlaceholders)\n    {\n        DynamicPlaceholderTextUtil_ExpandPlaceholders(sWork->expandedPlaceholdersBuffer, sMessageWindowInfo[id].text);\n        str = sWork->expandedPlaceholdersBuffer;\n    }\n    else\n    {\n        str = sMessageWindowInfo[id].text;\n    }\n\n    ChangeBgY(0, bg0vofs * 256, 0);\n    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));\n    PutWindowTilemap(windowId);\n    if (sMessageWindowInfo[id].boxType == 1)\n    {\n        DrawTextBorderInner(windowId, 0xA, 2);\n        AddTextPrinterParameterized5(\n            windowId,\n            FONT_NORMAL,\n            str,\n            sMessageWindowInfo[id].x + 8,\n            sMessageWindowInfo[id].y + 8,\n            TEXT_SKIP_DRAW,\n            NULL,\n            sMessageWindowInfo[id].letterSpacing,\n            sMessageWindowInfo[id].lineSpacing);\n    }\n    else\n    {\n        DrawTextBorderOuter(windowId, 0xA, 2);\n        AddTextPrinterParameterized5(\n            windowId,\n            FONT_NORMAL,\n            str,\n            sMessageWindowInfo[id].x,\n            sMessageWindowInfo[id].y,\n            TEXT_SKIP_DRAW,\n            NULL,\n            sMessageWindowInfo[id].letterSpacing,\n            sMessageWindowInfo[id].lineSpacing);\n    }\n\n    sWork->messageWindowId = windowId;\n}\n\nstatic void HideStdMessageWindow(void)\n{\n    if (sWork->messageWindowId != 0xFF)\n    {\n        ClearStdWindowAndFrameToTransparent(sWork->messageWindowId, FALSE);\n        ClearWindowTilemap(sWork->messageWindowId);\n    }\n\n    ChangeBgY(0, 0, 0);\n}\n\nstatic void DestroyStdMessageWindow(void)\n{\n    if (sWork->messageWindowId != 0xFF)\n    {\n        RemoveWindow(sWork->messageWindowId);\n        sWork->messageWindowId = 0xFF;\n    }\n}\n\nstatic void FillWin1Rect(u16 x, u16 width, u8 fillValue)\n{\n    FillWindowPixelRect(1, fillValue, x * 8, 1, width * 8, 14);\n}\n\nstatic void PrintOnWin1Parameterized(u16 x, u8 *str, u8 bgColor, u8 fgColor, u8 shadowColor)\n{\n    u8 color[3];\n    u8 strbuf[35];\n\n    if (bgColor != TEXT_COLOR_TRANSPARENT)\n        FillWin1Rect(x, UnionRoomChat_GetMessageEntryCursorPosition() - x, bgColor);\n\n    color[0] = bgColor;\n    color[1] = fgColor;\n    color[2] = shadowColor;\n    strbuf[0] = EXT_CTRL_CODE_BEGIN;\n    strbuf[1] = EXT_CTRL_CODE_MIN_LETTER_SPACING;\n    strbuf[2] = 8;\n    StringCopy(&strbuf[3], str);\n    AddTextPrinterParameterized3(1, FONT_NORMAL, x * 8, 1, color, TEXT_SKIP_DRAW, strbuf);\n}\n\nstatic void PrintCurrentKeyboardPage(void)\n{\n    u8 page;\n    int i;\n    u16 left;\n    u16 top;\n    u8 color[3];\n    u8 str[45];\n    u8 *str2;\n\n    FillWindowPixelBuffer(2, PIXEL_FILL(15));\n    page = GetCurrentKeyboardPage();\n    color[0] = TEXT_COLOR_TRANSPARENT;\n    color[1] = TEXT_DYNAMIC_COLOR_5;\n    color[2] = TEXT_DYNAMIC_COLOR_4;\n    if (page != UNION_ROOM_KB_PAGE_COUNT)\n    {\n        str[0] = EXT_CTRL_CODE_BEGIN;\n        str[1] = EXT_CTRL_CODE_MIN_LETTER_SPACING;\n        str[2] = 8;\n\n        if (page == UNION_ROOM_KB_PAGE_EMOJI)\n            left = 6;\n        else\n            left = 8;\n        for (i = 0, top = 0; i < UNION_ROOM_KB_ROW_COUNT; i++, top += 12)\n        {\n            if (!gUnionRoomKeyboardText[page][i])\n                return;\n\n            StringCopy(&str[3], gUnionRoomKeyboardText[page][i]);\n            AddTextPrinterParameterized3(2, FONT_SMALL, left, top, color, TEXT_SKIP_DRAW, str);\n        }\n    }\n    else\n    {\n        left = 4;\n        for (i = 0, top = 0; i < 10; i++, top += 12)\n        {\n            str2 = UnionRoomChat_GetWorkRegisteredText(i);\n            if (GetStringWidth(FONT_SMALL, str2, 0) <= 40)\n            {\n                AddTextPrinterParameterized3(2, FONT_SMALL, left, top, color, TEXT_SKIP_DRAW, str2);\n            }\n            else\n            {\n                int length = StringLength_Multibyte(str2);\n                do\n                {\n                    length--;\n                    StringCopyN_Multibyte(str, str2, length);\n                } while (GetStringWidth(FONT_SMALL, str, 0) > 35);\n\n                AddTextPrinterParameterized3(2, FONT_SMALL, left, top, color, TEXT_SKIP_DRAW, str);\n                AddTextPrinterParameterized3(2, FONT_SMALL, left + 35, top, color, TEXT_SKIP_DRAW, gText_Ellipsis);\n            }\n        }\n    }\n}\n\nstatic bool32 AnimateMoveBg1Right(void)\n{\n    if (sWork->bg1hofs < 56)\n    {\n        sWork->bg1hofs += 12;\n        if (sWork->bg1hofs >= 56)\n            sWork->bg1hofs = 56;\n\n        if (sWork->bg1hofs < 56)\n        {\n            FillScanlineEffectWithValue1col(sWork->bg1hofs);\n            return TRUE;\n        }\n    }\n\n    FillScanlineEffectWithValue2col(sWork->bg1hofs);\n    return FALSE;\n}\n\nstatic bool32 AnimateMoveBg1Left(void)\n{\n    if (sWork->bg1hofs > 0)\n    {\n        sWork->bg1hofs -= 12;\n        if (sWork->bg1hofs <= 0)\n            sWork->bg1hofs = 0;\n\n        if (sWork->bg1hofs > 0)\n        {\n            FillScanlineEffectWithValue1col(sWork->bg1hofs);\n            return TRUE;\n        }\n    }\n\n    FillScanlineEffectWithValue2col(sWork->bg1hofs);\n    return FALSE;\n}\n\nstatic void PrintKeyboardSwapTextsOnWin3(void)\n{\n    FillWindowPixelBuffer(3, PIXEL_FILL(1));\n    DrawTextBorderOuter(3, 1, 13);\n    PrintMenuTable(3, FONT_NORMAL, 14, 5, sKeyboardSwapTexts);\n    Menu_InitCursor(3, FONT_NORMAL, 0, 0, 14, 5, GetCurrentKeyboardPage());\n    PutWindowTilemap(3);\n}\n\nstatic void ClearWin3(void)\n{\n    ClearStdWindowAndFrameToTransparent(3, FALSE);\n    ClearWindowTilemap(3);\n}\n\nstatic void PrintTextOnWin0Colorized(u16 row, u8 *str, u8 colorIdx)\n// colorIdx: 0 = grey, 1 = red, 2 = green, 3 = blue\n{\n    u8 color[3];\n    color[0] = TEXT_COLOR_WHITE;\n    color[1] = colorIdx * 2 + 2;\n    color[2] = colorIdx * 2 + 3;\n    FillWindowPixelRect(0, PIXEL_FILL(1), 0, row * 15, 168, 15);\n    AddTextPrinterParameterized3(0, FONT_NORMAL, 0, row * 15, color, TEXT_SKIP_DRAW, str);\n}\n\nstatic void ResetGpuBgState(void)\n{\n    ChangeBgX(0, 0, 0);\n    ChangeBgY(0, 0, 0);\n    ChangeBgX(1, 0, 0);\n    ChangeBgY(1, 0, 0);\n    ChangeBgX(2, 0, 0);\n    ChangeBgY(2, 0, 0);\n    ChangeBgX(3, 0, 0);\n    ChangeBgY(3, 0, 0);\n    ShowBg(0);\n    ShowBg(1);\n    ShowBg(2);\n    ShowBg(3);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);\n    SetGpuReg(REG_OFFSET_BLDCNT, 0);\n    ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON);\n    SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);\n    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(64, 240));\n    SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 144));\n    SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_BG2 | WININ_WIN0_BG3\n                                | WININ_WIN0_OBJ | WININ_WIN0_CLR);\n    SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);\n}\n\nstatic void SetBgTilemapWorkBuffers(void)\n{\n    SetBgTilemapBuffer(0, sWork->bg0Buffer);\n    SetBgTilemapBuffer(1, sWork->bg1Buffer);\n    SetBgTilemapBuffer(3, sWork->bg3Buffer);\n    SetBgTilemapBuffer(2, sWork->bg2Buffer);\n}\n\nstatic void ClearBg0(void)\n{\n    RequestDma3Fill(0, (void *)BG_CHAR_ADDR(0), 0x20, DMA3_32BIT);\n    FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);\n    CopyBgTilemapBufferToVram(0);\n}\n\nstatic void LoadUnionRoomChatPanelGfx(void)\n{\n    LoadPalette(gUnionRoomChat_Panel_Pal, BG_PLTT_ID(7), PLTT_SIZE_4BPP);\n    LoadPalette(sUnionRoomChat_TextEntry_Pal, BG_PLTT_ID(12), PLTT_SIZE_4BPP);\n    DecompressAndCopyTileDataToVram(1, gUnionRoomChat_Panel_Gfx, 0, 0, 0);\n    CopyToBgTilemapBuffer(1, gUnionRoomChat_Panel_Tilemap, 0, 0);\n    CopyBgTilemapBufferToVram(1);\n}\n\nstatic void LoadLinkMiscMenuGfx(void)\n{\n    u8 *ptr;\n\n    LoadPalette(gUnionRoomChat_Bg_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n    ptr = DecompressAndCopyTileDataToVram(2, gUnionRoomChat_Bg_Gfx, 0, 0, 0);\n    CopyToBgTilemapBuffer(2, gUnionRoomChat_Bg_Tilemap, 0, 0);\n    CopyBgTilemapBufferToVram(2);\n}\n\nstatic void LoadBg1Pal8(void)\n{\n    LoadPalette(gUnionRoomChat_Unused_Pal, BG_PLTT_ID(8), PLTT_SIZE_4BPP);\n    RequestDma3Fill(0, (void *)BG_CHAR_ADDR(1) + 0x20, 0x20, DMA3_32BIT);\n}\n\nstatic void LoadWin0(void)\n{\n    LoadPalette(sUnionRoomChat_Messages_Pal, BG_PLTT_ID(15), PLTT_SIZE_4BPP);\n    PutWindowTilemap(0);\n    FillWindowPixelBuffer(0, PIXEL_FILL(1));\n    CopyWindowToVram(0, COPYWIN_FULL);\n}\n\nstatic void LoadWin2(void)\n{\n    PutWindowTilemap(2);\n    PrintCurrentKeyboardPage();\n    CopyWindowToVram(2, COPYWIN_FULL);\n}\n\nstatic void LoadWin1(void)\n{\n    FillWindowPixelBuffer(1, PIXEL_FILL(0));\n    PutWindowTilemap(1);\n    CopyWindowToVram(1, COPYWIN_FULL);\n}\n\nstatic void LoadWin3(void)\n{\n    FillWindowPixelBuffer(3, PIXEL_FILL(1));\n    LoadUserWindowGfx(3, 1, BG_PLTT_ID(13));\n    LoadStdWindowGfx(3, 0xA, BG_PLTT_ID(2));\n    LoadPalette(gStandardMenuPalette, BG_PLTT_ID(14),  PLTT_SIZE_4BPP);\n}\n\nstatic void InitScanlineEffect(void)\n{\n    struct ScanlineEffectParams params;\n    params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;\n    params.dmaDest = &REG_BG1HOFS;\n    params.initState = 1;\n    params.unused9 = 0;\n    sWork->bg1hofs = 0;\n    CpuFastFill(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers));\n    ScanlineEffect_SetParams(params);\n}\n\nstatic void FillScanlineEffectWithValue1col(s16 arg0)\n{\n    CpuFill16(arg0, gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], 0x120);\n    CpuFill16(0, gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer] + 0x90, 0x20);\n}\n\nstatic void FillScanlineEffectWithValue2col(s16 arg0)\n{\n    CpuFill16(arg0, gScanlineEffectRegBuffers[0],         0x120);\n    CpuFill16(0,    gScanlineEffectRegBuffers[0] +  0x90, 0x20);\n    CpuFill16(arg0, gScanlineEffectRegBuffers[0] + 0x3C0, 0x120);\n    CpuFill16(0,    gScanlineEffectRegBuffers[0] + 0x450, 0x20);\n}\n"
  },
  {
    "path": "src/union_room_chat_objects.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"decompress.h\"\n#include \"graphics.h\"\n#include \"union_room_chat.h\"\n\nenum {\n    GFXTAG_SELECTOR_CURSOR,\n    GFXTAG_CHAR_SELECT_CURSOR,\n    GFXTAG_TEXT_ENTRY_CURSOR,\n    GFXTAG_R_BUTTON,\n    GFXTAG_ICONS,\n};\n\nstruct UnionRoomChat3\n{\n    struct Sprite *selectorCursorSprite;\n    struct Sprite *characterSelectCursorSprite;\n    struct Sprite *textEntryCursorSprite;\n    struct Sprite *rButtonSprite;\n    struct Sprite *chatIconsSprite;\n    u16 cursorBlinkTimer;\n};\n\nstatic EWRAM_DATA struct UnionRoomChat3 *sWork = NULL;\n\nstatic void SpriteCB_TextEntryCursor(struct Sprite *sprite);\nstatic void SpriteCB_CharacterSelectCursor(struct Sprite *sprite);\n\nstatic const u16 sUnionRoomChatInterfacePal[] = INCBIN_U16(\"graphics/union_room_chat/objects.gbapal\");\nstatic const u32 sSelectorCursor_Gfx[] = INCBIN_U32(\"graphics/union_room_chat/selector_cursor.4bpp.lz\");\nstatic const u32 sTextEntryCursor_Gfx[] = INCBIN_U32(\"graphics/union_room_chat/text_entry_cursor.4bpp.lz\");\nstatic const u32 sCharacterSelectCursor_Gfx[] = INCBIN_U32(\"graphics/union_room_chat/character_select_cursor.4bpp.lz\");\nstatic const u32 sRButton_Gfx[] = INCBIN_U32(\"graphics/union_room_chat/r_button.4bpp.lz\");\n\nstatic const struct CompressedSpriteSheet sSpriteSheets[] = {\n    {\n        .data = sSelectorCursor_Gfx,\n        .size = 128 * TILE_SIZE_4BPP,\n        .tag = GFXTAG_SELECTOR_CURSOR\n    },\n    {\n        .data = sCharacterSelectCursor_Gfx,\n        .size = 2 * TILE_SIZE_4BPP,\n        .tag = GFXTAG_CHAR_SELECT_CURSOR\n    },\n    {\n        .data = sTextEntryCursor_Gfx,\n        .size = 2 * TILE_SIZE_4BPP,\n        .tag = GFXTAG_TEXT_ENTRY_CURSOR\n    },\n    {\n        .data = sRButton_Gfx,\n        .size = 4 * TILE_SIZE_4BPP,\n        .tag = GFXTAG_R_BUTTON\n    },\n    {\n        .data = gUnionRoomChat_Icons_Gfx,\n        .size = 32 * TILE_SIZE_4BPP,\n        .tag = GFXTAG_ICONS\n    },\n};\n\nstatic const struct SpritePalette sSpritePalette = {\n    sUnionRoomChatInterfacePal, 0\n};\n\nstatic const struct OamData sOamData_64x32_1 = {\n    .shape = SPRITE_SHAPE(64x32),\n    .size = SPRITE_SIZE(64x32),\n    .priority = 1\n};\n\nstatic const union AnimCmd sAnim_CursorSmallOpen[] = {\n    ANIMCMD_FRAME(0x00, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_CursorSmallClosed[] = {\n    ANIMCMD_FRAME(0x20, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_CursorLargeOpen[] = {\n    ANIMCMD_FRAME(0x40, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_CursorLargeClosed[] = {\n    ANIMCMD_FRAME(0x60, 30),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnims_SelectorCursor[] = {\n    sAnim_CursorSmallOpen,\n    sAnim_CursorSmallClosed,\n    sAnim_CursorLargeOpen,\n    sAnim_CursorLargeClosed\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_SelectorCursor = {\n    .tileTag = GFXTAG_SELECTOR_CURSOR,\n    .paletteTag = 0,\n    .oam = &sOamData_64x32_1,\n    .anims = sSpriteAnims_SelectorCursor,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct OamData sOamData_8x16_2 = {\n    .shape = SPRITE_SHAPE(8x16),\n    .size = SPRITE_SIZE(8x16),\n    .priority = 2\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_TextEntryCursor = {\n    .tileTag = GFXTAG_TEXT_ENTRY_CURSOR,\n    .paletteTag = 0,\n    .oam = &sOamData_8x16_2,\n    .anims = gDummySpriteAnimTable,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_TextEntryCursor\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_CharacterSelectCursor = {\n    .tileTag = GFXTAG_CHAR_SELECT_CURSOR,\n    .paletteTag = 0,\n    .oam = &sOamData_8x16_2,\n    .anims = gDummySpriteAnimTable,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCB_CharacterSelectCursor\n};\n\nstatic const struct OamData sOamData_16x16_2 = {\n    .shape = SPRITE_SHAPE(16x16),\n    .size = SPRITE_SIZE(16x16),\n    .priority = 2\n};\n\nstatic const struct OamData sOamData_32x16_2 = {\n    .shape = SPRITE_SHAPE(32x16),\n    .size = SPRITE_SIZE(32x16),\n    .priority = 2\n};\n\nstatic const union AnimCmd sAnim_UnionRoomChatIcons_ToggleCase[] = {\n    ANIMCMD_FRAME(0x00, 2),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_UnionRoomChatIcons_Dummy1[] = {\n    ANIMCMD_FRAME(0x08, 2),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_UnionRoomChatIcons_Dummy2[] = {\n    ANIMCMD_FRAME(0x10, 2),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd sAnim_UnionRoomChatIcons_Register[] = {\n    ANIMCMD_FRAME(0x18, 2),\n    ANIMCMD_END\n};\n\nstatic const union AnimCmd *const sSpriteAnimTable_UnionRoomChatIcons[] = {\n    sAnim_UnionRoomChatIcons_ToggleCase,\n    sAnim_UnionRoomChatIcons_Dummy1,\n    sAnim_UnionRoomChatIcons_Dummy2,\n    sAnim_UnionRoomChatIcons_Register\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_RButton = {\n    .tileTag = GFXTAG_R_BUTTON,\n    .paletteTag = 0,\n    .oam = &sOamData_16x16_2,\n    .anims = gDummySpriteAnimTable,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nstatic const struct SpriteTemplate sSpriteTemplate_UnionRoomChatIcons = {\n    .tileTag = GFXTAG_ICONS,\n    .paletteTag = 0,\n    .oam = &sOamData_32x16_2,\n    .anims = sSpriteAnimTable_UnionRoomChatIcons,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy\n};\n\nbool32 UnionRoomChat_TryAllocSpriteWork(void)\n{\n    int i;\n    for (i = 0; i < NELEMS(sSpriteSheets); i++)\n        LoadCompressedSpriteSheet(&sSpriteSheets[i]);\n\n    LoadSpritePalette(&sSpritePalette);\n    sWork = Alloc(sizeof(struct UnionRoomChat3));\n    if (sWork == NULL)\n        return FALSE;\n\n    return TRUE;\n}\n\nvoid UnionRoomChat_FreeSpriteWork(void)\n{\n    if (sWork != NULL)\n        Free(sWork);\n}\n\nvoid UnionRoomChat_CreateSelectorCursorObj(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_SelectorCursor, 10, 24, 0);\n    sWork->selectorCursorSprite = &gSprites[spriteId];\n}\n\nvoid UnionRoomChat_ToggleSelectorCursorObjVisibility(bool32 invisible)\n{\n    sWork->selectorCursorSprite->invisible = invisible;\n}\n\nvoid UnionRoomChat_MoveSelectorCursorObj(void)\n{\n    u8 x, y;\n    u8 page = GetCurrentKeyboardPage();\n    UnionRoomChat_GetCursorColAndRow(&x, &y);\n    if (page != UNION_ROOM_KB_PAGE_COUNT)\n    {\n        StartSpriteAnim(sWork->selectorCursorSprite, 0);\n        sWork->selectorCursorSprite->x = x * 8 + 10;\n        sWork->selectorCursorSprite->y = y * 12 + 24;\n    }\n    else\n    {\n        StartSpriteAnim(sWork->selectorCursorSprite, 2);\n        sWork->selectorCursorSprite->x = 24;\n        sWork->selectorCursorSprite->y = y * 12 + 24;\n    }\n}\n\nvoid UnionRoomChat_UpdateObjPalCycle(int arg0)\n{\n    const u16 *palette = &sUnionRoomChatInterfacePal[arg0 * 2 + 1];\n    u8 index = IndexOfSpritePaletteTag(0);\n    LoadPalette(palette, OBJ_PLTT_ID(index) + 1, PLTT_SIZEOF(2));\n}\n\nvoid UnionRoomChat_SetSelectorCursorClosedImage(void)\n{\n    if (GetCurrentKeyboardPage() != UNION_ROOM_KB_PAGE_COUNT)\n        StartSpriteAnim(sWork->selectorCursorSprite, 1);\n    else\n        StartSpriteAnim(sWork->selectorCursorSprite, 3);\n\n    sWork->cursorBlinkTimer = 0;\n}\n\nbool32 UnionRoomChat_AnimateSelectorCursorReopen(void)\n{\n    if (sWork->cursorBlinkTimer > 3)\n        return FALSE;\n\n    if (++sWork->cursorBlinkTimer > 3)\n    {\n        if (GetCurrentKeyboardPage() != UNION_ROOM_KB_PAGE_COUNT)\n            StartSpriteAnim(sWork->selectorCursorSprite, 0);\n        else\n            StartSpriteAnim(sWork->selectorCursorSprite, 2);\n\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nvoid UnionRoomChat_SpawnTextEntryPointerSprites(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_TextEntryCursor, 76, 152, 2);\n    sWork->textEntryCursorSprite = &gSprites[spriteId];\n    spriteId = CreateSprite(&sSpriteTemplate_CharacterSelectCursor, 64, 152, 1);\n    sWork->characterSelectCursorSprite = &gSprites[spriteId];\n}\n\nstatic void SpriteCB_TextEntryCursor(struct Sprite *sprite)\n{\n    int var0 = UnionRoomChat_GetMessageEntryCursorPosition();\n    if (var0 == 15)\n    {\n        sprite->invisible = TRUE;\n    }\n    else\n    {\n        sprite->invisible = FALSE;\n        sprite->x = var0 * 8 + 76;\n    }\n}\n\nstatic void SpriteCB_CharacterSelectCursor(struct Sprite *sprite)\n{\n    if (++sprite->data[0] > 4)\n    {\n        sprite->data[0] = 0;\n        if (++sprite->x2 > 4)\n            sprite->x2 = 0;\n    }\n}\n\nvoid CreatePageSwitchUISprites(void)\n{\n    u8 spriteId = CreateSprite(&sSpriteTemplate_RButton, 8, 152, 3);\n    sWork->rButtonSprite = &gSprites[spriteId];\n    spriteId = CreateSprite(&sSpriteTemplate_UnionRoomChatIcons, 32, 152, 4);\n    sWork->chatIconsSprite = &gSprites[spriteId];\n    sWork->chatIconsSprite->invisible = TRUE;\n}\n\nvoid UpdateVisibleUnionRoomChatIcon(void)\n{\n    if (GetCurrentKeyboardPage() == UNION_ROOM_KB_PAGE_COUNT)\n    {\n        if (UnionRoomChat_LenMessageEntryBuffer() != 0)\n        {\n            // REGISTER\n            sWork->chatIconsSprite->invisible = FALSE;\n            StartSpriteAnim(sWork->chatIconsSprite, 3);\n        }\n        else\n        {\n            sWork->chatIconsSprite->invisible = TRUE;\n        }\n    }\n    else\n    {\n        int anim = UnionRoomChat_GetWhetherShouldShowCaseToggleIcon();\n        if (anim == 3)\n        {\n            sWork->chatIconsSprite->invisible = TRUE;\n        }\n        else\n        {\n            // A <--> a\n            sWork->chatIconsSprite->invisible = FALSE;\n            StartSpriteAnim(sWork->chatIconsSprite, anim);\n        }\n    }\n}\n"
  },
  {
    "path": "src/union_room_message.c",
    "content": "#include \"global.h\"\n#include \"link_rfu.h\"\n#include \"mystery_gift_server.h\"\n#include \"mystery_gift_client.h\"\n#include \"constants/union_room.h\"\n\nALIGNED(4) const u8 gText_UR_EmptyString[] = _(\"\");\nALIGNED(4) const u8 gText_UR_Colon[] = _(\":\");\nALIGNED(4) const u8 gText_UR_ID[] = _(\"{ID}\");\nALIGNED(4) const u8 gText_UR_PleaseStartOver[] = _(\"Please start over from the beginning.\");\nALIGNED(4) const u8 gText_UR_WirelessSearchCanceled[] = _(\"The WIRELESS COMMUNICATION\\nSYSTEM search has been canceled.\");\nALIGNED(4) static const u8 sText_AwaitingCommunucation2[] = _(\"ともだちからの れんらくを\\nまっています\");\nALIGNED(4) const u8 gText_UR_AwaitingCommunication[] = _(\"{STR_VAR_1}! Awaiting\\ncommunication from another player.\");\nALIGNED(4) const u8 gText_UR_AwaitingLinkPressStart[] = _(\"{STR_VAR_1}! Awaiting link!\\nPress START when everyone's ready.\");\n\nALIGNED(4) static const u8 sText_SingleBattle[] = _(\"シングルバトルを かいさいする\");\nALIGNED(4) static const u8 sText_DoubleBattle[] = _(\"ダブルバトルを かいさいする\");\nALIGNED(4) static const u8 sText_MultiBattle[] = _(\"マルチバトルを かいさいする\");\nALIGNED(4) static const u8 sText_TradePokemon[] = _(\"ポケモンこうかんを かいさいする\");\nALIGNED(4) static const u8 sText_Chat[] = _(\"チャットを かいさいする\");\nALIGNED(4) static const u8 sText_DistWonderCard[] = _(\"ふしぎなカードをくばる\");\nALIGNED(4) static const u8 sText_DistWonderNews[] = _(\"ふしぎなニュースをくばる\");\nALIGNED(4) static const u8 sText_DistMysteryEvent[] = _(\"ふしぎなできごとを かいさいする\");\nALIGNED(4) static const u8 sText_HoldPokemonJump[] = _(\"なわとびを かいさいする\");\nALIGNED(4) static const u8 sText_HoldBerryCrush[] = _(\"きのみマッシャーを かいさいする\");\nALIGNED(4) static const u8 sText_HoldBerryPicking[] = _(\"きのみどりを かいさいする\");\nALIGNED(4) static const u8 sText_HoldSpinTrade[] = _(\"ぐるぐるこうかんを かいさいする\");\nALIGNED(4) static const u8 sText_HoldSpinShop[] = _(\"ぐるぐるショップを かいさいする\");\n\n// Unused\nstatic const u8 *const sLinkGroupActionTexts[] = {\n    sText_SingleBattle,\n    sText_DoubleBattle,\n    sText_MultiBattle,\n    sText_TradePokemon,\n    sText_Chat,\n    sText_DistWonderCard,\n    sText_DistWonderNews,\n    sText_DistWonderCard,\n    sText_HoldPokemonJump,\n    sText_HoldBerryCrush,\n    sText_HoldBerryPicking,\n    sText_HoldBerryPicking,\n    sText_HoldSpinTrade,\n    sText_HoldSpinShop\n};\n\nstatic const u8 sText_1PlayerNeeded[] = _(\"1 player\\nneeded.\");\nstatic const u8 sText_2PlayersNeeded[] = _(\"2 players\\nneeded.\");\nstatic const u8 sText_3PlayersNeeded[] = _(\"3 players\\nneeded.\");\nstatic const u8 sText_4PlayersNeeded[] = _(\"あと4にん\\nひつよう\");\nstatic const u8 sText_2PlayerMode[] = _(\"2-PLAYER\\nMODE\");\nstatic const u8 sText_3PlayerMode[] = _(\"3-PLAYER\\nMODE\");\nstatic const u8 sText_4PlayerMode[] = _(\"4-PLAYER\\nMODE\");\nstatic const u8 sText_5PlayerMode[] = _(\"5-PLAYER\\nMODE\");\n\nconst u8 *const gTexts_UR_PlayersNeededOrMode[][5] = {\n    { // 2 players required\n        sText_1PlayerNeeded,\n        sText_2PlayerMode\n    },\n    { // 4 players required\n        sText_3PlayersNeeded,\n        sText_2PlayersNeeded,\n        sText_1PlayerNeeded,\n        sText_4PlayerMode\n    },\n    { // 2-5 players required\n        sText_1PlayerNeeded,\n        sText_2PlayerMode,\n        sText_3PlayerMode,\n        sText_4PlayerMode,\n        sText_5PlayerMode\n    },\n    { // 3-5 players required\n        sText_2PlayersNeeded,\n        sText_1PlayerNeeded,\n        sText_3PlayerMode,\n        sText_4PlayerMode,\n        sText_5PlayerMode\n    }\n};\n\nALIGNED(4) const u8 gText_UR_BButtonCancel[] = _(\"{B_BUTTON}CANCEL\");\nALIGNED(4) static const u8 sText_SearchingForParticipants[] = _(\"ため\\nさんかしゃ ぼしゅうちゅう です！\");\nALIGNED(4) const u8 gText_UR_PlayerContactedYouForXAccept[] = _(\"{STR_VAR_2} contacted you for\\n{STR_VAR_1}. Accept?\");\nALIGNED(4) const u8 gText_UR_PlayerContactedYouShareX[] = _(\"{STR_VAR_2} contacted you.\\nWill you share {STR_VAR_1}?\");\nALIGNED(4) const u8 gText_UR_PlayerContactedYouAddToMembers[] = _(\"{STR_VAR_2} contacted you.\\nAdd to the members?\");\nALIGNED(4) const u8 gText_UR_AreTheseMembersOK[] = _(\"{STR_VAR_1}!\\nAre these members OK?\");\nALIGNED(4) const u8 gText_UR_CancelModeWithTheseMembers[] = _(\"Cancel {STR_VAR_1} MODE\\nwith these members?\");\nALIGNED(4) const u8 gText_UR_AnOKWasSentToPlayer[] = _(\"An “OK” was sent\\nto {STR_VAR_1}.\");\n\nALIGNED(4) static const u8 sText_OtherTrainerUnavailableNow[] = _(\"The other TRAINER doesn't appear\\nto be available now…\\p\");\nALIGNED(4) static const u8 sText_CantTransmitTrainerTooFar[] = _(\"You can't transmit with a TRAINER\\nwho is too far away.\\p\");\nALIGNED(4) static const u8 sText_TrainersNotReadyYet[] = _(\"The other TRAINER(S) is/are not\\nready yet.\\p\");\n\nconst u8 *const gTexts_UR_CantTransmitToTrainer[] = {\n    sText_CantTransmitTrainerTooFar,\n    sText_TrainersNotReadyYet\n};\n\nALIGNED(4) const u8 gText_UR_ModeWithTheseMembersWillBeCanceled[] = _(\"The {STR_VAR_1} MODE with\\nthese members will be canceled.{PAUSE 90}\");\nALIGNED(4) static const u8 sText_MemberNoLongerAvailable[] = _(\"There is a member who can no\\nlonger remain available.\\p\");\n\nconst u8 *const gTexts_UR_PlayerUnavailable[] = {\n    sText_OtherTrainerUnavailableNow,\n    sText_MemberNoLongerAvailable\n};\n\nALIGNED(4) static const u8 sText_TrainerAppearsUnavailable[] = _(\"The other TRAINER appears\\nunavailable…\\p\");\nALIGNED(4) const u8 gText_UR_PlayerSentBackOK[] = _(\"{STR_VAR_1} sent back an “OK”!\");\nALIGNED(4) const u8 gText_UR_PlayerOKdRegistration[] = _(\"{STR_VAR_1} OK'd your registration as\\na member.\");\nALIGNED(4) static const u8 sText_PlayerRepliedNo[] = _(\"{STR_VAR_1} replied, “No…”\\p\");\nALIGNED(4) const u8 gText_UR_AwaitingOtherMembers[] = _(\"{STR_VAR_1}!\\nAwaiting other members!\");\nALIGNED(4) const u8 gText_UR_QuitBeingMember[] = _(\"Quit being a member?\");\nALIGNED(4) static const u8 sText_StoppedBeingMember[] = _(\"You stopped being a member.\\p\");\n\nconst u8 *const gTexts_UR_PlayerDisconnected[] = {\n    [RFU_STATUS_OK]                  = NULL,\n    [RFU_STATUS_FATAL_ERROR]         = sText_MemberNoLongerAvailable,\n    [RFU_STATUS_CONNECTION_ERROR]    = sText_TrainerAppearsUnavailable,\n    [RFU_STATUS_CHILD_SEND_COMPLETE] = NULL,\n    [RFU_STATUS_NEW_CHILD_DETECTED]  = NULL,\n    [RFU_STATUS_JOIN_GROUP_OK]       = NULL,\n    [RFU_STATUS_JOIN_GROUP_NO]       = sText_PlayerRepliedNo,\n    [RFU_STATUS_WAIT_ACK_JOIN_GROUP] = NULL,\n    [RFU_STATUS_LEAVE_GROUP_NOTICE]  = NULL,\n    [RFU_STATUS_LEAVE_GROUP]         = sText_StoppedBeingMember\n};\n\nALIGNED(4) const u8 gText_UR_WirelessLinkEstablished[] = _(\"The WIRELESS COMMUNICATION\\nSYSTEM link has been established.\");\nALIGNED(4) const u8 gText_UR_WirelessLinkDropped[] = _(\"The WIRELESS COMMUNICATION\\nSYSTEM link has been dropped…\");\nALIGNED(4) const u8 gText_UR_LinkWithFriendDropped[] = _(\"The link with your friend has been\\ndropped…\");\nALIGNED(4) static const u8 sText_PlayerRepliedNo2[] = _(\"{STR_VAR_1} replied, “No…”\");\n\nconst u8 *const gTexts_UR_LinkDropped[] = {\n    [RFU_STATUS_OK]                  = NULL,\n    [RFU_STATUS_FATAL_ERROR]         = gText_UR_LinkWithFriendDropped,\n    [RFU_STATUS_CONNECTION_ERROR]    = gText_UR_LinkWithFriendDropped,\n    [RFU_STATUS_CHILD_SEND_COMPLETE] = NULL,\n    [RFU_STATUS_NEW_CHILD_DETECTED]  = NULL,\n    [RFU_STATUS_JOIN_GROUP_OK]       = NULL,\n    [RFU_STATUS_JOIN_GROUP_NO]       = sText_PlayerRepliedNo2,\n    [RFU_STATUS_WAIT_ACK_JOIN_GROUP] = NULL,\n    [RFU_STATUS_LEAVE_GROUP_NOTICE]  = NULL,\n    [RFU_STATUS_LEAVE_GROUP]         = NULL\n};\n\nALIGNED(4) static const u8 sText_DoYouWantXMode[] = _(\"Do you want the {STR_VAR_2}\\nMODE?\");\nALIGNED(4) static const u8 sText_DoYouWantXMode2[] = _(\"Do you want the {STR_VAR_2}\\nMODE?\");\n\n// Unused\nstatic const u8 *const sDoYouWantModeTexts[] = {\n    sText_DoYouWantXMode,\n    sText_DoYouWantXMode2\n};\n\nALIGNED(4) const u8 gText_UR_AwaitingPlayersResponseAboutTrade[] = _(\"Awaiting {STR_VAR_1}'s response about\\nthe trade…\");\n\nALIGNED(4) static const u8 sText_Communicating[] = _(\"Communicating{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\");\nALIGNED(4) static const u8 sText_CommunicatingWithPlayer[] = _(\"Communicating with {STR_VAR_1}{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\");\nALIGNED(4) static const u8 sText_PleaseWaitAWhile[] = _(\"Please wait a while{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\");\n\nconst u8 *const gTexts_UR_CommunicatingWait[] = {\n    sText_Communicating,\n    sText_CommunicatingWithPlayer,\n    sText_PleaseWaitAWhile\n};\n\nALIGNED(4) static const u8 sText_HiDoSomethingMale[] = _(\"Hiya! Is there something that you\\nwanted to do?\");\nALIGNED(4) static const u8 sText_HiDoSomethingFemale[] = _(\"Hello!\\nWould you like to do something?\");\nALIGNED(4) static const u8 sText_HiDoSomethingAgainMale[] = _(\"{STR_VAR_1}: Hiya, we meet again!\\nWhat are you up for this time?\");\nALIGNED(4) static const u8 sText_HiDoSomethingAgainFemale[] = _(\"{STR_VAR_1}: Oh! {PLAYER}, hello!\\nWould you like to do something?\");\n\nconst u8 *const gTexts_UR_HiDoSomething[][GENDER_COUNT] = {\n    {\n        sText_HiDoSomethingMale,\n        sText_HiDoSomethingFemale\n    }, {\n        sText_HiDoSomethingAgainMale,\n        sText_HiDoSomethingAgainFemale\n    }\n};\n\nALIGNED(4) static const u8 sText_DoSomethingMale[] = _(\"Want to do something?\");\nALIGNED(4) static const u8 sText_DoSomethingFemale[] = _(\"Would you like to do something?\");\nALIGNED(4) static const u8 sText_DoSomethingAgainMale[] = _(\"{STR_VAR_1}: What would you like to\\ndo now?\");\nALIGNED(4) static const u8 sText_DoSomethingAgainFemale[] = _(\"{STR_VAR_1}‘また なにかする？\");\n\n// Unused\nstatic const u8 *const sDoSomethingTexts[][GENDER_COUNT] = {\n    {\n        sText_DoSomethingMale,\n        sText_DoSomethingFemale\n    }, {\n        sText_DoSomethingAgainMale,\n        sText_DoSomethingAgainMale // was probably supposed to be sText_DoSomethingAgainFemale\n    }\n};\n\nALIGNED(4) static const u8 sText_SomebodyHasContactedYou[] = _(\"Somebody has contacted you.{PAUSE 60}\");\nALIGNED(4) static const u8 sText_PlayerHasContactedYou[] = _(\"{STR_VAR_1} has contacted you.{PAUSE 60}\");\n\nconst u8 *const gTexts_UR_PlayerContactedYou[] = {\n    sText_SomebodyHasContactedYou,\n    sText_PlayerHasContactedYou\n};\n\nALIGNED(4) static const u8 sText_AwaitingResponseFromTrainer[] = _(\"Awaiting a response from\\nthe other TRAINER…\");\nALIGNED(4) static const u8 sText_AwaitingResponseFromPlayer[] = _(\"Awaiting a response from\\n{STR_VAR_1}…\");\n\nconst u8 *const gTexts_UR_AwaitingResponse[] = {\n    sText_AwaitingResponseFromTrainer,\n    sText_AwaitingResponseFromPlayer\n};\n\nALIGNED(4) static const u8 sText_AwaitingResponseCancelBButton[] = _(\"あいての ていあんを まっています\\nビーボタンで キャンセル\");\n\nALIGNED(4) const u8 gText_UR_ShowTrainerCard[] = _(\"The other TRAINER showed\\nyou their TRAINER CARD.\\pWould you like to show your\\nTRAINER CARD?\");\nALIGNED(4) const u8 gText_UR_BattleChallenge[] = _(\"The other TRAINER challenges you\\nto battle.\\pWill you accept the battle\\nchallenge?\");\nALIGNED(4) const u8 gText_UR_ChatInvitation[] = _(\"The other TRAINER invites you\\nto chat.\\pWill you accept the chat\\ninvitation?\");\nALIGNED(4) const u8 gText_UR_OfferToTradeMon[] = _(\"There is an offer to trade your\\nregistered Lv. {DYNAMIC 0} {DYNAMIC 1}\\pin exchange for a\\nLv. {DYNAMIC 2} {DYNAMIC 3}.\\pWill you accept this trade\\noffer?\");\nALIGNED(4) const u8 gText_UR_OfferToTradeEgg[] = _(\"There is an offer to trade your\\nregistered EGG.\\lWill you accept this trade offer?\");\nALIGNED(4) const u8 gText_UR_ChatDropped[] = _(\"The chat has been dropped.\\p\");\nALIGNED(4) const u8 gText_UR_OfferDeclined1[] = _(\"You declined the offer.\\p\");\nALIGNED(4) const u8 gText_UR_OfferDeclined2[] = _(\"You declined the offer.\\p\");\nALIGNED(4) const u8 gText_UR_ChatEnded[] = _(\"The chat was ended.\\p\");\n\n// Unused\nstatic const u8 *const sInvitationTexts[] = {\n    gText_UR_ShowTrainerCard,\n    gText_UR_BattleChallenge,\n    gText_UR_ChatInvitation,\n    gText_UR_OfferToTradeMon\n};\n\nALIGNED(4) static const u8 sText_JoinChatMale[] = _(\"Oh, hey! We're in a chat right now.\\nWant to join us?\");\nALIGNED(4) static const u8 sText_PlayerJoinChatMale[] = _(\"{STR_VAR_1}: Hey, {PLAYER}!\\nWe're having a chat right now.\\lWant to join us?\");\nALIGNED(4) static const u8 sText_JoinChatFemale[] = _(\"Oh, hi! We're having a chat now.\\nWould you like to join us?\");\nALIGNED(4) static const u8 sText_PlayerJoinChatFemale[] = _(\"{STR_VAR_1}: Oh, hi, {PLAYER}!\\nWe're having a chat now.\\lWould you like to join us?\");\n\nconst u8 *const gTexts_UR_JoinChat[][GENDER_COUNT] = {\n    {\n        sText_JoinChatMale,\n        sText_JoinChatFemale\n    }, {\n        sText_PlayerJoinChatMale,\n        sText_PlayerJoinChatFemale\n    }\n};\n\nALIGNED(4) const u8 gText_UR_TrainerAppearsBusy[] = _(\"……\\nThe TRAINER appears to be busy…\\p\");\nALIGNED(4) static const u8 sText_WaitForBattleMale[] = _(\"A battle, huh?\\nAll right, just give me some time.\");\nALIGNED(4) static const u8 sText_WaitForChatMale[] = _(\"You want to chat, huh?\\nSure, just wait a little.\");\nALIGNED(4) static const u8 sText_ShowTrainerCardMale[] = _(\"Sure thing! As my “Greetings,”\\nhere's my TRAINER CARD.\");\nALIGNED(4) static const u8 sText_WaitForBattleFemale[] = _(\"A battle? Of course, but I need\\ntime to get ready.\");\nALIGNED(4) static const u8 sText_WaitForChatFemale[] = _(\"Did you want to chat?\\nOkay, but please wait a moment.\");\nALIGNED(4) static const u8 sText_ShowTrainerCardFemale[] = _(\"As my introduction, I'll show you\\nmy TRAINER CARD.\");\n\nconst u8 *const gTexts_UR_WaitOrShowCard[GENDER_COUNT][4] = {\n    {\n        sText_WaitForBattleMale,\n        sText_WaitForChatMale,\n        NULL,\n        sText_ShowTrainerCardMale\n    }, {\n        sText_WaitForBattleFemale,\n        sText_WaitForChatFemale,\n        NULL,\n        sText_ShowTrainerCardFemale\n    }\n};\n\nALIGNED(4) static const u8 sText_WaitForChatMale2[] = _(\"チャットだね！\\nわかった ちょっと まってて！\");\nALIGNED(4) static const u8 sText_DoneWaitingBattleMale[] = _(\"Thanks for waiting!\\nLet's get our battle started!{PAUSE 60}\");\nALIGNED(4) static const u8 sText_DoneWaitingChatMale[] = _(\"All right!\\nLet's chat!{PAUSE 60}\");\nALIGNED(4) static const u8 sText_DoneWaitingBattleFemale[] = _(\"Sorry I made you wait!\\nLet's get started!{PAUSE 60}\");\nALIGNED(4) static const u8 sText_DoneWaitingChatFemale[] = _(\"Sorry I made you wait!\\nLet's chat.{PAUSE 60}\");\nALIGNED(4) static const u8 sText_TradeWillBeStarted[] = _(\"The trade will be started.{PAUSE 60}\");\nALIGNED(4) static const u8 sText_BattleWillBeStarted[] = _(\"The battle will be started.{PAUSE 60}\");\nALIGNED(4) static const u8 sText_EnteringChat[] = _(\"Entering the chat…{PAUSE 60}\");\n\nconst u8 *const gTexts_UR_StartActivity[][GENDER_COUNT][3] = {\n    {\n        {\n            sText_BattleWillBeStarted,\n            sText_EnteringChat,\n            sText_TradeWillBeStarted\n        }, {\n            sText_BattleWillBeStarted,\n            sText_EnteringChat,\n            sText_TradeWillBeStarted\n        }\n    }, {\n        {\n            sText_DoneWaitingBattleMale,\n            sText_DoneWaitingChatMale,\n            sText_TradeWillBeStarted\n        }, {\n            sText_DoneWaitingBattleFemale,\n            sText_DoneWaitingChatFemale,\n            sText_TradeWillBeStarted\n        }\n    }\n};\n\nALIGNED(4) static const u8 sText_BattleDeclinedMale[] = _(\"Sorry! My POKéMON don't seem to\\nbe feeling too well right now.\\lLet me battle you another time.\\p\");\nALIGNED(4) static const u8 sText_BattleDeclinedFemale[] = _(\"I'm terribly sorry, but my POKéMON\\naren't feeling well…\\pLet's battle another time.\\p\");\n\nconst u8 *const gTexts_UR_BattleDeclined[GENDER_COUNT] = {\n    sText_BattleDeclinedMale,\n    sText_BattleDeclinedFemale\n};\n\nALIGNED(4) static const u8 sText_ShowTrainerCardDeclinedMale[] = _(\"Huh? My TRAINER CARD…\\nWhere'd it go now?\\lSorry! I'll show you another time!\\p\");\nALIGNED(4) static const u8 sText_ShowTrainerCardDeclinedFemale[] = _(\"Oh? Now where did I put my\\nTRAINER CARD?…\\lSorry! I'll show you later!\\p\");\n\nconst u8 *const gTexts_UR_ShowTrainerCardDeclined[GENDER_COUNT] = {\n    sText_ShowTrainerCardDeclinedMale,\n    sText_ShowTrainerCardDeclinedFemale\n};\n\nALIGNED(4) static const u8 sText_IfYouWantToDoSomethingMale[] = _(\"If you want to do something with\\nme, just give me a shout!\\p\");\nALIGNED(4) static const u8 sText_IfYouWantToDoSomethingFemale[] = _(\"If you want to do something with\\nme, don't be shy.\\p\");\n\nconst u8 *const gTexts_UR_IfYouWantToDoSomething[GENDER_COUNT] = {\n    sText_IfYouWantToDoSomethingMale,\n    sText_IfYouWantToDoSomethingFemale\n};\n\nALIGNED(4) const u8 gText_UR_TrainerBattleBusy[] = _(\"Whoops! Sorry, but I have to do\\nsomething else.\\lAnother time, okay?\\p\");\nALIGNED(4) const u8 gText_UR_NeedTwoMonsOfLevel30OrLower1[] = _(\"If you want to battle, you need\\ntwo POKéMON that are below\\lLv. 30.\\p\");\nALIGNED(4) const u8 gText_UR_NeedTwoMonsOfLevel30OrLower2[] = _(\"For a battle, you need two\\nPOKéMON that are below Lv. 30.\\p\");\n\nALIGNED(4) static const u8 sText_DeclineChatMale[] = _(\"Oh, all right.\\nCome see me anytime, okay?\\p\");\nALIGNED(4) static const u8 stext_DeclineChatFemale[] = _(\"Oh…\\nPlease come by anytime.\\p\");\n\n// Response from partner when player declines chat\nconst u8 *const gTexts_UR_DeclineChat[GENDER_COUNT] = {\n    sText_DeclineChatMale,\n    stext_DeclineChatFemale\n};\n\nALIGNED(4) static const u8 sText_ChatDeclinedMale[] = _(\"Oh, sorry!\\nI just can't right this instant.\\lLet's chat another time.\\p\");\nALIGNED(4) static const u8 sText_ChatDeclinedFemale[] = _(\"Oh, I'm sorry.\\nI have too much to do right now.\\lLet's chat some other time.\\p\");\n\n// Response from partner when they decline chat\nconst u8 *const gTexts_UR_ChatDeclined[GENDER_COUNT] = {\n    sText_ChatDeclinedMale,\n    sText_ChatDeclinedFemale\n};\n\nALIGNED(4) static const u8 sText_YoureToughMale[] = _(\"Whoa!\\nI can tell you're pretty tough!\\p\");\nALIGNED(4) static const u8 sText_UsedGoodMoveMale[] = _(\"You used that move?\\nThat's good strategy!\\p\");\nALIGNED(4) static const u8 sText_BattleSurpriseMale[] = _(\"Way to go!\\nThat was an eye-opener!\\p\");\nALIGNED(4) static const u8 sText_SwitchedMonsMale[] = _(\"Oh! How could you use that\\nPOKéMON in that situation?\\p\");\nALIGNED(4) static const u8 sText_YoureToughFemale[] = _(\"That POKéMON…\\nIt's been raised really well!\\p\");\nALIGNED(4) static const u8 sText_UsedGoodMoveFemale[] = _(\"That's it!\\nThis is the right move now!\\p\");\nALIGNED(4) static const u8 sText_BattleSurpriseFemale[] = _(\"That's awesome!\\nYou can battle that way?\\p\");\nALIGNED(4) static const u8 sText_SwitchedMonsFemale[] = _(\"You have exquisite timing for\\nswitching POKéMON!\\p\");\n\nconst u8 *const gTexts_UR_BattleReaction[GENDER_COUNT][4] = {\n    {\n        sText_YoureToughMale,\n        sText_UsedGoodMoveMale,\n        sText_BattleSurpriseMale,\n        sText_SwitchedMonsMale\n    }, {\n        sText_YoureToughFemale,\n        sText_UsedGoodMoveFemale,\n        sText_BattleSurpriseFemale,\n        sText_SwitchedMonsFemale\n    }\n};\n\nALIGNED(4) static const u8 sText_LearnedSomethingMale[] = _(\"Oh, I see!\\nThis is educational!\\p\");\nALIGNED(4) static const u8 sText_ThatsFunnyMale[] = _(\"Don't say anything funny anymore!\\nI'm sore from laughing!\\p\");\nALIGNED(4) static const u8 sText_RandomChatMale1[] = _(\"Oh?\\nSomething like that happened.\\p\");\nALIGNED(4) static const u8 sText_RandomChatMale2[] = _(\"Hmhm… What?\\nSo is this what you're saying?\\p\");\nALIGNED(4) static const u8 sText_LearnedSomethingFemale[] = _(\"Is that right?\\nI didn't know that.\\p\");\nALIGNED(4) static const u8 sText_ThatsFunnyFemale[] = _(\"Ahaha!\\nWhat is that about?\\p\");\nALIGNED(4) static const u8 sText_RandomChatFemale1[] = _(\"Yes, that's exactly it!\\nThat's what I meant.\\p\");\nALIGNED(4) static const u8 sText_RandomChatFemale2[] = _(\"In other words…\\nYes! That's right!\\p\");\n\nconst u8 *const gTexts_UR_ChatReaction[GENDER_COUNT][4] = {\n    {\n        sText_LearnedSomethingMale,\n        sText_ThatsFunnyMale,\n        sText_RandomChatMale1,\n        sText_RandomChatMale2\n    }, {\n        sText_LearnedSomethingFemale,\n        sText_ThatsFunnyFemale,\n        sText_RandomChatFemale1,\n        sText_RandomChatFemale2\n    }\n};\n\nALIGNED(4) static const u8 sText_ShowedTrainerCardMale1[] = _(\"I'm just showing my TRAINER CARD\\nas my way of greeting.\\p\");\nALIGNED(4) static const u8 sText_ShowedTrainerCardMale2[] = _(\"I hope I get to know you better!\\p\");\nALIGNED(4) static const u8 sText_ShowedTrainerCardFemale1[] = _(\"We're showing each other our\\nTRAINER CARDS to get acquainted.\\p\");\nALIGNED(4) static const u8 sText_ShowedTrainerCardFemale2[] = _(\"Glad to meet you.\\nPlease don't be a stranger!\\p\");\n\nconst u8 *const gTexts_UR_TrainerCardReaction[GENDER_COUNT][2] = {\n    {\n        sText_ShowedTrainerCardMale1,\n        sText_ShowedTrainerCardMale2\n    }, {\n        sText_ShowedTrainerCardFemale1,\n        sText_ShowedTrainerCardFemale2\n    }\n};\n\nALIGNED(4) static const u8 sText_MaleTraded1[] = _(\"Yeahah!\\nI really wanted this POKéMON!\\p\");\nALIGNED(4) static const u8 sText_MaleTraded2[] = _(\"Finally, a trade got me that\\nPOKéMON I'd wanted a long time.\\p\");\nALIGNED(4) static const u8 sText_FemaleTraded1[] = _(\"I'm trading POKéMON right now.\\p\");\nALIGNED(4) static const u8 sText_FemaleTraded2[] = _(\"I finally got that POKéMON I\\nwanted in a trade!\\p\");\n\nconst u8 *const gTexts_UR_TradeReaction[GENDER_COUNT][4] = {\n    {\n        sText_MaleTraded1,\n        sText_MaleTraded2\n    }, {\n        sText_FemaleTraded1,\n        sText_FemaleTraded2\n    }\n};\n\nconst u8 gText_UR_XCheckedTradingBoard[] = _(\"{STR_VAR_1} checked the\\nTRADING BOARD.\\p\");\nALIGNED(4) const u8 gText_UR_RegisterMonAtTradingBoard[] = _(\"Welcome to the TRADING BOARD.\\pYou may register your POKéMON\\nand offer it up for a trade.\\pWould you like to register one of\\nyour POKéMON?\");\nALIGNED(4) const u8 gText_UR_TradingBoardInfo[] = _(\"This TRADING BOARD is used for\\n\"\n                                                    \"offering a POKéMON for a trade.\\p\"\n                                                    \"All you need to do is register a\\n\"\n                                                    \"POKéMON for a trade.\\p\"\n                                                    \"Another TRAINER may offer a party\\n\"\n                                                    \"POKéMON in return for the trade.\\p\"\n                                                    \"We hope you will register POKéMON\\n\"\n                                                    \"and trade them with many, many\\l\"\n                                                    \"other TRAINERS.\\p\"\n                                                    \"Would you like to register one of\\n\"\n                                                    \"your POKéMON?\");\nALIGNED(4) static const u8 sText_ThankYouForRegistering[] = _(\"こうかんけいじばん の とうろくが\\nかんりょう しました\\pごりよう ありがとう\\nございました！\\p\");\nALIGNED(4) static const u8 sText_NobodyHasRegistered[] = _(\"けいじばんに だれも ポケモンを\\nとうろく していません\\p\\n\");\nALIGNED(4) const u8 gText_UR_ChooseRequestedMonType[] = _(\"Please choose the type of POKéMON\\nthat you would like in the trade.\\n\");\nALIGNED(4) const u8 gText_UR_WhichMonWillYouOffer[] = _(\"Which of your party POKéMON will\\nyou offer in trade?\\p\");\nALIGNED(4) const u8 gText_UR_RegistrationCanceled[] = _(\"Registration has been canceled.\\p\");\nALIGNED(4) const u8 gText_UR_RegistraionCompleted[] = _(\"Registration has been completed.\\p\");\nALIGNED(4) const u8 gText_UR_TradeCanceled[] = _(\"The trade has been canceled.\\p\");\nALIGNED(4) const u8 gText_UR_CancelRegistrationOfMon[] = _(\"Cancel the registration of your\\nLv. {STR_VAR_2} {STR_VAR_1}?\");\nALIGNED(4) const u8 gText_UR_CancelRegistrationOfEgg[] = _(\"Cancel the registration of your\\nEGG?\");\nALIGNED(4) const u8 gText_UR_RegistrationCanceled2[] = _(\"The registration has been canceled.\\p\");\nALIGNED(4) static const u8 sText_TradeTrainersWillBeListed[] = _(\"こうかんを きぼうしているひとを\\nひょうじします\");\nALIGNED(4) static const u8 sText_ChooseTrainerToTradeWith2[] = _(\"こうかん したい トレーナーを\\nえらんで ください\");\nALIGNED(4) const u8 gText_UR_AskTrainerToMakeTrade[] = _(\"Would you like to ask {STR_VAR_1} to\\nmake a trade?\");\nALIGNED(4) static const u8 sText_AwaitingResponseFromTrainer2[] = _(\"……\\nあいての へんじを まっています\");\nALIGNED(4) static const u8 sText_NotRegisteredAMonForTrade[] = _(\"あなたが こうかんにだす\\nポケモンが とうろくされていません\\p\");\nALIGNED(4) const u8 gText_UR_DontHaveTypeTrainerWants[] = _(\"You don't have a {STR_VAR_2}-type\\nPOKéMON that {STR_VAR_1} wants.\\p\");\nALIGNED(4) const u8 gText_UR_DontHaveEggTrainerWants[] = _(\"You don't have an EGG that\\n{STR_VAR_1} wants.\\p\");\n\nALIGNED(4) static const u8 sText_PlayerCantTradeForYourMon[] = _(\"{STR_VAR_1} can't make a trade for\\nyour POKéMON right now.\\p\");\nALIGNED(4) static const u8 sText_CantTradeForPartnersMon[] = _(\"You can't make a trade for\\n{STR_VAR_1}'s POKéMON right now.\\p\");\n\n// Unused\nstatic const u8 *const sCantTradeMonTexts[] = {\n    sText_PlayerCantTradeForYourMon,\n    sText_CantTradeForPartnersMon\n};\n\nALIGNED(4) const u8 gText_UR_TradeOfferRejected[] = _(\"Your trade offer was rejected.\\p\");\nALIGNED(4) const u8 gText_UR_EggTrade[] = _(\"EGG TRADE\");\nALIGNED(4) const u8 gText_UR_ChooseJoinCancel[] = _(\"{DPAD_UPDOWN}CHOOSE  {A_BUTTON}JOIN  {B_BUTTON}CANCEL\");\nALIGNED(4) const u8 gText_UR_ChooseTrainer[] = _(\"Please choose a TRAINER.\");\nALIGNED(4) static const u8 sText_ChooseTrainerSingleBattle[] = _(\"Please choose a TRAINER for\\na SINGLE BATTLE.\");\nALIGNED(4) static const u8 sText_ChooseTrainerDoubleBattle[] = _(\"Please choose a TRAINER for\\na DOUBLE BATTLE.\");\nALIGNED(4) static const u8 sText_ChooseLeaderMultiBattle[] = _(\"Please choose the LEADER\\nfor a MULTI BATTLE.\");\nALIGNED(4) static const u8 sText_ChooseTrainerToTradeWith[] = _(\"Please choose the TRAINER to\\ntrade with.\");\nALIGNED(4) static const u8 sText_ChooseTrainerToShareWonderCards[] = _(\"Please choose the TRAINER who is\\nsharing WONDER CARDS.\");\nALIGNED(4) static const u8 sText_ChooseTrainerToShareWonderNews[] = _(\"Please choose the TRAINER who is\\nsharing WONDER NEWS.\");\nALIGNED(4) static const u8 sText_ChooseLeaderPokemonJump[] = _(\"Jump with mini POKéMON!\\nPlease choose the LEADER.\");\nALIGNED(4) static const u8 sText_ChooseLeaderBerryCrush[] = _(\"BERRY CRUSH!\\nPlease choose the LEADER.\");\nALIGNED(4) static const u8 sText_ChooseLeaderBerryPicking[] = _(\"DODRIO BERRY-PICKING!\\nPlease choose the LEADER.\");\n\nconst u8 *const gTexts_UR_ChooseTrainer[] = {\n    [LINK_GROUP_SINGLE_BATTLE] = sText_ChooseTrainerSingleBattle,\n    [LINK_GROUP_DOUBLE_BATTLE] = sText_ChooseTrainerDoubleBattle,\n    [LINK_GROUP_MULTI_BATTLE]  = sText_ChooseLeaderMultiBattle,\n    [LINK_GROUP_TRADE]         = sText_ChooseTrainerToTradeWith,\n    [LINK_GROUP_POKEMON_JUMP]  = sText_ChooseLeaderPokemonJump,\n    [LINK_GROUP_BERRY_CRUSH]   = sText_ChooseLeaderBerryCrush,\n    [LINK_GROUP_BERRY_PICKING] = sText_ChooseLeaderBerryPicking,\n    [LINK_GROUP_WONDER_CARD]   = sText_ChooseTrainerToShareWonderCards,\n    [LINK_GROUP_WONDER_NEWS]   = sText_ChooseTrainerToShareWonderNews\n};\n\nALIGNED(4) const u8 gText_UR_SearchingForWirelessSystemWait[] = _(\"Searching for a WIRELESS\\nCOMMUNICATION SYSTEM. Wait...\");\nALIGNED(4) static const u8 sText_MustHaveTwoMonsForDoubleBattle[] = _(\"ダブルバトルでは 2ひき いじょうの\\nポケモンが ひつようです\\p\");\nALIGNED(4) const u8 gText_UR_AwaitingPlayersResponse[] = _(\"Awaiting {STR_VAR_1}'s response…\");\nALIGNED(4) const u8 gText_UR_PlayerHasBeenAskedToRegisterYouPleaseWait[] = _(\"{STR_VAR_1} has been asked to register\\nyou as a member. Please wait.\");\nALIGNED(4) const u8 gText_UR_AwaitingResponseFromWirelessSystem[] = _(\"Awaiting a response from the\\nWIRELESS COMMUNICATION SYSTEM.\");\nALIGNED(4) static const u8 sText_PleaseWaitForOtherTrainersToGather[] = _(\"ほかの さんかしゃが そろうまで\\nしょうしょう おまちください\");\n\nALIGNED(4) static const u8 sText_NoCardsSharedRightNow[] = _(\"No CARDS appear to be shared \\nright now.\");\nALIGNED(4) static const u8 sText_NoNewsSharedRightNow[] = _(\"No NEWS appears to be shared\\nright now.\");\n\nconst u8 *const gTexts_UR_NoWonderShared[] = {\n    sText_NoCardsSharedRightNow,\n    sText_NoNewsSharedRightNow\n};\n\nALIGNED(4) const u8 gText_UR_Battle[] = _(\"BATTLE\");\nALIGNED(4) const u8 gText_UR_Chat2[] = _(\"CHAT\");\nALIGNED(4) const u8 gText_UR_Greetings[] = _(\"GREETINGS\");\nALIGNED(4) const u8 gText_UR_Exit[] = _(\"EXIT\");\n\nALIGNED(4) const u8 gText_UR_Exit2[] = _(\"EXIT\");\nALIGNED(4) const u8 gText_UR_Info[] = _(\"INFO\");\nALIGNED(4) const u8 gText_UR_NameWantedOfferLv[] = _(\"NAME{CLEAR_TO 0x3C}WANTED{CLEAR_TO 0x6E}OFFER{CLEAR_TO 0xC6}LV.\");\n\nALIGNED(4) const u8 gText_UR_SingleBattle[] = _(\"SINGLE BATTLE\");\nALIGNED(4) const u8 gText_UR_DoubleBattle[] = _(\"DOUBLE BATTLE\");\nALIGNED(4) const u8 gText_UR_MultiBattle[] = _(\"MULTI BATTLE\");\nALIGNED(4) const u8 gText_UR_PokemonTrades[] = _(\"POKéMON TRADES\");\nALIGNED(4) const u8 gText_UR_Chat[] = _(\"CHAT\");\nALIGNED(4) const u8 gText_UR_Cards[] = _(\"CARDS\");\nALIGNED(4) const u8 gText_UR_WonderCards[] = _(\"WONDER CARDS\");\nALIGNED(4) const u8 gText_UR_WonderNews[] = _(\"WONDER NEWS\");\nALIGNED(4) const u8 gText_UR_PokemonJump[] = _(\"POKéMON JUMP\");\nALIGNED(4) const u8 gText_UR_BerryCrush[] = _(\"BERRY CRUSH\");\nALIGNED(4) const u8 gText_UR_BerryPicking[] = _(\"BERRY-PICKING\");\nALIGNED(4) const u8 gText_UR_Search[] = _(\"SEARCH\");\nALIGNED(4) const u8 gText_UR_SpinTrade[] = _(\"ぐるぐるこうかん\");\nALIGNED(4) const u8 gText_UR_ItemTrade[] = _(\"アイテムトレード\");\n\nALIGNED(4) static const u8 sText_ItsNormalCard[] = _(\"It's a NORMAL CARD.\");\nALIGNED(4) static const u8 sText_ItsBronzeCard[] = _(\"It's a BRONZE CARD!\");\nALIGNED(4) static const u8 sText_ItsCopperCard[] = _(\"It's a COPPER CARD!\");\nALIGNED(4) static const u8 sText_ItsSilverCard[] = _(\"It's a SILVER CARD!\");\nALIGNED(4) static const u8 sText_ItsGoldCard[] = _(\"It's a GOLD CARD!\");\n\nconst u8 *const gTexts_UR_CardColor[] = {\n    sText_ItsNormalCard,\n    sText_ItsBronzeCard,\n    sText_ItsCopperCard,\n    sText_ItsSilverCard,\n    sText_ItsGoldCard\n};\n\nALIGNED(4) const u8 gText_UR_TrainerCardInfoPage1[] = _(\"This is {DYNAMIC 0} {DYNAMIC 1}'s\\nTRAINER CARD…\\l{DYNAMIC 2}\\pPOKéDEX: {DYNAMIC 3}\\nTIME:    {DYNAMIC 4}:{DYNAMIC 5}\\p\");\nALIGNED(4) const u8 gText_UR_TrainerCardInfoPage2[] = _(\"BATTLES: {DYNAMIC 0} WINS  {DYNAMIC 2} LOSSES\\nTRADES:  {DYNAMIC 3} TIMES\\p“{DYNAMIC 4} {DYNAMIC 5}\\n{DYNAMIC 6} {DYNAMIC 7}”\\p\");\nALIGNED(4) static const u8 sText_GladToMeetYouMale[] = _(\"{DYNAMIC 1}: Glad to have met you!{PAUSE 60}\");\nALIGNED(4) static const u8 sText_GladToMeetYouFemale[] = _(\"{DYNAMIC 1}: Glad to meet you!{PAUSE 60}\");\n\nconst u8 *const gTexts_UR_GladToMeetYou[GENDER_COUNT] = {\n    sText_GladToMeetYouMale,\n    sText_GladToMeetYouFemale\n};\n\nALIGNED(4) const u8 gText_UR_FinishedCheckingPlayersTrainerCard[] = _(\"Finished checking {DYNAMIC 1}'s\\nTRAINER CARD.{PAUSE 60}\");\nALIGNED(4) static const u8 sText_CanceledReadingCard[] = _(\"Canceled reading the Card.\");\n\nstatic const struct MysteryGiftClientCmd sClientScript_DynamicError[] = {\n    {CLI_RECV, MG_LINKID_DYNAMIC_MSG},\n    {CLI_COPY_MSG},\n    {CLI_SEND_READY_END},\n    {CLI_RETURN, CLI_MSG_BUFFER_FAILURE}\n};\n\nconst struct MysteryGiftServerCmd gServerScript_ClientCanceledCard[] = {\n    {SVR_LOAD_CLIENT_SCRIPT, PTR_ARG(sClientScript_DynamicError)},\n    {SVR_SEND},\n    {SVR_LOAD_MSG, PTR_ARG(sText_CanceledReadingCard)},\n    {SVR_SEND},\n    {SVR_RECV, MG_LINKID_READY_END},\n    {SVR_RETURN, SVR_MSG_CLIENT_CANCELED}\n};\n"
  },
  {
    "path": "src/union_room_player_avatar.c",
    "content": "#include \"global.h\"\n#include \"event_data.h\"\n#include \"event_object_movement.h\"\n#include \"field_player_avatar.h\"\n#include \"fieldmap.h\"\n#include \"union_room_player_avatar.h\"\n#include \"script.h\"\n#include \"task.h\"\n#include \"constants/event_object_movement.h\"\n#include \"constants/union_room.h\"\n#include \"constants/event_objects.h\"\n\n#define UR_SPRITE_START_ID (MAX_SPRITES - MAX_UNION_ROOM_LEADERS)\n\n// Each parent player can lead a group of up to MAX_RFU_PLAYERS (including themselves).\n// Multiply the leader's id by MAX_RFU_PLAYERS and add the member's id (0 if the leader) to\n// get the sprite index of that player.\n#define UR_PLAYER_SPRITE_ID(leaderId, memberId)(MAX_RFU_PLAYERS * leaderId + memberId)\n\n// Original symbol name from ASSERT statements\n#define UnionObjWork sUnionObjWork\n\nstatic EWRAM_DATA struct UnionRoomObject * sUnionObjWork = NULL;\nstatic EWRAM_DATA u32 sUnionObjRefreshTimer = 0;\n\nstatic u8 CreateTask_AnimateUnionRoomPlayers(void);\nstatic u32 IsUnionRoomPlayerInvisible(u32 leaderId, u32 member);\nstatic void SetUnionRoomObjectFacingDirection(s32 member, s32 leaderId, u8 direction);\n\n// + 2 is just to match, those elements are empty and never read\n// Graphics ids should correspond with the classes in gUnionRoomFacilityClasses\nstatic const u8 sUnionRoomObjGfxIds[GENDER_COUNT][NUM_UNION_ROOM_CLASSES + 2] = {\n    [MALE]   = {\n        OBJ_EVENT_GFX_COOLTRAINER_M,\n        OBJ_EVENT_GFX_BLACKBELT,\n        OBJ_EVENT_GFX_CAMPER,\n        OBJ_EVENT_GFX_YOUNGSTER,\n        OBJ_EVENT_GFX_BOY,\n        OBJ_EVENT_GFX_BUG_CATCHER,\n        OBJ_EVENT_GFX_MAN,\n        OBJ_EVENT_GFX_ROCKER\n    },\n    [FEMALE] = {\n        OBJ_EVENT_GFX_COOLTRAINER_F,\n        OBJ_EVENT_GFX_CHANNELER,\n        OBJ_EVENT_GFX_PICNICKER,\n        OBJ_EVENT_GFX_LASS,\n        OBJ_EVENT_GFX_WOMAN_1,\n        OBJ_EVENT_GFX_BATTLE_GIRL,\n        OBJ_EVENT_GFX_WOMAN_2,\n        OBJ_EVENT_GFX_BEAUTY\n    }\n};\n\nstatic const s16 sUnionRoomPlayerCoords[MAX_UNION_ROOM_LEADERS][2] = {\n    { 4,  6},\n    {13,  8},\n    {10,  6},\n    { 1,  8},\n    {13,  4},\n    { 7,  4},\n    { 1,  4},\n    { 7,  8}\n};\n\n// If there's a group of players interacting in the Union Room, the group\n// leader will be at one of the positions above and each member in the group\n// will be at one of the offsets from that position below. The leader will\n// be at the first offset (0,0), as they're at the center.\nstatic const s8 sUnionRoomGroupOffsets[][2] = {\n    { 0,  0}, // Center\n    { 1,  0}, // Left\n    { 0, -1}, // Top\n    {-1,  0}, // Right\n    { 0,  1}  // Bottom\n};\n\nstatic const u8 sOppositeFacingDirection[] = {\n    [DIR_NONE]  = DIR_NONE,\n    [DIR_SOUTH] = DIR_NORTH,\n    [DIR_NORTH] = DIR_SOUTH,\n    [DIR_WEST]  = DIR_EAST,\n    [DIR_EAST]  = DIR_WEST\n};\n\n// Compare to sUnionRoomGroupOffsets, the direction each group member\n// needs to be facing in order to face the group leader in the center.\nstatic const u8 sMemberFacingDirections[] = {\n    DIR_SOUTH, // Leader, but never read\n    DIR_WEST,\n    DIR_SOUTH,\n    DIR_EAST,\n    DIR_NORTH\n};\n\nstatic const u8 sUnionRoomLocalIds[] = {\n    LOCALID_UNION_ROOM_PLAYER_1,\n    LOCALID_UNION_ROOM_PLAYER_2,\n    LOCALID_UNION_ROOM_PLAYER_3,\n    LOCALID_UNION_ROOM_PLAYER_4,\n    LOCALID_UNION_ROOM_PLAYER_5,\n    LOCALID_UNION_ROOM_PLAYER_6,\n    LOCALID_UNION_ROOM_PLAYER_7,\n    LOCALID_UNION_ROOM_PLAYER_8\n};\n\n// Unused\nstatic const u16 sHidePlayerFlags[] = {\n    FLAG_HIDE_UNION_ROOM_PLAYER_1,\n    FLAG_HIDE_UNION_ROOM_PLAYER_2,\n    FLAG_HIDE_UNION_ROOM_PLAYER_3,\n    FLAG_HIDE_UNION_ROOM_PLAYER_4,\n    FLAG_HIDE_UNION_ROOM_PLAYER_5,\n    FLAG_HIDE_UNION_ROOM_PLAYER_6,\n    FLAG_HIDE_UNION_ROOM_PLAYER_7,\n    FLAG_HIDE_UNION_ROOM_PLAYER_8\n};\n\nstatic bool32 IsPlayerStandingStill(void)\n{\n    if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING)\n        return TRUE;\n    else\n        return FALSE;\n}\n\n// Gender and trainer id are used to determine which sprite a player appears as\nstatic u8 GetUnionRoomPlayerGraphicsId(u32 gender, u32 id)\n{\n    return sUnionRoomObjGfxIds[gender][id % NUM_UNION_ROOM_CLASSES];\n}\n\nstatic void GetUnionRoomPlayerCoords(u32 leaderId, u32 memberId, s32 * x, s32 * y)\n{\n    *x = sUnionRoomPlayerCoords[leaderId][0] + sUnionRoomGroupOffsets[memberId][0] + 7;\n    *y = sUnionRoomPlayerCoords[leaderId][1] + sUnionRoomGroupOffsets[memberId][1] + 7;\n}\n\nstatic bool32 IsUnionRoomPlayerAt(u32 leaderId, u32 memberId, s32 x, s32 y)\n{\n    if ((sUnionRoomPlayerCoords[leaderId][0] + sUnionRoomGroupOffsets[memberId][0] + MAP_OFFSET == x)\n     && (sUnionRoomPlayerCoords[leaderId][1] + sUnionRoomGroupOffsets[memberId][1] + MAP_OFFSET == y))\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic bool32 IsUnionRoomPlayerHidden(u32 leaderId)\n{\n    return FlagGet(FLAG_HIDE_UNION_ROOM_PLAYER_1 + leaderId);\n}\n\nstatic void HideUnionRoomPlayer(u32 leaderId)\n{\n    FlagSet(FLAG_HIDE_UNION_ROOM_PLAYER_1 + leaderId);\n}\n\nstatic void ShowUnionRoomPlayer(u32 leaderId)\n{\n    FlagClear(FLAG_HIDE_UNION_ROOM_PLAYER_1 + leaderId);\n}\n\nstatic void SetUnionRoomPlayerGfx(u32 leaderId, u32 gfxId)\n{\n    VarSet(VAR_OBJ_GFX_ID_0 + leaderId, gfxId);\n}\n\nstatic void CreateUnionRoomPlayerObjectEvent(u32 leaderId)\n{\n    TrySpawnObjectEvent(sUnionRoomLocalIds[leaderId], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);\n}\n\nstatic void RemoveUnionRoomPlayerObjectEvent(u32 leaderId)\n{\n    RemoveObjectEventByLocalIdAndMap(sUnionRoomLocalIds[leaderId], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);\n}\n\nstatic bool32 SetUnionRoomPlayerEnterExitMovement(u32 leaderId, const u8 * movement)\n{\n    u8 objectId;\n    struct ObjectEvent * object;\n    if (TryGetObjectEventIdByLocalIdAndMap(sUnionRoomLocalIds[leaderId], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectId))\n        return FALSE;\n    object = &gObjectEvents[objectId];\n    if (ObjectEventIsMovementOverridden(object))\n        return FALSE;\n    if (ObjectEventSetHeldMovement(object, *movement))\n    {\n        AGB_ASSERT_EX(0, ABSPATH(\"rfu_union_tool.c\"), 387);\n        return FALSE;\n    }\n    return TRUE;\n}\n\nstatic bool32 TryReleaseUnionRoomPlayerObjectEvent(u32 leaderId)\n{\n    u8 objectId;\n    struct ObjectEvent * object;\n    if (TryGetObjectEventIdByLocalIdAndMap(sUnionRoomLocalIds[leaderId], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectId))\n        return TRUE;\n\n    object = &gObjectEvents[objectId];\n    if (!ObjectEventClearHeldMovementIfFinished(object))\n        return FALSE;\n\n    if (!ArePlayerFieldControlsLocked())\n        UnfreezeObjectEvent(object);\n    else\n        FreezeObjectEvent(object);\n    return TRUE;\n}\n\nu8 InitUnionRoomPlayerObjects(struct UnionRoomObject * players)\n{\n    s32 i;\n\n    sUnionObjRefreshTimer = 0;\n    sUnionObjWork = players;\n    AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH(\"rfu_union_tool.c\"), 442)\n    for (i = 0; i < MAX_UNION_ROOM_LEADERS; i++)\n    {\n        players[i].state = 0;\n        players[i].gfxId = 0;\n        players[i].animState = 0;\n        players[i].schedAnim = UNION_ROOM_SPAWN_NONE;\n    }\n    return CreateTask_AnimateUnionRoomPlayers();\n}\n\nstatic const u8 sMovement_UnionPlayerExit[2] = {\n    MOVEMENT_ACTION_FLY_UP,\n    MOVEMENT_ACTION_STEP_END\n};\n\nstatic bool32 AnimateUnionRoomPlayerDespawn(s8 * state, u32 leaderId, struct UnionRoomObject * object)\n{\n    switch (*state)\n    {\n    case 0:\n        if (SetUnionRoomPlayerEnterExitMovement(leaderId, sMovement_UnionPlayerExit) == TRUE)\n        {\n            HideUnionRoomPlayer(leaderId);\n            (*state)++;\n        }\n        break;\n    case 1:\n        if (TryReleaseUnionRoomPlayerObjectEvent(leaderId))\n        {\n            RemoveUnionRoomPlayerObjectEvent(leaderId);\n            HideUnionRoomPlayer(leaderId);\n            *state = 0;\n            return TRUE;\n        }\n        break;\n    }\n    return FALSE;\n}\n\nstatic const u8 sMovement_UnionPlayerEnter[2] = {\n    MOVEMENT_ACTION_FLY_DOWN,\n    MOVEMENT_ACTION_STEP_END\n};\n\nstatic bool32 AnimateUnionRoomPlayerSpawn(s8 * state, u32 leaderId, struct UnionRoomObject * object)\n{\n    s16 x, y;\n\n    switch (*state)\n    {\n    case 0:\n        if (!IsPlayerStandingStill())\n            break;\n        PlayerGetDestCoords(&x, &y);\n        if (IsUnionRoomPlayerAt(leaderId, 0, x, y) == TRUE)\n            break;\n        player_get_pos_including_state_based_drift(&x, &y);\n        if (IsUnionRoomPlayerAt(leaderId, 0, x, y) == TRUE)\n            break;\n        SetUnionRoomPlayerGfx(leaderId, object->gfxId);\n        CreateUnionRoomPlayerObjectEvent(leaderId);\n        ShowUnionRoomPlayer(leaderId);\n        (*state)++;\n        // fallthrough\n    case 3: // incorrect?\n        if (SetUnionRoomPlayerEnterExitMovement(leaderId, sMovement_UnionPlayerEnter) == 1)\n            (*state)++;\n        break;\n    case 2:\n        if (TryReleaseUnionRoomPlayerObjectEvent(leaderId))\n        {\n            *state = 0;\n            return TRUE;\n        }\n        break;\n    }\n    return FALSE;\n}\n\nstatic bool32 SpawnGroupLeader(u32 leaderId, u32 gender, u32 id)\n{\n    struct UnionRoomObject * object = &sUnionObjWork[leaderId];\n    AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH(\"rfu_union_tool.c\"), 561)\n    object->schedAnim = UNION_ROOM_SPAWN_IN;\n    object->gfxId = GetUnionRoomPlayerGraphicsId(gender, id);\n\n    if (object->state == 0)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic bool32 DespawnGroupLeader(u32 leaderId)\n{\n    struct UnionRoomObject * object = &sUnionObjWork[leaderId];\n    AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH(\"rfu_union_tool.c\"), 577)\n    object->schedAnim = UNION_ROOM_SPAWN_OUT;\n\n    if (object->state == 1)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nstatic void AnimateUnionRoomPlayer(u32 leaderId, struct UnionRoomObject * object)\n{\n    switch (object->state)\n    {\n    case 0:\n        if (object->schedAnim == UNION_ROOM_SPAWN_IN)\n        {\n            object->state = 2;\n            object->animState = 0;\n        }\n        else\n        {\n            break;\n        }\n        // fallthrough\n    case 2:\n        if (!IsUnionRoomPlayerInvisible(leaderId, 0) && object->schedAnim == UNION_ROOM_SPAWN_OUT)\n        {\n            object->state = 0;\n            object->animState = 0;\n            RemoveUnionRoomPlayerObjectEvent(leaderId);\n            HideUnionRoomPlayer(leaderId);\n        }\n        else if (AnimateUnionRoomPlayerSpawn(&object->animState, leaderId, object) == TRUE)\n        {\n            object->state = 1;\n        }\n        break;\n    case 1:\n        if (object->schedAnim != UNION_ROOM_SPAWN_OUT)\n            break;\n        object->state = 3;\n        object->animState = 0;\n        // fallthrough\n    case 3:\n        if (AnimateUnionRoomPlayerDespawn(&object->animState, leaderId, object) == TRUE)\n            object->state = 0;\n        break;\n    }\n    object->schedAnim = UNION_ROOM_SPAWN_NONE;\n}\n\nstatic void Task_AnimateUnionRoomPlayers(u8 taskId)\n{\n    s32 i;\n    AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH(\"rfu_union_tool.c\"), 643)\n    for (i = 0; i < MAX_UNION_ROOM_LEADERS; i++)\n        AnimateUnionRoomPlayer(i, &sUnionObjWork[i]);\n}\n\nstatic u8 CreateTask_AnimateUnionRoomPlayers(void)\n{\n    if (FuncIsActiveTask(Task_AnimateUnionRoomPlayers) == TRUE)\n    {\n        AGB_ASSERT_EX(0, ABSPATH(\"rfu_union_tool.c\"), 655)\n        return NUM_TASKS;\n    }\n    else\n    {\n        return CreateTask(Task_AnimateUnionRoomPlayers, 5);\n    }\n}\n\nstatic void DestroyTask_AnimateUnionRoomPlayers(void)\n{\n    u8 taskId = FindTaskIdByFunc(Task_AnimateUnionRoomPlayers);\n    if (taskId < NUM_TASKS)\n        DestroyTask(taskId);\n}\n\nvoid DestroyUnionRoomPlayerObjects(void)\n{\n    s32 i;\n    for (i = 0; i < MAX_UNION_ROOM_LEADERS; i++)\n    {\n        if (!IsUnionRoomPlayerHidden(i))\n        {\n            RemoveUnionRoomPlayerObjectEvent(i);\n            HideUnionRoomPlayer(i);\n        }\n    }\n    sUnionObjWork = NULL;\n    DestroyTask_AnimateUnionRoomPlayers();\n}\n\nvoid CreateUnionRoomPlayerSprites(u8 * spriteIds, s32 leaderId)\n{\n    s32 memberId;\n\n    for (memberId = 0; memberId < MAX_RFU_PLAYERS; memberId++)\n    {\n        s32 id = UR_PLAYER_SPRITE_ID(leaderId, memberId);\n        spriteIds[id] = CreateVirtualObject(OBJ_EVENT_GFX_MAN,\n                                                 id - UR_SPRITE_START_ID,\n                                                 sUnionRoomPlayerCoords[leaderId][0] + sUnionRoomGroupOffsets[memberId][0],\n                                                 sUnionRoomPlayerCoords[leaderId][1] + sUnionRoomGroupOffsets[memberId][1],\n                                                 3, 1);\n        SetVirtualObjectInvisibility(id - UR_SPRITE_START_ID, TRUE);\n    }\n}\n\nvoid DestroyUnionRoomPlayerSprites(u8 *spriteIds)\n{\n    s32 i;\n    for (i = 0; i < NUM_UNION_ROOM_SPRITES; i++)\n        DestroySprite(&gSprites[spriteIds[i]]);\n}\n\n// Clear the impassable metatiles around the group leaders that get set\n// to prevent the player from walking through the group member sprites.\nvoid MakeGroupAssemblyAreasPassable(void)\n{\n    s32 leaderId, memberId, x, y;\n    for (leaderId = 0; leaderId < MAX_UNION_ROOM_LEADERS; leaderId++)\n    {\n        for (memberId = 0; memberId < MAX_RFU_PLAYERS; memberId++)\n        {\n            GetUnionRoomPlayerCoords(leaderId, memberId, &x, &y);\n            MapGridSetMetatileImpassabilityAt(x, y, FALSE);\n        }\n    }\n}\n\nstatic u8 GetNewFacingDirectionForUnionRoomPlayer(u32 memberId, u32 leaderId, struct RfuGameData * gameData)\n{\n    if (memberId != 0) // If not leader\n        return sMemberFacingDirections[memberId];\n    else if (gameData->activity == (ACTIVITY_CHAT | IN_UNION_ROOM))\n        return DIR_SOUTH;\n    else\n        return DIR_EAST;\n}\n\nstatic u32 IsUnionRoomPlayerInvisible(u32 leaderId, u32 memberId)\n{\n    return IsVirtualObjectInvisible(UR_PLAYER_SPRITE_ID(leaderId, memberId) - UR_SPRITE_START_ID);\n}\n\nstatic void SpawnGroupMember(u32 leaderId, u32 memberId, u8 graphicsId, struct RfuGameData * gameData)\n{\n    s32 x, y;\n    s32 id = UR_PLAYER_SPRITE_ID(leaderId, memberId);\n    if (IsUnionRoomPlayerInvisible(leaderId, memberId) == TRUE)\n    {\n        SetVirtualObjectInvisibility(id - UR_SPRITE_START_ID, FALSE);\n        SetVirtualObjectSpriteAnim(id - UR_SPRITE_START_ID, UNION_ROOM_SPAWN_IN);\n    }\n    SetVirtualObjectGraphics(id - UR_SPRITE_START_ID, graphicsId);\n    SetUnionRoomObjectFacingDirection(memberId, leaderId, GetNewFacingDirectionForUnionRoomPlayer(memberId, leaderId, gameData));\n    GetUnionRoomPlayerCoords(leaderId, memberId, &x, &y);\n    MapGridSetMetatileImpassabilityAt(x, y, TRUE);\n}\n\nstatic void DespawnGroupMember(u32 leaderId, u32 memberId)\n{\n    s32 x, y;\n    SetVirtualObjectSpriteAnim(UR_PLAYER_SPRITE_ID(leaderId, memberId) - UR_SPRITE_START_ID, UNION_ROOM_SPAWN_OUT);\n    GetUnionRoomPlayerCoords(leaderId, memberId, &x, &y);\n    MapGridSetMetatileImpassabilityAt(x, y, FALSE);\n}\n\nstatic void AssembleGroup(u32 leaderId, struct RfuGameData * gameData)\n{\n    s16 x, y, x2, y2;\n    s32 i;\n\n    PlayerGetDestCoords(&x, &y);\n    player_get_pos_including_state_based_drift(&x2, &y2);\n    if (IsVirtualObjectInvisible(UR_PLAYER_SPRITE_ID(leaderId, 0) - UR_SPRITE_START_ID) == TRUE)\n    {\n        if (IsUnionRoomPlayerAt(leaderId, 0, x, y) == TRUE || IsUnionRoomPlayerAt(leaderId, 0, x2, y2) == TRUE)\n            return;\n        SpawnGroupMember(leaderId, 0, GetUnionRoomPlayerGraphicsId(gameData->playerGender, gameData->compatibility.playerTrainerId[0]), gameData);\n    }\n    for (i = 1; i < MAX_RFU_PLAYERS; i++)\n    {\n        if (gameData->partnerInfo[i - 1] == 0)\n            DespawnGroupMember(leaderId, i);\n        else if (IsUnionRoomPlayerAt(leaderId, i, x, y) == FALSE && IsUnionRoomPlayerAt(leaderId, i, x2, y2) == FALSE)\n            SpawnGroupMember(leaderId, i, GetUnionRoomPlayerGraphicsId((gameData->partnerInfo[i - 1] >> PINFO_GENDER_SHIFT) & 1,\n                                                                        gameData->partnerInfo[i - 1] & PINFO_TID_MASK),\n                                                                        gameData);\n    }\n}\n\nstatic void SpawnGroupLeaderAndMembers(u32 leaderId, struct RfuGameData * gameData)\n{\n    u32 i;\n    switch (gameData->activity)\n    {\n    case ACTIVITY_NONE | IN_UNION_ROOM:\n    case ACTIVITY_PLYRTALK | IN_UNION_ROOM:\n        SpawnGroupLeader(leaderId, gameData->playerGender, gameData->compatibility.playerTrainerId[0]);\n        for (i = 0; i < MAX_RFU_PLAYERS; i++)\n            DespawnGroupMember(leaderId, i);\n        break;\n    case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM:\n    case ACTIVITY_TRADE | IN_UNION_ROOM:\n    case ACTIVITY_CHAT | IN_UNION_ROOM:\n    case ACTIVITY_CARD | IN_UNION_ROOM:\n    case ACTIVITY_ACCEPT | IN_UNION_ROOM:\n    case ACTIVITY_DECLINE | IN_UNION_ROOM:\n    case ACTIVITY_NPCTALK | IN_UNION_ROOM:\n        DespawnGroupLeader(leaderId);\n        AssembleGroup(leaderId, gameData);\n        break;\n    default:\n        AGB_ASSERT_EX(0, ABSPATH(\"rfu_union_tool.c\"), 979)\n    }\n}\n\nstatic void DespawnGroupLeaderAndMembers(u32 leaderId, struct RfuGameData * gameData)\n{\n    s32 i;\n    DespawnGroupLeader(leaderId);\n    for (i = 0; i < MAX_RFU_PLAYERS; i++)\n        DespawnGroupMember(leaderId, i);\n}\n\nstatic void UpdateUnionRoomPlayerSprites(struct WirelessLink_URoom * uroom)\n{\n    s32 i;\n    struct RfuPlayer * leaders;\n    sUnionObjRefreshTimer = 0;\n    for (i = 0, leaders = uroom->playerList->players; i < MAX_UNION_ROOM_LEADERS; i++)\n    {\n        if (leaders[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)\n            SpawnGroupLeaderAndMembers(i, &leaders[i].rfu.data);\n        else if (leaders[i].groupScheduledAnim == UNION_ROOM_SPAWN_OUT)\n            DespawnGroupLeaderAndMembers(i, &leaders[i].rfu.data);\n    }\n}\n\nvoid ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom)\n{\n    sUnionObjRefreshTimer = 300;\n}\n\nvoid HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom)\n{\n    if (++sUnionObjRefreshTimer > 300)\n        UpdateUnionRoomPlayerSprites(uroom);\n}\n\nbool32 TryInteractWithUnionRoomMember(struct RfuPlayerList *list, s16 *memberIdPtr, s16 *leaderIdPtr, u8 *spriteIds)\n{\n    s16 x, y;\n    s32 leaderId, memberId;\n    struct RfuPlayer * leaders;\n    if (!IsPlayerStandingStill())\n        return FALSE;\n\n    GetXYCoordsOneStepInFrontOfPlayer(&x, &y);\n    for (leaderId = 0, leaders = list->players; leaderId < MAX_UNION_ROOM_LEADERS; leaderId++)\n    {\n        for (memberId = 0; memberId < MAX_RFU_PLAYERS; memberId++)\n        {\n            s32 objId = UR_PLAYER_SPRITE_ID(leaderId, memberId);\n\n            // Is the player in front of a group member position?\n            if (x != sUnionRoomPlayerCoords[leaderId][0] + sUnionRoomGroupOffsets[memberId][0] + 7)\n                continue;\n            if (y != sUnionRoomPlayerCoords[leaderId][1] + sUnionRoomGroupOffsets[memberId][1] + 7)\n                continue;\n\n            // Has a group member spawned at this position?\n            if (IsVirtualObjectInvisible(objId - UR_SPRITE_START_ID) != FALSE)\n                continue;\n            if (IsVirtualObjectAnimating(objId - UR_SPRITE_START_ID) != FALSE)\n                continue;\n            if (leaders[leaderId].groupScheduledAnim != UNION_ROOM_SPAWN_IN)\n                continue;\n\n            // Interaction attempt successful, face player\n            SetUnionRoomObjectFacingDirection(memberId, leaderId, sOppositeFacingDirection[GetPlayerFacingDirection()]);\n            *memberIdPtr = memberId;\n            *leaderIdPtr = leaderId;\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nstatic void SetUnionRoomObjectFacingDirection(s32 memberId, s32 leaderId, u8 direction)\n{\n    TurnVirtualObject(MAX_RFU_PLAYERS * leaderId - UR_SPRITE_START_ID + memberId, direction);\n}\n\nvoid UpdateUnionRoomMemberFacing(u32 memberId, u32 leaderId, struct RfuPlayerList *list)\n{\n    return SetUnionRoomObjectFacingDirection(memberId, leaderId, GetNewFacingDirectionForUnionRoomPlayer(memberId, leaderId, &list->players[leaderId].rfu.data));\n}\n"
  },
  {
    "path": "src/util.c",
    "content": "#include \"global.h\"\n\nconst u32 gBitTable[] =\n{\n    1 << 0,\n    1 << 1,\n    1 << 2,\n    1 << 3,\n    1 << 4,\n    1 << 5,\n    1 << 6,\n    1 << 7,\n    1 << 8,\n    1 << 9,\n    1 << 10,\n    1 << 11,\n    1 << 12,\n    1 << 13,\n    1 << 14,\n    1 << 15,\n    1 << 16,\n    1 << 17,\n    1 << 18,\n    1 << 19,\n    1 << 20,\n    1 << 21,\n    1 << 22,\n    1 << 23,\n    1 << 24,\n    1 << 25,\n    1 << 26,\n    1 << 27,\n    1 << 28,\n    1 << 29,\n    1 << 30,\n    1 << 31,\n};\n\nstatic const struct SpriteTemplate gInvisibleSpriteTemplate =\n{\n    .tileTag = 0,\n    .paletteTag = 0,\n    .oam = &gDummyOamData,\n    .anims = gDummySpriteAnimTable,\n    .images = NULL,\n    .affineAnims = gDummySpriteAffineAnimTable,\n    .callback = SpriteCallbackDummy,\n};\n\nstatic const u8 sSpriteDimensions[3][4][2] =\n{\n    // square\n    {\n        {1, 1},\n        {2, 2},\n        {4, 4},\n        {8, 8},\n    },\n\n    // horizontal rectangle\n    {\n        {2, 1},\n        {4, 1},\n        {4, 2},\n        {8, 4},\n    },\n\n    // vertical rectangle\n    {\n        {1, 2},\n        {1, 4},\n        {2, 4},\n        {4, 8},\n    },\n};\n\nstatic const u16 gCrc16Table[] =\n{\n    0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,\n    0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,\n    0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,\n    0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,\n    0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,\n    0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,\n    0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,\n    0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,\n    0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,\n    0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,\n    0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,\n    0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,\n    0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,\n    0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,\n    0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,\n    0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,\n    0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,\n    0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,\n    0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,\n    0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,\n    0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,\n    0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,\n    0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,\n    0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,\n    0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,\n    0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,\n    0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,\n    0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,\n    0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,\n    0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,\n    0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,\n    0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78,\n};\n\nconst u8 gMiscBlank_Gfx[] = INCBIN_U8(\"graphics/interface/blank.4bpp\");\n\nu8 CreateInvisibleSpriteWithCallback(void (*callback)(struct Sprite *))\n{\n    u8 sprite = CreateSprite(&gInvisibleSpriteTemplate, 248, 168, 14);\n    gSprites[sprite].invisible = TRUE;\n    gSprites[sprite].callback = callback;\n    return sprite;\n}\n\nvoid StoreWordInTwoHalfwords(u16 *h, unsigned w)\n{\n    h[0] = (u16)(w);\n    h[1] = (u16)(w >> 16);\n}\n\nvoid LoadWordFromTwoHalfwords(u16 *h, unsigned *w)\n{\n    *w = h[0] | (s16)h[1] << 16;\n}\n\nvoid SetBgAffineStruct(struct BgAffineSrcData *src, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha)\n{\n    src->texX = texX;\n    src->texY = texY;\n    src->scrX = scrX;\n    src->scrY = scrY;\n    src->sx = sx;\n    src->sy = sy;\n    src->alpha = alpha;\n}\n\nvoid DoBgAffineSet(struct BgAffineDstData *dest, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha)\n{\n    struct BgAffineSrcData src;\n\n    SetBgAffineStruct(&src, texX, texY, scrX, scrY, sx, sy, alpha);\n    BgAffineSet(&src, dest, 1);\n}\n\nvoid CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)\n{\n    u8 x, y;\n    s8 i, j;\n    u8 xflip[32];\n    u8 h = sSpriteDimensions[shape][size][1];\n    u8 w = sSpriteDimensions[shape][size][0];\n\n    for (y = 0; y < h; y++)\n    {\n        int filler = 32 - w;\n\n        for (x = 0; x < w; x++)\n        {\n            u16 tile = (*tilemap & 0x3ff) * 32;\n            int attr = *tilemap & 0xc00;\n\n            if (attr == 0)\n            {\n                DmaCopy32Defvars(3, tiles + tile, output, 32);\n            }\n            else if (attr == 0x800)  // yflip\n            {\n                for (i = 0; i < 8; i++)\n                {\n                    u8 requiredForMatching = 0;\n\n                    ++requiredForMatching;\n                    --requiredForMatching;\n                    DmaCopy32Defvars(3, tile + (7 - i) * 4 + tiles, output + i * 4, 4);\n                }\n            }\n            else  // xflip\n            {\n                for (i = 0; i < 8; i++)\n                {\n                    for (j = 0; j < 4; j++)\n                    {\n                        u8 i2 = i * 4;\n                        xflip[i2 + (3 - j)] = (tiles[tile + i2 + j] & 0xf) << 4;\n                        xflip[i2 + (3 - j)] |= tiles[tile + i2 + j] >> 4;\n                    }\n                }\n                if (*tilemap & 0x800)  // yflip\n                {\n                    for (i = 0; i < 8; i++)\n                    {\n                        ++tile;\n                        --tile;\n                        DmaCopy32Defvars(3, (7 - i) * 4 + xflip, output + i * 4, 4);\n                    }\n                }\n                else\n                {\n                    DmaCopy32Defvars(3, xflip, output, 32);\n                }\n            }\n            tilemap++;\n            output += 32;\n        }\n        tilemap += filler;\n    }\n}\n\nint CountTrailingZeroBits(u32 value)\n{\n    u32 i;\n\n    for (i = 0; i < 32; i++)\n    {\n        if ((value & 1) == 0)\n            value >>= 1;\n        else\n            return i;\n    }\n    return 0;\n}\n\nu16 CalcCRC16(const u8 *data, u32 length)\n{\n    u16 i, j;\n    u16 crc = 0x1121;\n\n    for (i = 0; i < length; i++)\n    {\n        crc ^= data[i];\n        for (j = 0; j < 8; j++)\n        {\n            if (crc & 1)\n                crc = (crc >> 1) ^ 0x8408;\n            else\n                crc >>= 1;\n        }\n    }\n    return ~crc;\n}\n\nu16 CalcCRC16WithTable(const u8 *data, u32 length)\n{\n    u32 i;\n    u16 crc = 0x1121;\n    u8 byte;\n\n    for (i = 0; i < length; i++)\n    {\n        byte = crc >> 8;\n        crc ^= data[i];\n        crc = byte ^ gCrc16Table[(u8)crc];\n    }\n    return ~crc;\n}\n\nu32 CalcByteArraySum(const u8 * array, u32 size)\n{\n    s32 i;\n    u32 result = 0;\n\n    for (i = 0; i < size; i++)\n    {\n        result += array[i];\n    }\n\n    return result;\n}\n"
  },
  {
    "path": "src/vs_seeker.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"constants/songs.h\"\n#include \"task.h\"\n#include \"event_object_movement.h\"\n#include \"new_menu_helpers.h\"\n#include \"item_use.h\"\n#include \"event_scripts.h\"\n#include \"event_data.h\"\n#include \"script.h\"\n#include \"event_object_lock.h\"\n#include \"field_specials.h\"\n#include \"item.h\"\n#include \"item_menu.h\"\n#include \"field_effect.h\"\n#include \"script_movement.h\"\n#include \"battle.h\"\n#include \"battle_setup.h\"\n#include \"random.h\"\n#include \"field_player_avatar.h\"\n#include \"vs_seeker.h\"\n#include \"constants/event_object_movement.h\"\n#include \"constants/event_objects.h\"\n#include \"constants/maps.h\"\n#include \"constants/items.h\"\n#include \"constants/quest_log.h\"\n#include \"constants/trainer_types.h\"\n\n// Each trainer can have up to 6 parties, including their original party.\n// Each rematch is unavailable until the player has progressed to a certain point in the story (see TryGetRematchTrainerIdGivenGameState).\n// A list of the trainer ids for each party is in sRematches. If a party doesn't update for a progression point it will have SKIP instead,\n// and that trainer id will be ignored.\n#define MAX_REMATCH_PARTIES 6\n#define SKIP 0xFFFF\n\nenum\n{\n   VSSEEKER_NOT_CHARGED,\n   VSSEEKER_NO_ONE_IN_RANGE,\n   VSSEEKER_CAN_USE,\n};\n\ntypedef enum\n{\n    VSSEEKER_SINGLE_RESP_RAND,\n    VSSEEKER_SINGLE_RESP_NO,\n    VSSEEKER_SINGLE_RESP_YES\n} VsSeekerSingleRespCode;\n\ntypedef enum\n{\n    VSSEEKER_RESPONSE_NO_RESPONSE,\n    VSSEEKER_RESPONSE_UNFOUGHT_TRAINERS,\n    VSSEEKER_RESPONSE_FOUND_REMATCHES\n} VsSeekerResponseCode;\n\nstruct RematchData\n{\n    u16 trainerIdxs[MAX_REMATCH_PARTIES];\n    u16 mapGroup; // unused\n    u16 mapNum; // unused\n};\n\nstruct VsSeekerTrainerInfo\n{\n    const u8 *script;\n    u16 trainerIdx;\n    u8 localId;\n    u8 objectEventId;\n    s16 xCoord;\n    s16 yCoord;\n    u8 graphicsId;\n};\n\nstruct VsSeekerStruct\n{\n    /*0x000*/ struct VsSeekerTrainerInfo trainerInfo[OBJECT_EVENTS_COUNT];\n    /*0x100*/ u8 filler_100[0x300];\n    /*0x400*/ u16 trainerIdxArray[OBJECT_EVENTS_COUNT];\n    /*0x420*/ u8 runningBehaviourEtcArray[OBJECT_EVENTS_COUNT];\n    /*0x430*/ u8 numRematchableTrainers;\n    /*0x431*/ u8 trainerHasNotYetBeenFought:1;\n    /*0x431*/ u8 trainerDoesNotWantRematch:1;\n    /*0x431*/ u8 trainerWantsRematch:1;\n    u8 responseCode:5;\n};\n\n// static declarations\nstatic EWRAM_DATA struct VsSeekerStruct *sVsSeeker = NULL;\n\nstatic void VsSeekerResetInBagStepCounter(void);\nstatic void VsSeekerResetChargingStepCounter(void);\nstatic void Task_ResetObjectsRematchWantedState(u8 taskId);\nstatic void ResetMovementOfRematchableTrainers(void);\nstatic void Task_VsSeeker_1(u8 taskId);\nstatic void Task_VsSeeker_2(u8 taskId);\nstatic void GatherNearbyTrainerInfo(void);\nstatic void Task_VsSeeker_3(u8 taskId);\nstatic bool8 CanUseVsSeeker(void);\nstatic u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData);\nstatic u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchIdx);\nstatic u8 ShouldTryRematchBattleInternal(const struct RematchData * vsSeekerData, u16 trainerBattleOpponent);\nstatic u8 HasRematchTrainerAlreadyBeenFought(const struct RematchData * vsSeekerData, u16 trainerBattleOpponent);\nstatic int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 trainerId);\nstatic bool8 IsTrainerReadyForRematchInternal(const struct RematchData * array, u16 trainerIdx);\nstatic u8 GetRunningBehaviorFromGraphicsId(u8 graphicsId);\nstatic u16 GetTrainerFlagFromScript(const u8 * script);\nstatic int GetRematchIdx(const struct RematchData * vsSeekerData, u16 trainerFlagIdx);\nstatic bool32 IsThisTrainerRematchable(u32 localId);\nstatic void ClearAllTrainerRematchStates(void);\nstatic bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo);\nstatic u8 GetNextAvailableRematchTrainer(const struct RematchData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr);\nstatic u8 GetRematchableTrainerLocalId(void);\nstatic void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script);\nstatic u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx);\nstatic void StartAllRespondantIdleMovements(void);\nstatic bool8 ObjectEventIdIsSane(u8 objectEventId);\nstatic u8 GetRandomFaceDirectionMovementType();\n\nstatic const struct RematchData sRematches[] = {\n   { {TRAINER_YOUNGSTER_BEN, TRAINER_YOUNGSTER_BEN_2, SKIP, TRAINER_YOUNGSTER_BEN_3, TRAINER_YOUNGSTER_BEN_4}, MAP(ROUTE3) },\n   { {TRAINER_YOUNGSTER_CALVIN, TRAINER_YOUNGSTER_CALVIN}, MAP(ROUTE3) },\n   { {TRAINER_BUG_CATCHER_COLTON, TRAINER_BUG_CATCHER_COLTON_2, SKIP, TRAINER_BUG_CATCHER_COLTON_3, SKIP, TRAINER_BUG_CATCHER_COLTON_4},\n      MAP(ROUTE3) },\n   { {TRAINER_BUG_CATCHER_GREG, TRAINER_BUG_CATCHER_GREG},\n      MAP(ROUTE3) },\n   { {TRAINER_BUG_CATCHER_JAMES, TRAINER_BUG_CATCHER_JAMES},\n      MAP(ROUTE3) },\n   { {TRAINER_LASS_JANICE, TRAINER_LASS_JANICE_2, SKIP, TRAINER_LASS_JANICE_3},\n      MAP(ROUTE3) },\n   { {TRAINER_LASS_SALLY, TRAINER_LASS_SALLY},\n      MAP(ROUTE3) },\n   { {TRAINER_LASS_ROBIN, TRAINER_LASS_ROBIN},\n      MAP(ROUTE3) },\n   { {TRAINER_LASS_CRISSY, TRAINER_LASS_CRISSY},\n      MAP(ROUTE4) },\n   { {TRAINER_YOUNGSTER_TIMMY, TRAINER_YOUNGSTER_TIMMY_2, SKIP, TRAINER_YOUNGSTER_TIMMY_3, SKIP, TRAINER_YOUNGSTER_TIMMY_4},\n      MAP(ROUTE24) },\n   { {TRAINER_BUG_CATCHER_CALE, TRAINER_BUG_CATCHER_CALE},\n      MAP(ROUTE24) },\n   { {TRAINER_LASS_RELI, TRAINER_LASS_RELI_2, SKIP, TRAINER_LASS_RELI_3},\n      MAP(ROUTE24) },\n   { {TRAINER_LASS_ALI, TRAINER_LASS_ALI},\n      MAP(ROUTE24) },\n   { {TRAINER_CAMPER_SHANE, TRAINER_CAMPER_SHANE},\n      MAP(ROUTE24) },\n   { {TRAINER_CAMPER_ETHAN, TRAINER_CAMPER_ETHAN},\n      MAP(ROUTE24) },\n   { {TRAINER_YOUNGSTER_JOEY, TRAINER_YOUNGSTER_JOEY},\n      MAP(ROUTE25) },\n   { {TRAINER_YOUNGSTER_DAN, TRAINER_YOUNGSTER_DAN},\n      MAP(ROUTE25) },\n   { {TRAINER_YOUNGSTER_CHAD, TRAINER_YOUNGSTER_CHAD_2, SKIP, TRAINER_YOUNGSTER_CHAD_3, TRAINER_YOUNGSTER_CHAD_4},\n      MAP(ROUTE25) },\n   { {TRAINER_PICNICKER_KELSEY, TRAINER_PICNICKER_KELSEY_2, SKIP, TRAINER_PICNICKER_KELSEY_3, TRAINER_PICNICKER_KELSEY_4},\n      MAP(ROUTE25) },\n   { {TRAINER_LASS_HALEY, TRAINER_LASS_HALEY},\n      MAP(ROUTE25) },\n   { {TRAINER_HIKER_FRANKLIN, SKIP, TRAINER_HIKER_FRANKLIN_2},\n      MAP(ROUTE25) },\n   { {TRAINER_HIKER_NOB, TRAINER_HIKER_NOB},\n      MAP(ROUTE25) },\n   { {TRAINER_HIKER_WAYNE, TRAINER_HIKER_WAYNE},\n      MAP(ROUTE25) },\n   { {TRAINER_CAMPER_FLINT, TRAINER_CAMPER_FLINT},\n      MAP(ROUTE25) },\n   { {TRAINER_BUG_CATCHER_KEIGO, TRAINER_BUG_CATCHER_KEIGO},\n      MAP(ROUTE6) },\n   { {TRAINER_BUG_CATCHER_ELIJAH, TRAINER_BUG_CATCHER_ELIJAH},\n      MAP(ROUTE6) },\n   { {TRAINER_CAMPER_RICKY, TRAINER_CAMPER_RICKY_2, SKIP, TRAINER_CAMPER_RICKY_3, SKIP, TRAINER_CAMPER_RICKY_4},\n      MAP(ROUTE6) },\n   { {TRAINER_CAMPER_JEFF, TRAINER_CAMPER_JEFF_2, SKIP, TRAINER_CAMPER_JEFF_3, SKIP, TRAINER_CAMPER_JEFF_4},\n      MAP(ROUTE6) },\n   { {TRAINER_PICNICKER_NANCY, TRAINER_PICNICKER_NANCY},\n      MAP(ROUTE6) },\n   { {TRAINER_PICNICKER_ISABELLE, TRAINER_PICNICKER_ISABELLE_2, SKIP, TRAINER_PICNICKER_ISABELLE_3, TRAINER_PICNICKER_ISABELLE_4},\n      MAP(ROUTE6) },\n   { {TRAINER_YOUNGSTER_EDDIE, TRAINER_YOUNGSTER_EDDIE},\n      MAP(ROUTE11) },\n   { {TRAINER_YOUNGSTER_DILLON, TRAINER_YOUNGSTER_DILLON},\n      MAP(ROUTE11) },\n   { {TRAINER_YOUNGSTER_YASU, SKIP, TRAINER_YOUNGSTER_YASU_2, SKIP, TRAINER_YOUNGSTER_YASU_3},\n      MAP(ROUTE11) },\n   { {TRAINER_YOUNGSTER_DAVE, TRAINER_YOUNGSTER_DAVE},\n      MAP(ROUTE11) },\n   { {TRAINER_ENGINEER_BRAXTON, TRAINER_ENGINEER_BRAXTON},\n      MAP(ROUTE11) },\n   { {TRAINER_ENGINEER_BERNIE, SKIP, SKIP, TRAINER_ENGINEER_BERNIE_2},\n      MAP(ROUTE11) },\n   { {TRAINER_GAMER_HUGO, TRAINER_GAMER_HUGO},\n      MAP(ROUTE11) },\n   { {TRAINER_GAMER_JASPER, TRAINER_GAMER_JASPER},\n      MAP(ROUTE11) },\n   { {TRAINER_GAMER_DIRK, TRAINER_GAMER_DIRK},\n      MAP(ROUTE11) },\n   { {TRAINER_GAMER_DARIAN, SKIP, SKIP, TRAINER_GAMER_DARIAN_2},\n      MAP(ROUTE11) },\n   { {TRAINER_BUG_CATCHER_BRENT, TRAINER_BUG_CATCHER_BRENT},\n      MAP(ROUTE9) },\n   { {TRAINER_BUG_CATCHER_CONNER, TRAINER_BUG_CATCHER_CONNER},\n      MAP(ROUTE9) },\n   { {TRAINER_CAMPER_CHRIS, SKIP, TRAINER_CAMPER_CHRIS_2, TRAINER_CAMPER_CHRIS_3, SKIP, TRAINER_CAMPER_CHRIS_4},\n      MAP(ROUTE9) },\n   { {TRAINER_CAMPER_DREW, TRAINER_CAMPER_DREW},\n      MAP(ROUTE9) },\n   { {TRAINER_PICNICKER_ALICIA, SKIP, TRAINER_PICNICKER_ALICIA_2, TRAINER_PICNICKER_ALICIA_3, SKIP, TRAINER_PICNICKER_ALICIA_4},\n      MAP(ROUTE9) },\n   { {TRAINER_PICNICKER_CAITLIN, TRAINER_PICNICKER_CAITLIN},\n      MAP(ROUTE9) },\n   { {TRAINER_HIKER_ALAN, TRAINER_HIKER_ALAN},\n      MAP(ROUTE9) },\n   { {TRAINER_HIKER_BRICE, TRAINER_HIKER_BRICE},\n      MAP(ROUTE9) },\n   { {TRAINER_HIKER_JEREMY, SKIP, SKIP, TRAINER_HIKER_JEREMY_2},\n      MAP(ROUTE9) },\n   { {TRAINER_PICNICKER_HEIDI, TRAINER_PICNICKER_HEIDI},\n      MAP(ROUTE10) },\n   { {TRAINER_PICNICKER_CAROL, TRAINER_PICNICKER_CAROL},\n      MAP(ROUTE10) },\n   { {TRAINER_POKEMANIAC_MARK, SKIP, SKIP, TRAINER_POKEMANIAC_MARK_2, SKIP, TRAINER_POKEMANIAC_MARK_3},\n      MAP(ROUTE10) },\n   { {TRAINER_POKEMANIAC_HERMAN, SKIP, SKIP, TRAINER_POKEMANIAC_HERMAN_2, SKIP, TRAINER_POKEMANIAC_HERMAN_3},\n      MAP(ROUTE10) },\n   { {TRAINER_HIKER_CLARK, TRAINER_HIKER_CLARK},\n      MAP(ROUTE10) },\n   { {TRAINER_HIKER_TRENT, SKIP, SKIP, TRAINER_HIKER_TRENT_2},\n      MAP(ROUTE10) },\n   { {TRAINER_LASS_PAIGE, TRAINER_LASS_PAIGE},\n      MAP(ROUTE8) },\n   { {TRAINER_LASS_ANDREA, TRAINER_LASS_ANDREA},\n      MAP(ROUTE8) },\n   { {TRAINER_LASS_MEGAN, SKIP, TRAINER_LASS_MEGAN_2, SKIP, TRAINER_LASS_MEGAN_3},\n      MAP(ROUTE8) },\n   { {TRAINER_LASS_JULIA, TRAINER_LASS_JULIA},\n      MAP(ROUTE8) },\n   { {TRAINER_SUPER_NERD_AIDAN, TRAINER_SUPER_NERD_AIDAN},\n      MAP(ROUTE8) },\n   { {TRAINER_SUPER_NERD_GLENN, SKIP, SKIP, TRAINER_SUPER_NERD_GLENN_2},\n      MAP(ROUTE8) },\n   { {TRAINER_SUPER_NERD_LESLIE, TRAINER_SUPER_NERD_LESLIE},\n      MAP(ROUTE8) },\n   { {TRAINER_GAMER_STAN, TRAINER_GAMER_STAN},\n      MAP(ROUTE8) },\n   { {TRAINER_GAMER_RICH, SKIP, SKIP, TRAINER_GAMER_RICH_2},\n      MAP(ROUTE8) },\n   { {TRAINER_TWINS_ELI_ANNE, SKIP, SKIP, TRAINER_TWINS_ELI_ANNE_2},\n      MAP(ROUTE8) },\n   { {TRAINER_BIKER_RICARDO, TRAINER_BIKER_RICARDO},\n      MAP(ROUTE8) },\n   { {TRAINER_BIKER_JAREN, SKIP, SKIP, TRAINER_BIKER_JAREN_2},\n      MAP(ROUTE8) },\n   { {TRAINER_FISHERMAN_NED, TRAINER_FISHERMAN_NED},\n      MAP(ROUTE12) },\n   { {TRAINER_FISHERMAN_CHIP, TRAINER_FISHERMAN_CHIP},\n      MAP(ROUTE12) },\n   { {TRAINER_FISHERMAN_HANK, TRAINER_FISHERMAN_HANK},\n      MAP(ROUTE12) },\n   { {TRAINER_FISHERMAN_ELLIOT, SKIP, SKIP, TRAINER_FISHERMAN_ELLIOT_2},\n      MAP(ROUTE12) },\n   { {TRAINER_FISHERMAN_ANDREW, TRAINER_FISHERMAN_ANDREW},\n      MAP(ROUTE12) },\n   { {TRAINER_ROCKER_LUCA, SKIP, SKIP, TRAINER_ROCKER_LUCA_2},\n      MAP(ROUTE12) },\n   { {TRAINER_CAMPER_JUSTIN, TRAINER_CAMPER_JUSTIN},\n      MAP(ROUTE12) },\n   { {TRAINER_YOUNG_COUPLE_GIA_JES, SKIP, SKIP, TRAINER_YOUNG_COUPLE_GIA_JES_2, SKIP, TRAINER_YOUNG_COUPLE_GIA_JES_3},\n      MAP(ROUTE12) },\n   { {TRAINER_BIKER_JARED, TRAINER_BIKER_JARED},\n      MAP(ROUTE13) },\n   { {TRAINER_BEAUTY_LOLA, TRAINER_BEAUTY_LOLA},\n      MAP(ROUTE13) },\n   { {TRAINER_BEAUTY_SHEILA, SKIP, SKIP, SKIP, TRAINER_BEAUTY_SHEILA_2},\n      MAP(ROUTE13) },\n   { {TRAINER_BIRD_KEEPER_SEBASTIAN, TRAINER_BIRD_KEEPER_SEBASTIAN},\n      MAP(ROUTE13) },\n   { {TRAINER_BIRD_KEEPER_PERRY, TRAINER_BIRD_KEEPER_PERRY},\n      MAP(ROUTE13) },\n   { {TRAINER_BIRD_KEEPER_ROBERT, SKIP, SKIP, TRAINER_BIRD_KEEPER_ROBERT_2, TRAINER_BIRD_KEEPER_ROBERT_3},\n      MAP(ROUTE13) },\n   { {TRAINER_PICNICKER_ALMA, TRAINER_PICNICKER_ALMA},\n      MAP(ROUTE13) },\n   { {TRAINER_PICNICKER_SUSIE, SKIP, SKIP, TRAINER_PICNICKER_SUSIE_2, TRAINER_PICNICKER_SUSIE_3, TRAINER_PICNICKER_SUSIE_4},\n      MAP(ROUTE13) },\n   { {TRAINER_PICNICKER_VALERIE, TRAINER_PICNICKER_VALERIE},\n      MAP(ROUTE13) },\n   { {TRAINER_PICNICKER_GWEN, TRAINER_PICNICKER_GWEN},\n      MAP(ROUTE13) },\n   { {TRAINER_BIKER_MALIK, TRAINER_BIKER_MALIK},\n      MAP(ROUTE14) },\n   { {TRAINER_BIKER_LUKAS, SKIP, SKIP, SKIP, TRAINER_BIKER_LUKAS_2},\n      MAP(ROUTE14) },\n   { {TRAINER_BIKER_ISAAC, TRAINER_BIKER_ISAAC},\n      MAP(ROUTE14) },\n   { {TRAINER_BIKER_GERALD, TRAINER_BIKER_GERALD},\n      MAP(ROUTE14) },\n   { {TRAINER_BIRD_KEEPER_DONALD, TRAINER_BIRD_KEEPER_DONALD},\n      MAP(ROUTE14) },\n   { {TRAINER_BIRD_KEEPER_BENNY, SKIP, SKIP, TRAINER_BIRD_KEEPER_BENNY_2, TRAINER_BIRD_KEEPER_BENNY_3},\n      MAP(ROUTE14) },\n   { {TRAINER_BIRD_KEEPER_CARTER, TRAINER_BIRD_KEEPER_CARTER},\n      MAP(ROUTE14) },\n   { {TRAINER_BIRD_KEEPER_MITCH, TRAINER_BIRD_KEEPER_MITCH},\n      MAP(ROUTE14) },\n   { {TRAINER_BIRD_KEEPER_BECK, TRAINER_BIRD_KEEPER_BECK},\n      MAP(ROUTE14) },\n   { {TRAINER_BIRD_KEEPER_MARLON, SKIP, SKIP, TRAINER_BIRD_KEEPER_MARLON_2, TRAINER_BIRD_KEEPER_MARLON_3},\n      MAP(ROUTE14) },\n   { {TRAINER_TWINS_KIRI_JAN, TRAINER_TWINS_KIRI_JAN},\n      MAP(ROUTE14) },\n   { {TRAINER_BIKER_ERNEST, TRAINER_BIKER_ERNEST},\n      MAP(ROUTE15) },\n   { {TRAINER_BIKER_ALEX, TRAINER_BIKER_ALEX},\n      MAP(ROUTE15) },\n   { {TRAINER_BEAUTY_GRACE, SKIP, SKIP, SKIP, TRAINER_BEAUTY_GRACE_2},\n      MAP(ROUTE15) },\n   { {TRAINER_BEAUTY_OLIVIA, TRAINER_BEAUTY_OLIVIA},\n      MAP(ROUTE15) },\n   { {TRAINER_BIRD_KEEPER_EDWIN, TRAINER_BIRD_KEEPER_EDWIN},\n      MAP(ROUTE15) },\n   { {TRAINER_BIRD_KEEPER_CHESTER, SKIP, SKIP, TRAINER_BIRD_KEEPER_CHESTER_2, TRAINER_BIRD_KEEPER_CHESTER_3},\n      MAP(ROUTE15) },\n   { {TRAINER_PICNICKER_YAZMIN, TRAINER_PICNICKER_YAZMIN},\n      MAP(ROUTE15) },\n   { {TRAINER_PICNICKER_KINDRA, TRAINER_PICNICKER_KINDRA},\n      MAP(ROUTE15) },\n   { {TRAINER_PICNICKER_BECKY, SKIP, SKIP, TRAINER_PICNICKER_BECKY_2, TRAINER_PICNICKER_BECKY_3, TRAINER_PICNICKER_BECKY_4},\n      MAP(ROUTE15) },\n   { {TRAINER_PICNICKER_CELIA, TRAINER_PICNICKER_CELIA},\n      MAP(ROUTE15) },\n   { {TRAINER_CRUSH_KIN_RON_MYA, SKIP, SKIP, TRAINER_CRUSH_KIN_RON_MYA_2, TRAINER_CRUSH_KIN_RON_MYA_3, TRAINER_CRUSH_KIN_RON_MYA_4},\n      MAP(ROUTE15) },\n   { {TRAINER_BIKER_LAO, TRAINER_BIKER_LAO},\n      MAP(ROUTE16) },\n   { {TRAINER_BIKER_HIDEO, TRAINER_BIKER_HIDEO},\n      MAP(ROUTE16) },\n   { {TRAINER_BIKER_RUBEN, SKIP, SKIP, SKIP, TRAINER_BIKER_RUBEN_2},\n      MAP(ROUTE16) },\n   { {TRAINER_CUE_BALL_KOJI, TRAINER_CUE_BALL_KOJI},\n      MAP(ROUTE16) },\n   { {TRAINER_CUE_BALL_LUKE, TRAINER_CUE_BALL_LUKE},\n      MAP(ROUTE16) },\n   { {TRAINER_CUE_BALL_CAMRON, SKIP, SKIP, SKIP, TRAINER_CUE_BALL_CAMRON_2},\n      MAP(ROUTE16) },\n   { {TRAINER_YOUNG_COUPLE_LEA_JED, TRAINER_YOUNG_COUPLE_LEA_JED},\n      MAP(ROUTE16) },\n   { {TRAINER_BIKER_BILLY, TRAINER_BIKER_BILLY},\n      MAP(ROUTE17) },\n   { {TRAINER_BIKER_NIKOLAS, TRAINER_BIKER_NIKOLAS},\n      MAP(ROUTE17) },\n   { {TRAINER_BIKER_JAXON, SKIP, SKIP, SKIP, TRAINER_BIKER_JAXON_2},\n      MAP(ROUTE17) },\n   { {TRAINER_BIKER_WILLIAM, TRAINER_BIKER_WILLIAM},\n      MAP(ROUTE17) },\n   { {TRAINER_CUE_BALL_RAUL, TRAINER_CUE_BALL_RAUL},\n      MAP(ROUTE17) },\n   { {TRAINER_CUE_BALL_ISAIAH, SKIP, SKIP, SKIP, TRAINER_CUE_BALL_ISAIAH_2},\n      MAP(ROUTE17) },\n   { {TRAINER_CUE_BALL_ZEEK, TRAINER_CUE_BALL_ZEEK},\n      MAP(ROUTE17) },\n   { {TRAINER_CUE_BALL_JAMAL, TRAINER_CUE_BALL_JAMAL},\n      MAP(ROUTE17) },\n   { {TRAINER_CUE_BALL_COREY, SKIP, SKIP, SKIP, TRAINER_CUE_BALL_COREY_2},\n      MAP(ROUTE17) },\n   { {TRAINER_BIKER_VIRGIL, TRAINER_BIKER_VIRGIL},\n      MAP(ROUTE17) },\n   { {TRAINER_BIRD_KEEPER_WILTON, TRAINER_BIRD_KEEPER_WILTON},\n      MAP(ROUTE18) },\n   { {TRAINER_BIRD_KEEPER_RAMIRO, TRAINER_BIRD_KEEPER_RAMIRO},\n      MAP(ROUTE18) },\n   { {TRAINER_BIRD_KEEPER_JACOB, SKIP, SKIP, TRAINER_BIRD_KEEPER_JACOB_2, TRAINER_BIRD_KEEPER_JACOB_3},\n      MAP(ROUTE18) },\n   { {TRAINER_SWIMMER_MALE_RICHARD, TRAINER_SWIMMER_MALE_RICHARD},\n      MAP(ROUTE19) },\n   { {TRAINER_SWIMMER_MALE_REECE, TRAINER_SWIMMER_MALE_REECE},\n      MAP(ROUTE19) },\n   { {TRAINER_SWIMMER_MALE_MATTHEW, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_MATTHEW_2},\n      MAP(ROUTE19) },\n   { {TRAINER_SWIMMER_MALE_DOUGLAS, TRAINER_SWIMMER_MALE_DOUGLAS},\n      MAP(ROUTE19) },\n   { {TRAINER_SWIMMER_MALE_DAVID, TRAINER_SWIMMER_MALE_DAVID},\n      MAP(ROUTE19) },\n   { {TRAINER_SWIMMER_MALE_TONY, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_TONY_2},\n      MAP(ROUTE19) },\n   { {TRAINER_SWIMMER_MALE_AXLE, TRAINER_SWIMMER_MALE_AXLE},\n      MAP(ROUTE19) },\n   { {TRAINER_SWIMMER_FEMALE_ANYA, TRAINER_SWIMMER_FEMALE_ANYA},\n      MAP(ROUTE19) },\n   { {TRAINER_SWIMMER_FEMALE_ALICE, SKIP, SKIP, SKIP, TRAINER_SWIMMER_FEMALE_ALICE_2},\n      MAP(ROUTE19) },\n   { {TRAINER_SWIMMER_FEMALE_CONNIE, TRAINER_SWIMMER_FEMALE_CONNIE},\n      MAP(ROUTE19) },\n   { {TRAINER_SIS_AND_BRO_LIA_LUC, TRAINER_SIS_AND_BRO_LIA_LUC},\n      MAP(ROUTE19) },\n   { {TRAINER_SWIMMER_MALE_BARRY, TRAINER_SWIMMER_MALE_BARRY},\n      MAP(ROUTE20) },\n   { {TRAINER_SWIMMER_MALE_DEAN, TRAINER_SWIMMER_MALE_DEAN},\n      MAP(ROUTE20) },\n   { {TRAINER_SWIMMER_MALE_DARRIN, SKIP, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_DARRIN_2},\n      MAP(ROUTE20) },\n   { {TRAINER_SWIMMER_FEMALE_TIFFANY, TRAINER_SWIMMER_FEMALE_TIFFANY},\n      MAP(ROUTE20) },\n   { {TRAINER_SWIMMER_FEMALE_NORA, TRAINER_SWIMMER_FEMALE_NORA},\n      MAP(ROUTE20) },\n   { {TRAINER_SWIMMER_FEMALE_MELISSA, SKIP, SKIP, SKIP, TRAINER_SWIMMER_FEMALE_MELISSA_2},\n      MAP(ROUTE20) },\n   { {TRAINER_SWIMMER_FEMALE_SHIRLEY, TRAINER_SWIMMER_FEMALE_SHIRLEY},\n      MAP(ROUTE20) },\n   { {TRAINER_BIRD_KEEPER_ROGER, TRAINER_BIRD_KEEPER_ROGER},\n      MAP(ROUTE20) },\n   { {TRAINER_PICNICKER_MISSY, SKIP, SKIP, SKIP, TRAINER_PICNICKER_MISSY_2, TRAINER_PICNICKER_MISSY_3},\n      MAP(ROUTE20) },\n   { {TRAINER_PICNICKER_IRENE, TRAINER_PICNICKER_IRENE},\n      MAP(ROUTE20) },\n   { {TRAINER_FISHERMAN_RONALD, TRAINER_FISHERMAN_RONALD},\n      MAP(ROUTE21_NORTH) },\n   { {TRAINER_FISHERMAN_CLAUDE, TRAINER_FISHERMAN_CLAUDE},\n      MAP(ROUTE21_NORTH) },\n   { {TRAINER_FISHERMAN_WADE, SKIP, SKIP, SKIP, TRAINER_FISHERMAN_WADE_2},\n      MAP(ROUTE21_NORTH) },\n   { {TRAINER_FISHERMAN_NOLAN, TRAINER_FISHERMAN_NOLAN},\n      MAP(ROUTE21_NORTH) },\n   { {TRAINER_SWIMMER_MALE_SPENCER, TRAINER_SWIMMER_MALE_SPENCER},\n      MAP(ROUTE21_NORTH) },\n   { {TRAINER_SWIMMER_MALE_JACK, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_JACK_2},\n      MAP(ROUTE21_NORTH) },\n   { {TRAINER_SWIMMER_MALE_JEROME, TRAINER_SWIMMER_MALE_JEROME},\n      MAP(ROUTE21_NORTH) },\n   { {TRAINER_SWIMMER_MALE_ROLAND, TRAINER_SWIMMER_MALE_ROLAND},\n      MAP(ROUTE21_NORTH) },\n   { {TRAINER_SIS_AND_BRO_LIL_IAN, SKIP, SKIP, SKIP, TRAINER_SIS_AND_BRO_LIL_IAN_2, TRAINER_SIS_AND_BRO_LIL_IAN_3},\n      MAP(ROUTE21_NORTH) },\n   { {TRAINER_SWIMMER_FEMALE_MARIA, TRAINER_SWIMMER_FEMALE_MARIA},\n      MAP(ONE_ISLAND_KINDLE_ROAD) },\n   { {TRAINER_SWIMMER_FEMALE_ABIGAIL, TRAINER_SWIMMER_FEMALE_ABIGAIL},\n      MAP(ONE_ISLAND_KINDLE_ROAD) },\n   { {TRAINER_SWIMMER_MALE_FINN, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_FINN_2},\n      MAP(ONE_ISLAND_KINDLE_ROAD) },\n   { {TRAINER_SWIMMER_MALE_GARRETT, TRAINER_SWIMMER_MALE_GARRETT},\n      MAP(ONE_ISLAND_KINDLE_ROAD) },\n   { {TRAINER_FISHERMAN_TOMMY, TRAINER_FISHERMAN_TOMMY},\n      MAP(ONE_ISLAND_KINDLE_ROAD) },\n   { {TRAINER_CRUSH_GIRL_SHARON, SKIP, SKIP, SKIP, TRAINER_CRUSH_GIRL_SHARON_2, TRAINER_CRUSH_GIRL_SHARON_3},\n      MAP(ONE_ISLAND_KINDLE_ROAD) },\n   { {TRAINER_CRUSH_GIRL_TANYA, SKIP, SKIP, SKIP, TRAINER_CRUSH_GIRL_TANYA_2, TRAINER_CRUSH_GIRL_TANYA_3},\n      MAP(ONE_ISLAND_KINDLE_ROAD) },\n   { {TRAINER_BLACK_BELT_SHEA, SKIP, SKIP, SKIP, TRAINER_BLACK_BELT_SHEA_2, TRAINER_BLACK_BELT_SHEA_3},\n      MAP(ONE_ISLAND_KINDLE_ROAD) },\n   { {TRAINER_BLACK_BELT_HUGH, SKIP, SKIP, SKIP, TRAINER_BLACK_BELT_HUGH_2, TRAINER_BLACK_BELT_HUGH_3},\n      MAP(ONE_ISLAND_KINDLE_ROAD) },\n   { {TRAINER_CAMPER_BRYCE, TRAINER_CAMPER_BRYCE},\n      MAP(ONE_ISLAND_KINDLE_ROAD) },\n   { {TRAINER_PICNICKER_CLAIRE, TRAINER_PICNICKER_CLAIRE},\n      MAP(ONE_ISLAND_KINDLE_ROAD) },\n   { {TRAINER_CRUSH_KIN_MIK_KIA, SKIP, SKIP, SKIP, TRAINER_CRUSH_KIN_MIK_KIA_2, TRAINER_CRUSH_KIN_MIK_KIA_3},\n      MAP(ONE_ISLAND_KINDLE_ROAD) },\n   { {TRAINER_SWIMMER_FEMALE_AMARA, TRAINER_SWIMMER_FEMALE_AMARA},\n      MAP(ONE_ISLAND_TREASURE_BEACH) },\n   { {TRAINER_AROMA_LADY_NIKKI, TRAINER_AROMA_LADY_NIKKI},\n      MAP(THREE_ISLAND_BOND_BRIDGE) },\n   { {TRAINER_AROMA_LADY_VIOLET, TRAINER_AROMA_LADY_VIOLET},\n      MAP(THREE_ISLAND_BOND_BRIDGE) },\n   { {TRAINER_TUBER_AMIRA, SKIP, SKIP, SKIP, TRAINER_TUBER_AMIRA_2},\n      MAP(THREE_ISLAND_BOND_BRIDGE) },\n   { {TRAINER_TUBER_ALEXIS, TRAINER_TUBER_ALEXIS},\n      MAP(THREE_ISLAND_BOND_BRIDGE) },\n   { {TRAINER_SWIMMER_FEMALE_TISHA, TRAINER_SWIMMER_FEMALE_TISHA},\n      MAP(THREE_ISLAND_BOND_BRIDGE) },\n   { {TRAINER_TWINS_JOY_MEG, SKIP, SKIP, SKIP, TRAINER_TWINS_JOY_MEG_2},\n      MAP(THREE_ISLAND_BOND_BRIDGE) },\n   { {TRAINER_PAINTER_DAISY, TRAINER_PAINTER_DAISY},\n      MAP(FIVE_ISLAND_RESORT_GORGEOUS) },\n   { {TRAINER_PAINTER_CELINA, TRAINER_PAINTER_CELINA},\n      MAP(FIVE_ISLAND_RESORT_GORGEOUS) },\n   { {TRAINER_PAINTER_RAYNA, SKIP, SKIP, SKIP, SKIP, TRAINER_PAINTER_RAYNA_2},\n      MAP(FIVE_ISLAND_RESORT_GORGEOUS) },\n   { {TRAINER_LADY_JACKI, TRAINER_LADY_JACKI},\n      MAP(FIVE_ISLAND_RESORT_GORGEOUS) },\n   { {TRAINER_LADY_GILLIAN, TRAINER_LADY_GILLIAN},\n      MAP(FIVE_ISLAND_RESORT_GORGEOUS) },\n   { {TRAINER_YOUNGSTER_DESTIN, SKIP, SKIP, SKIP, SKIP, TRAINER_YOUNGSTER_DESTIN_2},\n      MAP(FIVE_ISLAND_RESORT_GORGEOUS) },\n   { {TRAINER_SWIMMER_MALE_TOBY, TRAINER_SWIMMER_MALE_TOBY},\n      MAP(FIVE_ISLAND_RESORT_GORGEOUS) },\n   { {TRAINER_PKMN_BREEDER_ALIZE, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_BREEDER_ALIZE_2},\n      MAP(FIVE_ISLAND_WATER_LABYRINTH) },\n   { {TRAINER_BIRD_KEEPER_MILO, SKIP, SKIP, SKIP, SKIP, TRAINER_BIRD_KEEPER_MILO_2},\n      MAP(FIVE_ISLAND_MEMORIAL_PILLAR) },\n   { {TRAINER_BIRD_KEEPER_CHAZ, SKIP, SKIP, SKIP, SKIP, TRAINER_BIRD_KEEPER_CHAZ_2},\n      MAP(FIVE_ISLAND_MEMORIAL_PILLAR) },\n   { {TRAINER_BIRD_KEEPER_HAROLD, SKIP, SKIP, SKIP, SKIP, TRAINER_BIRD_KEEPER_HAROLD_2},\n      MAP(FIVE_ISLAND_MEMORIAL_PILLAR) },\n   { {TRAINER_FISHERMAN_TYLOR, TRAINER_FISHERMAN_TYLOR},\n      MAP(SIX_ISLAND_OUTCAST_ISLAND) },\n   { {TRAINER_SWIMMER_MALE_MYMO, TRAINER_SWIMMER_MALE_MYMO},\n      MAP(SIX_ISLAND_OUTCAST_ISLAND) },\n   { {TRAINER_SWIMMER_FEMALE_NICOLE, SKIP, SKIP, SKIP, SKIP, TRAINER_SWIMMER_FEMALE_NICOLE_2},\n      MAP(SIX_ISLAND_OUTCAST_ISLAND) },\n   { {TRAINER_SIS_AND_BRO_AVA_GEB, TRAINER_SIS_AND_BRO_AVA_GEB},\n      MAP(SIX_ISLAND_OUTCAST_ISLAND) },\n   { {TRAINER_PSYCHIC_JACLYN, SKIP, SKIP, SKIP, SKIP, TRAINER_PSYCHIC_JACLYN_2},\n      MAP(SIX_ISLAND_GREEN_PATH) },\n   { {TRAINER_AROMA_LADY_ROSE, TRAINER_AROMA_LADY_ROSE},\n      MAP(SIX_ISLAND_WATER_PATH) },\n   { {TRAINER_JUGGLER_EDWARD, TRAINER_JUGGLER_EDWARD},\n      MAP(SIX_ISLAND_WATER_PATH) },\n   { {TRAINER_SWIMMER_MALE_SAMIR, SKIP, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_SAMIR_2},\n      MAP(SIX_ISLAND_WATER_PATH) },\n   { {TRAINER_SWIMMER_FEMALE_DENISE, TRAINER_SWIMMER_FEMALE_DENISE},\n      MAP(SIX_ISLAND_WATER_PATH) },\n   { {TRAINER_TWINS_MIU_MIA, TRAINER_TWINS_MIU_MIA},\n      MAP(SIX_ISLAND_WATER_PATH) },\n   { {TRAINER_HIKER_EARL, SKIP, SKIP, SKIP, SKIP, TRAINER_HIKER_EARL_2},\n      MAP(SIX_ISLAND_WATER_PATH) },\n   { {TRAINER_RUIN_MANIAC_STANLY, TRAINER_RUIN_MANIAC_STANLY},\n      MAP(SIX_ISLAND_RUIN_VALLEY) },\n   { {TRAINER_RUIN_MANIAC_FOSTER, TRAINER_RUIN_MANIAC_FOSTER},\n      MAP(SIX_ISLAND_RUIN_VALLEY) },\n   { {TRAINER_RUIN_MANIAC_LARRY, SKIP, SKIP, SKIP, SKIP, TRAINER_RUIN_MANIAC_LARRY_2},\n      MAP(SIX_ISLAND_RUIN_VALLEY) },\n   { {TRAINER_HIKER_DARYL, TRAINER_HIKER_DARYL},\n      MAP(SIX_ISLAND_RUIN_VALLEY) },\n   { {TRAINER_POKEMANIAC_HECTOR, SKIP, SKIP, SKIP, SKIP, TRAINER_POKEMANIAC_HECTOR_2},\n      MAP(SIX_ISLAND_RUIN_VALLEY) },\n   { {TRAINER_PSYCHIC_DARIO, SKIP, SKIP, SKIP, SKIP, TRAINER_PSYCHIC_DARIO_2},\n      MAP(SEVEN_ISLAND_TRAINER_TOWER) },\n   { {TRAINER_PSYCHIC_RODETTE, SKIP, SKIP, SKIP, SKIP, TRAINER_PSYCHIC_RODETTE_2},\n      MAP(SEVEN_ISLAND_TRAINER_TOWER) },\n   { {TRAINER_AROMA_LADY_MIAH, TRAINER_AROMA_LADY_MIAH},\n      MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) },\n   { {TRAINER_YOUNG_COUPLE_EVE_JON, TRAINER_YOUNG_COUPLE_EVE_JON},\n      MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) },\n   { {TRAINER_JUGGLER_MASON, SKIP, SKIP, SKIP, SKIP, TRAINER_JUGGLER_MASON_2},\n      MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) },\n   { {TRAINER_PKMN_RANGER_NICOLAS, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_NICOLAS_2},\n      MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) },\n   { {TRAINER_PKMN_RANGER_MADELINE, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_MADELINE_2},\n      MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) },\n   { {TRAINER_CRUSH_GIRL_CYNDY, SKIP, SKIP, SKIP, SKIP, TRAINER_CRUSH_GIRL_CYNDY_2},\n      MAP(SEVEN_ISLAND_SEVAULT_CANYON) },\n   { {TRAINER_TAMER_EVAN, SKIP, SKIP, SKIP, SKIP, TRAINER_TAMER_EVAN_2},\n      MAP(SEVEN_ISLAND_SEVAULT_CANYON) },\n   { {TRAINER_PKMN_RANGER_JACKSON, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_JACKSON_2},\n      MAP(SEVEN_ISLAND_SEVAULT_CANYON) },\n   { {TRAINER_PKMN_RANGER_KATELYN, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_KATELYN_2},\n      MAP(SEVEN_ISLAND_SEVAULT_CANYON) },\n   { {TRAINER_COOLTRAINER_LEROY, SKIP, SKIP, SKIP, SKIP, TRAINER_COOLTRAINER_LEROY_2},\n      MAP(SEVEN_ISLAND_SEVAULT_CANYON) },\n   { {TRAINER_COOLTRAINER_MICHELLE, SKIP, SKIP, SKIP, SKIP, TRAINER_COOLTRAINER_MICHELLE_2},\n      MAP(SEVEN_ISLAND_SEVAULT_CANYON) },\n   { {TRAINER_COOL_COUPLE_LEX_NYA, SKIP, SKIP, SKIP, SKIP, TRAINER_COOL_COUPLE_LEX_NYA_2},\n      MAP(SEVEN_ISLAND_SEVAULT_CANYON) },\n   { {TRAINER_RUIN_MANIAC_BRANDON, TRAINER_RUIN_MANIAC_BRANDON},\n      MAP(SEVEN_ISLAND_TANOBY_RUINS) },\n   { {TRAINER_RUIN_MANIAC_BENJAMIN, TRAINER_RUIN_MANIAC_BENJAMIN},\n      MAP(SEVEN_ISLAND_TANOBY_RUINS) },\n   { {TRAINER_PAINTER_EDNA, TRAINER_PAINTER_EDNA},\n      MAP(SEVEN_ISLAND_TANOBY_RUINS) },\n   { {TRAINER_GENTLEMAN_CLIFFORD, TRAINER_GENTLEMAN_CLIFFORD},\n      MAP(SEVEN_ISLAND_TANOBY_RUINS) },\n   { {TRAINER_PKMN_RANGER_HELENA, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_HELENA_2},\n      MAP(TWO_ISLAND_CAPE_BRINK) },\n   { {TRAINER_COOLTRAINER_ATTICUS, SKIP, SKIP, SKIP, TRAINER_COOLTRAINER_ATTICUS_2},\n      MAP(TWO_ISLAND_CAPE_BRINK) },\n   { {TRAINER_FISHERMAN_DEFOREST, SKIP, SKIP, SKIP, TRAINER_FISHERMAN_DEFOREST_2},\n      MAP(TWO_ISLAND_CAPE_BRINK) },\n   { {TRAINER_BIRD_KEEPER_SPEDO, SKIP, SKIP, SKIP, TRAINER_BIRD_KEEPER_SPEDO_2},\n      MAP(TWO_ISLAND_CAPE_BRINK) },\n   { {TRAINER_COOLTRAINER_CASPARA, SKIP, SKIP, SKIP, TRAINER_COOLTRAINER_CASPARA_2},\n      MAP(TWO_ISLAND_CAPE_BRINK) },\n   { {TRAINER_SWIMMER_FEMALE_SEDEF, SKIP, SKIP, SKIP, TRAINER_SWIMMER_FEMALE_SEDEF_2},\n      MAP(TWO_ISLAND_CAPE_BRINK) },\n};\n\nstatic const u8 sMovementScript_Wait48[] = {\n    MOVEMENT_ACTION_DELAY_16,\n    MOVEMENT_ACTION_DELAY_16,\n    MOVEMENT_ACTION_DELAY_16,\n    MOVEMENT_ACTION_STEP_END\n};\n\nstatic const u8 sMovementScript_TrainerUnfought[] = {\n    MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK,\n    MOVEMENT_ACTION_STEP_END\n};\n\nstatic const u8 sMovementScript_TrainerNoRematch[] = {\n    MOVEMENT_ACTION_EMOTE_X,\n    MOVEMENT_ACTION_STEP_END\n};\n\nstatic const u8 sMovementScript_TrainerRematch[] = {\n    MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN,\n    MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK,\n    MOVEMENT_ACTION_STEP_END\n};\n\nstatic const u8 sFaceDirectionMovementTypeByFacingDirection[] = {\n    MOVEMENT_TYPE_FACE_DOWN,\n    MOVEMENT_TYPE_FACE_DOWN,\n    MOVEMENT_TYPE_FACE_UP,\n    MOVEMENT_TYPE_FACE_LEFT,\n    MOVEMENT_TYPE_FACE_RIGHT\n};\n\n// text\n\nvoid VsSeekerFreezeObjectsAfterChargeComplete(void)\n{\n    CreateTask(Task_ResetObjectsRematchWantedState, 80);\n}\n\nstatic void Task_ResetObjectsRematchWantedState(u8 taskId)\n{\n    struct Task *task = &gTasks[taskId];\n    u32 i;\n\n    if (task->data[0] == 0 && walkrun_is_standing_still() == TRUE)\n    {\n        HandleEnforcedLookDirectionOnPlayerStopMoving();\n        task->data[0] = 1;\n    }\n\n    if (task->data[1] == 0)\n    {\n        for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n        {\n            if (ObjectEventIdIsSane(i) == TRUE)\n            {\n                if (gObjectEvents[i].singleMovementActive)\n                    return;\n                FreezeObjectEvent(&gObjectEvents[i]);\n            }\n        }\n    }\n\n    task->data[1] = 1;\n    if (task->data[0] != 0)\n    {\n        DestroyTask(taskId);\n        StopPlayerAvatar();\n        ScriptContext_Enable();\n    }\n}\n\nvoid VsSeekerResetObjectMovementAfterChargeComplete(void)\n{\n    struct ObjectEventTemplate * templates = gSaveBlock1Ptr->objectEventTemplates;\n    u32 i;\n    u8 movementType;\n    u8 objEventId;\n    struct ObjectEvent * objectEvent;\n\n    for (i = 0; i < gMapHeader.events->objectEventCount; i++)\n    {\n        if ((templates[i].objUnion.normal.trainerType == TRAINER_TYPE_NORMAL\n          || templates[i].objUnion.normal.trainerType == TRAINER_TYPE_BURIED) \n         && (templates[i].objUnion.normal.movementType == MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n          || templates[i].objUnion.normal.movementType == MOVEMENT_TYPE_RAISE_HAND_AND_JUMP\n          || templates[i].objUnion.normal.movementType == MOVEMENT_TYPE_RAISE_HAND_AND_SWIM))\n        {\n            movementType = GetRandomFaceDirectionMovementType();\n            TryGetObjectEventIdByLocalIdAndMap(templates[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objEventId);\n            objectEvent = &gObjectEvents[objEventId];\n            if (ObjectEventIdIsSane(objEventId) == TRUE)\n            {\n                SetTrainerMovementType(objectEvent, movementType);\n            }\n            templates[i].objUnion.normal.movementType = movementType;\n        }\n    }\n}\n\nbool8 UpdateVsSeekerStepCounter(void)\n{\n    u8 x = 0;\n\n    if (CheckBagHasItem(ITEM_VS_SEEKER, 1) == TRUE)\n    {\n        if ((gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) < 100)\n        {\n            gSaveBlock1Ptr->trainerRematchStepCounter++;\n            if(GetAbilityBySpecies(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), GetMonData(&gPlayerParty[0], MON_DATA_ABILITY_NUM)) == ABILITY_LIGHTNING_ROD)\n            {\n               if ((gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) < 100)\n                  gSaveBlock1Ptr->trainerRematchStepCounter++;\n            }\n        }\n    }\n\n    if (FlagGet(FLAG_SYS_VS_SEEKER_CHARGING) == TRUE)\n    {\n        if (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) < 100)\n        {\n            x = (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) + 1);\n            if(GetAbilityBySpecies(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), GetMonData(&gPlayerParty[0], MON_DATA_ABILITY_NUM)) == ABILITY_LIGHTNING_ROD)\n            {\n               if (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) < 100)\n                  x = (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) + 1);\n            }\n            gSaveBlock1Ptr->trainerRematchStepCounter = (gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) | (x << 8);\n        }\n        if (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) == 100)\n        {\n            FlagClear(FLAG_SYS_VS_SEEKER_CHARGING);\n            VsSeekerResetChargingStepCounter();\n            ClearAllTrainerRematchStates();\n            return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nvoid MapResetTrainerRematches(u16 mapGroup, u16 mapNum)\n{\n    FlagClear(FLAG_SYS_VS_SEEKER_CHARGING);\n    VsSeekerResetChargingStepCounter();\n    ClearAllTrainerRematchStates();\n    ResetMovementOfRematchableTrainers();\n}\n\nstatic void ResetMovementOfRematchableTrainers(void)\n{\n    u32 i;\n\n    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)\n    {\n        struct ObjectEvent * objectEvent = &gObjectEvents[i];\n        if (objectEvent->movementType == MOVEMENT_TYPE_RAISE_HAND_AND_STOP\n                || objectEvent->movementType == MOVEMENT_TYPE_RAISE_HAND_AND_JUMP\n                || objectEvent->movementType == MOVEMENT_TYPE_RAISE_HAND_AND_SWIM)\n        {\n            u8 movementType = GetRandomFaceDirectionMovementType();\n            if (objectEvent->active && gSprites[objectEvent->spriteId].data[0] == i)\n            {\n                gSprites[objectEvent->spriteId].x2 = 0;\n                gSprites[objectEvent->spriteId].y2 = 0;\n                SetTrainerMovementType(objectEvent, movementType);\n            }\n        }\n    }\n}\n\nstatic void VsSeekerResetInBagStepCounter(void)\n{\n    gSaveBlock1Ptr->trainerRematchStepCounter &= 0xFF00;\n}\n\nstatic void VsSeekerSetStepCounterInBagFull(void)\n{\n    gSaveBlock1Ptr->trainerRematchStepCounter &= 0xFF00;\n    gSaveBlock1Ptr->trainerRematchStepCounter |= 100;\n}\n\nstatic void VsSeekerResetChargingStepCounter(void)\n{\n    gSaveBlock1Ptr->trainerRematchStepCounter &= 0x00FF;\n}\n\nstatic void VsSeekerSetStepCounterFullyCharged(void)\n{\n    gSaveBlock1Ptr->trainerRematchStepCounter &= 0x00FF;\n    gSaveBlock1Ptr->trainerRematchStepCounter |= (100 << 8);\n}\n\nvoid Task_VsSeeker_0(u8 taskId)\n{\n    u32 i;\n    u8 respval;\n\n    for (i = 0; i < 16; i++)\n        gTasks[taskId].data[i] = 0;\n\n    sVsSeeker = AllocZeroed(sizeof(struct VsSeekerStruct));\n    GatherNearbyTrainerInfo();\n    respval = CanUseVsSeeker();\n    if (respval == VSSEEKER_NOT_CHARGED)\n    {\n        Free(sVsSeeker);\n        DisplayItemMessageOnField(taskId, FONT_NORMAL, VSSeeker_Text_BatteryNotChargedNeedXSteps, Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker);\n    }\n    else if (respval == VSSEEKER_NO_ONE_IN_RANGE)\n    {\n        Free(sVsSeeker);\n        DisplayItemMessageOnField(taskId, FONT_NORMAL, VSSeeker_Text_NoTrainersWithinRange, Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker);\n    }\n    else if (respval == VSSEEKER_CAN_USE)\n    {\n        ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, 0, gSpecialVar_ItemId, 0xFFFF);\n        FieldEffectStart(FLDEFF_USE_VS_SEEKER);\n        gTasks[taskId].func = Task_VsSeeker_1;\n        gTasks[taskId].data[0] = 15;\n    }\n}\n\nstatic void Task_VsSeeker_1(u8 taskId)\n{\n    if (--gTasks[taskId].data[0] == 0)\n    {\n        gTasks[taskId].func = Task_VsSeeker_2;\n        gTasks[taskId].data[1] = 16;\n    }\n}\n\nstatic void Task_VsSeeker_2(u8 taskId)\n{\n    s16 * data = gTasks[taskId].data;\n\n    if (data[2] != 2 && --data[1] == 0)\n    {\n        PlaySE(SE_CONTEST_MONS_TURN);\n        data[1] = 11;\n        data[2]++;\n    }\n\n    if (!FieldEffectActiveListContains(FLDEFF_USE_VS_SEEKER))\n    {\n        data[1] = 0;\n        data[2] = 0;\n        VsSeekerResetInBagStepCounter();\n        sVsSeeker->responseCode = GetVsSeekerResponseInArea(sRematches);\n        ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, sMovementScript_Wait48);\n        gTasks[taskId].func = Task_VsSeeker_3;\n    }\n}\n\nstatic void GatherNearbyTrainerInfo(void)\n{\n    struct ObjectEventTemplate *templates = gSaveBlock1Ptr->objectEventTemplates;\n    u8 objectEventId = 0;\n    u8 vsSeekerObjectIdx = 0;\n    s32 objectEventIdx;\n\n    for (objectEventIdx = 0; objectEventIdx < gMapHeader.events->objectEventCount; objectEventIdx++)\n    {\n        if (templates[objectEventIdx].objUnion.normal.trainerType == TRAINER_TYPE_NORMAL || templates[objectEventIdx].objUnion.normal.trainerType == TRAINER_TYPE_BURIED)\n        {\n            sVsSeeker->trainerInfo[vsSeekerObjectIdx].script = templates[objectEventIdx].script;\n            sVsSeeker->trainerInfo[vsSeekerObjectIdx].trainerIdx = GetTrainerFlagFromScript(templates[objectEventIdx].script);\n            sVsSeeker->trainerInfo[vsSeekerObjectIdx].localId = templates[objectEventIdx].localId;\n            TryGetObjectEventIdByLocalIdAndMap(templates[objectEventIdx].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId);\n            sVsSeeker->trainerInfo[vsSeekerObjectIdx].objectEventId = objectEventId;\n            sVsSeeker->trainerInfo[vsSeekerObjectIdx].xCoord = gObjectEvents[objectEventId].currentCoords.x - 7;\n            sVsSeeker->trainerInfo[vsSeekerObjectIdx].yCoord = gObjectEvents[objectEventId].currentCoords.y - 7;\n            sVsSeeker->trainerInfo[vsSeekerObjectIdx].graphicsId = templates[objectEventIdx].graphicsId;\n            vsSeekerObjectIdx++;\n        }\n    }\n    sVsSeeker->trainerInfo[vsSeekerObjectIdx].localId = 0xFF;\n}\n\nstatic void Task_VsSeeker_3(u8 taskId)\n{\n    if (ScriptMovement_IsObjectMovementFinished(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup))\n    {\n        if (sVsSeeker->responseCode == VSSEEKER_RESPONSE_NO_RESPONSE)\n        {\n            DisplayItemMessageOnField(taskId, FONT_NORMAL, VSSeeker_Text_TrainersNotReady, Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker);\n        }\n        else\n        {\n            if (sVsSeeker->responseCode == VSSEEKER_RESPONSE_FOUND_REMATCHES)\n                StartAllRespondantIdleMovements();\n            ClearDialogWindowAndFrame(0, TRUE);\n            ClearPlayerHeldMovementAndUnfreezeObjectEvents();\n            UnlockPlayerFieldControls();\n            DestroyTask(taskId);\n        }\n        Free(sVsSeeker);\n    }\n}\n\nstatic u8 CanUseVsSeeker(void)\n{\n   u8 vsSeekerChargeSteps = gSaveBlock1Ptr->trainerRematchStepCounter;\n   if (vsSeekerChargeSteps == 100)\n   {\n      if (GetRematchableTrainerLocalId() == 0xFF)\n         return VSSEEKER_NO_ONE_IN_RANGE;\n      else\n         return VSSEEKER_CAN_USE;\n   }\n   else\n   {\n      if(GetAbilityBySpecies(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), GetMonData(&gPlayerParty[0], MON_DATA_ABILITY_NUM)) == ABILITY_LIGHTNING_ROD)\n      {\n         if(vsSeekerChargeSteps % 2 == 0)\n            TV_PrintIntToStringVar(0, (100 - vsSeekerChargeSteps) / 2);\n         else\n            TV_PrintIntToStringVar(0, ((100 - vsSeekerChargeSteps) / 2) + 1);\n      }\n      else\n         TV_PrintIntToStringVar(0, 100 - vsSeekerChargeSteps);\n      return VSSEEKER_NOT_CHARGED;\n   }\n}\n\nstatic u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData)\n{\n    u16 trainerIdx = 0;\n    u16 rval = 0;\n    u8 rematchTrainerIdx;\n    u8 unusedIdx = 0;\n    u8 response = 0;\n    s32 vsSeekerIdx = 0;\n\n    while (sVsSeeker->trainerInfo[vsSeekerIdx].localId != 0xFF)\n    {\n        if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[vsSeekerIdx]) == TRUE)\n        {\n            trainerIdx = sVsSeeker->trainerInfo[vsSeekerIdx].trainerIdx;\n            if (!HasTrainerBeenFought(trainerIdx))\n            {\n                StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerUnfought);\n                sVsSeeker->trainerHasNotYetBeenFought = 1;\n                vsSeekerIdx++;\n                continue;\n            }\n            rematchTrainerIdx = GetNextAvailableRematchTrainer(vsSeekerData, trainerIdx, &unusedIdx);\n            if (rematchTrainerIdx == 0)\n            {\n                StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch);\n                sVsSeeker->trainerDoesNotWantRematch = 1;\n            }\n            else\n            {\n                rval = Random() % 100; // Even if it's overwritten below, it progresses the RNG.\n                response = GetCurVsSeekerResponse(vsSeekerIdx, trainerIdx);\n                if (response == VSSEEKER_SINGLE_RESP_YES)\n                    rval = 100; // Definitely yes\n                else if (response == VSSEEKER_SINGLE_RESP_NO)\n                    rval = 0; // Definitely no\n                // Otherwise it's a 70% chance to want a rematch\n                if (rval < 30)\n                {\n                    StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch);\n                    sVsSeeker->trainerDoesNotWantRematch = 1;\n                }\n                else\n                {\n                    gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[vsSeekerIdx].localId] = rematchTrainerIdx;\n                    ShiftStillObjectEventCoords(&gObjectEvents[sVsSeeker->trainerInfo[vsSeekerIdx].objectEventId]);\n                    StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerRematch);\n                    sVsSeeker->trainerIdxArray[sVsSeeker->numRematchableTrainers] = trainerIdx;\n                    sVsSeeker->runningBehaviourEtcArray[sVsSeeker->numRematchableTrainers] = GetRunningBehaviorFromGraphicsId(sVsSeeker->trainerInfo[vsSeekerIdx].graphicsId);\n                    sVsSeeker->numRematchableTrainers++;\n                    sVsSeeker->trainerWantsRematch = 1;\n                }\n            }\n        }\n        vsSeekerIdx++;\n    }\n\n    if (sVsSeeker->trainerWantsRematch)\n    {\n        PlaySE(SE_PIN);\n        FlagSet(FLAG_SYS_VS_SEEKER_CHARGING);\n        VsSeekerResetChargingStepCounter();\n        return VSSEEKER_RESPONSE_FOUND_REMATCHES;\n    }\n    if (sVsSeeker->trainerHasNotYetBeenFought)\n        return VSSEEKER_RESPONSE_UNFOUGHT_TRAINERS;\n    return VSSEEKER_RESPONSE_NO_RESPONSE;\n}\n\nvoid ClearRematchStateByTrainerId(void)\n{\n    u8 objEventId = 0;\n    struct ObjectEventTemplate *objectEventTemplates = gSaveBlock1Ptr->objectEventTemplates;\n    int vsSeekerDataIdx = LookupVsSeekerOpponentInArray(sRematches, gTrainerBattleOpponent_A);\n\n    if (vsSeekerDataIdx != -1)\n    {\n        int i;\n\n        for (i = 0; i < gMapHeader.events->objectEventCount; i++)\n        {\n            if ((objectEventTemplates[i].objUnion.normal.trainerType == TRAINER_TYPE_NORMAL \n              || objectEventTemplates[i].objUnion.normal.trainerType == TRAINER_TYPE_BURIED)\n              && vsSeekerDataIdx == LookupVsSeekerOpponentInArray(sRematches, GetTrainerFlagFromScript(objectEventTemplates[i].script)))\n            {\n                struct ObjectEvent *objectEvent;\n\n                TryGetObjectEventIdByLocalIdAndMap(objectEventTemplates[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objEventId);\n                objectEvent = &gObjectEvents[objEventId];\n                GetRandomFaceDirectionMovementType(&objectEventTemplates[i]); // You are using this function incorrectly.  Please consult the manual.\n                OverrideMovementTypeForObjectEvent(objectEvent, sFaceDirectionMovementTypeByFacingDirection[objectEvent->facingDirection]);\n                gSaveBlock1Ptr->trainerRematches[objectEventTemplates[i].localId] = 0;\n                if (gSelectedObjectEvent == objEventId)\n                    objectEvent->movementType = sFaceDirectionMovementTypeByFacingDirection[objectEvent->facingDirection];\n                else\n                    objectEvent->movementType = MOVEMENT_TYPE_FACE_DOWN;\n            }\n        }\n    }\n}\n\nstatic void TryGetRematchTrainerIdGivenGameState(const u16 * trainerIdxs, u8 * rematchIdx_p)\n{\n    switch (*rematchIdx_p)\n    {\n     case 0:\n         break;\n     case 1:\n         if (!FlagGet(FLAG_GOT_VS_SEEKER))\n             *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p);\n         break;\n     case 2:\n         if (!FlagGet(FLAG_WORLD_MAP_CELADON_CITY))\n             *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p);\n         break;\n     case 3:\n         if (!FlagGet(FLAG_WORLD_MAP_FUCHSIA_CITY))\n             *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p);\n         break;\n     case 4:\n         if (!FlagGet(FLAG_SYS_GAME_CLEAR))\n             *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p);\n         break;\n     case 5:\n         if (!FlagGet(FLAG_SYS_CAN_LINK_WITH_RS))\n             *rematchIdx_p = GetRematchTrainerIdGivenGameState(trainerIdxs, *rematchIdx_p);\n         break;\n    }\n}\n\nstatic u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchIdx)\n{\n    while (--rematchIdx != 0)\n    {\n        const u16 *rematch_p = trainerIdxs + rematchIdx;\n        if (*rematch_p != SKIP)\n            return rematchIdx;\n    }\n    return 0;\n}\n\nbool8 ShouldTryRematchBattle(void)\n{\n    if (ShouldTryRematchBattleInternal(sRematches, gTrainerBattleOpponent_A))\n    {\n        return TRUE;\n    }\n    return HasRematchTrainerAlreadyBeenFought(sRematches, gTrainerBattleOpponent_A);\n}\n\nstatic bool8 ShouldTryRematchBattleInternal(const struct RematchData *vsSeekerData, u16 trainerBattleOpponent)\n{\n    s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerBattleOpponent);\n\n    if (rematchIdx == -1)\n        return FALSE;\n    if (rematchIdx >= 0 && rematchIdx < NELEMS(sRematches))\n    {\n        if (IsThisTrainerRematchable(gSpecialVar_LastTalked))\n            return TRUE;\n    }\n    return FALSE;\n}\n\nstatic bool8 HasRematchTrainerAlreadyBeenFought(const struct RematchData *vsSeekerData, u16 trainerBattleOpponent)\n{\n    s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerBattleOpponent);\n\n    if (rematchIdx == -1)\n        return FALSE;\n    if (!HasTrainerBeenFought(vsSeekerData[rematchIdx].trainerIdxs[0]))\n        return FALSE;\n    return TRUE;\n}\n\nvoid ClearRematchStateOfLastTalked(void)\n{\n    gSaveBlock1Ptr->trainerRematches[gSpecialVar_LastTalked] = 0;\n    SetBattledTrainerFlag();\n}\n\nstatic int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 trainerId)\n{\n    int i, j;\n\n    for (i = 0; i < NELEMS(sRematches); i++)\n    {\n        for (j = 0; j < MAX_REMATCH_PARTIES; j++)\n        {\n            u16 testTrainerId;\n            if (array[i].trainerIdxs[j] == 0)\n                break;\n            testTrainerId = array[i].trainerIdxs[j];\n            if (testTrainerId == SKIP)\n                continue;\n            if (testTrainerId == trainerId)\n                return i;\n        }\n    }\n\n    return -1;\n}\n\nint GetRematchTrainerId(u16 trainerId)\n{\n    u8 i;\n    u8 j;\n    j = GetNextAvailableRematchTrainer(sRematches, trainerId, &i);\n    if (!j)\n        return 0;\n    TryGetRematchTrainerIdGivenGameState(sRematches[i].trainerIdxs, &j);\n    return sRematches[i].trainerIdxs[j];\n}\n\nu8 IsTrainerReadyForRematch(void)\n{\n    return IsTrainerReadyForRematchInternal(sRematches, gTrainerBattleOpponent_A);\n}\n\nstatic bool8 IsTrainerReadyForRematchInternal(const struct RematchData * array, u16 trainerId)\n{\n    int rematchTrainerIdx = LookupVsSeekerOpponentInArray(array, trainerId);\n\n    if (rematchTrainerIdx == -1)\n        return FALSE;\n    if (rematchTrainerIdx >= NELEMS(sRematches))\n        return FALSE;\n    if (!IsThisTrainerRematchable(gSpecialVar_LastTalked))\n        return FALSE;\n    return TRUE;\n}\n\nstatic bool8 ObjectEventIdIsSane(u8 objectEventId)\n{\n    struct ObjectEvent *objectEvent = &gObjectEvents[objectEventId];\n\n    if (objectEvent->active && gMapHeader.events->objectEventCount >= objectEvent->localId && gSprites[objectEvent->spriteId].data[0] == objectEventId)\n        return TRUE;\n    return FALSE;\n}\n\nstatic u8 GetRandomFaceDirectionMovementType()\n{\n    u16 r1 = Random() % 4;\n\n    switch (r1)\n    {\n        case 0:\n            return MOVEMENT_TYPE_FACE_UP;\n        case 1:\n            return MOVEMENT_TYPE_FACE_DOWN;\n        case 2:\n            return MOVEMENT_TYPE_FACE_LEFT;\n        case 3:\n            return MOVEMENT_TYPE_FACE_RIGHT;\n        default:\n            return MOVEMENT_TYPE_FACE_DOWN;\n    }\n}\n\nstatic u8 GetRunningBehaviorFromGraphicsId(u8 graphicsId)\n{\n    switch (graphicsId)\n    {\n        case OBJ_EVENT_GFX_LITTLE_GIRL:\n        case OBJ_EVENT_GFX_YOUNGSTER:\n        case OBJ_EVENT_GFX_BOY:\n        case OBJ_EVENT_GFX_BUG_CATCHER:\n        case OBJ_EVENT_GFX_LASS:\n        case OBJ_EVENT_GFX_WOMAN_1:\n        case OBJ_EVENT_GFX_BATTLE_GIRL:\n        case OBJ_EVENT_GFX_MAN:\n        case OBJ_EVENT_GFX_ROCKER:\n        case OBJ_EVENT_GFX_WOMAN_2:\n        case OBJ_EVENT_GFX_BEAUTY:\n        case OBJ_EVENT_GFX_BALDING_MAN:\n        case OBJ_EVENT_GFX_TUBER_F:\n        case OBJ_EVENT_GFX_CAMPER:\n        case OBJ_EVENT_GFX_PICNICKER:\n        case OBJ_EVENT_GFX_COOLTRAINER_M:\n        case OBJ_EVENT_GFX_COOLTRAINER_F:\n        case OBJ_EVENT_GFX_SWIMMER_M_LAND:\n        case OBJ_EVENT_GFX_SWIMMER_F_LAND:\n        case OBJ_EVENT_GFX_BLACKBELT:\n        case OBJ_EVENT_GFX_HIKER:\n        case OBJ_EVENT_GFX_SAILOR:\n        case OBJ_EVENT_GFX_PAINTER:\n        case OBJ_EVENT_GFX_BIRD_KEEPER:\n        case OBJ_EVENT_GFX_POKEMON_RANGER_M:\n        case OBJ_EVENT_GFX_POKEMON_RANGER_F:\n        case OBJ_EVENT_GFX_MASTER_BEAUTY:\n        case OBJ_EVENT_GFX_RUIN_MANIAC:\n        case OBJ_EVENT_GFX_PSYCHIC_M:\n        case OBJ_EVENT_GFX_PSYCHIC_F:\n        case OBJ_EVENT_GFX_AROMA_LADY:\n        case OBJ_EVENT_GFX_TWIN:\n        case OBJ_EVENT_GFX_YOUNG_COUPLE_M:\n        case OBJ_EVENT_GFX_YOUNG_COUPLE_F:\n        case OBJ_EVENT_GFX_ENGINEER:\n        case OBJ_EVENT_GFX_JUGGLER:\n        case OBJ_EVENT_GFX_TAMER:\n        case OBJ_EVENT_GFX_POKEMON_BREEDER:\n        case OBJ_EVENT_GFX_LADY:\n        case OBJ_EVENT_GFX_ROCKER_2:\n            return MOVEMENT_TYPE_RAISE_HAND_AND_JUMP;\n        case OBJ_EVENT_GFX_TUBER_M_WATER:\n        case OBJ_EVENT_GFX_SWIMMER_M_WATER:\n        case OBJ_EVENT_GFX_SWIMMER_F_WATER:\n        case OBJ_EVENT_GFX_SWIMMER_F_WATER_2:\n            return MOVEMENT_TYPE_RAISE_HAND_AND_SWIM;\n        default:\n            return MOVEMENT_TYPE_RAISE_HAND_AND_STOP;\n    }\n}\n\nstatic u16 GetTrainerFlagFromScript(const u8 *script)\n/*\n * The trainer flag is a little-endian short located +2 from\n * the script pointer, assuming the trainerbattle command is\n * first in the script.  Because scripts are unaligned, and\n * because the ARM processor requires shorts to be 16-bit\n * aligned, this function needs to perform explicit bitwise\n * operations to get the correct flag.\n *\n * 5c XX YY ZZ ...\n *       -- --\n */\n{\n    u16 trainerFlag;\n\n    script += 2;\n    trainerFlag = script[0];\n    trainerFlag |= script[1] << 8;\n    return trainerFlag;\n}\n\nstatic int GetRematchIdx(const struct RematchData * vsSeekerData, u16 trainerFlagIdx)\n{\n    int i;\n\n    for (i = 0; i < NELEMS(sRematches); i++)\n    {\n        if (vsSeekerData[i].trainerIdxs[0] == trainerFlagIdx)\n            return i;\n    }\n\n    return -1;\n}\n\nstatic bool32 IsThisTrainerRematchable(u32 localId)\n{\n    if (!gSaveBlock1Ptr->trainerRematches[localId])\n        return FALSE;\n    return TRUE;\n}\n\nstatic void ClearAllTrainerRematchStates(void)\n{\n    u32 i;\n\n    for (i = 0; i < NELEMS(gSaveBlock1Ptr->trainerRematches); i++)\n        gSaveBlock1Ptr->trainerRematches[i] = 0;\n}\n\nstatic bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo)\n{\n    s16 x;\n    s16 y;\n\n    PlayerGetDestCoords(&x, &y);\n    x -= 7;\n    y -= 7;\n\n    if (   x - 7 <= trainerInfo->xCoord\n        && x + 7 >= trainerInfo->xCoord\n        && y - 5 <= trainerInfo->yCoord\n        && y + 5 >= trainerInfo->yCoord\n        && ObjectEventIdIsSane(trainerInfo->objectEventId) == 1)\n        return TRUE;\n    return FALSE;\n}\n\nstatic u8 GetNextAvailableRematchTrainer(const struct RematchData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr)\n{\n    int i, j;\n\n    for (i = 0; i < NELEMS(sRematches); i++)\n    {\n        if (vsSeekerData[i].trainerIdxs[0] == trainerFlagNo)\n        {\n            *idxPtr = i;\n            for (j = 1; j < MAX_REMATCH_PARTIES; j++)\n            {\n                if (vsSeekerData[i].trainerIdxs[j] == TRAINER_NONE)\n                    return j - 1;\n                if (vsSeekerData[i].trainerIdxs[j] == SKIP)\n                    continue;\n                if (HasTrainerBeenFought(vsSeekerData[i].trainerIdxs[j]))\n                    continue;\n                return j;\n            }\n            return j - 1;\n        }\n    }\n\n    *idxPtr = 0;\n    return 0;\n}\n\nstatic u8 GetRematchableTrainerLocalId(void)\n{\n    u8 idx;\n    u32 i;\n\n    for (i = 0; sVsSeeker->trainerInfo[i].localId != 0xFF; i++)\n    {\n        if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1)\n        {\n            if (HasTrainerBeenFought(sVsSeeker->trainerInfo[i].trainerIdx) != 1 || GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[i].trainerIdx, &idx))\n                return sVsSeeker->trainerInfo[i].localId;\n        }\n    }\n\n    return 0xFF;\n}\n\nstatic void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script)\n{\n    UnfreezeObjectEvent(&gObjectEvents[trainerInfo->objectEventId]);\n    ScriptMovement_StartObjectMovementScript(trainerInfo->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, script);\n}\n\nstatic u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx)\n{\n    s32 i;\n    s32 j;\n\n    for (i = 0; i < vsSeekerIdx; i++)\n    {\n        if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1 && sVsSeeker->trainerInfo[i].trainerIdx == trainerIdx)\n        {\n            for (j = 0; j < sVsSeeker->numRematchableTrainers; j++)\n            {\n                if (sVsSeeker->trainerIdxArray[j] == sVsSeeker->trainerInfo[i].trainerIdx)\n                    return VSSEEKER_SINGLE_RESP_YES;\n            }\n            return VSSEEKER_SINGLE_RESP_NO;\n        }\n    }\n    return VSSEEKER_SINGLE_RESP_RAND;\n}\n\nstatic void StartAllRespondantIdleMovements(void)\n{\n    u8 dummy = 0;\n    s32 i;\n    s32 j;\n\n    for (i = 0; i < sVsSeeker->numRematchableTrainers; i++)\n    {\n        for (j = 0; sVsSeeker->trainerInfo[j].localId != 0xFF; j++)\n        {\n            if (sVsSeeker->trainerInfo[j].trainerIdx == sVsSeeker->trainerIdxArray[i])\n            {\n                struct ObjectEvent *objectEvent = &gObjectEvents[sVsSeeker->trainerInfo[j].objectEventId];\n\n                if (ObjectEventIdIsSane(sVsSeeker->trainerInfo[j].objectEventId) == 1)\n                    SetTrainerMovementType(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]);\n                OverrideMovementTypeForObjectEvent(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]);\n                gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[j].localId] = GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[j].trainerIdx, &dummy);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/wild_encounter.c",
    "content": "#include \"global.h\"\n#include \"random.h\"\n#include \"wild_encounter.h\"\n#include \"event_data.h\"\n#include \"fieldmap.h\"\n#include \"random.h\"\n#include \"roamer.h\"\n#include \"field_player_avatar.h\"\n#include \"battle_setup.h\"\n#include \"overworld.h\"\n#include \"metatile_behavior.h\"\n#include \"event_scripts.h\"\n#include \"script.h\"\n#include \"link.h\"\n#include \"quest_log.h\"\n#include \"constants/maps.h\"\n#include \"constants/abilities.h\"\n#include \"constants/items.h\"\n#include \"constants/layouts.h\"\n#include \"constants/weather.h\"\n\n#define MAX_ENCOUNTER_RATE 1600\n\n#define HEADER_NONE 0xFFFF\n\nstruct WildEncounterData\n{\n    u32 rngState;\n    u16 prevMetatileBehavior;\n    u16 encounterRateBuff;\n    u8 stepsSinceLastEncounter;\n    u8 abilityEffect;\n    u16 leadMonHeldItem;\n};\n\nstatic EWRAM_DATA struct WildEncounterData sWildEncounterData = {};\nstatic EWRAM_DATA bool8 sWildEncountersDisabled = FALSE;\n\nstatic bool8 UnlockedTanobyOrAreNotInTanoby(void);\nstatic u32 GenerateUnownPersonalityByLetter(u8 letter);\nstatic bool8 IsWildLevelAllowedByRepel(u8 level);\nstatic void ApplyFluteEncounterRateMod(u32 *rate);\nstatic u8 GetFluteEncounterRateModType(void);\nstatic void ApplyCleanseTagEncounterRateMod(u32 *rate);\nstatic bool8 IsLeadMonHoldingCleanseTag(void);\nstatic u16 WildEncounterRandom(void);\nstatic void AddToWildEncounterRateBuff(u8 encouterRate);\nstatic u8 PickWildMonNature(void);\nstatic bool8 IsAbilityAllowingEncounter(u8 level);\nstatic bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex);\nstatic bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u8 type, u8 numMon, u8 *monIndex);\nstatic u8 ViridianForestNuzlockeOverride(const struct WildPokemonInfo * info, u8 slot);\n\n#include \"data/wild_encounters.h\"\n\nstatic const u8 sUnownLetterSlots[][LAND_WILD_COUNT] = {\n  //  A   A   A   A   A   A   A   A   A   A   A   ?\n    { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 27},\n  //  C   C   C   D   D   D   H   H   H   U   U   O\n    { 2,  2,  2,  3,  3,  3,  7,  7,  7, 20, 20, 14},\n  //  N   N   N   N   S   S   S   S   I   I   E   E\n    {13, 13, 13, 13, 18, 18, 18, 18,  8,  8,  4,  4},\n  //  P   P   L   L   J   J   R   R   R   Q   Q   Q\n    {15, 15, 11, 11,  9,  9, 17, 17, 17, 16, 16, 16},\n  //  Y   Y   T   T   G   G   G   F   F   F   K   K\n    {24, 24, 19, 19,  6,  6,  6,  5,  5,  5, 10, 10},\n  //  V   V   V   W   W   W   X   X   M   M   B   B\n    {21, 21, 21, 22, 22, 22, 23, 23, 12, 12,  1,  1},\n  //  Z   Z   Z   Z   Z   Z   Z   Z   Z   Z   Z   !\n    {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26},\n};\n\nvoid DisableWildEncounters(bool8 state)\n{\n    sWildEncountersDisabled = state;\n}\n\nstatic u8 ChooseWildMonIndex_Land(void)\n{\n    u8 rand = Random() % ENCOUNTER_CHANCE_LAND_MONS_TOTAL;\n\n    if (rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_0)\n        return 0;\n    else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_0 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_1)\n        return 1;\n    else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_1 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_2)\n        return 2;\n    else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_2 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_3)\n        return 3;\n    else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_3 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_4)\n        return 4;\n    else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_4 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_5)\n        return 5;\n    else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_5 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_6)\n        return 6;\n    else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_6 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_7)\n        return 7;\n    else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_7 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_8)\n        return 8;\n    else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_8 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_9)\n        return 9;\n    else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_9 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_10)\n        return 10;\n    else\n        return 11;\n}\n\nstatic u8 ChooseWildMonIndex_WaterRock(void)\n{\n    u8 rand = Random() % ENCOUNTER_CHANCE_WATER_MONS_TOTAL;\n\n    if (rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_0)\n        return 0;\n    else if (rand >= ENCOUNTER_CHANCE_WATER_MONS_SLOT_0 && rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_1)\n        return 1;\n    else if (rand >= ENCOUNTER_CHANCE_WATER_MONS_SLOT_1 && rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_2)\n        return 2;\n    else if (rand >= ENCOUNTER_CHANCE_WATER_MONS_SLOT_2 && rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_3)\n        return 3;\n    else\n        return 4;\n}\n\nstatic u8 ChooseWildMonIndex_Fishing(u8 rod)\n{\n    u8 wildMonIndex = 0;\n    u8 rand = Random() % max(max(ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_TOTAL, ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_TOTAL),\n                             ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_TOTAL);\n\n    switch (rod)\n    {\n    case OLD_ROD:\n        if (rand < ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_0)\n            wildMonIndex = 0;\n        else\n            wildMonIndex = 1;\n        break;\n    case GOOD_ROD:\n        if (rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2)\n            wildMonIndex = 2;\n        if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2 && rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3)\n            wildMonIndex = 3;\n        if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3 && rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_4)\n            wildMonIndex = 4;\n        break;\n    case SUPER_ROD:\n        if (rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5)\n            wildMonIndex = 5;\n        if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6)\n            wildMonIndex = 6;\n        if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7)\n            wildMonIndex = 7;\n        if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8)\n            wildMonIndex = 8;\n        if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_9)\n            wildMonIndex = 9;\n        break;\n    }\n    return wildMonIndex;\n}\n\nstatic u8 ChooseWildMonLevel(const struct WildPokemon * info)\n{\n    u8 lo;\n    u8 hi;\n    u8 mod;\n    u8 res;\n    if (info->maxLevel >= info->minLevel)\n    {\n        lo = info->minLevel;\n        hi = info->maxLevel;\n    }\n    else\n    {\n        lo = info->maxLevel;\n        hi = info->minLevel;\n    }\n    mod = hi - lo + 1;\n    res = Random() % mod;\n\n    // check ability for max level mon\n    if (!GetMonData(&gPlayerParty[0], MON_DATA_IS_EGG))\n    {\n        u8 ability = GetMonAbility(&gPlayerParty[0]);\n        if (ability == ABILITY_HUSTLE || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_PRESSURE)\n        {\n            if (Random() % 2 == 0)\n                return hi;\n\n            if (res != 0)\n                res--;\n        }\n    }\n\n    return lo + res;\n}\n\nstatic u16 GetCurrentMapWildMonHeaderId(void)\n{\n    u32 i;\n\n    for (i = 0; ; i++)\n    {\n        const struct WildPokemonHeader * wildHeader = &gWildMonHeaders[i];\n        if (wildHeader->mapGroup == MAP_GROUP(UNDEFINED))\n            break;\n\n        if (gWildMonHeaders[i].mapGroup == gSaveBlock1Ptr->location.mapGroup &&\n            gWildMonHeaders[i].mapNum == gSaveBlock1Ptr->location.mapNum)\n        {\n            if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SIX_ISLAND_ALTERING_CAVE) &&\n                gSaveBlock1Ptr->location.mapNum == MAP_NUM(SIX_ISLAND_ALTERING_CAVE))\n            {\n                u16 alteringCaveId = VarGet(VAR_ALTERING_CAVE_WILD_SET);\n                if (alteringCaveId >= NUM_ALTERING_CAVE_TABLES)\n                    alteringCaveId = 0;\n\n                i += alteringCaveId;\n            }\n\n            if (!UnlockedTanobyOrAreNotInTanoby())\n                break;\n            return i;\n        }\n    }\n\n    return HEADER_NONE;\n}\n\nstatic bool8 UnlockedTanobyOrAreNotInTanoby(void)\n{\n    if (FlagGet(FLAG_SYS_UNLOCKED_TANOBY_RUINS))\n        return TRUE;\n    if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER))\n        return TRUE;\n    if (!(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER)\n    ||  gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER)\n    ||  gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER)\n    ||  gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER)\n    ||  gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER)\n    ||  gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER)\n    ||  gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER)\n    ))\n        return TRUE;\n    return FALSE;\n}\n\nstatic void GenerateWildMon(u16 species, u8 level, u8 slot)\n{\n    bool32 checkCuteCharm;\n    u32 personality;\n    s8 chamber;\n    ZeroEnemyPartyMons();\n\n    checkCuteCharm = TRUE;\n\n    switch (gSpeciesInfo[species].genderRatio)\n    {\n    case MON_MALE:\n    case MON_FEMALE:\n    case MON_GENDERLESS:\n        checkCuteCharm = FALSE;\n        break;\n    }\n\n    if (species != SPECIES_UNOWN)\n    {\n        if (checkCuteCharm\n        && !GetMonData(&gPlayerParty[0], MON_DATA_IS_EGG)\n        && GetMonAbility(&gPlayerParty[0]) == ABILITY_CUTE_CHARM\n        && Random() % 3 != 0)\n        {\n            u16 leadingMonSpecies = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES);\n            u32 leadingMonPersonality = GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY);\n            u8 gender = GetGenderFromSpeciesAndPersonality(leadingMonSpecies, leadingMonPersonality);\n\n            // misses mon is genderless check, although no genderless mon can have cute charm as ability\n            if (gender == MON_FEMALE)\n                gender = MON_MALE;\n            else\n                gender = MON_FEMALE;\n\n            CreateMonWithGenderNatureLetter(&gEnemyParty[0], species, level, USE_RANDOM_IVS, gender, PickWildMonNature(), 0);\n            return;\n        }\n        CreateMonWithNature(&gEnemyParty[0], species, level, USE_RANDOM_IVS, PickWildMonNature());\n    }\n    else\n    {\n        chamber = gSaveBlock1Ptr->location.mapNum - MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER);\n        personality = GenerateUnownPersonalityByLetter(sUnownLetterSlots[chamber][slot]);\n        CreateMon(&gEnemyParty[0], species, level, USE_RANDOM_IVS, TRUE, personality, FALSE, 0);\n    }\n}\n\nstatic u32 GenerateUnownPersonalityByLetter(u8 letter)\n{\n    u32 personality;\n    do\n    {\n        personality = (Random() << 16) | Random();\n    } while (GetUnownLetterByPersonalityLoByte(personality) != letter);\n    return personality;\n}\n\nu8 GetUnownLetterByPersonalityLoByte(u32 personality)\n{\n    return GET_UNOWN_LETTER(personality);\n}\n\nenum\n{\n    WILD_AREA_LAND,\n    WILD_AREA_WATER,\n    WILD_AREA_ROCKS,\n    WILD_AREA_FISHING,\n};\n\n#define WILD_CHECK_REPEL    0x1\n#define WILD_CHECK_KEEN_EYE 0x2\n\nstatic bool8 TryGenerateWildMon(const struct WildPokemonInfo * info, u8 area, u8 flags)\n{\n    u8 slot = 0;\n    u8 level;\n    switch (area)\n    {\n    case WILD_AREA_LAND:\n        if (TryGetAbilityInfluencedWildMonIndex(info->wildPokemon, TYPE_STEEL, ABILITY_MAGNET_PULL, &slot))\n            break;\n        if (TryGetAbilityInfluencedWildMonIndex(info->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &slot))\n            break;\n\n        slot = ChooseWildMonIndex_Land();\n        break;\n    case WILD_AREA_WATER:\n        if (TryGetAbilityInfluencedWildMonIndex(info->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &slot))\n            break;\n\n        slot = ChooseWildMonIndex_WaterRock();\n        break;\n    case WILD_AREA_ROCKS:\n        slot = ChooseWildMonIndex_WaterRock();\n        break;\n    }\n    if(gMapHeader.mapLayoutId == LAYOUT_VIRIDIAN_FOREST && gSaveBlock1Ptr->keyFlags.nuzlocke == 1)\n        slot = ViridianForestNuzlockeOverride(info, slot);\n    level = ChooseWildMonLevel(&info->wildPokemon[slot]);\n    if (flags & WILD_CHECK_REPEL && !IsWildLevelAllowedByRepel(level))\n    {\n        return FALSE;\n    }\n    if (flags & WILD_CHECK_KEEN_EYE && !IsAbilityAllowingEncounter(level))\n        return FALSE;\n\n    GenerateWildMon(info->wildPokemon[slot].species, level, slot);\n    return TRUE;\n}\n\nstatic u16 GenerateFishingEncounter(const struct WildPokemonInfo * info, u8 rod)\n{\n    u8 slot = ChooseWildMonIndex_Fishing(rod);\n    u8 level = ChooseWildMonLevel(&info->wildPokemon[slot]);\n    GenerateWildMon(info->wildPokemon[slot].species, level, slot);\n    return info->wildPokemon[slot].species;\n}\n\nstatic bool8 DoWildEncounterRateDiceRoll(u16 encounterRate)\n{\n    if (WildEncounterRandom() % MAX_ENCOUNTER_RATE < encounterRate)\n        return TRUE;\n    return FALSE;\n}\n\nstatic bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility)\n{\n    encounterRate *= 16;\n    if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))\n        encounterRate = encounterRate * 80 / 100;\n    encounterRate += sWildEncounterData.encounterRateBuff * 16 / 200;\n    ApplyFluteEncounterRateMod(&encounterRate);\n    ApplyCleanseTagEncounterRateMod(&encounterRate);\n    if (!ignoreAbility)\n    {\n        switch (sWildEncounterData.abilityEffect)\n        {\n        case 1:\n            encounterRate /= 2;\n            break;\n        case 2:\n            encounterRate *= 2;\n            break;\n        }\n    }\n    if (encounterRate > MAX_ENCOUNTER_RATE)\n        encounterRate = MAX_ENCOUNTER_RATE;\n    return DoWildEncounterRateDiceRoll(encounterRate);\n}\n\nstatic u8 GetAbilityEncounterRateModType(void)\n{\n    sWildEncounterData.abilityEffect = 0;\n    if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))\n    {\n        u8 ability = GetMonAbility(&gPlayerParty[0]);\n        if (ability == ABILITY_STENCH)\n            sWildEncounterData.abilityEffect = 1;\n        else if (ability == ABILITY_ILLUMINATE)\n            sWildEncounterData.abilityEffect = 2;\n        else if (ability == ABILITY_WHITE_SMOKE)\n            sWildEncounterData.abilityEffect = 1;\n        else if (ability == ABILITY_ARENA_TRAP)\n            sWildEncounterData.abilityEffect = 2;\n        else if (ability == ABILITY_SAND_VEIL && gSaveBlock1Ptr->weather == WEATHER_SANDSTORM)\n            sWildEncounterData.abilityEffect = 1;\n    }\n    return sWildEncounterData.abilityEffect;\n}\n\nstatic bool8 DoGlobalWildEncounterDiceRoll(void)\n{\n    if ((Random() % 100) >= 60)\n        return FALSE;\n    return TRUE;\n}\n\nbool8 StandardWildEncounter(u32 currMetatileAttrs, u16 previousMetatileBehavior)\n{\n    u16 headerId;\n    struct Roamer * roamer;\n    const struct WildPokemonInfo * currentLandTable;\n    const struct WildPokemonInfo * currentWaterTable;\n\n    headerId = GetCurrentMapWildMonHeaderId();\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        currentLandTable = gWildMonHeaders[headerId].landMonsInfo_FR;\n        currentWaterTable = gWildMonHeaders[headerId].waterMonsInfo_FR;\n    }\n    else\n    {\n        currentLandTable = gWildMonHeaders[headerId].landMonsInfo_LG;\n        currentWaterTable = gWildMonHeaders[headerId].waterMonsInfo_LG;\n    }\n\n    if (sWildEncountersDisabled == TRUE)\n        return FALSE;\n\n    if (headerId != HEADER_NONE)\n    {\n        if (ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_ENCOUNTER_TYPE) == TILE_ENCOUNTER_LAND)\n        {\n            if (currentLandTable == NULL)\n                return FALSE;\n            else if (previousMetatileBehavior != ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR) && !DoGlobalWildEncounterDiceRoll())\n                return FALSE;\n            if (DoWildEncounterRateTest(currentLandTable->encounterRate, FALSE) != TRUE)\n            {\n                AddToWildEncounterRateBuff(currentLandTable->encounterRate);\n                return FALSE;\n            }\n\n            else if (TryStartRoamerEncounter() == TRUE)\n            {\n                roamer = &gSaveBlock1Ptr->roamer;\n                if (!IsWildLevelAllowedByRepel(roamer->level))\n                {\n                    return FALSE;\n                }\n\n                StartRoamerBattle();\n                return TRUE;\n            }\n            else\n            {\n\n                // try a regular wild land encounter\n                if (TryGenerateWildMon(currentLandTable, WILD_AREA_LAND, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE)\n                {\n                    StartWildBattle();\n                    return TRUE;\n                }\n                else\n                {\n                    AddToWildEncounterRateBuff(currentLandTable->encounterRate);\n                }\n            }\n        }\n        else if (ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_ENCOUNTER_TYPE) == TILE_ENCOUNTER_WATER\n                 || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR)) == TRUE))\n        {\n            if (currentWaterTable == NULL)\n                return FALSE;\n            else if (previousMetatileBehavior != ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR) && !DoGlobalWildEncounterDiceRoll())\n                return FALSE;\n            else if (DoWildEncounterRateTest(currentWaterTable->encounterRate, FALSE) != TRUE)\n            {\n                AddToWildEncounterRateBuff(currentWaterTable->encounterRate);\n                return FALSE;\n            }\n\n            if (TryStartRoamerEncounter() == TRUE)\n            {\n                roamer = &gSaveBlock1Ptr->roamer;\n                if (!IsWildLevelAllowedByRepel(roamer->level))\n                {\n                    return FALSE;\n                }\n\n                StartRoamerBattle();\n                return TRUE;\n            }\n            else // try a regular surfing encounter\n            {\n                if (TryGenerateWildMon(currentWaterTable, WILD_AREA_WATER, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE)\n                {\n                    StartWildBattle();\n                    return TRUE;\n                }\n                else\n                {\n                    AddToWildEncounterRateBuff(currentWaterTable->encounterRate);\n                }\n            }\n        }\n    }\n\n    return FALSE;\n}\n\nvoid RockSmashWildEncounter(void)\n{\n    u16 headerIdx = GetCurrentMapWildMonHeaderId();\n    const struct WildPokemonInfo * currentRockTable;\n\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        currentRockTable = gWildMonHeaders[headerIdx].rockSmashMonsInfo_FR;\n    }\n    else\n    {\n        currentRockTable = gWildMonHeaders[headerIdx].rockSmashMonsInfo_LG;\n    }\n    if (headerIdx == HEADER_NONE)\n        gSpecialVar_Result = FALSE;\n    else if (currentRockTable == NULL)\n        gSpecialVar_Result = FALSE;\n    else if (DoWildEncounterRateTest(currentRockTable->encounterRate, TRUE) != TRUE)\n        gSpecialVar_Result = FALSE;\n    else if (TryGenerateWildMon(currentRockTable, WILD_AREA_ROCKS, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE)\n    {\n        StartWildBattle();\n        gSpecialVar_Result = TRUE;\n    }\n    else\n        gSpecialVar_Result = FALSE;\n}\n\nbool8 SweetScentWildEncounter(void)\n{\n    s16 x, y;\n    u16 headerId;\n    const struct WildPokemonInfo * currentLandTable;\n    const struct WildPokemonInfo * currentWaterTable;\n\n    headerId = GetCurrentMapWildMonHeaderId();\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        currentLandTable = gWildMonHeaders[headerId].landMonsInfo_FR;\n        currentWaterTable = gWildMonHeaders[headerId].waterMonsInfo_FR;\n    }\n    else\n    {\n        currentLandTable = gWildMonHeaders[headerId].landMonsInfo_LG;\n        currentWaterTable = gWildMonHeaders[headerId].waterMonsInfo_LG;\n    }\n\n    PlayerGetDestCoords(&x, &y);\n    if (headerId != HEADER_NONE)\n    {\n        if (MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_ENCOUNTER_TYPE) == TILE_ENCOUNTER_LAND)\n        {\n            if (TryStartRoamerEncounter() == TRUE)\n            {\n                StartRoamerBattle();\n                return TRUE;\n            }\n\n            if (currentLandTable == NULL)\n                return FALSE;\n\n            TryGenerateWildMon(currentLandTable, WILD_AREA_LAND, 0);\n\n            StartWildBattle();\n            return TRUE;\n        }\n        else if (MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_ENCOUNTER_TYPE) == TILE_ENCOUNTER_WATER)\n        {\n            if (TryStartRoamerEncounter() == TRUE)\n            {\n                StartRoamerBattle();\n                return TRUE;\n            }\n\n            if (currentWaterTable == NULL)\n                return FALSE;\n\n            TryGenerateWildMon(currentWaterTable, WILD_AREA_WATER, 0);\n            StartWildBattle();\n            return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nbool8 DoesCurrentMapHaveFishingMons(void)\n{\n    u16 headerIdx = GetCurrentMapWildMonHeaderId();\n    const struct WildPokemonInfo * currentFishTable;\n\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        currentFishTable = gWildMonHeaders[headerIdx].fishingMonsInfo_FR;\n    }\n    else\n    {\n        currentFishTable = gWildMonHeaders[headerIdx].fishingMonsInfo_LG;\n    }\n    if (headerIdx == HEADER_NONE)\n        return FALSE;\n    if (currentFishTable == NULL)\n        return FALSE;\n    return TRUE;\n}\n\nvoid FishingWildEncounter(u8 rod)\n{\n    const struct WildPokemonInfo * currentFishTable;\n\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        currentFishTable = gWildMonHeaders[GetCurrentMapWildMonHeaderId()].fishingMonsInfo_FR;\n    }\n    else\n    {\n        currentFishTable = gWildMonHeaders[GetCurrentMapWildMonHeaderId()].fishingMonsInfo_LG;\n    }\n    GenerateFishingEncounter(currentFishTable, rod);\n    IncrementGameStat(GAME_STAT_FISHING_CAPTURES);\n    StartWildBattle();\n}\n\nu16 GetLocalWildMon(bool8 *isWaterMon)\n{\n    u16 headerId;\n    const struct WildPokemonInfo * landMonsInfo;\n    const struct WildPokemonInfo * waterMonsInfo;\n\n    headerId = GetCurrentMapWildMonHeaderId();\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        landMonsInfo = gWildMonHeaders[headerId].landMonsInfo_FR;\n        waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo_FR;\n    }\n    else\n    {\n        landMonsInfo = gWildMonHeaders[headerId].landMonsInfo_LG;\n        waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo_LG;\n    }\n\n    *isWaterMon = FALSE;\n    if (headerId == HEADER_NONE)\n        return SPECIES_NONE;\n    // Neither\n    if (landMonsInfo == NULL && waterMonsInfo == NULL)\n        return SPECIES_NONE;\n        // Land Pokemon\n    else if (landMonsInfo != NULL && waterMonsInfo == NULL)\n        return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species;\n        // Water Pokemon\n    else if (landMonsInfo == NULL && waterMonsInfo != NULL)\n    {\n        *isWaterMon = TRUE;\n        return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species;\n    }\n    // Either land or water Pokemon\n    if ((Random() % 100) < 80)\n    {\n        return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species;\n    }\n    else\n    {\n        *isWaterMon = TRUE;\n        return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species;\n    }\n}\n\nu16 GetLocalWaterMon(void)\n{\n    u16 headerId = GetCurrentMapWildMonHeaderId();\n\n    if (headerId != HEADER_NONE)\n    {\n        const struct WildPokemonInfo * waterMonsInfo;\n        if(gSaveBlock1Ptr->keyFlags.version == 0)\n        {\n            waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo_FR;\n        }\n        else\n        {\n            waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo_LG;\n        }\n\n        if (waterMonsInfo)\n            return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species;\n    }\n    return SPECIES_NONE;\n}\n\nbool8 UpdateRepelCounter(void)\n{\n    u16 steps;\n\n    if (InUnionRoom() == TRUE)\n        return FALSE;\n\n    if (gQuestLogState == QL_STATE_PLAYBACK)\n        return FALSE;\n\n    steps = VarGet(VAR_REPEL_STEP_COUNT);\n\n    if (steps != 0)\n    {\n        steps--;\n        VarSet(VAR_REPEL_STEP_COUNT, steps);\n        if (steps == 0)\n        {\n            ScriptContext_SetupScript(EventScript_RepelWoreOff);\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nstatic bool8 IsWildLevelAllowedByRepel(u8 wildLevel)\n{\n    u32 i;\n\n    if (!VarGet(VAR_REPEL_STEP_COUNT))\n        return TRUE;\n\n    if(gSaveBlock1Ptr->keyFlags.nuzlocke == 1 && NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == FALSE) //if Nuzlocke & first encounter not done Repel doesn't work.\n        return TRUE;\n\n    for (i = 0; i < PARTY_SIZE; i++)\n    {\n        if (GetMonData(&gPlayerParty[i], MON_DATA_HP) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))\n        {\n            u8 ourLevel = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);\n\n            if (wildLevel < ourLevel)\n                return FALSE;\n            else\n                return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nstatic void ApplyFluteEncounterRateMod(u32 *encounterRate)\n{\n    switch (GetFluteEncounterRateModType())\n    {\n    case 1:\n        *encounterRate += *encounterRate / 2;\n        break;\n    case 2:\n        *encounterRate = *encounterRate / 2;\n        break;\n    }\n}\n\nstatic u8 GetFluteEncounterRateModType(void)\n{\n    if (FlagGet(FLAG_SYS_WHITE_FLUTE_ACTIVE) == TRUE)\n        return 1;\n    else if (FlagGet(FLAG_SYS_BLACK_FLUTE_ACTIVE) == TRUE)\n        return 2;\n    else\n        return 0;\n}\n\nstatic void ApplyCleanseTagEncounterRateMod(u32 *encounterRate)\n{\n    if (IsLeadMonHoldingCleanseTag())\n        *encounterRate = *encounterRate * 2 / 3;\n}\n\nstatic bool8 IsLeadMonHoldingCleanseTag(void)\n{\n    if (sWildEncounterData.leadMonHeldItem == ITEM_CLEANSE_TAG)\n        return TRUE;\n    else\n        return FALSE;\n}\n\nvoid SeedWildEncounterRng(u16 seed)\n{\n    sWildEncounterData.rngState = seed;\n    ResetEncounterRateModifiers();\n}\n\nstatic u16 WildEncounterRandom(void)\n{\n    sWildEncounterData.rngState = ISO_RANDOMIZE2(sWildEncounterData.rngState);\n    return sWildEncounterData.rngState >> 16;\n}\n\nstatic u8 GetMapBaseEncounterCooldown(u8 encounterType)\n{\n    u16 headerIdx = GetCurrentMapWildMonHeaderId();\n    const struct WildPokemonInfo * currentLandTable;\n    const struct WildPokemonInfo * currentWaterTable;\n\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        currentLandTable = gWildMonHeaders[headerIdx].landMonsInfo_FR;\n        currentWaterTable = gWildMonHeaders[headerIdx].waterMonsInfo_FR;\n    }\n    else\n    {\n        currentLandTable = gWildMonHeaders[headerIdx].landMonsInfo_LG;\n        currentWaterTable = gWildMonHeaders[headerIdx].waterMonsInfo_LG;\n    }\n\n    if (headerIdx == HEADER_NONE)\n        return 0xFF;\n    if (encounterType == TILE_ENCOUNTER_LAND)\n    {\n        if (currentLandTable == NULL)\n            return 0xFF;\n        if (currentLandTable->encounterRate >= 80)\n            return 0;\n        if (currentLandTable->encounterRate < 10)\n            return 8;\n        return 8 - (currentLandTable->encounterRate / 10);\n    }\n    if (encounterType == TILE_ENCOUNTER_WATER)\n    {\n        if (currentWaterTable == NULL)\n            return 0xFF;\n        if (currentWaterTable->encounterRate >= 80)\n            return 0;\n        if (currentWaterTable->encounterRate < 10)\n            return 8;\n        return 8 - (currentWaterTable->encounterRate / 10);\n    }\n    return 0xFF;\n}\n\nvoid ResetEncounterRateModifiers(void)\n{\n    sWildEncounterData.encounterRateBuff = 0;\n    sWildEncounterData.stepsSinceLastEncounter = 0;\n}\n\nstatic bool8 HandleWildEncounterCooldown(u32 currMetatileAttrs)\n{\n    u8 encounterType = ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_ENCOUNTER_TYPE);\n    u32 minSteps;\n    u32 encRate;\n    if (encounterType == TILE_ENCOUNTER_NONE)\n        return FALSE;\n    minSteps = GetMapBaseEncounterCooldown(encounterType);\n    if (minSteps == 0xFF)\n        return FALSE;\n    minSteps *= 256;\n    encRate = 5 * 256;\n    switch (GetFluteEncounterRateModType())\n    {\n    case 1:\n        minSteps -= minSteps / 2;\n        encRate += encRate / 2;\n        break;\n    case 2:\n        minSteps *= 2;\n        encRate /= 2;\n        break;\n    }\n    sWildEncounterData.leadMonHeldItem = GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM);\n    if (IsLeadMonHoldingCleanseTag() == TRUE)\n    {\n        minSteps += minSteps / 3;\n        encRate -= encRate / 3;\n    }\n    switch (GetAbilityEncounterRateModType())\n    {\n    case 1:\n        minSteps *= 2;\n        encRate /= 2;\n        break;\n    case 2:\n        minSteps /= 2;\n        encRate *= 2;\n        break;\n    }\n    minSteps /= 256;\n    encRate /= 256;\n    if (sWildEncounterData.stepsSinceLastEncounter >= minSteps)\n        return TRUE;\n    sWildEncounterData.stepsSinceLastEncounter++;\n    if ((Random() % 100) < encRate)\n        return TRUE;\n    return FALSE;\n}\n\nbool8 TryStandardWildEncounter(u32 currMetatileAttrs)\n{\n    if (!HandleWildEncounterCooldown(currMetatileAttrs))\n    {\n        sWildEncounterData.prevMetatileBehavior = ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR);\n        return FALSE;\n    }\n    else if (StandardWildEncounter(currMetatileAttrs, sWildEncounterData.prevMetatileBehavior) == TRUE)\n    {\n        sWildEncounterData.encounterRateBuff = 0;\n        sWildEncounterData.stepsSinceLastEncounter = 0;\n        sWildEncounterData.prevMetatileBehavior = ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR);\n        return TRUE;\n    }\n    else\n    {\n        sWildEncounterData.prevMetatileBehavior = ExtractMetatileAttribute(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR);\n        return FALSE;\n    }\n}\n\nstatic void AddToWildEncounterRateBuff(u8 encounterRate)\n{\n    if (VarGet(VAR_REPEL_STEP_COUNT) == 0)\n        sWildEncounterData.encounterRateBuff += encounterRate;\n    else\n        sWildEncounterData.encounterRateBuff = 0;\n}\n\nstatic u8 PickWildMonNature(void)\n{\n    // check synchronize for a pokemon with the same ability\n    if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)\n        && GetMonAbility(&gPlayerParty[0]) == ABILITY_SYNCHRONIZE\n        && Random() % 2 == 0)\n    {\n        return GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY) % 25;\n    }\n\n    // random nature\n    return Random() % 25;\n}\n\nstatic bool8 IsAbilityAllowingEncounter(u8 level)\n{\n    u8 ability;\n\n    if (GetMonData(&gPlayerParty[0], MON_DATA_IS_EGG))\n        return TRUE;\n\n    ability = GetMonAbility(&gPlayerParty[0]);\n    if (ability == ABILITY_KEEN_EYE || ability == ABILITY_INTIMIDATE)\n    {\n        u8 playerMonLevel = GetMonData(&gPlayerParty[0], MON_DATA_LEVEL);\n        if (playerMonLevel > 5 && level <= playerMonLevel - 5 && !(Random() % 2))\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex)\n{\n    if (GetMonData(&gPlayerParty[0], MON_DATA_IS_EGG))\n        return FALSE;\n    else if (GetMonAbility(&gPlayerParty[0]) != ability)\n        return FALSE;\n    else if (Random() % 2 != 0)\n        return FALSE;\n\n    return TryGetRandomWildMonIndexByType(wildMon, type, LAND_WILD_COUNT, monIndex);\n}\n\nstatic bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u8 type, u8 numMon, u8 *monIndex)\n{\n    u8 validIndexes[numMon]; // variable length array, an interesting feature\n    u8 i, validMonCount;\n\n    for (i = 0; i < numMon; i++)\n        validIndexes[i] = 0;\n\n    for (validMonCount = 0, i = 0; i < numMon; i++)\n    {\n        if (gSpeciesInfo[wildMon[i].species].types[0] == type || gSpeciesInfo[wildMon[i].species].types[1] == type)\n            validIndexes[validMonCount++] = i;\n    }\n\n    if (validMonCount == 0 || validMonCount == numMon)\n        return FALSE;\n\n    *monIndex = validIndexes[Random() % validMonCount];\n    return TRUE;\n}\n\n// Grinding for Brock can be miserable in Nuzlocke Mode, especially with Challenge Mode on.\n// This gives a 47% chance of a Caterpie/Weedle encounter to be bumped up to a Metapod/Kakuna one.\n// If that happens, there's a 50% chance the level will be bumped up to the max possible as well.\n// This will increase experience gains in Viridian Forest to make the grind less tedious.\n// Once the player gets the fossil from Mt. Moon, this function stops modifying the encounters,\n// it also does not interfere with the first encounter for this area.\n// When this is active, there is a ~42.4% chance to encounter a Caterpie/Weedle and\n// ~52.6% chance to encounter Metapod/Kakuna. Pikachu takes up the last 5%.\n\nstatic u8 ViridianForestNuzlockeOverride(const struct WildPokemonInfo * info, u8 slot)\n{\n    u8 rand;\n\n    if(FlagGet(FLAG_GOT_FOSSIL_FROM_MT_MOON))\n        return slot;\n\n    if (NuzlockeFlagGet(GetCurrentRegionMapSectionId()) == FALSE)\n    {   // not a dupe && first encounter; don't modify slot to preserve first encounter odds\n        if(!IsWildMonNuzlockeDupe(info->wildPokemon[slot].species))\n            return slot;\n    }\n\n    switch(slot)\n    {\n        case 0: // Caterpie\n        case 2: // ^\n        case 4: // ^\n            rand = Random() % 100;\n            if(rand < 47) //switch to a Metapod\n            {\n                if(rand < 24) //highest level Metapod\n                {\n                    if(gSaveBlock1Ptr->keyFlags.version == 0) //FR\n                        slot = 6;\n                    else\n                        slot = 10;\n                }\n                else //not highest level\n                {\n                    if(gSaveBlock1Ptr->keyFlags.version == 0) //FR\n                        slot = 6;\n                    else\n                    {\n                        switch(slot)\n                            {\n                                case 1:\n                                    slot = 7;\n                                    break;\n                                case 3:\n                                    slot = 10;\n                                    break;\n                                case 5:\n                                    slot = 8;\n                                    break;\n                            }\n                    }\n                }\n            }\n            break;\n        case 1: // Weedle\n        case 3: // ^\n        case 5: // ^\n            rand = Random() % 100;\n            if(rand < 47) //switch to a Kakuna\n            {\n                if(rand < 24) //highest level Kakuna\n                {\n                    if(gSaveBlock1Ptr->keyFlags.version == 1) //LG\n                        slot = 6;\n                    else\n                        slot = 10;\n                }\n                else //not highest level\n                {\n                    if(gSaveBlock1Ptr->keyFlags.version == 1) //LG\n                        slot = 6;\n                    else\n                    {\n                        switch(slot)\n                        {\n                            case 1:\n                                slot = 7;\n                                break;\n                            case 3:\n                                slot = 10;\n                                break;\n                            case 5:\n                                slot = 8;\n                                break;\n                        }\n                    }\n                }\n            }\n            break; \n    }\n    return slot;\n}"
  },
  {
    "path": "src/wild_pokemon_area.c",
    "content": "#include \"global.h\"\n#include \"field_specials.h\"\n#include \"event_data.h\"\n#include \"wild_encounter.h\"\n#include \"roamer.h\"\n#include \"overworld.h\"\n#include \"pokedex.h\"\n#include \"pokedex_area_markers.h\"\n#include \"constants/region_map_sections.h\"\n#include \"constants/maps.h\"\n\nstruct RoamerPair\n{\n    u16 roamer;\n    u16 starter;\n};\n\nstatic s32 GetRoamerIndex(u16 species);\nstatic s32 GetRoamerPokedexAreaMarkers(u16 species, struct Subsprite * subsprites);\nstatic bool32 IsSpeciesOnMap(const struct WildPokemonHeader * data, s32 species);\nstatic bool32 IsSpeciesInEncounterTable(const struct WildPokemonInfo * pokemon, s32 species, s32 count);\nstatic u16 GetMapSecIdFromWildMonHeader(const struct WildPokemonHeader * header);\nstatic bool32 FindDexAreaByMapSec(u16 mapSecId, const u16 (*lut)[2], s32 count, s32 * lutIdx_p, u16 * tableIdx_p);\n\nstatic const u16 sDexAreas_Kanto[][2] = {\n    { MAPSEC_PALLET_TOWN,         DEX_AREA_PALLET_TOWN },\n    { MAPSEC_VIRIDIAN_CITY,       DEX_AREA_VIRIDIAN_CITY },\n    { MAPSEC_PEWTER_CITY,         DEX_AREA_PEWTER_CITY },\n    { MAPSEC_CERULEAN_CITY,       DEX_AREA_CERULEAN_CITY },\n    { MAPSEC_LAVENDER_TOWN,       DEX_AREA_LAVENDER_TOWN },\n    { MAPSEC_VERMILION_CITY,      DEX_AREA_VERMILION_CITY },\n    { MAPSEC_CELADON_CITY,        DEX_AREA_CELADON_CITY },\n    { MAPSEC_FUCHSIA_CITY,        DEX_AREA_FUCHSIA_CITY },\n    { MAPSEC_CINNABAR_ISLAND,     DEX_AREA_CINNABAR_ISLAND },\n    { MAPSEC_INDIGO_PLATEAU,      DEX_AREA_INDIGO_PLATEAU },\n    { MAPSEC_SAFFRON_CITY,        DEX_AREA_SAFFRON_CITY },\n    { MAPSEC_ROUTE_4_POKECENTER,  DEX_AREA_ROUTE_4 },\n    { MAPSEC_ROUTE_10_POKECENTER, DEX_AREA_ROUTE_10 },\n    { MAPSEC_ROUTE_1,             DEX_AREA_ROUTE_1 },\n    { MAPSEC_ROUTE_2,             DEX_AREA_ROUTE_2 },\n    { MAPSEC_ROUTE_3,             DEX_AREA_ROUTE_3 },\n    { MAPSEC_ROUTE_4,             DEX_AREA_ROUTE_4 },\n    { MAPSEC_ROUTE_5,             DEX_AREA_ROUTE_5 },\n    { MAPSEC_ROUTE_6,             DEX_AREA_ROUTE_6 },\n    { MAPSEC_ROUTE_7,             DEX_AREA_ROUTE_7 },\n    { MAPSEC_ROUTE_8,             DEX_AREA_ROUTE_8 },\n    { MAPSEC_ROUTE_9,             DEX_AREA_ROUTE_9 },\n    { MAPSEC_ROUTE_10,            DEX_AREA_ROUTE_10 },\n    { MAPSEC_ROUTE_11,            DEX_AREA_ROUTE_11 },\n    { MAPSEC_ROUTE_12,            DEX_AREA_ROUTE_12 },\n    { MAPSEC_ROUTE_13,            DEX_AREA_ROUTE_13 },\n    { MAPSEC_ROUTE_14,            DEX_AREA_ROUTE_14 },\n    { MAPSEC_ROUTE_15,            DEX_AREA_ROUTE_15 },\n    { MAPSEC_ROUTE_16,            DEX_AREA_ROUTE_16 },\n    { MAPSEC_ROUTE_17,            DEX_AREA_ROUTE_17 },\n    { MAPSEC_ROUTE_18,            DEX_AREA_ROUTE_18 },\n    { MAPSEC_ROUTE_19,            DEX_AREA_ROUTE_19 },\n    { MAPSEC_ROUTE_20,            DEX_AREA_ROUTE_20 },\n    { MAPSEC_ROUTE_21,            DEX_AREA_ROUTE_21 },\n    { MAPSEC_ROUTE_22,            DEX_AREA_ROUTE_22 },\n    { MAPSEC_ROUTE_23,            DEX_AREA_ROUTE_23 },\n    { MAPSEC_ROUTE_24,            DEX_AREA_ROUTE_24 },\n    { MAPSEC_ROUTE_25,            DEX_AREA_ROUTE_25 },\n    { MAPSEC_VIRIDIAN_FOREST,     DEX_AREA_VIRIDIAN_FOREST },\n    { MAPSEC_MT_MOON,             DEX_AREA_MT_MOON },\n    { MAPSEC_S_S_ANNE,            DEX_AREA_VERMILION_CITY },\n    { MAPSEC_UNDERGROUND_PATH,    DEX_AREA_SAFFRON_CITY },\n    { MAPSEC_UNDERGROUND_PATH_2,  DEX_AREA_SAFFRON_CITY },\n    { MAPSEC_DIGLETTS_CAVE,       DEX_AREA_DIGLETTS_CAVE },\n    { MAPSEC_KANTO_VICTORY_ROAD,  DEX_AREA_VICTORY_ROAD },\n    { MAPSEC_ROCKET_HIDEOUT,      DEX_AREA_CELADON_CITY },\n    { MAPSEC_SILPH_CO,            DEX_AREA_SAFFRON_CITY },\n    { MAPSEC_POKEMON_MANSION,     DEX_AREA_POKEMON_MANSION },\n    { MAPSEC_KANTO_SAFARI_ZONE,   DEX_AREA_SAFARI_ZONE },\n    { MAPSEC_POKEMON_LEAGUE,      DEX_AREA_VICTORY_ROAD },\n    { MAPSEC_ROCK_TUNNEL,         DEX_AREA_ROCK_TUNNEL },\n    { MAPSEC_SEAFOAM_ISLANDS,     DEX_AREA_SEAFOAM_ISLANDS },\n    { MAPSEC_POKEMON_TOWER,       DEX_AREA_POKEMON_TOWER },\n    { MAPSEC_CERULEAN_CAVE,       DEX_AREA_CERULEAN_CAVE },\n    { MAPSEC_POWER_PLANT,         DEX_AREA_POWER_PLANT }\n};\n\nstatic const u16 sDexAreas_Sevii1[][2] = {\n\t{ MAPSEC_KINDLE_ROAD,    DEX_AREA_KINDLE_ROAD },\n\t{ MAPSEC_TREASURE_BEACH, DEX_AREA_TREASURE_BEACH },\n\t{ MAPSEC_ONE_ISLAND,     DEX_AREA_ONE_ISLAND },\n\t{ MAPSEC_MT_EMBER,       DEX_AREA_MT_EMBER }    \n};\n\nstatic const u16 sDexAreas_Sevii2[][2] = {\n\t{ MAPSEC_CAPE_BRINK, DEX_AREA_CAPE_BRINK },\n\t{ MAPSEC_TWO_ISLAND, DEX_AREA_TWO_ISLAND }    \n};\n\nstatic const u16 sDexAreas_Sevii3[][2] = {\n\t{ MAPSEC_BOND_BRIDGE,     DEX_AREA_BOND_BRIDGE },\n    { MAPSEC_UNDERWATER_124,  DEX_AREA_BOND_BRIDGE },\n\t{ MAPSEC_THREE_ISLE_PORT, DEX_AREA_THREE_ISLE_PATH },\n\t{ MAPSEC_THREE_ISLAND,    DEX_AREA_THREE_ISLAND },\n\t{ MAPSEC_BERRY_FOREST,    DEX_AREA_BERRY_FOREST },\n\t{ MAPSEC_THREE_ISLE_PATH, DEX_AREA_THREE_ISLE_PATH }    \n};\n\nstatic const u16 sDexAreas_Sevii4[][2] = {\n\t{ MAPSEC_FOUR_ISLAND,  DEX_AREA_FOUR_ISLAND },\n\t{ MAPSEC_ICEFALL_CAVE, DEX_AREA_ICEFALL_CAVE }    \n};\n\nstatic const u16 sDexAreas_Sevii5[][2] = {\n\t{ MAPSEC_RESORT_GORGEOUS,  DEX_AREA_RESORT_GORGEOUS },\n\t{ MAPSEC_WATER_LABYRINTH,  DEX_AREA_WATER_LABYRINTH },\n\t{ MAPSEC_FIVE_ISLE_MEADOW, DEX_AREA_FIVE_ISLE_MEADOW },\n\t{ MAPSEC_MEMORIAL_PILLAR,  DEX_AREA_MEMORIAL_PILLAR },\n\t{ MAPSEC_FIVE_ISLAND,      DEX_AREA_FIVE_ISLAND },\n\t{ MAPSEC_ROCKET_WAREHOUSE, DEX_AREA_FIVE_ISLE_MEADOW },\n\t{ MAPSEC_LOST_CAVE,        DEX_AREA_LOST_CAVE }    \n};\n\nstatic const u16 sDexAreas_Sevii6[][2] = {\n\t{ MAPSEC_OUTCAST_ISLAND, DEX_AREA_OUTCAST_ISLAND },\n\t{ MAPSEC_GREEN_PATH,     DEX_AREA_GREEN_PATH },\n\t{ MAPSEC_WATER_PATH,     DEX_AREA_WATER_PATH },\n\t{ MAPSEC_RUIN_VALLEY,    DEX_AREA_RUIN_VALLEY },\n\t{ MAPSEC_DOTTED_HOLE,    DEX_AREA_DOTTED_HOLE },\n\t{ MAPSEC_PATTERN_BUSH,   DEX_AREA_PATTERN_BUSH },\n\t{ MAPSEC_ALTERING_CAVE,  DEX_AREA_ALTERING_CAVE }    \n};\n\nstatic const u16 sDexAreas_Sevii7[][2] = {\n\t{ MAPSEC_TRAINER_TOWER,   DEX_AREA_TRAINER_TOWER },\n\t{ MAPSEC_CANYON_ENTRANCE, DEX_AREA_CANYON_ENTRANCE },\n\t{ MAPSEC_SEVAULT_CANYON,  DEX_AREA_SEVAULT_CANYON },\n\t{ MAPSEC_TANOBY_RUINS,    DEX_AREA_TANOBY_RUINS },\n\t{ MAPSEC_MONEAN_CHAMBER,  DEX_AREA_TANOBY_CHAMBER },\n\t{ MAPSEC_LIPTOO_CHAMBER,  DEX_AREA_TANOBY_CHAMBER },\n\t{ MAPSEC_WEEPTH_CHAMBER,  DEX_AREA_TANOBY_CHAMBER },\n\t{ MAPSEC_DILFORD_CHAMBER, DEX_AREA_TANOBY_CHAMBER },\n\t{ MAPSEC_SCUFIB_CHAMBER,  DEX_AREA_TANOBY_CHAMBER },\n\t{ MAPSEC_RIXY_CHAMBER,    DEX_AREA_TANOBY_CHAMBER },\n\t{ MAPSEC_VIAPOIS_CHAMBER, DEX_AREA_TANOBY_CHAMBER }    \n};\n\nstatic const struct\n{\n    const u16 (*table)[2];\n    s32 count;\n} sSeviiDexAreas[] = {\n    { sDexAreas_Sevii1, ARRAY_COUNT(sDexAreas_Sevii1) },\n    { sDexAreas_Sevii2, ARRAY_COUNT(sDexAreas_Sevii2) },\n    { sDexAreas_Sevii3, ARRAY_COUNT(sDexAreas_Sevii3) },\n    { sDexAreas_Sevii4, ARRAY_COUNT(sDexAreas_Sevii4) },\n    { sDexAreas_Sevii5, ARRAY_COUNT(sDexAreas_Sevii5) },\n    { sDexAreas_Sevii6, ARRAY_COUNT(sDexAreas_Sevii6) },\n    { sDexAreas_Sevii7, ARRAY_COUNT(sDexAreas_Sevii7) }\n};\n\nstatic const struct RoamerPair sRoamerPairs[] = {\n    { SPECIES_ENTEI,   SPECIES_BULBASAUR  },\n    { SPECIES_SUICUNE, SPECIES_CHARMANDER },\n    { SPECIES_RAIKOU,  SPECIES_SQUIRTLE   }\n};\n\n// Scans for the given species and populates 'subsprites' with the area markers.\n// Returns the number of areas where the species was found.\ns32 GetSpeciesPokedexAreaMarkers(u16 species, struct Subsprite * subsprites)\n{\n    s32 areaCount;\n    s32 j;\n    s32 mapSecId;\n    u16 dexArea;\n    s32 tableIndex;\n    s32 seviiAreas;\n    s32 alteringCaveCount;\n    s32 alteringCaveNum;\n    s32 i;\n\n    if (GetRoamerIndex(species) >= 0)\n        return GetRoamerPokedexAreaMarkers(species, subsprites);\n\n    seviiAreas = GetUnlockedSeviiAreas();\n    alteringCaveCount = 0;\n    alteringCaveNum = VarGet(VAR_ALTERING_CAVE_WILD_SET);\n    if (alteringCaveNum >= NUM_ALTERING_CAVE_TABLES)\n        alteringCaveNum = 0;\n    for (i = 0, areaCount = 0; gWildMonHeaders[i].mapGroup != MAP_GROUP(UNDEFINED); i++)\n    {   \n        if((i == 133 || i == 134) && !FlagGet(FLAG_SYS_GAME_CLEAR)) //Safari Zone NW and NE\n        {\n            continue; //skip Safari Zone expansion if not Champion\n        }\n        mapSecId = GetMapSecIdFromWildMonHeader(&gWildMonHeaders[i]);\n        if (mapSecId == MAPSEC_ALTERING_CAVE)\n        {\n            alteringCaveCount++;\n            if (alteringCaveNum != alteringCaveCount - 1)\n                continue;\n        }\n        if (IsSpeciesOnMap(&gWildMonHeaders[i], species))\n        {\n            // Search for all dex areas associated with this MAPSEC.\n            // In the vanilla game each MAPSEC only has at most one DEX_AREA.\n            tableIndex = 0;\n            while (FindDexAreaByMapSec(mapSecId, sDexAreas_Kanto, ARRAY_COUNT(sDexAreas_Kanto), &tableIndex, &dexArea))\n            {\n                if (dexArea != DEX_AREA_NONE)\n                    GetAreaMarkerSubsprite(areaCount++, dexArea, subsprites);\n            }\n\n            for (j = 0; j < ARRAY_COUNT(sSeviiDexAreas); j++)\n            {\n                if ((seviiAreas >> j) & 1)\n                {\n                    // Search for all dex areas associated with this MAPSEC in this unlocked Sevii Island\n                    tableIndex = 0;\n                    while (FindDexAreaByMapSec(mapSecId, sSeviiDexAreas[j].table, sSeviiDexAreas[j].count, &tableIndex, &dexArea))\n                    {\n                        if (dexArea != DEX_AREA_NONE)\n                            GetAreaMarkerSubsprite(areaCount++, dexArea, subsprites);\n                    }\n                }\n            }\n        }\n    }\n\n    return areaCount;\n}\n\nstatic s32 GetRoamerIndex(u16 species)\n{\n    s32 i;\n    for (i = 0; i < ARRAY_COUNT(sRoamerPairs); i++)\n    {\n        if (sRoamerPairs[i].roamer == species)\n            return i;\n    }\n\n    return -1;\n}\n\nstatic s32 GetRoamerPokedexAreaMarkers(u16 species, struct Subsprite * subsprites)\n{\n    u16 mapSecId;\n    s32 roamerIdx;\n    u16 dexArea;\n    s32 tableIndex;\n\n    // Make sure that this is a roamer species, and that it corresponds to the player's starter.\n    roamerIdx = GetRoamerIndex(species);\n    if (roamerIdx < 0)\n        return 0;\n    if (sRoamerPairs[roamerIdx].roamer != GetRoamerSpecies())\n        return 0;\n\n    mapSecId = GetRoamerLocationMapSectionId();\n    tableIndex = 0;\n    if (FindDexAreaByMapSec(mapSecId, sDexAreas_Kanto, ARRAY_COUNT(sDexAreas_Kanto), &tableIndex, &dexArea))\n    {\n        if (dexArea != DEX_AREA_NONE)\n        {\n            GetAreaMarkerSubsprite(0, dexArea, subsprites);\n            return 1;\n        }\n    }\n    return 0;\n}\n\nstatic bool32 IsSpeciesOnMap(const struct WildPokemonHeader * data, s32 species)\n{\n    if(gSaveBlock1Ptr->keyFlags.version == 0)\n    {\n        if (IsSpeciesInEncounterTable(data->landMonsInfo_FR, species, LAND_WILD_COUNT))\n            return TRUE;\n        if (IsSpeciesInEncounterTable(data->waterMonsInfo_FR, species, WATER_WILD_COUNT))\n            return TRUE;\n        if (IsSpeciesInEncounterTable(data->fishingMonsInfo_FR, species, FISH_WILD_COUNT))\n            return TRUE;\n        if (IsSpeciesInEncounterTable(data->rockSmashMonsInfo_FR, species, ROCK_WILD_COUNT))\n            return TRUE;\n    }\n    else\n    {\n        if (IsSpeciesInEncounterTable(data->landMonsInfo_LG, species, LAND_WILD_COUNT))\n            return TRUE;\n        if (IsSpeciesInEncounterTable(data->waterMonsInfo_LG, species, WATER_WILD_COUNT))\n            return TRUE;\n        if (IsSpeciesInEncounterTable(data->fishingMonsInfo_LG, species, FISH_WILD_COUNT))\n            return TRUE;\n        if (IsSpeciesInEncounterTable(data->rockSmashMonsInfo_LG, species, ROCK_WILD_COUNT))\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool32 IsSpeciesInEncounterTable(const struct WildPokemonInfo * info, s32 species, s32 count)\n{\n    s32 i;\n    if (info != NULL)\n    {\n        for (i = 0; i < count; i++)\n        {\n            if (info->wildPokemon[i].species == species)\n                return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nstatic u16 GetMapSecIdFromWildMonHeader(const struct WildPokemonHeader * header)\n{\n    return Overworld_GetMapHeaderByGroupAndId(header->mapGroup, header->mapNum)->regionMapSectionId;\n}\n\n// Search a MAPSEC -> DEX_AREA table for the given mapsec.\n// Assigns the DEX_AREA (if found) to 'dexArea', and the first unread table index to 'index'.\n// Returns TRUE if DEX_AREA was found, FALSE otherwise.\nstatic bool32 FindDexAreaByMapSec(u16 mapSecId, const u16 (*table)[2], s32 count, s32 * index, u16 * dexArea)\n{\n    s32 i;\n    for (i = *index; i < count; i++)\n    {\n        if (table[i][0] == mapSecId)\n        {\n            *dexArea = table[i][1];\n            *index = i + 1;\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n"
  },
  {
    "path": "src/window.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n\nu8 gWindowClearTile;\nvoid *gWindowBgTilemapBuffers[4];\n\nEWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0};\n\nstatic u8 GetNumActiveWindowsOnBg(u8 bgId);\n\nstatic const struct WindowTemplate sDummyWindowTemplate = {0xFF, 0, 0, 0, 0, 0, 0};\n\nstatic void nullsub_8(void)\n{\n\n}\n\nbool16 InitWindows(const struct WindowTemplate *templates)\n{\n    int i;\n    void *bgTilemapBuffer;\n    int j;\n    u8 bgLayer;\n    u16 bgSize;\n    u8 *allocatedTilemapBuffer;\n    int allocatedBaseBlock;\n\n    for (i = 0; i < 4; ++i)\n    {\n        bgTilemapBuffer = GetBgTilemapBuffer(i);\n        if (bgTilemapBuffer != NULL)\n            gWindowBgTilemapBuffers[i] = nullsub_8;\n        else\n            gWindowBgTilemapBuffers[i] = bgTilemapBuffer;\n    }\n\n    for (i = 0; i < WINDOWS_MAX; ++i)\n    {\n        gWindows[i].window = sDummyWindowTemplate;\n        gWindows[i].tileData = NULL;\n    }\n\n    for (i = 0, allocatedBaseBlock = 0, bgLayer = templates[i].bg; bgLayer != 0xFF && i < WINDOWS_MAX; ++i, bgLayer = templates[i].bg)\n    {\n        if (gWindowTileAutoAllocEnabled == TRUE)\n        {\n            allocatedBaseBlock = BgTileAllocOp(bgLayer, 0, templates[i].width * templates[i].height, BG_TILE_FIND_FREE_SPACE);\n            if (allocatedBaseBlock == -1)\n                return FALSE;\n        }\n\n        if (gWindowBgTilemapBuffers[bgLayer] == NULL)\n        {\n            bgSize = GetBgAttribute(bgLayer, BG_ATTR_MAPSIZE);\n\n            if (bgSize != 0xFFFF)\n            {\n                allocatedTilemapBuffer = Alloc(bgSize);\n\n                if (allocatedTilemapBuffer == NULL)\n                {\n                    FreeAllWindowBuffers();\n                    return FALSE;\n                }\n\n                for (j = 0; j < bgSize; ++j)\n                    allocatedTilemapBuffer[j] = 0;\n\n                gWindowBgTilemapBuffers[bgLayer] = allocatedTilemapBuffer;\n                SetBgTilemapBuffer(bgLayer, allocatedTilemapBuffer);\n            }\n        }\n\n        allocatedTilemapBuffer = Alloc((u16)(0x20 * (templates[i].width * templates[i].height)));\n\n        if (allocatedTilemapBuffer == NULL)\n        {\n            if ((GetNumActiveWindowsOnBg(bgLayer) == 0) && (gWindowBgTilemapBuffers[bgLayer] != nullsub_8))\n            {\n                Free(gWindowBgTilemapBuffers[bgLayer]);\n                gWindowBgTilemapBuffers[bgLayer] = allocatedTilemapBuffer;\n            }\n\n            return FALSE;\n        }\n\n        gWindows[i].tileData = allocatedTilemapBuffer;\n        gWindows[i].window = templates[i];\n\n        if (gWindowTileAutoAllocEnabled == TRUE)\n        {\n            gWindows[i].window.baseBlock = allocatedBaseBlock;\n            BgTileAllocOp(bgLayer, allocatedBaseBlock, templates[i].width * templates[i].height, BG_TILE_ALLOC);\n        }\n    }\n\n    gWindowClearTile = 0;\n    return TRUE;\n}\n\nu16 AddWindow(const struct WindowTemplate *template)\n{\n    u16 win;\n    u8 bgLayer;\n    int allocatedBaseBlock;\n    u16 bgSize;\n    u8 *allocatedTilemapBuffer;\n    int i;\n\n    for (win = 0; win < WINDOWS_MAX; ++win)\n    {\n        if ((bgLayer = gWindows[win].window.bg) == 0xFF)\n            break;\n    }\n\n    if (win == WINDOWS_MAX)\n        return 0xFF;\n\n    bgLayer = template->bg;\n    allocatedBaseBlock = 0;\n\n    if (gWindowTileAutoAllocEnabled == TRUE)\n    {\n        allocatedBaseBlock = BgTileAllocOp(bgLayer, 0, template->width * template->height, BG_TILE_FIND_FREE_SPACE);\n\n        if (allocatedBaseBlock == -1)\n            return 0xFF;\n    }\n\n    if (gWindowBgTilemapBuffers[bgLayer] == NULL)\n    {\n        bgSize = GetBgAttribute(bgLayer, BG_ATTR_MAPSIZE);\n\n        if (bgSize != 0xFFFF)\n        {\n            allocatedTilemapBuffer = Alloc(bgSize);\n\n            if (allocatedTilemapBuffer == NULL)\n                return 0xFF;\n\n            for (i = 0; i < bgSize; ++i)\n                allocatedTilemapBuffer[i] = 0;\n\n            gWindowBgTilemapBuffers[bgLayer] = allocatedTilemapBuffer;\n            SetBgTilemapBuffer(bgLayer, allocatedTilemapBuffer);\n        }\n    }\n\n    allocatedTilemapBuffer = Alloc((u16)(0x20 * (template->width * template->height)));\n\n    if (allocatedTilemapBuffer == NULL)\n    {\n        if ((GetNumActiveWindowsOnBg(bgLayer) == 0) && (gWindowBgTilemapBuffers[bgLayer] != nullsub_8))\n        {\n            Free(gWindowBgTilemapBuffers[bgLayer]);\n            gWindowBgTilemapBuffers[bgLayer] = allocatedTilemapBuffer;\n        }\n        return 0xFF;\n    }\n\n    gWindows[win].tileData = allocatedTilemapBuffer;\n    gWindows[win].window = *template;\n\n    if (gWindowTileAutoAllocEnabled == TRUE)\n    {\n        gWindows[win].window.baseBlock = allocatedBaseBlock;\n        BgTileAllocOp(bgLayer, allocatedBaseBlock, gWindows[win].window.width * gWindows[win].window.height, BG_TILE_ALLOC);\n    }\n\n    return win;\n}\n\nvoid RemoveWindow(u8 windowId)\n{\n    u8 bgLayer = gWindows[windowId].window.bg;\n\n    if (gWindowTileAutoAllocEnabled == TRUE)\n    {\n        BgTileAllocOp(bgLayer, gWindows[windowId].window.baseBlock, gWindows[windowId].window.width * gWindows[windowId].window.height, BG_TILE_FREE);\n    }\n\n    gWindows[windowId].window = sDummyWindowTemplate;\n\n    if (GetNumActiveWindowsOnBg(bgLayer) == 0)\n    {\n        if (gWindowBgTilemapBuffers[bgLayer] != nullsub_8)\n        {\n            Free(gWindowBgTilemapBuffers[bgLayer]);\n            gWindowBgTilemapBuffers[bgLayer] = 0;\n        }\n    }\n\n    if (gWindows[windowId].tileData != NULL)\n    {\n        Free(gWindows[windowId].tileData);\n        gWindows[windowId].tileData = NULL;\n    }\n}\n\nvoid FreeAllWindowBuffers(void)\n{\n    int i;\n\n    for (i = 0; i < 4; ++i)\n    {\n        if (gWindowBgTilemapBuffers[i] != NULL && gWindowBgTilemapBuffers[i] != nullsub_8)\n        {\n            Free(gWindowBgTilemapBuffers[i]);\n            gWindowBgTilemapBuffers[i] = NULL;\n        }\n    }\n\n    for (i = 0; i < WINDOWS_MAX; ++i)\n    {\n        if (gWindows[i].tileData != NULL)\n        {\n            Free(gWindows[i].tileData);\n            gWindows[i].tileData = NULL;\n        }\n    }\n}\n\nvoid CopyWindowToVram(u8 windowId, u8 mode)\n{\n    struct Window windowLocal = gWindows[windowId];\n    u16 windowSize = 32 * (windowLocal.window.width * windowLocal.window.height);\n\n    switch (mode)\n    {\n        case COPYWIN_MAP:\n            CopyBgTilemapBufferToVram(windowLocal.window.bg);\n            break;\n        case COPYWIN_GFX:\n            LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock);\n            break;\n        case COPYWIN_FULL:\n            LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock);\n            CopyBgTilemapBufferToVram(windowLocal.window.bg);\n            break;\n    }\n}\n\nvoid PutWindowTilemap(u8 windowId)\n{\n    struct Window windowLocal = gWindows[windowId];\n\n    WriteSequenceToBgTilemapBuffer(\n        windowLocal.window.bg,\n        GetBgAttribute(windowLocal.window.bg, BG_ATTR_BASETILE) + windowLocal.window.baseBlock,\n        windowLocal.window.tilemapLeft,\n        windowLocal.window.tilemapTop,\n        windowLocal.window.width,\n        windowLocal.window.height,\n        windowLocal.window.paletteNum,\n        1);\n}\n\nvoid PutWindowRectTilemapOverridePalette(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 palette)\n{\n    struct Window windowLocal = gWindows[windowId];\n    u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.bg, BG_ATTR_BASETILE);\n    int i;\n\n    for (i = 0; i < height; ++i)\n    {\n        WriteSequenceToBgTilemapBuffer(\n            windowLocal.window.bg,\n            currentRow,\n            windowLocal.window.tilemapLeft + x,\n            windowLocal.window.tilemapTop + y + i,\n            width,\n            1,\n            palette,\n            1);\n\n        currentRow += windowLocal.window.width;\n    }\n}\n\nvoid ClearWindowTilemap(u8 windowId)\n{\n    struct Window windowLocal = gWindows[windowId];\n\n    FillBgTilemapBufferRect(\n        windowLocal.window.bg,\n        gWindowClearTile,\n        windowLocal.window.tilemapLeft,\n        windowLocal.window.tilemapTop,\n        windowLocal.window.width,\n        windowLocal.window.height,\n        windowLocal.window.paletteNum);\n}\n\nvoid PutWindowRectTilemap(u8 windowId, u8 x, u8 y, u8 width, u8 height)\n{\n    struct Window windowLocal = gWindows[windowId];\n    u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.bg, BG_ATTR_BASETILE);\n    int i;\n\n    for (i = 0; i < height; ++i)\n    {\n        WriteSequenceToBgTilemapBuffer(\n            windowLocal.window.bg,\n            currentRow,\n            windowLocal.window.tilemapLeft + x,\n            windowLocal.window.tilemapTop + y + i,\n            width,\n            1,\n            windowLocal.window.paletteNum,\n            1);\n\n        currentRow += windowLocal.window.width;\n    }\n}\n\nvoid BlitBitmapToWindow(u8 windowId, const u8 *pixels, u16 x, u16 y, u16 width, u16 height)\n{\n    BlitBitmapRectToWindow(windowId, pixels, 0, 0, width, height, x, y, width, height);\n}\n\nvoid BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight)\n{\n    struct Bitmap sourceRect;\n    struct Bitmap destRect;\n\n    sourceRect.pixels = (u8 *)pixels;\n    sourceRect.width = srcWidth;\n    sourceRect.height = srcHeight;\n\n    destRect.pixels = gWindows[windowId].tileData;\n    destRect.width = 8 * gWindows[windowId].window.width;\n    destRect.height = 8 * gWindows[windowId].window.height;\n\n    BlitBitmapRect4Bit(&sourceRect, &destRect, srcX, srcY, destX, destY, rectWidth, rectHeight, 0);\n}\n\nvoid BlitBitmapRectToWindowWithColorKey(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 colorKey)\n{\n    struct Bitmap sourceRect;\n    struct Bitmap destRect;\n\n    sourceRect.pixels = (u8 *)pixels;\n    sourceRect.width = srcWidth;\n    sourceRect.height = srcHeight;\n\n    destRect.pixels = gWindows[windowId].tileData;\n    destRect.width = 8 * gWindows[windowId].window.width;\n    destRect.height = 8 * gWindows[windowId].window.height;\n\n    BlitBitmapRect4Bit(&sourceRect, &destRect, srcX, srcY, destX, destY, rectWidth, rectHeight, colorKey);\n}\n\nvoid FillWindowPixelRect(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height)\n{\n    struct Bitmap pixelRect;\n\n    pixelRect.pixels = gWindows[windowId].tileData;\n    pixelRect.width = 8 * gWindows[windowId].window.width;\n    pixelRect.height = 8 * gWindows[windowId].window.height;\n\n    FillBitmapRect4Bit(&pixelRect, x, y, width, height, fillValue);\n}\n\nvoid CopyToWindowPixelBuffer(u8 windowId, const void *src, u16 size, u16 tileOffset)\n{\n    if (size != 0)\n        CpuCopy16(src, gWindows[windowId].tileData + (0x20 * tileOffset), size);\n    else\n        LZ77UnCompWram(src, gWindows[windowId].tileData + (0x20 * tileOffset));\n}\n\nvoid FillWindowPixelBuffer(u8 windowId, u8 fillValue)\n{\n    int fillSize = gWindows[windowId].window.width * gWindows[windowId].window.height;\n    CpuFastFill8(fillValue, gWindows[windowId].tileData, 0x20 * fillSize);\n}\n\n#define MOVE_TILES_DOWN(a)                                                      \\\n{                                                                               \\\n    destOffset = i + (a);                                                       \\\n    srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \\\n    if (srcOffset < size)                                                       \\\n        *(u32 *)(tileData + destOffset) = *(u32 *)(tileData + srcOffset);         \\\n    else                                                                        \\\n        *(u32 *)(tileData + destOffset) = fillValue32;                           \\\n    distanceLoop++;                                                             \\\n}\n\n#define MOVE_TILES_UP(a)                                                        \\\n{                                                                               \\\n    destOffset = i + (a);                                                       \\\n    srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \\\n    if (srcOffset < size)                                                       \\\n        *(u32 *)(tileData - destOffset) = *(u32 *)(tileData - srcOffset);         \\\n    else                                                                        \\\n        *(u32 *)(tileData - destOffset) = fillValue32;                           \\\n    distanceLoop++;                                                             \\\n}\n\nvoid ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue)\n{\n    struct WindowTemplate window = gWindows[windowId].window;\n    u8 *tileData = gWindows[windowId].tileData;\n    u32 fillValue32 = (fillValue << 24) | (fillValue << 16) | (fillValue << 8) | fillValue;\n    s32 size = window.height * window.width * 32;\n    u32 width = window.width;\n    s32 i;\n    s32 srcOffset, destOffset;\n    u32 distanceLoop;\n\n    switch (direction)\n    {\n    case 0:\n        for (i = 0; i < size; i += 32)\n        {\n            distanceLoop = distance;\n            MOVE_TILES_DOWN(0)\n            MOVE_TILES_DOWN(4)\n            MOVE_TILES_DOWN(8)\n            MOVE_TILES_DOWN(12)\n            MOVE_TILES_DOWN(16)\n            MOVE_TILES_DOWN(20)\n            MOVE_TILES_DOWN(24)\n            MOVE_TILES_DOWN(28)\n        }\n        break;\n    case 1:\n        tileData += size - 4;\n        for (i = 0; i < size; i += 32)\n        {\n            distanceLoop = distance;\n            MOVE_TILES_UP(0)\n            MOVE_TILES_UP(4)\n            MOVE_TILES_UP(8)\n            MOVE_TILES_UP(12)\n            MOVE_TILES_UP(16)\n            MOVE_TILES_UP(20)\n            MOVE_TILES_UP(24)\n            MOVE_TILES_UP(28)\n        }\n        break;\n    case 2:\n        break;\n    }\n}\n\nvoid CallWindowFunction(u8 windowId, WindowFunc func)\n{\n    struct WindowTemplate window = gWindows[windowId].window;\n    func(window.bg, window.tilemapLeft, window.tilemapTop, window.width, window.height, window.paletteNum);\n}\n\nbool8 SetWindowAttribute(u8 windowId, u8 attributeId, u32 value)\n{\n    switch (attributeId)\n    {\n    case WINDOW_TILEMAP_LEFT:\n        gWindows[windowId].window.tilemapLeft = value;\n        return FALSE;\n    case WINDOW_TILEMAP_TOP:\n        gWindows[windowId].window.tilemapTop = value;\n        return FALSE;\n    case WINDOW_PALETTE_NUM:\n        gWindows[windowId].window.paletteNum = value;\n        return FALSE;\n    case WINDOW_BASE_BLOCK:\n        gWindows[windowId].window.baseBlock = value;\n        return FALSE;\n    case WINDOW_TILE_DATA:\n    case WINDOW_BG:\n    case WINDOW_WIDTH:\n    case WINDOW_HEIGHT:\n    default:\n        return TRUE;\n    }\n}\n\nu32 GetWindowAttribute(u8 windowId, u8 attributeId)\n{\n    switch (attributeId)\n    {\n    case WINDOW_BG:\n        return gWindows[windowId].window.bg;\n    case WINDOW_TILEMAP_LEFT:\n        return gWindows[windowId].window.tilemapLeft;\n    case WINDOW_TILEMAP_TOP:\n        return gWindows[windowId].window.tilemapTop;\n    case WINDOW_WIDTH:\n        return gWindows[windowId].window.width;\n    case WINDOW_HEIGHT:\n        return gWindows[windowId].window.height;\n    case WINDOW_PALETTE_NUM:\n        return gWindows[windowId].window.paletteNum;\n    case WINDOW_BASE_BLOCK:\n        return gWindows[windowId].window.baseBlock;\n    case WINDOW_TILE_DATA:\n        return (u32)(gWindows[windowId].tileData);\n    default:\n        return 0;\n    }\n}\n\nstatic u8 GetNumActiveWindowsOnBg(u8 bgId)\n{\n    u8 windowsNum = 0;\n    s32 i;\n    for (i = 0; i < WINDOWS_MAX; i++)\n    {\n        if (gWindows[i].window.bg == bgId)\n            windowsNum++;\n    }\n    return windowsNum;\n}\n"
  },
  {
    "path": "src/window_8bpp.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n\nEWRAM_DATA static struct Window* sWindowPtr = NULL;\nEWRAM_DATA static u16 sWindowSize = 0;\n\nstatic u8 GetNumActiveWindowsOnBg8Bit(u8 bgId);\n\nstatic void nullsub_9(void)\n{\n}\n\nu16 AddWindow8Bit(const struct WindowTemplate *template)\n{\n    u16 windowId;\n    u8 *memAddress;\n    u8 bgLayer;\n\n    for (windowId = 0; windowId < WINDOWS_MAX; windowId++)\n    {\n        if (gWindows[windowId].window.bg == 0xFF)\n            break;\n    }\n    if (windowId == WINDOWS_MAX)\n        return 0xFF;\n    bgLayer = template->bg;\n    if (gWindowBgTilemapBuffers[bgLayer] == NULL)\n    {\n        u16 attribute = GetBgAttribute(bgLayer, BG_ATTR_MAPSIZE);\n        if (attribute != 0xFFFF)\n        {\n            s32 i;\n            memAddress = Alloc(attribute);\n            if (memAddress == NULL)\n                return 0xFF;\n            for (i = 0; i < attribute; i++) // if we're going to zero out the memory anyway, why not call AllocZeroed?\n                memAddress[i] = 0;\n            gWindowBgTilemapBuffers[bgLayer] = memAddress;\n            SetBgTilemapBuffer(bgLayer, memAddress);\n        }\n    }\n    memAddress = Alloc((u16)(0x40 * (template->width * template->height)));\n    if (memAddress == NULL)\n    {\n        if (GetNumActiveWindowsOnBg8Bit(bgLayer) == 0 && gWindowBgTilemapBuffers[bgLayer] != nullsub_9)\n        {\n            Free(gWindowBgTilemapBuffers[bgLayer]);\n            gWindowBgTilemapBuffers[bgLayer] = NULL;\n        }\n        return 0xFF;\n    }\n    else\n    {\n        gWindows[windowId].tileData = memAddress;\n        gWindows[windowId].window = *template;\n        return windowId;\n    }\n}\n\nvoid FillWindowPixelBuffer8Bit(u8 windowId, u8 fillValue)\n{\n    s32 i;\n    s32 size;\n\n    size = (u16)(0x40 * (gWindows[windowId].window.width * gWindows[windowId].window.height));\n    for (i = 0; i < size; i++)\n        gWindows[windowId].tileData[i] = fillValue;\n}\n\nvoid FillWindowPixelRect8Bit(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height)\n{\n    struct Bitmap pixelRect;\n\n    pixelRect.pixels = gWindows[windowId].tileData;\n    pixelRect.width = 8 * gWindows[windowId].window.width;\n    pixelRect.height = 8 * gWindows[windowId].window.height;\n\n    FillBitmapRect8Bit(&pixelRect, x, y, width, height, fillValue);\n}\n\nvoid BlitBitmapRectToWindow4BitTo8Bit(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 paletteNum)\n{\n    struct Bitmap sourceRect;\n    struct Bitmap destRect;\n\n    sourceRect.pixels = (u8 *)pixels;\n    sourceRect.width = srcWidth;\n    sourceRect.height = srcHeight;\n\n    destRect.pixels = gWindows[windowId].tileData;\n    destRect.width = 8 * gWindows[windowId].window.width;\n    destRect.height = 8 * gWindows[windowId].window.height;\n\n    BlitBitmapRect4BitTo8Bit(&sourceRect, &destRect, srcX, srcY, destX, destY, rectWidth, rectHeight, 0, paletteNum);\n}\n\nvoid CopyWindowToVram8Bit(u8 windowId, u8 mode)\n{\n    sWindowPtr = &gWindows[windowId];\n    sWindowSize = 0x40 * (sWindowPtr->window.width * sWindowPtr->window.height);\n\n    switch (mode)\n    {\n        case COPYWIN_MAP:\n            CopyBgTilemapBufferToVram(sWindowPtr->window.bg);\n            break;\n        case COPYWIN_GFX:\n            LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock);\n            break;\n        case COPYWIN_FULL:\n            LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock);\n            CopyBgTilemapBufferToVram(sWindowPtr->window.bg);\n            break;\n    }\n}\n\nstatic u8 GetNumActiveWindowsOnBg8Bit(u8 bgId)\n{\n    u8 windowsNum = 0;\n    s32 i;\n    for (i = 0; i < WINDOWS_MAX; i++)\n    {\n        if (gWindows[i].window.bg == bgId)\n            windowsNum++;\n    }\n    return windowsNum;\n}\n"
  },
  {
    "path": "src/wireless_communication_status_screen.c",
    "content": "#include \"global.h\"\n#include \"gflib.h\"\n#include \"task.h\"\n#include \"new_menu_helpers.h\"\n#include \"scanline_effect.h\"\n#include \"m4a.h\"\n#include \"dynamic_placeholder_text_util.h\"\n#include \"overworld.h\"\n#include \"strings.h\"\n#include \"menu.h\"\n#include \"librfu.h\"\n#include \"link_rfu.h\"\n#include \"union_room.h\"\n#include \"constants/songs.h\"\n#include \"constants/union_room.h\"\n\nenum {\n    COLOR_NONE,\n    COLOR_NORMAL,\n    COLOR_TOTAL,\n    COLOR_TITLE,\n    COLOR_UNUSED,\n};\n\nenum {\n    GROUPTYPE_NONE = -1,\n    GROUPTYPE_TRADE,\n    GROUPTYPE_BATTLE,\n    GROUPTYPE_UNION,\n    GROUPTYPE_TOTAL,\n    NUM_GROUPTYPES\n};\n\nstatic struct\n{\n    u32 groupCounts[NUM_GROUPTYPES];\n    u32 prevGroupCounts[NUM_GROUPTYPES];\n    u32 activities[NUM_TASK_DATA];\n    u8 taskId;\n    u8 rfuTaskId;\n    u8 filler[10];\n} * sStatusScreen;\n\nstatic void CB2_InitWirelessCommunicationScreen(void);\nstatic void Task_WirelessCommunicationScreen(u8 taskId);\nstatic void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx);\nstatic bool32 UpdateCommunicationCounts(u32 * counts, u32 * lastCounts, u32 * activities, u8 taskId);\n\nstatic const u16 sPalettes[][16] = {\n    INCBIN_U16(\"graphics/wireless_status_screen/default.gbapal\"),\n    {}, // All black. Never read\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_00.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_01.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_02.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_03.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_04.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_05.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_06.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_07.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_08.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_09.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_10.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_11.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_12.gbapal\"),\n    INCBIN_U16(\"graphics/wireless_status_screen/anim_13.gbapal\")\n};\nstatic const u32 sBgTiles_Gfx[] = INCBIN_U32(\"graphics/wireless_status_screen/bg.4bpp.lz\");\nstatic const u16 sBgTiles_Tilemap[] = INCBIN_U16(\"graphics/wireless_status_screen/bg.bin\");\n\nstatic const struct BgTemplate sBgTemplates[] = {\n    {\n        .bg = 0,\n        .charBaseIndex = 2,\n        .mapBaseIndex = 31,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 0,\n        .baseTile = 0x000\n    }, {\n        .bg = 1,\n        .charBaseIndex = 0,\n        .mapBaseIndex =  8,\n        .screenSize = 0,\n        .paletteMode = 0,\n        .priority = 1,\n        .baseTile = 0x000\n    }\n};\n\nstatic const struct WindowTemplate sWindowTemplates[] = {\n    {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 0,\n        .width = 24,\n        .height = 3,\n        .paletteNum = 15,\n        .baseBlock = 0x001\n    }, {\n        .bg = 0,\n        .tilemapLeft = 3,\n        .tilemapTop = 4,\n        .width = 22,\n        .height = 15,\n        .paletteNum = 15,\n        .baseBlock = 0x049\n    }, {\n        .bg = 0,\n        .tilemapLeft = 25,\n        .tilemapTop = 4,\n        .width = 2,\n        .height = 15,\n        .paletteNum = 15,\n        .baseBlock = 0x193\n    }, DUMMY_WIN_TEMPLATE\n};\n\n// Unused\nstatic const u8 *const sPlayersTextPtrs[] = {\n    gText_Dynamic0Players,\n    gText_Dynamic1Players,\n    gText_Dynamic2Players,\n    gText_Dynamic3Players\n};\n\nstatic const u8 *const sHeaderTexts[NUM_GROUPTYPES + 1] = {\n    [0]                    = gText_WirelessCommunicationStatus,\n    [GROUPTYPE_TRADE + 1]  = gText_PeopleTrading,\n    [GROUPTYPE_BATTLE + 1] = gText_PeopleBattling,\n    [GROUPTYPE_UNION + 1]  = gText_PeopleInUnionRoom,\n    [GROUPTYPE_TOTAL + 1]  = gText_PeopleCommunicating\n};\n\n// Activity, group type, number of players\n// 0 players means the number of players can change and should be counted dynamically\n// GROUPTYPE_TOTAL have no unique group and are simply counted in the total of \"people communicating\".\n// A handful use NUM_GROUPTYPES, which is invalid, and are changed to GROUPTYPE_TOTAL in Emerald.\n// UB: GROUPTYPE_NONE (-1) can potentially be used as an index into a u8[4] in CountPlayersInGroupAndGetActivity.\nstatic const u8 sActivityGroupInfo[][3] = {\n    {ACTIVITY_BATTLE_SINGLE,                  GROUPTYPE_BATTLE, 2},\n    {ACTIVITY_BATTLE_DOUBLE,                  GROUPTYPE_BATTLE, 2},\n    {ACTIVITY_BATTLE_MULTI,                   GROUPTYPE_BATTLE, 4},\n    {ACTIVITY_TRADE,                          GROUPTYPE_TRADE,  2},\n    {ACTIVITY_WONDER_CARD,                    GROUPTYPE_TOTAL,  2},\n    {ACTIVITY_WONDER_NEWS,                    GROUPTYPE_TOTAL,  2},\n    {ACTIVITY_POKEMON_JUMP,                   NUM_GROUPTYPES,   0},\n    {ACTIVITY_BERRY_CRUSH,                    NUM_GROUPTYPES,   0},\n    {ACTIVITY_BERRY_PICK,                     NUM_GROUPTYPES,   0},\n    {ACTIVITY_SEARCH,                         GROUPTYPE_NONE,   0},\n    {ACTIVITY_SPIN_TRADE,                     GROUPTYPE_TRADE,  0},\n    {ACTIVITY_ITEM_TRADE,                     GROUPTYPE_NONE,   0},\n    {ACTIVITY_RECORD_CORNER,                  NUM_GROUPTYPES,   0},\n    {ACTIVITY_BERRY_BLENDER,                  GROUPTYPE_NONE,   0},\n    {ACTIVITY_NONE | IN_UNION_ROOM,           GROUPTYPE_UNION,  1},\n    {ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM,  GROUPTYPE_UNION,  2},\n    {ACTIVITY_TRADE | IN_UNION_ROOM,          GROUPTYPE_UNION,  2},\n    {ACTIVITY_CHAT | IN_UNION_ROOM,           GROUPTYPE_UNION,  0},\n    {ACTIVITY_CARD | IN_UNION_ROOM,           GROUPTYPE_UNION,  2},\n    {ACTIVITY_PLYRTALK | IN_UNION_ROOM,       GROUPTYPE_UNION,  1},\n    {ACTIVITY_NPCTALK | IN_UNION_ROOM,        GROUPTYPE_UNION,  2},\n    {ACTIVITY_ACCEPT | IN_UNION_ROOM,         GROUPTYPE_UNION,  1},\n    {ACTIVITY_DECLINE | IN_UNION_ROOM,        GROUPTYPE_UNION,  1}\n};\n\nstatic void CB2_RunWirelessCommunicationScreen(void)\n{\n    if (!IsDma3ManagerBusyWithBgCopy())\n    {\n        RunTasks();\n        RunTextPrinters();\n        AnimateSprites();\n        BuildOamBuffer();\n        UpdatePaletteFade();\n    }\n}\n\nstatic void VBlankCB_WirelessCommunicationScreen(void)\n{\n    LoadOam();\n    ProcessSpriteCopyRequests();\n    TransferPlttBuffer();\n}\n\nvoid ShowWirelessCommunicationScreen(void)\n{\n    SetMainCallback2(CB2_InitWirelessCommunicationScreen);\n}\n\nstatic void CB2_InitWirelessCommunicationScreen(void)\n{\n    SetGpuReg(REG_OFFSET_DISPCNT, 0);\n    sStatusScreen = AllocZeroed(sizeof(*sStatusScreen));\n    SetVBlankCallback(NULL);\n    ResetBgsAndClearDma3BusyFlags(FALSE);\n    InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));\n    SetBgTilemapBuffer(1, Alloc(BG_SCREEN_SIZE));\n    SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE));\n    DecompressAndLoadBgGfxUsingHeap(1, sBgTiles_Gfx, 0, 0, 0);\n    CopyToBgTilemapBuffer(1, sBgTiles_Tilemap, 0, 0);\n    InitWindows(sWindowTemplates);\n    DeactivateAllTextPrinters();\n    ResetPaletteFade();\n    ResetSpriteData();\n    ResetTasks();\n    ScanlineEffect_Stop();\n    m4aSoundVSyncOn();\n    SetVBlankCallback(VBlankCB_WirelessCommunicationScreen);\n    sStatusScreen->taskId = CreateTask(Task_WirelessCommunicationScreen, 0);\n    sStatusScreen->rfuTaskId = CreateTask_ListenToWireless();\n    sStatusScreen->prevGroupCounts[3] = 1;\n    ChangeBgX(0, 0, BG_COORD_SET);\n    ChangeBgY(0, 0, BG_COORD_SET);\n    ChangeBgX(1, 0, BG_COORD_SET);\n    ChangeBgY(1, 0, BG_COORD_SET);\n    LoadPalette(sPalettes, BG_PLTT_ID(0), PLTT_SIZE_4BPP);\n    Menu_LoadStdPalAt(BG_PLTT_ID(15));\n    DynamicPlaceholderTextUtil_Reset();\n    FillBgTilemapBufferRect(0, 0x000, 0, 0, 32, 32, 15);\n    CopyBgTilemapBufferToVram(1);\n    SetMainCallback2(CB2_RunWirelessCommunicationScreen);\n    RunTasks();\n    RunTextPrinters();\n    AnimateSprites();\n    BuildOamBuffer();\n    UpdatePaletteFade();\n}\n\nstatic void ExitWirelessCommunicationStatusScreen(void)\n{\n    s32 i;\n\n    FreeAllWindowBuffers();\n    for (i = 0; i < (int)ARRAY_COUNT(sBgTemplates); i++)\n        Free(GetBgTilemapBuffer(i));\n    Free(sStatusScreen);\n    SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);\n}\n\n// Cycle through palettes that relocate various shades of blue to create the wave effect at the bottom of the screen.\nstatic void CyclePalette(s16 * counter, s16 * palIdx)\n{\n    s32 idx;\n    if (++(*counter) > 5)\n    {\n        if (++(*palIdx) == (int)ARRAY_COUNT(sPalettes) - 2)\n            *palIdx = 0;\n        *counter = 0;\n    }\n    idx = *palIdx + 2; // +2 skips over default.pal and the empty black palette after it\n    LoadPalette(sPalettes[idx], BG_PLTT_ID(0), PLTT_SIZEOF(8));\n}\n\nstatic void PrintHeaderTexts(void)\n{\n    s32 i;\n    u32 width;\n\n    FillWindowPixelBuffer(0, PIXEL_FILL(0));\n    FillWindowPixelBuffer(1, PIXEL_FILL(0));\n    FillWindowPixelBuffer(2, PIXEL_FILL(0));\n\n    // Print title\n    width = 192 - GetStringWidth(FONT_NORMAL_COPY_2, sHeaderTexts[0], 0);\n    WCSS_AddTextPrinterParameterized(0, FONT_NORMAL_COPY_2, sHeaderTexts[0], width / 2, 6, COLOR_TITLE);\n\n    // Print label for each group (excluding total)\n    for (i = 0; i < NUM_GROUPTYPES - 1; i++)\n        WCSS_AddTextPrinterParameterized(1, FONT_NORMAL_COPY_2, sHeaderTexts[i + 1], 0, 30 * i + 10, COLOR_NORMAL);\n\n    // Print label for total\n    WCSS_AddTextPrinterParameterized(1, FONT_NORMAL_COPY_2, sHeaderTexts[i + 1], 0, 30 * i + 10, COLOR_TOTAL);\n\n    PutWindowTilemap(0);\n    CopyWindowToVram(0, COPYWIN_GFX);\n    PutWindowTilemap(1);\n    CopyWindowToVram(1, COPYWIN_GFX);\n}\n\n#define tState data[0]\n\nstatic void Task_WirelessCommunicationScreen(u8 taskId)\n{\n    s32 i;\n    switch (gTasks[taskId].tState)\n    {\n    case 0:\n        PrintHeaderTexts();\n        gTasks[taskId].tState++;\n        break;\n    case 1:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);\n        ShowBg(1);\n        CopyBgTilemapBufferToVram(0);\n        ShowBg(0);\n        gTasks[taskId].tState++;\n        break;\n    case 2:\n        if (!gPaletteFade.active)\n            gTasks[taskId].tState++;\n        break;\n    case 3:\n        if (UpdateCommunicationCounts(sStatusScreen->groupCounts, sStatusScreen->prevGroupCounts, sStatusScreen->activities, sStatusScreen->rfuTaskId))\n        {\n            FillWindowPixelBuffer(2, PIXEL_FILL(0));\n            for (i = 0; i < NUM_GROUPTYPES; i++)\n            {\n                ConvertIntToDecimalStringN(gStringVar4, sStatusScreen->groupCounts[i], STR_CONV_MODE_RIGHT_ALIGN, 2);\n                if (i != GROUPTYPE_TOTAL)\n                    WCSS_AddTextPrinterParameterized(2, FONT_NORMAL_COPY_2, gStringVar4, 4, 30 * i + 10, COLOR_NORMAL);\n                else\n                    WCSS_AddTextPrinterParameterized(2, FONT_NORMAL_COPY_2, gStringVar4, 4, 100, COLOR_TOTAL);\n            }\n            PutWindowTilemap(2);\n            CopyWindowToVram(2, COPYWIN_FULL);\n        }\n        if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))\n        {\n            PlaySE(SE_SELECT);\n            gTasks[sStatusScreen->rfuTaskId].data[15] = 0xFF;\n            gTasks[taskId].tState++;\n        }\n        CyclePalette(&gTasks[taskId].data[7], &gTasks[taskId].data[8]);\n        break;\n    case 4:\n        BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);\n        gTasks[taskId].tState++;\n        break;\n    case 5:\n        if (!gPaletteFade.active)\n        {\n            SetMainCallback2(ExitWirelessCommunicationStatusScreen);\n            DestroyTask(taskId);\n        }\n        break;\n    }\n}\n\nstatic void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 mode)\n{\n    u8 textColor[3];\n    switch (mode)\n    {\n    case COLOR_NONE: // Unused. Default to usual text colors\n        textColor[0] = TEXT_COLOR_TRANSPARENT;\n        textColor[1] = TEXT_COLOR_DARK_GRAY;\n        textColor[2] = TEXT_COLOR_LIGHT_GRAY;\n        break;\n    case COLOR_NORMAL:\n        textColor[0] = TEXT_COLOR_TRANSPARENT;\n        textColor[1] = TEXT_COLOR_WHITE;\n        textColor[2] = TEXT_COLOR_LIGHT_GRAY;\n        break;\n    case COLOR_TOTAL:\n        textColor[0] = TEXT_COLOR_TRANSPARENT;\n        textColor[1] = TEXT_COLOR_RED;\n        textColor[2] = TEXT_COLOR_LIGHT_RED;\n        break;\n    case COLOR_TITLE:\n        textColor[0] = TEXT_COLOR_TRANSPARENT;\n        textColor[1] = TEXT_COLOR_LIGHT_GREEN;\n        textColor[2] = TEXT_COLOR_GREEN;\n        break;\n    case COLOR_UNUSED:\n        textColor[0] = TEXT_COLOR_TRANSPARENT;\n        textColor[1] = TEXT_COLOR_WHITE;\n        textColor[2] = TEXT_COLOR_DARK_GRAY;\n        break;\n    // default: UB\n    }\n    AddTextPrinterParameterized4(windowId, fontId, x, y, fontId == FONT_SMALL ? 0 : 1, 0, textColor, TEXT_SKIP_DRAW, str);\n}\n\nstatic u32 CountPlayersInGroupAndGetActivity(struct RfuPlayer * player, u32 * groupCounts)\n{\n    u32 activity = player->rfu.data.activity;\n    s32 i, j, k;\n\n    #define group_activity(i) (sActivityGroupInfo[(i)][0])\n    #define group_type(i)     (sActivityGroupInfo[(i)][1])\n    #define group_players(i)  (sActivityGroupInfo[(i)][2])\n\n    for (i = 0; i < ARRAY_COUNT(sActivityGroupInfo); i++)\n    {\n        if (activity == group_activity(i) && player->groupScheduledAnim == UNION_ROOM_SPAWN_IN)\n        {\n            if (group_players(i) == 0)\n            {\n                k = 0;\n                for (j = 0; j < RFU_CHILD_MAX; j++)\n                    if (player->rfu.data.partnerInfo[j] != 0) k++;\n                k++;\n                groupCounts[group_type(i)] += k;\n            }\n            else\n            {\n                groupCounts[group_type(i)] += group_players(i);\n            }\n        }\n    }\n\n    return activity;\n\n    #undef group_activity\n    #undef group_type\n    #undef group_players\n}\n\nstatic bool32 HaveCountsChanged(const u32 * curCounts, const u32 * prevCounts)\n{\n    s32 i;\n\n    for (i = 0; i < NUM_GROUPTYPES; i++)\n    {\n        if (curCounts[i] != prevCounts[i])\n            return TRUE;\n    }\n\n    return FALSE;\n}\n\nstatic bool32 UpdateCommunicationCounts(u32 * groupCounts, u32 * prevGroupCounts, u32 * activities, u8 taskId)\n{\n    bool32 activitiesUpdated = FALSE;\n    u32 groupCountBuffer[NUM_GROUPTYPES] = {0, 0, 0, 0};\n    struct WirelessLink_Group * group = (void *)gTasks[taskId].data;\n    s32 i;\n\n    for (i = 0; i < NUM_TASK_DATA; i++)\n    {\n        u32 activity = CountPlayersInGroupAndGetActivity(&group->playerList->players[i], groupCountBuffer);\n        if (activity != activities[i])\n        {\n            activities[i] = activity;\n            activitiesUpdated = TRUE;\n        }\n    }\n\n    if (!HaveCountsChanged(groupCountBuffer, prevGroupCounts))\n    {\n        if (activitiesUpdated == TRUE)\n            return TRUE;\n        else\n            return FALSE;\n    }\n\n    memcpy(groupCounts,     groupCountBuffer, sizeof(groupCountBuffer));\n    memcpy(prevGroupCounts, groupCountBuffer, sizeof(groupCountBuffer));\n    \n    groupCounts[GROUPTYPE_TOTAL] = groupCounts[GROUPTYPE_TRADE]\n                                 + groupCounts[GROUPTYPE_BATTLE]\n                                 + groupCounts[GROUPTYPE_UNION]\n                            #ifdef BUGFIX\n                                 + groupCounts[GROUPTYPE_TOTAL] // Missing count for activities not in above groups\n                            #endif\n                                 ;\n    return TRUE;\n}\n"
  },
  {
    "path": "src/wonder_news.c",
    "content": "#include \"global.h\"\n#include \"mystery_gift.h\"\n#include \"random.h\"\n#include \"event_data.h\"\n#include \"wonder_news.h\"\n#include \"constants/items.h\"\n\n// Every 4th reward for sending Wonder News to a link partner is a \"big\" reward.\n#define MAX_SENT_REWARD 4\n\n// Only up to 5 rewards can be received in a short period. After this the player\n// must take 500 steps before any more rewards can be received.\n#define MAX_REWARD 5\n\nstatic u32 GetRewardItem(struct WonderNewsMetadata *);\nstatic u32 GetRewardType(struct WonderNewsMetadata *);\nstatic void IncrementRewardCounter(struct WonderNewsMetadata *);\nstatic void IncrementSentRewardCounter(struct WonderNewsMetadata *);\nstatic void ResetSentRewardCounter(struct WonderNewsMetadata *);\n\nvoid WonderNews_SetReward(u32 newsType)\n{\n    struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata();\n\n    data->newsType = newsType;\n    switch (newsType)\n    {\n    case WONDER_NEWS_NONE:\n        break;\n    case WONDER_NEWS_RECV_FRIEND:\n    case WONDER_NEWS_RECV_WIRELESS:\n        // Random berry between ITEM_RAZZ_BERRY and ITEM_NOMEL_BERRY\n        data->berry = (Random() % 15) + ITEM_TO_BERRY(ITEM_RAZZ_BERRY);\n        break;\n    case WONDER_NEWS_SENT:\n        // Random berry between ITEM_CHERI_BERRY and ITEM_IAPAPA_BERRY\n        data->berry = (Random() % 15) + ITEM_TO_BERRY(ITEM_CHERI_BERRY);\n        break;\n    }\n}\n\nvoid WonderNews_Reset(void)\n{\n    struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata();\n\n    data->newsType = WONDER_NEWS_NONE;\n    data->sentRewardCounter = 0;\n    data->rewardCounter = 0;\n    data->berry = 0;\n    VarSet(VAR_WONDER_NEWS_STEP_COUNTER, 0);\n}\n\nvoid WonderNews_IncrementStepCounter(void)\n{\n    u16 *stepCounter = GetVarPointer(VAR_WONDER_NEWS_STEP_COUNTER);\n    struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata();\n\n    // If the player has reached the reward limit, start counting steps.\n    // When they reach 500 steps reset the reward counter to allow them to\n    // receive rewards again.\n    if (data->rewardCounter >= MAX_REWARD && ++(*stepCounter) >= 500)\n    {\n        data->rewardCounter = 0;\n        *stepCounter = 0;\n    }\n}\n\nu16 WonderNews_GetRewardInfo(void)\n{\n    u16 *result = &gSpecialVar_Result;\n    struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata();\n    u16 rewardType;\n\n    if (!IsMysteryGiftEnabled() || !ValidateSavedWonderNews())\n        return NEWS_REWARD_NONE;\n\n    rewardType = GetRewardType(data);\n\n    switch (rewardType)\n    {\n    case NEWS_REWARD_RECV_SMALL:\n    case NEWS_REWARD_RECV_BIG:\n        *result = GetRewardItem(data);\n        break;\n    case NEWS_REWARD_SENT_SMALL:\n        *result = GetRewardItem(data);\n        IncrementSentRewardCounter(data);\n        break;\n    case NEWS_REWARD_SENT_BIG:\n        *result = GetRewardItem(data);\n        ResetSentRewardCounter(data);\n        break;\n    case NEWS_REWARD_NONE:\n    case NEWS_REWARD_WAITING:\n    case NEWS_REWARD_AT_MAX:\n        break;\n    }\n\n    return rewardType;\n}\n\nstatic u32 GetRewardItem(struct WonderNewsMetadata *data)\n{\n    u32 itemId;\n\n    data->newsType = WONDER_NEWS_NONE;\n    itemId = data->berry + FIRST_BERRY_INDEX - 1;\n    data->berry = 0;\n    IncrementRewardCounter(data);\n    return itemId;\n}\n\nstatic void ResetSentRewardCounter(struct WonderNewsMetadata *data)\n{\n    data->sentRewardCounter = 0;\n}\n\n// Track number of times a reward was received (or attmepted to receive) for sending Wonder News to a link partner.\nstatic void IncrementSentRewardCounter(struct WonderNewsMetadata *data)\n{\n    data->sentRewardCounter++;\n    if (data->sentRewardCounter > MAX_SENT_REWARD)\n        data->sentRewardCounter = MAX_SENT_REWARD;\n}\n\nstatic void IncrementRewardCounter(struct WonderNewsMetadata *data)\n{\n    data->rewardCounter++;\n    if (data->rewardCounter > MAX_REWARD)\n        data->rewardCounter = MAX_REWARD;\n}\n\nstatic u32 GetRewardType(struct WonderNewsMetadata *data)\n{\n    if (data->rewardCounter == MAX_REWARD)\n        return NEWS_REWARD_AT_MAX;\n\n    switch (data->newsType)\n    {\n    case WONDER_NEWS_NONE:\n        return NEWS_REWARD_WAITING;\n    case WONDER_NEWS_RECV_FRIEND:\n        return NEWS_REWARD_RECV_SMALL;\n    case WONDER_NEWS_RECV_WIRELESS:\n        return NEWS_REWARD_RECV_BIG;\n    case WONDER_NEWS_SENT:\n        if (data->sentRewardCounter < MAX_SENT_REWARD - 1)\n            return NEWS_REWARD_SENT_SMALL;\n        return NEWS_REWARD_SENT_BIG;\n    default:\n        AGB_ASSERT_EX(0, ABSPATH(\"menews_jisan.c\"), 383);\n        return NEWS_REWARD_NONE;\n    }\n}\n"
  },
  {
    "path": "sym_bss.txt",
    "content": "\t.include \"src/gpu_regs.o\"\n\t.include \"src/dma3_manager.o\"\n\t.include \"src/bg.o\"\n\t.include \"src/malloc.o\"\n\t.include \"src/text_printer.o\"\n\t.include \"src/sprite.o\"\n\t.include \"src/link.o\"\n\t.include \"src/multiboot.o\"\n\t.include \"src/daycare.o\"\n\t.include \"src/trade.o\"\n\t.include \"src/play_time.o\"\n\t.include \"src/overworld.o\"\n\t.include \"src/field_camera.o\"\n\t.include \"src/script.o\"\n\t.include \"src/start_menu.o\"\n\t.include \"src/tileset_anims.o\"\n\t.include \"src/sound.o\"\n\t.include \"src/field_effect.o\"\n\t.include \"src/pokemon_storage_system_misc.o\"\n\t.include \"src/easy_chat.o\"\n\t.include \"src/link_rfu_2.o\"\n\t.include \"src/link_rfu_3.o\"\n\t.include \"src/quest_log.o\"\n\t.include \"src/union_room.o\"\n\t.include \"src/pokemon_special_anim_scene.o\"\n\t.include \"src/wireless_communication_status_screen.o\"\n\t.include \"src/dodrio_berry_picking.o\"\n\t.include \"src/ereader_helpers.o\"\n\t.include \"src/digit_obj_util.o\"\n\t.include \"src/m4a_1.o\"\n\t.include \"data/sound_data.o\"\n\t.include \"src/agb_flash.o\"\n\t.include \"*libgcc.a:dp-bit.o\"\n\t.include \"*libgcc.a:fp-bit.o\"\n\t.include \"*libc.a:syscalls.o\"\n"
  },
  {
    "path": "sym_common.txt",
    "content": "\t.include \"main.o\"\n\t.include \"bg.o\"\n\t.include \"text_printer.o\"\n\t.align 4\n\t.include \"window.o\"\n\t.include \"text.o\"\n\t.include \"sprite.o\"\n\t.include \"link.o\"\n\t.align 4\n\t.include \"battle_main.o\"\n\t.include \"random.o\"\n\t.include \"load_save.o\"\n\t.include \"overworld.o\"\n\t.align 4\n\t.include \"fieldmap.o\"\n\t.align 4\n\t.include \"field_camera.o\"\n\t.include \"scrcmd.o\"\n\t.include \"field_control_avatar.o\"\n\t.include \"event_data.o\"\n\t.include \"sound.o\"\n\t.include \"task.o\"\n\t.include \"cable_club.o\"\n\t.include \"image_processing_effects.o\"\n\t.include \"field_specials.o\"\n\t.include \"evolution_scene.o\"\n\t.include \"save.o\"\n\t.include \"battle_anim_special.o\"\n\t.include \"save_failed_screen.o\"\n\t.align 4\n\t.include \"link_rfu_2.o\"\n\t.align 4\n\t.include \"AgbRfu_LinkManager.o\"\n\t.align 4\n\t.include \"list_menu.o\"\n\t.include \"quest_log.o\"\n\t.include \"party_menu.o\"\n\t.include \"help_system.o\"\n\t.align 4\n\t.include \"fame_checker.o\"\n\t.include \"help_system_util.o\"\n\t.align 4\n\t.include \"ereader_screen.o\"\n\t.align 4\n\t.include \"battle_controller_pokedude.o\"\n\t.align 4\n\t.include \"berry_fix_program.o\"\n\t.include \"m4a.o\"\n\t.include \"agb_flash.o\"\n\t.include \"librfu_stwi.o\"\n\t.align 4\n\t.include \"librfu_rfu.o\"\n\t.align 4\n\t.include \"librfu_sio32id.o\"\n"
  },
  {
    "path": "sym_ewram.txt",
    "content": "\t.include \"src/main.o\"\n\t.include \"src/malloc.o\"\n\t.include \"src/text_printer.o\"\n\t.include \"src/window.o\"\n\t.include \"src/window_8bpp.o\"\n\t.include \"src/sprite.o\"\n\t.include \"src/string_util.o\"\n\t.include \"src/link.o\"\n\t.space 8\n\t.include \"src/battle_controllers.o\"\n\t.include \"src/battle_main.o\"\n\t.include \"src/pokemon.o\"\n\t.include \"src/daycare.o\"\n\t.include \"src/load_save.o\"\n\t.include \"src/trade.o\"\n\t.include \"src/trade_scene.o\"\n\t.include \"src/new_game.o\"\n\t.include \"src/overworld.o\"\n\t.include \"src/fieldmap.o\"\n\t.include \"src/field_camera.o\"\n\t.include \"src/field_player_avatar.o\"\n\t.include \"src/event_object_movement.o\"\n\t.include \"src/field_message_box.o\"\n\t.include \"src/script.o\"\n\t.include \"src/scrcmd.o\"\n\t.include \"src/event_data.o\"\n\t.include \"src/start_menu.o\"\n\t.include \"src/tileset_anims.o\"\n\t.include \"src/palette.o\"\n\t.include \"src/sound.o\"\n\t.include \"src/battle_anim.o\"\n\t.include \"src/battle_anim_mons.o\"\n\t.include \"src/title_screen.o\"\n\t.include \"src/field_weather.o\"\n\t.include \"src/battle_setup.o\"\n\t.include \"src/wild_encounter.o\"\n\t.include \"src/field_effect.o\"\n\t.include \"src/scanline_effect.o\"\n\t.include \"src/option_menu.o\"\n\t.include \"src/trainer_card.o\"\n\t.include \"src/pokemon_storage_system_menu.o\"\n\t.include \"src/pokemon_storage_system_tasks.o\"\n\t.include \"src/pokemon_storage_system_data.o\"\n\t.include \"src/pokemon_storage_system_misc.o\"\n\t.include \"src/script_movement.o\"\n\t.include \"src/fldeff_cut.o\"\n\t.include \"src/item_menu_icons.o\"\n\t.include \"src/item.o\"\n\t.include \"src/shop.o\"\n\t.include \"src/special_field_anim.o\"\n\t.include \"src/script_menu.o\"\n\t.include \"src/naming_screen.o\"\n\t.include \"src/money.o\"\n\t.include \"src/safari_zone.o\"\n\t.include \"src/item_use.o\"\n\t.include \"src/battle_anim_effects_1.o\"\n\t.include \"src/battle_anim_dragon.o\"\n\t.include \"src/battle_anim_utility_funcs.o\"\n\t.include \"src/battle_intro.o\"\n\t.include \"src/easy_chat.o\"\n\t.include \"src/mon_markings.o\"\n\t.include \"src/mail.o\"\n\t.include \"src/menu_helpers.o\"\n\t.include \"src/region_map.o\"\n\t.include \"src/battle_ai_script_commands.o\"\n\t.include \"src/fldeff_rocksmash.o\"\n\t.include \"src/field_specials.o\"\n\t.include \"src/battle_records.o\"\n\t.include \"src/evolution_scene.o\"\n\t.include \"src/coins.o\"\n\t.include \"src/battle_transition.o\"\n\t.include \"src/battle_message.o\"\n\t.include \"src/save.o\"\n\t.include \"src/mystery_event_script.o\"\n\t.include \"src/fldeff_sweetscent.o\"\n\t.include \"src/learn_move.o\"\n\t.include \"src/battle_tower.o\"\n\t.include \"src/player_pc.o\"\n\t.include \"src/intro.o\"\n\t.include \"src/hall_of_fame.o\"\n\t.include \"src/credits.o\"\n\t.include \"src/diploma.o\"\n\t.include \"src/save_failed_screen.o\"\n\t.include \"src/clear_save_data_screen.o\"\n\t.include \"src/new_menu_helpers.o\"\n\t.include \"src/tilemap_util.o\"\n\t.include \"src/map_preview_screen.o\"\n\t.include \"src/link_rfu_2.o\"\n\t.include \"src/link_rfu_3.o\"\n\t.include \"src/easy_chat_2.o\"\n\t.include \"src/easy_chat_3.o\"\n\t.include \"src/pokedex_screen.o\"\n\t.include \"src/list_menu.o\"\n\t.include \"src/item_menu.o\"\n\t.include \"src/bag.o\"\n\t.include \"src/trainer_pokemon_sprites.o\"\n\t.include \"src/vs_seeker.o\"\n\t.include \"src/item_pc.o\"\n\t.include \"src/mailbox_pc.o\"\n\t.include \"src/menu.o\"\n\t.include \"src/quest_log.o\"\n\t.include \"src/help_message.o\"\n\t.include \"src/quest_log_events.o\"\n\t.include \"src/union_room.o\"\n\t.include \"src/union_room_player_avatar.o\"\n\t.include \"src/union_room_battle.o\"\n\t.include \"src/pokemon_special_anim.o\"\n\t.include \"src/party_menu.o\"\n\t.include \"src/union_room_chat.o\"\n\t.include \"src/union_room_chat_display.o\"\n\t.include \"src/union_room_chat_objects.o\"\n\t.include \"src/help_system.o\"\n\t.include \"src/fame_checker.o\"\n\t.include \"src/oak_speech.o\"\n\t.include \"src/tm_case.o\"\n\t.include \"src/menu_indicators.o\"\n\t.include \"src/pokemon_summary_screen.o\"\n\t.include \"src/help_system_util.o\"\n\t.include \"src/dynamic_placeholder_text_util.o\"\n\t.include \"src/berry_pouch.o\"\n\t.include \"src/slot_machine.o\"\n\t.include \"src/roamer.o\"\n\t.include \"src/mystery_gift_menu.o\"\n\t.include \"src/mystery_gift.o\"\n\t.include \"src/mystery_gift_link.o\"\n\t.include \"src/mystery_gift_client.o\"\n\t.include \"src/mystery_gift_server.o\"\n\t.include \"src/mystery_gift_show_card.o\"\n\t.include \"src/mystery_gift_show_news.o\"\n\t.include \"src/seagallop.o\"\n\t.include \"src/pokemon_jump.o\"\n\t.include \"src/berry_crush.o\"\n\t.include \"src/dodrio_berry_picking.o\"\n\t.include \"src/teachy_tv.o\"\n\t.include \"src/digit_obj_util.o\"\n\t.include \"src/trainer_tower.o\"\n\t.include \"src/berry_powder.o\"\n\t.align 2\n\t.include \"src/key_system_menu.o\"\n\t.align 2\n\t.include \"src/cable_car.o\"\n"
  },
  {
    "path": "tileset_rules.mk",
    "content": "TILESETGFXDIR := data/tilesets\n\n$(TILESETGFXDIR)/primary/building/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 640 -Wnum_tiles\n\n$(TILESETGFXDIR)/primary/general/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 640 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/pallet_town/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 76 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/lavender_town/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 256 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/cinnabar_island/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 128 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/pokemon_center/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 376 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/cable_club/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 632 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/fuchsia_gym/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 92 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/pewter_gym/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 207 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/saffron_gym/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 82 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/viridian_forest/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 101 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/seafoam_islands/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 318 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/generic_building_2/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 152 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/underground_path/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 50 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/restaurant_hotel/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 76 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/burgled_house/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 172 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/sevii_islands_45/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 374 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/pokemon_league/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 340 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/viridian_city/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 112 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/vermilion_city/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 140 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/indigo_plateau/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 247 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/cave/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 256 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/bike_shop/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 60 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/viridian_gym/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 90 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/cerulean_gym/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 119 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/cinnabar_gym/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 146 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/unused_gatehouse_1/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 144 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/unused_gatehouse_2/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 144 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/power_plant/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 80 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/pokemon_tower/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 128 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/school/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 50 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/dummy_3/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 2 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/navel_rock/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 282 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/sevii_islands_67/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 374 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/hall_of_fame/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 208 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/pewter_city/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 280 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/celadon_city/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 244 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/saffron_city/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 262 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/dummy_1/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 2 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/generic_building_1/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 63 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/hoenn_building/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 383 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/vermilion_gym/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 247 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/ss_anne/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 245 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/rock_tunnel/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 256 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/cerulean_cave/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 246 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/sea_cottage/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 68 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/safari_zone_building/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 90 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/fan_club_daycare/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 85 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/dummy_4/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 2 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/tanoby_ruins/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 74 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/trainer_tower/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 343 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/cerulean_city/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 158 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/fuchsia_city/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 320\n\n$(TILESETGFXDIR)/secondary/mart/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 36 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/museum/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 137 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/lab/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 102 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/game_corner/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 171 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/celadon_gym/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 103 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/dummy_2/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 2 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/digletts_cave/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 248 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/department_store/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 201 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/pokemon_mansion/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 350 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/condominiums/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 384 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/mt_ember/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 288 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/sevii_islands_123/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 374 -Wnum_tiles\n\n$(TILESETGFXDIR)/secondary/island_harbor/tiles.4bpp: %.4bpp: %.png\n\t$(GFX) $< $@ -num_tiles 165 -Wnum_tiles\n"
  }
]